[
  {
    "path": ".gitignore",
    "content": "HELP.md\ntarget/\n!.mvn/wrapper/maven-wrapper.jar\n!**/src/main/**\n!**/src/test/**\n\n### STS ###\n.apt_generated\n.classpath\n.factorypath\n.project\n.settings\n.springBeans\n.sts4-cache\n\n### IntelliJ IDEA ###\n.idea\n*.iws\n*.iml\n*.ipr\n\n### NetBeans ###\n/nbproject/private/\n/nbbuild/\n/dist/\n/nbdist/\n/.nb-gradle/\nbuild/\n\n### VS Code ###\n.vscode/\n.project\n.mvn/\n\nlocal/\n\n.DS_Store\n\n.metadata/\n.joycode\n"
  },
  {
    "path": "LICENSE.txt",
    "content": "   Copyright 2021-2022 Jingdong Technology Holding Co. LTD.\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\n===============================================================================\n\nJD-EASYFLOW SUBCOMPONENTS:\n\nJDEasyFlow includes a number of subcomponents with separate copyright notices and \nlicense terms. Your use of these subcomponents is subject \nto the terms and conditions of the following licenses.\n\n>>> Bpmn-js:\n\nCopyright (c) 2014-present Camunda Services GmbH\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in the\nSoftware without restriction, including without limitation the rights to use, copy,\nmodify, merge, publish, distribute, sublicense, and/or sell copies of the Software,\nand to permit persons to whom the Software is furnished to do so, subject to the\nfollowing conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nThe source code responsible for displaying the bpmn.io project watermark that\nlinks back to https://bpmn.io as part of rendered diagrams MUST NOT be\nremoved or changed. When this software is being used in a website or application,\nthe watermark must stay fully visible and not visually overlapped by other elements.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\nINCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR\nPURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE\nOR OTHER DEALINGS IN THE SOFTWARE.\n\n>>> Bootstrap:\n\nThe MIT License (MIT)\n\nCopyright (c) 2011-2018 Twitter, Inc.\nCopyright (c) 2011-2018 The Bootstrap Authors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n>>> Bootstrap-multiselect:\n\nApache License, Version 2.0:\n\nCopyright (c) 2012 - 2021 David Stutz\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use \nthis file except in compliance with the License. You may obtain a copy of the \nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed \nunder the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR \nCONDITIONS OF ANY KIND, either express or implied. See the License for the \nspecific language governing permissions and limitations under the License.\n\nBSD 3-Clause License:\n\nCopyright (c) 2012 - 2021 David Stutz All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, \nare permitted provided that the following conditions are met:\n\nRedistributions of source code must retain the above copyright notice, this list \nof conditions and the following disclaimer.\nRedistributions in binary form must reproduce the above copyright notice, this \nlist of conditions and the following disclaimer in the documentation and/or \nother materials provided with the distribution.\nNeither the name of David Stutz nor the names of its contributors may be used to \nendorse or promote products derived from this software without specific prior \nwritten permission.\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \nIN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \nINDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \nBUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \nLIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \nOR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \nOF THE POSSIBILITY OF SUCH DAMAGE.\n\n>>> Fontawesome:\n\nFont Awesome Free License\n-------------------------\n\nFont Awesome Free is free, open source, and GPL friendly. You can use it for\ncommercial projects, open source projects, or really almost whatever you want.\nFull Font Awesome Free license: https://fontawesome.com/license/free.\n\n# Icons: CC BY 4.0 License (https://creativecommons.org/licenses/by/4.0/)\nIn the Font Awesome Free download, the CC BY 4.0 license applies to all icons\npackaged as SVG and JS file types.\n\n# Fonts: SIL OFL 1.1 License (https://scripts.sil.org/OFL)\nIn the Font Awesome Free download, the SIL OFL license applies to all icons\npackaged as web and desktop font files.\n\n# Code: MIT License (https://opensource.org/licenses/MIT)\nIn the Font Awesome Free download, the MIT license applies to all non-font and\nnon-icon files.\n\n# Attribution\nAttribution is required by MIT, SIL OFL, and CC BY licenses. Downloaded Font\nAwesome Free files already contain embedded comments with sufficient\nattribution, so you shouldn't need to do anything additional when using these\nfiles normally.\n\nWe've kept attribution comments terse, so we ask that you do not actively work\nto remove them from files, especially code. They're a great way for folks to\nlearn about Font Awesome.\n\n# Brand Icons\nAll brand icons are trademarks of their respective owners. The use of these\ntrademarks does not indicate endorsement of the trademark holder by Font\nAwesome, nor vice versa. **Please do not use brand logos for any purpose except\nto represent the company, product, or service to which they refer.**\n\n>>> JQuery:\n\nCopyright OpenJS Foundation and other contributors, https://openjsf.org/\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n>>> Jquery validation:\n\nThe MIT License (MIT)\nCopyright Jörn Zaefferer\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of \nthis software and associated documentation files (the \"Software\"), to deal in \nthe Software without restriction, including without limitation the rights to use,\n copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the \n Software, and to permit persons to whom the Software is furnished to do so, \n subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all \ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR \nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS \nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR \nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER \nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION \nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n>>> bootstrap table:\n\n(The MIT License)\n\nCopyright (c) 2012-2019 Zhixin Wen <wenzhixin2010@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n==============================================================================="
  },
  {
    "path": "NOTICE.txt",
    "content": "1.JDEasyflow use bpmn-js(https://bpmn.io/) component to render bpmn diagram. You should obey \ntheir license rule(https://bpmn.io/license/) when using related function. Especially, you\nshould notice and obey the bellow rule in their license:\n\"The source code responsible for displaying the bpmn.io project watermark that\nlinks back to https://bpmn.io as part of rendered diagrams MUST NOT be\nremoved or changed. When this software is being used in a website or application,\nthe watermark must stay fully visible and not visually overlapped by other elements.\"\n\n2.JDEasyFlow license can be seen in LICENSE.txt. In addition, JDEasyFlow depends on a number of \ncomponents with separate copyright notices and license terms. Your use of \nthese components is subject to the terms and conditions of the licenses of the \nfollowing links:\n\n>>> Apache maven:\nhttps://github.com/apache/maven/blob/master/LICENSE\n\n>>> Spring framework:\nhttps://github.com/spring-projects/spring-framework/blob/main/src/docs/dist/license.txt\n\n>>> Commons-logging:\nhttps://github.com/apache/commons-logging/blob/master/LICENSE.txt\n\n>>> Logback:\nhttps://logback.qos.ch/license.html \n\n>>> Slf4j:\nhttps://www.slf4j.org/license.html\n\n>>> Commons-lang3:\nhttps://github.com/apache/commons-lang/blob/master/LICENSE.txt \n\n>>> Commons-io:\nhttps://github.com/apache/commons-io/blob/master/LICENSE.txt \n\n>>> Commons-collections:\nhttps://github.com/apache/commons-collections/blob/master/LICENSE.txt\n\n>>> Jackson:\nhttps://github.com/FasterXML/jackson-databind/blob/2.11.4/LICENSE\nhttps://github.com/FasterXML/jackson-annotations/blob/2.11.4/LICENSE\nhttps://github.com/FasterXML/jackson-core/blob/2.11.4/LICENSE\n\n>>> Junit:\nhttps://junit.org/junit4/license.html\n\n>>> Hamcrest-core:\nhttp://hamcrest.org/JavaHamcrest/\n\n>>> Lombok:\nhttps://github.com/projectlombok/lombok/blob/master/LICENSE\n\n>>> Activiti:\nhttps://github.com/Activiti/Activiti/blob/develop/LICENSE.txt\n\n>>> Joda:\nhttps://www.joda.org/joda-time/licenses.html\n\n>>> HikariCP:\nhttps://github.com/brettwooldridge/HikariCP/blob/dev/LICENSE\n\n>>> log4j:\nhttps://github.com/apache/logging-log4j2/blob/2.x/LICENSE.txt\n\n>>> attoparser:\nhttps://www.attoparser.org/license.html\n\n>>> tomcat:\nhttps://github.com/apache/tomcat/blob/main/LICENSE\n\n>>> mybatis:\nhttps://github.com/mybatis/mybatis-3/blob/master/LICENSE\n\n>>> thymeleaf:\nhttps://github.com/thymeleaf/thymeleaf/blob/3.1-master/LICENSE.txt\n\n>>> Spring Boot:\nhttps://github.com/spring-projects/spring-boot/blob/main/LICENSE.txt\n\n>>> unbescapse:\nhttps://www.unbescape.org/license.html\n\n>>> aspectj:\nhttps://github.com/eclipse-aspectj/aspectj/blob/master/LICENSE\n\n>>> snakeyml:\nhttps://github.com/snakeyaml/snakeyaml/blob/master/LICENSE.txt\n\n\n\n\n"
  },
  {
    "path": "README-zh.md",
    "content": "# JDEasyFlow\n\n### 介绍\nJDEasyFlow是一款通用流程编排组件, 适用于服务编排、工作流、任务审批等场景。它的特点是简单、灵活、易扩展。开发人员30分钟可入门上手，半天可掌握其原理。\n\n### 软件架构\nJDEasyFlow底层为流程引擎/状态机模块(使用时选一便可，建议优先使用流程引擎)，此模块提供了基于JSON格式的JDEasyFlow规范进行流程编排的能力。\n\nBPMN模块提供了基于BPMN规范进行流程定义和可视化的能力，流程可视化基于[bpmn-js](https://bpmn.io/)，其本质为提供了将BPMN格式流程定义转换为JDEasyFlow格式的能力。\n\n\n### 使用说明\n\n在源码的test目录下有quickstart测试用例，可直接运行或调试以了解使用方式和运行原理。\n\n#### 流程引擎\n\n1. 代码中引入easyflow-flow jar包，以maven为例:\n```\n    <dependency>\n        <groupId>com.jd.easyflow</groupId>\n        <artifactId>easyflow-flow</artifactId>\n        <version>{latestVersion}</version>\n    </dependency>\n```\n2. 编写流程定义文件\n以node001->node002->node003的执行顺序为例:\n```\n{\"id\": \"quickstart_001\", \"name\": \"Quick Start 001\",\n\"nodes\": [\n  {\"id\": \"node001\",\"name\": \"Node001\",\"action\": {\"createExp\": \"new com.jd.easyflow.flow.quickstart.QuickStart001Node01Action()\"},\"start\": true,\"post\": {\"to\": \"node002\"}},\n  {\"id\": \"node002\",\"name\": \"Node002\",\"action\": {\"createExp\": \"new com.jd.easyflow.flow.quickstart.QuickStart002Node01Action()\"},\"post\": {\"to\": \"node003\"}},\n  {\"id\": \"node003\",\"name\": \"Node003\",\"action\": {\"createExp\": \"new com.jd.easyflow.flow.quickstart.QuickStart003Node01Action()\"}}\n]\n}\n```\n其中QuickStart001Node01Action等为java节点动作类\n3. 编写应用启动时加载流程引擎的代码\n```\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/quickstart/quickstart_001.json\");\n        flowEngine.init();\n```     \nSpring环境可直接定义FlowEngineImpl bean(不要显式配置或调用init方法).        \n4. 编写具体流程调用执行的代码\n```\n       FlowParam param = new FlowParam(\"quickstart_001\");\n        FlowResult result = flowEngine.execute(param);\n```\n日志打印结果如下:\n```\n[main            ] INFO  FlowEngineImpl          - Start parsing definition files:easyflow-flow/target/test-classes/flow/quickstart/quickstart_001.json\n[main            ] INFO  FlowEngineImpl          - SART EXECUTE FLOW, flowId:quickstart_001 nodeIds:null\n[main            ] INFO  BaseFlowRunner          - EXECUTE NODE:node001\n[main            ] INFO  QuickStart001Node01Action  - Execute Node 001\n[main            ] INFO  BaseFlowRunner          - NEXT NODES:node002\n[main            ] INFO  BaseFlowRunner          - EXECUTE NODE:node002\n[main            ] INFO  QuickStart002Node01Action  - Execute Node 002\n[main            ] INFO  BaseFlowRunner          - NEXT NODES:node003\n[main            ] INFO  BaseFlowRunner          - EXECUTE NODE:node003\n[main            ] INFO  QuickStart003Node01Action  - Execute Node 003\n[main            ] INFO  BaseFlowRunner          - NEXT NODES:\n[main            ] INFO  QuickStartTest          - Execute finish, current node is:node003           \n```\n以上只是简单使用示例，EasyFlow可支持很多的配置项和使用场景，更多使用见wiki文档.\n\n#### 流程引擎-BPMN\n打开easyflow-flow-bpmn/BPMNDesigner.html流程设计器. 点击导入按钮，导入easyflow-flow-bpmn/src/test/resources/flow/quickstart/quickstart_001.bpmn文件，可在设计器中看到和以上JSON定义等价的BPMN流程定义.\n使用时只需要将FlowEngineImpl的flowParser设置为BpmnFlowParser.\n\n#### 工作流\n工作流模块提供了基于流程引擎的持久化和任务审批能力, 需要关系型数据库支持. 源码中的示例工程启动步骤如下:\n1. 检出本工程库代码至本地.\n1. 安装关系型数据库, 如MYSQL(使用时需遵守其许可). \n1. 建库表, 数据库名为easyflow, 表结构可参考源码中的create_all_table.sql和sample_form_template.sql. \n1. sample模块的application-open-all.yml文件中配置数据库连接信息, pom中引入数据库驱动jar包.\n1. 编译构建代码工程, 启动IntegrationOpenApplication类. 启动成功后访问http://localhost:9888便可看到JDEasyFlow管理界面.\n\n\n### 更多\nJDEasyFlow具有非常灵活的扩展性，你可以基于目前已开源组件扩展做更多的功能.\n\n### 联系我们\nemail: liyuliang5@jd.com"
  },
  {
    "path": "README.md",
    "content": "# JDEasyFlow\n\n### Introduce\nJDEasyFlow is a general flow orchestration component, suitable for service orchestration, workflow, auditing, etc. The characteristics are easy use, flexible, easy extended. Developer can understand using it in 30 minutes, understand its principle half of the day.\n\n### Architecture\nJDEasyFlow bottom layer is flow engine/state machine.(select one when use it, flow engine is recommanded), this module supply flow orchestration ability base on JSON format flow definition.\n\nBPMN module supply define flow based on BPMN and visualization ability. visualization is based on [bpmn-js](https://bpmn.io/). The essence of this module is\nconvert BPMN format definition to JDEasyFlow JSON format definition.\n\n\n### Usage\n\nThere are test cases in the test package of source code. You can run or debug directly to understand its usage and implement principle. \n\n#### Flow Engine\n\n1. Import easyflow-flow jar. take maven as example:\n```\n    <dependency>\n        <groupId>com.jd.easyflow</groupId>\n        <artifactId>easyflow-flow</artifactId>\n        <version>{latestVersion}</version>\n    </dependency>\n```\n\n2. Write flow definition. For example, the sequence is node001->node002->node003:\n```\n{\"id\": \"quickstart_001\", \"name\": \"Quick Start 001\",\n\"nodes\": [\n  {\"id\": \"node001\",\"name\": \"Node001\",\"action\": {\"createExp\": \"new com.jd.easyflow.flow.quickstart.QuickStart001Node01Action()\"},\"start\": true,\"post\": {\"to\": \"node002\"}},\n  {\"id\": \"node002\",\"name\": \"Node002\",\"action\": {\"createExp\": \"new com.jd.easyflow.flow.quickstart.QuickStart002Node01Action()\"},\"post\": {\"to\": \"node003\"}},\n  {\"id\": \"node003\",\"name\": \"Node003\",\"action\": {\"createExp\": \"new com.jd.easyflow.flow.quickstart.QuickStart003Node01Action()\"}}\n]\n}\n```\nQuickStart001Node01Action and so on is java node action class.\n\n3. Write the code of loading flow engine when application start.\n```\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/quickstart/quickstart_001.json\");\n        flowEngine.init();\n```     \nYou can define FlowEngineImpl bean in Spring(DO NOT configure or invoke init() method explicitly).  \n  \n4. Write the code of invoking flow engine.\n```\n       FlowParam param = new FlowParam(\"quickstart_001\");\n        FlowResult result = flowEngine.execute(param);\n```\n\nThe executing log are as follows:\n```\n[main            ] INFO  FlowEngineImpl          - Start parsing definition files:easyflow-flow/target/test-classes/flow/quickstart/quickstart_001.json\n[main            ] INFO  FlowEngineImpl          - SART EXECUTE FLOW, flowId:quickstart_001 nodeIds:null\n[main            ] INFO  BaseFlowRunner          - EXECUTE NODE:node001\n[main            ] INFO  QuickStart001Node01Action  - Execute Node 001\n[main            ] INFO  BaseFlowRunner          - NEXT NODES:node002\n[main            ] INFO  BaseFlowRunner          - EXECUTE NODE:node002\n[main            ] INFO  QuickStart002Node01Action  - Execute Node 002\n[main            ] INFO  BaseFlowRunner          - NEXT NODES:node003\n[main            ] INFO  BaseFlowRunner          - EXECUTE NODE:node003\n[main            ] INFO  QuickStart003Node01Action  - Execute Node 003\n[main            ] INFO  BaseFlowRunner          - NEXT NODES:\n[main            ] INFO  QuickStartTest          - Execute finish, current node is:node003           \n```\nAbove is simple usecase, JDEasyFlow support many configurations and use cases. More can be seen in wiki doc.\n\n#### FlowEngine-BPMN\nOpen flow designer with path easyflow-flow-bpmn/BPMNDesigner.html. Click import button, import easyflow-flow-bpmn/src/test/resources/flow/quickstart/quickstart_001.bpmn file. You can see bpmn flow definition of equal JSON format.\nYou only need set flowPaser of FlowEngineImpl to BpmnFlowParser when use.\n\n#### Process\nProcess module provide persistence and task audit ability based on flow engine, needing relation database support. Sample application in the source code can be started as follows:\n1. Checkout source code.\n1. Install relation database system, for example MYSQL(You should obey their license). \n1. Create database and table. Database name is easyflow, Table schema can be referred by create_all_table.sql and sample_form_template.sql. \n1. Config database connection info in application-open-all.yml of sample module, Import database driver jar in pom.xml of sample module.\n1. Build the project. Start IntegrationOpenApplication. Access http://localhost:9888.\n\n\n### More\n\nJDEasyFlow has very flexible extension ability. You can implement more features based on current component. For example flow data persistence, auditting, exception retry. \n\n### Contact US\nmailTo: liyuliang5@jd.com"
  },
  {
    "path": "easyflow-flow/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<parent>\n\t\t<artifactId>easyflow-parent</artifactId>\n\t\t<groupId>com.jd.easyflow</groupId>\n\t\t<version>1.7.3</version>\n\t</parent>\n\t<artifactId>easyflow-flow</artifactId>\n\t<name>easyflow-flow</name>\n\t<packaging>jar</packaging>\n\t<properties>\n\t</properties>\n\t<dependencies>\n\t\t<!--spring -->\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-context</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-expression</artifactId>\n\t\t</dependency>\n\t\t<!-- logback & slf4j dependencies -->\n\t\t<dependency>\n\t\t\t<groupId>ch.qos.logback</groupId>\n\t\t\t<artifactId>logback-classic</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.slf4j</groupId>\n\t\t\t<artifactId>slf4j-api</artifactId>\n\t\t</dependency>\n\n\t\t<!-- Jackson -->\n\t\t<dependency>\n\t\t\t<groupId>com.fasterxml.jackson.core</groupId>\n\t\t\t<artifactId>jackson-databind</artifactId>\n\t\t</dependency>\n\t\t<!--other -->\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t</dependencies>\n\n</project>"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/common/FlowExecutor.java",
    "content": "package com.jd.easyflow.flow.common;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\n\n/**\n * \n * @author liyuliang5\n *\n * @param <T> type\n */\npublic interface FlowExecutor<T> {\n\n    /**\n     * Common execute method\n     * \n     * @param context FlowContext\n     * @return result\n     */\n    T execute(FlowContext context);\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/el/ElEvaluator.java",
    "content": "package com.jd.easyflow.flow.el;\n\nimport java.util.Map;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic interface ElEvaluator {\n    \n    /**\n     * Evaluate with default context.\n     * @param <T>\n     * @param exp\n     * @param root\n     * @param cache\n     * @return\n     */\n    <T> T evalWithDefaultContext(String exp, Object root, boolean cache);\n    \n    /**\n     * Evaluate el value.\n     * @param <T>\n     * @param exp\n     * @param nodeContext\n     * @param flowContext\n     * @param data\n     * @return\n     */\n    <T>T eval(String exp, NodeContext nodeContext, FlowContext flowContext, Map<String, Object> data);\n    \n    String evalTemplateWithDefaultContext(String template, Object root, boolean cache);\n    \n    String evalTemplate(String template, NodeContext nodeContext, FlowContext flowContext, Map<String, Object> data);\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/el/ElFactory.java",
    "content": "package com.jd.easyflow.flow.el;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ElFactory {\n    \n    private static ElEvaluator defaultEvaluator = new SpelEvaluator();\n    \n    public static ElEvaluator get() {\n        return defaultEvaluator;\n    }\n    \n    public static void setDefaultEvaluator(ElEvaluator evaluator) {\n        defaultEvaluator = evaluator;\n    }\n      \n    public void setDefault(ElEvaluator evaluator) {\n        ElFactory.defaultEvaluator = evaluator;\n    }\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/el/ElRootMap.java",
    "content": "package com.jd.easyflow.flow.el;\n\nimport java.util.Collection;\nimport java.util.Map;\nimport java.util.Set;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * \n * @author liyuliang5\n */\npublic class ElRootMap implements Map<String, Object> {\n\n    private static final String KEY_NODE_CONTEXT = \"nodeContext\";\n    private static final String KEY_ACTION_RESULT = \"actionResult\";\n    private static final String KEY_NODE_BIZ_CONTEXT = \"nodeBizContext\";\n    private static final String KEY_CONTEXT = \"context\";\n    private static final String KEY_BIZ_CONTEXT = \"bizContext\";\n    private static final String KEY_PARAM = \"param\";\n    private static final String KEY_BIZ_PARAM = \"bizParam\";\n    private static final String KEY_PARAM_DATA = \"paramData\";\n    private static final String KEY_RESULT = \"result\";\n    private static final String KEY_BIZ_RESULT = \"bizResult\";\n    private static final String KEY_RESULT_DATA = \"resultData\";\n\n    NodeContext nodeContext;\n\n    FlowContext context;\n\n    Map<String, Object> data;\n\n    @Override\n    public boolean isEmpty() {\n        return false;\n    }\n\n    @Override\n    public boolean containsKey(Object key) {\n        if (key == null) {\n            return data == null ? false : data.containsKey(key);\n        }\n        if (key.getClass() == String.class) {\n            switch ((String) key) {\n            case KEY_NODE_CONTEXT:\n            case KEY_ACTION_RESULT:\n            case KEY_NODE_BIZ_CONTEXT:\n            case KEY_CONTEXT:\n            case KEY_BIZ_CONTEXT:\n            case KEY_PARAM:\n            case KEY_BIZ_PARAM:\n            case KEY_PARAM_DATA:\n            case KEY_RESULT:\n            case KEY_BIZ_RESULT:\n            case KEY_RESULT_DATA:\n                return true;\n            default:\n                return data == null ? false : data.containsKey(key);\n            }\n        }\n        return false;\n    }\n\n    @Override\n    public Object get(Object key) {\n        if (key == null) {\n            return data == null ? null : data.get(key);\n        }\n        if (key.getClass() == String.class) {\n            Object value = null;\n            switch ((String) key) {\n            case KEY_NODE_CONTEXT:\n                value = nodeContext;\n                break;\n            case KEY_ACTION_RESULT:\n                value = nodeContext == null ? null : nodeContext.getActionResult();\n                break;\n            case KEY_NODE_BIZ_CONTEXT:\n                value = nodeContext == null ? null : nodeContext.getNodeContext();\n                break;\n            case KEY_CONTEXT:\n                value = context;\n                break;\n            case KEY_BIZ_CONTEXT:\n                value = context == null ? null : context.getContext();\n                break;\n            case KEY_PARAM:\n                value = context == null ? null : context.getParam();\n                break;\n            case KEY_BIZ_PARAM:\n                value = context == null ? null : (context.getParam() == null ? null : context.getParam().getParam());\n                break;\n            case KEY_PARAM_DATA:\n                value = context == null ? null : (context.getParam() == null ? null : context.getParam().getDataMap());\n                break;\n            case KEY_RESULT:\n                value = context == null ? null : context.getResult();\n                break;\n            case KEY_BIZ_RESULT:\n                value = context == null ? null : (context.getResult() == null ? null : context.getResult().getResult());\n                break;\n            case KEY_RESULT_DATA:\n                value = context == null ? null : (context.getResult() == null ? null : context.getResult().getDataMap());\n            default:\n                // NOOP\n            }\n            if (value == null && data != null) {\n                value = data.get(key);\n            }\n            return value;\n        }\n        return null;\n    }\n\n    @Override\n    public int size() {\n        throw new UnsupportedOperationException();\n    }\n\n    @Override\n    public boolean containsValue(Object value) {\n        throw new UnsupportedOperationException();\n    }\n\n    @Override\n    public Object put(String key, Object value) {\n        throw new UnsupportedOperationException();\n    }\n\n    @Override\n    public Object remove(Object key) {\n        throw new UnsupportedOperationException();\n    }\n\n    @Override\n    public void putAll(Map<? extends String, ? extends Object> m) {\n        throw new UnsupportedOperationException();\n\n    }\n\n    @Override\n    public void clear() {\n        throw new UnsupportedOperationException();\n\n    }\n\n    @Override\n    public Set<String> keySet() {\n        throw new UnsupportedOperationException();\n    }\n\n    @Override\n    public Collection<Object> values() {\n        throw new UnsupportedOperationException();\n    }\n\n    @Override\n    public Set<Entry<String, Object>> entrySet() {\n        throw new UnsupportedOperationException();\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/el/SpelEvaluator.java",
    "content": "package com.jd.easyflow.flow.el;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.context.ApplicationContext;\nimport org.springframework.context.ApplicationContextAware;\nimport org.springframework.context.expression.BeanFactoryResolver;\nimport org.springframework.context.expression.MapAccessor;\nimport org.springframework.expression.EvaluationContext;\nimport org.springframework.expression.Expression;\nimport org.springframework.expression.ExpressionParser;\nimport org.springframework.expression.ParserContext;\nimport org.springframework.expression.spel.standard.SpelExpressionParser;\nimport org.springframework.expression.spel.support.StandardEvaluationContext;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.util.JsonUtil;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class SpelEvaluator implements ElEvaluator, ApplicationContextAware {\n\n    private static final Logger logger = LoggerFactory.getLogger(SpelEvaluator.class);\n\n    // Normal implementation.\n    public static final int ROOT_TYPE_HASH_MAP = 0;\n    // Performance is higher than HashMap\n    public static final int ROOT_TYPE_ROOT_MAP = 1;\n\n    private int rootType = ROOT_TYPE_ROOT_MAP;\n\n    private boolean cache = true;\n    \n\n    private StandardEvaluationContext context = new StandardEvaluationContext();\n\n    private Map<String, Expression> cacheMap = new ConcurrentHashMap();\n\n    private ExpressionParser parser = new SpelExpressionParser();\n\n    private ApplicationContext applicationContext;\n    \n    private static Map<String, Expression> templateCacheMap = new ConcurrentHashMap();\n    \n    {\n        context.addPropertyAccessor(new MapAccessor());\n    }\n\n    @Override\n    public <T> T evalWithDefaultContext(String exp, Object root, boolean cache) {\n        try {\n            Expression expression;\n            if (cache) {\n                expression = cacheMap.get(exp);\n                if (expression == null) {\n                    expression = parser.parseExpression(exp);\n                    cacheMap.put(exp, expression);\n                }\n            } else {\n                expression = parser.parseExpression(exp);\n            }\n\n            Object value = expression.getValue(context, root);\n            return (T) value;\n        } catch (Exception e) {\n            if (logger.isErrorEnabled()) {\n                logger.error(\"Eval spel exception, exp:\" + exp + \",\" + e.getMessage());\n            }\n            throw e;\n        }\n    }\n\n    @Override\n    public <T> T eval(String exp, NodeContext nodeContext, FlowContext flowContext, Map<String, Object> data) {\n        if (flowContext.isLogOn() && logger.isInfoEnabled()) {\n            logger.info(\"EVAL SPEL:\" + exp);\n        }\n        Object root = null;\n        switch (rootType) {\n        case ROOT_TYPE_HASH_MAP:\n            root = buildHashMapRoot(nodeContext, flowContext, data);\n            break;\n        case ROOT_TYPE_ROOT_MAP:\n            root = buildRootMapRoot(nodeContext, flowContext, data);\n            break;\n        }\n        Object result = null;\n        try {\n            result = evalWithDefaultContext(exp, root, cache);\n        } catch (Exception e) {\n            if (flowContext.isLogOn() && logger.isErrorEnabled()) {\n                logger.error(\"EVAL SPEL EXCEPTION, EXP:\" + exp + \",\" + e.getMessage());\n            }\n            throw e;\n        }\n        if (flowContext.isLogOn() && logger.isInfoEnabled()) {\n            try {\n                logger.info(\"SPEL RESULT:\" + JsonUtil.toJsonString(result));\n            } catch (Throwable t) {\n                logger.info(\"spel result to json string exception:\" + t.getMessage());\n            }\n        }\n        return (T) result;\n    }\n\n    private Object buildHashMapRoot(NodeContext nodeContext, FlowContext flowContext, Map<String, Object> data) {\n        Map<String, Object> root = new HashMap<>();\n        if (nodeContext != null) {\n            root.put(\"nodeContext\", nodeContext);\n            root.put(\"actionResult\", nodeContext.getActionResult());\n            if (nodeContext.getNodeContext() != null) {\n                root.put(\"nodeBizContext\", nodeContext.getNodeContext());\n            }\n        }\n        if (flowContext != null) {\n            root.put(\"context\", flowContext);\n            if (flowContext.getContext() != null) {\n                root.put(\"bizContext\", flowContext.getContext());\n            }\n            root.put(\"param\", flowContext.getParam());\n            if (flowContext.getParam() != null && flowContext.getParam().getParam() != null) {\n                root.put(\"bizParam\", flowContext.getParam().getParam());\n            }\n            if (flowContext.getParam() != null && flowContext.getParam().getDataMap() != null) {\n                root.put(\"paramData\", flowContext.getParam().getDataMap());\n            }\n            root.put(\"result\", flowContext.getResult());\n            if (flowContext.getResult() != null && flowContext.getResult().getResult() != null) {\n                root.put(\"bizResult\", flowContext.getResult().getResult());\n                root.put(\"resultData\", flowContext.getResult().getDataMap());\n            }\n        }\n        if (data != null) {\n            root.putAll(data);\n        }\n        return root;\n    }\n\n    private Object buildRootMapRoot(NodeContext nodeContext, FlowContext flowContext, Map<String, Object> data) {\n        ElRootMap root = new ElRootMap();\n        root.nodeContext = nodeContext;\n        root.context = flowContext;\n        if (data != null) {\n            root.data = data;\n        }\n        return root;\n    }\n    \n    @Override\n    public String evalTemplate(String template, NodeContext nodeContext, FlowContext flowContext,\n            Map<String, Object> data) {\n        if (flowContext.isLogOn() && logger.isInfoEnabled()) {\n            logger.info(\"EVAL TEMPLATE:\" + template);\n        }\n        Object root = null;\n        switch (rootType) {\n        case ROOT_TYPE_HASH_MAP:\n            root = buildHashMapRoot(nodeContext, flowContext, data);\n            break;\n        case ROOT_TYPE_ROOT_MAP:\n            root = buildRootMapRoot(nodeContext, flowContext, data);\n            break;\n        }\n        String result = null;\n        try {\n            result = evalTemplateWithDefaultContext(template, root, cache);\n        } catch (Exception e) {\n            if (flowContext.isLogOn() && logger.isErrorEnabled()) {\n                logger.error(\"EVAL TEMPLATE EXCEPTION, TEMPLATE:\" + template + \",\" + e.getMessage());\n            }\n            throw e;\n        }\n        if (flowContext.isLogOn() && logger.isInfoEnabled()) {\n            logger.info(\"TEMPLATE RESULT:\" + result);\n        }\n        return result;\n    }\n\n    \n    @Override\n    public String evalTemplateWithDefaultContext(String template, Object root, boolean cache) {\n        try {\n            Expression expression;\n            if (cache) {\n                expression = templateCacheMap.get(template);\n                if (expression == null) {\n                    expression = parser.parseExpression(template, ParserContext.TEMPLATE_EXPRESSION);\n                    templateCacheMap.put(template, expression);\n                }\n            } else {\n                expression = parser.parseExpression(template, ParserContext.TEMPLATE_EXPRESSION);\n            }\n            Object result = null;\n            result = expression.getValue(context, root);\n            if (result == null) {\n                return null;\n            }\n            return result.toString();\n        } catch (Exception e) {\n            logger.error(\"SPEL template eval exception, template:\" + template, e);\n            throw e;\n        }\n    }\n\n\n    public int getRootType() {\n        return rootType;\n    }\n\n    public void setRootType(int rootType) {\n        this.rootType = rootType;\n    }\n\n    public boolean isCache() {\n        return cache;\n    }\n\n    public void setCache(boolean cache) {\n        this.cache = cache;\n    }\n    \n    public ApplicationContext getApplicationContext() {\n        return applicationContext;\n    }\n\n    @Override\n    public void setApplicationContext(ApplicationContext applicationContext) {\n        this.applicationContext = applicationContext;\n        context.setBeanResolver(new BeanFactoryResolver(applicationContext));\n    }\n\n    public StandardEvaluationContext getContext() {\n        return context;\n    }\n\n    public void setContext(StandardEvaluationContext context) {\n        this.context = context;\n    }\n\n    public ExpressionParser getParser() {\n        return parser;\n    }\n\n    public void setParser(ExpressionParser parser) {\n        this.parser = parser;\n    }\n    \n    \n\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/FlowContext.java",
    "content": "package com.jd.easyflow.flow.engine;\n\nimport java.io.Serializable;\nimport java.util.List;\nimport java.util.Map;\n\nimport com.jd.easyflow.flow.el.ElEvaluator;\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * Flow context.\n * @author liyuliang5\n *\n */\npublic interface FlowContext extends Serializable {\n        \n    /**\n     * Get start node context list.\n     * @return\n     */\n    List<NodeContext> getStartNodes();\n    /**\n     * Set start node context list.\n     * @param startNodes\n     */\n    void setStartNodes(List<NodeContext> startNodes);\n    /**\n     * Get end node context list. \n     * From every start node, if execute to no next node(Including execute nodes), we add it to end node list.\n     * @return\n     */\n    List<NodeContext> getEndNodes();\n    \n    /**\n     * Put context data.\n     * @param key\n     * @param value\n     */\n    void put(String key, Object value);\n    /**\n     * Get context data.\n     * @param <T>\n     * @param key\n     * @return\n     */\n    <T> T get(String key);\n    \n    /**\n     * Delete key.\n     * @param key\n     */\n    void remove(String key);\n    \n    \n    /**\n     * Get data.\n     * @return\n     */\n    Map<String, Object> getData();\n    \n    /**\n     * Get flow param.\n     * @return\n     */\n    FlowParam getParam();\n    \n    /**\n     * Set flow param.\n     * @param param\n     */\n    void setParam(FlowParam param);\n    \n    /**\n     * Get flow result.\n     * @return\n     */\n    FlowResult getResult();\n\n    /**\n     * Set flow result.\n     * @param result\n     */\n    void setResult(FlowResult result);\n    \n    /**\n     * Get flow id.\n     * @return\n     */\n    String getFlowId();\n    \n    /**\n     * Set flow id.\n     * @param flowId\n     */\n    void setFlowId(String flowId);\n    \n    /**\n     * Get flow.\n     * @return\n     */\n    Flow getFlow();\n    \n    /**\n     * Set flow.\n     * @param flow\n     */\n    void setFlow(Flow flow);\n    \n    /**\n     * Get flow engine.\n     * @return\n     */\n    FlowEngine getFlowEngine();\n    \n    /**\n     * Set interrupted. only can from false to true.\n     * @param interrupted\n     */\n    void setInterrupted();\n    \n    /**\n     * Get interrupted.\n     * @return\n     */\n    boolean isInterrupted();\n    \n    /**\n     * Get pre result.\n     * @return\n     */\n    Boolean getPreResult();\n    \n    /**\n     * Get log flag.\n     * @return\n     */\n    Boolean getLogFlag();\n\n    /**\n     * Set log flag.\n     * @param logFlag\n     */\n    void setLogFlag(Boolean logFlag);\n       \n    /**\n     * \n     * @return\n     */\n    boolean isLogOn();\n    \n    /**\n     * Get business context.\n     * @param <T>\n     * @return\n     */\n    <T>T getContext();\n\n    /**\n     * Set business context.\n     * @param context\n     */\n    void setContext(Object context);\n    \n    /**\n     * Get ElEvaluator.\n     * @return\n     */\n    ElEvaluator getElEvaluator();\n    \n    /**\n     * Whether record history.\n     * @return\n     */\n    boolean isRecordHistory();\n    \n    /**\n     * Get FlowContext of parent flow.\n     * @return\n     */\n    FlowContext getParentContext();\n    \n    /**\n     * Get nodeContext of parent flow.\n     * @return\n     */\n    NodeContext getParentNodeContext();\n    \n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/FlowEngine.java",
    "content": "package com.jd.easyflow.flow.engine;\n\nimport java.util.Map;\n\nimport com.jd.easyflow.flow.el.ElEvaluator;\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.flow.model.parser.FlowParser;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic interface FlowEngine {\n    \n    /**\n     * Execute flow.\n     * @param param\n     * @return\n     */\n    FlowResult execute(FlowParam param);\n    \n    /**\n     * Get flow definition.\n     * @param id\n     * @return\n     */\n    Flow getFlow(String id);\n    \n    /**\n     * Get flow parser.\n     * @return\n     */\n    FlowParser getFlowParser();\n    \n    \n    /**\n     * Get engine properties.\n     * @return\n     */\n    Map<String, Object> getProperties();\n    \n    \n    /**\n     * Get engine property.\n     * @param <T>\n     * @param key\n     * @return\n     */\n    <T>T getProperty(String key);\n    \n    /**\n     * \n     * @return\n     */\n    ElEvaluator getElEvaluator();\n    \n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/FlowParam.java",
    "content": "package com.jd.easyflow.flow.engine;\n\nimport java.io.Serializable;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport com.fasterxml.jackson.annotation.JsonIgnore;\nimport com.jd.easyflow.flow.engine.impl.FlowContextImpl;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FlowParam implements Serializable {\n\n    public FlowParam() {\n        // NOOP\n    }\n\n    public FlowParam(String flowId) {\n        this.flowId = flowId;\n    }\n\n    public FlowParam(String flowId, Object param) {\n        this.flowId = flowId;\n        this.param = param;\n    }\n\n    public FlowParam(String flowId, String[] nodeIds, Object param) {\n        this.flowId = flowId;\n        this.nodeIds = nodeIds;\n        this.param = param;\n    }\n\n    public FlowParam(String flowId, String[] nodeIds, Object param, Map<String, Object> dataMap) {\n        this.flowId = flowId;\n        this.nodeIds = nodeIds;\n        this.param = param;\n        if (dataMap != null) {\n            for (Entry<String, Object> entry : dataMap.entrySet()) {\n                if (entry.getValue() == null) {\n                    this.dataMap.remove(entry.getKey());\n                } else {\n                    this.dataMap.put(entry.getKey(), entry.getValue());\n                }\n            }\n        }\n        this.dataMap = dataMap;\n    }\n\n    public FlowParam(String flowId, String nodeId, Object param) {\n        this.flowId = flowId;\n        this.nodeIds = new String[] { nodeId };\n        this.param = param;\n    }\n\n    private String flowId;\n\n    private String[] nodeIds;\n    /**\n     * business param.\n     */\n    private Object param;\n\n    /**\n     * flow context.\n     */\n    @JsonIgnore\n    private FlowContext context;\n    /**\n     * common param data.\n     */\n    private Map<String, Object> dataMap = new ConcurrentHashMap<String, Object>();\n    \n    /**\n     * log flag\n     */\n    private Boolean logFlag;\n    \n    public String getFlowId() {\n        return flowId;\n    }\n\n    public void setFlowId(String flowId) {\n        this.flowId = flowId;\n    }\n\n    public String[] getNodeIds() {\n        return nodeIds;\n    }\n\n    public void setNodeIds(String[] nodeIds) {\n        this.nodeIds = nodeIds;\n    }\n\n    public void setNodeId(String nodeId) {\n        if (nodeId == null) {\n            return;\n        }\n        this.nodeIds = new String[] { nodeId };\n    }\n\n    public <T> T getParam() {\n        return (T) param;\n    }\n\n    /**\n     * param should be Object[] or List\n     * \n     * @param <T>\n     * @param index\n     * @return\n     */\n    public <T> T getParam(int index) {\n        if (param == null) {\n            return null;\n        }\n        if (param instanceof Object[]) {\n            return (T) ((Object[]) param)[index];\n        } else if (param instanceof List) {\n            return (T) ((List) param).get(index);\n        }\n        throw new IllegalStateException(\"Param:\" + param + \" is not index type\");\n    }\n\n    /**\n     * param should be Map\n     * \n     * @param <T>\n     * @param key\n     * @return\n     */\n    public <T> T getParam(String key) {\n        if (param == null) {\n            return null;\n        }\n        return (T) ((Map<String, Object>) param).get(key);\n    }\n\n    public void putParam(String key, Object value) {\n        if (param == null) {\n            param = new ConcurrentHashMap<>();\n        }\n        if (value == null) {\n            ((Map<String, Object>) param).remove(key);\n        } else {\n            ((Map<String, Object>) param).put(key, value);\n        }\n    }\n\n    public void setParam(Object param) {\n        this.param = param;\n    }\n\n    public FlowContext getContext() {\n        return context;\n    }\n\n    /**\n     * High level method.\n     * @param context. SHOULD use new FlowContext Object and can only invoke some methods.\n     */\n    public void setContext(FlowContext context) {\n        this.context = context;\n    }\n\n    public Map<String, Object> getDataMap() {\n        return dataMap;\n    }\n\n    public void setDataMapFrom(FlowParam fromParam) {\n        this.dataMap = fromParam.dataMap;\n    }\n\n    public void put(String key, Object value) {\n        if (value == null) {\n            dataMap.remove(key);\n        } else {\n            dataMap.put(key, value);\n        }\n    }\n\n    public <T> T get(String key) {\n        return (T) dataMap.get(key);\n    }\n\n    public void putContextData(String key, Object value) {\n        if (context == null) {\n            context = new FlowContextImpl();\n        }\n        if (value == null) {\n            context.remove(key);\n        } else {\n            context.put(key, value);\n        }\n    }\n    \n    public void setBizContext(Object bizContext) {\n        if (context == null) {\n            context = new FlowContextImpl();\n        }\n        context.setContext(bizContext);\n    }\n\n    public Boolean getLogFlag() {\n        return logFlag;\n    }\n\n    public void setLogFlag(Boolean logFlag) {\n        this.logFlag = logFlag;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/FlowResult.java",
    "content": "package com.jd.easyflow.flow.engine;\n\nimport java.io.Serializable;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport com.fasterxml.jackson.annotation.JsonIgnore;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FlowResult implements Serializable {\n\n    @JsonIgnore\n    private FlowContext context;\n\n    private Object result;\n    \n    /**\n     * common result data.\n     */\n    private Map<String, Object> dataMap = new ConcurrentHashMap<String, Object>();\n\n    public FlowContext getContext() {\n        return context;\n    }\n\n    public void setContext(FlowContext context) {\n        this.context = context;\n    }\n\n    public synchronized <T> T getResult() {\n        return (T) result;\n    }\n\n    public synchronized void setResult(Object result) {\n        this.result = result;\n    }\n\n    /**\n     * \n     * Put result. putResult or addResult should use only one.\n     *\n     * @param key\n     * @param value\n     */\n    public synchronized void putResult(String key, Object value) {\n        if (result == null) {\n            result = new ConcurrentHashMap<>();\n        }\n        if (value == null) {\n            ((Map<String, Object>) result).remove(key);\n        } else {\n            ((Map<String, Object>) result).put(key, value);\n        }\n    }\n\n    /**\n     * \n     * Add result. putResult or addResult should use only one.\n     *\n     * @param value\n     */\n    public synchronized void addResult(Object value) {\n        if (result == null) {\n            result = new ArrayList<Object>();\n        }\n        ((List<Object>) result).add(value);\n    }\n\n    public synchronized <T> T getResult(String key) {\n        if (result == null) {\n            return null;\n        }\n        return (T) ((Map<String, Object>) result).get(key);\n    }\n\n    public synchronized <T> T getResult(int index) {\n        if (result == null) {\n            return null;\n        }\n        return (T) ((List<Object>) result).get(index);\n    }\n    \n    public Map<String, Object> getDataMap() {\n        return dataMap;\n    }\n\n    public void setDataMapFrom(FlowResult result) {\n        this.dataMap = result.dataMap;\n    }\n\n    public void put(String key, Object value) {\n        if (value == null) {\n            dataMap.remove(key);\n        } else {\n            dataMap.put(key, value);\n        }\n    }\n\n    public <T> T get(String key) {\n        return (T) dataMap.get(key);\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/FlowRunner.java",
    "content": "package com.jd.easyflow.flow.engine;\n\nimport com.jd.easyflow.flow.model.FlowLifeCycle;\n\n/**\n * Flow runner. \n * @author liyuliang5\n * @date 2021/07/26\n */\npublic interface FlowRunner extends FlowLifeCycle {\n    \n    /**\n     * Run flow.\n     * @param context\n     */\n    void run(FlowContext context);\n    \n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/builder/FlowParamBuilder.java",
    "content": "package com.jd.easyflow.flow.engine.builder;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Map.Entry;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowParam;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FlowParamBuilder {\n\n\tprivate FlowParam param;\n\t\n\tpublic static FlowParamBuilder create(String flowId, String nodeId) {\n\t\tFlowParam param = new FlowParam();\n\t\tparam.setFlowId(flowId);\n\t\tparam.setNodeIds(new String[] {nodeId});\n\t\tFlowParamBuilder builder = new FlowParamBuilder();\n\t\tbuilder.param = param;\n\t\treturn builder;\n\t}\n\t\n\t   public static FlowParamBuilder create(String flowId, String[] nodeIds) {\n\t        FlowParam param = new FlowParam();\n\t        param.setFlowId(flowId);\n\t        param.setNodeIds(nodeIds);\n\t        FlowParamBuilder builder = new FlowParamBuilder();\n\t        builder.param = param;\n\t        return builder;\n\t    }\n\t\n\tpublic FlowParamBuilder putParam(String key, Object value) {\n\t\tif (param.getParam() == null) {\n\t\t\tparam.setParam( new HashMap<>());\n\t\t}\n\t\t((Map<String, Object>) param.getParam()).put(key, value);\n\t\treturn this;\n\t}\n\t\n\tpublic FlowParamBuilder addParam(Object value) {\n\t\tif (param.getParam() == null) {\n\t\t\tparam.setParam(new ArrayList());\n\t\t}\n\t\t((List<Object>) param.getParam()).add(value);\n\t\treturn this;\n\t}\n\t\n\tpublic FlowParamBuilder addParams(Object... values) {\n\t\tif (param.getParam() == null) {\n\t\t\tparam.setParam(new ArrayList());\n\t\t}\n\t\t((List<Object>) param.getParam()).addAll(Arrays.asList(values));\n\t\treturn this;\n\t}\n\t\n\tpublic FlowParamBuilder paramObject(Object o) {\n\t\tparam.setParam(o);\n\t\treturn this;\n\t}\n\t\n    public FlowParamBuilder putData(String key, Object value) {\n        param.put(key, value);\n        return this;\n    }\n    \n    public FlowParamBuilder putData(Map<String, Object> dataMap) {\n        if (dataMap != null) {\n            for (Entry<String, Object> entry : dataMap.entrySet()) {\n                param.put(entry.getKey(), entry.getValue());\n            }\n        }\n        return this;\n    }\n    \n    public FlowParamBuilder setContext(FlowContext context) {\n        param.setContext(context);\n        return this;\n    }\n\t\n\tpublic FlowParam build() {\n\t\treturn param;\n\t}\n\t\n\t\n\t\n\t\n\t\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/event/BaseFlowEventListener.java",
    "content": "package com.jd.easyflow.flow.engine.event;\n\nimport java.util.List;\nimport java.util.Map;\n\nimport com.jd.easyflow.flow.util.Pair;\n\n/**\n * @author liyuliang5\n */\npublic abstract class BaseFlowEventListener implements FlowEventListener {\n    \n    protected Pair<String, Integer>[] acceptedEvents;\n\n    @Override\n    public Pair<String, Integer>[] getAcceptedEvents() {\n        return acceptedEvents;\n    }\n    \n    public void setAcceptedEvents(Pair<String, Integer>[] acceptedEvents) {\n        this.acceptedEvents = acceptedEvents;\n    }\n\n    @Override\n    public void postConstruct(Map<String, Object> definition, Map<String, Object> context) {\n        if (definition == null) {\n            return;\n        }\n        List<Map<String, Object>> acceptedEvents = (List<Map<String, Object>>)definition.get(\"acceptedEvents\");\n        if (acceptedEvents != null) {\n            this.acceptedEvents = new Pair[acceptedEvents.size()];\n            for (int i = 0; i < acceptedEvents.size(); i++) {\n                Map<String, Object> acceptedEvent = acceptedEvents.get(i);\n                String event = (String) acceptedEvent.get(\"event\");\n                Integer order = (Integer) acceptedEvent.get(\"order\");\n                this.acceptedEvents[i] = Pair.of(event, order);\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/event/ExpFlowEventListener.java",
    "content": "package com.jd.easyflow.flow.engine.event;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport com.jd.easyflow.flow.el.ElEvaluator;\nimport com.jd.easyflow.flow.el.ElFactory;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ExpFlowEventListener extends BaseFlowEventListener {\n    \n    private ElEvaluator elEvaluator;\n    \n    private String exp;\n    \n    public ExpFlowEventListener() {\n        \n    }\n    \n    public ExpFlowEventListener(String exp) {\n        this.exp = exp;\n    }\n    \n    @Override\n    public void on(FlowEvent flowEvent) {\n        Map<String, Object> data = new HashMap<>();\n        data.put(\"event\", flowEvent);\n        ElEvaluator evaluator = elEvaluator;\n        if (evaluator == null && flowEvent.getContext() != null) {\n            elEvaluator = flowEvent.getContext().getElEvaluator();\n        }\n        if (evaluator == null) {\n            evaluator = ElFactory.get();\n        }\n        evaluator.eval(exp, null, flowEvent.getContext(), data);\n    }\n\n    public ElEvaluator getElEvaluator() {\n        return elEvaluator;\n    }\n\n    public void setElEvaluator(ElEvaluator elEvaluator) {\n        this.elEvaluator = elEvaluator;\n    }\n\n    public String getExp() {\n        return exp;\n    }\n\n    public void setExp(String exp) {\n        this.exp = exp;\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/event/FlowEvent.java",
    "content": "package com.jd.easyflow.flow.engine.event;\n\nimport java.util.List;\nimport java.util.Map;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FlowEvent {\n\n\tprivate String type;\n\t\n\tprivate Object data;\n\t\n\tprivate FlowContext context;\n\t\n\tpublic FlowEvent() {\n\t    \n\t}\n\t\n\tpublic FlowEvent(String type, Object data, FlowContext context) {\n\t    this.type = type;\n\t    this.data = data;\n\t    this.context = context;\n\t}\n\n\tpublic String getType() {\n\t\treturn type;\n\t}\n\n\tpublic void setType(String type) {\n\t\tthis.type = type;\n\t}\n\n\tpublic Object getData() {\n\t\treturn data;\n\t}\n\n\tpublic void setData(Object data) {\n\t\tthis.data = data;\n\t}\n\t\n\tpublic <T>T getMapData(String key) {\n\t\tif (data == null) {\n\t\t\treturn null;\n\t\t}\n\t\treturn (T) ((Map<String, Object>) data).get(key);\n\t}\n\t\n\tpublic <T>T getListData(int index) {\n\t\tif (data == null) {\n\t\t\treturn null;\n\t\t}\n\t\treturn (T) ((List<Object>) data).get(index);\n\t}\n\n\tpublic FlowContext getContext() {\n\t\treturn context;\n\t}\n\n\tpublic void setContext(FlowContext context) {\n\t\tthis.context = context;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/event/FlowEventListener.java",
    "content": "package com.jd.easyflow.flow.engine.event;\n\nimport com.jd.easyflow.flow.model.FlowLifeCycle;\nimport com.jd.easyflow.flow.util.Pair;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic interface FlowEventListener extends FlowLifeCycle {\n\t\n    /**\n     * \n     * @return List of Event and order priority pair. \n     * The highest order values has highest priority.\n     * If order value same, the front configured has higher priority.\n     */\n    default Pair<String, Integer>[] getAcceptedEvents() {\n        return null;\n    }\n    \n    /**\n     * Listener Id.\n     * @return\n     */\n    default String getId() {\n        return this.getClass().getName();\n    }\n    \n    /**\n     * Callback of event.\n     * @param flowEvent\n     */\n    public void on(FlowEvent flowEvent);\n    \n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/event/FlowEventTrigger.java",
    "content": "package com.jd.easyflow.flow.engine.event;\n\nimport java.util.ArrayList;\nimport java.util.Comparator;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.TreeMap;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.flow.model.InitContext;\nimport com.jd.easyflow.flow.util.Pair;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FlowEventTrigger {\n    \n    public static final Logger logger = LoggerFactory.getLogger(FlowEventTrigger.class);\n\n    public static final String NULL_KEY = null;\n\n    private List<FlowEventListener> listenerList;\n\n    private Map<String, TreeMap<Integer, List<FlowEventListener>>> listenerMap;\n    \n    public void init(InitContext initContext, Flow flow) {\n        if (listenerList != null) {\n            for (FlowEventListener listener : listenerList) {\n                listener.init(initContext, flow);\n            }\n        }\n    }\n    \n    public void destroy () {\n        if (listenerList != null) {\n            for (FlowEventListener listener : listenerList) {\n                listener.destroy();\n            }\n        }\n    }\n\n\n    public void addListener(FlowEventListener listener) {\n        if (listenerList == null) {\n            listenerList = new ArrayList();\n            listenerMap =  new HashMap<>();\n        }\n        listenerList.add(listener);\n        Pair<String, Integer>[] pairs = listener.getAcceptedEvents();\n        if (pairs == null) {\n            pairs = new Pair[] { Pair.of(NULL_KEY, 0) };\n        }\n        for (Pair<String, Integer> pair : pairs) {\n            TreeMap<Integer, List<FlowEventListener>> map = listenerMap.get(pair.getLeft());\n            if (map == null) {\n                map = new TreeMap<Integer, List<FlowEventListener>>(Comparator.reverseOrder());\n                listenerMap.put(pair.getLeft(), map);\n            }\n            List<FlowEventListener> listeners = map.get(pair.getRight());\n            if (listeners == null) {\n                listeners = new ArrayList();\n                map.put(pair.getRight(), listeners);\n            }\n            listeners.add(listener);\n        }\n    }\n\n    public void triggerEvent(String eventType, FlowContext context) {\n        triggerEvent(eventType, null, context, false);\n    }\n\n    public void triggerEvent(String eventType, Object eventData, FlowContext context, boolean catchThrowable) {\n        if (listenerList == null || listenerList.size() == 0) {\n            return;\n        }\n        \n        FlowEvent event = null;\n        \n        \n        TreeMap<Integer, List<FlowEventListener>> map = listenerMap.get(eventType);\n        if (map != null) {\n            event = createEvent(eventType, eventData, context);\n        }\n        // priority>0\n        if (map != null) {\n            for (Entry<Integer, List<FlowEventListener>> entry : map.entrySet()) {\n                if (entry.getKey() <= 0) {\n                    break;\n                }\n                for (FlowEventListener listener : entry.getValue()) {\n                    onEvent(event, listener, catchThrowable);\n                }\n            }\n        }\n        \n        // key exists and priority =0\n        if (map != null) {\n            List<FlowEventListener> keyZeroListeners = map.get(0);\n            if (keyZeroListeners != null) {\n                for (FlowEventListener listener : keyZeroListeners) {\n                    onEvent(event, listener, catchThrowable);\n                }\n            }\n        }\n        // key is null\n        TreeMap<Integer, List<FlowEventListener>> nullMap = listenerMap.get(NULL_KEY);\n        if (nullMap != null) {\n            List<FlowEventListener> nullZeroListeners = nullMap.get(0);\n            if (nullZeroListeners != null) {\n                if (event == null) {\n                    event = createEvent(eventType, eventData, context);\n                }\n                for (FlowEventListener listener : nullZeroListeners) {\n                    onEvent(event, listener, catchThrowable);\n                }\n            }\n        }\n        // priority<0\n        if (map != null) {\n            for (Entry<Integer, List<FlowEventListener>> entry : map.entrySet()) {\n                if (entry.getKey() >= 0) {\n                    continue;\n                }\n                for (int i = 0; i < entry.getValue().size(); i++) {\n                    onEvent(event, entry.getValue().get(entry.getValue().size() - 1 - i), catchThrowable);\n                }\n            } \n        }\n    }\n    \n    private FlowEvent createEvent(String eventType, Object eventData, FlowContext context) {\n        FlowEvent event = new FlowEvent();\n        event.setType(eventType);\n        event.setData(eventData);\n        event.setContext(context);\n        return event;\n    }\n    \n    private void onEvent(FlowEvent event, FlowEventListener listener, boolean catchThrowable) {\n        if (!catchThrowable) {\n            listener.on(event);\n        } else {\n            try {\n                listener.on(event);\n            } catch (Throwable t) { //NOSONAR\n                logger.error(\"Exception on event of \" + listener.getClass().getName() + \", message:\" + t.getMessage(), t);\n            }\n        }\n    }\n\n    public List<FlowEventListener> getListenerList() {\n        return listenerList;\n    }\n\n    \n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/event/impl/EventFlowListener.java",
    "content": "package com.jd.easyflow.flow.engine.event.impl;\n\nimport java.util.List;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.event.BaseFlowEventListener;\nimport com.jd.easyflow.flow.engine.event.FlowEvent;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.util.FlowConstants;\nimport com.jd.easyflow.flow.util.FlowEventTypes;\nimport com.jd.easyflow.flow.util.FlowStringUtil;\nimport com.jd.easyflow.flow.util.Pair;\n\n/**\n * Listener of event node.\n * @author liyuliang5\n *\n */\npublic class EventFlowListener extends BaseFlowEventListener {\n\n    private static final Logger logger = LoggerFactory.getLogger(EventFlowListener.class);\n    \n    private int initEndEventOrder = FlowConstants.EVENT_ORDER_START;\n\n    @Override\n    public Pair<String, Integer>[] getAcceptedEvents() {\n        if (this.acceptedEvents != null) {\n            return acceptedEvents;\n        }\n        return new Pair[] { Pair.of(FlowEventTypes.INIT_END, initEndEventOrder) };\n    }\n\n    @Override\n    public void on(FlowEvent event) {\n        switch (event.getType()) {\n        case FlowEventTypes.INIT_END: {\n            String eventId = event.getContext().getParam().get(FlowConstants.PARAM_DATA_EVENT);\n            if (FlowStringUtil.isNotEmpty(eventId)) {\n                List<NodeContext> startNodes = event.getContext().getStartNodes();\n                if (event.getContext().isLogOn() && logger.isInfoEnabled()) {\n                    logger.info(\"EVENT ID:\" + eventId);\n                }\n                if (startNodes != null && ! startNodes.isEmpty()) {\n                    startNodes.forEach(node -> node.put(FlowConstants.NODE_CONTEXT_DATA_EVENT, eventId));\n                }\n            }\n            break;\n        }\n        default:\n            break;\n        }\n\n    }\n\n    public int getInitEndEventOrder() {\n        return initEndEventOrder;\n    }\n\n    public void setInitEndEventOrder(int initEndEventOrder) {\n        this.initEndEventOrder = initEndEventOrder;\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/event/impl/InterruptFlowListener.java",
    "content": "package com.jd.easyflow.flow.engine.event.impl;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.event.BaseFlowEventListener;\nimport com.jd.easyflow.flow.engine.event.FlowEvent;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.util.FlowConstants;\nimport com.jd.easyflow.flow.util.FlowEventTypes;\nimport com.jd.easyflow.flow.util.FlowUtil;\nimport com.jd.easyflow.flow.util.Pair;\n\n/**\n * Listen node end event, process interrupt scene.\n * @author liyuliang5\n *\n */\npublic class InterruptFlowListener extends BaseFlowEventListener {\n\n    private static final Logger logger = LoggerFactory.getLogger(InterruptFlowListener.class);\n    \n    private static final Pair<String, Integer>[] DEFAULT_ACCEPTED_EVENTS = new Pair[]{Pair.of(FlowEventTypes.NODE_END, FlowConstants.EVENT_ORDER_START)};\n    \n    public InterruptFlowListener() {\n        this.acceptedEvents = DEFAULT_ACCEPTED_EVENTS;\n    }\n    \n    @Override\n    public void on(FlowEvent event) {\n        switch (event.getType()) {\n        case FlowEventTypes.NODE_END: {\n            NodeContext nodeContext = (NodeContext) event.getData();\n            FlowContext context = event.getContext();\n            Boolean interrupt = FlowUtil.nodeProperty(FlowConstants.PROP_INTERRUPT, nodeContext, context);\n            if (interrupt == null) {\n                String interruptExp = FlowUtil.nodeProperty(FlowConstants.PROP_INTERRUPT_EXP, nodeContext, context);\n                if (interruptExp != null) {\n                    interrupt = context.getElEvaluator().eval(interruptExp, nodeContext, context, null);\n                }\n                if (interrupt == null) {\n                    String flowInterruptExp = context.getFlow().getProperty(FlowConstants.PROP_INTERRUPT_EXP);\n                    if (flowInterruptExp != null) {\n                        interrupt = context.getElEvaluator().eval(flowInterruptExp, nodeContext, context, null);\n                    }\n                }\n            }\n            if (logger.isDebugEnabled()) {\n                logger.debug(\"Flow interrupt result:\" + interrupt);\n            }\n            if (Boolean.TRUE.equals(interrupt)) {\n                context.setInterrupted();\n            }\n            break;\n        }\n        default:\n            break;\n        }\n\n    }\n \n    \n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/filter/FlowEngineFilter.java",
    "content": "package com.jd.easyflow.flow.engine.filter;\n\nimport com.jd.easyflow.flow.engine.FlowEngine;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.filter.Filter;\nimport com.jd.easyflow.flow.util.Pair;\n\n/**\n * @author liyuliang5\n */\npublic interface FlowEngineFilter extends Filter<Pair<FlowParam, FlowEngine>, FlowResult> {\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/filter/FlowEngineFilterManager.java",
    "content": "package com.jd.easyflow.flow.engine.filter;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.function.Function;\n\nimport com.jd.easyflow.flow.engine.FlowEngine;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.filter.Filter;\nimport com.jd.easyflow.flow.filter.FilterChain;\nimport com.jd.easyflow.flow.filter.FilterChainImpl;\nimport com.jd.easyflow.flow.model.InitContext;\nimport com.jd.easyflow.flow.util.Pair;\n\n/**\n * @author liyuliang5\n */\npublic class FlowEngineFilterManager {\n\n    protected List<Filter<Pair<FlowParam, FlowEngine>, FlowResult>> filters;\n\n    protected List<Filter<Pair<FlowParam, FlowEngine>, FlowResult>> innerFilters;\n    protected List<Filter<Pair<FlowParam, FlowEngine>, FlowResult>> outerFilters;\n    \n    public void init(InitContext initContext, FlowEngine flowEngine) {\n        if (filters != null) {\n            filters.forEach(filter -> {\n                filter.init(initContext, flowEngine);\n            });\n            refreshFilters();\n        }\n    }\n    \n    public boolean noOuterFilter() {\n        return outerFilters == null || outerFilters.size() == 0;\n    }\n    \n    public FlowResult doOuterFilter(Pair<FlowParam, FlowEngine> p, Function<Pair<FlowParam, FlowEngine>, FlowResult> outerInvoker) {\n        FilterChain<Pair<FlowParam, FlowEngine>, FlowResult> chain = new FilterChainImpl<Pair<FlowParam, FlowEngine>, FlowResult>(outerFilters,\n                outerInvoker);\n        return chain.doFilter(p);\n    }\n    \n    public boolean noInnerFilter() {\n        return innerFilters == null || innerFilters.size() == 0;\n    }\n    \n    public FlowResult doInnerFilter(Pair<FlowParam, FlowEngine> p, Function<Pair<FlowParam, FlowEngine>, FlowResult> innerInvoker) {\n        FilterChain<Pair<FlowParam, FlowEngine>, FlowResult> chain = new FilterChainImpl<Pair<FlowParam, FlowEngine>, FlowResult>(innerFilters,\n                innerInvoker);\n        return chain.doFilter(p);\n    }\n    \n\n    public List<Filter<Pair<FlowParam, FlowEngine>, FlowResult>> getFilters() {\n        return filters;\n    }\n\n    public void setFilters(List<Filter<Pair<FlowParam, FlowEngine>, FlowResult>> filters) {\n        this.filters = filters;\n        refreshFilters();\n    }\n    \n    private void refreshFilters() {\n        if (filters == null) {\n            this.innerFilters = this.outerFilters = null;\n        } else {\n            this.innerFilters = new ArrayList<Filter<Pair<FlowParam, FlowEngine>, FlowResult>>();\n            this.outerFilters = new ArrayList<Filter<Pair<FlowParam, FlowEngine>, FlowResult>>();\n            for (Filter filter : filters) {\n                int filterOrder = filter.getOrder();\n                int pos = 0;\n                if (filterOrder < 0) {\n                    for (; pos < innerFilters.size(); pos++) {\n                        if (((Filter) innerFilters.get(pos)).getOrder() < filterOrder) {\n                            break;\n                        }\n                    }\n                    innerFilters.add(pos, filter);\n                } else {\n                    for (; pos < outerFilters.size(); pos++) {\n                        if (((Filter) outerFilters.get(pos)).getOrder() < filterOrder) {\n                            break;\n                        }\n                    }\n                    outerFilters.add(pos, filter);\n                }\n            }\n        }\n    }\n\n    public List<Filter<Pair<FlowParam, FlowEngine>, FlowResult>> getInnerFilters() {\n        return innerFilters;\n    }\n\n    public List<Filter<Pair<FlowParam, FlowEngine>, FlowResult>> getOuterFilters() {\n        return outerFilters;\n    }\n\n    \n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/filter/impl/BaseFlowEngineFilter.java",
    "content": "package com.jd.easyflow.flow.engine.filter.impl;\n\nimport com.jd.easyflow.flow.engine.FlowEngine;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.filter.FlowEngineFilter;\nimport com.jd.easyflow.flow.filter.BaseFilter;\nimport com.jd.easyflow.flow.util.Pair;\n\n/**\n * @author liyuliang5\n */\npublic abstract class BaseFlowEngineFilter extends BaseFilter<Pair<FlowParam, FlowEngine>, FlowResult> implements FlowEngineFilter {\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/impl/BaseFlowRunner.java",
    "content": "package com.jd.easyflow.flow.engine.impl;\n\nimport java.util.function.Function;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowRunner;\nimport com.jd.easyflow.flow.exception.FlowException;\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.NodeContextAccessor;\nimport com.jd.easyflow.flow.util.FlowEventTypes;\nimport com.jd.easyflow.flow.util.Triple;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic abstract class BaseFlowRunner implements FlowRunner {\n\n    private static final Logger logger = LoggerFactory.getLogger(BaseFlowRunner.class);\n    \n    private Function<Triple<FlowNode, NodeContext, FlowContext>, NodeContext> outerNodeInvoker = p -> invokeNode(p.getLeft(), p.getMiddle(), p.getRight());\n    private Function<Triple<FlowNode, NodeContext, FlowContext>, NodeContext> innerNodeInvoker = p -> p.getLeft().execute(p.getMiddle(), p.getRight());\n    private Function<FlowContext, Boolean> outerFlowPreHandlerInvoker = p -> invokePreHandler(p.getFlow(), p);\n    private Function<FlowContext, Boolean> innerFlowPreHandlerInvoker = p -> p.getFlow().getPreHandler().preHandle(p);\n    private Function<FlowContext, Void> outerFlowPostHandlerInvoker = p -> {invokePostHandler(p.getFlow(), p); return null;};\n    private Function<FlowContext, Void> innerFlowPostHandlerInvoker = p -> {p.getFlow().getPostHandler().postHandle(p); return null;};\n    \n    @Override\n    public void run(FlowContext context) {\n        Flow flow = context.getFlow();\n        flow.triggerEvent(FlowEventTypes.RUN_START, context);\n       if (! executePreHandler(flow, context)) {\n           flow.triggerEvent(FlowEventTypes.RUN_END, context);\n           return;\n       }\n        runNodes((FlowContextImpl) context);\n        executePostHandler(flow, context);\n        flow.triggerEvent(FlowEventTypes.RUN_END, context);\n    }\n\n    /**\n     * Run flow.\n     * \n     * @param context\n     */\n    public abstract void runNodes(FlowContextImpl context);\n\n    protected NodeContext[] runOneNodeAndAddNextNodes(NodeContext currentNode, FlowContextImpl context) {\n        NodeContext[] nextNodes = runOneNode(currentNode, context);\n        if (nextNodes != null) {\n            context.addNodes(nextNodes);\n        }\n        return nextNodes;\n    }\n\n    /**\n     * Run one node.\n     * \n     * @param currentNode\n     * @param context\n     * @param flow\n     * @return next nodes\n     */\n    protected NodeContext[] runOneNode(NodeContext currentNode, FlowContextImpl context) {\n        if (context.isLogOn() && logger.isInfoEnabled()) {\n            logger.info(\"EXECUTE NODE:\" + currentNode.getNodeId());\n        }\n        FlowNode node = context.getFlow().getNode(currentNode.getNodeId());\n        if (node == null) {\n            throw new FlowException(\"Node \" + currentNode.getNodeId() + \" not exists\");\n        }\n        NodeContext[] nextNodes = null;\n        try {\n            currentNode = runNode(node, currentNode, context);\n            // get next nodes\n            nextNodes = currentNode.getNextNodes();\n        } catch (Throwable t) { // NOSONAR\n            NodeContextAccessor.setThrowable(currentNode, t);\n            throw t;\n        } finally {\n            if (nextNodes == null) {\n                ((FlowContextImpl) context).addEndNode(currentNode);\n            }\n        }\n        // print nodes info\n        if (context.isLogOn() && logger.isInfoEnabled()) {\n            if (nextNodes == null || nextNodes.length == 0) {\n                logger.info(\"NEXT NODES:\");\n            } else if (nextNodes.length == 1) {\n                logger.info(\"NEXT NODES:\" + nextNodes[0].getNodeId());\n            } else {\n                StringBuilder builder = new StringBuilder();\n                for (NodeContext n : nextNodes) {\n                    builder.append(n.getNodeId()).append(\",\");\n                }\n                logger.info(\"NEXT NODES:\" + (builder.length() == 0 ? \"\" : builder.substring(0, builder.length() - 1)));\n            }\n        }\n        // Clear previous node to avoid OOM\n        if (!context.isRecordHistory()) {\n            NodeContextAccessor.setPreviousNode(currentNode, null);\n            NodeContextAccessor.setNextNodes(currentNode, null);\n        }\n        return nextNodes;\n    }\n\n    protected NodeContext runNode(FlowNode node, NodeContext currentNode, FlowContextImpl context) {\n        Flow flow = context.getFlow();\n        if (flow.getFilterManager().noOuterNodeFilter()) {\n            return invokeNode(node, currentNode, context);\n        }\n        return flow.getFilterManager().doOuterNodeFilter(Triple.of(node, currentNode, context), outerNodeInvoker);\n\n    }\n\n    private NodeContext invokeNode(FlowNode node, NodeContext currentNode, FlowContext context) {\n        Throwable throwable = null;\n        Flow flow = context.getFlow();\n        try {\n            flow.triggerEvent(FlowEventTypes.NODE_START, currentNode, context, false);\n            // Execute node\n            if (flow.getFilterManager().noInnerNodeFilter()) {\n                currentNode = node.execute(currentNode, context);\n            } else {\n                currentNode = flow.getFilterManager().doInnerNodeFilter(Triple.of(node, currentNode, context), innerNodeInvoker);\n            }\n            flow.triggerEvent(FlowEventTypes.NODE_END, currentNode, context, false);\n            return currentNode;\n        } catch (Throwable t) {// NOSONAR\n            throwable = t;\n            if (context.isLogOn() && logger.isErrorEnabled()) {\n                logger.error(\"Flow node execute exception, Node:\" + currentNode.getNodeId() + \",\" + t.getMessage());\n            } \n            throw t;\n        } finally {\n            NodeContextAccessor.setThrowable(currentNode, throwable);\n            flow.triggerEvent(FlowEventTypes.NODE_COMPLETE, currentNode, context, true);\n        }\n    }\n    \n    \n    private boolean executePreHandler(Flow flow, FlowContext context) {\n        if (flow.getFilterManager().noOuterFlowPreHandlerFilter()) {\n            return invokePreHandler(flow, context);\n        } else {\n            Boolean preResult = flow.getFilterManager().doOuterFlowPreHandlerFilter(context, outerFlowPreHandlerInvoker);\n            ((FlowContextImpl) context).setPreResult(preResult);\n            return preResult == null ? true : preResult;\n        }\n    }\n    \n    private boolean invokePreHandler(Flow flow, FlowContext context) {\n        if (flow.getPreHandler() != null) {\n            flow.triggerEvent(FlowEventTypes.FLOW_PRE_START, context);\n            boolean preResult;\n            if (flow.getFilterManager().noInnerFlowPreHandlerFilter()) {\n                preResult = flow.getPreHandler().preHandle(context);\n            } else {\n                Boolean result = flow.getFilterManager().doInnerFlowPreHandlerFilter(context, innerFlowPreHandlerInvoker);\n                preResult = result == null ? true : result;\n            }\n            ((FlowContextImpl) context).setPreResult(preResult);\n            flow.triggerEvent(FlowEventTypes.FLOW_PRE_END, context);\n        }\n        return context.getPreResult() == null ? true : context.getPreResult();\n    }\n    \n    private void executePostHandler(Flow flow, FlowContext context) {\n        if (flow.getFilterManager().noOuterFlowPostHandlerFilter()) {\n            invokePostHandler(flow, context);\n        } else {\n            flow.getFilterManager().doOuterFlowPostHandlerFilter(context, outerFlowPostHandlerInvoker);\n        }\n    }\n    \n    \n    private void invokePostHandler(Flow flow, FlowContext context) {\n        if (flow.getPostHandler() != null) {\n            flow.triggerEvent(FlowEventTypes.FLOW_POST_START, context);\n            if (flow.getFilterManager().noInnerFlowPostHandlerFilter()) {\n                flow.getPostHandler().postHandle(context);\n            } else {\n                flow.getFilterManager().doInnerFlowPostHandlerFilter(context, innerFlowPostHandlerInvoker); \n            }\n            flow.triggerEvent(FlowEventTypes.FLOW_POST_END, context);\n        }\n    }\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/impl/CoreFlowEngine.java",
    "content": "package com.jd.easyflow.flow.engine.impl;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.util.Arrays;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.function.Function;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.el.ElEvaluator;\nimport com.jd.easyflow.flow.el.ElFactory;\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowEngine;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.FlowRunner;\nimport com.jd.easyflow.flow.engine.event.FlowEventListener;\nimport com.jd.easyflow.flow.engine.event.FlowEventTrigger;\nimport com.jd.easyflow.flow.engine.filter.FlowEngineFilterManager;\nimport com.jd.easyflow.flow.exception.FlowException;\nimport com.jd.easyflow.flow.filter.Filter;\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.parser.FlowParser;\nimport com.jd.easyflow.flow.model.parser.FlowParserImpl;\nimport com.jd.easyflow.flow.util.FlowConstants;\nimport com.jd.easyflow.flow.util.FlowEventTypes;\nimport com.jd.easyflow.flow.util.FlowIOUtil;\nimport com.jd.easyflow.flow.util.JsonUtil;\nimport com.jd.easyflow.flow.util.Pair;\n\n/**\n * \n * @author liyuliang5\n */\npublic abstract class CoreFlowEngine implements FlowEngine {\n\n    public static final Logger logger = LoggerFactory.getLogger(CoreFlowEngine.class);\n\n    protected Map<String, Flow> flowMap = new ConcurrentHashMap<>();\n\n    protected Map<String, String> flowDefinitionMap = new ConcurrentHashMap<String, String>();\n\n    protected FlowEventTrigger eventTrigger = new FlowEventTrigger();\n    \n    protected FlowEngineFilterManager filterManager = new FlowEngineFilterManager();\n\n    protected List<FlowEventListener> listeners;\n\n    protected List<Filter<Pair<FlowParam, FlowEngine>, FlowResult>> filters;\n\n    protected String flowPath;\n\n    protected volatile boolean inited;\n\n    protected FlowRunner defaultFlowRunner = new SingleThreadFlowRunner();\n\n    /**\n     * Default is json definition parser.\n     */\n    protected FlowParser flowParser = new FlowParserImpl();\n\n    protected Map<String, Object> properties = new ConcurrentHashMap<>();\n    \n    protected ElEvaluator elEvaluator;\n    \n    private Function<Pair<FlowParam, FlowEngine>, FlowResult> outerFlowEngineInvoker = p -> invokeFlowEngine(p.getLeft());\n    private Function<Pair<FlowParam, FlowEngine>, FlowResult> innerFlowEngineInvoker = p -> executeFlow(p.getLeft());\n    private Function<FlowContext, FlowResult> outerFlowInvoker = p -> invokeFlow(p);\n    private Function<FlowContext, FlowResult> innerFlowInvoker = p -> {\n        init(p);\n        run(p);\n        return p.getResult();\n    };\n\n    public void init() {\n        if (inited) {\n            return;\n        }\n        if (elEvaluator == null) {\n            elEvaluator = ElFactory.get();\n        }\n        if (flowParser instanceof FlowParserImpl) {\n            ((FlowParserImpl) flowParser).setElEvaluator(elEvaluator);\n        }\n        loadFlow();\n        if (listeners != null) {\n            listeners.forEach(listener -> {\n                eventTrigger.addListener(listener);\n            });\n        }\n        eventTrigger.init(null, null);\n        if (filters != null) {\n            filterManager.setFilters(filters);\n        }\n        filterManager.init(null, null);\n        if (defaultFlowRunner != null) {\n            defaultFlowRunner.init(null, null);\n        }\n        inited = true;\n    }\n\n    protected abstract void loadFlow();\n    \n    protected void loadFlowInputStream(InputStream inputStream) throws IOException  {\n        String flowDefinition = FlowIOUtil.toString(inputStream);\n        List<Flow> flowList = flowParser.parse(flowDefinition);\n        flowDefinitionMap.put(flowList.get(0).getId(), flowDefinition);\n        flowList.forEach(flow -> {\n            if (flowMap.containsKey(flow.getId())) {\n                throw new FlowException(\"Flow \" + flow.getId() + \" exists\");\n            }\n            flowMap.put(flow.getId(), flow);\n        });\n    }\n    \n    \n\n    /**\n     * Start flow engine, exeucte flow.\n     */\n    @Override\n    public FlowResult execute(FlowParam param) {\n        if (! inited) {\n            throw new FlowException(\"Flow engine is not inited. flowId:\" + param.getFlowId());\n        }\n        boolean logOn = (param.getContext() != null && param.getContext().getLogFlag() != null) ? param.getContext().getLogFlag() : (param.getLogFlag() == null || param.getLogFlag());\n        if (logOn && logger.isInfoEnabled()) {\n            logger.info(\"START EXECUTE FLOW, flowId:\" + param.getFlowId() + \" nodeIds:\"\n                    + Arrays.toString(param.getNodeIds()));\n        }\n        if (logOn && logger.isDebugEnabled()) {\n            try {\n                logger.debug(\"Flow param:\" + JsonUtil.toJsonString(param));\n            } catch (Throwable t) {\n                logger.debug(\"Flow param to json string exception:\" + t.getMessage());\n            }\n        }\n        if (filterManager.noOuterFilter()) {\n            return invokeFlowEngine(param);\n        } else {\n            return filterManager.doOuterFilter(Pair.of(param, this), outerFlowEngineInvoker);\n        }\n    }\n\n    protected FlowResult invokeFlowEngine(FlowParam param) {\n        FlowResult result = null;\n        \n        // No flow engine listener scenario\n        if (eventTrigger.getListenerList() == null || eventTrigger.getListenerList().size() == 0) {\n            if (filterManager.noInnerFilter()) {\n                result = executeFlow(param);\n            } else {\n                result = filterManager.doInnerFilter(Pair.of(param, this), innerFlowEngineInvoker);\n            }\n            return result;\n        }\n        \n        // Has flow engine listener scenario\n        Map<String, Object> data = new HashMap<>();\n        data.put(FlowConstants.FLOW_ENGINE_EVENT_DATA_KEY_PARAM, param);\n        data.put(FlowConstants.FLOW_ENGINE_EVENT_DATA_KEY_FLOW_ENGINE, this);\n        try {\n            eventTrigger.triggerEvent(FlowEventTypes.FLOW_ENGINE_START, data, null, false);     \n            if (filterManager.noInnerFilter()) {\n                result = executeFlow(param);\n            } else {\n                result = filterManager.doInnerFilter(Pair.of(param, this), innerFlowEngineInvoker);\n            }\n            data.put(FlowConstants.FLOW_ENGINE_EVENT_DATA_KEY_RESULT, result);\n            eventTrigger.triggerEvent(FlowEventTypes.FLOW_ENGINE_END, data, null, false);\n            return result;\n        } catch (Throwable t) {\n            data.put(FlowConstants.FLOW_ENGINE_EVENT_DATA_KEY_EXCEPTION, t);\n            throw t;\n        } finally {\n            eventTrigger.triggerEvent(FlowEventTypes.FLOW_ENGINE_COMPLETE, data, null, true);\n        }\n    }\n\n    protected FlowResult executeFlow(FlowParam param) {\n        // init flow context\n        FlowContext context = initContext(param);\n        // find flow definition\n        Flow flow = findFlow(context);\n        if (flow == null) {\n            throw new FlowException(\"Flow is null, context flow id:\" + context.getFlowId() + \", param flow id:\" + param.getFlowId());\n        }\n        // set log flag\n        if (context.getLogFlag() == null) {\n            if (param.getLogFlag() != null) {\n                context.setLogFlag(param.getLogFlag());\n            } else {\n                context.setLogFlag(flow.getLogFlag());\n            }\n        }\n        if (context.isLogOn() && logger.isInfoEnabled()) {\n            logger.info(\"EXECUTE FLOW, flowId:\" + flow.getId());\n        }\n        if (flow.getFilterManager().noOuterFilter()) {\n            return invokeFlow(context);\n        } else {\n            return flow.getFilterManager().doOuterFilter(context, outerFlowInvoker);\n        }\n    }\n\n    protected FlowResult invokeFlow(FlowContext context) {\n        Flow flow = context.getFlow();\n        Throwable throwable = null;\n        try {\n            flow.triggerEvent(FlowEventTypes.FLOW_START, context);\n            if (flow.getFilterManager().noInnerFilter()) {\n                init(context);\n                run(context);\n            } else {\n                FlowResult flowResult = flow.getFilterManager().doInnerFilter(context, innerFlowInvoker);\n                context.setResult(flowResult);\n            }\n            flow.triggerEvent(FlowEventTypes.FLOW_END, context);\n            return context.getResult();\n        } catch (Throwable t) { // NOSONAR\n            throwable = t;\n            if (context.isLogOn() && logger.isErrorEnabled()) {\n                logger.error(\"Flow execute exception, Flow:\" + flow.getId() + \",\" + t.getMessage());\n            }\n            throw t;\n        } finally {\n            flow.triggerEvent(FlowEventTypes.FLOW_COMPLETE, throwable, context, true);\n        }\n    }\n\n    protected FlowContext initContext(FlowParam param) {\n        FlowContext context = param.getContext() != null ? param.getContext() : new FlowContextImpl();\n        if (context.getParam() == null) {\n            context.setParam(param);\n        }\n        if (context.getResult() == null) {\n            FlowResult result = new FlowResult();\n            context.setResult(result);\n            result.setContext(context);\n        }\n        if (context.getFlowId() == null) {\n            context.setFlowId(param.getFlowId());\n        }\n        ((FlowContextImpl) context).setFlowEngine(this);\n        if (context.getElEvaluator() == null) {\n            ((FlowContextImpl) context).setElEvaluator(getElEvaluator());\n        }\n        return context;\n    }\n\n    protected void run(FlowContext context) {\n        FlowRunner flowRunner = context.getFlow().getRunner();\n        if (flowRunner == null) {\n            flowRunner = defaultFlowRunner;\n        }\n        flowRunner.run(context);\n    }\n\n    /**\n     * \n     * Find flow definition.\n     *\n     * @return\n     */\n    protected Flow findFlow(FlowContext context) {\n        Flow flow = context.getFlow();\n        if (flow == null) {\n            flow = getFlow(context.getFlowId());\n            if (flow == null) {\n                throw new FlowException(\"Flow \" + context.getFlowId() + \" not exists\");\n            }\n            context.setFlow(flow);\n        }\n        // Exists scenario changing flow id\n        context.setFlowId(flow.getId());\n        return flow;\n    }\n\n    @Override\n    public Flow getFlow(String flowId) {\n        return flowMap.get(flowId);\n    }\n\n    /**\n     * \n     * Init flow context.\n     *\n     * @param param\n     */\n    protected void init(FlowContext context) {\n        context.getFlow().triggerEvent(FlowEventTypes.INIT_START, context);\n        if (context.getStartNodes() == null) {\n            String[] nodeIds = context.getParam().getNodeIds();\n            // If nodeIds is null, using startNodeIds: if is empty array, run empty flow\n            // instance.\n            if (nodeIds == null) {\n                nodeIds = context.getFlow().getStartNodeIds();\n            }\n            if (nodeIds == null) {\n                throw new FlowException(\"no start node\");\n            }\n            NodeContext[] nodes = new NodeContext[nodeIds.length];\n            for (int i = 0; i < nodeIds.length; i++) {\n                nodes[i] = new NodeContext(nodeIds[i]);\n            }\n            ((FlowContextImpl) context).addNodes(nodes);\n            context.setStartNodes(Arrays.asList(nodes));\n        } else {\n            ((FlowContextImpl) context).addNodes(context.getStartNodes().toArray(new NodeContext[context.getStartNodes().size()]));\n        }\n        context.getFlow().triggerEvent(FlowEventTypes.INIT_END, context);\n    }\n    \n    \n\n    public void addFlow(Flow flow) {\n        flowMap.put(flow.getId(), flow);\n    }\n\n    public void destroy() {\n        if (defaultFlowRunner != null) {\n            defaultFlowRunner.destroy();\n        }\n        if (flowMap != null && flowMap.size() > 0) {\n            for (Entry<String, Flow> entry : flowMap.entrySet()) {\n                entry.getValue().destroy();\n            }\n        }\n        this.eventTrigger.destroy();\n        if (this.filters != null) {\n            filters.forEach( filter -> {\n                filter.destroy();\n            });\n        }\n    }\n\n    public String getFlowPath() {\n        return flowPath;\n    }\n\n    public void setFlowPath(String flowPath) {\n        this.flowPath = flowPath;\n    }\n\n\n    public Map<String, Flow> getFlowMap() {\n        return flowMap;\n    }\n\n    public void setFlowMap(Map<String, Flow> flowMap) {\n        this.flowMap = flowMap;\n    }\n\n    public Map<String, String> getFlowDefinitionMap() {\n        return flowDefinitionMap;\n    }\n\n    public void setFlowDefinitionMap(Map<String, String> flowDefinitionMap) {\n        this.flowDefinitionMap = flowDefinitionMap;\n    }\n    \n    public List<Filter<Pair<FlowParam, FlowEngine>, FlowResult>> getFilters() {\n        return filters;\n    }\n\n    public void setFilters(List<Filter<Pair<FlowParam, FlowEngine>, FlowResult>> filters) {\n        this.filters = filters;\n    }\n    \n    public FlowEventTrigger getEventTrigger() {\n        return eventTrigger;\n    }\n\n    public void setEventTrigger(FlowEventTrigger eventTrigger) {\n        this.eventTrigger = eventTrigger;\n    }\n\n    public List<FlowEventListener> getListeners() {\n        return listeners;\n    }\n\n    public void setListeners(List<FlowEventListener> listeners) {\n        this.listeners = listeners;\n    }\n\n    public FlowRunner getDefaultFlowRunner() {\n        return defaultFlowRunner;\n    }\n\n    public void setDefaultFlowRunner(FlowRunner defaultFlowRunner) {\n        this.defaultFlowRunner = defaultFlowRunner;\n    }\n\n    @Override\n    public FlowParser getFlowParser() {\n        return flowParser;\n    }\n\n    public void setFlowParser(FlowParser flowParser) {\n        this.flowParser = flowParser;\n    }\n\n    public boolean isInited() {\n        return inited;\n    }\n\n    public void setInited(boolean inited) {\n        this.inited = inited;\n    }\n\n    public Map<String, Object> getProperties() {\n        return properties;\n    }\n\n    public void setProperties(Map<String, Object> properties) {\n        this.properties = properties;\n    }\n    \n    @Override\n    public <T>T getProperty(String key) {\n        return (T) properties.get(key);\n    }\n    \n    public void setProperty(String key, Object value) {\n        properties.put(key, value);\n    }\n\n    public ElEvaluator getElEvaluator() {\n        return elEvaluator;\n    }\n\n    public void setElEvaluator(ElEvaluator elEvaluator) {\n        this.elEvaluator = elEvaluator;\n    }\n\n    public FlowEngineFilterManager getFilterManager() {\n        return filterManager;\n    }\n\n    public void setFilterManager(FlowEngineFilterManager filterManager) {\n        this.filterManager = filterManager;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/impl/ExpFlowRunner.java",
    "content": "package com.jd.easyflow.flow.engine.impl;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowRunner;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ExpFlowRunner implements FlowRunner{\n    \n    private String exp;\n    \n    public ExpFlowRunner() {\n        \n    }\n    \n    public ExpFlowRunner(String exp) {\n        this.exp = exp;\n    }\n\n    @Override\n    public void run(FlowContext context) {\n        context.getElEvaluator().eval(exp, null, context, null);\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/impl/FlowContextImpl.java",
    "content": "package com.jd.easyflow.flow.engine.impl;\n\nimport java.util.ArrayDeque;\nimport java.util.ArrayList;\nimport java.util.Deque;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport com.fasterxml.jackson.annotation.JsonIgnore;\nimport com.jd.easyflow.flow.el.ElEvaluator;\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowEngine;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.util.FlowConstants;\n\n/**\n * Flow Context.\n * \n * @author liyuliang5\n *\n */\npublic class FlowContextImpl implements FlowContext {\n    /**\n     * Flow id.\n     */\n    private String flowId;\n    /**\n     * Flow definition.\n     */\n    private Flow flow;\n    /**\n     * Flow param.\n     */\n    private FlowParam param;\n    /**\n     * Flow result.\n     */\n    private FlowResult result;\n    /**\n     * Start nodes.\n     */\n    private List<NodeContext> startNodes;\n    /**\n     * End nodes.\n     */\n    private List<NodeContext> endNodes;\n    /**\n     * Node context list waiting execute.\n     */\n    private Deque<NodeContext> nodeStack = new ArrayDeque<NodeContext>();\n\n    /**\n     * Common data map.\n     */\n    private Map<String, Object> data = new ConcurrentHashMap<String, Object>();\n\n    /**\n     * business context\n     */\n    private Object context;\n    \n    /**\n     * Flow engine.\n     */\n    @JsonIgnore\n    private FlowEngine flowEngine;\n\n    /**\n     * interrupted\n     */\n    private volatile boolean interrupted = false;\n    \n    private Boolean preResult;\n    \n    private Boolean logFlag;\n    \n    private ElEvaluator elEvaluator;\n    \n    private Boolean recordHistory;\n    \n    private FlowContext parentContext;\n    \n    private NodeContext parentNodeContext;\n\n    @Override\n    public void put(String key, Object value) {\n        if (value == null) {\n            data.remove(key);\n        } else {\n            data.put(key, value);\n        }\n    }\n\n    @Override\n    public <T> T get(String key) {\n        return (T) data.get(key);\n    }\n\n    @Override\n    public void remove(String key) {\n        data.remove(key);\n    }\n\n    public synchronized void addNodes(NodeContext[] nodes) {\n        for (int i = 0; i < nodes.length; i++) {\n            nodeStack.push(nodes[nodes.length - 1 - i]);\n        }\n    }\n\n    /**\n     * Get next node.\n     */\n    public synchronized NodeContext getNextNode() {\n        if (nodeStack.isEmpty()) {\n            return null;\n        }\n        return nodeStack.pop();\n    }\n\n    @Override\n    public FlowParam getParam() {\n        return param;\n    }\n\n    @Override\n    public void setParam(FlowParam param) {\n        this.param = param;\n    }\n\n    @Override\n    public FlowResult getResult() {\n        return result;\n    }\n\n    @Override\n    public void setResult(FlowResult result) {\n        this.result = result;\n    }\n\n    @Override\n    public String getFlowId() {\n        return flowId;\n    }\n\n    @Override\n    public void setFlowId(String flowId) {\n        this.flowId = flowId;\n    }\n\n    @Override\n    public Flow getFlow() {\n        return flow;\n    }\n\n    @Override\n    public void setFlow(Flow flow) {\n        this.flow = flow;\n    }\n\n    @Override\n    public Map<String, Object> getData() {\n        return data;\n    }\n\n    public void setDataFrom(FlowContext fromContext) {\n        this.data = fromContext.getData();\n    }\n\n    @Override\n    public FlowEngine getFlowEngine() {\n        return flowEngine;\n    }\n\n    public void setFlowEngine(FlowEngine flowEngine) {\n        this.flowEngine = flowEngine;\n    }\n\n    @Override\n    public List<NodeContext> getStartNodes() {\n        return startNodes;\n    }\n\n    @Override\n    public void setStartNodes(List<NodeContext> startNodes) {\n        this.startNodes = startNodes;\n    }\n\n    @Override\n    public List<NodeContext> getEndNodes() {\n        return endNodes;\n    }\n\n    public void setEndNodes(List<NodeContext> endNodes) {\n        this.endNodes = endNodes;\n    }\n\n    public synchronized void addEndNode(NodeContext node) {\n        if (endNodes == null) {\n            endNodes = new ArrayList();\n        }\n        endNodes.add(node);\n    }\n\n    @Override\n    public boolean isInterrupted() {\n        return interrupted;\n    }\n\n    @Override\n    public void setInterrupted() {\n        this.interrupted = true;\n    }\n\n    @Override\n    public Boolean getPreResult() {\n        return preResult;\n    }\n\n    public void setPreResult(Boolean preResult) {\n        this.preResult = preResult;\n    }\n\n    @Override\n    public Boolean getLogFlag() {\n        return logFlag;\n    }\n\n    @Override\n    public void setLogFlag(Boolean logFlag) {\n        this.logFlag = logFlag;\n    }\n    \n    @Override\n    public boolean isLogOn() {\n        return logFlag == null || this.logFlag.booleanValue();\n    }\n\n    @Override\n    public <T>T getContext() {\n        return (T) context;\n    }\n\n    @Override\n    public void setContext(Object context) {\n        this.context = context;\n    }\n\n    @Override\n    public ElEvaluator getElEvaluator() {\n        return elEvaluator;\n    }\n\n    public void setElEvaluator(ElEvaluator elEvaluator) {\n        this.elEvaluator = elEvaluator;\n    }\n\n    @Override\n    public boolean isRecordHistory() {\n        if (recordHistory == null) {\n            recordHistory = ! Boolean.FALSE.equals(flow.getProperty(FlowConstants.FLOW_PROPERTY_RECORD_HISTORY));\n        }\n        return recordHistory;\n    }\n\n    public Boolean getRecordHistory() {\n        return recordHistory;\n    }\n\n    public void setRecordHistory(Boolean recordHistory) {\n        this.recordHistory = recordHistory;\n    }\n\n    @Override\n    public FlowContext getParentContext() {\n        return parentContext;\n    }\n\n    public void setParentContext(FlowContext parentContext) {\n        this.parentContext = parentContext;\n    }\n\n    @Override\n    public NodeContext getParentNodeContext() {\n        return parentNodeContext;\n    }\n\n    public void setParentNodeContext(NodeContext parentNodeContext) {\n        this.parentNodeContext = parentNodeContext;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/impl/FlowEngineImpl.java",
    "content": "package com.jd.easyflow.flow.engine.impl;\n\nimport java.io.IOException;\nimport java.io.InputStream;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.context.ApplicationContext;\nimport org.springframework.context.ApplicationContextAware;\nimport org.springframework.context.SmartLifecycle;\nimport org.springframework.core.io.Resource;\nimport org.springframework.core.io.support.PathMatchingResourcePatternResolver;\n\nimport com.jd.easyflow.flow.el.ElEvaluator;\nimport com.jd.easyflow.flow.el.ElFactory;\nimport com.jd.easyflow.flow.el.SpelEvaluator;\n\n/**\n * FlowEngineImpl. Adding spring integration based on CoreFlowEngine.\n * @author liyuliang5\n *\n */\npublic class FlowEngineImpl extends CoreFlowEngine implements SmartLifecycle, ApplicationContextAware {\n\n    public static final Logger logger = LoggerFactory.getLogger(FlowEngineImpl.class);\n    \n    private ApplicationContext applicationContext;\n    \n    private  int phase = Integer.MIN_VALUE;\n    \n    private boolean autoStartup = true;\n\n    private volatile boolean isRunning = false;\n    \n    @Override\n    public void init() {\n        if (inited) {\n            return;\n        }\n        if (applicationContext != null) {\n            ElEvaluator elEvaluator = ElFactory.get();\n            if (elEvaluator instanceof SpelEvaluator) {\n                SpelEvaluator spelEvaluator = (SpelEvaluator) elEvaluator;\n                if (spelEvaluator.getApplicationContext() == null) {\n                    spelEvaluator.setApplicationContext(applicationContext);\n                }\n            }\n        }\n        super.init();\n        inited = true;\n    }\n\n    protected void loadFlow() {\n        if (flowPath == null) {\n            return;\n        }\n        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();\n        Resource[] resources;\n        String[] flowPaths = flowPath.split(\",\");\n        for (String path : flowPaths) {\n            try {\n                resources = resolver.getResources(path.trim());\n                for (Resource resource : resources) {\n                    if (logger.isInfoEnabled()) {\n                        logger.info(\"Start parsing definition files:\" + resource.getURI());\n                    }\n                    try (InputStream is = resource.getInputStream()) {\n                        loadFlowInputStream(is);\n                    }\n                }\n            } catch (IOException e) {\n                throw new RuntimeException(\"Flow definition file parse exception\", e);\n            }\n        }\n    }\n\n\n    public ApplicationContext getApplicationContext() {\n        return applicationContext;\n    }\n\n    @Override\n    public void setApplicationContext(ApplicationContext applicationContext) {\n        this.applicationContext = applicationContext;\n    }\n\n\n    @Override\n    public void start() {\n        init();\n        isRunning = true;\n    }\n\n    @Override\n    public void stop() {\n        isRunning = false;\n        destroy();\n    }\n    \n    @Override\n    public boolean isAutoStartup() {\n        return autoStartup;\n    }\n    \n    @Override\n    public void stop(Runnable callback) {\n        stop();\n        callback.run();\n    }\n\n    @Override\n    public boolean isRunning() {\n        return isRunning;\n    }\n    \n    @Override\n    public int getPhase() {\n        return phase;\n    }\n\n    public void setPhase(int phase) {\n        this.phase = phase;\n    }\n\n    public void setAutoStartup(boolean autoStartup) {\n        this.autoStartup = autoStartup;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/impl/MultipleThreadFlowRunner.java",
    "content": "package com.jd.easyflow.flow.engine.impl;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.concurrent.CountDownLatch;\nimport java.util.concurrent.Executor;\nimport java.util.concurrent.TimeUnit;\nimport java.util.concurrent.atomic.AtomicInteger;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.exception.FlowException;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.util.ExceptionUtil;\nimport com.jd.easyflow.flow.util.FlowConstants;\n\n/**\n * Multiple thread runner.\n * \n * @author liyuliang5\n * @date 2021/07/26\n */\npublic class MultipleThreadFlowRunner extends BaseFlowRunner {\n\n    private static final Logger logger = LoggerFactory.getLogger(MultipleThreadFlowRunner.class);\n\n    protected static long startId = System.currentTimeMillis();\n\n    protected Executor executor;\n    \n    protected long timeout = 0;\n    \n    protected boolean throwExceptionOnTimeout = false;\n    \n    public MultipleThreadFlowRunner() {\n        \n    }\n    \n    public MultipleThreadFlowRunner(Executor executor, long timeout) {\n        this.executor = executor;\n        this.timeout = timeout;\n    }\n    \n    public MultipleThreadFlowRunner(Executor executor, long timeout, boolean throwExceptionOnTimeout) {\n        this.executor = executor;\n        this.timeout = timeout;\n        this.throwExceptionOnTimeout = throwExceptionOnTimeout;\n    }\n\n    @Override\n    public void runNodes(FlowContextImpl context) {\n        String runId = startId++ + \"\";\n        if (context.isLogOn() && logger.isInfoEnabled()) {\n            logger.info(\"Start running flow node, runId:\" + runId);\n        }\n        CountDownLatch lock = new CountDownLatch(1);\n        AtomicInteger counter = new AtomicInteger();\n        scheduleNodes(context, counter, lock, runId);\n        try {\n            if (timeout == 0) {\n                lock.await();\n            } else {\n                boolean result = lock.await(timeout, TimeUnit.MILLISECONDS);\n                context.put(FlowConstants.FLOW_CTX_MULTI_AWAIT_RESULT, result);\n                if (result == false) {\n                    context.setInterrupted();\n                    if (throwExceptionOnTimeout) {\n                        throw new FlowException(\"flow execution timeout, runId:\" + runId + \", flowId:\" + context.getFlowId());\n                    }\n                }\n            }\n        } catch (InterruptedException e) {\n            throw new FlowException(e);\n        }\n        List<NodeContext> exceptions = context.get(FlowConstants.FLOW_CTX_MULTI_EXCEPTIONS);\n        // Default behavior is throwing first exception.\n        if (exceptions != null && exceptions.size() > 0) {\n            if (context.isLogOn()) {\n                logger.error(\"Flow execute exception\");\n            }\n            Throwable t = exceptions.get(0).get(FlowConstants.NODE_CTX_MULTI_EXCEPTION);\n            throw ExceptionUtil.throwException(t);\n        }\n    }\n\n    protected void scheduleNodes(FlowContextImpl context, AtomicInteger counter, CountDownLatch lock,\n            String runId) {\n        addTaskIfExists(context, counter, lock, runId);\n    }\n\n    /**\n     * Add task.\n     * \n     * @param context\n     * @param executor\n     * @param counter\n     * @param lock\n     */\n    private void addTaskIfExists(FlowContextImpl context, AtomicInteger counter, CountDownLatch lock,\n            String runId) {\n        NodeContext currentNode;\n        while ((currentNode = context.getNextNode()) != null) {\n            final NodeContext finalCurrentNode = currentNode;\n            counter.addAndGet(1);\n            executor.execute(() -> {\n                try {\n                    if (context.isLogOn() && logger.isInfoEnabled()) {\n                        logger.info(\"Start execute flow node:\" + finalCurrentNode.getNodeId() + \", runId:\" + runId);\n                    }\n                    NodeContext[] nextNodes = runOneNode(finalCurrentNode, context);\n                    if (nextNodes != null) {\n                        context.addNodes(nextNodes);\n                    }\n                    if (context.isInterrupted()) {\n                        if (context.isLogOn() && logger.isInfoEnabled()) {\n                            logger.info(\"Flow state is interrupted\");\n                        }\n                        lock.countDown();\n                        return;\n                    }\n                    addTaskIfExists(context, counter, lock, runId);\n                    int count = counter.addAndGet(-1);\n                    if (count == 0) {\n                        lock.countDown();\n                    }\n                } catch (Throwable t) { // NOSONAR\n                    addException(context, finalCurrentNode, t);\n                    if (context.isInterrupted()) {\n                        if (context.isLogOn() && logger.isInfoEnabled()) {\n                            logger.info(\"Flow state is interrupted\");\n                        }\n                        lock.countDown();\n                        return;\n                    }\n                    int count = counter.addAndGet(-1);\n                    if (count == 0) {\n                        lock.countDown();\n                    }\n                }\n            });\n        }\n    }\n\n    /**\n     * Add exception.\n     * \n     * @param context\n     * @param nodeContext\n     * @param t\n     */\n    protected void addException(FlowContext context, NodeContext nodeContext, Throwable t) {\n        synchronized (context) {\n            List<NodeContext> exceptionNodes = context.get(FlowConstants.FLOW_CTX_MULTI_EXCEPTIONS);\n            if (exceptionNodes == null) {\n                exceptionNodes = new ArrayList<NodeContext>();\n                context.put(FlowConstants.FLOW_CTX_MULTI_EXCEPTIONS, exceptionNodes);\n            }\n            nodeContext.put(FlowConstants.NODE_CTX_MULTI_EXCEPTION, t);\n            exceptionNodes.add(nodeContext);\n        }\n    }\n\n    protected void printStackTrace() {\n        StackTraceElement[] stack = Thread.currentThread().getStackTrace();\n        StringBuilder builder = new StringBuilder();\n        for (int i = 0; i < stack.length; i++) {\n            builder.append(stack[i].toString() + \"\\n\");\n        }\n        logger.error(\"Flow execute exception,\\n \" + builder);\n    }\n\n    public Executor getExecutor() {\n        return executor;\n    }\n\n    public void setExecutor(Executor executor) {\n        this.executor = executor;\n    }\n\n    public long getTimeout() {\n        return timeout;\n    }\n\n    public void setTimeout(long timeout) {\n        this.timeout = timeout;\n    }\n\n    public boolean isThrowExceptionOnTimeout() {\n        return throwExceptionOnTimeout;\n    }\n\n    public void setThrowExceptionOnTimeout(boolean throwExceptionOnTimeout) {\n        this.throwExceptionOnTimeout = throwExceptionOnTimeout;\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/impl/ReusableThreadFlowRunner.java",
    "content": "package com.jd.easyflow.flow.engine.impl;\n\nimport java.util.List;\nimport java.util.concurrent.CountDownLatch;\nimport java.util.concurrent.Executor;\nimport java.util.concurrent.atomic.AtomicInteger;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * Reuse thread first.\n * \n * @author liyuliang5\n *\n */\npublic class ReusableThreadFlowRunner extends MultipleThreadFlowRunner {\n\n    private static final Logger logger = LoggerFactory.getLogger(ReusableThreadFlowRunner.class);\n\n    public ReusableThreadFlowRunner() {\n\n    }\n\n    public ReusableThreadFlowRunner(Executor executor, long timeout) {\n        this.executor = executor;\n        this.timeout = timeout;\n    }\n    \n    public ReusableThreadFlowRunner(Executor executor, long timeout, boolean throwExceptionOnTimeout) {\n        this.executor = executor;\n        this.timeout = timeout;\n        this.throwExceptionOnTimeout = throwExceptionOnTimeout;\n    }\n\n    @Override\n    protected void scheduleNodes(FlowContextImpl context, AtomicInteger counter, CountDownLatch lock, String runId) {\n        List<NodeContext> startNodes = context.getStartNodes();\n        if (startNodes.size() == 0) {\n            lock.countDown();\n            return;\n        }\n        counter.addAndGet(startNodes.size());\n        if (timeout == 0) {\n            runNodes(startNodes.toArray(new NodeContext[startNodes.size()]), context, counter, lock, runId);\n        } else {\n            executor.execute(() -> {\n                runNodes(startNodes.toArray(new NodeContext[startNodes.size()]), context, counter, lock, runId);  \n            });\n        }\n    }\n\n    private void runNodes(NodeContext[] nodes, FlowContextImpl context, AtomicInteger counter, CountDownLatch lock,\n            String runId) {\n        while (true) {\n            if (nodes == null || nodes.length == 0) {\n                return;\n            }\n            if (nodes.length > 1) {\n                for (int i = 1; i < nodes.length; i++) {\n                    final NodeContext finalNode = nodes[i];\n                    executor.execute(() -> {\n                        runNodes(new NodeContext[] { finalNode }, context, counter, lock, runId);\n                    });\n                }\n            }\n            NodeContext[] nextNodes = doRunOneNode(nodes[0], context, counter, lock, runId);\n            nodes = nextNodes;\n        }\n    }\n\n    private NodeContext[] doRunOneNode(NodeContext node, FlowContextImpl context, AtomicInteger counter,\n            CountDownLatch lock, String runId) {\n        NodeContext[] nextNodes = null;\n        try {\n            if (context.isLogOn() && logger.isInfoEnabled()) {\n                logger.info(\"Start execute flow node:\" + node.getNodeId() + \", runId:\" + runId);\n            }\n            nextNodes = super.runOneNode(node, context);\n        } catch (Throwable t) { // NOSONAR\n            addException(context, node, t);\n        }\n        if (context.isInterrupted()) {\n            if (context.isLogOn() && logger.isInfoEnabled()) {\n                logger.info(\"Flow state is interrupted\");\n            }\n            lock.countDown();\n            return null;\n        }\n        if (nextNodes != null && nextNodes.length > 0) {\n            counter.addAndGet(nextNodes.length);\n        }\n        int count = counter.addAndGet(-1);\n        if (count == 0) {\n            lock.countDown();\n        }\n        return nextNodes;\n    }\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/engine/impl/SingleThreadFlowRunner.java",
    "content": "package com.jd.easyflow.flow.engine.impl;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * Single thread executor.\n * \n * @author liyuliang5\n * @date 2021/07/25\n */\npublic class SingleThreadFlowRunner extends BaseFlowRunner {\n\n    public static final Logger logger = LoggerFactory.getLogger(SingleThreadFlowRunner.class);\n\n    /**\n     * \n     * DFS.\n     * \n     * @param context\n     */\n    @Override\n    public void runNodes(FlowContextImpl context) {\n        NodeContext currentNode;\n        // Loop execute.\n        while ((currentNode = context.getNextNode()) != null) {\n            if (context.isInterrupted()) {\n                if (context.isLogOn() && logger.isInfoEnabled()) {\n                    logger.info(\"Flow interrupted!\");\n                }\n                break;\n            }\n            NodeContext[] nextNodes = runOneNode(currentNode, context);\n            if (nextNodes != null) {\n                context.addNodes(nextNodes);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/exception/FlowException.java",
    "content": "package com.jd.easyflow.flow.exception;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FlowException extends RuntimeException {\n\n    public FlowException() {\n        \n    }\n    \n    public FlowException(String message) {\n        super(message);\n    }\n    \n    public FlowException(Throwable cause) {\n        super(cause);\n    }\n\n    \n    public FlowException(String message, Throwable cause) {\n        super(message, cause);\n    }\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/filter/BaseFilter.java",
    "content": "package com.jd.easyflow.flow.filter;\n\nimport java.util.Map;\n\n/**\n * \n */\npublic abstract class BaseFilter<T, R> implements Filter<T, R> {\n    \n    protected int order;\n    \n    @Override\n    public int getOrder() {\n        return order;\n    }\n    \n    public void setOrder(int order) {\n        this.order = order;\n    }\n\n    @Override\n    public void postConstruct(Map<String, Object> definition, Map<String, Object> context) {\n        if (definition == null) {\n            return;\n        }\n        Integer order = (Integer) definition.get(\"order\");\n        if (order != null) {\n            this.order = order;\n        }\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/filter/ExpFilter.java",
    "content": "package com.jd.easyflow.flow.filter;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.el.ElEvaluator;\nimport com.jd.easyflow.flow.el.ElFactory;\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowEngine;\nimport com.jd.easyflow.flow.util.JsonUtil;\nimport com.jd.easyflow.flow.util.Pair;\nimport com.jd.easyflow.flow.util.Triple;\n\n/**\n * \n * @author liyuliang5\n *\n * @param <T>\n * @param <R>\n */\npublic class ExpFilter<T, R> extends BaseFilter<T, R> {\n\n    private static final Logger logger = LoggerFactory.getLogger(ExpFilter.class);\n\n    private ElEvaluator elEvaluator;\n\n    private String exp;\n\n    public ExpFilter() {\n\n    }\n\n    public ExpFilter(String exp) {\n        this.exp = exp;\n    }\n\n    @Override\n    public R doFilter(T request, FilterChain<T, R> chain) {\n        Map<String, Object> data = new HashMap<>();\n        data.put(\"request\", request);\n        data.put(\"chain\", chain);\n        if (logger.isDebugEnabled()) {\n            logger.debug(\"EVAL SPEL:\" + exp);\n        }\n        ElEvaluator evaluator = this.elEvaluator;\n        if (evaluator == null) {\n            if (request instanceof FlowContext) {\n                evaluator = ((FlowContext) request).getElEvaluator();\n            } else if (request instanceof Pair) {\n                if (((Pair) request).getRight() instanceof FlowContext) {\n                    evaluator = ((FlowContext) ((Pair) request).getRight()).getElEvaluator();\n                } else if (((Pair) request).getRight() instanceof FlowEngine) {\n                    evaluator = ((FlowEngine) ((Pair) request).getRight()).getElEvaluator();\n                }\n            } else if (request instanceof Triple && ((Triple) request).getRight() instanceof FlowContext) {\n                evaluator = ((FlowContext) ((Triple) request).getRight()).getElEvaluator();\n            }\n        }\n\n        if (evaluator == null) {\n            evaluator = ElFactory.get();\n        }\n        R result = evaluator.evalWithDefaultContext(exp, data, true);\n        if (logger.isDebugEnabled()) {\n            try {\n                logger.debug(\"SPEL RESULT:\" + JsonUtil.toJsonString(result));\n            } catch (Throwable t) {\n                logger.debug(\"SPEL RESULT to json string exception:\" + t.getMessage());\n            }\n        }\n        return result;\n    }\n\n    public String getExp() {\n        return exp;\n    }\n\n    public void setExp(String exp) {\n        this.exp = exp;\n    }\n\n    public ElEvaluator getElEvaluator() {\n        return elEvaluator;\n    }\n\n    public void setElEvaluator(ElEvaluator elEvaluator) {\n        this.elEvaluator = elEvaluator;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/filter/Filter.java",
    "content": "package com.jd.easyflow.flow.filter;\n\nimport com.jd.easyflow.flow.model.FlowLifeCycle;\n\n/**\n * \n * @author liyuliang5\n *\n * @param <T>\n * @param <R>\n */\npublic interface Filter<T,R> extends FlowLifeCycle {\n\n    /**\n     * Do filter.\n     * @param request\n     * @param chain\n     * @return\n     */\n    R doFilter(T request, FilterChain<T, R> chain);\n    \n    /**\n     * \n     * The highest order value has the highest priority. \n     * If order value same, the front configured has higher priority.\n     * DO NOT override this method unless you have requirement and know its behavior.\n     * @return\n     */\n    default int getOrder() {return 0;};\n    \n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/filter/FilterChain.java",
    "content": "package com.jd.easyflow.flow.filter;\n\n/**\n * @author liyuliang5\n * @param <T>\n * @param <R>\n */\npublic interface FilterChain<T, R> {\n\n    public R doFilter(T param);\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/filter/FilterChainImpl.java",
    "content": "package com.jd.easyflow.flow.filter;\n\nimport java.util.List;\nimport java.util.function.Function;\n\n/**\n * \n * @author liyuliang5\n *\n * @param <T>\n * @param <R>\n */\npublic class FilterChainImpl<T, R> implements FilterChain<T, R> {\n\n    private List<Filter<T, R>> filters;\n\n    private Function<T, R> invoker;\n\n    private int pos = -1;\n\n    public FilterChainImpl(List<Filter<T, R>> filters, Function<T, R> invoker) {\n        this.filters = filters;\n        this.invoker = invoker;\n    }\n\n    public R doFilter(T param) {\n        pos++;\n        if (pos < filters.size()) {\n            return filters.get(pos).doFilter(param, this);\n        }\n        return invoker.apply(param);\n    }\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/Flow.java",
    "content": "package com.jd.easyflow.flow.model;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport com.fasterxml.jackson.annotation.JsonIgnore;\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowRunner;\nimport com.jd.easyflow.flow.engine.event.FlowEventTrigger;\nimport com.jd.easyflow.flow.exception.FlowException;\nimport com.jd.easyflow.flow.model.filter.FlowFilterManager;\nimport com.jd.easyflow.flow.model.parser.FlowParser;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class Flow implements FlowLifeCycle {\n\n    public static final String DOLLAR = \"$\";\n\n    private String id;\n\n    private String name;\n\n    private String[] startNodeIds;\n\n    private List<FlowNode> nodeList;\n\n    private Map<String, Object> properties = new ConcurrentHashMap<>();\n\n    private Map<String, FlowNode> nodeMap;\n    /**\n     * relation of node id and index.\n     */\n    private Map<String, Integer> nodeIndexMap;\n    \n    private FlowPreHandler preHandler;\n    \n    private FlowPostHandler postHandler;\n\n    private FlowEventTrigger eventTrigger = new FlowEventTrigger();\n    \n    private FlowFilterManager filterManager = new FlowFilterManager();\n\n    private FlowRunner runner;\n\n    @JsonIgnore\n    private FlowParser flowParser;\n    \n    private Boolean logFlag;\n\n    @Override\n    public void init(InitContext initContext, Object parent) {\n        if (preHandler != null) {\n            preHandler.init(initContext, this);\n        }\n        if (nodeList != null) {\n            for (FlowNode flowNode : nodeList) {\n                flowNode.init(initContext, this);\n            }\n        }\n        if (postHandler != null) {\n            postHandler.init(initContext, this);\n        }\n        \n        eventTrigger.init(initContext, this);\n        filterManager.init(initContext, this);\n        if (runner != null) {\n            runner.init(initContext, this);\n        }\n        \n    }\n    \n    @Override\n    public void destroy() {\n        if (preHandler != null) {\n            preHandler.destroy();\n        }\n        if (nodeList != null) {\n            for (FlowNode flowNode : nodeList) {\n                flowNode.destroy();\n            }\n        }\n        if (postHandler != null) {\n            postHandler.destroy();\n        }\n        \n        eventTrigger.destroy();\n        filterManager.destroy();\n        if (runner != null) {\n            runner.destroy();\n        }\n    }\n\n    public String getId() {\n        return id;\n    }\n\n    public void setId(String id) {\n        this.id = id;\n    }\n\n    public List<FlowNode> getNodeList() {\n        return nodeList;\n    }\n\n    public void initNodeList(List<FlowNode> nodeList) {\n        for (FlowNode node : nodeList) {\n            addNode(node);\n        }\n    }\n\n    public Map<String, Object> getProperties() {\n        return properties;\n    }\n    \n    public void setProperties(Map<String, Object> properties) {\n        this.properties.clear();\n        putProperties(properties);\n    }\n\n    public void putProperties(Map<String, Object> properties) {\n        if (properties == null) {\n            return;\n        }\n        for (Entry<String, Object>  entry : properties.entrySet()) {\n            if (entry.getValue() == null) {\n                this.properties.remove(entry.getKey());\n            } else {\n                this.properties.put(entry.getKey(), entry.getValue());\n            }\n        }\n    }\n\n    public Map<String, FlowNode> getNodeMap() {\n        return nodeMap;\n    }\n\n    public void setProperty(String key, Object value) {\n        if (value == null) {\n            properties.remove(key);\n        } else {\n            properties.put(key, value);\n        }\n    }\n    \n\n    public <T> T getProperty(String key) {\n        return (T) properties.get(key);\n    }\n\n    public void addNode(FlowNode node) {\n        if (node.getId().startsWith(DOLLAR)) {\n            throw new IllegalArgumentException(\"Node ID CANNOT start with $\");\n        }\n        if (this.nodeList == null) {\n            this.nodeList = new ArrayList<>();\n        }\n        if (this.nodeMap == null) {\n            this.nodeMap = new HashMap<>();\n        }\n        if (this.nodeMap.containsKey(node.getId())) {\n            throw new FlowException(\"Node:\" + node.getId() + \" duplicate\");\n        }\n        if (this.nodeIndexMap == null) {\n            this.nodeIndexMap = new HashMap<>();\n        }\n        this.nodeList.add(node);\n        this.nodeMap.put(node.getId(), node);\n        this.nodeIndexMap.put(node.getId(), this.nodeList.size() - 1);\n    }\n    \n    public void setNodeList(List<FlowNode> nodeList) {\n        if (nodeList == null) {\n            this.nodeList = null;\n            this.nodeMap = null;\n            this.nodeIndexMap = null;\n        } else {\n            this.nodeList = nodeList;\n            this.nodeMap = new HashMap<>();\n            this.nodeIndexMap = new HashMap<>();\n            for (FlowNode node : nodeList) {\n                this.nodeMap.put(node.getId(), node);\n                this.nodeIndexMap.put(node.getId(), this.nodeList.size() - 1);\n            }\n        }\n    }\n\n    public FlowNode getNode(String nodeId) {\n        return this.nodeMap.get(nodeId);\n    }\n\n    public int getNodeIndex(String nodeId) {\n        return this.nodeIndexMap.get(nodeId);\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public FlowEventTrigger getEventTrigger() {\n        return eventTrigger;\n    }\n\n    public void setEventTrigger(FlowEventTrigger eventTrigger) {\n        this.eventTrigger = eventTrigger;\n    }\n\n    public void triggerEvent(String eventType, FlowContext context) {\n        this.eventTrigger.triggerEvent(eventType, context);\n    }\n\n    public void triggerEvent(String eventType, Object eventData, FlowContext context, boolean catchThrowable) {\n        this.eventTrigger.triggerEvent(eventType, eventData, context, catchThrowable);\n    }\n\n    public String[] getStartNodeIds() {\n        return startNodeIds;\n    }\n\n    public void setStartNodeIds(String[] startNodeIds) {\n        this.startNodeIds = startNodeIds;\n    }\n    \n    public FlowRunner getRunner() {\n        return runner;\n    }\n\n    public void setRunner(FlowRunner runner) {\n        this.runner = runner;\n    }\n\n    public String stringify() {\n        if (flowParser == null) {\n            return null;\n        }\n        return flowParser.stringify(this);\n    }\n\n    public FlowParser getFlowParser() {\n        return flowParser;\n    }\n\n    public void setFlowParser(FlowParser flowParser) {\n        this.flowParser = flowParser;\n    }\n\n\n    public FlowPreHandler getPreHandler() {\n        return preHandler;\n    }\n\n    public void setPreHandler(FlowPreHandler preHandler) {\n        this.preHandler = preHandler;\n    }\n\n    public FlowPostHandler getPostHandler() {\n        return postHandler;\n    }\n\n    public void setPostHandler(FlowPostHandler postHandler) {\n        this.postHandler = postHandler;\n    }\n\n    public Boolean getLogFlag() {\n        return logFlag;\n    }\n\n    public void setLogFlag(Boolean logFlag) {\n        this.logFlag = logFlag;\n    }\n\n    public FlowFilterManager getFilterManager() {\n        return filterManager;\n    }\n\n    public void setFilterManager(FlowFilterManager filterManager) {\n        this.filterManager = filterManager;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/FlowLifeCycle.java",
    "content": "package com.jd.easyflow.flow.model;\n\nimport java.util.Map;\n\n/**\n * \n * @author liyuliang5\n */\npublic interface FlowLifeCycle {\n\n    /**\n     * Invoked after element constructed on flow parsing, the element SHOULD BE new instance, SHOULD NOT BE singleton or reusable.\n     * @param definition\n     * @param context\n     */\n    default void postConstruct(Map<String, Object> definition, Map<String, Object> context) {}\n\n    /**\n     * Invoked after Flow is constructed,  the element SHOULD BE new instance, SHOULD NOT BE singleton or reusable.\n     * @param initContext\n     * @param parent\n     */\n    default void init(InitContext initContext, Object parent) {}\n    \n    /**\n     * Invoked on FlowEngine destroy,  the element SHOULD BE new instance, SHOULD NOT BE singleton or reusable.\n     */\n    default void destroy() {}\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/FlowNode.java",
    "content": "package com.jd.easyflow.flow.model;\n\nimport java.util.Map;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic interface FlowNode extends FlowLifeCycle {\n\n    /**\n     * Execute node.\n     * @param nodeContext\n     * @param context\n     * @return\n     */\n    NodeContext execute(NodeContext nodeContext, FlowContext context);\n    \n    /**\n     * Get node ID\n     * @return\n     */\n    default String getId() {\n        return null;\n    }\n\n    /**\n     * Get node name.\n     * @return\n     */\n    default String getName() {\n        return null;\n    }\n\n    /**\n     * Get all node properties.\n     * @return\n     */\n    default Map<String, Object> getProperties() {\n        return null;\n    }\n\n    /**\n     * Get property.\n     * @param <T>\n     * @param key\n     * @return\n     */\n    default <T> T getProperty(String key) {\n        Map<String, Object> properties = getProperties();\n        if (properties == null) {\n            return null;\n        }\n        return (T) properties.get(key);\n    }\n    \n    /**\n     * Set property.\n     * @param key\n     * @param value\n     */\n    default void setProperty(String key, Object value) {\n        if (value == null) {\n            getProperties().remove(key);\n        } else {\n            getProperties().put(key, value);\n        }\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/FlowPostHandler.java",
    "content": "package com.jd.easyflow.flow.model;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic interface FlowPostHandler extends FlowLifeCycle {\n\n    void postHandle(FlowContext context);\n    \n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/FlowPreHandler.java",
    "content": "package com.jd.easyflow.flow.model;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic interface FlowPreHandler extends FlowLifeCycle {\n\n    boolean preHandle(FlowContext context);\n    \n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/InitContext.java",
    "content": "package com.jd.easyflow.flow.model;\n\nimport java.util.List;\nimport java.util.Map;\n\nimport com.jd.easyflow.flow.model.parser.FlowParser;\n\n/**\n * Flow node init context.\n * @author liyuliang5\n *\n */\npublic class InitContext {\n\n    private boolean parseEl;\n    \n    private FlowParser flowParser;\n    \n    private List<Flow> flowList;\n    \n    private Map<String, Object> flowDefinitionMap;\n    \n    private Flow flow;\n\n    public boolean isParseEl() {\n        return parseEl;\n    }\n\n    public void setParseEl(boolean parseEl) {\n        this.parseEl = parseEl;\n    }\n\n    public FlowParser getFlowParser() {\n        return flowParser;\n    }\n\n    public void setFlowParser(FlowParser flowParser) {\n        this.flowParser = flowParser;\n    }\n\n    public List<Flow> getFlowList() {\n        return flowList;\n    }\n\n    public void setFlowList(List<Flow> flowList) {\n        this.flowList = flowList;\n    }\n\n    public Map<String, Object> getFlowDefinitionMap() {\n        return flowDefinitionMap;\n    }\n\n    public void setFlowDefinitionMap(Map<String, Object> flowDefinitionMap) {\n        this.flowDefinitionMap = flowDefinitionMap;\n    }\n\n    public Flow getFlow() {\n        return flow;\n    }\n\n    public void setFlow(Flow flow) {\n        this.flow = flow;\n    }\n    \n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/NodeAction.java",
    "content": "package com.jd.easyflow.flow.model;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic interface NodeAction extends FlowLifeCycle {\n    \n    /**\n     * Execute node action.\n     * @param <T>\n     * @param nodeContext\n     * @param context\n     * @return\n     */\n    <T>T execute(NodeContext nodeContext, FlowContext context);\n    \n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/NodeContext.java",
    "content": "package com.jd.easyflow.flow.model;\n\nimport java.io.Serializable;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\n/**\n * \n * Generally setter is not needed for user. Using @see NodeContextAccessor if necessary.\n * @author liyuliang5\n *\n */\npublic class NodeContext implements Serializable {\n\n\n    public NodeContext(String nodeId) {\n        this.nodeId = nodeId;\n    }\n\n    private String nodeId;\n\n    private NodeContext previousNode;\n\n    private NodeContext[] nextNodes;\n\n    private Boolean preResult;\n\n    private Object actionResult;\n\n    private Throwable throwable;\n\n    private volatile Map<String, Object> dataMap;\n    \n    /**\n     * business context\n     */\n    private Object nodeContext;\n\n    public Object getActionResult() {\n        return actionResult;\n    }\n\n    protected void setActionResult(Object actionResult) {\n        this.actionResult = actionResult;\n    }\n\n    public Map<String, Object> getDataMap() {\n        return dataMap;\n    }\n\n    protected void setDataMap(Map<String, Object> dataMap) {\n        this.dataMap = dataMap;\n    }\n\n    public void put(String key, Object value) {\n        if (dataMap == null) {\n            synchronized (this) {\n                if (dataMap == null) {\n                    dataMap = new ConcurrentHashMap<String, Object>();\n                }\n            }\n        }\n        if (value == null) {\n            dataMap.remove(key);\n        } else {\n            dataMap.put(key, value);\n        }\n    }\n\n    public <T> T get(String key) {\n        if (dataMap == null) {\n            return null;\n        }\n        return (T) dataMap.get(key);\n    }\n\n    public void remove(String key) {\n        dataMap.remove(key);\n    }\n\n    protected void setNextNodeIds(String[] nextNodeIds) {\n        if (nextNodeIds == null) {\n            this.nextNodes = null;\n            return;\n        }\n        nextNodes = new NodeContext[nextNodeIds.length];\n        for (int i = 0; i < nextNodeIds.length; i++) {\n            NodeContext nextNode = new NodeContext(nextNodeIds[i]);\n            nextNode.setPreviousNode(this);\n            nextNodes[i] = nextNode;\n        }\n    }\n\n    protected void setNextNodes(NodeContext[] nextNodes) {\n        this.nextNodes = nextNodes;\n        if (nextNodes != null) {\n            for (int i = 0; i < nextNodes.length; i++) {\n                nextNodes[i].setPreviousNode(this);\n            }\n        }\n    }\n\n    public NodeContext[] getNextNodes() {\n        return nextNodes;\n    }\n\n    public String getNodeId() {\n        return nodeId;\n    }\n\n    protected void setNodeId(String nodeId) {\n        this.nodeId = nodeId;\n    }\n\n    public NodeContext getPreviousNode() {\n        return previousNode;\n    }\n\n    protected void setPreviousNode(NodeContext previousNode) {\n        this.previousNode = previousNode;\n    }\n\n    public Throwable getThrowable() {\n        return throwable;\n    }\n\n    protected void setThrowable(Throwable throwable) {\n        this.throwable = throwable;\n    }\n\n    public Boolean getPreResult() {\n        return preResult;\n    }\n\n    protected void setPreResult(Boolean preResult) {\n        this.preResult = preResult;\n    }\n\n    public <T>T getNodeContext() {\n        return (T) nodeContext;\n    }\n\n    public void setNodeContext(Object nodeContext) {\n        this.nodeContext = nodeContext;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/NodeContextAccessor.java",
    "content": "package com.jd.easyflow.flow.model;\n\nimport java.util.Map;\n\n/**\n * @author liyuliang5.\n * Using separate setter to avoid mistake setting.\n * \n */\npublic class NodeContextAccessor {\n\n    public static void setNodeId(NodeContext nodeContext, String nodeId) {\n        nodeContext.setNodeId(nodeId);\n    }\n    \n    public static void setPreResult(NodeContext nodeContext, Boolean preResult) {\n        nodeContext.setPreResult(preResult);\n    }\n    \n    public static void setActionResult(NodeContext nodeContext, Object actionResult) {\n        nodeContext.setActionResult(actionResult);\n    }\n    \n    public static void setNextNodeIds(NodeContext nodeContext, String[] nextNodeIds) {\n        nodeContext.setNextNodeIds(nextNodeIds);\n    }\n    \n    public static void setNextNodes(NodeContext nodeContext, NodeContext[] nextNodes) {\n        nodeContext.setNextNodes(nextNodes);\n    }\n    \n    public static void setPreviousNode(NodeContext nodeContext, NodeContext previousNode) {\n        nodeContext.setPreviousNode(previousNode);\n    }\n    \n    public static void setThrowable(NodeContext nodeContext, Throwable t) {\n        nodeContext.setThrowable(t);\n    }\n    \n    public static void setDataMap(NodeContext nodeContext, Map<String, Object> dataMap) {\n        nodeContext.setDataMap(dataMap);\n    }\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/NodeExecutor.java",
    "content": "package com.jd.easyflow.flow.model;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\n\n/**\n * Executor of node and subcomponent level.\n * @author liyuliang5\n *\n * @param <T>\n */\npublic interface NodeExecutor<T> {\n\n    /**\n     * Execute.\n     * @param nodeContext\n     * @param context\n     * @return\n     */\n\tpublic T execute(NodeContext nodeContext, FlowContext context);\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/NodePostHandler.java",
    "content": "package com.jd.easyflow.flow.model;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\n\n/**\n * Node post handler.\n * @author liyuliang5\n * @date 2021/07/09\n */\npublic interface NodePostHandler extends FlowLifeCycle {\n    \n    /**\n     * Post handle.\n     * @param nodeContext\n     * @param context\n     * @return\n     */\n    public NodeContext[] postHandle(NodeContext nodeContext, FlowContext context);\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/NodePreHandler.java",
    "content": "package com.jd.easyflow.flow.model;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic interface NodePreHandler extends FlowLifeCycle {\n\t\n    /**\n     * Pre handle.\n     * @param nodeContext\n     * @param context\n     * @return\n     */\n\tboolean preHandle(NodeContext nodeContext, FlowContext context);\n\t\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/ActionResultEl.java",
    "content": "package com.jd.easyflow.flow.model.action;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.NodeExecutor;\n\n/**\n * Used for condition create expression.\n * @author liyuliang5\n */\npublic class ActionResultEl implements NodeExecutor<Boolean> {\n\n    public static final String OP_EQ = \"==\";\n    public static final String OP_NEQ = \"!=\";\n\n    private String operator;\n\n    private Object value;\n\n    public ActionResultEl() {\n\n    }\n\n    public ActionResultEl(String operator, Object value) {\n        this.operator = operator;\n        this.value = value;\n    }\n\n    public static ActionResultEl create(String operator, Object value) {\n        ActionResultEl el = new ActionResultEl();\n        el.operator = operator;\n        el.value = value;\n        return el;\n    }\n\n    @Override\n    public Boolean execute(NodeContext nodeContext, FlowContext context) {\n        Object actionResult = nodeContext.getActionResult();\n        switch (operator) {\n        case OP_EQ: \n            return actionResult == value || (actionResult != null && actionResult.equals(value));\n        case OP_NEQ:\n            return actionResult != value && (actionResult == null || ! actionResult.equals(value));\n\n        default: {\n            throw new UnsupportedOperationException(\"Unsupported operator \" + operator);\n        }\n        }\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/CompensateNodeAction.java",
    "content": "package com.jd.easyflow.flow.model.action;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.exception.FlowException;\nimport com.jd.easyflow.flow.filter.Filter;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.InitContext;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.action.compensate.CompensateHelper;\nimport com.jd.easyflow.flow.model.action.compensate.CompensateNodeFilter;\nimport com.jd.easyflow.flow.model.action.compensate.CompensateNodePreHandlerFilter;\nimport com.jd.easyflow.flow.util.FlowConstants;\nimport com.jd.easyflow.flow.util.Pair;\nimport com.jd.easyflow.flow.util.Triple;\n\n/**\n * @author liyuliang5\n */\npublic class CompensateNodeAction implements NodeAction {\n    \n    @Override\n    public <T> T execute(NodeContext nodeContext, FlowContext context) {\n        CompensateHelper.compensate(context);\n        return null;\n    }\n    \n    @Override\n    public void init(InitContext initContext, Object flowNode) {\n        boolean recordHistory = ! Boolean.FALSE.equals(initContext.getFlow().getProperty(FlowConstants.FLOW_PROPERTY_RECORD_HISTORY));\n        if (! recordHistory) {\n            throw new FlowException(\"CompensateNodeAction must record history\");\n        }\n        initNodeFilter(initContext, flowNode);\n        initNodePreHandlerFilter(initContext, flowNode);\n    }\n    \n    private void initNodeFilter(InitContext initContext, Object flowNode) {\n        List<Filter<Triple<FlowNode, NodeContext, FlowContext>, NodeContext>> filters = initContext.getFlow().getFilterManager().getNodeFilters();\n        boolean contains = false;\n        if (filters == null) {\n            filters = new ArrayList<>();\n            initContext.getFlow().getFilterManager().setNodeFilters(filters);\n        }\n        for (Filter filter : filters) {\n            if (filter instanceof CompensateNodeFilter) {\n                contains = true;\n                break;\n            }\n        }\n        if (!contains) {\n            filters.add(0, new CompensateNodeFilter(Integer.MAX_VALUE));\n            initContext.getFlow().getFilterManager().setNodeFilters(filters);\n        }\n    }\n    \n    private void initNodePreHandlerFilter(InitContext initContext, Object flowNode) {\n        List<Filter<Pair<NodeContext, FlowContext>, Boolean>> nodePreHandlerFilters = initContext.getFlow().getFilterManager().getNodePreHandlerFilters();\n        boolean contains = false;\n        if (nodePreHandlerFilters == null) {\n            nodePreHandlerFilters = new ArrayList<>();\n            initContext.getFlow().getFilterManager().setNodePreHandlerFilters(nodePreHandlerFilters);\n        }\n        for (Filter filter : nodePreHandlerFilters) {\n            if (filter instanceof CompensateNodePreHandlerFilter) {\n                contains = true;\n                break;\n            }\n        }\n        if (!contains) {\n            nodePreHandlerFilters.add(0, new CompensateNodePreHandlerFilter(Integer.MAX_VALUE));\n            initContext.getFlow().getFilterManager().setNodePreHandlerFilters(nodePreHandlerFilters);\n        }\n    }\n\n}\n\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/EventNodeAction.java",
    "content": "package com.jd.easyflow.flow.model.action;\n\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.event.FlowEventListener;\nimport com.jd.easyflow.flow.engine.event.impl.EventFlowListener;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.InitContext;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.definition.DefConstants;\nimport com.jd.easyflow.flow.model.parser.param.ActionParseParam;\nimport com.jd.easyflow.flow.util.FlowConstants;\n\n/**\n * Event node action.\n * \n * @author liyuliang5\n *\n */\npublic class EventNodeAction implements NodeAction {\n\n    private static final Logger logger = LoggerFactory.getLogger(EventNodeAction.class);\n    \n    private boolean autoAddEventFlowListener = true;\n    \n    public EventNodeAction() {\n    }\n    \n    public EventNodeAction(boolean autoAddEventFlowListener) {\n        this.autoAddEventFlowListener = autoAddEventFlowListener;\n    }\n\n    @Override\n    public void init(InitContext initContext, Object flowNode) {\n        initEventActionMap(initContext, (FlowNode) flowNode);\n        if (autoAddEventFlowListener) {\n            List<FlowEventListener> listeners = initContext.getFlow().getEventTrigger().getListenerList();\n            boolean exists = false;\n            if (listeners != null) {\n                for (FlowEventListener listener : listeners) {\n                    if (listener instanceof EventFlowListener) {\n                        exists = true;\n                        break;\n                    }\n                }\n            }\n            if (! exists) {\n                logger.info(\"Auto add EventFlowListener\");\n                initContext.getFlow().getEventTrigger().addListener(new EventFlowListener());\n            }\n        }\n        \n    }\n\n    @Override\n    public Object execute(NodeContext nodeContext, FlowContext context) {\n        String event = nodeContext.get(FlowConstants.NODE_CONTEXT_DATA_EVENT);\n        if (context.isLogOn() && logger.isInfoEnabled()) {\n            logger.info(\"Event is:\" + event);\n        }\n        if (event == null) {\n            event = FlowConstants.NONE_EVENT;\n        }\n        Map<String, NodeAction> eventActionMap = context.getFlow().getNode(nodeContext.getNodeId())\n                .getProperty(FlowConstants.PROP_RUNTIME_EVENT_NODE_ACTION_MAP);\n        // For exp scenario\n        if (eventActionMap == null) {\n            InitContext initContext = new InitContext();\n            initContext.setFlowParser(context.getFlowEngine().getFlowParser());\n            initContext.setParseEl(true);\n            initContext.setFlow(context.getFlow());\n            initEventActionMap(initContext, context.getFlow().getNode(nodeContext.getNodeId()));\n            eventActionMap = context.getFlow().getNode(nodeContext.getNodeId())\n                    .getProperty(FlowConstants.PROP_RUNTIME_EVENT_NODE_ACTION_MAP);\n        }\n        NodeAction nodeAction = eventActionMap.get(event);\n        if (nodeAction == null) {\n            if (context.isLogOn() && logger.isInfoEnabled()) {\n                logger.info(\"Event node action is null\");\n            }\n            return null;\n        }\n        return nodeAction.execute(nodeContext, context);\n    }\n\n    private void initEventActionMap(InitContext initContext, FlowNode flowNode) {\n        Map<String, Object> eventActionMap = flowNode.getProperty(FlowConstants.PROP_RUNTIME_EVENT_NODE_ACTION_MAP);\n        if (eventActionMap != null) {\n            return;\n        }\n        eventActionMap = new ConcurrentHashMap<>();\n        Map<String, Object> map = flowNode.getProperty(FlowConstants.NODE_PROP_EVENTS);\n        if (map != null) {\n            for (Entry<String, Object> entry : map.entrySet()) {\n                String event = entry.getKey();\n                Object eventConf = (Object) entry.getValue();\n                Map<String, Object> eventActionConfMap = null;\n                if (eventConf instanceof String) {\n                    eventActionConfMap = new HashMap<>();\n                    eventActionConfMap.put(DefConstants.COMMON_PROP_EXP, (String) eventConf);\n                } else {\n                    Map<String, Object> eventConfMap = (Map<String, Object>) eventConf;\n                    eventActionConfMap = (Map<String, Object>) eventConfMap.get(\"action\");\n                }\n                if (eventActionConfMap != null) {\n                    NodeAction nodeAction = initContext.getFlowParser()\n                            .parseNodeAction(new ActionParseParam(eventActionConfMap, initContext.getFlowList(),\n                                    initContext.isParseEl(), initContext.getFlow(), flowNode));\n                    if (nodeAction != null) {\n                        nodeAction.init(initContext, flowNode);\n                        eventActionMap.put(event, nodeAction);\n                    }\n                }\n            }\n        }\n        flowNode.setProperty(FlowConstants.PROP_RUNTIME_EVENT_NODE_ACTION_MAP, eventActionMap);\n\n\n    }\n\n    public boolean isAutoAddEventFlowListener() {\n        return autoAddEventFlowListener;\n    }\n\n    public void setAutoAddEventFlowListener(boolean autoAddEventFlowListener) {\n        this.autoAddEventFlowListener = autoAddEventFlowListener;\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/ExecutorNodeAction.java",
    "content": "package com.jd.easyflow.flow.model.action;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.NodeExecutor;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ExecutorNodeAction implements NodeAction {\n\n\tprivate NodeExecutor executor;\n\n\tpublic ExecutorNodeAction() {\n\t}\n\n\tpublic ExecutorNodeAction(NodeExecutor executor) {\n\t\tthis.executor = executor;\n\t}\n\n\t@Override\n\tpublic <T> T execute(NodeContext nodeContext, FlowContext context) {\n\t\tObject result = executor.execute(nodeContext, context);\n\t\treturn (T) result;\n\n\t}\n\n\tpublic NodeExecutor getExecutor() {\n\t\treturn executor;\n\t}\n\n\tpublic void setExecutor(NodeExecutor executor) {\n\t\tthis.executor = executor;\n\t}\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/ExpNodeAction.java",
    "content": "package com.jd.easyflow.flow.model.action;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ExpNodeAction implements NodeAction {\n\t\n\tprivate static final Logger logger = LoggerFactory.getLogger(ExpNodeAction.class);\n\t\n    private String exp;\n    \n    public ExpNodeAction() {\n\t}\n    public ExpNodeAction(String exp) {\n    \tthis.exp = exp;\n    }\n\n\t@Override\n\tpublic <T>T execute(NodeContext nodeContext, FlowContext context) {\n\t\tObject result = context.getElEvaluator().eval(exp, nodeContext, context, null);\n\t\treturn (T) result;\n\t}\n\tpublic String getExp() {\n\t\treturn exp;\n\t}\n\tpublic void setExp(String exp) {\n\t\tthis.exp = exp;\n\t}\n\t\n\t\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/FlowNodeAction.java",
    "content": "package com.jd.easyflow.flow.model.action;\n\nimport java.util.List;\nimport java.util.Map;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowEngine;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowContextImpl;\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.InitContext;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.definition.DefConstants;\nimport com.jd.easyflow.flow.model.parser.param.FlowParseParam;\nimport com.jd.easyflow.flow.util.FlowConstants;\n\n/**\n * \n * Sub flow NodeAction.\n * \n * IMPORTANT NOTICE! This class should not be singleton!\n * \n * @author liyuliang5\n * @version 1.0\n * @since 1.0\n */\n\npublic class FlowNodeAction implements NodeAction {\n\n    protected String flowId;\n    protected String[] startNodeIds;\n    protected Boolean inherit;\n    protected Flow flow;\n\n    public FlowNodeAction() {\n        // NOOP\n    }\n\n    public FlowNodeAction(String flowId, String[] startNodeIds, boolean inherit) {\n        this.flowId = flowId;\n        this.startNodeIds = startNodeIds;\n        this.inherit = inherit;\n    }\n\n    @Override\n    public <T> T execute(NodeContext nodeContext, FlowContext context) {\n        FlowEngine engine = context.getFlowEngine();\n        FlowParam param = buildFlowParam(nodeContext, context);\n        FlowResult subResult = engine.execute(param);\n        processFlowResult(subResult, nodeContext, context);\n        return (T) subResult;\n    }\n    \n    protected FlowParam buildFlowParam(NodeContext nodeContext, FlowContext context) {\n        // init param.\n        FlowParam param = new FlowParam();\n        param.setFlowId(flow == null ? flowId : flow.getId());\n        param.setNodeIds(startNodeIds);\n        if (inherit) {\n            param.setParam(context.getParam().getParam());\n            param.setDataMapFrom(context.getParam());\n            param.setLogFlag(context.getParam().getLogFlag());\n        } \n        // init context.\n        FlowContextImpl subContext = new FlowContextImpl();\n        \n        if (inherit) {\n            subContext.setDataFrom(context);\n            subContext.setContext(context.getContext());\n            subContext.setLogFlag(context.getLogFlag());\n            subContext.setElEvaluator(context.getElEvaluator());\n        } else {\n            subContext.put(FlowConstants.CTX_PARENT_CONTEXT, context);\n            subContext.put(FlowConstants.CTX_PARENT_NODE_CONTEXT, nodeContext);\n        }\n        subContext.setParentContext(context);\n        subContext.setParentNodeContext(nodeContext);\n        // init result.\n        FlowResult result = new FlowResult();\n        if (inherit) {\n            result.setResult(context.getResult().getResult());\n            result.setDataMapFrom(context.getResult());\n        }\n        subContext.setFlow(flow);\n        param.setContext(subContext);\n        subContext.setResult(result);\n        return param;\n    }\n    \n    protected void processFlowResult(FlowResult subResult, NodeContext nodeContext, FlowContext context) {\n        if (inherit) {\n            if (subResult != null && subResult.getContext() != null && subResult.getContext().isInterrupted()) {\n                context.setInterrupted();\n            }\n        }\n    }\n\n    public String getFlowId() {\n        return flowId;\n    }\n\n    public void setFlowId(String flowId) {\n        this.flowId = flowId;\n    }\n\n    public String[] getStartNodeIds() {\n        return startNodeIds;\n    }\n\n    public void setStartNodeIds(String[] startNodeIds) {\n        this.startNodeIds = startNodeIds;\n    }\n\n    public boolean isInherit() {\n        return inherit;\n    }\n\n    public void setInherit(boolean inherit) {\n        this.inherit = inherit;\n    }\n\n    @Override\n    public void init(InitContext initContext, Object parent) {\n        FlowNode node = (FlowNode) parent;\n        if (flowId == null) {\n            flowId = node.getProperty(DefConstants.COMMON_PROP_FLOW_ID);\n            if (flowId == null) {\n                Map<String, Object> flowDef = (Map<String, Object>) node.getProperty(DefConstants.COMMON_PROP_FLOW);\n                if (flowDef != null) {\n                    FlowParseParam param = new FlowParseParam();\n                    param.setObjectDefinition(flowDef);\n                    param.setParseEl(initContext.isParseEl());\n                    List<Flow> flowList = initContext.getFlowParser().parse(param);\n                    initContext.getFlowList().addAll(flowList);\n                    Flow subFlow = flowList.get(0);\n                    flowId = subFlow.getId();\n                    flow = subFlow;\n                }\n            }\n        }\n        if (startNodeIds == null) {\n            Object startNodeId = node.getProperty(DefConstants.NODE_ACTION_PROP_START_NODE_ID);\n            if (startNodeId != null) {\n                if (startNodeId instanceof String) {\n                    startNodeIds = new String[] { (String) startNodeId };\n                } else {\n                    startNodeIds = ((List<String>) startNodeId).toArray(new String[] {});\n                }\n            }\n        }\n\n        if (inherit == null) {\n            inherit = node.getProperty(DefConstants.NODE_ACTION_PROP_INHERIT);\n        }\n        if (inherit == null) {\n            inherit = true;\n        }\n    }\n\n    public void setFlow(Flow flow) {\n        this.flow = flow;\n    }\n\n    public Flow getFlow() {\n        return flow;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/InterruptNodeAction.java",
    "content": "package com.jd.easyflow.flow.model.action;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class InterruptNodeAction implements NodeAction {\n\n    @Override\n    public <T> T execute(NodeContext nodeContext, FlowContext context) {\n        context.setInterrupted();\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/LoopNodeAction.java",
    "content": "package com.jd.easyflow.flow.model.action;\n\nimport java.util.Map;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.exception.FlowException;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.InitContext;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.NodeExecutor;\nimport com.jd.easyflow.flow.model.parser.param.ActionParseParam;\n\n/**\n * \n * IMPORTANT NOTICE! This class should not be singleton!\n * @author liyuliang5\n */\npublic class LoopNodeAction implements NodeAction {\n\n    private static final Logger logger = LoggerFactory.getLogger(LoopNodeAction.class);\n\n    // Condition\n    private Boolean testBefore;\n    private String loopConditionExp;\n    private NodeExecutor<Boolean> loopConditionExecutor;  \n\n    // MaxCount\n    private Long loopMaxCount;\n    private String loopMaxCountExp;\n    private NodeExecutor<Long> loopMaxCountExecutor;\n\n    // Action\n    protected NodeAction loopAction;\n    \n    private String loopPreExp;\n    private NodeExecutor<Object> loopPreExecutor;\n\n    private String loopPostExp;\n    private NodeExecutor<Object> loopPostExecutor;\n\n    @Override\n    public <T> T execute(NodeContext nodeContext, FlowContext context) {\n        // compute loop maximum\n        Long maximum = null;\n        if (loopMaxCountExecutor != null) {\n            maximum = loopMaxCountExecutor.execute(nodeContext, context);\n        } else if (loopMaxCountExp != null) {\n            maximum = ((Number) context.getElEvaluator().eval(loopMaxCountExp, nodeContext, context, null)).longValue();\n        } else if (loopMaxCount != null) {\n            maximum = loopMaxCount;\n        }\n        if (context.isLogOn() && logger.isDebugEnabled()) {\n            logger.debug(\"Loop maximum:\" + loopMaxCount);\n        }\n\n        if (maximum == null && loopConditionExp == null && loopConditionExecutor == null) {\n            throw new FlowException(\"Loop maximum and condition can not both be null\");\n        }\n        \n        if (loopPreExecutor != null) {\n            loopPreExecutor.execute(nodeContext, context);\n        } else if (loopPreExp != null) {\n            context.getElEvaluator().eval(loopPreExp, nodeContext, context, null);\n        }\n        \n        for (long i = 0; maximum == null || i < maximum; i++) {\n            nodeContext.put(\"currentLoopIndex\", i);\n            // test before\n            if (testBefore) {\n                if (loopConditionExecutor != null) {\n                    boolean testResult = loopConditionExecutor.execute(nodeContext, context);\n                    if (!testResult) {\n                        break;\n                    }\n                } else if (loopConditionExp != null) {\n                    boolean testResult = context.getElEvaluator().eval(loopConditionExp, nodeContext, context, null);\n                    if (!testResult) {\n                        break;\n                    }\n                }\n            }\n\n            // execute\n            loopAction.execute(nodeContext, context);\n\n            // test after\n            if (!testBefore) {\n                if (loopConditionExecutor != null) {\n                    boolean testResult = loopConditionExecutor.execute(nodeContext, context);\n                    if (!testResult) {\n                        break;\n                    }\n                } else if (loopConditionExp != null) {\n                    boolean testResult = context.getElEvaluator().eval(loopConditionExp, nodeContext, context, null);\n                    if (!testResult) {\n                        break;\n                    }\n                }\n            }\n        }\n        \n        if (loopPostExecutor != null) {\n            loopPostExecutor.execute(nodeContext, context);\n        } else if (loopPostExp != null) {\n            context.getElEvaluator().eval(loopPostExp, nodeContext, context, null);\n        }\n        // result put to NodeContext\n        return null;\n    }\n\n    @Override\n    public void init(InitContext initContext, Object parent) {\n        FlowNode node = (FlowNode) parent;\n        testBefore = node.getProperty(\"loopTestBefore\");\n        if (testBefore == null) {\n            throw new FlowException(\"Test before can not be null\");\n        }\n        loopConditionExp = node.getProperty(\"loopConditionExp\");\n        Map<String, Object> loopConditionExecutorConf = (Map<String, Object>) node\n                .getProperty(\"loopConditionExecutor\");\n        if (loopConditionExecutorConf != null) {\n            String createExp = (String) loopConditionExecutorConf.get(\"createExp\");\n            if (initContext.isParseEl() && createExp != null) {\n                loopConditionExecutor = initContext.getFlowParser().getElEvaluator().evalWithDefaultContext(createExp, initContext, false);\n            }\n        }\n        \n        loopPreExp = node.getProperty(\"loopPreExp\");\n        Map<String, Object> loopPreExecutorConf = (Map<String, Object>) node\n                .getProperty(\"loopPreExecutor\");\n        if (loopPreExecutorConf != null) {\n            String createExp = (String) loopPreExecutorConf.get(\"createExp\");\n            if (initContext.isParseEl() && createExp != null) {\n                loopPreExecutor = initContext.getFlowParser().getElEvaluator().evalWithDefaultContext(createExp, initContext, false);\n            }\n        }        \n\n        loopPostExp = node.getProperty(\"loopPostExp\");\n        Map<String, Object> loopPostExecutorConf = (Map<String, Object>) node\n                .getProperty(\"loopPostExecutor\");\n        if (loopPostExecutorConf != null) {\n            String createExp = (String) loopPostExecutorConf.get(\"createExp\");\n            if (initContext.isParseEl() && createExp != null) {\n                loopPostExecutor = initContext.getFlowParser().getElEvaluator().evalWithDefaultContext(createExp, initContext, false);\n            }\n        }  \n        \n        \n        Object loopMaxCountConf = node.getProperty(\"loopMaxCount\");\n        if (loopMaxCountConf != null) {\n            loopMaxCount = ((Number)loopMaxCountConf).longValue();\n        }\n        loopMaxCountExp = node.getProperty(\"loopMaxCountExp\");\n        Map<String, Object> loopMaxCountExecutorConf = (Map<String, Object>) node.getProperty(\"loopMaxCountExecutor\");\n        if (loopMaxCountExecutorConf != null) {\n            String createExp = (String) loopMaxCountExecutorConf.get(\"createExp\");\n            if (initContext.isParseEl() && createExp != null) {\n                loopMaxCountExecutor = initContext.getFlowParser().getElEvaluator().evalWithDefaultContext(createExp, initContext, false);\n            }\n        }\n        Object loopActionConf = node.getProperty(\"loopAction\");\n        if (loopActionConf != null) {\n            ActionParseParam param = new ActionParseParam(loopActionConf, initContext.getFlowList(),\n                    initContext.isParseEl(), initContext.getFlow(), node);\n            loopAction = initContext.getFlowParser().parseNodeAction(param);\n        }\n        if (loopAction != null) {\n            loopAction.init(initContext, node);\n        }\n        if (initContext.isParseEl()) {\n            if (loopAction == null) {\n                throw new FlowException(\"Loop node action can not be null\");\n            }\n            if (loopMaxCount == null && loopMaxCountExp == null && loopMaxCountExecutor == null && loopConditionExp == null && loopConditionExecutor == null) {\n                throw new FlowException(\"Loop maximum and loop condition can not both be null\");\n            }\n        }\n        \n    }\n\n    public NodeAction getLoopAction() {\n        return loopAction;\n    }\n\n    public void setLoopAction(NodeAction loopAction) {\n        this.loopAction = loopAction;\n    }\n    \n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/ParamExecutorNodeAction.java",
    "content": "package com.jd.easyflow.flow.model.action;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.NodeExecutor;\nimport com.jd.easyflow.flow.util.FlowConstants;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ParamExecutorNodeAction implements NodeAction {\n\n    @Override\n    public <T> T execute(NodeContext nodeContext, FlowContext context) {\n        NodeExecutor<Object> executor = context.getParam().get(FlowConstants.PARAM_ACTION_EXECUTOR);\n        Object result = executor.execute(nodeContext, context);\n        return (T) result;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/compensate/CompensateAction.java",
    "content": "package com.jd.easyflow.flow.model.action.compensate;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * @author liyuliang5\n */\npublic interface CompensateAction  {\n\n    public <T>T compensate(NodeContext nodeContext, FlowContext flowContext);\n    \n}"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/compensate/CompensateFlowFilter.java",
    "content": "package com.jd.easyflow.flow.model.action.compensate;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Set;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.filter.FilterChain;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.filter.impl.BaseFlowFilter;\nimport com.jd.easyflow.flow.util.FlowConstants;\n\n/**\n * @author liyuliang5\n */\npublic class CompensateFlowFilter extends BaseFlowFilter {\n    \n    private static final String CTX_KEY_ORIGINAL_START_NODES = \"_original_start_nodes\";\n    \n    public CompensateFlowFilter() {\n        \n    }\n    \n    public CompensateFlowFilter(int order) {\n        this.order = order;\n    }\n\n    @Override\n    public FlowResult doFilter(FlowContext request, FilterChain<FlowContext, FlowResult> chain) {\n        if (CompensateHelper.isCompensating(request)) {\n            List<NodeContext> originalStartNodes = request.get(CTX_KEY_ORIGINAL_START_NODES);\n            if (originalStartNodes == null) {\n                originalStartNodes = request.getStartNodes();\n                request.put(CTX_KEY_ORIGINAL_START_NODES, originalStartNodes);\n            }\n            Set<NodeContext> unCompensatedNodes = new HashSet<NodeContext>();\n            getUnCompensatedEndNodes(unCompensatedNodes, originalStartNodes);\n            List<NodeContext> startNodes = new ArrayList<NodeContext>();\n            for (NodeContext endNode : unCompensatedNodes) {\n                NodeContext startNode = CompensateHelper.createCompensateNode(endNode);\n                startNodes.add(startNode);\n            }   \n            request.setStartNodes(startNodes);\n        }\n        FlowResult result = chain.doFilter(request);\n        return result;\n    }\n    \n    private void getUnCompensatedEndNodes(Set<NodeContext> nodes, List<NodeContext> flowStartNodes) {\n        if (flowStartNodes == null || flowStartNodes.size() == 0) {\n            return;\n        }\n        for (NodeContext nodeContext : flowStartNodes) {\n            if (Boolean.TRUE.equals(nodeContext.get(FlowConstants.NODECTX_COMPENSATE_NODE_FLAG))) {\n                continue;\n            }\n            if (nodeContext.getNextNodes() == null || nodeContext.getNextNodes().length == 0) {\n                nodes.add(nodeContext);\n                continue;\n            }\n            boolean hasNext = false;\n            for (NodeContext next : nodeContext.getNextNodes()) {\n                if (! Boolean.TRUE.equals(nodeContext.get(FlowConstants.NODECTX_COMPENSATE_NODE_FLAG))) {\n                    hasNext = true;\n                    break;\n                }\n            }\n            if (! hasNext) {\n                nodes.add(nodeContext);\n            } else {\n                getUnCompensatedEndNodes(nodes, Arrays.asList(nodeContext.getNextNodes()));\n            }\n            \n            \n            \n        }\n        \n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/compensate/CompensateFlowParseEventListener.java",
    "content": "package com.jd.easyflow.flow.model.action.compensate;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.filter.Filter;\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.parser.event.FlowParseEvent;\nimport com.jd.easyflow.flow.model.parser.event.FlowParseEventListener;\nimport com.jd.easyflow.flow.model.parser.event.FlowParseEventTypes;\nimport com.jd.easyflow.flow.util.Triple;\n\n/**\n * @author liyuliang5\n */\npublic class CompensateFlowParseEventListener implements FlowParseEventListener {\n\n    @Override\n    public void on(FlowParseEvent event) {\n        switch (event.getType()) {\n        case FlowParseEventTypes.INIT_FLOW_END: {\n            // CompensateNodeFilter\n            Flow flow = event.getFlow();\n            List<Filter<Triple<FlowNode, NodeContext, FlowContext>, NodeContext>> nodeFilters = flow.getFilterManager().getNodeFilters();\n            boolean contains = false;\n            if (nodeFilters == null) {\n                nodeFilters = new ArrayList<>();\n                flow.getFilterManager().setNodeFilters(nodeFilters);\n            }\n            for (Filter filter : nodeFilters) {\n                if (filter instanceof CompensateNodeFilter) {\n                    contains = true;\n                    break;\n                }\n            }\n            if (!contains) {\n                nodeFilters.add(0, new CompensateNodeFilter(Integer.MAX_VALUE));\n                flow.getFilterManager().setNodeFilters(nodeFilters);\n            }\n            \n            // CompensateFlowFilter\n            List<Filter<FlowContext, FlowResult>> filters = flow.getFilterManager().getFilters();\n            contains = false;\n            if (filters == null) {\n                filters = new ArrayList<>();\n                flow.getFilterManager().setFilters(filters);\n            }\n            for (Filter filter : filters) {\n                if (filter instanceof CompensateFlowFilter) {\n                    contains = true;\n                    break;\n                }\n            }\n            if (!contains) {\n                filters.add(0, new CompensateFlowFilter(Integer.MAX_VALUE));\n                flow.getFilterManager().setFilters(filters);\n            }            \n            \n        }\n        }\n\n    }\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/compensate/CompensateHelper.java",
    "content": "package com.jd.easyflow.flow.model.action.compensate;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.util.FlowConstants;\n\n/**\n * Unstable!!! Only for memory model!!!\n * @author liyuliang5\n */\npublic class CompensateHelper {\n    \n    private static final String FLOW_CONTEXT_COMPENSATE_FLAG = \"_compensateFlag\";\n    static final String FLOW_CONTEXT_COMPENSATE_END_NODES_FLAG = \"_compensateEndNodesFlag\";\n\n    \n    static final String NODE_CONTEXT_COMPENSATING_FLAG = \"_compensatingFlag\";\n\n    public static void compensate(FlowContext context) {\n        context.put(FLOW_CONTEXT_COMPENSATE_FLAG, true);\n    }\n    \n    public static boolean isCompensating(FlowContext context) {\n        return Boolean.TRUE.equals(context.get(FLOW_CONTEXT_COMPENSATE_FLAG));\n    }\n    \n    \n    public static NodeContext createCompensateNode(NodeContext nodeContext) {\n        NodeContext nodeCtx = new NodeContext(nodeContext.getNodeId());\n        nodeCtx.put(FlowConstants.NODECTX_COMPENSATE_NODE_FLAG, true);\n        nodeCtx.put(FlowConstants.NODECTX_COMPENSATE_FOR, nodeContext);\n        nodeContext.put(FlowConstants.NODECTX_COMPENSATED_BY, nodeCtx);\n        return nodeCtx;\n    }\n    \n    public static FlowResult compensateFlow(FlowContext context) {\n        FlowParam compensateParam = new FlowParam();\n        CompensateHelper.compensate(context);\n        compensateParam.setContext(context);\n        FlowResult compensateResult = context.getFlowEngine().execute(compensateParam);\n        return compensateResult;\n    }\n    \n    \n}"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/compensate/CompensateNodeFilter.java",
    "content": "package com.jd.easyflow.flow.model.action.compensate;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Set;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.filter.FilterChain;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.NodeContextAccessor;\nimport com.jd.easyflow.flow.model.filter.impl.BaseNodeFilter;\nimport com.jd.easyflow.flow.model.node.NodeImpl;\nimport com.jd.easyflow.flow.util.FlowConstants;\nimport com.jd.easyflow.flow.util.LockUtil;\nimport com.jd.easyflow.flow.util.Triple;\n\n/**\n * @author liyuliang5\n */\npublic class CompensateNodeFilter extends BaseNodeFilter {\n\n    private static final Logger logger = LoggerFactory.getLogger(CompensateNodeFilter.class);\n    \n    private static final String CTX_COMENSATED_END_NODES_LOCK_KEY = \"_compensated_end_nodes_lock\";\n    private static final String NODE_CTX_COMENSATING_LOCK_KEY = \"_compensating_lock\";\n\n        \n    public CompensateNodeFilter() {\n        \n    }\n    \n    public CompensateNodeFilter(int order) {\n        this.order = order;\n    }\n\n    @Override\n    public NodeContext doFilter(Triple<FlowNode, NodeContext, FlowContext> request,\n            FilterChain<Triple<FlowNode, NodeContext, FlowContext>, NodeContext> chain) {\n        FlowContext context = request.getRight();\n        NodeContext nodeContext = request.getMiddle();\n        if (! Boolean.TRUE.equals(nodeContext.get(FlowConstants.NODECTX_COMPENSATE_NODE_FLAG))) {\n            // Normal scenario.\n            NodeContext newNodeContext = chain.doFilter(request);\n            if (CompensateHelper.isCompensating(context)) {\n                // post to previous node.\n                List<NodeContext> compensatedNextNodes = new ArrayList<NodeContext>();\n                // current node previous nodes.\n                compensatedNextNodes.add(CompensateHelper.createCompensateNode(newNodeContext));\n                \n                if (!Boolean.TRUE.equals(context.get(CompensateHelper.FLOW_CONTEXT_COMPENSATE_END_NODES_FLAG))) {\n                    Object lockObj = LockUtil.getFlowContextLock(CTX_COMENSATED_END_NODES_LOCK_KEY, context);\n                    synchronized (lockObj) {\n                        // add end nodes.\n                        if (!Boolean.TRUE.equals(context.get(CompensateHelper.FLOW_CONTEXT_COMPENSATE_END_NODES_FLAG))) {\n                            Set<NodeContext> endNodes = new HashSet<NodeContext>();\n                            getEndNodes(context.getStartNodes().toArray(new NodeContext[context.getStartNodes().size()]), endNodes);\n                            for (NodeContext endNode : endNodes) {\n                                compensatedNextNodes.add(CompensateHelper.createCompensateNode(endNode));\n                            }\n                            context.put(CompensateHelper.FLOW_CONTEXT_COMPENSATE_END_NODES_FLAG, true);\n                        }\n                        NodeContextAccessor.setNextNodes(newNodeContext,\n                                compensatedNextNodes.toArray(new NodeContext[compensatedNextNodes.size()]));\n                    }\n                }\n            }\n            newNodeContext.put(CompensateNodeFilter.class.getName(), true);\n            return newNodeContext; \n        } else {\n            // Compensate scenario.\n            NodeImpl nodeImpl = (NodeImpl) context.getFlow().getNode(nodeContext.getNodeId());\n            NodeContext originNodeCtx = nodeContext.get(FlowConstants.NODECTX_COMPENSATE_FOR);\n            Object lockObj = LockUtil.getNodeContextLock(NODE_CTX_COMENSATING_LOCK_KEY, originNodeCtx);\n            synchronized (lockObj) {\n                // Judge compensate\n                if (Boolean.TRUE.equals(originNodeCtx.get(CompensateHelper.NODE_CONTEXT_COMPENSATING_FLAG))) {\n                    if (context.isLogOn() && logger.isInfoEnabled()) {\n                        logger.info(\"Node:\" + originNodeCtx.getNodeId() + \"has been compensated, return\");\n                    }\n                    return nodeContext;\n                }\n                \n                List<NodeContext> originNextNodes = originNodeCtx.get(FlowConstants.NODECTX_NEXT_NODES);\n                if (originNextNodes == null && originNodeCtx.getNextNodes() != null) {\n                    originNextNodes = Arrays.asList(originNodeCtx.getNextNodes());\n                }\n                if (originNextNodes != null && originNextNodes.size() > 0) {\n                    String notCompensated = null;\n                    for (NodeContext next : originNextNodes) {\n                        if (Boolean.TRUE.equals(next.get(FlowConstants.NODECTX_COMPENSATE_NODE_FLAG))) {\n                            continue;\n                        }\n                        if (!Boolean.TRUE.equals(next.get(FlowConstants.NODECTX_COMPENSATED_FLAG))) {\n                            notCompensated = next.getNodeId();\n                            break;\n                        }\n                    }\n                    if (notCompensated != null) {\n                        if (context.isLogOn() && logger.isInfoEnabled()) {\n                            logger.info(\"Next nodes of \" + originNodeCtx.getNodeId() + \" not all compensated:\" + notCompensated);\n                        }\n                        return nodeContext;\n                    }\n                }\n                originNodeCtx.put(CompensateHelper.NODE_CONTEXT_COMPENSATING_FLAG, true);\n            }\n                \n            // Execute compensate action\n            if (Boolean.FALSE.equals(originNodeCtx.getPreResult())) {\n                if (context.isLogOn() && logger.isInfoEnabled()) {\n                    logger.info(\"Node:\" + originNodeCtx.getNodeId() + \" pre result is false, skip compensate action.\");\n                }\n            } else {\n                NodeAction nodeAction = nodeImpl.getAction();\n                Object compensateResult = null;\n                NodeAction compensateNodeAction = (NodeAction) nodeImpl\n                        .getProperty(FlowConstants.PROP_RUNTIME_COMPENSATE_ACTION);\n                if (compensateNodeAction != null) {\n                    if (context.isLogOn() && logger.isInfoEnabled()) {\n                        logger.info(\"Compensate using NodeAction:\" + compensateNodeAction.getClass());\n                    }\n                    compensateResult = compensateNodeAction.execute(nodeContext, context);\n                } else if (nodeAction instanceof CompensateAction) {\n                    if (context.isLogOn() && logger.isInfoEnabled()) {\n                        logger.info(\"Compensate using CompensateAction\");\n                    }\n                    compensateResult = ((CompensateAction) nodeAction).compensate(nodeContext, context);\n                }\n                NodeContextAccessor.setActionResult(nodeContext, compensateResult);\n            }\n\n            originNodeCtx.put(FlowConstants.NODECTX_COMPENSATED_FLAG, true);\n\n            // post to previous node.\n            List<NodeContext> previousList = originNodeCtx.get(FlowConstants.NODECTX_PREVIOUS_NODES);\n            if (previousList != null) {\n                // MultiCheck and InclusiveCheck\n                if (previousList.size() == 0) {\n                    NodeContextAccessor.setNextNodes(nodeContext, null);\n                } else {\n                    NodeContext[] previouses = new NodeContext[previousList.size()];\n                    for (int i = 0; i < previousList.size(); i++) {\n                        previouses[i] = CompensateHelper.createCompensateNode(previousList.get(i));\n                    }\n                    NodeContextAccessor.setNextNodes(nodeContext, previouses);\n                }\n            } else if (originNodeCtx.getPreviousNode() != null) {\n                NodeContextAccessor.setNextNodes(nodeContext,\n                        new NodeContext[] { CompensateHelper.createCompensateNode(originNodeCtx.getPreviousNode()) });\n            } else {\n                NodeContextAccessor.setNextNodes(nodeContext, null);\n            }\n            return nodeContext;\n        } \n    }\n\n\n    private void getEndNodes(NodeContext[] nodes, Set<NodeContext> result) {\n        if (nodes == null || nodes.length == 0) {\n            return;\n        }\n        for (NodeContext node : nodes) {\n            if (!Boolean.TRUE.equals(node.get(CompensateNodeFilter.class.getName()))) {\n                continue;\n            }\n            if (node.getNextNodes() == null || node.getNextNodes().length == 0) {\n                result.add(node);\n            } else {\n                getEndNodes(node.getNextNodes(), result);\n            }\n        }\n    }\n  \n}"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/compensate/CompensateNodePreHandlerFilter.java",
    "content": "package com.jd.easyflow.flow.model.action.compensate;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.filter.FilterChain;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.filter.impl.BaseNodePreHandlerFilter;\nimport com.jd.easyflow.flow.util.Pair;\n\n/**\n * @author liyuliang5\n */\npublic class CompensateNodePreHandlerFilter extends BaseNodePreHandlerFilter {\n    \n    private static final Logger logger = LoggerFactory.getLogger(CompensateNodePreHandlerFilter.class);\n    \n    public CompensateNodePreHandlerFilter() {\n        \n    }\n    \n    public CompensateNodePreHandlerFilter(int order) {\n        this.order = order;\n    }\n\n    @Override\n    public Boolean doFilter(Pair<NodeContext, FlowContext> request,\n            FilterChain<Pair<NodeContext, FlowContext>, Boolean> chain) {\n        Boolean result = chain.doFilter(request);\n        if (CompensateHelper.isCompensating(request.getRight())) {\n            if (request.getRight().isLogOn() && logger.isInfoEnabled()) {\n                logger.info(\"Compensating, NodePreHandler return false, node:\" + request.getLeft().getNodeId());\n            }\n            return false;\n        } else {\n            return result;\n        }\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/action/compensate/FlowCompensateAction.java",
    "content": "package com.jd.easyflow.flow.model.action.compensate;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * @author liyuliang5\n */\npublic class FlowCompensateAction implements NodeAction {\n\n    @Override\n    public FlowResult execute(NodeContext nodeContext, FlowContext context) {\n        FlowResult result = (FlowResult) nodeContext.getActionResult();\n        FlowParam param = new FlowParam();\n        param.setContext(result.getContext());\n        CompensateHelper.compensate(result.getContext());\n        FlowResult compensateResult = context.getFlowEngine().execute(param);\n        return compensateResult;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/builder/FlowBuilder.java",
    "content": "package com.jd.easyflow.flow.model.builder;\n\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.FlowPostHandler;\nimport com.jd.easyflow.flow.model.FlowPreHandler;\nimport com.jd.easyflow.flow.model.InitContext;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodePostHandler;\nimport com.jd.easyflow.flow.model.node.NodeImpl;\nimport com.jd.easyflow.flow.model.parser.FlowParser;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FlowBuilder {\n\n\tprivate Flow flow;\n\n\tpublic static FlowBuilder create(String id, String name) {\n\t\tFlow flow = new Flow();\n\t\tflow.setId(id);\n\t\tflow.setName(name);\n\t\tFlowBuilder builder = new FlowBuilder();\n\t\tbuilder.flow = flow;\n\t\treturn builder;\n\t}\n\n\tpublic FlowBuilder setProperty(String key, Object value) {\n\t\tflow.setProperty(key, value);\n\t\treturn this;\n\t}\n\t\n\tpublic FlowBuilder addNode(String nodeId, NodeAction action) {\n\t\treturn addNode(nodeId, action, null);\n\t}\n\n\tpublic FlowBuilder addNode(String nodeId, NodeAction action, NodePostHandler postHandler) {\n\t\tNodeImpl node = new NodeImpl();\n\t\tnode.setId(nodeId);\n\t\tnode.setAction(action);\n\t\tnode.setPostHandler(postHandler);\n\t\tflow.addNode(node);\n\t\treturn this;\n\t}\n\t\n\tpublic FlowBuilder addNode(FlowNode node) {\n        flow.addNode(node);\n        return this;\n    }\n\t\n    public FlowBuilder setStartNodeId(String startNodeId) {\n        flow.setStartNodeIds(new String[] {startNodeId});\n        return this;\n    }\n\t\n    public FlowBuilder setStartNodeIds(String[] startNodeIds) {\n        flow.setStartNodeIds(startNodeIds);\n        return this;\n    }\n    \n    public FlowBuilder setFlowPreHandler(FlowPreHandler preHandler) {\n        flow.setPreHandler(preHandler);\n        return this;\n    }\n    \n    public FlowBuilder setFlowPostHandler(FlowPostHandler postHandler) {\n        flow.setPostHandler(postHandler);\n        return this;\n    }\n    \n    \n\n\tpublic Flow build() {\n\t\treturn flow;\n\t}\n\t\n\tpublic Flow buildAndInit() {\n\t    InitContext initContext = new InitContext();\n        initContext.setFlowParser(null);\n        initContext.setParseEl(true);\n        initContext.setFlowList(null);\n        initContext.setFlowDefinitionMap(null);\n        initContext.setFlow(flow);\n\t    flow.init(initContext, null);\n\t    return flow;\n\t}\n\t\n    public Flow buildAndInit(FlowParser flowParser) {\n        InitContext initContext = new InitContext();\n        initContext.setFlowParser(flowParser);\n        initContext.setParseEl(true);\n        initContext.setFlowList(null);\n        initContext.setFlowDefinitionMap(null);\n        initContext.setFlow(flow);\n        flow.init(initContext, null);\n        return flow;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/definition/DefConstants.java",
    "content": "package com.jd.easyflow.flow.model.definition;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class DefConstants {\n\n    public static final String COMMON_PROP_ID = \"id\";\n    public static final String COMMON_PROP_NAME = \"name\";\n    public static final String COMMON_PROP_EXP = \"exp\";\n    public static final String COMMON_PROP_FLOW = \"flow\";\n    public static final String COMMON_PROP_FLOW_ID = \"flowId\";\n    public static final String COMMON_PROP_CREATE_EXP = \"createExp\";\n    public static final String COMMON_PROP_PROPERTIES = \"properties\";\n    public static final String COMMON_PROP_CREATE = \"create\";\n    public static final String COMMON_PROP_TYPE = \"type\";\n    \n    public static final String FLOW_PROP_PARSE_LISTENERS = \"parseListeners\";\n\n    \n    public static final String FLOW_PROP_PRE = \"pre\";\n    public static final String FLOW_PROP_POST = \"post\";\n    public static final String FLOW_PROP_NODES = \"nodes\";\n    public static final String FLOW_PROP_LISTENERS = \"listeners\";\n    public static final String FLOW_PROP_FILTERS = \"filters\";\n    public static final String FLOW_PROP_NODE_FILTERS = \"nodeFilters\";\n    public static final String FLOW_PROP_NODE_PRE_HANDLER_FILTERS = \"nodePreHandlerFilters\";\n    public static final String FLOW_PROP_NODE_ACTION_FILTERS = \"nodeActionFilters\";\n    public static final String FLOW_PROP_NODE_POST_HANDLER_FILTERS = \"nodePostHandlerFilters\";\n    public static final String FLOW_PROP_FLOW_PRE_HANDLER_FILTERS = \"flowPreHandlerFilters\";\n    public static final String FLOW_PROP_FLOW_POST_HANDLER_FILTERS = \"flowPostHandlerFilters\";\n\n    public static final String FLOW_PROP_RUNNER = \"runner\";\n    public static final String FLOW_PROP_LOG_FLAG = \"logFlag\";\n    \n    // Node property\n    \n    public static final String NODE_PROP_START = \"start\";\n    \n    public static final String NODE_PROPERTIES_PROP_END = \"end\";\n\n    public static final String NODE_PROP_ACTION = \"action\";\n    public static final String NODE_PROP_PRE = \"pre\";\n    public static final String NODE_PROP_POST = \"post\";\n    \n    public static final String NODE_PROPERTIES_PROP_PRE_NODES = \"preNodes\";\n    public static final String NODE_PROPERTIES_PROP_COMPENSATE_ACTION = \"compensateAction\";\n    \n    /**\n     * Node pre property\n     */\n    public static final String NODE_PRE_TYPE_MULTICHECK = \"multiCheck\";\n    public static final String NODE_PRE_TYPE_INCLUSIVECHECK = \"inclusiveCheck\";\n    public static final String NODE_PRE_PROP_PRE_NODES = \"preNodes\";\n\n    \n    /**\n     * Node action property\n     */\n    public static final String NODE_ACTION_TYPE_EVENT = \"event\";\n    public static final String NODE_ACTION_TYPE_FLOW = \"flow\";\n    public static final String NODE_ACTION_TYPE_INTERRUPT = \"interrupt\";\n    public static final String NODE_ACTION_TYPE_COMPENSATE = \"compensate\";\n    public static final String NODE_ACTION_TYPE_LOOP = \"loop\";\n    public static final String NODE_ACTION_TYPE_PARAM_EXECUTOR = \"paramExecutor\";\n    public static final String NODE_ACTION_PROP_START_NODE_ID = \"startNodeId\";\n    public static final String NODE_ACTION_PROP_INHERIT = \"inherit\";\n\n    \n    /**\n     * Node post property\n     */\n    public static final String NODE_POST_TYPE_CONDITION = \"condition\";\n    public static final String NODE_POST_TYPE_EVENT = \"event\";\n    public static final String NODE_POST_PROP_CONDITIONS = \"conditions\";\n    public static final String NODE_POST_PROP_WHEN = \"when\";\n    public static final String NODE_POST_PROP_TO = \"to\";\n    public static final String NODE_POST_TYPE_FIXED = \"fixed\";\n    public static final String NODE_POST_PROP_CONDITION_TYPE = \"conditionType\";\n    public static final String NODE_POST_PROP_DEFAULT_TO = \"defaultTo\";\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/filter/FlowFilter.java",
    "content": "package com.jd.easyflow.flow.model.filter;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.filter.Filter;\n\n/**\n * @author liyuliang5\n */\npublic interface FlowFilter extends Filter<FlowContext, FlowResult> {\n    \n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/filter/FlowFilterManager.java",
    "content": "package com.jd.easyflow.flow.model.filter;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.function.Function;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.filter.Filter;\nimport com.jd.easyflow.flow.filter.FilterChain;\nimport com.jd.easyflow.flow.filter.FilterChainImpl;\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.InitContext;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.util.Pair;\nimport com.jd.easyflow.flow.util.Triple;\n\n/**\n * @author liyuliang5\n */\npublic class FlowFilterManager {\n    \n\n    private List<Filter<FlowContext, FlowResult>> filters;\n\n    private List<Filter<Triple<FlowNode, NodeContext, FlowContext>, NodeContext>> nodeFilters;\n\n    /**\n     * nodeAction is not standard model. define here for performance.\n     */\n    private List<Filter<Pair<NodeContext, FlowContext>, Object>> nodeActionFilters;\n\n    /**\n     * nodePreHandler is not standard model. define here for performance.\n     */\n    private List<Filter<Pair<NodeContext, FlowContext>, Boolean>> nodePreHandlerFilters;\n\n    /**\n     * nodePostHandler is not standard model. define here for performance.\n     */\n    private List<Filter<Pair<NodeContext, FlowContext>, NodeContext[]>> nodePostHandlerFilters;\n    \n    private List<Filter<FlowContext, Boolean>> flowPreHandlerFilters;\n    \n    private List<Filter<FlowContext, Void>> flowPostHandlerFilters;\n    \n    public void init(InitContext initContext, Flow flow) {\n        if (filters != null) {\n            for (Filter filter: filters) {\n                filter.init(initContext, flow);\n            }\n            refreshFilters();\n        }\n        if (nodeFilters != null) {\n            for (Filter filter: nodeFilters) {\n                filter.init(initContext, flow);\n            }\n            refreshNodeFilters();\n        }\n        if (nodeActionFilters != null) {\n            for (Filter filter: nodeActionFilters) {\n                filter.init(initContext, flow);\n            }\n            refreshNodeActionFilters();\n        }\n        if (nodePreHandlerFilters != null) {\n            for (Filter filter: nodePreHandlerFilters) {\n                filter.init(initContext, flow);\n            }\n            refreshNodePreHandlerFilters();\n        }\n        if (nodePostHandlerFilters != null) {\n            for (Filter filter: nodePostHandlerFilters) {\n                filter.init(initContext, flow);\n            }\n            refreshNodePostHandlerFilters();\n        }\n        if (flowPreHandlerFilters != null) {\n            for (Filter filter: flowPreHandlerFilters) {\n                filter.init(initContext, flow);\n            }\n            refreshFlowPreHandlerFilters();\n        }\n        if (flowPostHandlerFilters != null) {\n            for (Filter filter: flowPostHandlerFilters) {\n                filter.init(initContext, flow);\n            }\n            refreshFlowPostHandlerFilters();\n        }\n    }\n    \n    public void destroy() {\n        if (filters != null) {\n            for (Filter filter: filters) {\n                filter.destroy();\n            }\n        }\n        if (nodeFilters != null) {\n            for (Filter filter: nodeFilters) {\n                filter.destroy();\n            }\n        }\n        if (nodeActionFilters != null) {\n            for (Filter filter: nodeActionFilters) {\n                filter.destroy();\n            }\n        }\n        if (nodePreHandlerFilters != null) {\n            for (Filter filter: nodePreHandlerFilters) {\n                filter.destroy();\n            }\n        }\n        if (nodePostHandlerFilters != null) {\n            for (Filter filter: nodePostHandlerFilters) {\n                filter.destroy();\n            }\n        }\n        if (flowPreHandlerFilters != null) {\n            for (Filter filter: flowPreHandlerFilters) {\n                filter.destroy();\n            }\n        }\n        if (flowPostHandlerFilters != null) {\n            for (Filter filter: flowPostHandlerFilters) {\n                filter.destroy();\n            }\n        } \n    }\n\n\n    /* Filters */\n    private List<Filter<FlowContext, FlowResult>> innerFilters;\n    private List<Filter<FlowContext, FlowResult>> outerFilters;\n    \n    public List<Filter<FlowContext, FlowResult>> getFilters() {\n        return filters;\n    }\n    \n\n    public List<Filter<FlowContext, FlowResult>> getInnerFilters() {\n        return innerFilters;\n    }\n\n    public List<Filter<FlowContext, FlowResult>> getOuterFilters() {\n        return outerFilters;\n    }\n\n    public void setFilters(List<Filter<FlowContext, FlowResult>> filters) {\n        this.filters = filters;\n        refreshFilters();\n    }\n    \n    private void refreshFilters() {\n        if (filters == null) {\n            this.innerFilters = this.outerFilters = null;\n        } else {\n            this.innerFilters = new ArrayList<Filter<FlowContext, FlowResult>>();\n            this.outerFilters = new ArrayList<Filter<FlowContext, FlowResult>>();\n            for (Filter filter : filters) {\n                addFilter(filter, this.innerFilters, this.outerFilters);\n            }\n        }\n    }\n\n    public void addFilter(Filter<FlowContext, FlowResult> filter) {\n        if (this.filters == null) {\n            this.filters = new ArrayList<Filter<FlowContext, FlowResult>>();\n            this.innerFilters = new ArrayList<Filter<FlowContext,FlowResult>>();\n            this.outerFilters = new ArrayList<Filter<FlowContext,FlowResult>>();\n        }\n        this.filters.add(filter);\n        addFilter(filter, this.innerFilters, this.outerFilters);\n    }\n    \n    public boolean noOuterFilter() {\n        return outerFilters == null || outerFilters.size() == 0;\n    }\n    \n    public FlowResult doOuterFilter(FlowContext context, Function<FlowContext, FlowResult> outerInvoker) {\n        FilterChain<FlowContext, FlowResult> chain = new FilterChainImpl<FlowContext, FlowResult>(outerFilters, outerInvoker);\n        return chain.doFilter(context);\n    }\n    \n    public boolean noInnerFilter() {\n        return innerFilters == null || innerFilters.size() == 0;\n    }\n    \n    public FlowResult doInnerFilter(FlowContext context, Function<FlowContext, FlowResult> innerInvoker) {\n        FilterChain<FlowContext, FlowResult> chain = new FilterChainImpl<FlowContext, FlowResult>(innerFilters, innerInvoker);\n        return chain.doFilter(context);\n    }\n    \n    /* Node Filters */\n    private List<Filter<Triple<FlowNode, NodeContext, FlowContext>, NodeContext>> innerNodeFilters;\n    private List<Filter<Triple<FlowNode, NodeContext, FlowContext>, NodeContext>> outerNodeFilters;\n    \n    public List<Filter<Triple<FlowNode, NodeContext, FlowContext>, NodeContext>> getNodeFilters() {\n        return nodeFilters;\n    }\n    \n    public List<Filter<Triple<FlowNode, NodeContext, FlowContext>, NodeContext>> getInnerNodeFilters() {\n        return innerNodeFilters;\n    }\n\n    public List<Filter<Triple<FlowNode, NodeContext, FlowContext>, NodeContext>> getOuterNodeFilters() {\n        return outerNodeFilters;\n    }\n\n    public void setNodeFilters(List<Filter<Triple<FlowNode, NodeContext, FlowContext>, NodeContext>> nodeFilters) {\n        this.nodeFilters = nodeFilters;\n        refreshNodeFilters();\n    }\n    \n    private void refreshNodeFilters() {\n        if (nodeFilters.size() == 0) {\n            this.innerNodeFilters = this.outerNodeFilters = null;\n        } else {\n            this.innerNodeFilters = new ArrayList<Filter<Triple<FlowNode, NodeContext, FlowContext>, NodeContext>>();\n            this.outerNodeFilters = new ArrayList<Filter<Triple<FlowNode, NodeContext, FlowContext>, NodeContext>>();\n            for (Filter filter : nodeFilters) {\n                addFilter(filter, this.innerNodeFilters, this.outerNodeFilters);\n            }\n        }\n    }\n\n    public void addNodeFilter(Filter<Triple<FlowNode, NodeContext, FlowContext>, NodeContext> filter) {\n        if (this.nodeFilters == null) {\n            this.nodeFilters = new ArrayList<Filter<Triple<FlowNode, NodeContext, FlowContext>, NodeContext>>();\n            this.innerNodeFilters = new ArrayList<Filter<Triple<FlowNode,NodeContext,FlowContext>,NodeContext>>();\n            this.outerNodeFilters = new ArrayList<Filter<Triple<FlowNode,NodeContext,FlowContext>,NodeContext>>();            \n        }\n        this.nodeFilters.add(filter);\n        addFilter(filter, this.innerNodeFilters, this.outerNodeFilters);\n    }\n    \n    public boolean noOuterNodeFilter() {\n        return outerNodeFilters == null || outerNodeFilters.size() == 0;\n    }\n    \n    public NodeContext doOuterNodeFilter(Triple<FlowNode, NodeContext, FlowContext> p, Function<Triple<FlowNode, NodeContext, FlowContext>, NodeContext> outerNodeInvoker) {\n        FilterChain<Triple<FlowNode, NodeContext, FlowContext>, NodeContext> chain = new FilterChainImpl<>(outerNodeFilters, outerNodeInvoker);\n        return chain.doFilter(p);\n    }\n    \n    public boolean noInnerNodeFilter() {\n        return innerNodeFilters == null || innerNodeFilters.size() == 0;\n    }\n    \n    public NodeContext doInnerNodeFilter(Triple<FlowNode, NodeContext, FlowContext> p, Function<Triple<FlowNode, NodeContext, FlowContext>, NodeContext> innerNodeInvoker) {\n        FilterChain<Triple<FlowNode, NodeContext, FlowContext>, NodeContext> chain = new FilterChainImpl<>(innerNodeFilters, innerNodeInvoker);\n        return chain.doFilter(p);\n    }\n\n    /* NodeActionFilters */\n    private List<Filter<Pair<NodeContext, FlowContext>, Object>> innerNodeActionFilters;\n    private List<Filter<Pair<NodeContext, FlowContext>, Object>> outerNodeActionFilters;\n    \n    public List<Filter<Pair<NodeContext, FlowContext>, Object>> getNodeActionFilters() {\n        return nodeActionFilters;\n    }\n    \n    public List<Filter<Pair<NodeContext, FlowContext>, Object>> getInnerNodeActionFilters() {\n        return innerNodeActionFilters;\n    }\n    \n    public List<Filter<Pair<NodeContext, FlowContext>, Object>> getOuterNodeActionFilters() {\n        return outerNodeActionFilters;\n    }\n    \n    public void setNodeActionFilters(List<Filter<Pair<NodeContext, FlowContext>, Object>> nodeActionFilters) {\n        this.nodeActionFilters = nodeActionFilters;\n        refreshNodeActionFilters();\n    }\n    \n    private void refreshNodeActionFilters() {\n        if (nodeActionFilters == null) {\n            this.innerNodeActionFilters = this.outerNodeActionFilters = null;\n        } else {\n            this.innerNodeActionFilters = new ArrayList<Filter<Pair<NodeContext,FlowContext>,Object>>();\n            this.outerNodeActionFilters = new ArrayList<Filter<Pair<NodeContext,FlowContext>,Object>>();\n            for (Filter filter : nodeActionFilters) {\n                addFilter(filter, this.innerNodeActionFilters, this.outerNodeActionFilters);\n            }\n        }\n    }\n\n    public void addNodeActionFilter(Filter<Pair<NodeContext, FlowContext>, Object> filter) {\n        if (this.nodeActionFilters == null) {\n            this.nodeActionFilters = new ArrayList<Filter<Pair<NodeContext, FlowContext>, Object>>();\n            this.innerNodeActionFilters = new ArrayList<Filter<Pair<NodeContext, FlowContext>, Object>>();\n            this.outerNodeActionFilters = new ArrayList<Filter<Pair<NodeContext, FlowContext>, Object>>();\n        }\n        this.nodeActionFilters.add(filter);\n        addFilter(filter, this.innerNodeActionFilters, this.outerNodeActionFilters);\n        \n    }\n    \n    public boolean noOuterNodeActionFilter() {\n        return outerNodeActionFilters == null || outerNodeActionFilters.size() == 0;\n    }\n    \n    public Object doOuterNodeActionFilter(Pair<NodeContext, FlowContext> p, Function<Pair<NodeContext, FlowContext>, Object> outerNodeActionInvoker) {\n        FilterChain<Pair<NodeContext, FlowContext>, Object> chain = new FilterChainImpl<Pair<NodeContext,FlowContext>, Object>(outerNodeActionFilters, outerNodeActionInvoker);\n        return chain.doFilter(p);\n    }\n    \n    public boolean noInnerNodeActionFilter() {\n        return innerNodeActionFilters == null || innerNodeActionFilters.size() == 0;\n    }\n    \n    public Object doInnerNodeActionFilter(Pair<NodeContext, FlowContext> p, Function<Pair<NodeContext, FlowContext>, Object> innerNodeActionInvoker) {\n        FilterChain<Pair<NodeContext, FlowContext>, Object> chain = new FilterChainImpl<Pair<NodeContext,FlowContext>, Object>(innerNodeActionFilters, innerNodeActionInvoker);\n        return chain.doFilter(p);\n    }\n    \n    /* NodePreHandlerFilters*/\n    private List<Filter<Pair<NodeContext, FlowContext>, Boolean>> innerNodePreHandlerFilters;\n    private List<Filter<Pair<NodeContext, FlowContext>, Boolean>> outerNodePreHandlerFilters;\n\n    public List<Filter<Pair<NodeContext, FlowContext>, Boolean>> getNodePreHandlerFilters() {\n        return nodePreHandlerFilters;\n    }\n    \n    public List<Filter<Pair<NodeContext, FlowContext>, Boolean>> getInnerNodePreHandlerFilters() {\n        return innerNodePreHandlerFilters;\n    }\n\n    public List<Filter<Pair<NodeContext, FlowContext>, Boolean>> getOuterNodePreHandlerFilters() {\n        return outerNodePreHandlerFilters;\n    }\n\n    public void setNodePreHandlerFilters(List<Filter<Pair<NodeContext, FlowContext>, Boolean>> nodePreHandlerFilters) {\n        this.nodePreHandlerFilters = nodePreHandlerFilters;\n        refreshNodePreHandlerFilters();\n    }\n    \n    private void refreshNodePreHandlerFilters() {\n        if (nodePreHandlerFilters == null) {\n            this.innerNodePreHandlerFilters = this.outerNodePreHandlerFilters = null;\n        } else {\n            this.innerNodePreHandlerFilters = new ArrayList<Filter<Pair<NodeContext, FlowContext>, Boolean>>();\n            this.outerNodePreHandlerFilters = new ArrayList<Filter<Pair<NodeContext, FlowContext>, Boolean>>();\n            for (Filter filter : nodePreHandlerFilters) {\n                addFilter(filter, this.innerNodePreHandlerFilters, this.outerNodePreHandlerFilters);\n            }\n        }\n    }\n\n    public void addNodePreHandlerFilter(Filter<Pair<NodeContext, FlowContext>, Boolean> filter) {\n        if (this.nodePreHandlerFilters == null) {\n            this.nodePreHandlerFilters = new ArrayList<Filter<Pair<NodeContext, FlowContext>, Boolean>>();\n            this.innerNodePreHandlerFilters = new ArrayList<Filter<Pair<NodeContext,FlowContext>,Boolean>>();\n            this.outerNodePreHandlerFilters = new ArrayList<Filter<Pair<NodeContext,FlowContext>,Boolean>>();\n        }\n        this.nodePreHandlerFilters.add(filter);\n        addFilter(filter, this.innerNodePreHandlerFilters, this.outerNodePreHandlerFilters);\n    }\n    \n    public boolean noOuterNodePreHandlerFilter() {\n        return outerNodePreHandlerFilters == null || outerNodePreHandlerFilters.size() == 0;\n    }\n    \n    public Boolean doOuterNodePreHandlerFilter(Pair<NodeContext, FlowContext> p, Function<Pair<NodeContext, FlowContext>, Boolean> outerNodePreHandlerInvoker) {\n        FilterChain<Pair<NodeContext, FlowContext>, Boolean> chain = new FilterChainImpl<Pair<NodeContext,FlowContext>, Boolean>(outerNodePreHandlerFilters, outerNodePreHandlerInvoker);\n        return chain.doFilter(p);\n    }\n    \n    public boolean noInnerNodePreHandlerFilter() {\n        return innerNodePreHandlerFilters == null || innerNodePreHandlerFilters.size() == 0;\n    }\n    \n    public Boolean doInnerNodePreHandlerFilter(Pair<NodeContext, FlowContext> p, Function<Pair<NodeContext, FlowContext>, Boolean> innerNodePreHandlerInvoker) {\n        FilterChain<Pair<NodeContext, FlowContext>, Boolean> chain = new FilterChainImpl<Pair<NodeContext,FlowContext>, Boolean>(innerNodePreHandlerFilters, innerNodePreHandlerInvoker);\n        return chain.doFilter(p);\n    }\n\n    /* NodePostHandlerFilter */\n    private List<Filter<Pair<NodeContext, FlowContext>, NodeContext[]>> innerNodePostHandlerFilters;\n    private List<Filter<Pair<NodeContext, FlowContext>, NodeContext[]>> outerNodePostHandlerFilters;\n    \n    public List<Filter<Pair<NodeContext, FlowContext>, NodeContext[]>> getNodePostHandlerFilters() {\n        return nodePostHandlerFilters;\n    }\n\n    public List<Filter<Pair<NodeContext, FlowContext>, NodeContext[]>> getInnerNodePostHandlerFilters() {\n        return innerNodePostHandlerFilters;\n    }\n\n    public List<Filter<Pair<NodeContext, FlowContext>, NodeContext[]>> getOuterNodePostHandlerFilters() {\n        return outerNodePostHandlerFilters;\n    }\n\n    public void setNodePostHandlerFilters(\n            List<Filter<Pair<NodeContext, FlowContext>, NodeContext[]>> nodePostHandlerFilters) {\n        this.nodePostHandlerFilters = nodePostHandlerFilters;\n        refreshNodePostHandlerFilters();\n    }\n    \n    private void refreshNodePostHandlerFilters() {\n        if (nodePostHandlerFilters == null) {\n            this.innerNodePostHandlerFilters = this.outerNodePostHandlerFilters = null;\n        } else {\n            this.innerNodePostHandlerFilters = new ArrayList<Filter<Pair<NodeContext,FlowContext>,NodeContext[]>>();\n            this.outerNodePostHandlerFilters = new ArrayList<Filter<Pair<NodeContext,FlowContext>,NodeContext[]>>();\n            for (Filter filter : nodePostHandlerFilters) {\n                addFilter(filter, this.innerNodePostHandlerFilters, this.outerNodePostHandlerFilters);\n            }\n        }\n    }\n    \n    public void addNodePostHandlerFilter(Filter<Pair<NodeContext, FlowContext>, NodeContext[]> filter) {\n        if (this.nodePostHandlerFilters == null) {\n            this.nodePostHandlerFilters = new ArrayList<Filter<Pair<NodeContext, FlowContext>, NodeContext[]>>();\n            this.innerNodePostHandlerFilters = new ArrayList<Filter<Pair<NodeContext, FlowContext>, NodeContext[]>>();\n            this.outerNodePostHandlerFilters = new ArrayList<Filter<Pair<NodeContext, FlowContext>, NodeContext[]>>();\n        }\n        this.nodePostHandlerFilters.add(filter);\n        addFilter(filter, this.innerNodePostHandlerFilters, this.outerNodePostHandlerFilters);\n    }\n    \n    public boolean noOuterNodePostHandlerFilter() {\n        return outerNodePostHandlerFilters == null || outerNodePostHandlerFilters.size() == 0;\n    }\n    \n    public NodeContext[] doOuterNodePostHandlerFilter(Pair<NodeContext, FlowContext> p, Function<Pair<NodeContext, FlowContext>, NodeContext[]> outerNodePostHandlerInvoker) {\n        FilterChain<Pair<NodeContext, FlowContext>, NodeContext[]> chain = new FilterChainImpl<Pair<NodeContext,FlowContext>, NodeContext[]>(outerNodePostHandlerFilters, outerNodePostHandlerInvoker);\n        return chain.doFilter(p);\n    }\n    \n    public boolean noInnerNodePostHandlerFilter() {\n        return innerNodePostHandlerFilters == null || innerNodePostHandlerFilters.size() == 0;\n    }\n    \n    public NodeContext[] doInnerNodePostHandlerFilter(Pair<NodeContext, FlowContext> p, Function<Pair<NodeContext, FlowContext>, NodeContext[]> innerNodePostHandlerInvoker) {\n        FilterChain<Pair<NodeContext, FlowContext>, NodeContext[]> chain = new FilterChainImpl<Pair<NodeContext,FlowContext>, NodeContext[]>(innerNodePostHandlerFilters, innerNodePostHandlerInvoker);\n        return chain.doFilter(p);\n    }\n    \n    /* FlowPreHandlerFilter */\n    private List<Filter<FlowContext, Boolean>> innerFlowPreHandlerFilters;\n    private List<Filter<FlowContext, Boolean>> outerFlowPreHandlerFilters;\n    \n    public List<Filter<FlowContext, Boolean>> getFlowPreHandlerFilters() {\n        return flowPreHandlerFilters;\n    }\n    \n    public List<Filter<FlowContext, Boolean>> getInnerFlowPreHandlerFilters() {\n        return innerFlowPreHandlerFilters;\n    }\n\n    public List<Filter<FlowContext, Boolean>> getOuterFlowPreHandlerFilters() {\n        return outerFlowPreHandlerFilters;\n    }\n\n    public void setFlowPreHandlerFilters(List<Filter<FlowContext, Boolean>> flowPreHandlerFilters) {\n        this.flowPreHandlerFilters = flowPreHandlerFilters;\n        refreshFlowPreHandlerFilters();\n    }\n    \n    private void refreshFlowPreHandlerFilters() {\n        if (flowPreHandlerFilters == null) {\n            this.innerFlowPreHandlerFilters = this.outerFlowPreHandlerFilters = null;\n        } else {\n            this.innerFlowPreHandlerFilters = new ArrayList<Filter<FlowContext,Boolean>>();\n            this.outerFlowPreHandlerFilters = new ArrayList<Filter<FlowContext,Boolean>>();\n            for (Filter filter : flowPreHandlerFilters) {\n                addFilter(filter, this.innerFlowPreHandlerFilters, this.outerFlowPreHandlerFilters);\n            }\n        }\n    }\n    \n    public void addFlowPreHandlerFilter(Filter<FlowContext, Boolean> filter) {\n        if (this.flowPreHandlerFilters == null) {\n            this.flowPreHandlerFilters = new ArrayList<Filter<FlowContext, Boolean>>();\n            this.innerFlowPreHandlerFilters = new ArrayList<Filter<FlowContext,Boolean>>();\n            this.outerFlowPreHandlerFilters = new ArrayList<Filter<FlowContext,Boolean>>();\n        }\n        this.flowPreHandlerFilters.add(filter);\n        addFilter(filter, this.innerFlowPreHandlerFilters, this.outerFlowPreHandlerFilters);\n    }\n    \n    public boolean noOuterFlowPreHandlerFilter() {\n        return outerFlowPreHandlerFilters == null || outerFlowPreHandlerFilters.size() == 0;\n    }\n    \n    public Boolean doOuterFlowPreHandlerFilter(FlowContext context, Function<FlowContext, Boolean> outerFlowPreHandlerInvoker) {\n        FilterChain<FlowContext, Boolean> chain = new FilterChainImpl<>(outerFlowPreHandlerFilters, outerFlowPreHandlerInvoker);\n        return chain.doFilter(context);\n    }\n    \n    public boolean noInnerFlowPreHandlerFilter() {\n        return innerFlowPreHandlerFilters == null || innerFlowPreHandlerFilters.size() == 0;\n    }\n    \n    public Boolean doInnerFlowPreHandlerFilter(FlowContext context, Function<FlowContext, Boolean> innerFlowPreHandlerInvoker) {\n        FilterChain<FlowContext, Boolean> chain = new FilterChainImpl<>(innerFlowPreHandlerFilters, innerFlowPreHandlerInvoker);\n        return chain.doFilter(context);\n    }\n\n    /* FlowPostHandlerFilter */\n    private List<Filter<FlowContext, Void>> innerFlowPostHandlerFilters;\n    private List<Filter<FlowContext, Void>> outerFlowPostHandlerFilters;\n    \n    public List<Filter<FlowContext, Void>> getFlowPostHandlerFilters() {\n        return flowPostHandlerFilters;\n    }\n    \n    public List<Filter<FlowContext, Void>> getInnerFlowPostHandlerFilters() {\n        return innerFlowPostHandlerFilters;\n    }\n\n    public List<Filter<FlowContext, Void>> getOuterFlowPostHandlerFilters() {\n        return outerFlowPostHandlerFilters;\n    }\n\n    public void setFlowPostHandlerFilters(List<Filter<FlowContext, Void>> flowPostHandlerFilters) {\n        this.flowPostHandlerFilters = flowPostHandlerFilters;\n        refreshFlowPostHandlerFilters();\n    }\n    \n    private void refreshFlowPostHandlerFilters() {\n        if (flowPostHandlerFilters == null) {\n            this.innerFlowPostHandlerFilters = this.outerFlowPostHandlerFilters = null;\n        } else {\n            this.innerFlowPostHandlerFilters = new ArrayList<Filter<FlowContext,Void>>();\n            this.outerFlowPostHandlerFilters = new ArrayList<Filter<FlowContext,Void>>();\n            for (Filter filter : flowPostHandlerFilters) {\n                addFilter(filter, this.innerFlowPostHandlerFilters, this.outerFlowPostHandlerFilters);\n            }\n        }\n    }\n    \n    public void addFlowPostHandlerFilter(Filter<FlowContext, Void> filter) {\n        if (this.flowPostHandlerFilters == null) {\n            this.flowPostHandlerFilters = new ArrayList<Filter<FlowContext, Void>>();\n            this.innerFlowPostHandlerFilters = new ArrayList<Filter<FlowContext,Void>>();\n            this.outerFlowPostHandlerFilters = new ArrayList<Filter<FlowContext,Void>>();\n        }\n        this.flowPostHandlerFilters.add(filter);\n        addFilter(filter, this.innerFlowPostHandlerFilters, this.outerFlowPostHandlerFilters);\n    }\n    \n    public boolean noOuterFlowPostHandlerFilter() {\n        return outerFlowPostHandlerFilters == null || outerFlowPostHandlerFilters.size() == 0;\n    }\n    \n    public Void doOuterFlowPostHandlerFilter(FlowContext context, Function<FlowContext, Void> outerFlowPostHandlerInvoker) {\n        FilterChain<FlowContext, Void> chain = new FilterChainImpl<>(outerFlowPostHandlerFilters, outerFlowPostHandlerInvoker);\n        return chain.doFilter(context);\n    }\n    \n    public boolean noInnerFlowPostHandlerFilter() {\n        return innerFlowPostHandlerFilters == null || innerFlowPostHandlerFilters.size() == 0;\n    }\n    \n    public Void doInnerFlowPostHandlerFilter(FlowContext context, Function<FlowContext, Void> innerFlowPostHandlerInvoker) {\n        FilterChain<FlowContext, Void> chain = new FilterChainImpl<>(innerFlowPostHandlerFilters, innerFlowPostHandlerInvoker);\n        return chain.doFilter(context);\n    }\n    \n    private void addFilter(Filter filter, List innerFilters, List outerFilters) {\n        int filterOrder = filter.getOrder();\n        int pos = 0;\n        if (filterOrder < 0) {\n            for (; pos < innerFilters.size(); pos++) {\n                if (((Filter) innerFilters.get(pos)).getOrder() < filterOrder) {\n                    break;\n                }\n            }\n            innerFilters.add(pos, filter);\n        } else {\n            for (; pos < outerFilters.size(); pos++) {\n                if (((Filter)outerFilters.get(pos)).getOrder() < filterOrder) {\n                    break;\n                }\n            }\n            outerFilters.add(pos, filter);\n        }\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/filter/FlowPostHandlerFilter.java",
    "content": "package com.jd.easyflow.flow.model.filter;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.filter.Filter;\n\n/**\n * @author liyuliang5\n */\npublic interface FlowPostHandlerFilter extends Filter<FlowContext, Void> {\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/filter/FlowPreHandlerFilter.java",
    "content": "package com.jd.easyflow.flow.model.filter;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.filter.Filter;\n\n/**\n * @author liyuliang5\n */\npublic interface FlowPreHandlerFilter extends Filter<FlowContext, Boolean> {\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/filter/NodeActionFilter.java",
    "content": "package com.jd.easyflow.flow.model.filter;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.filter.Filter;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.util.Pair;\n\n/**\n * @author liyuliang5\n */\npublic interface NodeActionFilter extends Filter<Pair<NodeContext, FlowContext>, Object> {\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/filter/NodeFilter.java",
    "content": "package com.jd.easyflow.flow.model.filter;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.filter.Filter;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.util.Triple;\n\n/**\n * @author liyuliang5\n */\npublic interface NodeFilter extends Filter<Triple<FlowNode, NodeContext, FlowContext>, NodeContext> {\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/filter/NodePostHandlerFilter.java",
    "content": "package com.jd.easyflow.flow.model.filter;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.filter.Filter;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.util.Pair;\n\n/**\n * @author liyuliang5\n */\npublic interface NodePostHandlerFilter extends Filter<Pair<NodeContext, FlowContext>, NodeContext[]> {\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/filter/NodePreHandlerFilter.java",
    "content": "package com.jd.easyflow.flow.model.filter;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.filter.Filter;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.util.Pair;\n\n/**\n * @author liyuliang5\n */\npublic interface NodePreHandlerFilter extends Filter<Pair<NodeContext, FlowContext>, Boolean> {\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/filter/impl/BaseFlowFilter.java",
    "content": "package com.jd.easyflow.flow.model.filter.impl;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.filter.BaseFilter;\nimport com.jd.easyflow.flow.model.filter.FlowFilter;\n\n/**\n * @author liyuliang5\n */\npublic abstract class BaseFlowFilter extends BaseFilter<FlowContext, FlowResult> implements FlowFilter {\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/filter/impl/BaseFlowPostHandlerFilter.java",
    "content": "package com.jd.easyflow.flow.model.filter.impl;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.filter.BaseFilter;\nimport com.jd.easyflow.flow.model.FlowPostHandler;\n\n/**\n * @author liyuliang5\n */\npublic abstract class BaseFlowPostHandlerFilter extends BaseFilter<FlowContext, Void> implements FlowPostHandler {\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/filter/impl/BaseFlowPreHandlerFilter.java",
    "content": "package com.jd.easyflow.flow.model.filter.impl;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.filter.BaseFilter;\nimport com.jd.easyflow.flow.model.filter.FlowPreHandlerFilter;\n\n/**\n * @author liyuliang5\n */\npublic abstract class BaseFlowPreHandlerFilter extends BaseFilter<FlowContext, Boolean> implements FlowPreHandlerFilter {\n\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/filter/impl/BaseNodeActionFilter.java",
    "content": "package com.jd.easyflow.flow.model.filter.impl;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.filter.BaseFilter;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.filter.NodeActionFilter;\nimport com.jd.easyflow.flow.util.Pair;\n\n/**\n * @author liyuliang5\n */\npublic abstract class BaseNodeActionFilter extends BaseFilter<Pair<NodeContext, FlowContext>, Object> implements NodeActionFilter {\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/filter/impl/BaseNodeFilter.java",
    "content": "package com.jd.easyflow.flow.model.filter.impl;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.filter.BaseFilter;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.filter.NodeFilter;\nimport com.jd.easyflow.flow.util.Triple;\n\n/**\n * @author liyuliang5\n */\npublic abstract class BaseNodeFilter extends BaseFilter<Triple<FlowNode, NodeContext, FlowContext>, NodeContext> implements NodeFilter {\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/filter/impl/BaseNodePostHandlerFilter.java",
    "content": "package com.jd.easyflow.flow.model.filter.impl;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.filter.BaseFilter;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.filter.NodePostHandlerFilter;\nimport com.jd.easyflow.flow.util.Pair;\n\n/**\n * @author liyuliang5\n */\npublic abstract class BaseNodePostHandlerFilter extends BaseFilter<Pair<NodeContext, FlowContext>, NodeContext[]> implements NodePostHandlerFilter {\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/filter/impl/BaseNodePreHandlerFilter.java",
    "content": "package com.jd.easyflow.flow.model.filter.impl;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.filter.BaseFilter;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.filter.NodePreHandlerFilter;\nimport com.jd.easyflow.flow.util.Pair;\n\n/**\n * @author liyuliang5\n * \n */\npublic abstract class BaseNodePreHandlerFilter extends BaseFilter<Pair<NodeContext, FlowContext>, Boolean> implements NodePreHandlerFilter {\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/flow/post/ExpFlowPostHandler.java",
    "content": "package com.jd.easyflow.flow.model.flow.post;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.FlowPostHandler;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ExpFlowPostHandler implements FlowPostHandler {\n\n    private static final Logger logger = LoggerFactory.getLogger(ExpFlowPostHandler.class);\n\n    private String exp;\n\n    public ExpFlowPostHandler() {\n    }\n\n    public ExpFlowPostHandler(String exp) {\n        this.exp = exp;\n    }\n\n    @Override\n    public void postHandle(FlowContext context) {\n        Object result = context.getElEvaluator().eval(exp, null, context, null);\n        if (context.isLogOn() && logger.isInfoEnabled()) {\n            logger.info(\"Exp:\" + exp + \" result:\" + result);\n        }\n    }\n\n    public String getExp() {\n        return exp;\n    }\n\n    public void setExp(String exp) {\n        this.exp = exp;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/flow/pre/ExpFlowPreHandler.java",
    "content": "package com.jd.easyflow.flow.model.flow.pre;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.FlowPreHandler;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ExpFlowPreHandler implements FlowPreHandler {\n\n    private static final Logger logger = LoggerFactory.getLogger(ExpFlowPreHandler.class);\n\n    private String exp;\n\n    public ExpFlowPreHandler() {\n    }\n\n    public ExpFlowPreHandler(String exp) {\n        this.exp = exp;\n    }\n\n    @Override\n    public boolean preHandle(FlowContext context) {\n        boolean result = context.getElEvaluator().eval(exp, null, context, null);\n        if (context.isLogOn() && logger.isInfoEnabled()) {\n            logger.info(\"Exp:\" + exp + \" result:\" + result);\n        }\n        return result;\n    }\n\n    public String getExp() {\n        return exp;\n    }\n\n    public void setExp(String exp) {\n        this.exp = exp;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/node/NodeImpl.java",
    "content": "package com.jd.easyflow.flow.model.node;\n\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.function.Function;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.InitContext;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.NodeContextAccessor;\nimport com.jd.easyflow.flow.model.NodePostHandler;\nimport com.jd.easyflow.flow.model.NodePreHandler;\nimport com.jd.easyflow.flow.util.FlowEventTypes;\nimport com.jd.easyflow.flow.util.Pair;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class NodeImpl implements FlowNode {\n\n    protected String id;\n\n    protected String name;\n\n    protected Map<String, Object> properties = new ConcurrentHashMap<>();\n\n    protected NodePreHandler preHandler;\n\n    protected NodeAction action;\n\n    protected NodePostHandler postHandler;\n    \n    private Function<Pair<NodeContext, FlowContext>, Boolean> outerNodePreHandlerInvoker = p -> invokePreHandler(p.getLeft(), p.getRight());\n    private Function<Pair<NodeContext, FlowContext>, Boolean> innerNodePreHandlerInvoker = p -> preHandler.preHandle(p.getLeft(), p.getRight());\n    private Function<Pair<NodeContext, FlowContext>, Object> outerNodeActionInvoker = p -> invokeAction(p.getLeft(), p.getRight());\n    private Function<Pair<NodeContext, FlowContext>, Object> innerNodeActionInvoker = p -> action.execute(p.getLeft(), p.getRight());\n    private Function<Pair<NodeContext, FlowContext>, NodeContext[]> outerNodePostHandlerInvoker = p -> invokePostHandler(p.getLeft(), p.getRight());\n    private Function<Pair<NodeContext, FlowContext>, NodeContext[]> innerNodePostHandlerInvoker = p -> postHandler.postHandle(p.getLeft(), p.getRight());\n\n    @Override\n    public void init(InitContext initContext, Object parent) {\n        if (preHandler != null) {\n            preHandler.init(initContext, this);\n        }\n        if (action != null) {\n            action.init(initContext,  this);\n        }\n        if (postHandler != null) {\n            postHandler.init(initContext, this);\n        }\n    }\n    \n    @Override\n    public void destroy() {\n        if (preHandler != null) {\n            preHandler.destroy();\n        }\n        if (action != null) {\n            action.destroy();\n        }\n        if (postHandler != null) {\n            postHandler.destroy();\n        }\n    }\n\n    @Override\n    public NodeContext execute(NodeContext nodeContext, FlowContext context) {\n        if (!executePreHandler(nodeContext, context)) {\n            return nodeContext;\n        }\n        executeAction(nodeContext, context);\n        executePostHandler(nodeContext, context);\n        return nodeContext;\n    }\n\n    protected boolean executePreHandler(NodeContext nodeContext, FlowContext context) {\n        if (context.getFlow().getFilterManager().noOuterNodePreHandlerFilter()) {\n            return invokePreHandler(nodeContext, context);\n        } else {\n            Boolean preResult = context.getFlow().getFilterManager().doOuterNodePreHandlerFilter(Pair.of(nodeContext, context), outerNodePreHandlerInvoker);\n            NodeContextAccessor.setPreResult(nodeContext, preResult);\n            return preResult == null ? true : preResult;\n        }\n    }\n\n    protected boolean invokePreHandler(NodeContext nodeContext, FlowContext context) {\n        if (preHandler != null) {\n            context.getFlow().triggerEvent(FlowEventTypes.NODE_PRE_START, nodeContext, context, false);\n            boolean preResult;\n            if (context.getFlow().getFilterManager().noInnerNodePreHandlerFilter()) {\n                preResult = preHandler.preHandle(nodeContext, context);\n            } else {\n                Boolean result = context.getFlow().getFilterManager().doInnerNodePreHandlerFilter(Pair.of(nodeContext, context), innerNodePreHandlerInvoker);\n                preResult = result == null ? true : result;\n            }\n            NodeContextAccessor.setPreResult(nodeContext, preResult);\n            context.getFlow().triggerEvent(FlowEventTypes.NODE_PRE_END, nodeContext, context, false);\n        }\n        return nodeContext.getPreResult() == null ? true : nodeContext.getPreResult();\n    }\n\n    /**\n     * Execute node action.\n     * \n     * @param nodeContext\n     * @param context\n     */\n    protected void executeAction(NodeContext nodeContext, FlowContext context) {\n        if (context.getFlow().getFilterManager().noOuterNodeActionFilter()) {\n            invokeAction(nodeContext, context);\n        } else {\n            Object result = context.getFlow().getFilterManager().doOuterNodeActionFilter(Pair.of(nodeContext, context), outerNodeActionInvoker);\n            NodeContextAccessor.setActionResult(nodeContext,result);\n        }\n    }\n\n    protected Object invokeAction(NodeContext nodeContext, FlowContext context) {\n        if (action != null) {\n            context.getFlow().triggerEvent(FlowEventTypes.NODE_ACTION_START, nodeContext, context, false);\n            Object result = null;\n            if (context.getFlow().getFilterManager().noInnerNodeActionFilter()) {\n                result = action.execute(nodeContext, context);\n            } else {\n                result = context.getFlow().getFilterManager().doInnerNodeActionFilter(Pair.of(nodeContext, context), innerNodeActionInvoker);\n            }\n            NodeContextAccessor.setActionResult(nodeContext,result);\n            context.getFlow().triggerEvent(FlowEventTypes.NODE_ACTION_END, nodeContext, context, false);\n        }\n        return nodeContext.getActionResult();\n    }\n\n    protected void executePostHandler(NodeContext nodeContext, FlowContext context) {\n        if (context.getFlow().getFilterManager().noOuterNodePostHandlerFilter()) {\n            invokePostHandler(nodeContext, context);\n        } else {\n            NodeContext[] result = context.getFlow().getFilterManager().doOuterNodePostHandlerFilter(Pair.of(nodeContext, context), outerNodePostHandlerInvoker);\n            NodeContextAccessor.setNextNodes(nodeContext, result);\n        }\n    }\n\n    protected NodeContext[] invokePostHandler(NodeContext nodeContext, FlowContext context) {\n        if (postHandler != null) {\n            context.getFlow().triggerEvent(FlowEventTypes.NODE_POST_START, nodeContext, context, false);\n            NodeContext[] nextNodes = null;\n            if (context.getFlow().getFilterManager().noInnerNodePostHandlerFilter()) {\n                nextNodes = postHandler.postHandle(nodeContext, context);\n            } else {\n                nextNodes = context.getFlow().getFilterManager().doInnerNodePostHandlerFilter(Pair.of(nodeContext, context), innerNodePostHandlerInvoker);\n            }\n            if (nextNodes != null) {\n                NodeContextAccessor.setNextNodes(nodeContext,nextNodes);\n            }\n            context.getFlow().triggerEvent(FlowEventTypes.NODE_POST_END, nodeContext, context, false);\n        }\n        return nodeContext.getNextNodes();\n    }\n\n    public NodeAction getAction() {\n        return action;\n    }\n\n    public void setAction(NodeAction action) {\n        this.action = action;\n    }\n\n    public NodePreHandler getPreHandler() {\n        return preHandler;\n    }\n\n    public void setPreHandler(NodePreHandler preHandler) {\n        this.preHandler = preHandler;\n    }\n\n    public NodePostHandler getPostHandler() {\n        return postHandler;\n    }\n\n    @Override\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public void setPostHandler(NodePostHandler postHandler) {\n        this.postHandler = postHandler;\n    }\n\n    @Override\n    public String getId() {\n        return id;\n    }\n\n    public void setId(String id) {\n        this.id = id;\n    }\n\n    @Override\n    public Map<String, Object> getProperties() {\n        return properties;\n    }\n    \n    public void setProperties(Map<String, Object> properties) {\n        this.properties.clear();\n        this.putProperties(properties);\n    }\n\n    public void putProperties(Map<String, Object> properties) {\n        if (properties == null) {\n            return;\n        }\n        for (Entry<String, Object> entry : properties.entrySet()) {\n            if (entry.getValue() == null) {\n                this.properties.remove(entry.getKey());\n            } else {\n                this.properties.put(entry.getKey(), entry.getValue());\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/parser/FlowParser.java",
    "content": "package com.jd.easyflow.flow.model.parser;\n\nimport java.util.List;\nimport java.util.Map;\n\nimport com.jd.easyflow.flow.el.ElEvaluator;\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodePostHandler;\nimport com.jd.easyflow.flow.model.NodePreHandler;\nimport com.jd.easyflow.flow.model.parser.param.ActionParseParam;\nimport com.jd.easyflow.flow.model.parser.param.FlowParseParam;\nimport com.jd.easyflow.flow.model.parser.param.PostParseParam;\nimport com.jd.easyflow.flow.model.parser.param.PreParseParam;\n\n/**\n * Flow definition parser.\n * \n * @author liyuliang5\n * @version 1.0\n * @since 1.0\n */\npublic interface FlowParser {\n\n    /**\n     * Parse definition string to java model.\n     * \n     * @param data\n     * @return\n     */\n    List<Flow> parse(String data);\n    \n    /**\n     * Parse definition map to java model.\n     * @param map\n     * @return\n     */\n    List<Flow> parse(Map<String, Object> map);\n    \n    /**\n     * Parse definition string to java model.\n     * @param data\n     * @param parseEl\n     * @return\n     */\n    List<Flow> parse(String data, boolean parseEl);\n    \n    /**\n     * Parse definition map to java model.\n     * @param map\n     * @param parseEl\n     * @return\n     */\n    List<Flow> parse(Map<String, Object> map, boolean parseEl);\n    \n    /**\n     * General parse method.\n     * @param param\n     * @return\n     */\n    List<Flow> parse(FlowParseParam param);\n    \n    \n    /**\n     * Parse preHandler.\n     * @param param\n     * @return\n     */\n    NodePreHandler parseNodePreHandler(PreParseParam param);\n    \n    /**\n     * Parse nodeAction.\n     * @param param\n     * @return\n     */\n    NodeAction parseNodeAction(ActionParseParam param);\n\n    /**\n     * Parse postHandler.\n     * @param param.\n     * @return\n     */\n    NodePostHandler parseNodePostHandler(PostParseParam param);\n\n    /**\n     * \n     * Convert java model to string.\n     *\n     * @param flow\n     * @return\n     */\n    String stringify(Flow flow);\n    \n    /**\n     * \n     * @return\n     */\n    public ElEvaluator getElEvaluator();\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/parser/FlowParserImpl.java",
    "content": "package com.jd.easyflow.flow.model.parser;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.el.ElEvaluator;\nimport com.jd.easyflow.flow.el.ElFactory;\nimport com.jd.easyflow.flow.engine.FlowRunner;\nimport com.jd.easyflow.flow.engine.event.ExpFlowEventListener;\nimport com.jd.easyflow.flow.engine.event.FlowEventListener;\nimport com.jd.easyflow.flow.engine.impl.ExpFlowRunner;\nimport com.jd.easyflow.flow.exception.FlowException;\nimport com.jd.easyflow.flow.filter.ExpFilter;\nimport com.jd.easyflow.flow.filter.Filter;\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.FlowPostHandler;\nimport com.jd.easyflow.flow.model.FlowPreHandler;\nimport com.jd.easyflow.flow.model.InitContext;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodePostHandler;\nimport com.jd.easyflow.flow.model.NodePreHandler;\nimport com.jd.easyflow.flow.model.action.CompensateNodeAction;\nimport com.jd.easyflow.flow.model.action.EventNodeAction;\nimport com.jd.easyflow.flow.model.action.ExpNodeAction;\nimport com.jd.easyflow.flow.model.action.FlowNodeAction;\nimport com.jd.easyflow.flow.model.action.InterruptNodeAction;\nimport com.jd.easyflow.flow.model.action.LoopNodeAction;\nimport com.jd.easyflow.flow.model.action.ParamExecutorNodeAction;\nimport com.jd.easyflow.flow.model.definition.DefConstants;\nimport com.jd.easyflow.flow.model.flow.post.ExpFlowPostHandler;\nimport com.jd.easyflow.flow.model.flow.pre.ExpFlowPreHandler;\nimport com.jd.easyflow.flow.model.node.NodeImpl;\nimport com.jd.easyflow.flow.model.parser.event.ExpFlowParseEventListener;\nimport com.jd.easyflow.flow.model.parser.event.FlowParseEvent;\nimport com.jd.easyflow.flow.model.parser.event.FlowParseEventListener;\nimport com.jd.easyflow.flow.model.parser.event.FlowParseEventTypes;\nimport com.jd.easyflow.flow.model.parser.param.ActionParseParam;\nimport com.jd.easyflow.flow.model.parser.param.FlowParseParam;\nimport com.jd.easyflow.flow.model.parser.param.PostParseParam;\nimport com.jd.easyflow.flow.model.parser.param.PreParseParam;\nimport com.jd.easyflow.flow.model.post.ConditionalNodePostHandler;\nimport com.jd.easyflow.flow.model.post.EventPostHandler;\nimport com.jd.easyflow.flow.model.post.ExpNodePostHandler;\nimport com.jd.easyflow.flow.model.post.FixedNodePostHandler;\nimport com.jd.easyflow.flow.model.pre.ExpNodePreHandler;\nimport com.jd.easyflow.flow.model.pre.InclusiveCheckPreHandler;\nimport com.jd.easyflow.flow.model.pre.MultiCheckPreHandler;\nimport com.jd.easyflow.flow.util.FlowConstants;\nimport com.jd.easyflow.flow.util.JsonUtil;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FlowParserImpl implements FlowParser {\n\n    private static final Logger logger = LoggerFactory.getLogger(FlowParser.class);\n    \n    private static final String FLOW_STRING_KEY = \"_flow_string\";\n    \n    private static final String PARENT_FLOW_ID_KEY = \"_parent_flow_id\";\n    \n    private static final String MAIN_FLOW_ID_KEY = \"_main_flow_id\";\n    \n    private ElEvaluator elEvaluator;\n    \n    private List<FlowParseEventListener> preListeners;\n    \n    private List<FlowParseEventListener> postListeners;\n    \n    \n    @Override\n    public List<Flow> parse(String data) {\n        return parse(new FlowParseParam(data));\n    }\n\n    @Override\n    public List<Flow> parse(Map<String, Object> map) {\n        return parse(new FlowParseParam(map));\n    }\n\n    @Override\n    public List<Flow> parse(String data, boolean parseEl) {\n        return parse(new FlowParseParam(data, parseEl));\n    }\n\n    @Override\n    public List<Flow> parse(Map<String, Object> map, boolean parseEl) {\n        return parse(new FlowParseParam(map, parseEl));\n    }\n    \n    @Override\n    public List<Flow> parse(FlowParseParam param) {\n        String stringDef = param.getStringDefinition();\n        Object defObj = param.getObjectDefinition();\n\n        if (stringDef == null && defObj == null) {\n            throw new FlowException(\"definition is empty\");\n        }\n               \n        Object stringDefObj = stringDef == null ? null : JsonUtil.parseObject(stringDef, Object.class);;\n        \n        if (defObj == null) {\n            defObj = stringDefObj;\n        }\n        if (stringDef == null) {\n            stringDef = JsonUtil.toJsonString(defObj);\n        }\n        \n        List<Flow> allFlowList = null;\n        \n        if (defObj instanceof Map) {\n            allFlowList = parseMapDef((Map<String, Object>) defObj, param.isParseEl());\n        } else {\n            allFlowList = new ArrayList<Flow>();\n            for (int i = 0; i < ((List) defObj).size(); i++) {\n                Map<String, Object> defMap = ((List<Map<String, Object>>) defObj).get(i);\n                List<Flow> flowList = parseMapDef(defMap, param.isParseEl());\n                allFlowList.addAll(flowList);\n                if (i > 0) {\n                    flowList.get(0).setProperty(FLOW_STRING_KEY, JsonUtil.toJsonString(defMap));\n                }\n            }\n        }\n        for (int i = 1; i < allFlowList.size(); i++) {\n            allFlowList.get(i).setProperty(MAIN_FLOW_ID_KEY, allFlowList.get(0).getId());\n        }\n        allFlowList.get(0).setProperty(FLOW_STRING_KEY, stringDef);\n        return allFlowList;\n    }\n    \n    private List<Flow> parseMapDef(Map<String, Object> mapDef, boolean parseEl) {\n        List<Flow> flowList = new ArrayList<Flow>();\n        parse(mapDef, flowList, parseEl);\n        return flowList;\n    }\n\n\n    private Flow parse(Map<String, Object> map, List<Flow> flowList, boolean parseEl) {        \n        Flow flow = new Flow();\n        flow.setFlowParser(this);\n        flowList.add(flow);\n        int subFlowStartIndex = flowList.size();\n        \n        List<FlowParseEventListener> parseListeners = parseParseListeners(map, flow, parseEl);\n        if (preListeners != null && preListeners.size() > 0) {\n            if (parseListeners == null) {\n                parseListeners = new ArrayList<FlowParseEventListener>();\n            }\n           parseListeners.addAll(0, preListeners);\n        }\n        if (postListeners != null && postListeners.size() > 0) {\n            if (parseListeners == null) {\n                parseListeners = new ArrayList<FlowParseEventListener>();\n            }\n            parseListeners.addAll(postListeners);\n        }\n        triggerParseEvent(parseListeners, FlowParseEventTypes.PARSE_FLOW_START, map, flow, null, parseEl);\n        \n        flow.setId((String) map.get(DefConstants.COMMON_PROP_ID));\n        flow.setName((String) map.get(DefConstants.COMMON_PROP_NAME));\n        flow.setLogFlag((Boolean) map.get(DefConstants.FLOW_PROP_LOG_FLAG));\n        // Parse property\n        Map<String, Object> properties = (Map<String, Object>) map.get(DefConstants.COMMON_PROP_PROPERTIES);\n        flow.putProperties(properties);\n        \n        // Parse flow pre handler\n        parseFlowPreHandler(map.get(DefConstants.FLOW_PROP_PRE), flow, parseEl);\n        // Parse node\n        List<Map<String, Object>> nodeListConf = (List<Map<String, Object>>) map.get(DefConstants.FLOW_PROP_NODES);\n        List<String> startNodeIdList = new ArrayList<String>();\n        if (nodeListConf != null) {\n            for (Map<String, Object> nodeConf : nodeListConf) {\n                // start node judge\n                boolean start = nodeConf.get(DefConstants.NODE_PROP_START) == null ? false\n                        : (Boolean) nodeConf.get(DefConstants.NODE_PROP_START);\n                if (start) {\n                    startNodeIdList.add((String) nodeConf.get(DefConstants.COMMON_PROP_ID));\n                }\n                // create node\n                String type = (String) nodeConf.get(DefConstants.COMMON_PROP_TYPE);\n                if (DefConstants.COMMON_PROP_CREATE.equals(type)\n                        || nodeConf.containsKey(DefConstants.COMMON_PROP_CREATE_EXP)) {\n                    if (parseEl) {\n                        String exp = (String) nodeConf.get(DefConstants.COMMON_PROP_CREATE_EXP);\n                        Map<String, Object> elContext = createElContext(nodeConf, null, flow);\n                        FlowNode node = getElEvaluator().evalWithDefaultContext(exp, elContext, false);\n                        if (node != null) {\n                            node.postConstruct(nodeConf, null);\n                            flow.addNode(node);\n                        }\n                    }\n                } else {\n                    NodeImpl node = new NodeImpl();\n                    node.setId((String) nodeConf.get(DefConstants.COMMON_PROP_ID));\n                    node.setName((String) nodeConf.get(DefConstants.COMMON_PROP_NAME));\n                    node.putProperties((Map<String, Object>) nodeConf.get(DefConstants.COMMON_PROP_PROPERTIES));\n                    node.setPreHandler(parseNodePreHandler(\n                            new PreParseParam(nodeConf.get(DefConstants.NODE_PROP_PRE), flowList, parseEl, flow, node)));\n                    node.setAction(parseNodeAction(new ActionParseParam(nodeConf.get(DefConstants.NODE_PROP_ACTION),\n                            flowList, parseEl, flow, node)));\n                    node.setPostHandler(parseNodePostHandler(\n                            new PostParseParam(nodeConf.get(DefConstants.NODE_PROP_POST), flowList, parseEl, flow, node)));\n                    // compensate action parse\n                    if (node.getProperty(DefConstants.NODE_PROPERTIES_PROP_COMPENSATE_ACTION) != null) {\n                        NodeAction compensateAction = parseNodeAction(new ActionParseParam(nodeConf.get(DefConstants.NODE_PROPERTIES_PROP_COMPENSATE_ACTION),\n                                flowList, parseEl, flow, node));\n                        node.setProperty(FlowConstants.PROP_RUNTIME_COMPENSATE_ACTION, compensateAction);\n                    }\n                    node.postConstruct(nodeConf, null);\n                    flow.addNode(node);\n                }\n            }\n        }\n        // set start node.\n        if (startNodeIdList.size() > 0) {\n            flow.setStartNodeIds(startNodeIdList.toArray(new String[] {}));\n        }\n        \n        // Parse flow post handler\n        parseFlowPostHandler(map.get(DefConstants.FLOW_PROP_POST), flow, parseEl);\n        // Listener\n        parseListeners(map, flow, parseEl);\n        // Filter\n        parseFilters(map, flow, parseEl);\n        // Node filter\n        parseNodeFilter(map, flow, parseEl);\n\n        // Node pre handler filter\n        parseNodePreHandlerFilter(map, flow, parseEl);\n        // Node action filter\n        parseNodeActionFilter(map, flow, parseEl);\n        // Node post handler filter\n        parseNodePostHandlerFilter(map, flow, parseEl);\n        \n        // Flow pre handler filter\n        parseFlowPreHandlerFilter(map, flow, parseEl);\n        // Flow post handler filter\n        parseFlowPostHandlerFilter(map, flow, parseEl);        \n\n        // Flow runner\n        parseRunner(map, flow, parseEl);\n        \n        flow.postConstruct(map, null);\n        \n        triggerParseEvent(parseListeners, FlowParseEventTypes.PARSE_FLOW_END, map, flow, null, parseEl);\n        \n        \n        triggerParseEvent(parseListeners, FlowParseEventTypes.INIT_FLOW_START, map, flow, null, parseEl);\n        InitContext initContext = new InitContext();\n        initContext.setFlowParser(this);\n        initContext.setParseEl(parseEl);\n        initContext.setFlowList(flowList);\n        initContext.setFlowDefinitionMap(map);\n        initContext.setFlow(flow);\n        flow.init(initContext, null);\n        triggerParseEvent(parseListeners, FlowParseEventTypes.INIT_FLOW_END, map, flow, null, parseEl);\n        \n        for (int j = subFlowStartIndex; j < flowList.size(); j++) {\n            if (flowList.get(j).getProperty(PARENT_FLOW_ID_KEY) == null) {\n                flowList.get(j).setProperty(PARENT_FLOW_ID_KEY, flowList.get(subFlowStartIndex - 1).getId());\n            }\n        }\n        return flow;\n    }\n    \n    protected void parseFlowPreHandler(Object preDef, Flow flow, boolean parseEl) {\n        if (preDef == null) {\n            return;\n        }\n        if (preDef instanceof String) {\n            ExpFlowPreHandler handler = new ExpFlowPreHandler();\n            handler.setExp((String) preDef);\n            flow.setPreHandler(handler);\n            return;\n        }\n        Map<String, Object> pre = (Map<String, Object>) preDef;\n        String type = (String) pre.get(DefConstants.COMMON_PROP_TYPE);\n        if (DefConstants.COMMON_PROP_CREATE.equals(type) || pre.containsKey(DefConstants.COMMON_PROP_CREATE_EXP)) {\n            if (!parseEl) {\n                return;\n            }\n            String exp = (String) pre.get(DefConstants.COMMON_PROP_CREATE_EXP);\n            Map<String, Object> elContext = createElContext(pre, null, flow);\n            FlowPreHandler preHandler = getElEvaluator().evalWithDefaultContext(exp, elContext, false);\n            if (preHandler != null) {\n                preHandler.postConstruct(pre, null);\n                flow.setPreHandler(preHandler);\n            }\n            return;\n        } \n        throw new IllegalArgumentException(\"Param illegal \" + preDef);\n    }\n    \n    protected void parseFlowPostHandler(Object postDef, Flow flow, boolean parseEl) {\n        if (postDef == null) {\n            return;\n        }\n        if (postDef instanceof String) {\n            ExpFlowPostHandler handler = new ExpFlowPostHandler();\n            handler.setExp((String) postDef);\n            flow.setPostHandler(handler);\n            return;\n        }\n        Map<String, Object> post = (Map<String, Object>) postDef;\n        String type = (String) post.get(DefConstants.COMMON_PROP_TYPE);\n        if (DefConstants.COMMON_PROP_CREATE.equals(type) || post.containsKey(DefConstants.COMMON_PROP_CREATE_EXP)) {\n            if (!parseEl) {\n                return;\n            }\n            String exp = (String) post.get(DefConstants.COMMON_PROP_CREATE_EXP);\n            Map<String, Object> elContext = createElContext(post, null, flow);\n            FlowPostHandler postHandler = getElEvaluator().evalWithDefaultContext(exp, elContext, false);\n            if (postHandler != null) {\n                postHandler.postConstruct(post, null);\n                flow.setPostHandler(postHandler);\n            }\n            return;\n        } \n        throw new IllegalArgumentException(\"Param illegal \" + postDef);\n    }\n\n    /**\n     * Parse listener.\n     * \n     * @param map\n     * @param flow\n     * @param parseEl\n     */\n    private void parseListeners(Map<String, Object> map, Flow flow, boolean parseEl) {\n        List<Map<String, Object>> listeners = (List<Map<String, Object>>) map.get(DefConstants.FLOW_PROP_LISTENERS);\n        if (listeners != null) {\n            for (Object listenerObj : listeners) {\n                if (listenerObj instanceof String) {\n                    ExpFlowEventListener expListener = new ExpFlowEventListener((String) listenerObj);\n                    flow.getEventTrigger().addListener(expListener);\n                } else {\n                    Map<String, Object> listener = (Map<String, Object>) listenerObj;\n                    String type = (String) listener.get(DefConstants.COMMON_PROP_TYPE);\n                    if (DefConstants.COMMON_PROP_CREATE.equals(type)\n                            || listener.containsKey(DefConstants.COMMON_PROP_CREATE_EXP)) {\n                        if (parseEl) {\n                            String exp = (String) listener.get(DefConstants.COMMON_PROP_CREATE_EXP);\n                            Map<String, Object> elContext = createElContext(listener, null, flow);\n                            FlowEventListener eventListener = getElEvaluator().evalWithDefaultContext(exp, elContext,\n                                    false);\n                            if (eventListener != null) {\n                                eventListener.postConstruct(listener, null);\n                                flow.getEventTrigger().addListener(eventListener);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * Parse filter.\n     * \n     * @param map\n     * @param flow\n     * @param parseEl\n     */\n    private void parseFilters(Map<String, Object> map, Flow flow, boolean parseEl) {\n        List<Map<String, Object>> filters = (List<Map<String, Object>>) map.get(DefConstants.FLOW_PROP_FILTERS);\n        if (filters != null) {\n            for (Object filterObj : filters) {\n                if (filterObj instanceof String) {\n                    ExpFilter expFilter = new ExpFilter<>((String) filterObj);\n                    flow.getFilterManager().addFilter(expFilter);\n                } else {\n                    Map<String, Object> filter = (Map<String, Object>) filterObj;\n                    String type = (String) filter.get(DefConstants.COMMON_PROP_TYPE);\n                    if (DefConstants.COMMON_PROP_CREATE.equals(type)\n                            || filter.containsKey(DefConstants.COMMON_PROP_CREATE_EXP)) {\n                        if (parseEl) {\n                            String exp = (String) filter.get(DefConstants.COMMON_PROP_CREATE_EXP);\n                            Map<String, Object> elContext = createElContext(filter, null, flow);\n                            Filter flowFilter = getElEvaluator().evalWithDefaultContext(exp, elContext, false);\n                            if (flowFilter != null) {\n                                flowFilter.postConstruct(filter, null);\n                                flow.getFilterManager().addFilter(flowFilter);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * Parse node filter.\n     * \n     * @param map\n     * @param flow\n     * @param parseEl\n     */\n    private void parseNodeFilter(Map<String, Object> map, Flow flow, boolean parseEl) {\n        List<Map<String, Object>> nodeFilters = (List<Map<String, Object>>) map\n                .get(DefConstants.FLOW_PROP_NODE_FILTERS);\n        if (nodeFilters != null) {\n            for (Object filterObj : nodeFilters) {\n                if (filterObj instanceof String) {\n                    ExpFilter expFilter = new ExpFilter<>((String) filterObj);\n                    flow.getFilterManager().addFilter(expFilter);\n                } else {\n                    Map<String, Object> filter = (Map<String, Object>) filterObj;\n                    String type = (String) filter.get(DefConstants.COMMON_PROP_TYPE);\n                    if (DefConstants.COMMON_PROP_CREATE.equals(type)\n                            || filter.containsKey(DefConstants.COMMON_PROP_CREATE_EXP)) {\n                        if (parseEl) {\n                            String exp = (String) filter.get(DefConstants.COMMON_PROP_CREATE_EXP);\n                            Map<String, Object> elContext = createElContext(filter, null, flow);\n                            Filter nodeFilter = getElEvaluator().evalWithDefaultContext(exp, elContext, false);\n                            if (nodeFilter != null) {\n                                nodeFilter.postConstruct(filter, null);\n                                flow.getFilterManager().addNodeFilter(nodeFilter);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * Parse node pre handler filter.\n     * \n     * @param map\n     * @param flow\n     * @param parseEl\n     */\n    private void parseNodePreHandlerFilter(Map<String, Object> map, Flow flow, boolean parseEl) {\n        List<Map<String, Object>> nodePreHandlerFilters = (List<Map<String, Object>>) map\n                .get(DefConstants.FLOW_PROP_NODE_PRE_HANDLER_FILTERS);\n        if (nodePreHandlerFilters != null) {\n            for (Object filterObj : nodePreHandlerFilters) {\n                if (filterObj instanceof String) {\n                    ExpFilter expFilter = new ExpFilter<>((String) filterObj);\n                    flow.getFilterManager().addFilter(expFilter);\n                } else {\n                    Map<String, Object> filter = (Map<String, Object>) filterObj;\n                    String type = (String) filter.get(DefConstants.COMMON_PROP_TYPE);\n                    if (DefConstants.COMMON_PROP_CREATE.equals(type)\n                            || filter.containsKey(DefConstants.COMMON_PROP_CREATE_EXP)) {\n                        if (parseEl) {\n                            String exp = (String) filter.get(DefConstants.COMMON_PROP_CREATE_EXP);\n                            Map<String, Object> elContext = createElContext(filter, null, flow);\n                            Filter nodePreHandlerFilter = getElEvaluator().evalWithDefaultContext(exp, elContext, false);\n                            if (nodePreHandlerFilter != null) {\n                                nodePreHandlerFilter.postConstruct(filter, null);\n                                flow.getFilterManager().addNodePreHandlerFilter(nodePreHandlerFilter);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n    \n    /**\n     * Parse flow pre handler filter.\n     * \n     * @param map\n     * @param flow\n     * @param parseEl\n     */\n    private void parseFlowPreHandlerFilter(Map<String, Object> map, Flow flow, boolean parseEl) {\n        List<Map<String, Object>> flowPreHandlerFilters = (List<Map<String, Object>>) map\n                .get(DefConstants.FLOW_PROP_FLOW_PRE_HANDLER_FILTERS);\n        if (flowPreHandlerFilters != null) {\n            for (Object filterObj : flowPreHandlerFilters) {\n                if (filterObj instanceof String) {\n                    ExpFilter expFilter = new ExpFilter<>((String) filterObj);\n                    flow.getFilterManager().addFilter(expFilter);\n                } else {\n                    Map<String, Object> filter = (Map<String, Object>) filterObj;\n                    String type = (String) filter.get(DefConstants.COMMON_PROP_TYPE);\n                    if (DefConstants.COMMON_PROP_CREATE.equals(type)\n                            || filter.containsKey(DefConstants.COMMON_PROP_CREATE_EXP)) {\n                        if (parseEl) {\n                            String exp = (String) filter.get(DefConstants.COMMON_PROP_CREATE_EXP);\n                            Map<String, Object> elContext = createElContext(filter, null, flow);\n                            Filter flowPreHandlerFilter = getElEvaluator().evalWithDefaultContext(exp, elContext, false);\n                            if (flowPreHandlerFilter != null) {\n                                flowPreHandlerFilter.postConstruct(filter, null);\n                                flow.getFilterManager().addFlowPreHandlerFilter(flowPreHandlerFilter);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n    \n    /**\n     * Parse flow pre handler filter.\n     * \n     * @param map\n     * @param flow\n     * @param parseEl\n     */\n    private void parseFlowPostHandlerFilter(Map<String, Object> map, Flow flow, boolean parseEl) {\n        List<Map<String, Object>> flowPostHandlerFilters = (List<Map<String, Object>>) map\n                .get(DefConstants.FLOW_PROP_FLOW_POST_HANDLER_FILTERS);\n        if (flowPostHandlerFilters != null) {\n            for (Object filterObj : flowPostHandlerFilters) {\n                if (filterObj instanceof String) {\n                    ExpFilter expFilter = new ExpFilter<>((String) filterObj);\n                    flow.getFilterManager().addFilter(expFilter);\n                } else {\n                    Map<String, Object> filter = (Map<String, Object>) filterObj;\n                    String type = (String) filter.get(DefConstants.COMMON_PROP_TYPE);\n                    if (DefConstants.COMMON_PROP_CREATE.equals(type)\n                            || filter.containsKey(DefConstants.COMMON_PROP_CREATE_EXP)) {\n                        if (parseEl) {\n                            String exp = (String) filter.get(DefConstants.COMMON_PROP_CREATE_EXP);\n                            Map<String, Object> elContext = createElContext(filter, null, flow);\n                            Filter flowPostHandlerFilter = getElEvaluator().evalWithDefaultContext(exp, elContext, false);\n                            if (flowPostHandlerFilter != null) {\n                                flowPostHandlerFilter.postConstruct(filter, null);\n                                flow.getFilterManager().addFlowPostHandlerFilter(flowPostHandlerFilter);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * Parse node action filter.\n     * \n     * @param map\n     * @param flow\n     * @param parseEl\n     */\n    private void parseNodeActionFilter(Map<String, Object> map, Flow flow, boolean parseEl) {\n        List<Map<String, Object>> nodeActionFilters = (List<Map<String, Object>>) map\n                .get(DefConstants.FLOW_PROP_NODE_ACTION_FILTERS);\n        if (nodeActionFilters != null) {\n            for (Object filterObj : nodeActionFilters) {\n                if (filterObj instanceof String) {\n                    ExpFilter expFilter = new ExpFilter<>((String) filterObj);\n                    flow.getFilterManager().addFilter(expFilter);\n                } else {\n                    Map<String, Object> filter = (Map<String, Object>) filterObj;\n                    String type = (String) filter.get(DefConstants.COMMON_PROP_TYPE);\n                    if (DefConstants.COMMON_PROP_CREATE.equals(type)\n                            || filter.containsKey(DefConstants.COMMON_PROP_CREATE_EXP)) {\n                        if (parseEl) {\n                            String exp = (String) filter.get(DefConstants.COMMON_PROP_CREATE_EXP);\n                            Map<String, Object> elContext = createElContext(filter, null, flow);\n                            Filter nodeActionFilter = getElEvaluator().evalWithDefaultContext(exp, elContext, false);\n                            if (nodeActionFilter != null) {\n                                nodeActionFilter.postConstruct(filter, null);\n                                flow.getFilterManager().addNodeActionFilter(nodeActionFilter);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * Parse node post handler filter.\n     * \n     * @param map\n     * @param flow\n     * @param parseEl\n     */\n    private void parseNodePostHandlerFilter(Map<String, Object> map, Flow flow, boolean parseEl) {\n        List<Map<String, Object>> nodePostHandlerFilters = (List<Map<String, Object>>) map\n                .get(DefConstants.FLOW_PROP_NODE_POST_HANDLER_FILTERS);\n        if (nodePostHandlerFilters != null) {\n            for (Object filterObj : nodePostHandlerFilters) {\n                if (filterObj instanceof String) {\n                    ExpFilter expFilter = new ExpFilter<>((String) filterObj);\n                    flow.getFilterManager().addFilter(expFilter);\n                } else {\n                    Map<String, Object> filter = (Map<String, Object>) filterObj;\n                    String type = (String) filter.get(DefConstants.COMMON_PROP_TYPE);\n                    if (DefConstants.COMMON_PROP_CREATE.equals(type)\n                            || filter.containsKey(DefConstants.COMMON_PROP_CREATE_EXP)) {\n                        if (parseEl) {\n                            String exp = (String) filter.get(DefConstants.COMMON_PROP_CREATE_EXP);\n                            Map<String, Object> elContext = createElContext(filter, null, flow);\n                            Filter nodePostHandlerFilter = getElEvaluator().evalWithDefaultContext(exp, elContext,\n                                    false);\n                            if (nodePostHandlerFilter != null) {\n                                nodePostHandlerFilter.postConstruct(filter, null);\n                                flow.getFilterManager().addNodePostHandlerFilter(nodePostHandlerFilter);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * Parse flow runner.\n     * \n     * @param map\n     * @param flow\n     * @param parseEl\n     */\n    private void parseRunner(Map<String, Object> map, Flow flow, boolean parseEl) {\n        Object runnerObj = (Map<String, Object>) map.get(DefConstants.FLOW_PROP_RUNNER);\n        if (runnerObj != null) {\n            if (runnerObj instanceof String) {\n                ExpFlowRunner expFlowRunner = new ExpFlowRunner((String) runnerObj);\n                flow.setRunner(expFlowRunner);\n            } else {\n                Map<String, Object> runner = (Map<String, Object>) runnerObj;\n                String type = (String) runner.get(DefConstants.COMMON_PROP_TYPE);\n                if (DefConstants.COMMON_PROP_CREATE.equals(type)\n                        || runner.containsKey(DefConstants.COMMON_PROP_CREATE_EXP)) {\n                    if (parseEl) {\n                        String exp = (String) runner.get(DefConstants.COMMON_PROP_CREATE_EXP);\n                        Map<String, Object> elContext = createElContext(runner, null, flow);\n                        FlowRunner flowRunner = getElEvaluator().evalWithDefaultContext(exp, elContext, false);\n                        if (flowRunner != null) {\n                            flowRunner.postConstruct(runner, null);\n                            flow.setRunner(flowRunner);\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    @Override\n    public NodePreHandler parseNodePreHandler(PreParseParam param) {\n        Object preDef = param.getPreDef();\n        if (preDef == null) {\n            return null;\n        }\n        if (preDef instanceof String) {\n            ExpNodePreHandler handler = new ExpNodePreHandler();\n            handler.setExp((String) preDef);\n            return handler;\n        }\n        Map<String, Object> pre = (Map<String, Object>) preDef;\n        String type = (String) pre.get(DefConstants.COMMON_PROP_TYPE);\n        if (DefConstants.COMMON_PROP_CREATE.equals(type) || pre.containsKey(DefConstants.COMMON_PROP_CREATE_EXP)) {\n            if (!param.isParseEl()) {\n                return null;\n            }\n            String exp = (String) pre.get(DefConstants.COMMON_PROP_CREATE_EXP);\n            Map<String, Object> elContext = createElContext(pre, param.getNode(), param.getFlow());\n            NodePreHandler preHandler = getElEvaluator().evalWithDefaultContext(exp, elContext, false);\n            if (preHandler != null) {\n                preHandler.postConstruct(pre, null);\n            }\n            return preHandler;\n        } else if (DefConstants.COMMON_PROP_EXP.equals(type) || pre.containsKey(DefConstants.COMMON_PROP_EXP)) {\n            String exp = (String) pre.get(DefConstants.COMMON_PROP_EXP);\n            ExpNodePreHandler preHandler = new ExpNodePreHandler();\n            preHandler.setExp(exp);\n            preHandler.postConstruct(pre, null);\n            return preHandler;\n        } else if (DefConstants.NODE_PRE_TYPE_INCLUSIVECHECK.equals(type)) {\n            List<String> preNodes = (List<String>) pre.get(DefConstants.NODE_PRE_PROP_PRE_NODES);\n            InclusiveCheckPreHandler preHandler = new InclusiveCheckPreHandler();\n            preHandler.setPreNodes(preNodes);\n            preHandler.postConstruct(pre, null);\n            return preHandler;\n        } else if (DefConstants.NODE_PRE_TYPE_MULTICHECK.equals(type)\n                || pre.containsKey(DefConstants.NODE_PRE_PROP_PRE_NODES)) {\n            List<String> preNodes = (List<String>) pre.get(DefConstants.NODE_PRE_PROP_PRE_NODES);\n            MultiCheckPreHandler preHandler = new MultiCheckPreHandler();\n            preHandler.setPreNodes(preNodes);\n            preHandler.postConstruct(pre, null);\n            return preHandler;\n        }\n        throw new IllegalArgumentException(\"Param illegal \" + pre);\n\n    }\n\n    @Override\n    public NodeAction parseNodeAction(ActionParseParam param) {\n        Object actionDef = param.getActionDef();\n        if (actionDef == null) {\n            return null;\n        }\n        if (actionDef instanceof String) {\n            ExpNodeAction nodeAction = new ExpNodeAction();\n            nodeAction.setExp((String) actionDef);\n            return nodeAction;\n        }\n        Map<String, Object> action = (Map<String, Object>) actionDef;\n        String type = (String) action.get(DefConstants.COMMON_PROP_TYPE);\n        if (DefConstants.COMMON_PROP_CREATE.equals(type) || action.containsKey(DefConstants.COMMON_PROP_CREATE_EXP)) {\n            if (!param.isParseEl()) {\n                return null;\n            }\n            String exp = (String) action.get(DefConstants.COMMON_PROP_CREATE_EXP);\n            Map<String, Object> elContext = createElContext(action, param.getNode(), param.getFlow());\n            NodeAction nodeAction = getElEvaluator().evalWithDefaultContext(exp, elContext, false);\n            if (nodeAction != null) {\n                nodeAction.postConstruct(action, null);\n            }\n            return nodeAction;\n        } else if (DefConstants.COMMON_PROP_EXP.equals(type) || action.containsKey(DefConstants.COMMON_PROP_EXP)) {\n            ExpNodeAction nodeAction = new ExpNodeAction();\n            String exp = (String) action.get(DefConstants.COMMON_PROP_EXP);\n            nodeAction.setExp(exp);\n            nodeAction.postConstruct(action, null);\n            return nodeAction;\n        } else if (DefConstants.NODE_ACTION_TYPE_FLOW.equals(type) || (type == null && action.containsKey(DefConstants.COMMON_PROP_FLOW))\n                || (type == null && action.containsKey(DefConstants.COMMON_PROP_FLOW_ID))) {\n            FlowNodeAction nodeAction = new FlowNodeAction();\n            if (action.containsKey(DefConstants.COMMON_PROP_FLOW)) {\n                Flow flow = parse((Map<String, Object>) action.get(DefConstants.COMMON_PROP_FLOW), param.getFlowList(),\n                        param.isParseEl());\n                flow.setProperty(FLOW_STRING_KEY, JsonUtil.toJsonString(action.get(DefConstants.COMMON_PROP_FLOW)));\n                nodeAction.setFlowId(flow.getId());\n                nodeAction.setFlow(flow);\n            } else if (action.containsKey(DefConstants.COMMON_PROP_FLOW_ID)) {\n                nodeAction.setFlowId((String) action.get(DefConstants.COMMON_PROP_FLOW_ID));\n            }\n            Object startNodeId = action.get(DefConstants.NODE_ACTION_PROP_START_NODE_ID);\n            if (startNodeId != null) {\n                if (startNodeId instanceof String) {\n                    nodeAction.setStartNodeIds(new String[] { (String) startNodeId });\n                } else {\n                    nodeAction.setStartNodeIds(((List<String>) startNodeId).toArray(new String[] {}));\n                }\n            }\n            Boolean inherit = (Boolean) action.get(DefConstants.NODE_ACTION_PROP_INHERIT);\n            if (inherit != null) {\n                nodeAction.setInherit(inherit);\n            }\n            nodeAction.postConstruct(action, null);\n            return nodeAction;\n        } else if (DefConstants.NODE_ACTION_TYPE_EVENT.equals(type)) {\n            EventNodeAction nodeAction = new EventNodeAction();\n            nodeAction.postConstruct(action, null);\n            return nodeAction;\n        } else if (DefConstants.NODE_ACTION_TYPE_LOOP.equals(type)) {\n            LoopNodeAction nodeAction = new LoopNodeAction();\n            nodeAction.postConstruct(action, null);\n            return nodeAction;       \n        } else if (DefConstants.NODE_ACTION_TYPE_INTERRUPT.equals(type)) {\n            InterruptNodeAction nodeAction = new InterruptNodeAction();\n            nodeAction.postConstruct(action, null);\n            return nodeAction;\n        }else if (DefConstants.NODE_ACTION_TYPE_COMPENSATE.equals(type)) {\n            CompensateNodeAction nodeAction = new CompensateNodeAction();\n            nodeAction.postConstruct(action, null);\n            return nodeAction;\n        } else if (DefConstants.NODE_ACTION_TYPE_PARAM_EXECUTOR.equals(type)) {\n            ParamExecutorNodeAction nodeAction = new ParamExecutorNodeAction();\n            nodeAction.postConstruct(action, null);\n            return nodeAction;\n        }\n        throw new IllegalArgumentException(\"Param illegal \" + action);\n    }\n\n    @Override\n    public NodePostHandler parseNodePostHandler(PostParseParam param) {\n        Object postDef = param.getPostDef();\n        if (postDef == null) {\n            return null;\n        }\n        if (postDef instanceof String) {\n            ExpNodePostHandler postHandler = new ExpNodePostHandler();\n            String exp = (String) postDef;\n            postHandler.setExp(exp);\n            return postHandler;\n        }\n        Map<String, Object> post = (Map<String, Object>) postDef;\n        String type = (String) post.get(DefConstants.COMMON_PROP_TYPE);\n        if (DefConstants.COMMON_PROP_CREATE.equals(type) || post.containsKey(DefConstants.COMMON_PROP_CREATE_EXP)) {\n            if (!param.isParseEl()) {\n                return null;\n            }\n            String exp = (String) post.get(DefConstants.COMMON_PROP_CREATE_EXP);\n            Map<String, Object> elContext = createElContext(post, param.getNode(), param.getFlow());\n            NodePostHandler postHandler = getElEvaluator().evalWithDefaultContext(exp, elContext, false);\n            if (postHandler != null) {\n                postHandler.postConstruct(post, null);\n            }\n            return postHandler;\n        } else if (DefConstants.COMMON_PROP_EXP.equals(type) || post.containsKey(DefConstants.COMMON_PROP_EXP)) {\n            ExpNodePostHandler postHandler = new ExpNodePostHandler();\n            String exp = (String) post.get(DefConstants.COMMON_PROP_EXP);\n            postHandler.setExp(exp);\n            postHandler.postConstruct(post, null);\n            return postHandler;\n        } else if (DefConstants.NODE_POST_TYPE_CONDITION.equals(type)\n                || (type == null && post.containsKey(DefConstants.NODE_POST_PROP_CONDITIONS))\n                || (type == null && post.containsKey(DefConstants.NODE_POST_PROP_WHEN))) {\n            List<Map<String, Object>> conditionList = null;\n            if (post.containsKey(DefConstants.NODE_POST_PROP_CONDITIONS)) {\n                conditionList = (List<Map<String, Object>>) post.get(DefConstants.NODE_POST_PROP_CONDITIONS);\n            } else {\n                conditionList = Arrays.asList(post);\n            }\n\n            String conditionType = (String) post.get(DefConstants.NODE_POST_PROP_CONDITION_TYPE);\n            Object defaultBranch = post.get(DefConstants.NODE_POST_PROP_DEFAULT_TO);\n\n            ConditionalNodePostHandler postHandler = new ConditionalNodePostHandler(conditionType, conditionList,\n                    defaultBranch);\n            postHandler.postConstruct(post, null);\n            return postHandler;\n\n        } else if (DefConstants.NODE_POST_TYPE_FIXED.equals(type) || (type == null && post.containsKey(DefConstants.NODE_POST_PROP_TO))) {\n            Object nextStartId = post.get(DefConstants.NODE_POST_PROP_TO);\n            FixedNodePostHandler postHandler = new FixedNodePostHandler(nextStartId);\n            postHandler.postConstruct(post, null);\n            return postHandler;\n        } else if (DefConstants.NODE_POST_TYPE_EVENT.equals(type)) {\n            EventPostHandler postHandler = new EventPostHandler();\n            postHandler.postConstruct(post, null);\n            return postHandler;\n        }\n        throw new IllegalArgumentException(\"Param illegal \" + post);\n    }\n    \n    protected List<FlowParseEventListener> parseParseListeners(Map<String, Object> map, Flow flow, boolean parseEl) {\n        List<Map<String, Object>> parseListenerConfList = (List<Map<String, Object>>) map\n                .get(DefConstants.FLOW_PROP_PARSE_LISTENERS);\n        if (parseListenerConfList == null) {\n            return null;\n        }\n        List<FlowParseEventListener> parseListeners = new ArrayList<>();\n        for (Object listenerObj : parseListenerConfList) {\n            if (listenerObj instanceof String) {\n                ExpFlowParseEventListener parseListener = new ExpFlowParseEventListener((String) listenerObj);\n                parseListeners.add(parseListener);\n            } else {\n                Map<String, Object> listener = (Map<String, Object>) listenerObj;\n                String type = (String) listener.get(DefConstants.COMMON_PROP_TYPE);\n                if (DefConstants.COMMON_PROP_CREATE.equals(type)\n                        || listener.containsKey(DefConstants.COMMON_PROP_CREATE_EXP)) {\n                    if (parseEl) {\n                        String exp = (String) listener.get(DefConstants.COMMON_PROP_CREATE_EXP);\n                        Map<String, Object> elContext = createElContext(listener, null, flow);\n                        FlowParseEventListener parseListener = getElEvaluator().evalWithDefaultContext(exp, elContext,\n                                false);\n                        if (parseListener != null) {\n                            parseListener.postConstruct(listener, null);\n                            parseListeners.add(parseListener);\n                        }\n                    }\n                }\n            }\n        }\n        return parseListeners;\n    }\n\n    private void triggerParseEvent(List<FlowParseEventListener> listeners, String eventType,\n            Map<String, Object> flowDef, Flow flow, Object data, boolean parseEl) {\n        if (listeners == null || listeners.size() == 0) {\n            return;\n        }\n        FlowParseEvent event = new FlowParseEvent();\n        event.setType(eventType);\n        event.setFlow(flow);\n        event.setFlowDef(flowDef);\n        event.setData(data);\n        event.setFlowParser(this);\n        event.setParseEl(parseEl);\n        for (FlowParseEventListener listener : listeners) {\n            listener.on(event);\n        }\n    }\n\n    /**\n     * \n     * Convert java model to string.\n     *\n     * @param flow\n     * @return\n     */\n    @Override\n    public String stringify(Flow flow) {\n        if (flow.getProperty(FLOW_STRING_KEY) != null) {\n            return flow.getProperty(FLOW_STRING_KEY);\n        }\n        logger.warn(\"No original string definition, unsupported now. flowId: \" + flow.getId());\n        return null;\n    }\n\n    private Map<String, Object> createElContext(Map<String, Object> currentDef, FlowNode node, Flow flow) {\n        Map<String, Object> context = new HashMap<>(3);\n        context.put(\"definition\", currentDef);\n        if (node != null) {\n            context.put(\"node\", node);\n        }\n        if (flow != null) {\n            context.put(\"flow\", flow);\n        }\n        context.put(\"flowParser\", this);\n        return context;\n    }\n\n    public ElEvaluator getElEvaluator() {\n        if (elEvaluator == null) {\n            elEvaluator = ElFactory.get();\n        }\n        return elEvaluator;\n    }\n    \n    public void setElEvaluator(ElEvaluator elEvaluator) {\n        this.elEvaluator = elEvaluator;\n    }\n\n    public List<FlowParseEventListener> getPreListeners() {\n        return preListeners;\n    }\n\n    public void setPreListeners(List<FlowParseEventListener> preListeners) {\n        this.preListeners = preListeners;\n    }\n\n    public List<FlowParseEventListener> getPostListeners() {\n        return postListeners;\n    }\n\n    public void setPostListeners(List<FlowParseEventListener> postListeners) {\n        this.postListeners = postListeners;\n    }\n    \n    \n    \n    \n\n}"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/parser/event/ExpFlowParseEventListener.java",
    "content": "package com.jd.easyflow.flow.model.parser.event;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * \n * @author liyuliang5\n */\npublic class ExpFlowParseEventListener implements FlowParseEventListener {\n    \n    private String exp;\n    \n    public ExpFlowParseEventListener() {\n        \n    }\n    \n    public ExpFlowParseEventListener(String exp) {\n        this.exp = exp;\n    }\n\n    @Override\n    public void on(FlowParseEvent event) {\n        Map<String, Object> data =  new HashMap<>();\n        data.put(\"event\", event);\n        event.getFlowParser().getElEvaluator().evalWithDefaultContext(exp, data, false);\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/parser/event/FlowParseEvent.java",
    "content": "package com.jd.easyflow.flow.model.parser.event;\n\nimport java.util.Map;\n\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.flow.model.parser.FlowParser;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FlowParseEvent {\n    \n    private String type;\n    \n    private Map<String, Object> flowDef;\n    \n    private Flow flow;\n    \n    private Object data;\n    \n    private FlowParser flowParser;\n    \n    private boolean parseEl;\n    \n    \n    public Flow getFlow() {\n        return flow;\n    }\n\n    public void setFlow(Flow flow) {\n        this.flow = flow;\n    }\n\n    public String getType() {\n        return type;\n    }\n\n    public void setType(String type) {\n        this.type = type;\n    }\n\n    public Map<String, Object> getFlowDef() {\n        return flowDef;\n    }\n\n    public void setFlowDef(Map<String, Object> flowDef) {\n        this.flowDef = flowDef;\n    }\n\n    public Object getData() {\n        return data;\n    }\n\n    public void setData(Object data) {\n        this.data = data;\n    }\n\n    public FlowParser getFlowParser() {\n        return flowParser;\n    }\n\n    public void setFlowParser(FlowParser flowParser) {\n        this.flowParser = flowParser;\n    }\n\n    public boolean isParseEl() {\n        return parseEl;\n    }\n\n    public void setParseEl(boolean parseEl) {\n        this.parseEl = parseEl;\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/parser/event/FlowParseEventListener.java",
    "content": "package com.jd.easyflow.flow.model.parser.event;\n\nimport java.util.Map;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic interface FlowParseEventListener {\n    \n    public void on(FlowParseEvent event);\n    \n    default void postConstruct(Map<String, Object> definition, Map<String, Object> context) {}\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/parser/event/FlowParseEventTypes.java",
    "content": "package com.jd.easyflow.flow.model.parser.event;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FlowParseEventTypes {\n    \n    public static final String PARSE_FLOW_START = \"PARSE_FLOW_START\";\n    public static final String PARSE_FLOW_END = \"PARSE_FLOW_END\";\n\n    public static final String INIT_FLOW_START = \"INIT_FLOW_START\";\n    public static final String INIT_FLOW_END = \"INIT_FLOW_END\";\n    \n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/parser/param/ActionParseParam.java",
    "content": "package com.jd.easyflow.flow.model.parser.param;\n\nimport java.util.List;\n\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.parser.FlowParser;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ActionParseParam {\n\n    private Object actionDef;\n\n    private List<Flow> flowList;\n\n    private boolean parseEl;\n    \n    private Flow flow;\n    \n    private FlowNode node;\n\n    public ActionParseParam() {\n        // NOOP\n    }\n\n    public ActionParseParam(Object actionDef, List<Flow> flowList, boolean parseEl, Flow flow, FlowNode node) {\n        this.actionDef = actionDef;\n        this.flowList = flowList;\n        this.parseEl = parseEl;\n        this.flow = flow;\n        this.node = node;\n    }\n\n    public Object getActionDef() {\n        return actionDef;\n    }\n\n    public void setActionDef(Object actionDef) {\n        this.actionDef = actionDef;\n    }\n\n    public List<Flow> getFlowList() {\n        return flowList;\n    }\n\n    public void setFlowList(List<Flow> flowList) {\n        this.flowList = flowList;\n    }\n\n    public boolean isParseEl() {\n        return parseEl;\n    }\n\n    public void setParseEl(boolean parseEl) {\n        this.parseEl = parseEl;\n    }\n\n    public FlowNode getNode() {\n        return node;\n    }\n\n    public void setNode(FlowNode node) {\n        this.node = node;\n    }\n\n    public Flow getFlow() {\n        return flow;\n    }\n\n    public void setFlow(Flow flow) {\n        this.flow = flow;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/parser/param/FlowParseParam.java",
    "content": "package com.jd.easyflow.flow.model.parser.param;\n\nimport java.util.Map;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FlowParseParam {\n\n    private String stringDefinition;\n\n    private Object objectDefinition;\n\n    private boolean parseEl = true;\n\n    public FlowParseParam() {\n        // NOOP\n    }\n\n    public FlowParseParam(String stringDefinition) {\n        this.stringDefinition = stringDefinition;\n    }\n\n    public FlowParseParam(Object objectDefinition) {\n        this.objectDefinition = objectDefinition;\n    }\n\n    public FlowParseParam(String stringDefinition, boolean parseEl) {\n        this.stringDefinition = stringDefinition;\n        this.parseEl = parseEl;\n    }\n\n    public FlowParseParam(Object objectDefinition, boolean parseEl) {\n        this.objectDefinition = objectDefinition;\n        this.parseEl = parseEl;\n    }\n\n    public String getStringDefinition() {\n        return stringDefinition;\n    }\n\n    public void setStringDefinition(String stringDefinition) {\n        this.stringDefinition = stringDefinition;\n    }\n\n\n    public Object getObjectDefinition() {\n        return objectDefinition;\n    }\n\n    public void setObjectDefinition(Object objectDefinition) {\n        this.objectDefinition = objectDefinition;\n    }\n\n    public boolean isParseEl() {\n        return parseEl;\n    }\n\n    public void setParseEl(boolean parseEl) {\n        this.parseEl = parseEl;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/parser/param/PostParseParam.java",
    "content": "package com.jd.easyflow.flow.model.parser.param;\n\nimport java.util.List;\n\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.flow.model.FlowNode;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class PostParseParam {\n\n    private Object postDef;\n    \n    private List<Flow> flowList;\n\n    private boolean parseEl;\n    \n    private Flow flow;\n    \n    private FlowNode node;\n\n    public PostParseParam() {\n        // NOOP\n    }\n\n    public PostParseParam(Object postDef,List<Flow> flowList, boolean parseEl, Flow flow, FlowNode node) {\n        this.postDef = postDef;\n        this.flowList = flowList;\n        this.parseEl = parseEl;\n        this.flow = flow;\n        this.node = node;\n    }\n\n    public Object getPostDef() {\n        return postDef;\n    }\n\n    public void setPostDef(Object postDef) {\n        this.postDef = postDef;\n    }\n\n    public boolean isParseEl() {\n        return parseEl;\n    }\n\n    public void setParseEl(boolean parseEl) {\n        this.parseEl = parseEl;\n    }\n\n    public FlowNode getNode() {\n        return node;\n    }\n\n    public void setNode(FlowNode node) {\n        this.node = node;\n    }\n\n    public List<Flow> getFlowList() {\n        return flowList;\n    }\n\n    public void setFlowList(List<Flow> flowList) {\n        this.flowList = flowList;\n    }\n\n    public Flow getFlow() {\n        return flow;\n    }\n\n    public void setFlow(Flow flow) {\n        this.flow = flow;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/parser/param/PreParseParam.java",
    "content": "package com.jd.easyflow.flow.model.parser.param;\n\nimport java.util.List;\n\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.flow.model.FlowNode;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class PreParseParam {\n\n    private Object preDef;\n    \n    private List<Flow> flowList;\n\n    private boolean parseEl;\n    \n    private Flow flow;\n    \n    private FlowNode node;\n    \n    public PreParseParam() {\n        // NOOP\n    }\n    \n    public PreParseParam(Object preDef, List<Flow> flowList, boolean parseEl, Flow flow, FlowNode node) {\n        this.preDef = preDef;\n        this.flowList = flowList;\n        this.parseEl = parseEl;\n        this.flow = flow;\n        this.node = node;\n    }\n    \n\n    public Object getPreDef() {\n        return preDef;\n    }\n\n    public void setPreDef(Object preDef) {\n        this.preDef = preDef;\n    }\n\n    public boolean isParseEl() {\n        return parseEl;\n    }\n\n    public void setParseEl(boolean parseEl) {\n        this.parseEl = parseEl;\n    }\n\n    public FlowNode getNode() {\n        return node;\n    }\n\n    public void setNode(FlowNode node) {\n        this.node = node;\n    }\n\n    public List<Flow> getFlowList() {\n        return flowList;\n    }\n\n    public void setFlowList(List<Flow> flowList) {\n        this.flowList = flowList;\n    }\n\n    public Flow getFlow() {\n        return flow;\n    }\n\n    public void setFlow(Flow flow) {\n        this.flow = flow;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/post/AbstractNodePostHandler.java",
    "content": "package com.jd.easyflow.flow.model.post;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Map.Entry;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.InitContext;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.NodeExecutor;\nimport com.jd.easyflow.flow.model.NodePostHandler;\nimport com.jd.easyflow.flow.model.definition.DefConstants;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic abstract class AbstractNodePostHandler implements NodePostHandler {\n\n    private static final String IDX_VAR_PREFIX = \"$\";\n\n    protected NodeContext[] parseToNodes(Object to, NodeContext nodeContext, FlowContext context) {\n        if (to == null) {\n            return null;\n        }\n        if (to instanceof String) {\n            String toStr = (String) to;\n            if (!toStr.startsWith(IDX_VAR_PREFIX)) {\n                return new NodeContext[] { nodeId2Node(toStr) };\n            } else {\n                return new NodeContext[] { nodeId2Node(parseIndexVar(toStr, nodeContext, context)) };\n            }\n        } else if (to instanceof Integer) {\n            int toIdx = (Integer) to;\n            return new NodeContext[] { nodeId2Node(context.getFlow().getNodeList().get(toIdx).getId()) };\n        } else if (to instanceof List) {\n            List<Object> toList = (List) to;\n            List<NodeContext> toResult = new ArrayList<>(toList.size());\n            for (Object toObj : toList) {\n                NodeContext[] nodes = parseToNodes(toObj, nodeContext, context);\n                addArray2List(nodes, toResult);\n            }\n            NodeContext[] result = new NodeContext[toResult.size()];\n            return toResult.toArray(result);\n        } else if (to instanceof Map) {\n            Map<String, Object> toMap = (Map) to;\n            NodeContext[] toNodes = null; \n            String toExp = (String) toMap.get(\"exp\");\n            if (toExp != null) {\n                // parse exp\n                Object result = context.getElEvaluator().eval(toExp, nodeContext, context, null);\n                if (result == null) {\n                    return null;\n                } else if (result instanceof NodeContext[]) {\n                    toNodes = (NodeContext[]) result;\n                } else {\n                    toNodes = parseToNodes(result, nodeContext, context);\n                }\n            } else {\n                // parse node\n                Object node = toMap.get(\"node\");\n                toNodes = parseToNodes(node, nodeContext, context);\n            }\n            // fill context data\n            Map<String, Object> dataConf = (Map<String, Object>) toMap.get(\"data\");\n            if (dataConf != null && toNodes != null) {\n                for (Entry<String, Object> entry : dataConf.entrySet()) {\n                    Object value = parseDataValue(entry.getValue(), nodeContext, context);\n                    for (NodeContext node : toNodes) {\n                        node.put(entry.getKey(), value);\n                    }\n                }\n            }\n            return toNodes;\n        } else if (to instanceof NodeExecutor) {\n            Object result = ((NodeExecutor) to).execute(nodeContext, context);\n            if (result == null) {\n                return null;\n            } else if (result instanceof NodeContext[]) {\n                return (NodeContext[]) result;\n            } else {\n                return parseToNodes(result, nodeContext, context);\n            }\n            \n        } else {\n            throw new UnsupportedOperationException(\"Unsupported type:\" + to.getClass());\n        }\n    }\n    \n    protected Object parseToDefinition(Object to, FlowNode node, InitContext initContext) {\n        if (to instanceof List) {\n            List list = (List) to;\n            for (int i = 0; i < list.size(); i++) {\n                Object element = list.get(i);\n                if (element instanceof List || element instanceof Map) {\n                    list.set(i, parseToDefinition(element, node, initContext));\n                }\n            }\n        } else if (to instanceof Map) {\n            Map map = (Map) to;\n            if (map.get(\"type\") != null) {\n                throw new IllegalArgumentException(\"type is reserved\");\n            }\n            Map<String, Object> data = (Map<String, Object>) map.get(\"data\");\n\n            String createExp = (String) map.get(DefConstants.COMMON_PROP_CREATE_EXP);\n            if (createExp != null && initContext.isParseEl()) {\n                if (data != null) {\n                    throw new IllegalArgumentException(\"data is reserved\");\n                }\n                Map<String, Object> context = new HashMap<>(3);\n                context.put(\"definition\", map);\n                context.put(\"node\", node);\n                context.put(\"flow\", initContext.getFlow());\n                context.put(\"flowParser\", initContext.getFlowParser());\n                NodeExecutor<Boolean> executor = initContext.getFlowParser().getElEvaluator().evalWithDefaultContext(createExp, context, false);\n                return executor;\n            }\n            \n            if (data != null) {\n                for (Entry<String, Object> entry : data.entrySet()) {\n                    if (entry.getValue() instanceof Map) {\n                        entry.setValue(parseDataValueDefinition(entry.getValue(), node, initContext));\n                    }\n                }\n            }\n            \n        }\n        return to;\n    }\n    \n    private Object parseDataValueDefinition(Object dataValue, FlowNode node, InitContext initContext) {\n        if (dataValue instanceof Map) {\n            Map<String, Object> map = (Map<String, Object>) dataValue;\n            if (map.get(\"type\") != null) {\n                throw new IllegalArgumentException(\"type is reserved\");\n            }\n            String createExp = (String) map.get(DefConstants.COMMON_PROP_CREATE_EXP);\n            if (createExp != null && initContext.isParseEl()) {\n                Map<String, Object> context = new HashMap<>(3);\n                context.put(\"definition\", map);\n                context.put(\"node\", node);\n                context.put(\"flow\", initContext.getFlow());\n                context.put(\"flowParser\", initContext.getFlowParser());\n                NodeExecutor<Boolean> executor = initContext.getFlowParser().getElEvaluator().evalWithDefaultContext(createExp, context, false);\n                return executor;\n            }\n            \n        }\n        return dataValue;\n    }\n    \n    private Object parseDataValue(Object value, NodeContext nodeContext, FlowContext context) {\n        if (value instanceof String) {\n            return context.getElEvaluator().eval((String) value, nodeContext, context, null);\n        } else if (value instanceof Map) {\n            Map<String, Object> valueMap = (Map<String, Object>) value;\n            if (valueMap.containsKey(DefConstants.COMMON_PROP_EXP)) {\n                String exp = (String) valueMap.get(DefConstants.COMMON_PROP_EXP);\n                return context.getElEvaluator().eval(exp, nodeContext, context, null);\n            } else if (valueMap.containsKey(\"fixedValue\")) {\n                return valueMap.get(\"fixedValue\");\n            } else {\n                throw new IllegalArgumentException(\"illegal data map, \" + value);\n            }\n            \n        } else if (value instanceof NodeExecutor) {\n            return ((NodeExecutor) value).execute(nodeContext, context);\n        }  else {\n            throw new IllegalArgumentException(\"illegal data \" + value);\n        }\n    }\n    \n    private String parseIndexVar(String var, NodeContext nodeContext, FlowContext flowContext) {\n        int index = -1;\n        Flow flow = flowContext.getFlow();\n        switch (var) {\n        case \"$first\": {\n            index = 0;\n            break;\n        }\n        case \"$last\": {\n            index = flow.getNodeList().size() - 1;\n            break;\n        }\n        case \"$previous\": {\n            index = flow.getNodeIndex(nodeContext.getNodeId()) - 1;\n            break;\n        }\n        case \"$next\": {\n            index = flow.getNodeIndex(nodeContext.getNodeId()) + 1;\n            break;\n        }\n        default: {\n            throw new UnsupportedOperationException(\"Unsupported vars:\" + var);\n        }\n        }\n        return flow.getNodeList().get(index).getId();\n    }\n\n    protected NodeContext[] list2Array(List<NodeContext> list) {\n        if (list == null) {\n            return null;\n        }\n        NodeContext[] nodes = new NodeContext[list.size()];\n        return list.toArray(nodes);\n    }\n\n    protected NodeContext[] nodeIds2Nodes(List<String> nodeIds) {\n        if (nodeIds == null) {\n            return null;\n        }\n        NodeContext[] nodes = new NodeContext[nodeIds.size()];\n        for (int i = 0; i < nodeIds.size(); i++) {\n            nodes[i] = new NodeContext(nodeIds.get(i));\n        }\n        return nodes;\n    }\n\n    protected NodeContext nodeId2Node(String nodeId) {\n        if (nodeId == null) {\n            return null;\n        }\n        return new NodeContext(nodeId);\n    }\n\n    protected void addArray2List(NodeContext[] nodes, List<NodeContext> list) {\n        if (nodes == null) {\n            return;\n        }\n        for (NodeContext node : nodes) {\n            list.add(node);\n        }\n    }\n    \n}"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/post/ConditionalNodePostHandler.java",
    "content": "package com.jd.easyflow.flow.model.post;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.InitContext;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.NodeExecutor;\nimport com.jd.easyflow.flow.model.definition.DefConstants;\nimport com.jd.easyflow.flow.util.FlowUtil;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ConditionalNodePostHandler extends AbstractNodePostHandler {\n\n    private static final Logger logger = LoggerFactory.getLogger(ConditionalNodePostHandler.class);\n\n    public static final String EXCLUSIVE_TYPE = \"exclusive\";\n\n    public static final String INCLUSIVE_TYPE = \"inclusive\";\n\n    private String type;\n\n    private List<Map<String, Object>> branchList;\n    \n    private List<Branch> branchInfoList;\n\n    private Object defaultBranch;\n    \n    public ConditionalNodePostHandler() {\n    }\n\n    public ConditionalNodePostHandler(Map<String, Object> branch) {\n        this.branchList = Arrays.asList(branch);\n    }\n\n    public ConditionalNodePostHandler(List<Map<String, Object>> branchList) {\n        this.branchList = branchList;\n    }\n\n    public ConditionalNodePostHandler(String type, List<Map<String, Object>> branchList, Object defaultBranch) {\n        this.type = type;\n        this.branchList = branchList;\n        this.defaultBranch = defaultBranch;\n    }\n\n    @Override\n    public NodeContext[] postHandle(NodeContext nodeContext, FlowContext context) {\n        if (branchInfoList == null) {\n            init(nodeContext, context);\n        }\n        // Exclusive\n        if (type == null || type.equals(EXCLUSIVE_TYPE)) {\n            for (Branch branch : branchInfoList) {\n                boolean result = branch.when == null ? true : branch.when.execute(nodeContext, context);\n                if (result) {\n                    return parseToNodes(branch.to, nodeContext, context);\n                }\n            }\n            if (defaultBranch != null) {\n                return parseToNodes(defaultBranch, nodeContext, context);\n            }\n            // Inclusive\n        } else {\n            List<NodeContext> nextList = new ArrayList<>();\n            for (Branch branch : branchInfoList) {\n                boolean result = branch.when == null ? true : branch.when.execute(nodeContext, context);\n                if (result) {\n                    addArray2List(parseToNodes(branch.to, nodeContext, context), nextList);\n                }\n            }\n            if (nextList.isEmpty() && defaultBranch != null) {\n                addArray2List(parseToNodes(defaultBranch, nodeContext, context), nextList);\n            }\n            if (!nextList.isEmpty()) {\n                return list2Array(nextList);\n            }\n        }\n        return null;\n    }\n\n    \n    private void init(NodeContext nodeContext, FlowContext context) {\n        InitContext initContext = new InitContext();\n        initContext.setFlowParser(context.getFlowEngine().getFlowParser());\n        initContext.setParseEl(true);\n        FlowNode node = FlowUtil.node(nodeContext, context);\n        init(initContext, node);\n    }\n    \n    @Override\n    public void init(InitContext initContext, Object parent) {\n        List<Branch> branchInfoList = new ArrayList<ConditionalNodePostHandler.Branch>();\n        for (Map<String, Object> branch : branchList) {\n            Branch branchInfo = new Branch();\n            Object whenObj = branch.get(\"when\");\n            if (whenObj == null) {\n                branchInfo.when = null;\n            } else if (whenObj instanceof String) {\n                branchInfo.when = new ExpWhen((String) whenObj);\n            } else if (whenObj instanceof Map) {\n                Map<String, Object> map = (Map<String, Object>) whenObj;\n                String type = (String) map.get(DefConstants.COMMON_PROP_TYPE);\n                String createExp = (String) map.get(DefConstants.COMMON_PROP_CREATE_EXP);\n                if (DefConstants.COMMON_PROP_CREATE.equals(type) || createExp != null) {\n                    if (initContext.isParseEl()) {\n                        Map<String, Object> context = new HashMap<>(3);\n                        context.put(\"definition\", map);\n                        context.put(\"node\", (FlowNode) parent);\n                        context.put(\"flow\", initContext.getFlow());\n                        context.put(\"flowParser\", initContext.getFlowParser());\n                        NodeExecutor<Boolean> executor = initContext.getFlowParser().getElEvaluator().evalWithDefaultContext(createExp, context, false);\n                        branchInfo.when = new ExecutorWhen(executor);\n                    }\n                } else {\n                    throw new IllegalArgumentException(\"illegal param \" + branch);\n                }\n            } else if (whenObj instanceof NodeExecutor) {\n                branchInfo.when = new ExecutorWhen((NodeExecutor) whenObj);\n            } else {\n                throw new IllegalArgumentException(\"illegal param \" + branch);\n            }\n            \n            branchInfo.to = parseToDefinition(branch.get(\"to\"), (FlowNode) parent, initContext);\n            branchInfoList.add(branchInfo);\n        }\n        this.branchInfoList = branchInfoList;\n        if (this.defaultBranch != null) {\n            this.defaultBranch = parseToDefinition(defaultBranch, (FlowNode) parent, initContext);\n        }\n    }\n\n    public String getType() {\n        return type;\n    }\n\n    public void setType(String type) {\n        this.type = type;\n    }\n\n    public Object getDefaultBranch() {\n        return defaultBranch;\n    }\n\n    public void setDefaultBranch(Object defaultBranch) {\n        this.defaultBranch = defaultBranch;\n    }\n\n    public List<Map<String, Object>> getBranchList() {\n        return branchList;\n    }\n\n    public void setBranchList(List<Map<String, Object>> branchList) {\n        this.branchList = branchList;\n    }\n\n    private static class Branch {\n        private When when;\n        private Object to;\n    }\n    \n    private static interface When {\n        \n        public boolean execute(NodeContext nodeContext, FlowContext context);\n    }\n    \n    private static class ExpWhen implements When {\n        \n        String exp;\n        \n        ExpWhen(String exp) {\n            this.exp = exp;\n        }\n\n        @Override\n        public boolean execute(NodeContext nodeContext, FlowContext context) {\n            return context.getElEvaluator().eval(exp, nodeContext, context, null);\n        }\n        \n    }\n    \n    private static class ExecutorWhen implements When {\n        \n        NodeExecutor<Boolean> executor;\n        \n        ExecutorWhen(NodeExecutor<Boolean> executor) {\n            this.executor = executor;\n        }\n\n        @Override\n        public boolean execute(NodeContext nodeContext, FlowContext context) {\n            return executor.execute(nodeContext, context);\n        }\n        \n        \n    }\n    \n}"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/post/EventPostHandler.java",
    "content": "package com.jd.easyflow.flow.model.post;\n\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.event.FlowEventListener;\nimport com.jd.easyflow.flow.engine.event.impl.EventFlowListener;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.InitContext;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.NodePostHandler;\nimport com.jd.easyflow.flow.model.parser.param.PostParseParam;\nimport com.jd.easyflow.flow.util.FlowConstants;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class EventPostHandler implements NodePostHandler {\n\n    private static final Logger logger = LoggerFactory.getLogger(EventPostHandler.class);\n    \n    private boolean autoAddEventFlowListener = true;\n    \n    public EventPostHandler() {\n    }\n\n    public EventPostHandler(boolean autoAddEventFlowListener) {\n        this.autoAddEventFlowListener = autoAddEventFlowListener;\n    }\n    \n    @Override\n    public void init(InitContext initContext, Object flowNode) {\n        initEventPostHandlerMap(initContext, (FlowNode) flowNode);\n        if (autoAddEventFlowListener) {\n            List<FlowEventListener> listeners = initContext.getFlow().getEventTrigger().getListenerList();\n            boolean exists = false;\n            if (listeners != null) {\n                for (FlowEventListener listener : listeners) {\n                    if (listener instanceof EventFlowListener) {\n                        exists = true;\n                        break;\n                    }\n                }\n            }\n            if (! exists) {\n                logger.info(\"Auto add EventFlowListener\");\n                initContext.getFlow().getEventTrigger().addListener(new EventFlowListener());\n            }\n        }\n    }\n\n    @Override\n    public NodeContext[] postHandle(NodeContext nodeContext, FlowContext context) {\n        String event = nodeContext.get(FlowConstants.NODE_CONTEXT_DATA_EVENT);\n        if (context.isLogOn() && logger.isInfoEnabled()) {\n            logger.info(\"Event:\" + event);\n        }\n        if (event == null) {\n            event = FlowConstants.NONE_EVENT;\n        }\n\n        Map<String, NodePostHandler> eventPostHandlerMap = context.getFlow().getNode(nodeContext.getNodeId())\n                .getProperty(FlowConstants.PROP_RUNTIME_EVENT_POST_HANDLER_MAP);\n        NodePostHandler postHandler = eventPostHandlerMap.get(event);\n        if (postHandler == null) {\n            if (context.isLogOn() && logger.isInfoEnabled()) {\n                logger.info(\"Event post handler is null\");\n            }\n            return null;\n        }\n        return postHandler.postHandle(nodeContext, context);\n    }\n\n    private void initEventPostHandlerMap(InitContext initContext, FlowNode flowNode) {\n        Map<String, Object> eventPostHandlerMap = flowNode\n                .getProperty(FlowConstants.PROP_RUNTIME_EVENT_POST_HANDLER_MAP);\n        if (eventPostHandlerMap != null) {\n            return;\n        }\n        eventPostHandlerMap = new ConcurrentHashMap<String, Object>();\n        flowNode.setProperty(FlowConstants.PROP_RUNTIME_EVENT_POST_HANDLER_MAP, eventPostHandlerMap);\n        Map<String, Object> map = flowNode.getProperty(FlowConstants.NODE_PROP_EVENTS);\n        if (map == null) {\n            return;\n        }\n        for (Entry<String, Object> entry : map.entrySet()) {\n            String event = entry.getKey();\n            Object eventConf = (Object) entry.getValue();\n            Map<String, Object> eventPostHandlerConfMap = null;\n            if (eventConf instanceof Map) {\n                Map<String, Object> eventConfMap = (Map<String, Object>) eventConf;\n                eventPostHandlerConfMap = (Map<String, Object>) eventConfMap.get(\"post\");\n            }\n            if (eventPostHandlerConfMap != null) {\n                NodePostHandler nodePostHandler = initContext.getFlowParser()\n                        .parseNodePostHandler(new PostParseParam(eventPostHandlerConfMap, initContext.getFlowList(),\n                                initContext.isParseEl(), initContext.getFlow(), flowNode));\n                if (nodePostHandler != null) {\n                    nodePostHandler.init(initContext, flowNode);\n                    eventPostHandlerMap.put(event, nodePostHandler);\n                }\n            }\n        }\n\n    }\n\n    public boolean isAutoAddEventFlowListener() {\n        return autoAddEventFlowListener;\n    }\n\n    public void setAutoAddEventFlowListener(boolean autoAddEventFlowListener) {\n        this.autoAddEventFlowListener = autoAddEventFlowListener;\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/post/ExecutorNodePostHandler.java",
    "content": "package com.jd.easyflow.flow.model.post;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.NodeExecutor;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ExecutorNodePostHandler extends AbstractNodePostHandler {\n\t\n\tprivate NodeExecutor<? extends Object> executor;\n\t\n\tpublic ExecutorNodePostHandler(NodeExecutor<? extends Object> executor) {\n\t\tthis.executor = executor;\n\t}\n\n\t@Override\n\tpublic NodeContext[] postHandle(NodeContext nodeContext, FlowContext context) {\n\t\tObject nodeIds = executor.execute(nodeContext, context);\n\t\treturn super.parseToNodes(nodeIds, nodeContext, context);\n\t}\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/post/ExpNodePostHandler.java",
    "content": "package com.jd.easyflow.flow.model.post;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ExpNodePostHandler extends AbstractNodePostHandler {\n\t\n\tprivate static final Logger logger = LoggerFactory.getLogger(ExpNodePostHandler.class);\n\n    private String exp;\n    \n    public ExpNodePostHandler() {\n\t}\n    public ExpNodePostHandler(String exp) {\n    \tthis.exp = exp;\n    }\n\n\t@Override\n\tpublic NodeContext[] postHandle(NodeContext nodeContext, FlowContext context) {\n\t\tObject result = context.getElEvaluator().eval(exp, nodeContext, context, null);\n\t\treturn parseToNodes(result, nodeContext, context);\n\t}\n\tpublic String getExp() {\n\t\treturn exp;\n\t}\n\tpublic void setExp(String exp) {\n\t\tthis.exp = exp;\n\t}\n\t\n\t\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/post/FixedNodePostHandler.java",
    "content": "package com.jd.easyflow.flow.model.post;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.InitContext;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FixedNodePostHandler extends AbstractNodePostHandler {\n    \n    private Object to;\n    \n    public FixedNodePostHandler() {\n        \n    }\n\n\tpublic FixedNodePostHandler(Object to) {\n\t    this.to = to;\n\t}\n\n\t@Override\n\tpublic NodeContext[] postHandle(NodeContext nodeContext, FlowContext context) {\n\t    return parseToNodes(to, nodeContext, context);\n\t}\n\t\n    @Override\n    public void init(InitContext initContext, Object parent) {\n        if (to != null) {\n            to = parseToDefinition(to, (FlowNode)  parent, initContext);\n        }\n    }\n\n    public Object getTo() {\n        return to;\n    }\n\n    public void setTo(Object to) {\n        this.to = to;\n    }\n\t\n\t\n\n}"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/pre/ExpNodePreHandler.java",
    "content": "package com.jd.easyflow.flow.model.pre;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.NodePreHandler;\nimport com.jd.easyflow.flow.model.post.ExpNodePostHandler;\n\n/**\n * \n * IMPORTANT NOTICE! This class should not be singleton!\n * @author liyuliang5\n *\n */\npublic class ExpNodePreHandler implements NodePreHandler {\n\n\tprivate static final Logger logger = LoggerFactory.getLogger(ExpNodePostHandler.class);\n\n\tprivate String exp;\n\n\tpublic ExpNodePreHandler() {\n\t}\n\n\tpublic ExpNodePreHandler(String exp) {\n\t\tthis.exp = exp;\n\t}\n\n\t@Override\n\tpublic boolean preHandle(NodeContext nodeContext, FlowContext context) {\n\t\tboolean result = context.getElEvaluator().eval(exp, nodeContext, context, null);\n\t\tif (context.isLogOn() && logger.isInfoEnabled()) {\n\t\t    logger.info(\"Exp:\" + exp + \" result:\" + result);\n\t\t}\n\t\treturn result;\n\t}\n\n\tpublic String getExp() {\n\t\treturn exp;\n\t}\n\n\tpublic void setExp(String exp) {\n\t\tthis.exp = exp;\n\t}\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/pre/InclusiveCheckPreHandler.java",
    "content": "package com.jd.easyflow.flow.model.pre;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.Iterator;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.exception.FlowException;\nimport com.jd.easyflow.flow.filter.Filter;\nimport com.jd.easyflow.flow.filter.FilterChain;\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.InitContext;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.NodeContextAccessor;\nimport com.jd.easyflow.flow.model.NodePreHandler;\nimport com.jd.easyflow.flow.model.filter.impl.BaseNodeFilter;\nimport com.jd.easyflow.flow.util.FlowConstants;\nimport com.jd.easyflow.flow.util.FlowNodeLinkUtil;\nimport com.jd.easyflow.flow.util.LockUtil;\nimport com.jd.easyflow.flow.util.Triple;\n\n/**\n * Inclusive check pre handler.\n * \n *  IMPORTANT NOTICE! This class should not be singleton!\n * \n * @author liyuliang5\n *\n */\npublic class InclusiveCheckPreHandler implements NodePreHandler, NodePrePropertyGetter {\n\n    private static final Logger logger = LoggerFactory.getLogger(InclusiveCheckPreHandler.class);\n    \n    private static final String CTX_INCLUSIVE_LOCK = \"_inclusive_lock\";\n\n\n    private List<String> preNodes;\n\n    public InclusiveCheckPreHandler() {\n    }\n\n    public InclusiveCheckPreHandler(List<String> preNodes) {\n        this.preNodes = preNodes;\n    }\n    \n    @Override\n    public boolean preHandle(NodeContext nodeContext, final FlowContext context) {\n        Boolean checkResult = nodeContext.get(FlowConstants.NODECTX_PRE_RESULT);\n        if (checkResult != null) {\n            if (context.isLogOn() && logger.isInfoEnabled()) {\n                logger.info(\"Pre result checked:\" + checkResult);\n            }\n            return checkResult;\n        }\n        \n        NodeContext previousNode = nodeContext.getPreviousNode();\n        if (previousNode == null) {\n            return false;\n        }\n        String previousNodeId = previousNode.getNodeId();\n        boolean result = false;\n        Map<String, WaitingNodeInfo> map = null;\n        WaitingNodeInfo waitingNodeInfo = null;\n        \n        \n        Object lockObj = LockUtil.getFlowContextLock(CTX_INCLUSIVE_LOCK, context);\n        synchronized (lockObj) {\n            map = context.get(InclusiveCheckHelper.CTX_WAITING_NODE_MAP);\n            if (map == null) {\n                map = new HashMap<String, WaitingNodeInfo>();\n                context.put(InclusiveCheckHelper.CTX_WAITING_NODE_MAP, map);\n            }\n            waitingNodeInfo = map.get(nodeContext.getNodeId());\n            if (waitingNodeInfo == null) {\n                waitingNodeInfo = new WaitingNodeInfo();\n                waitingNodeInfo.waitNodeId = nodeContext.getNodeId();\n                waitingNodeInfo.unknownPreNodes = new HashSet<String>();\n                waitingNodeInfo.finishedPreNodes = new HashSet<String>();\n                waitingNodeInfo.unreachablePreNodes = new HashSet<String>();\n                waitingNodeInfo.previousNodes = new ArrayList<NodeContext>();\n                \n                FlowNode currentNode = context.getFlow().getNode(nodeContext.getNodeId());\n                List<String> preNodeList = this.getPreNodes(nodeContext, context);\n                List<String> configPreNodes = preNodeList != null ? preNodeList\n                        : currentNode.getProperty(FlowConstants.PROP_PRENODES);\n                if (! configPreNodes.contains(previousNodeId)) {\n                    if (context.isLogOn() && logger.isDebugEnabled()) {\n                        logger.info(\"Node:\" + previousNodeId + \" not in check list\" );\n                    }\n                    return false;\n                }\n                for (String preNode : configPreNodes) {\n                    if (FlowNodeLinkUtil.isReachable(preNode, nodeContext.getNodeId(), context.getFlow())) {\n                        waitingNodeInfo.unknownPreNodes.add(preNode);\n                    } else {\n                        waitingNodeInfo.unreachablePreNodes.add(preNode);\n                    }\n                }\n                map.put(nodeContext.getNodeId(), waitingNodeInfo);\n            }\n            waitingNodeInfo.previousNodes.add(previousNode);\n            waitingNodeInfo.finishedPreNodes.add(previousNodeId);\n            waitingNodeInfo.unknownPreNodes.remove(previousNodeId);\n            if (waitingNodeInfo.unknownPreNodes.size() == 0) {\n                result = true;\n            } else {\n                InclusiveCheckHelper.judgeOneWaitingNode(waitingNodeInfo, context);\n                if (waitingNodeInfo.unknownPreNodes.size() == 0) {\n                    result = true;\n                } else {\n                    if (context.isLogOn() && logger.isDebugEnabled()) {\n                        logger.debug(\"Finish nodes:\" + waitingNodeInfo.finishedPreNodes + \" Unreachable nodes:\" + waitingNodeInfo.unreachablePreNodes + \" Unknown nodes:\" + waitingNodeInfo.unknownPreNodes);\n                    }\n                    return false;\n                }\n            }\n            \n        }\n        if (result) {\n            if (context.isLogOn() && logger.isInfoEnabled()) {\n                logger.info(\"Node:\" + nodeContext.getNodeId() + \" is activated\");\n            }\n            map.remove(nodeContext.getNodeId());\n            nodeContext.put(FlowConstants.NODECTX_PREVIOUS_NODES, waitingNodeInfo.previousNodes);\n            NodePreHandlerHelper.setNextNodesOfPreviousNode(waitingNodeInfo.previousNodes, nodeContext);\n        }\n        return result;\n    }\n\n    public List<String> getPreNodes() {\n        return preNodes;\n    }\n\n    public void setPreNodes(List<String> preNodes) {\n        this.preNodes = preNodes;\n    }\n\n    @Override\n    public String getCheckType() {\n        return FlowConstants.NODE_PRE_CHECK_TYPE_INCLUSIVECHECK;\n    }\n\n    @Override\n    public List<String> getPreNodes(NodeContext nodeContext, FlowContext flowContext) {\n        return this.preNodes;\n    }\n    \n    @Override\n    public void init(InitContext initContext, Object parent) {\n        boolean recordHistory = ! Boolean.FALSE.equals(initContext.getFlow().getProperty(FlowConstants.FLOW_PROPERTY_RECORD_HISTORY));\n        if (! recordHistory) {\n            throw new FlowException(\"InclusiveCheck must record history\");\n        }\n        Flow flow = initContext.getFlow();\n        List<Filter<Triple<FlowNode, NodeContext, FlowContext>, NodeContext>> filters = flow.getFilterManager().getNodeFilters();\n        boolean contains = false;\n        if (filters == null) {\n            filters = new ArrayList<Filter<Triple<FlowNode, NodeContext, FlowContext>, NodeContext>>();\n            initContext.getFlow().getFilterManager().setNodeFilters(filters);\n        }\n        for (Filter filter : filters) {\n            if (filter instanceof InclusiveCheckWaitNodeProcessFilter) {\n                contains = true;\n                break;\n            }\n        }\n        if (!contains) {\n            // after compensate filter.\n            filters.add(0, new InclusiveCheckWaitNodeProcessFilter(Integer.MAX_VALUE - 1));\n            initContext.getFlow().getFilterManager().setNodeFilters(filters);\n        }\n    }\n    \n    public static class InclusiveCheckWaitNodeProcessFilter extends BaseNodeFilter {\n        \n        private static final Logger logger = LoggerFactory.getLogger(InclusiveCheckWaitNodeProcessFilter.class);\n        \n        public InclusiveCheckWaitNodeProcessFilter(int order) {\n            this.order = order;\n        }\n\n        @Override\n        public NodeContext doFilter(Triple<FlowNode, NodeContext, FlowContext> request,\n                FilterChain<Triple<FlowNode, NodeContext, FlowContext>, NodeContext> chain) {\n            chain.doFilter(request);\n            NodeContext nodeContext = request.getMiddle();\n            FlowContext flowContext = request.getRight();\n            Object lockObj = LockUtil.getFlowContextLock(CTX_INCLUSIVE_LOCK, flowContext);\n            synchronized (lockObj) {\n                nodeContext.put(InclusiveCheckWaitNodeProcessFilter.class.getName(), true);\n                Map<String, WaitingNodeInfo> map = flowContext.get(InclusiveCheckHelper.CTX_WAITING_NODE_MAP);\n                if (map != null && !map.isEmpty()) {\n                    List<NodeContext> additionalNextNodes = null;\n                    for (WaitingNodeInfo info : map.values()) {\n                        if (info.waitNodeId.equals(nodeContext.getNodeId())) {\n                            continue;\n                        }\n                        InclusiveCheckHelper.judgeOneWaitingNode(info, flowContext);\n                        if (info.unknownPreNodes.isEmpty()) {\n                            if (flowContext.isLogOn() && logger.isInfoEnabled()) {\n                                logger.info(\"Node:\" + info.waitNodeId + \" is activated in filter\");\n                            }\n                            if (additionalNextNodes == null) {\n                                additionalNextNodes = new ArrayList<NodeContext>();\n                                if (nodeContext.getNextNodes() != null) {\n                                    for (NodeContext nc : nodeContext.getNextNodes()) {\n                                        additionalNextNodes.add(nc);\n                                    }\n                                }\n                            }\n                            NodeContext additionNode = new NodeContext(info.waitNodeId);\n                            additionalNextNodes.add(additionNode);\n                        }\n                    }\n                    if (additionalNextNodes != null) {\n                        NodeContextAccessor.setNextNodes(nodeContext, additionalNextNodes.toArray(new NodeContext[additionalNextNodes.size()]));\n                    }\n                }\n            }\n            return nodeContext;\n        }\n    }\n    \n    private static class InclusiveCheckHelper {\n        \n        \n        static final String CTX_WAITING_NODE_MAP = \"_WAITING_NODE_MAP\";\n        static final String CTX_RUNNING_NODES = \"_RUNNING_NODES\";\n        \n        private static final List<String> EMPTY_LIST = new ArrayList<String>();\n\n        static void judgeOneWaitingNode(WaitingNodeInfo info, FlowContext context) {\n            Set<NodeContext> runningNodes = refreshRunningNodes(context);\n            Map<String, WaitingNodeInfo> map = context.get(CTX_WAITING_NODE_MAP);\n            Iterator<String> iterator = info.unknownPreNodes.iterator();\n            while (iterator.hasNext()) {\n                String unknownPreNode = iterator.next();\n                boolean reachable = false;\n                for (NodeContext nodeContext : runningNodes) {\n                    if (nodeContext.getNodeId().equals(unknownPreNode)) {\n                        reachable = true;\n                        break;\n                    }\n                    if (nodeContext.getNodeId().equals(info.waitNodeId)) {\n                        if (nodeContext.getPreviousNode() != null && nodeContext.getPreviousNode().getNodeId().equals(unknownPreNode)) {\n                            reachable = true;\n                            break;\n                        } else {\n                            continue;\n                        }\n                    }\n                    if (FlowNodeLinkUtil.isReachable(nodeContext.getNodeId(), unknownPreNode, context.getFlow())) {\n                        reachable = true;\n                        break;\n                    }\n                }\n                if (! reachable) {\n                    for (String key : map.keySet()) {\n                        if (key.equals(info.waitNodeId)) {\n                            continue;\n                        }\n                        if (key.equals(unknownPreNode)) {\n                            reachable = true;\n                            break;\n                        }\n                        if (FlowNodeLinkUtil.isReachable(key, unknownPreNode, context.getFlow())) {\n                            reachable = true;\n                            break;\n                        }\n                    }\n                }\n                if (! reachable) {\n                    info.unreachablePreNodes.add(unknownPreNode);\n                    iterator.remove();\n\n                }\n            }\n        }\n        \n        \n        private static Set<NodeContext> refreshRunningNodes(FlowContext context) {\n            Set<NodeContext> runningNodes = context.get(CTX_RUNNING_NODES);\n            if (runningNodes == null) {\n                runningNodes = new HashSet<NodeContext>();\n                runningNodes.addAll(context.getStartNodes());\n                context.put(CTX_RUNNING_NODES, runningNodes);\n            }\n            List<NodeContext> addList = null;\n            List<NodeContext> removeList = null;\n            for (NodeContext node : runningNodes) {\n                if (Boolean.TRUE.equals(node.get(InclusiveCheckWaitNodeProcessFilter.class.getName()))) {\n                    if (node.getNextNodes() != null) {\n                        for (NodeContext nctx : node.getNextNodes()) {\n                            if (addList == null) {\n                                addList = new ArrayList<NodeContext>();\n                            }\n                            addList.add(nctx);\n                        }\n                    }\n                    if (removeList == null) {\n                        removeList = new ArrayList<NodeContext>();\n                    }\n                    removeList.add(node);\n                }\n            }\n            if (removeList != null) {\n                runningNodes.removeAll(removeList); \n            }\n            if (addList != null) {\n                runningNodes.addAll(addList);\n            }\n            if (addList != null && !addList.isEmpty()) {\n                refreshRunningNodes(context);\n            }\n            return runningNodes;\n        }\n        \n    }\n\n    private static class WaitingNodeInfo {\n        \n        String waitNodeId;\n        \n        Set<String> finishedPreNodes;\n        Set<String> unreachablePreNodes;\n        Set<String> unknownPreNodes;\n        List<NodeContext> previousNodes;\n    }\n \n}\n\n\n\n\n\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/pre/MultiCheckPreHandler.java",
    "content": "package com.jd.easyflow.flow.model.pre;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.NodePreHandler;\nimport com.jd.easyflow.flow.util.FlowConstants;\nimport com.jd.easyflow.flow.util.LockUtil;\n\n/**\n * \n * IMPORTANT NOTICE! This class should not be singleton!\n * @author liyuliang5\n *\n */\npublic class MultiCheckPreHandler implements NodePreHandler, NodePrePropertyGetter {\n\n    private static final Logger logger = LoggerFactory.getLogger(MultiCheckPreHandler.class);\n\n    private List<String> preNodes;\n\n    public MultiCheckPreHandler() {\n\n    }\n\n    public MultiCheckPreHandler(List<String> preNodes) {\n        this.preNodes = preNodes;\n    }\n\n    /**\n     * Judge all pre nodes finished.\n     * \n     */\n    @Override\n    public boolean preHandle(NodeContext nodeContext, final FlowContext context) {\n        Boolean checkResult = nodeContext.get(FlowConstants.NODECTX_PRE_RESULT);\n        if (checkResult != null) {\n            if (context.isLogOn() && logger.isInfoEnabled()) {\n                logger.info(\"Pre result checked:\" + checkResult);\n            }\n            return checkResult;\n        }\n        boolean result = false;\n        List<NodeContext> previousNodes = null;\n        Object lockObj = LockUtil.getFlowContextLock(FlowConstants.CTX_LOCK_PREFIX + nodeContext.getNodeId(), context);\n        synchronized (lockObj) {\n            List<String> preNodes = context.get(FlowConstants.CTX_PRE_NODES_PREFIX + nodeContext.getNodeId());\n            previousNodes = context.get(FlowConstants.CTX_PREVIOUS_NODES_PREFIX + nodeContext.getNodeId());\n            if (preNodes == null) {\n                preNodes = new ArrayList<String>();\n                context.put(FlowConstants.CTX_PRE_NODES_PREFIX + nodeContext.getNodeId(), preNodes);\n                previousNodes = new ArrayList<NodeContext>();\n                context.put(FlowConstants.CTX_PREVIOUS_NODES_PREFIX + nodeContext.getNodeId(), previousNodes);\n            }\n            preNodes.add(nodeContext.getPreviousNode().getNodeId());\n            previousNodes.add(nodeContext.getPreviousNode());\n\n            FlowNode currentNode = context.getFlow().getNode(nodeContext.getNodeId());\n            List<String> preNodeList = this.getPreNodes(nodeContext, context);\n            \n            List<String> configPreNodes = preNodeList != null ? preNodeList\n                    : currentNode.getProperty(FlowConstants.PROP_PRENODES);\n            if (context.isLogOn() && logger.isInfoEnabled()) {\n                logger.info(\"Pre nodes executed:\" + preNodes);\n            }\n            \n            if (preNodes.size() < configPreNodes.size()) {\n                return false;\n            }\n            for (String s : configPreNodes) {\n                if (!preNodes.contains(s)) {\n                    return false;\n                }\n            }\n            result = true;\n        }\n        if (result) {\n            if (context.isLogOn() && logger.isInfoEnabled()) {\n                logger.info(\"All pre nodes finished\");\n            }\n            context.remove(FlowConstants.CTX_PRE_NODES_PREFIX + nodeContext.getNodeId());\n            context.remove(FlowConstants.CTX_PREVIOUS_NODES_PREFIX + nodeContext.getNodeId());\n            nodeContext.put(FlowConstants.NODECTX_PREVIOUS_NODES, previousNodes);\n            NodePreHandlerHelper.setNextNodesOfPreviousNode(previousNodes, nodeContext);\n        }\n        return result;\n    }\n\n    public List<String> getPreNodes() {\n        return preNodes;\n    }\n\n    public void setPreNodes(List<String> preNodes) {\n        this.preNodes = preNodes;\n    }\n    \n    @Override\n    public String getCheckType() {\n        return FlowConstants.NODE_PRE_CHECK_TYPE_MULTICHECK;\n    }\n\n    public List<String> getPreNodes(NodeContext nodeContext, FlowContext flowContext) {\n        return this.preNodes;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/pre/NodePreHandlerHelper.java",
    "content": "package com.jd.easyflow.flow.model.pre;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\n\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.util.FlowConstants;\n\n/**\n * @author liyuliang5\n */\npublic class NodePreHandlerHelper {\n\n\n    public static void setNextNodesOfPreviousNode(List<NodeContext> previousNodes, NodeContext nodeContext) {\n        for (NodeContext previous : previousNodes) {\n            if (previous.getNextNodes().length == 1) {\n                if (! previous.getNextNodes()[0].equals(nodeContext)) {\n                    previous.getNextNodes()[0].put(FlowConstants.NODECTX_PREVIOUS_NODES, new ArrayList<>(0));\n                }\n                previous.put(FlowConstants.NODECTX_NEXT_NODES, Arrays.asList(nodeContext));\n\n            } else {\n                synchronized (previous) {\n                    List<NodeContext> nextNodes = previous.get(FlowConstants.NODECTX_PREVIOUS_NODES);\n                    if (nextNodes == null) {\n                        nextNodes = new ArrayList<NodeContext>(previous.getNextNodes().length);\n                        for (NodeContext ctx : previous.getNextNodes()) {\n                            nextNodes.add(ctx);\n                        }\n                        previous.put(FlowConstants.NODECTX_NEXT_NODES, nextNodes);\n                    }\n                    for (int i = 0; i < nextNodes.size(); i++) {\n                        NodeContext next = nextNodes.get(i);\n                        if (next.getNodeId().equals(nodeContext.getNodeId()) && ! next.equals(nodeContext)) {\n                            nextNodes.get(i).put(FlowConstants.NODECTX_PREVIOUS_NODES, new ArrayList<>(0));\n                            nextNodes.set(i, nodeContext);\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/model/pre/NodePrePropertyGetter.java",
    "content": "package com.jd.easyflow.flow.model.pre;\n\nimport java.util.List;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic interface NodePrePropertyGetter {\n    \n    /**\n     * used for static compute.\n     * @return\n     */\n    String getCheckType();\n    \n    /**\n     * used for static compute.\n     * @return should contains all nodes in getPreNodes(nodeContext, flowContext)\n     */\n    List<String> getPreNodes();\n        \n    /**\n     * used for runtime.\n     * @param nodeContext\n     * @param flowContext\n     * @return All nodes should in getPreNodes().\n     */\n    List<String> getPreNodes(NodeContext nodeContext, FlowContext flowContext);\n    \n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/util/ExceptionUtil.java",
    "content": "package com.jd.easyflow.flow.util;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ExceptionUtil {\n\n    public static RuntimeException throwException(Throwable t) {\n        if (t == null) {\n            throw new NullPointerException(\"Exception is null\");\n        }\n        return throw0(t);\n    }\n\n    private static <T extends Throwable> T throw0(Throwable t) throws T {\n        throw (T) t;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/util/FlowConstants.java",
    "content": "package com.jd.easyflow.flow.util;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FlowConstants {\n    \n    public static final String NS_SEP = \":\";\n    \n    public static final String NS_EASYFLOW = \"easyflow\";\n    \n    public static final String EASYFLOW_NS_PREFIX = NS_EASYFLOW + NS_SEP;\n\n\t/**\n\t * Param keys.\n\t */\n    public static final String PARAM_ACTION_EXECUTOR = \"actionExecutor\";\n\t/**\n\t * Record execute history, default is true\n\t */\n\tpublic static final String FLOW_PROPERTY_RECORD_HISTORY = \"flow.recordHistory\";\n\t\n\t/**\n\t * Node action filter.\n\t */\n\tpublic static final String FLOW_NODE_ACTION_FILTERS = \"flow.nodeActionFilters\";\n\t\n    public static final int EVENT_ORDER_START = 10000;\n    \n    /**\n     * Exceptions in multiple thread scenario.\n     */\n    public static final String FLOW_CTX_MULTI_EXCEPTIONS = \"_flow.multi.exceptions\";\n    \n    public static final String FLOW_CTX_MULTI_AWAIT_RESULT = \"_flow.multi.await.result\";\n    \n    public static final String NODE_CTX_MULTI_EXCEPTION = \"_flow.multi.exception\";\n    \n    \n    public static final String CTX_LOCK_PREFIX = \"_node_lock_\";\n    \n    public static final String CTX_PRE_NODES_PREFIX = \"_pre_nodes_\";\n    public static final String CTX_PREVIOUS_NODES_PREFIX = \"_previousNodes_\";\n    \n    public static final String CTX_PARENT_CONTEXT = \"_parentContext\";\n    \n    public static final String CTX_PARENT_NODE_CONTEXT = \"_parentNodeContext\";\n    \n    public static final String NODECTX_PRE_RESULT = \"_preResult\";\n    public static final String NODECTX_PREVIOUS_NODES = \"_previousNodes\";\n    public static final String NODECTX_NEXT_NODES = \"_nextNodes\";\n    \n    public static final String NODECTX_COMPENSATE_NODE_FLAG = \"_compensateNodeFlag\";\n    public static final String NODECTX_COMPENSATE_FOR = \"_compensateFor\";\n    public static final String NODECTX_COMPENSATED_BY = \"_compensatedBy\";\n    public static final String NODECTX_COMPENSATED_FLAG = \"_compensatedFlag\";\n    \n    public static final String PROP_PRENODES = \"preNodes\";\n    \n    public static final String PROP_INTERRUPT = \"interrupt\";\n    \n    public static final String PROP_INTERRUPT_EXP = \"interruptExp\";\n    \n    \n    public static final String PROP_RUNTIME_EVENT_NODE_ACTION_MAP = \"_$eventNodeActionMap\";\n    public static final String PROP_RUNTIME_EVENT_POST_HANDLER_MAP = \"_$eventPostHandlerMap\";\n    public static final String PROP_RUNTIME_COMPENSATE_ACTION = \"_$compensateAction\";\n    \n    /**\n     * Event param.\n     */\n    public static final String NODE_CONTEXT_DATA_EVENT = \"_EVENT\";\n\n    public static final String NODE_PROP_EVENTS = \"events\";\n    \n    public static final String PARAM_DATA_EVENT = \"_EVENT\";\n    \n    public static final String NONE_EVENT = \"NONE\";\n    \n    /**\n     * Node Pre checkType\n     */\n    public static final String NODE_PRE_CHECK_TYPE_MULTICHECK = \"multiCheck\";\n    public static final String NODE_PRE_CHECK_TYPE_INCLUSIVECHECK = \"inclusiveCheck\";\n    \n    /**\n     * initContextKey\n     */\n    public static final String INIT_CONTEXT_KEY = \"initContext\";\n    \n    \n    public static final String FLOW_ENGINE_EVENT_DATA_KEY_PARAM = \"param\";\n    public static final String FLOW_ENGINE_EVENT_DATA_KEY_FLOW_ENGINE = \"flowEngine\";\n    public static final String FLOW_ENGINE_EVENT_DATA_KEY_RESULT = \"result\";\n    public static final String FLOW_ENGINE_EVENT_DATA_KEY_EXCEPTION = \"exception\";\n    \n    /**\n     * Node property\n     */\n    public static final String NODE_PROP_NEXT_NODES = \"nextNodes\";\n\n\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/util/FlowEventTypes.java",
    "content": "package com.jd.easyflow.flow.util;\n\n/**\n * Flow event types.\n * @author liyuliang5\n *\n */\npublic class FlowEventTypes {\n\n    /**\n     * Common events.\n     */\n    public static final String FLOW_ENGINE_START = \"FLOW_ENGINE_START\";\n    public static final String FLOW_ENGINE_END = \"FLOW_ENGINE_END\";\n    public static final String FLOW_ENGINE_COMPLETE = \"FLOW_ENGINE_COMPLETE\";\n    \n    public static final String FLOW_START = \"FLOW_START\";\n    public static final String FLOW_END = \"FLOW_END\";\n    public static final String FLOW_COMPLETE = \"FLOW_COMPLETE\";\n    \n    public static final String INIT_START = \"INIT_START\";\n    public static final String INIT_END = \"INIT_END\";\n    \n    public static final String RUN_START = \"RUN_START\";\n    public static final String RUN_END = \"RUN_END\";\n    \n    public static final String NODE_START = \"NODE_START\";\n    public static final String NODE_END = \"NODE_END\";\n    public static final String NODE_COMPLETE = \"NODE_COMPLETE\";\n    \n    public static final String FLOW_PRE_START = \"FLOW_PRE_START\";\n    public static final String FLOW_PRE_END = \"FLOW_PRE_END\";\n\n    public static final String FLOW_POST_START = \"FLOW_POST_START\";\n    public static final String FLOW_POST_END = \"FLOW_POST_END\";\n    \n    /**\n     * Extension events.\n     */\n    public static final String NODE_PRE_START = \"NODE_PRE_START\";\n    public static final String NODE_PRE_END = \"NODE_PRE_END\";\n    public static final String NODE_ACTION_START = \"NODE_ACTION_START\";\n    public static final String NODE_ACTION_END = \"NODE_ACTION_END\";\n    public static final String NODE_POST_START = \"NODE_POST_START\";\n    public static final String NODE_POST_END = \"NODE_POST_END\";\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/util/FlowIOUtil.java",
    "content": "package com.jd.easyflow.flow.util;\n\nimport java.io.ByteArrayOutputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.nio.charset.StandardCharsets;\n\n/**\n * \n * @author liyuliang5\n */\npublic class FlowIOUtil {\n\n    public static String toString(InputStream inputStream) throws IOException {\n        ByteArrayOutputStream result = new ByteArrayOutputStream();\n        byte[] buffer = new byte[1024];\n        int length;\n        while ((length = inputStream.read(buffer)) != -1) {\n            result.write(buffer, 0, length);\n        }\n        String str = result.toString(StandardCharsets.UTF_8.name());\n        return str;\n    }\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/util/FlowNodeLinkUtil.java",
    "content": "package com.jd.easyflow.flow.util;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.HashSet;\nimport java.util.LinkedHashSet;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.NodePostHandler;\nimport com.jd.easyflow.flow.model.NodePreHandler;\nimport com.jd.easyflow.flow.model.node.NodeImpl;\nimport com.jd.easyflow.flow.model.post.ConditionalNodePostHandler;\nimport com.jd.easyflow.flow.model.post.EventPostHandler;\nimport com.jd.easyflow.flow.model.post.FixedNodePostHandler;\nimport com.jd.easyflow.flow.model.pre.NodePrePropertyGetter;\n\n/**\n * @author liyuliang5\n */\npublic class FlowNodeLinkUtil {\n\n    private static final Logger logger = LoggerFactory.getLogger(FlowNodeLinkUtil.class);\n\n    private static final String IDX_VAR_PREFIX = \"$\";\n\n    private static final String NODE_PROP_NEXT_NODES_CACHE = \"_$nextNodesCache\";\n    private static final String NODE_PROP_PREVIOUS_NODES_CACHE = \"_$previousNodesCache\";\n    private static final String NODE_PROP_PRE_CHECK_TYPE_CACHE = \"_$preCheckTypeCache\";\n    private static final String NODE_PROP_PRE_CHECK_NODES_CACHE = \"_$preCheckNodesCache\";\n\n    private static final String NODE_PROP_PRE_CHECK_TYPE = \"preCheckType\";\n\n    static final String FLOW_PROP_REACHABLE_MAP = \"_$reachableMap\";\n\n    public static final String NODE_ID_ALL = \"$*\";\n    public static final String NODE_ID_UNKNOWN = \"$?\";\n    public static final String NODE_PRE_CHECK_TYPE_UNKNOWN = \"?\";\n\n    private static List<String> EMPTY_LIST = new ArrayList<String>(0);\n\n    /**\n     * \n     * @param nodeId\n     * @param flow\n     * @return resultList. may null or contains null! return null if uncomputable.\n     *         contains null as uncomputable.\n     */\n    public static List<String> getNextNodes(String nodeId, Flow flow) {\n        FlowNode node = flow.getNode(nodeId);\n        return getNextNodes(node, flow);\n    }\n\n    /**\n     * \n     * @param node\n     * @param flow\n     * @return resultList. may return $? as unknown.\n     */\n    public static List<String> getNextNodes(FlowNode node, Flow flow) {\n        List<String> nextNodeIds = node.getProperty(NODE_PROP_NEXT_NODES_CACHE);\n        if (nextNodeIds != null) {\n            return nextNodeIds;\n        }\n        nextNodeIds = node.getProperty(FlowConstants.NODE_PROP_NEXT_NODES);\n        if (nextNodeIds == null) {\n            if (node instanceof NodeImpl) {\n                NodeImpl nodeImpl = (NodeImpl) node;\n                NodePostHandler nodePostHandler = nodeImpl.getPostHandler();\n                nextNodeIds = getNextNodeIds(nodePostHandler, nodeImpl, flow);\n            } else {\n                nextNodeIds = Arrays.asList(NODE_ID_UNKNOWN);\n            }\n        }\n        if (nextNodeIds.size() > 1) {\n            Set<String> nextNodeIdsSet = new LinkedHashSet<String>();\n            nextNodeIdsSet.addAll(nextNodeIds);\n            nextNodeIds = new ArrayList<String>(nextNodeIdsSet);\n        }\n        if (nextNodeIds.contains(NODE_ID_UNKNOWN)) {\n            if (logger.isInfoEnabled()) {\n                logger.info(flow.getId() + \":\" + node.getId() + \" next nodes contains unknown\");\n            }\n        }\n        node.setProperty(NODE_PROP_NEXT_NODES_CACHE, nextNodeIds);\n        return nextNodeIds;\n    }\n\n    private static List<String> getNextNodeIds(NodePostHandler nodePostHandler, FlowNode node, Flow flow) {\n        if (nodePostHandler == null) {\n            return EMPTY_LIST;\n        } else if (nodePostHandler instanceof FixedNodePostHandler) {\n            FixedNodePostHandler fixed = (FixedNodePostHandler) nodePostHandler;\n            return parseTo(fixed.getTo(), node.getId(), flow);\n        } else if (nodePostHandler instanceof ConditionalNodePostHandler) {\n            List<String> nextNodeIds = new ArrayList<String>();\n            ConditionalNodePostHandler conditional = (ConditionalNodePostHandler) nodePostHandler;\n            List<Map<String, Object>> branchList = conditional.getBranchList();\n            for (Map<String, Object> branch : branchList) {\n                Object next = branch.get(\"to\");\n                List<String> toList = parseTo(next, node.getId(), flow);\n                nextNodeIds.addAll(toList);\n            }\n            if (conditional.getDefaultBranch() != null) {\n                List<String> defaultTo = parseTo(conditional.getDefaultBranch(), node.getId(), flow);\n                nextNodeIds.addAll(defaultTo);\n            }\n            return nextNodeIds;\n        } else if (nodePostHandler instanceof EventPostHandler) {\n            Map<String, NodePostHandler> handlerMap = node\n                    .getProperty(FlowConstants.PROP_RUNTIME_EVENT_POST_HANDLER_MAP);\n            if (handlerMap == null) {\n                return EMPTY_LIST;\n            }\n            List<String> nextNodeIds = new ArrayList<String>();\n            for (NodePostHandler handler : handlerMap.values()) {\n                List<String> list = getNextNodeIds(handler, node, flow);\n                nextNodeIds.addAll(list);\n            }\n            return nextNodeIds;\n        } else {\n            return Arrays.asList(NODE_ID_UNKNOWN);\n        }\n    }\n\n    public static List<String> getPreviousNodes(String nodeId, Flow flow) {\n        FlowNode node = flow.getNode(nodeId);\n        return getPreviousNodeIds(node, flow);\n    }\n\n    public static List<String> getPreviousNodeIds(FlowNode node, Flow flow) {\n        List<String> previousNodeIds = node.getProperty(NODE_PROP_PREVIOUS_NODES_CACHE);\n        if (previousNodeIds != null) {\n            return previousNodeIds;\n        }\n        String nodeId = node.getId();\n        previousNodeIds = new ArrayList<String>();\n        boolean containsUnknown = false;\n        for (FlowNode flowNode : flow.getNodeList()) {\n            List<String> nextNodeIds = getNextNodes(flowNode, flow);\n            for (String nextNode : nextNodeIds) {\n                if (NODE_ID_UNKNOWN.equals(nextNode)) {\n                    containsUnknown = true;\n                } else if (nodeId.equals(nextNode) || NODE_ID_ALL.equals(nextNode)) {\n                    previousNodeIds.add(flowNode.getId());\n                    break;\n                }\n            }\n        }\n        if (containsUnknown) {\n            previousNodeIds.add(NODE_ID_UNKNOWN);\n        }\n        node.setProperty(NODE_PROP_PREVIOUS_NODES_CACHE, previousNodeIds);\n        return previousNodeIds;\n    }\n\n    public static String getPreCheckType(String nodeId, Flow flow) {\n        FlowNode node = flow.getNode(nodeId);\n        return getPreCheckType(node, flow);\n    }\n\n    public static String getPreCheckType(FlowNode node, Flow flow) {\n        String preCheckType = node.getProperty(NODE_PROP_PRE_CHECK_TYPE_CACHE);\n        if (preCheckType != null) {\n            return preCheckType;\n        }\n\n        preCheckType = node.getProperty(NODE_PROP_PRE_CHECK_TYPE);\n        if (preCheckType == null) {\n            if (node instanceof NodeImpl) {\n                NodeImpl nodeImpl = (NodeImpl) node;\n                NodePreHandler nodePreHandler = nodeImpl.getPreHandler();\n                if (nodePreHandler == null) {\n                    preCheckType = null;\n                } else if (nodePreHandler instanceof NodePrePropertyGetter) {\n                    preCheckType = ((NodePrePropertyGetter) nodePreHandler).getCheckType();\n                } else {\n                    preCheckType = NODE_PRE_CHECK_TYPE_UNKNOWN;\n                }\n            } else {\n                preCheckType = NODE_PRE_CHECK_TYPE_UNKNOWN;\n            }\n        }\n        node.setProperty(NODE_PROP_PRE_CHECK_TYPE_CACHE, preCheckType);\n        return preCheckType;\n    }\n\n    public static List<String> getPreCheckNodes(String nodeId, Flow flow) {\n        FlowNode node = flow.getNode(nodeId);\n        return getPreCheckNodes(node, flow);\n    }\n    \n    public static List<String> getPreCheckNodes(FlowNode node, Flow flow) {\n        List<String> preNodes = node.getProperty(NODE_PROP_PRE_CHECK_NODES_CACHE);\n        if (preNodes != null) {\n            return preNodes;\n        }\n        preNodes = node.getProperty(FlowConstants.PROP_PRENODES);\n        if (preNodes == null) {\n            preNodes = new ArrayList<String>();\n            if (node instanceof NodeImpl) {\n                NodeImpl nodeImpl = (NodeImpl) node;\n                NodePreHandler nodePreHandler = nodeImpl.getPreHandler();\n                if (nodePreHandler == null) {\n                    // NOOP\n                } else if (nodePreHandler instanceof NodePrePropertyGetter) {\n                    preNodes = ((NodePrePropertyGetter) nodePreHandler).getPreNodes();\n                } else {\n                    preNodes = Arrays.asList(NODE_ID_UNKNOWN);\n                }\n            } else {\n                preNodes = Arrays.asList(NODE_ID_UNKNOWN);\n            }\n        }\n        node.setProperty(NODE_PROP_PRE_CHECK_NODES_CACHE, preNodes);\n        return preNodes;\n    }\n\n    private static List<String> parseTo(Object to, String nodeId, Flow flow) {\n        List<String> result = new ArrayList<String>();\n        // String type\n        if (to instanceof String) {\n            String toStr = (String) to;\n            if (!toStr.startsWith(IDX_VAR_PREFIX)) {\n                result.add(toStr);\n            } else {\n                toStr = parseIndexVar(toStr, nodeId, flow);\n                result.add(toStr);\n            }\n        } else if (to instanceof Integer) {\n            int toIdx = (Integer) to;\n            String toStr = flow.getNodeList().get(toIdx).getId();\n            result.add(toStr);\n            // List type\n        } else if (to instanceof List) {\n            List<Object> toList = (List) to;\n            List<NodeContext> toResult = new ArrayList<>(toList.size());\n            for (Object toObj : toList) {\n                List<String> nodes = parseTo(toObj, nodeId, flow);\n                result.addAll(nodes);\n            }\n        } else if (to instanceof Map) {\n            Map<String, Object> toMap = (Map<String, Object>) to;\n            Object exp = toMap.get(\"exp\");\n            if (exp != null) {\n                result.add(NODE_ID_UNKNOWN);\n            } else {\n                Object node = toMap.get(\"node\");\n                if (node != null) {\n                    List<String> nodes = parseTo(node, nodeId, flow);\n                    result.addAll(nodes);\n                }\n            }\n            \n        } else {\n            result.add(NODE_ID_UNKNOWN);\n        }\n        return result;\n    }\n\n    private static String parseIndexVar(String var, String nodeId, Flow flow) {\n        int index = -1;\n        switch (var) {\n        case \"$first\": {\n            index = 0;\n            break;\n        }\n        case \"$last\": {\n            index = flow.getNodeList().size() - 1;\n            break;\n        }\n        case \"$previous\": {\n            index = flow.getNodeIndex(nodeId) - 1;\n            break;\n        }\n        case \"$next\": {\n            index = flow.getNodeIndex(nodeId) + 1;\n            break;\n        }\n        default: {\n            return NODE_ID_UNKNOWN;\n        }\n        }\n        return flow.getNodeList().get(index).getId();\n    }\n\n    public static boolean isReachable(String sourceNodeId, String targetNodeId, Flow flow) {\n        Map<String, Boolean> reachableMap = flow.getProperty(FLOW_PROP_REACHABLE_MAP);\n        if (reachableMap == null) {\n            reachableMap = new ConcurrentHashMap<String, Boolean>();\n            flow.setProperty(FLOW_PROP_REACHABLE_MAP, reachableMap);\n        }\n        String key = buildKey(sourceNodeId, targetNodeId, flow);\n        Boolean result = reachableMap.get(key);\n        if (result != null) {\n            return result;\n        }\n        Set<String> set = new HashSet<>();\n        result = computeReachable(set, sourceNodeId, targetNodeId, flow);\n        reachableMap.put(key, result);\n        return result;\n\n    }\n\n    private static boolean computeReachable(Set<String> nodeSet, String sourceNodeId, String targetNodeId, Flow flow) {\n        boolean notContains = nodeSet.add(sourceNodeId);\n        if (!notContains) {\n            return false;\n        }\n        FlowNode sourceNode = flow.getNode(sourceNodeId);\n        List<String> nextNodeIds = getNextNodes(sourceNode, flow);\n        for (String nextNodeId : nextNodeIds) {\n            if (NODE_ID_UNKNOWN.equals(nextNodeId)) {\n                logger.warn(\"nextNodeId contains unknown to ignore, flow:\" + flow.getId() + \" sourceNodeId:\"\n                        + sourceNodeId + \" targetNodeId:\" + targetNodeId);\n            }\n            if (nextNodeId.equals(targetNodeId) || NODE_ID_ALL.equals(nextNodeId)) {\n                return true;\n            }\n            boolean result = computeReachable(nodeSet, nextNodeId, targetNodeId, flow);\n            if (result) {\n                return true;\n            }\n        }\n        return false;\n\n    }\n\n    private static String buildKey(String sourceNodeId, String targetNodeId, Flow flow) {\n        return sourceNodeId + \"$\" + targetNodeId;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/util/FlowStringUtil.java",
    "content": "package com.jd.easyflow.flow.util;\n\n/**\n * \n * @author liyuliang5\n */\npublic class FlowStringUtil {\n    \n    public static boolean isNotEmpty(final CharSequence cs) {\n        return ! isEmpty(cs);\n    }\n\n    public static boolean isEmpty(final CharSequence cs) {\n        return cs == null || cs.length() == 0;\n    }\n    \n    public static String repeat(final char ch, final int repeat) {\n        if (repeat <= 0) {\n            return \"\";\n        }\n        final char[] buf = new char[repeat];\n        for (int i = repeat - 1; i >= 0; i--) {\n            buf[i] = ch;\n        }\n        return new String(buf);\n    }\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/util/FlowUtil.java",
    "content": "package com.jd.easyflow.flow.util;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FlowUtil {\n\n    /**\n     * get node\n     * @param nodeContext\n     * @param context\n     * @return\n     */\n    public static FlowNode node(NodeContext nodeContext, FlowContext context) {\n        return context.getFlow().getNode(nodeContext.getNodeId());\n    }\n\n    /**\n     * get node property\n     * @param <T>\n     * @param key\n     * @param nodeContext\n     * @param context\n     * @return\n     */\n    public static <T> T nodeProperty(String key, NodeContext nodeContext, FlowContext context) {\n        return (T) node(nodeContext, context).getProperty(key);\n    }\n    \n    \n    /**\n     * \n     * @param nodes\n     * @return\n     */\n    public static String[] nodeIds(FlowNode[] nodes) {\n        if (nodes == null) {\n            return null;\n        }\n        String[] nodeIds = new String[nodes.length];\n        for (int i = 0; i < nodes.length; i++) {\n            nodeIds[i] = nodes[i].getId();\n        }\n        return nodeIds;\n    }\n    \n    /**\n     * \n     * @param nodes\n     * @return\n     */\n    public static List<String> nodeIdsOfNodeList(List<FlowNode> nodes) {\n        if (nodes == null) {\n            return null;\n        }\n        List<String> nodeIds = new ArrayList<>(nodes.size());\n        for (int i = 0; i < nodes.size(); i++) {\n            nodeIds.add(nodes.get(i).getId());\n        }\n        return nodeIds;\n    }\n    \n    /**\n     * \n     * @param nodes\n     * @return\n     */\n    public static String[] nodeIds(NodeContext[] nodes) {\n        if (nodes == null) {\n            return null;\n        }\n        String[] nodeIds = new String[nodes.length];\n        for (int i = 0; i < nodes.length; i++) {\n            nodeIds[i] = nodes[i].getNodeId();\n        }\n        return nodeIds;\n    }\n    \n    /**\n     * \n     * @param nodes\n     * @return\n     */\n    public static List<String> nodeIdsOfNodeContextList(List<NodeContext> nodes) {\n        if (nodes == null) {\n            return null;\n        }\n        List<String> nodeIds = new ArrayList<>(nodes.size());\n        for (int i = 0; i < nodes.size(); i++) {\n            nodeIds.add(nodes.get(i).getNodeId());\n        }\n        return nodeIds;\n    }\n    \n    public static String nsKey(String key) {\n        return FlowConstants.NS_SEP + key;\n    }\n    \n    public static String nsKey(String ns, String key) {\n        return ns + FlowConstants.NS_SEP + key;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/util/JsonFacade.java",
    "content": "package com.jd.easyflow.flow.util;\n\n/**\n * @author liyuliang5\n */\npublic interface JsonFacade {\n\n\n    public String toJsonString(Object o);\n\n    public <T> T parseObject(String s, Class<T> clazz);\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/util/JsonFacadeJacksonImpl.java",
    "content": "package com.jd.easyflow.flow.util;\n\nimport com.fasterxml.jackson.annotation.JsonInclude.Include;\nimport com.fasterxml.jackson.core.JsonProcessingException;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackson.databind.SerializationFeature;\n\n/**\n * @author liyuliang5\n */\npublic class JsonFacadeJacksonImpl implements JsonFacade {\n\n    private ObjectMapper mapper = new ObjectMapper();\n\n    {\n        mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);\n        mapper.setSerializationInclusion(Include.NON_NULL);\n    }\n\n    @Override\n    public String toJsonString(Object o) {\n        try {\n            return mapper.writeValueAsString(o);\n        } catch (JsonProcessingException e) {\n            throw new RuntimeException(e);\n        }\n    }\n\n    @Override\n    public <T> T parseObject(String s, Class<T> clazz) {\n        try {\n            return mapper.readValue(s, clazz);\n        } catch (Exception e) {\n            throw new RuntimeException(e);\n        }\n    }\n\n    public ObjectMapper getMapper() {\n        return mapper;\n    }\n\n    public void setMapper(ObjectMapper mapper) {\n        this.mapper = mapper;\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/util/JsonPrettyHelper.java",
    "content": "package com.jd.easyflow.flow.util;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * JSON pretty handler to formating json definition.\n * \n * @author liyuliang5\n *\n */\npublic class JsonPrettyHelper {\n\n    public static final Logger logger = LoggerFactory.getLogger(JsonPrettyHelper.class);\n\n    private static final int INDENT = 2;\n\n    private static final String KEY_TYPE = \"keyType\";\n\n    public static String pretty(String valueStr, String prettyConfStr) {\n        Object value = JsonUtil.parseObject(valueStr, Object.class);\n        Map<String, Object> prettyConf = JsonUtil.parseObject(prettyConfStr, Map.class);\n        StringBuilder builder = new StringBuilder();\n        pretty(value, prettyConf, (Map<String, Object>) prettyConf.get(\"default\"), builder, 0);\n        return builder.toString();\n    }\n\n    public static String pretty(Object value, Map<String, Object> prettyConf) {\n        StringBuilder builder = new StringBuilder();\n        pretty(value, prettyConf, (Map<String, Object>) prettyConf.get(\"default\"), builder, 0);\n        return builder.toString();\n    }\n\n    private static void pretty(Object value, Map<String, Object> prettyConf, Map<String, Object> defaultConf,\n            StringBuilder builder, int indent) {\n        if (value == null) {\n            builder.append(\"null\");\n        } else if (value instanceof String) {\n            builder.append(quote((String) value));\n        } else if (value instanceof Number || value instanceof Boolean) {\n            builder.append(value);\n        } else if (value instanceof Map) {\n            prettyMap((Map<String, Object>) value, prettyConf, defaultConf, builder, indent);\n        } else if (value instanceof List) {\n            prettyList((List) value, prettyConf, defaultConf, builder, indent);\n        } else {\n            throw new UnsupportedOperationException(\"Unsupported type:\" + value.getClass());\n        }\n\n    }\n\n    /**\n     * Pretty Map\n     * \n     * @param value\n     * @param prettyConf\n     * @param builder\n     * @param indent\n     */\n    public static void prettyMap(Map<String, Object> value, Map<String, Object> prettyConf,\n            Map<String, Object> defaultConf, StringBuilder builder, int indent) {\n        if (prettyConf == null) {\n            prettyConf = new HashMap<>();\n        }\n        // Head\n        builder.append(\"{\");\n        // Element\n        indent = indent + INDENT;\n        List<String> processedKey = new ArrayList<>();\n\n        List<Map<String, Object>> subList = (List<Map<String, Object>>) prettyConf.get(\"subList\");\n        if (subList == null) {\n            subList = new ArrayList<>();\n        }\n        if (!subList.stream().anyMatch(map -> \"OTHER\".equals(map.get(KEY_TYPE)))) {\n            Map<String, Object> otherConf = new HashMap<>();\n            otherConf.put(\"keyType\", \"OTHER\");\n            subList.add(otherConf);\n        }\n\n        boolean hasElements = false;\n        for (Map<String, Object> subConf : subList) {\n            Map<String, Object> subDefaultConf = (Map<String, Object>) subConf.get(\"default\");\n            subDefaultConf = subDefaultConf == null ? defaultConf : subDefaultConf;\n\n            List<String> keys = null;\n            String confKey = (String) subConf.get(\"key\");\n            String keyType = (String) subConf.get(\"keyType\");\n            if (FlowStringUtil.isNotEmpty(confKey)) {\n                keys = Arrays.asList(confKey);\n            } else if (\"OTHER\".equals(keyType)) {\n                keys = subtract(new ArrayList<String>(value.keySet()), processedKey);\n            } else if (subConf.containsKey(\"subList\")){\n                continue;\n            } else {\n                throw new IllegalArgumentException(\"Config error,\" + subConf);\n            }\n            if (keys.size() > 0) {\n                for (String key : keys) {\n                    if (logger.isDebugEnabled()) {\n                        logger.debug(\"Start pretty element:\" + key);\n                    }\n                    if (!value.containsKey(key)) {\n                        continue;\n                    }\n                    boolean subNewLine = Boolean.TRUE.equals(getConf(subConf, subDefaultConf, \"newLine\"));\n                    if (subNewLine) {\n                        builder.append(newLine(indent));\n                    }\n                    processedKey.add(key);\n                    builder.append(quoteColon(key));\n                    pretty(value.get(key), subConf, subDefaultConf, builder, indent);\n                    builder.append(\",\");\n                    hasElements = true;\n                }\n            }\n        }\n        if (hasElements) {\n            builder.deleteCharAt(builder.length() - 1);\n        }\n        // Tail\n        indent = indent - INDENT;\n        boolean endNewLine = Boolean.TRUE.equals(getConf(prettyConf, defaultConf, \"endNewLine\"));\n        if (endNewLine) {\n            builder.append(newLine(indent));\n        }\n        builder.append(\"}\");\n    }\n    \n    private static List<String> subtract(List<String> list1, List<String> list2) {\n        List<String> result = new ArrayList<>();\n        if (list1 == null) {\n            return result;\n        }\n        for (String s : list1) {\n            if (!list2.contains(s)) {\n                result.add(s);\n            }\n        }\n        return result;\n    }\n\n    /**\n     * Pretty Array\n     * \n     * @param value\n     * @param prettyConf\n     * @param builder\n     * @param indent\n     */\n    public static void prettyList(List<Object> value, Map<String, Object> prettyConf, Map<String, Object> defaultConf,\n            StringBuilder builder, int indent) {\n        if (prettyConf == null) {\n            prettyConf = new HashMap<>();\n        }\n\n        List<Map<String, Object>> subConfList = (List<Map<String, Object>>) prettyConf.get(\"subList\");\n        if (subConfList == null) {\n            subConfList = new ArrayList<>();\n            Map<String, Object> arrayConf = new HashMap<>();\n            subConfList.add(arrayConf);\n        }\n        // Head\n        builder.append(\"[\");\n        // Element\n        indent = indent + INDENT;\n        Map<String, Object> subConf = subConfList.get(0);\n        Map<String, Object> subDefaultConf = (Map<String, Object>) subConf.get(\"default\");\n        subDefaultConf = subDefaultConf == null ? defaultConf : subDefaultConf;\n\n        if (value.size() > 0) {\n            for (Object o : value) {\n                boolean subNewLine = Boolean.TRUE.equals(getConf(subConf, subDefaultConf, \"newLine\"));\n                if (subNewLine) {\n                    builder.append(newLine(indent));\n                }\n                pretty(o, subConf, subDefaultConf, builder, indent);\n                builder.append(\",\");\n            }\n            builder.deleteCharAt(builder.length() - 1);\n        }\n        // Tail\n        indent = indent - INDENT;\n        boolean endNewLine = Boolean.TRUE.equals(getConf(prettyConf, defaultConf, \"endNewLine\"));\n        if (endNewLine) {\n            builder.append(newLine(indent));\n        }\n        builder.append(\"]\");\n    }\n\n    // ===Utils===\n\n    private static <T> T getConf(Map<String, Object> confMap, Map<String, Object> defaultConf, String key) {\n        Object value = confMap.get(key);\n        if (value != null) {\n            return (T) value;\n        }\n        if (defaultConf != null) {\n            value = defaultConf.get(key);\n        }\n        return (T) value;\n    }\n\n    private static String newLine(int indent) {\n        return \"\\n\" + FlowStringUtil.repeat(' ', indent);\n    }\n\n    private static String blank(int num) {\n        return FlowStringUtil.repeat(' ', num);\n    }\n\n    private static String quote(String str) {\n        return JsonUtil.toJsonString(str);\n    }\n\n    private static String quoteColon(String s) {\n        return quote(s) + \":\";\n    }\n\n    /**\n     * intent chars.\n     * \n     * @param s\n     * @param indent\n     * @return\n     */\n    private static String indent(String s, int indent) {\n        String[] lines = s.split(\"\\n\");\n        StringBuilder builder = new StringBuilder();\n        for (String line : lines) {\n            builder.append(FlowStringUtil.repeat(' ', indent) + line);\n        }\n        return builder.toString();\n    }\n\n    /**\n     * intent chars.\n     * \n     * @param s\n     * @param indent\n     * @return\n     */\n    private static String indent(String[] lines, int indent) {\n        StringBuilder builder = new StringBuilder();\n        for (String line : lines) {\n            builder.append(FlowStringUtil.repeat(' ', indent) + line);\n        }\n        return builder.toString();\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/util/JsonUtil.java",
    "content": "package com.jd.easyflow.flow.util;\n\n/**\n * JSON Util.\n * \n * @author liyuliang5\n *\n */\npublic class JsonUtil {\n\n    private static JsonFacade jsonFacade;\n\n    public static String toJsonString(Object o) {\n        return jsonFacade().toJsonString(o);\n    }\n\n\n    public static <T> T parseObject(String s, Class<T> clazz) {\n        return jsonFacade().parseObject(s, clazz);\n    }\n    \n    \n    private static JsonFacade jsonFacade() {\n        if (jsonFacade == null) {\n            jsonFacade = new JsonFacadeJacksonImpl();\n        }\n        return jsonFacade;\n    }\n\n\n    public static JsonFacade getJsonFacade() {\n        return jsonFacade;\n    }\n\n\n    public static void setJsonFacade(JsonFacade jsonFacade) {\n        JsonUtil.jsonFacade = jsonFacade;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/util/LockUtil.java",
    "content": "package com.jd.easyflow.flow.util;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * @author liyuliang5\n */\npublic class LockUtil {\n    \n    public static Object getFlowContextLock(String lockKey, FlowContext context) {\n        Object lockObj = context.get(lockKey);\n        if (lockObj != null) {\n            return lockObj;\n        }\n        synchronized (context) {\n            lockObj = context.get(lockKey);\n            if (lockObj == null) {\n                lockObj = new Object();\n                context.put(lockKey, lockObj);\n            }\n            return lockObj;\n        }\n    }\n    \n    public static Object getNodeContextLock(String lockKey, NodeContext nodeContext) {\n        Object lockObj = nodeContext.get(lockKey);\n        if (lockObj != null) {\n            return lockObj;\n        }\n        synchronized (nodeContext) {\n            lockObj = nodeContext.get(lockKey);\n            if (lockObj == null) {\n                lockObj = new Object();\n                nodeContext.put(lockKey, lockObj);\n            }\n            return lockObj;\n        }\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/util/Pair.java",
    "content": "package com.jd.easyflow.flow.util;\n\n/**\n * \n * @author liyuliang5\n */\npublic class Pair<L, R> {\n\n    private L left;\n\n    private R right;\n\n    private Pair(L left, R right) {\n        this.left = left;\n        this.right = right;\n    }\n\n    public static <L, R> Pair<L, R> of(L left, R right) {\n        return new Pair<L, R>(left, right);\n    }\n\n    public L getLeft() {\n        return left;\n    }\n\n    public void setLeft(L left) {\n        this.left = left;\n    }\n\n    public R getRight() {\n        return right;\n    }\n\n    public void setRight(R right) {\n        this.right = right;\n    }\n\n    @Override\n    public String toString() {\n        return \"Pair [left=\" + left + \", right=\" + right + \"]\";\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-flow/src/main/java/com/jd/easyflow/flow/util/Triple.java",
    "content": "package com.jd.easyflow.flow.util;\n\n/**\n * \n * @author liyuliang5\n */\npublic class Triple<L, M, R> {\n\n    private L left;\n    \n    private M middle;\n\n    private R right;\n\n    private Triple(L left, M middle, R right) {\n        this.left = left;\n        this.middle = middle;\n        this.right = right;\n    }\n\n    public static <L, M, R> Triple<L, M, R> of(L left, M middle, R right) {\n        return new Triple<L, M, R>(left, middle, right);\n    }\n\n    public L getLeft() {\n        return left;\n    }\n\n    public void setLeft(L left) {\n        this.left = left;\n    }\n    \n    public M getMiddle() {\n        return middle;\n    }\n\n    public void setMiddle(M middle) {\n        this.middle = middle;\n    }\n\n    public R getRight() {\n        return right;\n    }\n\n    public void setRight(R right) {\n        this.right = right;\n    }\n\n    @Override\n    public String toString() {\n        return \"Triple [left=\" + left + \", middle=\" + middle + \", right=\" + right + \"]\";\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-flow/src/main/resources/pretty/pretty-flow.json",
    "content": "{\n    \"endNewLine\": true,\n    \"subList\": [\n        {\n          \"newLine\": true,\n          \"subList\":[\n\n        {\n            \"key\": \"id\"\n        },\n        {\n            \"key\": \"name\",\n            \"newLine\": true\n        },\n        {\n            \"key\": \"pre\",\n            \"newLine\": true\n        },\n        {\n            \"key\": \"nodes\",\n            \"newLine\": true,\n            \"endNewLine\": true,\n            \"subList\": [\n                {\n                    \"newLine\": true,\n                    \"subList\": [\n                        {\n                            \"key\": \"id\"\n                        },\n                        {\n                            \"key\": \"name\"\n                        },\n                        {\n                            \"key\": \"start\"\n                        },\n                        {\n                            \"key\": \"pre\"\n                        },\n                        {\n                            \"key\": \"action\",\n                            \"subList\": [\n                                {\n                                    \"key\": \"flow\",\n                                    \"subList\": [\n                                        {\n                                            \"key\": \"id\"\n                                        },\n                                        {\n                                            \"key\": \"name\",\n                                            \"newLine\": true\n                                        },\n                                        {\n                                            \"key\": \"pre\",\n                                            \"newLine\": true\n                                        },\n                                        {\n                                            \"key\": \"nodes\",\n                                            \"newLine\": true,\n                                            \"endNewLine\": true,\n                                            \"subList\": [\n                                                {\n                                                    \"newLine\": true,\n                                                    \"subList\": [\n                                                        {\n                                                            \"key\": \"id\"\n                                                        },\n                                                        {\n                                                            \"key\": \"name\"\n                                                        },\n                                                        {\n                                                            \"key\": \"start\"\n                                                        },\n                                                        {\n                                                            \"key\": \"pre\"\n                                                        },\n                                                        {\n                                                            \"key\": \"action\"\n                                                        },\n                                                        {\n                                                            \"key\": \"post\"\n                                                        },\n                                                        {\n                                                            \"key\": \"properties\"\n                                                        }\n                                                    ]\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"key\": \"post\",\n                                            \"newLine\": true\n                                        }\n                                    ]\n                                }\n                            ]\n                        },\n                        {\n                            \"key\": \"post\",\n                            \"subList\": [\n                                {\n                                    \"key\": \"when\"\n                                },\n                                {\n                                    \"key\": \"to\"\n                                },\n                                {\n                                    \"key\": \"conditions\",\n                                    \"subList\": [\n                                        {\n                                            \"key\": \"default\",\n                                            \"subList\": [\n                                                {\n                                                    \"key\": \"when\"\n                                                },\n                                                {\n                                                    \"key\": \"to\"\n                                                }\n                                            ]\n                                        }\n                                    ]\n                                }\n                            ]\n                        },\n                        {\n                            \"key\": \"properties\",\n                            \"default\": {\n                                \"newLine\": true,\n                                \"endNewLine\": true\n                            }\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"key\": \"post\",\n            \"newLine\": true\n        },\n        {\n            \"key\": \"listeners\",\n            \"newLine\": true,\n            \"endNewLine\": true,\n            \"subList\": [\n                {\n                    \"newLine\": true\n                }\n            ]\n        },\n        {\n            \"key\": \"filters\",\n            \"newLine\": true,\n            \"endNewLine\": true,\n            \"subList\": [\n                {\n                    \"newLine\": true\n                }\n            ]\n        },\n        {\n            \"key\": \"nodeFilters\",\n            \"newLine\": true,\n            \"endNewLine\": true,\n            \"subList\": [\n                {\n                    \"newLine\": true\n                }\n            ]\n        },\n        {\n            \"key\": \"nodePreHandlerFilters\",\n            \"newLine\": true,\n            \"endNewLine\": true,\n            \"subList\": [\n                {\n                    \"newLine\": true\n                }\n            ]\n        },\n        {\n            \"key\": \"nodeActionFilters\",\n            \"newLine\": true,\n            \"endNewLine\": true,\n            \"subList\": [\n                {\n                    \"newLine\": true\n                }\n            ]\n        },\n        {\n            \"key\": \"nodePostHandlerFilters\",\n            \"newLine\": true,\n            \"endNewLine\": true,\n            \"subList\": [\n                {\n                    \"newLine\": true\n                }\n            ]\n        },\n        {\n            \"key\": \"properties\",\n            \"newLine\": true,\n            \"endNewLine\": true,\n            \"subList\": [\n                {\n                    \"keyType\": \"OTHER\",\n                    \"newLine\": true\n                }\n            ],\n            \"default\": {\n                \"newLine\": true,\n                \"endNewLine\": true\n            }\n        },\n        {\n            \"key\": \"parseListeners\",\n            \"newLine\": true,\n            \"endNewLine\": true,\n            \"subList\": [\n                {\n                    \"newLine\": true\n                }\n            ]\n        },\n        {\n            \"keyType\": \"OTHER\",\n            \"default\": {\n                \"newLine\": true,\n                \"endNewLine\": true\n            }\n        }                           \n          ]  \n            \n            \n        },\n        {\n            \"key\": \"id\"\n        },\n        {\n            \"key\": \"name\",\n            \"newLine\": true\n        },\n        {\n            \"key\": \"pre\",\n            \"newLine\": true\n        },\n        {\n            \"key\": \"nodes\",\n            \"newLine\": true,\n            \"endNewLine\": true,\n            \"subList\": [\n                {\n                    \"newLine\": true,\n                    \"subList\": [\n                        {\n                            \"key\": \"id\"\n                        },\n                        {\n                            \"key\": \"name\"\n                        },\n                        {\n                            \"key\": \"start\"\n                        },\n                        {\n                            \"key\": \"pre\"\n                        },\n                        {\n                            \"key\": \"action\",\n                            \"subList\": [\n                                {\n                                    \"key\": \"flow\",\n                                    \"subList\": [\n                                        {\n                                            \"key\": \"id\"\n                                        },\n                                        {\n                                            \"key\": \"name\",\n                                            \"newLine\": true\n                                        },\n                                        {\n                                            \"key\": \"pre\",\n                                            \"newLine\": true\n                                        },\n                                        {\n                                            \"key\": \"nodes\",\n                                            \"newLine\": true,\n                                            \"endNewLine\": true,\n                                            \"subList\": [\n                                                {\n                                                    \"newLine\": true,\n                                                    \"subList\": [\n                                                        {\n                                                            \"key\": \"id\"\n                                                        },\n                                                        {\n                                                            \"key\": \"name\"\n                                                        },\n                                                        {\n                                                            \"key\": \"start\"\n                                                        },\n                                                        {\n                                                            \"key\": \"pre\"\n                                                        },\n                                                        {\n                                                            \"key\": \"action\"\n                                                        },\n                                                        {\n                                                            \"key\": \"post\"\n                                                        },\n                                                        {\n                                                            \"key\": \"properties\"\n                                                        }\n                                                    ]\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"key\": \"post\",\n                                            \"newLine\": true\n                                        }\n                                    ]\n                                }\n                            ]\n                        },\n                        {\n                            \"key\": \"post\",\n                            \"subList\": [\n                                {\n                                    \"key\": \"when\"\n                                },\n                                {\n                                    \"key\": \"to\"\n                                },\n                                {\n                                    \"key\": \"conditions\",\n                                    \"subList\": [\n                                        {\n                                            \"subList\": [\n                                                {\n                                                    \"key\": \"when\"\n                                                },\n                                                {\n                                                    \"key\": \"to\"\n                                                }\n                                            ]\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"key\": \"defaultTo\"\n                                }\n                            ]\n                        },\n                        {\n                            \"key\": \"properties\",\n                            \"default\": {\n                                \"newLine\": true,\n                                \"endNewLine\": true\n                            }\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"key\": \"post\",\n            \"newLine\": true\n        },\n        {\n            \"key\": \"listeners\",\n            \"newLine\": true,\n            \"endNewLine\": true,\n            \"subList\": [\n                {\n                    \"newLine\": true\n                }\n            ]\n        },\n        {\n            \"key\": \"filters\",\n            \"newLine\": true,\n            \"endNewLine\": true,\n            \"subList\": [\n                {\n                    \"newLine\": true\n                }\n            ]\n        },\n        {\n            \"key\": \"nodeFilters\",\n            \"newLine\": true,\n            \"endNewLine\": true,\n            \"subList\": [\n                {\n                    \"newLine\": true\n                }\n            ]\n        },\n        {\n            \"key\": \"nodePreHandlerFilters\",\n            \"newLine\": true,\n            \"endNewLine\": true,\n            \"subList\": [\n                {\n                    \"newLine\": true\n                }\n            ]\n        },\n        {\n            \"key\": \"nodeActionFilters\",\n            \"newLine\": true,\n            \"endNewLine\": true,\n            \"subList\": [\n                {\n                    \"newLine\": true\n                }\n            ]\n        },\n        {\n            \"key\": \"nodePostHandlerFilters\",\n            \"newLine\": true,\n            \"endNewLine\": true,\n            \"subList\": [\n                {\n                    \"newLine\": true\n                }\n            ]\n        },\n        {\n            \"key\": \"properties\",\n            \"newLine\": true,\n            \"endNewLine\": true,\n            \"subList\": [\n                {\n                    \"keyType\": \"OTHER\",\n                    \"newLine\": true\n                }\n            ],\n            \"default\": {\n                \"newLine\": true,\n                \"endNewLine\": true\n            }\n        },\n        {\n            \"key\": \"parseListeners\",\n            \"newLine\": true,\n            \"endNewLine\": true,\n            \"subList\": [\n                {\n                    \"newLine\": true\n                }\n            ]\n        },\n        {\n            \"keyType\": \"OTHER\",\n            \"default\": {\n                \"newLine\": true,\n                \"endNewLine\": true\n            }\n        }\n    ]\n}"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/FlowTestSuite.java",
    "content": "package com.jd.easyflow.flow;\n\nimport org.junit.runner.RunWith;\nimport org.junit.runners.Suite;\nimport org.junit.runners.Suite.SuiteClasses;\n\nimport com.jd.easyflow.flow.cases.action.ActionTest;\nimport com.jd.easyflow.flow.cases.action.LoopNodeActionTest;\nimport com.jd.easyflow.flow.cases.action.MultipleActionTest;\nimport com.jd.easyflow.flow.cases.event.EventFlowTest;\nimport com.jd.easyflow.flow.cases.filter.FilterTest;\nimport com.jd.easyflow.flow.cases.flowengine.FlowEngineImplTest;\nimport com.jd.easyflow.flow.cases.inclusive.InclusiveTest;\nimport com.jd.easyflow.flow.cases.interrupt.InterruptTest;\nimport com.jd.easyflow.flow.cases.listener.InterruptFlowListenerTest;\nimport com.jd.easyflow.flow.cases.logflag.LogFlagTest;\nimport com.jd.easyflow.flow.cases.mockbiz.MockLoanTest;\nimport com.jd.easyflow.flow.cases.parallel.ParallelTest;\nimport com.jd.easyflow.flow.cases.parser.FlowParserTest;\nimport com.jd.easyflow.flow.cases.performance.PerformanceTest;\nimport com.jd.easyflow.flow.cases.posthandler.ConditionalPostHandlerTest;\nimport com.jd.easyflow.flow.cases.posthandler.FlowIndexTest;\nimport com.jd.easyflow.flow.cases.posthandler.NodePostHandlerTest;\nimport com.jd.easyflow.flow.cases.posthandler.PostHandlerFilterTest;\nimport com.jd.easyflow.flow.cases.prehandler.PreHandlerTest;\nimport com.jd.easyflow.flow.cases.pretty.FlowDefPrettyHelperTest;\nimport com.jd.easyflow.flow.cases.runner.MultiThreadTest;\nimport com.jd.easyflow.flow.cases.runner.ReusableThreadTest;\nimport com.jd.easyflow.flow.cases.spring.SpringFlowTest;\nimport com.jd.easyflow.flow.cases.subflow.SubFlowTest;\nimport com.jd.easyflow.flow.quickstart.QuickStartTest;\n\n/**\n * \n * @author liyuliang5\n *\n */\n@RunWith(Suite.class)\n@SuiteClasses ({\n    QuickStartTest.class,\n    MockLoanTest.class,\n    FlowEngineImplTest.class,\n    MultiThreadTest.class,\n    ReusableThreadTest.class,\n    EventFlowTest.class,\n    FlowIndexTest.class,\n    FlowParserTest.class,\n    NodePostHandlerTest.class,\n    PostHandlerFilterTest.class,\n    SubFlowTest.class,\n    ParallelTest.class,\n    PreHandlerTest.class,\n    FlowDefPrettyHelperTest.class,\n    LoopNodeActionTest.class,\n    ActionTest.class,\n    LoopNodeActionTest.class,\n    InclusiveTest.class,\n    InterruptFlowListenerTest.class,\n    FilterTest.class,\n    InterruptTest.class,\n    LogFlagTest.class,\n    PerformanceTest.class,\n    ConditionalPostHandlerTest.class,\n    PreHandlerTest.class,\n    FlowDefPrettyHelperTest.class,\n    SpringFlowTest.class,\n    MultipleActionTest.class\n})\npublic class FlowTestSuite {\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/action/ActionTest.java",
    "content": "package com.jd.easyflow.flow.cases.action;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ActionTest {\n    \n    private static final Logger logger = LoggerFactory.getLogger(ActionTest.class);\n\n    /**\n     * Test interrupt.\n     */\n    @Test\n    public void testActionInterrupt001() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/action/action_interrupt_001.json\");\n        flowEngine.init();\n        \n        FlowParam param = new FlowParam(\"action_interrupt_test_001\");\n        FlowResult result = flowEngine.execute(param);\n        logger.info(\"biz result:\" + result.getResult());\n    }\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/action/CompensateTest.java",
    "content": "package com.jd.easyflow.flow.cases.action;\n\nimport static org.junit.Assert.assertEquals;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.action.compensate.CompensateAction;\nimport com.jd.easyflow.flow.model.action.compensate.CompensateFlowParseEventListener;\nimport com.jd.easyflow.flow.model.action.compensate.CompensateHelper;\nimport com.jd.easyflow.flow.model.parser.FlowParserImpl;\nimport com.jd.easyflow.flow.util.FlowUtil;\n\n/**\n * @author liyuliang5\n */\npublic class CompensateTest {\n    \n    private static final Logger logger = LoggerFactory.getLogger(CompensateTest.class);\n\n    @Test\n    public void testCompensate() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:/flow/cases/action/compensate_001.json\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"compensate_001\");\n        FlowResult result = flowEngine.execute(param);\n        assertEquals(\"node001\", result.getContext().getEndNodes().get(0).getNodeId());\n        \n    }\n    \n    @Test\n    public void testCompensate002() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:/flow/cases/action/compensate_002.json\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"compensate_002\");\n        FlowResult result = flowEngine.execute(param);\n        \n    }\n    \n    @Test\n    public void testCompensateFlow() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        FlowParserImpl flowParser = new FlowParserImpl();\n        flowParser.setPostListeners(Arrays.asList(new CompensateFlowParseEventListener()));\n        flowEngine.setFlowParser(flowParser);\n        flowEngine.setFlowPath(\"classpath:/flow/cases/action/compensate_flow_001.json\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"compensate_flow_001\");\n        FlowResult result = flowEngine.execute(param);\n        \n        logger.info(\"start compensate flow\");\n        List<NodeContext> endNodes = result.getContext().getEndNodes();\n        List<NodeContext> startNodes = new ArrayList<NodeContext>();\n        for (NodeContext endNode : endNodes) {\n            NodeContext startNode = CompensateHelper.createCompensateNode(endNode);\n            startNodes.add(startNode);\n        }\n        FlowParam param2 = new FlowParam();\n        result.getContext().setStartNodes(startNodes);\n        param2.setContext(result.getContext());\n        FlowResult compensateResult = result.getContext().getFlowEngine().execute(param2);\n        \n        \n    }\n    \n    @Test\n    public void testCompensateFlowFilter() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        FlowParserImpl flowParser = new FlowParserImpl();\n        flowParser.setPostListeners(Arrays.asList(new CompensateFlowParseEventListener()));\n        flowEngine.setFlowParser(flowParser);\n        flowEngine.setFlowPath(\"classpath:/flow/cases/action/compensate_flow_001.json\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"compensate_flow_001\");\n        FlowResult result = flowEngine.execute(param);\n        \n        logger.info(\"start compensate flow\");\n        CompensateHelper.compensate(result.getContext());\n        FlowParam param2 = new FlowParam();\n        param2.setContext(result.getContext());\n        FlowResult compensateResult = result.getContext().getFlowEngine().execute(param2);\n        \n        \n    }\n    \n    public static class TestCompensateNodeAction implements NodeAction, CompensateAction {\n        \n        public TestCompensateNodeAction() {\n        }\n\n        @Override\n        public <T> T execute(NodeContext nodeContext, FlowContext context) {\n            logger.info(\"execute:\" + FlowUtil.node(nodeContext, context).getId());\n            return null;\n        }\n\n        @Override\n        public <T> T compensate(NodeContext nodeContext, FlowContext context) {\n            logger.info(\"compensate:\" + FlowUtil.node(nodeContext, context).getId());\n            return null;\n        }\n        \n    }\n   \n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/action/LoopNodeActionTest.java",
    "content": "package com.jd.easyflow.flow.cases.action;\n\nimport java.util.Arrays;\n\nimport org.junit.Test;\n\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class LoopNodeActionTest {\n\n    /**\n     * Test customize action.\n     */\n    @Test\n    public void testLoop001() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/action/loop_test_001.json\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"loop_test_001\", null);\n        param.put(\"loopMaxCount\", 3);\n        param.put(\"data\", Arrays.asList(\"1\",\"2\",\"3\",\"4\"));\n        FlowResult result = flowEngine.execute(param);\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/action/MockActionClass.java",
    "content": "package com.jd.easyflow.flow.cases.action;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class MockActionClass {\n\n    public Map<String, Object> method1(Map<String, Object> param) {\n        Map<String, Object> result = new HashMap<>();\n        result.put(\"r1\", \"hello \" + param.get(\"A\"));\n        result.put(\"r2\", \"hello r2\");\n        return result;\n    }\n    \n    public Map<String, Object> method3(Map<String, Object> param) {\n        Map<String, Object> result = new HashMap<>();\n        result.put(\"r3\", \"hello \" + param.get(\"A\"));\n        return result;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/action/MockClassMethodAction.java",
    "content": "package com.jd.easyflow.flow.cases.action;\n\nimport java.lang.reflect.InvocationTargetException;\nimport java.lang.reflect.Method;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.util.ClassUtils;\n\nimport com.jd.easyflow.flow.el.ElFactory;\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.exception.FlowException;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class MockClassMethodAction implements NodeAction {\n\n    private static final Logger logger = LoggerFactory.getLogger(MockClassMethodAction.class);\n\n    private Object instance;\n\n    private Method method;\n\n    private List<Map<String, Object>> paramList;\n\n    private List<Map<String, Object>> resultList;\n    \n    private String nodeId;\n\n    public MockClassMethodAction(Map<String, Object> actionConf, FlowNode node) throws Exception {\n        String classMethod = (String) actionConf.get(\"classMethod\");\n        paramList = (List<Map<String, Object>>) actionConf.get(\"param\");\n        resultList = (List<Map<String, Object>>) actionConf.get(\"result\");\n\n        String[] info = classMethod.split(\"::\");\n        String clazzName = info[0];\n        String methodName = info[1];\n        Class clazz = Class.forName(clazzName);\n        method = ClassUtils.getMethod(clazz, methodName, Map.class);\n        instance = clazz.newInstance();\n        \n        nodeId = node.getId();\n    }\n\n    @Override\n    public <T> T execute(NodeContext nodeContext, FlowContext context) {\n        Map<String, Object> paramMap = new HashMap<>();\n        Map<String, Object> nodeActionMap = context.get(\"nodeActionInfoMap\");\n        for (Map<String, Object> param : paramList) {\n            String key = (String) param.get(\"key\");\n            String valueExp = (String) param.get(\"value\");\n            Map<String, Object> contextMap = new HashMap<>();\n            contextMap.put(\"node\", nodeActionMap);\n            String value = context.getElEvaluator().eval(valueExp, nodeContext, context, contextMap);\n            paramMap.put(key, value);\n        }\n        try {\n            logger.info(\"Param:\" + paramMap);\n            Map<String, Object> resultMap = (Map<String, Object>) method.invoke(instance, paramMap);\n            logger.info(\"Result:\" + resultMap);\n            Map<String, Object> outputMap = new HashMap<>();\n            for (Map<String, Object> result : resultList) {\n                String key = (String) result.get(\"key\");\n                outputMap.put(key, result.get(\"key\"));\n            }\n            Map<String, Object> info = new HashMap<>();\n            info.put(\"res\", outputMap);\n            nodeActionMap.put(nodeId, info);\n            \n        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {\n            throw new FlowException(e);\n        }\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/action/MockInputOutputEventListener.java",
    "content": "package com.jd.easyflow.flow.cases.action;\n\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.event.FlowEvent;\nimport com.jd.easyflow.flow.engine.event.FlowEventListener;\nimport com.jd.easyflow.flow.util.FlowEventTypes;\nimport com.jd.easyflow.flow.util.Pair;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class MockInputOutputEventListener implements FlowEventListener {\n\n    private List<Map<String, Object>> paramList;\n\n    private List<Map<String, Object>> resultList;\n\n    public MockInputOutputEventListener(Map<String, Object> conf) {\n        paramList = (List<Map<String, Object>>) conf.get(\"param\");\n        resultList = (List<Map<String, Object>>) conf.get(\"result\");\n    }\n\n    public Pair<String, Integer>[] getAcceptedEvents() {\n        return new Pair[] { Pair.of(FlowEventTypes.FLOW_START, 0), Pair.of(FlowEventTypes.FLOW_END, 0),\n                Pair.of(FlowEventTypes.FLOW_COMPLETE, 0) };\n    }\n\n    @Override\n    public void on(FlowEvent flowEvent) {\n        FlowContext context = flowEvent.getContext();\n        switch (flowEvent.getType()) {\n        case FlowEventTypes.FLOW_START: {\n            context.put(\"nodeActionInfoMap\", new ConcurrentHashMap<String, Map>());\n\n            Map<String, Object> paramMap = new HashMap<>();\n            Map<String, Object> nodeActionMap = context.get(\"nodeActionInfoMap\");\n            Map<String, Object> contextMap = new HashMap<>();\n            contextMap.put(\"node\", nodeActionMap);\n            for (Map<String, Object> param : paramList) {\n                String key = (String) param.get(\"key\");\n                String valueExp = (String) param.get(\"value\");\n                String value = context.getElEvaluator().eval(valueExp, null, context, contextMap);\n                paramMap.put(key, value);\n            }\n            context.getParam().setParam(paramMap);\n            break;\n        }\n        case FlowEventTypes.FLOW_END: {\n            Map<String, Object> outputMap = new HashMap<>();\n            Map<String, Object> contextMap = new HashMap<>();\n            contextMap.put(\"node\", context.get(\"nodeActionInfoMap\"));\n            for (Map<String, Object> result : resultList) {\n                String key = (String) result.get(\"key\");\n                String valueExp = (String) result.get(\"value\");\n                String value = context.getElEvaluator().eval(valueExp, null, context, contextMap);\n                outputMap.put(key, value);\n            }\n            context.getResult().setResult(outputMap);\n            break;\n        }\n        case FlowEventTypes.FLOW_COMPLETE: {\n            break;\n        }\n\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/action/MultipleActionTest.java",
    "content": "package com.jd.easyflow.flow.cases.action;\n\nimport org.junit.Test;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\nimport com.jd.easyflow.flow.exception.FlowException;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.InitContext;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.parser.param.ActionParseParam;\n\n/**\n * @author liyuliang5\n */\npublic class MultipleActionTest {\n\n    \n    @Test\n    public void testMultipleActionNodeAction() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/action/multiple_action_001.json\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"multi_action_001\");\n        FlowResult result = flowEngine.execute(param);\n    }\n    \n    \n    \n    \n    public static class TestMultipleActionNodeAction implements NodeAction {\n\n        // Action\n        protected NodeAction action;\n        \n        @Override\n        public <T> T execute(NodeContext nodeContext, FlowContext context) {\n            for (int i = 0; i < 10; i++) {\n                action.execute(nodeContext, context);\n            }\n            return null;\n        }\n        \n\n        @Override\n        public void init(InitContext initContext, Object parent) {\n            \n            FlowNode node = (FlowNode) parent;\n            Object actionConf = node.getProperty(\"action\");\n            if (actionConf != null) {\n                ActionParseParam param = new ActionParseParam(actionConf, initContext.getFlowList(),\n                        initContext.isParseEl(), initContext.getFlow(), node);\n                action = initContext.getFlowParser().parseNodeAction(param);\n            }\n            if (action != null) {\n                action.init(initContext, node);\n            }\n            if (initContext.isParseEl()) {\n                if (action == null) {\n                    throw new FlowException(\"Action can not be null\");\n                }\n            }\n            \n        }\n\n        \n    }\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/common/TestNodeExecutor.java",
    "content": "package com.jd.easyflow.flow.cases.common;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.NodeExecutor;\n\n/**\n * @author liyuliang5\n */\npublic class TestNodeExecutor implements NodeExecutor {\n    \n    private Object value;\n    \n    public TestNodeExecutor(Object value) {\n        this.value = value;\n    }\n\n    @Override\n    public Object execute(NodeContext nodeContext, FlowContext context) {\n        return value;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/event/EventFlowTest.java",
    "content": "package com.jd.easyflow.flow.cases.event;\n\nimport static org.junit.Assert.assertEquals;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\nimport com.jd.easyflow.flow.util.FlowConstants;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class EventFlowTest {\n\n    public static final Logger logger = LoggerFactory.getLogger(EventFlowTest.class);\n\n    @Test\n    public void testEvent1() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/event/flow_event_001.json\");\n        flowEngine.init();\n        \n        FlowParam param = new FlowParam(\"flow_event_001\", \"EMPTY_NODE\", null);\n        param.put(FlowConstants.PARAM_DATA_EVENT, \"EVENT1\");\n        FlowResult result = flowEngine.execute(param);\n        logger.info(\"Result:\" + result);\n        assertEquals(\"EMPTY_NODE\", result.getContext().getEndNodes().get(0).getNodeId());\n    }\n    \n    @Test\n    public void testEvent2() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/event/flow_event_001.json\");\n        flowEngine.init();\n        \n        FlowParam param = new FlowParam(\"flow_event_001\", \"EMPTY_NODE\", null);\n        param.put(FlowConstants.PARAM_DATA_EVENT, \"EVENT2\");\n        FlowResult result = flowEngine.execute(param);\n        logger.info(\"Result:\" + result);\n        assertEquals(\"EMPTY_NODE\", result.getContext().getEndNodes().get(0).getNodeId());\n    }\n    \n    @Test\n    public void testEvent3() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/event/flow_event_001.json\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"flow_event_001\", \"EMPTY_NODE\", null);\n        param.put(FlowConstants.PARAM_DATA_EVENT, \"EVENT3\");\n        FlowResult result = flowEngine.execute(param);\n        logger.info(\"Result:\" + result);\n        assertEquals(\"EMPTY_NODE2\", result.getContext().getEndNodes().get(0).getNodeId());\n    }\n    \n    @Test\n    public void testEvent3OfFlow002() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/event/flow_event_002.json\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"flow_event_002\", \"EMPTY_NODE\", null);\n        param.put(FlowConstants.PARAM_DATA_EVENT, \"EVENT3\");\n        FlowResult result = flowEngine.execute(param);\n        logger.info(\"Result:\" + result);\n        assertEquals(\"EMPTY_NODE2\", result.getContext().getEndNodes().get(0).getNodeId());\n    }\n    \n    @Test\n    public void testEvent4() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/event/flow_event_003.json\");\n        flowEngine.init();\n        \n        FlowParam param = new FlowParam(\"flow_event_003\", \"EMPTY_NODE\", null);\n        param.put(FlowConstants.PARAM_DATA_EVENT, \"EVENT1\");\n        FlowResult result = flowEngine.execute(param);\n        logger.info(\"Result:\" + result);\n        assertEquals(\"EMPTY_NODE\", result.getContext().getEndNodes().get(0).getNodeId());\n    }\n    \n    @Test\n    public void testEventNoListener001() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/event/flow_event_nolistener_001.json\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"flow_event_nolistener_001\", \"EMPTY_NODE\", null);\n        param.put(FlowConstants.PARAM_DATA_EVENT, \"EVENT3\");\n        FlowResult result = flowEngine.execute(param);\n        logger.info(\"Result:\" + result);\n        assertEquals(\"EMPTY_NODE2\", result.getContext().getEndNodes().get(0).getNodeId());\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/event/TestEventNodeAction.java",
    "content": "package com.jd.easyflow.flow.cases.event;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * Test event node action\n * @author liyuliang5\n *\n */\npublic class TestEventNodeAction implements NodeAction  {\n    \n    private static final Logger logger = LoggerFactory.getLogger(TestEventNodeAction.class);\n\n    @Override\n    public Map<String, Object> execute(NodeContext nodeContext, FlowContext context) {\n        logger.info(\"Start execute event node action\");\n        Map<String, Object> result =  new HashMap<>();\n        result.put(\"result1\", 1);\n        return result;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/filter/FilterTest.java",
    "content": "package com.jd.easyflow.flow.cases.filter;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertTrue;\n\nimport java.lang.reflect.Method;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.util.ReflectionUtils;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowEngine;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.filter.impl.BaseFlowEngineFilter;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\nimport com.jd.easyflow.flow.filter.BaseFilter;\nimport com.jd.easyflow.flow.filter.Filter;\nimport com.jd.easyflow.flow.filter.FilterChain;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.NodeContextAccessor;\nimport com.jd.easyflow.flow.model.filter.FlowFilterManager;\nimport com.jd.easyflow.flow.model.filter.impl.BaseFlowFilter;\nimport com.jd.easyflow.flow.model.filter.impl.BaseNodeFilter;\nimport com.jd.easyflow.flow.util.Pair;\nimport com.jd.easyflow.flow.util.Triple;\n\n/**\n * @author liyuliang5\n * \n */\npublic class FilterTest {\n    \n    @Test\n    public void testInnerNodeActionFilter() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/filter/inner_node_action_filter_001.json\");\n        flowEngine.init();\n        // false false\n        FlowParam param = new FlowParam(\"innerNodeActionFilter001\");\n        FlowResult result = flowEngine.execute(param);\n        assertEquals(\"node002\", result.getContext().getEndNodes().get(0).getNodeId());\n    }\n    \n\n    \n    @Test\n    public void testInnerFlowEngineFilter() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/filter/inner_flow_engine_filter_001.json\");\n        TestInnerFlowEngineFilter filter = new TestInnerFlowEngineFilter();\n        filter.setOrder(-1);\n        flowEngine.setFilters(Arrays.asList(filter));\n        flowEngine.init();\n        // false false\n        FlowParam param = new FlowParam(\"innerFlowEngineFilter001\");\n        FlowResult result = flowEngine.execute(param);\n        assertEquals(true, param.get(\"flowEngineFilter\"));\n    }\n    \n    @Test\n    public void testInnerFlowFilter() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/filter/inner_flow_filter_001.json\");\n        flowEngine.init();\n        // false false\n        FlowParam param = new FlowParam(\"innerFlowFilter001\");\n        FlowResult result = flowEngine.execute(param);\n        assertEquals(true, param.get(\"flowFilter\"));\n        assertEquals(true, param.get(\"nodeFilter\"));\n        assertEquals(\"node002\", result.getContext().getEndNodes().get(0).getNodeId());\n\n    }\n    \n    @Test\n    public void testAddFilter() throws Exception {\n        Method method = FlowFilterManager.class.getDeclaredMethod(\"addFilter\", Filter.class, List.class, List.class);\n        method.setAccessible(true);\n        List<TestEmptyFilter> innerList = new ArrayList<TestEmptyFilter>();\n        List<TestEmptyFilter> outerList = new ArrayList<TestEmptyFilter>();\n        \n        /*0 {} {}*/\n        outerList.clear();\n        innerList.clear();\n        Filter filter = new TestEmptyFilter(\"\", 0);\n        ReflectionUtils.invokeMethod(method, new FlowFilterManager(), filter, innerList, outerList);\n        assertTrue(outerList.size() == 1);\n        assertTrue(innerList.size() == 0);\n        /*1 {} {}*/\n        outerList.clear();\n        innerList.clear();\n        filter = new TestEmptyFilter(\"\", 1);\n        ReflectionUtils.invokeMethod(method, new FlowFilterManager(), filter, innerList, outerList);\n        assertTrue(outerList.size() == 1);\n        assertTrue(innerList.size() == 0);\n        \n        /*-1 {} {}*/\n        outerList.clear();\n        innerList.clear();\n        filter = new TestEmptyFilter(\"\", -1);\n        ReflectionUtils.invokeMethod(method, new FlowFilterManager(), filter, innerList, outerList);\n        assertTrue(outerList.size() == 0);\n        assertTrue(innerList.size() == 1);\n        \n        /*0 {} {0}*/\n        outerList.clear();\n        innerList.clear();\n        filter = new TestEmptyFilter(\"new\", 0);\n        outerList.add(new TestEmptyFilter(\"0\", 0));\n        ReflectionUtils.invokeMethod(method, new FlowFilterManager(), filter, innerList, outerList);\n        assertTrue(outerList.size() == 2);\n        assertTrue(innerList.size() == 0);\n        assertTrue(outerList.get(1).id.equals(\"new\"));\n        \n        /*2 {} {1}*/\n        outerList.clear();\n        innerList.clear();\n        filter = new TestEmptyFilter(\"new\", 2);\n        outerList.add(new TestEmptyFilter(\"0\", 1));\n        ReflectionUtils.invokeMethod(method, new FlowFilterManager(), filter, innerList, outerList);\n        assertTrue(outerList.size() == 2);\n        assertTrue(innerList.size() == 0);\n        assertTrue(outerList.get(0).id.equals(\"new\"));\n        \n        /*2 {} {3}*/\n        outerList.clear();\n        innerList.clear();\n        filter = new TestEmptyFilter(\"new\", 2);\n        outerList.add(new TestEmptyFilter(\"0\", 3));\n        ReflectionUtils.invokeMethod(method, new FlowFilterManager(), filter, innerList, outerList);\n        assertTrue(outerList.size() == 2);\n        assertTrue(innerList.size() == 0);\n        assertTrue(outerList.get(1).id.equals(\"new\"));\n        \n        /*-2 {-2} {}*/\n        outerList.clear();\n        innerList.clear();\n        filter = new TestEmptyFilter(\"new\", -2);\n        innerList.add(new TestEmptyFilter(\"0\", -2));\n        ReflectionUtils.invokeMethod(method, new FlowFilterManager(), filter, innerList, outerList);\n        assertTrue(outerList.size() == 0);\n        assertTrue(innerList.size() == 2);\n        assertTrue(innerList.get(1).id.equals(\"new\"));\n        \n        /*-2 {-1} {}*/\n        outerList.clear();\n        innerList.clear();\n        filter = new TestEmptyFilter(\"new\", -2);\n        innerList.add(new TestEmptyFilter(\"0\", -1));\n        ReflectionUtils.invokeMethod(method, new FlowFilterManager(), filter, innerList, outerList);\n        assertTrue(outerList.size() == 0);\n        assertTrue(innerList.size() == 2);\n        assertTrue(innerList.get(1).id.equals(\"new\"));\n        \n        /*-2 {-3} {}*/\n        outerList.clear();\n        innerList.clear();\n        filter = new TestEmptyFilter(\"new\", -2);\n        innerList.add(new TestEmptyFilter(\"0\", -3));\n        ReflectionUtils.invokeMethod(method, new FlowFilterManager(), filter, innerList, outerList);\n        assertTrue(outerList.size() == 0);\n        assertTrue(innerList.size() == 2);\n        assertTrue(innerList.get(0).id.equals(\"new\"));\n        \n    }\n    \n    static class TestEmptyFilter implements Filter {\n        \n        private int order;\n        \n        private String id;\n        \n        public TestEmptyFilter(String id, int order) {\n            this.id = id;\n            this.order = order;\n        }\n        \n        public int getOrder() {\n            return order;\n        }\n\n        @Override\n        public Object doFilter(Object request, FilterChain chain) {\n            return null;\n        }\n        \n    }\n    \n    public static class TestNodeActionFilter extends BaseFilter<Pair<NodeContext, FlowContext>, Object> {\n        \n        private static final Logger logger = LoggerFactory.getLogger(TestNodeActionFilter.class);\n        \n        @Override\n        public Object doFilter(Pair<NodeContext, FlowContext> request,\n                FilterChain<Pair<NodeContext, FlowContext>, Object> chain) {\n            Object result = chain.doFilter(request);\n            logger.info(\"result:{}, nodeActionResult:{}\", result, request.getLeft().getActionResult());\n            return 1;\n        }\n        \n    }\n    \n    static class TestInnerFlowEngineFilter extends BaseFlowEngineFilter {\n        \n        @Override\n        public FlowResult doFilter(Pair<FlowParam, FlowEngine> request,\n                FilterChain<Pair<FlowParam, FlowEngine>, FlowResult> chain) {\n            request.getLeft().put(\"flowEngineFilter\", true);\n            return chain.doFilter(request);\n        }\n    }\n    \n    public static class TestInnerFlowFilter extends BaseFlowFilter {\n        \n        public TestInnerFlowFilter(int order) {\n            this.order = order;\n        }\n\n        @Override\n        public FlowResult doFilter(FlowContext request, FilterChain<FlowContext, FlowResult> chain) {\n            request.getParam().put(\"flowFilter\", true);;\n            return chain.doFilter(request);\n        }\n        \n    }\n    \n    public static class TestInnerNodeFilter extends BaseNodeFilter {\n        \n        @Override\n        public NodeContext doFilter(Triple<FlowNode, NodeContext, FlowContext> request,\n                FilterChain<Triple<FlowNode, NodeContext, FlowContext>, NodeContext> chain) {\n            if (request.getLeft().getId().equals(\"node002\")) {\n                return chain.doFilter(request);\n            }\n            \n            request.getRight().getParam().put(\"nodeFilter\", true);\n            NodeContext nodeContext = chain.doFilter(request);\n            NodeContextAccessor.setNextNodeIds(nodeContext, new String[]{\"node002\"});\n            return nodeContext;\n        }\n        \n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/flowengine/FlowEngineImplTest.java",
    "content": "package com.jd.easyflow.flow.cases.flowengine;\n\nimport static org.junit.Assert.assertEquals;\n\nimport java.util.Arrays;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowEngine;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.builder.FlowParamBuilder;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\nimport com.jd.easyflow.flow.filter.Filter;\nimport com.jd.easyflow.flow.filter.FilterChain;\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.flow.model.action.ExecutorNodeAction;\nimport com.jd.easyflow.flow.model.builder.FlowBuilder;\nimport com.jd.easyflow.flow.util.Pair;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FlowEngineImplTest {\n\t\n\tpublic static final Logger logger = LoggerFactory.getLogger(FlowEngineImplTest.class);\n\n    /**\n     * \n     * Basic flow engine test.\n     * Steps: define flow, execute flow, validate result\n     *\n     */\n\t@Test\n    public void testSample() {\n    \t//define flow\n        Flow flow = FlowBuilder.create(\"test\", \"testName\")\n        \t\t//add node\n        \t\t.addNode(\"node1\", new ExecutorNodeAction((nc, c) -> {logger.info(\"hello\"); return \"hello\";}))\n        \t\t.build();\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.addFlow(flow);\n        flowEngine.init();\n        \n        // create param\n        FlowParam param = FlowParamBuilder.create(\"test\", \"node1\").build();\n        // execute flow\n        FlowResult result = flowEngine.execute(param);\n        // print result\n        logger.info(\"Result:\" + result);\n        \n    }\n\t\n\t/**\n\t * Change flowId from test to test2 by filter.\n\t */\n\t@Test\n\tpublic void testFlowEngineFilter() {\n\t    Flow flow1 = FlowBuilder.create(\"test\", null).build();\n\t    Flow flow2 = FlowBuilder.create(\"test2\", null).build();\n\t    FlowEngineImpl flowEngine = new FlowEngineImpl();\n\t    flowEngine.addFlow(flow1);\n\t    flowEngine.addFlow(flow2);\n\t    flowEngine.getFilterManager().setFilters(Arrays.asList(new TestFlowEngineFilter()));\n\t    flowEngine.init();\n\t    \n\t    FlowParam param = new FlowParam(\"test\", new String[] {}, null);\n\t    flowEngine.execute(param);\n\t    assertEquals(\"test2\", param.getFlowId());\n\t}\n}\n\nclass TestFlowEngineFilter implements Filter<Pair<FlowParam, FlowEngine>, FlowResult> {\n\n    @Override\n    public FlowResult doFilter(Pair<FlowParam, FlowEngine> request,\n            FilterChain<Pair<FlowParam, FlowEngine>, FlowResult> chain) {\n        request.getLeft().setFlowId(\"test2\");\n        return chain.doFilter(request);\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/flowengine/PocFlowEngineImpl.java",
    "content": "package com.jd.easyflow.flow.cases.flowengine;\n\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowEngine;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowContextImpl;\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * This is only a POC demo of FlowEngine.\n * @author liyuliang5\n */\npublic abstract class PocFlowEngineImpl implements FlowEngine {\n\n    protected Map<String, Flow> flowMap = new ConcurrentHashMap<>();\n\n    /**\n     * Start flow engine, exeucte flow.\n     */\n    @Override\n    public FlowResult execute(FlowParam param) {\n        // init flow context\n        FlowContext context = new FlowContextImpl();\n        context.setParam(param);\n        FlowResult result = new FlowResult();\n        context.setResult(result);\n        result.setContext(context);\n        context.setFlow(flowMap.get(param.getFlowId()));\n\n        // init start nodes\n        String[] nodeIds = context.getParam().getNodeIds();\n        NodeContext[] nodes = new NodeContext[nodeIds.length];\n        for (int i = 0; i < nodeIds.length; i++) {\n            nodes[i] = new NodeContext(nodeIds[i]);\n        }\n        ((FlowContextImpl) context).addNodes(nodes);\n\n        // run\n        NodeContext currentNode;\n        FlowContextImpl contextImpl = (FlowContextImpl) context;\n        // Loop execute.\n        while ((currentNode = contextImpl.getNextNode()) != null) {\n            FlowNode node = context.getFlow().getNode(currentNode.getNodeId());\n            NodeContext[] nextNodes = null;\n            // @see PocNodeImpl\n            node.execute(currentNode, context);\n            // get next nodes\n            nextNodes = currentNode.getNextNodes();\n            if (nextNodes != null) {\n                contextImpl.addNodes(nextNodes);\n            }\n        }\n        \n        // return result\n        return context.getResult();\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/flowengine/PocNodeImpl.java",
    "content": "package com.jd.easyflow.flow.cases.flowengine;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.NodeContextAccessor;\nimport com.jd.easyflow.flow.model.NodePostHandler;\nimport com.jd.easyflow.flow.model.NodePreHandler;\n\n/**\n * This is only a POC demo of FlowNode.\n * \n * @author liyuliang5\n */\npublic abstract class PocNodeImpl implements FlowNode {\n\n    protected NodePreHandler preHandler;\n\n    protected NodeAction action;\n\n    protected NodePostHandler postHandler;\n\n    @Override\n    public NodeContext execute(NodeContext nodeContext, FlowContext context) {\n        boolean preResult = true;\n        if (preHandler != null) {\n            preResult = preHandler.preHandle(nodeContext, context);\n            NodeContextAccessor.setPreResult(nodeContext, preResult);\n        }\n        if (!preResult) {\n            return nodeContext;\n        }\n\n        if (action != null) {\n            Object result = action.execute(nodeContext, context);\n            NodeContextAccessor.setActionResult(nodeContext,result);\n        }\n\n        if (postHandler != null) {\n            NodeContext[] nextNodes = postHandler.postHandle(nodeContext, context);\n            if (nextNodes != null) {\n                NodeContextAccessor.setNextNodes(nodeContext,nextNodes);\n            }\n        }\n\n        return nodeContext;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/inclusive/InclusiveTest.java",
    "content": "package com.jd.easyflow.flow.cases.inclusive;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertTrue;\n\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport org.junit.Test;\n\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.util.FlowConstants;\nimport com.jd.easyflow.flow.util.FlowUtil;\n\npublic class InclusiveTest {\n\n    @Test\n    public void testInclusive001() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/inclusive/flow_inclusive201.json\");\n        flowEngine.init();\n        // false false\n        FlowParam param = new FlowParam(\"flow_inclusive201\");\n        param.setParam(3);\n        FlowResult result = flowEngine.execute(param);\n        List<String> endNodeIds = FlowUtil.nodeIdsOfNodeContextList(result.getContext().getEndNodes());\n        assertEquals(1, endNodeIds.size());\n        assertTrue(endNodeIds.contains(\"START_NODE\"));\n    }\n    \n    /**\n     * test inclusive nodes.\n     */\n    @Test\n    public void testInclusive002() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/inclusive/flow_inclusive201.json\");\n        flowEngine.init();\n        // true false\n        FlowParam param = new FlowParam(\"flow_inclusive201\");\n        param.setParam(1);\n        FlowResult result = flowEngine.execute(param);\n        List<String> endNodeIds = FlowUtil.nodeIdsOfNodeContextList(result.getContext().getEndNodes());\n        assertEquals(1, endNodeIds.size());\n        assertTrue(endNodeIds.contains(\"END\"));\n        NodeContext endNode = result.getContext().getEndNodes().stream().filter(node->node.getNodeId().equals(\"END\")).findFirst().get();\n        List<NodeContext> previousNodeList = endNode.getPreviousNode().get(FlowConstants.NODECTX_PREVIOUS_NODES);\n        assertEquals(1, previousNodeList.size());\n        assertEquals(\"NODE2\", previousNodeList.get(0).getNodeId());\n    }\n    \n    /**\n     * test inclusive nodes.\n     */\n    @Test\n    public void testInclusive003() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/inclusive/flow_inclusive201.json\");\n        flowEngine.init();\n        // true true\n        FlowParam param = new FlowParam(\"flow_inclusive201\");\n        param.setParam(0);\n        FlowResult result = flowEngine.execute(param);\n        List<String> endNodeIds = FlowUtil.nodeIdsOfNodeContextList(result.getContext().getEndNodes());\n        assertEquals(2, endNodeIds.size());\n        assertTrue(endNodeIds.contains(\"END\"));\n    }\n    \n    \n    /**\n     * test inclusive nodes.\n     */\n    @Test\n    public void testInclusive004() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/inclusive/flow_inclusive202.json\");\n        flowEngine.init();\n        // true false\n        FlowParam param = new FlowParam(\"flow_inclusive202\");\n        param.setParam(1);\n        FlowResult result = flowEngine.execute(param);\n        List<String> endNodeIds = FlowUtil.nodeIdsOfNodeContextList(result.getContext().getEndNodes());\n        assertEquals(1, endNodeIds.size());\n        assertTrue(endNodeIds.contains(\"END\"));\n    }\n    \n    /**\n     * test inclusive nodes.\n     */\n    @Test\n    public void testInclusive005() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/inclusive/flow_inclusive202.json\");\n        flowEngine.init();\n        // true true\n        FlowParam param = new FlowParam(\"flow_inclusive202\");\n        param.setParam(0);\n        FlowResult result = flowEngine.execute(param);\n        List<String> endNodeIds = FlowUtil.nodeIdsOfNodeContextList(result.getContext().getEndNodes());\n        assertEquals(2, endNodeIds.size());\n        assertTrue(endNodeIds.contains(\"END\"));\n    }\n    \n    /**\n     * test inclusive nodes.\n     */\n    @Test\n    public void testInclusive006() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/inclusive/flow_inclusive203.json\");\n        flowEngine.init();\n        // true true true\n        FlowParam param = new FlowParam(\"flow_inclusive203\");\n        Map<String, Object> bizParam = new HashMap<>();\n        param.setParam(bizParam);\n        bizParam.put(\"node1\", true);\n        bizParam.put(\"node2\", true);\n        bizParam.put(\"node3\", true);\n        FlowResult result = flowEngine.execute(param);\n        List<String> endNodeIds = FlowUtil.nodeIdsOfNodeContextList(result.getContext().getEndNodes());\n        assertTrue(endNodeIds.contains(\"END\"));\n    }\n    \n    /**\n     * test inclusive nodes.\n     */\n    @Test\n    public void testInclusive007() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/inclusive/flow_inclusive203.json\");\n        flowEngine.init();\n        // false true true\n        FlowParam param = new FlowParam(\"flow_inclusive203\");\n        Map<String, Object> bizParam = new HashMap<>();\n        param.setParam(bizParam);\n        bizParam.put(\"node1\", false);\n        bizParam.put(\"node2\", true);\n        bizParam.put(\"node3\", true);\n        FlowResult result = flowEngine.execute(param);\n        List<String> endNodeIds = FlowUtil.nodeIdsOfNodeContextList(result.getContext().getEndNodes());\n        assertTrue(endNodeIds.contains(\"END\"));\n    }\n    \n    /**\n     * test inclusive nodes.\n     * dead loop\n     */\n    @Test\n    public void testInclusive008() {\n//        FlowEngineImpl flowEngine = new FlowEngineImpl();\n//        flowEngine.setFlowPath(\"classpath:flow/cases/inclusive/flow_inclusive303.json\");\n//        flowEngine.init();\n//        // true false\n//        FlowParam param = new FlowParam(\"flow_inclusive303\");\n//        Map<String, Object> bizParam = new HashMap<>();\n//        param.setParam(bizParam);\n//        bizParam.put(\"I1\", false);\n//        bizParam.put(\"I2\", true);\n//        FlowResult result = flowEngine.execute(param);\n//        List<String> endNodeIds = FlowUtil.nodeIdsOfNodeContextList(result.getContext().getEndNodes());\n//        assertTrue(endNodeIds.contains(\"END\"));\n    }\n    \n    /**\n     * test inclusive nodes.\n     * dependency each other, not inactive inclusive gateway.\n     */\n    @Test\n    public void testInclusive009() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/inclusive/flow_inclusive303.json\");\n        flowEngine.init();\n        // true true\n        FlowParam param = new FlowParam(\"flow_inclusive303\");\n        Map<String, Object> bizParam = new HashMap<>();\n        param.setParam(bizParam);\n        bizParam.put(\"I1\", true);\n        bizParam.put(\"I2\", true);\n        FlowResult result = flowEngine.execute(param);\n        List<String> endNodeIds = FlowUtil.nodeIdsOfNodeContextList(result.getContext().getEndNodes());\n        assertEquals(endNodeIds.size(), 2);\n        assertTrue(endNodeIds.contains(\"I1\"));\n        assertTrue(endNodeIds.contains(\"I2\"));\n    }\n    \n\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/interrupt/InterruptTest.java",
    "content": "package com.jd.easyflow.flow.cases.interrupt;\n\nimport java.util.concurrent.atomic.AtomicBoolean;\nimport java.util.concurrent.atomic.AtomicInteger;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.util.FlowUtil;\n\n/**\n * \n * @author liyuliang5\n */\npublic class InterruptTest {\n    \n    private static final Logger logger = LoggerFactory.getLogger(InterruptTest.class);\n    \n    \n    \n\n    /**\n     * Test interrupt.\n     * node001 sleep 1000ms return false.\n     * node0021 sleep 2000ms return true -> node0022 sleep 1000ms return false.\n     * node003 sleep 3000ms return false.\n     * expect false.\n     * \n     */\n    @Test\n    public void testInterrupt001() throws Exception {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/interrupt/interrupt_001.json\");\n        flowEngine.init();\n        \n        \n        FlowParam param = new FlowParam(\"interrupt_001\");\n        AtomicInteger successBizCount = new AtomicInteger(0);\n        param.putContextData(\"successBizCount\", successBizCount);\n        \n        FlowResult result = flowEngine.execute(param);\n        \n        logger.info(\"successBizCount:\" + successBizCount.get());\n        logger.info(\"final result:\" + (successBizCount.get() == result.getContext().getFlow().getNodeList().size()));\n        \n        // sleep to see node002 and node003 log.\n        //Thread.sleep(5000);\n    }\n    \n \n    /**\n     * Test interrupt.\n     * node001 sleep 1000ms return true.\n     * node002 sleep 2000ms return true.\n     * node003 sleep 3000ms return true.\n     * expect true.\n     * \n     */\n    @Test\n    public void testInterrupt002() throws Exception {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/interrupt/interrupt_002.json\");\n        flowEngine.init();\n        \n        \n        FlowParam param = new FlowParam(\"interrupt_002\");\n        AtomicInteger successBizCount = new AtomicInteger(0);\n        param.putContextData(\"successBizCount\", successBizCount);\n        \n        FlowResult result = flowEngine.execute(param);\n        \n        logger.info(\"successBizCount:\" + successBizCount.get());\n        logger.info(\"final result:\" + ((successBizCount.get() == result.getContext().getFlow().getNodeList().size())));\n        \n    }\n    \n    \n\n}\n\nclass TestInterruptBizNodeAction implements NodeAction {\n    \n    private static final Logger logger = LoggerFactory.getLogger(TestInterruptBizNodeAction.class);\n    \n    private long sleepMills;\n    \n    private boolean result;\n    \n    public TestInterruptBizNodeAction(long sleepMills, boolean result) {\n        this.sleepMills = sleepMills;\n        this.result = result;\n    }\n    \n    @Override\n    public Boolean execute(NodeContext nodeContext, FlowContext context) {\n        try {\n            logger.info(FlowUtil.node(nodeContext, context).getId() + \" start\");\n            // biz1 use 1000ms, return result.\n            Thread.sleep(sleepMills);\n            if (result) {\n                ((AtomicInteger) context.get(\"successBizCount\")).incrementAndGet();\n            } else {\n                context.setInterrupted();\n            }\n            logger.info(FlowUtil.node(nodeContext, context).getId() + \" end\");\n            return result;\n        } catch (InterruptedException e) {\n            throw new RuntimeException(e);\n        }\n    }\n    \n}\n\n\n\n\n\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/listener/InterruptFlowListenerTest.java",
    "content": "package com.jd.easyflow.flow.cases.listener;\n\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class InterruptFlowListenerTest {\n    \n    private static final Logger logger = LoggerFactory.getLogger(InterruptFlowListenerTest.class);\n\n    /**\n     * Test interrupt.\n     */\n    @Test\n    public void testInterrupt001() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/listener/interrupt_listener_001.json\");\n        flowEngine.init();\n        \n        FlowParam param = new FlowParam(\"interrupt_listener_test_001\");\n        FlowResult result = flowEngine.execute(param);\n        Assert.assertTrue(result.getContext().isInterrupted());\n    }\n    \n    /**\n     * Test interrupt.\n     */\n    @Test\n    public void testInterrupt002() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/listener/interrupt_listener_002.json\");\n        flowEngine.init();\n        \n        FlowParam param = new FlowParam(\"interrupt_listener_test_002\");\n        FlowResult result = flowEngine.execute(param);\n        Assert.assertTrue(result.getContext().isInterrupted());\n    }\n    \n    /**\n     * Test interrupt.\n     */\n    @Test\n    public void testInterrupt003() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/listener/interrupt_listener_003.json\");\n        flowEngine.init();\n        \n        FlowParam param = new FlowParam(\"interrupt_listener_test_003\");\n        FlowResult result = flowEngine.execute(param);\n        Assert.assertFalse(result.getContext().isInterrupted());\n        \n        param.setParam(true);\n        result = flowEngine.execute(param);\n        Assert.assertTrue(result.getContext().isInterrupted());\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/logflag/LogFlagTest.java",
    "content": "package com.jd.easyflow.flow.cases.logflag;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\n\n/**\n * @author liyuliang5\n */\npublic class LogFlagTest {\n\n    private static final Logger logger = LoggerFactory.getLogger(LogFlagTest.class);\n\n    @Test(expected = Exception.class)\n    public void testLogFlag1() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/logflag/logflag_001.json\");\n        flowEngine.init();\n\n        FlowParam param = new FlowParam(\"logFlag_001\");\n        param.setLogFlag(false);\n        flowEngine.execute(param);\n\n    }\n    \n    public void throwException() throws Exception {\n        throw new Exception(\"testException\");\n    }\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/mockbiz/CheckBiz.java",
    "content": "package com.jd.easyflow.flow.cases.mockbiz;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n* \n* @author liyuliang5\n* @version 1.0\n* @since 1.0\n*/\n\npublic class CheckBiz {\n    \n    private static final Logger logger = LoggerFactory.getLogger(CheckBiz.class);\n\n    public void paramCheck(FlowContext context, NodeContext nodeContext) {\n        logger.info(\"paramCheck\");\n    }\n    \n    public void authCheck(FlowContext context) {\n        logger.info(\"authCheck\");\n    }\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/mockbiz/LimitBiz.java",
    "content": "package com.jd.easyflow.flow.cases.mockbiz;\n\nimport java.math.BigDecimal;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class LimitBiz {\n\n    public boolean judgeLimit(BigDecimal amount) {\n        return amount.compareTo(new BigDecimal(100)) < 0;\n    }\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/mockbiz/LoanBiz.java",
    "content": "package com.jd.easyflow.flow.cases.mockbiz;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class LoanBiz {\n\n    private static final Logger logger = LoggerFactory.getLogger(LoanBiz.class);\n    \n    public void doLoan() {\n        logger.info(\"finish loan command\");\n    }\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/mockbiz/LoanContractSignBiz.java",
    "content": "package com.jd.easyflow.flow.cases.mockbiz;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\npublic class LoanContractSignBiz {\n\n    public static final Logger logger = LoggerFactory.getLogger(LoanContractSignBiz.class);\n    \n    public void sign() {\n        logger.info(\"sign\");\n    }\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/mockbiz/MockFlowListener.java",
    "content": "package com.jd.easyflow.flow.cases.mockbiz;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.event.FlowEvent;\nimport com.jd.easyflow.flow.engine.event.FlowEventListener;\nimport com.jd.easyflow.flow.util.FlowEventTypes;\n\n/**\n * \n * Mock Flow Listener\n * \n * @author liyuliang5\n * @version 1.0\n * @since 1.0\n */\n\npublic class MockFlowListener implements FlowEventListener {\n\n    private static final Logger logger = LoggerFactory.getLogger(MockFlowListener.class);\n\n    /**\n     *\n     */\n    @Override\n    public void on(FlowEvent flowEvent) {\n        switch (flowEvent.getType()) {\n        case FlowEventTypes.FLOW_START: {\n            logger.info(\"FLOW START\");\n            break;\n        }\n        case FlowEventTypes.FLOW_COMPLETE : {\n            logger.info(\"FLOW END\");\n            break;\n        }\n        default : {\n            // NOOP\n        }\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/mockbiz/MockLoanTest.java",
    "content": "package com.jd.easyflow.flow.cases.mockbiz;\n\nimport java.math.BigDecimal;\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class MockLoanTest {\n    \n    public static final Logger logger = LoggerFactory.getLogger(MockLoanTest.class);\n\n    @Test\n    public void testFlow001() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/mockbiz/mock_loan_001.json\");\n        flowEngine.init();\n        \n        Map<String, Object> paramData = new HashMap<>();\n        paramData.put(\"amount\", new BigDecimal(80));\n        FlowParam param = new FlowParam(\"mock_loan_001\", \"CONTRACT_SIGN\", paramData);\n       \n        \n        FlowResult result = flowEngine.execute(param);\n        logger.info(\"result:\" + result);\n    }\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/parallel/ParallelTest.java",
    "content": "package com.jd.easyflow.flow.cases.parallel;\n\nimport static org.junit.Assert.assertEquals;\n\nimport java.util.List;\n\nimport org.junit.Test;\n\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.util.FlowConstants;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ParallelTest {\n\n    /**\n     * test parallel nodes.\n     */\n    @Test\n    public void testParallel001() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/parallel/flow_parallel001.json\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"flow_parallel001\");\n        FlowResult result = flowEngine.execute(param);\n        List<NodeContext> previousNodes = result.getContext().getEndNodes().stream()\n                .map(node -> (List<NodeContext>)node.get(FlowConstants.NODECTX_PREVIOUS_NODES)).filter(list -> list != null && list.size() > 0).findFirst()\n                .get();\n        assertEquals(2, previousNodes.size());\n    }\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/parser/FlowParserTest.java",
    "content": "package com.jd.easyflow.flow.cases.parser;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertTrue;\n\nimport java.io.InputStream;\nimport java.util.List;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.core.io.Resource;\nimport org.springframework.core.io.support.PathMatchingResourcePatternResolver;\n\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.flow.model.parser.FlowParser;\nimport com.jd.easyflow.flow.model.parser.FlowParserImpl;\nimport com.jd.easyflow.flow.util.FlowIOUtil;\nimport com.jd.easyflow.flow.util.JsonUtil;\n\n/**\n * \n * \n * @author liyuliang5\n * @version 1.0\n * @since 1.0\n */\n\npublic class FlowParserTest {\n\n\tprivate static final Logger logger = LoggerFactory.getLogger(FlowParserTest.class);\n\n\t@Test\n    public void testParseFlow() throws Exception {\n        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();\n        Resource[] resources;\n        InputStream is = null;\n        resources = resolver.getResources(\"classpath:flow/cases/parser/parser_test_001.json\");\n        for (Resource resource : resources) {\n            logger.info(\"Start parse flow definition:\" + resource.getURI());\n            is = resource.getInputStream();\n            String flowConfigStr = FlowIOUtil.toString(is);\n            List<Flow> flowList = new FlowParserImpl().parse(flowConfigStr);\n            logger.info(\"Parse end, model:\" + JsonUtil.toJsonString(flowList));\n            is.close();\n        }\n    }\n\t\n\t@Test\n    public void testFlowParseListener() throws Exception {\n        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();\n        Resource[] resources;\n        InputStream is = null;\n        Flow flow = null;\n        resources = resolver.getResources(\"classpath:flow/cases/parser/parser_test_002.json\");\n        for (Resource resource : resources) {\n            logger.info(\"Start parse flow definition:\" + resource.getURI());\n            is = resource.getInputStream();\n            String flowConfigStr = FlowIOUtil.toString(is);\n            List<Flow> flowList = new FlowParserImpl().parse(flowConfigStr);\n            logger.info(\"Parse end, model:\" + JsonUtil.toJsonString(flowList));\n            flow = flowList.get(0);\n\n        }\n\n        assertEquals(\"node001\", flow.getNodeList().get(0).getName());\n        assertEquals(\"node001\", flow.getStartNodeIds()[0]);\n\n    }\n\t\n\t@Test\n    public void testMultiple() throws Exception {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/parser/flow_multiple001.json\");\n        flowEngine.init();\n        assertTrue(flowEngine.getFlowMap().size() == 2);\n\n        FlowParam param1 = new FlowParam(\"flow_multiple0011\");\n        flowEngine.execute(param1);\n\n        FlowParam param2 = new FlowParam(\"flow_multiple0012\");\n        flowEngine.execute(param2);\n    }\n\t\n    @Test\n    public void testAddFilterForAllFlow() throws Exception {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/parser/parser_test_003.json\");\n        flowEngine.setFlowParser(new TestFlowParserImpl());\n        flowEngine.init();\n\n        FlowParam param = new FlowParam(\"parser_test_003\", new String[] {}, null);\n        flowEngine.execute(param);\n    }\n    \n    @Test\n    public void testSubFlow001()  throws Exception {\n        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();\n        Resource[] resources;\n        InputStream is = null;\n        resources = resolver.getResources(\"classpath:flow/cases/parser/parser_test_subflow_001.json\");\n        for (Resource resource : resources) {\n            logger.info(\"Start parse flow definition:\" + resource.getURI());\n            is = resource.getInputStream();\n            String flowConfigStr = FlowIOUtil.toString(is);\n            List<Flow> flowList = new FlowParserImpl().parse(flowConfigStr);\n            is.close();\n            assertEquals(flowList.get(1).getProperty(\"_parent_flow_id\"), \"flow1\");\n            assertEquals(flowList.get(2).getProperty(\"_parent_flow_id\"), \"flow11\");\n        }\n    }\n    \n    @Test\n    public void testSubFlow002()  throws Exception {\n        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();\n        Resource[] resources;\n        InputStream is = null;\n        resources = resolver.getResources(\"classpath:flow/cases/parser/parser_test_subflow_002.json\");\n        for (Resource resource : resources) {\n            logger.info(\"Start parse flow definition:\" + resource.getURI());\n            is = resource.getInputStream();\n            String flowConfigStr = FlowIOUtil.toString(is);\n            List<Flow> flowList = new FlowParserImpl().parse(flowConfigStr);\n            is.close();\n            assertEquals(flowList.get(1).getProperty(\"_parent_flow_id\"), \"flow1\");\n            assertEquals(flowList.get(2).getProperty(\"_parent_flow_id\"), \"flow11\");\n        }\n    }\n\t   \n\t   \n\t\n\t\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/parser/TestAddFilterParseListener.java",
    "content": "package com.jd.easyflow.flow.cases.parser;\n\nimport com.jd.easyflow.flow.model.parser.event.FlowParseEvent;\nimport com.jd.easyflow.flow.model.parser.event.FlowParseEventListener;\nimport com.jd.easyflow.flow.model.parser.event.FlowParseEventTypes;\n\n/**\n * \n * @author liyuliang5\n */\npublic class TestAddFilterParseListener implements FlowParseEventListener {\n\n    @Override\n    public void on(FlowParseEvent event) {\n        switch (event.getType()) {\n        case FlowParseEventTypes.INIT_FLOW_END: {\n            event.getFlow().getFilterManager().addFilter(new TestFlowParamAndResultPrintFilter());\n            break;\n        }\n\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/parser/TestFlowParamAndResultPrintFilter.java",
    "content": "package com.jd.easyflow.flow.cases.parser;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.filter.Filter;\nimport com.jd.easyflow.flow.filter.FilterChain;\n\n/**\n * \n * @author liyuliang5\n */\npublic class TestFlowParamAndResultPrintFilter implements Filter<FlowContext, FlowResult> {\n\n    private static final Logger logger = LoggerFactory.getLogger(TestFlowParamAndResultPrintFilter.class);\n\n    @Override\n    public FlowResult doFilter(FlowContext request, FilterChain<FlowContext, FlowResult> chain) {\n        logger.info(\"flowId is:\" + request.getParam().getFlowId());\n        FlowResult result = chain.doFilter(request);\n        logger.info(\"flow result is:\" + result.getResult());\n        return result;\n\n    }\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/parser/TestFlowParseListener.java",
    "content": "package com.jd.easyflow.flow.cases.parser;\n\nimport java.util.List;\nimport java.util.Map;\n\nimport com.jd.easyflow.flow.model.parser.event.FlowParseEvent;\nimport com.jd.easyflow.flow.model.parser.event.FlowParseEventListener;\nimport com.jd.easyflow.flow.model.parser.event.FlowParseEventTypes;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class TestFlowParseListener implements FlowParseEventListener {\n\n    @Override\n    public void on(FlowParseEvent event) {\n        switch (event.getType()) {\n        case FlowParseEventTypes.PARSE_FLOW_START: {\n            List<Map<String, Object>> nodeList = (List<Map<String, Object>>) event.getFlowDef().get(\"nodes\");\n            for (Map<String, Object> node : nodeList) {\n                String name = (String) node.get(\"name\");\n                if (name == null) {\n                    node.put(\"name\", node.get(\"id\"));\n                }\n            }\n            break;\n        }\n        case FlowParseEventTypes.PARSE_FLOW_END: {\n            event.getFlow().setStartNodeIds(new String[] { event.getFlow().getNodeList().get(0).getId() });\n            break;\n        }\n\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/parser/TestFlowParserImpl.java",
    "content": "package com.jd.easyflow.flow.cases.parser;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\n\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.flow.model.parser.FlowParserImpl;\nimport com.jd.easyflow.flow.model.parser.event.FlowParseEventListener;\n\n/**\n * \n * @author liyuliang5\n */\npublic class TestFlowParserImpl extends FlowParserImpl {\n\n    @Override\n    protected List<FlowParseEventListener> parseParseListeners(Map<String, Object> map, Flow flow, boolean parseEl) {\n        List<FlowParseEventListener> list = super.parseParseListeners(map, flow, parseEl);\n        if (list == null) {\n            list = new ArrayList<FlowParseEventListener>();\n        }\n        list.add(new TestAddFilterParseListener());\n        return list;\n    }\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/performance/EmptyStepAction.java",
    "content": "package com.jd.easyflow.flow.cases.performance;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class EmptyStepAction implements NodeAction {\n\n    @Override\n    public <T> T execute(NodeContext nodeContext, FlowContext context) {\n        int i = 0;\n        i++;\n         return null;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/performance/LoopStepAction.java",
    "content": "package com.jd.easyflow.flow.cases.performance;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.NodeContextAccessor;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class LoopStepAction implements NodeAction {\n    \n    private static final String COUNT_KEY = \"count\";\n    \n    int i = 0;\n    \n    @Override\n    public <T> T execute(NodeContext nodeContext, FlowContext context) {\n        if (i < (int) context.getParam().get(COUNT_KEY)) {\n            i++;\n            NodeContextAccessor.setNextNodeIds(nodeContext, new String[] {\"EMPTY_NODE3\"});\n        }\n         return null;\n    }\n\n}\n\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/performance/MemoryTest.java",
    "content": "package com.jd.easyflow.flow.cases.performance;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\n\n/**\n * Test memory usage\n * @author liyuliang5\n *\n */\npublic class MemoryTest {\n    \n    private static final Logger log = LoggerFactory.getLogger(MemoryTest.class);\n\n    /**\n     * test one node exeucte multiple times.\n     * If flow.recordHistory set to true, -Xmx=5M, OOM will occur.\n     */\n    public void test1() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/performance/flow_memory001.json\");\n        flowEngine.init();\n        int count = 1000000000;\n        // start test\n        log.info(\"start test\");\n        long t1 = System.currentTimeMillis();\n        FlowParam param = new FlowParam(\"flow_memory_001\", \"EMPTY_NODE3\", null);\n        param.put(\"count\", count);\n        FlowResult result = flowEngine.execute(param);\n        long time = System.currentTimeMillis() - t1;\n        log.info(\"execute \" + count + \" times, elpase \" + time + \"ms\");\n    }\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/performance/PerformanceTest.java",
    "content": "package com.jd.easyflow.flow.cases.performance;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.el.ElFactory;\nimport com.jd.easyflow.flow.el.SpelEvaluator;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class PerformanceTest {\n\n    private static final Logger log = LoggerFactory.getLogger(PerformanceTest.class);\n\n    /**\n     * test one node exeucte multiple times\n     */\n    @Test\n    public void test1() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/performance/flow_performance001.json\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"flow_performance001\", \"EMPTY_NODE2\", null);\n        param.setLogFlag(false);\n        FlowResult result = flowEngine.execute(param);\n\n        // start test\n        log.info(\"start test\");\n        int count = 1000;\n        param = new FlowParam(\"flow_performance001\", \"EMPTY_NODE2\", null);\n        param.setLogFlag(false);\n        long t1 = System.currentTimeMillis();\n        for (int i = 0; i < count; i++) {\n            result = flowEngine.execute(param);\n        }\n        long time = System.currentTimeMillis() - t1;\n        log.info(\"execute \" + count + \"times, elapse \" + time + \"ms\");\n    }\n\n    /**\n     * test one flow with one spel node \n     */\n    @Test\n    public void test2() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/performance/flow_performance001.json\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"flow_performance001\", \"EMPTY_NODE\", null);\n        FlowResult result = flowEngine.execute(param);\n\n        // start test\n        log.info(\"start test\");\n        param = new FlowParam(\"flow_performance001\", \"EMPTY_NODE\", null);\n        param.setLogFlag(false);\n        SpelEvaluator evaluator = new SpelEvaluator();\n        evaluator.setRootType(1);\n        ElFactory.setDefaultEvaluator(evaluator);\n        long t1 = System.currentTimeMillis();\n        int count = 1000;\n        for (int i = 0; i < count; i++) {\n            result = flowEngine.execute(param);\n        }\n        long time = System.currentTimeMillis() - t1;\n        log.info(\"execute \" + count + \" times, elapse\" + time + \"ms\");\n    }\n\n    /**\n     * test one flow execute multiple times with one loop node.\n     */\n    @Test\n    public void test3() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/performance/flow_performance001.json\");\n        flowEngine.init();\n        int count = 100;\n        FlowParam param = new FlowParam(\"flow_performance001\", \"EMPTY_NODE3\", null);\n        param.put(\"count\", 1);\n        FlowResult result = flowEngine.execute(param);\n\n        // start test\n        log.info(\"start test\");\n        long t1 = System.currentTimeMillis();\n        param = new FlowParam(\"flow_performance001\", \"EMPTY_NODE3\", null);\n        param.put(\"count\", count);\n        param.setLogFlag(false);\n        result = flowEngine.execute(param);\n        long time = System.currentTimeMillis() - t1;\n        log.info(\"execute \" + count + \" times, elpase \" + time + \"ms\");\n    }\n    \n    \n\n    /**\n     * test one flow with one SPEL post \n     */\n    @Test\n    public void test4() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/performance/flow_performance001.json\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"flow_performance001\", \"EMPTY_NODE4\", null);\n        FlowResult result = flowEngine.execute(param);\n\n        // start test\n        log.info(\"start test\");\n        param = new FlowParam(\"flow_performance001\", \"EMPTY_NODE4\", null);\n        param.setLogFlag(false);\n        SpelEvaluator evaluator = new SpelEvaluator();\n        evaluator.setRootType(0);\n        ElFactory.setDefaultEvaluator(evaluator);\n        long t1 = System.currentTimeMillis();\n        int count = 1000;\n        for (int i = 0; i < count; i++) {\n            result = flowEngine.execute(param);\n        }\n        long time = System.currentTimeMillis() - t1;\n        log.info(\"execute \" + count + \" times, elapse\" + time + \"ms\");\n    }\n    \n    /**\n     * test one flow with one createExp SPEL post \n     */\n    @Test\n    public void test5() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/performance/flow_performance001.json\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"flow_performance001\", \"EMPTY_NODE5\", null);\n        FlowResult result = flowEngine.execute(param);\n\n        // start test\n        log.info(\"start test\");\n        param = new FlowParam(\"flow_performance001\", \"EMPTY_NODE5\", null);\n        param.setLogFlag(false);\n        SpelEvaluator evaluator = new SpelEvaluator();\n        evaluator.setRootType(1);\n        ElFactory.setDefaultEvaluator(evaluator);\n        long t1 = System.currentTimeMillis();\n        int count = 1000;\n        for (int i = 0; i < count; i++) {\n            result = flowEngine.execute(param);\n        }\n        long time = System.currentTimeMillis() - t1;\n        log.info(\"execute \" + count + \" times, elapse\" + time + \"ms\");\n    }\n    \n//    @Test\n//    public void testBuildSpelRoot() {\n//        NodeContext nodeContext = new NodeContext();\n//        FlowContext context = new FlowContextImpl();\n//        FlowParam param = new FlowParam();\n//        FlowResult result = new FlowResult();\n//        context.setParam(param);\n//        context.setResult(result);\n//        Map<String, Object> data = new HashMap<>();\n//        data.put(\"node\", \"node\");\n//        \n//        SpelEvaluator evaluator = new SpelEvaluator();\n//        long t1 = System.currentTimeMillis();\n//        for (int i = 0; i < 1000000; i++) {\n//            evaluator.buildHashMapRoot(nodeContext, context, data);\n//        }\n//        long t2 = System.currentTimeMillis();\n//        for (int i = 0; i < 1000000; i++) {\n//            evaluator.buildRootMapRoot(nodeContext, context, data);\n//        }  \n//        long t3 = System.currentTimeMillis();\n//        log.info((t2 - t1) + \" \" + (t3 - t2));\n//    }\n//    \n//    @Test\n//    public void testExecuteSpel() {\n//        NodeContext nodeContext = new NodeContext();\n//        FlowContext context = new FlowContextImpl();\n//        FlowParam param = new FlowParam();\n//        FlowResult result = new FlowResult();\n//        context.setParam(param);\n//        context.setResult(result);\n//        Map<String, Object> data = new HashMap<>();\n//        data.put(\"node\", \"node\");\n//        \n//        SpelEvaluator evaluator = new SpelEvaluator();\n//        Object root1 = evaluator.buildHashMapRoot(nodeContext, context, data);\n//        Object root2 = evaluator.buildRootMapRoot(nodeContext, context, data);\n//        SpelHelper.evalWithDefaultContext(\"context.param\", root1, true);\n//        SpelHelper.evalWithDefaultContext(\"context.param\", root2, true);\n//        long t1 = System.currentTimeMillis();\n//        for (int i = 0; i < 1000000; i++) {\n//            SpelHelper.evalWithDefaultContext(\"context.param\", root1, true);\n//        }\n//        long t2 = System.currentTimeMillis();\n//        for (int i = 0; i < 1000000; i++) {\n//            SpelHelper.evalWithDefaultContext(\"context.param\", root1, true);\n//        }  \n//        long t3 = System.currentTimeMillis();\n//        for (int i = 0; i < 1000000; i++) {\n//            SpelHelper.evalWithDefaultContext(\"context.param\", root1, true);\n//        }  \n//        long t4 = System.currentTimeMillis();\n//        log.info((t2 - t1) + \" \" + (t3 - t2) + \" \" + (t4 - t3));\n//    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/posthandler/ConditionalPostHandlerTest.java",
    "content": "package com.jd.easyflow.flow.cases.posthandler;\n\nimport static org.junit.Assert.assertEquals;\n\nimport java.util.Arrays;\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowContextImpl;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.builder.FlowBuilder;\nimport com.jd.easyflow.flow.model.post.ConditionalNodePostHandler;\n\n/**\n * @author liyuliang5\n */\npublic class ConditionalPostHandlerTest {\n    \n    private static final Logger logger = LoggerFactory.getLogger(ConditionalPostHandlerTest.class);\n    \n    @Test\n    public void testPerformance() {\n        ConditionalNodePostHandler handler = new ConditionalNodePostHandler();\n        NodeContext nodeContext = new NodeContext(\"123\");\n        FlowContextImpl flowContext = new FlowContextImpl();\n        Flow flow = FlowBuilder.create(\"001\", \"001\").addNode(\"123\", null).build();\n        flowContext.setFlow(flow);\n        flowContext.setFlowEngine(new FlowEngineImpl());\n        Map<String, Object> branch = new HashMap<String, Object>();\n        branch.put(\"false\", \"NEXT\");\n        handler.setBranchList(Arrays.asList(branch));\n        //handler.init(null, null);\n        handler.postHandle(nodeContext, flowContext);\n        long t1 = System.currentTimeMillis();\n        for (int i = 0; i < 1; i++) {\n            handler.postHandle(nodeContext, flowContext);\n        }\n        logger.info(\"time cost\" + (System.currentTimeMillis()  - t1));\n        \n    }\n    \n    @Test\n    public void testCreateExpWhen() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/posthandler/flow_when_createexp_001.json\");\n        flowEngine.init();\n        FlowResult result = flowEngine.execute(new FlowParam(\"flow_when_createexp_001\"));\n        assertEquals(result.getContext().getEndNodes().get(0).getNodeId(), \"002\");\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/posthandler/FlowIndexTest.java",
    "content": "package com.jd.easyflow.flow.cases.posthandler;\n\nimport static org.junit.Assert.assertEquals;\n\nimport java.math.BigDecimal;\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FlowIndexTest {\n    \n    public static final Logger logger = LoggerFactory.getLogger(FlowIndexTest.class);\n\n    @Test\n    public void testFlow001() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/posthandler/flow_index001.json\");\n        flowEngine.init();\n        \n        Map<String, Object> paramData = new HashMap<>();\n        paramData.put(\"amount\", new BigDecimal(80));\n        FlowParam param = new FlowParam(\"flow_index001\", \"CONTRACT_SIGN\", paramData);\n       \n        \n        FlowResult result = flowEngine.execute(param);\n        logger.info(\"Result:\" + result);\n        assertEquals(\"DO_LOAN\", result.getContext().getEndNodes().get(0).getNodeId());\n    }\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/posthandler/NodePostHandlerTest.java",
    "content": "package com.jd.easyflow.flow.cases.posthandler;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertTrue;\n\nimport java.util.Map;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * Test NodePostHandler function\n * @author liyuliang5\n *\n */\npublic class NodePostHandlerTest {\n\n    private static final Logger logger = LoggerFactory.getLogger(NodePostHandlerTest.class);\n    \n    /**\n     * Test exp post\n     */\n    @Test\n    public void testExpPostTo() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/posthandler/flow_exp_post_to_001.json\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"flow_exp_post_to_001\");\n        FlowResult result = flowEngine.execute(param);\n        logger.info(\"Execute finish, current node is:\" + result.getContext().getEndNodes().get(0).getNodeId());\n        assertEquals(\"STEP2\", result.getContext().getEndNodes().get(0).getNodeId());        \n    }\n    \n    @Test\n    public void testPostParam() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/posthandler/flow_post_param_001.json\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"flow_post_param_001\");\n        flowEngine.execute(param);\n    }\n    \n    @Test\n    public void testCreateExpPostTo() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/posthandler/flow_createexp_post_to_001.json\");\n        flowEngine.init();\n        FlowResult result = flowEngine.execute(new FlowParam(\"flow_createexp_post_to_001\"));\n        assertEquals(result.getContext().getEndNodes().get(0).getNodeId(), \"STEP2\");\n    }\n    \n    @Test\n    public void testPostData() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/posthandler/flow_postdata_001.json\");\n        flowEngine.init();\n        FlowResult result = flowEngine.execute(new FlowParam(\"flow_postdata_001\"));\n        NodeContext nodeContext = result.getContext().getEndNodes().get(0);\n        assertTrue((int)nodeContext.get(\"a\") == 1);\n        assertTrue((int)nodeContext.get(\"b\") == 3);\n        assertTrue((int) ((Map)nodeContext.get(\"c\")).get(\"d\") == 3);\n        assertTrue(nodeContext.get(\"d\").equals(\"dd\"));\n    }\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/posthandler/PostHandlerFilterTest.java",
    "content": "package com.jd.easyflow.flow.cases.posthandler;\n\nimport static org.junit.Assert.assertEquals;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\n\n/**\n * Test PostHandlerFilter\n * \n * @author liyuliang5\n *\n */\npublic class PostHandlerFilterTest {\n\n    private static final Logger logger = LoggerFactory.getLogger(PostHandlerFilterTest.class);\n\n    /**\n     * Test exp post\n     */\n    @Test\n    public void testPostHandlerFilter() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/posthandler/flow_post_handler_filter_001.json\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"flow_post_handler_filter_001\");\n        FlowResult result = flowEngine.execute(param);\n        logger.info(\"Execute finish, current node is:\" + result.getContext().getEndNodes().get(0).getNodeId());\n        assertEquals(\"STEP3\", result.getContext().getEndNodes().get(0).getNodeId());\n    }\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/posthandler/PostParamNode1Action.java",
    "content": "package com.jd.easyflow.flow.cases.posthandler;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class PostParamNode1Action implements NodeAction {\n\n    @Override\n    public <T> T execute(NodeContext nodeContext, FlowContext context) {\n        nodeContext.put(\"node1Param\", 123);\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/posthandler/PostParamNode2Action.java",
    "content": "package com.jd.easyflow.flow.cases.posthandler;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.exception.FlowException;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class PostParamNode2Action implements NodeAction {\n    \n    private static final Logger logger = LoggerFactory.getLogger(PostParamNode2Action.class);\n\n    @Override\n    public <T> T execute(NodeContext nodeContext, FlowContext context) {\n        logger.info(\"node2 param \" + nodeContext.getDataMap());\n        if (nodeContext.getDataMap().get(\"b\").equals(\"123\")) {\n            throw new FlowException(\"context data error\");\n        }\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/posthandler/PostParamNode3Action.java",
    "content": "package com.jd.easyflow.flow.cases.posthandler;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.exception.FlowException;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class PostParamNode3Action implements NodeAction {\n    \n    private static final Logger logger = LoggerFactory.getLogger(PostParamNode3Action.class);\n\n    @Override\n    public <T> T execute(NodeContext nodeContext, FlowContext context) {\n        logger.info(\"node3 param \");\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/posthandler/TestPostHandlerFilter.java",
    "content": "package com.jd.easyflow.flow.cases.posthandler;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.filter.Filter;\nimport com.jd.easyflow.flow.filter.FilterChain;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.util.Pair;\n\n/**\n * Test node post handler filter.\n * \n * @author liyuliang5\n *\n */\npublic class TestPostHandlerFilter implements Filter<Pair<NodeContext, FlowContext>, NodeContext[]> {\n\n    private static final Logger logger = LoggerFactory.getLogger(TestPostHandlerFilter.class);\n\n    @Override\n    public NodeContext[] doFilter(Pair<NodeContext, FlowContext> request,\n            FilterChain<Pair<NodeContext, FlowContext>, NodeContext[]> chain) {\n        NodeContext[] result = chain.doFilter(request);\n        if (\"STEP1\".equals(request.getLeft().getNodeId())) {\n            logger.info(\"origin result:\" + result[0].getNodeId());\n            NodeContext nextNodeContext = new NodeContext(\"STEP3\");\n            // request.getLeft().setNextNodes(new NodeContext[] { nextNodeContext });\n            return new NodeContext[] { nextNodeContext };\n        }\n        return result;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/prehandler/PreHandlerTest.java",
    "content": "package com.jd.easyflow.flow.cases.prehandler;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class PreHandlerTest {\n    \n    private static final Logger logger = LoggerFactory.getLogger(PreHandlerTest.class);\n\n\n    /**\n     * Test exp post\n     */\n    @Test\n    public void testPreHandler001() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/prehandler/flow_prehandler_001.json\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"flow_prehandler_001\");\n        FlowResult result = flowEngine.execute(param);\n        logger.info(\"Execute finish, current node is:\" + result.getContext().getEndNodes().get(0).getNodeId());\n    }\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/pretty/FlowDefPrettyHelperTest.java",
    "content": "package com.jd.easyflow.flow.cases.pretty;\n\nimport static org.junit.Assert.assertEquals;\n\nimport java.lang.reflect.Method;\nimport java.util.Map;\n\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.util.FlowIOUtil;\nimport com.jd.easyflow.flow.util.JsonPrettyHelper;\nimport com.jd.easyflow.flow.util.JsonUtil;\n\n/**\n * flow definition pretty helper\n * \n * @author liyuliang5\n *\n */\npublic class FlowDefPrettyHelperTest {\n\n    private static final Logger logger = LoggerFactory.getLogger(FlowDefPrettyHelperTest.class);\n    \n    @Test\n    public void testPrettyFile() throws Exception {\n        String origin = FlowIOUtil.toString(FlowDefPrettyHelperTest.class.getResourceAsStream(\"/flow/cases/pretty/pretty_test.json\"));\n        String flowPrettyConf =  FlowIOUtil.toString(FlowDefPrettyHelperTest.class.getResourceAsStream(\"/pretty/pretty-flow.json\"));\n        logger.info(\"Pretty conf:\" + flowPrettyConf);\n        logger.info(\"Input:\" + JsonUtil.toJsonString(JsonUtil.parseObject(flowPrettyConf, Map.class)));\n        String prettyStr = JsonPrettyHelper.pretty(origin, flowPrettyConf);\n        logger.info(\"Output:\\n\" + prettyStr);\n    }\n\n    @Test\n    public void testPretty1() throws Exception {\n        String origin = FlowIOUtil.toString(FlowDefPrettyHelperTest.class.getResourceAsStream(\"/flow/cases/pretty/pretty_test.json\"));\n        String flowPrettyConf =  FlowIOUtil.toString(FlowDefPrettyHelperTest.class.getResourceAsStream(\"/pretty/pretty-flow.json\"));\n        String prettyStr = JsonPrettyHelper.pretty(origin, flowPrettyConf);\n        logger.info(\"Pretty result:\\n\" + prettyStr);\n        logger.info(\"Start comparing result:\");\n        String originJsonStr = JsonUtil.toJsonString(JsonUtil.parseObject(origin, Map.class));\n        String prettyJsonStr = JsonUtil.toJsonString(JsonUtil.parseObject(prettyStr, Map.class));\n        logger.info(\"Original result:\" + originJsonStr);\n        logger.info(\"Pretty result:\" + prettyJsonStr);\n        Assert.assertEquals(originJsonStr, prettyJsonStr);\n    }\n    \n    @Test\n    public void testPrettyList() throws Exception {\n        String origin = FlowIOUtil.toString(FlowDefPrettyHelperTest.class.getResourceAsStream(\"/flow/cases/pretty/pretty_multiple_test.json\"));\n        String flowPrettyConf =  FlowIOUtil.toString(FlowDefPrettyHelperTest.class.getResourceAsStream(\"/pretty/pretty-flow.json\"));\n        logger.info(\"Pretty conf:\" + flowPrettyConf);\n        logger.info(\"Input:\" + JsonUtil.toJsonString(JsonUtil.parseObject(flowPrettyConf, Map.class)));\n        String prettyStr = JsonPrettyHelper.pretty(origin, flowPrettyConf);\n        logger.info(\"Output:\\n\" + prettyStr);\n    }\n    \n    @Test\n    public void testQuoteEscapse() throws Exception {\n        Method method = JsonPrettyHelper.class.getDeclaredMethod(\"quote\", new Class[] {String.class});\n        method.setAccessible(true);\n        String result = (String) method.invoke(null, \"a\\\\b\\nc\");\n        assertEquals(result, \"\\\"a\\\\\\\\b\\\\nc\\\"\");\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/runner/MultiThreadTest.java",
    "content": "package com.jd.easyflow.flow.cases.runner;\n\nimport static org.junit.Assert.assertFalse;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\nimport com.jd.easyflow.flow.exception.FlowException;\nimport com.jd.easyflow.flow.util.FlowConstants;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class MultiThreadTest {\n    \n    public static final Logger logger = LoggerFactory.getLogger(MultiThreadTest.class);\n\n\n    @Test\n    public void test1() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/runner/flow_multi001.json\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"flow_multi001\", \"EMPTY_NODE\", null);\n        FlowResult result = flowEngine.execute(param);\n        logger.info(\"end\");\n    }\n    \n    @Test(expected = Exception.class)\n    public void testException() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/runner/flow_multi002.json\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"flow_multi002\", \"EMPTY_NODE\", null);\n        FlowResult result = flowEngine.execute(param);\n        logger.info(\"end\");  \n    }\n    \n    @Test\n    public void testTimeout() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/runner/flow_multi003.json\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"flow_multi003\", \"EMPTY_NODE\", null);\n        FlowResult result = flowEngine.execute(param);\n        assertFalse(result.getContext().get(FlowConstants.FLOW_CTX_MULTI_AWAIT_RESULT));\n        logger.info(\"end\");        \n    }\n    \n    @Test(expected = FlowException.class)\n    public void testTimeoutThrowException() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/runner/flow_multi004.json\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"flow_multi004\", \"EMPTY_NODE\", null);\n        FlowResult result = flowEngine.execute(param);\n        logger.info(\"end\");        \n    }\n    \n    @Test\n    public void testInterruptOnMultipleThread() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/runner/flow_interrupt001.json\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"flow_interrupt001\");\n        FlowResult result = flowEngine.execute(param);\n        logger.info(\"end\");  \n    }\n    \n    @Test\n    public void testInterruptOnSingleThread() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/runner/flow_interrupt002.json\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"flow_interrupt002\");\n        FlowResult result = flowEngine.execute(param);\n        logger.info(\"end\");  \n    }\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/runner/ReusableThreadTest.java",
    "content": "package com.jd.easyflow.flow.cases.runner;\n\nimport static org.junit.Assert.assertFalse;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\nimport com.jd.easyflow.flow.util.FlowConstants;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ReusableThreadTest {\n    \n    public static final Logger logger = LoggerFactory.getLogger(ReusableThreadTest.class);\n\n    @Test\n    public void test1() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/runner/flow_reusable001.json\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"flow_reusable001\", \"EMPTY_NODE\", null);\n        FlowResult result = flowEngine.execute(param);\n        logger.info(\"end\");\n    }\n    \n    @Test(expected = Exception.class)\n    public void testException() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/runner/flow_reusable002.json\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"flow_reusable002\", \"EMPTY_NODE\", null);\n        FlowResult result = flowEngine.execute(param);\n        logger.info(\"end\");  \n    }\n    \n    @Test\n    public void testTimeout() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/runner/flow_reusable003.json\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"flow_reusable003\", \"EMPTY_NODE\", null);\n        FlowResult result = flowEngine.execute(param);\n        assertFalse(result.getContext().get(FlowConstants.FLOW_CTX_MULTI_AWAIT_RESULT));\n        logger.info(\"end\");        \n    }\n    \n    @Test\n    public void testInterruptOnReusableThread() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/runner/flow_interrupt003.json\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"flow_interrupt003\");\n        FlowResult result = flowEngine.execute(param);\n        logger.info(\"end\");  \n    }\n    \n    @Test\n    public void testRunner() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/runner/flow_reusable004.json\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"flow_reusable004\", \"EMPTY_NODE\", null);\n        FlowResult result = flowEngine.execute(param);\n        logger.info(\"end\");\n    }\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/runner/TestInterruptNodeAction.java",
    "content": "package com.jd.easyflow.flow.cases.runner;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class TestInterruptNodeAction implements NodeAction {\n    \n    private static final Logger logger = LoggerFactory.getLogger(TestInterruptNodeAction.class);\n\n    @Override\n    public <T> T execute(NodeContext nodeContext, FlowContext context) {\n        logger.info(\"start execute node:\" + nodeContext.getNodeId());\n        try {\n            Thread.sleep(300);\n        } catch (InterruptedException e) {\n            throw new RuntimeException(e);\n        }\n        boolean interrupt = Boolean.TRUE.equals(context.getFlow().getNode(nodeContext.getNodeId()).getProperty(\"interrupt\"));\n        if (interrupt) {\n            logger.info(\"interrupt\");\n            context.setInterrupted();;\n        }\n        logger.info(\"end execute node:\" + nodeContext.getNodeId());\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/runner/TestMultiRunner.java",
    "content": "package com.jd.easyflow.flow.cases.runner;\n\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.SynchronousQueue;\nimport java.util.concurrent.ThreadPoolExecutor;\nimport java.util.concurrent.ThreadPoolExecutor.AbortPolicy;\nimport java.util.concurrent.TimeUnit;\n\nimport com.jd.easyflow.flow.engine.impl.MultipleThreadFlowRunner;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class TestMultiRunner extends MultipleThreadFlowRunner {\n\n    public TestMultiRunner() {\n        this.executor = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS,\n                new SynchronousQueue<Runnable>(), Executors.defaultThreadFactory(), new AbortPolicy());\n    }\n    \n    public TestMultiRunner(long timeout) {\n        this.executor = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS,\n                new SynchronousQueue<Runnable>(), Executors.defaultThreadFactory(), new AbortPolicy());\n        this.timeout = timeout;\n    }\n    \n    public TestMultiRunner(long timeout, boolean throwExceptionOnTimeout) {\n        this.executor = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS,\n                new SynchronousQueue<Runnable>(), Executors.defaultThreadFactory(), new AbortPolicy());\n        this.timeout = timeout;\n        this.throwExceptionOnTimeout = throwExceptionOnTimeout;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/runner/TestReusableThreadRunner.java",
    "content": "package com.jd.easyflow.flow.cases.runner;\n\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.SynchronousQueue;\nimport java.util.concurrent.ThreadPoolExecutor;\nimport java.util.concurrent.ThreadPoolExecutor.AbortPolicy;\nimport java.util.concurrent.TimeUnit;\n\nimport com.jd.easyflow.flow.engine.impl.ReusableThreadFlowRunner;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class TestReusableThreadRunner extends ReusableThreadFlowRunner {\n\n    public TestReusableThreadRunner() {\n        this.executor = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS,\n                new SynchronousQueue<Runnable>(), Executors.defaultThreadFactory(), new AbortPolicy());\n    }\n    \n    public TestReusableThreadRunner(long timeout) {\n        this.executor = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS,\n                new SynchronousQueue<Runnable>(), Executors.defaultThreadFactory(), new AbortPolicy());\n        this.timeout = timeout;\n    }    \n\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/share/nodeaction/TestStepAction.java",
    "content": "package com.jd.easyflow.flow.cases.share.nodeaction;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class TestStepAction implements NodeAction {\n\n    private static final Logger logger = LoggerFactory.getLogger(TestStepAction.class);\n\n    @Override\n    public <T> T execute(NodeContext nodeContext, FlowContext context) {\n        FlowNode flowNode = context.getFlow().getNode(nodeContext.getNodeId());\n        boolean exception = Boolean.TRUE.equals(flowNode.getProperty(\"exception\"));\n        if (exception) {\n            logger.info(\"exception\");\n            throw new RuntimeException(\"exception\");\n        }\n        Integer sleep = flowNode.getProperty(\"sleep\");\n        if (sleep != null) {\n            logger.info(\"Sleep time is:\" + sleep);\n            try {\n                Thread.sleep(sleep);\n            } catch (InterruptedException e) {\n                throw new RuntimeException(e);\n            }\n        }\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/spring/SpringFlowTest.java",
    "content": "package com.jd.easyflow.flow.cases.spring;\n\nimport static org.junit.Assert.assertEquals;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.context.ApplicationContext;\nimport org.springframework.context.annotation.AnnotationConfigApplicationContext;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.support.ClassPathXmlApplicationContext;\n\nimport com.jd.easyflow.flow.engine.FlowEngine;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\nimport com.jd.easyflow.flow.quickstart.QuickStart001Node01Action;\nimport com.jd.easyflow.flow.quickstart.QuickStart002Node01Action;\nimport com.jd.easyflow.flow.quickstart.QuickStart003Node01Action;\n\n/**\n * \n * @author liyuliang5\n */\npublic class SpringFlowTest {\n    \n    private static final Logger logger = LoggerFactory.getLogger(SpringFlowTest.class);\n\n    @Test\n    public void testIntegrationWithSpringXml() {\n        ApplicationContext context = new ClassPathXmlApplicationContext(\"classpath:flow/cases/spring/applicationContext-flow-test.xml\");\n        FlowEngine flowEngine = context.getBean(FlowEngine.class);\n        \n        FlowParam param = new FlowParam(\"flow_spring_test_001\");\n        FlowResult result = flowEngine.execute(param);\n        logger.info(\"Execute finish, current node is:\" + result.getContext().getEndNodes().get(0).getNodeId());\n        assertEquals(\"node003\", result.getContext().getEndNodes().get(0).getNodeId());\n    }\n    \n    @Test\n    public void testIntegrationWithSpringAnnotation() {\n        ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);\n        FlowEngine flowEngine = context.getBean(FlowEngine.class);\n        \n        FlowParam param = new FlowParam(\"flow_spring_test_001\");\n        FlowResult result = flowEngine.execute(param);\n        logger.info(\"Execute finish, current node is:\" + result.getContext().getEndNodes().get(0).getNodeId());\n        assertEquals(\"node003\", result.getContext().getEndNodes().get(0).getNodeId());\n    }\n    \n    \n    @Configuration\n    public static class SpringConfig {\n\n        @Bean\n        public FlowEngine flowEngine() {\n            FlowEngineImpl flowEngine = new FlowEngineImpl();\n            flowEngine.setFlowPath(\"classpath:flow/cases/spring/flow_spring_001.json\");\n            return flowEngine;\n        }\n\n        @Bean\n        public QuickStart001Node01Action quickStart001Node01Action() {\n            return new QuickStart001Node01Action();\n        }\n\n        @Bean\n        public QuickStart002Node01Action quickStart002Node01Action() {\n            return new QuickStart002Node01Action();\n        }\n\n        @Bean\n        public QuickStart003Node01Action quickStart003Node01Action() {\n            return new QuickStart003Node01Action();\n        }\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/subflow/SubFlowTest.java",
    "content": "package com.jd.easyflow.flow.cases.subflow;\n\nimport static org.junit.Assert.assertEquals;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\n\n/**\n * Sub flow test cases.\n * \n * @author liyuliang5\n *\n */\npublic class SubFlowTest {\n\n    private static final Logger logger = LoggerFactory.getLogger(SubFlowTest.class);\n\n    /**\n     * Test inner subflow.\n     */\n    @Test\n    public void testInnerSubFlow() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/subflow/flow_subflow_001.json\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"subflow_test_001\");\n        FlowResult result = flowEngine.execute(param);\n        logger.info(\"Execute finish, current node is:\" + result.getContext().getEndNodes().get(0).getNodeId());\n        assertEquals(\"node003\", result.getContext().getEndNodes().get(0).getNodeId());\n    }\n\n    /**\n     * Test out subflow.\n     */\n    @Test\n    public void testOutSubFlow() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\n                \"classpath:flow/cases/subflow/flow_subflow_002.json,classpath:flow/cases/subflow/flow_subflow_002_01.json\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"subflow_test_002\");\n        FlowResult result = flowEngine.execute(param);\n        logger.info(\"Execute finish, current node is:\" + result.getContext().getEndNodes().get(0).getNodeId());\n        assertEquals(\"node003\", result.getContext().getEndNodes().get(0).getNodeId());\n    }\n\n    /**\n     * Test self subflow.\n     */\n    @Test\n    public void testSelfSubFlow() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\n                \"classpath:flow/cases/subflow/flow_subflow_003.json,classpath:flow/cases/subflow/flow_subflow_003_01.json\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"subflow_test_003\");\n        FlowResult result = flowEngine.execute(param);\n        logger.info(\"Execute finish, current node is:\" + result.getContext().getEndNodes().get(0).getNodeId());\n        assertEquals(\"node003\", result.getContext().getEndNodes().get(0).getNodeId());\n    }\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/cases/subflow/TestInvokeSubFlowNodeAction.java",
    "content": "package com.jd.easyflow.flow.cases.subflow;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class TestInvokeSubFlowNodeAction implements NodeAction {\n\n    @Override\n    public <T> T execute(NodeContext nodeContext, FlowContext context) {\n        String subFlowId = context.getFlow().getNode(nodeContext.getNodeId()).getProperty(\"subFlowId\");\n        FlowParam flowParam = new FlowParam(subFlowId);\n        context.getFlowEngine().execute(flowParam);\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/quickstart/QuickStart001Node01Action.java",
    "content": "package com.jd.easyflow.flow.quickstart;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class QuickStart001Node01Action implements NodeAction {\n    \n    private static final Logger logger = LoggerFactory.getLogger(QuickStart001Node01Action.class);\n\n    @Override\n    public <T> T execute(NodeContext nodeContext, FlowContext context) {\n        logger.info(\"Execute Node 001\");\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/quickstart/QuickStart002Node01Action.java",
    "content": "package com.jd.easyflow.flow.quickstart;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class QuickStart002Node01Action implements NodeAction {\n    \n    private static final Logger logger = LoggerFactory.getLogger(QuickStart002Node01Action.class);\n\n    @Override\n    public <T> T execute(NodeContext nodeContext, FlowContext context) {\n        logger.info(\"Execute Node 002\");\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/quickstart/QuickStart003Node01Action.java",
    "content": "package com.jd.easyflow.flow.quickstart;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class QuickStart003Node01Action implements NodeAction {\n    \n    private static final Logger logger = LoggerFactory.getLogger(QuickStart003Node01Action.class);\n\n    @Override\n    public <T> T execute(NodeContext nodeContext, FlowContext context) {\n        logger.info(\"Execute Node 003\");\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/quickstart/QuickStartTest.java",
    "content": "package com.jd.easyflow.flow.quickstart;\n\nimport static org.junit.Assert.assertEquals;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class QuickStartTest {\n    \n    private static final Logger logger = LoggerFactory.getLogger(QuickStartTest.class);\n\n    @Test\n    public void testQuickStart001() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/quickstart/quickstart_001.json\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"quickstart_001\");\n        FlowResult result = flowEngine.execute(param);\n        logger.info(\"Execute finish, current node is:\" + result.getContext().getEndNodes().get(0).getNodeId());\n        assertEquals(\"node003\", result.getContext().getEndNodes().get(0).getNodeId());\n    }\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/unit/util/JsonTest.java",
    "content": "package com.jd.easyflow.flow.unit.util;\n\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowContextImpl;\nimport com.jd.easyflow.flow.util.JsonUtil;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class JsonTest {\n\n\tpublic static final Logger logger = LoggerFactory.getLogger(JsonTest.class);\n\n\t@Test\n\tpublic void test2St() {\n\t\tlogger.info(\"null:\" + JsonUtil.toJsonString(null));\n\t\tlogger.info(\"1\" + JsonUtil.toJsonString(1));\n\t\tlogger.info(\"123:\" + JsonUtil.toJsonString(\"123\"));\n\t\tlogger.info(\"date:\" + JsonUtil.toJsonString(new Date()));\n\t\tlogger.info(\"map:\" + JsonUtil.toJsonString( new HashMap<>()));\n\t\tlogger.info(\"object:\" + JsonUtil.toJsonString(new Object()));\n\n\t}\n\t\n\t@Test\n\tpublic void test2Object() {\n\t\tlogger.info(\"null:\" + JsonUtil.parseObject(\"null\", Object.class));\n\t\tlogger.info(\"1\" + JsonUtil.parseObject(\"1\", Integer.class));\n\t\tlogger.info(\"123:\" + JsonUtil.parseObject(\"123\", String.class));\n\t\tlogger.info(\"date:\" + JsonUtil.parseObject(\"1591418665721\", Date.class));\n\t\tlogger.info(\"map:\" + JsonUtil.parseObject(\"{}\", Map.class));\n\t\tlogger.info(\"object:\" + JsonUtil.parseObject(\"{}\", Object.class));\n\t}\n\t\n\t@Test\n\tpublic void testJsonIgnore() {\n\t    FlowParam param = new FlowParam();\n\t    FlowContextImpl context = new FlowContextImpl();\n\t    param.setContext(context);\n\t    context.setParam(param);\n\t    logger.info(JsonUtil.toJsonString(context));\n\t    \n\t}\n\t\n    @Test\n    public void testJsonIgnore2() {\n        FlowResult result = new FlowResult();\n        FlowContextImpl context = new FlowContextImpl();\n        result.setContext(context);\n        context.setResult(result);\n        logger.info(JsonUtil.toJsonString(result));\n\n    }\n\t\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/java/com/jd/easyflow/flow/unit/util/TreeMapTest.java",
    "content": "package com.jd.easyflow.flow.unit.util;\n\nimport java.util.Comparator;\nimport java.util.TreeMap;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class TreeMapTest {\n    \n    private static final Logger logger = LoggerFactory.getLogger(TreeMapTest.class);\n\n    @Test\n    public void testTreeMap1() {\n        TreeMap<Integer, String> map = new TreeMap<>();\n        map.put(1, \"1\");\n        map.put(0, \"0\");\n        map.put(-1, \"-1\");\n        map.put(2, \"2\");\n        map.put(-2, \"-2\");\n        logger.info(\"ascending order:\");\n        for (Integer i : map.keySet()) {\n            logger.info(i + \"\");\n        }\n        logger.info(\"reverse order:\");\n        for (Integer i : map.descendingKeySet()) {\n            logger.info(i + \"\");\n        }\n    }\n    \n    @Test\n    public void testTreeMap2() {\n        TreeMap<Integer, String> map = new TreeMap<>(Comparator.reverseOrder());\n        map.put(1, \"1\");\n        map.put(0, \"0\");\n        map.put(-1, \"-1\");\n        map.put(2, \"2\");\n        map.put(-2, \"-2\");\n        logger.info(\"ascending order:\");\n        for (Integer i : map.keySet()) {\n            logger.info(i + \"\");\n        }\n        logger.info(\"reverse order:\");\n        for (Integer i : map.descendingKeySet()) {\n            logger.info(i + \"\");\n        }\n    }\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/action/action_interrupt_001.json",
    "content": "{    \"id\": \"action_interrupt_test_001\",\n    \"name\": \"Action Interrupt Test 001\",\n    \"nodes\": [\n        {\"id\": \"node001\",\"name\": \"Node001\",\"start\": true,\n            \"post\": {\"to\": [\"node002\", \"node003\"]}},   \n        {\"id\": \"node002\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.model.action.InterruptNodeAction()\"}, \"name\": \"Node002\"}, \n        {\"id\": \"node003\", \"name\": \"Node003\"}\n        ]\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/action/compensate_001.json",
    "content": "{\n\t\"id\":\"compensate_001\",\n\t\"nodes\":[\n\t\t{\"id\":\"node001\", \"start\":true, \"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.action.CompensateTest.TestCompensateNodeAction()\"}, \"post\":{\"to\":\"node002\"}},\n\t\t{\"id\":\"node002\", \"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.action.CompensateTest.TestCompensateNodeAction()\"}, \"post\":{\"to\":\"node003\"}},\n\t\t{\"id\":\"node003\", \"action\":{\"createExp\":\"new com.jd.easyflow.flow.model.action.CompensateNodeAction()\"}}\n\t]\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/action/compensate_002.json",
    "content": "{\n\t\"id\":\"compensate_002\",\n\t\"nodes\":[\n\t\t{\"id\":\"node001\", \"start\":true, \"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.action.CompensateTest.TestCompensateNodeAction()\"}, \"post\":{\"to\":[\"node002\",\"node003\"]}},\n\t\t{\"id\":\"node002\", \"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.action.CompensateTest.TestCompensateNodeAction()\"}, \"post\":{\"to\":\"node004\"}},\n\t\t{\"id\":\"node003\", \"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.action.CompensateTest.TestCompensateNodeAction()\"}, \"post\":{\"to\":\"node004\"}},\n\t\t{\"id\":\"node004\", \"pre\":{\"preNodes\":[\"node002\",\"node003\"]}, \"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.action.CompensateTest.TestCompensateNodeAction()\"}, \"post\":{\"to\":\"node005\"}},\n\t\t{\"id\":\"node005\", \"action\":{\"createExp\":\"new com.jd.easyflow.flow.model.action.CompensateNodeAction()\"}}\n\t]\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/action/compensate_flow_001.json",
    "content": "{\n\t\"id\":\"compensate_flow_001\",\n\t\"nodes\":[\n\t\t{\"id\":\"node001\", \"start\":true, \"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.action.CompensateTest.TestCompensateNodeAction()\"}, \"post\":{\"to\":[\"node002\",\"node003\"]}},\n\t\t{\"id\":\"node002\", \"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.action.CompensateTest.TestCompensateNodeAction()\"}, \"post\":{\"to\":\"node004\"}},\n\t\t{\"id\":\"node003\", \"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.action.CompensateTest.TestCompensateNodeAction()\"}, \"post\":{\"to\":\"node004\"}},\n\t\t{\"id\":\"node004\", \"pre\":{\"preNodes\":[\"node002\",\"node003\"]}, \"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.action.CompensateTest.TestCompensateNodeAction()\"}}\n\t]\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/action/loop_test_001.json",
    "content": "{\n    \"id\": \"loop_test_001\",\n    \"name\": \"Loop Test 001\",\n    \"nodes\": [\n        {\n            \"id\": \"node001\",\n            \"name\": \"Node001\",\n            \"start\": true,\n            \"action\": {\n                \"createExp\": \"new com.jd.easyflow.flow.model.action.LoopNodeAction()\"\n            },\n            \"properties\": {\n                \"loopTestBefore\":false,\n                \"loopMaxCountExp\":\"param.get('loopMaxCount')\",\n                \"loopAction\":{\n                    \"exp\":\"T(java.lang.System).out.println(param.get('data').get(nodeContext.get('currentLoopIndex')))\"\n                }\n                \n            }\n        }\n    ]\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/action/multiple_action_001.json",
    "content": "{\"id\":\"multi_action_001\", \n\"nodes\":[\n\t{\"id\":\"node1\", \"start\":true, \"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.action.MultipleActionTest.TestMultipleActionNodeAction()\"},\n\t \"properties\":{\"action\":{\"exp\":\"T(java.lang.System).out.println('subAction')\"}}}\n]\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/event/flow_event_001.json",
    "content": "{\n    \"id\": \"flow_event_001\",\"name\": \"Flow event 001\",\n    \"nodes\": [\n        {\"id\": \"EMPTY_NODE\",\"name\": \"Single Empty Node1\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.model.action.EventNodeAction()\"},\n            \"post\":{\"createExp\":\"new com.jd.easyflow.flow.model.post.EventPostHandler()\"}, \n            \"properties\":{\"events\":{\n                \"EVENT1\":\"new com.jd.easyflow.flow.cases.event.TestEventNodeAction().execute(nodeContext, context)\",\n                \"EVENT2\":{\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.event.TestEventNodeAction()\"}},\n                \"EVENT3\":{\"action\":{\"exp\":\"new com.jd.easyflow.flow.cases.event.TestEventNodeAction().execute(nodeContext, context)\"}, \"post\":{\"to\":\"EMPTY_NODE2\"}}\n            }}\n        },\n        {\"id\": \"EMPTY_NODE2\",\"name\": \"Single Empty Node2\"}\n    ],\n    \"listeners\":[{\"createExp\":\"new com.jd.easyflow.flow.engine.event.impl.EventFlowListener()\"}]\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/event/flow_event_002.json",
    "content": "{\n    \"id\": \"flow_event_002\",\"name\": \"Flow event 002\",\n    \"nodes\": [\n        {\"id\": \"EMPTY_NODE\",\"name\": \"Single Empty Node1\",\"action\":{\"exp\":\"new com.jd.easyflow.flow.model.action.EventNodeAction().execute(nodeContext, context)\"},\n            \"post\":{\"createExp\":\"new com.jd.easyflow.flow.model.post.EventPostHandler()\"}, \n            \"properties\":{\"events\":{\n                \"EVENT1\":\"new com.jd.easyflow.flow.cases.event.TestEventNodeAction().execute(nodeContext, context)\",\n                \"EVENT2\":{\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.event.TestEventNodeAction()\"}},\n                \"EVENT3\":{\"action\":{\"exp\":\"new com.jd.easyflow.flow.cases.event.TestEventNodeAction().execute(nodeContext, context)\"}, \"post\":{\"to\":\"EMPTY_NODE2\"}}\n            }}\n        },\n        {\"id\": \"EMPTY_NODE2\",\"name\": \"Single Empty Node2\"}\n    ],\n    \"listeners\":[{\"createExp\":\"new com.jd.easyflow.flow.engine.event.impl.EventFlowListener()\"}]\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/event/flow_event_003.json",
    "content": "{\n    \"id\": \"flow_event_003\",\"name\": \"Flow event 003\",\n    \"nodes\": [\n        {\"id\": \"EMPTY_NODE\",\"name\": \"Single Empty Node1\",\"action\":{\"type\":\"event\"},\n            \"post\":{\"type\":\"event\"}, \n            \"properties\":{\"events\":{\n                \"EVENT1\":\"new com.jd.easyflow.flow.cases.event.TestEventNodeAction().execute(nodeContext, context)\",\n                \"EVENT2\":{\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.event.TestEventNodeAction()\"}},\n                \"EVENT3\":{\"action\":{\"exp\":\"new com.jd.easyflow.flow.cases.event.TestEventNodeAction().execute(nodeContext, context)\"}, \"post\":{\"to\":\"EMPTY_NODE2\"}}\n            }}\n        },\n        {\"id\": \"EMPTY_NODE2\",\"name\": \"Single Empty Node2\"}\n    ],\n    \"listeners\":[{\"createExp\":\"new com.jd.easyflow.flow.engine.event.impl.EventFlowListener()\"}]\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/event/flow_event_nolistener_001.json",
    "content": "{\n    \"id\": \"flow_event_nolistener_001\",\n    \"nodes\": [\n        {\"id\": \"EMPTY_NODE\",\"name\": \"Single Empty Node1\",\"action\":{\"type\":\"event\"},\n            \"post\":{\"type\":\"event\"}, \n            \"properties\":{\"events\":{\n                \"EVENT3\":{\"action\":{\"exp\":\"new com.jd.easyflow.flow.cases.event.TestEventNodeAction().execute(nodeContext, context)\"}, \"post\":{\"to\":\"EMPTY_NODE2\"}}\n            }}\n        },\n        {\"id\": \"EMPTY_NODE2\",\"name\": \"Single Empty Node2\"}\n    ]\n }"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/filter/inner_flow_engine_filter_001.json",
    "content": "{\n\"id\":\"innerFlowEngineFilter001\",\n\"nodes\":[\n\t{\"id\":\"001\", \"start\":true}\n]\n}\n"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/filter/inner_flow_filter_001.json",
    "content": "{\n\"id\":\"innerFlowFilter001\",\n\"nodes\":[\n{\"id\":\"node001\", \"start\":true, \"action\":\"0\", \"post\":{\"when\":\"actionResult>0\", \"to\":\"node002\"}},\n{\"id\":\"node002\"}\n],\n\"filters\":[{\"createExp\":\"new com.jd.easyflow.flow.cases.filter.FilterTest.TestInnerFlowFilter(-1)\"}],\n\"nodeFilters\":[{\"createExp\":\"new com.jd.easyflow.flow.cases.filter.FilterTest.TestInnerNodeFilter()\", \"order\":-1}]\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/filter/inner_node_action_filter_001.json",
    "content": "{\n\"id\":\"innerNodeActionFilter001\",\n\"nodes\":[\n{\"id\":\"node001\", \"start\":true, \"action\":\"0\", \"post\":{\"when\":\"actionResult>0\", \"to\":\"node002\"}},\n{\"id\":\"node002\"}\n],\n\"nodeActionFilters\":[{\"createExp\":\"new com.jd.easyflow.flow.cases.filter.FilterTest.TestNodeActionFilter()\", \"order\":-1}]\n\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/inclusive/flow_inclusive201.json",
    "content": "{\n    \"id\": \"flow_inclusive201\",\"name\": \"Inclusive nodes 001\",\n    \"nodes\": [\n        {\"id\": \"START_NODE\", \"start\":true, \"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"},\n            \"post\":{\"conditionType\":\"inclusive\", \"conditions\":[\n            {\"when\":\"bizParam<1\", \"to\":\"NODE1\"},\n            {\"when\":\"bizParam<2\", \"to\":\"NODE2\"}\n            ]}\n        },\n        \n        {\"id\": \"NODE1\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"}, \"post\":{\"to\":\"INCLUSIVE_NODE\"}},\n        {\"id\": \"NODE2\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"}, \"post\":{\"to\":\"INCLUSIVE_NODE\"}},\n        \n        {\"id\": \"INCLUSIVE_NODE\", \"pre\":{\"createExp\":\"new com.jd.easyflow.flow.model.pre.InclusiveCheckPreHandler()\"},\n                           \"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"},\n                           \"post\":{\"to\":\"END\"},\n                           \"properties\":{\"preNodes\":[\"NODE1\",\"NODE2\"]}},\n        {\"id\":\"END\"}\n    ],\n    \"runner\":{\"createExp\":\"new com.jd.easyflow.flow.cases.runner.TestMultiRunner()\"}\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/inclusive/flow_inclusive202.json",
    "content": "{\n    \"id\": \"flow_inclusive202\",\"name\": \"Inclusive nodes 001\",\n    \"nodes\": [\n        {\"id\": \"START_NODE\", \"start\":true, \"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"},\n            \"post\":{\"conditionType\":\"inclusive\", \"conditions\":[\n            {\"when\":\"bizParam<1\", \"to\":\"NODE1\"},\n            {\"when\":\"bizParam<2\", \"to\":\"NODE2\"}\n            ]}\n        },\n        \n        {\"id\": \"NODE1\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"}, \"post\":{\"to\":\"NODE11\"}},\n        {\"id\": \"NODE2\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"}, \"post\":{\"to\":\"NODE21\"}},\n        {\"id\": \"NODE11\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"}, \"post\":{\"to\":\"INCLUSIVE_NODE\"}},\n        {\"id\": \"NODE21\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"}, \"post\":{\"to\":\"INCLUSIVE_NODE\"}},        \n        \n        {\"id\": \"INCLUSIVE_NODE\", \"pre\":{\"createExp\":\"new com.jd.easyflow.flow.model.pre.InclusiveCheckPreHandler()\"},\n                           \"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"},\n                           \"post\":{\"to\":\"END\"},\n                           \"properties\":{\"preNodes\":[\"NODE11\",\"NODE21\"]}},\n        {\"id\":\"END\"}\n    ],\n    \"runner\":{\"createExp\":\"new com.jd.easyflow.flow.cases.runner.TestReusableThreadRunner()\"}\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/inclusive/flow_inclusive203.json",
    "content": "{\n    \"id\": \"flow_inclusive203\",\"name\": \"Inclusive nodes 001\",\n    \"nodes\": [\n        {\"id\": \"START_NODE\", \"start\":true, \"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"},\n            \"post\":{\"conditionType\":\"inclusive\", \"conditions\":[\n            {\"when\":\"bizParam.node1\", \"to\":\"NODE1\"},\n            {\"when\":\"bizParam.node2\", \"to\":\"NODE2\"},\n            {\"when\":\"bizParam.node3\", \"to\":\"NODE3\"}\n            ]}\n        },\n        \n        {\"id\": \"NODE1\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"}, \"post\":{\"to\":\"INCLUSIVE1\"}},\n        {\"id\": \"NODE2\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"}, \"post\":{\"to\":\"INCLUSIVE1\"}},\n        {\"id\": \"NODE3\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"}, \"post\":{\"to\":\"INCLUSIVE2\"}},\n        {\"id\": \"INCLUSIVE1\",\"pre\":{\"type\":\"inclusiveCheck\", \"preNodes\":[\"NODE1\",\"NODE2\"]},\n             \"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"}, \"post\":{\"to\":\"INCLUSIVE2\"}},        \n        {\"id\": \"INCLUSIVE2\", \"pre\":{\"type\":\"inclusiveCheck\",\"preNodes\":[\"INCLUSIVE1\",\"NODE3\"]},\n                           \"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"},\n                           \"post\":{\"to\":\"END\"}},\n        {\"id\":\"END\"}\n    ],\n    \"runner\":{\"createExp\":\"new com.jd.easyflow.flow.cases.runner.TestReusableThreadRunner()\"}\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/inclusive/flow_inclusive303.json",
    "content": "{\n    \"id\": \"flow_inclusive303\",\"name\": \"Inclusive nodes 001\",\n    \"nodes\": [\n        {\"id\": \"S\", \"start\":true,\n            \"post\":{\"conditionType\":\"inclusive\", \"conditions\":[\n            {\"when\":\"bizParam.I1\", \"to\":\"I1\"},\n            {\"when\":\"bizParam.I2\", \"to\":\"I2\"}\n            ]}\n        },\n        {\"id\": \"I1\",\"pre\":{\"type\":\"inclusiveCheck\", \"preNodes\":[\"S\",\"I2\"]}, \"post\":{\"to\":\"I2\"}},        \n        {\"id\": \"I2\", \"pre\":{\"type\":\"inclusiveCheck\",\"preNodes\":[\"S\",\"I1\"]},\"post\":{\"to\":\"I1\"}}\n    ],\n    \"runner\":{\"createExp\":\"new com.jd.easyflow.flow.cases.runner.TestReusableThreadRunner()\"}\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/interrupt/interrupt_001.json",
    "content": "{   \"id\": \"interrupt_001\",\n    \"nodes\": [\n        {\"id\": \"node001\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.interrupt.TestInterruptBizNodeAction(1000, false)\"}, \"start\":true}, \n          \n        {\"id\": \"node0021\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.interrupt.TestInterruptBizNodeAction(2000, true)\"}, \"post\":{\"when\":\"actionResult\", \"to\":\"node022\"}, \"start\":true},   \n        {\"id\": \"node0022\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.interrupt.TestInterruptBizNodeAction(1000, false)\"}}, \n        \n        {\"id\": \"node003\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.interrupt.TestInterruptBizNodeAction(3000, false)\"}, \"start\":true} \n    ],\n    \"runner\":{\"createExp\":\"new com.jd.easyflow.flow.cases.runner.TestReusableThreadRunner(10000)\"}\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/interrupt/interrupt_002.json",
    "content": "{   \"id\": \"interrupt_002\",\n    \"nodes\": [\n        {\"id\": \"node001\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.interrupt.TestInterruptBizNodeAction(1000, true)\"}, \"start\":true},   \n        {\"id\": \"node002\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.interrupt.TestInterruptBizNodeAction(2000, true)\"}, \"start\":true},   \n        {\"id\": \"node003\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.interrupt.TestInterruptBizNodeAction(3000, true)\"}, \"start\":true} \n    ],\n    \"runner\":{\"createExp\":\"new com.jd.easyflow.flow.cases.runner.TestReusableThreadRunner(10000)\"}\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/listener/interrupt_listener_001.json",
    "content": "{    \"id\": \"interrupt_listener_test_001\",\n    \"name\": \"Interrupt Listener Test 001\",\n    \"nodes\": [\n        {\"id\": \"node001\",\"name\": \"Node001\",\"start\": true,\n            \"post\": {\"to\": [\"node002\", \"node003\"]}},   \n        {\"id\": \"node002\", \"name\": \"Node002\", \"properties\":{\"interrupt\":true}}, \n        {\"id\": \"node003\", \"name\": \"Node003\"}\n        ],\n    \"listeners\":[\n        {\"createExp\":\"new com.jd.easyflow.flow.engine.event.impl.InterruptFlowListener()\"}\n    ]\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/listener/interrupt_listener_002.json",
    "content": "{    \"id\": \"interrupt_listener_test_002\",\n    \"name\": \"Interrupt Listener Test 002\",\n    \"nodes\": [\n        {\"id\": \"node001\",\"name\": \"Node001\",\"start\": true,\n            \"post\": {\"to\": [\"node002\", \"node003\"]}},   \n        {\"id\": \"node002\", \"name\": \"Node002\"}, \n        {\"id\": \"node003\", \"name\": \"Node003\", \"properties\":{\"interrupt\":true}}\n        ],\n    \"listeners\":[\n        {\"createExp\":\"new com.jd.easyflow.flow.engine.event.impl.InterruptFlowListener()\"}\n    ]\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/listener/interrupt_listener_003.json",
    "content": "{    \"id\": \"interrupt_listener_test_003\",\n    \"name\": \"Interrupt Listener Test 003\",\n    \"nodes\": [\n        {\"id\": \"node001\",\"name\": \"Node001\",\"start\": true,\n            \"post\": {\"to\": [\"node002\", \"node003\"]}},   \n        {\"id\": \"node002\", \"name\": \"Node002\", \"properties\":{\"interruptExp\":\"param.param==true\"}}, \n        {\"id\": \"node003\", \"name\": \"Node003\"}\n        ],\n    \"listeners\":[\n        {\"createExp\":\"new com.jd.easyflow.flow.engine.event.impl.InterruptFlowListener()\"}\n    ]}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/logflag/logflag_001.json",
    "content": "{\n\t\"id\":\"logFlag_001\",\n\t\"nodes\":[\n\t\t{\"id\":\"node001\",\"action\":\"new com.jd.easyflow.flow.cases.logflag.LogFlagTest().throwException()\",\"start\":true}\n\t]\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/mockbiz/mock_loan_001.json",
    "content": "{\n\t\"id\": \"mock_loan_001\",\n\t\"name\": \"Mock loan flow\",\n\t\"nodes\": [\n\t\t{\n\t\t\t\"id\": \"CONTRACT_SIGN\",\n\t\t\t\"name\": \"sign contract\",\n\t\t\t\"properties\": {\"order\": 1},\n\t\t\t\"pre\":null,\n\t\t\t\"action\":{\"exp\":\"new com.jd.easyflow.flow.cases.mockbiz.LoanContractSignBiz().sign()\"},\n\t\t\t\"post\":{\"to\":\"LIMIT_JUDGE\"}\n\t\t},\n\t\t{\n\t\t\t\"id\": \"LIMIT_JUDGE\",\n\t\t\t\"name\": \"Judge limit\",\n\t\t\t\"properties\": {\"order\": 2},\n\t\t\t\"action\":{\"exp\":\"new com.jd.easyflow.flow.cases.mockbiz.LimitBiz().judgeLimit(param.param['amount'])\"},\n\t\t\t\"post\":{\"conditions\":[{\"when\":\"nodeContext.actionResult==true\", \"to\":\"DO_LOAN\"}]}\n\t\t},\n\t\t      {\n            \"id\": \"DO_LOAN\",\n            \"name\": \"Do loan\",\n            \"properties\": {\"order\": 3},\n            \"action\":{\"exp\":\"new com.jd.easyflow.flow.cases.mockbiz.LoanBiz().doLoan()\"}\n        }\n\t],\n\t\"listeners\":[\n    {\"createExp\":\"new com.jd.easyflow.flow.cases.mockbiz.MockFlowListener()\"}\n    ]\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/parallel/flow_parallel001.json",
    "content": "{\n    \"id\": \"flow_parallel001\",\"name\": \"Parallel nodes 001\",\n    \"nodes\": [\n        {\"id\": \"START_NODE\", \"start\":true, \"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"},\n            \"post\":{\"to\":[\"PARALLEL_NODE1\",\"PARALLEL_NODE2\"]}\n        },\n        \n        {\"id\": \"PARALLEL_NODE1\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"}, \"post\":{\"to\":\"END_NODE\"}, \"properties\":{\"sleep\":100}},\n        {\"id\": \"PARALLEL_NODE2\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"}, \"post\":{\"to\":\"END_NODE\"}, \"properties\":{\"sleep\":300}},\n        \n        {\"id\": \"END_NODE\", \"pre\":{\"createExp\":\"new com.jd.easyflow.flow.model.pre.MultiCheckPreHandler()\"},\n                           \"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"},\n                           \"properties\":{\"preNodes\":[\"PARALLEL_NODE1\",\"PARALLEL_NODE2\"]}}\n    ],\n    \"runner\":{\"createExp\":\"new com.jd.easyflow.flow.cases.runner.TestMultiRunner()\"}\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/parser/flow_multiple001.json",
    "content": "[\n{\n    \"id\": \"flow_multiple0011\",\"name\": \"0011\",\n    \"nodes\": [\n        {\"id\": \"START_NODE1\", \"start\":true}\n    ]\n},\n{\n    \"id\": \"flow_multiple0012\",\"name\": \"0012\",\n    \"nodes\": [{\"id\": \"START_NODE2\", \"start\":true}\n    ]\n}    \n    \n]"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/parser/parser_test_001.json",
    "content": "{    \"id\": \"parser_test_001\",\n    \"name\": \"Parser Test 001\",\n    \"nodes\": [\n        {\"id\": \"node001\",\"name\": \"Node001\",\"start\": true,\"post\": {\"to\": \"node002\"}},\n        {\"id\": \"node002\",\"name\": \"Node002\",\"action\": {\"createExp\": \"new com.jd.easyflow.flow.quickstart.QuickStart002Node01Action()\"},\"post\": {\"to\": \"node003\"}},\n        {\"id\": \"node003\",\"name\": \"Node003\"}\n    ]\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/parser/parser_test_002.json",
    "content": "{    \"id\": \"parser_test_002\",\n    \"name\": \"Parser Test 002\",\n    \"nodes\": [\n        {\"id\": \"node001\", \"post\": {\"to\": \"node002\"}},\n        {\"id\": \"node002\",\"name\": \"Node002\",\"action\": {\"createExp\": \"new com.jd.easyflow.flow.quickstart.QuickStart002Node01Action()\"},\"post\": {\"to\": \"node003\"}},\n        {\"id\": \"node003\",\"name\": \"Node003\"}\n    ],\n    \"parseListeners\":[{\"createExp\":\"new com.jd.easyflow.flow.cases.parser.TestFlowParseListener()\"}]\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/parser/parser_test_003.json",
    "content": "{    \"id\": \"parser_test_003\",\n    \"name\": \"Parser Test 003\",\n    \"nodes\": [\n        {\"id\": \"node001\"}\n    ]\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/parser/parser_test_subflow_001.json",
    "content": "{\n\t\"id\": \"flow1\",\n\t\"nodes\": [\n\t\t{\n\t\t\t\"id\": \"node1\",\n\t\t\t\"action\": {\n\t\t\t\t\"flow\": {\n\t\t\t\t\t\"id\": \"flow11\",\n\t\t\t\t\t\"nodes\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"id\": \"node11\",\n\t\t\t\t\t\t\t\"action\": {\n\t\t\t\t\t\t\t\t\"flow\": {\n\t\t\t\t\t\t\t\t\t\"id\": \"flow111\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t]\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/parser/parser_test_subflow_002.json",
    "content": "{\n\t\"id\": \"flow1\",\n\t\"nodes\": [\n\t\t{\n\t\t\t\"id\": \"node1\",\n\t\t\t\"action\":{\"type\":\"flow\"},\n\t\t\t\"properties\": {\n\t\t\t\t\"flow\": {\n\t\t\t\t\t\"id\": \"flow11\",\n\t\t\t\t\t\"nodes\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"id\": \"node11\",\n\t\t\t\t\t\t\t\"action\":{\"type\":\"flow\"},\n\t\t\t\t\t\t\t\"properties\": {\n\t\t\t\t\t\t\t\t\"flow\": {\n\t\t\t\t\t\t\t\t\t\"id\": \"flow111\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t]\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/performance/flow_memory001.json",
    "content": "{\n    \"id\": \"flow_memory_001\",\"name\": \"Memory test flow 001\",\n    \"nodes\": [\n        {\"id\": \"EMPTY_NODE\",\"name\": \"Empty node 1\",\"action\":{\"exp\":\"new com.jd.easyflow.flow.cases.performance.EmptyStepAction().execute(nodeContext, context)\"}},\n        {\"id\": \"EMPTY_NODE2\",\"name\": \"Empty node 2\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.performance.EmptyStepAction()\"}},\n        {\"id\": \"EMPTY_NODE3\",\"name\": \"Empty node 3\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.performance.LoopStepAction()\"}}\n    ],\n    \"properties\":{\n        \"flow.recordHistory\":false\n    }\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/performance/flow_performance001.json",
    "content": "{\n    \"id\": \"flow_performance001\",\"name\": \"Performance test flow 001\",\n    \"nodes\": [\n        {\"id\": \"EMPTY_NODE\",\"name\": \"Empty node 1\",\"action\":{\"exp\":\"new com.jd.easyflow.flow.cases.performance.EmptyStepAction().execute(nodeContext, context)\"}},\n        {\"id\": \"EMPTY_NODE2\",\"name\": \"Empty node 2\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.performance.EmptyStepAction()\"}},\n        {\"id\": \"EMPTY_NODE3\",\"name\": \"Empty node 3\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.performance.LoopStepAction()\"}},\n        {\"id\": \"EMPTY_NODE4\",\"name\": \"Empty node 4\", \"post\":{\"when\":\"actionResult==true\", \"to\":\"EMPTY_NODE2\"}},\n        {\"id\": \"EMPTY_NODE5\",\"name\": \"Empty node 5\", \"post\":{\"when\":{\"createExp\":\"T(com.jd.easyflow.flow.model.action.ActionResultEl).create('==',true)\"}, \"to\":\"EMPTY_NODE2\"}}\n\n    ]\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/posthandler/flow_createexp_post_to_001.json",
    "content": "{\n    \"id\": \"flow_createexp_post_to_001\",\n    \"nodes\": [\n        {\n            \"id\": \"STEP1\", \"start\": true,\n            \"post\":{\"to\":{\"createExp\":\"new com.jd.easyflow.flow.cases.common.TestNodeExecutor('STEP2')\"}}\n        },\n        {\n            \"id\": \"STEP2\"\n        }\n    ]\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/posthandler/flow_exp_post_to_001.json",
    "content": "{\n    \"id\": \"flow_exp_post_to_001\",\n    \"name\": \"text exp post to\",\n    \"nodes\": [\n        {\n            \"id\": \"STEP1\", \"start\": true,\n            \"post\":{\"to\":{\"exp\":\"'STEP' + '2'\"}}\n        },\n        {\n            \"id\": \"STEP2\"\n        }\n    ]\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/posthandler/flow_index001.json",
    "content": "{\n    \"id\": \"flow_index001\",\n    \"name\": \"Mock loan flow\",\n    \"nodes\": [\n        {\n            \"id\": \"CONTRACT_SIGN\",\n            \"name\": \"Sign contract\",\n            \"properties\": {\"order\": 1},\n            \"pre\":null,\n            \"action\":{\"exp\":\"new com.jd.easyflow.flow.cases.mockbiz.LoanContractSignBiz().sign()\"},\n            \"post\":{\"to\":\"$next\"}\n        },\n        {\n            \"id\": \"LIMIT_JUDGE\",\n            \"name\": \"Juedge limit\",\n            \"properties\": {\"order\": 2},\n            \"action\":{\"exp\":\"new com.jd.easyflow.flow.cases.mockbiz.LimitBiz().judgeLimit(param.param['amount'])\"},\n            \"post\":{\"conditions\":[{\"when\":\"nodeContext.actionResult==true\", \"to\":2}]}\n        },\n              {\n            \"id\": \"DO_LOAN\",\n            \"name\": \"Do loan\",\n            \"properties\": {\"order\": 3},\n            \"action\":{\"exp\":\"new com.jd.easyflow.flow.cases.mockbiz.LoanBiz().doLoan()\"}\n        }\n    ],\n    \"listeners\":[\n    {\"createExp\":\"new com.jd.easyflow.flow.cases.mockbiz.MockFlowListener()\"}\n    ]\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/posthandler/flow_post_handler_filter_001.json",
    "content": "{\n    \"id\": \"flow_post_handler_filter_001\",\n    \"name\": \"flow_post_handler_filter_001\",\n    \"nodes\": [\n        {\n            \"id\": \"STEP1\", \"start\": true, \"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.posthandler.PostParamNode1Action()\"},\n            \"post\":{\"to\":{\"node\":\"STEP2\", \"data\":{\"a\":\"5\", \"b\":\"nodeContext.dataMap['node1Param']\"}}}\n        },\n        {\n            \"id\": \"STEP2\",  \"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.posthandler.PostParamNode2Action()\"}\n        },\n        {\n            \"id\": \"STEP3\",  \"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.posthandler.PostParamNode3Action()\"}\n        }\n    ],\n    \"nodePostHandlerFilters\":[{\"createExp\":\"new com.jd.easyflow.flow.cases.posthandler.TestPostHandlerFilter()\"}]\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/posthandler/flow_post_param_001.json",
    "content": "{\n    \"id\": \"flow_post_param_001\",\n    \"name\": \"flow post param 001\",\n    \"nodes\": [\n        {\n            \"id\": \"STEP1\", \"start\": true, \"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.posthandler.PostParamNode1Action()\"},\n            \"post\":{\"to\":{\"node\":\"STEP2\", \"data\":{\"a\":\"5\", \"b\":\"nodeContext.dataMap['node1Param']\"}}}\n        },\n        {\n            \"id\": \"STEP2\",  \"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.posthandler.PostParamNode2Action()\"}\n        }\n    ]\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/posthandler/flow_postdata_001.json",
    "content": "{\n    \"id\": \"flow_postdata_001\",\n    \"nodes\": [\n        {\n            \"id\": \"STEP1\", \"start\": true,\n            \"post\":{\"to\":{\"node\":\"STEP2\", \n\t\t\t\"data\":{\"a\":\"1\", \n\t\t\t\"b\":{\"exp\":\"1+2\"}, \n\t\t\t\"c\":{\"fixedValue\":{\"d\":3}},\n\t\t\t\"d\":{\"createExp\":\"new com.jd.easyflow.flow.cases.common.TestNodeExecutor('dd')\"}}}\n        }},\n        {\n            \"id\": \"STEP2\"\n        }\n    ]\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/posthandler/flow_when_createexp_001.json",
    "content": "{\n\"id\":\"flow_when_createexp_001\",\n\"nodes\":[\n{\"id\":\"001\", \"start\":true, \"post\":{\"when\":{\"createExp\":\"new com.jd.easyflow.flow.cases.common.TestNodeExecutor(true)\"},\"to\":\"002\"}},\n{\"id\":\"002\"}\n]\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/prehandler/flow_prehandler_001.json",
    "content": "{\n  \"id\":\"flow_prehandler_001\",\n  \"name\":\"prehandle flow 001\",\n  \"nodes\":[\n    {\"id\":\"node_001\", \"name\":\"001 Node\", \"start\":true,\n      \"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"},\n      \"post\":{\"to\":[\"node_002\",\"node_003\"]}\n    },\n    {\"id\":\"node_002\", \"name\":\"002 Node\",\n      \"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"},\n      \"post\":{\"to\":\"node_004\"}\n    },\n     {\"id\":\"node_003\", \"name\":\"003 Node\",\n      \"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"},\n      \"post\":{\"to\":\"node_004\"}\n    },\n    {\"id\":\"node_004\", \"name\":\"004 Node\",\n      \"pre\":{\"preNodes\":[\"node_002\",\"node_003\"]},\n      \"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"},\n      \"post\":{\"to\":\"end\"}\n    },       \n    {\"id\":\"end\", \"name\":\"End Node\", \"properties\":{\"end\":true}}\n  ]\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/pretty/pretty_multiple_test.json",
    "content": "[\n{\n    \"id\": \"flow_multiple0011\",\"name\": \"0011\",\n    \"nodes\": [\n        {\"id\": \"START_NODE1\", \"start\":true}\n    ]\n},\n{\n    \"id\": \"flow_multiple0012\",\"name\": \"0012\",\n    \"nodes\": [{\"id\": \"START_NODE2\", \"start\":true}\n    ]\n}    \n    \n]"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/pretty/pretty_test.json",
    "content": "{\n    \"id\": \"flow001\",\n    \"name\": \"Mock loan flow\",\n    \"pre\":{\"createExp\":\"null\"},\n    \"nodes\": [\n        {\n            \"id\": \"CONTRACT_SIGN\",\n            \"name\": \"sign contract\",\n            \"pre\":null,\n            \"action\":{\"exp\":\"new com.jd.easyflow.flow.mockbiz.loan.contract.LoanContractSignBiz().sign()\"},\n            \"post\":{\"to\":\"LIMIT_JUDGE\"},\n            \"properties\": {\"order\": 1}\n        },\n        {\n            \"id\": \"LIMIT_JUDGE\",\n            \"name\": \"Judge limit\",\n            \"action\":{\"exp\":\"new com.jd.easyflow.flow.mockbiz.limit.LimitBiz().judgeLimit(param.param['amount'])\"},\n            \"post\":{\"conditions\":[{\"when\":\"nodeContext.actionResult==true\", \"to\":\"DO_LOAN\"}]},\n            \"properties\": {\"order\": 2}\n        },\n              {\n            \"id\": \"DO_LOAN\",\n            \"name\": \"Do loan\\\"only test\\\"\",\n            \"action\":{\"exp\":\"new com.jd.easyflow.flow.mockbiz.loan.LoanBiz().doLoan()\"},\n            \"properties\": {\"order\": 3}\n        }\n    ],\n    \"post\":{\"createExp\":\"null\"},\n    \"listeners\":[\n    {\"createExp\":\"new com.jd.easyflow.flow.mockbiz.MockFlowListener()\"}\n    ],\n        \"properties\":{\"process\":{\"checkStartNode\":true, \n              \"dataFlushPolicy\":\"AFTER_PROCESS\"}},\n    \"extData\":{\"a\":\"123\"}\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/runner/flow_interrupt001.json",
    "content": "{\n    \"id\": \"flow_interrupt001\",\"name\": \"interrupt flow test 001\",\n    \"nodes\": [\n        {\"id\": \"EMPTY_NODE1\",\"name\": \"Empty node 1\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.runner.TestInterruptNodeAction()\"}, \"start\":true, \"properties\":{\"interrupt\":true}},\n        {\"id\": \"EMPTY_NODE2\",\"name\": \"Empty node 2\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.runner.TestInterruptNodeAction()\"}, \"post\":{\"to\":\"EMPTY_NODE3\"}, \"start\":true},\n        {\"id\": \"EMPTY_NODE3\",\"name\": \"Empty node 3\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.runner.TestInterruptNodeAction()\"}}\n    ],\n    \"runner\":{\"createExp\":\"new com.jd.easyflow.flow.cases.runner.TestMultiRunner()\"}\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/runner/flow_interrupt002.json",
    "content": "{\n    \"id\": \"flow_interrupt002\",\"name\": \"interrupt flow test 002\",\n    \"nodes\": [\n        {\"id\": \"EMPTY_NODE1\",\"name\": \"Empty node 1\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.runner.TestInterruptNodeAction()\"}, \"start\":true, \"properties\":{\"interrupt\":true}},\n        {\"id\": \"EMPTY_NODE2\",\"name\": \"Empty node 2\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.runner.TestInterruptNodeAction()\"}, \"post\":{\"to\":\"EMPTY_NODE3\"}, \"start\":true},\n        {\"id\": \"EMPTY_NODE3\",\"name\": \"Empty node 3\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.runner.TestInterruptNodeAction()\"}}\n    ]\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/runner/flow_interrupt003.json",
    "content": "{\n    \"id\": \"flow_interrupt003\",\"name\": \"interrupt flow test 001\",\n    \"nodes\": [\n        {\"id\": \"EMPTY_NODE1\",\"name\": \"Empty node 1\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.runner.TestInterruptNodeAction()\"}, \"start\":true, \"properties\":{\"interrupt\":true}},\n        {\"id\": \"EMPTY_NODE2\",\"name\": \"Empty node 2\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.runner.TestInterruptNodeAction()\"}, \"post\":{\"to\":\"EMPTY_NODE3\"}, \"start\":true},\n        {\"id\": \"EMPTY_NODE3\",\"name\": \"Empty node 3\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.runner.TestInterruptNodeAction()\"}}\n    ],\n    \"runner\":{\"createExp\":\"new com.jd.easyflow.flow.cases.runner.TestReusableThreadRunner()\"}\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/runner/flow_multi001.json",
    "content": "{\n    \"id\": \"flow_multi001\",\n    \"nodes\": [\n        {\"id\": \"EMPTY_NODE\",\"name\": \"Empty node 1\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"},\n            \"post\":{\"to\":[\"EMPTY_NODE2\",\"EMPTY_NODE3\"]}, \"properties\":{\"sleep\":300}\n        },\n        {\"id\": \"EMPTY_NODE2\",\"name\": \"Empty node 2\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"}, \"properties\":{\"sleep\":100}},\n        {\"id\": \"EMPTY_NODE3\",\"name\": \"Empty node 3\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"}, \"properties\":{\"sleep\":500}}\n    ],\n    \"runner\":{\"createExp\":\"new com.jd.easyflow.flow.cases.runner.TestMultiRunner()\"}\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/runner/flow_multi002.json",
    "content": "{\n    \"id\": \"flow_multi002\",\n    \"nodes\": [\n        {\"id\": \"EMPTY_NODE\",\"name\": \"Empty node 1\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"},\n            \"post\":{\"to\":[\"EMPTY_NODE2\",\"EMPTY_NODE3\",\"EMPTY_NODE4\"]}, \"properties\":{\"sleep\":3}\n        },\n        {\"id\": \"EMPTY_NODE2\",\"name\": \"Empty node 2\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"}, \"properties\":{\"sleep\":1}},\n        {\"id\": \"EMPTY_NODE3\",\"name\": \"Empty node 3\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"}, \"properties\":{\"exception\":true}},\n        {\"id\": \"EMPTY_NODE4\",\"name\": \"Empty node 4\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"}, \"properties\":{\"exception\":true}}\n    ],\n    \"runner\":{\"createExp\":\"new com.jd.easyflow.flow.cases.runner.TestMultiRunner()\"}\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/runner/flow_multi003.json",
    "content": "{\n    \"id\": \"flow_multi003\",\n    \"nodes\": [\n        {\"id\": \"EMPTY_NODE\",\"name\": \"Empty node 1\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"}, \"properties\":{\"sleep\":5}\n        }\n    ],\n    \"runner\":{\"createExp\":\"new com.jd.easyflow.flow.cases.runner.TestMultiRunner(2)\"}\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/runner/flow_multi004.json",
    "content": "{\n    \"id\": \"flow_multi004\",\n    \"nodes\": [\n        {\"id\": \"EMPTY_NODE\",\"name\": \"Empty node 1\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"}, \"properties\":{\"sleep\":5}\n        }\n    ],\n    \"runner\":{\"createExp\":\"new com.jd.easyflow.flow.cases.runner.TestMultiRunner(2, true)\"}\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/runner/flow_reusable001.json",
    "content": "{\n    \"id\": \"flow_reusable001\",\n    \"nodes\": [\n        {\"id\": \"EMPTY_NODE\",\"name\": \"Empty node 1\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"},\n            \"post\":{\"to\":[\"EMPTY_NODE2\",\"EMPTY_NODE3\"]}, \"properties\":{\"sleep\":300}\n        },\n        {\"id\": \"EMPTY_NODE2\",\"name\": \"Empty node 2\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"}, \"properties\":{\"sleep\":100}},\n        {\"id\": \"EMPTY_NODE3\",\"name\": \"Empty node 3\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"}, \"properties\":{\"sleep\":500}}\n    ],\n    \"runner\":{\"createExp\":\"new com.jd.easyflow.flow.cases.runner.TestReusableThreadRunner()\"}\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/runner/flow_reusable002.json",
    "content": "{\n    \"id\": \"flow_reusable002\",\n    \"nodes\": [\n        {\"id\": \"EMPTY_NODE\",\"name\": \"Empty node 1\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"},\n            \"post\":{\"to\":[\"EMPTY_NODE2\",\"EMPTY_NODE3\"]}, \"properties\":{\"sleep\":300}\n        },\n        {\"id\": \"EMPTY_NODE2\",\"name\": \"Empty node 2\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"}, \"properties\":{\"sleep\":1}},\n        {\"id\": \"EMPTY_NODE3\",\"name\": \"Empty node 3\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"}, \"properties\":{\"exception\":true}}\n    ],\n    \"runner\":{\"createExp\":\"new com.jd.easyflow.flow.cases.runner.TestReusableThreadRunner()\"}\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/runner/flow_reusable003.json",
    "content": "{\n    \"id\": \"flow_reusable003\",\n    \"nodes\": [\n        {\"id\": \"EMPTY_NODE\",\"name\": \"Empty node 1\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"},\n         \"properties\":{\"sleep\":5}\n        }\n    ],\n    \"runner\":{\"createExp\":\"new com.jd.easyflow.flow.cases.runner.TestReusableThreadRunner(2)\"}\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/runner/flow_reusable004.json",
    "content": "{\n    \"id\": \"flow_reusable004\",\n    \"nodes\": [\n        {\"id\": \"EMPTY_NODE\",\"name\": \"Empty node 1\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"},\n            \"post\":{\"to\":[\"EMPTY_NODE2\",\"EMPTY_NODE3\"]}, \"properties\":{\"sleep\":300}\n        },\n        {\"id\": \"EMPTY_NODE2\",\"name\": \"Empty node 2\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"}, \"properties\":{\"sleep\":100}},\n        {\"id\": \"EMPTY_NODE3\",\"name\": \"Empty node 3\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.cases.share.nodeaction.TestStepAction()\"}, \"properties\":{\"sleep\":500}}\n    ],\n    \"runner\":{\"createExp\":\"new com.jd.easyflow.flow.engine.impl.ReusableThreadFlowRunner(T(java.util.concurrent.Executors).newCachedThreadPool(),0,true)\"}\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/spring/applicationContext-flow-test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:context=\"http://www.springframework.org/schema/context\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd\">\n    <context:annotation-config/>\n    <!-- flow engine bean -->\n    <bean id=\"flowEngine\" class=\"com.jd.easyflow.flow.engine.impl.FlowEngineImpl\">\n        <property name=\"flowPath\" value=\"classpath:flow/cases/spring/flow_spring_001.json\"></property>\n    </bean>  \n    \n    <!-- test node action bean -->\n    <bean id=\"quickStart001Node01Action\" class=\"com.jd.easyflow.flow.quickstart.QuickStart001Node01Action\"></bean> \n    <bean id=\"quickStart002Node01Action\" class=\"com.jd.easyflow.flow.quickstart.QuickStart002Node01Action\"></bean> \n    <bean id=\"quickStart003Node01Action\" class=\"com.jd.easyflow.flow.quickstart.QuickStart003Node01Action\"></bean> \n</beans>"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/spring/flow_spring_001.json",
    "content": "{    \"id\": \"flow_spring_test_001\",\n    \"nodes\": [\n        {\"id\": \"node001\",\"name\": \"Node001\",\"action\": {\"createExp\": \"@quickStart001Node01Action\"},\"start\": true,\"post\": {\"to\": \"node002\"}},\n        {\"id\": \"node002\",\"name\": \"Node002\",\"action\": {\"exp\": \"@quickStart002Node01Action.execute(nodeContext, context)\"},\"post\": {\"to\": \"node003\"}},\n        {\"id\": \"node003\",\"name\": \"Node003\",\"action\": \"@quickStart003Node01Action.execute(nodeContext, context)\"}\n    ]\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/subflow/flow_subflow_001.json",
    "content": "{    \"id\": \"subflow_test_001\",\n    \"name\": \"Sub Flow Test 001\",\n    \"nodes\": [\n        {\"id\": \"node001\",\"name\": \"Node001\",\"start\": true,\"post\": {\"to\": \"node002\"}},\n        {\"id\": \"node002\",\"name\": \"Node002\",\"action\": {\n        \"flow\":{\"id\":\"subflow_node002\",\n          \"nodes\":[\n          {\"id\": \"node002_01\",\"name\": \"Node002_01\",\"start\": true,\"post\": {\"to\": \"node002_02\"}},\n          {\"id\": \"node002_02\",\"name\": \"Node002_02\"}\n          ]\n        }\n        },\"post\": {\"to\": \"node003\"}},\n        {\"id\": \"node003\",\"name\": \"Node003\"}\n    ]\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/subflow/flow_subflow_002.json",
    "content": "{    \"id\": \"subflow_test_002\",\n    \"name\": \"Sub Flow Test 002\",\n    \"nodes\": [\n        {\"id\": \"node001\",\"name\": \"Node001\",\"start\": true,\"post\": {\"to\": \"node002\"}},\n        {\"id\": \"node002\",\"name\": \"Node002\",\"action\": {\"flowId\":\"subflow2_node002\", \"startNodeId\":\"node002_02\"},\"post\": {\"to\": \"node003\"}},\n        {\"id\": \"node003\",\"name\": \"Node003\"}\n    ]\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/subflow/flow_subflow_002_01.json",
    "content": "{\"id\":\"subflow2_node002\",\n          \"nodes\":[\n          {\"id\": \"node002_01\",\"name\": \"Node002_01\",\"start\": true,\"post\": {\"to\": \"node002_02\"}},\n          {\"id\": \"node002_02\",\"name\": \"Node002_02\"}\n          ]\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/subflow/flow_subflow_003.json",
    "content": "{    \"id\": \"subflow_test_003\",\n    \"name\": \"Sub Flow Test 003\",\n    \"nodes\": [\n        {\"id\": \"node001\",\"name\": \"Node001\",\"start\": true,\"post\": {\"to\": \"node002\"}},\n        {\"id\": \"node002\",\"name\": \"Node002\",\"action\": {\"createExp\":\"new com.jd.easyflow.flow.cases.subflow.TestInvokeSubFlowNodeAction()\"},\"post\": {\"to\": \"node003\"}, \n        \"properties\":{\n            \"subFlowId\":\"subflow3_node002\"\n        }},\n        {\"id\": \"node003\",\"name\": \"Node003\"}\n    ]\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/cases/subflow/flow_subflow_003_01.json",
    "content": "{\"id\":\"subflow3_node002\",\n          \"nodes\":[\n          {\"id\": \"node002_01\",\"name\": \"Node002_01\",\"start\": true,\"post\": {\"to\": \"node002_02\"}},\n          {\"id\": \"node002_02\",\"name\": \"Node002_02\"}\n          ]\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/flow/quickstart/quickstart_001.json",
    "content": "{    \"id\": \"quickstart_001\",\n    \"name\": \"Quick Start 001\",\n    \"nodes\": [\n        {\"id\": \"node001\",\"name\": \"Node001\",\"action\": {\"createExp\": \"new com.jd.easyflow.flow.quickstart.QuickStart001Node01Action()\"},\"start\": true,\"post\": {\"to\": \"node002\"}},\n        {\"id\": \"node002\",\"name\": \"Node002\",\"action\": {\"createExp\": \"new com.jd.easyflow.flow.quickstart.QuickStart002Node01Action()\"},\"post\": {\"to\": \"node003\"}},\n        {\"id\": \"node003\",\"name\": \"Node003\",\"action\": {\"createExp\": \"new com.jd.easyflow.flow.quickstart.QuickStart003Node01Action()\"}}\n    ]\n}"
  },
  {
    "path": "easyflow-flow/src/test/resources/logback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<configuration scan=\"true\">\n    <property name=\"APP\" value=\"flow\"/>\n    <property name=\"LOG_HOME\" value=\"/export/log/${APP}\"/>\n    <appender name=\"CONSOLE\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%d{yy-MM-dd.HH:mm:ss.SSS} [%-16t] %-5p %-22c{0} - %m%n</pattern>\n        </encoder>\n    </appender>\n    <root level=\"INFO\">\n        <appender-ref ref=\"CONSOLE\"/>\n    </root>\n</configuration>\n"
  },
  {
    "path": "easyflow-flow-bpmn/BPMNDesigner.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n<meta charset=\"UTF-8\" />\n<title>EasyFlow-BPMN Designer</title>\n\n<!-- required modeler styles -->\n<link rel=\"stylesheet\" href=\"./static/plugins/fontawesome/css/all.css\">\n<link rel=\"stylesheet\" href=\"./static/plugins/bpmnjs/assets/diagram-js.css\">\n<link rel=\"stylesheet\" href=\"./static/plugins/bpmnjs/assets/bpmn-js.css\">\n<link rel=\"stylesheet\"\n\thref=\"./static/plugins/bpmnjs/assets/bpmn-font/css/bpmn.css\">\n<link rel=\"stylesheet\" href=\"./static/plugins/bootstrap/css/bootstrap.css\" />\n<link rel=\"stylesheet\" href=\"./static/plugins/bootstrap-multiselect/css/bootstrap-multiselect.css\" />\n<link rel=\"stylesheet\" href=\"./static/plugins/std-common/common.css\" />\n<link rel=\"stylesheet\" href=\"./static/plugins/flow/flow.css\" />\n<style>\nbody {margin-top: 5px}\n.j-bpmn-panel-normal {\nheight: 600px}\n</style>\n</head>\n\n<body>\n<div class=\"container-fluid\">\n<div id=\"flowControl\">\n</div>\n\n</div>\n</body>\n<script>\n//window.jLocale=\"en_US\";\n</script>\n<script src=\"./static/plugins/bpmnjs/bpmn-navigated-viewer.development.js\"></script>\n<script src=\"./static/plugins/bpmnjs/bpmn-modeler.development.js\"></script>\n<script src=\"./static/plugins/jquery/jquery-3.6.0.js\"></script>\n<script src=\"./static/plugins/jquery-validation/jquery.validate.js\"></script>\n<script src=\"./static/plugins/bootstrap/js/bootstrap.bundle.js\"></script>\n<script src=\"./static/plugins/bootstrap-multiselect/js/bootstrap-multiselect.js\"></script>\n<script src=\"./static/plugins/std-common/messages_default.js\"></script>\n<script src=\"./static/plugins/std-common/messages_zh.js\"></script>\n<script src=\"./static/plugins/std-common/common.js\"></script>\n<script src=\"./static/plugins/flow/bpmn.js\"></script>\n<script src=\"./static/plugins/flow/flow.js\"></script>\n<script>\nwindow.bpmn2JsonUrl = null;\nnew J.FlowControl({$container: $(\"#flowControl\")}).render();\n</script>\n</html>"
  },
  {
    "path": "easyflow-flow-bpmn/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n    xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>easyflow-parent</artifactId>\n        <groupId>com.jd.easyflow</groupId>\n        <version>1.7.3</version>\n    </parent>\n    <artifactId>easyflow-flow-bpmn</artifactId>\n    <name>easyflow-flow-bpmn</name>\n    <packaging>jar</packaging>\n    <properties>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>com.jd.easyflow</groupId>\n            <artifactId>easyflow-flow</artifactId>\n        </dependency>  \n        <dependency>\n            <groupId>com.jd.easyflow</groupId>\n            <artifactId>easyflow-flow-extension</artifactId>\n            <scope>test</scope>\n        </dependency>           \n\t\t<dependency>\n\t\t\t<groupId>org.activiti</groupId>\n\t\t\t<artifactId>activiti-bpmn-converter</artifactId>\n\t\t</dependency>\n        <!--other -->\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-classic</artifactId>\n            <scope>test</scope>\n        </dependency>        \n        <dependency>\n            <groupId>junit</groupId>\n            <artifactId>junit</artifactId>\n            <scope>test</scope>\n        </dependency>\t\t\n    </dependencies>\n\n</project>"
  },
  {
    "path": "easyflow-flow-bpmn/src/main/java/.gitkeep",
    "content": ""
  },
  {
    "path": "easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/BpmnFlowParser.java",
    "content": "package com.jd.easyflow.flow.bpmn;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.util.List;\nimport java.util.Map;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.bpmn.converter.BpmnConverter;\nimport com.jd.easyflow.flow.exception.FlowException;\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.flow.model.parser.FlowParserImpl;\nimport com.jd.easyflow.flow.model.parser.param.FlowParseParam;\nimport com.jd.easyflow.flow.util.FlowIOUtil;\nimport com.jd.easyflow.flow.util.JsonUtil;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class BpmnFlowParser extends FlowParserImpl {\n\n    public static final Logger logger = LoggerFactory.getLogger(BpmnFlowParser.class);\n\n    private static final String FLOW_BPMN_STRING_KEY = \"_flow_bpmn_string\";\n\n    private static final String DEFAULT_FLOW_PRETTY_CONFIG_PATH = \"/pretty/pretty-flow.json\";\n\n    private static final String XML_PREFIX = \"<?xml\";\n\n    private Map<String, Object> flowPrettyConfig;\n\n    private String flowPrettyConfigPath;\n\n    public BpmnFlowParser() {\n        init();\n    }\n\n    public void init() {\n        if (flowPrettyConfigPath == null) {\n            flowPrettyConfigPath = DEFAULT_FLOW_PRETTY_CONFIG_PATH;\n        }\n        String flowPrettyConfStr = null;\n        InputStream inputStream = BpmnFlowParser.class.getResourceAsStream(flowPrettyConfigPath);\n        if (inputStream == null) {\n            flowPrettyConfStr = BpmnConverter.defaultFlowPrettyConfigStr;\n        } else {\n            try {\n                flowPrettyConfStr = FlowIOUtil.toString(inputStream);\n                inputStream.close();\n            } catch (IOException e) {\n                throw new FlowException(\n                        \"Pretty conf parse exception, path:\" + flowPrettyConfigPath + \" message:\" + e.getMessage(), e);\n            }\n        }\n        flowPrettyConfig = JsonUtil.parseObject(flowPrettyConfStr, Map.class);\n    }\n\n    @Override\n    public List<Flow> parse(FlowParseParam param) {\n        String data = param.getStringDefinition();\n        if (data != null && data.trim().startsWith(XML_PREFIX)) {\n            logger.info(\"BPMN Definition:\\n\" + data);\n            String easyFlowDef = BpmnConverter.convert(data, flowPrettyConfig);\n            logger.info(\"EasyFlow Definition:\\n\" + easyFlowDef);\n            param.setStringDefinition(easyFlowDef);\n            List<Flow> flowList = super.parse(param);\n            flowList.get(0).setProperty(FLOW_BPMN_STRING_KEY, data);\n            return flowList;\n        } else {\n            return super.parse(param);\n        }\n    }\n\n    /**\n     * \n     * BPMN Model to string\n     *\n     * @param flow\n     * @return\n     */\n    public static String bpmnStringify(Flow flow) {\n        if (flow.getProperty(FLOW_BPMN_STRING_KEY) != null) {\n            return flow.getProperty(FLOW_BPMN_STRING_KEY);\n        }\n        return null;\n    }\n\n    public String getFlowPrettyConfigPath() {\n        return flowPrettyConfigPath;\n    }\n\n    public void setFlowPrettyConfigPath(String flowPrettyConfigPath) {\n        this.flowPrettyConfigPath = flowPrettyConfigPath;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/BaseFlowNodeConverter.java",
    "content": "package com.jd.easyflow.flow.bpmn.converter;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport org.activiti.bpmn.model.Activity;\nimport org.activiti.bpmn.model.BpmnModel;\nimport org.activiti.bpmn.model.ExtensionElement;\nimport org.activiti.bpmn.model.FlowNode;\nimport org.activiti.bpmn.model.Gateway;\nimport org.activiti.bpmn.model.SequenceFlow;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.bpmn.converter.util.BpmnXmlConstants;\nimport com.jd.easyflow.flow.bpmn.converter.util.ConvertUtil;\nimport com.jd.easyflow.flow.exception.FlowException;\nimport com.jd.easyflow.flow.model.definition.DefConstants;\nimport com.jd.easyflow.flow.model.post.ConditionalNodePostHandler;\nimport com.jd.easyflow.flow.util.FlowStringUtil;\nimport com.jd.easyflow.flow.util.JsonUtil;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class BaseFlowNodeConverter implements FlowNodeConverter {\n    \n    private static final Logger logger = LoggerFactory.getLogger(BaseFlowNodeConverter.class);\n    \n    private static final String CONDITION_TYPE_CREATE_EXP = \"createExp\";\n    private static final String CONDITION_TYPE_CREATE_EXP_PREFIX = CONDITION_TYPE_CREATE_EXP + \":\";\n    \n    \n\n    @Override\n    public Map<String, Object> convert(FlowNode flowNode, BpmnModel bpmnModel, Map<String, Object> flowDef) {\n        Map<String, Object> node = new HashMap<>();\n        // ID and Name\n        node.put(DefConstants.COMMON_PROP_ID, flowNode.getId());\n        if (flowNode.getName() != null && flowNode.getName().length() > 0) {\n            node.put(DefConstants.COMMON_PROP_NAME, flowNode.getName());\n        }\n        // Properties\n        Map<String, Object> properties = null;\n        Map<String, List<ExtensionElement>> extensionElementMap = flowNode.getExtensionElements();\n        if (extensionElementMap != null && extensionElementMap.containsKey(BpmnXmlConstants.PROPERTIES)) {\n            properties = ConvertUtil.getMapValue(node, DefConstants.COMMON_PROP_PROPERTIES);\n            ExtensionElement element = extensionElementMap.get(BpmnXmlConstants.PROPERTIES).get(0);\n            String elementText = element.getElementText();\n            try {\n                Map<String, Object> map = JsonUtil.parseObject(elementText, Map.class);\n                properties.putAll(map);\n            } catch (Exception e) {\n                throw new FlowException(\"Property JSON parse error, Node:\" + flowNode.getId() + \", Property:\" + elementText + \".\" + e.getMessage(), e);\n            }\n        }\n        // Start\n        if (extensionElementMap != null && extensionElementMap.containsKey(BpmnXmlConstants.START)) {\n            ExtensionElement element = extensionElementMap.get(BpmnXmlConstants.START).get(0);\n            String elementText = element.getElementText();\n            node.put(DefConstants.NODE_PROP_START, JsonUtil.parseObject(elementText, Boolean.class));\n        }\n        // Pre\n        // self first\n        if (extensionElementMap != null && extensionElementMap.containsKey(BpmnXmlConstants.PRE)) {\n            ExtensionElement element = extensionElementMap.get(BpmnXmlConstants.PRE).get(0);\n            String elementText = element.getElementText();\n            node.put(DefConstants.NODE_PROP_PRE, JsonUtil.parseObject(elementText, Map.class));\n        }           \n        // Action\n        // self first\n        if (extensionElementMap != null && extensionElementMap.containsKey(BpmnXmlConstants.ACTION)) {\n            ExtensionElement element = extensionElementMap.get(BpmnXmlConstants.ACTION).get(0);\n            String elementText = element.getElementText();\n            node.put(DefConstants.NODE_PROP_ACTION, JsonUtil.parseObject(elementText, Map.class));\n        }        \n        // Post\n        // self first.\n        if (extensionElementMap != null && extensionElementMap.containsKey(BpmnXmlConstants.POST)) {\n            ExtensionElement element = extensionElementMap.get(BpmnXmlConstants.POST).get(0);\n            String elementText = element.getElementText();\n            node.put(DefConstants.NODE_PROP_POST, JsonUtil.parseObject(elementText, Map.class));\n        }  else {\n            String defaultFlow = null;\n            if (flowNode instanceof Activity) {\n                defaultFlow = ((Activity) flowNode).getDefaultFlow();\n            } else if (flowNode instanceof Gateway) {\n                defaultFlow = ((Gateway) flowNode).getDefaultFlow();\n            }\n            List<SequenceFlow> sequenceFlowList = flowNode.getOutgoingFlows();\n            if (sequenceFlowList.size() == 1) {\n                Map<String, Object> post = new HashMap<>();\n                node.put(DefConstants.NODE_PROP_POST, post);\n                SequenceFlow sequenceFlow = sequenceFlowList.get(0);\n                String conditionExp = sequenceFlow.getConditionExpression();\n                if (FlowStringUtil.isNotEmpty(conditionExp)) {\n                    conditionExp = conditionExp.trim();\n                    if (conditionExp.startsWith(CONDITION_TYPE_CREATE_EXP_PREFIX)) {\n                        Map<String, Object> condition = new HashMap<String, Object>();\n                        condition.put(CONDITION_TYPE_CREATE_EXP, conditionExp.substring(CONDITION_TYPE_CREATE_EXP_PREFIX.length()));\n                        post.put(DefConstants.NODE_POST_PROP_WHEN, condition);\n                    } else {\n                        post.put(DefConstants.NODE_POST_PROP_WHEN, conditionExp);\n                    }\n                }\n                post.put(DefConstants.NODE_POST_PROP_TO, sequenceFlow.getTargetRef());\n            } else if (sequenceFlowList.size() > 1) {\n                Map<String, Object> post = new HashMap<>();\n                node.put(DefConstants.NODE_PROP_POST, post);\n                List<Map<String, Object>> conditionList = new ArrayList<>();\n                post.put(DefConstants.NODE_POST_PROP_CONDITIONS, conditionList);\n                for (SequenceFlow sequenceFlow : sequenceFlowList) {\n                    if (sequenceFlow.getId().equals(defaultFlow)) {\n                        post.put(DefConstants.NODE_POST_PROP_DEFAULT_TO, sequenceFlow.getTargetRef());\n                    } else {\n                        Map<String, Object> condition = new HashMap<>();\n                        String conditionExp = sequenceFlow.getConditionExpression();\n                        if (FlowStringUtil.isNotEmpty(conditionExp)) {\n                            conditionExp = conditionExp.trim();\n                            if (conditionExp.startsWith(CONDITION_TYPE_CREATE_EXP_PREFIX)) {\n                                Map<String, Object> conditionInfo = new HashMap<String, Object>();\n                                conditionInfo.put(CONDITION_TYPE_CREATE_EXP, conditionExp.substring(CONDITION_TYPE_CREATE_EXP_PREFIX.length()));\n                                condition.put(DefConstants.NODE_POST_PROP_WHEN, conditionInfo);\n                            } else {\n                                condition.put(DefConstants.NODE_POST_PROP_WHEN, conditionExp);\n                            }\n                            \n                        }\n                        condition.put(DefConstants.NODE_POST_PROP_TO, sequenceFlow.getTargetRef());\n                        conditionList.add(condition);\n                    }\n                }\n    \n                // conditionType\n                String conditionType = ConditionalNodePostHandler.INCLUSIVE_TYPE;\n                if (extensionElementMap != null && extensionElementMap.containsKey(BpmnXmlConstants.CONDITION_TYPE)) {\n                    conditionType = (String) (extensionElementMap.get(BpmnXmlConstants.CONDITION_TYPE)).get(0)\n                            .getElementText();\n                }\n                if (!ConditionalNodePostHandler.EXCLUSIVE_TYPE.equals(conditionType)) {\n                    post.put(DefConstants.NODE_POST_PROP_CONDITION_TYPE, conditionType);\n                }\n            }\n        }\n        return node;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/BpmnConverter.java",
    "content": "package com.jd.easyflow.flow.bpmn.converter;\n\nimport java.io.ByteArrayInputStream;\nimport java.io.InputStream;\nimport java.io.UnsupportedEncodingException;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Objects;\n\nimport javax.xml.stream.FactoryConfigurationError;\nimport javax.xml.stream.XMLInputFactory;\nimport javax.xml.stream.XMLStreamException;\nimport javax.xml.stream.XMLStreamReader;\n\nimport org.activiti.bpmn.converter.BpmnXMLConverter;\nimport org.activiti.bpmn.model.Activity;\nimport org.activiti.bpmn.model.AdhocSubProcess;\nimport org.activiti.bpmn.model.Association;\nimport org.activiti.bpmn.model.BoundaryEvent;\nimport org.activiti.bpmn.model.BpmnModel;\nimport org.activiti.bpmn.model.BusinessRuleTask;\nimport org.activiti.bpmn.model.CallActivity;\nimport org.activiti.bpmn.model.CompensateEventDefinition;\nimport org.activiti.bpmn.model.ComplexGateway;\nimport org.activiti.bpmn.model.DataObject;\nimport org.activiti.bpmn.model.DataStoreReference;\nimport org.activiti.bpmn.model.EndEvent;\nimport org.activiti.bpmn.model.EventDefinition;\nimport org.activiti.bpmn.model.EventGateway;\nimport org.activiti.bpmn.model.EventSubProcess;\nimport org.activiti.bpmn.model.ExclusiveGateway;\nimport org.activiti.bpmn.model.ExtensionElement;\nimport org.activiti.bpmn.model.FlowElement;\nimport org.activiti.bpmn.model.FlowNode;\nimport org.activiti.bpmn.model.InclusiveGateway;\nimport org.activiti.bpmn.model.IntermediateCatchEvent;\nimport org.activiti.bpmn.model.ManualTask;\nimport org.activiti.bpmn.model.ParallelGateway;\nimport org.activiti.bpmn.model.Process;\nimport org.activiti.bpmn.model.ReceiveTask;\nimport org.activiti.bpmn.model.ScriptTask;\nimport org.activiti.bpmn.model.SendTask;\nimport org.activiti.bpmn.model.SequenceFlow;\nimport org.activiti.bpmn.model.ServiceTask;\nimport org.activiti.bpmn.model.StartEvent;\nimport org.activiti.bpmn.model.SubProcess;\nimport org.activiti.bpmn.model.Task;\nimport org.activiti.bpmn.model.ThrowEvent;\nimport org.activiti.bpmn.model.Transaction;\nimport org.activiti.bpmn.model.UserTask;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.bpmn.converter.activity.AdhocSubProcessConverter;\nimport com.jd.easyflow.flow.bpmn.converter.activity.BusinessRuleTaskConverter;\nimport com.jd.easyflow.flow.bpmn.converter.activity.CallActivityConverter;\nimport com.jd.easyflow.flow.bpmn.converter.activity.EventSubProcessConverter;\nimport com.jd.easyflow.flow.bpmn.converter.activity.ManualTaskConverter;\nimport com.jd.easyflow.flow.bpmn.converter.activity.ReceiveTaskConverter;\nimport com.jd.easyflow.flow.bpmn.converter.activity.ScriptTaskConverter;\nimport com.jd.easyflow.flow.bpmn.converter.activity.SendTaskConverter;\nimport com.jd.easyflow.flow.bpmn.converter.activity.ServiceTaskConverter;\nimport com.jd.easyflow.flow.bpmn.converter.activity.SubProcessConverter;\nimport com.jd.easyflow.flow.bpmn.converter.activity.TaskConverter;\nimport com.jd.easyflow.flow.bpmn.converter.activity.TransactionConverter;\nimport com.jd.easyflow.flow.bpmn.converter.activity.UserTaskConverter;\nimport com.jd.easyflow.flow.bpmn.converter.event.EndEventConverter;\nimport com.jd.easyflow.flow.bpmn.converter.event.IntermediateCatchEventConverter;\nimport com.jd.easyflow.flow.bpmn.converter.event.StartEventConverter;\nimport com.jd.easyflow.flow.bpmn.converter.event.ThrowEventConverter;\nimport com.jd.easyflow.flow.bpmn.converter.gateway.ComplexGatewayConverter;\nimport com.jd.easyflow.flow.bpmn.converter.gateway.EventGatewayConverter;\nimport com.jd.easyflow.flow.bpmn.converter.gateway.ExclusiveGatewayConverter;\nimport com.jd.easyflow.flow.bpmn.converter.gateway.InclusiveGatewayConverter;\nimport com.jd.easyflow.flow.bpmn.converter.gateway.ParallelGatewayConverter;\nimport com.jd.easyflow.flow.bpmn.converter.util.BpmnXmlConstants;\nimport com.jd.easyflow.flow.bpmn.converter.util.ConvertUtil;\nimport com.jd.easyflow.flow.exception.FlowException;\nimport com.jd.easyflow.flow.model.definition.DefConstants;\nimport com.jd.easyflow.flow.util.FlowStringUtil;\nimport com.jd.easyflow.flow.util.JsonPrettyHelper;\nimport com.jd.easyflow.flow.util.JsonUtil;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class BpmnConverter {\n    \n    private static final Logger logger = LoggerFactory.getLogger(BpmnConverter.class);\n\n    private static Map<Class, FlowNodeConverter> flowNodeConverterMap = new HashMap<>();\n    \n    private static String defaultFlowPrettyConfigPath = \"/pretty/pretty-flow.json\";\n    \n    public static String defaultFlowPrettyConfigStr = \"{\\\"endNewLine\\\":true,\\\"subList\\\":[{\\\"newLine\\\":true,\\\"subList\\\":[{\\\"key\\\":\\\"id\\\"},{\\\"key\\\":\\\"name\\\",\\\"newLine\\\":true},{\\\"key\\\":\\\"pre\\\",\\\"newLine\\\":true},{\\\"key\\\":\\\"nodes\\\",\\\"newLine\\\":true,\\\"endNewLine\\\":true,\\\"subList\\\":[{\\\"newLine\\\":true,\\\"subList\\\":[{\\\"key\\\":\\\"id\\\"},{\\\"key\\\":\\\"name\\\"},{\\\"key\\\":\\\"start\\\"},{\\\"key\\\":\\\"pre\\\"},{\\\"key\\\":\\\"action\\\",\\\"subList\\\":[{\\\"key\\\":\\\"flow\\\",\\\"subList\\\":[{\\\"key\\\":\\\"id\\\"},{\\\"key\\\":\\\"name\\\",\\\"newLine\\\":true},{\\\"key\\\":\\\"pre\\\",\\\"newLine\\\":true},{\\\"key\\\":\\\"nodes\\\",\\\"newLine\\\":true,\\\"endNewLine\\\":true,\\\"subList\\\":[{\\\"newLine\\\":true,\\\"subList\\\":[{\\\"key\\\":\\\"id\\\"},{\\\"key\\\":\\\"name\\\"},{\\\"key\\\":\\\"start\\\"},{\\\"key\\\":\\\"pre\\\"},{\\\"key\\\":\\\"action\\\"},{\\\"key\\\":\\\"post\\\"},{\\\"key\\\":\\\"properties\\\"}]}]},{\\\"key\\\":\\\"post\\\",\\\"newLine\\\":true}]}]},{\\\"key\\\":\\\"post\\\",\\\"subList\\\":[{\\\"key\\\":\\\"when\\\"},{\\\"key\\\":\\\"to\\\"},{\\\"key\\\":\\\"conditions\\\",\\\"subList\\\":[{\\\"key\\\":\\\"default\\\",\\\"subList\\\":[{\\\"key\\\":\\\"when\\\"},{\\\"key\\\":\\\"to\\\"}]}]}]},{\\\"key\\\":\\\"properties\\\",\\\"default\\\":{\\\"newLine\\\":true,\\\"endNewLine\\\":true}}]}]},{\\\"key\\\":\\\"post\\\",\\\"newLine\\\":true},{\\\"key\\\":\\\"listeners\\\",\\\"newLine\\\":true,\\\"endNewLine\\\":true,\\\"subList\\\":[{\\\"newLine\\\":true}]},{\\\"key\\\":\\\"filters\\\",\\\"newLine\\\":true,\\\"endNewLine\\\":true,\\\"subList\\\":[{\\\"newLine\\\":true}]},{\\\"key\\\":\\\"nodeFilters\\\",\\\"newLine\\\":true,\\\"endNewLine\\\":true,\\\"subList\\\":[{\\\"newLine\\\":true}]},{\\\"key\\\":\\\"nodePreHandlerFilters\\\",\\\"newLine\\\":true,\\\"endNewLine\\\":true,\\\"subList\\\":[{\\\"newLine\\\":true}]},{\\\"key\\\":\\\"nodeActionFilters\\\",\\\"newLine\\\":true,\\\"endNewLine\\\":true,\\\"subList\\\":[{\\\"newLine\\\":true}]},{\\\"key\\\":\\\"nodePostHandlerFilters\\\",\\\"newLine\\\":true,\\\"endNewLine\\\":true,\\\"subList\\\":[{\\\"newLine\\\":true}]},{\\\"key\\\":\\\"properties\\\",\\\"newLine\\\":true,\\\"endNewLine\\\":true,\\\"subList\\\":[{\\\"keyType\\\":\\\"OTHER\\\",\\\"newLine\\\":true}],\\\"default\\\":{\\\"newLine\\\":true,\\\"endNewLine\\\":true}},{\\\"key\\\":\\\"parseListeners\\\",\\\"newLine\\\":true,\\\"endNewLine\\\":true,\\\"subList\\\":[{\\\"newLine\\\":true}]},{\\\"keyType\\\":\\\"OTHER\\\",\\\"default\\\":{\\\"newLine\\\":true,\\\"endNewLine\\\":true}}]},{\\\"key\\\":\\\"id\\\"},{\\\"key\\\":\\\"name\\\",\\\"newLine\\\":true},{\\\"key\\\":\\\"pre\\\",\\\"newLine\\\":true},{\\\"key\\\":\\\"nodes\\\",\\\"newLine\\\":true,\\\"endNewLine\\\":true,\\\"subList\\\":[{\\\"newLine\\\":true,\\\"subList\\\":[{\\\"key\\\":\\\"id\\\"},{\\\"key\\\":\\\"name\\\"},{\\\"key\\\":\\\"start\\\"},{\\\"key\\\":\\\"pre\\\"},{\\\"key\\\":\\\"action\\\",\\\"subList\\\":[{\\\"key\\\":\\\"flow\\\",\\\"subList\\\":[{\\\"key\\\":\\\"id\\\"},{\\\"key\\\":\\\"name\\\",\\\"newLine\\\":true},{\\\"key\\\":\\\"pre\\\",\\\"newLine\\\":true},{\\\"key\\\":\\\"nodes\\\",\\\"newLine\\\":true,\\\"endNewLine\\\":true,\\\"subList\\\":[{\\\"newLine\\\":true,\\\"subList\\\":[{\\\"key\\\":\\\"id\\\"},{\\\"key\\\":\\\"name\\\"},{\\\"key\\\":\\\"start\\\"},{\\\"key\\\":\\\"pre\\\"},{\\\"key\\\":\\\"action\\\"},{\\\"key\\\":\\\"post\\\"},{\\\"key\\\":\\\"properties\\\"}]}]},{\\\"key\\\":\\\"post\\\",\\\"newLine\\\":true}]}]},{\\\"key\\\":\\\"post\\\",\\\"subList\\\":[{\\\"key\\\":\\\"when\\\"},{\\\"key\\\":\\\"to\\\"},{\\\"key\\\":\\\"conditions\\\",\\\"subList\\\":[{\\\"subList\\\":[{\\\"key\\\":\\\"when\\\"},{\\\"key\\\":\\\"to\\\"}]}]},{\\\"key\\\":\\\"defaultTo\\\"}]},{\\\"key\\\":\\\"properties\\\",\\\"default\\\":{\\\"newLine\\\":true,\\\"endNewLine\\\":true}}]}]},{\\\"key\\\":\\\"post\\\",\\\"newLine\\\":true},{\\\"key\\\":\\\"listeners\\\",\\\"newLine\\\":true,\\\"endNewLine\\\":true,\\\"subList\\\":[{\\\"newLine\\\":true}]},{\\\"key\\\":\\\"filters\\\",\\\"newLine\\\":true,\\\"endNewLine\\\":true,\\\"subList\\\":[{\\\"newLine\\\":true}]},{\\\"key\\\":\\\"nodeFilters\\\",\\\"newLine\\\":true,\\\"endNewLine\\\":true,\\\"subList\\\":[{\\\"newLine\\\":true}]},{\\\"key\\\":\\\"nodePreHandlerFilters\\\",\\\"newLine\\\":true,\\\"endNewLine\\\":true,\\\"subList\\\":[{\\\"newLine\\\":true}]},{\\\"key\\\":\\\"nodeActionFilters\\\",\\\"newLine\\\":true,\\\"endNewLine\\\":true,\\\"subList\\\":[{\\\"newLine\\\":true}]},{\\\"key\\\":\\\"nodePostHandlerFilters\\\",\\\"newLine\\\":true,\\\"endNewLine\\\":true,\\\"subList\\\":[{\\\"newLine\\\":true}]},{\\\"key\\\":\\\"properties\\\",\\\"newLine\\\":true,\\\"endNewLine\\\":true,\\\"subList\\\":[{\\\"keyType\\\":\\\"OTHER\\\",\\\"newLine\\\":true}],\\\"default\\\":{\\\"newLine\\\":true,\\\"endNewLine\\\":true}},{\\\"key\\\":\\\"parseListeners\\\",\\\"newLine\\\":true,\\\"endNewLine\\\":true,\\\"subList\\\":[{\\\"newLine\\\":true}]},{\\\"keyType\\\":\\\"OTHER\\\",\\\"default\\\":{\\\"newLine\\\":true,\\\"endNewLine\\\":true}}]}\";\n    \n    private static Map<String, Object> defaultFlowPrettyConfig;\n\n    static {\n        flowNodeConverterMap.put(StartEvent.class, new StartEventConverter());\n        flowNodeConverterMap.put(IntermediateCatchEvent.class, new IntermediateCatchEventConverter());\n        flowNodeConverterMap.put(ThrowEvent.class, new ThrowEventConverter());\n        flowNodeConverterMap.put(EndEvent.class, new EndEventConverter());\n\n        flowNodeConverterMap.put(ScriptTask.class, new ScriptTaskConverter());\n        flowNodeConverterMap.put(UserTask.class, new UserTaskConverter());\n        flowNodeConverterMap.put(ReceiveTask.class, new ReceiveTaskConverter());\n        flowNodeConverterMap.put(SubProcess.class, new SubProcessConverter());\n        flowNodeConverterMap.put(CallActivity.class, new CallActivityConverter());\n        flowNodeConverterMap.put(Transaction.class, new TransactionConverter());\n        flowNodeConverterMap.put(AdhocSubProcess.class, new AdhocSubProcessConverter());\n        flowNodeConverterMap.put(EventSubProcess.class, new EventSubProcessConverter());\n        flowNodeConverterMap.put(BusinessRuleTask.class, new BusinessRuleTaskConverter());\n        flowNodeConverterMap.put(ManualTask.class, new ManualTaskConverter());\n        flowNodeConverterMap.put(SendTask.class, new SendTaskConverter());\n        flowNodeConverterMap.put(ServiceTask.class, new ServiceTaskConverter());\n        flowNodeConverterMap.put(Task.class, new TaskConverter());\n\n        flowNodeConverterMap.put(ExclusiveGateway.class, new ExclusiveGatewayConverter());\n        flowNodeConverterMap.put(InclusiveGateway.class, new InclusiveGatewayConverter());\n        flowNodeConverterMap.put(ParallelGateway.class, new ParallelGatewayConverter());\n        flowNodeConverterMap.put(ComplexGateway.class, new ComplexGatewayConverter());\n        flowNodeConverterMap.put(EventGateway.class, new EventGatewayConverter());\n        \n        defaultFlowPrettyConfig = JsonUtil.parseObject(defaultFlowPrettyConfigStr, Map.class);\n        //Steps: Modify pretty-flow.json, then use JSONUtil to convert to string.\n//        try {\n//            InputStream inputStream = BpmnFlowParser.class.getResourceAsStream(defaultFlowPrettyConfigPath);\n//            if (inputStream == null) {\n//                logger.warn(\"No pretty config:\" + defaultFlowPrettyConfigPath + \",JSON format without prettying\");\n//            }\n//            String flowPrettyConf = IOUtils.toString(inputStream);\n//            defaultFlowPrettyConfig = JsonUtil.parseObject(flowPrettyConf, Map.class);\n//        } catch (IOException e) {\n//            throw new FlowException(\"Pretty config parse error,\" + e.getMessage(), e);\n//        }\n    }\n    \n    public static String convert(String bpmnXmlData) {\n        return convert(bpmnXmlData, defaultFlowPrettyConfig);\n    }\n    \n    /**\n     * Convert BPMN Model to EasyFlow Model.\n     * \n     * @param bpmnXmlData\n     * @return\n     */\n    public static String convert(String bpmnXmlData, Map<String, Object> flowPrettyConfig) {\n        List<Map<String, Object>> model;\n        try {\n            model = convert(new ByteArrayInputStream(bpmnXmlData.getBytes(\"UTF-8\")));\n        } catch (UnsupportedEncodingException e) {\n            throw new FlowException(e);\n        }\n        if (flowPrettyConfig == null || flowPrettyConfig.isEmpty()) {\n            return JsonUtil.toJsonString(model.size() == 1 ? model.get(0) : model);\n        } else {\n            return JsonPrettyHelper.pretty(model.size() == 1 ? model.get(0) : model, flowPrettyConfig);\n        }\n    }\n\n    /**\n     * Convert BPMN Model to EasyFlow Model.\n     * \n     * @param inputStream\n     * @return\n     */\n    public static List<Map<String, Object>> convert(InputStream inputStream) {\n        // Get xml data.\n        XMLStreamReader reader = null;\n        try {\n            XMLInputFactory xmlInputFactory = XMLInputFactory.newFactory();\n            xmlInputFactory.setProperty(\"javax.xml.stream.isCoalescing\", true);\n            reader = xmlInputFactory.createXMLStreamReader(inputStream);\n        } catch (XMLStreamException | FactoryConfigurationError e) {\n            throw new FlowException(\"BPMN Parse Exception\", e);\n        }\n        // Convert to java BPMN model leveraging the activiti ability.\n        BpmnXMLConverter bpmnXmlConverter = new BpmnXMLConverter();\n        BpmnModel bpmnModel = bpmnXmlConverter.convertToBpmnModel(reader);\n        // Convert java BPMN model to EasyFlow model.\n        List<Map<String, Object>> flowDefList = new ArrayList<>();\n        for (Process process : bpmnModel.getProcesses()) {\n            Map<String, Object> flowDef = new HashMap<String, Object>();\n            convertProcess(process, bpmnModel, flowDef);\n            flowDefList.add(flowDef);\n        }\n        \n        return flowDefList;\n    }\n\n    /**\n     * Convert process definition.\n     * \n     * @param process\n     * @param bpmnModel\n     * @param flowDef\n     */\n    private static void convertProcess(Process process, BpmnModel bpmnModel, Map<String, Object> flowDef) {\n        // ID,name and properties\n        String processId = process.getId();\n        String processName = process.getName();\n        flowDef.put(DefConstants.COMMON_PROP_ID, processId);\n        if (FlowStringUtil.isNotEmpty(processName)) {\n            flowDef.put(DefConstants.COMMON_PROP_NAME, processName);\n        }\n        Map<String, List<ExtensionElement>> extensionElementMap = process.getExtensionElements();\n        \n        // flow pre handler\n        if (extensionElementMap != null && extensionElementMap.containsKey(BpmnXmlConstants.PRE)) {\n            ExtensionElement element = extensionElementMap.get(BpmnXmlConstants.PRE).get(0);\n            String elementText = element.getElementText();\n            Object preHandlerDef = JsonUtil.parseObject(elementText, Map.class);\n            flowDef.put(DefConstants.FLOW_PROP_PRE, preHandlerDef);\n        }\n\n        // Process flow element, convert Gateway,Event,Activity to Node.\n        List<Map<String, Object>> nodeList = new ArrayList<>();\n        flowDef.put(DefConstants.FLOW_PROP_NODES, nodeList);\n        List<BoundaryEvent> boundaryEvents = new ArrayList<BoundaryEvent>();\n        Map<String, Map<String, Object>> compensateActionMap = new HashMap<>();\n        for (FlowElement flowElement : process.getFlowElements()) {\n            // Flow element\n            if (flowElement instanceof FlowNode) {\n                if (flowElement instanceof BoundaryEvent) {\n                    boundaryEvents.add((BoundaryEvent) flowElement);\n                    continue;\n                }\n                FlowNodeConverter nodeConverter = flowNodeConverterMap.get(flowElement.getClass());\n                if (nodeConverter == null) {\n                    throw new FlowException(\"Unsupported BPMN element:ID\" + flowElement.getId() + \" TYPE:\"\n                            + flowElement.getClass().getCanonicalName());\n                }\n                Map<String, Object> node = nodeConverter.convert((FlowNode) flowElement, bpmnModel, flowDef);\n                \n                if (flowElement instanceof Activity && ((Activity) flowElement).isForCompensation()) {\n                    compensateActionMap.put((String) node.get(DefConstants.COMMON_PROP_ID), node);\n                } else {\n                    nodeList.add(node);\n                }\n                // Sequence flow\n            } else if (flowElement instanceof SequenceFlow) {\n                continue;\n            } else if (flowElement instanceof DataStoreReference || flowElement instanceof DataObject) {\n                continue;\n            } else {\n                throw new FlowException(\n                        \"Unsupported BPMN element:ID\" + flowElement.getId() + \" TYPE:\" + flowElement.getClass().getCanonicalName());\n            }\n        }\n        \n        // process BoundaryEvent\n        processBoundaryEvent(boundaryEvents, compensateActionMap, nodeList, process);\n\n        // flow post handler\n        if (extensionElementMap != null && extensionElementMap.containsKey(BpmnXmlConstants.POST)) {\n            ExtensionElement element = extensionElementMap.get(BpmnXmlConstants.POST).get(0);\n            String elementText = element.getElementText();\n            Object postHandlerDef = JsonUtil.parseObject(elementText, Map.class);\n            flowDef.put(DefConstants.FLOW_PROP_POST, postHandlerDef);\n        }\n\n        // properties\n        if (extensionElementMap != null && extensionElementMap.containsKey(BpmnXmlConstants.PROPERTIES)) {\n            ExtensionElement element = extensionElementMap.get(BpmnXmlConstants.PROPERTIES).get(0);\n            String elementText = element.getElementText();\n            Map<String, Object> map = JsonUtil.parseObject(elementText, Map.class);\n            flowDef.put(DefConstants.COMMON_PROP_PROPERTIES, map);\n        }\n        // listeners\n        if (extensionElementMap != null && extensionElementMap.containsKey(BpmnXmlConstants.LISTENERS)) {\n            ExtensionElement element = extensionElementMap.get(BpmnXmlConstants.LISTENERS).get(0);\n            String elementText = element.getElementText();\n            List<Object> list = JsonUtil.parseObject(elementText, List.class);\n            flowDef.put(DefConstants.FLOW_PROP_LISTENERS, list);\n        }\n        // filters\n        if (extensionElementMap != null && extensionElementMap.containsKey(BpmnXmlConstants.FILTERS)) {\n            ExtensionElement element = extensionElementMap.get(BpmnXmlConstants.FILTERS).get(0);\n            String elementText = element.getElementText();\n            List<Object> list = JsonUtil.parseObject(elementText, List.class);\n            flowDef.put(DefConstants.FLOW_PROP_FILTERS, list);\n        }\n        // nodeFilters\n        if (extensionElementMap != null && extensionElementMap.containsKey(BpmnXmlConstants.NODE_FILTERS)) {\n            ExtensionElement element = extensionElementMap.get(BpmnXmlConstants.NODE_FILTERS).get(0);\n            String elementText = element.getElementText();\n            List<Object> list = JsonUtil.parseObject(elementText, List.class);\n            flowDef.put(DefConstants.FLOW_PROP_NODE_FILTERS, list);\n        }  \n        // nodePreHandlerFilters\n        if (extensionElementMap != null && extensionElementMap.containsKey(BpmnXmlConstants.NODE_PRE_HANDLER_FILTERS)) {\n            ExtensionElement element = extensionElementMap.get(BpmnXmlConstants.NODE_PRE_HANDLER_FILTERS).get(0);\n            String elementText = element.getElementText();\n            List<Object> list = JsonUtil.parseObject(elementText, List.class);\n            flowDef.put(DefConstants.FLOW_PROP_NODE_PRE_HANDLER_FILTERS, list);\n        }        \n        // nodeActionFilters\n        if (extensionElementMap != null && extensionElementMap.containsKey(BpmnXmlConstants.NODE_ACTION_FILTERS)) {\n            ExtensionElement element = extensionElementMap.get(BpmnXmlConstants.NODE_ACTION_FILTERS).get(0);\n            String elementText = element.getElementText();\n            List<Object> list = JsonUtil.parseObject(elementText, List.class);\n            flowDef.put(DefConstants.FLOW_PROP_NODE_ACTION_FILTERS, list);\n        }\n        // nodePostHandlerFilters\n        if (extensionElementMap != null && extensionElementMap.containsKey(BpmnXmlConstants.NODE_POST_HANDLER_FILTERS)) {\n            ExtensionElement element = extensionElementMap.get(BpmnXmlConstants.NODE_POST_HANDLER_FILTERS).get(0);\n            String elementText = element.getElementText();\n            List<Object> list = JsonUtil.parseObject(elementText, List.class);\n            flowDef.put(DefConstants.FLOW_PROP_NODE_POST_HANDLER_FILTERS, list);\n        }   \n        // flowPreHandlerFilters\n        if (extensionElementMap != null && extensionElementMap.containsKey(BpmnXmlConstants.FLOW_PRE_HANDLER_FILTERS)) {\n            ExtensionElement element = extensionElementMap.get(BpmnXmlConstants.FLOW_PRE_HANDLER_FILTERS).get(0);\n            String elementText = element.getElementText();\n            List<Object> list = JsonUtil.parseObject(elementText, List.class);\n            flowDef.put(DefConstants.FLOW_PROP_FLOW_PRE_HANDLER_FILTERS, list);\n        }  \n        // flowPostHandlerFilters\n        if (extensionElementMap != null && extensionElementMap.containsKey(BpmnXmlConstants.FLOW_POST_HANDLER_FILTERS)) {\n            ExtensionElement element = extensionElementMap.get(BpmnXmlConstants.FLOW_POST_HANDLER_FILTERS).get(0);\n            String elementText = element.getElementText();\n            List<Object> list = JsonUtil.parseObject(elementText, List.class);\n            flowDef.put(DefConstants.FLOW_PROP_FLOW_POST_HANDLER_FILTERS, list);\n        }         \n        // runner\n        if (extensionElementMap != null && extensionElementMap.containsKey(BpmnXmlConstants.RUNNER)) {\n            ExtensionElement element = extensionElementMap.get(BpmnXmlConstants.RUNNER).get(0);\n            String elementText = element.getElementText();\n            Map<String, Object> runner = JsonUtil.parseObject(elementText, Map.class);\n            flowDef.put(DefConstants.FLOW_PROP_RUNNER, runner);\n        }\n        // parseListeners\n        if (extensionElementMap != null && extensionElementMap.containsKey(BpmnXmlConstants.PARSE_LISTENERS)) {\n            ExtensionElement element = extensionElementMap.get(BpmnXmlConstants.PARSE_LISTENERS).get(0);\n            String elementText = element.getElementText();\n            List<String> list = JsonUtil.parseObject(elementText, List.class);\n            flowDef.put(DefConstants.FLOW_PROP_PARSE_LISTENERS, list);\n        }   \n        // logFlag\n        if (extensionElementMap != null && extensionElementMap.containsKey(BpmnXmlConstants.LOG_FLAG)) {\n            ExtensionElement element = extensionElementMap.get(BpmnXmlConstants.LOG_FLAG).get(0);\n            String elementText = element.getElementText();\n            if (FlowStringUtil.isNotEmpty(elementText)) {\n                flowDef.put(DefConstants.FLOW_PROP_LOG_FLAG, Boolean.valueOf(elementText));\n            }\n        }\n    }\n    \n    private static void processBoundaryEvent(List<BoundaryEvent> boundaryEvents,\n            Map<String, Map<String, Object>> compensateActionMap, List<Map<String, Object>> nodeList, Process process) {\n        for (BoundaryEvent event : boundaryEvents) {\n            boolean isCompensate = false;\n            String compensateActionId = null;\n            for (EventDefinition definition : event.getEventDefinitions()) {\n                if (definition instanceof CompensateEventDefinition) {\n                    isCompensate = true;\n                    List<Association> associationList = process.findAssociationsWithSourceRefRecursive(event.getId());\n                    if (associationList.size() == 1) {\n                        compensateActionId = associationList.get(0).getTargetRef();\n                    }\n                    break;\n                }\n            }\n            if (isCompensate) {\n                if (compensateActionId != null) {\n                    String nodeId = event.getAttachedToRefId();\n                    Map<String, Object> compensateInfo = compensateActionMap.get(compensateActionId);\n                    Object actionInfo = compensateInfo.get(DefConstants.NODE_PROP_ACTION);\n                    Map<String, Object> nodeInfo = null;\n                    for (Map<String, Object> info : nodeList) {\n                        if (nodeId.equals(info.get(DefConstants.COMMON_PROP_ID))) {\n                            nodeInfo = info;\n                            break;\n                        }\n                    }\n                    Map<String, Object> properties = ConvertUtil.getMapValue(nodeInfo, DefConstants.COMMON_PROP_PROPERTIES);\n                    if (properties.get(DefConstants.NODE_PROPERTIES_PROP_COMPENSATE_ACTION) == null) {\n                        properties.put(DefConstants.NODE_PROPERTIES_PROP_COMPENSATE_ACTION, actionInfo);\n                    }\n                }\n            } else {\n                throw new FlowException(\n                        \"Unsupported BPMN element:ID\" + event.getId() + \" TYPE:\" + event.getClass().getCanonicalName());\n            }\n        }\n    }\n\n    private static Map<String, Object> getNodeDef(String nodeId, Map<String, Object> flowDef) {\n        List<Map<String, Object>> list = (List<Map<String, Object>>) flowDef.get(DefConstants.FLOW_PROP_NODES);\n        if (list == null) {\n            return null;\n        }\n        for (Map<String, Object> node : list) {\n            if (Objects.equals(nodeId, node.get(DefConstants.COMMON_PROP_ID))) {\n                return node;\n            }\n        }\n        return null;\n    }\n\n    public static Map<Class, FlowNodeConverter> getFlowNodeConverterMap() {\n        return flowNodeConverterMap;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/FlowNodeConverter.java",
    "content": "package com.jd.easyflow.flow.bpmn.converter;\n\nimport java.util.Map;\n\nimport org.activiti.bpmn.model.BpmnModel;\nimport org.activiti.bpmn.model.FlowNode;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic interface FlowNodeConverter {\n    \n    /**\n     * Do convert.\n     * @param flowNode\n     * @param bpmnModel\n     * @param flowDef\n     * @return\n     */\n    Map<String, Object> convert(FlowNode flowNode, BpmnModel bpmnModel, Map<String, Object> flowDef);\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/activity/AdhocSubProcessConverter.java",
    "content": "package com.jd.easyflow.flow.bpmn.converter.activity;\n\nimport java.util.Map;\n\nimport org.activiti.bpmn.model.BpmnModel;\nimport org.activiti.bpmn.model.FlowNode;\n\n/**\n * \n * @author liyuliang5\n */\npublic class AdhocSubProcessConverter extends SubProcessConverter {\n\n    @Override\n    public Map<String, Object> convert(FlowNode flowNode, BpmnModel bpmnModel, Map<String, Object> flowDef) {\n        Map<String, Object> node = super.convert(flowNode, bpmnModel, flowDef);\n        return node;\n    }\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/activity/BusinessRuleTaskConverter.java",
    "content": "package com.jd.easyflow.flow.bpmn.converter.activity;\n\nimport java.util.Map;\n\nimport org.activiti.bpmn.model.BpmnModel;\nimport org.activiti.bpmn.model.FlowNode;\n\nimport com.jd.easyflow.flow.bpmn.converter.BaseFlowNodeConverter;\n\n/**\n * \n * @author liyuliang5\n */\npublic class BusinessRuleTaskConverter extends BaseFlowNodeConverter {\n\n    @Override\n    public Map<String, Object> convert(FlowNode flowNode, BpmnModel bpmnModel, Map<String, Object> flowDef) {\n        Map<String, Object> node = super.convert(flowNode, bpmnModel, flowDef);\n        return node;\n    }\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/activity/CallActivityConverter.java",
    "content": "package com.jd.easyflow.flow.bpmn.converter.activity;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.activiti.bpmn.model.BpmnModel;\nimport org.activiti.bpmn.model.CallActivity;\nimport org.activiti.bpmn.model.FlowNode;\n\nimport com.jd.easyflow.flow.bpmn.converter.BaseFlowNodeConverter;\nimport com.jd.easyflow.flow.bpmn.converter.util.ConvertUtil;\nimport com.jd.easyflow.flow.model.definition.DefConstants;\nimport com.jd.easyflow.flow.util.FlowStringUtil;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class CallActivityConverter extends BaseFlowNodeConverter {\n\n    @Override\n    public Map<String, Object> convert(FlowNode flowNode, BpmnModel bpmnModel, Map<String, Object> flowDef) {\n        Map<String, Object> node = super.convert(flowNode, bpmnModel, flowDef);\n        CallActivity callActivity = (CallActivity) flowNode;\n        String flowId = callActivity.getCalledElement();\n        if (node.get(DefConstants.NODE_PROP_ACTION) == null) {\n            Map<String, Object> action = new HashMap<>();\n            action.put(DefConstants.COMMON_PROP_FLOW_ID, flowId);\n            node.put(DefConstants.NODE_PROP_ACTION, action);\n        } else {\n            if (FlowStringUtil.isNotEmpty(flowId)) {\n                Map<String, Object> properties = ConvertUtil.getMapValue(node, DefConstants.COMMON_PROP_PROPERTIES);\n                properties.put(DefConstants.COMMON_PROP_FLOW_ID, flowId);\n            }\n        }\n        return node;\n    }\n}\n\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/activity/EventSubProcessConverter.java",
    "content": "package com.jd.easyflow.flow.bpmn.converter.activity;\n\nimport java.util.Map;\n\nimport org.activiti.bpmn.model.BpmnModel;\nimport org.activiti.bpmn.model.FlowNode;\n\n/**\n * \n * @author liyuliang5\n */\npublic class EventSubProcessConverter extends SubProcessConverter {\n\n    @Override\n    public Map<String, Object> convert(FlowNode flowNode, BpmnModel bpmnModel, Map<String, Object> flowDef) {\n        Map<String, Object> node = super.convert(flowNode, bpmnModel, flowDef);\n        return node;\n    }\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/activity/ManualTaskConverter.java",
    "content": "package com.jd.easyflow.flow.bpmn.converter.activity;\n\nimport java.util.Map;\n\nimport org.activiti.bpmn.model.BpmnModel;\nimport org.activiti.bpmn.model.FlowNode;\n\nimport com.jd.easyflow.flow.bpmn.converter.BaseFlowNodeConverter;\n\n/**\n * \n * @author liyuliang5\n */\npublic class ManualTaskConverter extends BaseFlowNodeConverter {\n\n    @Override\n    public Map<String, Object> convert(FlowNode flowNode, BpmnModel bpmnModel, Map<String, Object> flowDef) {\n        Map<String, Object> node = super.convert(flowNode, bpmnModel, flowDef);\n        return node;\n    }\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/activity/ReceiveTaskConverter.java",
    "content": "package com.jd.easyflow.flow.bpmn.converter.activity;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.activiti.bpmn.model.BpmnModel;\nimport org.activiti.bpmn.model.FlowNode;\n\nimport com.jd.easyflow.flow.bpmn.converter.BaseFlowNodeConverter;\nimport com.jd.easyflow.flow.model.action.EventNodeAction;\nimport com.jd.easyflow.flow.model.definition.DefConstants;\n\n/**\n * Receive Task Converter.\n * \n * @author liyuliang5\n *\n */\npublic class ReceiveTaskConverter extends BaseFlowNodeConverter {\n\n    @Override\n    public Map<String, Object> convert(FlowNode flowNode, BpmnModel bpmnModel, Map<String, Object> flowDef) {\n        Map<String, Object> node = super.convert(flowNode, bpmnModel, flowDef);\n        if (node.get(DefConstants.NODE_PROP_ACTION) == null) {\n            Map<String, Object> action = new HashMap<>();\n            action.put(DefConstants.COMMON_PROP_TYPE, DefConstants.NODE_ACTION_TYPE_EVENT);\n            node.put(DefConstants.NODE_PROP_ACTION, action);\n        }\n        return node;\n    }\n}"
  },
  {
    "path": "easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/activity/ScriptTaskConverter.java",
    "content": "package com.jd.easyflow.flow.bpmn.converter.activity;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.activiti.bpmn.model.BpmnModel;\nimport org.activiti.bpmn.model.FlowNode;\nimport org.activiti.bpmn.model.ScriptTask;\n\nimport com.jd.easyflow.flow.bpmn.converter.BaseFlowNodeConverter;\nimport com.jd.easyflow.flow.bpmn.converter.util.ConvertUtil;\nimport com.jd.easyflow.flow.model.definition.DefConstants;\nimport com.jd.easyflow.flow.util.FlowStringUtil;\n\n/**\n * Script Task Converter.\n * \n * @author liyuliang5\n *\n */\npublic class ScriptTaskConverter extends BaseFlowNodeConverter {\n\n    private static final String EXP_FORMAT = \"exp\";\n    // private static final String CREATE_EXP_FORMAT = \"createExp\";\n\n    @Override\n    public Map<String, Object> convert(FlowNode flowNode, BpmnModel bpmnModel, Map<String, Object> flowDef) {\n        Map<String, Object> node = super.convert(flowNode, bpmnModel, flowDef);\n        ScriptTask scriptTask = (ScriptTask) flowNode;\n        String format = scriptTask.getScriptFormat();\n        String script = scriptTask.getScript();\n        Map<String, Object> action = new HashMap<>();\n        if (FlowStringUtil.isNotEmpty(script)) {\n            if (format == null) {\n                format = EXP_FORMAT;\n            }\n            action.put(format, script);\n        }\n\n        if (node.get(DefConstants.NODE_PROP_ACTION) == null) {\n            if (!action.isEmpty()) {\n                node.put(DefConstants.NODE_PROP_ACTION, action);\n            }\n        } else {\n            if (!action.isEmpty()) {\n                Map<String, Object> properties = ConvertUtil.getMapValue(node, DefConstants.COMMON_PROP_PROPERTIES);\n                properties.put(DefConstants.NODE_PROP_ACTION, action);\n            }\n        }\n        return node;\n    }\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/activity/SendTaskConverter.java",
    "content": "package com.jd.easyflow.flow.bpmn.converter.activity;\n\nimport java.util.Map;\n\nimport org.activiti.bpmn.model.BpmnModel;\nimport org.activiti.bpmn.model.FlowNode;\n\nimport com.jd.easyflow.flow.bpmn.converter.BaseFlowNodeConverter;\n\n/**\n * \n * @author liyuliang5\n */\npublic class SendTaskConverter extends BaseFlowNodeConverter {\n\n    @Override\n    public Map<String, Object> convert(FlowNode flowNode, BpmnModel bpmnModel, Map<String, Object> flowDef) {\n        Map<String, Object> node = super.convert(flowNode, bpmnModel, flowDef);\n        return node;\n    }\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/activity/ServiceTaskConverter.java",
    "content": "package com.jd.easyflow.flow.bpmn.converter.activity;\n\nimport java.util.Map;\n\nimport org.activiti.bpmn.model.BpmnModel;\nimport org.activiti.bpmn.model.FlowNode;\n\nimport com.jd.easyflow.flow.bpmn.converter.BaseFlowNodeConverter;\n\n/**\n * \n * @author liyuliang5\n */\npublic class ServiceTaskConverter extends BaseFlowNodeConverter {\n\n    @Override\n    public Map<String, Object> convert(FlowNode flowNode, BpmnModel bpmnModel, Map<String, Object> flowDef) {\n        Map<String, Object> node = super.convert(flowNode, bpmnModel, flowDef);\n        return node;\n    }\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/activity/SubProcessConverter.java",
    "content": "package com.jd.easyflow.flow.bpmn.converter.activity;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.UUID;\n\nimport org.activiti.bpmn.model.BpmnModel;\nimport org.activiti.bpmn.model.ExtensionElement;\nimport org.activiti.bpmn.model.FlowElement;\nimport org.activiti.bpmn.model.FlowNode;\nimport org.activiti.bpmn.model.SequenceFlow;\nimport org.activiti.bpmn.model.SubProcess;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.bpmn.converter.BaseFlowNodeConverter;\nimport com.jd.easyflow.flow.bpmn.converter.BpmnConverter;\nimport com.jd.easyflow.flow.bpmn.converter.FlowNodeConverter;\nimport com.jd.easyflow.flow.bpmn.converter.util.BpmnXmlConstants;\nimport com.jd.easyflow.flow.bpmn.converter.util.ConvertUtil;\nimport com.jd.easyflow.flow.exception.FlowException;\nimport com.jd.easyflow.flow.model.definition.DefConstants;\nimport com.jd.easyflow.flow.util.JsonUtil;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class SubProcessConverter extends BaseFlowNodeConverter {\n    \n    private static final Logger logger = LoggerFactory.getLogger(SubProcessConverter.class);\n\n\n    @Override\n    public Map<String, Object> convert(FlowNode flowNode, BpmnModel bpmnModel, Map<String, Object> flowDef) {\n        Map<String, Object> node = super.convert(flowNode, bpmnModel, flowDef);\n        SubProcess subProcess = (SubProcess) flowNode;\n        Map<String, Object> subFlowDef = new HashMap<>();\n        Map<String, List<ExtensionElement>> extensionElementMap = flowNode.getExtensionElements();\n        if (extensionElementMap != null && extensionElementMap.containsKey(BpmnXmlConstants.FLOW)) {\n            ExtensionElement element = extensionElementMap.get(BpmnXmlConstants.FLOW).get(0);\n            String elementText = element.getElementText();\n            subFlowDef = JsonUtil.parseObject(elementText, Map.class);\n        }\n        if (subFlowDef.get(DefConstants.COMMON_PROP_ID) == null) {\n            throw new FlowException(\"flow id of sub process is necessary!\");\n        }\n        convertSubProcess(subProcess, bpmnModel, subFlowDef);\n        \n        if (node.get(DefConstants.NODE_PROP_ACTION) == null) {\n            Map<String, Object> action = new HashMap<>();\n            action.put(DefConstants.COMMON_PROP_FLOW, subFlowDef);\n            node.put(DefConstants.NODE_PROP_ACTION, action);\n        } else {\n            if (subFlowDef != null && ! subFlowDef.isEmpty()) {\n                // put to properties, customized use.\n                Map<String, Object> properties = ConvertUtil.getMapValue(node, DefConstants.COMMON_PROP_PROPERTIES);\n                properties.put(DefConstants.COMMON_PROP_FLOW, subFlowDef);\n            }\n        }\n        return node;\n    }\n    \n    /**\n     * Convert process definition.\n     * \n     * @param process\n     * @param bpmnModel\n     * @param flowDef\n     */\n    private static void convertSubProcess(SubProcess process, BpmnModel bpmnModel, Map<String, Object> flowDef) {\n        // Process flow element, convert Gateway,Event,Activity to Node.\n        List<Map<String, Object>> nodeList = (List<Map<String, Object>>) flowDef.get(DefConstants.FLOW_PROP_NODES);\n        if (nodeList != null) {\n            return;\n        }\n        nodeList = new ArrayList<>();\n        flowDef.put(DefConstants.FLOW_PROP_NODES, nodeList);\n        for (FlowElement flowElement : process.getFlowElements()) {\n            // Flow element\n            if (flowElement instanceof FlowNode) {\n                FlowNodeConverter nodeConverter = BpmnConverter.getFlowNodeConverterMap().get(flowElement.getClass());\n                if (nodeConverter == null) {\n                    throw new FlowException(\"Unsupported BPMN elmenet:ID\" + flowElement.getId() + \" TYPE:\"\n                            + flowElement.getClass().getCanonicalName());\n                }\n                Map<String, Object> node = nodeConverter.convert((FlowNode) flowElement, bpmnModel, flowDef);\n                nodeList.add(node);\n                // Sequence flow\n            } else if (flowElement instanceof SequenceFlow) {\n                continue;\n            } else {\n                throw new FlowException(\"Unsupported BPMN element:ID\" + flowElement.getId() + \" TYPE:\"\n                        + flowElement.getClass().getCanonicalName());\n            }\n        }\n    }\n}\n\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/activity/TaskConverter.java",
    "content": "package com.jd.easyflow.flow.bpmn.converter.activity;\n\nimport java.util.Map;\n\nimport org.activiti.bpmn.model.BpmnModel;\nimport org.activiti.bpmn.model.FlowNode;\n\nimport com.jd.easyflow.flow.bpmn.converter.BaseFlowNodeConverter;\n\n/**\n * \n * @author liyuliang5\n */\npublic class TaskConverter extends BaseFlowNodeConverter {\n\n    @Override\n    public Map<String, Object> convert(FlowNode flowNode, BpmnModel bpmnModel, Map<String, Object> flowDef) {\n        Map<String, Object> node = super.convert(flowNode, bpmnModel, flowDef);\n        return node;\n    }\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/activity/TransactionConverter.java",
    "content": "package com.jd.easyflow.flow.bpmn.converter.activity;\n\nimport java.util.Map;\n\nimport org.activiti.bpmn.model.BpmnModel;\nimport org.activiti.bpmn.model.FlowNode;\n\n/**\n * Transaction converter\n * @author liyuliang5\n *\n */\npublic class TransactionConverter extends SubProcessConverter {\n\n    @Override\n    public Map<String, Object> convert(FlowNode flowNode, BpmnModel bpmnModel, Map<String, Object> flowDef) {\n        Map<String, Object> node = super.convert(flowNode, bpmnModel, flowDef);\n        return node;\n    }\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/activity/UserTaskConverter.java",
    "content": "package com.jd.easyflow.flow.bpmn.converter.activity;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.activiti.bpmn.model.BpmnModel;\nimport org.activiti.bpmn.model.FlowNode;\n\nimport com.jd.easyflow.flow.bpmn.converter.BaseFlowNodeConverter;\nimport com.jd.easyflow.flow.model.action.EventNodeAction;\nimport com.jd.easyflow.flow.model.definition.DefConstants;\n\n/**\n * User Task Converter.\n * \n * @author liyuliang5\n *\n */\npublic class UserTaskConverter extends BaseFlowNodeConverter {\n\n    @Override\n    public Map<String, Object> convert(FlowNode flowNode, BpmnModel bpmnModel, Map<String, Object> flowDef) {\n        Map<String, Object> node = super.convert(flowNode, bpmnModel, flowDef);\n        if (node.get(DefConstants.NODE_PROP_ACTION) == null) {\n            Map<String, Object> action = new HashMap<>();\n            action.put(DefConstants.COMMON_PROP_TYPE, DefConstants.NODE_ACTION_TYPE_EVENT);\n            node.put(DefConstants.NODE_PROP_ACTION, action);\n        }\n        return node;\n    }\n}"
  },
  {
    "path": "easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/event/EndEventConverter.java",
    "content": "package com.jd.easyflow.flow.bpmn.converter.event;\n\nimport java.util.List;\nimport java.util.Map;\n\nimport org.activiti.bpmn.model.BpmnModel;\nimport org.activiti.bpmn.model.CompensateEventDefinition;\nimport org.activiti.bpmn.model.EndEvent;\nimport org.activiti.bpmn.model.EventDefinition;\nimport org.activiti.bpmn.model.FlowNode;\nimport org.activiti.bpmn.model.TerminateEventDefinition;\n\nimport com.jd.easyflow.flow.bpmn.converter.BaseFlowNodeConverter;\nimport com.jd.easyflow.flow.bpmn.converter.util.ConvertUtil;\nimport com.jd.easyflow.flow.model.definition.DefConstants;\n\n/**\n * End Event Converter.\n * \n * @author liyuliang5\n *\n */\npublic class EndEventConverter extends BaseFlowNodeConverter {\n\n    @Override\n    public Map<String, Object> convert(FlowNode flowNode, BpmnModel bpmnModel, Map<String, Object> flowDef) {\n        Map<String, Object> node = super.convert(flowNode, bpmnModel, flowDef);\n        // Properties\n        Map<String, Object> properties = ConvertUtil.getMapValue(node, DefConstants.COMMON_PROP_PROPERTIES);\n        properties.put(DefConstants.NODE_PROPERTIES_PROP_END, true);\n\n        List<EventDefinition> events = ((EndEvent) flowNode).getEventDefinitions();\n        boolean isTerminateEvent = false;\n        boolean isCompensateEvent = false;\n        if (events != null) {\n            for (EventDefinition definition : events) {\n                if (definition instanceof TerminateEventDefinition) {\n                    isTerminateEvent = true;\n                } else if (definition instanceof CompensateEventDefinition) {\n                    isCompensateEvent = true;\n                }\n            }\n        }\n        \n        if (node.get(DefConstants.NODE_PROP_ACTION) == null) {\n            if (isTerminateEvent) {\n                Map<String, Object> action = ConvertUtil.getMapValue(node, DefConstants.NODE_PROP_ACTION);\n                action.put(DefConstants.COMMON_PROP_TYPE, DefConstants.NODE_ACTION_TYPE_INTERRUPT);\n            } else if (isCompensateEvent) {\n                Map<String, Object> action = ConvertUtil.getMapValue(node, DefConstants.NODE_PROP_ACTION);\n                action.put(DefConstants.COMMON_PROP_TYPE, DefConstants.NODE_ACTION_TYPE_COMPENSATE);\n            }\n        }\n\n        return node;\n    }\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/event/IntermediateCatchEventConverter.java",
    "content": "package com.jd.easyflow.flow.bpmn.converter.event;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.activiti.bpmn.model.BpmnModel;\nimport org.activiti.bpmn.model.FlowNode;\n\nimport com.jd.easyflow.flow.bpmn.converter.BaseFlowNodeConverter;\nimport com.jd.easyflow.flow.model.definition.DefConstants;\n\n/**\n * Intermediate Catch Event Converter.\n * \n * @author liyuliang5\n *\n */\npublic class IntermediateCatchEventConverter extends BaseFlowNodeConverter {\n\n    @Override\n    public Map<String, Object> convert(FlowNode flowNode, BpmnModel bpmnModel, Map<String, Object> flowDef) {\n        Map<String, Object> node = super.convert(flowNode, bpmnModel, flowDef);\n        if (node.get(DefConstants.NODE_PROP_ACTION) == null) {\n            Map<String, Object> action = new HashMap<>();\n            action.put(DefConstants.COMMON_PROP_TYPE, DefConstants.NODE_ACTION_TYPE_EVENT);\n            node.put(DefConstants.NODE_PROP_ACTION, action);\n        }\n        return node;\n    }\n}"
  },
  {
    "path": "easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/event/StartEventConverter.java",
    "content": "package com.jd.easyflow.flow.bpmn.converter.event;\n\nimport java.util.Map;\n\nimport org.activiti.bpmn.model.BpmnModel;\nimport org.activiti.bpmn.model.FlowNode;\n\nimport com.jd.easyflow.flow.bpmn.converter.BaseFlowNodeConverter;\nimport com.jd.easyflow.flow.model.definition.DefConstants;\n\n/**\n * Start Event Converter.\n * @author liyuliang5\n *\n */\npublic class StartEventConverter extends BaseFlowNodeConverter {\n\n    @Override\n    public Map<String, Object> convert(FlowNode flowNode, BpmnModel bpmnModel, Map<String, Object> flowDef) {\n        Map<String, Object> node = super.convert(flowNode, bpmnModel, flowDef);\n        node.put(DefConstants.NODE_PROP_START, true);\n        return node;\n    }\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/event/ThrowEventConverter.java",
    "content": "package com.jd.easyflow.flow.bpmn.converter.event;\n\nimport java.util.List;\nimport java.util.Map;\n\nimport org.activiti.bpmn.model.BpmnModel;\nimport org.activiti.bpmn.model.CompensateEventDefinition;\nimport org.activiti.bpmn.model.EventDefinition;\nimport org.activiti.bpmn.model.FlowNode;\nimport org.activiti.bpmn.model.ThrowEvent;\n\nimport com.jd.easyflow.flow.bpmn.converter.BaseFlowNodeConverter;\nimport com.jd.easyflow.flow.bpmn.converter.util.ConvertUtil;\nimport com.jd.easyflow.flow.model.definition.DefConstants;\n\n/**\n * Throw event converter.\n * \n * @author liyuliang5\n */\npublic class ThrowEventConverter extends BaseFlowNodeConverter {\n\n    @Override\n    public Map<String, Object> convert(FlowNode flowNode, BpmnModel bpmnModel, Map<String, Object> flowDef) {\n        Map<String, Object> node = super.convert(flowNode, bpmnModel, flowDef);\n        List<EventDefinition> events = ((ThrowEvent) flowNode).getEventDefinitions();\n\n        boolean isCompensateEvent = false;\n        if (events != null) {\n            for (EventDefinition definition : events) {\n                if (definition instanceof CompensateEventDefinition) {\n                    isCompensateEvent = true;\n                }\n            }\n        }\n\n        if (node.get(DefConstants.NODE_PROP_ACTION) == null) {\n            if (isCompensateEvent) {\n                Map<String, Object> action = ConvertUtil.getMapValue(node, DefConstants.NODE_PROP_ACTION);\n                action.put(DefConstants.COMMON_PROP_TYPE, DefConstants.NODE_ACTION_TYPE_COMPENSATE);\n            }\n        }\n        return node;\n    }\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/gateway/ComplexGatewayConverter.java",
    "content": "package com.jd.easyflow.flow.bpmn.converter.gateway;\n\nimport java.util.Map;\n\nimport org.activiti.bpmn.model.BpmnModel;\nimport org.activiti.bpmn.model.FlowNode;\n\nimport com.jd.easyflow.flow.bpmn.converter.BaseFlowNodeConverter;\n\n/**\n * Complex gateway.\n * @author liyuliang5\n */\npublic class ComplexGatewayConverter extends BaseFlowNodeConverter {\n\n    @Override\n    public Map<String, Object> convert(FlowNode flowNode, BpmnModel bpmnModel, Map<String, Object> flowDef) {\n        Map<String, Object> node = super.convert(flowNode, bpmnModel, flowDef);\n        return node;\n    }\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/gateway/EventGatewayConverter.java",
    "content": "package com.jd.easyflow.flow.bpmn.converter.gateway;\n\nimport java.util.Map;\n\nimport org.activiti.bpmn.model.BpmnModel;\nimport org.activiti.bpmn.model.FlowNode;\n\nimport com.jd.easyflow.flow.bpmn.converter.BaseFlowNodeConverter;\n\n/**\n * \n * @author liyuliang5\n */\npublic class EventGatewayConverter extends BaseFlowNodeConverter {\n\n    @Override\n    public Map<String, Object> convert(FlowNode flowNode, BpmnModel bpmnModel, Map<String, Object> flowDef) {\n        Map<String, Object> node = super.convert(flowNode, bpmnModel, flowDef);\n        return node;\n    }\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/gateway/ExclusiveGatewayConverter.java",
    "content": "package com.jd.easyflow.flow.bpmn.converter.gateway;\n\nimport java.util.Map;\n\nimport org.activiti.bpmn.model.BpmnModel;\nimport org.activiti.bpmn.model.ExclusiveGateway;\nimport org.activiti.bpmn.model.FlowNode;\n\nimport com.jd.easyflow.flow.bpmn.converter.BaseFlowNodeConverter;\nimport com.jd.easyflow.flow.bpmn.converter.util.ConvertUtil;\nimport com.jd.easyflow.flow.model.definition.DefConstants;\n\n/**\n * Exclusive Gateway Converter.\n * @author liyuliang5\n *\n */\npublic class ExclusiveGatewayConverter extends BaseFlowNodeConverter {\n\n    @Override\n    public Map<String, Object> convert(FlowNode flowNode, BpmnModel bpmnModel, Map<String, Object> flowDef) {\n        Map<String, Object> node = super.convert(flowNode, bpmnModel, flowDef);\n        ExclusiveGateway exclusiveGateway = (ExclusiveGateway) flowNode;\n        Map<String, Object> post = ConvertUtil.getMapValue(node, DefConstants.NODE_PROP_POST);\n        post.remove(DefConstants.NODE_POST_PROP_CONDITION_TYPE);\n        return node;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/gateway/InclusiveGatewayConverter.java",
    "content": "package com.jd.easyflow.flow.bpmn.converter.gateway;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\n\nimport org.activiti.bpmn.model.BpmnModel;\nimport org.activiti.bpmn.model.FlowNode;\nimport org.activiti.bpmn.model.InclusiveGateway;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.bpmn.converter.BaseFlowNodeConverter;\nimport com.jd.easyflow.flow.bpmn.converter.util.ConvertUtil;\nimport com.jd.easyflow.flow.model.definition.DefConstants;\nimport com.jd.easyflow.flow.model.post.ConditionalNodePostHandler;\n\n/**\n * Inclusive Gateway Converter.\n * \n * @author liyuliang5\n *\n */\npublic class InclusiveGatewayConverter extends BaseFlowNodeConverter {\n\n    private static final Logger logger = LoggerFactory.getLogger(InclusiveGatewayConverter.class);\n\n    @Override\n    public Map<String, Object> convert(FlowNode flowNode, BpmnModel bpmnModel, Map<String, Object> flowDef) {\n        Map<String, Object> node = super.convert(flowNode, bpmnModel, flowDef);\n        InclusiveGateway inclusiveGateway = (InclusiveGateway) flowNode;\n\n        Map<String, Object> post = ConvertUtil.getMapValue(node, DefConstants.NODE_PROP_POST);\n        post.put(DefConstants.NODE_POST_PROP_CONDITION_TYPE, ConditionalNodePostHandler.INCLUSIVE_TYPE);\n        if (inclusiveGateway.getIncomingFlows().size() > 1) {\n            if (node.get(DefConstants.NODE_PROP_PRE) == null) {\n                Map<String, Object> pre = ConvertUtil.getMapValue(node, DefConstants.NODE_PROP_PRE);\n                List<String> preNodes = new ArrayList<>();\n                flowNode.getIncomingFlows().forEach(incomingFlow -> preNodes.add(incomingFlow.getSourceRef()));\n                pre.put(DefConstants.COMMON_PROP_TYPE, DefConstants.NODE_PRE_TYPE_INCLUSIVECHECK);\n                pre.put(DefConstants.NODE_PRE_PROP_PRE_NODES, preNodes);\n            }\n        }\n        return node;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/gateway/ParallelGatewayConverter.java",
    "content": "package com.jd.easyflow.flow.bpmn.converter.gateway;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\n\nimport org.activiti.bpmn.model.BpmnModel;\nimport org.activiti.bpmn.model.FlowNode;\nimport org.activiti.bpmn.model.ParallelGateway;\nimport org.activiti.bpmn.model.SequenceFlow;\n\nimport com.jd.easyflow.flow.bpmn.converter.BaseFlowNodeConverter;\nimport com.jd.easyflow.flow.bpmn.converter.util.ConvertUtil;\nimport com.jd.easyflow.flow.exception.FlowException;\nimport com.jd.easyflow.flow.model.definition.DefConstants;\nimport com.jd.easyflow.flow.model.post.ConditionalNodePostHandler;\n\n/**\n * Parallel Gateway Converter.\n * \n * @author liyuliang5\n *\n */\npublic class ParallelGatewayConverter extends BaseFlowNodeConverter {\n\n    @Override\n    public Map<String, Object> convert(FlowNode flowNode, BpmnModel bpmnModel, Map<String, Object> flowDef) {\n        ParallelGateway parallelGateway = (ParallelGateway) flowNode;\n        Map<String, Object> node = super.convert(flowNode, bpmnModel, flowDef);\n        Map<String, Object> post = ConvertUtil.getMapValue(node, DefConstants.NODE_PROP_POST);\n        post.put(DefConstants.NODE_POST_PROP_CONDITION_TYPE, ConditionalNodePostHandler.INCLUSIVE_TYPE);\n        // Set pre nodes.\n        List<SequenceFlow> list = parallelGateway.getIncomingFlows();\n        if (list.size() == 0) {\n            throw new FlowException(\"Parallel gateway:\" + flowNode.getId() + \" no incoming flows\");\n        }\n        if (list.size() > 1) {\n            if (node.get(DefConstants.NODE_PROP_PRE) == null) {\n                Map<String, Object> pre = ConvertUtil.getMapValue(node, DefConstants.NODE_PROP_PRE);\n                List<String> preNodes = new ArrayList<>();\n                flowNode.getIncomingFlows().forEach(incomingFlow -> preNodes.add(incomingFlow.getSourceRef()));\n                pre.put(DefConstants.NODE_PRE_PROP_PRE_NODES, preNodes);\n            }\n        }\n        return node;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/util/BpmnXmlConstants.java",
    "content": "package com.jd.easyflow.flow.bpmn.converter.util;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class BpmnXmlConstants {\n    \n    public static final String START = \"start\";\n    public static final String PROPERTIES = \"properties\";\n    public static final String LISTENERS = \"listeners\";\n    public static final String FILTERS = \"filters\";\n    public static final String NODE_FILTERS = \"nodeFilters\";\n    public static final String NODE_PRE_HANDLER_FILTERS = \"nodePreHandlerFilters\";\n    public static final String NODE_ACTION_FILTERS = \"nodeActionFilters\";\n    public static final String NODE_POST_HANDLER_FILTERS = \"nodePostHandlerFilters\";\n    public static final String FLOW_PRE_HANDLER_FILTERS = \"flowPreHandlerFilters\";\n    public static final String FLOW_POST_HANDLER_FILTERS = \"flowPostHandlerFilters\";\n    public static final String RUNNER = \"runner\";\n    public static final String PARSE_LISTENERS = \"parseListeners\";\n    public static final String CONDITION_TYPE = \"conditionType\";\n    public static final String PRE = \"pre\";\n    public static final String ACTION = \"action\";\n    public static final String POST = \"post\";\n    public static final String FLOW = \"flow\";\n    public static final String LOG_FLAG = \"logFlag\";\n\n    \n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/main/java/com/jd/easyflow/flow/bpmn/converter/util/ConvertUtil.java",
    "content": "package com.jd.easyflow.flow.bpmn.converter.util;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ConvertUtil {\n\n    public static Map<String, Object> getMapValue(Map<String, Object> obj, String key) {\n        Map<String, Object> value = (Map<String, Object>) obj.get(key);\n        if (value == null) {\n            value = new HashMap<>();\n            obj.put(key, value);\n        }\n        return value;\n    }\n    \n    public static List<Object> getListValue(Map<String, Object> obj, String key) {\n        List<Object> value = (List<Object>) obj.get(key);\n        if (value == null) {\n            value = new ArrayList<>();\n            obj.put(key, value);\n        }\n        return value;\n    }\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/FlowBpmnTestSuite.java",
    "content": "package com.jd.easyflow.flow.bpmn;\n\nimport org.junit.runner.RunWith;\nimport org.junit.runners.Suite;\nimport org.junit.runners.Suite.SuiteClasses;\n\nimport com.jd.easyflow.flow.bpmn.cases.callactivity.BpmnCallActivityTest;\nimport com.jd.easyflow.flow.bpmn.cases.converter.BpmnConverterTest;\nimport com.jd.easyflow.flow.bpmn.cases.defaultflow.DefaultFlowTest;\nimport com.jd.easyflow.flow.bpmn.cases.extension.BpmnExtensionTest;\nimport com.jd.easyflow.flow.bpmn.cases.inclusive.BpmnInclusiveTest;\nimport com.jd.easyflow.flow.bpmn.cases.logflag.LogFlagTest;\nimport com.jd.easyflow.flow.bpmn.cases.parallel.BpmnParallelTest;\nimport com.jd.easyflow.flow.bpmn.cases.subprocess.BpmnSubProcessTest;\nimport com.jd.easyflow.flow.bpmn.cases.terminate.BpmnTerminateTest;\nimport com.jd.easyflow.flow.bpmn.cases.throwevent.BpmnThrowEventTest;\nimport com.jd.easyflow.flow.bpmn.ext.cases.chain.ChainTest;\n\n@RunWith(Suite.class)\n@SuiteClasses({\n    BpmnConverterTest.class,\n    BpmnExtensionTest.class,\n    BpmnParallelTest.class,\n    BpmnSubProcessTest.class,\n    BpmnInclusiveTest.class,\n    BpmnExtensionTest.class,\n    BpmnCallActivityTest.class,\n    BpmnSubProcessTest.class,\n    ChainTest.class,\n    BpmnThrowEventTest.class,\n    BpmnCallActivityTest.class,\n    DefaultFlowTest.class,\n    LogFlagTest.class,\n    BpmnTerminateTest.class\n})\npublic class FlowBpmnTestSuite {\n\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/cases/callactivity/BpmnCallActivityTest.java",
    "content": "package com.jd.easyflow.flow.bpmn.cases.callactivity;\n\nimport org.junit.Test;\n\nimport com.jd.easyflow.flow.bpmn.BpmnFlowParser;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class BpmnCallActivityTest {\n    /**\n     * test bpmn call activity.\n     */\n    @Test\n    public void testCallActivity001() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowParser(new BpmnFlowParser());\n        flowEngine.setFlowPath(\"classpath:flow/cases/callactivity/*.bpmn\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"callactivity_test_001\");\n        FlowResult result = flowEngine.execute(param);\n    }\n}\n\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/cases/chain/FlowChainTest.java",
    "content": "package com.jd.easyflow.flow.bpmn.cases.chain;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.function.Function;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.bpmn.BpmnFlowParser;\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\nimport com.jd.easyflow.flow.ext.chain.BaseChainPlugin;\nimport com.jd.easyflow.flow.ext.chain.ChainInvoker;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * @author liyuliang5\n *\n */\npublic class FlowChainTest {\n\n    \n    private static final Logger log = LoggerFactory.getLogger(FlowChainTest.class);\n\n    /**\n     */\n    @Test\n    public void testNormal() {\n        // Init flow engine.\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/chain/flow_chaintest1.bpmn\");\n        flowEngine.setFlowParser(new BpmnFlowParser());\n        flowEngine.init();\n        \n        ChainInvoker chainInvoker = new ChainInvoker();\n        chainInvoker.setFlowEngine(flowEngine);\n        \n        Function<Object, Object> invoker = (t) -> {\n            log.info(\"Execute invoker, Param:\" + t);\n            Map<String, Object> result = new HashMap<>();\n            result.put(\"output\", 456);\n            return result;\n        };\n        \n        Map<String, Object> param = new HashMap<>();\n        param.put(\"input\", 123);\n        \n        Object result = chainInvoker.invoke(\"flow_chaintest1\", param, invoker);\n        log.info(\"Result:\" + result);\n    }\n    \n\n    public static class TestPlugin extends BaseChainPlugin {\n        \n        private static final Logger logger = LoggerFactory.getLogger(TestPlugin.class);\n        \n        private String name;\n        \n        public TestPlugin(String name) {\n            this.name = name;\n        }\n        \n\n        @Override\n        public boolean preHandle(NodeContext nodeContext, FlowContext context) {\n            logger.info(name + \" pre handle\");\n            return true;\n        }\n\n        @Override\n        public void postHandleNormal(NodeContext nodeContext, FlowContext context) {\n            logger.info(name + \" post handle normal\");\n        }\n\n        @Override\n        public void postHandleException(Throwable t, NodeContext nodeContext, FlowContext context) {\n            logger.info(name + \" post handle exception\");\n        }\n\n    }\n  \n\n\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/cases/converter/BpmnConverterTest.java",
    "content": "package com.jd.easyflow.flow.bpmn.cases.converter;\n\nimport static org.junit.Assert.assertEquals;\n\nimport java.io.IOException;\nimport java.util.List;\nimport java.util.Map;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.core.io.Resource;\nimport org.springframework.core.io.support.PathMatchingResourcePatternResolver;\n\nimport com.jd.easyflow.flow.bpmn.BpmnFlowParser;\nimport com.jd.easyflow.flow.bpmn.converter.BpmnConverter;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\nimport com.jd.easyflow.flow.util.FlowIOUtil;\nimport com.jd.easyflow.flow.util.JsonPrettyHelper;\nimport com.jd.easyflow.flow.util.JsonUtil;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class BpmnConverterTest {\n    \n    private static final Logger logger = LoggerFactory.getLogger(BpmnConverterTest.class);\n\n    /**\n     * test convert.\n     * @throws IOException\n     */\n    @Test\n    public void testConvert() throws IOException {\n        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();\n        Resource resource = resolver.getResource(\"classpath:flow/cases/converter/process_1.bpmn\");\n        List<Map<String, Object>> model = BpmnConverter.convert(resource.getInputStream());\n        String flowPrettyConf =  FlowIOUtil.toString(BpmnConverterTest.class.getResourceAsStream(\"/pretty/pretty-flow.json\"));\n        String pretty = JsonPrettyHelper.pretty(model, JsonUtil.parseObject(flowPrettyConf, Map.class));\n        logger.info(\"Model is:\" + pretty);\n    }\n    \n    /**\n     * Validate convert.\n     * @throws IOException\n     */\n    @Test\n    public void testConvertSimple() throws IOException {\n        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();\n        Resource resource = resolver.getResource(\"classpath:flow/cases/converter/process_1_simple.bpmn\");\n        List<Map<String, Object>> model = BpmnConverter.convert(resource.getInputStream());\n        logger.info(\"Model is:\" + JsonUtil.toJsonString(model));\n    }\n    \n    /**\n     * Converter bpmn with multiple process.\n     * @throws IOException\n     */\n    @Test\n    public void testConvertMultiple() throws IOException {\n        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();\n        Resource resource = resolver.getResource(\"classpath:flow/cases/converter/flow_multiple_001.bpmn\");\n        String modelString = BpmnConverter.convert(FlowIOUtil.toString(resource.getInputStream()));\n        logger.info(\"Model is:\" + modelString);\n        List<Map<String, Object>> model = JsonUtil.parseObject(modelString, List.class);\n    }\n    \n    /**\n     * Validate Convert result.\n     */\n    @Test\n    public void testConvertResult() {\n        // Init flow engine\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowParser(new BpmnFlowParser());\n        flowEngine.setFlowPath(\"classpath:flow/cases/converter/flow001.json, classpath:flow/cases/converter/process_1.bpmn\");\n        flowEngine.init();\n        // Execute flow instance 1.\n        FlowParam param = new FlowParam(\"process_1\");\n        param.put(\"input\", 1);\n        FlowResult result = flowEngine.execute(param);\n        logger.info(\"Execute flow instance 1 result:\" + result);\n        // Execute flow instance 2.\n        FlowParam param2 = new FlowParam(\"process_1\");\n        param2.put(\"input\", 10);\n        FlowResult result2 = flowEngine.execute(param2);\n        logger.info(\"Execute flow instance 2 result:\" + result2);        \n    }\n    \n    @Test\n    public void testCompensate() throws Exception {\n        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();\n        Resource resource = resolver.getResource(\"classpath:flow/cases/converter/compensate001.bpmn\");\n        List<Map<String, Object>> model = BpmnConverter.convert(resource.getInputStream());\n        logger.info(\"Model is:\" + JsonUtil.toJsonString(model));\n        List<Map<String, Object>> nodeList = (List<Map<String, Object>>)model.get(0).get(\"nodes\");\n        Map<String, Object> node001 = nodeList.stream().filter(map -> map.get(\"id\").equals(\"node001\")).findFirst().get();\n        assertEquals(((Map<String, Object>)((Map<String, Object>)node001.get(\"properties\")).get(\"compensateAction\")).get(\"createExp\"), \"@compensate1Action\");\n        Map<String, Object> node003 = nodeList.stream().filter(map -> map.get(\"id\").equals(\"node003\")).findFirst().get();\n        assertEquals(((Map<String, Object>)node003.get(\"action\")).get(\"type\"), \"compensate\");\n        Map<String, Object> node004 = nodeList.stream().filter(map -> map.get(\"id\").equals(\"node004\")).findFirst().get();\n        assertEquals(((Map<String, Object>)node004.get(\"action\")).get(\"type\"), \"compensate\");\n    }\n   \n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/cases/converter/BpmnTestService.java",
    "content": "package com.jd.easyflow.flow.bpmn.cases.converter;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\npublic class BpmnTestService {\n    \n    private static final Logger logger = LoggerFactory.getLogger(BpmnTestService.class);\n\n    public void doScriptTask1() {\n        logger.info(\"Script task1 execute\");\n    }\n    \n    public void doScriptTask2() {\n        logger.info(\"Script task2 execute\");\n    }\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/cases/defaultflow/DefaultFlowTest.java",
    "content": "package com.jd.easyflow.flow.bpmn.cases.defaultflow;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertTrue;\n\nimport java.util.List;\n\nimport org.junit.Test;\n\nimport com.jd.easyflow.flow.bpmn.BpmnFlowParser;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\nimport com.jd.easyflow.flow.util.FlowUtil;\n\n/**\n * \n * @author liyuliang5\n */\npublic class DefaultFlowTest {\n\n    /**\n     * test bpmn default flow.\n     */\n    @Test\n    public void testDefaultFlow001() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowParser(new BpmnFlowParser());\n        flowEngine.setFlowPath(\"classpath:flow/cases/defaultflow/default_flow_001.bpmn\");\n        flowEngine.init();\n        \n        FlowParam param = new FlowParam(\"default_flow_001\");        \n        FlowResult result = flowEngine.execute(param);\n        List<String> endNodeIds = FlowUtil.nodeIdsOfNodeContextList(result.getContext().getEndNodes());\n        assertEquals(1, endNodeIds.size());\n        assertTrue(endNodeIds.contains(\"node1\"));\n        \n    }\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/cases/extension/BpmnExtensionTest.java",
    "content": "package com.jd.easyflow.flow.bpmn.cases.extension;\n\nimport java.io.IOException;\nimport java.util.List;\nimport java.util.Map;\n\nimport javax.xml.stream.FactoryConfigurationError;\nimport javax.xml.stream.XMLInputFactory;\nimport javax.xml.stream.XMLStreamException;\nimport javax.xml.stream.XMLStreamReader;\n\nimport org.activiti.bpmn.converter.BpmnXMLConverter;\nimport org.activiti.bpmn.model.BpmnModel;\nimport org.activiti.bpmn.model.Process;\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.core.io.Resource;\nimport org.springframework.core.io.support.PathMatchingResourcePatternResolver;\n\nimport com.jd.easyflow.flow.bpmn.converter.BpmnConverter;\nimport com.jd.easyflow.flow.exception.FlowException;\nimport com.jd.easyflow.flow.util.JsonUtil;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class BpmnExtensionTest {\n    \n    private static final Logger logger = LoggerFactory.getLogger(BpmnExtensionTest.class);\n\n    @Test\n    public void testExtension() {\n        XMLStreamReader reader = null;\n        try {\n            reader = XMLInputFactory.newFactory().createXMLStreamReader(this.getClass().getResourceAsStream(\"/flow/cases/extension/process_1.bpmn\"));\n        } catch (XMLStreamException | FactoryConfigurationError e) {\n            throw new FlowException(\"BPMN parse error\", e);\n        }\n        // Parse BPMN\n        BpmnXMLConverter bpmnXmlConverter = new BpmnXMLConverter();\n        BpmnModel bpmnModel = bpmnXmlConverter.convertToBpmnModel(reader);\n        // BPMN to Easy Flow\n        Process process = bpmnModel.getProcesses().get(0);\n    }\n    \n    @Test\n    public void testConvert() throws IOException {\n        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();\n        Resource resource = resolver.getResource(\"classpath:flow/cases/extension/process_1.bpmn\");\n        List<Map<String, Object>> model = BpmnConverter.convert(resource.getInputStream());\n        logger.info(\"Model is:\" + JsonUtil.toJsonString(model));\n    }\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/cases/inclusive/BpmnInclusiveTest.java",
    "content": "package com.jd.easyflow.flow.bpmn.cases.inclusive;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertTrue;\n\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport org.junit.Test;\n\nimport com.jd.easyflow.flow.bpmn.BpmnFlowParser;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\nimport com.jd.easyflow.flow.util.FlowUtil;\n\n/**\n * BPMN inclusive test.\n * @author liyuliang5\n *\n */\npublic class BpmnInclusiveTest {\n\n    /**\n     * test bpmn inclusive nodes.\n     */\n    @Test\n    public void testInclusive001() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowParser(new BpmnFlowParser());\n        flowEngine.setFlowPath(\"classpath:flow/cases/inclusive/flow_inclusive001.bpmn\");\n        flowEngine.init();\n        \n        FlowParam param = new FlowParam(\"flow_bpmn_inclusive001\");\n        param.setParam(1);\n        \n        FlowResult result = flowEngine.execute(param);\n        List<String> endNodeIds = FlowUtil.nodeIdsOfNodeContextList(result.getContext().getEndNodes());\n        assertEquals(1, endNodeIds.size());\n        assertTrue(endNodeIds.contains(\"END\"));\n        \n    }\n    \n    /**\n     * test bpmn inclusive nodes.\n     */\n    @Test\n    public void testInclusive002() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowParser(new BpmnFlowParser());\n        flowEngine.setFlowPath(\"classpath:flow/cases/inclusive/flow_inclusive002.bpmn\");\n        flowEngine.init();\n        \n        FlowParam param = new FlowParam(\"Inclusive002\");\n        Map<String, Object> bizParam = new HashMap<>();\n        param.setParam(bizParam);\n        bizParam.put(\"C1\", true);\n        bizParam.put(\"C2\", true);\n        bizParam.put(\"C3\", true);\n        bizParam.put(\"C4\", false);\n        \n        FlowResult result = flowEngine.execute(param);\n        List<String> endNodeIds = FlowUtil.nodeIdsOfNodeContextList(result.getContext().getEndNodes());\n        assertTrue(endNodeIds.contains(\"End\"));\n        \n    }\n    \n    /**\n     * test bpmn inclusive nodes.\n     */\n    @Test\n    public void testInclusive003() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowParser(new BpmnFlowParser());\n        flowEngine.setFlowPath(\"classpath:flow/cases/inclusive/flow_inclusive002.bpmn\");\n        flowEngine.init();\n        \n        FlowParam param = new FlowParam(\"Inclusive002\");\n        Map<String, Object> bizParam = new HashMap<>();\n        param.setParam(bizParam);\n        bizParam.put(\"C1\", true);\n        bizParam.put(\"C2\", false);\n        bizParam.put(\"C3\", true);\n        bizParam.put(\"C4\", false);\n        \n        FlowResult result = flowEngine.execute(param);\n        List<String> endNodeIds = FlowUtil.nodeIdsOfNodeContextList(result.getContext().getEndNodes());\n        assertTrue(endNodeIds.contains(\"End\"));\n        \n    }\n    \n    /**\n     * test bpmn inclusive nodes.\n     */\n    @Test\n    public void testInclusive004() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowParser(new BpmnFlowParser());\n        flowEngine.setFlowPath(\"classpath:flow/cases/inclusive/flow_inclusive002.bpmn\");\n        flowEngine.init();\n        \n        FlowParam param = new FlowParam(\"Inclusive002\");\n        Map<String, Object> bizParam = new HashMap<>();\n        param.setParam(bizParam);\n        bizParam.put(\"C1\", false);\n        bizParam.put(\"C2\", true);\n        bizParam.put(\"C3\", true);\n        bizParam.put(\"C4\", false);\n        \n        FlowResult result = flowEngine.execute(param);\n        List<String> endNodeIds = FlowUtil.nodeIdsOfNodeContextList(result.getContext().getEndNodes());\n        assertTrue(endNodeIds.contains(\"End\"));\n        \n    }\n    \n    /**\n     * test bpmn inclusive nodes.\n     */\n    @Test\n    public void testInclusive005() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowParser(new BpmnFlowParser());\n        flowEngine.setFlowPath(\"classpath:flow/cases/inclusive/flow_inclusive002.bpmn\");\n        flowEngine.init();\n        \n        FlowParam param = new FlowParam(\"Inclusive002\");\n        Map<String, Object> bizParam = new HashMap<>();\n        param.setParam(bizParam);\n        bizParam.put(\"C1\", false);\n        bizParam.put(\"C2\", false);\n        bizParam.put(\"C3\", true);\n        bizParam.put(\"C4\", false);\n        \n        FlowResult result = flowEngine.execute(param);\n        List<String> endNodeIds = FlowUtil.nodeIdsOfNodeContextList(result.getContext().getEndNodes());\n        assertTrue(! endNodeIds.contains(\"End\"));\n        \n    }\n    \n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/cases/logflag/LogFlagTest.java",
    "content": "package com.jd.easyflow.flow.bpmn.cases.logflag;\n\nimport org.junit.Test;\n\nimport com.jd.easyflow.flow.bpmn.BpmnFlowParser;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\n\n/**\n * \n * @author liyuliang5\n */\npublic class LogFlagTest {\n\n    /**\n     * test log flag.\n     */\n    @Test\n    public void testLogFlag001() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowParser(new BpmnFlowParser());\n        flowEngine.setFlowPath(\"classpath:flow/cases/logflag/logflag_001.bpmn\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"Process_1\");\n        FlowResult result = flowEngine.execute(param);\n    }\n    \n    /**\n     * test log flag.\n     */\n    @Test\n    public void testLogFlag002() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowParser(new BpmnFlowParser());\n        flowEngine.setFlowPath(\"classpath:flow/cases/logflag/logflag_001.bpmn\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"Process_1\");\n        param.setLogFlag(true);\n        FlowResult result = flowEngine.execute(param);\n    }\n    \n    /**\n     * test log flag.\n     */\n    @Test\n    public void testLogFlag003() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowParser(new BpmnFlowParser());\n        flowEngine.setFlowPath(\"classpath:flow/cases/logflag/logflag_001.bpmn\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"Process_1\");\n        param.setLogFlag(false);\n        FlowResult result = flowEngine.execute(param);\n    }\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/cases/parallel/BpmnParallelTest.java",
    "content": "package com.jd.easyflow.flow.bpmn.cases.parallel;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.CountDownLatch;\nimport java.util.concurrent.Executor;\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.TimeUnit;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.bpmn.BpmnFlowParser;\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowContextImpl;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.InitContext;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.definition.DefConstants;\nimport com.jd.easyflow.flow.model.parser.param.FlowParseParam;\nimport com.jd.easyflow.flow.util.FlowConstants;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class BpmnParallelTest {\n    \n    private static final Logger logger = LoggerFactory.getLogger(BpmnParallelTest.class);\n\n    /**\n     * test bpmn parallel nodes.\n     */\n    @Test\n    public void testParallel001() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowParser(new BpmnFlowParser());\n        flowEngine.setFlowPath(\"classpath:flow/cases/parallel/flow_parallel001.bpmn\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"flow_bpmn_parallel001\");\n        FlowResult result = flowEngine.execute(param);\n    }\n    \n    \n    @Test\n    public void testMultiParallelSubFlow001() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowParser(new BpmnFlowParser());\n        flowEngine.setFlowPath(\"classpath:flow/cases/parallel/flow_multi_parallel_subflow_001.bpmn\");\n        flowEngine.init();\n        \n        FlowParam param = new FlowParam(\"multi_parallel_subflow_001\");\n        param.put(\"recordList\", Arrays.asList(1, 2, 3, 4, 5, 6));\n        FlowResult result = flowEngine.execute(param);\n    }\n    \n    \n    \n    public static class MainFlowNodeAction implements NodeAction {\n        \n        private Flow flow;\n        \n        @Override\n        public <T> T execute(NodeContext nodeContext, FlowContext context) {\n            List<Integer> recordList = context.getParam().get(\"recordList\");\n            Map<Integer, Object> result = new ConcurrentHashMap<Integer, Object>();\n            CountDownLatch latch = new CountDownLatch(recordList.size());\n            Executor executor = Executors.newFixedThreadPool(3);\n            for (Integer i : recordList) {\n                executor.execute(() -> {\n                    try {\n                        FlowParam subParam = new FlowParam();\n                        subParam.put(\"record\", i);\n                        FlowContext subContext = new FlowContextImpl();\n                        subContext.setFlow(flow);\n                        subParam.setContext(subContext);\n                        FlowResult flowResult = context.getFlowEngine().execute(subParam);\n                        result.put(i, flowResult.get(\"subResult\"));\n                    } finally {\n                        latch.countDown();\n                    }\n                });\n            }\n            try {\n                latch.await(1, TimeUnit.SECONDS);\n            } catch (InterruptedException e) {\n                throw new RuntimeException(e);\n            }\n            logger.info(\"all subResult:\" + result);\n            return null;\n        }\n        \n        @Override\n        public void init(InitContext initContext, Object parent) {\n            FlowNode node = (FlowNode) parent;\n            Map<String, Object> flowDef = (Map<String, Object>) node.getProperty(DefConstants.COMMON_PROP_FLOW);\n            FlowParseParam param = new FlowParseParam();\n            param.setObjectDefinition(flowDef);\n            param.setParseEl(initContext.isParseEl());\n            List<Flow> flowList = initContext.getFlowParser().parse(param);\n            initContext.getFlowList().addAll(flowList);\n            Flow subFlow = flowList.get(0);\n            flow = subFlow;\n        }\n        \n    }\n    \n    public static class SubFlowNodeAction implements NodeAction {\n\n        @Override\n        public <T> T execute(NodeContext nodeContext, FlowContext context) {\n            logger.info(\"subFlow\");\n            int param = context.getParam().get(\"record\");\n            context.getResult().put(\"subResult\", param * param);\n            \n            return null;\n        }\n        \n    }\n    \n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/cases/share/nodeaction/TestEventNodeAction.java",
    "content": "package com.jd.easyflow.flow.bpmn.cases.share.nodeaction;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * Test event node action\n * @author liyuliang5\n *\n */\npublic class TestEventNodeAction implements NodeAction  {\n    \n    private static final Logger logger = LoggerFactory.getLogger(TestEventNodeAction.class);\n\n    @Override\n    public Map<String, Object> execute(NodeContext nodeContext, FlowContext context) {\n        logger.info(\"Start execute event node action\");\n        Map<String, Object> result =  new HashMap<>();\n        result.put(\"result1\", 1);\n        return result;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/cases/share/nodeaction/TestStepAction.java",
    "content": "package com.jd.easyflow.flow.bpmn.cases.share.nodeaction;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class TestStepAction implements NodeAction {\n\n    private static final Logger logger = LoggerFactory.getLogger(TestStepAction.class);\n\n    @Override\n    public <T> T execute(NodeContext nodeContext, FlowContext context) {\n        FlowNode flowNode = context.getFlow().getNode(nodeContext.getNodeId());\n        boolean exception = Boolean.TRUE.equals(flowNode.getProperty(\"exception\"));\n        if (exception) {\n            logger.info(\"exception\");\n            throw new RuntimeException(\"exception\");\n        }\n        Integer sleep = flowNode.getProperty(\"sleep\");\n        if (sleep != null) {\n            logger.info(\"Sleep time is:\" + sleep);\n            try {\n                Thread.sleep(sleep);\n            } catch (InterruptedException e) {\n                throw new RuntimeException(e);\n            }\n        }\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/cases/subprocess/BpmnSubProcessTest.java",
    "content": "package com.jd.easyflow.flow.bpmn.cases.subprocess;\n\nimport org.junit.Test;\n\nimport com.jd.easyflow.flow.bpmn.BpmnFlowParser;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\n\n/**\n * Bpmn sub flow test.\n * @author liyuliang5\n *\n */\npublic class BpmnSubProcessTest {\n\n    /**\n     * test bpmn sub flow.\n     */\n    @Test\n    public void testSubFlow001() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowParser(new BpmnFlowParser());\n        flowEngine.setFlowPath(\"classpath:flow/cases/subprocess/*.bpmn\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"subprocess_test_001\");\n        FlowResult result = flowEngine.execute(param);\n    }\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/cases/terminate/BpmnTerminateTest.java",
    "content": "package com.jd.easyflow.flow.bpmn.cases.terminate;\n\nimport org.junit.Test;\n\nimport com.jd.easyflow.flow.bpmn.BpmnFlowParser;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\n\n/**\n * BPMN Terminate test.\n * @author liyuliang5\n *\n */\npublic class BpmnTerminateTest {\n\n    /**\n     * test bpmn terminate end event.\n     */\n    @Test\n    public void testTerminate001() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowParser(new BpmnFlowParser());\n        flowEngine.setFlowPath(\"classpath:flow/cases/terminate/flow_terminate001.bpmn\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"flow_bpmn_terminate001\");\n        FlowResult result = flowEngine.execute(param);\n    }\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/cases/throwevent/BpmnThrowEventTest.java",
    "content": "package com.jd.easyflow.flow.bpmn.cases.throwevent;\n\nimport java.io.IOException;\nimport java.util.List;\nimport java.util.Map;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.core.io.Resource;\nimport org.springframework.core.io.support.PathMatchingResourcePatternResolver;\n\nimport com.jd.easyflow.flow.bpmn.cases.converter.BpmnConverterTest;\nimport com.jd.easyflow.flow.bpmn.converter.BpmnConverter;\nimport com.jd.easyflow.flow.util.FlowIOUtil;\nimport com.jd.easyflow.flow.util.JsonPrettyHelper;\nimport com.jd.easyflow.flow.util.JsonUtil;\n\n/**\n * \n * @author liyuliang5\n */\npublic class BpmnThrowEventTest {\n\n\n    private static final Logger logger = LoggerFactory.getLogger(BpmnThrowEventTest.class);\n\n    /**\n     * test convert.\n     * @throws IOException\n     */\n    @Test\n    public void testConvert() throws IOException {\n        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();\n        Resource resource = resolver.getResource(\"classpath:flow/cases/throwevent/flow_throwevent001.bpmn\");\n        List<Map<String, Object>> model = BpmnConverter.convert(resource.getInputStream());\n        String flowPrettyConf =  FlowIOUtil.toString(BpmnConverterTest.class.getResourceAsStream(\"/pretty/pretty-flow.json\"));\n        String pretty = JsonPrettyHelper.pretty(model, JsonUtil.parseObject(flowPrettyConf, Map.class));\n        logger.info(\"Model is:\" + pretty);\n    }\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/ext/cases/chain/ChainTest.java",
    "content": "package com.jd.easyflow.flow.bpmn.ext.cases.chain;\n\nimport static org.junit.Assert.assertEquals;\n\nimport java.util.function.Function;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.bpmn.BpmnFlowParser;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\nimport com.jd.easyflow.flow.ext.chain.ChainInvoker;\n\npublic class ChainTest {\n    \n    private static final Logger logger = LoggerFactory.getLogger(ChainTest.class);\n\n    /**\n     * Test orchestrate plugins by nodes. \n     */\n    @Test\n    public void testChain1() {\n        // Init flow engine.\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowParser(new BpmnFlowParser());\n        flowEngine.setFlowPath(\"classpath:flow/ext/cases/chain/flow_chaintest1.bpmn\");\n        flowEngine.init();\n        \n        ChainInvoker invoker = new ChainInvoker();\n        invoker.setFlowEngine(flowEngine);\n        \n        // Execute flow instance1.\n        Function<Object, Object> targetAction = (o) -> {\n            return new ChainTestService().execute();\n        };\n        Object result = invoker.invoke(\"flow_chaintest1\", null, targetAction);\n        logger.info(\"Execute result:\" + result);\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/ext/cases/chain/ChainTestService.java",
    "content": "package com.jd.easyflow.flow.bpmn.ext.cases.chain;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\npublic class ChainTestService {\n    \n    private static final Logger logger = LoggerFactory.getLogger(ChainTestService.class);\n\n    public Object execute() {\n        logger.info(\"ChainTestService execute\");\n        return \"abc\";\n    }\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/ext/cases/chain/Plugin1.java",
    "content": "package com.jd.easyflow.flow.bpmn.ext.cases.chain;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.ext.chain.BaseChainPlugin;\nimport com.jd.easyflow.flow.model.NodeContext;\n\npublic class Plugin1 extends BaseChainPlugin {\n    \n    private static final Logger logger = LoggerFactory.getLogger(Plugin1.class);\n    \n\n    @Override\n    public boolean preHandle(NodeContext nodeContext, FlowContext context) {\n        logger.info(\"Plugin1 pre handle\");\n        return true;\n    }\n\n    @Override\n    public void postHandleNormal(NodeContext nodeContext, FlowContext context) {\n        logger.info(\"Plugin1 post handle normal\");\n    }\n\n    @Override\n    public void postHandleException(Throwable t, NodeContext nodeContext, FlowContext context) {\n        logger.info(\"Plugin1 post handle exception\");\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/ext/cases/chain/Plugin2.java",
    "content": "package com.jd.easyflow.flow.bpmn.ext.cases.chain;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.ext.chain.BaseChainPlugin;\nimport com.jd.easyflow.flow.model.NodeContext;\n\npublic class Plugin2 extends BaseChainPlugin {\n    \n    private static final Logger logger = LoggerFactory.getLogger(Plugin2.class);\n    \n\n    @Override\n    public boolean preHandle(NodeContext nodeContext, FlowContext context) {\n        logger.info(\"Plugin2 pre handle\");\n        return true;\n    }\n\n    @Override\n    public void postHandleNormal(NodeContext nodeContext, FlowContext context) {\n        logger.info(\"Plugin2 post handle normal\");\n    }\n\n    @Override\n    public void postHandleException(Throwable t, NodeContext nodeContext, FlowContext context) {\n        logger.info(\"Plugin2 post handle exception\");\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/ext/cases/chain/Plugin3.java",
    "content": "package com.jd.easyflow.flow.bpmn.ext.cases.chain;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.ext.chain.BaseChainPlugin;\nimport com.jd.easyflow.flow.model.NodeContext;\n\npublic class Plugin3 extends BaseChainPlugin {\n    \n    private static final Logger logger = LoggerFactory.getLogger(Plugin3.class);\n    \n\n    @Override\n    public boolean preHandle(NodeContext nodeContext, FlowContext context) {\n        logger.info(\"Plugin3 pre handle\");\n        return true;\n    }\n\n    @Override\n    public void postHandleNormal(NodeContext nodeContext, FlowContext context) {\n        logger.info(\"Plugin3 post handle normal\");\n    }\n\n    @Override\n    public void postHandleException(Throwable t, NodeContext nodeContext, FlowContext context) {\n        logger.info(\"Plugin3 post handle exception\");\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/quickstart/QuickStart001Node01Action.java",
    "content": "package com.jd.easyflow.flow.bpmn.quickstart;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class QuickStart001Node01Action implements NodeAction {\n    \n    private static final Logger logger = LoggerFactory.getLogger(QuickStart001Node01Action.class);\n\n    @Override\n    public <T> T execute(NodeContext nodeContext, FlowContext context) {\n        logger.info(\"Execute Node 001\");\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/quickstart/QuickStart002Node01Action.java",
    "content": "package com.jd.easyflow.flow.bpmn.quickstart;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class QuickStart002Node01Action implements NodeAction {\n    \n    private static final Logger logger = LoggerFactory.getLogger(QuickStart002Node01Action.class);\n\n    @Override\n    public <T> T execute(NodeContext nodeContext, FlowContext context) {\n        logger.info(\"Execute Node 002\");\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/quickstart/QuickStart003Node01Action.java",
    "content": "package com.jd.easyflow.flow.bpmn.quickstart;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class QuickStart003Node01Action implements NodeAction {\n    \n    private static final Logger logger = LoggerFactory.getLogger(QuickStart003Node01Action.class);\n\n    @Override\n    public <T> T execute(NodeContext nodeContext, FlowContext context) {\n        logger.info(\"Execute Node 003\");\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/java/com/jd/easyflow/flow/bpmn/quickstart/QuickStartTest.java",
    "content": "package com.jd.easyflow.flow.bpmn.quickstart;\n\nimport static org.junit.Assert.assertEquals;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.bpmn.BpmnFlowParser;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class QuickStartTest {\n    \n    private static final Logger logger = LoggerFactory.getLogger(QuickStartTest.class);\n\n    @Test\n    public void testQuickStart001() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowParser(new BpmnFlowParser());\n        flowEngine.setFlowPath(\"classpath:flow/quickstart/quickstart_001.bpmn\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"quickstart_001\");\n        FlowResult result = flowEngine.execute(param);\n        logger.info(\"Execute finish, current node is:\" + result.getContext().getEndNodes().get(0).getNodeId());\n        assertEquals(\"node003\", result.getContext().getEndNodes().get(0).getNodeId());\n    }\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/resources/flow/cases/callactivity/flow_callactivity_test_001.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"callactivity_test_001\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"StartEvent_1\">\n      <bpmn:outgoing>Flow_057eq7h</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:sequenceFlow id=\"Flow_057eq7h\" sourceRef=\"StartEvent_1\" targetRef=\"Activity_0zkhht5\" />\n    <bpmn:callActivity id=\"Activity_0zkhht5\" calledElement=\"sub-of-called\">\n      <bpmn:incoming>Flow_057eq7h</bpmn:incoming>\n      <bpmn:outgoing>Flow_0u94yvk</bpmn:outgoing>\n    </bpmn:callActivity>\n    <bpmn:endEvent id=\"Event_0p3jrdk\">\n      <bpmn:incoming>Flow_0u94yvk</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:sequenceFlow id=\"Flow_0u94yvk\" sourceRef=\"Activity_0zkhht5\" targetRef=\"Event_0p3jrdk\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNEdge id=\"Flow_057eq7h_di\" bpmnElement=\"Flow_057eq7h\" waypoints=\"\">\n        <di:waypoint x=\"209\" y=\"120\" />\n        <di:waypoint x=\"260\" y=\"120\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_0u94yvk_di\" bpmnElement=\"Flow_0u94yvk\" waypoints=\"\">\n        <di:waypoint x=\"360\" y=\"120\" />\n        <di:waypoint x=\"412\" y=\"120\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"173\" y=\"102\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0lnzd6v_di\" bpmnElement=\"Activity_0zkhht5\">\n        <dc:Bounds x=\"260\" y=\"80\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0p3jrdk_di\" bpmnElement=\"Event_0p3jrdk\">\n        <dc:Bounds x=\"412\" y=\"102\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/resources/flow/cases/callactivity/flow_sub_of_called.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"sub-of-called\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"StartEvent_1\">\n      <bpmn:outgoing>Flow_01stv9z</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:scriptTask id=\"Activity_1bc2cs0\">\n      <bpmn:incoming>Flow_01stv9z</bpmn:incoming>\n      <bpmn:outgoing>Flow_0jjnarz</bpmn:outgoing>\n      <bpmn:script>T(java.lang.System).out.println(\"hello\")</bpmn:script>\n    </bpmn:scriptTask>\n    <bpmn:sequenceFlow id=\"Flow_01stv9z\" sourceRef=\"StartEvent_1\" targetRef=\"Activity_1bc2cs0\" />\n    <bpmn:endEvent id=\"Event_0xp45b5\">\n      <bpmn:incoming>Flow_0jjnarz</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:sequenceFlow id=\"Flow_0jjnarz\" sourceRef=\"Activity_1bc2cs0\" targetRef=\"Event_0xp45b5\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"sub-of-called\">\n      <bpmndi:BPMNEdge id=\"Flow_01stv9z_di\" bpmnElement=\"Flow_01stv9z\" waypoints=\"\">\n        <di:waypoint x=\"209\" y=\"120\" />\n        <di:waypoint x=\"260\" y=\"120\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_0jjnarz_di\" bpmnElement=\"Flow_0jjnarz\" waypoints=\"\">\n        <di:waypoint x=\"360\" y=\"120\" />\n        <di:waypoint x=\"412\" y=\"120\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"173\" y=\"102\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1bc2cs0_di\" bpmnElement=\"Activity_1bc2cs0\">\n        <dc:Bounds x=\"260\" y=\"80\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0xp45b5_di\" bpmnElement=\"Event_0xp45b5\">\n        <dc:Bounds x=\"412\" y=\"102\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/resources/flow/cases/chain/flow_chaintest1.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:easyflow=\"http://jd.com/easyflow\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"flow_chaintest1\" isExecutable=\"false\">\n    <bpmn:scriptTask id=\"plugin1\" name=\"Plugin1\" scriptFormat=\"createExp\">\n      <bpmn:extensionElements>\n        <easyflow:extProperties>{\"commentWidth\":159,\"commentPosition\":{\"top\":18,\"left\":71}}</easyflow:extProperties>\n        <easyflow:conditionType>exclusive</easyflow:conditionType>\n      </bpmn:extensionElements>\n      <bpmn:incoming>Flow_0modaq2</bpmn:incoming>\n      <bpmn:incoming>Flow_1h77pr5</bpmn:incoming>\n      <bpmn:outgoing>Flow_161s0ml</bpmn:outgoing>\n      <bpmn:outgoing>Flow_1ipaej0</bpmn:outgoing>\n      <bpmn:script>new com.jd.easyflow.flow.bpmn.cases.chain.FlowChainTest.TestPlugin(\"Plugin1\")</bpmn:script>\n    </bpmn:scriptTask>\n    <bpmn:scriptTask id=\"plugin2\" name=\"Plugin2\" scriptFormat=\"createExp\">\n      <bpmn:extensionElements>\n        <easyflow:extProperties>{\"commentWidth\":155,\"commentPosition\":{\"top\":21,\"left\":68}}</easyflow:extProperties>\n        <easyflow:conditionType>exclusive</easyflow:conditionType>\n      </bpmn:extensionElements>\n      <bpmn:incoming>Flow_161s0ml</bpmn:incoming>\n      <bpmn:incoming>Flow_0hype9i</bpmn:incoming>\n      <bpmn:outgoing>Flow_0nnnvyb</bpmn:outgoing>\n      <bpmn:outgoing>Flow_1h77pr5</bpmn:outgoing>\n      <bpmn:script>new com.jd.easyflow.flow.bpmn.cases.chain.FlowChainTest.TestPlugin(\"Plugin2\")</bpmn:script>\n    </bpmn:scriptTask>\n    <bpmn:sequenceFlow id=\"Flow_161s0ml\" sourceRef=\"plugin1\" targetRef=\"plugin2\">\n      <bpmn:extensionElements>\n        <easyflow:extProperties>{\"commentPosition\":{\"top\":-52,\"left\":4},\"commentWidth\":256}</easyflow:extProperties>\n      </bpmn:extensionElements>\n      <bpmn:conditionExpression xsi:type=\"bpmn:tFormalExpression\">context.get('chainStage')=='PRE'</bpmn:conditionExpression>\n    </bpmn:sequenceFlow>\n    <bpmn:scriptTask id=\"plugin3\" name=\"Plugin3\" scriptFormat=\"createExp\">\n      <bpmn:extensionElements>\n        <easyflow:extProperties>{\"commentWidth\":152,\"commentPosition\":{\"top\":19,\"left\":70}}</easyflow:extProperties>\n        <easyflow:conditionType>exclusive</easyflow:conditionType>\n      </bpmn:extensionElements>\n      <bpmn:incoming>Flow_0nnnvyb</bpmn:incoming>\n      <bpmn:incoming>Flow_0woq951</bpmn:incoming>\n      <bpmn:outgoing>Flow_1rtbe85</bpmn:outgoing>\n      <bpmn:outgoing>Flow_0hype9i</bpmn:outgoing>\n      <bpmn:script>new com.jd.easyflow.flow.bpmn.cases.chain.FlowChainTest.TestPlugin(\"Plugin3\")</bpmn:script>\n    </bpmn:scriptTask>\n    <bpmn:sequenceFlow id=\"Flow_0nnnvyb\" sourceRef=\"plugin2\" targetRef=\"plugin3\">\n      <bpmn:extensionElements>\n        <easyflow:extProperties>{\"commentWidth\":252,\"commentPosition\":{\"top\":-51,\"left\":0}}</easyflow:extProperties>\n      </bpmn:extensionElements>\n      <bpmn:conditionExpression xsi:type=\"bpmn:tFormalExpression\">context.get('chainStage')=='PRE'</bpmn:conditionExpression>\n    </bpmn:sequenceFlow>\n    <bpmn:scriptTask id=\"realTarget\" name=\"Request Execute\" scriptFormat=\"createExp\">\n      <bpmn:extensionElements>\n        <easyflow:extProperties>{\"commentWidth\":164,\"commentPosition\":{\"top\":87,\"left\":4}}</easyflow:extProperties>\n        <easyflow:conditionType>exclusive</easyflow:conditionType>\n      </bpmn:extensionElements>\n      <bpmn:incoming>Flow_1rtbe85</bpmn:incoming>\n      <bpmn:outgoing>Flow_0woq951</bpmn:outgoing>\n      <bpmn:script>new com.jd.easyflow.flow.ext.chain.TargetAction()</bpmn:script>\n    </bpmn:scriptTask>\n    <bpmn:sequenceFlow id=\"Flow_1rtbe85\" sourceRef=\"plugin3\" targetRef=\"realTarget\">\n      <bpmn:extensionElements>\n        <easyflow:extProperties>{\"commentPosition\":{\"top\":-52,\"left\":12},\"commentWidth\":248}</easyflow:extProperties>\n      </bpmn:extensionElements>\n      <bpmn:conditionExpression xsi:type=\"bpmn:tFormalExpression\">context.get('chainStage')=='PRE'</bpmn:conditionExpression>\n    </bpmn:sequenceFlow>\n    <bpmn:startEvent id=\"start\" name=\"Start\">\n      <bpmn:outgoing>Flow_0modaq2</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:sequenceFlow id=\"Flow_0modaq2\" sourceRef=\"start\" targetRef=\"plugin1\" />\n    <bpmn:endEvent id=\"end\" name=\"End\">\n      <bpmn:incoming>Flow_1ipaej0</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:sequenceFlow id=\"Flow_1h77pr5\" sourceRef=\"plugin2\" targetRef=\"plugin1\">\n      <bpmn:extensionElements>\n        <easyflow:extProperties>{\"commentWidth\":239,\"commentPosition\":{\"top\":21,\"left\":1}}</easyflow:extProperties>\n      </bpmn:extensionElements>\n      <bpmn:conditionExpression xsi:type=\"bpmn:tFormalExpression\">context.get('chainStage')=='POST'</bpmn:conditionExpression>\n    </bpmn:sequenceFlow>\n    <bpmn:sequenceFlow id=\"Flow_0hype9i\" sourceRef=\"plugin3\" targetRef=\"plugin2\">\n      <bpmn:extensionElements>\n        <easyflow:extProperties>{\"commentWidth\":239,\"commentPosition\":{\"top\":18,\"left\":2}}</easyflow:extProperties>\n      </bpmn:extensionElements>\n      <bpmn:conditionExpression xsi:type=\"bpmn:tFormalExpression\">context.get('chainStage')=='POST'</bpmn:conditionExpression>\n    </bpmn:sequenceFlow>\n    <bpmn:sequenceFlow id=\"Flow_0woq951\" sourceRef=\"realTarget\" targetRef=\"plugin3\" />\n    <bpmn:sequenceFlow id=\"Flow_1ipaej0\" sourceRef=\"plugin1\" targetRef=\"end\">\n      <bpmn:extensionElements>\n        <easyflow:extProperties>{\"commentWidth\":237,\"commentPosition\":{\"top\":10,\"left\":1}}</easyflow:extProperties>\n      </bpmn:extensionElements>\n      <bpmn:conditionExpression xsi:type=\"bpmn:tFormalExpression\">context.get('chainStage')=='POST'</bpmn:conditionExpression>\n    </bpmn:sequenceFlow>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"flow_chaintest1\">\n      <bpmndi:BPMNShape id=\"Activity_1rpzq9o_di\" bpmnElement=\"plugin1\">\n        <dc:Bounds x=\"380\" y=\"80\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1w952ml_di\" bpmnElement=\"plugin2\">\n        <dc:Bounds x=\"600\" y=\"80\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_07q7d4a_di\" bpmnElement=\"plugin3\">\n        <dc:Bounds x=\"800\" y=\"80\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1epnn2p_di\" bpmnElement=\"realTarget\">\n        <dc:Bounds x=\"1020\" y=\"80\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_02b4nma_di\" bpmnElement=\"start\">\n        <dc:Bounds x=\"232\" y=\"72\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"239\" y=\"115\" width=\"23\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1mifkab_di\" bpmnElement=\"end\">\n        <dc:Bounds x=\"232\" y=\"132\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"239\" y=\"175\" width=\"23\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Flow_161s0ml_di\" bpmnElement=\"Flow_161s0ml\" waypoints=\"\">\n        <di:waypoint x=\"480\" y=\"100\" />\n        <di:waypoint x=\"600\" y=\"100\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_0nnnvyb_di\" bpmnElement=\"Flow_0nnnvyb\" waypoints=\"\">\n        <di:waypoint x=\"700\" y=\"100\" />\n        <di:waypoint x=\"800\" y=\"100\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_1rtbe85_di\" bpmnElement=\"Flow_1rtbe85\" waypoints=\"\">\n        <di:waypoint x=\"900\" y=\"100\" />\n        <di:waypoint x=\"1020\" y=\"100\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_0modaq2_di\" bpmnElement=\"Flow_0modaq2\" waypoints=\"\">\n        <di:waypoint x=\"268\" y=\"90\" />\n        <di:waypoint x=\"380\" y=\"90\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_1h77pr5_di\" bpmnElement=\"Flow_1h77pr5\" waypoints=\"\">\n        <di:waypoint x=\"600\" y=\"140\" />\n        <di:waypoint x=\"480\" y=\"140\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_0hype9i_di\" bpmnElement=\"Flow_0hype9i\" waypoints=\"\">\n        <di:waypoint x=\"800\" y=\"140\" />\n        <di:waypoint x=\"700\" y=\"140\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_0woq951_di\" bpmnElement=\"Flow_0woq951\" waypoints=\"\">\n        <di:waypoint x=\"1020\" y=\"150\" />\n        <di:waypoint x=\"900\" y=\"150\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_1ipaej0_di\" bpmnElement=\"Flow_1ipaej0\" waypoints=\"\">\n        <di:waypoint x=\"380\" y=\"150\" />\n        <di:waypoint x=\"268\" y=\"150\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/resources/flow/cases/converter/compensate001.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:scriptTask id=\"node001\">\n      <bpmn:outgoing>Flow_14hzcpx</bpmn:outgoing>\n    </bpmn:scriptTask>\n    <bpmn:sequenceFlow id=\"Flow_1myfz66\" sourceRef=\"node003\" targetRef=\"node004\" />\n    <bpmn:endEvent id=\"node004\">\n      <bpmn:incoming>Flow_1myfz66</bpmn:incoming>\n      <bpmn:compensateEventDefinition id=\"CompensateEventDefinition_0aacfhb\" />\n    </bpmn:endEvent>\n    <bpmn:intermediateThrowEvent id=\"node003\">\n      <bpmn:incoming>Flow_15q116s</bpmn:incoming>\n      <bpmn:outgoing>Flow_1myfz66</bpmn:outgoing>\n      <bpmn:compensateEventDefinition id=\"CompensateEventDefinition_0rjpq82\" />\n    </bpmn:intermediateThrowEvent>\n    <bpmn:boundaryEvent id=\"Event_0l87x61\" attachedToRef=\"node001\">\n      <bpmn:compensateEventDefinition id=\"CompensateEventDefinition_1ns5zam\" />\n    </bpmn:boundaryEvent>\n    <bpmn:scriptTask id=\"node002\">\n      <bpmn:incoming>Flow_14hzcpx</bpmn:incoming>\n      <bpmn:outgoing>Flow_15q116s</bpmn:outgoing>\n    </bpmn:scriptTask>\n    <bpmn:sequenceFlow id=\"Flow_14hzcpx\" sourceRef=\"node001\" targetRef=\"node002\" />\n    <bpmn:sequenceFlow id=\"Flow_15q116s\" sourceRef=\"node002\" targetRef=\"node003\" />\n    <bpmn:boundaryEvent id=\"Event_1r7rs2h\" attachedToRef=\"node002\">\n      <bpmn:compensateEventDefinition id=\"CompensateEventDefinition_1gw86m2\" />\n    </bpmn:boundaryEvent>\n    <bpmn:scriptTask id=\"node005\" isForCompensation=\"true\" scriptFormat=\"createExp\">\n      <bpmn:script>@compensate1Action</bpmn:script>\n    </bpmn:scriptTask>\n    <bpmn:association id=\"Association_19jcrkv\" associationDirection=\"One\" sourceRef=\"Event_0l87x61\" targetRef=\"node005\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"Activity_1eiudr7_di\" bpmnElement=\"node001\">\n        <dc:Bounds x=\"260\" y=\"80\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1oz7yt4_di\" bpmnElement=\"node003\">\n        <dc:Bounds x=\"582\" y=\"102\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_16xkgbc_di\" bpmnElement=\"node002\">\n        <dc:Bounds x=\"420\" y=\"80\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0dbpsit_di\" bpmnElement=\"node005\">\n        <dc:Bounds x=\"260\" y=\"210\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0f4qy2q_di\" bpmnElement=\"node004\">\n        <dc:Bounds x=\"672\" y=\"102\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1gsl0ad_di\" bpmnElement=\"Event_1r7rs2h\">\n        <dc:Bounds x=\"452\" y=\"142\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_084wpni_di\" bpmnElement=\"Event_0l87x61\">\n        <dc:Bounds x=\"292\" y=\"142\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Flow_1myfz66_di\" bpmnElement=\"Flow_1myfz66\">\n        <di:waypoint x=\"618\" y=\"120\" />\n        <di:waypoint x=\"672\" y=\"120\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_14hzcpx_di\" bpmnElement=\"Flow_14hzcpx\">\n        <di:waypoint x=\"360\" y=\"120\" />\n        <di:waypoint x=\"420\" y=\"120\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_15q116s_di\" bpmnElement=\"Flow_15q116s\">\n        <di:waypoint x=\"520\" y=\"120\" />\n        <di:waypoint x=\"582\" y=\"120\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Association_19jcrkv_di\" bpmnElement=\"Association_19jcrkv\">\n        <di:waypoint x=\"310\" y=\"178\" />\n        <di:waypoint x=\"310\" y=\"210\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/resources/flow/cases/converter/flow001.json",
    "content": "{\n\t\"id\": \"flow001\",\n\t\"name\": \"Mock loan flow\",\n\t\"nodes\": [\n\t\t{\n\t\t\t\"id\": \"CONTRACT_SIGN\",\n\t\t\t\"name\": \"Sign contract\",\n\t\t\t\"properties\": {\"order\": 1},\n\t\t\t\"pre\":null,\n\t\t\t\"action\":{\"exp\":\"new com.jd.easyflow.flow.mockbiz.loan.contract.LoanContractSignBiz().sign()\"},\n\t\t\t\"post\":{\"to\":\"LIMIT_JUDGE\"}\n\t\t},\n\t\t{\n\t\t\t\"id\": \"LIMIT_JUDGE\",\n\t\t\t\"name\": \"Judge limit\",\n\t\t\t\"properties\": {\"order\": 2},\n\t\t\t\"action\":{\"exp\":\"new com.jd.easyflow.flow.mockbiz.limit.LimitBiz().judgeLimit(param.param['amount'])\"},\n\t\t\t\"post\":{\"conditions\":[{\"when\":\"nodeContext.actionResult==true\", \"to\":\"DO_LOAN\"}]}\n\t\t},\n\t\t      {\n            \"id\": \"DO_LOAN\",\n            \"name\": \"Do loan\",\n            \"properties\": {\"order\": 3},\n            \"action\":{\"exp\":\"new com.jd.easyflow.flow.mockbiz.loan.LoanBiz().doLoan()\"}\n        }\n\t]\n}"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/resources/flow/cases/converter/flow_multiple_001.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:collaboration id=\"Collaboration_07yjud7\">\n    <bpmn:participant id=\"Participant_13xme66\" processRef=\"Process_1\" />\n    <bpmn:participant id=\"Participant_0oa3eg3\" processRef=\"Process_0v1pyjn\" />\n  </bpmn:collaboration>\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"StartEvent_1\" />\n  </bpmn:process>\n  <bpmn:process id=\"Process_0v1pyjn\">\n    <bpmn:startEvent id=\"Event_1cscvlk\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Collaboration_07yjud7\">\n      <bpmndi:BPMNShape id=\"Participant_13xme66_di\" bpmnElement=\"Participant_13xme66\" isHorizontal=\"true\">\n        <dc:Bounds x=\"100\" y=\"20\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"173\" y=\"102\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Participant_0oa3eg3_di\" bpmnElement=\"Participant_0oa3eg3\" isHorizontal=\"true\">\n        <dc:Bounds x=\"100\" y=\"320\" width=\"600\" height=\"250\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1cscvlk_di\" bpmnElement=\"Event_1cscvlk\">\n        <dc:Bounds x=\"182\" y=\"372\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/resources/flow/cases/converter/process_1.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- origin at X=0.0 Y=0.0 -->\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:ext=\"http://org.eclipse.bpmn2/ext\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" id=\"Definitions_1\" exporter=\"org.eclipse.bpmn2.modeler.core\" exporterVersion=\"1.5.2.SNAPSHOT-v20200602-1600-B1\" targetNamespace=\"http://org.eclipse.bpmn2/default/process\">\n  <bpmn2:process id=\"process_1\" name=\"Default Process\" isExecutable=\"false\">\n    <bpmn2:startEvent id=\"StartEvent_1\" name=\"Start Event\">\n      <bpmn2:outgoing>SequenceFlow_2</bpmn2:outgoing>\n    </bpmn2:startEvent>\n    <bpmn2:endEvent id=\"EndEvent_1\" name=\"End Event\">\n      <bpmn2:incoming>SequenceFlow_4</bpmn2:incoming>\n    </bpmn2:endEvent>\n    <bpmn2:scriptTask id=\"ScriptTask_1\" name=\"Script task 1\">\n      <bpmn2:incoming>SequenceFlow_2</bpmn2:incoming>\n      <bpmn2:outgoing>SequenceFlow_5</bpmn2:outgoing>\n      <bpmn2:script>new com.jd.easyflow.flow.bpmn.cases.converter.BpmnTestService().doScriptTask1()</bpmn2:script>\n    </bpmn2:scriptTask>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_2\" sourceRef=\"StartEvent_1\" targetRef=\"ScriptTask_1\"/>\n    <bpmn2:scriptTask id=\"ScriptTask_2\" name=\"Script task 2\">\n      <bpmn2:incoming>SequenceFlow_6</bpmn2:incoming>\n      <bpmn2:outgoing>SequenceFlow_4</bpmn2:outgoing>\n      <bpmn2:script>new com.jd.easyflow.flow.bpmn.cases.converter.BpmnTestService().doScriptTask2()</bpmn2:script>\n    </bpmn2:scriptTask>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_4\" sourceRef=\"ScriptTask_2\" targetRef=\"EndEvent_1\"/>\n    <bpmn2:exclusiveGateway id=\"ExclusiveGateway_1\" name=\"Judge\" gatewayDirection=\"Mixed\">\n      <bpmn2:incoming>SequenceFlow_5</bpmn2:incoming>\n      <bpmn2:outgoing>SequenceFlow_6</bpmn2:outgoing>\n      <bpmn2:outgoing>SequenceFlow_10</bpmn2:outgoing>\n    </bpmn2:exclusiveGateway>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_5\" sourceRef=\"ScriptTask_1\" targetRef=\"ExclusiveGateway_1\"/>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_6\" sourceRef=\"ExclusiveGateway_1\" targetRef=\"ScriptTask_2\">\n      <bpmn2:conditionExpression xsi:type=\"bpmn2:tFormalExpression\" id=\"FormalExpression_1\">param.get('input')>5</bpmn2:conditionExpression>\n    </bpmn2:sequenceFlow>\n    <bpmn2:endEvent id=\"EndEvent_3\" name=\"End event2\">\n      <bpmn2:incoming>SequenceFlow_10</bpmn2:incoming>\n    </bpmn2:endEvent>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_10\" sourceRef=\"ExclusiveGateway_1\" targetRef=\"EndEvent_3\"/>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\" name=\"Default Process Diagram\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"process_1\">\n      <bpmndi:BPMNShape id=\"BPMNShape_1\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"100.0\" y=\"100.0\"/>\n        <bpmndi:BPMNLabel id=\"BPMNLabel_1\" labelStyle=\"BPMNLabelStyle_1\">\n          <dc:Bounds height=\"17.0\" width=\"64.0\" x=\"86.0\" y=\"136.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_2\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"720.0\" y=\"100.0\"/>\n        <bpmndi:BPMNLabel id=\"BPMNLabel_2\" labelStyle=\"BPMNLabelStyle_1\">\n          <dc:Bounds height=\"17.0\" width=\"72.0\" x=\"702.0\" y=\"136.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_ScriptTask_1\" bpmnElement=\"ScriptTask_1\" isExpanded=\"true\">\n        <dc:Bounds height=\"50.0\" width=\"110.0\" x=\"241.0\" y=\"93.0\"/>\n        <bpmndi:BPMNLabel id=\"BPMNLabel_3\" labelStyle=\"BPMNLabelStyle_1\">\n          <dc:Bounds height=\"17.0\" width=\"72.0\" x=\"260.0\" y=\"109.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_ScriptTask_2\" bpmnElement=\"ScriptTask_2\" isExpanded=\"true\">\n        <dc:Bounds height=\"50.0\" width=\"110.0\" x=\"540.0\" y=\"93.0\"/>\n        <bpmndi:BPMNLabel id=\"BPMNLabel_6\" labelStyle=\"BPMNLabelStyle_1\">\n          <dc:Bounds height=\"17.0\" width=\"72.0\" x=\"559.0\" y=\"109.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_ExclusiveGateway_1\" bpmnElement=\"ExclusiveGateway_1\" isMarkerVisible=\"true\">\n        <dc:Bounds height=\"50.0\" width=\"50.0\" x=\"426.0\" y=\"93.0\"/>\n        <bpmndi:BPMNLabel id=\"BPMNLabel_9\" labelStyle=\"BPMNLabelStyle_1\">\n          <dc:Bounds height=\"17.0\" width=\"64.0\" x=\"419.0\" y=\"143.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_EndEvent_2\" bpmnElement=\"EndEvent_3\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"544.0\" y=\"200.0\"/>\n        <bpmndi:BPMNLabel id=\"BPMNLabel_16\" labelStyle=\"BPMNLabelStyle_1\">\n          <dc:Bounds height=\"17.0\" width=\"72.0\" x=\"526.0\" y=\"236.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_2\" bpmnElement=\"SequenceFlow_2\" sourceElement=\"BPMNShape_1\" targetElement=\"BPMNShape_ScriptTask_1\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"136.0\" y=\"118.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"188.0\" y=\"118.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"241.0\" y=\"118.0\"/>\n        <bpmndi:BPMNLabel id=\"BPMNLabel_4\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_4\" bpmnElement=\"SequenceFlow_4\" sourceElement=\"BPMNShape_ScriptTask_2\" targetElement=\"BPMNShape_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"650.0\" y=\"118.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"685.0\" y=\"118.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"720.0\" y=\"118.0\"/>\n        <bpmndi:BPMNLabel id=\"BPMNLabel_8\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_5\" bpmnElement=\"SequenceFlow_5\" sourceElement=\"BPMNShape_ScriptTask_1\" targetElement=\"BPMNShape_ExclusiveGateway_1\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"351.0\" y=\"118.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"388.0\" y=\"118.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"426.0\" y=\"118.0\"/>\n        <bpmndi:BPMNLabel id=\"BPMNLabel_10\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_6\" bpmnElement=\"SequenceFlow_6\" sourceElement=\"BPMNShape_ExclusiveGateway_1\" targetElement=\"BPMNShape_ScriptTask_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"476.0\" y=\"118.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"508.0\" y=\"118.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"540.0\" y=\"118.0\"/>\n        <bpmndi:BPMNLabel id=\"BPMNLabel_11\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_10\" bpmnElement=\"SequenceFlow_10\" sourceElement=\"BPMNShape_ExclusiveGateway_1\" targetElement=\"BPMNShape_EndEvent_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"451.0\" y=\"143.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"451.0\" y=\"218.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"544.0\" y=\"218.0\"/>\n        <bpmndi:BPMNLabel id=\"BPMNLabel_17\"/>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n    <bpmndi:BPMNLabelStyle id=\"BPMNLabelStyle_1\">\n      <dc:Font name=\"arial\" size=\"9.0\"/>\n    </bpmndi:BPMNLabelStyle>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/resources/flow/cases/converter/process_1_simple.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- origin at X=0.0 Y=0.0 -->\n<bpmn2:definitions xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:ext=\"http://org.eclipse.bpmn2/ext\" id=\"Definitions_1\" exporter=\"org.eclipse.bpmn2.modeler.core\" exporterVersion=\"1.5.2.SNAPSHOT-v20200602-1600-B1\" targetNamespace=\"http://org.eclipse.bpmn2/default/process\">\n  <bpmn2:process id=\"process_1_simple\" name=\"Default Process\" isExecutable=\"false\">\n    <bpmn2:scriptTask id=\"ScriptTask_1\" name=\"Script Task 1\">\n      <bpmn2:outgoing>SequenceFlow_3</bpmn2:outgoing>\n    </bpmn2:scriptTask>\n    <bpmn2:scriptTask id=\"ScriptTask_2\" name=\"Script Task 2\">\n      <bpmn2:incoming>SequenceFlow_3</bpmn2:incoming>\n    </bpmn2:scriptTask>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_3\" sourceRef=\"ScriptTask_1\" targetRef=\"ScriptTask_2\"/>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\" name=\"Default Process Diagram\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"process_1_simple\">\n      <bpmndi:BPMNShape id=\"BPMNShape_ScriptTask_1\" bpmnElement=\"ScriptTask_1\" isExpanded=\"true\">\n        <dc:Bounds height=\"50.0\" width=\"110.0\" x=\"241.0\" y=\"93.0\"/>\n        <bpmndi:BPMNLabel id=\"BPMNLabel_1\" labelStyle=\"BPMNLabelStyle_1\">\n          <dc:Bounds height=\"17.0\" width=\"86.0\" x=\"253.0\" y=\"109.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_ScriptTask_2\" bpmnElement=\"ScriptTask_2\" isExpanded=\"true\">\n        <dc:Bounds height=\"50.0\" width=\"110.0\" x=\"456.0\" y=\"93.0\"/>\n        <bpmndi:BPMNLabel id=\"BPMNLabel_2\" labelStyle=\"BPMNLabelStyle_1\">\n          <dc:Bounds height=\"17.0\" width=\"86.0\" x=\"468.0\" y=\"109.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_3\" bpmnElement=\"SequenceFlow_3\" sourceElement=\"BPMNShape_ScriptTask_1\" targetElement=\"BPMNShape_ScriptTask_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"351.0\" y=\"118.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"403.0\" y=\"118.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"456.0\" y=\"118.0\"/>\n        <bpmndi:BPMNLabel id=\"BPMNLabel_3\"/>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n    <bpmndi:BPMNLabelStyle id=\"BPMNLabelStyle_1\">\n      <dc:Font name=\"arial\" size=\"9.0\"/>\n    </bpmndi:BPMNLabelStyle>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/resources/flow/cases/defaultflow/default_flow_001.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"default_flow_001\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"start\">\n      <bpmn:outgoing>Flow_0smvq7t</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:sequenceFlow id=\"Flow_0smvq7t\" sourceRef=\"start\" targetRef=\"Gateway_0wmrgbt\" />\n    <bpmn:scriptTask id=\"node1\">\n      <bpmn:incoming>Flow_0og7tvg</bpmn:incoming>\n    </bpmn:scriptTask>\n    <bpmn:sequenceFlow id=\"Flow_0og7tvg\" sourceRef=\"Gateway_0wmrgbt\" targetRef=\"node1\" />\n    <bpmn:scriptTask id=\"node2\">\n      <bpmn:incoming>Flow_1d63jfc</bpmn:incoming>\n    </bpmn:scriptTask>\n    <bpmn:sequenceFlow id=\"Flow_1d63jfc\" sourceRef=\"Gateway_0wmrgbt\" targetRef=\"node2\">\n      <bpmn:conditionExpression xsi:type=\"bpmn:tFormalExpression\">1&gt;2</bpmn:conditionExpression>\n    </bpmn:sequenceFlow>\n    <bpmn:exclusiveGateway id=\"Gateway_0wmrgbt\" default=\"Flow_0og7tvg\">\n      <bpmn:incoming>Flow_0smvq7t</bpmn:incoming>\n      <bpmn:outgoing>Flow_0og7tvg</bpmn:outgoing>\n      <bpmn:outgoing>Flow_1d63jfc</bpmn:outgoing>\n    </bpmn:exclusiveGateway>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"default_flow_001\">\n      <bpmndi:BPMNShape id=\"Activity_1sjk9j6_di\" bpmnElement=\"node1\">\n        <dc:Bounds x=\"520\" y=\"20\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0t44qgt_di\" bpmnElement=\"node2\">\n        <dc:Bounds x=\"520\" y=\"150\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Gateway_0lsk1ym_di\" bpmnElement=\"Gateway_0wmrgbt\" isMarkerVisible=\"true\">\n        <dc:Bounds x=\"415\" y=\"95\" width=\"50\" height=\"50\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"start\">\n        <dc:Bounds x=\"322\" y=\"102\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Flow_0smvq7t_di\" bpmnElement=\"Flow_0smvq7t\">\n        <di:waypoint x=\"358\" y=\"120\" />\n        <di:waypoint x=\"415\" y=\"120\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_0og7tvg_di\" bpmnElement=\"Flow_0og7tvg\">\n        <di:waypoint x=\"440\" y=\"95\" />\n        <di:waypoint x=\"440\" y=\"60\" />\n        <di:waypoint x=\"520\" y=\"60\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_1d63jfc_di\" bpmnElement=\"Flow_1d63jfc\">\n        <di:waypoint x=\"440\" y=\"145\" />\n        <di:waypoint x=\"440\" y=\"190\" />\n        <di:waypoint x=\"520\" y=\"190\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/resources/flow/cases/extension/process_1.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- origin at X=0.0 Y=0.0 -->\n<bpmn2:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn2=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" xmlns:ext=\"http://org.eclipse.bpmn2/ext\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" id=\"Definitions_1\" exporter=\"org.eclipse.bpmn2.modeler.core\" exporterVersion=\"1.5.2.SNAPSHOT-v20200602-1600-B1\" targetNamespace=\"http://org.eclipse.bpmn2/default/process\">\n  <bpmn2:process id=\"process_1\" name=\"Default Process\" isExecutable=\"false\">\n    <bpmn2:startEvent id=\"StartEvent_1\" name=\"Start Event\">\n      <bpmn2:outgoing>SequenceFlow_2</bpmn2:outgoing>\n    </bpmn2:startEvent>\n    <bpmn2:endEvent id=\"EndEvent_1\" name=\"End Event\">\n      <bpmn2:incoming>SequenceFlow_4</bpmn2:incoming>\n    </bpmn2:endEvent>\n    <bpmn2:scriptTask id=\"ScriptTask_1\" name=\"Script task 1\">\n      <bpmn2:incoming>SequenceFlow_2</bpmn2:incoming>\n      <bpmn2:outgoing>SequenceFlow_5</bpmn2:outgoing>\n      <bpmn2:script>new com.jd.easyflow.flow.bpmn.BpmnTestService().doScriptTask1()</bpmn2:script>\n    </bpmn2:scriptTask>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_2\" sourceRef=\"StartEvent_1\" targetRef=\"ScriptTask_1\"/>\n    <bpmn2:scriptTask id=\"ScriptTask_2\" name=\"Script task 2\">\n      <bpmn2:incoming>SequenceFlow_6</bpmn2:incoming>\n      <bpmn2:outgoing>SequenceFlow_4</bpmn2:outgoing>\n      <bpmn2:script>new com.jd.easyflow.flow.bpmn.BpmnTestService().doScriptTask2()</bpmn2:script>\n    </bpmn2:scriptTask>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_4\" sourceRef=\"ScriptTask_2\" targetRef=\"EndEvent_1\"/>\n    <bpmn2:exclusiveGateway id=\"ExclusiveGateway_1\" name=\"Judge\" gatewayDirection=\"Mixed\">\n      <bpmn2:incoming>SequenceFlow_5</bpmn2:incoming>\n      <bpmn2:outgoing>SequenceFlow_6</bpmn2:outgoing>\n      <bpmn2:outgoing>SequenceFlow_10</bpmn2:outgoing>\n    </bpmn2:exclusiveGateway>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_5\" sourceRef=\"ScriptTask_1\" targetRef=\"ExclusiveGateway_1\"/>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_6\" sourceRef=\"ExclusiveGateway_1\" targetRef=\"ScriptTask_2\">\n      <bpmn2:conditionExpression xsi:type=\"bpmn2:tFormalExpression\" id=\"FormalExpression_1\">param.get('input')>5</bpmn2:conditionExpression>\n    </bpmn2:sequenceFlow>\n    <bpmn2:endEvent id=\"EndEvent_3\" name=\"End event2\">\n      <bpmn2:incoming>SequenceFlow_10</bpmn2:incoming>\n    </bpmn2:endEvent>\n    <bpmn2:sequenceFlow id=\"SequenceFlow_10\" sourceRef=\"ExclusiveGateway_1\" targetRef=\"EndEvent_3\"/>\n  </bpmn2:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\" name=\"Default Process Diagram\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"process_1\">\n      <bpmndi:BPMNShape id=\"BPMNShape_1\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"100.0\" y=\"100.0\"/>\n        <bpmndi:BPMNLabel id=\"BPMNLabel_1\" labelStyle=\"BPMNLabelStyle_1\">\n          <dc:Bounds height=\"17.0\" width=\"64.0\" x=\"86.0\" y=\"136.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_2\" bpmnElement=\"EndEvent_1\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"720.0\" y=\"100.0\"/>\n        <bpmndi:BPMNLabel id=\"BPMNLabel_2\" labelStyle=\"BPMNLabelStyle_1\">\n          <dc:Bounds height=\"17.0\" width=\"72.0\" x=\"702.0\" y=\"136.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_ScriptTask_1\" bpmnElement=\"ScriptTask_1\" isExpanded=\"true\">\n        <dc:Bounds height=\"50.0\" width=\"110.0\" x=\"241.0\" y=\"93.0\"/>\n        <bpmndi:BPMNLabel id=\"BPMNLabel_3\" labelStyle=\"BPMNLabelStyle_1\">\n          <dc:Bounds height=\"17.0\" width=\"72.0\" x=\"260.0\" y=\"109.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_ScriptTask_2\" bpmnElement=\"ScriptTask_2\" isExpanded=\"true\">\n        <dc:Bounds height=\"50.0\" width=\"110.0\" x=\"540.0\" y=\"93.0\"/>\n        <bpmndi:BPMNLabel id=\"BPMNLabel_6\" labelStyle=\"BPMNLabelStyle_1\">\n          <dc:Bounds height=\"17.0\" width=\"72.0\" x=\"559.0\" y=\"109.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_ExclusiveGateway_1\" bpmnElement=\"ExclusiveGateway_1\" isMarkerVisible=\"true\">\n        <dc:Bounds height=\"50.0\" width=\"50.0\" x=\"426.0\" y=\"93.0\"/>\n        <bpmndi:BPMNLabel id=\"BPMNLabel_9\" labelStyle=\"BPMNLabelStyle_1\">\n          <dc:Bounds height=\"17.0\" width=\"64.0\" x=\"419.0\" y=\"143.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"BPMNShape_EndEvent_2\" bpmnElement=\"EndEvent_3\">\n        <dc:Bounds height=\"36.0\" width=\"36.0\" x=\"544.0\" y=\"200.0\"/>\n        <bpmndi:BPMNLabel id=\"BPMNLabel_16\" labelStyle=\"BPMNLabelStyle_1\">\n          <dc:Bounds height=\"17.0\" width=\"72.0\" x=\"526.0\" y=\"236.0\"/>\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_2\" bpmnElement=\"SequenceFlow_2\" sourceElement=\"BPMNShape_1\" targetElement=\"BPMNShape_ScriptTask_1\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"136.0\" y=\"118.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"188.0\" y=\"118.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"241.0\" y=\"118.0\"/>\n        <bpmndi:BPMNLabel id=\"BPMNLabel_4\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_4\" bpmnElement=\"SequenceFlow_4\" sourceElement=\"BPMNShape_ScriptTask_2\" targetElement=\"BPMNShape_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"650.0\" y=\"118.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"685.0\" y=\"118.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"720.0\" y=\"118.0\"/>\n        <bpmndi:BPMNLabel id=\"BPMNLabel_8\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_5\" bpmnElement=\"SequenceFlow_5\" sourceElement=\"BPMNShape_ScriptTask_1\" targetElement=\"BPMNShape_ExclusiveGateway_1\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"351.0\" y=\"118.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"388.0\" y=\"118.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"426.0\" y=\"118.0\"/>\n        <bpmndi:BPMNLabel id=\"BPMNLabel_10\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_6\" bpmnElement=\"SequenceFlow_6\" sourceElement=\"BPMNShape_ExclusiveGateway_1\" targetElement=\"BPMNShape_ScriptTask_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"476.0\" y=\"118.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"508.0\" y=\"118.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"540.0\" y=\"118.0\"/>\n        <bpmndi:BPMNLabel id=\"BPMNLabel_11\"/>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"BPMNEdge_SequenceFlow_10\" bpmnElement=\"SequenceFlow_10\" sourceElement=\"BPMNShape_ExclusiveGateway_1\" targetElement=\"BPMNShape_EndEvent_2\">\n        <di:waypoint xsi:type=\"dc:Point\" x=\"451.0\" y=\"143.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"451.0\" y=\"218.0\"/>\n        <di:waypoint xsi:type=\"dc:Point\" x=\"544.0\" y=\"218.0\"/>\n        <bpmndi:BPMNLabel id=\"BPMNLabel_17\"/>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n    <bpmndi:BPMNLabelStyle id=\"BPMNLabelStyle_1\">\n      <dc:Font name=\"arial\" size=\"9.0\"/>\n    </bpmndi:BPMNLabelStyle>\n  </bpmndi:BPMNDiagram>\n</bpmn2:definitions>"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/resources/flow/cases/inclusive/flow_inclusive001.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"flow_bpmn_inclusive001\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"START\" name=\"START\">\n      <bpmn:outgoing>Flow_1wpx3u4</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:sequenceFlow id=\"Flow_1wpx3u4\" sourceRef=\"START\" targetRef=\"INCLUSIVE_GATEWAY1\" />\n    <bpmn:scriptTask id=\"NODE1\" name=\"NODE1\">\n      <bpmn:incoming>Flow_0a5nli9</bpmn:incoming>\n      <bpmn:outgoing>Flow_186e14f</bpmn:outgoing>\n    </bpmn:scriptTask>\n    <bpmn:sequenceFlow id=\"Flow_0a5nli9\" sourceRef=\"INCLUSIVE_GATEWAY1\" targetRef=\"NODE1\">\n      <bpmn:conditionExpression xsi:type=\"bpmn:tFormalExpression\">bizParam&lt;1</bpmn:conditionExpression>\n    </bpmn:sequenceFlow>\n    <bpmn:scriptTask id=\"NODE2\" name=\"NODE2\">\n      <bpmn:incoming>Flow_1hk491y</bpmn:incoming>\n      <bpmn:outgoing>Flow_03vcyf2</bpmn:outgoing>\n    </bpmn:scriptTask>\n    <bpmn:sequenceFlow id=\"Flow_1hk491y\" sourceRef=\"INCLUSIVE_GATEWAY1\" targetRef=\"NODE2\">\n      <bpmn:conditionExpression xsi:type=\"bpmn:tFormalExpression\">bizParam&lt;2</bpmn:conditionExpression>\n    </bpmn:sequenceFlow>\n    <bpmn:sequenceFlow id=\"Flow_186e14f\" sourceRef=\"NODE1\" targetRef=\"INCLUSIVE_GATEWAY2\" />\n    <bpmn:endEvent id=\"END\" name=\"END\">\n      <bpmn:incoming>Flow_1fv7f8g</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:sequenceFlow id=\"Flow_1fv7f8g\" sourceRef=\"INCLUSIVE_GATEWAY2\" targetRef=\"END\" />\n    <bpmn:sequenceFlow id=\"Flow_03vcyf2\" sourceRef=\"NODE2\" targetRef=\"INCLUSIVE_GATEWAY2\" />\n    <bpmn:inclusiveGateway id=\"INCLUSIVE_GATEWAY1\" name=\"INCLUSIVE_GATEWAY1\">\n      <bpmn:incoming>Flow_1wpx3u4</bpmn:incoming>\n      <bpmn:outgoing>Flow_0a5nli9</bpmn:outgoing>\n      <bpmn:outgoing>Flow_1hk491y</bpmn:outgoing>\n    </bpmn:inclusiveGateway>\n    <bpmn:inclusiveGateway id=\"INCLUSIVE_GATEWAY2\" name=\"INCLUSIVE_GATEWAY2\">\n      <bpmn:incoming>Flow_186e14f</bpmn:incoming>\n      <bpmn:incoming>Flow_03vcyf2</bpmn:incoming>\n      <bpmn:outgoing>Flow_1fv7f8g</bpmn:outgoing>\n    </bpmn:inclusiveGateway>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"flow_bpmn_inclusive001\">\n      <bpmndi:BPMNEdge id=\"Flow_1wpx3u4_di\" bpmnElement=\"Flow_1wpx3u4\" waypoints=\"\">\n        <di:waypoint x=\"209\" y=\"120\" />\n        <di:waypoint x=\"265\" y=\"120\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_0a5nli9_di\" bpmnElement=\"Flow_0a5nli9\" waypoints=\"\">\n        <di:waypoint x=\"290\" y=\"95\" />\n        <di:waypoint x=\"290\" y=\"50\" />\n        <di:waypoint x=\"380\" y=\"50\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_1hk491y_di\" bpmnElement=\"Flow_1hk491y\" waypoints=\"\">\n        <di:waypoint x=\"290\" y=\"145\" />\n        <di:waypoint x=\"290\" y=\"200\" />\n        <di:waypoint x=\"380\" y=\"200\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_186e14f_di\" bpmnElement=\"Flow_186e14f\" waypoints=\"\">\n        <di:waypoint x=\"480\" y=\"50\" />\n        <di:waypoint x=\"570\" y=\"50\" />\n        <di:waypoint x=\"570\" y=\"95\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_1fv7f8g_di\" bpmnElement=\"Flow_1fv7f8g\" waypoints=\"\">\n        <di:waypoint x=\"595\" y=\"120\" />\n        <di:waypoint x=\"662\" y=\"120\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_03vcyf2_di\" bpmnElement=\"Flow_03vcyf2\" waypoints=\"\">\n        <di:waypoint x=\"480\" y=\"200\" />\n        <di:waypoint x=\"570\" y=\"200\" />\n        <di:waypoint x=\"570\" y=\"145\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"START\">\n        <dc:Bounds x=\"173\" y=\"102\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"179\" y=\"145\" width=\"24\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_18gig5j_di\" bpmnElement=\"END\">\n        <dc:Bounds x=\"662\" y=\"102\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"668\" y=\"145\" width=\"24\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_09cuulm_di\" bpmnElement=\"NODE2\">\n        <dc:Bounds x=\"380\" y=\"160\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1d20vhf_di\" bpmnElement=\"NODE1\">\n        <dc:Bounds x=\"380\" y=\"10\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Gateway_19ep1wq_di\" bpmnElement=\"INCLUSIVE_GATEWAY1\">\n        <dc:Bounds x=\"265\" y=\"95\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"346\" y=\"110\" width=\"49\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Gateway_01rqg0m_di\" bpmnElement=\"INCLUSIVE_GATEWAY2\">\n        <dc:Bounds x=\"545\" y=\"95\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"466\" y=\"110\" width=\"49\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/resources/flow/cases/inclusive/flow_inclusive002.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Inclusive002\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"Start\" name=\"Start\">\n      <bpmn:outgoing>Flow_009yno9</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:sequenceFlow id=\"Flow_009yno9\" sourceRef=\"Start\" targetRef=\"I1\" />\n    <bpmn:scriptTask id=\"Node1\" name=\"Node1\">\n      <bpmn:incoming>Flow_19z9ihs</bpmn:incoming>\n      <bpmn:outgoing>Flow_01vevpz</bpmn:outgoing>\n    </bpmn:scriptTask>\n    <bpmn:sequenceFlow id=\"Flow_19z9ihs\" name=\"C1\" sourceRef=\"I1\" targetRef=\"Node1\">\n      <bpmn:conditionExpression xsi:type=\"bpmn:tFormalExpression\">bizParam.C1</bpmn:conditionExpression>\n    </bpmn:sequenceFlow>\n    <bpmn:scriptTask id=\"Node2\" name=\"Node2\">\n      <bpmn:incoming>Flow_10a11ob</bpmn:incoming>\n      <bpmn:outgoing>Flow_0guprom</bpmn:outgoing>\n    </bpmn:scriptTask>\n    <bpmn:sequenceFlow id=\"Flow_10a11ob\" name=\"C2\" sourceRef=\"I1\" targetRef=\"Node2\">\n      <bpmn:conditionExpression xsi:type=\"bpmn:tFormalExpression\">bizParam.C2</bpmn:conditionExpression>\n    </bpmn:sequenceFlow>\n    <bpmn:exclusiveGateway id=\"E1\" name=\"E1\">\n      <bpmn:incoming>Flow_01vevpz</bpmn:incoming>\n      <bpmn:outgoing>Flow_0kgrau1</bpmn:outgoing>\n      <bpmn:outgoing>Flow_14vadzk</bpmn:outgoing>\n    </bpmn:exclusiveGateway>\n    <bpmn:sequenceFlow id=\"Flow_01vevpz\" sourceRef=\"Node1\" targetRef=\"E1\" />\n    <bpmn:scriptTask id=\"Node3\" name=\"Node3\">\n      <bpmn:incoming>Flow_0kgrau1</bpmn:incoming>\n      <bpmn:outgoing>Flow_02ojoe6</bpmn:outgoing>\n    </bpmn:scriptTask>\n    <bpmn:sequenceFlow id=\"Flow_0kgrau1\" name=\"C3\" sourceRef=\"E1\" targetRef=\"Node3\">\n      <bpmn:conditionExpression xsi:type=\"bpmn:tFormalExpression\">bizParam.C3</bpmn:conditionExpression>\n    </bpmn:sequenceFlow>\n    <bpmn:scriptTask id=\"Node4\" name=\"Node4\">\n      <bpmn:incoming>Flow_14vadzk</bpmn:incoming>\n      <bpmn:outgoing>Flow_09dvd22</bpmn:outgoing>\n    </bpmn:scriptTask>\n    <bpmn:sequenceFlow id=\"Flow_14vadzk\" name=\"C4\" sourceRef=\"E1\" targetRef=\"Node4\">\n      <bpmn:conditionExpression xsi:type=\"bpmn:tFormalExpression\">bizParam.C4</bpmn:conditionExpression>\n    </bpmn:sequenceFlow>\n    <bpmn:sequenceFlow id=\"Flow_0guprom\" sourceRef=\"Node2\" targetRef=\"I2\" />\n    <bpmn:sequenceFlow id=\"Flow_02ojoe6\" name=\"\" sourceRef=\"Node3\" targetRef=\"I2\" />\n    <bpmn:sequenceFlow id=\"Flow_09dvd22\" sourceRef=\"Node4\" targetRef=\"I2\" />\n    <bpmn:endEvent id=\"End\" name=\"End\">\n      <bpmn:incoming>Flow_07b2jxo</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:sequenceFlow id=\"Flow_07b2jxo\" sourceRef=\"I2\" targetRef=\"End\" />\n    <bpmn:inclusiveGateway id=\"I1\" name=\"I1\">\n      <bpmn:incoming>Flow_009yno9</bpmn:incoming>\n      <bpmn:outgoing>Flow_19z9ihs</bpmn:outgoing>\n      <bpmn:outgoing>Flow_10a11ob</bpmn:outgoing>\n    </bpmn:inclusiveGateway>\n    <bpmn:inclusiveGateway id=\"I2\" name=\"I2\">\n      <bpmn:incoming>Flow_0guprom</bpmn:incoming>\n      <bpmn:incoming>Flow_02ojoe6</bpmn:incoming>\n      <bpmn:incoming>Flow_09dvd22</bpmn:incoming>\n      <bpmn:outgoing>Flow_07b2jxo</bpmn:outgoing>\n    </bpmn:inclusiveGateway>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Inclusive002\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"Start\">\n        <dc:Bounds x=\"173\" y=\"232\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"180\" y=\"275\" width=\"24\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1bdr1zw_di\" bpmnElement=\"Node2\">\n        <dc:Bounds x=\"380\" y=\"320\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0pdz7py_di\" bpmnElement=\"Node3\">\n        <dc:Bounds x=\"660\" y=\"50\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1vwb74z_di\" bpmnElement=\"Node4\">\n        <dc:Bounds x=\"660\" y=\"150\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Gateway_09gwry2_di\" bpmnElement=\"E1\" isMarkerVisible=\"true\">\n        <dc:Bounds x=\"545\" y=\"115\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"583\" y=\"153\" width=\"14\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0944z9j_di\" bpmnElement=\"Node1\">\n        <dc:Bounds x=\"380\" y=\"100\" width=\"100\" height=\"80\" />\n        <bpmndi:BPMNLabel />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Gateway_12n7dvs_di\" bpmnElement=\"I1\">\n        <dc:Bounds x=\"265\" y=\"225\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"325\" y=\"253\" width=\"10\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Gateway_0iljdjt_di\" bpmnElement=\"I2\">\n        <dc:Bounds x=\"835\" y=\"225\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"825\" y=\"263\" width=\"10\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0eqxdpk_di\" bpmnElement=\"End\">\n        <dc:Bounds x=\"932\" y=\"232\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"940\" y=\"275\" width=\"20\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Flow_009yno9_di\" bpmnElement=\"Flow_009yno9\">\n        <di:waypoint x=\"209\" y=\"250\" />\n        <di:waypoint x=\"265\" y=\"250\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_19z9ihs_di\" bpmnElement=\"Flow_19z9ihs\">\n        <di:waypoint x=\"290\" y=\"225\" />\n        <di:waypoint x=\"290\" y=\"140\" />\n        <di:waypoint x=\"380\" y=\"140\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"298\" y=\"180\" width=\"15\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_10a11ob_di\" bpmnElement=\"Flow_10a11ob\">\n        <di:waypoint x=\"290\" y=\"275\" />\n        <di:waypoint x=\"290\" y=\"360\" />\n        <di:waypoint x=\"380\" y=\"360\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"298\" y=\"315\" width=\"15\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_01vevpz_di\" bpmnElement=\"Flow_01vevpz\">\n        <di:waypoint x=\"480\" y=\"140\" />\n        <di:waypoint x=\"545\" y=\"140\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_0kgrau1_di\" bpmnElement=\"Flow_0kgrau1\">\n        <di:waypoint x=\"570\" y=\"115\" />\n        <di:waypoint x=\"570\" y=\"90\" />\n        <di:waypoint x=\"660\" y=\"90\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"578\" y=\"100\" width=\"15\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_14vadzk_di\" bpmnElement=\"Flow_14vadzk\">\n        <di:waypoint x=\"570\" y=\"165\" />\n        <di:waypoint x=\"570\" y=\"190\" />\n        <di:waypoint x=\"660\" y=\"190\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"578\" y=\"175\" width=\"15\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_0guprom_di\" bpmnElement=\"Flow_0guprom\">\n        <di:waypoint x=\"480\" y=\"360\" />\n        <di:waypoint x=\"860\" y=\"360\" />\n        <di:waypoint x=\"860\" y=\"275\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_02ojoe6_di\" bpmnElement=\"Flow_02ojoe6\">\n        <di:waypoint x=\"760\" y=\"90\" />\n        <di:waypoint x=\"860\" y=\"90\" />\n        <di:waypoint x=\"860\" y=\"225\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_09dvd22_di\" bpmnElement=\"Flow_09dvd22\">\n        <di:waypoint x=\"760\" y=\"190\" />\n        <di:waypoint x=\"860\" y=\"190\" />\n        <di:waypoint x=\"860\" y=\"225\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_07b2jxo_di\" bpmnElement=\"Flow_07b2jxo\">\n        <di:waypoint x=\"885\" y=\"250\" />\n        <di:waypoint x=\"932\" y=\"250\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/resources/flow/cases/logflag/logflag_001.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:easyflow=\"http://jd.com/easyflow\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"Process_1\" isExecutable=\"false\">\n    <bpmn:extensionElements>\n      <easyflow:logFlag>false</easyflow:logFlag>\n    </bpmn:extensionElements>\n    <bpmn:startEvent id=\"StartEvent_1\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"173\" y=\"102\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/resources/flow/cases/parallel/flow_multi_parallel_subflow_001.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:easyflow=\"http://jd.com/easyflow\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"multi_parallel_subflow_001\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"Start\">\n      <bpmn:outgoing>Flow_0vzdjlp</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:sequenceFlow id=\"Flow_0vzdjlp\" sourceRef=\"Start\" targetRef=\"mainAction\" />\n    <bpmn:endEvent id=\"End\">\n      <bpmn:incoming>Flow_0d9losl</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:sequenceFlow id=\"Flow_0d9losl\" sourceRef=\"mainAction\" targetRef=\"End\" />\n    <bpmn:subProcess id=\"mainAction\">\n      <bpmn:extensionElements>\n        <easyflow:flow>{\"id\":\"subFlow001\"}</easyflow:flow>\n        <easyflow:action>{\"createExp\":\"new com.jd.easyflow.flow.bpmn.cases.parallel.BpmnParallelTest.MainFlowNodeAction()\"}</easyflow:action>\n      </bpmn:extensionElements>\n      <bpmn:incoming>Flow_0vzdjlp</bpmn:incoming>\n      <bpmn:outgoing>Flow_0d9losl</bpmn:outgoing>\n      <bpmn:multiInstanceLoopCharacteristics />\n      <bpmn:startEvent id=\"subStart\">\n        <bpmn:outgoing>Flow_1uq36dk</bpmn:outgoing>\n      </bpmn:startEvent>\n      <bpmn:scriptTask id=\"subNodeAction\" scriptFormat=\"createExp\">\n        <bpmn:incoming>Flow_1uq36dk</bpmn:incoming>\n        <bpmn:outgoing>Flow_1kfxj59</bpmn:outgoing>\n        <bpmn:script>new com.jd.easyflow.flow.bpmn.cases.parallel.BpmnParallelTest.SubFlowNodeAction()</bpmn:script>\n      </bpmn:scriptTask>\n      <bpmn:sequenceFlow id=\"Flow_1uq36dk\" sourceRef=\"subStart\" targetRef=\"subNodeAction\" />\n      <bpmn:endEvent id=\"subEnd\">\n        <bpmn:incoming>Flow_1kfxj59</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:sequenceFlow id=\"Flow_1kfxj59\" sourceRef=\"subNodeAction\" targetRef=\"subEnd\" />\n    </bpmn:subProcess>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"multi_parallel_subflow_001\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"Start\">\n        <dc:Bounds x=\"173\" y=\"272\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0qw1s4z_di\" bpmnElement=\"End\">\n        <dc:Bounds x=\"752\" y=\"272\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_12fh2x8_di\" bpmnElement=\"mainAction\" isExpanded=\"true\">\n        <dc:Bounds x=\"300\" y=\"190\" width=\"370\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1c33tgg_di\" bpmnElement=\"subStart\">\n        <dc:Bounds x=\"340.33333333333337\" y=\"272\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_05txe47_di\" bpmnElement=\"subNodeAction\">\n        <dc:Bounds x=\"430\" y=\"250\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1b45gmm_di\" bpmnElement=\"subEnd\">\n        <dc:Bounds x=\"592\" y=\"272\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Flow_1uq36dk_di\" bpmnElement=\"Flow_1uq36dk\">\n        <di:waypoint x=\"376\" y=\"290\" />\n        <di:waypoint x=\"430\" y=\"290\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_1kfxj59_di\" bpmnElement=\"Flow_1kfxj59\">\n        <di:waypoint x=\"530\" y=\"290\" />\n        <di:waypoint x=\"592\" y=\"290\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_0vzdjlp_di\" bpmnElement=\"Flow_0vzdjlp\">\n        <di:waypoint x=\"209\" y=\"290\" />\n        <di:waypoint x=\"300\" y=\"290\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_0d9losl_di\" bpmnElement=\"Flow_0d9losl\">\n        <di:waypoint x=\"670\" y=\"290\" />\n        <di:waypoint x=\"752\" y=\"290\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/resources/flow/cases/parallel/flow_parallel001.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:easyflow=\"http://jd.com/easyflow\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"flow_bpmn_parallel001\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"START_NODE\" name=\"START_NODE\">\n      <bpmn:outgoing>Flow_08hz986</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:scriptTask id=\"PARALLEL_NODE1\" name=\"PARALLEL_NODE1\" scriptFormat=\"createExp\">\n      <bpmn:extensionElements>\n        <easyflow:properties>{\"sleep\":100}</easyflow:properties>\n      </bpmn:extensionElements>\n      <bpmn:incoming>Flow_1xkqwtr</bpmn:incoming>\n      <bpmn:outgoing>Flow_0jod389</bpmn:outgoing>\n      <bpmn:script>new com.jd.easyflow.flow.bpmn.cases.share.nodeaction.TestStepAction()</bpmn:script>\n    </bpmn:scriptTask>\n    <bpmn:scriptTask id=\"PARALLEL_NODE2\" name=\"PARALLEL_NODE2\" scriptFormat=\"createExp\">\n      <bpmn:extensionElements>\n        <easyflow:properties>{\"sleep\":300}</easyflow:properties>\n      </bpmn:extensionElements>\n      <bpmn:incoming>Flow_0rnxuqo</bpmn:incoming>\n      <bpmn:outgoing>Flow_0lreky6</bpmn:outgoing>\n      <bpmn:script>new com.jd.easyflow.flow.bpmn.cases.share.nodeaction.TestStepAction()</bpmn:script>\n    </bpmn:scriptTask>\n    <bpmn:sequenceFlow id=\"Flow_08hz986\" sourceRef=\"START_NODE\" targetRef=\"GATEWAY1\" />\n    <bpmn:sequenceFlow id=\"Flow_1xkqwtr\" sourceRef=\"GATEWAY1\" targetRef=\"PARALLEL_NODE1\" />\n    <bpmn:sequenceFlow id=\"Flow_0rnxuqo\" sourceRef=\"GATEWAY1\" targetRef=\"PARALLEL_NODE2\" />\n    <bpmn:sequenceFlow id=\"Flow_0jod389\" sourceRef=\"PARALLEL_NODE1\" targetRef=\"GATEWAY2\" />\n    <bpmn:sequenceFlow id=\"Flow_0lreky6\" sourceRef=\"PARALLEL_NODE2\" targetRef=\"GATEWAY2\" />\n    <bpmn:endEvent id=\"END_NODE\" name=\"END_NODE\">\n      <bpmn:incoming>Flow_1992ddw</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:sequenceFlow id=\"Flow_1992ddw\" sourceRef=\"GATEWAY2\" targetRef=\"END_NODE\" />\n    <bpmn:parallelGateway id=\"GATEWAY1\" name=\"GATEWAY1\">\n      <bpmn:incoming>Flow_08hz986</bpmn:incoming>\n      <bpmn:outgoing>Flow_1xkqwtr</bpmn:outgoing>\n      <bpmn:outgoing>Flow_0rnxuqo</bpmn:outgoing>\n    </bpmn:parallelGateway>\n    <bpmn:parallelGateway id=\"GATEWAY2\" name=\"GATEWAY2\">\n      <bpmn:incoming>Flow_0jod389</bpmn:incoming>\n      <bpmn:incoming>Flow_0lreky6</bpmn:incoming>\n      <bpmn:outgoing>Flow_1992ddw</bpmn:outgoing>\n    </bpmn:parallelGateway>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"flow_bpmn_parallel001\">\n      <bpmndi:BPMNEdge id=\"Flow_08hz986_di\" bpmnElement=\"Flow_08hz986\" waypoints=\"\">\n        <di:waypoint x=\"209\" y=\"120\" />\n        <di:waypoint x=\"245\" y=\"120\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_1xkqwtr_di\" bpmnElement=\"Flow_1xkqwtr\" waypoints=\"\">\n        <di:waypoint x=\"270\" y=\"95\" />\n        <di:waypoint x=\"270\" y=\"40\" />\n        <di:waypoint x=\"370\" y=\"40\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_0rnxuqo_di\" bpmnElement=\"Flow_0rnxuqo\" waypoints=\"\">\n        <di:waypoint x=\"270\" y=\"145\" />\n        <di:waypoint x=\"270\" y=\"190\" />\n        <di:waypoint x=\"370\" y=\"190\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_0jod389_di\" bpmnElement=\"Flow_0jod389\" waypoints=\"\">\n        <di:waypoint x=\"470\" y=\"40\" />\n        <di:waypoint x=\"570\" y=\"40\" />\n        <di:waypoint x=\"570\" y=\"95\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_0lreky6_di\" bpmnElement=\"Flow_0lreky6\" waypoints=\"\">\n        <di:waypoint x=\"470\" y=\"190\" />\n        <di:waypoint x=\"570\" y=\"190\" />\n        <di:waypoint x=\"570\" y=\"145\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_1992ddw_di\" bpmnElement=\"Flow_1992ddw\" waypoints=\"\">\n        <di:waypoint x=\"595\" y=\"120\" />\n        <di:waypoint x=\"662\" y=\"120\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"START_NODE\">\n        <dc:Bounds x=\"173\" y=\"102\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"155\" y=\"145\" width=\"73\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0hvlhnh_di\" bpmnElement=\"PARALLEL_NODE1\">\n        <dc:Bounds x=\"370\" y=\"0\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_07s31qf_di\" bpmnElement=\"PARALLEL_NODE2\">\n        <dc:Bounds x=\"370\" y=\"150\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1s6k7qf_di\" bpmnElement=\"END_NODE\">\n        <dc:Bounds x=\"662\" y=\"102\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"649\" y=\"145\" width=\"62\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Gateway_1au5o2w_di\" bpmnElement=\"GATEWAY1\">\n        <dc:Bounds x=\"245\" y=\"95\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"321\" y=\"110\" width=\"60\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Gateway_028xlvx_di\" bpmnElement=\"GATEWAY2\">\n        <dc:Bounds x=\"545\" y=\"95\" width=\"50\" height=\"50\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"460\" y=\"110\" width=\"60\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/resources/flow/cases/subprocess/flow_subprocess_test_001.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:easyflow=\"http://jd.com/easyflow\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"subprocess_test_001\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"StartEvent_1\" name=\"Start\">\n      <bpmn:outgoing>Flow_0zkxi10</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:sequenceFlow id=\"Flow_0zkxi10\" sourceRef=\"StartEvent_1\" targetRef=\"Activity_12td433\" />\n    <bpmn:subProcess id=\"Activity_12td433\">\n      <bpmn:extensionElements>\n        <easyflow:flow>{\"id\":\"subprocess\"}</easyflow:flow>\n      </bpmn:extensionElements>\n      <bpmn:incoming>Flow_0zkxi10</bpmn:incoming>\n      <bpmn:outgoing>Flow_1g0nlgh</bpmn:outgoing>\n      <bpmn:startEvent id=\"Event_15wt66m\">\n        <bpmn:outgoing>Flow_1sv8pyg</bpmn:outgoing>\n      </bpmn:startEvent>\n      <bpmn:scriptTask id=\"Activity_04lj9f1\">\n        <bpmn:incoming>Flow_1sv8pyg</bpmn:incoming>\n        <bpmn:outgoing>Flow_1oc2lcj</bpmn:outgoing>\n        <bpmn:script>T(java.lang.System).out.println(\"hello\")</bpmn:script>\n      </bpmn:scriptTask>\n      <bpmn:sequenceFlow id=\"Flow_1sv8pyg\" sourceRef=\"Event_15wt66m\" targetRef=\"Activity_04lj9f1\" />\n      <bpmn:endEvent id=\"Event_0d1yd6u\">\n        <bpmn:incoming>Flow_1oc2lcj</bpmn:incoming>\n      </bpmn:endEvent>\n      <bpmn:sequenceFlow id=\"Flow_1oc2lcj\" sourceRef=\"Activity_04lj9f1\" targetRef=\"Event_0d1yd6u\" />\n    </bpmn:subProcess>\n    <bpmn:endEvent id=\"Event_0jx00oa\">\n      <bpmn:incoming>Flow_1g0nlgh</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:sequenceFlow id=\"Flow_1g0nlgh\" sourceRef=\"Activity_12td433\" targetRef=\"Event_0jx00oa\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"subflow_test_001\">\n      <bpmndi:BPMNEdge id=\"Flow_0zkxi10_di\" bpmnElement=\"Flow_0zkxi10\" waypoints=\"\">\n        <di:waypoint x=\"209\" y=\"120\" />\n        <di:waypoint x=\"300\" y=\"120\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_1g0nlgh_di\" bpmnElement=\"Flow_1g0nlgh\" waypoints=\"\">\n        <di:waypoint x=\"720\" y=\"120\" />\n        <di:waypoint x=\"812\" y=\"120\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"173\" y=\"102\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"179\" y=\"145\" width=\"24\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0jx00oa_di\" bpmnElement=\"Event_0jx00oa\">\n        <dc:Bounds x=\"812\" y=\"102\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_0whh784_di\" bpmnElement=\"Activity_12td433\" isExpanded=\"true\">\n        <dc:Bounds x=\"300\" y=\"20\" width=\"420\" height=\"200\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Flow_1sv8pyg_di\" bpmnElement=\"Flow_1sv8pyg\" waypoints=\"\">\n        <di:waypoint x=\"368\" y=\"120\" />\n        <di:waypoint x=\"420\" y=\"120\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_1oc2lcj_di\" bpmnElement=\"Flow_1oc2lcj\" waypoints=\"\">\n        <di:waypoint x=\"520\" y=\"120\" />\n        <di:waypoint x=\"582\" y=\"120\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Event_15wt66m_di\" bpmnElement=\"Event_15wt66m\">\n        <dc:Bounds x=\"331.6666666666667\" y=\"102\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_04lj9f1_di\" bpmnElement=\"Activity_04lj9f1\">\n        <dc:Bounds x=\"420\" y=\"80\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0d1yd6u_di\" bpmnElement=\"Event_0d1yd6u\">\n        <dc:Bounds x=\"582\" y=\"102\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/resources/flow/cases/terminate/flow_terminate001.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"flow_bpmn_terminate001\" isExecutable=\"false\">\n    <bpmn:startEvent id=\"StartEvent_1\">\n      <bpmn:outgoing>Flow_0w91l7g</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:sequenceFlow id=\"Flow_0w91l7g\" sourceRef=\"StartEvent_1\" targetRef=\"Event_1b8oyj9\" />\n    <bpmn:endEvent id=\"Event_1b8oyj9\">\n      <bpmn:incoming>Flow_0w91l7g</bpmn:incoming>\n      <bpmn:terminateEventDefinition id=\"TerminateEventDefinition_1dpvki8\" />\n    </bpmn:endEvent>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"terminate_001\">\n      <bpmndi:BPMNEdge id=\"Flow_0w91l7g_di\" bpmnElement=\"Flow_0w91l7g\" waypoints=\"\">\n        <di:waypoint x=\"209\" y=\"120\" />\n        <di:waypoint x=\"262\" y=\"120\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"173\" y=\"102\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_06dt7t4_di\" bpmnElement=\"Event_1b8oyj9\">\n        <dc:Bounds x=\"262\" y=\"102\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/resources/flow/cases/throwevent/flow_throwevent001.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:easyflow=\"http://jd.com/easyflow\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"flow_throwevent001\" isExecutable=\"false\">\n    <bpmn:sequenceFlow id=\"Flow_10hbpzz\" sourceRef=\"StartEvent_1\" targetRef=\"Event_1wyb331\" />\n    <bpmn:intermediateCatchEvent id=\"Event_1wyb331\">\n      <bpmn:extensionElements>\n        <easyflow:action>{\"exp\":\"@throwEventNodeAction.execute()\"}</easyflow:action>\n      </bpmn:extensionElements>\n      <bpmn:incoming>Flow_10hbpzz</bpmn:incoming>\n      <bpmn:outgoing>Flow_1axfbpv</bpmn:outgoing>\n      <bpmn:messageEventDefinition id=\"MessageEventDefinition_0istbkd\" />\n    </bpmn:intermediateCatchEvent>\n    <bpmn:sequenceFlow id=\"Flow_1axfbpv\" sourceRef=\"Event_1wyb331\" targetRef=\"Event_1l50siw\" />\n    <bpmn:startEvent id=\"StartEvent_1\">\n      <bpmn:extensionElements>\n        <easyflow:action>{\"exp\":\"@startNodeAction.execute()\"}</easyflow:action>\n      </bpmn:extensionElements>\n      <bpmn:outgoing>Flow_10hbpzz</bpmn:outgoing>\n      <bpmn:messageEventDefinition id=\"MessageEventDefinition_0iukaum\" />\n    </bpmn:startEvent>\n    <bpmn:endEvent id=\"Event_1l50siw\">\n      <bpmn:extensionElements>\n        <easyflow:action>{\"exp\":\"@endNodeAction.execute()\"}</easyflow:action>\n      </bpmn:extensionElements>\n      <bpmn:incoming>Flow_1axfbpv</bpmn:incoming>\n      <bpmn:messageEventDefinition id=\"MessageEventDefinition_0xwdtmt\" />\n    </bpmn:endEvent>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">\n      <bpmndi:BPMNShape id=\"Event_0k9i1f4_di\" bpmnElement=\"StartEvent_1\">\n        <dc:Bounds x=\"173\" y=\"102\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1wyb331_di\" bpmnElement=\"Event_1wyb331\">\n        <dc:Bounds x=\"282\" y=\"102\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0wsxxpz_di\" bpmnElement=\"Event_1l50siw\">\n        <dc:Bounds x=\"382\" y=\"102\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Flow_10hbpzz_di\" bpmnElement=\"Flow_10hbpzz\">\n        <di:waypoint x=\"209\" y=\"120\" />\n        <di:waypoint x=\"282\" y=\"120\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_1axfbpv_di\" bpmnElement=\"Flow_1axfbpv\">\n        <di:waypoint x=\"318\" y=\"120\" />\n        <di:waypoint x=\"382\" y=\"120\" />\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/resources/flow/ext/cases/chain/flow_chaintest1.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:easyflow=\"http://jd.com/easyflow\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"flow_chaintest1\" isExecutable=\"false\">\n    <bpmn:scriptTask id=\"plugin1\" name=\"Plugin1\" scriptFormat=\"createExp\">\n      <bpmn:extensionElements>\n        <easyflow:extProperties>{\"commentWidth\":159,\"commentPosition\":{\"top\":18,\"left\":71}}</easyflow:extProperties>\n        <easyflow:conditionType>exclusive</easyflow:conditionType>\n      </bpmn:extensionElements>\n      <bpmn:incoming>Flow_0modaq2</bpmn:incoming>\n      <bpmn:incoming>Flow_1h77pr5</bpmn:incoming>\n      <bpmn:outgoing>Flow_161s0ml</bpmn:outgoing>\n      <bpmn:outgoing>Flow_1ipaej0</bpmn:outgoing>\n      <bpmn:script>new com.jd.easyflow.flow.bpmn.ext.cases.chain.Plugin1()</bpmn:script>\n    </bpmn:scriptTask>\n    <bpmn:scriptTask id=\"plugin2\" name=\"Plugin2\" scriptFormat=\"createExp\">\n      <bpmn:extensionElements>\n        <easyflow:extProperties>{\"commentWidth\":155,\"commentPosition\":{\"top\":21,\"left\":68}}</easyflow:extProperties>\n        <easyflow:conditionType>exclusive</easyflow:conditionType>\n      </bpmn:extensionElements>\n      <bpmn:incoming>Flow_161s0ml</bpmn:incoming>\n      <bpmn:incoming>Flow_0hype9i</bpmn:incoming>\n      <bpmn:outgoing>Flow_0nnnvyb</bpmn:outgoing>\n      <bpmn:outgoing>Flow_1h77pr5</bpmn:outgoing>\n      <bpmn:script>new com.jd.easyflow.flow.bpmn.ext.cases.chain.Plugin2()</bpmn:script>\n    </bpmn:scriptTask>\n    <bpmn:sequenceFlow id=\"Flow_161s0ml\" sourceRef=\"plugin1\" targetRef=\"plugin2\">\n      <bpmn:extensionElements>\n        <easyflow:extProperties>{\"commentPosition\":{\"top\":-52,\"left\":4},\"commentWidth\":256}</easyflow:extProperties>\n      </bpmn:extensionElements>\n      <bpmn:conditionExpression xsi:type=\"bpmn:tFormalExpression\">context.get('chainStage')=='PRE'</bpmn:conditionExpression>\n    </bpmn:sequenceFlow>\n    <bpmn:scriptTask id=\"plugin3\" name=\"Plugin3\" scriptFormat=\"createExp\">\n      <bpmn:extensionElements>\n        <easyflow:extProperties>{\"commentWidth\":152,\"commentPosition\":{\"top\":19,\"left\":70}}</easyflow:extProperties>\n        <easyflow:conditionType>exclusive</easyflow:conditionType>\n      </bpmn:extensionElements>\n      <bpmn:incoming>Flow_0nnnvyb</bpmn:incoming>\n      <bpmn:incoming>Flow_0woq951</bpmn:incoming>\n      <bpmn:outgoing>Flow_1rtbe85</bpmn:outgoing>\n      <bpmn:outgoing>Flow_0hype9i</bpmn:outgoing>\n      <bpmn:script>new com.jd.easyflow.flow.bpmn.ext.cases.chain.Plugin3()</bpmn:script>\n    </bpmn:scriptTask>\n    <bpmn:sequenceFlow id=\"Flow_0nnnvyb\" sourceRef=\"plugin2\" targetRef=\"plugin3\">\n      <bpmn:extensionElements>\n        <easyflow:extProperties>{\"commentWidth\":252,\"commentPosition\":{\"top\":-51,\"left\":0}}</easyflow:extProperties>\n      </bpmn:extensionElements>\n      <bpmn:conditionExpression xsi:type=\"bpmn:tFormalExpression\">context.get('chainStage')=='PRE'</bpmn:conditionExpression>\n    </bpmn:sequenceFlow>\n    <bpmn:scriptTask id=\"realTarget\" name=\"Request Execute\" scriptFormat=\"createExp\">\n      <bpmn:extensionElements>\n        <easyflow:extProperties>{\"commentWidth\":164,\"commentPosition\":{\"top\":87,\"left\":4}}</easyflow:extProperties>\n        <easyflow:conditionType>exclusive</easyflow:conditionType>\n      </bpmn:extensionElements>\n      <bpmn:incoming>Flow_1rtbe85</bpmn:incoming>\n      <bpmn:outgoing>Flow_0woq951</bpmn:outgoing>\n      <bpmn:script>new com.jd.easyflow.flow.ext.chain.TargetAction()</bpmn:script>\n    </bpmn:scriptTask>\n    <bpmn:sequenceFlow id=\"Flow_1rtbe85\" sourceRef=\"plugin3\" targetRef=\"realTarget\">\n      <bpmn:extensionElements>\n        <easyflow:extProperties>{\"commentPosition\":{\"top\":-52,\"left\":12},\"commentWidth\":248}</easyflow:extProperties>\n      </bpmn:extensionElements>\n      <bpmn:conditionExpression xsi:type=\"bpmn:tFormalExpression\">context.get('chainStage')=='PRE'</bpmn:conditionExpression>\n    </bpmn:sequenceFlow>\n    <bpmn:startEvent id=\"start\" name=\"Start\">\n      <bpmn:outgoing>Flow_0modaq2</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:sequenceFlow id=\"Flow_0modaq2\" sourceRef=\"start\" targetRef=\"plugin1\" />\n    <bpmn:endEvent id=\"end\" name=\"End\">\n      <bpmn:incoming>Flow_1ipaej0</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:sequenceFlow id=\"Flow_1h77pr5\" sourceRef=\"plugin2\" targetRef=\"plugin1\">\n      <bpmn:extensionElements>\n        <easyflow:extProperties>{\"commentWidth\":239,\"commentPosition\":{\"top\":21,\"left\":1}}</easyflow:extProperties>\n      </bpmn:extensionElements>\n      <bpmn:conditionExpression xsi:type=\"bpmn:tFormalExpression\">context.get('chainStage')=='POST'</bpmn:conditionExpression>\n    </bpmn:sequenceFlow>\n    <bpmn:sequenceFlow id=\"Flow_0hype9i\" sourceRef=\"plugin3\" targetRef=\"plugin2\">\n      <bpmn:extensionElements>\n        <easyflow:extProperties>{\"commentWidth\":239,\"commentPosition\":{\"top\":18,\"left\":2}}</easyflow:extProperties>\n      </bpmn:extensionElements>\n      <bpmn:conditionExpression xsi:type=\"bpmn:tFormalExpression\">context.get('chainStage')=='POST'</bpmn:conditionExpression>\n    </bpmn:sequenceFlow>\n    <bpmn:sequenceFlow id=\"Flow_0woq951\" sourceRef=\"realTarget\" targetRef=\"plugin3\" />\n    <bpmn:sequenceFlow id=\"Flow_1ipaej0\" sourceRef=\"plugin1\" targetRef=\"end\">\n      <bpmn:extensionElements>\n        <easyflow:extProperties>{\"commentWidth\":237,\"commentPosition\":{\"top\":10,\"left\":1}}</easyflow:extProperties>\n      </bpmn:extensionElements>\n      <bpmn:conditionExpression xsi:type=\"bpmn:tFormalExpression\">context.get('chainStage')=='POST'</bpmn:conditionExpression>\n    </bpmn:sequenceFlow>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"flow_chaintest1\">\n      <bpmndi:BPMNEdge id=\"Flow_1ipaej0_di\" bpmnElement=\"Flow_1ipaej0\" waypoints=\"\">\n        <di:waypoint x=\"380\" y=\"150\" />\n        <di:waypoint x=\"268\" y=\"150\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_0woq951_di\" bpmnElement=\"Flow_0woq951\" waypoints=\"\">\n        <di:waypoint x=\"1020\" y=\"150\" />\n        <di:waypoint x=\"900\" y=\"150\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_0hype9i_di\" bpmnElement=\"Flow_0hype9i\" waypoints=\"\">\n        <di:waypoint x=\"800\" y=\"140\" />\n        <di:waypoint x=\"700\" y=\"140\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_1h77pr5_di\" bpmnElement=\"Flow_1h77pr5\" waypoints=\"\">\n        <di:waypoint x=\"600\" y=\"140\" />\n        <di:waypoint x=\"480\" y=\"140\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_0modaq2_di\" bpmnElement=\"Flow_0modaq2\" waypoints=\"\">\n        <di:waypoint x=\"268\" y=\"90\" />\n        <di:waypoint x=\"380\" y=\"90\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_1rtbe85_di\" bpmnElement=\"Flow_1rtbe85\" waypoints=\"\">\n        <di:waypoint x=\"900\" y=\"100\" />\n        <di:waypoint x=\"1020\" y=\"100\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_0nnnvyb_di\" bpmnElement=\"Flow_0nnnvyb\" waypoints=\"\">\n        <di:waypoint x=\"700\" y=\"100\" />\n        <di:waypoint x=\"800\" y=\"100\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_161s0ml_di\" bpmnElement=\"Flow_161s0ml\" waypoints=\"\">\n        <di:waypoint x=\"480\" y=\"100\" />\n        <di:waypoint x=\"600\" y=\"100\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Activity_1rpzq9o_di\" bpmnElement=\"plugin1\">\n        <dc:Bounds x=\"380\" y=\"80\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1w952ml_di\" bpmnElement=\"plugin2\">\n        <dc:Bounds x=\"600\" y=\"80\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_07q7d4a_di\" bpmnElement=\"plugin3\">\n        <dc:Bounds x=\"800\" y=\"80\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1epnn2p_di\" bpmnElement=\"realTarget\">\n        <dc:Bounds x=\"1020\" y=\"80\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_02b4nma_di\" bpmnElement=\"start\">\n        <dc:Bounds x=\"232\" y=\"72\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"239\" y=\"115\" width=\"23\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_1mifkab_di\" bpmnElement=\"end\">\n        <dc:Bounds x=\"232\" y=\"132\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"239\" y=\"175\" width=\"23\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/resources/flow/quickstart/quickstart_001.bpmn",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:easyflow=\"http://jd.com/easyflow\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"quickstart_001\" name=\"Quick Start 001\" isExecutable=\"false\">\n    <bpmn:scriptTask id=\"node001\" name=\"Node001\" scriptFormat=\"createExp\">\n      <bpmn:extensionElements>\n        <easyflow:start>true</easyflow:start>\n      </bpmn:extensionElements>\n      <bpmn:outgoing>Flow_0iohk2p</bpmn:outgoing>\n      <bpmn:script>new com.jd.easyflow.flow.bpmn.quickstart.QuickStart001Node01Action()</bpmn:script>\n    </bpmn:scriptTask>\n    <bpmn:scriptTask id=\"node002\" name=\"Node002\" scriptFormat=\"createExp\">\n      <bpmn:incoming>Flow_0iohk2p</bpmn:incoming>\n      <bpmn:outgoing>Flow_0a49msy</bpmn:outgoing>\n      <bpmn:script>new com.jd.easyflow.flow.bpmn.quickstart.QuickStart002Node01Action()</bpmn:script>\n    </bpmn:scriptTask>\n    <bpmn:sequenceFlow id=\"Flow_0iohk2p\" sourceRef=\"node001\" targetRef=\"node002\" />\n    <bpmn:scriptTask id=\"node003\" name=\"Node003\" scriptFormat=\"createExp\">\n      <bpmn:incoming>Flow_0a49msy</bpmn:incoming>\n      <bpmn:script>new com.jd.easyflow.flow.bpmn.quickstart.QuickStart003Node01Action()</bpmn:script>\n    </bpmn:scriptTask>\n    <bpmn:sequenceFlow id=\"Flow_0a49msy\" sourceRef=\"node002\" targetRef=\"node003\" />\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"quickstart_001\">\n      <bpmndi:BPMNEdge id=\"Flow_0a49msy_di\" bpmnElement=\"Flow_0a49msy\" waypoints=\"\">\n        <di:waypoint x=\"510\" y=\"120\" />\n        <di:waypoint x=\"560\" y=\"120\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_0iohk2p_di\" bpmnElement=\"Flow_0iohk2p\" waypoints=\"\">\n        <di:waypoint x=\"360\" y=\"120\" />\n        <di:waypoint x=\"410\" y=\"120\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNShape id=\"Activity_0t933rz_di\" bpmnElement=\"node001\">\n        <dc:Bounds x=\"260\" y=\"80\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_100vlo4_di\" bpmnElement=\"node002\">\n        <dc:Bounds x=\"410\" y=\"80\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1tvu80v_di\" bpmnElement=\"node003\">\n        <dc:Bounds x=\"560\" y=\"80\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "easyflow-flow-bpmn/src/test/resources/logback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<configuration scan=\"true\">\n    <property name=\"APP\" value=\"flow\"/>\n    <property name=\"LOG_HOME\" value=\"/export/log/${APP}\"/>\n    <appender name=\"CONSOLE\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%d{yy-MM-dd.HH:mm:ss.SSS} [%-16t] %-5p %-22c{0} - %m%n</pattern>\n        </encoder>\n    </appender>\n    <root level=\"INFO\">\n        <appender-ref ref=\"CONSOLE\"/>\n    </root>\n</configuration>\n"
  },
  {
    "path": "easyflow-flow-bpmn/static/plugins/bootstrap/css/bootstrap-grid.css",
    "content": "/*!\n * Bootstrap Grid v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\nhtml {\n  box-sizing: border-box;\n  -ms-overflow-style: scrollbar;\n}\n\n*,\n*::before,\n*::after {\n  box-sizing: inherit;\n}\n\n.container {\n  width: 100%;\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n@media (min-width: 576px) {\n  .container {\n    max-width: 540px;\n  }\n}\n\n@media (min-width: 768px) {\n  .container {\n    max-width: 720px;\n  }\n}\n\n@media (min-width: 992px) {\n  .container {\n    max-width: 960px;\n  }\n}\n\n@media (min-width: 1200px) {\n  .container {\n    max-width: 1140px;\n  }\n}\n\n.container-fluid {\n  width: 100%;\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.row {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.no-gutters {\n  margin-right: 0;\n  margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n  position: relative;\n  width: 100%;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n\n.col {\n  -ms-flex-preferred-size: 0;\n  flex-basis: 0;\n  -ms-flex-positive: 1;\n  flex-grow: 1;\n  max-width: 100%;\n}\n\n.col-auto {\n  -ms-flex: 0 0 auto;\n  flex: 0 0 auto;\n  width: auto;\n  max-width: 100%;\n}\n\n.col-1 {\n  -ms-flex: 0 0 8.333333%;\n  flex: 0 0 8.333333%;\n  max-width: 8.333333%;\n}\n\n.col-2 {\n  -ms-flex: 0 0 16.666667%;\n  flex: 0 0 16.666667%;\n  max-width: 16.666667%;\n}\n\n.col-3 {\n  -ms-flex: 0 0 25%;\n  flex: 0 0 25%;\n  max-width: 25%;\n}\n\n.col-4 {\n  -ms-flex: 0 0 33.333333%;\n  flex: 0 0 33.333333%;\n  max-width: 33.333333%;\n}\n\n.col-5 {\n  -ms-flex: 0 0 41.666667%;\n  flex: 0 0 41.666667%;\n  max-width: 41.666667%;\n}\n\n.col-6 {\n  -ms-flex: 0 0 50%;\n  flex: 0 0 50%;\n  max-width: 50%;\n}\n\n.col-7 {\n  -ms-flex: 0 0 58.333333%;\n  flex: 0 0 58.333333%;\n  max-width: 58.333333%;\n}\n\n.col-8 {\n  -ms-flex: 0 0 66.666667%;\n  flex: 0 0 66.666667%;\n  max-width: 66.666667%;\n}\n\n.col-9 {\n  -ms-flex: 0 0 75%;\n  flex: 0 0 75%;\n  max-width: 75%;\n}\n\n.col-10 {\n  -ms-flex: 0 0 83.333333%;\n  flex: 0 0 83.333333%;\n  max-width: 83.333333%;\n}\n\n.col-11 {\n  -ms-flex: 0 0 91.666667%;\n  flex: 0 0 91.666667%;\n  max-width: 91.666667%;\n}\n\n.col-12 {\n  -ms-flex: 0 0 100%;\n  flex: 0 0 100%;\n  max-width: 100%;\n}\n\n.order-first {\n  -ms-flex-order: -1;\n  order: -1;\n}\n\n.order-last {\n  -ms-flex-order: 13;\n  order: 13;\n}\n\n.order-0 {\n  -ms-flex-order: 0;\n  order: 0;\n}\n\n.order-1 {\n  -ms-flex-order: 1;\n  order: 1;\n}\n\n.order-2 {\n  -ms-flex-order: 2;\n  order: 2;\n}\n\n.order-3 {\n  -ms-flex-order: 3;\n  order: 3;\n}\n\n.order-4 {\n  -ms-flex-order: 4;\n  order: 4;\n}\n\n.order-5 {\n  -ms-flex-order: 5;\n  order: 5;\n}\n\n.order-6 {\n  -ms-flex-order: 6;\n  order: 6;\n}\n\n.order-7 {\n  -ms-flex-order: 7;\n  order: 7;\n}\n\n.order-8 {\n  -ms-flex-order: 8;\n  order: 8;\n}\n\n.order-9 {\n  -ms-flex-order: 9;\n  order: 9;\n}\n\n.order-10 {\n  -ms-flex-order: 10;\n  order: 10;\n}\n\n.order-11 {\n  -ms-flex-order: 11;\n  order: 11;\n}\n\n.order-12 {\n  -ms-flex-order: 12;\n  order: 12;\n}\n\n.offset-1 {\n  margin-left: 8.333333%;\n}\n\n.offset-2 {\n  margin-left: 16.666667%;\n}\n\n.offset-3 {\n  margin-left: 25%;\n}\n\n.offset-4 {\n  margin-left: 33.333333%;\n}\n\n.offset-5 {\n  margin-left: 41.666667%;\n}\n\n.offset-6 {\n  margin-left: 50%;\n}\n\n.offset-7 {\n  margin-left: 58.333333%;\n}\n\n.offset-8 {\n  margin-left: 66.666667%;\n}\n\n.offset-9 {\n  margin-left: 75%;\n}\n\n.offset-10 {\n  margin-left: 83.333333%;\n}\n\n.offset-11 {\n  margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n  .col-sm {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-sm-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: 100%;\n  }\n  .col-sm-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-sm-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-sm-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-sm-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-sm-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-sm-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-sm-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-sm-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-sm-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-sm-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-sm-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-sm-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-sm-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-sm-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-sm-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-sm-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-sm-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-sm-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-sm-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-sm-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-sm-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-sm-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-sm-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-sm-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-sm-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-sm-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-sm-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-sm-0 {\n    margin-left: 0;\n  }\n  .offset-sm-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-sm-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-sm-3 {\n    margin-left: 25%;\n  }\n  .offset-sm-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-sm-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-sm-6 {\n    margin-left: 50%;\n  }\n  .offset-sm-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-sm-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-sm-9 {\n    margin-left: 75%;\n  }\n  .offset-sm-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-sm-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 768px) {\n  .col-md {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-md-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: 100%;\n  }\n  .col-md-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-md-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-md-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-md-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-md-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-md-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-md-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-md-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-md-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-md-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-md-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-md-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-md-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-md-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-md-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-md-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-md-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-md-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-md-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-md-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-md-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-md-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-md-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-md-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-md-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-md-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-md-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-md-0 {\n    margin-left: 0;\n  }\n  .offset-md-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-md-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-md-3 {\n    margin-left: 25%;\n  }\n  .offset-md-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-md-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-md-6 {\n    margin-left: 50%;\n  }\n  .offset-md-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-md-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-md-9 {\n    margin-left: 75%;\n  }\n  .offset-md-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-md-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 992px) {\n  .col-lg {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-lg-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: 100%;\n  }\n  .col-lg-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-lg-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-lg-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-lg-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-lg-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-lg-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-lg-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-lg-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-lg-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-lg-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-lg-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-lg-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-lg-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-lg-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-lg-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-lg-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-lg-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-lg-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-lg-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-lg-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-lg-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-lg-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-lg-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-lg-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-lg-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-lg-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-lg-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-lg-0 {\n    margin-left: 0;\n  }\n  .offset-lg-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-lg-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-lg-3 {\n    margin-left: 25%;\n  }\n  .offset-lg-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-lg-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-lg-6 {\n    margin-left: 50%;\n  }\n  .offset-lg-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-lg-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-lg-9 {\n    margin-left: 75%;\n  }\n  .offset-lg-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-lg-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 1200px) {\n  .col-xl {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-xl-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: 100%;\n  }\n  .col-xl-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-xl-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-xl-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-xl-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-xl-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-xl-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-xl-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-xl-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-xl-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-xl-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-xl-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-xl-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-xl-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-xl-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-xl-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-xl-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-xl-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-xl-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-xl-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-xl-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-xl-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-xl-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-xl-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-xl-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-xl-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-xl-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-xl-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-xl-0 {\n    margin-left: 0;\n  }\n  .offset-xl-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-xl-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-xl-3 {\n    margin-left: 25%;\n  }\n  .offset-xl-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-xl-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-xl-6 {\n    margin-left: 50%;\n  }\n  .offset-xl-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-xl-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-xl-9 {\n    margin-left: 75%;\n  }\n  .offset-xl-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-xl-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n.d-none {\n  display: none !important;\n}\n\n.d-inline {\n  display: inline !important;\n}\n\n.d-inline-block {\n  display: inline-block !important;\n}\n\n.d-block {\n  display: block !important;\n}\n\n.d-table {\n  display: table !important;\n}\n\n.d-table-row {\n  display: table-row !important;\n}\n\n.d-table-cell {\n  display: table-cell !important;\n}\n\n.d-flex {\n  display: -ms-flexbox !important;\n  display: flex !important;\n}\n\n.d-inline-flex {\n  display: -ms-inline-flexbox !important;\n  display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n  .d-sm-none {\n    display: none !important;\n  }\n  .d-sm-inline {\n    display: inline !important;\n  }\n  .d-sm-inline-block {\n    display: inline-block !important;\n  }\n  .d-sm-block {\n    display: block !important;\n  }\n  .d-sm-table {\n    display: table !important;\n  }\n  .d-sm-table-row {\n    display: table-row !important;\n  }\n  .d-sm-table-cell {\n    display: table-cell !important;\n  }\n  .d-sm-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-sm-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .d-md-none {\n    display: none !important;\n  }\n  .d-md-inline {\n    display: inline !important;\n  }\n  .d-md-inline-block {\n    display: inline-block !important;\n  }\n  .d-md-block {\n    display: block !important;\n  }\n  .d-md-table {\n    display: table !important;\n  }\n  .d-md-table-row {\n    display: table-row !important;\n  }\n  .d-md-table-cell {\n    display: table-cell !important;\n  }\n  .d-md-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-md-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .d-lg-none {\n    display: none !important;\n  }\n  .d-lg-inline {\n    display: inline !important;\n  }\n  .d-lg-inline-block {\n    display: inline-block !important;\n  }\n  .d-lg-block {\n    display: block !important;\n  }\n  .d-lg-table {\n    display: table !important;\n  }\n  .d-lg-table-row {\n    display: table-row !important;\n  }\n  .d-lg-table-cell {\n    display: table-cell !important;\n  }\n  .d-lg-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-lg-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .d-xl-none {\n    display: none !important;\n  }\n  .d-xl-inline {\n    display: inline !important;\n  }\n  .d-xl-inline-block {\n    display: inline-block !important;\n  }\n  .d-xl-block {\n    display: block !important;\n  }\n  .d-xl-table {\n    display: table !important;\n  }\n  .d-xl-table-row {\n    display: table-row !important;\n  }\n  .d-xl-table-cell {\n    display: table-cell !important;\n  }\n  .d-xl-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-xl-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media print {\n  .d-print-none {\n    display: none !important;\n  }\n  .d-print-inline {\n    display: inline !important;\n  }\n  .d-print-inline-block {\n    display: inline-block !important;\n  }\n  .d-print-block {\n    display: block !important;\n  }\n  .d-print-table {\n    display: table !important;\n  }\n  .d-print-table-row {\n    display: table-row !important;\n  }\n  .d-print-table-cell {\n    display: table-cell !important;\n  }\n  .d-print-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-print-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n.flex-row {\n  -ms-flex-direction: row !important;\n  flex-direction: row !important;\n}\n\n.flex-column {\n  -ms-flex-direction: column !important;\n  flex-direction: column !important;\n}\n\n.flex-row-reverse {\n  -ms-flex-direction: row-reverse !important;\n  flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n  -ms-flex-direction: column-reverse !important;\n  flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n  -ms-flex-wrap: wrap !important;\n  flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n  -ms-flex-wrap: nowrap !important;\n  flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n  -ms-flex-wrap: wrap-reverse !important;\n  flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n  -ms-flex: 1 1 auto !important;\n  flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n  -ms-flex-positive: 0 !important;\n  flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n  -ms-flex-positive: 1 !important;\n  flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n  -ms-flex-negative: 0 !important;\n  flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n  -ms-flex-negative: 1 !important;\n  flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n  -ms-flex-pack: start !important;\n  justify-content: flex-start !important;\n}\n\n.justify-content-end {\n  -ms-flex-pack: end !important;\n  justify-content: flex-end !important;\n}\n\n.justify-content-center {\n  -ms-flex-pack: center !important;\n  justify-content: center !important;\n}\n\n.justify-content-between {\n  -ms-flex-pack: justify !important;\n  justify-content: space-between !important;\n}\n\n.justify-content-around {\n  -ms-flex-pack: distribute !important;\n  justify-content: space-around !important;\n}\n\n.align-items-start {\n  -ms-flex-align: start !important;\n  align-items: flex-start !important;\n}\n\n.align-items-end {\n  -ms-flex-align: end !important;\n  align-items: flex-end !important;\n}\n\n.align-items-center {\n  -ms-flex-align: center !important;\n  align-items: center !important;\n}\n\n.align-items-baseline {\n  -ms-flex-align: baseline !important;\n  align-items: baseline !important;\n}\n\n.align-items-stretch {\n  -ms-flex-align: stretch !important;\n  align-items: stretch !important;\n}\n\n.align-content-start {\n  -ms-flex-line-pack: start !important;\n  align-content: flex-start !important;\n}\n\n.align-content-end {\n  -ms-flex-line-pack: end !important;\n  align-content: flex-end !important;\n}\n\n.align-content-center {\n  -ms-flex-line-pack: center !important;\n  align-content: center !important;\n}\n\n.align-content-between {\n  -ms-flex-line-pack: justify !important;\n  align-content: space-between !important;\n}\n\n.align-content-around {\n  -ms-flex-line-pack: distribute !important;\n  align-content: space-around !important;\n}\n\n.align-content-stretch {\n  -ms-flex-line-pack: stretch !important;\n  align-content: stretch !important;\n}\n\n.align-self-auto {\n  -ms-flex-item-align: auto !important;\n  align-self: auto !important;\n}\n\n.align-self-start {\n  -ms-flex-item-align: start !important;\n  align-self: flex-start !important;\n}\n\n.align-self-end {\n  -ms-flex-item-align: end !important;\n  align-self: flex-end !important;\n}\n\n.align-self-center {\n  -ms-flex-item-align: center !important;\n  align-self: center !important;\n}\n\n.align-self-baseline {\n  -ms-flex-item-align: baseline !important;\n  align-self: baseline !important;\n}\n\n.align-self-stretch {\n  -ms-flex-item-align: stretch !important;\n  align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n  .flex-sm-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-sm-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-sm-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-sm-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-sm-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-sm-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-sm-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-sm-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-sm-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-sm-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-sm-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-sm-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-sm-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-sm-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-sm-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-sm-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-sm-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-sm-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-sm-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-sm-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-sm-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-sm-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-sm-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-sm-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-sm-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-sm-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-sm-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-sm-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-sm-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-sm-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-sm-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-sm-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-sm-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-sm-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .flex-md-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-md-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-md-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-md-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-md-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-md-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-md-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-md-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-md-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-md-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-md-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-md-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-md-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-md-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-md-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-md-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-md-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-md-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-md-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-md-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-md-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-md-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-md-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-md-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-md-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-md-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-md-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-md-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-md-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-md-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-md-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-md-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-md-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-md-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .flex-lg-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-lg-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-lg-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-lg-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-lg-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-lg-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-lg-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-lg-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-lg-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-lg-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-lg-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-lg-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-lg-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-lg-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-lg-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-lg-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-lg-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-lg-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-lg-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-lg-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-lg-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-lg-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-lg-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-lg-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-lg-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-lg-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-lg-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-lg-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-lg-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-lg-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-lg-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-lg-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-lg-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-lg-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .flex-xl-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-xl-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-xl-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-xl-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-xl-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-xl-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-xl-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-xl-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-xl-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-xl-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-xl-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-xl-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-xl-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-xl-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-xl-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-xl-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-xl-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-xl-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-xl-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-xl-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-xl-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-xl-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-xl-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-xl-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-xl-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-xl-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-xl-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-xl-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-xl-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-xl-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-xl-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-xl-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-xl-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-xl-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n.m-0 {\n  margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n  margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n  margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n  margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n  margin-left: 0 !important;\n}\n\n.m-1 {\n  margin: 0.25rem !important;\n}\n\n.mt-1,\n.my-1 {\n  margin-top: 0.25rem !important;\n}\n\n.mr-1,\n.mx-1 {\n  margin-right: 0.25rem !important;\n}\n\n.mb-1,\n.my-1 {\n  margin-bottom: 0.25rem !important;\n}\n\n.ml-1,\n.mx-1 {\n  margin-left: 0.25rem !important;\n}\n\n.m-2 {\n  margin: 0.5rem !important;\n}\n\n.mt-2,\n.my-2 {\n  margin-top: 0.5rem !important;\n}\n\n.mr-2,\n.mx-2 {\n  margin-right: 0.5rem !important;\n}\n\n.mb-2,\n.my-2 {\n  margin-bottom: 0.5rem !important;\n}\n\n.ml-2,\n.mx-2 {\n  margin-left: 0.5rem !important;\n}\n\n.m-3 {\n  margin: 1rem !important;\n}\n\n.mt-3,\n.my-3 {\n  margin-top: 1rem !important;\n}\n\n.mr-3,\n.mx-3 {\n  margin-right: 1rem !important;\n}\n\n.mb-3,\n.my-3 {\n  margin-bottom: 1rem !important;\n}\n\n.ml-3,\n.mx-3 {\n  margin-left: 1rem !important;\n}\n\n.m-4 {\n  margin: 1.5rem !important;\n}\n\n.mt-4,\n.my-4 {\n  margin-top: 1.5rem !important;\n}\n\n.mr-4,\n.mx-4 {\n  margin-right: 1.5rem !important;\n}\n\n.mb-4,\n.my-4 {\n  margin-bottom: 1.5rem !important;\n}\n\n.ml-4,\n.mx-4 {\n  margin-left: 1.5rem !important;\n}\n\n.m-5 {\n  margin: 3rem !important;\n}\n\n.mt-5,\n.my-5 {\n  margin-top: 3rem !important;\n}\n\n.mr-5,\n.mx-5 {\n  margin-right: 3rem !important;\n}\n\n.mb-5,\n.my-5 {\n  margin-bottom: 3rem !important;\n}\n\n.ml-5,\n.mx-5 {\n  margin-left: 3rem !important;\n}\n\n.p-0 {\n  padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n  padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n  padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n  padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n  padding-left: 0 !important;\n}\n\n.p-1 {\n  padding: 0.25rem !important;\n}\n\n.pt-1,\n.py-1 {\n  padding-top: 0.25rem !important;\n}\n\n.pr-1,\n.px-1 {\n  padding-right: 0.25rem !important;\n}\n\n.pb-1,\n.py-1 {\n  padding-bottom: 0.25rem !important;\n}\n\n.pl-1,\n.px-1 {\n  padding-left: 0.25rem !important;\n}\n\n.p-2 {\n  padding: 0.5rem !important;\n}\n\n.pt-2,\n.py-2 {\n  padding-top: 0.5rem !important;\n}\n\n.pr-2,\n.px-2 {\n  padding-right: 0.5rem !important;\n}\n\n.pb-2,\n.py-2 {\n  padding-bottom: 0.5rem !important;\n}\n\n.pl-2,\n.px-2 {\n  padding-left: 0.5rem !important;\n}\n\n.p-3 {\n  padding: 1rem !important;\n}\n\n.pt-3,\n.py-3 {\n  padding-top: 1rem !important;\n}\n\n.pr-3,\n.px-3 {\n  padding-right: 1rem !important;\n}\n\n.pb-3,\n.py-3 {\n  padding-bottom: 1rem !important;\n}\n\n.pl-3,\n.px-3 {\n  padding-left: 1rem !important;\n}\n\n.p-4 {\n  padding: 1.5rem !important;\n}\n\n.pt-4,\n.py-4 {\n  padding-top: 1.5rem !important;\n}\n\n.pr-4,\n.px-4 {\n  padding-right: 1.5rem !important;\n}\n\n.pb-4,\n.py-4 {\n  padding-bottom: 1.5rem !important;\n}\n\n.pl-4,\n.px-4 {\n  padding-left: 1.5rem !important;\n}\n\n.p-5 {\n  padding: 3rem !important;\n}\n\n.pt-5,\n.py-5 {\n  padding-top: 3rem !important;\n}\n\n.pr-5,\n.px-5 {\n  padding-right: 3rem !important;\n}\n\n.pb-5,\n.py-5 {\n  padding-bottom: 3rem !important;\n}\n\n.pl-5,\n.px-5 {\n  padding-left: 3rem !important;\n}\n\n.m-n1 {\n  margin: -0.25rem !important;\n}\n\n.mt-n1,\n.my-n1 {\n  margin-top: -0.25rem !important;\n}\n\n.mr-n1,\n.mx-n1 {\n  margin-right: -0.25rem !important;\n}\n\n.mb-n1,\n.my-n1 {\n  margin-bottom: -0.25rem !important;\n}\n\n.ml-n1,\n.mx-n1 {\n  margin-left: -0.25rem !important;\n}\n\n.m-n2 {\n  margin: -0.5rem !important;\n}\n\n.mt-n2,\n.my-n2 {\n  margin-top: -0.5rem !important;\n}\n\n.mr-n2,\n.mx-n2 {\n  margin-right: -0.5rem !important;\n}\n\n.mb-n2,\n.my-n2 {\n  margin-bottom: -0.5rem !important;\n}\n\n.ml-n2,\n.mx-n2 {\n  margin-left: -0.5rem !important;\n}\n\n.m-n3 {\n  margin: -1rem !important;\n}\n\n.mt-n3,\n.my-n3 {\n  margin-top: -1rem !important;\n}\n\n.mr-n3,\n.mx-n3 {\n  margin-right: -1rem !important;\n}\n\n.mb-n3,\n.my-n3 {\n  margin-bottom: -1rem !important;\n}\n\n.ml-n3,\n.mx-n3 {\n  margin-left: -1rem !important;\n}\n\n.m-n4 {\n  margin: -1.5rem !important;\n}\n\n.mt-n4,\n.my-n4 {\n  margin-top: -1.5rem !important;\n}\n\n.mr-n4,\n.mx-n4 {\n  margin-right: -1.5rem !important;\n}\n\n.mb-n4,\n.my-n4 {\n  margin-bottom: -1.5rem !important;\n}\n\n.ml-n4,\n.mx-n4 {\n  margin-left: -1.5rem !important;\n}\n\n.m-n5 {\n  margin: -3rem !important;\n}\n\n.mt-n5,\n.my-n5 {\n  margin-top: -3rem !important;\n}\n\n.mr-n5,\n.mx-n5 {\n  margin-right: -3rem !important;\n}\n\n.mb-n5,\n.my-n5 {\n  margin-bottom: -3rem !important;\n}\n\n.ml-n5,\n.mx-n5 {\n  margin-left: -3rem !important;\n}\n\n.m-auto {\n  margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n  margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n  margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n  margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n  margin-left: auto !important;\n}\n\n@media (min-width: 576px) {\n  .m-sm-0 {\n    margin: 0 !important;\n  }\n  .mt-sm-0,\n  .my-sm-0 {\n    margin-top: 0 !important;\n  }\n  .mr-sm-0,\n  .mx-sm-0 {\n    margin-right: 0 !important;\n  }\n  .mb-sm-0,\n  .my-sm-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-sm-0,\n  .mx-sm-0 {\n    margin-left: 0 !important;\n  }\n  .m-sm-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-sm-1,\n  .my-sm-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-sm-1,\n  .mx-sm-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-sm-1,\n  .my-sm-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-sm-1,\n  .mx-sm-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-sm-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-sm-2,\n  .my-sm-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-sm-2,\n  .mx-sm-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-sm-2,\n  .my-sm-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-sm-2,\n  .mx-sm-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-sm-3 {\n    margin: 1rem !important;\n  }\n  .mt-sm-3,\n  .my-sm-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-sm-3,\n  .mx-sm-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-sm-3,\n  .my-sm-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-sm-3,\n  .mx-sm-3 {\n    margin-left: 1rem !important;\n  }\n  .m-sm-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-sm-4,\n  .my-sm-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-sm-4,\n  .mx-sm-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-sm-4,\n  .my-sm-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-sm-4,\n  .mx-sm-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-sm-5 {\n    margin: 3rem !important;\n  }\n  .mt-sm-5,\n  .my-sm-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-sm-5,\n  .mx-sm-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-sm-5,\n  .my-sm-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-sm-5,\n  .mx-sm-5 {\n    margin-left: 3rem !important;\n  }\n  .p-sm-0 {\n    padding: 0 !important;\n  }\n  .pt-sm-0,\n  .py-sm-0 {\n    padding-top: 0 !important;\n  }\n  .pr-sm-0,\n  .px-sm-0 {\n    padding-right: 0 !important;\n  }\n  .pb-sm-0,\n  .py-sm-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-sm-0,\n  .px-sm-0 {\n    padding-left: 0 !important;\n  }\n  .p-sm-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-sm-1,\n  .py-sm-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-sm-1,\n  .px-sm-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-sm-1,\n  .py-sm-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-sm-1,\n  .px-sm-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-sm-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-sm-2,\n  .py-sm-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-sm-2,\n  .px-sm-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-sm-2,\n  .py-sm-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-sm-2,\n  .px-sm-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-sm-3 {\n    padding: 1rem !important;\n  }\n  .pt-sm-3,\n  .py-sm-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-sm-3,\n  .px-sm-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-sm-3,\n  .py-sm-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-sm-3,\n  .px-sm-3 {\n    padding-left: 1rem !important;\n  }\n  .p-sm-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-sm-4,\n  .py-sm-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-sm-4,\n  .px-sm-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-sm-4,\n  .py-sm-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-sm-4,\n  .px-sm-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-sm-5 {\n    padding: 3rem !important;\n  }\n  .pt-sm-5,\n  .py-sm-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-sm-5,\n  .px-sm-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-sm-5,\n  .py-sm-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-sm-5,\n  .px-sm-5 {\n    padding-left: 3rem !important;\n  }\n  .m-sm-n1 {\n    margin: -0.25rem !important;\n  }\n  .mt-sm-n1,\n  .my-sm-n1 {\n    margin-top: -0.25rem !important;\n  }\n  .mr-sm-n1,\n  .mx-sm-n1 {\n    margin-right: -0.25rem !important;\n  }\n  .mb-sm-n1,\n  .my-sm-n1 {\n    margin-bottom: -0.25rem !important;\n  }\n  .ml-sm-n1,\n  .mx-sm-n1 {\n    margin-left: -0.25rem !important;\n  }\n  .m-sm-n2 {\n    margin: -0.5rem !important;\n  }\n  .mt-sm-n2,\n  .my-sm-n2 {\n    margin-top: -0.5rem !important;\n  }\n  .mr-sm-n2,\n  .mx-sm-n2 {\n    margin-right: -0.5rem !important;\n  }\n  .mb-sm-n2,\n  .my-sm-n2 {\n    margin-bottom: -0.5rem !important;\n  }\n  .ml-sm-n2,\n  .mx-sm-n2 {\n    margin-left: -0.5rem !important;\n  }\n  .m-sm-n3 {\n    margin: -1rem !important;\n  }\n  .mt-sm-n3,\n  .my-sm-n3 {\n    margin-top: -1rem !important;\n  }\n  .mr-sm-n3,\n  .mx-sm-n3 {\n    margin-right: -1rem !important;\n  }\n  .mb-sm-n3,\n  .my-sm-n3 {\n    margin-bottom: -1rem !important;\n  }\n  .ml-sm-n3,\n  .mx-sm-n3 {\n    margin-left: -1rem !important;\n  }\n  .m-sm-n4 {\n    margin: -1.5rem !important;\n  }\n  .mt-sm-n4,\n  .my-sm-n4 {\n    margin-top: -1.5rem !important;\n  }\n  .mr-sm-n4,\n  .mx-sm-n4 {\n    margin-right: -1.5rem !important;\n  }\n  .mb-sm-n4,\n  .my-sm-n4 {\n    margin-bottom: -1.5rem !important;\n  }\n  .ml-sm-n4,\n  .mx-sm-n4 {\n    margin-left: -1.5rem !important;\n  }\n  .m-sm-n5 {\n    margin: -3rem !important;\n  }\n  .mt-sm-n5,\n  .my-sm-n5 {\n    margin-top: -3rem !important;\n  }\n  .mr-sm-n5,\n  .mx-sm-n5 {\n    margin-right: -3rem !important;\n  }\n  .mb-sm-n5,\n  .my-sm-n5 {\n    margin-bottom: -3rem !important;\n  }\n  .ml-sm-n5,\n  .mx-sm-n5 {\n    margin-left: -3rem !important;\n  }\n  .m-sm-auto {\n    margin: auto !important;\n  }\n  .mt-sm-auto,\n  .my-sm-auto {\n    margin-top: auto !important;\n  }\n  .mr-sm-auto,\n  .mx-sm-auto {\n    margin-right: auto !important;\n  }\n  .mb-sm-auto,\n  .my-sm-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-sm-auto,\n  .mx-sm-auto {\n    margin-left: auto !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .m-md-0 {\n    margin: 0 !important;\n  }\n  .mt-md-0,\n  .my-md-0 {\n    margin-top: 0 !important;\n  }\n  .mr-md-0,\n  .mx-md-0 {\n    margin-right: 0 !important;\n  }\n  .mb-md-0,\n  .my-md-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-md-0,\n  .mx-md-0 {\n    margin-left: 0 !important;\n  }\n  .m-md-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-md-1,\n  .my-md-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-md-1,\n  .mx-md-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-md-1,\n  .my-md-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-md-1,\n  .mx-md-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-md-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-md-2,\n  .my-md-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-md-2,\n  .mx-md-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-md-2,\n  .my-md-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-md-2,\n  .mx-md-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-md-3 {\n    margin: 1rem !important;\n  }\n  .mt-md-3,\n  .my-md-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-md-3,\n  .mx-md-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-md-3,\n  .my-md-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-md-3,\n  .mx-md-3 {\n    margin-left: 1rem !important;\n  }\n  .m-md-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-md-4,\n  .my-md-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-md-4,\n  .mx-md-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-md-4,\n  .my-md-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-md-4,\n  .mx-md-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-md-5 {\n    margin: 3rem !important;\n  }\n  .mt-md-5,\n  .my-md-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-md-5,\n  .mx-md-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-md-5,\n  .my-md-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-md-5,\n  .mx-md-5 {\n    margin-left: 3rem !important;\n  }\n  .p-md-0 {\n    padding: 0 !important;\n  }\n  .pt-md-0,\n  .py-md-0 {\n    padding-top: 0 !important;\n  }\n  .pr-md-0,\n  .px-md-0 {\n    padding-right: 0 !important;\n  }\n  .pb-md-0,\n  .py-md-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-md-0,\n  .px-md-0 {\n    padding-left: 0 !important;\n  }\n  .p-md-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-md-1,\n  .py-md-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-md-1,\n  .px-md-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-md-1,\n  .py-md-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-md-1,\n  .px-md-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-md-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-md-2,\n  .py-md-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-md-2,\n  .px-md-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-md-2,\n  .py-md-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-md-2,\n  .px-md-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-md-3 {\n    padding: 1rem !important;\n  }\n  .pt-md-3,\n  .py-md-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-md-3,\n  .px-md-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-md-3,\n  .py-md-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-md-3,\n  .px-md-3 {\n    padding-left: 1rem !important;\n  }\n  .p-md-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-md-4,\n  .py-md-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-md-4,\n  .px-md-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-md-4,\n  .py-md-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-md-4,\n  .px-md-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-md-5 {\n    padding: 3rem !important;\n  }\n  .pt-md-5,\n  .py-md-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-md-5,\n  .px-md-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-md-5,\n  .py-md-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-md-5,\n  .px-md-5 {\n    padding-left: 3rem !important;\n  }\n  .m-md-n1 {\n    margin: -0.25rem !important;\n  }\n  .mt-md-n1,\n  .my-md-n1 {\n    margin-top: -0.25rem !important;\n  }\n  .mr-md-n1,\n  .mx-md-n1 {\n    margin-right: -0.25rem !important;\n  }\n  .mb-md-n1,\n  .my-md-n1 {\n    margin-bottom: -0.25rem !important;\n  }\n  .ml-md-n1,\n  .mx-md-n1 {\n    margin-left: -0.25rem !important;\n  }\n  .m-md-n2 {\n    margin: -0.5rem !important;\n  }\n  .mt-md-n2,\n  .my-md-n2 {\n    margin-top: -0.5rem !important;\n  }\n  .mr-md-n2,\n  .mx-md-n2 {\n    margin-right: -0.5rem !important;\n  }\n  .mb-md-n2,\n  .my-md-n2 {\n    margin-bottom: -0.5rem !important;\n  }\n  .ml-md-n2,\n  .mx-md-n2 {\n    margin-left: -0.5rem !important;\n  }\n  .m-md-n3 {\n    margin: -1rem !important;\n  }\n  .mt-md-n3,\n  .my-md-n3 {\n    margin-top: -1rem !important;\n  }\n  .mr-md-n3,\n  .mx-md-n3 {\n    margin-right: -1rem !important;\n  }\n  .mb-md-n3,\n  .my-md-n3 {\n    margin-bottom: -1rem !important;\n  }\n  .ml-md-n3,\n  .mx-md-n3 {\n    margin-left: -1rem !important;\n  }\n  .m-md-n4 {\n    margin: -1.5rem !important;\n  }\n  .mt-md-n4,\n  .my-md-n4 {\n    margin-top: -1.5rem !important;\n  }\n  .mr-md-n4,\n  .mx-md-n4 {\n    margin-right: -1.5rem !important;\n  }\n  .mb-md-n4,\n  .my-md-n4 {\n    margin-bottom: -1.5rem !important;\n  }\n  .ml-md-n4,\n  .mx-md-n4 {\n    margin-left: -1.5rem !important;\n  }\n  .m-md-n5 {\n    margin: -3rem !important;\n  }\n  .mt-md-n5,\n  .my-md-n5 {\n    margin-top: -3rem !important;\n  }\n  .mr-md-n5,\n  .mx-md-n5 {\n    margin-right: -3rem !important;\n  }\n  .mb-md-n5,\n  .my-md-n5 {\n    margin-bottom: -3rem !important;\n  }\n  .ml-md-n5,\n  .mx-md-n5 {\n    margin-left: -3rem !important;\n  }\n  .m-md-auto {\n    margin: auto !important;\n  }\n  .mt-md-auto,\n  .my-md-auto {\n    margin-top: auto !important;\n  }\n  .mr-md-auto,\n  .mx-md-auto {\n    margin-right: auto !important;\n  }\n  .mb-md-auto,\n  .my-md-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-md-auto,\n  .mx-md-auto {\n    margin-left: auto !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .m-lg-0 {\n    margin: 0 !important;\n  }\n  .mt-lg-0,\n  .my-lg-0 {\n    margin-top: 0 !important;\n  }\n  .mr-lg-0,\n  .mx-lg-0 {\n    margin-right: 0 !important;\n  }\n  .mb-lg-0,\n  .my-lg-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-lg-0,\n  .mx-lg-0 {\n    margin-left: 0 !important;\n  }\n  .m-lg-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-lg-1,\n  .my-lg-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-lg-1,\n  .mx-lg-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-lg-1,\n  .my-lg-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-lg-1,\n  .mx-lg-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-lg-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-lg-2,\n  .my-lg-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-lg-2,\n  .mx-lg-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-lg-2,\n  .my-lg-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-lg-2,\n  .mx-lg-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-lg-3 {\n    margin: 1rem !important;\n  }\n  .mt-lg-3,\n  .my-lg-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-lg-3,\n  .mx-lg-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-lg-3,\n  .my-lg-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-lg-3,\n  .mx-lg-3 {\n    margin-left: 1rem !important;\n  }\n  .m-lg-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-lg-4,\n  .my-lg-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-lg-4,\n  .mx-lg-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-lg-4,\n  .my-lg-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-lg-4,\n  .mx-lg-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-lg-5 {\n    margin: 3rem !important;\n  }\n  .mt-lg-5,\n  .my-lg-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-lg-5,\n  .mx-lg-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-lg-5,\n  .my-lg-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-lg-5,\n  .mx-lg-5 {\n    margin-left: 3rem !important;\n  }\n  .p-lg-0 {\n    padding: 0 !important;\n  }\n  .pt-lg-0,\n  .py-lg-0 {\n    padding-top: 0 !important;\n  }\n  .pr-lg-0,\n  .px-lg-0 {\n    padding-right: 0 !important;\n  }\n  .pb-lg-0,\n  .py-lg-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-lg-0,\n  .px-lg-0 {\n    padding-left: 0 !important;\n  }\n  .p-lg-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-lg-1,\n  .py-lg-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-lg-1,\n  .px-lg-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-lg-1,\n  .py-lg-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-lg-1,\n  .px-lg-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-lg-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-lg-2,\n  .py-lg-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-lg-2,\n  .px-lg-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-lg-2,\n  .py-lg-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-lg-2,\n  .px-lg-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-lg-3 {\n    padding: 1rem !important;\n  }\n  .pt-lg-3,\n  .py-lg-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-lg-3,\n  .px-lg-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-lg-3,\n  .py-lg-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-lg-3,\n  .px-lg-3 {\n    padding-left: 1rem !important;\n  }\n  .p-lg-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-lg-4,\n  .py-lg-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-lg-4,\n  .px-lg-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-lg-4,\n  .py-lg-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-lg-4,\n  .px-lg-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-lg-5 {\n    padding: 3rem !important;\n  }\n  .pt-lg-5,\n  .py-lg-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-lg-5,\n  .px-lg-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-lg-5,\n  .py-lg-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-lg-5,\n  .px-lg-5 {\n    padding-left: 3rem !important;\n  }\n  .m-lg-n1 {\n    margin: -0.25rem !important;\n  }\n  .mt-lg-n1,\n  .my-lg-n1 {\n    margin-top: -0.25rem !important;\n  }\n  .mr-lg-n1,\n  .mx-lg-n1 {\n    margin-right: -0.25rem !important;\n  }\n  .mb-lg-n1,\n  .my-lg-n1 {\n    margin-bottom: -0.25rem !important;\n  }\n  .ml-lg-n1,\n  .mx-lg-n1 {\n    margin-left: -0.25rem !important;\n  }\n  .m-lg-n2 {\n    margin: -0.5rem !important;\n  }\n  .mt-lg-n2,\n  .my-lg-n2 {\n    margin-top: -0.5rem !important;\n  }\n  .mr-lg-n2,\n  .mx-lg-n2 {\n    margin-right: -0.5rem !important;\n  }\n  .mb-lg-n2,\n  .my-lg-n2 {\n    margin-bottom: -0.5rem !important;\n  }\n  .ml-lg-n2,\n  .mx-lg-n2 {\n    margin-left: -0.5rem !important;\n  }\n  .m-lg-n3 {\n    margin: -1rem !important;\n  }\n  .mt-lg-n3,\n  .my-lg-n3 {\n    margin-top: -1rem !important;\n  }\n  .mr-lg-n3,\n  .mx-lg-n3 {\n    margin-right: -1rem !important;\n  }\n  .mb-lg-n3,\n  .my-lg-n3 {\n    margin-bottom: -1rem !important;\n  }\n  .ml-lg-n3,\n  .mx-lg-n3 {\n    margin-left: -1rem !important;\n  }\n  .m-lg-n4 {\n    margin: -1.5rem !important;\n  }\n  .mt-lg-n4,\n  .my-lg-n4 {\n    margin-top: -1.5rem !important;\n  }\n  .mr-lg-n4,\n  .mx-lg-n4 {\n    margin-right: -1.5rem !important;\n  }\n  .mb-lg-n4,\n  .my-lg-n4 {\n    margin-bottom: -1.5rem !important;\n  }\n  .ml-lg-n4,\n  .mx-lg-n4 {\n    margin-left: -1.5rem !important;\n  }\n  .m-lg-n5 {\n    margin: -3rem !important;\n  }\n  .mt-lg-n5,\n  .my-lg-n5 {\n    margin-top: -3rem !important;\n  }\n  .mr-lg-n5,\n  .mx-lg-n5 {\n    margin-right: -3rem !important;\n  }\n  .mb-lg-n5,\n  .my-lg-n5 {\n    margin-bottom: -3rem !important;\n  }\n  .ml-lg-n5,\n  .mx-lg-n5 {\n    margin-left: -3rem !important;\n  }\n  .m-lg-auto {\n    margin: auto !important;\n  }\n  .mt-lg-auto,\n  .my-lg-auto {\n    margin-top: auto !important;\n  }\n  .mr-lg-auto,\n  .mx-lg-auto {\n    margin-right: auto !important;\n  }\n  .mb-lg-auto,\n  .my-lg-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-lg-auto,\n  .mx-lg-auto {\n    margin-left: auto !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .m-xl-0 {\n    margin: 0 !important;\n  }\n  .mt-xl-0,\n  .my-xl-0 {\n    margin-top: 0 !important;\n  }\n  .mr-xl-0,\n  .mx-xl-0 {\n    margin-right: 0 !important;\n  }\n  .mb-xl-0,\n  .my-xl-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-xl-0,\n  .mx-xl-0 {\n    margin-left: 0 !important;\n  }\n  .m-xl-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-xl-1,\n  .my-xl-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-xl-1,\n  .mx-xl-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-xl-1,\n  .my-xl-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-xl-1,\n  .mx-xl-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-xl-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-xl-2,\n  .my-xl-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-xl-2,\n  .mx-xl-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-xl-2,\n  .my-xl-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-xl-2,\n  .mx-xl-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-xl-3 {\n    margin: 1rem !important;\n  }\n  .mt-xl-3,\n  .my-xl-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-xl-3,\n  .mx-xl-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-xl-3,\n  .my-xl-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-xl-3,\n  .mx-xl-3 {\n    margin-left: 1rem !important;\n  }\n  .m-xl-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-xl-4,\n  .my-xl-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-xl-4,\n  .mx-xl-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-xl-4,\n  .my-xl-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-xl-4,\n  .mx-xl-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-xl-5 {\n    margin: 3rem !important;\n  }\n  .mt-xl-5,\n  .my-xl-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-xl-5,\n  .mx-xl-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-xl-5,\n  .my-xl-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-xl-5,\n  .mx-xl-5 {\n    margin-left: 3rem !important;\n  }\n  .p-xl-0 {\n    padding: 0 !important;\n  }\n  .pt-xl-0,\n  .py-xl-0 {\n    padding-top: 0 !important;\n  }\n  .pr-xl-0,\n  .px-xl-0 {\n    padding-right: 0 !important;\n  }\n  .pb-xl-0,\n  .py-xl-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-xl-0,\n  .px-xl-0 {\n    padding-left: 0 !important;\n  }\n  .p-xl-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-xl-1,\n  .py-xl-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-xl-1,\n  .px-xl-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-xl-1,\n  .py-xl-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-xl-1,\n  .px-xl-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-xl-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-xl-2,\n  .py-xl-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-xl-2,\n  .px-xl-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-xl-2,\n  .py-xl-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-xl-2,\n  .px-xl-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-xl-3 {\n    padding: 1rem !important;\n  }\n  .pt-xl-3,\n  .py-xl-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-xl-3,\n  .px-xl-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-xl-3,\n  .py-xl-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-xl-3,\n  .px-xl-3 {\n    padding-left: 1rem !important;\n  }\n  .p-xl-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-xl-4,\n  .py-xl-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-xl-4,\n  .px-xl-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-xl-4,\n  .py-xl-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-xl-4,\n  .px-xl-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-xl-5 {\n    padding: 3rem !important;\n  }\n  .pt-xl-5,\n  .py-xl-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-xl-5,\n  .px-xl-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-xl-5,\n  .py-xl-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-xl-5,\n  .px-xl-5 {\n    padding-left: 3rem !important;\n  }\n  .m-xl-n1 {\n    margin: -0.25rem !important;\n  }\n  .mt-xl-n1,\n  .my-xl-n1 {\n    margin-top: -0.25rem !important;\n  }\n  .mr-xl-n1,\n  .mx-xl-n1 {\n    margin-right: -0.25rem !important;\n  }\n  .mb-xl-n1,\n  .my-xl-n1 {\n    margin-bottom: -0.25rem !important;\n  }\n  .ml-xl-n1,\n  .mx-xl-n1 {\n    margin-left: -0.25rem !important;\n  }\n  .m-xl-n2 {\n    margin: -0.5rem !important;\n  }\n  .mt-xl-n2,\n  .my-xl-n2 {\n    margin-top: -0.5rem !important;\n  }\n  .mr-xl-n2,\n  .mx-xl-n2 {\n    margin-right: -0.5rem !important;\n  }\n  .mb-xl-n2,\n  .my-xl-n2 {\n    margin-bottom: -0.5rem !important;\n  }\n  .ml-xl-n2,\n  .mx-xl-n2 {\n    margin-left: -0.5rem !important;\n  }\n  .m-xl-n3 {\n    margin: -1rem !important;\n  }\n  .mt-xl-n3,\n  .my-xl-n3 {\n    margin-top: -1rem !important;\n  }\n  .mr-xl-n3,\n  .mx-xl-n3 {\n    margin-right: -1rem !important;\n  }\n  .mb-xl-n3,\n  .my-xl-n3 {\n    margin-bottom: -1rem !important;\n  }\n  .ml-xl-n3,\n  .mx-xl-n3 {\n    margin-left: -1rem !important;\n  }\n  .m-xl-n4 {\n    margin: -1.5rem !important;\n  }\n  .mt-xl-n4,\n  .my-xl-n4 {\n    margin-top: -1.5rem !important;\n  }\n  .mr-xl-n4,\n  .mx-xl-n4 {\n    margin-right: -1.5rem !important;\n  }\n  .mb-xl-n4,\n  .my-xl-n4 {\n    margin-bottom: -1.5rem !important;\n  }\n  .ml-xl-n4,\n  .mx-xl-n4 {\n    margin-left: -1.5rem !important;\n  }\n  .m-xl-n5 {\n    margin: -3rem !important;\n  }\n  .mt-xl-n5,\n  .my-xl-n5 {\n    margin-top: -3rem !important;\n  }\n  .mr-xl-n5,\n  .mx-xl-n5 {\n    margin-right: -3rem !important;\n  }\n  .mb-xl-n5,\n  .my-xl-n5 {\n    margin-bottom: -3rem !important;\n  }\n  .ml-xl-n5,\n  .mx-xl-n5 {\n    margin-left: -3rem !important;\n  }\n  .m-xl-auto {\n    margin: auto !important;\n  }\n  .mt-xl-auto,\n  .my-xl-auto {\n    margin-top: auto !important;\n  }\n  .mr-xl-auto,\n  .mx-xl-auto {\n    margin-right: auto !important;\n  }\n  .mb-xl-auto,\n  .my-xl-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-xl-auto,\n  .mx-xl-auto {\n    margin-left: auto !important;\n  }\n}\n/*# sourceMappingURL=bootstrap-grid.css.map */"
  },
  {
    "path": "easyflow-flow-bpmn/static/plugins/bootstrap/css/bootstrap-reboot.css",
    "content": "/*!\n * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n*,\n*::before,\n*::after {\n  box-sizing: border-box;\n}\n\nhtml {\n  font-family: sans-serif;\n  line-height: 1.15;\n  -webkit-text-size-adjust: 100%;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n  display: block;\n}\n\nbody {\n  margin: 0;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #212529;\n  text-align: left;\n  background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n  outline: 0 !important;\n}\n\nhr {\n  box-sizing: content-box;\n  height: 0;\n  overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n  margin-top: 0;\n  margin-bottom: 0.5rem;\n}\n\np {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n  text-decoration: underline;\n  -webkit-text-decoration: underline dotted;\n  text-decoration: underline dotted;\n  cursor: help;\n  border-bottom: 0;\n  -webkit-text-decoration-skip-ink: none;\n  text-decoration-skip-ink: none;\n}\n\naddress {\n  margin-bottom: 1rem;\n  font-style: normal;\n  line-height: inherit;\n}\n\nol,\nul,\ndl {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n  margin-bottom: 0;\n}\n\ndt {\n  font-weight: 700;\n}\n\ndd {\n  margin-bottom: .5rem;\n  margin-left: 0;\n}\n\nblockquote {\n  margin: 0 0 1rem;\n}\n\nb,\nstrong {\n  font-weight: bolder;\n}\n\nsmall {\n  font-size: 80%;\n}\n\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsub {\n  bottom: -.25em;\n}\n\nsup {\n  top: -.5em;\n}\n\na {\n  color: #007bff;\n  text-decoration: none;\n  background-color: transparent;\n}\n\na:hover {\n  color: #0056b3;\n  text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n  color: inherit;\n  text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n  color: inherit;\n  text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n  outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n  font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n  font-size: 1em;\n}\n\npre {\n  margin-top: 0;\n  margin-bottom: 1rem;\n  overflow: auto;\n}\n\nfigure {\n  margin: 0 0 1rem;\n}\n\nimg {\n  vertical-align: middle;\n  border-style: none;\n}\n\nsvg {\n  overflow: hidden;\n  vertical-align: middle;\n}\n\ntable {\n  border-collapse: collapse;\n}\n\ncaption {\n  padding-top: 0.75rem;\n  padding-bottom: 0.75rem;\n  color: #6c757d;\n  text-align: left;\n  caption-side: bottom;\n}\n\nth {\n  text-align: inherit;\n}\n\nlabel {\n  display: inline-block;\n  margin-bottom: 0.5rem;\n}\n\nbutton {\n  border-radius: 0;\n}\n\nbutton:focus {\n  outline: 1px dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\nbutton,\ninput {\n  overflow: visible;\n}\n\nbutton,\nselect {\n  text-transform: none;\n}\n\nselect {\n  word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n  -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n  cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n  padding: 0;\n  border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  box-sizing: border-box;\n  padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n  -webkit-appearance: listbox;\n}\n\ntextarea {\n  overflow: auto;\n  resize: vertical;\n}\n\nfieldset {\n  min-width: 0;\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  max-width: 100%;\n  padding: 0;\n  margin-bottom: .5rem;\n  font-size: 1.5rem;\n  line-height: inherit;\n  color: inherit;\n  white-space: normal;\n}\n\nprogress {\n  vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n\n[type=\"search\"] {\n  outline-offset: -2px;\n  -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n  font: inherit;\n  -webkit-appearance: button;\n}\n\noutput {\n  display: inline-block;\n}\n\nsummary {\n  display: list-item;\n  cursor: pointer;\n}\n\ntemplate {\n  display: none;\n}\n\n[hidden] {\n  display: none !important;\n}\n/*# sourceMappingURL=bootstrap-reboot.css.map */"
  },
  {
    "path": "easyflow-flow-bpmn/static/plugins/bootstrap/css/bootstrap.css",
    "content": "/*!\n * Bootstrap v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n:root {\n  --blue: #007bff;\n  --indigo: #6610f2;\n  --purple: #6f42c1;\n  --pink: #e83e8c;\n  --red: #dc3545;\n  --orange: #fd7e14;\n  --yellow: #ffc107;\n  --green: #28a745;\n  --teal: #20c997;\n  --cyan: #17a2b8;\n  --white: #fff;\n  --gray: #6c757d;\n  --gray-dark: #343a40;\n  --primary: #007bff;\n  --secondary: #6c757d;\n  --success: #28a745;\n  --info: #17a2b8;\n  --warning: #ffc107;\n  --danger: #dc3545;\n  --light: #f8f9fa;\n  --dark: #343a40;\n  --breakpoint-xs: 0;\n  --breakpoint-sm: 576px;\n  --breakpoint-md: 768px;\n  --breakpoint-lg: 992px;\n  --breakpoint-xl: 1200px;\n  --font-family-sans-serif: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n  --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n*,\n*::before,\n*::after {\n  box-sizing: border-box;\n}\n\nhtml {\n  font-family: sans-serif;\n  line-height: 1.15;\n  -webkit-text-size-adjust: 100%;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n  display: block;\n}\n\nbody {\n  margin: 0;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #212529;\n  text-align: left;\n  background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n  outline: 0 !important;\n}\n\nhr {\n  box-sizing: content-box;\n  height: 0;\n  overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n  margin-top: 0;\n  margin-bottom: 0.5rem;\n}\n\np {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n  text-decoration: underline;\n  -webkit-text-decoration: underline dotted;\n  text-decoration: underline dotted;\n  cursor: help;\n  border-bottom: 0;\n  -webkit-text-decoration-skip-ink: none;\n  text-decoration-skip-ink: none;\n}\n\naddress {\n  margin-bottom: 1rem;\n  font-style: normal;\n  line-height: inherit;\n}\n\nol,\nul,\ndl {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n  margin-bottom: 0;\n}\n\ndt {\n  font-weight: 700;\n}\n\ndd {\n  margin-bottom: .5rem;\n  margin-left: 0;\n}\n\nblockquote {\n  margin: 0 0 1rem;\n}\n\nb,\nstrong {\n  font-weight: bolder;\n}\n\nsmall {\n  font-size: 80%;\n}\n\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsub {\n  bottom: -.25em;\n}\n\nsup {\n  top: -.5em;\n}\n\na {\n  color: #007bff;\n  text-decoration: none;\n  background-color: transparent;\n}\n\na:hover {\n  color: #0056b3;\n  text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n  color: inherit;\n  text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n  color: inherit;\n  text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n  outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n  font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n  font-size: 1em;\n}\n\npre {\n  margin-top: 0;\n  margin-bottom: 1rem;\n  overflow: auto;\n}\n\nfigure {\n  margin: 0 0 1rem;\n}\n\nimg {\n  vertical-align: middle;\n  border-style: none;\n}\n\nsvg {\n  overflow: hidden;\n  vertical-align: middle;\n}\n\ntable {\n  border-collapse: collapse;\n}\n\ncaption {\n  padding-top: 0.75rem;\n  padding-bottom: 0.75rem;\n  color: #6c757d;\n  text-align: left;\n  caption-side: bottom;\n}\n\nth {\n  text-align: inherit;\n}\n\nlabel {\n  display: inline-block;\n  margin-bottom: 0.5rem;\n}\n\nbutton {\n  border-radius: 0;\n}\n\nbutton:focus {\n  outline: 1px dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\nbutton,\ninput {\n  overflow: visible;\n}\n\nbutton,\nselect {\n  text-transform: none;\n}\n\nselect {\n  word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n  -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n  cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n  padding: 0;\n  border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  box-sizing: border-box;\n  padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n  -webkit-appearance: listbox;\n}\n\ntextarea {\n  overflow: auto;\n  resize: vertical;\n}\n\nfieldset {\n  min-width: 0;\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  max-width: 100%;\n  padding: 0;\n  margin-bottom: .5rem;\n  font-size: 1.5rem;\n  line-height: inherit;\n  color: inherit;\n  white-space: normal;\n}\n\nprogress {\n  vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n\n[type=\"search\"] {\n  outline-offset: -2px;\n  -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n  font: inherit;\n  -webkit-appearance: button;\n}\n\noutput {\n  display: inline-block;\n}\n\nsummary {\n  display: list-item;\n  cursor: pointer;\n}\n\ntemplate {\n  display: none;\n}\n\n[hidden] {\n  display: none !important;\n}\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n  margin-bottom: 0.5rem;\n  font-weight: 500;\n  line-height: 1.2;\n}\n\nh1, .h1 {\n  font-size: 2.5rem;\n}\n\nh2, .h2 {\n  font-size: 2rem;\n}\n\nh3, .h3 {\n  font-size: 1.75rem;\n}\n\nh4, .h4 {\n  font-size: 1.5rem;\n}\n\nh5, .h5 {\n  font-size: 1.25rem;\n}\n\nh6, .h6 {\n  font-size: 1rem;\n}\n\n.lead {\n  font-size: 1.25rem;\n  font-weight: 300;\n}\n\n.display-1 {\n  font-size: 6rem;\n  font-weight: 300;\n  line-height: 1.2;\n}\n\n.display-2 {\n  font-size: 5.5rem;\n  font-weight: 300;\n  line-height: 1.2;\n}\n\n.display-3 {\n  font-size: 4.5rem;\n  font-weight: 300;\n  line-height: 1.2;\n}\n\n.display-4 {\n  font-size: 3.5rem;\n  font-weight: 300;\n  line-height: 1.2;\n}\n\nhr {\n  margin-top: 1rem;\n  margin-bottom: 1rem;\n  border: 0;\n  border-top: 1px solid rgba(0, 0, 0, 0.1);\n}\n\nsmall,\n.small {\n  font-size: 80%;\n  font-weight: 400;\n}\n\nmark,\n.mark {\n  padding: 0.2em;\n  background-color: #fcf8e3;\n}\n\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline-item {\n  display: inline-block;\n}\n\n.list-inline-item:not(:last-child) {\n  margin-right: 0.5rem;\n}\n\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\n\n.blockquote {\n  margin-bottom: 1rem;\n  font-size: 1.25rem;\n}\n\n.blockquote-footer {\n  display: block;\n  font-size: 80%;\n  color: #6c757d;\n}\n\n.blockquote-footer::before {\n  content: \"\\2014\\00A0\";\n}\n\n.img-fluid {\n  max-width: 100%;\n  height: auto;\n}\n\n.img-thumbnail {\n  padding: 0.25rem;\n  background-color: #fff;\n  border: 1px solid #dee2e6;\n  border-radius: 0.25rem;\n  max-width: 100%;\n  height: auto;\n}\n\n.figure {\n  display: inline-block;\n}\n\n.figure-img {\n  margin-bottom: 0.5rem;\n  line-height: 1;\n}\n\n.figure-caption {\n  font-size: 90%;\n  color: #6c757d;\n}\n\ncode {\n  font-size: 87.5%;\n  color: #e83e8c;\n  word-break: break-word;\n}\n\na > code {\n  color: inherit;\n}\n\nkbd {\n  padding: 0.2rem 0.4rem;\n  font-size: 87.5%;\n  color: #fff;\n  background-color: #212529;\n  border-radius: 0.2rem;\n}\n\nkbd kbd {\n  padding: 0;\n  font-size: 100%;\n  font-weight: 700;\n}\n\npre {\n  display: block;\n  font-size: 87.5%;\n  color: #212529;\n}\n\npre code {\n  font-size: inherit;\n  color: inherit;\n  word-break: normal;\n}\n\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n\n.container {\n  width: 100%;\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n@media (min-width: 576px) {\n  .container {\n    max-width: 540px;\n  }\n}\n\n@media (min-width: 768px) {\n  .container {\n    max-width: 720px;\n  }\n}\n\n@media (min-width: 992px) {\n  .container {\n    max-width: 960px;\n  }\n}\n\n@media (min-width: 1200px) {\n  .container {\n    max-width: 1140px;\n  }\n}\n\n.container-fluid {\n  width: 100%;\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.row {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.no-gutters {\n  margin-right: 0;\n  margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n  position: relative;\n  width: 100%;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n\n.col {\n  -ms-flex-preferred-size: 0;\n  flex-basis: 0;\n  -ms-flex-positive: 1;\n  flex-grow: 1;\n  max-width: 100%;\n}\n\n.col-auto {\n  -ms-flex: 0 0 auto;\n  flex: 0 0 auto;\n  width: auto;\n  max-width: 100%;\n}\n\n.col-1 {\n  -ms-flex: 0 0 8.333333%;\n  flex: 0 0 8.333333%;\n  max-width: 8.333333%;\n}\n\n.col-2 {\n  -ms-flex: 0 0 16.666667%;\n  flex: 0 0 16.666667%;\n  max-width: 16.666667%;\n}\n\n.col-3 {\n  -ms-flex: 0 0 25%;\n  flex: 0 0 25%;\n  max-width: 25%;\n}\n\n.col-4 {\n  -ms-flex: 0 0 33.333333%;\n  flex: 0 0 33.333333%;\n  max-width: 33.333333%;\n}\n\n.col-5 {\n  -ms-flex: 0 0 41.666667%;\n  flex: 0 0 41.666667%;\n  max-width: 41.666667%;\n}\n\n.col-6 {\n  -ms-flex: 0 0 50%;\n  flex: 0 0 50%;\n  max-width: 50%;\n}\n\n.col-7 {\n  -ms-flex: 0 0 58.333333%;\n  flex: 0 0 58.333333%;\n  max-width: 58.333333%;\n}\n\n.col-8 {\n  -ms-flex: 0 0 66.666667%;\n  flex: 0 0 66.666667%;\n  max-width: 66.666667%;\n}\n\n.col-9 {\n  -ms-flex: 0 0 75%;\n  flex: 0 0 75%;\n  max-width: 75%;\n}\n\n.col-10 {\n  -ms-flex: 0 0 83.333333%;\n  flex: 0 0 83.333333%;\n  max-width: 83.333333%;\n}\n\n.col-11 {\n  -ms-flex: 0 0 91.666667%;\n  flex: 0 0 91.666667%;\n  max-width: 91.666667%;\n}\n\n.col-12 {\n  -ms-flex: 0 0 100%;\n  flex: 0 0 100%;\n  max-width: 100%;\n}\n\n.order-first {\n  -ms-flex-order: -1;\n  order: -1;\n}\n\n.order-last {\n  -ms-flex-order: 13;\n  order: 13;\n}\n\n.order-0 {\n  -ms-flex-order: 0;\n  order: 0;\n}\n\n.order-1 {\n  -ms-flex-order: 1;\n  order: 1;\n}\n\n.order-2 {\n  -ms-flex-order: 2;\n  order: 2;\n}\n\n.order-3 {\n  -ms-flex-order: 3;\n  order: 3;\n}\n\n.order-4 {\n  -ms-flex-order: 4;\n  order: 4;\n}\n\n.order-5 {\n  -ms-flex-order: 5;\n  order: 5;\n}\n\n.order-6 {\n  -ms-flex-order: 6;\n  order: 6;\n}\n\n.order-7 {\n  -ms-flex-order: 7;\n  order: 7;\n}\n\n.order-8 {\n  -ms-flex-order: 8;\n  order: 8;\n}\n\n.order-9 {\n  -ms-flex-order: 9;\n  order: 9;\n}\n\n.order-10 {\n  -ms-flex-order: 10;\n  order: 10;\n}\n\n.order-11 {\n  -ms-flex-order: 11;\n  order: 11;\n}\n\n.order-12 {\n  -ms-flex-order: 12;\n  order: 12;\n}\n\n.offset-1 {\n  margin-left: 8.333333%;\n}\n\n.offset-2 {\n  margin-left: 16.666667%;\n}\n\n.offset-3 {\n  margin-left: 25%;\n}\n\n.offset-4 {\n  margin-left: 33.333333%;\n}\n\n.offset-5 {\n  margin-left: 41.666667%;\n}\n\n.offset-6 {\n  margin-left: 50%;\n}\n\n.offset-7 {\n  margin-left: 58.333333%;\n}\n\n.offset-8 {\n  margin-left: 66.666667%;\n}\n\n.offset-9 {\n  margin-left: 75%;\n}\n\n.offset-10 {\n  margin-left: 83.333333%;\n}\n\n.offset-11 {\n  margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n  .col-sm {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-sm-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: 100%;\n  }\n  .col-sm-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-sm-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-sm-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-sm-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-sm-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-sm-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-sm-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-sm-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-sm-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-sm-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-sm-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-sm-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-sm-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-sm-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-sm-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-sm-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-sm-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-sm-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-sm-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-sm-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-sm-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-sm-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-sm-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-sm-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-sm-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-sm-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-sm-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-sm-0 {\n    margin-left: 0;\n  }\n  .offset-sm-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-sm-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-sm-3 {\n    margin-left: 25%;\n  }\n  .offset-sm-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-sm-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-sm-6 {\n    margin-left: 50%;\n  }\n  .offset-sm-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-sm-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-sm-9 {\n    margin-left: 75%;\n  }\n  .offset-sm-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-sm-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 768px) {\n  .col-md {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-md-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: 100%;\n  }\n  .col-md-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-md-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-md-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-md-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-md-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-md-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-md-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-md-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-md-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-md-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-md-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-md-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-md-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-md-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-md-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-md-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-md-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-md-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-md-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-md-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-md-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-md-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-md-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-md-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-md-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-md-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-md-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-md-0 {\n    margin-left: 0;\n  }\n  .offset-md-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-md-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-md-3 {\n    margin-left: 25%;\n  }\n  .offset-md-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-md-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-md-6 {\n    margin-left: 50%;\n  }\n  .offset-md-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-md-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-md-9 {\n    margin-left: 75%;\n  }\n  .offset-md-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-md-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 992px) {\n  .col-lg {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-lg-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: 100%;\n  }\n  .col-lg-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-lg-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-lg-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-lg-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-lg-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-lg-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-lg-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-lg-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-lg-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-lg-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-lg-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-lg-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-lg-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-lg-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-lg-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-lg-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-lg-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-lg-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-lg-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-lg-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-lg-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-lg-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-lg-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-lg-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-lg-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-lg-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-lg-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-lg-0 {\n    margin-left: 0;\n  }\n  .offset-lg-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-lg-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-lg-3 {\n    margin-left: 25%;\n  }\n  .offset-lg-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-lg-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-lg-6 {\n    margin-left: 50%;\n  }\n  .offset-lg-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-lg-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-lg-9 {\n    margin-left: 75%;\n  }\n  .offset-lg-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-lg-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 1200px) {\n  .col-xl {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-xl-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: 100%;\n  }\n  .col-xl-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-xl-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-xl-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-xl-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-xl-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-xl-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-xl-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-xl-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-xl-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-xl-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-xl-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-xl-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-xl-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-xl-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-xl-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-xl-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-xl-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-xl-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-xl-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-xl-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-xl-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-xl-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-xl-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-xl-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-xl-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-xl-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-xl-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-xl-0 {\n    margin-left: 0;\n  }\n  .offset-xl-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-xl-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-xl-3 {\n    margin-left: 25%;\n  }\n  .offset-xl-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-xl-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-xl-6 {\n    margin-left: 50%;\n  }\n  .offset-xl-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-xl-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-xl-9 {\n    margin-left: 75%;\n  }\n  .offset-xl-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-xl-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n.table {\n  width: 100%;\n  margin-bottom: 1rem;\n  color: #212529;\n}\n\n.table th,\n.table td {\n  padding: 0.75rem;\n  vertical-align: top;\n  border-top: 1px solid #dee2e6;\n}\n\n.table thead th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #dee2e6;\n}\n\n.table tbody + tbody {\n  border-top: 2px solid #dee2e6;\n}\n\n.table-sm th,\n.table-sm td {\n  padding: 0.3rem;\n}\n\n.table-bordered {\n  border: 1px solid #dee2e6;\n}\n\n.table-bordered th,\n.table-bordered td {\n  border: 1px solid #dee2e6;\n}\n\n.table-bordered thead th,\n.table-bordered thead td {\n  border-bottom-width: 2px;\n}\n\n.table-borderless th,\n.table-borderless td,\n.table-borderless thead th,\n.table-borderless tbody + tbody {\n  border: 0;\n}\n\n.table-striped tbody tr:nth-of-type(odd) {\n  background-color: rgba(0, 0, 0, 0.05);\n}\n\n.table-hover tbody tr:hover {\n  color: #212529;\n  background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-primary,\n.table-primary > th,\n.table-primary > td {\n  background-color: #b8daff;\n}\n\n.table-primary th,\n.table-primary td,\n.table-primary thead th,\n.table-primary tbody + tbody {\n  border-color: #7abaff;\n}\n\n.table-hover .table-primary:hover {\n  background-color: #9fcdff;\n}\n\n.table-hover .table-primary:hover > td,\n.table-hover .table-primary:hover > th {\n  background-color: #9fcdff;\n}\n\n.table-secondary,\n.table-secondary > th,\n.table-secondary > td {\n  background-color: #d6d8db;\n}\n\n.table-secondary th,\n.table-secondary td,\n.table-secondary thead th,\n.table-secondary tbody + tbody {\n  border-color: #b3b7bb;\n}\n\n.table-hover .table-secondary:hover {\n  background-color: #c8cbcf;\n}\n\n.table-hover .table-secondary:hover > td,\n.table-hover .table-secondary:hover > th {\n  background-color: #c8cbcf;\n}\n\n.table-success,\n.table-success > th,\n.table-success > td {\n  background-color: #c3e6cb;\n}\n\n.table-success th,\n.table-success td,\n.table-success thead th,\n.table-success tbody + tbody {\n  border-color: #8fd19e;\n}\n\n.table-hover .table-success:hover {\n  background-color: #b1dfbb;\n}\n\n.table-hover .table-success:hover > td,\n.table-hover .table-success:hover > th {\n  background-color: #b1dfbb;\n}\n\n.table-info,\n.table-info > th,\n.table-info > td {\n  background-color: #bee5eb;\n}\n\n.table-info th,\n.table-info td,\n.table-info thead th,\n.table-info tbody + tbody {\n  border-color: #86cfda;\n}\n\n.table-hover .table-info:hover {\n  background-color: #abdde5;\n}\n\n.table-hover .table-info:hover > td,\n.table-hover .table-info:hover > th {\n  background-color: #abdde5;\n}\n\n.table-warning,\n.table-warning > th,\n.table-warning > td {\n  background-color: #ffeeba;\n}\n\n.table-warning th,\n.table-warning td,\n.table-warning thead th,\n.table-warning tbody + tbody {\n  border-color: #ffdf7e;\n}\n\n.table-hover .table-warning:hover {\n  background-color: #ffe8a1;\n}\n\n.table-hover .table-warning:hover > td,\n.table-hover .table-warning:hover > th {\n  background-color: #ffe8a1;\n}\n\n.table-danger,\n.table-danger > th,\n.table-danger > td {\n  background-color: #f5c6cb;\n}\n\n.table-danger th,\n.table-danger td,\n.table-danger thead th,\n.table-danger tbody + tbody {\n  border-color: #ed969e;\n}\n\n.table-hover .table-danger:hover {\n  background-color: #f1b0b7;\n}\n\n.table-hover .table-danger:hover > td,\n.table-hover .table-danger:hover > th {\n  background-color: #f1b0b7;\n}\n\n.table-light,\n.table-light > th,\n.table-light > td {\n  background-color: #fdfdfe;\n}\n\n.table-light th,\n.table-light td,\n.table-light thead th,\n.table-light tbody + tbody {\n  border-color: #fbfcfc;\n}\n\n.table-hover .table-light:hover {\n  background-color: #ececf6;\n}\n\n.table-hover .table-light:hover > td,\n.table-hover .table-light:hover > th {\n  background-color: #ececf6;\n}\n\n.table-dark,\n.table-dark > th,\n.table-dark > td {\n  background-color: #c6c8ca;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th,\n.table-dark tbody + tbody {\n  border-color: #95999c;\n}\n\n.table-hover .table-dark:hover {\n  background-color: #b9bbbe;\n}\n\n.table-hover .table-dark:hover > td,\n.table-hover .table-dark:hover > th {\n  background-color: #b9bbbe;\n}\n\n.table-active,\n.table-active > th,\n.table-active > td {\n  background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover {\n  background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover > td,\n.table-hover .table-active:hover > th {\n  background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table .thead-dark th {\n  color: #fff;\n  background-color: #343a40;\n  border-color: #454d55;\n}\n\n.table .thead-light th {\n  color: #495057;\n  background-color: #e9ecef;\n  border-color: #dee2e6;\n}\n\n.table-dark {\n  color: #fff;\n  background-color: #343a40;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th {\n  border-color: #454d55;\n}\n\n.table-dark.table-bordered {\n  border: 0;\n}\n\n.table-dark.table-striped tbody tr:nth-of-type(odd) {\n  background-color: rgba(255, 255, 255, 0.05);\n}\n\n.table-dark.table-hover tbody tr:hover {\n  color: #fff;\n  background-color: rgba(255, 255, 255, 0.075);\n}\n\n@media (max-width: 575.98px) {\n  .table-responsive-sm {\n    display: block;\n    width: 100%;\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n  .table-responsive-sm > .table-bordered {\n    border: 0;\n  }\n}\n\n@media (max-width: 767.98px) {\n  .table-responsive-md {\n    display: block;\n    width: 100%;\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n  .table-responsive-md > .table-bordered {\n    border: 0;\n  }\n}\n\n@media (max-width: 991.98px) {\n  .table-responsive-lg {\n    display: block;\n    width: 100%;\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n  .table-responsive-lg > .table-bordered {\n    border: 0;\n  }\n}\n\n@media (max-width: 1199.98px) {\n  .table-responsive-xl {\n    display: block;\n    width: 100%;\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n  .table-responsive-xl > .table-bordered {\n    border: 0;\n  }\n}\n\n.table-responsive {\n  display: block;\n  width: 100%;\n  overflow-x: auto;\n  -webkit-overflow-scrolling: touch;\n}\n\n.table-responsive > .table-bordered {\n  border: 0;\n}\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: calc(1.5em + 0.75rem + 2px);\n  padding: 0.375rem 0.75rem;\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #495057;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid #ced4da;\n  border-radius: 0.25rem;\n  transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .form-control {\n    transition: none;\n  }\n}\n\n.form-control::-ms-expand {\n  background-color: transparent;\n  border: 0;\n}\n\n.form-control:focus {\n  color: #495057;\n  background-color: #fff;\n  border-color: #80bdff;\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.form-control::-webkit-input-placeholder {\n  color: #6c757d;\n  opacity: 1;\n}\n\n.form-control::-moz-placeholder {\n  color: #6c757d;\n  opacity: 1;\n}\n\n.form-control:-ms-input-placeholder {\n  color: #6c757d;\n  opacity: 1;\n}\n\n.form-control::-ms-input-placeholder {\n  color: #6c757d;\n  opacity: 1;\n}\n\n.form-control::placeholder {\n  color: #6c757d;\n  opacity: 1;\n}\n\n.form-control:disabled, .form-control[readonly] {\n  background-color: #e9ecef;\n  opacity: 1;\n}\n\nselect.form-control:focus::-ms-value {\n  color: #495057;\n  background-color: #fff;\n}\n\n.form-control-file,\n.form-control-range {\n  display: block;\n  width: 100%;\n}\n\n.col-form-label {\n  padding-top: calc(0.375rem + 1px);\n  padding-bottom: calc(0.375rem + 1px);\n  margin-bottom: 0;\n  font-size: inherit;\n  line-height: 1.5;\n}\n\n.col-form-label-lg {\n  padding-top: calc(0.5rem + 1px);\n  padding-bottom: calc(0.5rem + 1px);\n  font-size: 1.25rem;\n  line-height: 1.5;\n}\n\n.col-form-label-sm {\n  padding-top: calc(0.25rem + 1px);\n  padding-bottom: calc(0.25rem + 1px);\n  font-size: 0.875rem;\n  line-height: 1.5;\n}\n\n.form-control-plaintext {\n  display: block;\n  width: 100%;\n  padding-top: 0.375rem;\n  padding-bottom: 0.375rem;\n  margin-bottom: 0;\n  line-height: 1.5;\n  color: #212529;\n  background-color: transparent;\n  border: solid transparent;\n  border-width: 1px 0;\n}\n\n.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.form-control-sm {\n  height: calc(1.5em + 0.5rem + 2px);\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n  line-height: 1.5;\n  border-radius: 0.2rem;\n}\n\n.form-control-lg {\n  height: calc(1.5em + 1rem + 2px);\n  padding: 0.5rem 1rem;\n  font-size: 1.25rem;\n  line-height: 1.5;\n  border-radius: 0.3rem;\n}\n\nselect.form-control[size], select.form-control[multiple] {\n  height: auto;\n}\n\ntextarea.form-control {\n  height: auto;\n}\n\n.form-group {\n  margin-bottom: 1rem;\n}\n\n.form-text {\n  display: block;\n  margin-top: 0.25rem;\n}\n\n.form-row {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  margin-right: -5px;\n  margin-left: -5px;\n}\n\n.form-row > .col,\n.form-row > [class*=\"col-\"] {\n  padding-right: 5px;\n  padding-left: 5px;\n}\n\n.form-check {\n  position: relative;\n  display: block;\n  padding-left: 1.25rem;\n}\n\n.form-check-input {\n  position: absolute;\n  margin-top: 0.3rem;\n  margin-left: -1.25rem;\n}\n\n.form-check-input:disabled ~ .form-check-label {\n  color: #6c757d;\n}\n\n.form-check-label {\n  margin-bottom: 0;\n}\n\n.form-check-inline {\n  display: -ms-inline-flexbox;\n  display: inline-flex;\n  -ms-flex-align: center;\n  align-items: center;\n  padding-left: 0;\n  margin-right: 0.75rem;\n}\n\n.form-check-inline .form-check-input {\n  position: static;\n  margin-top: 0;\n  margin-right: 0.3125rem;\n  margin-left: 0;\n}\n\n.valid-feedback {\n  display: none;\n  width: 100%;\n  margin-top: 0.25rem;\n  font-size: 80%;\n  color: #28a745;\n}\n\n.valid-tooltip {\n  position: absolute;\n  top: 100%;\n  z-index: 5;\n  display: none;\n  max-width: 100%;\n  padding: 0.25rem 0.5rem;\n  margin-top: .1rem;\n  font-size: 0.875rem;\n  line-height: 1.5;\n  color: #fff;\n  background-color: rgba(40, 167, 69, 0.9);\n  border-radius: 0.25rem;\n}\n\n.was-validated .form-control:valid, .form-control.is-valid {\n  border-color: #28a745;\n  padding-right: calc(1.5em + 0.75rem);\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\");\n  background-repeat: no-repeat;\n  background-position: center right calc(0.375em + 0.1875rem);\n  background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus {\n  border-color: #28a745;\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .form-control:valid ~ .valid-feedback,\n.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback,\n.form-control.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\n  padding-right: calc(1.5em + 0.75rem);\n  background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .custom-select:valid, .custom-select.is-valid {\n  border-color: #28a745;\n  padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);\n  background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {\n  border-color: #28a745;\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .custom-select:valid ~ .valid-feedback,\n.was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback,\n.custom-select.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated .form-control-file:valid ~ .valid-feedback,\n.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback,\n.form-control-file.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n  color: #28a745;\n}\n\n.was-validated .form-check-input:valid ~ .valid-feedback,\n.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,\n.form-check-input.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {\n  color: #28a745;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {\n  border-color: #28a745;\n}\n\n.was-validated .custom-control-input:valid ~ .valid-feedback,\n.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback,\n.custom-control-input.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {\n  border-color: #34ce57;\n  background-color: #34ce57;\n}\n\n.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before {\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before {\n  border-color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {\n  border-color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .valid-feedback,\n.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback,\n.custom-file-input.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {\n  border-color: #28a745;\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.invalid-feedback {\n  display: none;\n  width: 100%;\n  margin-top: 0.25rem;\n  font-size: 80%;\n  color: #dc3545;\n}\n\n.invalid-tooltip {\n  position: absolute;\n  top: 100%;\n  z-index: 5;\n  display: none;\n  max-width: 100%;\n  padding: 0.25rem 0.5rem;\n  margin-top: .1rem;\n  font-size: 0.875rem;\n  line-height: 1.5;\n  color: #fff;\n  background-color: rgba(220, 53, 69, 0.9);\n  border-radius: 0.25rem;\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid {\n  border-color: #dc3545;\n  padding-right: calc(1.5em + 0.75rem);\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\");\n  background-repeat: no-repeat;\n  background-position: center right calc(0.375em + 0.1875rem);\n  background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {\n  border-color: #dc3545;\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback,\n.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback,\n.form-control.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\n  padding-right: calc(1.5em + 0.75rem);\n  background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .custom-select:invalid, .custom-select.is-invalid {\n  border-color: #dc3545;\n  padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);\n  background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {\n  border-color: #dc3545;\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .custom-select:invalid ~ .invalid-feedback,\n.was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback,\n.custom-select.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated .form-control-file:invalid ~ .invalid-feedback,\n.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback,\n.form-control-file.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n  color: #dc3545;\n}\n\n.was-validated .form-check-input:invalid ~ .invalid-feedback,\n.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,\n.form-check-input.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {\n  color: #dc3545;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {\n  border-color: #dc3545;\n}\n\n.was-validated .custom-control-input:invalid ~ .invalid-feedback,\n.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback,\n.custom-control-input.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {\n  border-color: #e4606d;\n  background-color: #e4606d;\n}\n\n.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before {\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before {\n  border-color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {\n  border-color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .invalid-feedback,\n.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback,\n.custom-file-input.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {\n  border-color: #dc3545;\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.form-inline {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-flow: row wrap;\n  flex-flow: row wrap;\n  -ms-flex-align: center;\n  align-items: center;\n}\n\n.form-inline .form-check {\n  width: 100%;\n}\n\n@media (min-width: 576px) {\n  .form-inline label {\n    display: -ms-flexbox;\n    display: flex;\n    -ms-flex-align: center;\n    align-items: center;\n    -ms-flex-pack: center;\n    justify-content: center;\n    margin-bottom: 0;\n  }\n  .form-inline .form-group {\n    display: -ms-flexbox;\n    display: flex;\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    -ms-flex-flow: row wrap;\n    flex-flow: row wrap;\n    -ms-flex-align: center;\n    align-items: center;\n    margin-bottom: 0;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .form-inline .form-control-plaintext {\n    display: inline-block;\n  }\n  .form-inline .input-group,\n  .form-inline .custom-select {\n    width: auto;\n  }\n  .form-inline .form-check {\n    display: -ms-flexbox;\n    display: flex;\n    -ms-flex-align: center;\n    align-items: center;\n    -ms-flex-pack: center;\n    justify-content: center;\n    width: auto;\n    padding-left: 0;\n  }\n  .form-inline .form-check-input {\n    position: relative;\n    -ms-flex-negative: 0;\n    flex-shrink: 0;\n    margin-top: 0;\n    margin-right: 0.25rem;\n    margin-left: 0;\n  }\n  .form-inline .custom-control {\n    -ms-flex-align: center;\n    align-items: center;\n    -ms-flex-pack: center;\n    justify-content: center;\n  }\n  .form-inline .custom-control-label {\n    margin-bottom: 0;\n  }\n}\n\n.btn {\n  display: inline-block;\n  font-weight: 400;\n  color: #212529;\n  text-align: center;\n  vertical-align: middle;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  background-color: transparent;\n  border: 1px solid transparent;\n  padding: 0.375rem 0.75rem;\n  font-size: 1rem;\n  line-height: 1.5;\n  border-radius: 0.25rem;\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .btn {\n    transition: none;\n  }\n}\n\n.btn:hover {\n  color: #212529;\n  text-decoration: none;\n}\n\n.btn:focus, .btn.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.btn.disabled, .btn:disabled {\n  opacity: 0.65;\n}\n\na.btn.disabled,\nfieldset:disabled a.btn {\n  pointer-events: none;\n}\n\n.btn-primary {\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.btn-primary:hover {\n  color: #fff;\n  background-color: #0069d9;\n  border-color: #0062cc;\n}\n\n.btn-primary:focus, .btn-primary.focus {\n  box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);\n}\n\n.btn-primary.disabled, .btn-primary:disabled {\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active,\n.show > .btn-primary.dropdown-toggle {\n  color: #fff;\n  background-color: #0062cc;\n  border-color: #005cbf;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-primary.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);\n}\n\n.btn-secondary {\n  color: #fff;\n  background-color: #6c757d;\n  border-color: #6c757d;\n}\n\n.btn-secondary:hover {\n  color: #fff;\n  background-color: #5a6268;\n  border-color: #545b62;\n}\n\n.btn-secondary:focus, .btn-secondary.focus {\n  box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);\n}\n\n.btn-secondary.disabled, .btn-secondary:disabled {\n  color: #fff;\n  background-color: #6c757d;\n  border-color: #6c757d;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-secondary.dropdown-toggle {\n  color: #fff;\n  background-color: #545b62;\n  border-color: #4e555b;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-secondary.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);\n}\n\n.btn-success {\n  color: #fff;\n  background-color: #28a745;\n  border-color: #28a745;\n}\n\n.btn-success:hover {\n  color: #fff;\n  background-color: #218838;\n  border-color: #1e7e34;\n}\n\n.btn-success:focus, .btn-success.focus {\n  box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);\n}\n\n.btn-success.disabled, .btn-success:disabled {\n  color: #fff;\n  background-color: #28a745;\n  border-color: #28a745;\n}\n\n.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active,\n.show > .btn-success.dropdown-toggle {\n  color: #fff;\n  background-color: #1e7e34;\n  border-color: #1c7430;\n}\n\n.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-success.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);\n}\n\n.btn-info {\n  color: #fff;\n  background-color: #17a2b8;\n  border-color: #17a2b8;\n}\n\n.btn-info:hover {\n  color: #fff;\n  background-color: #138496;\n  border-color: #117a8b;\n}\n\n.btn-info:focus, .btn-info.focus {\n  box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\n}\n\n.btn-info.disabled, .btn-info:disabled {\n  color: #fff;\n  background-color: #17a2b8;\n  border-color: #17a2b8;\n}\n\n.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active,\n.show > .btn-info.dropdown-toggle {\n  color: #fff;\n  background-color: #117a8b;\n  border-color: #10707f;\n}\n\n.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-info.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\n}\n\n.btn-warning {\n  color: #212529;\n  background-color: #ffc107;\n  border-color: #ffc107;\n}\n\n.btn-warning:hover {\n  color: #212529;\n  background-color: #e0a800;\n  border-color: #d39e00;\n}\n\n.btn-warning:focus, .btn-warning.focus {\n  box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);\n}\n\n.btn-warning.disabled, .btn-warning:disabled {\n  color: #212529;\n  background-color: #ffc107;\n  border-color: #ffc107;\n}\n\n.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active,\n.show > .btn-warning.dropdown-toggle {\n  color: #212529;\n  background-color: #d39e00;\n  border-color: #c69500;\n}\n\n.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-warning.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);\n}\n\n.btn-danger {\n  color: #fff;\n  background-color: #dc3545;\n  border-color: #dc3545;\n}\n\n.btn-danger:hover {\n  color: #fff;\n  background-color: #c82333;\n  border-color: #bd2130;\n}\n\n.btn-danger:focus, .btn-danger.focus {\n  box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);\n}\n\n.btn-danger.disabled, .btn-danger:disabled {\n  color: #fff;\n  background-color: #dc3545;\n  border-color: #dc3545;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active,\n.show > .btn-danger.dropdown-toggle {\n  color: #fff;\n  background-color: #bd2130;\n  border-color: #b21f2d;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-danger.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);\n}\n\n.btn-light {\n  color: #212529;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n\n.btn-light:hover {\n  color: #212529;\n  background-color: #e2e6ea;\n  border-color: #dae0e5;\n}\n\n.btn-light:focus, .btn-light.focus {\n  box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\n}\n\n.btn-light.disabled, .btn-light:disabled {\n  color: #212529;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n\n.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active,\n.show > .btn-light.dropdown-toggle {\n  color: #212529;\n  background-color: #dae0e5;\n  border-color: #d3d9df;\n}\n\n.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-light.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\n}\n\n.btn-dark {\n  color: #fff;\n  background-color: #343a40;\n  border-color: #343a40;\n}\n\n.btn-dark:hover {\n  color: #fff;\n  background-color: #23272b;\n  border-color: #1d2124;\n}\n\n.btn-dark:focus, .btn-dark.focus {\n  box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\n}\n\n.btn-dark.disabled, .btn-dark:disabled {\n  color: #fff;\n  background-color: #343a40;\n  border-color: #343a40;\n}\n\n.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active,\n.show > .btn-dark.dropdown-toggle {\n  color: #fff;\n  background-color: #1d2124;\n  border-color: #171a1d;\n}\n\n.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-dark.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\n}\n\n.btn-outline-primary {\n  color: #007bff;\n  border-color: #007bff;\n}\n\n.btn-outline-primary:hover {\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.btn-outline-primary:focus, .btn-outline-primary.focus {\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-primary.disabled, .btn-outline-primary:disabled {\n  color: #007bff;\n  background-color: transparent;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-primary.dropdown-toggle {\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-primary.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-secondary {\n  color: #6c757d;\n  border-color: #6c757d;\n}\n\n.btn-outline-secondary:hover {\n  color: #fff;\n  background-color: #6c757d;\n  border-color: #6c757d;\n}\n\n.btn-outline-secondary:focus, .btn-outline-secondary.focus {\n  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {\n  color: #6c757d;\n  background-color: transparent;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-secondary.dropdown-toggle {\n  color: #fff;\n  background-color: #6c757d;\n  border-color: #6c757d;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-secondary.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-outline-success {\n  color: #28a745;\n  border-color: #28a745;\n}\n\n.btn-outline-success:hover {\n  color: #fff;\n  background-color: #28a745;\n  border-color: #28a745;\n}\n\n.btn-outline-success:focus, .btn-outline-success.focus {\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-success.disabled, .btn-outline-success:disabled {\n  color: #28a745;\n  background-color: transparent;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active,\n.show > .btn-outline-success.dropdown-toggle {\n  color: #fff;\n  background-color: #28a745;\n  border-color: #28a745;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-success.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-info {\n  color: #17a2b8;\n  border-color: #17a2b8;\n}\n\n.btn-outline-info:hover {\n  color: #fff;\n  background-color: #17a2b8;\n  border-color: #17a2b8;\n}\n\n.btn-outline-info:focus, .btn-outline-info.focus {\n  box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-info.disabled, .btn-outline-info:disabled {\n  color: #17a2b8;\n  background-color: transparent;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active,\n.show > .btn-outline-info.dropdown-toggle {\n  color: #fff;\n  background-color: #17a2b8;\n  border-color: #17a2b8;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-info.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-warning {\n  color: #ffc107;\n  border-color: #ffc107;\n}\n\n.btn-outline-warning:hover {\n  color: #212529;\n  background-color: #ffc107;\n  border-color: #ffc107;\n}\n\n.btn-outline-warning:focus, .btn-outline-warning.focus {\n  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-warning.disabled, .btn-outline-warning:disabled {\n  color: #ffc107;\n  background-color: transparent;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active,\n.show > .btn-outline-warning.dropdown-toggle {\n  color: #212529;\n  background-color: #ffc107;\n  border-color: #ffc107;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-warning.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-danger {\n  color: #dc3545;\n  border-color: #dc3545;\n}\n\n.btn-outline-danger:hover {\n  color: #fff;\n  background-color: #dc3545;\n  border-color: #dc3545;\n}\n\n.btn-outline-danger:focus, .btn-outline-danger.focus {\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-danger.disabled, .btn-outline-danger:disabled {\n  color: #dc3545;\n  background-color: transparent;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active,\n.show > .btn-outline-danger.dropdown-toggle {\n  color: #fff;\n  background-color: #dc3545;\n  border-color: #dc3545;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-danger.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-light {\n  color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n\n.btn-outline-light:hover {\n  color: #212529;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n\n.btn-outline-light:focus, .btn-outline-light.focus {\n  box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-light.disabled, .btn-outline-light:disabled {\n  color: #f8f9fa;\n  background-color: transparent;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active,\n.show > .btn-outline-light.dropdown-toggle {\n  color: #212529;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-light.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-dark {\n  color: #343a40;\n  border-color: #343a40;\n}\n\n.btn-outline-dark:hover {\n  color: #fff;\n  background-color: #343a40;\n  border-color: #343a40;\n}\n\n.btn-outline-dark:focus, .btn-outline-dark.focus {\n  box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-outline-dark.disabled, .btn-outline-dark:disabled {\n  color: #343a40;\n  background-color: transparent;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active,\n.show > .btn-outline-dark.dropdown-toggle {\n  color: #fff;\n  background-color: #343a40;\n  border-color: #343a40;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-dark.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-link {\n  font-weight: 400;\n  color: #007bff;\n  text-decoration: none;\n}\n\n.btn-link:hover {\n  color: #0056b3;\n  text-decoration: underline;\n}\n\n.btn-link:focus, .btn-link.focus {\n  text-decoration: underline;\n  box-shadow: none;\n}\n\n.btn-link:disabled, .btn-link.disabled {\n  color: #6c757d;\n  pointer-events: none;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n  padding: 0.5rem 1rem;\n  font-size: 1.25rem;\n  line-height: 1.5;\n  border-radius: 0.3rem;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n  line-height: 1.5;\n  border-radius: 0.2rem;\n}\n\n.btn-block {\n  display: block;\n  width: 100%;\n}\n\n.btn-block + .btn-block {\n  margin-top: 0.5rem;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n\n.fade {\n  transition: opacity 0.15s linear;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .fade {\n    transition: none;\n  }\n}\n\n.fade:not(.show) {\n  opacity: 0;\n}\n\n.collapse:not(.show) {\n  display: none;\n}\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  transition: height 0.35s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .collapsing {\n    transition: none;\n  }\n}\n\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n  position: relative;\n}\n\n.dropdown-toggle {\n  white-space: nowrap;\n}\n\n.dropdown-toggle::after {\n  display: inline-block;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid;\n  border-right: 0.3em solid transparent;\n  border-bottom: 0;\n  border-left: 0.3em solid transparent;\n}\n\n.dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 10rem;\n  padding: 0.5rem 0;\n  margin: 0.125rem 0 0;\n  font-size: 1rem;\n  color: #212529;\n  text-align: left;\n  list-style: none;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 0.25rem;\n}\n\n.dropdown-menu-left {\n  right: auto;\n  left: 0;\n}\n\n.dropdown-menu-right {\n  right: 0;\n  left: auto;\n}\n\n@media (min-width: 576px) {\n  .dropdown-menu-sm-left {\n    right: auto;\n    left: 0;\n  }\n  .dropdown-menu-sm-right {\n    right: 0;\n    left: auto;\n  }\n}\n\n@media (min-width: 768px) {\n  .dropdown-menu-md-left {\n    right: auto;\n    left: 0;\n  }\n  .dropdown-menu-md-right {\n    right: 0;\n    left: auto;\n  }\n}\n\n@media (min-width: 992px) {\n  .dropdown-menu-lg-left {\n    right: auto;\n    left: 0;\n  }\n  .dropdown-menu-lg-right {\n    right: 0;\n    left: auto;\n  }\n}\n\n@media (min-width: 1200px) {\n  .dropdown-menu-xl-left {\n    right: auto;\n    left: 0;\n  }\n  .dropdown-menu-xl-right {\n    right: 0;\n    left: auto;\n  }\n}\n\n.dropup .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-top: 0;\n  margin-bottom: 0.125rem;\n}\n\n.dropup .dropdown-toggle::after {\n  display: inline-block;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0;\n  border-right: 0.3em solid transparent;\n  border-bottom: 0.3em solid;\n  border-left: 0.3em solid transparent;\n}\n\n.dropup .dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n\n.dropright .dropdown-menu {\n  top: 0;\n  right: auto;\n  left: 100%;\n  margin-top: 0;\n  margin-left: 0.125rem;\n}\n\n.dropright .dropdown-toggle::after {\n  display: inline-block;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid transparent;\n  border-right: 0;\n  border-bottom: 0.3em solid transparent;\n  border-left: 0.3em solid;\n}\n\n.dropright .dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n\n.dropright .dropdown-toggle::after {\n  vertical-align: 0;\n}\n\n.dropleft .dropdown-menu {\n  top: 0;\n  right: 100%;\n  left: auto;\n  margin-top: 0;\n  margin-right: 0.125rem;\n}\n\n.dropleft .dropdown-toggle::after {\n  display: inline-block;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n}\n\n.dropleft .dropdown-toggle::after {\n  display: none;\n}\n\n.dropleft .dropdown-toggle::before {\n  display: inline-block;\n  margin-right: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid transparent;\n  border-right: 0.3em solid;\n  border-bottom: 0.3em solid transparent;\n}\n\n.dropleft .dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n\n.dropleft .dropdown-toggle::before {\n  vertical-align: 0;\n}\n\n.dropdown-menu[x-placement^=\"top\"], .dropdown-menu[x-placement^=\"right\"], .dropdown-menu[x-placement^=\"bottom\"], .dropdown-menu[x-placement^=\"left\"] {\n  right: auto;\n  bottom: auto;\n}\n\n.dropdown-divider {\n  height: 0;\n  margin: 0.5rem 0;\n  overflow: hidden;\n  border-top: 1px solid #e9ecef;\n}\n\n.dropdown-item {\n  display: block;\n  width: 100%;\n  padding: 0.25rem 1.5rem;\n  clear: both;\n  font-weight: 400;\n  color: #212529;\n  text-align: inherit;\n  white-space: nowrap;\n  background-color: transparent;\n  border: 0;\n}\n\n.dropdown-item:hover, .dropdown-item:focus {\n  color: #16181b;\n  text-decoration: none;\n  background-color: #f8f9fa;\n}\n\n.dropdown-item.active, .dropdown-item:active {\n  color: #fff;\n  text-decoration: none;\n  background-color: #007bff;\n}\n\n.dropdown-item.disabled, .dropdown-item:disabled {\n  color: #6c757d;\n  pointer-events: none;\n  background-color: transparent;\n}\n\n.dropdown-menu.show {\n  display: block;\n}\n\n.dropdown-header {\n  display: block;\n  padding: 0.5rem 1.5rem;\n  margin-bottom: 0;\n  font-size: 0.875rem;\n  color: #6c757d;\n  white-space: nowrap;\n}\n\n.dropdown-item-text {\n  display: block;\n  padding: 0.25rem 1.5rem;\n  color: #212529;\n}\n\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: -ms-inline-flexbox;\n  display: inline-flex;\n  vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  -ms-flex: 1 1 auto;\n  flex: 1 1 auto;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover {\n  z-index: 1;\n}\n\n.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n  z-index: 1;\n}\n\n.btn-toolbar {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -ms-flex-pack: start;\n  justify-content: flex-start;\n}\n\n.btn-toolbar .input-group {\n  width: auto;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) {\n  margin-left: -1px;\n}\n\n.btn-group > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group > .btn-group:not(:last-child) > .btn {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) > .btn {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.dropdown-toggle-split {\n  padding-right: 0.5625rem;\n  padding-left: 0.5625rem;\n}\n\n.dropdown-toggle-split::after,\n.dropup .dropdown-toggle-split::after,\n.dropright .dropdown-toggle-split::after {\n  margin-left: 0;\n}\n\n.dropleft .dropdown-toggle-split::before {\n  margin-right: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n  padding-right: 0.375rem;\n  padding-left: 0.375rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n  padding-right: 0.75rem;\n  padding-left: 0.75rem;\n}\n\n.btn-group-vertical {\n  -ms-flex-direction: column;\n  flex-direction: column;\n  -ms-flex-align: start;\n  align-items: flex-start;\n  -ms-flex-pack: center;\n  justify-content: center;\n}\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n  width: 100%;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) {\n  margin-top: -1px;\n}\n\n.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group-vertical > .btn-group:not(:last-child) > .btn {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) > .btn {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n\n.btn-group-toggle > .btn,\n.btn-group-toggle > .btn-group > .btn {\n  margin-bottom: 0;\n}\n\n.btn-group-toggle > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn input[type=\"checkbox\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"checkbox\"] {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  pointer-events: none;\n}\n\n.input-group {\n  position: relative;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -ms-flex-align: stretch;\n  align-items: stretch;\n  width: 100%;\n}\n\n.input-group > .form-control,\n.input-group > .form-control-plaintext,\n.input-group > .custom-select,\n.input-group > .custom-file {\n  position: relative;\n  -ms-flex: 1 1 auto;\n  flex: 1 1 auto;\n  width: 1%;\n  margin-bottom: 0;\n}\n\n.input-group > .form-control + .form-control,\n.input-group > .form-control + .custom-select,\n.input-group > .form-control + .custom-file,\n.input-group > .form-control-plaintext + .form-control,\n.input-group > .form-control-plaintext + .custom-select,\n.input-group > .form-control-plaintext + .custom-file,\n.input-group > .custom-select + .form-control,\n.input-group > .custom-select + .custom-select,\n.input-group > .custom-select + .custom-file,\n.input-group > .custom-file + .form-control,\n.input-group > .custom-file + .custom-select,\n.input-group > .custom-file + .custom-file {\n  margin-left: -1px;\n}\n\n.input-group > .form-control:focus,\n.input-group > .custom-select:focus,\n.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label {\n  z-index: 3;\n}\n\n.input-group > .custom-file .custom-file-input:focus {\n  z-index: 4;\n}\n\n.input-group > .form-control:not(:last-child),\n.input-group > .custom-select:not(:last-child) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.input-group > .form-control:not(:first-child),\n.input-group > .custom-select:not(:first-child) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.input-group > .custom-file {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: center;\n  align-items: center;\n}\n\n.input-group > .custom-file:not(:last-child) .custom-file-label,\n.input-group > .custom-file:not(:last-child) .custom-file-label::after {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.input-group > .custom-file:not(:first-child) .custom-file-label {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.input-group-prepend,\n.input-group-append {\n  display: -ms-flexbox;\n  display: flex;\n}\n\n.input-group-prepend .btn,\n.input-group-append .btn {\n  position: relative;\n  z-index: 2;\n}\n\n.input-group-prepend .btn:focus,\n.input-group-append .btn:focus {\n  z-index: 3;\n}\n\n.input-group-prepend .btn + .btn,\n.input-group-prepend .btn + .input-group-text,\n.input-group-prepend .input-group-text + .input-group-text,\n.input-group-prepend .input-group-text + .btn,\n.input-group-append .btn + .btn,\n.input-group-append .btn + .input-group-text,\n.input-group-append .input-group-text + .input-group-text,\n.input-group-append .input-group-text + .btn {\n  margin-left: -1px;\n}\n\n.input-group-prepend {\n  margin-right: -1px;\n}\n\n.input-group-append {\n  margin-left: -1px;\n}\n\n.input-group-text {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: center;\n  align-items: center;\n  padding: 0.375rem 0.75rem;\n  margin-bottom: 0;\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #495057;\n  text-align: center;\n  white-space: nowrap;\n  background-color: #e9ecef;\n  border: 1px solid #ced4da;\n  border-radius: 0.25rem;\n}\n\n.input-group-text input[type=\"radio\"],\n.input-group-text input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n\n.input-group-lg > .form-control:not(textarea),\n.input-group-lg > .custom-select {\n  height: calc(1.5em + 1rem + 2px);\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .custom-select,\n.input-group-lg > .input-group-prepend > .input-group-text,\n.input-group-lg > .input-group-append > .input-group-text,\n.input-group-lg > .input-group-prepend > .btn,\n.input-group-lg > .input-group-append > .btn {\n  padding: 0.5rem 1rem;\n  font-size: 1.25rem;\n  line-height: 1.5;\n  border-radius: 0.3rem;\n}\n\n.input-group-sm > .form-control:not(textarea),\n.input-group-sm > .custom-select {\n  height: calc(1.5em + 0.5rem + 2px);\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .custom-select,\n.input-group-sm > .input-group-prepend > .input-group-text,\n.input-group-sm > .input-group-append > .input-group-text,\n.input-group-sm > .input-group-prepend > .btn,\n.input-group-sm > .input-group-append > .btn {\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n  line-height: 1.5;\n  border-radius: 0.2rem;\n}\n\n.input-group-lg > .custom-select,\n.input-group-sm > .custom-select {\n  padding-right: 1.75rem;\n}\n\n.input-group > .input-group-prepend > .btn,\n.input-group > .input-group-prepend > .input-group-text,\n.input-group > .input-group-append:not(:last-child) > .btn,\n.input-group > .input-group-append:not(:last-child) > .input-group-text,\n.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.input-group > .input-group-append > .btn,\n.input-group > .input-group-append > .input-group-text,\n.input-group > .input-group-prepend:not(:first-child) > .btn,\n.input-group > .input-group-prepend:not(:first-child) > .input-group-text,\n.input-group > .input-group-prepend:first-child > .btn:not(:first-child),\n.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.custom-control {\n  position: relative;\n  display: block;\n  min-height: 1.5rem;\n  padding-left: 1.5rem;\n}\n\n.custom-control-inline {\n  display: -ms-inline-flexbox;\n  display: inline-flex;\n  margin-right: 1rem;\n}\n\n.custom-control-input {\n  position: absolute;\n  z-index: -1;\n  opacity: 0;\n}\n\n.custom-control-input:checked ~ .custom-control-label::before {\n  color: #fff;\n  border-color: #007bff;\n  background-color: #007bff;\n}\n\n.custom-control-input:focus ~ .custom-control-label::before {\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-control-input:focus:not(:checked) ~ .custom-control-label::before {\n  border-color: #80bdff;\n}\n\n.custom-control-input:not(:disabled):active ~ .custom-control-label::before {\n  color: #fff;\n  background-color: #b3d7ff;\n  border-color: #b3d7ff;\n}\n\n.custom-control-input:disabled ~ .custom-control-label {\n  color: #6c757d;\n}\n\n.custom-control-input:disabled ~ .custom-control-label::before {\n  background-color: #e9ecef;\n}\n\n.custom-control-label {\n  position: relative;\n  margin-bottom: 0;\n  vertical-align: top;\n}\n\n.custom-control-label::before {\n  position: absolute;\n  top: 0.25rem;\n  left: -1.5rem;\n  display: block;\n  width: 1rem;\n  height: 1rem;\n  pointer-events: none;\n  content: \"\";\n  background-color: #fff;\n  border: #adb5bd solid 1px;\n}\n\n.custom-control-label::after {\n  position: absolute;\n  top: 0.25rem;\n  left: -1.5rem;\n  display: block;\n  width: 1rem;\n  height: 1rem;\n  content: \"\";\n  background: no-repeat 50% / 50% 50%;\n}\n\n.custom-checkbox .custom-control-label::before {\n  border-radius: 0.25rem;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e\");\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {\n  border-color: #007bff;\n  background-color: #007bff;\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e\");\n}\n\n.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {\n  background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before {\n  background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-radio .custom-control-label::before {\n  border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::after {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {\n  background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-switch {\n  padding-left: 2.25rem;\n}\n\n.custom-switch .custom-control-label::before {\n  left: -2.25rem;\n  width: 1.75rem;\n  pointer-events: all;\n  border-radius: 0.5rem;\n}\n\n.custom-switch .custom-control-label::after {\n  top: calc(0.25rem + 2px);\n  left: calc(-2.25rem + 2px);\n  width: calc(1rem - 4px);\n  height: calc(1rem - 4px);\n  background-color: #adb5bd;\n  border-radius: 0.5rem;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out;\n  transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .custom-switch .custom-control-label::after {\n    transition: none;\n  }\n}\n\n.custom-switch .custom-control-input:checked ~ .custom-control-label::after {\n  background-color: #fff;\n  -webkit-transform: translateX(0.75rem);\n  transform: translateX(0.75rem);\n}\n\n.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before {\n  background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-select {\n  display: inline-block;\n  width: 100%;\n  height: calc(1.5em + 0.75rem + 2px);\n  padding: 0.375rem 1.75rem 0.375rem 0.75rem;\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #495057;\n  vertical-align: middle;\n  background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px;\n  background-color: #fff;\n  border: 1px solid #ced4da;\n  border-radius: 0.25rem;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n}\n\n.custom-select:focus {\n  border-color: #80bdff;\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-select:focus::-ms-value {\n  color: #495057;\n  background-color: #fff;\n}\n\n.custom-select[multiple], .custom-select[size]:not([size=\"1\"]) {\n  height: auto;\n  padding-right: 0.75rem;\n  background-image: none;\n}\n\n.custom-select:disabled {\n  color: #6c757d;\n  background-color: #e9ecef;\n}\n\n.custom-select::-ms-expand {\n  display: none;\n}\n\n.custom-select-sm {\n  height: calc(1.5em + 0.5rem + 2px);\n  padding-top: 0.25rem;\n  padding-bottom: 0.25rem;\n  padding-left: 0.5rem;\n  font-size: 0.875rem;\n}\n\n.custom-select-lg {\n  height: calc(1.5em + 1rem + 2px);\n  padding-top: 0.5rem;\n  padding-bottom: 0.5rem;\n  padding-left: 1rem;\n  font-size: 1.25rem;\n}\n\n.custom-file {\n  position: relative;\n  display: inline-block;\n  width: 100%;\n  height: calc(1.5em + 0.75rem + 2px);\n  margin-bottom: 0;\n}\n\n.custom-file-input {\n  position: relative;\n  z-index: 2;\n  width: 100%;\n  height: calc(1.5em + 0.75rem + 2px);\n  margin: 0;\n  opacity: 0;\n}\n\n.custom-file-input:focus ~ .custom-file-label {\n  border-color: #80bdff;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-file-input:disabled ~ .custom-file-label {\n  background-color: #e9ecef;\n}\n\n.custom-file-input:lang(en) ~ .custom-file-label::after {\n  content: \"Browse\";\n}\n\n.custom-file-input ~ .custom-file-label[data-browse]::after {\n  content: attr(data-browse);\n}\n\n.custom-file-label {\n  position: absolute;\n  top: 0;\n  right: 0;\n  left: 0;\n  z-index: 1;\n  height: calc(1.5em + 0.75rem + 2px);\n  padding: 0.375rem 0.75rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #495057;\n  background-color: #fff;\n  border: 1px solid #ced4da;\n  border-radius: 0.25rem;\n}\n\n.custom-file-label::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  z-index: 3;\n  display: block;\n  height: calc(1.5em + 0.75rem);\n  padding: 0.375rem 0.75rem;\n  line-height: 1.5;\n  color: #495057;\n  content: \"Browse\";\n  background-color: #e9ecef;\n  border-left: inherit;\n  border-radius: 0 0.25rem 0.25rem 0;\n}\n\n.custom-range {\n  width: 100%;\n  height: calc(1rem + 0.4rem);\n  padding: 0;\n  background-color: transparent;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n}\n\n.custom-range:focus {\n  outline: none;\n}\n\n.custom-range:focus::-webkit-slider-thumb {\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range:focus::-moz-range-thumb {\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range:focus::-ms-thumb {\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range::-moz-focus-outer {\n  border: 0;\n}\n\n.custom-range::-webkit-slider-thumb {\n  width: 1rem;\n  height: 1rem;\n  margin-top: -0.25rem;\n  background-color: #007bff;\n  border: 0;\n  border-radius: 1rem;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  -webkit-appearance: none;\n  appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .custom-range::-webkit-slider-thumb {\n    transition: none;\n  }\n}\n\n.custom-range::-webkit-slider-thumb:active {\n  background-color: #b3d7ff;\n}\n\n.custom-range::-webkit-slider-runnable-track {\n  width: 100%;\n  height: 0.5rem;\n  color: transparent;\n  cursor: pointer;\n  background-color: #dee2e6;\n  border-color: transparent;\n  border-radius: 1rem;\n}\n\n.custom-range::-moz-range-thumb {\n  width: 1rem;\n  height: 1rem;\n  background-color: #007bff;\n  border: 0;\n  border-radius: 1rem;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  -moz-appearance: none;\n  appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .custom-range::-moz-range-thumb {\n    transition: none;\n  }\n}\n\n.custom-range::-moz-range-thumb:active {\n  background-color: #b3d7ff;\n}\n\n.custom-range::-moz-range-track {\n  width: 100%;\n  height: 0.5rem;\n  color: transparent;\n  cursor: pointer;\n  background-color: #dee2e6;\n  border-color: transparent;\n  border-radius: 1rem;\n}\n\n.custom-range::-ms-thumb {\n  width: 1rem;\n  height: 1rem;\n  margin-top: 0;\n  margin-right: 0.2rem;\n  margin-left: 0.2rem;\n  background-color: #007bff;\n  border: 0;\n  border-radius: 1rem;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .custom-range::-ms-thumb {\n    transition: none;\n  }\n}\n\n.custom-range::-ms-thumb:active {\n  background-color: #b3d7ff;\n}\n\n.custom-range::-ms-track {\n  width: 100%;\n  height: 0.5rem;\n  color: transparent;\n  cursor: pointer;\n  background-color: transparent;\n  border-color: transparent;\n  border-width: 0.5rem;\n}\n\n.custom-range::-ms-fill-lower {\n  background-color: #dee2e6;\n  border-radius: 1rem;\n}\n\n.custom-range::-ms-fill-upper {\n  margin-right: 15px;\n  background-color: #dee2e6;\n  border-radius: 1rem;\n}\n\n.custom-range:disabled::-webkit-slider-thumb {\n  background-color: #adb5bd;\n}\n\n.custom-range:disabled::-webkit-slider-runnable-track {\n  cursor: default;\n}\n\n.custom-range:disabled::-moz-range-thumb {\n  background-color: #adb5bd;\n}\n\n.custom-range:disabled::-moz-range-track {\n  cursor: default;\n}\n\n.custom-range:disabled::-ms-thumb {\n  background-color: #adb5bd;\n}\n\n.custom-control-label::before,\n.custom-file-label,\n.custom-select {\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .custom-control-label::before,\n  .custom-file-label,\n  .custom-select {\n    transition: none;\n  }\n}\n\n.nav {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n\n.nav-link {\n  display: block;\n  padding: 0.5rem 1rem;\n}\n\n.nav-link:hover, .nav-link:focus {\n  text-decoration: none;\n}\n\n.nav-link.disabled {\n  color: #6c757d;\n  pointer-events: none;\n  cursor: default;\n}\n\n.nav-tabs {\n  border-bottom: 1px solid #dee2e6;\n}\n\n.nav-tabs .nav-item {\n  margin-bottom: -1px;\n}\n\n.nav-tabs .nav-link {\n  border: 1px solid transparent;\n  border-top-left-radius: 0.25rem;\n  border-top-right-radius: 0.25rem;\n}\n\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n  border-color: #e9ecef #e9ecef #dee2e6;\n}\n\n.nav-tabs .nav-link.disabled {\n  color: #6c757d;\n  background-color: transparent;\n  border-color: transparent;\n}\n\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n  color: #495057;\n  background-color: #fff;\n  border-color: #dee2e6 #dee2e6 #fff;\n}\n\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n\n.nav-pills .nav-link {\n  border-radius: 0.25rem;\n}\n\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n  color: #fff;\n  background-color: #007bff;\n}\n\n.nav-fill .nav-item {\n  -ms-flex: 1 1 auto;\n  flex: 1 1 auto;\n  text-align: center;\n}\n\n.nav-justified .nav-item {\n  -ms-flex-preferred-size: 0;\n  flex-basis: 0;\n  -ms-flex-positive: 1;\n  flex-grow: 1;\n  text-align: center;\n}\n\n.tab-content > .tab-pane {\n  display: none;\n}\n\n.tab-content > .active {\n  display: block;\n}\n\n.navbar {\n  position: relative;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -ms-flex-align: center;\n  align-items: center;\n  -ms-flex-pack: justify;\n  justify-content: space-between;\n  padding: 0.5rem 1rem;\n}\n\n.navbar > .container,\n.navbar > .container-fluid {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -ms-flex-align: center;\n  align-items: center;\n  -ms-flex-pack: justify;\n  justify-content: space-between;\n}\n\n.navbar-brand {\n  display: inline-block;\n  padding-top: 0.3125rem;\n  padding-bottom: 0.3125rem;\n  margin-right: 1rem;\n  font-size: 1.25rem;\n  line-height: inherit;\n  white-space: nowrap;\n}\n\n.navbar-brand:hover, .navbar-brand:focus {\n  text-decoration: none;\n}\n\n.navbar-nav {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-direction: column;\n  flex-direction: column;\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n\n.navbar-nav .nav-link {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.navbar-nav .dropdown-menu {\n  position: static;\n  float: none;\n}\n\n.navbar-text {\n  display: inline-block;\n  padding-top: 0.5rem;\n  padding-bottom: 0.5rem;\n}\n\n.navbar-collapse {\n  -ms-flex-preferred-size: 100%;\n  flex-basis: 100%;\n  -ms-flex-positive: 1;\n  flex-grow: 1;\n  -ms-flex-align: center;\n  align-items: center;\n}\n\n.navbar-toggler {\n  padding: 0.25rem 0.75rem;\n  font-size: 1.25rem;\n  line-height: 1;\n  background-color: transparent;\n  border: 1px solid transparent;\n  border-radius: 0.25rem;\n}\n\n.navbar-toggler:hover, .navbar-toggler:focus {\n  text-decoration: none;\n}\n\n.navbar-toggler-icon {\n  display: inline-block;\n  width: 1.5em;\n  height: 1.5em;\n  vertical-align: middle;\n  content: \"\";\n  background: no-repeat center center;\n  background-size: 100% 100%;\n}\n\n@media (max-width: 575.98px) {\n  .navbar-expand-sm > .container,\n  .navbar-expand-sm > .container-fluid {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n\n@media (min-width: 576px) {\n  .navbar-expand-sm {\n    -ms-flex-flow: row nowrap;\n    flex-flow: row nowrap;\n    -ms-flex-pack: start;\n    justify-content: flex-start;\n  }\n  .navbar-expand-sm .navbar-nav {\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .navbar-expand-sm .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-sm .navbar-nav .nav-link {\n    padding-right: 0.5rem;\n    padding-left: 0.5rem;\n  }\n  .navbar-expand-sm > .container,\n  .navbar-expand-sm > .container-fluid {\n    -ms-flex-wrap: nowrap;\n    flex-wrap: nowrap;\n  }\n  .navbar-expand-sm .navbar-collapse {\n    display: -ms-flexbox !important;\n    display: flex !important;\n    -ms-flex-preferred-size: auto;\n    flex-basis: auto;\n  }\n  .navbar-expand-sm .navbar-toggler {\n    display: none;\n  }\n}\n\n@media (max-width: 767.98px) {\n  .navbar-expand-md > .container,\n  .navbar-expand-md > .container-fluid {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-expand-md {\n    -ms-flex-flow: row nowrap;\n    flex-flow: row nowrap;\n    -ms-flex-pack: start;\n    justify-content: flex-start;\n  }\n  .navbar-expand-md .navbar-nav {\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .navbar-expand-md .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-md .navbar-nav .nav-link {\n    padding-right: 0.5rem;\n    padding-left: 0.5rem;\n  }\n  .navbar-expand-md > .container,\n  .navbar-expand-md > .container-fluid {\n    -ms-flex-wrap: nowrap;\n    flex-wrap: nowrap;\n  }\n  .navbar-expand-md .navbar-collapse {\n    display: -ms-flexbox !important;\n    display: flex !important;\n    -ms-flex-preferred-size: auto;\n    flex-basis: auto;\n  }\n  .navbar-expand-md .navbar-toggler {\n    display: none;\n  }\n}\n\n@media (max-width: 991.98px) {\n  .navbar-expand-lg > .container,\n  .navbar-expand-lg > .container-fluid {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n\n@media (min-width: 992px) {\n  .navbar-expand-lg {\n    -ms-flex-flow: row nowrap;\n    flex-flow: row nowrap;\n    -ms-flex-pack: start;\n    justify-content: flex-start;\n  }\n  .navbar-expand-lg .navbar-nav {\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .navbar-expand-lg .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-lg .navbar-nav .nav-link {\n    padding-right: 0.5rem;\n    padding-left: 0.5rem;\n  }\n  .navbar-expand-lg > .container,\n  .navbar-expand-lg > .container-fluid {\n    -ms-flex-wrap: nowrap;\n    flex-wrap: nowrap;\n  }\n  .navbar-expand-lg .navbar-collapse {\n    display: -ms-flexbox !important;\n    display: flex !important;\n    -ms-flex-preferred-size: auto;\n    flex-basis: auto;\n  }\n  .navbar-expand-lg .navbar-toggler {\n    display: none;\n  }\n}\n\n@media (max-width: 1199.98px) {\n  .navbar-expand-xl > .container,\n  .navbar-expand-xl > .container-fluid {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n\n@media (min-width: 1200px) {\n  .navbar-expand-xl {\n    -ms-flex-flow: row nowrap;\n    flex-flow: row nowrap;\n    -ms-flex-pack: start;\n    justify-content: flex-start;\n  }\n  .navbar-expand-xl .navbar-nav {\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .navbar-expand-xl .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-xl .navbar-nav .nav-link {\n    padding-right: 0.5rem;\n    padding-left: 0.5rem;\n  }\n  .navbar-expand-xl > .container,\n  .navbar-expand-xl > .container-fluid {\n    -ms-flex-wrap: nowrap;\n    flex-wrap: nowrap;\n  }\n  .navbar-expand-xl .navbar-collapse {\n    display: -ms-flexbox !important;\n    display: flex !important;\n    -ms-flex-preferred-size: auto;\n    flex-basis: auto;\n  }\n  .navbar-expand-xl .navbar-toggler {\n    display: none;\n  }\n}\n\n.navbar-expand {\n  -ms-flex-flow: row nowrap;\n  flex-flow: row nowrap;\n  -ms-flex-pack: start;\n  justify-content: flex-start;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.navbar-expand .navbar-nav {\n  -ms-flex-direction: row;\n  flex-direction: row;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu {\n  position: absolute;\n}\n\n.navbar-expand .navbar-nav .nav-link {\n  padding-right: 0.5rem;\n  padding-left: 0.5rem;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n  -ms-flex-wrap: nowrap;\n  flex-wrap: nowrap;\n}\n\n.navbar-expand .navbar-collapse {\n  display: -ms-flexbox !important;\n  display: flex !important;\n  -ms-flex-preferred-size: auto;\n  flex-basis: auto;\n}\n\n.navbar-expand .navbar-toggler {\n  display: none;\n}\n\n.navbar-light .navbar-brand {\n  color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {\n  color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-nav .nav-link {\n  color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {\n  color: rgba(0, 0, 0, 0.7);\n}\n\n.navbar-light .navbar-nav .nav-link.disabled {\n  color: rgba(0, 0, 0, 0.3);\n}\n\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .active > .nav-link,\n.navbar-light .navbar-nav .nav-link.show,\n.navbar-light .navbar-nav .nav-link.active {\n  color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-toggler {\n  color: rgba(0, 0, 0, 0.5);\n  border-color: rgba(0, 0, 0, 0.1);\n}\n\n.navbar-light .navbar-toggler-icon {\n  background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n.navbar-light .navbar-text {\n  color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-text a {\n  color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {\n  color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-dark .navbar-brand {\n  color: #fff;\n}\n\n.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {\n  color: #fff;\n}\n\n.navbar-dark .navbar-nav .nav-link {\n  color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {\n  color: rgba(255, 255, 255, 0.75);\n}\n\n.navbar-dark .navbar-nav .nav-link.disabled {\n  color: rgba(255, 255, 255, 0.25);\n}\n\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .active > .nav-link,\n.navbar-dark .navbar-nav .nav-link.show,\n.navbar-dark .navbar-nav .nav-link.active {\n  color: #fff;\n}\n\n.navbar-dark .navbar-toggler {\n  color: rgba(255, 255, 255, 0.5);\n  border-color: rgba(255, 255, 255, 0.1);\n}\n\n.navbar-dark .navbar-toggler-icon {\n  background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n.navbar-dark .navbar-text {\n  color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-text a {\n  color: #fff;\n}\n\n.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {\n  color: #fff;\n}\n\n.card {\n  position: relative;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-direction: column;\n  flex-direction: column;\n  min-width: 0;\n  word-wrap: break-word;\n  background-color: #fff;\n  background-clip: border-box;\n  border: 1px solid rgba(0, 0, 0, 0.125);\n  border-radius: 0.25rem;\n}\n\n.card > hr {\n  margin-right: 0;\n  margin-left: 0;\n}\n\n.card > .list-group:first-child .list-group-item:first-child {\n  border-top-left-radius: 0.25rem;\n  border-top-right-radius: 0.25rem;\n}\n\n.card > .list-group:last-child .list-group-item:last-child {\n  border-bottom-right-radius: 0.25rem;\n  border-bottom-left-radius: 0.25rem;\n}\n\n.card-body {\n  -ms-flex: 1 1 auto;\n  flex: 1 1 auto;\n  padding: 1.25rem;\n}\n\n.card-title {\n  margin-bottom: 0.75rem;\n}\n\n.card-subtitle {\n  margin-top: -0.375rem;\n  margin-bottom: 0;\n}\n\n.card-text:last-child {\n  margin-bottom: 0;\n}\n\n.card-link:hover {\n  text-decoration: none;\n}\n\n.card-link + .card-link {\n  margin-left: 1.25rem;\n}\n\n.card-header {\n  padding: 0.75rem 1.25rem;\n  margin-bottom: 0;\n  background-color: rgba(0, 0, 0, 0.03);\n  border-bottom: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-header:first-child {\n  border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\n}\n\n.card-header + .list-group .list-group-item:first-child {\n  border-top: 0;\n}\n\n.card-footer {\n  padding: 0.75rem 1.25rem;\n  background-color: rgba(0, 0, 0, 0.03);\n  border-top: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-footer:last-child {\n  border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\n}\n\n.card-header-tabs {\n  margin-right: -0.625rem;\n  margin-bottom: -0.75rem;\n  margin-left: -0.625rem;\n  border-bottom: 0;\n}\n\n.card-header-pills {\n  margin-right: -0.625rem;\n  margin-left: -0.625rem;\n}\n\n.card-img-overlay {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  padding: 1.25rem;\n}\n\n.card-img {\n  width: 100%;\n  border-radius: calc(0.25rem - 1px);\n}\n\n.card-img-top {\n  width: 100%;\n  border-top-left-radius: calc(0.25rem - 1px);\n  border-top-right-radius: calc(0.25rem - 1px);\n}\n\n.card-img-bottom {\n  width: 100%;\n  border-bottom-right-radius: calc(0.25rem - 1px);\n  border-bottom-left-radius: calc(0.25rem - 1px);\n}\n\n.card-deck {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-direction: column;\n  flex-direction: column;\n}\n\n.card-deck .card {\n  margin-bottom: 15px;\n}\n\n@media (min-width: 576px) {\n  .card-deck {\n    -ms-flex-flow: row wrap;\n    flex-flow: row wrap;\n    margin-right: -15px;\n    margin-left: -15px;\n  }\n  .card-deck .card {\n    display: -ms-flexbox;\n    display: flex;\n    -ms-flex: 1 0 0%;\n    flex: 1 0 0%;\n    -ms-flex-direction: column;\n    flex-direction: column;\n    margin-right: 15px;\n    margin-bottom: 0;\n    margin-left: 15px;\n  }\n}\n\n.card-group {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-direction: column;\n  flex-direction: column;\n}\n\n.card-group > .card {\n  margin-bottom: 15px;\n}\n\n@media (min-width: 576px) {\n  .card-group {\n    -ms-flex-flow: row wrap;\n    flex-flow: row wrap;\n  }\n  .card-group > .card {\n    -ms-flex: 1 0 0%;\n    flex: 1 0 0%;\n    margin-bottom: 0;\n  }\n  .card-group > .card + .card {\n    margin-left: 0;\n    border-left: 0;\n  }\n  .card-group > .card:not(:last-child) {\n    border-top-right-radius: 0;\n    border-bottom-right-radius: 0;\n  }\n  .card-group > .card:not(:last-child) .card-img-top,\n  .card-group > .card:not(:last-child) .card-header {\n    border-top-right-radius: 0;\n  }\n  .card-group > .card:not(:last-child) .card-img-bottom,\n  .card-group > .card:not(:last-child) .card-footer {\n    border-bottom-right-radius: 0;\n  }\n  .card-group > .card:not(:first-child) {\n    border-top-left-radius: 0;\n    border-bottom-left-radius: 0;\n  }\n  .card-group > .card:not(:first-child) .card-img-top,\n  .card-group > .card:not(:first-child) .card-header {\n    border-top-left-radius: 0;\n  }\n  .card-group > .card:not(:first-child) .card-img-bottom,\n  .card-group > .card:not(:first-child) .card-footer {\n    border-bottom-left-radius: 0;\n  }\n}\n\n.card-columns .card {\n  margin-bottom: 0.75rem;\n}\n\n@media (min-width: 576px) {\n  .card-columns {\n    -webkit-column-count: 3;\n    -moz-column-count: 3;\n    column-count: 3;\n    -webkit-column-gap: 1.25rem;\n    -moz-column-gap: 1.25rem;\n    column-gap: 1.25rem;\n    orphans: 1;\n    widows: 1;\n  }\n  .card-columns .card {\n    display: inline-block;\n    width: 100%;\n  }\n}\n\n.accordion > .card {\n  overflow: hidden;\n}\n\n.accordion > .card:not(:first-of-type) .card-header:first-child {\n  border-radius: 0;\n}\n\n.accordion > .card:not(:first-of-type):not(:last-of-type) {\n  border-bottom: 0;\n  border-radius: 0;\n}\n\n.accordion > .card:first-of-type {\n  border-bottom: 0;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.accordion > .card:last-of-type {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n\n.accordion > .card .card-header {\n  margin-bottom: -1px;\n}\n\n.breadcrumb {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  padding: 0.75rem 1rem;\n  margin-bottom: 1rem;\n  list-style: none;\n  background-color: #e9ecef;\n  border-radius: 0.25rem;\n}\n\n.breadcrumb-item + .breadcrumb-item {\n  padding-left: 0.5rem;\n}\n\n.breadcrumb-item + .breadcrumb-item::before {\n  display: inline-block;\n  padding-right: 0.5rem;\n  color: #6c757d;\n  content: \"/\";\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n  text-decoration: underline;\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n  text-decoration: none;\n}\n\n.breadcrumb-item.active {\n  color: #6c757d;\n}\n\n.pagination {\n  display: -ms-flexbox;\n  display: flex;\n  padding-left: 0;\n  list-style: none;\n  border-radius: 0.25rem;\n}\n\n.page-link {\n  position: relative;\n  display: block;\n  padding: 0.5rem 0.75rem;\n  margin-left: -1px;\n  line-height: 1.25;\n  color: #007bff;\n  background-color: #fff;\n  border: 1px solid #dee2e6;\n}\n\n.page-link:hover {\n  z-index: 2;\n  color: #0056b3;\n  text-decoration: none;\n  background-color: #e9ecef;\n  border-color: #dee2e6;\n}\n\n.page-link:focus {\n  z-index: 2;\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.page-item:first-child .page-link {\n  margin-left: 0;\n  border-top-left-radius: 0.25rem;\n  border-bottom-left-radius: 0.25rem;\n}\n\n.page-item:last-child .page-link {\n  border-top-right-radius: 0.25rem;\n  border-bottom-right-radius: 0.25rem;\n}\n\n.page-item.active .page-link {\n  z-index: 1;\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.page-item.disabled .page-link {\n  color: #6c757d;\n  pointer-events: none;\n  cursor: auto;\n  background-color: #fff;\n  border-color: #dee2e6;\n}\n\n.pagination-lg .page-link {\n  padding: 0.75rem 1.5rem;\n  font-size: 1.25rem;\n  line-height: 1.5;\n}\n\n.pagination-lg .page-item:first-child .page-link {\n  border-top-left-radius: 0.3rem;\n  border-bottom-left-radius: 0.3rem;\n}\n\n.pagination-lg .page-item:last-child .page-link {\n  border-top-right-radius: 0.3rem;\n  border-bottom-right-radius: 0.3rem;\n}\n\n.pagination-sm .page-link {\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n  line-height: 1.5;\n}\n\n.pagination-sm .page-item:first-child .page-link {\n  border-top-left-radius: 0.2rem;\n  border-bottom-left-radius: 0.2rem;\n}\n\n.pagination-sm .page-item:last-child .page-link {\n  border-top-right-radius: 0.2rem;\n  border-bottom-right-radius: 0.2rem;\n}\n\n.badge {\n  display: inline-block;\n  padding: 0.25em 0.4em;\n  font-size: 75%;\n  font-weight: 700;\n  line-height: 1;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: 0.25rem;\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .badge {\n    transition: none;\n  }\n}\n\na.badge:hover, a.badge:focus {\n  text-decoration: none;\n}\n\n.badge:empty {\n  display: none;\n}\n\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n\n.badge-pill {\n  padding-right: 0.6em;\n  padding-left: 0.6em;\n  border-radius: 10rem;\n}\n\n.badge-primary {\n  color: #fff;\n  background-color: #007bff;\n}\n\na.badge-primary:hover, a.badge-primary:focus {\n  color: #fff;\n  background-color: #0062cc;\n}\n\na.badge-primary:focus, a.badge-primary.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.badge-secondary {\n  color: #fff;\n  background-color: #6c757d;\n}\n\na.badge-secondary:hover, a.badge-secondary:focus {\n  color: #fff;\n  background-color: #545b62;\n}\n\na.badge-secondary:focus, a.badge-secondary.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.badge-success {\n  color: #fff;\n  background-color: #28a745;\n}\n\na.badge-success:hover, a.badge-success:focus {\n  color: #fff;\n  background-color: #1e7e34;\n}\n\na.badge-success:focus, a.badge-success.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.badge-info {\n  color: #fff;\n  background-color: #17a2b8;\n}\n\na.badge-info:hover, a.badge-info:focus {\n  color: #fff;\n  background-color: #117a8b;\n}\n\na.badge-info:focus, a.badge-info.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.badge-warning {\n  color: #212529;\n  background-color: #ffc107;\n}\n\na.badge-warning:hover, a.badge-warning:focus {\n  color: #212529;\n  background-color: #d39e00;\n}\n\na.badge-warning:focus, a.badge-warning.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.badge-danger {\n  color: #fff;\n  background-color: #dc3545;\n}\n\na.badge-danger:hover, a.badge-danger:focus {\n  color: #fff;\n  background-color: #bd2130;\n}\n\na.badge-danger:focus, a.badge-danger.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.badge-light {\n  color: #212529;\n  background-color: #f8f9fa;\n}\n\na.badge-light:hover, a.badge-light:focus {\n  color: #212529;\n  background-color: #dae0e5;\n}\n\na.badge-light:focus, a.badge-light.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.badge-dark {\n  color: #fff;\n  background-color: #343a40;\n}\n\na.badge-dark:hover, a.badge-dark:focus {\n  color: #fff;\n  background-color: #1d2124;\n}\n\na.badge-dark:focus, a.badge-dark.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.jumbotron {\n  padding: 2rem 1rem;\n  margin-bottom: 2rem;\n  background-color: #e9ecef;\n  border-radius: 0.3rem;\n}\n\n@media (min-width: 576px) {\n  .jumbotron {\n    padding: 4rem 2rem;\n  }\n}\n\n.jumbotron-fluid {\n  padding-right: 0;\n  padding-left: 0;\n  border-radius: 0;\n}\n\n.alert {\n  position: relative;\n  padding: 0.75rem 1.25rem;\n  margin-bottom: 1rem;\n  border: 1px solid transparent;\n  border-radius: 0.25rem;\n}\n\n.alert-heading {\n  color: inherit;\n}\n\n.alert-link {\n  font-weight: 700;\n}\n\n.alert-dismissible {\n  padding-right: 4rem;\n}\n\n.alert-dismissible .close {\n  position: absolute;\n  top: 0;\n  right: 0;\n  padding: 0.75rem 1.25rem;\n  color: inherit;\n}\n\n.alert-primary {\n  color: #004085;\n  background-color: #cce5ff;\n  border-color: #b8daff;\n}\n\n.alert-primary hr {\n  border-top-color: #9fcdff;\n}\n\n.alert-primary .alert-link {\n  color: #002752;\n}\n\n.alert-secondary {\n  color: #383d41;\n  background-color: #e2e3e5;\n  border-color: #d6d8db;\n}\n\n.alert-secondary hr {\n  border-top-color: #c8cbcf;\n}\n\n.alert-secondary .alert-link {\n  color: #202326;\n}\n\n.alert-success {\n  color: #155724;\n  background-color: #d4edda;\n  border-color: #c3e6cb;\n}\n\n.alert-success hr {\n  border-top-color: #b1dfbb;\n}\n\n.alert-success .alert-link {\n  color: #0b2e13;\n}\n\n.alert-info {\n  color: #0c5460;\n  background-color: #d1ecf1;\n  border-color: #bee5eb;\n}\n\n.alert-info hr {\n  border-top-color: #abdde5;\n}\n\n.alert-info .alert-link {\n  color: #062c33;\n}\n\n.alert-warning {\n  color: #856404;\n  background-color: #fff3cd;\n  border-color: #ffeeba;\n}\n\n.alert-warning hr {\n  border-top-color: #ffe8a1;\n}\n\n.alert-warning .alert-link {\n  color: #533f03;\n}\n\n.alert-danger {\n  color: #721c24;\n  background-color: #f8d7da;\n  border-color: #f5c6cb;\n}\n\n.alert-danger hr {\n  border-top-color: #f1b0b7;\n}\n\n.alert-danger .alert-link {\n  color: #491217;\n}\n\n.alert-light {\n  color: #818182;\n  background-color: #fefefe;\n  border-color: #fdfdfe;\n}\n\n.alert-light hr {\n  border-top-color: #ececf6;\n}\n\n.alert-light .alert-link {\n  color: #686868;\n}\n\n.alert-dark {\n  color: #1b1e21;\n  background-color: #d6d8d9;\n  border-color: #c6c8ca;\n}\n\n.alert-dark hr {\n  border-top-color: #b9bbbe;\n}\n\n.alert-dark .alert-link {\n  color: #040505;\n}\n\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 1rem 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 1rem 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n.progress {\n  display: -ms-flexbox;\n  display: flex;\n  height: 1rem;\n  overflow: hidden;\n  font-size: 0.75rem;\n  background-color: #e9ecef;\n  border-radius: 0.25rem;\n}\n\n.progress-bar {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-direction: column;\n  flex-direction: column;\n  -ms-flex-pack: center;\n  justify-content: center;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  background-color: #007bff;\n  transition: width 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .progress-bar {\n    transition: none;\n  }\n}\n\n.progress-bar-striped {\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-size: 1rem 1rem;\n}\n\n.progress-bar-animated {\n  -webkit-animation: progress-bar-stripes 1s linear infinite;\n  animation: progress-bar-stripes 1s linear infinite;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .progress-bar-animated {\n    -webkit-animation: none;\n    animation: none;\n  }\n}\n\n.media {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: start;\n  align-items: flex-start;\n}\n\n.media-body {\n  -ms-flex: 1;\n  flex: 1;\n}\n\n.list-group {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-direction: column;\n  flex-direction: column;\n  padding-left: 0;\n  margin-bottom: 0;\n}\n\n.list-group-item-action {\n  width: 100%;\n  color: #495057;\n  text-align: inherit;\n}\n\n.list-group-item-action:hover, .list-group-item-action:focus {\n  z-index: 1;\n  color: #495057;\n  text-decoration: none;\n  background-color: #f8f9fa;\n}\n\n.list-group-item-action:active {\n  color: #212529;\n  background-color: #e9ecef;\n}\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 0.75rem 1.25rem;\n  margin-bottom: -1px;\n  background-color: #fff;\n  border: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.list-group-item:first-child {\n  border-top-left-radius: 0.25rem;\n  border-top-right-radius: 0.25rem;\n}\n\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 0.25rem;\n  border-bottom-left-radius: 0.25rem;\n}\n\n.list-group-item.disabled, .list-group-item:disabled {\n  color: #6c757d;\n  pointer-events: none;\n  background-color: #fff;\n}\n\n.list-group-item.active {\n  z-index: 2;\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.list-group-horizontal {\n  -ms-flex-direction: row;\n  flex-direction: row;\n}\n\n.list-group-horizontal .list-group-item {\n  margin-right: -1px;\n  margin-bottom: 0;\n}\n\n.list-group-horizontal .list-group-item:first-child {\n  border-top-left-radius: 0.25rem;\n  border-bottom-left-radius: 0.25rem;\n  border-top-right-radius: 0;\n}\n\n.list-group-horizontal .list-group-item:last-child {\n  margin-right: 0;\n  border-top-right-radius: 0.25rem;\n  border-bottom-right-radius: 0.25rem;\n  border-bottom-left-radius: 0;\n}\n\n@media (min-width: 576px) {\n  .list-group-horizontal-sm {\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .list-group-horizontal-sm .list-group-item {\n    margin-right: -1px;\n    margin-bottom: 0;\n  }\n  .list-group-horizontal-sm .list-group-item:first-child {\n    border-top-left-radius: 0.25rem;\n    border-bottom-left-radius: 0.25rem;\n    border-top-right-radius: 0;\n  }\n  .list-group-horizontal-sm .list-group-item:last-child {\n    margin-right: 0;\n    border-top-right-radius: 0.25rem;\n    border-bottom-right-radius: 0.25rem;\n    border-bottom-left-radius: 0;\n  }\n}\n\n@media (min-width: 768px) {\n  .list-group-horizontal-md {\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .list-group-horizontal-md .list-group-item {\n    margin-right: -1px;\n    margin-bottom: 0;\n  }\n  .list-group-horizontal-md .list-group-item:first-child {\n    border-top-left-radius: 0.25rem;\n    border-bottom-left-radius: 0.25rem;\n    border-top-right-radius: 0;\n  }\n  .list-group-horizontal-md .list-group-item:last-child {\n    margin-right: 0;\n    border-top-right-radius: 0.25rem;\n    border-bottom-right-radius: 0.25rem;\n    border-bottom-left-radius: 0;\n  }\n}\n\n@media (min-width: 992px) {\n  .list-group-horizontal-lg {\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .list-group-horizontal-lg .list-group-item {\n    margin-right: -1px;\n    margin-bottom: 0;\n  }\n  .list-group-horizontal-lg .list-group-item:first-child {\n    border-top-left-radius: 0.25rem;\n    border-bottom-left-radius: 0.25rem;\n    border-top-right-radius: 0;\n  }\n  .list-group-horizontal-lg .list-group-item:last-child {\n    margin-right: 0;\n    border-top-right-radius: 0.25rem;\n    border-bottom-right-radius: 0.25rem;\n    border-bottom-left-radius: 0;\n  }\n}\n\n@media (min-width: 1200px) {\n  .list-group-horizontal-xl {\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .list-group-horizontal-xl .list-group-item {\n    margin-right: -1px;\n    margin-bottom: 0;\n  }\n  .list-group-horizontal-xl .list-group-item:first-child {\n    border-top-left-radius: 0.25rem;\n    border-bottom-left-radius: 0.25rem;\n    border-top-right-radius: 0;\n  }\n  .list-group-horizontal-xl .list-group-item:last-child {\n    margin-right: 0;\n    border-top-right-radius: 0.25rem;\n    border-bottom-right-radius: 0.25rem;\n    border-bottom-left-radius: 0;\n  }\n}\n\n.list-group-flush .list-group-item {\n  border-right: 0;\n  border-left: 0;\n  border-radius: 0;\n}\n\n.list-group-flush .list-group-item:last-child {\n  margin-bottom: -1px;\n}\n\n.list-group-flush:first-child .list-group-item:first-child {\n  border-top: 0;\n}\n\n.list-group-flush:last-child .list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom: 0;\n}\n\n.list-group-item-primary {\n  color: #004085;\n  background-color: #b8daff;\n}\n\n.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {\n  color: #004085;\n  background-color: #9fcdff;\n}\n\n.list-group-item-primary.list-group-item-action.active {\n  color: #fff;\n  background-color: #004085;\n  border-color: #004085;\n}\n\n.list-group-item-secondary {\n  color: #383d41;\n  background-color: #d6d8db;\n}\n\n.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {\n  color: #383d41;\n  background-color: #c8cbcf;\n}\n\n.list-group-item-secondary.list-group-item-action.active {\n  color: #fff;\n  background-color: #383d41;\n  border-color: #383d41;\n}\n\n.list-group-item-success {\n  color: #155724;\n  background-color: #c3e6cb;\n}\n\n.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {\n  color: #155724;\n  background-color: #b1dfbb;\n}\n\n.list-group-item-success.list-group-item-action.active {\n  color: #fff;\n  background-color: #155724;\n  border-color: #155724;\n}\n\n.list-group-item-info {\n  color: #0c5460;\n  background-color: #bee5eb;\n}\n\n.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {\n  color: #0c5460;\n  background-color: #abdde5;\n}\n\n.list-group-item-info.list-group-item-action.active {\n  color: #fff;\n  background-color: #0c5460;\n  border-color: #0c5460;\n}\n\n.list-group-item-warning {\n  color: #856404;\n  background-color: #ffeeba;\n}\n\n.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {\n  color: #856404;\n  background-color: #ffe8a1;\n}\n\n.list-group-item-warning.list-group-item-action.active {\n  color: #fff;\n  background-color: #856404;\n  border-color: #856404;\n}\n\n.list-group-item-danger {\n  color: #721c24;\n  background-color: #f5c6cb;\n}\n\n.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {\n  color: #721c24;\n  background-color: #f1b0b7;\n}\n\n.list-group-item-danger.list-group-item-action.active {\n  color: #fff;\n  background-color: #721c24;\n  border-color: #721c24;\n}\n\n.list-group-item-light {\n  color: #818182;\n  background-color: #fdfdfe;\n}\n\n.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {\n  color: #818182;\n  background-color: #ececf6;\n}\n\n.list-group-item-light.list-group-item-action.active {\n  color: #fff;\n  background-color: #818182;\n  border-color: #818182;\n}\n\n.list-group-item-dark {\n  color: #1b1e21;\n  background-color: #c6c8ca;\n}\n\n.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {\n  color: #1b1e21;\n  background-color: #b9bbbe;\n}\n\n.list-group-item-dark.list-group-item-action.active {\n  color: #fff;\n  background-color: #1b1e21;\n  border-color: #1b1e21;\n}\n\n.close {\n  float: right;\n  font-size: 1.5rem;\n  font-weight: 700;\n  line-height: 1;\n  color: #000;\n  text-shadow: 0 1px 0 #fff;\n  opacity: .5;\n}\n\n.close:hover {\n  color: #000;\n  text-decoration: none;\n}\n\n.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus {\n  opacity: .75;\n}\n\nbutton.close {\n  padding: 0;\n  background-color: transparent;\n  border: 0;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n}\n\na.close.disabled {\n  pointer-events: none;\n}\n\n.toast {\n  max-width: 350px;\n  overflow: hidden;\n  font-size: 0.875rem;\n  background-color: rgba(255, 255, 255, 0.85);\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.1);\n  box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1);\n  -webkit-backdrop-filter: blur(10px);\n  backdrop-filter: blur(10px);\n  opacity: 0;\n  border-radius: 0.25rem;\n}\n\n.toast:not(:last-child) {\n  margin-bottom: 0.75rem;\n}\n\n.toast.showing {\n  opacity: 1;\n}\n\n.toast.show {\n  display: block;\n  opacity: 1;\n}\n\n.toast.hide {\n  display: none;\n}\n\n.toast-header {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: center;\n  align-items: center;\n  padding: 0.25rem 0.75rem;\n  color: #6c757d;\n  background-color: rgba(255, 255, 255, 0.85);\n  background-clip: padding-box;\n  border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n}\n\n.toast-body {\n  padding: 0.75rem;\n}\n\n.modal-open {\n  overflow: hidden;\n}\n\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n\n.modal {\n  position: fixed;\n  top: 0;\n  left: 0;\n  z-index: 1050;\n  display: none;\n  width: 100%;\n  height: 100%;\n  overflow: hidden;\n  outline: 0;\n}\n\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 0.5rem;\n  pointer-events: none;\n}\n\n.modal.fade .modal-dialog {\n  transition: -webkit-transform 0.3s ease-out;\n  transition: transform 0.3s ease-out;\n  transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out;\n  -webkit-transform: translate(0, -50px);\n  transform: translate(0, -50px);\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .modal.fade .modal-dialog {\n    transition: none;\n  }\n}\n\n.modal.show .modal-dialog {\n  -webkit-transform: none;\n  transform: none;\n}\n\n.modal-dialog-scrollable {\n  display: -ms-flexbox;\n  display: flex;\n  max-height: calc(100% - 1rem);\n}\n\n.modal-dialog-scrollable .modal-content {\n  max-height: calc(100vh - 1rem);\n  overflow: hidden;\n}\n\n.modal-dialog-scrollable .modal-header,\n.modal-dialog-scrollable .modal-footer {\n  -ms-flex-negative: 0;\n  flex-shrink: 0;\n}\n\n.modal-dialog-scrollable .modal-body {\n  overflow-y: auto;\n}\n\n.modal-dialog-centered {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: center;\n  align-items: center;\n  min-height: calc(100% - 1rem);\n}\n\n.modal-dialog-centered::before {\n  display: block;\n  height: calc(100vh - 1rem);\n  content: \"\";\n}\n\n.modal-dialog-centered.modal-dialog-scrollable {\n  -ms-flex-direction: column;\n  flex-direction: column;\n  -ms-flex-pack: center;\n  justify-content: center;\n  height: 100%;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable .modal-content {\n  max-height: none;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable::before {\n  content: none;\n}\n\n.modal-content {\n  position: relative;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-direction: column;\n  flex-direction: column;\n  width: 100%;\n  pointer-events: auto;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 0.3rem;\n  outline: 0;\n}\n\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  left: 0;\n  z-index: 1040;\n  width: 100vw;\n  height: 100vh;\n  background-color: #000;\n}\n\n.modal-backdrop.fade {\n  opacity: 0;\n}\n\n.modal-backdrop.show {\n  opacity: 0.5;\n}\n\n.modal-header {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: start;\n  align-items: flex-start;\n  -ms-flex-pack: justify;\n  justify-content: space-between;\n  padding: 1rem 1rem;\n  border-bottom: 1px solid #dee2e6;\n  border-top-left-radius: 0.3rem;\n  border-top-right-radius: 0.3rem;\n}\n\n.modal-header .close {\n  padding: 1rem 1rem;\n  margin: -1rem -1rem -1rem auto;\n}\n\n.modal-title {\n  margin-bottom: 0;\n  line-height: 1.5;\n}\n\n.modal-body {\n  position: relative;\n  -ms-flex: 1 1 auto;\n  flex: 1 1 auto;\n  padding: 1rem;\n}\n\n.modal-footer {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: center;\n  align-items: center;\n  -ms-flex-pack: end;\n  justify-content: flex-end;\n  padding: 1rem;\n  border-top: 1px solid #dee2e6;\n  border-bottom-right-radius: 0.3rem;\n  border-bottom-left-radius: 0.3rem;\n}\n\n.modal-footer > :not(:first-child) {\n  margin-left: .25rem;\n}\n\n.modal-footer > :not(:last-child) {\n  margin-right: .25rem;\n}\n\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n\n@media (min-width: 576px) {\n  .modal-dialog {\n    max-width: 500px;\n    margin: 1.75rem auto;\n  }\n  .modal-dialog-scrollable {\n    max-height: calc(100% - 3.5rem);\n  }\n  .modal-dialog-scrollable .modal-content {\n    max-height: calc(100vh - 3.5rem);\n  }\n  .modal-dialog-centered {\n    min-height: calc(100% - 3.5rem);\n  }\n  .modal-dialog-centered::before {\n    height: calc(100vh - 3.5rem);\n  }\n  .modal-sm {\n    max-width: 300px;\n  }\n}\n\n@media (min-width: 992px) {\n  .modal-lg,\n  .modal-xl {\n    max-width: 800px;\n  }\n}\n\n@media (min-width: 1200px) {\n  .modal-xl {\n    max-width: 1140px;\n  }\n}\n\n.tooltip {\n  position: absolute;\n  z-index: 1070;\n  display: block;\n  margin: 0;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n  font-style: normal;\n  font-weight: 400;\n  line-height: 1.5;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  letter-spacing: normal;\n  word-break: normal;\n  word-spacing: normal;\n  white-space: normal;\n  line-break: auto;\n  font-size: 0.875rem;\n  word-wrap: break-word;\n  opacity: 0;\n}\n\n.tooltip.show {\n  opacity: 0.9;\n}\n\n.tooltip .arrow {\n  position: absolute;\n  display: block;\n  width: 0.8rem;\n  height: 0.4rem;\n}\n\n.tooltip .arrow::before {\n  position: absolute;\n  content: \"\";\n  border-color: transparent;\n  border-style: solid;\n}\n\n.bs-tooltip-top, .bs-tooltip-auto[x-placement^=\"top\"] {\n  padding: 0.4rem 0;\n}\n\n.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=\"top\"] .arrow {\n  bottom: 0;\n}\n\n.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=\"top\"] .arrow::before {\n  top: 0;\n  border-width: 0.4rem 0.4rem 0;\n  border-top-color: #000;\n}\n\n.bs-tooltip-right, .bs-tooltip-auto[x-placement^=\"right\"] {\n  padding: 0 0.4rem;\n}\n\n.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=\"right\"] .arrow {\n  left: 0;\n  width: 0.4rem;\n  height: 0.8rem;\n}\n\n.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=\"right\"] .arrow::before {\n  right: 0;\n  border-width: 0.4rem 0.4rem 0.4rem 0;\n  border-right-color: #000;\n}\n\n.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=\"bottom\"] {\n  padding: 0.4rem 0;\n}\n\n.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow {\n  top: 0;\n}\n\n.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow::before {\n  bottom: 0;\n  border-width: 0 0.4rem 0.4rem;\n  border-bottom-color: #000;\n}\n\n.bs-tooltip-left, .bs-tooltip-auto[x-placement^=\"left\"] {\n  padding: 0 0.4rem;\n}\n\n.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=\"left\"] .arrow {\n  right: 0;\n  width: 0.4rem;\n  height: 0.8rem;\n}\n\n.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=\"left\"] .arrow::before {\n  left: 0;\n  border-width: 0.4rem 0 0.4rem 0.4rem;\n  border-left-color: #000;\n}\n\n.tooltip-inner {\n  max-width: 200px;\n  padding: 0.25rem 0.5rem;\n  color: #fff;\n  text-align: center;\n  background-color: #000;\n  border-radius: 0.25rem;\n}\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1060;\n  display: block;\n  max-width: 276px;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n  font-style: normal;\n  font-weight: 400;\n  line-height: 1.5;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  letter-spacing: normal;\n  word-break: normal;\n  word-spacing: normal;\n  white-space: normal;\n  line-break: auto;\n  font-size: 0.875rem;\n  word-wrap: break-word;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 0.3rem;\n}\n\n.popover .arrow {\n  position: absolute;\n  display: block;\n  width: 1rem;\n  height: 0.5rem;\n  margin: 0 0.3rem;\n}\n\n.popover .arrow::before, .popover .arrow::after {\n  position: absolute;\n  display: block;\n  content: \"\";\n  border-color: transparent;\n  border-style: solid;\n}\n\n.bs-popover-top, .bs-popover-auto[x-placement^=\"top\"] {\n  margin-bottom: 0.5rem;\n}\n\n.bs-popover-top > .arrow, .bs-popover-auto[x-placement^=\"top\"] > .arrow {\n  bottom: calc((0.5rem + 1px) * -1);\n}\n\n.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^=\"top\"] > .arrow::before {\n  bottom: 0;\n  border-width: 0.5rem 0.5rem 0;\n  border-top-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^=\"top\"] > .arrow::after {\n  bottom: 1px;\n  border-width: 0.5rem 0.5rem 0;\n  border-top-color: #fff;\n}\n\n.bs-popover-right, .bs-popover-auto[x-placement^=\"right\"] {\n  margin-left: 0.5rem;\n}\n\n.bs-popover-right > .arrow, .bs-popover-auto[x-placement^=\"right\"] > .arrow {\n  left: calc((0.5rem + 1px) * -1);\n  width: 0.5rem;\n  height: 1rem;\n  margin: 0.3rem 0;\n}\n\n.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^=\"right\"] > .arrow::before {\n  left: 0;\n  border-width: 0.5rem 0.5rem 0.5rem 0;\n  border-right-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^=\"right\"] > .arrow::after {\n  left: 1px;\n  border-width: 0.5rem 0.5rem 0.5rem 0;\n  border-right-color: #fff;\n}\n\n.bs-popover-bottom, .bs-popover-auto[x-placement^=\"bottom\"] {\n  margin-top: 0.5rem;\n}\n\n.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow {\n  top: calc((0.5rem + 1px) * -1);\n}\n\n.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::before {\n  top: 0;\n  border-width: 0 0.5rem 0.5rem 0.5rem;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::after {\n  top: 1px;\n  border-width: 0 0.5rem 0.5rem 0.5rem;\n  border-bottom-color: #fff;\n}\n\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=\"bottom\"] .popover-header::before {\n  position: absolute;\n  top: 0;\n  left: 50%;\n  display: block;\n  width: 1rem;\n  margin-left: -0.5rem;\n  content: \"\";\n  border-bottom: 1px solid #f7f7f7;\n}\n\n.bs-popover-left, .bs-popover-auto[x-placement^=\"left\"] {\n  margin-right: 0.5rem;\n}\n\n.bs-popover-left > .arrow, .bs-popover-auto[x-placement^=\"left\"] > .arrow {\n  right: calc((0.5rem + 1px) * -1);\n  width: 0.5rem;\n  height: 1rem;\n  margin: 0.3rem 0;\n}\n\n.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^=\"left\"] > .arrow::before {\n  right: 0;\n  border-width: 0.5rem 0 0.5rem 0.5rem;\n  border-left-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^=\"left\"] > .arrow::after {\n  right: 1px;\n  border-width: 0.5rem 0 0.5rem 0.5rem;\n  border-left-color: #fff;\n}\n\n.popover-header {\n  padding: 0.5rem 0.75rem;\n  margin-bottom: 0;\n  font-size: 1rem;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-top-left-radius: calc(0.3rem - 1px);\n  border-top-right-radius: calc(0.3rem - 1px);\n}\n\n.popover-header:empty {\n  display: none;\n}\n\n.popover-body {\n  padding: 0.5rem 0.75rem;\n  color: #212529;\n}\n\n.carousel {\n  position: relative;\n}\n\n.carousel.pointer-event {\n  -ms-touch-action: pan-y;\n  touch-action: pan-y;\n}\n\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n\n.carousel-inner::after {\n  display: block;\n  clear: both;\n  content: \"\";\n}\n\n.carousel-item {\n  position: relative;\n  display: none;\n  float: left;\n  width: 100%;\n  margin-right: -100%;\n  -webkit-backface-visibility: hidden;\n  backface-visibility: hidden;\n  transition: -webkit-transform 0.6s ease-in-out;\n  transition: transform 0.6s ease-in-out;\n  transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .carousel-item {\n    transition: none;\n  }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n  display: block;\n}\n\n.carousel-item-next:not(.carousel-item-left),\n.active.carousel-item-right {\n  -webkit-transform: translateX(100%);\n  transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-right),\n.active.carousel-item-left {\n  -webkit-transform: translateX(-100%);\n  transform: translateX(-100%);\n}\n\n.carousel-fade .carousel-item {\n  opacity: 0;\n  transition-property: opacity;\n  -webkit-transform: none;\n  transform: none;\n}\n\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-left,\n.carousel-fade .carousel-item-prev.carousel-item-right {\n  z-index: 1;\n  opacity: 1;\n}\n\n.carousel-fade .active.carousel-item-left,\n.carousel-fade .active.carousel-item-right {\n  z-index: 0;\n  opacity: 0;\n  transition: 0s 0.6s opacity;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .carousel-fade .active.carousel-item-left,\n  .carousel-fade .active.carousel-item-right {\n    transition: none;\n  }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  z-index: 1;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: center;\n  align-items: center;\n  -ms-flex-pack: center;\n  justify-content: center;\n  width: 15%;\n  color: #fff;\n  text-align: center;\n  opacity: 0.5;\n  transition: opacity 0.15s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .carousel-control-prev,\n  .carousel-control-next {\n    transition: none;\n  }\n}\n\n.carousel-control-prev:hover, .carousel-control-prev:focus,\n.carousel-control-next:hover,\n.carousel-control-next:focus {\n  color: #fff;\n  text-decoration: none;\n  outline: 0;\n  opacity: 0.9;\n}\n\n.carousel-control-prev {\n  left: 0;\n}\n\n.carousel-control-next {\n  right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n  display: inline-block;\n  width: 20px;\n  height: 20px;\n  background: no-repeat 50% / 100% 100%;\n}\n\n.carousel-control-prev-icon {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\");\n}\n\n.carousel-control-next-icon {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\");\n}\n\n.carousel-indicators {\n  position: absolute;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 15;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-pack: center;\n  justify-content: center;\n  padding-left: 0;\n  margin-right: 15%;\n  margin-left: 15%;\n  list-style: none;\n}\n\n.carousel-indicators li {\n  box-sizing: content-box;\n  -ms-flex: 0 1 auto;\n  flex: 0 1 auto;\n  width: 30px;\n  height: 3px;\n  margin-right: 3px;\n  margin-left: 3px;\n  text-indent: -999px;\n  cursor: pointer;\n  background-color: #fff;\n  background-clip: padding-box;\n  border-top: 10px solid transparent;\n  border-bottom: 10px solid transparent;\n  opacity: .5;\n  transition: opacity 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .carousel-indicators li {\n    transition: none;\n  }\n}\n\n.carousel-indicators .active {\n  opacity: 1;\n}\n\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 20px;\n  left: 15%;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #fff;\n  text-align: center;\n}\n\n@-webkit-keyframes spinner-border {\n  to {\n    -webkit-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n}\n\n@keyframes spinner-border {\n  to {\n    -webkit-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n}\n\n.spinner-border {\n  display: inline-block;\n  width: 2rem;\n  height: 2rem;\n  vertical-align: text-bottom;\n  border: 0.25em solid currentColor;\n  border-right-color: transparent;\n  border-radius: 50%;\n  -webkit-animation: spinner-border .75s linear infinite;\n  animation: spinner-border .75s linear infinite;\n}\n\n.spinner-border-sm {\n  width: 1rem;\n  height: 1rem;\n  border-width: 0.2em;\n}\n\n@-webkit-keyframes spinner-grow {\n  0% {\n    -webkit-transform: scale(0);\n    transform: scale(0);\n  }\n  50% {\n    opacity: 1;\n  }\n}\n\n@keyframes spinner-grow {\n  0% {\n    -webkit-transform: scale(0);\n    transform: scale(0);\n  }\n  50% {\n    opacity: 1;\n  }\n}\n\n.spinner-grow {\n  display: inline-block;\n  width: 2rem;\n  height: 2rem;\n  vertical-align: text-bottom;\n  background-color: currentColor;\n  border-radius: 50%;\n  opacity: 0;\n  -webkit-animation: spinner-grow .75s linear infinite;\n  animation: spinner-grow .75s linear infinite;\n}\n\n.spinner-grow-sm {\n  width: 1rem;\n  height: 1rem;\n}\n\n.align-baseline {\n  vertical-align: baseline !important;\n}\n\n.align-top {\n  vertical-align: top !important;\n}\n\n.align-middle {\n  vertical-align: middle !important;\n}\n\n.align-bottom {\n  vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n  vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n  vertical-align: text-top !important;\n}\n\n.bg-primary {\n  background-color: #007bff !important;\n}\n\na.bg-primary:hover, a.bg-primary:focus,\nbutton.bg-primary:hover,\nbutton.bg-primary:focus {\n  background-color: #0062cc !important;\n}\n\n.bg-secondary {\n  background-color: #6c757d !important;\n}\n\na.bg-secondary:hover, a.bg-secondary:focus,\nbutton.bg-secondary:hover,\nbutton.bg-secondary:focus {\n  background-color: #545b62 !important;\n}\n\n.bg-success {\n  background-color: #28a745 !important;\n}\n\na.bg-success:hover, a.bg-success:focus,\nbutton.bg-success:hover,\nbutton.bg-success:focus {\n  background-color: #1e7e34 !important;\n}\n\n.bg-info {\n  background-color: #17a2b8 !important;\n}\n\na.bg-info:hover, a.bg-info:focus,\nbutton.bg-info:hover,\nbutton.bg-info:focus {\n  background-color: #117a8b !important;\n}\n\n.bg-warning {\n  background-color: #ffc107 !important;\n}\n\na.bg-warning:hover, a.bg-warning:focus,\nbutton.bg-warning:hover,\nbutton.bg-warning:focus {\n  background-color: #d39e00 !important;\n}\n\n.bg-danger {\n  background-color: #dc3545 !important;\n}\n\na.bg-danger:hover, a.bg-danger:focus,\nbutton.bg-danger:hover,\nbutton.bg-danger:focus {\n  background-color: #bd2130 !important;\n}\n\n.bg-light {\n  background-color: #f8f9fa !important;\n}\n\na.bg-light:hover, a.bg-light:focus,\nbutton.bg-light:hover,\nbutton.bg-light:focus {\n  background-color: #dae0e5 !important;\n}\n\n.bg-dark {\n  background-color: #343a40 !important;\n}\n\na.bg-dark:hover, a.bg-dark:focus,\nbutton.bg-dark:hover,\nbutton.bg-dark:focus {\n  background-color: #1d2124 !important;\n}\n\n.bg-white {\n  background-color: #fff !important;\n}\n\n.bg-transparent {\n  background-color: transparent !important;\n}\n\n.border {\n  border: 1px solid #dee2e6 !important;\n}\n\n.border-top {\n  border-top: 1px solid #dee2e6 !important;\n}\n\n.border-right {\n  border-right: 1px solid #dee2e6 !important;\n}\n\n.border-bottom {\n  border-bottom: 1px solid #dee2e6 !important;\n}\n\n.border-left {\n  border-left: 1px solid #dee2e6 !important;\n}\n\n.border-0 {\n  border: 0 !important;\n}\n\n.border-top-0 {\n  border-top: 0 !important;\n}\n\n.border-right-0 {\n  border-right: 0 !important;\n}\n\n.border-bottom-0 {\n  border-bottom: 0 !important;\n}\n\n.border-left-0 {\n  border-left: 0 !important;\n}\n\n.border-primary {\n  border-color: #007bff !important;\n}\n\n.border-secondary {\n  border-color: #6c757d !important;\n}\n\n.border-success {\n  border-color: #28a745 !important;\n}\n\n.border-info {\n  border-color: #17a2b8 !important;\n}\n\n.border-warning {\n  border-color: #ffc107 !important;\n}\n\n.border-danger {\n  border-color: #dc3545 !important;\n}\n\n.border-light {\n  border-color: #f8f9fa !important;\n}\n\n.border-dark {\n  border-color: #343a40 !important;\n}\n\n.border-white {\n  border-color: #fff !important;\n}\n\n.rounded-sm {\n  border-radius: 0.2rem !important;\n}\n\n.rounded {\n  border-radius: 0.25rem !important;\n}\n\n.rounded-top {\n  border-top-left-radius: 0.25rem !important;\n  border-top-right-radius: 0.25rem !important;\n}\n\n.rounded-right {\n  border-top-right-radius: 0.25rem !important;\n  border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n  border-bottom-right-radius: 0.25rem !important;\n  border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-left {\n  border-top-left-radius: 0.25rem !important;\n  border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-lg {\n  border-radius: 0.3rem !important;\n}\n\n.rounded-circle {\n  border-radius: 50% !important;\n}\n\n.rounded-pill {\n  border-radius: 50rem !important;\n}\n\n.rounded-0 {\n  border-radius: 0 !important;\n}\n\n.clearfix::after {\n  display: block;\n  clear: both;\n  content: \"\";\n}\n\n.d-none {\n  display: none !important;\n}\n\n.d-inline {\n  display: inline !important;\n}\n\n.d-inline-block {\n  display: inline-block !important;\n}\n\n.d-block {\n  display: block !important;\n}\n\n.d-table {\n  display: table !important;\n}\n\n.d-table-row {\n  display: table-row !important;\n}\n\n.d-table-cell {\n  display: table-cell !important;\n}\n\n.d-flex {\n  display: -ms-flexbox !important;\n  display: flex !important;\n}\n\n.d-inline-flex {\n  display: -ms-inline-flexbox !important;\n  display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n  .d-sm-none {\n    display: none !important;\n  }\n  .d-sm-inline {\n    display: inline !important;\n  }\n  .d-sm-inline-block {\n    display: inline-block !important;\n  }\n  .d-sm-block {\n    display: block !important;\n  }\n  .d-sm-table {\n    display: table !important;\n  }\n  .d-sm-table-row {\n    display: table-row !important;\n  }\n  .d-sm-table-cell {\n    display: table-cell !important;\n  }\n  .d-sm-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-sm-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .d-md-none {\n    display: none !important;\n  }\n  .d-md-inline {\n    display: inline !important;\n  }\n  .d-md-inline-block {\n    display: inline-block !important;\n  }\n  .d-md-block {\n    display: block !important;\n  }\n  .d-md-table {\n    display: table !important;\n  }\n  .d-md-table-row {\n    display: table-row !important;\n  }\n  .d-md-table-cell {\n    display: table-cell !important;\n  }\n  .d-md-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-md-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .d-lg-none {\n    display: none !important;\n  }\n  .d-lg-inline {\n    display: inline !important;\n  }\n  .d-lg-inline-block {\n    display: inline-block !important;\n  }\n  .d-lg-block {\n    display: block !important;\n  }\n  .d-lg-table {\n    display: table !important;\n  }\n  .d-lg-table-row {\n    display: table-row !important;\n  }\n  .d-lg-table-cell {\n    display: table-cell !important;\n  }\n  .d-lg-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-lg-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .d-xl-none {\n    display: none !important;\n  }\n  .d-xl-inline {\n    display: inline !important;\n  }\n  .d-xl-inline-block {\n    display: inline-block !important;\n  }\n  .d-xl-block {\n    display: block !important;\n  }\n  .d-xl-table {\n    display: table !important;\n  }\n  .d-xl-table-row {\n    display: table-row !important;\n  }\n  .d-xl-table-cell {\n    display: table-cell !important;\n  }\n  .d-xl-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-xl-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media print {\n  .d-print-none {\n    display: none !important;\n  }\n  .d-print-inline {\n    display: inline !important;\n  }\n  .d-print-inline-block {\n    display: inline-block !important;\n  }\n  .d-print-block {\n    display: block !important;\n  }\n  .d-print-table {\n    display: table !important;\n  }\n  .d-print-table-row {\n    display: table-row !important;\n  }\n  .d-print-table-cell {\n    display: table-cell !important;\n  }\n  .d-print-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-print-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n.embed-responsive {\n  position: relative;\n  display: block;\n  width: 100%;\n  padding: 0;\n  overflow: hidden;\n}\n\n.embed-responsive::before {\n  display: block;\n  content: \"\";\n}\n\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  border: 0;\n}\n\n.embed-responsive-21by9::before {\n  padding-top: 42.857143%;\n}\n\n.embed-responsive-16by9::before {\n  padding-top: 56.25%;\n}\n\n.embed-responsive-4by3::before {\n  padding-top: 75%;\n}\n\n.embed-responsive-1by1::before {\n  padding-top: 100%;\n}\n\n.flex-row {\n  -ms-flex-direction: row !important;\n  flex-direction: row !important;\n}\n\n.flex-column {\n  -ms-flex-direction: column !important;\n  flex-direction: column !important;\n}\n\n.flex-row-reverse {\n  -ms-flex-direction: row-reverse !important;\n  flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n  -ms-flex-direction: column-reverse !important;\n  flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n  -ms-flex-wrap: wrap !important;\n  flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n  -ms-flex-wrap: nowrap !important;\n  flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n  -ms-flex-wrap: wrap-reverse !important;\n  flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n  -ms-flex: 1 1 auto !important;\n  flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n  -ms-flex-positive: 0 !important;\n  flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n  -ms-flex-positive: 1 !important;\n  flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n  -ms-flex-negative: 0 !important;\n  flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n  -ms-flex-negative: 1 !important;\n  flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n  -ms-flex-pack: start !important;\n  justify-content: flex-start !important;\n}\n\n.justify-content-end {\n  -ms-flex-pack: end !important;\n  justify-content: flex-end !important;\n}\n\n.justify-content-center {\n  -ms-flex-pack: center !important;\n  justify-content: center !important;\n}\n\n.justify-content-between {\n  -ms-flex-pack: justify !important;\n  justify-content: space-between !important;\n}\n\n.justify-content-around {\n  -ms-flex-pack: distribute !important;\n  justify-content: space-around !important;\n}\n\n.align-items-start {\n  -ms-flex-align: start !important;\n  align-items: flex-start !important;\n}\n\n.align-items-end {\n  -ms-flex-align: end !important;\n  align-items: flex-end !important;\n}\n\n.align-items-center {\n  -ms-flex-align: center !important;\n  align-items: center !important;\n}\n\n.align-items-baseline {\n  -ms-flex-align: baseline !important;\n  align-items: baseline !important;\n}\n\n.align-items-stretch {\n  -ms-flex-align: stretch !important;\n  align-items: stretch !important;\n}\n\n.align-content-start {\n  -ms-flex-line-pack: start !important;\n  align-content: flex-start !important;\n}\n\n.align-content-end {\n  -ms-flex-line-pack: end !important;\n  align-content: flex-end !important;\n}\n\n.align-content-center {\n  -ms-flex-line-pack: center !important;\n  align-content: center !important;\n}\n\n.align-content-between {\n  -ms-flex-line-pack: justify !important;\n  align-content: space-between !important;\n}\n\n.align-content-around {\n  -ms-flex-line-pack: distribute !important;\n  align-content: space-around !important;\n}\n\n.align-content-stretch {\n  -ms-flex-line-pack: stretch !important;\n  align-content: stretch !important;\n}\n\n.align-self-auto {\n  -ms-flex-item-align: auto !important;\n  align-self: auto !important;\n}\n\n.align-self-start {\n  -ms-flex-item-align: start !important;\n  align-self: flex-start !important;\n}\n\n.align-self-end {\n  -ms-flex-item-align: end !important;\n  align-self: flex-end !important;\n}\n\n.align-self-center {\n  -ms-flex-item-align: center !important;\n  align-self: center !important;\n}\n\n.align-self-baseline {\n  -ms-flex-item-align: baseline !important;\n  align-self: baseline !important;\n}\n\n.align-self-stretch {\n  -ms-flex-item-align: stretch !important;\n  align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n  .flex-sm-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-sm-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-sm-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-sm-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-sm-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-sm-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-sm-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-sm-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-sm-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-sm-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-sm-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-sm-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-sm-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-sm-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-sm-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-sm-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-sm-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-sm-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-sm-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-sm-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-sm-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-sm-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-sm-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-sm-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-sm-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-sm-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-sm-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-sm-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-sm-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-sm-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-sm-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-sm-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-sm-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-sm-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .flex-md-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-md-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-md-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-md-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-md-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-md-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-md-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-md-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-md-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-md-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-md-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-md-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-md-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-md-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-md-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-md-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-md-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-md-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-md-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-md-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-md-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-md-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-md-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-md-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-md-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-md-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-md-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-md-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-md-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-md-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-md-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-md-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-md-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-md-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .flex-lg-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-lg-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-lg-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-lg-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-lg-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-lg-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-lg-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-lg-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-lg-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-lg-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-lg-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-lg-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-lg-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-lg-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-lg-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-lg-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-lg-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-lg-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-lg-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-lg-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-lg-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-lg-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-lg-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-lg-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-lg-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-lg-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-lg-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-lg-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-lg-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-lg-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-lg-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-lg-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-lg-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-lg-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .flex-xl-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-xl-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-xl-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-xl-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-xl-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-xl-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-xl-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-xl-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-xl-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-xl-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-xl-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-xl-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-xl-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-xl-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-xl-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-xl-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-xl-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-xl-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-xl-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-xl-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-xl-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-xl-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-xl-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-xl-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-xl-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-xl-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-xl-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-xl-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-xl-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-xl-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-xl-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-xl-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-xl-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-xl-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n.float-left {\n  float: left !important;\n}\n\n.float-right {\n  float: right !important;\n}\n\n.float-none {\n  float: none !important;\n}\n\n@media (min-width: 576px) {\n  .float-sm-left {\n    float: left !important;\n  }\n  .float-sm-right {\n    float: right !important;\n  }\n  .float-sm-none {\n    float: none !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .float-md-left {\n    float: left !important;\n  }\n  .float-md-right {\n    float: right !important;\n  }\n  .float-md-none {\n    float: none !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .float-lg-left {\n    float: left !important;\n  }\n  .float-lg-right {\n    float: right !important;\n  }\n  .float-lg-none {\n    float: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .float-xl-left {\n    float: left !important;\n  }\n  .float-xl-right {\n    float: right !important;\n  }\n  .float-xl-none {\n    float: none !important;\n  }\n}\n\n.overflow-auto {\n  overflow: auto !important;\n}\n\n.overflow-hidden {\n  overflow: hidden !important;\n}\n\n.position-static {\n  position: static !important;\n}\n\n.position-relative {\n  position: relative !important;\n}\n\n.position-absolute {\n  position: absolute !important;\n}\n\n.position-fixed {\n  position: fixed !important;\n}\n\n.position-sticky {\n  position: -webkit-sticky !important;\n  position: sticky !important;\n}\n\n.fixed-top {\n  position: fixed;\n  top: 0;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n}\n\n.fixed-bottom {\n  position: fixed;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1030;\n}\n\n@supports ((position: -webkit-sticky) or (position: sticky)) {\n  .sticky-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n}\n\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  white-space: nowrap;\n  border: 0;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n  position: static;\n  width: auto;\n  height: auto;\n  overflow: visible;\n  clip: auto;\n  white-space: normal;\n}\n\n.shadow-sm {\n  box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\n}\n\n.shadow {\n  box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\n}\n\n.shadow-lg {\n  box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\n}\n\n.shadow-none {\n  box-shadow: none !important;\n}\n\n.w-25 {\n  width: 25% !important;\n}\n\n.w-50 {\n  width: 50% !important;\n}\n\n.w-75 {\n  width: 75% !important;\n}\n\n.w-100 {\n  width: 100% !important;\n}\n\n.w-auto {\n  width: auto !important;\n}\n\n.h-25 {\n  height: 25% !important;\n}\n\n.h-50 {\n  height: 50% !important;\n}\n\n.h-75 {\n  height: 75% !important;\n}\n\n.h-100 {\n  height: 100% !important;\n}\n\n.h-auto {\n  height: auto !important;\n}\n\n.mw-100 {\n  max-width: 100% !important;\n}\n\n.mh-100 {\n  max-height: 100% !important;\n}\n\n.min-vw-100 {\n  min-width: 100vw !important;\n}\n\n.min-vh-100 {\n  min-height: 100vh !important;\n}\n\n.vw-100 {\n  width: 100vw !important;\n}\n\n.vh-100 {\n  height: 100vh !important;\n}\n\n.stretched-link::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1;\n  pointer-events: auto;\n  content: \"\";\n  background-color: rgba(0, 0, 0, 0);\n}\n\n.m-0 {\n  margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n  margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n  margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n  margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n  margin-left: 0 !important;\n}\n\n.m-1 {\n  margin: 0.25rem !important;\n}\n\n.mt-1,\n.my-1 {\n  margin-top: 0.25rem !important;\n}\n\n.mr-1,\n.mx-1 {\n  margin-right: 0.25rem !important;\n}\n\n.mb-1,\n.my-1 {\n  margin-bottom: 0.25rem !important;\n}\n\n.ml-1,\n.mx-1 {\n  margin-left: 0.25rem !important;\n}\n\n.m-2 {\n  margin: 0.5rem !important;\n}\n\n.mt-2,\n.my-2 {\n  margin-top: 0.5rem !important;\n}\n\n.mr-2,\n.mx-2 {\n  margin-right: 0.5rem !important;\n}\n\n.mb-2,\n.my-2 {\n  margin-bottom: 0.5rem !important;\n}\n\n.ml-2,\n.mx-2 {\n  margin-left: 0.5rem !important;\n}\n\n.m-3 {\n  margin: 1rem !important;\n}\n\n.mt-3,\n.my-3 {\n  margin-top: 1rem !important;\n}\n\n.mr-3,\n.mx-3 {\n  margin-right: 1rem !important;\n}\n\n.mb-3,\n.my-3 {\n  margin-bottom: 1rem !important;\n}\n\n.ml-3,\n.mx-3 {\n  margin-left: 1rem !important;\n}\n\n.m-4 {\n  margin: 1.5rem !important;\n}\n\n.mt-4,\n.my-4 {\n  margin-top: 1.5rem !important;\n}\n\n.mr-4,\n.mx-4 {\n  margin-right: 1.5rem !important;\n}\n\n.mb-4,\n.my-4 {\n  margin-bottom: 1.5rem !important;\n}\n\n.ml-4,\n.mx-4 {\n  margin-left: 1.5rem !important;\n}\n\n.m-5 {\n  margin: 3rem !important;\n}\n\n.mt-5,\n.my-5 {\n  margin-top: 3rem !important;\n}\n\n.mr-5,\n.mx-5 {\n  margin-right: 3rem !important;\n}\n\n.mb-5,\n.my-5 {\n  margin-bottom: 3rem !important;\n}\n\n.ml-5,\n.mx-5 {\n  margin-left: 3rem !important;\n}\n\n.p-0 {\n  padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n  padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n  padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n  padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n  padding-left: 0 !important;\n}\n\n.p-1 {\n  padding: 0.25rem !important;\n}\n\n.pt-1,\n.py-1 {\n  padding-top: 0.25rem !important;\n}\n\n.pr-1,\n.px-1 {\n  padding-right: 0.25rem !important;\n}\n\n.pb-1,\n.py-1 {\n  padding-bottom: 0.25rem !important;\n}\n\n.pl-1,\n.px-1 {\n  padding-left: 0.25rem !important;\n}\n\n.p-2 {\n  padding: 0.5rem !important;\n}\n\n.pt-2,\n.py-2 {\n  padding-top: 0.5rem !important;\n}\n\n.pr-2,\n.px-2 {\n  padding-right: 0.5rem !important;\n}\n\n.pb-2,\n.py-2 {\n  padding-bottom: 0.5rem !important;\n}\n\n.pl-2,\n.px-2 {\n  padding-left: 0.5rem !important;\n}\n\n.p-3 {\n  padding: 1rem !important;\n}\n\n.pt-3,\n.py-3 {\n  padding-top: 1rem !important;\n}\n\n.pr-3,\n.px-3 {\n  padding-right: 1rem !important;\n}\n\n.pb-3,\n.py-3 {\n  padding-bottom: 1rem !important;\n}\n\n.pl-3,\n.px-3 {\n  padding-left: 1rem !important;\n}\n\n.p-4 {\n  padding: 1.5rem !important;\n}\n\n.pt-4,\n.py-4 {\n  padding-top: 1.5rem !important;\n}\n\n.pr-4,\n.px-4 {\n  padding-right: 1.5rem !important;\n}\n\n.pb-4,\n.py-4 {\n  padding-bottom: 1.5rem !important;\n}\n\n.pl-4,\n.px-4 {\n  padding-left: 1.5rem !important;\n}\n\n.p-5 {\n  padding: 3rem !important;\n}\n\n.pt-5,\n.py-5 {\n  padding-top: 3rem !important;\n}\n\n.pr-5,\n.px-5 {\n  padding-right: 3rem !important;\n}\n\n.pb-5,\n.py-5 {\n  padding-bottom: 3rem !important;\n}\n\n.pl-5,\n.px-5 {\n  padding-left: 3rem !important;\n}\n\n.m-n1 {\n  margin: -0.25rem !important;\n}\n\n.mt-n1,\n.my-n1 {\n  margin-top: -0.25rem !important;\n}\n\n.mr-n1,\n.mx-n1 {\n  margin-right: -0.25rem !important;\n}\n\n.mb-n1,\n.my-n1 {\n  margin-bottom: -0.25rem !important;\n}\n\n.ml-n1,\n.mx-n1 {\n  margin-left: -0.25rem !important;\n}\n\n.m-n2 {\n  margin: -0.5rem !important;\n}\n\n.mt-n2,\n.my-n2 {\n  margin-top: -0.5rem !important;\n}\n\n.mr-n2,\n.mx-n2 {\n  margin-right: -0.5rem !important;\n}\n\n.mb-n2,\n.my-n2 {\n  margin-bottom: -0.5rem !important;\n}\n\n.ml-n2,\n.mx-n2 {\n  margin-left: -0.5rem !important;\n}\n\n.m-n3 {\n  margin: -1rem !important;\n}\n\n.mt-n3,\n.my-n3 {\n  margin-top: -1rem !important;\n}\n\n.mr-n3,\n.mx-n3 {\n  margin-right: -1rem !important;\n}\n\n.mb-n3,\n.my-n3 {\n  margin-bottom: -1rem !important;\n}\n\n.ml-n3,\n.mx-n3 {\n  margin-left: -1rem !important;\n}\n\n.m-n4 {\n  margin: -1.5rem !important;\n}\n\n.mt-n4,\n.my-n4 {\n  margin-top: -1.5rem !important;\n}\n\n.mr-n4,\n.mx-n4 {\n  margin-right: -1.5rem !important;\n}\n\n.mb-n4,\n.my-n4 {\n  margin-bottom: -1.5rem !important;\n}\n\n.ml-n4,\n.mx-n4 {\n  margin-left: -1.5rem !important;\n}\n\n.m-n5 {\n  margin: -3rem !important;\n}\n\n.mt-n5,\n.my-n5 {\n  margin-top: -3rem !important;\n}\n\n.mr-n5,\n.mx-n5 {\n  margin-right: -3rem !important;\n}\n\n.mb-n5,\n.my-n5 {\n  margin-bottom: -3rem !important;\n}\n\n.ml-n5,\n.mx-n5 {\n  margin-left: -3rem !important;\n}\n\n.m-auto {\n  margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n  margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n  margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n  margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n  margin-left: auto !important;\n}\n\n@media (min-width: 576px) {\n  .m-sm-0 {\n    margin: 0 !important;\n  }\n  .mt-sm-0,\n  .my-sm-0 {\n    margin-top: 0 !important;\n  }\n  .mr-sm-0,\n  .mx-sm-0 {\n    margin-right: 0 !important;\n  }\n  .mb-sm-0,\n  .my-sm-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-sm-0,\n  .mx-sm-0 {\n    margin-left: 0 !important;\n  }\n  .m-sm-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-sm-1,\n  .my-sm-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-sm-1,\n  .mx-sm-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-sm-1,\n  .my-sm-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-sm-1,\n  .mx-sm-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-sm-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-sm-2,\n  .my-sm-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-sm-2,\n  .mx-sm-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-sm-2,\n  .my-sm-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-sm-2,\n  .mx-sm-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-sm-3 {\n    margin: 1rem !important;\n  }\n  .mt-sm-3,\n  .my-sm-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-sm-3,\n  .mx-sm-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-sm-3,\n  .my-sm-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-sm-3,\n  .mx-sm-3 {\n    margin-left: 1rem !important;\n  }\n  .m-sm-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-sm-4,\n  .my-sm-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-sm-4,\n  .mx-sm-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-sm-4,\n  .my-sm-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-sm-4,\n  .mx-sm-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-sm-5 {\n    margin: 3rem !important;\n  }\n  .mt-sm-5,\n  .my-sm-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-sm-5,\n  .mx-sm-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-sm-5,\n  .my-sm-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-sm-5,\n  .mx-sm-5 {\n    margin-left: 3rem !important;\n  }\n  .p-sm-0 {\n    padding: 0 !important;\n  }\n  .pt-sm-0,\n  .py-sm-0 {\n    padding-top: 0 !important;\n  }\n  .pr-sm-0,\n  .px-sm-0 {\n    padding-right: 0 !important;\n  }\n  .pb-sm-0,\n  .py-sm-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-sm-0,\n  .px-sm-0 {\n    padding-left: 0 !important;\n  }\n  .p-sm-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-sm-1,\n  .py-sm-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-sm-1,\n  .px-sm-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-sm-1,\n  .py-sm-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-sm-1,\n  .px-sm-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-sm-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-sm-2,\n  .py-sm-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-sm-2,\n  .px-sm-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-sm-2,\n  .py-sm-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-sm-2,\n  .px-sm-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-sm-3 {\n    padding: 1rem !important;\n  }\n  .pt-sm-3,\n  .py-sm-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-sm-3,\n  .px-sm-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-sm-3,\n  .py-sm-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-sm-3,\n  .px-sm-3 {\n    padding-left: 1rem !important;\n  }\n  .p-sm-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-sm-4,\n  .py-sm-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-sm-4,\n  .px-sm-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-sm-4,\n  .py-sm-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-sm-4,\n  .px-sm-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-sm-5 {\n    padding: 3rem !important;\n  }\n  .pt-sm-5,\n  .py-sm-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-sm-5,\n  .px-sm-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-sm-5,\n  .py-sm-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-sm-5,\n  .px-sm-5 {\n    padding-left: 3rem !important;\n  }\n  .m-sm-n1 {\n    margin: -0.25rem !important;\n  }\n  .mt-sm-n1,\n  .my-sm-n1 {\n    margin-top: -0.25rem !important;\n  }\n  .mr-sm-n1,\n  .mx-sm-n1 {\n    margin-right: -0.25rem !important;\n  }\n  .mb-sm-n1,\n  .my-sm-n1 {\n    margin-bottom: -0.25rem !important;\n  }\n  .ml-sm-n1,\n  .mx-sm-n1 {\n    margin-left: -0.25rem !important;\n  }\n  .m-sm-n2 {\n    margin: -0.5rem !important;\n  }\n  .mt-sm-n2,\n  .my-sm-n2 {\n    margin-top: -0.5rem !important;\n  }\n  .mr-sm-n2,\n  .mx-sm-n2 {\n    margin-right: -0.5rem !important;\n  }\n  .mb-sm-n2,\n  .my-sm-n2 {\n    margin-bottom: -0.5rem !important;\n  }\n  .ml-sm-n2,\n  .mx-sm-n2 {\n    margin-left: -0.5rem !important;\n  }\n  .m-sm-n3 {\n    margin: -1rem !important;\n  }\n  .mt-sm-n3,\n  .my-sm-n3 {\n    margin-top: -1rem !important;\n  }\n  .mr-sm-n3,\n  .mx-sm-n3 {\n    margin-right: -1rem !important;\n  }\n  .mb-sm-n3,\n  .my-sm-n3 {\n    margin-bottom: -1rem !important;\n  }\n  .ml-sm-n3,\n  .mx-sm-n3 {\n    margin-left: -1rem !important;\n  }\n  .m-sm-n4 {\n    margin: -1.5rem !important;\n  }\n  .mt-sm-n4,\n  .my-sm-n4 {\n    margin-top: -1.5rem !important;\n  }\n  .mr-sm-n4,\n  .mx-sm-n4 {\n    margin-right: -1.5rem !important;\n  }\n  .mb-sm-n4,\n  .my-sm-n4 {\n    margin-bottom: -1.5rem !important;\n  }\n  .ml-sm-n4,\n  .mx-sm-n4 {\n    margin-left: -1.5rem !important;\n  }\n  .m-sm-n5 {\n    margin: -3rem !important;\n  }\n  .mt-sm-n5,\n  .my-sm-n5 {\n    margin-top: -3rem !important;\n  }\n  .mr-sm-n5,\n  .mx-sm-n5 {\n    margin-right: -3rem !important;\n  }\n  .mb-sm-n5,\n  .my-sm-n5 {\n    margin-bottom: -3rem !important;\n  }\n  .ml-sm-n5,\n  .mx-sm-n5 {\n    margin-left: -3rem !important;\n  }\n  .m-sm-auto {\n    margin: auto !important;\n  }\n  .mt-sm-auto,\n  .my-sm-auto {\n    margin-top: auto !important;\n  }\n  .mr-sm-auto,\n  .mx-sm-auto {\n    margin-right: auto !important;\n  }\n  .mb-sm-auto,\n  .my-sm-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-sm-auto,\n  .mx-sm-auto {\n    margin-left: auto !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .m-md-0 {\n    margin: 0 !important;\n  }\n  .mt-md-0,\n  .my-md-0 {\n    margin-top: 0 !important;\n  }\n  .mr-md-0,\n  .mx-md-0 {\n    margin-right: 0 !important;\n  }\n  .mb-md-0,\n  .my-md-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-md-0,\n  .mx-md-0 {\n    margin-left: 0 !important;\n  }\n  .m-md-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-md-1,\n  .my-md-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-md-1,\n  .mx-md-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-md-1,\n  .my-md-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-md-1,\n  .mx-md-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-md-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-md-2,\n  .my-md-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-md-2,\n  .mx-md-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-md-2,\n  .my-md-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-md-2,\n  .mx-md-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-md-3 {\n    margin: 1rem !important;\n  }\n  .mt-md-3,\n  .my-md-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-md-3,\n  .mx-md-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-md-3,\n  .my-md-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-md-3,\n  .mx-md-3 {\n    margin-left: 1rem !important;\n  }\n  .m-md-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-md-4,\n  .my-md-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-md-4,\n  .mx-md-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-md-4,\n  .my-md-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-md-4,\n  .mx-md-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-md-5 {\n    margin: 3rem !important;\n  }\n  .mt-md-5,\n  .my-md-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-md-5,\n  .mx-md-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-md-5,\n  .my-md-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-md-5,\n  .mx-md-5 {\n    margin-left: 3rem !important;\n  }\n  .p-md-0 {\n    padding: 0 !important;\n  }\n  .pt-md-0,\n  .py-md-0 {\n    padding-top: 0 !important;\n  }\n  .pr-md-0,\n  .px-md-0 {\n    padding-right: 0 !important;\n  }\n  .pb-md-0,\n  .py-md-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-md-0,\n  .px-md-0 {\n    padding-left: 0 !important;\n  }\n  .p-md-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-md-1,\n  .py-md-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-md-1,\n  .px-md-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-md-1,\n  .py-md-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-md-1,\n  .px-md-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-md-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-md-2,\n  .py-md-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-md-2,\n  .px-md-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-md-2,\n  .py-md-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-md-2,\n  .px-md-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-md-3 {\n    padding: 1rem !important;\n  }\n  .pt-md-3,\n  .py-md-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-md-3,\n  .px-md-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-md-3,\n  .py-md-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-md-3,\n  .px-md-3 {\n    padding-left: 1rem !important;\n  }\n  .p-md-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-md-4,\n  .py-md-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-md-4,\n  .px-md-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-md-4,\n  .py-md-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-md-4,\n  .px-md-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-md-5 {\n    padding: 3rem !important;\n  }\n  .pt-md-5,\n  .py-md-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-md-5,\n  .px-md-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-md-5,\n  .py-md-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-md-5,\n  .px-md-5 {\n    padding-left: 3rem !important;\n  }\n  .m-md-n1 {\n    margin: -0.25rem !important;\n  }\n  .mt-md-n1,\n  .my-md-n1 {\n    margin-top: -0.25rem !important;\n  }\n  .mr-md-n1,\n  .mx-md-n1 {\n    margin-right: -0.25rem !important;\n  }\n  .mb-md-n1,\n  .my-md-n1 {\n    margin-bottom: -0.25rem !important;\n  }\n  .ml-md-n1,\n  .mx-md-n1 {\n    margin-left: -0.25rem !important;\n  }\n  .m-md-n2 {\n    margin: -0.5rem !important;\n  }\n  .mt-md-n2,\n  .my-md-n2 {\n    margin-top: -0.5rem !important;\n  }\n  .mr-md-n2,\n  .mx-md-n2 {\n    margin-right: -0.5rem !important;\n  }\n  .mb-md-n2,\n  .my-md-n2 {\n    margin-bottom: -0.5rem !important;\n  }\n  .ml-md-n2,\n  .mx-md-n2 {\n    margin-left: -0.5rem !important;\n  }\n  .m-md-n3 {\n    margin: -1rem !important;\n  }\n  .mt-md-n3,\n  .my-md-n3 {\n    margin-top: -1rem !important;\n  }\n  .mr-md-n3,\n  .mx-md-n3 {\n    margin-right: -1rem !important;\n  }\n  .mb-md-n3,\n  .my-md-n3 {\n    margin-bottom: -1rem !important;\n  }\n  .ml-md-n3,\n  .mx-md-n3 {\n    margin-left: -1rem !important;\n  }\n  .m-md-n4 {\n    margin: -1.5rem !important;\n  }\n  .mt-md-n4,\n  .my-md-n4 {\n    margin-top: -1.5rem !important;\n  }\n  .mr-md-n4,\n  .mx-md-n4 {\n    margin-right: -1.5rem !important;\n  }\n  .mb-md-n4,\n  .my-md-n4 {\n    margin-bottom: -1.5rem !important;\n  }\n  .ml-md-n4,\n  .mx-md-n4 {\n    margin-left: -1.5rem !important;\n  }\n  .m-md-n5 {\n    margin: -3rem !important;\n  }\n  .mt-md-n5,\n  .my-md-n5 {\n    margin-top: -3rem !important;\n  }\n  .mr-md-n5,\n  .mx-md-n5 {\n    margin-right: -3rem !important;\n  }\n  .mb-md-n5,\n  .my-md-n5 {\n    margin-bottom: -3rem !important;\n  }\n  .ml-md-n5,\n  .mx-md-n5 {\n    margin-left: -3rem !important;\n  }\n  .m-md-auto {\n    margin: auto !important;\n  }\n  .mt-md-auto,\n  .my-md-auto {\n    margin-top: auto !important;\n  }\n  .mr-md-auto,\n  .mx-md-auto {\n    margin-right: auto !important;\n  }\n  .mb-md-auto,\n  .my-md-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-md-auto,\n  .mx-md-auto {\n    margin-left: auto !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .m-lg-0 {\n    margin: 0 !important;\n  }\n  .mt-lg-0,\n  .my-lg-0 {\n    margin-top: 0 !important;\n  }\n  .mr-lg-0,\n  .mx-lg-0 {\n    margin-right: 0 !important;\n  }\n  .mb-lg-0,\n  .my-lg-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-lg-0,\n  .mx-lg-0 {\n    margin-left: 0 !important;\n  }\n  .m-lg-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-lg-1,\n  .my-lg-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-lg-1,\n  .mx-lg-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-lg-1,\n  .my-lg-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-lg-1,\n  .mx-lg-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-lg-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-lg-2,\n  .my-lg-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-lg-2,\n  .mx-lg-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-lg-2,\n  .my-lg-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-lg-2,\n  .mx-lg-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-lg-3 {\n    margin: 1rem !important;\n  }\n  .mt-lg-3,\n  .my-lg-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-lg-3,\n  .mx-lg-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-lg-3,\n  .my-lg-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-lg-3,\n  .mx-lg-3 {\n    margin-left: 1rem !important;\n  }\n  .m-lg-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-lg-4,\n  .my-lg-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-lg-4,\n  .mx-lg-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-lg-4,\n  .my-lg-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-lg-4,\n  .mx-lg-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-lg-5 {\n    margin: 3rem !important;\n  }\n  .mt-lg-5,\n  .my-lg-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-lg-5,\n  .mx-lg-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-lg-5,\n  .my-lg-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-lg-5,\n  .mx-lg-5 {\n    margin-left: 3rem !important;\n  }\n  .p-lg-0 {\n    padding: 0 !important;\n  }\n  .pt-lg-0,\n  .py-lg-0 {\n    padding-top: 0 !important;\n  }\n  .pr-lg-0,\n  .px-lg-0 {\n    padding-right: 0 !important;\n  }\n  .pb-lg-0,\n  .py-lg-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-lg-0,\n  .px-lg-0 {\n    padding-left: 0 !important;\n  }\n  .p-lg-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-lg-1,\n  .py-lg-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-lg-1,\n  .px-lg-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-lg-1,\n  .py-lg-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-lg-1,\n  .px-lg-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-lg-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-lg-2,\n  .py-lg-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-lg-2,\n  .px-lg-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-lg-2,\n  .py-lg-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-lg-2,\n  .px-lg-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-lg-3 {\n    padding: 1rem !important;\n  }\n  .pt-lg-3,\n  .py-lg-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-lg-3,\n  .px-lg-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-lg-3,\n  .py-lg-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-lg-3,\n  .px-lg-3 {\n    padding-left: 1rem !important;\n  }\n  .p-lg-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-lg-4,\n  .py-lg-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-lg-4,\n  .px-lg-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-lg-4,\n  .py-lg-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-lg-4,\n  .px-lg-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-lg-5 {\n    padding: 3rem !important;\n  }\n  .pt-lg-5,\n  .py-lg-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-lg-5,\n  .px-lg-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-lg-5,\n  .py-lg-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-lg-5,\n  .px-lg-5 {\n    padding-left: 3rem !important;\n  }\n  .m-lg-n1 {\n    margin: -0.25rem !important;\n  }\n  .mt-lg-n1,\n  .my-lg-n1 {\n    margin-top: -0.25rem !important;\n  }\n  .mr-lg-n1,\n  .mx-lg-n1 {\n    margin-right: -0.25rem !important;\n  }\n  .mb-lg-n1,\n  .my-lg-n1 {\n    margin-bottom: -0.25rem !important;\n  }\n  .ml-lg-n1,\n  .mx-lg-n1 {\n    margin-left: -0.25rem !important;\n  }\n  .m-lg-n2 {\n    margin: -0.5rem !important;\n  }\n  .mt-lg-n2,\n  .my-lg-n2 {\n    margin-top: -0.5rem !important;\n  }\n  .mr-lg-n2,\n  .mx-lg-n2 {\n    margin-right: -0.5rem !important;\n  }\n  .mb-lg-n2,\n  .my-lg-n2 {\n    margin-bottom: -0.5rem !important;\n  }\n  .ml-lg-n2,\n  .mx-lg-n2 {\n    margin-left: -0.5rem !important;\n  }\n  .m-lg-n3 {\n    margin: -1rem !important;\n  }\n  .mt-lg-n3,\n  .my-lg-n3 {\n    margin-top: -1rem !important;\n  }\n  .mr-lg-n3,\n  .mx-lg-n3 {\n    margin-right: -1rem !important;\n  }\n  .mb-lg-n3,\n  .my-lg-n3 {\n    margin-bottom: -1rem !important;\n  }\n  .ml-lg-n3,\n  .mx-lg-n3 {\n    margin-left: -1rem !important;\n  }\n  .m-lg-n4 {\n    margin: -1.5rem !important;\n  }\n  .mt-lg-n4,\n  .my-lg-n4 {\n    margin-top: -1.5rem !important;\n  }\n  .mr-lg-n4,\n  .mx-lg-n4 {\n    margin-right: -1.5rem !important;\n  }\n  .mb-lg-n4,\n  .my-lg-n4 {\n    margin-bottom: -1.5rem !important;\n  }\n  .ml-lg-n4,\n  .mx-lg-n4 {\n    margin-left: -1.5rem !important;\n  }\n  .m-lg-n5 {\n    margin: -3rem !important;\n  }\n  .mt-lg-n5,\n  .my-lg-n5 {\n    margin-top: -3rem !important;\n  }\n  .mr-lg-n5,\n  .mx-lg-n5 {\n    margin-right: -3rem !important;\n  }\n  .mb-lg-n5,\n  .my-lg-n5 {\n    margin-bottom: -3rem !important;\n  }\n  .ml-lg-n5,\n  .mx-lg-n5 {\n    margin-left: -3rem !important;\n  }\n  .m-lg-auto {\n    margin: auto !important;\n  }\n  .mt-lg-auto,\n  .my-lg-auto {\n    margin-top: auto !important;\n  }\n  .mr-lg-auto,\n  .mx-lg-auto {\n    margin-right: auto !important;\n  }\n  .mb-lg-auto,\n  .my-lg-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-lg-auto,\n  .mx-lg-auto {\n    margin-left: auto !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .m-xl-0 {\n    margin: 0 !important;\n  }\n  .mt-xl-0,\n  .my-xl-0 {\n    margin-top: 0 !important;\n  }\n  .mr-xl-0,\n  .mx-xl-0 {\n    margin-right: 0 !important;\n  }\n  .mb-xl-0,\n  .my-xl-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-xl-0,\n  .mx-xl-0 {\n    margin-left: 0 !important;\n  }\n  .m-xl-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-xl-1,\n  .my-xl-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-xl-1,\n  .mx-xl-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-xl-1,\n  .my-xl-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-xl-1,\n  .mx-xl-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-xl-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-xl-2,\n  .my-xl-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-xl-2,\n  .mx-xl-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-xl-2,\n  .my-xl-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-xl-2,\n  .mx-xl-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-xl-3 {\n    margin: 1rem !important;\n  }\n  .mt-xl-3,\n  .my-xl-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-xl-3,\n  .mx-xl-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-xl-3,\n  .my-xl-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-xl-3,\n  .mx-xl-3 {\n    margin-left: 1rem !important;\n  }\n  .m-xl-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-xl-4,\n  .my-xl-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-xl-4,\n  .mx-xl-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-xl-4,\n  .my-xl-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-xl-4,\n  .mx-xl-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-xl-5 {\n    margin: 3rem !important;\n  }\n  .mt-xl-5,\n  .my-xl-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-xl-5,\n  .mx-xl-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-xl-5,\n  .my-xl-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-xl-5,\n  .mx-xl-5 {\n    margin-left: 3rem !important;\n  }\n  .p-xl-0 {\n    padding: 0 !important;\n  }\n  .pt-xl-0,\n  .py-xl-0 {\n    padding-top: 0 !important;\n  }\n  .pr-xl-0,\n  .px-xl-0 {\n    padding-right: 0 !important;\n  }\n  .pb-xl-0,\n  .py-xl-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-xl-0,\n  .px-xl-0 {\n    padding-left: 0 !important;\n  }\n  .p-xl-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-xl-1,\n  .py-xl-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-xl-1,\n  .px-xl-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-xl-1,\n  .py-xl-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-xl-1,\n  .px-xl-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-xl-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-xl-2,\n  .py-xl-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-xl-2,\n  .px-xl-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-xl-2,\n  .py-xl-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-xl-2,\n  .px-xl-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-xl-3 {\n    padding: 1rem !important;\n  }\n  .pt-xl-3,\n  .py-xl-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-xl-3,\n  .px-xl-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-xl-3,\n  .py-xl-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-xl-3,\n  .px-xl-3 {\n    padding-left: 1rem !important;\n  }\n  .p-xl-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-xl-4,\n  .py-xl-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-xl-4,\n  .px-xl-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-xl-4,\n  .py-xl-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-xl-4,\n  .px-xl-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-xl-5 {\n    padding: 3rem !important;\n  }\n  .pt-xl-5,\n  .py-xl-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-xl-5,\n  .px-xl-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-xl-5,\n  .py-xl-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-xl-5,\n  .px-xl-5 {\n    padding-left: 3rem !important;\n  }\n  .m-xl-n1 {\n    margin: -0.25rem !important;\n  }\n  .mt-xl-n1,\n  .my-xl-n1 {\n    margin-top: -0.25rem !important;\n  }\n  .mr-xl-n1,\n  .mx-xl-n1 {\n    margin-right: -0.25rem !important;\n  }\n  .mb-xl-n1,\n  .my-xl-n1 {\n    margin-bottom: -0.25rem !important;\n  }\n  .ml-xl-n1,\n  .mx-xl-n1 {\n    margin-left: -0.25rem !important;\n  }\n  .m-xl-n2 {\n    margin: -0.5rem !important;\n  }\n  .mt-xl-n2,\n  .my-xl-n2 {\n    margin-top: -0.5rem !important;\n  }\n  .mr-xl-n2,\n  .mx-xl-n2 {\n    margin-right: -0.5rem !important;\n  }\n  .mb-xl-n2,\n  .my-xl-n2 {\n    margin-bottom: -0.5rem !important;\n  }\n  .ml-xl-n2,\n  .mx-xl-n2 {\n    margin-left: -0.5rem !important;\n  }\n  .m-xl-n3 {\n    margin: -1rem !important;\n  }\n  .mt-xl-n3,\n  .my-xl-n3 {\n    margin-top: -1rem !important;\n  }\n  .mr-xl-n3,\n  .mx-xl-n3 {\n    margin-right: -1rem !important;\n  }\n  .mb-xl-n3,\n  .my-xl-n3 {\n    margin-bottom: -1rem !important;\n  }\n  .ml-xl-n3,\n  .mx-xl-n3 {\n    margin-left: -1rem !important;\n  }\n  .m-xl-n4 {\n    margin: -1.5rem !important;\n  }\n  .mt-xl-n4,\n  .my-xl-n4 {\n    margin-top: -1.5rem !important;\n  }\n  .mr-xl-n4,\n  .mx-xl-n4 {\n    margin-right: -1.5rem !important;\n  }\n  .mb-xl-n4,\n  .my-xl-n4 {\n    margin-bottom: -1.5rem !important;\n  }\n  .ml-xl-n4,\n  .mx-xl-n4 {\n    margin-left: -1.5rem !important;\n  }\n  .m-xl-n5 {\n    margin: -3rem !important;\n  }\n  .mt-xl-n5,\n  .my-xl-n5 {\n    margin-top: -3rem !important;\n  }\n  .mr-xl-n5,\n  .mx-xl-n5 {\n    margin-right: -3rem !important;\n  }\n  .mb-xl-n5,\n  .my-xl-n5 {\n    margin-bottom: -3rem !important;\n  }\n  .ml-xl-n5,\n  .mx-xl-n5 {\n    margin-left: -3rem !important;\n  }\n  .m-xl-auto {\n    margin: auto !important;\n  }\n  .mt-xl-auto,\n  .my-xl-auto {\n    margin-top: auto !important;\n  }\n  .mr-xl-auto,\n  .mx-xl-auto {\n    margin-right: auto !important;\n  }\n  .mb-xl-auto,\n  .my-xl-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-xl-auto,\n  .mx-xl-auto {\n    margin-left: auto !important;\n  }\n}\n\n.text-monospace {\n  font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !important;\n}\n\n.text-justify {\n  text-align: justify !important;\n}\n\n.text-wrap {\n  white-space: normal !important;\n}\n\n.text-nowrap {\n  white-space: nowrap !important;\n}\n\n.text-truncate {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.text-left {\n  text-align: left !important;\n}\n\n.text-right {\n  text-align: right !important;\n}\n\n.text-center {\n  text-align: center !important;\n}\n\n@media (min-width: 576px) {\n  .text-sm-left {\n    text-align: left !important;\n  }\n  .text-sm-right {\n    text-align: right !important;\n  }\n  .text-sm-center {\n    text-align: center !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .text-md-left {\n    text-align: left !important;\n  }\n  .text-md-right {\n    text-align: right !important;\n  }\n  .text-md-center {\n    text-align: center !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .text-lg-left {\n    text-align: left !important;\n  }\n  .text-lg-right {\n    text-align: right !important;\n  }\n  .text-lg-center {\n    text-align: center !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .text-xl-left {\n    text-align: left !important;\n  }\n  .text-xl-right {\n    text-align: right !important;\n  }\n  .text-xl-center {\n    text-align: center !important;\n  }\n}\n\n.text-lowercase {\n  text-transform: lowercase !important;\n}\n\n.text-uppercase {\n  text-transform: uppercase !important;\n}\n\n.text-capitalize {\n  text-transform: capitalize !important;\n}\n\n.font-weight-light {\n  font-weight: 300 !important;\n}\n\n.font-weight-lighter {\n  font-weight: lighter !important;\n}\n\n.font-weight-normal {\n  font-weight: 400 !important;\n}\n\n.font-weight-bold {\n  font-weight: 700 !important;\n}\n\n.font-weight-bolder {\n  font-weight: bolder !important;\n}\n\n.font-italic {\n  font-style: italic !important;\n}\n\n.text-white {\n  color: #fff !important;\n}\n\n.text-primary {\n  color: #007bff !important;\n}\n\na.text-primary:hover, a.text-primary:focus {\n  color: #0056b3 !important;\n}\n\n.text-secondary {\n  color: #6c757d !important;\n}\n\na.text-secondary:hover, a.text-secondary:focus {\n  color: #494f54 !important;\n}\n\n.text-success {\n  color: #28a745 !important;\n}\n\na.text-success:hover, a.text-success:focus {\n  color: #19692c !important;\n}\n\n.text-info {\n  color: #17a2b8 !important;\n}\n\na.text-info:hover, a.text-info:focus {\n  color: #0f6674 !important;\n}\n\n.text-warning {\n  color: #ffc107 !important;\n}\n\na.text-warning:hover, a.text-warning:focus {\n  color: #ba8b00 !important;\n}\n\n.text-danger {\n  color: #dc3545 !important;\n}\n\na.text-danger:hover, a.text-danger:focus {\n  color: #a71d2a !important;\n}\n\n.text-light {\n  color: #f8f9fa !important;\n}\n\na.text-light:hover, a.text-light:focus {\n  color: #cbd3da !important;\n}\n\n.text-dark {\n  color: #343a40 !important;\n}\n\na.text-dark:hover, a.text-dark:focus {\n  color: #121416 !important;\n}\n\n.text-body {\n  color: #212529 !important;\n}\n\n.text-muted {\n  color: #6c757d !important;\n}\n\n.text-black-50 {\n  color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n  color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n\n.text-decoration-none {\n  text-decoration: none !important;\n}\n\n.text-break {\n  word-break: break-word !important;\n  overflow-wrap: break-word !important;\n}\n\n.text-reset {\n  color: inherit !important;\n}\n\n.visible {\n  visibility: visible !important;\n}\n\n.invisible {\n  visibility: hidden !important;\n}\n\n@media print {\n  *,\n  *::before,\n  *::after {\n    text-shadow: none !important;\n    box-shadow: none !important;\n  }\n  a:not(.btn) {\n    text-decoration: underline;\n  }\n  abbr[title]::after {\n    content: \" (\" attr(title) \")\";\n  }\n  pre {\n    white-space: pre-wrap !important;\n  }\n  pre,\n  blockquote {\n    border: 1px solid #adb5bd;\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  @page {\n    size: a3;\n  }\n  body {\n    min-width: 992px !important;\n  }\n  .container {\n    min-width: 992px !important;\n  }\n  .navbar {\n    display: none;\n  }\n  .badge {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #dee2e6 !important;\n  }\n  .table-dark {\n    color: inherit;\n  }\n  .table-dark th,\n  .table-dark td,\n  .table-dark thead th,\n  .table-dark tbody + tbody {\n    border-color: #dee2e6;\n  }\n  .table .thead-dark th {\n    color: inherit;\n    border-color: #dee2e6;\n  }\n}\n/*# sourceMappingURL=bootstrap.css.map */"
  },
  {
    "path": "easyflow-flow-bpmn/static/plugins/bootstrap/js/bootstrap.bundle.js",
    "content": "/*!\n  * Bootstrap v4.3.1 (https://getbootstrap.com/)\n  * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jquery')) :\n  typeof define === 'function' && define.amd ? define(['exports', 'jquery'], factory) :\n  (global = global || self, factory(global.bootstrap = {}, global.jQuery));\n}(this, function (exports, $) { 'use strict';\n\n  $ = $ && $.hasOwnProperty('default') ? $['default'] : $;\n\n  function _defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  function _createClass(Constructor, protoProps, staticProps) {\n    if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) _defineProperties(Constructor, staticProps);\n    return Constructor;\n  }\n\n  function _defineProperty(obj, key, value) {\n    if (key in obj) {\n      Object.defineProperty(obj, key, {\n        value: value,\n        enumerable: true,\n        configurable: true,\n        writable: true\n      });\n    } else {\n      obj[key] = value;\n    }\n\n    return obj;\n  }\n\n  function _objectSpread(target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i] != null ? arguments[i] : {};\n      var ownKeys = Object.keys(source);\n\n      if (typeof Object.getOwnPropertySymbols === 'function') {\n        ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {\n          return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n        }));\n      }\n\n      ownKeys.forEach(function (key) {\n        _defineProperty(target, key, source[key]);\n      });\n    }\n\n    return target;\n  }\n\n  function _inheritsLoose(subClass, superClass) {\n    subClass.prototype = Object.create(superClass.prototype);\n    subClass.prototype.constructor = subClass;\n    subClass.__proto__ = superClass;\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.3.1): util.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Private TransitionEnd Helpers\n   * ------------------------------------------------------------------------\n   */\n\n  var TRANSITION_END = 'transitionend';\n  var MAX_UID = 1000000;\n  var MILLISECONDS_MULTIPLIER = 1000; // Shoutout AngusCroll (https://goo.gl/pxwQGp)\n\n  function toType(obj) {\n    return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase();\n  }\n\n  function getSpecialTransitionEndEvent() {\n    return {\n      bindType: TRANSITION_END,\n      delegateType: TRANSITION_END,\n      handle: function handle(event) {\n        if ($(event.target).is(this)) {\n          return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params\n        }\n\n        return undefined; // eslint-disable-line no-undefined\n      }\n    };\n  }\n\n  function transitionEndEmulator(duration) {\n    var _this = this;\n\n    var called = false;\n    $(this).one(Util.TRANSITION_END, function () {\n      called = true;\n    });\n    setTimeout(function () {\n      if (!called) {\n        Util.triggerTransitionEnd(_this);\n      }\n    }, duration);\n    return this;\n  }\n\n  function setTransitionEndSupport() {\n    $.fn.emulateTransitionEnd = transitionEndEmulator;\n    $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();\n  }\n  /**\n   * --------------------------------------------------------------------------\n   * Public Util Api\n   * --------------------------------------------------------------------------\n   */\n\n\n  var Util = {\n    TRANSITION_END: 'bsTransitionEnd',\n    getUID: function getUID(prefix) {\n      do {\n        // eslint-disable-next-line no-bitwise\n        prefix += ~~(Math.random() * MAX_UID); // \"~~\" acts like a faster Math.floor() here\n      } while (document.getElementById(prefix));\n\n      return prefix;\n    },\n    getSelectorFromElement: function getSelectorFromElement(element) {\n      var selector = element.getAttribute('data-target');\n\n      if (!selector || selector === '#') {\n        var hrefAttr = element.getAttribute('href');\n        selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : '';\n      }\n\n      try {\n        return document.querySelector(selector) ? selector : null;\n      } catch (err) {\n        return null;\n      }\n    },\n    getTransitionDurationFromElement: function getTransitionDurationFromElement(element) {\n      if (!element) {\n        return 0;\n      } // Get transition-duration of the element\n\n\n      var transitionDuration = $(element).css('transition-duration');\n      var transitionDelay = $(element).css('transition-delay');\n      var floatTransitionDuration = parseFloat(transitionDuration);\n      var floatTransitionDelay = parseFloat(transitionDelay); // Return 0 if element or transition duration is not found\n\n      if (!floatTransitionDuration && !floatTransitionDelay) {\n        return 0;\n      } // If multiple durations are defined, take the first\n\n\n      transitionDuration = transitionDuration.split(',')[0];\n      transitionDelay = transitionDelay.split(',')[0];\n      return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;\n    },\n    reflow: function reflow(element) {\n      return element.offsetHeight;\n    },\n    triggerTransitionEnd: function triggerTransitionEnd(element) {\n      $(element).trigger(TRANSITION_END);\n    },\n    // TODO: Remove in v5\n    supportsTransitionEnd: function supportsTransitionEnd() {\n      return Boolean(TRANSITION_END);\n    },\n    isElement: function isElement(obj) {\n      return (obj[0] || obj).nodeType;\n    },\n    typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {\n      for (var property in configTypes) {\n        if (Object.prototype.hasOwnProperty.call(configTypes, property)) {\n          var expectedTypes = configTypes[property];\n          var value = config[property];\n          var valueType = value && Util.isElement(value) ? 'element' : toType(value);\n\n          if (!new RegExp(expectedTypes).test(valueType)) {\n            throw new Error(componentName.toUpperCase() + \": \" + (\"Option \\\"\" + property + \"\\\" provided type \\\"\" + valueType + \"\\\" \") + (\"but expected type \\\"\" + expectedTypes + \"\\\".\"));\n          }\n        }\n      }\n    },\n    findShadowRoot: function findShadowRoot(element) {\n      if (!document.documentElement.attachShadow) {\n        return null;\n      } // Can find the shadow root otherwise it'll return the document\n\n\n      if (typeof element.getRootNode === 'function') {\n        var root = element.getRootNode();\n        return root instanceof ShadowRoot ? root : null;\n      }\n\n      if (element instanceof ShadowRoot) {\n        return element;\n      } // when we don't find a shadow root\n\n\n      if (!element.parentNode) {\n        return null;\n      }\n\n      return Util.findShadowRoot(element.parentNode);\n    }\n  };\n  setTransitionEndSupport();\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME = 'alert';\n  var VERSION = '4.3.1';\n  var DATA_KEY = 'bs.alert';\n  var EVENT_KEY = \".\" + DATA_KEY;\n  var DATA_API_KEY = '.data-api';\n  var JQUERY_NO_CONFLICT = $.fn[NAME];\n  var Selector = {\n    DISMISS: '[data-dismiss=\"alert\"]'\n  };\n  var Event = {\n    CLOSE: \"close\" + EVENT_KEY,\n    CLOSED: \"closed\" + EVENT_KEY,\n    CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY\n  };\n  var ClassName = {\n    ALERT: 'alert',\n    FADE: 'fade',\n    SHOW: 'show'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Alert =\n  /*#__PURE__*/\n  function () {\n    function Alert(element) {\n      this._element = element;\n    } // Getters\n\n\n    var _proto = Alert.prototype;\n\n    // Public\n    _proto.close = function close(element) {\n      var rootElement = this._element;\n\n      if (element) {\n        rootElement = this._getRootElement(element);\n      }\n\n      var customEvent = this._triggerCloseEvent(rootElement);\n\n      if (customEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      this._removeElement(rootElement);\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY);\n      this._element = null;\n    } // Private\n    ;\n\n    _proto._getRootElement = function _getRootElement(element) {\n      var selector = Util.getSelectorFromElement(element);\n      var parent = false;\n\n      if (selector) {\n        parent = document.querySelector(selector);\n      }\n\n      if (!parent) {\n        parent = $(element).closest(\".\" + ClassName.ALERT)[0];\n      }\n\n      return parent;\n    };\n\n    _proto._triggerCloseEvent = function _triggerCloseEvent(element) {\n      var closeEvent = $.Event(Event.CLOSE);\n      $(element).trigger(closeEvent);\n      return closeEvent;\n    };\n\n    _proto._removeElement = function _removeElement(element) {\n      var _this = this;\n\n      $(element).removeClass(ClassName.SHOW);\n\n      if (!$(element).hasClass(ClassName.FADE)) {\n        this._destroyElement(element);\n\n        return;\n      }\n\n      var transitionDuration = Util.getTransitionDurationFromElement(element);\n      $(element).one(Util.TRANSITION_END, function (event) {\n        return _this._destroyElement(element, event);\n      }).emulateTransitionEnd(transitionDuration);\n    };\n\n    _proto._destroyElement = function _destroyElement(element) {\n      $(element).detach().trigger(Event.CLOSED).remove();\n    } // Static\n    ;\n\n    Alert._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $element = $(this);\n        var data = $element.data(DATA_KEY);\n\n        if (!data) {\n          data = new Alert(this);\n          $element.data(DATA_KEY, data);\n        }\n\n        if (config === 'close') {\n          data[config](this);\n        }\n      });\n    };\n\n    Alert._handleDismiss = function _handleDismiss(alertInstance) {\n      return function (event) {\n        if (event) {\n          event.preventDefault();\n        }\n\n        alertInstance.close(this);\n      };\n    };\n\n    _createClass(Alert, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION;\n      }\n    }]);\n\n    return Alert;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert()));\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME] = Alert._jQueryInterface;\n  $.fn[NAME].Constructor = Alert;\n\n  $.fn[NAME].noConflict = function () {\n    $.fn[NAME] = JQUERY_NO_CONFLICT;\n    return Alert._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$1 = 'button';\n  var VERSION$1 = '4.3.1';\n  var DATA_KEY$1 = 'bs.button';\n  var EVENT_KEY$1 = \".\" + DATA_KEY$1;\n  var DATA_API_KEY$1 = '.data-api';\n  var JQUERY_NO_CONFLICT$1 = $.fn[NAME$1];\n  var ClassName$1 = {\n    ACTIVE: 'active',\n    BUTTON: 'btn',\n    FOCUS: 'focus'\n  };\n  var Selector$1 = {\n    DATA_TOGGLE_CARROT: '[data-toggle^=\"button\"]',\n    DATA_TOGGLE: '[data-toggle=\"buttons\"]',\n    INPUT: 'input:not([type=\"hidden\"])',\n    ACTIVE: '.active',\n    BUTTON: '.btn'\n  };\n  var Event$1 = {\n    CLICK_DATA_API: \"click\" + EVENT_KEY$1 + DATA_API_KEY$1,\n    FOCUS_BLUR_DATA_API: \"focus\" + EVENT_KEY$1 + DATA_API_KEY$1 + \" \" + (\"blur\" + EVENT_KEY$1 + DATA_API_KEY$1)\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Button =\n  /*#__PURE__*/\n  function () {\n    function Button(element) {\n      this._element = element;\n    } // Getters\n\n\n    var _proto = Button.prototype;\n\n    // Public\n    _proto.toggle = function toggle() {\n      var triggerChangeEvent = true;\n      var addAriaPressed = true;\n      var rootElement = $(this._element).closest(Selector$1.DATA_TOGGLE)[0];\n\n      if (rootElement) {\n        var input = this._element.querySelector(Selector$1.INPUT);\n\n        if (input) {\n          if (input.type === 'radio') {\n            if (input.checked && this._element.classList.contains(ClassName$1.ACTIVE)) {\n              triggerChangeEvent = false;\n            } else {\n              var activeElement = rootElement.querySelector(Selector$1.ACTIVE);\n\n              if (activeElement) {\n                $(activeElement).removeClass(ClassName$1.ACTIVE);\n              }\n            }\n          }\n\n          if (triggerChangeEvent) {\n            if (input.hasAttribute('disabled') || rootElement.hasAttribute('disabled') || input.classList.contains('disabled') || rootElement.classList.contains('disabled')) {\n              return;\n            }\n\n            input.checked = !this._element.classList.contains(ClassName$1.ACTIVE);\n            $(input).trigger('change');\n          }\n\n          input.focus();\n          addAriaPressed = false;\n        }\n      }\n\n      if (addAriaPressed) {\n        this._element.setAttribute('aria-pressed', !this._element.classList.contains(ClassName$1.ACTIVE));\n      }\n\n      if (triggerChangeEvent) {\n        $(this._element).toggleClass(ClassName$1.ACTIVE);\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$1);\n      this._element = null;\n    } // Static\n    ;\n\n    Button._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$1);\n\n        if (!data) {\n          data = new Button(this);\n          $(this).data(DATA_KEY$1, data);\n        }\n\n        if (config === 'toggle') {\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Button, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$1;\n      }\n    }]);\n\n    return Button;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$1.CLICK_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {\n    event.preventDefault();\n    var button = event.target;\n\n    if (!$(button).hasClass(ClassName$1.BUTTON)) {\n      button = $(button).closest(Selector$1.BUTTON);\n    }\n\n    Button._jQueryInterface.call($(button), 'toggle');\n  }).on(Event$1.FOCUS_BLUR_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {\n    var button = $(event.target).closest(Selector$1.BUTTON)[0];\n    $(button).toggleClass(ClassName$1.FOCUS, /^focus(in)?$/.test(event.type));\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$1] = Button._jQueryInterface;\n  $.fn[NAME$1].Constructor = Button;\n\n  $.fn[NAME$1].noConflict = function () {\n    $.fn[NAME$1] = JQUERY_NO_CONFLICT$1;\n    return Button._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$2 = 'carousel';\n  var VERSION$2 = '4.3.1';\n  var DATA_KEY$2 = 'bs.carousel';\n  var EVENT_KEY$2 = \".\" + DATA_KEY$2;\n  var DATA_API_KEY$2 = '.data-api';\n  var JQUERY_NO_CONFLICT$2 = $.fn[NAME$2];\n  var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key\n\n  var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key\n\n  var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\n\n  var SWIPE_THRESHOLD = 40;\n  var Default = {\n    interval: 5000,\n    keyboard: true,\n    slide: false,\n    pause: 'hover',\n    wrap: true,\n    touch: true\n  };\n  var DefaultType = {\n    interval: '(number|boolean)',\n    keyboard: 'boolean',\n    slide: '(boolean|string)',\n    pause: '(string|boolean)',\n    wrap: 'boolean',\n    touch: 'boolean'\n  };\n  var Direction = {\n    NEXT: 'next',\n    PREV: 'prev',\n    LEFT: 'left',\n    RIGHT: 'right'\n  };\n  var Event$2 = {\n    SLIDE: \"slide\" + EVENT_KEY$2,\n    SLID: \"slid\" + EVENT_KEY$2,\n    KEYDOWN: \"keydown\" + EVENT_KEY$2,\n    MOUSEENTER: \"mouseenter\" + EVENT_KEY$2,\n    MOUSELEAVE: \"mouseleave\" + EVENT_KEY$2,\n    TOUCHSTART: \"touchstart\" + EVENT_KEY$2,\n    TOUCHMOVE: \"touchmove\" + EVENT_KEY$2,\n    TOUCHEND: \"touchend\" + EVENT_KEY$2,\n    POINTERDOWN: \"pointerdown\" + EVENT_KEY$2,\n    POINTERUP: \"pointerup\" + EVENT_KEY$2,\n    DRAG_START: \"dragstart\" + EVENT_KEY$2,\n    LOAD_DATA_API: \"load\" + EVENT_KEY$2 + DATA_API_KEY$2,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$2 + DATA_API_KEY$2\n  };\n  var ClassName$2 = {\n    CAROUSEL: 'carousel',\n    ACTIVE: 'active',\n    SLIDE: 'slide',\n    RIGHT: 'carousel-item-right',\n    LEFT: 'carousel-item-left',\n    NEXT: 'carousel-item-next',\n    PREV: 'carousel-item-prev',\n    ITEM: 'carousel-item',\n    POINTER_EVENT: 'pointer-event'\n  };\n  var Selector$2 = {\n    ACTIVE: '.active',\n    ACTIVE_ITEM: '.active.carousel-item',\n    ITEM: '.carousel-item',\n    ITEM_IMG: '.carousel-item img',\n    NEXT_PREV: '.carousel-item-next, .carousel-item-prev',\n    INDICATORS: '.carousel-indicators',\n    DATA_SLIDE: '[data-slide], [data-slide-to]',\n    DATA_RIDE: '[data-ride=\"carousel\"]'\n  };\n  var PointerType = {\n    TOUCH: 'touch',\n    PEN: 'pen'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Carousel =\n  /*#__PURE__*/\n  function () {\n    function Carousel(element, config) {\n      this._items = null;\n      this._interval = null;\n      this._activeElement = null;\n      this._isPaused = false;\n      this._isSliding = false;\n      this.touchTimeout = null;\n      this.touchStartX = 0;\n      this.touchDeltaX = 0;\n      this._config = this._getConfig(config);\n      this._element = element;\n      this._indicatorsElement = this._element.querySelector(Selector$2.INDICATORS);\n      this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;\n      this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent);\n\n      this._addEventListeners();\n    } // Getters\n\n\n    var _proto = Carousel.prototype;\n\n    // Public\n    _proto.next = function next() {\n      if (!this._isSliding) {\n        this._slide(Direction.NEXT);\n      }\n    };\n\n    _proto.nextWhenVisible = function nextWhenVisible() {\n      // Don't call next when the page isn't visible\n      // or the carousel or its parent isn't visible\n      if (!document.hidden && $(this._element).is(':visible') && $(this._element).css('visibility') !== 'hidden') {\n        this.next();\n      }\n    };\n\n    _proto.prev = function prev() {\n      if (!this._isSliding) {\n        this._slide(Direction.PREV);\n      }\n    };\n\n    _proto.pause = function pause(event) {\n      if (!event) {\n        this._isPaused = true;\n      }\n\n      if (this._element.querySelector(Selector$2.NEXT_PREV)) {\n        Util.triggerTransitionEnd(this._element);\n        this.cycle(true);\n      }\n\n      clearInterval(this._interval);\n      this._interval = null;\n    };\n\n    _proto.cycle = function cycle(event) {\n      if (!event) {\n        this._isPaused = false;\n      }\n\n      if (this._interval) {\n        clearInterval(this._interval);\n        this._interval = null;\n      }\n\n      if (this._config.interval && !this._isPaused) {\n        this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);\n      }\n    };\n\n    _proto.to = function to(index) {\n      var _this = this;\n\n      this._activeElement = this._element.querySelector(Selector$2.ACTIVE_ITEM);\n\n      var activeIndex = this._getItemIndex(this._activeElement);\n\n      if (index > this._items.length - 1 || index < 0) {\n        return;\n      }\n\n      if (this._isSliding) {\n        $(this._element).one(Event$2.SLID, function () {\n          return _this.to(index);\n        });\n        return;\n      }\n\n      if (activeIndex === index) {\n        this.pause();\n        this.cycle();\n        return;\n      }\n\n      var direction = index > activeIndex ? Direction.NEXT : Direction.PREV;\n\n      this._slide(direction, this._items[index]);\n    };\n\n    _proto.dispose = function dispose() {\n      $(this._element).off(EVENT_KEY$2);\n      $.removeData(this._element, DATA_KEY$2);\n      this._items = null;\n      this._config = null;\n      this._element = null;\n      this._interval = null;\n      this._isPaused = null;\n      this._isSliding = null;\n      this._activeElement = null;\n      this._indicatorsElement = null;\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default, config);\n      Util.typeCheckConfig(NAME$2, config, DefaultType);\n      return config;\n    };\n\n    _proto._handleSwipe = function _handleSwipe() {\n      var absDeltax = Math.abs(this.touchDeltaX);\n\n      if (absDeltax <= SWIPE_THRESHOLD) {\n        return;\n      }\n\n      var direction = absDeltax / this.touchDeltaX; // swipe left\n\n      if (direction > 0) {\n        this.prev();\n      } // swipe right\n\n\n      if (direction < 0) {\n        this.next();\n      }\n    };\n\n    _proto._addEventListeners = function _addEventListeners() {\n      var _this2 = this;\n\n      if (this._config.keyboard) {\n        $(this._element).on(Event$2.KEYDOWN, function (event) {\n          return _this2._keydown(event);\n        });\n      }\n\n      if (this._config.pause === 'hover') {\n        $(this._element).on(Event$2.MOUSEENTER, function (event) {\n          return _this2.pause(event);\n        }).on(Event$2.MOUSELEAVE, function (event) {\n          return _this2.cycle(event);\n        });\n      }\n\n      if (this._config.touch) {\n        this._addTouchEventListeners();\n      }\n    };\n\n    _proto._addTouchEventListeners = function _addTouchEventListeners() {\n      var _this3 = this;\n\n      if (!this._touchSupported) {\n        return;\n      }\n\n      var start = function start(event) {\n        if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n          _this3.touchStartX = event.originalEvent.clientX;\n        } else if (!_this3._pointerEvent) {\n          _this3.touchStartX = event.originalEvent.touches[0].clientX;\n        }\n      };\n\n      var move = function move(event) {\n        // ensure swiping with one touch and not pinching\n        if (event.originalEvent.touches && event.originalEvent.touches.length > 1) {\n          _this3.touchDeltaX = 0;\n        } else {\n          _this3.touchDeltaX = event.originalEvent.touches[0].clientX - _this3.touchStartX;\n        }\n      };\n\n      var end = function end(event) {\n        if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n          _this3.touchDeltaX = event.originalEvent.clientX - _this3.touchStartX;\n        }\n\n        _this3._handleSwipe();\n\n        if (_this3._config.pause === 'hover') {\n          // If it's a touch-enabled device, mouseenter/leave are fired as\n          // part of the mouse compatibility events on first tap - the carousel\n          // would stop cycling until user tapped out of it;\n          // here, we listen for touchend, explicitly pause the carousel\n          // (as if it's the second time we tap on it, mouseenter compat event\n          // is NOT fired) and after a timeout (to allow for mouse compatibility\n          // events to fire) we explicitly restart cycling\n          _this3.pause();\n\n          if (_this3.touchTimeout) {\n            clearTimeout(_this3.touchTimeout);\n          }\n\n          _this3.touchTimeout = setTimeout(function (event) {\n            return _this3.cycle(event);\n          }, TOUCHEVENT_COMPAT_WAIT + _this3._config.interval);\n        }\n      };\n\n      $(this._element.querySelectorAll(Selector$2.ITEM_IMG)).on(Event$2.DRAG_START, function (e) {\n        return e.preventDefault();\n      });\n\n      if (this._pointerEvent) {\n        $(this._element).on(Event$2.POINTERDOWN, function (event) {\n          return start(event);\n        });\n        $(this._element).on(Event$2.POINTERUP, function (event) {\n          return end(event);\n        });\n\n        this._element.classList.add(ClassName$2.POINTER_EVENT);\n      } else {\n        $(this._element).on(Event$2.TOUCHSTART, function (event) {\n          return start(event);\n        });\n        $(this._element).on(Event$2.TOUCHMOVE, function (event) {\n          return move(event);\n        });\n        $(this._element).on(Event$2.TOUCHEND, function (event) {\n          return end(event);\n        });\n      }\n    };\n\n    _proto._keydown = function _keydown(event) {\n      if (/input|textarea/i.test(event.target.tagName)) {\n        return;\n      }\n\n      switch (event.which) {\n        case ARROW_LEFT_KEYCODE:\n          event.preventDefault();\n          this.prev();\n          break;\n\n        case ARROW_RIGHT_KEYCODE:\n          event.preventDefault();\n          this.next();\n          break;\n\n        default:\n      }\n    };\n\n    _proto._getItemIndex = function _getItemIndex(element) {\n      this._items = element && element.parentNode ? [].slice.call(element.parentNode.querySelectorAll(Selector$2.ITEM)) : [];\n      return this._items.indexOf(element);\n    };\n\n    _proto._getItemByDirection = function _getItemByDirection(direction, activeElement) {\n      var isNextDirection = direction === Direction.NEXT;\n      var isPrevDirection = direction === Direction.PREV;\n\n      var activeIndex = this._getItemIndex(activeElement);\n\n      var lastItemIndex = this._items.length - 1;\n      var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex;\n\n      if (isGoingToWrap && !this._config.wrap) {\n        return activeElement;\n      }\n\n      var delta = direction === Direction.PREV ? -1 : 1;\n      var itemIndex = (activeIndex + delta) % this._items.length;\n      return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];\n    };\n\n    _proto._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) {\n      var targetIndex = this._getItemIndex(relatedTarget);\n\n      var fromIndex = this._getItemIndex(this._element.querySelector(Selector$2.ACTIVE_ITEM));\n\n      var slideEvent = $.Event(Event$2.SLIDE, {\n        relatedTarget: relatedTarget,\n        direction: eventDirectionName,\n        from: fromIndex,\n        to: targetIndex\n      });\n      $(this._element).trigger(slideEvent);\n      return slideEvent;\n    };\n\n    _proto._setActiveIndicatorElement = function _setActiveIndicatorElement(element) {\n      if (this._indicatorsElement) {\n        var indicators = [].slice.call(this._indicatorsElement.querySelectorAll(Selector$2.ACTIVE));\n        $(indicators).removeClass(ClassName$2.ACTIVE);\n\n        var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)];\n\n        if (nextIndicator) {\n          $(nextIndicator).addClass(ClassName$2.ACTIVE);\n        }\n      }\n    };\n\n    _proto._slide = function _slide(direction, element) {\n      var _this4 = this;\n\n      var activeElement = this._element.querySelector(Selector$2.ACTIVE_ITEM);\n\n      var activeElementIndex = this._getItemIndex(activeElement);\n\n      var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement);\n\n      var nextElementIndex = this._getItemIndex(nextElement);\n\n      var isCycling = Boolean(this._interval);\n      var directionalClassName;\n      var orderClassName;\n      var eventDirectionName;\n\n      if (direction === Direction.NEXT) {\n        directionalClassName = ClassName$2.LEFT;\n        orderClassName = ClassName$2.NEXT;\n        eventDirectionName = Direction.LEFT;\n      } else {\n        directionalClassName = ClassName$2.RIGHT;\n        orderClassName = ClassName$2.PREV;\n        eventDirectionName = Direction.RIGHT;\n      }\n\n      if (nextElement && $(nextElement).hasClass(ClassName$2.ACTIVE)) {\n        this._isSliding = false;\n        return;\n      }\n\n      var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);\n\n      if (slideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      if (!activeElement || !nextElement) {\n        // Some weirdness is happening, so we bail\n        return;\n      }\n\n      this._isSliding = true;\n\n      if (isCycling) {\n        this.pause();\n      }\n\n      this._setActiveIndicatorElement(nextElement);\n\n      var slidEvent = $.Event(Event$2.SLID, {\n        relatedTarget: nextElement,\n        direction: eventDirectionName,\n        from: activeElementIndex,\n        to: nextElementIndex\n      });\n\n      if ($(this._element).hasClass(ClassName$2.SLIDE)) {\n        $(nextElement).addClass(orderClassName);\n        Util.reflow(nextElement);\n        $(activeElement).addClass(directionalClassName);\n        $(nextElement).addClass(directionalClassName);\n        var nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10);\n\n        if (nextElementInterval) {\n          this._config.defaultInterval = this._config.defaultInterval || this._config.interval;\n          this._config.interval = nextElementInterval;\n        } else {\n          this._config.interval = this._config.defaultInterval || this._config.interval;\n        }\n\n        var transitionDuration = Util.getTransitionDurationFromElement(activeElement);\n        $(activeElement).one(Util.TRANSITION_END, function () {\n          $(nextElement).removeClass(directionalClassName + \" \" + orderClassName).addClass(ClassName$2.ACTIVE);\n          $(activeElement).removeClass(ClassName$2.ACTIVE + \" \" + orderClassName + \" \" + directionalClassName);\n          _this4._isSliding = false;\n          setTimeout(function () {\n            return $(_this4._element).trigger(slidEvent);\n          }, 0);\n        }).emulateTransitionEnd(transitionDuration);\n      } else {\n        $(activeElement).removeClass(ClassName$2.ACTIVE);\n        $(nextElement).addClass(ClassName$2.ACTIVE);\n        this._isSliding = false;\n        $(this._element).trigger(slidEvent);\n      }\n\n      if (isCycling) {\n        this.cycle();\n      }\n    } // Static\n    ;\n\n    Carousel._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$2);\n\n        var _config = _objectSpread({}, Default, $(this).data());\n\n        if (typeof config === 'object') {\n          _config = _objectSpread({}, _config, config);\n        }\n\n        var action = typeof config === 'string' ? config : _config.slide;\n\n        if (!data) {\n          data = new Carousel(this, _config);\n          $(this).data(DATA_KEY$2, data);\n        }\n\n        if (typeof config === 'number') {\n          data.to(config);\n        } else if (typeof action === 'string') {\n          if (typeof data[action] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + action + \"\\\"\");\n          }\n\n          data[action]();\n        } else if (_config.interval && _config.ride) {\n          data.pause();\n          data.cycle();\n        }\n      });\n    };\n\n    Carousel._dataApiClickHandler = function _dataApiClickHandler(event) {\n      var selector = Util.getSelectorFromElement(this);\n\n      if (!selector) {\n        return;\n      }\n\n      var target = $(selector)[0];\n\n      if (!target || !$(target).hasClass(ClassName$2.CAROUSEL)) {\n        return;\n      }\n\n      var config = _objectSpread({}, $(target).data(), $(this).data());\n\n      var slideIndex = this.getAttribute('data-slide-to');\n\n      if (slideIndex) {\n        config.interval = false;\n      }\n\n      Carousel._jQueryInterface.call($(target), config);\n\n      if (slideIndex) {\n        $(target).data(DATA_KEY$2).to(slideIndex);\n      }\n\n      event.preventDefault();\n    };\n\n    _createClass(Carousel, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$2;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default;\n      }\n    }]);\n\n    return Carousel;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$2.CLICK_DATA_API, Selector$2.DATA_SLIDE, Carousel._dataApiClickHandler);\n  $(window).on(Event$2.LOAD_DATA_API, function () {\n    var carousels = [].slice.call(document.querySelectorAll(Selector$2.DATA_RIDE));\n\n    for (var i = 0, len = carousels.length; i < len; i++) {\n      var $carousel = $(carousels[i]);\n\n      Carousel._jQueryInterface.call($carousel, $carousel.data());\n    }\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$2] = Carousel._jQueryInterface;\n  $.fn[NAME$2].Constructor = Carousel;\n\n  $.fn[NAME$2].noConflict = function () {\n    $.fn[NAME$2] = JQUERY_NO_CONFLICT$2;\n    return Carousel._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$3 = 'collapse';\n  var VERSION$3 = '4.3.1';\n  var DATA_KEY$3 = 'bs.collapse';\n  var EVENT_KEY$3 = \".\" + DATA_KEY$3;\n  var DATA_API_KEY$3 = '.data-api';\n  var JQUERY_NO_CONFLICT$3 = $.fn[NAME$3];\n  var Default$1 = {\n    toggle: true,\n    parent: ''\n  };\n  var DefaultType$1 = {\n    toggle: 'boolean',\n    parent: '(string|element)'\n  };\n  var Event$3 = {\n    SHOW: \"show\" + EVENT_KEY$3,\n    SHOWN: \"shown\" + EVENT_KEY$3,\n    HIDE: \"hide\" + EVENT_KEY$3,\n    HIDDEN: \"hidden\" + EVENT_KEY$3,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$3 + DATA_API_KEY$3\n  };\n  var ClassName$3 = {\n    SHOW: 'show',\n    COLLAPSE: 'collapse',\n    COLLAPSING: 'collapsing',\n    COLLAPSED: 'collapsed'\n  };\n  var Dimension = {\n    WIDTH: 'width',\n    HEIGHT: 'height'\n  };\n  var Selector$3 = {\n    ACTIVES: '.show, .collapsing',\n    DATA_TOGGLE: '[data-toggle=\"collapse\"]'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Collapse =\n  /*#__PURE__*/\n  function () {\n    function Collapse(element, config) {\n      this._isTransitioning = false;\n      this._element = element;\n      this._config = this._getConfig(config);\n      this._triggerArray = [].slice.call(document.querySelectorAll(\"[data-toggle=\\\"collapse\\\"][href=\\\"#\" + element.id + \"\\\"],\" + (\"[data-toggle=\\\"collapse\\\"][data-target=\\\"#\" + element.id + \"\\\"]\")));\n      var toggleList = [].slice.call(document.querySelectorAll(Selector$3.DATA_TOGGLE));\n\n      for (var i = 0, len = toggleList.length; i < len; i++) {\n        var elem = toggleList[i];\n        var selector = Util.getSelectorFromElement(elem);\n        var filterElement = [].slice.call(document.querySelectorAll(selector)).filter(function (foundElem) {\n          return foundElem === element;\n        });\n\n        if (selector !== null && filterElement.length > 0) {\n          this._selector = selector;\n\n          this._triggerArray.push(elem);\n        }\n      }\n\n      this._parent = this._config.parent ? this._getParent() : null;\n\n      if (!this._config.parent) {\n        this._addAriaAndCollapsedClass(this._element, this._triggerArray);\n      }\n\n      if (this._config.toggle) {\n        this.toggle();\n      }\n    } // Getters\n\n\n    var _proto = Collapse.prototype;\n\n    // Public\n    _proto.toggle = function toggle() {\n      if ($(this._element).hasClass(ClassName$3.SHOW)) {\n        this.hide();\n      } else {\n        this.show();\n      }\n    };\n\n    _proto.show = function show() {\n      var _this = this;\n\n      if (this._isTransitioning || $(this._element).hasClass(ClassName$3.SHOW)) {\n        return;\n      }\n\n      var actives;\n      var activesData;\n\n      if (this._parent) {\n        actives = [].slice.call(this._parent.querySelectorAll(Selector$3.ACTIVES)).filter(function (elem) {\n          if (typeof _this._config.parent === 'string') {\n            return elem.getAttribute('data-parent') === _this._config.parent;\n          }\n\n          return elem.classList.contains(ClassName$3.COLLAPSE);\n        });\n\n        if (actives.length === 0) {\n          actives = null;\n        }\n      }\n\n      if (actives) {\n        activesData = $(actives).not(this._selector).data(DATA_KEY$3);\n\n        if (activesData && activesData._isTransitioning) {\n          return;\n        }\n      }\n\n      var startEvent = $.Event(Event$3.SHOW);\n      $(this._element).trigger(startEvent);\n\n      if (startEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      if (actives) {\n        Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide');\n\n        if (!activesData) {\n          $(actives).data(DATA_KEY$3, null);\n        }\n      }\n\n      var dimension = this._getDimension();\n\n      $(this._element).removeClass(ClassName$3.COLLAPSE).addClass(ClassName$3.COLLAPSING);\n      this._element.style[dimension] = 0;\n\n      if (this._triggerArray.length) {\n        $(this._triggerArray).removeClass(ClassName$3.COLLAPSED).attr('aria-expanded', true);\n      }\n\n      this.setTransitioning(true);\n\n      var complete = function complete() {\n        $(_this._element).removeClass(ClassName$3.COLLAPSING).addClass(ClassName$3.COLLAPSE).addClass(ClassName$3.SHOW);\n        _this._element.style[dimension] = '';\n\n        _this.setTransitioning(false);\n\n        $(_this._element).trigger(Event$3.SHOWN);\n      };\n\n      var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\n      var scrollSize = \"scroll\" + capitalizedDimension;\n      var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n      $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      this._element.style[dimension] = this._element[scrollSize] + \"px\";\n    };\n\n    _proto.hide = function hide() {\n      var _this2 = this;\n\n      if (this._isTransitioning || !$(this._element).hasClass(ClassName$3.SHOW)) {\n        return;\n      }\n\n      var startEvent = $.Event(Event$3.HIDE);\n      $(this._element).trigger(startEvent);\n\n      if (startEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      var dimension = this._getDimension();\n\n      this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + \"px\";\n      Util.reflow(this._element);\n      $(this._element).addClass(ClassName$3.COLLAPSING).removeClass(ClassName$3.COLLAPSE).removeClass(ClassName$3.SHOW);\n      var triggerArrayLength = this._triggerArray.length;\n\n      if (triggerArrayLength > 0) {\n        for (var i = 0; i < triggerArrayLength; i++) {\n          var trigger = this._triggerArray[i];\n          var selector = Util.getSelectorFromElement(trigger);\n\n          if (selector !== null) {\n            var $elem = $([].slice.call(document.querySelectorAll(selector)));\n\n            if (!$elem.hasClass(ClassName$3.SHOW)) {\n              $(trigger).addClass(ClassName$3.COLLAPSED).attr('aria-expanded', false);\n            }\n          }\n        }\n      }\n\n      this.setTransitioning(true);\n\n      var complete = function complete() {\n        _this2.setTransitioning(false);\n\n        $(_this2._element).removeClass(ClassName$3.COLLAPSING).addClass(ClassName$3.COLLAPSE).trigger(Event$3.HIDDEN);\n      };\n\n      this._element.style[dimension] = '';\n      var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n      $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n    };\n\n    _proto.setTransitioning = function setTransitioning(isTransitioning) {\n      this._isTransitioning = isTransitioning;\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$3);\n      this._config = null;\n      this._parent = null;\n      this._element = null;\n      this._triggerArray = null;\n      this._isTransitioning = null;\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default$1, config);\n      config.toggle = Boolean(config.toggle); // Coerce string values\n\n      Util.typeCheckConfig(NAME$3, config, DefaultType$1);\n      return config;\n    };\n\n    _proto._getDimension = function _getDimension() {\n      var hasWidth = $(this._element).hasClass(Dimension.WIDTH);\n      return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;\n    };\n\n    _proto._getParent = function _getParent() {\n      var _this3 = this;\n\n      var parent;\n\n      if (Util.isElement(this._config.parent)) {\n        parent = this._config.parent; // It's a jQuery object\n\n        if (typeof this._config.parent.jquery !== 'undefined') {\n          parent = this._config.parent[0];\n        }\n      } else {\n        parent = document.querySelector(this._config.parent);\n      }\n\n      var selector = \"[data-toggle=\\\"collapse\\\"][data-parent=\\\"\" + this._config.parent + \"\\\"]\";\n      var children = [].slice.call(parent.querySelectorAll(selector));\n      $(children).each(function (i, element) {\n        _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);\n      });\n      return parent;\n    };\n\n    _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {\n      var isOpen = $(element).hasClass(ClassName$3.SHOW);\n\n      if (triggerArray.length) {\n        $(triggerArray).toggleClass(ClassName$3.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);\n      }\n    } // Static\n    ;\n\n    Collapse._getTargetFromElement = function _getTargetFromElement(element) {\n      var selector = Util.getSelectorFromElement(element);\n      return selector ? document.querySelector(selector) : null;\n    };\n\n    Collapse._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $this = $(this);\n        var data = $this.data(DATA_KEY$3);\n\n        var _config = _objectSpread({}, Default$1, $this.data(), typeof config === 'object' && config ? config : {});\n\n        if (!data && _config.toggle && /show|hide/.test(config)) {\n          _config.toggle = false;\n        }\n\n        if (!data) {\n          data = new Collapse(this, _config);\n          $this.data(DATA_KEY$3, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Collapse, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$3;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$1;\n      }\n    }]);\n\n    return Collapse;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$3.CLICK_DATA_API, Selector$3.DATA_TOGGLE, function (event) {\n    // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n    if (event.currentTarget.tagName === 'A') {\n      event.preventDefault();\n    }\n\n    var $trigger = $(this);\n    var selector = Util.getSelectorFromElement(this);\n    var selectors = [].slice.call(document.querySelectorAll(selector));\n    $(selectors).each(function () {\n      var $target = $(this);\n      var data = $target.data(DATA_KEY$3);\n      var config = data ? 'toggle' : $trigger.data();\n\n      Collapse._jQueryInterface.call($target, config);\n    });\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$3] = Collapse._jQueryInterface;\n  $.fn[NAME$3].Constructor = Collapse;\n\n  $.fn[NAME$3].noConflict = function () {\n    $.fn[NAME$3] = JQUERY_NO_CONFLICT$3;\n    return Collapse._jQueryInterface;\n  };\n\n  /**!\n   * @fileOverview Kickass library to create and place poppers near their reference elements.\n   * @version 1.14.7\n   * @license\n   * Copyright (c) 2016 Federico Zivolo and contributors\n   *\n   * Permission is hereby granted, free of charge, to any person obtaining a copy\n   * of this software and associated documentation files (the \"Software\"), to deal\n   * in the Software without restriction, including without limitation the rights\n   * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n   * copies of the Software, and to permit persons to whom the Software is\n   * furnished to do so, subject to the following conditions:\n   *\n   * The above copyright notice and this permission notice shall be included in all\n   * copies or substantial portions of the Software.\n   *\n   * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n   * SOFTWARE.\n   */\n  var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';\n\n  var longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];\n  var timeoutDuration = 0;\n  for (var i = 0; i < longerTimeoutBrowsers.length; i += 1) {\n    if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {\n      timeoutDuration = 1;\n      break;\n    }\n  }\n\n  function microtaskDebounce(fn) {\n    var called = false;\n    return function () {\n      if (called) {\n        return;\n      }\n      called = true;\n      window.Promise.resolve().then(function () {\n        called = false;\n        fn();\n      });\n    };\n  }\n\n  function taskDebounce(fn) {\n    var scheduled = false;\n    return function () {\n      if (!scheduled) {\n        scheduled = true;\n        setTimeout(function () {\n          scheduled = false;\n          fn();\n        }, timeoutDuration);\n      }\n    };\n  }\n\n  var supportsMicroTasks = isBrowser && window.Promise;\n\n  /**\n  * Create a debounced version of a method, that's asynchronously deferred\n  * but called in the minimum time possible.\n  *\n  * @method\n  * @memberof Popper.Utils\n  * @argument {Function} fn\n  * @returns {Function}\n  */\n  var debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce;\n\n  /**\n   * Check if the given variable is a function\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Any} functionToCheck - variable to check\n   * @returns {Boolean} answer to: is a function?\n   */\n  function isFunction(functionToCheck) {\n    var getType = {};\n    return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';\n  }\n\n  /**\n   * Get CSS computed property of the given element\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Eement} element\n   * @argument {String} property\n   */\n  function getStyleComputedProperty(element, property) {\n    if (element.nodeType !== 1) {\n      return [];\n    }\n    // NOTE: 1 DOM access here\n    var window = element.ownerDocument.defaultView;\n    var css = window.getComputedStyle(element, null);\n    return property ? css[property] : css;\n  }\n\n  /**\n   * Returns the parentNode or the host of the element\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element\n   * @returns {Element} parent\n   */\n  function getParentNode(element) {\n    if (element.nodeName === 'HTML') {\n      return element;\n    }\n    return element.parentNode || element.host;\n  }\n\n  /**\n   * Returns the scrolling parent of the given element\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element\n   * @returns {Element} scroll parent\n   */\n  function getScrollParent(element) {\n    // Return body, `getScroll` will take care to get the correct `scrollTop` from it\n    if (!element) {\n      return document.body;\n    }\n\n    switch (element.nodeName) {\n      case 'HTML':\n      case 'BODY':\n        return element.ownerDocument.body;\n      case '#document':\n        return element.body;\n    }\n\n    // Firefox want us to check `-x` and `-y` variations as well\n\n    var _getStyleComputedProp = getStyleComputedProperty(element),\n        overflow = _getStyleComputedProp.overflow,\n        overflowX = _getStyleComputedProp.overflowX,\n        overflowY = _getStyleComputedProp.overflowY;\n\n    if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {\n      return element;\n    }\n\n    return getScrollParent(getParentNode(element));\n  }\n\n  var isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode);\n  var isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent);\n\n  /**\n   * Determines if the browser is Internet Explorer\n   * @method\n   * @memberof Popper.Utils\n   * @param {Number} version to check\n   * @returns {Boolean} isIE\n   */\n  function isIE(version) {\n    if (version === 11) {\n      return isIE11;\n    }\n    if (version === 10) {\n      return isIE10;\n    }\n    return isIE11 || isIE10;\n  }\n\n  /**\n   * Returns the offset parent of the given element\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element\n   * @returns {Element} offset parent\n   */\n  function getOffsetParent(element) {\n    if (!element) {\n      return document.documentElement;\n    }\n\n    var noOffsetParent = isIE(10) ? document.body : null;\n\n    // NOTE: 1 DOM access here\n    var offsetParent = element.offsetParent || null;\n    // Skip hidden elements which don't have an offsetParent\n    while (offsetParent === noOffsetParent && element.nextElementSibling) {\n      offsetParent = (element = element.nextElementSibling).offsetParent;\n    }\n\n    var nodeName = offsetParent && offsetParent.nodeName;\n\n    if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {\n      return element ? element.ownerDocument.documentElement : document.documentElement;\n    }\n\n    // .offsetParent will return the closest TH, TD or TABLE in case\n    // no offsetParent is present, I hate this job...\n    if (['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') {\n      return getOffsetParent(offsetParent);\n    }\n\n    return offsetParent;\n  }\n\n  function isOffsetContainer(element) {\n    var nodeName = element.nodeName;\n\n    if (nodeName === 'BODY') {\n      return false;\n    }\n    return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element;\n  }\n\n  /**\n   * Finds the root node (document, shadowDOM root) of the given element\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} node\n   * @returns {Element} root node\n   */\n  function getRoot(node) {\n    if (node.parentNode !== null) {\n      return getRoot(node.parentNode);\n    }\n\n    return node;\n  }\n\n  /**\n   * Finds the offset parent common to the two provided nodes\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element1\n   * @argument {Element} element2\n   * @returns {Element} common offset parent\n   */\n  function findCommonOffsetParent(element1, element2) {\n    // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n    if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) {\n      return document.documentElement;\n    }\n\n    // Here we make sure to give as \"start\" the element that comes first in the DOM\n    var order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING;\n    var start = order ? element1 : element2;\n    var end = order ? element2 : element1;\n\n    // Get common ancestor container\n    var range = document.createRange();\n    range.setStart(start, 0);\n    range.setEnd(end, 0);\n    var commonAncestorContainer = range.commonAncestorContainer;\n\n    // Both nodes are inside #document\n\n    if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) {\n      if (isOffsetContainer(commonAncestorContainer)) {\n        return commonAncestorContainer;\n      }\n\n      return getOffsetParent(commonAncestorContainer);\n    }\n\n    // one of the nodes is inside shadowDOM, find which one\n    var element1root = getRoot(element1);\n    if (element1root.host) {\n      return findCommonOffsetParent(element1root.host, element2);\n    } else {\n      return findCommonOffsetParent(element1, getRoot(element2).host);\n    }\n  }\n\n  /**\n   * Gets the scroll value of the given element in the given side (top and left)\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element\n   * @argument {String} side `top` or `left`\n   * @returns {number} amount of scrolled pixels\n   */\n  function getScroll(element) {\n    var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top';\n\n    var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';\n    var nodeName = element.nodeName;\n\n    if (nodeName === 'BODY' || nodeName === 'HTML') {\n      var html = element.ownerDocument.documentElement;\n      var scrollingElement = element.ownerDocument.scrollingElement || html;\n      return scrollingElement[upperSide];\n    }\n\n    return element[upperSide];\n  }\n\n  /*\n   * Sum or subtract the element scroll values (left and top) from a given rect object\n   * @method\n   * @memberof Popper.Utils\n   * @param {Object} rect - Rect object you want to change\n   * @param {HTMLElement} element - The element from the function reads the scroll values\n   * @param {Boolean} subtract - set to true if you want to subtract the scroll values\n   * @return {Object} rect - The modifier rect object\n   */\n  function includeScroll(rect, element) {\n    var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n    var scrollTop = getScroll(element, 'top');\n    var scrollLeft = getScroll(element, 'left');\n    var modifier = subtract ? -1 : 1;\n    rect.top += scrollTop * modifier;\n    rect.bottom += scrollTop * modifier;\n    rect.left += scrollLeft * modifier;\n    rect.right += scrollLeft * modifier;\n    return rect;\n  }\n\n  /*\n   * Helper to detect borders of a given element\n   * @method\n   * @memberof Popper.Utils\n   * @param {CSSStyleDeclaration} styles\n   * Result of `getStyleComputedProperty` on the given element\n   * @param {String} axis - `x` or `y`\n   * @return {number} borders - The borders size of the given axis\n   */\n\n  function getBordersSize(styles, axis) {\n    var sideA = axis === 'x' ? 'Left' : 'Top';\n    var sideB = sideA === 'Left' ? 'Right' : 'Bottom';\n\n    return parseFloat(styles['border' + sideA + 'Width'], 10) + parseFloat(styles['border' + sideB + 'Width'], 10);\n  }\n\n  function getSize(axis, body, html, computedStyle) {\n    return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE(10) ? parseInt(html['offset' + axis]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')]) : 0);\n  }\n\n  function getWindowSizes(document) {\n    var body = document.body;\n    var html = document.documentElement;\n    var computedStyle = isIE(10) && getComputedStyle(html);\n\n    return {\n      height: getSize('Height', body, html, computedStyle),\n      width: getSize('Width', body, html, computedStyle)\n    };\n  }\n\n  var classCallCheck = function (instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  };\n\n  var createClass = function () {\n    function defineProperties(target, props) {\n      for (var i = 0; i < props.length; i++) {\n        var descriptor = props[i];\n        descriptor.enumerable = descriptor.enumerable || false;\n        descriptor.configurable = true;\n        if (\"value\" in descriptor) descriptor.writable = true;\n        Object.defineProperty(target, descriptor.key, descriptor);\n      }\n    }\n\n    return function (Constructor, protoProps, staticProps) {\n      if (protoProps) defineProperties(Constructor.prototype, protoProps);\n      if (staticProps) defineProperties(Constructor, staticProps);\n      return Constructor;\n    };\n  }();\n\n\n\n\n\n  var defineProperty = function (obj, key, value) {\n    if (key in obj) {\n      Object.defineProperty(obj, key, {\n        value: value,\n        enumerable: true,\n        configurable: true,\n        writable: true\n      });\n    } else {\n      obj[key] = value;\n    }\n\n    return obj;\n  };\n\n  var _extends = Object.assign || function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n\n    return target;\n  };\n\n  /**\n   * Given element offsets, generate an output similar to getBoundingClientRect\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Object} offsets\n   * @returns {Object} ClientRect like output\n   */\n  function getClientRect(offsets) {\n    return _extends({}, offsets, {\n      right: offsets.left + offsets.width,\n      bottom: offsets.top + offsets.height\n    });\n  }\n\n  /**\n   * Get bounding client rect of given element\n   * @method\n   * @memberof Popper.Utils\n   * @param {HTMLElement} element\n   * @return {Object} client rect\n   */\n  function getBoundingClientRect(element) {\n    var rect = {};\n\n    // IE10 10 FIX: Please, don't ask, the element isn't\n    // considered in DOM in some circumstances...\n    // This isn't reproducible in IE10 compatibility mode of IE11\n    try {\n      if (isIE(10)) {\n        rect = element.getBoundingClientRect();\n        var scrollTop = getScroll(element, 'top');\n        var scrollLeft = getScroll(element, 'left');\n        rect.top += scrollTop;\n        rect.left += scrollLeft;\n        rect.bottom += scrollTop;\n        rect.right += scrollLeft;\n      } else {\n        rect = element.getBoundingClientRect();\n      }\n    } catch (e) {}\n\n    var result = {\n      left: rect.left,\n      top: rect.top,\n      width: rect.right - rect.left,\n      height: rect.bottom - rect.top\n    };\n\n    // subtract scrollbar size from sizes\n    var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};\n    var width = sizes.width || element.clientWidth || result.right - result.left;\n    var height = sizes.height || element.clientHeight || result.bottom - result.top;\n\n    var horizScrollbar = element.offsetWidth - width;\n    var vertScrollbar = element.offsetHeight - height;\n\n    // if an hypothetical scrollbar is detected, we must be sure it's not a `border`\n    // we make this check conditional for performance reasons\n    if (horizScrollbar || vertScrollbar) {\n      var styles = getStyleComputedProperty(element);\n      horizScrollbar -= getBordersSize(styles, 'x');\n      vertScrollbar -= getBordersSize(styles, 'y');\n\n      result.width -= horizScrollbar;\n      result.height -= vertScrollbar;\n    }\n\n    return getClientRect(result);\n  }\n\n  function getOffsetRectRelativeToArbitraryNode(children, parent) {\n    var fixedPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n    var isIE10 = isIE(10);\n    var isHTML = parent.nodeName === 'HTML';\n    var childrenRect = getBoundingClientRect(children);\n    var parentRect = getBoundingClientRect(parent);\n    var scrollParent = getScrollParent(children);\n\n    var styles = getStyleComputedProperty(parent);\n    var borderTopWidth = parseFloat(styles.borderTopWidth, 10);\n    var borderLeftWidth = parseFloat(styles.borderLeftWidth, 10);\n\n    // In cases where the parent is fixed, we must ignore negative scroll in offset calc\n    if (fixedPosition && isHTML) {\n      parentRect.top = Math.max(parentRect.top, 0);\n      parentRect.left = Math.max(parentRect.left, 0);\n    }\n    var offsets = getClientRect({\n      top: childrenRect.top - parentRect.top - borderTopWidth,\n      left: childrenRect.left - parentRect.left - borderLeftWidth,\n      width: childrenRect.width,\n      height: childrenRect.height\n    });\n    offsets.marginTop = 0;\n    offsets.marginLeft = 0;\n\n    // Subtract margins of documentElement in case it's being used as parent\n    // we do this only on HTML because it's the only element that behaves\n    // differently when margins are applied to it. The margins are included in\n    // the box of the documentElement, in the other cases not.\n    if (!isIE10 && isHTML) {\n      var marginTop = parseFloat(styles.marginTop, 10);\n      var marginLeft = parseFloat(styles.marginLeft, 10);\n\n      offsets.top -= borderTopWidth - marginTop;\n      offsets.bottom -= borderTopWidth - marginTop;\n      offsets.left -= borderLeftWidth - marginLeft;\n      offsets.right -= borderLeftWidth - marginLeft;\n\n      // Attach marginTop and marginLeft because in some circumstances we may need them\n      offsets.marginTop = marginTop;\n      offsets.marginLeft = marginLeft;\n    }\n\n    if (isIE10 && !fixedPosition ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') {\n      offsets = includeScroll(offsets, parent);\n    }\n\n    return offsets;\n  }\n\n  function getViewportOffsetRectRelativeToArtbitraryNode(element) {\n    var excludeScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n    var html = element.ownerDocument.documentElement;\n    var relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html);\n    var width = Math.max(html.clientWidth, window.innerWidth || 0);\n    var height = Math.max(html.clientHeight, window.innerHeight || 0);\n\n    var scrollTop = !excludeScroll ? getScroll(html) : 0;\n    var scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0;\n\n    var offset = {\n      top: scrollTop - relativeOffset.top + relativeOffset.marginTop,\n      left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft,\n      width: width,\n      height: height\n    };\n\n    return getClientRect(offset);\n  }\n\n  /**\n   * Check if the given element is fixed or is inside a fixed parent\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element\n   * @argument {Element} customContainer\n   * @returns {Boolean} answer to \"isFixed?\"\n   */\n  function isFixed(element) {\n    var nodeName = element.nodeName;\n    if (nodeName === 'BODY' || nodeName === 'HTML') {\n      return false;\n    }\n    if (getStyleComputedProperty(element, 'position') === 'fixed') {\n      return true;\n    }\n    var parentNode = getParentNode(element);\n    if (!parentNode) {\n      return false;\n    }\n    return isFixed(parentNode);\n  }\n\n  /**\n   * Finds the first parent of an element that has a transformed property defined\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element\n   * @returns {Element} first transformed parent or documentElement\n   */\n\n  function getFixedPositionOffsetParent(element) {\n    // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n    if (!element || !element.parentElement || isIE()) {\n      return document.documentElement;\n    }\n    var el = element.parentElement;\n    while (el && getStyleComputedProperty(el, 'transform') === 'none') {\n      el = el.parentElement;\n    }\n    return el || document.documentElement;\n  }\n\n  /**\n   * Computed the boundaries limits and return them\n   * @method\n   * @memberof Popper.Utils\n   * @param {HTMLElement} popper\n   * @param {HTMLElement} reference\n   * @param {number} padding\n   * @param {HTMLElement} boundariesElement - Element used to define the boundaries\n   * @param {Boolean} fixedPosition - Is in fixed position mode\n   * @returns {Object} Coordinates of the boundaries\n   */\n  function getBoundaries(popper, reference, padding, boundariesElement) {\n    var fixedPosition = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n    // NOTE: 1 DOM access here\n\n    var boundaries = { top: 0, left: 0 };\n    var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);\n\n    // Handle viewport case\n    if (boundariesElement === 'viewport') {\n      boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition);\n    } else {\n      // Handle other cases based on DOM element used as boundaries\n      var boundariesNode = void 0;\n      if (boundariesElement === 'scrollParent') {\n        boundariesNode = getScrollParent(getParentNode(reference));\n        if (boundariesNode.nodeName === 'BODY') {\n          boundariesNode = popper.ownerDocument.documentElement;\n        }\n      } else if (boundariesElement === 'window') {\n        boundariesNode = popper.ownerDocument.documentElement;\n      } else {\n        boundariesNode = boundariesElement;\n      }\n\n      var offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition);\n\n      // In case of HTML, we need a different computation\n      if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {\n        var _getWindowSizes = getWindowSizes(popper.ownerDocument),\n            height = _getWindowSizes.height,\n            width = _getWindowSizes.width;\n\n        boundaries.top += offsets.top - offsets.marginTop;\n        boundaries.bottom = height + offsets.top;\n        boundaries.left += offsets.left - offsets.marginLeft;\n        boundaries.right = width + offsets.left;\n      } else {\n        // for all the other DOM elements, this one is good\n        boundaries = offsets;\n      }\n    }\n\n    // Add paddings\n    padding = padding || 0;\n    var isPaddingNumber = typeof padding === 'number';\n    boundaries.left += isPaddingNumber ? padding : padding.left || 0;\n    boundaries.top += isPaddingNumber ? padding : padding.top || 0;\n    boundaries.right -= isPaddingNumber ? padding : padding.right || 0;\n    boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0;\n\n    return boundaries;\n  }\n\n  function getArea(_ref) {\n    var width = _ref.width,\n        height = _ref.height;\n\n    return width * height;\n  }\n\n  /**\n   * Utility used to transform the `auto` placement to the placement with more\n   * available space.\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Object} data - The data object generated by update method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function computeAutoPlacement(placement, refRect, popper, reference, boundariesElement) {\n    var padding = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;\n\n    if (placement.indexOf('auto') === -1) {\n      return placement;\n    }\n\n    var boundaries = getBoundaries(popper, reference, padding, boundariesElement);\n\n    var rects = {\n      top: {\n        width: boundaries.width,\n        height: refRect.top - boundaries.top\n      },\n      right: {\n        width: boundaries.right - refRect.right,\n        height: boundaries.height\n      },\n      bottom: {\n        width: boundaries.width,\n        height: boundaries.bottom - refRect.bottom\n      },\n      left: {\n        width: refRect.left - boundaries.left,\n        height: boundaries.height\n      }\n    };\n\n    var sortedAreas = Object.keys(rects).map(function (key) {\n      return _extends({\n        key: key\n      }, rects[key], {\n        area: getArea(rects[key])\n      });\n    }).sort(function (a, b) {\n      return b.area - a.area;\n    });\n\n    var filteredAreas = sortedAreas.filter(function (_ref2) {\n      var width = _ref2.width,\n          height = _ref2.height;\n      return width >= popper.clientWidth && height >= popper.clientHeight;\n    });\n\n    var computedPlacement = filteredAreas.length > 0 ? filteredAreas[0].key : sortedAreas[0].key;\n\n    var variation = placement.split('-')[1];\n\n    return computedPlacement + (variation ? '-' + variation : '');\n  }\n\n  /**\n   * Get offsets to the reference element\n   * @method\n   * @memberof Popper.Utils\n   * @param {Object} state\n   * @param {Element} popper - the popper element\n   * @param {Element} reference - the reference element (the popper will be relative to this)\n   * @param {Element} fixedPosition - is in fixed position mode\n   * @returns {Object} An object containing the offsets which will be applied to the popper\n   */\n  function getReferenceOffsets(state, popper, reference) {\n    var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n\n    var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);\n    return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);\n  }\n\n  /**\n   * Get the outer sizes of the given element (offset size + margins)\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element\n   * @returns {Object} object containing width and height properties\n   */\n  function getOuterSizes(element) {\n    var window = element.ownerDocument.defaultView;\n    var styles = window.getComputedStyle(element);\n    var x = parseFloat(styles.marginTop || 0) + parseFloat(styles.marginBottom || 0);\n    var y = parseFloat(styles.marginLeft || 0) + parseFloat(styles.marginRight || 0);\n    var result = {\n      width: element.offsetWidth + y,\n      height: element.offsetHeight + x\n    };\n    return result;\n  }\n\n  /**\n   * Get the opposite placement of the given one\n   * @method\n   * @memberof Popper.Utils\n   * @argument {String} placement\n   * @returns {String} flipped placement\n   */\n  function getOppositePlacement(placement) {\n    var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' };\n    return placement.replace(/left|right|bottom|top/g, function (matched) {\n      return hash[matched];\n    });\n  }\n\n  /**\n   * Get offsets to the popper\n   * @method\n   * @memberof Popper.Utils\n   * @param {Object} position - CSS position the Popper will get applied\n   * @param {HTMLElement} popper - the popper element\n   * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this)\n   * @param {String} placement - one of the valid placement options\n   * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper\n   */\n  function getPopperOffsets(popper, referenceOffsets, placement) {\n    placement = placement.split('-')[0];\n\n    // Get popper node sizes\n    var popperRect = getOuterSizes(popper);\n\n    // Add position, width and height to our offsets object\n    var popperOffsets = {\n      width: popperRect.width,\n      height: popperRect.height\n    };\n\n    // depending by the popper placement we have to compute its offsets slightly differently\n    var isHoriz = ['right', 'left'].indexOf(placement) !== -1;\n    var mainSide = isHoriz ? 'top' : 'left';\n    var secondarySide = isHoriz ? 'left' : 'top';\n    var measurement = isHoriz ? 'height' : 'width';\n    var secondaryMeasurement = !isHoriz ? 'height' : 'width';\n\n    popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2;\n    if (placement === secondarySide) {\n      popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement];\n    } else {\n      popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)];\n    }\n\n    return popperOffsets;\n  }\n\n  /**\n   * Mimics the `find` method of Array\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Array} arr\n   * @argument prop\n   * @argument value\n   * @returns index or -1\n   */\n  function find(arr, check) {\n    // use native find if supported\n    if (Array.prototype.find) {\n      return arr.find(check);\n    }\n\n    // use `filter` to obtain the same behavior of `find`\n    return arr.filter(check)[0];\n  }\n\n  /**\n   * Return the index of the matching object\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Array} arr\n   * @argument prop\n   * @argument value\n   * @returns index or -1\n   */\n  function findIndex(arr, prop, value) {\n    // use native findIndex if supported\n    if (Array.prototype.findIndex) {\n      return arr.findIndex(function (cur) {\n        return cur[prop] === value;\n      });\n    }\n\n    // use `find` + `indexOf` if `findIndex` isn't supported\n    var match = find(arr, function (obj) {\n      return obj[prop] === value;\n    });\n    return arr.indexOf(match);\n  }\n\n  /**\n   * Loop trough the list of modifiers and run them in order,\n   * each of them will then edit the data object.\n   * @method\n   * @memberof Popper.Utils\n   * @param {dataObject} data\n   * @param {Array} modifiers\n   * @param {String} ends - Optional modifier name used as stopper\n   * @returns {dataObject}\n   */\n  function runModifiers(modifiers, data, ends) {\n    var modifiersToRun = ends === undefined ? modifiers : modifiers.slice(0, findIndex(modifiers, 'name', ends));\n\n    modifiersToRun.forEach(function (modifier) {\n      if (modifier['function']) {\n        // eslint-disable-line dot-notation\n        console.warn('`modifier.function` is deprecated, use `modifier.fn`!');\n      }\n      var fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation\n      if (modifier.enabled && isFunction(fn)) {\n        // Add properties to offsets to make them a complete clientRect object\n        // we do this before each modifier to make sure the previous one doesn't\n        // mess with these values\n        data.offsets.popper = getClientRect(data.offsets.popper);\n        data.offsets.reference = getClientRect(data.offsets.reference);\n\n        data = fn(data, modifier);\n      }\n    });\n\n    return data;\n  }\n\n  /**\n   * Updates the position of the popper, computing the new offsets and applying\n   * the new style.<br />\n   * Prefer `scheduleUpdate` over `update` because of performance reasons.\n   * @method\n   * @memberof Popper\n   */\n  function update() {\n    // if popper is destroyed, don't perform any further update\n    if (this.state.isDestroyed) {\n      return;\n    }\n\n    var data = {\n      instance: this,\n      styles: {},\n      arrowStyles: {},\n      attributes: {},\n      flipped: false,\n      offsets: {}\n    };\n\n    // compute reference element offsets\n    data.offsets.reference = getReferenceOffsets(this.state, this.popper, this.reference, this.options.positionFixed);\n\n    // compute auto placement, store placement inside the data object,\n    // modifiers will be able to edit `placement` if needed\n    // and refer to originalPlacement to know the original value\n    data.placement = computeAutoPlacement(this.options.placement, data.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding);\n\n    // store the computed placement inside `originalPlacement`\n    data.originalPlacement = data.placement;\n\n    data.positionFixed = this.options.positionFixed;\n\n    // compute the popper offsets\n    data.offsets.popper = getPopperOffsets(this.popper, data.offsets.reference, data.placement);\n\n    data.offsets.popper.position = this.options.positionFixed ? 'fixed' : 'absolute';\n\n    // run the modifiers\n    data = runModifiers(this.modifiers, data);\n\n    // the first `update` will call `onCreate` callback\n    // the other ones will call `onUpdate` callback\n    if (!this.state.isCreated) {\n      this.state.isCreated = true;\n      this.options.onCreate(data);\n    } else {\n      this.options.onUpdate(data);\n    }\n  }\n\n  /**\n   * Helper used to know if the given modifier is enabled.\n   * @method\n   * @memberof Popper.Utils\n   * @returns {Boolean}\n   */\n  function isModifierEnabled(modifiers, modifierName) {\n    return modifiers.some(function (_ref) {\n      var name = _ref.name,\n          enabled = _ref.enabled;\n      return enabled && name === modifierName;\n    });\n  }\n\n  /**\n   * Get the prefixed supported property name\n   * @method\n   * @memberof Popper.Utils\n   * @argument {String} property (camelCase)\n   * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix)\n   */\n  function getSupportedPropertyName(property) {\n    var prefixes = [false, 'ms', 'Webkit', 'Moz', 'O'];\n    var upperProp = property.charAt(0).toUpperCase() + property.slice(1);\n\n    for (var i = 0; i < prefixes.length; i++) {\n      var prefix = prefixes[i];\n      var toCheck = prefix ? '' + prefix + upperProp : property;\n      if (typeof document.body.style[toCheck] !== 'undefined') {\n        return toCheck;\n      }\n    }\n    return null;\n  }\n\n  /**\n   * Destroys the popper.\n   * @method\n   * @memberof Popper\n   */\n  function destroy() {\n    this.state.isDestroyed = true;\n\n    // touch DOM only if `applyStyle` modifier is enabled\n    if (isModifierEnabled(this.modifiers, 'applyStyle')) {\n      this.popper.removeAttribute('x-placement');\n      this.popper.style.position = '';\n      this.popper.style.top = '';\n      this.popper.style.left = '';\n      this.popper.style.right = '';\n      this.popper.style.bottom = '';\n      this.popper.style.willChange = '';\n      this.popper.style[getSupportedPropertyName('transform')] = '';\n    }\n\n    this.disableEventListeners();\n\n    // remove the popper if user explicity asked for the deletion on destroy\n    // do not use `remove` because IE11 doesn't support it\n    if (this.options.removeOnDestroy) {\n      this.popper.parentNode.removeChild(this.popper);\n    }\n    return this;\n  }\n\n  /**\n   * Get the window associated with the element\n   * @argument {Element} element\n   * @returns {Window}\n   */\n  function getWindow(element) {\n    var ownerDocument = element.ownerDocument;\n    return ownerDocument ? ownerDocument.defaultView : window;\n  }\n\n  function attachToScrollParents(scrollParent, event, callback, scrollParents) {\n    var isBody = scrollParent.nodeName === 'BODY';\n    var target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent;\n    target.addEventListener(event, callback, { passive: true });\n\n    if (!isBody) {\n      attachToScrollParents(getScrollParent(target.parentNode), event, callback, scrollParents);\n    }\n    scrollParents.push(target);\n  }\n\n  /**\n   * Setup needed event listeners used to update the popper position\n   * @method\n   * @memberof Popper.Utils\n   * @private\n   */\n  function setupEventListeners(reference, options, state, updateBound) {\n    // Resize event listener on window\n    state.updateBound = updateBound;\n    getWindow(reference).addEventListener('resize', state.updateBound, { passive: true });\n\n    // Scroll event listener on scroll parents\n    var scrollElement = getScrollParent(reference);\n    attachToScrollParents(scrollElement, 'scroll', state.updateBound, state.scrollParents);\n    state.scrollElement = scrollElement;\n    state.eventsEnabled = true;\n\n    return state;\n  }\n\n  /**\n   * It will add resize/scroll events and start recalculating\n   * position of the popper element when they are triggered.\n   * @method\n   * @memberof Popper\n   */\n  function enableEventListeners() {\n    if (!this.state.eventsEnabled) {\n      this.state = setupEventListeners(this.reference, this.options, this.state, this.scheduleUpdate);\n    }\n  }\n\n  /**\n   * Remove event listeners used to update the popper position\n   * @method\n   * @memberof Popper.Utils\n   * @private\n   */\n  function removeEventListeners(reference, state) {\n    // Remove resize event listener on window\n    getWindow(reference).removeEventListener('resize', state.updateBound);\n\n    // Remove scroll event listener on scroll parents\n    state.scrollParents.forEach(function (target) {\n      target.removeEventListener('scroll', state.updateBound);\n    });\n\n    // Reset state\n    state.updateBound = null;\n    state.scrollParents = [];\n    state.scrollElement = null;\n    state.eventsEnabled = false;\n    return state;\n  }\n\n  /**\n   * It will remove resize/scroll events and won't recalculate popper position\n   * when they are triggered. It also won't trigger `onUpdate` callback anymore,\n   * unless you call `update` method manually.\n   * @method\n   * @memberof Popper\n   */\n  function disableEventListeners() {\n    if (this.state.eventsEnabled) {\n      cancelAnimationFrame(this.scheduleUpdate);\n      this.state = removeEventListeners(this.reference, this.state);\n    }\n  }\n\n  /**\n   * Tells if a given input is a number\n   * @method\n   * @memberof Popper.Utils\n   * @param {*} input to check\n   * @return {Boolean}\n   */\n  function isNumeric(n) {\n    return n !== '' && !isNaN(parseFloat(n)) && isFinite(n);\n  }\n\n  /**\n   * Set the style to the given popper\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element - Element to apply the style to\n   * @argument {Object} styles\n   * Object with a list of properties and values which will be applied to the element\n   */\n  function setStyles(element, styles) {\n    Object.keys(styles).forEach(function (prop) {\n      var unit = '';\n      // add unit if the value is numeric and is one of the following\n      if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && isNumeric(styles[prop])) {\n        unit = 'px';\n      }\n      element.style[prop] = styles[prop] + unit;\n    });\n  }\n\n  /**\n   * Set the attributes to the given popper\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element - Element to apply the attributes to\n   * @argument {Object} styles\n   * Object with a list of properties and values which will be applied to the element\n   */\n  function setAttributes(element, attributes) {\n    Object.keys(attributes).forEach(function (prop) {\n      var value = attributes[prop];\n      if (value !== false) {\n        element.setAttribute(prop, attributes[prop]);\n      } else {\n        element.removeAttribute(prop);\n      }\n    });\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by `update` method\n   * @argument {Object} data.styles - List of style properties - values to apply to popper element\n   * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The same data object\n   */\n  function applyStyle(data) {\n    // any property present in `data.styles` will be applied to the popper,\n    // in this way we can make the 3rd party modifiers add custom styles to it\n    // Be aware, modifiers could override the properties defined in the previous\n    // lines of this modifier!\n    setStyles(data.instance.popper, data.styles);\n\n    // any property present in `data.attributes` will be applied to the popper,\n    // they will be set as HTML attributes of the element\n    setAttributes(data.instance.popper, data.attributes);\n\n    // if arrowElement is defined and arrowStyles has some properties\n    if (data.arrowElement && Object.keys(data.arrowStyles).length) {\n      setStyles(data.arrowElement, data.arrowStyles);\n    }\n\n    return data;\n  }\n\n  /**\n   * Set the x-placement attribute before everything else because it could be used\n   * to add margins to the popper margins needs to be calculated to get the\n   * correct popper offsets.\n   * @method\n   * @memberof Popper.modifiers\n   * @param {HTMLElement} reference - The reference element used to position the popper\n   * @param {HTMLElement} popper - The HTML element used as popper\n   * @param {Object} options - Popper.js options\n   */\n  function applyStyleOnLoad(reference, popper, options, modifierOptions, state) {\n    // compute reference element offsets\n    var referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed);\n\n    // compute auto placement, store placement inside the data object,\n    // modifiers will be able to edit `placement` if needed\n    // and refer to originalPlacement to know the original value\n    var placement = computeAutoPlacement(options.placement, referenceOffsets, popper, reference, options.modifiers.flip.boundariesElement, options.modifiers.flip.padding);\n\n    popper.setAttribute('x-placement', placement);\n\n    // Apply `position` to popper before anything else because\n    // without the position applied we can't guarantee correct computations\n    setStyles(popper, { position: options.positionFixed ? 'fixed' : 'absolute' });\n\n    return options;\n  }\n\n  /**\n   * @function\n   * @memberof Popper.Utils\n   * @argument {Object} data - The data object generated by `update` method\n   * @argument {Boolean} shouldRound - If the offsets should be rounded at all\n   * @returns {Object} The popper's position offsets rounded\n   *\n   * The tale of pixel-perfect positioning. It's still not 100% perfect, but as\n   * good as it can be within reason.\n   * Discussion here: https://github.com/FezVrasta/popper.js/pull/715\n   *\n   * Low DPI screens cause a popper to be blurry if not using full pixels (Safari\n   * as well on High DPI screens).\n   *\n   * Firefox prefers no rounding for positioning and does not have blurriness on\n   * high DPI screens.\n   *\n   * Only horizontal placement and left/right values need to be considered.\n   */\n  function getRoundedOffsets(data, shouldRound) {\n    var _data$offsets = data.offsets,\n        popper = _data$offsets.popper,\n        reference = _data$offsets.reference;\n    var round = Math.round,\n        floor = Math.floor;\n\n    var noRound = function noRound(v) {\n      return v;\n    };\n\n    var referenceWidth = round(reference.width);\n    var popperWidth = round(popper.width);\n\n    var isVertical = ['left', 'right'].indexOf(data.placement) !== -1;\n    var isVariation = data.placement.indexOf('-') !== -1;\n    var sameWidthParity = referenceWidth % 2 === popperWidth % 2;\n    var bothOddWidth = referenceWidth % 2 === 1 && popperWidth % 2 === 1;\n\n    var horizontalToInteger = !shouldRound ? noRound : isVertical || isVariation || sameWidthParity ? round : floor;\n    var verticalToInteger = !shouldRound ? noRound : round;\n\n    return {\n      left: horizontalToInteger(bothOddWidth && !isVariation && shouldRound ? popper.left - 1 : popper.left),\n      top: verticalToInteger(popper.top),\n      bottom: verticalToInteger(popper.bottom),\n      right: horizontalToInteger(popper.right)\n    };\n  }\n\n  var isFirefox = isBrowser && /Firefox/i.test(navigator.userAgent);\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by `update` method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function computeStyle(data, options) {\n    var x = options.x,\n        y = options.y;\n    var popper = data.offsets.popper;\n\n    // Remove this legacy support in Popper.js v2\n\n    var legacyGpuAccelerationOption = find(data.instance.modifiers, function (modifier) {\n      return modifier.name === 'applyStyle';\n    }).gpuAcceleration;\n    if (legacyGpuAccelerationOption !== undefined) {\n      console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');\n    }\n    var gpuAcceleration = legacyGpuAccelerationOption !== undefined ? legacyGpuAccelerationOption : options.gpuAcceleration;\n\n    var offsetParent = getOffsetParent(data.instance.popper);\n    var offsetParentRect = getBoundingClientRect(offsetParent);\n\n    // Styles\n    var styles = {\n      position: popper.position\n    };\n\n    var offsets = getRoundedOffsets(data, window.devicePixelRatio < 2 || !isFirefox);\n\n    var sideA = x === 'bottom' ? 'top' : 'bottom';\n    var sideB = y === 'right' ? 'left' : 'right';\n\n    // if gpuAcceleration is set to `true` and transform is supported,\n    //  we use `translate3d` to apply the position to the popper we\n    // automatically use the supported prefixed version if needed\n    var prefixedProperty = getSupportedPropertyName('transform');\n\n    // now, let's make a step back and look at this code closely (wtf?)\n    // If the content of the popper grows once it's been positioned, it\n    // may happen that the popper gets misplaced because of the new content\n    // overflowing its reference element\n    // To avoid this problem, we provide two options (x and y), which allow\n    // the consumer to define the offset origin.\n    // If we position a popper on top of a reference element, we can set\n    // `x` to `top` to make the popper grow towards its top instead of\n    // its bottom.\n    var left = void 0,\n        top = void 0;\n    if (sideA === 'bottom') {\n      // when offsetParent is <html> the positioning is relative to the bottom of the screen (excluding the scrollbar)\n      // and not the bottom of the html element\n      if (offsetParent.nodeName === 'HTML') {\n        top = -offsetParent.clientHeight + offsets.bottom;\n      } else {\n        top = -offsetParentRect.height + offsets.bottom;\n      }\n    } else {\n      top = offsets.top;\n    }\n    if (sideB === 'right') {\n      if (offsetParent.nodeName === 'HTML') {\n        left = -offsetParent.clientWidth + offsets.right;\n      } else {\n        left = -offsetParentRect.width + offsets.right;\n      }\n    } else {\n      left = offsets.left;\n    }\n    if (gpuAcceleration && prefixedProperty) {\n      styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)';\n      styles[sideA] = 0;\n      styles[sideB] = 0;\n      styles.willChange = 'transform';\n    } else {\n      // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties\n      var invertTop = sideA === 'bottom' ? -1 : 1;\n      var invertLeft = sideB === 'right' ? -1 : 1;\n      styles[sideA] = top * invertTop;\n      styles[sideB] = left * invertLeft;\n      styles.willChange = sideA + ', ' + sideB;\n    }\n\n    // Attributes\n    var attributes = {\n      'x-placement': data.placement\n    };\n\n    // Update `data` attributes, styles and arrowStyles\n    data.attributes = _extends({}, attributes, data.attributes);\n    data.styles = _extends({}, styles, data.styles);\n    data.arrowStyles = _extends({}, data.offsets.arrow, data.arrowStyles);\n\n    return data;\n  }\n\n  /**\n   * Helper used to know if the given modifier depends from another one.<br />\n   * It checks if the needed modifier is listed and enabled.\n   * @method\n   * @memberof Popper.Utils\n   * @param {Array} modifiers - list of modifiers\n   * @param {String} requestingName - name of requesting modifier\n   * @param {String} requestedName - name of requested modifier\n   * @returns {Boolean}\n   */\n  function isModifierRequired(modifiers, requestingName, requestedName) {\n    var requesting = find(modifiers, function (_ref) {\n      var name = _ref.name;\n      return name === requestingName;\n    });\n\n    var isRequired = !!requesting && modifiers.some(function (modifier) {\n      return modifier.name === requestedName && modifier.enabled && modifier.order < requesting.order;\n    });\n\n    if (!isRequired) {\n      var _requesting = '`' + requestingName + '`';\n      var requested = '`' + requestedName + '`';\n      console.warn(requested + ' modifier is required by ' + _requesting + ' modifier in order to work, be sure to include it before ' + _requesting + '!');\n    }\n    return isRequired;\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by update method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function arrow(data, options) {\n    var _data$offsets$arrow;\n\n    // arrow depends on keepTogether in order to work\n    if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) {\n      return data;\n    }\n\n    var arrowElement = options.element;\n\n    // if arrowElement is a string, suppose it's a CSS selector\n    if (typeof arrowElement === 'string') {\n      arrowElement = data.instance.popper.querySelector(arrowElement);\n\n      // if arrowElement is not found, don't run the modifier\n      if (!arrowElement) {\n        return data;\n      }\n    } else {\n      // if the arrowElement isn't a query selector we must check that the\n      // provided DOM node is child of its popper node\n      if (!data.instance.popper.contains(arrowElement)) {\n        console.warn('WARNING: `arrow.element` must be child of its popper element!');\n        return data;\n      }\n    }\n\n    var placement = data.placement.split('-')[0];\n    var _data$offsets = data.offsets,\n        popper = _data$offsets.popper,\n        reference = _data$offsets.reference;\n\n    var isVertical = ['left', 'right'].indexOf(placement) !== -1;\n\n    var len = isVertical ? 'height' : 'width';\n    var sideCapitalized = isVertical ? 'Top' : 'Left';\n    var side = sideCapitalized.toLowerCase();\n    var altSide = isVertical ? 'left' : 'top';\n    var opSide = isVertical ? 'bottom' : 'right';\n    var arrowElementSize = getOuterSizes(arrowElement)[len];\n\n    //\n    // extends keepTogether behavior making sure the popper and its\n    // reference have enough pixels in conjunction\n    //\n\n    // top/left side\n    if (reference[opSide] - arrowElementSize < popper[side]) {\n      data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize);\n    }\n    // bottom/right side\n    if (reference[side] + arrowElementSize > popper[opSide]) {\n      data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide];\n    }\n    data.offsets.popper = getClientRect(data.offsets.popper);\n\n    // compute center of the popper\n    var center = reference[side] + reference[len] / 2 - arrowElementSize / 2;\n\n    // Compute the sideValue using the updated popper offsets\n    // take popper margin in account because we don't have this info available\n    var css = getStyleComputedProperty(data.instance.popper);\n    var popperMarginSide = parseFloat(css['margin' + sideCapitalized], 10);\n    var popperBorderSide = parseFloat(css['border' + sideCapitalized + 'Width'], 10);\n    var sideValue = center - data.offsets.popper[side] - popperMarginSide - popperBorderSide;\n\n    // prevent arrowElement from being placed not contiguously to its popper\n    sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0);\n\n    data.arrowElement = arrowElement;\n    data.offsets.arrow = (_data$offsets$arrow = {}, defineProperty(_data$offsets$arrow, side, Math.round(sideValue)), defineProperty(_data$offsets$arrow, altSide, ''), _data$offsets$arrow);\n\n    return data;\n  }\n\n  /**\n   * Get the opposite placement variation of the given one\n   * @method\n   * @memberof Popper.Utils\n   * @argument {String} placement variation\n   * @returns {String} flipped placement variation\n   */\n  function getOppositeVariation(variation) {\n    if (variation === 'end') {\n      return 'start';\n    } else if (variation === 'start') {\n      return 'end';\n    }\n    return variation;\n  }\n\n  /**\n   * List of accepted placements to use as values of the `placement` option.<br />\n   * Valid placements are:\n   * - `auto`\n   * - `top`\n   * - `right`\n   * - `bottom`\n   * - `left`\n   *\n   * Each placement can have a variation from this list:\n   * - `-start`\n   * - `-end`\n   *\n   * Variations are interpreted easily if you think of them as the left to right\n   * written languages. Horizontally (`top` and `bottom`), `start` is left and `end`\n   * is right.<br />\n   * Vertically (`left` and `right`), `start` is top and `end` is bottom.\n   *\n   * Some valid examples are:\n   * - `top-end` (on top of reference, right aligned)\n   * - `right-start` (on right of reference, top aligned)\n   * - `bottom` (on bottom, centered)\n   * - `auto-end` (on the side with more space available, alignment depends by placement)\n   *\n   * @static\n   * @type {Array}\n   * @enum {String}\n   * @readonly\n   * @method placements\n   * @memberof Popper\n   */\n  var placements = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start'];\n\n  // Get rid of `auto` `auto-start` and `auto-end`\n  var validPlacements = placements.slice(3);\n\n  /**\n   * Given an initial placement, returns all the subsequent placements\n   * clockwise (or counter-clockwise).\n   *\n   * @method\n   * @memberof Popper.Utils\n   * @argument {String} placement - A valid placement (it accepts variations)\n   * @argument {Boolean} counter - Set to true to walk the placements counterclockwise\n   * @returns {Array} placements including their variations\n   */\n  function clockwise(placement) {\n    var counter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n    var index = validPlacements.indexOf(placement);\n    var arr = validPlacements.slice(index + 1).concat(validPlacements.slice(0, index));\n    return counter ? arr.reverse() : arr;\n  }\n\n  var BEHAVIORS = {\n    FLIP: 'flip',\n    CLOCKWISE: 'clockwise',\n    COUNTERCLOCKWISE: 'counterclockwise'\n  };\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by update method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function flip(data, options) {\n    // if `inner` modifier is enabled, we can't use the `flip` modifier\n    if (isModifierEnabled(data.instance.modifiers, 'inner')) {\n      return data;\n    }\n\n    if (data.flipped && data.placement === data.originalPlacement) {\n      // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides\n      return data;\n    }\n\n    var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, options.boundariesElement, data.positionFixed);\n\n    var placement = data.placement.split('-')[0];\n    var placementOpposite = getOppositePlacement(placement);\n    var variation = data.placement.split('-')[1] || '';\n\n    var flipOrder = [];\n\n    switch (options.behavior) {\n      case BEHAVIORS.FLIP:\n        flipOrder = [placement, placementOpposite];\n        break;\n      case BEHAVIORS.CLOCKWISE:\n        flipOrder = clockwise(placement);\n        break;\n      case BEHAVIORS.COUNTERCLOCKWISE:\n        flipOrder = clockwise(placement, true);\n        break;\n      default:\n        flipOrder = options.behavior;\n    }\n\n    flipOrder.forEach(function (step, index) {\n      if (placement !== step || flipOrder.length === index + 1) {\n        return data;\n      }\n\n      placement = data.placement.split('-')[0];\n      placementOpposite = getOppositePlacement(placement);\n\n      var popperOffsets = data.offsets.popper;\n      var refOffsets = data.offsets.reference;\n\n      // using floor because the reference offsets may contain decimals we are not going to consider here\n      var floor = Math.floor;\n      var overlapsRef = placement === 'left' && floor(popperOffsets.right) > floor(refOffsets.left) || placement === 'right' && floor(popperOffsets.left) < floor(refOffsets.right) || placement === 'top' && floor(popperOffsets.bottom) > floor(refOffsets.top) || placement === 'bottom' && floor(popperOffsets.top) < floor(refOffsets.bottom);\n\n      var overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left);\n      var overflowsRight = floor(popperOffsets.right) > floor(boundaries.right);\n      var overflowsTop = floor(popperOffsets.top) < floor(boundaries.top);\n      var overflowsBottom = floor(popperOffsets.bottom) > floor(boundaries.bottom);\n\n      var overflowsBoundaries = placement === 'left' && overflowsLeft || placement === 'right' && overflowsRight || placement === 'top' && overflowsTop || placement === 'bottom' && overflowsBottom;\n\n      // flip the variation if required\n      var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n      var flippedVariation = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom);\n\n      if (overlapsRef || overflowsBoundaries || flippedVariation) {\n        // this boolean to detect any flip loop\n        data.flipped = true;\n\n        if (overlapsRef || overflowsBoundaries) {\n          placement = flipOrder[index + 1];\n        }\n\n        if (flippedVariation) {\n          variation = getOppositeVariation(variation);\n        }\n\n        data.placement = placement + (variation ? '-' + variation : '');\n\n        // this object contains `position`, we want to preserve it along with\n        // any additional property we may add in the future\n        data.offsets.popper = _extends({}, data.offsets.popper, getPopperOffsets(data.instance.popper, data.offsets.reference, data.placement));\n\n        data = runModifiers(data.instance.modifiers, data, 'flip');\n      }\n    });\n    return data;\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by update method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function keepTogether(data) {\n    var _data$offsets = data.offsets,\n        popper = _data$offsets.popper,\n        reference = _data$offsets.reference;\n\n    var placement = data.placement.split('-')[0];\n    var floor = Math.floor;\n    var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n    var side = isVertical ? 'right' : 'bottom';\n    var opSide = isVertical ? 'left' : 'top';\n    var measurement = isVertical ? 'width' : 'height';\n\n    if (popper[side] < floor(reference[opSide])) {\n      data.offsets.popper[opSide] = floor(reference[opSide]) - popper[measurement];\n    }\n    if (popper[opSide] > floor(reference[side])) {\n      data.offsets.popper[opSide] = floor(reference[side]);\n    }\n\n    return data;\n  }\n\n  /**\n   * Converts a string containing value + unit into a px value number\n   * @function\n   * @memberof {modifiers~offset}\n   * @private\n   * @argument {String} str - Value + unit string\n   * @argument {String} measurement - `height` or `width`\n   * @argument {Object} popperOffsets\n   * @argument {Object} referenceOffsets\n   * @returns {Number|String}\n   * Value in pixels, or original string if no values were extracted\n   */\n  function toValue(str, measurement, popperOffsets, referenceOffsets) {\n    // separate value from unit\n    var split = str.match(/((?:\\-|\\+)?\\d*\\.?\\d*)(.*)/);\n    var value = +split[1];\n    var unit = split[2];\n\n    // If it's not a number it's an operator, I guess\n    if (!value) {\n      return str;\n    }\n\n    if (unit.indexOf('%') === 0) {\n      var element = void 0;\n      switch (unit) {\n        case '%p':\n          element = popperOffsets;\n          break;\n        case '%':\n        case '%r':\n        default:\n          element = referenceOffsets;\n      }\n\n      var rect = getClientRect(element);\n      return rect[measurement] / 100 * value;\n    } else if (unit === 'vh' || unit === 'vw') {\n      // if is a vh or vw, we calculate the size based on the viewport\n      var size = void 0;\n      if (unit === 'vh') {\n        size = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);\n      } else {\n        size = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n      }\n      return size / 100 * value;\n    } else {\n      // if is an explicit pixel unit, we get rid of the unit and keep the value\n      // if is an implicit unit, it's px, and we return just the value\n      return value;\n    }\n  }\n\n  /**\n   * Parse an `offset` string to extrapolate `x` and `y` numeric offsets.\n   * @function\n   * @memberof {modifiers~offset}\n   * @private\n   * @argument {String} offset\n   * @argument {Object} popperOffsets\n   * @argument {Object} referenceOffsets\n   * @argument {String} basePlacement\n   * @returns {Array} a two cells array with x and y offsets in numbers\n   */\n  function parseOffset(offset, popperOffsets, referenceOffsets, basePlacement) {\n    var offsets = [0, 0];\n\n    // Use height if placement is left or right and index is 0 otherwise use width\n    // in this way the first offset will use an axis and the second one\n    // will use the other one\n    var useHeight = ['right', 'left'].indexOf(basePlacement) !== -1;\n\n    // Split the offset string to obtain a list of values and operands\n    // The regex addresses values with the plus or minus sign in front (+10, -20, etc)\n    var fragments = offset.split(/(\\+|\\-)/).map(function (frag) {\n      return frag.trim();\n    });\n\n    // Detect if the offset string contains a pair of values or a single one\n    // they could be separated by comma or space\n    var divider = fragments.indexOf(find(fragments, function (frag) {\n      return frag.search(/,|\\s/) !== -1;\n    }));\n\n    if (fragments[divider] && fragments[divider].indexOf(',') === -1) {\n      console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');\n    }\n\n    // If divider is found, we divide the list of values and operands to divide\n    // them by ofset X and Y.\n    var splitRegex = /\\s*,\\s*|\\s+/;\n    var ops = divider !== -1 ? [fragments.slice(0, divider).concat([fragments[divider].split(splitRegex)[0]]), [fragments[divider].split(splitRegex)[1]].concat(fragments.slice(divider + 1))] : [fragments];\n\n    // Convert the values with units to absolute pixels to allow our computations\n    ops = ops.map(function (op, index) {\n      // Most of the units rely on the orientation of the popper\n      var measurement = (index === 1 ? !useHeight : useHeight) ? 'height' : 'width';\n      var mergeWithPrevious = false;\n      return op\n      // This aggregates any `+` or `-` sign that aren't considered operators\n      // e.g.: 10 + +5 => [10, +, +5]\n      .reduce(function (a, b) {\n        if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) {\n          a[a.length - 1] = b;\n          mergeWithPrevious = true;\n          return a;\n        } else if (mergeWithPrevious) {\n          a[a.length - 1] += b;\n          mergeWithPrevious = false;\n          return a;\n        } else {\n          return a.concat(b);\n        }\n      }, [])\n      // Here we convert the string values into number values (in px)\n      .map(function (str) {\n        return toValue(str, measurement, popperOffsets, referenceOffsets);\n      });\n    });\n\n    // Loop trough the offsets arrays and execute the operations\n    ops.forEach(function (op, index) {\n      op.forEach(function (frag, index2) {\n        if (isNumeric(frag)) {\n          offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1);\n        }\n      });\n    });\n    return offsets;\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by update method\n   * @argument {Object} options - Modifiers configuration and options\n   * @argument {Number|String} options.offset=0\n   * The offset value as described in the modifier description\n   * @returns {Object} The data object, properly modified\n   */\n  function offset(data, _ref) {\n    var offset = _ref.offset;\n    var placement = data.placement,\n        _data$offsets = data.offsets,\n        popper = _data$offsets.popper,\n        reference = _data$offsets.reference;\n\n    var basePlacement = placement.split('-')[0];\n\n    var offsets = void 0;\n    if (isNumeric(+offset)) {\n      offsets = [+offset, 0];\n    } else {\n      offsets = parseOffset(offset, popper, reference, basePlacement);\n    }\n\n    if (basePlacement === 'left') {\n      popper.top += offsets[0];\n      popper.left -= offsets[1];\n    } else if (basePlacement === 'right') {\n      popper.top += offsets[0];\n      popper.left += offsets[1];\n    } else if (basePlacement === 'top') {\n      popper.left += offsets[0];\n      popper.top -= offsets[1];\n    } else if (basePlacement === 'bottom') {\n      popper.left += offsets[0];\n      popper.top += offsets[1];\n    }\n\n    data.popper = popper;\n    return data;\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by `update` method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function preventOverflow(data, options) {\n    var boundariesElement = options.boundariesElement || getOffsetParent(data.instance.popper);\n\n    // If offsetParent is the reference element, we really want to\n    // go one step up and use the next offsetParent as reference to\n    // avoid to make this modifier completely useless and look like broken\n    if (data.instance.reference === boundariesElement) {\n      boundariesElement = getOffsetParent(boundariesElement);\n    }\n\n    // NOTE: DOM access here\n    // resets the popper's position so that the document size can be calculated excluding\n    // the size of the popper element itself\n    var transformProp = getSupportedPropertyName('transform');\n    var popperStyles = data.instance.popper.style; // assignment to help minification\n    var top = popperStyles.top,\n        left = popperStyles.left,\n        transform = popperStyles[transformProp];\n\n    popperStyles.top = '';\n    popperStyles.left = '';\n    popperStyles[transformProp] = '';\n\n    var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement, data.positionFixed);\n\n    // NOTE: DOM access here\n    // restores the original style properties after the offsets have been computed\n    popperStyles.top = top;\n    popperStyles.left = left;\n    popperStyles[transformProp] = transform;\n\n    options.boundaries = boundaries;\n\n    var order = options.priority;\n    var popper = data.offsets.popper;\n\n    var check = {\n      primary: function primary(placement) {\n        var value = popper[placement];\n        if (popper[placement] < boundaries[placement] && !options.escapeWithReference) {\n          value = Math.max(popper[placement], boundaries[placement]);\n        }\n        return defineProperty({}, placement, value);\n      },\n      secondary: function secondary(placement) {\n        var mainSide = placement === 'right' ? 'left' : 'top';\n        var value = popper[mainSide];\n        if (popper[placement] > boundaries[placement] && !options.escapeWithReference) {\n          value = Math.min(popper[mainSide], boundaries[placement] - (placement === 'right' ? popper.width : popper.height));\n        }\n        return defineProperty({}, mainSide, value);\n      }\n    };\n\n    order.forEach(function (placement) {\n      var side = ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary';\n      popper = _extends({}, popper, check[side](placement));\n    });\n\n    data.offsets.popper = popper;\n\n    return data;\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by `update` method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function shift(data) {\n    var placement = data.placement;\n    var basePlacement = placement.split('-')[0];\n    var shiftvariation = placement.split('-')[1];\n\n    // if shift shiftvariation is specified, run the modifier\n    if (shiftvariation) {\n      var _data$offsets = data.offsets,\n          reference = _data$offsets.reference,\n          popper = _data$offsets.popper;\n\n      var isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1;\n      var side = isVertical ? 'left' : 'top';\n      var measurement = isVertical ? 'width' : 'height';\n\n      var shiftOffsets = {\n        start: defineProperty({}, side, reference[side]),\n        end: defineProperty({}, side, reference[side] + reference[measurement] - popper[measurement])\n      };\n\n      data.offsets.popper = _extends({}, popper, shiftOffsets[shiftvariation]);\n    }\n\n    return data;\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by update method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function hide(data) {\n    if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) {\n      return data;\n    }\n\n    var refRect = data.offsets.reference;\n    var bound = find(data.instance.modifiers, function (modifier) {\n      return modifier.name === 'preventOverflow';\n    }).boundaries;\n\n    if (refRect.bottom < bound.top || refRect.left > bound.right || refRect.top > bound.bottom || refRect.right < bound.left) {\n      // Avoid unnecessary DOM access if visibility hasn't changed\n      if (data.hide === true) {\n        return data;\n      }\n\n      data.hide = true;\n      data.attributes['x-out-of-boundaries'] = '';\n    } else {\n      // Avoid unnecessary DOM access if visibility hasn't changed\n      if (data.hide === false) {\n        return data;\n      }\n\n      data.hide = false;\n      data.attributes['x-out-of-boundaries'] = false;\n    }\n\n    return data;\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by `update` method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function inner(data) {\n    var placement = data.placement;\n    var basePlacement = placement.split('-')[0];\n    var _data$offsets = data.offsets,\n        popper = _data$offsets.popper,\n        reference = _data$offsets.reference;\n\n    var isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1;\n\n    var subtractLength = ['top', 'left'].indexOf(basePlacement) === -1;\n\n    popper[isHoriz ? 'left' : 'top'] = reference[basePlacement] - (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0);\n\n    data.placement = getOppositePlacement(placement);\n    data.offsets.popper = getClientRect(popper);\n\n    return data;\n  }\n\n  /**\n   * Modifier function, each modifier can have a function of this type assigned\n   * to its `fn` property.<br />\n   * These functions will be called on each update, this means that you must\n   * make sure they are performant enough to avoid performance bottlenecks.\n   *\n   * @function ModifierFn\n   * @argument {dataObject} data - The data object generated by `update` method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {dataObject} The data object, properly modified\n   */\n\n  /**\n   * Modifiers are plugins used to alter the behavior of your poppers.<br />\n   * Popper.js uses a set of 9 modifiers to provide all the basic functionalities\n   * needed by the library.\n   *\n   * Usually you don't want to override the `order`, `fn` and `onLoad` props.\n   * All the other properties are configurations that could be tweaked.\n   * @namespace modifiers\n   */\n  var modifiers = {\n    /**\n     * Modifier used to shift the popper on the start or end of its reference\n     * element.<br />\n     * It will read the variation of the `placement` property.<br />\n     * It can be one either `-end` or `-start`.\n     * @memberof modifiers\n     * @inner\n     */\n    shift: {\n      /** @prop {number} order=100 - Index used to define the order of execution */\n      order: 100,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: shift\n    },\n\n    /**\n     * The `offset` modifier can shift your popper on both its axis.\n     *\n     * It accepts the following units:\n     * - `px` or unit-less, interpreted as pixels\n     * - `%` or `%r`, percentage relative to the length of the reference element\n     * - `%p`, percentage relative to the length of the popper element\n     * - `vw`, CSS viewport width unit\n     * - `vh`, CSS viewport height unit\n     *\n     * For length is intended the main axis relative to the placement of the popper.<br />\n     * This means that if the placement is `top` or `bottom`, the length will be the\n     * `width`. In case of `left` or `right`, it will be the `height`.\n     *\n     * You can provide a single value (as `Number` or `String`), or a pair of values\n     * as `String` divided by a comma or one (or more) white spaces.<br />\n     * The latter is a deprecated method because it leads to confusion and will be\n     * removed in v2.<br />\n     * Additionally, it accepts additions and subtractions between different units.\n     * Note that multiplications and divisions aren't supported.\n     *\n     * Valid examples are:\n     * ```\n     * 10\n     * '10%'\n     * '10, 10'\n     * '10%, 10'\n     * '10 + 10%'\n     * '10 - 5vh + 3%'\n     * '-10px + 5vh, 5px - 6%'\n     * ```\n     * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap\n     * > with their reference element, unfortunately, you will have to disable the `flip` modifier.\n     * > You can read more on this at this [issue](https://github.com/FezVrasta/popper.js/issues/373).\n     *\n     * @memberof modifiers\n     * @inner\n     */\n    offset: {\n      /** @prop {number} order=200 - Index used to define the order of execution */\n      order: 200,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: offset,\n      /** @prop {Number|String} offset=0\n       * The offset value as described in the modifier description\n       */\n      offset: 0\n    },\n\n    /**\n     * Modifier used to prevent the popper from being positioned outside the boundary.\n     *\n     * A scenario exists where the reference itself is not within the boundaries.<br />\n     * We can say it has \"escaped the boundaries\" — or just \"escaped\".<br />\n     * In this case we need to decide whether the popper should either:\n     *\n     * - detach from the reference and remain \"trapped\" in the boundaries, or\n     * - if it should ignore the boundary and \"escape with its reference\"\n     *\n     * When `escapeWithReference` is set to`true` and reference is completely\n     * outside its boundaries, the popper will overflow (or completely leave)\n     * the boundaries in order to remain attached to the edge of the reference.\n     *\n     * @memberof modifiers\n     * @inner\n     */\n    preventOverflow: {\n      /** @prop {number} order=300 - Index used to define the order of execution */\n      order: 300,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: preventOverflow,\n      /**\n       * @prop {Array} [priority=['left','right','top','bottom']]\n       * Popper will try to prevent overflow following these priorities by default,\n       * then, it could overflow on the left and on top of the `boundariesElement`\n       */\n      priority: ['left', 'right', 'top', 'bottom'],\n      /**\n       * @prop {number} padding=5\n       * Amount of pixel used to define a minimum distance between the boundaries\n       * and the popper. This makes sure the popper always has a little padding\n       * between the edges of its container\n       */\n      padding: 5,\n      /**\n       * @prop {String|HTMLElement} boundariesElement='scrollParent'\n       * Boundaries used by the modifier. Can be `scrollParent`, `window`,\n       * `viewport` or any DOM element.\n       */\n      boundariesElement: 'scrollParent'\n    },\n\n    /**\n     * Modifier used to make sure the reference and its popper stay near each other\n     * without leaving any gap between the two. Especially useful when the arrow is\n     * enabled and you want to ensure that it points to its reference element.\n     * It cares only about the first axis. You can still have poppers with margin\n     * between the popper and its reference element.\n     * @memberof modifiers\n     * @inner\n     */\n    keepTogether: {\n      /** @prop {number} order=400 - Index used to define the order of execution */\n      order: 400,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: keepTogether\n    },\n\n    /**\n     * This modifier is used to move the `arrowElement` of the popper to make\n     * sure it is positioned between the reference element and its popper element.\n     * It will read the outer size of the `arrowElement` node to detect how many\n     * pixels of conjunction are needed.\n     *\n     * It has no effect if no `arrowElement` is provided.\n     * @memberof modifiers\n     * @inner\n     */\n    arrow: {\n      /** @prop {number} order=500 - Index used to define the order of execution */\n      order: 500,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: arrow,\n      /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */\n      element: '[x-arrow]'\n    },\n\n    /**\n     * Modifier used to flip the popper's placement when it starts to overlap its\n     * reference element.\n     *\n     * Requires the `preventOverflow` modifier before it in order to work.\n     *\n     * **NOTE:** this modifier will interrupt the current update cycle and will\n     * restart it if it detects the need to flip the placement.\n     * @memberof modifiers\n     * @inner\n     */\n    flip: {\n      /** @prop {number} order=600 - Index used to define the order of execution */\n      order: 600,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: flip,\n      /**\n       * @prop {String|Array} behavior='flip'\n       * The behavior used to change the popper's placement. It can be one of\n       * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid\n       * placements (with optional variations)\n       */\n      behavior: 'flip',\n      /**\n       * @prop {number} padding=5\n       * The popper will flip if it hits the edges of the `boundariesElement`\n       */\n      padding: 5,\n      /**\n       * @prop {String|HTMLElement} boundariesElement='viewport'\n       * The element which will define the boundaries of the popper position.\n       * The popper will never be placed outside of the defined boundaries\n       * (except if `keepTogether` is enabled)\n       */\n      boundariesElement: 'viewport'\n    },\n\n    /**\n     * Modifier used to make the popper flow toward the inner of the reference element.\n     * By default, when this modifier is disabled, the popper will be placed outside\n     * the reference element.\n     * @memberof modifiers\n     * @inner\n     */\n    inner: {\n      /** @prop {number} order=700 - Index used to define the order of execution */\n      order: 700,\n      /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */\n      enabled: false,\n      /** @prop {ModifierFn} */\n      fn: inner\n    },\n\n    /**\n     * Modifier used to hide the popper when its reference element is outside of the\n     * popper boundaries. It will set a `x-out-of-boundaries` attribute which can\n     * be used to hide with a CSS selector the popper when its reference is\n     * out of boundaries.\n     *\n     * Requires the `preventOverflow` modifier before it in order to work.\n     * @memberof modifiers\n     * @inner\n     */\n    hide: {\n      /** @prop {number} order=800 - Index used to define the order of execution */\n      order: 800,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: hide\n    },\n\n    /**\n     * Computes the style that will be applied to the popper element to gets\n     * properly positioned.\n     *\n     * Note that this modifier will not touch the DOM, it just prepares the styles\n     * so that `applyStyle` modifier can apply it. This separation is useful\n     * in case you need to replace `applyStyle` with a custom implementation.\n     *\n     * This modifier has `850` as `order` value to maintain backward compatibility\n     * with previous versions of Popper.js. Expect the modifiers ordering method\n     * to change in future major versions of the library.\n     *\n     * @memberof modifiers\n     * @inner\n     */\n    computeStyle: {\n      /** @prop {number} order=850 - Index used to define the order of execution */\n      order: 850,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: computeStyle,\n      /**\n       * @prop {Boolean} gpuAcceleration=true\n       * If true, it uses the CSS 3D transformation to position the popper.\n       * Otherwise, it will use the `top` and `left` properties\n       */\n      gpuAcceleration: true,\n      /**\n       * @prop {string} [x='bottom']\n       * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin.\n       * Change this if your popper should grow in a direction different from `bottom`\n       */\n      x: 'bottom',\n      /**\n       * @prop {string} [x='left']\n       * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin.\n       * Change this if your popper should grow in a direction different from `right`\n       */\n      y: 'right'\n    },\n\n    /**\n     * Applies the computed styles to the popper element.\n     *\n     * All the DOM manipulations are limited to this modifier. This is useful in case\n     * you want to integrate Popper.js inside a framework or view library and you\n     * want to delegate all the DOM manipulations to it.\n     *\n     * Note that if you disable this modifier, you must make sure the popper element\n     * has its position set to `absolute` before Popper.js can do its work!\n     *\n     * Just disable this modifier and define your own to achieve the desired effect.\n     *\n     * @memberof modifiers\n     * @inner\n     */\n    applyStyle: {\n      /** @prop {number} order=900 - Index used to define the order of execution */\n      order: 900,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: applyStyle,\n      /** @prop {Function} */\n      onLoad: applyStyleOnLoad,\n      /**\n       * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier\n       * @prop {Boolean} gpuAcceleration=true\n       * If true, it uses the CSS 3D transformation to position the popper.\n       * Otherwise, it will use the `top` and `left` properties\n       */\n      gpuAcceleration: undefined\n    }\n  };\n\n  /**\n   * The `dataObject` is an object containing all the information used by Popper.js.\n   * This object is passed to modifiers and to the `onCreate` and `onUpdate` callbacks.\n   * @name dataObject\n   * @property {Object} data.instance The Popper.js instance\n   * @property {String} data.placement Placement applied to popper\n   * @property {String} data.originalPlacement Placement originally defined on init\n   * @property {Boolean} data.flipped True if popper has been flipped by flip modifier\n   * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper\n   * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier\n   * @property {Object} data.styles Any CSS property defined here will be applied to the popper. It expects the JavaScript nomenclature (eg. `marginBottom`)\n   * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow. It expects the JavaScript nomenclature (eg. `marginBottom`)\n   * @property {Object} data.boundaries Offsets of the popper boundaries\n   * @property {Object} data.offsets The measurements of popper, reference and arrow elements\n   * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values\n   * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values\n   * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0\n   */\n\n  /**\n   * Default options provided to Popper.js constructor.<br />\n   * These can be overridden using the `options` argument of Popper.js.<br />\n   * To override an option, simply pass an object with the same\n   * structure of the `options` object, as the 3rd argument. For example:\n   * ```\n   * new Popper(ref, pop, {\n   *   modifiers: {\n   *     preventOverflow: { enabled: false }\n   *   }\n   * })\n   * ```\n   * @type {Object}\n   * @static\n   * @memberof Popper\n   */\n  var Defaults = {\n    /**\n     * Popper's placement.\n     * @prop {Popper.placements} placement='bottom'\n     */\n    placement: 'bottom',\n\n    /**\n     * Set this to true if you want popper to position it self in 'fixed' mode\n     * @prop {Boolean} positionFixed=false\n     */\n    positionFixed: false,\n\n    /**\n     * Whether events (resize, scroll) are initially enabled.\n     * @prop {Boolean} eventsEnabled=true\n     */\n    eventsEnabled: true,\n\n    /**\n     * Set to true if you want to automatically remove the popper when\n     * you call the `destroy` method.\n     * @prop {Boolean} removeOnDestroy=false\n     */\n    removeOnDestroy: false,\n\n    /**\n     * Callback called when the popper is created.<br />\n     * By default, it is set to no-op.<br />\n     * Access Popper.js instance with `data.instance`.\n     * @prop {onCreate}\n     */\n    onCreate: function onCreate() {},\n\n    /**\n     * Callback called when the popper is updated. This callback is not called\n     * on the initialization/creation of the popper, but only on subsequent\n     * updates.<br />\n     * By default, it is set to no-op.<br />\n     * Access Popper.js instance with `data.instance`.\n     * @prop {onUpdate}\n     */\n    onUpdate: function onUpdate() {},\n\n    /**\n     * List of modifiers used to modify the offsets before they are applied to the popper.\n     * They provide most of the functionalities of Popper.js.\n     * @prop {modifiers}\n     */\n    modifiers: modifiers\n  };\n\n  /**\n   * @callback onCreate\n   * @param {dataObject} data\n   */\n\n  /**\n   * @callback onUpdate\n   * @param {dataObject} data\n   */\n\n  // Utils\n  // Methods\n  var Popper = function () {\n    /**\n     * Creates a new Popper.js instance.\n     * @class Popper\n     * @param {HTMLElement|referenceObject} reference - The reference element used to position the popper\n     * @param {HTMLElement} popper - The HTML element used as the popper\n     * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)\n     * @return {Object} instance - The generated Popper.js instance\n     */\n    function Popper(reference, popper) {\n      var _this = this;\n\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      classCallCheck(this, Popper);\n\n      this.scheduleUpdate = function () {\n        return requestAnimationFrame(_this.update);\n      };\n\n      // make update() debounced, so that it only runs at most once-per-tick\n      this.update = debounce(this.update.bind(this));\n\n      // with {} we create a new object with the options inside it\n      this.options = _extends({}, Popper.Defaults, options);\n\n      // init state\n      this.state = {\n        isDestroyed: false,\n        isCreated: false,\n        scrollParents: []\n      };\n\n      // get reference and popper elements (allow jQuery wrappers)\n      this.reference = reference && reference.jquery ? reference[0] : reference;\n      this.popper = popper && popper.jquery ? popper[0] : popper;\n\n      // Deep merge modifiers options\n      this.options.modifiers = {};\n      Object.keys(_extends({}, Popper.Defaults.modifiers, options.modifiers)).forEach(function (name) {\n        _this.options.modifiers[name] = _extends({}, Popper.Defaults.modifiers[name] || {}, options.modifiers ? options.modifiers[name] : {});\n      });\n\n      // Refactoring modifiers' list (Object => Array)\n      this.modifiers = Object.keys(this.options.modifiers).map(function (name) {\n        return _extends({\n          name: name\n        }, _this.options.modifiers[name]);\n      })\n      // sort the modifiers by order\n      .sort(function (a, b) {\n        return a.order - b.order;\n      });\n\n      // modifiers have the ability to execute arbitrary code when Popper.js get inited\n      // such code is executed in the same order of its modifier\n      // they could add new properties to their options configuration\n      // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`!\n      this.modifiers.forEach(function (modifierOptions) {\n        if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) {\n          modifierOptions.onLoad(_this.reference, _this.popper, _this.options, modifierOptions, _this.state);\n        }\n      });\n\n      // fire the first update to position the popper in the right place\n      this.update();\n\n      var eventsEnabled = this.options.eventsEnabled;\n      if (eventsEnabled) {\n        // setup event listeners, they will take care of update the position in specific situations\n        this.enableEventListeners();\n      }\n\n      this.state.eventsEnabled = eventsEnabled;\n    }\n\n    // We can't use class properties because they don't get listed in the\n    // class prototype and break stuff like Sinon stubs\n\n\n    createClass(Popper, [{\n      key: 'update',\n      value: function update$$1() {\n        return update.call(this);\n      }\n    }, {\n      key: 'destroy',\n      value: function destroy$$1() {\n        return destroy.call(this);\n      }\n    }, {\n      key: 'enableEventListeners',\n      value: function enableEventListeners$$1() {\n        return enableEventListeners.call(this);\n      }\n    }, {\n      key: 'disableEventListeners',\n      value: function disableEventListeners$$1() {\n        return disableEventListeners.call(this);\n      }\n\n      /**\n       * Schedules an update. It will run on the next UI update available.\n       * @method scheduleUpdate\n       * @memberof Popper\n       */\n\n\n      /**\n       * Collection of utilities useful when writing custom modifiers.\n       * Starting from version 1.7, this method is available only if you\n       * include `popper-utils.js` before `popper.js`.\n       *\n       * **DEPRECATION**: This way to access PopperUtils is deprecated\n       * and will be removed in v2! Use the PopperUtils module directly instead.\n       * Due to the high instability of the methods contained in Utils, we can't\n       * guarantee them to follow semver. Use them at your own risk!\n       * @static\n       * @private\n       * @type {Object}\n       * @deprecated since version 1.8\n       * @member Utils\n       * @memberof Popper\n       */\n\n    }]);\n    return Popper;\n  }();\n\n  /**\n   * The `referenceObject` is an object that provides an interface compatible with Popper.js\n   * and lets you use it as replacement of a real DOM node.<br />\n   * You can use this method to position a popper relatively to a set of coordinates\n   * in case you don't have a DOM node to use as reference.\n   *\n   * ```\n   * new Popper(referenceObject, popperNode);\n   * ```\n   *\n   * NB: This feature isn't supported in Internet Explorer 10.\n   * @name referenceObject\n   * @property {Function} data.getBoundingClientRect\n   * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method.\n   * @property {number} data.clientWidth\n   * An ES6 getter that will return the width of the virtual reference element.\n   * @property {number} data.clientHeight\n   * An ES6 getter that will return the height of the virtual reference element.\n   */\n\n\n  Popper.Utils = (typeof window !== 'undefined' ? window : global).PopperUtils;\n  Popper.placements = placements;\n  Popper.Defaults = Defaults;\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$4 = 'dropdown';\n  var VERSION$4 = '4.3.1';\n  var DATA_KEY$4 = 'bs.dropdown';\n  var EVENT_KEY$4 = \".\" + DATA_KEY$4;\n  var DATA_API_KEY$4 = '.data-api';\n  var JQUERY_NO_CONFLICT$4 = $.fn[NAME$4];\n  var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key\n\n  var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key\n\n  var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key\n\n  var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key\n\n  var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key\n\n  var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)\n\n  var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + \"|\" + ARROW_DOWN_KEYCODE + \"|\" + ESCAPE_KEYCODE);\n  var Event$4 = {\n    HIDE: \"hide\" + EVENT_KEY$4,\n    HIDDEN: \"hidden\" + EVENT_KEY$4,\n    SHOW: \"show\" + EVENT_KEY$4,\n    SHOWN: \"shown\" + EVENT_KEY$4,\n    CLICK: \"click\" + EVENT_KEY$4,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$4 + DATA_API_KEY$4,\n    KEYDOWN_DATA_API: \"keydown\" + EVENT_KEY$4 + DATA_API_KEY$4,\n    KEYUP_DATA_API: \"keyup\" + EVENT_KEY$4 + DATA_API_KEY$4\n  };\n  var ClassName$4 = {\n    DISABLED: 'disabled',\n    SHOW: 'show',\n    DROPUP: 'dropup',\n    DROPRIGHT: 'dropright',\n    DROPLEFT: 'dropleft',\n    MENURIGHT: 'dropdown-menu-right',\n    MENULEFT: 'dropdown-menu-left',\n    POSITION_STATIC: 'position-static'\n  };\n  var Selector$4 = {\n    DATA_TOGGLE: '[data-toggle=\"dropdown\"]',\n    FORM_CHILD: '.dropdown form',\n    MENU: '.dropdown-menu',\n    NAVBAR_NAV: '.navbar-nav',\n    VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n  };\n  var AttachmentMap = {\n    TOP: 'top-start',\n    TOPEND: 'top-end',\n    BOTTOM: 'bottom-start',\n    BOTTOMEND: 'bottom-end',\n    RIGHT: 'right-start',\n    RIGHTEND: 'right-end',\n    LEFT: 'left-start',\n    LEFTEND: 'left-end'\n  };\n  var Default$2 = {\n    offset: 0,\n    flip: true,\n    boundary: 'scrollParent',\n    reference: 'toggle',\n    display: 'dynamic'\n  };\n  var DefaultType$2 = {\n    offset: '(number|string|function)',\n    flip: 'boolean',\n    boundary: '(string|element)',\n    reference: '(string|element)',\n    display: 'string'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Dropdown =\n  /*#__PURE__*/\n  function () {\n    function Dropdown(element, config) {\n      this._element = element;\n      this._popper = null;\n      this._config = this._getConfig(config);\n      this._menu = this._getMenuElement();\n      this._inNavbar = this._detectNavbar();\n\n      this._addEventListeners();\n    } // Getters\n\n\n    var _proto = Dropdown.prototype;\n\n    // Public\n    _proto.toggle = function toggle() {\n      if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED)) {\n        return;\n      }\n\n      var parent = Dropdown._getParentFromElement(this._element);\n\n      var isActive = $(this._menu).hasClass(ClassName$4.SHOW);\n\n      Dropdown._clearMenus();\n\n      if (isActive) {\n        return;\n      }\n\n      var relatedTarget = {\n        relatedTarget: this._element\n      };\n      var showEvent = $.Event(Event$4.SHOW, relatedTarget);\n      $(parent).trigger(showEvent);\n\n      if (showEvent.isDefaultPrevented()) {\n        return;\n      } // Disable totally Popper.js for Dropdown in Navbar\n\n\n      if (!this._inNavbar) {\n        /**\n         * Check for Popper dependency\n         * Popper - https://popper.js.org\n         */\n        if (typeof Popper === 'undefined') {\n          throw new TypeError('Bootstrap\\'s dropdowns require Popper.js (https://popper.js.org/)');\n        }\n\n        var referenceElement = this._element;\n\n        if (this._config.reference === 'parent') {\n          referenceElement = parent;\n        } else if (Util.isElement(this._config.reference)) {\n          referenceElement = this._config.reference; // Check if it's jQuery element\n\n          if (typeof this._config.reference.jquery !== 'undefined') {\n            referenceElement = this._config.reference[0];\n          }\n        } // If boundary is not `scrollParent`, then set position to `static`\n        // to allow the menu to \"escape\" the scroll parent's boundaries\n        // https://github.com/twbs/bootstrap/issues/24251\n\n\n        if (this._config.boundary !== 'scrollParent') {\n          $(parent).addClass(ClassName$4.POSITION_STATIC);\n        }\n\n        this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig());\n      } // If this is a touch-enabled device we add extra\n      // empty mouseover listeners to the body's immediate children;\n      // only needed because of broken event delegation on iOS\n      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n\n      if ('ontouchstart' in document.documentElement && $(parent).closest(Selector$4.NAVBAR_NAV).length === 0) {\n        $(document.body).children().on('mouseover', null, $.noop);\n      }\n\n      this._element.focus();\n\n      this._element.setAttribute('aria-expanded', true);\n\n      $(this._menu).toggleClass(ClassName$4.SHOW);\n      $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget));\n    };\n\n    _proto.show = function show() {\n      if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || $(this._menu).hasClass(ClassName$4.SHOW)) {\n        return;\n      }\n\n      var relatedTarget = {\n        relatedTarget: this._element\n      };\n      var showEvent = $.Event(Event$4.SHOW, relatedTarget);\n\n      var parent = Dropdown._getParentFromElement(this._element);\n\n      $(parent).trigger(showEvent);\n\n      if (showEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      $(this._menu).toggleClass(ClassName$4.SHOW);\n      $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget));\n    };\n\n    _proto.hide = function hide() {\n      if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || !$(this._menu).hasClass(ClassName$4.SHOW)) {\n        return;\n      }\n\n      var relatedTarget = {\n        relatedTarget: this._element\n      };\n      var hideEvent = $.Event(Event$4.HIDE, relatedTarget);\n\n      var parent = Dropdown._getParentFromElement(this._element);\n\n      $(parent).trigger(hideEvent);\n\n      if (hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      $(this._menu).toggleClass(ClassName$4.SHOW);\n      $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$4);\n      $(this._element).off(EVENT_KEY$4);\n      this._element = null;\n      this._menu = null;\n\n      if (this._popper !== null) {\n        this._popper.destroy();\n\n        this._popper = null;\n      }\n    };\n\n    _proto.update = function update() {\n      this._inNavbar = this._detectNavbar();\n\n      if (this._popper !== null) {\n        this._popper.scheduleUpdate();\n      }\n    } // Private\n    ;\n\n    _proto._addEventListeners = function _addEventListeners() {\n      var _this = this;\n\n      $(this._element).on(Event$4.CLICK, function (event) {\n        event.preventDefault();\n        event.stopPropagation();\n\n        _this.toggle();\n      });\n    };\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, this.constructor.Default, $(this._element).data(), config);\n      Util.typeCheckConfig(NAME$4, config, this.constructor.DefaultType);\n      return config;\n    };\n\n    _proto._getMenuElement = function _getMenuElement() {\n      if (!this._menu) {\n        var parent = Dropdown._getParentFromElement(this._element);\n\n        if (parent) {\n          this._menu = parent.querySelector(Selector$4.MENU);\n        }\n      }\n\n      return this._menu;\n    };\n\n    _proto._getPlacement = function _getPlacement() {\n      var $parentDropdown = $(this._element.parentNode);\n      var placement = AttachmentMap.BOTTOM; // Handle dropup\n\n      if ($parentDropdown.hasClass(ClassName$4.DROPUP)) {\n        placement = AttachmentMap.TOP;\n\n        if ($(this._menu).hasClass(ClassName$4.MENURIGHT)) {\n          placement = AttachmentMap.TOPEND;\n        }\n      } else if ($parentDropdown.hasClass(ClassName$4.DROPRIGHT)) {\n        placement = AttachmentMap.RIGHT;\n      } else if ($parentDropdown.hasClass(ClassName$4.DROPLEFT)) {\n        placement = AttachmentMap.LEFT;\n      } else if ($(this._menu).hasClass(ClassName$4.MENURIGHT)) {\n        placement = AttachmentMap.BOTTOMEND;\n      }\n\n      return placement;\n    };\n\n    _proto._detectNavbar = function _detectNavbar() {\n      return $(this._element).closest('.navbar').length > 0;\n    };\n\n    _proto._getOffset = function _getOffset() {\n      var _this2 = this;\n\n      var offset = {};\n\n      if (typeof this._config.offset === 'function') {\n        offset.fn = function (data) {\n          data.offsets = _objectSpread({}, data.offsets, _this2._config.offset(data.offsets, _this2._element) || {});\n          return data;\n        };\n      } else {\n        offset.offset = this._config.offset;\n      }\n\n      return offset;\n    };\n\n    _proto._getPopperConfig = function _getPopperConfig() {\n      var popperConfig = {\n        placement: this._getPlacement(),\n        modifiers: {\n          offset: this._getOffset(),\n          flip: {\n            enabled: this._config.flip\n          },\n          preventOverflow: {\n            boundariesElement: this._config.boundary\n          }\n        } // Disable Popper.js if we have a static display\n\n      };\n\n      if (this._config.display === 'static') {\n        popperConfig.modifiers.applyStyle = {\n          enabled: false\n        };\n      }\n\n      return popperConfig;\n    } // Static\n    ;\n\n    Dropdown._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$4);\n\n        var _config = typeof config === 'object' ? config : null;\n\n        if (!data) {\n          data = new Dropdown(this, _config);\n          $(this).data(DATA_KEY$4, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    Dropdown._clearMenus = function _clearMenus(event) {\n      if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) {\n        return;\n      }\n\n      var toggles = [].slice.call(document.querySelectorAll(Selector$4.DATA_TOGGLE));\n\n      for (var i = 0, len = toggles.length; i < len; i++) {\n        var parent = Dropdown._getParentFromElement(toggles[i]);\n\n        var context = $(toggles[i]).data(DATA_KEY$4);\n        var relatedTarget = {\n          relatedTarget: toggles[i]\n        };\n\n        if (event && event.type === 'click') {\n          relatedTarget.clickEvent = event;\n        }\n\n        if (!context) {\n          continue;\n        }\n\n        var dropdownMenu = context._menu;\n\n        if (!$(parent).hasClass(ClassName$4.SHOW)) {\n          continue;\n        }\n\n        if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $.contains(parent, event.target)) {\n          continue;\n        }\n\n        var hideEvent = $.Event(Event$4.HIDE, relatedTarget);\n        $(parent).trigger(hideEvent);\n\n        if (hideEvent.isDefaultPrevented()) {\n          continue;\n        } // If this is a touch-enabled device we remove the extra\n        // empty mouseover listeners we added for iOS support\n\n\n        if ('ontouchstart' in document.documentElement) {\n          $(document.body).children().off('mouseover', null, $.noop);\n        }\n\n        toggles[i].setAttribute('aria-expanded', 'false');\n        $(dropdownMenu).removeClass(ClassName$4.SHOW);\n        $(parent).removeClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));\n      }\n    };\n\n    Dropdown._getParentFromElement = function _getParentFromElement(element) {\n      var parent;\n      var selector = Util.getSelectorFromElement(element);\n\n      if (selector) {\n        parent = document.querySelector(selector);\n      }\n\n      return parent || element.parentNode;\n    } // eslint-disable-next-line complexity\n    ;\n\n    Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {\n      // If not input/textarea:\n      //  - And not a key in REGEXP_KEYDOWN => not a dropdown command\n      // If input/textarea:\n      //  - If space key => not a dropdown command\n      //  - If key is other than escape\n      //    - If key is not up or down => not a dropdown command\n      //    - If trigger inside the menu => not a dropdown command\n      if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $(event.target).closest(Selector$4.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {\n        return;\n      }\n\n      event.preventDefault();\n      event.stopPropagation();\n\n      if (this.disabled || $(this).hasClass(ClassName$4.DISABLED)) {\n        return;\n      }\n\n      var parent = Dropdown._getParentFromElement(this);\n\n      var isActive = $(parent).hasClass(ClassName$4.SHOW);\n\n      if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {\n        if (event.which === ESCAPE_KEYCODE) {\n          var toggle = parent.querySelector(Selector$4.DATA_TOGGLE);\n          $(toggle).trigger('focus');\n        }\n\n        $(this).trigger('click');\n        return;\n      }\n\n      var items = [].slice.call(parent.querySelectorAll(Selector$4.VISIBLE_ITEMS));\n\n      if (items.length === 0) {\n        return;\n      }\n\n      var index = items.indexOf(event.target);\n\n      if (event.which === ARROW_UP_KEYCODE && index > 0) {\n        // Up\n        index--;\n      }\n\n      if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {\n        // Down\n        index++;\n      }\n\n      if (index < 0) {\n        index = 0;\n      }\n\n      items[index].focus();\n    };\n\n    _createClass(Dropdown, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$4;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$2;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType$2;\n      }\n    }]);\n\n    return Dropdown;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$4.KEYDOWN_DATA_API, Selector$4.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event$4.KEYDOWN_DATA_API, Selector$4.MENU, Dropdown._dataApiKeydownHandler).on(Event$4.CLICK_DATA_API + \" \" + Event$4.KEYUP_DATA_API, Dropdown._clearMenus).on(Event$4.CLICK_DATA_API, Selector$4.DATA_TOGGLE, function (event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    Dropdown._jQueryInterface.call($(this), 'toggle');\n  }).on(Event$4.CLICK_DATA_API, Selector$4.FORM_CHILD, function (e) {\n    e.stopPropagation();\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$4] = Dropdown._jQueryInterface;\n  $.fn[NAME$4].Constructor = Dropdown;\n\n  $.fn[NAME$4].noConflict = function () {\n    $.fn[NAME$4] = JQUERY_NO_CONFLICT$4;\n    return Dropdown._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$5 = 'modal';\n  var VERSION$5 = '4.3.1';\n  var DATA_KEY$5 = 'bs.modal';\n  var EVENT_KEY$5 = \".\" + DATA_KEY$5;\n  var DATA_API_KEY$5 = '.data-api';\n  var JQUERY_NO_CONFLICT$5 = $.fn[NAME$5];\n  var ESCAPE_KEYCODE$1 = 27; // KeyboardEvent.which value for Escape (Esc) key\n\n  var Default$3 = {\n    backdrop: true,\n    keyboard: true,\n    focus: true,\n    show: true\n  };\n  var DefaultType$3 = {\n    backdrop: '(boolean|string)',\n    keyboard: 'boolean',\n    focus: 'boolean',\n    show: 'boolean'\n  };\n  var Event$5 = {\n    HIDE: \"hide\" + EVENT_KEY$5,\n    HIDDEN: \"hidden\" + EVENT_KEY$5,\n    SHOW: \"show\" + EVENT_KEY$5,\n    SHOWN: \"shown\" + EVENT_KEY$5,\n    FOCUSIN: \"focusin\" + EVENT_KEY$5,\n    RESIZE: \"resize\" + EVENT_KEY$5,\n    CLICK_DISMISS: \"click.dismiss\" + EVENT_KEY$5,\n    KEYDOWN_DISMISS: \"keydown.dismiss\" + EVENT_KEY$5,\n    MOUSEUP_DISMISS: \"mouseup.dismiss\" + EVENT_KEY$5,\n    MOUSEDOWN_DISMISS: \"mousedown.dismiss\" + EVENT_KEY$5,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$5 + DATA_API_KEY$5\n  };\n  var ClassName$5 = {\n    SCROLLABLE: 'modal-dialog-scrollable',\n    SCROLLBAR_MEASURER: 'modal-scrollbar-measure',\n    BACKDROP: 'modal-backdrop',\n    OPEN: 'modal-open',\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector$5 = {\n    DIALOG: '.modal-dialog',\n    MODAL_BODY: '.modal-body',\n    DATA_TOGGLE: '[data-toggle=\"modal\"]',\n    DATA_DISMISS: '[data-dismiss=\"modal\"]',\n    FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',\n    STICKY_CONTENT: '.sticky-top'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Modal =\n  /*#__PURE__*/\n  function () {\n    function Modal(element, config) {\n      this._config = this._getConfig(config);\n      this._element = element;\n      this._dialog = element.querySelector(Selector$5.DIALOG);\n      this._backdrop = null;\n      this._isShown = false;\n      this._isBodyOverflowing = false;\n      this._ignoreBackdropClick = false;\n      this._isTransitioning = false;\n      this._scrollbarWidth = 0;\n    } // Getters\n\n\n    var _proto = Modal.prototype;\n\n    // Public\n    _proto.toggle = function toggle(relatedTarget) {\n      return this._isShown ? this.hide() : this.show(relatedTarget);\n    };\n\n    _proto.show = function show(relatedTarget) {\n      var _this = this;\n\n      if (this._isShown || this._isTransitioning) {\n        return;\n      }\n\n      if ($(this._element).hasClass(ClassName$5.FADE)) {\n        this._isTransitioning = true;\n      }\n\n      var showEvent = $.Event(Event$5.SHOW, {\n        relatedTarget: relatedTarget\n      });\n      $(this._element).trigger(showEvent);\n\n      if (this._isShown || showEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      this._isShown = true;\n\n      this._checkScrollbar();\n\n      this._setScrollbar();\n\n      this._adjustDialog();\n\n      this._setEscapeEvent();\n\n      this._setResizeEvent();\n\n      $(this._element).on(Event$5.CLICK_DISMISS, Selector$5.DATA_DISMISS, function (event) {\n        return _this.hide(event);\n      });\n      $(this._dialog).on(Event$5.MOUSEDOWN_DISMISS, function () {\n        $(_this._element).one(Event$5.MOUSEUP_DISMISS, function (event) {\n          if ($(event.target).is(_this._element)) {\n            _this._ignoreBackdropClick = true;\n          }\n        });\n      });\n\n      this._showBackdrop(function () {\n        return _this._showElement(relatedTarget);\n      });\n    };\n\n    _proto.hide = function hide(event) {\n      var _this2 = this;\n\n      if (event) {\n        event.preventDefault();\n      }\n\n      if (!this._isShown || this._isTransitioning) {\n        return;\n      }\n\n      var hideEvent = $.Event(Event$5.HIDE);\n      $(this._element).trigger(hideEvent);\n\n      if (!this._isShown || hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      this._isShown = false;\n      var transition = $(this._element).hasClass(ClassName$5.FADE);\n\n      if (transition) {\n        this._isTransitioning = true;\n      }\n\n      this._setEscapeEvent();\n\n      this._setResizeEvent();\n\n      $(document).off(Event$5.FOCUSIN);\n      $(this._element).removeClass(ClassName$5.SHOW);\n      $(this._element).off(Event$5.CLICK_DISMISS);\n      $(this._dialog).off(Event$5.MOUSEDOWN_DISMISS);\n\n      if (transition) {\n        var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n        $(this._element).one(Util.TRANSITION_END, function (event) {\n          return _this2._hideModal(event);\n        }).emulateTransitionEnd(transitionDuration);\n      } else {\n        this._hideModal();\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      [window, this._element, this._dialog].forEach(function (htmlElement) {\n        return $(htmlElement).off(EVENT_KEY$5);\n      });\n      /**\n       * `document` has 2 events `Event.FOCUSIN` and `Event.CLICK_DATA_API`\n       * Do not move `document` in `htmlElements` array\n       * It will remove `Event.CLICK_DATA_API` event that should remain\n       */\n\n      $(document).off(Event$5.FOCUSIN);\n      $.removeData(this._element, DATA_KEY$5);\n      this._config = null;\n      this._element = null;\n      this._dialog = null;\n      this._backdrop = null;\n      this._isShown = null;\n      this._isBodyOverflowing = null;\n      this._ignoreBackdropClick = null;\n      this._isTransitioning = null;\n      this._scrollbarWidth = null;\n    };\n\n    _proto.handleUpdate = function handleUpdate() {\n      this._adjustDialog();\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default$3, config);\n      Util.typeCheckConfig(NAME$5, config, DefaultType$3);\n      return config;\n    };\n\n    _proto._showElement = function _showElement(relatedTarget) {\n      var _this3 = this;\n\n      var transition = $(this._element).hasClass(ClassName$5.FADE);\n\n      if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n        // Don't move modal's DOM position\n        document.body.appendChild(this._element);\n      }\n\n      this._element.style.display = 'block';\n\n      this._element.removeAttribute('aria-hidden');\n\n      this._element.setAttribute('aria-modal', true);\n\n      if ($(this._dialog).hasClass(ClassName$5.SCROLLABLE)) {\n        this._dialog.querySelector(Selector$5.MODAL_BODY).scrollTop = 0;\n      } else {\n        this._element.scrollTop = 0;\n      }\n\n      if (transition) {\n        Util.reflow(this._element);\n      }\n\n      $(this._element).addClass(ClassName$5.SHOW);\n\n      if (this._config.focus) {\n        this._enforceFocus();\n      }\n\n      var shownEvent = $.Event(Event$5.SHOWN, {\n        relatedTarget: relatedTarget\n      });\n\n      var transitionComplete = function transitionComplete() {\n        if (_this3._config.focus) {\n          _this3._element.focus();\n        }\n\n        _this3._isTransitioning = false;\n        $(_this3._element).trigger(shownEvent);\n      };\n\n      if (transition) {\n        var transitionDuration = Util.getTransitionDurationFromElement(this._dialog);\n        $(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(transitionDuration);\n      } else {\n        transitionComplete();\n      }\n    };\n\n    _proto._enforceFocus = function _enforceFocus() {\n      var _this4 = this;\n\n      $(document).off(Event$5.FOCUSIN) // Guard against infinite focus loop\n      .on(Event$5.FOCUSIN, function (event) {\n        if (document !== event.target && _this4._element !== event.target && $(_this4._element).has(event.target).length === 0) {\n          _this4._element.focus();\n        }\n      });\n    };\n\n    _proto._setEscapeEvent = function _setEscapeEvent() {\n      var _this5 = this;\n\n      if (this._isShown && this._config.keyboard) {\n        $(this._element).on(Event$5.KEYDOWN_DISMISS, function (event) {\n          if (event.which === ESCAPE_KEYCODE$1) {\n            event.preventDefault();\n\n            _this5.hide();\n          }\n        });\n      } else if (!this._isShown) {\n        $(this._element).off(Event$5.KEYDOWN_DISMISS);\n      }\n    };\n\n    _proto._setResizeEvent = function _setResizeEvent() {\n      var _this6 = this;\n\n      if (this._isShown) {\n        $(window).on(Event$5.RESIZE, function (event) {\n          return _this6.handleUpdate(event);\n        });\n      } else {\n        $(window).off(Event$5.RESIZE);\n      }\n    };\n\n    _proto._hideModal = function _hideModal() {\n      var _this7 = this;\n\n      this._element.style.display = 'none';\n\n      this._element.setAttribute('aria-hidden', true);\n\n      this._element.removeAttribute('aria-modal');\n\n      this._isTransitioning = false;\n\n      this._showBackdrop(function () {\n        $(document.body).removeClass(ClassName$5.OPEN);\n\n        _this7._resetAdjustments();\n\n        _this7._resetScrollbar();\n\n        $(_this7._element).trigger(Event$5.HIDDEN);\n      });\n    };\n\n    _proto._removeBackdrop = function _removeBackdrop() {\n      if (this._backdrop) {\n        $(this._backdrop).remove();\n        this._backdrop = null;\n      }\n    };\n\n    _proto._showBackdrop = function _showBackdrop(callback) {\n      var _this8 = this;\n\n      var animate = $(this._element).hasClass(ClassName$5.FADE) ? ClassName$5.FADE : '';\n\n      if (this._isShown && this._config.backdrop) {\n        this._backdrop = document.createElement('div');\n        this._backdrop.className = ClassName$5.BACKDROP;\n\n        if (animate) {\n          this._backdrop.classList.add(animate);\n        }\n\n        $(this._backdrop).appendTo(document.body);\n        $(this._element).on(Event$5.CLICK_DISMISS, function (event) {\n          if (_this8._ignoreBackdropClick) {\n            _this8._ignoreBackdropClick = false;\n            return;\n          }\n\n          if (event.target !== event.currentTarget) {\n            return;\n          }\n\n          if (_this8._config.backdrop === 'static') {\n            _this8._element.focus();\n          } else {\n            _this8.hide();\n          }\n        });\n\n        if (animate) {\n          Util.reflow(this._backdrop);\n        }\n\n        $(this._backdrop).addClass(ClassName$5.SHOW);\n\n        if (!callback) {\n          return;\n        }\n\n        if (!animate) {\n          callback();\n          return;\n        }\n\n        var backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);\n        $(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(backdropTransitionDuration);\n      } else if (!this._isShown && this._backdrop) {\n        $(this._backdrop).removeClass(ClassName$5.SHOW);\n\n        var callbackRemove = function callbackRemove() {\n          _this8._removeBackdrop();\n\n          if (callback) {\n            callback();\n          }\n        };\n\n        if ($(this._element).hasClass(ClassName$5.FADE)) {\n          var _backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);\n\n          $(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(_backdropTransitionDuration);\n        } else {\n          callbackRemove();\n        }\n      } else if (callback) {\n        callback();\n      }\n    } // ----------------------------------------------------------------------\n    // the following methods are used to handle overflowing modals\n    // todo (fat): these should probably be refactored out of modal.js\n    // ----------------------------------------------------------------------\n    ;\n\n    _proto._adjustDialog = function _adjustDialog() {\n      var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n\n      if (!this._isBodyOverflowing && isModalOverflowing) {\n        this._element.style.paddingLeft = this._scrollbarWidth + \"px\";\n      }\n\n      if (this._isBodyOverflowing && !isModalOverflowing) {\n        this._element.style.paddingRight = this._scrollbarWidth + \"px\";\n      }\n    };\n\n    _proto._resetAdjustments = function _resetAdjustments() {\n      this._element.style.paddingLeft = '';\n      this._element.style.paddingRight = '';\n    };\n\n    _proto._checkScrollbar = function _checkScrollbar() {\n      var rect = document.body.getBoundingClientRect();\n      this._isBodyOverflowing = rect.left + rect.right < window.innerWidth;\n      this._scrollbarWidth = this._getScrollbarWidth();\n    };\n\n    _proto._setScrollbar = function _setScrollbar() {\n      var _this9 = this;\n\n      if (this._isBodyOverflowing) {\n        // Note: DOMNode.style.paddingRight returns the actual value or '' if not set\n        //   while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set\n        var fixedContent = [].slice.call(document.querySelectorAll(Selector$5.FIXED_CONTENT));\n        var stickyContent = [].slice.call(document.querySelectorAll(Selector$5.STICKY_CONTENT)); // Adjust fixed content padding\n\n        $(fixedContent).each(function (index, element) {\n          var actualPadding = element.style.paddingRight;\n          var calculatedPadding = $(element).css('padding-right');\n          $(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this9._scrollbarWidth + \"px\");\n        }); // Adjust sticky content margin\n\n        $(stickyContent).each(function (index, element) {\n          var actualMargin = element.style.marginRight;\n          var calculatedMargin = $(element).css('margin-right');\n          $(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this9._scrollbarWidth + \"px\");\n        }); // Adjust body padding\n\n        var actualPadding = document.body.style.paddingRight;\n        var calculatedPadding = $(document.body).css('padding-right');\n        $(document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + \"px\");\n      }\n\n      $(document.body).addClass(ClassName$5.OPEN);\n    };\n\n    _proto._resetScrollbar = function _resetScrollbar() {\n      // Restore fixed content padding\n      var fixedContent = [].slice.call(document.querySelectorAll(Selector$5.FIXED_CONTENT));\n      $(fixedContent).each(function (index, element) {\n        var padding = $(element).data('padding-right');\n        $(element).removeData('padding-right');\n        element.style.paddingRight = padding ? padding : '';\n      }); // Restore sticky content\n\n      var elements = [].slice.call(document.querySelectorAll(\"\" + Selector$5.STICKY_CONTENT));\n      $(elements).each(function (index, element) {\n        var margin = $(element).data('margin-right');\n\n        if (typeof margin !== 'undefined') {\n          $(element).css('margin-right', margin).removeData('margin-right');\n        }\n      }); // Restore body padding\n\n      var padding = $(document.body).data('padding-right');\n      $(document.body).removeData('padding-right');\n      document.body.style.paddingRight = padding ? padding : '';\n    };\n\n    _proto._getScrollbarWidth = function _getScrollbarWidth() {\n      // thx d.walsh\n      var scrollDiv = document.createElement('div');\n      scrollDiv.className = ClassName$5.SCROLLBAR_MEASURER;\n      document.body.appendChild(scrollDiv);\n      var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;\n      document.body.removeChild(scrollDiv);\n      return scrollbarWidth;\n    } // Static\n    ;\n\n    Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$5);\n\n        var _config = _objectSpread({}, Default$3, $(this).data(), typeof config === 'object' && config ? config : {});\n\n        if (!data) {\n          data = new Modal(this, _config);\n          $(this).data(DATA_KEY$5, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config](relatedTarget);\n        } else if (_config.show) {\n          data.show(relatedTarget);\n        }\n      });\n    };\n\n    _createClass(Modal, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$5;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$3;\n      }\n    }]);\n\n    return Modal;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$5.CLICK_DATA_API, Selector$5.DATA_TOGGLE, function (event) {\n    var _this10 = this;\n\n    var target;\n    var selector = Util.getSelectorFromElement(this);\n\n    if (selector) {\n      target = document.querySelector(selector);\n    }\n\n    var config = $(target).data(DATA_KEY$5) ? 'toggle' : _objectSpread({}, $(target).data(), $(this).data());\n\n    if (this.tagName === 'A' || this.tagName === 'AREA') {\n      event.preventDefault();\n    }\n\n    var $target = $(target).one(Event$5.SHOW, function (showEvent) {\n      if (showEvent.isDefaultPrevented()) {\n        // Only register focus restorer if modal will actually get shown\n        return;\n      }\n\n      $target.one(Event$5.HIDDEN, function () {\n        if ($(_this10).is(':visible')) {\n          _this10.focus();\n        }\n      });\n    });\n\n    Modal._jQueryInterface.call($(target), config, this);\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$5] = Modal._jQueryInterface;\n  $.fn[NAME$5].Constructor = Modal;\n\n  $.fn[NAME$5].noConflict = function () {\n    $.fn[NAME$5] = JQUERY_NO_CONFLICT$5;\n    return Modal._jQueryInterface;\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.3.1): tools/sanitizer.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  var uriAttrs = ['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href'];\n  var ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i;\n  var DefaultWhitelist = {\n    // Global attributes allowed on any supplied element below.\n    '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n    a: ['target', 'href', 'title', 'rel'],\n    area: [],\n    b: [],\n    br: [],\n    col: [],\n    code: [],\n    div: [],\n    em: [],\n    hr: [],\n    h1: [],\n    h2: [],\n    h3: [],\n    h4: [],\n    h5: [],\n    h6: [],\n    i: [],\n    img: ['src', 'alt', 'title', 'width', 'height'],\n    li: [],\n    ol: [],\n    p: [],\n    pre: [],\n    s: [],\n    small: [],\n    span: [],\n    sub: [],\n    sup: [],\n    strong: [],\n    u: [],\n    ul: []\n    /**\n     * A pattern that recognizes a commonly useful subset of URLs that are safe.\n     *\n     * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n     */\n\n  };\n  var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi;\n  /**\n   * A pattern that matches safe data URLs. Only matches image, video and audio types.\n   *\n   * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n   */\n\n  var DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i;\n\n  function allowedAttribute(attr, allowedAttributeList) {\n    var attrName = attr.nodeName.toLowerCase();\n\n    if (allowedAttributeList.indexOf(attrName) !== -1) {\n      if (uriAttrs.indexOf(attrName) !== -1) {\n        return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN));\n      }\n\n      return true;\n    }\n\n    var regExp = allowedAttributeList.filter(function (attrRegex) {\n      return attrRegex instanceof RegExp;\n    }); // Check if a regular expression validates the attribute.\n\n    for (var i = 0, l = regExp.length; i < l; i++) {\n      if (attrName.match(regExp[i])) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {\n    if (unsafeHtml.length === 0) {\n      return unsafeHtml;\n    }\n\n    if (sanitizeFn && typeof sanitizeFn === 'function') {\n      return sanitizeFn(unsafeHtml);\n    }\n\n    var domParser = new window.DOMParser();\n    var createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');\n    var whitelistKeys = Object.keys(whiteList);\n    var elements = [].slice.call(createdDocument.body.querySelectorAll('*'));\n\n    var _loop = function _loop(i, len) {\n      var el = elements[i];\n      var elName = el.nodeName.toLowerCase();\n\n      if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) {\n        el.parentNode.removeChild(el);\n        return \"continue\";\n      }\n\n      var attributeList = [].slice.call(el.attributes);\n      var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || []);\n      attributeList.forEach(function (attr) {\n        if (!allowedAttribute(attr, whitelistedAttributes)) {\n          el.removeAttribute(attr.nodeName);\n        }\n      });\n    };\n\n    for (var i = 0, len = elements.length; i < len; i++) {\n      var _ret = _loop(i, len);\n\n      if (_ret === \"continue\") continue;\n    }\n\n    return createdDocument.body.innerHTML;\n  }\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$6 = 'tooltip';\n  var VERSION$6 = '4.3.1';\n  var DATA_KEY$6 = 'bs.tooltip';\n  var EVENT_KEY$6 = \".\" + DATA_KEY$6;\n  var JQUERY_NO_CONFLICT$6 = $.fn[NAME$6];\n  var CLASS_PREFIX = 'bs-tooltip';\n  var BSCLS_PREFIX_REGEX = new RegExp(\"(^|\\\\s)\" + CLASS_PREFIX + \"\\\\S+\", 'g');\n  var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn'];\n  var DefaultType$4 = {\n    animation: 'boolean',\n    template: 'string',\n    title: '(string|element|function)',\n    trigger: 'string',\n    delay: '(number|object)',\n    html: 'boolean',\n    selector: '(string|boolean)',\n    placement: '(string|function)',\n    offset: '(number|string|function)',\n    container: '(string|element|boolean)',\n    fallbackPlacement: '(string|array)',\n    boundary: '(string|element)',\n    sanitize: 'boolean',\n    sanitizeFn: '(null|function)',\n    whiteList: 'object'\n  };\n  var AttachmentMap$1 = {\n    AUTO: 'auto',\n    TOP: 'top',\n    RIGHT: 'right',\n    BOTTOM: 'bottom',\n    LEFT: 'left'\n  };\n  var Default$4 = {\n    animation: true,\n    template: '<div class=\"tooltip\" role=\"tooltip\">' + '<div class=\"arrow\"></div>' + '<div class=\"tooltip-inner\"></div></div>',\n    trigger: 'hover focus',\n    title: '',\n    delay: 0,\n    html: false,\n    selector: false,\n    placement: 'top',\n    offset: 0,\n    container: false,\n    fallbackPlacement: 'flip',\n    boundary: 'scrollParent',\n    sanitize: true,\n    sanitizeFn: null,\n    whiteList: DefaultWhitelist\n  };\n  var HoverState = {\n    SHOW: 'show',\n    OUT: 'out'\n  };\n  var Event$6 = {\n    HIDE: \"hide\" + EVENT_KEY$6,\n    HIDDEN: \"hidden\" + EVENT_KEY$6,\n    SHOW: \"show\" + EVENT_KEY$6,\n    SHOWN: \"shown\" + EVENT_KEY$6,\n    INSERTED: \"inserted\" + EVENT_KEY$6,\n    CLICK: \"click\" + EVENT_KEY$6,\n    FOCUSIN: \"focusin\" + EVENT_KEY$6,\n    FOCUSOUT: \"focusout\" + EVENT_KEY$6,\n    MOUSEENTER: \"mouseenter\" + EVENT_KEY$6,\n    MOUSELEAVE: \"mouseleave\" + EVENT_KEY$6\n  };\n  var ClassName$6 = {\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector$6 = {\n    TOOLTIP: '.tooltip',\n    TOOLTIP_INNER: '.tooltip-inner',\n    ARROW: '.arrow'\n  };\n  var Trigger = {\n    HOVER: 'hover',\n    FOCUS: 'focus',\n    CLICK: 'click',\n    MANUAL: 'manual'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Tooltip =\n  /*#__PURE__*/\n  function () {\n    function Tooltip(element, config) {\n      /**\n       * Check for Popper dependency\n       * Popper - https://popper.js.org\n       */\n      if (typeof Popper === 'undefined') {\n        throw new TypeError('Bootstrap\\'s tooltips require Popper.js (https://popper.js.org/)');\n      } // private\n\n\n      this._isEnabled = true;\n      this._timeout = 0;\n      this._hoverState = '';\n      this._activeTrigger = {};\n      this._popper = null; // Protected\n\n      this.element = element;\n      this.config = this._getConfig(config);\n      this.tip = null;\n\n      this._setListeners();\n    } // Getters\n\n\n    var _proto = Tooltip.prototype;\n\n    // Public\n    _proto.enable = function enable() {\n      this._isEnabled = true;\n    };\n\n    _proto.disable = function disable() {\n      this._isEnabled = false;\n    };\n\n    _proto.toggleEnabled = function toggleEnabled() {\n      this._isEnabled = !this._isEnabled;\n    };\n\n    _proto.toggle = function toggle(event) {\n      if (!this._isEnabled) {\n        return;\n      }\n\n      if (event) {\n        var dataKey = this.constructor.DATA_KEY;\n        var context = $(event.currentTarget).data(dataKey);\n\n        if (!context) {\n          context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n          $(event.currentTarget).data(dataKey, context);\n        }\n\n        context._activeTrigger.click = !context._activeTrigger.click;\n\n        if (context._isWithActiveTrigger()) {\n          context._enter(null, context);\n        } else {\n          context._leave(null, context);\n        }\n      } else {\n        if ($(this.getTipElement()).hasClass(ClassName$6.SHOW)) {\n          this._leave(null, this);\n\n          return;\n        }\n\n        this._enter(null, this);\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      clearTimeout(this._timeout);\n      $.removeData(this.element, this.constructor.DATA_KEY);\n      $(this.element).off(this.constructor.EVENT_KEY);\n      $(this.element).closest('.modal').off('hide.bs.modal');\n\n      if (this.tip) {\n        $(this.tip).remove();\n      }\n\n      this._isEnabled = null;\n      this._timeout = null;\n      this._hoverState = null;\n      this._activeTrigger = null;\n\n      if (this._popper !== null) {\n        this._popper.destroy();\n      }\n\n      this._popper = null;\n      this.element = null;\n      this.config = null;\n      this.tip = null;\n    };\n\n    _proto.show = function show() {\n      var _this = this;\n\n      if ($(this.element).css('display') === 'none') {\n        throw new Error('Please use show on visible elements');\n      }\n\n      var showEvent = $.Event(this.constructor.Event.SHOW);\n\n      if (this.isWithContent() && this._isEnabled) {\n        $(this.element).trigger(showEvent);\n        var shadowRoot = Util.findShadowRoot(this.element);\n        var isInTheDom = $.contains(shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement, this.element);\n\n        if (showEvent.isDefaultPrevented() || !isInTheDom) {\n          return;\n        }\n\n        var tip = this.getTipElement();\n        var tipId = Util.getUID(this.constructor.NAME);\n        tip.setAttribute('id', tipId);\n        this.element.setAttribute('aria-describedby', tipId);\n        this.setContent();\n\n        if (this.config.animation) {\n          $(tip).addClass(ClassName$6.FADE);\n        }\n\n        var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement;\n\n        var attachment = this._getAttachment(placement);\n\n        this.addAttachmentClass(attachment);\n\n        var container = this._getContainer();\n\n        $(tip).data(this.constructor.DATA_KEY, this);\n\n        if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) {\n          $(tip).appendTo(container);\n        }\n\n        $(this.element).trigger(this.constructor.Event.INSERTED);\n        this._popper = new Popper(this.element, tip, {\n          placement: attachment,\n          modifiers: {\n            offset: this._getOffset(),\n            flip: {\n              behavior: this.config.fallbackPlacement\n            },\n            arrow: {\n              element: Selector$6.ARROW\n            },\n            preventOverflow: {\n              boundariesElement: this.config.boundary\n            }\n          },\n          onCreate: function onCreate(data) {\n            if (data.originalPlacement !== data.placement) {\n              _this._handlePopperPlacementChange(data);\n            }\n          },\n          onUpdate: function onUpdate(data) {\n            return _this._handlePopperPlacementChange(data);\n          }\n        });\n        $(tip).addClass(ClassName$6.SHOW); // If this is a touch-enabled device we add extra\n        // empty mouseover listeners to the body's immediate children;\n        // only needed because of broken event delegation on iOS\n        // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n        if ('ontouchstart' in document.documentElement) {\n          $(document.body).children().on('mouseover', null, $.noop);\n        }\n\n        var complete = function complete() {\n          if (_this.config.animation) {\n            _this._fixTransition();\n          }\n\n          var prevHoverState = _this._hoverState;\n          _this._hoverState = null;\n          $(_this.element).trigger(_this.constructor.Event.SHOWN);\n\n          if (prevHoverState === HoverState.OUT) {\n            _this._leave(null, _this);\n          }\n        };\n\n        if ($(this.tip).hasClass(ClassName$6.FADE)) {\n          var transitionDuration = Util.getTransitionDurationFromElement(this.tip);\n          $(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n        } else {\n          complete();\n        }\n      }\n    };\n\n    _proto.hide = function hide(callback) {\n      var _this2 = this;\n\n      var tip = this.getTipElement();\n      var hideEvent = $.Event(this.constructor.Event.HIDE);\n\n      var complete = function complete() {\n        if (_this2._hoverState !== HoverState.SHOW && tip.parentNode) {\n          tip.parentNode.removeChild(tip);\n        }\n\n        _this2._cleanTipClass();\n\n        _this2.element.removeAttribute('aria-describedby');\n\n        $(_this2.element).trigger(_this2.constructor.Event.HIDDEN);\n\n        if (_this2._popper !== null) {\n          _this2._popper.destroy();\n        }\n\n        if (callback) {\n          callback();\n        }\n      };\n\n      $(this.element).trigger(hideEvent);\n\n      if (hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      $(tip).removeClass(ClassName$6.SHOW); // If this is a touch-enabled device we remove the extra\n      // empty mouseover listeners we added for iOS support\n\n      if ('ontouchstart' in document.documentElement) {\n        $(document.body).children().off('mouseover', null, $.noop);\n      }\n\n      this._activeTrigger[Trigger.CLICK] = false;\n      this._activeTrigger[Trigger.FOCUS] = false;\n      this._activeTrigger[Trigger.HOVER] = false;\n\n      if ($(this.tip).hasClass(ClassName$6.FADE)) {\n        var transitionDuration = Util.getTransitionDurationFromElement(tip);\n        $(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      } else {\n        complete();\n      }\n\n      this._hoverState = '';\n    };\n\n    _proto.update = function update() {\n      if (this._popper !== null) {\n        this._popper.scheduleUpdate();\n      }\n    } // Protected\n    ;\n\n    _proto.isWithContent = function isWithContent() {\n      return Boolean(this.getTitle());\n    };\n\n    _proto.addAttachmentClass = function addAttachmentClass(attachment) {\n      $(this.getTipElement()).addClass(CLASS_PREFIX + \"-\" + attachment);\n    };\n\n    _proto.getTipElement = function getTipElement() {\n      this.tip = this.tip || $(this.config.template)[0];\n      return this.tip;\n    };\n\n    _proto.setContent = function setContent() {\n      var tip = this.getTipElement();\n      this.setElementContent($(tip.querySelectorAll(Selector$6.TOOLTIP_INNER)), this.getTitle());\n      $(tip).removeClass(ClassName$6.FADE + \" \" + ClassName$6.SHOW);\n    };\n\n    _proto.setElementContent = function setElementContent($element, content) {\n      if (typeof content === 'object' && (content.nodeType || content.jquery)) {\n        // Content is a DOM node or a jQuery\n        if (this.config.html) {\n          if (!$(content).parent().is($element)) {\n            $element.empty().append(content);\n          }\n        } else {\n          $element.text($(content).text());\n        }\n\n        return;\n      }\n\n      if (this.config.html) {\n        if (this.config.sanitize) {\n          content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn);\n        }\n\n        $element.html(content);\n      } else {\n        $element.text(content);\n      }\n    };\n\n    _proto.getTitle = function getTitle() {\n      var title = this.element.getAttribute('data-original-title');\n\n      if (!title) {\n        title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title;\n      }\n\n      return title;\n    } // Private\n    ;\n\n    _proto._getOffset = function _getOffset() {\n      var _this3 = this;\n\n      var offset = {};\n\n      if (typeof this.config.offset === 'function') {\n        offset.fn = function (data) {\n          data.offsets = _objectSpread({}, data.offsets, _this3.config.offset(data.offsets, _this3.element) || {});\n          return data;\n        };\n      } else {\n        offset.offset = this.config.offset;\n      }\n\n      return offset;\n    };\n\n    _proto._getContainer = function _getContainer() {\n      if (this.config.container === false) {\n        return document.body;\n      }\n\n      if (Util.isElement(this.config.container)) {\n        return $(this.config.container);\n      }\n\n      return $(document).find(this.config.container);\n    };\n\n    _proto._getAttachment = function _getAttachment(placement) {\n      return AttachmentMap$1[placement.toUpperCase()];\n    };\n\n    _proto._setListeners = function _setListeners() {\n      var _this4 = this;\n\n      var triggers = this.config.trigger.split(' ');\n      triggers.forEach(function (trigger) {\n        if (trigger === 'click') {\n          $(_this4.element).on(_this4.constructor.Event.CLICK, _this4.config.selector, function (event) {\n            return _this4.toggle(event);\n          });\n        } else if (trigger !== Trigger.MANUAL) {\n          var eventIn = trigger === Trigger.HOVER ? _this4.constructor.Event.MOUSEENTER : _this4.constructor.Event.FOCUSIN;\n          var eventOut = trigger === Trigger.HOVER ? _this4.constructor.Event.MOUSELEAVE : _this4.constructor.Event.FOCUSOUT;\n          $(_this4.element).on(eventIn, _this4.config.selector, function (event) {\n            return _this4._enter(event);\n          }).on(eventOut, _this4.config.selector, function (event) {\n            return _this4._leave(event);\n          });\n        }\n      });\n      $(this.element).closest('.modal').on('hide.bs.modal', function () {\n        if (_this4.element) {\n          _this4.hide();\n        }\n      });\n\n      if (this.config.selector) {\n        this.config = _objectSpread({}, this.config, {\n          trigger: 'manual',\n          selector: ''\n        });\n      } else {\n        this._fixTitle();\n      }\n    };\n\n    _proto._fixTitle = function _fixTitle() {\n      var titleType = typeof this.element.getAttribute('data-original-title');\n\n      if (this.element.getAttribute('title') || titleType !== 'string') {\n        this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');\n        this.element.setAttribute('title', '');\n      }\n    };\n\n    _proto._enter = function _enter(event, context) {\n      var dataKey = this.constructor.DATA_KEY;\n      context = context || $(event.currentTarget).data(dataKey);\n\n      if (!context) {\n        context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n        $(event.currentTarget).data(dataKey, context);\n      }\n\n      if (event) {\n        context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true;\n      }\n\n      if ($(context.getTipElement()).hasClass(ClassName$6.SHOW) || context._hoverState === HoverState.SHOW) {\n        context._hoverState = HoverState.SHOW;\n        return;\n      }\n\n      clearTimeout(context._timeout);\n      context._hoverState = HoverState.SHOW;\n\n      if (!context.config.delay || !context.config.delay.show) {\n        context.show();\n        return;\n      }\n\n      context._timeout = setTimeout(function () {\n        if (context._hoverState === HoverState.SHOW) {\n          context.show();\n        }\n      }, context.config.delay.show);\n    };\n\n    _proto._leave = function _leave(event, context) {\n      var dataKey = this.constructor.DATA_KEY;\n      context = context || $(event.currentTarget).data(dataKey);\n\n      if (!context) {\n        context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n        $(event.currentTarget).data(dataKey, context);\n      }\n\n      if (event) {\n        context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false;\n      }\n\n      if (context._isWithActiveTrigger()) {\n        return;\n      }\n\n      clearTimeout(context._timeout);\n      context._hoverState = HoverState.OUT;\n\n      if (!context.config.delay || !context.config.delay.hide) {\n        context.hide();\n        return;\n      }\n\n      context._timeout = setTimeout(function () {\n        if (context._hoverState === HoverState.OUT) {\n          context.hide();\n        }\n      }, context.config.delay.hide);\n    };\n\n    _proto._isWithActiveTrigger = function _isWithActiveTrigger() {\n      for (var trigger in this._activeTrigger) {\n        if (this._activeTrigger[trigger]) {\n          return true;\n        }\n      }\n\n      return false;\n    };\n\n    _proto._getConfig = function _getConfig(config) {\n      var dataAttributes = $(this.element).data();\n      Object.keys(dataAttributes).forEach(function (dataAttr) {\n        if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {\n          delete dataAttributes[dataAttr];\n        }\n      });\n      config = _objectSpread({}, this.constructor.Default, dataAttributes, typeof config === 'object' && config ? config : {});\n\n      if (typeof config.delay === 'number') {\n        config.delay = {\n          show: config.delay,\n          hide: config.delay\n        };\n      }\n\n      if (typeof config.title === 'number') {\n        config.title = config.title.toString();\n      }\n\n      if (typeof config.content === 'number') {\n        config.content = config.content.toString();\n      }\n\n      Util.typeCheckConfig(NAME$6, config, this.constructor.DefaultType);\n\n      if (config.sanitize) {\n        config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn);\n      }\n\n      return config;\n    };\n\n    _proto._getDelegateConfig = function _getDelegateConfig() {\n      var config = {};\n\n      if (this.config) {\n        for (var key in this.config) {\n          if (this.constructor.Default[key] !== this.config[key]) {\n            config[key] = this.config[key];\n          }\n        }\n      }\n\n      return config;\n    };\n\n    _proto._cleanTipClass = function _cleanTipClass() {\n      var $tip = $(this.getTipElement());\n      var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);\n\n      if (tabClass !== null && tabClass.length) {\n        $tip.removeClass(tabClass.join(''));\n      }\n    };\n\n    _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(popperData) {\n      var popperInstance = popperData.instance;\n      this.tip = popperInstance.popper;\n\n      this._cleanTipClass();\n\n      this.addAttachmentClass(this._getAttachment(popperData.placement));\n    };\n\n    _proto._fixTransition = function _fixTransition() {\n      var tip = this.getTipElement();\n      var initConfigAnimation = this.config.animation;\n\n      if (tip.getAttribute('x-placement') !== null) {\n        return;\n      }\n\n      $(tip).removeClass(ClassName$6.FADE);\n      this.config.animation = false;\n      this.hide();\n      this.show();\n      this.config.animation = initConfigAnimation;\n    } // Static\n    ;\n\n    Tooltip._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$6);\n\n        var _config = typeof config === 'object' && config;\n\n        if (!data && /dispose|hide/.test(config)) {\n          return;\n        }\n\n        if (!data) {\n          data = new Tooltip(this, _config);\n          $(this).data(DATA_KEY$6, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Tooltip, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$6;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$4;\n      }\n    }, {\n      key: \"NAME\",\n      get: function get() {\n        return NAME$6;\n      }\n    }, {\n      key: \"DATA_KEY\",\n      get: function get() {\n        return DATA_KEY$6;\n      }\n    }, {\n      key: \"Event\",\n      get: function get() {\n        return Event$6;\n      }\n    }, {\n      key: \"EVENT_KEY\",\n      get: function get() {\n        return EVENT_KEY$6;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType$4;\n      }\n    }]);\n\n    return Tooltip;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n\n  $.fn[NAME$6] = Tooltip._jQueryInterface;\n  $.fn[NAME$6].Constructor = Tooltip;\n\n  $.fn[NAME$6].noConflict = function () {\n    $.fn[NAME$6] = JQUERY_NO_CONFLICT$6;\n    return Tooltip._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$7 = 'popover';\n  var VERSION$7 = '4.3.1';\n  var DATA_KEY$7 = 'bs.popover';\n  var EVENT_KEY$7 = \".\" + DATA_KEY$7;\n  var JQUERY_NO_CONFLICT$7 = $.fn[NAME$7];\n  var CLASS_PREFIX$1 = 'bs-popover';\n  var BSCLS_PREFIX_REGEX$1 = new RegExp(\"(^|\\\\s)\" + CLASS_PREFIX$1 + \"\\\\S+\", 'g');\n\n  var Default$5 = _objectSpread({}, Tooltip.Default, {\n    placement: 'right',\n    trigger: 'click',\n    content: '',\n    template: '<div class=\"popover\" role=\"tooltip\">' + '<div class=\"arrow\"></div>' + '<h3 class=\"popover-header\"></h3>' + '<div class=\"popover-body\"></div></div>'\n  });\n\n  var DefaultType$5 = _objectSpread({}, Tooltip.DefaultType, {\n    content: '(string|element|function)'\n  });\n\n  var ClassName$7 = {\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector$7 = {\n    TITLE: '.popover-header',\n    CONTENT: '.popover-body'\n  };\n  var Event$7 = {\n    HIDE: \"hide\" + EVENT_KEY$7,\n    HIDDEN: \"hidden\" + EVENT_KEY$7,\n    SHOW: \"show\" + EVENT_KEY$7,\n    SHOWN: \"shown\" + EVENT_KEY$7,\n    INSERTED: \"inserted\" + EVENT_KEY$7,\n    CLICK: \"click\" + EVENT_KEY$7,\n    FOCUSIN: \"focusin\" + EVENT_KEY$7,\n    FOCUSOUT: \"focusout\" + EVENT_KEY$7,\n    MOUSEENTER: \"mouseenter\" + EVENT_KEY$7,\n    MOUSELEAVE: \"mouseleave\" + EVENT_KEY$7\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Popover =\n  /*#__PURE__*/\n  function (_Tooltip) {\n    _inheritsLoose(Popover, _Tooltip);\n\n    function Popover() {\n      return _Tooltip.apply(this, arguments) || this;\n    }\n\n    var _proto = Popover.prototype;\n\n    // Overrides\n    _proto.isWithContent = function isWithContent() {\n      return this.getTitle() || this._getContent();\n    };\n\n    _proto.addAttachmentClass = function addAttachmentClass(attachment) {\n      $(this.getTipElement()).addClass(CLASS_PREFIX$1 + \"-\" + attachment);\n    };\n\n    _proto.getTipElement = function getTipElement() {\n      this.tip = this.tip || $(this.config.template)[0];\n      return this.tip;\n    };\n\n    _proto.setContent = function setContent() {\n      var $tip = $(this.getTipElement()); // We use append for html objects to maintain js events\n\n      this.setElementContent($tip.find(Selector$7.TITLE), this.getTitle());\n\n      var content = this._getContent();\n\n      if (typeof content === 'function') {\n        content = content.call(this.element);\n      }\n\n      this.setElementContent($tip.find(Selector$7.CONTENT), content);\n      $tip.removeClass(ClassName$7.FADE + \" \" + ClassName$7.SHOW);\n    } // Private\n    ;\n\n    _proto._getContent = function _getContent() {\n      return this.element.getAttribute('data-content') || this.config.content;\n    };\n\n    _proto._cleanTipClass = function _cleanTipClass() {\n      var $tip = $(this.getTipElement());\n      var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX$1);\n\n      if (tabClass !== null && tabClass.length > 0) {\n        $tip.removeClass(tabClass.join(''));\n      }\n    } // Static\n    ;\n\n    Popover._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$7);\n\n        var _config = typeof config === 'object' ? config : null;\n\n        if (!data && /dispose|hide/.test(config)) {\n          return;\n        }\n\n        if (!data) {\n          data = new Popover(this, _config);\n          $(this).data(DATA_KEY$7, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Popover, null, [{\n      key: \"VERSION\",\n      // Getters\n      get: function get() {\n        return VERSION$7;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$5;\n      }\n    }, {\n      key: \"NAME\",\n      get: function get() {\n        return NAME$7;\n      }\n    }, {\n      key: \"DATA_KEY\",\n      get: function get() {\n        return DATA_KEY$7;\n      }\n    }, {\n      key: \"Event\",\n      get: function get() {\n        return Event$7;\n      }\n    }, {\n      key: \"EVENT_KEY\",\n      get: function get() {\n        return EVENT_KEY$7;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType$5;\n      }\n    }]);\n\n    return Popover;\n  }(Tooltip);\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n\n  $.fn[NAME$7] = Popover._jQueryInterface;\n  $.fn[NAME$7].Constructor = Popover;\n\n  $.fn[NAME$7].noConflict = function () {\n    $.fn[NAME$7] = JQUERY_NO_CONFLICT$7;\n    return Popover._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$8 = 'scrollspy';\n  var VERSION$8 = '4.3.1';\n  var DATA_KEY$8 = 'bs.scrollspy';\n  var EVENT_KEY$8 = \".\" + DATA_KEY$8;\n  var DATA_API_KEY$6 = '.data-api';\n  var JQUERY_NO_CONFLICT$8 = $.fn[NAME$8];\n  var Default$6 = {\n    offset: 10,\n    method: 'auto',\n    target: ''\n  };\n  var DefaultType$6 = {\n    offset: 'number',\n    method: 'string',\n    target: '(string|element)'\n  };\n  var Event$8 = {\n    ACTIVATE: \"activate\" + EVENT_KEY$8,\n    SCROLL: \"scroll\" + EVENT_KEY$8,\n    LOAD_DATA_API: \"load\" + EVENT_KEY$8 + DATA_API_KEY$6\n  };\n  var ClassName$8 = {\n    DROPDOWN_ITEM: 'dropdown-item',\n    DROPDOWN_MENU: 'dropdown-menu',\n    ACTIVE: 'active'\n  };\n  var Selector$8 = {\n    DATA_SPY: '[data-spy=\"scroll\"]',\n    ACTIVE: '.active',\n    NAV_LIST_GROUP: '.nav, .list-group',\n    NAV_LINKS: '.nav-link',\n    NAV_ITEMS: '.nav-item',\n    LIST_ITEMS: '.list-group-item',\n    DROPDOWN: '.dropdown',\n    DROPDOWN_ITEMS: '.dropdown-item',\n    DROPDOWN_TOGGLE: '.dropdown-toggle'\n  };\n  var OffsetMethod = {\n    OFFSET: 'offset',\n    POSITION: 'position'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var ScrollSpy =\n  /*#__PURE__*/\n  function () {\n    function ScrollSpy(element, config) {\n      var _this = this;\n\n      this._element = element;\n      this._scrollElement = element.tagName === 'BODY' ? window : element;\n      this._config = this._getConfig(config);\n      this._selector = this._config.target + \" \" + Selector$8.NAV_LINKS + \",\" + (this._config.target + \" \" + Selector$8.LIST_ITEMS + \",\") + (this._config.target + \" \" + Selector$8.DROPDOWN_ITEMS);\n      this._offsets = [];\n      this._targets = [];\n      this._activeTarget = null;\n      this._scrollHeight = 0;\n      $(this._scrollElement).on(Event$8.SCROLL, function (event) {\n        return _this._process(event);\n      });\n      this.refresh();\n\n      this._process();\n    } // Getters\n\n\n    var _proto = ScrollSpy.prototype;\n\n    // Public\n    _proto.refresh = function refresh() {\n      var _this2 = this;\n\n      var autoMethod = this._scrollElement === this._scrollElement.window ? OffsetMethod.OFFSET : OffsetMethod.POSITION;\n      var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;\n      var offsetBase = offsetMethod === OffsetMethod.POSITION ? this._getScrollTop() : 0;\n      this._offsets = [];\n      this._targets = [];\n      this._scrollHeight = this._getScrollHeight();\n      var targets = [].slice.call(document.querySelectorAll(this._selector));\n      targets.map(function (element) {\n        var target;\n        var targetSelector = Util.getSelectorFromElement(element);\n\n        if (targetSelector) {\n          target = document.querySelector(targetSelector);\n        }\n\n        if (target) {\n          var targetBCR = target.getBoundingClientRect();\n\n          if (targetBCR.width || targetBCR.height) {\n            // TODO (fat): remove sketch reliance on jQuery position/offset\n            return [$(target)[offsetMethod]().top + offsetBase, targetSelector];\n          }\n        }\n\n        return null;\n      }).filter(function (item) {\n        return item;\n      }).sort(function (a, b) {\n        return a[0] - b[0];\n      }).forEach(function (item) {\n        _this2._offsets.push(item[0]);\n\n        _this2._targets.push(item[1]);\n      });\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$8);\n      $(this._scrollElement).off(EVENT_KEY$8);\n      this._element = null;\n      this._scrollElement = null;\n      this._config = null;\n      this._selector = null;\n      this._offsets = null;\n      this._targets = null;\n      this._activeTarget = null;\n      this._scrollHeight = null;\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default$6, typeof config === 'object' && config ? config : {});\n\n      if (typeof config.target !== 'string') {\n        var id = $(config.target).attr('id');\n\n        if (!id) {\n          id = Util.getUID(NAME$8);\n          $(config.target).attr('id', id);\n        }\n\n        config.target = \"#\" + id;\n      }\n\n      Util.typeCheckConfig(NAME$8, config, DefaultType$6);\n      return config;\n    };\n\n    _proto._getScrollTop = function _getScrollTop() {\n      return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;\n    };\n\n    _proto._getScrollHeight = function _getScrollHeight() {\n      return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);\n    };\n\n    _proto._getOffsetHeight = function _getOffsetHeight() {\n      return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;\n    };\n\n    _proto._process = function _process() {\n      var scrollTop = this._getScrollTop() + this._config.offset;\n\n      var scrollHeight = this._getScrollHeight();\n\n      var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();\n\n      if (this._scrollHeight !== scrollHeight) {\n        this.refresh();\n      }\n\n      if (scrollTop >= maxScroll) {\n        var target = this._targets[this._targets.length - 1];\n\n        if (this._activeTarget !== target) {\n          this._activate(target);\n        }\n\n        return;\n      }\n\n      if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n        this._activeTarget = null;\n\n        this._clear();\n\n        return;\n      }\n\n      var offsetLength = this._offsets.length;\n\n      for (var i = offsetLength; i--;) {\n        var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);\n\n        if (isActiveTarget) {\n          this._activate(this._targets[i]);\n        }\n      }\n    };\n\n    _proto._activate = function _activate(target) {\n      this._activeTarget = target;\n\n      this._clear();\n\n      var queries = this._selector.split(',').map(function (selector) {\n        return selector + \"[data-target=\\\"\" + target + \"\\\"],\" + selector + \"[href=\\\"\" + target + \"\\\"]\";\n      });\n\n      var $link = $([].slice.call(document.querySelectorAll(queries.join(','))));\n\n      if ($link.hasClass(ClassName$8.DROPDOWN_ITEM)) {\n        $link.closest(Selector$8.DROPDOWN).find(Selector$8.DROPDOWN_TOGGLE).addClass(ClassName$8.ACTIVE);\n        $link.addClass(ClassName$8.ACTIVE);\n      } else {\n        // Set triggered link as active\n        $link.addClass(ClassName$8.ACTIVE); // Set triggered links parents as active\n        // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n\n        $link.parents(Selector$8.NAV_LIST_GROUP).prev(Selector$8.NAV_LINKS + \", \" + Selector$8.LIST_ITEMS).addClass(ClassName$8.ACTIVE); // Handle special case when .nav-link is inside .nav-item\n\n        $link.parents(Selector$8.NAV_LIST_GROUP).prev(Selector$8.NAV_ITEMS).children(Selector$8.NAV_LINKS).addClass(ClassName$8.ACTIVE);\n      }\n\n      $(this._scrollElement).trigger(Event$8.ACTIVATE, {\n        relatedTarget: target\n      });\n    };\n\n    _proto._clear = function _clear() {\n      [].slice.call(document.querySelectorAll(this._selector)).filter(function (node) {\n        return node.classList.contains(ClassName$8.ACTIVE);\n      }).forEach(function (node) {\n        return node.classList.remove(ClassName$8.ACTIVE);\n      });\n    } // Static\n    ;\n\n    ScrollSpy._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$8);\n\n        var _config = typeof config === 'object' && config;\n\n        if (!data) {\n          data = new ScrollSpy(this, _config);\n          $(this).data(DATA_KEY$8, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(ScrollSpy, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$8;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$6;\n      }\n    }]);\n\n    return ScrollSpy;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(window).on(Event$8.LOAD_DATA_API, function () {\n    var scrollSpys = [].slice.call(document.querySelectorAll(Selector$8.DATA_SPY));\n    var scrollSpysLength = scrollSpys.length;\n\n    for (var i = scrollSpysLength; i--;) {\n      var $spy = $(scrollSpys[i]);\n\n      ScrollSpy._jQueryInterface.call($spy, $spy.data());\n    }\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$8] = ScrollSpy._jQueryInterface;\n  $.fn[NAME$8].Constructor = ScrollSpy;\n\n  $.fn[NAME$8].noConflict = function () {\n    $.fn[NAME$8] = JQUERY_NO_CONFLICT$8;\n    return ScrollSpy._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$9 = 'tab';\n  var VERSION$9 = '4.3.1';\n  var DATA_KEY$9 = 'bs.tab';\n  var EVENT_KEY$9 = \".\" + DATA_KEY$9;\n  var DATA_API_KEY$7 = '.data-api';\n  var JQUERY_NO_CONFLICT$9 = $.fn[NAME$9];\n  var Event$9 = {\n    HIDE: \"hide\" + EVENT_KEY$9,\n    HIDDEN: \"hidden\" + EVENT_KEY$9,\n    SHOW: \"show\" + EVENT_KEY$9,\n    SHOWN: \"shown\" + EVENT_KEY$9,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$9 + DATA_API_KEY$7\n  };\n  var ClassName$9 = {\n    DROPDOWN_MENU: 'dropdown-menu',\n    ACTIVE: 'active',\n    DISABLED: 'disabled',\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector$9 = {\n    DROPDOWN: '.dropdown',\n    NAV_LIST_GROUP: '.nav, .list-group',\n    ACTIVE: '.active',\n    ACTIVE_UL: '> li > .active',\n    DATA_TOGGLE: '[data-toggle=\"tab\"], [data-toggle=\"pill\"], [data-toggle=\"list\"]',\n    DROPDOWN_TOGGLE: '.dropdown-toggle',\n    DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Tab =\n  /*#__PURE__*/\n  function () {\n    function Tab(element) {\n      this._element = element;\n    } // Getters\n\n\n    var _proto = Tab.prototype;\n\n    // Public\n    _proto.show = function show() {\n      var _this = this;\n\n      if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $(this._element).hasClass(ClassName$9.ACTIVE) || $(this._element).hasClass(ClassName$9.DISABLED)) {\n        return;\n      }\n\n      var target;\n      var previous;\n      var listElement = $(this._element).closest(Selector$9.NAV_LIST_GROUP)[0];\n      var selector = Util.getSelectorFromElement(this._element);\n\n      if (listElement) {\n        var itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? Selector$9.ACTIVE_UL : Selector$9.ACTIVE;\n        previous = $.makeArray($(listElement).find(itemSelector));\n        previous = previous[previous.length - 1];\n      }\n\n      var hideEvent = $.Event(Event$9.HIDE, {\n        relatedTarget: this._element\n      });\n      var showEvent = $.Event(Event$9.SHOW, {\n        relatedTarget: previous\n      });\n\n      if (previous) {\n        $(previous).trigger(hideEvent);\n      }\n\n      $(this._element).trigger(showEvent);\n\n      if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      if (selector) {\n        target = document.querySelector(selector);\n      }\n\n      this._activate(this._element, listElement);\n\n      var complete = function complete() {\n        var hiddenEvent = $.Event(Event$9.HIDDEN, {\n          relatedTarget: _this._element\n        });\n        var shownEvent = $.Event(Event$9.SHOWN, {\n          relatedTarget: previous\n        });\n        $(previous).trigger(hiddenEvent);\n        $(_this._element).trigger(shownEvent);\n      };\n\n      if (target) {\n        this._activate(target, target.parentNode, complete);\n      } else {\n        complete();\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$9);\n      this._element = null;\n    } // Private\n    ;\n\n    _proto._activate = function _activate(element, container, callback) {\n      var _this2 = this;\n\n      var activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ? $(container).find(Selector$9.ACTIVE_UL) : $(container).children(Selector$9.ACTIVE);\n      var active = activeElements[0];\n      var isTransitioning = callback && active && $(active).hasClass(ClassName$9.FADE);\n\n      var complete = function complete() {\n        return _this2._transitionComplete(element, active, callback);\n      };\n\n      if (active && isTransitioning) {\n        var transitionDuration = Util.getTransitionDurationFromElement(active);\n        $(active).removeClass(ClassName$9.SHOW).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      } else {\n        complete();\n      }\n    };\n\n    _proto._transitionComplete = function _transitionComplete(element, active, callback) {\n      if (active) {\n        $(active).removeClass(ClassName$9.ACTIVE);\n        var dropdownChild = $(active.parentNode).find(Selector$9.DROPDOWN_ACTIVE_CHILD)[0];\n\n        if (dropdownChild) {\n          $(dropdownChild).removeClass(ClassName$9.ACTIVE);\n        }\n\n        if (active.getAttribute('role') === 'tab') {\n          active.setAttribute('aria-selected', false);\n        }\n      }\n\n      $(element).addClass(ClassName$9.ACTIVE);\n\n      if (element.getAttribute('role') === 'tab') {\n        element.setAttribute('aria-selected', true);\n      }\n\n      Util.reflow(element);\n\n      if (element.classList.contains(ClassName$9.FADE)) {\n        element.classList.add(ClassName$9.SHOW);\n      }\n\n      if (element.parentNode && $(element.parentNode).hasClass(ClassName$9.DROPDOWN_MENU)) {\n        var dropdownElement = $(element).closest(Selector$9.DROPDOWN)[0];\n\n        if (dropdownElement) {\n          var dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(Selector$9.DROPDOWN_TOGGLE));\n          $(dropdownToggleList).addClass(ClassName$9.ACTIVE);\n        }\n\n        element.setAttribute('aria-expanded', true);\n      }\n\n      if (callback) {\n        callback();\n      }\n    } // Static\n    ;\n\n    Tab._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $this = $(this);\n        var data = $this.data(DATA_KEY$9);\n\n        if (!data) {\n          data = new Tab(this);\n          $this.data(DATA_KEY$9, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Tab, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$9;\n      }\n    }]);\n\n    return Tab;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$9.CLICK_DATA_API, Selector$9.DATA_TOGGLE, function (event) {\n    event.preventDefault();\n\n    Tab._jQueryInterface.call($(this), 'show');\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$9] = Tab._jQueryInterface;\n  $.fn[NAME$9].Constructor = Tab;\n\n  $.fn[NAME$9].noConflict = function () {\n    $.fn[NAME$9] = JQUERY_NO_CONFLICT$9;\n    return Tab._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$a = 'toast';\n  var VERSION$a = '4.3.1';\n  var DATA_KEY$a = 'bs.toast';\n  var EVENT_KEY$a = \".\" + DATA_KEY$a;\n  var JQUERY_NO_CONFLICT$a = $.fn[NAME$a];\n  var Event$a = {\n    CLICK_DISMISS: \"click.dismiss\" + EVENT_KEY$a,\n    HIDE: \"hide\" + EVENT_KEY$a,\n    HIDDEN: \"hidden\" + EVENT_KEY$a,\n    SHOW: \"show\" + EVENT_KEY$a,\n    SHOWN: \"shown\" + EVENT_KEY$a\n  };\n  var ClassName$a = {\n    FADE: 'fade',\n    HIDE: 'hide',\n    SHOW: 'show',\n    SHOWING: 'showing'\n  };\n  var DefaultType$7 = {\n    animation: 'boolean',\n    autohide: 'boolean',\n    delay: 'number'\n  };\n  var Default$7 = {\n    animation: true,\n    autohide: true,\n    delay: 500\n  };\n  var Selector$a = {\n    DATA_DISMISS: '[data-dismiss=\"toast\"]'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Toast =\n  /*#__PURE__*/\n  function () {\n    function Toast(element, config) {\n      this._element = element;\n      this._config = this._getConfig(config);\n      this._timeout = null;\n\n      this._setListeners();\n    } // Getters\n\n\n    var _proto = Toast.prototype;\n\n    // Public\n    _proto.show = function show() {\n      var _this = this;\n\n      $(this._element).trigger(Event$a.SHOW);\n\n      if (this._config.animation) {\n        this._element.classList.add(ClassName$a.FADE);\n      }\n\n      var complete = function complete() {\n        _this._element.classList.remove(ClassName$a.SHOWING);\n\n        _this._element.classList.add(ClassName$a.SHOW);\n\n        $(_this._element).trigger(Event$a.SHOWN);\n\n        if (_this._config.autohide) {\n          _this.hide();\n        }\n      };\n\n      this._element.classList.remove(ClassName$a.HIDE);\n\n      this._element.classList.add(ClassName$a.SHOWING);\n\n      if (this._config.animation) {\n        var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n        $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      } else {\n        complete();\n      }\n    };\n\n    _proto.hide = function hide(withoutTimeout) {\n      var _this2 = this;\n\n      if (!this._element.classList.contains(ClassName$a.SHOW)) {\n        return;\n      }\n\n      $(this._element).trigger(Event$a.HIDE);\n\n      if (withoutTimeout) {\n        this._close();\n      } else {\n        this._timeout = setTimeout(function () {\n          _this2._close();\n        }, this._config.delay);\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      clearTimeout(this._timeout);\n      this._timeout = null;\n\n      if (this._element.classList.contains(ClassName$a.SHOW)) {\n        this._element.classList.remove(ClassName$a.SHOW);\n      }\n\n      $(this._element).off(Event$a.CLICK_DISMISS);\n      $.removeData(this._element, DATA_KEY$a);\n      this._element = null;\n      this._config = null;\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default$7, $(this._element).data(), typeof config === 'object' && config ? config : {});\n      Util.typeCheckConfig(NAME$a, config, this.constructor.DefaultType);\n      return config;\n    };\n\n    _proto._setListeners = function _setListeners() {\n      var _this3 = this;\n\n      $(this._element).on(Event$a.CLICK_DISMISS, Selector$a.DATA_DISMISS, function () {\n        return _this3.hide(true);\n      });\n    };\n\n    _proto._close = function _close() {\n      var _this4 = this;\n\n      var complete = function complete() {\n        _this4._element.classList.add(ClassName$a.HIDE);\n\n        $(_this4._element).trigger(Event$a.HIDDEN);\n      };\n\n      this._element.classList.remove(ClassName$a.SHOW);\n\n      if (this._config.animation) {\n        var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n        $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      } else {\n        complete();\n      }\n    } // Static\n    ;\n\n    Toast._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $element = $(this);\n        var data = $element.data(DATA_KEY$a);\n\n        var _config = typeof config === 'object' && config;\n\n        if (!data) {\n          data = new Toast(this, _config);\n          $element.data(DATA_KEY$a, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config](this);\n        }\n      });\n    };\n\n    _createClass(Toast, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$a;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType$7;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$7;\n      }\n    }]);\n\n    return Toast;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n\n  $.fn[NAME$a] = Toast._jQueryInterface;\n  $.fn[NAME$a].Constructor = Toast;\n\n  $.fn[NAME$a].noConflict = function () {\n    $.fn[NAME$a] = JQUERY_NO_CONFLICT$a;\n    return Toast._jQueryInterface;\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.3.1): index.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  (function () {\n    if (typeof $ === 'undefined') {\n      throw new TypeError('Bootstrap\\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\\'s JavaScript.');\n    }\n\n    var version = $.fn.jquery.split(' ')[0].split('.');\n    var minMajor = 1;\n    var ltMajor = 2;\n    var minMinor = 9;\n    var minPatch = 1;\n    var maxMajor = 4;\n\n    if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {\n      throw new Error('Bootstrap\\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0');\n    }\n  })();\n\n  exports.Util = Util;\n  exports.Alert = Alert;\n  exports.Button = Button;\n  exports.Carousel = Carousel;\n  exports.Collapse = Collapse;\n  exports.Dropdown = Dropdown;\n  exports.Modal = Modal;\n  exports.Popover = Popover;\n  exports.Scrollspy = ScrollSpy;\n  exports.Tab = Tab;\n  exports.Toast = Toast;\n  exports.Tooltip = Tooltip;\n\n  Object.defineProperty(exports, '__esModule', { value: true });\n\n}));\n//# sourceMappingURL=bootstrap.bundle.js.map\n"
  },
  {
    "path": "easyflow-flow-bpmn/static/plugins/bootstrap/js/bootstrap.js",
    "content": "/*!\n  * Bootstrap v4.3.1 (https://getbootstrap.com/)\n  * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jquery'), require('popper.js')) :\n  typeof define === 'function' && define.amd ? define(['exports', 'jquery', 'popper.js'], factory) :\n  (global = global || self, factory(global.bootstrap = {}, global.jQuery, global.Popper));\n}(this, function (exports, $, Popper) { 'use strict';\n\n  $ = $ && $.hasOwnProperty('default') ? $['default'] : $;\n  Popper = Popper && Popper.hasOwnProperty('default') ? Popper['default'] : Popper;\n\n  function _defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  function _createClass(Constructor, protoProps, staticProps) {\n    if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) _defineProperties(Constructor, staticProps);\n    return Constructor;\n  }\n\n  function _defineProperty(obj, key, value) {\n    if (key in obj) {\n      Object.defineProperty(obj, key, {\n        value: value,\n        enumerable: true,\n        configurable: true,\n        writable: true\n      });\n    } else {\n      obj[key] = value;\n    }\n\n    return obj;\n  }\n\n  function _objectSpread(target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i] != null ? arguments[i] : {};\n      var ownKeys = Object.keys(source);\n\n      if (typeof Object.getOwnPropertySymbols === 'function') {\n        ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {\n          return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n        }));\n      }\n\n      ownKeys.forEach(function (key) {\n        _defineProperty(target, key, source[key]);\n      });\n    }\n\n    return target;\n  }\n\n  function _inheritsLoose(subClass, superClass) {\n    subClass.prototype = Object.create(superClass.prototype);\n    subClass.prototype.constructor = subClass;\n    subClass.__proto__ = superClass;\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.3.1): util.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Private TransitionEnd Helpers\n   * ------------------------------------------------------------------------\n   */\n\n  var TRANSITION_END = 'transitionend';\n  var MAX_UID = 1000000;\n  var MILLISECONDS_MULTIPLIER = 1000; // Shoutout AngusCroll (https://goo.gl/pxwQGp)\n\n  function toType(obj) {\n    return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase();\n  }\n\n  function getSpecialTransitionEndEvent() {\n    return {\n      bindType: TRANSITION_END,\n      delegateType: TRANSITION_END,\n      handle: function handle(event) {\n        if ($(event.target).is(this)) {\n          return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params\n        }\n\n        return undefined; // eslint-disable-line no-undefined\n      }\n    };\n  }\n\n  function transitionEndEmulator(duration) {\n    var _this = this;\n\n    var called = false;\n    $(this).one(Util.TRANSITION_END, function () {\n      called = true;\n    });\n    setTimeout(function () {\n      if (!called) {\n        Util.triggerTransitionEnd(_this);\n      }\n    }, duration);\n    return this;\n  }\n\n  function setTransitionEndSupport() {\n    $.fn.emulateTransitionEnd = transitionEndEmulator;\n    $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();\n  }\n  /**\n   * --------------------------------------------------------------------------\n   * Public Util Api\n   * --------------------------------------------------------------------------\n   */\n\n\n  var Util = {\n    TRANSITION_END: 'bsTransitionEnd',\n    getUID: function getUID(prefix) {\n      do {\n        // eslint-disable-next-line no-bitwise\n        prefix += ~~(Math.random() * MAX_UID); // \"~~\" acts like a faster Math.floor() here\n      } while (document.getElementById(prefix));\n\n      return prefix;\n    },\n    getSelectorFromElement: function getSelectorFromElement(element) {\n      var selector = element.getAttribute('data-target');\n\n      if (!selector || selector === '#') {\n        var hrefAttr = element.getAttribute('href');\n        selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : '';\n      }\n\n      try {\n        return document.querySelector(selector) ? selector : null;\n      } catch (err) {\n        return null;\n      }\n    },\n    getTransitionDurationFromElement: function getTransitionDurationFromElement(element) {\n      if (!element) {\n        return 0;\n      } // Get transition-duration of the element\n\n\n      var transitionDuration = $(element).css('transition-duration');\n      var transitionDelay = $(element).css('transition-delay');\n      var floatTransitionDuration = parseFloat(transitionDuration);\n      var floatTransitionDelay = parseFloat(transitionDelay); // Return 0 if element or transition duration is not found\n\n      if (!floatTransitionDuration && !floatTransitionDelay) {\n        return 0;\n      } // If multiple durations are defined, take the first\n\n\n      transitionDuration = transitionDuration.split(',')[0];\n      transitionDelay = transitionDelay.split(',')[0];\n      return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;\n    },\n    reflow: function reflow(element) {\n      return element.offsetHeight;\n    },\n    triggerTransitionEnd: function triggerTransitionEnd(element) {\n      $(element).trigger(TRANSITION_END);\n    },\n    // TODO: Remove in v5\n    supportsTransitionEnd: function supportsTransitionEnd() {\n      return Boolean(TRANSITION_END);\n    },\n    isElement: function isElement(obj) {\n      return (obj[0] || obj).nodeType;\n    },\n    typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {\n      for (var property in configTypes) {\n        if (Object.prototype.hasOwnProperty.call(configTypes, property)) {\n          var expectedTypes = configTypes[property];\n          var value = config[property];\n          var valueType = value && Util.isElement(value) ? 'element' : toType(value);\n\n          if (!new RegExp(expectedTypes).test(valueType)) {\n            throw new Error(componentName.toUpperCase() + \": \" + (\"Option \\\"\" + property + \"\\\" provided type \\\"\" + valueType + \"\\\" \") + (\"but expected type \\\"\" + expectedTypes + \"\\\".\"));\n          }\n        }\n      }\n    },\n    findShadowRoot: function findShadowRoot(element) {\n      if (!document.documentElement.attachShadow) {\n        return null;\n      } // Can find the shadow root otherwise it'll return the document\n\n\n      if (typeof element.getRootNode === 'function') {\n        var root = element.getRootNode();\n        return root instanceof ShadowRoot ? root : null;\n      }\n\n      if (element instanceof ShadowRoot) {\n        return element;\n      } // when we don't find a shadow root\n\n\n      if (!element.parentNode) {\n        return null;\n      }\n\n      return Util.findShadowRoot(element.parentNode);\n    }\n  };\n  setTransitionEndSupport();\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME = 'alert';\n  var VERSION = '4.3.1';\n  var DATA_KEY = 'bs.alert';\n  var EVENT_KEY = \".\" + DATA_KEY;\n  var DATA_API_KEY = '.data-api';\n  var JQUERY_NO_CONFLICT = $.fn[NAME];\n  var Selector = {\n    DISMISS: '[data-dismiss=\"alert\"]'\n  };\n  var Event = {\n    CLOSE: \"close\" + EVENT_KEY,\n    CLOSED: \"closed\" + EVENT_KEY,\n    CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY\n  };\n  var ClassName = {\n    ALERT: 'alert',\n    FADE: 'fade',\n    SHOW: 'show'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Alert =\n  /*#__PURE__*/\n  function () {\n    function Alert(element) {\n      this._element = element;\n    } // Getters\n\n\n    var _proto = Alert.prototype;\n\n    // Public\n    _proto.close = function close(element) {\n      var rootElement = this._element;\n\n      if (element) {\n        rootElement = this._getRootElement(element);\n      }\n\n      var customEvent = this._triggerCloseEvent(rootElement);\n\n      if (customEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      this._removeElement(rootElement);\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY);\n      this._element = null;\n    } // Private\n    ;\n\n    _proto._getRootElement = function _getRootElement(element) {\n      var selector = Util.getSelectorFromElement(element);\n      var parent = false;\n\n      if (selector) {\n        parent = document.querySelector(selector);\n      }\n\n      if (!parent) {\n        parent = $(element).closest(\".\" + ClassName.ALERT)[0];\n      }\n\n      return parent;\n    };\n\n    _proto._triggerCloseEvent = function _triggerCloseEvent(element) {\n      var closeEvent = $.Event(Event.CLOSE);\n      $(element).trigger(closeEvent);\n      return closeEvent;\n    };\n\n    _proto._removeElement = function _removeElement(element) {\n      var _this = this;\n\n      $(element).removeClass(ClassName.SHOW);\n\n      if (!$(element).hasClass(ClassName.FADE)) {\n        this._destroyElement(element);\n\n        return;\n      }\n\n      var transitionDuration = Util.getTransitionDurationFromElement(element);\n      $(element).one(Util.TRANSITION_END, function (event) {\n        return _this._destroyElement(element, event);\n      }).emulateTransitionEnd(transitionDuration);\n    };\n\n    _proto._destroyElement = function _destroyElement(element) {\n      $(element).detach().trigger(Event.CLOSED).remove();\n    } // Static\n    ;\n\n    Alert._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $element = $(this);\n        var data = $element.data(DATA_KEY);\n\n        if (!data) {\n          data = new Alert(this);\n          $element.data(DATA_KEY, data);\n        }\n\n        if (config === 'close') {\n          data[config](this);\n        }\n      });\n    };\n\n    Alert._handleDismiss = function _handleDismiss(alertInstance) {\n      return function (event) {\n        if (event) {\n          event.preventDefault();\n        }\n\n        alertInstance.close(this);\n      };\n    };\n\n    _createClass(Alert, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION;\n      }\n    }]);\n\n    return Alert;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert()));\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME] = Alert._jQueryInterface;\n  $.fn[NAME].Constructor = Alert;\n\n  $.fn[NAME].noConflict = function () {\n    $.fn[NAME] = JQUERY_NO_CONFLICT;\n    return Alert._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$1 = 'button';\n  var VERSION$1 = '4.3.1';\n  var DATA_KEY$1 = 'bs.button';\n  var EVENT_KEY$1 = \".\" + DATA_KEY$1;\n  var DATA_API_KEY$1 = '.data-api';\n  var JQUERY_NO_CONFLICT$1 = $.fn[NAME$1];\n  var ClassName$1 = {\n    ACTIVE: 'active',\n    BUTTON: 'btn',\n    FOCUS: 'focus'\n  };\n  var Selector$1 = {\n    DATA_TOGGLE_CARROT: '[data-toggle^=\"button\"]',\n    DATA_TOGGLE: '[data-toggle=\"buttons\"]',\n    INPUT: 'input:not([type=\"hidden\"])',\n    ACTIVE: '.active',\n    BUTTON: '.btn'\n  };\n  var Event$1 = {\n    CLICK_DATA_API: \"click\" + EVENT_KEY$1 + DATA_API_KEY$1,\n    FOCUS_BLUR_DATA_API: \"focus\" + EVENT_KEY$1 + DATA_API_KEY$1 + \" \" + (\"blur\" + EVENT_KEY$1 + DATA_API_KEY$1)\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Button =\n  /*#__PURE__*/\n  function () {\n    function Button(element) {\n      this._element = element;\n    } // Getters\n\n\n    var _proto = Button.prototype;\n\n    // Public\n    _proto.toggle = function toggle() {\n      var triggerChangeEvent = true;\n      var addAriaPressed = true;\n      var rootElement = $(this._element).closest(Selector$1.DATA_TOGGLE)[0];\n\n      if (rootElement) {\n        var input = this._element.querySelector(Selector$1.INPUT);\n\n        if (input) {\n          if (input.type === 'radio') {\n            if (input.checked && this._element.classList.contains(ClassName$1.ACTIVE)) {\n              triggerChangeEvent = false;\n            } else {\n              var activeElement = rootElement.querySelector(Selector$1.ACTIVE);\n\n              if (activeElement) {\n                $(activeElement).removeClass(ClassName$1.ACTIVE);\n              }\n            }\n          }\n\n          if (triggerChangeEvent) {\n            if (input.hasAttribute('disabled') || rootElement.hasAttribute('disabled') || input.classList.contains('disabled') || rootElement.classList.contains('disabled')) {\n              return;\n            }\n\n            input.checked = !this._element.classList.contains(ClassName$1.ACTIVE);\n            $(input).trigger('change');\n          }\n\n          input.focus();\n          addAriaPressed = false;\n        }\n      }\n\n      if (addAriaPressed) {\n        this._element.setAttribute('aria-pressed', !this._element.classList.contains(ClassName$1.ACTIVE));\n      }\n\n      if (triggerChangeEvent) {\n        $(this._element).toggleClass(ClassName$1.ACTIVE);\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$1);\n      this._element = null;\n    } // Static\n    ;\n\n    Button._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$1);\n\n        if (!data) {\n          data = new Button(this);\n          $(this).data(DATA_KEY$1, data);\n        }\n\n        if (config === 'toggle') {\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Button, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$1;\n      }\n    }]);\n\n    return Button;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$1.CLICK_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {\n    event.preventDefault();\n    var button = event.target;\n\n    if (!$(button).hasClass(ClassName$1.BUTTON)) {\n      button = $(button).closest(Selector$1.BUTTON);\n    }\n\n    Button._jQueryInterface.call($(button), 'toggle');\n  }).on(Event$1.FOCUS_BLUR_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {\n    var button = $(event.target).closest(Selector$1.BUTTON)[0];\n    $(button).toggleClass(ClassName$1.FOCUS, /^focus(in)?$/.test(event.type));\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$1] = Button._jQueryInterface;\n  $.fn[NAME$1].Constructor = Button;\n\n  $.fn[NAME$1].noConflict = function () {\n    $.fn[NAME$1] = JQUERY_NO_CONFLICT$1;\n    return Button._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$2 = 'carousel';\n  var VERSION$2 = '4.3.1';\n  var DATA_KEY$2 = 'bs.carousel';\n  var EVENT_KEY$2 = \".\" + DATA_KEY$2;\n  var DATA_API_KEY$2 = '.data-api';\n  var JQUERY_NO_CONFLICT$2 = $.fn[NAME$2];\n  var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key\n\n  var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key\n\n  var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\n\n  var SWIPE_THRESHOLD = 40;\n  var Default = {\n    interval: 5000,\n    keyboard: true,\n    slide: false,\n    pause: 'hover',\n    wrap: true,\n    touch: true\n  };\n  var DefaultType = {\n    interval: '(number|boolean)',\n    keyboard: 'boolean',\n    slide: '(boolean|string)',\n    pause: '(string|boolean)',\n    wrap: 'boolean',\n    touch: 'boolean'\n  };\n  var Direction = {\n    NEXT: 'next',\n    PREV: 'prev',\n    LEFT: 'left',\n    RIGHT: 'right'\n  };\n  var Event$2 = {\n    SLIDE: \"slide\" + EVENT_KEY$2,\n    SLID: \"slid\" + EVENT_KEY$2,\n    KEYDOWN: \"keydown\" + EVENT_KEY$2,\n    MOUSEENTER: \"mouseenter\" + EVENT_KEY$2,\n    MOUSELEAVE: \"mouseleave\" + EVENT_KEY$2,\n    TOUCHSTART: \"touchstart\" + EVENT_KEY$2,\n    TOUCHMOVE: \"touchmove\" + EVENT_KEY$2,\n    TOUCHEND: \"touchend\" + EVENT_KEY$2,\n    POINTERDOWN: \"pointerdown\" + EVENT_KEY$2,\n    POINTERUP: \"pointerup\" + EVENT_KEY$2,\n    DRAG_START: \"dragstart\" + EVENT_KEY$2,\n    LOAD_DATA_API: \"load\" + EVENT_KEY$2 + DATA_API_KEY$2,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$2 + DATA_API_KEY$2\n  };\n  var ClassName$2 = {\n    CAROUSEL: 'carousel',\n    ACTIVE: 'active',\n    SLIDE: 'slide',\n    RIGHT: 'carousel-item-right',\n    LEFT: 'carousel-item-left',\n    NEXT: 'carousel-item-next',\n    PREV: 'carousel-item-prev',\n    ITEM: 'carousel-item',\n    POINTER_EVENT: 'pointer-event'\n  };\n  var Selector$2 = {\n    ACTIVE: '.active',\n    ACTIVE_ITEM: '.active.carousel-item',\n    ITEM: '.carousel-item',\n    ITEM_IMG: '.carousel-item img',\n    NEXT_PREV: '.carousel-item-next, .carousel-item-prev',\n    INDICATORS: '.carousel-indicators',\n    DATA_SLIDE: '[data-slide], [data-slide-to]',\n    DATA_RIDE: '[data-ride=\"carousel\"]'\n  };\n  var PointerType = {\n    TOUCH: 'touch',\n    PEN: 'pen'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Carousel =\n  /*#__PURE__*/\n  function () {\n    function Carousel(element, config) {\n      this._items = null;\n      this._interval = null;\n      this._activeElement = null;\n      this._isPaused = false;\n      this._isSliding = false;\n      this.touchTimeout = null;\n      this.touchStartX = 0;\n      this.touchDeltaX = 0;\n      this._config = this._getConfig(config);\n      this._element = element;\n      this._indicatorsElement = this._element.querySelector(Selector$2.INDICATORS);\n      this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;\n      this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent);\n\n      this._addEventListeners();\n    } // Getters\n\n\n    var _proto = Carousel.prototype;\n\n    // Public\n    _proto.next = function next() {\n      if (!this._isSliding) {\n        this._slide(Direction.NEXT);\n      }\n    };\n\n    _proto.nextWhenVisible = function nextWhenVisible() {\n      // Don't call next when the page isn't visible\n      // or the carousel or its parent isn't visible\n      if (!document.hidden && $(this._element).is(':visible') && $(this._element).css('visibility') !== 'hidden') {\n        this.next();\n      }\n    };\n\n    _proto.prev = function prev() {\n      if (!this._isSliding) {\n        this._slide(Direction.PREV);\n      }\n    };\n\n    _proto.pause = function pause(event) {\n      if (!event) {\n        this._isPaused = true;\n      }\n\n      if (this._element.querySelector(Selector$2.NEXT_PREV)) {\n        Util.triggerTransitionEnd(this._element);\n        this.cycle(true);\n      }\n\n      clearInterval(this._interval);\n      this._interval = null;\n    };\n\n    _proto.cycle = function cycle(event) {\n      if (!event) {\n        this._isPaused = false;\n      }\n\n      if (this._interval) {\n        clearInterval(this._interval);\n        this._interval = null;\n      }\n\n      if (this._config.interval && !this._isPaused) {\n        this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);\n      }\n    };\n\n    _proto.to = function to(index) {\n      var _this = this;\n\n      this._activeElement = this._element.querySelector(Selector$2.ACTIVE_ITEM);\n\n      var activeIndex = this._getItemIndex(this._activeElement);\n\n      if (index > this._items.length - 1 || index < 0) {\n        return;\n      }\n\n      if (this._isSliding) {\n        $(this._element).one(Event$2.SLID, function () {\n          return _this.to(index);\n        });\n        return;\n      }\n\n      if (activeIndex === index) {\n        this.pause();\n        this.cycle();\n        return;\n      }\n\n      var direction = index > activeIndex ? Direction.NEXT : Direction.PREV;\n\n      this._slide(direction, this._items[index]);\n    };\n\n    _proto.dispose = function dispose() {\n      $(this._element).off(EVENT_KEY$2);\n      $.removeData(this._element, DATA_KEY$2);\n      this._items = null;\n      this._config = null;\n      this._element = null;\n      this._interval = null;\n      this._isPaused = null;\n      this._isSliding = null;\n      this._activeElement = null;\n      this._indicatorsElement = null;\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default, config);\n      Util.typeCheckConfig(NAME$2, config, DefaultType);\n      return config;\n    };\n\n    _proto._handleSwipe = function _handleSwipe() {\n      var absDeltax = Math.abs(this.touchDeltaX);\n\n      if (absDeltax <= SWIPE_THRESHOLD) {\n        return;\n      }\n\n      var direction = absDeltax / this.touchDeltaX; // swipe left\n\n      if (direction > 0) {\n        this.prev();\n      } // swipe right\n\n\n      if (direction < 0) {\n        this.next();\n      }\n    };\n\n    _proto._addEventListeners = function _addEventListeners() {\n      var _this2 = this;\n\n      if (this._config.keyboard) {\n        $(this._element).on(Event$2.KEYDOWN, function (event) {\n          return _this2._keydown(event);\n        });\n      }\n\n      if (this._config.pause === 'hover') {\n        $(this._element).on(Event$2.MOUSEENTER, function (event) {\n          return _this2.pause(event);\n        }).on(Event$2.MOUSELEAVE, function (event) {\n          return _this2.cycle(event);\n        });\n      }\n\n      if (this._config.touch) {\n        this._addTouchEventListeners();\n      }\n    };\n\n    _proto._addTouchEventListeners = function _addTouchEventListeners() {\n      var _this3 = this;\n\n      if (!this._touchSupported) {\n        return;\n      }\n\n      var start = function start(event) {\n        if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n          _this3.touchStartX = event.originalEvent.clientX;\n        } else if (!_this3._pointerEvent) {\n          _this3.touchStartX = event.originalEvent.touches[0].clientX;\n        }\n      };\n\n      var move = function move(event) {\n        // ensure swiping with one touch and not pinching\n        if (event.originalEvent.touches && event.originalEvent.touches.length > 1) {\n          _this3.touchDeltaX = 0;\n        } else {\n          _this3.touchDeltaX = event.originalEvent.touches[0].clientX - _this3.touchStartX;\n        }\n      };\n\n      var end = function end(event) {\n        if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n          _this3.touchDeltaX = event.originalEvent.clientX - _this3.touchStartX;\n        }\n\n        _this3._handleSwipe();\n\n        if (_this3._config.pause === 'hover') {\n          // If it's a touch-enabled device, mouseenter/leave are fired as\n          // part of the mouse compatibility events on first tap - the carousel\n          // would stop cycling until user tapped out of it;\n          // here, we listen for touchend, explicitly pause the carousel\n          // (as if it's the second time we tap on it, mouseenter compat event\n          // is NOT fired) and after a timeout (to allow for mouse compatibility\n          // events to fire) we explicitly restart cycling\n          _this3.pause();\n\n          if (_this3.touchTimeout) {\n            clearTimeout(_this3.touchTimeout);\n          }\n\n          _this3.touchTimeout = setTimeout(function (event) {\n            return _this3.cycle(event);\n          }, TOUCHEVENT_COMPAT_WAIT + _this3._config.interval);\n        }\n      };\n\n      $(this._element.querySelectorAll(Selector$2.ITEM_IMG)).on(Event$2.DRAG_START, function (e) {\n        return e.preventDefault();\n      });\n\n      if (this._pointerEvent) {\n        $(this._element).on(Event$2.POINTERDOWN, function (event) {\n          return start(event);\n        });\n        $(this._element).on(Event$2.POINTERUP, function (event) {\n          return end(event);\n        });\n\n        this._element.classList.add(ClassName$2.POINTER_EVENT);\n      } else {\n        $(this._element).on(Event$2.TOUCHSTART, function (event) {\n          return start(event);\n        });\n        $(this._element).on(Event$2.TOUCHMOVE, function (event) {\n          return move(event);\n        });\n        $(this._element).on(Event$2.TOUCHEND, function (event) {\n          return end(event);\n        });\n      }\n    };\n\n    _proto._keydown = function _keydown(event) {\n      if (/input|textarea/i.test(event.target.tagName)) {\n        return;\n      }\n\n      switch (event.which) {\n        case ARROW_LEFT_KEYCODE:\n          event.preventDefault();\n          this.prev();\n          break;\n\n        case ARROW_RIGHT_KEYCODE:\n          event.preventDefault();\n          this.next();\n          break;\n\n        default:\n      }\n    };\n\n    _proto._getItemIndex = function _getItemIndex(element) {\n      this._items = element && element.parentNode ? [].slice.call(element.parentNode.querySelectorAll(Selector$2.ITEM)) : [];\n      return this._items.indexOf(element);\n    };\n\n    _proto._getItemByDirection = function _getItemByDirection(direction, activeElement) {\n      var isNextDirection = direction === Direction.NEXT;\n      var isPrevDirection = direction === Direction.PREV;\n\n      var activeIndex = this._getItemIndex(activeElement);\n\n      var lastItemIndex = this._items.length - 1;\n      var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex;\n\n      if (isGoingToWrap && !this._config.wrap) {\n        return activeElement;\n      }\n\n      var delta = direction === Direction.PREV ? -1 : 1;\n      var itemIndex = (activeIndex + delta) % this._items.length;\n      return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];\n    };\n\n    _proto._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) {\n      var targetIndex = this._getItemIndex(relatedTarget);\n\n      var fromIndex = this._getItemIndex(this._element.querySelector(Selector$2.ACTIVE_ITEM));\n\n      var slideEvent = $.Event(Event$2.SLIDE, {\n        relatedTarget: relatedTarget,\n        direction: eventDirectionName,\n        from: fromIndex,\n        to: targetIndex\n      });\n      $(this._element).trigger(slideEvent);\n      return slideEvent;\n    };\n\n    _proto._setActiveIndicatorElement = function _setActiveIndicatorElement(element) {\n      if (this._indicatorsElement) {\n        var indicators = [].slice.call(this._indicatorsElement.querySelectorAll(Selector$2.ACTIVE));\n        $(indicators).removeClass(ClassName$2.ACTIVE);\n\n        var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)];\n\n        if (nextIndicator) {\n          $(nextIndicator).addClass(ClassName$2.ACTIVE);\n        }\n      }\n    };\n\n    _proto._slide = function _slide(direction, element) {\n      var _this4 = this;\n\n      var activeElement = this._element.querySelector(Selector$2.ACTIVE_ITEM);\n\n      var activeElementIndex = this._getItemIndex(activeElement);\n\n      var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement);\n\n      var nextElementIndex = this._getItemIndex(nextElement);\n\n      var isCycling = Boolean(this._interval);\n      var directionalClassName;\n      var orderClassName;\n      var eventDirectionName;\n\n      if (direction === Direction.NEXT) {\n        directionalClassName = ClassName$2.LEFT;\n        orderClassName = ClassName$2.NEXT;\n        eventDirectionName = Direction.LEFT;\n      } else {\n        directionalClassName = ClassName$2.RIGHT;\n        orderClassName = ClassName$2.PREV;\n        eventDirectionName = Direction.RIGHT;\n      }\n\n      if (nextElement && $(nextElement).hasClass(ClassName$2.ACTIVE)) {\n        this._isSliding = false;\n        return;\n      }\n\n      var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);\n\n      if (slideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      if (!activeElement || !nextElement) {\n        // Some weirdness is happening, so we bail\n        return;\n      }\n\n      this._isSliding = true;\n\n      if (isCycling) {\n        this.pause();\n      }\n\n      this._setActiveIndicatorElement(nextElement);\n\n      var slidEvent = $.Event(Event$2.SLID, {\n        relatedTarget: nextElement,\n        direction: eventDirectionName,\n        from: activeElementIndex,\n        to: nextElementIndex\n      });\n\n      if ($(this._element).hasClass(ClassName$2.SLIDE)) {\n        $(nextElement).addClass(orderClassName);\n        Util.reflow(nextElement);\n        $(activeElement).addClass(directionalClassName);\n        $(nextElement).addClass(directionalClassName);\n        var nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10);\n\n        if (nextElementInterval) {\n          this._config.defaultInterval = this._config.defaultInterval || this._config.interval;\n          this._config.interval = nextElementInterval;\n        } else {\n          this._config.interval = this._config.defaultInterval || this._config.interval;\n        }\n\n        var transitionDuration = Util.getTransitionDurationFromElement(activeElement);\n        $(activeElement).one(Util.TRANSITION_END, function () {\n          $(nextElement).removeClass(directionalClassName + \" \" + orderClassName).addClass(ClassName$2.ACTIVE);\n          $(activeElement).removeClass(ClassName$2.ACTIVE + \" \" + orderClassName + \" \" + directionalClassName);\n          _this4._isSliding = false;\n          setTimeout(function () {\n            return $(_this4._element).trigger(slidEvent);\n          }, 0);\n        }).emulateTransitionEnd(transitionDuration);\n      } else {\n        $(activeElement).removeClass(ClassName$2.ACTIVE);\n        $(nextElement).addClass(ClassName$2.ACTIVE);\n        this._isSliding = false;\n        $(this._element).trigger(slidEvent);\n      }\n\n      if (isCycling) {\n        this.cycle();\n      }\n    } // Static\n    ;\n\n    Carousel._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$2);\n\n        var _config = _objectSpread({}, Default, $(this).data());\n\n        if (typeof config === 'object') {\n          _config = _objectSpread({}, _config, config);\n        }\n\n        var action = typeof config === 'string' ? config : _config.slide;\n\n        if (!data) {\n          data = new Carousel(this, _config);\n          $(this).data(DATA_KEY$2, data);\n        }\n\n        if (typeof config === 'number') {\n          data.to(config);\n        } else if (typeof action === 'string') {\n          if (typeof data[action] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + action + \"\\\"\");\n          }\n\n          data[action]();\n        } else if (_config.interval && _config.ride) {\n          data.pause();\n          data.cycle();\n        }\n      });\n    };\n\n    Carousel._dataApiClickHandler = function _dataApiClickHandler(event) {\n      var selector = Util.getSelectorFromElement(this);\n\n      if (!selector) {\n        return;\n      }\n\n      var target = $(selector)[0];\n\n      if (!target || !$(target).hasClass(ClassName$2.CAROUSEL)) {\n        return;\n      }\n\n      var config = _objectSpread({}, $(target).data(), $(this).data());\n\n      var slideIndex = this.getAttribute('data-slide-to');\n\n      if (slideIndex) {\n        config.interval = false;\n      }\n\n      Carousel._jQueryInterface.call($(target), config);\n\n      if (slideIndex) {\n        $(target).data(DATA_KEY$2).to(slideIndex);\n      }\n\n      event.preventDefault();\n    };\n\n    _createClass(Carousel, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$2;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default;\n      }\n    }]);\n\n    return Carousel;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$2.CLICK_DATA_API, Selector$2.DATA_SLIDE, Carousel._dataApiClickHandler);\n  $(window).on(Event$2.LOAD_DATA_API, function () {\n    var carousels = [].slice.call(document.querySelectorAll(Selector$2.DATA_RIDE));\n\n    for (var i = 0, len = carousels.length; i < len; i++) {\n      var $carousel = $(carousels[i]);\n\n      Carousel._jQueryInterface.call($carousel, $carousel.data());\n    }\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$2] = Carousel._jQueryInterface;\n  $.fn[NAME$2].Constructor = Carousel;\n\n  $.fn[NAME$2].noConflict = function () {\n    $.fn[NAME$2] = JQUERY_NO_CONFLICT$2;\n    return Carousel._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$3 = 'collapse';\n  var VERSION$3 = '4.3.1';\n  var DATA_KEY$3 = 'bs.collapse';\n  var EVENT_KEY$3 = \".\" + DATA_KEY$3;\n  var DATA_API_KEY$3 = '.data-api';\n  var JQUERY_NO_CONFLICT$3 = $.fn[NAME$3];\n  var Default$1 = {\n    toggle: true,\n    parent: ''\n  };\n  var DefaultType$1 = {\n    toggle: 'boolean',\n    parent: '(string|element)'\n  };\n  var Event$3 = {\n    SHOW: \"show\" + EVENT_KEY$3,\n    SHOWN: \"shown\" + EVENT_KEY$3,\n    HIDE: \"hide\" + EVENT_KEY$3,\n    HIDDEN: \"hidden\" + EVENT_KEY$3,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$3 + DATA_API_KEY$3\n  };\n  var ClassName$3 = {\n    SHOW: 'show',\n    COLLAPSE: 'collapse',\n    COLLAPSING: 'collapsing',\n    COLLAPSED: 'collapsed'\n  };\n  var Dimension = {\n    WIDTH: 'width',\n    HEIGHT: 'height'\n  };\n  var Selector$3 = {\n    ACTIVES: '.show, .collapsing',\n    DATA_TOGGLE: '[data-toggle=\"collapse\"]'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Collapse =\n  /*#__PURE__*/\n  function () {\n    function Collapse(element, config) {\n      this._isTransitioning = false;\n      this._element = element;\n      this._config = this._getConfig(config);\n      this._triggerArray = [].slice.call(document.querySelectorAll(\"[data-toggle=\\\"collapse\\\"][href=\\\"#\" + element.id + \"\\\"],\" + (\"[data-toggle=\\\"collapse\\\"][data-target=\\\"#\" + element.id + \"\\\"]\")));\n      var toggleList = [].slice.call(document.querySelectorAll(Selector$3.DATA_TOGGLE));\n\n      for (var i = 0, len = toggleList.length; i < len; i++) {\n        var elem = toggleList[i];\n        var selector = Util.getSelectorFromElement(elem);\n        var filterElement = [].slice.call(document.querySelectorAll(selector)).filter(function (foundElem) {\n          return foundElem === element;\n        });\n\n        if (selector !== null && filterElement.length > 0) {\n          this._selector = selector;\n\n          this._triggerArray.push(elem);\n        }\n      }\n\n      this._parent = this._config.parent ? this._getParent() : null;\n\n      if (!this._config.parent) {\n        this._addAriaAndCollapsedClass(this._element, this._triggerArray);\n      }\n\n      if (this._config.toggle) {\n        this.toggle();\n      }\n    } // Getters\n\n\n    var _proto = Collapse.prototype;\n\n    // Public\n    _proto.toggle = function toggle() {\n      if ($(this._element).hasClass(ClassName$3.SHOW)) {\n        this.hide();\n      } else {\n        this.show();\n      }\n    };\n\n    _proto.show = function show() {\n      var _this = this;\n\n      if (this._isTransitioning || $(this._element).hasClass(ClassName$3.SHOW)) {\n        return;\n      }\n\n      var actives;\n      var activesData;\n\n      if (this._parent) {\n        actives = [].slice.call(this._parent.querySelectorAll(Selector$3.ACTIVES)).filter(function (elem) {\n          if (typeof _this._config.parent === 'string') {\n            return elem.getAttribute('data-parent') === _this._config.parent;\n          }\n\n          return elem.classList.contains(ClassName$3.COLLAPSE);\n        });\n\n        if (actives.length === 0) {\n          actives = null;\n        }\n      }\n\n      if (actives) {\n        activesData = $(actives).not(this._selector).data(DATA_KEY$3);\n\n        if (activesData && activesData._isTransitioning) {\n          return;\n        }\n      }\n\n      var startEvent = $.Event(Event$3.SHOW);\n      $(this._element).trigger(startEvent);\n\n      if (startEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      if (actives) {\n        Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide');\n\n        if (!activesData) {\n          $(actives).data(DATA_KEY$3, null);\n        }\n      }\n\n      var dimension = this._getDimension();\n\n      $(this._element).removeClass(ClassName$3.COLLAPSE).addClass(ClassName$3.COLLAPSING);\n      this._element.style[dimension] = 0;\n\n      if (this._triggerArray.length) {\n        $(this._triggerArray).removeClass(ClassName$3.COLLAPSED).attr('aria-expanded', true);\n      }\n\n      this.setTransitioning(true);\n\n      var complete = function complete() {\n        $(_this._element).removeClass(ClassName$3.COLLAPSING).addClass(ClassName$3.COLLAPSE).addClass(ClassName$3.SHOW);\n        _this._element.style[dimension] = '';\n\n        _this.setTransitioning(false);\n\n        $(_this._element).trigger(Event$3.SHOWN);\n      };\n\n      var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\n      var scrollSize = \"scroll\" + capitalizedDimension;\n      var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n      $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      this._element.style[dimension] = this._element[scrollSize] + \"px\";\n    };\n\n    _proto.hide = function hide() {\n      var _this2 = this;\n\n      if (this._isTransitioning || !$(this._element).hasClass(ClassName$3.SHOW)) {\n        return;\n      }\n\n      var startEvent = $.Event(Event$3.HIDE);\n      $(this._element).trigger(startEvent);\n\n      if (startEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      var dimension = this._getDimension();\n\n      this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + \"px\";\n      Util.reflow(this._element);\n      $(this._element).addClass(ClassName$3.COLLAPSING).removeClass(ClassName$3.COLLAPSE).removeClass(ClassName$3.SHOW);\n      var triggerArrayLength = this._triggerArray.length;\n\n      if (triggerArrayLength > 0) {\n        for (var i = 0; i < triggerArrayLength; i++) {\n          var trigger = this._triggerArray[i];\n          var selector = Util.getSelectorFromElement(trigger);\n\n          if (selector !== null) {\n            var $elem = $([].slice.call(document.querySelectorAll(selector)));\n\n            if (!$elem.hasClass(ClassName$3.SHOW)) {\n              $(trigger).addClass(ClassName$3.COLLAPSED).attr('aria-expanded', false);\n            }\n          }\n        }\n      }\n\n      this.setTransitioning(true);\n\n      var complete = function complete() {\n        _this2.setTransitioning(false);\n\n        $(_this2._element).removeClass(ClassName$3.COLLAPSING).addClass(ClassName$3.COLLAPSE).trigger(Event$3.HIDDEN);\n      };\n\n      this._element.style[dimension] = '';\n      var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n      $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n    };\n\n    _proto.setTransitioning = function setTransitioning(isTransitioning) {\n      this._isTransitioning = isTransitioning;\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$3);\n      this._config = null;\n      this._parent = null;\n      this._element = null;\n      this._triggerArray = null;\n      this._isTransitioning = null;\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default$1, config);\n      config.toggle = Boolean(config.toggle); // Coerce string values\n\n      Util.typeCheckConfig(NAME$3, config, DefaultType$1);\n      return config;\n    };\n\n    _proto._getDimension = function _getDimension() {\n      var hasWidth = $(this._element).hasClass(Dimension.WIDTH);\n      return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;\n    };\n\n    _proto._getParent = function _getParent() {\n      var _this3 = this;\n\n      var parent;\n\n      if (Util.isElement(this._config.parent)) {\n        parent = this._config.parent; // It's a jQuery object\n\n        if (typeof this._config.parent.jquery !== 'undefined') {\n          parent = this._config.parent[0];\n        }\n      } else {\n        parent = document.querySelector(this._config.parent);\n      }\n\n      var selector = \"[data-toggle=\\\"collapse\\\"][data-parent=\\\"\" + this._config.parent + \"\\\"]\";\n      var children = [].slice.call(parent.querySelectorAll(selector));\n      $(children).each(function (i, element) {\n        _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);\n      });\n      return parent;\n    };\n\n    _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {\n      var isOpen = $(element).hasClass(ClassName$3.SHOW);\n\n      if (triggerArray.length) {\n        $(triggerArray).toggleClass(ClassName$3.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);\n      }\n    } // Static\n    ;\n\n    Collapse._getTargetFromElement = function _getTargetFromElement(element) {\n      var selector = Util.getSelectorFromElement(element);\n      return selector ? document.querySelector(selector) : null;\n    };\n\n    Collapse._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $this = $(this);\n        var data = $this.data(DATA_KEY$3);\n\n        var _config = _objectSpread({}, Default$1, $this.data(), typeof config === 'object' && config ? config : {});\n\n        if (!data && _config.toggle && /show|hide/.test(config)) {\n          _config.toggle = false;\n        }\n\n        if (!data) {\n          data = new Collapse(this, _config);\n          $this.data(DATA_KEY$3, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Collapse, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$3;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$1;\n      }\n    }]);\n\n    return Collapse;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$3.CLICK_DATA_API, Selector$3.DATA_TOGGLE, function (event) {\n    // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n    if (event.currentTarget.tagName === 'A') {\n      event.preventDefault();\n    }\n\n    var $trigger = $(this);\n    var selector = Util.getSelectorFromElement(this);\n    var selectors = [].slice.call(document.querySelectorAll(selector));\n    $(selectors).each(function () {\n      var $target = $(this);\n      var data = $target.data(DATA_KEY$3);\n      var config = data ? 'toggle' : $trigger.data();\n\n      Collapse._jQueryInterface.call($target, config);\n    });\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$3] = Collapse._jQueryInterface;\n  $.fn[NAME$3].Constructor = Collapse;\n\n  $.fn[NAME$3].noConflict = function () {\n    $.fn[NAME$3] = JQUERY_NO_CONFLICT$3;\n    return Collapse._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$4 = 'dropdown';\n  var VERSION$4 = '4.3.1';\n  var DATA_KEY$4 = 'bs.dropdown';\n  var EVENT_KEY$4 = \".\" + DATA_KEY$4;\n  var DATA_API_KEY$4 = '.data-api';\n  var JQUERY_NO_CONFLICT$4 = $.fn[NAME$4];\n  var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key\n\n  var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key\n\n  var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key\n\n  var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key\n\n  var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key\n\n  var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)\n\n  var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + \"|\" + ARROW_DOWN_KEYCODE + \"|\" + ESCAPE_KEYCODE);\n  var Event$4 = {\n    HIDE: \"hide\" + EVENT_KEY$4,\n    HIDDEN: \"hidden\" + EVENT_KEY$4,\n    SHOW: \"show\" + EVENT_KEY$4,\n    SHOWN: \"shown\" + EVENT_KEY$4,\n    CLICK: \"click\" + EVENT_KEY$4,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$4 + DATA_API_KEY$4,\n    KEYDOWN_DATA_API: \"keydown\" + EVENT_KEY$4 + DATA_API_KEY$4,\n    KEYUP_DATA_API: \"keyup\" + EVENT_KEY$4 + DATA_API_KEY$4\n  };\n  var ClassName$4 = {\n    DISABLED: 'disabled',\n    SHOW: 'show',\n    DROPUP: 'dropup',\n    DROPRIGHT: 'dropright',\n    DROPLEFT: 'dropleft',\n    MENURIGHT: 'dropdown-menu-right',\n    MENULEFT: 'dropdown-menu-left',\n    POSITION_STATIC: 'position-static'\n  };\n  var Selector$4 = {\n    DATA_TOGGLE: '[data-toggle=\"dropdown\"]',\n    FORM_CHILD: '.dropdown form',\n    MENU: '.dropdown-menu',\n    NAVBAR_NAV: '.navbar-nav',\n    VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n  };\n  var AttachmentMap = {\n    TOP: 'top-start',\n    TOPEND: 'top-end',\n    BOTTOM: 'bottom-start',\n    BOTTOMEND: 'bottom-end',\n    RIGHT: 'right-start',\n    RIGHTEND: 'right-end',\n    LEFT: 'left-start',\n    LEFTEND: 'left-end'\n  };\n  var Default$2 = {\n    offset: 0,\n    flip: true,\n    boundary: 'scrollParent',\n    reference: 'toggle',\n    display: 'dynamic'\n  };\n  var DefaultType$2 = {\n    offset: '(number|string|function)',\n    flip: 'boolean',\n    boundary: '(string|element)',\n    reference: '(string|element)',\n    display: 'string'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Dropdown =\n  /*#__PURE__*/\n  function () {\n    function Dropdown(element, config) {\n      this._element = element;\n      this._popper = null;\n      this._config = this._getConfig(config);\n      this._menu = this._getMenuElement();\n      this._inNavbar = this._detectNavbar();\n\n      this._addEventListeners();\n    } // Getters\n\n\n    var _proto = Dropdown.prototype;\n\n    // Public\n    _proto.toggle = function toggle() {\n      if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED)) {\n        return;\n      }\n\n      var parent = Dropdown._getParentFromElement(this._element);\n\n      var isActive = $(this._menu).hasClass(ClassName$4.SHOW);\n\n      Dropdown._clearMenus();\n\n      if (isActive) {\n        return;\n      }\n\n      var relatedTarget = {\n        relatedTarget: this._element\n      };\n      var showEvent = $.Event(Event$4.SHOW, relatedTarget);\n      $(parent).trigger(showEvent);\n\n      if (showEvent.isDefaultPrevented()) {\n        return;\n      } // Disable totally Popper.js for Dropdown in Navbar\n\n\n      if (!this._inNavbar) {\n        /**\n         * Check for Popper dependency\n         * Popper - https://popper.js.org\n         */\n        if (typeof Popper === 'undefined') {\n          throw new TypeError('Bootstrap\\'s dropdowns require Popper.js (https://popper.js.org/)');\n        }\n\n        var referenceElement = this._element;\n\n        if (this._config.reference === 'parent') {\n          referenceElement = parent;\n        } else if (Util.isElement(this._config.reference)) {\n          referenceElement = this._config.reference; // Check if it's jQuery element\n\n          if (typeof this._config.reference.jquery !== 'undefined') {\n            referenceElement = this._config.reference[0];\n          }\n        } // If boundary is not `scrollParent`, then set position to `static`\n        // to allow the menu to \"escape\" the scroll parent's boundaries\n        // https://github.com/twbs/bootstrap/issues/24251\n\n\n        if (this._config.boundary !== 'scrollParent') {\n          $(parent).addClass(ClassName$4.POSITION_STATIC);\n        }\n\n        this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig());\n      } // If this is a touch-enabled device we add extra\n      // empty mouseover listeners to the body's immediate children;\n      // only needed because of broken event delegation on iOS\n      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n\n      if ('ontouchstart' in document.documentElement && $(parent).closest(Selector$4.NAVBAR_NAV).length === 0) {\n        $(document.body).children().on('mouseover', null, $.noop);\n      }\n\n      this._element.focus();\n\n      this._element.setAttribute('aria-expanded', true);\n\n      $(this._menu).toggleClass(ClassName$4.SHOW);\n      $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget));\n    };\n\n    _proto.show = function show() {\n      if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || $(this._menu).hasClass(ClassName$4.SHOW)) {\n        return;\n      }\n\n      var relatedTarget = {\n        relatedTarget: this._element\n      };\n      var showEvent = $.Event(Event$4.SHOW, relatedTarget);\n\n      var parent = Dropdown._getParentFromElement(this._element);\n\n      $(parent).trigger(showEvent);\n\n      if (showEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      $(this._menu).toggleClass(ClassName$4.SHOW);\n      $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget));\n    };\n\n    _proto.hide = function hide() {\n      if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || !$(this._menu).hasClass(ClassName$4.SHOW)) {\n        return;\n      }\n\n      var relatedTarget = {\n        relatedTarget: this._element\n      };\n      var hideEvent = $.Event(Event$4.HIDE, relatedTarget);\n\n      var parent = Dropdown._getParentFromElement(this._element);\n\n      $(parent).trigger(hideEvent);\n\n      if (hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      $(this._menu).toggleClass(ClassName$4.SHOW);\n      $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$4);\n      $(this._element).off(EVENT_KEY$4);\n      this._element = null;\n      this._menu = null;\n\n      if (this._popper !== null) {\n        this._popper.destroy();\n\n        this._popper = null;\n      }\n    };\n\n    _proto.update = function update() {\n      this._inNavbar = this._detectNavbar();\n\n      if (this._popper !== null) {\n        this._popper.scheduleUpdate();\n      }\n    } // Private\n    ;\n\n    _proto._addEventListeners = function _addEventListeners() {\n      var _this = this;\n\n      $(this._element).on(Event$4.CLICK, function (event) {\n        event.preventDefault();\n        event.stopPropagation();\n\n        _this.toggle();\n      });\n    };\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, this.constructor.Default, $(this._element).data(), config);\n      Util.typeCheckConfig(NAME$4, config, this.constructor.DefaultType);\n      return config;\n    };\n\n    _proto._getMenuElement = function _getMenuElement() {\n      if (!this._menu) {\n        var parent = Dropdown._getParentFromElement(this._element);\n\n        if (parent) {\n          this._menu = parent.querySelector(Selector$4.MENU);\n        }\n      }\n\n      return this._menu;\n    };\n\n    _proto._getPlacement = function _getPlacement() {\n      var $parentDropdown = $(this._element.parentNode);\n      var placement = AttachmentMap.BOTTOM; // Handle dropup\n\n      if ($parentDropdown.hasClass(ClassName$4.DROPUP)) {\n        placement = AttachmentMap.TOP;\n\n        if ($(this._menu).hasClass(ClassName$4.MENURIGHT)) {\n          placement = AttachmentMap.TOPEND;\n        }\n      } else if ($parentDropdown.hasClass(ClassName$4.DROPRIGHT)) {\n        placement = AttachmentMap.RIGHT;\n      } else if ($parentDropdown.hasClass(ClassName$4.DROPLEFT)) {\n        placement = AttachmentMap.LEFT;\n      } else if ($(this._menu).hasClass(ClassName$4.MENURIGHT)) {\n        placement = AttachmentMap.BOTTOMEND;\n      }\n\n      return placement;\n    };\n\n    _proto._detectNavbar = function _detectNavbar() {\n      return $(this._element).closest('.navbar').length > 0;\n    };\n\n    _proto._getOffset = function _getOffset() {\n      var _this2 = this;\n\n      var offset = {};\n\n      if (typeof this._config.offset === 'function') {\n        offset.fn = function (data) {\n          data.offsets = _objectSpread({}, data.offsets, _this2._config.offset(data.offsets, _this2._element) || {});\n          return data;\n        };\n      } else {\n        offset.offset = this._config.offset;\n      }\n\n      return offset;\n    };\n\n    _proto._getPopperConfig = function _getPopperConfig() {\n      var popperConfig = {\n        placement: this._getPlacement(),\n        modifiers: {\n          offset: this._getOffset(),\n          flip: {\n            enabled: this._config.flip\n          },\n          preventOverflow: {\n            boundariesElement: this._config.boundary\n          }\n        } // Disable Popper.js if we have a static display\n\n      };\n\n      if (this._config.display === 'static') {\n        popperConfig.modifiers.applyStyle = {\n          enabled: false\n        };\n      }\n\n      return popperConfig;\n    } // Static\n    ;\n\n    Dropdown._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$4);\n\n        var _config = typeof config === 'object' ? config : null;\n\n        if (!data) {\n          data = new Dropdown(this, _config);\n          $(this).data(DATA_KEY$4, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    Dropdown._clearMenus = function _clearMenus(event) {\n      if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) {\n        return;\n      }\n\n      var toggles = [].slice.call(document.querySelectorAll(Selector$4.DATA_TOGGLE));\n\n      for (var i = 0, len = toggles.length; i < len; i++) {\n        var parent = Dropdown._getParentFromElement(toggles[i]);\n\n        var context = $(toggles[i]).data(DATA_KEY$4);\n        var relatedTarget = {\n          relatedTarget: toggles[i]\n        };\n\n        if (event && event.type === 'click') {\n          relatedTarget.clickEvent = event;\n        }\n\n        if (!context) {\n          continue;\n        }\n\n        var dropdownMenu = context._menu;\n\n        if (!$(parent).hasClass(ClassName$4.SHOW)) {\n          continue;\n        }\n\n        if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $.contains(parent, event.target)) {\n          continue;\n        }\n\n        var hideEvent = $.Event(Event$4.HIDE, relatedTarget);\n        $(parent).trigger(hideEvent);\n\n        if (hideEvent.isDefaultPrevented()) {\n          continue;\n        } // If this is a touch-enabled device we remove the extra\n        // empty mouseover listeners we added for iOS support\n\n\n        if ('ontouchstart' in document.documentElement) {\n          $(document.body).children().off('mouseover', null, $.noop);\n        }\n\n        toggles[i].setAttribute('aria-expanded', 'false');\n        $(dropdownMenu).removeClass(ClassName$4.SHOW);\n        $(parent).removeClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));\n      }\n    };\n\n    Dropdown._getParentFromElement = function _getParentFromElement(element) {\n      var parent;\n      var selector = Util.getSelectorFromElement(element);\n\n      if (selector) {\n        parent = document.querySelector(selector);\n      }\n\n      return parent || element.parentNode;\n    } // eslint-disable-next-line complexity\n    ;\n\n    Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {\n      // If not input/textarea:\n      //  - And not a key in REGEXP_KEYDOWN => not a dropdown command\n      // If input/textarea:\n      //  - If space key => not a dropdown command\n      //  - If key is other than escape\n      //    - If key is not up or down => not a dropdown command\n      //    - If trigger inside the menu => not a dropdown command\n      if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $(event.target).closest(Selector$4.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {\n        return;\n      }\n\n      event.preventDefault();\n      event.stopPropagation();\n\n      if (this.disabled || $(this).hasClass(ClassName$4.DISABLED)) {\n        return;\n      }\n\n      var parent = Dropdown._getParentFromElement(this);\n\n      var isActive = $(parent).hasClass(ClassName$4.SHOW);\n\n      if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {\n        if (event.which === ESCAPE_KEYCODE) {\n          var toggle = parent.querySelector(Selector$4.DATA_TOGGLE);\n          $(toggle).trigger('focus');\n        }\n\n        $(this).trigger('click');\n        return;\n      }\n\n      var items = [].slice.call(parent.querySelectorAll(Selector$4.VISIBLE_ITEMS));\n\n      if (items.length === 0) {\n        return;\n      }\n\n      var index = items.indexOf(event.target);\n\n      if (event.which === ARROW_UP_KEYCODE && index > 0) {\n        // Up\n        index--;\n      }\n\n      if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {\n        // Down\n        index++;\n      }\n\n      if (index < 0) {\n        index = 0;\n      }\n\n      items[index].focus();\n    };\n\n    _createClass(Dropdown, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$4;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$2;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType$2;\n      }\n    }]);\n\n    return Dropdown;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$4.KEYDOWN_DATA_API, Selector$4.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event$4.KEYDOWN_DATA_API, Selector$4.MENU, Dropdown._dataApiKeydownHandler).on(Event$4.CLICK_DATA_API + \" \" + Event$4.KEYUP_DATA_API, Dropdown._clearMenus).on(Event$4.CLICK_DATA_API, Selector$4.DATA_TOGGLE, function (event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    Dropdown._jQueryInterface.call($(this), 'toggle');\n  }).on(Event$4.CLICK_DATA_API, Selector$4.FORM_CHILD, function (e) {\n    e.stopPropagation();\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$4] = Dropdown._jQueryInterface;\n  $.fn[NAME$4].Constructor = Dropdown;\n\n  $.fn[NAME$4].noConflict = function () {\n    $.fn[NAME$4] = JQUERY_NO_CONFLICT$4;\n    return Dropdown._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$5 = 'modal';\n  var VERSION$5 = '4.3.1';\n  var DATA_KEY$5 = 'bs.modal';\n  var EVENT_KEY$5 = \".\" + DATA_KEY$5;\n  var DATA_API_KEY$5 = '.data-api';\n  var JQUERY_NO_CONFLICT$5 = $.fn[NAME$5];\n  var ESCAPE_KEYCODE$1 = 27; // KeyboardEvent.which value for Escape (Esc) key\n\n  var Default$3 = {\n    backdrop: true,\n    keyboard: true,\n    focus: true,\n    show: true\n  };\n  var DefaultType$3 = {\n    backdrop: '(boolean|string)',\n    keyboard: 'boolean',\n    focus: 'boolean',\n    show: 'boolean'\n  };\n  var Event$5 = {\n    HIDE: \"hide\" + EVENT_KEY$5,\n    HIDDEN: \"hidden\" + EVENT_KEY$5,\n    SHOW: \"show\" + EVENT_KEY$5,\n    SHOWN: \"shown\" + EVENT_KEY$5,\n    FOCUSIN: \"focusin\" + EVENT_KEY$5,\n    RESIZE: \"resize\" + EVENT_KEY$5,\n    CLICK_DISMISS: \"click.dismiss\" + EVENT_KEY$5,\n    KEYDOWN_DISMISS: \"keydown.dismiss\" + EVENT_KEY$5,\n    MOUSEUP_DISMISS: \"mouseup.dismiss\" + EVENT_KEY$5,\n    MOUSEDOWN_DISMISS: \"mousedown.dismiss\" + EVENT_KEY$5,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$5 + DATA_API_KEY$5\n  };\n  var ClassName$5 = {\n    SCROLLABLE: 'modal-dialog-scrollable',\n    SCROLLBAR_MEASURER: 'modal-scrollbar-measure',\n    BACKDROP: 'modal-backdrop',\n    OPEN: 'modal-open',\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector$5 = {\n    DIALOG: '.modal-dialog',\n    MODAL_BODY: '.modal-body',\n    DATA_TOGGLE: '[data-toggle=\"modal\"]',\n    DATA_DISMISS: '[data-dismiss=\"modal\"]',\n    FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',\n    STICKY_CONTENT: '.sticky-top'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Modal =\n  /*#__PURE__*/\n  function () {\n    function Modal(element, config) {\n      this._config = this._getConfig(config);\n      this._element = element;\n      this._dialog = element.querySelector(Selector$5.DIALOG);\n      this._backdrop = null;\n      this._isShown = false;\n      this._isBodyOverflowing = false;\n      this._ignoreBackdropClick = false;\n      this._isTransitioning = false;\n      this._scrollbarWidth = 0;\n    } // Getters\n\n\n    var _proto = Modal.prototype;\n\n    // Public\n    _proto.toggle = function toggle(relatedTarget) {\n      return this._isShown ? this.hide() : this.show(relatedTarget);\n    };\n\n    _proto.show = function show(relatedTarget) {\n      var _this = this;\n\n      if (this._isShown || this._isTransitioning) {\n        return;\n      }\n\n      if ($(this._element).hasClass(ClassName$5.FADE)) {\n        this._isTransitioning = true;\n      }\n\n      var showEvent = $.Event(Event$5.SHOW, {\n        relatedTarget: relatedTarget\n      });\n      $(this._element).trigger(showEvent);\n\n      if (this._isShown || showEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      this._isShown = true;\n\n      this._checkScrollbar();\n\n      this._setScrollbar();\n\n      this._adjustDialog();\n\n      this._setEscapeEvent();\n\n      this._setResizeEvent();\n\n      $(this._element).on(Event$5.CLICK_DISMISS, Selector$5.DATA_DISMISS, function (event) {\n        return _this.hide(event);\n      });\n      $(this._dialog).on(Event$5.MOUSEDOWN_DISMISS, function () {\n        $(_this._element).one(Event$5.MOUSEUP_DISMISS, function (event) {\n          if ($(event.target).is(_this._element)) {\n            _this._ignoreBackdropClick = true;\n          }\n        });\n      });\n\n      this._showBackdrop(function () {\n        return _this._showElement(relatedTarget);\n      });\n    };\n\n    _proto.hide = function hide(event) {\n      var _this2 = this;\n\n      if (event) {\n        event.preventDefault();\n      }\n\n      if (!this._isShown || this._isTransitioning) {\n        return;\n      }\n\n      var hideEvent = $.Event(Event$5.HIDE);\n      $(this._element).trigger(hideEvent);\n\n      if (!this._isShown || hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      this._isShown = false;\n      var transition = $(this._element).hasClass(ClassName$5.FADE);\n\n      if (transition) {\n        this._isTransitioning = true;\n      }\n\n      this._setEscapeEvent();\n\n      this._setResizeEvent();\n\n      $(document).off(Event$5.FOCUSIN);\n      $(this._element).removeClass(ClassName$5.SHOW);\n      $(this._element).off(Event$5.CLICK_DISMISS);\n      $(this._dialog).off(Event$5.MOUSEDOWN_DISMISS);\n\n      if (transition) {\n        var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n        $(this._element).one(Util.TRANSITION_END, function (event) {\n          return _this2._hideModal(event);\n        }).emulateTransitionEnd(transitionDuration);\n      } else {\n        this._hideModal();\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      [window, this._element, this._dialog].forEach(function (htmlElement) {\n        return $(htmlElement).off(EVENT_KEY$5);\n      });\n      /**\n       * `document` has 2 events `Event.FOCUSIN` and `Event.CLICK_DATA_API`\n       * Do not move `document` in `htmlElements` array\n       * It will remove `Event.CLICK_DATA_API` event that should remain\n       */\n\n      $(document).off(Event$5.FOCUSIN);\n      $.removeData(this._element, DATA_KEY$5);\n      this._config = null;\n      this._element = null;\n      this._dialog = null;\n      this._backdrop = null;\n      this._isShown = null;\n      this._isBodyOverflowing = null;\n      this._ignoreBackdropClick = null;\n      this._isTransitioning = null;\n      this._scrollbarWidth = null;\n    };\n\n    _proto.handleUpdate = function handleUpdate() {\n      this._adjustDialog();\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default$3, config);\n      Util.typeCheckConfig(NAME$5, config, DefaultType$3);\n      return config;\n    };\n\n    _proto._showElement = function _showElement(relatedTarget) {\n      var _this3 = this;\n\n      var transition = $(this._element).hasClass(ClassName$5.FADE);\n\n      if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n        // Don't move modal's DOM position\n        document.body.appendChild(this._element);\n      }\n\n      this._element.style.display = 'block';\n\n      this._element.removeAttribute('aria-hidden');\n\n      this._element.setAttribute('aria-modal', true);\n\n      if ($(this._dialog).hasClass(ClassName$5.SCROLLABLE)) {\n        this._dialog.querySelector(Selector$5.MODAL_BODY).scrollTop = 0;\n      } else {\n        this._element.scrollTop = 0;\n      }\n\n      if (transition) {\n        Util.reflow(this._element);\n      }\n\n      $(this._element).addClass(ClassName$5.SHOW);\n\n      if (this._config.focus) {\n        this._enforceFocus();\n      }\n\n      var shownEvent = $.Event(Event$5.SHOWN, {\n        relatedTarget: relatedTarget\n      });\n\n      var transitionComplete = function transitionComplete() {\n        if (_this3._config.focus) {\n          _this3._element.focus();\n        }\n\n        _this3._isTransitioning = false;\n        $(_this3._element).trigger(shownEvent);\n      };\n\n      if (transition) {\n        var transitionDuration = Util.getTransitionDurationFromElement(this._dialog);\n        $(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(transitionDuration);\n      } else {\n        transitionComplete();\n      }\n    };\n\n    _proto._enforceFocus = function _enforceFocus() {\n      var _this4 = this;\n\n      $(document).off(Event$5.FOCUSIN) // Guard against infinite focus loop\n      .on(Event$5.FOCUSIN, function (event) {\n        if (document !== event.target && _this4._element !== event.target && $(_this4._element).has(event.target).length === 0) {\n          _this4._element.focus();\n        }\n      });\n    };\n\n    _proto._setEscapeEvent = function _setEscapeEvent() {\n      var _this5 = this;\n\n      if (this._isShown && this._config.keyboard) {\n        $(this._element).on(Event$5.KEYDOWN_DISMISS, function (event) {\n          if (event.which === ESCAPE_KEYCODE$1) {\n            event.preventDefault();\n\n            _this5.hide();\n          }\n        });\n      } else if (!this._isShown) {\n        $(this._element).off(Event$5.KEYDOWN_DISMISS);\n      }\n    };\n\n    _proto._setResizeEvent = function _setResizeEvent() {\n      var _this6 = this;\n\n      if (this._isShown) {\n        $(window).on(Event$5.RESIZE, function (event) {\n          return _this6.handleUpdate(event);\n        });\n      } else {\n        $(window).off(Event$5.RESIZE);\n      }\n    };\n\n    _proto._hideModal = function _hideModal() {\n      var _this7 = this;\n\n      this._element.style.display = 'none';\n\n      this._element.setAttribute('aria-hidden', true);\n\n      this._element.removeAttribute('aria-modal');\n\n      this._isTransitioning = false;\n\n      this._showBackdrop(function () {\n        $(document.body).removeClass(ClassName$5.OPEN);\n\n        _this7._resetAdjustments();\n\n        _this7._resetScrollbar();\n\n        $(_this7._element).trigger(Event$5.HIDDEN);\n      });\n    };\n\n    _proto._removeBackdrop = function _removeBackdrop() {\n      if (this._backdrop) {\n        $(this._backdrop).remove();\n        this._backdrop = null;\n      }\n    };\n\n    _proto._showBackdrop = function _showBackdrop(callback) {\n      var _this8 = this;\n\n      var animate = $(this._element).hasClass(ClassName$5.FADE) ? ClassName$5.FADE : '';\n\n      if (this._isShown && this._config.backdrop) {\n        this._backdrop = document.createElement('div');\n        this._backdrop.className = ClassName$5.BACKDROP;\n\n        if (animate) {\n          this._backdrop.classList.add(animate);\n        }\n\n        $(this._backdrop).appendTo(document.body);\n        $(this._element).on(Event$5.CLICK_DISMISS, function (event) {\n          if (_this8._ignoreBackdropClick) {\n            _this8._ignoreBackdropClick = false;\n            return;\n          }\n\n          if (event.target !== event.currentTarget) {\n            return;\n          }\n\n          if (_this8._config.backdrop === 'static') {\n            _this8._element.focus();\n          } else {\n            _this8.hide();\n          }\n        });\n\n        if (animate) {\n          Util.reflow(this._backdrop);\n        }\n\n        $(this._backdrop).addClass(ClassName$5.SHOW);\n\n        if (!callback) {\n          return;\n        }\n\n        if (!animate) {\n          callback();\n          return;\n        }\n\n        var backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);\n        $(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(backdropTransitionDuration);\n      } else if (!this._isShown && this._backdrop) {\n        $(this._backdrop).removeClass(ClassName$5.SHOW);\n\n        var callbackRemove = function callbackRemove() {\n          _this8._removeBackdrop();\n\n          if (callback) {\n            callback();\n          }\n        };\n\n        if ($(this._element).hasClass(ClassName$5.FADE)) {\n          var _backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);\n\n          $(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(_backdropTransitionDuration);\n        } else {\n          callbackRemove();\n        }\n      } else if (callback) {\n        callback();\n      }\n    } // ----------------------------------------------------------------------\n    // the following methods are used to handle overflowing modals\n    // todo (fat): these should probably be refactored out of modal.js\n    // ----------------------------------------------------------------------\n    ;\n\n    _proto._adjustDialog = function _adjustDialog() {\n      var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n\n      if (!this._isBodyOverflowing && isModalOverflowing) {\n        this._element.style.paddingLeft = this._scrollbarWidth + \"px\";\n      }\n\n      if (this._isBodyOverflowing && !isModalOverflowing) {\n        this._element.style.paddingRight = this._scrollbarWidth + \"px\";\n      }\n    };\n\n    _proto._resetAdjustments = function _resetAdjustments() {\n      this._element.style.paddingLeft = '';\n      this._element.style.paddingRight = '';\n    };\n\n    _proto._checkScrollbar = function _checkScrollbar() {\n      var rect = document.body.getBoundingClientRect();\n      this._isBodyOverflowing = rect.left + rect.right < window.innerWidth;\n      this._scrollbarWidth = this._getScrollbarWidth();\n    };\n\n    _proto._setScrollbar = function _setScrollbar() {\n      var _this9 = this;\n\n      if (this._isBodyOverflowing) {\n        // Note: DOMNode.style.paddingRight returns the actual value or '' if not set\n        //   while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set\n        var fixedContent = [].slice.call(document.querySelectorAll(Selector$5.FIXED_CONTENT));\n        var stickyContent = [].slice.call(document.querySelectorAll(Selector$5.STICKY_CONTENT)); // Adjust fixed content padding\n\n        $(fixedContent).each(function (index, element) {\n          var actualPadding = element.style.paddingRight;\n          var calculatedPadding = $(element).css('padding-right');\n          $(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this9._scrollbarWidth + \"px\");\n        }); // Adjust sticky content margin\n\n        $(stickyContent).each(function (index, element) {\n          var actualMargin = element.style.marginRight;\n          var calculatedMargin = $(element).css('margin-right');\n          $(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this9._scrollbarWidth + \"px\");\n        }); // Adjust body padding\n\n        var actualPadding = document.body.style.paddingRight;\n        var calculatedPadding = $(document.body).css('padding-right');\n        $(document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + \"px\");\n      }\n\n      $(document.body).addClass(ClassName$5.OPEN);\n    };\n\n    _proto._resetScrollbar = function _resetScrollbar() {\n      // Restore fixed content padding\n      var fixedContent = [].slice.call(document.querySelectorAll(Selector$5.FIXED_CONTENT));\n      $(fixedContent).each(function (index, element) {\n        var padding = $(element).data('padding-right');\n        $(element).removeData('padding-right');\n        element.style.paddingRight = padding ? padding : '';\n      }); // Restore sticky content\n\n      var elements = [].slice.call(document.querySelectorAll(\"\" + Selector$5.STICKY_CONTENT));\n      $(elements).each(function (index, element) {\n        var margin = $(element).data('margin-right');\n\n        if (typeof margin !== 'undefined') {\n          $(element).css('margin-right', margin).removeData('margin-right');\n        }\n      }); // Restore body padding\n\n      var padding = $(document.body).data('padding-right');\n      $(document.body).removeData('padding-right');\n      document.body.style.paddingRight = padding ? padding : '';\n    };\n\n    _proto._getScrollbarWidth = function _getScrollbarWidth() {\n      // thx d.walsh\n      var scrollDiv = document.createElement('div');\n      scrollDiv.className = ClassName$5.SCROLLBAR_MEASURER;\n      document.body.appendChild(scrollDiv);\n      var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;\n      document.body.removeChild(scrollDiv);\n      return scrollbarWidth;\n    } // Static\n    ;\n\n    Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$5);\n\n        var _config = _objectSpread({}, Default$3, $(this).data(), typeof config === 'object' && config ? config : {});\n\n        if (!data) {\n          data = new Modal(this, _config);\n          $(this).data(DATA_KEY$5, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config](relatedTarget);\n        } else if (_config.show) {\n          data.show(relatedTarget);\n        }\n      });\n    };\n\n    _createClass(Modal, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$5;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$3;\n      }\n    }]);\n\n    return Modal;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$5.CLICK_DATA_API, Selector$5.DATA_TOGGLE, function (event) {\n    var _this10 = this;\n\n    var target;\n    var selector = Util.getSelectorFromElement(this);\n\n    if (selector) {\n      target = document.querySelector(selector);\n    }\n\n    var config = $(target).data(DATA_KEY$5) ? 'toggle' : _objectSpread({}, $(target).data(), $(this).data());\n\n    if (this.tagName === 'A' || this.tagName === 'AREA') {\n      event.preventDefault();\n    }\n\n    var $target = $(target).one(Event$5.SHOW, function (showEvent) {\n      if (showEvent.isDefaultPrevented()) {\n        // Only register focus restorer if modal will actually get shown\n        return;\n      }\n\n      $target.one(Event$5.HIDDEN, function () {\n        if ($(_this10).is(':visible')) {\n          _this10.focus();\n        }\n      });\n    });\n\n    Modal._jQueryInterface.call($(target), config, this);\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$5] = Modal._jQueryInterface;\n  $.fn[NAME$5].Constructor = Modal;\n\n  $.fn[NAME$5].noConflict = function () {\n    $.fn[NAME$5] = JQUERY_NO_CONFLICT$5;\n    return Modal._jQueryInterface;\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.3.1): tools/sanitizer.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  var uriAttrs = ['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href'];\n  var ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i;\n  var DefaultWhitelist = {\n    // Global attributes allowed on any supplied element below.\n    '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n    a: ['target', 'href', 'title', 'rel'],\n    area: [],\n    b: [],\n    br: [],\n    col: [],\n    code: [],\n    div: [],\n    em: [],\n    hr: [],\n    h1: [],\n    h2: [],\n    h3: [],\n    h4: [],\n    h5: [],\n    h6: [],\n    i: [],\n    img: ['src', 'alt', 'title', 'width', 'height'],\n    li: [],\n    ol: [],\n    p: [],\n    pre: [],\n    s: [],\n    small: [],\n    span: [],\n    sub: [],\n    sup: [],\n    strong: [],\n    u: [],\n    ul: []\n    /**\n     * A pattern that recognizes a commonly useful subset of URLs that are safe.\n     *\n     * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n     */\n\n  };\n  var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi;\n  /**\n   * A pattern that matches safe data URLs. Only matches image, video and audio types.\n   *\n   * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n   */\n\n  var DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i;\n\n  function allowedAttribute(attr, allowedAttributeList) {\n    var attrName = attr.nodeName.toLowerCase();\n\n    if (allowedAttributeList.indexOf(attrName) !== -1) {\n      if (uriAttrs.indexOf(attrName) !== -1) {\n        return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN));\n      }\n\n      return true;\n    }\n\n    var regExp = allowedAttributeList.filter(function (attrRegex) {\n      return attrRegex instanceof RegExp;\n    }); // Check if a regular expression validates the attribute.\n\n    for (var i = 0, l = regExp.length; i < l; i++) {\n      if (attrName.match(regExp[i])) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {\n    if (unsafeHtml.length === 0) {\n      return unsafeHtml;\n    }\n\n    if (sanitizeFn && typeof sanitizeFn === 'function') {\n      return sanitizeFn(unsafeHtml);\n    }\n\n    var domParser = new window.DOMParser();\n    var createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');\n    var whitelistKeys = Object.keys(whiteList);\n    var elements = [].slice.call(createdDocument.body.querySelectorAll('*'));\n\n    var _loop = function _loop(i, len) {\n      var el = elements[i];\n      var elName = el.nodeName.toLowerCase();\n\n      if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) {\n        el.parentNode.removeChild(el);\n        return \"continue\";\n      }\n\n      var attributeList = [].slice.call(el.attributes);\n      var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || []);\n      attributeList.forEach(function (attr) {\n        if (!allowedAttribute(attr, whitelistedAttributes)) {\n          el.removeAttribute(attr.nodeName);\n        }\n      });\n    };\n\n    for (var i = 0, len = elements.length; i < len; i++) {\n      var _ret = _loop(i, len);\n\n      if (_ret === \"continue\") continue;\n    }\n\n    return createdDocument.body.innerHTML;\n  }\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$6 = 'tooltip';\n  var VERSION$6 = '4.3.1';\n  var DATA_KEY$6 = 'bs.tooltip';\n  var EVENT_KEY$6 = \".\" + DATA_KEY$6;\n  var JQUERY_NO_CONFLICT$6 = $.fn[NAME$6];\n  var CLASS_PREFIX = 'bs-tooltip';\n  var BSCLS_PREFIX_REGEX = new RegExp(\"(^|\\\\s)\" + CLASS_PREFIX + \"\\\\S+\", 'g');\n  var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn'];\n  var DefaultType$4 = {\n    animation: 'boolean',\n    template: 'string',\n    title: '(string|element|function)',\n    trigger: 'string',\n    delay: '(number|object)',\n    html: 'boolean',\n    selector: '(string|boolean)',\n    placement: '(string|function)',\n    offset: '(number|string|function)',\n    container: '(string|element|boolean)',\n    fallbackPlacement: '(string|array)',\n    boundary: '(string|element)',\n    sanitize: 'boolean',\n    sanitizeFn: '(null|function)',\n    whiteList: 'object'\n  };\n  var AttachmentMap$1 = {\n    AUTO: 'auto',\n    TOP: 'top',\n    RIGHT: 'right',\n    BOTTOM: 'bottom',\n    LEFT: 'left'\n  };\n  var Default$4 = {\n    animation: true,\n    template: '<div class=\"tooltip\" role=\"tooltip\">' + '<div class=\"arrow\"></div>' + '<div class=\"tooltip-inner\"></div></div>',\n    trigger: 'hover focus',\n    title: '',\n    delay: 0,\n    html: false,\n    selector: false,\n    placement: 'top',\n    offset: 0,\n    container: false,\n    fallbackPlacement: 'flip',\n    boundary: 'scrollParent',\n    sanitize: true,\n    sanitizeFn: null,\n    whiteList: DefaultWhitelist\n  };\n  var HoverState = {\n    SHOW: 'show',\n    OUT: 'out'\n  };\n  var Event$6 = {\n    HIDE: \"hide\" + EVENT_KEY$6,\n    HIDDEN: \"hidden\" + EVENT_KEY$6,\n    SHOW: \"show\" + EVENT_KEY$6,\n    SHOWN: \"shown\" + EVENT_KEY$6,\n    INSERTED: \"inserted\" + EVENT_KEY$6,\n    CLICK: \"click\" + EVENT_KEY$6,\n    FOCUSIN: \"focusin\" + EVENT_KEY$6,\n    FOCUSOUT: \"focusout\" + EVENT_KEY$6,\n    MOUSEENTER: \"mouseenter\" + EVENT_KEY$6,\n    MOUSELEAVE: \"mouseleave\" + EVENT_KEY$6\n  };\n  var ClassName$6 = {\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector$6 = {\n    TOOLTIP: '.tooltip',\n    TOOLTIP_INNER: '.tooltip-inner',\n    ARROW: '.arrow'\n  };\n  var Trigger = {\n    HOVER: 'hover',\n    FOCUS: 'focus',\n    CLICK: 'click',\n    MANUAL: 'manual'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Tooltip =\n  /*#__PURE__*/\n  function () {\n    function Tooltip(element, config) {\n      /**\n       * Check for Popper dependency\n       * Popper - https://popper.js.org\n       */\n      if (typeof Popper === 'undefined') {\n        throw new TypeError('Bootstrap\\'s tooltips require Popper.js (https://popper.js.org/)');\n      } // private\n\n\n      this._isEnabled = true;\n      this._timeout = 0;\n      this._hoverState = '';\n      this._activeTrigger = {};\n      this._popper = null; // Protected\n\n      this.element = element;\n      this.config = this._getConfig(config);\n      this.tip = null;\n\n      this._setListeners();\n    } // Getters\n\n\n    var _proto = Tooltip.prototype;\n\n    // Public\n    _proto.enable = function enable() {\n      this._isEnabled = true;\n    };\n\n    _proto.disable = function disable() {\n      this._isEnabled = false;\n    };\n\n    _proto.toggleEnabled = function toggleEnabled() {\n      this._isEnabled = !this._isEnabled;\n    };\n\n    _proto.toggle = function toggle(event) {\n      if (!this._isEnabled) {\n        return;\n      }\n\n      if (event) {\n        var dataKey = this.constructor.DATA_KEY;\n        var context = $(event.currentTarget).data(dataKey);\n\n        if (!context) {\n          context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n          $(event.currentTarget).data(dataKey, context);\n        }\n\n        context._activeTrigger.click = !context._activeTrigger.click;\n\n        if (context._isWithActiveTrigger()) {\n          context._enter(null, context);\n        } else {\n          context._leave(null, context);\n        }\n      } else {\n        if ($(this.getTipElement()).hasClass(ClassName$6.SHOW)) {\n          this._leave(null, this);\n\n          return;\n        }\n\n        this._enter(null, this);\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      clearTimeout(this._timeout);\n      $.removeData(this.element, this.constructor.DATA_KEY);\n      $(this.element).off(this.constructor.EVENT_KEY);\n      $(this.element).closest('.modal').off('hide.bs.modal');\n\n      if (this.tip) {\n        $(this.tip).remove();\n      }\n\n      this._isEnabled = null;\n      this._timeout = null;\n      this._hoverState = null;\n      this._activeTrigger = null;\n\n      if (this._popper !== null) {\n        this._popper.destroy();\n      }\n\n      this._popper = null;\n      this.element = null;\n      this.config = null;\n      this.tip = null;\n    };\n\n    _proto.show = function show() {\n      var _this = this;\n\n      if ($(this.element).css('display') === 'none') {\n        throw new Error('Please use show on visible elements');\n      }\n\n      var showEvent = $.Event(this.constructor.Event.SHOW);\n\n      if (this.isWithContent() && this._isEnabled) {\n        $(this.element).trigger(showEvent);\n        var shadowRoot = Util.findShadowRoot(this.element);\n        var isInTheDom = $.contains(shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement, this.element);\n\n        if (showEvent.isDefaultPrevented() || !isInTheDom) {\n          return;\n        }\n\n        var tip = this.getTipElement();\n        var tipId = Util.getUID(this.constructor.NAME);\n        tip.setAttribute('id', tipId);\n        this.element.setAttribute('aria-describedby', tipId);\n        this.setContent();\n\n        if (this.config.animation) {\n          $(tip).addClass(ClassName$6.FADE);\n        }\n\n        var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement;\n\n        var attachment = this._getAttachment(placement);\n\n        this.addAttachmentClass(attachment);\n\n        var container = this._getContainer();\n\n        $(tip).data(this.constructor.DATA_KEY, this);\n\n        if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) {\n          $(tip).appendTo(container);\n        }\n\n        $(this.element).trigger(this.constructor.Event.INSERTED);\n        this._popper = new Popper(this.element, tip, {\n          placement: attachment,\n          modifiers: {\n            offset: this._getOffset(),\n            flip: {\n              behavior: this.config.fallbackPlacement\n            },\n            arrow: {\n              element: Selector$6.ARROW\n            },\n            preventOverflow: {\n              boundariesElement: this.config.boundary\n            }\n          },\n          onCreate: function onCreate(data) {\n            if (data.originalPlacement !== data.placement) {\n              _this._handlePopperPlacementChange(data);\n            }\n          },\n          onUpdate: function onUpdate(data) {\n            return _this._handlePopperPlacementChange(data);\n          }\n        });\n        $(tip).addClass(ClassName$6.SHOW); // If this is a touch-enabled device we add extra\n        // empty mouseover listeners to the body's immediate children;\n        // only needed because of broken event delegation on iOS\n        // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n        if ('ontouchstart' in document.documentElement) {\n          $(document.body).children().on('mouseover', null, $.noop);\n        }\n\n        var complete = function complete() {\n          if (_this.config.animation) {\n            _this._fixTransition();\n          }\n\n          var prevHoverState = _this._hoverState;\n          _this._hoverState = null;\n          $(_this.element).trigger(_this.constructor.Event.SHOWN);\n\n          if (prevHoverState === HoverState.OUT) {\n            _this._leave(null, _this);\n          }\n        };\n\n        if ($(this.tip).hasClass(ClassName$6.FADE)) {\n          var transitionDuration = Util.getTransitionDurationFromElement(this.tip);\n          $(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n        } else {\n          complete();\n        }\n      }\n    };\n\n    _proto.hide = function hide(callback) {\n      var _this2 = this;\n\n      var tip = this.getTipElement();\n      var hideEvent = $.Event(this.constructor.Event.HIDE);\n\n      var complete = function complete() {\n        if (_this2._hoverState !== HoverState.SHOW && tip.parentNode) {\n          tip.parentNode.removeChild(tip);\n        }\n\n        _this2._cleanTipClass();\n\n        _this2.element.removeAttribute('aria-describedby');\n\n        $(_this2.element).trigger(_this2.constructor.Event.HIDDEN);\n\n        if (_this2._popper !== null) {\n          _this2._popper.destroy();\n        }\n\n        if (callback) {\n          callback();\n        }\n      };\n\n      $(this.element).trigger(hideEvent);\n\n      if (hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      $(tip).removeClass(ClassName$6.SHOW); // If this is a touch-enabled device we remove the extra\n      // empty mouseover listeners we added for iOS support\n\n      if ('ontouchstart' in document.documentElement) {\n        $(document.body).children().off('mouseover', null, $.noop);\n      }\n\n      this._activeTrigger[Trigger.CLICK] = false;\n      this._activeTrigger[Trigger.FOCUS] = false;\n      this._activeTrigger[Trigger.HOVER] = false;\n\n      if ($(this.tip).hasClass(ClassName$6.FADE)) {\n        var transitionDuration = Util.getTransitionDurationFromElement(tip);\n        $(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      } else {\n        complete();\n      }\n\n      this._hoverState = '';\n    };\n\n    _proto.update = function update() {\n      if (this._popper !== null) {\n        this._popper.scheduleUpdate();\n      }\n    } // Protected\n    ;\n\n    _proto.isWithContent = function isWithContent() {\n      return Boolean(this.getTitle());\n    };\n\n    _proto.addAttachmentClass = function addAttachmentClass(attachment) {\n      $(this.getTipElement()).addClass(CLASS_PREFIX + \"-\" + attachment);\n    };\n\n    _proto.getTipElement = function getTipElement() {\n      this.tip = this.tip || $(this.config.template)[0];\n      return this.tip;\n    };\n\n    _proto.setContent = function setContent() {\n      var tip = this.getTipElement();\n      this.setElementContent($(tip.querySelectorAll(Selector$6.TOOLTIP_INNER)), this.getTitle());\n      $(tip).removeClass(ClassName$6.FADE + \" \" + ClassName$6.SHOW);\n    };\n\n    _proto.setElementContent = function setElementContent($element, content) {\n      if (typeof content === 'object' && (content.nodeType || content.jquery)) {\n        // Content is a DOM node or a jQuery\n        if (this.config.html) {\n          if (!$(content).parent().is($element)) {\n            $element.empty().append(content);\n          }\n        } else {\n          $element.text($(content).text());\n        }\n\n        return;\n      }\n\n      if (this.config.html) {\n        if (this.config.sanitize) {\n          content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn);\n        }\n\n        $element.html(content);\n      } else {\n        $element.text(content);\n      }\n    };\n\n    _proto.getTitle = function getTitle() {\n      var title = this.element.getAttribute('data-original-title');\n\n      if (!title) {\n        title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title;\n      }\n\n      return title;\n    } // Private\n    ;\n\n    _proto._getOffset = function _getOffset() {\n      var _this3 = this;\n\n      var offset = {};\n\n      if (typeof this.config.offset === 'function') {\n        offset.fn = function (data) {\n          data.offsets = _objectSpread({}, data.offsets, _this3.config.offset(data.offsets, _this3.element) || {});\n          return data;\n        };\n      } else {\n        offset.offset = this.config.offset;\n      }\n\n      return offset;\n    };\n\n    _proto._getContainer = function _getContainer() {\n      if (this.config.container === false) {\n        return document.body;\n      }\n\n      if (Util.isElement(this.config.container)) {\n        return $(this.config.container);\n      }\n\n      return $(document).find(this.config.container);\n    };\n\n    _proto._getAttachment = function _getAttachment(placement) {\n      return AttachmentMap$1[placement.toUpperCase()];\n    };\n\n    _proto._setListeners = function _setListeners() {\n      var _this4 = this;\n\n      var triggers = this.config.trigger.split(' ');\n      triggers.forEach(function (trigger) {\n        if (trigger === 'click') {\n          $(_this4.element).on(_this4.constructor.Event.CLICK, _this4.config.selector, function (event) {\n            return _this4.toggle(event);\n          });\n        } else if (trigger !== Trigger.MANUAL) {\n          var eventIn = trigger === Trigger.HOVER ? _this4.constructor.Event.MOUSEENTER : _this4.constructor.Event.FOCUSIN;\n          var eventOut = trigger === Trigger.HOVER ? _this4.constructor.Event.MOUSELEAVE : _this4.constructor.Event.FOCUSOUT;\n          $(_this4.element).on(eventIn, _this4.config.selector, function (event) {\n            return _this4._enter(event);\n          }).on(eventOut, _this4.config.selector, function (event) {\n            return _this4._leave(event);\n          });\n        }\n      });\n      $(this.element).closest('.modal').on('hide.bs.modal', function () {\n        if (_this4.element) {\n          _this4.hide();\n        }\n      });\n\n      if (this.config.selector) {\n        this.config = _objectSpread({}, this.config, {\n          trigger: 'manual',\n          selector: ''\n        });\n      } else {\n        this._fixTitle();\n      }\n    };\n\n    _proto._fixTitle = function _fixTitle() {\n      var titleType = typeof this.element.getAttribute('data-original-title');\n\n      if (this.element.getAttribute('title') || titleType !== 'string') {\n        this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');\n        this.element.setAttribute('title', '');\n      }\n    };\n\n    _proto._enter = function _enter(event, context) {\n      var dataKey = this.constructor.DATA_KEY;\n      context = context || $(event.currentTarget).data(dataKey);\n\n      if (!context) {\n        context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n        $(event.currentTarget).data(dataKey, context);\n      }\n\n      if (event) {\n        context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true;\n      }\n\n      if ($(context.getTipElement()).hasClass(ClassName$6.SHOW) || context._hoverState === HoverState.SHOW) {\n        context._hoverState = HoverState.SHOW;\n        return;\n      }\n\n      clearTimeout(context._timeout);\n      context._hoverState = HoverState.SHOW;\n\n      if (!context.config.delay || !context.config.delay.show) {\n        context.show();\n        return;\n      }\n\n      context._timeout = setTimeout(function () {\n        if (context._hoverState === HoverState.SHOW) {\n          context.show();\n        }\n      }, context.config.delay.show);\n    };\n\n    _proto._leave = function _leave(event, context) {\n      var dataKey = this.constructor.DATA_KEY;\n      context = context || $(event.currentTarget).data(dataKey);\n\n      if (!context) {\n        context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n        $(event.currentTarget).data(dataKey, context);\n      }\n\n      if (event) {\n        context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false;\n      }\n\n      if (context._isWithActiveTrigger()) {\n        return;\n      }\n\n      clearTimeout(context._timeout);\n      context._hoverState = HoverState.OUT;\n\n      if (!context.config.delay || !context.config.delay.hide) {\n        context.hide();\n        return;\n      }\n\n      context._timeout = setTimeout(function () {\n        if (context._hoverState === HoverState.OUT) {\n          context.hide();\n        }\n      }, context.config.delay.hide);\n    };\n\n    _proto._isWithActiveTrigger = function _isWithActiveTrigger() {\n      for (var trigger in this._activeTrigger) {\n        if (this._activeTrigger[trigger]) {\n          return true;\n        }\n      }\n\n      return false;\n    };\n\n    _proto._getConfig = function _getConfig(config) {\n      var dataAttributes = $(this.element).data();\n      Object.keys(dataAttributes).forEach(function (dataAttr) {\n        if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {\n          delete dataAttributes[dataAttr];\n        }\n      });\n      config = _objectSpread({}, this.constructor.Default, dataAttributes, typeof config === 'object' && config ? config : {});\n\n      if (typeof config.delay === 'number') {\n        config.delay = {\n          show: config.delay,\n          hide: config.delay\n        };\n      }\n\n      if (typeof config.title === 'number') {\n        config.title = config.title.toString();\n      }\n\n      if (typeof config.content === 'number') {\n        config.content = config.content.toString();\n      }\n\n      Util.typeCheckConfig(NAME$6, config, this.constructor.DefaultType);\n\n      if (config.sanitize) {\n        config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn);\n      }\n\n      return config;\n    };\n\n    _proto._getDelegateConfig = function _getDelegateConfig() {\n      var config = {};\n\n      if (this.config) {\n        for (var key in this.config) {\n          if (this.constructor.Default[key] !== this.config[key]) {\n            config[key] = this.config[key];\n          }\n        }\n      }\n\n      return config;\n    };\n\n    _proto._cleanTipClass = function _cleanTipClass() {\n      var $tip = $(this.getTipElement());\n      var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);\n\n      if (tabClass !== null && tabClass.length) {\n        $tip.removeClass(tabClass.join(''));\n      }\n    };\n\n    _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(popperData) {\n      var popperInstance = popperData.instance;\n      this.tip = popperInstance.popper;\n\n      this._cleanTipClass();\n\n      this.addAttachmentClass(this._getAttachment(popperData.placement));\n    };\n\n    _proto._fixTransition = function _fixTransition() {\n      var tip = this.getTipElement();\n      var initConfigAnimation = this.config.animation;\n\n      if (tip.getAttribute('x-placement') !== null) {\n        return;\n      }\n\n      $(tip).removeClass(ClassName$6.FADE);\n      this.config.animation = false;\n      this.hide();\n      this.show();\n      this.config.animation = initConfigAnimation;\n    } // Static\n    ;\n\n    Tooltip._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$6);\n\n        var _config = typeof config === 'object' && config;\n\n        if (!data && /dispose|hide/.test(config)) {\n          return;\n        }\n\n        if (!data) {\n          data = new Tooltip(this, _config);\n          $(this).data(DATA_KEY$6, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Tooltip, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$6;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$4;\n      }\n    }, {\n      key: \"NAME\",\n      get: function get() {\n        return NAME$6;\n      }\n    }, {\n      key: \"DATA_KEY\",\n      get: function get() {\n        return DATA_KEY$6;\n      }\n    }, {\n      key: \"Event\",\n      get: function get() {\n        return Event$6;\n      }\n    }, {\n      key: \"EVENT_KEY\",\n      get: function get() {\n        return EVENT_KEY$6;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType$4;\n      }\n    }]);\n\n    return Tooltip;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n\n  $.fn[NAME$6] = Tooltip._jQueryInterface;\n  $.fn[NAME$6].Constructor = Tooltip;\n\n  $.fn[NAME$6].noConflict = function () {\n    $.fn[NAME$6] = JQUERY_NO_CONFLICT$6;\n    return Tooltip._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$7 = 'popover';\n  var VERSION$7 = '4.3.1';\n  var DATA_KEY$7 = 'bs.popover';\n  var EVENT_KEY$7 = \".\" + DATA_KEY$7;\n  var JQUERY_NO_CONFLICT$7 = $.fn[NAME$7];\n  var CLASS_PREFIX$1 = 'bs-popover';\n  var BSCLS_PREFIX_REGEX$1 = new RegExp(\"(^|\\\\s)\" + CLASS_PREFIX$1 + \"\\\\S+\", 'g');\n\n  var Default$5 = _objectSpread({}, Tooltip.Default, {\n    placement: 'right',\n    trigger: 'click',\n    content: '',\n    template: '<div class=\"popover\" role=\"tooltip\">' + '<div class=\"arrow\"></div>' + '<h3 class=\"popover-header\"></h3>' + '<div class=\"popover-body\"></div></div>'\n  });\n\n  var DefaultType$5 = _objectSpread({}, Tooltip.DefaultType, {\n    content: '(string|element|function)'\n  });\n\n  var ClassName$7 = {\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector$7 = {\n    TITLE: '.popover-header',\n    CONTENT: '.popover-body'\n  };\n  var Event$7 = {\n    HIDE: \"hide\" + EVENT_KEY$7,\n    HIDDEN: \"hidden\" + EVENT_KEY$7,\n    SHOW: \"show\" + EVENT_KEY$7,\n    SHOWN: \"shown\" + EVENT_KEY$7,\n    INSERTED: \"inserted\" + EVENT_KEY$7,\n    CLICK: \"click\" + EVENT_KEY$7,\n    FOCUSIN: \"focusin\" + EVENT_KEY$7,\n    FOCUSOUT: \"focusout\" + EVENT_KEY$7,\n    MOUSEENTER: \"mouseenter\" + EVENT_KEY$7,\n    MOUSELEAVE: \"mouseleave\" + EVENT_KEY$7\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Popover =\n  /*#__PURE__*/\n  function (_Tooltip) {\n    _inheritsLoose(Popover, _Tooltip);\n\n    function Popover() {\n      return _Tooltip.apply(this, arguments) || this;\n    }\n\n    var _proto = Popover.prototype;\n\n    // Overrides\n    _proto.isWithContent = function isWithContent() {\n      return this.getTitle() || this._getContent();\n    };\n\n    _proto.addAttachmentClass = function addAttachmentClass(attachment) {\n      $(this.getTipElement()).addClass(CLASS_PREFIX$1 + \"-\" + attachment);\n    };\n\n    _proto.getTipElement = function getTipElement() {\n      this.tip = this.tip || $(this.config.template)[0];\n      return this.tip;\n    };\n\n    _proto.setContent = function setContent() {\n      var $tip = $(this.getTipElement()); // We use append for html objects to maintain js events\n\n      this.setElementContent($tip.find(Selector$7.TITLE), this.getTitle());\n\n      var content = this._getContent();\n\n      if (typeof content === 'function') {\n        content = content.call(this.element);\n      }\n\n      this.setElementContent($tip.find(Selector$7.CONTENT), content);\n      $tip.removeClass(ClassName$7.FADE + \" \" + ClassName$7.SHOW);\n    } // Private\n    ;\n\n    _proto._getContent = function _getContent() {\n      return this.element.getAttribute('data-content') || this.config.content;\n    };\n\n    _proto._cleanTipClass = function _cleanTipClass() {\n      var $tip = $(this.getTipElement());\n      var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX$1);\n\n      if (tabClass !== null && tabClass.length > 0) {\n        $tip.removeClass(tabClass.join(''));\n      }\n    } // Static\n    ;\n\n    Popover._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$7);\n\n        var _config = typeof config === 'object' ? config : null;\n\n        if (!data && /dispose|hide/.test(config)) {\n          return;\n        }\n\n        if (!data) {\n          data = new Popover(this, _config);\n          $(this).data(DATA_KEY$7, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Popover, null, [{\n      key: \"VERSION\",\n      // Getters\n      get: function get() {\n        return VERSION$7;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$5;\n      }\n    }, {\n      key: \"NAME\",\n      get: function get() {\n        return NAME$7;\n      }\n    }, {\n      key: \"DATA_KEY\",\n      get: function get() {\n        return DATA_KEY$7;\n      }\n    }, {\n      key: \"Event\",\n      get: function get() {\n        return Event$7;\n      }\n    }, {\n      key: \"EVENT_KEY\",\n      get: function get() {\n        return EVENT_KEY$7;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType$5;\n      }\n    }]);\n\n    return Popover;\n  }(Tooltip);\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n\n  $.fn[NAME$7] = Popover._jQueryInterface;\n  $.fn[NAME$7].Constructor = Popover;\n\n  $.fn[NAME$7].noConflict = function () {\n    $.fn[NAME$7] = JQUERY_NO_CONFLICT$7;\n    return Popover._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$8 = 'scrollspy';\n  var VERSION$8 = '4.3.1';\n  var DATA_KEY$8 = 'bs.scrollspy';\n  var EVENT_KEY$8 = \".\" + DATA_KEY$8;\n  var DATA_API_KEY$6 = '.data-api';\n  var JQUERY_NO_CONFLICT$8 = $.fn[NAME$8];\n  var Default$6 = {\n    offset: 10,\n    method: 'auto',\n    target: ''\n  };\n  var DefaultType$6 = {\n    offset: 'number',\n    method: 'string',\n    target: '(string|element)'\n  };\n  var Event$8 = {\n    ACTIVATE: \"activate\" + EVENT_KEY$8,\n    SCROLL: \"scroll\" + EVENT_KEY$8,\n    LOAD_DATA_API: \"load\" + EVENT_KEY$8 + DATA_API_KEY$6\n  };\n  var ClassName$8 = {\n    DROPDOWN_ITEM: 'dropdown-item',\n    DROPDOWN_MENU: 'dropdown-menu',\n    ACTIVE: 'active'\n  };\n  var Selector$8 = {\n    DATA_SPY: '[data-spy=\"scroll\"]',\n    ACTIVE: '.active',\n    NAV_LIST_GROUP: '.nav, .list-group',\n    NAV_LINKS: '.nav-link',\n    NAV_ITEMS: '.nav-item',\n    LIST_ITEMS: '.list-group-item',\n    DROPDOWN: '.dropdown',\n    DROPDOWN_ITEMS: '.dropdown-item',\n    DROPDOWN_TOGGLE: '.dropdown-toggle'\n  };\n  var OffsetMethod = {\n    OFFSET: 'offset',\n    POSITION: 'position'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var ScrollSpy =\n  /*#__PURE__*/\n  function () {\n    function ScrollSpy(element, config) {\n      var _this = this;\n\n      this._element = element;\n      this._scrollElement = element.tagName === 'BODY' ? window : element;\n      this._config = this._getConfig(config);\n      this._selector = this._config.target + \" \" + Selector$8.NAV_LINKS + \",\" + (this._config.target + \" \" + Selector$8.LIST_ITEMS + \",\") + (this._config.target + \" \" + Selector$8.DROPDOWN_ITEMS);\n      this._offsets = [];\n      this._targets = [];\n      this._activeTarget = null;\n      this._scrollHeight = 0;\n      $(this._scrollElement).on(Event$8.SCROLL, function (event) {\n        return _this._process(event);\n      });\n      this.refresh();\n\n      this._process();\n    } // Getters\n\n\n    var _proto = ScrollSpy.prototype;\n\n    // Public\n    _proto.refresh = function refresh() {\n      var _this2 = this;\n\n      var autoMethod = this._scrollElement === this._scrollElement.window ? OffsetMethod.OFFSET : OffsetMethod.POSITION;\n      var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;\n      var offsetBase = offsetMethod === OffsetMethod.POSITION ? this._getScrollTop() : 0;\n      this._offsets = [];\n      this._targets = [];\n      this._scrollHeight = this._getScrollHeight();\n      var targets = [].slice.call(document.querySelectorAll(this._selector));\n      targets.map(function (element) {\n        var target;\n        var targetSelector = Util.getSelectorFromElement(element);\n\n        if (targetSelector) {\n          target = document.querySelector(targetSelector);\n        }\n\n        if (target) {\n          var targetBCR = target.getBoundingClientRect();\n\n          if (targetBCR.width || targetBCR.height) {\n            // TODO (fat): remove sketch reliance on jQuery position/offset\n            return [$(target)[offsetMethod]().top + offsetBase, targetSelector];\n          }\n        }\n\n        return null;\n      }).filter(function (item) {\n        return item;\n      }).sort(function (a, b) {\n        return a[0] - b[0];\n      }).forEach(function (item) {\n        _this2._offsets.push(item[0]);\n\n        _this2._targets.push(item[1]);\n      });\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$8);\n      $(this._scrollElement).off(EVENT_KEY$8);\n      this._element = null;\n      this._scrollElement = null;\n      this._config = null;\n      this._selector = null;\n      this._offsets = null;\n      this._targets = null;\n      this._activeTarget = null;\n      this._scrollHeight = null;\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default$6, typeof config === 'object' && config ? config : {});\n\n      if (typeof config.target !== 'string') {\n        var id = $(config.target).attr('id');\n\n        if (!id) {\n          id = Util.getUID(NAME$8);\n          $(config.target).attr('id', id);\n        }\n\n        config.target = \"#\" + id;\n      }\n\n      Util.typeCheckConfig(NAME$8, config, DefaultType$6);\n      return config;\n    };\n\n    _proto._getScrollTop = function _getScrollTop() {\n      return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;\n    };\n\n    _proto._getScrollHeight = function _getScrollHeight() {\n      return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);\n    };\n\n    _proto._getOffsetHeight = function _getOffsetHeight() {\n      return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;\n    };\n\n    _proto._process = function _process() {\n      var scrollTop = this._getScrollTop() + this._config.offset;\n\n      var scrollHeight = this._getScrollHeight();\n\n      var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();\n\n      if (this._scrollHeight !== scrollHeight) {\n        this.refresh();\n      }\n\n      if (scrollTop >= maxScroll) {\n        var target = this._targets[this._targets.length - 1];\n\n        if (this._activeTarget !== target) {\n          this._activate(target);\n        }\n\n        return;\n      }\n\n      if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n        this._activeTarget = null;\n\n        this._clear();\n\n        return;\n      }\n\n      var offsetLength = this._offsets.length;\n\n      for (var i = offsetLength; i--;) {\n        var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);\n\n        if (isActiveTarget) {\n          this._activate(this._targets[i]);\n        }\n      }\n    };\n\n    _proto._activate = function _activate(target) {\n      this._activeTarget = target;\n\n      this._clear();\n\n      var queries = this._selector.split(',').map(function (selector) {\n        return selector + \"[data-target=\\\"\" + target + \"\\\"],\" + selector + \"[href=\\\"\" + target + \"\\\"]\";\n      });\n\n      var $link = $([].slice.call(document.querySelectorAll(queries.join(','))));\n\n      if ($link.hasClass(ClassName$8.DROPDOWN_ITEM)) {\n        $link.closest(Selector$8.DROPDOWN).find(Selector$8.DROPDOWN_TOGGLE).addClass(ClassName$8.ACTIVE);\n        $link.addClass(ClassName$8.ACTIVE);\n      } else {\n        // Set triggered link as active\n        $link.addClass(ClassName$8.ACTIVE); // Set triggered links parents as active\n        // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n\n        $link.parents(Selector$8.NAV_LIST_GROUP).prev(Selector$8.NAV_LINKS + \", \" + Selector$8.LIST_ITEMS).addClass(ClassName$8.ACTIVE); // Handle special case when .nav-link is inside .nav-item\n\n        $link.parents(Selector$8.NAV_LIST_GROUP).prev(Selector$8.NAV_ITEMS).children(Selector$8.NAV_LINKS).addClass(ClassName$8.ACTIVE);\n      }\n\n      $(this._scrollElement).trigger(Event$8.ACTIVATE, {\n        relatedTarget: target\n      });\n    };\n\n    _proto._clear = function _clear() {\n      [].slice.call(document.querySelectorAll(this._selector)).filter(function (node) {\n        return node.classList.contains(ClassName$8.ACTIVE);\n      }).forEach(function (node) {\n        return node.classList.remove(ClassName$8.ACTIVE);\n      });\n    } // Static\n    ;\n\n    ScrollSpy._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$8);\n\n        var _config = typeof config === 'object' && config;\n\n        if (!data) {\n          data = new ScrollSpy(this, _config);\n          $(this).data(DATA_KEY$8, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(ScrollSpy, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$8;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$6;\n      }\n    }]);\n\n    return ScrollSpy;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(window).on(Event$8.LOAD_DATA_API, function () {\n    var scrollSpys = [].slice.call(document.querySelectorAll(Selector$8.DATA_SPY));\n    var scrollSpysLength = scrollSpys.length;\n\n    for (var i = scrollSpysLength; i--;) {\n      var $spy = $(scrollSpys[i]);\n\n      ScrollSpy._jQueryInterface.call($spy, $spy.data());\n    }\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$8] = ScrollSpy._jQueryInterface;\n  $.fn[NAME$8].Constructor = ScrollSpy;\n\n  $.fn[NAME$8].noConflict = function () {\n    $.fn[NAME$8] = JQUERY_NO_CONFLICT$8;\n    return ScrollSpy._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$9 = 'tab';\n  var VERSION$9 = '4.3.1';\n  var DATA_KEY$9 = 'bs.tab';\n  var EVENT_KEY$9 = \".\" + DATA_KEY$9;\n  var DATA_API_KEY$7 = '.data-api';\n  var JQUERY_NO_CONFLICT$9 = $.fn[NAME$9];\n  var Event$9 = {\n    HIDE: \"hide\" + EVENT_KEY$9,\n    HIDDEN: \"hidden\" + EVENT_KEY$9,\n    SHOW: \"show\" + EVENT_KEY$9,\n    SHOWN: \"shown\" + EVENT_KEY$9,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$9 + DATA_API_KEY$7\n  };\n  var ClassName$9 = {\n    DROPDOWN_MENU: 'dropdown-menu',\n    ACTIVE: 'active',\n    DISABLED: 'disabled',\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector$9 = {\n    DROPDOWN: '.dropdown',\n    NAV_LIST_GROUP: '.nav, .list-group',\n    ACTIVE: '.active',\n    ACTIVE_UL: '> li > .active',\n    DATA_TOGGLE: '[data-toggle=\"tab\"], [data-toggle=\"pill\"], [data-toggle=\"list\"]',\n    DROPDOWN_TOGGLE: '.dropdown-toggle',\n    DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Tab =\n  /*#__PURE__*/\n  function () {\n    function Tab(element) {\n      this._element = element;\n    } // Getters\n\n\n    var _proto = Tab.prototype;\n\n    // Public\n    _proto.show = function show() {\n      var _this = this;\n\n      if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $(this._element).hasClass(ClassName$9.ACTIVE) || $(this._element).hasClass(ClassName$9.DISABLED)) {\n        return;\n      }\n\n      var target;\n      var previous;\n      var listElement = $(this._element).closest(Selector$9.NAV_LIST_GROUP)[0];\n      var selector = Util.getSelectorFromElement(this._element);\n\n      if (listElement) {\n        var itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? Selector$9.ACTIVE_UL : Selector$9.ACTIVE;\n        previous = $.makeArray($(listElement).find(itemSelector));\n        previous = previous[previous.length - 1];\n      }\n\n      var hideEvent = $.Event(Event$9.HIDE, {\n        relatedTarget: this._element\n      });\n      var showEvent = $.Event(Event$9.SHOW, {\n        relatedTarget: previous\n      });\n\n      if (previous) {\n        $(previous).trigger(hideEvent);\n      }\n\n      $(this._element).trigger(showEvent);\n\n      if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      if (selector) {\n        target = document.querySelector(selector);\n      }\n\n      this._activate(this._element, listElement);\n\n      var complete = function complete() {\n        var hiddenEvent = $.Event(Event$9.HIDDEN, {\n          relatedTarget: _this._element\n        });\n        var shownEvent = $.Event(Event$9.SHOWN, {\n          relatedTarget: previous\n        });\n        $(previous).trigger(hiddenEvent);\n        $(_this._element).trigger(shownEvent);\n      };\n\n      if (target) {\n        this._activate(target, target.parentNode, complete);\n      } else {\n        complete();\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$9);\n      this._element = null;\n    } // Private\n    ;\n\n    _proto._activate = function _activate(element, container, callback) {\n      var _this2 = this;\n\n      var activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ? $(container).find(Selector$9.ACTIVE_UL) : $(container).children(Selector$9.ACTIVE);\n      var active = activeElements[0];\n      var isTransitioning = callback && active && $(active).hasClass(ClassName$9.FADE);\n\n      var complete = function complete() {\n        return _this2._transitionComplete(element, active, callback);\n      };\n\n      if (active && isTransitioning) {\n        var transitionDuration = Util.getTransitionDurationFromElement(active);\n        $(active).removeClass(ClassName$9.SHOW).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      } else {\n        complete();\n      }\n    };\n\n    _proto._transitionComplete = function _transitionComplete(element, active, callback) {\n      if (active) {\n        $(active).removeClass(ClassName$9.ACTIVE);\n        var dropdownChild = $(active.parentNode).find(Selector$9.DROPDOWN_ACTIVE_CHILD)[0];\n\n        if (dropdownChild) {\n          $(dropdownChild).removeClass(ClassName$9.ACTIVE);\n        }\n\n        if (active.getAttribute('role') === 'tab') {\n          active.setAttribute('aria-selected', false);\n        }\n      }\n\n      $(element).addClass(ClassName$9.ACTIVE);\n\n      if (element.getAttribute('role') === 'tab') {\n        element.setAttribute('aria-selected', true);\n      }\n\n      Util.reflow(element);\n\n      if (element.classList.contains(ClassName$9.FADE)) {\n        element.classList.add(ClassName$9.SHOW);\n      }\n\n      if (element.parentNode && $(element.parentNode).hasClass(ClassName$9.DROPDOWN_MENU)) {\n        var dropdownElement = $(element).closest(Selector$9.DROPDOWN)[0];\n\n        if (dropdownElement) {\n          var dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(Selector$9.DROPDOWN_TOGGLE));\n          $(dropdownToggleList).addClass(ClassName$9.ACTIVE);\n        }\n\n        element.setAttribute('aria-expanded', true);\n      }\n\n      if (callback) {\n        callback();\n      }\n    } // Static\n    ;\n\n    Tab._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $this = $(this);\n        var data = $this.data(DATA_KEY$9);\n\n        if (!data) {\n          data = new Tab(this);\n          $this.data(DATA_KEY$9, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Tab, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$9;\n      }\n    }]);\n\n    return Tab;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$9.CLICK_DATA_API, Selector$9.DATA_TOGGLE, function (event) {\n    event.preventDefault();\n\n    Tab._jQueryInterface.call($(this), 'show');\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$9] = Tab._jQueryInterface;\n  $.fn[NAME$9].Constructor = Tab;\n\n  $.fn[NAME$9].noConflict = function () {\n    $.fn[NAME$9] = JQUERY_NO_CONFLICT$9;\n    return Tab._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$a = 'toast';\n  var VERSION$a = '4.3.1';\n  var DATA_KEY$a = 'bs.toast';\n  var EVENT_KEY$a = \".\" + DATA_KEY$a;\n  var JQUERY_NO_CONFLICT$a = $.fn[NAME$a];\n  var Event$a = {\n    CLICK_DISMISS: \"click.dismiss\" + EVENT_KEY$a,\n    HIDE: \"hide\" + EVENT_KEY$a,\n    HIDDEN: \"hidden\" + EVENT_KEY$a,\n    SHOW: \"show\" + EVENT_KEY$a,\n    SHOWN: \"shown\" + EVENT_KEY$a\n  };\n  var ClassName$a = {\n    FADE: 'fade',\n    HIDE: 'hide',\n    SHOW: 'show',\n    SHOWING: 'showing'\n  };\n  var DefaultType$7 = {\n    animation: 'boolean',\n    autohide: 'boolean',\n    delay: 'number'\n  };\n  var Default$7 = {\n    animation: true,\n    autohide: true,\n    delay: 500\n  };\n  var Selector$a = {\n    DATA_DISMISS: '[data-dismiss=\"toast\"]'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Toast =\n  /*#__PURE__*/\n  function () {\n    function Toast(element, config) {\n      this._element = element;\n      this._config = this._getConfig(config);\n      this._timeout = null;\n\n      this._setListeners();\n    } // Getters\n\n\n    var _proto = Toast.prototype;\n\n    // Public\n    _proto.show = function show() {\n      var _this = this;\n\n      $(this._element).trigger(Event$a.SHOW);\n\n      if (this._config.animation) {\n        this._element.classList.add(ClassName$a.FADE);\n      }\n\n      var complete = function complete() {\n        _this._element.classList.remove(ClassName$a.SHOWING);\n\n        _this._element.classList.add(ClassName$a.SHOW);\n\n        $(_this._element).trigger(Event$a.SHOWN);\n\n        if (_this._config.autohide) {\n          _this.hide();\n        }\n      };\n\n      this._element.classList.remove(ClassName$a.HIDE);\n\n      this._element.classList.add(ClassName$a.SHOWING);\n\n      if (this._config.animation) {\n        var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n        $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      } else {\n        complete();\n      }\n    };\n\n    _proto.hide = function hide(withoutTimeout) {\n      var _this2 = this;\n\n      if (!this._element.classList.contains(ClassName$a.SHOW)) {\n        return;\n      }\n\n      $(this._element).trigger(Event$a.HIDE);\n\n      if (withoutTimeout) {\n        this._close();\n      } else {\n        this._timeout = setTimeout(function () {\n          _this2._close();\n        }, this._config.delay);\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      clearTimeout(this._timeout);\n      this._timeout = null;\n\n      if (this._element.classList.contains(ClassName$a.SHOW)) {\n        this._element.classList.remove(ClassName$a.SHOW);\n      }\n\n      $(this._element).off(Event$a.CLICK_DISMISS);\n      $.removeData(this._element, DATA_KEY$a);\n      this._element = null;\n      this._config = null;\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default$7, $(this._element).data(), typeof config === 'object' && config ? config : {});\n      Util.typeCheckConfig(NAME$a, config, this.constructor.DefaultType);\n      return config;\n    };\n\n    _proto._setListeners = function _setListeners() {\n      var _this3 = this;\n\n      $(this._element).on(Event$a.CLICK_DISMISS, Selector$a.DATA_DISMISS, function () {\n        return _this3.hide(true);\n      });\n    };\n\n    _proto._close = function _close() {\n      var _this4 = this;\n\n      var complete = function complete() {\n        _this4._element.classList.add(ClassName$a.HIDE);\n\n        $(_this4._element).trigger(Event$a.HIDDEN);\n      };\n\n      this._element.classList.remove(ClassName$a.SHOW);\n\n      if (this._config.animation) {\n        var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n        $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      } else {\n        complete();\n      }\n    } // Static\n    ;\n\n    Toast._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $element = $(this);\n        var data = $element.data(DATA_KEY$a);\n\n        var _config = typeof config === 'object' && config;\n\n        if (!data) {\n          data = new Toast(this, _config);\n          $element.data(DATA_KEY$a, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config](this);\n        }\n      });\n    };\n\n    _createClass(Toast, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$a;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType$7;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$7;\n      }\n    }]);\n\n    return Toast;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n\n  $.fn[NAME$a] = Toast._jQueryInterface;\n  $.fn[NAME$a].Constructor = Toast;\n\n  $.fn[NAME$a].noConflict = function () {\n    $.fn[NAME$a] = JQUERY_NO_CONFLICT$a;\n    return Toast._jQueryInterface;\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.3.1): index.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  (function () {\n    if (typeof $ === 'undefined') {\n      throw new TypeError('Bootstrap\\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\\'s JavaScript.');\n    }\n\n    var version = $.fn.jquery.split(' ')[0].split('.');\n    var minMajor = 1;\n    var ltMajor = 2;\n    var minMinor = 9;\n    var minPatch = 1;\n    var maxMajor = 4;\n\n    if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {\n      throw new Error('Bootstrap\\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0');\n    }\n  })();\n\n  exports.Util = Util;\n  exports.Alert = Alert;\n  exports.Button = Button;\n  exports.Carousel = Carousel;\n  exports.Collapse = Collapse;\n  exports.Dropdown = Dropdown;\n  exports.Modal = Modal;\n  exports.Popover = Popover;\n  exports.Scrollspy = ScrollSpy;\n  exports.Tab = Tab;\n  exports.Toast = Toast;\n  exports.Tooltip = Tooltip;\n\n  Object.defineProperty(exports, '__esModule', { value: true });\n\n}));\n//# sourceMappingURL=bootstrap.js.map\n"
  },
  {
    "path": "easyflow-flow-bpmn/static/plugins/bootstrap-multiselect/css/bootstrap-multiselect.css",
    "content": "span.multiselect-native-select{position:relative}span.multiselect-native-select select{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px -1px -1px -3px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important;left:50%;top:30px}.multiselect-container{position:absolute;list-style-type:none;margin:0;padding:0}.multiselect-container .input-group{margin:5px}.multiselect-container .multiselect-reset .input-group{width:93%}.multiselect-container>li{padding:0}.multiselect-container>li>a.multiselect-all label{font-weight:700}.multiselect-container>li.multiselect-group label{margin:0;padding:3px 20px;height:100%;font-weight:700}.multiselect-container>li.multiselect-group-clickable label{cursor:pointer}.multiselect-container>li>a{padding:0}.multiselect-container>li>a>label{margin:0;height:100%;cursor:pointer;font-weight:400;padding:3px 20px 3px 40px}.multiselect-container>li>a>label.checkbox,.multiselect-container>li>a>label.radio{margin:0}.multiselect-container>li>a>label>input[type=checkbox]{margin-bottom:5px}.btn-group>.btn-group:nth-child(2)>.multiselect.btn{border-top-left-radius:4px;border-bottom-left-radius:4px}.form-inline .multiselect-container label.checkbox,.form-inline .multiselect-container label.radio{padding:3px 20px 3px 40px}.form-inline .multiselect-container li a label.checkbox input[type=checkbox],.form-inline .multiselect-container li a label.radio input[type=radio]{margin-left:-20px;margin-right:0}"
  },
  {
    "path": "easyflow-flow-bpmn/static/plugins/bootstrap-multiselect/js/bootstrap-multiselect.js",
    "content": "/**\n * Bootstrap Multiselect (http://davidstutz.de/bootstrap-multiselect/)\n *\n * Apache License, Version 2.0:\n * Copyright (c) 2012 - 2018 David Stutz\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a\n * copy of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n *\n * BSD 3-Clause License:\n * Copyright (c) 2012 - 2018 David Stutz\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *    - Redistributions of source code must retain the above copyright notice,\n *      this list of conditions and the following disclaimer.\n *    - Redistributions in binary form must reproduce the above copyright notice,\n *      this list of conditions and the following disclaimer in the documentation\n *      and/or other materials provided with the distribution.\n *    - Neither the name of David Stutz nor the names of its contributors may be\n *      used to endorse or promote products derived from this software without\n *      specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n(function (root, factory) {\n    // check to see if 'knockout' AMD module is specified if using requirejs\n    if (typeof define === 'function' && define.amd &&\n        typeof require === 'function' && typeof require.specified === 'function' && require.specified('knockout')) {\n\n        // AMD. Register as an anonymous module.\n        define(['jquery', 'knockout'], factory);\n    } else {\n        // Browser globals\n        factory(root.jQuery, root.ko);\n    }\n})(this, function ($, ko) {\n    \"use strict\";// jshint ;_;\n\n    if (typeof ko !== 'undefined' && ko.bindingHandlers && !ko.bindingHandlers.multiselect) {\n        ko.bindingHandlers.multiselect = {\n            after: ['options', 'value', 'selectedOptions', 'enable', 'disable'],\n\n            init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {\n                var $element = $(element);\n                var config = ko.toJS(valueAccessor());\n\n                $element.multiselect(config);\n\n                if (allBindings.has('options')) {\n                    var options = allBindings.get('options');\n                    if (ko.isObservable(options)) {\n                        ko.computed({\n                            read: function() {\n                                options();\n                                setTimeout(function() {\n                                    var ms = $element.data('multiselect');\n                                    if (ms)\n                                        ms.updateOriginalOptions();//Not sure how beneficial this is.\n                                    $element.multiselect('rebuild');\n                                }, 1);\n                            },\n                            disposeWhenNodeIsRemoved: element\n                        });\n                    }\n                }\n\n                //value and selectedOptions are two-way, so these will be triggered even by our own actions.\n                //It needs some way to tell if they are triggered because of us or because of outside change.\n                //It doesn't loop but it's a waste of processing.\n                if (allBindings.has('value')) {\n                    var value = allBindings.get('value');\n                    if (ko.isObservable(value)) {\n                        ko.computed({\n                            read: function() {\n                                value();\n                                setTimeout(function() {\n                                    $element.multiselect('refresh');\n                                }, 1);\n                            },\n                            disposeWhenNodeIsRemoved: element\n                        }).extend({ rateLimit: 100, notifyWhenChangesStop: true });\n                    }\n                }\n\n                //Switched from arrayChange subscription to general subscription using 'refresh'.\n                //Not sure performance is any better using 'select' and 'deselect'.\n                if (allBindings.has('selectedOptions')) {\n                    var selectedOptions = allBindings.get('selectedOptions');\n                    if (ko.isObservable(selectedOptions)) {\n                        ko.computed({\n                            read: function() {\n                                selectedOptions();\n                                setTimeout(function() {\n                                    $element.multiselect('refresh');\n                                }, 1);\n                            },\n                            disposeWhenNodeIsRemoved: element\n                        }).extend({ rateLimit: 100, notifyWhenChangesStop: true });\n                    }\n                }\n\n                var setEnabled = function (enable) {\n                    setTimeout(function () {\n                        if (enable)\n                            $element.multiselect('enable');\n                        else\n                            $element.multiselect('disable');\n                    });\n                };\n\n                if (allBindings.has('enable')) {\n                    var enable = allBindings.get('enable');\n                    if (ko.isObservable(enable)) {\n                        ko.computed({\n                            read: function () {\n                                setEnabled(enable());\n                            },\n                            disposeWhenNodeIsRemoved: element\n                        }).extend({ rateLimit: 100, notifyWhenChangesStop: true });\n                    } else {\n                        setEnabled(enable);\n                    }\n                }\n\n                if (allBindings.has('disable')) {\n                    var disable = allBindings.get('disable');\n                    if (ko.isObservable(disable)) {\n                        ko.computed({\n                            read: function () {\n                                setEnabled(!disable());\n                            },\n                            disposeWhenNodeIsRemoved: element\n                        }).extend({ rateLimit: 100, notifyWhenChangesStop: true });\n                    } else {\n                        setEnabled(!disable);\n                    }\n                }\n\n                ko.utils.domNodeDisposal.addDisposeCallback(element, function() {\n                    $element.multiselect('destroy');\n                });\n            },\n\n            update: function(element, valueAccessor, allBindings, viewModel, bindingContext) {\n                var $element = $(element);\n                var config = ko.toJS(valueAccessor());\n\n                $element.multiselect('setOptions', config);\n                $element.multiselect('rebuild');\n            }\n        };\n    }\n\n    function forEach(array, callback) {\n        for (var index = 0; index < array.length; ++index) {\n            callback(array[index], index);\n        }\n    }\n\n    /**\n     * Constructor to create a new multiselect using the given select.\n     *\n     * @param {jQuery} select\n     * @param {Object} options\n     * @returns {Multiselect}\n     */\n    function Multiselect(select, options) {\n\n        this.$select = $(select);\n        this.options = this.mergeOptions($.extend({}, options, this.$select.data()));\n\n        // Placeholder via data attributes\n        if (this.$select.attr(\"data-placeholder\")) {\n            this.options.nonSelectedText = this.$select.data(\"placeholder\");\n        }\n\n        // Initialization.\n        // We have to clone to create a new reference.\n        this.originalOptions = this.$select.clone()[0].options;\n        this.query = '';\n        this.searchTimeout = null;\n        this.lastToggledInput = null;\n\n        this.options.multiple = this.$select.attr('multiple') === \"multiple\";\n        this.options.onChange = $.proxy(this.options.onChange, this);\n        this.options.onSelectAll = $.proxy(this.options.onSelectAll, this);\n        this.options.onDeselectAll = $.proxy(this.options.onDeselectAll, this);\n        this.options.onDropdownShow = $.proxy(this.options.onDropdownShow, this);\n        this.options.onDropdownHide = $.proxy(this.options.onDropdownHide, this);\n        this.options.onDropdownShown = $.proxy(this.options.onDropdownShown, this);\n        this.options.onDropdownHidden = $.proxy(this.options.onDropdownHidden, this);\n        this.options.onInitialized = $.proxy(this.options.onInitialized, this);\n        this.options.onFiltering = $.proxy(this.options.onFiltering, this);\n\n        // Build select all if enabled.\n        this.buildContainer();\n        this.buildButton();\n        this.buildDropdown();\n        this.buildReset();\n        this.buildSelectAll();\n        this.buildDropdownOptions();\n        this.buildFilter();\n\n        this.updateButtonText();\n        this.updateSelectAll(true);\n\n        if (this.options.enableClickableOptGroups && this.options.multiple) {\n            this.updateOptGroups();\n        }\n\n        this.options.wasDisabled = this.$select.prop('disabled');\n        if (this.options.disableIfEmpty && $('option', this.$select).length <= 0) {\n            this.disable();\n        }\n\n        this.$select.wrap('<span class=\"multiselect-native-select\" />').after(this.$container);\n        this.options.onInitialized(this.$select, this.$container);\n    }\n\n    Multiselect.prototype = {\n\n        defaults: {\n            /**\n             * Default text function will either print 'None selected' in case no\n             * option is selected or a list of the selected options up to a length\n             * of 3 selected options.\n             *\n             * @param {jQuery} options\n             * @param {jQuery} select\n             * @returns {String}\n             */\n            buttonText: function(options, select) {\n                if (this.disabledText.length > 0\n                        && (select.prop('disabled') || (options.length == 0 && this.disableIfEmpty)))  {\n\n                    return this.disabledText;\n                }\n                else if (options.length === 0) {\n                    return this.nonSelectedText;\n                }\n                else if (this.allSelectedText\n                        && options.length === $('option', $(select)).length\n                        && $('option', $(select)).length !== 1\n                        && this.multiple) {\n\n                    if (this.selectAllNumber) {\n                        return this.allSelectedText + ' (' + options.length + ')';\n                    }\n                    else {\n                        return this.allSelectedText;\n                    }\n                }\n                else if (this.numberDisplayed != 0 && options.length > this.numberDisplayed) {\n                    return options.length + ' ' + this.nSelectedText;\n                }\n                else {\n                    var selected = '';\n                    var delimiter = this.delimiterText;\n\n                    options.each(function() {\n                        var label = ($(this).attr('label') !== undefined) ? $(this).attr('label') : $(this).text();\n                        selected += label + delimiter;\n                    });\n\n                    return selected.substr(0, selected.length - this.delimiterText.length);\n                }\n            },\n            /**\n             * Updates the title of the button similar to the buttonText function.\n             *\n             * @param {jQuery} options\n             * @param {jQuery} select\n             * @returns {@exp;selected@call;substr}\n             */\n            buttonTitle: function(options, select) {\n                if (options.length === 0) {\n                    return this.nonSelectedText;\n                }\n                else {\n                    var selected = '';\n                    var delimiter = this.delimiterText;\n\n                    options.each(function () {\n                        var label = ($(this).attr('label') !== undefined) ? $(this).attr('label') : $(this).text();\n                        selected += label + delimiter;\n                    });\n                    return selected.substr(0, selected.length - this.delimiterText.length);\n                }\n            },\n            checkboxName: function(option) {\n                return false; // no checkbox name\n            },\n            /**\n             * Create a label.\n             *\n             * @param {jQuery} element\n             * @returns {String}\n             */\n            optionLabel: function(element){\n                return $(element).attr('label') || $(element).text();\n            },\n            /**\n             * Create a class.\n             *\n             * @param {jQuery} element\n             * @returns {String}\n             */\n            optionClass: function(element) {\n                return $(element).attr('class') || '';\n            },\n            /**\n             * Triggered on change of the multiselect.\n             *\n             * Not triggered when selecting/deselecting options manually.\n             *\n             * @param {jQuery} option\n             * @param {Boolean} checked\n             */\n            onChange : function(option, checked) {\n\n            },\n            /**\n             * Triggered when the dropdown is shown.\n             *\n             * @param {jQuery} event\n             */\n            onDropdownShow: function(event) {\n\n            },\n            /**\n             * Triggered when the dropdown is hidden.\n             *\n             * @param {jQuery} event\n             */\n            onDropdownHide: function(event) {\n\n            },\n            /**\n             * Triggered after the dropdown is shown.\n             *\n             * @param {jQuery} event\n             */\n            onDropdownShown: function(event) {\n\n            },\n            /**\n             * Triggered after the dropdown is hidden.\n             *\n             * @param {jQuery} event\n             */\n            onDropdownHidden: function(event) {\n\n            },\n            /**\n             * Triggered on select all.\n             */\n            onSelectAll: function() {\n\n            },\n            /**\n             * Triggered on deselect all.\n             */\n            onDeselectAll: function() {\n\n            },\n            /**\n             * Triggered after initializing.\n             *\n             * @param {jQuery} $select\n             * @param {jQuery} $container\n             */\n            onInitialized: function($select, $container) {\n\n            },\n            /**\n             * Triggered on filtering.\n             *\n             * @param {jQuery} $filter\n             */\n            onFiltering: function($filter) {\n\n            },\n            enableHTML: false,\n            buttonClass: 'btn btn-default',\n            inheritClass: false,\n            buttonWidth: 'auto',\n            buttonContainer: '<div class=\"btn-group\" />',\n            dropRight: false,\n            dropUp: false,\n            selectedClass: 'active',\n            // Maximum height of the dropdown menu.\n            // If maximum height is exceeded a scrollbar will be displayed.\n            maxHeight: false,\n            includeSelectAllOption: false,\n            includeSelectAllIfMoreThan: 0,\n            selectAllText: ' Select all',\n            selectAllValue: 'multiselect-all',\n            selectAllName: false,\n            selectAllNumber: true,\n            selectAllJustVisible: true,\n            enableFiltering: false,\n            enableCaseInsensitiveFiltering: false,\n            enableFullValueFiltering: false,\n            enableClickableOptGroups: false,\n            enableCollapsibleOptGroups: false,\n            collapseOptGroupsByDefault: false,\n            filterPlaceholder: 'Search',\n            // possible options: 'text', 'value', 'both'\n            filterBehavior: 'text',\n            includeFilterClearBtn: true,\n            preventInputChangeEvent: false,\n            nonSelectedText: 'None selected',\n            nSelectedText: 'selected',\n            allSelectedText: 'All selected',\n            numberDisplayed: 3,\n            disableIfEmpty: false,\n            disabledText: '',\n            delimiterText: ', ',\n            includeResetOption: false,\n            includeResetDivider: false,\n            resetText: 'Reset',\n            templates: {\n                button: '<button type=\"button\" class=\"multiselect dropdown-toggle\" data-toggle=\"dropdown\"><span class=\"multiselect-selected-text\"></span> <b class=\"caret\"></b></button>',\n                ul: '<ul class=\"multiselect-container dropdown-menu\"></ul>',\n                filter: '<li class=\"multiselect-item multiselect-filter\"><div class=\"input-group\"><span class=\"input-group-addon\"><i class=\"glyphicon glyphicon-search\"></i></span><input class=\"form-control multiselect-search\" type=\"text\" /></div></li>',\n                filterClearBtn: '<span class=\"input-group-btn\"><button class=\"btn btn-default multiselect-clear-filter\" type=\"button\"><i class=\"glyphicon glyphicon-remove-circle\"></i></button></span>',\n                li: '<li><a tabindex=\"0\"><label></label></a></li>',\n                divider: '<li class=\"multiselect-item divider\"></li>',\n                liGroup: '<li class=\"multiselect-item multiselect-group\"><label></label></li>',\n                resetButton: '<li class=\"multiselect-reset text-center\"><div class=\"input-group\"><a class=\"btn btn-default btn-block\"></a></div></li>'\n            }\n        },\n\n        constructor: Multiselect,\n\n        /**\n         * Builds the container of the multiselect.\n         */\n        buildContainer: function() {\n            this.$container = $(this.options.buttonContainer);\n            this.$container.on('show.bs.dropdown', this.options.onDropdownShow);\n            this.$container.on('hide.bs.dropdown', this.options.onDropdownHide);\n            this.$container.on('shown.bs.dropdown', this.options.onDropdownShown);\n            this.$container.on('hidden.bs.dropdown', this.options.onDropdownHidden);\n        },\n\n        /**\n         * Builds the button of the multiselect.\n         */\n        buildButton: function() {\n            this.$button = $(this.options.templates.button).addClass(this.options.buttonClass);\n            if (this.$select.attr('class') && this.options.inheritClass) {\n                this.$button.addClass(this.$select.attr('class'));\n            }\n            // Adopt active state.\n            if (this.$select.prop('disabled')) {\n                this.disable();\n            }\n            else {\n                this.enable();\n            }\n\n            // Manually add button width if set.\n            if (this.options.buttonWidth && this.options.buttonWidth !== 'auto') {\n                this.$button.css({\n                    'width' : '100%', //this.options.buttonWidth,\n                    'overflow' : 'hidden',\n                    'text-overflow' : 'ellipsis'\n                });\n                this.$container.css({\n                    'width': this.options.buttonWidth\n                });\n            }\n\n            // Keep the tab index from the select.\n            var tabindex = this.$select.attr('tabindex');\n            if (tabindex) {\n                this.$button.attr('tabindex', tabindex);\n            }\n\n            this.$container.prepend(this.$button);\n        },\n\n        /**\n         * Builds the ul representing the dropdown menu.\n         */\n        buildDropdown: function() {\n\n            // Build ul.\n            this.$ul = $(this.options.templates.ul);\n\n            if (this.options.dropRight) {\n                this.$ul.addClass('pull-right');\n            }\n\n            // Set max height of dropdown menu to activate auto scrollbar.\n            if (this.options.maxHeight) {\n                // TODO: Add a class for this option to move the css declarations.\n                this.$ul.css({\n                    'max-height': this.options.maxHeight + 'px',\n                    'overflow-y': 'auto',\n                    'overflow-x': 'hidden'\n                });\n            }\n\n            if (this.options.dropUp) {\n\n                var height = Math.min(this.options.maxHeight, $('option[data-role!=\"divider\"]', this.$select).length*26 + $('option[data-role=\"divider\"]', this.$select).length*19 + (this.options.includeSelectAllOption ? 26 : 0) + (this.options.enableFiltering || this.options.enableCaseInsensitiveFiltering ? 44 : 0));\n                var moveCalc = height + 34;\n\n                this.$ul.css({\n                    'max-height': height + 'px',\n                    'overflow-y': 'auto',\n                    'overflow-x': 'hidden',\n                    'margin-top': \"-\" + moveCalc + 'px'\n                });\n            }\n\n            this.$container.append(this.$ul);\n        },\n\n        /**\n         * Build the dropdown options and binds all necessary events.\n         *\n         * Uses createDivider and createOptionValue to create the necessary options.\n         */\n        buildDropdownOptions: function() {\n\n            this.$select.children().each($.proxy(function(index, element) {\n\n                var $element = $(element);\n                // Support optgroups and options without a group simultaneously.\n                var tag = $element.prop('tagName')\n                    .toLowerCase();\n\n                if ($element.prop('value') === this.options.selectAllValue) {\n                    return;\n                }\n\n                if (tag === 'optgroup') {\n                    this.createOptgroup(element);\n                }\n                else if (tag === 'option') {\n\n                    if ($element.data('role') === 'divider') {\n                        this.createDivider();\n                    }\n                    else {\n                        this.createOptionValue(element);\n                    }\n\n                }\n\n                // Other illegal tags will be ignored.\n            }, this));\n\n            // Bind the change event on the dropdown elements.\n            $(this.$ul).off('change', 'li:not(.multiselect-group) input[type=\"checkbox\"], li:not(.multiselect-group) input[type=\"radio\"]');\n            $(this.$ul).on('change', 'li:not(.multiselect-group) input[type=\"checkbox\"], li:not(.multiselect-group) input[type=\"radio\"]', $.proxy(function(event) {\n                var $target = $(event.target);\n\n                var checked = $target.prop('checked') || false;\n                var isSelectAllOption = $target.val() === this.options.selectAllValue;\n\n                // Apply or unapply the configured selected class.\n                if (this.options.selectedClass) {\n                    if (checked) {\n                        $target.closest('li')\n                            .addClass(this.options.selectedClass);\n                    }\n                    else {\n                        $target.closest('li')\n                            .removeClass(this.options.selectedClass);\n                    }\n                }\n\n                // Get the corresponding option.\n                var value = $target.val();\n                var $option = this.getOptionByValue(value);\n\n                var $optionsNotThis = $('option', this.$select).not($option);\n                var $checkboxesNotThis = $('input', this.$container).not($target);\n\n                if (isSelectAllOption) {\n\n                    if (checked) {\n                        this.selectAll(this.options.selectAllJustVisible, true);\n                    }\n                    else {\n                        this.deselectAll(this.options.selectAllJustVisible, true);\n                    }\n                }\n                else {\n                    if (checked) {\n                        $option.prop('selected', true);\n\n                        if (this.options.multiple) {\n                            // Simply select additional option.\n                            $option.prop('selected', true);\n                        }\n                        else {\n                            // Unselect all other options and corresponding checkboxes.\n                            if (this.options.selectedClass) {\n                                $($checkboxesNotThis).closest('li').removeClass(this.options.selectedClass);\n                            }\n\n                            $($checkboxesNotThis).prop('checked', false);\n                            $optionsNotThis.prop('selected', false);\n\n                            // It's a single selection, so close.\n                            this.$button.click();\n                        }\n\n                        if (this.options.selectedClass === \"active\") {\n                            $optionsNotThis.closest(\"a\").css(\"outline\", \"\");\n                        }\n                    }\n                    else {\n                        // Unselect option.\n                        $option.prop('selected', false);\n                    }\n\n                    // To prevent select all from firing onChange: #575\n                    this.options.onChange($option, checked);\n\n                    // Do not update select all or optgroups on select all change!\n                    this.updateSelectAll();\n\n                    if (this.options.enableClickableOptGroups && this.options.multiple) {\n                        this.updateOptGroups();\n                    }\n                }\n\n                this.$select.change();\n                this.updateButtonText();\n\n                if(this.options.preventInputChangeEvent) {\n                    return false;\n                }\n            }, this));\n\n            $('li a', this.$ul).on('mousedown', function(e) {\n                if (e.shiftKey) {\n                    // Prevent selecting text by Shift+click\n                    return false;\n                }\n            });\n\n            $(this.$ul).on('touchstart click', 'li a', $.proxy(function(event) {\n                event.stopPropagation();\n\n                var $target = $(event.target);\n\n                if (event.shiftKey && this.options.multiple) {\n                    if($target.is(\"label\")){ // Handles checkbox selection manually (see https://github.com/davidstutz/bootstrap-multiselect/issues/431)\n                        event.preventDefault();\n                        $target = $target.find(\"input\");\n                        $target.prop(\"checked\", !$target.prop(\"checked\"));\n                    }\n                    var checked = $target.prop('checked') || false;\n\n                    if (this.lastToggledInput !== null && this.lastToggledInput !== $target) { // Make sure we actually have a range\n                        var from = this.$ul.find(\"li:visible\").index($target.parents(\"li\"));\n                        var to = this.$ul.find(\"li:visible\").index(this.lastToggledInput.parents(\"li\"));\n\n                        if (from > to) { // Swap the indices\n                            var tmp = to;\n                            to = from;\n                            from = tmp;\n                        }\n\n                        // Make sure we grab all elements since slice excludes the last index\n                        ++to;\n\n                        // Change the checkboxes and underlying options\n                        var range = this.$ul.find(\"li\").not(\".multiselect-filter-hidden\").slice(from, to).find(\"input\");\n\n                        range.prop('checked', checked);\n\n                        if (this.options.selectedClass) {\n                            range.closest('li')\n                                .toggleClass(this.options.selectedClass, checked);\n                        }\n\n                        for (var i = 0, j = range.length; i < j; i++) {\n                            var $checkbox = $(range[i]);\n\n                            var $option = this.getOptionByValue($checkbox.val());\n\n                            $option.prop('selected', checked);\n                        }\n                    }\n\n                    // Trigger the select \"change\" event\n                    $target.trigger(\"change\");\n                }\n\n                // Remembers last clicked option\n                if($target.is(\"input\") && !$target.closest(\"li\").is(\".multiselect-item\")){\n                    this.lastToggledInput = $target;\n                }\n\n                $target.blur();\n            }, this));\n\n            // Keyboard support.\n            this.$container.off('keydown.multiselect').on('keydown.multiselect', $.proxy(function(event) {\n                if ($('input[type=\"text\"]', this.$container).is(':focus')) {\n                    return;\n                }\n\n                if (event.keyCode === 9 && this.$container.hasClass('open')) {\n                    this.$button.click();\n                }\n                else {\n                    var $items = $(this.$container).find(\"li:not(.divider):not(.disabled) a\").filter(\":visible\");\n\n                    if (!$items.length) {\n                        return;\n                    }\n\n                    var index = $items.index($items.filter(':focus'));\n                    \n                    // Navigation up.\n                    if (event.keyCode === 38 && index > 0) {\n                        index--;\n                    }\n                    // Navigate down.\n                    else if (event.keyCode === 40 && index < $items.length - 1) {\n                        index++;\n                    }\n                    else if (!~index) {\n                        index = 0;\n                    }\n\n                    var $current = $items.eq(index);\n                    $current.focus();\n\n                    if (event.keyCode === 32 || event.keyCode === 13) {\n                        var $checkbox = $current.find('input');\n\n                        $checkbox.prop(\"checked\", !$checkbox.prop(\"checked\"));\n                        $checkbox.change();\n                    }\n\n                    event.stopPropagation();\n                    event.preventDefault();\n                }\n            }, this));\n\n            if (this.options.enableClickableOptGroups && this.options.multiple) {\n                $(\"li.multiselect-group input\", this.$ul).on(\"change\", $.proxy(function(event) {\n                    event.stopPropagation();\n\n                    var $target = $(event.target);\n                    var checked = $target.prop('checked') || false;\n\n                    var $li = $(event.target).closest('li');\n                    var $group = $li.nextUntil(\"li.multiselect-group\")\n                        .not('.multiselect-filter-hidden')\n                        .not('.disabled');\n\n                    var $inputs = $group.find(\"input\");\n\n                    var values = [];\n                    var $options = [];\n\n                    if (this.options.selectedClass) {\n                        if (checked) {\n                            $li.addClass(this.options.selectedClass);\n                        }\n                        else {\n                            $li.removeClass(this.options.selectedClass);\n                        }\n                    }\n\n                    $.each($inputs, $.proxy(function(index, input) {\n                        var value = $(input).val();\n                        var $option = this.getOptionByValue(value);\n\n                        if (checked) {\n                            $(input).prop('checked', true);\n                            $(input).closest('li')\n                                .addClass(this.options.selectedClass);\n\n                            $option.prop('selected', true);\n                        }\n                        else {\n                            $(input).prop('checked', false);\n                            $(input).closest('li')\n                                .removeClass(this.options.selectedClass);\n\n                            $option.prop('selected', false);\n                        }\n\n                        $options.push(this.getOptionByValue(value));\n                    }, this))\n\n                    // Cannot use select or deselect here because it would call updateOptGroups again.\n\n                    this.options.onChange($options, checked);\n\n                    this.$select.change();\n                    this.updateButtonText();\n                    this.updateSelectAll();\n                }, this));\n            }\n\n            if (this.options.enableCollapsibleOptGroups && this.options.multiple) {\n                $(\"li.multiselect-group .caret-container\", this.$ul).on(\"click\", $.proxy(function(event) {\n                    var $li = $(event.target).closest('li');\n                    var $inputs = $li.nextUntil(\"li.multiselect-group\")\n                            .not('.multiselect-filter-hidden');\n\n                    var visible = true;\n                    $inputs.each(function() {\n                        visible = visible && !$(this).hasClass('multiselect-collapsible-hidden');\n                    });\n\n                    if (visible) {\n                        $inputs.hide()\n                            .addClass('multiselect-collapsible-hidden');\n                    }\n                    else {\n                        $inputs.show()\n                            .removeClass('multiselect-collapsible-hidden');\n                    }\n                }, this));\n\n                $(\"li.multiselect-all\", this.$ul).css('background', '#f3f3f3').css('border-bottom', '1px solid #eaeaea');\n                $(\"li.multiselect-all > a > label.checkbox\", this.$ul).css('padding', '3px 20px 3px 35px');\n                $(\"li.multiselect-group > a > input\", this.$ul).css('margin', '4px 0px 5px -20px');\n            }\n        },\n\n        /**\n         * Create an option using the given select option.\n         *\n         * @param {jQuery} element\n         */\n        createOptionValue: function(element) {\n            var $element = $(element);\n            if ($element.is(':selected')) {\n                $element.prop('selected', true);\n            }\n\n            // Support the label attribute on options.\n            var label = this.options.optionLabel(element);\n            var classes = this.options.optionClass(element);\n            var value = $element.val();\n            var inputType = this.options.multiple ? \"checkbox\" : \"radio\";\n\n            var $li = $(this.options.templates.li);\n            var $label = $('label', $li);\n            $label.addClass(inputType);\n            $label.attr(\"title\", label);\n            $li.addClass(classes);\n\n            // Hide all children items when collapseOptGroupsByDefault is true\n            if (this.options.collapseOptGroupsByDefault && $(element).parent().prop(\"tagName\").toLowerCase() === \"optgroup\") {\n                $li.addClass(\"multiselect-collapsible-hidden\");\n                $li.hide();\n            }\n\n            if (this.options.enableHTML) {\n                $label.html(\" \" + label);\n            }\n            else {\n                $label.text(\" \" + label);\n            }\n\n            var $checkbox = $('<input/>').attr('type', inputType);\n\n            var name = this.options.checkboxName($element);\n            if (name) {\n                $checkbox.attr('name', name);\n            }\n\n            $label.prepend($checkbox);\n\n            var selected = $element.prop('selected') || false;\n            $checkbox.val(value);\n\n            if (value === this.options.selectAllValue) {\n                $li.addClass(\"multiselect-item multiselect-all\");\n                $checkbox.parent().parent()\n                    .addClass('multiselect-all');\n            }\n\n            $label.attr('title', $element.attr('title'));\n\n            this.$ul.append($li);\n\n            if ($element.is(':disabled')) {\n                $checkbox.attr('disabled', 'disabled')\n                    .prop('disabled', true)\n                    .closest('a')\n                    .attr(\"tabindex\", \"-1\")\n                    .closest('li')\n                    .addClass('disabled');\n            }\n\n            $checkbox.prop('checked', selected);\n\n            if (selected && this.options.selectedClass) {\n                $checkbox.closest('li')\n                    .addClass(this.options.selectedClass);\n            }\n        },\n\n        /**\n         * Creates a divider using the given select option.\n         *\n         * @param {jQuery} element\n         */\n        createDivider: function(element) {\n            var $divider = $(this.options.templates.divider);\n            this.$ul.append($divider);\n        },\n\n        /**\n         * Creates an optgroup.\n         *\n         * @param {jQuery} group\n         */\n        createOptgroup: function(group) {\n            var label = $(group).attr(\"label\");\n            var value = $(group).attr(\"value\");\n            var $li = $('<li class=\"multiselect-item multiselect-group\"><a href=\"javascript:void(0);\"><label><b></b></label></a></li>');\n\n            var classes = this.options.optionClass(group);\n            $li.addClass(classes);\n\n            if (this.options.enableHTML) {\n                $('label b', $li).html(\" \" + label);\n            }\n            else {\n                $('label b', $li).text(\" \" + label);\n            }\n\n            if (this.options.enableCollapsibleOptGroups && this.options.multiple) {\n                $('a', $li).append('<span class=\"caret-container\"><b class=\"caret\"></b></span>');\n            }\n\n            if (this.options.enableClickableOptGroups && this.options.multiple) {\n                $('a label', $li).prepend('<input type=\"checkbox\" value=\"' + value + '\"/>');\n            }\n\n            if ($(group).is(':disabled')) {\n                $li.addClass('disabled');\n            }\n\n            this.$ul.append($li);\n\n            $(\"option\", group).each($.proxy(function($, group) {\n                this.createOptionValue(group);\n            }, this))\n        },\n\n        /**\n         * Build the reset.\n         *\n         */\n        buildReset: function() {\n            if (this.options.includeResetOption) {\n\n                // Check whether to add a divider after the reset.\n                if (this.options.includeResetDivider) {\n                    this.$ul.prepend($(this.options.templates.divider));\n                }\n\n                var $resetButton = $(this.options.templates.resetButton);\n\n                if (this.options.enableHTML) {\n                    $('a', $resetButton).html(this.options.resetText);\n                }\n                else {\n                    $('a', $resetButton).text(this.options.resetText);\n                }\n\n                $('a', $resetButton).click($.proxy(function(){\n                    this.clearSelection();\n                }, this));\n\n                this.$ul.prepend($resetButton);\n            }\n        },\n\n        /**\n         * Build the select all.\n         *\n         * Checks if a select all has already been created.\n         */\n        buildSelectAll: function() {\n            if (typeof this.options.selectAllValue === 'number') {\n                this.options.selectAllValue = this.options.selectAllValue.toString();\n            }\n\n            var alreadyHasSelectAll = this.hasSelectAll();\n\n            if (!alreadyHasSelectAll && this.options.includeSelectAllOption && this.options.multiple\n                    && $('option', this.$select).length > this.options.includeSelectAllIfMoreThan) {\n\n                // Check whether to add a divider after the select all.\n                if (this.options.includeSelectAllDivider) {\n                    this.$ul.prepend($(this.options.templates.divider));\n                }\n\n                var $li = $(this.options.templates.li);\n                $('label', $li).addClass(\"checkbox\");\n\n                if (this.options.enableHTML) {\n                    $('label', $li).html(\" \" + this.options.selectAllText);\n                }\n                else {\n                    $('label', $li).text(\" \" + this.options.selectAllText);\n                }\n\n                if (this.options.selectAllName) {\n                    $('label', $li).prepend('<input type=\"checkbox\" name=\"' + this.options.selectAllName + '\" />');\n                }\n                else {\n                    $('label', $li).prepend('<input type=\"checkbox\" />');\n                }\n\n                var $checkbox = $('input', $li);\n                $checkbox.val(this.options.selectAllValue);\n\n                $li.addClass(\"multiselect-item multiselect-all\");\n                $checkbox.parent().parent()\n                    .addClass('multiselect-all');\n\n                this.$ul.prepend($li);\n\n                $checkbox.prop('checked', false);\n            }\n        },\n\n        /**\n         * Builds the filter.\n         */\n        buildFilter: function() {\n\n            // Build filter if filtering OR case insensitive filtering is enabled and the number of options exceeds (or equals) enableFilterLength.\n            if (this.options.enableFiltering || this.options.enableCaseInsensitiveFiltering) {\n                var enableFilterLength = Math.max(this.options.enableFiltering, this.options.enableCaseInsensitiveFiltering);\n\n                if (this.$select.find('option').length >= enableFilterLength) {\n\n                    this.$filter = $(this.options.templates.filter);\n                    $('input', this.$filter).attr('placeholder', this.options.filterPlaceholder);\n\n                    // Adds optional filter clear button\n                    if(this.options.includeFilterClearBtn) {\n                        var clearBtn = $(this.options.templates.filterClearBtn);\n                        clearBtn.on('click', $.proxy(function(event){\n                            clearTimeout(this.searchTimeout);\n\n                            this.query = '';\n                            this.$filter.find('.multiselect-search').val('');\n                            $('li', this.$ul).show().removeClass('multiselect-filter-hidden');\n\n                            this.updateSelectAll();\n\n                            if (this.options.enableClickableOptGroups && this.options.multiple) {\n                                this.updateOptGroups();\n                            }\n\n                        }, this));\n                        this.$filter.find('.input-group').append(clearBtn);\n                    }\n\n                    this.$ul.prepend(this.$filter);\n\n                    this.$filter.val(this.query).on('click', function(event) {\n                        event.stopPropagation();\n                    }).on('input keydown', $.proxy(function(event) {\n                        // Cancel enter key default behaviour\n                        if (event.which === 13) {\n                          event.preventDefault();\n                      }\n\n                        // This is useful to catch \"keydown\" events after the browser has updated the control.\n                        clearTimeout(this.searchTimeout);\n\n                        this.searchTimeout = this.asyncFunction($.proxy(function() {\n\n                            if (this.query !== event.target.value) {\n                                this.query = event.target.value;\n\n                                var currentGroup, currentGroupVisible;\n                                $.each($('li', this.$ul), $.proxy(function(index, element) {\n                                    var value = $('input', element).length > 0 ? $('input', element).val() : \"\";\n                                    var text = $('label', element).text();\n\n                                    var filterCandidate = '';\n                                    if ((this.options.filterBehavior === 'text')) {\n                                        filterCandidate = text;\n                                    }\n                                    else if ((this.options.filterBehavior === 'value')) {\n                                        filterCandidate = value;\n                                    }\n                                    else if (this.options.filterBehavior === 'both') {\n                                        filterCandidate = text + '\\n' + value;\n                                    }\n\n                                    if (value !== this.options.selectAllValue && text) {\n\n                                        // By default lets assume that element is not\n                                        // interesting for this search.\n                                        var showElement = false;\n\n                                        if (this.options.enableCaseInsensitiveFiltering) {\n                                            filterCandidate = filterCandidate.toLowerCase();\n                                            this.query = this.query.toLowerCase();\n                                        }\n\n                                        if (this.options.enableFullValueFiltering && this.options.filterBehavior !== 'both') {\n                                            var valueToMatch = filterCandidate.trim().substring(0, this.query.length);\n                                            if (this.query.indexOf(valueToMatch) > -1) {\n                                                showElement = true;\n                                            }\n                                        }\n                                        else if (filterCandidate.indexOf(this.query) > -1) {\n                                            showElement = true;\n                                        }\n\n                                        // Toggle current element (group or group item) according to showElement boolean.\n                                        if(!showElement){\n                                          $(element).css('display', 'none');\n                                          $(element).addClass('multiselect-filter-hidden');\n                                        }\n                                        if(showElement){\n                                          $(element).css('display', 'block');\n                                          $(element).removeClass('multiselect-filter-hidden');\n                                        }\n\n                                        // Differentiate groups and group items.\n                                        if ($(element).hasClass('multiselect-group')) {\n                                            // Remember group status.\n                                            currentGroup = element;\n                                            currentGroupVisible = showElement;\n                                        }\n                                        else {\n                                            // Show group name when at least one of its items is visible.\n                                            if (showElement) {\n                                                $(currentGroup).show()\n                                                    .removeClass('multiselect-filter-hidden');\n                                            }\n\n                                            // Show all group items when group name satisfies filter.\n                                            if (!showElement && currentGroupVisible) {\n                                                $(element).show()\n                                                    .removeClass('multiselect-filter-hidden');\n                                            }\n                                        }\n                                    }\n                                }, this));\n                            }\n\n                            this.updateSelectAll();\n\n                            if (this.options.enableClickableOptGroups && this.options.multiple) {\n                                this.updateOptGroups();\n                            }\n\n                            this.options.onFiltering(event.target);\n\n                        }, this), 300, this);\n                    }, this));\n                }\n            }\n        },\n\n        /**\n         * Unbinds the whole plugin.\n         */\n        destroy: function() {\n            this.$container.remove();\n            this.$select.show();\n\n            // reset original state\n            this.$select.prop('disabled', this.options.wasDisabled);\n\n            this.$select.data('multiselect', null);\n        },\n\n        /**\n         * Refreshs the multiselect based on the selected options of the select.\n         */\n        refresh: function () {\n            var inputs = {};\n            $('li input', this.$ul).each(function() {\n              inputs[$(this).val()] = $(this);\n            });\n\n            $('option', this.$select).each($.proxy(function (index, element) {\n                var $elem = $(element);\n                var $input = inputs[$(element).val()];\n\n                if ($elem.is(':selected')) {\n                    $input.prop('checked', true);\n\n                    if (this.options.selectedClass) {\n                        $input.closest('li')\n                            .addClass(this.options.selectedClass);\n                    }\n                }\n                else {\n                    $input.prop('checked', false);\n\n                    if (this.options.selectedClass) {\n                        $input.closest('li')\n                            .removeClass(this.options.selectedClass);\n                    }\n                }\n\n                if ($elem.is(\":disabled\")) {\n                    $input.attr('disabled', 'disabled')\n                        .prop('disabled', true)\n                        .closest('li')\n                        .addClass('disabled');\n                }\n                else {\n                    $input.prop('disabled', false)\n                        .closest('li')\n                        .removeClass('disabled');\n                }\n            }, this));\n\n            this.updateButtonText();\n            this.updateSelectAll();\n\n            if (this.options.enableClickableOptGroups && this.options.multiple) {\n                this.updateOptGroups();\n            }\n        },\n\n        /**\n         * Select all options of the given values.\n         *\n         * If triggerOnChange is set to true, the on change event is triggered if\n         * and only if one value is passed.\n         *\n         * @param {Array} selectValues\n         * @param {Boolean} triggerOnChange\n         */\n        select: function(selectValues, triggerOnChange) {\n            if(!$.isArray(selectValues)) {\n                selectValues = [selectValues];\n            }\n\n            for (var i = 0; i < selectValues.length; i++) {\n                var value = selectValues[i];\n\n                if (value === null || value === undefined) {\n                    continue;\n                }\n\n                var $option = this.getOptionByValue(value);\n                var $checkbox = this.getInputByValue(value);\n\n                if($option === undefined || $checkbox === undefined) {\n                    continue;\n                }\n\n                if (!this.options.multiple) {\n                    this.deselectAll(false);\n                }\n\n                if (this.options.selectedClass) {\n                    $checkbox.closest('li')\n                        .addClass(this.options.selectedClass);\n                }\n\n                $checkbox.prop('checked', true);\n                $option.prop('selected', true);\n\n                if (triggerOnChange) {\n                    this.options.onChange($option, true);\n                }\n            }\n\n            this.updateButtonText();\n            this.updateSelectAll();\n\n            if (this.options.enableClickableOptGroups && this.options.multiple) {\n                this.updateOptGroups();\n            }\n        },\n\n        /**\n         * Clears all selected items.\n         */\n        clearSelection: function () {\n            this.deselectAll(false);\n            this.updateButtonText();\n            this.updateSelectAll();\n\n            if (this.options.enableClickableOptGroups && this.options.multiple) {\n                this.updateOptGroups();\n            }\n        },\n\n        /**\n         * Deselects all options of the given values.\n         *\n         * If triggerOnChange is set to true, the on change event is triggered, if\n         * and only if one value is passed.\n         *\n         * @param {Array} deselectValues\n         * @param {Boolean} triggerOnChange\n         */\n        deselect: function(deselectValues, triggerOnChange) {\n            if(!$.isArray(deselectValues)) {\n                deselectValues = [deselectValues];\n            }\n\n            for (var i = 0; i < deselectValues.length; i++) {\n                var value = deselectValues[i];\n\n                if (value === null || value === undefined) {\n                    continue;\n                }\n\n                var $option = this.getOptionByValue(value);\n                var $checkbox = this.getInputByValue(value);\n\n                if($option === undefined || $checkbox === undefined) {\n                    continue;\n                }\n\n                if (this.options.selectedClass) {\n                    $checkbox.closest('li')\n                        .removeClass(this.options.selectedClass);\n                }\n\n                $checkbox.prop('checked', false);\n                $option.prop('selected', false);\n\n                if (triggerOnChange) {\n                    this.options.onChange($option, false);\n                }\n            }\n\n            this.updateButtonText();\n            this.updateSelectAll();\n\n            if (this.options.enableClickableOptGroups && this.options.multiple) {\n                this.updateOptGroups();\n            }\n        },\n\n        /**\n         * Selects all enabled & visible options.\n         *\n         * If justVisible is true or not specified, only visible options are selected.\n         *\n         * @param {Boolean} justVisible\n         * @param {Boolean} triggerOnSelectAll\n         */\n        selectAll: function (justVisible, triggerOnSelectAll) {\n\n            var justVisible = typeof justVisible === 'undefined' ? true : justVisible;\n            var allLis = $(\"li:not(.divider):not(.disabled):not(.multiselect-group)\", this.$ul);\n            var visibleLis = $(\"li:not(.divider):not(.disabled):not(.multiselect-group):not(.multiselect-filter-hidden):not(.multiselect-collapisble-hidden)\", this.$ul).filter(':visible');\n\n            if(justVisible) {\n                $('input:enabled' , visibleLis).prop('checked', true);\n                visibleLis.addClass(this.options.selectedClass);\n\n                $('input:enabled' , visibleLis).each($.proxy(function(index, element) {\n                    var value = $(element).val();\n                    var option = this.getOptionByValue(value);\n                    $(option).prop('selected', true);\n                }, this));\n            }\n            else {\n                $('input:enabled' , allLis).prop('checked', true);\n                allLis.addClass(this.options.selectedClass);\n\n                $('input:enabled' , allLis).each($.proxy(function(index, element) {\n                    var value = $(element).val();\n                    var option = this.getOptionByValue(value);\n                    $(option).prop('selected', true);\n                }, this));\n            }\n\n            $('li input[value=\"' + this.options.selectAllValue + '\"]', this.$ul).prop('checked', true);\n\n            if (this.options.enableClickableOptGroups && this.options.multiple) {\n                this.updateOptGroups();\n            }\n\n            if (triggerOnSelectAll) {\n                this.options.onSelectAll();\n            }\n        },\n\n        /**\n         * Deselects all options.\n         *\n         * If justVisible is true or not specified, only visible options are deselected.\n         *\n         * @param {Boolean} justVisible\n         */\n        deselectAll: function (justVisible, triggerOnDeselectAll) {\n\n            var justVisible = typeof justVisible === 'undefined' ? true : justVisible;\n            var allLis = $(\"li:not(.divider):not(.disabled):not(.multiselect-group)\", this.$ul);\n            var visibleLis = $(\"li:not(.divider):not(.disabled):not(.multiselect-group):not(.multiselect-filter-hidden):not(.multiselect-collapisble-hidden)\", this.$ul).filter(':visible');\n\n            if(justVisible) {\n                $('input[type=\"checkbox\"]:enabled' , visibleLis).prop('checked', false);\n                visibleLis.removeClass(this.options.selectedClass);\n\n                $('input[type=\"checkbox\"]:enabled' , visibleLis).each($.proxy(function(index, element) {\n                    var value = $(element).val();\n                    var option = this.getOptionByValue(value);\n                    $(option).prop('selected', false);\n                }, this));\n            }\n            else {\n                $('input[type=\"checkbox\"]:enabled' , allLis).prop('checked', false);\n                allLis.removeClass(this.options.selectedClass);\n\n                $('input[type=\"checkbox\"]:enabled' , allLis).each($.proxy(function(index, element) {\n                    var value = $(element).val();\n                    var option = this.getOptionByValue(value);\n                    $(option).prop('selected', false);\n                }, this));\n            }\n\n            $('li input[value=\"' + this.options.selectAllValue + '\"]', this.$ul).prop('checked', false);\n\n            if (this.options.enableClickableOptGroups && this.options.multiple) {\n                this.updateOptGroups();\n            }\n\n            if (triggerOnDeselectAll) {\n                this.options.onDeselectAll();\n            }\n        },\n\n        /**\n         * Rebuild the plugin.\n         *\n         * Rebuilds the dropdown, the filter and the select all option.\n         */\n        rebuild: function() {\n            this.$ul.html('');\n\n            // Important to distinguish between radios and checkboxes.\n            this.options.multiple = this.$select.attr('multiple') === \"multiple\";\n\n            this.buildSelectAll();\n            this.buildDropdownOptions();\n            this.buildFilter();\n\n            this.updateButtonText();\n            this.updateSelectAll(true);\n\n            if (this.options.enableClickableOptGroups && this.options.multiple) {\n                this.updateOptGroups();\n            }\n\n            if (this.options.disableIfEmpty && $('option', this.$select).length <= 0) {\n                this.disable();\n            }\n            else {\n                this.enable();\n            }\n\n            if (this.options.dropRight) {\n                this.$ul.addClass('pull-right');\n            }\n        },\n\n        /**\n         * The provided data will be used to build the dropdown.\n         */\n        dataprovider: function(dataprovider) {\n\n            var groupCounter = 0;\n            var $select = this.$select.empty();\n\n            $.each(dataprovider, function (index, option) {\n                var $tag;\n\n                if ($.isArray(option.children)) { // create optiongroup tag\n                    groupCounter++;\n\n                    $tag = $('<optgroup/>').attr({\n                        label: option.label || 'Group ' + groupCounter,\n                        disabled: !!option.disabled,\n                        value: option.value\n                    });\n\n                    forEach(option.children, function(subOption) { // add children option tags\n                        var attributes = {\n                            value: subOption.value,\n                            label: subOption.label || subOption.value,\n                            title: subOption.title,\n                            selected: !!subOption.selected,\n                            disabled: !!subOption.disabled\n                        };\n\n                        //Loop through attributes object and add key-value for each attribute\n                       for (var key in subOption.attributes) {\n                            attributes['data-' + key] = subOption.attributes[key];\n                       }\n                         //Append original attributes + new data attributes to option\n                        $tag.append($('<option/>').attr(attributes));\n                    });\n                }\n                else {\n\n                    var attributes = {\n                        'value': option.value,\n                        'label': option.label || option.value,\n                        'title': option.title,\n                        'class': option['class'],\n                        'selected': !!option['selected'],\n                        'disabled': !!option['disabled']\n                    };\n                    //Loop through attributes object and add key-value for each attribute\n                    for (var key in option.attributes) {\n                      attributes['data-' + key] = option.attributes[key];\n                    }\n                    //Append original attributes + new data attributes to option\n                    $tag = $('<option/>').attr(attributes);\n\n                    $tag.text(option.label || option.value);\n                }\n\n                $select.append($tag);\n            });\n\n            this.rebuild();\n        },\n\n        /**\n         * Enable the multiselect.\n         */\n        enable: function() {\n            this.$select.prop('disabled', false);\n            this.$button.prop('disabled', false)\n                .removeClass('disabled');\n        },\n\n        /**\n         * Disable the multiselect.\n         */\n        disable: function() {\n            this.$select.prop('disabled', true);\n            this.$button.prop('disabled', true)\n                .addClass('disabled');\n        },\n\n        /**\n         * Set the options.\n         *\n         * @param {Array} options\n         */\n        setOptions: function(options) {\n            this.options = this.mergeOptions(options);\n        },\n\n        /**\n         * Merges the given options with the default options.\n         *\n         * @param {Array} options\n         * @returns {Array}\n         */\n        mergeOptions: function(options) {\n            return $.extend(true, {}, this.defaults, this.options, options);\n        },\n\n        /**\n         * Checks whether a select all checkbox is present.\n         *\n         * @returns {Boolean}\n         */\n        hasSelectAll: function() {\n            return $('li.multiselect-all', this.$ul).length > 0;\n        },\n\n        /**\n         * Update opt groups.\n         */\n        updateOptGroups: function() {\n            var $groups = $('li.multiselect-group', this.$ul)\n            var selectedClass = this.options.selectedClass;\n\n            $groups.each(function() {\n                var $options = $(this).nextUntil('li.multiselect-group')\n                    .not('.multiselect-filter-hidden')\n                    .not('.disabled');\n\n                var checked = true;\n                $options.each(function() {\n                    var $input = $('input', this);\n\n                    if (!$input.prop('checked')) {\n                        checked = false;\n                    }\n                });\n\n                if (selectedClass) {\n                    if (checked) {\n                        $(this).addClass(selectedClass);\n                    }\n                    else {\n                        $(this).removeClass(selectedClass);\n                    }\n                }\n\n                $('input', this).prop('checked', checked);\n            });\n        },\n\n        /**\n         * Updates the select all checkbox based on the currently displayed and selected checkboxes.\n         */\n        updateSelectAll: function(notTriggerOnSelectAll) {\n            if (this.hasSelectAll()) {\n                var allBoxes = $(\"li:not(.multiselect-item):not(.multiselect-filter-hidden):not(.multiselect-group):not(.disabled) input:enabled\", this.$ul);\n                var allBoxesLength = allBoxes.length;\n                var checkedBoxesLength = allBoxes.filter(\":checked\").length;\n                var selectAllLi  = $(\"li.multiselect-all\", this.$ul);\n                var selectAllInput = selectAllLi.find(\"input\");\n\n                if (checkedBoxesLength > 0 && checkedBoxesLength === allBoxesLength) {\n                    selectAllInput.prop(\"checked\", true);\n                    selectAllLi.addClass(this.options.selectedClass);\n                }\n                else {\n                    selectAllInput.prop(\"checked\", false);\n                    selectAllLi.removeClass(this.options.selectedClass);\n                }\n            }\n        },\n\n        /**\n         * Update the button text and its title based on the currently selected options.\n         */\n        updateButtonText: function() {\n            var options = this.getSelected();\n\n            // First update the displayed button text.\n            if (this.options.enableHTML) {\n                $('.multiselect .multiselect-selected-text', this.$container).html(this.options.buttonText(options, this.$select));\n            }\n            else {\n                $('.multiselect .multiselect-selected-text', this.$container).text(this.options.buttonText(options, this.$select));\n            }\n\n            // Now update the title attribute of the button.\n            $('.multiselect', this.$container).attr('title', this.options.buttonTitle(options, this.$select));\n        },\n\n        /**\n         * Get all selected options.\n         *\n         * @returns {jQUery}\n         */\n        getSelected: function() {\n            return $('option', this.$select).filter(\":selected\");\n        },\n\n        /**\n         * Gets a select option by its value.\n         *\n         * @param {String} value\n         * @returns {jQuery}\n         */\n        getOptionByValue: function (value) {\n\n            var options = $('option', this.$select);\n            var valueToCompare = value.toString();\n\n            for (var i = 0; i < options.length; i = i + 1) {\n                var option = options[i];\n                if (option.value === valueToCompare) {\n                    return $(option);\n                }\n            }\n        },\n\n        /**\n         * Get the input (radio/checkbox) by its value.\n         *\n         * @param {String} value\n         * @returns {jQuery}\n         */\n        getInputByValue: function (value) {\n\n            var checkboxes = $('li input:not(.multiselect-search)', this.$ul);\n            var valueToCompare = value.toString();\n\n            for (var i = 0; i < checkboxes.length; i = i + 1) {\n                var checkbox = checkboxes[i];\n                if (checkbox.value === valueToCompare) {\n                    return $(checkbox);\n                }\n            }\n        },\n\n        /**\n         * Used for knockout integration.\n         */\n        updateOriginalOptions: function() {\n            this.originalOptions = this.$select.clone()[0].options;\n        },\n\n        asyncFunction: function(callback, timeout, self) {\n            var args = Array.prototype.slice.call(arguments, 3);\n            return setTimeout(function() {\n                callback.apply(self || window, args);\n            }, timeout);\n        },\n\n        setAllSelectedText: function(allSelectedText) {\n            this.options.allSelectedText = allSelectedText;\n            this.updateButtonText();\n        }\n    };\n\n    $.fn.multiselect = function(option, parameter, extraOptions) {\n        return this.each(function() {\n            var data = $(this).data('multiselect');\n            var options = typeof option === 'object' && option;\n\n            // Initialize the multiselect.\n            if (!data) {\n                data = new Multiselect(this, options);\n                $(this).data('multiselect', data);\n            }\n\n            // Call multiselect method.\n            if (typeof option === 'string') {\n                data[option](parameter, extraOptions);\n\n                if (option === 'destroy') {\n                    $(this).data('multiselect', false);\n                }\n            }\n        });\n    };\n\n    $.fn.multiselect.Constructor = Multiselect;\n\n    $(function() {\n        $(\"select[data-role=multiselect]\").multiselect();\n    });\n\n});\n"
  },
  {
    "path": "easyflow-flow-bpmn/static/plugins/bootstrap-multiselect/less/bootstrap-multiselect.less",
    "content": "/**\n * Bootstrap Multiselect (http://davidstutz.de/bootstrap-multiselect/)\n *\n * Apache License, Version 2.0:\n * Copyright (c) 2012 - 2018 David Stutz\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a\n * copy of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n *\n * BSD 3-Clause License:\n * Copyright (c) 2012 - 2018 David Stutz\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *    - Redistributions of source code must retain the above copyright notice,\n *      this list of conditions and the following disclaimer.\n *    - Redistributions in binary form must reproduce the above copyright notice,\n *      this list of conditions and the following disclaimer in the documentation\n *      and/or other materials provided with the distribution.\n *    - Neither the name of David Stutz nor the names of its contributors may be\n *      used to endorse or promote products derived from this software without\n *      specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nspan.multiselect-native-select{\n  position:relative\n}\n\nspan.multiselect-native-select select{\n  border :0 !important;\n  clip: rect(0 0 0 0) !important;\n  height: 1px !important;\n  margin: -1px -1px -1px -3px !important;\n  overflow: hidden !important;\n  padding: 0 !important;\n  position: absolute !important;\n  width: 1px !important;\n  left: 50%;\n  top: 30px;\n}\n\n.multiselect-container {\n  position: absolute;\n  list-style-type: none;\n  margin: 0;\n  padding: 0;\n\n  .input-group {\n    margin: 5px;\n  }\n\n  .multiselect-reset {\n    .input-group {\n      width: 93%;\n    }\n  }\n\n  > li {\n    padding: 0;\n\n    > a.multiselect-all label {\n      font-weight: bold;\n    }\n\n    &.multiselect-group label {\n      margin: 0;\n      padding: 3px 20px 3px 20px;\n      height: 100%;\n      font-weight: bold;\n    }\n\n    &.multiselect-group-clickable label {\n      cursor: pointer;\n    }\n\n    > a {\n      padding: 0;\n\n      > label {\n        margin: 0;\n        height: 100%;\n        cursor: pointer;\n        font-weight: normal;\n        padding: 3px 20px 3px 40px;\n\n        &.radio, &.checkbox {\n          margin: 0;\n        }\n\n        > input[type=\"checkbox\"] {\n          margin-bottom:5px;\n        }\n      }\n    }\n  }\n}\n\n.btn-group > .btn-group:nth-child(2) > .multiselect.btn {\n  border-top-left-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n\n.form-inline .multiselect-container{\n\n  label.checkbox, label.radio{\n    padding: 3px 20px 3px 40px;\n  }\n\n  li a label{\n\n    &.checkbox input[type=\"checkbox\"], &.radio input[type=\"radio\"]{\n      margin-left: -20px;\n      margin-right: 0;\n    }\n  }\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/static/plugins/bpmnjs/assets/bpmn-font/css/bpmn-codes.css",
    "content": "\n.bpmn-icon-trash:before { content: '\\e801'; } /* '' */\n.bpmn-icon-gateway-parallel:before { content: '\\e804'; } /* '' */\n.bpmn-icon-intermediate-event-catch-cancel:before { content: '\\e805'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-message:before { content: '\\e806'; } /* '' */\n.bpmn-icon-start-event-compensation:before { content: '\\e807'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-parallel-multiple:before { content: '\\e808'; } /* '' */\n.bpmn-icon-loop-marker:before { content: '\\e809'; } /* '' */\n.bpmn-icon-parallel-mi-marker:before { content: '\\e80a'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-signal:before { content: '\\e80b'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-timer:before { content: '\\e80c'; } /* '' */\n.bpmn-icon-intermediate-event-catch-parallel-multiple:before { content: '\\e80d'; } /* '' */\n.bpmn-icon-intermediate-event-catch-compensation:before { content: '\\e80e'; } /* '' */\n.bpmn-icon-gateway-xor:before { content: '\\e80f'; } /* '' */\n.bpmn-icon-end-event-cancel:before { content: '\\e811'; } /* '' */\n.bpmn-icon-intermediate-event-catch-condition:before { content: '\\e812'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-parallel-multiple:before { content: '\\e813'; } /* '' */\n.bpmn-icon-start-event-condition:before { content: '\\e814'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-timer:before { content: '\\e815'; } /* '' */\n.bpmn-icon-sequential-mi-marker:before { content: '\\e816'; } /* '' */\n.bpmn-icon-user-task:before { content: '\\e817'; } /* '' */\n.bpmn-icon-business-rule:before { content: '\\e818'; } /* '' */\n.bpmn-icon-sub-process-marker:before { content: '\\e819'; } /* '' */\n.bpmn-icon-start-event-parallel-multiple:before { content: '\\e81a'; } /* '' */\n.bpmn-icon-start-event-error:before { content: '\\e81b'; } /* '' */\n.bpmn-icon-intermediate-event-catch-signal:before { content: '\\e81c'; } /* '' */\n.bpmn-icon-intermediate-event-catch-error:before { content: '\\e81d'; } /* '' */\n.bpmn-icon-end-event-compensation:before { content: '\\e81e'; } /* '' */\n.bpmn-icon-subprocess-collapsed:before { content: '\\e81f'; } /* '' */\n.bpmn-icon-subprocess-expanded:before { content: '\\e820'; } /* '' */\n.bpmn-icon-task:before { content: '\\e821'; } /* '' */\n.bpmn-icon-end-event-error:before { content: '\\e822'; } /* '' */\n.bpmn-icon-intermediate-event-catch-escalation:before { content: '\\e823'; } /* '' */\n.bpmn-icon-intermediate-event-catch-timer:before { content: '\\e824'; } /* '' */\n.bpmn-icon-start-event-escalation:before { content: '\\e825'; } /* '' */\n.bpmn-icon-start-event-signal:before { content: '\\e826'; } /* '' */\n.bpmn-icon-business-rule-task:before { content: '\\e827'; } /* '' */\n.bpmn-icon-manual:before { content: '\\e828'; } /* '' */\n.bpmn-icon-receive:before { content: '\\e829'; } /* '' */\n.bpmn-icon-call-activity:before { content: '\\e82a'; } /* '' */\n.bpmn-icon-start-event-timer:before { content: '\\e82b'; } /* '' */\n.bpmn-icon-start-event-message:before { content: '\\e82c'; } /* '' */\n.bpmn-icon-intermediate-event-none:before { content: '\\e82d'; } /* '' */\n.bpmn-icon-intermediate-event-catch-link:before { content: '\\e82e'; } /* '' */\n.bpmn-icon-end-event-escalation:before { content: '\\e82f'; } /* '' */\n.bpmn-icon-bpmn-io:before { content: '\\e831'; } /* '' */\n.bpmn-icon-gateway-complex:before { content: '\\e832'; } /* '' */\n.bpmn-icon-gateway-eventbased:before { content: '\\e833'; } /* '' */\n.bpmn-icon-gateway-none:before { content: '\\e834'; } /* '' */\n.bpmn-icon-gateway-or:before { content: '\\e835'; } /* '' */\n.bpmn-icon-end-event-terminate:before { content: '\\e836'; } /* '' */\n.bpmn-icon-end-event-signal:before { content: '\\e837'; } /* '' */\n.bpmn-icon-end-event-none:before { content: '\\e838'; } /* '' */\n.bpmn-icon-end-event-multiple:before { content: '\\e839'; } /* '' */\n.bpmn-icon-end-event-message:before { content: '\\e83a'; } /* '' */\n.bpmn-icon-end-event-link:before { content: '\\e83b'; } /* '' */\n.bpmn-icon-intermediate-event-catch-message:before { content: '\\e83c'; } /* '' */\n.bpmn-icon-intermediate-event-throw-compensation:before { content: '\\e83d'; } /* '' */\n.bpmn-icon-start-event-multiple:before { content: '\\e83e'; } /* '' */\n.bpmn-icon-script:before { content: '\\e83f'; } /* '' */\n.bpmn-icon-manual-task:before { content: '\\e840'; } /* '' */\n.bpmn-icon-send:before { content: '\\e841'; } /* '' */\n.bpmn-icon-service:before { content: '\\e842'; } /* '' */\n.bpmn-icon-receive-task:before { content: '\\e843'; } /* '' */\n.bpmn-icon-user:before { content: '\\e844'; } /* '' */\n.bpmn-icon-start-event-none:before { content: '\\e845'; } /* '' */\n.bpmn-icon-intermediate-event-throw-escalation:before { content: '\\e846'; } /* '' */\n.bpmn-icon-intermediate-event-catch-multiple:before { content: '\\e847'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-escalation:before { content: '\\e848'; } /* '' */\n.bpmn-icon-intermediate-event-throw-link:before { content: '\\e849'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-condition:before { content: '\\e84a'; } /* '' */\n.bpmn-icon-data-object:before { content: '\\e84b'; } /* '' */\n.bpmn-icon-script-task:before { content: '\\e84c'; } /* '' */\n.bpmn-icon-send-task:before { content: '\\e84d'; } /* '' */\n.bpmn-icon-data-store:before { content: '\\e84e'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-escalation:before { content: '\\e84f'; } /* '' */\n.bpmn-icon-intermediate-event-throw-message:before { content: '\\e850'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-multiple:before { content: '\\e851'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-signal:before { content: '\\e852'; } /* '' */\n.bpmn-icon-intermediate-event-throw-multiple:before { content: '\\e853'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-message:before { content: '\\e854'; } /* '' */\n.bpmn-icon-ad-hoc-marker:before { content: '\\e855'; } /* '' */\n.bpmn-icon-service-task:before { content: '\\e856'; } /* '' */\n.bpmn-icon-task-none:before { content: '\\e857'; } /* '' */\n.bpmn-icon-compensation-marker:before { content: '\\e858'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-multiple:before { content: '\\e859'; } /* '' */\n.bpmn-icon-intermediate-event-throw-signal:before { content: '\\e85a'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-condition:before { content: '\\e85b'; } /* '' */\n.bpmn-icon-participant:before { content: '\\e85c'; } /* '' */\n.bpmn-icon-event-subprocess-expanded:before { content: '\\e85d'; } /* '' */\n.bpmn-icon-lane-insert-below:before { content: '\\e85e'; } /* '' */\n.bpmn-icon-space-tool:before { content: '\\e85f'; } /* '' */\n.bpmn-icon-connection-multi:before { content: '\\e860'; } /* '' */\n.bpmn-icon-lane:before { content: '\\e861'; } /* '' */\n.bpmn-icon-lasso-tool:before { content: '\\e862'; } /* '' */\n.bpmn-icon-lane-insert-above:before { content: '\\e863'; } /* '' */\n.bpmn-icon-lane-divide-three:before { content: '\\e864'; } /* '' */\n.bpmn-icon-lane-divide-two:before { content: '\\e865'; } /* '' */\n.bpmn-icon-data-input:before { content: '\\e866'; } /* '' */\n.bpmn-icon-data-output:before { content: '\\e867'; } /* '' */\n.bpmn-icon-hand-tool:before { content: '\\e868'; } /* '' */\n.bpmn-icon-group:before { content: '\\e869'; } /* '' */\n.bpmn-icon-text-annotation:before { content: '\\e86b'; } /* '' */\n.bpmn-icon-transaction:before { content: '\\e8c4'; } /* '' */\n.bpmn-icon-screw-wrench:before { content: '\\e8db'; } /* '' */\n.bpmn-icon-connection:before { content: '\\e8dc'; } /* '' */\n.bpmn-icon-conditional-flow:before { content: '\\e8e0'; } /* '' */\n.bpmn-icon-default-flow:before { content: '\\e8e1'; } /* '' */\n"
  },
  {
    "path": "easyflow-flow-bpmn/static/plugins/bpmnjs/assets/bpmn-font/css/bpmn-embedded.css",
    "content": "@font-face {\n  font-family: 'bpmn';\n  src: url('../font/bpmn.eot?16406289');\n  src: url('../font/bpmn.eot?16406289#iefix') format('embedded-opentype'),\n       url('../font/bpmn.svg?16406289#bpmn') format('svg');\n  font-weight: normal;\n  font-style: normal;\n}\n@font-face {\n  font-family: 'bpmn';\n  src: url('data:application/octet-stream;base64,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') format('woff'),\n       url('data:application/octet-stream;base64,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AADoGQAA6BkAAAAWAADoGgAA6BoAAAAXAADoGwAA6BsAAAAYAADoHAAA6BwAAAAZAADoHQAA6B0AAAAaAADoHgAA6B4AAAAbAADoHwAA6B8AAAAcAADoIAAA6CAAAAAdAADoIQAA6CEAAAAeAADoIgAA6CIAAAAfAADoIwAA6CMAAAAgAADoJAAA6CQAAAAhAADoJQAA6CUAAAAiAADoJgAA6CYAAAAjAADoJwAA6CcAAAAkAADoKAAA6CgAAAAlAADoKQAA6CkAAAAmAADoKgAA6CoAAAAnAADoKwAA6CsAAAAoAADoLAAA6CwAAAApAADoLQAA6C0AAAAqAADoLgAA6C4AAAArAADoLwAA6C8AAAAsAADoMQAA6DEAAAAtAADoMgAA6DIAAAAuAADoMwAA6DMAAAAvAADoNAAA6DQAAAAwAADoNQAA6DUAAAAxAADoNgAA6DYAAAAyAADoNwAA6DcAAAAzAADoOAAA6DgAAAA0AADoOQAA6DkAAAA1AADoOgAA6DoAAAA2AADoOwAA6DsAAAA3AADoPAAA6DwAAAA4AADoPQAA6D0AAAA5AADoPgAA6D4AAAA6AADoPwAA6D8AAAA7AADoQAAA6EAAAAA8AADoQQAA6EEAAAA9AADoQgAA6EIAAAA+AADoQwAA6EMAAAA/AADoRAAA6EQAAABAAADoRQAA6EUAAABBAADoRgAA6EYAAABCAADoRwAA6EcAAABDAADoSAAA6EgAAABEAADoSQAA6EkAAABFAADoSgAA6EoAAABGAADoSwAA6EsAAABHAADoTAAA6EwAAABIAADoTQAA6E0AAABJAADoTgAA6E4AAABKAADoTwAA6E8AAABLAADoUAAA6FAAAABMAADoUQAA6FEAAABNAADoUgAA6FIAAABOAADoUwAA6FMAAABPAADoVAAA6FQAAABQAADoVQAA6FUAAABRAADoVgAA6FYAAABSAADoVwAA6FcAAABTAADoWAAA6FgAAABUAADoWQAA6FkAAABVAADoWgAA6FoAAABWAADoWwAA6FsAAABXAADoXAAA6FwAAABYAADoXQAA6F0AAABZAADoXgAA6F4AAABaAADoXwAA6F8AAABbAADoYAAA6GAAAABcAADoYQAA6GEAAABdAADoYgAA6GIAAABeAADoYwAA6GMAAABfAADoZAAA6GQAAABg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EAgEAwICAQQEAwQFDAUNBAUEBQgFJgQJBAQEBAQEAQQDAQMBAwQECAQJBAICAQIGAwQF/kQEBQQGAgIBAgMDBQQBBA0JAQ0BBAUFBAEEBQUKBRkBBAEUBgUFBQsKCQUEBAMEAQIDAwQHEwUEBQUEBQUEJR4IBAQJDAMNAhIFBAUDARQEBAkIFiwFBQQFBQUEBRsEBgQBAQIDAwQEBAkDBgULBQUFBhQBHgUKBQUEAQQBBAUcDQQBBAUDAgECAgMECAH6/sgBODFaPrq6fQHyAQEBAQcCAgQDBAQECQQFBgMCCQIBAQEBAQECBQECAwMIBAUECQMDAwcBAQEBUwECAgQHCQkKAQkHBgcDBAMEAwQHCAcUBA0EBCADAwICAgIDAwgJBQYFBQQBBAEEBRwNBAEIBAEEBAQIAQMBAwEDBAgDAQMEAwEGBAcIAQQEAQMEAwEDDAMBAwEDAQgEBAQBBAQEAQQNFwUFBAEEAQkFCgUMBAUEBAMEAQIFBwweCAQJBBQHCAcEAwQDBAMHBgQDBwUEBAkEBAMEAQICBQwFCQQDBgIBAQEBAQICBwICAwICAgECAwMIBQkIAwUCAQIBAgECAgIJAgEBAScCAwUCBAECDwMCAQIJDAkBCQQDAwEDAwEDCwcHCQkEAwQEAQEEAwwDBAYDAwIDAwMDAwMCAwMCAwIDAgMCAwQDFgMDCAkJBwMEOwECAwMEDQULAgMDAwMDAwIDAwojAwcDBwQOCwMHAwgDAwIBAQMCBAgJBAIECQQEBAQEBQMBAwEDBAEDEAQDAQMIAwEKAQMDAQMDAQMDAQYECQEDAgMDqQEEBAMECAQECQUECQ0EGwUNCQQECQQBBCIEBQEEBAMDAgECAgMECAkFBBIECwQHBAQHBAgEHgQIBAcEBAcEBAkEBAQDBC0BBAgEBAQEHgUKBQUFBQkFJwUEBQkKBDIEBQQIBAYCAgYICgUZAQQBFAYFBQULBiYFBgULBgsGFgYJCAMDBBACBggICQYRBQYFBgsFIQYLBQUKBg8BBAEZBQoBBAYCAQEDAgQICQgBKQQFBQQFBQkFIgUJBQUFBQoFFwUEBwICOQECAwMIBwQHBBoDCwsHBgQDBxQPAwcBCAUEBQgDAwICAgIHAQMVAQMLAQcQBAQMBAQEBAQECQQmBQUIBAQDBKABBAMDBAkJCQYBDAEGDAYFAwMCAQQBBAECBQQCAgEBAQQBAQEGAQEBAgEBAgMHBQQFBAgDAwkCAQYDEAMGAwIDAgMCAwIDBgIDAwMDAwdKAQIBAwYMAwMFAwIBAQEEAwMECQUECAMDAgEBAQECCQICAgECAQIBAQECAgIBAQEEAQEBBQQDBQQFCAgDAgEnAQEDBgQJBQQEBAIFAwQJAQYJAwIBAgMCAQIDBAMKAggBAgECAgMBAgMDCAUECQQDAwMEAgECAQIBAgEQEAYCAwUJAwoBAgICDwIDBQYMFAECAQIBAgECBgIGCQQFBAQEAwMCAQEBAgICAQIBCAwDBAMCAQIDAgECEgEJBAMFBAQEBQkEAwMEAAAABQAA/5YDvQMjABYAMQA6AD4ARAAAASYOAxYXHgI3PgE3Njc2Jy4BJyYHNhcWFxYXFgYHBgcGBwYnJicmJyYnJjc+AhMGDwEXNRcRBycUFSclFBUnJicB9FimgUQBQD07obBRVIYnKQMGHh52Tl5rVlJQOjsXFxcrLERGWlhWWENDJyYDAyMecpQ/Nmwv0crKGI8BWSpDIgMiAUZ+obOmPj9JCR4delFTWFdVU4cmLzEBJiVDRFRPp0hKLzQQDxYWOTZQT1daTklwPv8AJk0hlI+PASiPYGRlZGVlZR4wFwAJAAD/ogO4AyAACwAXAFIAuwFEAaEB6AIyAp4AAAEVIxUzFTM1MzUjNQczFTMVIxUjNSM1MxMrAQcjByMHFQ8FFR8FMz8DMzczNzM3MxczFzMXMx8BMz8DNS8EIzUjJyMnFw8GFR8KMx8GFR8CMx8NMz8ENS8BNScjLwYjLwE1Iy8LIy8BIy8HIzUnNS8EIwUPASMPBBUPBBUHIwcVDwMjFQcVByMVDwQVByMPARUPAhUPAiMPAxUPAxUHFQ8KFQcVHwQ/BDM/BDU/JjUvAwEPBRUXFQcVBxUHFQcVBxUHFQcVBxUHFQcVBxUPBxUfBD8FMz8BMz8BNT8BMzczNzU3NTM1NzU3NTc1NzU3NTc1NzU3NSc1LwQFDwUVFxUXFRczHwUzHwEVFxUXFRcVMxcVFxUfBD8ENS8NNSc1JzUnNS8DAQ8XHwQ/BDM/AzM3MzczNzM3Mzc1NzM3NTczPwIzNzM1PwM1LwQFDwUVHwMVHwEzHwIzHwIVHwEzHwEVHwEzFzMXMxczHwIzFzMXFTMfBzMXFRczFTMXMz8ENS8EIycjJyMnIy8KIy8EIy8FIwGufX2MfX11Xn19Xn19MwcNBg0NBycNDgQDAwQBAgMDCQQFBgwGFwYLBgYGBikGBgYGBgUfBAUMAwMCAgYDCicGBwYNB+kFBAQDAwECAgIGAgIDBgUEAwgBDgIIAgYCBAECAgECAwIDBQQDBAMKBQYDCQQJBAQDBAIEBgEEAwIDAgMCAQIIAQUDBAIEAgIFAgcCAgECCQECAgMHAwIDAgECAwIGAgoF/fMFBwECAwIDAgMCAwIDBAECAgMCBAEEBAECAgICAgIBAgICBAICBAEBAQIDAgIKAQICAgEEAQIBAgECAQICAQQEAw4ECAQDAQECAwECAgIBAgECAQIBAgIDAgECCAIBAgICAQQCBAEGAgoCBgMKAwYDBQMCAQQGCAUCsgQFAwYCAQEBAQEBAQECAQMFAwUDBAMCBgMBAgMGBAkJBAQDAgEBAwIBAgMDAgEFAQwDAQIBAQEBAQEBAQQDBAQI/KYEBQMEBAEBAwIBAwIBBAEKAQQDAgMCAQIDAQIEBwkJBAQDBAIEAgMCBwQBBgECAQIIAQEBAQUICAKxBAQJBAUKBA8FBQsPBgULBSEGCxAIBAUCAgQDBA0JBgYUBQESBgcFAQUBBQEFARwBCwUBBQUBBQsPAQQBAwMCAQQDBAQI/d4EBAQDAgIBAgMEDQIBAgMCAQIDAwsCAQgDAwUBAgECAQIBAgMDAQIBAgECBAMGAw0DHQIDDQQDDQkFCAUCAQQDBAQDBAgDFAIRAwkFEQIGBQMFBQUCAQ8CBQICAQQDBBEEBAUCIX2MfX2MfRd9Xn1+XQGTAQIGAQIEAgMECAkFBAQDBAECAgIEAgEBAQEBBQEGBAMJBQgIAgQGAQEBTwEBAwMEBAQFCQQGAQIBBgMEAggOAwgDBgMEAQICAwQDBAMHBwMIAxIKCAIEAgIDAwgKBwcBDAgEBAQEBAQECwEHAwYCBgIDBQMHAwIDCQMCAgcCAgICAQEBAgIEAgUMAQQCAgICAgECAgICAgEEAgECAgMEAQQBBAECAwIDAgECAwIBAgYCAQIGAwMCBQIBAg8DAgECAQIDBgMDAwMDAwMDAQQJBQgDAwMBBAMDBAYFAwIFAQIDAgMCAwIDAwIFAgMCDAIDAgMCAwQDBAMGAwoDBgIKAQYCBQQEBAkJBgQB/sYBAgIIBAQEBDMDCQMG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BAQDBAEEAwcBAwUEBAQEBAkEJgQJBQQEBQ2xBQMGBwEDCAMBFQMBAwMBCQEMAQkJAwMCAQIDAwgEAQQCAgIDAwgEBQQJAwgDAgQDAgMCAwIDAgMDAwIDAwMDAwMDAwYDIwIDBAQCAgUECAUBhAQEBAMDAwEGAwMCAwIDAgMCAwcWAQQBBAEGAwICBAQDBAUJBAQEAwQBAgICAQIBAgECAgIBAQEIAQEBAgIEAQIHAwIBAgMCAQIGAwkDAwMECf3HBAgDAwICAQIBAQEBAQECAQgCAQEBAwMEBAQFCQQDAwQBAgUDAgEBAQEBAQIBAQIDAwkEAo0FBAQDBAICBwIDBQIEAQIDDAoDBAIEAQEEAwQECQgFBwMPAgEGBQgBAQEGAQIBAgECAgIJAQICAwQIBf2uBAQEAwICAgUGDAYBDAEGBwMBAwMBBwcDAQcHAQMBAwQIBAQMBAQEBAkEBAQFAgEBBAQDFQMECgcZAwoCAwMDAwMDAwIGAwIDAgMCCA4BpQQEAQcKHAsHEgQLBAcEBAcECAQQCAQDAgIBBAQDBAURDQQFBAUIBSYECQQEBAQEBAEEAwEDAQMEBAgECQQCAgECBgMEBQSnBQYGCwUMBQUGJgYKCAQCAwEBAgYECQQrBQkFBQUFCgUeBQoFBQUFCgQYCQUEAwQEAQEEAwQHJgUGBQsGCwbvBAUDBAQCAggCDAcIBwQDBAMEAwcGBw8CCQIDEQQDBAkJBAQDBAECAwIBAgMCAQISAQkEBgEDBAMBAwgEAwEDAQMBCAQEBAEECAEECgj99AQIBQQBBAQEDAQEBAgDAQMEAwQDBAkBDwIBAgMDBQIBBAMDAQIDAwgECQUHBQUQBgIGAg8HBgcDBAMEAwQHCAQEBwIBAgIDBAgEAq8ECAYCAQEBAQECCAIBAgIEARYBAQQDDAUJBAYFBAMKAggBAgECAgIHAQEBAQEEAwQIBPymBAQIBAIBAQECBgICAgEEAQYCCgMEAQMGBAUJBAQEAwQCARIBAgECAQICAgcCAQEBAQIHAwUElAUEBgICAQIDAwUEAQQNCQENAQQFBQQBBAUFCgUZAQQBFAYFBQULCgkFBAQDBAECAwMEBxMFBAUFBAUFBCUeCAQECQwDDQ0CGgQFAwEUBAQJCBYsBQUEBQUFBAUbBAYEAQECAwMEBAQJAwYFCwUFBQYUAR4FCgUFBAEEAQQFHA0EAQQFAwIBAgIDBAgEAjQBSzs5gFkeFRVtQD5xGhUnASI9SUw/KAcaOE1RISUsMhIjNgEPEQMDAQYZIkQI7QECAgUMBQkEAwYCAQEBAQECAgcCAgMCAgIBAgMDCAUJCAMFAgECAQIBAgICCQIBAQEnAQEDBQIEAQIPAwIBAgkMCQEJBAMDAQMDAQMLBwcJCQQDBAQBAQQDDAMEBgMDAgMDAwMDAwIDAwIDAgMCAwIDBAMWAwMICQkHAwQ8AQEDAwQNBQsCAwMDAwMDAgMDCiMDBwMHBA4LAwcDCAMDAgEBAwIECAkEAgQJBAQEBAQFAwEDAQMEAQMQBAMBAwgDAQoBAwMBAwMBAwMBBgQJAQMCAwMCqwEEBAMECAQECQUECQ0EGwUNCQQECQQBBCIEBQEEBAMDAgECAgMECAkFBBIECwQHBAQHBAgEHgQIBAcEBAcEBAkEBAQDBAF3AQIDAwgHBAcEGgMLCwcGBAMHFA8DBwEIBQQFCAMDAgICAgcBAxUBAwsBBxAEBAwEBAQEBAQJBCYFBQgEBAMEoQICAwMECQkJBgEMAQYMBgUDAwIBBAEEAQIFBAICAQEBBAEBAQYBAQECAQECAwcFBAUECAMDCQIBBgMQAwYDAgMCAwIDAgMGAgMDAwMDBwNNAQIBAwYMAwMFAwIBAQEEAwMECQUECAMDAgEBAQECCQICAgECAQIBAQECAgIBAQEEAQEBBQQDBQQFCAgDAgECzgEBAQEHAgIEAwQEBAkEBQYDAgkCAQEBAQEBAgUBAgMDCAQFBAkDAwMHAQEBAVMBAgIEBwkJCgEJBwYHAwQDBAMEBwgHFAQNBAQgAwMCAgICAwMICQUGBQUEAQQBBAUcDQQBCAQBBAQECAEDAQMBAwQIAwEDBAMBBgQHAgoBBAQBAwQDAQMMAwEDAQMBCAQEBAEEBAQBBA0XBQUEAQQBCQUKBQwEBQQEAwQBAgUHDB4IBAkEFAcIBwQDBAMEAwcGBAMHBQQECQQEAwT+xQEECAQEBAQeBQoFBQUFCQUnBQQFCQoEMgQFBAgEBgICBggKBRkBBAEUBgUFBQsGJgUGBQsGCwYWBgkIAwMEEAEBBggICQYRBQYFBgsFIQYLBQUKBg8BBAEZBQoBBAYCAQEDAgQICQgBKQQFBQQFBQkFIgUJBQUFBQoFFwUEBwIC/rIBAwYE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AQQDBwEDBQQEBAQECQQmBAkFBAQFDa0ECAYHAQMIAwEVAwEDAwEJAQwBCQkDAwIBAgMDCAQBBAICAgMDCAQFBAkDCAMCBAMCAwIDAgMCAwMDAgMDAwMDAwMDBgMjAgMEBAICBQQIAYQFCAQDAwMBBgMDAgMCAwIDAgMHFgEEAQQBBgMCAgQEAwQFCQQEBAMEAQICAgECAQIBAgICAQEBCAEBAQICBAECBwMCAQIDAgECBgMJAwMDBP3DBQQIAwMCAgECAQEBAQEBAgEIAgEBAQMDBAQEBQkEAwMEAQIFAwIBAQEBAQECAQECAwMJAu4FBAgGAgEBAQEBAggCAQICBAEWAQEEAwwFCQQGBQQDCgIIAQIBAgICBwEBAQEBBAMECPynBQgIBAIBAQECBgICAgEEAQYCCgMEAQMGBAUJBAQEAwQCARIBAgECAQICAgcCAQEBAQIHAwUC8AQFBAQDBAICBwIDBQIEAQIDDAoDBAIEAQEEAwQECQgFBwMPAgEGBQgBAQEGAQIBAgECAgIJAQICAwQI/a0ECAQDAgICBQYMBgEMAQYHAwEDAwEHBwMBBwcBAwEDBAgEBAwEBAQECQQEBAUCAQEEBAMVAwQKBxkDCgIDAwMDAwMDAgYDAgMCAwIIAZwFBAQBBwocCwcSBAsEBwQEBwQIBBAIBAMCAgEEBAMEBQwFDQQFBAUIBSYECQQEBAQEBAEEAwEDAQMEBAgECQQCAgECBgMEBf5EBAUEBgICAQIDAwUEAQQNCQENAQQFBQQBBAUFCgUZAQQBFAYFBQULCgkFBAQDBAECAwMEBxMFBAUFBAUFBCUeCAQECQwDDQISBQQFAwEUBAQJCBYsBQUEBQUFBAUbBAYEAQECAwMEBAQJAwYFCwUFBQYUAR4FCgUFBAEEAQQFHA0EAQQFAwIBAgIDBAgCIX2MfX2MfRd9Xn1+XQGVAQEBAQcCAgQDBAQECQQFBgMCCQIBAQEBAQECBQECAwMIBAUECQMDAwcBAQEBUwECAgQHCQkKAQkHBgcDBAMEAwQHCAcUBA0EBCADAwICAgIDAwgJBQYFBQQBBAEEBRwNBAEIBAEEBAQIAQMBAwEDBAgDAQMEAwEGBAcIAQQEAQMEAwEDDAMBAwEDAQgEBAQBBAQEAQQNFwUFBAEEAQkFCgUMBAUEBAMEAQIFBwweCAQJBBQHCAcEAwQD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AwIBAgMDAgEFAQwDAQIBAQEBAQEBAQQDBAQI/KYEBQMEBAEBAwIBAwIBBAEKAQQDAgMCAQIDAQIEBwkJBAQDBAIEAgMCBwQBBgECAQIIAQEBAQUICAKxBAQJBAUKBA8FBQsPBgULBSEGCxAIBAUCAgQDBA0JBgYUBQESBgcFAQUBBQEFARwBCwUBBQUBBQsPAQQBAwMCAQQDBAQI/d4EBAQDAgIBAgMEDQIBAgMCAQIDAwsCAQgDAwUBAgECAQIBAgMDAQIBAgECBAMGAw0DHQIDDQQDDQkFCAUCAQQDBAQDBAgDFAIRAwkFEQIGBQMFBQUCAQ8CBQICAQQDBBEEBAUCNAFLOzmAWR4VFW1APnEaFScBIj1JTD8oBxo4TVEhJSwyEiM2AQ8RAwMBBhkiRAgBSAECBgECBAIDBAgJBQQEAwQBAgICBAIBAQEBAQUBBgQDCQUICAIEBgEBAU8BAQMDBAQEBQkEBgECAQYDBAIIDgMIAwYDBAECAgMEAwQDBwcDCAMSCggCBAICAwMICgcHAQwIBAQEBAQEBAsBBwMGAgYCAwUDBwMCAwkDAgIHAgICAgEBAQICBAIFDAEEAgICAgIBAgICAgIBBAIBAgIDBAEEAQQBAgMCAwIBAgMCAQIGAgECBgMDAgUCAQIPAwIBAgECAwYDAwMDAwMDAwEECQUIAwMDAQQDAwQGBQMCBQECAwIDAgMCAwMCBQIDAgwCAwIDAgMEAwQDBgMKAwYCCgEGAgUEBAQJCQYEAf7GAQICCAQEBAQzAwkDBgIGAwMDAwMDBgIDAwkCDgMIAQ0FCwUGCgcEBQkEBgICAgIDAwMDBgYGBQEFBw8mAwoDAwcDAwQDAwQDAwQDBwMOAywFCQgEAgMCEwECAwMIBBsGBxMHDRMGBw0GHw0FAQUBBQEFAQUBBQEBBAQEAgICAwMJCQgGBgUGEAsGEQUGBgUvBgUGBgwGBwUHBgL+sgECBgQEBgQJBAMFCQIDBAMMAQQDBAMHCQkIAwMDAgIBBgIGAwIDAgMDDwYBAwMBAwQHDAQBAwQEBAkIBAMCAgIBAwIEBAkEBQQEAwEKAgICAgICAQEHAgUBAQEDAgIBAgECAQEBAQECAgIEAgkBAQQBBAEEBwUECQgEAgMBAwcGAwMGAgIDAQMCAwIJAgMCAQQBBA0BAgAAAwAAAAADIAJYAAMABwAL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BAMIAQ4CCAIGAgQBAgIBAgMCAwUEAwQDCgUGAwkECQQEAwQCBAYBBAMCAwIDAgECCAEFAwQCBAICBQIHAgIBAgkBAgIDBwMCAwIBAgMCBgIKBf3zBQcBAgMCAwIDAgMCAwQBAgIDAgQBBAQBAgICAgICAQICAgQCAgQBAQECAwICCgECAgIBBAECAQIBAgECAgEEBAMOBAgEAwEBAgMBAgICAQIBAgECAQICAwIBAggCAQICAgEEAgQBBgIKAgYDCgMGAwUDAgEEBggFArIEBQMGAgEBAQEBAQEBAgEDBQMFAwQDAgYDAQIDBgQJCQQEAwIBAQMCAQIDAwIBBQEMAwECAQEBAQEBAQEEAwQECPymBAUDBAQBAQMCAQMCAQQBCgEEAwIDAgECAwECBAcJCQQEAwQCBAIDAgcEAQYBAgECCAEBAQEFCAgCsQQECQQFCgQPBQULDwYFCwUhBgsQCAQFAgIEAwQNCQYGFAUBEgYHBQEFAQUBBQEcAQsFAQUFAQULDwEEAQMDAgEEAwQECP3eBAQEAwICAQIDBA0CAQIDAgECAwMLAgEIAwMFAQIBAgECAQIDAwECAQIBAgQDBgMNAx0CAw0EAw0JBQgFAgEEAwQEAwQIAxQCEQMJBRECBgUDBQUFAgEPAgUCAgEEAwQRBAQFAhwM/pABfBj+tAEnGRlKGBhVGBhNGBgCLQECBgECBAIDBAgJBQQEAwQBAgICBAIBAQEBAQUBBgQDCQUICAIEBgEBAU8BAQMDBAQEBQkEBgECAQYDBAIIDgMIAwYDBAECAgMEAwQDBwcDCAMSCggCBAICAwMICgcHAQwIBAQEBAQEBAsBBwMGAgYCAwUDBwMCAwkDAgIHAgICAgEBAQICBAIFDAEEAgICAgIBAgICAgIBBAIBAgIDBAEEAQQBAgMCAwIBAgMCAQIGAgECBgMDAgUCAQIPAwIBAgECAwYDAwMDAwMDAwEECQUIAwMDAQQDAwQGBQMCBQECAwIDAgMCAwMCBQIDAgwCAwIDAgMEAwQDBgMKAwYCCgEGAgUEBAQJCQYEAf7GAQICCAQEBAQzAwkDBgIGAwMDAwMDBgIDAwkCDgMIAQ0FCwUGCgcEBQkEBgICAgIDAwMDBgYGBQEFBw8mAwoDAwcDAwQDAwQDAwQDBwMOAywFCQgEAgMCEwECAwMIBBsGBxMHDRMGBw0G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BAECBwMCAQIDAgECBgMJAwMDBP3DBQQIAwMCAgECAQEBAQEBAgEIAgEBAQMDBAQEBQkEAwMEAQIFAwIBAQEBAQECAQECAwMJAu4FBAgGAgEBAQEBAggCAQICBAEWAQEEAwwFCQQGBQQDCgIIAQIBAgICBwEBAQEBBAMECPynBQgIBAIBAQECBgICAgEEAQYCCgMEAQMGBAUJBAQEAwQCARIBAgECAQICAgcCAQEBAQIHAwUC8AQFBAQDBAICBwIDBQIEAQIDDAoDBAIEAQEEAwQECQgFBwMPAgEGBQgBAQEGAQIBAgECAgIJAQICAwQI/a0ECAQDAgICBQYMBgEMAQYHAwEDAwEHBwMBBwcBAwEDBAgEBAwEBAQECQQEBAUCAQEEBAMVAwQKBxkDCgIDAwMDAwMDAgYDAgMCAwIIAZwFBAQBBwocCwcSBAsEBwQEBwQIBBAIBAMCAgEEBAMEBQwFDQQFBAUIBSYECQQEBAQEBAEEAwEDAQMEBAgECQQCAgECBgMEBf5EBAUEBgICAQIDAwUEAQQNCQENAQQFBQQBBAUFCgUZAQQBFAYFBQULCgkFBAQDBAECAwMEBxMFBAUFBAUFBCUeCAQECQwDDQISBQQFAwEUBAQJCBYsBQUEBQUFBAUbBAYEAQECAwMEBAQJAwYFCwUFBQYUAR4FCgUFBAEEAQQFHA0EAQQFAwIBAgIDBAgCHAz+kAF8GP60AScZGUoYGFUYGE0YGAIvAQEBAQcCAgQDBAQECQQFBgMCCQIBAQEBAQECBQECAwMIBAUECQMDAwcBAQEBUwECAgQHCQkKAQkHBgcDBAMEAwQHCAcUBA0EBCADAwICAgIDAwgJBQYFBQQBBAEEBRwNBAEIBAEEBAQIAQMBAwEDBAgDAQMEAwEGBAcIAQQEAQMEAwEDDAMBAwEDAQgEBAQBBAQEAQQNFwUFBAEEAQkFCgUMBAUEBAMEAQIFBwweCAQJBBQHCAcEAwQDBAMHBgQDBwUEBAkEBAMEAQICBQwFCQQDBgIBAQEBAQICBwICAwICAgECAwMIBQkIAwUCAQIBAgECAgIJAgEBAScCAwUCBAECDwMCAQIJDAkBCQQDAwEDAwEDCwcHCQkEAwQEAQEEAwwDBAYDAwIDAwMDAwMCAwMCAwIDAgMCAwQDFgMDCAkJBwMEOwECAwMEDQULAgMDAwMDAwID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bwBtACAARgBvAG4AdABlAGwAbABvACAAcAByAG8AagBlAGMAdAAuAGgAdAB0AHAAOgAvAC8AZgBvAG4AdABlAGwAbABvAC4AYwBvAG0AAAAAAgAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsAQIBAwEEAQUBBgEHAQgBCQEKAQsBDAENAQ4BDwEQAREBEgETARQBFQEWARcBGAEZARoBGwEcAR0BHgEfASABIQEiASMBJAElASYBJwEoASkBKgErASwBLQEuAS8BMAExATIBMwE0ATUBNgE3ATgBOQE6ATsBPAE9AT4BPwFAAUEBQgFDAUQBRQFGAUcBSAFJAUoBSwFMAU0BTgFPAVABUQFSAVMBVAFVAVYBVwFYAVkBWgFbAVwBXQFeAV8BYAFhAWIBYwFkAWUBZgFnAWgBaQFqAWsBbAFtAAV0cmFzaBBnYXRld2F5LXBhcmFsbGVsH2ludGVybWVkaWF0ZS1ldmVudC1jYXRjaC1jYW5jZWwxaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLW5vbi1pbnRlcnJ1cHRpbmctbWVzc2FnZRhzdGFydC1ldmVudC1jb21wZW5zYXRpb24uc3RhcnQtZXZlbnQtbm9uLWludGVycnVwdGluZy1wYXJhbGxlbC1tdWx0aXBsZQtsb29wLW1hcmtlchJwYXJhbGxlbC1taS1tYXJrZXIjc3RhcnQtZXZlbnQtbm9uLWludGVycnVwdGluZy1zaWduYWwvaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLW5vbi1pbnRlcnJ1cHRpbmctdGltZXIqaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLXBhcmFsbGVsLW11bHRpcGxlJWludGVybWVkaWF0ZS1ldmVudC1jYXRjaC1jb21wZW5zYXRpb24LZ2F0ZXdheS14b3IQZW5kLWV2ZW50LWNhbmNlbCJpbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtY29uZGl0aW9uO2ludGVybWVkaWF0ZS1ldmVudC1jYXRjaC1ub24taW50ZXJydXB0aW5nLXBhcmFsbGVsLW11bHRpcGxlFXN0YXJ0LWV2ZW50LWNvbmRpdGlvbiJzdGFydC1ldmVudC1ub24taW50ZXJydXB0aW5nLXRpbWVyFHNlcXVlbnRpYWwtbWktbWFya2VyCXVzZXItdGFzaw1idXNpbmVzcy1ydWxlEnN1Yi1wcm9jZXNzLW1hcmtlch1zdGFydC1ldmVudC1wYXJhbGxlbC1tdWx0aXBsZRFzdGFydC1ldmVudC1lcnJvch9pbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtc2lnbmFsHmludGVybWVkaWF0ZS1ldmVudC1jYXRjaC1lcnJvchZlbmQtZXZlbnQtY29tcGVuc2F0aW9uFHN1YnByb2Nlc3MtY29sbGFwc2VkE3N1YnByb2Nlc3MtZXhwYW5kZWQEdGFzaw9lbmQtZXZlbnQtZXJyb3IjaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLWVzY2FsYXRpb24eaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLXRpbWVyFnN0YXJ0LWV2ZW50LWVzY2FsYXRpb24Sc3RhcnQtZXZlbnQtc2lnbmFsEmJ1c2luZXNzLXJ1bGUtdGFzawZtYW51YWwHcmVjZWl2ZQ1jYWxsLWFjdGl2aXR5EXN0YXJ0LWV2ZW50LXRpbWVyE3N0YXJ0LWV2ZW50LW1lc3NhZ2UXaW50ZXJtZWRpYXRlLWV2ZW50LW5vbmUdaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLWxpbmsUZW5kLWV2ZW50LWVzY2FsYXRpb24HYnBtbi1pbw9nYXRld2F5LWNvbXBsZXgSZ2F0ZXdheS1ldmVudGJhc2VkDGdhdGV3YXktbm9uZQpnYXRld2F5LW9yE2VuZC1ldmVudC10ZXJtaW5hdGUQZW5kLWV2ZW50LXNpZ25hbA5lbmQtZXZlbnQtbm9uZRJlbmQtZXZlbnQtbXVsdGlwbGURZW5kLWV2ZW50LW1lc3NhZ2UOZW5kLWV2ZW50LWxpbmsgaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLW1lc3NhZ2UlaW50ZXJtZWRpYXRlLWV2ZW50LXRocm93LWNvbXBlbnNhdGlvbhRzdGFydC1ldmVudC1tdWx0aXBsZQZzY3JpcHQLbWFudWFsLXRhc2sEc2VuZAdzZXJ2aWNlDHJlY2VpdmUtdGFzawR1c2VyEHN0YXJ0LWV2ZW50LW5vbmUjaW50ZXJtZWRpYXRlLWV2ZW50LXRocm93LWVzY2FsYXRpb24haW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLW11bHRpcGxlNGludGVybWVkaWF0ZS1ldmVudC1jYXRjaC1ub24taW50ZXJydXB0aW5nLWVzY2FsYXRpb24daW50ZXJtZWRpYXRlLWV2ZW50LXRocm93LWxpbmsmc3RhcnQtZXZlbnQtbm9uLWludGVycnVwdGluZy1jb25kaXRpb24LZGF0YS1vYmplY3QLc2NyaXB0LXRhc2sJc2VuZC10YXNrCmRhdGEtc3RvcmUnc3RhcnQtZXZlbnQtbm9uLWludGVycnVwdGluZy1lc2NhbGF0aW9uIGludGVybWVkaWF0ZS1ldmVudC10aHJvdy1tZXNzYWdlMmludGVybWVkaWF0ZS1ldmVudC1jYXRjaC1ub24taW50ZXJydXB0aW5nLW11bHRpcGxlMGludGVybWVkaWF0ZS1ldmVudC1jYXRjaC1ub24taW50ZXJydXB0aW5nLXNpZ25hbCFpbnRlcm1lZGlhdGUtZXZlbnQtdGhyb3ctbXVsdGlwbGUkc3RhcnQtZXZlbnQtbm9uLWludGVycnVwdGluZy1tZXNzYWdlDWFkLWhvYy1tYXJrZXIMc2VydmljZS10YXNrCXRhc2stbm9uZRNjb21wZW5zYXRpb24tbWFya2VyJXN0YXJ0LWV2ZW50LW5vbi1pbnRlcnJ1cHRpbmctbXVsdGlwbGUfaW50ZXJtZWRpYXRlLWV2ZW50LXRocm93LXNpZ25hbDNpbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtbm9uLWludGVycnVwdGluZy1jb25kaXRpb24LcGFydGljaXBhbnQZZXZlbnQtc3VicHJvY2Vzcy1leHBhbmRlZBFsYW5lLWluc2VydC1iZWxvdwpzcGFjZS10b29sEGNvbm5lY3Rpb24tbXVsdGkEbGFuZQpsYXNzby10b29sEWxhbmUtaW5zZXJ0LWFib3ZlEWxhbmUtZGl2aWRlLXRocmVlD2xhbmUtZGl2aWRlLXR3bwpkYXRhLWlucHV0C2RhdGEtb3V0cHV0CWhhbmQtdG9vbAVncm91cA90ZXh0LWFubm90YXRpb24LdHJhbnNhY3Rpb24Mc2NyZXctd3JlbmNoCmNvbm5lY3Rpb24QY29uZGl0aW9uYWwtZmxvdwxkZWZhdWx0LWZsb3cAAA==') format('truetype');\n}\n/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */\n/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */\n/*\n@media screen and (-webkit-min-device-pixel-ratio:0) {\n  @font-face {\n    font-family: 'bpmn';\n    src: url('../font/bpmn.svg?16406289#bpmn') format('svg');\n  }\n}\n*/\n\n[class^=\"bpmn-icon-\"]:before, [class*=\" bpmn-icon-\"]:before {\n  font-family: \"bpmn\";\n  font-style: normal;\n  font-weight: normal;\n  speak: never;\n\n  display: inline-block;\n  text-decoration: inherit;\n  width: 1em;\n  /* margin-right: .2em; */\n  text-align: center;\n  /* opacity: .8; */\n\n  /* For safety - reset parent styles, that can break glyph codes*/\n  font-variant: normal;\n  text-transform: none;\n\n  /* fix buttons height, for twitter bootstrap */\n  line-height: 1em;\n\n  /* Animation center compensation - margins should be symmetric */\n  /* remove if not needed */\n  /* margin-left: .2em; */\n\n  /* you can be more comfortable with increased icons size */\n  /* font-size: 120%; */\n  \n  /* Font smoothing. That was taken from TWBS */\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n\n  /* Uncomment for 3D effect */\n  /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */\n}\n\n.bpmn-icon-trash:before { content: '\\e801'; } /* '' */\n.bpmn-icon-gateway-parallel:before { content: '\\e804'; } /* '' */\n.bpmn-icon-intermediate-event-catch-cancel:before { content: '\\e805'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-message:before { content: '\\e806'; } /* '' */\n.bpmn-icon-start-event-compensation:before { content: '\\e807'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-parallel-multiple:before { content: '\\e808'; } /* '' */\n.bpmn-icon-loop-marker:before { content: '\\e809'; } /* '' */\n.bpmn-icon-parallel-mi-marker:before { content: '\\e80a'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-signal:before { content: '\\e80b'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-timer:before { content: '\\e80c'; } /* '' */\n.bpmn-icon-intermediate-event-catch-parallel-multiple:before { content: '\\e80d'; } /* '' */\n.bpmn-icon-intermediate-event-catch-compensation:before { content: '\\e80e'; } /* '' */\n.bpmn-icon-gateway-xor:before { content: '\\e80f'; } /* '' */\n.bpmn-icon-end-event-cancel:before { content: '\\e811'; } /* '' */\n.bpmn-icon-intermediate-event-catch-condition:before { content: '\\e812'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-parallel-multiple:before { content: '\\e813'; } /* '' */\n.bpmn-icon-start-event-condition:before { content: '\\e814'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-timer:before { content: '\\e815'; } /* '' */\n.bpmn-icon-sequential-mi-marker:before { content: '\\e816'; } /* '' */\n.bpmn-icon-user-task:before { content: '\\e817'; } /* '' */\n.bpmn-icon-business-rule:before { content: '\\e818'; } /* '' */\n.bpmn-icon-sub-process-marker:before { content: '\\e819'; } /* '' */\n.bpmn-icon-start-event-parallel-multiple:before { content: '\\e81a'; } /* '' */\n.bpmn-icon-start-event-error:before { content: '\\e81b'; } /* '' */\n.bpmn-icon-intermediate-event-catch-signal:before { content: '\\e81c'; } /* '' */\n.bpmn-icon-intermediate-event-catch-error:before { content: '\\e81d'; } /* '' */\n.bpmn-icon-end-event-compensation:before { content: '\\e81e'; } /* '' */\n.bpmn-icon-subprocess-collapsed:before { content: '\\e81f'; } /* '' */\n.bpmn-icon-subprocess-expanded:before { content: '\\e820'; } /* '' */\n.bpmn-icon-task:before { content: '\\e821'; } /* '' */\n.bpmn-icon-end-event-error:before { content: '\\e822'; } /* '' */\n.bpmn-icon-intermediate-event-catch-escalation:before { content: '\\e823'; } /* '' */\n.bpmn-icon-intermediate-event-catch-timer:before { content: '\\e824'; } /* '' */\n.bpmn-icon-start-event-escalation:before { content: '\\e825'; } /* '' */\n.bpmn-icon-start-event-signal:before { content: '\\e826'; } /* '' */\n.bpmn-icon-business-rule-task:before { content: '\\e827'; } /* '' */\n.bpmn-icon-manual:before { content: '\\e828'; } /* '' */\n.bpmn-icon-receive:before { content: '\\e829'; } /* '' */\n.bpmn-icon-call-activity:before { content: '\\e82a'; } /* '' */\n.bpmn-icon-start-event-timer:before { content: '\\e82b'; } /* '' */\n.bpmn-icon-start-event-message:before { content: '\\e82c'; } /* '' */\n.bpmn-icon-intermediate-event-none:before { content: '\\e82d'; } /* '' */\n.bpmn-icon-intermediate-event-catch-link:before { content: '\\e82e'; } /* '' */\n.bpmn-icon-end-event-escalation:before { content: '\\e82f'; } /* '' */\n.bpmn-icon-bpmn-io:before { content: '\\e831'; } /* '' */\n.bpmn-icon-gateway-complex:before { content: '\\e832'; } /* '' */\n.bpmn-icon-gateway-eventbased:before { content: '\\e833'; } /* '' */\n.bpmn-icon-gateway-none:before { content: '\\e834'; } /* '' */\n.bpmn-icon-gateway-or:before { content: '\\e835'; } /* '' */\n.bpmn-icon-end-event-terminate:before { content: '\\e836'; } /* '' */\n.bpmn-icon-end-event-signal:before { content: '\\e837'; } /* '' */\n.bpmn-icon-end-event-none:before { content: '\\e838'; } /* '' */\n.bpmn-icon-end-event-multiple:before { content: '\\e839'; } /* '' */\n.bpmn-icon-end-event-message:before { content: '\\e83a'; } /* '' */\n.bpmn-icon-end-event-link:before { content: '\\e83b'; } /* '' */\n.bpmn-icon-intermediate-event-catch-message:before { content: '\\e83c'; } /* '' */\n.bpmn-icon-intermediate-event-throw-compensation:before { content: '\\e83d'; } /* '' */\n.bpmn-icon-start-event-multiple:before { content: '\\e83e'; } /* '' */\n.bpmn-icon-script:before { content: '\\e83f'; } /* '' */\n.bpmn-icon-manual-task:before { content: '\\e840'; } /* '' */\n.bpmn-icon-send:before { content: '\\e841'; } /* '' */\n.bpmn-icon-service:before { content: '\\e842'; } /* '' */\n.bpmn-icon-receive-task:before { content: '\\e843'; } /* '' */\n.bpmn-icon-user:before { content: '\\e844'; } /* '' */\n.bpmn-icon-start-event-none:before { content: '\\e845'; } /* '' */\n.bpmn-icon-intermediate-event-throw-escalation:before { content: '\\e846'; } /* '' */\n.bpmn-icon-intermediate-event-catch-multiple:before { content: '\\e847'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-escalation:before { content: '\\e848'; } /* '' */\n.bpmn-icon-intermediate-event-throw-link:before { content: '\\e849'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-condition:before { content: '\\e84a'; } /* '' */\n.bpmn-icon-data-object:before { content: '\\e84b'; } /* '' */\n.bpmn-icon-script-task:before { content: '\\e84c'; } /* '' */\n.bpmn-icon-send-task:before { content: '\\e84d'; } /* '' */\n.bpmn-icon-data-store:before { content: '\\e84e'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-escalation:before { content: '\\e84f'; } /* '' */\n.bpmn-icon-intermediate-event-throw-message:before { content: '\\e850'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-multiple:before { content: '\\e851'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-signal:before { content: '\\e852'; } /* '' */\n.bpmn-icon-intermediate-event-throw-multiple:before { content: '\\e853'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-message:before { content: '\\e854'; } /* '' */\n.bpmn-icon-ad-hoc-marker:before { content: '\\e855'; } /* '' */\n.bpmn-icon-service-task:before { content: '\\e856'; } /* '' */\n.bpmn-icon-task-none:before { content: '\\e857'; } /* '' */\n.bpmn-icon-compensation-marker:before { content: '\\e858'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-multiple:before { content: '\\e859'; } /* '' */\n.bpmn-icon-intermediate-event-throw-signal:before { content: '\\e85a'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-condition:before { content: '\\e85b'; } /* '' */\n.bpmn-icon-participant:before { content: '\\e85c'; } /* '' */\n.bpmn-icon-event-subprocess-expanded:before { content: '\\e85d'; } /* '' */\n.bpmn-icon-lane-insert-below:before { content: '\\e85e'; } /* '' */\n.bpmn-icon-space-tool:before { content: '\\e85f'; } /* '' */\n.bpmn-icon-connection-multi:before { content: '\\e860'; } /* '' */\n.bpmn-icon-lane:before { content: '\\e861'; } /* '' */\n.bpmn-icon-lasso-tool:before { content: '\\e862'; } /* '' */\n.bpmn-icon-lane-insert-above:before { content: '\\e863'; } /* '' */\n.bpmn-icon-lane-divide-three:before { content: '\\e864'; } /* '' */\n.bpmn-icon-lane-divide-two:before { content: '\\e865'; } /* '' */\n.bpmn-icon-data-input:before { content: '\\e866'; } /* '' */\n.bpmn-icon-data-output:before { content: '\\e867'; } /* '' */\n.bpmn-icon-hand-tool:before { content: '\\e868'; } /* '' */\n.bpmn-icon-group:before { content: '\\e869'; } /* '' */\n.bpmn-icon-text-annotation:before { content: '\\e86b'; } /* '' */\n.bpmn-icon-transaction:before { content: '\\e8c4'; } /* '' */\n.bpmn-icon-screw-wrench:before { content: '\\e8db'; } /* '' */\n.bpmn-icon-connection:before { content: '\\e8dc'; } /* '' */\n.bpmn-icon-conditional-flow:before { content: '\\e8e0'; } /* '' */\n.bpmn-icon-default-flow:before { content: '\\e8e1'; } /* '' */\n"
  },
  {
    "path": "easyflow-flow-bpmn/static/plugins/bpmnjs/assets/bpmn-font/css/bpmn.css",
    "content": "@font-face {\n  font-family: 'bpmn';\n  src: url('../font/bpmn.eot?21877404');\n  src: url('../font/bpmn.eot?21877404#iefix') format('embedded-opentype'),\n       url('../font/bpmn.woff2?21877404') format('woff2'),\n       url('../font/bpmn.woff?21877404') format('woff'),\n       url('../font/bpmn.ttf?21877404') format('truetype'),\n       url('../font/bpmn.svg?21877404#bpmn') format('svg');\n  font-weight: normal;\n  font-style: normal;\n}\n/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */\n/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */\n/*\n@media screen and (-webkit-min-device-pixel-ratio:0) {\n  @font-face {\n    font-family: 'bpmn';\n    src: url('../font/bpmn.svg?21877404#bpmn') format('svg');\n  }\n}\n*/\n[class^=\"bpmn-icon-\"]:before, [class*=\" bpmn-icon-\"]:before {\n  font-family: \"bpmn\";\n  font-style: normal;\n  font-weight: normal;\n  speak: never;\n\n  display: inline-block;\n  text-decoration: inherit;\n  width: 1em;\n  /* margin-right: .2em; */\n  text-align: center;\n  /* opacity: .8; */\n\n  /* For safety - reset parent styles, that can break glyph codes*/\n  font-variant: normal;\n  text-transform: none;\n\n  /* fix buttons height, for twitter bootstrap */\n  line-height: 1em;\n\n  /* Animation center compensation - margins should be symmetric */\n  /* remove if not needed */\n  /* margin-left: .2em; */\n\n  /* you can be more comfortable with increased icons size */\n  /* font-size: 120%; */\n\n  /* Font smoothing. That was taken from TWBS */\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n\n  /* Uncomment for 3D effect */\n  /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */\n}\n\n.bpmn-icon-trash:before { content: '\\e801'; } /* '' */\n.bpmn-icon-gateway-parallel:before { content: '\\e804'; } /* '' */\n.bpmn-icon-intermediate-event-catch-cancel:before { content: '\\e805'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-message:before { content: '\\e806'; } /* '' */\n.bpmn-icon-start-event-compensation:before { content: '\\e807'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-parallel-multiple:before { content: '\\e808'; } /* '' */\n.bpmn-icon-loop-marker:before { content: '\\e809'; } /* '' */\n.bpmn-icon-parallel-mi-marker:before { content: '\\e80a'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-signal:before { content: '\\e80b'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-timer:before { content: '\\e80c'; } /* '' */\n.bpmn-icon-intermediate-event-catch-parallel-multiple:before { content: '\\e80d'; } /* '' */\n.bpmn-icon-intermediate-event-catch-compensation:before { content: '\\e80e'; } /* '' */\n.bpmn-icon-gateway-xor:before { content: '\\e80f'; } /* '' */\n.bpmn-icon-end-event-cancel:before { content: '\\e811'; } /* '' */\n.bpmn-icon-intermediate-event-catch-condition:before { content: '\\e812'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-parallel-multiple:before { content: '\\e813'; } /* '' */\n.bpmn-icon-start-event-condition:before { content: '\\e814'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-timer:before { content: '\\e815'; } /* '' */\n.bpmn-icon-sequential-mi-marker:before { content: '\\e816'; } /* '' */\n.bpmn-icon-user-task:before { content: '\\e817'; } /* '' */\n.bpmn-icon-business-rule:before { content: '\\e818'; } /* '' */\n.bpmn-icon-sub-process-marker:before { content: '\\e819'; } /* '' */\n.bpmn-icon-start-event-parallel-multiple:before { content: '\\e81a'; } /* '' */\n.bpmn-icon-start-event-error:before { content: '\\e81b'; } /* '' */\n.bpmn-icon-intermediate-event-catch-signal:before { content: '\\e81c'; } /* '' */\n.bpmn-icon-intermediate-event-catch-error:before { content: '\\e81d'; } /* '' */\n.bpmn-icon-end-event-compensation:before { content: '\\e81e'; } /* '' */\n.bpmn-icon-subprocess-collapsed:before { content: '\\e81f'; } /* '' */\n.bpmn-icon-subprocess-expanded:before { content: '\\e820'; } /* '' */\n.bpmn-icon-task:before { content: '\\e821'; } /* '' */\n.bpmn-icon-end-event-error:before { content: '\\e822'; } /* '' */\n.bpmn-icon-intermediate-event-catch-escalation:before { content: '\\e823'; } /* '' */\n.bpmn-icon-intermediate-event-catch-timer:before { content: '\\e824'; } /* '' */\n.bpmn-icon-start-event-escalation:before { content: '\\e825'; } /* '' */\n.bpmn-icon-start-event-signal:before { content: '\\e826'; } /* '' */\n.bpmn-icon-business-rule-task:before { content: '\\e827'; } /* '' */\n.bpmn-icon-manual:before { content: '\\e828'; } /* '' */\n.bpmn-icon-receive:before { content: '\\e829'; } /* '' */\n.bpmn-icon-call-activity:before { content: '\\e82a'; } /* '' */\n.bpmn-icon-start-event-timer:before { content: '\\e82b'; } /* '' */\n.bpmn-icon-start-event-message:before { content: '\\e82c'; } /* '' */\n.bpmn-icon-intermediate-event-none:before { content: '\\e82d'; } /* '' */\n.bpmn-icon-intermediate-event-catch-link:before { content: '\\e82e'; } /* '' */\n.bpmn-icon-end-event-escalation:before { content: '\\e82f'; } /* '' */\n.bpmn-icon-bpmn-io:before { content: '\\e831'; } /* '' */\n.bpmn-icon-gateway-complex:before { content: '\\e832'; } /* '' */\n.bpmn-icon-gateway-eventbased:before { content: '\\e833'; } /* '' */\n.bpmn-icon-gateway-none:before { content: '\\e834'; } /* '' */\n.bpmn-icon-gateway-or:before { content: '\\e835'; } /* '' */\n.bpmn-icon-end-event-terminate:before { content: '\\e836'; } /* '' */\n.bpmn-icon-end-event-signal:before { content: '\\e837'; } /* '' */\n.bpmn-icon-end-event-none:before { content: '\\e838'; } /* '' */\n.bpmn-icon-end-event-multiple:before { content: '\\e839'; } /* '' */\n.bpmn-icon-end-event-message:before { content: '\\e83a'; } /* '' */\n.bpmn-icon-end-event-link:before { content: '\\e83b'; } /* '' */\n.bpmn-icon-intermediate-event-catch-message:before { content: '\\e83c'; } /* '' */\n.bpmn-icon-intermediate-event-throw-compensation:before { content: '\\e83d'; } /* '' */\n.bpmn-icon-start-event-multiple:before { content: '\\e83e'; } /* '' */\n.bpmn-icon-script:before { content: '\\e83f'; } /* '' */\n.bpmn-icon-manual-task:before { content: '\\e840'; } /* '' */\n.bpmn-icon-send:before { content: '\\e841'; } /* '' */\n.bpmn-icon-service:before { content: '\\e842'; } /* '' */\n.bpmn-icon-receive-task:before { content: '\\e843'; } /* '' */\n.bpmn-icon-user:before { content: '\\e844'; } /* '' */\n.bpmn-icon-start-event-none:before { content: '\\e845'; } /* '' */\n.bpmn-icon-intermediate-event-throw-escalation:before { content: '\\e846'; } /* '' */\n.bpmn-icon-intermediate-event-catch-multiple:before { content: '\\e847'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-escalation:before { content: '\\e848'; } /* '' */\n.bpmn-icon-intermediate-event-throw-link:before { content: '\\e849'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-condition:before { content: '\\e84a'; } /* '' */\n.bpmn-icon-data-object:before { content: '\\e84b'; } /* '' */\n.bpmn-icon-script-task:before { content: '\\e84c'; } /* '' */\n.bpmn-icon-send-task:before { content: '\\e84d'; } /* '' */\n.bpmn-icon-data-store:before { content: '\\e84e'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-escalation:before { content: '\\e84f'; } /* '' */\n.bpmn-icon-intermediate-event-throw-message:before { content: '\\e850'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-multiple:before { content: '\\e851'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-signal:before { content: '\\e852'; } /* '' */\n.bpmn-icon-intermediate-event-throw-multiple:before { content: '\\e853'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-message:before { content: '\\e854'; } /* '' */\n.bpmn-icon-ad-hoc-marker:before { content: '\\e855'; } /* '' */\n.bpmn-icon-service-task:before { content: '\\e856'; } /* '' */\n.bpmn-icon-task-none:before { content: '\\e857'; } /* '' */\n.bpmn-icon-compensation-marker:before { content: '\\e858'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-multiple:before { content: '\\e859'; } /* '' */\n.bpmn-icon-intermediate-event-throw-signal:before { content: '\\e85a'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-condition:before { content: '\\e85b'; } /* '' */\n.bpmn-icon-participant:before { content: '\\e85c'; } /* '' */\n.bpmn-icon-event-subprocess-expanded:before { content: '\\e85d'; } /* '' */\n.bpmn-icon-lane-insert-below:before { content: '\\e85e'; } /* '' */\n.bpmn-icon-space-tool:before { content: '\\e85f'; } /* '' */\n.bpmn-icon-connection-multi:before { content: '\\e860'; } /* '' */\n.bpmn-icon-lane:before { content: '\\e861'; } /* '' */\n.bpmn-icon-lasso-tool:before { content: '\\e862'; } /* '' */\n.bpmn-icon-lane-insert-above:before { content: '\\e863'; } /* '' */\n.bpmn-icon-lane-divide-three:before { content: '\\e864'; } /* '' */\n.bpmn-icon-lane-divide-two:before { content: '\\e865'; } /* '' */\n.bpmn-icon-data-input:before { content: '\\e866'; } /* '' */\n.bpmn-icon-data-output:before { content: '\\e867'; } /* '' */\n.bpmn-icon-hand-tool:before { content: '\\e868'; } /* '' */\n.bpmn-icon-group:before { content: '\\e869'; } /* '' */\n.bpmn-icon-text-annotation:before { content: '\\e86b'; } /* '' */\n.bpmn-icon-transaction:before { content: '\\e8c4'; } /* '' */\n.bpmn-icon-screw-wrench:before { content: '\\e8db'; } /* '' */\n.bpmn-icon-connection:before { content: '\\e8dc'; } /* '' */\n.bpmn-icon-conditional-flow:before { content: '\\e8e0'; } /* '' */\n.bpmn-icon-default-flow:before { content: '\\e8e1'; } /* '' */\n"
  },
  {
    "path": "easyflow-flow-bpmn/static/plugins/bpmnjs/assets/bpmn-js.css",
    "content": ".bjs-container {\n  --bjs-font-family: Arial, sans-serif;\n\n  --color-grey-225-10-15: hsl(225, 10%, 15%);\n  --color-grey-225-10-35: hsl(225, 10%, 35%);\n  --color-grey-225-10-55: hsl(225, 10%, 55%);\n  --color-grey-225-10-75: hsl(225, 10%, 75%);\n  --color-grey-225-10-80: hsl(225, 10%, 80%);\n  --color-grey-225-10-85: hsl(225, 10%, 85%);\n  --color-grey-225-10-90: hsl(225, 10%, 90%);\n  --color-grey-225-10-95: hsl(225, 10%, 95%);\n  --color-grey-225-10-97: hsl(225, 10%, 97%);\n\n  --color-blue-205-100-45: hsl(205, 100%, 45%);\n  --color-blue-205-100-45-opacity-30: hsla(205, 100%, 45%, 30%);\n  --color-blue-205-100-50: hsl(205, 100%, 50%);\n  --color-blue-205-100-95: hsl(205, 100%, 95%);\n\n  --color-green-150-86-44: hsl(150, 86%, 44%);\n\n  --color-red-360-100-40: hsl(360, 100%, 40%);\n  --color-red-360-100-45: hsl(360, 100%, 45%);\n  --color-red-360-100-92: hsl(360, 100%, 92%);\n  --color-red-360-100-97: hsl(360, 100%, 97%);\n\n  --color-white: hsl(0, 0%, 100%);\n  --color-black: hsl(0, 0%, 0%);\n  --color-black-opacity-05: hsla(0, 0%, 0%, 5%);\n  --color-black-opacity-10: hsla(0, 0%, 0%, 10%);\n\n  --breadcrumbs-font-family: var(--bjs-font-family);\n  --breadcrumbs-item-color: var(--color-blue-205-100-50);\n  --breadcrumbs-arrow-color: var(--color-black);\n  --drilldown-fill-color: var(--color-white);\n  --drilldown-background-color: var(--color-blue-205-100-50);\n}\n\n.bjs-breadcrumbs {\n  position: absolute;\n  display: none;\n  flex-wrap: wrap;\n  align-items: center;\n  top: 30px;\n  left: 30px;\n  padding: 0px;\n  margin: 0px;\n  font-family: var(--breadcrumbs-font-family);\n  font-size: 16px;\n  line-height: normal;\n}\n\n.bjs-breadcrumbs-shown .bjs-breadcrumbs {\n  display: flex;\n}\n\n.djs-palette-shown .bjs-breadcrumbs {\n  left: 90px;\n}\n\n.djs-palette-shown.djs-palette-two-column .bjs-breadcrumbs {\n  left: 140px;\n}\n\n.bjs-breadcrumbs li {\n  display: inline-flex;\n  padding-bottom: 5px;\n}\n\n.bjs-breadcrumbs li a {\n  cursor: pointer;\n  color: var(--breadcrumbs-item-color);\n}\n\n.bjs-breadcrumbs li:last-of-type a {\n  color: inherit;\n  cursor: default;\n}\n\n.bjs-breadcrumbs li:not(:first-child)::before {\n  content: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"17\" height=\"17\" viewBox=\"0 0 24 24\"><path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\" /><path d=\"M0 0h24v24H0z\" fill=\"none\" /></svg>');\n  padding: 0 8px;\n  color: var(--breadcrumbs-arrow-color);\n  height: 1em;\n}\n\n.bjs-breadcrumbs .bjs-crumb {\n  display: inline-block;\n  max-width: 200px;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.bjs-drilldown {\n  width: 20px;\n  height: 20px;\n\n  padding: 0px;\n  margin-left: -20px;\n\n  cursor: pointer;\n  border: none;\n  border-radius: 2px;\n  outline: none;\n\n  fill: var(--drilldown-fill-color);\n  background-color: var(--drilldown-background-color);\n}\n\n.bjs-drilldown-empty {\n  display: none;\n}\n\n.selected .bjs-drilldown-empty {\n  display: inherit;\n}\n\n[data-popup=\"align-elements\"] .djs-popup-results {\n  display: flex;\n}\n\n[data-popup=\"align-elements\"] .djs-popup-body [data-group] + [data-group] {\n  border-left: 1px solid var(--popup-border-color);\n}\n\n[data-popup=\"align-elements\"] [data-group=\"align\"] {\n  display: grid;\n  grid-template-columns: repeat(3, 1fr);\n}\n\n[data-popup=\"align-elements\"] .djs-popup-body .entry {\n  padding: 6px 8px;\n}\n\n[data-popup=\"align-elements\"] .djs-popup-body .entry:not(:first-child) {\n  margin-top: 0;\n}\n\n[data-popup=\"align-elements\"] .djs-popup-entry-icon {\n  display: block;\n  margin: 0;\n  height: 20px;\n  width: 20px;\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/static/plugins/bpmnjs/assets/diagram-js.css",
    "content": "/**\n * color definitions\n */\n.djs-parent {\n  --color-grey-225-10-15: hsl(225, 10%, 15%);\n  --color-grey-225-10-35: hsl(225, 10%, 35%);\n  --color-grey-225-10-55: hsl(225, 10%, 55%);\n  --color-grey-225-10-75: hsl(225, 10%, 75%);\n  --color-grey-225-10-80: hsl(225, 10%, 80%);\n  --color-grey-225-10-85: hsl(225, 10%, 85%);\n  --color-grey-225-10-90: hsl(225, 10%, 90%);\n  --color-grey-225-10-95: hsl(225, 10%, 95%);\n  --color-grey-225-10-97: hsl(225, 10%, 97%);\n\n  --color-blue-205-100-45: hsl(205, 100%, 45%);\n  --color-blue-205-100-45-opacity-30: hsla(205, 100%, 45%, 30%);\n  --color-blue-205-100-50: hsl(205, 100%, 50%);\n  --color-blue-205-100-50-opacity-15: hsla(205, 100%, 50%, 15%);\n  --color-blue-205-100-70: hsl(205, 100%, 75%);\n  --color-blue-205-100-95: hsl(205, 100%, 95%);\n\n  --color-green-150-86-44: hsl(150, 86%, 44%);\n\n  --color-red-360-100-40: hsl(360, 100%, 40%);\n  --color-red-360-100-45: hsl(360, 100%, 45%);\n  --color-red-360-100-92: hsl(360, 100%, 92%);\n  --color-red-360-100-97: hsl(360, 100%, 97%);\n\n  --color-white: hsl(0, 0%, 100%);\n  --color-black: hsl(0, 0%, 0%);\n  --color-black-opacity-10: hsla(0, 0%, 0%, 10%);\n  --color-black-opacity-30: hsla(0, 0%, 0%, 30%);\n\n  --canvas-fill-color: var(--color-white);\n\n  --bendpoint-fill-color: var(--color-blue-205-100-45);\n  --bendpoint-stroke-color: var(--canvas-fill-color);\n\n  --context-pad-entry-background-color: var(--color-white);\n  --context-pad-entry-hover-background-color: var(--color-grey-225-10-95);\n\n  --element-dragger-color: var(--color-blue-205-100-50);\n  --element-hover-outline-fill-color: var(--color-blue-205-100-45);\n  --element-selected-outline-stroke-color: var(--color-blue-205-100-50);\n  --element-selected-outline-secondary-stroke-color: var(--color-blue-205-100-70);\n\n  --lasso-fill-color: var(--color-blue-205-100-50-opacity-15);\n  --lasso-stroke-color: var(--element-selected-outline-stroke-color);\n\n  --palette-entry-color: var(--color-grey-225-10-15);\n  --palette-entry-hover-color: var(--color-blue-205-100-45);\n  --palette-entry-selected-color: var(--color-blue-205-100-50);\n  --palette-separator-color: var(--color-grey-225-10-75);\n  --palette-toggle-hover-background-color: var(--color-grey-225-10-55);\n  --palette-background-color: var(--color-grey-225-10-97);\n  --palette-border-color: var(--color-grey-225-10-75);\n\n  --popup-font-size: 14px;\n  --popup-header-entry-selected-color: var(--color-blue-205-100-50);\n  --popup-header-font-weight: bolder;\n  --popup-background-color: var(--color-white);\n  --popup-border-color: transparent;\n  --popup-shadow-color: var(--color-black-opacity-30);\n  --popup-description-color: var(--color-grey-225-10-55);\n  --popup-no-results-color: var(--color-grey-225-10-55);\n  --popup-entry-title-color: var(--color-grey-225-10-55);\n  --popup-entry-hover-color:  var(--color-grey-225-10-95);\n  --popup-search-border-color: var(--color-grey-225-10-75);\n  --popup-search-focus-border-color: var(--color-blue-205-100-50);\n  --popup-search-focus-background-color: var(--color-blue-205-100-95);\n\n  --resizer-fill-color: var(--color-blue-205-100-45);\n  --resizer-stroke-color: var(--canvas-fill-color);\n\n  --search-container-background-color: var(--color-grey-225-10-97);\n  --search-container-border-color: var(--color-blue-205-100-50);\n  --search-container-box-shadow-color: var(--color-blue-205-100-95);\n  --search-container-box-shadow-inset-color: var(--color-grey-225-10-80);\n  --search-input-border-color: var(--color-grey-225-10-75);\n  --search-result-border-color: var(--color-grey-225-10-75);\n  --search-result-highlight-color: var(--color-black);\n  --search-result-selected-color: var(--color-blue-205-100-45-opacity-30);\n\n  --shape-attach-allowed-stroke-color: var(--color-blue-205-100-50);\n  --shape-connect-allowed-fill-color: var(--color-grey-225-10-97);\n  --shape-drop-allowed-fill-color: var(--color-grey-225-10-97);\n  --shape-drop-not-allowed-fill-color: var(--color-red-360-100-97);\n  --shape-resize-preview-stroke-color: var(--color-blue-205-100-50);\n\n  --snap-line-stroke-color: var(--color-blue-205-100-45-opacity-30);\n\n  --space-tool-crosshair-stroke-color: var(--color-black);\n\n  --tooltip-error-background-color: var(--color-red-360-100-97);\n  --tooltip-error-border-color: var(--color-red-360-100-45);\n  --tooltip-error-color: var(--color-red-360-100-45);\n}\n\n/**\n * outline styles\n */\n\n.djs-outline,\n.djs-selection-outline {\n  fill: none;\n  shape-rendering: geometricPrecision;\n  stroke-width: 2px;\n}\n\n.djs-outline {\n  visibility: hidden;\n}\n\n.djs-selection-outline {\n  stroke: var(--element-selected-outline-stroke-color);\n}\n\n.djs-element.selected .djs-outline {\n  visibility: visible;\n\n  stroke: var(--element-selected-outline-stroke-color);\n}\n\n.djs-multi-select .djs-element.selected .djs-outline {\n  stroke: var(--element-selected-outline-secondary-stroke-color);\n}\n\n.djs-shape.connect-ok .djs-visual > :nth-child(1) {\n  fill: var(--shape-connect-allowed-fill-color) !important;\n}\n\n.djs-shape.connect-not-ok .djs-visual > :nth-child(1),\n.djs-shape.drop-not-ok .djs-visual > :nth-child(1) {\n  fill: var(--shape-drop-not-allowed-fill-color) !important;\n}\n\n.djs-shape.new-parent .djs-visual > :nth-child(1) {\n  fill: var(--shape-drop-allowed-fill-color) !important;\n}\n\nsvg.drop-not-ok {\n  background: var(--shape-drop-not-allowed-fill-color) !important;\n}\n\nsvg.new-parent {\n  background: var(--shape-drop-allowed-fill-color) !important;\n}\n\n\n/* Override move cursor during drop and connect */\n.drop-not-ok,\n.connect-not-ok,\n.drop-not-ok *,\n.connect-not-ok * {\n  cursor: not-allowed !important;\n}\n\n.drop-ok,\n.connect-ok,\n.drop-ok *,\n.connect-ok * {\n  cursor: default !important;\n}\n\n.djs-element.attach-ok .djs-visual > :nth-child(1) {\n  stroke-width: 5px !important;\n  stroke: var(--shape-attach-allowed-stroke-color) !important;\n}\n\n.djs-frame.connect-not-ok .djs-visual > :nth-child(1),\n.djs-frame.drop-not-ok .djs-visual > :nth-child(1) {\n  stroke-width: 3px !important;\n  stroke: var(--shape-drop-not-allowed-fill-color) !important;\n  fill: none !important;\n}\n\n/**\n* Selection box style\n*\n*/\n.djs-lasso-overlay {\n  fill: var(--lasso-fill-color);\n  stroke: var(--lasso-stroke-color);\n  stroke-width: 2px;\n  shape-rendering: geometricPrecision;\n  pointer-events: none;\n}\n\n/**\n * Resize styles\n */\n.djs-resize-overlay {\n  fill: none;\n\n  stroke-dasharray: 5 1 3 1;\n  stroke: var(--shape-resize-preview-stroke-color);\n\n  pointer-events: none;\n}\n\n.djs-resizer-hit {\n  fill: none;\n  pointer-events: all;\n}\n\n.djs-resizer-visual {\n  fill: var(--resizer-fill-color);\n  stroke-width: 1px;\n  stroke: var(--resizer-stroke-color);\n  shape-rendering: geometricPrecision;\n}\n\n.djs-resizer:hover .djs-resizer-visual {\n  stroke: var(--resizer-stroke-color);\n  stroke-opacity: 1;\n}\n\n.djs-cursor-resize-ns,\n.djs-resizer-n,\n.djs-resizer-s {\n  cursor: ns-resize;\n}\n\n.djs-cursor-resize-ew,\n.djs-resizer-e,\n.djs-resizer-w {\n  cursor: ew-resize;\n}\n\n.djs-cursor-resize-nwse,\n.djs-resizer-nw,\n.djs-resizer-se {\n  cursor: nwse-resize;\n}\n\n.djs-cursor-resize-nesw,\n.djs-resizer-ne,\n.djs-resizer-sw {\n  cursor: nesw-resize;\n}\n\n.djs-shape.djs-resizing > .djs-outline {\n  visibility: hidden !important;\n}\n\n.djs-shape.djs-resizing > .djs-resizer {\n  visibility: hidden;\n}\n\n.djs-dragger > .djs-resizer {\n  visibility: hidden;\n}\n\n/**\n * drag styles\n */\n.djs-dragger * {\n  fill: none !important;\n  stroke: var(--element-dragger-color) !important;\n}\n\n.djs-dragger tspan,\n.djs-dragger text {\n  fill: var(--element-dragger-color) !important;\n  stroke: none !important;\n}\n\nmarker.djs-dragger circle,\nmarker.djs-dragger path,\nmarker.djs-dragger polygon,\nmarker.djs-dragger polyline,\nmarker.djs-dragger rect {\n  fill: var(--element-dragger-color) !important;\n  stroke: none !important;\n}\n\nmarker.djs-dragger text,\nmarker.djs-dragger tspan {\n  fill: none !important;\n  stroke: var(--element-dragger-color) !important;\n}\n\n.djs-dragging {\n  opacity: 0.3;\n}\n\n.djs-dragging,\n.djs-dragging > * {\n  pointer-events: none !important;\n}\n\n.djs-dragging .djs-context-pad,\n.djs-dragging .djs-outline {\n  display: none !important;\n}\n\n/**\n * no pointer events for visual\n */\n.djs-visual,\n.djs-outline {\n  pointer-events: none;\n}\n\n.djs-element.attach-ok .djs-hit {\n  stroke-width: 60px !important;\n}\n\n/**\n * all pointer events for hit shape\n */\n.djs-element > .djs-hit-all,\n.djs-element > .djs-hit-no-move {\n  pointer-events: all;\n}\n\n.djs-element > .djs-hit-stroke,\n.djs-element > .djs-hit-click-stroke {\n  pointer-events: stroke;\n}\n\n/**\n * shape / connection basic styles\n */\n.djs-connection .djs-visual {\n  stroke-width: 2px;\n  fill: none;\n}\n\n.djs-cursor-grab {\n  cursor: -webkit-grab;\n  cursor: -moz-grab;\n  cursor: grab;\n}\n\n.djs-cursor-grabbing {\n  cursor: -webkit-grabbing;\n  cursor: -moz-grabbing;\n  cursor: grabbing;\n}\n\n.djs-cursor-crosshair {\n  cursor: crosshair;\n}\n\n.djs-cursor-move {\n  cursor: move;\n}\n\n.djs-cursor-resize-ns {\n  cursor: ns-resize;\n}\n\n.djs-cursor-resize-ew {\n  cursor: ew-resize;\n}\n\n\n/**\n * snapping\n */\n.djs-snap-line {\n  stroke: var(--snap-line-stroke-color);\n  stroke-linecap: round;\n  stroke-width: 2px;\n  pointer-events: none;\n}\n\n/**\n * snapping\n */\n.djs-crosshair {\n  stroke: var(--space-tool-crosshair-stroke-color);\n  stroke-linecap: round;\n  stroke-width: 1px;\n  pointer-events: none;\n  shape-rendering: geometricPrecision;\n  stroke-dasharray: 5, 5;\n}\n\n/**\n * palette\n */\n\n.djs-palette {\n  position: absolute;\n  left: 20px;\n  top: 20px;\n\n  box-sizing: border-box;\n  width: 48px;\n}\n\n.djs-palette .separator {\n  margin: 5px;\n  padding-top: 5px;\n\n  border: none;\n  border-bottom: solid 1px var(--palette-separator-color);\n\n  clear: both;\n}\n\n.djs-palette .entry:before {\n  vertical-align: initial;\n}\n\n.djs-palette .djs-palette-toggle {\n  cursor: pointer;\n}\n\n.djs-palette .entry,\n.djs-palette .djs-palette-toggle {\n  color: var(--palette-entry-color);\n  font-size: 30px;\n\n  text-align: center;\n}\n\n.djs-palette .entry {\n  float: left;\n}\n\n.djs-palette .entry img {\n  max-width: 100%;\n}\n\n.djs-palette .djs-palette-entries:after {\n  content: '';\n  display: table;\n  clear: both;\n}\n\n.djs-palette .djs-palette-toggle:hover {\n  background: var(--palette-toggle-hover-background-color);\n}\n\n.djs-palette .entry:hover {\n  color: var(--palette-entry-hover-color);\n}\n\n.djs-palette .highlighted-entry {\n  color: var(--palette-entry-selected-color) !important;\n}\n\n.djs-palette .entry,\n.djs-palette .djs-palette-toggle {\n  width: 46px;\n  height: 46px;\n  line-height: 46px;\n  cursor: default;\n}\n\n/**\n * Palette open / two-column layout is controlled via\n * classes on the palette. Events to hook into palette\n * changed life-cycle are available in addition.\n */\n.djs-palette.two-column.open {\n  width: 94px;\n}\n\n.djs-palette:not(.open) .djs-palette-entries {\n  display: none;\n}\n\n.djs-palette:not(.open) {\n  overflow: hidden;\n}\n\n.djs-palette.open .djs-palette-toggle {\n  display: none;\n}\n\n/**\n * context-pad\n */\n.djs-overlay-context-pad {\n  width: 72px;\n  z-index: 100;\n}\n\n.djs-context-pad {\n  position: absolute;\n  display: none;\n  pointer-events: none;\n  line-height: 1;\n}\n\n.djs-context-pad .entry {\n  width: 22px;\n  height: 22px;\n  text-align: center;\n  display: inline-block;\n  font-size: 22px;\n  margin: 0 2px 2px 0;\n\n  border-radius: 3px;\n\n  cursor: default;\n\n  background-color: var(--context-pad-entry-background-color);\n  box-shadow: 0 0 2px 1px var(--context-pad-entry-background-color);\n  pointer-events: all;\n  vertical-align: middle;\n}\n\n.djs-context-pad .entry:hover {\n  background: var(--context-pad-entry-hover-background-color);\n}\n\n.djs-context-pad.open {\n  display: block;\n}\n\n/**\n * popup styles\n */\n.djs-popup-backdrop {\n  position: fixed;\n  width: 100vw;\n  height: 100vh;\n  top: 0;\n  left: 0;\n  z-index: 200;\n  line-height: 1;\n  font-family: \"IBM Plex Sans\", sans-serif;\n}\n\n.djs-popup {\n  box-sizing: border-box;\n  width: min-content;\n  background: var(--popup-background-color);\n  overflow: hidden;\n  position: absolute;\n\n  box-shadow: 0px 2px 6px var(--popup-shadow-color);\n  border: solid 1px var(--popup-border-color);\n  min-width: 120px;\n  outline: none;\n  font-size: var(--popup-font-size);\n}\n\n.djs-popup-search input {\n  width: 100%;\n  box-sizing: border-box;\n  font-size: var(--popup-font-size);\n  padding: 3px 6px;\n  border-radius: 2px;\n  border: solid 1px var(--popup-search-border-color);\n  line-height: 21px;\n}\n\n.djs-popup-search input:focus {\n  background-color: var(--popup-search-focus-background-color);\n  border: solid 1px var(--popup-search-focus-border-color);\n  outline: none;\n}\n\n.djs-popup-header {\n  display: flex;\n  align-items: stretch;\n  line-height: 20px;\n  margin: 10px 12px 10px 12px;\n}\n\n.djs-popup-header .entry {\n  border-radius: 2px;\n}\n\n.djs-popup-header .entry.active {\n  color: var(--popup-header-entry-selected-color);\n}\n\n.djs-popup-header .entry.disabled {\n  color: inherit;\n}\n\n.djs-popup-search {\n  margin: 10px 12px;\n}\n\n.djs-popup-title {\n  font-size: var(--popup-font-size);\n  font-weight: var(--popup-header-font-weight);\n  flex: 1;\n  margin: 0;\n}\n\n.djs-popup-search {\n  position: relative;\n  width: auto;\n}\n\n.djs-popup-search-icon {\n  position: absolute;\n  left: 8px;\n  top: 7px;\n}\n\n.djs-popup-search input {\n  padding-left: 25px;\n}\n\n.djs-popup-results {\n  margin: 7px 3px 7px 12px;\n  list-style: none;\n  max-height: 280px;\n  overflow: auto;\n  padding-right: 9px;\n}\n\n.djs-popup-group {\n  margin: 0;\n  padding: 0;\n  width: 100%;\n}\n\n.djs-popup-body .entry,\n.djs-popup-body .entry-header {\n  padding: 5px 7px;\n  cursor: default;\n  border-radius: 4px;\n}\n\n.djs-popup-body .entry-header {\n  font-weight: var(--popup-header-font-weight);\n  color: var(--popup-entry-title-color);\n  padding-left: 0;\n}\n\n.djs-popup [class*=\"icon\"] .djs-popup-label,\n.djs-popup-label:not(:first-child) {\n  margin-left: .5em;\n}\n\n.djs-popup [class*=\"icon\"]:before,\n.djs-popup-entry-icon {\n  width: 1em;\n  height: 1em;\n  display: inline-block;\n  font-size: 1.4em;\n  vertical-align: middle;\n}\n\n.djs-popup-body .entry-header:not(:first-child) {\n  margin-top: 8px;\n  margin-bottom: 2px;\n}\n\n.djs-popup-body .entry {\n  display: flex;\n  flex-direction: row;\n  align-items: stretch;\n  height: min-content;\n}\n\n.djs-popup .entry.selected {\n  background-color: var(--popup-entry-hover-color);\n}\n\n.djs-popup-body .entry:not(:first-child) {\n  margin-top: 2px;\n}\n\n.djs-popup-entry-content {\n  display: flex;\n  flex-direction: column;\n  flex: 1;\n  overflow: hidden;\n}\n\n.djs-popup-entry-description {\n  color: var(--popup-description-color);\n}\n\n.djs-popup-label,\n.djs-popup-entry-description {\n  line-height: 1.4em;\n}\n\n.djs-popup-title,\n.djs-popup-label,\n.djs-popup-entry-description,\n.djs-popup .entry-header {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.djs-popup-entry-name {\n  display: flex;\n}\n\n.entry-content {\n  display: flex;\n  flex-direction: column;\n  flex: 1;\n  overflow: hidden;\n}\n\n.djs-popup-body {\n  flex-direction: column;\n  width: auto;\n}\n\n.djs-popup *::-webkit-scrollbar {\n  width: 6px;\n}\n\n.djs-popup *::-webkit-scrollbar-thumb {\n  border-radius: 3px;\n  background-color: rgba(0, 0, 0, 0.2);\n}\n\n.djs-popup *::-webkit-scrollbar-track {\n  box-shadow: none;\n  background: transparent;\n  margin: 0;\n  padding: 5px;\n}\n\n.djs-popup-no-results {\n  padding: 0 12px 12px 12px;\n  color: var(--popup-no-results-color);\n}\n\n.djs-popup-entry-docs {\n  flex: 0;\n  flex-direction: row;\n  align-items: center;\n  padding-left: 5px;\n  display: none;\n}\n\n.djs-popup-body .entry:hover .djs-popup-entry-docs {\n  display: flex;\n}\n\n.djs-popup-entry-docs svg {\n  vertical-align: middle;\n  margin: auto 2px auto 5px;\n}\n\n/**\n *  palette styles\n */\n.djs-palette {\n  background: var(--palette-background-color);\n  border: solid 1px var(--palette-border-color);\n  border-radius: 2px;\n}\n\n/**\n * touch\n */\n\n.djs-shape,\n.djs-connection {\n  touch-action: none;\n}\n\n.djs-segment-dragger,\n.djs-bendpoint {\n  display: none;\n}\n\n/**\n * bendpoints\n */\n.djs-segment-dragger .djs-visual {\n  display: none;\n\n  fill: var(--bendpoint-fill-color);\n  stroke: var(--bendpoint-stroke-color);\n  stroke-width: 1px;\n  stroke-opacity: 1;\n}\n\n.djs-segment-dragger:hover .djs-visual {\n  display: block;\n}\n\n.djs-bendpoint .djs-visual {\n  fill: var(--bendpoint-fill-color);\n  stroke: var(--bendpoint-stroke-color);\n  stroke-width: 1px;\n}\n\n.djs-segment-dragger:hover,\n.djs-bendpoints.hover .djs-segment-dragger,\n.djs-bendpoints.selected .djs-segment-dragger,\n.djs-bendpoint:hover,\n.djs-bendpoints.hover .djs-bendpoint,\n.djs-bendpoints.selected .djs-bendpoint {\n  display: block;\n}\n\n.djs-drag-active .djs-bendpoints * {\n  display: none;\n}\n\n.djs-bendpoints:not(.hover) .floating {\n  display: none;\n}\n\n.djs-segment-dragger:hover .djs-visual,\n.djs-segment-dragger.djs-dragging .djs-visual,\n.djs-bendpoint:hover .djs-visual,\n.djs-bendpoint.floating .djs-visual {\n  fill: var(--bendpoint-fill-color);\n  stroke: var(--bendpoint-stroke-color);\n  stroke-opacity: 1;\n}\n\n.djs-bendpoint.floating .djs-hit {\n  pointer-events: none;\n}\n\n.djs-segment-dragger .djs-hit,\n.djs-bendpoint .djs-hit {\n  fill: none;\n  pointer-events: all;\n}\n\n.djs-segment-dragger.horizontal .djs-hit {\n  cursor: ns-resize;\n}\n\n.djs-segment-dragger.vertical .djs-hit {\n  cursor: ew-resize;\n}\n\n.djs-segment-dragger.djs-dragging .djs-hit {\n  pointer-events: none;\n}\n\n.djs-updating,\n.djs-updating > * {\n  pointer-events: none !important;\n}\n\n.djs-updating .djs-context-pad,\n.djs-updating .djs-outline,\n.djs-updating .djs-bendpoint,\n.djs-multi-select .djs-bendpoint,\n.djs-multi-select .djs-segment-dragger,\n.connect-ok .djs-bendpoint,\n.connect-not-ok .djs-bendpoint,\n.drop-ok .djs-bendpoint,\n.drop-not-ok .djs-bendpoint {\n  display: none !important;\n}\n\n.djs-segment-dragger.djs-dragging,\n.djs-bendpoint.djs-dragging {\n  display: block;\n  opacity: 1.0;\n}\n\n\n/**\n * tooltips\n */\n.djs-tooltip-error {\n  width: 160px;\n  padding: 6px;\n\n  background: var(--tooltip-error-background-color);\n  border: solid 1px var(--tooltip-error-border-color);\n  border-radius: 2px;\n  color: var(--tooltip-error-color);\n  font-size: 12px;\n  line-height: 16px;\n\n  opacity: 0.75;\n}\n\n.djs-tooltip-error:hover {\n  opacity: 1;\n}\n\n\n/**\n * search pad\n */\n.djs-search-container {\n  position: absolute;\n  top: 20px;\n  left: 0;\n  right: 0;\n  margin-left: auto;\n  margin-right: auto;\n\n  width: 25%;\n  min-width: 300px;\n  max-width: 400px;\n  z-index: 10;\n\n  font-size: 1.05em;\n  opacity: 0.9;\n  background: var(--search-container-background-color);\n  border: solid 1px var(--search-container-border-color);\n  border-radius: 2px;\n  box-shadow: 0 0 0 2px var(--search-container-box-shadow-color), 0 0 0 1px var(--search-container-box-shadow-inset-color) inset;\n}\n\n.djs-search-container:not(.open) {\n  display: none;\n}\n\n.djs-search-input input {\n  font-size: 1.05em;\n  width: 100%;\n  padding: 6px 10px;\n  border: 1px solid var(--search-input-border-color);\n  box-sizing: border-box;\n}\n\n.djs-search-input input:focus {\n  outline: none;\n  border-color: var(--search-input-border-color);\n}\n\n.djs-search-results {\n  position: relative;\n  overflow-y: auto;\n  max-height: 200px;\n}\n\n.djs-search-results:hover {\n  cursor: pointer;\n}\n\n.djs-search-result {\n  width: 100%;\n  padding: 6px 10px;\n  background: white;\n  border-bottom: solid 1px var(--search-result-border-color);\n  border-radius: 1px;\n}\n\n.djs-search-highlight {\n  color: var(--search-result-highlight-color);\n}\n\n.djs-search-result-primary {\n  margin: 0 0 10px;\n}\n\n.djs-search-result-secondary {\n  font-family: monospace;\n  margin: 0;\n}\n\n.djs-search-result:hover {\n  background: var(--search-result-selected-color);\n}\n\n.djs-search-result-selected {\n  background: var(--search-result-selected-color);\n}\n\n.djs-search-result-selected:hover {\n  background: var(--search-result-selected-color);\n}\n\n.djs-search-overlay {\n  background: var(--search-result-selected-color);\n}\n\n/**\n * hidden styles\n */\n.djs-element-hidden,\n.djs-element-hidden .djs-hit,\n.djs-element-hidden .djs-outline,\n.djs-label-hidden .djs-label {\n  display: none !important;\n}\n\n.djs-element .djs-hit-stroke,\n.djs-element .djs-hit-click-stroke,\n.djs-element .djs-hit-all {\n  cursor: move;\n}"
  },
  {
    "path": "easyflow-flow-bpmn/static/plugins/bpmnjs/bpmn-modeler.development.js",
    "content": "/*!\n * bpmn-js - bpmn-modeler v13.2.1\n *\n * Copyright (c) 2014-present, camunda Services GmbH\n *\n * Released under the bpmn.io license\n * http://bpmn.io/license\n *\n * Source Code: https://github.com/bpmn-io/bpmn-js\n *\n * Date: 2023-08-05\n */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n  typeof define === 'function' && define.amd ? define(factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.BpmnModeler = factory());\n})(this, (function () { 'use strict';\n\n  function e$3(e,t){t&&(e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}));}\n\n  function createCommonjsModule(fn, module) {\n  \treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n  }\n\n  var hat_1 = createCommonjsModule(function (module) {\n  var hat = module.exports = function (bits, base) {\n      if (!base) base = 16;\n      if (bits === undefined) bits = 128;\n      if (bits <= 0) return '0';\n      \n      var digits = Math.log(Math.pow(2, bits)) / Math.log(base);\n      for (var i = 2; digits === Infinity; i *= 2) {\n          digits = Math.log(Math.pow(2, bits / i)) / Math.log(base) * i;\n      }\n      \n      var rem = digits - Math.floor(digits);\n      \n      var res = '';\n      \n      for (var i = 0; i < Math.floor(digits); i++) {\n          var x = Math.floor(Math.random() * base).toString(base);\n          res = x + res;\n      }\n      \n      if (rem) {\n          var b = Math.pow(base, rem);\n          var x = Math.floor(Math.random() * b).toString(base);\n          res = x + res;\n      }\n      \n      var parsed = parseInt(res, base);\n      if (parsed !== Infinity && parsed >= Math.pow(2, bits)) {\n          return hat(bits, base)\n      }\n      else return res;\n  };\n\n  hat.rack = function (bits, base, expandBy) {\n      var fn = function (data) {\n          var iters = 0;\n          do {\n              if (iters ++ > 10) {\n                  if (expandBy) bits += expandBy;\n                  else throw new Error('too many ID collisions, use more bits')\n              }\n              \n              var id = hat(bits, base);\n          } while (Object.hasOwnProperty.call(hats, id));\n          \n          hats[id] = data;\n          return id;\n      };\n      var hats = fn.hats = {};\n      \n      fn.get = function (id) {\n          return fn.hats[id];\n      };\n      \n      fn.set = function (id, value) {\n          fn.hats[id] = value;\n          return fn;\n      };\n      \n      fn.bits = bits || 128;\n      fn.base = base || 16;\n      return fn;\n  };\n  });\n\n  /**\n   * Create a new id generator / cache instance.\n   *\n   * You may optionally provide a seed that is used internally.\n   *\n   * @param {Seed} seed\n   */\n\n  function Ids(seed) {\n    if (!(this instanceof Ids)) {\n      return new Ids(seed);\n    }\n\n    seed = seed || [128, 36, 1];\n    this._seed = seed.length ? hat_1.rack(seed[0], seed[1], seed[2]) : seed;\n  }\n  /**\n   * Generate a next id.\n   *\n   * @param {Object} [element] element to bind the id to\n   *\n   * @return {String} id\n   */\n\n  Ids.prototype.next = function (element) {\n    return this._seed(element || true);\n  };\n  /**\n   * Generate a next id with a given prefix.\n   *\n   * @param {Object} [element] element to bind the id to\n   *\n   * @return {String} id\n   */\n\n\n  Ids.prototype.nextPrefixed = function (prefix, element) {\n    var id;\n\n    do {\n      id = prefix + this.next(true);\n    } while (this.assigned(id)); // claim {prefix}{random}\n\n\n    this.claim(id, element); // return\n\n    return id;\n  };\n  /**\n   * Manually claim an existing id.\n   *\n   * @param {String} id\n   * @param {String} [element] element the id is claimed by\n   */\n\n\n  Ids.prototype.claim = function (id, element) {\n    this._seed.set(id, element || true);\n  };\n  /**\n   * Returns true if the given id has already been assigned.\n   *\n   * @param  {String} id\n   * @return {Boolean}\n   */\n\n\n  Ids.prototype.assigned = function (id) {\n    return this._seed.get(id) || false;\n  };\n  /**\n   * Unclaim an id.\n   *\n   * @param  {String} id the id to unclaim\n   */\n\n\n  Ids.prototype.unclaim = function (id) {\n    delete this._seed.hats[id];\n  };\n  /**\n   * Clear all claimed ids.\n   */\n\n\n  Ids.prototype.clear = function () {\n    var hats = this._seed.hats,\n        id;\n\n    for (id in hats) {\n      this.unclaim(id);\n    }\n  };\n\n  /**\n   * Flatten array, one level deep.\n   *\n   * @template T\n   *\n   * @param {T[][]} arr\n   *\n   * @return {T[]}\n   */\n  function flatten(arr) {\n    return Array.prototype.concat.apply([], arr);\n  }\n\n  const nativeToString$1 = Object.prototype.toString;\n  const nativeHasOwnProperty$1 = Object.prototype.hasOwnProperty;\n\n  function isUndefined$2(obj) {\n    return obj === undefined;\n  }\n\n  function isDefined(obj) {\n    return obj !== undefined;\n  }\n\n  function isNil(obj) {\n    return obj == null;\n  }\n\n  function isArray$3(obj) {\n    return nativeToString$1.call(obj) === '[object Array]';\n  }\n\n  function isObject(obj) {\n    return nativeToString$1.call(obj) === '[object Object]';\n  }\n\n  function isNumber(obj) {\n    return nativeToString$1.call(obj) === '[object Number]';\n  }\n\n  /**\n   * @param {any} obj\n   *\n   * @return {boolean}\n   */\n  function isFunction(obj) {\n    const tag = nativeToString$1.call(obj);\n\n    return (\n      tag === '[object Function]' ||\n      tag === '[object AsyncFunction]' ||\n      tag === '[object GeneratorFunction]' ||\n      tag === '[object AsyncGeneratorFunction]' ||\n      tag === '[object Proxy]'\n    );\n  }\n\n  function isString(obj) {\n    return nativeToString$1.call(obj) === '[object String]';\n  }\n\n\n  /**\n   * Ensure collection is an array.\n   *\n   * @param {Object} obj\n   */\n  function ensureArray(obj) {\n\n    if (isArray$3(obj)) {\n      return;\n    }\n\n    throw new Error('must supply array');\n  }\n\n  /**\n   * Return true, if target owns a property with the given key.\n   *\n   * @param {Object} target\n   * @param {String} key\n   *\n   * @return {Boolean}\n   */\n  function has$1(target, key) {\n    return nativeHasOwnProperty$1.call(target, key);\n  }\n\n  /**\n   * @template T\n   * @typedef { (\n   *   ((e: T) => boolean) |\n   *   ((e: T, idx: number) => boolean) |\n   *   ((e: T, key: string) => boolean) |\n   *   string |\n   *   number\n   * ) } Matcher\n   */\n\n  /**\n   * @template T\n   * @template U\n   *\n   * @typedef { (\n   *   ((e: T) => U) | string | number\n   * ) } Extractor\n   */\n\n\n  /**\n   * @template T\n   * @typedef { (val: T, key: any) => boolean } MatchFn\n   */\n\n  /**\n   * @template T\n   * @typedef { T[] } ArrayCollection\n   */\n\n  /**\n   * @template T\n   * @typedef { { [key: string]: T } } StringKeyValueCollection\n   */\n\n  /**\n   * @template T\n   * @typedef { { [key: number]: T } } NumberKeyValueCollection\n   */\n\n  /**\n   * @template T\n   * @typedef { StringKeyValueCollection<T> | NumberKeyValueCollection<T> } KeyValueCollection\n   */\n\n  /**\n   * @template T\n   * @typedef { KeyValueCollection<T> | ArrayCollection<T> } Collection\n   */\n\n  /**\n   * Find element in collection.\n   *\n   * @template T\n   * @param {Collection<T>} collection\n   * @param {Matcher<T>} matcher\n   *\n   * @return {Object}\n   */\n  function find(collection, matcher) {\n\n    const matchFn = toMatcher(matcher);\n\n    let match;\n\n    forEach$1(collection, function(val, key) {\n      if (matchFn(val, key)) {\n        match = val;\n\n        return false;\n      }\n    });\n\n    return match;\n\n  }\n\n\n  /**\n   * Find element index in collection.\n   *\n   * @template T\n   * @param {Collection<T>} collection\n   * @param {Matcher<T>} matcher\n   *\n   * @return {number}\n   */\n  function findIndex(collection, matcher) {\n\n    const matchFn = toMatcher(matcher);\n\n    let idx = isArray$3(collection) ? -1 : undefined;\n\n    forEach$1(collection, function(val, key) {\n      if (matchFn(val, key)) {\n        idx = key;\n\n        return false;\n      }\n    });\n\n    return idx;\n  }\n\n\n  /**\n   * Filter elements in collection.\n   *\n   * @template T\n   * @param {Collection<T>} collection\n   * @param {Matcher<T>} matcher\n   *\n   * @return {T[]} result\n   */\n  function filter(collection, matcher) {\n\n    const matchFn = toMatcher(matcher);\n\n    let result = [];\n\n    forEach$1(collection, function(val, key) {\n      if (matchFn(val, key)) {\n        result.push(val);\n      }\n    });\n\n    return result;\n  }\n\n\n  /**\n   * Iterate over collection; returning something\n   * (non-undefined) will stop iteration.\n   *\n   * @template T\n   * @param {Collection<T>} collection\n   * @param { ((item: T, idx: number) => (boolean|void)) | ((item: T, key: string) => (boolean|void)) } iterator\n   *\n   * @return {T} return result that stopped the iteration\n   */\n  function forEach$1(collection, iterator) {\n\n    let val,\n        result;\n\n    if (isUndefined$2(collection)) {\n      return;\n    }\n\n    const convertKey = isArray$3(collection) ? toNum$1 : identity$1;\n\n    for (let key in collection) {\n\n      if (has$1(collection, key)) {\n        val = collection[key];\n\n        result = iterator(val, convertKey(key));\n\n        if (result === false) {\n          return val;\n        }\n      }\n    }\n  }\n\n  /**\n   * Return collection without element.\n   *\n   * @template T\n   * @param {ArrayCollection<T>} arr\n   * @param {Matcher<T>} matcher\n   *\n   * @return {T[]}\n   */\n  function without(arr, matcher) {\n\n    if (isUndefined$2(arr)) {\n      return [];\n    }\n\n    ensureArray(arr);\n\n    const matchFn = toMatcher(matcher);\n\n    return arr.filter(function(el, idx) {\n      return !matchFn(el, idx);\n    });\n\n  }\n\n\n  /**\n   * Reduce collection, returning a single result.\n   *\n   * @template T\n   * @template V\n   *\n   * @param {Collection<T>} collection\n   * @param {(result: V, entry: T, index: any) => V} iterator\n   * @param {V} result\n   *\n   * @return {V} result returned from last iterator\n   */\n  function reduce(collection, iterator, result) {\n\n    forEach$1(collection, function(value, idx) {\n      result = iterator(result, value, idx);\n    });\n\n    return result;\n  }\n\n\n  /**\n   * Return true if every element in the collection\n   * matches the criteria.\n   *\n   * @param  {Object|Array} collection\n   * @param  {Function} matcher\n   *\n   * @return {Boolean}\n   */\n  function every(collection, matcher) {\n\n    return !!reduce(collection, function(matches, val, key) {\n      return matches && matcher(val, key);\n    }, true);\n  }\n\n\n  /**\n   * Return true if some elements in the collection\n   * match the criteria.\n   *\n   * @param  {Object|Array} collection\n   * @param  {Function} matcher\n   *\n   * @return {Boolean}\n   */\n  function some(collection, matcher) {\n\n    return !!find(collection, matcher);\n  }\n\n\n  /**\n   * Transform a collection into another collection\n   * by piping each member through the given fn.\n   *\n   * @param  {Object|Array}   collection\n   * @param  {Function} fn\n   *\n   * @return {Array} transformed collection\n   */\n  function map$1(collection, fn) {\n\n    let result = [];\n\n    forEach$1(collection, function(val, key) {\n      result.push(fn(val, key));\n    });\n\n    return result;\n  }\n\n\n  /**\n   * Get the collections keys.\n   *\n   * @param  {Object|Array} collection\n   *\n   * @return {Array}\n   */\n  function keys(collection) {\n    return collection && Object.keys(collection) || [];\n  }\n\n\n  /**\n   * Shorthand for `keys(o).length`.\n   *\n   * @param  {Object|Array} collection\n   *\n   * @return {Number}\n   */\n  function size(collection) {\n    return keys(collection).length;\n  }\n\n\n  /**\n   * Get the values in the collection.\n   *\n   * @param  {Object|Array} collection\n   *\n   * @return {Array}\n   */\n  function values(collection) {\n    return map$1(collection, (val) => val);\n  }\n\n\n  /**\n   * Group collection members by attribute.\n   *\n   * @param {Object|Array} collection\n   * @param {Extractor} extractor\n   *\n   * @return {Object} map with { attrValue => [ a, b, c ] }\n   */\n  function groupBy(collection, extractor, grouped = {}) {\n\n    extractor = toExtractor(extractor);\n\n    forEach$1(collection, function(val) {\n      let discriminator = extractor(val) || '_';\n\n      let group = grouped[discriminator];\n\n      if (!group) {\n        group = grouped[discriminator] = [];\n      }\n\n      group.push(val);\n    });\n\n    return grouped;\n  }\n\n\n  function uniqueBy(extractor, ...collections) {\n\n    extractor = toExtractor(extractor);\n\n    let grouped = {};\n\n    forEach$1(collections, (c) => groupBy(c, extractor, grouped));\n\n    let result = map$1(grouped, function(val, key) {\n      return val[0];\n    });\n\n    return result;\n  }\n\n\n  const unionBy = uniqueBy;\n\n\n\n  /**\n   * Sort collection by criteria.\n   *\n   * @template T\n   *\n   * @param {Collection<T>} collection\n   * @param {Extractor<T, number | string>} extractor\n   *\n   * @return {Array}\n   */\n  function sortBy(collection, extractor) {\n\n    extractor = toExtractor(extractor);\n\n    let sorted = [];\n\n    forEach$1(collection, function(value, key) {\n      let disc = extractor(value, key);\n\n      let entry = {\n        d: disc,\n        v: value\n      };\n\n      for (var idx = 0; idx < sorted.length; idx++) {\n        let { d } = sorted[idx];\n\n        if (disc < d) {\n          sorted.splice(idx, 0, entry);\n          return;\n        }\n      }\n\n      // not inserted, append (!)\n      sorted.push(entry);\n    });\n\n    return map$1(sorted, (e) => e.v);\n  }\n\n\n  /**\n   * Create an object pattern matcher.\n   *\n   * @example\n   *\n   * ```javascript\n   * const matcher = matchPattern({ id: 1 });\n   *\n   * let element = find(elements, matcher);\n   * ```\n   *\n   * @template T\n   *\n   * @param {T} pattern\n   *\n   * @return { (el: any) =>  boolean } matcherFn\n   */\n  function matchPattern(pattern) {\n\n    return function(el) {\n\n      return every(pattern, function(val, key) {\n        return el[key] === val;\n      });\n\n    };\n  }\n\n\n  /**\n   * @param {string | ((e: any) => any) } extractor\n   *\n   * @return { (e: any) => any }\n   */\n  function toExtractor(extractor) {\n\n    /**\n     * @satisfies { (e: any) => any }\n     */\n    return isFunction(extractor) ? extractor : (e) => {\n\n      // @ts-ignore: just works\n      return e[extractor];\n    };\n  }\n\n\n  /**\n   * @template T\n   * @param {Matcher<T>} matcher\n   *\n   * @return {MatchFn<T>}\n   */\n  function toMatcher(matcher) {\n    return isFunction(matcher) ? matcher : (e) => {\n      return e === matcher;\n    };\n  }\n\n\n  function identity$1(arg) {\n    return arg;\n  }\n\n  function toNum$1(arg) {\n    return Number(arg);\n  }\n\n  /* global setTimeout clearTimeout */\n\n  /**\n   * @typedef { {\n   *   (...args: any[]): any;\n   *   flush: () => void;\n   *   cancel: () => void;\n   * } } DebouncedFunction\n   */\n\n  /**\n   * Debounce fn, calling it only once if the given time\n   * elapsed between calls.\n   *\n   * Lodash-style the function exposes methods to `#clear`\n   * and `#flush` to control internal behavior.\n   *\n   * @param  {Function} fn\n   * @param  {Number} timeout\n   *\n   * @return {DebouncedFunction} debounced function\n   */\n  function debounce(fn, timeout) {\n\n    let timer;\n\n    let lastArgs;\n    let lastThis;\n\n    let lastNow;\n\n    function fire(force) {\n\n      let now = Date.now();\n\n      let scheduledDiff = force ? 0 : (lastNow + timeout) - now;\n\n      if (scheduledDiff > 0) {\n        return schedule(scheduledDiff);\n      }\n\n      fn.apply(lastThis, lastArgs);\n\n      clear();\n    }\n\n    function schedule(timeout) {\n      timer = setTimeout(fire, timeout);\n    }\n\n    function clear() {\n      if (timer) {\n        clearTimeout(timer);\n      }\n\n      timer = lastNow = lastArgs = lastThis = undefined;\n    }\n\n    function flush() {\n      if (timer) {\n        fire(true);\n      }\n\n      clear();\n    }\n\n    /**\n     * @type { DebouncedFunction }\n     */\n    function callback(...args) {\n      lastNow = Date.now();\n\n      lastArgs = args;\n      lastThis = this;\n\n      // ensure an execution is scheduled\n      if (!timer) {\n        schedule(timeout);\n      }\n    }\n\n    callback.flush = flush;\n    callback.cancel = clear;\n\n    return callback;\n  }\n\n  /**\n   * Bind function against target <this>.\n   *\n   * @param  {Function} fn\n   * @param  {Object}   target\n   *\n   * @return {Function} bound function\n   */\n  function bind$2(fn, target) {\n    return fn.bind(target);\n  }\n\n  /**\n   * Convenience wrapper for `Object.assign`.\n   *\n   * @param {Object} target\n   * @param {...Object} others\n   *\n   * @return {Object} the target\n   */\n  function assign$1(target, ...others) {\n    return Object.assign(target, ...others);\n  }\n\n  /**\n   * Pick properties from the given target.\n   *\n   * @template T\n   * @template {any[]} V\n   *\n   * @param {T} target\n   * @param {V} properties\n   *\n   * @return Pick<T, V>\n   */\n  function pick(target, properties) {\n\n    let result = {};\n\n    let obj = Object(target);\n\n    forEach$1(properties, function(prop) {\n\n      if (prop in obj) {\n        result[prop] = target[prop];\n      }\n    });\n\n    return result;\n  }\n\n  /**\n   * Pick all target properties, excluding the given ones.\n   *\n   * @template T\n   * @template {any[]} V\n   *\n   * @param {T} target\n   * @param {V} properties\n   *\n   * @return {Omit<T, V>} target\n   */\n  function omit(target, properties) {\n\n    let result = {};\n\n    let obj = Object(target);\n\n    forEach$1(obj, function(prop, key) {\n\n      if (properties.indexOf(key) === -1) {\n        result[key] = prop;\n      }\n    });\n\n    return result;\n  }\n\n  function _mergeNamespaces$1(n, m) {\n    m.forEach(function (e) {\n      e && typeof e !== 'string' && !Array.isArray(e) && Object.keys(e).forEach(function (k) {\n        if (k !== 'default' && !(k in n)) {\n          var d = Object.getOwnPropertyDescriptor(e, k);\n          Object.defineProperty(n, k, d.get ? d : {\n            enumerable: true,\n            get: function () { return e[k]; }\n          });\n        }\n      });\n    });\n    return Object.freeze(n);\n  }\n\n  /**\n   * Flatten array, one level deep.\n   *\n   * @param {Array<?>} arr\n   *\n   * @return {Array<?>}\n   */\n\n  const nativeToString = Object.prototype.toString;\n  const nativeHasOwnProperty = Object.prototype.hasOwnProperty;\n\n  function isUndefined$1(obj) {\n    return obj === undefined;\n  }\n\n  function isArray$2(obj) {\n    return nativeToString.call(obj) === '[object Array]';\n  }\n\n  /**\n   * Return true, if target owns a property with the given key.\n   *\n   * @param {Object} target\n   * @param {String} key\n   *\n   * @return {Boolean}\n   */\n  function has(target, key) {\n    return nativeHasOwnProperty.call(target, key);\n  }\n\n\n  /**\n   * Iterate over collection; returning something\n   * (non-undefined) will stop iteration.\n   *\n   * @param  {Array|Object} collection\n   * @param  {Function} iterator\n   *\n   * @return {Object} return result that stopped the iteration\n   */\n  function forEach(collection, iterator) {\n\n    let val,\n        result;\n\n    if (isUndefined$1(collection)) {\n      return;\n    }\n\n    const convertKey = isArray$2(collection) ? toNum : identity;\n\n    for (let key in collection) {\n\n      if (has(collection, key)) {\n        val = collection[key];\n\n        result = iterator(val, convertKey(key));\n\n        if (result === false) {\n          return val;\n        }\n      }\n    }\n  }\n\n\n  function identity(arg) {\n    return arg;\n  }\n\n  function toNum(arg) {\n    return Number(arg);\n  }\n\n  /**\n   * Assigns style attributes in a style-src compliant way.\n   *\n   * @param {Element} element\n   * @param {...Object} styleSources\n   *\n   * @return {Element} the element\n   */\n  function assign(element, ...styleSources) {\n    const target = element.style;\n\n    forEach(styleSources, function(style) {\n      if (!style) {\n        return;\n      }\n\n      forEach(style, function(value, key) {\n        target[key] = value;\n      });\n    });\n\n    return element;\n  }\n\n  /**\n   * Set attribute `name` to `val`, or get attr `name`.\n   *\n   * @param {Element} el\n   * @param {String} name\n   * @param {String} [val]\n   * @api public\n   */\n  function attr$1(el, name, val) {\n\n    // get\n    if (arguments.length == 2) {\n      return el.getAttribute(name);\n    }\n\n    // remove\n    if (val === null) {\n      return el.removeAttribute(name);\n    }\n\n    // set\n    el.setAttribute(name, val);\n\n    return el;\n  }\n\n  /**\n   * Taken from https://github.com/component/classes\n   *\n   * Without the component bits.\n   */\n\n  /**\n   * toString reference.\n   */\n\n  const toString$1 = Object.prototype.toString;\n\n  /**\n   * Wrap `el` in a `ClassList`.\n   *\n   * @param {Element} el\n   * @return {ClassList}\n   * @api public\n   */\n\n  function classes$1(el) {\n    return new ClassList$1(el);\n  }\n\n  /**\n   * Initialize a new ClassList for `el`.\n   *\n   * @param {Element} el\n   * @api private\n   */\n\n  function ClassList$1(el) {\n    if (!el || !el.nodeType) {\n      throw new Error('A DOM element reference is required');\n    }\n    this.el = el;\n    this.list = el.classList;\n  }\n\n  /**\n   * Add class `name` if not already present.\n   *\n   * @param {String} name\n   * @return {ClassList}\n   * @api public\n   */\n\n  ClassList$1.prototype.add = function(name) {\n    this.list.add(name);\n    return this;\n  };\n\n  /**\n   * Remove class `name` when present, or\n   * pass a regular expression to remove\n   * any which match.\n   *\n   * @param {String|RegExp} name\n   * @return {ClassList}\n   * @api public\n   */\n\n  ClassList$1.prototype.remove = function(name) {\n    if ('[object RegExp]' == toString$1.call(name)) {\n      return this.removeMatching(name);\n    }\n\n    this.list.remove(name);\n    return this;\n  };\n\n  /**\n   * Remove all classes matching `re`.\n   *\n   * @param {RegExp} re\n   * @return {ClassList}\n   * @api private\n   */\n\n  ClassList$1.prototype.removeMatching = function(re) {\n    const arr = this.array();\n    for (let i = 0; i < arr.length; i++) {\n      if (re.test(arr[i])) {\n        this.remove(arr[i]);\n      }\n    }\n    return this;\n  };\n\n  /**\n   * Toggle class `name`, can force state via `force`.\n   *\n   * For browsers that support classList, but do not support `force` yet,\n   * the mistake will be detected and corrected.\n   *\n   * @param {String} name\n   * @param {Boolean} force\n   * @return {ClassList}\n   * @api public\n   */\n\n  ClassList$1.prototype.toggle = function(name, force) {\n    if ('undefined' !== typeof force) {\n      if (force !== this.list.toggle(name, force)) {\n        this.list.toggle(name); // toggle again to correct\n      }\n    } else {\n      this.list.toggle(name);\n    }\n    return this;\n  };\n\n  /**\n   * Return an array of classes.\n   *\n   * @return {Array}\n   * @api public\n   */\n\n  ClassList$1.prototype.array = function() {\n    return Array.from(this.list);\n  };\n\n  /**\n   * Check if class `name` is present.\n   *\n   * @param {String} name\n   * @return {ClassList}\n   * @api public\n   */\n\n  ClassList$1.prototype.has =\n  ClassList$1.prototype.contains = function(name) {\n    return this.list.contains(name);\n  };\n\n  /**\n   * Remove all children from the given element.\n   */\n  function clear$1(el) {\n\n    var c;\n\n    while (el.childNodes.length) {\n      c = el.childNodes[0];\n      el.removeChild(c);\n    }\n\n    return el;\n  }\n\n  /**\n   * @param { HTMLElement } element\n   * @param { String } selector\n   *\n   * @return { boolean }\n   */\n  function matches(element, selector) {\n    return element && typeof element.matches === 'function' && element.matches(selector);\n  }\n\n  /**\n   * Closest\n   *\n   * @param {Element} el\n   * @param {String} selector\n   * @param {Boolean} checkYourSelf (optional)\n   */\n  function closest(element, selector, checkYourSelf) {\n    var currentElem = checkYourSelf ? element : element.parentNode;\n\n    while (currentElem && currentElem.nodeType !== document.DOCUMENT_NODE &&\n        currentElem.nodeType !== document.DOCUMENT_FRAGMENT_NODE) {\n\n      if (matches(currentElem, selector)) {\n        return currentElem;\n      }\n\n      currentElem = currentElem.parentNode;\n    }\n\n    return matches(currentElem, selector) ? currentElem : null;\n  }\n\n  var componentEvent = {};\n\n  var bind$1, unbind$1, prefix$6;\n\n  function detect () {\n    bind$1 = window.addEventListener ? 'addEventListener' : 'attachEvent';\n    unbind$1 = window.removeEventListener ? 'removeEventListener' : 'detachEvent';\n    prefix$6 = bind$1 !== 'addEventListener' ? 'on' : '';\n  }\n\n  /**\n   * Bind `el` event `type` to `fn`.\n   *\n   * @param {Element} el\n   * @param {String} type\n   * @param {Function} fn\n   * @param {Boolean} capture\n   * @return {Function}\n   * @api public\n   */\n\n  var bind_1 = componentEvent.bind = function(el, type, fn, capture){\n    if (!bind$1) detect();\n    el[bind$1](prefix$6 + type, fn, capture || false);\n    return fn;\n  };\n\n  /**\n   * Unbind `el` event `type`'s callback `fn`.\n   *\n   * @param {Element} el\n   * @param {String} type\n   * @param {Function} fn\n   * @param {Boolean} capture\n   * @return {Function}\n   * @api public\n   */\n\n  var unbind_1 = componentEvent.unbind = function(el, type, fn, capture){\n    if (!unbind$1) detect();\n    el[unbind$1](prefix$6 + type, fn, capture || false);\n    return fn;\n  };\n\n  var event = /*#__PURE__*/_mergeNamespaces$1({\n    __proto__: null,\n    bind: bind_1,\n    unbind: unbind_1,\n    'default': componentEvent\n  }, [componentEvent]);\n\n  /**\n   * Module dependencies.\n   */\n\n  /**\n   * Delegate event `type` to `selector`\n   * and invoke `fn(e)`. A callback function\n   * is returned which may be passed to `.unbind()`.\n   *\n   * @param {Element} el\n   * @param {String} selector\n   * @param {String} type\n   * @param {Function} fn\n   * @param {Boolean} capture\n   * @return {Function}\n   * @api public\n   */\n\n  // Some events don't bubble, so we want to bind to the capture phase instead\n  // when delegating.\n  var forceCaptureEvents = [ 'focus', 'blur' ];\n\n  function bind(el, selector, type, fn, capture) {\n    if (forceCaptureEvents.indexOf(type) !== -1) {\n      capture = true;\n    }\n\n    return event.bind(el, type, function(e) {\n      var target = e.target || e.srcElement;\n      e.delegateTarget = closest(target, selector, true);\n      if (e.delegateTarget) {\n        fn.call(el, e);\n      }\n    }, capture);\n  }\n\n  /**\n   * Unbind event `type`'s callback `fn`.\n   *\n   * @param {Element} el\n   * @param {String} type\n   * @param {Function} fn\n   * @param {Boolean} capture\n   * @api public\n   */\n  function unbind(el, type, fn, capture) {\n    if (forceCaptureEvents.indexOf(type) !== -1) {\n      capture = true;\n    }\n\n    return event.unbind(el, type, fn, capture);\n  }\n\n  var delegate = {\n    bind,\n    unbind\n  };\n\n  /**\n   * Expose `parse`.\n   */\n\n  var domify = parse$1;\n\n  /**\n   * Tests for browser support.\n   */\n\n  var innerHTMLBug = false;\n  var bugTestDiv;\n  if (typeof document !== 'undefined') {\n    bugTestDiv = document.createElement('div');\n    // Setup\n    bugTestDiv.innerHTML = '  <link/><table></table><a href=\"/a\">a</a><input type=\"checkbox\"/>';\n    // Make sure that link elements get serialized correctly by innerHTML\n    // This requires a wrapper element in IE\n    innerHTMLBug = !bugTestDiv.getElementsByTagName('link').length;\n    bugTestDiv = undefined;\n  }\n\n  /**\n   * Wrap map from jquery.\n   */\n\n  var map = {\n    legend: [1, '<fieldset>', '</fieldset>'],\n    tr: [2, '<table><tbody>', '</tbody></table>'],\n    col: [2, '<table><tbody></tbody><colgroup>', '</colgroup></table>'],\n    // for script/link/style tags to work in IE6-8, you have to wrap\n    // in a div with a non-whitespace character in front, ha!\n    _default: innerHTMLBug ? [1, 'X<div>', '</div>'] : [0, '', '']\n  };\n\n  map.td =\n  map.th = [3, '<table><tbody><tr>', '</tr></tbody></table>'];\n\n  map.option =\n  map.optgroup = [1, '<select multiple=\"multiple\">', '</select>'];\n\n  map.thead =\n  map.tbody =\n  map.colgroup =\n  map.caption =\n  map.tfoot = [1, '<table>', '</table>'];\n\n  map.polyline =\n  map.ellipse =\n  map.polygon =\n  map.circle =\n  map.text =\n  map.line =\n  map.path =\n  map.rect =\n  map.g = [1, '<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\">','</svg>'];\n\n  /**\n   * Parse `html` and return a DOM Node instance, which could be a TextNode,\n   * HTML DOM Node of some kind (<div> for example), or a DocumentFragment\n   * instance, depending on the contents of the `html` string.\n   *\n   * @param {String} html - HTML string to \"domify\"\n   * @param {Document} doc - The `document` instance to create the Node for\n   * @return {DOMNode} the TextNode, DOM Node, or DocumentFragment instance\n   * @api private\n   */\n\n  function parse$1(html, doc) {\n    if ('string' != typeof html) throw new TypeError('String expected');\n\n    // default to the global `document` object\n    if (!doc) doc = document;\n\n    // tag name\n    var m = /<([\\w:]+)/.exec(html);\n    if (!m) return doc.createTextNode(html);\n\n    html = html.replace(/^\\s+|\\s+$/g, ''); // Remove leading/trailing whitespace\n\n    var tag = m[1];\n\n    // body support\n    if (tag == 'body') {\n      var el = doc.createElement('html');\n      el.innerHTML = html;\n      return el.removeChild(el.lastChild);\n    }\n\n    // wrap map\n    var wrap = Object.prototype.hasOwnProperty.call(map, tag) ? map[tag] : map._default;\n    var depth = wrap[0];\n    var prefix = wrap[1];\n    var suffix = wrap[2];\n    var el = doc.createElement('div');\n    el.innerHTML = prefix + html + suffix;\n    while (depth--) el = el.lastChild;\n\n    // one element\n    if (el.firstChild == el.lastChild) {\n      return el.removeChild(el.firstChild);\n    }\n\n    // several elements\n    var fragment = doc.createDocumentFragment();\n    while (el.firstChild) {\n      fragment.appendChild(el.removeChild(el.firstChild));\n    }\n\n    return fragment;\n  }\n\n  var domify$1 = domify;\n\n  function query(selector, el) {\n    el = el || document;\n\n    return el.querySelector(selector);\n  }\n\n  function all(selector, el) {\n    el = el || document;\n\n    return el.querySelectorAll(selector);\n  }\n\n  function remove$2(el) {\n    el.parentNode && el.parentNode.removeChild(el);\n  }\n\n  function ensureImported(element, target) {\n\n    if (element.ownerDocument !== target.ownerDocument) {\n      try {\n\n        // may fail on webkit\n        return target.ownerDocument.importNode(element, true);\n      } catch (e) {\n\n        // ignore\n      }\n    }\n\n    return element;\n  }\n\n  /**\n   * appendTo utility\n   */\n\n  /**\n   * Append a node to a target element and return the appended node.\n   *\n   * @param  {SVGElement} element\n   * @param  {SVGElement} target\n   *\n   * @return {SVGElement} the appended node\n   */\n  function appendTo(element, target) {\n    return target.appendChild(ensureImported(element, target));\n  }\n\n  /**\n   * append utility\n   */\n\n  /**\n   * Append a node to an element\n   *\n   * @param  {SVGElement} element\n   * @param  {SVGElement} node\n   *\n   * @return {SVGElement} the element\n   */\n  function append(target, node) {\n    appendTo(node, target);\n    return target;\n  }\n\n  /**\n   * attribute accessor utility\n   */\n\n  var LENGTH_ATTR = 2;\n\n  var CSS_PROPERTIES = {\n    'alignment-baseline': 1,\n    'baseline-shift': 1,\n    'clip': 1,\n    'clip-path': 1,\n    'clip-rule': 1,\n    'color': 1,\n    'color-interpolation': 1,\n    'color-interpolation-filters': 1,\n    'color-profile': 1,\n    'color-rendering': 1,\n    'cursor': 1,\n    'direction': 1,\n    'display': 1,\n    'dominant-baseline': 1,\n    'enable-background': 1,\n    'fill': 1,\n    'fill-opacity': 1,\n    'fill-rule': 1,\n    'filter': 1,\n    'flood-color': 1,\n    'flood-opacity': 1,\n    'font': 1,\n    'font-family': 1,\n    'font-size': LENGTH_ATTR,\n    'font-size-adjust': 1,\n    'font-stretch': 1,\n    'font-style': 1,\n    'font-variant': 1,\n    'font-weight': 1,\n    'glyph-orientation-horizontal': 1,\n    'glyph-orientation-vertical': 1,\n    'image-rendering': 1,\n    'kerning': 1,\n    'letter-spacing': 1,\n    'lighting-color': 1,\n    'marker': 1,\n    'marker-end': 1,\n    'marker-mid': 1,\n    'marker-start': 1,\n    'mask': 1,\n    'opacity': 1,\n    'overflow': 1,\n    'pointer-events': 1,\n    'shape-rendering': 1,\n    'stop-color': 1,\n    'stop-opacity': 1,\n    'stroke': 1,\n    'stroke-dasharray': 1,\n    'stroke-dashoffset': 1,\n    'stroke-linecap': 1,\n    'stroke-linejoin': 1,\n    'stroke-miterlimit': 1,\n    'stroke-opacity': 1,\n    'stroke-width': LENGTH_ATTR,\n    'text-anchor': 1,\n    'text-decoration': 1,\n    'text-rendering': 1,\n    'unicode-bidi': 1,\n    'visibility': 1,\n    'word-spacing': 1,\n    'writing-mode': 1\n  };\n\n\n  function getAttribute(node, name) {\n    if (CSS_PROPERTIES[name]) {\n      return node.style[name];\n    } else {\n      return node.getAttributeNS(null, name);\n    }\n  }\n\n  function setAttribute(node, name, value) {\n    var hyphenated = name.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n\n    var type = CSS_PROPERTIES[hyphenated];\n\n    if (type) {\n\n      // append pixel unit, unless present\n      if (type === LENGTH_ATTR && typeof value === 'number') {\n        value = String(value) + 'px';\n      }\n\n      node.style[hyphenated] = value;\n    } else {\n      node.setAttributeNS(null, name, value);\n    }\n  }\n\n  function setAttributes(node, attrs) {\n\n    var names = Object.keys(attrs), i, name;\n\n    for (i = 0, name; (name = names[i]); i++) {\n      setAttribute(node, name, attrs[name]);\n    }\n  }\n\n  /**\n   * Gets or sets raw attributes on a node.\n   *\n   * @param  {SVGElement} node\n   * @param  {Object} [attrs]\n   * @param  {String} [name]\n   * @param  {String} [value]\n   *\n   * @return {String}\n   */\n  function attr(node, name, value) {\n    if (typeof name === 'string') {\n      if (value !== undefined) {\n        setAttribute(node, name, value);\n      } else {\n        return getAttribute(node, name);\n      }\n    } else {\n      setAttributes(node, name);\n    }\n\n    return node;\n  }\n\n  /**\r\n   * Taken from https://github.com/component/classes\r\n   *\r\n   * Without the component bits.\r\n   */\r\n\r\n  /**\r\n   * toString reference.\r\n   */\r\n\r\n  const toString = Object.prototype.toString;\r\n\r\n  /**\r\n    * Wrap `el` in a `ClassList`.\r\n    *\r\n    * @param {Element} el\r\n    * @return {ClassList}\r\n    * @api public\r\n    */\r\n\r\n  function classes(el) {\r\n    return new ClassList(el);\r\n  }\r\n\r\n  function ClassList(el) {\r\n    if (!el || !el.nodeType) {\r\n      throw new Error('A DOM element reference is required');\r\n    }\r\n    this.el = el;\r\n    this.list = el.classList;\r\n  }\r\n\r\n  /**\r\n    * Add class `name` if not already present.\r\n    *\r\n    * @param {String} name\r\n    * @return {ClassList}\r\n    * @api public\r\n    */\r\n\r\n  ClassList.prototype.add = function(name) {\r\n    this.list.add(name);\r\n    return this;\r\n  };\r\n\r\n  /**\r\n    * Remove class `name` when present, or\r\n    * pass a regular expression to remove\r\n    * any which match.\r\n    *\r\n    * @param {String|RegExp} name\r\n    * @return {ClassList}\r\n    * @api public\r\n    */\r\n\r\n  ClassList.prototype.remove = function(name) {\r\n    if ('[object RegExp]' == toString.call(name)) {\r\n      return this.removeMatching(name);\r\n    }\r\n\r\n    this.list.remove(name);\r\n    return this;\r\n  };\r\n\r\n  /**\r\n    * Remove all classes matching `re`.\r\n    *\r\n    * @param {RegExp} re\r\n    * @return {ClassList}\r\n    * @api private\r\n    */\r\n\r\n  ClassList.prototype.removeMatching = function(re) {\r\n    const arr = this.array();\r\n    for (let i = 0; i < arr.length; i++) {\r\n      if (re.test(arr[i])) {\r\n        this.remove(arr[i]);\r\n      }\r\n    }\r\n    return this;\r\n  };\r\n\r\n  /**\r\n    * Toggle class `name`, can force state via `force`.\r\n    *\r\n    * For browsers that support classList, but do not support `force` yet,\r\n    * the mistake will be detected and corrected.\r\n    *\r\n    * @param {String} name\r\n    * @param {Boolean} force\r\n    * @return {ClassList}\r\n    * @api public\r\n    */\r\n\r\n  ClassList.prototype.toggle = function(name, force) {\r\n    if ('undefined' !== typeof force) {\r\n      if (force !== this.list.toggle(name, force)) {\r\n        this.list.toggle(name); // toggle again to correct\r\n      }\r\n    } else {\r\n      this.list.toggle(name);\r\n    }\r\n    return this;\r\n  };\r\n\r\n  /**\r\n    * Return an array of classes.\r\n    *\r\n    * @return {Array}\r\n    * @api public\r\n    */\r\n\r\n  ClassList.prototype.array = function() {\r\n    return Array.from(this.list);\r\n  };\r\n\r\n  /**\r\n    * Check if class `name` is present.\r\n    *\r\n    * @param {String} name\r\n    * @return {ClassList}\r\n    * @api public\r\n    */\r\n\r\n  ClassList.prototype.has =\r\n   ClassList.prototype.contains = function(name) {\r\n     return this.list.contains(name);\r\n   };\n\n  function remove$1(element) {\n    var parent = element.parentNode;\n\n    if (parent) {\n      parent.removeChild(element);\n    }\n\n    return element;\n  }\n\n  /**\n   * Clear utility\n   */\n\n  /**\n   * Removes all children from the given element\n   *\n   * @param  {DOMElement} element\n   * @return {DOMElement} the element (for chaining)\n   */\n  function clear(element) {\n    var child;\n\n    while ((child = element.firstChild)) {\n      remove$1(child);\n    }\n\n    return element;\n  }\n\n  function clone$1(element) {\n    return element.cloneNode(true);\n  }\n\n  var ns = {\n    svg: 'http://www.w3.org/2000/svg'\n  };\n\n  /**\n   * DOM parsing utility\n   */\n\n  var SVG_START = '<svg xmlns=\"' + ns.svg + '\"';\n\n  function parse(svg) {\n\n    var unwrap = false;\n\n    // ensure we import a valid svg document\n    if (svg.substring(0, 4) === '<svg') {\n      if (svg.indexOf(ns.svg) === -1) {\n        svg = SVG_START + svg.substring(4);\n      }\n    } else {\n\n      // namespace svg\n      svg = SVG_START + '>' + svg + '</svg>';\n      unwrap = true;\n    }\n\n    var parsed = parseDocument(svg);\n\n    if (!unwrap) {\n      return parsed;\n    }\n\n    var fragment = document.createDocumentFragment();\n\n    var parent = parsed.firstChild;\n\n    while (parent.firstChild) {\n      fragment.appendChild(parent.firstChild);\n    }\n\n    return fragment;\n  }\n\n  function parseDocument(svg) {\n\n    var parser;\n\n    // parse\n    parser = new DOMParser();\n    parser.async = false;\n\n    return parser.parseFromString(svg, 'text/xml');\n  }\n\n  /**\n   * Create utility for SVG elements\n   */\n\n\n  /**\n   * Create a specific type from name or SVG markup.\n   *\n   * @param {String} name the name or markup of the element\n   * @param {Object} [attrs] attributes to set on the element\n   *\n   * @returns {SVGElement}\n   */\n  function create$1(name, attrs) {\n    var element;\n\n    if (name.charAt(0) === '<') {\n      element = parse(name).firstChild;\n      element = document.importNode(element, true);\n    } else {\n      element = document.createElementNS(ns.svg, name);\n    }\n\n    if (attrs) {\n      attr(element, attrs);\n    }\n\n    return element;\n  }\n\n  /**\n   * Geometry helpers\n   */\n\n  // fake node used to instantiate svg geometry elements\n  var node = null;\n\n  function getNode() {\n    if (node === null) {\n      node = create$1('svg');\n    }\n\n    return node;\n  }\n\n  function extend$1(object, props) {\n    var i, k, keys = Object.keys(props);\n\n    for (i = 0; (k = keys[i]); i++) {\n      object[k] = props[k];\n    }\n\n    return object;\n  }\n\n  /**\n   * Create matrix via args.\n   *\n   * @example\n   *\n   * createMatrix({ a: 1, b: 1 });\n   * createMatrix();\n   * createMatrix(1, 2, 0, 0, 30, 20);\n   *\n   * @return {SVGMatrix}\n   */\n  function createMatrix(a, b, c, d, e, f) {\n    var matrix = getNode().createSVGMatrix();\n\n    switch (arguments.length) {\n    case 0:\n      return matrix;\n    case 1:\n      return extend$1(matrix, a);\n    case 6:\n      return extend$1(matrix, {\n        a: a,\n        b: b,\n        c: c,\n        d: d,\n        e: e,\n        f: f\n      });\n    }\n  }\n\n  function createTransform(matrix) {\n    if (matrix) {\n      return getNode().createSVGTransformFromMatrix(matrix);\n    } else {\n      return getNode().createSVGTransform();\n    }\n  }\n\n  /**\n   * Serialization util\n   */\n\n  var TEXT_ENTITIES = /([&<>]{1})/g;\n  var ATTR_ENTITIES = /([\\n\\r\"]{1})/g;\n\n  var ENTITY_REPLACEMENT = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '\\''\n  };\n\n  function escape$1(str, pattern) {\n\n    function replaceFn(match, entity) {\n      return ENTITY_REPLACEMENT[entity] || entity;\n    }\n\n    return str.replace(pattern, replaceFn);\n  }\n\n  function serialize(node, output) {\n\n    var i, len, attrMap, attrNode, childNodes;\n\n    switch (node.nodeType) {\n\n    // TEXT\n    case 3:\n\n      // replace special XML characters\n      output.push(escape$1(node.textContent, TEXT_ENTITIES));\n      break;\n\n    // ELEMENT\n    case 1:\n      output.push('<', node.tagName);\n\n      if (node.hasAttributes()) {\n        attrMap = node.attributes;\n        for (i = 0, len = attrMap.length; i < len; ++i) {\n          attrNode = attrMap.item(i);\n          output.push(' ', attrNode.name, '=\"', escape$1(attrNode.value, ATTR_ENTITIES), '\"');\n        }\n      }\n\n      if (node.hasChildNodes()) {\n        output.push('>');\n        childNodes = node.childNodes;\n        for (i = 0, len = childNodes.length; i < len; ++i) {\n          serialize(childNodes.item(i), output);\n        }\n        output.push('</', node.tagName, '>');\n      } else {\n        output.push('/>');\n      }\n      break;\n\n    // COMMENT\n    case 8:\n      output.push('<!--', escape$1(node.nodeValue, TEXT_ENTITIES), '-->');\n      break;\n\n    // CDATA\n    case 4:\n      output.push('<![CDATA[', node.nodeValue, ']]>');\n      break;\n\n    default:\n      throw new Error('unable to handle node ' + node.nodeType);\n    }\n\n    return output;\n  }\n\n  /**\n   * innerHTML like functionality for SVG elements.\n   * based on innerSVG (https://code.google.com/p/innersvg)\n   */\n\n\n  function set$1(element, svg) {\n\n    var parsed = parse(svg);\n\n    // clear element contents\n    clear(element);\n\n    if (!svg) {\n      return;\n    }\n\n    if (!isFragment(parsed)) {\n\n      // extract <svg> from parsed document\n      parsed = parsed.documentElement;\n    }\n\n    var nodes = slice$1(parsed.childNodes);\n\n    // import + append each node\n    for (var i = 0; i < nodes.length; i++) {\n      appendTo(nodes[i], element);\n    }\n\n  }\n\n  function get$1(element) {\n    var child = element.firstChild,\n        output = [];\n\n    while (child) {\n      serialize(child, output);\n      child = child.nextSibling;\n    }\n\n    return output.join('');\n  }\n\n  function isFragment(node) {\n    return node.nodeName === '#document-fragment';\n  }\n\n  function innerSVG(element, svg) {\n\n    if (svg !== undefined) {\n\n      try {\n        set$1(element, svg);\n      } catch (e) {\n        throw new Error('error parsing SVG: ' + e.message);\n      }\n\n      return element;\n    } else {\n      return get$1(element);\n    }\n  }\n\n\n  function slice$1(arr) {\n    return Array.prototype.slice.call(arr);\n  }\n\n  /**\n   * transform accessor utility\n   */\n\n  function wrapMatrix(transformList, transform) {\n    if (transform instanceof SVGMatrix) {\n      return transformList.createSVGTransformFromMatrix(transform);\n    }\n\n    return transform;\n  }\n\n\n  function setTransforms(transformList, transforms) {\n    var i, t;\n\n    transformList.clear();\n\n    for (i = 0; (t = transforms[i]); i++) {\n      transformList.appendItem(wrapMatrix(transformList, t));\n    }\n  }\n\n  /**\n   * Get or set the transforms on the given node.\n   *\n   * @param {SVGElement} node\n   * @param  {SVGTransform|SVGMatrix|Array<SVGTransform|SVGMatrix>} [transforms]\n   *\n   * @return {SVGTransform} the consolidated transform\n   */\n  function transform$1(node, transforms) {\n    var transformList = node.transform.baseVal;\n\n    if (transforms) {\n\n      if (!Array.isArray(transforms)) {\n        transforms = [ transforms ];\n      }\n\n      setTransforms(transformList, transforms);\n    }\n\n    return transformList.consolidate();\n  }\n\n  const CLASS_PATTERN = /^class[ {]/;\n\n\n  /**\n   * @param {function} fn\n   *\n   * @return {boolean}\n   */\n  function isClass(fn) {\n    return CLASS_PATTERN.test(fn.toString());\n  }\n\n  /**\n   * @param {any} obj\n   *\n   * @return {boolean}\n   */\n  function isArray$1(obj) {\n    return Array.isArray(obj);\n  }\n\n  /**\n   * @param {any} obj\n   * @param {string} prop\n   *\n   * @return {boolean}\n   */\n  function hasOwnProp(obj, prop) {\n    return Object.prototype.hasOwnProperty.call(obj, prop);\n  }\n\n  /**\n   * @typedef {import('./index').InjectAnnotated } InjectAnnotated\n   */\n\n  /**\n   * @template T\n   *\n   * @params {[...string[], T] | ...string[], T} args\n   *\n   * @return {T & InjectAnnotated}\n   */\n  function annotate(...args) {\n\n    if (args.length === 1 && isArray$1(args[0])) {\n      args = args[0];\n    }\n\n    args = [ ...args ];\n\n    const fn = args.pop();\n\n    fn.$inject = args;\n\n    return fn;\n  }\n\n\n  // Current limitations:\n  // - can't put into \"function arg\" comments\n  // function /* (no parenthesis like this) */ (){}\n  // function abc( /* xx (no parenthesis like this) */ a, b) {}\n  //\n  // Just put the comment before function or inside:\n  // /* (((this is fine))) */ function(a, b) {}\n  // function abc(a) { /* (((this is fine))) */}\n  //\n  // - can't reliably auto-annotate constructor; we'll match the\n  // first constructor(...) pattern found which may be the one\n  // of a nested class, too.\n\n  const CONSTRUCTOR_ARGS = /constructor\\s*[^(]*\\(\\s*([^)]*)\\)/m;\n  const FN_ARGS = /^(?:async\\s+)?(?:function\\s*[^(]*)?(?:\\(\\s*([^)]*)\\)|(\\w+))/m;\n  const FN_ARG = /\\/\\*([^*]*)\\*\\//m;\n\n  /**\n   * @param {unknown} fn\n   *\n   * @return {string[]}\n   */\n  function parseAnnotations(fn) {\n\n    if (typeof fn !== 'function') {\n      throw new Error(`Cannot annotate \"${fn}\". Expected a function!`);\n    }\n\n    const match = fn.toString().match(isClass(fn) ? CONSTRUCTOR_ARGS : FN_ARGS);\n\n    // may parse class without constructor\n    if (!match) {\n      return [];\n    }\n\n    const args = match[1] || match[2];\n\n    return args && args.split(',').map(arg => {\n      const argMatch = arg.match(FN_ARG);\n      return (argMatch && argMatch[1] || arg).trim();\n    }) || [];\n  }\n\n  /**\n   * @typedef { import('./index').ModuleDeclaration } ModuleDeclaration\n   * @typedef { import('./index').ModuleDefinition } ModuleDefinition\n   * @typedef { import('./index').InjectorContext } InjectorContext\n   */\n\n  /**\n   * Create a new injector with the given modules.\n   *\n   * @param {ModuleDefinition[]} modules\n   * @param {InjectorContext} [parent]\n   */\n  function Injector(modules, parent) {\n    parent = parent || {\n      get: function(name, strict) {\n        currentlyResolving.push(name);\n\n        if (strict === false) {\n          return null;\n        } else {\n          throw error(`No provider for \"${ name }\"!`);\n        }\n      }\n    };\n\n    const currentlyResolving = [];\n    const providers = this._providers = Object.create(parent._providers || null);\n    const instances = this._instances = Object.create(null);\n\n    const self = instances.injector = this;\n\n    const error = function(msg) {\n      const stack = currentlyResolving.join(' -> ');\n      currentlyResolving.length = 0;\n      return new Error(stack ? `${ msg } (Resolving: ${ stack })` : msg);\n    };\n\n    /**\n     * Return a named service.\n     *\n     * @param {string} name\n     * @param {boolean} [strict=true] if false, resolve missing services to null\n     *\n     * @return {any}\n     */\n    function get(name, strict) {\n      if (!providers[name] && name.indexOf('.') !== -1) {\n        const parts = name.split('.');\n        let pivot = get(parts.shift());\n\n        while (parts.length) {\n          pivot = pivot[parts.shift()];\n        }\n\n        return pivot;\n      }\n\n      if (hasOwnProp(instances, name)) {\n        return instances[name];\n      }\n\n      if (hasOwnProp(providers, name)) {\n        if (currentlyResolving.indexOf(name) !== -1) {\n          currentlyResolving.push(name);\n          throw error('Cannot resolve circular dependency!');\n        }\n\n        currentlyResolving.push(name);\n        instances[name] = providers[name][0](providers[name][1]);\n        currentlyResolving.pop();\n\n        return instances[name];\n      }\n\n      return parent.get(name, strict);\n    }\n\n    function fnDef(fn, locals) {\n\n      if (typeof locals === 'undefined') {\n        locals = {};\n      }\n\n      if (typeof fn !== 'function') {\n        if (isArray$1(fn)) {\n          fn = annotate(fn.slice());\n        } else {\n          throw error(`Cannot invoke \"${ fn }\". Expected a function!`);\n        }\n      }\n\n      const inject = fn.$inject || parseAnnotations(fn);\n      const dependencies = inject.map(dep => {\n        if (hasOwnProp(locals, dep)) {\n          return locals[dep];\n        } else {\n          return get(dep);\n        }\n      });\n\n      return {\n        fn: fn,\n        dependencies: dependencies\n      };\n    }\n\n    function instantiate(Type) {\n      const {\n        fn,\n        dependencies\n      } = fnDef(Type);\n\n      // instantiate var args constructor\n      const Constructor = Function.prototype.bind.apply(fn, [ null ].concat(dependencies));\n\n      return new Constructor();\n    }\n\n    function invoke(func, context, locals) {\n      const {\n        fn,\n        dependencies\n      } = fnDef(func, locals);\n\n      return fn.apply(context, dependencies);\n    }\n\n    /**\n     * @param {Injector} childInjector\n     *\n     * @return {Function}\n     */\n    function createPrivateInjectorFactory(childInjector) {\n      return annotate(key => childInjector.get(key));\n    }\n\n    /**\n     * @param {ModuleDefinition[]} modules\n     * @param {string[]} [forceNewInstances]\n     *\n     * @return {Injector}\n     */\n    function createChild(modules, forceNewInstances) {\n      if (forceNewInstances && forceNewInstances.length) {\n        const fromParentModule = Object.create(null);\n        const matchedScopes = Object.create(null);\n\n        const privateInjectorsCache = [];\n        const privateChildInjectors = [];\n        const privateChildFactories = [];\n\n        let provider;\n        let cacheIdx;\n        let privateChildInjector;\n        let privateChildInjectorFactory;\n\n        for (let name in providers) {\n          provider = providers[name];\n\n          if (forceNewInstances.indexOf(name) !== -1) {\n            if (provider[2] === 'private') {\n              cacheIdx = privateInjectorsCache.indexOf(provider[3]);\n              if (cacheIdx === -1) {\n                privateChildInjector = provider[3].createChild([], forceNewInstances);\n                privateChildInjectorFactory = createPrivateInjectorFactory(privateChildInjector);\n                privateInjectorsCache.push(provider[3]);\n                privateChildInjectors.push(privateChildInjector);\n                privateChildFactories.push(privateChildInjectorFactory);\n                fromParentModule[name] = [ privateChildInjectorFactory, name, 'private', privateChildInjector ];\n              } else {\n                fromParentModule[name] = [ privateChildFactories[cacheIdx], name, 'private', privateChildInjectors[cacheIdx] ];\n              }\n            } else {\n              fromParentModule[name] = [ provider[2], provider[1] ];\n            }\n            matchedScopes[name] = true;\n          }\n\n          if ((provider[2] === 'factory' || provider[2] === 'type') && provider[1].$scope) {\n            /* jshint -W083 */\n            forceNewInstances.forEach(scope => {\n              if (provider[1].$scope.indexOf(scope) !== -1) {\n                fromParentModule[name] = [ provider[2], provider[1] ];\n                matchedScopes[scope] = true;\n              }\n            });\n          }\n        }\n\n        forceNewInstances.forEach(scope => {\n          if (!matchedScopes[scope]) {\n            throw new Error('No provider for \"' + scope + '\". Cannot use provider from the parent!');\n          }\n        });\n\n        modules.unshift(fromParentModule);\n      }\n\n      return new Injector(modules, self);\n    }\n\n    const factoryMap = {\n      factory: invoke,\n      type: instantiate,\n      value: function(value) {\n        return value;\n      }\n    };\n\n    /**\n     * @param {ModuleDefinition} moduleDefinition\n     * @param {Injector} injector\n     */\n    function createInitializer(moduleDefinition, injector) {\n\n      const initializers = moduleDefinition.__init__ || [];\n\n      return function() {\n        initializers.forEach(initializer => {\n\n          // eagerly resolve component (fn or string)\n          if (typeof initializer === 'string') {\n            injector.get(initializer);\n          } else {\n            injector.invoke(initializer);\n          }\n        });\n      };\n    }\n\n    /**\n     * @param {ModuleDefinition} moduleDefinition\n     */\n    function loadModule(moduleDefinition) {\n\n      const moduleExports = moduleDefinition.__exports__;\n\n      // private module\n      if (moduleExports) {\n        const nestedModules = moduleDefinition.__modules__;\n\n        const clonedModule = Object.keys(moduleDefinition).reduce((clonedModule, key) => {\n\n          if (key !== '__exports__' && key !== '__modules__' && key !== '__init__' && key !== '__depends__') {\n            clonedModule[key] = moduleDefinition[key];\n          }\n\n          return clonedModule;\n        }, Object.create(null));\n\n        const childModules = (nestedModules || []).concat(clonedModule);\n\n        const privateInjector = createChild(childModules);\n        const getFromPrivateInjector = annotate(function(key) {\n          return privateInjector.get(key);\n        });\n\n        moduleExports.forEach(function(key) {\n          providers[key] = [ getFromPrivateInjector, key, 'private', privateInjector ];\n        });\n\n        // ensure child injector initializes\n        const initializers = (moduleDefinition.__init__ || []).slice();\n\n        initializers.unshift(function() {\n          privateInjector.init();\n        });\n\n        moduleDefinition = Object.assign({}, moduleDefinition, {\n          __init__: initializers\n        });\n\n        return createInitializer(moduleDefinition, privateInjector);\n      }\n\n      // normal module\n      Object.keys(moduleDefinition).forEach(function(key) {\n\n        if (key === '__init__' || key === '__depends__') {\n          return;\n        }\n\n        if (moduleDefinition[key][2] === 'private') {\n          providers[key] = moduleDefinition[key];\n          return;\n        }\n\n        const type = moduleDefinition[key][0];\n        const value = moduleDefinition[key][1];\n\n        providers[key] = [ factoryMap[type], arrayUnwrap(type, value), type ];\n      });\n\n      return createInitializer(moduleDefinition, self);\n    }\n\n    /**\n     * @param {ModuleDefinition[]} moduleDefinitions\n     * @param {ModuleDefinition} moduleDefinition\n     *\n     * @return {ModuleDefinition[]}\n     */\n    function resolveDependencies(moduleDefinitions, moduleDefinition) {\n\n      if (moduleDefinitions.indexOf(moduleDefinition) !== -1) {\n        return moduleDefinitions;\n      }\n\n      moduleDefinitions = (moduleDefinition.__depends__ || []).reduce(resolveDependencies, moduleDefinitions);\n\n      if (moduleDefinitions.indexOf(moduleDefinition) !== -1) {\n        return moduleDefinitions;\n      }\n\n      return moduleDefinitions.concat(moduleDefinition);\n    }\n\n    /**\n     * @param {ModuleDefinition[]} moduleDefinitions\n     *\n     * @return { () => void } initializerFn\n     */\n    function bootstrap(moduleDefinitions) {\n\n      const initializers = moduleDefinitions\n        .reduce(resolveDependencies, [])\n        .map(loadModule);\n\n      let initialized = false;\n\n      return function() {\n\n        if (initialized) {\n          return;\n        }\n\n        initialized = true;\n\n        initializers.forEach(initializer => initializer());\n      };\n    }\n\n    // public API\n    this.get = get;\n    this.invoke = invoke;\n    this.instantiate = instantiate;\n    this.createChild = createChild;\n\n    // setup\n    this.init = bootstrap(modules);\n  }\n\n\n  // helpers ///////////////\n\n  function arrayUnwrap(type, value) {\n    if (type !== 'value' && isArray$1(value)) {\n      value = annotate(value.slice());\n    }\n\n    return value;\n  }\n\n  var DEFAULT_RENDER_PRIORITY$1 = 1000;\n\n  /**\n   * @typedef {import('../core/Types').ElementLike} Element\n   * @typedef {import('../core/Types').ConnectionLike} Connection\n   * @typedef {import('../core/Types').ShapeLike} Shape\n   *\n   * @typedef {import('../core/EventBus').default} EventBus\n   */\n\n  /**\n   * The base implementation of shape and connection renderers.\n   *\n   * @param {EventBus} eventBus\n   * @param {number} [renderPriority=1000]\n   */\n  function BaseRenderer(eventBus, renderPriority) {\n    var self = this;\n\n    renderPriority = renderPriority || DEFAULT_RENDER_PRIORITY$1;\n\n    eventBus.on([ 'render.shape', 'render.connection' ], renderPriority, function(evt, context) {\n      var type = evt.type,\n          element = context.element,\n          visuals = context.gfx,\n          attrs = context.attrs;\n\n      if (self.canRender(element)) {\n        if (type === 'render.shape') {\n          return self.drawShape(visuals, element, attrs);\n        } else {\n          return self.drawConnection(visuals, element, attrs);\n        }\n      }\n    });\n\n    eventBus.on([ 'render.getShapePath', 'render.getConnectionPath' ], renderPriority, function(evt, element) {\n      if (self.canRender(element)) {\n        if (evt.type === 'render.getShapePath') {\n          return self.getShapePath(element);\n        } else {\n          return self.getConnectionPath(element);\n        }\n      }\n    });\n  }\n\n  /**\n   * Checks whether an element can be rendered.\n   *\n   * @param {Element} element The element to be rendered.\n   *\n   * @return {boolean} Whether the element can be rendered.\n   */\n  BaseRenderer.prototype.canRender = function(element) {};\n\n  /**\n   * Draws a shape.\n   *\n   * @param {SVGElement} visuals The SVG element to draw the shape into.\n   * @param {Shape} shape The shape to be drawn.\n   *\n   * @return {SVGElement} The SVG element of the shape drawn.\n   */\n  BaseRenderer.prototype.drawShape = function(visuals, shape) {};\n\n  /**\n   * Draws a connection.\n   *\n   * @param {SVGElement} visuals The SVG element to draw the connection into.\n   * @param {Connection} connection The connection to be drawn.\n   *\n   * @return {SVGElement} The SVG element of the connection drawn.\n   */\n  BaseRenderer.prototype.drawConnection = function(visuals, connection) {};\n\n  /**\n   * Gets the SVG path of the graphical representation of a shape.\n   *\n   * @param {Shape} shape The shape.\n   *\n   * @return {string} The SVG path of the shape.\n   */\n  BaseRenderer.prototype.getShapePath = function(shape) {};\n\n  /**\n   * Gets the SVG path of the graphical representation of a connection.\n   *\n   * @param {Connection} connection The connection.\n   *\n   * @return {string} The SVG path of the connection.\n   */\n  BaseRenderer.prototype.getConnectionPath = function(connection) {};\n\n  /**\n   * @typedef {(string|number)[]} Component\n   *\n   * @typedef {import('../util/Types').Point} Point\n   */\n\n  /**\n   * @param {Component[] | Component[][]} elements\n   *\n   * @return {string}\n   */\n  function componentsToPath(elements) {\n    return elements.flat().join(',').replace(/,?([A-z]),?/g, '$1');\n  }\n\n  /**\n   * @param {Point} point\n   *\n   * @return {Component[]}\n   */\n  function move(point) {\n    return [ 'M', point.x, point.y ];\n  }\n\n  /**\n   * @param {Point} point\n   *\n   * @return {Component[]}\n   */\n  function lineTo(point) {\n    return [ 'L', point.x, point.y ];\n  }\n\n  /**\n   * @param {Point} p1\n   * @param {Point} p2\n   * @param {Point} p3\n   *\n   * @return {Component[]}\n   */\n  function curveTo(p1, p2, p3) {\n    return [ 'C', p1.x, p1.y, p2.x, p2.y, p3.x, p3.y ];\n  }\n\n  /**\n   * @param {Point[]} waypoints\n   * @param {number} [cornerRadius]\n   * @return {Component[][]}\n   */\n  function drawPath(waypoints, cornerRadius) {\n    const pointCount = waypoints.length;\n\n    const path = [ move(waypoints[0]) ];\n\n    for (let i = 1; i < pointCount; i++) {\n\n      const pointBefore = waypoints[i - 1];\n      const point = waypoints[i];\n      const pointAfter = waypoints[i + 1];\n\n      if (!pointAfter || !cornerRadius) {\n        path.push(lineTo(point));\n\n        continue;\n      }\n\n      const effectiveRadius = Math.min(\n        cornerRadius,\n        vectorLength$1(point.x - pointBefore.x, point.y - pointBefore.y),\n        vectorLength$1(pointAfter.x - point.x, pointAfter.y - point.y)\n      );\n\n      if (!effectiveRadius) {\n        path.push(lineTo(point));\n\n        continue;\n      }\n\n      const beforePoint = getPointAtLength(point, pointBefore, effectiveRadius);\n      const beforePoint2 = getPointAtLength(point, pointBefore, effectiveRadius * .5);\n\n      const afterPoint = getPointAtLength(point, pointAfter, effectiveRadius);\n      const afterPoint2 = getPointAtLength(point, pointAfter, effectiveRadius * .5);\n\n      path.push(lineTo(beforePoint));\n      path.push(curveTo(beforePoint2, afterPoint2, afterPoint));\n    }\n\n    return path;\n  }\n\n  function getPointAtLength(start, end, length) {\n\n    const deltaX = end.x - start.x;\n    const deltaY = end.y - start.y;\n\n    const totalLength = vectorLength$1(deltaX, deltaY);\n\n    const percent = length / totalLength;\n\n    return {\n      x: start.x + deltaX * percent,\n      y: start.y + deltaY * percent\n    };\n  }\n\n  function vectorLength$1(x, y) {\n    return Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));\n  }\n\n  /**\n   * @param {Point[]} points\n   * @param {number|Object} [attrs]\n   * @param {number} [radius]\n   *\n   * @return {SVGElement}\n   */\n  function createLine(points, attrs, radius) {\n\n    if (isNumber(attrs)) {\n      radius = attrs;\n      attrs = null;\n    }\n\n    if (!attrs) {\n      attrs = {};\n    }\n\n    const line = create$1('path', attrs);\n\n    if (isNumber(radius)) {\n      line.dataset.cornerRadius = String(radius);\n    }\n\n    return updateLine(line, points);\n  }\n\n  /**\n   * @param {SVGElement} gfx\n   * @param {Point[]} points\n   *\n   * @return {SVGElement}\n   */\n  function updateLine(gfx, points) {\n\n    const cornerRadius = parseInt(gfx.dataset.cornerRadius, 10) || 0;\n\n    attr(gfx, {\n      d: componentsToPath(drawPath(points, cornerRadius))\n    });\n\n    return gfx;\n  }\n\n  /**\n   * @typedef {import('../model/Types').Connection} Connection\n   * @typedef {import('../model/Types').Element} Element\n   * @typedef {import('../model/Types').Shape} Shape\n   *\n   * @typedef {import('../../type/Types').Rect} Rect\n   *\n   * @typedef { {\n   *   allShapes: Record<string, Shape>,\n   *   allConnections: Record<string, Connection>,\n   *   topLevel: Record<string, Element>,\n   *   enclosedConnections: Record<string, Connection>,\n   *   enclosedElements: Record<string, Element>\n   * } } Closure\n   */\n\n  /**\n   * Get parent elements.\n   *\n   * @param {Element[]} elements\n   *\n   * @return {Element[]}\n   */\n  function getParents$1(elements) {\n\n    // find elements that are not children of any other elements\n    return filter(elements, function(element) {\n      return !find(elements, function(e) {\n        return e !== element && getParent$1(element, e);\n      });\n    });\n  }\n\n\n  function getParent$1(element, parent) {\n    if (!parent) {\n      return;\n    }\n\n    if (element === parent) {\n      return parent;\n    }\n\n    if (!element.parent) {\n      return;\n    }\n\n    return getParent$1(element.parent, parent);\n  }\n\n\n  /**\n   * Adds an element to a collection and returns true if the\n   * element was added.\n   *\n   * @param {Object[]} elements\n   * @param {Object} element\n   * @param {boolean} [unique]\n   */\n  function add$1(elements, element, unique) {\n    var canAdd = !unique || elements.indexOf(element) === -1;\n\n    if (canAdd) {\n      elements.push(element);\n    }\n\n    return canAdd;\n  }\n\n\n  /**\n   * Iterate over each element in a collection, calling the iterator function `fn`\n   * with (element, index, recursionDepth).\n   *\n   * Recurse into all elements that are returned by `fn`.\n   *\n   * @param {Element|Element[]} elements\n   * @param {(element: Element, index: number, depth: number) => Element[] | boolean | undefined} fn\n   * @param {number} [depth] maximum recursion depth\n   */\n  function eachElement(elements, fn, depth) {\n\n    depth = depth || 0;\n\n    if (!isArray$3(elements)) {\n      elements = [ elements ];\n    }\n\n    forEach$1(elements, function(s, i) {\n      var filter = fn(s, i, depth);\n\n      if (isArray$3(filter) && filter.length) {\n        eachElement(filter, fn, depth + 1);\n      }\n    });\n  }\n\n\n  /**\n   * Collects self + child elements up to a given depth from a list of elements.\n   *\n   * @param {Element|Element[]} elements the elements to select the children from\n   * @param {boolean} unique whether to return a unique result set (no duplicates)\n   * @param {number} maxDepth the depth to search through or -1 for infinite\n   *\n   * @return {Element[]} found elements\n   */\n  function selfAndChildren(elements, unique, maxDepth) {\n    var result = [],\n        processedChildren = [];\n\n    eachElement(elements, function(element, i, depth) {\n      add$1(result, element, unique);\n\n      var children = element.children;\n\n      // max traversal depth not reached yet\n      if (maxDepth === -1 || depth < maxDepth) {\n\n        // children exist && children not yet processed\n        if (children && add$1(processedChildren, children, unique)) {\n          return children;\n        }\n      }\n    });\n\n    return result;\n  }\n\n\n  /**\n   * Return self + ALL children for a number of elements\n   *\n   * @param {Element[]} elements to query\n   * @param {boolean} [allowDuplicates] to allow duplicates in the result set\n   *\n   * @return {Element[]} the collected elements\n   */\n  function selfAndAllChildren(elements, allowDuplicates) {\n    return selfAndChildren(elements, !allowDuplicates, -1);\n  }\n\n\n  /**\n   * Gets the the closure for all selected elements,\n   * their enclosed children and connections.\n   *\n   * @param {Element[]} elements\n   * @param {boolean} [isTopLevel=true]\n   * @param {Closure} [closure]\n   *\n   * @return {Closure} newClosure\n   */\n  function getClosure(elements, isTopLevel, closure) {\n\n    if (isUndefined$2(isTopLevel)) {\n      isTopLevel = true;\n    }\n\n    if (isObject(isTopLevel)) {\n      closure = isTopLevel;\n      isTopLevel = true;\n    }\n\n\n    closure = closure || {};\n\n    var allShapes = copyObject(closure.allShapes),\n        allConnections = copyObject(closure.allConnections),\n        enclosedElements = copyObject(closure.enclosedElements),\n        enclosedConnections = copyObject(closure.enclosedConnections);\n\n    var topLevel = copyObject(\n      closure.topLevel,\n      isTopLevel && groupBy(elements, function(e) { return e.id; })\n    );\n\n\n    function handleConnection(c) {\n      if (topLevel[c.source.id] && topLevel[c.target.id]) {\n        topLevel[c.id] = [ c ];\n      }\n\n      // not enclosed as a child, but maybe logically\n      // (connecting two moved elements?)\n      if (allShapes[c.source.id] && allShapes[c.target.id]) {\n        enclosedConnections[c.id] = enclosedElements[c.id] = c;\n      }\n\n      allConnections[c.id] = c;\n    }\n\n    function handleElement(element) {\n\n      enclosedElements[element.id] = element;\n\n      if (element.waypoints) {\n\n        // remember connection\n        enclosedConnections[element.id] = allConnections[element.id] = element;\n      } else {\n\n        // remember shape\n        allShapes[element.id] = element;\n\n        // remember all connections\n        forEach$1(element.incoming, handleConnection);\n\n        forEach$1(element.outgoing, handleConnection);\n\n        // recurse into children\n        return element.children;\n      }\n    }\n\n    eachElement(elements, handleElement);\n\n    return {\n      allShapes: allShapes,\n      allConnections: allConnections,\n      topLevel: topLevel,\n      enclosedConnections: enclosedConnections,\n      enclosedElements: enclosedElements\n    };\n  }\n\n  /**\n   * Returns the surrounding bbox for all elements in\n   * the array or the element primitive.\n   *\n   * @param {Element|Element[]} elements\n   * @param {boolean} [stopRecursion=false]\n   *\n   * @return {Rect}\n   */\n  function getBBox(elements, stopRecursion) {\n\n    stopRecursion = !!stopRecursion;\n    if (!isArray$3(elements)) {\n      elements = [ elements ];\n    }\n\n    var minX,\n        minY,\n        maxX,\n        maxY;\n\n    forEach$1(elements, function(element) {\n\n      // If element is a connection the bbox must be computed first\n      var bbox = element;\n      if (element.waypoints && !stopRecursion) {\n        bbox = getBBox(element.waypoints, true);\n      }\n\n      var x = bbox.x,\n          y = bbox.y,\n          height = bbox.height || 0,\n          width = bbox.width || 0;\n\n      if (x < minX || minX === undefined) {\n        minX = x;\n      }\n      if (y < minY || minY === undefined) {\n        minY = y;\n      }\n\n      if ((x + width) > maxX || maxX === undefined) {\n        maxX = x + width;\n      }\n      if ((y + height) > maxY || maxY === undefined) {\n        maxY = y + height;\n      }\n    });\n\n    return {\n      x: minX,\n      y: minY,\n      height: maxY - minY,\n      width: maxX - minX\n    };\n  }\n\n\n  /**\n   * Returns all elements that are enclosed from the bounding box.\n   *\n   *   * If bbox.(width|height) is not specified the method returns\n   *     all elements with element.x/y > bbox.x/y\n   *   * If only bbox.x or bbox.y is specified, method return all elements with\n   *     e.x > bbox.x or e.y > bbox.y\n   *\n   * @param {Element[]} elements List of Elements to search through\n   * @param {Rect} bbox the enclosing bbox.\n   *\n   * @return {Element[]} enclosed elements\n   */\n  function getEnclosedElements(elements, bbox) {\n\n    var filteredElements = {};\n\n    forEach$1(elements, function(element) {\n\n      var e = element;\n\n      if (e.waypoints) {\n        e = getBBox(e);\n      }\n\n      if (!isNumber(bbox.y) && (e.x > bbox.x)) {\n        filteredElements[element.id] = element;\n      }\n      if (!isNumber(bbox.x) && (e.y > bbox.y)) {\n        filteredElements[element.id] = element;\n      }\n      if (e.x > bbox.x && e.y > bbox.y) {\n        if (isNumber(bbox.width) && isNumber(bbox.height) &&\n            e.width + e.x < bbox.width + bbox.x &&\n            e.height + e.y < bbox.height + bbox.y) {\n\n          filteredElements[element.id] = element;\n        } else if (!isNumber(bbox.width) || !isNumber(bbox.height)) {\n          filteredElements[element.id] = element;\n        }\n      }\n    });\n\n    return filteredElements;\n  }\n\n  /**\n   * Get the element's type\n   *\n   * @param {Element} element\n   *\n   * @return {'connection' | 'shape' | 'root'}\n   */\n  function getType(element) {\n\n    if ('waypoints' in element) {\n      return 'connection';\n    }\n\n    if ('x' in element) {\n      return 'shape';\n    }\n\n    return 'root';\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isFrameElement$1(element) {\n    return !!(element && element.isFrame);\n  }\n\n  // helpers ///////////////////////////////\n\n  function copyObject(src1, src2) {\n    return assign$1({}, src1 || {}, src2 || {});\n  }\n\n  /**\n   * @typedef {import('../core/EventBus').default} EventBus\n   * @typedef {import('./Styles').default} Styles\n   */\n\n  // apply default renderer with lowest possible priority\n  // so that it only kicks in if noone else could render\n  var DEFAULT_RENDER_PRIORITY = 1;\n\n  /**\n   * The default renderer used for shapes and connections.\n   *\n   * @param {EventBus} eventBus\n   * @param {Styles} styles\n   */\n  function DefaultRenderer(eventBus, styles) {\n\n    BaseRenderer.call(this, eventBus, DEFAULT_RENDER_PRIORITY);\n\n    this.CONNECTION_STYLE = styles.style([ 'no-fill' ], { strokeWidth: 5, stroke: 'fuchsia' });\n    this.SHAPE_STYLE = styles.style({ fill: 'white', stroke: 'fuchsia', strokeWidth: 2 });\n    this.FRAME_STYLE = styles.style([ 'no-fill' ], { stroke: 'fuchsia', strokeDasharray: 4, strokeWidth: 2 });\n  }\n\n  e$3(DefaultRenderer, BaseRenderer);\n\n\n  /**\n   * @private\n   */\n  DefaultRenderer.prototype.canRender = function() {\n    return true;\n  };\n\n  /**\n   * @private\n   */\n  DefaultRenderer.prototype.drawShape = function drawShape(visuals, element, attrs) {\n    var rect = create$1('rect');\n\n    attr(rect, {\n      x: 0,\n      y: 0,\n      width: element.width || 0,\n      height: element.height || 0\n    });\n\n    if (isFrameElement$1(element)) {\n      attr(rect, assign$1({}, this.FRAME_STYLE, attrs || {}));\n    } else {\n      attr(rect, assign$1({}, this.SHAPE_STYLE, attrs || {}));\n    }\n\n    append(visuals, rect);\n\n    return rect;\n  };\n\n  /**\n   * @private\n   */\n  DefaultRenderer.prototype.drawConnection = function drawConnection(visuals, connection, attrs) {\n\n    var line = createLine(connection.waypoints, assign$1({}, this.CONNECTION_STYLE, attrs || {}));\n    append(visuals, line);\n\n    return line;\n  };\n\n  /**\n   * @private\n   */\n  DefaultRenderer.prototype.getShapePath = function getShapePath(shape) {\n\n    var x = shape.x,\n        y = shape.y,\n        width = shape.width,\n        height = shape.height;\n\n    var shapePath = [\n      [ 'M', x, y ],\n      [ 'l', width, 0 ],\n      [ 'l', 0, height ],\n      [ 'l', -width, 0 ],\n      [ 'z' ]\n    ];\n\n    return componentsToPath(shapePath);\n  };\n\n  /**\n   * @private\n   */\n  DefaultRenderer.prototype.getConnectionPath = function getConnectionPath(connection) {\n    var waypoints = connection.waypoints;\n\n    var idx, point, connectionPath = [];\n\n    for (idx = 0; (point = waypoints[idx]); idx++) {\n\n      // take invisible docking into account\n      // when creating the path\n      point = point.original || point;\n\n      connectionPath.push([ idx === 0 ? 'M' : 'L', point.x, point.y ]);\n    }\n\n    return componentsToPath(connectionPath);\n  };\n\n  DefaultRenderer.$inject = [ 'eventBus', 'styles' ];\n\n  /**\n   * A component that manages shape styles\n   */\n  function Styles() {\n\n    var defaultTraits = {\n\n      'no-fill': {\n        fill: 'none'\n      },\n      'no-border': {\n        strokeOpacity: 0.0\n      },\n      'no-events': {\n        pointerEvents: 'none'\n      }\n    };\n\n    var self = this;\n\n    /**\n     * Builds a style definition from a className, a list of traits and an object\n     * of additional attributes.\n     *\n     * @param {string} className\n     * @param {string[]} [traits]\n     * @param {Object} [additionalAttrs]\n     *\n     * @return {Object} the style definition\n     */\n    this.cls = function(className, traits, additionalAttrs) {\n      var attrs = this.style(traits, additionalAttrs);\n\n      return assign$1(attrs, { 'class': className });\n    };\n\n    /**\n     * Builds a style definition from a list of traits and an object of additional\n     * attributes.\n     *\n     * @param {string[]} [traits]\n     * @param {Object} additionalAttrs\n     *\n     * @return {Object} the style definition\n     */\n    this.style = function(traits, additionalAttrs) {\n\n      if (!isArray$3(traits) && !additionalAttrs) {\n        additionalAttrs = traits;\n        traits = [];\n      }\n\n      var attrs = reduce(traits, function(attrs, t) {\n        return assign$1(attrs, defaultTraits[t] || {});\n      }, {});\n\n      return additionalAttrs ? assign$1(attrs, additionalAttrs) : attrs;\n    };\n\n\n    /**\n     * Computes a style definition from a list of traits and an object of\n     * additional attributes, with custom style definition object.\n     *\n     * @param {Object} custom\n     * @param {string[]} [traits]\n     * @param {Object} defaultStyles\n     *\n     * @return {Object} the style definition\n     */\n    this.computeStyle = function(custom, traits, defaultStyles) {\n      if (!isArray$3(traits)) {\n        defaultStyles = traits;\n        traits = [];\n      }\n\n      return self.style(traits || [], assign$1({}, defaultStyles, custom || {}));\n    };\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var DrawModule$1 = {\n    __init__: [ 'defaultRenderer' ],\n    defaultRenderer: [ 'type', DefaultRenderer ],\n    styles: [ 'type', Styles ]\n  };\n\n  /**\n   * Failsafe remove an element from a collection\n   *\n   * @param {Array<Object>} [collection]\n   * @param {Object} [element]\n   *\n   * @return {number} the previous index of the element\n   */\n  function remove(collection, element) {\n\n    if (!collection || !element) {\n      return -1;\n    }\n\n    var idx = collection.indexOf(element);\n\n    if (idx !== -1) {\n      collection.splice(idx, 1);\n    }\n\n    return idx;\n  }\n\n  /**\n   * Fail save add an element to the given connection, ensuring\n   * it does not yet exist.\n   *\n   * @param {Array<Object>} collection\n   * @param {Object} element\n   * @param {number} [idx]\n   */\n  function add(collection, element, idx) {\n\n    if (!collection || !element) {\n      return;\n    }\n\n    if (typeof idx !== 'number') {\n      idx = -1;\n    }\n\n    var currentIdx = collection.indexOf(element);\n\n    if (currentIdx !== -1) {\n\n      if (currentIdx === idx) {\n\n        // nothing to do, position has not changed\n        return;\n      } else {\n\n        if (idx !== -1) {\n\n          // remove from current position\n          collection.splice(currentIdx, 1);\n        } else {\n\n          // already exists in collection\n          return;\n        }\n      }\n    }\n\n    if (idx !== -1) {\n\n      // insert at specified position\n      collection.splice(idx, 0, element);\n    } else {\n\n      // push to end\n      collection.push(element);\n    }\n  }\n\n\n  /**\n   * Fail save get the index of an element in a collection.\n   *\n   * @param {Array<Object>} collection\n   * @param {Object} element\n   *\n   * @return {number} the index or -1 if collection or element do\n   *                  not exist or the element is not contained.\n   */\n  function indexOf(collection, element) {\n\n    if (!collection || !element) {\n      return -1;\n    }\n\n    return collection.indexOf(element);\n  }\n\n  /**\n   * @typedef {import('../util/Types').Axis} Axis\n   * @typedef {import('../util/Types').Point} Point\n   * @typedef {import('../util/Types').Rect} Rect\n   */\n\n  /**\n   * Computes the distance between two points.\n   *\n   * @param {Point} a\n   * @param {Point} b\n   *\n   * @return {number} The distance between the two points.\n   */\n  function pointDistance(a, b) {\n    if (!a || !b) {\n      return -1;\n    }\n\n    return Math.sqrt(\n      Math.pow(a.x - b.x, 2) +\n      Math.pow(a.y - b.y, 2)\n    );\n  }\n\n\n  /**\n   * Returns true if the point r is on the line between p and q.\n   *\n   * @param {Point} p\n   * @param {Point} q\n   * @param {Point} r\n   * @param {number} [accuracy=5] The accuracy with which to check (lower is better).\n   *\n   * @return {boolean}\n   */\n  function pointsOnLine(p, q, r, accuracy) {\n\n    if (typeof accuracy === 'undefined') {\n      accuracy = 5;\n    }\n\n    if (!p || !q || !r) {\n      return false;\n    }\n\n    var val = (q.x - p.x) * (r.y - p.y) - (q.y - p.y) * (r.x - p.x),\n        dist = pointDistance(p, q);\n\n    // @see http://stackoverflow.com/a/907491/412190\n    return Math.abs(val / dist) <= accuracy;\n  }\n\n\n  var ALIGNED_THRESHOLD = 2;\n\n  /**\n   * Check whether two points are horizontally or vertically aligned.\n   *\n   * @param {Point[]|Point} a\n   * @param {Point} [b]\n   *\n   * @return {string|boolean} If and how the two points are aligned ('h', 'v' or `false`).\n   */\n  function pointsAligned(a, b) {\n    var points = Array.from(arguments).flat();\n\n    const axisMap = {\n      'x': 'v',\n      'y': 'h'\n    };\n\n    for (const [ axis, orientation ] of Object.entries(axisMap)) {\n      if (pointsAlignedOnAxis(axis, points)) {\n        return orientation;\n      }\n    }\n\n    return false;\n  }\n\n  /**\n   * @param {Axis} axis\n   * @param {Point[]} points\n   *\n   * @return {boolean}\n   */\n  function pointsAlignedOnAxis(axis, points) {\n    const referencePoint = points[0];\n\n    return every(points, function(point) {\n      return Math.abs(referencePoint[axis] - point[axis]) <= ALIGNED_THRESHOLD;\n    });\n  }\n\n  /**\n   * Returns true if the point p is inside the rectangle rect\n   *\n   * @param {Point} p\n   * @param {Rect} rect\n   * @param {number} tolerance\n   *\n   * @return {boolean}\n   */\n  function pointInRect(p, rect, tolerance) {\n    tolerance = tolerance || 0;\n\n    return p.x > rect.x - tolerance &&\n           p.y > rect.y - tolerance &&\n           p.x < rect.x + rect.width + tolerance &&\n           p.y < rect.y + rect.height + tolerance;\n  }\n\n  /**\n   * Returns a point in the middle of points p and q\n   *\n   * @param {Point} p\n   * @param {Point} q\n   *\n   * @return {Point} The mid point between the two points.\n   */\n  function getMidPoint(p, q) {\n    return {\n      x: Math.round(p.x + ((q.x - p.x) / 2.0)),\n      y: Math.round(p.y + ((q.y - p.y) / 2.0))\n    };\n  }\n\n  function getDefaultExportFromCjs (x) {\n  \treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n  }\n\n  /**\n   * This file contains source code adapted from Snap.svg (licensed Apache-2.0).\n   *\n   * @see https://github.com/adobe-webplatform/Snap.svg/blob/master/src/path.js\n   */\n\n  /* eslint no-fallthrough: \"off\" */\n\n  var p2s = /,?([a-z]),?/gi,\n      toFloat = parseFloat,\n      math = Math,\n      PI = math.PI,\n      mmin = math.min,\n      mmax = math.max,\n      pow = math.pow,\n      abs$7 = math.abs,\n      pathCommand = /([a-z])[\\s,]*((-?\\d*\\.?\\d*(?:e[-+]?\\d+)?[\\s]*,?[\\s]*)+)/ig,\n      pathValues = /(-?\\d*\\.?\\d*(?:e[-+]?\\d+)?)[\\s]*,?[\\s]*/ig;\n\n  var isArray = Array.isArray || function(o) { return o instanceof Array; };\n\n  function hasProperty(obj, property) {\n    return Object.prototype.hasOwnProperty.call(obj, property);\n  }\n\n  function clone(obj) {\n\n    if (typeof obj == 'function' || Object(obj) !== obj) {\n      return obj;\n    }\n\n    var res = new obj.constructor;\n\n    for (var key in obj) {\n      if (hasProperty(obj, key)) {\n        res[key] = clone(obj[key]);\n      }\n    }\n\n    return res;\n  }\n\n  function repush(array, item) {\n    for (var i = 0, ii = array.length; i < ii; i++) if (array[i] === item) {\n      return array.push(array.splice(i, 1)[0]);\n    }\n  }\n\n  function cacher(f) {\n\n    function newf() {\n\n      var arg = Array.prototype.slice.call(arguments, 0),\n          args = arg.join('\\u2400'),\n          cache = newf.cache = newf.cache || {},\n          count = newf.count = newf.count || [];\n\n      if (hasProperty(cache, args)) {\n        repush(count, args);\n        return cache[args];\n      }\n\n      count.length >= 1e3 && delete cache[count.shift()];\n      count.push(args);\n      cache[args] = f.apply(0, arg);\n\n      return cache[args];\n    }\n    return newf;\n  }\n\n  function parsePathString(pathString) {\n\n    if (!pathString) {\n      return null;\n    }\n\n    var pth = paths(pathString);\n\n    if (pth.arr) {\n      return clone(pth.arr);\n    }\n\n    var paramCounts = { a: 7, c: 6, h: 1, l: 2, m: 2, q: 4, s: 4, t: 2, v: 1, z: 0 },\n        data = [];\n\n    if (isArray(pathString) && isArray(pathString[0])) { // rough assumption\n      data = clone(pathString);\n    }\n\n    if (!data.length) {\n\n      String(pathString).replace(pathCommand, function(a, b, c) {\n        var params = [],\n            name = b.toLowerCase();\n\n        c.replace(pathValues, function(a, b) {\n          b && params.push(+b);\n        });\n\n        if (name == 'm' && params.length > 2) {\n          data.push([b].concat(params.splice(0, 2)));\n          name = 'l';\n          b = b == 'm' ? 'l' : 'L';\n        }\n\n        while (params.length >= paramCounts[name]) {\n          data.push([b].concat(params.splice(0, paramCounts[name])));\n          if (!paramCounts[name]) {\n            break;\n          }\n        }\n      });\n    }\n\n    data.toString = paths.toString;\n    pth.arr = clone(data);\n\n    return data;\n  }\n\n  function paths(ps) {\n    var p = paths.ps = paths.ps || {};\n\n    if (p[ps]) {\n      p[ps].sleep = 100;\n    } else {\n      p[ps] = {\n        sleep: 100\n      };\n    }\n\n    setTimeout(function() {\n      for (var key in p) {\n        if (hasProperty(p, key) && key != ps) {\n          p[key].sleep--;\n          !p[key].sleep && delete p[key];\n        }\n      }\n    });\n\n    return p[ps];\n  }\n\n  function rectBBox(x, y, width, height) {\n\n    if (arguments.length === 1) {\n      y = x.y;\n      width = x.width;\n      height = x.height;\n      x = x.x;\n    }\n\n    return {\n      x: x,\n      y: y,\n      width: width,\n      height: height,\n      x2: x + width,\n      y2: y + height\n    };\n  }\n\n  function pathToString() {\n    return this.join(',').replace(p2s, '$1');\n  }\n\n  function pathClone(pathArray) {\n    var res = clone(pathArray);\n    res.toString = pathToString;\n    return res;\n  }\n\n  function findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {\n    var t1 = 1 - t,\n        t13 = pow(t1, 3),\n        t12 = pow(t1, 2),\n        t2 = t * t,\n        t3 = t2 * t,\n        x = t13 * p1x + t12 * 3 * t * c1x + t1 * 3 * t * t * c2x + t3 * p2x,\n        y = t13 * p1y + t12 * 3 * t * c1y + t1 * 3 * t * t * c2y + t3 * p2y;\n\n    return {\n      x: fixError(x),\n      y: fixError(y)\n    };\n  }\n\n  function bezierBBox(points) {\n\n    var bbox = curveBBox.apply(null, points);\n\n    return rectBBox(\n      bbox.x0,\n      bbox.y0,\n      bbox.x1 - bbox.x0,\n      bbox.y1 - bbox.y0\n    );\n  }\n\n  function isPointInsideBBox$2(bbox, x, y) {\n    return x >= bbox.x &&\n      x <= bbox.x + bbox.width &&\n      y >= bbox.y &&\n      y <= bbox.y + bbox.height;\n  }\n\n  function isBBoxIntersect(bbox1, bbox2) {\n    bbox1 = rectBBox(bbox1);\n    bbox2 = rectBBox(bbox2);\n    return isPointInsideBBox$2(bbox2, bbox1.x, bbox1.y)\n      || isPointInsideBBox$2(bbox2, bbox1.x2, bbox1.y)\n      || isPointInsideBBox$2(bbox2, bbox1.x, bbox1.y2)\n      || isPointInsideBBox$2(bbox2, bbox1.x2, bbox1.y2)\n      || isPointInsideBBox$2(bbox1, bbox2.x, bbox2.y)\n      || isPointInsideBBox$2(bbox1, bbox2.x2, bbox2.y)\n      || isPointInsideBBox$2(bbox1, bbox2.x, bbox2.y2)\n      || isPointInsideBBox$2(bbox1, bbox2.x2, bbox2.y2)\n      || (bbox1.x < bbox2.x2 && bbox1.x > bbox2.x\n          || bbox2.x < bbox1.x2 && bbox2.x > bbox1.x)\n      && (bbox1.y < bbox2.y2 && bbox1.y > bbox2.y\n          || bbox2.y < bbox1.y2 && bbox2.y > bbox1.y);\n  }\n\n  function base3(t, p1, p2, p3, p4) {\n    var t1 = -3 * p1 + 9 * p2 - 9 * p3 + 3 * p4,\n        t2 = t * t1 + 6 * p1 - 12 * p2 + 6 * p3;\n    return t * t2 - 3 * p1 + 3 * p2;\n  }\n\n  function bezlen(x1, y1, x2, y2, x3, y3, x4, y4, z) {\n\n    if (z == null) {\n      z = 1;\n    }\n\n    z = z > 1 ? 1 : z < 0 ? 0 : z;\n\n    var z2 = z / 2,\n        n = 12,\n        Tvalues = [-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],\n        Cvalues = [0.2491,0.2491,0.2335,0.2335,0.2032,0.2032,0.1601,0.1601,0.1069,0.1069,0.0472,0.0472],\n        sum = 0;\n\n    for (var i = 0; i < n; i++) {\n      var ct = z2 * Tvalues[i] + z2,\n          xbase = base3(ct, x1, x2, x3, x4),\n          ybase = base3(ct, y1, y2, y3, y4),\n          comb = xbase * xbase + ybase * ybase;\n\n      sum += Cvalues[i] * math.sqrt(comb);\n    }\n\n    return z2 * sum;\n  }\n\n\n  function intersectLines(x1, y1, x2, y2, x3, y3, x4, y4) {\n\n    if (\n      mmax(x1, x2) < mmin(x3, x4) ||\n        mmin(x1, x2) > mmax(x3, x4) ||\n        mmax(y1, y2) < mmin(y3, y4) ||\n        mmin(y1, y2) > mmax(y3, y4)\n    ) {\n      return;\n    }\n\n    var nx = (x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4),\n        ny = (x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4),\n        denominator = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);\n\n    if (!denominator) {\n      return;\n    }\n\n    var px = fixError(nx / denominator),\n        py = fixError(ny / denominator),\n        px2 = +px.toFixed(2),\n        py2 = +py.toFixed(2);\n\n    if (\n      px2 < +mmin(x1, x2).toFixed(2) ||\n        px2 > +mmax(x1, x2).toFixed(2) ||\n        px2 < +mmin(x3, x4).toFixed(2) ||\n        px2 > +mmax(x3, x4).toFixed(2) ||\n        py2 < +mmin(y1, y2).toFixed(2) ||\n        py2 > +mmax(y1, y2).toFixed(2) ||\n        py2 < +mmin(y3, y4).toFixed(2) ||\n        py2 > +mmax(y3, y4).toFixed(2)\n    ) {\n      return;\n    }\n\n    return { x: px, y: py };\n  }\n\n  function fixError(number) {\n    return Math.round(number * 100000000000) / 100000000000;\n  }\n\n  function findBezierIntersections(bez1, bez2, justCount) {\n    var bbox1 = bezierBBox(bez1),\n        bbox2 = bezierBBox(bez2);\n\n    if (!isBBoxIntersect(bbox1, bbox2)) {\n      return justCount ? 0 : [];\n    }\n\n    // As an optimization, lines will have only 1 segment\n\n    var l1 = bezlen.apply(0, bez1),\n        l2 = bezlen.apply(0, bez2),\n        n1 = isLine(bez1) ? 1 : ~~(l1 / 5) || 1,\n        n2 = isLine(bez2) ? 1 : ~~(l2 / 5) || 1,\n        dots1 = [],\n        dots2 = [],\n        xy = {},\n        res = justCount ? 0 : [];\n\n    for (var i = 0; i < n1 + 1; i++) {\n      var p = findDotsAtSegment.apply(0, bez1.concat(i / n1));\n      dots1.push({ x: p.x, y: p.y, t: i / n1 });\n    }\n\n    for (i = 0; i < n2 + 1; i++) {\n      p = findDotsAtSegment.apply(0, bez2.concat(i / n2));\n      dots2.push({ x: p.x, y: p.y, t: i / n2 });\n    }\n\n    for (i = 0; i < n1; i++) {\n\n      for (var j = 0; j < n2; j++) {\n        var di = dots1[i],\n            di1 = dots1[i + 1],\n            dj = dots2[j],\n            dj1 = dots2[j + 1],\n            ci = abs$7(di1.x - di.x) < .01 ? 'y' : 'x',\n            cj = abs$7(dj1.x - dj.x) < .01 ? 'y' : 'x',\n            is = intersectLines(di.x, di.y, di1.x, di1.y, dj.x, dj.y, dj1.x, dj1.y),\n            key;\n\n        if (is) {\n          key = is.x.toFixed(9) + '#' + is.y.toFixed(9);\n\n          if (xy[key]) {\n            continue;\n          }\n\n          xy[key] = true;\n\n          var t1 = di.t + abs$7((is[ci] - di[ci]) / (di1[ci] - di[ci])) * (di1.t - di.t),\n              t2 = dj.t + abs$7((is[cj] - dj[cj]) / (dj1[cj] - dj[cj])) * (dj1.t - dj.t);\n\n          if (t1 >= 0 && t1 <= 1 && t2 >= 0 && t2 <= 1) {\n\n            if (justCount) {\n              res++;\n            } else {\n              res.push({\n                x: is.x,\n                y: is.y,\n                t1: t1,\n                t2: t2\n              });\n            }\n          }\n        }\n      }\n    }\n\n    return res;\n  }\n\n\n  /**\n   * Find or counts the intersections between two SVG paths.\n   *\n   * Returns a number in counting mode and a list of intersections otherwise.\n   *\n   * A single intersection entry contains the intersection coordinates (x, y)\n   * as well as additional information regarding the intersecting segments\n   * on each path (segment1, segment2) and the relative location of the\n   * intersection on these segments (t1, t2).\n   *\n   * The path may be an SVG path string or a list of path components\n   * such as `[ [ 'M', 0, 10 ], [ 'L', 20, 0 ] ]`.\n   *\n   * @example\n   *\n   * var intersections = findPathIntersections(\n   *   'M0,0L100,100',\n   *   [ [ 'M', 0, 100 ], [ 'L', 100, 0 ] ]\n   * );\n   *\n   * // intersections = [\n   * //   { x: 50, y: 50, segment1: 1, segment2: 1, t1: 0.5, t2: 0.5 }\n   * // ]\n   *\n   * @param {String|Array<PathDef>} path1\n   * @param {String|Array<PathDef>} path2\n   * @param {Boolean} [justCount=false]\n   *\n   * @return {Array<Intersection>|Number}\n   */\n  function findPathIntersections(path1, path2, justCount) {\n    path1 = pathToCurve(path1);\n    path2 = pathToCurve(path2);\n\n    var x1, y1, x2, y2, x1m, y1m, x2m, y2m, bez1, bez2,\n        res = justCount ? 0 : [];\n\n    for (var i = 0, ii = path1.length; i < ii; i++) {\n      var pi = path1[i];\n\n      if (pi[0] == 'M') {\n        x1 = x1m = pi[1];\n        y1 = y1m = pi[2];\n      } else {\n\n        if (pi[0] == 'C') {\n          bez1 = [x1, y1].concat(pi.slice(1));\n          x1 = bez1[6];\n          y1 = bez1[7];\n        } else {\n          bez1 = [x1, y1, x1, y1, x1m, y1m, x1m, y1m];\n          x1 = x1m;\n          y1 = y1m;\n        }\n\n        for (var j = 0, jj = path2.length; j < jj; j++) {\n          var pj = path2[j];\n\n          if (pj[0] == 'M') {\n            x2 = x2m = pj[1];\n            y2 = y2m = pj[2];\n          } else {\n\n            if (pj[0] == 'C') {\n              bez2 = [x2, y2].concat(pj.slice(1));\n              x2 = bez2[6];\n              y2 = bez2[7];\n            } else {\n              bez2 = [x2, y2, x2, y2, x2m, y2m, x2m, y2m];\n              x2 = x2m;\n              y2 = y2m;\n            }\n\n            var intr = findBezierIntersections(bez1, bez2, justCount);\n\n            if (justCount) {\n              res += intr;\n            } else {\n\n              for (var k = 0, kk = intr.length; k < kk; k++) {\n                intr[k].segment1 = i;\n                intr[k].segment2 = j;\n                intr[k].bez1 = bez1;\n                intr[k].bez2 = bez2;\n              }\n\n              res = res.concat(intr);\n            }\n          }\n        }\n      }\n    }\n\n    return res;\n  }\n\n\n  function pathToAbsolute(pathArray) {\n    var pth = paths(pathArray);\n\n    if (pth.abs) {\n      return pathClone(pth.abs);\n    }\n\n    if (!isArray(pathArray) || !isArray(pathArray && pathArray[0])) { // rough assumption\n      pathArray = parsePathString(pathArray);\n    }\n\n    if (!pathArray || !pathArray.length) {\n      return [['M', 0, 0]];\n    }\n\n    var res = [],\n        x = 0,\n        y = 0,\n        mx = 0,\n        my = 0,\n        start = 0,\n        pa0;\n\n    if (pathArray[0][0] == 'M') {\n      x = +pathArray[0][1];\n      y = +pathArray[0][2];\n      mx = x;\n      my = y;\n      start++;\n      res[0] = ['M', x, y];\n    }\n\n    for (var r, pa, i = start, ii = pathArray.length; i < ii; i++) {\n      res.push(r = []);\n      pa = pathArray[i];\n      pa0 = pa[0];\n\n      if (pa0 != pa0.toUpperCase()) {\n        r[0] = pa0.toUpperCase();\n\n        switch (r[0]) {\n        case 'A':\n          r[1] = pa[1];\n          r[2] = pa[2];\n          r[3] = pa[3];\n          r[4] = pa[4];\n          r[5] = pa[5];\n          r[6] = +pa[6] + x;\n          r[7] = +pa[7] + y;\n          break;\n        case 'V':\n          r[1] = +pa[1] + y;\n          break;\n        case 'H':\n          r[1] = +pa[1] + x;\n          break;\n        case 'M':\n          mx = +pa[1] + x;\n          my = +pa[2] + y;\n        default:\n          for (var j = 1, jj = pa.length; j < jj; j++) {\n            r[j] = +pa[j] + ((j % 2) ? x : y);\n          }\n        }\n      } else {\n        for (var k = 0, kk = pa.length; k < kk; k++) {\n          r[k] = pa[k];\n        }\n      }\n      pa0 = pa0.toUpperCase();\n\n      switch (r[0]) {\n      case 'Z':\n        x = +mx;\n        y = +my;\n        break;\n      case 'H':\n        x = r[1];\n        break;\n      case 'V':\n        y = r[1];\n        break;\n      case 'M':\n        mx = r[r.length - 2];\n        my = r[r.length - 1];\n      default:\n        x = r[r.length - 2];\n        y = r[r.length - 1];\n      }\n    }\n\n    res.toString = pathToString;\n    pth.abs = pathClone(res);\n\n    return res;\n  }\n\n  function isLine(bez) {\n    return (\n      bez[0] === bez[2] &&\n      bez[1] === bez[3] &&\n      bez[4] === bez[6] &&\n      bez[5] === bez[7]\n    );\n  }\n\n  function lineToCurve(x1, y1, x2, y2) {\n    return [\n      x1, y1, x2,\n      y2, x2, y2\n    ];\n  }\n\n  function qubicToCurve(x1, y1, ax, ay, x2, y2) {\n    var _13 = 1 / 3,\n        _23 = 2 / 3;\n\n    return [\n      _13 * x1 + _23 * ax,\n      _13 * y1 + _23 * ay,\n      _13 * x2 + _23 * ax,\n      _13 * y2 + _23 * ay,\n      x2,\n      y2\n    ];\n  }\n\n  function arcToCurve(x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2, recursive) {\n\n    // for more information of where this math came from visit:\n    // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n    var _120 = PI * 120 / 180,\n        rad = PI / 180 * (+angle || 0),\n        res = [],\n        xy,\n        rotate = cacher(function(x, y, rad) {\n          var X = x * math.cos(rad) - y * math.sin(rad),\n              Y = x * math.sin(rad) + y * math.cos(rad);\n\n          return { x: X, y: Y };\n        });\n\n    if (!recursive) {\n      xy = rotate(x1, y1, -rad);\n      x1 = xy.x;\n      y1 = xy.y;\n      xy = rotate(x2, y2, -rad);\n      x2 = xy.x;\n      y2 = xy.y;\n\n      var x = (x1 - x2) / 2,\n          y = (y1 - y2) / 2;\n\n      var h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n\n      if (h > 1) {\n        h = math.sqrt(h);\n        rx = h * rx;\n        ry = h * ry;\n      }\n\n      var rx2 = rx * rx,\n          ry2 = ry * ry,\n          k = (large_arc_flag == sweep_flag ? -1 : 1) *\n              math.sqrt(abs$7((rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x))),\n          cx = k * rx * y / ry + (x1 + x2) / 2,\n          cy = k * -ry * x / rx + (y1 + y2) / 2,\n          f1 = math.asin(((y1 - cy) / ry).toFixed(9)),\n          f2 = math.asin(((y2 - cy) / ry).toFixed(9));\n\n      f1 = x1 < cx ? PI - f1 : f1;\n      f2 = x2 < cx ? PI - f2 : f2;\n      f1 < 0 && (f1 = PI * 2 + f1);\n      f2 < 0 && (f2 = PI * 2 + f2);\n\n      if (sweep_flag && f1 > f2) {\n        f1 = f1 - PI * 2;\n      }\n      if (!sweep_flag && f2 > f1) {\n        f2 = f2 - PI * 2;\n      }\n    } else {\n      f1 = recursive[0];\n      f2 = recursive[1];\n      cx = recursive[2];\n      cy = recursive[3];\n    }\n\n    var df = f2 - f1;\n\n    if (abs$7(df) > _120) {\n      var f2old = f2,\n          x2old = x2,\n          y2old = y2;\n\n      f2 = f1 + _120 * (sweep_flag && f2 > f1 ? 1 : -1);\n      x2 = cx + rx * math.cos(f2);\n      y2 = cy + ry * math.sin(f2);\n      res = arcToCurve(x2, y2, rx, ry, angle, 0, sweep_flag, x2old, y2old, [f2, f2old, cx, cy]);\n    }\n\n    df = f2 - f1;\n\n    var c1 = math.cos(f1),\n        s1 = math.sin(f1),\n        c2 = math.cos(f2),\n        s2 = math.sin(f2),\n        t = math.tan(df / 4),\n        hx = 4 / 3 * rx * t,\n        hy = 4 / 3 * ry * t,\n        m1 = [x1, y1],\n        m2 = [x1 + hx * s1, y1 - hy * c1],\n        m3 = [x2 + hx * s2, y2 - hy * c2],\n        m4 = [x2, y2];\n\n    m2[0] = 2 * m1[0] - m2[0];\n    m2[1] = 2 * m1[1] - m2[1];\n\n    if (recursive) {\n      return [m2, m3, m4].concat(res);\n    } else {\n      res = [m2, m3, m4].concat(res).join().split(',');\n      var newres = [];\n\n      for (var i = 0, ii = res.length; i < ii; i++) {\n        newres[i] = i % 2 ? rotate(res[i - 1], res[i], rad).y : rotate(res[i], res[i + 1], rad).x;\n      }\n\n      return newres;\n    }\n  }\n\n  // Returns bounding box of cubic bezier curve.\n  // Source: http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html\n  // Original version: NISHIO Hirokazu\n  // Modifications: https://github.com/timo22345\n  function curveBBox(x0, y0, x1, y1, x2, y2, x3, y3) {\n    var tvalues = [],\n        bounds = [[], []],\n        a, b, c, t, t1, t2, b2ac, sqrtb2ac;\n\n    for (var i = 0; i < 2; ++i) {\n\n      if (i == 0) {\n        b = 6 * x0 - 12 * x1 + 6 * x2;\n        a = -3 * x0 + 9 * x1 - 9 * x2 + 3 * x3;\n        c = 3 * x1 - 3 * x0;\n      } else {\n        b = 6 * y0 - 12 * y1 + 6 * y2;\n        a = -3 * y0 + 9 * y1 - 9 * y2 + 3 * y3;\n        c = 3 * y1 - 3 * y0;\n      }\n\n      if (abs$7(a) < 1e-12) {\n\n        if (abs$7(b) < 1e-12) {\n          continue;\n        }\n\n        t = -c / b;\n\n        if (0 < t && t < 1) {\n          tvalues.push(t);\n        }\n\n        continue;\n      }\n\n      b2ac = b * b - 4 * c * a;\n      sqrtb2ac = math.sqrt(b2ac);\n\n      if (b2ac < 0) {\n        continue;\n      }\n\n      t1 = (-b + sqrtb2ac) / (2 * a);\n\n      if (0 < t1 && t1 < 1) {\n        tvalues.push(t1);\n      }\n\n      t2 = (-b - sqrtb2ac) / (2 * a);\n\n      if (0 < t2 && t2 < 1) {\n        tvalues.push(t2);\n      }\n    }\n\n    var j = tvalues.length,\n        jlen = j,\n        mt;\n\n    while (j--) {\n      t = tvalues[j];\n      mt = 1 - t;\n      bounds[0][j] = (mt * mt * mt * x0) + (3 * mt * mt * t * x1) + (3 * mt * t * t * x2) + (t * t * t * x3);\n      bounds[1][j] = (mt * mt * mt * y0) + (3 * mt * mt * t * y1) + (3 * mt * t * t * y2) + (t * t * t * y3);\n    }\n\n    bounds[0][jlen] = x0;\n    bounds[1][jlen] = y0;\n    bounds[0][jlen + 1] = x3;\n    bounds[1][jlen + 1] = y3;\n    bounds[0].length = bounds[1].length = jlen + 2;\n\n    return {\n      x0: mmin.apply(0, bounds[0]),\n      y0: mmin.apply(0, bounds[1]),\n      x1: mmax.apply(0, bounds[0]),\n      y1: mmax.apply(0, bounds[1])\n    };\n  }\n\n  function pathToCurve(path) {\n\n    var pth = paths(path);\n\n    // return cached curve, if existing\n    if (pth.curve) {\n      return pathClone(pth.curve);\n    }\n\n    var curvedPath = pathToAbsolute(path),\n        attrs = { x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null },\n        processPath = function(path, d, pathCommand) {\n          var nx, ny;\n\n          if (!path) {\n            return ['C', d.x, d.y, d.x, d.y, d.x, d.y];\n          }\n\n          !(path[0] in { T: 1, Q: 1 }) && (d.qx = d.qy = null);\n\n          switch (path[0]) {\n          case 'M':\n            d.X = path[1];\n            d.Y = path[2];\n            break;\n          case 'A':\n            path = ['C'].concat(arcToCurve.apply(0, [d.x, d.y].concat(path.slice(1))));\n            break;\n          case 'S':\n            if (pathCommand == 'C' || pathCommand == 'S') {\n\n              // In 'S' case we have to take into account, if the previous command is C/S.\n              nx = d.x * 2 - d.bx;\n\n              // And reflect the previous\n              ny = d.y * 2 - d.by;\n\n              // command's control point relative to the current point.\n            }\n            else {\n\n              // or some else or nothing\n              nx = d.x;\n              ny = d.y;\n            }\n            path = ['C', nx, ny].concat(path.slice(1));\n            break;\n          case 'T':\n            if (pathCommand == 'Q' || pathCommand == 'T') {\n\n              // In 'T' case we have to take into account, if the previous command is Q/T.\n              d.qx = d.x * 2 - d.qx;\n\n              // And make a reflection similar\n              d.qy = d.y * 2 - d.qy;\n\n              // to case 'S'.\n            }\n            else {\n\n              // or something else or nothing\n              d.qx = d.x;\n              d.qy = d.y;\n            }\n            path = ['C'].concat(qubicToCurve(d.x, d.y, d.qx, d.qy, path[1], path[2]));\n            break;\n          case 'Q':\n            d.qx = path[1];\n            d.qy = path[2];\n            path = ['C'].concat(qubicToCurve(d.x, d.y, path[1], path[2], path[3], path[4]));\n            break;\n          case 'L':\n            path = ['C'].concat(lineToCurve(d.x, d.y, path[1], path[2]));\n            break;\n          case 'H':\n            path = ['C'].concat(lineToCurve(d.x, d.y, path[1], d.y));\n            break;\n          case 'V':\n            path = ['C'].concat(lineToCurve(d.x, d.y, d.x, path[1]));\n            break;\n          case 'Z':\n            path = ['C'].concat(lineToCurve(d.x, d.y, d.X, d.Y));\n            break;\n          }\n\n          return path;\n        },\n\n        fixArc = function(pp, i) {\n\n          if (pp[i].length > 7) {\n            pp[i].shift();\n            var pi = pp[i];\n\n            while (pi.length) {\n              pathCommands[i] = 'A'; // if created multiple C:s, their original seg is saved\n              pp.splice(i++, 0, ['C'].concat(pi.splice(0, 6)));\n            }\n\n            pp.splice(i, 1);\n            ii = curvedPath.length;\n          }\n        },\n\n        pathCommands = [], // path commands of original path p\n        pfirst = '', // temporary holder for original path command\n        pathCommand = ''; // holder for previous path command of original path\n\n    for (var i = 0, ii = curvedPath.length; i < ii; i++) {\n      curvedPath[i] && (pfirst = curvedPath[i][0]); // save current path command\n\n      if (pfirst != 'C') // C is not saved yet, because it may be result of conversion\n      {\n        pathCommands[i] = pfirst; // Save current path command\n        i && (pathCommand = pathCommands[i - 1]); // Get previous path command pathCommand\n      }\n      curvedPath[i] = processPath(curvedPath[i], attrs, pathCommand); // Previous path command is inputted to processPath\n\n      if (pathCommands[i] != 'A' && pfirst == 'C') pathCommands[i] = 'C'; // A is the only command\n      // which may produce multiple C:s\n      // so we have to make sure that C is also C in original path\n\n      fixArc(curvedPath, i); // fixArc adds also the right amount of A:s to pathCommands\n\n      var seg = curvedPath[i],\n          seglen = seg.length;\n\n      attrs.x = seg[seglen - 2];\n      attrs.y = seg[seglen - 1];\n      attrs.bx = toFloat(seg[seglen - 4]) || attrs.x;\n      attrs.by = toFloat(seg[seglen - 3]) || attrs.y;\n    }\n\n    // cache curve\n    pth.curve = pathClone(curvedPath);\n\n    return curvedPath;\n  }\n\n  var intersect = findPathIntersections;\n\n  var intersectPaths = /*@__PURE__*/getDefaultExportFromCjs(intersect);\n\n  /**\n   * Checks whether a value is an instance of Connection.\n   *\n   * @param {any} value\n   *\n   * @return {boolean}\n   */\n  function isConnection(value) {\n    return isObject(value) && has$1(value, 'waypoints');\n  }\n\n  /**\n   * Checks whether a value is an instance of Label.\n   *\n   * @param {any} value\n   *\n   * @return {boolean}\n   */\n  function isLabel(value) {\n    return isObject(value) && has$1(value, 'labelTarget');\n  }\n\n  /**\n   * @typedef {import('../core/Types').ElementLike} Element\n   * @typedef {import('../core/Types').ConnectionLike} Connection\n   *\n   * @typedef {import('../util/Types').DirectionTRBL} DirectionTRBL\n   * @typedef {import('../util/Types').Point} Point\n   * @typedef {import('../util/Types').Rect} Rect\n   * @typedef {import('../util/Types').RectTRBL} RectTRBL\n   */\n\n  /**\n   * @param {Rect} bounds\n   *\n   * @returns {Rect}\n   */\n  function roundBounds(bounds) {\n    return {\n      x: Math.round(bounds.x),\n      y: Math.round(bounds.y),\n      width: Math.round(bounds.width),\n      height: Math.round(bounds.height)\n    };\n  }\n\n  /**\n   * @param {Point} point\n   *\n   * @returns {Point}\n   */\n  function roundPoint(point) {\n\n    return {\n      x: Math.round(point.x),\n      y: Math.round(point.y)\n    };\n  }\n\n\n  /**\n   * Convert the given bounds to a { top, left, bottom, right } descriptor.\n   *\n   * @param {Point|Rect} bounds\n   *\n   * @return {RectTRBL}\n   */\n  function asTRBL(bounds) {\n    return {\n      top: bounds.y,\n      right: bounds.x + (bounds.width || 0),\n      bottom: bounds.y + (bounds.height || 0),\n      left: bounds.x\n    };\n  }\n\n\n  /**\n   * Convert a { top, left, bottom, right } to an objects bounds.\n   *\n   * @param {RectTRBL} trbl\n   *\n   * @return {Rect}\n   */\n  function asBounds(trbl) {\n    return {\n      x: trbl.left,\n      y: trbl.top,\n      width: trbl.right - trbl.left,\n      height: trbl.bottom - trbl.top\n    };\n  }\n\n\n  /**\n   * Get the mid of the given bounds or point.\n   *\n   * @param {Point|Rect} bounds\n   *\n   * @return {Point}\n   */\n  function getBoundsMid(bounds) {\n    return roundPoint({\n      x: bounds.x + (bounds.width || 0) / 2,\n      y: bounds.y + (bounds.height || 0) / 2\n    });\n  }\n\n\n  /**\n   * Get the mid of the given Connection.\n   *\n   * @param {Connection} connection\n   *\n   * @return {Point}\n   */\n  function getConnectionMid(connection) {\n    var waypoints = connection.waypoints;\n\n    // calculate total length and length of each segment\n    var parts = waypoints.reduce(function(parts, point, index) {\n\n      var lastPoint = waypoints[index - 1];\n\n      if (lastPoint) {\n        var lastPart = parts[parts.length - 1];\n\n        var startLength = lastPart && lastPart.endLength || 0;\n        var length = distance(lastPoint, point);\n\n        parts.push({\n          start: lastPoint,\n          end: point,\n          startLength: startLength,\n          endLength: startLength + length,\n          length: length\n        });\n      }\n\n      return parts;\n    }, []);\n\n    var totalLength = parts.reduce(function(length, part) {\n      return length + part.length;\n    }, 0);\n\n    // find which segement contains middle point\n    var midLength = totalLength / 2;\n\n    var i = 0;\n    var midSegment = parts[i];\n\n    while (midSegment.endLength < midLength) {\n      midSegment = parts[++i];\n    }\n\n    // calculate relative position on mid segment\n    var segmentProgress = (midLength - midSegment.startLength) / midSegment.length;\n\n    var midPoint = {\n      x: midSegment.start.x + (midSegment.end.x - midSegment.start.x) * segmentProgress,\n      y: midSegment.start.y + (midSegment.end.y - midSegment.start.y) * segmentProgress\n    };\n\n    return midPoint;\n  }\n\n\n  /**\n   * Get the mid of the given Element.\n   *\n   * @param {Element} element\n   *\n   * @return {Point}\n   */\n  function getMid(element) {\n    if (isConnection(element)) {\n      return getConnectionMid(element);\n    }\n\n    return getBoundsMid(element);\n  }\n\n  // orientation utils //////////////////////\n\n  /**\n   * Get orientation of the given rectangle with respect to\n   * the reference rectangle.\n   *\n   * A padding (positive or negative) may be passed to influence\n   * horizontal / vertical orientation and intersection.\n   *\n   * @param {Rect} rect\n   * @param {Rect} reference\n   * @param {Point|number} padding\n   *\n   * @return {DirectionTRBL} the orientation; one of top, top-left, left, ..., bottom, right or intersect.\n   */\n  function getOrientation(rect, reference, padding) {\n\n    padding = padding || 0;\n\n    // make sure we can use an object, too\n    // for individual { x, y } padding\n    if (!isObject(padding)) {\n      padding = { x: padding, y: padding };\n    }\n\n\n    var rectOrientation = asTRBL(rect),\n        referenceOrientation = asTRBL(reference);\n\n    var top = rectOrientation.bottom + padding.y <= referenceOrientation.top,\n        right = rectOrientation.left - padding.x >= referenceOrientation.right,\n        bottom = rectOrientation.top - padding.y >= referenceOrientation.bottom,\n        left = rectOrientation.right + padding.x <= referenceOrientation.left;\n\n    var vertical = top ? 'top' : (bottom ? 'bottom' : null),\n        horizontal = left ? 'left' : (right ? 'right' : null);\n\n    if (horizontal && vertical) {\n      return vertical + '-' + horizontal;\n    } else {\n      return horizontal || vertical || 'intersect';\n    }\n  }\n\n\n  // intersection utils //////////////////////\n\n  /**\n   * Get intersection between an element and a line path.\n   *\n   * @param {string} elementPath\n   * @param {string} linePath\n   * @param {boolean} cropStart Whether to crop start or end.\n   *\n   * @return {Point}\n   */\n  function getElementLineIntersection(elementPath, linePath, cropStart) {\n\n    var intersections = getIntersections(elementPath, linePath);\n\n    // recognize intersections\n    // only one -> choose\n    // two close together -> choose first\n    // two or more distinct -> pull out appropriate one\n    // none -> ok (fallback to point itself)\n    if (intersections.length === 1) {\n      return roundPoint(intersections[0]);\n    } else if (intersections.length === 2 && pointDistance(intersections[0], intersections[1]) < 1) {\n      return roundPoint(intersections[0]);\n    } else if (intersections.length > 1) {\n\n      // sort by intersections based on connection segment +\n      // distance from start\n      intersections = sortBy(intersections, function(i) {\n        var distance = Math.floor(i.t2 * 100) || 1;\n\n        distance = 100 - distance;\n\n        distance = (distance < 10 ? '0' : '') + distance;\n\n        // create a sort string that makes sure we sort\n        // line segment ASC + line segment position DESC (for cropStart)\n        // line segment ASC + line segment position ASC (for cropEnd)\n        return i.segment2 + '#' + distance;\n      });\n\n      return roundPoint(intersections[cropStart ? 0 : intersections.length - 1]);\n    }\n\n    return null;\n  }\n\n\n  function getIntersections(a, b) {\n    return intersectPaths(a, b);\n  }\n\n\n  function filterRedundantWaypoints(waypoints) {\n\n    // alter copy of waypoints, not original\n    waypoints = waypoints.slice();\n\n    var idx = 0,\n        point,\n        previousPoint,\n        nextPoint;\n\n    while (waypoints[idx]) {\n      point = waypoints[idx];\n      previousPoint = waypoints[idx - 1];\n      nextPoint = waypoints[idx + 1];\n\n      if (pointDistance(point, nextPoint) === 0 ||\n          pointsOnLine(previousPoint, nextPoint, point)) {\n\n        // remove point, if overlapping with {nextPoint}\n        // or on line with {previousPoint} -> {point} -> {nextPoint}\n        waypoints.splice(idx, 1);\n      } else {\n        idx++;\n      }\n    }\n\n    return waypoints;\n  }\n\n  // helpers //////////////////////\n\n  function distance(a, b) {\n    return Math.sqrt(Math.pow(a.x - b.x, 2) + Math.pow(a.y - b.y, 2));\n  }\n\n  /**\n   * @typedef {import('./Types').ConnectionLike} ConnectionLike\n   * @typedef {import('./Types').RootLike} RootLike\n   * @typedef {import('./Types').ParentLike } ParentLike\n   * @typedef {import('./Types').ShapeLike} ShapeLike\n   *\n   * @typedef { {\n   *   container?: HTMLElement;\n   *   deferUpdate?: boolean;\n   *   width?: number;\n   *   height?: number;\n   * } } CanvasConfig\n   * @typedef { {\n   *   group: SVGElement;\n   *   index: number;\n   *   visible: boolean;\n   * } } CanvasLayer\n   * @typedef { {\n   *   [key: string]: CanvasLayer;\n   * } } CanvasLayers\n   * @typedef { {\n   *   rootElement: ShapeLike;\n   *   layer: CanvasLayer;\n   * } } CanvasPlane\n   * @typedef { {\n   *   scale: number;\n   *   inner: Rect;\n   *   outer: Dimensions;\n   * } & Rect } CanvasViewbox\n   *\n   * @typedef {import('./ElementRegistry').default} ElementRegistry\n   * @typedef {import('./EventBus').default} EventBus\n   * @typedef {import('./GraphicsFactory').default} GraphicsFactory\n   *\n   * @typedef {import('../util/Types').Dimensions} Dimensions\n   * @typedef {import('../util/Types').Point} Point\n   * @typedef {import('../util/Types').Rect} Rect\n   * @typedef {import('../util/Types').RectTRBL} RectTRBL\n   */\n\n  function round$b(number, resolution) {\n    return Math.round(number * resolution) / resolution;\n  }\n\n  function ensurePx(number) {\n    return isNumber(number) ? number + 'px' : number;\n  }\n\n  function findRoot(element) {\n    while (element.parent) {\n      element = element.parent;\n    }\n\n    return element;\n  }\n\n  /**\n   * Creates a HTML container element for a SVG element with\n   * the given configuration\n   *\n   * @param {CanvasConfig} options\n   *\n   * @return {HTMLElement} the container element\n   */\n  function createContainer(options) {\n\n    options = assign$1({}, { width: '100%', height: '100%' }, options);\n\n    const container = options.container || document.body;\n\n    // create a <div> around the svg element with the respective size\n    // this way we can always get the correct container size\n    // (this is impossible for <svg> elements at the moment)\n    const parent = document.createElement('div');\n    parent.setAttribute('class', 'djs-container djs-parent');\n\n    assign(parent, {\n      position: 'relative',\n      overflow: 'hidden',\n      width: ensurePx(options.width),\n      height: ensurePx(options.height)\n    });\n\n    container.appendChild(parent);\n\n    return parent;\n  }\n\n  function createGroup(parent, cls, childIndex) {\n    const group = create$1('g');\n    classes(group).add(cls);\n\n    const index = childIndex !== undefined ? childIndex : parent.childNodes.length - 1;\n\n    // must ensure second argument is node or _null_\n    // cf. https://developer.mozilla.org/en-US/docs/Web/API/Node/insertBefore\n    parent.insertBefore(group, parent.childNodes[index] || null);\n\n    return group;\n  }\n\n  const BASE_LAYER = 'base';\n\n  // render plane contents behind utility layers\n  const PLANE_LAYER_INDEX = 0;\n  const UTILITY_LAYER_INDEX = 1;\n\n\n  const REQUIRED_MODEL_ATTRS = {\n    shape: [ 'x', 'y', 'width', 'height' ],\n    connection: [ 'waypoints' ]\n  };\n\n  /**\n   * The main drawing canvas.\n   *\n   * @class\n   * @constructor\n   *\n   * @emits Canvas#canvas.init\n   *\n   * @param {CanvasConfig|null} config\n   * @param {EventBus} eventBus\n   * @param {GraphicsFactory} graphicsFactory\n   * @param {ElementRegistry} elementRegistry\n   */\n  function Canvas(config, eventBus, graphicsFactory, elementRegistry) {\n    this._eventBus = eventBus;\n    this._elementRegistry = elementRegistry;\n    this._graphicsFactory = graphicsFactory;\n\n    /**\n     * @type {number}\n     */\n    this._rootsIdx = 0;\n\n    /**\n     * @type {CanvasLayers}\n     */\n    this._layers = {};\n\n    /**\n     * @type {CanvasPlane[]}\n     */\n    this._planes = [];\n\n    /**\n     * @type {RootLike|null}\n     */\n    this._rootElement = null;\n\n    this._init(config || {});\n  }\n\n  Canvas.$inject = [\n    'config.canvas',\n    'eventBus',\n    'graphicsFactory',\n    'elementRegistry'\n  ];\n\n  /**\n   * Creates a <svg> element that is wrapped into a <div>.\n   * This way we are always able to correctly figure out the size of the svg element\n   * by querying the parent node.\n\n   * (It is not possible to get the size of a svg element cross browser @ 2014-04-01)\n\n   * <div class=\"djs-container\" style=\"width: {desired-width}, height: {desired-height}\">\n   *   <svg width=\"100%\" height=\"100%\">\n   *    ...\n   *   </svg>\n   * </div>\n   *\n   * @param {CanvasConfig} config\n   */\n  Canvas.prototype._init = function(config) {\n\n    const eventBus = this._eventBus;\n\n    // html container\n    const container = this._container = createContainer(config);\n\n    const svg = this._svg = create$1('svg');\n    attr(svg, { width: '100%', height: '100%' });\n\n    append(container, svg);\n\n    const viewport = this._viewport = createGroup(svg, 'viewport');\n\n    // debounce canvas.viewbox.changed events\n    // for smoother diagram interaction\n    if (config.deferUpdate !== false) {\n      this._viewboxChanged = debounce(bind$2(this._viewboxChanged, this), 300);\n    }\n\n    eventBus.on('diagram.init', () => {\n\n      /**\n       * An event indicating that the canvas is ready to be drawn on.\n       *\n       * @memberOf Canvas\n       *\n       * @event canvas.init\n       *\n       * @type {Object}\n       * @property {SVGElement} svg the created svg element\n       * @property {SVGElement} viewport the direct parent of diagram elements and shapes\n       */\n      eventBus.fire('canvas.init', {\n        svg: svg,\n        viewport: viewport\n      });\n\n    });\n\n    // reset viewbox on shape changes to\n    // recompute the viewbox\n    eventBus.on([\n      'shape.added',\n      'connection.added',\n      'shape.removed',\n      'connection.removed',\n      'elements.changed',\n      'root.set'\n    ], () => {\n      delete this._cachedViewbox;\n    });\n\n    eventBus.on('diagram.destroy', 500, this._destroy, this);\n    eventBus.on('diagram.clear', 500, this._clear, this);\n  };\n\n  Canvas.prototype._destroy = function() {\n    this._eventBus.fire('canvas.destroy', {\n      svg: this._svg,\n      viewport: this._viewport\n    });\n\n    const parent = this._container.parentNode;\n\n    if (parent) {\n      parent.removeChild(this._container);\n    }\n\n    delete this._svg;\n    delete this._container;\n    delete this._layers;\n    delete this._planes;\n    delete this._rootElement;\n    delete this._viewport;\n  };\n\n  Canvas.prototype._clear = function() {\n\n    const allElements = this._elementRegistry.getAll();\n\n    // remove all elements\n    allElements.forEach(element => {\n      const type = getType(element);\n\n      if (type === 'root') {\n        this.removeRootElement(element);\n      } else {\n        this._removeElement(element, type);\n      }\n    });\n\n    // remove all planes\n    this._planes = [];\n    this._rootElement = null;\n\n    // force recomputation of view box\n    delete this._cachedViewbox;\n  };\n\n  /**\n   * Returns the default layer on which\n   * all elements are drawn.\n   *\n   * @return {SVGElement}  The SVG element of the layer.\n   */\n  Canvas.prototype.getDefaultLayer = function() {\n    return this.getLayer(BASE_LAYER, PLANE_LAYER_INDEX);\n  };\n\n  /**\n   * Returns a layer that is used to draw elements\n   * or annotations on it.\n   *\n   * Non-existing layers retrieved through this method\n   * will be created. During creation, the optional index\n   * may be used to create layers below or above existing layers.\n   * A layer with a certain index is always created above all\n   * existing layers with the same index.\n   *\n   * @param {string} name The name of the layer.\n   * @param {number} [index] The index of the layer.\n   *\n   * @return {SVGElement} The SVG element of the layer.\n   */\n  Canvas.prototype.getLayer = function(name, index) {\n\n    if (!name) {\n      throw new Error('must specify a name');\n    }\n\n    let layer = this._layers[name];\n\n    if (!layer) {\n      layer = this._layers[name] = this._createLayer(name, index);\n    }\n\n    // throw an error if layer creation / retrival is\n    // requested on different index\n    if (typeof index !== 'undefined' && layer.index !== index) {\n      throw new Error('layer <' + name + '> already created at index <' + index + '>');\n    }\n\n    return layer.group;\n  };\n\n  /**\n   * For a given index, return the number of layers that have a higher index and\n   * are visible.\n   *\n   * This is used to determine the node a layer should be inserted at.\n   *\n   * @param {number} index\n   *\n   * @return {number}\n   */\n  Canvas.prototype._getChildIndex = function(index) {\n    return reduce(this._layers, function(childIndex, layer) {\n      if (layer.visible && index >= layer.index) {\n        childIndex++;\n      }\n\n      return childIndex;\n    }, 0);\n  };\n\n  /**\n   * Creates a given layer and returns it.\n   *\n   * @param {string} name\n   * @param {number} [index=0]\n   *\n   * @return {CanvasLayer}\n   */\n  Canvas.prototype._createLayer = function(name, index) {\n\n    if (typeof index === 'undefined') {\n      index = UTILITY_LAYER_INDEX;\n    }\n\n    const childIndex = this._getChildIndex(index);\n\n    return {\n      group: createGroup(this._viewport, 'layer-' + name, childIndex),\n      index: index,\n      visible: true\n    };\n  };\n\n\n  /**\n   * Shows a given layer.\n   *\n   * @param {string} name The name of the layer.\n   *\n   * @return {SVGElement} The SVG element of the layer.\n   */\n  Canvas.prototype.showLayer = function(name) {\n\n    if (!name) {\n      throw new Error('must specify a name');\n    }\n\n    const layer = this._layers[name];\n\n    if (!layer) {\n      throw new Error('layer <' + name + '> does not exist');\n    }\n\n    const viewport = this._viewport;\n    const group = layer.group;\n    const index = layer.index;\n\n    if (layer.visible) {\n      return group;\n    }\n\n    const childIndex = this._getChildIndex(index);\n\n    viewport.insertBefore(group, viewport.childNodes[childIndex] || null);\n\n    layer.visible = true;\n\n    return group;\n  };\n\n  /**\n   * Hides a given layer.\n   *\n   * @param {string} name The name of the layer.\n   *\n   * @return {SVGElement} The SVG element of the layer.\n   */\n  Canvas.prototype.hideLayer = function(name) {\n\n    if (!name) {\n      throw new Error('must specify a name');\n    }\n\n    const layer = this._layers[name];\n\n    if (!layer) {\n      throw new Error('layer <' + name + '> does not exist');\n    }\n\n    const group = layer.group;\n\n    if (!layer.visible) {\n      return group;\n    }\n\n    remove$1(group);\n\n    layer.visible = false;\n\n    return group;\n  };\n\n\n  Canvas.prototype._removeLayer = function(name) {\n\n    const layer = this._layers[name];\n\n    if (layer) {\n      delete this._layers[name];\n\n      remove$1(layer.group);\n    }\n  };\n\n  /**\n   * Returns the currently active layer. Can be null.\n   *\n   * @return {CanvasLayer|null} The active layer of `null`.\n   */\n  Canvas.prototype.getActiveLayer = function() {\n    const plane = this._findPlaneForRoot(this.getRootElement());\n\n    if (!plane) {\n      return null;\n    }\n\n    return plane.layer;\n  };\n\n\n  /**\n   * Returns the plane which contains the given element.\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element or its ID.\n   *\n   * @return {RootLike|undefined} The root of the element.\n   */\n  Canvas.prototype.findRoot = function(element) {\n    if (typeof element === 'string') {\n      element = this._elementRegistry.get(element);\n    }\n\n    if (!element) {\n      return;\n    }\n\n    const plane = this._findPlaneForRoot(\n      findRoot(element)\n    ) || {};\n\n    return plane.rootElement;\n  };\n\n  /**\n   * Return a list of all root elements on the diagram.\n   *\n   * @return {(RootLike)[]} The list of root elements.\n   */\n  Canvas.prototype.getRootElements = function() {\n    return this._planes.map(function(plane) {\n      return plane.rootElement;\n    });\n  };\n\n  Canvas.prototype._findPlaneForRoot = function(rootElement) {\n    return find(this._planes, function(plane) {\n      return plane.rootElement === rootElement;\n    });\n  };\n\n\n  /**\n   * Returns the html element that encloses the\n   * drawing canvas.\n   *\n   * @return {HTMLElement} The HTML element of the container.\n   */\n  Canvas.prototype.getContainer = function() {\n    return this._container;\n  };\n\n\n  // markers //////////////////////\n\n  Canvas.prototype._updateMarker = function(element, marker, add) {\n    let container;\n\n    if (!element.id) {\n      element = this._elementRegistry.get(element);\n    }\n\n    // we need to access all\n    container = this._elementRegistry._elements[element.id];\n\n    if (!container) {\n      return;\n    }\n\n    forEach$1([ container.gfx, container.secondaryGfx ], function(gfx) {\n      if (gfx) {\n\n        // invoke either addClass or removeClass based on mode\n        if (add) {\n          classes(gfx).add(marker);\n        } else {\n          classes(gfx).remove(marker);\n        }\n      }\n    });\n\n    /**\n     * An event indicating that a marker has been updated for an element\n     *\n     * @event element.marker.update\n     * @type {Object}\n     * @property {Element} element the shape\n     * @property {SVGElement} gfx the graphical representation of the shape\n     * @property {string} marker\n     * @property {boolean} add true if the marker was added, false if it got removed\n     */\n    this._eventBus.fire('element.marker.update', { element: element, gfx: container.gfx, marker: marker, add: !!add });\n  };\n\n\n  /**\n   * Adds a marker to an element (basically a css class).\n   *\n   * Fires the element.marker.update event, making it possible to\n   * integrate extension into the marker life-cycle, too.\n   *\n   * @example\n   *\n   * ```javascript\n   * canvas.addMarker('foo', 'some-marker');\n   *\n   * const fooGfx = canvas.getGraphics('foo');\n   *\n   * fooGfx; // <g class=\"... some-marker\"> ... </g>\n   * ```\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element or its ID.\n   * @param {string} marker The marker.\n   */\n  Canvas.prototype.addMarker = function(element, marker) {\n    this._updateMarker(element, marker, true);\n  };\n\n\n  /**\n   * Remove a marker from an element.\n   *\n   * Fires the element.marker.update event, making it possible to\n   * integrate extension into the marker life-cycle, too.\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element or its ID.\n   * @param {string} marker The marker.\n   */\n  Canvas.prototype.removeMarker = function(element, marker) {\n    this._updateMarker(element, marker, false);\n  };\n\n  /**\n   * Check whether an element has a given marker.\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element or its ID.\n   * @param {string} marker The marker.\n   */\n  Canvas.prototype.hasMarker = function(element, marker) {\n    if (!element.id) {\n      element = this._elementRegistry.get(element);\n    }\n\n    const gfx = this.getGraphics(element);\n\n    return classes(gfx).has(marker);\n  };\n\n  /**\n   * Toggles a marker on an element.\n   *\n   * Fires the element.marker.update event, making it possible to\n   * integrate extension into the marker life-cycle, too.\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element or its ID.\n   * @param {string} marker The marker.\n   */\n  Canvas.prototype.toggleMarker = function(element, marker) {\n    if (this.hasMarker(element, marker)) {\n      this.removeMarker(element, marker);\n    } else {\n      this.addMarker(element, marker);\n    }\n  };\n\n  /**\n   * Returns the current root element.\n   *\n   * Supports two different modes for handling root elements:\n   *\n   * 1. if no root element has been added before, an implicit root will be added\n   * and returned. This is used in applications that don't require explicit\n   * root elements.\n   *\n   * 2. when root elements have been added before calling `getRootElement`,\n   * root elements can be null. This is used for applications that want to manage\n   * root elements themselves.\n   *\n   * @return {RootLike} The current root element.\n   */\n  Canvas.prototype.getRootElement = function() {\n    const rootElement = this._rootElement;\n\n    // can return null if root elements are present but none was set yet\n    if (rootElement || this._planes.length) {\n      return rootElement;\n    }\n\n    return this.setRootElement(this.addRootElement(null));\n  };\n\n  /**\n   * Adds a given root element and returns it.\n   *\n   * @param {RootLike} [rootElement] The root element to be added.\n   *\n   * @return {RootLike} The added root element or an implicit root element.\n   */\n  Canvas.prototype.addRootElement = function(rootElement) {\n    const idx = this._rootsIdx++;\n\n    if (!rootElement) {\n      rootElement = {\n        id: '__implicitroot_' + idx,\n        children: [],\n        isImplicit: true\n      };\n    }\n\n    const layerName = rootElement.layer = 'root-' + idx;\n\n    this._ensureValid('root', rootElement);\n\n    const layer = this.getLayer(layerName, PLANE_LAYER_INDEX);\n\n    this.hideLayer(layerName);\n\n    this._addRoot(rootElement, layer);\n\n    this._planes.push({\n      rootElement: rootElement,\n      layer: layer\n    });\n\n    return rootElement;\n  };\n\n  /**\n   * Removes a given root element and returns it.\n   *\n   * @param {RootLike|string} rootElement element or element ID\n   *\n   * @return {RootLike|undefined} removed element\n   */\n  Canvas.prototype.removeRootElement = function(rootElement) {\n\n    if (typeof rootElement === 'string') {\n      rootElement = this._elementRegistry.get(rootElement);\n    }\n\n    const plane = this._findPlaneForRoot(rootElement);\n\n    if (!plane) {\n      return;\n    }\n\n    // hook up life-cycle events\n    this._removeRoot(rootElement);\n\n    // clean up layer\n    this._removeLayer(rootElement.layer);\n\n    // clean up plane\n    this._planes = this._planes.filter(function(plane) {\n      return plane.rootElement !== rootElement;\n    });\n\n    // clean up active root\n    if (this._rootElement === rootElement) {\n      this._rootElement = null;\n    }\n\n    return rootElement;\n  };\n\n\n  /**\n   * Sets a given element as the new root element for the canvas\n   * and returns the new root element.\n   *\n   * @param {RootLike} rootElement The root element to be set.\n   *\n   * @return {RootLike} The set root element.\n   */\n  Canvas.prototype.setRootElement = function(rootElement) {\n\n    if (rootElement === this._rootElement) {\n      return;\n    }\n\n    let plane;\n\n    if (!rootElement) {\n      throw new Error('rootElement required');\n    }\n\n    plane = this._findPlaneForRoot(rootElement);\n\n    // give set add semantics for backwards compatibility\n    if (!plane) {\n      rootElement = this.addRootElement(rootElement);\n    }\n\n    this._setRoot(rootElement);\n\n    return rootElement;\n  };\n\n\n  Canvas.prototype._removeRoot = function(element) {\n    const elementRegistry = this._elementRegistry,\n          eventBus = this._eventBus;\n\n    // simulate element remove event sequence\n    eventBus.fire('root.remove', { element: element });\n    eventBus.fire('root.removed', { element: element });\n\n    elementRegistry.remove(element);\n  };\n\n\n  Canvas.prototype._addRoot = function(element, gfx) {\n    const elementRegistry = this._elementRegistry,\n          eventBus = this._eventBus;\n\n    // resemble element add event sequence\n    eventBus.fire('root.add', { element: element });\n\n    elementRegistry.add(element, gfx);\n\n    eventBus.fire('root.added', { element: element, gfx: gfx });\n  };\n\n\n  Canvas.prototype._setRoot = function(rootElement, layer) {\n\n    const currentRoot = this._rootElement;\n\n    if (currentRoot) {\n\n      // un-associate previous root element <svg>\n      this._elementRegistry.updateGraphics(currentRoot, null, true);\n\n      // hide previous layer\n      this.hideLayer(currentRoot.layer);\n    }\n\n    if (rootElement) {\n\n      if (!layer) {\n        layer = this._findPlaneForRoot(rootElement).layer;\n      }\n\n      // associate element with <svg>\n      this._elementRegistry.updateGraphics(rootElement, this._svg, true);\n\n      // show root layer\n      this.showLayer(rootElement.layer);\n    }\n\n    this._rootElement = rootElement;\n\n    this._eventBus.fire('root.set', { element: rootElement });\n  };\n\n  Canvas.prototype._ensureValid = function(type, element) {\n    if (!element.id) {\n      throw new Error('element must have an id');\n    }\n\n    if (this._elementRegistry.get(element.id)) {\n      throw new Error('element <' + element.id + '> already exists');\n    }\n\n    const requiredAttrs = REQUIRED_MODEL_ATTRS[type];\n\n    const valid = every(requiredAttrs, function(attr) {\n      return typeof element[attr] !== 'undefined';\n    });\n\n    if (!valid) {\n      throw new Error(\n        'must supply { ' + requiredAttrs.join(', ') + ' } with ' + type);\n    }\n  };\n\n  Canvas.prototype._setParent = function(element, parent, parentIndex) {\n    add(parent.children, element, parentIndex);\n    element.parent = parent;\n  };\n\n  /**\n   * Adds an element to the canvas.\n   *\n   * This wires the parent <-> child relationship between the element and\n   * a explicitly specified parent or an implicit root element.\n   *\n   * During add it emits the events\n   *\n   *  * <{type}.add> (element, parent)\n   *  * <{type}.added> (element, gfx)\n   *\n   * Extensions may hook into these events to perform their magic.\n   *\n   * @param {string} type\n   * @param {ConnectionLike|ShapeLike} element\n   * @param {ShapeLike} [parent]\n   * @param {number} [parentIndex]\n   *\n   * @return {ConnectionLike|ShapeLike} The added element.\n   */\n  Canvas.prototype._addElement = function(type, element, parent, parentIndex) {\n\n    parent = parent || this.getRootElement();\n\n    const eventBus = this._eventBus,\n          graphicsFactory = this._graphicsFactory;\n\n    this._ensureValid(type, element);\n\n    eventBus.fire(type + '.add', { element: element, parent: parent });\n\n    this._setParent(element, parent, parentIndex);\n\n    // create graphics\n    const gfx = graphicsFactory.create(type, element, parentIndex);\n\n    this._elementRegistry.add(element, gfx);\n\n    // update its visual\n    graphicsFactory.update(type, element, gfx);\n\n    eventBus.fire(type + '.added', { element: element, gfx: gfx });\n\n    return element;\n  };\n\n  /**\n   * Adds a shape to the canvas.\n   *\n   * @param {ShapeLike} shape The shape to be added\n   * @param {ParentLike} [parent] The shape's parent.\n   * @param {number} [parentIndex] The index at which to add the shape to the parent's children.\n   *\n   * @return {ShapeLike} The added shape.\n   */\n  Canvas.prototype.addShape = function(shape, parent, parentIndex) {\n    return this._addElement('shape', shape, parent, parentIndex);\n  };\n\n  /**\n   * Adds a connection to the canvas.\n   *\n   * @param {ConnectionLike} connection The connection to be added.\n   * @param {ParentLike} [parent] The connection's parent.\n   * @param {number} [parentIndex] The index at which to add the connection to the parent's children.\n   *\n   * @return {ConnectionLike} The added connection.\n   */\n  Canvas.prototype.addConnection = function(connection, parent, parentIndex) {\n    return this._addElement('connection', connection, parent, parentIndex);\n  };\n\n\n  /**\n   * Internal remove element\n   */\n  Canvas.prototype._removeElement = function(element, type) {\n\n    const elementRegistry = this._elementRegistry,\n          graphicsFactory = this._graphicsFactory,\n          eventBus = this._eventBus;\n\n    element = elementRegistry.get(element.id || element);\n\n    if (!element) {\n\n      // element was removed already\n      return;\n    }\n\n    eventBus.fire(type + '.remove', { element: element });\n\n    graphicsFactory.remove(element);\n\n    // unset parent <-> child relationship\n    remove(element.parent && element.parent.children, element);\n    element.parent = null;\n\n    eventBus.fire(type + '.removed', { element: element });\n\n    elementRegistry.remove(element);\n\n    return element;\n  };\n\n\n  /**\n   * Removes a shape from the canvas.\n   *\n   * @fires ShapeRemoveEvent\n   * @fires ShapeRemovedEvent\n   *\n   * @param {ShapeLike|string} shape The shape or its ID.\n   *\n   * @return {ShapeLike} The removed shape.\n   */\n  Canvas.prototype.removeShape = function(shape) {\n\n    /**\n     * An event indicating that a shape is about to be removed from the canvas.\n     *\n     * @memberOf Canvas\n     *\n     * @event ShapeRemoveEvent\n     * @type {Object}\n     * @property {ShapeLike} element The shape.\n     * @property {SVGElement} gfx The graphical element.\n     */\n\n    /**\n     * An event indicating that a shape has been removed from the canvas.\n     *\n     * @memberOf Canvas\n     *\n     * @event ShapeRemovedEvent\n     * @type {Object}\n     * @property {ShapeLike} element The shape.\n     * @property {SVGElement} gfx The graphical element.\n     */\n    return this._removeElement(shape, 'shape');\n  };\n\n\n  /**\n   * Removes a connection from the canvas.\n   *\n   * @fires ConnectionRemoveEvent\n   * @fires ConnectionRemovedEvent\n   *\n   * @param {ConnectionLike|string} connection The connection or its ID.\n   *\n   * @return {ConnectionLike} The removed connection.\n   */\n  Canvas.prototype.removeConnection = function(connection) {\n\n    /**\n     * An event indicating that a connection is about to be removed from the canvas.\n     *\n     * @memberOf Canvas\n     *\n     * @event ConnectionRemoveEvent\n     * @type {Object}\n     * @property {ConnectionLike} element The connection.\n     * @property {SVGElement} gfx The graphical element.\n     */\n\n    /**\n     * An event indicating that a connection has been removed from the canvas.\n     *\n     * @memberOf Canvas\n     *\n     * @event ConnectionRemovedEvent\n     * @type {Object}\n     * @property {ConnectionLike} element The connection.\n     * @property {SVGElement} gfx The graphical element.\n     */\n    return this._removeElement(connection, 'connection');\n  };\n\n\n  /**\n   * Returns the graphical element of an element.\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element or its ID.\n   * @param {boolean} [secondary=false] Whether to return the secondary graphical element.\n   *\n   * @return {SVGElement} The graphical element.\n   */\n  Canvas.prototype.getGraphics = function(element, secondary) {\n    return this._elementRegistry.getGraphics(element, secondary);\n  };\n\n\n  /**\n   * Perform a viewbox update via a given change function.\n   *\n   * @param {Function} changeFn\n   */\n  Canvas.prototype._changeViewbox = function(changeFn) {\n\n    // notify others of the upcoming viewbox change\n    this._eventBus.fire('canvas.viewbox.changing');\n\n    // perform actual change\n    changeFn.apply(this);\n\n    // reset the cached viewbox so that\n    // a new get operation on viewbox or zoom\n    // triggers a viewbox re-computation\n    this._cachedViewbox = null;\n\n    // notify others of the change; this step\n    // may or may not be debounced\n    this._viewboxChanged();\n  };\n\n  Canvas.prototype._viewboxChanged = function() {\n    this._eventBus.fire('canvas.viewbox.changed', { viewbox: this.viewbox() });\n  };\n\n\n  /**\n   * Gets or sets the view box of the canvas, i.e. the\n   * area that is currently displayed.\n   *\n   * The getter may return a cached viewbox (if it is currently\n   * changing). To force a recomputation, pass `false` as the first argument.\n   *\n   * @example\n   *\n   * ```javascript\n   * canvas.viewbox({ x: 100, y: 100, width: 500, height: 500 })\n   *\n   * // sets the visible area of the diagram to (100|100) -> (600|100)\n   * // and and scales it according to the diagram width\n   *\n   * const viewbox = canvas.viewbox(); // pass `false` to force recomputing the box.\n   *\n   * console.log(viewbox);\n   * // {\n   * //   inner: Dimensions,\n   * //   outer: Dimensions,\n   * //   scale,\n   * //   x, y,\n   * //   width, height\n   * // }\n   *\n   * // if the current diagram is zoomed and scrolled, you may reset it to the\n   * // default zoom via this method, too:\n   *\n   * const zoomedAndScrolledViewbox = canvas.viewbox();\n   *\n   * canvas.viewbox({\n   *   x: 0,\n   *   y: 0,\n   *   width: zoomedAndScrolledViewbox.outer.width,\n   *   height: zoomedAndScrolledViewbox.outer.height\n   * });\n   * ```\n   *\n   * @param {Rect} [box] The viewbox to be set.\n   *\n   * @return {CanvasViewbox} The set viewbox.\n   */\n  Canvas.prototype.viewbox = function(box) {\n\n    if (box === undefined && this._cachedViewbox) {\n      return this._cachedViewbox;\n    }\n\n    const viewport = this._viewport,\n          outerBox = this.getSize();\n    let innerBox,\n        matrix,\n        activeLayer,\n        transform,\n        scale,\n        x, y;\n\n    if (!box) {\n\n      // compute the inner box based on the\n      // diagrams active layer. This allows us to exclude\n      // external components, such as overlays\n\n      activeLayer = this._rootElement ? this.getActiveLayer() : null;\n      innerBox = activeLayer && activeLayer.getBBox() || {};\n\n      transform = transform$1(viewport);\n      matrix = transform ? transform.matrix : createMatrix();\n      scale = round$b(matrix.a, 1000);\n\n      x = round$b(-matrix.e || 0, 1000);\n      y = round$b(-matrix.f || 0, 1000);\n\n      box = this._cachedViewbox = {\n        x: x ? x / scale : 0,\n        y: y ? y / scale : 0,\n        width: outerBox.width / scale,\n        height: outerBox.height / scale,\n        scale: scale,\n        inner: {\n          width: innerBox.width || 0,\n          height: innerBox.height || 0,\n          x: innerBox.x || 0,\n          y: innerBox.y || 0\n        },\n        outer: outerBox\n      };\n\n      return box;\n    } else {\n\n      this._changeViewbox(function() {\n        scale = Math.min(outerBox.width / box.width, outerBox.height / box.height);\n\n        const matrix = this._svg.createSVGMatrix()\n          .scale(scale)\n          .translate(-box.x, -box.y);\n\n        transform$1(viewport, matrix);\n      });\n    }\n\n    return box;\n  };\n\n\n  /**\n   * Gets or sets the scroll of the canvas.\n   *\n   * @param {Point} [delta] The scroll to be set.\n   *\n   * @return {Point}\n   */\n  Canvas.prototype.scroll = function(delta) {\n\n    const node = this._viewport;\n    let matrix = node.getCTM();\n\n    if (delta) {\n      this._changeViewbox(function() {\n        delta = assign$1({ dx: 0, dy: 0 }, delta || {});\n\n        matrix = this._svg.createSVGMatrix().translate(delta.dx, delta.dy).multiply(matrix);\n\n        setCTM(node, matrix);\n      });\n    }\n\n    return { x: matrix.e, y: matrix.f };\n  };\n\n  /**\n   * Scrolls the viewbox to contain the given element.\n   * Optionally specify a padding to be applied to the edges.\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element to scroll to or its ID.\n   * @param {RectTRBL|number} [padding=100] The padding to be applied. Can also specify top, bottom, left and right.\n   */\n  Canvas.prototype.scrollToElement = function(element, padding) {\n    let defaultPadding = 100;\n\n    if (typeof element === 'string') {\n      element = this._elementRegistry.get(element);\n    }\n\n    // set to correct rootElement\n    const rootElement = this.findRoot(element);\n\n    if (rootElement !== this.getRootElement()) {\n      this.setRootElement(rootElement);\n    }\n\n    if (!padding) {\n      padding = {};\n    }\n    if (typeof padding === 'number') {\n      defaultPadding = padding;\n    }\n\n    padding = {\n      top: padding.top || defaultPadding,\n      right: padding.right || defaultPadding,\n      bottom: padding.bottom || defaultPadding,\n      left: padding.left || defaultPadding\n    };\n\n    const elementBounds = getBBox(element),\n          elementTrbl = asTRBL(elementBounds),\n          viewboxBounds = this.viewbox(),\n          zoom = this.zoom();\n    let dx, dy;\n\n    // shrink viewboxBounds with padding\n    viewboxBounds.y += padding.top / zoom;\n    viewboxBounds.x += padding.left / zoom;\n    viewboxBounds.width -= (padding.right + padding.left) / zoom;\n    viewboxBounds.height -= (padding.bottom + padding.top) / zoom;\n\n    const viewboxTrbl = asTRBL(viewboxBounds);\n\n    const canFit = elementBounds.width < viewboxBounds.width && elementBounds.height < viewboxBounds.height;\n\n    if (!canFit) {\n\n      // top-left when element can't fit\n      dx = elementBounds.x - viewboxBounds.x;\n      dy = elementBounds.y - viewboxBounds.y;\n\n    } else {\n\n      const dRight = Math.max(0, elementTrbl.right - viewboxTrbl.right),\n            dLeft = Math.min(0, elementTrbl.left - viewboxTrbl.left),\n            dBottom = Math.max(0, elementTrbl.bottom - viewboxTrbl.bottom),\n            dTop = Math.min(0, elementTrbl.top - viewboxTrbl.top);\n\n      dx = dRight || dLeft;\n      dy = dBottom || dTop;\n\n    }\n\n    this.scroll({ dx: -dx * zoom, dy: -dy * zoom });\n  };\n\n  /**\n   * Gets or sets the current zoom of the canvas, optionally zooming to the\n   * specified position.\n   *\n   * The getter may return a cached zoom level. Call it with `false` as the first\n   * argument to force recomputation of the current level.\n   *\n   * @param {number|'fit-viewport'} [newScale] The new zoom level, either a number,\n   * i.e. 0.9, or `fit-viewport` to adjust the size to fit the current viewport.\n   * @param {Point} [center] The reference point { x: ..., y: ...} to zoom to.\n   *\n   * @return {number} The set zoom level.\n   */\n  Canvas.prototype.zoom = function(newScale, center) {\n\n    if (!newScale) {\n      return this.viewbox(newScale).scale;\n    }\n\n    if (newScale === 'fit-viewport') {\n      return this._fitViewport(center);\n    }\n\n    let outer,\n        matrix;\n\n    this._changeViewbox(function() {\n\n      if (typeof center !== 'object') {\n        outer = this.viewbox().outer;\n\n        center = {\n          x: outer.width / 2,\n          y: outer.height / 2\n        };\n      }\n\n      matrix = this._setZoom(newScale, center);\n    });\n\n    return round$b(matrix.a, 1000);\n  };\n\n  function setCTM(node, m) {\n    const mstr = 'matrix(' + m.a + ',' + m.b + ',' + m.c + ',' + m.d + ',' + m.e + ',' + m.f + ')';\n    node.setAttribute('transform', mstr);\n  }\n\n  Canvas.prototype._fitViewport = function(center) {\n\n    const vbox = this.viewbox(),\n          outer = vbox.outer,\n          inner = vbox.inner;\n    let newScale,\n        newViewbox;\n\n    // display the complete diagram without zooming in.\n    // instead of relying on internal zoom, we perform a\n    // hard reset on the canvas viewbox to realize this\n    //\n    // if diagram does not need to be zoomed in, we focus it around\n    // the diagram origin instead\n\n    if (inner.x >= 0 &&\n        inner.y >= 0 &&\n        inner.x + inner.width <= outer.width &&\n        inner.y + inner.height <= outer.height &&\n        !center) {\n\n      newViewbox = {\n        x: 0,\n        y: 0,\n        width: Math.max(inner.width + inner.x, outer.width),\n        height: Math.max(inner.height + inner.y, outer.height)\n      };\n    } else {\n\n      newScale = Math.min(1, outer.width / inner.width, outer.height / inner.height);\n      newViewbox = {\n        x: inner.x + (center ? inner.width / 2 - outer.width / newScale / 2 : 0),\n        y: inner.y + (center ? inner.height / 2 - outer.height / newScale / 2 : 0),\n        width: outer.width / newScale,\n        height: outer.height / newScale\n      };\n    }\n\n    this.viewbox(newViewbox);\n\n    return this.viewbox(false).scale;\n  };\n\n\n  Canvas.prototype._setZoom = function(scale, center) {\n\n    const svg = this._svg,\n          viewport = this._viewport;\n\n    const matrix = svg.createSVGMatrix();\n    const point = svg.createSVGPoint();\n\n    let centerPoint,\n        originalPoint,\n        currentMatrix,\n        scaleMatrix,\n        newMatrix;\n\n    currentMatrix = viewport.getCTM();\n\n    const currentScale = currentMatrix.a;\n\n    if (center) {\n      centerPoint = assign$1(point, center);\n\n      // revert applied viewport transformations\n      originalPoint = centerPoint.matrixTransform(currentMatrix.inverse());\n\n      // create scale matrix\n      scaleMatrix = matrix\n        .translate(originalPoint.x, originalPoint.y)\n        .scale(1 / currentScale * scale)\n        .translate(-originalPoint.x, -originalPoint.y);\n\n      newMatrix = currentMatrix.multiply(scaleMatrix);\n    } else {\n      newMatrix = matrix.scale(scale);\n    }\n\n    setCTM(this._viewport, newMatrix);\n\n    return newMatrix;\n  };\n\n\n  /**\n   * Returns the size of the canvas.\n   *\n   * @return {Dimensions} The size of the canvas.\n   */\n  Canvas.prototype.getSize = function() {\n    return {\n      width: this._container.clientWidth,\n      height: this._container.clientHeight\n    };\n  };\n\n\n  /**\n   * Returns the absolute bounding box of an element.\n   *\n   * The absolute bounding box may be used to display overlays in the callers\n   * (browser) coordinate system rather than the zoomed in/out canvas coordinates.\n   *\n   * @param {ShapeLike|ConnectionLike} element The element.\n   *\n   * @return {Rect} The element's absolute bounding box.\n   */\n  Canvas.prototype.getAbsoluteBBox = function(element) {\n    const vbox = this.viewbox();\n    let bbox;\n\n    // connection\n    // use svg bbox\n    if (element.waypoints) {\n      const gfx = this.getGraphics(element);\n\n      bbox = gfx.getBBox();\n    }\n\n    // shapes\n    // use data\n    else {\n      bbox = element;\n    }\n\n    const x = bbox.x * vbox.scale - vbox.x * vbox.scale;\n    const y = bbox.y * vbox.scale - vbox.y * vbox.scale;\n\n    const width = bbox.width * vbox.scale;\n    const height = bbox.height * vbox.scale;\n\n    return {\n      x: x,\n      y: y,\n      width: width,\n      height: height\n    };\n  };\n\n  /**\n   * Fires an event so other modules can react to the canvas resizing.\n   */\n  Canvas.prototype.resized = function() {\n\n    // force recomputation of view box\n    delete this._cachedViewbox;\n\n    this._eventBus.fire('canvas.resized');\n  };\n\n  var ELEMENT_ID = 'data-element-id';\n\n  /**\n   * @typedef {import('./Types').ElementLike} ElementLike\n   *\n   * @typedef {import('./EventBus').default} EventBus\n   *\n   * @typedef { (element: ElementLike, gfx: SVGElement) => boolean|any } ElementRegistryFilterCallback\n   * @typedef { (element: ElementLike, gfx: SVGElement) => any } ElementRegistryForEachCallback\n   */\n\n  /**\n   * A registry that keeps track of all shapes in the diagram.\n   *\n   * @class\n   * @constructor\n   *\n   * @param {EventBus} eventBus\n   */\n  function ElementRegistry(eventBus) {\n\n    /**\n     * @type { {\n     *   [id: string]: {\n     *     element: ElementLike;\n     *     gfx?: SVGElement;\n     *     secondaryGfx?: SVGElement;\n     *   }\n     * } }\n     */\n    this._elements = {};\n\n    this._eventBus = eventBus;\n  }\n\n  ElementRegistry.$inject = [ 'eventBus' ];\n\n  /**\n   * Add an element and its graphical representation(s) to the registry.\n   *\n   * @param {ElementLike} element The element to be added.\n   * @param {SVGElement} gfx The primary graphical representation.\n   * @param {SVGElement} [secondaryGfx] The secondary graphical representation.\n   */\n  ElementRegistry.prototype.add = function(element, gfx, secondaryGfx) {\n\n    var id = element.id;\n\n    this._validateId(id);\n\n    // associate dom node with element\n    attr(gfx, ELEMENT_ID, id);\n\n    if (secondaryGfx) {\n      attr(secondaryGfx, ELEMENT_ID, id);\n    }\n\n    this._elements[id] = { element: element, gfx: gfx, secondaryGfx: secondaryGfx };\n  };\n\n  /**\n   * Remove an element from the registry.\n   *\n   * @param {ElementLike|string} element\n   */\n  ElementRegistry.prototype.remove = function(element) {\n    var elements = this._elements,\n        id = element.id || element,\n        container = id && elements[id];\n\n    if (container) {\n\n      // unset element id on gfx\n      attr(container.gfx, ELEMENT_ID, '');\n\n      if (container.secondaryGfx) {\n        attr(container.secondaryGfx, ELEMENT_ID, '');\n      }\n\n      delete elements[id];\n    }\n  };\n\n  /**\n   * Update an elements ID.\n   *\n   * @param {ElementLike|string} element The element or its ID.\n   * @param {string} newId The new ID.\n   */\n  ElementRegistry.prototype.updateId = function(element, newId) {\n\n    this._validateId(newId);\n\n    if (typeof element === 'string') {\n      element = this.get(element);\n    }\n\n    this._eventBus.fire('element.updateId', {\n      element: element,\n      newId: newId\n    });\n\n    var gfx = this.getGraphics(element),\n        secondaryGfx = this.getGraphics(element, true);\n\n    this.remove(element);\n\n    element.id = newId;\n\n    this.add(element, gfx, secondaryGfx);\n  };\n\n  /**\n   * Update the graphical representation of an element.\n   *\n   * @param {ElementLike|string} filter The element or its ID.\n   * @param {SVGElement} gfx The new graphical representation.\n   * @param {boolean} [secondary=false] Whether to update the secondary graphical representation.\n   */\n  ElementRegistry.prototype.updateGraphics = function(filter, gfx, secondary) {\n    var id = filter.id || filter;\n\n    var container = this._elements[id];\n\n    if (secondary) {\n      container.secondaryGfx = gfx;\n    } else {\n      container.gfx = gfx;\n    }\n\n    if (gfx) {\n      attr(gfx, ELEMENT_ID, id);\n    }\n\n    return gfx;\n  };\n\n  /**\n   * Get the element with the given ID or graphical representation.\n   *\n   * @example\n   *\n   * ```javascript\n   * elementRegistry.get('SomeElementId_1');\n   *\n   * elementRegistry.get(gfx);\n   * ```\n   *\n   * @param {string|SVGElement} filter The elements ID or graphical representation.\n   *\n   * @return {ElementLike|undefined} The element.\n   */\n  ElementRegistry.prototype.get = function(filter) {\n    var id;\n\n    if (typeof filter === 'string') {\n      id = filter;\n    } else {\n      id = filter && attr(filter, ELEMENT_ID);\n    }\n\n    var container = this._elements[id];\n    return container && container.element;\n  };\n\n  /**\n   * Return all elements that match a given filter function.\n   *\n   * @param {ElementRegistryFilterCallback} fn The filter function.\n   *\n   * @return {ElementLike[]} The matching elements.\n   */\n  ElementRegistry.prototype.filter = function(fn) {\n\n    var filtered = [];\n\n    this.forEach(function(element, gfx) {\n      if (fn(element, gfx)) {\n        filtered.push(element);\n      }\n    });\n\n    return filtered;\n  };\n\n  /**\n   * Return the first element that matches the given filter function.\n   *\n   * @param {ElementRegistryFilterCallback} fn The filter function.\n   *\n   * @return {ElementLike|undefined} The matching element.\n   */\n  ElementRegistry.prototype.find = function(fn) {\n    var map = this._elements,\n        keys = Object.keys(map);\n\n    for (var i = 0; i < keys.length; i++) {\n      var id = keys[i],\n          container = map[id],\n          element = container.element,\n          gfx = container.gfx;\n\n      if (fn(element, gfx)) {\n        return element;\n      }\n    }\n  };\n\n  /**\n   * Get all elements.\n   *\n   * @return {ElementLike[]} All elements.\n   */\n  ElementRegistry.prototype.getAll = function() {\n    return this.filter(function(e) { return e; });\n  };\n\n  /**\n   * Execute a given function for each element.\n   *\n   * @param {ElementRegistryForEachCallback} fn The function to execute.\n   */\n  ElementRegistry.prototype.forEach = function(fn) {\n\n    var map = this._elements;\n\n    Object.keys(map).forEach(function(id) {\n      var container = map[id],\n          element = container.element,\n          gfx = container.gfx;\n\n      return fn(element, gfx);\n    });\n  };\n\n  /**\n   * Return the graphical representation of an element.\n   *\n   * @example\n   *\n   * ```javascript\n   * elementRegistry.getGraphics('SomeElementId_1');\n   *\n   * elementRegistry.getGraphics(rootElement); // <g ...>\n   *\n   * elementRegistry.getGraphics(rootElement, true); // <svg ...>\n   * ```\n   *\n   * @param {ElementLike|string} filter The element or its ID.\n   * @param {boolean} [secondary=false] Whether to return the secondary graphical representation.\n   *\n   * @return {SVGElement} The graphical representation.\n   */\n  ElementRegistry.prototype.getGraphics = function(filter, secondary) {\n    var id = filter.id || filter;\n\n    var container = this._elements[id];\n    return container && (secondary ? container.secondaryGfx : container.gfx);\n  };\n\n  /**\n   * Validate an ID and throw an error if invalid.\n   *\n   * @param {string} id\n   *\n   * @throws {Error} Error indicating that the ID is invalid or already assigned.\n   */\n  ElementRegistry.prototype._validateId = function(id) {\n    if (!id) {\n      throw new Error('element must have an id');\n    }\n\n    if (this._elements[id]) {\n      throw new Error('element with id ' + id + ' already added');\n    }\n  };\n\n  var objectRefs = {exports: {}};\n\n  var collection = {};\n\n  /**\n   * An empty collection stub. Use {@link RefsCollection.extend} to extend a\n   * collection with ref semantics.\n   *\n   * @class RefsCollection\n   */\n\n  /**\n   * Extends a collection with {@link Refs} aware methods\n   *\n   * @memberof RefsCollection\n   * @static\n   *\n   * @param  {Array<Object>} collection\n   * @param  {Refs} refs instance\n   * @param  {Object} property represented by the collection\n   * @param  {Object} target object the collection is attached to\n   *\n   * @return {RefsCollection<Object>} the extended array\n   */\n  function extend(collection, refs, property, target) {\n\n    var inverseProperty = property.inverse;\n\n    /**\n     * Removes the given element from the array and returns it.\n     *\n     * @method RefsCollection#remove\n     *\n     * @param {Object} element the element to remove\n     */\n    Object.defineProperty(collection, 'remove', {\n      value: function(element) {\n        var idx = this.indexOf(element);\n        if (idx !== -1) {\n          this.splice(idx, 1);\n\n          // unset inverse\n          refs.unset(element, inverseProperty, target);\n        }\n\n        return element;\n      }\n    });\n\n    /**\n     * Returns true if the collection contains the given element\n     *\n     * @method RefsCollection#contains\n     *\n     * @param {Object} element the element to check for\n     */\n    Object.defineProperty(collection, 'contains', {\n      value: function(element) {\n        return this.indexOf(element) !== -1;\n      }\n    });\n\n    /**\n     * Adds an element to the array, unless it exists already (set semantics).\n     *\n     * @method RefsCollection#add\n     *\n     * @param {Object} element the element to add\n     * @param {Number} optional index to add element to\n     *                 (possibly moving other elements around)\n     */\n    Object.defineProperty(collection, 'add', {\n      value: function(element, idx) {\n\n        var currentIdx = this.indexOf(element);\n\n        if (typeof idx === 'undefined') {\n\n          if (currentIdx !== -1) {\n            // element already in collection (!)\n            return;\n          }\n\n          // add to end of array, as no idx is specified\n          idx = this.length;\n        }\n\n        // handle already in collection\n        if (currentIdx !== -1) {\n\n          // remove element from currentIdx\n          this.splice(currentIdx, 1);\n        }\n\n        // add element at idx\n        this.splice(idx, 0, element);\n\n        if (currentIdx === -1) {\n          // set inverse, unless element was\n          // in collection already\n          refs.set(element, inverseProperty, target);\n        }\n      }\n    });\n\n    // a simple marker, identifying this element\n    // as being a refs collection\n    Object.defineProperty(collection, '__refs_collection', {\n      value: true\n    });\n\n    return collection;\n  }\n\n\n  function isExtended(collection) {\n    return collection.__refs_collection === true;\n  }\n\n  collection.extend = extend;\n\n  collection.isExtended = isExtended;\n\n  var Collection = collection;\n\n  function hasOwnProperty$1(e, property) {\n    return Object.prototype.hasOwnProperty.call(e, property.name || property);\n  }\n\n  function defineCollectionProperty(ref, property, target) {\n\n    var collection = Collection.extend(target[property.name] || [], ref, property, target);\n\n    Object.defineProperty(target, property.name, {\n      enumerable: property.enumerable,\n      value: collection\n    });\n\n    if (collection.length) {\n\n      collection.forEach(function(o) {\n        ref.set(o, property.inverse, target);\n      });\n    }\n  }\n\n\n  function defineProperty$1(ref, property, target) {\n\n    var inverseProperty = property.inverse;\n\n    var _value = target[property.name];\n\n    Object.defineProperty(target, property.name, {\n      configurable: property.configurable,\n      enumerable: property.enumerable,\n\n      get: function() {\n        return _value;\n      },\n\n      set: function(value) {\n\n        // return if we already performed all changes\n        if (value === _value) {\n          return;\n        }\n\n        var old = _value;\n\n        // temporary set null\n        _value = null;\n\n        if (old) {\n          ref.unset(old, inverseProperty, target);\n        }\n\n        // set new value\n        _value = value;\n\n        // set inverse value\n        ref.set(_value, inverseProperty, target);\n      }\n    });\n\n  }\n\n  /**\n   * Creates a new references object defining two inversly related\n   * attribute descriptors a and b.\n   *\n   * <p>\n   *   When bound to an object using {@link Refs#bind} the references\n   *   get activated and ensure that add and remove operations are applied\n   *   reversely, too.\n   * </p>\n   *\n   * <p>\n   *   For attributes represented as collections {@link Refs} provides the\n   *   {@link RefsCollection#add}, {@link RefsCollection#remove} and {@link RefsCollection#contains} extensions\n   *   that must be used to properly hook into the inverse change mechanism.\n   * </p>\n   *\n   * @class Refs\n   *\n   * @classdesc A bi-directional reference between two attributes.\n   *\n   * @param {Refs.AttributeDescriptor} a property descriptor\n   * @param {Refs.AttributeDescriptor} b property descriptor\n   *\n   * @example\n   *\n   * var refs = Refs({ name: 'wheels', collection: true, enumerable: true }, { name: 'car' });\n   *\n   * var car = { name: 'toyota' };\n   * var wheels = [{ pos: 'front-left' }, { pos: 'front-right' }];\n   *\n   * refs.bind(car, 'wheels');\n   *\n   * car.wheels // []\n   * car.wheels.add(wheels[0]);\n   * car.wheels.add(wheels[1]);\n   *\n   * car.wheels // [{ pos: 'front-left' }, { pos: 'front-right' }]\n   *\n   * wheels[0].car // { name: 'toyota' };\n   * car.wheels.remove(wheels[0]);\n   *\n   * wheels[0].car // undefined\n   */\n  function Refs$1(a, b) {\n\n    if (!(this instanceof Refs$1)) {\n      return new Refs$1(a, b);\n    }\n\n    // link\n    a.inverse = b;\n    b.inverse = a;\n\n    this.props = {};\n    this.props[a.name] = a;\n    this.props[b.name] = b;\n  }\n\n  /**\n   * Binds one side of a bi-directional reference to a\n   * target object.\n   *\n   * @memberOf Refs\n   *\n   * @param  {Object} target\n   * @param  {String} property\n   */\n  Refs$1.prototype.bind = function(target, property) {\n    if (typeof property === 'string') {\n      if (!this.props[property]) {\n        throw new Error('no property <' + property + '> in ref');\n      }\n      property = this.props[property];\n    }\n\n    if (property.collection) {\n      defineCollectionProperty(this, property, target);\n    } else {\n      defineProperty$1(this, property, target);\n    }\n  };\n\n  Refs$1.prototype.ensureRefsCollection = function(target, property) {\n\n    var collection = target[property.name];\n\n    if (!Collection.isExtended(collection)) {\n      defineCollectionProperty(this, property, target);\n    }\n\n    return collection;\n  };\n\n  Refs$1.prototype.ensureBound = function(target, property) {\n    if (!hasOwnProperty$1(target, property)) {\n      this.bind(target, property);\n    }\n  };\n\n  Refs$1.prototype.unset = function(target, property, value) {\n\n    if (target) {\n      this.ensureBound(target, property);\n\n      if (property.collection) {\n        this.ensureRefsCollection(target, property).remove(value);\n      } else {\n        target[property.name] = undefined;\n      }\n    }\n  };\n\n  Refs$1.prototype.set = function(target, property, value) {\n\n    if (target) {\n      this.ensureBound(target, property);\n\n      if (property.collection) {\n        this.ensureRefsCollection(target, property).add(value);\n      } else {\n        target[property.name] = value;\n      }\n    }\n  };\n\n  var refs = Refs$1;\n\n  objectRefs.exports = refs;\n\n  objectRefs.exports.Collection = collection;\n\n  var objectRefsExports = objectRefs.exports;\n  var Refs = /*@__PURE__*/getDefaultExportFromCjs(objectRefsExports);\n\n  var parentRefs = new Refs({ name: 'children', enumerable: true, collection: true }, { name: 'parent' }),\n      labelRefs = new Refs({ name: 'labels', enumerable: true, collection: true }, { name: 'labelTarget' }),\n      attacherRefs = new Refs({ name: 'attachers', collection: true }, { name: 'host' }),\n      outgoingRefs = new Refs({ name: 'outgoing', collection: true }, { name: 'source' }),\n      incomingRefs = new Refs({ name: 'incoming', collection: true }, { name: 'target' });\n\n  /**\n   * @typedef {import('./Types').Element} Element\n   * @typedef {import('./Types').Shape} Shape\n   * @typedef {import('./Types').Root} Root\n   * @typedef {import('./Types').Label} Label\n   * @typedef {import('./Types').Connection} Connection\n   */\n\n  /**\n   * The basic graphical representation\n   *\n   * @class\n   * @constructor\n   */\n  function ElementImpl() {\n\n    /**\n     * The object that backs up the shape\n     *\n     * @name Element#businessObject\n     * @type Object\n     */\n    Object.defineProperty(this, 'businessObject', {\n      writable: true\n    });\n\n\n    /**\n     * Single label support, will mapped to multi label array\n     *\n     * @name Element#label\n     * @type Object\n     */\n    Object.defineProperty(this, 'label', {\n      get: function() {\n        return this.labels[0];\n      },\n      set: function(newLabel) {\n\n        var label = this.label,\n            labels = this.labels;\n\n        if (!newLabel && label) {\n          labels.remove(label);\n        } else {\n          labels.add(newLabel, 0);\n        }\n      }\n    });\n\n    /**\n     * The parent shape\n     *\n     * @name Element#parent\n     * @type Shape\n     */\n    parentRefs.bind(this, 'parent');\n\n    /**\n     * The list of labels\n     *\n     * @name Element#labels\n     * @type Label\n     */\n    labelRefs.bind(this, 'labels');\n\n    /**\n     * The list of outgoing connections\n     *\n     * @name Element#outgoing\n     * @type Array<Connection>\n     */\n    outgoingRefs.bind(this, 'outgoing');\n\n    /**\n     * The list of incoming connections\n     *\n     * @name Element#incoming\n     * @type Array<Connection>\n     */\n    incomingRefs.bind(this, 'incoming');\n  }\n\n\n  /**\n   * A graphical object\n   *\n   * @class\n   * @constructor\n   *\n   * @extends ElementImpl\n   */\n  function ShapeImpl() {\n    ElementImpl.call(this);\n\n    /**\n     * Indicates frame shapes\n     *\n     * @name ShapeImpl#isFrame\n     * @type boolean\n     */\n\n    /**\n     * The list of children\n     *\n     * @name ShapeImpl#children\n     * @type Element[]\n     */\n    parentRefs.bind(this, 'children');\n\n    /**\n     * @name ShapeImpl#host\n     * @type Shape\n     */\n    attacherRefs.bind(this, 'host');\n\n    /**\n     * @name ShapeImpl#attachers\n     * @type Shape\n     */\n    attacherRefs.bind(this, 'attachers');\n  }\n\n  e$3(ShapeImpl, ElementImpl);\n\n\n  /**\n   * A root graphical object\n   *\n   * @class\n   * @constructor\n   *\n   * @extends ElementImpl\n   */\n  function RootImpl() {\n    ElementImpl.call(this);\n\n    /**\n     * The list of children\n     *\n     * @name RootImpl#children\n     * @type Element[]\n     */\n    parentRefs.bind(this, 'children');\n  }\n\n  e$3(RootImpl, ShapeImpl);\n\n\n  /**\n   * A label for an element\n   *\n   * @class\n   * @constructor\n   *\n   * @extends ShapeImpl\n   */\n  function LabelImpl() {\n    ShapeImpl.call(this);\n\n    /**\n     * The labeled element\n     *\n     * @name LabelImpl#labelTarget\n     * @type Element\n     */\n    labelRefs.bind(this, 'labelTarget');\n  }\n\n  e$3(LabelImpl, ShapeImpl);\n\n\n  /**\n   * A connection between two elements\n   *\n   * @class\n   * @constructor\n   *\n   * @extends ElementImpl\n   */\n  function ConnectionImpl() {\n    ElementImpl.call(this);\n\n    /**\n     * The element this connection originates from\n     *\n     * @name ConnectionImpl#source\n     * @type Element\n     */\n    outgoingRefs.bind(this, 'source');\n\n    /**\n     * The element this connection points to\n     *\n     * @name ConnectionImpl#target\n     * @type Element\n     */\n    incomingRefs.bind(this, 'target');\n  }\n\n  e$3(ConnectionImpl, ElementImpl);\n\n\n  var types$6 = {\n    connection: ConnectionImpl,\n    shape: ShapeImpl,\n    label: LabelImpl,\n    root: RootImpl\n  };\n\n  /**\n   * Creates a root element.\n   *\n   * @overlord\n   *\n   * @example\n   *\n   * ```javascript\n   * import * as Model from 'diagram-js/lib/model';\n   *\n   * const root = Model.create('root', {\n   *   x: 100,\n   *   y: 100,\n   *   width: 100,\n   *   height: 100\n   * });\n   * ```\n   *\n   * @param {'root'} type\n   * @param {any} [attrs]\n   *\n   * @return {Root}\n   */\n\n  /**\n   * Creates a connection.\n   *\n   * @overlord\n   *\n   * @example\n   *\n   * ```javascript\n   * import * as Model from 'diagram-js/lib/model';\n   *\n   * const connection = Model.create('connection', {\n   *   waypoints: [\n   *     { x: 100, y: 100 },\n   *     { x: 200, y: 100 }\n   *   ]\n   * });\n   * ```\n   *\n   * @param {'connection'} type\n   * @param {any} [attrs]\n   *\n   * @return {Connection}\n   */\n\n  /**\n   * Creates a shape.\n   *\n   * @overlord\n   *\n   * @example\n   *\n   * ```javascript\n   * import * as Model from 'diagram-js/lib/model';\n   *\n   * const shape = Model.create('shape', {\n   *   x: 100,\n   *   y: 100,\n   *   width: 100,\n   *   height: 100\n   * });\n   * ```\n   *\n   * @param {'shape'} type\n   * @param {any} [attrs]\n   *\n   * @return {Shape}\n   */\n\n  /**\n   * Creates a label.\n   *\n   * @example\n   *\n   * ```javascript\n   * import * as Model from 'diagram-js/lib/model';\n   *\n   * const label = Model.create('label', {\n   *   x: 100,\n   *   y: 100,\n   *   width: 100,\n   *   height: 100,\n   *   labelTarget: shape\n   * });\n   * ```\n   *\n   * @param {'label'} type\n   * @param {Object} [attrs]\n   *\n   * @return {Label}\n   */\n  function create(type, attrs) {\n    var Type = types$6[type];\n    if (!Type) {\n      throw new Error('unknown type: <' + type + '>');\n    }\n    return assign$1(new Type(), attrs);\n  }\n\n  /**\n   * Checks whether an object is a model instance.\n   *\n   * @param {any} obj\n   *\n   * @return {boolean}\n   */\n  function isModelElement(obj) {\n    return obj instanceof ElementImpl;\n  }\n\n  /**\n   * @typedef {import('../model/Types').Element} Element\n   * @typedef {import('../model/Types').Connection} Connection\n   * @typedef {import('../model/Types').Label} Label\n   * @typedef {import('../model/Types').Root} Root\n   * @typedef {import('../model/Types').Shape} Shape\n   */\n\n  /**\n   * A factory for model elements.\n   *\n   * @template {Connection} [T=Connection]\n   * @template {Label} [U=Label]\n   * @template {Root} [V=Root]\n   * @template {Shape} [W=Shape]\n   */\n  function ElementFactory$1() {\n    this._uid = 12;\n  }\n\n  /**\n   * Create a root element.\n   *\n   * @param {Partial<Root>} [attrs]\n   *\n   * @return {V} The created root element.\n   */\n  ElementFactory$1.prototype.createRoot = function(attrs) {\n    return this.create('root', attrs);\n  };\n\n  /**\n   * Create a label.\n   *\n   * @param {Partial<Label>} [attrs]\n   *\n   * @return {U} The created label.\n   */\n  ElementFactory$1.prototype.createLabel = function(attrs) {\n    return this.create('label', attrs);\n  };\n\n  /**\n   * Create a shape.\n   *\n   * @param {Partial<Shape>} [attrs]\n   *\n   * @return {W} The created shape.\n   */\n  ElementFactory$1.prototype.createShape = function(attrs) {\n    return this.create('shape', attrs);\n  };\n\n  /**\n   * Create a connection.\n   *\n   * @param {Partial<Connection>} [attrs]\n   *\n   * @return {T} The created connection.\n   */\n  ElementFactory$1.prototype.createConnection = function(attrs) {\n    return this.create('connection', attrs);\n  };\n\n  /**\n   * Create a root element.\n   *\n   * @overlord\n   * @param {'root'} type\n   * @param {Partial<Root>} [attrs]\n   * @return {V}\n   */\n  /**\n   * Create a shape.\n   *\n   * @overlord\n   * @param {'shape'} type\n   * @param {Partial<Shape>} [attrs]\n   * @return {W}\n   */\n  /**\n   * Create a connection.\n   *\n   * @overlord\n   * @param {'connection'} type\n   * @param {Partial<Connection>} [attrs]\n   * @return {T}\n   */\n  /**\n   * Create a label.\n   *\n   * @param {'label'} type\n   * @param {Partial<Label>} [attrs]\n   * @return {U}\n   */\n  ElementFactory$1.prototype.create = function(type, attrs) {\n\n    attrs = assign$1({}, attrs || {});\n\n    if (!attrs.id) {\n      attrs.id = type + '_' + (this._uid++);\n    }\n\n    return create(type, attrs);\n  };\n\n  var FN_REF = '__fn';\n\n  var DEFAULT_PRIORITY$5 = 1000;\n\n  var slice = Array.prototype.slice;\n\n  /**\n   * @typedef { {\n   *   stopPropagation(): void;\n   *   preventDefault(): void;\n   *   cancelBubble: boolean;\n   *   defaultPrevented: boolean;\n   *   returnValue: any;\n   * } } Event\n   */\n\n  /**\n   * @template E\n   *\n   * @typedef { (event: E & Event, ...any) => any } EventBusEventCallback\n   */\n\n  /**\n   * @typedef { {\n   *  priority: number;\n   *  next: EventBusListener | null;\n   *  callback: EventBusEventCallback<any>;\n   * } } EventBusListener\n   */\n\n  /**\n   * A general purpose event bus.\n   *\n   * This component is used to communicate across a diagram instance.\n   * Other parts of a diagram can use it to listen to and broadcast events.\n   *\n   *\n   * ## Registering for Events\n   *\n   * The event bus provides the {@link EventBus#on} and {@link EventBus#once}\n   * methods to register for events. {@link EventBus#off} can be used to\n   * remove event registrations. Listeners receive an instance of {@link Event}\n   * as the first argument. It allows them to hook into the event execution.\n   *\n   * ```javascript\n   *\n   * // listen for event\n   * eventBus.on('foo', function(event) {\n   *\n   *   // access event type\n   *   event.type; // 'foo'\n   *\n   *   // stop propagation to other listeners\n   *   event.stopPropagation();\n   *\n   *   // prevent event default\n   *   event.preventDefault();\n   * });\n   *\n   * // listen for event with custom payload\n   * eventBus.on('bar', function(event, payload) {\n   *   console.log(payload);\n   * });\n   *\n   * // listen for event returning value\n   * eventBus.on('foobar', function(event) {\n   *\n   *   // stop event propagation + prevent default\n   *   return false;\n   *\n   *   // stop event propagation + return custom result\n   *   return {\n   *     complex: 'listening result'\n   *   };\n   * });\n   *\n   *\n   * // listen with custom priority (default=1000, higher is better)\n   * eventBus.on('priorityfoo', 1500, function(event) {\n   *   console.log('invoked first!');\n   * });\n   *\n   *\n   * // listen for event and pass the context (`this`)\n   * eventBus.on('foobar', function(event) {\n   *   this.foo();\n   * }, this);\n   * ```\n   *\n   *\n   * ## Emitting Events\n   *\n   * Events can be emitted via the event bus using {@link EventBus#fire}.\n   *\n   * ```javascript\n   *\n   * // false indicates that the default action\n   * // was prevented by listeners\n   * if (eventBus.fire('foo') === false) {\n   *   console.log('default has been prevented!');\n   * };\n   *\n   *\n   * // custom args + return value listener\n   * eventBus.on('sum', function(event, a, b) {\n   *   return a + b;\n   * });\n   *\n   * // you can pass custom arguments + retrieve result values.\n   * var sum = eventBus.fire('sum', 1, 2);\n   * console.log(sum); // 3\n   * ```\n   */\n  function EventBus() {\n\n    /**\n     * @type { Record<string, EventBusListener> }\n     */\n    this._listeners = {};\n\n    // cleanup on destroy on lowest priority to allow\n    // message passing until the bitter end\n    this.on('diagram.destroy', 1, this._destroy, this);\n  }\n\n\n  /**\n   * Register an event listener for events with the given name.\n   *\n   * The callback will be invoked with `event, ...additionalArguments`\n   * that have been passed to {@link EventBus#fire}.\n   *\n   * Returning false from a listener will prevent the events default action\n   * (if any is specified). To stop an event from being processed further in\n   * other listeners execute {@link Event#stopPropagation}.\n   *\n   * Returning anything but `undefined` from a listener will stop the listener propagation.\n   *\n   * @template T\n   *\n   * @param {string|string[]} events to subscribe to\n   * @param {number} [priority=1000] listen priority\n   * @param {EventBusEventCallback<T>} callback\n   * @param {any} [that] callback context\n   */\n  EventBus.prototype.on = function(events, priority, callback, that) {\n\n    events = isArray$3(events) ? events : [ events ];\n\n    if (isFunction(priority)) {\n      that = callback;\n      callback = priority;\n      priority = DEFAULT_PRIORITY$5;\n    }\n\n    if (!isNumber(priority)) {\n      throw new Error('priority must be a number');\n    }\n\n    var actualCallback = callback;\n\n    if (that) {\n      actualCallback = bind$2(callback, that);\n\n      // make sure we remember and are able to remove\n      // bound callbacks via {@link #off} using the original\n      // callback\n      actualCallback[FN_REF] = callback[FN_REF] || callback;\n    }\n\n    var self = this;\n\n    events.forEach(function(e) {\n      self._addListener(e, {\n        priority: priority,\n        callback: actualCallback,\n        next: null\n      });\n    });\n  };\n\n  /**\n   * Register an event listener that is called only once.\n   *\n   * @template T\n   *\n   * @param {string|string[]} events to subscribe to\n   * @param {number} [priority=1000] the listen priority\n   * @param {EventBusEventCallback<T>} callback\n   * @param {any} [that] callback context\n   */\n  EventBus.prototype.once = function(events, priority, callback, that) {\n    var self = this;\n\n    if (isFunction(priority)) {\n      that = callback;\n      callback = priority;\n      priority = DEFAULT_PRIORITY$5;\n    }\n\n    if (!isNumber(priority)) {\n      throw new Error('priority must be a number');\n    }\n\n    function wrappedCallback() {\n      wrappedCallback.__isTomb = true;\n\n      var result = callback.apply(that, arguments);\n\n      self.off(events, wrappedCallback);\n\n      return result;\n    }\n\n    // make sure we remember and are able to remove\n    // bound callbacks via {@link #off} using the original\n    // callback\n    wrappedCallback[FN_REF] = callback;\n\n    this.on(events, priority, wrappedCallback);\n  };\n\n\n  /**\n   * Removes event listeners by event and callback.\n   *\n   * If no callback is given, all listeners for a given event name are being removed.\n   *\n   * @param {string|string[]} events\n   * @param {EventBusEventCallback} [callback]\n   */\n  EventBus.prototype.off = function(events, callback) {\n\n    events = isArray$3(events) ? events : [ events ];\n\n    var self = this;\n\n    events.forEach(function(event) {\n      self._removeListener(event, callback);\n    });\n\n  };\n\n\n  /**\n   * Create an event recognized be the event bus.\n   *\n   * @param {Object} data Event data.\n   *\n   * @return {Event} An event that will be recognized by the event bus.\n   */\n  EventBus.prototype.createEvent = function(data) {\n    var event = new InternalEvent();\n\n    event.init(data);\n\n    return event;\n  };\n\n\n  /**\n   * Fires an event.\n   *\n   * @example\n   *\n   * ```javascript\n   * // fire event by name\n   * events.fire('foo');\n   *\n   * // fire event object with nested type\n   * var event = { type: 'foo' };\n   * events.fire(event);\n   *\n   * // fire event with explicit type\n   * var event = { x: 10, y: 20 };\n   * events.fire('element.moved', event);\n   *\n   * // pass additional arguments to the event\n   * events.on('foo', function(event, bar) {\n   *   alert(bar);\n   * });\n   *\n   * events.fire({ type: 'foo' }, 'I am bar!');\n   * ```\n   *\n   * @param {string} [type] event type\n   * @param {Object} [data] event or event data\n   * @param {...any} [args] additional arguments the callback will be called with.\n   *\n   * @return {any} The return value. Will be set to `false` if the default was prevented.\n   */\n  EventBus.prototype.fire = function(type, data) {\n    var event,\n        firstListener,\n        returnValue,\n        args;\n\n    args = slice.call(arguments);\n\n    if (typeof type === 'object') {\n      data = type;\n      type = data.type;\n    }\n\n    if (!type) {\n      throw new Error('no event type specified');\n    }\n\n    firstListener = this._listeners[type];\n\n    if (!firstListener) {\n      return;\n    }\n\n    // we make sure we fire instances of our home made\n    // events here. We wrap them only once, though\n    if (data instanceof InternalEvent) {\n\n      // we are fine, we alread have an event\n      event = data;\n    } else {\n      event = this.createEvent(data);\n    }\n\n    // ensure we pass the event as the first parameter\n    args[0] = event;\n\n    // original event type (in case we delegate)\n    var originalType = event.type;\n\n    // update event type before delegation\n    if (type !== originalType) {\n      event.type = type;\n    }\n\n    try {\n      returnValue = this._invokeListeners(event, args, firstListener);\n    } finally {\n\n      // reset event type after delegation\n      if (type !== originalType) {\n        event.type = originalType;\n      }\n    }\n\n    // set the return value to false if the event default\n    // got prevented and no other return value exists\n    if (returnValue === undefined && event.defaultPrevented) {\n      returnValue = false;\n    }\n\n    return returnValue;\n  };\n\n  /**\n   * Handle an error by firing an event.\n   *\n   * @param {Error} error The error to be handled.\n   *\n   * @return {boolean} Whether the error was handled.\n   */\n  EventBus.prototype.handleError = function(error) {\n    return this.fire('error', { error: error }) === false;\n  };\n\n\n  EventBus.prototype._destroy = function() {\n    this._listeners = {};\n  };\n\n  /**\n   * @param {Event} event\n   * @param {any[]} args\n   * @param {EventBusListener} listener\n   *\n   * @return {any}\n   */\n  EventBus.prototype._invokeListeners = function(event, args, listener) {\n\n    var returnValue;\n\n    while (listener) {\n\n      // handle stopped propagation\n      if (event.cancelBubble) {\n        break;\n      }\n\n      returnValue = this._invokeListener(event, args, listener);\n\n      listener = listener.next;\n    }\n\n    return returnValue;\n  };\n\n  /**\n   * @param {Event} event\n   * @param {any[]} args\n   * @param {EventBusListener} listener\n   *\n   * @return {any}\n   */\n  EventBus.prototype._invokeListener = function(event, args, listener) {\n\n    var returnValue;\n\n    if (listener.callback.__isTomb) {\n      return returnValue;\n    }\n\n    try {\n\n      // returning false prevents the default action\n      returnValue = invokeFunction(listener.callback, args);\n\n      // stop propagation on return value\n      if (returnValue !== undefined) {\n        event.returnValue = returnValue;\n        event.stopPropagation();\n      }\n\n      // prevent default on return false\n      if (returnValue === false) {\n        event.preventDefault();\n      }\n    } catch (error) {\n      if (!this.handleError(error)) {\n        console.error('unhandled error in event listener', error);\n\n        throw error;\n      }\n    }\n\n    return returnValue;\n  };\n\n  /**\n   * Add new listener with a certain priority to the list\n   * of listeners (for the given event).\n   *\n   * The semantics of listener registration / listener execution are\n   * first register, first serve: New listeners will always be inserted\n   * after existing listeners with the same priority.\n   *\n   * Example: Inserting two listeners with priority 1000 and 1300\n   *\n   *    * before: [ 1500, 1500, 1000, 1000 ]\n   *    * after: [ 1500, 1500, (new=1300), 1000, 1000, (new=1000) ]\n   *\n   * @param {string} event\n   * @param {EventBusListener} newListener\n   */\n  EventBus.prototype._addListener = function(event, newListener) {\n\n    var listener = this._getListeners(event),\n        previousListener;\n\n    // no prior listeners\n    if (!listener) {\n      this._setListeners(event, newListener);\n\n      return;\n    }\n\n    // ensure we order listeners by priority from\n    // 0 (high) to n > 0 (low)\n    while (listener) {\n\n      if (listener.priority < newListener.priority) {\n\n        newListener.next = listener;\n\n        if (previousListener) {\n          previousListener.next = newListener;\n        } else {\n          this._setListeners(event, newListener);\n        }\n\n        return;\n      }\n\n      previousListener = listener;\n      listener = listener.next;\n    }\n\n    // add new listener to back\n    previousListener.next = newListener;\n  };\n\n\n  /**\n   * @param {string} name\n   *\n   * @return {EventBusListener}\n   */\n  EventBus.prototype._getListeners = function(name) {\n    return this._listeners[name];\n  };\n\n  /**\n   * @param {string} name\n   * @param {EventBusListener} listener\n   */\n  EventBus.prototype._setListeners = function(name, listener) {\n    this._listeners[name] = listener;\n  };\n\n  EventBus.prototype._removeListener = function(event, callback) {\n\n    var listener = this._getListeners(event),\n        nextListener,\n        previousListener,\n        listenerCallback;\n\n    if (!callback) {\n\n      // clear listeners\n      this._setListeners(event, null);\n\n      return;\n    }\n\n    while (listener) {\n\n      nextListener = listener.next;\n\n      listenerCallback = listener.callback;\n\n      if (listenerCallback === callback || listenerCallback[FN_REF] === callback) {\n        if (previousListener) {\n          previousListener.next = nextListener;\n        } else {\n\n          // new first listener\n          this._setListeners(event, nextListener);\n        }\n      }\n\n      previousListener = listener;\n      listener = nextListener;\n    }\n  };\n\n  /**\n   * A event that is emitted via the event bus.\n   */\n  function InternalEvent() { }\n\n  InternalEvent.prototype.stopPropagation = function() {\n    this.cancelBubble = true;\n  };\n\n  InternalEvent.prototype.preventDefault = function() {\n    this.defaultPrevented = true;\n  };\n\n  InternalEvent.prototype.init = function(data) {\n    assign$1(this, data || {});\n  };\n\n\n  /**\n   * Invoke function. Be fast...\n   *\n   * @param {Function} fn\n   * @param {any[]} args\n   *\n   * @return {any}\n   */\n  function invokeFunction(fn, args) {\n    return fn.apply(null, args);\n  }\n\n  /**\n   * SVGs for elements are generated by the {@link GraphicsFactory}.\n   *\n   * This utility gives quick access to the important semantic\n   * parts of an element.\n   */\n\n  /**\n   * Returns the visual part of a diagram element.\n   *\n   * @param {SVGElement} gfx\n   *\n   * @return {SVGElement}\n   */\n  function getVisual(gfx) {\n    return gfx.childNodes[0];\n  }\n\n  /**\n   * Returns the children for a given diagram element.\n   *\n   * @param {SVGElement} gfx\n   * @return {SVGElement}\n   */\n  function getChildren$1(gfx) {\n    return gfx.parentNode.childNodes[1];\n  }\n\n  /**\r\n   * @param {SVGElement} gfx\r\n   * @param {number} x\r\n   * @param {number} y\r\n   * @param {number} [angle]\r\n   * @param {number} [amount]\r\n   */\r\n  function transform(gfx, x, y, angle, amount) {\r\n    var translate = createTransform();\r\n    translate.setTranslate(x, y);\r\n\r\n    var rotate = createTransform();\r\n    rotate.setRotate(angle || 0, 0, 0);\r\n\r\n    var scale = createTransform();\r\n    scale.setScale(amount || 1, amount || 1);\r\n\r\n    transform$1(gfx, [ translate, rotate, scale ]);\r\n  }\r\n\r\n\r\n  /**\r\n   * @param {SVGElement} gfx\r\n   * @param {number} x\r\n   * @param {number} y\r\n   */\r\n  function translate$2(gfx, x, y) {\r\n    var translate = createTransform();\r\n    translate.setTranslate(x, y);\r\n\r\n    transform$1(gfx, translate);\r\n  }\r\n\r\n\r\n  /**\r\n   * @param {SVGElement} gfx\r\n   * @param {number} angle\r\n   */\r\n  function rotate(gfx, angle) {\r\n    var rotate = createTransform();\r\n    rotate.setRotate(angle, 0, 0);\r\n\r\n    transform$1(gfx, rotate);\r\n  }\n\n  /**\n   * @typedef {import('./Types').ConnectionLike} ConnectionLike\n   * @typedef {import('./Types').ElementLike} ElementLike\n   * @typedef {import('./Types').ShapeLike} ShapeLike\n   *\n   * @typedef {import('./ElementRegistry').default} ElementRegistry\n   * @typedef {import('./EventBus').default} EventBus\n   */\n\n  /**\n   * A factory that creates graphical elements.\n   *\n   * @param {EventBus} eventBus\n   * @param {ElementRegistry} elementRegistry\n   */\n  function GraphicsFactory(eventBus, elementRegistry) {\n    this._eventBus = eventBus;\n    this._elementRegistry = elementRegistry;\n  }\n\n  GraphicsFactory.$inject = [ 'eventBus' , 'elementRegistry' ];\n\n  /**\n   * @param { { parent?: any } } element\n   * @return {SVGElement}\n   */\n  GraphicsFactory.prototype._getChildrenContainer = function(element) {\n\n    var gfx = this._elementRegistry.getGraphics(element);\n\n    var childrenGfx;\n\n    // root element\n    if (!element.parent) {\n      childrenGfx = gfx;\n    } else {\n      childrenGfx = getChildren$1(gfx);\n      if (!childrenGfx) {\n        childrenGfx = create$1('g');\n        classes(childrenGfx).add('djs-children');\n\n        append(gfx.parentNode, childrenGfx);\n      }\n    }\n\n    return childrenGfx;\n  };\n\n  /**\n   * Clears the graphical representation of the element and returns the\n   * cleared visual (the <g class=\"djs-visual\" /> element).\n   */\n  GraphicsFactory.prototype._clear = function(gfx) {\n    var visual = getVisual(gfx);\n\n    clear$1(visual);\n\n    return visual;\n  };\n\n  /**\n   * Creates a gfx container for shapes and connections\n   *\n   * The layout is as follows:\n   *\n   * <g class=\"djs-group\">\n   *\n   *   <!-- the gfx -->\n   *   <g class=\"djs-element djs-(shape|connection|frame)\">\n   *     <g class=\"djs-visual\">\n   *       <!-- the renderer draws in here -->\n   *     </g>\n   *\n   *     <!-- extensions (overlays, click box, ...) goes here\n   *   </g>\n   *\n   *   <!-- the gfx child nodes -->\n   *   <g class=\"djs-children\"></g>\n   * </g>\n   *\n   * @param {string} type the type of the element, i.e. shape | connection\n   * @param {SVGElement} childrenGfx\n   * @param {number} [parentIndex] position to create container in parent\n   * @param {boolean} [isFrame] is frame element\n   *\n   * @return {SVGElement}\n   */\n  GraphicsFactory.prototype._createContainer = function(\n      type, childrenGfx, parentIndex, isFrame\n  ) {\n    var outerGfx = create$1('g');\n    classes(outerGfx).add('djs-group');\n\n    // insert node at position\n    if (typeof parentIndex !== 'undefined') {\n      prependTo(outerGfx, childrenGfx, childrenGfx.childNodes[parentIndex]);\n    } else {\n      append(childrenGfx, outerGfx);\n    }\n\n    var gfx = create$1('g');\n    classes(gfx).add('djs-element');\n    classes(gfx).add('djs-' + type);\n\n    if (isFrame) {\n      classes(gfx).add('djs-frame');\n    }\n\n    append(outerGfx, gfx);\n\n    // create visual\n    var visual = create$1('g');\n    classes(visual).add('djs-visual');\n\n    append(gfx, visual);\n\n    return gfx;\n  };\n\n  /**\n   * Create a graphical element.\n   *\n   * @param { 'shape' | 'connection' | 'label' | 'root' } type The type of the element.\n   * @param {ElementLike} element The element.\n   * @param {number} [parentIndex] The index at which to add the graphical element to its parent's children.\n   *\n   * @return {SVGElement} The graphical element.\n   */\n  GraphicsFactory.prototype.create = function(type, element, parentIndex) {\n    var childrenGfx = this._getChildrenContainer(element.parent);\n    return this._createContainer(type, childrenGfx, parentIndex, isFrameElement$1(element));\n  };\n\n  /**\n   * Update the containments of the given elements.\n   *\n   * @param {ElementLike[]} elements The elements.\n   */\n  GraphicsFactory.prototype.updateContainments = function(elements) {\n\n    var self = this,\n        elementRegistry = this._elementRegistry,\n        parents;\n\n    parents = reduce(elements, function(map, e) {\n\n      if (e.parent) {\n        map[e.parent.id] = e.parent;\n      }\n\n      return map;\n    }, {});\n\n    // update all parents of changed and reorganized their children\n    // in the correct order (as indicated in our model)\n    forEach$1(parents, function(parent) {\n\n      var children = parent.children;\n\n      if (!children) {\n        return;\n      }\n\n      var childrenGfx = self._getChildrenContainer(parent);\n\n      forEach$1(children.slice().reverse(), function(child) {\n        var childGfx = elementRegistry.getGraphics(child);\n\n        prependTo(childGfx.parentNode, childrenGfx);\n      });\n    });\n  };\n\n  /**\n   * Draw a shape.\n   *\n   * @param {SVGElement} visual The graphical element.\n   * @param {ShapeLike} element The shape.\n   *\n   * @return {SVGElement}\n   */\n  GraphicsFactory.prototype.drawShape = function(visual, element) {\n    var eventBus = this._eventBus;\n\n    return eventBus.fire('render.shape', { gfx: visual, element: element });\n  };\n\n  /**\n   * Get the path of a shape.\n   *\n   * @param {ShapeLike} element The shape.\n   *\n   * @return {string} The path of the shape.\n   */\n  GraphicsFactory.prototype.getShapePath = function(element) {\n    var eventBus = this._eventBus;\n\n    return eventBus.fire('render.getShapePath', element);\n  };\n\n  /**\n   * Draw a connection.\n   *\n   * @param {SVGElement} visual The graphical element.\n   * @param {ConnectionLike} element The connection.\n   *\n   * @return {SVGElement}\n   */\n  GraphicsFactory.prototype.drawConnection = function(visual, element) {\n    var eventBus = this._eventBus;\n\n    return eventBus.fire('render.connection', { gfx: visual, element: element });\n  };\n\n  /**\n   * Get the path of a connection.\n   *\n   * @param {ConnectionLike} connection The connection.\n   *\n   * @return {string} The path of the connection.\n   */\n  GraphicsFactory.prototype.getConnectionPath = function(connection) {\n    var eventBus = this._eventBus;\n\n    return eventBus.fire('render.getConnectionPath', connection);\n  };\n\n  /**\n   * Update an elements graphical representation.\n   *\n   * @param {'shape'|'connection'} type\n   * @param {ElementLike} element\n   * @param {SVGElement} gfx\n   */\n  GraphicsFactory.prototype.update = function(type, element, gfx) {\n\n    // do NOT update root element\n    if (!element.parent) {\n      return;\n    }\n\n    var visual = this._clear(gfx);\n\n    // redraw\n    if (type === 'shape') {\n      this.drawShape(visual, element);\n\n      // update positioning\n      translate$2(gfx, element.x, element.y);\n    } else\n    if (type === 'connection') {\n      this.drawConnection(visual, element);\n    } else {\n      throw new Error('unknown type: ' + type);\n    }\n\n    if (element.hidden) {\n      attr(gfx, 'display', 'none');\n    } else {\n      attr(gfx, 'display', 'block');\n    }\n  };\n\n  /**\n   * Remove a graphical element.\n   *\n   * @param {ElementLike} element The element.\n   */\n  GraphicsFactory.prototype.remove = function(element) {\n    var gfx = this._elementRegistry.getGraphics(element);\n\n    // remove\n    remove$1(gfx.parentNode);\n  };\n\n\n  // helpers //////////\n\n  function prependTo(newNode, parentNode, siblingNode) {\n    var node = siblingNode || parentNode.firstChild;\n\n    // do not prepend node to itself to prevent IE from crashing\n    // https://github.com/bpmn-io/bpmn-js/issues/746\n    if (newNode === node) {\n      return;\n    }\n\n    parentNode.insertBefore(newNode, node);\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var CoreModule$1 = {\n    __depends__: [ DrawModule$1 ],\n    __init__: [ 'canvas' ],\n    canvas: [ 'type', Canvas ],\n    elementRegistry: [ 'type', ElementRegistry ],\n    elementFactory: [ 'type', ElementFactory$1 ],\n    eventBus: [ 'type', EventBus ],\n    graphicsFactory: [ 'type', GraphicsFactory ]\n  };\n\n  /**\n   * @typedef {import('didi').InjectionContext} InjectionContext\n   * @typedef {import('didi').LocalsMap} LocalsMap\n   * @typedef {import('didi').ModuleDeclaration} ModuleDeclaration\n   *\n   * @typedef { {\n   *   modules?: ModuleDeclaration[];\n   * } & Record<string, any> } DiagramOptions\n   */\n\n  /**\n   * Bootstrap an injector from a list of modules, instantiating a number of default components\n   *\n   * @param {ModuleDeclaration[]} modules\n   *\n   * @return {Injector} a injector to use to access the components\n   */\n  function bootstrap(modules) {\n    var injector = new Injector(modules);\n\n    injector.init();\n\n    return injector;\n  }\n\n  /**\n   * Creates an injector from passed options.\n   *\n   * @param {DiagramOptions} [options]\n   *\n   * @return {Injector}\n   */\n  function createInjector(options) {\n\n    options = options || {};\n\n    /**\n     * @type { ModuleDeclaration }\n     */\n    var configModule = {\n      'config': [ 'value', options ]\n    };\n\n    var modules = [ configModule, CoreModule$1 ].concat(options.modules || []);\n\n    return bootstrap(modules);\n  }\n\n\n  /**\n   * The main diagram-js entry point that bootstraps the diagram with the given\n   * configuration.\n   *\n   * To register extensions with the diagram, pass them as Array<Module> to the constructor.\n   *\n   * @class\n   * @constructor\n   *\n   * @example Creating a plug-in that logs whenever a shape is added to the canvas.\n   *\n   * ```javascript\n   * // plug-in implementation\n   * function MyLoggingPlugin(eventBus) {\n   *   eventBus.on('shape.added', function(event) {\n   *     console.log('shape ', event.shape, ' was added to the diagram');\n   *   });\n   * }\n   *\n   * // export as module\n   * export default {\n   *   __init__: [ 'myLoggingPlugin' ],\n   *     myLoggingPlugin: [ 'type', MyLoggingPlugin ]\n   * };\n   * ```\n   *\n   * Use the plug-in in a Diagram instance:\n   *\n   * ```javascript\n   * import MyLoggingModule from 'path-to-my-logging-plugin';\n   *\n   * var diagram = new Diagram({\n   *   modules: [\n   *     MyLoggingModule\n   *   ]\n   * });\n   *\n   * diagram.invoke([ 'canvas', function(canvas) {\n   *   // add shape to drawing canvas\n   *   canvas.addShape({ x: 10, y: 10 });\n   * });\n   *\n   * // 'shape ... was added to the diagram' logged to console\n   * ```\n   *\n   * @param {DiagramOptions} [options]\n   * @param {Injector} [injector] An (optional) injector to bootstrap the diagram with.\n   */\n  function Diagram(options, injector) {\n\n    this._injector = injector = injector || createInjector(options);\n\n    // API\n\n    /**\n     * Resolves a diagram service.\n     *\n     * @template T\n     *\n     * @param {string} name The name of the service to get.\n     * @param {boolean} [strict=true] If false, resolve missing services to null.\n     *\n     * @return {T|null}\n     */\n    this.get = injector.get;\n\n    /**\n     * Executes a function with its dependencies injected.\n     *\n     * @template T\n     *\n     * @param {Function} func function to be invoked\n     * @param {InjectionContext} [context] context of the invocation\n     * @param {LocalsMap} [locals] locals provided\n     *\n     * @return {T|null}\n     */\n    this.invoke = injector.invoke;\n\n    // init\n\n    // indicate via event\n\n\n    /**\n     * An event indicating that all plug-ins are loaded.\n     *\n     * Use this event to fire other events to interested plug-ins\n     *\n     * @memberOf Diagram\n     *\n     * @event diagram.init\n     *\n     * @example\n     *\n     * ```javascript\n     * eventBus.on('diagram.init', function() {\n     *   eventBus.fire('my-custom-event', { foo: 'BAR' });\n     * });\n     * ```\n     *\n     * @type {Object}\n     */\n    this.get('eventBus').fire('diagram.init');\n  }\n\n\n  /**\n   * Destroys the diagram\n   */\n  Diagram.prototype.destroy = function() {\n    this.get('eventBus').fire('diagram.destroy');\n  };\n\n  /**\n   * Clear the diagram, removing all contents.\n   */\n  Diagram.prototype.clear = function() {\n    this.get('eventBus').fire('diagram.clear');\n  };\n\n  /**\n   * Moddle base element.\n   */\n  function Base() { }\n\n  Base.prototype.get = function(name) {\n    return this.$model.properties.get(this, name);\n  };\n\n  Base.prototype.set = function(name, value) {\n    this.$model.properties.set(this, name, value);\n  };\n\n  /**\n   * A model element factory.\n   *\n   * @param {Moddle} model\n   * @param {Properties} properties\n   */\n  function Factory(model, properties) {\n    this.model = model;\n    this.properties = properties;\n  }\n\n\n  Factory.prototype.createType = function(descriptor) {\n\n    var model = this.model;\n\n    var props = this.properties,\n        prototype = Object.create(Base.prototype);\n\n    // initialize default values\n    forEach$1(descriptor.properties, function(p) {\n      if (!p.isMany && p.default !== undefined) {\n        prototype[p.name] = p.default;\n      }\n    });\n\n    props.defineModel(prototype, model);\n    props.defineDescriptor(prototype, descriptor);\n\n    var name = descriptor.ns.name;\n\n    /**\n     * The new type constructor\n     */\n    function ModdleElement(attrs) {\n      props.define(this, '$type', { value: name, enumerable: true });\n      props.define(this, '$attrs', { value: {} });\n      props.define(this, '$parent', { writable: true });\n\n      forEach$1(attrs, bind$2(function(val, key) {\n        this.set(key, val);\n      }, this));\n    }\n\n    ModdleElement.prototype = prototype;\n\n    ModdleElement.hasType = prototype.$instanceOf = this.model.hasType;\n\n    // static links\n    props.defineModel(ModdleElement, model);\n    props.defineDescriptor(ModdleElement, descriptor);\n\n    return ModdleElement;\n  };\n\n  /**\n   * Built-in moddle types\n   */\n  var BUILTINS = {\n    String: true,\n    Boolean: true,\n    Integer: true,\n    Real: true,\n    Element: true\n  };\n\n  /**\n   * Converters for built in types from string representations\n   */\n  var TYPE_CONVERTERS = {\n    String: function(s) { return s; },\n    Boolean: function(s) { return s === 'true'; },\n    Integer: function(s) { return parseInt(s, 10); },\n    Real: function(s) { return parseFloat(s); }\n  };\n\n  /**\n   * Convert a type to its real representation\n   */\n  function coerceType(type, value) {\n\n    var converter = TYPE_CONVERTERS[type];\n\n    if (converter) {\n      return converter(value);\n    } else {\n      return value;\n    }\n  }\n\n  /**\n   * Return whether the given type is built-in\n   */\n  function isBuiltIn(type) {\n    return !!BUILTINS[type];\n  }\n\n  /**\n   * Return whether the given type is simple\n   */\n  function isSimple(type) {\n    return !!TYPE_CONVERTERS[type];\n  }\n\n  /**\n   * Parses a namespaced attribute name of the form (ns:)localName to an object,\n   * given a default prefix to assume in case no explicit namespace is given.\n   *\n   * @param {String} name\n   * @param {String} [defaultPrefix] the default prefix to take, if none is present.\n   *\n   * @return {Object} the parsed name\n   */\n  function parseName(name, defaultPrefix) {\n    var parts = name.split(/:/),\n        localName, prefix;\n\n    // no prefix (i.e. only local name)\n    if (parts.length === 1) {\n      localName = name;\n      prefix = defaultPrefix;\n    } else\n\n    // prefix + local name\n    if (parts.length === 2) {\n      localName = parts[1];\n      prefix = parts[0];\n    } else {\n      throw new Error('expected <prefix:localName> or <localName>, got ' + name);\n    }\n\n    name = (prefix ? prefix + ':' : '') + localName;\n\n    return {\n      name: name,\n      prefix: prefix,\n      localName: localName\n    };\n  }\n\n  /**\n   * A utility to build element descriptors.\n   */\n  function DescriptorBuilder(nameNs) {\n    this.ns = nameNs;\n    this.name = nameNs.name;\n    this.allTypes = [];\n    this.allTypesByName = {};\n    this.properties = [];\n    this.propertiesByName = {};\n  }\n\n\n  DescriptorBuilder.prototype.build = function() {\n    return pick(this, [\n      'ns',\n      'name',\n      'allTypes',\n      'allTypesByName',\n      'properties',\n      'propertiesByName',\n      'bodyProperty',\n      'idProperty'\n    ]);\n  };\n\n  /**\n   * Add property at given index.\n   *\n   * @param {Object} p\n   * @param {Number} [idx]\n   * @param {Boolean} [validate=true]\n   */\n  DescriptorBuilder.prototype.addProperty = function(p, idx, validate) {\n\n    if (typeof idx === 'boolean') {\n      validate = idx;\n      idx = undefined;\n    }\n\n    this.addNamedProperty(p, validate !== false);\n\n    var properties = this.properties;\n\n    if (idx !== undefined) {\n      properties.splice(idx, 0, p);\n    } else {\n      properties.push(p);\n    }\n  };\n\n\n  DescriptorBuilder.prototype.replaceProperty = function(oldProperty, newProperty, replace) {\n    var oldNameNs = oldProperty.ns;\n\n    var props = this.properties,\n        propertiesByName = this.propertiesByName,\n        rename = oldProperty.name !== newProperty.name;\n\n    if (oldProperty.isId) {\n      if (!newProperty.isId) {\n        throw new Error(\n          'property <' + newProperty.ns.name + '> must be id property ' +\n          'to refine <' + oldProperty.ns.name + '>');\n      }\n\n      this.setIdProperty(newProperty, false);\n    }\n\n    if (oldProperty.isBody) {\n\n      if (!newProperty.isBody) {\n        throw new Error(\n          'property <' + newProperty.ns.name + '> must be body property ' +\n          'to refine <' + oldProperty.ns.name + '>');\n      }\n\n      // TODO: Check compatibility\n      this.setBodyProperty(newProperty, false);\n    }\n\n    // validate existence and get location of old property\n    var idx = props.indexOf(oldProperty);\n    if (idx === -1) {\n      throw new Error('property <' + oldNameNs.name + '> not found in property list');\n    }\n\n    // remove old property\n    props.splice(idx, 1);\n\n    // replacing the named property is intentional\n    //\n    //  * validate only if this is a \"rename\" operation\n    //  * add at specific index unless we \"replace\"\n    //\n    this.addProperty(newProperty, replace ? undefined : idx, rename);\n\n    // make new property available under old name\n    propertiesByName[oldNameNs.name] = propertiesByName[oldNameNs.localName] = newProperty;\n  };\n\n\n  DescriptorBuilder.prototype.redefineProperty = function(p, targetPropertyName, replace) {\n\n    var nsPrefix = p.ns.prefix;\n    var parts = targetPropertyName.split('#');\n\n    var name = parseName(parts[0], nsPrefix);\n    var attrName = parseName(parts[1], name.prefix).name;\n\n    var redefinedProperty = this.propertiesByName[attrName];\n    if (!redefinedProperty) {\n      throw new Error('refined property <' + attrName + '> not found');\n    } else {\n      this.replaceProperty(redefinedProperty, p, replace);\n    }\n\n    delete p.redefines;\n  };\n\n  DescriptorBuilder.prototype.addNamedProperty = function(p, validate) {\n    var ns = p.ns,\n        propsByName = this.propertiesByName;\n\n    if (validate) {\n      this.assertNotDefined(p, ns.name);\n      this.assertNotDefined(p, ns.localName);\n    }\n\n    propsByName[ns.name] = propsByName[ns.localName] = p;\n  };\n\n  DescriptorBuilder.prototype.removeNamedProperty = function(p) {\n    var ns = p.ns,\n        propsByName = this.propertiesByName;\n\n    delete propsByName[ns.name];\n    delete propsByName[ns.localName];\n  };\n\n  DescriptorBuilder.prototype.setBodyProperty = function(p, validate) {\n\n    if (validate && this.bodyProperty) {\n      throw new Error(\n        'body property defined multiple times ' +\n        '(<' + this.bodyProperty.ns.name + '>, <' + p.ns.name + '>)');\n    }\n\n    this.bodyProperty = p;\n  };\n\n  DescriptorBuilder.prototype.setIdProperty = function(p, validate) {\n\n    if (validate && this.idProperty) {\n      throw new Error(\n        'id property defined multiple times ' +\n        '(<' + this.idProperty.ns.name + '>, <' + p.ns.name + '>)');\n    }\n\n    this.idProperty = p;\n  };\n\n  DescriptorBuilder.prototype.assertNotDefined = function(p, name) {\n    var propertyName = p.name,\n        definedProperty = this.propertiesByName[propertyName];\n\n    if (definedProperty) {\n      throw new Error(\n        'property <' + propertyName + '> already defined; ' +\n        'override of <' + definedProperty.definedBy.ns.name + '#' + definedProperty.ns.name + '> by ' +\n        '<' + p.definedBy.ns.name + '#' + p.ns.name + '> not allowed without redefines');\n    }\n  };\n\n  DescriptorBuilder.prototype.hasProperty = function(name) {\n    return this.propertiesByName[name];\n  };\n\n  DescriptorBuilder.prototype.addTrait = function(t, inherited) {\n\n    var typesByName = this.allTypesByName,\n        types = this.allTypes;\n\n    var typeName = t.name;\n\n    if (typeName in typesByName) {\n      return;\n    }\n\n    forEach$1(t.properties, bind$2(function(p) {\n\n      // clone property to allow extensions\n      p = assign$1({}, p, {\n        name: p.ns.localName,\n        inherited: inherited\n      });\n\n      Object.defineProperty(p, 'definedBy', {\n        value: t\n      });\n\n      var replaces = p.replaces,\n          redefines = p.redefines;\n\n      // add replace/redefine support\n      if (replaces || redefines) {\n        this.redefineProperty(p, replaces || redefines, replaces);\n      } else {\n        if (p.isBody) {\n          this.setBodyProperty(p);\n        }\n        if (p.isId) {\n          this.setIdProperty(p);\n        }\n        this.addProperty(p);\n      }\n    }, this));\n\n    types.push(t);\n    typesByName[typeName] = t;\n  };\n\n  /**\n   * A registry of Moddle packages.\n   *\n   * @param {Array<Package>} packages\n   * @param {Properties} properties\n   */\n  function Registry(packages, properties) {\n    this.packageMap = {};\n    this.typeMap = {};\n\n    this.packages = [];\n\n    this.properties = properties;\n\n    forEach$1(packages, bind$2(this.registerPackage, this));\n  }\n\n\n  Registry.prototype.getPackage = function(uriOrPrefix) {\n    return this.packageMap[uriOrPrefix];\n  };\n\n  Registry.prototype.getPackages = function() {\n    return this.packages;\n  };\n\n\n  Registry.prototype.registerPackage = function(pkg) {\n\n    // copy package\n    pkg = assign$1({}, pkg);\n\n    var pkgMap = this.packageMap;\n\n    ensureAvailable(pkgMap, pkg, 'prefix');\n    ensureAvailable(pkgMap, pkg, 'uri');\n\n    // register types\n    forEach$1(pkg.types, bind$2(function(descriptor) {\n      this.registerType(descriptor, pkg);\n    }, this));\n\n    pkgMap[pkg.uri] = pkgMap[pkg.prefix] = pkg;\n    this.packages.push(pkg);\n  };\n\n\n  /**\n   * Register a type from a specific package with us\n   */\n  Registry.prototype.registerType = function(type, pkg) {\n\n    type = assign$1({}, type, {\n      superClass: (type.superClass || []).slice(),\n      extends: (type.extends || []).slice(),\n      properties: (type.properties || []).slice(),\n      meta: assign$1((type.meta || {}))\n    });\n\n    var ns = parseName(type.name, pkg.prefix),\n        name = ns.name,\n        propertiesByName = {};\n\n    // parse properties\n    forEach$1(type.properties, bind$2(function(p) {\n\n      // namespace property names\n      var propertyNs = parseName(p.name, ns.prefix),\n          propertyName = propertyNs.name;\n\n      // namespace property types\n      if (!isBuiltIn(p.type)) {\n        p.type = parseName(p.type, propertyNs.prefix).name;\n      }\n\n      assign$1(p, {\n        ns: propertyNs,\n        name: propertyName\n      });\n\n      propertiesByName[propertyName] = p;\n    }, this));\n\n    // update ns + name\n    assign$1(type, {\n      ns: ns,\n      name: name,\n      propertiesByName: propertiesByName\n    });\n\n    forEach$1(type.extends, bind$2(function(extendsName) {\n      var extended = this.typeMap[extendsName];\n\n      extended.traits = extended.traits || [];\n      extended.traits.push(name);\n    }, this));\n\n    // link to package\n    this.definePackage(type, pkg);\n\n    // register\n    this.typeMap[name] = type;\n  };\n\n\n  /**\n   * Traverse the type hierarchy from bottom to top,\n   * calling iterator with (type, inherited) for all elements in\n   * the inheritance chain.\n   *\n   * @param {Object} nsName\n   * @param {Function} iterator\n   * @param {Boolean} [trait=false]\n   */\n  Registry.prototype.mapTypes = function(nsName, iterator, trait) {\n\n    var type = isBuiltIn(nsName.name) ? { name: nsName.name } : this.typeMap[nsName.name];\n\n    var self = this;\n\n    /**\n     * Traverse the selected trait.\n     *\n     * @param {String} cls\n     */\n    function traverseTrait(cls) {\n      return traverseSuper(cls, true);\n    }\n\n    /**\n     * Traverse the selected super type or trait\n     *\n     * @param {String} cls\n     * @param {Boolean} [trait=false]\n     */\n    function traverseSuper(cls, trait) {\n      var parentNs = parseName(cls, isBuiltIn(cls) ? '' : nsName.prefix);\n      self.mapTypes(parentNs, iterator, trait);\n    }\n\n    if (!type) {\n      throw new Error('unknown type <' + nsName.name + '>');\n    }\n\n    forEach$1(type.superClass, trait ? traverseTrait : traverseSuper);\n\n    // call iterator with (type, inherited=!trait)\n    iterator(type, !trait);\n\n    forEach$1(type.traits, traverseTrait);\n  };\n\n\n  /**\n   * Returns the effective descriptor for a type.\n   *\n   * @param  {String} type the namespaced name (ns:localName) of the type\n   *\n   * @return {Descriptor} the resulting effective descriptor\n   */\n  Registry.prototype.getEffectiveDescriptor = function(name) {\n\n    var nsName = parseName(name);\n\n    var builder = new DescriptorBuilder(nsName);\n\n    this.mapTypes(nsName, function(type, inherited) {\n      builder.addTrait(type, inherited);\n    });\n\n    var descriptor = builder.build();\n\n    // define package link\n    this.definePackage(descriptor, descriptor.allTypes[descriptor.allTypes.length - 1].$pkg);\n\n    return descriptor;\n  };\n\n\n  Registry.prototype.definePackage = function(target, pkg) {\n    this.properties.define(target, '$pkg', { value: pkg });\n  };\n\n\n\n  // helpers ////////////////////////////\n\n  function ensureAvailable(packageMap, pkg, identifierKey) {\n\n    var value = pkg[identifierKey];\n\n    if (value in packageMap) {\n      throw new Error('package with ' + identifierKey + ' <' + value + '> already defined');\n    }\n  }\n\n  /**\n   * A utility that gets and sets properties of model elements.\n   *\n   * @param {Model} model\n   */\n  function Properties(model) {\n    this.model = model;\n  }\n\n\n  /**\n   * Sets a named property on the target element.\n   * If the value is undefined, the property gets deleted.\n   *\n   * @param {Object} target\n   * @param {String} name\n   * @param {Object} value\n   */\n  Properties.prototype.set = function(target, name, value) {\n\n    if (!isString(name) || !name.length) {\n      throw new TypeError('property name must be a non-empty string');\n    }\n\n    var property = this.model.getPropertyDescriptor(target, name);\n\n    var propertyName = property && property.name;\n\n    if (isUndefined(value)) {\n\n      // unset the property, if the specified value is undefined;\n      // delete from $attrs (for extensions) or the target itself\n      if (property) {\n        delete target[propertyName];\n      } else {\n        delete target.$attrs[name];\n      }\n    } else {\n\n      // set the property, defining well defined properties on the fly\n      // or simply updating them in target.$attrs (for extensions)\n      if (property) {\n        if (propertyName in target) {\n          target[propertyName] = value;\n        } else {\n          defineProperty(target, property, value);\n        }\n      } else {\n        target.$attrs[name] = value;\n      }\n    }\n  };\n\n  /**\n   * Returns the named property of the given element\n   *\n   * @param  {Object} target\n   * @param  {String} name\n   *\n   * @return {Object}\n   */\n  Properties.prototype.get = function(target, name) {\n\n    var property = this.model.getPropertyDescriptor(target, name);\n\n    if (!property) {\n      return target.$attrs[name];\n    }\n\n    var propertyName = property.name;\n\n    // check if access to collection property and lazily initialize it\n    if (!target[propertyName] && property.isMany) {\n      defineProperty(target, property, []);\n    }\n\n    return target[propertyName];\n  };\n\n\n  /**\n   * Define a property on the target element\n   *\n   * @param  {Object} target\n   * @param  {String} name\n   * @param  {Object} options\n   */\n  Properties.prototype.define = function(target, name, options) {\n\n    if (!options.writable) {\n\n      var value = options.value;\n\n      // use getters for read-only variables to support ES6 proxies\n      // cf. https://github.com/bpmn-io/internal-docs/issues/386\n      options = assign$1({}, options, {\n        get: function() { return value; }\n      });\n\n      delete options.value;\n    }\n\n    Object.defineProperty(target, name, options);\n  };\n\n\n  /**\n   * Define the descriptor for an element\n   */\n  Properties.prototype.defineDescriptor = function(target, descriptor) {\n    this.define(target, '$descriptor', { value: descriptor });\n  };\n\n  /**\n   * Define the model for an element\n   */\n  Properties.prototype.defineModel = function(target, model) {\n    this.define(target, '$model', { value: model });\n  };\n\n\n  function isUndefined(val) {\n    return typeof val === 'undefined';\n  }\n\n  function defineProperty(target, property, value) {\n    Object.defineProperty(target, property.name, {\n      enumerable: !property.isReference,\n      writable: true,\n      value: value,\n      configurable: true\n    });\n  }\n\n  // Moddle implementation /////////////////////////////////////////////////\n\n  /**\n   * @class Moddle\n   *\n   * A model that can be used to create elements of a specific type.\n   *\n   * @example\n   *\n   * var Moddle = require('moddle');\n   *\n   * var pkg = {\n   *   name: 'mypackage',\n   *   prefix: 'my',\n   *   types: [\n   *     { name: 'Root' }\n   *   ]\n   * };\n   *\n   * var moddle = new Moddle([pkg]);\n   *\n   * @param {Array<Package>} packages the packages to contain\n   */\n  function Moddle(packages) {\n\n    this.properties = new Properties(this);\n\n    this.factory = new Factory(this, this.properties);\n    this.registry = new Registry(packages, this.properties);\n\n    this.typeCache = {};\n  }\n\n\n  /**\n   * Create an instance of the specified type.\n   *\n   * @method Moddle#create\n   *\n   * @example\n   *\n   * var foo = moddle.create('my:Foo');\n   * var bar = moddle.create('my:Bar', { id: 'BAR_1' });\n   *\n   * @param  {String|Object} descriptor the type descriptor or name know to the model\n   * @param  {Object} attrs   a number of attributes to initialize the model instance with\n   * @return {Object}         model instance\n   */\n  Moddle.prototype.create = function(descriptor, attrs) {\n    var Type = this.getType(descriptor);\n\n    if (!Type) {\n      throw new Error('unknown type <' + descriptor + '>');\n    }\n\n    return new Type(attrs);\n  };\n\n\n  /**\n   * Returns the type representing a given descriptor\n   *\n   * @method Moddle#getType\n   *\n   * @example\n   *\n   * var Foo = moddle.getType('my:Foo');\n   * var foo = new Foo({ 'id' : 'FOO_1' });\n   *\n   * @param  {String|Object} descriptor the type descriptor or name know to the model\n   * @return {Object}         the type representing the descriptor\n   */\n  Moddle.prototype.getType = function(descriptor) {\n\n    var cache = this.typeCache;\n\n    var name = isString(descriptor) ? descriptor : descriptor.ns.name;\n\n    var type = cache[name];\n\n    if (!type) {\n      descriptor = this.registry.getEffectiveDescriptor(name);\n      type = cache[name] = this.factory.createType(descriptor);\n    }\n\n    return type;\n  };\n\n\n  /**\n   * Creates an any-element type to be used within model instances.\n   *\n   * This can be used to create custom elements that lie outside the meta-model.\n   * The created element contains all the meta-data required to serialize it\n   * as part of meta-model elements.\n   *\n   * @method Moddle#createAny\n   *\n   * @example\n   *\n   * var foo = moddle.createAny('vendor:Foo', 'http://vendor', {\n   *   value: 'bar'\n   * });\n   *\n   * var container = moddle.create('my:Container', 'http://my', {\n   *   any: [ foo ]\n   * });\n   *\n   * // go ahead and serialize the stuff\n   *\n   *\n   * @param  {String} name  the name of the element\n   * @param  {String} nsUri the namespace uri of the element\n   * @param  {Object} [properties] a map of properties to initialize the instance with\n   * @return {Object} the any type instance\n   */\n  Moddle.prototype.createAny = function(name, nsUri, properties) {\n\n    var nameNs = parseName(name);\n\n    var element = {\n      $type: name,\n      $instanceOf: function(type) {\n        return type === this.$type;\n      }\n    };\n\n    var descriptor = {\n      name: name,\n      isGeneric: true,\n      ns: {\n        prefix: nameNs.prefix,\n        localName: nameNs.localName,\n        uri: nsUri\n      }\n    };\n\n    this.properties.defineDescriptor(element, descriptor);\n    this.properties.defineModel(element, this);\n    this.properties.define(element, '$parent', { enumerable: false, writable: true });\n    this.properties.define(element, '$instanceOf', { enumerable: false, writable: true });\n\n    forEach$1(properties, function(a, key) {\n      if (isObject(a) && a.value !== undefined) {\n        element[a.name] = a.value;\n      } else {\n        element[key] = a;\n      }\n    });\n\n    return element;\n  };\n\n  /**\n   * Returns a registered package by uri or prefix\n   *\n   * @return {Object} the package\n   */\n  Moddle.prototype.getPackage = function(uriOrPrefix) {\n    return this.registry.getPackage(uriOrPrefix);\n  };\n\n  /**\n   * Returns a snapshot of all known packages\n   *\n   * @return {Object} the package\n   */\n  Moddle.prototype.getPackages = function() {\n    return this.registry.getPackages();\n  };\n\n  /**\n   * Returns the descriptor for an element\n   */\n  Moddle.prototype.getElementDescriptor = function(element) {\n    return element.$descriptor;\n  };\n\n  /**\n   * Returns true if the given descriptor or instance\n   * represents the given type.\n   *\n   * May be applied to this, if element is omitted.\n   */\n  Moddle.prototype.hasType = function(element, type) {\n    if (type === undefined) {\n      type = element;\n      element = this;\n    }\n\n    var descriptor = element.$model.getElementDescriptor(element);\n\n    return (type in descriptor.allTypesByName);\n  };\n\n  /**\n   * Returns the descriptor of an elements named property\n   */\n  Moddle.prototype.getPropertyDescriptor = function(element, property) {\n    return this.getElementDescriptor(element).propertiesByName[property];\n  };\n\n  /**\n   * Returns a mapped type's descriptor\n   */\n  Moddle.prototype.getTypeDescriptor = function(type) {\n    return this.registry.typeMap[type];\n  };\n\n  var fromCharCode = String.fromCharCode;\n\n  var hasOwnProperty = Object.prototype.hasOwnProperty;\n\n  var ENTITY_PATTERN = /&#(\\d+);|&#x([0-9a-f]+);|&(\\w+);/ig;\n\n  var ENTITY_MAPPING = {\n    'amp': '&',\n    'apos': '\\'',\n    'gt': '>',\n    'lt': '<',\n    'quot': '\"'\n  };\n\n  // map UPPERCASE variants of supported special chars\n  Object.keys(ENTITY_MAPPING).forEach(function(k) {\n    ENTITY_MAPPING[k.toUpperCase()] = ENTITY_MAPPING[k];\n  });\n\n\n  function replaceEntities(_, d, x, z) {\n\n    // reserved names, i.e. &nbsp;\n    if (z) {\n      if (hasOwnProperty.call(ENTITY_MAPPING, z)) {\n        return ENTITY_MAPPING[z];\n      } else {\n\n        // fall back to original value\n        return '&' + z + ';';\n      }\n    }\n\n    // decimal encoded char\n    if (d) {\n      return fromCharCode(d);\n    }\n\n    // hex encoded char\n    return fromCharCode(parseInt(x, 16));\n  }\n\n\n  /**\n   * A basic entity decoder that can decode a minimal\n   * sub-set of reserved names (&amp;) as well as\n   * hex (&#xaaf;) and decimal (&#1231;) encoded characters.\n   *\n   * @param {string} str\n   *\n   * @return {string} decoded string\n   */\n  function decodeEntities(s) {\n    if (s.length > 3 && s.indexOf('&') !== -1) {\n      return s.replace(ENTITY_PATTERN, replaceEntities);\n    }\n\n    return s;\n  }\n\n  var XSI_URI = 'http://www.w3.org/2001/XMLSchema-instance';\n  var XSI_PREFIX = 'xsi';\n  var XSI_TYPE$1 = 'xsi:type';\n\n  var NON_WHITESPACE_OUTSIDE_ROOT_NODE = 'non-whitespace outside of root node';\n\n  function error$2(msg) {\n    return new Error(msg);\n  }\n\n  function missingNamespaceForPrefix(prefix) {\n    return 'missing namespace for prefix <' + prefix + '>';\n  }\n\n  function getter(getFn) {\n    return {\n      'get': getFn,\n      'enumerable': true\n    };\n  }\n\n  function cloneNsMatrix(nsMatrix) {\n    var clone = {}, key;\n    for (key in nsMatrix) {\n      clone[key] = nsMatrix[key];\n    }\n    return clone;\n  }\n\n  function uriPrefix(prefix) {\n    return prefix + '$uri';\n  }\n\n  function buildNsMatrix(nsUriToPrefix) {\n    var nsMatrix = {},\n        uri,\n        prefix;\n\n    for (uri in nsUriToPrefix) {\n      prefix = nsUriToPrefix[uri];\n      nsMatrix[prefix] = prefix;\n      nsMatrix[uriPrefix(prefix)] = uri;\n    }\n\n    return nsMatrix;\n  }\n\n  function noopGetContext() {\n    return { 'line': 0, 'column': 0 };\n  }\n\n  function throwFunc(err) {\n    throw err;\n  }\n\n  /**\n   * Creates a new parser with the given options.\n   *\n   * @constructor\n   *\n   * @param  {!Object<string, ?>=} options\n   */\n  function Parser(options) {\n\n    if (!this) {\n      return new Parser(options);\n    }\n\n    var proxy = options && options['proxy'];\n\n    var onText,\n        onOpenTag,\n        onCloseTag,\n        onCDATA,\n        onError = throwFunc,\n        onWarning,\n        onComment,\n        onQuestion,\n        onAttention;\n\n    var getContext = noopGetContext;\n\n    /**\n     * Do we need to parse the current elements attributes for namespaces?\n     *\n     * @type {boolean}\n     */\n    var maybeNS = false;\n\n    /**\n     * Do we process namespaces at all?\n     *\n     * @type {boolean}\n     */\n    var isNamespace = false;\n\n    /**\n     * The caught error returned on parse end\n     *\n     * @type {Error}\n     */\n    var returnError = null;\n\n    /**\n     * Should we stop parsing?\n     *\n     * @type {boolean}\n     */\n    var parseStop = false;\n\n    /**\n     * A map of { uri: prefix } used by the parser.\n     *\n     * This map will ensure we can normalize prefixes during processing;\n     * for each uri, only one prefix will be exposed to the handlers.\n     *\n     * @type {!Object<string, string>}}\n     */\n    var nsUriToPrefix;\n\n    /**\n     * Handle parse error.\n     *\n     * @param  {string|Error} err\n     */\n    function handleError(err) {\n      if (!(err instanceof Error)) {\n        err = error$2(err);\n      }\n\n      returnError = err;\n\n      onError(err, getContext);\n    }\n\n    /**\n     * Handle parse error.\n     *\n     * @param  {string|Error} err\n     */\n    function handleWarning(err) {\n\n      if (!onWarning) {\n        return;\n      }\n\n      if (!(err instanceof Error)) {\n        err = error$2(err);\n      }\n\n      onWarning(err, getContext);\n    }\n\n    /**\n     * Register parse listener.\n     *\n     * @param  {string}   name\n     * @param  {Function} cb\n     *\n     * @return {Parser}\n     */\n    this['on'] = function(name, cb) {\n\n      if (typeof cb !== 'function') {\n        throw error$2('required args <name, cb>');\n      }\n\n      switch (name) {\n      case 'openTag': onOpenTag = cb; break;\n      case 'text': onText = cb; break;\n      case 'closeTag': onCloseTag = cb; break;\n      case 'error': onError = cb; break;\n      case 'warn': onWarning = cb; break;\n      case 'cdata': onCDATA = cb; break;\n      case 'attention': onAttention = cb; break; // <!XXXXX zzzz=\"eeee\">\n      case 'question': onQuestion = cb; break; // <? ....  ?>\n      case 'comment': onComment = cb; break;\n      default:\n        throw error$2('unsupported event: ' + name);\n      }\n\n      return this;\n    };\n\n    /**\n     * Set the namespace to prefix mapping.\n     *\n     * @example\n     *\n     * parser.ns({\n     *   'http://foo': 'foo',\n     *   'http://bar': 'bar'\n     * });\n     *\n     * @param  {!Object<string, string>} nsMap\n     *\n     * @return {Parser}\n     */\n    this['ns'] = function(nsMap) {\n\n      if (typeof nsMap === 'undefined') {\n        nsMap = {};\n      }\n\n      if (typeof nsMap !== 'object') {\n        throw error$2('required args <nsMap={}>');\n      }\n\n      var _nsUriToPrefix = {}, k;\n\n      for (k in nsMap) {\n        _nsUriToPrefix[k] = nsMap[k];\n      }\n\n      // FORCE default mapping for schema instance\n      _nsUriToPrefix[XSI_URI] = XSI_PREFIX;\n\n      isNamespace = true;\n      nsUriToPrefix = _nsUriToPrefix;\n\n      return this;\n    };\n\n    /**\n     * Parse xml string.\n     *\n     * @param  {string} xml\n     *\n     * @return {Error} returnError, if not thrown\n     */\n    this['parse'] = function(xml) {\n      if (typeof xml !== 'string') {\n        throw error$2('required args <xml=string>');\n      }\n\n      returnError = null;\n\n      parse(xml);\n\n      getContext = noopGetContext;\n      parseStop = false;\n\n      return returnError;\n    };\n\n    /**\n     * Stop parsing.\n     */\n    this['stop'] = function() {\n      parseStop = true;\n    };\n\n    /**\n     * Parse string, invoking configured listeners on element.\n     *\n     * @param  {string} xml\n     */\n    function parse(xml) {\n      var nsMatrixStack = isNamespace ? [] : null,\n          nsMatrix = isNamespace ? buildNsMatrix(nsUriToPrefix) : null,\n          _nsMatrix,\n          nodeStack = [],\n          anonymousNsCount = 0,\n          tagStart = false,\n          tagEnd = false,\n          i = 0, j = 0,\n          x, y, q, w, v,\n          xmlns,\n          elementName,\n          _elementName,\n          elementProxy\n          ;\n\n      var attrsString = '',\n          attrsStart = 0,\n          cachedAttrs // false = parsed with errors, null = needs parsing\n          ;\n\n      /**\n       * Parse attributes on demand and returns the parsed attributes.\n       *\n       * Return semantics: (1) `false` on attribute parse error,\n       * (2) object hash on extracted attrs.\n       *\n       * @return {boolean|Object}\n       */\n      function getAttrs() {\n        if (cachedAttrs !== null) {\n          return cachedAttrs;\n        }\n\n        var nsUri,\n            nsUriPrefix,\n            nsName,\n            defaultAlias = isNamespace && nsMatrix['xmlns'],\n            attrList = isNamespace && maybeNS ? [] : null,\n            i = attrsStart,\n            s = attrsString,\n            l = s.length,\n            hasNewMatrix,\n            newalias,\n            value,\n            alias,\n            name,\n            attrs = {},\n            seenAttrs = {},\n            skipAttr,\n            w,\n            j;\n\n        parseAttr:\n        for (; i < l; i++) {\n          skipAttr = false;\n          w = s.charCodeAt(i);\n\n          if (w === 32 || (w < 14 && w > 8)) { // WHITESPACE={ \\f\\n\\r\\t\\v}\n            continue;\n          }\n\n          // wait for non whitespace character\n          if (w < 65 || w > 122 || (w > 90 && w < 97)) {\n            if (w !== 95 && w !== 58) { // char 95\"_\" 58\":\"\n              handleWarning('illegal first char attribute name');\n              skipAttr = true;\n            }\n          }\n\n          // parse attribute name\n          for (j = i + 1; j < l; j++) {\n            w = s.charCodeAt(j);\n\n            if (\n              w > 96 && w < 123 ||\n              w > 64 && w < 91 ||\n              w > 47 && w < 59 ||\n              w === 46 || // '.'\n              w === 45 || // '-'\n              w === 95 // '_'\n            ) {\n              continue;\n            }\n\n            // unexpected whitespace\n            if (w === 32 || (w < 14 && w > 8)) { // WHITESPACE\n              handleWarning('missing attribute value');\n              i = j;\n\n              continue parseAttr;\n            }\n\n            // expected \"=\"\n            if (w === 61) { // \"=\" == 61\n              break;\n            }\n\n            handleWarning('illegal attribute name char');\n            skipAttr = true;\n          }\n\n          name = s.substring(i, j);\n\n          if (name === 'xmlns:xmlns') {\n            handleWarning('illegal declaration of xmlns');\n            skipAttr = true;\n          }\n\n          w = s.charCodeAt(j + 1);\n\n          if (w === 34) { // '\"'\n            j = s.indexOf('\"', i = j + 2);\n\n            if (j === -1) {\n              j = s.indexOf('\\'', i);\n\n              if (j !== -1) {\n                handleWarning('attribute value quote missmatch');\n                skipAttr = true;\n              }\n            }\n\n          } else if (w === 39) { // \"'\"\n            j = s.indexOf('\\'', i = j + 2);\n\n            if (j === -1) {\n              j = s.indexOf('\"', i);\n\n              if (j !== -1) {\n                handleWarning('attribute value quote missmatch');\n                skipAttr = true;\n              }\n            }\n\n          } else {\n            handleWarning('missing attribute value quotes');\n            skipAttr = true;\n\n            // skip to next space\n            for (j = j + 1; j < l; j++) {\n              w = s.charCodeAt(j + 1);\n\n              if (w === 32 || (w < 14 && w > 8)) { // WHITESPACE\n                break;\n              }\n            }\n\n          }\n\n          if (j === -1) {\n            handleWarning('missing closing quotes');\n\n            j = l;\n            skipAttr = true;\n          }\n\n          if (!skipAttr) {\n            value = s.substring(i, j);\n          }\n\n          i = j;\n\n          // ensure SPACE follows attribute\n          // skip illegal content otherwise\n          // example a=\"b\"c\n          for (; j + 1 < l; j++) {\n            w = s.charCodeAt(j + 1);\n\n            if (w === 32 || (w < 14 && w > 8)) { // WHITESPACE\n              break;\n            }\n\n            // FIRST ILLEGAL CHAR\n            if (i === j) {\n              handleWarning('illegal character after attribute end');\n              skipAttr = true;\n            }\n          }\n\n          // advance cursor to next attribute\n          i = j + 1;\n\n          if (skipAttr) {\n            continue parseAttr;\n          }\n\n          // check attribute re-declaration\n          if (name in seenAttrs) {\n            handleWarning('attribute <' + name + '> already defined');\n            continue;\n          }\n\n          seenAttrs[name] = true;\n\n          if (!isNamespace) {\n            attrs[name] = value;\n            continue;\n          }\n\n          // try to extract namespace information\n          if (maybeNS) {\n            newalias = (\n              name === 'xmlns'\n                ? 'xmlns'\n                : (name.charCodeAt(0) === 120 && name.substr(0, 6) === 'xmlns:')\n                  ? name.substr(6)\n                  : null\n            );\n\n            // handle xmlns(:alias) assignment\n            if (newalias !== null) {\n              nsUri = decodeEntities(value);\n              nsUriPrefix = uriPrefix(newalias);\n\n              alias = nsUriToPrefix[nsUri];\n\n              if (!alias) {\n\n                // no prefix defined or prefix collision\n                if (\n                  (newalias === 'xmlns') ||\n                  (nsUriPrefix in nsMatrix && nsMatrix[nsUriPrefix] !== nsUri)\n                ) {\n\n                  // alocate free ns prefix\n                  do {\n                    alias = 'ns' + (anonymousNsCount++);\n                  } while (typeof nsMatrix[alias] !== 'undefined');\n                } else {\n                  alias = newalias;\n                }\n\n                nsUriToPrefix[nsUri] = alias;\n              }\n\n              if (nsMatrix[newalias] !== alias) {\n                if (!hasNewMatrix) {\n                  nsMatrix = cloneNsMatrix(nsMatrix);\n                  hasNewMatrix = true;\n                }\n\n                nsMatrix[newalias] = alias;\n                if (newalias === 'xmlns') {\n                  nsMatrix[uriPrefix(alias)] = nsUri;\n                  defaultAlias = alias;\n                }\n\n                nsMatrix[nsUriPrefix] = nsUri;\n              }\n\n              // expose xmlns(:asd)=\"...\" in attributes\n              attrs[name] = value;\n              continue;\n            }\n\n            // collect attributes until all namespace\n            // declarations are processed\n            attrList.push(name, value);\n            continue;\n\n          } /** end if (maybeNs) */\n\n          // handle attributes on element without\n          // namespace declarations\n          w = name.indexOf(':');\n          if (w === -1) {\n            attrs[name] = value;\n            continue;\n          }\n\n          // normalize ns attribute name\n          if (!(nsName = nsMatrix[name.substring(0, w)])) {\n            handleWarning(missingNamespaceForPrefix(name.substring(0, w)));\n            continue;\n          }\n\n          name = defaultAlias === nsName\n            ? name.substr(w + 1)\n            : nsName + name.substr(w);\n\n          // end: normalize ns attribute name\n\n          // normalize xsi:type ns attribute value\n          if (name === XSI_TYPE$1) {\n            w = value.indexOf(':');\n\n            if (w !== -1) {\n              nsName = value.substring(0, w);\n\n              // handle default prefixes, i.e. xs:String gracefully\n              nsName = nsMatrix[nsName] || nsName;\n              value = nsName + value.substring(w);\n            } else {\n              value = defaultAlias + ':' + value;\n            }\n          }\n\n          // end: normalize xsi:type ns attribute value\n\n          attrs[name] = value;\n        }\n\n\n        // handle deferred, possibly namespaced attributes\n        if (maybeNS) {\n\n          // normalize captured attributes\n          for (i = 0, l = attrList.length; i < l; i++) {\n\n            name = attrList[i++];\n            value = attrList[i];\n\n            w = name.indexOf(':');\n\n            if (w !== -1) {\n\n              // normalize ns attribute name\n              if (!(nsName = nsMatrix[name.substring(0, w)])) {\n                handleWarning(missingNamespaceForPrefix(name.substring(0, w)));\n                continue;\n              }\n\n              name = defaultAlias === nsName\n                ? name.substr(w + 1)\n                : nsName + name.substr(w);\n\n              // end: normalize ns attribute name\n\n              // normalize xsi:type ns attribute value\n              if (name === XSI_TYPE$1) {\n                w = value.indexOf(':');\n\n                if (w !== -1) {\n                  nsName = value.substring(0, w);\n\n                  // handle default prefixes, i.e. xs:String gracefully\n                  nsName = nsMatrix[nsName] || nsName;\n                  value = nsName + value.substring(w);\n                } else {\n                  value = defaultAlias + ':' + value;\n                }\n              }\n\n              // end: normalize xsi:type ns attribute value\n            }\n\n            attrs[name] = value;\n          }\n\n          // end: normalize captured attributes\n        }\n\n        return cachedAttrs = attrs;\n      }\n\n      /**\n       * Extract the parse context { line, column, part }\n       * from the current parser position.\n       *\n       * @return {Object} parse context\n       */\n      function getParseContext() {\n        var splitsRe = /(\\r\\n|\\r|\\n)/g;\n\n        var line = 0;\n        var column = 0;\n        var startOfLine = 0;\n        var endOfLine = j;\n        var match;\n        var data;\n\n        while (i >= startOfLine) {\n\n          match = splitsRe.exec(xml);\n\n          if (!match) {\n            break;\n          }\n\n          // end of line = (break idx + break chars)\n          endOfLine = match[0].length + match.index;\n\n          if (endOfLine > i) {\n            break;\n          }\n\n          // advance to next line\n          line += 1;\n\n          startOfLine = endOfLine;\n        }\n\n        // EOF errors\n        if (i == -1) {\n          column = endOfLine;\n          data = xml.substring(j);\n        } else\n\n        // start errors\n        if (j === 0) {\n          data = xml.substring(j, i);\n        }\n\n        // other errors\n        else {\n          column = i - startOfLine;\n          data = (j == -1 ? xml.substring(i) : xml.substring(i, j + 1));\n        }\n\n        return {\n          'data': data,\n          'line': line,\n          'column': column\n        };\n      }\n\n      getContext = getParseContext;\n\n\n      if (proxy) {\n        elementProxy = Object.create({}, {\n          'name': getter(function() {\n            return elementName;\n          }),\n          'originalName': getter(function() {\n            return _elementName;\n          }),\n          'attrs': getter(getAttrs),\n          'ns': getter(function() {\n            return nsMatrix;\n          })\n        });\n      }\n\n      // actual parse logic\n      while (j !== -1) {\n\n        if (xml.charCodeAt(j) === 60) { // \"<\"\n          i = j;\n        } else {\n          i = xml.indexOf('<', j);\n        }\n\n        // parse end\n        if (i === -1) {\n          if (nodeStack.length) {\n            return handleError('unexpected end of file');\n          }\n\n          if (j === 0) {\n            return handleError('missing start tag');\n          }\n\n          if (j < xml.length) {\n            if (xml.substring(j).trim()) {\n              handleWarning(NON_WHITESPACE_OUTSIDE_ROOT_NODE);\n            }\n          }\n\n          return;\n        }\n\n        // parse text\n        if (j !== i) {\n\n          if (nodeStack.length) {\n            if (onText) {\n              onText(xml.substring(j, i), decodeEntities, getContext);\n\n              if (parseStop) {\n                return;\n              }\n            }\n          } else {\n            if (xml.substring(j, i).trim()) {\n              handleWarning(NON_WHITESPACE_OUTSIDE_ROOT_NODE);\n\n              if (parseStop) {\n                return;\n              }\n            }\n          }\n        }\n\n        w = xml.charCodeAt(i+1);\n\n        // parse comments + CDATA\n        if (w === 33) { // \"!\"\n          q = xml.charCodeAt(i+2);\n\n          // CDATA section\n          if (q === 91 && xml.substr(i + 3, 6) === 'CDATA[') { // 91 == \"[\"\n            j = xml.indexOf(']]>', i);\n            if (j === -1) {\n              return handleError('unclosed cdata');\n            }\n\n            if (onCDATA) {\n              onCDATA(xml.substring(i + 9, j), getContext);\n              if (parseStop) {\n                return;\n              }\n            }\n\n            j += 3;\n            continue;\n          }\n\n          // comment\n          if (q === 45 && xml.charCodeAt(i + 3) === 45) { // 45 == \"-\"\n            j = xml.indexOf('-->', i);\n            if (j === -1) {\n              return handleError('unclosed comment');\n            }\n\n\n            if (onComment) {\n              onComment(xml.substring(i + 4, j), decodeEntities, getContext);\n              if (parseStop) {\n                return;\n              }\n            }\n\n            j += 3;\n            continue;\n          }\n        }\n\n        // parse question <? ... ?>\n        if (w === 63) { // \"?\"\n          j = xml.indexOf('?>', i);\n          if (j === -1) {\n            return handleError('unclosed question');\n          }\n\n          if (onQuestion) {\n            onQuestion(xml.substring(i, j + 2), getContext);\n            if (parseStop) {\n              return;\n            }\n          }\n\n          j += 2;\n          continue;\n        }\n\n        // find matching closing tag for attention or standard tags\n        // for that we must skip through attribute values\n        // (enclosed in single or double quotes)\n        for (x = i + 1; ; x++) {\n          v = xml.charCodeAt(x);\n          if (isNaN(v)) {\n            j = -1;\n            return handleError('unclosed tag');\n          }\n\n          // [10] AttValue ::= '\"' ([^<&\"] | Reference)* '\"' | \"'\" ([^<&'] | Reference)* \"'\"\n          // skips the quoted string\n          // (double quotes) does not appear in a literal enclosed by (double quotes)\n          // (single quote) does not appear in a literal enclosed by (single quote)\n          if (v === 34) { //  '\"'\n            q = xml.indexOf('\"', x + 1);\n            x = q !== -1 ? q : x;\n          } else if (v === 39) { // \"'\"\n            q = xml.indexOf(\"'\", x + 1);\n            x = q !== -1 ? q : x;\n          } else if (v === 62) { // '>'\n            j = x;\n            break;\n          }\n        }\n\n\n        // parse attention <! ...>\n        // previously comment and CDATA have already been parsed\n        if (w === 33) { // \"!\"\n\n          if (onAttention) {\n            onAttention(xml.substring(i, j + 1), decodeEntities, getContext);\n            if (parseStop) {\n              return;\n            }\n          }\n\n          j += 1;\n          continue;\n        }\n\n        // don't process attributes;\n        // there are none\n        cachedAttrs = {};\n\n        // if (xml.charCodeAt(i+1) === 47) { // </...\n        if (w === 47) { // </...\n          tagStart = false;\n          tagEnd = true;\n\n          if (!nodeStack.length) {\n            return handleError('missing open tag');\n          }\n\n          // verify open <-> close tag match\n          x = elementName = nodeStack.pop();\n          q = i + 2 + x.length;\n\n          if (xml.substring(i + 2, q) !== x) {\n            return handleError('closing tag mismatch');\n          }\n\n          // verify chars in close tag\n          for (; q < j; q++) {\n            w = xml.charCodeAt(q);\n\n            if (w === 32 || (w > 8 && w < 14)) { // \\f\\n\\r\\t\\v space\n              continue;\n            }\n\n            return handleError('close tag');\n          }\n\n        } else {\n          if (xml.charCodeAt(j - 1) === 47) { // .../>\n            x = elementName = xml.substring(i + 1, j - 1);\n\n            tagStart = true;\n            tagEnd = true;\n\n          } else {\n            x = elementName = xml.substring(i + 1, j);\n\n            tagStart = true;\n            tagEnd = false;\n          }\n\n          if (!(w > 96 && w < 123 || w > 64 && w < 91 || w === 95 || w === 58)) { // char 95\"_\" 58\":\"\n            return handleError('illegal first char nodeName');\n          }\n\n          for (q = 1, y = x.length; q < y; q++) {\n            w = x.charCodeAt(q);\n\n            if (w > 96 && w < 123 || w > 64 && w < 91 || w > 47 && w < 59 || w === 45 || w === 95 || w == 46) {\n              continue;\n            }\n\n            if (w === 32 || (w < 14 && w > 8)) { // \\f\\n\\r\\t\\v space\n              elementName = x.substring(0, q);\n\n              // maybe there are attributes\n              cachedAttrs = null;\n              break;\n            }\n\n            return handleError('invalid nodeName');\n          }\n\n          if (!tagEnd) {\n            nodeStack.push(elementName);\n          }\n        }\n\n        if (isNamespace) {\n\n          _nsMatrix = nsMatrix;\n\n          if (tagStart) {\n\n            // remember old namespace\n            // unless we're self-closing\n            if (!tagEnd) {\n              nsMatrixStack.push(_nsMatrix);\n            }\n\n            if (cachedAttrs === null) {\n\n              // quick check, whether there may be namespace\n              // declarations on the node; if that is the case\n              // we need to eagerly parse the node attributes\n              if ((maybeNS = x.indexOf('xmlns', q) !== -1)) {\n                attrsStart = q;\n                attrsString = x;\n\n                getAttrs();\n\n                maybeNS = false;\n              }\n            }\n          }\n\n          _elementName = elementName;\n\n          w = elementName.indexOf(':');\n          if (w !== -1) {\n            xmlns = nsMatrix[elementName.substring(0, w)];\n\n            // prefix given; namespace must exist\n            if (!xmlns) {\n              return handleError('missing namespace on <' + _elementName + '>');\n            }\n\n            elementName = elementName.substr(w + 1);\n          } else {\n            xmlns = nsMatrix['xmlns'];\n\n            // if no default namespace is defined,\n            // we'll import the element as anonymous.\n            //\n            // it is up to users to correct that to the document defined\n            // targetNamespace, or whatever their undersanding of the\n            // XML spec mandates.\n          }\n\n          // adjust namespace prefixs as configured\n          if (xmlns) {\n            elementName = xmlns + ':' + elementName;\n          }\n\n        }\n\n        if (tagStart) {\n          attrsStart = q;\n          attrsString = x;\n\n          if (onOpenTag) {\n            if (proxy) {\n              onOpenTag(elementProxy, decodeEntities, tagEnd, getContext);\n            } else {\n              onOpenTag(elementName, getAttrs, decodeEntities, tagEnd, getContext);\n            }\n\n            if (parseStop) {\n              return;\n            }\n          }\n\n        }\n\n        if (tagEnd) {\n\n          if (onCloseTag) {\n            onCloseTag(proxy ? elementProxy : elementName, decodeEntities, tagStart, getContext);\n\n            if (parseStop) {\n              return;\n            }\n          }\n\n          // restore old namespace\n          if (isNamespace) {\n            if (!tagStart) {\n              nsMatrix = nsMatrixStack.pop();\n            } else {\n              nsMatrix = _nsMatrix;\n            }\n          }\n        }\n\n        j += 1;\n      }\n    } /** end parse */\n\n  }\n\n  function hasLowerCaseAlias(pkg) {\n    return pkg.xml && pkg.xml.tagAlias === 'lowerCase';\n  }\n\n  var DEFAULT_NS_MAP = {\n    'xsi': 'http://www.w3.org/2001/XMLSchema-instance',\n    'xml': 'http://www.w3.org/XML/1998/namespace'\n  };\n\n  var XSI_TYPE = 'xsi:type';\n\n  function serializeFormat(element) {\n    return element.xml && element.xml.serialize;\n  }\n\n  function serializeAsType(element) {\n    return serializeFormat(element) === XSI_TYPE;\n  }\n\n  function serializeAsProperty(element) {\n    return serializeFormat(element) === 'property';\n  }\n\n  function capitalize(str) {\n    return str.charAt(0).toUpperCase() + str.slice(1);\n  }\n\n  function aliasToName(aliasNs, pkg) {\n\n    if (!hasLowerCaseAlias(pkg)) {\n      return aliasNs.name;\n    }\n\n    return aliasNs.prefix + ':' + capitalize(aliasNs.localName);\n  }\n\n  function prefixedToName(nameNs, pkg) {\n\n    var name = nameNs.name,\n        localName = nameNs.localName;\n\n    var typePrefix = pkg.xml && pkg.xml.typePrefix;\n\n    if (typePrefix && localName.indexOf(typePrefix) === 0) {\n      return nameNs.prefix + ':' + localName.slice(typePrefix.length);\n    } else {\n      return name;\n    }\n  }\n\n  function normalizeXsiTypeName(name, model) {\n\n    var nameNs = parseName(name);\n    var pkg = model.getPackage(nameNs.prefix);\n\n    return prefixedToName(nameNs, pkg);\n  }\n\n  function error$1(message) {\n    return new Error(message);\n  }\n\n  /**\n   * Get the moddle descriptor for a given instance or type.\n   *\n   * @param  {ModdleElement|Function} element\n   *\n   * @return {Object} the moddle descriptor\n   */\n  function getModdleDescriptor(element) {\n    return element.$descriptor;\n  }\n\n\n  /**\n   * A parse context.\n   *\n   * @class\n   *\n   * @param {Object} options\n   * @param {ElementHandler} options.rootHandler the root handler for parsing a document\n   * @param {boolean} [options.lax=false] whether or not to ignore invalid elements\n   */\n  function Context(options) {\n\n    /**\n     * @property {ElementHandler} rootHandler\n     */\n\n    /**\n     * @property {Boolean} lax\n     */\n\n    assign$1(this, options);\n\n    this.elementsById = {};\n    this.references = [];\n    this.warnings = [];\n\n    /**\n     * Add an unresolved reference.\n     *\n     * @param {Object} reference\n     */\n    this.addReference = function(reference) {\n      this.references.push(reference);\n    };\n\n    /**\n     * Add a processed element.\n     *\n     * @param {ModdleElement} element\n     */\n    this.addElement = function(element) {\n\n      if (!element) {\n        throw error$1('expected element');\n      }\n\n      var elementsById = this.elementsById;\n\n      var descriptor = getModdleDescriptor(element);\n\n      var idProperty = descriptor.idProperty,\n          id;\n\n      if (idProperty) {\n        id = element.get(idProperty.name);\n\n        if (id) {\n\n          // for QName validation as per http://www.w3.org/TR/REC-xml/#NT-NameChar\n          //if (!/^([a-z][\\w-.]*:)?[a-z_][\\w-.]*$/i.test(id)) {\n          //  throw new Error('illegal ID <' + id + '>');\n          //}\n\n          if (elementsById[id]) {\n            throw error$1('duplicate ID <' + id + '>');\n          }\n\n          elementsById[id] = element;\n        }\n      }\n    };\n\n    /**\n     * Add an import warning.\n     *\n     * @param {Object} warning\n     * @param {String} warning.message\n     * @param {Error} [warning.error]\n     */\n    this.addWarning = function(warning) {\n      this.warnings.push(warning);\n    };\n  }\n\n  function BaseHandler() {}\n\n  BaseHandler.prototype.handleEnd = function() {};\n  BaseHandler.prototype.handleText = function() {};\n  BaseHandler.prototype.handleNode = function() {};\n\n\n  /**\n   * A simple pass through handler that does nothing except for\n   * ignoring all input it receives.\n   *\n   * This is used to ignore unknown elements and\n   * attributes.\n   */\n  function NoopHandler() { }\n\n  NoopHandler.prototype = Object.create(BaseHandler.prototype);\n\n  NoopHandler.prototype.handleNode = function() {\n    return this;\n  };\n\n  function BodyHandler() {}\n\n  BodyHandler.prototype = Object.create(BaseHandler.prototype);\n\n  BodyHandler.prototype.handleText = function(text) {\n    this.body = (this.body || '') + text;\n  };\n\n  function ReferenceHandler(property, context) {\n    this.property = property;\n    this.context = context;\n  }\n\n  ReferenceHandler.prototype = Object.create(BodyHandler.prototype);\n\n  ReferenceHandler.prototype.handleNode = function(node) {\n\n    if (this.element) {\n      throw error$1('expected no sub nodes');\n    } else {\n      this.element = this.createReference(node);\n    }\n\n    return this;\n  };\n\n  ReferenceHandler.prototype.handleEnd = function() {\n    this.element.id = this.body;\n  };\n\n  ReferenceHandler.prototype.createReference = function(node) {\n    return {\n      property: this.property.ns.name,\n      id: ''\n    };\n  };\n\n  function ValueHandler(propertyDesc, element) {\n    this.element = element;\n    this.propertyDesc = propertyDesc;\n  }\n\n  ValueHandler.prototype = Object.create(BodyHandler.prototype);\n\n  ValueHandler.prototype.handleEnd = function() {\n\n    var value = this.body || '',\n        element = this.element,\n        propertyDesc = this.propertyDesc;\n\n    value = coerceType(propertyDesc.type, value);\n\n    if (propertyDesc.isMany) {\n      element.get(propertyDesc.name).push(value);\n    } else {\n      element.set(propertyDesc.name, value);\n    }\n  };\n\n\n  function BaseElementHandler() {}\n\n  BaseElementHandler.prototype = Object.create(BodyHandler.prototype);\n\n  BaseElementHandler.prototype.handleNode = function(node) {\n    var parser = this,\n        element = this.element;\n\n    if (!element) {\n      element = this.element = this.createElement(node);\n\n      this.context.addElement(element);\n    } else {\n      parser = this.handleChild(node);\n    }\n\n    return parser;\n  };\n\n  /**\n   * @class Reader.ElementHandler\n   *\n   */\n  function ElementHandler(model, typeName, context) {\n    this.model = model;\n    this.type = model.getType(typeName);\n    this.context = context;\n  }\n\n  ElementHandler.prototype = Object.create(BaseElementHandler.prototype);\n\n  ElementHandler.prototype.addReference = function(reference) {\n    this.context.addReference(reference);\n  };\n\n  ElementHandler.prototype.handleText = function(text) {\n\n    var element = this.element,\n        descriptor = getModdleDescriptor(element),\n        bodyProperty = descriptor.bodyProperty;\n\n    if (!bodyProperty) {\n      throw error$1('unexpected body text <' + text + '>');\n    }\n\n    BodyHandler.prototype.handleText.call(this, text);\n  };\n\n  ElementHandler.prototype.handleEnd = function() {\n\n    var value = this.body,\n        element = this.element,\n        descriptor = getModdleDescriptor(element),\n        bodyProperty = descriptor.bodyProperty;\n\n    if (bodyProperty && value !== undefined) {\n      value = coerceType(bodyProperty.type, value);\n      element.set(bodyProperty.name, value);\n    }\n  };\n\n  /**\n   * Create an instance of the model from the given node.\n   *\n   * @param  {Element} node the xml node\n   */\n  ElementHandler.prototype.createElement = function(node) {\n    var attributes = node.attributes,\n        Type = this.type,\n        descriptor = getModdleDescriptor(Type),\n        context = this.context,\n        instance = new Type({}),\n        model = this.model,\n        propNameNs;\n\n    forEach$1(attributes, function(value, name) {\n\n      var prop = descriptor.propertiesByName[name],\n          values;\n\n      if (prop && prop.isReference) {\n\n        if (!prop.isMany) {\n          context.addReference({\n            element: instance,\n            property: prop.ns.name,\n            id: value\n          });\n        } else {\n\n          // IDREFS: parse references as whitespace-separated list\n          values = value.split(' ');\n\n          forEach$1(values, function(v) {\n            context.addReference({\n              element: instance,\n              property: prop.ns.name,\n              id: v\n            });\n          });\n        }\n\n      } else {\n        if (prop) {\n          value = coerceType(prop.type, value);\n        } else\n        if (name !== 'xmlns') {\n          propNameNs = parseName(name, descriptor.ns.prefix);\n\n          // check whether attribute is defined in a well-known namespace\n          // if that is the case we emit a warning to indicate potential misuse\n          if (model.getPackage(propNameNs.prefix)) {\n\n            context.addWarning({\n              message: 'unknown attribute <' + name + '>',\n              element: instance,\n              property: name,\n              value: value\n            });\n          }\n        }\n\n        instance.set(name, value);\n      }\n    });\n\n    return instance;\n  };\n\n  ElementHandler.prototype.getPropertyForNode = function(node) {\n\n    var name = node.name;\n    var nameNs = parseName(name);\n\n    var type = this.type,\n        model = this.model,\n        descriptor = getModdleDescriptor(type);\n\n    var propertyName = nameNs.name,\n        property = descriptor.propertiesByName[propertyName],\n        elementTypeName,\n        elementType;\n\n    // search for properties by name first\n\n    if (property && !property.isAttr) {\n\n      if (serializeAsType(property)) {\n        elementTypeName = node.attributes[XSI_TYPE];\n\n        // xsi type is optional, if it does not exists the\n        // default type is assumed\n        if (elementTypeName) {\n\n          // take possible type prefixes from XML\n          // into account, i.e.: xsi:type=\"t{ActualType}\"\n          elementTypeName = normalizeXsiTypeName(elementTypeName, model);\n\n          elementType = model.getType(elementTypeName);\n\n          return assign$1({}, property, {\n            effectiveType: getModdleDescriptor(elementType).name\n          });\n        }\n      }\n\n      // search for properties by name first\n      return property;\n    }\n\n    var pkg = model.getPackage(nameNs.prefix);\n\n    if (pkg) {\n      elementTypeName = aliasToName(nameNs, pkg);\n      elementType = model.getType(elementTypeName);\n\n      // search for collection members later\n      property = find(descriptor.properties, function(p) {\n        return !p.isVirtual && !p.isReference && !p.isAttribute && elementType.hasType(p.type);\n      });\n\n      if (property) {\n        return assign$1({}, property, {\n          effectiveType: getModdleDescriptor(elementType).name\n        });\n      }\n    } else {\n\n      // parse unknown element (maybe extension)\n      property = find(descriptor.properties, function(p) {\n        return !p.isReference && !p.isAttribute && p.type === 'Element';\n      });\n\n      if (property) {\n        return property;\n      }\n    }\n\n    throw error$1('unrecognized element <' + nameNs.name + '>');\n  };\n\n  ElementHandler.prototype.toString = function() {\n    return 'ElementDescriptor[' + getModdleDescriptor(this.type).name + ']';\n  };\n\n  ElementHandler.prototype.valueHandler = function(propertyDesc, element) {\n    return new ValueHandler(propertyDesc, element);\n  };\n\n  ElementHandler.prototype.referenceHandler = function(propertyDesc) {\n    return new ReferenceHandler(propertyDesc, this.context);\n  };\n\n  ElementHandler.prototype.handler = function(type) {\n    if (type === 'Element') {\n      return new GenericElementHandler(this.model, type, this.context);\n    } else {\n      return new ElementHandler(this.model, type, this.context);\n    }\n  };\n\n  /**\n   * Handle the child element parsing\n   *\n   * @param  {Element} node the xml node\n   */\n  ElementHandler.prototype.handleChild = function(node) {\n    var propertyDesc, type, element, childHandler;\n\n    propertyDesc = this.getPropertyForNode(node);\n    element = this.element;\n\n    type = propertyDesc.effectiveType || propertyDesc.type;\n\n    if (isSimple(type)) {\n      return this.valueHandler(propertyDesc, element);\n    }\n\n    if (propertyDesc.isReference) {\n      childHandler = this.referenceHandler(propertyDesc).handleNode(node);\n    } else {\n      childHandler = this.handler(type).handleNode(node);\n    }\n\n    var newElement = childHandler.element;\n\n    // child handles may decide to skip elements\n    // by not returning anything\n    if (newElement !== undefined) {\n\n      if (propertyDesc.isMany) {\n        element.get(propertyDesc.name).push(newElement);\n      } else {\n        element.set(propertyDesc.name, newElement);\n      }\n\n      if (propertyDesc.isReference) {\n        assign$1(newElement, {\n          element: element\n        });\n\n        this.context.addReference(newElement);\n      } else {\n\n        // establish child -> parent relationship\n        newElement.$parent = element;\n      }\n    }\n\n    return childHandler;\n  };\n\n  /**\n   * An element handler that performs special validation\n   * to ensure the node it gets initialized with matches\n   * the handlers type (namespace wise).\n   *\n   * @param {Moddle} model\n   * @param {String} typeName\n   * @param {Context} context\n   */\n  function RootElementHandler(model, typeName, context) {\n    ElementHandler.call(this, model, typeName, context);\n  }\n\n  RootElementHandler.prototype = Object.create(ElementHandler.prototype);\n\n  RootElementHandler.prototype.createElement = function(node) {\n\n    var name = node.name,\n        nameNs = parseName(name),\n        model = this.model,\n        type = this.type,\n        pkg = model.getPackage(nameNs.prefix),\n        typeName = pkg && aliasToName(nameNs, pkg) || name;\n\n    // verify the correct namespace if we parse\n    // the first element in the handler tree\n    //\n    // this ensures we don't mistakenly import wrong namespace elements\n    if (!type.hasType(typeName)) {\n      throw error$1('unexpected element <' + node.originalName + '>');\n    }\n\n    return ElementHandler.prototype.createElement.call(this, node);\n  };\n\n\n  function GenericElementHandler(model, typeName, context) {\n    this.model = model;\n    this.context = context;\n  }\n\n  GenericElementHandler.prototype = Object.create(BaseElementHandler.prototype);\n\n  GenericElementHandler.prototype.createElement = function(node) {\n\n    var name = node.name,\n        ns = parseName(name),\n        prefix = ns.prefix,\n        uri = node.ns[prefix + '$uri'],\n        attributes = node.attributes;\n\n    return this.model.createAny(name, uri, attributes);\n  };\n\n  GenericElementHandler.prototype.handleChild = function(node) {\n\n    var handler = new GenericElementHandler(this.model, 'Element', this.context).handleNode(node),\n        element = this.element;\n\n    var newElement = handler.element,\n        children;\n\n    if (newElement !== undefined) {\n      children = element.$children = element.$children || [];\n      children.push(newElement);\n\n      // establish child -> parent relationship\n      newElement.$parent = element;\n    }\n\n    return handler;\n  };\n\n  GenericElementHandler.prototype.handleEnd = function() {\n    if (this.body) {\n      this.element.$body = this.body;\n    }\n  };\n\n  /**\n   * A reader for a meta-model\n   *\n   * @param {Object} options\n   * @param {Model} options.model used to read xml files\n   * @param {Boolean} options.lax whether to make parse errors warnings\n   */\n  function Reader(options) {\n\n    if (options instanceof Moddle) {\n      options = {\n        model: options\n      };\n    }\n\n    assign$1(this, { lax: false }, options);\n  }\n\n  /**\n   * The fromXML result.\n   *\n   * @typedef {Object} ParseResult\n   *\n   * @property {ModdleElement} rootElement\n   * @property {Array<Object>} references\n   * @property {Array<Error>} warnings\n   * @property {Object} elementsById - a mapping containing each ID -> ModdleElement\n   */\n\n  /**\n   * The fromXML result.\n   *\n   * @typedef {Error} ParseError\n   *\n   * @property {Array<Error>} warnings\n   */\n\n  /**\n   * Parse the given XML into a moddle document tree.\n   *\n   * @param {String} xml\n   * @param {ElementHandler|Object} options or rootHandler\n   *\n   * @returns {Promise<ParseResult, ParseError>}\n   */\n  Reader.prototype.fromXML = function(xml, options, done) {\n\n    var rootHandler = options.rootHandler;\n\n    if (options instanceof ElementHandler) {\n\n      // root handler passed via (xml, { rootHandler: ElementHandler }, ...)\n      rootHandler = options;\n      options = {};\n    } else {\n      if (typeof options === 'string') {\n\n        // rootHandler passed via (xml, 'someString', ...)\n        rootHandler = this.handler(options);\n        options = {};\n      } else if (typeof rootHandler === 'string') {\n\n        // rootHandler passed via (xml, { rootHandler: 'someString' }, ...)\n        rootHandler = this.handler(rootHandler);\n      }\n    }\n\n    var model = this.model,\n        lax = this.lax;\n\n    var context = new Context(assign$1({}, options, { rootHandler: rootHandler })),\n        parser = new Parser({ proxy: true }),\n        stack = createStack();\n\n    rootHandler.context = context;\n\n    // push root handler\n    stack.push(rootHandler);\n\n\n    /**\n     * Handle error.\n     *\n     * @param  {Error} err\n     * @param  {Function} getContext\n     * @param  {boolean} lax\n     *\n     * @return {boolean} true if handled\n     */\n    function handleError(err, getContext, lax) {\n\n      var ctx = getContext();\n\n      var line = ctx.line,\n          column = ctx.column,\n          data = ctx.data;\n\n      // we receive the full context data here,\n      // for elements trim down the information\n      // to the tag name, only\n      if (data.charAt(0) === '<' && data.indexOf(' ') !== -1) {\n        data = data.slice(0, data.indexOf(' ')) + '>';\n      }\n\n      var message =\n        'unparsable content ' + (data ? data + ' ' : '') + 'detected\\n\\t' +\n          'line: ' + line + '\\n\\t' +\n          'column: ' + column + '\\n\\t' +\n          'nested error: ' + err.message;\n\n      if (lax) {\n        context.addWarning({\n          message: message,\n          error: err\n        });\n\n        return true;\n      } else {\n        throw error$1(message);\n      }\n    }\n\n    function handleWarning(err, getContext) {\n\n      // just like handling errors in <lax=true> mode\n      return handleError(err, getContext, true);\n    }\n\n    /**\n     * Resolve collected references on parse end.\n     */\n    function resolveReferences() {\n\n      var elementsById = context.elementsById;\n      var references = context.references;\n\n      var i, r;\n\n      for (i = 0; (r = references[i]); i++) {\n        var element = r.element;\n        var reference = elementsById[r.id];\n        var property = getModdleDescriptor(element).propertiesByName[r.property];\n\n        if (!reference) {\n          context.addWarning({\n            message: 'unresolved reference <' + r.id + '>',\n            element: r.element,\n            property: r.property,\n            value: r.id\n          });\n        }\n\n        if (property.isMany) {\n          var collection = element.get(property.name),\n              idx = collection.indexOf(r);\n\n          // we replace an existing place holder (idx != -1) or\n          // append to the collection instead\n          if (idx === -1) {\n            idx = collection.length;\n          }\n\n          if (!reference) {\n\n            // remove unresolvable reference\n            collection.splice(idx, 1);\n          } else {\n\n            // add or update reference in collection\n            collection[idx] = reference;\n          }\n        } else {\n          element.set(property.name, reference);\n        }\n      }\n    }\n\n    function handleClose() {\n      stack.pop().handleEnd();\n    }\n\n    var PREAMBLE_START_PATTERN = /^<\\?xml /i;\n\n    var ENCODING_PATTERN = / encoding=\"([^\"]+)\"/i;\n\n    var UTF_8_PATTERN = /^utf-8$/i;\n\n    function handleQuestion(question) {\n\n      if (!PREAMBLE_START_PATTERN.test(question)) {\n        return;\n      }\n\n      var match = ENCODING_PATTERN.exec(question);\n      var encoding = match && match[1];\n\n      if (!encoding || UTF_8_PATTERN.test(encoding)) {\n        return;\n      }\n\n      context.addWarning({\n        message:\n          'unsupported document encoding <' + encoding + '>, ' +\n          'falling back to UTF-8'\n      });\n    }\n\n    function handleOpen(node, getContext) {\n      var handler = stack.peek();\n\n      try {\n        stack.push(handler.handleNode(node));\n      } catch (err) {\n\n        if (handleError(err, getContext, lax)) {\n          stack.push(new NoopHandler());\n        }\n      }\n    }\n\n    function handleCData(text, getContext) {\n\n      try {\n        stack.peek().handleText(text);\n      } catch (err) {\n        handleWarning(err, getContext);\n      }\n    }\n\n    function handleText(text, getContext) {\n\n      // strip whitespace only nodes, i.e. before\n      // <!CDATA[ ... ]> sections and in between tags\n\n      if (!text.trim()) {\n        return;\n      }\n\n      handleCData(text, getContext);\n    }\n\n    var uriMap = model.getPackages().reduce(function(uriMap, p) {\n      uriMap[p.uri] = p.prefix;\n\n      return uriMap;\n    }, {\n      'http://www.w3.org/XML/1998/namespace': 'xml' // add default xml ns\n    });\n    parser\n      .ns(uriMap)\n      .on('openTag', function(obj, decodeStr, selfClosing, getContext) {\n\n        // gracefully handle unparsable attributes (attrs=false)\n        var attrs = obj.attrs || {};\n\n        var decodedAttrs = Object.keys(attrs).reduce(function(d, key) {\n          var value = decodeStr(attrs[key]);\n\n          d[key] = value;\n\n          return d;\n        }, {});\n\n        var node = {\n          name: obj.name,\n          originalName: obj.originalName,\n          attributes: decodedAttrs,\n          ns: obj.ns\n        };\n\n        handleOpen(node, getContext);\n      })\n      .on('question', handleQuestion)\n      .on('closeTag', handleClose)\n      .on('cdata', handleCData)\n      .on('text', function(text, decodeEntities, getContext) {\n        handleText(decodeEntities(text), getContext);\n      })\n      .on('error', handleError)\n      .on('warn', handleWarning);\n\n    // async XML parsing to make sure the execution environment\n    // (node or brower) is kept responsive and that certain optimization\n    // strategies can kick in.\n    return new Promise(function(resolve, reject) {\n\n      var err;\n\n      try {\n        parser.parse(xml);\n\n        resolveReferences();\n      } catch (e) {\n        err = e;\n      }\n\n      var rootElement = rootHandler.element;\n\n      if (!err && !rootElement) {\n        err = error$1('failed to parse document as <' + rootHandler.type.$descriptor.name + '>');\n      }\n\n      var warnings = context.warnings;\n      var references = context.references;\n      var elementsById = context.elementsById;\n\n      if (err) {\n        err.warnings = warnings;\n\n        return reject(err);\n      } else {\n        return resolve({\n          rootElement: rootElement,\n          elementsById: elementsById,\n          references: references,\n          warnings: warnings\n        });\n      }\n    });\n  };\n\n  Reader.prototype.handler = function(name) {\n    return new RootElementHandler(this.model, name);\n  };\n\n\n  // helpers //////////////////////////\n\n  function createStack() {\n    var stack = [];\n\n    Object.defineProperty(stack, 'peek', {\n      value: function() {\n        return this[this.length - 1];\n      }\n    });\n\n    return stack;\n  }\n\n  var XML_PREAMBLE = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n';\n\n  var ESCAPE_ATTR_CHARS = /<|>|'|\"|&|\\n\\r|\\n/g;\n  var ESCAPE_CHARS = /<|>|&/g;\n\n\n  function Namespaces(parent) {\n\n    var prefixMap = {};\n    var uriMap = {};\n    var used = {};\n\n    var wellknown = [];\n    var custom = [];\n\n    // API\n\n    this.byUri = function(uri) {\n      return uriMap[uri] || (\n        parent && parent.byUri(uri)\n      );\n    };\n\n    this.add = function(ns, isWellknown) {\n\n      uriMap[ns.uri] = ns;\n\n      if (isWellknown) {\n        wellknown.push(ns);\n      } else {\n        custom.push(ns);\n      }\n\n      this.mapPrefix(ns.prefix, ns.uri);\n    };\n\n    this.uriByPrefix = function(prefix) {\n      return prefixMap[prefix || 'xmlns'];\n    };\n\n    this.mapPrefix = function(prefix, uri) {\n      prefixMap[prefix || 'xmlns'] = uri;\n    };\n\n    this.getNSKey = function(ns) {\n      return (ns.prefix !== undefined) ? (ns.uri + '|' + ns.prefix) : ns.uri;\n    };\n\n    this.logUsed = function(ns) {\n\n      var uri = ns.uri;\n      var nsKey = this.getNSKey(ns);\n\n      used[nsKey] = this.byUri(uri);\n\n      // Inform parent recursively about the usage of this NS\n      if (parent) {\n        parent.logUsed(ns);\n      }\n    };\n\n    this.getUsed = function(ns) {\n\n      function isUsed(ns) {\n        var nsKey = self.getNSKey(ns);\n\n        return used[nsKey];\n      }\n\n      var self = this;\n\n      var allNs = [].concat(wellknown, custom);\n\n      return allNs.filter(isUsed);\n    };\n\n  }\n\n  function lower(string) {\n    return string.charAt(0).toLowerCase() + string.slice(1);\n  }\n\n  function nameToAlias(name, pkg) {\n    if (hasLowerCaseAlias(pkg)) {\n      return lower(name);\n    } else {\n      return name;\n    }\n  }\n\n  function inherits(ctor, superCtor) {\n    ctor.super_ = superCtor;\n    ctor.prototype = Object.create(superCtor.prototype, {\n      constructor: {\n        value: ctor,\n        enumerable: false,\n        writable: true,\n        configurable: true\n      }\n    });\n  }\n\n  function nsName(ns) {\n    if (isString(ns)) {\n      return ns;\n    } else {\n      return (ns.prefix ? ns.prefix + ':' : '') + ns.localName;\n    }\n  }\n\n  function getNsAttrs(namespaces) {\n\n    return namespaces.getUsed().filter(function(ns) {\n\n      // do not serialize built in <xml> namespace\n      return ns.prefix !== 'xml';\n    }).map(function(ns) {\n      var name = 'xmlns' + (ns.prefix ? ':' + ns.prefix : '');\n      return { name: name, value: ns.uri };\n    });\n\n  }\n\n  function getElementNs(ns, descriptor) {\n    if (descriptor.isGeneric) {\n      return assign$1({ localName: descriptor.ns.localName }, ns);\n    } else {\n      return assign$1({ localName: nameToAlias(descriptor.ns.localName, descriptor.$pkg) }, ns);\n    }\n  }\n\n  function getPropertyNs(ns, descriptor) {\n    return assign$1({ localName: descriptor.ns.localName }, ns);\n  }\n\n  function getSerializableProperties(element) {\n    var descriptor = element.$descriptor;\n\n    return filter(descriptor.properties, function(p) {\n      var name = p.name;\n\n      if (p.isVirtual) {\n        return false;\n      }\n\n      // do not serialize defaults\n      if (!has$1(element, name)) {\n        return false;\n      }\n\n      var value = element[name];\n\n      // do not serialize default equals\n      if (value === p.default) {\n        return false;\n      }\n\n      // do not serialize null properties\n      if (value === null) {\n        return false;\n      }\n\n      return p.isMany ? value.length : true;\n    });\n  }\n\n  var ESCAPE_ATTR_MAP = {\n    '\\n': '#10',\n    '\\n\\r': '#10',\n    '\"': '#34',\n    '\\'': '#39',\n    '<': '#60',\n    '>': '#62',\n    '&': '#38'\n  };\n\n  var ESCAPE_MAP = {\n    '<': 'lt',\n    '>': 'gt',\n    '&': 'amp'\n  };\n\n  function escape(str, charPattern, replaceMap) {\n\n    // ensure we are handling strings here\n    str = isString(str) ? str : '' + str;\n\n    return str.replace(charPattern, function(s) {\n      return '&' + replaceMap[s] + ';';\n    });\n  }\n\n  /**\n   * Escape a string attribute to not contain any bad values (line breaks, '\"', ...)\n   *\n   * @param {String} str the string to escape\n   * @return {String} the escaped string\n   */\n  function escapeAttr(str) {\n    return escape(str, ESCAPE_ATTR_CHARS, ESCAPE_ATTR_MAP);\n  }\n\n  function escapeBody(str) {\n    return escape(str, ESCAPE_CHARS, ESCAPE_MAP);\n  }\n\n  function filterAttributes(props) {\n    return filter(props, function(p) { return p.isAttr; });\n  }\n\n  function filterContained(props) {\n    return filter(props, function(p) { return !p.isAttr; });\n  }\n\n\n  function ReferenceSerializer(tagName) {\n    this.tagName = tagName;\n  }\n\n  ReferenceSerializer.prototype.build = function(element) {\n    this.element = element;\n    return this;\n  };\n\n  ReferenceSerializer.prototype.serializeTo = function(writer) {\n    writer\n      .appendIndent()\n      .append('<' + this.tagName + '>' + this.element.id + '</' + this.tagName + '>')\n      .appendNewLine();\n  };\n\n  function BodySerializer() {}\n\n  BodySerializer.prototype.serializeValue =\n  BodySerializer.prototype.serializeTo = function(writer) {\n    writer.append(\n      this.escape\n        ? escapeBody(this.value)\n        : this.value\n    );\n  };\n\n  BodySerializer.prototype.build = function(prop, value) {\n    this.value = value;\n\n    if (prop.type === 'String' && value.search(ESCAPE_CHARS) !== -1) {\n      this.escape = true;\n    }\n\n    return this;\n  };\n\n  function ValueSerializer(tagName) {\n    this.tagName = tagName;\n  }\n\n  inherits(ValueSerializer, BodySerializer);\n\n  ValueSerializer.prototype.serializeTo = function(writer) {\n\n    writer\n      .appendIndent()\n      .append('<' + this.tagName + '>');\n\n    this.serializeValue(writer);\n\n    writer\n      .append('</' + this.tagName + '>')\n      .appendNewLine();\n  };\n\n  function ElementSerializer(parent, propertyDescriptor) {\n    this.body = [];\n    this.attrs = [];\n\n    this.parent = parent;\n    this.propertyDescriptor = propertyDescriptor;\n  }\n\n  ElementSerializer.prototype.build = function(element) {\n    this.element = element;\n\n    var elementDescriptor = element.$descriptor,\n        propertyDescriptor = this.propertyDescriptor;\n\n    var otherAttrs,\n        properties;\n\n    var isGeneric = elementDescriptor.isGeneric;\n\n    if (isGeneric) {\n      otherAttrs = this.parseGeneric(element);\n    } else {\n      otherAttrs = this.parseNsAttributes(element);\n    }\n\n    if (propertyDescriptor) {\n      this.ns = this.nsPropertyTagName(propertyDescriptor);\n    } else {\n      this.ns = this.nsTagName(elementDescriptor);\n    }\n\n    // compute tag name\n    this.tagName = this.addTagName(this.ns);\n\n    if (!isGeneric) {\n      properties = getSerializableProperties(element);\n\n      this.parseAttributes(filterAttributes(properties));\n      this.parseContainments(filterContained(properties));\n    }\n\n    this.parseGenericAttributes(element, otherAttrs);\n\n    return this;\n  };\n\n  ElementSerializer.prototype.nsTagName = function(descriptor) {\n    var effectiveNs = this.logNamespaceUsed(descriptor.ns);\n    return getElementNs(effectiveNs, descriptor);\n  };\n\n  ElementSerializer.prototype.nsPropertyTagName = function(descriptor) {\n    var effectiveNs = this.logNamespaceUsed(descriptor.ns);\n    return getPropertyNs(effectiveNs, descriptor);\n  };\n\n  ElementSerializer.prototype.isLocalNs = function(ns) {\n    return ns.uri === this.ns.uri;\n  };\n\n  /**\n   * Get the actual ns attribute name for the given element.\n   *\n   * @param {Object} element\n   * @param {Boolean} [element.inherited=false]\n   *\n   * @return {Object} nsName\n   */\n  ElementSerializer.prototype.nsAttributeName = function(element) {\n\n    var ns;\n\n    if (isString(element)) {\n      ns = parseName(element);\n    } else {\n      ns = element.ns;\n    }\n\n    // return just local name for inherited attributes\n    if (element.inherited) {\n      return { localName: ns.localName };\n    }\n\n    // parse + log effective ns\n    var effectiveNs = this.logNamespaceUsed(ns);\n\n    // LOG ACTUAL namespace use\n    this.getNamespaces().logUsed(effectiveNs);\n\n    // strip prefix if same namespace like parent\n    if (this.isLocalNs(effectiveNs)) {\n      return { localName: ns.localName };\n    } else {\n      return assign$1({ localName: ns.localName }, effectiveNs);\n    }\n  };\n\n  ElementSerializer.prototype.parseGeneric = function(element) {\n\n    var self = this,\n        body = this.body;\n\n    var attributes = [];\n\n    forEach$1(element, function(val, key) {\n\n      var nonNsAttr;\n\n      if (key === '$body') {\n        body.push(new BodySerializer().build({ type: 'String' }, val));\n      } else\n      if (key === '$children') {\n        forEach$1(val, function(child) {\n          body.push(new ElementSerializer(self).build(child));\n        });\n      } else\n      if (key.indexOf('$') !== 0) {\n        nonNsAttr = self.parseNsAttribute(element, key, val);\n\n        if (nonNsAttr) {\n          attributes.push({ name: key, value: val });\n        }\n      }\n    });\n\n    return attributes;\n  };\n\n  ElementSerializer.prototype.parseNsAttribute = function(element, name, value) {\n    var model = element.$model;\n\n    var nameNs = parseName(name);\n\n    var ns;\n\n    // parse xmlns:foo=\"http://foo.bar\"\n    if (nameNs.prefix === 'xmlns') {\n      ns = { prefix: nameNs.localName, uri: value };\n    }\n\n    // parse xmlns=\"http://foo.bar\"\n    if (!nameNs.prefix && nameNs.localName === 'xmlns') {\n      ns = { uri: value };\n    }\n\n    if (!ns) {\n      return {\n        name: name,\n        value: value\n      };\n    }\n\n    if (model && model.getPackage(value)) {\n\n      // register well known namespace\n      this.logNamespace(ns, true, true);\n    } else {\n\n      // log custom namespace directly as used\n      var actualNs = this.logNamespaceUsed(ns, true);\n\n      this.getNamespaces().logUsed(actualNs);\n    }\n  };\n\n\n  /**\n   * Parse namespaces and return a list of left over generic attributes\n   *\n   * @param  {Object} element\n   * @return {Array<Object>}\n   */\n  ElementSerializer.prototype.parseNsAttributes = function(element, attrs) {\n    var self = this;\n\n    var genericAttrs = element.$attrs;\n\n    var attributes = [];\n\n    // parse namespace attributes first\n    // and log them. push non namespace attributes to a list\n    // and process them later\n    forEach$1(genericAttrs, function(value, name) {\n\n      var nonNsAttr = self.parseNsAttribute(element, name, value);\n\n      if (nonNsAttr) {\n        attributes.push(nonNsAttr);\n      }\n    });\n\n    return attributes;\n  };\n\n  ElementSerializer.prototype.parseGenericAttributes = function(element, attributes) {\n\n    var self = this;\n\n    forEach$1(attributes, function(attr) {\n\n      // do not serialize xsi:type attribute\n      // it is set manually based on the actual implementation type\n      if (attr.name === XSI_TYPE) {\n        return;\n      }\n\n      try {\n        self.addAttribute(self.nsAttributeName(attr.name), attr.value);\n      } catch (e) {\n        /* global console */\n\n        console.warn(\n          'missing namespace information for ',\n          attr.name, '=', attr.value, 'on', element,\n          e);\n      }\n    });\n  };\n\n  ElementSerializer.prototype.parseContainments = function(properties) {\n\n    var self = this,\n        body = this.body,\n        element = this.element;\n\n    forEach$1(properties, function(p) {\n      var value = element.get(p.name),\n          isReference = p.isReference,\n          isMany = p.isMany;\n\n      if (!isMany) {\n        value = [ value ];\n      }\n\n      if (p.isBody) {\n        body.push(new BodySerializer().build(p, value[0]));\n      } else\n      if (isSimple(p.type)) {\n        forEach$1(value, function(v) {\n          body.push(new ValueSerializer(self.addTagName(self.nsPropertyTagName(p))).build(p, v));\n        });\n      } else\n      if (isReference) {\n        forEach$1(value, function(v) {\n          body.push(new ReferenceSerializer(self.addTagName(self.nsPropertyTagName(p))).build(v));\n        });\n      } else {\n\n        // allow serialization via type\n        // rather than element name\n        var asType = serializeAsType(p),\n            asProperty = serializeAsProperty(p);\n\n        forEach$1(value, function(v) {\n          var serializer;\n\n          if (asType) {\n            serializer = new TypeSerializer(self, p);\n          } else\n          if (asProperty) {\n            serializer = new ElementSerializer(self, p);\n          } else {\n            serializer = new ElementSerializer(self);\n          }\n\n          body.push(serializer.build(v));\n        });\n      }\n    });\n  };\n\n  ElementSerializer.prototype.getNamespaces = function(local) {\n\n    var namespaces = this.namespaces,\n        parent = this.parent,\n        parentNamespaces;\n\n    if (!namespaces) {\n      parentNamespaces = parent && parent.getNamespaces();\n\n      if (local || !parentNamespaces) {\n        this.namespaces = namespaces = new Namespaces(parentNamespaces);\n      } else {\n        namespaces = parentNamespaces;\n      }\n    }\n\n    return namespaces;\n  };\n\n  ElementSerializer.prototype.logNamespace = function(ns, wellknown, local) {\n    var namespaces = this.getNamespaces(local);\n\n    var nsUri = ns.uri,\n        nsPrefix = ns.prefix;\n\n    var existing = namespaces.byUri(nsUri);\n\n    if (!existing || local) {\n      namespaces.add(ns, wellknown);\n    }\n\n    namespaces.mapPrefix(nsPrefix, nsUri);\n\n    return ns;\n  };\n\n  ElementSerializer.prototype.logNamespaceUsed = function(ns, local) {\n    var element = this.element,\n        model = element.$model,\n        namespaces = this.getNamespaces(local);\n\n    // ns may be\n    //\n    //   * prefix only\n    //   * prefix:uri\n    //   * localName only\n\n    var prefix = ns.prefix,\n        uri = ns.uri,\n        newPrefix, idx,\n        wellknownUri;\n\n    // handle anonymous namespaces (elementForm=unqualified), cf. #23\n    if (!prefix && !uri) {\n      return { localName: ns.localName };\n    }\n\n    wellknownUri = DEFAULT_NS_MAP[prefix] || model && (model.getPackage(prefix) || {}).uri;\n\n    uri = uri || wellknownUri || namespaces.uriByPrefix(prefix);\n\n    if (!uri) {\n      throw new Error('no namespace uri given for prefix <' + prefix + '>');\n    }\n\n    ns = namespaces.byUri(uri);\n\n    if (!ns) {\n      newPrefix = prefix;\n      idx = 1;\n\n      // find a prefix that is not mapped yet\n      while (namespaces.uriByPrefix(newPrefix)) {\n        newPrefix = prefix + '_' + idx++;\n      }\n\n      ns = this.logNamespace({ prefix: newPrefix, uri: uri }, wellknownUri === uri);\n    }\n\n    if (prefix) {\n      namespaces.mapPrefix(prefix, uri);\n    }\n\n    return ns;\n  };\n\n  ElementSerializer.prototype.parseAttributes = function(properties) {\n    var self = this,\n        element = this.element;\n\n    forEach$1(properties, function(p) {\n\n      var value = element.get(p.name);\n\n      if (p.isReference) {\n\n        if (!p.isMany) {\n          value = value.id;\n        }\n        else {\n          var values = [];\n          forEach$1(value, function(v) {\n            values.push(v.id);\n          });\n\n          // IDREFS is a whitespace-separated list of references.\n          value = values.join(' ');\n        }\n\n      }\n\n      self.addAttribute(self.nsAttributeName(p), value);\n    });\n  };\n\n  ElementSerializer.prototype.addTagName = function(nsTagName) {\n    var actualNs = this.logNamespaceUsed(nsTagName);\n\n    this.getNamespaces().logUsed(actualNs);\n\n    return nsName(nsTagName);\n  };\n\n  ElementSerializer.prototype.addAttribute = function(name, value) {\n    var attrs = this.attrs;\n\n    if (isString(value)) {\n      value = escapeAttr(value);\n    }\n\n    // de-duplicate attributes\n    // https://github.com/bpmn-io/moddle-xml/issues/66\n    var idx = findIndex(attrs, function(element) {\n      return (\n        element.name.localName === name.localName &&\n        element.name.uri === name.uri &&\n        element.name.prefix === name.prefix\n      );\n    });\n\n    var attr = { name: name, value: value };\n\n    if (idx !== -1) {\n      attrs.splice(idx, 1, attr);\n    } else {\n      attrs.push(attr);\n    }\n  };\n\n  ElementSerializer.prototype.serializeAttributes = function(writer) {\n    var attrs = this.attrs,\n        namespaces = this.namespaces;\n\n    if (namespaces) {\n      attrs = getNsAttrs(namespaces).concat(attrs);\n    }\n\n    forEach$1(attrs, function(a) {\n      writer\n        .append(' ')\n        .append(nsName(a.name)).append('=\"').append(a.value).append('\"');\n    });\n  };\n\n  ElementSerializer.prototype.serializeTo = function(writer) {\n    var firstBody = this.body[0],\n        indent = firstBody && firstBody.constructor !== BodySerializer;\n\n    writer\n      .appendIndent()\n      .append('<' + this.tagName);\n\n    this.serializeAttributes(writer);\n\n    writer.append(firstBody ? '>' : ' />');\n\n    if (firstBody) {\n\n      if (indent) {\n        writer\n          .appendNewLine()\n          .indent();\n      }\n\n      forEach$1(this.body, function(b) {\n        b.serializeTo(writer);\n      });\n\n      if (indent) {\n        writer\n          .unindent()\n          .appendIndent();\n      }\n\n      writer.append('</' + this.tagName + '>');\n    }\n\n    writer.appendNewLine();\n  };\n\n  /**\n   * A serializer for types that handles serialization of data types\n   */\n  function TypeSerializer(parent, propertyDescriptor) {\n    ElementSerializer.call(this, parent, propertyDescriptor);\n  }\n\n  inherits(TypeSerializer, ElementSerializer);\n\n  TypeSerializer.prototype.parseNsAttributes = function(element) {\n\n    // extracted attributes\n    var attributes = ElementSerializer.prototype.parseNsAttributes.call(this, element);\n\n    var descriptor = element.$descriptor;\n\n    // only serialize xsi:type if necessary\n    if (descriptor.name === this.propertyDescriptor.type) {\n      return attributes;\n    }\n\n    var typeNs = this.typeNs = this.nsTagName(descriptor);\n    this.getNamespaces().logUsed(this.typeNs);\n\n    // add xsi:type attribute to represent the elements\n    // actual type\n\n    var pkg = element.$model.getPackage(typeNs.uri),\n        typePrefix = (pkg.xml && pkg.xml.typePrefix) || '';\n\n    this.addAttribute(\n      this.nsAttributeName(XSI_TYPE),\n      (typeNs.prefix ? typeNs.prefix + ':' : '') + typePrefix + descriptor.ns.localName\n    );\n\n    return attributes;\n  };\n\n  TypeSerializer.prototype.isLocalNs = function(ns) {\n    return ns.uri === (this.typeNs || this.ns).uri;\n  };\n\n  function SavingWriter() {\n    this.value = '';\n\n    this.write = function(str) {\n      this.value += str;\n    };\n  }\n\n  function FormatingWriter(out, format) {\n\n    var indent = [ '' ];\n\n    this.append = function(str) {\n      out.write(str);\n\n      return this;\n    };\n\n    this.appendNewLine = function() {\n      if (format) {\n        out.write('\\n');\n      }\n\n      return this;\n    };\n\n    this.appendIndent = function() {\n      if (format) {\n        out.write(indent.join('  '));\n      }\n\n      return this;\n    };\n\n    this.indent = function() {\n      indent.push('');\n      return this;\n    };\n\n    this.unindent = function() {\n      indent.pop();\n      return this;\n    };\n  }\n\n  /**\n   * A writer for meta-model backed document trees\n   *\n   * @param {Object} options output options to pass into the writer\n   */\n  function Writer(options) {\n\n    options = assign$1({ format: false, preamble: true }, options || {});\n\n    function toXML(tree, writer) {\n      var internalWriter = writer || new SavingWriter();\n      var formatingWriter = new FormatingWriter(internalWriter, options.format);\n\n      if (options.preamble) {\n        formatingWriter.append(XML_PREAMBLE);\n      }\n\n      new ElementSerializer().build(tree).serializeTo(formatingWriter);\n\n      if (!writer) {\n        return internalWriter.value;\n      }\n    }\n\n    return {\n      toXML: toXML\n    };\n  }\n\n  /**\n   * A sub class of {@link Moddle} with support for import and export of BPMN 2.0 xml files.\n   *\n   * @class BpmnModdle\n   * @extends Moddle\n   *\n   * @param {Object|Array} packages to use for instantiating the model\n   * @param {Object} [options] additional options to pass over\n   */\n  function BpmnModdle(packages, options) {\n    Moddle.call(this, packages, options);\n  }\n\n  BpmnModdle.prototype = Object.create(Moddle.prototype);\n\n  /**\n   * The fromXML result.\n   *\n   * @typedef {Object} ParseResult\n   *\n   * @property {ModdleElement} rootElement\n   * @property {Array<Object>} references\n   * @property {Array<Error>} warnings\n   * @property {Object} elementsById - a mapping containing each ID -> ModdleElement\n   */\n\n  /**\n   * The fromXML error.\n   *\n   * @typedef {Error} ParseError\n   *\n   * @property {Array<Error>} warnings\n   */\n\n  /**\n   * Instantiates a BPMN model tree from a given xml string.\n   *\n   * @param {String}   xmlStr\n   * @param {String}   [typeName='bpmn:Definitions'] name of the root element\n   * @param {Object}   [options]  options to pass to the underlying reader\n   *\n   * @returns {Promise<ParseResult, ParseError>}\n   */\n  BpmnModdle.prototype.fromXML = function(xmlStr, typeName, options) {\n\n    if (!isString(typeName)) {\n      options = typeName;\n      typeName = 'bpmn:Definitions';\n    }\n\n    var reader = new Reader(assign$1({ model: this, lax: true }, options));\n    var rootHandler = reader.handler(typeName);\n\n    return reader.fromXML(xmlStr, rootHandler);\n  };\n\n\n  /**\n   * The toXML result.\n   *\n   * @typedef {Object} SerializationResult\n   *\n   * @property {String} xml\n   */\n\n  /**\n   * Serializes a BPMN 2.0 object tree to XML.\n   *\n   * @param {String}   element    the root element, typically an instance of `bpmn:Definitions`\n   * @param {Object}   [options]  to pass to the underlying writer\n   *\n   * @returns {Promise<SerializationResult, Error>}\n   */\n  BpmnModdle.prototype.toXML = function(element, options) {\n\n    var writer = new Writer(options);\n\n    return new Promise(function(resolve, reject) {\n      try {\n        var result = writer.toXML(element);\n\n        return resolve({\n          xml: result\n        });\n      } catch (err) {\n        return reject(err);\n      }\n    });\n  };\n\n  var name$5 = \"BPMN20\";\n  var uri$5 = \"http://www.omg.org/spec/BPMN/20100524/MODEL\";\n  var prefix$5 = \"bpmn\";\n  var associations$5 = [\n  ];\n  var types$5 = [\n  \t{\n  \t\tname: \"Interface\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"operations\",\n  \t\t\t\ttype: \"Operation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"implementationRef\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Operation\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inMessageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outMessageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"errorRef\",\n  \t\t\t\ttype: \"Error\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"implementationRef\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"EndPoint\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Auditing\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalTask\",\n  \t\tsuperClass: [\n  \t\t\t\"CallableElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"resources\",\n  \t\t\t\ttype: \"ResourceRole\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Monitoring\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Performer\",\n  \t\tsuperClass: [\n  \t\t\t\"ResourceRole\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Process\",\n  \t\tsuperClass: [\n  \t\t\t\"FlowElementsContainer\",\n  \t\t\t\"CallableElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"processType\",\n  \t\t\t\ttype: \"ProcessType\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isClosed\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"auditing\",\n  \t\t\t\ttype: \"Auditing\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"monitoring\",\n  \t\t\t\ttype: \"Monitoring\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"properties\",\n  \t\t\t\ttype: \"Property\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"laneSets\",\n  \t\t\t\tisMany: true,\n  \t\t\t\treplaces: \"FlowElementsContainer#laneSets\",\n  \t\t\t\ttype: \"LaneSet\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"flowElements\",\n  \t\t\t\tisMany: true,\n  \t\t\t\treplaces: \"FlowElementsContainer#flowElements\",\n  \t\t\t\ttype: \"FlowElement\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"artifacts\",\n  \t\t\t\ttype: \"Artifact\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"resources\",\n  \t\t\t\ttype: \"ResourceRole\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"correlationSubscriptions\",\n  \t\t\t\ttype: \"CorrelationSubscription\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"supports\",\n  \t\t\t\ttype: \"Process\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"definitionalCollaborationRef\",\n  \t\t\t\ttype: \"Collaboration\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isExecutable\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"LaneSet\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"lanes\",\n  \t\t\t\ttype: \"Lane\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Lane\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"partitionElementRef\",\n  \t\t\t\ttype: \"BaseElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"partitionElement\",\n  \t\t\t\ttype: \"BaseElement\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"flowNodeRef\",\n  \t\t\t\ttype: \"FlowNode\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"childLaneSet\",\n  \t\t\t\ttype: \"LaneSet\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalManualTask\",\n  \t\tsuperClass: [\n  \t\t\t\"GlobalTask\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ManualTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"UserTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"renderings\",\n  \t\t\t\ttype: \"Rendering\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Rendering\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"HumanPerformer\",\n  \t\tsuperClass: [\n  \t\t\t\"Performer\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"PotentialOwner\",\n  \t\tsuperClass: [\n  \t\t\t\"HumanPerformer\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalUserTask\",\n  \t\tsuperClass: [\n  \t\t\t\"GlobalTask\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"renderings\",\n  \t\t\t\ttype: \"Rendering\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Gateway\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"FlowNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"gatewayDirection\",\n  \t\t\t\ttype: \"GatewayDirection\",\n  \t\t\t\t\"default\": \"Unspecified\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"EventBasedGateway\",\n  \t\tsuperClass: [\n  \t\t\t\"Gateway\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"instantiate\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"eventGatewayType\",\n  \t\t\t\ttype: \"EventBasedGatewayType\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\t\"default\": \"Exclusive\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ComplexGateway\",\n  \t\tsuperClass: [\n  \t\t\t\"Gateway\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"activationCondition\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"default\",\n  \t\t\t\ttype: \"SequenceFlow\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ExclusiveGateway\",\n  \t\tsuperClass: [\n  \t\t\t\"Gateway\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"default\",\n  \t\t\t\ttype: \"SequenceFlow\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"InclusiveGateway\",\n  \t\tsuperClass: [\n  \t\t\t\"Gateway\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"default\",\n  \t\t\t\ttype: \"SequenceFlow\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ParallelGateway\",\n  \t\tsuperClass: [\n  \t\t\t\"Gateway\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"RootElement\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Relationship\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"type\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"direction\",\n  \t\t\t\ttype: \"RelationshipDirection\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"source\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"Element\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"target\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"Element\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BaseElement\",\n  \t\tisAbstract: true,\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"id\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\",\n  \t\t\t\tisId: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"documentation\",\n  \t\t\t\ttype: \"Documentation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extensionDefinitions\",\n  \t\t\t\ttype: \"ExtensionDefinition\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extensionElements\",\n  \t\t\t\ttype: \"ExtensionElements\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Extension\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"mustUnderstand\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"definition\",\n  \t\t\t\ttype: \"ExtensionDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ExtensionDefinition\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extensionAttributeDefinitions\",\n  \t\t\t\ttype: \"ExtensionAttributeDefinition\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ExtensionAttributeDefinition\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"type\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isReference\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extensionDefinition\",\n  \t\t\t\ttype: \"ExtensionDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ExtensionElements\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"valueRef\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"Element\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"values\",\n  \t\t\t\ttype: \"Element\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extensionAttributeDefinition\",\n  \t\t\t\ttype: \"ExtensionAttributeDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Documentation\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"text\",\n  \t\t\t\ttype: \"String\",\n  \t\t\t\tisBody: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"textFormat\",\n  \t\t\t\t\"default\": \"text/plain\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Event\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"FlowNode\",\n  \t\t\t\"InteractionNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"properties\",\n  \t\t\t\ttype: \"Property\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"IntermediateCatchEvent\",\n  \t\tsuperClass: [\n  \t\t\t\"CatchEvent\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"IntermediateThrowEvent\",\n  \t\tsuperClass: [\n  \t\t\t\"ThrowEvent\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"EndEvent\",\n  \t\tsuperClass: [\n  \t\t\t\"ThrowEvent\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"StartEvent\",\n  \t\tsuperClass: [\n  \t\t\t\"CatchEvent\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"isInterrupting\",\n  \t\t\t\t\"default\": true,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ThrowEvent\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Event\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"dataInputs\",\n  \t\t\t\ttype: \"DataInput\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataInputAssociations\",\n  \t\t\t\ttype: \"DataInputAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputSet\",\n  \t\t\t\ttype: \"InputSet\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"eventDefinitions\",\n  \t\t\t\ttype: \"EventDefinition\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"eventDefinitionRef\",\n  \t\t\t\ttype: \"EventDefinition\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CatchEvent\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Event\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"parallelMultiple\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\",\n  \t\t\t\t\"default\": false\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataOutputs\",\n  \t\t\t\ttype: \"DataOutput\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataOutputAssociations\",\n  \t\t\t\ttype: \"DataOutputAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputSet\",\n  \t\t\t\ttype: \"OutputSet\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"eventDefinitions\",\n  \t\t\t\ttype: \"EventDefinition\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"eventDefinitionRef\",\n  \t\t\t\ttype: \"EventDefinition\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BoundaryEvent\",\n  \t\tsuperClass: [\n  \t\t\t\"CatchEvent\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"cancelActivity\",\n  \t\t\t\t\"default\": true,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"attachedToRef\",\n  \t\t\t\ttype: \"Activity\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"EventDefinition\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CancelEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ErrorEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"errorRef\",\n  \t\t\t\ttype: \"Error\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"TerminateEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"EscalationEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"escalationRef\",\n  \t\t\t\ttype: \"Escalation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Escalation\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"structureRef\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"escalationCode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CompensateEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"waitForCompletion\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\",\n  \t\t\t\t\"default\": true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"activityRef\",\n  \t\t\t\ttype: \"Activity\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"TimerEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"timeDate\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"timeCycle\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"timeDuration\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"LinkEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"target\",\n  \t\t\t\ttype: \"LinkEventDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"source\",\n  \t\t\t\ttype: \"LinkEventDefinition\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"MessageEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"messageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"operationRef\",\n  \t\t\t\ttype: \"Operation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ConditionalEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"condition\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"SignalEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"signalRef\",\n  \t\t\t\ttype: \"Signal\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Signal\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"structureRef\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ImplicitThrowEvent\",\n  \t\tsuperClass: [\n  \t\t\t\"ThrowEvent\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataState\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ItemAwareElement\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"itemSubjectRef\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataState\",\n  \t\t\t\ttype: \"DataState\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataAssociation\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"sourceRef\",\n  \t\t\t\ttype: \"ItemAwareElement\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetRef\",\n  \t\t\t\ttype: \"ItemAwareElement\",\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"transformation\",\n  \t\t\t\ttype: \"FormalExpression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"property\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"assignment\",\n  \t\t\t\ttype: \"Assignment\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataInput\",\n  \t\tsuperClass: [\n  \t\t\t\"ItemAwareElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isCollection\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputSetRef\",\n  \t\t\t\ttype: \"InputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputSetWithOptional\",\n  \t\t\t\ttype: \"InputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputSetWithWhileExecuting\",\n  \t\t\t\ttype: \"InputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataOutput\",\n  \t\tsuperClass: [\n  \t\t\t\"ItemAwareElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isCollection\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputSetRef\",\n  \t\t\t\ttype: \"OutputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputSetWithOptional\",\n  \t\t\t\ttype: \"OutputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputSetWithWhileExecuting\",\n  \t\t\t\ttype: \"OutputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"InputSet\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataInputRefs\",\n  \t\t\t\ttype: \"DataInput\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"optionalInputRefs\",\n  \t\t\t\ttype: \"DataInput\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"whileExecutingInputRefs\",\n  \t\t\t\ttype: \"DataInput\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputSetRefs\",\n  \t\t\t\ttype: \"OutputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"OutputSet\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"dataOutputRefs\",\n  \t\t\t\ttype: \"DataOutput\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputSetRefs\",\n  \t\t\t\ttype: \"InputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"optionalOutputRefs\",\n  \t\t\t\ttype: \"DataOutput\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"whileExecutingOutputRefs\",\n  \t\t\t\ttype: \"DataOutput\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Property\",\n  \t\tsuperClass: [\n  \t\t\t\"ItemAwareElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataInputAssociation\",\n  \t\tsuperClass: [\n  \t\t\t\"DataAssociation\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataOutputAssociation\",\n  \t\tsuperClass: [\n  \t\t\t\"DataAssociation\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"InputOutputSpecification\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"dataInputs\",\n  \t\t\t\ttype: \"DataInput\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataOutputs\",\n  \t\t\t\ttype: \"DataOutput\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputSets\",\n  \t\t\t\ttype: \"InputSet\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputSets\",\n  \t\t\t\ttype: \"OutputSet\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataObject\",\n  \t\tsuperClass: [\n  \t\t\t\"FlowElement\",\n  \t\t\t\"ItemAwareElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"isCollection\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"InputOutputBinding\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"inputDataRef\",\n  \t\t\t\ttype: \"InputSet\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputDataRef\",\n  \t\t\t\ttype: \"OutputSet\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"operationRef\",\n  \t\t\t\ttype: \"Operation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Assignment\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"from\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"to\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataStore\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\",\n  \t\t\t\"ItemAwareElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"capacity\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Integer\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isUnlimited\",\n  \t\t\t\t\"default\": true,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataStoreReference\",\n  \t\tsuperClass: [\n  \t\t\t\"ItemAwareElement\",\n  \t\t\t\"FlowElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"dataStoreRef\",\n  \t\t\t\ttype: \"DataStore\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataObjectReference\",\n  \t\tsuperClass: [\n  \t\t\t\"ItemAwareElement\",\n  \t\t\t\"FlowElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"dataObjectRef\",\n  \t\t\t\ttype: \"DataObject\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ConversationLink\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"sourceRef\",\n  \t\t\t\ttype: \"InteractionNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetRef\",\n  \t\t\t\ttype: \"InteractionNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ConversationAssociation\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"innerConversationNodeRef\",\n  \t\t\t\ttype: \"ConversationNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outerConversationNodeRef\",\n  \t\t\t\ttype: \"ConversationNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CallConversation\",\n  \t\tsuperClass: [\n  \t\t\t\"ConversationNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"calledCollaborationRef\",\n  \t\t\t\ttype: \"Collaboration\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantAssociations\",\n  \t\t\t\ttype: \"ParticipantAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Conversation\",\n  \t\tsuperClass: [\n  \t\t\t\"ConversationNode\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"SubConversation\",\n  \t\tsuperClass: [\n  \t\t\t\"ConversationNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"conversationNodes\",\n  \t\t\t\ttype: \"ConversationNode\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ConversationNode\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"InteractionNode\",\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageFlowRefs\",\n  \t\t\t\ttype: \"MessageFlow\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"correlationKeys\",\n  \t\t\t\ttype: \"CorrelationKey\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalConversation\",\n  \t\tsuperClass: [\n  \t\t\t\"Collaboration\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"PartnerEntity\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"PartnerRole\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CorrelationProperty\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"correlationPropertyRetrievalExpression\",\n  \t\t\t\ttype: \"CorrelationPropertyRetrievalExpression\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"type\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Error\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"structureRef\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"errorCode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CorrelationKey\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"correlationPropertyRef\",\n  \t\t\t\ttype: \"CorrelationProperty\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Expression\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tisAbstract: false,\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"body\",\n  \t\t\t\tisBody: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"FormalExpression\",\n  \t\tsuperClass: [\n  \t\t\t\"Expression\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"language\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"evaluatesToTypeRef\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Message\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"itemRef\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ItemDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"itemKind\",\n  \t\t\t\ttype: \"ItemKind\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"structureRef\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isCollection\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"import\",\n  \t\t\t\ttype: \"Import\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"FlowElement\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"auditing\",\n  \t\t\t\ttype: \"Auditing\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"monitoring\",\n  \t\t\t\ttype: \"Monitoring\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"categoryValueRef\",\n  \t\t\t\ttype: \"CategoryValue\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"SequenceFlow\",\n  \t\tsuperClass: [\n  \t\t\t\"FlowElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"isImmediate\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"conditionExpression\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"sourceRef\",\n  \t\t\t\ttype: \"FlowNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetRef\",\n  \t\t\t\ttype: \"FlowNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"FlowElementsContainer\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"laneSets\",\n  \t\t\t\ttype: \"LaneSet\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"flowElements\",\n  \t\t\t\ttype: \"FlowElement\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CallableElement\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"ioSpecification\",\n  \t\t\t\ttype: \"InputOutputSpecification\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"property\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"supportedInterfaceRef\",\n  \t\t\t\ttype: \"Interface\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"ioBinding\",\n  \t\t\t\ttype: \"InputOutputBinding\",\n  \t\t\t\tisMany: true,\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"property\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"FlowNode\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"FlowElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"incoming\",\n  \t\t\t\ttype: \"SequenceFlow\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outgoing\",\n  \t\t\t\ttype: \"SequenceFlow\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"lanes\",\n  \t\t\t\ttype: \"Lane\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CorrelationPropertyRetrievalExpression\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"messagePath\",\n  \t\t\t\ttype: \"FormalExpression\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CorrelationPropertyBinding\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"dataPath\",\n  \t\t\t\ttype: \"FormalExpression\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"correlationPropertyRef\",\n  \t\t\t\ttype: \"CorrelationProperty\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Resource\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"resourceParameters\",\n  \t\t\t\ttype: \"ResourceParameter\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ResourceParameter\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isRequired\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"type\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CorrelationSubscription\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"correlationKeyRef\",\n  \t\t\t\ttype: \"CorrelationKey\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"correlationPropertyBinding\",\n  \t\t\t\ttype: \"CorrelationPropertyBinding\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"MessageFlow\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"sourceRef\",\n  \t\t\t\ttype: \"InteractionNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetRef\",\n  \t\t\t\ttype: \"InteractionNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"MessageFlowAssociation\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"innerMessageFlowRef\",\n  \t\t\t\ttype: \"MessageFlow\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outerMessageFlowRef\",\n  \t\t\t\ttype: \"MessageFlow\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"InteractionNode\",\n  \t\tisAbstract: true,\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"incomingConversationLinks\",\n  \t\t\t\ttype: \"ConversationLink\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outgoingConversationLinks\",\n  \t\t\t\ttype: \"ConversationLink\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Participant\",\n  \t\tsuperClass: [\n  \t\t\t\"InteractionNode\",\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"interfaceRef\",\n  \t\t\t\ttype: \"Interface\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantMultiplicity\",\n  \t\t\t\ttype: \"ParticipantMultiplicity\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"endPointRefs\",\n  \t\t\t\ttype: \"EndPoint\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"processRef\",\n  \t\t\t\ttype: \"Process\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ParticipantAssociation\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"innerParticipantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outerParticipantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ParticipantMultiplicity\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"minimum\",\n  \t\t\t\t\"default\": 0,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Integer\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"maximum\",\n  \t\t\t\t\"default\": 1,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Integer\"\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Collaboration\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isClosed\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participants\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageFlows\",\n  \t\t\t\ttype: \"MessageFlow\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"artifacts\",\n  \t\t\t\ttype: \"Artifact\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"conversations\",\n  \t\t\t\ttype: \"ConversationNode\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"conversationAssociations\",\n  \t\t\t\ttype: \"ConversationAssociation\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantAssociations\",\n  \t\t\t\ttype: \"ParticipantAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageFlowAssociations\",\n  \t\t\t\ttype: \"MessageFlowAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"correlationKeys\",\n  \t\t\t\ttype: \"CorrelationKey\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"choreographyRef\",\n  \t\t\t\ttype: \"Choreography\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"conversationLinks\",\n  \t\t\t\ttype: \"ConversationLink\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ChoreographyActivity\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"FlowNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"participantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"initiatingParticipantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"correlationKeys\",\n  \t\t\t\ttype: \"CorrelationKey\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopType\",\n  \t\t\t\ttype: \"ChoreographyLoopType\",\n  \t\t\t\t\"default\": \"None\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CallChoreography\",\n  \t\tsuperClass: [\n  \t\t\t\"ChoreographyActivity\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"calledChoreographyRef\",\n  \t\t\t\ttype: \"Choreography\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantAssociations\",\n  \t\t\t\ttype: \"ParticipantAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"SubChoreography\",\n  \t\tsuperClass: [\n  \t\t\t\"ChoreographyActivity\",\n  \t\t\t\"FlowElementsContainer\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"artifacts\",\n  \t\t\t\ttype: \"Artifact\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ChoreographyTask\",\n  \t\tsuperClass: [\n  \t\t\t\"ChoreographyActivity\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"messageFlowRef\",\n  \t\t\t\ttype: \"MessageFlow\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Choreography\",\n  \t\tsuperClass: [\n  \t\t\t\"Collaboration\",\n  \t\t\t\"FlowElementsContainer\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalChoreographyTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Choreography\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"initiatingParticipantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"TextAnnotation\",\n  \t\tsuperClass: [\n  \t\t\t\"Artifact\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"text\",\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"textFormat\",\n  \t\t\t\t\"default\": \"text/plain\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Group\",\n  \t\tsuperClass: [\n  \t\t\t\"Artifact\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"categoryValueRef\",\n  \t\t\t\ttype: \"CategoryValue\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Association\",\n  \t\tsuperClass: [\n  \t\t\t\"Artifact\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"associationDirection\",\n  \t\t\t\ttype: \"AssociationDirection\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"sourceRef\",\n  \t\t\t\ttype: \"BaseElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetRef\",\n  \t\t\t\ttype: \"BaseElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Category\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"categoryValue\",\n  \t\t\t\ttype: \"CategoryValue\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Artifact\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CategoryValue\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"categorizedFlowElements\",\n  \t\t\t\ttype: \"FlowElement\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"value\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Activity\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"FlowNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"isForCompensation\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"default\",\n  \t\t\t\ttype: \"SequenceFlow\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"ioSpecification\",\n  \t\t\t\ttype: \"InputOutputSpecification\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"property\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"boundaryEventRefs\",\n  \t\t\t\ttype: \"BoundaryEvent\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"properties\",\n  \t\t\t\ttype: \"Property\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataInputAssociations\",\n  \t\t\t\ttype: \"DataInputAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataOutputAssociations\",\n  \t\t\t\ttype: \"DataOutputAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"startQuantity\",\n  \t\t\t\t\"default\": 1,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Integer\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"resources\",\n  \t\t\t\ttype: \"ResourceRole\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"completionQuantity\",\n  \t\t\t\t\"default\": 1,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Integer\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopCharacteristics\",\n  \t\t\t\ttype: \"LoopCharacteristics\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ServiceTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"operationRef\",\n  \t\t\t\ttype: \"Operation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"SubProcess\",\n  \t\tsuperClass: [\n  \t\t\t\"Activity\",\n  \t\t\t\"FlowElementsContainer\",\n  \t\t\t\"InteractionNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"triggeredByEvent\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"artifacts\",\n  \t\t\t\ttype: \"Artifact\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"LoopCharacteristics\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"MultiInstanceLoopCharacteristics\",\n  \t\tsuperClass: [\n  \t\t\t\"LoopCharacteristics\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"isSequential\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"behavior\",\n  \t\t\t\ttype: \"MultiInstanceBehavior\",\n  \t\t\t\t\"default\": \"All\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopCardinality\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopDataInputRef\",\n  \t\t\t\ttype: \"ItemAwareElement\",\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopDataOutputRef\",\n  \t\t\t\ttype: \"ItemAwareElement\",\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputDataItem\",\n  \t\t\t\ttype: \"DataInput\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"property\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputDataItem\",\n  \t\t\t\ttype: \"DataOutput\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"property\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"complexBehaviorDefinition\",\n  \t\t\t\ttype: \"ComplexBehaviorDefinition\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"completionCondition\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"oneBehaviorEventRef\",\n  \t\t\t\ttype: \"EventDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"noneBehaviorEventRef\",\n  \t\t\t\ttype: \"EventDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"StandardLoopCharacteristics\",\n  \t\tsuperClass: [\n  \t\t\t\"LoopCharacteristics\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"testBefore\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopCondition\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopMaximum\",\n  \t\t\t\ttype: \"Integer\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CallActivity\",\n  \t\tsuperClass: [\n  \t\t\t\"Activity\",\n  \t\t\t\"InteractionNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"calledElement\",\n  \t\t\t\ttype: \"String\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Task\",\n  \t\tsuperClass: [\n  \t\t\t\"Activity\",\n  \t\t\t\"InteractionNode\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"SendTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"operationRef\",\n  \t\t\t\ttype: \"Operation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ReceiveTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"instantiate\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"operationRef\",\n  \t\t\t\ttype: \"Operation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ScriptTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"scriptFormat\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"script\",\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BusinessRuleTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"AdHocSubProcess\",\n  \t\tsuperClass: [\n  \t\t\t\"SubProcess\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"completionCondition\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"ordering\",\n  \t\t\t\ttype: \"AdHocOrdering\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"cancelRemainingInstances\",\n  \t\t\t\t\"default\": true,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Transaction\",\n  \t\tsuperClass: [\n  \t\t\t\"SubProcess\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"protocol\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"method\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalScriptTask\",\n  \t\tsuperClass: [\n  \t\t\t\"GlobalTask\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"scriptLanguage\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"script\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalBusinessRuleTask\",\n  \t\tsuperClass: [\n  \t\t\t\"GlobalTask\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ComplexBehaviorDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"condition\",\n  \t\t\t\ttype: \"FormalExpression\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"event\",\n  \t\t\t\ttype: \"ImplicitThrowEvent\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ResourceRole\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"resourceRef\",\n  \t\t\t\ttype: \"Resource\",\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"resourceParameterBindings\",\n  \t\t\t\ttype: \"ResourceParameterBinding\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"resourceAssignmentExpression\",\n  \t\t\t\ttype: \"ResourceAssignmentExpression\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ResourceParameterBinding\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"expression\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"parameterRef\",\n  \t\t\t\ttype: \"ResourceParameter\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ResourceAssignmentExpression\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"expression\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Import\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"importType\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"location\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"namespace\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Definitions\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetNamespace\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"expressionLanguage\",\n  \t\t\t\t\"default\": \"http://www.w3.org/1999/XPath\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"typeLanguage\",\n  \t\t\t\t\"default\": \"http://www.w3.org/2001/XMLSchema\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"imports\",\n  \t\t\t\ttype: \"Import\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extensions\",\n  \t\t\t\ttype: \"Extension\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"rootElements\",\n  \t\t\t\ttype: \"RootElement\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"diagrams\",\n  \t\t\t\tisMany: true,\n  \t\t\t\ttype: \"bpmndi:BPMNDiagram\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"exporter\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"relationships\",\n  \t\t\t\ttype: \"Relationship\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"exporterVersion\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var enumerations$3 = [\n  \t{\n  \t\tname: \"ProcessType\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"None\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Public\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Private\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GatewayDirection\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"Unspecified\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Converging\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Diverging\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Mixed\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"EventBasedGatewayType\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"Parallel\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Exclusive\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"RelationshipDirection\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"None\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Forward\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Backward\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Both\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ItemKind\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"Physical\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Information\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ChoreographyLoopType\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"None\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Standard\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"MultiInstanceSequential\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"MultiInstanceParallel\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"AssociationDirection\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"None\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"One\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Both\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"MultiInstanceBehavior\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"None\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"One\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"All\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Complex\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"AdHocOrdering\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"Parallel\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Sequential\"\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var xml$1 = {\n  \ttagAlias: \"lowerCase\",\n  \ttypePrefix: \"t\"\n  };\n  var BpmnPackage = {\n  \tname: name$5,\n  \turi: uri$5,\n  \tprefix: prefix$5,\n  \tassociations: associations$5,\n  \ttypes: types$5,\n  \tenumerations: enumerations$3,\n  \txml: xml$1\n  };\n\n  var name$4 = \"BPMNDI\";\n  var uri$4 = \"http://www.omg.org/spec/BPMN/20100524/DI\";\n  var prefix$4 = \"bpmndi\";\n  var types$4 = [\n  \t{\n  \t\tname: \"BPMNDiagram\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"plane\",\n  \t\t\t\ttype: \"BPMNPlane\",\n  \t\t\t\tredefines: \"di:Diagram#rootElement\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"labelStyle\",\n  \t\t\t\ttype: \"BPMNLabelStyle\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"di:Diagram\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BPMNPlane\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"bpmnElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"bpmn:BaseElement\",\n  \t\t\t\tredefines: \"di:DiagramElement#modelElement\"\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"di:Plane\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BPMNShape\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"bpmnElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"bpmn:BaseElement\",\n  \t\t\t\tredefines: \"di:DiagramElement#modelElement\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isHorizontal\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isExpanded\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isMarkerVisible\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"label\",\n  \t\t\t\ttype: \"BPMNLabel\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isMessageVisible\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantBandKind\",\n  \t\t\t\ttype: \"ParticipantBandKind\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"choreographyActivityShape\",\n  \t\t\t\ttype: \"BPMNShape\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"di:LabeledShape\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BPMNEdge\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"label\",\n  \t\t\t\ttype: \"BPMNLabel\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"bpmnElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"bpmn:BaseElement\",\n  \t\t\t\tredefines: \"di:DiagramElement#modelElement\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"sourceElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"di:DiagramElement\",\n  \t\t\t\tredefines: \"di:Edge#source\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"di:DiagramElement\",\n  \t\t\t\tredefines: \"di:Edge#target\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageVisibleKind\",\n  \t\t\t\ttype: \"MessageVisibleKind\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\t\"default\": \"initiating\"\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"di:LabeledEdge\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BPMNLabel\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"labelStyle\",\n  \t\t\t\ttype: \"BPMNLabelStyle\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\tredefines: \"di:DiagramElement#style\"\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"di:Label\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BPMNLabelStyle\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"font\",\n  \t\t\t\ttype: \"dc:Font\"\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"di:Style\"\n  \t\t]\n  \t}\n  ];\n  var enumerations$2 = [\n  \t{\n  \t\tname: \"ParticipantBandKind\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"top_initiating\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"middle_initiating\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"bottom_initiating\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"top_non_initiating\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"middle_non_initiating\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"bottom_non_initiating\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"MessageVisibleKind\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"initiating\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"non_initiating\"\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var associations$4 = [\n  ];\n  var BpmnDiPackage = {\n  \tname: name$4,\n  \turi: uri$4,\n  \tprefix: prefix$4,\n  \ttypes: types$4,\n  \tenumerations: enumerations$2,\n  \tassociations: associations$4\n  };\n\n  var name$3 = \"DC\";\n  var uri$3 = \"http://www.omg.org/spec/DD/20100524/DC\";\n  var prefix$3 = \"dc\";\n  var types$3 = [\n  \t{\n  \t\tname: \"Boolean\"\n  \t},\n  \t{\n  \t\tname: \"Integer\"\n  \t},\n  \t{\n  \t\tname: \"Real\"\n  \t},\n  \t{\n  \t\tname: \"String\"\n  \t},\n  \t{\n  \t\tname: \"Font\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\ttype: \"String\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"size\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isBold\",\n  \t\t\t\ttype: \"Boolean\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isItalic\",\n  \t\t\t\ttype: \"Boolean\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isUnderline\",\n  \t\t\t\ttype: \"Boolean\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isStrikeThrough\",\n  \t\t\t\ttype: \"Boolean\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Point\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"x\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\t\"default\": \"0\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"y\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\t\"default\": \"0\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Bounds\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"x\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\t\"default\": \"0\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"y\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\t\"default\": \"0\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"width\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"height\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var associations$3 = [\n  ];\n  var DcPackage = {\n  \tname: name$3,\n  \turi: uri$3,\n  \tprefix: prefix$3,\n  \ttypes: types$3,\n  \tassociations: associations$3\n  };\n\n  var name$2 = \"DI\";\n  var uri$2 = \"http://www.omg.org/spec/DD/20100524/DI\";\n  var prefix$2 = \"di\";\n  var types$2 = [\n  \t{\n  \t\tname: \"DiagramElement\",\n  \t\tisAbstract: true,\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"id\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisId: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extension\",\n  \t\t\t\ttype: \"Extension\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"owningDiagram\",\n  \t\t\t\ttype: \"Diagram\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"owningElement\",\n  \t\t\t\ttype: \"DiagramElement\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"modelElement\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"Element\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"style\",\n  \t\t\t\ttype: \"Style\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"ownedElement\",\n  \t\t\t\ttype: \"DiagramElement\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Node\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"DiagramElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Edge\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"DiagramElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"source\",\n  \t\t\t\ttype: \"DiagramElement\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"target\",\n  \t\t\t\ttype: \"DiagramElement\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"waypoint\",\n  \t\t\t\tisUnique: false,\n  \t\t\t\tisMany: true,\n  \t\t\t\ttype: \"dc:Point\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Diagram\",\n  \t\tisAbstract: true,\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"id\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisId: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"rootElement\",\n  \t\t\t\ttype: \"DiagramElement\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"documentation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"resolution\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Real\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"ownedStyle\",\n  \t\t\t\ttype: \"Style\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Shape\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Node\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"bounds\",\n  \t\t\t\ttype: \"dc:Bounds\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Plane\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Node\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"planeElement\",\n  \t\t\t\ttype: \"DiagramElement\",\n  \t\t\t\tsubsettedProperty: \"DiagramElement-ownedElement\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"LabeledEdge\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Edge\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"ownedLabel\",\n  \t\t\t\ttype: \"Label\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tsubsettedProperty: \"DiagramElement-ownedElement\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"LabeledShape\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Shape\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"ownedLabel\",\n  \t\t\t\ttype: \"Label\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tsubsettedProperty: \"DiagramElement-ownedElement\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Label\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Node\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"bounds\",\n  \t\t\t\ttype: \"dc:Bounds\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Style\",\n  \t\tisAbstract: true,\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"id\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisId: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Extension\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"values\",\n  \t\t\t\tisMany: true,\n  \t\t\t\ttype: \"Element\"\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var associations$2 = [\n  ];\n  var xml = {\n  \ttagAlias: \"lowerCase\"\n  };\n  var DiPackage = {\n  \tname: name$2,\n  \turi: uri$2,\n  \tprefix: prefix$2,\n  \ttypes: types$2,\n  \tassociations: associations$2,\n  \txml: xml\n  };\n\n  var name$1 = \"bpmn.io colors for BPMN\";\n  var uri$1 = \"http://bpmn.io/schema/bpmn/biocolor/1.0\";\n  var prefix$1 = \"bioc\";\n  var types$1 = [\n  \t{\n  \t\tname: \"ColoredShape\",\n  \t\t\"extends\": [\n  \t\t\t\"bpmndi:BPMNShape\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"stroke\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"fill\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ColoredEdge\",\n  \t\t\"extends\": [\n  \t\t\t\"bpmndi:BPMNEdge\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"stroke\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"fill\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var enumerations$1 = [\n  ];\n  var associations$1 = [\n  ];\n  var BiocPackage = {\n  \tname: name$1,\n  \turi: uri$1,\n  \tprefix: prefix$1,\n  \ttypes: types$1,\n  \tenumerations: enumerations$1,\n  \tassociations: associations$1\n  };\n\n  var name = \"BPMN in Color\";\n  var uri = \"http://www.omg.org/spec/BPMN/non-normative/color/1.0\";\n  var prefix = \"color\";\n  var types = [\n  \t{\n  \t\tname: \"ColoredLabel\",\n  \t\t\"extends\": [\n  \t\t\t\"bpmndi:BPMNLabel\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"color\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ColoredShape\",\n  \t\t\"extends\": [\n  \t\t\t\"bpmndi:BPMNShape\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"background-color\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"border-color\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ColoredEdge\",\n  \t\t\"extends\": [\n  \t\t\t\"bpmndi:BPMNEdge\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"border-color\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var enumerations = [\n  ];\n  var associations = [\n  ];\n  var BpmnInColorPackage = {\n  \tname: name,\n  \turi: uri,\n  \tprefix: prefix,\n  \ttypes: types,\n  \tenumerations: enumerations,\n  \tassociations: associations\n  };\n\n  var packages = {\n    bpmn: BpmnPackage,\n    bpmndi: BpmnDiPackage,\n    dc: DcPackage,\n    di: DiPackage,\n    bioc: BiocPackage,\n    color: BpmnInColorPackage\n  };\n\n  function simple(additionalPackages, options) {\n    var pks = assign$1({}, packages, additionalPackages);\n\n    return new BpmnModdle(pks, options);\n  }\n\n  function elementToString(e) {\n    if (!e) {\n      return '<null>';\n    }\n\n    return '<' + e.$type + (e.id ? ' id=\"' + e.id : '') + '\" />';\n  }\n\n  /**\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   */\n\n  // TODO(nikku): remove with future bpmn-js version\n\n  /**\n   * Wraps APIs to check:\n   *\n   * 1) If a callback is passed -> Warn users about callback deprecation.\n   * 2) If Promise class is implemented in current environment.\n   *\n   * @private\n   *\n   * @param {Function} api\n   *\n   * @return {Function}\n   */\n  function wrapForCompatibility(api) {\n\n    return function() {\n\n      if (!window.Promise) {\n        throw new Error('Promises is not supported in this environment. Please polyfill Promise.');\n      }\n\n      var argLen = arguments.length;\n      if (argLen >= 1 && isFunction(arguments[argLen - 1])) {\n\n        var callback = arguments[argLen - 1];\n\n        console.warn(new Error(\n          'Passing callbacks to ' + api.name + ' is deprecated and will be removed in a future major release. ' +\n          'Please switch to promises: https://bpmn.io/l/moving-to-promises.html'\n        ));\n\n        var argsWithoutCallback = Array.prototype.slice.call(arguments, 0, -1);\n\n        api.apply(this, argsWithoutCallback).then(function(result) {\n\n          var firstKey = Object.keys(result)[0];\n\n          // The APIs we are wrapping all resolve a single item depending on the API.\n          // For instance, importXML resolves { warnings } and saveXML returns { xml }.\n          // That's why we can call the callback with the first item of result.\n          return callback(null, result[firstKey]);\n\n          // Passing a second paramter instead of catch because we don't want to\n          // catch errors thrown by callback().\n        }, function(err) {\n\n          return callback(err, err.warnings);\n        });\n      } else {\n\n        return api.apply(this, arguments);\n      }\n    };\n  }\n\n\n  // TODO(nikku): remove with future bpmn-js version\n\n  var DI_ERROR_MESSAGE = 'Tried to access di from the businessObject. The di is available through the diagram element only. For more information, see https://github.com/bpmn-io/bpmn-js/issues/1472';\n\n  /**\n   * @private\n   *\n   * @param {ModdleElement} businessObject\n   */\n  function ensureCompatDiRef(businessObject) {\n\n    // bpmnElement can have multiple independent DIs\n    if (!has$1(businessObject, 'di')) {\n      Object.defineProperty(businessObject, 'di', {\n        enumerable: false,\n        get: function() {\n          throw new Error(DI_ERROR_MESSAGE);\n        }\n      });\n    }\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n   *\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   */\n\n  /**\n   * Returns true if an element is of the given meta-model type.\n   *\n   * @param {ModdleElement} element\n   * @param {string} type\n   *\n   * @return {boolean}\n   */\n  function is$2(element, type) {\n    return element.$instanceOf(type);\n  }\n\n\n  /**\n   * Find a suitable display candidate for definitions where the DI does not\n   * correctly specify one.\n   *\n   * @param {ModdleElement} definitions\n   *\n   * @return {ModdleElement}\n   */\n  function findDisplayCandidate(definitions) {\n    return find(definitions.rootElements, function(e) {\n      return is$2(e, 'bpmn:Process') || is$2(e, 'bpmn:Collaboration');\n    });\n  }\n\n  /**\n   * @param {Record<'element' | 'root' | 'error', Function>} handler\n   * @param {Translate} translate\n   */\n  function BpmnTreeWalker(handler, translate) {\n\n    // list of containers already walked\n    var handledElements = {};\n\n    // list of elements to handle deferred to ensure\n    // prerequisites are drawn\n    var deferred = [];\n\n    var diMap = {};\n\n    // Helpers //////////////////////\n\n    function contextual(fn, ctx) {\n      return function(e) {\n        fn(e, ctx);\n      };\n    }\n\n    function handled(element) {\n      handledElements[element.id] = element;\n    }\n\n    function isHandled(element) {\n      return handledElements[element.id];\n    }\n\n    function visit(element, ctx) {\n\n      var gfx = element.gfx;\n\n      // avoid multiple rendering of elements\n      if (gfx) {\n        throw new Error(\n          translate('already rendered {element}', { element: elementToString(element) })\n        );\n      }\n\n      // call handler\n      return handler.element(element, diMap[element.id], ctx);\n    }\n\n    function visitRoot(element, diagram) {\n      return handler.root(element, diMap[element.id], diagram);\n    }\n\n    function visitIfDi(element, ctx) {\n\n      try {\n        var gfx = diMap[element.id] && visit(element, ctx);\n\n        handled(element);\n\n        return gfx;\n      } catch (e) {\n        logError(e.message, { element: element, error: e });\n\n        console.error(translate('failed to import {element}', { element: elementToString(element) }));\n        console.error(e);\n      }\n    }\n\n    function logError(message, context) {\n      handler.error(message, context);\n    }\n\n    // DI handling //////////////////////\n\n    var registerDi = this.registerDi = function registerDi(di) {\n      var bpmnElement = di.bpmnElement;\n\n      if (bpmnElement) {\n        if (diMap[bpmnElement.id]) {\n          logError(\n            translate('multiple DI elements defined for {element}', {\n              element: elementToString(bpmnElement)\n            }),\n            { element: bpmnElement }\n          );\n        } else {\n          diMap[bpmnElement.id] = di;\n\n          ensureCompatDiRef(bpmnElement);\n        }\n      } else {\n        logError(\n          translate('no bpmnElement referenced in {element}', {\n            element: elementToString(di)\n          }),\n          { element: di }\n        );\n      }\n    };\n\n    function handleDiagram(diagram) {\n      handlePlane(diagram.plane);\n    }\n\n    function handlePlane(plane) {\n      registerDi(plane);\n\n      forEach$1(plane.planeElement, handlePlaneElement);\n    }\n\n    function handlePlaneElement(planeElement) {\n      registerDi(planeElement);\n    }\n\n\n    // Semantic handling //////////////////////\n\n    /**\n     * Handle definitions and return the rendered diagram (if any).\n     *\n     * @param {ModdleElement} definitions to walk and import\n     * @param {ModdleElement} [diagram] specific diagram to import and display\n     *\n     * @throws {Error} if no diagram to display could be found\n     */\n    this.handleDefinitions = function handleDefinitions(definitions, diagram) {\n\n      // make sure we walk the correct bpmnElement\n\n      var diagrams = definitions.diagrams;\n\n      if (diagram && diagrams.indexOf(diagram) === -1) {\n        throw new Error(translate('diagram not part of bpmn:Definitions'));\n      }\n\n      if (!diagram && diagrams && diagrams.length) {\n        diagram = diagrams[0];\n      }\n\n      // no diagram -> nothing to import\n      if (!diagram) {\n        throw new Error(translate('no diagram to display'));\n      }\n\n      // load DI from selected diagram only\n      diMap = {};\n      handleDiagram(diagram);\n\n\n      var plane = diagram.plane;\n\n      if (!plane) {\n        throw new Error(translate(\n          'no plane for {element}',\n          { element: elementToString(diagram) }\n        ));\n      }\n\n      var rootElement = plane.bpmnElement;\n\n      // ensure we default to a suitable display candidate (process or collaboration),\n      // even if non is specified in DI\n      if (!rootElement) {\n        rootElement = findDisplayCandidate(definitions);\n\n        if (!rootElement) {\n          throw new Error(translate('no process or collaboration to display'));\n        } else {\n\n          logError(\n            translate('correcting missing bpmnElement on {plane} to {rootElement}', {\n              plane: elementToString(plane),\n              rootElement: elementToString(rootElement)\n            })\n          );\n\n          // correct DI on the fly\n          plane.bpmnElement = rootElement;\n          registerDi(plane);\n        }\n      }\n\n\n      var ctx = visitRoot(rootElement, plane);\n\n      if (is$2(rootElement, 'bpmn:Process') || is$2(rootElement, 'bpmn:SubProcess')) {\n        handleProcess(rootElement, ctx);\n      } else if (is$2(rootElement, 'bpmn:Collaboration')) {\n        handleCollaboration(rootElement, ctx);\n\n        // force drawing of everything not yet drawn that is part of the target DI\n        handleUnhandledProcesses(definitions.rootElements, ctx);\n      } else {\n        throw new Error(\n          translate('unsupported bpmnElement for {plane}: {rootElement}', {\n            plane: elementToString(plane),\n            rootElement: elementToString(rootElement)\n          })\n        );\n      }\n\n      // handle all deferred elements\n      handleDeferred(deferred);\n    };\n\n    var handleDeferred = this.handleDeferred = function handleDeferred() {\n\n      var fn;\n\n      // drain deferred until empty\n      while (deferred.length) {\n        fn = deferred.shift();\n\n        fn();\n      }\n    };\n\n    function handleProcess(process, context) {\n      handleFlowElementsContainer(process, context);\n      handleIoSpecification(process.ioSpecification, context);\n\n      handleArtifacts(process.artifacts, context);\n\n      // log process handled\n      handled(process);\n    }\n\n    function handleUnhandledProcesses(rootElements, ctx) {\n\n      // walk through all processes that have not yet been drawn and draw them\n      // if they contain lanes with DI information.\n      // we do this to pass the free-floating lane test cases in the MIWG test suite\n      var processes = filter(rootElements, function(e) {\n        return !isHandled(e) && is$2(e, 'bpmn:Process') && e.laneSets;\n      });\n\n      processes.forEach(contextual(handleProcess, ctx));\n    }\n\n    function handleMessageFlow(messageFlow, context) {\n      visitIfDi(messageFlow, context);\n    }\n\n    function handleMessageFlows(messageFlows, context) {\n      forEach$1(messageFlows, contextual(handleMessageFlow, context));\n    }\n\n    function handleDataAssociation(association, context) {\n      visitIfDi(association, context);\n    }\n\n    function handleDataInput(dataInput, context) {\n      visitIfDi(dataInput, context);\n    }\n\n    function handleDataOutput(dataOutput, context) {\n      visitIfDi(dataOutput, context);\n    }\n\n    function handleArtifact(artifact, context) {\n\n      // bpmn:TextAnnotation\n      // bpmn:Group\n      // bpmn:Association\n\n      visitIfDi(artifact, context);\n    }\n\n    function handleArtifacts(artifacts, context) {\n\n      forEach$1(artifacts, function(e) {\n        if (is$2(e, 'bpmn:Association')) {\n          deferred.push(function() {\n            handleArtifact(e, context);\n          });\n        } else {\n          handleArtifact(e, context);\n        }\n      });\n    }\n\n    function handleIoSpecification(ioSpecification, context) {\n\n      if (!ioSpecification) {\n        return;\n      }\n\n      forEach$1(ioSpecification.dataInputs, contextual(handleDataInput, context));\n      forEach$1(ioSpecification.dataOutputs, contextual(handleDataOutput, context));\n    }\n\n    var handleSubProcess = this.handleSubProcess = function handleSubProcess(subProcess, context) {\n      handleFlowElementsContainer(subProcess, context);\n      handleArtifacts(subProcess.artifacts, context);\n    };\n\n    function handleFlowNode(flowNode, context) {\n      var childCtx = visitIfDi(flowNode, context);\n\n      if (is$2(flowNode, 'bpmn:SubProcess')) {\n        handleSubProcess(flowNode, childCtx || context);\n      }\n\n      if (is$2(flowNode, 'bpmn:Activity')) {\n        handleIoSpecification(flowNode.ioSpecification, context);\n      }\n\n      // defer handling of associations\n      // affected types:\n      //\n      //   * bpmn:Activity\n      //   * bpmn:ThrowEvent\n      //   * bpmn:CatchEvent\n      //\n      deferred.push(function() {\n        forEach$1(flowNode.dataInputAssociations, contextual(handleDataAssociation, context));\n        forEach$1(flowNode.dataOutputAssociations, contextual(handleDataAssociation, context));\n      });\n    }\n\n    function handleSequenceFlow(sequenceFlow, context) {\n      visitIfDi(sequenceFlow, context);\n    }\n\n    function handleDataElement(dataObject, context) {\n      visitIfDi(dataObject, context);\n    }\n\n    function handleLane(lane, context) {\n\n      deferred.push(function() {\n\n        var newContext = visitIfDi(lane, context);\n\n        if (lane.childLaneSet) {\n          handleLaneSet(lane.childLaneSet, newContext || context);\n        }\n\n        wireFlowNodeRefs(lane);\n      });\n    }\n\n    function handleLaneSet(laneSet, context) {\n      forEach$1(laneSet.lanes, contextual(handleLane, context));\n    }\n\n    function handleLaneSets(laneSets, context) {\n      forEach$1(laneSets, contextual(handleLaneSet, context));\n    }\n\n    function handleFlowElementsContainer(container, context) {\n      handleFlowElements(container.flowElements, context);\n\n      if (container.laneSets) {\n        handleLaneSets(container.laneSets, context);\n      }\n    }\n\n    function handleFlowElements(flowElements, context) {\n      forEach$1(flowElements, function(e) {\n        if (is$2(e, 'bpmn:SequenceFlow')) {\n          deferred.push(function() {\n            handleSequenceFlow(e, context);\n          });\n        } else if (is$2(e, 'bpmn:BoundaryEvent')) {\n          deferred.unshift(function() {\n            handleFlowNode(e, context);\n          });\n        } else if (is$2(e, 'bpmn:FlowNode')) {\n          handleFlowNode(e, context);\n        } else if (is$2(e, 'bpmn:DataObject')) ; else if (is$2(e, 'bpmn:DataStoreReference')) {\n          handleDataElement(e, context);\n        } else if (is$2(e, 'bpmn:DataObjectReference')) {\n          handleDataElement(e, context);\n        } else {\n          logError(\n            translate('unrecognized flowElement {element} in context {context}', {\n              element: elementToString(e),\n              context: (context ? elementToString(context.businessObject) : 'null')\n            }),\n            { element: e, context: context }\n          );\n        }\n      });\n    }\n\n    function handleParticipant(participant, context) {\n      var newCtx = visitIfDi(participant, context);\n\n      var process = participant.processRef;\n      if (process) {\n        handleProcess(process, newCtx || context);\n      }\n    }\n\n    function handleCollaboration(collaboration, context) {\n\n      forEach$1(collaboration.participants, contextual(handleParticipant, context));\n\n      handleArtifacts(collaboration.artifacts, context);\n\n      // handle message flows latest in the process\n      deferred.push(function() {\n        handleMessageFlows(collaboration.messageFlows, context);\n      });\n    }\n\n\n    function wireFlowNodeRefs(lane) {\n\n      // wire the virtual flowNodeRefs <-> relationship\n      forEach$1(lane.flowNodeRef, function(flowNode) {\n        var lanes = flowNode.get('lanes');\n\n        if (lanes) {\n          lanes.push(lane);\n        }\n      });\n    }\n  }\n\n  /**\n   * @typedef { import('../model/Types').Element } Element\n   * @typedef { import('../model/Types').ModdleElement } ModdleElement\n   */\n\n  /**\n   * Is an element of the given BPMN type?\n   *\n   * @param  {Element|ModdleElement} element\n   * @param  {string} type\n   *\n   * @return {boolean}\n   */\n  function is$1(element, type) {\n    var bo = getBusinessObject(element);\n\n    return bo && (typeof bo.$instanceOf === 'function') && bo.$instanceOf(type);\n  }\n\n\n  /**\n   * Return true if element has any of the given types.\n   *\n   * @param {Element|ModdleElement} element\n   * @param {string[]} types\n   *\n   * @return {boolean}\n   */\n  function isAny(element, types) {\n    return some(types, function(t) {\n      return is$1(element, t);\n    });\n  }\n\n  /**\n   * Return the business object for a given element.\n   *\n   * @param {Element|ModdleElement} element\n   *\n   * @return {ModdleElement}\n   */\n  function getBusinessObject(element) {\n    return (element && element.businessObject) || element;\n  }\n\n  /**\n   * Return the di object for a given element.\n   *\n   * @param {Element} element\n   *\n   * @return {ModdleElement}\n   */\n  function getDi(element) {\n    return element && element.di;\n  }\n\n  /**\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   *\n   * @typedef { {\n   *   warnings: string[];\n   * } } ImportBPMNDiagramResult\n   *\n   * @typedef {ImportBPMNDiagramResult & Error} ImportBPMNDiagramError\n   */\n\n  /**\n   * Import the definitions into a diagram.\n   *\n   * Errors and warnings are reported through the specified callback.\n   *\n   * @param {ModdleElement} diagram\n   * @param {ModdleElement} definitions\n   * @param {ModdleElement} [bpmnDiagram] The diagram to be rendered (if not\n   * provided, the first one will be rendered).\n   *\n   * @return {Promise<ImportBPMNDiagramResult>}\n   */\n  function importBpmnDiagram(diagram, definitions, bpmnDiagram) {\n\n    var importer,\n        eventBus,\n        translate,\n        canvas;\n\n    var error,\n        warnings = [];\n\n    /**\n     * Walk the diagram semantically, importing (=drawing)\n     * all elements you encounter.\n     *\n     * @param {ModdleElement} definitions\n     * @param {ModdleElement} bpmnDiagram\n     */\n    function render(definitions, bpmnDiagram) {\n\n      var visitor = {\n\n        root: function(element, di) {\n          return importer.add(element, di);\n        },\n\n        element: function(element, di, parentShape) {\n          return importer.add(element, di, parentShape);\n        },\n\n        error: function(message, context) {\n          warnings.push({ message: message, context: context });\n        }\n      };\n\n      var walker = new BpmnTreeWalker(visitor, translate);\n\n\n      bpmnDiagram = bpmnDiagram || (definitions.diagrams && definitions.diagrams[0]);\n\n      var diagramsToImport = getDiagramsToImport(definitions, bpmnDiagram);\n\n      if (!diagramsToImport) {\n        throw new Error(translate('no diagram to display'));\n      }\n\n      // traverse BPMN 2.0 document model,\n      // starting at definitions\n      forEach$1(diagramsToImport, function(diagram) {\n        walker.handleDefinitions(definitions, diagram);\n      });\n\n      var rootId = bpmnDiagram.plane.bpmnElement.id;\n\n      // we do need to account for different ways we create root elements\n      // each nested imported <root> do have the `_plane` suffix, while\n      // the root <root> is found under the business object ID\n      canvas.setRootElement(\n        canvas.findRoot(rootId + '_plane') || canvas.findRoot(rootId)\n      );\n    }\n\n    return new Promise(function(resolve, reject) {\n      try {\n        importer = diagram.get('bpmnImporter');\n        eventBus = diagram.get('eventBus');\n        translate = diagram.get('translate');\n        canvas = diagram.get('canvas');\n\n        eventBus.fire('import.render.start', { definitions: definitions });\n\n        render(definitions, bpmnDiagram);\n\n        eventBus.fire('import.render.complete', {\n          error: error,\n          warnings: warnings\n        });\n\n        return resolve({ warnings: warnings });\n      } catch (e) {\n\n        e.warnings = warnings;\n        return reject(e);\n      }\n    });\n  }\n\n  /**\n   * Returns all diagrams in the same hierarchy as the requested diagram.\n   * Includes all parent and sub process diagrams.\n   *\n   * @param {ModdleElement} definitions\n   * @param {ModdleElement} bpmnDiagram\n   *\n   * @return {ModdleElement[]}\n   */\n  function getDiagramsToImport(definitions, bpmnDiagram) {\n    if (!bpmnDiagram) {\n      return;\n    }\n\n    var bpmnElement = bpmnDiagram.plane.bpmnElement,\n        rootElement = bpmnElement;\n\n    if (!is$1(bpmnElement, 'bpmn:Process') && !is$1(bpmnElement, 'bpmn:Collaboration')) {\n      rootElement = findRootProcess(bpmnElement);\n    }\n\n    // in case the process is part of a collaboration, the plane references the\n    // collaboration, not the process\n    var collaboration;\n\n    if (is$1(rootElement, 'bpmn:Collaboration')) {\n      collaboration = rootElement;\n    } else {\n      collaboration = find(definitions.rootElements, function(element) {\n        if (!is$1(element, 'bpmn:Collaboration')) {\n          return;\n        }\n\n        return find(element.participants, function(participant) {\n          return participant.processRef === rootElement;\n        });\n      });\n    }\n\n    var rootElements = [ rootElement ];\n\n    // all collaboration processes can contain sub-diagrams\n    if (collaboration) {\n      rootElements = map$1(collaboration.participants, function(participant) {\n        return participant.processRef;\n      });\n\n      rootElements.push(collaboration);\n    }\n\n    var allChildren = selfAndAllFlowElements(rootElements);\n\n    // if we have multiple diagrams referencing the same element, we\n    // use the first in the file\n    var diagramsToImport = [ bpmnDiagram ];\n    var handledElements = [ bpmnElement ];\n\n    forEach$1(definitions.diagrams, function(diagram) {\n      var businessObject = diagram.plane.bpmnElement;\n\n      if (\n        allChildren.indexOf(businessObject) !== -1 &&\n        handledElements.indexOf(businessObject) === -1\n      ) {\n        diagramsToImport.push(diagram);\n        handledElements.push(businessObject);\n      }\n    });\n\n\n    return diagramsToImport;\n  }\n\n  function selfAndAllFlowElements(elements) {\n    var result = [];\n\n    forEach$1(elements, function(element) {\n      if (!element) {\n        return;\n      }\n\n      result.push(element);\n\n      result = result.concat(selfAndAllFlowElements(element.flowElements));\n    });\n\n    return result;\n  }\n\n  function findRootProcess(element) {\n    var parent = element;\n\n    while (parent) {\n      if (is$1(parent, 'bpmn:Process')) {\n        return parent;\n      }\n\n      parent = parent.$parent;\n    }\n  }\n\n  /**\n   * This file must not be changed or exchanged.\n   *\n   * @see http://bpmn.io/license for more information.\n   */\n\n\n  // inlined ../../resources/logo.svg\n  var BPMNIO_LOGO_SVG = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 14.02 5.57\" width=\"53\" height=\"21\"><path fill=\"currentColor\" d=\"M1.88.92v.14c0 .41-.13.68-.4.8.33.14.46.44.46.86v.33c0 .61-.33.95-.95.95H0V0h.95c.65 0 .93.3.93.92zM.63.57v1.06h.24c.24 0 .38-.1.38-.43V.98c0-.28-.1-.4-.32-.4zm0 1.63v1.22h.36c.2 0 .32-.1.32-.39v-.35c0-.37-.12-.48-.4-.48H.63zM4.18.99v.52c0 .64-.31.98-.94.98h-.3V4h-.62V0h.92c.63 0 .94.35.94.99zM2.94.57v1.35h.3c.2 0 .3-.09.3-.37v-.6c0-.29-.1-.38-.3-.38h-.3zm2.89 2.27L6.25 0h.88v4h-.6V1.12L6.1 3.99h-.6l-.46-2.82v2.82h-.55V0h.87zM8.14 1.1V4h-.56V0h.79L9 2.4V0h.56v4h-.64zm2.49 2.29v.6h-.6v-.6zM12.12 1c0-.63.33-1 .95-1 .61 0 .95.37.95 1v2.04c0 .64-.34 1-.95 1-.62 0-.95-.37-.95-1zm.62 2.08c0 .28.13.39.33.39s.32-.1.32-.4V.98c0-.29-.12-.4-.32-.4s-.33.11-.33.4z\"/><path fill=\"currentColor\" d=\"M0 4.53h14.02v1.04H0zM11.08 0h.63v.62h-.63zm.63 4V1h-.63v2.98z\"/></svg>';\n\n  var BPMNIO_IMG = BPMNIO_LOGO_SVG;\n\n  var LOGO_STYLES = {\n    verticalAlign: 'middle'\n  };\n\n  var LINK_STYLES = {\n    'color': '#404040'\n  };\n\n  var LIGHTBOX_STYLES = {\n    'zIndex': '1001',\n    'position': 'fixed',\n    'top': '0',\n    'left': '0',\n    'right': '0',\n    'bottom': '0'\n  };\n\n  var BACKDROP_STYLES = {\n    'width': '100%',\n    'height': '100%',\n    'background': 'rgba(40,40,40,0.2)'\n  };\n\n  var NOTICE_STYLES = {\n    'position': 'absolute',\n    'left': '50%',\n    'top': '40%',\n    'transform': 'translate(-50%)',\n    'width': '260px',\n    'padding': '10px',\n    'background': 'white',\n    'boxShadow': '0 1px 4px rgba(0,0,0,0.3)',\n    'fontFamily': 'Helvetica, Arial, sans-serif',\n    'fontSize': '14px',\n    'display': 'flex',\n    'lineHeight': '1.3'\n  };\n\n  var LIGHTBOX_MARKUP =\n    '<div class=\"bjs-powered-by-lightbox\">' +\n      '<div class=\"backdrop\"></div>' +\n      '<div class=\"notice\">' +\n        '<a href=\"https://bpmn.io\" target=\"_blank\" rel=\"noopener\" class=\"link\">' +\n          BPMNIO_IMG +\n        '</a>' +\n        '<span>' +\n          'Web-based tooling for BPMN, DMN and forms ' +\n          'powered by <a href=\"https://bpmn.io\" target=\"_blank\" rel=\"noopener\">bpmn.io</a>.' +\n        '</span>' +\n      '</div>' +\n    '</div>';\n\n\n  var lightbox;\n\n  function createLightbox() {\n    lightbox = domify$1(LIGHTBOX_MARKUP);\n\n    assign(lightbox, LIGHTBOX_STYLES);\n    assign(query('svg', lightbox), LOGO_STYLES);\n    assign(query('.backdrop', lightbox), BACKDROP_STYLES);\n    assign(query('.notice', lightbox), NOTICE_STYLES);\n    assign(query('.link', lightbox), LINK_STYLES, {\n      'margin': '15px 20px 15px 10px',\n      'alignSelf': 'center'\n    });\n  }\n\n  function open() {\n\n    if (!lightbox) {\n      createLightbox();\n\n      delegate.bind(lightbox, '.backdrop', 'click', function(event) {\n        document.body.removeChild(lightbox);\n      });\n    }\n\n    document.body.appendChild(lightbox);\n  }\n\n  /**\n   * The code in the <project-logo></project-logo> area\n   * must not be changed.\n   *\n   * @see http://bpmn.io/license for more information.\n   */\n\n  /**\n   * @template T\n   *\n   * @typedef {import('diagram-js/lib/core/EventBus').EventBusEventCallback<T>} EventBusEventCallback\n   */\n\n  /**\n   * @typedef {import('didi').ModuleDeclaration} ModuleDeclaration\n   *\n   * @typedef {import('./model/Types').Moddle} Moddle\n   * @typedef {import('./model/Types').ModdleElement} ModdleElement\n   * @typedef {import('./model/Types').ModdleExtension} ModdleExtension\n   *\n   * @typedef { {\n   *   width?: number|string;\n   *   height?: number|string;\n   *   position?: string;\n   *   container?: string|HTMLElement;\n   *   moddleExtensions?: ModdleExtensions;\n   *   additionalModules?: ModuleDeclaration[];\n   * } & Record<string, any> } BaseViewerOptions\n   *\n   * @typedef {Record<string, ModdleElement>} ModdleElementsById\n   *\n   * @typedef { {\n   *   [key: string]: ModdleExtension;\n   * } } ModdleExtensions\n   *\n   * @typedef { {\n   *   warnings: string[];\n   * } } ImportXMLResult\n   *\n   * @typedef {ImportXMLResult & Error} ImportXMLError\n   *\n   * @typedef {ImportXMLResult} ImportDefinitionsResult\n   *\n   * @typedef {ImportXMLError} ImportDefinitionsError\n   *\n   * @typedef {ImportXMLResult} OpenResult\n   *\n   * @typedef {ImportXMLError} OpenError\n   *\n   * @typedef { {\n   *   format?: boolean;\n   *   preamble?: boolean;\n   * } } SaveXMLOptions\n   *\n   * @typedef { {\n   *   xml?: string;\n   *   error?: Error;\n   * } } SaveXMLResult\n   *\n   * @typedef { {\n   *   svg: string;\n   * } } SaveSVGResult\n   *\n   * @typedef { {\n   *   xml: string;\n   * } } ImportParseStartEvent\n   *\n   * @typedef { {\n   *   error?: ImportXMLError;\n   *   definitions?: ModdleElement;\n   *   elementsById?: ModdleElementsById;\n   *   references?: ModdleElement[];\n   *   warnings: string[];\n   * } } ImportParseCompleteEvent\n   *\n   * @typedef { {\n   *   error?: ImportXMLError;\n   *   warnings: string[];\n   * } } ImportDoneEvent\n   *\n   * @typedef { {\n   *   definitions: ModdleElement;\n   * } } SaveXMLStartEvent\n   *\n   * @typedef {SaveXMLResult} SaveXMLDoneEvent\n   *\n   * @typedef { {\n   *   error?: Error;\n   *   svg: string;\n   * } } SaveSVGDoneEvent\n   */\n\n  /**\n   * A base viewer for BPMN 2.0 diagrams.\n   *\n   * Have a look at {@link Viewer}, {@link NavigatedViewer} or {@link Modeler} for\n   * bundles that include actual features.\n   *\n   * @param {BaseViewerOptions} [options] The options to configure the viewer.\n   */\n  function BaseViewer(options) {\n\n    /**\n     * @type {BaseViewerOptions}\n     */\n    options = assign$1({}, DEFAULT_OPTIONS, options);\n\n    /**\n     * @type {Moddle}\n     */\n    this._moddle = this._createModdle(options);\n\n    /**\n     * @type {HTMLElement}\n     */\n    this._container = this._createContainer(options);\n\n    /* <project-logo> */\n\n    addProjectLogo(this._container);\n\n    /* </project-logo> */\n\n    this._init(this._container, this._moddle, options);\n  }\n\n  e$3(BaseViewer, Diagram);\n\n  /**\n   * Parse and render a BPMN 2.0 diagram.\n   *\n   * Once finished the viewer reports back the result to the\n   * provided callback function with (err, warnings).\n   *\n   * ## Life-Cycle Events\n   *\n   * During import the viewer will fire life-cycle events:\n   *\n   *   * import.parse.start (about to read model from XML)\n   *   * import.parse.complete (model read; may have worked or not)\n   *   * import.render.start (graphical import start)\n   *   * import.render.complete (graphical import finished)\n   *   * import.done (everything done)\n   *\n   * You can use these events to hook into the life-cycle.\n   *\n   * @throws {ImportXMLError} An error thrown during the import of the XML.\n   *\n   * @fires BaseViewer#ImportParseStartEvent\n   * @fires BaseViewer#ImportParseCompleteEvent\n   * @fires Importer#ImportRenderStartEvent\n   * @fires Importer#ImportRenderCompleteEvent\n   * @fires BaseViewer#ImportDoneEvent\n   *\n   * @param {string} xml The BPMN 2.0 XML to be imported.\n   * @param {ModdleElement|string} [bpmnDiagram] The optional diagram or Id of the BPMN diagram to open.\n   *\n   * @return {Promise<ImportXMLResult>} A promise resolving with warnings that were produced during the import.\n   */\n  BaseViewer.prototype.importXML = async function importXML(xml, bpmnDiagram) {\n\n    const self = this;\n\n    function ParseCompleteEvent(data) {\n\n      const event = self.get('eventBus').createEvent(data);\n\n      // TODO(nikku): remove with future bpmn-js version\n      Object.defineProperty(event, 'context', {\n        enumerable: true,\n        get: function() {\n\n          console.warn(new Error(\n            'import.parse.complete <context> is deprecated ' +\n            'and will be removed in future library versions'\n          ));\n\n          return {\n            warnings: data.warnings,\n            references: data.references,\n            elementsById: data.elementsById\n          };\n        }\n      });\n\n      return event;\n    }\n\n    let aggregatedWarnings = [];\n    try {\n\n      // hook in pre-parse listeners +\n      // allow xml manipulation\n\n      /**\n       * A `import.parse.start` event.\n       *\n       * @event BaseViewer#ImportParseStartEvent\n       * @type {ImportParseStartEvent}\n       */\n      xml = this._emit('import.parse.start', { xml: xml }) || xml;\n\n      let parseResult;\n      try {\n        parseResult = await this._moddle.fromXML(xml, 'bpmn:Definitions');\n      } catch (error) {\n        this._emit('import.parse.complete', {\n          error\n        });\n\n        throw error;\n      }\n\n      let definitions = parseResult.rootElement;\n      const references = parseResult.references;\n      const parseWarnings = parseResult.warnings;\n      const elementsById = parseResult.elementsById;\n\n      aggregatedWarnings = aggregatedWarnings.concat(parseWarnings);\n\n      // hook in post parse listeners +\n      // allow definitions manipulation\n\n      /**\n       * A `import.parse.complete` event.\n       *\n       * @event BaseViewer#ImportParseCompleteEvent\n       * @type {ImportParseCompleteEvent}\n       */\n      definitions = this._emit('import.parse.complete', ParseCompleteEvent({\n        error: null,\n        definitions: definitions,\n        elementsById: elementsById,\n        references: references,\n        warnings: aggregatedWarnings\n      })) || definitions;\n\n      const importResult = await this.importDefinitions(definitions, bpmnDiagram);\n\n      aggregatedWarnings = aggregatedWarnings.concat(importResult.warnings);\n\n      /**\n       * A `import.parse.complete` event.\n       *\n       * @event BaseViewer#ImportDoneEvent\n       * @type {ImportDoneEvent}\n       */\n      this._emit('import.done', { error: null, warnings: aggregatedWarnings });\n\n      return { warnings: aggregatedWarnings };\n    } catch (err) {\n      let error = err;\n      aggregatedWarnings = aggregatedWarnings.concat(error.warnings || []);\n      addWarningsToError(error, aggregatedWarnings);\n\n      error = checkValidationError(error);\n\n      this._emit('import.done', { error, warnings: error.warnings });\n\n      throw error;\n    }\n  };\n\n  BaseViewer.prototype.importXML = wrapForCompatibility(BaseViewer.prototype.importXML);\n\n\n  /**\n   * Import parsed definitions and render a BPMN 2.0 diagram.\n   *\n   * Once finished the viewer reports back the result to the\n   * provided callback function with (err, warnings).\n   *\n   * ## Life-Cycle Events\n   *\n   * During import the viewer will fire life-cycle events:\n   *\n   *   * import.render.start (graphical import start)\n   *   * import.render.complete (graphical import finished)\n   *\n   * You can use these events to hook into the life-cycle.\n   *\n   * @throws {ImportDefinitionsError} An error thrown during the import of the definitions.\n   *\n   * @param {ModdleElement} definitions The definitions.\n   * @param {ModdleElement|string} [bpmnDiagram] The optional diagram or ID of the BPMN diagram to open.\n   *\n   * @return {Promise<ImportDefinitionsResult>} A promise resolving with warnings that were produced during the import.\n   */\n  BaseViewer.prototype.importDefinitions = async function importDefinitions(definitions, bpmnDiagram) {\n    this._setDefinitions(definitions);\n    const result = await this.open(bpmnDiagram);\n\n    return { warnings: result.warnings };\n  };\n\n  BaseViewer.prototype.importDefinitions = wrapForCompatibility(BaseViewer.prototype.importDefinitions);\n\n\n  /**\n   * Open diagram of previously imported XML.\n   *\n   * Once finished the viewer reports back the result to the\n   * provided callback function with (err, warnings).\n   *\n   * ## Life-Cycle Events\n   *\n   * During switch the viewer will fire life-cycle events:\n   *\n   *   * import.render.start (graphical import start)\n   *   * import.render.complete (graphical import finished)\n   *\n   * You can use these events to hook into the life-cycle.\n   *\n   * @throws {OpenError} An error thrown during opening.\n   *\n   * @param {ModdleElement|string} bpmnDiagramOrId The diagram or Id of the BPMN diagram to open.\n   *\n   * @return {Promise<OpenResult>} A promise resolving with warnings that were produced during opening.\n   */\n  BaseViewer.prototype.open = async function open(bpmnDiagramOrId) {\n\n    const definitions = this._definitions;\n    let bpmnDiagram = bpmnDiagramOrId;\n\n    if (!definitions) {\n      const error = new Error('no XML imported');\n      addWarningsToError(error, []);\n\n      throw error;\n    }\n\n    if (typeof bpmnDiagramOrId === 'string') {\n      bpmnDiagram = findBPMNDiagram(definitions, bpmnDiagramOrId);\n\n      if (!bpmnDiagram) {\n        const error = new Error('BPMNDiagram <' + bpmnDiagramOrId + '> not found');\n        addWarningsToError(error, []);\n\n        throw error;\n      }\n    }\n\n    // clear existing rendered diagram\n    // catch synchronous exceptions during #clear()\n    try {\n      this.clear();\n    } catch (error) {\n      addWarningsToError(error, []);\n\n      throw error;\n    }\n\n    // perform graphical import\n    const { warnings } = await importBpmnDiagram(this, definitions, bpmnDiagram);\n\n    return { warnings };\n  };\n\n  BaseViewer.prototype.open = wrapForCompatibility(BaseViewer.prototype.open);\n\n  /**\n   * Export the currently displayed BPMN 2.0 diagram as\n   * a BPMN 2.0 XML document.\n   *\n   * ## Life-Cycle Events\n   *\n   * During XML saving the viewer will fire life-cycle events:\n   *\n   *   * saveXML.start (before serialization)\n   *   * saveXML.serialized (after xml generation)\n   *   * saveXML.done (everything done)\n   *\n   * You can use these events to hook into the life-cycle.\n   *\n   * @throws {Error} An error thrown during export.\n   *\n   * @fires BaseViewer#SaveXMLStart\n   * @fires BaseViewer#SaveXMLDone\n   *\n   * @param {SaveXMLOptions} [options] The options.\n   *\n   * @return {Promise<SaveXMLResult>} A promise resolving with the XML.\n   */\n  BaseViewer.prototype.saveXML = async function saveXML(options) {\n\n    options = options || {};\n\n    let definitions = this._definitions,\n        error, xml;\n\n    try {\n      if (!definitions) {\n        throw new Error('no definitions loaded');\n      }\n\n      // allow to fiddle around with definitions\n\n      /**\n       * A `saveXML.start` event.\n       *\n       * @event BaseViewer#SaveXMLStartEvent\n       * @type {SaveXMLStartEvent}\n       */\n      definitions = this._emit('saveXML.start', {\n        definitions\n      }) || definitions;\n\n      const result = await this._moddle.toXML(definitions, options);\n      xml = result.xml;\n\n      xml = this._emit('saveXML.serialized', {\n        xml\n      }) || xml;\n    } catch (err) {\n      error = err;\n    }\n\n    const result = error ? { error } : { xml };\n\n    /**\n     * A `saveXML.done` event.\n     *\n     * @event BaseViewer#SaveXMLDoneEvent\n     * @type {SaveXMLDoneEvent}\n     */\n    this._emit('saveXML.done', result);\n\n    if (error) {\n      throw error;\n    }\n\n    return result;\n  };\n\n  BaseViewer.prototype.saveXML = wrapForCompatibility(BaseViewer.prototype.saveXML);\n\n\n  /**\n   * Export the currently displayed BPMN 2.0 diagram as\n   * an SVG image.\n   *\n   * ## Life-Cycle Events\n   *\n   * During SVG saving the viewer will fire life-cycle events:\n   *\n   *   * saveSVG.start (before serialization)\n   *   * saveSVG.done (everything done)\n   *\n   * You can use these events to hook into the life-cycle.\n   *\n   * @throws {Error} An error thrown during export.\n   *\n   * @fires BaseViewer#SaveSVGDone\n   *\n   * @return {Promise<SaveSVGResult>} A promise resolving with the SVG.\n   */\n  BaseViewer.prototype.saveSVG = async function saveSVG() {\n    this._emit('saveSVG.start');\n\n    let svg, err;\n\n    try {\n      const canvas = this.get('canvas');\n\n      const contentNode = canvas.getActiveLayer(),\n            defsNode = query('defs', canvas._svg);\n\n      const contents = innerSVG(contentNode),\n            defs = defsNode ? '<defs>' + innerSVG(defsNode) + '</defs>' : '';\n\n      const bbox = contentNode.getBBox();\n\n      svg =\n        '<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n' +\n        '<!-- created with bpmn-js / http://bpmn.io -->\\n' +\n        '<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n' +\n        '<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" ' +\n        'width=\"' + bbox.width + '\" height=\"' + bbox.height + '\" ' +\n        'viewBox=\"' + bbox.x + ' ' + bbox.y + ' ' + bbox.width + ' ' + bbox.height + '\" version=\"1.1\">' +\n        defs + contents +\n        '</svg>';\n    } catch (e) {\n      err = e;\n    }\n\n    /**\n     * A `saveSVG.done` event.\n     *\n     * @event BaseViewer#SaveSVGDoneEvent\n     * @type {SaveSVGDoneEvent}\n     */\n    this._emit('saveSVG.done', {\n      error: err,\n      svg: svg\n    });\n\n    if (err) {\n      throw err;\n    }\n\n    return { svg };\n  };\n\n  BaseViewer.prototype.saveSVG = wrapForCompatibility(BaseViewer.prototype.saveSVG);\n\n  /**\n   * Get a named diagram service.\n   *\n   * @example\n   *\n   * const elementRegistry = viewer.get('elementRegistry');\n   * const startEventShape = elementRegistry.get('StartEvent_1');\n   *\n   * @param {string} name\n   *\n   * @return {Object} diagram service instance\n   *\n   * @method BaseViewer#get\n   */\n\n  /**\n   * Invoke a function in the context of this viewer.\n   *\n   * @example\n   *\n   * viewer.invoke(function(elementRegistry) {\n   *   const startEventShape = elementRegistry.get('StartEvent_1');\n   * });\n   *\n   * @param {Function} fn to be invoked\n   *\n   * @return {Object} the functions return value\n   *\n   * @method BaseViewer#invoke\n   */\n\n\n  BaseViewer.prototype._setDefinitions = function(definitions) {\n    this._definitions = definitions;\n  };\n\n  /**\n   * Return modules to instantiate with.\n   *\n   * @return {ModuleDeclaration[]} The modules.\n   */\n  BaseViewer.prototype.getModules = function() {\n    return this._modules;\n  };\n\n  /**\n   * Remove all drawn elements from the viewer.\n   *\n   * After calling this method the viewer can still be reused for opening another\n   * diagram.\n   */\n  BaseViewer.prototype.clear = function() {\n    if (!this.getDefinitions()) {\n\n      // no diagram to clear\n      return;\n    }\n\n    // remove drawn elements\n    Diagram.prototype.clear.call(this);\n  };\n\n  /**\n   * Destroy the viewer instance and remove all its remainders from the document\n   * tree.\n   */\n  BaseViewer.prototype.destroy = function() {\n\n    // diagram destroy\n    Diagram.prototype.destroy.call(this);\n\n    // dom detach\n    remove$2(this._container);\n  };\n\n  /**\n   * Register an event listener.\n   *\n   * Remove an event listener via {@link BaseViewer#off}.\n   *\n   * @template T\n   *\n   * @param {string|string[]} events The event(s) to listen to.\n   * @param {number} [priority] The priority with which to listen.\n   * @param {EventBusEventCallback<T>} callback The callback.\n   * @param {any} [that] Value of `this` the callback will be called with.\n   */\n  BaseViewer.prototype.on = function(events, priority, callback, that) {\n    return this.get('eventBus').on(events, priority, callback, that);\n  };\n\n  /**\n   * Remove an event listener.\n   *\n   * @param {string|string[]} events The event(s).\n   * @param {Function} [callback] The callback.\n   */\n  BaseViewer.prototype.off = function(events, callback) {\n    this.get('eventBus').off(events, callback);\n  };\n\n  /**\n   * Attach the viewer to an HTML element.\n   *\n   * @param {HTMLElement} parentNode The parent node to attach to.\n   */\n  BaseViewer.prototype.attachTo = function(parentNode) {\n\n    if (!parentNode) {\n      throw new Error('parentNode required');\n    }\n\n    // ensure we detach from the\n    // previous, old parent\n    this.detach();\n\n    // unwrap jQuery if provided\n    if (parentNode.get && parentNode.constructor.prototype.jquery) {\n      parentNode = parentNode.get(0);\n    }\n\n    if (typeof parentNode === 'string') {\n      parentNode = query(parentNode);\n    }\n\n    parentNode.appendChild(this._container);\n\n    this._emit('attach', {});\n\n    this.get('canvas').resized();\n  };\n\n  /**\n   * Get the definitions model element.\n   *\n   * @return {ModdleElement} The definitions model element.\n   */\n  BaseViewer.prototype.getDefinitions = function() {\n    return this._definitions;\n  };\n\n  /**\n   * Detach the viewer.\n   *\n   * @fires BaseViewer#DetachEvent\n   */\n  BaseViewer.prototype.detach = function() {\n\n    const container = this._container,\n          parentNode = container.parentNode;\n\n    if (!parentNode) {\n      return;\n    }\n\n    /**\n     * A `detach` event.\n     *\n     * @event BaseViewer#DetachEvent\n     * @type {Object}\n     */\n    this._emit('detach', {});\n\n    parentNode.removeChild(container);\n  };\n\n  BaseViewer.prototype._init = function(container, moddle, options) {\n\n    const baseModules = options.modules || this.getModules(options),\n          additionalModules = options.additionalModules || [],\n          staticModules = [\n            {\n              bpmnjs: [ 'value', this ],\n              moddle: [ 'value', moddle ]\n            }\n          ];\n\n    const diagramModules = [].concat(staticModules, baseModules, additionalModules);\n\n    const diagramOptions = assign$1(omit(options, [ 'additionalModules' ]), {\n      canvas: assign$1({}, options.canvas, { container: container }),\n      modules: diagramModules\n    });\n\n    // invoke diagram constructor\n    Diagram.call(this, diagramOptions);\n\n    if (options && options.container) {\n      this.attachTo(options.container);\n    }\n  };\n\n  /**\n   * Emit an event on the underlying {@link EventBus}\n   *\n   * @param  {string} type\n   * @param  {Object} event\n   *\n   * @return {Object} The return value after calling all event listeners.\n   */\n  BaseViewer.prototype._emit = function(type, event) {\n    return this.get('eventBus').fire(type, event);\n  };\n\n  /**\n   * @param {BaseViewerOptions} options\n   *\n   * @return {HTMLElement}\n   */\n  BaseViewer.prototype._createContainer = function(options) {\n\n    const container = domify$1('<div class=\"bjs-container\"></div>');\n\n    assign(container, {\n      width: ensureUnit(options.width),\n      height: ensureUnit(options.height),\n      position: options.position\n    });\n\n    return container;\n  };\n\n  /**\n   * @param {BaseViewerOptions} options\n   *\n   * @return {Moddle}\n   */\n  BaseViewer.prototype._createModdle = function(options) {\n    const moddleOptions = assign$1({}, this._moddleExtensions, options.moddleExtensions);\n\n    return new simple(moddleOptions);\n  };\n\n  BaseViewer.prototype._modules = [];\n\n  // helpers ///////////////\n\n  function addWarningsToError(err, warningsAry) {\n    err.warnings = warningsAry;\n    return err;\n  }\n\n  function checkValidationError(err) {\n\n    // check if we can help the user by indicating wrong BPMN 2.0 xml\n    // (in case he or the exporting tool did not get that right)\n\n    const pattern = /unparsable content <([^>]+)> detected([\\s\\S]*)$/;\n    const match = pattern.exec(err.message);\n\n    if (match) {\n      err.message =\n        'unparsable content <' + match[1] + '> detected; ' +\n        'this may indicate an invalid BPMN 2.0 diagram file' + match[2];\n    }\n\n    return err;\n  }\n\n  const DEFAULT_OPTIONS = {\n    width: '100%',\n    height: '100%',\n    position: 'relative'\n  };\n\n\n  /**\n   * Ensure the passed argument is a proper unit (defaulting to px)\n   */\n  function ensureUnit(val) {\n    return val + (isNumber(val) ? 'px' : '');\n  }\n\n\n  /**\n   * Find BPMNDiagram in definitions by ID\n   *\n   * @param {ModdleElement<Definitions>} definitions\n   * @param {string} diagramId\n   *\n   * @return {ModdleElement<BPMNDiagram>|null}\n   */\n  function findBPMNDiagram(definitions, diagramId) {\n    if (!diagramId) {\n      return null;\n    }\n\n    return find(definitions.diagrams, function(element) {\n      return element.id === diagramId;\n    }) || null;\n  }\n\n  /**\n   * Adds the project logo to the diagram container as\n   * required by the bpmn.io license.\n   *\n   * @see http://bpmn.io/license\n   *\n   * @param {Element} container\n   */\n  function addProjectLogo(container) {\n    const img = BPMNIO_IMG;\n\n    const linkMarkup =\n      '<a href=\"http://bpmn.io\" ' +\n      'target=\"_blank\" ' +\n      'class=\"bjs-powered-by\" ' +\n      'title=\"Powered by bpmn.io\" ' +\n      '>' +\n      img +\n      '</a>';\n\n    const linkElement = domify$1(linkMarkup);\n\n    assign(query('svg', linkElement), LOGO_STYLES);\n    assign(linkElement, LINK_STYLES, {\n      position: 'absolute',\n      bottom: '15px',\n      right: '15px',\n      zIndex: '100'\n    });\n\n    container.appendChild(linkElement);\n\n    event.bind(linkElement, 'click', function(event) {\n      open();\n\n      event.preventDefault();\n    });\n  }\n\n  /* </project-logo> */\n\n  /**\n   * @typedef {import('./BaseViewer').BaseViewerOptions} BaseViewerOptions\n   * @typedef {import('./BaseViewer').ModdleElementsById} ModdleElementsById\n   *\n   * @typedef {import('./model/Types').ModdleElement} ModdleElement\n   */\n\n  /**\n   * A base modeler for BPMN 2.0 diagrams.\n   *\n   * See {@link Modeler} for a fully-featured modeler.\n   *\n   * @param {BaseViewerOptions} [options] The options to configure the modeler.\n   */\n  function BaseModeler(options) {\n    BaseViewer.call(this, options);\n\n    // hook ID collection into the modeler\n    this.on('import.parse.complete', function(event) {\n      if (!event.error) {\n        this._collectIds(event.definitions, event.elementsById);\n      }\n    }, this);\n\n    this.on('diagram.destroy', function() {\n      this.get('moddle').ids.clear();\n    }, this);\n  }\n\n  e$3(BaseModeler, BaseViewer);\n\n\n  /**\n   * Create a moddle instance, attaching IDs to it.\n   *\n   * @param {BaseViewerOptions} options\n   *\n   * @return {Moddle}\n   */\n  BaseModeler.prototype._createModdle = function(options) {\n    var moddle = BaseViewer.prototype._createModdle.call(this, options);\n\n    // attach ids to moddle to be able to track and validated ids in the BPMN 2.0\n    // XML document tree\n    moddle.ids = new Ids([ 32, 36, 1 ]);\n\n    return moddle;\n  };\n\n  /**\n   * Collect IDs processed during parsing of the definitions object.\n   *\n   * @param {ModdleElement} definitions\n   * @param {ModdleElementsById} elementsById\n   */\n  BaseModeler.prototype._collectIds = function(definitions, elementsById) {\n\n    var moddle = definitions.$model,\n        ids = moddle.ids,\n        id;\n\n    // remove references from previous import\n    ids.clear();\n\n    for (id in elementsById) {\n      ids.claim(id, elementsById[ id ]);\n    }\n  };\n\n  /**\n   * @typedef {import('../model/Types').Element} Element\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   */\n\n  /**\n   * @param {Element} element\n   * @param {ModdleElement} [di]\n   *\n   * @return {boolean}\n   */\n  function isExpanded(element, di) {\n\n    if (is$1(element, 'bpmn:CallActivity')) {\n      return false;\n    }\n\n    if (is$1(element, 'bpmn:SubProcess')) {\n      di = di || getDi(element);\n\n      if (di && is$1(di, 'bpmndi:BPMNPlane')) {\n        return true;\n      }\n\n      return di && !!di.isExpanded;\n    }\n\n    if (is$1(element, 'bpmn:Participant')) {\n      return !!getBusinessObject(element).processRef;\n    }\n\n    return true;\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isInterrupting(element) {\n    return element && getBusinessObject(element).isInterrupting !== false;\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isEventSubProcess(element) {\n    return element && !!getBusinessObject(element).triggeredByEvent;\n  }\n\n  /**\n   * @param {Element} element\n   * @param {string} eventType\n   *\n   * @return {boolean}\n   */\n  function hasEventDefinition$2(element, eventType) {\n    var eventDefinitions = getBusinessObject(element).eventDefinitions;\n\n    return some(eventDefinitions, function(event) {\n      return is$1(event, eventType);\n    });\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function hasErrorEventDefinition(element) {\n    return hasEventDefinition$2(element, 'bpmn:ErrorEventDefinition');\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function hasEscalationEventDefinition(element) {\n    return hasEventDefinition$2(element, 'bpmn:EscalationEventDefinition');\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function hasCompensateEventDefinition(element) {\n    return hasEventDefinition$2(element, 'bpmn:CompensateEventDefinition');\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/util/Types').Point} Point\n   * @typedef {import('diagram-js/lib/util/Types').Rect} Rect\n   *\n   * @typedef {import('../model/Types').Element} Element\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   */\n\n  var DEFAULT_LABEL_SIZE$1 = {\n    width: 90,\n    height: 20\n  };\n\n  var FLOW_LABEL_INDENT = 15;\n\n\n  /**\n   * Return true if the given semantic has an external label.\n   *\n   * @param {Element} semantic\n   *\n   * @return {boolean}\n   */\n  function isLabelExternal(semantic) {\n    return is$1(semantic, 'bpmn:Event') ||\n           is$1(semantic, 'bpmn:Gateway') ||\n           is$1(semantic, 'bpmn:DataStoreReference') ||\n           is$1(semantic, 'bpmn:DataObjectReference') ||\n           is$1(semantic, 'bpmn:DataInput') ||\n           is$1(semantic, 'bpmn:DataOutput') ||\n           is$1(semantic, 'bpmn:SequenceFlow') ||\n           is$1(semantic, 'bpmn:MessageFlow') ||\n           is$1(semantic, 'bpmn:Group');\n  }\n\n  /**\n   * Return true if the given element has an external label.\n   *\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function hasExternalLabel(element) {\n    return isLabel(element.label);\n  }\n\n  /**\n   * Get the position of a sequence flow label.\n   *\n   * @param  {Point[]} waypoints\n   *\n   * @return {Point}\n   */\n  function getFlowLabelPosition(waypoints) {\n\n    // get the waypoints mid\n    var mid = waypoints.length / 2 - 1;\n\n    var first = waypoints[Math.floor(mid)];\n    var second = waypoints[Math.ceil(mid + 0.01)];\n\n    // get position\n    var position = getWaypointsMid(waypoints);\n\n    // calculate angle\n    var angle = Math.atan((second.y - first.y) / (second.x - first.x));\n\n    var x = position.x,\n        y = position.y;\n\n    if (Math.abs(angle) < Math.PI / 2) {\n      y -= FLOW_LABEL_INDENT;\n    } else {\n      x += FLOW_LABEL_INDENT;\n    }\n\n    return { x: x, y: y };\n  }\n\n\n  /**\n   * Get the middle of a number of waypoints.\n   *\n   * @param  {Point[]} waypoints\n   *\n   * @return {Point}\n   */\n  function getWaypointsMid(waypoints) {\n\n    var mid = waypoints.length / 2 - 1;\n\n    var first = waypoints[Math.floor(mid)];\n    var second = waypoints[Math.ceil(mid + 0.01)];\n\n    return {\n      x: first.x + (second.x - first.x) / 2,\n      y: first.y + (second.y - first.y) / 2\n    };\n  }\n\n  /**\n   * Get the middle of the external label of an element.\n   *\n   * @param {Element} element\n   *\n   * @return {Point}\n   */\n  function getExternalLabelMid(element) {\n\n    if (element.waypoints) {\n      return getFlowLabelPosition(element.waypoints);\n    } else if (is$1(element, 'bpmn:Group')) {\n      return {\n        x: element.x + element.width / 2,\n        y: element.y + DEFAULT_LABEL_SIZE$1.height / 2\n      };\n    } else {\n      return {\n        x: element.x + element.width / 2,\n        y: element.y + element.height + DEFAULT_LABEL_SIZE$1.height / 2\n      };\n    }\n  }\n\n\n  /**\n   * Return the bounds of an elements label, parsed from the elements DI or\n   * generated from its bounds.\n   *\n   * @param {ModdleElement} di\n   * @param {Element} element\n   *\n   * @return {Rect}\n   */\n  function getExternalLabelBounds(di, element) {\n\n    var mid,\n        size,\n        bounds,\n        label = di.label;\n\n    if (label && label.bounds) {\n      bounds = label.bounds;\n\n      size = {\n        width: Math.max(DEFAULT_LABEL_SIZE$1.width, bounds.width),\n        height: bounds.height\n      };\n\n      mid = {\n        x: bounds.x + bounds.width / 2,\n        y: bounds.y + bounds.height / 2\n      };\n    } else {\n\n      mid = getExternalLabelMid(element);\n\n      size = DEFAULT_LABEL_SIZE$1;\n    }\n\n    return assign$1({\n      x: mid.x - size.width / 2,\n      y: mid.y - size.height / 2\n    }, size);\n  }\n\n  /**\n   * @param {ModdleElement} semantic\n   *\n   * @returns {string}\n   */\n  function getLabelAttr(semantic) {\n    if (\n      is$1(semantic, 'bpmn:FlowElement') ||\n      is$1(semantic, 'bpmn:Participant') ||\n      is$1(semantic, 'bpmn:Lane') ||\n      is$1(semantic, 'bpmn:SequenceFlow') ||\n      is$1(semantic, 'bpmn:MessageFlow') ||\n      is$1(semantic, 'bpmn:DataInput') ||\n      is$1(semantic, 'bpmn:DataOutput')\n    ) {\n      return 'name';\n    }\n\n    if (is$1(semantic, 'bpmn:TextAnnotation')) {\n      return 'text';\n    }\n\n    if (is$1(semantic, 'bpmn:Group')) {\n      return 'categoryValueRef';\n    }\n  }\n\n  /**\n   * @param {ModdleElement} semantic\n   *\n   * @returns {string}\n   */\n  function getCategoryValue(semantic) {\n    var categoryValueRef = semantic['categoryValueRef'];\n\n    if (!categoryValueRef) {\n      return '';\n    }\n\n\n    return categoryValueRef.value || '';\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {string}\n   */\n  function getLabel(element) {\n    var semantic = element.businessObject,\n        attr = getLabelAttr(semantic);\n\n    if (attr) {\n\n      if (attr === 'categoryValueRef') {\n\n        return getCategoryValue(semantic);\n      }\n\n      return semantic[attr] || '';\n    }\n  }\n\n\n  /**\n   * @param {Element} element\n   * @param {string} text\n   *\n   * @return {Element}\n   */\n  function setLabel(element, text) {\n    var semantic = element.businessObject,\n        attr = getLabelAttr(semantic);\n\n    if (attr) {\n\n      if (attr === 'categoryValueRef') {\n        semantic['categoryValueRef'].value = text;\n      } else {\n        semantic[attr] = text;\n      }\n\n    }\n\n    return element;\n  }\n\n  var black = 'hsl(225, 10%, 15%)';\n\n  // element utils //////////////////////\n\n  /**\n   * Checks if eventDefinition of the given element matches with semantic type.\n   *\n   * @param {ModdleElement} event\n   * @param {string} eventDefinitionType\n   *\n   * @return {boolean}\n   */\n  function isTypedEvent(event, eventDefinitionType) {\n    return some(event.eventDefinitions, function(definition) {\n      return definition.$type === eventDefinitionType;\n    });\n  }\n\n  /**\n   * Check if element is a throw event.\n   *\n   * @param {ModdleElement} event\n   *\n   * @return {boolean}\n   */\n  function isThrowEvent(event) {\n    return (event.$type === 'bpmn:IntermediateThrowEvent') || (event.$type === 'bpmn:EndEvent');\n  }\n\n  /**\n   * Check if element is a throw event.\n   *\n   * @param {ModdleElement} element\n   *\n   * @return {boolean}\n   */\n  function isCollection(element) {\n    var dataObject = element.dataObjectRef;\n\n    return element.isCollection || (dataObject && dataObject.isCollection);\n  }\n\n\n  // color access //////////////////////\n\n  /**\n   * @param {Element} element\n   * @param {string} [defaultColor]\n   *\n   * @return {string}\n   */\n  function getFillColor(element, defaultColor) {\n    var di = getDi(element);\n\n    return di.get('color:background-color') || di.get('bioc:fill') || defaultColor || 'white';\n  }\n\n  /**\n   * @param {Element} element\n   * @param {string} [defaultColor]\n   *\n   * @return {string}\n   */\n  function getStrokeColor$1(element, defaultColor) {\n    var di = getDi(element);\n\n    return di.get('color:border-color') || di.get('bioc:stroke') || defaultColor || black;\n  }\n\n  /**\n   * @param {Element} element\n   * @param {string} [defaultColor]\n   * @param {string} [defaultStrokeColor]\n   *\n   * @return {string}\n   */\n  function getLabelColor(element, defaultColor, defaultStrokeColor) {\n    var di = getDi(element),\n        label = di.get('label');\n\n    return label && label.get('color:color') || defaultColor ||\n      getStrokeColor$1(element, defaultStrokeColor);\n  }\n\n  // cropping path customizations //////////////////////\n\n  /**\n   * @param {ShapeLike} shape\n   *\n   * @return {string} path\n   */\n  function getCirclePath(shape) {\n\n    var cx = shape.x + shape.width / 2,\n        cy = shape.y + shape.height / 2,\n        radius = shape.width / 2;\n\n    var circlePath = [\n      [ 'M', cx, cy ],\n      [ 'm', 0, -radius ],\n      [ 'a', radius, radius, 0, 1, 1, 0, 2 * radius ],\n      [ 'a', radius, radius, 0, 1, 1, 0, -2 * radius ],\n      [ 'z' ]\n    ];\n\n    return componentsToPath(circlePath);\n  }\n\n  /**\n   * @param {ShapeLike} shape\n   * @param {number} [borderRadius]\n   *\n   * @return {string} path\n   */\n  function getRoundRectPath(shape, borderRadius) {\n\n    var x = shape.x,\n        y = shape.y,\n        width = shape.width,\n        height = shape.height;\n\n    var roundRectPath = [\n      [ 'M', x + borderRadius, y ],\n      [ 'l', width - borderRadius * 2, 0 ],\n      [ 'a', borderRadius, borderRadius, 0, 0, 1, borderRadius, borderRadius ],\n      [ 'l', 0, height - borderRadius * 2 ],\n      [ 'a', borderRadius, borderRadius, 0, 0, 1, -borderRadius, borderRadius ],\n      [ 'l', borderRadius * 2 - width, 0 ],\n      [ 'a', borderRadius, borderRadius, 0, 0, 1, -borderRadius, -borderRadius ],\n      [ 'l', 0, borderRadius * 2 - height ],\n      [ 'a', borderRadius, borderRadius, 0, 0, 1, borderRadius, -borderRadius ],\n      [ 'z' ]\n    ];\n\n    return componentsToPath(roundRectPath);\n  }\n\n  /**\n   * @param {ShapeLike} shape\n   *\n   * @return {string} path\n   */\n  function getDiamondPath(shape) {\n\n    var width = shape.width,\n        height = shape.height,\n        x = shape.x,\n        y = shape.y,\n        halfWidth = width / 2,\n        halfHeight = height / 2;\n\n    var diamondPath = [\n      [ 'M', x + halfWidth, y ],\n      [ 'l', halfWidth, halfHeight ],\n      [ 'l', -halfWidth, halfHeight ],\n      [ 'l', -halfWidth, -halfHeight ],\n      [ 'z' ]\n    ];\n\n    return componentsToPath(diamondPath);\n  }\n\n  /**\n   * @param {ShapeLike} shape\n   *\n   * @return {string} path\n   */\n  function getRectPath(shape) {\n    var x = shape.x,\n        y = shape.y,\n        width = shape.width,\n        height = shape.height;\n\n    var rectPath = [\n      [ 'M', x, y ],\n      [ 'l', width, 0 ],\n      [ 'l', 0, height ],\n      [ 'l', -width, 0 ],\n      [ 'z' ]\n    ];\n\n    return componentsToPath(rectPath);\n  }\n\n  var RENDERER_IDS = new Ids();\n\n  var TASK_BORDER_RADIUS = 10;\n  var INNER_OUTER_DIST = 3;\n\n  var DEFAULT_FILL_OPACITY = .95,\n      HIGH_FILL_OPACITY = .35;\n\n  var ELEMENT_LABEL_DISTANCE$1 = 10;\n\n  /**\n   * @typedef { Partial<{\n   *   defaultFillColor: string,\n   *   defaultStrokeColor: string,\n   *   defaultLabelColor: string\n   * }> } BpmnRendererConfig\n   */\n\n  /**\n   * @typedef { import('../model/Types').Element } Element\n   */\n\n  /**\n   * A renderer for BPMN elements\n   *\n   * @param {BpmnRendererConfig} config\n   * @param {import('diagram-js/lib/core/EventBus').default} eventBus\n   * @param {import('diagram-js/lib/draw/Styles').default} styles\n   * @param {import('./PathMap').default} pathMap\n   * @param {import('diagram-js/lib/core/Canvas').default} canvas\n   * @param {import('./TextRenderer').default} textRenderer\n   * @param {number} [priority]\n   */\n  function BpmnRenderer(\n      config, eventBus, styles, pathMap,\n      canvas, textRenderer, priority) {\n\n    BaseRenderer.call(this, eventBus, priority);\n\n    var defaultFillColor = config && config.defaultFillColor,\n        defaultStrokeColor = config && config.defaultStrokeColor,\n        defaultLabelColor = config && config.defaultLabelColor;\n\n    var rendererId = RENDERER_IDS.next();\n\n    var markers = {};\n\n    function shapeStyle(attrs) {\n      return styles.computeStyle(attrs, {\n        strokeLinecap: 'round',\n        strokeLinejoin: 'round',\n        stroke: black,\n        strokeWidth: 2,\n        fill: 'white'\n      });\n    }\n\n    function lineStyle(attrs) {\n      return styles.computeStyle(attrs, [ 'no-fill' ], {\n        strokeLinecap: 'round',\n        strokeLinejoin: 'round',\n        stroke: black,\n        strokeWidth: 2\n      });\n    }\n\n    function addMarker(id, options) {\n      var {\n        ref = { x: 0, y: 0 },\n        scale = 1,\n        element\n      } = options;\n\n      var marker = create$1('marker', {\n        id: id,\n        viewBox: '0 0 20 20',\n        refX: ref.x,\n        refY: ref.y,\n        markerWidth: 20 * scale,\n        markerHeight: 20 * scale,\n        orient: 'auto'\n      });\n\n      append(marker, element);\n\n      var defs = query('defs', canvas._svg);\n\n      if (!defs) {\n        defs = create$1('defs');\n\n        append(canvas._svg, defs);\n      }\n\n      append(defs, marker);\n\n      markers[id] = marker;\n    }\n\n    function colorEscape(str) {\n\n      // only allow characters and numbers\n      return str.replace(/[^0-9a-zA-Z]+/g, '_');\n    }\n\n    function marker(type, fill, stroke) {\n      var id = type + '-' + colorEscape(fill) + '-' + colorEscape(stroke) + '-' + rendererId;\n\n      if (!markers[id]) {\n        createMarker(id, type, fill, stroke);\n      }\n\n      return 'url(#' + id + ')';\n    }\n\n    function createMarker(id, type, fill, stroke) {\n\n      if (type === 'sequenceflow-end') {\n        var sequenceflowEnd = create$1('path', {\n          d: 'M 1 5 L 11 10 L 1 15 Z',\n          ...shapeStyle({\n            fill: stroke,\n            stroke: stroke,\n            strokeWidth: 1\n          })\n        });\n\n        addMarker(id, {\n          element: sequenceflowEnd,\n          ref: { x: 11, y: 10 },\n          scale: 0.5\n        });\n      }\n\n      if (type === 'messageflow-start') {\n        var messageflowStart = create$1('circle', {\n          cx: 6,\n          cy: 6,\n          r: 3.5,\n          ...shapeStyle({\n            fill: fill,\n            stroke: stroke,\n            strokeWidth: 1,\n\n            // fix for safari / chrome / firefox bug not correctly\n            // resetting stroke dash array\n            strokeDasharray: [ 10000, 1 ]\n          })\n        });\n\n        addMarker(id, {\n          element: messageflowStart,\n          ref: { x: 6, y: 6 }\n        });\n      }\n\n      if (type === 'messageflow-end') {\n        var messageflowEnd = create$1('path', {\n          d: 'm 1 5 l 0 -3 l 7 3 l -7 3 z',\n          ...shapeStyle({\n            fill: fill,\n            stroke: stroke,\n            strokeWidth: 1,\n\n            // fix for safari / chrome / firefox bug not correctly\n            // resetting stroke dash array\n            strokeDasharray: [ 10000, 1 ]\n          })\n        });\n\n        addMarker(id, {\n          element: messageflowEnd,\n          ref: { x: 8.5, y: 5 }\n        });\n      }\n\n      if (type === 'association-start') {\n        var associationStart = create$1('path', {\n          d: 'M 11 5 L 1 10 L 11 15',\n          ...lineStyle({\n            fill: 'none',\n            stroke: stroke,\n            strokeWidth: 1.5,\n\n            // fix for safari / chrome / firefox bug not correctly\n            // resetting stroke dash array\n            strokeDasharray: [ 10000, 1 ]\n          })\n        });\n\n        addMarker(id, {\n          element: associationStart,\n          ref: { x: 1, y: 10 },\n          scale: 0.5\n        });\n      }\n\n      if (type === 'association-end') {\n        var associationEnd = create$1('path', {\n          d: 'M 1 5 L 11 10 L 1 15',\n          ...lineStyle({\n            fill: 'none',\n            stroke: stroke,\n            strokeWidth: 1.5,\n\n            // fix for safari / chrome / firefox bug not correctly\n            // resetting stroke dash array\n            strokeDasharray: [ 10000, 1 ]\n          })\n        });\n\n        addMarker(id, {\n          element: associationEnd,\n          ref: { x: 11, y: 10 },\n          scale: 0.5\n        });\n      }\n\n      if (type === 'conditional-flow-marker') {\n        var conditionalFlowMarker = create$1('path', {\n          d: 'M 0 10 L 8 6 L 16 10 L 8 14 Z',\n          ...shapeStyle({\n            fill: fill,\n            stroke: stroke\n          })\n        });\n\n        addMarker(id, {\n          element: conditionalFlowMarker,\n          ref: { x: -1, y: 10 },\n          scale: 0.5\n        });\n      }\n\n      if (type === 'conditional-default-flow-marker') {\n        var defaultFlowMarker = create$1('path', {\n          d: 'M 6 4 L 10 16',\n          ...shapeStyle({\n            stroke: stroke\n          })\n        });\n\n        addMarker(id, {\n          element: defaultFlowMarker,\n          ref: { x: 0, y: 10 },\n          scale: 0.5\n        });\n      }\n    }\n\n    function drawCircle(parentGfx, width, height, offset, attrs) {\n\n      if (isObject(offset)) {\n        attrs = offset;\n        offset = 0;\n      }\n\n      offset = offset || 0;\n\n      attrs = shapeStyle(attrs);\n\n      if (attrs.fill === 'none') {\n        delete attrs.fillOpacity;\n      }\n\n      var cx = width / 2,\n          cy = height / 2;\n\n      var circle = create$1('circle', {\n        cx: cx,\n        cy: cy,\n        r: Math.round((width + height) / 4 - offset),\n        ...attrs\n      });\n\n      append(parentGfx, circle);\n\n      return circle;\n    }\n\n    function drawRect(parentGfx, width, height, r, offset, attrs) {\n\n      if (isObject(offset)) {\n        attrs = offset;\n        offset = 0;\n      }\n\n      offset = offset || 0;\n\n      attrs = shapeStyle(attrs);\n\n      var rect = create$1('rect', {\n        x: offset,\n        y: offset,\n        width: width - offset * 2,\n        height: height - offset * 2,\n        rx: r,\n        ry: r,\n        ...attrs\n      });\n\n      append(parentGfx, rect);\n\n      return rect;\n    }\n\n    function drawDiamond(parentGfx, width, height, attrs) {\n\n      var x_2 = width / 2;\n      var y_2 = height / 2;\n\n      var points = [\n        { x: x_2, y: 0 },\n        { x: width, y: y_2 },\n        { x: x_2, y: height },\n        { x: 0, y: y_2 }\n      ];\n\n      var pointsString = points.map(function(point) {\n        return point.x + ',' + point.y;\n      }).join(' ');\n\n      attrs = shapeStyle(attrs);\n\n      var polygon = create$1('polygon', {\n        ...attrs,\n        points: pointsString\n      });\n\n      append(parentGfx, polygon);\n\n      return polygon;\n    }\n\n    /**\n     * @param {SVGElement} parentGfx\n     * @param {Point[]} waypoints\n     * @param {any} attrs\n     * @param {number} [radius]\n     *\n     * @return {SVGElement}\n     */\n    function drawLine(parentGfx, waypoints, attrs, radius) {\n      attrs = lineStyle(attrs);\n\n      var line = createLine(waypoints, attrs, radius);\n\n      append(parentGfx, line);\n\n      return line;\n    }\n\n    /**\n     * @param {SVGElement} parentGfx\n     * @param {Point[]} waypoints\n     * @param {any} attrs\n     *\n     * @return {SVGElement}\n     */\n    function drawConnectionSegments(parentGfx, waypoints, attrs) {\n      return drawLine(parentGfx, waypoints, attrs, 5);\n    }\n\n    function drawPath(parentGfx, d, attrs) {\n\n      attrs = lineStyle(attrs);\n\n      var path = create$1('path', {\n        ...attrs,\n        d\n      });\n\n      append(parentGfx, path);\n\n      return path;\n    }\n\n    function drawMarker(type, parentGfx, path, attrs) {\n      return drawPath(parentGfx, path, assign$1({ 'data-marker': type }, attrs));\n    }\n\n    function renderer(type) {\n      return handlers[type];\n    }\n\n    function as(type) {\n      return function(parentGfx, element, options) {\n        return renderer(type)(parentGfx, element, options);\n      };\n    }\n\n    function renderEventContent(element, parentGfx) {\n\n      var event = getBusinessObject(element);\n      var isThrowing = isThrowEvent(event);\n\n      if (event.eventDefinitions && event.eventDefinitions.length > 1) {\n        if (event.parallelMultiple) {\n          return renderer('bpmn:ParallelMultipleEventDefinition')(parentGfx, element, isThrowing);\n        }\n        else {\n          return renderer('bpmn:MultipleEventDefinition')(parentGfx, element, isThrowing);\n        }\n      }\n\n      if (isTypedEvent(event, 'bpmn:MessageEventDefinition')) {\n        return renderer('bpmn:MessageEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:TimerEventDefinition')) {\n        return renderer('bpmn:TimerEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:ConditionalEventDefinition')) {\n        return renderer('bpmn:ConditionalEventDefinition')(parentGfx, element);\n      }\n\n      if (isTypedEvent(event, 'bpmn:SignalEventDefinition')) {\n        return renderer('bpmn:SignalEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:EscalationEventDefinition')) {\n        return renderer('bpmn:EscalationEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:LinkEventDefinition')) {\n        return renderer('bpmn:LinkEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:ErrorEventDefinition')) {\n        return renderer('bpmn:ErrorEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:CancelEventDefinition')) {\n        return renderer('bpmn:CancelEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:CompensateEventDefinition')) {\n        return renderer('bpmn:CompensateEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:TerminateEventDefinition')) {\n        return renderer('bpmn:TerminateEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      return null;\n    }\n\n    function renderLabel(parentGfx, label, options) {\n\n      options = assign$1({\n        size: {\n          width: 100\n        }\n      }, options);\n\n      var text = textRenderer.createText(label || '', options);\n\n      classes(text).add('djs-label');\n\n      append(parentGfx, text);\n\n      return text;\n    }\n\n    function renderEmbeddedLabel(parentGfx, element, align) {\n      var semantic = getBusinessObject(element);\n\n      return renderLabel(parentGfx, semantic.name, {\n        box: element,\n        align: align,\n        padding: 7,\n        style: {\n          fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor)\n        }\n      });\n    }\n\n    function renderExternalLabel(parentGfx, element) {\n\n      var box = {\n        width: 90,\n        height: 30,\n        x: element.width / 2 + element.x,\n        y: element.height / 2 + element.y\n      };\n\n      return renderLabel(parentGfx, getLabel(element), {\n        box: box,\n        fitBox: true,\n        style: assign$1(\n          {},\n          textRenderer.getExternalStyle(),\n          {\n            fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor)\n          }\n        )\n      });\n    }\n\n    function renderLaneLabel(parentGfx, text, element) {\n      var textBox = renderLabel(parentGfx, text, {\n        box: {\n          height: 30,\n          width: element.height\n        },\n        align: 'center-middle',\n        style: {\n          fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor)\n        }\n      });\n\n      var top = -1 * element.height;\n\n      transform(textBox, 0, -top, 270);\n    }\n\n    var handlers = this.handlers = {\n      'bpmn:Event': function(parentGfx, element, attrs) {\n\n        if (!('fillOpacity' in attrs)) {\n          attrs.fillOpacity = DEFAULT_FILL_OPACITY;\n        }\n\n        return drawCircle(parentGfx, element.width, element.height, attrs);\n      },\n      'bpmn:StartEvent': function(parentGfx, element, options) {\n        var attrs = {\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        };\n\n        var semantic = getBusinessObject(element);\n\n        if (!semantic.isInterrupting) {\n          attrs = {\n            strokeDasharray: '6',\n            fill: getFillColor(element, defaultFillColor),\n            stroke: getStrokeColor$1(element, defaultStrokeColor)\n          };\n        }\n\n        var circle = renderer('bpmn:Event')(parentGfx, element, attrs);\n\n        if (!options || options.renderIcon !== false) {\n          renderEventContent(element, parentGfx);\n        }\n\n        return circle;\n      },\n      'bpmn:MessageEventDefinition': function(parentGfx, element, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_MESSAGE', {\n          xScaleFactor: 0.9,\n          yScaleFactor: 0.9,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.235,\n            my: 0.315\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor$1(element, defaultStrokeColor) : getFillColor(element, defaultFillColor);\n        var stroke = isThrowing ? getFillColor(element, defaultFillColor) : getStrokeColor$1(element, defaultStrokeColor);\n\n        var messagePath = drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: stroke\n        });\n\n        return messagePath;\n      },\n      'bpmn:TimerEventDefinition': function(parentGfx, element) {\n        var circle = drawCircle(parentGfx, element.width, element.height, 0.2 * element.height, {\n          strokeWidth: 2,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        var pathData = pathMap.getScaledPath('EVENT_TIMER_WH', {\n          xScaleFactor: 0.75,\n          yScaleFactor: 0.75,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.5,\n            my: 0.5\n          }\n        });\n\n        drawPath(parentGfx, pathData, {\n          strokeWidth: 2,\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        for (var i = 0;i < 12; i++) {\n\n          var linePathData = pathMap.getScaledPath('EVENT_TIMER_LINE', {\n            xScaleFactor: 0.75,\n            yScaleFactor: 0.75,\n            containerWidth: element.width,\n            containerHeight: element.height,\n            position: {\n              mx: 0.5,\n              my: 0.5\n            }\n          });\n\n          var width = element.width / 2;\n          var height = element.height / 2;\n\n          drawPath(parentGfx, linePathData, {\n            strokeWidth: 1,\n            transform: 'rotate(' + (i * 30) + ',' + height + ',' + width + ')',\n            stroke: getStrokeColor$1(element, defaultStrokeColor)\n          });\n        }\n\n        return circle;\n      },\n      'bpmn:EscalationEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_ESCALATION', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.5,\n            my: 0.2\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor$1(event, defaultStrokeColor) : 'none';\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: getStrokeColor$1(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:ConditionalEventDefinition': function(parentGfx, event) {\n        var pathData = pathMap.getScaledPath('EVENT_CONDITIONAL', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.5,\n            my: 0.222\n          }\n        });\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          stroke: getStrokeColor$1(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:LinkEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_LINK', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.57,\n            my: 0.263\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor$1(event, defaultStrokeColor) : 'none';\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: getStrokeColor$1(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:ErrorEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_ERROR', {\n          xScaleFactor: 1.1,\n          yScaleFactor: 1.1,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.2,\n            my: 0.722\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor$1(event, defaultStrokeColor) : 'none';\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: getStrokeColor$1(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:CancelEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_CANCEL_45', {\n          xScaleFactor: 1.0,\n          yScaleFactor: 1.0,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.638,\n            my: -0.055\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor$1(event, defaultStrokeColor) : 'none';\n\n        var path = drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: getStrokeColor$1(event, defaultStrokeColor)\n        });\n\n        rotate(path, 45);\n\n        return path;\n      },\n      'bpmn:CompensateEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_COMPENSATION', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.22,\n            my: 0.5\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor$1(event, defaultStrokeColor) : 'none';\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: getStrokeColor$1(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:SignalEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_SIGNAL', {\n          xScaleFactor: 0.9,\n          yScaleFactor: 0.9,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.5,\n            my: 0.2\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor$1(event, defaultStrokeColor) : 'none';\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: getStrokeColor$1(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:MultipleEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_MULTIPLE', {\n          xScaleFactor: 1.1,\n          yScaleFactor: 1.1,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.222,\n            my: 0.36\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor$1(event, defaultStrokeColor) : 'none';\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill\n        });\n      },\n      'bpmn:ParallelMultipleEventDefinition': function(parentGfx, event) {\n        var pathData = pathMap.getScaledPath('EVENT_PARALLEL_MULTIPLE', {\n          xScaleFactor: 1.2,\n          yScaleFactor: 1.2,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.458,\n            my: 0.194\n          }\n        });\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: getStrokeColor$1(event, defaultStrokeColor),\n          stroke: getStrokeColor$1(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:EndEvent': function(parentGfx, element, options) {\n        var circle = renderer('bpmn:Event')(parentGfx, element, {\n          strokeWidth: 4,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        if (!options || options.renderIcon !== false) {\n          renderEventContent(element, parentGfx);\n        }\n\n        return circle;\n      },\n      'bpmn:TerminateEventDefinition': function(parentGfx, element) {\n        var circle = drawCircle(parentGfx, element.width, element.height, 8, {\n          strokeWidth: 4,\n          fill: getStrokeColor$1(element, defaultStrokeColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        return circle;\n      },\n      'bpmn:IntermediateEvent': function(parentGfx, element, options) {\n        var outer = renderer('bpmn:Event')(parentGfx, element, {\n          strokeWidth: 1.5,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        /* inner */\n        drawCircle(parentGfx, element.width, element.height, INNER_OUTER_DIST, {\n          strokeWidth: 1.5,\n          fill: getFillColor(element, 'none'),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        if (!options || options.renderIcon !== false) {\n          renderEventContent(element, parentGfx);\n        }\n\n        return outer;\n      },\n      'bpmn:IntermediateCatchEvent': as('bpmn:IntermediateEvent'),\n      'bpmn:IntermediateThrowEvent': as('bpmn:IntermediateEvent'),\n\n      'bpmn:Activity': function(parentGfx, element, attrs) {\n\n        attrs = attrs || {};\n\n        if (!('fillOpacity' in attrs)) {\n          attrs.fillOpacity = DEFAULT_FILL_OPACITY;\n        }\n\n        return drawRect(parentGfx, element.width, element.height, TASK_BORDER_RADIUS, attrs);\n      },\n\n      'bpmn:Task': function(parentGfx, element) {\n        var attrs = {\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        };\n\n        var rect = renderer('bpmn:Activity')(parentGfx, element, attrs);\n\n        renderEmbeddedLabel(parentGfx, element, 'center-middle');\n        attachTaskMarkers(parentGfx, element);\n\n        return rect;\n      },\n      'bpmn:ServiceTask': function(parentGfx, element) {\n        var task = renderer('bpmn:Task')(parentGfx, element);\n\n        var pathDataBG = pathMap.getScaledPath('TASK_TYPE_SERVICE', {\n          abspos: {\n            x: 12,\n            y: 18\n          }\n        });\n\n        /* service bg */ drawPath(parentGfx, pathDataBG, {\n          strokeWidth: 1,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        var fillPathData = pathMap.getScaledPath('TASK_TYPE_SERVICE_FILL', {\n          abspos: {\n            x: 17.2,\n            y: 18\n          }\n        });\n\n        /* service fill */ drawPath(parentGfx, fillPathData, {\n          strokeWidth: 0,\n          fill: getFillColor(element, defaultFillColor)\n        });\n\n        var pathData = pathMap.getScaledPath('TASK_TYPE_SERVICE', {\n          abspos: {\n            x: 17,\n            y: 22\n          }\n        });\n\n        /* service */ drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        return task;\n      },\n      'bpmn:UserTask': function(parentGfx, element) {\n        var task = renderer('bpmn:Task')(parentGfx, element);\n\n        var x = 15;\n        var y = 12;\n\n        var pathData = pathMap.getScaledPath('TASK_TYPE_USER_1', {\n          abspos: {\n            x: x,\n            y: y\n          }\n        });\n\n        /* user path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 0.5,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        var pathData2 = pathMap.getScaledPath('TASK_TYPE_USER_2', {\n          abspos: {\n            x: x,\n            y: y\n          }\n        });\n\n        /* user2 path */ drawPath(parentGfx, pathData2, {\n          strokeWidth: 0.5,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        var pathData3 = pathMap.getScaledPath('TASK_TYPE_USER_3', {\n          abspos: {\n            x: x,\n            y: y\n          }\n        });\n\n        /* user3 path */ drawPath(parentGfx, pathData3, {\n          strokeWidth: 0.5,\n          fill: getStrokeColor$1(element, defaultStrokeColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        return task;\n      },\n      'bpmn:ManualTask': function(parentGfx, element) {\n        var task = renderer('bpmn:Task')(parentGfx, element);\n\n        var pathData = pathMap.getScaledPath('TASK_TYPE_MANUAL', {\n          abspos: {\n            x: 17,\n            y: 15\n          }\n        });\n\n        /* manual path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 0.5, // 0.25,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        return task;\n      },\n      'bpmn:SendTask': function(parentGfx, element) {\n        var task = renderer('bpmn:Task')(parentGfx, element);\n\n        var pathData = pathMap.getScaledPath('TASK_TYPE_SEND', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: 21,\n          containerHeight: 14,\n          position: {\n            mx: 0.285,\n            my: 0.357\n          }\n        });\n\n        /* send path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: getStrokeColor$1(element, defaultStrokeColor),\n          stroke: getFillColor(element, defaultFillColor)\n        });\n\n        return task;\n      },\n      'bpmn:ReceiveTask' : function(parentGfx, element) {\n        var semantic = getBusinessObject(element);\n\n        var task = renderer('bpmn:Task')(parentGfx, element);\n        var pathData;\n\n        if (semantic.instantiate) {\n          drawCircle(parentGfx, 28, 28, 20 * 0.22, { strokeWidth: 1 });\n\n          pathData = pathMap.getScaledPath('TASK_TYPE_INSTANTIATING_SEND', {\n            abspos: {\n              x: 7.77,\n              y: 9.52\n            }\n          });\n        } else {\n\n          pathData = pathMap.getScaledPath('TASK_TYPE_SEND', {\n            xScaleFactor: 0.9,\n            yScaleFactor: 0.9,\n            containerWidth: 21,\n            containerHeight: 14,\n            position: {\n              mx: 0.3,\n              my: 0.4\n            }\n          });\n        }\n\n        /* receive path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        return task;\n      },\n      'bpmn:ScriptTask': function(parentGfx, element) {\n        var task = renderer('bpmn:Task')(parentGfx, element);\n\n        var pathData = pathMap.getScaledPath('TASK_TYPE_SCRIPT', {\n          abspos: {\n            x: 15,\n            y: 20\n          }\n        });\n\n        /* script path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        return task;\n      },\n      'bpmn:BusinessRuleTask': function(parentGfx, element) {\n        var task = renderer('bpmn:Task')(parentGfx, element);\n\n        var headerPathData = pathMap.getScaledPath('TASK_TYPE_BUSINESS_RULE_HEADER', {\n          abspos: {\n            x: 8,\n            y: 8\n          }\n        });\n\n        var businessHeaderPath = drawPath(parentGfx, headerPathData);\n        attr(businessHeaderPath, {\n          strokeWidth: 1,\n          fill: getFillColor(element, '#aaaaaa'),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        var headerData = pathMap.getScaledPath('TASK_TYPE_BUSINESS_RULE_MAIN', {\n          abspos: {\n            x: 8,\n            y: 8\n          }\n        });\n\n        var businessPath = drawPath(parentGfx, headerData);\n        attr(businessPath, {\n          strokeWidth: 1,\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        return task;\n      },\n      'bpmn:SubProcess': function(parentGfx, element, attrs) {\n        attrs = {\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor),\n          ...attrs\n        };\n\n        var rect = renderer('bpmn:Activity')(parentGfx, element, attrs);\n\n        var expanded = isExpanded(element);\n\n        if (isEventSubProcess(element)) {\n          attr(rect, {\n            strokeDasharray: '0, 5.5',\n            strokeWidth: 2.5\n          });\n        }\n\n        renderEmbeddedLabel(parentGfx, element, expanded ? 'center-top' : 'center-middle');\n\n        if (expanded) {\n          attachTaskMarkers(parentGfx, element);\n        } else {\n          attachTaskMarkers(parentGfx, element, [ 'SubProcessMarker' ]);\n        }\n\n        return rect;\n      },\n      'bpmn:AdHocSubProcess': function(parentGfx, element) {\n        return renderer('bpmn:SubProcess')(parentGfx, element);\n      },\n      'bpmn:Transaction': function(parentGfx, element) {\n        var outer = renderer('bpmn:SubProcess')(parentGfx, element, { strokeWidth: 1.5 });\n\n        var innerAttrs = styles.style([ 'no-fill', 'no-events' ], {\n          stroke: getStrokeColor$1(element, defaultStrokeColor),\n          strokeWidth: 1.5\n        });\n\n        /* inner path */ drawRect(parentGfx, element.width, element.height, TASK_BORDER_RADIUS - 3, INNER_OUTER_DIST, innerAttrs);\n\n        return outer;\n      },\n      'bpmn:CallActivity': function(parentGfx, element) {\n        return renderer('bpmn:SubProcess')(parentGfx, element, {\n          strokeWidth: 5\n        });\n      },\n      'bpmn:Participant': function(parentGfx, element) {\n\n        var strokeWidth = 1.5;\n\n        var attrs = {\n          fillOpacity: DEFAULT_FILL_OPACITY,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor),\n          strokeWidth\n        };\n\n        var lane = renderer('bpmn:Lane')(parentGfx, element, attrs);\n\n        var expandedPool = isExpanded(element);\n\n        if (expandedPool) {\n          drawLine(parentGfx, [\n            { x: 30, y: 0 },\n            { x: 30, y: element.height }\n          ], {\n            stroke: getStrokeColor$1(element, defaultStrokeColor),\n            strokeWidth\n          });\n          var text = getBusinessObject(element).name;\n          renderLaneLabel(parentGfx, text, element);\n        } else {\n\n          // collapsed pool draw text inline\n          var text2 = getBusinessObject(element).name;\n          renderLabel(parentGfx, text2, {\n            box: element, align: 'center-middle',\n            style: {\n              fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor)\n            }\n          });\n        }\n\n        var participantMultiplicity = !!(getBusinessObject(element).participantMultiplicity);\n\n        if (participantMultiplicity) {\n          renderer('ParticipantMultiplicityMarker')(parentGfx, element);\n        }\n\n        return lane;\n      },\n      'bpmn:Lane': function(parentGfx, element, attrs) {\n        var rect = drawRect(parentGfx, element.width, element.height, 0, {\n          fill: getFillColor(element, defaultFillColor),\n          fillOpacity: HIGH_FILL_OPACITY,\n          stroke: getStrokeColor$1(element, defaultStrokeColor),\n          strokeWidth: 1.5,\n          ...attrs\n        });\n\n        var semantic = getBusinessObject(element);\n\n        if (semantic.$type === 'bpmn:Lane') {\n          var text = semantic.name;\n          renderLaneLabel(parentGfx, text, element);\n        }\n\n        return rect;\n      },\n      'bpmn:InclusiveGateway': function(parentGfx, element) {\n        var diamond = renderer('bpmn:Gateway')(parentGfx, element);\n\n        /* circle path */\n        drawCircle(parentGfx, element.width, element.height, element.height * 0.24, {\n          strokeWidth: 2.5,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        return diamond;\n      },\n      'bpmn:ExclusiveGateway': function(parentGfx, element) {\n        var diamond = renderer('bpmn:Gateway')(parentGfx, element);\n\n        var pathData = pathMap.getScaledPath('GATEWAY_EXCLUSIVE', {\n          xScaleFactor: 0.4,\n          yScaleFactor: 0.4,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.32,\n            my: 0.3\n          }\n        });\n\n        if ((getDi(element).isMarkerVisible)) {\n          drawPath(parentGfx, pathData, {\n            strokeWidth: 1,\n            fill: getStrokeColor$1(element, defaultStrokeColor),\n            stroke: getStrokeColor$1(element, defaultStrokeColor)\n          });\n        }\n\n        return diamond;\n      },\n      'bpmn:ComplexGateway': function(parentGfx, element) {\n        var diamond = renderer('bpmn:Gateway')(parentGfx, element);\n\n        var pathData = pathMap.getScaledPath('GATEWAY_COMPLEX', {\n          xScaleFactor: 0.5,\n          yScaleFactor:0.5,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.46,\n            my: 0.26\n          }\n        });\n\n        /* complex path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: getStrokeColor$1(element, defaultStrokeColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        return diamond;\n      },\n      'bpmn:ParallelGateway': function(parentGfx, element) {\n        var diamond = renderer('bpmn:Gateway')(parentGfx, element);\n\n        var pathData = pathMap.getScaledPath('GATEWAY_PARALLEL', {\n          xScaleFactor: 0.6,\n          yScaleFactor:0.6,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.46,\n            my: 0.2\n          }\n        });\n\n        /* parallel path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: getStrokeColor$1(element, defaultStrokeColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        return diamond;\n      },\n      'bpmn:EventBasedGateway': function(parentGfx, element) {\n\n        var semantic = getBusinessObject(element);\n\n        var diamond = renderer('bpmn:Gateway')(parentGfx, element);\n\n        /* outer circle path */ drawCircle(parentGfx, element.width, element.height, element.height * 0.20, {\n          strokeWidth: 1,\n          fill: 'none',\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        var type = semantic.eventGatewayType;\n        var instantiate = !!semantic.instantiate;\n\n        function drawEvent() {\n\n          var pathData = pathMap.getScaledPath('GATEWAY_EVENT_BASED', {\n            xScaleFactor: 0.18,\n            yScaleFactor: 0.18,\n            containerWidth: element.width,\n            containerHeight: element.height,\n            position: {\n              mx: 0.36,\n              my: 0.44\n            }\n          });\n\n          /* event path */ drawPath(parentGfx, pathData, {\n            strokeWidth: 2,\n            fill: getFillColor(element, 'none'),\n            stroke: getStrokeColor$1(element, defaultStrokeColor)\n          });\n        }\n\n        if (type === 'Parallel') {\n\n          var pathData = pathMap.getScaledPath('GATEWAY_PARALLEL', {\n            xScaleFactor: 0.4,\n            yScaleFactor:0.4,\n            containerWidth: element.width,\n            containerHeight: element.height,\n            position: {\n              mx: 0.474,\n              my: 0.296\n            }\n          });\n\n          drawPath(parentGfx, pathData, {\n            strokeWidth: 1,\n            fill: 'none'\n          });\n        } else if (type === 'Exclusive') {\n\n          if (!instantiate) {\n            drawCircle(parentGfx, element.width, element.height, element.height * 0.26, {\n              strokeWidth: 1,\n              fill: 'none',\n              stroke: getStrokeColor$1(element, defaultStrokeColor)\n            });\n          }\n\n          drawEvent();\n        }\n\n\n        return diamond;\n      },\n      'bpmn:Gateway': function(parentGfx, element) {\n        return drawDiamond(parentGfx, element.width, element.height, {\n          fill: getFillColor(element, defaultFillColor),\n          fillOpacity: DEFAULT_FILL_OPACITY,\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n      },\n      'bpmn:SequenceFlow': function(parentGfx, element) {\n        var fill = getFillColor(element, defaultFillColor),\n            stroke = getStrokeColor$1(element, defaultStrokeColor);\n\n        var path = drawConnectionSegments(parentGfx, element.waypoints, {\n          markerEnd: marker('sequenceflow-end', fill, stroke),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        var sequenceFlow = getBusinessObject(element);\n\n        var source;\n\n        if (element.source) {\n          source = element.source.businessObject;\n\n          // conditional flow marker\n          if (sequenceFlow.conditionExpression && source.$instanceOf('bpmn:Activity')) {\n            attr(path, {\n              markerStart: marker('conditional-flow-marker', fill, stroke)\n            });\n          }\n\n          // default marker\n          if (source.default && (source.$instanceOf('bpmn:Gateway') || source.$instanceOf('bpmn:Activity')) &&\n              source.default === sequenceFlow) {\n            attr(path, {\n              markerStart: marker('conditional-default-flow-marker', fill, stroke)\n            });\n          }\n        }\n\n        return path;\n      },\n      'bpmn:Association': function(parentGfx, element, attrs) {\n\n        var semantic = getBusinessObject(element);\n\n        var fill = getFillColor(element, defaultFillColor),\n            stroke = getStrokeColor$1(element, defaultStrokeColor);\n\n        attrs = {\n          strokeDasharray: '0, 5',\n          stroke: getStrokeColor$1(element, defaultStrokeColor),\n          ...attrs\n        };\n\n        if (semantic.associationDirection === 'One' ||\n            semantic.associationDirection === 'Both') {\n          attrs.markerEnd = marker('association-end', fill, stroke);\n        }\n\n        if (semantic.associationDirection === 'Both') {\n          attrs.markerStart = marker('association-start', fill, stroke);\n        }\n\n        return drawConnectionSegments(parentGfx, element.waypoints, attrs);\n      },\n      'bpmn:DataInputAssociation': function(parentGfx, element) {\n        var fill = getFillColor(element, defaultFillColor),\n            stroke = getStrokeColor$1(element, defaultStrokeColor);\n\n        return renderer('bpmn:Association')(parentGfx, element, {\n          markerEnd: marker('association-end', fill, stroke)\n        });\n      },\n      'bpmn:DataOutputAssociation': function(parentGfx, element) {\n        var fill = getFillColor(element, defaultFillColor),\n            stroke = getStrokeColor$1(element, defaultStrokeColor);\n\n        return renderer('bpmn:Association')(parentGfx, element, {\n          markerEnd: marker('association-end', fill, stroke)\n        });\n      },\n      'bpmn:MessageFlow': function(parentGfx, element) {\n\n        var semantic = getBusinessObject(element),\n            di = getDi(element);\n\n        var fill = getFillColor(element, defaultFillColor),\n            stroke = getStrokeColor$1(element, defaultStrokeColor);\n\n        var path = drawConnectionSegments(parentGfx, element.waypoints, {\n          markerEnd: marker('messageflow-end', fill, stroke),\n          markerStart: marker('messageflow-start', fill, stroke),\n          strokeDasharray: '10, 11',\n          strokeWidth: 1.5,\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        if (semantic.messageRef) {\n          var midPoint = path.getPointAtLength(path.getTotalLength() / 2);\n\n          var markerPathData = pathMap.getScaledPath('MESSAGE_FLOW_MARKER', {\n            abspos: {\n              x: midPoint.x,\n              y: midPoint.y\n            }\n          });\n\n          var messageAttrs = { strokeWidth: 1 };\n\n          if (di.messageVisibleKind === 'initiating') {\n            messageAttrs.fill = 'white';\n            messageAttrs.stroke = black;\n          } else {\n            messageAttrs.fill = '#888';\n            messageAttrs.stroke = 'white';\n          }\n\n          var message = drawPath(parentGfx, markerPathData, messageAttrs);\n\n          var labelText = semantic.messageRef.name;\n          var label = renderLabel(parentGfx, labelText, {\n            align: 'center-top',\n            fitBox: true,\n            style: {\n              fill: getStrokeColor$1(element, defaultLabelColor)\n            }\n          });\n\n          var messageBounds = message.getBBox(),\n              labelBounds = label.getBBox();\n\n          var translateX = midPoint.x - labelBounds.width / 2,\n              translateY = midPoint.y + messageBounds.height / 2 + ELEMENT_LABEL_DISTANCE$1;\n\n          transform(label, translateX, translateY, 0);\n\n        }\n\n        return path;\n      },\n      'bpmn:DataObject': function(parentGfx, element) {\n        var pathData = pathMap.getScaledPath('DATA_OBJECT_PATH', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.474,\n            my: 0.296\n          }\n        });\n\n        var elementObject = drawPath(parentGfx, pathData, {\n          fill: getFillColor(element, defaultFillColor),\n          fillOpacity: DEFAULT_FILL_OPACITY,\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        var semantic = getBusinessObject(element);\n\n        if (isCollection(semantic)) {\n          renderDataItemCollection(parentGfx, element);\n        }\n\n        return elementObject;\n      },\n      'bpmn:DataObjectReference': as('bpmn:DataObject'),\n      'bpmn:DataInput': function(parentGfx, element) {\n\n        var arrowPathData = pathMap.getRawPath('DATA_ARROW');\n\n        // page\n        var elementObject = renderer('bpmn:DataObject')(parentGfx, element);\n\n        /* input arrow path */ drawPath(parentGfx, arrowPathData, { strokeWidth: 1 });\n\n        return elementObject;\n      },\n      'bpmn:DataOutput': function(parentGfx, element) {\n        var arrowPathData = pathMap.getRawPath('DATA_ARROW');\n\n        // page\n        var elementObject = renderer('bpmn:DataObject')(parentGfx, element);\n\n        /* output arrow path */ drawPath(parentGfx, arrowPathData, {\n          strokeWidth: 1,\n          fill: black\n        });\n\n        return elementObject;\n      },\n      'bpmn:DataStoreReference': function(parentGfx, element) {\n        var DATA_STORE_PATH = pathMap.getScaledPath('DATA_STORE', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0,\n            my: 0.133\n          }\n        });\n\n        var elementStore = drawPath(parentGfx, DATA_STORE_PATH, {\n          strokeWidth: 2,\n          fill: getFillColor(element, defaultFillColor),\n          fillOpacity: DEFAULT_FILL_OPACITY,\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        return elementStore;\n      },\n      'bpmn:BoundaryEvent': function(parentGfx, element, options) {\n\n        var semantic = getBusinessObject(element),\n            cancel = semantic.cancelActivity;\n\n        var attrs = {\n          strokeWidth: 1.5,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        };\n\n        if (!cancel) {\n          attrs.strokeDasharray = '6';\n        }\n\n        // apply fillOpacity\n        var outerAttrs = {\n          ...attrs,\n          fillOpacity: 1\n        };\n\n        // apply no-fill\n        var innerAttrs = {\n          ...attrs,\n          fill: 'none'\n        };\n\n        var outer = renderer('bpmn:Event')(parentGfx, element, outerAttrs);\n\n        /* inner path */ drawCircle(parentGfx, element.width, element.height, INNER_OUTER_DIST, innerAttrs);\n\n        if (!options || options.renderIcon !== false) {\n          renderEventContent(element, parentGfx);\n        }\n\n        return outer;\n      },\n      'bpmn:Group': function(parentGfx, element) {\n        return drawRect(parentGfx, element.width, element.height, TASK_BORDER_RADIUS, {\n          stroke: getStrokeColor$1(element, defaultStrokeColor),\n          strokeWidth: 1.5,\n          strokeDasharray: '10,6,0,6',\n          fill: 'none',\n          pointerEvents: 'none'\n        });\n      },\n      'label': function(parentGfx, element) {\n        return renderExternalLabel(parentGfx, element);\n      },\n      'bpmn:TextAnnotation': function(parentGfx, element) {\n        var textElement = drawRect(parentGfx, element.width, element.height, 0, 0, {\n          'fill': 'none',\n          'stroke': 'none'\n        });\n\n        var textPathData = pathMap.getScaledPath('TEXT_ANNOTATION', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.0,\n            my: 0.0\n          }\n        });\n\n        drawPath(parentGfx, textPathData, {\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        var text = getBusinessObject(element).text || '';\n        renderLabel(parentGfx, text, {\n          box: element,\n          align: 'left-top',\n          padding: 7,\n          style: {\n            fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor)\n          }\n        });\n\n        return textElement;\n      },\n      'ParticipantMultiplicityMarker': function(parentGfx, element) {\n        var markerPath = pathMap.getScaledPath('MARKER_PARALLEL', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: ((element.width / 2) / element.width),\n            my: (element.height - 15) / element.height\n          }\n        });\n\n        drawMarker('participant-multiplicity', parentGfx, markerPath, {\n          strokeWidth: 2,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n      },\n      'SubProcessMarker': function(parentGfx, element) {\n        var markerRect = drawRect(parentGfx, 14, 14, 0, {\n          strokeWidth: 1,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        // Process marker is placed in the middle of the box\n        // therefore fixed values can be used here\n        translate$2(markerRect, element.width / 2 - 7.5, element.height - 20);\n\n        var markerPath = pathMap.getScaledPath('MARKER_SUB_PROCESS', {\n          xScaleFactor: 1.5,\n          yScaleFactor: 1.5,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: (element.width / 2 - 7.5) / element.width,\n            my: (element.height - 20) / element.height\n          }\n        });\n\n        drawMarker('sub-process', parentGfx, markerPath, {\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n      },\n      'ParallelMarker': function(parentGfx, element, position) {\n        var markerPath = pathMap.getScaledPath('MARKER_PARALLEL', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: ((element.width / 2 + position.parallel) / element.width),\n            my: (element.height - 20) / element.height\n          }\n        });\n\n        drawMarker('parallel', parentGfx, markerPath, {\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n      },\n      'SequentialMarker': function(parentGfx, element, position) {\n        var markerPath = pathMap.getScaledPath('MARKER_SEQUENTIAL', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: ((element.width / 2 + position.seq) / element.width),\n            my: (element.height - 19) / element.height\n          }\n        });\n\n        drawMarker('sequential', parentGfx, markerPath, {\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n      },\n      'CompensationMarker': function(parentGfx, element, position) {\n        var markerMath = pathMap.getScaledPath('MARKER_COMPENSATION', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: ((element.width / 2 + position.compensation) / element.width),\n            my: (element.height - 13) / element.height\n          }\n        });\n\n        drawMarker('compensation', parentGfx, markerMath, {\n          strokeWidth: 1,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n      },\n      'LoopMarker': function(parentGfx, element, position) {\n        var markerPath = pathMap.getScaledPath('MARKER_LOOP', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: ((element.width / 2 + position.loop) / element.width),\n            my: (element.height - 7) / element.height\n          }\n        });\n\n        drawMarker('loop', parentGfx, markerPath, {\n          strokeWidth: 1.5,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor),\n          strokeMiterlimit: 0.5\n        });\n      },\n      'AdhocMarker': function(parentGfx, element, position) {\n        var markerPath = pathMap.getScaledPath('MARKER_ADHOC', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: ((element.width / 2 + position.adhoc) / element.width),\n            my: (element.height - 15) / element.height\n          }\n        });\n\n        drawMarker('adhoc', parentGfx, markerPath, {\n          strokeWidth: 1,\n          fill: getStrokeColor$1(element, defaultStrokeColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n      }\n    };\n\n    function attachTaskMarkers(parentGfx, element, taskMarkers) {\n      var obj = getBusinessObject(element);\n\n      var subprocess = taskMarkers && taskMarkers.indexOf('SubProcessMarker') !== -1;\n      var position;\n\n      if (subprocess) {\n        position = {\n          seq: -21,\n          parallel: -22,\n          compensation: -42,\n          loop: -18,\n          adhoc: 10\n        };\n      } else {\n        position = {\n          seq: -3,\n          parallel: -6,\n          compensation: -27,\n          loop: 0,\n          adhoc: 10\n        };\n      }\n\n      forEach$1(taskMarkers, function(marker) {\n        renderer(marker)(parentGfx, element, position);\n      });\n\n      if (obj.isForCompensation) {\n        renderer('CompensationMarker')(parentGfx, element, position);\n      }\n\n      if (obj.$type === 'bpmn:AdHocSubProcess') {\n        renderer('AdhocMarker')(parentGfx, element, position);\n      }\n\n      var loopCharacteristics = obj.loopCharacteristics,\n          isSequential = loopCharacteristics && loopCharacteristics.isSequential;\n\n      if (loopCharacteristics) {\n\n        if (isSequential === undefined) {\n          renderer('LoopMarker')(parentGfx, element, position);\n        }\n\n        if (isSequential === false) {\n          renderer('ParallelMarker')(parentGfx, element, position);\n        }\n\n        if (isSequential === true) {\n          renderer('SequentialMarker')(parentGfx, element, position);\n        }\n      }\n    }\n\n    function renderDataItemCollection(parentGfx, element) {\n\n      var yPosition = (element.height - 18) / element.height;\n\n      var pathData = pathMap.getScaledPath('DATA_OBJECT_COLLECTION_PATH', {\n        xScaleFactor: 1,\n        yScaleFactor: 1,\n        containerWidth: element.width,\n        containerHeight: element.height,\n        position: {\n          mx: 0.33,\n          my: yPosition\n        }\n      });\n\n      /* collection path */ drawPath(parentGfx, pathData, {\n        strokeWidth: 2\n      });\n    }\n\n\n    // extension API, use at your own risk\n    this._drawPath = drawPath;\n\n    this._renderer = renderer;\n  }\n\n\n  e$3(BpmnRenderer, BaseRenderer);\n\n  BpmnRenderer.$inject = [\n    'config.bpmnRenderer',\n    'eventBus',\n    'styles',\n    'pathMap',\n    'canvas',\n    'textRenderer'\n  ];\n\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  BpmnRenderer.prototype.canRender = function(element) {\n    return is$1(element, 'bpmn:BaseElement');\n  };\n\n  /**\n   * Draw shape into parentGfx.\n   *\n   * @param {SVGElement} parentGfx\n   * @param {Element} element\n   *\n   * @return {SVGElement} mainGfx\n   */\n  BpmnRenderer.prototype.drawShape = function(parentGfx, element) {\n    var type = element.type;\n    var h = this._renderer(type);\n\n    /* jshint -W040 */\n    return h(parentGfx, element);\n  };\n\n  /**\n   * Draw connection into parentGfx.\n   *\n   * @param {SVGElement} parentGfx\n   * @param {Element} element\n   *\n   * @return {SVGElement} mainGfx\n   */\n  BpmnRenderer.prototype.drawConnection = function(parentGfx, element) {\n    var type = element.type;\n    var h = this._renderer(type);\n\n    /* jshint -W040 */\n    return h(parentGfx, element);\n  };\n\n  /**\n   * Get shape path.\n   *\n   * @param {Element} element\n   *\n   * @return {string} path\n   */\n  BpmnRenderer.prototype.getShapePath = function(element) {\n\n    if (is$1(element, 'bpmn:Event')) {\n      return getCirclePath(element);\n    }\n\n    if (is$1(element, 'bpmn:Activity')) {\n      return getRoundRectPath(element, TASK_BORDER_RADIUS);\n    }\n\n    if (is$1(element, 'bpmn:Gateway')) {\n      return getDiamondPath(element);\n    }\n\n    return getRectPath(element);\n  };\n\n  /**\n   * @typedef {import('../util/Types').Dimensions} Dimensions\n   *\n   * @typedef { {\n   *   top: number;\n   *   left: number;\n   *   right: number;\n   *   bottom: number;\n   * } } Padding\n   *\n   * @typedef { number | Partial<Padding> } PaddingConfig\n   *\n   * @typedef { {\n   *   horizontal: 'center' | 'left';\n   *   vertical: 'top' | 'center';\n   * } } Alignment\n   *\n   *  @typedef { 'center-middle' | 'center-top' } AlignmentConfig\n   *\n   * @typedef { Partial<{\n   *   align: AlignmentConfig;\n   *   style: Record<string, number | string>;\n   *   padding: PaddingConfig;\n   * }> } BaseTextConfig\n   *\n   * @typedef { BaseTextConfig & Partial<{\n   *   size: Dimensions;\n   * }> } TextConfig\n   *\n   * @typedef { BaseTextConfig & Partial<{\n   *   box: Dimensions;\n   *   fitBox: boolean;\n   * }> } TextLayoutConfig\n   *\n   *  @typedef { Dimensions & {\n   *  text: string;\n   * } } LineDescriptor\n   */\n\n  var DEFAULT_BOX_PADDING = 0;\n\n  var DEFAULT_LABEL_SIZE = {\n    width: 150,\n    height: 50\n  };\n\n\n  /**\n   * @param {AlignmentConfig} align\n   * @return {Alignment}\n   */\n  function parseAlign(align) {\n\n    var parts = align.split('-');\n\n    return {\n      horizontal: parts[0] || 'center',\n      vertical: parts[1] || 'top'\n    };\n  }\n\n  /**\n   * @param {PaddingConfig} padding\n   *\n   * @return {Padding}\n   */\n  function parsePadding(padding) {\n\n    if (isObject(padding)) {\n      return assign$1({ top: 0, left: 0, right: 0, bottom: 0 }, padding);\n    } else {\n      return {\n        top: padding,\n        left: padding,\n        right: padding,\n        bottom: padding\n      };\n    }\n  }\n\n  /**\n   * @param {string} text\n   * @param {SVGTextElement} fakeText\n   *\n   * @return {import('../util/Types').Dimensions}\n   */\n  function getTextBBox(text, fakeText) {\n\n    fakeText.textContent = text;\n\n    var textBBox;\n\n    try {\n      var bbox,\n          emptyLine = text === '';\n\n      // add dummy text, when line is empty to\n      // determine correct height\n      fakeText.textContent = emptyLine ? 'dummy' : text;\n\n      textBBox = fakeText.getBBox();\n\n      // take text rendering related horizontal\n      // padding into account\n      bbox = {\n        width: textBBox.width + textBBox.x * 2,\n        height: textBBox.height\n      };\n\n      if (emptyLine) {\n\n        // correct width\n        bbox.width = 0;\n      }\n\n      return bbox;\n    } catch (e) {\n      return { width: 0, height: 0 };\n    }\n  }\n\n\n  /**\n   * Layout the next line and return the layouted element.\n   *\n   * Alters the lines passed.\n   *\n   * @param {string[]} lines\n   * @param {number} maxWidth\n   * @param {SVGTextElement} fakeText\n   *\n   * @return {LineDescriptor} the line descriptor\n   */\n  function layoutNext(lines, maxWidth, fakeText) {\n\n    var originalLine = lines.shift(),\n        fitLine = originalLine;\n\n    var textBBox;\n\n    for (;;) {\n      textBBox = getTextBBox(fitLine, fakeText);\n\n      textBBox.width = fitLine ? textBBox.width : 0;\n\n      // try to fit\n      if (fitLine === ' ' || fitLine === '' || textBBox.width < Math.round(maxWidth) || fitLine.length < 2) {\n        return fit(lines, fitLine, originalLine, textBBox);\n      }\n\n      fitLine = shortenLine(fitLine, textBBox.width, maxWidth);\n    }\n  }\n\n  /**\n   * @param {string[]} lines\n   * @param {string} fitLine\n   * @param {string} originalLine\n   * @param {Dimensions} textBBox\n   *\n   * @return {LineDescriptor}\n   */\n  function fit(lines, fitLine, originalLine, textBBox) {\n    if (fitLine.length < originalLine.length) {\n      var remainder = originalLine.slice(fitLine.length).trim();\n\n      lines.unshift(remainder);\n    }\n\n    return {\n      width: textBBox.width,\n      height: textBBox.height,\n      text: fitLine\n    };\n  }\n\n  var SOFT_BREAK = '\\u00AD';\n\n\n  /**\n   * Shortens a line based on spacing and hyphens.\n   * Returns the shortened result on success.\n   *\n   * @param {string} line\n   * @param {number} maxLength the maximum characters of the string\n   *\n   * @return {string} the shortened string\n   */\n  function semanticShorten(line, maxLength) {\n\n    var parts = line.split(/(\\s|-|\\u00AD)/g),\n        part,\n        shortenedParts = [],\n        length = 0;\n\n    // try to shorten via break chars\n    if (parts.length > 1) {\n\n      while ((part = parts.shift())) {\n        if (part.length + length < maxLength) {\n          shortenedParts.push(part);\n          length += part.length;\n        } else {\n\n          // remove previous part, too if hyphen does not fit anymore\n          if (part === '-' || part === SOFT_BREAK) {\n            shortenedParts.pop();\n          }\n\n          break;\n        }\n      }\n    }\n\n    var last = shortenedParts[shortenedParts.length - 1];\n\n    // translate trailing soft break to actual hyphen\n    if (last && last === SOFT_BREAK) {\n      shortenedParts[shortenedParts.length - 1] = '-';\n    }\n\n    return shortenedParts.join('');\n  }\n\n\n  /**\n   * @param {string} line\n   * @param {number} width\n   * @param {number} maxWidth\n   *\n   * @return {string}\n   */\n  function shortenLine(line, width, maxWidth) {\n    var length = Math.max(line.length * (maxWidth / width), 1);\n\n    // try to shorten semantically (i.e. based on spaces and hyphens)\n    var shortenedLine = semanticShorten(line, length);\n\n    if (!shortenedLine) {\n\n      // force shorten by cutting the long word\n      shortenedLine = line.slice(0, Math.max(Math.round(length - 1), 1));\n    }\n\n    return shortenedLine;\n  }\n\n\n  /**\n   * @return {SVGSVGElement}\n   */\n  function getHelperSvg() {\n    var helperSvg = document.getElementById('helper-svg');\n\n    if (!helperSvg) {\n      helperSvg = create$1('svg');\n\n      attr(helperSvg, {\n        id: 'helper-svg'\n      });\n\n      assign(helperSvg, {\n        visibility: 'hidden',\n        position: 'fixed',\n        width: 0,\n        height: 0\n      });\n\n      document.body.appendChild(helperSvg);\n    }\n\n    return helperSvg;\n  }\n\n\n  /**\n   * Creates a new label utility\n   *\n   * @param {TextConfig} config\n   */\n  function Text(config) {\n\n    this._config = assign$1({}, {\n      size: DEFAULT_LABEL_SIZE,\n      padding: DEFAULT_BOX_PADDING,\n      style: {},\n      align: 'center-top'\n    }, config || {});\n  }\n\n  /**\n   * Returns the layouted text as an SVG element.\n   *\n   * @param {string} text\n   * @param {TextLayoutConfig} options\n   *\n   * @return {SVGElement}\n   */\n  Text.prototype.createText = function(text, options) {\n    return this.layoutText(text, options).element;\n  };\n\n  /**\n   * Returns a labels layouted dimensions.\n   *\n   * @param {string} text to layout\n   * @param {TextLayoutConfig} options\n   *\n   * @return {Dimensions}\n   */\n  Text.prototype.getDimensions = function(text, options) {\n    return this.layoutText(text, options).dimensions;\n  };\n\n  /**\n   * Creates and returns a label and its bounding box.\n   *\n   * @param {string} text the text to render on the label\n   * @param {TextLayoutConfig} options\n   *\n   * @return { {\n   *   element: SVGElement,\n   *   dimensions: Dimensions\n   * } }\n   */\n  Text.prototype.layoutText = function(text, options) {\n    var box = assign$1({}, this._config.size, options.box),\n        style = assign$1({}, this._config.style, options.style),\n        align = parseAlign(options.align || this._config.align),\n        padding = parsePadding(options.padding !== undefined ? options.padding : this._config.padding),\n        fitBox = options.fitBox || false;\n\n    var lineHeight = getLineHeight(style);\n\n    // we split text by lines and normalize\n    // {soft break} + {line break} => { line break }\n    var lines = text.split(/\\u00AD?\\r?\\n/),\n        layouted = [];\n\n    var maxWidth = box.width - padding.left - padding.right;\n\n    // ensure correct rendering by attaching helper text node to invisible SVG\n    var helperText = create$1('text');\n    attr(helperText, { x: 0, y: 0 });\n    attr(helperText, style);\n\n    var helperSvg = getHelperSvg();\n\n    append(helperSvg, helperText);\n\n    while (lines.length) {\n      layouted.push(layoutNext(lines, maxWidth, helperText));\n    }\n\n    if (align.vertical === 'middle') {\n      padding.top = padding.bottom = 0;\n    }\n\n    var totalHeight = reduce(layouted, function(sum, line, idx) {\n      return sum + (lineHeight || line.height);\n    }, 0) + padding.top + padding.bottom;\n\n    var maxLineWidth = reduce(layouted, function(sum, line, idx) {\n      return line.width > sum ? line.width : sum;\n    }, 0);\n\n    // the y position of the next line\n    var y = padding.top;\n\n    if (align.vertical === 'middle') {\n      y += (box.height - totalHeight) / 2;\n    }\n\n    // magic number initial offset\n    y -= (lineHeight || layouted[0].height) / 4;\n\n\n    var textElement = create$1('text');\n\n    attr(textElement, style);\n\n    // layout each line taking into account that parent\n    // shape might resize to fit text size\n    forEach$1(layouted, function(line) {\n\n      var x;\n\n      y += (lineHeight || line.height);\n\n      switch (align.horizontal) {\n      case 'left':\n        x = padding.left;\n        break;\n\n      case 'right':\n        x = ((fitBox ? maxLineWidth : maxWidth)\n          - padding.right - line.width);\n        break;\n\n      default:\n\n        // aka center\n        x = Math.max((((fitBox ? maxLineWidth : maxWidth)\n          - line.width) / 2 + padding.left), 0);\n      }\n\n      var tspan = create$1('tspan');\n      attr(tspan, { x: x, y: y });\n\n      tspan.textContent = line.text;\n\n      append(textElement, tspan);\n    });\n\n    remove$1(helperText);\n\n    var dimensions = {\n      width: maxLineWidth,\n      height: totalHeight\n    };\n\n    return {\n      dimensions: dimensions,\n      element: textElement\n    };\n  };\n\n\n  function getLineHeight(style) {\n    if ('fontSize' in style && 'lineHeight' in style) {\n      return style.lineHeight * parseInt(style.fontSize, 10);\n    }\n  }\n\n  var DEFAULT_FONT_SIZE = 12;\n  var LINE_HEIGHT_RATIO = 1.2;\n\n  var MIN_TEXT_ANNOTATION_HEIGHT = 30;\n\n  /**\n   * @typedef { {\n   *   fontFamily: string;\n   *   fontSize: number;\n   *   fontWeight: string;\n   *   lineHeight: number;\n   * } } TextRendererStyle\n   *\n   * @typedef { {\n   *   defaultStyle?: Partial<TextRendererStyle>;\n   *   externalStyle?: Partial<TextRendererStyle>;\n   * } } TextRendererConfig\n   *\n   * @typedef { import('diagram-js/lib/util/Text').TextLayoutConfig } TextLayoutConfig\n   *\n   * @typedef { import('diagram-js/lib/util/Types').Rect } Rect\n   */\n\n\n  /**\n   * Renders text and computes text bounding boxes.\n   *\n   * @param {TextRendererConfig} [config]\n   */\n  function TextRenderer(config) {\n\n    var defaultStyle = assign$1({\n      fontFamily: 'Arial, sans-serif',\n      fontSize: DEFAULT_FONT_SIZE,\n      fontWeight: 'normal',\n      lineHeight: LINE_HEIGHT_RATIO\n    }, config && config.defaultStyle || {});\n\n    var fontSize = parseInt(defaultStyle.fontSize, 10) - 1;\n\n    var externalStyle = assign$1({}, defaultStyle, {\n      fontSize: fontSize\n    }, config && config.externalStyle || {});\n\n    var textUtil = new Text({\n      style: defaultStyle\n    });\n\n    /**\n     * Get the new bounds of an externally rendered,\n     * layouted label.\n     *\n     * @param {Rect} bounds\n     * @param {string} text\n     *\n     * @return {Rect}\n     */\n    this.getExternalLabelBounds = function(bounds, text) {\n\n      var layoutedDimensions = textUtil.getDimensions(text, {\n        box: {\n          width: 90,\n          height: 30\n        },\n        style: externalStyle\n      });\n\n      // resize label shape to fit label text\n      return {\n        x: Math.round(bounds.x + bounds.width / 2 - layoutedDimensions.width / 2),\n        y: Math.round(bounds.y),\n        width: Math.ceil(layoutedDimensions.width),\n        height: Math.ceil(layoutedDimensions.height)\n      };\n\n    };\n\n    /**\n     * Get the new bounds of text annotation.\n     *\n     * @param {Rect} bounds\n     * @param {string} text\n     *\n     * @return {Rect}\n     */\n    this.getTextAnnotationBounds = function(bounds, text) {\n\n      var layoutedDimensions = textUtil.getDimensions(text, {\n        box: bounds,\n        style: defaultStyle,\n        align: 'left-top',\n        padding: 5\n      });\n\n      return {\n        x: bounds.x,\n        y: bounds.y,\n        width: bounds.width,\n        height: Math.max(MIN_TEXT_ANNOTATION_HEIGHT, Math.round(layoutedDimensions.height))\n      };\n    };\n\n    /**\n     * Create a layouted text element.\n     *\n     * @param {string} text\n     * @param {TextLayoutConfig} [options]\n     *\n     * @return {SVGElement} rendered text\n     */\n    this.createText = function(text, options) {\n      return textUtil.createText(text, options || {});\n    };\n\n    /**\n     * Get default text style.\n     */\n    this.getDefaultStyle = function() {\n      return defaultStyle;\n    };\n\n    /**\n     * Get the external text style.\n     */\n    this.getExternalStyle = function() {\n      return externalStyle;\n    };\n\n  }\n\n  TextRenderer.$inject = [\n    'config.textRenderer'\n  ];\n\n  /**\n   * Map containing SVG paths needed by BpmnRenderer\n   */\n  function PathMap() {\n\n    /**\n     * Contains a map of path elements\n     *\n     * <h1>Path definition</h1>\n     * A parameterized path is defined like this:\n     * <pre>\n     * 'GATEWAY_PARALLEL': {\n     *   d: 'm {mx},{my} {e.x0},0 0,{e.x1} {e.x1},0 0,{e.y0} -{e.x1},0 0,{e.y1} ' +\n            '-{e.x0},0 0,-{e.y1} -{e.x1},0 0,-{e.y0} {e.x1},0 z',\n     *   height: 17.5,\n     *   width:  17.5,\n     *   heightElements: [2.5, 7.5],\n     *   widthElements: [2.5, 7.5]\n     * }\n     * </pre>\n     * <p>It's important to specify a correct <b>height and width</b> for the path as the scaling\n     * is based on the ratio between the specified height and width in this object and the\n     * height and width that is set as scale target (Note x,y coordinates will be scaled with\n     * individual ratios).</p>\n     * <p>The '<b>heightElements</b>' and '<b>widthElements</b>' array must contain the values that will be scaled.\n     * The scaling is based on the computed ratios.\n     * Coordinates on the y axis should be in the <b>heightElement</b>'s array, they will be scaled using\n     * the computed ratio coefficient.\n     * In the parameterized path the scaled values can be accessed through the 'e' object in {} brackets.\n     *   <ul>\n     *    <li>The values for the y axis can be accessed in the path string using {e.y0}, {e.y1}, ....</li>\n     *    <li>The values for the x axis can be accessed in the path string using {e.x0}, {e.x1}, ....</li>\n     *   </ul>\n     *   The numbers x0, x1 respectively y0, y1, ... map to the corresponding array index.\n     * </p>\n     */\n    this.pathMap = {\n      'EVENT_MESSAGE': {\n        d: 'm {mx},{my} l 0,{e.y1} l {e.x1},0 l 0,-{e.y1} z l {e.x0},{e.y0} l {e.x0},-{e.y0}',\n        height: 36,\n        width:  36,\n        heightElements: [ 6, 14 ],\n        widthElements: [ 10.5, 21 ]\n      },\n      'EVENT_SIGNAL': {\n        d: 'M {mx},{my} l {e.x0},{e.y0} l -{e.x1},0 Z',\n        height: 36,\n        width: 36,\n        heightElements: [ 18 ],\n        widthElements: [ 10, 20 ]\n      },\n      'EVENT_ESCALATION': {\n        d: 'M {mx},{my} l {e.x0},{e.y0} l -{e.x0},-{e.y1} l -{e.x0},{e.y1} Z',\n        height: 36,\n        width: 36,\n        heightElements: [ 20, 7 ],\n        widthElements: [ 8 ]\n      },\n      'EVENT_CONDITIONAL': {\n        d: 'M {e.x0},{e.y0} l {e.x1},0 l 0,{e.y2} l -{e.x1},0 Z ' +\n           'M {e.x2},{e.y3} l {e.x0},0 ' +\n           'M {e.x2},{e.y4} l {e.x0},0 ' +\n           'M {e.x2},{e.y5} l {e.x0},0 ' +\n           'M {e.x2},{e.y6} l {e.x0},0 ' +\n           'M {e.x2},{e.y7} l {e.x0},0 ' +\n           'M {e.x2},{e.y8} l {e.x0},0 ',\n        height: 36,\n        width:  36,\n        heightElements: [ 8.5, 14.5, 18, 11.5, 14.5, 17.5, 20.5, 23.5, 26.5 ],\n        widthElements:  [ 10.5, 14.5, 12.5 ]\n      },\n      'EVENT_LINK': {\n        d: 'm {mx},{my} 0,{e.y0} -{e.x1},0 0,{e.y1} {e.x1},0 0,{e.y0} {e.x0},-{e.y2} -{e.x0},-{e.y2} z',\n        height: 36,\n        width: 36,\n        heightElements: [ 4.4375, 6.75, 7.8125 ],\n        widthElements: [ 9.84375, 13.5 ]\n      },\n      'EVENT_ERROR': {\n        d: 'm {mx},{my} {e.x0},-{e.y0} {e.x1},-{e.y1} {e.x2},{e.y2} {e.x3},-{e.y3} -{e.x4},{e.y4} -{e.x5},-{e.y5} z',\n        height: 36,\n        width: 36,\n        heightElements: [ 0.023, 8.737, 8.151, 16.564, 10.591, 8.714 ],\n        widthElements: [ 0.085, 6.672, 6.97, 4.273, 5.337, 6.636 ]\n      },\n      'EVENT_CANCEL_45': {\n        d: 'm {mx},{my} -{e.x1},0 0,{e.x0} {e.x1},0 0,{e.y1} {e.x0},0 ' +\n          '0,-{e.y1} {e.x1},0 0,-{e.y0} -{e.x1},0 0,-{e.y1} -{e.x0},0 z',\n        height: 36,\n        width: 36,\n        heightElements: [ 4.75, 8.5 ],\n        widthElements: [ 4.75, 8.5 ]\n      },\n      'EVENT_COMPENSATION': {\n        d: 'm {mx},{my} {e.x0},-{e.y0} 0,{e.y1} z m {e.x1},-{e.y2} {e.x2},-{e.y3} 0,{e.y1} -{e.x2},-{e.y3} z',\n        height: 36,\n        width: 36,\n        heightElements: [ 6.5, 13, 0.4, 6.1 ],\n        widthElements: [ 9, 9.3, 8.7 ]\n      },\n      'EVENT_TIMER_WH': {\n        d: 'M {mx},{my} l {e.x0},-{e.y0} m -{e.x0},{e.y0} l {e.x1},{e.y1} ',\n        height: 36,\n        width:  36,\n        heightElements: [ 10, 2 ],\n        widthElements: [ 3, 7 ]\n      },\n      'EVENT_TIMER_LINE': {\n        d:  'M {mx},{my} ' +\n            'm {e.x0},{e.y0} l -{e.x1},{e.y1} ',\n        height: 36,\n        width:  36,\n        heightElements: [ 10, 3 ],\n        widthElements: [ 0, 0 ]\n      },\n      'EVENT_MULTIPLE': {\n        d:'m {mx},{my} {e.x1},-{e.y0} {e.x1},{e.y0} -{e.x0},{e.y1} -{e.x2},0 z',\n        height: 36,\n        width:  36,\n        heightElements: [ 6.28099, 12.56199 ],\n        widthElements: [ 3.1405, 9.42149, 12.56198 ]\n      },\n      'EVENT_PARALLEL_MULTIPLE': {\n        d:'m {mx},{my} {e.x0},0 0,{e.y1} {e.x1},0 0,{e.y0} -{e.x1},0 0,{e.y1} ' +\n          '-{e.x0},0 0,-{e.y1} -{e.x1},0 0,-{e.y0} {e.x1},0 z',\n        height: 36,\n        width:  36,\n        heightElements: [ 2.56228, 7.68683 ],\n        widthElements: [ 2.56228, 7.68683 ]\n      },\n      'GATEWAY_EXCLUSIVE': {\n        d:'m {mx},{my} {e.x0},{e.y0} {e.x1},{e.y0} {e.x2},0 {e.x4},{e.y2} ' +\n                      '{e.x4},{e.y1} {e.x2},0 {e.x1},{e.y3} {e.x0},{e.y3} ' +\n                      '{e.x3},0 {e.x5},{e.y1} {e.x5},{e.y2} {e.x3},0 z',\n        height: 17.5,\n        width:  17.5,\n        heightElements: [ 8.5, 6.5312, -6.5312, -8.5 ],\n        widthElements:  [ 6.5, -6.5, 3, -3, 5, -5 ]\n      },\n      'GATEWAY_PARALLEL': {\n        d:'m {mx},{my} 0,{e.y1} -{e.x1},0 0,{e.y0} {e.x1},0 0,{e.y1} {e.x0},0 ' +\n          '0,-{e.y1} {e.x1},0 0,-{e.y0} -{e.x1},0 0,-{e.y1} -{e.x0},0 z',\n        height: 30,\n        width:  30,\n        heightElements: [ 5, 12.5 ],\n        widthElements: [ 5, 12.5 ]\n      },\n      'GATEWAY_EVENT_BASED': {\n        d:'m {mx},{my} {e.x0},{e.y0} {e.x0},{e.y1} {e.x1},{e.y2} {e.x2},0 z',\n        height: 11,\n        width:  11,\n        heightElements: [ -6, 6, 12, -12 ],\n        widthElements: [ 9, -3, -12 ]\n      },\n      'GATEWAY_COMPLEX': {\n        d:'m {mx},{my} 0,{e.y0} -{e.x0},-{e.y1} -{e.x1},{e.y2} {e.x0},{e.y1} -{e.x2},0 0,{e.y3} ' +\n          '{e.x2},0  -{e.x0},{e.y1} l {e.x1},{e.y2} {e.x0},-{e.y1} 0,{e.y0} {e.x3},0 0,-{e.y0} {e.x0},{e.y1} ' +\n          '{e.x1},-{e.y2} -{e.x0},-{e.y1} {e.x2},0 0,-{e.y3} -{e.x2},0 {e.x0},-{e.y1} -{e.x1},-{e.y2} ' +\n          '-{e.x0},{e.y1} 0,-{e.y0} -{e.x3},0 z',\n        height: 17.125,\n        width:  17.125,\n        heightElements: [ 4.875, 3.4375, 2.125, 3 ],\n        widthElements: [ 3.4375, 2.125, 4.875, 3 ]\n      },\n      'DATA_OBJECT_PATH': {\n        d:'m 0,0 {e.x1},0 {e.x0},{e.y0} 0,{e.y1} -{e.x2},0 0,-{e.y2} {e.x1},0 0,{e.y0} {e.x0},0',\n        height: 61,\n        width:  51,\n        heightElements: [ 10, 50, 60 ],\n        widthElements: [ 10, 40, 50, 60 ]\n      },\n      'DATA_OBJECT_COLLECTION_PATH': {\n        d: 'm{mx},{my} m 3,2 l 0,10 m 3,-10 l 0,10 m 3,-10 l 0,10',\n        height: 10,\n        width: 10,\n        heightElements: [],\n        widthElements: []\n      },\n      'DATA_ARROW': {\n        d:'m 5,9 9,0 0,-3 5,5 -5,5 0,-3 -9,0 z',\n        height: 61,\n        width:  51,\n        heightElements: [],\n        widthElements: []\n      },\n      'DATA_STORE': {\n        d:'m  {mx},{my} ' +\n          'l  0,{e.y2} ' +\n          'c  {e.x0},{e.y1} {e.x1},{e.y1}  {e.x2},0 ' +\n          'l  0,-{e.y2} ' +\n          'c -{e.x0},-{e.y1} -{e.x1},-{e.y1} -{e.x2},0' +\n          'c  {e.x0},{e.y1} {e.x1},{e.y1}  {e.x2},0 ' +\n          'm  -{e.x2},{e.y0}' +\n          'c  {e.x0},{e.y1} {e.x1},{e.y1} {e.x2},0' +\n          'm  -{e.x2},{e.y0}' +\n          'c  {e.x0},{e.y1} {e.x1},{e.y1}  {e.x2},0',\n        height: 61,\n        width:  61,\n        heightElements: [ 7, 10, 45 ],\n        widthElements:  [ 2, 58, 60 ]\n      },\n      'TEXT_ANNOTATION': {\n        d: 'm {mx}, {my} m 10,0 l -10,0 l 0,{e.y0} l 10,0',\n        height: 30,\n        width: 10,\n        heightElements: [ 30 ],\n        widthElements: [ 10 ]\n      },\n      'MARKER_SUB_PROCESS': {\n        d: 'm{mx},{my} m 7,2 l 0,10 m -5,-5 l 10,0',\n        height: 10,\n        width: 10,\n        heightElements: [],\n        widthElements: []\n      },\n      'MARKER_PARALLEL': {\n        d: 'm{mx},{my} m 3,2 l 0,10 m 3,-10 l 0,10 m 3,-10 l 0,10',\n        height: 10,\n        width: 10,\n        heightElements: [],\n        widthElements: []\n      },\n      'MARKER_SEQUENTIAL': {\n        d: 'm{mx},{my} m 0,3 l 10,0 m -10,3 l 10,0 m -10,3 l 10,0',\n        height: 10,\n        width: 10,\n        heightElements: [],\n        widthElements: []\n      },\n      'MARKER_COMPENSATION': {\n        d: 'm {mx},{my} 7,-5 0,10 z m 7.1,-0.3 6.9,-4.7 0,10 -6.9,-4.7 z',\n        height: 10,\n        width: 21,\n        heightElements: [],\n        widthElements: []\n      },\n      'MARKER_LOOP': {\n        d: 'm {mx},{my} c 3.526979,0 6.386161,-2.829858 6.386161,-6.320661 0,-3.490806 -2.859182,-6.320661 ' +\n          '-6.386161,-6.320661 -3.526978,0 -6.38616,2.829855 -6.38616,6.320661 0,1.745402 ' +\n          '0.714797,3.325567 1.870463,4.469381 0.577834,0.571908 1.265885,1.034728 2.029916,1.35457 ' +\n          'l -0.718163,-3.909793 m 0.718163,3.909793 -3.885211,0.802902',\n        height: 13.9,\n        width: 13.7,\n        heightElements: [],\n        widthElements: []\n      },\n      'MARKER_ADHOC': {\n        d: 'm {mx},{my} m 0.84461,2.64411 c 1.05533,-1.23780996 2.64337,-2.07882 4.29653,-1.97997996 2.05163,0.0805 ' +\n          '3.85579,1.15803 5.76082,1.79107 1.06385,0.34139996 2.24454,0.1438 3.18759,-0.43767 0.61743,-0.33642 ' +\n          '1.2775,-0.64078 1.7542,-1.17511 0,0.56023 0,1.12046 0,1.6807 -0.98706,0.96237996 -2.29792,1.62393996 ' +\n          '-3.6918,1.66181996 -1.24459,0.0927 -2.46671,-0.2491 -3.59505,-0.74812 -1.35789,-0.55965 ' +\n          '-2.75133,-1.33436996 -4.27027,-1.18121996 -1.37741,0.14601 -2.41842,1.13685996 -3.44288,1.96782996 z',\n        height: 4,\n        width: 15,\n        heightElements: [],\n        widthElements: []\n      },\n      'TASK_TYPE_SEND': {\n        d: 'm {mx},{my} l 0,{e.y1} l {e.x1},0 l 0,-{e.y1} z l {e.x0},{e.y0} l {e.x0},-{e.y0}',\n        height: 14,\n        width:  21,\n        heightElements: [ 6, 14 ],\n        widthElements: [ 10.5, 21 ]\n      },\n      'TASK_TYPE_SCRIPT': {\n        d: 'm {mx},{my} c 9.966553,-6.27276 -8.000926,-7.91932 2.968968,-14.938 l -8.802728,0 ' +\n          'c -10.969894,7.01868 6.997585,8.66524 -2.968967,14.938 z ' +\n          'm -7,-12 l 5,0 ' +\n          'm -4.5,3 l 4.5,0 ' +\n          'm -3,3 l 5,0' +\n          'm -4,3 l 5,0',\n        height: 15,\n        width:  12.6,\n        heightElements: [ 6, 14 ],\n        widthElements: [ 10.5, 21 ]\n      },\n      'TASK_TYPE_USER_1': {\n        d: 'm {mx},{my} c 0.909,-0.845 1.594,-2.049 1.594,-3.385 0,-2.554 -1.805,-4.62199999 ' +\n          '-4.357,-4.62199999 -2.55199998,0 -4.28799998,2.06799999 -4.28799998,4.62199999 0,1.348 ' +\n          '0.974,2.562 1.89599998,3.405 -0.52899998,0.187 -5.669,2.097 -5.794,4.7560005 v 6.718 ' +\n          'h 17 v -6.718 c 0,-2.2980005 -5.5279996,-4.5950005 -6.0509996,-4.7760005 z' +\n          'm -8,6 l 0,5.5 m 11,0 l 0,-5'\n      },\n      'TASK_TYPE_USER_2': {\n        d: 'm {mx},{my} m 2.162,1.009 c 0,2.4470005 -2.158,4.4310005 -4.821,4.4310005 ' +\n          '-2.66499998,0 -4.822,-1.981 -4.822,-4.4310005 '\n      },\n      'TASK_TYPE_USER_3': {\n        d: 'm {mx},{my} m -6.9,-3.80 c 0,0 2.25099998,-2.358 4.27399998,-1.177 2.024,1.181 4.221,1.537 ' +\n          '4.124,0.965 -0.098,-0.57 -0.117,-3.79099999 -4.191,-4.13599999 -3.57499998,0.001 ' +\n          '-4.20799998,3.36699999 -4.20699998,4.34799999 z'\n      },\n      'TASK_TYPE_MANUAL': {\n        d: 'm {mx},{my} c 0.234,-0.01 5.604,0.008 8.029,0.004 0.808,0 1.271,-0.172 1.417,-0.752 0.227,-0.898 ' +\n          '-0.334,-1.314 -1.338,-1.316 -2.467,-0.01 -7.886,-0.004 -8.108,-0.004 -0.014,-0.079 0.016,-0.533 0,-0.61 ' +\n          '0.195,-0.042 8.507,0.006 9.616,0.002 0.877,-0.007 1.35,-0.438 1.353,-1.208 0.003,-0.768 -0.479,-1.09 ' +\n          '-1.35,-1.091 -2.968,-0.002 -9.619,-0.013 -9.619,-0.013 v -0.591 c 0,0 5.052,-0.016 7.225,-0.016 ' +\n          '0.888,-0.002 1.354,-0.416 1.351,-1.193 -0.006,-0.761 -0.492,-1.196 -1.361,-1.196 -3.473,-0.005 ' +\n          '-10.86,-0.003 -11.0829995,-0.003 -0.022,-0.047 -0.045,-0.094 -0.069,-0.139 0.3939995,-0.319 ' +\n          '2.0409995,-1.626 2.4149995,-2.017 0.469,-0.4870005 0.519,-1.1650005 0.162,-1.6040005 -0.414,-0.511 ' +\n          '-0.973,-0.5 -1.48,-0.236 -1.4609995,0.764 -6.5999995,3.6430005 -7.7329995,4.2710005 -0.9,0.499 ' +\n          '-1.516,1.253 -1.882,2.19 -0.37000002,0.95 -0.17,2.01 -0.166,2.979 0.004,0.718 -0.27300002,1.345 ' +\n          '-0.055,2.063 0.629,2.087 2.425,3.312 4.859,3.318 4.6179995,0.014 9.2379995,-0.139 13.8569995,-0.158 ' +\n          '0.755,-0.004 1.171,-0.301 1.182,-1.033 0.012,-0.754 -0.423,-0.969 -1.183,-0.973 -1.778,-0.01 ' +\n          '-5.824,-0.004 -6.04,-0.004 10e-4,-0.084 0.003,-0.586 10e-4,-0.67 z'\n      },\n      'TASK_TYPE_INSTANTIATING_SEND': {\n        d: 'm {mx},{my} l 0,8.4 l 12.6,0 l 0,-8.4 z l 6.3,3.6 l 6.3,-3.6'\n      },\n      'TASK_TYPE_SERVICE': {\n        d: 'm {mx},{my} v -1.71335 c 0.352326,-0.0705 0.703932,-0.17838 1.047628,-0.32133 ' +\n          '0.344416,-0.14465 0.665822,-0.32133 0.966377,-0.52145 l 1.19431,1.18005 1.567487,-1.57688 ' +\n          '-1.195028,-1.18014 c 0.403376,-0.61394 0.683079,-1.29908 0.825447,-2.01824 l 1.622133,-0.01 ' +\n          'v -2.2196 l -1.636514,0.01 c -0.07333,-0.35153 -0.178319,-0.70024 -0.323564,-1.04372 ' +\n          '-0.145244,-0.34406 -0.321407,-0.6644 -0.522735,-0.96217 l 1.131035,-1.13631 -1.583305,-1.56293 ' +\n          '-1.129598,1.13589 c -0.614052,-0.40108 -1.302883,-0.68093 -2.022633,-0.82247 l 0.0093,-1.61852 ' +\n          'h -2.241173 l 0.0042,1.63124 c -0.353763,0.0736 -0.705369,0.17977 -1.049785,0.32371 -0.344415,0.14437 ' +\n          '-0.665102,0.32092 -0.9635006,0.52046 l -1.1698628,-1.15823 -1.5667691,1.5792 1.1684265,1.15669 ' +\n          'c -0.4026573,0.61283 -0.68308,1.29797 -0.8247287,2.01713 l -1.6588041,0.003 v 2.22174 ' +\n          'l 1.6724648,-0.006 c 0.073327,0.35077 0.1797598,0.70243 0.3242851,1.04472 0.1452428,0.34448 ' +\n          '0.3214064,0.6644 0.5227339,0.96066 l -1.1993431,1.19723 1.5840256,1.56011 1.1964668,-1.19348 ' +\n          'c 0.6140517,0.40346 1.3028827,0.68232 2.0233517,0.82331 l 7.19e-4,1.69892 h 2.226848 z ' +\n          'm 0.221462,-3.9957 c -1.788948,0.7502 -3.8576,-0.0928 -4.6097055,-1.87438 -0.7521065,-1.78321 ' +\n          '0.090598,-3.84627 1.8802645,-4.59604 1.78823,-0.74936 3.856881,0.0929 4.608987,1.87437 ' +\n          '0.752106,1.78165 -0.0906,3.84612 -1.879546,4.59605 z'\n      },\n      'TASK_TYPE_SERVICE_FILL': {\n        d: 'm {mx},{my} c -1.788948,0.7502 -3.8576,-0.0928 -4.6097055,-1.87438 -0.7521065,-1.78321 ' +\n          '0.090598,-3.84627 1.8802645,-4.59604 1.78823,-0.74936 3.856881,0.0929 4.608987,1.87437 ' +\n          '0.752106,1.78165 -0.0906,3.84612 -1.879546,4.59605 z'\n      },\n      'TASK_TYPE_BUSINESS_RULE_HEADER': {\n        d: 'm {mx},{my} 0,4 20,0 0,-4 z'\n      },\n      'TASK_TYPE_BUSINESS_RULE_MAIN': {\n        d: 'm {mx},{my} 0,12 20,0 0,-12 z' +\n          'm 0,8 l 20,0 ' +\n          'm -13,-4 l 0,8'\n      },\n      'MESSAGE_FLOW_MARKER': {\n        d: 'm {mx},{my} m -10.5 ,-7 l 0,14 l 21,0 l 0,-14 z l 10.5,6 l 10.5,-6'\n      }\n    };\n\n    /**\n     * Return raw path for the given ID.\n     *\n     * @param {string} pathId\n     *\n     * @return {string} raw path\n     */\n    this.getRawPath = function getRawPath(pathId) {\n      return this.pathMap[pathId].d;\n    };\n\n    /**\n     * Scales the path to the given height and width.\n     * <h1>Use case</h1>\n     * <p>Use case is to scale the content of elements (event, gateways) based\n     * on the element bounding box's size.\n     * </p>\n     * <h1>Why not transform</h1>\n     * <p>Scaling a path with transform() will also scale the stroke and IE does not support\n     * the option 'non-scaling-stroke' to prevent this.\n     * Also there are use cases where only some parts of a path should be\n     * scaled.</p>\n     *\n     * @param {string} pathId The ID of the path.\n     * @param {Object} param <p>\n     *   Example param object scales the path to 60% size of the container (data.width, data.height).\n     *   <pre>\n     *   {\n     *     xScaleFactor: 0.6,\n     *     yScaleFactor:0.6,\n     *     containerWidth: data.width,\n     *     containerHeight: data.height,\n     *     position: {\n     *       mx: 0.46,\n     *       my: 0.2,\n     *     }\n     *   }\n     *   </pre>\n     *   <ul>\n     *    <li>targetpathwidth = xScaleFactor * containerWidth</li>\n     *    <li>targetpathheight = yScaleFactor * containerHeight</li>\n     *    <li>Position is used to set the starting coordinate of the path. M is computed:\n      *    <ul>\n      *      <li>position.x * containerWidth</li>\n      *      <li>position.y * containerHeight</li>\n      *    </ul>\n      *    Center of the container <pre> position: {\n     *       mx: 0.5,\n     *       my: 0.5,\n     *     }</pre>\n     *     Upper left corner of the container\n     *     <pre> position: {\n     *       mx: 0.0,\n     *       my: 0.0,\n     *     }</pre>\n     *    </li>\n     *   </ul>\n     * </p>\n     *\n     * @return {string} scaled path\n     */\n    this.getScaledPath = function getScaledPath(pathId, param) {\n      var rawPath = this.pathMap[pathId];\n\n      // positioning\n      // compute the start point of the path\n      var mx, my;\n\n      if (param.abspos) {\n        mx = param.abspos.x;\n        my = param.abspos.y;\n      } else {\n        mx = param.containerWidth * param.position.mx;\n        my = param.containerHeight * param.position.my;\n      }\n\n      var coordinates = {}; // map for the scaled coordinates\n      if (param.position) {\n\n        // path\n        var heightRatio = (param.containerHeight / rawPath.height) * param.yScaleFactor;\n        var widthRatio = (param.containerWidth / rawPath.width) * param.xScaleFactor;\n\n\n        // Apply height ratio\n        for (var heightIndex = 0; heightIndex < rawPath.heightElements.length; heightIndex++) {\n          coordinates['y' + heightIndex] = rawPath.heightElements[heightIndex] * heightRatio;\n        }\n\n        // Apply width ratio\n        for (var widthIndex = 0; widthIndex < rawPath.widthElements.length; widthIndex++) {\n          coordinates['x' + widthIndex] = rawPath.widthElements[widthIndex] * widthRatio;\n        }\n      }\n\n      // Apply value to raw path\n      var path = format(\n        rawPath.d, {\n          mx: mx,\n          my: my,\n          e: coordinates\n        }\n      );\n      return path;\n    };\n  }\n\n  // helpers //////////////////////\n\n  // copied and adjusted from https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js\n  var tokenRegex = /\\{([^{}]+)\\}/g,\n      objNotationRegex = /(?:(?:^|\\.)(.+?)(?=\\[|\\.|$|\\()|\\[('|\")(.+?)\\2\\])(\\(\\))?/g; // matches .xxxxx or [\"xxxxx\"] to run over object properties\n\n  function replacer(all, key, obj) {\n    var res = obj;\n    key.replace(objNotationRegex, function(all, name, quote, quotedName, isFunc) {\n      name = name || quotedName;\n      if (res) {\n        if (name in res) {\n          res = res[name];\n        }\n        typeof res == 'function' && isFunc && (res = res());\n      }\n    });\n    res = (res == null || res == obj ? all : res) + '';\n\n    return res;\n  }\n\n  function format(str, obj) {\n    return String(str).replace(tokenRegex, function(all, key) {\n      return replacer(all, key, obj);\n    });\n  }\n\n  var DrawModule = {\n    __init__: [ 'bpmnRenderer' ],\n    bpmnRenderer: [ 'type', BpmnRenderer ],\n    textRenderer: [ 'type', TextRenderer ],\n    pathMap: [ 'type', PathMap ]\n  };\n\n  /**\n   * @typedef { {\n   *   [key: string]: string;\n   * } } TranslateReplacements\n   */\n\n  /**\n   * A simple translation stub to be used for multi-language support\n   * in diagrams. Can be easily replaced with a more sophisticated\n   * solution.\n   *\n   * @example\n   *\n   * ```javascript\n   * // use it inside any diagram component by injecting `translate`.\n   *\n   * function MyService(translate) {\n   *   alert(translate('HELLO {you}', { you: 'You!' }));\n   * }\n   * ```\n   *\n   * @param {string} template to interpolate\n   * @param {TranslateReplacements} [replacements] a map with substitutes\n   *\n   * @return {string} the translated string\n   */\n  function translate$1(template, replacements) {\n\n    replacements = replacements || {};\n\n    return template.replace(/{([^}]+)}/g, function(_, key) {\n      return replacements[key] || '{' + key + '}';\n    });\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var translate = {\n    translate: [ 'value', translate$1 ]\n  };\n\n  /**\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n   *\n   * @typedef {import('../features/modeling/ElementFactory').default} ElementFactory\n   * @typedef {import('../draw/TextRenderer').default} TextRenderer\n   *\n   * @typedef {import('../model/Types').Element} Element\n   * @typedef {import('../model/Types').Label} Label\n   * @typedef {import('../model/Types').Shape} Shape\n   * @typedef {import('../model/Types').Connection} Connection\n   * @typedef {import('../model/Types').Root} Root\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   */\n\n  /**\n   * @param {ModdleElement} semantic\n   * @param {ModdleElement} di\n   * @param {Object} [attrs=null]\n   *\n   * @return {Object}\n   */\n  function elementData(semantic, di, attrs) {\n    return assign$1({\n      id: semantic.id,\n      type: semantic.$type,\n      businessObject: semantic,\n      di: di\n    }, attrs);\n  }\n\n  function getWaypoints(di, source, target) {\n\n    var waypoints = di.waypoint;\n\n    if (!waypoints || waypoints.length < 2) {\n      return [ getMid(source), getMid(target) ];\n    }\n\n    return waypoints.map(function(p) {\n      return { x: p.x, y: p.y };\n    });\n  }\n\n  function notYetDrawn(translate, semantic, refSemantic, property) {\n    return new Error(translate('element {element} referenced by {referenced}#{property} not yet drawn', {\n      element: elementToString(refSemantic),\n      referenced: elementToString(semantic),\n      property: property\n    }));\n  }\n\n\n  /**\n   * An importer that adds bpmn elements to the canvas\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {ElementFactory} elementFactory\n   * @param {ElementRegistry} elementRegistry\n   * @param {Function} translate\n   * @param {TextRenderer} textRenderer\n   */\n  function BpmnImporter(\n      eventBus, canvas, elementFactory,\n      elementRegistry, translate, textRenderer) {\n\n    this._eventBus = eventBus;\n    this._canvas = canvas;\n    this._elementFactory = elementFactory;\n    this._elementRegistry = elementRegistry;\n    this._translate = translate;\n    this._textRenderer = textRenderer;\n  }\n\n  BpmnImporter.$inject = [\n    'eventBus',\n    'canvas',\n    'elementFactory',\n    'elementRegistry',\n    'translate',\n    'textRenderer'\n  ];\n\n\n  /**\n   * Add a BPMN element (semantic) to the canvas making it a child of the\n   * given parent.\n   *\n   * @param {ModdleElement} semantic\n   * @param {ModdleElement} di\n   * @param {Shape} parentElement\n   *\n   * @return {Shape | Root | Connection}\n   */\n  BpmnImporter.prototype.add = function(semantic, di, parentElement) {\n    var element,\n        translate = this._translate,\n        hidden;\n\n    var parentIndex;\n\n    // ROOT ELEMENT\n    // handle the special case that we deal with a\n    // invisible root element (process, subprocess or collaboration)\n    if (is$1(di, 'bpmndi:BPMNPlane')) {\n\n      var attrs = is$1(semantic, 'bpmn:SubProcess')\n        ? { id: semantic.id + '_plane' }\n        : {};\n\n      // add a virtual element (not being drawn)\n      element = this._elementFactory.createRoot(elementData(semantic, di, attrs));\n\n      this._canvas.addRootElement(element);\n    }\n\n    // SHAPE\n    else if (is$1(di, 'bpmndi:BPMNShape')) {\n\n      var collapsed = !isExpanded(semantic, di),\n          isFrame = isFrameElement(semantic);\n\n      hidden = parentElement && (parentElement.hidden || parentElement.collapsed);\n\n      var bounds = di.bounds;\n\n      element = this._elementFactory.createShape(elementData(semantic, di, {\n        collapsed: collapsed,\n        hidden: hidden,\n        x: Math.round(bounds.x),\n        y: Math.round(bounds.y),\n        width: Math.round(bounds.width),\n        height: Math.round(bounds.height),\n        isFrame: isFrame\n      }));\n\n      if (is$1(semantic, 'bpmn:BoundaryEvent')) {\n        this._attachBoundary(semantic, element);\n      }\n\n      // insert lanes behind other flow nodes (cf. #727)\n      if (is$1(semantic, 'bpmn:Lane')) {\n        parentIndex = 0;\n      }\n\n      if (is$1(semantic, 'bpmn:DataStoreReference')) {\n\n        // check whether data store is inside our outside of its semantic parent\n        if (!isPointInsideBBox$1(parentElement, getMid(bounds))) {\n          parentElement = this._canvas.findRoot(parentElement);\n        }\n      }\n\n      this._canvas.addShape(element, parentElement, parentIndex);\n    }\n\n    // CONNECTION\n    else if (is$1(di, 'bpmndi:BPMNEdge')) {\n\n      var source = this._getSource(semantic),\n          target = this._getTarget(semantic);\n\n      hidden = parentElement && (parentElement.hidden || parentElement.collapsed);\n\n      element = this._elementFactory.createConnection(elementData(semantic, di, {\n        hidden: hidden,\n        source: source,\n        target: target,\n        waypoints: getWaypoints(di, source, target)\n      }));\n\n      if (is$1(semantic, 'bpmn:DataAssociation')) {\n\n        // render always on top; this ensures DataAssociations\n        // are rendered correctly across different \"hacks\" people\n        // love to model such as cross participant / sub process\n        // associations\n        parentElement = this._canvas.findRoot(parentElement);\n      }\n\n      this._canvas.addConnection(element, parentElement, parentIndex);\n    } else {\n      throw new Error(translate('unknown di {di} for element {semantic}', {\n        di: elementToString(di),\n        semantic: elementToString(semantic)\n      }));\n    }\n\n    // (optional) LABEL\n    if (isLabelExternal(semantic) && getLabel(element)) {\n      this.addLabel(semantic, di, element);\n    }\n\n\n    this._eventBus.fire('bpmnElement.added', { element: element });\n\n    return element;\n  };\n\n\n  /**\n   * Attach a boundary element to the given host.\n   *\n   * @param {ModdleElement} boundarySemantic\n   * @param {Shape} boundaryElement\n   */\n  BpmnImporter.prototype._attachBoundary = function(boundarySemantic, boundaryElement) {\n    var translate = this._translate;\n    var hostSemantic = boundarySemantic.attachedToRef;\n\n    if (!hostSemantic) {\n      throw new Error(translate('missing {semantic}#attachedToRef', {\n        semantic: elementToString(boundarySemantic)\n      }));\n    }\n\n    var host = this._elementRegistry.get(hostSemantic.id),\n        attachers = host && host.attachers;\n\n    if (!host) {\n      throw notYetDrawn(translate, boundarySemantic, hostSemantic, 'attachedToRef');\n    }\n\n    // wire element.host <> host.attachers\n    boundaryElement.host = host;\n\n    if (!attachers) {\n      host.attachers = attachers = [];\n    }\n\n    if (attachers.indexOf(boundaryElement) === -1) {\n      attachers.push(boundaryElement);\n    }\n  };\n\n\n  /**\n   * Add a label to a given element.\n   *\n   * @param {ModdleElement} semantic\n   * @param {ModdleElement} di\n   * @param {Element} element\n   *\n   * @return {Label}\n   */\n  BpmnImporter.prototype.addLabel = function(semantic, di, element) {\n    var bounds,\n        text,\n        label;\n\n    bounds = getExternalLabelBounds(di, element);\n\n    text = getLabel(element);\n\n    if (text) {\n\n      // get corrected bounds from actual layouted text\n      bounds = this._textRenderer.getExternalLabelBounds(bounds, text);\n    }\n\n    label = this._elementFactory.createLabel(elementData(semantic, di, {\n      id: semantic.id + '_label',\n      labelTarget: element,\n      type: 'label',\n      hidden: element.hidden || !getLabel(element),\n      x: Math.round(bounds.x),\n      y: Math.round(bounds.y),\n      width: Math.round(bounds.width),\n      height: Math.round(bounds.height)\n    }));\n\n    return this._canvas.addShape(label, element.parent);\n  };\n\n  /**\n   * Get the source or target of the given connection.\n   *\n   * @param {ModdleElement} semantic\n   * @param {'source' | 'target'} side\n   *\n   * @return {Element}\n   */\n  BpmnImporter.prototype._getConnectedElement = function(semantic, side) {\n\n    var element,\n        refSemantic,\n        type = semantic.$type,\n        translate = this._translate;\n\n    refSemantic = semantic[side + 'Ref'];\n\n    // handle mysterious isMany DataAssociation#sourceRef\n    if (side === 'source' && type === 'bpmn:DataInputAssociation') {\n      refSemantic = refSemantic && refSemantic[0];\n    }\n\n    // fix source / target for DataInputAssociation / DataOutputAssociation\n    if (side === 'source' && type === 'bpmn:DataOutputAssociation' ||\n        side === 'target' && type === 'bpmn:DataInputAssociation') {\n\n      refSemantic = semantic.$parent;\n    }\n\n    element = refSemantic && this._getElement(refSemantic);\n\n    if (element) {\n      return element;\n    }\n\n    if (refSemantic) {\n      throw notYetDrawn(translate, semantic, refSemantic, side + 'Ref');\n    } else {\n      throw new Error(translate('{semantic}#{side} Ref not specified', {\n        semantic: elementToString(semantic),\n        side: side\n      }));\n    }\n  };\n\n  BpmnImporter.prototype._getSource = function(semantic) {\n    return this._getConnectedElement(semantic, 'source');\n  };\n\n  BpmnImporter.prototype._getTarget = function(semantic) {\n    return this._getConnectedElement(semantic, 'target');\n  };\n\n\n  BpmnImporter.prototype._getElement = function(semantic) {\n    return this._elementRegistry.get(semantic.id);\n  };\n\n\n  // helpers ////////////////////\n\n  function isPointInsideBBox$1(bbox, point) {\n    var x = point.x,\n        y = point.y;\n\n    return x >= bbox.x &&\n      x <= bbox.x + bbox.width &&\n      y >= bbox.y &&\n      y <= bbox.y + bbox.height;\n  }\n\n  function isFrameElement(semantic) {\n    return is$1(semantic, 'bpmn:Group');\n  }\n\n  var ImportModule = {\n    __depends__: [\n      translate\n    ],\n    bpmnImporter: [ 'type', BpmnImporter ]\n  };\n\n  var CoreModule = {\n    __depends__: [\n      DrawModule,\n      ImportModule\n    ]\n  };\n\n  /**\n   * @typedef {import('../util/Types').Point} Point\n   */\n\n  function __stopPropagation(event) {\n    if (!event || typeof event.stopPropagation !== 'function') {\n      return;\n    }\n\n    event.stopPropagation();\n  }\n\n  /**\n   * @param {import('../core/EventBus').Event} event\n   *\n   * @return {Event}\n   */\n  function getOriginal$1(event) {\n    return event.originalEvent || event.srcEvent;\n  }\n\n  /**\n   * @param {Event|import('../core/EventBus').Event} event\n   */\n  function stopPropagation$1(event) {\n    __stopPropagation(event);\n    __stopPropagation(getOriginal$1(event));\n  }\n\n  /**\n   * @param {Event} event\n   *\n   * @return {Point|null}\n   */\n  function toPoint(event) {\n\n    if (event.pointers && event.pointers.length) {\n      event = event.pointers[0];\n    }\n\n    if (event.touches && event.touches.length) {\n      event = event.touches[0];\n    }\n\n    return event ? {\n      x: event.clientX,\n      y: event.clientY\n    } : null;\n  }\n\n  function isMac() {\n    return (/mac/i).test(navigator.platform);\n  }\n\n  /**\n   * @param {MouseEvent} event\n   * @param {string} button\n   *\n   * @return {boolean}\n   */\n  function isButton(event, button) {\n    return (getOriginal$1(event) || event).button === button;\n  }\n\n  /**\n   * @param {MouseEvent} event\n   *\n   * @return {boolean}\n   */\n  function isPrimaryButton(event) {\n\n    // button === 0 -> left áka primary mouse button\n    return isButton(event, 0);\n  }\n\n  /**\n   * @param {MouseEvent} event\n   *\n   * @return {boolean}\n   */\n  function isAuxiliaryButton(event) {\n\n    // button === 1 -> auxiliary áka wheel button\n    return isButton(event, 1);\n  }\n\n  /**\n   * @param {MouseEvent} event\n   *\n   * @return {boolean}\n   */\n  function hasPrimaryModifier(event) {\n    var originalEvent = getOriginal$1(event) || event;\n\n    if (!isPrimaryButton(event)) {\n      return false;\n    }\n\n    // Use cmd as primary modifier key for mac OS\n    if (isMac()) {\n      return originalEvent.metaKey;\n    } else {\n      return originalEvent.ctrlKey;\n    }\n  }\n\n  /**\n   * @param {MouseEvent} event\n   *\n   * @return {boolean}\n   */\n  function hasSecondaryModifier(event) {\n    var originalEvent = getOriginal$1(event) || event;\n\n    return isPrimaryButton(event) && originalEvent.shiftKey;\n  }\n\n  /**\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../../draw/Styles').default} Styles\n   *\n   * @typedef {import('../../util/Types').Point} Point\n   */\n\n  function allowAll(event) { return true; }\n\n  function allowPrimaryAndAuxiliary(event) {\n    return isPrimaryButton(event) || isAuxiliaryButton(event);\n  }\n\n  var LOW_PRIORITY$q = 500;\n\n\n  /**\n   * A plugin that provides interaction events for diagram elements.\n   *\n   * It emits the following events:\n   *\n   *   * element.click\n   *   * element.contextmenu\n   *   * element.dblclick\n   *   * element.hover\n   *   * element.mousedown\n   *   * element.mousemove\n   *   * element.mouseup\n   *   * element.out\n   *\n   * Each event is a tuple { element, gfx, originalEvent }.\n   *\n   * Canceling the event via Event#preventDefault()\n   * prevents the original DOM operation.\n   *\n   * @param {EventBus} eventBus\n   * @param {ElementRegistry} elementRegistry\n   * @param {Styles} styles\n   */\n  function InteractionEvents(eventBus, elementRegistry, styles) {\n\n    var self = this;\n\n    /**\n     * Fire an interaction event.\n     *\n     * @param {string} type local event name, e.g. element.click.\n     * @param {MouseEvent|TouchEvent} event native event\n     * @param {Element} [element] the diagram element to emit the event on;\n     *                                   defaults to the event target\n     */\n    function fire(type, event, element) {\n\n      if (isIgnored(type, event)) {\n        return;\n      }\n\n      var target, gfx, returnValue;\n\n      if (!element) {\n        target = event.delegateTarget || event.target;\n\n        if (target) {\n          gfx = target;\n          element = elementRegistry.get(gfx);\n        }\n      } else {\n        gfx = elementRegistry.getGraphics(element);\n      }\n\n      if (!gfx || !element) {\n        return;\n      }\n\n      returnValue = eventBus.fire(type, {\n        element: element,\n        gfx: gfx,\n        originalEvent: event\n      });\n\n      if (returnValue === false) {\n        event.stopPropagation();\n        event.preventDefault();\n      }\n    }\n\n    // TODO(nikku): document this\n    var handlers = {};\n\n    function mouseHandler(localEventName) {\n      return handlers[localEventName];\n    }\n\n    function isIgnored(localEventName, event) {\n\n      var filter = ignoredFilters[localEventName] || isPrimaryButton;\n\n      // only react on left mouse button interactions\n      // except for interaction events that are enabled\n      // for secundary mouse button\n      return !filter(event);\n    }\n\n    var bindings = {\n      click: 'element.click',\n      contextmenu: 'element.contextmenu',\n      dblclick: 'element.dblclick',\n      mousedown: 'element.mousedown',\n      mousemove: 'element.mousemove',\n      mouseover: 'element.hover',\n      mouseout: 'element.out',\n      mouseup: 'element.mouseup',\n    };\n\n    var ignoredFilters = {\n      'element.contextmenu': allowAll,\n      'element.mousedown': allowPrimaryAndAuxiliary,\n      'element.mouseup': allowPrimaryAndAuxiliary,\n      'element.click': allowPrimaryAndAuxiliary,\n      'element.dblclick': allowPrimaryAndAuxiliary\n    };\n\n\n    // manual event trigger //////////\n\n    /**\n     * Trigger an interaction event (based on a native dom event)\n     * on the target shape or connection.\n     *\n     * @param {string} eventName the name of the triggered DOM event\n     * @param {MouseEvent|TouchEvent} event\n     * @param {Element} targetElement\n     */\n    function triggerMouseEvent(eventName, event, targetElement) {\n\n      // i.e. element.mousedown...\n      var localEventName = bindings[eventName];\n\n      if (!localEventName) {\n        throw new Error('unmapped DOM event name <' + eventName + '>');\n      }\n\n      return fire(localEventName, event, targetElement);\n    }\n\n\n    var ELEMENT_SELECTOR = 'svg, .djs-element';\n\n    // event handling ///////\n\n    function registerEvent(node, event, localEvent, ignoredFilter) {\n\n      var handler = handlers[localEvent] = function(event) {\n        fire(localEvent, event);\n      };\n\n      if (ignoredFilter) {\n        ignoredFilters[localEvent] = ignoredFilter;\n      }\n\n      handler.$delegate = delegate.bind(node, ELEMENT_SELECTOR, event, handler);\n    }\n\n    function unregisterEvent(node, event, localEvent) {\n\n      var handler = mouseHandler(localEvent);\n\n      if (!handler) {\n        return;\n      }\n\n      delegate.unbind(node, event, handler.$delegate);\n    }\n\n    function registerEvents(svg) {\n      forEach$1(bindings, function(val, key) {\n        registerEvent(svg, key, val);\n      });\n    }\n\n    function unregisterEvents(svg) {\n      forEach$1(bindings, function(val, key) {\n        unregisterEvent(svg, key, val);\n      });\n    }\n\n    eventBus.on('canvas.destroy', function(event) {\n      unregisterEvents(event.svg);\n    });\n\n    eventBus.on('canvas.init', function(event) {\n      registerEvents(event.svg);\n    });\n\n\n    // hit box updating ////////////////\n\n    eventBus.on([ 'shape.added', 'connection.added' ], function(event) {\n      var element = event.element,\n          gfx = event.gfx;\n\n      eventBus.fire('interactionEvents.createHit', { element: element, gfx: gfx });\n    });\n\n    // Update djs-hit on change.\n    // A low priortity is necessary, because djs-hit of labels has to be updated\n    // after the label bounds have been updated in the renderer.\n    eventBus.on([\n      'shape.changed',\n      'connection.changed'\n    ], LOW_PRIORITY$q, function(event) {\n\n      var element = event.element,\n          gfx = event.gfx;\n\n      eventBus.fire('interactionEvents.updateHit', { element: element, gfx: gfx });\n    });\n\n    eventBus.on('interactionEvents.createHit', LOW_PRIORITY$q, function(event) {\n      var element = event.element,\n          gfx = event.gfx;\n\n      self.createDefaultHit(element, gfx);\n    });\n\n    eventBus.on('interactionEvents.updateHit', function(event) {\n      var element = event.element,\n          gfx = event.gfx;\n\n      self.updateDefaultHit(element, gfx);\n    });\n\n\n    // hit styles ////////////\n\n    var STROKE_HIT_STYLE = createHitStyle('djs-hit djs-hit-stroke');\n\n    var CLICK_STROKE_HIT_STYLE = createHitStyle('djs-hit djs-hit-click-stroke');\n\n    var ALL_HIT_STYLE = createHitStyle('djs-hit djs-hit-all');\n\n    var NO_MOVE_HIT_STYLE = createHitStyle('djs-hit djs-hit-no-move');\n\n    var HIT_TYPES = {\n      'all': ALL_HIT_STYLE,\n      'click-stroke': CLICK_STROKE_HIT_STYLE,\n      'stroke': STROKE_HIT_STYLE,\n      'no-move': NO_MOVE_HIT_STYLE\n    };\n\n    function createHitStyle(classNames, attrs) {\n\n      attrs = assign$1({\n        stroke: 'white',\n        strokeWidth: 15\n      }, attrs || {});\n\n      return styles.cls(classNames, [ 'no-fill', 'no-border' ], attrs);\n    }\n\n\n    // style helpers ///////////////\n\n    function applyStyle(hit, type) {\n\n      var attrs = HIT_TYPES[type];\n\n      if (!attrs) {\n        throw new Error('invalid hit type <' + type + '>');\n      }\n\n      attr(hit, attrs);\n\n      return hit;\n    }\n\n    function appendHit(gfx, hit) {\n      append(gfx, hit);\n    }\n\n\n    // API\n\n    /**\n     * Remove hints on the given graphics.\n     *\n     * @param {SVGElement} gfx\n     */\n    this.removeHits = function(gfx) {\n      var hits = all('.djs-hit', gfx);\n\n      forEach$1(hits, remove$1);\n    };\n\n    /**\n     * Create default hit for the given element.\n     *\n     * @param {Element} element\n     * @param {SVGElement} gfx\n     *\n     * @return {SVGElement} created hit\n     */\n    this.createDefaultHit = function(element, gfx) {\n      var waypoints = element.waypoints,\n          isFrame = element.isFrame,\n          boxType;\n\n      if (waypoints) {\n        return this.createWaypointsHit(gfx, waypoints);\n      } else {\n\n        boxType = isFrame ? 'stroke' : 'all';\n\n        return this.createBoxHit(gfx, boxType, {\n          width: element.width,\n          height: element.height\n        });\n      }\n    };\n\n    /**\n     * Create hits for the given waypoints.\n     *\n     * @param {SVGElement} gfx\n     * @param {Point[]} waypoints\n     *\n     * @return {SVGElement}\n     */\n    this.createWaypointsHit = function(gfx, waypoints) {\n\n      var hit = createLine(waypoints);\n\n      applyStyle(hit, 'stroke');\n\n      appendHit(gfx, hit);\n\n      return hit;\n    };\n\n    /**\n     * Create hits for a box.\n     *\n     * @param {SVGElement} gfx\n     * @param {string} type\n     * @param {Object} attrs\n     *\n     * @return {SVGElement}\n     */\n    this.createBoxHit = function(gfx, type, attrs) {\n\n      attrs = assign$1({\n        x: 0,\n        y: 0\n      }, attrs);\n\n      var hit = create$1('rect');\n\n      applyStyle(hit, type);\n\n      attr(hit, attrs);\n\n      appendHit(gfx, hit);\n\n      return hit;\n    };\n\n    /**\n     * Update default hit of the element.\n     *\n     * @param {Element} element\n     * @param {SVGElement} gfx\n     *\n     * @return {SVGElement} updated hit\n     */\n    this.updateDefaultHit = function(element, gfx) {\n\n      var hit = query('.djs-hit', gfx);\n\n      if (!hit) {\n        return;\n      }\n\n      if (element.waypoints) {\n        updateLine(hit, element.waypoints);\n      } else {\n        attr(hit, {\n          width: element.width,\n          height: element.height\n        });\n      }\n\n      return hit;\n    };\n\n    this.fire = fire;\n\n    this.triggerMouseEvent = triggerMouseEvent;\n\n    this.mouseHandler = mouseHandler;\n\n    this.registerEvent = registerEvent;\n    this.unregisterEvent = unregisterEvent;\n  }\n\n\n  InteractionEvents.$inject = [\n    'eventBus',\n    'elementRegistry',\n    'styles'\n  ];\n\n\n  /**\n   * An event indicating that the mouse hovered over an element\n   *\n   * @event element.hover\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * An event indicating that the mouse has left an element\n   *\n   * @event element.out\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * An event indicating that the mouse has clicked an element\n   *\n   * @event element.click\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * An event indicating that the mouse has double clicked an element\n   *\n   * @event element.dblclick\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * An event indicating that the mouse has gone down on an element.\n   *\n   * @event element.mousedown\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * An event indicating that the mouse has gone up on an element.\n   *\n   * @event element.mouseup\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * An event indicating that the context menu action is triggered\n   * via mouse or touch controls.\n   *\n   * @event element.contextmenu\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var InteractionEventsModule$1 = {\n    __init__: [ 'interactionEvents' ],\n    interactionEvents: [ 'type', InteractionEvents ]\n  };\n\n  var LOW_PRIORITY$p = 500;\n\n  /**\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../../draw/Styles').default} Styles\n   */\n\n  /**\n   * @class\n   *\n   * A plugin that adds an outline to shapes and connections that may be activated and styled\n   * via CSS classes.\n   *\n   * @param {EventBus} eventBus\n   * @param {Styles} styles\n   */\n  function Outline(eventBus, styles) {\n\n    this.offset = 6;\n\n    var OUTLINE_STYLE = styles.cls('djs-outline', [ 'no-fill' ]);\n\n    var self = this;\n\n    function createOutline(gfx, bounds) {\n      var outline = create$1('rect');\n\n      attr(outline, assign$1({\n        x: 10,\n        y: 10,\n        rx: 4,\n        width: 100,\n        height: 100\n      }, OUTLINE_STYLE));\n\n      append(gfx, outline);\n\n      return outline;\n    }\n\n    // A low priortity is necessary, because outlines of labels have to be updated\n    // after the label bounds have been updated in the renderer.\n    eventBus.on([ 'shape.added', 'shape.changed' ], LOW_PRIORITY$p, function(event) {\n      var element = event.element,\n          gfx = event.gfx;\n\n      var outline = query('.djs-outline', gfx);\n\n      if (!outline) {\n        outline = createOutline(gfx);\n      }\n\n      self.updateShapeOutline(outline, element);\n    });\n\n    eventBus.on([ 'connection.added', 'connection.changed' ], function(event) {\n      var element = event.element,\n          gfx = event.gfx;\n\n      var outline = query('.djs-outline', gfx);\n\n      if (!outline) {\n        outline = createOutline(gfx);\n      }\n\n      self.updateConnectionOutline(outline, element);\n    });\n  }\n\n\n  /**\n   * Updates the outline of a shape respecting the dimension of the\n   * element and an outline offset.\n   *\n   * @param {SVGElement} outline\n   * @param {Element} element\n   */\n  Outline.prototype.updateShapeOutline = function(outline, element) {\n\n    attr(outline, {\n      x: -this.offset,\n      y: -this.offset,\n      width: element.width + this.offset * 2,\n      height: element.height + this.offset * 2\n    });\n\n  };\n\n\n  /**\n   * Updates the outline of a connection respecting the bounding box of\n   * the connection and an outline offset.\n   *\n   * @param {SVGElement} outline\n   * @param {Element} connection\n   */\n  Outline.prototype.updateConnectionOutline = function(outline, connection) {\n\n    var bbox = getBBox(connection);\n\n    attr(outline, {\n      x: bbox.x - this.offset,\n      y: bbox.y - this.offset,\n      width: bbox.width + this.offset * 2,\n      height: bbox.height + this.offset * 2\n    });\n\n  };\n\n\n  Outline.$inject = [ 'eventBus', 'styles', 'elementRegistry' ];\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var OutlineModule = {\n    __init__: [ 'outline' ],\n    outline: [ 'type', Outline ]\n  };\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   */\n\n  /**\n   * A service that offers the current selection in a diagram.\n   * Offers the api to control the selection, too.\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   */\n  function Selection(eventBus, canvas) {\n\n    this._eventBus = eventBus;\n    this._canvas = canvas;\n\n    /**\n     * @type {Object[]}\n     */\n    this._selectedElements = [];\n\n    var self = this;\n\n    eventBus.on([ 'shape.remove', 'connection.remove' ], function(e) {\n      var element = e.element;\n      self.deselect(element);\n    });\n\n    eventBus.on([ 'diagram.clear', 'root.set' ], function(e) {\n      self.select(null);\n    });\n  }\n\n  Selection.$inject = [ 'eventBus', 'canvas' ];\n\n  /**\n   * Deselect an element.\n   *\n   * @param {Object} element The element to deselect.\n   */\n  Selection.prototype.deselect = function(element) {\n    var selectedElements = this._selectedElements;\n\n    var idx = selectedElements.indexOf(element);\n\n    if (idx !== -1) {\n      var oldSelection = selectedElements.slice();\n\n      selectedElements.splice(idx, 1);\n\n      this._eventBus.fire('selection.changed', { oldSelection: oldSelection, newSelection: selectedElements });\n    }\n  };\n\n  /**\n   * Get the selected elements.\n   *\n   * @return {Object[]} The selected elements.\n   */\n  Selection.prototype.get = function() {\n    return this._selectedElements;\n  };\n\n  /**\n   * Check whether an element is selected.\n   *\n   * @param {Object} element The element.\n   *\n   * @return {boolean} Whether the element is selected.\n   */\n  Selection.prototype.isSelected = function(element) {\n    return this._selectedElements.indexOf(element) !== -1;\n  };\n\n\n  /**\n   * Select one or many elements.\n   *\n   * @param {Object|Object[]} elements The element(s) to select.\n   * @param {boolean} [add] Whether to add the element(s) to the selected elements.\n   * Defaults to `false`.\n   */\n  Selection.prototype.select = function(elements, add) {\n    var selectedElements = this._selectedElements,\n        oldSelection = selectedElements.slice();\n\n    if (!isArray$3(elements)) {\n      elements = elements ? [ elements ] : [];\n    }\n\n    var canvas = this._canvas;\n\n    var rootElement = canvas.getRootElement();\n\n    elements = elements.filter(function(element) {\n      var elementRoot = canvas.findRoot(element);\n\n      return rootElement === elementRoot;\n    });\n\n    // selection may be cleared by passing an empty array or null\n    // to the method\n    if (add) {\n      forEach$1(elements, function(element) {\n        if (selectedElements.indexOf(element) !== -1) {\n\n          // already selected\n          return;\n        } else {\n          selectedElements.push(element);\n        }\n      });\n    } else {\n      this._selectedElements = selectedElements = elements.slice();\n    }\n\n    this._eventBus.fire('selection.changed', { oldSelection: oldSelection, newSelection: selectedElements });\n  };\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('./Selection').default} Selection\n   */\n\n  var MARKER_HOVER = 'hover',\n      MARKER_SELECTED = 'selected';\n\n  var SELECTION_OUTLINE_PADDING = 6;\n\n\n  /**\n   * A plugin that adds a visible selection UI to shapes and connections\n   * by appending the <code>hover</code> and <code>selected</code> classes to them.\n   *\n   * @class\n   *\n   * Makes elements selectable, too.\n   *\n   * @param {Canvas} canvas\n   * @param {EventBus} eventBus\n   * @param {Selection} selection\n   */\n  function SelectionVisuals(canvas, eventBus, selection) {\n    this._canvas = canvas;\n\n    var self = this;\n\n    this._multiSelectionBox = null;\n\n    function addMarker(e, cls) {\n      canvas.addMarker(e, cls);\n    }\n\n    function removeMarker(e, cls) {\n      canvas.removeMarker(e, cls);\n    }\n\n    eventBus.on('element.hover', function(event) {\n      addMarker(event.element, MARKER_HOVER);\n    });\n\n    eventBus.on('element.out', function(event) {\n      removeMarker(event.element, MARKER_HOVER);\n    });\n\n    eventBus.on('selection.changed', function(event) {\n\n      function deselect(s) {\n        removeMarker(s, MARKER_SELECTED);\n      }\n\n      function select(s) {\n        addMarker(s, MARKER_SELECTED);\n      }\n\n      var oldSelection = event.oldSelection,\n          newSelection = event.newSelection;\n\n      forEach$1(oldSelection, function(e) {\n        if (newSelection.indexOf(e) === -1) {\n          deselect(e);\n        }\n      });\n\n      forEach$1(newSelection, function(e) {\n        if (oldSelection.indexOf(e) === -1) {\n          select(e);\n        }\n      });\n\n      self._updateSelectionOutline(newSelection);\n    });\n\n\n    eventBus.on('element.changed', function(event) {\n      if (selection.isSelected(event.element)) {\n        self._updateSelectionOutline(selection.get());\n      }\n    });\n  }\n\n  SelectionVisuals.$inject = [\n    'canvas',\n    'eventBus',\n    'selection'\n  ];\n\n  SelectionVisuals.prototype._updateSelectionOutline = function(selection) {\n    var layer = this._canvas.getLayer('selectionOutline');\n\n    clear(layer);\n\n    var enabled = selection.length > 1;\n\n    var container = this._canvas.getContainer();\n\n    classes(container)[enabled ? 'add' : 'remove']('djs-multi-select');\n\n    if (!enabled) {\n      return;\n    }\n\n    var bBox = addSelectionOutlinePadding(getBBox(selection));\n\n    var rect = create$1('rect');\n\n    attr(rect, assign$1({\n      rx: 3\n    }, bBox));\n\n    classes(rect).add('djs-selection-outline');\n\n    append(layer, rect);\n  };\n\n  // helpers //////////\n\n  function addSelectionOutlinePadding(bBox) {\n    return {\n      x: bBox.x - SELECTION_OUTLINE_PADDING,\n      y: bBox.y - SELECTION_OUTLINE_PADDING,\n      width: bBox.width + SELECTION_OUTLINE_PADDING * 2,\n      height: bBox.height + SELECTION_OUTLINE_PADDING * 2\n    };\n  }\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('./Selection').default} Selection\n   */\n\n  /**\n   * @param {EventBus} eventBus\n   * @param {Selection} selection\n   * @param {Canvas} canvas\n   * @param {ElementRegistry} elementRegistry\n   */\n  function SelectionBehavior(eventBus, selection, canvas, elementRegistry) {\n\n    // Select elements on create\n    eventBus.on('create.end', 500, function(event) {\n      var context = event.context,\n          canExecute = context.canExecute,\n          elements = context.elements,\n          hints = context.hints || {},\n          autoSelect = hints.autoSelect;\n\n      if (canExecute) {\n        if (autoSelect === false) {\n\n          // Select no elements\n          return;\n        }\n\n        if (isArray$3(autoSelect)) {\n          selection.select(autoSelect);\n        } else {\n\n          // Select all elements by default\n          selection.select(elements.filter(isShown));\n        }\n      }\n    });\n\n    // Select connection targets on connect\n    eventBus.on('connect.end', 500, function(event) {\n      var context = event.context,\n          connection = context.connection;\n\n      if (connection) {\n        selection.select(connection);\n      }\n    });\n\n    // Select shapes on move\n    eventBus.on('shape.move.end', 500, function(event) {\n      var previousSelection = event.previousSelection || [];\n\n      var shape = elementRegistry.get(event.context.shape.id);\n\n      // Always select main shape on move\n      var isSelected = find(previousSelection, function(selectedShape) {\n        return shape.id === selectedShape.id;\n      });\n\n      if (!isSelected) {\n        selection.select(shape);\n      }\n    });\n\n    // Select elements on click\n    eventBus.on('element.click', function(event) {\n\n      if (!isPrimaryButton(event)) {\n        return;\n      }\n\n      var element = event.element;\n\n      if (element === canvas.getRootElement()) {\n        element = null;\n      }\n\n      var isSelected = selection.isSelected(element),\n          isMultiSelect = selection.get().length > 1;\n\n      // Add to selection if CTRL or SHIFT pressed\n      var add = hasPrimaryModifier(event) || hasSecondaryModifier(event);\n\n      if (isSelected && isMultiSelect) {\n        if (add) {\n\n          // Deselect element\n          return selection.deselect(element);\n        } else {\n\n          // Select element only\n          return selection.select(element);\n        }\n      } else if (!isSelected) {\n\n        // Select element\n        selection.select(element, add);\n      } else {\n\n        // Deselect element\n        selection.deselect(element);\n      }\n    });\n  }\n\n  SelectionBehavior.$inject = [\n    'eventBus',\n    'selection',\n    'canvas',\n    'elementRegistry'\n  ];\n\n\n  function isShown(element) {\n    return !element.hidden;\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var SelectionModule = {\n    __init__: [ 'selectionVisuals', 'selectionBehavior' ],\n    __depends__: [\n      InteractionEventsModule$1,\n      OutlineModule\n    ],\n    selection: [ 'type', Selection ],\n    selectionVisuals: [ 'type', SelectionVisuals ],\n    selectionBehavior: [ 'type', SelectionBehavior ]\n  };\n\n  /**\n   * Util that provides unique IDs.\n   *\n   * @class\n   * @constructor\n   *\n   * The ids can be customized via a given prefix and contain a random value to avoid collisions.\n   *\n   * @param {string} [prefix] a prefix to prepend to generated ids (for better readability)\n   */\n  function IdGenerator(prefix) {\n\n    this._counter = 0;\n    this._prefix = (prefix ? prefix + '-' : '') + Math.floor(Math.random() * 1000000000) + '-';\n  }\n\n  /**\n   * Returns a next unique ID.\n   *\n   * @return {string} the id\n   */\n  IdGenerator.prototype.next = function() {\n    return this._prefix + (++this._counter);\n  };\n\n  // document wide unique overlay ids\n  var ids$1 = new IdGenerator('ov');\n\n  var LOW_PRIORITY$o = 500;\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../../core/EventBus').default} EventBus\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef { {\n   *   minZoom?: number,\n   *   maxZoom?: number\n   * } } OverlaysConfigShow\n   *\n   * @typedef { {\n   *   min?: number,\n   *   max?: number\n   * } } OverlaysConfigScale\n   *\n   * @typedef { {\n  *   id: string,\n  *   type: string | null,\n  *   element: Element | string\n  * } & OverlayAttrs } Overlay\n  *\n   * @typedef { {\n   *   html: HTMLElement | string,\n   *   position: {\n   *     top?: number,\n   *     right?: number,\n   *     bottom?: number,\n   *     left?: number\n   *   }\n   * } & OverlaysConfigDefault } OverlayAttrs\n   *\n   * @typedef { {\n   *   html: HTMLElement,\n   *   element: Element,\n   *   overlays: Overlay[]\n   * } } OverlayContainer\n   *\n   * @typedef {{\n   *   defaults?: OverlaysConfigDefault\n   * }} OverlaysConfig\n   *\n   * @typedef { {\n   *  show?: OverlaysConfigShow,\n   *  scale?: OverlaysConfigScale | boolean\n   * } } OverlaysConfigDefault\n   *\n   * @typedef { {\n   *   id?: string;\n   *   element?: Element | string;\n   *   type?: string;\n   * } | string } OverlaysFilter\n   */\n\n  /**\n   * A service that allows users to attach overlays to diagram elements.\n   *\n   * The overlay service will take care of overlay positioning during updates.\n   *\n   * @example\n   *\n   * ```javascript\n   * // add a pink badge on the top left of the shape\n   *\n   * overlays.add(someShape, {\n   *   position: {\n   *     top: -5,\n   *     left: -5\n   *   },\n   *   html: '<div style=\"width: 10px; background: fuchsia; color: white;\">0</div>'\n   * });\n   *\n   * // or add via shape id\n   *\n   * overlays.add('some-element-id', {\n   *   position: {\n   *     top: -5,\n   *     left: -5\n   *   }\n   *   html: '<div style=\"width: 10px; background: fuchsia; color: white;\">0</div>'\n   * });\n   *\n   * // or add with optional type\n   *\n   * overlays.add(someShape, 'badge', {\n   *   position: {\n   *     top: -5,\n   *     left: -5\n   *   }\n   *   html: '<div style=\"width: 10px; background: fuchsia; color: white;\">0</div>'\n   * });\n   * ```\n   *\n   * ```javascript\n   * // remove an overlay\n   *\n   * var id = overlays.add(...);\n   * overlays.remove(id);\n   *\n   *\n   * You may configure overlay defaults during tool by providing a `config` module\n   * with `overlays.defaults` as an entry:\n   *\n   * {\n   *   overlays: {\n   *     defaults: {\n   *       show: {\n   *         minZoom: 0.7,\n   *         maxZoom: 5.0\n   *       },\n   *       scale: {\n   *         min: 1\n   *       }\n   *     }\n   * }\n   * ```\n   *\n   * @param {OverlaysConfig} config\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {ElementRegistry} elementRegistry\n   */\n  function Overlays(config, eventBus, canvas, elementRegistry) {\n    this._eventBus = eventBus;\n    this._canvas = canvas;\n    this._elementRegistry = elementRegistry;\n\n    this._ids = ids$1;\n\n    /**\n     * @type {OverlaysConfigDefault}\n     */\n    this._overlayDefaults = assign$1({\n\n      // no show constraints\n      show: null,\n\n      // always scale\n      scale: true\n    }, config && config.defaults);\n\n    /**\n     * @type {Map<string, Overlay>}\n     */\n    this._overlays = {};\n\n    /**\n     * @type {OverlayContainer[]}\n     */\n    this._overlayContainers = [];\n\n    /**\n     * @type {HTMLElement}\n     */\n    this._overlayRoot = createRoot$1(canvas.getContainer());\n\n    this._init();\n  }\n\n\n  Overlays.$inject = [\n    'config.overlays',\n    'eventBus',\n    'canvas',\n    'elementRegistry'\n  ];\n\n\n  /**\n   * Returns the overlay with the specified ID or a list of overlays\n   * for an element with a given type.\n   *\n   * @example\n   *\n   * ```javascript\n   * // return the single overlay with the given ID\n   * overlays.get('some-id');\n   *\n   * // return all overlays for the shape\n   * overlays.get({ element: someShape });\n   *\n   * // return all overlays on shape with type 'badge'\n   * overlays.get({ element: someShape, type: 'badge' });\n   *\n   * // shape can also be specified as ID\n   * overlays.get({ element: 'element-id', type: 'badge' });\n   * ```\n   *\n   * @param {OverlaysFilter} search The filter to be used to find the overlay(s).\n   *\n   * @return {Overlay|Overlay[]} The overlay(s).\n   */\n  Overlays.prototype.get = function(search) {\n\n    if (isString(search)) {\n      search = { id: search };\n    }\n\n    if (isString(search.element)) {\n      search.element = this._elementRegistry.get(search.element);\n    }\n\n    if (search.element) {\n      var container = this._getOverlayContainer(search.element, true);\n\n      // return a list of overlays when searching by element (+type)\n      if (container) {\n        return search.type ? filter(container.overlays, matchPattern({ type: search.type })) : container.overlays.slice();\n      } else {\n        return [];\n      }\n    } else\n    if (search.type) {\n      return filter(this._overlays, matchPattern({ type: search.type }));\n    } else {\n\n      // return single element when searching by id\n      return search.id ? this._overlays[search.id] : null;\n    }\n  };\n\n  /**\n   * Adds an HTML overlay to an element.\n   *\n   * @param {Element|string} element The element to add the overlay to.\n   * @param {string} [type] An optional type that can be used to filter.\n   * @param {OverlayAttrs} overlay The overlay.\n   *\n   * @return {string} The overlay's ID that can be used to get or remove it.\n   */\n  Overlays.prototype.add = function(element, type, overlay) {\n\n    if (isObject(type)) {\n      overlay = type;\n      type = null;\n    }\n\n    if (!element.id) {\n      element = this._elementRegistry.get(element);\n    }\n\n    if (!overlay.position) {\n      throw new Error('must specifiy overlay position');\n    }\n\n    if (!overlay.html) {\n      throw new Error('must specifiy overlay html');\n    }\n\n    if (!element) {\n      throw new Error('invalid element specified');\n    }\n\n    var id = this._ids.next();\n\n    overlay = assign$1({}, this._overlayDefaults, overlay, {\n      id: id,\n      type: type,\n      element: element,\n      html: overlay.html\n    });\n\n    this._addOverlay(overlay);\n\n    return id;\n  };\n\n\n  /**\n   * Remove an overlay with the given ID or all overlays matching the given filter.\n   *\n   * @see Overlays#get for filter options.\n   *\n   * @param {OverlaysFilter} filter The filter to be used to find the overlay.\n   */\n  Overlays.prototype.remove = function(filter) {\n\n    var overlays = this.get(filter) || [];\n\n    if (!isArray$3(overlays)) {\n      overlays = [ overlays ];\n    }\n\n    var self = this;\n\n    forEach$1(overlays, function(overlay) {\n\n      var container = self._getOverlayContainer(overlay.element, true);\n\n      if (overlay) {\n        remove$2(overlay.html);\n        remove$2(overlay.htmlContainer);\n\n        delete overlay.htmlContainer;\n        delete overlay.element;\n\n        delete self._overlays[overlay.id];\n      }\n\n      if (container) {\n        var idx = container.overlays.indexOf(overlay);\n        if (idx !== -1) {\n          container.overlays.splice(idx, 1);\n        }\n      }\n    });\n\n  };\n\n  /**\n   * Checks whether overlays are shown.\n   *\n   * @return {boolean} Whether overlays are shown.\n   */\n  Overlays.prototype.isShown = function() {\n    return this._overlayRoot.style.display !== 'none';\n  };\n\n  /**\n   * Show all overlays.\n   */\n  Overlays.prototype.show = function() {\n    setVisible$1(this._overlayRoot);\n  };\n\n  /**\n   * Hide all overlays.\n   */\n  Overlays.prototype.hide = function() {\n    setVisible$1(this._overlayRoot, false);\n  };\n\n  /**\n   * Remove all overlays and their container.\n   */\n  Overlays.prototype.clear = function() {\n    this._overlays = {};\n\n    this._overlayContainers = [];\n\n    clear$1(this._overlayRoot);\n  };\n\n  Overlays.prototype._updateOverlayContainer = function(container) {\n    var element = container.element,\n        html = container.html;\n\n    // update container left,top according to the elements x,y coordinates\n    // this ensures we can attach child elements relative to this container\n\n    var x = element.x,\n        y = element.y;\n\n    if (element.waypoints) {\n      var bbox = getBBox(element);\n      x = bbox.x;\n      y = bbox.y;\n    }\n\n    setPosition$1(html, x, y);\n\n    attr$1(container.html, 'data-container-id', element.id);\n  };\n\n\n  Overlays.prototype._updateOverlay = function(overlay) {\n\n    var position = overlay.position,\n        htmlContainer = overlay.htmlContainer,\n        element = overlay.element;\n\n    // update overlay html relative to shape because\n    // it is already positioned on the element\n\n    // update relative\n    var left = position.left,\n        top = position.top;\n\n    if (position.right !== undefined) {\n\n      var width;\n\n      if (element.waypoints) {\n        width = getBBox(element).width;\n      } else {\n        width = element.width;\n      }\n\n      left = position.right * -1 + width;\n    }\n\n    if (position.bottom !== undefined) {\n\n      var height;\n\n      if (element.waypoints) {\n        height = getBBox(element).height;\n      } else {\n        height = element.height;\n      }\n\n      top = position.bottom * -1 + height;\n    }\n\n    setPosition$1(htmlContainer, left || 0, top || 0);\n    this._updateOverlayVisibilty(overlay, this._canvas.viewbox());\n  };\n\n\n  Overlays.prototype._createOverlayContainer = function(element) {\n    var html = domify$1('<div class=\"djs-overlays\" />');\n    assign(html, { position: 'absolute' });\n\n    this._overlayRoot.appendChild(html);\n\n    var container = {\n      html: html,\n      element: element,\n      overlays: []\n    };\n\n    this._updateOverlayContainer(container);\n\n    this._overlayContainers.push(container);\n\n    return container;\n  };\n\n\n  Overlays.prototype._updateRoot = function(viewbox) {\n    var scale = viewbox.scale || 1;\n\n    var matrix = 'matrix(' +\n    [\n      scale,\n      0,\n      0,\n      scale,\n      -1 * viewbox.x * scale,\n      -1 * viewbox.y * scale\n    ].join(',') +\n    ')';\n\n    setTransform(this._overlayRoot, matrix);\n  };\n\n\n  Overlays.prototype._getOverlayContainer = function(element, raw) {\n    var container = find(this._overlayContainers, function(c) {\n      return c.element === element;\n    });\n\n\n    if (!container && !raw) {\n      return this._createOverlayContainer(element);\n    }\n\n    return container;\n  };\n\n\n  Overlays.prototype._addOverlay = function(overlay) {\n\n    var id = overlay.id,\n        element = overlay.element,\n        html = overlay.html,\n        htmlContainer,\n        overlayContainer;\n\n    // unwrap jquery (for those who need it)\n    if (html.get && html.constructor.prototype.jquery) {\n      html = html.get(0);\n    }\n\n    // create proper html elements from\n    // overlay HTML strings\n    if (isString(html)) {\n      html = domify$1(html);\n    }\n\n    overlayContainer = this._getOverlayContainer(element);\n\n    htmlContainer = domify$1('<div class=\"djs-overlay\" data-overlay-id=\"' + id + '\">');\n    assign(htmlContainer, { position: 'absolute' });\n\n    htmlContainer.appendChild(html);\n\n    if (overlay.type) {\n      classes$1(htmlContainer).add('djs-overlay-' + overlay.type);\n    }\n\n    var elementRoot = this._canvas.findRoot(element);\n    var activeRoot = this._canvas.getRootElement();\n\n    setVisible$1(htmlContainer, elementRoot === activeRoot);\n\n    overlay.htmlContainer = htmlContainer;\n\n    overlayContainer.overlays.push(overlay);\n    overlayContainer.html.appendChild(htmlContainer);\n\n    this._overlays[id] = overlay;\n\n    this._updateOverlay(overlay);\n    this._updateOverlayVisibilty(overlay, this._canvas.viewbox());\n  };\n\n\n  Overlays.prototype._updateOverlayVisibilty = function(overlay, viewbox) {\n    var show = overlay.show,\n        rootElement = this._canvas.findRoot(overlay.element),\n        minZoom = show && show.minZoom,\n        maxZoom = show && show.maxZoom,\n        htmlContainer = overlay.htmlContainer,\n        activeRootElement = this._canvas.getRootElement(),\n        visible = true;\n\n    if (rootElement !== activeRootElement) {\n      visible = false;\n    } else if (show) {\n      if (\n        (isDefined(minZoom) && minZoom > viewbox.scale) ||\n        (isDefined(maxZoom) && maxZoom < viewbox.scale)\n      ) {\n        visible = false;\n      }\n    }\n\n    setVisible$1(htmlContainer, visible);\n\n    this._updateOverlayScale(overlay, viewbox);\n  };\n\n\n  Overlays.prototype._updateOverlayScale = function(overlay, viewbox) {\n    var shouldScale = overlay.scale,\n        minScale,\n        maxScale,\n        htmlContainer = overlay.htmlContainer;\n\n    var scale, transform = '';\n\n    if (shouldScale !== true) {\n\n      if (shouldScale === false) {\n        minScale = 1;\n        maxScale = 1;\n      } else {\n        minScale = shouldScale.min;\n        maxScale = shouldScale.max;\n      }\n\n      if (isDefined(minScale) && viewbox.scale < minScale) {\n        scale = (1 / viewbox.scale || 1) * minScale;\n      }\n\n      if (isDefined(maxScale) && viewbox.scale > maxScale) {\n        scale = (1 / viewbox.scale || 1) * maxScale;\n      }\n    }\n\n    if (isDefined(scale)) {\n      transform = 'scale(' + scale + ',' + scale + ')';\n    }\n\n    setTransform(htmlContainer, transform);\n  };\n\n\n  Overlays.prototype._updateOverlaysVisibilty = function(viewbox) {\n\n    var self = this;\n\n    forEach$1(this._overlays, function(overlay) {\n      self._updateOverlayVisibilty(overlay, viewbox);\n    });\n  };\n\n\n  Overlays.prototype._init = function() {\n\n    var eventBus = this._eventBus;\n\n    var self = this;\n\n\n    // scroll/zoom integration\n\n    function updateViewbox(viewbox) {\n      self._updateRoot(viewbox);\n      self._updateOverlaysVisibilty(viewbox);\n\n      self.show();\n    }\n\n    eventBus.on('canvas.viewbox.changing', function(event) {\n      self.hide();\n    });\n\n    eventBus.on('canvas.viewbox.changed', function(event) {\n      updateViewbox(event.viewbox);\n    });\n\n\n    // remove integration\n\n    eventBus.on([ 'shape.remove', 'connection.remove' ], function(e) {\n      var element = e.element;\n      var overlays = self.get({ element: element });\n\n      forEach$1(overlays, function(o) {\n        self.remove(o.id);\n      });\n\n      var container = self._getOverlayContainer(element);\n\n      if (container) {\n        remove$2(container.html);\n        var i = self._overlayContainers.indexOf(container);\n        if (i !== -1) {\n          self._overlayContainers.splice(i, 1);\n        }\n      }\n    });\n\n\n    // move integration\n\n    eventBus.on('element.changed', LOW_PRIORITY$o, function(e) {\n      var element = e.element;\n\n      var container = self._getOverlayContainer(element, true);\n\n      if (container) {\n        forEach$1(container.overlays, function(overlay) {\n          self._updateOverlay(overlay);\n        });\n\n        self._updateOverlayContainer(container);\n      }\n    });\n\n\n    // marker integration, simply add them on the overlays as classes, too.\n\n    eventBus.on('element.marker.update', function(e) {\n      var container = self._getOverlayContainer(e.element, true);\n      if (container) {\n        classes$1(container.html)[e.add ? 'add' : 'remove'](e.marker);\n      }\n    });\n\n\n    eventBus.on('root.set', function() {\n      self._updateOverlaysVisibilty(self._canvas.viewbox());\n    });\n\n    // clear overlays with diagram\n\n    eventBus.on('diagram.clear', this.clear, this);\n  };\n\n\n\n  // helpers /////////////////////////////\n\n  function createRoot$1(parentNode) {\n    var root = domify$1(\n      '<div class=\"djs-overlay-container\" />'\n    );\n\n    assign(root, {\n      position: 'absolute',\n      width: 0,\n      height: 0\n    });\n\n    parentNode.insertBefore(root, parentNode.firstChild);\n\n    return root;\n  }\n\n  function setPosition$1(el, x, y) {\n    assign(el, { left: x + 'px', top: y + 'px' });\n  }\n\n  /**\n   * Set element visible\n   *\n   * @param {DOMElement} el\n   * @param {boolean} [visible=true]\n   */\n  function setVisible$1(el, visible) {\n    el.style.display = visible === false ? 'none' : '';\n  }\n\n  function setTransform(el, transform) {\n\n    el.style['transform-origin'] = 'top left';\n\n    [ '', '-ms-', '-webkit-' ].forEach(function(prefix) {\n      el.style[prefix + 'transform'] = transform;\n    });\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var OverlaysModule = {\n    __init__: [ 'overlays' ],\n    overlays: [ 'type', Overlays ]\n  };\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../../core/GraphicsFactory').default} GraphicsFactory\n   */\n\n  /**\n   * Adds change support to the diagram, including\n   *\n   * <ul>\n   *   <li>redrawing shapes and connections on change</li>\n   * </ul>\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {ElementRegistry} elementRegistry\n   * @param {GraphicsFactory} graphicsFactory\n   */\n  function ChangeSupport(\n      eventBus, canvas, elementRegistry,\n      graphicsFactory) {\n\n\n    // redraw shapes / connections on change\n\n    eventBus.on('element.changed', function(event) {\n\n      var element = event.element;\n\n      // element might have been deleted and replaced by new element with same ID\n      // thus check for parent of element except for root element\n      if (element.parent || element === canvas.getRootElement()) {\n        event.gfx = elementRegistry.getGraphics(element);\n      }\n\n      // shape + gfx may have been deleted\n      if (!event.gfx) {\n        return;\n      }\n\n      eventBus.fire(getType(element) + '.changed', event);\n    });\n\n    eventBus.on('elements.changed', function(event) {\n\n      var elements = event.elements;\n\n      elements.forEach(function(e) {\n        eventBus.fire('element.changed', { element: e });\n      });\n\n      graphicsFactory.updateContainments(elements);\n    });\n\n    eventBus.on('shape.changed', function(event) {\n      graphicsFactory.update('shape', event.element, event.gfx);\n    });\n\n    eventBus.on('connection.changed', function(event) {\n      graphicsFactory.update('connection', event.element, event.gfx);\n    });\n  }\n\n  ChangeSupport.$inject = [\n    'eventBus',\n    'canvas',\n    'elementRegistry',\n    'graphicsFactory'\n  ];\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var ChangeSupportModule = {\n    __init__: [ 'changeSupport' ],\n    changeSupport: [ 'type', ChangeSupport ]\n  };\n\n  /**\n   * @typedef {import('../core/Types').ElementLike} ElementLike\n   * @typedef {import('../core/EventBus').default} EventBus\n   * @typedef {import('./CommandStack').CommandContext} CommandContext\n   *\n   * @typedef {string|string[]} Events\n   * @typedef { (context: CommandContext) => ElementLike[] | void } HandlerFunction\n   * @typedef { (context: CommandContext) => void } ComposeHandlerFunction\n   */\n\n  var DEFAULT_PRIORITY$4 = 1000;\n\n  /**\n   * A utility that can be used to plug into the command execution for\n   * extension and/or validation.\n   *\n   * @class\n   * @constructor\n   *\n   * @example\n   *\n   * ```javascript\n   * import CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n   *\n   * class CommandLogger extends CommandInterceptor {\n   *   constructor(eventBus) {\n   *     super(eventBus);\n   *\n   *   this.preExecute('shape.create', (event) => {\n   *     console.log('commandStack.shape-create.preExecute', event);\n   *   });\n   * }\n   * ```\n   *\n   * @param {EventBus} eventBus\n   */\n  function CommandInterceptor(eventBus) {\n\n    /**\n     * @type {EventBus}\n     */\n    this._eventBus = eventBus;\n  }\n\n  CommandInterceptor.$inject = [ 'eventBus' ];\n\n  function unwrapEvent(fn, that) {\n    return function(event) {\n      return fn.call(that || null, event.context, event.command, event);\n    };\n  }\n\n\n  /**\n   * Intercept a command during one of the phases.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {string} [hook] phase to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.on = function(events, hook, priority, handlerFn, unwrap, that) {\n\n    if (isFunction(hook) || isNumber(hook)) {\n      that = unwrap;\n      unwrap = handlerFn;\n      handlerFn = priority;\n      priority = hook;\n      hook = null;\n    }\n\n    if (isFunction(priority)) {\n      that = unwrap;\n      unwrap = handlerFn;\n      handlerFn = priority;\n      priority = DEFAULT_PRIORITY$4;\n    }\n\n    if (isObject(unwrap)) {\n      that = unwrap;\n      unwrap = false;\n    }\n\n    if (!isFunction(handlerFn)) {\n      throw new Error('handlerFn must be a function');\n    }\n\n    if (!isArray$3(events)) {\n      events = [ events ];\n    }\n\n    var eventBus = this._eventBus;\n\n    forEach$1(events, function(event) {\n\n      // concat commandStack(.event)?(.hook)?\n      var fullEvent = [ 'commandStack', event, hook ].filter(function(e) { return e; }).join('.');\n\n      eventBus.on(fullEvent, priority, unwrap ? unwrapEvent(handlerFn, that) : handlerFn, that);\n    });\n  };\n\n  /**\n   * Add a <canExecute> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.canExecute = createHook('canExecute');\n\n  /**\n   * Add a <preExecute> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.preExecute = createHook('preExecute');\n\n  /**\n   * Add a <preExecuted> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.preExecuted = createHook('preExecuted');\n\n  /**\n   * Add a <execute> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.execute = createHook('execute');\n\n  /**\n   * Add a <executed> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.executed = createHook('executed');\n\n  /**\n   * Add a <postExecute> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.postExecute = createHook('postExecute');\n\n  /**\n   * Add a <postExecuted> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.postExecuted = createHook('postExecuted');\n\n  /**\n   * Add a <revert> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.revert = createHook('revert');\n\n  /**\n   * Add a <reverted> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.reverted = createHook('reverted');\n\n  /*\n   * Add prototype methods for each phase of command execution (e.g. execute,\n   * revert).\n   *\n   * @param {string} hook\n   *\n   * @return { (\n   *   events?: Events,\n   *   priority?: number,\n   *   handlerFn: ComposeHandlerFunction|HandlerFunction,\n   *   unwrap?: boolean\n   * ) => any }\n   */\n  function createHook(hook) {\n\n    /**\n     * @this {CommandInterceptor}\n     *\n     * @param {Events} [events]\n     * @param {number} [priority]\n     * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n     * @param {boolean} [unwrap]\n     * @param {any} [that]\n     */\n    const hookFn = function(events, priority, handlerFn, unwrap, that) {\n\n      if (isFunction(events) || isNumber(events)) {\n        that = unwrap;\n        unwrap = handlerFn;\n        handlerFn = priority;\n        priority = events;\n        events = null;\n      }\n\n      this.on(events, hook, priority, handlerFn, unwrap, that);\n    };\n\n    return hookFn;\n  }\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   *\n   * @typedef {import('../../core/Canvas').default} Canvas\n   */\n\n  /**\n   * A modeling behavior that ensures we set the correct root element\n   * as we undo and redo commands.\n   *\n   * @param {Canvas} canvas\n   * @param {Injector} injector\n   */\n  function RootElementsBehavior(canvas, injector) {\n\n    injector.invoke(CommandInterceptor, this);\n\n    this.executed(function(event) {\n      var context = event.context;\n\n      if (context.rootElement) {\n        canvas.setRootElement(context.rootElement);\n      } else {\n        context.rootElement = canvas.getRootElement();\n      }\n    });\n\n    this.revert(function(event) {\n      var context = event.context;\n\n      if (context.rootElement) {\n        canvas.setRootElement(context.rootElement);\n      }\n    });\n  }\n\n  e$3(RootElementsBehavior, CommandInterceptor);\n\n  RootElementsBehavior.$inject = [ 'canvas', 'injector' ];\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var RootElementsModule = {\n    __init__: [ 'rootElementsBehavior' ],\n    rootElementsBehavior: [ 'type', RootElementsBehavior ]\n  };\n\n  /**\n   * @param {string} str\n   *\n   * @return {string}\n   */\n  function escapeCSS(str) {\n    return CSS.escape(str);\n  }\n\n  var HTML_ESCAPE_MAP = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    '\\'': '&#39;'\n  };\n\n  /**\n   * @param {string} str\n   *\n   * @return {string}\n   */\n  function escapeHTML(str) {\n    str = '' + str;\n\n    return str && str.replace(/[&<>\"']/g, function(match) {\n      return HTML_ESCAPE_MAP[match];\n    });\n  }\n\n  /**\n   * @typedef {import('../model/Types').Element} Element\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   */\n\n  var planeSuffix = '_plane';\n\n  /**\n   * Get primary shape ID for a plane.\n   *\n   * @param  {Element|ModdleElement} element\n   *\n   * @return {string}\n   */\n  function getShapeIdFromPlane(element) {\n    var id = element.id;\n\n    return removePlaneSuffix(id);\n  }\n\n  /**\n   * Get plane ID for a primary shape.\n   *\n   * @param  {Element|ModdleElement} element\n   *\n   * @return {string}\n   */\n  function getPlaneIdFromShape(element) {\n    var id = element.id;\n\n    if (is$1(element, 'bpmn:SubProcess')) {\n      return addPlaneSuffix(id);\n    }\n\n    return id;\n  }\n\n  /**\n   * Get plane ID for primary shape ID.\n   *\n   * @param {string} id\n   *\n   * @return {string}\n   */\n  function toPlaneId(id) {\n    return addPlaneSuffix(id);\n  }\n\n  /**\n   * Check wether element is plane.\n   *\n   * @param  {Element|ModdleElement} element\n   *\n   * @return {boolean}\n   */\n  function isPlane(element) {\n    var di = getDi(element);\n\n    return is$1(di, 'bpmndi:BPMNPlane');\n  }\n\n  function addPlaneSuffix(id) {\n    return id + planeSuffix;\n  }\n\n  function removePlaneSuffix(id) {\n    return id.replace(new RegExp(planeSuffix + '$'), '');\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Shape} Shape\n   */\n\n  var OPEN_CLASS = 'bjs-breadcrumbs-shown';\n\n\n  /**\n   * Adds overlays that allow switching planes on collapsed subprocesses.\n   *\n   * @param {EventBus} eventBus\n   * @param {ElementRegistry} elementRegistry\n   * @param {Canvas} canvas\n   */\n  function DrilldownBreadcrumbs(eventBus, elementRegistry, canvas) {\n    var breadcrumbs = domify$1('<ul class=\"bjs-breadcrumbs\"></ul>');\n    var container = canvas.getContainer();\n    var containerClasses = classes$1(container);\n    container.appendChild(breadcrumbs);\n\n    var businessObjectParents = [];\n\n    // update breadcrumbs if name or ID of the primary shape changes\n    eventBus.on('element.changed', function(event) {\n      var shape = event.element,\n          businessObject = getBusinessObject(shape);\n\n      var isPresent = find(businessObjectParents, function(element) {\n        return element === businessObject;\n      });\n\n      if (!isPresent) {\n        return;\n      }\n\n      updateBreadcrumbs();\n    });\n\n    /**\n     * Updates the displayed breadcrumbs. If no element is provided, only the\n     * labels are updated.\n     *\n     * @param {Element} [element]\n     */\n    function updateBreadcrumbs(element) {\n      if (element) {\n        businessObjectParents = getBusinessObjectParentChain(element);\n      }\n\n      var path = businessObjectParents.map(function(parent) {\n        var title = escapeHTML(parent.name || parent.id);\n        var link = domify$1('<li><span class=\"bjs-crumb\"><a title=\"' + title + '\">' + title + '</a></span></li>');\n\n        var parentPlane = canvas.findRoot(getPlaneIdFromShape(parent)) || canvas.findRoot(parent.id);\n\n        // when the root is a collaboration, the process does not have a corresponding\n        // element in the elementRegisty. Instead, we search for the corresponding participant\n        if (!parentPlane && is$1(parent, 'bpmn:Process')) {\n          var participant = elementRegistry.find(function(element) {\n            var businessObject = getBusinessObject(element);\n\n            return businessObject && businessObject.get('processRef') && businessObject.get('processRef') === parent;\n          });\n\n          parentPlane = canvas.findRoot(participant.id);\n        }\n\n        link.addEventListener('click', function() {\n          canvas.setRootElement(parentPlane);\n        });\n\n        return link;\n      });\n\n      breadcrumbs.innerHTML = '';\n\n      // show breadcrumbs and expose state to .djs-container\n      var visible = path.length > 1;\n\n      containerClasses.toggle(OPEN_CLASS, visible);\n\n      path.forEach(function(element) {\n        breadcrumbs.appendChild(element);\n      });\n    }\n\n    eventBus.on('root.set', function(event) {\n      updateBreadcrumbs(event.element);\n    });\n\n  }\n\n  DrilldownBreadcrumbs.$inject = [ 'eventBus', 'elementRegistry', 'canvas' ];\n\n\n  // helpers //////////\n\n  /**\n   * Returns the parents for the element using the business object chain,\n   * starting with the root element.\n   *\n   * @param {Shape} child\n   *\n   * @return {Shape}\n   */\n  function getBusinessObjectParentChain(child) {\n    var businessObject = getBusinessObject(child);\n\n    var parents = [];\n\n    for (var element = businessObject; element; element = element.$parent) {\n      if (is$1(element, 'bpmn:SubProcess') || is$1(element, 'bpmn:Process')) {\n        parents.push(element);\n      }\n    }\n\n    return parents.reverse();\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   */\n\n  /**\n   * Move collapsed subprocesses into view when drilling down.\n   *\n   * Zoom and scroll are saved in a session.\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   */\n  function DrilldownCentering(eventBus, canvas) {\n\n    var currentRoot = null;\n    var positionMap = new Map$1();\n\n    eventBus.on('root.set', function(event) {\n      var newRoot = event.element;\n      var currentViewbox = canvas.viewbox();\n      var storedViewbox = positionMap.get(newRoot);\n\n      positionMap.set(currentRoot, {\n        x: currentViewbox.x,\n        y: currentViewbox.y,\n        zoom: currentViewbox.scale\n      });\n\n      currentRoot = newRoot;\n\n      // current root was replaced with a collaboration, we don't update the viewbox\n      if (is$1(newRoot, 'bpmn:Collaboration') && !storedViewbox) {\n        return;\n      }\n\n      storedViewbox = storedViewbox || { x: 0, y: 0, zoom: 1 };\n\n      var dx = (currentViewbox.x - storedViewbox.x) * currentViewbox.scale,\n          dy = (currentViewbox.y - storedViewbox.y) * currentViewbox.scale;\n\n      if (dx !== 0 || dy !== 0) {\n        canvas.scroll({\n          dx: dx,\n          dy: dy\n        });\n      }\n\n      if (storedViewbox.zoom !== currentViewbox.scale) {\n        canvas.zoom(storedViewbox.zoom, { x: 0, y: 0 });\n      }\n    });\n\n    eventBus.on('diagram.clear', function() {\n      positionMap.clear();\n      currentRoot = null;\n    });\n\n  }\n\n  DrilldownCentering.$inject = [ 'eventBus', 'canvas' ];\n\n\n  /**\n   * ES5 Map implementation. Works.\n   */\n  function Map$1() {\n\n    this._entries = [];\n\n    this.set = function(key, value) {\n\n      var found = false;\n\n      for (var k in this._entries) {\n        if (this._entries[k][0] === key) {\n          this._entries[k][1] = value;\n\n          found = true;\n\n          break;\n        }\n      }\n\n      if (!found) {\n        this._entries.push([ key, value ]);\n      }\n    };\n\n    this.get = function(key) {\n\n      for (var k in this._entries) {\n        if (this._entries[k][0] === key) {\n          return this._entries[k][1];\n        }\n      }\n\n      return null;\n    };\n\n    this.clear = function() {\n      this._entries.length = 0;\n    };\n\n    this.remove = function(key) {\n\n      var idx = -1;\n\n      for (var k in this._entries) {\n        if (this._entries[k][0] === key) {\n          idx = k;\n\n          break;\n        }\n      }\n\n      if (idx !== -1) {\n        this._entries.splice(idx, 1);\n      }\n    };\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../../model/Types').Moddle} Moddle\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Shape} Shape\n   *\n   * @typedef {import('diagram-js/lib/core/Canvas').CanvasPlane} CanvasPlane\n   *\n   * @typedef {import('diagram-js/lib/util/Types').Rect} Rect\n   */\n\n  var DEFAULT_POSITION$1 = {\n    x: 180,\n    y: 160\n  };\n\n  /**\n   * Hook into `import.render.start` and create new planes for diagrams with\n   * collapsed subprocesses and all DI elements on the same plane.\n   *\n   * @param {EventBus} eventBus\n   * @param {Moddle} moddle\n   */\n  function SubprocessCompatibility(eventBus, moddle) {\n    this._eventBus = eventBus;\n    this._moddle = moddle;\n\n    var self = this;\n\n    eventBus.on('import.render.start', 1500, function(e, context) {\n      self._handleImport(context.definitions);\n    });\n  }\n\n  /**\n   * @param {ModdleElement} definitions\n   */\n  SubprocessCompatibility.prototype._handleImport = function(definitions) {\n    if (!definitions.diagrams) {\n      return;\n    }\n\n    var self = this;\n    this._definitions = definitions;\n    this._processToDiagramMap = {};\n\n    definitions.diagrams.forEach(function(diagram) {\n      if (!diagram.plane || !diagram.plane.bpmnElement) {\n        return;\n      }\n\n      self._processToDiagramMap[diagram.plane.bpmnElement.id] = diagram;\n    });\n\n    var newDiagrams = [];\n    definitions.diagrams.forEach(function(diagram) {\n      var createdDiagrams = self._createNewDiagrams(diagram.plane);\n      Array.prototype.push.apply(newDiagrams, createdDiagrams);\n    });\n\n    newDiagrams.forEach(function(diagram) {\n      self._movePlaneElementsToOrigin(diagram.plane);\n    });\n  };\n\n\n  /**\n   * Moves all DI elements from collapsed subprocesses to a new plane.\n   *\n   * @param {CanvasPlane} plane\n   *\n   * @return {ModdleElement[]} new diagrams created for the collapsed subprocesses\n   */\n  SubprocessCompatibility.prototype._createNewDiagrams = function(plane) {\n    var self = this;\n\n    var collapsedElements = [];\n    var elementsToMove = [];\n\n    plane.get('planeElement').forEach(function(diElement) {\n      var businessObject = diElement.bpmnElement;\n\n      if (!businessObject) {\n        return;\n      }\n\n      var parent = businessObject.$parent;\n\n      if (is$1(businessObject, 'bpmn:SubProcess') && !diElement.isExpanded) {\n        collapsedElements.push(businessObject);\n      }\n\n      if (shouldMoveToPlane(businessObject, plane)) {\n\n        // don't change the array while we iterate over it\n        elementsToMove.push({ diElement: diElement, parent: parent });\n      }\n    });\n\n    var newDiagrams = [];\n\n    // create new planes for all collapsed subprocesses, even when they are empty\n    collapsedElements.forEach(function(element) {\n      if (!self._processToDiagramMap[ element.id ]) {\n        var diagram = self._createDiagram(element);\n\n        self._processToDiagramMap[element.id] = diagram;\n\n        newDiagrams.push(diagram);\n      }\n    });\n\n    elementsToMove.forEach(function(element) {\n      var diElement = element.diElement;\n      var parent = element.parent;\n\n      // parent is expanded, get nearest collapsed parent\n      while (parent && collapsedElements.indexOf(parent) === -1) {\n        parent = parent.$parent;\n      }\n\n      // false positive, all parents are expanded\n      if (!parent) {\n        return;\n      }\n\n      var diagram = self._processToDiagramMap[ parent.id ];\n\n      self._moveToDiPlane(diElement, diagram.plane);\n    });\n\n    return newDiagrams;\n  };\n\n  /**\n   * @param {CanvasPlane} plane\n   */\n  SubprocessCompatibility.prototype._movePlaneElementsToOrigin = function(plane) {\n    var elements = plane.get('planeElement');\n\n    // get bounding box of all elements\n    var planeBounds = getPlaneBounds(plane);\n\n    var offset = {\n      x: planeBounds.x - DEFAULT_POSITION$1.x,\n      y: planeBounds.y - DEFAULT_POSITION$1.y\n    };\n\n    elements.forEach(function(diElement) {\n      if (diElement.waypoint) {\n        diElement.waypoint.forEach(function(waypoint) {\n          waypoint.x = waypoint.x - offset.x;\n          waypoint.y = waypoint.y - offset.y;\n        });\n      } else if (diElement.bounds) {\n        diElement.bounds.x = diElement.bounds.x - offset.x;\n        diElement.bounds.y = diElement.bounds.y - offset.y;\n      }\n    });\n  };\n\n  /**\n   * @param {ModdleElement} diElement\n   * @param {CanvasPlane} newPlane\n   */\n  SubprocessCompatibility.prototype._moveToDiPlane = function(diElement, newPlane) {\n    var containingDiagram = findRootDiagram(diElement);\n\n    // remove DI from old Plane and add it to the new one\n    var parentPlaneElement = containingDiagram.plane.get('planeElement');\n\n    parentPlaneElement.splice(parentPlaneElement.indexOf(diElement), 1);\n\n    newPlane.get('planeElement').push(diElement);\n  };\n\n  /**\n   * @param {ModdleElement} businessObject\n   *\n   * @return {ModdleElement}\n   */\n  SubprocessCompatibility.prototype._createDiagram = function(businessObject) {\n    var plane = this._moddle.create('bpmndi:BPMNPlane', {\n      bpmnElement: businessObject\n    });\n\n    var diagram = this._moddle.create('bpmndi:BPMNDiagram', {\n      plane: plane\n    });\n\n    plane.$parent = diagram;\n\n    plane.bpmnElement = businessObject;\n\n    diagram.$parent = this._definitions;\n\n    this._definitions.diagrams.push(diagram);\n\n    return diagram;\n  };\n\n  SubprocessCompatibility.$inject = [ 'eventBus', 'moddle' ];\n\n\n  // helpers //////////\n\n  function findRootDiagram(element) {\n    if (is$1(element, 'bpmndi:BPMNDiagram')) {\n      return element;\n    } else {\n      return findRootDiagram(element.$parent);\n    }\n  }\n\n  /**\n   * @param {CanvasPlane} plane\n   *\n   * @return {Rect}\n   */\n  function getPlaneBounds(plane) {\n    var planeTrbl = {\n      top: Infinity,\n      right: -Infinity,\n      bottom: -Infinity,\n      left: Infinity\n    };\n\n    plane.planeElement.forEach(function(element) {\n      if (!element.bounds) {\n        return;\n      }\n\n      var trbl = asTRBL(element.bounds);\n\n      planeTrbl.top = Math.min(trbl.top, planeTrbl.top);\n      planeTrbl.left = Math.min(trbl.left, planeTrbl.left);\n    });\n\n    return asBounds(planeTrbl);\n  }\n\n  /**\n   * @param {ModdleElement} businessObject\n   * @param {CanvasPlane} plane\n   *\n   * @return {boolean}\n   */\n  function shouldMoveToPlane(businessObject, plane) {\n    var parent = businessObject.$parent;\n\n    // don't move elements that are already on the plane\n    if (!is$1(parent, 'bpmn:SubProcess') || parent === plane.bpmnElement) {\n      return false;\n    }\n\n    // dataAssociations are children of the subprocess but rendered on process level\n    // cf. https://github.com/bpmn-io/bpmn-js/issues/1619\n    if (isAny(businessObject, [ 'bpmn:DataInputAssociation', 'bpmn:DataOutputAssociation' ])) {\n      return false;\n    }\n\n    return true;\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('diagram-js/lib/features/overlays/Overlays').default} Overlays\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Parent} Parent\n   * @typedef {import('../../model/Types').Shape} Shape\n   */\n\n  var LOW_PRIORITY$n = 250;\n  var ARROW_DOWN_SVG = '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 16 16\"><path fill-rule=\"evenodd\" d=\"M4.81801948,3.50735931 L10.4996894,9.1896894 L10.5,4 L12,4 L12,12 L4,12 L4,10.5 L9.6896894,10.4996894 L3.75735931,4.56801948 C3.46446609,4.27512627 3.46446609,3.80025253 3.75735931,3.50735931 C4.05025253,3.21446609 4.52512627,3.21446609 4.81801948,3.50735931 Z\"/></svg>';\n\n  var EMPTY_MARKER = 'bjs-drilldown-empty';\n\n  /**\n   * @param {Canvas} canvas\n   * @param {EventBus} eventBus\n   * @param {ElementRegistry} elementRegistry\n   * @param {Overlays} overlays\n   */\n  function DrilldownOverlayBehavior(\n      canvas, eventBus, elementRegistry, overlays\n  ) {\n    CommandInterceptor.call(this, eventBus);\n\n    this._canvas = canvas;\n    this._eventBus = eventBus;\n    this._elementRegistry = elementRegistry;\n    this._overlays = overlays;\n\n    var self = this;\n\n    this.executed('shape.toggleCollapse', LOW_PRIORITY$n, function(context) {\n      var shape = context.shape;\n\n      // Add overlay to the collapsed shape\n      if (self._canDrillDown(shape)) {\n        self._addOverlay(shape);\n      } else {\n        self._removeOverlay(shape);\n      }\n    }, true);\n\n\n    this.reverted('shape.toggleCollapse', LOW_PRIORITY$n, function(context) {\n      var shape = context.shape;\n\n      // Add overlay to the collapsed shape\n      if (self._canDrillDown(shape)) {\n        self._addOverlay(shape);\n      } else {\n        self._removeOverlay(shape);\n      }\n    }, true);\n\n\n    this.executed([ 'shape.create', 'shape.move', 'shape.delete' ], LOW_PRIORITY$n,\n      function(context) {\n        var oldParent = context.oldParent,\n            newParent = context.newParent || context.parent,\n            shape = context.shape;\n\n        // Add overlay to the collapsed shape\n        if (self._canDrillDown(shape)) {\n          self._addOverlay(shape);\n        }\n\n        self._updateDrilldownOverlay(oldParent);\n        self._updateDrilldownOverlay(newParent);\n        self._updateDrilldownOverlay(shape);\n      }, true);\n\n\n    this.reverted([ 'shape.create', 'shape.move', 'shape.delete' ], LOW_PRIORITY$n,\n      function(context) {\n        var oldParent = context.oldParent,\n            newParent = context.newParent || context.parent,\n            shape = context.shape;\n\n        // Add overlay to the collapsed shape\n        if (self._canDrillDown(shape)) {\n          self._addOverlay(shape);\n        }\n\n        self._updateDrilldownOverlay(oldParent);\n        self._updateDrilldownOverlay(newParent);\n        self._updateDrilldownOverlay(shape);\n      }, true);\n\n\n    eventBus.on('import.render.complete', function() {\n      elementRegistry.filter(function(e) {\n        return self._canDrillDown(e);\n      }).map(function(el) {\n        self._addOverlay(el);\n      });\n    });\n\n  }\n\n  e$3(DrilldownOverlayBehavior, CommandInterceptor);\n\n  /**\n   * @param {Shape} shape\n   */\n  DrilldownOverlayBehavior.prototype._updateDrilldownOverlay = function(shape) {\n    var canvas = this._canvas;\n\n    if (!shape) {\n      return;\n    }\n\n    var root = canvas.findRoot(shape);\n\n    if (root) {\n      this._updateOverlayVisibility(root);\n    }\n  };\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  DrilldownOverlayBehavior.prototype._canDrillDown = function(element) {\n    var canvas = this._canvas;\n\n    return is$1(element, 'bpmn:SubProcess') && canvas.findRoot(getPlaneIdFromShape(element));\n  };\n\n  /**\n   * Update the visibility of the drilldown overlay. If the plane has no elements,\n   * the drilldown will only be shown when the element is selected.\n   *\n   * @param {Parent} element The collapsed root or shape.\n   */\n  DrilldownOverlayBehavior.prototype._updateOverlayVisibility = function(element) {\n    var overlays = this._overlays;\n\n    var businessObject = getBusinessObject(element);\n\n    var overlay = overlays.get({ element: businessObject.id, type: 'drilldown' })[0];\n\n    if (!overlay) {\n      return;\n    }\n\n    var hasFlowElements = businessObject\n      && businessObject.get('flowElements')\n      && businessObject.get('flowElements').length;\n\n    classes$1(overlay.html).toggle(EMPTY_MARKER, !hasFlowElements);\n  };\n\n  /**\n   * Add a drilldown button to the given element assuming the plane has the same\n   * ID as the element.\n   *\n   * @param {Shape} element The collapsed shape.\n   */\n  DrilldownOverlayBehavior.prototype._addOverlay = function(element) {\n    var canvas = this._canvas,\n        overlays = this._overlays;\n\n    var existingOverlays = overlays.get({ element: element, type: 'drilldown' });\n\n    if (existingOverlays.length) {\n      this._removeOverlay(element);\n    }\n\n    var button = domify$1('<button class=\"bjs-drilldown\">' + ARROW_DOWN_SVG + '</button>');\n\n    button.addEventListener('click', function() {\n      canvas.setRootElement(canvas.findRoot(getPlaneIdFromShape(element)));\n    });\n\n    overlays.add(element, 'drilldown', {\n      position: {\n        bottom: -7,\n        right: -8\n      },\n      html: button\n    });\n\n    this._updateOverlayVisibility(element);\n  };\n\n  DrilldownOverlayBehavior.prototype._removeOverlay = function(element) {\n    var overlays = this._overlays;\n\n    overlays.remove({\n      element: element,\n      type: 'drilldown'\n    });\n  };\n\n  DrilldownOverlayBehavior.$inject = [\n    'canvas',\n    'eventBus',\n    'elementRegistry',\n    'overlays'\n  ];\n\n  var DrilldownModdule = {\n    __depends__: [ OverlaysModule, ChangeSupportModule, RootElementsModule ],\n    __init__: [ 'drilldownBreadcrumbs', 'drilldownOverlayBehavior', 'drilldownCentering', 'subprocessCompatibility' ],\n    drilldownBreadcrumbs: [ 'type', DrilldownBreadcrumbs ],\n    drilldownCentering: [ 'type', DrilldownCentering ],\n    drilldownOverlayBehavior: [ 'type', DrilldownOverlayBehavior ],\n    subprocessCompatibility: [ 'type', SubprocessCompatibility ]\n  };\n\n  /**\n   * @typedef { import('./BaseViewer').BaseViewerOptions } BaseViewerOptions\n   */\n\n  /**\n   * A viewer for BPMN 2.0 diagrams.\n   *\n   * Have a look at {@link NavigatedViewer} or {@link Modeler} for bundles that include\n   * additional features.\n   *\n   *\n   * ## Extending the Viewer\n   *\n   * In order to extend the viewer pass extension modules to bootstrap via the\n   * `additionalModules` option. An extension module is an object that exposes\n   * named services.\n   *\n   * The following example depicts the integration of a simple\n   * logging component that integrates with interaction events:\n   *\n   *\n   * ```javascript\n   *\n   * // logging component\n   * function InteractionLogger(eventBus) {\n   *   eventBus.on('element.hover', function(event) {\n   *     console.log()\n   *   })\n   * }\n   *\n   * InteractionLogger.$inject = [ 'eventBus' ]; // minification save\n   *\n   * // extension module\n   * var extensionModule = {\n   *   __init__: [ 'interactionLogger' ],\n   *   interactionLogger: [ 'type', InteractionLogger ]\n   * };\n   *\n   * // extend the viewer\n   * var bpmnViewer = new Viewer({ additionalModules: [ extensionModule ] });\n   * bpmnViewer.importXML(...);\n   * ```\n   *\n   * @param {BaseViewerOptions} [options] The options to configure the viewer.\n   */\n  function Viewer(options) {\n    BaseViewer.call(this, options);\n  }\n\n  e$3(Viewer, BaseViewer);\n\n  // modules the viewer is composed of\n  Viewer.prototype._modules = [\n    CoreModule,\n    translate,\n    SelectionModule,\n    OverlaysModule,\n    DrilldownModdule\n  ];\n\n  // default moddle extensions the viewer is composed of\n  Viewer.prototype._moddleExtensions = {};\n\n  var KEYS_COPY = [ 'c', 'C' ];\r\n  var KEYS_PASTE = [ 'v', 'V' ];\r\n  var KEYS_REDO = [ 'y', 'Y' ];\r\n  var KEYS_UNDO = [ 'z', 'Z' ];\r\n\r\n  /**\r\n   * Returns true if event was triggered with any modifier\r\n   * @param {KeyboardEvent} event\r\n   */\r\n  function hasModifier(event) {\r\n    return (event.ctrlKey || event.metaKey || event.shiftKey || event.altKey);\r\n  }\r\n\r\n  /**\r\n   * @param {KeyboardEvent} event\r\n   * @return {boolean}\r\n   */\r\n  function isCmd(event) {\r\n\r\n    // ensure we don't react to AltGr\r\n    // (mapped to CTRL + ALT)\r\n    if (event.altKey) {\r\n      return false;\r\n    }\r\n\r\n    return event.ctrlKey || event.metaKey;\r\n  }\r\n\r\n  /**\r\n   * Checks if key pressed is one of provided keys.\r\n   *\r\n   * @param {string|string[]} keys\r\n   * @param {KeyboardEvent} event\r\n   * @return {boolean}\r\n   */\r\n  function isKey(keys, event) {\r\n    keys = isArray$3(keys) ? keys : [ keys ];\r\n\r\n    return keys.indexOf(event.key) !== -1 || keys.indexOf(event.code) !== -1;\r\n  }\r\n\r\n  /**\r\n   * @param {KeyboardEvent} event\r\n   */\r\n  function isShift(event) {\r\n    return event.shiftKey;\r\n  }\r\n\r\n  /**\r\n   * @param {KeyboardEvent} event\r\n   */\r\n  function isCopy(event) {\r\n    return isCmd(event) && isKey(KEYS_COPY, event);\r\n  }\r\n\r\n  /**\r\n   * @param {KeyboardEvent} event\r\n   */\r\n  function isPaste(event) {\r\n    return isCmd(event) && isKey(KEYS_PASTE, event);\r\n  }\r\n\r\n  /**\r\n   * @param {KeyboardEvent} event\r\n   */\r\n  function isUndo(event) {\r\n    return isCmd(event) && !isShift(event) && isKey(KEYS_UNDO, event);\r\n  }\r\n\r\n  /**\r\n   * @param {KeyboardEvent} event\r\n   */\r\n  function isRedo(event) {\r\n    return isCmd(event) && (\r\n      isKey(KEYS_REDO, event) || (\r\n        isKey(KEYS_UNDO, event) && isShift(event)\r\n      )\r\n    );\r\n  }\n\n  /**\n   * @typedef {import('../../core/EventBus').default} EventBus\n   *\n   * @typedef {({ keyEvent: KeyboardEvent }) => any} Listener\n   */\n\n  var KEYDOWN_EVENT = 'keyboard.keydown',\n      KEYUP_EVENT = 'keyboard.keyup';\n\n  var HANDLE_MODIFIER_ATTRIBUTE = 'input-handle-modified-keys';\n\n  var DEFAULT_PRIORITY$3 = 1000;\n\n  /**\n   * A keyboard abstraction that may be activated and\n   * deactivated by users at will, consuming global key events\n   * and triggering diagram actions.\n   *\n   * For keys pressed down, keyboard fires `keyboard.keydown` event.\n   * The event context contains one field which is `KeyboardEvent` event.\n   *\n   * The implementation fires the following key events that allow\n   * other components to hook into key handling:\n   *\n   *  - keyboard.bind\n   *  - keyboard.unbind\n   *  - keyboard.init\n   *  - keyboard.destroy\n   *\n   * All events contain one field which is node.\n   *\n   * A default binding for the keyboard may be specified via the\n   * `keyboard.bindTo` configuration option.\n   *\n   * @param {Object} config\n   * @param {EventTarget} [config.bindTo]\n   * @param {EventBus} eventBus\n   */\n  function Keyboard(config, eventBus) {\n    var self = this;\n\n    this._config = config || {};\n    this._eventBus = eventBus;\n\n    this._keydownHandler = this._keydownHandler.bind(this);\n    this._keyupHandler = this._keyupHandler.bind(this);\n\n    // properly clean dom registrations\n    eventBus.on('diagram.destroy', function() {\n      self._fire('destroy');\n\n      self.unbind();\n    });\n\n    eventBus.on('diagram.init', function() {\n      self._fire('init');\n    });\n\n    eventBus.on('attach', function() {\n      if (config && config.bindTo) {\n        self.bind(config.bindTo);\n      }\n    });\n\n    eventBus.on('detach', function() {\n      self.unbind();\n    });\n  }\n\n  Keyboard.$inject = [\n    'config.keyboard',\n    'eventBus'\n  ];\n\n  Keyboard.prototype._keydownHandler = function(event) {\n    this._keyHandler(event, KEYDOWN_EVENT);\n  };\n\n  Keyboard.prototype._keyupHandler = function(event) {\n    this._keyHandler(event, KEYUP_EVENT);\n  };\n\n  Keyboard.prototype._keyHandler = function(event, type) {\n    var eventBusResult;\n\n    if (this._isEventIgnored(event)) {\n      return;\n    }\n\n    var context = {\n      keyEvent: event\n    };\n\n    eventBusResult = this._eventBus.fire(type || KEYDOWN_EVENT, context);\n\n    if (eventBusResult) {\n      event.preventDefault();\n    }\n  };\n\n  Keyboard.prototype._isEventIgnored = function(event) {\n    if (event.defaultPrevented) {\n      return true;\n    }\n\n    return isInput(event.target) && this._isModifiedKeyIgnored(event);\n  };\n\n  Keyboard.prototype._isModifiedKeyIgnored = function(event) {\n    if (!isCmd(event)) {\n      return true;\n    }\n\n    var allowedModifiers = this._getAllowedModifiers(event.target);\n    return allowedModifiers.indexOf(event.key) === -1;\n  };\n\n  Keyboard.prototype._getAllowedModifiers = function(element) {\n    var modifierContainer = closest(element, '[' + HANDLE_MODIFIER_ATTRIBUTE + ']', true);\n\n    if (!modifierContainer || (this._node && !this._node.contains(modifierContainer))) {\n      return [];\n    }\n\n    return modifierContainer.getAttribute(HANDLE_MODIFIER_ATTRIBUTE).split(',');\n  };\n\n  /**\n   * Bind keyboard events to the given DOM node.\n   *\n   * @param {EventTarget} node\n   */\n  Keyboard.prototype.bind = function(node) {\n\n    // make sure that the keyboard is only bound once to the DOM\n    this.unbind();\n\n    this._node = node;\n\n    // bind key events\n    event.bind(node, 'keydown', this._keydownHandler);\n    event.bind(node, 'keyup', this._keyupHandler);\n\n    this._fire('bind');\n  };\n\n  /**\n   * @return {EventTarget}\n   */\n  Keyboard.prototype.getBinding = function() {\n    return this._node;\n  };\n\n  Keyboard.prototype.unbind = function() {\n    var node = this._node;\n\n    if (node) {\n      this._fire('unbind');\n\n      // unbind key events\n      event.unbind(node, 'keydown', this._keydownHandler);\n      event.unbind(node, 'keyup', this._keyupHandler);\n    }\n\n    this._node = null;\n  };\n\n  /**\n   * @param {string} event\n   */\n  Keyboard.prototype._fire = function(event) {\n    this._eventBus.fire('keyboard.' + event, { node: this._node });\n  };\n\n  /**\n   * Add a listener function that is notified with `KeyboardEvent` whenever\n   * the keyboard is bound and the user presses a key. If no priority is\n   * provided, the default value of 1000 is used.\n   *\n   * @param {number} [priority]\n   * @param {Listener} listener\n   * @param {string} [type='keyboard.keydown']\n   */\n  Keyboard.prototype.addListener = function(priority, listener, type) {\n    if (isFunction(priority)) {\n      type = listener;\n      listener = priority;\n      priority = DEFAULT_PRIORITY$3;\n    }\n\n    this._eventBus.on(type || KEYDOWN_EVENT, priority, listener);\n  };\n\n  /**\n   * Remove a listener function.\n   *\n   * @param {Listener} listener\n   * @param {string} [type='keyboard.keydown']\n   */\n  Keyboard.prototype.removeListener = function(listener, type) {\n    this._eventBus.off(type || KEYDOWN_EVENT, listener);\n  };\n\n  Keyboard.prototype.hasModifier = hasModifier;\n  Keyboard.prototype.isCmd = isCmd;\n  Keyboard.prototype.isShift = isShift;\n  Keyboard.prototype.isKey = isKey;\n\n\n\n  // helpers ///////\n\n  function isInput(target) {\n    return target && (matches(target, 'input, textarea') || target.contentEditable === 'true');\n  }\n\n  var LOW_PRIORITY$m = 500;\n\n\n  /**\n   * Adds default keyboard bindings.\n   *\n   * This does not pull in any features will bind only actions that\n   * have previously been registered against the editorActions component.\n   *\n   * @param {EventBus} eventBus\n   * @param {Keyboard} keyboard\n   */\n  function KeyboardBindings(eventBus, keyboard) {\n\n    var self = this;\n\n    eventBus.on('editorActions.init', LOW_PRIORITY$m, function(event) {\n\n      var editorActions = event.editorActions;\n\n      self.registerBindings(keyboard, editorActions);\n    });\n  }\n\n  KeyboardBindings.$inject = [\n    'eventBus',\n    'keyboard'\n  ];\n\n\n  /**\n   * Register available keyboard bindings.\n   *\n   * @param {Keyboard} keyboard\n   * @param {EditorActions} editorActions\n   */\n  KeyboardBindings.prototype.registerBindings = function(keyboard, editorActions) {\n\n    /**\n     * Add keyboard binding if respective editor action\n     * is registered.\n     *\n     * @param {string} action name\n     * @param {Function} fn that implements the key binding\n     */\n    function addListener(action, fn) {\n\n      if (editorActions.isRegistered(action)) {\n        keyboard.addListener(fn);\n      }\n    }\n\n\n    // undo\n    // (CTRL|CMD) + Z\n    addListener('undo', function(context) {\n\n      var event = context.keyEvent;\n\n      if (isUndo(event)) {\n        editorActions.trigger('undo');\n\n        return true;\n      }\n    });\n\n    // redo\n    // CTRL + Y\n    // CMD + SHIFT + Z\n    addListener('redo', function(context) {\n\n      var event = context.keyEvent;\n\n      if (isRedo(event)) {\n        editorActions.trigger('redo');\n\n        return true;\n      }\n    });\n\n    // copy\n    // CTRL/CMD + C\n    addListener('copy', function(context) {\n\n      var event = context.keyEvent;\n\n      if (isCopy(event)) {\n        editorActions.trigger('copy');\n\n        return true;\n      }\n    });\n\n    // paste\n    // CTRL/CMD + V\n    addListener('paste', function(context) {\n\n      var event = context.keyEvent;\n\n      if (isPaste(event)) {\n        editorActions.trigger('paste');\n\n        return true;\n      }\n    });\n\n    // zoom in one step\n    // CTRL/CMD + +\n    addListener('stepZoom', function(context) {\n\n      var event = context.keyEvent;\n\n      // quirk: it has to be triggered by `=` as well to work on international keyboard layout\n      // cf: https://github.com/bpmn-io/bpmn-js/issues/1362#issuecomment-722989754\n      if (isKey([ '+', 'Add', '=' ], event) && isCmd(event)) {\n        editorActions.trigger('stepZoom', { value: 1 });\n\n        return true;\n      }\n    });\n\n    // zoom out one step\n    // CTRL + -\n    addListener('stepZoom', function(context) {\n\n      var event = context.keyEvent;\n\n      if (isKey([ '-', 'Subtract' ], event) && isCmd(event)) {\n        editorActions.trigger('stepZoom', { value: -1 });\n\n        return true;\n      }\n    });\n\n    // zoom to the default level\n    // CTRL + 0\n    addListener('zoom', function(context) {\n\n      var event = context.keyEvent;\n\n      if (isKey('0', event) && isCmd(event)) {\n        editorActions.trigger('zoom', { value: 1 });\n\n        return true;\n      }\n    });\n\n    // delete selected element\n    // DEL\n    addListener('removeSelection', function(context) {\n\n      var event = context.keyEvent;\n\n      if (isKey([ 'Backspace', 'Delete', 'Del' ], event)) {\n        editorActions.trigger('removeSelection');\n\n        return true;\n      }\n    });\n  };\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var KeyboardModule$1 = {\n    __init__: [ 'keyboard', 'keyboardBindings' ],\n    keyboard: [ 'type', Keyboard ],\n    keyboardBindings: [ 'type', KeyboardBindings ]\n  };\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../features/keyboard/Keyboard').default} Keyboard\n   */\n\n  var DEFAULT_CONFIG$1 = {\n    moveSpeed: 50,\n    moveSpeedAccelerated: 200\n  };\n\n\n  /**\n   * A feature that allows users to move the canvas using the keyboard.\n   *\n   * @param {Object} config\n   * @param {number} [config.moveSpeed=50]\n   * @param {number} [config.moveSpeedAccelerated=200]\n   * @param {Keyboard} keyboard\n   * @param {Canvas} canvas\n   */\n  function KeyboardMove(\n      config,\n      keyboard,\n      canvas\n  ) {\n\n    var self = this;\n\n    this._config = assign$1({}, DEFAULT_CONFIG$1, config || {});\n\n    keyboard.addListener(arrowsListener);\n\n\n    function arrowsListener(context) {\n\n      var event = context.keyEvent,\n          config = self._config;\n\n      if (!keyboard.isCmd(event)) {\n        return;\n      }\n\n      if (keyboard.isKey([\n        'ArrowLeft', 'Left',\n        'ArrowUp', 'Up',\n        'ArrowDown', 'Down',\n        'ArrowRight', 'Right'\n      ], event)) {\n\n        var speed = (\n          keyboard.isShift(event) ?\n            config.moveSpeedAccelerated :\n            config.moveSpeed\n        );\n\n        var direction;\n\n        switch (event.key) {\n        case 'ArrowLeft':\n        case 'Left':\n          direction = 'left';\n          break;\n        case 'ArrowUp':\n        case 'Up':\n          direction = 'up';\n          break;\n        case 'ArrowRight':\n        case 'Right':\n          direction = 'right';\n          break;\n        case 'ArrowDown':\n        case 'Down':\n          direction = 'down';\n          break;\n        }\n\n        self.moveCanvas({\n          speed: speed,\n          direction: direction\n        });\n\n        return true;\n      }\n    }\n\n    /**\n     * @param {{\n     *   direction: 'up' | 'down' | 'left' | 'right';\n     *   speed: number;\n     * }} options\n     */\n    this.moveCanvas = function(options) {\n\n      var dx = 0,\n          dy = 0,\n          speed = options.speed;\n\n      var actualSpeed = speed / Math.min(Math.sqrt(canvas.viewbox().scale), 1);\n\n      switch (options.direction) {\n      case 'left': // Left\n        dx = actualSpeed;\n        break;\n      case 'up': // Up\n        dy = actualSpeed;\n        break;\n      case 'right': // Right\n        dx = -actualSpeed;\n        break;\n      case 'down': // Down\n        dy = -actualSpeed;\n        break;\n      }\n\n      canvas.scroll({\n        dx: dx,\n        dy: dy\n      });\n    };\n\n  }\n\n\n  KeyboardMove.$inject = [\n    'config.keyboardMove',\n    'keyboard',\n    'canvas'\n  ];\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var KeyboardMoveModule = {\n    __depends__: [\n      KeyboardModule$1\n    ],\n    __init__: [ 'keyboardMove' ],\n    keyboardMove: [ 'type', KeyboardMove ]\n  };\n\n  var CURSOR_CLS_PATTERN = /^djs-cursor-.*$/;\n\n  /**\n   * @param {string} mode\n   */\n  function set(mode) {\n    var classes = classes$1(document.body);\n\n    classes.removeMatching(CURSOR_CLS_PATTERN);\n\n    if (mode) {\n      classes.add('djs-cursor-' + mode);\n    }\n  }\n\n  function unset() {\n    set(null);\n  }\n\n  /**\n   * @typedef {import('../core/EventBus').EventBus} EventBus\n   */\n\n  var TRAP_PRIORITY = 5000;\n\n  /**\n   * Installs a click trap that prevents a ghost click following a dragging operation.\n   *\n   * @param {EventBus} eventBus\n   * @param {string} [eventName='element.click']\n   *\n   * @return {() => void} a function to immediately remove the installed trap.\n   */\n  function install(eventBus, eventName) {\n\n    eventName = eventName || 'element.click';\n\n    function trap() {\n      return false;\n    }\n\n    eventBus.once(eventName, TRAP_PRIORITY, trap);\n\n    return function() {\n      eventBus.off(eventName, trap);\n    };\n  }\n\n  /**\n   * @typedef {import('../util/Types').Point} Point\n   * @typedef {import('../util/Types').Rect} Rect\n   */\n\n  /**\n   * @param {Rect} bounds\n   * @return {Point}\n   */\n  function center(bounds) {\n    return {\n      x: bounds.x + (bounds.width / 2),\n      y: bounds.y + (bounds.height / 2)\n    };\n  }\n\n\n  /**\n   * @param {Point} a\n   * @param {Point} b\n   * @return {Point}\n   */\n  function delta(a, b) {\n    return {\n      x: a.x - b.x,\n      y: a.y - b.y\n    };\n  }\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   */\n\n  var THRESHOLD$1 = 15;\n\n\n  /**\n   * Move the canvas via mouse.\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   */\n  function MoveCanvas(eventBus, canvas) {\n\n    var context;\n\n\n    // listen for move on element mouse down;\n    // allow others to hook into the event before us though\n    // (dragging / element moving will do this)\n    eventBus.on('element.mousedown', 500, function(e) {\n      return handleStart(e.originalEvent);\n    });\n\n\n    function handleMove(event) {\n\n      var start = context.start,\n          button = context.button,\n          position = toPoint(event),\n          delta$1 = delta(position, start);\n\n      if (!context.dragging && length(delta$1) > THRESHOLD$1) {\n        context.dragging = true;\n\n        if (button === 0) {\n          install(eventBus);\n        }\n\n        set('grab');\n      }\n\n      if (context.dragging) {\n\n        var lastPosition = context.last || context.start;\n\n        delta$1 = delta(position, lastPosition);\n\n        canvas.scroll({\n          dx: delta$1.x,\n          dy: delta$1.y\n        });\n\n        context.last = position;\n      }\n\n      // prevent select\n      event.preventDefault();\n    }\n\n\n    function handleEnd(event$1) {\n      event.unbind(document, 'mousemove', handleMove);\n      event.unbind(document, 'mouseup', handleEnd);\n\n      context = null;\n\n      unset();\n    }\n\n    function handleStart(event$1) {\n\n      // event is already handled by '.djs-draggable'\n      if (closest(event$1.target, '.djs-draggable')) {\n        return;\n      }\n\n      var button = event$1.button;\n\n      // reject right mouse button or modifier key\n      if (button >= 2 || event$1.ctrlKey || event$1.shiftKey || event$1.altKey) {\n        return;\n      }\n\n      context = {\n        button: button,\n        start: toPoint(event$1)\n      };\n\n      event.bind(document, 'mousemove', handleMove);\n      event.bind(document, 'mouseup', handleEnd);\n\n      // we've handled the event\n      return true;\n    }\n\n    this.isActive = function() {\n      return !!context;\n    };\n\n  }\n\n\n  MoveCanvas.$inject = [\n    'eventBus',\n    'canvas'\n  ];\n\n\n\n  // helpers ///////\n\n  function length(point) {\n    return Math.sqrt(Math.pow(point.x, 2) + Math.pow(point.y, 2));\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var MoveCanvasModule = {\n    __init__: [ 'moveCanvas' ],\n    moveCanvas: [ 'type', MoveCanvas ]\n  };\n\n  /**\n   * Get the logarithm of x with base 10.\n   *\n   * @param {number} x\n   */\n  function log10(x) {\n    return Math.log(x) / Math.log(10);\n  }\n\n  /**\n   * Get step size for given range and number of steps.\n   *\n   * @param {Object} range\n   * @param {number} range.min\n   * @param {number} range.max\n   * @param {number} steps\n   */\n  function getStepSize(range, steps) {\n\n    var minLinearRange = log10(range.min),\n        maxLinearRange = log10(range.max);\n\n    var absoluteLinearRange = Math.abs(minLinearRange) + Math.abs(maxLinearRange);\n\n    return absoluteLinearRange / steps;\n  }\n\n  /**\n   * @param {Object} range\n   * @param {number} range.min\n   * @param {number} range.max\n   * @param {number} scale\n   */\n  function cap(range, scale) {\n    return Math.max(range.min, Math.min(range.max, scale));\n  }\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   *\n   * @typedef {import('../../util/Types').Point} Point\n   */\n\n  var sign = Math.sign || function(n) {\n    return n >= 0 ? 1 : -1;\n  };\n\n  var RANGE = { min: 0.2, max: 4 },\n      NUM_STEPS = 10;\n\n  var DELTA_THRESHOLD = 0.1;\n\n  var DEFAULT_SCALE = 0.75;\n\n  /**\n   * An implementation of zooming and scrolling within the\n   * {@link Canvas} via the mouse wheel.\n   *\n   * Mouse wheel zooming / scrolling may be disabled using\n   * the {@link toggle(enabled)} method.\n   *\n   * @param {Object} [config]\n   * @param {boolean} [config.enabled=true] default enabled state\n   * @param {number} [config.scale=.75] scroll sensivity\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   */\n  function ZoomScroll(config, eventBus, canvas) {\n\n    config = config || {};\n\n    this._enabled = false;\n\n    this._canvas = canvas;\n    this._container = canvas._container;\n\n    this._handleWheel = bind$2(this._handleWheel, this);\n\n    this._totalDelta = 0;\n    this._scale = config.scale || DEFAULT_SCALE;\n\n    var self = this;\n\n    eventBus.on('canvas.init', function(e) {\n      self._init(config.enabled !== false);\n    });\n  }\n\n  ZoomScroll.$inject = [\n    'config.zoomScroll',\n    'eventBus',\n    'canvas'\n  ];\n\n  /**\n   * @param {Point} delta\n   */\n  ZoomScroll.prototype.scroll = function scroll(delta) {\n    this._canvas.scroll(delta);\n  };\n\n\n  ZoomScroll.prototype.reset = function reset() {\n    this._canvas.zoom('fit-viewport');\n  };\n\n  /**\n   * Zoom depending on delta.\n   *\n   * @param {number} delta\n   * @param {Point} position\n   */\n  ZoomScroll.prototype.zoom = function zoom(delta, position) {\n\n    // zoom with half the step size of stepZoom\n    var stepSize = getStepSize(RANGE, NUM_STEPS * 2);\n\n    // add until threshold reached\n    this._totalDelta += delta;\n\n    if (Math.abs(this._totalDelta) > DELTA_THRESHOLD) {\n      this._zoom(delta, position, stepSize);\n\n      // reset\n      this._totalDelta = 0;\n    }\n  };\n\n\n  ZoomScroll.prototype._handleWheel = function handleWheel(event) {\n\n    // event is already handled by '.djs-scrollable'\n    if (closest(event.target, '.djs-scrollable', true)) {\n      return;\n    }\n\n    var element = this._container;\n\n    event.preventDefault();\n\n    // pinch to zoom is mapped to wheel + ctrlKey = true\n    // in modern browsers (!)\n\n    var isZoom = event.ctrlKey;\n\n    var isHorizontalScroll = event.shiftKey;\n\n    var factor = -1 * this._scale,\n        delta;\n\n    if (isZoom) {\n      factor *= event.deltaMode === 0 ? 0.020 : 0.32;\n    } else {\n      factor *= event.deltaMode === 0 ? 1.0 : 16.0;\n    }\n\n    if (isZoom) {\n      var elementRect = element.getBoundingClientRect();\n\n      var offset = {\n        x: event.clientX - elementRect.left,\n        y: event.clientY - elementRect.top\n      };\n\n      delta = (\n        Math.sqrt(\n          Math.pow(event.deltaY, 2) +\n          Math.pow(event.deltaX, 2)\n        ) * sign(event.deltaY) * factor\n      );\n\n      // zoom in relative to diagram {x,y} coordinates\n      this.zoom(delta, offset);\n    } else {\n\n      if (isHorizontalScroll) {\n        delta = {\n          dx: factor * event.deltaY,\n          dy: 0\n        };\n      } else {\n        delta = {\n          dx: factor * event.deltaX,\n          dy: factor * event.deltaY\n        };\n      }\n\n      this.scroll(delta);\n    }\n  };\n\n  /**\n   * Zoom with fixed step size.\n   *\n   * @param {number} delta Zoom delta (1 for zooming in, -1 for zooming out).\n   * @param {Point} position\n   */\n  ZoomScroll.prototype.stepZoom = function stepZoom(delta, position) {\n\n    var stepSize = getStepSize(RANGE, NUM_STEPS);\n\n    this._zoom(delta, position, stepSize);\n  };\n\n\n  /**\n   * Zoom in/out given a step size.\n   *\n   * @param {number} delta\n   * @param {Point} position\n   * @param {number} stepSize\n   */\n  ZoomScroll.prototype._zoom = function(delta, position, stepSize) {\n    var canvas = this._canvas;\n\n    var direction = delta > 0 ? 1 : -1;\n\n    var currentLinearZoomLevel = log10(canvas.zoom());\n\n    // snap to a proximate zoom step\n    var newLinearZoomLevel = Math.round(currentLinearZoomLevel / stepSize) * stepSize;\n\n    // increase or decrease one zoom step in the given direction\n    newLinearZoomLevel += stepSize * direction;\n\n    // calculate the absolute logarithmic zoom level based on the linear zoom level\n    // (e.g. 2 for an absolute x2 zoom)\n    var newLogZoomLevel = Math.pow(10, newLinearZoomLevel);\n\n    canvas.zoom(cap(RANGE, newLogZoomLevel), position);\n  };\n\n\n  /**\n   * Toggle the zoom scroll ability via mouse wheel.\n   *\n   * @param {boolean} [newEnabled] new enabled state\n   */\n  ZoomScroll.prototype.toggle = function toggle(newEnabled) {\n\n    var element = this._container;\n    var handleWheel = this._handleWheel;\n\n    var oldEnabled = this._enabled;\n\n    if (typeof newEnabled === 'undefined') {\n      newEnabled = !oldEnabled;\n    }\n\n    // only react on actual changes\n    if (oldEnabled !== newEnabled) {\n\n      // add or remove wheel listener based on\n      // changed enabled state\n      event[newEnabled ? 'bind' : 'unbind'](element, 'wheel', handleWheel, false);\n    }\n\n    this._enabled = newEnabled;\n\n    return newEnabled;\n  };\n\n\n  ZoomScroll.prototype._init = function(newEnabled) {\n    this.toggle(newEnabled);\n  };\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var ZoomScrollModule = {\n    __init__: [ 'zoomScroll' ],\n    zoomScroll: [ 'type', ZoomScroll ]\n  };\n\n  /**\n   * @typedef { import('./BaseViewer').BaseViewerOptions } BaseViewerOptions\n   */\n\n  /**\n   * A viewer with mouse and keyboard navigation features.\n   *\n   * @param {BaseViewerOptions} [options]\n   */\n  function NavigatedViewer(options) {\n    Viewer.call(this, options);\n  }\n\n  e$3(NavigatedViewer, Viewer);\n\n\n  NavigatedViewer.prototype._navigationModules = [\n    KeyboardMoveModule,\n    MoveCanvasModule,\n    ZoomScrollModule\n  ];\n\n  NavigatedViewer.prototype._modules = [].concat(\n    Viewer.prototype._modules,\n    NavigatedViewer.prototype._navigationModules\n  );\n\n  var hammer = {exports: {}};\n\n  /*! Hammer.JS - v2.0.7 - 2016-04-22\n   * http://hammerjs.github.io/\n   *\n   * Copyright (c) 2016 Jorik Tangelder;\n   * Licensed under the MIT license */\n\n  (function (module) {\n  \t(function(window, document, exportName, undefined$1) {\n\n  \tvar VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o'];\n  \tvar TEST_ELEMENT = document.createElement('div');\n\n  \tvar TYPE_FUNCTION = 'function';\n\n  \tvar round = Math.round;\n  \tvar abs = Math.abs;\n  \tvar now = Date.now;\n\n  \t/**\n  \t * set a timeout with a given scope\n  \t * @param {Function} fn\n  \t * @param {Number} timeout\n  \t * @param {Object} context\n  \t * @returns {number}\n  \t */\n  \tfunction setTimeoutContext(fn, timeout, context) {\n  \t    return setTimeout(bindFn(fn, context), timeout);\n  \t}\n\n  \t/**\n  \t * if the argument is an array, we want to execute the fn on each entry\n  \t * if it aint an array we don't want to do a thing.\n  \t * this is used by all the methods that accept a single and array argument.\n  \t * @param {*|Array} arg\n  \t * @param {String} fn\n  \t * @param {Object} [context]\n  \t * @returns {Boolean}\n  \t */\n  \tfunction invokeArrayArg(arg, fn, context) {\n  \t    if (Array.isArray(arg)) {\n  \t        each(arg, context[fn], context);\n  \t        return true;\n  \t    }\n  \t    return false;\n  \t}\n\n  \t/**\n  \t * walk objects and arrays\n  \t * @param {Object} obj\n  \t * @param {Function} iterator\n  \t * @param {Object} context\n  \t */\n  \tfunction each(obj, iterator, context) {\n  \t    var i;\n\n  \t    if (!obj) {\n  \t        return;\n  \t    }\n\n  \t    if (obj.forEach) {\n  \t        obj.forEach(iterator, context);\n  \t    } else if (obj.length !== undefined$1) {\n  \t        i = 0;\n  \t        while (i < obj.length) {\n  \t            iterator.call(context, obj[i], i, obj);\n  \t            i++;\n  \t        }\n  \t    } else {\n  \t        for (i in obj) {\n  \t            obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);\n  \t        }\n  \t    }\n  \t}\n\n  \t/**\n  \t * wrap a method with a deprecation warning and stack trace\n  \t * @param {Function} method\n  \t * @param {String} name\n  \t * @param {String} message\n  \t * @returns {Function} A new function wrapping the supplied method.\n  \t */\n  \tfunction deprecate(method, name, message) {\n  \t    var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\\n' + message + ' AT \\n';\n  \t    return function() {\n  \t        var e = new Error('get-stack-trace');\n  \t        var stack = e && e.stack ? e.stack.replace(/^[^\\(]+?[\\n$]/gm, '')\n  \t            .replace(/^\\s+at\\s+/gm, '')\n  \t            .replace(/^Object.<anonymous>\\s*\\(/gm, '{anonymous}()@') : 'Unknown Stack Trace';\n\n  \t        var log = window.console && (window.console.warn || window.console.log);\n  \t        if (log) {\n  \t            log.call(window.console, deprecationMessage, stack);\n  \t        }\n  \t        return method.apply(this, arguments);\n  \t    };\n  \t}\n\n  \t/**\n  \t * extend object.\n  \t * means that properties in dest will be overwritten by the ones in src.\n  \t * @param {Object} target\n  \t * @param {...Object} objects_to_assign\n  \t * @returns {Object} target\n  \t */\n  \tvar assign;\n  \tif (typeof Object.assign !== 'function') {\n  \t    assign = function assign(target) {\n  \t        if (target === undefined$1 || target === null) {\n  \t            throw new TypeError('Cannot convert undefined or null to object');\n  \t        }\n\n  \t        var output = Object(target);\n  \t        for (var index = 1; index < arguments.length; index++) {\n  \t            var source = arguments[index];\n  \t            if (source !== undefined$1 && source !== null) {\n  \t                for (var nextKey in source) {\n  \t                    if (source.hasOwnProperty(nextKey)) {\n  \t                        output[nextKey] = source[nextKey];\n  \t                    }\n  \t                }\n  \t            }\n  \t        }\n  \t        return output;\n  \t    };\n  \t} else {\n  \t    assign = Object.assign;\n  \t}\n\n  \t/**\n  \t * extend object.\n  \t * means that properties in dest will be overwritten by the ones in src.\n  \t * @param {Object} dest\n  \t * @param {Object} src\n  \t * @param {Boolean} [merge=false]\n  \t * @returns {Object} dest\n  \t */\n  \tvar extend = deprecate(function extend(dest, src, merge) {\n  \t    var keys = Object.keys(src);\n  \t    var i = 0;\n  \t    while (i < keys.length) {\n  \t        if (!merge || (merge && dest[keys[i]] === undefined$1)) {\n  \t            dest[keys[i]] = src[keys[i]];\n  \t        }\n  \t        i++;\n  \t    }\n  \t    return dest;\n  \t}, 'extend', 'Use `assign`.');\n\n  \t/**\n  \t * merge the values from src in the dest.\n  \t * means that properties that exist in dest will not be overwritten by src\n  \t * @param {Object} dest\n  \t * @param {Object} src\n  \t * @returns {Object} dest\n  \t */\n  \tvar merge = deprecate(function merge(dest, src) {\n  \t    return extend(dest, src, true);\n  \t}, 'merge', 'Use `assign`.');\n\n  \t/**\n  \t * simple class inheritance\n  \t * @param {Function} child\n  \t * @param {Function} base\n  \t * @param {Object} [properties]\n  \t */\n  \tfunction inherit(child, base, properties) {\n  \t    var baseP = base.prototype,\n  \t        childP;\n\n  \t    childP = child.prototype = Object.create(baseP);\n  \t    childP.constructor = child;\n  \t    childP._super = baseP;\n\n  \t    if (properties) {\n  \t        assign(childP, properties);\n  \t    }\n  \t}\n\n  \t/**\n  \t * simple function bind\n  \t * @param {Function} fn\n  \t * @param {Object} context\n  \t * @returns {Function}\n  \t */\n  \tfunction bindFn(fn, context) {\n  \t    return function boundFn() {\n  \t        return fn.apply(context, arguments);\n  \t    };\n  \t}\n\n  \t/**\n  \t * let a boolean value also be a function that must return a boolean\n  \t * this first item in args will be used as the context\n  \t * @param {Boolean|Function} val\n  \t * @param {Array} [args]\n  \t * @returns {Boolean}\n  \t */\n  \tfunction boolOrFn(val, args) {\n  \t    if (typeof val == TYPE_FUNCTION) {\n  \t        return val.apply(args ? args[0] || undefined$1 : undefined$1, args);\n  \t    }\n  \t    return val;\n  \t}\n\n  \t/**\n  \t * use the val2 when val1 is undefined\n  \t * @param {*} val1\n  \t * @param {*} val2\n  \t * @returns {*}\n  \t */\n  \tfunction ifUndefined(val1, val2) {\n  \t    return (val1 === undefined$1) ? val2 : val1;\n  \t}\n\n  \t/**\n  \t * addEventListener with multiple events at once\n  \t * @param {EventTarget} target\n  \t * @param {String} types\n  \t * @param {Function} handler\n  \t */\n  \tfunction addEventListeners(target, types, handler) {\n  \t    each(splitStr(types), function(type) {\n  \t        target.addEventListener(type, handler, false);\n  \t    });\n  \t}\n\n  \t/**\n  \t * removeEventListener with multiple events at once\n  \t * @param {EventTarget} target\n  \t * @param {String} types\n  \t * @param {Function} handler\n  \t */\n  \tfunction removeEventListeners(target, types, handler) {\n  \t    each(splitStr(types), function(type) {\n  \t        target.removeEventListener(type, handler, false);\n  \t    });\n  \t}\n\n  \t/**\n  \t * find if a node is in the given parent\n  \t * @method hasParent\n  \t * @param {HTMLElement} node\n  \t * @param {HTMLElement} parent\n  \t * @return {Boolean} found\n  \t */\n  \tfunction hasParent(node, parent) {\n  \t    while (node) {\n  \t        if (node == parent) {\n  \t            return true;\n  \t        }\n  \t        node = node.parentNode;\n  \t    }\n  \t    return false;\n  \t}\n\n  \t/**\n  \t * small indexOf wrapper\n  \t * @param {String} str\n  \t * @param {String} find\n  \t * @returns {Boolean} found\n  \t */\n  \tfunction inStr(str, find) {\n  \t    return str.indexOf(find) > -1;\n  \t}\n\n  \t/**\n  \t * split string on whitespace\n  \t * @param {String} str\n  \t * @returns {Array} words\n  \t */\n  \tfunction splitStr(str) {\n  \t    return str.trim().split(/\\s+/g);\n  \t}\n\n  \t/**\n  \t * find if a array contains the object using indexOf or a simple polyFill\n  \t * @param {Array} src\n  \t * @param {String} find\n  \t * @param {String} [findByKey]\n  \t * @return {Boolean|Number} false when not found, or the index\n  \t */\n  \tfunction inArray(src, find, findByKey) {\n  \t    if (src.indexOf && !findByKey) {\n  \t        return src.indexOf(find);\n  \t    } else {\n  \t        var i = 0;\n  \t        while (i < src.length) {\n  \t            if ((findByKey && src[i][findByKey] == find) || (!findByKey && src[i] === find)) {\n  \t                return i;\n  \t            }\n  \t            i++;\n  \t        }\n  \t        return -1;\n  \t    }\n  \t}\n\n  \t/**\n  \t * convert array-like objects to real arrays\n  \t * @param {Object} obj\n  \t * @returns {Array}\n  \t */\n  \tfunction toArray(obj) {\n  \t    return Array.prototype.slice.call(obj, 0);\n  \t}\n\n  \t/**\n  \t * unique array with objects based on a key (like 'id') or just by the array's value\n  \t * @param {Array} src [{id:1},{id:2},{id:1}]\n  \t * @param {String} [key]\n  \t * @param {Boolean} [sort=False]\n  \t * @returns {Array} [{id:1},{id:2}]\n  \t */\n  \tfunction uniqueArray(src, key, sort) {\n  \t    var results = [];\n  \t    var values = [];\n  \t    var i = 0;\n\n  \t    while (i < src.length) {\n  \t        var val = key ? src[i][key] : src[i];\n  \t        if (inArray(values, val) < 0) {\n  \t            results.push(src[i]);\n  \t        }\n  \t        values[i] = val;\n  \t        i++;\n  \t    }\n\n  \t    if (sort) {\n  \t        if (!key) {\n  \t            results = results.sort();\n  \t        } else {\n  \t            results = results.sort(function sortUniqueArray(a, b) {\n  \t                return a[key] > b[key];\n  \t            });\n  \t        }\n  \t    }\n\n  \t    return results;\n  \t}\n\n  \t/**\n  \t * get the prefixed property\n  \t * @param {Object} obj\n  \t * @param {String} property\n  \t * @returns {String|Undefined} prefixed\n  \t */\n  \tfunction prefixed(obj, property) {\n  \t    var prefix, prop;\n  \t    var camelProp = property[0].toUpperCase() + property.slice(1);\n\n  \t    var i = 0;\n  \t    while (i < VENDOR_PREFIXES.length) {\n  \t        prefix = VENDOR_PREFIXES[i];\n  \t        prop = (prefix) ? prefix + camelProp : property;\n\n  \t        if (prop in obj) {\n  \t            return prop;\n  \t        }\n  \t        i++;\n  \t    }\n  \t    return undefined$1;\n  \t}\n\n  \t/**\n  \t * get a unique id\n  \t * @returns {number} uniqueId\n  \t */\n  \tvar _uniqueId = 1;\n  \tfunction uniqueId() {\n  \t    return _uniqueId++;\n  \t}\n\n  \t/**\n  \t * get the window object of an element\n  \t * @param {HTMLElement} element\n  \t * @returns {DocumentView|Window}\n  \t */\n  \tfunction getWindowForElement(element) {\n  \t    var doc = element.ownerDocument || element;\n  \t    return (doc.defaultView || doc.parentWindow || window);\n  \t}\n\n  \tvar MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;\n\n  \tvar SUPPORT_TOUCH = ('ontouchstart' in window);\n  \tvar SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined$1;\n  \tvar SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);\n\n  \tvar INPUT_TYPE_TOUCH = 'touch';\n  \tvar INPUT_TYPE_PEN = 'pen';\n  \tvar INPUT_TYPE_MOUSE = 'mouse';\n  \tvar INPUT_TYPE_KINECT = 'kinect';\n\n  \tvar COMPUTE_INTERVAL = 25;\n\n  \tvar INPUT_START = 1;\n  \tvar INPUT_MOVE = 2;\n  \tvar INPUT_END = 4;\n  \tvar INPUT_CANCEL = 8;\n\n  \tvar DIRECTION_NONE = 1;\n  \tvar DIRECTION_LEFT = 2;\n  \tvar DIRECTION_RIGHT = 4;\n  \tvar DIRECTION_UP = 8;\n  \tvar DIRECTION_DOWN = 16;\n\n  \tvar DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;\n  \tvar DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;\n  \tvar DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;\n\n  \tvar PROPS_XY = ['x', 'y'];\n  \tvar PROPS_CLIENT_XY = ['clientX', 'clientY'];\n\n  \t/**\n  \t * create new input type manager\n  \t * @param {Manager} manager\n  \t * @param {Function} callback\n  \t * @returns {Input}\n  \t * @constructor\n  \t */\n  \tfunction Input(manager, callback) {\n  \t    var self = this;\n  \t    this.manager = manager;\n  \t    this.callback = callback;\n  \t    this.element = manager.element;\n  \t    this.target = manager.options.inputTarget;\n\n  \t    // smaller wrapper around the handler, for the scope and the enabled state of the manager,\n  \t    // so when disabled the input events are completely bypassed.\n  \t    this.domHandler = function(ev) {\n  \t        if (boolOrFn(manager.options.enable, [manager])) {\n  \t            self.handler(ev);\n  \t        }\n  \t    };\n\n  \t    this.init();\n\n  \t}\n\n  \tInput.prototype = {\n  \t    /**\n  \t     * should handle the inputEvent data and trigger the callback\n  \t     * @virtual\n  \t     */\n  \t    handler: function() { },\n\n  \t    /**\n  \t     * bind the events\n  \t     */\n  \t    init: function() {\n  \t        this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);\n  \t        this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);\n  \t        this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n  \t    },\n\n  \t    /**\n  \t     * unbind the events\n  \t     */\n  \t    destroy: function() {\n  \t        this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);\n  \t        this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);\n  \t        this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n  \t    }\n  \t};\n\n  \t/**\n  \t * create new input type manager\n  \t * called by the Manager constructor\n  \t * @param {Hammer} manager\n  \t * @returns {Input}\n  \t */\n  \tfunction createInputInstance(manager) {\n  \t    var Type;\n  \t    var inputClass = manager.options.inputClass;\n\n  \t    if (inputClass) {\n  \t        Type = inputClass;\n  \t    } else if (SUPPORT_POINTER_EVENTS) {\n  \t        Type = PointerEventInput;\n  \t    } else if (SUPPORT_ONLY_TOUCH) {\n  \t        Type = TouchInput;\n  \t    } else if (!SUPPORT_TOUCH) {\n  \t        Type = MouseInput;\n  \t    } else {\n  \t        Type = TouchMouseInput;\n  \t    }\n  \t    return new (Type)(manager, inputHandler);\n  \t}\n\n  \t/**\n  \t * handle input events\n  \t * @param {Manager} manager\n  \t * @param {String} eventType\n  \t * @param {Object} input\n  \t */\n  \tfunction inputHandler(manager, eventType, input) {\n  \t    var pointersLen = input.pointers.length;\n  \t    var changedPointersLen = input.changedPointers.length;\n  \t    var isFirst = (eventType & INPUT_START && (pointersLen - changedPointersLen === 0));\n  \t    var isFinal = (eventType & (INPUT_END | INPUT_CANCEL) && (pointersLen - changedPointersLen === 0));\n\n  \t    input.isFirst = !!isFirst;\n  \t    input.isFinal = !!isFinal;\n\n  \t    if (isFirst) {\n  \t        manager.session = {};\n  \t    }\n\n  \t    // source event is the normalized value of the domEvents\n  \t    // like 'touchstart, mouseup, pointerdown'\n  \t    input.eventType = eventType;\n\n  \t    // compute scale, rotation etc\n  \t    computeInputData(manager, input);\n\n  \t    // emit secret event\n  \t    manager.emit('hammer.input', input);\n\n  \t    manager.recognize(input);\n  \t    manager.session.prevInput = input;\n  \t}\n\n  \t/**\n  \t * extend the data with some usable properties like scale, rotate, velocity etc\n  \t * @param {Object} manager\n  \t * @param {Object} input\n  \t */\n  \tfunction computeInputData(manager, input) {\n  \t    var session = manager.session;\n  \t    var pointers = input.pointers;\n  \t    var pointersLength = pointers.length;\n\n  \t    // store the first input to calculate the distance and direction\n  \t    if (!session.firstInput) {\n  \t        session.firstInput = simpleCloneInputData(input);\n  \t    }\n\n  \t    // to compute scale and rotation we need to store the multiple touches\n  \t    if (pointersLength > 1 && !session.firstMultiple) {\n  \t        session.firstMultiple = simpleCloneInputData(input);\n  \t    } else if (pointersLength === 1) {\n  \t        session.firstMultiple = false;\n  \t    }\n\n  \t    var firstInput = session.firstInput;\n  \t    var firstMultiple = session.firstMultiple;\n  \t    var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;\n\n  \t    var center = input.center = getCenter(pointers);\n  \t    input.timeStamp = now();\n  \t    input.deltaTime = input.timeStamp - firstInput.timeStamp;\n\n  \t    input.angle = getAngle(offsetCenter, center);\n  \t    input.distance = getDistance(offsetCenter, center);\n\n  \t    computeDeltaXY(session, input);\n  \t    input.offsetDirection = getDirection(input.deltaX, input.deltaY);\n\n  \t    var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY);\n  \t    input.overallVelocityX = overallVelocity.x;\n  \t    input.overallVelocityY = overallVelocity.y;\n  \t    input.overallVelocity = (abs(overallVelocity.x) > abs(overallVelocity.y)) ? overallVelocity.x : overallVelocity.y;\n\n  \t    input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;\n  \t    input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;\n\n  \t    input.maxPointers = !session.prevInput ? input.pointers.length : ((input.pointers.length >\n  \t        session.prevInput.maxPointers) ? input.pointers.length : session.prevInput.maxPointers);\n\n  \t    computeIntervalInputData(session, input);\n\n  \t    // find the correct target\n  \t    var target = manager.element;\n  \t    if (hasParent(input.srcEvent.target, target)) {\n  \t        target = input.srcEvent.target;\n  \t    }\n  \t    input.target = target;\n  \t}\n\n  \tfunction computeDeltaXY(session, input) {\n  \t    var center = input.center;\n  \t    var offset = session.offsetDelta || {};\n  \t    var prevDelta = session.prevDelta || {};\n  \t    var prevInput = session.prevInput || {};\n\n  \t    if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {\n  \t        prevDelta = session.prevDelta = {\n  \t            x: prevInput.deltaX || 0,\n  \t            y: prevInput.deltaY || 0\n  \t        };\n\n  \t        offset = session.offsetDelta = {\n  \t            x: center.x,\n  \t            y: center.y\n  \t        };\n  \t    }\n\n  \t    input.deltaX = prevDelta.x + (center.x - offset.x);\n  \t    input.deltaY = prevDelta.y + (center.y - offset.y);\n  \t}\n\n  \t/**\n  \t * velocity is calculated every x ms\n  \t * @param {Object} session\n  \t * @param {Object} input\n  \t */\n  \tfunction computeIntervalInputData(session, input) {\n  \t    var last = session.lastInterval || input,\n  \t        deltaTime = input.timeStamp - last.timeStamp,\n  \t        velocity, velocityX, velocityY, direction;\n\n  \t    if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined$1)) {\n  \t        var deltaX = input.deltaX - last.deltaX;\n  \t        var deltaY = input.deltaY - last.deltaY;\n\n  \t        var v = getVelocity(deltaTime, deltaX, deltaY);\n  \t        velocityX = v.x;\n  \t        velocityY = v.y;\n  \t        velocity = (abs(v.x) > abs(v.y)) ? v.x : v.y;\n  \t        direction = getDirection(deltaX, deltaY);\n\n  \t        session.lastInterval = input;\n  \t    } else {\n  \t        // use latest velocity info if it doesn't overtake a minimum period\n  \t        velocity = last.velocity;\n  \t        velocityX = last.velocityX;\n  \t        velocityY = last.velocityY;\n  \t        direction = last.direction;\n  \t    }\n\n  \t    input.velocity = velocity;\n  \t    input.velocityX = velocityX;\n  \t    input.velocityY = velocityY;\n  \t    input.direction = direction;\n  \t}\n\n  \t/**\n  \t * create a simple clone from the input used for storage of firstInput and firstMultiple\n  \t * @param {Object} input\n  \t * @returns {Object} clonedInputData\n  \t */\n  \tfunction simpleCloneInputData(input) {\n  \t    // make a simple copy of the pointers because we will get a reference if we don't\n  \t    // we only need clientXY for the calculations\n  \t    var pointers = [];\n  \t    var i = 0;\n  \t    while (i < input.pointers.length) {\n  \t        pointers[i] = {\n  \t            clientX: round(input.pointers[i].clientX),\n  \t            clientY: round(input.pointers[i].clientY)\n  \t        };\n  \t        i++;\n  \t    }\n\n  \t    return {\n  \t        timeStamp: now(),\n  \t        pointers: pointers,\n  \t        center: getCenter(pointers),\n  \t        deltaX: input.deltaX,\n  \t        deltaY: input.deltaY\n  \t    };\n  \t}\n\n  \t/**\n  \t * get the center of all the pointers\n  \t * @param {Array} pointers\n  \t * @return {Object} center contains `x` and `y` properties\n  \t */\n  \tfunction getCenter(pointers) {\n  \t    var pointersLength = pointers.length;\n\n  \t    // no need to loop when only one touch\n  \t    if (pointersLength === 1) {\n  \t        return {\n  \t            x: round(pointers[0].clientX),\n  \t            y: round(pointers[0].clientY)\n  \t        };\n  \t    }\n\n  \t    var x = 0, y = 0, i = 0;\n  \t    while (i < pointersLength) {\n  \t        x += pointers[i].clientX;\n  \t        y += pointers[i].clientY;\n  \t        i++;\n  \t    }\n\n  \t    return {\n  \t        x: round(x / pointersLength),\n  \t        y: round(y / pointersLength)\n  \t    };\n  \t}\n\n  \t/**\n  \t * calculate the velocity between two points. unit is in px per ms.\n  \t * @param {Number} deltaTime\n  \t * @param {Number} x\n  \t * @param {Number} y\n  \t * @return {Object} velocity `x` and `y`\n  \t */\n  \tfunction getVelocity(deltaTime, x, y) {\n  \t    return {\n  \t        x: x / deltaTime || 0,\n  \t        y: y / deltaTime || 0\n  \t    };\n  \t}\n\n  \t/**\n  \t * get the direction between two points\n  \t * @param {Number} x\n  \t * @param {Number} y\n  \t * @return {Number} direction\n  \t */\n  \tfunction getDirection(x, y) {\n  \t    if (x === y) {\n  \t        return DIRECTION_NONE;\n  \t    }\n\n  \t    if (abs(x) >= abs(y)) {\n  \t        return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n  \t    }\n  \t    return y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n  \t}\n\n  \t/**\n  \t * calculate the absolute distance between two points\n  \t * @param {Object} p1 {x, y}\n  \t * @param {Object} p2 {x, y}\n  \t * @param {Array} [props] containing x and y keys\n  \t * @return {Number} distance\n  \t */\n  \tfunction getDistance(p1, p2, props) {\n  \t    if (!props) {\n  \t        props = PROPS_XY;\n  \t    }\n  \t    var x = p2[props[0]] - p1[props[0]],\n  \t        y = p2[props[1]] - p1[props[1]];\n\n  \t    return Math.sqrt((x * x) + (y * y));\n  \t}\n\n  \t/**\n  \t * calculate the angle between two coordinates\n  \t * @param {Object} p1\n  \t * @param {Object} p2\n  \t * @param {Array} [props] containing x and y keys\n  \t * @return {Number} angle\n  \t */\n  \tfunction getAngle(p1, p2, props) {\n  \t    if (!props) {\n  \t        props = PROPS_XY;\n  \t    }\n  \t    var x = p2[props[0]] - p1[props[0]],\n  \t        y = p2[props[1]] - p1[props[1]];\n  \t    return Math.atan2(y, x) * 180 / Math.PI;\n  \t}\n\n  \t/**\n  \t * calculate the rotation degrees between two pointersets\n  \t * @param {Array} start array of pointers\n  \t * @param {Array} end array of pointers\n  \t * @return {Number} rotation\n  \t */\n  \tfunction getRotation(start, end) {\n  \t    return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY);\n  \t}\n\n  \t/**\n  \t * calculate the scale factor between two pointersets\n  \t * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out\n  \t * @param {Array} start array of pointers\n  \t * @param {Array} end array of pointers\n  \t * @return {Number} scale\n  \t */\n  \tfunction getScale(start, end) {\n  \t    return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY);\n  \t}\n\n  \tvar MOUSE_INPUT_MAP = {\n  \t    mousedown: INPUT_START,\n  \t    mousemove: INPUT_MOVE,\n  \t    mouseup: INPUT_END\n  \t};\n\n  \tvar MOUSE_ELEMENT_EVENTS = 'mousedown';\n  \tvar MOUSE_WINDOW_EVENTS = 'mousemove mouseup';\n\n  \t/**\n  \t * Mouse events input\n  \t * @constructor\n  \t * @extends Input\n  \t */\n  \tfunction MouseInput() {\n  \t    this.evEl = MOUSE_ELEMENT_EVENTS;\n  \t    this.evWin = MOUSE_WINDOW_EVENTS;\n\n  \t    this.pressed = false; // mousedown state\n\n  \t    Input.apply(this, arguments);\n  \t}\n\n  \tinherit(MouseInput, Input, {\n  \t    /**\n  \t     * handle mouse events\n  \t     * @param {Object} ev\n  \t     */\n  \t    handler: function MEhandler(ev) {\n  \t        var eventType = MOUSE_INPUT_MAP[ev.type];\n\n  \t        // on start we want to have the left mouse button down\n  \t        if (eventType & INPUT_START && ev.button === 0) {\n  \t            this.pressed = true;\n  \t        }\n\n  \t        if (eventType & INPUT_MOVE && ev.which !== 1) {\n  \t            eventType = INPUT_END;\n  \t        }\n\n  \t        // mouse must be down\n  \t        if (!this.pressed) {\n  \t            return;\n  \t        }\n\n  \t        if (eventType & INPUT_END) {\n  \t            this.pressed = false;\n  \t        }\n\n  \t        this.callback(this.manager, eventType, {\n  \t            pointers: [ev],\n  \t            changedPointers: [ev],\n  \t            pointerType: INPUT_TYPE_MOUSE,\n  \t            srcEvent: ev\n  \t        });\n  \t    }\n  \t});\n\n  \tvar POINTER_INPUT_MAP = {\n  \t    pointerdown: INPUT_START,\n  \t    pointermove: INPUT_MOVE,\n  \t    pointerup: INPUT_END,\n  \t    pointercancel: INPUT_CANCEL,\n  \t    pointerout: INPUT_CANCEL\n  \t};\n\n  \t// in IE10 the pointer types is defined as an enum\n  \tvar IE10_POINTER_TYPE_ENUM = {\n  \t    2: INPUT_TYPE_TOUCH,\n  \t    3: INPUT_TYPE_PEN,\n  \t    4: INPUT_TYPE_MOUSE,\n  \t    5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816\n  \t};\n\n  \tvar POINTER_ELEMENT_EVENTS = 'pointerdown';\n  \tvar POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel';\n\n  \t// IE10 has prefixed support, and case-sensitive\n  \tif (window.MSPointerEvent && !window.PointerEvent) {\n  \t    POINTER_ELEMENT_EVENTS = 'MSPointerDown';\n  \t    POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel';\n  \t}\n\n  \t/**\n  \t * Pointer events input\n  \t * @constructor\n  \t * @extends Input\n  \t */\n  \tfunction PointerEventInput() {\n  \t    this.evEl = POINTER_ELEMENT_EVENTS;\n  \t    this.evWin = POINTER_WINDOW_EVENTS;\n\n  \t    Input.apply(this, arguments);\n\n  \t    this.store = (this.manager.session.pointerEvents = []);\n  \t}\n\n  \tinherit(PointerEventInput, Input, {\n  \t    /**\n  \t     * handle mouse events\n  \t     * @param {Object} ev\n  \t     */\n  \t    handler: function PEhandler(ev) {\n  \t        var store = this.store;\n  \t        var removePointer = false;\n\n  \t        var eventTypeNormalized = ev.type.toLowerCase().replace('ms', '');\n  \t        var eventType = POINTER_INPUT_MAP[eventTypeNormalized];\n  \t        var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;\n\n  \t        var isTouch = (pointerType == INPUT_TYPE_TOUCH);\n\n  \t        // get index of the event in the store\n  \t        var storeIndex = inArray(store, ev.pointerId, 'pointerId');\n\n  \t        // start and mouse must be down\n  \t        if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {\n  \t            if (storeIndex < 0) {\n  \t                store.push(ev);\n  \t                storeIndex = store.length - 1;\n  \t            }\n  \t        } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n  \t            removePointer = true;\n  \t        }\n\n  \t        // it not found, so the pointer hasn't been down (so it's probably a hover)\n  \t        if (storeIndex < 0) {\n  \t            return;\n  \t        }\n\n  \t        // update the event in the store\n  \t        store[storeIndex] = ev;\n\n  \t        this.callback(this.manager, eventType, {\n  \t            pointers: store,\n  \t            changedPointers: [ev],\n  \t            pointerType: pointerType,\n  \t            srcEvent: ev\n  \t        });\n\n  \t        if (removePointer) {\n  \t            // remove from the store\n  \t            store.splice(storeIndex, 1);\n  \t        }\n  \t    }\n  \t});\n\n  \tvar SINGLE_TOUCH_INPUT_MAP = {\n  \t    touchstart: INPUT_START,\n  \t    touchmove: INPUT_MOVE,\n  \t    touchend: INPUT_END,\n  \t    touchcancel: INPUT_CANCEL\n  \t};\n\n  \tvar SINGLE_TOUCH_TARGET_EVENTS = 'touchstart';\n  \tvar SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n  \t/**\n  \t * Touch events input\n  \t * @constructor\n  \t * @extends Input\n  \t */\n  \tfunction SingleTouchInput() {\n  \t    this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;\n  \t    this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;\n  \t    this.started = false;\n\n  \t    Input.apply(this, arguments);\n  \t}\n\n  \tinherit(SingleTouchInput, Input, {\n  \t    handler: function TEhandler(ev) {\n  \t        var type = SINGLE_TOUCH_INPUT_MAP[ev.type];\n\n  \t        // should we handle the touch events?\n  \t        if (type === INPUT_START) {\n  \t            this.started = true;\n  \t        }\n\n  \t        if (!this.started) {\n  \t            return;\n  \t        }\n\n  \t        var touches = normalizeSingleTouches.call(this, ev, type);\n\n  \t        // when done, reset the started state\n  \t        if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) {\n  \t            this.started = false;\n  \t        }\n\n  \t        this.callback(this.manager, type, {\n  \t            pointers: touches[0],\n  \t            changedPointers: touches[1],\n  \t            pointerType: INPUT_TYPE_TOUCH,\n  \t            srcEvent: ev\n  \t        });\n  \t    }\n  \t});\n\n  \t/**\n  \t * @this {TouchInput}\n  \t * @param {Object} ev\n  \t * @param {Number} type flag\n  \t * @returns {undefined|Array} [all, changed]\n  \t */\n  \tfunction normalizeSingleTouches(ev, type) {\n  \t    var all = toArray(ev.touches);\n  \t    var changed = toArray(ev.changedTouches);\n\n  \t    if (type & (INPUT_END | INPUT_CANCEL)) {\n  \t        all = uniqueArray(all.concat(changed), 'identifier', true);\n  \t    }\n\n  \t    return [all, changed];\n  \t}\n\n  \tvar TOUCH_INPUT_MAP = {\n  \t    touchstart: INPUT_START,\n  \t    touchmove: INPUT_MOVE,\n  \t    touchend: INPUT_END,\n  \t    touchcancel: INPUT_CANCEL\n  \t};\n\n  \tvar TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n  \t/**\n  \t * Multi-user touch events input\n  \t * @constructor\n  \t * @extends Input\n  \t */\n  \tfunction TouchInput() {\n  \t    this.evTarget = TOUCH_TARGET_EVENTS;\n  \t    this.targetIds = {};\n\n  \t    Input.apply(this, arguments);\n  \t}\n\n  \tinherit(TouchInput, Input, {\n  \t    handler: function MTEhandler(ev) {\n  \t        var type = TOUCH_INPUT_MAP[ev.type];\n  \t        var touches = getTouches.call(this, ev, type);\n  \t        if (!touches) {\n  \t            return;\n  \t        }\n\n  \t        this.callback(this.manager, type, {\n  \t            pointers: touches[0],\n  \t            changedPointers: touches[1],\n  \t            pointerType: INPUT_TYPE_TOUCH,\n  \t            srcEvent: ev\n  \t        });\n  \t    }\n  \t});\n\n  \t/**\n  \t * @this {TouchInput}\n  \t * @param {Object} ev\n  \t * @param {Number} type flag\n  \t * @returns {undefined|Array} [all, changed]\n  \t */\n  \tfunction getTouches(ev, type) {\n  \t    var allTouches = toArray(ev.touches);\n  \t    var targetIds = this.targetIds;\n\n  \t    // when there is only one touch, the process can be simplified\n  \t    if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {\n  \t        targetIds[allTouches[0].identifier] = true;\n  \t        return [allTouches, allTouches];\n  \t    }\n\n  \t    var i,\n  \t        targetTouches,\n  \t        changedTouches = toArray(ev.changedTouches),\n  \t        changedTargetTouches = [],\n  \t        target = this.target;\n\n  \t    // get target touches from touches\n  \t    targetTouches = allTouches.filter(function(touch) {\n  \t        return hasParent(touch.target, target);\n  \t    });\n\n  \t    // collect touches\n  \t    if (type === INPUT_START) {\n  \t        i = 0;\n  \t        while (i < targetTouches.length) {\n  \t            targetIds[targetTouches[i].identifier] = true;\n  \t            i++;\n  \t        }\n  \t    }\n\n  \t    // filter changed touches to only contain touches that exist in the collected target ids\n  \t    i = 0;\n  \t    while (i < changedTouches.length) {\n  \t        if (targetIds[changedTouches[i].identifier]) {\n  \t            changedTargetTouches.push(changedTouches[i]);\n  \t        }\n\n  \t        // cleanup removed touches\n  \t        if (type & (INPUT_END | INPUT_CANCEL)) {\n  \t            delete targetIds[changedTouches[i].identifier];\n  \t        }\n  \t        i++;\n  \t    }\n\n  \t    if (!changedTargetTouches.length) {\n  \t        return;\n  \t    }\n\n  \t    return [\n  \t        // merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel'\n  \t        uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true),\n  \t        changedTargetTouches\n  \t    ];\n  \t}\n\n  \t/**\n  \t * Combined touch and mouse input\n  \t *\n  \t * Touch has a higher priority then mouse, and while touching no mouse events are allowed.\n  \t * This because touch devices also emit mouse events while doing a touch.\n  \t *\n  \t * @constructor\n  \t * @extends Input\n  \t */\n\n  \tvar DEDUP_TIMEOUT = 2500;\n  \tvar DEDUP_DISTANCE = 25;\n\n  \tfunction TouchMouseInput() {\n  \t    Input.apply(this, arguments);\n\n  \t    var handler = bindFn(this.handler, this);\n  \t    this.touch = new TouchInput(this.manager, handler);\n  \t    this.mouse = new MouseInput(this.manager, handler);\n\n  \t    this.primaryTouch = null;\n  \t    this.lastTouches = [];\n  \t}\n\n  \tinherit(TouchMouseInput, Input, {\n  \t    /**\n  \t     * handle mouse and touch events\n  \t     * @param {Hammer} manager\n  \t     * @param {String} inputEvent\n  \t     * @param {Object} inputData\n  \t     */\n  \t    handler: function TMEhandler(manager, inputEvent, inputData) {\n  \t        var isTouch = (inputData.pointerType == INPUT_TYPE_TOUCH),\n  \t            isMouse = (inputData.pointerType == INPUT_TYPE_MOUSE);\n\n  \t        if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) {\n  \t            return;\n  \t        }\n\n  \t        // when we're in a touch event, record touches to  de-dupe synthetic mouse event\n  \t        if (isTouch) {\n  \t            recordTouches.call(this, inputEvent, inputData);\n  \t        } else if (isMouse && isSyntheticEvent.call(this, inputData)) {\n  \t            return;\n  \t        }\n\n  \t        this.callback(manager, inputEvent, inputData);\n  \t    },\n\n  \t    /**\n  \t     * remove the event listeners\n  \t     */\n  \t    destroy: function destroy() {\n  \t        this.touch.destroy();\n  \t        this.mouse.destroy();\n  \t    }\n  \t});\n\n  \tfunction recordTouches(eventType, eventData) {\n  \t    if (eventType & INPUT_START) {\n  \t        this.primaryTouch = eventData.changedPointers[0].identifier;\n  \t        setLastTouch.call(this, eventData);\n  \t    } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n  \t        setLastTouch.call(this, eventData);\n  \t    }\n  \t}\n\n  \tfunction setLastTouch(eventData) {\n  \t    var touch = eventData.changedPointers[0];\n\n  \t    if (touch.identifier === this.primaryTouch) {\n  \t        var lastTouch = {x: touch.clientX, y: touch.clientY};\n  \t        this.lastTouches.push(lastTouch);\n  \t        var lts = this.lastTouches;\n  \t        var removeLastTouch = function() {\n  \t            var i = lts.indexOf(lastTouch);\n  \t            if (i > -1) {\n  \t                lts.splice(i, 1);\n  \t            }\n  \t        };\n  \t        setTimeout(removeLastTouch, DEDUP_TIMEOUT);\n  \t    }\n  \t}\n\n  \tfunction isSyntheticEvent(eventData) {\n  \t    var x = eventData.srcEvent.clientX, y = eventData.srcEvent.clientY;\n  \t    for (var i = 0; i < this.lastTouches.length; i++) {\n  \t        var t = this.lastTouches[i];\n  \t        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n  \t        if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) {\n  \t            return true;\n  \t        }\n  \t    }\n  \t    return false;\n  \t}\n\n  \tvar PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction');\n  \tvar NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined$1;\n\n  \t// magical touchAction value\n  \tvar TOUCH_ACTION_COMPUTE = 'compute';\n  \tvar TOUCH_ACTION_AUTO = 'auto';\n  \tvar TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented\n  \tvar TOUCH_ACTION_NONE = 'none';\n  \tvar TOUCH_ACTION_PAN_X = 'pan-x';\n  \tvar TOUCH_ACTION_PAN_Y = 'pan-y';\n  \tvar TOUCH_ACTION_MAP = getTouchActionProps();\n\n  \t/**\n  \t * Touch Action\n  \t * sets the touchAction property or uses the js alternative\n  \t * @param {Manager} manager\n  \t * @param {String} value\n  \t * @constructor\n  \t */\n  \tfunction TouchAction(manager, value) {\n  \t    this.manager = manager;\n  \t    this.set(value);\n  \t}\n\n  \tTouchAction.prototype = {\n  \t    /**\n  \t     * set the touchAction value on the element or enable the polyfill\n  \t     * @param {String} value\n  \t     */\n  \t    set: function(value) {\n  \t        // find out the touch-action by the event handlers\n  \t        if (value == TOUCH_ACTION_COMPUTE) {\n  \t            value = this.compute();\n  \t        }\n\n  \t        if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) {\n  \t            this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;\n  \t        }\n  \t        this.actions = value.toLowerCase().trim();\n  \t    },\n\n  \t    /**\n  \t     * just re-set the touchAction value\n  \t     */\n  \t    update: function() {\n  \t        this.set(this.manager.options.touchAction);\n  \t    },\n\n  \t    /**\n  \t     * compute the value for the touchAction property based on the recognizer's settings\n  \t     * @returns {String} value\n  \t     */\n  \t    compute: function() {\n  \t        var actions = [];\n  \t        each(this.manager.recognizers, function(recognizer) {\n  \t            if (boolOrFn(recognizer.options.enable, [recognizer])) {\n  \t                actions = actions.concat(recognizer.getTouchAction());\n  \t            }\n  \t        });\n  \t        return cleanTouchActions(actions.join(' '));\n  \t    },\n\n  \t    /**\n  \t     * this method is called on each input cycle and provides the preventing of the browser behavior\n  \t     * @param {Object} input\n  \t     */\n  \t    preventDefaults: function(input) {\n  \t        var srcEvent = input.srcEvent;\n  \t        var direction = input.offsetDirection;\n\n  \t        // if the touch action did prevented once this session\n  \t        if (this.manager.session.prevented) {\n  \t            srcEvent.preventDefault();\n  \t            return;\n  \t        }\n\n  \t        var actions = this.actions;\n  \t        var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE];\n  \t        var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y];\n  \t        var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];\n\n  \t        if (hasNone) {\n  \t            //do not prevent defaults if this is a tap gesture\n\n  \t            var isTapPointer = input.pointers.length === 1;\n  \t            var isTapMovement = input.distance < 2;\n  \t            var isTapTouchTime = input.deltaTime < 250;\n\n  \t            if (isTapPointer && isTapMovement && isTapTouchTime) {\n  \t                return;\n  \t            }\n  \t        }\n\n  \t        if (hasPanX && hasPanY) {\n  \t            // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent\n  \t            return;\n  \t        }\n\n  \t        if (hasNone ||\n  \t            (hasPanY && direction & DIRECTION_HORIZONTAL) ||\n  \t            (hasPanX && direction & DIRECTION_VERTICAL)) {\n  \t            return this.preventSrc(srcEvent);\n  \t        }\n  \t    },\n\n  \t    /**\n  \t     * call preventDefault to prevent the browser's default behavior (scrolling in most cases)\n  \t     * @param {Object} srcEvent\n  \t     */\n  \t    preventSrc: function(srcEvent) {\n  \t        this.manager.session.prevented = true;\n  \t        srcEvent.preventDefault();\n  \t    }\n  \t};\n\n  \t/**\n  \t * when the touchActions are collected they are not a valid value, so we need to clean things up. *\n  \t * @param {String} actions\n  \t * @returns {*}\n  \t */\n  \tfunction cleanTouchActions(actions) {\n  \t    // none\n  \t    if (inStr(actions, TOUCH_ACTION_NONE)) {\n  \t        return TOUCH_ACTION_NONE;\n  \t    }\n\n  \t    var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);\n  \t    var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y);\n\n  \t    // if both pan-x and pan-y are set (different recognizers\n  \t    // for different directions, e.g. horizontal pan but vertical swipe?)\n  \t    // we need none (as otherwise with pan-x pan-y combined none of these\n  \t    // recognizers will work, since the browser would handle all panning\n  \t    if (hasPanX && hasPanY) {\n  \t        return TOUCH_ACTION_NONE;\n  \t    }\n\n  \t    // pan-x OR pan-y\n  \t    if (hasPanX || hasPanY) {\n  \t        return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;\n  \t    }\n\n  \t    // manipulation\n  \t    if (inStr(actions, TOUCH_ACTION_MANIPULATION)) {\n  \t        return TOUCH_ACTION_MANIPULATION;\n  \t    }\n\n  \t    return TOUCH_ACTION_AUTO;\n  \t}\n\n  \tfunction getTouchActionProps() {\n  \t    if (!NATIVE_TOUCH_ACTION) {\n  \t        return false;\n  \t    }\n  \t    var touchMap = {};\n  \t    var cssSupports = window.CSS && window.CSS.supports;\n  \t    ['auto', 'manipulation', 'pan-y', 'pan-x', 'pan-x pan-y', 'none'].forEach(function(val) {\n\n  \t        // If css.supports is not supported but there is native touch-action assume it supports\n  \t        // all values. This is the case for IE 10 and 11.\n  \t        touchMap[val] = cssSupports ? window.CSS.supports('touch-action', val) : true;\n  \t    });\n  \t    return touchMap;\n  \t}\n\n  \t/**\n  \t * Recognizer flow explained; *\n  \t * All recognizers have the initial state of POSSIBLE when a input session starts.\n  \t * The definition of a input session is from the first input until the last input, with all it's movement in it. *\n  \t * Example session for mouse-input: mousedown -> mousemove -> mouseup\n  \t *\n  \t * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed\n  \t * which determines with state it should be.\n  \t *\n  \t * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to\n  \t * POSSIBLE to give it another change on the next cycle.\n  \t *\n  \t *               Possible\n  \t *                  |\n  \t *            +-----+---------------+\n  \t *            |                     |\n  \t *      +-----+-----+               |\n  \t *      |           |               |\n  \t *   Failed      Cancelled          |\n  \t *                          +-------+------+\n  \t *                          |              |\n  \t *                      Recognized       Began\n  \t *                                         |\n  \t *                                      Changed\n  \t *                                         |\n  \t *                                  Ended/Recognized\n  \t */\n  \tvar STATE_POSSIBLE = 1;\n  \tvar STATE_BEGAN = 2;\n  \tvar STATE_CHANGED = 4;\n  \tvar STATE_ENDED = 8;\n  \tvar STATE_RECOGNIZED = STATE_ENDED;\n  \tvar STATE_CANCELLED = 16;\n  \tvar STATE_FAILED = 32;\n\n  \t/**\n  \t * Recognizer\n  \t * Every recognizer needs to extend from this class.\n  \t * @constructor\n  \t * @param {Object} options\n  \t */\n  \tfunction Recognizer(options) {\n  \t    this.options = assign({}, this.defaults, options || {});\n\n  \t    this.id = uniqueId();\n\n  \t    this.manager = null;\n\n  \t    // default is enable true\n  \t    this.options.enable = ifUndefined(this.options.enable, true);\n\n  \t    this.state = STATE_POSSIBLE;\n\n  \t    this.simultaneous = {};\n  \t    this.requireFail = [];\n  \t}\n\n  \tRecognizer.prototype = {\n  \t    /**\n  \t     * @virtual\n  \t     * @type {Object}\n  \t     */\n  \t    defaults: {},\n\n  \t    /**\n  \t     * set options\n  \t     * @param {Object} options\n  \t     * @return {Recognizer}\n  \t     */\n  \t    set: function(options) {\n  \t        assign(this.options, options);\n\n  \t        // also update the touchAction, in case something changed about the directions/enabled state\n  \t        this.manager && this.manager.touchAction.update();\n  \t        return this;\n  \t    },\n\n  \t    /**\n  \t     * recognize simultaneous with an other recognizer.\n  \t     * @param {Recognizer} otherRecognizer\n  \t     * @returns {Recognizer} this\n  \t     */\n  \t    recognizeWith: function(otherRecognizer) {\n  \t        if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) {\n  \t            return this;\n  \t        }\n\n  \t        var simultaneous = this.simultaneous;\n  \t        otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n  \t        if (!simultaneous[otherRecognizer.id]) {\n  \t            simultaneous[otherRecognizer.id] = otherRecognizer;\n  \t            otherRecognizer.recognizeWith(this);\n  \t        }\n  \t        return this;\n  \t    },\n\n  \t    /**\n  \t     * drop the simultaneous link. it doesnt remove the link on the other recognizer.\n  \t     * @param {Recognizer} otherRecognizer\n  \t     * @returns {Recognizer} this\n  \t     */\n  \t    dropRecognizeWith: function(otherRecognizer) {\n  \t        if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) {\n  \t            return this;\n  \t        }\n\n  \t        otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n  \t        delete this.simultaneous[otherRecognizer.id];\n  \t        return this;\n  \t    },\n\n  \t    /**\n  \t     * recognizer can only run when an other is failing\n  \t     * @param {Recognizer} otherRecognizer\n  \t     * @returns {Recognizer} this\n  \t     */\n  \t    requireFailure: function(otherRecognizer) {\n  \t        if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) {\n  \t            return this;\n  \t        }\n\n  \t        var requireFail = this.requireFail;\n  \t        otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n  \t        if (inArray(requireFail, otherRecognizer) === -1) {\n  \t            requireFail.push(otherRecognizer);\n  \t            otherRecognizer.requireFailure(this);\n  \t        }\n  \t        return this;\n  \t    },\n\n  \t    /**\n  \t     * drop the requireFailure link. it does not remove the link on the other recognizer.\n  \t     * @param {Recognizer} otherRecognizer\n  \t     * @returns {Recognizer} this\n  \t     */\n  \t    dropRequireFailure: function(otherRecognizer) {\n  \t        if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) {\n  \t            return this;\n  \t        }\n\n  \t        otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n  \t        var index = inArray(this.requireFail, otherRecognizer);\n  \t        if (index > -1) {\n  \t            this.requireFail.splice(index, 1);\n  \t        }\n  \t        return this;\n  \t    },\n\n  \t    /**\n  \t     * has require failures boolean\n  \t     * @returns {boolean}\n  \t     */\n  \t    hasRequireFailures: function() {\n  \t        return this.requireFail.length > 0;\n  \t    },\n\n  \t    /**\n  \t     * if the recognizer can recognize simultaneous with an other recognizer\n  \t     * @param {Recognizer} otherRecognizer\n  \t     * @returns {Boolean}\n  \t     */\n  \t    canRecognizeWith: function(otherRecognizer) {\n  \t        return !!this.simultaneous[otherRecognizer.id];\n  \t    },\n\n  \t    /**\n  \t     * You should use `tryEmit` instead of `emit` directly to check\n  \t     * that all the needed recognizers has failed before emitting.\n  \t     * @param {Object} input\n  \t     */\n  \t    emit: function(input) {\n  \t        var self = this;\n  \t        var state = this.state;\n\n  \t        function emit(event) {\n  \t            self.manager.emit(event, input);\n  \t        }\n\n  \t        // 'panstart' and 'panmove'\n  \t        if (state < STATE_ENDED) {\n  \t            emit(self.options.event + stateStr(state));\n  \t        }\n\n  \t        emit(self.options.event); // simple 'eventName' events\n\n  \t        if (input.additionalEvent) { // additional event(panleft, panright, pinchin, pinchout...)\n  \t            emit(input.additionalEvent);\n  \t        }\n\n  \t        // panend and pancancel\n  \t        if (state >= STATE_ENDED) {\n  \t            emit(self.options.event + stateStr(state));\n  \t        }\n  \t    },\n\n  \t    /**\n  \t     * Check that all the require failure recognizers has failed,\n  \t     * if true, it emits a gesture event,\n  \t     * otherwise, setup the state to FAILED.\n  \t     * @param {Object} input\n  \t     */\n  \t    tryEmit: function(input) {\n  \t        if (this.canEmit()) {\n  \t            return this.emit(input);\n  \t        }\n  \t        // it's failing anyway\n  \t        this.state = STATE_FAILED;\n  \t    },\n\n  \t    /**\n  \t     * can we emit?\n  \t     * @returns {boolean}\n  \t     */\n  \t    canEmit: function() {\n  \t        var i = 0;\n  \t        while (i < this.requireFail.length) {\n  \t            if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) {\n  \t                return false;\n  \t            }\n  \t            i++;\n  \t        }\n  \t        return true;\n  \t    },\n\n  \t    /**\n  \t     * update the recognizer\n  \t     * @param {Object} inputData\n  \t     */\n  \t    recognize: function(inputData) {\n  \t        // make a new copy of the inputData\n  \t        // so we can change the inputData without messing up the other recognizers\n  \t        var inputDataClone = assign({}, inputData);\n\n  \t        // is is enabled and allow recognizing?\n  \t        if (!boolOrFn(this.options.enable, [this, inputDataClone])) {\n  \t            this.reset();\n  \t            this.state = STATE_FAILED;\n  \t            return;\n  \t        }\n\n  \t        // reset when we've reached the end\n  \t        if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) {\n  \t            this.state = STATE_POSSIBLE;\n  \t        }\n\n  \t        this.state = this.process(inputDataClone);\n\n  \t        // the recognizer has recognized a gesture\n  \t        // so trigger an event\n  \t        if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) {\n  \t            this.tryEmit(inputDataClone);\n  \t        }\n  \t    },\n\n  \t    /**\n  \t     * return the state of the recognizer\n  \t     * the actual recognizing happens in this method\n  \t     * @virtual\n  \t     * @param {Object} inputData\n  \t     * @returns {Const} STATE\n  \t     */\n  \t    process: function(inputData) { }, // jshint ignore:line\n\n  \t    /**\n  \t     * return the preferred touch-action\n  \t     * @virtual\n  \t     * @returns {Array}\n  \t     */\n  \t    getTouchAction: function() { },\n\n  \t    /**\n  \t     * called when the gesture isn't allowed to recognize\n  \t     * like when another is being recognized or it is disabled\n  \t     * @virtual\n  \t     */\n  \t    reset: function() { }\n  \t};\n\n  \t/**\n  \t * get a usable string, used as event postfix\n  \t * @param {Const} state\n  \t * @returns {String} state\n  \t */\n  \tfunction stateStr(state) {\n  \t    if (state & STATE_CANCELLED) {\n  \t        return 'cancel';\n  \t    } else if (state & STATE_ENDED) {\n  \t        return 'end';\n  \t    } else if (state & STATE_CHANGED) {\n  \t        return 'move';\n  \t    } else if (state & STATE_BEGAN) {\n  \t        return 'start';\n  \t    }\n  \t    return '';\n  \t}\n\n  \t/**\n  \t * direction cons to string\n  \t * @param {Const} direction\n  \t * @returns {String}\n  \t */\n  \tfunction directionStr(direction) {\n  \t    if (direction == DIRECTION_DOWN) {\n  \t        return 'down';\n  \t    } else if (direction == DIRECTION_UP) {\n  \t        return 'up';\n  \t    } else if (direction == DIRECTION_LEFT) {\n  \t        return 'left';\n  \t    } else if (direction == DIRECTION_RIGHT) {\n  \t        return 'right';\n  \t    }\n  \t    return '';\n  \t}\n\n  \t/**\n  \t * get a recognizer by name if it is bound to a manager\n  \t * @param {Recognizer|String} otherRecognizer\n  \t * @param {Recognizer} recognizer\n  \t * @returns {Recognizer}\n  \t */\n  \tfunction getRecognizerByNameIfManager(otherRecognizer, recognizer) {\n  \t    var manager = recognizer.manager;\n  \t    if (manager) {\n  \t        return manager.get(otherRecognizer);\n  \t    }\n  \t    return otherRecognizer;\n  \t}\n\n  \t/**\n  \t * This recognizer is just used as a base for the simple attribute recognizers.\n  \t * @constructor\n  \t * @extends Recognizer\n  \t */\n  \tfunction AttrRecognizer() {\n  \t    Recognizer.apply(this, arguments);\n  \t}\n\n  \tinherit(AttrRecognizer, Recognizer, {\n  \t    /**\n  \t     * @namespace\n  \t     * @memberof AttrRecognizer\n  \t     */\n  \t    defaults: {\n  \t        /**\n  \t         * @type {Number}\n  \t         * @default 1\n  \t         */\n  \t        pointers: 1\n  \t    },\n\n  \t    /**\n  \t     * Used to check if it the recognizer receives valid input, like input.distance > 10.\n  \t     * @memberof AttrRecognizer\n  \t     * @param {Object} input\n  \t     * @returns {Boolean} recognized\n  \t     */\n  \t    attrTest: function(input) {\n  \t        var optionPointers = this.options.pointers;\n  \t        return optionPointers === 0 || input.pointers.length === optionPointers;\n  \t    },\n\n  \t    /**\n  \t     * Process the input and return the state for the recognizer\n  \t     * @memberof AttrRecognizer\n  \t     * @param {Object} input\n  \t     * @returns {*} State\n  \t     */\n  \t    process: function(input) {\n  \t        var state = this.state;\n  \t        var eventType = input.eventType;\n\n  \t        var isRecognized = state & (STATE_BEGAN | STATE_CHANGED);\n  \t        var isValid = this.attrTest(input);\n\n  \t        // on cancel input and we've recognized before, return STATE_CANCELLED\n  \t        if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) {\n  \t            return state | STATE_CANCELLED;\n  \t        } else if (isRecognized || isValid) {\n  \t            if (eventType & INPUT_END) {\n  \t                return state | STATE_ENDED;\n  \t            } else if (!(state & STATE_BEGAN)) {\n  \t                return STATE_BEGAN;\n  \t            }\n  \t            return state | STATE_CHANGED;\n  \t        }\n  \t        return STATE_FAILED;\n  \t    }\n  \t});\n\n  \t/**\n  \t * Pan\n  \t * Recognized when the pointer is down and moved in the allowed direction.\n  \t * @constructor\n  \t * @extends AttrRecognizer\n  \t */\n  \tfunction PanRecognizer() {\n  \t    AttrRecognizer.apply(this, arguments);\n\n  \t    this.pX = null;\n  \t    this.pY = null;\n  \t}\n\n  \tinherit(PanRecognizer, AttrRecognizer, {\n  \t    /**\n  \t     * @namespace\n  \t     * @memberof PanRecognizer\n  \t     */\n  \t    defaults: {\n  \t        event: 'pan',\n  \t        threshold: 10,\n  \t        pointers: 1,\n  \t        direction: DIRECTION_ALL\n  \t    },\n\n  \t    getTouchAction: function() {\n  \t        var direction = this.options.direction;\n  \t        var actions = [];\n  \t        if (direction & DIRECTION_HORIZONTAL) {\n  \t            actions.push(TOUCH_ACTION_PAN_Y);\n  \t        }\n  \t        if (direction & DIRECTION_VERTICAL) {\n  \t            actions.push(TOUCH_ACTION_PAN_X);\n  \t        }\n  \t        return actions;\n  \t    },\n\n  \t    directionTest: function(input) {\n  \t        var options = this.options;\n  \t        var hasMoved = true;\n  \t        var distance = input.distance;\n  \t        var direction = input.direction;\n  \t        var x = input.deltaX;\n  \t        var y = input.deltaY;\n\n  \t        // lock to axis?\n  \t        if (!(direction & options.direction)) {\n  \t            if (options.direction & DIRECTION_HORIZONTAL) {\n  \t                direction = (x === 0) ? DIRECTION_NONE : (x < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT;\n  \t                hasMoved = x != this.pX;\n  \t                distance = Math.abs(input.deltaX);\n  \t            } else {\n  \t                direction = (y === 0) ? DIRECTION_NONE : (y < 0) ? DIRECTION_UP : DIRECTION_DOWN;\n  \t                hasMoved = y != this.pY;\n  \t                distance = Math.abs(input.deltaY);\n  \t            }\n  \t        }\n  \t        input.direction = direction;\n  \t        return hasMoved && distance > options.threshold && direction & options.direction;\n  \t    },\n\n  \t    attrTest: function(input) {\n  \t        return AttrRecognizer.prototype.attrTest.call(this, input) &&\n  \t            (this.state & STATE_BEGAN || (!(this.state & STATE_BEGAN) && this.directionTest(input)));\n  \t    },\n\n  \t    emit: function(input) {\n\n  \t        this.pX = input.deltaX;\n  \t        this.pY = input.deltaY;\n\n  \t        var direction = directionStr(input.direction);\n\n  \t        if (direction) {\n  \t            input.additionalEvent = this.options.event + direction;\n  \t        }\n  \t        this._super.emit.call(this, input);\n  \t    }\n  \t});\n\n  \t/**\n  \t * Pinch\n  \t * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out).\n  \t * @constructor\n  \t * @extends AttrRecognizer\n  \t */\n  \tfunction PinchRecognizer() {\n  \t    AttrRecognizer.apply(this, arguments);\n  \t}\n\n  \tinherit(PinchRecognizer, AttrRecognizer, {\n  \t    /**\n  \t     * @namespace\n  \t     * @memberof PinchRecognizer\n  \t     */\n  \t    defaults: {\n  \t        event: 'pinch',\n  \t        threshold: 0,\n  \t        pointers: 2\n  \t    },\n\n  \t    getTouchAction: function() {\n  \t        return [TOUCH_ACTION_NONE];\n  \t    },\n\n  \t    attrTest: function(input) {\n  \t        return this._super.attrTest.call(this, input) &&\n  \t            (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN);\n  \t    },\n\n  \t    emit: function(input) {\n  \t        if (input.scale !== 1) {\n  \t            var inOut = input.scale < 1 ? 'in' : 'out';\n  \t            input.additionalEvent = this.options.event + inOut;\n  \t        }\n  \t        this._super.emit.call(this, input);\n  \t    }\n  \t});\n\n  \t/**\n  \t * Press\n  \t * Recognized when the pointer is down for x ms without any movement.\n  \t * @constructor\n  \t * @extends Recognizer\n  \t */\n  \tfunction PressRecognizer() {\n  \t    Recognizer.apply(this, arguments);\n\n  \t    this._timer = null;\n  \t    this._input = null;\n  \t}\n\n  \tinherit(PressRecognizer, Recognizer, {\n  \t    /**\n  \t     * @namespace\n  \t     * @memberof PressRecognizer\n  \t     */\n  \t    defaults: {\n  \t        event: 'press',\n  \t        pointers: 1,\n  \t        time: 251, // minimal time of the pointer to be pressed\n  \t        threshold: 9 // a minimal movement is ok, but keep it low\n  \t    },\n\n  \t    getTouchAction: function() {\n  \t        return [TOUCH_ACTION_AUTO];\n  \t    },\n\n  \t    process: function(input) {\n  \t        var options = this.options;\n  \t        var validPointers = input.pointers.length === options.pointers;\n  \t        var validMovement = input.distance < options.threshold;\n  \t        var validTime = input.deltaTime > options.time;\n\n  \t        this._input = input;\n\n  \t        // we only allow little movement\n  \t        // and we've reached an end event, so a tap is possible\n  \t        if (!validMovement || !validPointers || (input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime)) {\n  \t            this.reset();\n  \t        } else if (input.eventType & INPUT_START) {\n  \t            this.reset();\n  \t            this._timer = setTimeoutContext(function() {\n  \t                this.state = STATE_RECOGNIZED;\n  \t                this.tryEmit();\n  \t            }, options.time, this);\n  \t        } else if (input.eventType & INPUT_END) {\n  \t            return STATE_RECOGNIZED;\n  \t        }\n  \t        return STATE_FAILED;\n  \t    },\n\n  \t    reset: function() {\n  \t        clearTimeout(this._timer);\n  \t    },\n\n  \t    emit: function(input) {\n  \t        if (this.state !== STATE_RECOGNIZED) {\n  \t            return;\n  \t        }\n\n  \t        if (input && (input.eventType & INPUT_END)) {\n  \t            this.manager.emit(this.options.event + 'up', input);\n  \t        } else {\n  \t            this._input.timeStamp = now();\n  \t            this.manager.emit(this.options.event, this._input);\n  \t        }\n  \t    }\n  \t});\n\n  \t/**\n  \t * Rotate\n  \t * Recognized when two or more pointer are moving in a circular motion.\n  \t * @constructor\n  \t * @extends AttrRecognizer\n  \t */\n  \tfunction RotateRecognizer() {\n  \t    AttrRecognizer.apply(this, arguments);\n  \t}\n\n  \tinherit(RotateRecognizer, AttrRecognizer, {\n  \t    /**\n  \t     * @namespace\n  \t     * @memberof RotateRecognizer\n  \t     */\n  \t    defaults: {\n  \t        event: 'rotate',\n  \t        threshold: 0,\n  \t        pointers: 2\n  \t    },\n\n  \t    getTouchAction: function() {\n  \t        return [TOUCH_ACTION_NONE];\n  \t    },\n\n  \t    attrTest: function(input) {\n  \t        return this._super.attrTest.call(this, input) &&\n  \t            (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN);\n  \t    }\n  \t});\n\n  \t/**\n  \t * Swipe\n  \t * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction.\n  \t * @constructor\n  \t * @extends AttrRecognizer\n  \t */\n  \tfunction SwipeRecognizer() {\n  \t    AttrRecognizer.apply(this, arguments);\n  \t}\n\n  \tinherit(SwipeRecognizer, AttrRecognizer, {\n  \t    /**\n  \t     * @namespace\n  \t     * @memberof SwipeRecognizer\n  \t     */\n  \t    defaults: {\n  \t        event: 'swipe',\n  \t        threshold: 10,\n  \t        velocity: 0.3,\n  \t        direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL,\n  \t        pointers: 1\n  \t    },\n\n  \t    getTouchAction: function() {\n  \t        return PanRecognizer.prototype.getTouchAction.call(this);\n  \t    },\n\n  \t    attrTest: function(input) {\n  \t        var direction = this.options.direction;\n  \t        var velocity;\n\n  \t        if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) {\n  \t            velocity = input.overallVelocity;\n  \t        } else if (direction & DIRECTION_HORIZONTAL) {\n  \t            velocity = input.overallVelocityX;\n  \t        } else if (direction & DIRECTION_VERTICAL) {\n  \t            velocity = input.overallVelocityY;\n  \t        }\n\n  \t        return this._super.attrTest.call(this, input) &&\n  \t            direction & input.offsetDirection &&\n  \t            input.distance > this.options.threshold &&\n  \t            input.maxPointers == this.options.pointers &&\n  \t            abs(velocity) > this.options.velocity && input.eventType & INPUT_END;\n  \t    },\n\n  \t    emit: function(input) {\n  \t        var direction = directionStr(input.offsetDirection);\n  \t        if (direction) {\n  \t            this.manager.emit(this.options.event + direction, input);\n  \t        }\n\n  \t        this.manager.emit(this.options.event, input);\n  \t    }\n  \t});\n\n  \t/**\n  \t * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur\n  \t * between the given interval and position. The delay option can be used to recognize multi-taps without firing\n  \t * a single tap.\n  \t *\n  \t * The eventData from the emitted event contains the property `tapCount`, which contains the amount of\n  \t * multi-taps being recognized.\n  \t * @constructor\n  \t * @extends Recognizer\n  \t */\n  \tfunction TapRecognizer() {\n  \t    Recognizer.apply(this, arguments);\n\n  \t    // previous time and center,\n  \t    // used for tap counting\n  \t    this.pTime = false;\n  \t    this.pCenter = false;\n\n  \t    this._timer = null;\n  \t    this._input = null;\n  \t    this.count = 0;\n  \t}\n\n  \tinherit(TapRecognizer, Recognizer, {\n  \t    /**\n  \t     * @namespace\n  \t     * @memberof PinchRecognizer\n  \t     */\n  \t    defaults: {\n  \t        event: 'tap',\n  \t        pointers: 1,\n  \t        taps: 1,\n  \t        interval: 300, // max time between the multi-tap taps\n  \t        time: 250, // max time of the pointer to be down (like finger on the screen)\n  \t        threshold: 9, // a minimal movement is ok, but keep it low\n  \t        posThreshold: 10 // a multi-tap can be a bit off the initial position\n  \t    },\n\n  \t    getTouchAction: function() {\n  \t        return [TOUCH_ACTION_MANIPULATION];\n  \t    },\n\n  \t    process: function(input) {\n  \t        var options = this.options;\n\n  \t        var validPointers = input.pointers.length === options.pointers;\n  \t        var validMovement = input.distance < options.threshold;\n  \t        var validTouchTime = input.deltaTime < options.time;\n\n  \t        this.reset();\n\n  \t        if ((input.eventType & INPUT_START) && (this.count === 0)) {\n  \t            return this.failTimeout();\n  \t        }\n\n  \t        // we only allow little movement\n  \t        // and we've reached an end event, so a tap is possible\n  \t        if (validMovement && validTouchTime && validPointers) {\n  \t            if (input.eventType != INPUT_END) {\n  \t                return this.failTimeout();\n  \t            }\n\n  \t            var validInterval = this.pTime ? (input.timeStamp - this.pTime < options.interval) : true;\n  \t            var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold;\n\n  \t            this.pTime = input.timeStamp;\n  \t            this.pCenter = input.center;\n\n  \t            if (!validMultiTap || !validInterval) {\n  \t                this.count = 1;\n  \t            } else {\n  \t                this.count += 1;\n  \t            }\n\n  \t            this._input = input;\n\n  \t            // if tap count matches we have recognized it,\n  \t            // else it has began recognizing...\n  \t            var tapCount = this.count % options.taps;\n  \t            if (tapCount === 0) {\n  \t                // no failing requirements, immediately trigger the tap event\n  \t                // or wait as long as the multitap interval to trigger\n  \t                if (!this.hasRequireFailures()) {\n  \t                    return STATE_RECOGNIZED;\n  \t                } else {\n  \t                    this._timer = setTimeoutContext(function() {\n  \t                        this.state = STATE_RECOGNIZED;\n  \t                        this.tryEmit();\n  \t                    }, options.interval, this);\n  \t                    return STATE_BEGAN;\n  \t                }\n  \t            }\n  \t        }\n  \t        return STATE_FAILED;\n  \t    },\n\n  \t    failTimeout: function() {\n  \t        this._timer = setTimeoutContext(function() {\n  \t            this.state = STATE_FAILED;\n  \t        }, this.options.interval, this);\n  \t        return STATE_FAILED;\n  \t    },\n\n  \t    reset: function() {\n  \t        clearTimeout(this._timer);\n  \t    },\n\n  \t    emit: function() {\n  \t        if (this.state == STATE_RECOGNIZED) {\n  \t            this._input.tapCount = this.count;\n  \t            this.manager.emit(this.options.event, this._input);\n  \t        }\n  \t    }\n  \t});\n\n  \t/**\n  \t * Simple way to create a manager with a default set of recognizers.\n  \t * @param {HTMLElement} element\n  \t * @param {Object} [options]\n  \t * @constructor\n  \t */\n  \tfunction Hammer(element, options) {\n  \t    options = options || {};\n  \t    options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset);\n  \t    return new Manager(element, options);\n  \t}\n\n  \t/**\n  \t * @const {string}\n  \t */\n  \tHammer.VERSION = '2.0.7';\n\n  \t/**\n  \t * default settings\n  \t * @namespace\n  \t */\n  \tHammer.defaults = {\n  \t    /**\n  \t     * set if DOM events are being triggered.\n  \t     * But this is slower and unused by simple implementations, so disabled by default.\n  \t     * @type {Boolean}\n  \t     * @default false\n  \t     */\n  \t    domEvents: false,\n\n  \t    /**\n  \t     * The value for the touchAction property/fallback.\n  \t     * When set to `compute` it will magically set the correct value based on the added recognizers.\n  \t     * @type {String}\n  \t     * @default compute\n  \t     */\n  \t    touchAction: TOUCH_ACTION_COMPUTE,\n\n  \t    /**\n  \t     * @type {Boolean}\n  \t     * @default true\n  \t     */\n  \t    enable: true,\n\n  \t    /**\n  \t     * EXPERIMENTAL FEATURE -- can be removed/changed\n  \t     * Change the parent input target element.\n  \t     * If Null, then it is being set the to main element.\n  \t     * @type {Null|EventTarget}\n  \t     * @default null\n  \t     */\n  \t    inputTarget: null,\n\n  \t    /**\n  \t     * force an input class\n  \t     * @type {Null|Function}\n  \t     * @default null\n  \t     */\n  \t    inputClass: null,\n\n  \t    /**\n  \t     * Default recognizer setup when calling `Hammer()`\n  \t     * When creating a new Manager these will be skipped.\n  \t     * @type {Array}\n  \t     */\n  \t    preset: [\n  \t        // RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...]\n  \t        [RotateRecognizer, {enable: false}],\n  \t        [PinchRecognizer, {enable: false}, ['rotate']],\n  \t        [SwipeRecognizer, {direction: DIRECTION_HORIZONTAL}],\n  \t        [PanRecognizer, {direction: DIRECTION_HORIZONTAL}, ['swipe']],\n  \t        [TapRecognizer],\n  \t        [TapRecognizer, {event: 'doubletap', taps: 2}, ['tap']],\n  \t        [PressRecognizer]\n  \t    ],\n\n  \t    /**\n  \t     * Some CSS properties can be used to improve the working of Hammer.\n  \t     * Add them to this method and they will be set when creating a new Manager.\n  \t     * @namespace\n  \t     */\n  \t    cssProps: {\n  \t        /**\n  \t         * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n  \t         * @type {String}\n  \t         * @default 'none'\n  \t         */\n  \t        userSelect: 'none',\n\n  \t        /**\n  \t         * Disable the Windows Phone grippers when pressing an element.\n  \t         * @type {String}\n  \t         * @default 'none'\n  \t         */\n  \t        touchSelect: 'none',\n\n  \t        /**\n  \t         * Disables the default callout shown when you touch and hold a touch target.\n  \t         * On iOS, when you touch and hold a touch target such as a link, Safari displays\n  \t         * a callout containing information about the link. This property allows you to disable that callout.\n  \t         * @type {String}\n  \t         * @default 'none'\n  \t         */\n  \t        touchCallout: 'none',\n\n  \t        /**\n  \t         * Specifies whether zooming is enabled. Used by IE10>\n  \t         * @type {String}\n  \t         * @default 'none'\n  \t         */\n  \t        contentZooming: 'none',\n\n  \t        /**\n  \t         * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers.\n  \t         * @type {String}\n  \t         * @default 'none'\n  \t         */\n  \t        userDrag: 'none',\n\n  \t        /**\n  \t         * Overrides the highlight color shown when the user taps a link or a JavaScript\n  \t         * clickable element in iOS. This property obeys the alpha value, if specified.\n  \t         * @type {String}\n  \t         * @default 'rgba(0,0,0,0)'\n  \t         */\n  \t        tapHighlightColor: 'rgba(0,0,0,0)'\n  \t    }\n  \t};\n\n  \tvar STOP = 1;\n  \tvar FORCED_STOP = 2;\n\n  \t/**\n  \t * Manager\n  \t * @param {HTMLElement} element\n  \t * @param {Object} [options]\n  \t * @constructor\n  \t */\n  \tfunction Manager(element, options) {\n  \t    this.options = assign({}, Hammer.defaults, options || {});\n\n  \t    this.options.inputTarget = this.options.inputTarget || element;\n\n  \t    this.handlers = {};\n  \t    this.session = {};\n  \t    this.recognizers = [];\n  \t    this.oldCssProps = {};\n\n  \t    this.element = element;\n  \t    this.input = createInputInstance(this);\n  \t    this.touchAction = new TouchAction(this, this.options.touchAction);\n\n  \t    toggleCssProps(this, true);\n\n  \t    each(this.options.recognizers, function(item) {\n  \t        var recognizer = this.add(new (item[0])(item[1]));\n  \t        item[2] && recognizer.recognizeWith(item[2]);\n  \t        item[3] && recognizer.requireFailure(item[3]);\n  \t    }, this);\n  \t}\n\n  \tManager.prototype = {\n  \t    /**\n  \t     * set options\n  \t     * @param {Object} options\n  \t     * @returns {Manager}\n  \t     */\n  \t    set: function(options) {\n  \t        assign(this.options, options);\n\n  \t        // Options that need a little more setup\n  \t        if (options.touchAction) {\n  \t            this.touchAction.update();\n  \t        }\n  \t        if (options.inputTarget) {\n  \t            // Clean up existing event listeners and reinitialize\n  \t            this.input.destroy();\n  \t            this.input.target = options.inputTarget;\n  \t            this.input.init();\n  \t        }\n  \t        return this;\n  \t    },\n\n  \t    /**\n  \t     * stop recognizing for this session.\n  \t     * This session will be discarded, when a new [input]start event is fired.\n  \t     * When forced, the recognizer cycle is stopped immediately.\n  \t     * @param {Boolean} [force]\n  \t     */\n  \t    stop: function(force) {\n  \t        this.session.stopped = force ? FORCED_STOP : STOP;\n  \t    },\n\n  \t    /**\n  \t     * run the recognizers!\n  \t     * called by the inputHandler function on every movement of the pointers (touches)\n  \t     * it walks through all the recognizers and tries to detect the gesture that is being made\n  \t     * @param {Object} inputData\n  \t     */\n  \t    recognize: function(inputData) {\n  \t        var session = this.session;\n  \t        if (session.stopped) {\n  \t            return;\n  \t        }\n\n  \t        // run the touch-action polyfill\n  \t        this.touchAction.preventDefaults(inputData);\n\n  \t        var recognizer;\n  \t        var recognizers = this.recognizers;\n\n  \t        // this holds the recognizer that is being recognized.\n  \t        // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED\n  \t        // if no recognizer is detecting a thing, it is set to `null`\n  \t        var curRecognizer = session.curRecognizer;\n\n  \t        // reset when the last recognizer is recognized\n  \t        // or when we're in a new session\n  \t        if (!curRecognizer || (curRecognizer && curRecognizer.state & STATE_RECOGNIZED)) {\n  \t            curRecognizer = session.curRecognizer = null;\n  \t        }\n\n  \t        var i = 0;\n  \t        while (i < recognizers.length) {\n  \t            recognizer = recognizers[i];\n\n  \t            // find out if we are allowed try to recognize the input for this one.\n  \t            // 1.   allow if the session is NOT forced stopped (see the .stop() method)\n  \t            // 2.   allow if we still haven't recognized a gesture in this session, or the this recognizer is the one\n  \t            //      that is being recognized.\n  \t            // 3.   allow if the recognizer is allowed to run simultaneous with the current recognized recognizer.\n  \t            //      this can be setup with the `recognizeWith()` method on the recognizer.\n  \t            if (session.stopped !== FORCED_STOP && ( // 1\n  \t                    !curRecognizer || recognizer == curRecognizer || // 2\n  \t                    recognizer.canRecognizeWith(curRecognizer))) { // 3\n  \t                recognizer.recognize(inputData);\n  \t            } else {\n  \t                recognizer.reset();\n  \t            }\n\n  \t            // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the\n  \t            // current active recognizer. but only if we don't already have an active recognizer\n  \t            if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) {\n  \t                curRecognizer = session.curRecognizer = recognizer;\n  \t            }\n  \t            i++;\n  \t        }\n  \t    },\n\n  \t    /**\n  \t     * get a recognizer by its event name.\n  \t     * @param {Recognizer|String} recognizer\n  \t     * @returns {Recognizer|Null}\n  \t     */\n  \t    get: function(recognizer) {\n  \t        if (recognizer instanceof Recognizer) {\n  \t            return recognizer;\n  \t        }\n\n  \t        var recognizers = this.recognizers;\n  \t        for (var i = 0; i < recognizers.length; i++) {\n  \t            if (recognizers[i].options.event == recognizer) {\n  \t                return recognizers[i];\n  \t            }\n  \t        }\n  \t        return null;\n  \t    },\n\n  \t    /**\n  \t     * add a recognizer to the manager\n  \t     * existing recognizers with the same event name will be removed\n  \t     * @param {Recognizer} recognizer\n  \t     * @returns {Recognizer|Manager}\n  \t     */\n  \t    add: function(recognizer) {\n  \t        if (invokeArrayArg(recognizer, 'add', this)) {\n  \t            return this;\n  \t        }\n\n  \t        // remove existing\n  \t        var existing = this.get(recognizer.options.event);\n  \t        if (existing) {\n  \t            this.remove(existing);\n  \t        }\n\n  \t        this.recognizers.push(recognizer);\n  \t        recognizer.manager = this;\n\n  \t        this.touchAction.update();\n  \t        return recognizer;\n  \t    },\n\n  \t    /**\n  \t     * remove a recognizer by name or instance\n  \t     * @param {Recognizer|String} recognizer\n  \t     * @returns {Manager}\n  \t     */\n  \t    remove: function(recognizer) {\n  \t        if (invokeArrayArg(recognizer, 'remove', this)) {\n  \t            return this;\n  \t        }\n\n  \t        recognizer = this.get(recognizer);\n\n  \t        // let's make sure this recognizer exists\n  \t        if (recognizer) {\n  \t            var recognizers = this.recognizers;\n  \t            var index = inArray(recognizers, recognizer);\n\n  \t            if (index !== -1) {\n  \t                recognizers.splice(index, 1);\n  \t                this.touchAction.update();\n  \t            }\n  \t        }\n\n  \t        return this;\n  \t    },\n\n  \t    /**\n  \t     * bind event\n  \t     * @param {String} events\n  \t     * @param {Function} handler\n  \t     * @returns {EventEmitter} this\n  \t     */\n  \t    on: function(events, handler) {\n  \t        if (events === undefined$1) {\n  \t            return;\n  \t        }\n  \t        if (handler === undefined$1) {\n  \t            return;\n  \t        }\n\n  \t        var handlers = this.handlers;\n  \t        each(splitStr(events), function(event) {\n  \t            handlers[event] = handlers[event] || [];\n  \t            handlers[event].push(handler);\n  \t        });\n  \t        return this;\n  \t    },\n\n  \t    /**\n  \t     * unbind event, leave emit blank to remove all handlers\n  \t     * @param {String} events\n  \t     * @param {Function} [handler]\n  \t     * @returns {EventEmitter} this\n  \t     */\n  \t    off: function(events, handler) {\n  \t        if (events === undefined$1) {\n  \t            return;\n  \t        }\n\n  \t        var handlers = this.handlers;\n  \t        each(splitStr(events), function(event) {\n  \t            if (!handler) {\n  \t                delete handlers[event];\n  \t            } else {\n  \t                handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1);\n  \t            }\n  \t        });\n  \t        return this;\n  \t    },\n\n  \t    /**\n  \t     * emit event to the listeners\n  \t     * @param {String} event\n  \t     * @param {Object} data\n  \t     */\n  \t    emit: function(event, data) {\n  \t        // we also want to trigger dom events\n  \t        if (this.options.domEvents) {\n  \t            triggerDomEvent(event, data);\n  \t        }\n\n  \t        // no handlers, so skip it all\n  \t        var handlers = this.handlers[event] && this.handlers[event].slice();\n  \t        if (!handlers || !handlers.length) {\n  \t            return;\n  \t        }\n\n  \t        data.type = event;\n  \t        data.preventDefault = function() {\n  \t            data.srcEvent.preventDefault();\n  \t        };\n\n  \t        var i = 0;\n  \t        while (i < handlers.length) {\n  \t            handlers[i](data);\n  \t            i++;\n  \t        }\n  \t    },\n\n  \t    /**\n  \t     * destroy the manager and unbinds all events\n  \t     * it doesn't unbind dom events, that is the user own responsibility\n  \t     */\n  \t    destroy: function() {\n  \t        this.element && toggleCssProps(this, false);\n\n  \t        this.handlers = {};\n  \t        this.session = {};\n  \t        this.input.destroy();\n  \t        this.element = null;\n  \t    }\n  \t};\n\n  \t/**\n  \t * add/remove the css properties as defined in manager.options.cssProps\n  \t * @param {Manager} manager\n  \t * @param {Boolean} add\n  \t */\n  \tfunction toggleCssProps(manager, add) {\n  \t    var element = manager.element;\n  \t    if (!element.style) {\n  \t        return;\n  \t    }\n  \t    var prop;\n  \t    each(manager.options.cssProps, function(value, name) {\n  \t        prop = prefixed(element.style, name);\n  \t        if (add) {\n  \t            manager.oldCssProps[prop] = element.style[prop];\n  \t            element.style[prop] = value;\n  \t        } else {\n  \t            element.style[prop] = manager.oldCssProps[prop] || '';\n  \t        }\n  \t    });\n  \t    if (!add) {\n  \t        manager.oldCssProps = {};\n  \t    }\n  \t}\n\n  \t/**\n  \t * trigger dom event\n  \t * @param {String} event\n  \t * @param {Object} data\n  \t */\n  \tfunction triggerDomEvent(event, data) {\n  \t    var gestureEvent = document.createEvent('Event');\n  \t    gestureEvent.initEvent(event, true, true);\n  \t    gestureEvent.gesture = data;\n  \t    data.target.dispatchEvent(gestureEvent);\n  \t}\n\n  \tassign(Hammer, {\n  \t    INPUT_START: INPUT_START,\n  \t    INPUT_MOVE: INPUT_MOVE,\n  \t    INPUT_END: INPUT_END,\n  \t    INPUT_CANCEL: INPUT_CANCEL,\n\n  \t    STATE_POSSIBLE: STATE_POSSIBLE,\n  \t    STATE_BEGAN: STATE_BEGAN,\n  \t    STATE_CHANGED: STATE_CHANGED,\n  \t    STATE_ENDED: STATE_ENDED,\n  \t    STATE_RECOGNIZED: STATE_RECOGNIZED,\n  \t    STATE_CANCELLED: STATE_CANCELLED,\n  \t    STATE_FAILED: STATE_FAILED,\n\n  \t    DIRECTION_NONE: DIRECTION_NONE,\n  \t    DIRECTION_LEFT: DIRECTION_LEFT,\n  \t    DIRECTION_RIGHT: DIRECTION_RIGHT,\n  \t    DIRECTION_UP: DIRECTION_UP,\n  \t    DIRECTION_DOWN: DIRECTION_DOWN,\n  \t    DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL,\n  \t    DIRECTION_VERTICAL: DIRECTION_VERTICAL,\n  \t    DIRECTION_ALL: DIRECTION_ALL,\n\n  \t    Manager: Manager,\n  \t    Input: Input,\n  \t    TouchAction: TouchAction,\n\n  \t    TouchInput: TouchInput,\n  \t    MouseInput: MouseInput,\n  \t    PointerEventInput: PointerEventInput,\n  \t    TouchMouseInput: TouchMouseInput,\n  \t    SingleTouchInput: SingleTouchInput,\n\n  \t    Recognizer: Recognizer,\n  \t    AttrRecognizer: AttrRecognizer,\n  \t    Tap: TapRecognizer,\n  \t    Pan: PanRecognizer,\n  \t    Swipe: SwipeRecognizer,\n  \t    Pinch: PinchRecognizer,\n  \t    Rotate: RotateRecognizer,\n  \t    Press: PressRecognizer,\n\n  \t    on: addEventListeners,\n  \t    off: removeEventListeners,\n  \t    each: each,\n  \t    merge: merge,\n  \t    extend: extend,\n  \t    assign: assign,\n  \t    inherit: inherit,\n  \t    bindFn: bindFn,\n  \t    prefixed: prefixed\n  \t});\n\n  \t// this prevents errors when Hammer is loaded in the presence of an AMD\n  \t//  style loader but by script tag, not by the loader.\n  \tvar freeGlobal = (typeof window !== 'undefined' ? window : (typeof self !== 'undefined' ? self : {})); // jshint ignore:line\n  \tfreeGlobal.Hammer = Hammer;\n\n  \tif (typeof undefined$1 === 'function' && undefined$1.amd) {\n  \t    undefined$1(function() {\n  \t        return Hammer;\n  \t    });\n  \t} else if (module.exports) {\n  \t    module.exports = Hammer;\n  \t} else {\n  \t    window[exportName] = Hammer;\n  \t}\n\n  \t})(window, document, 'Hammer'); \n  } (hammer));\n\n  var hammerExports = hammer.exports;\n  var Hammer = /*@__PURE__*/getDefaultExportFromCjs(hammerExports);\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   *\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../interaction-events/InteractionEvents').default} InteractionEvents\n   */\n\n  var MIN_ZOOM = 0.2,\n      MAX_ZOOM = 4;\n\n  var mouseEvents = [\n    'mousedown',\n    'mouseup',\n    'mouseover',\n    'mouseout',\n    'click',\n    'dblclick'\n  ];\n\n  function get(service, injector) {\n    return injector.get(service, false);\n  }\n\n  function stopEvent(event) {\n\n    event.preventDefault();\n\n    if (typeof event.stopPropagation === 'function') {\n      event.stopPropagation();\n    } else if (event.srcEvent && typeof event.srcEvent.stopPropagation === 'function') {\n\n      // iPhone & iPad\n      event.srcEvent.stopPropagation();\n    }\n\n    if (typeof event.stopImmediatePropagation === 'function') {\n      event.stopImmediatePropagation();\n    }\n  }\n\n\n  function createTouchRecognizer(node) {\n\n    function stopMouse(event$1) {\n\n      forEach$1(mouseEvents, function(e) {\n        event.bind(node, e, stopEvent, true);\n      });\n    }\n\n    function allowMouse(event$1) {\n      setTimeout(function() {\n        forEach$1(mouseEvents, function(e) {\n          event.unbind(node, e, stopEvent, true);\n        });\n      }, 500);\n    }\n\n    event.bind(node, 'touchstart', stopMouse, true);\n    event.bind(node, 'touchend', allowMouse, true);\n    event.bind(node, 'touchcancel', allowMouse, true);\n\n    // A touch event recognizer that handles\n    // touch events only (we know, we can already handle\n    // mouse events out of the box)\n\n    var recognizer = new Hammer.Manager(node, {\n      inputClass: Hammer.TouchInput,\n      recognizers: [],\n      domEvents: true\n    });\n\n\n    var tap = new Hammer.Tap();\n    var pan = new Hammer.Pan({ threshold: 10 });\n    var press = new Hammer.Press();\n    var pinch = new Hammer.Pinch();\n\n    var doubleTap = new Hammer.Tap({ event: 'doubletap', taps: 2 });\n\n    pinch.requireFailure(pan);\n    pinch.requireFailure(press);\n\n    recognizer.add([ pan, press, pinch, doubleTap, tap ]);\n\n    recognizer.reset = function(force) {\n      var recognizers = this.recognizers,\n          session = this.session;\n\n      if (session.stopped) {\n        return;\n      }\n\n      recognizer.stop(force);\n\n      setTimeout(function() {\n        var i, r;\n        for (i = 0; (r = recognizers[i]); i++) {\n          r.reset();\n          r.state = 8; // FAILED STATE\n        }\n\n        session.curRecognizer = null;\n      }, 0);\n    };\n\n    recognizer.on('hammer.input', function(event) {\n      if (event.srcEvent.defaultPrevented) {\n        recognizer.reset(true);\n      }\n    });\n\n    return recognizer;\n  }\n\n  /**\n   * A plugin that provides touch events for elements.\n   *\n   * @param {Injector} injector\n   * @param {Canvas} canvas\n   * @param {EventBus} eventBus\n   * @param {ElementRegistry} elementRegistry\n   * @param {InteractionEvents} interactionEvents\n   */\n  function TouchInteractionEvents(\n      injector, canvas, eventBus,\n      elementRegistry, interactionEvents) {\n\n    // optional integrations\n    var dragging = get('dragging', injector),\n        move = get('move', injector),\n        contextPad = get('contextPad', injector),\n        palette = get('palette', injector);\n\n    // the touch recognizer\n    var recognizer;\n\n    function handler(type, buttonType) {\n\n      return function(event) {\n\n        var gfx = getGfx(event.target),\n            element = gfx && elementRegistry.get(gfx);\n\n        // translate into an actual mouse click event\n        if (buttonType) {\n          event.srcEvent.button = buttonType;\n        }\n\n        return interactionEvents.fire(type, event, element);\n      };\n    }\n\n\n    function getGfx(target) {\n      var node = closest(target, 'svg, .djs-element', true);\n      return node;\n    }\n\n    function initEvents(svg) {\n\n      // touch recognizer\n      recognizer = createTouchRecognizer(svg);\n\n      function startGrabCanvas(event) {\n\n        var lx = 0, ly = 0;\n\n        function update(e) {\n\n          var dx = e.deltaX - lx,\n              dy = e.deltaY - ly;\n\n          canvas.scroll({ dx: dx, dy: dy });\n\n          lx = e.deltaX;\n          ly = e.deltaY;\n        }\n\n        function end(e) {\n          recognizer.off('panmove', update);\n          recognizer.off('panend', end);\n          recognizer.off('pancancel', end);\n        }\n\n        recognizer.on('panmove', update);\n        recognizer.on('panend', end);\n        recognizer.on('pancancel', end);\n      }\n\n      function startGrab(event) {\n\n        var gfx = getGfx(event.target),\n            element = gfx && elementRegistry.get(gfx);\n\n        // recognizer\n        if (move && canvas.getRootElement() !== element) {\n          return move.start(event, element, true);\n        } else {\n          startGrabCanvas();\n        }\n      }\n\n      function startZoom(e) {\n\n        var zoom = canvas.zoom(),\n            mid = e.center;\n\n        function update(e) {\n\n          var ratio = 1 - (1 - e.scale) / 1.50,\n              newZoom = Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, ratio * zoom));\n\n          canvas.zoom(newZoom, mid);\n\n          stopEvent(e);\n        }\n\n        function end(e) {\n          recognizer.off('pinchmove', update);\n          recognizer.off('pinchend', end);\n          recognizer.off('pinchcancel', end);\n\n          recognizer.reset(true);\n        }\n\n        recognizer.on('pinchmove', update);\n        recognizer.on('pinchend', end);\n        recognizer.on('pinchcancel', end);\n      }\n\n      recognizer.on('tap', handler('element.click'));\n      recognizer.on('doubletap', handler('element.dblclick', 1));\n\n      recognizer.on('panstart', startGrab);\n      recognizer.on('press', startGrab);\n\n      recognizer.on('pinchstart', startZoom);\n    }\n\n    if (dragging) {\n\n      // simulate hover during dragging\n      eventBus.on('drag.move', function(event) {\n\n        var originalEvent = event.originalEvent;\n\n        if (!originalEvent || originalEvent instanceof MouseEvent) {\n          return;\n        }\n\n        var position = toPoint(originalEvent);\n\n        // this gets really expensive ...\n        var node = document.elementFromPoint(position.x, position.y),\n            gfx = getGfx(node),\n            element = gfx && elementRegistry.get(gfx);\n\n        if (element !== event.hover) {\n          if (event.hover) {\n            dragging.out(event);\n          }\n\n          if (element) {\n            dragging.hover({ element: element, gfx: gfx });\n\n            event.hover = element;\n            event.hoverGfx = gfx;\n          }\n        }\n      });\n    }\n\n    if (contextPad) {\n\n      eventBus.on('contextPad.create', function(event) {\n        var node = event.pad.html;\n\n        // touch recognizer\n        var padRecognizer = createTouchRecognizer(node);\n\n        padRecognizer.on('panstart', function(event) {\n          contextPad.trigger('dragstart', event, true);\n        });\n\n        padRecognizer.on('press', function(event) {\n          contextPad.trigger('dragstart', event, true);\n        });\n\n        padRecognizer.on('tap', function(event) {\n          contextPad.trigger('click', event);\n        });\n      });\n    }\n\n    if (palette) {\n      eventBus.on('palette.create', function(event) {\n        var node = event.container;\n\n        // touch recognizer\n        var padRecognizer = createTouchRecognizer(node);\n\n        padRecognizer.on('panstart', function(event) {\n          palette.trigger('dragstart', event, true);\n        });\n\n        padRecognizer.on('press', function(event) {\n          palette.trigger('dragstart', event, true);\n        });\n\n        padRecognizer.on('tap', function(event) {\n          palette.trigger('click', event);\n        });\n      });\n    }\n\n    eventBus.on('canvas.init', function(event) {\n      initEvents(event.svg);\n    });\n  }\n\n\n  TouchInteractionEvents.$inject = [\n    'injector',\n    'canvas',\n    'eventBus',\n    'elementRegistry',\n    'interactionEvents',\n    'touchFix'\n  ];\n\n  /**\n   * @typedef {import('../../core/EventBus').default} EventBus\n   */\n\n  /**\n   * @param {EventBus} eventBus\n   */\n  function TouchFix(eventBus) {\n\n    var self = this;\n\n    eventBus.on('canvas.init', function(e) {\n      self.addBBoxMarker(e.svg);\n    });\n  }\n\n  TouchFix.$inject = [ 'eventBus' ];\n\n\n  /**\n   * Safari mobile (iOS 7) does not fire touchstart event in <SVG> element\n   * if there is no shape between 0,0 and viewport elements origin.\n   *\n   * So touchstart event is only fired when the <g class=\"viewport\"> element was hit.\n   * Putting an element over and below the 'viewport' fixes that behavior.\n   *\n   * @param {SVGElement} svg\n   */\n  TouchFix.prototype.addBBoxMarker = function(svg) {\n\n    var markerStyle = {\n      fill: 'none',\n      class: 'outer-bound-marker'\n    };\n\n    var rect1 = create$1('rect');\n    attr(rect1, {\n      x: -10000,\n      y: 10000,\n      width: 10,\n      height: 10\n    });\n    attr(rect1, markerStyle);\n\n    append(svg, rect1);\n\n    var rect2 = create$1('rect');\n    attr(rect2, {\n      x: 10000,\n      y: 10000,\n      width: 10,\n      height: 10\n    });\n    attr(rect2, markerStyle);\n\n    append(svg, rect2);\n  };\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var TouchModule$1 = {\n    __depends__: [ InteractionEventsModule$1 ],\n    __init__: [ 'touchInteractionEvents' ],\n    touchInteractionEvents: [ 'type', TouchInteractionEvents ],\n    touchFix: [ 'type', TouchFix ]\n  };\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var TouchModule = {\n    __depends__: [\n      TouchModule$1\n    ]\n  };\n\n  /**\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   * @typedef {import('../rules/Rules').default} Rules\n   *\n   * @typedef {import('../../util/Types').Axis} Axis\n   * @typedef {import('../../util/Types').Dimension} Dimension\n   *\n   * @typedef { 'top' | 'right' | 'bottom' | 'left' | 'center' | 'middle' } Alignment\n   */\n\n  function last(arr) {\n    return arr && arr[arr.length - 1];\n  }\n\n  function sortTopOrMiddle(element) {\n    return element.y;\n  }\n\n  function sortLeftOrCenter(element) {\n    return element.x;\n  }\n\n  /**\n   * Sorting functions for different alignments.\n   *\n   * @type {Record<string, Function>}\n   */\n  var ALIGNMENT_SORTING = {\n    left: sortLeftOrCenter,\n    center: sortLeftOrCenter,\n    right: function(element) {\n      return element.x + element.width;\n    },\n    top: sortTopOrMiddle,\n    middle: sortTopOrMiddle,\n    bottom: function(element) {\n      return element.y + element.height;\n    }\n  };\n\n  /**\n   * @param {Modeling} modeling\n   * @param {Rules} rules\n   */\n  function AlignElements$1(modeling, rules) {\n    this._modeling = modeling;\n    this._rules = rules;\n  }\n\n  AlignElements$1.$inject = [ 'modeling', 'rules' ];\n\n\n  /**\n   * Get relevant axis and dimension for given alignment.\n   *\n   * @param {Alignment} type\n   *\n   * @return { {\n   *   axis: Axis;\n   *   dimension: Dimension;\n   * } }\n   */\n  AlignElements$1.prototype._getOrientationDetails = function(type) {\n    var vertical = [ 'top', 'bottom', 'middle' ],\n        axis = 'x',\n        dimension = 'width';\n\n    if (vertical.indexOf(type) !== -1) {\n      axis = 'y';\n      dimension = 'height';\n    }\n\n    return {\n      axis: axis,\n      dimension: dimension\n    };\n  };\n\n  AlignElements$1.prototype._isType = function(type, types) {\n    return types.indexOf(type) !== -1;\n  };\n\n  /**\n   * Get point on relevant axis for given alignment.\n   *\n   * @param {Alignment} type\n   * @param {Element[]} sortedElements\n   *\n   * @return {Partial<Record<Alignment, number>>}\n   */\n  AlignElements$1.prototype._alignmentPosition = function(type, sortedElements) {\n    var orientation = this._getOrientationDetails(type),\n        axis = orientation.axis,\n        dimension = orientation.dimension,\n        alignment = {},\n        centers = {},\n        hasSharedCenters = false,\n        centeredElements,\n        firstElement,\n        lastElement;\n\n    function getMiddleOrTop(first, last) {\n      return Math.round((first[axis] + last[axis] + last[dimension]) / 2);\n    }\n\n    if (this._isType(type, [ 'left', 'top' ])) {\n      alignment[type] = sortedElements[0][axis];\n\n    } else if (this._isType(type, [ 'right', 'bottom' ])) {\n      lastElement = last(sortedElements);\n\n      alignment[type] = lastElement[axis] + lastElement[dimension];\n\n    } else if (this._isType(type, [ 'center', 'middle' ])) {\n\n      // check if there is a center shared by more than one shape\n      // if not, just take the middle of the range\n      forEach$1(sortedElements, function(element) {\n        var center = element[axis] + Math.round(element[dimension] / 2);\n\n        if (centers[center]) {\n          centers[center].elements.push(element);\n        } else {\n          centers[center] = {\n            elements: [ element ],\n            center: center\n          };\n        }\n      });\n\n      centeredElements = sortBy(centers, function(center) {\n        if (center.elements.length > 1) {\n          hasSharedCenters = true;\n        }\n\n        return center.elements.length;\n      });\n\n      if (hasSharedCenters) {\n        alignment[type] = last(centeredElements).center;\n\n        return alignment;\n      }\n\n      firstElement = sortedElements[0];\n\n      sortedElements = sortBy(sortedElements, function(element) {\n        return element[axis] + element[dimension];\n      });\n\n      lastElement = last(sortedElements);\n\n      alignment[type] = getMiddleOrTop(firstElement, lastElement);\n    }\n\n    return alignment;\n  };\n\n  /**\n   * Align elements on relevant axis for given alignment.\n   *\n   * @param {Element[]} elements\n   * @param {Alignment} type\n   */\n  AlignElements$1.prototype.trigger = function(elements, type) {\n    var modeling = this._modeling,\n        allowed;\n\n    // filter out elements which cannot be aligned\n    var filteredElements = filter(elements, function(element) {\n      return !(element.waypoints || element.host || element.labelTarget);\n    });\n\n    // filter out elements via rules\n    allowed = this._rules.allowed('elements.align', { elements: filteredElements });\n    if (isArray$3(allowed)) {\n      filteredElements = allowed;\n    }\n\n    if (filteredElements.length < 2 || !allowed) {\n      return;\n    }\n\n    var sortFn = ALIGNMENT_SORTING[type];\n\n    var sortedElements = sortBy(filteredElements, sortFn);\n\n    var alignment = this._alignmentPosition(type, sortedElements);\n\n    modeling.alignElements(sortedElements, alignment);\n  };\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var AlignElementsModule$1 = {\n    __init__: [ 'alignElements' ],\n    alignElements: [ 'type', AlignElements$1 ]\n  };\n\n  /**\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef {import('../../util/Types').Rect} Rect\n   *\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../overlays/Overlays').default} Overlays\n   *\n   * @typedef {import('../overlays/Overlays').Overlay} Overlay\n   *\n   * @typedef {import('./ContextPadProvider').default} ContextPadProvider\n   * @typedef {import('./ContextPadProvider').ContextPadEntries} ContextPadEntries\n   *\n   * @typedef { {\n   *   scale?: {\n   *     min?: number;\n   *     max?: number;\n   *   };\n   * } } ContextPadConfig\n   */\n\n  /**\n   * @template {Element} [ElementType=Element]\n   *\n   * @typedef {ElementType|ElementType[]} ContextPadTarget\n   */\n\n  var entrySelector = '.entry';\n\n  var DEFAULT_PRIORITY$2 = 1000;\n  var CONTEXT_PAD_PADDING = 12;\n\n  /**\n   * A context pad that displays element specific, contextual actions next\n   * to a diagram element.\n   *\n   * @param {Canvas} canvas\n   * @param {ContextPadConfig} config\n   * @param {EventBus} eventBus\n   * @param {Overlays} overlays\n   */\n  function ContextPad(canvas, config, eventBus, overlays) {\n\n    this._canvas = canvas;\n    this._eventBus = eventBus;\n    this._overlays = overlays;\n\n    var scale = isDefined(config && config.scale) ? config.scale : {\n      min: 1,\n      max: 1.5\n    };\n\n    this._overlaysConfig = {\n      scale: scale\n    };\n\n    this._current = null;\n\n    this._init();\n  }\n\n  ContextPad.$inject = [\n    'canvas',\n    'config.contextPad',\n    'eventBus',\n    'overlays'\n  ];\n\n\n  /**\n   * Registers events needed for interaction with other components.\n   */\n  ContextPad.prototype._init = function() {\n    var self = this;\n\n    this._eventBus.on('selection.changed', function(event) {\n\n      var selection = event.newSelection;\n\n      var target = selection.length\n        ? selection.length === 1\n          ? selection[0]\n          : selection\n        : null;\n\n      if (target) {\n        self.open(target, true);\n      } else {\n        self.close();\n      }\n    });\n\n    this._eventBus.on('elements.changed', function(event) {\n      var elements = event.elements,\n          current = self._current;\n\n      if (!current) {\n        return;\n      }\n\n      var currentTarget = current.target;\n\n      var currentChanged = some(\n        isArray$3(currentTarget) ? currentTarget : [ currentTarget ],\n        function(element) {\n          return includes$8(elements, element);\n        }\n      );\n\n      // re-open if elements in current selection changed\n      if (currentChanged) {\n        self.open(currentTarget, true);\n      }\n    });\n  };\n\n  /**\n   * @overlord\n   *\n   * Register a context pad provider with the default priority. See\n   * {@link ContextPadProvider} for examples.\n   *\n   * @param {ContextPadProvider} provider\n   */\n\n  /**\n   * Register a context pad provider with the given priority. See\n   * {@link ContextPadProvider} for examples.\n   *\n   * @param {number} priority\n   * @param {ContextPadProvider} provider\n   */\n  ContextPad.prototype.registerProvider = function(priority, provider) {\n    if (!provider) {\n      provider = priority;\n      priority = DEFAULT_PRIORITY$2;\n    }\n\n    this._eventBus.on('contextPad.getProviders', priority, function(event) {\n      event.providers.push(provider);\n    });\n  };\n\n\n  /**\n   * Get context pad entries for given elements.\n   *\n   * @param {ContextPadTarget} target\n   *\n   * @return {ContextPadEntries} list of entries\n   */\n  ContextPad.prototype.getEntries = function(target) {\n    var providers = this._getProviders();\n\n    var provideFn = isArray$3(target)\n      ? 'getMultiElementContextPadEntries'\n      : 'getContextPadEntries';\n\n    var entries = {};\n\n    // loop through all providers and their entries.\n    // group entries by id so that overriding an entry is possible\n    forEach$1(providers, function(provider) {\n\n      if (!isFunction(provider[provideFn])) {\n        return;\n      }\n\n      var entriesOrUpdater = provider[provideFn](target);\n\n      if (isFunction(entriesOrUpdater)) {\n        entries = entriesOrUpdater(entries);\n      } else {\n        forEach$1(entriesOrUpdater, function(entry, id) {\n          entries[id] = entry;\n        });\n      }\n    });\n\n    return entries;\n  };\n\n\n  /**\n   * Trigger context pad via DOM event.\n   *\n   * The entry to trigger is determined by the target element.\n   *\n   * @param {string} action\n   * @param {Event} event\n   * @param {boolean} [autoActivate=false]\n   */\n  ContextPad.prototype.trigger = function(action, event, autoActivate) {\n\n    var entry,\n        originalEvent,\n        button = event.delegateTarget || event.target;\n\n    if (!button) {\n      return event.preventDefault();\n    }\n\n    entry = attr$1(button, 'data-action');\n    originalEvent = event.originalEvent || event;\n\n    return this.triggerEntry(entry, action, originalEvent, autoActivate);\n  };\n\n  /**\n   * Trigger context pad entry entry.\n   *\n   * @param {string} entryId\n   * @param {string} action\n   * @param {Event} event\n   * @param {boolean} [autoActivate=false]\n   */\n  ContextPad.prototype.triggerEntry = function(entryId, action, event, autoActivate) {\n\n    if (!this.isShown()) {\n      return;\n    }\n\n    var target = this._current.target,\n        entries = this._current.entries;\n\n    var entry = entries[entryId];\n\n    if (!entry) {\n      return;\n    }\n\n    var handler = entry.action;\n\n    if (this._eventBus.fire('contextPad.trigger', { entry, event }) === false) {\n      return;\n    }\n\n    // simple action (via callback function)\n    if (isFunction(handler)) {\n      if (action === 'click') {\n        return handler(event, target, autoActivate);\n      }\n    } else {\n      if (handler[action]) {\n        return handler[action](event, target, autoActivate);\n      }\n    }\n\n    // silence other actions\n    event.preventDefault();\n  };\n\n\n  /**\n   * Open the context pad for given elements.\n   *\n   * @param {ContextPadTarget} target\n   * @param {boolean} [force=false] - Force re-opening context pad.\n   */\n  ContextPad.prototype.open = function(target, force) {\n    if (!force && this.isOpen(target)) {\n      return;\n    }\n\n    this.close();\n\n    this._updateAndOpen(target);\n  };\n\n  ContextPad.prototype._getProviders = function() {\n\n    var event = this._eventBus.createEvent({\n      type: 'contextPad.getProviders',\n      providers: []\n    });\n\n    this._eventBus.fire(event);\n\n    return event.providers;\n  };\n\n\n  /**\n   * @param {ContextPadTarget} target\n   */\n  ContextPad.prototype._updateAndOpen = function(target) {\n    var entries = this.getEntries(target),\n        pad = this.getPad(target),\n        html = pad.html,\n        image;\n\n    forEach$1(entries, function(entry, id) {\n      var grouping = entry.group || 'default',\n          control = domify$1(entry.html || '<div class=\"entry\" draggable=\"true\"></div>'),\n          container;\n\n      attr$1(control, 'data-action', id);\n\n      container = query('[data-group=' + escapeCSS(grouping) + ']', html);\n      if (!container) {\n        container = domify$1('<div class=\"group\"></div>');\n        attr$1(container, 'data-group', grouping);\n\n        html.appendChild(container);\n      }\n\n      container.appendChild(control);\n\n      if (entry.className) {\n        addClasses$1(control, entry.className);\n      }\n\n      if (entry.title) {\n        attr$1(control, 'title', entry.title);\n      }\n\n      if (entry.imageUrl) {\n        image = domify$1('<img>');\n        attr$1(image, 'src', entry.imageUrl);\n        image.style.width = '100%';\n        image.style.height = '100%';\n\n        control.appendChild(image);\n      }\n    });\n\n    classes$1(html).add('open');\n\n    this._current = {\n      target: target,\n      entries: entries,\n      pad: pad\n    };\n\n    this._eventBus.fire('contextPad.open', { current: this._current });\n  };\n\n  /**\n   * @param {ContextPadTarget} target\n   *\n   * @return {Overlay}\n   */\n  ContextPad.prototype.getPad = function(target) {\n    if (this.isOpen()) {\n      return this._current.pad;\n    }\n\n    var self = this;\n\n    var overlays = this._overlays;\n\n    var html = domify$1('<div class=\"djs-context-pad\"></div>');\n\n    var position = this._getPosition(target);\n\n    var overlaysConfig = assign$1({\n      html: html\n    }, this._overlaysConfig, position);\n\n    delegate.bind(html, entrySelector, 'click', function(event) {\n      self.trigger('click', event);\n    });\n\n    delegate.bind(html, entrySelector, 'dragstart', function(event) {\n      self.trigger('dragstart', event);\n    });\n\n    // stop propagation of mouse events\n    event.bind(html, 'mousedown', function(event) {\n      event.stopPropagation();\n    });\n\n    var activeRootElement = this._canvas.getRootElement();\n\n    this._overlayId = overlays.add(activeRootElement, 'context-pad', overlaysConfig);\n\n    var pad = overlays.get(this._overlayId);\n\n    this._eventBus.fire('contextPad.create', {\n      target: target,\n      pad: pad\n    });\n\n    return pad;\n  };\n\n\n  /**\n   * Close the context pad\n   */\n  ContextPad.prototype.close = function() {\n    if (!this.isOpen()) {\n      return;\n    }\n\n    this._overlays.remove(this._overlayId);\n\n    this._overlayId = null;\n\n    this._eventBus.fire('contextPad.close', { current: this._current });\n\n    this._current = null;\n  };\n\n  /**\n   * Check if pad is open.\n   *\n   * If target is provided, check if it is opened\n   * for the given target (single or multiple elements).\n   *\n   * @param {ContextPadTarget} [target]\n   * @return {boolean}\n   */\n  ContextPad.prototype.isOpen = function(target) {\n    var current = this._current;\n\n    if (!current) {\n      return false;\n    }\n\n    // basic no-args is open check\n    if (!target) {\n      return true;\n    }\n\n    var currentTarget = current.target;\n\n    // strict handling of single vs. multi-selection\n    if (isArray$3(target) !== isArray$3(currentTarget)) {\n      return false;\n    }\n\n    if (isArray$3(target)) {\n      return (\n        target.length === currentTarget.length &&\n        every(target, function(element) {\n          return includes$8(currentTarget, element);\n        })\n      );\n    } else {\n      return currentTarget === target;\n    }\n  };\n\n\n  /**\n   * Check if pad is open and not hidden.\n   *\n   * @return {boolean}\n   */\n  ContextPad.prototype.isShown = function() {\n    return this.isOpen() && this._overlays.isShown();\n  };\n\n\n  /**\n   * Get contex pad position.\n   *\n   * @param {ContextPadTarget} target\n   *\n   * @return {Rect}\n   */\n  ContextPad.prototype._getPosition = function(target) {\n\n    var elements = isArray$3(target) ? target : [ target ];\n    var bBox = getBBox(elements);\n\n    return {\n      position: {\n        left: bBox.x + bBox.width + CONTEXT_PAD_PADDING,\n        top: bBox.y - CONTEXT_PAD_PADDING / 2\n      }\n    };\n  };\n\n\n  // helpers //////////\n\n  function addClasses$1(element, classNames) {\n    var classes = classes$1(element);\n\n    classNames = isArray$3(classNames) ? classNames : classNames.split(/\\s+/g);\n\n    classNames.forEach(function(cls) {\n      classes.add(cls);\n    });\n  }\n\n  /**\n   * @param {any[]} array\n   * @param {any} item\n   *\n   * @return {boolean}\n   */\n  function includes$8(array, item) {\n    return array.indexOf(item) !== -1;\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var ContextPadModule$1 = {\n    __depends__: [\n      InteractionEventsModule$1,\n      OverlaysModule\n    ],\n    contextPad: [ 'type', ContextPad ]\n  };\n\n  var n$1,l$1,u$1,t$2,o$1,f$1={},e$2=[],c$1=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function s$1(n,l){for(var u in l)n[u]=l[u];return n}function a$1(n){var l=n.parentNode;l&&l.removeChild(n);}function h$1(l,u,i){var t,o,r,f={};for(r in u)\"key\"==r?t=u[r]:\"ref\"==r?o=u[r]:f[r]=u[r];if(arguments.length>2&&(f.children=arguments.length>3?n$1.call(arguments,2):i),\"function\"==typeof l&&null!=l.defaultProps)for(r in l.defaultProps)void 0===f[r]&&(f[r]=l.defaultProps[r]);return v$1(l,f,t,o,null)}function v$1(n,i,t,o,r){var f={type:n,props:i,key:t,ref:o,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==r?++u$1:r};return null==r&&null!=l$1.vnode&&l$1.vnode(f),f}function p$1(n){return n.children}function d$1(n,l){this.props=n,this.context=l;}function _$1(n,l){if(null==l)return n.__?_$1(n.__,n.__.__k.indexOf(n)+1):null;for(var u;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e)return u.__e;return \"function\"==typeof n.type?_$1(n):null}function k$1(n){var l,u;if(null!=(n=n.__)&&null!=n.__c){for(n.__e=n.__c.base=null,l=0;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e){n.__e=n.__c.base=u.__e;break}return k$1(n)}}function b$1(n){(!n.__d&&(n.__d=!0)&&t$2.push(n)&&!g$1.__r++||o$1!==l$1.debounceRendering)&&((o$1=l$1.debounceRendering)||setTimeout)(g$1);}function g$1(){for(var n;g$1.__r=t$2.length;)n=t$2.sort(function(n,l){return n.__v.__b-l.__v.__b}),t$2=[],n.some(function(n){var l,u,i,t,o,r;n.__d&&(o=(t=(l=n).__v).__e,(r=l.__P)&&(u=[],(i=s$1({},t)).__v=t.__v+1,j$1(r,t,i,l.__n,void 0!==r.ownerSVGElement,null!=t.__h?[o]:null,u,null==o?_$1(t):o,t.__h),z$1(u,t),t.__e!=o&&k$1(t)));});}function w$1(n,l,u,i,t,o,r,c,s,a){var h,y,d,k,b,g,w,x=i&&i.__k||e$2,C=x.length;for(u.__k=[],h=0;h<l.length;h++)if(null!=(k=u.__k[h]=null==(k=l[h])||\"boolean\"==typeof k?null:\"string\"==typeof k||\"number\"==typeof k||\"bigint\"==typeof k?v$1(null,k,null,null,k):Array.isArray(k)?v$1(p$1,{children:k},null,null,null):k.__b>0?v$1(k.type,k.props,k.key,k.ref?k.ref:null,k.__v):k)){if(k.__=u,k.__b=u.__b+1,null===(d=x[h])||d&&k.key==d.key&&k.type===d.type)x[h]=void 0;else for(y=0;y<C;y++){if((d=x[y])&&k.key==d.key&&k.type===d.type){x[y]=void 0;break}d=null;}j$1(n,k,d=d||f$1,t,o,r,c,s,a),b=k.__e,(y=k.ref)&&d.ref!=y&&(w||(w=[]),d.ref&&w.push(d.ref,null,k),w.push(y,k.__c||b,k)),null!=b?(null==g&&(g=b),\"function\"==typeof k.type&&k.__k===d.__k?k.__d=s=m$2(k,s,n):s=A(n,k,d,x,b,s),\"function\"==typeof u.type&&(u.__d=s)):s&&d.__e==s&&s.parentNode!=n&&(s=_$1(d));}for(u.__e=g,h=C;h--;)null!=x[h]&&N(x[h],x[h]);if(w)for(h=0;h<w.length;h++)M(w[h],w[++h],w[++h]);}function m$2(n,l,u){for(var i,t=n.__k,o=0;t&&o<t.length;o++)(i=t[o])&&(i.__=n,l=\"function\"==typeof i.type?m$2(i,l,u):A(u,i,i,t,i.__e,l));return l}function A(n,l,u,i,t,o){var r,f,e;if(void 0!==l.__d)r=l.__d,l.__d=void 0;else if(null==u||t!=o||null==t.parentNode)n:if(null==o||o.parentNode!==n)n.appendChild(t),r=null;else {for(f=o,e=0;(f=f.nextSibling)&&e<i.length;e+=1)if(f==t)break n;n.insertBefore(t,o),r=o;}return void 0!==r?r:t.nextSibling}function C(n,l,u,i,t){var o;for(o in u)\"children\"===o||\"key\"===o||o in l||H(n,o,null,u[o],i);for(o in l)t&&\"function\"!=typeof l[o]||\"children\"===o||\"key\"===o||\"value\"===o||\"checked\"===o||u[o]===l[o]||H(n,o,l[o],u[o],i);}function $(n,l,u){\"-\"===l[0]?n.setProperty(l,u):n[l]=null==u?\"\":\"number\"!=typeof u||c$1.test(l)?u:u+\"px\";}function H(n,l,u,i,t){var o;n:if(\"style\"===l)if(\"string\"==typeof u)n.style.cssText=u;else {if(\"string\"==typeof i&&(n.style.cssText=i=\"\"),i)for(l in i)u&&l in u||$(n.style,l,\"\");if(u)for(l in u)i&&u[l]===i[l]||$(n.style,l,u[l]);}else if(\"o\"===l[0]&&\"n\"===l[1])o=l!==(l=l.replace(/Capture$/,\"\")),l=l.toLowerCase()in n?l.toLowerCase().slice(2):l.slice(2),n.l||(n.l={}),n.l[l+o]=u,u?i||n.addEventListener(l,o?T$1:I,o):n.removeEventListener(l,o?T$1:I,o);else if(\"dangerouslySetInnerHTML\"!==l){if(t)l=l.replace(/xlink(H|:h)/,\"h\").replace(/sName$/,\"s\");else if(\"href\"!==l&&\"list\"!==l&&\"form\"!==l&&\"tabIndex\"!==l&&\"download\"!==l&&l in n)try{n[l]=null==u?\"\":u;break n}catch(n){}\"function\"==typeof u||(null==u||!1===u&&-1==l.indexOf(\"-\")?n.removeAttribute(l):n.setAttribute(l,u));}}function I(n){this.l[n.type+!1](l$1.event?l$1.event(n):n);}function T$1(n){this.l[n.type+!0](l$1.event?l$1.event(n):n);}function j$1(n,u,i,t,o,r,f,e,c){var a,h,v,y,_,k,b,g,m,x,A,C,$,H,I,T=u.type;if(void 0!==u.constructor)return null;null!=i.__h&&(c=i.__h,e=u.__e=i.__e,u.__h=null,r=[e]),(a=l$1.__b)&&a(u);try{n:if(\"function\"==typeof T){if(g=u.props,m=(a=T.contextType)&&t[a.__c],x=a?m?m.props.value:a.__:t,i.__c?b=(h=u.__c=i.__c).__=h.__E:(\"prototype\"in T&&T.prototype.render?u.__c=h=new T(g,x):(u.__c=h=new d$1(g,x),h.constructor=T,h.render=O),m&&m.sub(h),h.props=g,h.state||(h.state={}),h.context=x,h.__n=t,v=h.__d=!0,h.__h=[],h._sb=[]),null==h.__s&&(h.__s=h.state),null!=T.getDerivedStateFromProps&&(h.__s==h.state&&(h.__s=s$1({},h.__s)),s$1(h.__s,T.getDerivedStateFromProps(g,h.__s))),y=h.props,_=h.state,v)null==T.getDerivedStateFromProps&&null!=h.componentWillMount&&h.componentWillMount(),null!=h.componentDidMount&&h.__h.push(h.componentDidMount);else {if(null==T.getDerivedStateFromProps&&g!==y&&null!=h.componentWillReceiveProps&&h.componentWillReceiveProps(g,x),!h.__e&&null!=h.shouldComponentUpdate&&!1===h.shouldComponentUpdate(g,h.__s,x)||u.__v===i.__v){for(h.props=g,h.state=h.__s,u.__v!==i.__v&&(h.__d=!1),h.__v=u,u.__e=i.__e,u.__k=i.__k,u.__k.forEach(function(n){n&&(n.__=u);}),A=0;A<h._sb.length;A++)h.__h.push(h._sb[A]);h._sb=[],h.__h.length&&f.push(h);break n}null!=h.componentWillUpdate&&h.componentWillUpdate(g,h.__s,x),null!=h.componentDidUpdate&&h.__h.push(function(){h.componentDidUpdate(y,_,k);});}if(h.context=x,h.props=g,h.__v=u,h.__P=n,C=l$1.__r,$=0,\"prototype\"in T&&T.prototype.render){for(h.state=h.__s,h.__d=!1,C&&C(u),a=h.render(h.props,h.state,h.context),H=0;H<h._sb.length;H++)h.__h.push(h._sb[H]);h._sb=[];}else do{h.__d=!1,C&&C(u),a=h.render(h.props,h.state,h.context),h.state=h.__s;}while(h.__d&&++$<25);h.state=h.__s,null!=h.getChildContext&&(t=s$1(s$1({},t),h.getChildContext())),v||null==h.getSnapshotBeforeUpdate||(k=h.getSnapshotBeforeUpdate(y,_)),I=null!=a&&a.type===p$1&&null==a.key?a.props.children:a,w$1(n,Array.isArray(I)?I:[I],u,i,t,o,r,f,e,c),h.base=u.__e,u.__h=null,h.__h.length&&f.push(h),b&&(h.__E=h.__=null),h.__e=!1;}else null==r&&u.__v===i.__v?(u.__k=i.__k,u.__e=i.__e):u.__e=L(i.__e,u,i,t,o,r,f,c);(a=l$1.diffed)&&a(u);}catch(n){u.__v=null,(c||null!=r)&&(u.__e=e,u.__h=!!c,r[r.indexOf(e)]=null),l$1.__e(n,u,i);}}function z$1(n,u){l$1.__c&&l$1.__c(u,n),n.some(function(u){try{n=u.__h,u.__h=[],n.some(function(n){n.call(u);});}catch(n){l$1.__e(n,u.__v);}});}function L(l,u,i,t,o,r,e,c){var s,h,v,y=i.props,p=u.props,d=u.type,k=0;if(\"svg\"===d&&(o=!0),null!=r)for(;k<r.length;k++)if((s=r[k])&&\"setAttribute\"in s==!!d&&(d?s.localName===d:3===s.nodeType)){l=s,r[k]=null;break}if(null==l){if(null===d)return document.createTextNode(p);l=o?document.createElementNS(\"http://www.w3.org/2000/svg\",d):document.createElement(d,p.is&&p),r=null,c=!1;}if(null===d)y===p||c&&l.data===p||(l.data=p);else {if(r=r&&n$1.call(l.childNodes),h=(y=i.props||f$1).dangerouslySetInnerHTML,v=p.dangerouslySetInnerHTML,!c){if(null!=r)for(y={},k=0;k<l.attributes.length;k++)y[l.attributes[k].name]=l.attributes[k].value;(v||h)&&(v&&(h&&v.__html==h.__html||v.__html===l.innerHTML)||(l.innerHTML=v&&v.__html||\"\"));}if(C(l,p,y,o,c),v)u.__k=[];else if(k=u.props.children,w$1(l,Array.isArray(k)?k:[k],u,i,t,o&&\"foreignObject\"!==d,r,e,r?r[0]:i.__k&&_$1(i,0),c),null!=r)for(k=r.length;k--;)null!=r[k]&&a$1(r[k]);c||(\"value\"in p&&void 0!==(k=p.value)&&(k!==l.value||\"progress\"===d&&!k||\"option\"===d&&k!==y.value)&&H(l,\"value\",k,y.value,!1),\"checked\"in p&&void 0!==(k=p.checked)&&k!==l.checked&&H(l,\"checked\",k,y.checked,!1));}return l}function M(n,u,i){try{\"function\"==typeof n?n(u):n.current=u;}catch(n){l$1.__e(n,i);}}function N(n,u,i){var t,o;if(l$1.unmount&&l$1.unmount(n),(t=n.ref)&&(t.current&&t.current!==n.__e||M(t,null,u)),null!=(t=n.__c)){if(t.componentWillUnmount)try{t.componentWillUnmount();}catch(n){l$1.__e(n,u);}t.base=t.__P=null,n.__c=void 0;}if(t=n.__k)for(o=0;o<t.length;o++)t[o]&&N(t[o],u,i||\"function\"!=typeof n.type);i||null==n.__e||a$1(n.__e),n.__=n.__e=n.__d=void 0;}function O(n,l,u){return this.constructor(n,u)}function P(u,i,t){var o,r,e;l$1.__&&l$1.__(u,i),r=(o=\"function\"==typeof t)?null:t&&t.__k||i.__k,e=[],j$1(i,u=(!o&&t||i).__k=h$1(p$1,null,[u]),r||f$1,f$1,void 0!==i.ownerSVGElement,!o&&t?[t]:r?null:i.firstChild?n$1.call(i.childNodes):null,e,!o&&t?t:r?r.__e:i.firstChild,o),z$1(e,u);}n$1=e$2.slice,l$1={__e:function(n,l,u,i){for(var t,o,r;l=l.__;)if((t=l.__c)&&!t.__)try{if((o=t.constructor)&&null!=o.getDerivedStateFromError&&(t.setState(o.getDerivedStateFromError(n)),r=t.__d),null!=t.componentDidCatch&&(t.componentDidCatch(n,i||{}),r=t.__d),r)return t.__E=t}catch(l){n=l;}throw n}},u$1=0,d$1.prototype.setState=function(n,l){var u;u=null!=this.__s&&this.__s!==this.state?this.__s:this.__s=s$1({},this.state),\"function\"==typeof n&&(n=n(s$1({},u),this.props)),n&&s$1(u,n),null!=n&&this.__v&&(l&&this._sb.push(l),b$1(this));},d$1.prototype.forceUpdate=function(n){this.__v&&(this.__e=!0,n&&this.__h.push(n),b$1(this));},d$1.prototype.render=p$1,t$2=[],g$1.__r=0;\n\n  var n=function(t,s,r,e){var u;s[0]=0;for(var h=1;h<s.length;h++){var p=s[h++],a=s[h]?(s[0]|=p?1:2,r[s[h++]]):s[++h];3===p?e[0]=a:4===p?e[1]=Object.assign(e[1]||{},a):5===p?(e[1]=e[1]||{})[s[++h]]=a:6===p?e[1][s[++h]]+=a+\"\":p?(u=t.apply(a,n(t,a,r,[\"\",null])),e.push(u),a[0]?s[0]|=2:(s[h-2]=0,s[h]=u)):e.push(a);}return e},t$1=new Map;function e$1(s){var r=t$1.get(this);return r||(r=new Map,t$1.set(this,r)),(r=n(this,r.get(s)||(r.set(s,r=function(n){for(var t,s,r=1,e=\"\",u=\"\",h=[0],p=function(n){1===r&&(n||(e=e.replace(/^\\s*\\n\\s*|\\s*\\n\\s*$/g,\"\")))?h.push(0,n,e):3===r&&(n||e)?(h.push(3,n,e),r=2):2===r&&\"...\"===e&&n?h.push(4,n,0):2===r&&e&&!n?h.push(5,0,!0,e):r>=5&&((e||!n&&5===r)&&(h.push(r,0,e,s),r=6),n&&(h.push(r,n,0,s),r=6)),e=\"\";},a=0;a<n.length;a++){a&&(1===r&&p(),p(a));for(var l=0;l<n[a].length;l++)t=n[a][l],1===r?\"<\"===t?(p(),h=[h],r=3):e+=t:4===r?\"--\"===e&&\">\"===t?(r=1,e=\"\"):e=t+e[0]:u?t===u?u=\"\":e+=t:'\"'===t||\"'\"===t?u=t:\">\"===t?(p(),r=1):r&&(\"=\"===t?(r=5,s=e,e=\"\"):\"/\"===t&&(r<5||\">\"===n[a][l+1])?(p(),3===r&&(h=h[0]),r=h,(h=h[0]).push(2,0,r),r=0):\" \"===t||\"\\t\"===t||\"\\n\"===t||\"\\r\"===t?(p(),r=2):e+=t),3===r&&\"!--\"===e&&(r=4,h=h[0]);}return p(),h}(s)),r),arguments,[])).length>1?r:r[0]}\n\n  var m$1=e$1.bind(h$1);\n\n  var t,r$1,u,i,o=0,f=[],c=[],e=l$1.__b,a=l$1.__r,v=l$1.diffed,l=l$1.__c,m=l$1.unmount;function d(t,u){l$1.__h&&l$1.__h(r$1,t,o||u),o=0;var i=r$1.__H||(r$1.__H={__:[],__h:[]});return t>=i.__.length&&i.__.push({__V:c}),i.__[t]}function p(n){return o=1,y(B,n)}function y(n,u,i){var o=d(t++,2);if(o.t=n,!o.__c&&(o.__=[i?i(u):B(void 0,u),function(n){var t=o.__N?o.__N[0]:o.__[0],r=o.t(t,n);t!==r&&(o.__N=[r,o.__[1]],o.__c.setState({}));}],o.__c=r$1,!r$1.u)){r$1.u=!0;var f=r$1.shouldComponentUpdate;r$1.shouldComponentUpdate=function(n,t,r){if(!o.__c.__H)return !0;var u=o.__c.__H.__.filter(function(n){return n.__c});if(u.every(function(n){return !n.__N}))return !f||f.call(this,n,t,r);var i=!1;return u.forEach(function(n){if(n.__N){var t=n.__[0];n.__=n.__N,n.__N=void 0,t!==n.__[0]&&(i=!0);}}),!(!i&&o.__c.props===n)&&(!f||f.call(this,n,t,r))};}return o.__N||o.__}function h(u,i){var o=d(t++,3);!l$1.__s&&z(o.__H,i)&&(o.__=u,o.i=i,r$1.__H.__h.push(o));}function s(u,i){var o=d(t++,4);!l$1.__s&&z(o.__H,i)&&(o.__=u,o.i=i,r$1.__h.push(o));}function _(n){return o=5,F(function(){return {current:n}},[])}function F(n,r){var u=d(t++,7);return z(u.__H,r)?(u.__V=n(),u.i=r,u.__h=n,u.__V):u.__}function T(n,t){return o=8,F(function(){return n},t)}function b(){for(var t;t=f.shift();)if(t.__P&&t.__H)try{t.__H.__h.forEach(k),t.__H.__h.forEach(w),t.__H.__h=[];}catch(r){t.__H.__h=[],l$1.__e(r,t.__v);}}l$1.__b=function(n){r$1=null,e&&e(n);},l$1.__r=function(n){a&&a(n),t=0;var i=(r$1=n.__c).__H;i&&(u===r$1?(i.__h=[],r$1.__h=[],i.__.forEach(function(n){n.__N&&(n.__=n.__N),n.__V=c,n.__N=n.i=void 0;})):(i.__h.forEach(k),i.__h.forEach(w),i.__h=[])),u=r$1;},l$1.diffed=function(t){v&&v(t);var o=t.__c;o&&o.__H&&(o.__H.__h.length&&(1!==f.push(o)&&i===l$1.requestAnimationFrame||((i=l$1.requestAnimationFrame)||j)(b)),o.__H.__.forEach(function(n){n.i&&(n.__H=n.i),n.__V!==c&&(n.__=n.__V),n.i=void 0,n.__V=c;})),u=r$1=null;},l$1.__c=function(t,r){r.some(function(t){try{t.__h.forEach(k),t.__h=t.__h.filter(function(n){return !n.__||w(n)});}catch(u){r.some(function(n){n.__h&&(n.__h=[]);}),r=[],l$1.__e(u,t.__v);}}),l&&l(t,r);},l$1.unmount=function(t){m&&m(t);var r,u=t.__c;u&&u.__H&&(u.__H.__.forEach(function(n){try{k(n);}catch(n){r=n;}}),u.__H=void 0,r&&l$1.__e(r,u.__v));};var g=\"function\"==typeof requestAnimationFrame;function j(n){var t,r=function(){clearTimeout(u),g&&cancelAnimationFrame(t),setTimeout(n);},u=setTimeout(r,100);g&&(t=requestAnimationFrame(r));}function k(n){var t=r$1,u=n.__c;\"function\"==typeof u&&(n.__c=void 0,u()),r$1=t;}function w(n){var t=r$1;n.__c=n.__(),r$1=t;}function z(n,t){return !n||n.length!==t.length||t.some(function(t,r){return t!==n[r]})}function B(n,t){return \"function\"==typeof t?t(n):t}\n\n  function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e))for(t=0;t<e.length;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f);else for(t in e)e[t]&&(n&&(n+=\" \"),n+=t);return n}function clsx(){for(var e,t,f=0,n=\"\";f<arguments.length;)(e=arguments[f++])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}\n\n  /**\n   * @typedef {import('./PopupMenuProvider').PopupMenuEntry} PopupMenuEntry\n   */\n\n  /**\n   * Component that renders a popup menu entry.\n   *\n   * @param {Object} props\n   * @param {string} props.key\n   * @param {PopupMenuEntry} props.entry\n   * @param {boolean} props.selected\n   * @param {(event: MouseEvent) => void} props.onMouseEnter\n   * @param {(event: MouseEvent) => void} props.onMouseLeave\n   * @param {(event: MouseEvent, entry?: PopupMenuEntry, action?: string) => void} props.onAction\n   */\n  function PopupMenuItem(props) {\n    const {\n      entry,\n      selected,\n      onMouseEnter,\n      onMouseLeave,\n      onAction\n    } = props;\n\n    return m$1`\n    <li\n      class=${ clsx('entry', { selected }) }\n      data-id=${ entry.id }\n      title=${ entry.title || entry.label }\n      onClick=${ onAction }\n      onMouseEnter=${ onMouseEnter }\n      onMouseLeave=${ onMouseLeave }\n      onDragStart=${ (event) => onAction(event, entry, 'dragstart') }\n      draggable=${ true }\n    >\n      <div class=\"djs-popup-entry-content\">\n        <span\n          class=${ clsx('djs-popup-entry-name', entry.className) }\n        >\n          ${(entry.imageUrl && m$1`<img class=\"djs-popup-entry-icon\" src=${ entry.imageUrl } alt=\"\" />`) ||\n            (entry.imageHtml && m$1`<div class=\"djs-popup-entry-icon\" dangerouslySetInnerHTML=${ { __html: entry.imageHtml } } />`)}\n\n          ${ entry.label ? m$1`\n            <span class=\"djs-popup-label\">\n              ${ entry.label }\n            </span>\n          ` : null }\n        </span>\n        ${ entry.description && m$1`\n          <span\n            class=\"djs-popup-entry-description\"\n            title=${ entry.description }\n          >\n            ${ entry.description }\n          </span>\n        ` }\n      </div>\n      ${ entry.documentationRef && m$1`\n        <div class=\"djs-popup-entry-docs\">\n          <a\n            href=\"${ entry.documentationRef }\"\n            onClick=${ (event) => event.stopPropagation() }\n            title=\"Open element documentation\"\n            target=\"_blank\"\n            rel=\"noopener\"\n          >\n            <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n              <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M10.6368 10.6375V5.91761H11.9995V10.6382C11.9995 10.9973 11.8623 11.3141 11.5878 11.5885C11.3134 11.863 10.9966 12.0002 10.6375 12.0002H1.36266C0.982345 12.0002 0.660159 11.8681 0.396102 11.6041C0.132044 11.34 1.52588e-05 11.0178 1.52588e-05 10.6375V1.36267C1.52588e-05 0.98236 0.132044 0.660173 0.396102 0.396116C0.660159 0.132058 0.982345 2.95639e-05 1.36266 2.95639e-05H5.91624V1.36267H1.36266V10.6375H10.6368ZM12 0H7.2794L7.27873 1.36197H9.68701L3.06507 7.98391L4.01541 8.93425L10.6373 2.31231V4.72059H12V0Z\" fill=\"#818798\"/>\n            </svg>\n          </a>\n        </div>\n      ` }\n    </li>\n  `;\n  }\n\n  /**\n   * @typedef {import('./PopupMenuProvider').PopupMenuEntry} PopupMenuEntry\n   */\n\n  /**\n   * Component that renders a popup menu entry list.\n   *\n   * @param {Object} props\n   * @param {PopupMenuEntry[]} props.entries\n   * @param {PopupMenuEntry} props.selectedEntry\n   * @param {(entry: PopupMenuEntry | null) => void} props.setSelectedEntry\n   */\n  function PopupMenuList(props) {\n    const {\n      selectedEntry,\n      setSelectedEntry,\n      entries,\n      ...restProps\n    } = props;\n\n    const resultsRef = _();\n\n    const groups = F(() => groupEntries(entries), [ entries ]);\n\n    // scroll to selected result\n    s(() => {\n      const containerEl = resultsRef.current;\n\n      if (!containerEl)\n        return;\n\n      const selectedEl = containerEl.querySelector('.selected');\n\n      if (selectedEl) {\n        scrollIntoView(selectedEl);\n      }\n    }, [ selectedEntry ]);\n\n    return m$1`\n    <div class=\"djs-popup-results\" ref=${ resultsRef }>\n      ${ groups.map(group => m$1`\n        ${ group.name && m$1`\n          <div key=${ group.id } class=\"entry-header\" title=${ group.name }>\n            ${ group.name }\n          </div>\n        ` }\n        <ul class=\"djs-popup-group\" data-group=${ group.id }>\n          ${ group.entries.map(entry => m$1`\n            <${PopupMenuItem}\n              key=${ entry.id }\n              entry=${ entry }\n              selected=${ entry === selectedEntry }\n              onMouseEnter=${ () => setSelectedEntry(entry) }\n              onMouseLeave=${ () => setSelectedEntry(null) }\n              ...${ restProps }\n            />\n          `) }\n        </ul>\n      `) }\n    </div>\n  `;\n  }\n\n\n  // helpers\n  function groupEntries(entries) {\n    const groups = [];\n\n    const getGroup = group => groups.find(elem => group.id === elem.id);\n\n    const containsGroup = group => !!getGroup(group);\n\n    // legacy support for provider built for the old popUp menu\n    const formatGroup = group =>\n      typeof group === 'string' ? { id: group } : group;\n\n    entries.forEach(entry => {\n\n      // assume a default group when none is provided\n      const group = entry.group ? formatGroup(entry.group) : { id: 'default' };\n\n      if (!containsGroup(group)) {\n        groups.push({ ...group, entries: [ entry ] });\n      } else {\n        getGroup(group).entries.push(entry);\n      }\n    });\n\n    return groups;\n  }\n\n  // helpers ////////////////\n\n  function scrollIntoView(el) {\n    if (typeof el.scrollIntoViewIfNeeded === 'function') {\n      el.scrollIntoViewIfNeeded();\n    } else {\n      el.scrollIntoView({\n        scrollMode: 'if-needed',\n        block: 'nearest'\n      });\n    }\n  }\n\n  /**\n   * @typedef {import('./PopupMenuProvider').PopupMenuEntry} PopupMenuEntry\n   * @typedef {import('./PopupMenuProvider').PopupMenuHeaderEntry} PopupMenuHeaderEntry\n   *\n   * @typedef {import('../../util/Types').Point} Point\n   */\n\n  /**\n   * A component that renders the popup menus.\n   *\n   * @param {Object} props\n   * @param {() => void} props.onClose\n   * @param {(element: HTMLElement) => Point} props.position\n   * @param {string} props.className\n   * @param {PopupMenuEntry[]} props.entries\n   * @param {PopupMenuHeaderEntry[]} props.headerEntries\n   * @param {number} props.scale\n   * @param {string} [props.title]\n   * @param {boolean} [props.search]\n   * @param {number} [props.width]\n   */\n  function PopupMenuComponent(props) {\n    const {\n      onClose,\n      onSelect,\n      className,\n      headerEntries,\n      position,\n      title,\n      width,\n      scale,\n      search,\n      entries: originalEntries,\n      onOpened,\n      onClosed\n    } = props;\n\n    const searchable = F(() => {\n      if (!isDefined(search)) {\n        return false;\n      }\n\n      return originalEntries.length > 5;\n    }, [ search, originalEntries ]);\n\n    const inputRef = _();\n\n    const [ value, setValue ] = p('');\n\n    const filterEntries = T((originalEntries, value) => {\n\n      if (!searchable) {\n        return originalEntries;\n      }\n\n      const filter = entry => {\n        if (!value) {\n          return (entry.rank || 0) >= 0;\n        }\n\n        const search = [\n          entry.description || '',\n          entry.label || '',\n          entry.search || ''\n        ]\n          .join('---')\n          .toLowerCase();\n\n        return value\n          .toLowerCase()\n          .split(/\\s/g)\n          .every(term => search.includes(term));\n      };\n\n      return originalEntries.filter(filter);\n    }, [ searchable ]);\n\n    const [ entries, setEntries ] = p(filterEntries(originalEntries, value));\n    const [ selectedEntry, setSelectedEntry ] = p(entries[0]);\n\n    const updateEntries = T((newEntries) => {\n\n      // select first entry if non is selected\n      if (!selectedEntry || !newEntries.includes(selectedEntry)) {\n        setSelectedEntry(newEntries[0]);\n      }\n\n      setEntries(newEntries);\n    }, [ selectedEntry, setEntries, setSelectedEntry ]);\n\n    // filter entries on value change\n    h(() => {\n      updateEntries(filterEntries(originalEntries, value));\n    }, [ value, originalEntries ]);\n\n    // register global <Escape> handler\n    h(() => {\n      const handleKeyDown = event => {\n        if (event.key === 'Escape') {\n          event.preventDefault();\n\n          return onClose();\n        }\n      };\n\n      document.documentElement.addEventListener('keydown', handleKeyDown);\n\n      return () => {\n        document.documentElement.removeEventListener('keydown', handleKeyDown);\n      };\n    }, []);\n\n    // focus input on initial mount\n    s(() => {\n      inputRef.current && inputRef.current.focus();\n    }, []);\n\n    // handle keyboard seleciton\n    const keyboardSelect = T(direction => {\n      const idx = entries.indexOf(selectedEntry);\n\n      let nextIdx = idx + direction;\n\n      if (nextIdx < 0) {\n        nextIdx = entries.length - 1;\n      }\n\n      if (nextIdx >= entries.length) {\n        nextIdx = 0;\n      }\n\n      setSelectedEntry(entries[nextIdx]);\n    }, [ entries, selectedEntry, setSelectedEntry ]);\n\n    const handleKeyDown = T(event => {\n      if (event.key === 'Enter' && selectedEntry) {\n        return onSelect(event, selectedEntry);\n      }\n\n      // ARROW_UP or SHIFT + TAB navigation\n      if (event.key === 'ArrowUp' || (event.key === 'Tab' && event.shiftKey)) {\n        keyboardSelect(-1);\n\n        return event.preventDefault();\n      }\n\n      // ARROW_DOWN or TAB navigation\n      if (event.key === 'ArrowDown' || event.key === 'Tab') {\n        keyboardSelect(1);\n\n        return event.preventDefault();\n      }\n    }, [ onSelect, onClose, selectedEntry, keyboardSelect ]);\n\n    const handleKey = T(event => {\n      if (matches(event.target, 'input')) {\n        setValue(() => event.target.value);\n      }\n    }, [ setValue ]);\n\n    h(() => {\n      onOpened();\n\n      return () => {\n        onClosed();\n      };\n    }, []);\n\n    const displayHeader = F(() => title || headerEntries.length > 0, [ title, headerEntries ]);\n\n    return m$1`\n    <${PopupMenuWrapper}\n      onClose=${ onClose }\n      onKeyup=${ handleKey }\n      onKeydown=${ handleKeyDown }\n      className=${ className }\n      position=${position}\n      width=${ width }\n      scale=${ scale }\n    >\n      ${ displayHeader && m$1`\n        <div class=\"djs-popup-header\">\n          <h3 class=\"djs-popup-title\" title=${ title }>${ title }</h3>\n          ${ headerEntries.map(entry => m$1`\n            <span\n              class=${ getHeaderClasses(entry, entry === selectedEntry) }\n              onClick=${ event => onSelect(event, entry) }\n              title=${ entry.title || entry.label }\n              data-id=${ entry.id }\n              onMouseEnter=${ () => setSelectedEntry(entry) }\n              onMouseLeave=${ () => setSelectedEntry(null) }\n            >\n              ${ entry.imageUrl ? m$1`\n                <img class=\"djs-popup-entry-icon\" src=${ entry.imageUrl } alt=\"\" />\n              ` : null }\n\n              ${ entry.label ? m$1`\n                <span class=\"djs-popup-label\">${ entry.label }</span>\n              ` : null }\n            </span>\n          `) }\n        </div>\n      ` }\n      ${ originalEntries.length > 0 && m$1`\n        <div class=\"djs-popup-body\">\n\n          ${ searchable && m$1`\n          <div class=\"djs-popup-search\">\n            <svg class=\"djs-popup-search-icon\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n              <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M9.0325 8.5H9.625L13.3675 12.25L12.25 13.3675L8.5 9.625V9.0325L8.2975 8.8225C7.4425 9.5575 6.3325 10 5.125 10C2.4325 10 0.25 7.8175 0.25 5.125C0.25 2.4325 2.4325 0.25 5.125 0.25C7.8175 0.25 10 2.4325 10 5.125C10 6.3325 9.5575 7.4425 8.8225 8.2975L9.0325 8.5ZM1.75 5.125C1.75 6.9925 3.2575 8.5 5.125 8.5C6.9925 8.5 8.5 6.9925 8.5 5.125C8.5 3.2575 6.9925 1.75 5.125 1.75C3.2575 1.75 1.75 3.2575 1.75 5.125Z\" fill=\"#22242A\"/>\n            </svg>\n            <input\n                ref=${ inputRef }\n                type=\"text\"\n              />\n          </div>\n          ` }\n\n          <${PopupMenuList}\n            entries=${ entries }\n            selectedEntry=${ selectedEntry }\n            setSelectedEntry=${ setSelectedEntry }\n            onAction=${ onSelect }\n          />\n        </div>\n        ${ entries.length === 0 && m$1`\n          <div class=\"djs-popup-no-results\">No matching entries found.</div>\n        ` }\n      ` }\n    </${PopupMenuWrapper}>\n  `;\n  }\n\n  /**\n   * A component that wraps the popup menu.\n   *\n   * @param {*} props\n   */\n  function PopupMenuWrapper(props) {\n    const {\n      onClose,\n      onKeydown,\n      onKeyup,\n      className,\n      children,\n      position: positionGetter\n    } = props;\n\n    const popupRef = _();\n\n    const checkClose = T((event) => {\n\n      const popup = closest(event.target, '.djs-popup', true);\n\n      if (popup) {\n        return;\n      }\n\n      onClose();\n    }, [ onClose ]);\n\n    s(() => {\n      if (typeof positionGetter !== 'function') {\n        return;\n      }\n\n      const popupEl = popupRef.current;\n      const position = positionGetter(popupEl);\n\n      popupEl.style.left = `${position.x}px`;\n      popupEl.style.top = `${position.y}px`;\n    }, [ popupRef.current, positionGetter ]);\n\n    // focus popup initially, on mount\n    s(() => {\n      popupRef.current && popupRef.current.focus();\n    }, []);\n\n    return m$1`\n    <div\n      class=\"djs-popup-backdrop\"\n      onClick=${ checkClose }\n    >\n      <div\n        class=${ clsx('djs-popup', className) }\n        style=${ getPopupStyle(props) }\n        onKeydown=${ onKeydown }\n        onKeyup=${ onKeyup }\n        ref=${ popupRef }\n        tabIndex=\"-1\"\n      >\n        ${children}\n      </div>\n    </div>\n  `;\n  }\n\n  // helpers //////////////////////\n\n  function getPopupStyle(props) {\n    return {\n      transform: `scale(${props.scale})`,\n      width: `${props.width}px`\n    };\n  }\n\n  function getHeaderClasses(entry, selected) {\n    return clsx(\n      'entry',\n      entry.className,\n      entry.active ? 'active' : '',\n      entry.disabled ? 'disabled' : '',\n      selected ? 'selected' : ''\n    );\n  }\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   *\n   * @typedef {import('../../util/Types').Point} Point\n   *\n   * @typedef {import('./PopupMenuProvider').PopupMenuEntries} PopupMenuEntries\n   * @typedef {import('./PopupMenuProvider').PopupMenuEntry} PopupMenuEntry\n   * @typedef {import('./PopupMenuProvider').PopupMenuHeaderEntries} PopupMenuHeaderEntries\n   * @typedef {import('./PopupMenuProvider').PopupMenuHeaderEntry} PopupMenuHeaderEntry\n   * @typedef {import('./PopupMenuProvider').default} PopupMenuProvider\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef { {\n   *   scale?: {\n   *     min?: number;\n   *     max?: number;\n   *   } | boolean;\n   * } } PopupMenuConfig\n   *\n   * @typedef {Element|Element[]} PopupMenuTarget;\n   */\n\n  var DATA_REF = 'data-id';\n\n  var CLOSE_EVENTS = [\n    'contextPad.close',\n    'canvas.viewbox.changing',\n    'commandStack.changed'\n  ];\n\n  var DEFAULT_PRIORITY$1 = 1000;\n\n  /**\n   * A popup menu to show a number of actions on the canvas.\n   *\n   * @param {PopupMenuConfig} config\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   */\n  function PopupMenu(config, eventBus, canvas) {\n    this._eventBus = eventBus;\n    this._canvas = canvas;\n\n    this._current = null;\n\n    var scale = isDefined(config && config.scale) ? config.scale : {\n      min: 1,\n      max: 1.5\n    };\n\n    this._config = {\n      scale: scale\n    };\n\n\n    eventBus.on('diagram.destroy', () => {\n      this.close();\n    });\n\n    eventBus.on('element.changed', event => {\n\n      const element = this.isOpen() && this._current.target;\n\n      if (event.element === element) {\n        this._render();\n      }\n    });\n\n  }\n\n  PopupMenu.$inject = [\n    'config.popupMenu',\n    'eventBus',\n    'canvas'\n  ];\n\n  PopupMenu.prototype._render = function() {\n\n    const {\n      position: _position,\n      className,\n      entries,\n      headerEntries,\n      options\n    } = this._current;\n\n    const entriesArray = Object.entries(entries).map(\n      ([ key, value ]) => ({ id: key, ...value })\n    );\n\n    const headerEntriesArray = Object.entries(headerEntries).map(\n      ([ key, value ]) => ({ id: key, ...value })\n    );\n\n    const position = _position && (\n      (container) => this._ensureVisible(container, _position)\n    );\n\n    const scale = this._updateScale(this._current.container);\n\n    const onClose = result => this.close(result);\n    const onSelect = (event, entry, action) => this.trigger(event, entry, action);\n\n    P(\n      m$1`\n      <${PopupMenuComponent}\n        onClose=${ onClose }\n        onSelect=${ onSelect }\n        position=${ position }\n        className=${ className }\n        entries=${ entriesArray }\n        headerEntries=${ headerEntriesArray }\n        scale=${ scale }\n        onOpened=${ this._onOpened.bind(this) }\n        onClosed=${ this._onClosed.bind(this) }\n        ...${{ ...options }}\n      />\n    `,\n      this._current.container\n    );\n  };\n\n\n  /**\n   * Open the popup menu at the given position.\n   *\n   * @param {PopupMenuTarget} target\n   * @param {string} providerId\n   * @param {Point} position\n   * @param {Object} [options]\n   */\n  PopupMenu.prototype.open = function(target, providerId, position, options) {\n    if (!target) {\n      throw new Error('target is missing');\n    }\n\n    if (!providerId) {\n      throw new Error('providers for <' + providerId + '> not found');\n    }\n\n    if (!position) {\n      throw new Error('position is missing');\n    }\n\n    if (this.isOpen()) {\n      this.close();\n    }\n\n    const {\n      entries,\n      headerEntries\n    } = this._getContext(target, providerId);\n\n    this._current = {\n      position,\n      className: providerId,\n      target,\n      entries,\n      headerEntries,\n      container: this._createContainer({ provider: providerId }),\n      options\n    };\n\n    this._emit('open');\n\n    this._bindAutoClose();\n\n    this._render();\n  };\n\n\n  PopupMenu.prototype._getContext = function(target, provider) {\n\n    const providers = this._getProviders(provider);\n\n    if (!providers || !providers.length) {\n      throw new Error('provider for <' + provider + '> not found');\n    }\n\n    const entries = this._getEntries(target, providers);\n\n    const headerEntries = this._getHeaderEntries(target, providers);\n\n    return {\n      entries,\n      headerEntries,\n      empty: !(\n        Object.keys(entries).length ||\n            Object.keys(headerEntries).length\n      )\n    };\n  };\n\n  PopupMenu.prototype.close = function() {\n\n    if (!this.isOpen()) {\n      return;\n    }\n\n    this._emit('close');\n\n    this.reset();\n\n    this._current = null;\n  };\n\n  PopupMenu.prototype.reset = function() {\n    const container = this._current.container;\n\n    P(null, container);\n\n    remove$2(container);\n  };\n\n  PopupMenu.prototype._emit = function(event, payload) {\n    this._eventBus.fire(`popupMenu.${ event }`, payload);\n  };\n\n  PopupMenu.prototype._onOpened = function() {\n    this._emit('opened');\n  };\n\n  PopupMenu.prototype._onClosed = function() {\n    this._emit('closed');\n  };\n\n  PopupMenu.prototype._createContainer = function(config) {\n\n    var canvas = this._canvas,\n        parent = canvas.getContainer();\n\n    const container = domify$1(`<div class=\"djs-popup-parent djs-scrollable\" data-popup=${config.provider}></div>`);\n\n    parent.appendChild(container);\n\n    return container;\n  };\n\n  /**\n   * Set up listener to close popup automatically on certain events.\n   */\n  PopupMenu.prototype._bindAutoClose = function() {\n    this._eventBus.once(CLOSE_EVENTS, this.close, this);\n  };\n\n\n  /**\n   * Remove the auto-closing listener.\n  */\n  PopupMenu.prototype._unbindAutoClose = function() {\n    this._eventBus.off(CLOSE_EVENTS, this.close, this);\n  };\n\n\n  /**\n   * Updates popup style.transform with respect to the config and zoom level.\n   *\n   * @return {number}\n   */\n  PopupMenu.prototype._updateScale = function() {\n    var zoom = this._canvas.zoom();\n\n    var scaleConfig = this._config.scale,\n        minScale,\n        maxScale,\n        scale = zoom;\n\n    if (scaleConfig !== true) {\n\n      if (scaleConfig === false) {\n        minScale = 1;\n        maxScale = 1;\n      } else {\n        minScale = scaleConfig.min;\n        maxScale = scaleConfig.max;\n      }\n\n      if (isDefined(minScale) && zoom < minScale) {\n        scale = minScale;\n      }\n\n      if (isDefined(maxScale) && zoom > maxScale) {\n        scale = maxScale;\n      }\n\n    }\n\n    return scale;\n  };\n\n  PopupMenu.prototype._ensureVisible = function(container, position) {\n    var documentBounds = document.documentElement.getBoundingClientRect();\n    var containerBounds = container.getBoundingClientRect();\n\n    var overAxis = {},\n        left = position.x,\n        top = position.y;\n\n    if (position.x + containerBounds.width > documentBounds.width) {\n      overAxis.x = true;\n    }\n\n    if (position.y + containerBounds.height > documentBounds.height) {\n      overAxis.y = true;\n    }\n\n    if (overAxis.x && overAxis.y) {\n      left = position.x - containerBounds.width;\n      top = position.y - containerBounds.height;\n    } else if (overAxis.x) {\n      left = position.x - containerBounds.width;\n      top = position.y;\n    } else if (overAxis.y && position.y < containerBounds.height) {\n      left = position.x;\n      top = 10;\n    } else if (overAxis.y) {\n      left = position.x;\n      top = position.y - containerBounds.height;\n    }\n\n    return {\n      x: left,\n      y: top\n    };\n  };\n\n  /**\n   * Check whether there are no popup menu providers or provided entries for the\n   * given target.\n   *\n   * @param {PopupMenuTarget} target\n   * @param {string} providerId\n   *\n   * @return {boolean}\n   */\n  PopupMenu.prototype.isEmpty = function(target, providerId) {\n    if (!target) {\n      throw new Error('target is missing');\n    }\n\n    if (!providerId) {\n      throw new Error('provider ID is missing');\n    }\n\n    const providers = this._getProviders(providerId);\n\n    if (!providers || !providers.length) {\n      return true;\n    }\n\n    return this._getContext(target, providerId).empty;\n  };\n\n  /**\n   * @overlord\n   *\n   * Register a popup menu provider with default priority. See\n   * {@link PopupMenuProvider} for examples.\n   *\n   * @param {string} id\n   * @param {PopupMenuProvider} provider\n   */\n\n  /**\n   * Register a popup menu provider with the given priority. See\n   * {@link PopupMenuProvider} for examples.\n   *\n   * @param {string} id\n   * @param {number} priority\n   * @param {PopupMenuProvider} provider\n   */\n  PopupMenu.prototype.registerProvider = function(id, priority, provider) {\n    if (!provider) {\n      provider = priority;\n      priority = DEFAULT_PRIORITY$1;\n    }\n\n    this._eventBus.on('popupMenu.getProviders.' + id, priority, function(event) {\n      event.providers.push(provider);\n    });\n  };\n\n  /**\n   * @param {string} id\n   *\n   * @return {PopupMenuProvider[]}\n   */\n  PopupMenu.prototype._getProviders = function(id) {\n    var event = this._eventBus.createEvent({\n      type: 'popupMenu.getProviders.' + id,\n      providers: []\n    });\n\n    this._eventBus.fire(event);\n\n    return event.providers;\n  };\n\n  /**\n   * @param {PopupMenuTarget} target\n   * @param {PopupMenuProvider[]} providers\n   *\n   * @return {PopupMenuEntries}\n   */\n  PopupMenu.prototype._getEntries = function(target, providers) {\n    var entries = {};\n\n    forEach$1(providers, function(provider) {\n\n      // handle legacy method\n      if (!provider.getPopupMenuEntries) {\n        forEach$1(provider.getEntries(target), function(entry) {\n          var id = entry.id;\n\n          if (!id) {\n            throw new Error('entry ID is missing');\n          }\n\n          entries[id] = omit(entry, [ 'id' ]);\n        });\n\n        return;\n      }\n\n      var entriesOrUpdater = provider.getPopupMenuEntries(target);\n\n      if (isFunction(entriesOrUpdater)) {\n        entries = entriesOrUpdater(entries);\n      } else {\n        forEach$1(entriesOrUpdater, function(entry, id) {\n          entries[id] = entry;\n        });\n      }\n    });\n\n    return entries;\n  };\n\n  /**\n   * @param {PopupMenuTarget} target\n   * @param {PopupMenuProvider[]} providers\n   *\n   * @return {PopupMenuHeaderEntries}\n   */\n  PopupMenu.prototype._getHeaderEntries = function(target, providers) {\n    var entries = {};\n\n    forEach$1(providers, function(provider) {\n\n      // handle legacy method\n      if (!provider.getPopupMenuHeaderEntries) {\n        if (!provider.getHeaderEntries) {\n          return;\n        }\n\n        forEach$1(provider.getHeaderEntries(target), function(entry) {\n          var id = entry.id;\n\n          if (!id) {\n            throw new Error('entry ID is missing');\n          }\n\n          entries[id] = omit(entry, [ 'id' ]);\n        });\n\n        return;\n      }\n\n      var entriesOrUpdater = provider.getPopupMenuHeaderEntries(target);\n\n      if (isFunction(entriesOrUpdater)) {\n        entries = entriesOrUpdater(entries);\n      } else {\n        forEach$1(entriesOrUpdater, function(entry, id) {\n          entries[id] = entry;\n        });\n      }\n    });\n\n    return entries;\n  };\n\n\n  /**\n   * Check if the popup menu is open.\n   *\n   * @return {boolean}\n   */\n  PopupMenu.prototype.isOpen = function() {\n    return !!this._current;\n  };\n\n\n  /**\n   * Trigger an action associated with an entry.\n   *\n   * @param {Event} event\n   * @param {PopupMenuEntry} entry\n   * @param {string} [action='click']\n   *\n   * @return {any}\n   */\n  PopupMenu.prototype.trigger = function(event, entry, action = 'click') {\n\n    // silence other actions\n    event.preventDefault();\n\n    if (!entry) {\n      let element = closest(event.delegateTarget || event.target, '.entry', true);\n      let entryId = attr$1(element, DATA_REF);\n\n      entry = { id: entryId, ...this._getEntry(entryId) };\n    }\n\n    const handler = entry.action;\n\n    if (this._emit('trigger', { entry, event }) === false) {\n      return;\n    }\n\n    if (isFunction(handler)) {\n      if (action === 'click') {\n        return handler(event, entry);\n      }\n    } else {\n      if (handler[action]) {\n        return handler[action](event, entry);\n      }\n    }\n  };\n\n  /**\n   * Get the entry (entry or header entry) with the given ID.\n   *\n   * @param {string} entryId\n   *\n   * @return {PopupMenuEntry|PopupMenuHeaderEntry}\n   */\n  PopupMenu.prototype._getEntry = function(entryId) {\n\n    var entry = this._current.entries[ entryId ] || this._current.headerEntries[ entryId ];\n\n\n    if (!entry) {\n      throw new Error('entry not found');\n    }\n\n    return entry;\n  };\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var PopupMenuModule$1 = {\n    __init__: [ 'popupMenu' ],\n    popupMenu: [ 'type', PopupMenu ]\n  };\n\n  /**\n   * To change the icons, modify the SVGs in `./resources`, execute `npx svgo -f resources --datauri enc -o dist`,\n   * and then replace respective icons with the optimized data URIs in `./dist`.\n   */\n  var icons$1 = {\n    align:  `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 2000 2000\">\n              <line x1=\"200\" y1=\"150\" x2=\"200\" y2=\"1850\" style=\"stroke:currentColor;stroke-width:100;stroke-linecap:round;\"/>\n              <rect x=\"500\" y=\"150\" width=\"1300\" height=\"700\" rx=\"1\" style=\"fill:none;stroke:currentColor;stroke-width:100;\"></rect>\n              <rect x=\"500\" y=\"1150\" width=\"700\" height=\"700\" rx=\"1\" style=\"fill:currentColor;stroke:currentColor;stroke-width:100;opacity:.5;\"></rect>\n          </svg>`,\n    bottom: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1800 1800\">\n            <line x1=\"150\" y1=\"1650\" x2=\"1650\" y2=\"1650\" style=\"stroke:currentColor;stroke-width:100;stroke-linecap:round;\"/>\n            <rect x=\"150\" y=\"350\" width=\"600\" height=\"1300\" rx=\"1\" style=\"fill:none;stroke:currentColor;stroke-width:100;\"></rect>\n            <rect x=\"1050\" y=\"850\" width=\"600\" height=\"800\" rx=\"1\" style=\"fill:currentColor;stroke:currentColor;stroke-width:100;opacity:.5;\"></rect>\n          </svg>`,\n    center: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1800 1800\">\n            <line x1=\"900\" y1=\"150\" x2=\"900\" y2=\"1650\" style=\"stroke:currentColor;stroke-width:100;stroke-linecap:round;\"/>\n            <rect x=\"250\" y=\"150\" width=\"1300\" height=\"600\" rx=\"1\" style=\"fill:none;stroke:currentColor;stroke-width:100;\"></rect>\n            <rect x=\"500\" y=\"1050\" width=\"800\" height=\"600\" rx=\"1\" style=\"fill:currentColor;stroke:currentColor;stroke-width:100;opacity:.5;\"></rect>\n          </svg>`,\n    left:   `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1800 1800\">\n            <line x1=\"100\" y1=\"150\" x2=\"100\" y2=\"1650\" style=\"stroke:currentColor;stroke-width:100;stroke-linecap:round;\"/>\n            <rect x=\"100\" y=\"150\" width=\"1300\" height=\"600\" rx=\"1\" style=\"fill:none;stroke:currentColor;stroke-width:100;\"></rect>\n            <rect x=\"100\" y=\"1050\" width=\"800\" height=\"600\" rx=\"1\" style=\"fill:currentColor;stroke:currentColor;stroke-width:100;opacity:.5;\"></rect>\n          </svg>`,\n    right:  `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1800 1800\">\n            <line x1=\"1650\" y1=\"150\" x2=\"1650\" y2=\"1650\" style=\"stroke:currentColor;stroke-width:100;stroke-linecap:round;\"/>\n            <rect x=\"350\" y=\"150\" width=\"1300\" height=\"600\" rx=\"1\" style=\"fill:none;stroke:currentColor;stroke-width:100;\"></rect>\n            <rect x=\"850\" y=\"1050\" width=\"800\" height=\"600\" rx=\"1\" style=\"fill:currentColor;stroke:currentColor;stroke-width:100;opacity:.5;\"></rect>\n          </svg>`,\n    top:    `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1800 1800\">\n            <line x1=\"150\" y1=\"150\" x2=\"1650\" y2=\"150\" style=\"stroke:currentColor;stroke-width:100;stroke-linecap:round;\"/>\n            <rect x=\"150\" y=\"150\" width=\"600\" height=\"1300\" rx=\"1\" style=\"fill:none;stroke:currentColor;stroke-width:100;\"></rect>\n            <rect x=\"1050\" y=\"150\" width=\"600\" height=\"800\" rx=\"1\" style=\"fill:currentColor;stroke:currentColor;stroke-width:100;opacity:.5;\"></rect>\n          </svg>`,\n    middle: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1800 1800\">\n            <line x1=\"150\" y1=\"900\" x2=\"1650\" y2=\"900\" style=\"stroke:currentColor;stroke-width:100;stroke-linecap:round;\"/>\n            <rect x=\"150\" y=\"250\" width=\"600\" height=\"1300\" rx=\"1\" style=\"fill:none;stroke:currentColor;stroke-width:100;\"></rect>\n            <rect x=\"1050\" y=\"500\" width=\"600\" height=\"800\" rx=\"1\" style=\"fill:currentColor;stroke:currentColor;stroke-width:100;opacity:.5;\"></rect>\n          </svg>`\n  };\n\n  var ICONS$1 = icons$1;\n\n  /**\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/features/context-pad/ContextPad').default} ContextPad\n   * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenu').default} PopupMenu\n   * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('diagram-js/lib/features/context-pad/ContextPad').ContextPadEntries} ContextPadEntries\n   * @typedef {import('diagram-js/lib/features/context-pad/ContextPadProvider').default} ContextPadProvider\n   */\n\n  var LOW_PRIORITY$l = 900;\n\n  /**\n   * A provider for the `Align elements` context pad entry.\n   *\n   * @implements {ContextPadProvider}\n   *\n   * @param {ContextPad} contextPad\n   * @param {PopupMenu} popupMenu\n   * @param {Translate} translate\n   * @param {Canvas} canvas\n   */\n  function AlignElementsContextPadProvider(contextPad, popupMenu, translate, canvas) {\n\n    contextPad.registerProvider(LOW_PRIORITY$l, this);\n\n    this._contextPad = contextPad;\n    this._popupMenu = popupMenu;\n    this._translate = translate;\n    this._canvas = canvas;\n  }\n\n  AlignElementsContextPadProvider.$inject = [\n    'contextPad',\n    'popupMenu',\n    'translate',\n    'canvas'\n  ];\n\n  /**\n   * @param {Element[]} elements\n   *\n   * @return {ContextPadEntries}\n   */\n  AlignElementsContextPadProvider.prototype.getMultiElementContextPadEntries = function(elements) {\n    var actions = {};\n\n    if (this._isAllowed(elements)) {\n      assign$1(actions, this._getEntries(elements));\n    }\n\n    return actions;\n  };\n\n  AlignElementsContextPadProvider.prototype._isAllowed = function(elements) {\n    return !this._popupMenu.isEmpty(elements, 'align-elements');\n  };\n\n  AlignElementsContextPadProvider.prototype._getEntries = function() {\n    var self = this;\n\n    return {\n      'align-elements': {\n        group: 'align-elements',\n        title: self._translate('Align elements'),\n        html: `<div class=\"entry\">${ICONS$1['align']}</div>`,\n        action: {\n          click: function(event, target) {\n            var position = self._getMenuPosition(target);\n\n            assign$1(position, {\n              cursor: {\n                x: event.x,\n                y: event.y\n              }\n            });\n\n            self._popupMenu.open(target, 'align-elements', position);\n          }\n        }\n      }\n    };\n  };\n\n  AlignElementsContextPadProvider.prototype._getMenuPosition = function(elements) {\n    var Y_OFFSET = 5;\n\n    var pad = this._contextPad.getPad(elements).html;\n\n    var padRect = pad.getBoundingClientRect();\n\n    var pos = {\n      x: padRect.left,\n      y: padRect.bottom + Y_OFFSET\n    };\n\n    return pos;\n  };\n\n  /**\n   * @typedef {import('diagram-js/lib/features/align-elements/AlignElements').default} AlignElements\n   * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenu').default} PopupMenu\n   * @typedef {import('diagram-js/lib/features/rules/Rules').default} Rules\n   * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n   *\n   * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenu').PopupMenuEntries} PopupMenuEntries\n   * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenuProvider').default} PopupMenuProvider\n   * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenu').PopupMenuTarget} PopupMenuTarget\n   */\n\n  var ALIGNMENT_OPTIONS = [\n    'left',\n    'center',\n    'right',\n    'top',\n    'middle',\n    'bottom'\n  ];\n\n  /**\n   * A provider for the `Align elements` popup menu.\n   *\n   * @implements {PopupMenuProvider}\n   *\n   * @param {PopupMenu} popupMenu\n   * @param {AlignElements} alignElements\n   * @param {Translate} translate\n   * @param {Rules} rules\n   */\n  function AlignElementsMenuProvider(popupMenu, alignElements, translate, rules) {\n\n    this._alignElements = alignElements;\n    this._translate = translate;\n    this._popupMenu = popupMenu;\n    this._rules = rules;\n\n    popupMenu.registerProvider('align-elements', this);\n  }\n\n  AlignElementsMenuProvider.$inject = [\n    'popupMenu',\n    'alignElements',\n    'translate',\n    'rules'\n  ];\n\n  /**\n   * @param {PopupMenuTarget} target\n   *\n   * @return {PopupMenuEntries}\n   */\n  AlignElementsMenuProvider.prototype.getPopupMenuEntries = function(target) {\n    var entries = {};\n\n    if (this._isAllowed(target)) {\n      assign$1(entries, this._getEntries(target));\n    }\n\n    return entries;\n  };\n\n  AlignElementsMenuProvider.prototype._isAllowed = function(target) {\n    return this._rules.allowed('elements.align', { elements: target });\n  };\n\n  /**\n   * @param {PopupMenuTarget} target\n   *\n   * @return {PopupMenuEntries}\n   */\n  AlignElementsMenuProvider.prototype._getEntries = function(target) {\n    var alignElements = this._alignElements,\n        translate = this._translate,\n        popupMenu = this._popupMenu;\n\n    var entries = {};\n\n    forEach$1(ALIGNMENT_OPTIONS, function(alignment) {\n      entries[ 'align-elements-' + alignment ] = {\n        group: 'align',\n        title: translate('Align elements ' + alignment),\n        className: 'bjs-align-elements-menu-entry',\n        imageHtml: ICONS$1[ alignment ],\n        action: function() {\n          alignElements.trigger(target, alignment);\n          popupMenu.close();\n        }\n      };\n    });\n\n    return entries;\n  };\n\n  /**\n   * @typedef {import('../../core/EventBus').default} EventBus\n   */\n\n  /**\n   * A basic provider that may be extended to implement modeling rules.\n   *\n   * Extensions should implement the init method to actually add their custom\n   * modeling checks. Checks may be added via the #addRule(action, fn) method.\n   *\n   * @class\n   *\n   * @param {EventBus} eventBus\n   */\n  function RuleProvider(eventBus) {\n    CommandInterceptor.call(this, eventBus);\n\n    this.init();\n  }\n\n  RuleProvider.$inject = [ 'eventBus' ];\n\n  e$3(RuleProvider, CommandInterceptor);\n\n\n  /**\n   * Adds a modeling rule for the given action, implemented through\n   * a callback function.\n   *\n   * The callback receives a modeling specific action context\n   * to perform its check. It must return `false` to disallow the\n   * action from happening or `true` to allow the action. Usually returing\n   * `null` denotes that a particular interaction shall be ignored.\n   * By returning nothing or `undefined` you pass evaluation to lower\n   * priority rules.\n   *\n   * @example\n   *\n   * ```javascript\n   * ResizableRules.prototype.init = function() {\n   *\n   *   \\/**\n   *    * Return `true`, `false` or nothing to denote\n   *    * _allowed_, _not allowed_ and _continue evaluating_.\n   *    *\\/\n   *   this.addRule('shape.resize', function(context) {\n   *\n   *     var shape = context.shape;\n   *\n   *     if (!context.newBounds) {\n   *       // check general resizability\n   *       if (!shape.resizable) {\n   *         return false;\n   *       }\n   *\n   *       // not returning anything (read: undefined)\n   *       // will continue the evaluation of other rules\n   *       // (with lower priority)\n   *       return;\n   *     } else {\n   *       // element must have minimum size of 10*10 points\n   *       return context.newBounds.width > 10 && context.newBounds.height > 10;\n   *     }\n   *   });\n   * };\n   * ```\n   *\n   * @param {string|string[]} actions the identifier for the modeling action to check\n   * @param {number} [priority] the priority at which this rule is being applied\n   * @param {(any) => any} fn the callback function that performs the actual check\n   */\n  RuleProvider.prototype.addRule = function(actions, priority, fn) {\n\n    var self = this;\n\n    if (typeof actions === 'string') {\n      actions = [ actions ];\n    }\n\n    actions.forEach(function(action) {\n\n      self.canExecute(action, priority, function(context, action, event) {\n        return fn(context);\n      }, true);\n    });\n  };\n\n  /**\n   * Implement this method to add new rules during provider initialization.\n   */\n  RuleProvider.prototype.init = function() {};\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   */\n\n  /**\n   * Rule provider for aligning BPMN elements.\n   *\n   * @param {EventBus} eventBus\n   */\n  function BpmnAlignElements(eventBus) {\n    RuleProvider.call(this, eventBus);\n  }\n\n  BpmnAlignElements.$inject = [ 'eventBus' ];\n\n  e$3(BpmnAlignElements, RuleProvider);\n\n  BpmnAlignElements.prototype.init = function() {\n    this.addRule('elements.align', function(context) {\n      var elements = context.elements;\n\n      // filter out elements which cannot be aligned\n      var filteredElements = filter(elements, function(element) {\n        return !(element.waypoints || element.host || element.labelTarget);\n      });\n\n      // filter out elements which are children of any of the selected elements\n      filteredElements = getParents$1(filteredElements);\n\n      if (filteredElements.length < 2) {\n        return false;\n      }\n\n      return filteredElements;\n    });\n  };\n\n  var AlignElementsModule = {\n    __depends__: [\n      AlignElementsModule$1,\n      ContextPadModule$1,\n      PopupMenuModule$1\n    ],\n    __init__: [\n      'alignElementsContextPadProvider',\n      'alignElementsMenuProvider',\n      'bpmnAlignElements'\n    ],\n    alignElementsContextPadProvider: [ 'type', AlignElementsContextPadProvider ],\n    alignElementsMenuProvider: [ 'type', AlignElementsMenuProvider ],\n    bpmnAlignElements: [ 'type', BpmnAlignElements ]\n  };\n\n  /**\n   * @typedef {import('../../model/Types').Connection} Connection\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Shape} Shape\n   *\n   * @typedef {import('../../util/Types').Point} Point\n   */\n\n  // padding to detect element placement\n  var PLACEMENT_DETECTION_PAD = 10;\n\n  var DEFAULT_DISTANCE = 50;\n\n  var DEFAULT_MAX_DISTANCE = 250;\n\n\n  /**\n   * Get free position starting from given position.\n   *\n   * @param {Shape} source\n   * @param {Shape} element\n   * @param {Point} position\n   * @param {(element: Element, position: Point, connectedAtPosition: Element) => Element} getNextPosition\n   *\n   * @return {Point}\n   */\n  function findFreePosition(source, element, position, getNextPosition) {\n    var connectedAtPosition;\n\n    while ((connectedAtPosition = getConnectedAtPosition(source, position, element))) {\n      position = getNextPosition(element, position, connectedAtPosition);\n    }\n\n    return position;\n  }\n\n  /**\n   * Returns function that returns next position.\n   *\n   * @param {Object} nextPositionDirection\n   * @param {Object} [nextPositionDirection.x]\n   * @param {Object} [nextPositionDirection.y]\n   *\n   * @return {(element: Element, previousPosition: Point, connectedAtPosition: Element) => Point}\n   */\n  function generateGetNextPosition(nextPositionDirection) {\n    return function(element, previousPosition, connectedAtPosition) {\n      var nextPosition = {\n        x: previousPosition.x,\n        y: previousPosition.y\n      };\n\n      [ 'x', 'y' ].forEach(function(axis) {\n\n        var nextPositionDirectionForAxis = nextPositionDirection[ axis ];\n\n        if (!nextPositionDirectionForAxis) {\n          return;\n        }\n\n        var dimension = axis === 'x' ? 'width' : 'height';\n\n        var margin = nextPositionDirectionForAxis.margin,\n            minDistance = nextPositionDirectionForAxis.minDistance;\n\n        if (margin < 0) {\n          nextPosition[ axis ] = Math.min(\n            connectedAtPosition[ axis ] + margin - element[ dimension ] / 2,\n            previousPosition[ axis ] - minDistance + margin\n          );\n        } else {\n          nextPosition[ axis ] = Math.max(\n            connectedAtPosition[ axis ] + connectedAtPosition[ dimension ] + margin + element[ dimension ] / 2,\n            previousPosition[ axis ] + minDistance + margin\n          );\n        }\n      });\n\n      return nextPosition;\n    };\n  }\n\n  /**\n   * Return target at given position, if defined.\n   *\n   * This takes connected elements from host and attachers\n   * into account, too.\n   */\n  function getConnectedAtPosition(source, position, element) {\n\n    var bounds = {\n      x: position.x - (element.width / 2),\n      y: position.y - (element.height / 2),\n      width: element.width,\n      height: element.height\n    };\n\n    var closure = getAutoPlaceClosure(source);\n\n    return find(closure, function(target) {\n\n      if (target === element) {\n        return false;\n      }\n\n      var orientation = getOrientation(target, bounds, PLACEMENT_DETECTION_PAD);\n\n      return orientation === 'intersect';\n    });\n  }\n\n  /**\n  * Compute optimal distance between source and target based on existing connections to and from source.\n  * Assumes left-to-right and top-to-down modeling.\n  *\n  * @param {Shape} source\n  * @param {Object} [hints]\n  * @param {number} [hints.defaultDistance]\n  * @param {string} [hints.direction]\n  * @param {(connection: Connection) => boolean} [hints.filter]\n  * @param {(connection: Connection) => number} [hints.getWeight]\n  * @param {number} [hints.maxDistance]\n  * @param {string} [hints.reference]\n  *\n  * @return {number}\n  */\n  function getConnectedDistance(source, hints) {\n    if (!hints) {\n      hints = {};\n    }\n\n    // targets > sources by default\n    function getDefaultWeight(connection) {\n      return connection.source === source ? 1 : -1;\n    }\n\n    var defaultDistance = hints.defaultDistance || DEFAULT_DISTANCE,\n        direction = hints.direction || 'e',\n        filter = hints.filter,\n        getWeight = hints.getWeight || getDefaultWeight,\n        maxDistance = hints.maxDistance || DEFAULT_MAX_DISTANCE,\n        reference = hints.reference || 'start';\n\n    if (!filter) {\n      filter = noneFilter;\n    }\n\n    function getDistance(a, b) {\n      if (direction === 'n') {\n        if (reference === 'start') {\n          return asTRBL(a).top - asTRBL(b).bottom;\n        } else if (reference === 'center') {\n          return asTRBL(a).top - getMid(b).y;\n        } else {\n          return asTRBL(a).top - asTRBL(b).top;\n        }\n      } else if (direction === 'w') {\n        if (reference === 'start') {\n          return asTRBL(a).left - asTRBL(b).right;\n        } else if (reference === 'center') {\n          return asTRBL(a).left - getMid(b).x;\n        } else {\n          return asTRBL(a).left - asTRBL(b).left;\n        }\n      } else if (direction === 's') {\n        if (reference === 'start') {\n          return asTRBL(b).top - asTRBL(a).bottom;\n        } else if (reference === 'center') {\n          return getMid(b).y - asTRBL(a).bottom;\n        } else {\n          return asTRBL(b).bottom - asTRBL(a).bottom;\n        }\n      } else {\n        if (reference === 'start') {\n          return asTRBL(b).left - asTRBL(a).right;\n        } else if (reference === 'center') {\n          return getMid(b).x - asTRBL(a).right;\n        } else {\n          return asTRBL(b).right - asTRBL(a).right;\n        }\n      }\n    }\n\n    var sourcesDistances = source.incoming\n      .filter(filter)\n      .map(function(connection) {\n        var weight = getWeight(connection);\n\n        var distance = weight < 0\n          ? getDistance(connection.source, source)\n          : getDistance(source, connection.source);\n\n        return {\n          id: connection.source.id,\n          distance: distance,\n          weight: weight\n        };\n      });\n\n    var targetsDistances = source.outgoing\n      .filter(filter)\n      .map(function(connection) {\n        var weight = getWeight(connection);\n\n        var distance = weight > 0\n          ? getDistance(source, connection.target)\n          : getDistance(connection.target, source);\n\n        return {\n          id: connection.target.id,\n          distance: distance,\n          weight: weight\n        };\n      });\n\n    var distances = sourcesDistances.concat(targetsDistances).reduce(function(accumulator, currentValue) {\n      accumulator[ currentValue.id + '__weight_' + currentValue.weight ] = currentValue;\n\n      return accumulator;\n    }, {});\n\n    var distancesGrouped = reduce(distances, function(accumulator, currentValue) {\n      var distance = currentValue.distance,\n          weight = currentValue.weight;\n\n      if (distance < 0 || distance > maxDistance) {\n        return accumulator;\n      }\n\n      if (!accumulator[ String(distance) ]) {\n        accumulator[ String(distance) ] = 0;\n      }\n\n      accumulator[ String(distance) ] += 1 * weight;\n\n      if (!accumulator.distance || accumulator[ accumulator.distance ] < accumulator[ String(distance) ]) {\n        accumulator.distance = distance;\n      }\n\n      return accumulator;\n    }, {});\n\n    return distancesGrouped.distance || defaultDistance;\n  }\n\n  /**\n   * Returns all connected elements around the given source.\n   *\n   * This includes:\n   *\n   *   - connected elements\n   *   - host connected elements\n   *   - attachers connected elements\n   *\n   * @param {Shape} source\n   *\n   * @return {Shape[]}\n   */\n  function getAutoPlaceClosure(source) {\n\n    var allConnected = getConnected(source);\n\n    if (source.host) {\n      allConnected = allConnected.concat(getConnected(source.host));\n    }\n\n    if (source.attachers) {\n      allConnected = allConnected.concat(source.attachers.reduce(function(shapes, attacher) {\n        return shapes.concat(getConnected(attacher));\n      }, []));\n    }\n\n    return allConnected;\n  }\n\n  function getConnected(element) {\n    return getTargets(element).concat(getSources(element));\n  }\n\n  function getSources(shape) {\n    return shape.incoming.map(function(connection) {\n      return connection.source;\n    });\n  }\n\n  function getTargets(shape) {\n    return shape.outgoing.map(function(connection) {\n      return connection.target;\n    });\n  }\n\n  function noneFilter() {\n    return true;\n  }\n\n  /**\n   * @typedef {import('../../core/Types').ShapeLike} Shape\n   *\n   * @typedef {import('../../util/Types').Point} Point\n   *\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   */\n\n  var LOW_PRIORITY$k = 100;\n\n\n  /**\n   * A service that places elements connected to existing ones\n   * to an appropriate position in an _automated_ fashion.\n   *\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   * @param {Canvas} canvas\n   */\n  function AutoPlace$1(eventBus, modeling, canvas) {\n\n    eventBus.on('autoPlace', LOW_PRIORITY$k, function(context) {\n      var shape = context.shape,\n          source = context.source;\n\n      return getNewShapePosition$1(source, shape);\n    });\n\n    eventBus.on('autoPlace.end', function(event) {\n      canvas.scrollToElement(event.shape);\n    });\n\n    /**\n     * Append shape to source at appropriate position.\n     *\n     * @param {Shape} source\n     * @param {Shape} shape\n     *\n     * @return {Shape} appended shape\n     */\n    this.append = function(source, shape, hints) {\n\n      eventBus.fire('autoPlace.start', {\n        source: source,\n        shape: shape\n      });\n\n      // allow others to provide the position\n      var position = eventBus.fire('autoPlace', {\n        source: source,\n        shape: shape\n      });\n\n      var newShape = modeling.appendShape(source, shape, position, source.parent, hints);\n\n      eventBus.fire('autoPlace.end', {\n        source: source,\n        shape: newShape\n      });\n\n      return newShape;\n    };\n\n  }\n\n  AutoPlace$1.$inject = [\n    'eventBus',\n    'modeling',\n    'canvas'\n  ];\n\n  // helpers //////////\n\n  /**\n   * Find the new position for the target element to\n   * connect to source.\n   *\n   * @param {Shape} source\n   * @param {Shape} element\n   * @param {Object} [hints]\n   * @param {Object} [hints.defaultDistance]\n   *\n   * @return {Point}\n   */\n  function getNewShapePosition$1(source, element, hints) {\n    if (!hints) {\n      hints = {};\n    }\n\n    var distance = hints.defaultDistance || DEFAULT_DISTANCE;\n\n    var sourceMid = getMid(source),\n        sourceTrbl = asTRBL(source);\n\n    // simply put element right next to source\n    return {\n      x: sourceTrbl.right + distance + element.width / 2,\n      y: sourceMid.y\n    };\n  }\n\n  /**\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../selection/Selection').default} Selection\n   */\n\n  /**\n   * Select element after auto placement.\n   *\n   * @param {EventBus} eventBus\n   * @param {Selection} selection\n   */\n  function AutoPlaceSelectionBehavior(eventBus, selection) {\n\n    eventBus.on('autoPlace.end', 500, function(e) {\n      selection.select(e.shape);\n    });\n\n  }\n\n  AutoPlaceSelectionBehavior.$inject = [\n    'eventBus',\n    'selection'\n  ];\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var AutoPlaceModule$1 = {\n    __init__: [ 'autoPlaceSelectionBehavior' ],\n    autoPlace: [ 'type', AutoPlace$1 ],\n    autoPlaceSelectionBehavior: [ 'type', AutoPlaceSelectionBehavior ]\n  };\n\n  /**\n   * @typedef {import('../../../model/Types').Element} Element\n   */\n\n  /**\n   * Return the parent of the element with any of the given types.\n   *\n   * @param {Element} element\n   * @param {string|string[]} anyType\n   *\n   * @return {Element|null}\n   */\n  function getParent(element, anyType) {\n\n    if (isString(anyType)) {\n      anyType = [ anyType ];\n    }\n\n    while ((element = element.parent)) {\n      if (isAny(element, anyType)) {\n        return element;\n      }\n    }\n\n    return null;\n  }\n\n  /**\n   * @typedef {import('../../model/Types').Shape} Shape\n   *\n   * @typedef {import('diagram-js/lib/util/Types').Point} Point\n   * @typedef {import('diagram-js/lib/util/Types').DirectionTRBL} DirectionTRBL\n   */\n\n  /**\n   * Get the position for given new target relative to the source it will be\n   * connected to.\n   *\n   * @param  {Shape} source\n   * @param  {Shape} element\n   *\n   * @return {Point}\n   */\n  function getNewShapePosition(source, element) {\n\n    if (is$1(element, 'bpmn:TextAnnotation')) {\n      return getTextAnnotationPosition(source, element);\n    }\n\n    if (isAny(element, [ 'bpmn:DataObjectReference', 'bpmn:DataStoreReference' ])) {\n      return getDataElementPosition(source, element);\n    }\n\n    if (is$1(element, 'bpmn:FlowNode')) {\n      return getFlowNodePosition(source, element);\n    }\n  }\n\n  /**\n   * Get the position for given new flow node. Try placing the flow node right of\n   * the source.\n   *\n   * @param {Shape} source\n   * @param {Shape} element\n   *\n   * @return {Point}\n   */\n  function getFlowNodePosition(source, element) {\n\n    var sourceTrbl = asTRBL(source);\n    var sourceMid = getMid(source);\n\n    var horizontalDistance = getConnectedDistance(source, {\n      filter: function(connection) {\n        return is$1(connection, 'bpmn:SequenceFlow');\n      }\n    });\n\n    var margin = 30,\n        minDistance = 80,\n        orientation = 'left';\n\n    if (is$1(source, 'bpmn:BoundaryEvent')) {\n      orientation = getOrientation(source, source.host, -25);\n\n      if (orientation.indexOf('top') !== -1) {\n        margin *= -1;\n      }\n    }\n\n    var position = {\n      x: sourceTrbl.right + horizontalDistance + element.width / 2,\n      y: sourceMid.y + getVerticalDistance(orientation, minDistance)\n    };\n\n    var nextPositionDirection = {\n      y: {\n        margin: margin,\n        minDistance: minDistance\n      }\n    };\n\n    return findFreePosition(source, element, position, generateGetNextPosition(nextPositionDirection));\n  }\n\n  /**\n   * @param {DirectionTRBL} orientation\n   * @param {number} minDistance\n   *\n   * @return {number}\n   */\n  function getVerticalDistance(orientation, minDistance) {\n    if (orientation.includes('top')) {\n      return -1 * minDistance;\n    } else if (orientation.includes('bottom')) {\n      return minDistance;\n    } else {\n      return 0;\n    }\n  }\n\n\n  /**\n   * Get the position for given text annotation. Try placing the text annotation\n   * top-right of the source.\n   *\n   * @param {Shape} source\n   * @param {Shape} element\n   *\n   * @return {Point}\n   */\n  function getTextAnnotationPosition(source, element) {\n\n    var sourceTrbl = asTRBL(source);\n\n    var position = {\n      x: sourceTrbl.right + element.width / 2,\n      y: sourceTrbl.top - 50 - element.height / 2\n    };\n\n    if (isConnection(source)) {\n      position = getMid(source);\n      position.x += 100;\n      position.y -= 50;\n    }\n\n    var nextPositionDirection = {\n      y: {\n        margin: -30,\n        minDistance: 20\n      }\n    };\n\n    return findFreePosition(source, element, position, generateGetNextPosition(nextPositionDirection));\n  }\n\n\n  /**\n   * Get the position for given new data element. Try placing the data element\n   * bottom-right of the source.\n   *\n   * @param {Shape} source\n   * @param {Shape} element\n   *\n   * @return {Point}\n   */\n  function getDataElementPosition(source, element) {\n\n    var sourceTrbl = asTRBL(source);\n\n    var position = {\n      x: sourceTrbl.right - 10 + element.width / 2,\n      y: sourceTrbl.bottom + 40 + element.width / 2\n    };\n\n    var nextPositionDirection = {\n      x: {\n        margin: 30,\n        minDistance: 30\n      }\n    };\n\n    return findFreePosition(source, element, position, generateGetNextPosition(nextPositionDirection));\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   */\n\n  /**\n   * BPMN auto-place behavior.\n   *\n   * @param {EventBus} eventBus\n   */\n  function AutoPlace(eventBus) {\n    eventBus.on('autoPlace', function(context) {\n      var shape = context.shape,\n          source = context.source;\n\n      return getNewShapePosition(source, shape);\n    });\n  }\n\n  AutoPlace.$inject = [ 'eventBus' ];\n\n  var AutoPlaceModule = {\n    __depends__: [ AutoPlaceModule$1 ],\n    __init__: [ 'bpmnAutoPlace' ],\n    bpmnAutoPlace: [ 'type', AutoPlace ]\n  };\n\n  /**\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Shape} Shape\n   *\n   * @typedef {import('../../util/Types').Direction} Direction\n   * @typedef {import('../../util/Types').Rect} Rect\n   * @typedef {import('../../util/Types').RectTRBL} RectTRBL\n   *\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   * @typedef {import('../rules/Rules').default} Rules\n   */\n\n  /**\n   * An auto resize component that takes care of expanding a parent element\n   * if child elements are created or moved close the parents edge.\n   *\n   * @param {EventBus} eventBus\n   * @param {ElementRegistry} elementRegistry\n   * @param {Modeling} modeling\n   * @param {Rules} rules\n   */\n  function AutoResize(eventBus, elementRegistry, modeling, rules) {\n\n    CommandInterceptor.call(this, eventBus);\n\n    this._elementRegistry = elementRegistry;\n    this._modeling = modeling;\n    this._rules = rules;\n\n    var self = this;\n\n    this.postExecuted([ 'shape.create' ], function(event) {\n      var context = event.context,\n          hints = context.hints || {},\n          shape = context.shape,\n          parent = context.parent || context.newParent;\n\n      if (hints.autoResize === false) {\n        return;\n      }\n\n      self._expand([ shape ], parent);\n    });\n\n    this.postExecuted([ 'elements.move' ], function(event) {\n      var context = event.context,\n          elements = flatten(values(context.closure.topLevel)),\n          hints = context.hints;\n\n      var autoResize = hints ? hints.autoResize : true;\n\n      if (autoResize === false) {\n        return;\n      }\n\n      var expandings = groupBy(elements, function(element) {\n        return element.parent.id;\n      });\n\n      forEach$1(expandings, function(elements, parentId) {\n\n        // optionally filter elements to be considered when resizing\n        if (isArray$3(autoResize)) {\n          elements = elements.filter(function(element) {\n            return find(autoResize, matchPattern({ id: element.id }));\n          });\n        }\n\n        self._expand(elements, parentId);\n      });\n    });\n\n    this.postExecuted([ 'shape.toggleCollapse' ], function(event) {\n      var context = event.context,\n          hints = context.hints,\n          shape = context.shape;\n\n      if (hints && hints.autoResize === false) {\n        return;\n      }\n\n      if (shape.collapsed) {\n        return;\n      }\n\n      self._expand(shape.children || [], shape);\n    });\n\n    this.postExecuted([ 'shape.resize' ], function(event) {\n      var context = event.context,\n          hints = context.hints,\n          shape = context.shape,\n          parent = shape.parent;\n\n      if (hints && hints.autoResize === false) {\n        return;\n      }\n\n      if (parent) {\n        self._expand([ shape ], parent);\n      }\n    });\n\n  }\n\n  AutoResize.$inject = [\n    'eventBus',\n    'elementRegistry',\n    'modeling',\n    'rules'\n  ];\n\n  e$3(AutoResize, CommandInterceptor);\n\n\n  /**\n   * Calculate the new bounds of the target shape, given\n   * a number of elements have been moved or added into the parent.\n   *\n   * This method considers the current size, the added elements as well as\n   * the provided padding for the new bounds.\n   *\n   * @param {Shape[]} elements\n   * @param {Shape} target\n   */\n  AutoResize.prototype._getOptimalBounds = function(elements, target) {\n\n    var offset = this.getOffset(target),\n        padding = this.getPadding(target);\n\n    var elementsTrbl = asTRBL(getBBox(elements)),\n        targetTrbl = asTRBL(target);\n\n    var newTrbl = {};\n\n    if (elementsTrbl.top - targetTrbl.top < padding.top) {\n      newTrbl.top = elementsTrbl.top - offset.top;\n    }\n\n    if (elementsTrbl.left - targetTrbl.left < padding.left) {\n      newTrbl.left = elementsTrbl.left - offset.left;\n    }\n\n    if (targetTrbl.right - elementsTrbl.right < padding.right) {\n      newTrbl.right = elementsTrbl.right + offset.right;\n    }\n\n    if (targetTrbl.bottom - elementsTrbl.bottom < padding.bottom) {\n      newTrbl.bottom = elementsTrbl.bottom + offset.bottom;\n    }\n\n    return asBounds(assign$1({}, targetTrbl, newTrbl));\n  };\n\n\n  /**\n   * Expand the target shape respecting rules, offset and padding\n   *\n   * @param {Shape[]} elements\n   * @param {Shape|string} target The target or its ID.\n   */\n  AutoResize.prototype._expand = function(elements, target) {\n\n    if (typeof target === 'string') {\n      target = this._elementRegistry.get(target);\n    }\n\n    var allowed = this._rules.allowed('element.autoResize', {\n      elements: elements,\n      target: target\n    });\n\n    if (!allowed) {\n      return;\n    }\n\n    // calculate the new bounds\n    var newBounds = this._getOptimalBounds(elements, target);\n\n    if (!boundsChanged$1(newBounds, target)) {\n      return;\n    }\n\n    var resizeDirections = getResizeDirections(pick(target, [ 'x', 'y', 'width', 'height' ]), newBounds);\n\n    // resize the parent shape\n    this.resize(target, newBounds, {\n      autoResize: resizeDirections\n    });\n\n    var parent = target.parent;\n\n    // recursively expand parent elements\n    if (parent) {\n      this._expand([ target ], parent);\n    }\n  };\n\n\n  /**\n   * Get the amount to expand the given shape in each direction.\n   *\n   * @param {Shape} shape\n   *\n   * @return {RectTRBL}\n   */\n  AutoResize.prototype.getOffset = function(shape) {\n    return { top: 60, bottom: 60, left: 100, right: 100 };\n  };\n\n\n  /**\n   * Get the activation threshold for each side for which\n   * resize triggers.\n   *\n   * @param {Shape} shape\n   *\n   * @return {RectTRBL}\n   */\n  AutoResize.prototype.getPadding = function(shape) {\n    return { top: 2, bottom: 2, left: 15, right: 15 };\n  };\n\n\n  /**\n   * Perform the actual resize operation.\n   *\n   * @param {Shape} shape\n   * @param {Rect} newBounds\n   * @param {Object} [hints]\n   * @param {string} [hints.autoResize]\n   */\n  AutoResize.prototype.resize = function(shape, newBounds, hints) {\n    this._modeling.resizeShape(shape, newBounds, null, hints);\n  };\n\n\n  function boundsChanged$1(newBounds, oldBounds) {\n    return (\n      newBounds.x !== oldBounds.x ||\n      newBounds.y !== oldBounds.y ||\n      newBounds.width !== oldBounds.width ||\n      newBounds.height !== oldBounds.height\n    );\n  }\n\n  /**\n   * Get directions of resize as {n|w|s|e} e.g. \"nw\".\n   *\n   * @param {Rect} oldBounds\n   * @param {Rect} newBounds\n   *\n   * @return {Direction} Resize directions as {n|w|s|e}.\n   */\n  function getResizeDirections(oldBounds, newBounds) {\n    var directions = '';\n\n    oldBounds = asTRBL(oldBounds);\n    newBounds = asTRBL(newBounds);\n\n    if (oldBounds.top > newBounds.top) {\n      directions = directions.concat('n');\n    }\n\n    if (oldBounds.right < newBounds.right) {\n      directions = directions.concat('w');\n    }\n\n    if (oldBounds.bottom < newBounds.bottom) {\n      directions = directions.concat('s');\n    }\n\n    if (oldBounds.left > newBounds.left) {\n      directions = directions.concat('e');\n    }\n\n    return directions;\n  }\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   *\n   * @typedef {import('../../model/Types').Shape} Shape\n   *\n   * @typedef {import('diagram-js/lib/util/Types').Rect} Rect\n   */\n\n  /**\n   * BPMN-specific resize behavior.\n   *\n   * @param {Injector} injector\n   */\n  function BpmnAutoResize(injector) {\n\n    injector.invoke(AutoResize, this);\n  }\n\n  BpmnAutoResize.$inject = [\n    'injector'\n  ];\n\n  e$3(BpmnAutoResize, AutoResize);\n\n  /**\n   * Perform BPMN-specific resizing of participants.\n   *\n   * @param {Shape} target\n   * @param {Rect} newBounds\n   * @param {Object} [hints]\n   * @param {string} [hints.autoResize]\n   */\n  BpmnAutoResize.prototype.resize = function(target, newBounds, hints) {\n\n    if (is$1(target, 'bpmn:Participant')) {\n      this._modeling.resizeLane(target, newBounds, null, hints);\n    } else {\n      this._modeling.resizeShape(target, newBounds, null, hints);\n    }\n  };\n\n  /**\n   * @typedef {import('../../model/Types').Shape} Shape\n   *\n   * @typedef {import('../../core/EventBus').default} EventBus\n   */\n\n  /**\n   * This is a base rule provider for the element.autoResize rule.\n   *\n   * @param {EventBus} eventBus\n   */\n  function AutoResizeProvider(eventBus) {\n\n    RuleProvider.call(this, eventBus);\n\n    var self = this;\n\n    this.addRule('element.autoResize', function(context) {\n      return self.canResize(context.elements, context.target);\n    });\n  }\n\n  AutoResizeProvider.$inject = [ 'eventBus' ];\n\n  e$3(AutoResizeProvider, RuleProvider);\n\n  /**\n   * Needs to be implemented by sub classes to allow actual auto resize\n   *\n   * @param {Shape[]} elements\n   * @param {Shape} target\n   *\n   * @return {boolean}\n   */\n  AutoResizeProvider.prototype.canResize = function(elements, target) {\n    return false;\n  };\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   *\n   * @typedef {import('../../model/Types').Shape} Shape\n   */\n\n  /**\n   * BPMN-specific provider for automatic resizung.\n   *\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   */\n  function BpmnAutoResizeProvider(eventBus, modeling) {\n    AutoResizeProvider.call(this, eventBus);\n\n    this._modeling = modeling;\n  }\n\n  e$3(BpmnAutoResizeProvider, AutoResizeProvider);\n\n  BpmnAutoResizeProvider.$inject = [\n    'eventBus',\n    'modeling'\n  ];\n\n\n  /**\n   * BPMN-specific check whether given elements can be resized.\n   *\n   * @param {Shape[]} elements\n   * @param {Shape} target\n   *\n   * @return {boolean}\n   */\n  BpmnAutoResizeProvider.prototype.canResize = function(elements, target) {\n\n    // do not resize plane elements:\n    // root elements, collapsed sub-processes\n    if (is$1(target.di, 'bpmndi:BPMNPlane')) {\n      return false;\n    }\n\n    if (!is$1(target, 'bpmn:Participant') && !is$1(target, 'bpmn:Lane') && !(is$1(target, 'bpmn:SubProcess'))) {\n      return false;\n    }\n\n    var canResize = true;\n\n    forEach$1(elements, function(element) {\n\n      if (is$1(element, 'bpmn:Lane') || isLabel(element)) {\n        canResize = false;\n        return;\n      }\n    });\n\n    return canResize;\n  };\n\n  var AutoResizeModule = {\n    __init__: [\n      'bpmnAutoResize',\n      'bpmnAutoResizeProvider'\n    ],\n    bpmnAutoResize: [ 'type', BpmnAutoResize ],\n    bpmnAutoResizeProvider: [ 'type', BpmnAutoResizeProvider ]\n  };\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   *\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../../core/EventBus').default} EventBus\n   */\n\n  var HIGH_PRIORITY$j = 1500;\n\n\n  /**\n   * Browsers may swallow certain events (hover, out ...) if users are to\n   * fast with the mouse.\n   *\n   * @see http://stackoverflow.com/questions/7448468/why-cant-i-reliably-capture-a-mouseout-event\n   *\n   * The fix implemented in this component ensure that we\n   *\n   * 1) have a hover state after a successful drag.move event\n   * 2) have an out event when dragging leaves an element\n   *\n   * @param {ElementRegistry} elementRegistry\n   * @param {EventBus} eventBus\n   * @param {Injector} injector\n   */\n  function HoverFix(elementRegistry, eventBus, injector) {\n\n    var self = this;\n\n    var dragging = injector.get('dragging', false);\n\n    /**\n     * Make sure we are god damn hovering!\n     *\n     * @param {Event} dragging event\n     */\n    function ensureHover(event) {\n\n      if (event.hover) {\n        return;\n      }\n\n      var originalEvent = event.originalEvent;\n\n      var gfx = self._findTargetGfx(originalEvent);\n\n      var element = gfx && elementRegistry.get(gfx);\n\n      if (gfx && element) {\n\n        // 1) cancel current mousemove\n        event.stopPropagation();\n\n        // 2) emit fake hover for new target\n        dragging.hover({ element: element, gfx: gfx });\n\n        // 3) re-trigger move event\n        dragging.move(originalEvent);\n      }\n    }\n\n\n    if (dragging) {\n\n      /**\n       * We wait for a specific sequence of events before\n       * emitting a fake drag.hover event.\n       *\n       * Event Sequence:\n       *\n       * drag.start\n       * drag.move >> ensure we are hovering\n       */\n      eventBus.on('drag.start', function(event) {\n\n        eventBus.once('drag.move', HIGH_PRIORITY$j, function(event) {\n\n          ensureHover(event);\n\n        });\n\n      });\n    }\n\n\n    /**\n     * We make sure that element.out is always fired, even if the\n     * browser swallows an element.out event.\n     *\n     * Event sequence:\n     *\n     * element.hover\n     * (element.out >> sometimes swallowed)\n     * element.hover >> ensure we fired element.out\n     */\n    (function() {\n      var hoverGfx;\n      var hover;\n\n      eventBus.on('element.hover', function(event) {\n\n        // (1) remember current hover element\n        hoverGfx = event.gfx;\n        hover = event.element;\n      });\n\n      eventBus.on('element.hover', HIGH_PRIORITY$j, function(event) {\n\n        // (3) am I on an element still?\n        if (hover) {\n\n          // (4) that is a problem, gotta \"simulate the out\"\n          eventBus.fire('element.out', {\n            element: hover,\n            gfx: hoverGfx\n          });\n        }\n\n      });\n\n      eventBus.on('element.out', function() {\n\n        // (2) unset hover state if we correctly outed us *GG*\n        hoverGfx = null;\n        hover = null;\n      });\n\n    })();\n\n    this._findTargetGfx = function(event) {\n      var position,\n          target;\n\n      if (!(event instanceof MouseEvent)) {\n        return;\n      }\n\n      position = toPoint(event);\n\n      // damn expensive operation, ouch!\n      target = document.elementFromPoint(position.x, position.y);\n\n      return getGfx(target);\n    };\n\n  }\n\n  HoverFix.$inject = [\n    'elementRegistry',\n    'eventBus',\n    'injector'\n  ];\n\n\n  // helpers /////////////////////\n\n  function getGfx(target) {\n    return closest(target, 'svg, .djs-element', true);\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var HoverFixModule = {\n    __init__: [\n      'hoverFix'\n    ],\n    hoverFix: [ 'type', HoverFix ],\n  };\n\n  var round$a = Math.round;\n\n  /**\n   * @typedef {import('../../util/Types').Point} Point\n   *\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../selection/Selection').default} Selection\n   */\n\n  var DRAG_ACTIVE_CLS = 'djs-drag-active';\n\n\n  function preventDefault$1(event) {\n    event.preventDefault();\n  }\n\n  function isTouchEvent(event) {\n\n    // check for TouchEvent being available first\n    // (i.e. not available on desktop Firefox)\n    return typeof TouchEvent !== 'undefined' && event instanceof TouchEvent;\n  }\n\n  function getLength(point) {\n    return Math.sqrt(Math.pow(point.x, 2) + Math.pow(point.y, 2));\n  }\n\n  /**\n   * A helper that fires canvas localized drag events and realizes\n   * the general \"drag-and-drop\" look and feel.\n   *\n   * Calling {@link Dragging#activate} activates dragging on a canvas.\n   *\n   * It provides the following:\n   *\n   *   * emits life cycle events, namespaced with a prefix assigned\n   *     during dragging activation\n   *   * sets and restores the cursor\n   *   * sets and restores the selection if elements still exist\n   *   * ensures there can be only one drag operation active at a time\n   *\n   * Dragging may be canceled manually by calling {@link Dragging#cancel}\n   * or by pressing ESC.\n   *\n   *\n   * ## Life-cycle events\n   *\n   * Dragging can be in three different states, off, initialized\n   * and active.\n   *\n   * (1) off: no dragging operation is in progress\n   * (2) initialized: a new drag operation got initialized but not yet\n   *                  started (i.e. because of no initial move)\n   * (3) started: dragging is in progress\n   *\n   * Eventually dragging will be off again after a drag operation has\n   * been ended or canceled via user click or ESC key press.\n   *\n   * To indicate transitions between these states dragging emits generic\n   * life-cycle events with the `drag.` prefix _and_ events namespaced\n   * to a prefix choosen by a user during drag initialization.\n   *\n   * The following events are emitted (appropriately prefixed) via\n   * the {@link EventBus}.\n   *\n   * * `init`\n   * * `start`\n   * * `move`\n   * * `end`\n   * * `ended` (dragging already in off state)\n   * * `cancel` (only if previously started)\n   * * `canceled` (dragging already in off state, only if previously started)\n   * * `cleanup`\n   *\n   *\n   * @example\n   *\n   * ```javascript\n   * function MyDragComponent(eventBus, dragging) {\n   *\n   *   eventBus.on('mydrag.start', function(event) {\n   *     console.log('yes, we start dragging');\n   *   });\n   *\n   *   eventBus.on('mydrag.move', function(event) {\n   *     console.log('canvas local coordinates', event.x, event.y, event.dx, event.dy);\n   *\n   *     // local drag data is passed with the event\n   *     event.context.foo; // \"BAR\"\n   *\n   *     // the original mouse event, too\n   *     event.originalEvent; // MouseEvent(...)\n   *   });\n   *\n   *   eventBus.on('element.click', function(event) {\n   *     dragging.init(event, 'mydrag', {\n   *       cursor: 'grabbing',\n   *       data: {\n   *         context: {\n   *           foo: \"BAR\"\n   *         }\n   *       }\n   *     });\n   *   });\n   * }\n   * ```\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {Selection} selection\n   * @param {ElementRegistry} elementRegistry\n   */\n  function Dragging(eventBus, canvas, selection, elementRegistry) {\n\n    var defaultOptions = {\n      threshold: 5,\n      trapClick: true\n    };\n\n    // the currently active drag operation\n    // dragging is active as soon as this context exists.\n    //\n    // it is visually _active_ only when a context.active flag is set to true.\n    var context;\n\n    /* convert a global event into local coordinates */\n    function toLocalPoint(globalPosition) {\n\n      var viewbox = canvas.viewbox();\n\n      var clientRect = canvas._container.getBoundingClientRect();\n\n      return {\n        x: viewbox.x + (globalPosition.x - clientRect.left) / viewbox.scale,\n        y: viewbox.y + (globalPosition.y - clientRect.top) / viewbox.scale\n      };\n    }\n\n    // helpers\n\n    function fire(type, dragContext) {\n      dragContext = dragContext || context;\n\n      var event = eventBus.createEvent(\n        assign$1(\n          {},\n          dragContext.payload,\n          dragContext.data,\n          { isTouch: dragContext.isTouch }\n        )\n      );\n\n      // default integration\n      if (eventBus.fire('drag.' + type, event) === false) {\n        return false;\n      }\n\n      return eventBus.fire(dragContext.prefix + '.' + type, event);\n    }\n\n    function restoreSelection(previousSelection) {\n      var existingSelection = previousSelection.filter(function(element) {\n        return elementRegistry.get(element.id);\n      });\n\n      existingSelection.length && selection.select(existingSelection);\n    }\n\n    // event listeners\n\n    function move(event, activate) {\n      var payload = context.payload,\n          displacement = context.displacement;\n\n      var globalStart = context.globalStart,\n          globalCurrent = toPoint(event),\n          globalDelta = delta(globalCurrent, globalStart);\n\n      var localStart = context.localStart,\n          localCurrent = toLocalPoint(globalCurrent),\n          localDelta = delta(localCurrent, localStart);\n\n\n      // activate context explicitly or once threshold is reached\n      if (!context.active && (activate || getLength(globalDelta) > context.threshold)) {\n\n        // fire start event with original\n        // starting coordinates\n\n        assign$1(payload, {\n          x: round$a(localStart.x + displacement.x),\n          y: round$a(localStart.y + displacement.y),\n          dx: 0,\n          dy: 0\n        }, { originalEvent: event });\n\n        if (false === fire('start')) {\n          return cancel();\n        }\n\n        context.active = true;\n\n        // unset selection and remember old selection\n        // the previous (old) selection will always passed\n        // with the event via the event.previousSelection property\n        if (!context.keepSelection) {\n          payload.previousSelection = selection.get();\n          selection.select(null);\n        }\n\n        // allow custom cursor\n        if (context.cursor) {\n          set(context.cursor);\n        }\n\n        // indicate dragging via marker on root element\n        canvas.addMarker(canvas.getRootElement(), DRAG_ACTIVE_CLS);\n      }\n\n      stopPropagation$1(event);\n\n      if (context.active) {\n\n        // update payload with actual coordinates\n        assign$1(payload, {\n          x: round$a(localCurrent.x + displacement.x),\n          y: round$a(localCurrent.y + displacement.y),\n          dx: round$a(localDelta.x),\n          dy: round$a(localDelta.y)\n        }, { originalEvent: event });\n\n        // emit move event\n        fire('move');\n      }\n    }\n\n    function end(event) {\n      var previousContext,\n          returnValue = true;\n\n      if (context.active) {\n\n        if (event) {\n          context.payload.originalEvent = event;\n\n          // suppress original event (click, ...)\n          // because we just ended a drag operation\n          stopPropagation$1(event);\n        }\n\n        // implementations may stop restoring the\n        // original state (selections, ...) by preventing the\n        // end events default action\n        returnValue = fire('end');\n      }\n\n      if (returnValue === false) {\n        fire('rejected');\n      }\n\n      previousContext = cleanup(returnValue !== true);\n\n      // last event to be fired when all drag operations are done\n      // at this point in time no drag operation is in progress anymore\n      fire('ended', previousContext);\n    }\n\n\n    // cancel active drag operation if the user presses\n    // the ESC key on the keyboard\n\n    function checkCancel(event) {\n\n      if (isKey('Escape', event)) {\n        preventDefault$1(event);\n\n        cancel();\n      }\n    }\n\n\n    // prevent ghost click that might occur after a finished\n    // drag and drop session\n\n    function trapClickAndEnd(event) {\n\n      var untrap;\n\n      // trap the click in case we are part of an active\n      // drag operation. This will effectively prevent\n      // the ghost click that cannot be canceled otherwise.\n      if (context.active) {\n\n        untrap = install(eventBus);\n\n        // remove trap after minimal delay\n        setTimeout(untrap, 400);\n\n        // prevent default action (click)\n        preventDefault$1(event);\n      }\n\n      end(event);\n    }\n\n    function trapTouch(event) {\n      move(event);\n    }\n\n    // update the drag events model element (`hover`) and graphical element (`hoverGfx`)\n    // properties during hover and out and fire {prefix}.hover and {prefix}.out properties\n    // respectively\n\n    function hover(event) {\n      var payload = context.payload;\n\n      payload.hoverGfx = event.gfx;\n      payload.hover = event.element;\n\n      fire('hover');\n    }\n\n    function out(event) {\n      fire('out');\n\n      var payload = context.payload;\n\n      payload.hoverGfx = null;\n      payload.hover = null;\n    }\n\n\n    // life-cycle methods\n\n    function cancel(restore) {\n      var previousContext;\n\n      if (!context) {\n        return;\n      }\n\n      var wasActive = context.active;\n\n      if (wasActive) {\n        fire('cancel');\n      }\n\n      previousContext = cleanup(restore);\n\n      if (wasActive) {\n\n        // last event to be fired when all drag operations are done\n        // at this point in time no drag operation is in progress anymore\n        fire('canceled', previousContext);\n      }\n    }\n\n    function cleanup(restore) {\n      var previousContext,\n          endDrag;\n\n      fire('cleanup');\n\n      // reset cursor\n      unset();\n\n      if (context.trapClick) {\n        endDrag = trapClickAndEnd;\n      } else {\n        endDrag = end;\n      }\n\n      // reset dom listeners\n      event.unbind(document, 'mousemove', move);\n\n      event.unbind(document, 'dragstart', preventDefault$1);\n      event.unbind(document, 'selectstart', preventDefault$1);\n\n      event.unbind(document, 'mousedown', endDrag, true);\n      event.unbind(document, 'mouseup', endDrag, true);\n\n      event.unbind(document, 'keyup', checkCancel);\n\n      event.unbind(document, 'touchstart', trapTouch, true);\n      event.unbind(document, 'touchcancel', cancel, true);\n      event.unbind(document, 'touchmove', move, true);\n      event.unbind(document, 'touchend', end, true);\n\n      eventBus.off('element.hover', hover);\n      eventBus.off('element.out', out);\n\n      // remove drag marker on root element\n      canvas.removeMarker(canvas.getRootElement(), DRAG_ACTIVE_CLS);\n\n      // restore selection, unless it has changed\n      var previousSelection = context.payload.previousSelection;\n\n      if (restore !== false && previousSelection && !selection.get().length) {\n        restoreSelection(previousSelection);\n      }\n\n      previousContext = context;\n\n      context = null;\n\n      return previousContext;\n    }\n\n    /**\n     * Initialize a drag operation.\n     *\n     * If `localPosition` is given, drag events will be emitted\n     * relative to it.\n     *\n     * @param {MouseEvent|TouchEvent} [event]\n     * @param {Point} [relativeTo] actual diagram local position this drag operation should start at\n     * @param {string} prefix\n     * @param {Object} [options]\n     */\n    function init(event$1, relativeTo, prefix, options) {\n\n      // only one drag operation may be active, at a time\n      if (context) {\n        cancel(false);\n      }\n\n      if (typeof relativeTo === 'string') {\n        options = prefix;\n        prefix = relativeTo;\n        relativeTo = null;\n      }\n\n      options = assign$1({}, defaultOptions, options || {});\n\n      var data = options.data || {},\n          originalEvent,\n          globalStart,\n          localStart,\n          endDrag,\n          isTouch;\n\n      if (options.trapClick) {\n        endDrag = trapClickAndEnd;\n      } else {\n        endDrag = end;\n      }\n\n      if (event$1) {\n        originalEvent = getOriginal$1(event$1) || event$1;\n        globalStart = toPoint(event$1);\n\n        stopPropagation$1(event$1);\n\n        // prevent default browser dragging behavior\n        if (originalEvent.type === 'dragstart') {\n          preventDefault$1(originalEvent);\n        }\n      } else {\n        originalEvent = null;\n        globalStart = { x: 0, y: 0 };\n      }\n\n      localStart = toLocalPoint(globalStart);\n\n      if (!relativeTo) {\n        relativeTo = localStart;\n      }\n\n      isTouch = isTouchEvent(originalEvent);\n\n      context = assign$1({\n        prefix: prefix,\n        data: data,\n        payload: {},\n        globalStart: globalStart,\n        displacement: delta(relativeTo, localStart),\n        localStart: localStart,\n        isTouch: isTouch\n      }, options);\n\n      // skip dom registration if trigger\n      // is set to manual (during testing)\n      if (!options.manual) {\n\n        // add dom listeners\n\n        if (isTouch) {\n          event.bind(document, 'touchstart', trapTouch, true);\n          event.bind(document, 'touchcancel', cancel, true);\n          event.bind(document, 'touchmove', move, true);\n          event.bind(document, 'touchend', end, true);\n        } else {\n\n          // assume we use the mouse to interact per default\n          event.bind(document, 'mousemove', move);\n\n          // prevent default browser drag and text selection behavior\n          event.bind(document, 'dragstart', preventDefault$1);\n          event.bind(document, 'selectstart', preventDefault$1);\n\n          event.bind(document, 'mousedown', endDrag, true);\n          event.bind(document, 'mouseup', endDrag, true);\n        }\n\n        event.bind(document, 'keyup', checkCancel);\n\n        eventBus.on('element.hover', hover);\n        eventBus.on('element.out', out);\n      }\n\n      fire('init');\n\n      if (options.autoActivate) {\n        move(event$1, true);\n      }\n    }\n\n    // cancel on diagram destruction\n    eventBus.on('diagram.destroy', cancel);\n\n\n    // API\n\n    this.init = init;\n    this.move = move;\n    this.hover = hover;\n    this.out = out;\n    this.end = end;\n\n    this.cancel = cancel;\n\n    // for introspection\n\n    this.context = function() {\n      return context;\n    };\n\n    this.setOptions = function(options) {\n      assign$1(defaultOptions, options);\n    };\n  }\n\n  Dragging.$inject = [\n    'eventBus',\n    'canvas',\n    'selection',\n    'elementRegistry'\n  ];\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var DraggingModule = {\n    __depends__: [\n      HoverFixModule,\n      SelectionModule,\n    ],\n    dragging: [ 'type', Dragging ],\n  };\n\n  /**\n   * @typedef {import('../../util/Types').Point} Point\n   *\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../../core/Canvas').default} Canvas\n   */\n\n  /**\n   * Initiates canvas scrolling if current cursor point is close to a border.\n   * Cancelled when current point moves back inside the scrolling borders\n   * or cancelled manually.\n   *\n   * Default options :\n   *   scrollThresholdIn: [ 20, 20, 20, 20 ],\n   *   scrollThresholdOut: [ 0, 0, 0, 0 ],\n   *   scrollRepeatTimeout: 15,\n   *   scrollStep: 10\n   *\n   * Threshold order:\n   *   [ left, top, right, bottom ]\n   *\n   * @param {Object} config\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   */\n  function AutoScroll(config, eventBus, canvas) {\n\n    this._canvas = canvas;\n\n    this._opts = assign$1({\n      scrollThresholdIn: [ 20, 20, 20, 20 ],\n      scrollThresholdOut: [ 0, 0, 0, 0 ],\n      scrollRepeatTimeout: 15,\n      scrollStep: 10\n    }, config);\n\n    var self = this;\n\n    eventBus.on('drag.move', function(e) {\n      var point = self._toBorderPoint(e);\n\n      self.startScroll(point);\n    });\n\n    eventBus.on([ 'drag.cleanup' ], function() {\n      self.stopScroll();\n    });\n  }\n\n  AutoScroll.$inject = [\n    'config.autoScroll',\n    'eventBus',\n    'canvas'\n  ];\n\n\n  /**\n   * Starts scrolling loop.\n   * Point is given in global scale in canvas container box plane.\n   *\n   * @param {Point} point\n   */\n  AutoScroll.prototype.startScroll = function(point) {\n\n    var canvas = this._canvas;\n    var opts = this._opts;\n    var self = this;\n\n    var clientRect = canvas.getContainer().getBoundingClientRect();\n\n    var diff = [\n      point.x,\n      point.y,\n      clientRect.width - point.x,\n      clientRect.height - point.y\n    ];\n\n    this.stopScroll();\n\n    var dx = 0,\n        dy = 0;\n\n    for (var i = 0; i < 4; i++) {\n      if (between(diff[i], opts.scrollThresholdOut[i], opts.scrollThresholdIn[i])) {\n        if (i === 0) {\n          dx = opts.scrollStep;\n        } else if (i == 1) {\n          dy = opts.scrollStep;\n        } else if (i == 2) {\n          dx = -opts.scrollStep;\n        } else if (i == 3) {\n          dy = -opts.scrollStep;\n        }\n      }\n    }\n\n    if (dx !== 0 || dy !== 0) {\n      canvas.scroll({ dx: dx, dy: dy });\n\n      this._scrolling = setTimeout(function() {\n        self.startScroll(point);\n      }, opts.scrollRepeatTimeout);\n    }\n  };\n\n  function between(val, start, end) {\n    if (start < val && val < end) {\n      return true;\n    }\n\n    return false;\n  }\n\n\n  /**\n   * Stops scrolling loop.\n   */\n  AutoScroll.prototype.stopScroll = function() {\n    clearTimeout(this._scrolling);\n  };\n\n\n  /**\n   * Overrides defaults options.\n   *\n   * @param {Object} options\n   */\n  AutoScroll.prototype.setOptions = function(options) {\n    this._opts = assign$1({}, this._opts, options);\n  };\n\n\n  /**\n   * Converts event to a point in canvas container plane in global scale.\n   *\n   * @param {Event} event\n   * @return {Point}\n   */\n  AutoScroll.prototype._toBorderPoint = function(event) {\n    var clientRect = this._canvas._container.getBoundingClientRect();\n\n    var globalPosition = toPoint(event.originalEvent);\n\n    return {\n      x: globalPosition.x - clientRect.left,\n      y: globalPosition.y - clientRect.top\n    };\n  };\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var AutoScrollModule = {\n    __depends__: [\n      DraggingModule,\n    ],\n    __init__: [ 'autoScroll' ],\n    autoScroll: [ 'type', AutoScroll ]\n  };\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   */\n\n  /**\n   * A service that provides rules for certain diagram actions.\n   *\n   * The default implementation will hook into the {@link CommandStack}\n   * to perform the actual rule evaluation. Make sure to provide the\n   * `commandStack` service with this module if you plan to use it.\n   *\n   * Together with this implementation you may use the {@link import('./RuleProvider').default}\n   * to implement your own rule checkers.\n   *\n   * This module is ment to be easily replaced, thus the tiny foot print.\n   *\n   * @param {Injector} injector\n   */\n  function Rules(injector) {\n    this._commandStack = injector.get('commandStack', false);\n  }\n\n  Rules.$inject = [ 'injector' ];\n\n\n  /**\n   * Returns whether or not a given modeling action can be executed\n   * in the specified context.\n   *\n   * This implementation will respond with allow unless anyone\n   * objects.\n   *\n   * @param {string} action The action to be allowed or disallowed.\n   * @param {Object} [context] The context for allowing or disallowing the action.\n   *\n   * @return {boolean|null} Wether the action is allowed. Returns `null` if the action\n   * is to be ignored.\n   */\n  Rules.prototype.allowed = function(action, context) {\n    var allowed = true;\n\n    var commandStack = this._commandStack;\n\n    if (commandStack) {\n      allowed = commandStack.canExecute(action, context);\n    }\n\n    // map undefined to true, i.e. no rules\n    return allowed === undefined ? true : allowed;\n  };\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var RulesModule$1 = {\n    __init__: [ 'rules' ],\n    rules: [ 'type', Rules ]\n  };\n\n  /**\n   * @typedef {import('../util/Types').Point} Point\n   *\n   * @typedef { {\n   *   bendpoint?: boolean;\n   *   index: number;\n   *   point: Point;\n   * } } Intersection\n   */\n\n  var round$9 = Math.round,\n      max$6 = Math.max;\n\n\n  function circlePath(center, r) {\n    var x = center.x,\n        y = center.y;\n\n    return [\n      [ 'M', x, y ],\n      [ 'm', 0, -r ],\n      [ 'a', r, r, 0, 1, 1, 0, 2 * r ],\n      [ 'a', r, r, 0, 1, 1, 0, -2 * r ],\n      [ 'z' ]\n    ];\n  }\n\n  function linePath(points) {\n    var segments = [];\n\n    points.forEach(function(p, idx) {\n      segments.push([ idx === 0 ? 'M' : 'L', p.x, p.y ]);\n    });\n\n    return segments;\n  }\n\n\n  var INTERSECTION_THRESHOLD$1 = 10;\n\n  /**\n   * @param {Point[]} waypoints\n   * @param {Point} reference\n   *\n   * @return {Intersection|null}\n   */\n  function getBendpointIntersection(waypoints, reference) {\n\n    var i, w;\n\n    for (i = 0; (w = waypoints[i]); i++) {\n\n      if (pointDistance(w, reference) <= INTERSECTION_THRESHOLD$1) {\n        return {\n          point: waypoints[i],\n          bendpoint: true,\n          index: i\n        };\n      }\n    }\n\n    return null;\n  }\n\n  /**\n   * @param {Point[]} waypoints\n   * @param {Point} reference\n   *\n   * @return {Intersection|null}\n   */\n  function getPathIntersection(waypoints, reference) {\n\n    var intersections = intersectPaths(circlePath(reference, INTERSECTION_THRESHOLD$1), linePath(waypoints));\n\n    var a = intersections[0],\n        b = intersections[intersections.length - 1],\n        idx;\n\n    if (!a) {\n\n      // no intersection\n      return null;\n    }\n\n    if (a !== b) {\n\n      if (a.segment2 !== b.segment2) {\n\n        // we use the bendpoint in between both segments\n        // as the intersection point\n\n        idx = max$6(a.segment2, b.segment2) - 1;\n\n        return {\n          point: waypoints[idx],\n          bendpoint: true,\n          index: idx\n        };\n      }\n\n      return {\n        point: {\n          x: (round$9(a.x + b.x) / 2),\n          y: (round$9(a.y + b.y) / 2)\n        },\n        index: a.segment2\n      };\n    }\n\n    return {\n      point: {\n        x: round$9(a.x),\n        y: round$9(a.y)\n      },\n      index: a.segment2\n    };\n  }\n\n  /**\n   * Returns the closest point on the connection towards a given reference point.\n   *\n   * @param {Point[]} waypoints\n   * @param {Point} reference\n   *\n   * @return {Intersection|null}\n   */\n  function getApproxIntersection(waypoints, reference) {\n    return getBendpointIntersection(waypoints, reference) || getPathIntersection(waypoints, reference);\n  }\n\n  /**\n   * @typedef {import('../../util/Types').Point} Point\n   * @typedef {import('../../util/Types').Vector} Vector\n   */\n\n  /**\n   * Returns the length of a vector.\n   *\n   * @param {Vector} vector\n   *\n   * @return {number}\n   */\n  function vectorLength(vector) {\n    return Math.sqrt(Math.pow(vector.x, 2) + Math.pow(vector.y, 2));\n  }\n\n\n  /**\n   * Calculates the angle between a line a the Y axis.\n   *\n   * @param {Point[]} line\n   *\n   * @return {number}\n   */\n  function getAngle(line) {\n\n    // return value is between 0, 180 and -180, -0\n    // @janstuemmel: maybe replace return a/b with b/a\n    return Math.atan((line[1].y - line[0].y) / (line[1].x - line[0].x));\n  }\n\n\n  /**\n   * Rotates a vector by a given angle.\n   *\n   * @param {Vector} vector\n   * @param {number} angle The angle in radians.\n   *\n   * @return {Vector}\n   */\n  function rotateVector(vector, angle) {\n    return (!angle) ? vector : {\n      x: Math.cos(angle) * vector.x - Math.sin(angle) * vector.y,\n      y: Math.sin(angle) * vector.x + Math.cos(angle) * vector.y\n    };\n  }\n\n\n  /**\n   * Solves a 2D equation system\n   * a + r*b = c, where a,b,c are 2D vectors\n   *\n   * @param {Vector} a\n   * @param {Vector} b\n   * @param {Vector} c\n   *\n   * @return {number}\n   */\n  function solveLambaSystem(a, b, c) {\n\n    // the 2d system\n    var system = [\n      { n: a[0] - c[0], lambda: b[0] },\n      { n: a[1] - c[1], lambda: b[1] }\n    ];\n\n    // solve\n    var n = system[0].n * b[0] + system[1].n * b[1],\n        l = system[0].lambda * b[0] + system[1].lambda * b[1];\n\n    return -n / l;\n  }\n\n\n  /**\n   * Calculates the position of the perpendicular foot.\n   *\n   * @param {Point} point\n   * @param {Point[]} line\n   *\n   * @return {Point}\n   */\n  function perpendicularFoot(point, line) {\n\n    var a = line[0], b = line[1];\n\n    // relative position of b from a\n    var bd = { x: b.x - a.x, y: b.y - a.y };\n\n    // solve equation system to the parametrized vectors param real value\n    var r = solveLambaSystem([ a.x, a.y ], [ bd.x, bd.y ], [ point.x, point.y ]);\n\n    return { x: a.x + r * bd.x, y: a.y + r * bd.y };\n  }\n\n\n  /**\n   * Calculates the distance between a point and a line.\n   *\n   * @param {Point} point\n   * @param {Point[]} line\n   *\n   * @return {number}\n   */\n  function getDistancePointLine(point, line) {\n\n    var pfPoint = perpendicularFoot(point, line);\n\n    // distance vector\n    var connectionVector = {\n      x: pfPoint.x - point.x,\n      y: pfPoint.y - point.y\n    };\n\n    return vectorLength(connectionVector);\n  }\n\n\n  /**\n   * Calculates the distance between two points.\n   *\n   * @param {Point} point1\n   * @param {Point} point2\n   *\n   * @return {number}\n   */\n  function getDistancePointPoint(point1, point2) {\n\n    return vectorLength({\n      x: point1.x - point2.x,\n      y: point1.y - point2.y\n    });\n  }\n\n  /**\n   * @typedef {import('../../core/Types').ConnectionLike} Connection\n   *\n   * @typedef {import('../../util/Types').Point} Point\n   */\n\n  var BENDPOINT_CLS = 'djs-bendpoint';\n  var SEGMENT_DRAGGER_CLS = 'djs-segment-dragger';\n\n  function toCanvasCoordinates(canvas, event) {\n\n    var position = toPoint(event),\n        clientRect = canvas._container.getBoundingClientRect(),\n        offset;\n\n    // canvas relative position\n\n    offset = {\n      x: clientRect.left,\n      y: clientRect.top\n    };\n\n    // update actual event payload with canvas relative measures\n\n    var viewbox = canvas.viewbox();\n\n    return {\n      x: viewbox.x + (position.x - offset.x) / viewbox.scale,\n      y: viewbox.y + (position.y - offset.y) / viewbox.scale\n    };\n  }\n\n  function getConnectionIntersection(canvas, waypoints, event) {\n    var localPosition = toCanvasCoordinates(canvas, event),\n        intersection = getApproxIntersection(waypoints, localPosition);\n\n    return intersection;\n  }\n\n  function addBendpoint(parentGfx, cls) {\n    var groupGfx = create$1('g');\n    classes(groupGfx).add(BENDPOINT_CLS);\n\n    append(parentGfx, groupGfx);\n\n    var visual = create$1('circle');\n    attr(visual, {\n      cx: 0,\n      cy: 0,\n      r: 4\n    });\n    classes(visual).add('djs-visual');\n\n    append(groupGfx, visual);\n\n    var hit = create$1('circle');\n    attr(hit, {\n      cx: 0,\n      cy: 0,\n      r: 10\n    });\n    classes(hit).add('djs-hit');\n\n    append(groupGfx, hit);\n\n    if (cls) {\n      classes(groupGfx).add(cls);\n    }\n\n    return groupGfx;\n  }\n\n  function createParallelDragger(parentGfx, segmentStart, segmentEnd, alignment) {\n    var draggerGfx = create$1('g');\n\n    append(parentGfx, draggerGfx);\n\n    var width = 18,\n        height = 6,\n        padding = 11,\n        hitWidth = calculateHitWidth(segmentStart, segmentEnd, alignment),\n        hitHeight = height + padding;\n\n    var visual = create$1('rect');\n    attr(visual, {\n      x: -width / 2,\n      y: -height / 2,\n      width: width,\n      height: height\n    });\n    classes(visual).add('djs-visual');\n\n    append(draggerGfx, visual);\n\n    var hit = create$1('rect');\n    attr(hit, {\n      x: -hitWidth / 2,\n      y: -hitHeight / 2,\n      width: hitWidth,\n      height: hitHeight\n    });\n    classes(hit).add('djs-hit');\n\n    append(draggerGfx, hit);\n\n    rotate(draggerGfx, alignment === 'v' ? 90 : 0);\n\n    return draggerGfx;\n  }\n\n\n  function addSegmentDragger(parentGfx, segmentStart, segmentEnd) {\n\n    var groupGfx = create$1('g'),\n        mid = getMidPoint(segmentStart, segmentEnd),\n        alignment = pointsAligned(segmentStart, segmentEnd);\n\n    append(parentGfx, groupGfx);\n\n    createParallelDragger(groupGfx, segmentStart, segmentEnd, alignment);\n\n    classes(groupGfx).add(SEGMENT_DRAGGER_CLS);\n    classes(groupGfx).add(alignment === 'h' ? 'horizontal' : 'vertical');\n\n    translate$2(groupGfx, mid.x, mid.y);\n\n    return groupGfx;\n  }\n\n  /**\n   * Calculates region for segment move which is 2/3 of the full segment length\n   * @param {number} segmentLength\n   *\n   * @return {number}\n   */\n  function calculateSegmentMoveRegion(segmentLength) {\n    return Math.abs(Math.round(segmentLength * 2 / 3));\n  }\n\n  /**\n   * Returns the point with the closest distance that is on the connection path.\n   *\n   * @param {Point} position\n   * @param {Connection} connection\n   * @return {Point}\n   */\n  function getClosestPointOnConnection(position, connection) {\n    var segment = getClosestSegment(position, connection);\n\n    return perpendicularFoot(position, segment);\n  }\n\n\n  // helper //////////\n\n  function calculateHitWidth(segmentStart, segmentEnd, alignment) {\n    var segmentLengthXAxis = segmentEnd.x - segmentStart.x,\n        segmentLengthYAxis = segmentEnd.y - segmentStart.y;\n\n    return alignment === 'h' ?\n      calculateSegmentMoveRegion(segmentLengthXAxis) :\n      calculateSegmentMoveRegion(segmentLengthYAxis);\n  }\n\n  function getClosestSegment(position, connection) {\n    var waypoints = connection.waypoints;\n\n    var minDistance = Infinity,\n        segmentIndex;\n\n    for (var i = 0; i < waypoints.length - 1; i++) {\n      var start = waypoints[i],\n          end = waypoints[i + 1],\n          distance = getDistancePointLine(position, [ start, end ]);\n\n      if (distance < minDistance) {\n        minDistance = distance;\n        segmentIndex = i;\n      }\n    }\n\n    return [ waypoints[segmentIndex], waypoints[segmentIndex + 1] ];\n  }\n\n  /**\n   * @typedef {import('../bendpoints/BendpointMove').default} BendpointMove\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../bendpoints/ConnectionSegmentMove').default} ConnectionSegmentMove\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../interaction-events/InteractionEvents').default} InteractionEvents\n   */\n\n  /**\n   * A service that adds editable bendpoints to connections.\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {InteractionEvents} interactionEvents\n   * @param {BendpointMove} bendpointMove\n   * @param {ConnectionSegmentMove} connectionSegmentMove\n   */\n  function Bendpoints(\n      eventBus, canvas, interactionEvents,\n      bendpointMove, connectionSegmentMove) {\n\n    /**\n     * Returns true if intersection point is inside middle region of segment, adjusted by\n     * optional threshold\n     */\n    function isIntersectionMiddle(intersection, waypoints, treshold) {\n      var idx = intersection.index,\n          p = intersection.point,\n          p0, p1, mid, aligned, xDelta, yDelta;\n\n      if (idx <= 0 || intersection.bendpoint) {\n        return false;\n      }\n\n      p0 = waypoints[idx - 1];\n      p1 = waypoints[idx];\n      mid = getMidPoint(p0, p1),\n      aligned = pointsAligned(p0, p1);\n      xDelta = Math.abs(p.x - mid.x);\n      yDelta = Math.abs(p.y - mid.y);\n\n      return aligned && xDelta <= treshold && yDelta <= treshold;\n    }\n\n    /**\n     * Calculates the threshold from a connection's middle which fits the two-third-region\n     */\n    function calculateIntersectionThreshold(connection, intersection) {\n      var waypoints = connection.waypoints,\n          relevantSegment, alignment, segmentLength, threshold;\n\n      if (intersection.index <= 0 || intersection.bendpoint) {\n        return null;\n      }\n\n      // segment relative to connection intersection\n      relevantSegment = {\n        start: waypoints[intersection.index - 1],\n        end: waypoints[intersection.index]\n      };\n\n      alignment = pointsAligned(relevantSegment.start, relevantSegment.end);\n\n      if (!alignment) {\n        return null;\n      }\n\n      if (alignment === 'h') {\n        segmentLength = relevantSegment.end.x - relevantSegment.start.x;\n      } else {\n        segmentLength = relevantSegment.end.y - relevantSegment.start.y;\n      }\n\n      // calculate threshold relative to 2/3 of segment length\n      threshold = calculateSegmentMoveRegion(segmentLength) / 2;\n\n      return threshold;\n    }\n\n    function activateBendpointMove(event, connection) {\n      var waypoints = connection.waypoints,\n          intersection = getConnectionIntersection(canvas, waypoints, event),\n          threshold;\n\n      if (!intersection) {\n        return;\n      }\n\n      threshold = calculateIntersectionThreshold(connection, intersection);\n\n      if (isIntersectionMiddle(intersection, waypoints, threshold)) {\n        connectionSegmentMove.start(event, connection, intersection.index);\n      } else {\n        bendpointMove.start(event, connection, intersection.index, !intersection.bendpoint);\n      }\n\n      // we've handled the event\n      return true;\n    }\n\n    function bindInteractionEvents(node, eventName, element) {\n\n      event.bind(node, eventName, function(event) {\n        interactionEvents.triggerMouseEvent(eventName, event, element);\n        event.stopPropagation();\n      });\n    }\n\n    function getBendpointsContainer(element, create) {\n\n      var layer = canvas.getLayer('overlays'),\n          gfx = query('.djs-bendpoints[data-element-id=\"' + escapeCSS(element.id) + '\"]', layer);\n\n      if (!gfx && create) {\n        gfx = create$1('g');\n        attr(gfx, { 'data-element-id': element.id });\n        classes(gfx).add('djs-bendpoints');\n\n        append(layer, gfx);\n\n        bindInteractionEvents(gfx, 'mousedown', element);\n        bindInteractionEvents(gfx, 'click', element);\n        bindInteractionEvents(gfx, 'dblclick', element);\n      }\n\n      return gfx;\n    }\n\n    function getSegmentDragger(idx, parentGfx) {\n      return query(\n        '.djs-segment-dragger[data-segment-idx=\"' + idx + '\"]',\n        parentGfx\n      );\n    }\n\n    function createBendpoints(gfx, connection) {\n      connection.waypoints.forEach(function(p, idx) {\n        var bendpoint = addBendpoint(gfx);\n\n        append(gfx, bendpoint);\n\n        translate$2(bendpoint, p.x, p.y);\n      });\n\n      // add floating bendpoint\n      addBendpoint(gfx, 'floating');\n    }\n\n    function createSegmentDraggers(gfx, connection) {\n\n      var waypoints = connection.waypoints;\n\n      var segmentStart,\n          segmentEnd,\n          segmentDraggerGfx;\n\n      for (var i = 1; i < waypoints.length; i++) {\n\n        segmentStart = waypoints[i - 1];\n        segmentEnd = waypoints[i];\n\n        if (pointsAligned(segmentStart, segmentEnd)) {\n          segmentDraggerGfx = addSegmentDragger(gfx, segmentStart, segmentEnd);\n\n          attr(segmentDraggerGfx, { 'data-segment-idx': i });\n\n          bindInteractionEvents(segmentDraggerGfx, 'mousemove', connection);\n        }\n      }\n    }\n\n    function clearBendpoints(gfx) {\n      forEach$1(all('.' + BENDPOINT_CLS, gfx), function(node) {\n        remove$1(node);\n      });\n    }\n\n    function clearSegmentDraggers(gfx) {\n      forEach$1(all('.' + SEGMENT_DRAGGER_CLS, gfx), function(node) {\n        remove$1(node);\n      });\n    }\n\n    function addHandles(connection) {\n\n      var gfx = getBendpointsContainer(connection);\n\n      if (!gfx) {\n        gfx = getBendpointsContainer(connection, true);\n\n        createBendpoints(gfx, connection);\n        createSegmentDraggers(gfx, connection);\n      }\n\n      return gfx;\n    }\n\n    function updateHandles(connection) {\n\n      var gfx = getBendpointsContainer(connection);\n\n      if (gfx) {\n        clearSegmentDraggers(gfx);\n        clearBendpoints(gfx);\n        createSegmentDraggers(gfx, connection);\n        createBendpoints(gfx, connection);\n      }\n    }\n\n    function updateFloatingBendpointPosition(parentGfx, intersection) {\n      var floating = query('.floating', parentGfx),\n          point = intersection.point;\n\n      if (!floating) {\n        return;\n      }\n\n      translate$2(floating, point.x, point.y);\n\n    }\n\n    function updateSegmentDraggerPosition(parentGfx, intersection, waypoints) {\n\n      var draggerGfx = getSegmentDragger(intersection.index, parentGfx),\n          segmentStart = waypoints[intersection.index - 1],\n          segmentEnd = waypoints[intersection.index],\n          point = intersection.point,\n          mid = getMidPoint(segmentStart, segmentEnd),\n          alignment = pointsAligned(segmentStart, segmentEnd),\n          draggerVisual, relativePosition;\n\n      if (!draggerGfx) {\n        return;\n      }\n\n      draggerVisual = getDraggerVisual(draggerGfx);\n\n      relativePosition = {\n        x: point.x - mid.x,\n        y: point.y - mid.y\n      };\n\n      if (alignment === 'v') {\n\n        // rotate position\n        relativePosition = {\n          x: relativePosition.y,\n          y: relativePosition.x\n        };\n      }\n\n      translate$2(draggerVisual, relativePosition.x, relativePosition.y);\n    }\n\n    eventBus.on('connection.changed', function(event) {\n      updateHandles(event.element);\n    });\n\n    eventBus.on('connection.remove', function(event) {\n      var gfx = getBendpointsContainer(event.element);\n\n      if (gfx) {\n        remove$1(gfx);\n      }\n    });\n\n    eventBus.on('element.marker.update', function(event) {\n\n      var element = event.element,\n          bendpointsGfx;\n\n      if (!element.waypoints) {\n        return;\n      }\n\n      bendpointsGfx = addHandles(element);\n\n      if (event.add) {\n        classes(bendpointsGfx).add(event.marker);\n      } else {\n        classes(bendpointsGfx).remove(event.marker);\n      }\n    });\n\n    eventBus.on('element.mousemove', function(event) {\n\n      var element = event.element,\n          waypoints = element.waypoints,\n          bendpointsGfx,\n          intersection;\n\n      if (waypoints) {\n        bendpointsGfx = getBendpointsContainer(element, true);\n\n        intersection = getConnectionIntersection(canvas, waypoints, event.originalEvent);\n\n        if (!intersection) {\n          return;\n        }\n\n        updateFloatingBendpointPosition(bendpointsGfx, intersection);\n\n        if (!intersection.bendpoint) {\n          updateSegmentDraggerPosition(bendpointsGfx, intersection, waypoints);\n        }\n\n      }\n    });\n\n    eventBus.on('element.mousedown', function(event) {\n\n      if (!isPrimaryButton(event)) {\n        return;\n      }\n\n      var originalEvent = event.originalEvent,\n          element = event.element;\n\n      if (!element.waypoints) {\n        return;\n      }\n\n      return activateBendpointMove(originalEvent, element);\n    });\n\n    eventBus.on('selection.changed', function(event) {\n      var newSelection = event.newSelection,\n          primary = newSelection[0];\n\n      if (primary && primary.waypoints) {\n        addHandles(primary);\n      }\n    });\n\n    eventBus.on('element.hover', function(event) {\n      var element = event.element;\n\n      if (element.waypoints) {\n        addHandles(element);\n        interactionEvents.registerEvent(event.gfx, 'mousemove', 'element.mousemove');\n      }\n    });\n\n    eventBus.on('element.out', function(event) {\n      interactionEvents.unregisterEvent(event.gfx, 'mousemove', 'element.mousemove');\n    });\n\n    // update bendpoint container data attribute on element ID change\n    eventBus.on('element.updateId', function(context) {\n      var element = context.element,\n          newId = context.newId;\n\n      if (element.waypoints) {\n        var bendpointContainer = getBendpointsContainer(element);\n\n        if (bendpointContainer) {\n          attr(bendpointContainer, { 'data-element-id': newId });\n        }\n      }\n    });\n\n    // API\n\n    this.addHandles = addHandles;\n    this.updateHandles = updateHandles;\n    this.getBendpointsContainer = getBendpointsContainer;\n    this.getSegmentDragger = getSegmentDragger;\n  }\n\n  Bendpoints.$inject = [\n    'eventBus',\n    'canvas',\n    'interactionEvents',\n    'bendpointMove',\n    'connectionSegmentMove'\n  ];\n\n\n\n  // helper /////////////\n\n  function getDraggerVisual(draggerGfx) {\n    return query('.djs-visual', draggerGfx);\n  }\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   *\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../dragging/Dragging').default} Dragging\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   * @typedef {import('../rules/Rules').default} Rules\n   */\n\n  var round$8 = Math.round;\n\n  var RECONNECT_START$1 = 'reconnectStart',\n      RECONNECT_END$1 = 'reconnectEnd',\n      UPDATE_WAYPOINTS$1 = 'updateWaypoints';\n\n\n  /**\n   * Move bendpoints through drag and drop to add/remove bendpoints or reconnect connection.\n   *\n   * @param {Injector} injector\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {Dragging} dragging\n   * @param {Rules} rules\n   * @param {Modeling} modeling\n   */\n  function BendpointMove(injector, eventBus, canvas, dragging, rules, modeling) {\n    this._injector = injector;\n\n    this.start = function(event, connection, bendpointIndex, insert) {\n      var gfx = canvas.getGraphics(connection),\n          source = connection.source,\n          target = connection.target,\n          waypoints = connection.waypoints,\n          type;\n\n      if (!insert && bendpointIndex === 0) {\n        type = RECONNECT_START$1;\n      } else\n      if (!insert && bendpointIndex === waypoints.length - 1) {\n        type = RECONNECT_END$1;\n      } else {\n        type = UPDATE_WAYPOINTS$1;\n      }\n\n      var command = type === UPDATE_WAYPOINTS$1 ? 'connection.updateWaypoints' : 'connection.reconnect';\n\n      var allowed = rules.allowed(command, {\n        connection: connection,\n        source: source,\n        target: target\n      });\n\n      if (allowed === false) {\n        allowed = rules.allowed(command, {\n          connection: connection,\n          source: target,\n          target: source\n        });\n      }\n\n      if (allowed === false) {\n        return;\n      }\n\n      dragging.init(event, 'bendpoint.move', {\n        data: {\n          connection: connection,\n          connectionGfx: gfx,\n          context: {\n            allowed: allowed,\n            bendpointIndex: bendpointIndex,\n            connection: connection,\n            source: source,\n            target: target,\n            insert: insert,\n            type: type\n          }\n        }\n      });\n    };\n\n    eventBus.on('bendpoint.move.hover', function(event) {\n      var context = event.context,\n          connection = context.connection,\n          source = connection.source,\n          target = connection.target,\n          hover = event.hover,\n          type = context.type;\n\n      // cache hover state\n      context.hover = hover;\n\n      var allowed;\n\n      if (!hover) {\n        return;\n      }\n\n      var command = type === UPDATE_WAYPOINTS$1 ? 'connection.updateWaypoints' : 'connection.reconnect';\n\n      allowed = context.allowed = rules.allowed(command, {\n        connection: connection,\n        source: type === RECONNECT_START$1 ? hover : source,\n        target: type === RECONNECT_END$1 ? hover : target\n      });\n\n      if (allowed) {\n        context.source = type === RECONNECT_START$1 ? hover : source;\n        context.target = type === RECONNECT_END$1 ? hover : target;\n\n        return;\n      }\n\n      if (allowed === false) {\n        allowed = context.allowed = rules.allowed(command, {\n          connection: connection,\n          source: type === RECONNECT_END$1 ? hover : target,\n          target: type === RECONNECT_START$1 ? hover : source\n        });\n      }\n\n      if (allowed) {\n        context.source = type === RECONNECT_END$1 ? hover : target;\n        context.target = type === RECONNECT_START$1 ? hover : source;\n      }\n    });\n\n    eventBus.on([ 'bendpoint.move.out', 'bendpoint.move.cleanup' ], function(event) {\n      var context = event.context,\n          type = context.type;\n\n      context.hover = null;\n      context.source = null;\n      context.target = null;\n\n      if (type !== UPDATE_WAYPOINTS$1) {\n        context.allowed = false;\n      }\n    });\n\n    eventBus.on('bendpoint.move.end', function(event) {\n      var context = event.context,\n          allowed = context.allowed,\n          bendpointIndex = context.bendpointIndex,\n          connection = context.connection,\n          insert = context.insert,\n          newWaypoints = connection.waypoints.slice(),\n          source = context.source,\n          target = context.target,\n          type = context.type,\n          hints = context.hints || {};\n\n      // ensure integer values (important if zoom level was > 1 during move)\n      var docking = {\n        x: round$8(event.x),\n        y: round$8(event.y)\n      };\n\n      if (!allowed) {\n        return false;\n      }\n\n      if (type === UPDATE_WAYPOINTS$1) {\n        if (insert) {\n\n          // insert new bendpoint\n          newWaypoints.splice(bendpointIndex, 0, docking);\n        } else {\n\n          // swap previous waypoint with moved one\n          newWaypoints[bendpointIndex] = docking;\n        }\n\n        // pass hints about actual moved bendpoint\n        // useful for connection/label layout\n        hints.bendpointMove = {\n          insert: insert,\n          bendpointIndex: bendpointIndex\n        };\n\n        newWaypoints = this.cropWaypoints(connection, newWaypoints);\n\n        modeling.updateWaypoints(connection, filterRedundantWaypoints(newWaypoints), hints);\n      } else {\n        if (type === RECONNECT_START$1) {\n          hints.docking = 'source';\n\n          if (isReverse$2(context)) {\n            hints.docking = 'target';\n\n            hints.newWaypoints = newWaypoints.reverse();\n          }\n        } else if (type === RECONNECT_END$1) {\n          hints.docking = 'target';\n\n          if (isReverse$2(context)) {\n            hints.docking = 'source';\n\n            hints.newWaypoints = newWaypoints.reverse();\n          }\n        }\n\n        modeling.reconnect(connection, source, target, docking, hints);\n      }\n    }, this);\n  }\n\n  BendpointMove.$inject = [\n    'injector',\n    'eventBus',\n    'canvas',\n    'dragging',\n    'rules',\n    'modeling'\n  ];\n\n  BendpointMove.prototype.cropWaypoints = function(connection, newWaypoints) {\n    var connectionDocking = this._injector.get('connectionDocking', false);\n\n    if (!connectionDocking) {\n      return newWaypoints;\n    }\n\n    var waypoints = connection.waypoints;\n\n    connection.waypoints = newWaypoints;\n\n    connection.waypoints = connectionDocking.getCroppedWaypoints(connection);\n\n    newWaypoints = connection.waypoints;\n\n    connection.waypoints = waypoints;\n\n    return newWaypoints;\n  };\n\n\n  // helpers //////////\n\n  function isReverse$2(context) {\n    var hover = context.hover,\n        source = context.source,\n        target = context.target,\n        type = context.type;\n\n    if (type === RECONNECT_START$1) {\n      return hover && target && hover === target && source !== target;\n    }\n\n    if (type === RECONNECT_END$1) {\n      return hover && source && hover === source && source !== target;\n    }\n  }\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   *\n   * @typedef {import('../bendpoints/BendpointMove').default} BendpointMove\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   */\n\n  var RECONNECT_START = 'reconnectStart',\n      RECONNECT_END = 'reconnectEnd',\n      UPDATE_WAYPOINTS = 'updateWaypoints';\n\n  var MARKER_OK$4 = 'connect-ok',\n      MARKER_NOT_OK$4 = 'connect-not-ok',\n      MARKER_CONNECT_HOVER$1 = 'connect-hover',\n      MARKER_CONNECT_UPDATING$1 = 'djs-updating',\n      MARKER_ELEMENT_HIDDEN = 'djs-element-hidden';\n\n  var HIGH_PRIORITY$i = 1100;\n\n  /**\n   * Preview connection while moving bendpoints.\n   *\n   * @param {BendpointMove} bendpointMove\n   * @param {Injector} injector\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   */\n  function BendpointMovePreview(bendpointMove, injector, eventBus, canvas) {\n    this._injector = injector;\n\n    var connectionPreview = injector.get('connectionPreview', false);\n\n    eventBus.on('bendpoint.move.start', function(event) {\n      var context = event.context,\n          bendpointIndex = context.bendpointIndex,\n          connection = context.connection,\n          insert = context.insert,\n          waypoints = connection.waypoints,\n          newWaypoints = waypoints.slice();\n\n      context.waypoints = waypoints;\n\n      if (insert) {\n\n        // insert placeholder for new bendpoint\n        newWaypoints.splice(bendpointIndex, 0, { x: event.x, y: event.y });\n      }\n\n      connection.waypoints = newWaypoints;\n\n      // add dragger gfx\n      var draggerGfx = context.draggerGfx = addBendpoint(canvas.getLayer('overlays'));\n\n      classes(draggerGfx).add('djs-dragging');\n\n      canvas.addMarker(connection, MARKER_ELEMENT_HIDDEN);\n      canvas.addMarker(connection, MARKER_CONNECT_UPDATING$1);\n    });\n\n    eventBus.on('bendpoint.move.hover', function(event) {\n      var context = event.context,\n          allowed = context.allowed,\n          hover = context.hover,\n          type = context.type;\n\n      if (hover) {\n        canvas.addMarker(hover, MARKER_CONNECT_HOVER$1);\n\n        if (type === UPDATE_WAYPOINTS) {\n          return;\n        }\n\n        if (allowed) {\n          canvas.removeMarker(hover, MARKER_NOT_OK$4);\n          canvas.addMarker(hover, MARKER_OK$4);\n        } else if (allowed === false) {\n          canvas.removeMarker(hover, MARKER_OK$4);\n          canvas.addMarker(hover, MARKER_NOT_OK$4);\n        }\n      }\n    });\n\n    eventBus.on([\n      'bendpoint.move.out',\n      'bendpoint.move.cleanup'\n    ], HIGH_PRIORITY$i, function(event) {\n      var context = event.context,\n          hover = context.hover,\n          target = context.target;\n\n      if (hover) {\n        canvas.removeMarker(hover, MARKER_CONNECT_HOVER$1);\n        canvas.removeMarker(hover, target ? MARKER_OK$4 : MARKER_NOT_OK$4);\n      }\n    });\n\n    eventBus.on('bendpoint.move.move', function(event) {\n      var context = event.context,\n          allowed = context.allowed,\n          bendpointIndex = context.bendpointIndex,\n          draggerGfx = context.draggerGfx,\n          hover = context.hover,\n          type = context.type,\n          connection = context.connection,\n          source = connection.source,\n          target = connection.target,\n          newWaypoints = connection.waypoints.slice(),\n          bendpoint = { x: event.x, y: event.y },\n          hints = context.hints || {},\n          drawPreviewHints = {};\n\n      if (connectionPreview) {\n        if (hints.connectionStart) {\n          drawPreviewHints.connectionStart = hints.connectionStart;\n        }\n\n        if (hints.connectionEnd) {\n          drawPreviewHints.connectionEnd = hints.connectionEnd;\n        }\n\n\n        if (type === RECONNECT_START) {\n          if (isReverse$2(context)) {\n            drawPreviewHints.connectionEnd = drawPreviewHints.connectionEnd || bendpoint;\n\n            drawPreviewHints.source = target;\n            drawPreviewHints.target = hover || source;\n\n            newWaypoints = newWaypoints.reverse();\n          } else {\n            drawPreviewHints.connectionStart = drawPreviewHints.connectionStart || bendpoint;\n\n            drawPreviewHints.source = hover || source;\n            drawPreviewHints.target = target;\n          }\n        } else if (type === RECONNECT_END) {\n          if (isReverse$2(context)) {\n            drawPreviewHints.connectionStart = drawPreviewHints.connectionStart || bendpoint;\n\n            drawPreviewHints.source = hover || target;\n            drawPreviewHints.target = source;\n\n            newWaypoints = newWaypoints.reverse();\n          } else {\n            drawPreviewHints.connectionEnd = drawPreviewHints.connectionEnd || bendpoint;\n\n            drawPreviewHints.source = source;\n            drawPreviewHints.target = hover || target;\n          }\n\n        } else {\n          drawPreviewHints.noCropping = true;\n          drawPreviewHints.noLayout = true;\n          newWaypoints[ bendpointIndex ] = bendpoint;\n        }\n\n        if (type === UPDATE_WAYPOINTS) {\n          newWaypoints = bendpointMove.cropWaypoints(connection, newWaypoints);\n        }\n\n        drawPreviewHints.waypoints = newWaypoints;\n\n        connectionPreview.drawPreview(context, allowed, drawPreviewHints);\n      }\n\n      translate$2(draggerGfx, event.x, event.y);\n    }, this);\n\n    eventBus.on([\n      'bendpoint.move.end',\n      'bendpoint.move.cancel'\n    ], HIGH_PRIORITY$i, function(event) {\n      var context = event.context,\n          connection = context.connection,\n          draggerGfx = context.draggerGfx,\n          hover = context.hover,\n          target = context.target,\n          waypoints = context.waypoints;\n\n      connection.waypoints = waypoints;\n\n      // remove dragger gfx\n      remove$1(draggerGfx);\n\n      canvas.removeMarker(connection, MARKER_CONNECT_UPDATING$1);\n      canvas.removeMarker(connection, MARKER_ELEMENT_HIDDEN);\n\n      if (hover) {\n        canvas.removeMarker(hover, MARKER_OK$4);\n        canvas.removeMarker(hover, target ? MARKER_OK$4 : MARKER_NOT_OK$4);\n      }\n\n      if (connectionPreview) {\n        connectionPreview.cleanUp(context);\n      }\n    });\n  }\n\n  BendpointMovePreview.$inject = [\n    'bendpointMove',\n    'injector',\n    'eventBus',\n    'canvas'\n  ];\n\n  var MARKER_CONNECT_HOVER = 'connect-hover',\n      MARKER_CONNECT_UPDATING = 'djs-updating';\n\n  /**\n   * @typedef {import('../../model/Types').Shape} Shape\n   *\n   * @typedef {import('../../util/Types').Axis} Axis\n   * @typedef {import('../../util/Types').Point} Point\n   *\n   * @typedef {import('didi').Injector} Injector\n   *\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../dragging/Dragging').default} Dragging\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../../core/GraphicsFactory').default} GraphicsFactory\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   */\n\n  function axisAdd(point, axis, delta) {\n    return axisSet(point, axis, point[axis] + delta);\n  }\n\n  function axisSet(point, axis, value) {\n    return {\n      x: (axis === 'x' ? value : point.x),\n      y: (axis === 'y' ? value : point.y)\n    };\n  }\n\n  function axisFenced(position, segmentStart, segmentEnd, axis) {\n\n    var maxValue = Math.max(segmentStart[axis], segmentEnd[axis]),\n        minValue = Math.min(segmentStart[axis], segmentEnd[axis]);\n\n    var padding = 20;\n\n    var fencedValue = Math.min(Math.max(minValue + padding, position[axis]), maxValue - padding);\n\n    return axisSet(segmentStart, axis, fencedValue);\n  }\n\n  function flipAxis(axis) {\n    return axis === 'x' ? 'y' : 'x';\n  }\n\n  /**\n   * Get the docking point on the given element.\n   *\n   * Compute a reasonable docking, if non exists.\n   *\n   * @param {Point} point\n   * @param {Shape} referenceElement\n   * @param {Axis} moveAxis\n   *\n   * @return {Point}\n   */\n  function getDocking$2(point, referenceElement, moveAxis) {\n\n    var referenceMid,\n        inverseAxis;\n\n    if (point.original) {\n      return point.original;\n    } else {\n      referenceMid = getMid(referenceElement);\n      inverseAxis = flipAxis(moveAxis);\n\n      return axisSet(point, inverseAxis, referenceMid[inverseAxis]);\n    }\n  }\n\n  /**\n   * A component that implements moving of bendpoints.\n   *\n   * @param {Injector} injector\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {Canvas} dragging\n   * @param {GraphicsFactory} graphicsFactory\n   * @param {Modeling} modeling\n   */\n  function ConnectionSegmentMove(\n      injector, eventBus, canvas,\n      dragging, graphicsFactory, modeling) {\n\n    // optional connection docking integration\n    var connectionDocking = injector.get('connectionDocking', false);\n\n\n    // API\n\n    this.start = function(event, connection, idx) {\n\n      var context,\n          gfx = canvas.getGraphics(connection),\n          segmentStartIndex = idx - 1,\n          segmentEndIndex = idx,\n          waypoints = connection.waypoints,\n          segmentStart = waypoints[segmentStartIndex],\n          segmentEnd = waypoints[segmentEndIndex],\n          intersection = getConnectionIntersection(canvas, waypoints, event),\n          direction, axis, dragPosition;\n\n      direction = pointsAligned(segmentStart, segmentEnd);\n\n      // do not move diagonal connection\n      if (!direction) {\n        return;\n      }\n\n      // the axis where we are going to move things\n      axis = direction === 'v' ? 'x' : 'y';\n\n      if (segmentStartIndex === 0) {\n        segmentStart = getDocking$2(segmentStart, connection.source, axis);\n      }\n\n      if (segmentEndIndex === waypoints.length - 1) {\n        segmentEnd = getDocking$2(segmentEnd, connection.target, axis);\n      }\n\n      if (intersection) {\n        dragPosition = intersection.point;\n      } else {\n\n        // set to segment center as default\n        dragPosition = {\n          x: (segmentStart.x + segmentEnd.x) / 2,\n          y: (segmentStart.y + segmentEnd.y) / 2\n        };\n      }\n\n      context = {\n        connection: connection,\n        segmentStartIndex: segmentStartIndex,\n        segmentEndIndex: segmentEndIndex,\n        segmentStart: segmentStart,\n        segmentEnd: segmentEnd,\n        axis: axis,\n        dragPosition: dragPosition\n      };\n\n      dragging.init(event, dragPosition, 'connectionSegment.move', {\n        cursor: axis === 'x' ? 'resize-ew' : 'resize-ns',\n        data: {\n          connection: connection,\n          connectionGfx: gfx,\n          context: context\n        }\n      });\n    };\n\n    /**\n     * Crop connection if connection cropping is provided.\n     *\n     * @param {Connection} connection\n     * @param {Point[]} newWaypoints\n     *\n     * @return {Point[]} cropped connection waypoints\n     */\n    function cropConnection(connection, newWaypoints) {\n\n      // crop connection, if docking service is provided only\n      if (!connectionDocking) {\n        return newWaypoints;\n      }\n\n      var oldWaypoints = connection.waypoints,\n          croppedWaypoints;\n\n      // temporary set new waypoints\n      connection.waypoints = newWaypoints;\n\n      croppedWaypoints = connectionDocking.getCroppedWaypoints(connection);\n\n      // restore old waypoints\n      connection.waypoints = oldWaypoints;\n\n      return croppedWaypoints;\n    }\n\n    // DRAGGING IMPLEMENTATION\n\n    function redrawConnection(data) {\n      graphicsFactory.update('connection', data.connection, data.connectionGfx);\n    }\n\n    function updateDragger(context, segmentOffset, event) {\n\n      var newWaypoints = context.newWaypoints,\n          segmentStartIndex = context.segmentStartIndex + segmentOffset,\n          segmentStart = newWaypoints[segmentStartIndex],\n          segmentEndIndex = context.segmentEndIndex + segmentOffset,\n          segmentEnd = newWaypoints[segmentEndIndex],\n          axis = flipAxis(context.axis);\n\n      // make sure the dragger does not move\n      // outside the connection\n      var draggerPosition = axisFenced(event, segmentStart, segmentEnd, axis);\n\n      // update dragger\n      translate$2(context.draggerGfx, draggerPosition.x, draggerPosition.y);\n    }\n\n    /**\n     * Filter waypoints for redundant ones (i.e. on the same axis).\n     * Returns the filtered waypoints and the offset related to the segment move.\n     *\n     * @param {Point[]} waypoints\n     * @param {Integer} segmentStartIndex of moved segment start\n     *\n     * @return {Object} { filteredWaypoints, segmentOffset }\n     */\n    function filterRedundantWaypoints(waypoints, segmentStartIndex) {\n\n      var segmentOffset = 0;\n\n      var filteredWaypoints = waypoints.filter(function(r, idx) {\n        if (pointsOnLine(waypoints[idx - 1], waypoints[idx + 1], r)) {\n\n          // remove point and increment offset\n          segmentOffset = idx <= segmentStartIndex ? segmentOffset - 1 : segmentOffset;\n          return false;\n        }\n\n        // dont remove point\n        return true;\n      });\n\n      return {\n        waypoints: filteredWaypoints,\n        segmentOffset: segmentOffset\n      };\n    }\n\n    eventBus.on('connectionSegment.move.start', function(event) {\n\n      var context = event.context,\n          connection = event.connection,\n          layer = canvas.getLayer('overlays');\n\n      context.originalWaypoints = connection.waypoints.slice();\n\n      // add dragger gfx\n      context.draggerGfx = addSegmentDragger(layer, context.segmentStart, context.segmentEnd);\n      classes(context.draggerGfx).add('djs-dragging');\n\n      canvas.addMarker(connection, MARKER_CONNECT_UPDATING);\n    });\n\n    eventBus.on('connectionSegment.move.move', function(event) {\n\n      var context = event.context,\n          connection = context.connection,\n          segmentStartIndex = context.segmentStartIndex,\n          segmentEndIndex = context.segmentEndIndex,\n          segmentStart = context.segmentStart,\n          segmentEnd = context.segmentEnd,\n          axis = context.axis;\n\n      var newWaypoints = context.originalWaypoints.slice(),\n          newSegmentStart = axisAdd(segmentStart, axis, event['d' + axis]),\n          newSegmentEnd = axisAdd(segmentEnd, axis, event['d' + axis]);\n\n      // original waypoint count and added / removed\n      // from start waypoint delta. We use the later\n      // to retrieve the updated segmentStartIndex / segmentEndIndex\n      var waypointCount = newWaypoints.length,\n          segmentOffset = 0;\n\n      // move segment start / end by axis delta\n      newWaypoints[segmentStartIndex] = newSegmentStart;\n      newWaypoints[segmentEndIndex] = newSegmentEnd;\n\n      var sourceToSegmentOrientation,\n          targetToSegmentOrientation;\n\n      // handle first segment\n      if (segmentStartIndex < 2) {\n        sourceToSegmentOrientation = getOrientation(connection.source, newSegmentStart);\n\n        // first bendpoint, remove first segment if intersecting\n        if (segmentStartIndex === 1) {\n\n          if (sourceToSegmentOrientation === 'intersect') {\n            newWaypoints.shift();\n            newWaypoints[0] = newSegmentStart;\n            segmentOffset--;\n          }\n        }\n\n        // docking point, add segment if not intersecting anymore\n        else {\n          if (sourceToSegmentOrientation !== 'intersect') {\n            newWaypoints.unshift(segmentStart);\n            segmentOffset++;\n          }\n        }\n      }\n\n      // handle last segment\n      if (segmentEndIndex > waypointCount - 3) {\n        targetToSegmentOrientation = getOrientation(connection.target, newSegmentEnd);\n\n        // last bendpoint, remove last segment if intersecting\n        if (segmentEndIndex === waypointCount - 2) {\n\n          if (targetToSegmentOrientation === 'intersect') {\n            newWaypoints.pop();\n            newWaypoints[newWaypoints.length - 1] = newSegmentEnd;\n          }\n        }\n\n        // last bendpoint, remove last segment if intersecting\n        else {\n          if (targetToSegmentOrientation !== 'intersect') {\n            newWaypoints.push(segmentEnd);\n          }\n        }\n      }\n\n      // update connection waypoints\n      context.newWaypoints = connection.waypoints = cropConnection(connection, newWaypoints);\n\n      // update dragger position\n      updateDragger(context, segmentOffset, event);\n\n      // save segmentOffset in context\n      context.newSegmentStartIndex = segmentStartIndex + segmentOffset;\n\n      // redraw connection\n      redrawConnection(event);\n    });\n\n    eventBus.on('connectionSegment.move.hover', function(event) {\n\n      event.context.hover = event.hover;\n      canvas.addMarker(event.hover, MARKER_CONNECT_HOVER);\n    });\n\n    eventBus.on([\n      'connectionSegment.move.out',\n      'connectionSegment.move.cleanup'\n    ], function(event) {\n\n      // remove connect marker\n      // if it was added\n      var hover = event.context.hover;\n\n      if (hover) {\n        canvas.removeMarker(hover, MARKER_CONNECT_HOVER);\n      }\n    });\n\n    eventBus.on('connectionSegment.move.cleanup', function(event) {\n\n      var context = event.context,\n          connection = context.connection;\n\n      // remove dragger gfx\n      if (context.draggerGfx) {\n        remove$1(context.draggerGfx);\n      }\n\n      canvas.removeMarker(connection, MARKER_CONNECT_UPDATING);\n    });\n\n    eventBus.on([\n      'connectionSegment.move.cancel',\n      'connectionSegment.move.end'\n    ], function(event) {\n      var context = event.context,\n          connection = context.connection;\n\n      connection.waypoints = context.originalWaypoints;\n\n      redrawConnection(event);\n    });\n\n    eventBus.on('connectionSegment.move.end', function(event) {\n\n      var context = event.context,\n          connection = context.connection,\n          newWaypoints = context.newWaypoints,\n          newSegmentStartIndex = context.newSegmentStartIndex;\n\n      // ensure we have actual pixel values bendpoint\n      // coordinates (important when zoom level was > 1 during move)\n      newWaypoints = newWaypoints.map(function(p) {\n        return {\n          original: p.original,\n          x: Math.round(p.x),\n          y: Math.round(p.y)\n        };\n      });\n\n      // apply filter redunant waypoints\n      var filtered = filterRedundantWaypoints(newWaypoints, newSegmentStartIndex);\n\n      // get filtered waypoints\n      var filteredWaypoints = filtered.waypoints,\n          croppedWaypoints = cropConnection(connection, filteredWaypoints),\n          segmentOffset = filtered.segmentOffset;\n\n      var hints = {\n        segmentMove: {\n          segmentStartIndex: context.segmentStartIndex,\n          newSegmentStartIndex: newSegmentStartIndex + segmentOffset\n        }\n      };\n\n      modeling.updateWaypoints(connection, croppedWaypoints, hints);\n    });\n  }\n\n  ConnectionSegmentMove.$inject = [\n    'injector',\n    'eventBus',\n    'canvas',\n    'dragging',\n    'graphicsFactory',\n    'modeling'\n  ];\n\n  /**\n   * @typedef {import('../../core/Types').ConnectionLike} Connection\n   * @typedef {import('../../core/Types').ShapeLike} Shape\n   *\n   * @typedef {import('../../core/EventBus').Event} Event\n   *\n   * @typedef {import('../../util/Types').Axis} Axis\n   */\n\n  var abs$6 = Math.abs,\n      round$7 = Math.round;\n\n\n  /**\n   * Snap value to a collection of reference values.\n   *\n   * @param {number} value\n   * @param {Array<number>} values\n   * @param {number} [tolerance=10]\n   *\n   * @return {number} the value we snapped to or null, if none snapped\n   */\n  function snapTo(value, values, tolerance) {\n    tolerance = tolerance === undefined ? 10 : tolerance;\n\n    var idx, snapValue;\n\n    for (idx = 0; idx < values.length; idx++) {\n      snapValue = values[idx];\n\n      if (abs$6(snapValue - value) <= tolerance) {\n        return snapValue;\n      }\n    }\n  }\n\n\n  function topLeft(bounds) {\n    return {\n      x: bounds.x,\n      y: bounds.y\n    };\n  }\n\n  function bottomRight(bounds) {\n    return {\n      x: bounds.x + bounds.width,\n      y: bounds.y + bounds.height\n    };\n  }\n\n  function mid$2(bounds, defaultValue) {\n\n    if (!bounds || isNaN(bounds.x) || isNaN(bounds.y)) {\n      return defaultValue;\n    }\n\n    return {\n      x: round$7(bounds.x + bounds.width / 2),\n      y: round$7(bounds.y + bounds.height / 2)\n    };\n  }\n\n\n  /**\n   * Retrieve the snap state of the given event.\n   *\n   * @param {Event} event\n   * @param {Axis} axis\n   *\n   * @return {boolean} the snapped state\n   *\n   */\n  function isSnapped(event, axis) {\n    var snapped = event.snapped;\n\n    if (!snapped) {\n      return false;\n    }\n\n    if (typeof axis === 'string') {\n      return snapped[axis];\n    }\n\n    return snapped.x && snapped.y;\n  }\n\n\n  /**\n   * Set the given event as snapped.\n   *\n   * This method may change the x and/or y position of the shape\n   * from the given event!\n   *\n   * @param {Event} event\n   * @param {Axis} axis\n   * @param {number|boolean} value\n   *\n   * @return {number} old value\n   */\n  function setSnapped(event, axis, value) {\n    if (typeof axis !== 'string') {\n      throw new Error('axis must be in [x, y]');\n    }\n\n    if (typeof value !== 'number' && value !== false) {\n      throw new Error('value must be Number or false');\n    }\n\n    var delta,\n        previousValue = event[axis];\n\n    var snapped = event.snapped = (event.snapped || {});\n\n\n    if (value === false) {\n      snapped[axis] = false;\n    } else {\n      snapped[axis] = true;\n\n      delta = value - previousValue;\n\n      event[axis] += delta;\n      event['d' + axis] += delta;\n    }\n\n    return previousValue;\n  }\n\n  /**\n   * Get children of a shape.\n   *\n   * @param {Shape} parent\n   *\n   * @return {Array<Shape|Connection>}\n   */\n  function getChildren(parent) {\n    return parent.children || [];\n  }\n\n  /**\n   * @typedef {import('../../core/EventBus').default} EventBus\n   */\n  var abs$5 = Math.abs,\n      round$6 = Math.round;\n\n  var TOLERANCE = 10;\n\n  /**\n   * @param {EventBus} eventBus\n   */\n  function BendpointSnapping(eventBus) {\n\n    function snapTo(values, value) {\n\n      if (isArray$3(values)) {\n        var i = values.length;\n\n        while (i--) if (abs$5(values[i] - value) <= TOLERANCE) {\n          return values[i];\n        }\n      } else {\n        values = +values;\n        var rem = value % values;\n\n        if (rem < TOLERANCE) {\n          return value - rem;\n        }\n\n        if (rem > values - TOLERANCE) {\n          return value - rem + values;\n        }\n      }\n\n      return value;\n    }\n\n    function getSnapPoint(element, event) {\n\n      if (element.waypoints) {\n        return getClosestPointOnConnection(event, element);\n      }\n\n      if (element.width) {\n        return {\n          x: round$6(element.width / 2 + element.x),\n          y: round$6(element.height / 2 + element.y)\n        };\n      }\n    }\n\n    // connection segment snapping //////////////////////\n\n    function getConnectionSegmentSnaps(event) {\n\n      var context = event.context,\n          snapPoints = context.snapPoints,\n          connection = context.connection,\n          waypoints = connection.waypoints,\n          segmentStart = context.segmentStart,\n          segmentStartIndex = context.segmentStartIndex,\n          segmentEnd = context.segmentEnd,\n          segmentEndIndex = context.segmentEndIndex,\n          axis = context.axis;\n\n      if (snapPoints) {\n        return snapPoints;\n      }\n\n      var referenceWaypoints = [\n        waypoints[segmentStartIndex - 1],\n        segmentStart,\n        segmentEnd,\n        waypoints[segmentEndIndex + 1]\n      ];\n\n      if (segmentStartIndex < 2) {\n        referenceWaypoints.unshift(getSnapPoint(connection.source, event));\n      }\n\n      if (segmentEndIndex > waypoints.length - 3) {\n        referenceWaypoints.unshift(getSnapPoint(connection.target, event));\n      }\n\n      context.snapPoints = snapPoints = { horizontal: [] , vertical: [] };\n\n      forEach$1(referenceWaypoints, function(p) {\n\n        // we snap on existing bendpoints only,\n        // not placeholders that are inserted during add\n        if (p) {\n          p = p.original || p;\n\n          if (axis === 'y') {\n            snapPoints.horizontal.push(p.y);\n          }\n\n          if (axis === 'x') {\n            snapPoints.vertical.push(p.x);\n          }\n        }\n      });\n\n      return snapPoints;\n    }\n\n    eventBus.on('connectionSegment.move.move', 1500, function(event) {\n      var snapPoints = getConnectionSegmentSnaps(event),\n          x = event.x,\n          y = event.y,\n          sx, sy;\n\n      if (!snapPoints) {\n        return;\n      }\n\n      // snap\n      sx = snapTo(snapPoints.vertical, x);\n      sy = snapTo(snapPoints.horizontal, y);\n\n\n      // correction x/y\n      var cx = (x - sx),\n          cy = (y - sy);\n\n      // update delta\n      assign$1(event, {\n        dx: event.dx - cx,\n        dy: event.dy - cy,\n        x: sx,\n        y: sy\n      });\n\n      // only set snapped if actually snapped\n      if (cx || snapPoints.vertical.indexOf(x) !== -1) {\n        setSnapped(event, 'x', sx);\n      }\n\n      if (cy || snapPoints.horizontal.indexOf(y) !== -1) {\n        setSnapped(event, 'y', sy);\n      }\n    });\n\n\n    // bendpoint snapping //////////////////////\n\n    function getBendpointSnaps(context) {\n\n      var snapPoints = context.snapPoints,\n          waypoints = context.connection.waypoints,\n          bendpointIndex = context.bendpointIndex;\n\n      if (snapPoints) {\n        return snapPoints;\n      }\n\n      var referenceWaypoints = [ waypoints[bendpointIndex - 1], waypoints[bendpointIndex + 1] ];\n\n      context.snapPoints = snapPoints = { horizontal: [] , vertical: [] };\n\n      forEach$1(referenceWaypoints, function(p) {\n\n        // we snap on existing bendpoints only,\n        // not placeholders that are inserted during add\n        if (p) {\n          p = p.original || p;\n\n          snapPoints.horizontal.push(p.y);\n          snapPoints.vertical.push(p.x);\n        }\n      });\n\n      return snapPoints;\n    }\n\n    // Snap Endpoint of new connection\n    eventBus.on([\n      'connect.hover',\n      'connect.move',\n      'connect.end'\n    ], 1500, function(event) {\n      var context = event.context,\n          hover = context.hover,\n          hoverMid = hover && getSnapPoint(hover, event);\n\n      // only snap on connections, elements can have multiple connect endpoints\n      if (!isConnection(hover) || !hoverMid || !hoverMid.x || !hoverMid.y) {\n        return;\n      }\n\n      setSnapped(event, 'x', hoverMid.x);\n      setSnapped(event, 'y', hoverMid.y);\n    });\n\n    eventBus.on([ 'bendpoint.move.move', 'bendpoint.move.end' ], 1500, function(event) {\n\n      var context = event.context,\n          snapPoints = getBendpointSnaps(context),\n          hover = context.hover,\n          hoverMid = hover && getSnapPoint(hover, event),\n          x = event.x,\n          y = event.y,\n          sx, sy;\n\n      if (!snapPoints) {\n        return;\n      }\n\n      // snap to hover mid\n      sx = snapTo(hoverMid ? snapPoints.vertical.concat([ hoverMid.x ]) : snapPoints.vertical, x);\n      sy = snapTo(hoverMid ? snapPoints.horizontal.concat([ hoverMid.y ]) : snapPoints.horizontal, y);\n\n      // correction x/y\n      var cx = (x - sx),\n          cy = (y - sy);\n\n      // update delta\n      assign$1(event, {\n        dx: event.dx - cx,\n        dy: event.dy - cy,\n        x: event.x - cx,\n        y: event.y - cy\n      });\n\n      // only set snapped if actually snapped\n      if (cx || snapPoints.vertical.indexOf(x) !== -1) {\n        setSnapped(event, 'x', sx);\n      }\n\n      if (cy || snapPoints.horizontal.indexOf(y) !== -1) {\n        setSnapped(event, 'y', sy);\n      }\n    });\n  }\n\n\n  BendpointSnapping.$inject = [ 'eventBus' ];\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var BendpointsModule = {\n    __depends__: [\n      DraggingModule,\n      RulesModule$1\n    ],\n    __init__: [ 'bendpoints', 'bendpointSnapping', 'bendpointMovePreview' ],\n    bendpoints: [ 'type', Bendpoints ],\n    bendpointMove: [ 'type', BendpointMove ],\n    bendpointMovePreview: [ 'type', BendpointMovePreview ],\n    connectionSegmentMove: [ 'type', ConnectionSegmentMove ],\n    bendpointSnapping: [ 'type', BendpointSnapping ]\n  };\n\n  /**\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef {import('../../util/Types').Point} Point\n   *\n   * @typedef {import('../dragging/Dragging').default} Dragging\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   * @typedef {import('../rules/Rules').default} Rules\n   */\n\n  /**\n   * @param {EventBus} eventBus\n   * @param {Dragging} dragging\n   * @param {Modeling} modeling\n   * @param {Rules} rules\n   */\n  function Connect(eventBus, dragging, modeling, rules) {\n\n    // rules\n\n    function canConnect(source, target) {\n      return rules.allowed('connection.create', {\n        source: source,\n        target: target\n      });\n    }\n\n    function canConnectReverse(source, target) {\n      return canConnect(target, source);\n    }\n\n\n    // event handlers\n\n    eventBus.on('connect.hover', function(event) {\n      var context = event.context,\n          start = context.start,\n          hover = event.hover,\n          canExecute;\n\n      // cache hover state\n      context.hover = hover;\n\n      canExecute = context.canExecute = canConnect(start, hover);\n\n      // ignore hover\n      if (isNil(canExecute)) {\n        return;\n      }\n\n      if (canExecute !== false) {\n        context.source = start;\n        context.target = hover;\n\n        return;\n      }\n\n      canExecute = context.canExecute = canConnectReverse(start, hover);\n\n      // ignore hover\n      if (isNil(canExecute)) {\n        return;\n      }\n\n      if (canExecute !== false) {\n        context.source = hover;\n        context.target = start;\n      }\n    });\n\n    eventBus.on([ 'connect.out', 'connect.cleanup' ], function(event) {\n      var context = event.context;\n\n      context.hover = null;\n      context.source = null;\n      context.target = null;\n\n      context.canExecute = false;\n    });\n\n    eventBus.on('connect.end', function(event) {\n      var context = event.context,\n          canExecute = context.canExecute,\n          connectionStart = context.connectionStart,\n          connectionEnd = {\n            x: event.x,\n            y: event.y\n          },\n          source = context.source,\n          target = context.target;\n\n      if (!canExecute) {\n        return false;\n      }\n\n      var attrs = null,\n          hints = {\n            connectionStart: isReverse$1(context) ? connectionEnd : connectionStart,\n            connectionEnd: isReverse$1(context) ? connectionStart : connectionEnd\n          };\n\n      if (isObject(canExecute)) {\n        attrs = canExecute;\n      }\n\n      context.connection = modeling.connect(source, target, attrs, hints);\n    });\n\n\n    // API\n\n    /**\n     * Start connect operation.\n     *\n     * @param {MouseEvent|TouchEvent} event\n     * @param {Element} start\n     * @param {Point} [connectionStart]\n     * @param {boolean} [autoActivate=false]\n     */\n    this.start = function(event, start, connectionStart, autoActivate) {\n      if (!isObject(connectionStart)) {\n        autoActivate = connectionStart;\n        connectionStart = getMid(start);\n      }\n\n      dragging.init(event, 'connect', {\n        autoActivate: autoActivate,\n        data: {\n          shape: start,\n          context: {\n            start: start,\n            connectionStart: connectionStart\n          }\n        }\n      });\n    };\n  }\n\n  Connect.$inject = [\n    'eventBus',\n    'dragging',\n    'modeling',\n    'rules'\n  ];\n\n\n  // helpers //////////\n\n  function isReverse$1(context) {\n    var hover = context.hover,\n        source = context.source,\n        target = context.target;\n\n    return hover && source && hover === source && source !== target;\n  }\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   *\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   */\n\n  var HIGH_PRIORITY$h = 1100,\n      LOW_PRIORITY$j = 900;\n\n  var MARKER_OK$3 = 'connect-ok',\n      MARKER_NOT_OK$3 = 'connect-not-ok';\n\n  /**\n   * Shows connection preview during connect.\n   *\n   * @param {Injector} injector\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   */\n  function ConnectPreview(injector, eventBus, canvas) {\n    var connectionPreview = injector.get('connectionPreview', false);\n\n    connectionPreview && eventBus.on('connect.move', function(event) {\n      var context = event.context,\n          canConnect = context.canExecute,\n          hover = context.hover,\n          source = context.source,\n          start = context.start,\n          startPosition = context.startPosition,\n          target = context.target,\n          connectionStart = context.connectionStart || startPosition,\n          connectionEnd = context.connectionEnd || {\n            x: event.x,\n            y: event.y\n          },\n          previewStart = connectionStart,\n          previewEnd = connectionEnd;\n\n      if (isReverse$1(context)) {\n        previewStart = connectionEnd;\n        previewEnd = connectionStart;\n      }\n\n      connectionPreview.drawPreview(context, canConnect, {\n        source: source || start,\n        target: target || hover,\n        connectionStart: previewStart,\n        connectionEnd: previewEnd\n      });\n    });\n\n    eventBus.on('connect.hover', LOW_PRIORITY$j, function(event) {\n      var context = event.context,\n          hover = event.hover,\n          canExecute = context.canExecute;\n\n      // ignore hover\n      if (canExecute === null) {\n        return;\n      }\n\n      canvas.addMarker(hover, canExecute ? MARKER_OK$3 : MARKER_NOT_OK$3);\n    });\n\n    eventBus.on([\n      'connect.out',\n      'connect.cleanup'\n    ], HIGH_PRIORITY$h, function(event) {\n      var hover = event.hover;\n\n      if (hover) {\n        canvas.removeMarker(hover, MARKER_OK$3);\n        canvas.removeMarker(hover, MARKER_NOT_OK$3);\n      }\n    });\n\n    connectionPreview && eventBus.on('connect.cleanup', function(event) {\n      connectionPreview.cleanUp(event.context);\n    });\n  }\n\n  ConnectPreview.$inject = [\n    'injector',\n    'eventBus',\n    'canvas'\n  ];\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var ConnectModule = {\n    __depends__: [\n      SelectionModule,\n      RulesModule$1,\n      DraggingModule\n    ],\n    __init__: [\n      'connectPreview'\n    ],\n    connect: [ 'type', Connect ],\n    connectPreview: [ 'type', ConnectPreview ]\n  };\n\n  /**\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Connection} Connection\n   * @typedef {import('../../model/Types').Shape} Shape\n   *\n   * @typedef {import('../../util/Types').Point} Point\n   *\n   * @typedef {import('didi').Injector} Injector\n   *\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/ElementFactory').default} ElementFactory\n   * @typedef {import('../../core/GraphicsFactory').default} GraphicsFactory\n   */\n\n  var MARKER_CONNECTION_PREVIEW = 'djs-connection-preview';\n\n  /**\n   * Draws connection preview. Optionally, this can use layouter and connection docking to draw\n   * better looking previews.\n   *\n   * @param {Injector} injector\n   * @param {Canvas} canvas\n   * @param {GraphicsFactory} graphicsFactory\n   * @param {ElementFactory} elementFactory\n   */\n  function ConnectionPreview(\n      injector,\n      canvas,\n      graphicsFactory,\n      elementFactory\n  ) {\n    this._canvas = canvas;\n    this._graphicsFactory = graphicsFactory;\n    this._elementFactory = elementFactory;\n\n    // optional components\n    this._connectionDocking = injector.get('connectionDocking', false);\n    this._layouter = injector.get('layouter', false);\n  }\n\n  ConnectionPreview.$inject = [\n    'injector',\n    'canvas',\n    'graphicsFactory',\n    'elementFactory'\n  ];\n\n  /**\n   * Draw connection preview.\n   *\n   * Provide at least one of <source, connectionStart> and <target, connectionEnd> to create a preview.\n   * In the clean up stage, call `connectionPreview#cleanUp` with the context to remove preview.\n   *\n   * @param {Object} context\n   * @param {Object|boolean} canConnect\n   * @param {Object} hints\n   * @param {Element} [hints.source] source element\n   * @param {Element} [hints.target] target element\n   * @param {Point} [hints.connectionStart] connection preview start\n   * @param {Point} [hints.connectionEnd] connection preview end\n   * @param {Point[]} [hints.waypoints] provided waypoints for preview\n   * @param {boolean} [hints.noLayout] true if preview should not be laid out\n   * @param {boolean} [hints.noCropping] true if preview should not be cropped\n   * @param {boolean} [hints.noNoop] true if simple connection should not be drawn\n   */\n  ConnectionPreview.prototype.drawPreview = function(context, canConnect, hints) {\n\n    hints = hints || {};\n\n    var connectionPreviewGfx = context.connectionPreviewGfx,\n        getConnection = context.getConnection,\n        source = hints.source,\n        target = hints.target,\n        waypoints = hints.waypoints,\n        connectionStart = hints.connectionStart,\n        connectionEnd = hints.connectionEnd,\n        noLayout = hints.noLayout,\n        noCropping = hints.noCropping,\n        noNoop = hints.noNoop,\n        connection;\n\n    var self = this;\n\n    if (!connectionPreviewGfx) {\n      connectionPreviewGfx = context.connectionPreviewGfx = this.createConnectionPreviewGfx();\n    }\n\n    clear(connectionPreviewGfx);\n\n    if (!getConnection) {\n      getConnection = context.getConnection = cacheReturnValues(function(canConnect, source, target) {\n        return self.getConnection(canConnect, source, target);\n      });\n    }\n\n    if (canConnect) {\n      connection = getConnection(canConnect, source, target);\n    }\n\n    if (!connection) {\n      !noNoop && this.drawNoopPreview(connectionPreviewGfx, hints);\n      return;\n    }\n\n    connection.waypoints = waypoints || [];\n\n    // optional layout\n    if (this._layouter && !noLayout) {\n      connection.waypoints = this._layouter.layoutConnection(connection, {\n        source: source,\n        target: target,\n        connectionStart: connectionStart,\n        connectionEnd: connectionEnd,\n        waypoints: hints.waypoints || connection.waypoints\n      });\n    }\n\n    // fallback if no waypoints were provided nor created with layouter\n    if (!connection.waypoints || !connection.waypoints.length) {\n      connection.waypoints = [\n        source ? getMid(source) : connectionStart,\n        target ? getMid(target) : connectionEnd\n      ];\n    }\n\n    // optional cropping\n    if (this._connectionDocking && (source || target) && !noCropping) {\n      connection.waypoints = this._connectionDocking.getCroppedWaypoints(connection, source, target);\n    }\n\n    this._graphicsFactory.drawConnection(connectionPreviewGfx, connection);\n  };\n\n  /**\n   * Draw simple connection between source and target or provided points.\n   *\n   * @param {SVGElement} connectionPreviewGfx container for the connection\n   * @param {Object} hints\n   * @param {Element} [hints.source] source element\n   * @param {Element} [hints.target] target element\n   * @param {Point} [hints.connectionStart] required if source is not provided\n   * @param {Point} [hints.connectionEnd] required if target is not provided\n   */\n  ConnectionPreview.prototype.drawNoopPreview = function(connectionPreviewGfx, hints) {\n    var source = hints.source,\n        target = hints.target,\n        start = hints.connectionStart || getMid(source),\n        end = hints.connectionEnd || getMid(target);\n\n    var waypoints = this.cropWaypoints(start, end, source, target);\n\n    var connection = this.createNoopConnection(waypoints[0], waypoints[1]);\n\n    append(connectionPreviewGfx, connection);\n  };\n\n  /**\n   * Return cropped waypoints.\n   *\n   * @param {Point} start\n   * @param {Point} end\n   * @param {Element} source\n   * @param {Element} target\n   *\n   * @return {Point[]}\n   */\n  ConnectionPreview.prototype.cropWaypoints = function(start, end, source, target) {\n    var graphicsFactory = this._graphicsFactory,\n        sourcePath = source && graphicsFactory.getShapePath(source),\n        targetPath = target && graphicsFactory.getShapePath(target),\n        connectionPath = graphicsFactory.getConnectionPath({ waypoints: [ start, end ] });\n\n    start = (source && getElementLineIntersection(sourcePath, connectionPath, true)) || start;\n    end = (target && getElementLineIntersection(targetPath, connectionPath, false)) || end;\n\n    return [ start, end ];\n  };\n\n  /**\n   * Remove connection preview container if it exists.\n   *\n   * @param {Object} [context]\n   * @param {SVGElement} [context.connectionPreviewGfx] preview container\n   */\n  ConnectionPreview.prototype.cleanUp = function(context) {\n    if (context && context.connectionPreviewGfx) {\n      remove$1(context.connectionPreviewGfx);\n    }\n  };\n\n  /**\n   * Get connection that connects source and target.\n   *\n   * @param {Object|boolean} canConnect\n   *\n   * @return {Connection}\n   */\n  ConnectionPreview.prototype.getConnection = function(canConnect) {\n    var attrs = ensureConnectionAttrs(canConnect);\n\n    return this._elementFactory.createConnection(attrs);\n  };\n\n\n  /**\n   * Add and return preview graphics.\n   *\n   * @return {SVGElement}\n   */\n  ConnectionPreview.prototype.createConnectionPreviewGfx = function() {\n    var gfx = create$1('g');\n\n    attr(gfx, {\n      pointerEvents: 'none'\n    });\n\n    classes(gfx).add(MARKER_CONNECTION_PREVIEW);\n\n    append(this._canvas.getActiveLayer(), gfx);\n\n    return gfx;\n  };\n\n  /**\n   * Create and return simple connection.\n   *\n   * @param {Point} start\n   * @param {Point} end\n   *\n   * @return {SVGElement}\n   */\n  ConnectionPreview.prototype.createNoopConnection = function(start, end) {\n    return createLine([ start, end ], {\n      'stroke': '#333',\n      'strokeDasharray': [ 1 ],\n      'strokeWidth': 2,\n      'pointer-events': 'none'\n    });\n  };\n\n  // helpers //////////\n\n  /**\n   * Returns function that returns cached return values referenced by stringified first argument.\n   *\n   * @param {Function} fn\n   *\n   * @return {Function}\n   */\n  function cacheReturnValues(fn) {\n    var returnValues = {};\n\n    /**\n     * Return cached return value referenced by stringified first argument.\n     *\n     * @return {*}\n     */\n    return function(firstArgument) {\n      var key = JSON.stringify(firstArgument);\n\n      var returnValue = returnValues[key];\n\n      if (!returnValue) {\n        returnValue = returnValues[key] = fn.apply(null, arguments);\n      }\n\n      return returnValue;\n    };\n  }\n\n  /**\n   * Ensure connection attributes is object.\n   *\n   * @param {Object|boolean} canConnect\n   *\n   * @return {Object}\n   */\n  function ensureConnectionAttrs(canConnect) {\n    if (isObject(canConnect)) {\n      return canConnect;\n    } else {\n      return {};\n    }\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var ConnectionPreviewModule = {\n    __init__: [ 'connectionPreview' ],\n    connectionPreview: [ 'type', ConnectionPreview ]\n  };\n\n  var min$3 = Math.min,\n      max$5 = Math.max;\n\n  function preventDefault(e) {\n    e.preventDefault();\n  }\n\n  function stopPropagation(e) {\n    e.stopPropagation();\n  }\n\n  function isTextNode(node) {\n    return node.nodeType === Node.TEXT_NODE;\n  }\n\n  function toArray(nodeList) {\n    return [].slice.call(nodeList);\n  }\n\n  /**\n   * Initializes a container for a content editable div.\n   *\n   * Structure:\n   *\n   * container\n   *   parent\n   *     content\n   *     resize-handle\n   *\n   * @param {object} options\n   * @param {DOMElement} options.container The DOM element to append the contentContainer to\n   * @param {Function} options.keyHandler Handler for key events\n   * @param {Function} options.resizeHandler Handler for resize events\n   */\n  function TextBox(options) {\n    this.container = options.container;\n\n    this.parent = domify$1(\n      '<div class=\"djs-direct-editing-parent\">' +\n        '<div class=\"djs-direct-editing-content\" contenteditable=\"true\"></div>' +\n      '</div>'\n    );\n\n    this.content = query('[contenteditable]', this.parent);\n\n    this.keyHandler = options.keyHandler || function() {};\n    this.resizeHandler = options.resizeHandler || function() {};\n\n    this.autoResize = bind$2(this.autoResize, this);\n    this.handlePaste = bind$2(this.handlePaste, this);\n  }\n\n\n  /**\n   * Create a text box with the given position, size, style and text content\n   *\n   * @param {Object} bounds\n   * @param {Number} bounds.x absolute x position\n   * @param {Number} bounds.y absolute y position\n   * @param {Number} [bounds.width] fixed width value\n   * @param {Number} [bounds.height] fixed height value\n   * @param {Number} [bounds.maxWidth] maximum width value\n   * @param {Number} [bounds.maxHeight] maximum height value\n   * @param {Number} [bounds.minWidth] minimum width value\n   * @param {Number} [bounds.minHeight] minimum height value\n   * @param {Object} [style]\n   * @param {String} value text content\n   *\n   * @return {DOMElement} The created content DOM element\n   */\n  TextBox.prototype.create = function(bounds, style, value, options) {\n    var self = this;\n\n    var parent = this.parent,\n        content = this.content,\n        container = this.container;\n\n    options = this.options = options || {};\n\n    style = this.style = style || {};\n\n    var parentStyle = pick(style, [\n      'width',\n      'height',\n      'maxWidth',\n      'maxHeight',\n      'minWidth',\n      'minHeight',\n      'left',\n      'top',\n      'backgroundColor',\n      'position',\n      'overflow',\n      'border',\n      'wordWrap',\n      'textAlign',\n      'outline',\n      'transform'\n    ]);\n\n    assign$1(parent.style, {\n      width: bounds.width + 'px',\n      height: bounds.height + 'px',\n      maxWidth: bounds.maxWidth + 'px',\n      maxHeight: bounds.maxHeight + 'px',\n      minWidth: bounds.minWidth + 'px',\n      minHeight: bounds.minHeight + 'px',\n      left: bounds.x + 'px',\n      top: bounds.y + 'px',\n      backgroundColor: '#ffffff',\n      position: 'absolute',\n      overflow: 'visible',\n      border: '1px solid #ccc',\n      boxSizing: 'border-box',\n      wordWrap: 'normal',\n      textAlign: 'center',\n      outline: 'none'\n    }, parentStyle);\n\n    var contentStyle = pick(style, [\n      'fontFamily',\n      'fontSize',\n      'fontWeight',\n      'lineHeight',\n      'padding',\n      'paddingTop',\n      'paddingRight',\n      'paddingBottom',\n      'paddingLeft'\n    ]);\n\n    assign$1(content.style, {\n      boxSizing: 'border-box',\n      width: '100%',\n      outline: 'none',\n      wordWrap: 'break-word'\n    }, contentStyle);\n\n    if (options.centerVertically) {\n      assign$1(content.style, {\n        position: 'absolute',\n        top: '50%',\n        transform: 'translate(0, -50%)'\n      }, contentStyle);\n    }\n\n    content.innerText = value;\n\n    event.bind(content, 'keydown', this.keyHandler);\n    event.bind(content, 'mousedown', stopPropagation);\n    event.bind(content, 'paste', self.handlePaste);\n\n    if (options.autoResize) {\n      event.bind(content, 'input', this.autoResize);\n    }\n\n    if (options.resizable) {\n      this.resizable(style);\n    }\n\n    container.appendChild(parent);\n\n    // set selection to end of text\n    this.setSelection(content.lastChild, content.lastChild && content.lastChild.length);\n\n    return parent;\n  };\n\n  /**\n   * Intercept paste events to remove formatting from pasted text.\n   */\n  TextBox.prototype.handlePaste = function(e) {\n    var options = this.options,\n        style = this.style;\n\n    e.preventDefault();\n\n    var text;\n\n    if (e.clipboardData) {\n\n      // Chrome, Firefox, Safari\n      text = e.clipboardData.getData('text/plain');\n    } else {\n\n      // Internet Explorer\n      text = window.clipboardData.getData('Text');\n    }\n\n    this.insertText(text);\n\n    if (options.autoResize) {\n      var hasResized = this.autoResize(style);\n\n      if (hasResized) {\n        this.resizeHandler(hasResized);\n      }\n    }\n  };\n\n  TextBox.prototype.insertText = function(text) {\n    text = normalizeEndOfLineSequences(text);\n\n    // insertText command not supported by Internet Explorer\n    var success = document.execCommand('insertText', false, text);\n\n    if (success) {\n      return;\n    }\n\n    this._insertTextIE(text);\n  };\n\n  TextBox.prototype._insertTextIE = function(text) {\n\n    // Internet Explorer\n    var range = this.getSelection(),\n        startContainer = range.startContainer,\n        endContainer = range.endContainer,\n        startOffset = range.startOffset,\n        endOffset = range.endOffset,\n        commonAncestorContainer = range.commonAncestorContainer;\n\n    var childNodesArray = toArray(commonAncestorContainer.childNodes);\n\n    var container,\n        offset;\n\n    if (isTextNode(commonAncestorContainer)) {\n      var containerTextContent = startContainer.textContent;\n\n      startContainer.textContent =\n        containerTextContent.substring(0, startOffset)\n        + text\n        + containerTextContent.substring(endOffset);\n\n      container = startContainer;\n      offset = startOffset + text.length;\n\n    } else if (startContainer === this.content && endContainer === this.content) {\n      var textNode = document.createTextNode(text);\n\n      this.content.insertBefore(textNode, childNodesArray[startOffset]);\n\n      container = textNode;\n      offset = textNode.textContent.length;\n    } else {\n      var startContainerChildIndex = childNodesArray.indexOf(startContainer),\n          endContainerChildIndex = childNodesArray.indexOf(endContainer);\n\n      childNodesArray.forEach(function(childNode, index) {\n\n        if (index === startContainerChildIndex) {\n          childNode.textContent =\n            startContainer.textContent.substring(0, startOffset) +\n            text +\n            endContainer.textContent.substring(endOffset);\n        } else if (index > startContainerChildIndex && index <= endContainerChildIndex) {\n          remove$2(childNode);\n        }\n      });\n\n      container = startContainer;\n      offset = startOffset + text.length;\n    }\n\n    if (container && offset !== undefined) {\n\n      // is necessary in Internet Explorer\n      setTimeout(function() {\n        self.setSelection(container, offset);\n      });\n    }\n  };\n\n  /**\n   * Automatically resize element vertically to fit its content.\n   */\n  TextBox.prototype.autoResize = function() {\n    var parent = this.parent,\n        content = this.content;\n\n    var fontSize = parseInt(this.style.fontSize) || 12;\n\n    if (content.scrollHeight > parent.offsetHeight ||\n        content.scrollHeight < parent.offsetHeight - fontSize) {\n      var bounds = parent.getBoundingClientRect();\n\n      var height = content.scrollHeight;\n      parent.style.height = height + 'px';\n\n      this.resizeHandler({\n        width: bounds.width,\n        height: bounds.height,\n        dx: 0,\n        dy: height - bounds.height\n      });\n    }\n  };\n\n  /**\n   * Make an element resizable by adding a resize handle.\n   */\n  TextBox.prototype.resizable = function() {\n    var self = this;\n\n    var parent = this.parent,\n        resizeHandle = this.resizeHandle;\n\n    var minWidth = parseInt(this.style.minWidth) || 0,\n        minHeight = parseInt(this.style.minHeight) || 0,\n        maxWidth = parseInt(this.style.maxWidth) || Infinity,\n        maxHeight = parseInt(this.style.maxHeight) || Infinity;\n\n    if (!resizeHandle) {\n      resizeHandle = this.resizeHandle = domify$1(\n        '<div class=\"djs-direct-editing-resize-handle\"></div>'\n      );\n\n      var startX, startY, startWidth, startHeight;\n\n      var onMouseDown = function(e) {\n        preventDefault(e);\n        stopPropagation(e);\n\n        startX = e.clientX;\n        startY = e.clientY;\n\n        var bounds = parent.getBoundingClientRect();\n\n        startWidth = bounds.width;\n        startHeight = bounds.height;\n\n        event.bind(document, 'mousemove', onMouseMove);\n        event.bind(document, 'mouseup', onMouseUp);\n      };\n\n      var onMouseMove = function(e) {\n        preventDefault(e);\n        stopPropagation(e);\n\n        var newWidth = min$3(max$5(startWidth + e.clientX - startX, minWidth), maxWidth);\n        var newHeight = min$3(max$5(startHeight + e.clientY - startY, minHeight), maxHeight);\n\n        parent.style.width = newWidth + 'px';\n        parent.style.height = newHeight + 'px';\n\n        self.resizeHandler({\n          width: startWidth,\n          height: startHeight,\n          dx: e.clientX - startX,\n          dy: e.clientY - startY\n        });\n      };\n\n      var onMouseUp = function(e) {\n        preventDefault(e);\n        stopPropagation(e);\n\n        event.unbind(document,'mousemove', onMouseMove, false);\n        event.unbind(document, 'mouseup', onMouseUp, false);\n      };\n\n      event.bind(resizeHandle, 'mousedown', onMouseDown);\n    }\n\n    assign$1(resizeHandle.style, {\n      position: 'absolute',\n      bottom: '0px',\n      right: '0px',\n      cursor: 'nwse-resize',\n      width: '0',\n      height: '0',\n      borderTop: (parseInt(this.style.fontSize) / 4 || 3) + 'px solid transparent',\n      borderRight: (parseInt(this.style.fontSize) / 4 || 3) + 'px solid #ccc',\n      borderBottom: (parseInt(this.style.fontSize) / 4 || 3) + 'px solid #ccc',\n      borderLeft: (parseInt(this.style.fontSize) / 4 || 3) + 'px solid transparent'\n    });\n\n    parent.appendChild(resizeHandle);\n  };\n\n\n  /**\n   * Clear content and style of the textbox, unbind listeners and\n   * reset CSS style.\n   */\n  TextBox.prototype.destroy = function() {\n    var parent = this.parent,\n        content = this.content,\n        resizeHandle = this.resizeHandle;\n\n    // clear content\n    content.innerText = '';\n\n    // clear styles\n    parent.removeAttribute('style');\n    content.removeAttribute('style');\n\n    event.unbind(content, 'keydown', this.keyHandler);\n    event.unbind(content, 'mousedown', stopPropagation);\n    event.unbind(content, 'input', this.autoResize);\n    event.unbind(content, 'paste', this.handlePaste);\n\n    if (resizeHandle) {\n      resizeHandle.removeAttribute('style');\n\n      remove$2(resizeHandle);\n    }\n\n    remove$2(parent);\n  };\n\n\n  TextBox.prototype.getValue = function() {\n    return this.content.innerText.trim();\n  };\n\n\n  TextBox.prototype.getSelection = function() {\n    var selection = window.getSelection(),\n        range = selection.getRangeAt(0);\n\n    return range;\n  };\n\n\n  TextBox.prototype.setSelection = function(container, offset) {\n    var range = document.createRange();\n\n    if (container === null) {\n      range.selectNodeContents(this.content);\n    } else {\n      range.setStart(container, offset);\n      range.setEnd(container, offset);\n    }\n\n    var selection = window.getSelection();\n\n    selection.removeAllRanges();\n    selection.addRange(range);\n  };\n\n  // helpers //////////\n\n  function normalizeEndOfLineSequences(string) {\n    return string.replace(/\\r\\n|\\r|\\n/g, '\\n');\n  }\n\n  /**\n   * A direct editing component that allows users\n   * to edit an elements text directly in the diagram\n   *\n   * @param {EventBus} eventBus the event bus\n   */\n  function DirectEditing(eventBus, canvas) {\n\n    this._eventBus = eventBus;\n\n    this._providers = [];\n    this._textbox = new TextBox({\n      container: canvas.getContainer(),\n      keyHandler: bind$2(this._handleKey, this),\n      resizeHandler: bind$2(this._handleResize, this)\n    });\n  }\n\n  DirectEditing.$inject = [ 'eventBus', 'canvas' ];\n\n\n  /**\n   * Register a direct editing provider\n\n   * @param {Object} provider the provider, must expose an #activate(element) method that returns\n   *                          an activation context ({ bounds: {x, y, width, height }, text }) if\n   *                          direct editing is available for the given element.\n   *                          Additionally the provider must expose a #update(element, value) method\n   *                          to receive direct editing updates.\n   */\n  DirectEditing.prototype.registerProvider = function(provider) {\n    this._providers.push(provider);\n  };\n\n\n  /**\n   * Returns true if direct editing is currently active\n   *\n   * @param {djs.model.Base} [element]\n   *\n   * @return {boolean}\n   */\n  DirectEditing.prototype.isActive = function(element) {\n    return !!(this._active && (!element || this._active.element === element));\n  };\n\n\n  /**\n   * Cancel direct editing, if it is currently active\n   */\n  DirectEditing.prototype.cancel = function() {\n    if (!this._active) {\n      return;\n    }\n\n    this._fire('cancel');\n    this.close();\n  };\n\n\n  DirectEditing.prototype._fire = function(event, context) {\n    this._eventBus.fire('directEditing.' + event, context || { active: this._active });\n  };\n\n  DirectEditing.prototype.close = function() {\n    this._textbox.destroy();\n\n    this._fire('deactivate');\n\n    this._active = null;\n\n    this.resizable = undefined;\n  };\n\n\n  DirectEditing.prototype.complete = function() {\n\n    var active = this._active;\n\n    if (!active) {\n      return;\n    }\n\n    var containerBounds,\n        previousBounds = active.context.bounds,\n        newBounds = this.$textbox.getBoundingClientRect(),\n        newText = this.getValue(),\n        previousText = active.context.text;\n\n    if (\n      newText !== previousText ||\n      newBounds.height !== previousBounds.height ||\n      newBounds.width !== previousBounds.width\n    ) {\n      containerBounds = this._textbox.container.getBoundingClientRect();\n\n      active.provider.update(active.element, newText, active.context.text, {\n        x: newBounds.left - containerBounds.left,\n        y: newBounds.top - containerBounds.top,\n        width: newBounds.width,\n        height: newBounds.height\n      });\n    }\n\n    this._fire('complete');\n\n    this.close();\n  };\n\n\n  DirectEditing.prototype.getValue = function() {\n    return this._textbox.getValue();\n  };\n\n\n  DirectEditing.prototype._handleKey = function(e) {\n\n    // stop bubble\n    e.stopPropagation();\n\n    var key = e.keyCode || e.charCode;\n\n    // ESC\n    if (key === 27) {\n      e.preventDefault();\n      return this.cancel();\n    }\n\n    // Enter\n    if (key === 13 && !e.shiftKey) {\n      e.preventDefault();\n      return this.complete();\n    }\n  };\n\n\n  DirectEditing.prototype._handleResize = function(event) {\n    this._fire('resize', event);\n  };\n\n\n  /**\n   * Activate direct editing on the given element\n   *\n   * @param {Object} ElementDescriptor the descriptor for a shape or connection\n   * @return {Boolean} true if the activation was possible\n   */\n  DirectEditing.prototype.activate = function(element) {\n    if (this.isActive()) {\n      this.cancel();\n    }\n\n    // the direct editing context\n    var context;\n\n    var provider = find(this._providers, function(p) {\n      return ((context = p.activate(element))) ? p : null;\n    });\n\n    // check if activation took place\n    if (context) {\n      this.$textbox = this._textbox.create(\n        context.bounds,\n        context.style,\n        context.text,\n        context.options\n      );\n\n      this._active = {\n        element: element,\n        context: context,\n        provider: provider\n      };\n\n      if (context.options && context.options.resizable) {\n        this.resizable = true;\n      }\n\n      this._fire('activate');\n    }\n\n    return !!context;\n  };\n\n  var DirectEditingModule = {\n    __depends__: [\n      InteractionEventsModule$1\n    ],\n    __init__: [ 'directEditing' ],\n    directEditing: [ 'type', DirectEditing ]\n  };\n\n  /**\r\n   * @typedef {import('../../core/Types').ElementLike} Element\r\n   * @typedef {import('../../core/Types').ShapeLike} Shape\r\n   *\r\n   * @typedef {import('../../core/Canvas').default} Canvas\r\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\r\n   * @typedef {import('../../core/EventBus').default} EventBus\r\n   * @typedef {import('../../draw/Styles').default} Styles\r\n   */\r\n\r\n  var MARKER_TYPES = [\r\n    'marker-start',\r\n    'marker-mid',\r\n    'marker-end'\r\n  ];\r\n\r\n  var NODES_CAN_HAVE_MARKER = [\r\n    'circle',\r\n    'ellipse',\r\n    'line',\r\n    'path',\r\n    'polygon',\r\n    'polyline',\r\n    'path',\r\n    'rect'\r\n  ];\r\n\r\n\r\n  /**\r\n   * Adds support for previews of moving/resizing elements.\r\n   *\r\n   * @param {ElementRegistry} elementRegistry\r\n   * @param {EventBus} eventBus\r\n   * @param {Canvas} canvas\r\n   * @param {Styles} styles\r\n   */\r\n  function PreviewSupport(elementRegistry, eventBus, canvas, styles) {\r\n    this._elementRegistry = elementRegistry;\r\n    this._canvas = canvas;\r\n    this._styles = styles;\r\n\r\n    this._clonedMarkers = {};\r\n\r\n    var self = this;\r\n\r\n    eventBus.on('drag.cleanup', function() {\r\n      forEach$1(self._clonedMarkers, function(clonedMarker) {\r\n        remove$1(clonedMarker);\r\n      });\r\n\r\n      self._clonedMarkers = {};\r\n    });\r\n  }\r\n\r\n  PreviewSupport.$inject = [\r\n    'elementRegistry',\r\n    'eventBus',\r\n    'canvas',\r\n    'styles'\r\n  ];\r\n\r\n\r\n  /**\r\n   * Returns graphics of an element.\r\n   *\r\n   * @param {Element} element\r\n   *\r\n   * @return {SVGElement}\r\n   */\r\n  PreviewSupport.prototype.getGfx = function(element) {\r\n    return this._elementRegistry.getGraphics(element);\r\n  };\r\n\r\n  /**\r\n   * Adds a move preview of a given shape to a given SVG group.\r\n   *\r\n   * @param {Element} element The element to be moved.\r\n   * @param {SVGElement} group The SVG group to add the preview to.\r\n   * @param {SVGElement} [gfx] The optional graphical element of the element.\r\n   *\r\n   * @return {SVGElement} The preview.\r\n   */\r\n  PreviewSupport.prototype.addDragger = function(element, group, gfx) {\r\n    gfx = gfx || this.getGfx(element);\r\n\r\n    var dragger = clone$1(gfx);\r\n    var bbox = gfx.getBoundingClientRect();\r\n\r\n    this._cloneMarkers(getVisual(dragger));\r\n\r\n    attr(dragger, this._styles.cls('djs-dragger', [], {\r\n      x: bbox.top,\r\n      y: bbox.left\r\n    }));\r\n\r\n    append(group, dragger);\r\n\r\n    return dragger;\r\n  };\r\n\r\n  /**\r\n   * Adds a resize preview of a given shape to a given SVG group.\r\n   *\r\n   * @param {Shape} shape The element to be resized.\r\n   * @param {SVGElement} group The SVG group to add the preview to.\r\n   *\r\n   * @return {SVGElement} The preview.\r\n   */\r\n  PreviewSupport.prototype.addFrame = function(shape, group) {\r\n\r\n    var frame = create$1('rect', {\r\n      class: 'djs-resize-overlay',\r\n      width:  shape.width,\r\n      height: shape.height,\r\n      x: shape.x,\r\n      y: shape.y\r\n    });\r\n\r\n    append(group, frame);\r\n\r\n    return frame;\r\n  };\r\n\r\n  /**\r\n   * Clone all markers referenced by a node and its child nodes.\r\n   *\r\n   * @param {SVGElement} gfx\r\n   */\r\n  PreviewSupport.prototype._cloneMarkers = function(gfx) {\r\n    var self = this;\r\n\r\n    if (gfx.childNodes) {\r\n\r\n      // TODO: use forEach once we drop PhantomJS\r\n      for (var i = 0; i < gfx.childNodes.length; i++) {\r\n\r\n        // recursively clone markers of child nodes\r\n        self._cloneMarkers(gfx.childNodes[ i ]);\r\n      }\r\n    }\r\n\r\n    if (!canHaveMarker(gfx)) {\r\n      return;\r\n    }\r\n\r\n    MARKER_TYPES.forEach(function(markerType) {\r\n      if (attr(gfx, markerType)) {\r\n        var marker = getMarker(gfx, markerType, self._canvas.getContainer());\r\n\r\n        self._cloneMarker(gfx, marker, markerType);\r\n      }\r\n    });\r\n  };\r\n\r\n  /**\r\n   * Clone marker referenced by an element.\r\n   *\r\n   * @param {SVGElement} gfx\r\n   * @param {SVGElement} marker\r\n   * @param {string} markerType\r\n   */\r\n  PreviewSupport.prototype._cloneMarker = function(gfx, marker, markerType) {\r\n    var markerId = marker.id;\r\n\r\n    var clonedMarker = this._clonedMarkers[ markerId ];\r\n\r\n    if (!clonedMarker) {\r\n      clonedMarker = clone$1(marker);\r\n\r\n      var clonedMarkerId = markerId + '-clone';\r\n\r\n      clonedMarker.id = clonedMarkerId;\r\n\r\n      classes(clonedMarker)\r\n        .add('djs-dragger')\r\n        .add('djs-dragger-marker');\r\n\r\n      this._clonedMarkers[ markerId ] = clonedMarker;\r\n\r\n      var defs = query('defs', this._canvas._svg);\r\n\r\n      if (!defs) {\r\n        defs = create$1('defs');\r\n\r\n        append(this._canvas._svg, defs);\r\n      }\r\n\r\n      append(defs, clonedMarker);\r\n    }\r\n\r\n    var reference = idToReference(this._clonedMarkers[ markerId ].id);\r\n\r\n    attr(gfx, markerType, reference);\r\n  };\r\n\r\n  // helpers //////////\r\n\r\n  /**\r\n   * Get marker of given type referenced by node.\r\n   *\r\n   * @param {HTMLElement} node\r\n   * @param {string} markerType\r\n   * @param {HTMLElement} [parentNode]\r\n   *\r\n   * @param {HTMLElement}\r\n   */\r\n  function getMarker(node, markerType, parentNode) {\r\n    var id = referenceToId(attr(node, markerType));\r\n\r\n    return query('marker#' + id, parentNode || document);\r\n  }\r\n\r\n  /**\r\n   * Get ID of fragment within current document from its functional IRI reference.\r\n   * References may use single or double quotes.\r\n   *\r\n   * @param {string} reference\r\n   *\r\n   * @return {string}\r\n   */\r\n  function referenceToId(reference) {\r\n    return reference.match(/url\\(['\"]?#([^'\"]*)['\"]?\\)/)[1];\r\n  }\r\n\r\n  /**\r\n   * Get functional IRI reference for given ID of fragment within current document.\r\n   *\r\n   * @param {string} id\r\n   *\r\n   * @return {string}\r\n   */\r\n  function idToReference(id) {\r\n    return 'url(#' + id + ')';\r\n  }\r\n\r\n  /**\r\n   * Check wether node type can have marker attributes.\r\n   *\r\n   * @param {HTMLElement} node\r\n   *\r\n   * @return {boolean}\r\n   */\r\n  function canHaveMarker(node) {\r\n    return NODES_CAN_HAVE_MARKER.indexOf(node.nodeName) !== -1;\r\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var PreviewSupportModule = {\n    __init__: [ 'previewSupport' ],\n    previewSupport: [ 'type', PreviewSupport ]\n  };\n\n  var MARKER_OK$2 = 'drop-ok',\n      MARKER_NOT_OK$2 = 'drop-not-ok',\n      MARKER_ATTACH$2 = 'attach-ok',\n      MARKER_NEW_PARENT$1 = 'new-parent';\n\n  /**\n   * @typedef {import('../../core/Types').ElementLike} Element\n   * @typedef {import('../../core/Types').ShapeLike} Shape\n   *\n   * @typedef {import('../../util/Types').Point} Point\n   *\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../dragging/Dragging').default} Dragging\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   * @typedef {import('../rules/Rules').default} Rules\n   */\n\n  var PREFIX = 'create';\n\n  var HIGH_PRIORITY$g = 2000;\n\n\n  /**\n   * Create new elements through drag and drop.\n   *\n   * @param {Canvas} canvas\n   * @param {Dragging} dragging\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   * @param {Rules} rules\n   */\n  function Create(\n      canvas,\n      dragging,\n      eventBus,\n      modeling,\n      rules\n  ) {\n\n    // rules //////////\n\n    /**\n     * Check wether elements can be created.\n     *\n     * @param {Element[]} elements\n     * @param {Shape} target\n     * @param {Point} position\n     * @param {Element} [source]\n     *\n     * @return {boolean|null|Object}\n     */\n    function canCreate(elements, target, position, source, hints) {\n      if (!target) {\n        return false;\n      }\n\n      // ignore child elements and external labels\n      elements = filter(elements, function(element) {\n        var labelTarget = element.labelTarget;\n\n        return !element.parent && !(isLabel(element) && elements.indexOf(labelTarget) !== -1);\n      });\n\n      var shape = find(elements, function(element) {\n        return !isConnection(element);\n      });\n\n      var attach = false,\n          connect = false,\n          create = false;\n\n      // (1) attaching single shapes\n      if (isSingleShape(elements)) {\n        attach = rules.allowed('shape.attach', {\n          position: position,\n          shape: shape,\n          target: target\n        });\n      }\n\n      if (!attach) {\n\n        // (2) creating elements\n        if (isSingleShape(elements)) {\n          create = rules.allowed('shape.create', {\n            position: position,\n            shape: shape,\n            source: source,\n            target: target\n          });\n        } else {\n          create = rules.allowed('elements.create', {\n            elements: elements,\n            position: position,\n            target: target\n          });\n        }\n\n      }\n\n      var connectionTarget = hints.connectionTarget;\n\n      // (3) appending single shapes\n      if (create || attach) {\n        if (shape && source) {\n          connect = rules.allowed('connection.create', {\n            source: connectionTarget === source ? shape : source,\n            target: connectionTarget === source ? source : shape,\n            hints: {\n              targetParent: target,\n              targetAttach: attach\n            }\n          });\n        }\n\n        return {\n          attach: attach,\n          connect: connect\n        };\n      }\n\n      // ignore wether or not elements can be created\n      if (create === null || attach === null) {\n        return null;\n      }\n\n      return false;\n    }\n\n    function setMarker(element, marker) {\n      [ MARKER_ATTACH$2, MARKER_OK$2, MARKER_NOT_OK$2, MARKER_NEW_PARENT$1 ].forEach(function(m) {\n\n        if (m === marker) {\n          canvas.addMarker(element, m);\n        } else {\n          canvas.removeMarker(element, m);\n        }\n      });\n    }\n\n    // event handling //////////\n\n    eventBus.on([ 'create.move', 'create.hover' ], function(event) {\n      var context = event.context,\n          elements = context.elements,\n          hover = event.hover,\n          source = context.source,\n          hints = context.hints || {};\n\n      if (!hover) {\n        context.canExecute = false;\n        context.target = null;\n\n        return;\n      }\n\n      ensureConstraints$2(event);\n\n      var position = {\n        x: event.x,\n        y: event.y\n      };\n\n      var canExecute = context.canExecute = hover && canCreate(elements, hover, position, source, hints);\n\n      if (hover && canExecute !== null) {\n        context.target = hover;\n\n        if (canExecute && canExecute.attach) {\n          setMarker(hover, MARKER_ATTACH$2);\n        } else {\n          setMarker(hover, canExecute ? MARKER_NEW_PARENT$1 : MARKER_NOT_OK$2);\n        }\n      }\n    });\n\n    eventBus.on([ 'create.end', 'create.out', 'create.cleanup' ], function(event) {\n      var hover = event.hover;\n\n      if (hover) {\n        setMarker(hover, null);\n      }\n    });\n\n    eventBus.on('create.end', function(event) {\n      var context = event.context,\n          source = context.source,\n          shape = context.shape,\n          elements = context.elements,\n          target = context.target,\n          canExecute = context.canExecute,\n          attach = canExecute && canExecute.attach,\n          connect = canExecute && canExecute.connect,\n          hints = context.hints || {};\n\n      if (canExecute === false || !target) {\n        return false;\n      }\n\n      ensureConstraints$2(event);\n\n      var position = {\n        x: event.x,\n        y: event.y\n      };\n\n      if (connect) {\n        shape = modeling.appendShape(source, shape, position, target, {\n          attach: attach,\n          connection: connect === true ? {} : connect,\n          connectionTarget: hints.connectionTarget\n        });\n      } else {\n        elements = modeling.createElements(elements, position, target, assign$1({}, hints, {\n          attach: attach\n        }));\n\n        // update shape\n        shape = find(elements, function(element) {\n          return !isConnection(element);\n        });\n      }\n\n      // update elements and shape\n      assign$1(context, {\n        elements: elements,\n        shape: shape\n      });\n\n      assign$1(event, {\n        elements: elements,\n        shape: shape\n      });\n    });\n\n    function cancel() {\n      var context = dragging.context();\n\n      if (context && context.prefix === PREFIX) {\n        dragging.cancel();\n      }\n    }\n\n    // cancel on <elements.changed> that is not result of <drag.end>\n    eventBus.on('create.init', function() {\n      eventBus.on('elements.changed', cancel);\n\n      eventBus.once([ 'create.cancel', 'create.end' ], HIGH_PRIORITY$g, function() {\n        eventBus.off('elements.changed', cancel);\n      });\n    });\n\n    // API //////////\n\n    this.start = function(event, elements, context) {\n      if (!isArray$3(elements)) {\n        elements = [ elements ];\n      }\n\n      var shape = find(elements, function(element) {\n        return !isConnection(element);\n      });\n\n      if (!shape) {\n\n        // at least one shape is required\n        return;\n      }\n\n      context = assign$1({\n        elements: elements,\n        hints: {},\n        shape: shape\n      }, context || {});\n\n      // make sure each element has x and y\n      forEach$1(elements, function(element) {\n        if (!isNumber(element.x)) {\n          element.x = 0;\n        }\n\n        if (!isNumber(element.y)) {\n          element.y = 0;\n        }\n      });\n\n      var visibleElements = filter(elements, function(element) {\n        return !element.hidden;\n      });\n\n      var bbox = getBBox(visibleElements);\n\n      // center elements around cursor\n      forEach$1(elements, function(element) {\n        if (isConnection(element)) {\n          element.waypoints = map$1(element.waypoints, function(waypoint) {\n            return {\n              x: waypoint.x - bbox.x - bbox.width / 2,\n              y: waypoint.y - bbox.y - bbox.height / 2\n            };\n          });\n        }\n\n        assign$1(element, {\n          x: element.x - bbox.x - bbox.width / 2,\n          y: element.y - bbox.y - bbox.height / 2\n        });\n      });\n\n      dragging.init(event, PREFIX, {\n        cursor: 'grabbing',\n        autoActivate: true,\n        data: {\n          shape: shape,\n          elements: elements,\n          context: context\n        }\n      });\n    };\n  }\n\n  Create.$inject = [\n    'canvas',\n    'dragging',\n    'eventBus',\n    'modeling',\n    'rules'\n  ];\n\n  // helpers //////////\n\n  function ensureConstraints$2(event) {\n    var context = event.context,\n        createConstraints = context.createConstraints;\n\n    if (!createConstraints) {\n      return;\n    }\n\n    if (createConstraints.left) {\n      event.x = Math.max(event.x, createConstraints.left);\n    }\n\n    if (createConstraints.right) {\n      event.x = Math.min(event.x, createConstraints.right);\n    }\n\n    if (createConstraints.top) {\n      event.y = Math.max(event.y, createConstraints.top);\n    }\n\n    if (createConstraints.bottom) {\n      event.y = Math.min(event.y, createConstraints.bottom);\n    }\n  }\n\n  function isSingleShape(elements) {\n    return elements && elements.length === 1 && !isConnection(elements[ 0 ]);\n  }\n\n  /**\r\n   * @typedef {import('../../core/Canvas').default} Canvas\r\n   * @typedef {import('../../core/EventBus').default} EventBus\r\n   * @typedef {import('../../core/GraphicsFactory').default} GraphicsFactory\r\n   * @typedef {import('../preview-support/PreviewSupport').default} PreviewSupport\r\n   * @typedef {import('../../draw/Styles').default} Styles\r\n   */\r\n\r\n  var LOW_PRIORITY$i = 750;\r\n\r\n  /**\r\n   * @param {Canvas} canvas\r\n   * @param {EventBus} eventBus\r\n   * @param {GraphicsFactory} graphicsFactory\r\n   * @param {PreviewSupport} previewSupport\r\n   * @param {Styles} styles\r\n   */\r\n  function CreatePreview(\r\n      canvas,\r\n      eventBus,\r\n      graphicsFactory,\r\n      previewSupport,\r\n      styles\r\n  ) {\r\n    function createDragGroup(elements) {\r\n      var dragGroup = create$1('g');\r\n\r\n      attr(dragGroup, styles.cls('djs-drag-group', [ 'no-events' ]));\r\n\r\n      var childrenGfx = create$1('g');\r\n\r\n      elements.forEach(function(element) {\r\n\r\n        // create graphics\r\n        var gfx;\r\n\r\n        if (element.hidden) {\r\n          return;\r\n        }\r\n\r\n        if (element.waypoints) {\r\n          gfx = graphicsFactory._createContainer('connection', childrenGfx);\r\n\r\n          graphicsFactory.drawConnection(getVisual(gfx), element);\r\n        } else {\r\n          gfx = graphicsFactory._createContainer('shape', childrenGfx);\r\n\r\n          graphicsFactory.drawShape(getVisual(gfx), element);\r\n\r\n          translate$2(gfx, element.x, element.y);\r\n        }\r\n\r\n        // add preview\r\n        previewSupport.addDragger(element, dragGroup, gfx);\r\n      });\r\n\r\n      return dragGroup;\r\n    }\r\n\r\n    eventBus.on('create.move', LOW_PRIORITY$i, function(event) {\r\n\r\n      var hover = event.hover,\r\n          context = event.context,\r\n          elements = context.elements,\r\n          dragGroup = context.dragGroup;\r\n\r\n      // lazily create previews\r\n      if (!dragGroup) {\r\n        dragGroup = context.dragGroup = createDragGroup(elements);\r\n      }\r\n\r\n      var activeLayer;\r\n\r\n      if (hover) {\r\n        if (!dragGroup.parentNode) {\r\n          activeLayer = canvas.getActiveLayer();\r\n\r\n          append(activeLayer, dragGroup);\r\n        }\r\n\r\n        translate$2(dragGroup, event.x, event.y);\r\n      } else {\r\n        remove$1(dragGroup);\r\n      }\r\n    });\r\n\r\n    eventBus.on('create.cleanup', function(event) {\r\n      var context = event.context,\r\n          dragGroup = context.dragGroup;\r\n\r\n      if (dragGroup) {\r\n        remove$1(dragGroup);\r\n      }\r\n    });\r\n  }\r\n\r\n  CreatePreview.$inject = [\r\n    'canvas',\r\n    'eventBus',\r\n    'graphicsFactory',\r\n    'previewSupport',\r\n    'styles'\r\n  ];\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var CreateModule = {\n    __depends__: [\n      DraggingModule,\n      PreviewSupportModule,\n      RulesModule$1,\n      SelectionModule\n    ],\n    __init__: [\n      'create',\n      'createPreview'\n    ],\n    create: [ 'type', Create ],\n    createPreview: [ 'type', CreatePreview ]\n  };\n\n  /**\n   * A clip board stub\n   */\n  function Clipboard() {}\n\n\n  Clipboard.prototype.get = function() {\n    return this._data;\n  };\n\n  Clipboard.prototype.set = function(data) {\n    this._data = data;\n  };\n\n  Clipboard.prototype.clear = function() {\n    var data = this._data;\n\n    delete this._data;\n\n    return data;\n  };\n\n  Clipboard.prototype.isEmpty = function() {\n    return !this._data;\n  };\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var ClipboardModule = {\n    clipboard: [ 'type', Clipboard ]\n  };\n\n  /**\r\n   * @typedef {import('../../core/EventBus').default} EventBus\r\n   */\r\n\r\n  /**\r\n   * @param {EventBus} eventBus\r\n   */\r\n  function Mouse(eventBus) {\r\n    var self = this;\r\n\r\n    this._lastMoveEvent = null;\r\n\r\n    function setLastMoveEvent(mousemoveEvent) {\r\n      self._lastMoveEvent = mousemoveEvent;\r\n    }\r\n\r\n    eventBus.on('canvas.init', function(context) {\r\n      var svg = self._svg = context.svg;\r\n\r\n      svg.addEventListener('mousemove', setLastMoveEvent);\r\n    });\r\n\r\n    eventBus.on('canvas.destroy', function() {\r\n      self._lastMouseEvent = null;\r\n\r\n      self._svg.removeEventListener('mousemove', setLastMoveEvent);\r\n    });\r\n  }\r\n\r\n  Mouse.$inject = [ 'eventBus' ];\r\n\r\n  Mouse.prototype.getLastMoveEvent = function() {\r\n    return this._lastMoveEvent || createMoveEvent(0, 0);\r\n  };\r\n\r\n  // helpers //////////\r\n\r\n  function createMoveEvent(x, y) {\r\n    var event = document.createEvent('MouseEvent');\r\n\r\n    var screenX = x,\r\n        screenY = y,\r\n        clientX = x,\r\n        clientY = y;\r\n\r\n    if (event.initMouseEvent) {\r\n      event.initMouseEvent(\r\n        'mousemove',\r\n        true,\r\n        true,\r\n        window,\r\n        0,\r\n        screenX,\r\n        screenY,\r\n        clientX,\r\n        clientY,\r\n        false,\r\n        false,\r\n        false,\r\n        false,\r\n        0,\r\n        null\r\n      );\r\n    }\r\n\r\n    return event;\r\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var MouseModule = {\n    __init__: [ 'mouse' ],\n    mouse: [ 'type', Mouse ]\n  };\n\n  /**\n   * @typedef {import('../../core/Types').ElementLike} Element\n   * @typedef {import('../../core/Types').ShapeLike} Shape\n   *\n   * @typedef {import('../../util/Types').Point} Point\n   *\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../clipboard/Clipboard').default} Clipboard\n   * @typedef {import('../create/Create').default} Create\n   * @typedef {import('../../core/ElementFactory').default} ElementFactory\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   * @typedef {import('../mouse/Mouse').default} Mouse\n   * @typedef {import('../rules/Rules').default} Rules\n   */\n\n  /**\n   * @typedef { (event: { elements: Element[] }) => Element[]|boolean } CopyPasteCanCopyElementsListener\n   */\n\n  /**\n   * @typedef { (event: { descriptor: any, element: Element, elements: Element[] }) => void } CopyPasteCopyElementListener\n   */\n\n  /**\n   * @typedef { (event: { element: Element, children: Element[] }) => void } CopyPasteCreateTreeListener\n   */\n\n  /**\n   * @typedef { (event: { elements: any, tree: any }) => void } CopyPasteElementsCopiedListener\n   */\n\n  /**\n   * @typedef { (event: { cache: any, descriptor: any }) => void } CopyPastePasteElementListener\n   */\n\n  /**\n   * @typedef { (event: { hints: any }) => void } CopyPastePasteElementsListener\n   */\n\n  /**\n   * Copy and paste elements.\n   *\n   * @param {Canvas} canvas\n   * @param {Create} create\n   * @param {Clipboard} clipboard\n   * @param {ElementFactory} elementFactory\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   * @param {Mouse} mouse\n   * @param {Rules} rules\n   */\n  function CopyPaste(\n      canvas,\n      create,\n      clipboard,\n      elementFactory,\n      eventBus,\n      modeling,\n      mouse,\n      rules\n  ) {\n\n    this._canvas = canvas;\n    this._create = create;\n    this._clipboard = clipboard;\n    this._elementFactory = elementFactory;\n    this._eventBus = eventBus;\n    this._modeling = modeling;\n    this._mouse = mouse;\n    this._rules = rules;\n\n    eventBus.on('copyPaste.copyElement', function(context) {\n      var descriptor = context.descriptor,\n          element = context.element,\n          elements = context.elements;\n\n      // default priority (priority = 1)\n      descriptor.priority = 1;\n\n      descriptor.id = element.id;\n\n      var parentCopied = find(elements, function(e) {\n        return e === element.parent;\n      });\n\n      // do NOT reference parent if parent wasn't copied\n      if (parentCopied) {\n        descriptor.parent = element.parent.id;\n      }\n\n      // attachers (priority = 2)\n      if (isAttacher$2(element)) {\n        descriptor.priority = 2;\n\n        descriptor.host = element.host.id;\n      }\n\n      // connections (priority = 3)\n      if (isConnection(element)) {\n        descriptor.priority = 3;\n\n        descriptor.source = element.source.id;\n        descriptor.target = element.target.id;\n\n        descriptor.waypoints = copyWaypoints$1(element);\n      }\n\n      // labels (priority = 4)\n      if (isLabel(element)) {\n        descriptor.priority = 4;\n\n        descriptor.labelTarget = element.labelTarget.id;\n      }\n\n      forEach$1([ 'x', 'y', 'width', 'height' ], function(property) {\n        if (isNumber(element[ property ])) {\n          descriptor[ property ] = element[ property ];\n        }\n      });\n\n      descriptor.hidden = element.hidden;\n      descriptor.collapsed = element.collapsed;\n\n    });\n\n    eventBus.on('copyPaste.pasteElements', function(context) {\n      var hints = context.hints;\n\n      assign$1(hints, {\n        createElementsBehavior: false\n      });\n    });\n  }\n\n  CopyPaste.$inject = [\n    'canvas',\n    'create',\n    'clipboard',\n    'elementFactory',\n    'eventBus',\n    'modeling',\n    'mouse',\n    'rules'\n  ];\n\n\n  /**\n   * Copy elements.\n   *\n   * @param {Element[]} elements\n   *\n   * @return {Object}\n   */\n  CopyPaste.prototype.copy = function(elements) {\n    var allowed,\n        tree;\n\n    if (!isArray$3(elements)) {\n      elements = elements ? [ elements ] : [];\n    }\n\n    allowed = this._eventBus.fire('copyPaste.canCopyElements', {\n      elements: elements\n    });\n\n    if (allowed === false) {\n      tree = {};\n    } else {\n      tree = this.createTree(isArray$3(allowed) ? allowed : elements);\n    }\n\n    // we set an empty tree, selection of elements\n    // to copy was empty.\n    this._clipboard.set(tree);\n\n    this._eventBus.fire('copyPaste.elementsCopied', {\n      elements: elements,\n      tree: tree\n    });\n\n    return tree;\n  };\n\n  /**\n   * Paste elements.\n   *\n   * @param {Object} [context]\n   * @param {Shape} [context.element] The optional parent.\n   * @param {Point} [context.point] The optional osition.\n   * @param {Object} [context.hints] The optional hints.\n   */\n  CopyPaste.prototype.paste = function(context) {\n    var tree = this._clipboard.get();\n\n    if (this._clipboard.isEmpty()) {\n      return;\n    }\n\n    var hints = context && context.hints || {};\n\n    this._eventBus.fire('copyPaste.pasteElements', {\n      hints: hints\n    });\n\n    var elements = this._createElements(tree);\n\n    // paste directly\n    if (context && context.element && context.point) {\n      return this._paste(elements, context.element, context.point, hints);\n    }\n\n    this._create.start(this._mouse.getLastMoveEvent(), elements, {\n      hints: hints || {}\n    });\n  };\n\n  /**\n   * Paste elements directly.\n   *\n   * @param {Element[]} elements\n   * @param {Shape} target\n   * @param {Point} position\n   * @param {Object} [hints]\n   */\n  CopyPaste.prototype._paste = function(elements, target, position, hints) {\n\n    // make sure each element has x and y\n    forEach$1(elements, function(element) {\n      if (!isNumber(element.x)) {\n        element.x = 0;\n      }\n\n      if (!isNumber(element.y)) {\n        element.y = 0;\n      }\n    });\n\n    var bbox = getBBox(elements);\n\n    // center elements around cursor\n    forEach$1(elements, function(element) {\n      if (isConnection(element)) {\n        element.waypoints = map$1(element.waypoints, function(waypoint) {\n          return {\n            x: waypoint.x - bbox.x - bbox.width / 2,\n            y: waypoint.y - bbox.y - bbox.height / 2\n          };\n        });\n      }\n\n      assign$1(element, {\n        x: element.x - bbox.x - bbox.width / 2,\n        y: element.y - bbox.y - bbox.height / 2\n      });\n    });\n\n    return this._modeling.createElements(elements, position, target, assign$1({}, hints));\n  };\n\n  /**\n   * Create elements from tree.\n   */\n  CopyPaste.prototype._createElements = function(tree) {\n    var self = this;\n\n    var eventBus = this._eventBus;\n\n    var cache = {};\n\n    var elements = [];\n\n    forEach$1(tree, function(branch, depth) {\n\n      // sort by priority\n      branch = sortBy(branch, 'priority');\n\n      forEach$1(branch, function(descriptor) {\n\n        // remove priority\n        var attrs = assign$1({}, omit(descriptor, [ 'priority' ]));\n\n        if (cache[ descriptor.parent ]) {\n          attrs.parent = cache[ descriptor.parent ];\n        } else {\n          delete attrs.parent;\n        }\n\n        eventBus.fire('copyPaste.pasteElement', {\n          cache: cache,\n          descriptor: attrs\n        });\n\n        var element;\n\n        if (isConnection(attrs)) {\n          attrs.source = cache[ descriptor.source ];\n          attrs.target = cache[ descriptor.target ];\n\n          element = cache[ descriptor.id ] = self.createConnection(attrs);\n\n          elements.push(element);\n\n          return;\n        }\n\n        if (isLabel(attrs)) {\n          attrs.labelTarget = cache[ attrs.labelTarget ];\n\n          element = cache[ descriptor.id ] = self.createLabel(attrs);\n\n          elements.push(element);\n\n          return;\n        }\n\n        if (attrs.host) {\n          attrs.host = cache[ attrs.host ];\n        }\n\n        element = cache[ descriptor.id ] = self.createShape(attrs);\n\n        elements.push(element);\n      });\n\n    });\n\n    return elements;\n  };\n\n  CopyPaste.prototype.createConnection = function(attrs) {\n    var connection = this._elementFactory.createConnection(omit(attrs, [ 'id' ]));\n\n    return connection;\n  };\n\n  CopyPaste.prototype.createLabel = function(attrs) {\n    var label = this._elementFactory.createLabel(omit(attrs, [ 'id' ]));\n\n    return label;\n  };\n\n  CopyPaste.prototype.createShape = function(attrs) {\n    var shape = this._elementFactory.createShape(omit(attrs, [ 'id' ]));\n\n    return shape;\n  };\n\n  /**\n   * Check wether element has relations to other elements e.g. attachers, labels and connections.\n   *\n   * @param {Object} element\n   * @param {Element[]} elements\n   *\n   * @return {boolean}\n   */\n  CopyPaste.prototype.hasRelations = function(element, elements) {\n    var labelTarget,\n        source,\n        target;\n\n    if (isConnection(element)) {\n      source = find(elements, matchPattern({ id: element.source.id }));\n      target = find(elements, matchPattern({ id: element.target.id }));\n\n      if (!source || !target) {\n        return false;\n      }\n    }\n\n    if (isLabel(element)) {\n      labelTarget = find(elements, matchPattern({ id: element.labelTarget.id }));\n\n      if (!labelTarget) {\n        return false;\n      }\n    }\n\n    return true;\n  };\n\n  /**\n   * Create a tree-like structure from elements.\n   *\n   * @example\n   *\n   * ```javascript\n   * tree: {\n   *  0: [\n   *    { id: 'Shape_1', priority: 1, ... },\n   *    { id: 'Shape_2', priority: 1, ... },\n   *    { id: 'Connection_1', source: 'Shape_1', target: 'Shape_2', priority: 3, ... },\n   *    ...\n   *  ],\n   *  1: [\n   *    { id: 'Shape_3', parent: 'Shape1', priority: 1, ... },\n   *    ...\n   *  ]\n   * };\n   * ```\n   *\n   * @param {Element[]} elements\n   *\n   * @return {Object}\n   */\n  CopyPaste.prototype.createTree = function(elements) {\n    var rules = this._rules,\n        self = this;\n\n    var tree = {},\n        elementsData = [];\n\n    var parents = getParents$1(elements);\n\n    function canCopy(element, elements) {\n      return rules.allowed('element.copy', {\n        element: element,\n        elements: elements\n      });\n    }\n\n    function addElementData(element, depth) {\n\n      // (1) check wether element has already been added\n      var foundElementData = find(elementsData, function(elementsData) {\n        return element === elementsData.element;\n      });\n\n      // (2) add element if not already added\n      if (!foundElementData) {\n        elementsData.push({\n          element: element,\n          depth: depth\n        });\n\n        return;\n      }\n\n      // (3) update depth\n      if (foundElementData.depth < depth) {\n        elementsData = removeElementData(foundElementData, elementsData);\n\n        elementsData.push({\n          element: foundElementData.element,\n          depth: depth\n        });\n      }\n    }\n\n    function removeElementData(elementData, elementsData) {\n      var index = elementsData.indexOf(elementData);\n\n      if (index !== -1) {\n        elementsData.splice(index, 1);\n      }\n\n      return elementsData;\n    }\n\n    // (1) add elements\n    eachElement(parents, function(element, _index, depth) {\n\n      // do NOT add external labels directly\n      if (isLabel(element)) {\n        return;\n      }\n\n      // always copy external labels\n      forEach$1(element.labels, function(label) {\n        addElementData(label, depth);\n      });\n\n      function addRelatedElements(elements) {\n        elements && elements.length && forEach$1(elements, function(element) {\n\n          // add external labels\n          forEach$1(element.labels, function(label) {\n            addElementData(label, depth);\n          });\n\n          addElementData(element, depth);\n        });\n      }\n\n      forEach$1([ element.attachers, element.incoming, element.outgoing ], addRelatedElements);\n\n      addElementData(element, depth);\n\n      var children = [];\n\n      if (element.children) {\n        children = element.children.slice();\n      }\n\n      // allow others to add children to tree\n      self._eventBus.fire('copyPaste.createTree', {\n        element: element,\n        children: children\n      });\n\n      return children;\n    });\n\n    elements = map$1(elementsData, function(elementData) {\n      return elementData.element;\n    });\n\n    // (2) copy elements\n    elementsData = map$1(elementsData, function(elementData) {\n      elementData.descriptor = {};\n\n      self._eventBus.fire('copyPaste.copyElement', {\n        descriptor: elementData.descriptor,\n        element: elementData.element,\n        elements: elements\n      });\n\n      return elementData;\n    });\n\n    // (3) sort elements by priority\n    elementsData = sortBy(elementsData, function(elementData) {\n      return elementData.descriptor.priority;\n    });\n\n    elements = map$1(elementsData, function(elementData) {\n      return elementData.element;\n    });\n\n    // (4) create tree\n    forEach$1(elementsData, function(elementData) {\n      var depth = elementData.depth;\n\n      if (!self.hasRelations(elementData.element, elements)) {\n        removeElement(elementData.element, elements);\n\n        return;\n      }\n\n      if (!canCopy(elementData.element, elements)) {\n        removeElement(elementData.element, elements);\n\n        return;\n      }\n\n      if (!tree[depth]) {\n        tree[depth] = [];\n      }\n\n      tree[depth].push(elementData.descriptor);\n    });\n\n    return tree;\n  };\n\n  // helpers //////////\n\n  function isAttacher$2(element) {\n    return !!element.host;\n  }\n\n  function copyWaypoints$1(element) {\n    return map$1(element.waypoints, function(waypoint) {\n\n      waypoint = copyWaypoint$1(waypoint);\n\n      if (waypoint.original) {\n        waypoint.original = copyWaypoint$1(waypoint.original);\n      }\n\n      return waypoint;\n    });\n  }\n\n  function copyWaypoint$1(waypoint) {\n    return assign$1({}, waypoint);\n  }\n\n  function removeElement(element, elements) {\n    var index = elements.indexOf(element);\n\n    if (index === -1) {\n      return elements;\n    }\n\n    return elements.splice(index, 1);\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var CopyPasteModule$1 = {\n    __depends__: [\n      ClipboardModule,\n      CreateModule,\n      MouseModule,\n      RulesModule$1\n    ],\n    __init__: [ 'copyPaste' ],\n    copyPaste: [ 'type', CopyPaste ]\n  };\n\n  /**\n   * @typedef {import('../modeling/BpmnFactory').default} BpmnFactory\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('./ModdleCopy').default} ModdleCopy\n   */\n\n  function copyProperties$1(source, target, properties) {\n    if (!isArray$3(properties)) {\n      properties = [ properties ];\n    }\n\n    forEach$1(properties, function(property) {\n      if (!isUndefined$2(source[property])) {\n        target[property] = source[property];\n      }\n    });\n  }\n\n  var LOW_PRIORITY$h = 750;\n\n  /**\n   * BPMN-specific copy & paste.\n   *\n   * @param {BpmnFactory} bpmnFactory\n   * @param {EventBus} eventBus\n   * @param {ModdleCopy} moddleCopy\n   */\n  function BpmnCopyPaste(bpmnFactory, eventBus, moddleCopy) {\n\n    function copy(bo, clone) {\n      var targetBo = bpmnFactory.create(bo.$type);\n\n      return moddleCopy.copyElement(bo, targetBo, null, clone);\n    }\n\n    eventBus.on('copyPaste.copyElement', LOW_PRIORITY$h, function(context) {\n      var descriptor = context.descriptor,\n          element = context.element,\n          businessObject = getBusinessObject(element);\n\n      // do not copy business object + di for labels;\n      // will be pulled from the referenced label target\n      if (isLabel(element)) {\n        return descriptor;\n      }\n\n      var businessObjectCopy = descriptor.businessObject = copy(businessObject, true);\n      var diCopy = descriptor.di = copy(getDi(element), true);\n      diCopy.bpmnElement = businessObjectCopy;\n\n      copyProperties$1(businessObjectCopy, descriptor, 'name');\n      copyProperties$1(diCopy, descriptor, 'isExpanded');\n\n      // default sequence flow\n      if (businessObject.default) {\n        descriptor.default = businessObject.default.id;\n      }\n    });\n\n    var referencesKey = '-bpmn-js-refs';\n\n    function getReferences(cache) {\n      return (cache[referencesKey] = cache[referencesKey] || {});\n    }\n\n    function setReferences(cache, references) {\n      cache[referencesKey] = references;\n    }\n\n    function resolveReferences(descriptor, cache, references) {\n      var businessObject = getBusinessObject(descriptor);\n\n      // default sequence flows\n      if (descriptor.default) {\n\n        // relationship cannot be resolved immediately\n        references[ descriptor.default ] = {\n          element: businessObject,\n          property: 'default'\n        };\n      }\n\n      // boundary events\n      if (descriptor.host) {\n\n        // relationship can be resolved immediately\n        getBusinessObject(descriptor).attachedToRef = getBusinessObject(cache[ descriptor.host ]);\n      }\n\n      return omit(references, reduce(references, function(array, reference, key) {\n        var element = reference.element,\n            property = reference.property;\n\n        if (key === descriptor.id) {\n          element[ property ] = businessObject;\n\n          array.push(descriptor.id);\n        }\n\n        return array;\n      }, []));\n    }\n\n    eventBus.on('copyPaste.pasteElement', function(context) {\n      var cache = context.cache,\n          descriptor = context.descriptor,\n          businessObject = descriptor.businessObject,\n          di = descriptor.di;\n\n      // wire existing di + businessObject for external label\n      if (isLabel(descriptor)) {\n        descriptor.businessObject = getBusinessObject(cache[ descriptor.labelTarget ]);\n        descriptor.di = getDi(cache[ descriptor.labelTarget ]);\n\n        return;\n      }\n\n      businessObject = descriptor.businessObject = copy(businessObject);\n\n      di = descriptor.di = copy(di);\n      di.bpmnElement = businessObject;\n\n      copyProperties$1(descriptor, businessObject, [\n        'isExpanded',\n        'name'\n      ]);\n\n      descriptor.type = businessObject.$type;\n    });\n\n    // copy + paste processRef with participant\n\n    eventBus.on('copyPaste.copyElement', LOW_PRIORITY$h, function(context) {\n      var descriptor = context.descriptor,\n          element = context.element;\n\n      if (!is$1(element, 'bpmn:Participant')) {\n        return;\n      }\n\n      var participantBo = getBusinessObject(element);\n\n      if (participantBo.processRef) {\n        descriptor.processRef = copy(participantBo.processRef, true);\n      }\n    });\n\n    eventBus.on('copyPaste.pasteElement', function(context) {\n      var descriptor = context.descriptor,\n          processRef = descriptor.processRef;\n\n      if (processRef) {\n        descriptor.processRef = copy(processRef);\n      }\n    });\n\n    // resolve references\n\n    eventBus.on('copyPaste.pasteElement', LOW_PRIORITY$h, function(context) {\n      var cache = context.cache,\n          descriptor = context.descriptor;\n\n      // resolve references e.g. default sequence flow\n      setReferences(\n        cache,\n        resolveReferences(descriptor, cache, getReferences(cache))\n      );\n    });\n\n  }\n\n\n  BpmnCopyPaste.$inject = [\n    'bpmnFactory',\n    'eventBus',\n    'moddleCopy'\n  ];\n\n  var DISALLOWED_PROPERTIES = [\n    'artifacts',\n    'dataInputAssociations',\n    'dataOutputAssociations',\n    'default',\n    'flowElements',\n    'lanes',\n    'incoming',\n    'outgoing',\n    'categoryValue'\n  ];\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../modeling/BpmnFactory').default} BpmnFactory\n   * @typedef {import('../../model/Types').Moddle} Moddle\n   *\n   * @typedef {import('../../model/Types').ModdleElement} ModdleElement\n   */\n\n  /**\n   * Utility for copying model properties from source element to target element.\n   *\n   * @param {EventBus} eventBus\n   * @param {BpmnFactory} bpmnFactory\n   * @param {Moddle} moddle\n   */\n  function ModdleCopy(eventBus, bpmnFactory, moddle) {\n    this._bpmnFactory = bpmnFactory;\n    this._eventBus = eventBus;\n    this._moddle = moddle;\n\n    // copy extension elements last\n    eventBus.on('moddleCopy.canCopyProperties', function(context) {\n      var propertyNames = context.propertyNames;\n\n      if (!propertyNames || !propertyNames.length) {\n        return;\n      }\n\n      return sortBy(propertyNames, function(propertyName) {\n        return propertyName === 'extensionElements';\n      });\n    });\n\n    // default check whether property can be copied\n    eventBus.on('moddleCopy.canCopyProperty', function(context) {\n      var parent = context.parent,\n          parentDescriptor = isObject(parent) && parent.$descriptor,\n          propertyName = context.propertyName;\n\n      if (propertyName && DISALLOWED_PROPERTIES.indexOf(propertyName) !== -1) {\n\n        // disallow copying property\n        return false;\n      }\n\n      if (propertyName &&\n        parentDescriptor &&\n        !find(parentDescriptor.properties, matchPattern({ name: propertyName }))) {\n\n        // disallow copying property\n        return false;\n      }\n    });\n\n    // do NOT allow to copy empty extension elements\n    eventBus.on('moddleCopy.canSetCopiedProperty', function(context) {\n      var property = context.property;\n\n      if (is(property, 'bpmn:ExtensionElements') && (!property.values || !property.values.length)) {\n\n        // disallow setting copied property\n        return false;\n      }\n    });\n  }\n\n  ModdleCopy.$inject = [\n    'eventBus',\n    'bpmnFactory',\n    'moddle'\n  ];\n\n  /**\n   * Copy model properties of source element to target element.\n   *\n   * @param {ModdleElement} sourceElement\n   * @param {ModdleElement} targetElement\n   * @param {string[]} [propertyNames]\n   * @param {boolean} [clone=false]\n   *\n   * @return {ModdleElement}\n   */\n  ModdleCopy.prototype.copyElement = function(sourceElement, targetElement, propertyNames, clone = false) {\n    var self = this;\n\n    if (propertyNames && !isArray$3(propertyNames)) {\n      propertyNames = [ propertyNames ];\n    }\n\n    propertyNames = propertyNames || getPropertyNames(sourceElement.$descriptor);\n\n    var canCopyProperties = this._eventBus.fire('moddleCopy.canCopyProperties', {\n      propertyNames: propertyNames,\n      sourceElement: sourceElement,\n      targetElement: targetElement,\n      clone: clone\n    });\n\n    if (canCopyProperties === false) {\n      return targetElement;\n    }\n\n    if (isArray$3(canCopyProperties)) {\n      propertyNames = canCopyProperties;\n    }\n\n    // copy properties\n    forEach$1(propertyNames, function(propertyName) {\n      var sourceProperty;\n\n      if (has$1(sourceElement, propertyName)) {\n        sourceProperty = sourceElement.get(propertyName);\n      }\n\n      var copiedProperty = self.copyProperty(sourceProperty, targetElement, propertyName, clone);\n\n      if (!isDefined(copiedProperty)) {\n        return;\n      }\n\n      var canSetProperty = self._eventBus.fire('moddleCopy.canSetCopiedProperty', {\n        parent: targetElement,\n        property: copiedProperty,\n        propertyName: propertyName\n      });\n\n      if (canSetProperty === false) {\n        return;\n      }\n\n      // TODO(nikku): unclaim old IDs if ID property is copied over\n      // this._moddle.getPropertyDescriptor(parent, propertyName)\n      targetElement.set(propertyName, copiedProperty);\n    });\n\n    return targetElement;\n  };\n\n  /**\n   * Copy model property.\n   *\n   * @param {any} property\n   * @param {ModdleElement} parent\n   * @param {string} propertyName\n   * @param {boolean} [clone=false]\n   *\n   * @return {any}\n   */\n  ModdleCopy.prototype.copyProperty = function(property, parent, propertyName, clone = false) {\n    var self = this;\n\n    // allow others to copy property\n    var copiedProperty = this._eventBus.fire('moddleCopy.canCopyProperty', {\n      parent: parent,\n      property: property,\n      propertyName: propertyName,\n      clone: clone\n    });\n\n    // return if copying is NOT allowed\n    if (copiedProperty === false) {\n      return;\n    }\n\n    if (copiedProperty) {\n      if (isObject(copiedProperty) && copiedProperty.$type && !copiedProperty.$parent) {\n        copiedProperty.$parent = parent;\n      }\n\n      return copiedProperty;\n    }\n\n    var propertyDescriptor = this._moddle.getPropertyDescriptor(parent, propertyName);\n\n    // do NOT copy references\n    if (propertyDescriptor.isReference) {\n      return;\n    }\n\n    // copy id\n    if (propertyDescriptor.isId) {\n      return property && this._copyId(property, parent, clone);\n    }\n\n    // copy arrays\n    if (isArray$3(property)) {\n      return reduce(property, function(childProperties, childProperty) {\n\n        // recursion\n        copiedProperty = self.copyProperty(childProperty, parent, propertyName, clone);\n\n        // copying might NOT be allowed\n        if (copiedProperty) {\n          return childProperties.concat(copiedProperty);\n        }\n\n        return childProperties;\n      }, []);\n    }\n\n    // copy model elements\n    if (isObject(property) && property.$type) {\n      if (this._moddle.getElementDescriptor(property).isGeneric) {\n        return;\n      }\n\n      copiedProperty = self._bpmnFactory.create(property.$type);\n\n      copiedProperty.$parent = parent;\n\n      // recursion\n      copiedProperty = self.copyElement(property, copiedProperty, null, clone);\n\n      return copiedProperty;\n    }\n\n    // copy primitive properties\n    return property;\n  };\n\n  ModdleCopy.prototype._copyId = function(id, element, clone = false) {\n    if (clone) {\n      return id;\n    }\n\n    // disallow if already taken\n    if (this._moddle.ids.assigned(id)) {\n      return;\n    } else {\n\n      this._moddle.ids.claim(id, element);\n      return id;\n    }\n  };\n\n  // helpers //////////\n\n  function getPropertyNames(descriptor, keepDefaultProperties) {\n    return reduce(descriptor.properties, function(properties, property) {\n\n      if (keepDefaultProperties && property.default) {\n        return properties;\n      }\n\n      return properties.concat(property.name);\n    }, []);\n  }\n\n  function is(element, type) {\n    return element && isFunction(element.$instanceOf) && element.$instanceOf(type);\n  }\n\n  var CopyPasteModule = {\n    __depends__: [\n      CopyPasteModule$1\n    ],\n    __init__: [ 'bpmnCopyPaste', 'moddleCopy' ],\n    bpmnCopyPaste: [ 'type', BpmnCopyPaste ],\n    moddleCopy: [ 'type', ModdleCopy ]\n  };\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   *\n   * @typedef {import('../../core/Types').ShapeLike} Shape\n   */\n\n  var round$5 = Math.round;\n\n  /**\n   * Service that allows replacing of elements.\n   *\n   * @param {Modeling} modeling\n   * @param {EventBus} eventBus\n   */\n  function Replace(modeling, eventBus) {\n    this._modeling = modeling;\n    this._eventBus = eventBus;\n  }\n\n  Replace.$inject = [ 'modeling', 'eventBus' ];\n\n  /**\n   * Replace an element.\n   *\n   * @param {Shape} oldElement The element to be replaced.\n   * @param {Object} attrs Containing information about the new element, for\n   * example the new bounds and type.\n   * @param {Object} hints Custom hints that will be attached to the context. It\n   * can be used to inject data that is needed in the command chain. For example\n   * it could be used in eventbus.on('commandStack.shape.replace.postExecute') to\n   * change shape attributes after shape creation.\n   *\n   * @return {Shape}\n   */\n  Replace.prototype.replaceElement = function(oldElement, attrs, hints) {\n\n    if (oldElement.waypoints) {\n\n      // TODO(nikku): we do not replace connections, yet\n      return null;\n    }\n\n    var modeling = this._modeling;\n    var eventBus = this._eventBus;\n\n    eventBus.fire('replace.start', {\n      element: oldElement,\n      attrs,\n      hints\n    });\n\n    var width = attrs.width || oldElement.width,\n        height = attrs.height || oldElement.height,\n        x = attrs.x || oldElement.x,\n        y = attrs.y || oldElement.y,\n        centerX = round$5(x + width / 2),\n        centerY = round$5(y + height / 2);\n\n    // modeling API requires center coordinates,\n    // account for that when handling shape bounds\n\n    var newElement = modeling.replaceShape(\n      oldElement,\n      assign$1(\n        {},\n        attrs,\n        {\n          x: centerX,\n          y: centerY,\n          width: width,\n          height: height\n        }\n      ),\n      hints\n    );\n\n    eventBus.fire('replace.end', {\n      element: oldElement,\n      newElement,\n      hints\n    });\n\n    return newElement;\n  };\n\n  function ReplaceSelectionBehavior(selection, eventBus) {\n\n    eventBus.on('replace.end', 500, function(event) {\n      const {\n        newElement,\n        hints = {}\n      } = event;\n\n      if (hints.select === false) {\n        return;\n      }\n\n      selection.select(newElement);\n    });\n\n  }\n\n  ReplaceSelectionBehavior.$inject = [ 'selection', 'eventBus' ];\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var ReplaceModule$1 = {\n    __init__: [ 'replace', 'replaceSelectionBehavior' ],\n    replaceSelectionBehavior: [ 'type', ReplaceSelectionBehavior ],\n    replace: [ 'type', Replace ]\n  };\n\n  /**\n   * @typedef {import('../modeling/BpmnFactory').default} BpmnFactory\n   * @typedef {import('../modeling/ElementFactory').default} ElementFactory\n   * @typedef {import('../copy-paste/ModdleCopy').default} ModdleCopy\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   * @typedef {import('diagram-js/lib/features/replace/Replace').default} Replace\n   * @typedef {import('diagram-js/lib/features/rules/Rules').default} Rules\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Shape} Shape\n   * @typedef {import('../../model/Types').ModdleElement} ModdleElement\n   *\n   * @typedef { {\n   *   type: string;\n   *   cancelActivity: boolean;\n   *   instantiate: boolean;\n   *   eventGatewayType: string;\n   *   triggeredByEvent: boolean;\n   *   isInterrupting: boolean;\n   *   collapsed: boolean;\n   *   isExpanded: boolean;\n   *   eventDefinitionType: string;\n   *   eventDefinitionAttrs: Object;\n   *   host: Shape;\n   * } } TargetElement\n   *\n   * @typedef { {\n   *   moveChildren: boolean;\n   * } & Record<string, any> } Hints\n   */\n\n  function copyProperties(source, target, properties) {\n    if (!isArray$3(properties)) {\n      properties = [ properties ];\n    }\n\n    forEach$1(properties, function(property) {\n      if (!isUndefined$2(source[property])) {\n        target[property] = source[property];\n      }\n    });\n  }\n\n\n  var CUSTOM_PROPERTIES = [\n    'cancelActivity',\n    'instantiate',\n    'eventGatewayType',\n    'triggeredByEvent',\n    'isInterrupting'\n  ];\n\n  /**\n   * Check if element should be collapsed or expanded.\n   */\n  function shouldToggleCollapsed(element, targetElement) {\n\n    var oldCollapsed = (\n      element && has$1(element, 'collapsed') ? element.collapsed : !isExpanded(element)\n    );\n\n    var targetCollapsed;\n\n    if (targetElement && (has$1(targetElement, 'collapsed') || has$1(targetElement, 'isExpanded'))) {\n\n      // property is explicitly set so use it\n      targetCollapsed = (\n        has$1(targetElement, 'collapsed') ? targetElement.collapsed : !targetElement.isExpanded\n      );\n    } else {\n\n      // keep old state\n      targetCollapsed = oldCollapsed;\n    }\n\n    if (oldCollapsed !== targetCollapsed) {\n      return true;\n    }\n\n    return false;\n  }\n\n\n  /**\n   * BPMN-specific replace.\n   *\n   * @param {BpmnFactory} bpmnFactory\n   * @param {ElementFactory} elementFactory\n   * @param {ModdleCopy} moddleCopy\n   * @param {Modeling} modeling\n   * @param {Replace} replace\n   * @param {Rules} rules\n   */\n  function BpmnReplace(\n      bpmnFactory,\n      elementFactory,\n      moddleCopy,\n      modeling,\n      replace,\n      rules\n  ) {\n\n    /**\n     * Prepares a new business object for the replacement element\n     * and triggers the replace operation.\n     *\n     * @param  {Element} element\n     * @param  {TargetElement} targetElement\n     * @param  {Hints} [hints]\n     *\n     * @return {Element}\n     */\n    function replaceElement(element, targetElement, hints) {\n\n      hints = hints || {};\n\n      var type = targetElement.type,\n          oldBusinessObject = element.businessObject;\n\n      if (isSubProcess(oldBusinessObject) && type === 'bpmn:SubProcess') {\n        if (shouldToggleCollapsed(element, targetElement)) {\n\n          // expanding or collapsing process\n          modeling.toggleCollapse(element);\n\n          return element;\n        }\n      }\n\n      var newBusinessObject = bpmnFactory.create(type);\n\n      var newElement = {\n        type: type,\n        businessObject: newBusinessObject,\n      };\n\n      newElement.di = {};\n\n      // colors will be set to DI\n      copyProperties(element.di, newElement.di, [\n        'fill',\n        'stroke',\n        'background-color',\n        'border-color',\n        'color'\n      ]);\n\n      var elementProps = getPropertyNames(oldBusinessObject.$descriptor),\n          newElementProps = getPropertyNames(newBusinessObject.$descriptor, true),\n          copyProps = intersection(elementProps, newElementProps);\n\n      // initialize special properties defined in target definition\n      assign$1(newBusinessObject, pick(targetElement, CUSTOM_PROPERTIES));\n\n      var properties = filter(copyProps, function(propertyName) {\n\n        // copying event definitions, unless we replace\n        if (propertyName === 'eventDefinitions') {\n          return hasEventDefinition$1(element, targetElement.eventDefinitionType);\n        }\n\n        // retain loop characteristics if the target element\n        // is not an event sub process\n        if (propertyName === 'loopCharacteristics') {\n          return !isEventSubProcess(newBusinessObject);\n        }\n\n        // so the applied properties from 'target' don't get lost\n        if (has$1(newBusinessObject, propertyName)) {\n          return false;\n        }\n\n        if (propertyName === 'processRef' && targetElement.isExpanded === false) {\n          return false;\n        }\n\n        if (propertyName === 'triggeredByEvent') {\n          return false;\n        }\n\n        return true;\n      });\n\n      newBusinessObject = moddleCopy.copyElement(\n        oldBusinessObject,\n        newBusinessObject,\n        properties\n      );\n\n      // initialize custom BPMN extensions\n      if (targetElement.eventDefinitionType) {\n\n        // only initialize with new eventDefinition\n        // if we did not set an event definition yet,\n        // i.e. because we copied it\n        if (!hasEventDefinition$1(newBusinessObject, targetElement.eventDefinitionType)) {\n          newElement.eventDefinitionType = targetElement.eventDefinitionType;\n          newElement.eventDefinitionAttrs = targetElement.eventDefinitionAttrs;\n        }\n      }\n\n      if (is$1(oldBusinessObject, 'bpmn:Activity')) {\n\n        if (isSubProcess(oldBusinessObject)) {\n\n          // no toggeling, so keep old state\n          newElement.isExpanded = isExpanded(element);\n        }\n\n        // else if property is explicitly set, use it\n        else if (targetElement && has$1(targetElement, 'isExpanded')) {\n          newElement.isExpanded = targetElement.isExpanded;\n\n          // assign default size of new expanded element\n          var defaultSize = elementFactory.getDefaultSize(newBusinessObject, {\n            isExpanded: newElement.isExpanded\n          });\n\n          newElement.width = defaultSize.width;\n          newElement.height = defaultSize.height;\n\n          // keep element centered\n          newElement.x = element.x - (newElement.width - element.width) / 2;\n          newElement.y = element.y - (newElement.height - element.height) / 2;\n        }\n\n        // TODO: need also to respect min/max Size\n        // copy size, from an expanded subprocess to an expanded alternative subprocess\n        // except bpmn:Task, because Task is always expanded\n        if ((isExpanded(element) && !is$1(oldBusinessObject, 'bpmn:Task')) && newElement.isExpanded) {\n          newElement.width = element.width;\n          newElement.height = element.height;\n        }\n      }\n\n      // remove children if not expanding sub process\n      if (isSubProcess(oldBusinessObject) && !isSubProcess(newBusinessObject)) {\n        hints.moveChildren = false;\n      }\n\n      // transform collapsed/expanded pools\n      if (is$1(oldBusinessObject, 'bpmn:Participant')) {\n\n        // create expanded pool\n        if (targetElement.isExpanded === true) {\n          newBusinessObject.processRef = bpmnFactory.create('bpmn:Process');\n        } else {\n\n          // remove children when transforming to collapsed pool\n          hints.moveChildren = false;\n        }\n\n        // apply same width and default height\n        newElement.width = element.width;\n        newElement.height = elementFactory.getDefaultSize(newElement).height;\n      }\n\n      if (!rules.allowed('shape.resize', { shape: newBusinessObject })) {\n        newElement.height = elementFactory.getDefaultSize(newElement).height;\n        newElement.width = elementFactory.getDefaultSize(newElement).width;\n      }\n\n      newBusinessObject.name = oldBusinessObject.name;\n\n      // retain default flow's reference between inclusive <-> exclusive gateways and activities\n      if (\n        isAny(oldBusinessObject, [\n          'bpmn:ExclusiveGateway',\n          'bpmn:InclusiveGateway',\n          'bpmn:Activity'\n        ]) &&\n        isAny(newBusinessObject, [\n          'bpmn:ExclusiveGateway',\n          'bpmn:InclusiveGateway',\n          'bpmn:Activity'\n        ])\n      ) {\n        newBusinessObject.default = oldBusinessObject.default;\n      }\n\n      if (\n        targetElement.host &&\n        !is$1(oldBusinessObject, 'bpmn:BoundaryEvent') &&\n        is$1(newBusinessObject, 'bpmn:BoundaryEvent')\n      ) {\n        newElement.host = targetElement.host;\n      }\n\n      // The DataStoreReference element is 14px wider than the DataObjectReference element\n      // This ensures that they stay centered on the x axis when replaced\n      if (\n        newElement.type === 'bpmn:DataStoreReference' ||\n        newElement.type === 'bpmn:DataObjectReference'\n      ) {\n        newElement.x = element.x + (element.width - newElement.width) / 2;\n      }\n\n      return replace.replaceElement(element, newElement, hints);\n    }\n\n    this.replaceElement = replaceElement;\n  }\n\n  BpmnReplace.$inject = [\n    'bpmnFactory',\n    'elementFactory',\n    'moddleCopy',\n    'modeling',\n    'replace',\n    'rules'\n  ];\n\n  /**\n   * @param {ModdleElement} businessObject\n   *\n   * @return {boolean}\n   */\n  function isSubProcess(businessObject) {\n    return is$1(businessObject, 'bpmn:SubProcess');\n  }\n\n  /**\n   * @param {Element|ModdleElement} element\n   * @param {string} type\n   *\n   * @return {boolean}\n   */\n  function hasEventDefinition$1(element, type) {\n    var businessObject = getBusinessObject(element);\n\n    return type && businessObject.get('eventDefinitions').some(function(definition) {\n      return is$1(definition, type);\n    });\n  }\n\n  /**\n   * Compute intersection between two arrays.\n   *\n   * @param {Array} a\n   * @param {Array} b\n   *\n   * @return {Array}\n   */\n  function intersection(a, b) {\n    return a.filter(function(item) {\n      return b.includes(item);\n    });\n  }\n\n  var ReplaceModule = {\n    __depends__: [\n      CopyPasteModule,\n      ReplaceModule$1,\n      SelectionModule\n    ],\n    bpmnReplace: [ 'type', BpmnReplace ]\n  };\n\n  /**\n   * @typedef {import('../../../model/Types').Element} Element\n   * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenu').PopupMenuTarget} PopupMenuTarget\n   *\n   * @typedef {(entry: PopupMenuTarget) => boolean} DifferentTypeValidator\n   */\n\n  /**\n   * Returns true, if an element is from a different type\n   * than a target definition. Takes into account the type,\n   * event definition type and triggeredByEvent property.\n   *\n   * @param {Element} element\n   *\n   * @return {DifferentTypeValidator}\n   */\n  function isDifferentType(element) {\n\n    return function(entry) {\n      var target = entry.target;\n\n      var businessObject = getBusinessObject(element),\n          eventDefinition = businessObject.eventDefinitions && businessObject.eventDefinitions[0];\n\n      var isTypeEqual = businessObject.$type === target.type;\n\n      var isEventDefinitionEqual = (\n        (eventDefinition && eventDefinition.$type) === target.eventDefinitionType\n      );\n\n      var isTriggeredByEventEqual = (\n\n        // coherse to <false>\n        !!target.triggeredByEvent === !!businessObject.triggeredByEvent\n      );\n\n      var isExpandedEqual = (\n        target.isExpanded === undefined ||\n        target.isExpanded === isExpanded(element)\n      );\n\n      return !isTypeEqual || !isEventDefinitionEqual || !isTriggeredByEventEqual || !isExpandedEqual;\n    };\n  }\n\n  /**\n   * @typedef { () => string } LabelGetter\n   *\n   * @typedef { {\n   *   label: string | LabelGetter;\n   *   actionName: string;\n   *   className: string;\n   *   target?: {\n   *     type: string;\n   *     isExpanded?: boolean;\n   *     isInterrupting?: boolean;\n   *     triggeredByEvent?: boolean;\n   *     cancelActivity?: boolean;\n   *     eventDefinitionType?: string;\n   *     eventDefinitionAttrs?: Record<string, any>\n   *   };\n   * } } ReplaceOption\n   */\n\n  /**\n   * @type {ReplaceOption[]}\n   */\n  var START_EVENT = [\n    {\n      label: 'Start Event',\n      actionName: 'replace-with-none-start',\n      className: 'bpmn-icon-start-event-none',\n      target: {\n        type: 'bpmn:StartEvent'\n      }\n    },\n    {\n      label: 'Intermediate Throw Event',\n      actionName: 'replace-with-none-intermediate-throwing',\n      className: 'bpmn-icon-intermediate-event-none',\n      target: {\n        type: 'bpmn:IntermediateThrowEvent'\n      }\n    },\n    {\n      label: 'End Event',\n      actionName: 'replace-with-none-end',\n      className: 'bpmn-icon-end-event-none',\n      target: {\n        type: 'bpmn:EndEvent'\n      }\n    },\n    {\n      label: 'Message Start Event',\n      actionName: 'replace-with-message-start',\n      className: 'bpmn-icon-start-event-message',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:MessageEventDefinition'\n      }\n    },\n    {\n      label: 'Timer Start Event',\n      actionName: 'replace-with-timer-start',\n      className: 'bpmn-icon-start-event-timer',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:TimerEventDefinition'\n      }\n    },\n    {\n      label: 'Conditional Start Event',\n      actionName: 'replace-with-conditional-start',\n      className: 'bpmn-icon-start-event-condition',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:ConditionalEventDefinition'\n      }\n    },\n    {\n      label: 'Signal Start Event',\n      actionName: 'replace-with-signal-start',\n      className: 'bpmn-icon-start-event-signal',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:SignalEventDefinition'\n      }\n    }\n  ];\n\n  /**\n   * @type {ReplaceOption[]}\n   */\n  var START_EVENT_SUB_PROCESS = [\n    {\n      label: 'Start Event',\n      actionName: 'replace-with-none-start',\n      className: 'bpmn-icon-start-event-none',\n      target: {\n        type: 'bpmn:StartEvent'\n      }\n    },\n    {\n      label: 'Intermediate Throw Event',\n      actionName: 'replace-with-none-intermediate-throwing',\n      className: 'bpmn-icon-intermediate-event-none',\n      target: {\n        type: 'bpmn:IntermediateThrowEvent'\n      }\n    },\n    {\n      label: 'End Event',\n      actionName: 'replace-with-none-end',\n      className: 'bpmn-icon-end-event-none',\n      target: {\n        type: 'bpmn:EndEvent'\n      }\n    }\n  ];\n\n  /**\n   * @type {ReplaceOption[]}\n   */\n  var INTERMEDIATE_EVENT = [\n    {\n      label: 'Start Event',\n      actionName: 'replace-with-none-start',\n      className: 'bpmn-icon-start-event-none',\n      target: {\n        type: 'bpmn:StartEvent'\n      }\n    },\n    {\n      label: 'Intermediate Throw Event',\n      actionName: 'replace-with-none-intermediate-throw',\n      className: 'bpmn-icon-intermediate-event-none',\n      target: {\n        type: 'bpmn:IntermediateThrowEvent'\n      }\n    },\n    {\n      label: 'End Event',\n      actionName: 'replace-with-none-end',\n      className: 'bpmn-icon-end-event-none',\n      target: {\n        type: 'bpmn:EndEvent'\n      }\n    },\n    {\n      label: 'Message Intermediate Catch Event',\n      actionName: 'replace-with-message-intermediate-catch',\n      className: 'bpmn-icon-intermediate-event-catch-message',\n      target: {\n        type: 'bpmn:IntermediateCatchEvent',\n        eventDefinitionType: 'bpmn:MessageEventDefinition'\n      }\n    },\n    {\n      label: 'Message Intermediate Throw Event',\n      actionName: 'replace-with-message-intermediate-throw',\n      className: 'bpmn-icon-intermediate-event-throw-message',\n      target: {\n        type: 'bpmn:IntermediateThrowEvent',\n        eventDefinitionType: 'bpmn:MessageEventDefinition'\n      }\n    },\n    {\n      label: 'Timer Intermediate Catch Event',\n      actionName: 'replace-with-timer-intermediate-catch',\n      className: 'bpmn-icon-intermediate-event-catch-timer',\n      target: {\n        type: 'bpmn:IntermediateCatchEvent',\n        eventDefinitionType: 'bpmn:TimerEventDefinition'\n      }\n    },\n    {\n      label: 'Escalation Intermediate Throw Event',\n      actionName: 'replace-with-escalation-intermediate-throw',\n      className: 'bpmn-icon-intermediate-event-throw-escalation',\n      target: {\n        type: 'bpmn:IntermediateThrowEvent',\n        eventDefinitionType: 'bpmn:EscalationEventDefinition'\n      }\n    },\n    {\n      label: 'Conditional Intermediate Catch Event',\n      actionName: 'replace-with-conditional-intermediate-catch',\n      className: 'bpmn-icon-intermediate-event-catch-condition',\n      target: {\n        type: 'bpmn:IntermediateCatchEvent',\n        eventDefinitionType: 'bpmn:ConditionalEventDefinition'\n      }\n    },\n    {\n      label: 'Link Intermediate Catch Event',\n      actionName: 'replace-with-link-intermediate-catch',\n      className: 'bpmn-icon-intermediate-event-catch-link',\n      target: {\n        type: 'bpmn:IntermediateCatchEvent',\n        eventDefinitionType: 'bpmn:LinkEventDefinition',\n        eventDefinitionAttrs: {\n          name: ''\n        }\n      }\n    },\n    {\n      label: 'Link Intermediate Throw Event',\n      actionName: 'replace-with-link-intermediate-throw',\n      className: 'bpmn-icon-intermediate-event-throw-link',\n      target: {\n        type: 'bpmn:IntermediateThrowEvent',\n        eventDefinitionType: 'bpmn:LinkEventDefinition',\n        eventDefinitionAttrs: {\n          name: ''\n        }\n      }\n    },\n    {\n      label: 'Compensation Intermediate Throw Event',\n      actionName: 'replace-with-compensation-intermediate-throw',\n      className: 'bpmn-icon-intermediate-event-throw-compensation',\n      target: {\n        type: 'bpmn:IntermediateThrowEvent',\n        eventDefinitionType: 'bpmn:CompensateEventDefinition'\n      }\n    },\n    {\n      label: 'Signal Intermediate Catch Event',\n      actionName: 'replace-with-signal-intermediate-catch',\n      className: 'bpmn-icon-intermediate-event-catch-signal',\n      target: {\n        type: 'bpmn:IntermediateCatchEvent',\n        eventDefinitionType: 'bpmn:SignalEventDefinition'\n      }\n    },\n    {\n      label: 'Signal Intermediate Throw Event',\n      actionName: 'replace-with-signal-intermediate-throw',\n      className: 'bpmn-icon-intermediate-event-throw-signal',\n      target: {\n        type: 'bpmn:IntermediateThrowEvent',\n        eventDefinitionType: 'bpmn:SignalEventDefinition'\n      }\n    }\n  ];\n\n  /**\n   * @type {ReplaceOption[]}\n   */\n  var END_EVENT = [\n    {\n      label: 'Start Event',\n      actionName: 'replace-with-none-start',\n      className: 'bpmn-icon-start-event-none',\n      target: {\n        type: 'bpmn:StartEvent'\n      }\n    },\n    {\n      label: 'Intermediate Throw Event',\n      actionName: 'replace-with-none-intermediate-throw',\n      className: 'bpmn-icon-intermediate-event-none',\n      target: {\n        type: 'bpmn:IntermediateThrowEvent'\n      }\n    },\n    {\n      label: 'End Event',\n      actionName: 'replace-with-none-end',\n      className: 'bpmn-icon-end-event-none',\n      target: {\n        type: 'bpmn:EndEvent'\n      }\n    },\n    {\n      label: 'Message End Event',\n      actionName: 'replace-with-message-end',\n      className: 'bpmn-icon-end-event-message',\n      target: {\n        type: 'bpmn:EndEvent',\n        eventDefinitionType: 'bpmn:MessageEventDefinition'\n      }\n    },\n    {\n      label: 'Escalation End Event',\n      actionName: 'replace-with-escalation-end',\n      className: 'bpmn-icon-end-event-escalation',\n      target: {\n        type: 'bpmn:EndEvent',\n        eventDefinitionType: 'bpmn:EscalationEventDefinition'\n      }\n    },\n    {\n      label: 'Error End Event',\n      actionName: 'replace-with-error-end',\n      className: 'bpmn-icon-end-event-error',\n      target: {\n        type: 'bpmn:EndEvent',\n        eventDefinitionType: 'bpmn:ErrorEventDefinition'\n      }\n    },\n    {\n      label: 'Cancel End Event',\n      actionName: 'replace-with-cancel-end',\n      className: 'bpmn-icon-end-event-cancel',\n      target: {\n        type: 'bpmn:EndEvent',\n        eventDefinitionType: 'bpmn:CancelEventDefinition'\n      }\n    },\n    {\n      label: 'Compensation End Event',\n      actionName: 'replace-with-compensation-end',\n      className: 'bpmn-icon-end-event-compensation',\n      target: {\n        type: 'bpmn:EndEvent',\n        eventDefinitionType: 'bpmn:CompensateEventDefinition'\n      }\n    },\n    {\n      label: 'Signal End Event',\n      actionName: 'replace-with-signal-end',\n      className: 'bpmn-icon-end-event-signal',\n      target: {\n        type: 'bpmn:EndEvent',\n        eventDefinitionType: 'bpmn:SignalEventDefinition'\n      }\n    },\n    {\n      label: 'Terminate End Event',\n      actionName: 'replace-with-terminate-end',\n      className: 'bpmn-icon-end-event-terminate',\n      target: {\n        type: 'bpmn:EndEvent',\n        eventDefinitionType: 'bpmn:TerminateEventDefinition'\n      }\n    }\n  ];\n\n  /**\n   * @type {ReplaceOption[]}\n   */\n  var GATEWAY = [\n    {\n      label: 'Exclusive Gateway',\n      actionName: 'replace-with-exclusive-gateway',\n      className: 'bpmn-icon-gateway-xor',\n      target: {\n        type: 'bpmn:ExclusiveGateway'\n      }\n    },\n    {\n      label: 'Parallel Gateway',\n      actionName: 'replace-with-parallel-gateway',\n      className: 'bpmn-icon-gateway-parallel',\n      target: {\n        type: 'bpmn:ParallelGateway'\n      }\n    },\n    {\n      label: 'Inclusive Gateway',\n      actionName: 'replace-with-inclusive-gateway',\n      className: 'bpmn-icon-gateway-or',\n      target: {\n        type: 'bpmn:InclusiveGateway'\n      }\n    },\n    {\n      label: 'Complex Gateway',\n      actionName: 'replace-with-complex-gateway',\n      className: 'bpmn-icon-gateway-complex',\n      target: {\n        type: 'bpmn:ComplexGateway'\n      }\n    },\n    {\n      label: 'Event based Gateway',\n      actionName: 'replace-with-event-based-gateway',\n      className: 'bpmn-icon-gateway-eventbased',\n      target: {\n        type: 'bpmn:EventBasedGateway',\n        instantiate: false,\n        eventGatewayType: 'Exclusive'\n      }\n    }\n\n    // Gateways deactivated until https://github.com/bpmn-io/bpmn-js/issues/194\n    // {\n    //   label: 'Event based instantiating Gateway',\n    //   actionName: 'replace-with-exclusive-event-based-gateway',\n    //   className: 'bpmn-icon-exclusive-event-based',\n    //   target: {\n    //     type: 'bpmn:EventBasedGateway'\n    //   },\n    //   options: {\n    //     businessObject: { instantiate: true, eventGatewayType: 'Exclusive' }\n    //   }\n    // },\n    // {\n    //   label: 'Parallel Event based instantiating Gateway',\n    //   actionName: 'replace-with-parallel-event-based-instantiate-gateway',\n    //   className: 'bpmn-icon-parallel-event-based-instantiate-gateway',\n    //   target: {\n    //     type: 'bpmn:EventBasedGateway'\n    //   },\n    //   options: {\n    //     businessObject: { instantiate: true, eventGatewayType: 'Parallel' }\n    //   }\n    // }\n  ];\n\n  /**\n   * @type {ReplaceOption[]}\n   */\n  var SUBPROCESS_EXPANDED = [\n    {\n      label: 'Transaction',\n      actionName: 'replace-with-transaction',\n      className: 'bpmn-icon-transaction',\n      target: {\n        type: 'bpmn:Transaction',\n        isExpanded: true\n      }\n    },\n    {\n      label: 'Event Sub Process',\n      actionName: 'replace-with-event-subprocess',\n      className: 'bpmn-icon-event-subprocess-expanded',\n      target: {\n        type: 'bpmn:SubProcess',\n        triggeredByEvent: true,\n        isExpanded: true\n      }\n    },\n    {\n      label: 'Sub Process (collapsed)',\n      actionName: 'replace-with-collapsed-subprocess',\n      className: 'bpmn-icon-subprocess-collapsed',\n      target: {\n        type: 'bpmn:SubProcess',\n        isExpanded: false\n      }\n    }\n  ];\n\n  /**\n   * @type {ReplaceOption[]}\n   */\n  var TRANSACTION = [\n    {\n      label: 'Transaction',\n      actionName: 'replace-with-transaction',\n      className: 'bpmn-icon-transaction',\n      target: {\n        type: 'bpmn:Transaction',\n        isExpanded: true\n      }\n    },\n    {\n      label: 'Sub Process',\n      actionName: 'replace-with-subprocess',\n      className: 'bpmn-icon-subprocess-expanded',\n      target: {\n        type: 'bpmn:SubProcess',\n        isExpanded: true\n      }\n    },\n    {\n      label: 'Event Sub Process',\n      actionName: 'replace-with-event-subprocess',\n      className: 'bpmn-icon-event-subprocess-expanded',\n      target: {\n        type: 'bpmn:SubProcess',\n        triggeredByEvent: true,\n        isExpanded: true\n      }\n    }\n  ];\n\n  /**\n   * @type {ReplaceOption[]}\n   */\n  var EVENT_SUB_PROCESS = TRANSACTION;\n\n  /**\n   * @type {ReplaceOption[]}\n   */\n  var TASK = [\n    {\n      label: 'Task',\n      actionName: 'replace-with-task',\n      className: 'bpmn-icon-task',\n      target: {\n        type: 'bpmn:Task'\n      }\n    },\n    {\n      label: 'User Task',\n      actionName: 'replace-with-user-task',\n      className: 'bpmn-icon-user',\n      target: {\n        type: 'bpmn:UserTask'\n      }\n    },\n    {\n      label: 'Service Task',\n      actionName: 'replace-with-service-task',\n      className: 'bpmn-icon-service',\n      target: {\n        type: 'bpmn:ServiceTask'\n      }\n    },\n    {\n      label: 'Send Task',\n      actionName: 'replace-with-send-task',\n      className: 'bpmn-icon-send',\n      target: {\n        type: 'bpmn:SendTask'\n      }\n    },\n    {\n      label: 'Receive Task',\n      actionName: 'replace-with-receive-task',\n      className: 'bpmn-icon-receive',\n      target: {\n        type: 'bpmn:ReceiveTask'\n      }\n    },\n    {\n      label: 'Manual Task',\n      actionName: 'replace-with-manual-task',\n      className: 'bpmn-icon-manual',\n      target: {\n        type: 'bpmn:ManualTask'\n      }\n    },\n    {\n      label: 'Business Rule Task',\n      actionName: 'replace-with-rule-task',\n      className: 'bpmn-icon-business-rule',\n      target: {\n        type: 'bpmn:BusinessRuleTask'\n      }\n    },\n    {\n      label: 'Script Task',\n      actionName: 'replace-with-script-task',\n      className: 'bpmn-icon-script',\n      target: {\n        type: 'bpmn:ScriptTask'\n      }\n    },\n    {\n      label: 'Call Activity',\n      actionName: 'replace-with-call-activity',\n      className: 'bpmn-icon-call-activity',\n      target: {\n        type: 'bpmn:CallActivity'\n      }\n    },\n    {\n      label: 'Sub Process (collapsed)',\n      actionName: 'replace-with-collapsed-subprocess',\n      className: 'bpmn-icon-subprocess-collapsed',\n      target: {\n        type: 'bpmn:SubProcess',\n        isExpanded: false\n      }\n    },\n    {\n      label: 'Sub Process (expanded)',\n      actionName: 'replace-with-expanded-subprocess',\n      className: 'bpmn-icon-subprocess-expanded',\n      target: {\n        type: 'bpmn:SubProcess',\n        isExpanded: true\n      }\n    }\n  ];\n\n  /**\n   * @type {ReplaceOption[]}\n   */\n  var DATA_OBJECT_REFERENCE = [\n    {\n      label: 'Data Store Reference',\n      actionName: 'replace-with-data-store-reference',\n      className: 'bpmn-icon-data-store',\n      target: {\n        type: 'bpmn:DataStoreReference'\n      }\n    }\n  ];\n\n  /**\n   * @type {ReplaceOption[]}\n   */\n  var DATA_STORE_REFERENCE = [\n    {\n      label: 'Data Object Reference',\n      actionName: 'replace-with-data-object-reference',\n      className: 'bpmn-icon-data-object',\n      target: {\n        type: 'bpmn:DataObjectReference'\n      }\n    }\n  ];\n\n  /**\n   * @type {ReplaceOption[]}\n   */\n  var BOUNDARY_EVENT = [\n    {\n      label: 'Message Boundary Event',\n      actionName: 'replace-with-message-boundary',\n      className: 'bpmn-icon-intermediate-event-catch-message',\n      target: {\n        type: 'bpmn:BoundaryEvent',\n        eventDefinitionType: 'bpmn:MessageEventDefinition'\n      }\n    },\n    {\n      label: 'Timer Boundary Event',\n      actionName: 'replace-with-timer-boundary',\n      className: 'bpmn-icon-intermediate-event-catch-timer',\n      target: {\n        type: 'bpmn:BoundaryEvent',\n        eventDefinitionType: 'bpmn:TimerEventDefinition'\n      }\n    },\n    {\n      label: 'Escalation Boundary Event',\n      actionName: 'replace-with-escalation-boundary',\n      className: 'bpmn-icon-intermediate-event-catch-escalation',\n      target: {\n        type: 'bpmn:BoundaryEvent',\n        eventDefinitionType: 'bpmn:EscalationEventDefinition'\n      }\n    },\n    {\n      label: 'Conditional Boundary Event',\n      actionName: 'replace-with-conditional-boundary',\n      className: 'bpmn-icon-intermediate-event-catch-condition',\n      target: {\n        type: 'bpmn:BoundaryEvent',\n        eventDefinitionType: 'bpmn:ConditionalEventDefinition'\n      }\n    },\n    {\n      label: 'Error Boundary Event',\n      actionName: 'replace-with-error-boundary',\n      className: 'bpmn-icon-intermediate-event-catch-error',\n      target: {\n        type: 'bpmn:BoundaryEvent',\n        eventDefinitionType: 'bpmn:ErrorEventDefinition'\n      }\n    },\n    {\n      label: 'Cancel Boundary Event',\n      actionName: 'replace-with-cancel-boundary',\n      className: 'bpmn-icon-intermediate-event-catch-cancel',\n      target: {\n        type: 'bpmn:BoundaryEvent',\n        eventDefinitionType: 'bpmn:CancelEventDefinition'\n      }\n    },\n    {\n      label: 'Signal Boundary Event',\n      actionName: 'replace-with-signal-boundary',\n      className: 'bpmn-icon-intermediate-event-catch-signal',\n      target: {\n        type: 'bpmn:BoundaryEvent',\n        eventDefinitionType: 'bpmn:SignalEventDefinition'\n      }\n    },\n    {\n      label: 'Compensation Boundary Event',\n      actionName: 'replace-with-compensation-boundary',\n      className: 'bpmn-icon-intermediate-event-catch-compensation',\n      target: {\n        type: 'bpmn:BoundaryEvent',\n        eventDefinitionType: 'bpmn:CompensateEventDefinition'\n      }\n    },\n    {\n      label: 'Message Boundary Event (non-interrupting)',\n      actionName: 'replace-with-non-interrupting-message-boundary',\n      className: 'bpmn-icon-intermediate-event-catch-non-interrupting-message',\n      target: {\n        type: 'bpmn:BoundaryEvent',\n        eventDefinitionType: 'bpmn:MessageEventDefinition',\n        cancelActivity: false\n      }\n    },\n    {\n      label: 'Timer Boundary Event (non-interrupting)',\n      actionName: 'replace-with-non-interrupting-timer-boundary',\n      className: 'bpmn-icon-intermediate-event-catch-non-interrupting-timer',\n      target: {\n        type: 'bpmn:BoundaryEvent',\n        eventDefinitionType: 'bpmn:TimerEventDefinition',\n        cancelActivity: false\n      }\n    },\n    {\n      label: 'Escalation Boundary Event (non-interrupting)',\n      actionName: 'replace-with-non-interrupting-escalation-boundary',\n      className: 'bpmn-icon-intermediate-event-catch-non-interrupting-escalation',\n      target: {\n        type: 'bpmn:BoundaryEvent',\n        eventDefinitionType: 'bpmn:EscalationEventDefinition',\n        cancelActivity: false\n      }\n    },\n    {\n      label: 'Conditional Boundary Event (non-interrupting)',\n      actionName: 'replace-with-non-interrupting-conditional-boundary',\n      className: 'bpmn-icon-intermediate-event-catch-non-interrupting-condition',\n      target: {\n        type: 'bpmn:BoundaryEvent',\n        eventDefinitionType: 'bpmn:ConditionalEventDefinition',\n        cancelActivity: false\n      }\n    },\n    {\n      label: 'Signal Boundary Event (non-interrupting)',\n      actionName: 'replace-with-non-interrupting-signal-boundary',\n      className: 'bpmn-icon-intermediate-event-catch-non-interrupting-signal',\n      target: {\n        type: 'bpmn:BoundaryEvent',\n        eventDefinitionType: 'bpmn:SignalEventDefinition',\n        cancelActivity: false\n      }\n    }\n  ];\n\n  /**\n   * @type {ReplaceOption[]}\n   */\n  var EVENT_SUB_PROCESS_START_EVENT = [\n    {\n      label: 'Message Start Event',\n      actionName: 'replace-with-message-start',\n      className: 'bpmn-icon-start-event-message',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:MessageEventDefinition'\n      }\n    },\n    {\n      label: 'Timer Start Event',\n      actionName: 'replace-with-timer-start',\n      className: 'bpmn-icon-start-event-timer',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:TimerEventDefinition'\n      }\n    },\n    {\n      label: 'Conditional Start Event',\n      actionName: 'replace-with-conditional-start',\n      className: 'bpmn-icon-start-event-condition',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:ConditionalEventDefinition'\n      }\n    },\n    {\n      label: 'Signal Start Event',\n      actionName: 'replace-with-signal-start',\n      className: 'bpmn-icon-start-event-signal',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:SignalEventDefinition'\n      }\n    },\n    {\n      label: 'Error Start Event',\n      actionName: 'replace-with-error-start',\n      className: 'bpmn-icon-start-event-error',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:ErrorEventDefinition'\n      }\n    },\n    {\n      label: 'Escalation Start Event',\n      actionName: 'replace-with-escalation-start',\n      className: 'bpmn-icon-start-event-escalation',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:EscalationEventDefinition'\n      }\n    },\n    {\n      label: 'Compensation Start Event',\n      actionName: 'replace-with-compensation-start',\n      className: 'bpmn-icon-start-event-compensation',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:CompensateEventDefinition'\n      }\n    },\n    {\n      label: 'Message Start Event (non-interrupting)',\n      actionName: 'replace-with-non-interrupting-message-start',\n      className: 'bpmn-icon-start-event-non-interrupting-message',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:MessageEventDefinition',\n        isInterrupting: false\n      }\n    },\n    {\n      label: 'Timer Start Event (non-interrupting)',\n      actionName: 'replace-with-non-interrupting-timer-start',\n      className: 'bpmn-icon-start-event-non-interrupting-timer',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:TimerEventDefinition',\n        isInterrupting: false\n      }\n    },\n    {\n      label: 'Conditional Start Event (non-interrupting)',\n      actionName: 'replace-with-non-interrupting-conditional-start',\n      className: 'bpmn-icon-start-event-non-interrupting-condition',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:ConditionalEventDefinition',\n        isInterrupting: false\n      }\n    },\n    {\n      label: 'Signal Start Event (non-interrupting)',\n      actionName: 'replace-with-non-interrupting-signal-start',\n      className: 'bpmn-icon-start-event-non-interrupting-signal',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:SignalEventDefinition',\n        isInterrupting: false\n      }\n    },\n    {\n      label: 'Escalation Start Event (non-interrupting)',\n      actionName: 'replace-with-non-interrupting-escalation-start',\n      className: 'bpmn-icon-start-event-non-interrupting-escalation',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:EscalationEventDefinition',\n        isInterrupting: false\n      }\n    }\n  ];\n\n  /**\n   * @type {ReplaceOption[]}\n   */\n  var SEQUENCE_FLOW = [\n    {\n      label: 'Sequence Flow',\n      actionName: 'replace-with-sequence-flow',\n      className: 'bpmn-icon-connection'\n    },\n    {\n      label: 'Default Flow',\n      actionName: 'replace-with-default-flow',\n      className: 'bpmn-icon-default-flow'\n    },\n    {\n      label: 'Conditional Flow',\n      actionName: 'replace-with-conditional-flow',\n      className: 'bpmn-icon-conditional-flow'\n    }\n  ];\n\n  /**\n   * @type {ReplaceOption[]}\n   */\n  var PARTICIPANT = [\n    {\n      label: 'Expanded Pool',\n      actionName: 'replace-with-expanded-pool',\n      className: 'bpmn-icon-participant',\n      target: {\n        type: 'bpmn:Participant',\n        isExpanded: true\n      }\n    },\n    {\n      label: function(element) {\n        var label = 'Empty Pool';\n\n        if (element.children && element.children.length) {\n          label += ' (removes content)';\n        }\n\n        return label;\n      },\n      actionName: 'replace-with-collapsed-pool',\n\n      // TODO(@janstuemmel): maybe design new icon\n      className: 'bpmn-icon-lane',\n      target: {\n        type: 'bpmn:Participant',\n        isExpanded: false\n      }\n    }\n  ];\n\n  /**\n   * @typedef {import('../features/BpmnFactory').default} BpmnFactory\n   * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenu').default} PopupMenu\n   * @typedef {import('../features/Modeling').default} Modeling\n   * @typedef {import('../features/BpmnReplace').default} BpmnReplace\n   * @typedef {import('diagram-js/lib/features/Rules').default} Rules\n   * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Moddle} Moddle\n   *\n   * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenuProvider').PopupMenuEntries} PopupMenuEntries\n   * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenuProvider').PopupMenuEntry} PopupMenuEntry\n   * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenuProvider').PopupMenuEntryAction} PopupMenuEntryAction\n   * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenuProvider').PopupMenuHeaderEntries} PopupMenuHeaderEntries\n   * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenuProvider').default} PopupMenuProvider\n   * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenu').PopupMenuTarget} PopupMenuTarget\n   *\n   * @typedef {import('./ReplaceOptions').ReplaceOption} ReplaceOption\n   */\n\n  /**\n   * A BPMN-specific popup menu provider.\n   *\n   * @implements {PopupMenuProvider}\n   *\n   * @param {BpmnFactory} bpmnFactory\n   * @param {PopupMenu} popupMenu\n   * @param {Modeling} modeling\n   * @param {Moddle} moddle\n   * @param {BpmnReplace} bpmnReplace\n   * @param {Rules} rules\n   * @param {Translate} translate\n   */\n  function ReplaceMenuProvider(\n      bpmnFactory, popupMenu, modeling, moddle,\n      bpmnReplace, rules, translate) {\n\n    this._bpmnFactory = bpmnFactory;\n    this._popupMenu = popupMenu;\n    this._modeling = modeling;\n    this._moddle = moddle;\n    this._bpmnReplace = bpmnReplace;\n    this._rules = rules;\n    this._translate = translate;\n\n    this._register();\n  }\n\n  ReplaceMenuProvider.$inject = [\n    'bpmnFactory',\n    'popupMenu',\n    'modeling',\n    'moddle',\n    'bpmnReplace',\n    'rules',\n    'translate'\n  ];\n\n  ReplaceMenuProvider.prototype._register = function() {\n    this._popupMenu.registerProvider('bpmn-replace', this);\n  };\n\n  /**\n   * @param {PopupMenuTarget} target\n   *\n   * @return {PopupMenuEntries}\n   */\n  ReplaceMenuProvider.prototype.getPopupMenuEntries = function(target) {\n\n    var businessObject = target.businessObject;\n\n    var rules = this._rules;\n\n    var filteredReplaceOptions = [];\n\n    if (isArray$3(target) || !rules.allowed('shape.replace', { element: target })) {\n      return {};\n    }\n\n    var differentType = isDifferentType(target);\n\n    if (is$1(businessObject, 'bpmn:DataObjectReference')) {\n      return this._createEntries(target, DATA_OBJECT_REFERENCE);\n    }\n\n    if (is$1(businessObject, 'bpmn:DataStoreReference') && !is$1(target.parent, 'bpmn:Collaboration')) {\n      return this._createEntries(target, DATA_STORE_REFERENCE);\n    }\n\n    // start events outside sub processes\n    if (is$1(businessObject, 'bpmn:StartEvent') && !is$1(businessObject.$parent, 'bpmn:SubProcess')) {\n\n      filteredReplaceOptions = filter(START_EVENT, differentType);\n\n      return this._createEntries(target, filteredReplaceOptions);\n    }\n\n    // expanded/collapsed pools\n    if (is$1(businessObject, 'bpmn:Participant')) {\n\n      filteredReplaceOptions = filter(PARTICIPANT, function(replaceOption) {\n        return isExpanded(target) !== replaceOption.target.isExpanded;\n      });\n\n      return this._createEntries(target, filteredReplaceOptions);\n    }\n\n    // start events inside event sub processes\n    if (is$1(businessObject, 'bpmn:StartEvent') && isEventSubProcess(businessObject.$parent)) {\n      filteredReplaceOptions = filter(EVENT_SUB_PROCESS_START_EVENT, function(replaceOption) {\n\n        var target = replaceOption.target;\n\n        var isInterrupting = target.isInterrupting !== false;\n\n        var isInterruptingEqual = businessObject.isInterrupting === isInterrupting;\n\n        // filters elements which types and event definition are equal but have have different interrupting types\n        return differentType(replaceOption) || !differentType(replaceOption) && !isInterruptingEqual;\n\n      });\n\n      return this._createEntries(target, filteredReplaceOptions);\n    }\n\n    // start events inside sub processes\n    if (is$1(businessObject, 'bpmn:StartEvent') && !isEventSubProcess(businessObject.$parent)\n        && is$1(businessObject.$parent, 'bpmn:SubProcess')) {\n      filteredReplaceOptions = filter(START_EVENT_SUB_PROCESS, differentType);\n\n      return this._createEntries(target, filteredReplaceOptions);\n    }\n\n    // end events\n    if (is$1(businessObject, 'bpmn:EndEvent')) {\n\n      filteredReplaceOptions = filter(END_EVENT, function(replaceOption) {\n        var target = replaceOption.target;\n\n        // hide cancel end events outside transactions\n        if (target.eventDefinitionType == 'bpmn:CancelEventDefinition' && !is$1(businessObject.$parent, 'bpmn:Transaction')) {\n          return false;\n        }\n\n        return differentType(replaceOption);\n      });\n\n      return this._createEntries(target, filteredReplaceOptions);\n    }\n\n    // boundary events\n    if (is$1(businessObject, 'bpmn:BoundaryEvent')) {\n\n      filteredReplaceOptions = filter(BOUNDARY_EVENT, function(replaceOption) {\n\n        var target = replaceOption.target;\n\n        if (target.eventDefinitionType == 'bpmn:CancelEventDefinition' &&\n           !is$1(businessObject.attachedToRef, 'bpmn:Transaction')) {\n          return false;\n        }\n        var cancelActivity = target.cancelActivity !== false;\n\n        var isCancelActivityEqual = businessObject.cancelActivity == cancelActivity;\n\n        return differentType(replaceOption) || !differentType(replaceOption) && !isCancelActivityEqual;\n      });\n\n      return this._createEntries(target, filteredReplaceOptions);\n    }\n\n    // intermediate events\n    if (is$1(businessObject, 'bpmn:IntermediateCatchEvent') ||\n        is$1(businessObject, 'bpmn:IntermediateThrowEvent')) {\n\n      filteredReplaceOptions = filter(INTERMEDIATE_EVENT, differentType);\n\n      return this._createEntries(target, filteredReplaceOptions);\n    }\n\n    // gateways\n    if (is$1(businessObject, 'bpmn:Gateway')) {\n\n      filteredReplaceOptions = filter(GATEWAY, differentType);\n\n      return this._createEntries(target, filteredReplaceOptions);\n    }\n\n    // transactions\n    if (is$1(businessObject, 'bpmn:Transaction')) {\n\n      filteredReplaceOptions = filter(TRANSACTION, differentType);\n\n      return this._createEntries(target, filteredReplaceOptions);\n    }\n\n    // expanded event sub processes\n    if (isEventSubProcess(businessObject) && isExpanded(target)) {\n\n      filteredReplaceOptions = filter(EVENT_SUB_PROCESS, differentType);\n\n      return this._createEntries(target, filteredReplaceOptions);\n    }\n\n    // expanded sub processes\n    if (is$1(businessObject, 'bpmn:SubProcess') && isExpanded(target)) {\n\n      filteredReplaceOptions = filter(SUBPROCESS_EXPANDED, differentType);\n\n      return this._createEntries(target, filteredReplaceOptions);\n    }\n\n    // collapsed ad hoc sub processes\n    if (is$1(businessObject, 'bpmn:AdHocSubProcess') && !isExpanded(target)) {\n\n      filteredReplaceOptions = filter(TASK, function(replaceOption) {\n\n        var target = replaceOption.target;\n\n        var isTargetSubProcess = target.type === 'bpmn:SubProcess';\n\n        var isTargetExpanded = target.isExpanded === true;\n\n        return isDifferentType(target) && (!isTargetSubProcess || isTargetExpanded);\n      });\n\n      return this._createEntries(target, filteredReplaceOptions);\n    }\n\n    // sequence flows\n    if (is$1(businessObject, 'bpmn:SequenceFlow')) {\n      return this._createSequenceFlowEntries(target, SEQUENCE_FLOW);\n    }\n\n    // flow nodes\n    if (is$1(businessObject, 'bpmn:FlowNode')) {\n      filteredReplaceOptions = filter(TASK, differentType);\n\n      // collapsed sub process cannot be replaced with itself\n      if (is$1(businessObject, 'bpmn:SubProcess') && !isExpanded(target)) {\n        filteredReplaceOptions = filter(filteredReplaceOptions, function(replaceOption) {\n          return replaceOption.label !== 'Sub Process (collapsed)';\n        });\n      }\n\n      return this._createEntries(target, filteredReplaceOptions);\n    }\n\n    return {};\n  };\n\n  /**\n   * @param {PopupMenuTarget} target\n   *\n   * @return {PopupMenuHeaderEntries}\n   */\n  ReplaceMenuProvider.prototype.getPopupMenuHeaderEntries = function(target) {\n\n    var headerEntries = {};\n\n    if (is$1(target, 'bpmn:Activity') && !isEventSubProcess(target)) {\n      headerEntries = {\n        ...headerEntries,\n        ...this._getLoopCharacteristicsHeaderEntries(target)\n      };\n    }\n\n    if (is$1(target, 'bpmn:DataObjectReference')) {\n      headerEntries = {\n        ...headerEntries,\n        ...this._getCollectionHeaderEntries(target)\n      };\n    }\n\n    if (is$1(target, 'bpmn:Participant')) {\n      headerEntries = {\n        ...headerEntries,\n        ...this._getParticipantMultiplicityHeaderEntries(target)\n      };\n    }\n\n    if (is$1(target, 'bpmn:SubProcess') &&\n        !is$1(target, 'bpmn:Transaction') &&\n        !isEventSubProcess(target)) {\n      headerEntries = {\n        ...headerEntries,\n        ...this._getAdHocHeaderEntries(target)\n      };\n    }\n\n    return headerEntries;\n  };\n\n\n  /**\n   * Create popup menu entries for the given target.\n   *\n   * @param  {PopupMenuTarget} target\n   * @param  {ReplaceOption[]} replaceOptions\n   *\n   * @return {PopupMenuEntries}\n   */\n  ReplaceMenuProvider.prototype._createEntries = function(target, replaceOptions) {\n    var entries = {};\n\n    var self = this;\n\n    forEach$1(replaceOptions, function(replaceOption) {\n      entries[ replaceOption.actionName ] = self._createEntry(replaceOption, target);\n    });\n\n    return entries;\n  };\n\n  /**\n   * Creates popup menu entries for the given sequence flow.\n   *\n   * @param  {PopupMenuTarget} target\n   * @param  {ReplaceOption[]} replaceOptions\n   *\n   * @return {PopupMenuEntries}\n   */\n  ReplaceMenuProvider.prototype._createSequenceFlowEntries = function(target, replaceOptions) {\n\n    var businessObject = getBusinessObject(target);\n\n    var entries = {};\n\n    var modeling = this._modeling,\n        moddle = this._moddle;\n\n    var self = this;\n\n    forEach$1(replaceOptions, function(replaceOption) {\n\n      switch (replaceOption.actionName) {\n      case 'replace-with-default-flow':\n        if (businessObject.sourceRef.default !== businessObject &&\n              (is$1(businessObject.sourceRef, 'bpmn:ExclusiveGateway') ||\n               is$1(businessObject.sourceRef, 'bpmn:InclusiveGateway') ||\n               is$1(businessObject.sourceRef, 'bpmn:ComplexGateway') ||\n               is$1(businessObject.sourceRef, 'bpmn:Activity'))) {\n\n          entries = {\n            ...entries,\n            [ replaceOption.actionName ]: self._createEntry(replaceOption, target, function() {\n              modeling.updateProperties(target.source, { default: businessObject });\n            })\n          };\n        }\n        break;\n      case 'replace-with-conditional-flow':\n        if (!businessObject.conditionExpression && is$1(businessObject.sourceRef, 'bpmn:Activity')) {\n\n          entries = {\n            ...entries,\n            [ replaceOption.actionName ]: self._createEntry(replaceOption, target, function() {\n              var conditionExpression = moddle.create('bpmn:FormalExpression', { body: '' });\n\n              modeling.updateProperties(target, { conditionExpression: conditionExpression });\n            })\n          };\n        }\n        break;\n      default:\n\n        // conditional flow -> sequence flow\n        if (is$1(businessObject.sourceRef, 'bpmn:Activity') && businessObject.conditionExpression) {\n          entries = {\n            ...entries,\n            [ replaceOption.actionName ]: self._createEntry(replaceOption, target, function() {\n              modeling.updateProperties(target, { conditionExpression: undefined });\n            })\n          };\n        }\n\n        // default flow -> sequence flow\n        if ((is$1(businessObject.sourceRef, 'bpmn:ExclusiveGateway') ||\n             is$1(businessObject.sourceRef, 'bpmn:InclusiveGateway') ||\n             is$1(businessObject.sourceRef, 'bpmn:ComplexGateway') ||\n             is$1(businessObject.sourceRef, 'bpmn:Activity')) &&\n             businessObject.sourceRef.default === businessObject) {\n          entries = {\n            ...entries,\n            [ replaceOption.actionName ]: self._createEntry(replaceOption, target, function() {\n              modeling.updateProperties(target.source, { default: undefined });\n            })\n          };\n        }\n      }\n    });\n\n    return entries;\n  };\n\n  /**\n   * Create a popup menu entry for the given replace option.\n   *\n   * @param  {ReplaceOption} replaceOption\n   * @param  {PopupMenuTarget} target\n   * @param  {PopupMenuEntryAction} [action]\n   *\n   * @return {PopupMenuEntry}\n   */\n  ReplaceMenuProvider.prototype._createEntry = function(replaceOption, target, action) {\n    var translate = this._translate;\n    var replaceElement = this._bpmnReplace.replaceElement;\n\n    var replaceAction = function() {\n      return replaceElement(target, replaceOption.target);\n    };\n\n    var label = replaceOption.label;\n    if (label && typeof label === 'function') {\n      label = label(target);\n    }\n\n    action = action || replaceAction;\n\n    return {\n      label: translate(label),\n      className: replaceOption.className,\n      action: action\n    };\n  };\n\n  /**\n   * Get popup menu header entries for the loop characteristics of the given BPMN element.\n   *\n   * @param  {PopupMenuTarget} target\n   *\n   * @return {PopupMenuHeaderEntries}\n   */\n  ReplaceMenuProvider.prototype._getLoopCharacteristicsHeaderEntries = function(target) {\n\n    var self = this;\n    var translate = this._translate;\n\n    function toggleLoopEntry(event, entry) {\n      var newLoopCharacteristics = getBusinessObject(target).loopCharacteristics;\n\n      if (entry.active) {\n        newLoopCharacteristics = undefined;\n      } else {\n        if (isUndefined$2(entry.options.isSequential) || !newLoopCharacteristics\n        || !is$1(newLoopCharacteristics, entry.options.loopCharacteristics)) {\n          newLoopCharacteristics = self._moddle.create(entry.options.loopCharacteristics);\n        }\n\n        newLoopCharacteristics.isSequential = entry.options.isSequential;\n      }\n      self._modeling.updateProperties(target, { loopCharacteristics: newLoopCharacteristics });\n    }\n\n    var businessObject = getBusinessObject(target),\n        loopCharacteristics = businessObject.loopCharacteristics;\n\n    var isSequential,\n        isLoop,\n        isParallel;\n\n    if (loopCharacteristics) {\n      isSequential = loopCharacteristics.isSequential;\n      isLoop = loopCharacteristics.isSequential === undefined;\n      isParallel = loopCharacteristics.isSequential !== undefined && !loopCharacteristics.isSequential;\n    }\n\n\n    return {\n      'toggle-parallel-mi' : {\n        className: 'bpmn-icon-parallel-mi-marker',\n        title: translate('Parallel Multi Instance'),\n        active: isParallel,\n        action: toggleLoopEntry,\n        options: {\n          loopCharacteristics: 'bpmn:MultiInstanceLoopCharacteristics',\n          isSequential: false\n        }\n      },\n      'toggle-sequential-mi': {\n        className: 'bpmn-icon-sequential-mi-marker',\n        title: translate('Sequential Multi Instance'),\n        active: isSequential,\n        action: toggleLoopEntry,\n        options: {\n          loopCharacteristics: 'bpmn:MultiInstanceLoopCharacteristics',\n          isSequential: true\n        }\n      },\n      'toggle-loop': {\n        className: 'bpmn-icon-loop-marker',\n        title: translate('Loop'),\n        active: isLoop,\n        action: toggleLoopEntry,\n        options: {\n          loopCharacteristics: 'bpmn:StandardLoopCharacteristics'\n        }\n      }\n    };\n  };\n\n  /**\n   * Get popup menu header entries for the collection property of the given BPMN element.\n   *\n   * @param  {PopupMenuTarget} target\n   *\n   * @return {PopupMenuHeaderEntries}\n   */\n  ReplaceMenuProvider.prototype._getCollectionHeaderEntries = function(target) {\n\n    var self = this;\n    var translate = this._translate;\n\n    var dataObject = target.businessObject.dataObjectRef;\n\n    if (!dataObject) {\n      return {};\n    }\n\n    function toggleIsCollection(event, entry) {\n      self._modeling.updateModdleProperties(\n        target,\n        dataObject,\n        { isCollection: !entry.active });\n    }\n\n    var isCollection = dataObject.isCollection;\n\n    return {\n      'toggle-is-collection': {\n        className: 'bpmn-icon-parallel-mi-marker',\n        title: translate('Collection'),\n        active: isCollection,\n        action: toggleIsCollection,\n      }\n    };\n  };\n\n  /**\n   * Get popup menu header entries for the participant multiplicity property of the given BPMN element.\n   *\n   * @param  {PopupMenuTarget} target\n   *\n   * @return {PopupMenuHeaderEntries}\n   */\n  ReplaceMenuProvider.prototype._getParticipantMultiplicityHeaderEntries = function(target) {\n\n    var self = this;\n    var bpmnFactory = this._bpmnFactory;\n    var translate = this._translate;\n\n    function toggleParticipantMultiplicity(event, entry) {\n      var isActive = entry.active;\n      var participantMultiplicity;\n\n      if (!isActive) {\n        participantMultiplicity = bpmnFactory.create('bpmn:ParticipantMultiplicity');\n      }\n\n      self._modeling.updateProperties(\n        target,\n        { participantMultiplicity: participantMultiplicity });\n    }\n\n    var participantMultiplicity = target.businessObject.participantMultiplicity;\n\n    return {\n      'toggle-participant-multiplicity': {\n        className: 'bpmn-icon-parallel-mi-marker',\n        title: translate('Participant Multiplicity'),\n        active: !!participantMultiplicity,\n        action: toggleParticipantMultiplicity,\n      }\n    };\n  };\n\n  /**\n   * Get popup menu header entries for the ad-hoc property of the given BPMN element.\n   *\n   * @param  {PopupMenuTarget} element\n   *\n   * @return {PopupMenuHeaderEntries}\n   */\n  ReplaceMenuProvider.prototype._getAdHocHeaderEntries = function(element) {\n    var translate = this._translate;\n    var businessObject = getBusinessObject(element);\n\n    var isAdHoc = is$1(businessObject, 'bpmn:AdHocSubProcess');\n\n    var replaceElement = this._bpmnReplace.replaceElement;\n\n    return {\n      'toggle-adhoc': {\n        className: 'bpmn-icon-ad-hoc-marker',\n        title: translate('Ad-hoc'),\n        active: isAdHoc,\n        action: function(event, entry) {\n          if (isAdHoc) {\n            return replaceElement(element, { type: 'bpmn:SubProcess' }, {\n              autoResize: false,\n              layoutConnection: false\n            });\n          } else {\n            return replaceElement(element, { type: 'bpmn:AdHocSubProcess' }, {\n              autoResize: false,\n              layoutConnection: false\n            });\n          }\n        }\n      }\n    };\n  };\n\n  var PopupMenuModule = {\n    __depends__: [\n      PopupMenuModule$1,\n      ReplaceModule,\n      AutoPlaceModule\n    ],\n    __init__: [\n      'replaceMenuProvider'\n    ],\n    replaceMenuProvider: [ 'type', ReplaceMenuProvider ]\n  };\n\n  var max$4 = Math.max,\n      min$2 = Math.min;\n\n  var DEFAULT_CHILD_BOX_PADDING = 20;\n\n  /**\n   * @typedef {import('../../core/Types').ElementLike} Element\n   * @typedef {import('../../core/Types').ShapeLike} Shape\n   *\n   * @typedef {import('../../util/Types').Direction} Direction\n   * @typedef {import('../../util/Types').Point} Point\n   * @typedef {import('../../util/Types').Rect} Rect\n   * @typedef {import('../../util/Types').RectTRBL} RectTRBL\n   */\n\n  /**\n   * Substract a TRBL from another\n   *\n   * @param {RectTRBL} trblA\n   * @param {RectTRBL} trblB\n   *\n   * @return {RectTRBL}\n   */\n  function substractTRBL(trblA, trblB) {\n    return {\n      top: trblA.top - trblB.top,\n      right: trblA.right - trblB.right,\n      bottom: trblA.bottom - trblB.bottom,\n      left: trblA.left - trblB.left\n    };\n  }\n\n  /**\n   * Resize the given bounds by the specified delta from a given anchor point.\n   *\n   * @param {Rect} bounds the bounding box that should be resized\n   * @param {Direction} direction in which the element is resized (nw, ne, se, sw)\n   * @param {Point} delta of the resize operation\n   *\n   * @return {Rect} resized bounding box\n   */\n  function resizeBounds$1(bounds, direction, delta) {\n    var dx = delta.x,\n        dy = delta.y;\n\n    var newBounds = {\n      x: bounds.x,\n      y: bounds.y,\n      width: bounds.width,\n      height: bounds.height\n    };\n\n    if (direction.indexOf('n') !== -1) {\n      newBounds.y = bounds.y + dy;\n      newBounds.height = bounds.height - dy;\n    } else if (direction.indexOf('s') !== -1) {\n      newBounds.height = bounds.height + dy;\n    }\n\n    if (direction.indexOf('e') !== -1) {\n      newBounds.width = bounds.width + dx;\n    } else if (direction.indexOf('w') !== -1) {\n      newBounds.x = bounds.x + dx;\n      newBounds.width = bounds.width - dx;\n    }\n\n    return newBounds;\n  }\n\n\n  /**\n   * Resize the given bounds by applying the passed\n   * { top, right, bottom, left } delta.\n   *\n   * @param {Rect} bounds\n   * @param {RectTRBL} resize\n   *\n   * @return {Rect}\n   */\n  function resizeTRBL(bounds, resize) {\n    return {\n      x: bounds.x + (resize.left || 0),\n      y: bounds.y + (resize.top || 0),\n      width: bounds.width - (resize.left || 0) + (resize.right || 0),\n      height: bounds.height - (resize.top || 0) + (resize.bottom || 0)\n    };\n  }\n\n\n  function applyConstraints(attr, trbl, resizeConstraints) {\n\n    var value = trbl[attr],\n        minValue = resizeConstraints.min && resizeConstraints.min[attr],\n        maxValue = resizeConstraints.max && resizeConstraints.max[attr];\n\n    if (isNumber(minValue)) {\n      value = (/top|left/.test(attr) ? min$2 : max$4)(value, minValue);\n    }\n\n    if (isNumber(maxValue)) {\n      value = (/top|left/.test(attr) ? max$4 : min$2)(value, maxValue);\n    }\n\n    return value;\n  }\n\n  function ensureConstraints$1(currentBounds, resizeConstraints) {\n\n    if (!resizeConstraints) {\n      return currentBounds;\n    }\n\n    var currentTrbl = asTRBL(currentBounds);\n\n    return asBounds({\n      top: applyConstraints('top', currentTrbl, resizeConstraints),\n      right: applyConstraints('right', currentTrbl, resizeConstraints),\n      bottom: applyConstraints('bottom', currentTrbl, resizeConstraints),\n      left: applyConstraints('left', currentTrbl, resizeConstraints)\n    });\n  }\n\n\n  function getMinResizeBounds(direction, currentBounds, minDimensions, childrenBounds) {\n\n    var currentBox = asTRBL(currentBounds);\n\n    var minBox = {\n      top: /n/.test(direction) ? currentBox.bottom - minDimensions.height : currentBox.top,\n      left: /w/.test(direction) ? currentBox.right - minDimensions.width : currentBox.left,\n      bottom: /s/.test(direction) ? currentBox.top + minDimensions.height : currentBox.bottom,\n      right: /e/.test(direction) ? currentBox.left + minDimensions.width : currentBox.right\n    };\n\n    var childrenBox = childrenBounds ? asTRBL(childrenBounds) : minBox;\n\n    var combinedBox = {\n      top: min$2(minBox.top, childrenBox.top),\n      left: min$2(minBox.left, childrenBox.left),\n      bottom: max$4(minBox.bottom, childrenBox.bottom),\n      right: max$4(minBox.right, childrenBox.right)\n    };\n\n    return asBounds(combinedBox);\n  }\n\n  function asPadding(mayBePadding, defaultValue) {\n    if (typeof mayBePadding !== 'undefined') {\n      return mayBePadding;\n    } else {\n      return DEFAULT_CHILD_BOX_PADDING;\n    }\n  }\n\n  function addPadding$1(bbox, padding) {\n    var left, right, top, bottom;\n\n    if (typeof padding === 'object') {\n      left = asPadding(padding.left);\n      right = asPadding(padding.right);\n      top = asPadding(padding.top);\n      bottom = asPadding(padding.bottom);\n    } else {\n      left = right = top = bottom = asPadding(padding);\n    }\n\n    return {\n      x: bbox.x - left,\n      y: bbox.y - top,\n      width: bbox.width + left + right,\n      height: bbox.height + top + bottom\n    };\n  }\n\n\n  /**\n   * Is the given element part of the resize\n   * targets min boundary box?\n   *\n   * This is the default implementation which excludes\n   * connections and labels.\n   *\n   * @param {Element} element\n   */\n  function isBBoxChild(element) {\n\n    // exclude connections\n    if (element.waypoints) {\n      return false;\n    }\n\n    // exclude labels\n    if (element.type === 'label') {\n      return false;\n    }\n\n    return true;\n  }\n\n  /**\n   * Return children bounding computed from a shapes children\n   * or a list of prefiltered children.\n   *\n   * @param {Shape|Shape[]} shapeOrChildren\n   * @param {RectTRBL|number} padding\n   *\n   * @return {Rect}\n   */\n  function computeChildrenBBox(shapeOrChildren, padding) {\n\n    var elements;\n\n    // compute based on shape\n    if (shapeOrChildren.length === undefined) {\n\n      // grab all the children that are part of the\n      // parents children box\n      elements = filter(shapeOrChildren.children, isBBoxChild);\n\n    } else {\n      elements = shapeOrChildren;\n    }\n\n    if (elements.length) {\n      return addPadding$1(getBBox(elements), padding);\n    }\n  }\n\n  /**\n   * @typedef {import('../../../model/Types').Shape} Shape\n   *\n   * @typedef {import('diagram-js/lib/util/Types').Rect} Rect\n   */\n\n  var abs$4 = Math.abs;\n\n\n  function getTRBLResize(oldBounds, newBounds) {\n    return substractTRBL(asTRBL(newBounds), asTRBL(oldBounds));\n  }\n\n\n  var LANE_PARENTS = [\n    'bpmn:Participant',\n    'bpmn:Process',\n    'bpmn:SubProcess'\n  ];\n\n  var LANE_INDENTATION = 30;\n\n\n  /**\n   * Return all lanes that are children of the given shape.\n   *\n   * @param  {Shape} shape\n   * @param  {Shape[]} [collectedShapes]\n   *\n   * @return {Shape[]}\n   */\n  function collectLanes(shape, collectedShapes) {\n\n    collectedShapes = collectedShapes || [];\n\n    shape.children.filter(function(s) {\n      if (is$1(s, 'bpmn:Lane')) {\n        collectLanes(s, collectedShapes);\n\n        collectedShapes.push(s);\n      }\n    });\n\n    return collectedShapes;\n  }\n\n\n  /**\n   * Return all lanes that are direct children of the given shape.\n   *\n   * @param {Shape} shape\n   *\n   * @return {Shape[]}\n   */\n  function getChildLanes(shape) {\n    return shape.children.filter(function(c) {\n      return is$1(c, 'bpmn:Lane');\n    });\n  }\n\n\n  /**\n   * Return the parent shape of the given lane.\n   *\n   * @param {Shape} shape\n   *\n   * @return {Shape}\n   */\n  function getLanesRoot(shape) {\n    return getParent(shape, LANE_PARENTS) || shape;\n  }\n\n\n  /**\n   * Compute the required resize operations for lanes\n   * adjacent to the given shape, assuming it will be\n   * resized to the given new bounds.\n   *\n   * @param {Shape} shape\n   * @param {Rect} newBounds\n   *\n   * @return { {\n   *   shape: Shape;\n   *   newBounds: Rect;\n   * }[] }\n   */\n  function computeLanesResize(shape, newBounds) {\n\n    var rootElement = getLanesRoot(shape);\n\n    var initialShapes = is$1(rootElement, 'bpmn:Process') ? [] : [ rootElement ];\n\n    var allLanes = collectLanes(rootElement, initialShapes),\n        shapeTrbl = asTRBL(shape),\n        shapeNewTrbl = asTRBL(newBounds),\n        trblResize = getTRBLResize(shape, newBounds),\n        resizeNeeded = [];\n\n    allLanes.forEach(function(other) {\n\n      if (other === shape) {\n        return;\n      }\n\n      var topResize = 0,\n          rightResize = trblResize.right,\n          bottomResize = 0,\n          leftResize = trblResize.left;\n\n      var otherTrbl = asTRBL(other);\n\n      if (trblResize.top) {\n        if (abs$4(otherTrbl.bottom - shapeTrbl.top) < 10) {\n          bottomResize = shapeNewTrbl.top - otherTrbl.bottom;\n        }\n\n        if (abs$4(otherTrbl.top - shapeTrbl.top) < 5) {\n          topResize = shapeNewTrbl.top - otherTrbl.top;\n        }\n      }\n\n      if (trblResize.bottom) {\n        if (abs$4(otherTrbl.top - shapeTrbl.bottom) < 10) {\n          topResize = shapeNewTrbl.bottom - otherTrbl.top;\n        }\n\n        if (abs$4(otherTrbl.bottom - shapeTrbl.bottom) < 5) {\n          bottomResize = shapeNewTrbl.bottom - otherTrbl.bottom;\n        }\n      }\n\n      if (topResize || rightResize || bottomResize || leftResize) {\n\n        resizeNeeded.push({\n          shape: other,\n          newBounds: resizeTRBL(other, {\n            top: topResize,\n            right: rightResize,\n            bottom: bottomResize,\n            left: leftResize\n          })\n        });\n      }\n\n    });\n\n    return resizeNeeded;\n  }\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('diagram-js/lib/features/context-pad/ContextPad').default} ContextPad\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   * @typedef {import('../modeling/ElementFactory').default} ElementFactory\n   * @typedef {import('diagram-js/lib/features/connect/Connect').default} Connect\n   * @typedef {import('diagram-js/lib/features/create/Create').default} Create\n   * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenu').default} PopupMenu\n   * @typedef {import('diagram-js/lib/features/canvas/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/features/rules/Rules').default} Rules\n   * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').ModdleElement} ModdleElement\n   *\n   * @typedef {import('diagram-js/lib/features/context-pad/ContextPadProvider').default<Element>} BaseContextPadProvider\n   * @typedef {import('diagram-js/lib/features/context-pad/ContextPadProvider').ContextPadEntries} ContextPadEntries\n   * @typedef {import('diagram-js/lib/features/context-pad/ContextPadProvider').ContextPadEntry} ContextPadEntry\n   *\n   * @typedef { { autoPlace?: boolean; } } ContextPadConfig\n   */\n\n  /**\n   * BPMN-specific context pad provider.\n   *\n   * @implements {BaseContextPadProvider}\n   *\n   * @param {ContextPadConfig} config\n   * @param {Injector} injector\n   * @param {EventBus} eventBus\n   * @param {ContextPad} contextPad\n   * @param {Modeling} modeling\n   * @param {ElementFactory} elementFactory\n   * @param {Connect} connect\n   * @param {Create} create\n   * @param {PopupMenu} popupMenu\n   * @param {Canvas} canvas\n   * @param {Rules} rules\n   * @param {Translate} translate\n   */\n  function ContextPadProvider(\n      config, injector, eventBus,\n      contextPad, modeling, elementFactory,\n      connect, create, popupMenu,\n      canvas, rules, translate) {\n\n    config = config || {};\n\n    contextPad.registerProvider(this);\n\n    this._contextPad = contextPad;\n\n    this._modeling = modeling;\n\n    this._elementFactory = elementFactory;\n    this._connect = connect;\n    this._create = create;\n    this._popupMenu = popupMenu;\n    this._canvas = canvas;\n    this._rules = rules;\n    this._translate = translate;\n\n    if (config.autoPlace !== false) {\n      this._autoPlace = injector.get('autoPlace', false);\n    }\n\n    eventBus.on('create.end', 250, function(event) {\n      var context = event.context,\n          shape = context.shape;\n\n      if (!hasPrimaryModifier(event) || !contextPad.isOpen(shape)) {\n        return;\n      }\n\n      var entries = contextPad.getEntries(shape);\n\n      if (entries.replace) {\n        entries.replace.action.click(event, shape);\n      }\n    });\n  }\n\n  ContextPadProvider.$inject = [\n    'config.contextPad',\n    'injector',\n    'eventBus',\n    'contextPad',\n    'modeling',\n    'elementFactory',\n    'connect',\n    'create',\n    'popupMenu',\n    'canvas',\n    'rules',\n    'translate'\n  ];\n\n  /**\n   * @param {Element[]} elements\n   *\n   * @return {ContextPadEntries}\n   */\n  ContextPadProvider.prototype.getMultiElementContextPadEntries = function(elements) {\n    var modeling = this._modeling;\n\n    var actions = {};\n\n    if (this._isDeleteAllowed(elements)) {\n      assign$1(actions, {\n        'delete': {\n          group: 'edit',\n          className: 'bpmn-icon-trash',\n          title: this._translate('Remove'),\n          action: {\n            click: function(event, elements) {\n              modeling.removeElements(elements.slice());\n            }\n          }\n        }\n      });\n    }\n\n    return actions;\n  };\n\n  /**\n   * @param {Element[]} elements\n   *\n   * @return {boolean}\n   */\n  ContextPadProvider.prototype._isDeleteAllowed = function(elements) {\n\n    var baseAllowed = this._rules.allowed('elements.delete', {\n      elements: elements\n    });\n\n    if (isArray$3(baseAllowed)) {\n      return every(baseAllowed, function(element) {\n        return includes$7(baseAllowed, element);\n      });\n    }\n\n    return baseAllowed;\n  };\n\n  /**\n   * @param {Element} element\n   *\n   * @return {ContextPadEntries}\n   */\n  ContextPadProvider.prototype.getContextPadEntries = function(element) {\n    var contextPad = this._contextPad,\n        modeling = this._modeling,\n\n        elementFactory = this._elementFactory,\n        connect = this._connect,\n        create = this._create,\n        popupMenu = this._popupMenu,\n        rules = this._rules,\n        autoPlace = this._autoPlace,\n        translate = this._translate;\n\n    var actions = {};\n\n    if (element.type === 'label') {\n      return actions;\n    }\n\n    var businessObject = element.businessObject;\n\n    function startConnect(event, element) {\n      connect.start(event, element);\n    }\n\n    function removeElement(e, element) {\n      modeling.removeElements([ element ]);\n    }\n\n    function getReplaceMenuPosition(element) {\n\n      var Y_OFFSET = 5;\n\n      var pad = contextPad.getPad(element).html;\n\n      var padRect = pad.getBoundingClientRect();\n\n      var pos = {\n        x: padRect.left,\n        y: padRect.bottom + Y_OFFSET\n      };\n\n      return pos;\n    }\n\n    /**\n     * Create an append action.\n     *\n     * @param {string} type\n     * @param {string} className\n     * @param {string} [title]\n     * @param {Object} [options]\n     *\n     * @return {ContextPadEntry}\n     */\n    function appendAction(type, className, title, options) {\n\n      if (typeof title !== 'string') {\n        options = title;\n        title = translate('Append {type}', { type: type.replace(/^bpmn:/, '') });\n      }\n\n      function appendStart(event, element) {\n\n        var shape = elementFactory.createShape(assign$1({ type: type }, options));\n        create.start(event, shape, {\n          source: element\n        });\n      }\n\n\n      var append = autoPlace ? function(event, element) {\n        var shape = elementFactory.createShape(assign$1({ type: type }, options));\n\n        autoPlace.append(element, shape);\n      } : appendStart;\n\n\n      return {\n        group: 'model',\n        className: className,\n        title: title,\n        action: {\n          dragstart: appendStart,\n          click: append\n        }\n      };\n    }\n\n    function splitLaneHandler(count) {\n\n      return function(_, element) {\n\n        // actual split\n        modeling.splitLane(element, count);\n\n        // refresh context pad after split to\n        // get rid of split icons\n        contextPad.open(element, true);\n      };\n    }\n\n\n    if (isAny(businessObject, [ 'bpmn:Lane', 'bpmn:Participant' ]) && isExpanded(element)) {\n\n      var childLanes = getChildLanes(element);\n\n      assign$1(actions, {\n        'lane-insert-above': {\n          group: 'lane-insert-above',\n          className: 'bpmn-icon-lane-insert-above',\n          title: translate('Add Lane above'),\n          action: {\n            click: function(event, element) {\n              modeling.addLane(element, 'top');\n            }\n          }\n        }\n      });\n\n      if (childLanes.length < 2) {\n\n        if (element.height >= 120) {\n          assign$1(actions, {\n            'lane-divide-two': {\n              group: 'lane-divide',\n              className: 'bpmn-icon-lane-divide-two',\n              title: translate('Divide into two Lanes'),\n              action: {\n                click: splitLaneHandler(2)\n              }\n            }\n          });\n        }\n\n        if (element.height >= 180) {\n          assign$1(actions, {\n            'lane-divide-three': {\n              group: 'lane-divide',\n              className: 'bpmn-icon-lane-divide-three',\n              title: translate('Divide into three Lanes'),\n              action: {\n                click: splitLaneHandler(3)\n              }\n            }\n          });\n        }\n      }\n\n      assign$1(actions, {\n        'lane-insert-below': {\n          group: 'lane-insert-below',\n          className: 'bpmn-icon-lane-insert-below',\n          title: translate('Add Lane below'),\n          action: {\n            click: function(event, element) {\n              modeling.addLane(element, 'bottom');\n            }\n          }\n        }\n      });\n\n    }\n\n    if (is$1(businessObject, 'bpmn:FlowNode')) {\n\n      if (is$1(businessObject, 'bpmn:EventBasedGateway')) {\n\n        assign$1(actions, {\n          'append.receive-task': appendAction(\n            'bpmn:ReceiveTask',\n            'bpmn-icon-receive-task',\n            translate('Append ReceiveTask')\n          ),\n          'append.message-intermediate-event': appendAction(\n            'bpmn:IntermediateCatchEvent',\n            'bpmn-icon-intermediate-event-catch-message',\n            translate('Append MessageIntermediateCatchEvent'),\n            { eventDefinitionType: 'bpmn:MessageEventDefinition' }\n          ),\n          'append.timer-intermediate-event': appendAction(\n            'bpmn:IntermediateCatchEvent',\n            'bpmn-icon-intermediate-event-catch-timer',\n            translate('Append TimerIntermediateCatchEvent'),\n            { eventDefinitionType: 'bpmn:TimerEventDefinition' }\n          ),\n          'append.condition-intermediate-event': appendAction(\n            'bpmn:IntermediateCatchEvent',\n            'bpmn-icon-intermediate-event-catch-condition',\n            translate('Append ConditionIntermediateCatchEvent'),\n            { eventDefinitionType: 'bpmn:ConditionalEventDefinition' }\n          ),\n          'append.signal-intermediate-event': appendAction(\n            'bpmn:IntermediateCatchEvent',\n            'bpmn-icon-intermediate-event-catch-signal',\n            translate('Append SignalIntermediateCatchEvent'),\n            { eventDefinitionType: 'bpmn:SignalEventDefinition' }\n          )\n        });\n      } else\n\n      if (isEventType(businessObject, 'bpmn:BoundaryEvent', 'bpmn:CompensateEventDefinition')) {\n\n        assign$1(actions, {\n          'append.compensation-activity':\n              appendAction(\n                'bpmn:Task',\n                'bpmn-icon-task',\n                translate('Append compensation activity'),\n                {\n                  isForCompensation: true\n                }\n              )\n        });\n      } else\n\n      if (!is$1(businessObject, 'bpmn:EndEvent') &&\n          !businessObject.isForCompensation &&\n          !isEventType(businessObject, 'bpmn:IntermediateThrowEvent', 'bpmn:LinkEventDefinition') &&\n          !isEventSubProcess(businessObject)) {\n\n        assign$1(actions, {\n          'append.end-event': appendAction(\n            'bpmn:EndEvent',\n            'bpmn-icon-end-event-none',\n            translate('Append EndEvent')\n          ),\n          'append.gateway': appendAction(\n            'bpmn:ExclusiveGateway',\n            'bpmn-icon-gateway-none',\n            translate('Append Gateway')\n          ),\n          'append.append-task': appendAction(\n            'bpmn:Task',\n            'bpmn-icon-task',\n            translate('Append Task')\n          ),\n          'append.intermediate-event': appendAction(\n            'bpmn:IntermediateThrowEvent',\n            'bpmn-icon-intermediate-event-none',\n            translate('Append Intermediate/Boundary Event')\n          )\n        });\n      }\n    }\n\n    if (!popupMenu.isEmpty(element, 'bpmn-replace')) {\n\n      // Replace menu entry\n      assign$1(actions, {\n        'replace': {\n          group: 'edit',\n          className: 'bpmn-icon-screw-wrench',\n          title: translate('Change type'),\n          action: {\n            click: function(event, element) {\n\n              var position = assign$1(getReplaceMenuPosition(element), {\n                cursor: { x: event.x, y: event.y }\n              });\n\n              popupMenu.open(element, 'bpmn-replace', position, {\n                title: translate('Change element'),\n                width: 300,\n                search: true\n              });\n            }\n          }\n        }\n      });\n    }\n\n    if (is$1(businessObject, 'bpmn:SequenceFlow')) {\n      assign$1(actions, {\n        'append.text-annotation': appendAction(\n          'bpmn:TextAnnotation',\n          'bpmn-icon-text-annotation'\n        )\n      });\n    }\n\n    if (\n      isAny(businessObject, [\n        'bpmn:FlowNode',\n        'bpmn:InteractionNode',\n        'bpmn:DataObjectReference',\n        'bpmn:DataStoreReference',\n      ])\n    ) {\n      assign$1(actions, {\n        'append.text-annotation': appendAction(\n          'bpmn:TextAnnotation',\n          'bpmn-icon-text-annotation'\n        ),\n\n        'connect': {\n          group: 'connect',\n          className: 'bpmn-icon-connection-multi',\n          title: translate(\n            'Connect using ' +\n              (businessObject.isForCompensation\n                ? ''\n                : 'Sequence/MessageFlow or ') +\n              'Association'\n          ),\n          action: {\n            click: startConnect,\n            dragstart: startConnect,\n          },\n        },\n      });\n    }\n\n    if (is$1(businessObject, 'bpmn:TextAnnotation')) {\n      assign$1(actions, {\n        'connect': {\n          group: 'connect',\n          className: 'bpmn-icon-connection-multi',\n          title: translate('Connect using Association'),\n          action: {\n            click: startConnect,\n            dragstart: startConnect,\n          },\n        },\n      });\n    }\n\n    if (isAny(businessObject, [ 'bpmn:DataObjectReference', 'bpmn:DataStoreReference' ])) {\n      assign$1(actions, {\n        'connect': {\n          group: 'connect',\n          className: 'bpmn-icon-connection-multi',\n          title: translate('Connect using DataInputAssociation'),\n          action: {\n            click: startConnect,\n            dragstart: startConnect\n          }\n        }\n      });\n    }\n\n    if (is$1(businessObject, 'bpmn:Group')) {\n      assign$1(actions, {\n        'append.text-annotation': appendAction('bpmn:TextAnnotation', 'bpmn-icon-text-annotation')\n      });\n    }\n\n    // delete element entry, only show if allowed by rules\n    var deleteAllowed = rules.allowed('elements.delete', { elements: [ element ] });\n\n    if (isArray$3(deleteAllowed)) {\n\n      // was the element returned as a deletion candidate?\n      deleteAllowed = deleteAllowed[0] === element;\n    }\n\n    if (deleteAllowed) {\n      assign$1(actions, {\n        'delete': {\n          group: 'edit',\n          className: 'bpmn-icon-trash',\n          title: translate('Remove'),\n          action: {\n            click: removeElement\n          }\n        }\n      });\n    }\n\n    return actions;\n  };\n\n\n  // helpers /////////\n\n  /**\n   * @param {ModdleElement} businessObject\n   * @param {string} type\n   * @param {string} eventDefinitionType\n   *\n   * @return {boolean}\n   */\n  function isEventType(businessObject, type, eventDefinitionType) {\n\n    var isType = businessObject.$instanceOf(type);\n    var isDefinition = false;\n\n    var definitions = businessObject.eventDefinitions || [];\n    forEach$1(definitions, function(def) {\n      if (def.$type === eventDefinitionType) {\n        isDefinition = true;\n      }\n    });\n\n    return isType && isDefinition;\n  }\n\n  function includes$7(array, item) {\n    return array.indexOf(item) !== -1;\n  }\n\n  var ContextPadModule = {\n    __depends__: [\n      DirectEditingModule,\n      ContextPadModule$1,\n      SelectionModule,\n      ConnectModule,\n      CreateModule,\n      PopupMenuModule\n    ],\n    __init__: [ 'contextPadProvider' ],\n    contextPadProvider: [ 'type', ContextPadProvider ]\n  };\n\n  /**\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef {import('../../util/Types').Axis} Axis\n   * @typedef {import('../../util/Types').Dimension} Dimension\n   * @typedef {import('../../util/Types').Rect} Rect\n   *\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   * @typedef {import('../rules/Rules').default} Rules\n   *\n   * @typedef { {\n   *   min: number;\n   *   max: number;\n   * } } Range\n   *\n   * @typedef { {\n   *   elements: Element[];\n   *   range: Range;\n   * } } Group\n   */\n\n  var AXIS_DIMENSIONS = {\n    horizontal: [ 'x', 'width' ],\n    vertical: [ 'y', 'height' ]\n  };\n\n  var THRESHOLD = 5;\n\n\n  /**\n   * Groups and filters elements and then trigger even distribution.\n   *\n   * @param {Modeling} modeling\n   * @param {Rules} rules\n   */\n  function DistributeElements$1(modeling, rules) {\n    this._modeling = modeling;\n\n    this._filters = [];\n\n    this.registerFilter(function(elements) {\n      var allowed = rules.allowed('elements.distribute', { elements: elements });\n\n      if (isArray$3(allowed)) {\n        return allowed;\n      }\n\n      return allowed ? elements : [];\n    });\n  }\n\n  DistributeElements$1.$inject = [ 'modeling', 'rules' ];\n\n\n  /**\n   * Registers filter functions that allow external parties to filter\n   * out certain elements.\n   *\n   * @param {(distributableElements: Element[], axis: Axis, dimension: Dimension) => Element[]} filterFn\n   */\n  DistributeElements$1.prototype.registerFilter = function(filterFn) {\n    if (typeof filterFn !== 'function') {\n      throw new Error('the filter has to be a function');\n    }\n\n    this._filters.push(filterFn);\n  };\n\n  /**\n   * Distributes the elements with a given orientation\n   *\n   * @param {Element[]} elements\n   * @param {string} orientation\n   */\n  DistributeElements$1.prototype.trigger = function(elements, orientation) {\n    var modeling = this._modeling;\n\n    var groups,\n        distributableElements;\n\n    if (elements.length < 3) {\n      return;\n    }\n\n    this._setOrientation(orientation);\n\n    distributableElements = this._filterElements(elements);\n\n    groups = this._createGroups(distributableElements);\n\n    // nothing to distribute\n    if (groups.length <= 2) {\n      return;\n    }\n\n    modeling.distributeElements(groups, this._axis, this._dimension);\n\n    return groups;\n  };\n\n  /**\n   * Filters the elements with provided filters by external parties\n   *\n   * @param {Element[]} elements\n   *\n   * @return {Element[]}\n   */\n  DistributeElements$1.prototype._filterElements = function(elements) {\n    var filters = this._filters,\n        axis = this._axis,\n        dimension = this._dimension,\n        distributableElements = [].concat(elements);\n\n    if (!filters.length) {\n      return elements;\n    }\n\n    forEach$1(filters, function(filterFn) {\n      distributableElements = filterFn(distributableElements, axis, dimension);\n    });\n\n    return distributableElements;\n  };\n\n\n  /**\n   * Create range (min, max) groups. Also tries to group elements\n   * together that share the same range.\n   *\n   * @example\n   *\n   * ```javascript\n   *   const groups = [\n   *     {\n   *       range: { min: 100, max: 200 },\n   *       elements: [ { id: 'shape1', ... } ]\n   *     }\n   *   ]\n   * ```\n   *\n   * @param {Element[]} elements\n   *\n   * @return {Group[]}\n   */\n  DistributeElements$1.prototype._createGroups = function(elements) {\n    var rangeGroups = [],\n        self = this,\n        axis = this._axis,\n        dimension = this._dimension;\n\n    if (!axis) {\n      throw new Error('must have a defined \"axis\" and \"dimension\"');\n    }\n\n    // sort by 'left->right' or 'top->bottom'\n    var sortedElements = sortBy(elements, axis);\n\n    forEach$1(sortedElements, function(element, idx) {\n      var elementRange = self._findRange(element, axis, dimension),\n          range;\n\n      var previous = rangeGroups[rangeGroups.length - 1];\n\n      if (previous && self._hasIntersection(previous.range, elementRange)) {\n        rangeGroups[rangeGroups.length - 1].elements.push(element);\n      } else {\n        range = { range: elementRange, elements: [ element ] };\n\n        rangeGroups.push(range);\n      }\n    });\n\n    return rangeGroups;\n  };\n\n\n  /**\n   * Maps a direction to the according axis and dimension.\n   *\n   * @param {'horizontal' | 'vertical'} direction 'horizontal' or 'vertical'\n   */\n  DistributeElements$1.prototype._setOrientation = function(direction) {\n    var orientation = AXIS_DIMENSIONS[direction];\n\n    this._axis = orientation[0];\n    this._dimension = orientation[1];\n  };\n\n\n  /**\n   * Checks if the two ranges intercept each other.\n   *\n   * @param {Range} rangeA\n   * @param {Range} rangeB\n   *\n   * @return {boolean}\n   */\n  DistributeElements$1.prototype._hasIntersection = function(rangeA, rangeB) {\n    return Math.max(rangeA.min, rangeA.max) >= Math.min(rangeB.min, rangeB.max) &&\n           Math.min(rangeA.min, rangeA.max) <= Math.max(rangeB.min, rangeB.max);\n  };\n\n\n  /**\n   * Returns the min and max values for an element\n   *\n   * @param {Element} element\n   *\n   * @return {Range}\n   */\n  DistributeElements$1.prototype._findRange = function(element) {\n    var axis = element[this._axis],\n        dimension = element[this._dimension];\n\n    return {\n      min: axis + THRESHOLD,\n      max: axis + dimension - THRESHOLD\n    };\n  };\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var DistributeElementsModule$1 = {\n    __init__: [ 'distributeElements' ],\n    distributeElements: [ 'type', DistributeElements$1 ]\n  };\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   */\n\n  /**\n   * Registers element exclude filters for elements that currently do not support\n   * distribution.\n   *\n   * @param {EventBus} eventBus\n   */\n  function BpmnDistributeElements(eventBus) {\n    RuleProvider.call(this, eventBus);\n  }\n\n  BpmnDistributeElements.$inject = [ 'eventBus' ];\n\n  e$3(BpmnDistributeElements, RuleProvider);\n\n  BpmnDistributeElements.prototype.init = function() {\n    this.addRule('elements.distribute', function(context) {\n      var elements = context.elements;\n\n      elements = filter(elements, function(element) {\n        var cannotDistribute = isAny(element, [\n          'bpmn:Association',\n          'bpmn:BoundaryEvent',\n          'bpmn:DataInputAssociation',\n          'bpmn:DataOutputAssociation',\n          'bpmn:Lane',\n          'bpmn:MessageFlow',\n          'bpmn:SequenceFlow',\n          'bpmn:TextAnnotation'\n        ]);\n\n        return !(element.labelTarget || cannotDistribute);\n      });\n\n      // filter out elements which are children of any of the selected elements\n      elements = getParents$1(elements);\n\n      if (elements.length < 3) {\n        return false;\n      }\n\n      return elements;\n    });\n  };\n\n  /**\n   * To change the icons, modify the SVGs in `./resources`, execute `npx svgo -f resources --datauri enc -o dist`,\n   * and then replace respective icons with the optimized data URIs in `./dist`.\n   */\n  var icons = {\n    horizontal: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1800 1800\">\n                <polyline points=\"450 400 450 150 1350 150 1350 400\" style=\"fill:none;stroke:currentColor;stroke-width:100;stroke-linejoin:round;\"/>\n                <rect x=\"150\" y=\"450\" width=\"600\" height=\"1200\" rx=\"1\" style=\"fill:none;stroke:currentColor;stroke-width:100;\"></rect>\n                <rect x=\"1050\" y=\"450\" width=\"600\" height=\"800\" rx=\"1\" style=\"fill:currentColor;stroke:currentColor;stroke-width:100;opacity:.5;\"></rect>\n              </svg>`,\n    vertical: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1800 1800\">\n              <polyline points=\"400 1350 150 1350 150 450 400 450\" style=\"fill:none;stroke:currentColor;stroke-width:100;stroke-linejoin:round;\"/>\n              <rect x=\"450\" y=\"150\" width=\"1200\" height=\"600\" rx=\"1\" style=\"fill:none;stroke:currentColor;stroke-width:100;\"></rect>\n              <rect x=\"450\" y=\"1050\" width=\"800\" height=\"600\" rx=\"1\" style=\"fill:currentColor;stroke:currentColor;stroke-width:100;opacity:.5;\"></rect>\n            </svg>`\n  };\n\n  var ICONS = icons;\n\n  /**\n   * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenu').default} PopupMenu\n   * @typedef {import('./BpmnDistributeElements').default} DistributeElements\n   * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n   * @typedef {import('diagram-js/lib/features/rules/Rules').default} Rules\n   *\n   * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenuProvider').PopupMenuEntries} PopupMenuEntries\n   * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenuProvider').default} PopupMenuProvider\n   * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenu').PopupMenuTarget} PopupMenuTarget\n   */\n\n  var LOW_PRIORITY$g = 900;\n\n  /**\n   * A provider for the distribute elements popup menu.\n   *\n   * @implements {PopupMenuProvider}\n   *\n   * @param {PopupMenu} popupMenu\n   * @param {DistributeElements} distributeElements\n   * @param {Translate} translate\n   * @param {Rules} rules\n   */\n  function DistributeElementsMenuProvider(\n      popupMenu, distributeElements, translate, rules) {\n    this._distributeElements = distributeElements;\n    this._translate = translate;\n    this._popupMenu = popupMenu;\n    this._rules = rules;\n\n    popupMenu.registerProvider('align-elements', LOW_PRIORITY$g, this);\n  }\n\n  DistributeElementsMenuProvider.$inject = [\n    'popupMenu',\n    'distributeElements',\n    'translate',\n    'rules'\n  ];\n\n  /**\n   * @param {PopupMenuTarget} target\n   *\n   * @return {PopupMenuEntries}\n   */\n  DistributeElementsMenuProvider.prototype.getPopupMenuEntries = function(target) {\n    var entries = {};\n\n    if (this._isAllowed(target)) {\n      assign$1(entries, this._getEntries(target));\n    }\n\n    return entries;\n  };\n\n  DistributeElementsMenuProvider.prototype._isAllowed = function(elements) {\n    return this._rules.allowed('elements.distribute', { elements: elements });\n  };\n\n  DistributeElementsMenuProvider.prototype._getEntries = function(elements) {\n    var distributeElements = this._distributeElements,\n        translate = this._translate,\n        popupMenu = this._popupMenu;\n\n    var entries = {\n      'distribute-elements-horizontal': {\n        group: 'distribute',\n        title: translate('Distribute elements horizontally'),\n        className: 'bjs-align-elements-menu-entry',\n        imageHtml: ICONS['horizontal'],\n        action: function(event, entry) {\n          distributeElements.trigger(elements, 'horizontal');\n          popupMenu.close();\n        }\n      },\n      'distribute-elements-vertical': {\n        group: 'distribute',\n        title: translate('Distribute elements vertically'),\n        imageHtml: ICONS['vertical'],\n        action: function(event, entry) {\n          distributeElements.trigger(elements, 'vertical');\n          popupMenu.close();\n        }\n      },\n    };\n\n    return entries;\n  };\n\n  var DistributeElementsModule = {\n    __depends__: [\n      PopupMenuModule$1,\n      DistributeElementsModule$1\n    ],\n    __init__: [\n      'bpmnDistributeElements',\n      'distributeElementsMenuProvider'\n    ],\n    bpmnDistributeElements: [ 'type', BpmnDistributeElements ],\n    distributeElementsMenuProvider: [ 'type', DistributeElementsMenuProvider ]\n  };\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   *\n   * @typedef {import('../../core/EventBus').default} EventBus\n   */\n\n  var NOT_REGISTERED_ERROR = 'is not a registered action',\n      IS_REGISTERED_ERROR = 'is already registered';\n\n\n  /**\n   * An interface that provides access to modeling actions by decoupling\n   * the one who requests the action to be triggered and the trigger itself.\n   *\n   * It's possible to add new actions by registering them with ´registerAction´\n   * and likewise unregister existing ones with ´unregisterAction´.\n   *\n   *\n   * ## Life-Cycle and configuration\n   *\n   * The editor actions will wait for diagram initialization before\n   * registering default actions _and_ firing an `editorActions.init` event.\n   *\n   * Interested parties may listen to the `editorActions.init` event with\n   * low priority to check, which actions got registered. Other components\n   * may use the event to register their own actions via `registerAction`.\n   *\n   * @param {EventBus} eventBus\n   * @param {Injector} injector\n   */\n  function EditorActions(eventBus, injector) {\n\n    // initialize actions\n    this._actions = {};\n\n    var self = this;\n\n    eventBus.on('diagram.init', function() {\n\n      // all diagram modules got loaded; check which ones\n      // are available and register the respective default actions\n      self._registerDefaultActions(injector);\n\n      // ask interested parties to register available editor\n      // actions on diagram initialization\n      eventBus.fire('editorActions.init', {\n        editorActions: self\n      });\n    });\n\n  }\n\n  EditorActions.$inject = [\n    'eventBus',\n    'injector'\n  ];\n\n  /**\n   * Register default actions.\n   *\n   * @param {Injector} injector\n   */\n  EditorActions.prototype._registerDefaultActions = function(injector) {\n\n    // (1) retrieve optional components to integrate with\n\n    var commandStack = injector.get('commandStack', false);\n    var modeling = injector.get('modeling', false);\n    var selection = injector.get('selection', false);\n    var zoomScroll = injector.get('zoomScroll', false);\n    var copyPaste = injector.get('copyPaste', false);\n    var canvas = injector.get('canvas', false);\n    var rules = injector.get('rules', false);\n    var keyboardMove = injector.get('keyboardMove', false);\n    var keyboardMoveSelection = injector.get('keyboardMoveSelection', false);\n\n    // (2) check components and register actions\n\n    if (commandStack) {\n      this.register('undo', function() {\n        commandStack.undo();\n      });\n\n      this.register('redo', function() {\n        commandStack.redo();\n      });\n    }\n\n    if (copyPaste && selection) {\n      this.register('copy', function() {\n        var selectedElements = selection.get();\n\n        if (selectedElements.length) {\n          return copyPaste.copy(selectedElements);\n        }\n      });\n    }\n\n    if (copyPaste) {\n      this.register('paste', function() {\n        copyPaste.paste();\n      });\n    }\n\n    if (zoomScroll) {\n      this.register('stepZoom', function(opts) {\n        zoomScroll.stepZoom(opts.value);\n      });\n    }\n\n    if (canvas) {\n      this.register('zoom', function(opts) {\n        canvas.zoom(opts.value);\n      });\n    }\n\n    if (modeling && selection && rules) {\n      this.register('removeSelection', function() {\n\n        var selectedElements = selection.get();\n\n        if (!selectedElements.length) {\n          return;\n        }\n\n        var allowed = rules.allowed('elements.delete', { elements: selectedElements }),\n            removableElements;\n\n        if (allowed === false) {\n          return;\n        }\n        else if (isArray$3(allowed)) {\n          removableElements = allowed;\n        }\n        else {\n          removableElements = selectedElements;\n        }\n\n        if (removableElements.length) {\n          modeling.removeElements(removableElements.slice());\n        }\n      });\n    }\n\n    if (keyboardMove) {\n      this.register('moveCanvas', function(opts) {\n        keyboardMove.moveCanvas(opts);\n      });\n    }\n\n    if (keyboardMoveSelection) {\n      this.register('moveSelection', function(opts) {\n        keyboardMoveSelection.moveSelection(opts.direction, opts.accelerated);\n      });\n    }\n\n  };\n\n\n  /**\n   * Triggers a registered action\n   *\n   * @param {string} action\n   * @param {Object} opts\n   *\n   * @return {unknown} Returns what the registered listener returns\n   */\n  EditorActions.prototype.trigger = function(action, opts) {\n    if (!this._actions[action]) {\n      throw error(action, NOT_REGISTERED_ERROR);\n    }\n\n    return this._actions[action](opts);\n  };\n\n\n  /**\n   * Registers a collections of actions.\n   * The key of the object will be the name of the action.\n   *\n   * @example\n   *\n   * ```javascript\n   * var actions = {\n   *   spaceTool: function() {\n   *     spaceTool.activateSelection();\n   *   },\n   *   lassoTool: function() {\n   *     lassoTool.activateSelection();\n   *   }\n   * ];\n   *\n   * editorActions.register(actions);\n   *\n   * editorActions.isRegistered('spaceTool'); // true\n   * ```\n   *\n   * @param {Object} actions\n   */\n  EditorActions.prototype.register = function(actions, listener) {\n    var self = this;\n\n    if (typeof actions === 'string') {\n      return this._registerAction(actions, listener);\n    }\n\n    forEach$1(actions, function(listener, action) {\n      self._registerAction(action, listener);\n    });\n  };\n\n  /**\n   * Registers a listener to an action key\n   *\n   * @param {string} action\n   * @param {Function} listener\n   */\n  EditorActions.prototype._registerAction = function(action, listener) {\n    if (this.isRegistered(action)) {\n      throw error(action, IS_REGISTERED_ERROR);\n    }\n\n    this._actions[action] = listener;\n  };\n\n  /**\n   * Unregister an existing action\n   *\n   * @param {string} action\n   */\n  EditorActions.prototype.unregister = function(action) {\n    if (!this.isRegistered(action)) {\n      throw error(action, NOT_REGISTERED_ERROR);\n    }\n\n    this._actions[action] = undefined;\n  };\n\n  /**\n   * Returns the number of actions that are currently registered\n   *\n   * @return {number}\n   */\n  EditorActions.prototype.getActions = function() {\n    return Object.keys(this._actions);\n  };\n\n  /**\n   * Checks wether the given action is registered\n   *\n   * @param {string} action\n   *\n   * @return {boolean}\n   */\n  EditorActions.prototype.isRegistered = function(action) {\n    return !!this._actions[action];\n  };\n\n\n  function error(action, message) {\n    return new Error(action + ' ' + message);\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var EditorActionsModule$1 = {\n    __init__: [ 'editorActions' ],\n    editorActions: [ 'type', EditorActions ]\n  };\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   */\n\n  /**\n   * Registers and executes BPMN specific editor actions.\n   *\n   * @param {Injector} injector\n   */\n  function BpmnEditorActions(injector) {\n    injector.invoke(EditorActions, this);\n  }\n\n  e$3(BpmnEditorActions, EditorActions);\n\n  BpmnEditorActions.$inject = [\n    'injector'\n  ];\n\n  /**\n   * Register default actions.\n   *\n   * @param {Injector} injector\n   */\n  BpmnEditorActions.prototype._registerDefaultActions = function(injector) {\n\n    // (0) invoke super method\n\n    EditorActions.prototype._registerDefaultActions.call(this, injector);\n\n    // (1) retrieve optional components to integrate with\n\n    var canvas = injector.get('canvas', false);\n    var elementRegistry = injector.get('elementRegistry', false);\n    var selection = injector.get('selection', false);\n    var spaceTool = injector.get('spaceTool', false);\n    var lassoTool = injector.get('lassoTool', false);\n    var handTool = injector.get('handTool', false);\n    var globalConnect = injector.get('globalConnect', false);\n    var distributeElements = injector.get('distributeElements', false);\n    var alignElements = injector.get('alignElements', false);\n    var directEditing = injector.get('directEditing', false);\n    var searchPad = injector.get('searchPad', false);\n    var modeling = injector.get('modeling', false);\n    var contextPad = injector.get('contextPad', false);\n\n    // (2) check components and register actions\n\n    if (canvas && elementRegistry && selection) {\n      this._registerAction('selectElements', function() {\n\n        // select all elements except for the invisible\n        // root element\n        var rootElement = canvas.getRootElement();\n\n        var elements = elementRegistry.filter(function(element) {\n          return element !== rootElement;\n        });\n\n        selection.select(elements);\n\n        return elements;\n      });\n    }\n\n    if (spaceTool) {\n      this._registerAction('spaceTool', function() {\n        spaceTool.toggle();\n      });\n    }\n\n    if (lassoTool) {\n      this._registerAction('lassoTool', function() {\n        lassoTool.toggle();\n      });\n    }\n\n    if (handTool) {\n      this._registerAction('handTool', function() {\n        handTool.toggle();\n      });\n    }\n\n    if (globalConnect) {\n      this._registerAction('globalConnectTool', function() {\n        globalConnect.toggle();\n      });\n    }\n\n    if (selection && distributeElements) {\n      this._registerAction('distributeElements', function(opts) {\n        var currentSelection = selection.get(),\n            type = opts.type;\n\n        if (currentSelection.length) {\n          distributeElements.trigger(currentSelection, type);\n        }\n      });\n    }\n\n    if (selection && alignElements) {\n      this._registerAction('alignElements', function(opts) {\n        var currentSelection = selection.get(),\n            aligneableElements = [],\n            type = opts.type;\n\n        if (currentSelection.length) {\n          aligneableElements = filter(currentSelection, function(element) {\n            return !is$1(element, 'bpmn:Lane');\n          });\n\n          alignElements.trigger(aligneableElements, type);\n        }\n      });\n    }\n\n    if (selection && modeling) {\n      this._registerAction('setColor', function(opts) {\n        var currentSelection = selection.get();\n\n        if (currentSelection.length) {\n          modeling.setColor(currentSelection, opts);\n        }\n      });\n    }\n\n    if (selection && directEditing) {\n      this._registerAction('directEditing', function() {\n        var currentSelection = selection.get();\n\n        if (currentSelection.length) {\n          directEditing.activate(currentSelection[0]);\n        }\n      });\n    }\n\n    if (searchPad) {\n      this._registerAction('find', function() {\n        searchPad.toggle();\n      });\n    }\n\n    if (canvas && modeling) {\n      this._registerAction('moveToOrigin', function() {\n        var rootElement = canvas.getRootElement(),\n            boundingBox,\n            elements;\n\n        if (is$1(rootElement, 'bpmn:Collaboration')) {\n          elements = elementRegistry.filter(function(element) {\n            return is$1(element.parent, 'bpmn:Collaboration');\n          });\n        } else {\n          elements = elementRegistry.filter(function(element) {\n            return element !== rootElement && !is$1(element.parent, 'bpmn:SubProcess');\n          });\n        }\n\n        boundingBox = getBBox(elements);\n\n        modeling.moveElements(\n          elements,\n          { x: -boundingBox.x, y: -boundingBox.y },\n          rootElement\n        );\n      });\n    }\n\n    if (selection && contextPad) {\n      this._registerAction('replaceElement', function(event) {\n        contextPad.triggerEntry('replace', 'click', event);\n      });\n    }\n\n  };\n\n  var EditorActionsModule = {\n    __depends__: [\n      EditorActionsModule$1\n    ],\n    editorActions: [ 'type', BpmnEditorActions ]\n  };\n\n  /**\r\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\r\n   */\r\n\r\n  /**\r\n   * @param {EventBus} eventBus\r\n   */\r\n  function BpmnGridSnapping(eventBus) {\r\n    eventBus.on([\r\n      'create.init',\r\n      'shape.move.init'\r\n    ], function(event) {\r\n      var context = event.context,\r\n          shape = event.shape;\r\n\r\n      if (isAny(shape, [\r\n        'bpmn:Participant',\r\n        'bpmn:SubProcess',\r\n        'bpmn:TextAnnotation'\r\n      ])) {\r\n        if (!context.gridSnappingContext) {\r\n          context.gridSnappingContext = {};\r\n        }\r\n\r\n        context.gridSnappingContext.snapLocation = 'top-left';\r\n      }\r\n    });\r\n  }\r\n\r\n  BpmnGridSnapping.$inject = [ 'eventBus' ];\n\n  var SPACING = 10;\n\n  function quantize(value, quantum, fn) {\n    if (!fn) {\n      fn = 'round';\n    }\n\n    return Math[ fn ](value / quantum) * quantum;\n  }\n\n  /**\r\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\r\n   * @typedef {import('../../core/EventBus').default} EventBus\r\n   */\r\n\r\n  var LOWER_PRIORITY$1 = 1200;\r\n  var LOW_PRIORITY$f = 800;\r\n\r\n  /**\r\n   * Basic grid snapping that covers connecting, creating, moving, resizing shapes, moving bendpoints\r\n   * and connection segments.\r\n   *\r\n   * @param {ElementRegistry} elementRegistry\r\n   * @param {EventBus} eventBus\r\n   * @param {Object} config\r\n   */\r\n  function GridSnapping(elementRegistry, eventBus, config) {\r\n\r\n    var active = !config || config.active !== false;\r\n\r\n    this._eventBus = eventBus;\r\n\r\n    var self = this;\r\n\r\n    eventBus.on('diagram.init', LOW_PRIORITY$f, function() {\r\n      self.setActive(active);\r\n    });\r\n\r\n    eventBus.on([\r\n      'create.move',\r\n      'create.end',\r\n      'bendpoint.move.move',\r\n      'bendpoint.move.end',\r\n      'connect.move',\r\n      'connect.end',\r\n      'connectionSegment.move.move',\r\n      'connectionSegment.move.end',\r\n      'resize.move',\r\n      'resize.end',\r\n      'shape.move.move',\r\n      'shape.move.end'\r\n    ], LOWER_PRIORITY$1, function(event) {\r\n      var originalEvent = event.originalEvent;\r\n\r\n      if (!self.active || (originalEvent && isCmd(originalEvent))) {\r\n        return;\r\n      }\r\n\r\n      var context = event.context,\r\n          gridSnappingContext = context.gridSnappingContext;\r\n\r\n      if (!gridSnappingContext) {\r\n        gridSnappingContext = context.gridSnappingContext = {};\r\n      }\r\n\r\n      [ 'x', 'y' ].forEach(function(axis) {\r\n        var options = {};\r\n\r\n        // allow snapping with offset\r\n        var snapOffset = getSnapOffset(event, axis, elementRegistry);\r\n\r\n        if (snapOffset) {\r\n          options.offset = snapOffset;\r\n        }\r\n\r\n        // allow snapping with min and max\r\n        var snapConstraints = getSnapConstraints(event, axis);\r\n\r\n        if (snapConstraints) {\r\n          assign$1(options, snapConstraints);\r\n        }\r\n\r\n        if (!isSnapped(event, axis)) {\r\n          self.snapEvent(event, axis, options);\r\n        }\r\n      });\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Snap an events x or y with optional min, max and offset.\r\n   *\r\n   * @param {Object} event\r\n   * @param {string} axis\r\n   * @param {number} [options.min]\r\n   * @param {number} [options.max]\r\n   * @param {number} [options.offset]\r\n   */\r\n  GridSnapping.prototype.snapEvent = function(event, axis, options) {\r\n    var snappedValue = this.snapValue(event[ axis ], options);\r\n\r\n    setSnapped(event, axis, snappedValue);\r\n  };\r\n\r\n  /**\r\n   * Expose grid spacing for third parties (i.e. extensions).\r\n   *\r\n   * @return {number} spacing of grid dots\r\n   */\r\n  GridSnapping.prototype.getGridSpacing = function() {\r\n    return SPACING;\r\n  };\r\n\r\n  /**\r\n   * Snap value with optional min, max and offset.\r\n   *\r\n   * @param {number} value\r\n   * @param {Object} options\r\n   * @param {number} [options.min]\r\n   * @param {number} [options.max]\r\n   * @param {number} [options.offset]\r\n   */\r\n  GridSnapping.prototype.snapValue = function(value, options) {\r\n    var offset = 0;\r\n\r\n    if (options && options.offset) {\r\n      offset = options.offset;\r\n    }\r\n\r\n    value += offset;\r\n\r\n    value = quantize(value, SPACING);\r\n\r\n    var min, max;\r\n\r\n    if (options && options.min) {\r\n      min = options.min;\r\n\r\n      if (isNumber(min)) {\r\n        min = quantize(min + offset, SPACING, 'ceil');\r\n\r\n        value = Math.max(value, min);\r\n      }\r\n    }\r\n\r\n    if (options && options.max) {\r\n      max = options.max;\r\n\r\n      if (isNumber(max)) {\r\n        max = quantize(max + offset, SPACING, 'floor');\r\n\r\n        value = Math.min(value, max);\r\n      }\r\n    }\r\n\r\n    value -= offset;\r\n\r\n    return value;\r\n  };\r\n\r\n  GridSnapping.prototype.isActive = function() {\r\n    return this.active;\r\n  };\r\n\r\n  GridSnapping.prototype.setActive = function(active) {\r\n    this.active = active;\r\n\r\n    this._eventBus.fire('gridSnapping.toggle', { active: active });\r\n  };\r\n\r\n  GridSnapping.prototype.toggleActive = function() {\r\n    this.setActive(!this.active);\r\n  };\r\n\r\n  GridSnapping.$inject = [\r\n    'elementRegistry',\r\n    'eventBus',\r\n    'config.gridSnapping'\r\n  ];\r\n\r\n  // helpers //////////\r\n\r\n  /**\r\n   * Get minimum and maximum snap constraints.\r\n   * Constraints are cached.\r\n   *\r\n   * @param {Object} event\r\n   * @param {Object} event.context\r\n   * @param {string} axis\r\n   *\r\n   * @return {boolean|Object}\r\n   */\r\n  function getSnapConstraints(event, axis) {\r\n    var context = event.context,\r\n        createConstraints = context.createConstraints,\r\n        resizeConstraints = context.resizeConstraints || {},\r\n        gridSnappingContext = context.gridSnappingContext,\r\n        snapConstraints = gridSnappingContext.snapConstraints;\r\n\r\n    // cache snap constraints\r\n    if (snapConstraints && snapConstraints[ axis ]) {\r\n      return snapConstraints[ axis ];\r\n    }\r\n\r\n    if (!snapConstraints) {\r\n      snapConstraints = gridSnappingContext.snapConstraints = {};\r\n    }\r\n\r\n    if (!snapConstraints[ axis ]) {\r\n      snapConstraints[ axis ] = {};\r\n    }\r\n\r\n    var direction = context.direction;\r\n\r\n    // create\r\n    if (createConstraints) {\r\n      if (isHorizontal$3(axis)) {\r\n        snapConstraints.x.min = createConstraints.left;\r\n        snapConstraints.x.max = createConstraints.right;\r\n      } else {\r\n        snapConstraints.y.min = createConstraints.top;\r\n        snapConstraints.y.max = createConstraints.bottom;\r\n      }\r\n    }\r\n\r\n    // resize\r\n    var minResizeConstraints = resizeConstraints.min,\r\n        maxResizeConstraints = resizeConstraints.max;\r\n\r\n    if (minResizeConstraints) {\r\n      if (isHorizontal$3(axis)) {\r\n\r\n        if (isWest(direction)) {\r\n          snapConstraints.x.max = minResizeConstraints.left;\r\n        } else {\r\n          snapConstraints.x.min = minResizeConstraints.right;\r\n        }\r\n\r\n      } else {\r\n\r\n        if (isNorth(direction)) {\r\n          snapConstraints.y.max = minResizeConstraints.top;\r\n        } else {\r\n          snapConstraints.y.min = minResizeConstraints.bottom;\r\n        }\r\n\r\n      }\r\n    }\r\n\r\n    if (maxResizeConstraints) {\r\n      if (isHorizontal$3(axis)) {\r\n\r\n        if (isWest(direction)) {\r\n          snapConstraints.x.min = maxResizeConstraints.left;\r\n        } else {\r\n          snapConstraints.x.max = maxResizeConstraints.right;\r\n        }\r\n\r\n      } else {\r\n\r\n        if (isNorth(direction)) {\r\n          snapConstraints.y.min = maxResizeConstraints.top;\r\n        } else {\r\n          snapConstraints.y.max = maxResizeConstraints.bottom;\r\n        }\r\n\r\n      }\r\n    }\r\n\r\n    return snapConstraints[ axis ];\r\n  }\r\n\r\n  /**\r\n   * Get snap offset.\r\n   * Offset is cached.\r\n   *\r\n   * @param {Object} event\r\n   * @param {string} axis\r\n   * @param {ElementRegistry} elementRegistry\r\n   *\r\n   * @return {number}\r\n   */\r\n  function getSnapOffset(event, axis, elementRegistry) {\r\n    var context = event.context,\r\n        shape = event.shape,\r\n        gridSnappingContext = context.gridSnappingContext,\r\n        snapLocation = gridSnappingContext.snapLocation,\r\n        snapOffset = gridSnappingContext.snapOffset;\r\n\r\n    // cache snap offset\r\n    if (snapOffset && isNumber(snapOffset[ axis ])) {\r\n      return snapOffset[ axis ];\r\n    }\r\n\r\n    if (!snapOffset) {\r\n      snapOffset = gridSnappingContext.snapOffset = {};\r\n    }\r\n\r\n    if (!isNumber(snapOffset[ axis ])) {\r\n      snapOffset[ axis ] = 0;\r\n    }\r\n\r\n    if (!shape) {\r\n      return snapOffset[ axis ];\r\n    }\r\n\r\n    if (!elementRegistry.get(shape.id)) {\r\n\r\n      if (isHorizontal$3(axis)) {\r\n        snapOffset[ axis ] += shape[ axis ] + shape.width / 2;\r\n      } else {\r\n        snapOffset[ axis ] += shape[ axis ] + shape.height / 2;\r\n      }\r\n    }\r\n\r\n    if (!snapLocation) {\r\n      return snapOffset[ axis ];\r\n    }\r\n\r\n    if (axis === 'x') {\r\n      if (/left/.test(snapLocation)) {\r\n        snapOffset[ axis ] -= shape.width / 2;\r\n      } else if (/right/.test(snapLocation)) {\r\n        snapOffset[ axis ] += shape.width / 2;\r\n      }\r\n    } else {\r\n      if (/top/.test(snapLocation)) {\r\n        snapOffset[ axis ] -= shape.height / 2;\r\n      } else if (/bottom/.test(snapLocation)) {\r\n        snapOffset[ axis ] += shape.height / 2;\r\n      }\r\n    }\r\n\r\n    return snapOffset[ axis ];\r\n  }\r\n\r\n  function isHorizontal$3(axis) {\r\n    return axis === 'x';\r\n  }\r\n\r\n  function isNorth(direction) {\r\n    return direction.indexOf('n') !== -1;\r\n  }\r\n\r\n  function isWest(direction) {\r\n    return direction.indexOf('w') !== -1;\r\n  }\n\n  /**\r\n   * @typedef {import('../../../model/Types').Shape} Shape\r\n   *\r\n   * @typedef {import('../../../util/Types').Rect} Rect\r\n   *\r\n   * @typedef {import('../../../core/EventBus').default} EventBus\r\n   * @typedef {import('../../grid-snapping/GridSnapping').default} GridSnapping\r\n   */\r\n\r\n  /**\r\n   * Integrates resizing with grid snapping.\r\n   *\r\n   * @param {EventBus} eventBus\r\n   * @param {GridSnapping} gridSnapping\r\n   */\r\n  function ResizeBehavior$1(eventBus, gridSnapping) {\r\n    CommandInterceptor.call(this, eventBus);\r\n\r\n    this._gridSnapping = gridSnapping;\r\n\r\n    var self = this;\r\n\r\n    this.preExecute('shape.resize', function(event) {\r\n      var context = event.context,\r\n          hints = context.hints || {},\r\n          autoResize = hints.autoResize;\r\n\r\n      if (!autoResize) {\r\n        return;\r\n      }\r\n\r\n      var shape = context.shape,\r\n          newBounds = context.newBounds;\r\n\r\n      if (isString(autoResize)) {\r\n        context.newBounds = self.snapComplex(newBounds, autoResize);\r\n      } else {\r\n        context.newBounds = self.snapSimple(shape, newBounds);\r\n      }\r\n    });\r\n  }\r\n\r\n  ResizeBehavior$1.$inject = [\r\n    'eventBus',\r\n    'gridSnapping',\r\n    'modeling'\r\n  ];\r\n\r\n  e$3(ResizeBehavior$1, CommandInterceptor);\r\n\r\n  /**\r\n   * Snap width and height in relation to center.\r\n   *\r\n   * @param {Shape} shape\r\n   * @param {Rect} newBounds\r\n   *\r\n   * @return {Rect} Snapped bounds.\r\n   */\r\n  ResizeBehavior$1.prototype.snapSimple = function(shape, newBounds) {\r\n    var gridSnapping = this._gridSnapping;\r\n\r\n    newBounds.width = gridSnapping.snapValue(newBounds.width, {\r\n      min: newBounds.width\r\n    });\r\n\r\n    newBounds.height = gridSnapping.snapValue(newBounds.height, {\r\n      min: newBounds.height\r\n    });\r\n\r\n    newBounds.x = shape.x + (shape.width / 2) - (newBounds.width / 2);\r\n    newBounds.y = shape.y + (shape.height / 2) - (newBounds.height / 2);\r\n\r\n    return newBounds;\r\n  };\r\n\r\n  /**\r\n   * Snap x, y, width and height according to given directions.\r\n   *\r\n   * @param {Rect} newBounds\r\n   * @param {string} directions - Directions as {n|w|s|e}.\r\n   *\r\n   * @return {Rect} Snapped bounds.\r\n   */\r\n  ResizeBehavior$1.prototype.snapComplex = function(newBounds, directions) {\r\n    if (/w|e/.test(directions)) {\r\n      newBounds = this.snapHorizontally(newBounds, directions);\r\n    }\r\n\r\n    if (/n|s/.test(directions)) {\r\n      newBounds = this.snapVertically(newBounds, directions);\r\n    }\r\n\r\n    return newBounds;\r\n  };\r\n\r\n  /**\r\n   * Snap in one or both directions horizontally.\r\n   *\r\n   * @param {Rect} newBounds\r\n   * @param {string} directions - Directions as {n|w|s|e}.\r\n   *\r\n   * @return {Rect} Snapped bounds.\r\n   */\r\n  ResizeBehavior$1.prototype.snapHorizontally = function(newBounds, directions) {\r\n    var gridSnapping = this._gridSnapping,\r\n        west = /w/.test(directions),\r\n        east = /e/.test(directions);\r\n\r\n    var snappedNewBounds = {};\r\n\r\n    snappedNewBounds.width = gridSnapping.snapValue(newBounds.width, {\r\n      min: newBounds.width\r\n    });\r\n\r\n    if (east) {\r\n\r\n      // handle <we>\r\n      if (west) {\r\n        snappedNewBounds.x = gridSnapping.snapValue(newBounds.x, {\r\n          max: newBounds.x\r\n        });\r\n\r\n        snappedNewBounds.width += gridSnapping.snapValue(newBounds.x - snappedNewBounds.x, {\r\n          min: newBounds.x - snappedNewBounds.x\r\n        });\r\n      }\r\n\r\n      // handle <e>\r\n      else {\r\n        newBounds.x = newBounds.x + newBounds.width - snappedNewBounds.width;\r\n      }\r\n    }\r\n\r\n    // assign snapped x and width\r\n    assign$1(newBounds, snappedNewBounds);\r\n\r\n    return newBounds;\r\n  };\r\n\r\n  /**\r\n   * Snap in one or both directions vertically.\r\n   *\r\n   * @param {Rect} newBounds\r\n   * @param {string} directions - Directions as {n|w|s|e}.\r\n   *\r\n   * @return {Rect} Snapped bounds.\r\n   */\r\n  ResizeBehavior$1.prototype.snapVertically = function(newBounds, directions) {\r\n    var gridSnapping = this._gridSnapping,\r\n        north = /n/.test(directions),\r\n        south = /s/.test(directions);\r\n\r\n    var snappedNewBounds = {};\r\n\r\n    snappedNewBounds.height = gridSnapping.snapValue(newBounds.height, {\r\n      min: newBounds.height\r\n    });\r\n\r\n    if (north) {\r\n\r\n      // handle <ns>\r\n      if (south) {\r\n        snappedNewBounds.y = gridSnapping.snapValue(newBounds.y, {\r\n          max: newBounds.y\r\n        });\r\n\r\n        snappedNewBounds.height += gridSnapping.snapValue(newBounds.y - snappedNewBounds.y, {\r\n          min: newBounds.y - snappedNewBounds.y\r\n        });\r\n      }\r\n\r\n      // handle <n>\r\n      else {\r\n        newBounds.y = newBounds.y + newBounds.height - snappedNewBounds.height;\r\n      }\r\n    }\r\n\r\n    // assign snapped y and height\r\n    assign$1(newBounds, snappedNewBounds);\r\n\r\n    return newBounds;\r\n  };\n\n  /**\r\n   * @typedef {import('../../../core/EventBus').default} EventBus\r\n   * @typedef {import('../../grid-snapping/GridSnapping').default} GridSnapping\r\n   */\r\n\r\n  var HIGH_PRIORITY$f = 2000;\r\n\r\n  /**\r\n   * Integrates space tool with grid snapping.\r\n   *\r\n   * @param {EventBus} eventBus\r\n   * @param {GridSnapping} gridSnapping\r\n   */\r\n  function SpaceToolBehavior$1(eventBus, gridSnapping) {\r\n    eventBus.on([\r\n      'spaceTool.move',\r\n      'spaceTool.end'\r\n    ], HIGH_PRIORITY$f, function(event) {\r\n      var context = event.context;\r\n\r\n      if (!context.initialized) {\r\n        return;\r\n      }\r\n\r\n      var axis = context.axis;\r\n\r\n      var snapped;\r\n\r\n      if (axis === 'x') {\r\n\r\n        // snap delta x to multiple of 10\r\n        snapped = gridSnapping.snapValue(event.dx);\r\n\r\n        event.x = event.x + snapped - event.dx;\r\n        event.dx = snapped;\r\n      } else {\r\n\r\n        // snap delta y to multiple of 10\r\n        snapped = gridSnapping.snapValue(event.dy);\r\n\r\n        event.y = event.y + snapped - event.dy;\r\n        event.dy = snapped;\r\n      }\r\n    });\r\n  }\r\n\r\n  SpaceToolBehavior$1.$inject = [\r\n    'eventBus',\r\n    'gridSnapping'\r\n  ];\n\n  var GridSnappingBehaviorModule$1 = {\r\n    __init__: [\r\n      'gridSnappingResizeBehavior',\r\n      'gridSnappingSpaceToolBehavior'\r\n    ],\r\n    gridSnappingResizeBehavior: [ 'type', ResizeBehavior$1 ],\r\n    gridSnappingSpaceToolBehavior: [ 'type', SpaceToolBehavior$1 ]\r\n  };\n\n  /**\r\n   * @type { import('didi').ModuleDeclaration }\r\n   */\r\n  var GridSnappingModule$1 = {\r\n    __depends__: [ GridSnappingBehaviorModule$1 ],\r\n    __init__: [ 'gridSnapping' ],\r\n    gridSnapping: [ 'type', GridSnapping ]\r\n  };\n\n  /**\r\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\r\n   * @typedef {import('diagram-js/lib/features/grid-snapping/GridSnapping').default} GridSnapping\r\n   *\r\n   * @typedef {import('diagram-js/lib/util/Types').Axis} Axis\r\n   */\r\n\r\n  var HIGH_PRIORITY$e = 2000;\r\n\r\n  /**\r\n   * @param {EventBus} eventBus\r\n   * @param {GridSnapping} gridSnapping\r\n   */\r\n  function GridSnappingAutoPlaceBehavior(eventBus, gridSnapping) {\r\n    eventBus.on('autoPlace', HIGH_PRIORITY$e, function(context) {\r\n      var source = context.source,\r\n          sourceMid = getMid(source),\r\n          shape = context.shape;\r\n\r\n      var position = getNewShapePosition(source, shape);\r\n\r\n      [ 'x', 'y' ].forEach(function(axis) {\r\n        var options = {};\r\n\r\n        // do not snap if x/y equal\r\n        if (position[ axis ] === sourceMid[ axis ]) {\r\n          return;\r\n        }\r\n\r\n        if (position[ axis ] > sourceMid[ axis ]) {\r\n          options.min = position[ axis ];\r\n        } else {\r\n          options.max = position[ axis ];\r\n        }\r\n\r\n        if (is$1(shape, 'bpmn:TextAnnotation')) {\r\n\r\n          if (isHorizontal$2(axis)) {\r\n            options.offset = -shape.width / 2;\r\n          } else {\r\n            options.offset = -shape.height / 2;\r\n          }\r\n\r\n        }\r\n\r\n        position[ axis ] = gridSnapping.snapValue(position[ axis ], options);\r\n\r\n      });\r\n\r\n      // must be returned to be considered by auto place\r\n      return position;\r\n    });\r\n  }\r\n\r\n  GridSnappingAutoPlaceBehavior.$inject = [\r\n    'eventBus',\r\n    'gridSnapping'\r\n  ];\r\n\r\n  // helpers //////////\r\n\r\n  /**\r\n   * @param {Axis} axis\r\n   *\r\n   * @return {boolean}\r\n   */\r\n  function isHorizontal$2(axis) {\r\n    return axis === 'x';\r\n  }\n\n  /**\r\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\r\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\r\n   * @typedef {import('diagram-js/lib/features/grid-snapping/GridSnapping').default} GridSnapping\r\n   */\r\n\r\n  var HIGHER_PRIORITY$4 = 1750;\r\n\r\n  /**\r\n   * @param {Canvas} canvas\r\n   * @param {EventBus} eventBus\r\n   * @param {GridSnapping} gridSnapping\r\n   */\r\n  function GridSnappingParticipantBehavior(canvas, eventBus, gridSnapping) {\r\n    eventBus.on([\r\n      'create.start',\r\n      'shape.move.start'\r\n    ], HIGHER_PRIORITY$4, function(event) {\r\n      var context = event.context,\r\n          shape = context.shape,\r\n          rootElement = canvas.getRootElement();\r\n\r\n      if (!is$1(shape, 'bpmn:Participant') ||\r\n        !is$1(rootElement, 'bpmn:Process') ||\r\n        !rootElement.children.length) {\r\n        return;\r\n      }\r\n\r\n      var createConstraints = context.createConstraints;\r\n\r\n      if (!createConstraints) {\r\n        return;\r\n      }\r\n\r\n      shape.width = gridSnapping.snapValue(shape.width, { min: shape.width });\r\n      shape.height = gridSnapping.snapValue(shape.height, { min: shape.height });\r\n    });\r\n  }\r\n\r\n  GridSnappingParticipantBehavior.$inject = [\r\n    'canvas',\r\n    'eventBus',\r\n    'gridSnapping'\r\n  ];\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('diagram-js/lib/features/grid-snapping/GridSnapping').default} GridSnapping\n   * @typedef {import('../../modeling/Modeling').default} Modeling\n   *\n   * @typedef {import('diagram-js/lib/util/Types').Point} Point\n   */\n\n  var HIGH_PRIORITY$d = 3000;\n\n\n  /**\n   * Snaps connections with Manhattan layout.\n   *\n   * @param {EventBus} eventBus\n   * @param {GridSnapping} gridSnapping\n   * @param {Modeling} modeling\n   */\n  function GridSnappingLayoutConnectionBehavior(eventBus, gridSnapping, modeling) {\n    CommandInterceptor.call(this, eventBus);\n\n    this._gridSnapping = gridSnapping;\n\n    var self = this;\n\n    this.postExecuted([\n      'connection.create',\n      'connection.layout'\n    ], HIGH_PRIORITY$d, function(event) {\n      var context = event.context,\n          connection = context.connection,\n          hints = context.hints || {},\n          waypoints = connection.waypoints;\n\n      if (hints.connectionStart || hints.connectionEnd || hints.createElementsBehavior === false) {\n        return;\n      }\n\n      if (!hasMiddleSegments(waypoints)) {\n        return;\n      }\n\n      modeling.updateWaypoints(connection, self.snapMiddleSegments(waypoints));\n    });\n  }\n\n  GridSnappingLayoutConnectionBehavior.$inject = [\n    'eventBus',\n    'gridSnapping',\n    'modeling'\n  ];\n\n  e$3(GridSnappingLayoutConnectionBehavior, CommandInterceptor);\n\n  /**\n   * Snap middle segments of a given connection.\n   *\n   * @param {Point[]} waypoints\n   *\n   * @return {Point[]}\n   */\n  GridSnappingLayoutConnectionBehavior.prototype.snapMiddleSegments = function(waypoints) {\n    var gridSnapping = this._gridSnapping,\n        snapped;\n\n    waypoints = waypoints.slice();\n\n    for (var i = 1; i < waypoints.length - 2; i++) {\n\n      snapped = snapSegment(gridSnapping, waypoints[i], waypoints[i + 1]);\n\n      waypoints[i] = snapped[0];\n      waypoints[i + 1] = snapped[1];\n    }\n\n    return waypoints;\n  };\n\n\n  // helpers //////////\n\n  /**\n   * Check whether a connection has a middle segments.\n   *\n   * @param {Point[]} waypoints\n   *\n   * @return {boolean}\n   */\n  function hasMiddleSegments(waypoints) {\n    return waypoints.length > 3;\n  }\n\n  /**\n   * Check whether an alignment is horizontal.\n   *\n   * @param {string} aligned\n   *\n   * @return {boolean}\n   */\n  function horizontallyAligned(aligned) {\n    return aligned === 'h';\n  }\n\n  /**\n   * Check whether an alignment is vertical.\n   *\n   * @param {string} aligned\n   *\n   * @return {boolean}\n   */\n  function verticallyAligned(aligned) {\n    return aligned === 'v';\n  }\n\n  /**\n   * Get middle segments from a given connection.\n   *\n   * @param {Point[]} waypoints\n   *\n   * @return {Point[]}\n   */\n  function snapSegment(gridSnapping, segmentStart, segmentEnd) {\n\n    var aligned = pointsAligned(segmentStart, segmentEnd);\n\n    var snapped = {};\n\n    if (horizontallyAligned(aligned)) {\n\n      // snap horizontally\n      snapped.y = gridSnapping.snapValue(segmentStart.y);\n    }\n\n    if (verticallyAligned(aligned)) {\n\n      // snap vertically\n      snapped.x = gridSnapping.snapValue(segmentStart.x);\n    }\n\n    if ('x' in snapped || 'y' in snapped) {\n      segmentStart = assign$1({}, segmentStart, snapped);\n      segmentEnd = assign$1({}, segmentEnd, snapped);\n    }\n\n    return [ segmentStart, segmentEnd ];\n  }\n\n  var GridSnappingBehaviorModule = {\r\n    __init__: [\r\n      'gridSnappingAutoPlaceBehavior',\r\n      'gridSnappingParticipantBehavior',\r\n      'gridSnappingLayoutConnectionBehavior',\r\n    ],\r\n    gridSnappingAutoPlaceBehavior: [ 'type', GridSnappingAutoPlaceBehavior ],\r\n    gridSnappingParticipantBehavior: [ 'type', GridSnappingParticipantBehavior ],\r\n    gridSnappingLayoutConnectionBehavior: [ 'type', GridSnappingLayoutConnectionBehavior ]\r\n  };\n\n  var GridSnappingModule = {\r\n    __depends__: [\r\n      GridSnappingModule$1,\r\n      GridSnappingBehaviorModule\r\n    ],\r\n    __init__: [ 'bpmnGridSnapping' ],\r\n    bpmnGridSnapping: [ 'type', BpmnGridSnapping ]\r\n  };\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('diagram-js/lib/features/interaction-events/InteractionEvents').default} InteractionEvents\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Shape} Shape\n   */\n\n  var LABEL_WIDTH = 30,\n      LABEL_HEIGHT = 30;\n\n\n  /**\n   * BPMN-specific hit zones and interaction fixes.\n   *\n   * @param {EventBus} eventBus\n   * @param {InteractionEvents} interactionEvents\n   */\n  function BpmnInteractionEvents(eventBus, interactionEvents) {\n\n    this._interactionEvents = interactionEvents;\n\n    var self = this;\n\n    eventBus.on([\n      'interactionEvents.createHit',\n      'interactionEvents.updateHit'\n    ], function(context) {\n      var element = context.element,\n          gfx = context.gfx;\n\n      if (is$1(element, 'bpmn:Lane')) {\n        return self._createParticipantHit(element, gfx);\n      } else\n\n      if (is$1(element, 'bpmn:Participant')) {\n        if (isExpanded(element)) {\n          return self._createParticipantHit(element, gfx);\n        } else {\n          return self._createDefaultHit(element, gfx);\n        }\n      } else\n\n      if (is$1(element, 'bpmn:SubProcess')) {\n        if (isExpanded(element)) {\n          return self._createSubProcessHit(element, gfx);\n        } else {\n          return self._createDefaultHit(element, gfx);\n        }\n      }\n    });\n\n  }\n\n  BpmnInteractionEvents.$inject = [\n    'eventBus',\n    'interactionEvents'\n  ];\n\n  /**\n   * @param {Element} element\n   * @param {SVGElement} gfx\n   *\n   * @return {boolean}\n   */\n  BpmnInteractionEvents.prototype._createDefaultHit = function(element, gfx) {\n    this._interactionEvents.removeHits(gfx);\n\n    this._interactionEvents.createDefaultHit(element, gfx);\n\n    // indicate that we created a hit\n    return true;\n  };\n\n  /**\n   * @param {Shape} element\n   * @param {SVGElement} gfx\n   *\n   * @return {boolean}\n   */\n  BpmnInteractionEvents.prototype._createParticipantHit = function(element, gfx) {\n\n    // remove existing hits\n    this._interactionEvents.removeHits(gfx);\n\n    // add body hit\n    this._interactionEvents.createBoxHit(gfx, 'no-move', {\n      width: element.width,\n      height: element.height\n    });\n\n    // add outline hit\n    this._interactionEvents.createBoxHit(gfx, 'click-stroke', {\n      width: element.width,\n      height: element.height\n    });\n\n    // add label hit\n    this._interactionEvents.createBoxHit(gfx, 'all', {\n      width: LABEL_WIDTH,\n      height: element.height\n    });\n\n    // indicate that we created a hit\n    return true;\n  };\n\n  /**\n   * @param {Shape} element\n   * @param {SVGElement} gfx\n   *\n   * @return {boolean}\n   */\n  BpmnInteractionEvents.prototype._createSubProcessHit = function(element, gfx) {\n\n    // remove existing hits\n    this._interactionEvents.removeHits(gfx);\n\n    // add body hit\n    this._interactionEvents.createBoxHit(gfx, 'no-move', {\n      width: element.width,\n      height: element.height\n    });\n\n    // add outline hit\n    this._interactionEvents.createBoxHit(gfx, 'click-stroke', {\n      width: element.width,\n      height: element.height\n    });\n\n    // add label hit\n    this._interactionEvents.createBoxHit(gfx, 'all', {\n      width: element.width,\n      height: LABEL_HEIGHT\n    });\n\n    // indicate that we created a hit\n    return true;\n  };\n\n  var InteractionEventsModule = {\n    __init__: [ 'bpmnInteractionEvents' ],\n    bpmnInteractionEvents: [ 'type', BpmnInteractionEvents ]\n  };\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   * @typedef {import('diagram-js/lib/features/editor-actions/EditorActions').default} EditorActions\n   * @typedef {import('diagram-js/lib/features/keyboard/Keyboard').default} Keyboard\n   */\n\n  /**\n   * BPMN 2.0 specific keyboard bindings.\n   *\n   * @param {Injector} injector\n   */\n  function BpmnKeyboardBindings(injector) {\n    injector.invoke(KeyboardBindings, this);\n  }\n\n  e$3(BpmnKeyboardBindings, KeyboardBindings);\n\n  BpmnKeyboardBindings.$inject = [\n    'injector'\n  ];\n\n\n  /**\n   * Register available keyboard bindings.\n   *\n   * @param {Keyboard} keyboard\n   * @param {EditorActions} editorActions\n   */\n  BpmnKeyboardBindings.prototype.registerBindings = function(keyboard, editorActions) {\n\n    // inherit default bindings\n    KeyboardBindings.prototype.registerBindings.call(this, keyboard, editorActions);\n\n    /**\n     * Add keyboard binding if respective editor action\n     * is registered.\n     *\n     * @param {string} action name\n     * @param {Function} fn that implements the key binding\n     */\n    function addListener(action, fn) {\n\n      if (editorActions.isRegistered(action)) {\n        keyboard.addListener(fn);\n      }\n    }\n\n    // select all elements\n    // CTRL + A\n    addListener('selectElements', function(context) {\n\n      var event = context.keyEvent;\n\n      if (keyboard.isKey([ 'a', 'A' ], event) && keyboard.isCmd(event)) {\n        editorActions.trigger('selectElements');\n\n        return true;\n      }\n    });\n\n    // search labels\n    // CTRL + F\n    addListener('find', function(context) {\n\n      var event = context.keyEvent;\n\n      if (keyboard.isKey([ 'f', 'F' ], event) && keyboard.isCmd(event)) {\n        editorActions.trigger('find');\n\n        return true;\n      }\n    });\n\n    // activate space tool\n    // S\n    addListener('spaceTool', function(context) {\n\n      var event = context.keyEvent;\n\n      if (keyboard.hasModifier(event)) {\n        return;\n      }\n\n      if (keyboard.isKey([ 's', 'S' ], event)) {\n        editorActions.trigger('spaceTool');\n\n        return true;\n      }\n    });\n\n    // activate lasso tool\n    // L\n    addListener('lassoTool', function(context) {\n\n      var event = context.keyEvent;\n\n      if (keyboard.hasModifier(event)) {\n        return;\n      }\n\n      if (keyboard.isKey([ 'l', 'L' ], event)) {\n        editorActions.trigger('lassoTool');\n\n        return true;\n      }\n    });\n\n    // activate hand tool\n    // H\n    addListener('handTool', function(context) {\n\n      var event = context.keyEvent;\n\n      if (keyboard.hasModifier(event)) {\n        return;\n      }\n\n      if (keyboard.isKey([ 'h', 'H' ], event)) {\n        editorActions.trigger('handTool');\n\n        return true;\n      }\n    });\n\n    // activate global connect tool\n    // C\n    addListener('globalConnectTool', function(context) {\n\n      var event = context.keyEvent;\n\n      if (keyboard.hasModifier(event)) {\n        return;\n      }\n\n      if (keyboard.isKey([ 'c', 'C' ], event)) {\n        editorActions.trigger('globalConnectTool');\n\n        return true;\n      }\n    });\n\n    // activate direct editing\n    // E\n    addListener('directEditing', function(context) {\n\n      var event = context.keyEvent;\n\n      if (keyboard.hasModifier(event)) {\n        return;\n      }\n\n      if (keyboard.isKey([ 'e', 'E' ], event)) {\n        editorActions.trigger('directEditing');\n\n        return true;\n      }\n    });\n\n    // activate replace element\n    // R\n    addListener('replaceElement', function(context) {\n\n      var event = context.keyEvent;\n\n      if (keyboard.hasModifier(event)) {\n        return;\n      }\n\n      if (keyboard.isKey([ 'r', 'R' ], event)) {\n        editorActions.trigger('replaceElement', event);\n\n        return true;\n      }\n    });\n\n  };\n\n  var KeyboardModule = {\n    __depends__: [\n      KeyboardModule$1\n    ],\n    __init__: [ 'keyboardBindings' ],\n    keyboardBindings: [ 'type', BpmnKeyboardBindings ]\n  };\n\n  /**\n   * @typedef {import('../keyboard/Keyboard').default} Keyboard\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   * @typedef {import('../rules/Rules').default} Rules\n   * @typedef {import('../selection/Selection').default} Selection\n   */\n\n  var DEFAULT_CONFIG = {\n    moveSpeed: 1,\n    moveSpeedAccelerated: 10\n  };\n\n  var HIGHER_PRIORITY$3 = 1500;\n\n  var LEFT = 'left';\n  var UP = 'up';\n  var RIGHT = 'right';\n  var DOWN = 'down';\n\n  var KEY_TO_DIRECTION = {\n    ArrowLeft: LEFT,\n    Left: LEFT,\n    ArrowUp: UP,\n    Up: UP,\n    ArrowRight: RIGHT,\n    Right: RIGHT,\n    ArrowDown: DOWN,\n    Down: DOWN\n  };\n\n  var DIRECTIONS_DELTA = {\n    left: function(speed) {\n      return {\n        x: -speed,\n        y: 0\n      };\n    },\n    up: function(speed) {\n      return {\n        x: 0,\n        y: -speed\n      };\n    },\n    right: function(speed) {\n      return {\n        x: speed,\n        y: 0\n      };\n    },\n    down: function(speed) {\n      return {\n        x: 0,\n        y: speed\n      };\n    }\n  };\n\n\n  /**\n   * Enables to move selection with keyboard arrows.\n   * Use with Shift for modified speed (default=1, with Shift=10).\n   * Pressed Cmd/Ctrl turns the feature off.\n   *\n   * @param {Object} config\n   * @param {number} [config.moveSpeed=1]\n   * @param {number} [config.moveSpeedAccelerated=10]\n   * @param {Keyboard} keyboard\n   * @param {Modeling} modeling\n   * @param {Rules} rules\n   * @param {Selection} selection\n   */\n  function KeyboardMoveSelection(\n      config,\n      keyboard,\n      modeling,\n      rules,\n      selection\n  ) {\n\n    var self = this;\n\n    this._config = assign$1({}, DEFAULT_CONFIG, config || {});\n\n    keyboard.addListener(HIGHER_PRIORITY$3, function(event) {\n\n      var keyEvent = event.keyEvent;\n\n      var direction = KEY_TO_DIRECTION[keyEvent.key];\n\n      if (!direction) {\n        return;\n      }\n\n      if (keyboard.isCmd(keyEvent)) {\n        return;\n      }\n\n      var accelerated = keyboard.isShift(keyEvent);\n\n      self.moveSelection(direction, accelerated);\n\n      return true;\n    });\n\n\n    /**\n     * Move selected elements in the given direction,\n     * optionally specifying accelerated movement.\n     *\n     * @param {string} direction\n     * @param {boolean} [accelerated=false]\n     */\n    this.moveSelection = function(direction, accelerated) {\n\n      var selectedElements = selection.get();\n\n      if (!selectedElements.length) {\n        return;\n      }\n\n      var speed = this._config[\n        accelerated ?\n          'moveSpeedAccelerated' :\n          'moveSpeed'\n      ];\n\n      var delta = DIRECTIONS_DELTA[direction](speed);\n\n      var canMove = rules.allowed('elements.move', {\n        shapes: selectedElements\n      });\n\n      if (canMove) {\n        modeling.moveElements(selectedElements, delta);\n      }\n    };\n\n  }\n\n  KeyboardMoveSelection.$inject = [\n    'config.keyboardMoveSelection',\n    'keyboard',\n    'modeling',\n    'rules',\n    'selection'\n  ];\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var KeyboardMoveSelectionModule = {\n    __depends__: [\n      KeyboardModule$1,\n      SelectionModule\n    ],\n    __init__: [\n      'keyboardMoveSelection'\n    ],\n    keyboardMoveSelection: [ 'type', KeyboardMoveSelection ]\n  };\n\n  /**\n   * @typedef {import('../../core/Types').ShapeLike} Shape\n   *\n   * @typedef {import('../../util/Types').Direction} Direction\n   * @typedef {import('../../util/Types').Point} Point\n   *\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../dragging/Dragging').default} Dragging\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   * @typedef {import('../rules/Rules').default} Rules\n   */\n\n  var DEFAULT_MIN_WIDTH = 10;\n\n\n  /**\n   * A component that provides resizing of shapes on the canvas.\n   *\n   * The following components are part of shape resize:\n   *\n   *  * adding resize handles,\n   *  * creating a visual during resize\n   *  * checking resize rules\n   *  * committing a change once finished\n   *\n   *\n   * ## Customizing\n   *\n   * It's possible to customize the resizing behaviour by intercepting 'resize.start'\n   * and providing the following parameters through the 'context':\n   *\n   *   * minDimensions ({ width, height }): minimum shape dimensions\n   *\n   *   * childrenBoxPadding ({ left, top, bottom, right } || number):\n   *     gap between the minimum bounding box and the container\n   *\n   * f.ex:\n   *\n   * ```javascript\n   * eventBus.on('resize.start', 1500, function(event) {\n   *   var context = event.context,\n   *\n   *  context.minDimensions = { width: 140, height: 120 };\n   *\n   *  // Passing general padding\n   *  context.childrenBoxPadding = 30;\n   *\n   *  // Passing padding to a specific side\n   *  context.childrenBoxPadding.left = 20;\n   * });\n   * ```\n   *\n   * @param {EventBus} eventBus\n   * @param {Rules} rules\n   * @param {Modeling} modeling\n   * @param {Dragging} dragging\n   */\n  function Resize(eventBus, rules, modeling, dragging) {\n\n    this._dragging = dragging;\n    this._rules = rules;\n\n    var self = this;\n\n\n    /**\n     * Handle resize move by specified delta.\n     *\n     * @param {Object} context\n     * @param {Point} delta\n     */\n    function handleMove(context, delta) {\n\n      var shape = context.shape,\n          direction = context.direction,\n          resizeConstraints = context.resizeConstraints,\n          newBounds;\n\n      context.delta = delta;\n\n      newBounds = resizeBounds$1(shape, direction, delta);\n\n      // ensure constraints during resize\n      context.newBounds = ensureConstraints$1(newBounds, resizeConstraints);\n\n      // update + cache executable state\n      context.canExecute = self.canResize(context);\n    }\n\n    /**\n     * Handle resize start.\n     *\n     * @param {Object} context\n     */\n    function handleStart(context) {\n\n      var resizeConstraints = context.resizeConstraints,\n\n          // evaluate minBounds for backwards compatibility\n          minBounds = context.minBounds;\n\n      if (resizeConstraints !== undefined) {\n        return;\n      }\n\n      if (minBounds === undefined) {\n        minBounds = self.computeMinResizeBox(context);\n      }\n\n      context.resizeConstraints = {\n        min: asTRBL(minBounds)\n      };\n    }\n\n    /**\n     * Handle resize end.\n     *\n     * @param {Object} context\n     */\n    function handleEnd(context) {\n      var shape = context.shape,\n          canExecute = context.canExecute,\n          newBounds = context.newBounds;\n\n      if (canExecute) {\n\n        // ensure we have actual pixel values for new bounds\n        // (important when zoom level was > 1 during move)\n        newBounds = roundBounds(newBounds);\n\n        if (!boundsChanged(shape, newBounds)) {\n\n          // no resize necessary\n          return;\n        }\n\n        // perform the actual resize\n        modeling.resizeShape(shape, newBounds);\n      }\n    }\n\n\n    eventBus.on('resize.start', function(event) {\n      handleStart(event.context);\n    });\n\n    eventBus.on('resize.move', function(event) {\n      var delta = {\n        x: event.dx,\n        y: event.dy\n      };\n\n      handleMove(event.context, delta);\n    });\n\n    eventBus.on('resize.end', function(event) {\n      handleEnd(event.context);\n    });\n\n  }\n\n\n  Resize.prototype.canResize = function(context) {\n    var rules = this._rules;\n\n    var ctx = pick(context, [ 'newBounds', 'shape', 'delta', 'direction' ]);\n\n    return rules.allowed('shape.resize', ctx);\n  };\n\n  /**\n   * Activate a resize operation.\n   *\n   * You may specify additional contextual information and must specify a\n   * resize direction during activation of the resize event.\n   *\n   * @param {MouseEvent|TouchEvent} event\n   * @param {Shape} shape\n   * @param {Object|Direction} contextOrDirection\n   */\n  Resize.prototype.activate = function(event, shape, contextOrDirection) {\n    var dragging = this._dragging,\n        context,\n        direction;\n\n    if (typeof contextOrDirection === 'string') {\n      contextOrDirection = {\n        direction: contextOrDirection\n      };\n    }\n\n    context = assign$1({ shape: shape }, contextOrDirection);\n\n    direction = context.direction;\n\n    if (!direction) {\n      throw new Error('must provide a direction (n|w|s|e|nw|se|ne|sw)');\n    }\n\n    dragging.init(event, getReferencePoint$1(shape, direction), 'resize', {\n      autoActivate: true,\n      cursor: getCursor(direction),\n      data: {\n        shape: shape,\n        context: context\n      }\n    });\n  };\n\n  Resize.prototype.computeMinResizeBox = function(context) {\n    var shape = context.shape,\n        direction = context.direction,\n        minDimensions,\n        childrenBounds;\n\n    minDimensions = context.minDimensions || {\n      width: DEFAULT_MIN_WIDTH,\n      height: DEFAULT_MIN_WIDTH\n    };\n\n    // get children bounds\n    childrenBounds = computeChildrenBBox(shape, context.childrenBoxPadding);\n\n    // get correct minimum bounds from given resize direction\n    // basically ensures that the minBounds is max(childrenBounds, minDimensions)\n    return getMinResizeBounds(direction, shape, minDimensions, childrenBounds);\n  };\n\n\n  Resize.$inject = [\n    'eventBus',\n    'rules',\n    'modeling',\n    'dragging'\n  ];\n\n  // helpers //////////\n\n  function boundsChanged(shape, newBounds) {\n    return shape.x !== newBounds.x ||\n      shape.y !== newBounds.y ||\n      shape.width !== newBounds.width ||\n      shape.height !== newBounds.height;\n  }\n\n  function getReferencePoint$1(shape, direction) {\n    var mid = getMid(shape),\n        trbl = asTRBL(shape);\n\n    var referencePoint = {\n      x: mid.x,\n      y: mid.y\n    };\n\n    if (direction.indexOf('n') !== -1) {\n      referencePoint.y = trbl.top;\n    } else if (direction.indexOf('s') !== -1) {\n      referencePoint.y = trbl.bottom;\n    }\n\n    if (direction.indexOf('e') !== -1) {\n      referencePoint.x = trbl.right;\n    } else if (direction.indexOf('w') !== -1) {\n      referencePoint.x = trbl.left;\n    }\n\n    return referencePoint;\n  }\n\n  function getCursor(direction) {\n    var prefix = 'resize-';\n\n    if (direction === 'n' || direction === 's') {\n      return prefix + 'ns';\n    } else if (direction === 'e' || direction === 'w') {\n      return prefix + 'ew';\n    } else if (direction === 'nw' || direction === 'se') {\n      return prefix + 'nwse';\n    } else {\n      return prefix + 'nesw';\n    }\n  }\n\n  var MARKER_RESIZING$1 = 'djs-resizing',\n      MARKER_RESIZE_NOT_OK = 'resize-not-ok';\n\n  var LOW_PRIORITY$e = 500;\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../preview-support/PreviewSupport').default} PreviewSupport\n   */\n\n  /**\n   * Provides previews for resizing shapes when resizing.\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {PreviewSupport} previewSupport\n   */\n  function ResizePreview(eventBus, canvas, previewSupport) {\n\n    /**\n     * Update resizer frame.\n     *\n     * @param {Object} context\n     */\n    function updateFrame(context) {\n\n      var shape = context.shape,\n          bounds = context.newBounds,\n          frame = context.frame;\n\n      if (!frame) {\n        frame = context.frame = previewSupport.addFrame(shape, canvas.getActiveLayer());\n\n        canvas.addMarker(shape, MARKER_RESIZING$1);\n      }\n\n      if (bounds.width > 5) {\n        attr(frame, { x: bounds.x, width: bounds.width });\n      }\n\n      if (bounds.height > 5) {\n        attr(frame, { y: bounds.y, height: bounds.height });\n      }\n\n      if (context.canExecute) {\n        classes(frame).remove(MARKER_RESIZE_NOT_OK);\n      } else {\n        classes(frame).add(MARKER_RESIZE_NOT_OK);\n      }\n    }\n\n    /**\n     * Remove resizer frame.\n     *\n     * @param {Object} context\n     */\n    function removeFrame(context) {\n      var shape = context.shape,\n          frame = context.frame;\n\n      if (frame) {\n        remove$1(context.frame);\n      }\n\n      canvas.removeMarker(shape, MARKER_RESIZING$1);\n    }\n\n    // add and update previews\n    eventBus.on('resize.move', LOW_PRIORITY$e, function(event) {\n      updateFrame(event.context);\n    });\n\n    // remove previews\n    eventBus.on('resize.cleanup', function(event) {\n      removeFrame(event.context);\n    });\n\n  }\n\n  ResizePreview.$inject = [\n    'eventBus',\n    'canvas',\n    'previewSupport'\n  ];\n\n  /**\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../resize/Resize').default} Resize\n   * @typedef {import('../selection/Selection').default} Selection\n   */\n\n  var HANDLE_OFFSET = -6,\n      HANDLE_SIZE = 8,\n      HANDLE_HIT_SIZE = 20;\n\n  var CLS_RESIZER = 'djs-resizer';\n\n  var directions = [ 'n', 'w', 's', 'e', 'nw', 'ne', 'se', 'sw' ];\n\n\n  /**\n   * This component is responsible for adding resize handles.\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {Selection} selection\n   * @param {Resize} resize\n   */\n  function ResizeHandles(eventBus, canvas, selection, resize) {\n\n    this._resize = resize;\n    this._canvas = canvas;\n\n    var self = this;\n\n    eventBus.on('selection.changed', function(e) {\n      var newSelection = e.newSelection;\n\n      // remove old selection markers\n      self.removeResizers();\n\n      // add new selection markers ONLY if single selection\n      if (newSelection.length === 1) {\n        forEach$1(newSelection, bind$2(self.addResizer, self));\n      }\n    });\n\n    eventBus.on('shape.changed', function(e) {\n      var shape = e.element;\n\n      if (selection.isSelected(shape)) {\n        self.removeResizers();\n\n        self.addResizer(shape);\n      }\n    });\n  }\n\n\n  ResizeHandles.prototype.makeDraggable = function(element, gfx, direction) {\n    var resize = this._resize;\n\n    function startResize(event) {\n\n      // only trigger on left mouse button\n      if (isPrimaryButton(event)) {\n        resize.activate(event, element, direction);\n      }\n    }\n\n    event.bind(gfx, 'mousedown', startResize);\n    event.bind(gfx, 'touchstart', startResize);\n  };\n\n\n  ResizeHandles.prototype._createResizer = function(element, x, y, direction) {\n    var resizersParent = this._getResizersParent();\n\n    var offset = getHandleOffset(direction);\n\n    var group = create$1('g');\n\n    classes(group).add(CLS_RESIZER);\n    classes(group).add(CLS_RESIZER + '-' + element.id);\n    classes(group).add(CLS_RESIZER + '-' + direction);\n\n    append(resizersParent, group);\n\n    var visual = create$1('rect');\n\n    attr(visual, {\n      x: -HANDLE_SIZE / 2 + offset.x,\n      y: -HANDLE_SIZE / 2 + offset.y,\n      width: HANDLE_SIZE,\n      height: HANDLE_SIZE\n    });\n\n    classes(visual).add(CLS_RESIZER + '-visual');\n\n    append(group, visual);\n\n    var hit = create$1('rect');\n\n    attr(hit, {\n      x: -HANDLE_HIT_SIZE / 2 + offset.x,\n      y: -HANDLE_HIT_SIZE / 2 + offset.y,\n      width: HANDLE_HIT_SIZE,\n      height: HANDLE_HIT_SIZE\n    });\n\n    classes(hit).add(CLS_RESIZER + '-hit');\n\n    append(group, hit);\n\n    transform(group, x, y);\n\n    return group;\n  };\n\n  ResizeHandles.prototype.createResizer = function(element, direction) {\n    var point = getReferencePoint$1(element, direction);\n\n    var resizer = this._createResizer(element, point.x, point.y, direction);\n\n    this.makeDraggable(element, resizer, direction);\n  };\n\n  // resize handles implementation ///////////////////////////////\n\n  /**\n   * Add resizers for a given element.\n   *\n   * @param {Element} element\n   */\n  ResizeHandles.prototype.addResizer = function(element) {\n    var self = this;\n\n    if (isConnection(element) || !this._resize.canResize({ shape: element })) {\n      return;\n    }\n\n    forEach$1(directions, function(direction) {\n      self.createResizer(element, direction);\n    });\n  };\n\n  /**\n   * Remove all resizers\n   */\n  ResizeHandles.prototype.removeResizers = function() {\n    var resizersParent = this._getResizersParent();\n\n    clear(resizersParent);\n  };\n\n  ResizeHandles.prototype._getResizersParent = function() {\n    return this._canvas.getLayer('resizers');\n  };\n\n  ResizeHandles.$inject = [\n    'eventBus',\n    'canvas',\n    'selection',\n    'resize'\n  ];\n\n  // helpers //////////\n\n  function getHandleOffset(direction) {\n    var offset = {\n      x: 0,\n      y: 0\n    };\n\n    if (direction.indexOf('e') !== -1) {\n      offset.x = -HANDLE_OFFSET;\n    } else if (direction.indexOf('w') !== -1) {\n      offset.x = HANDLE_OFFSET;\n    }\n\n    if (direction.indexOf('s') !== -1) {\n      offset.y = -HANDLE_OFFSET;\n    } else if (direction.indexOf('n') !== -1) {\n      offset.y = HANDLE_OFFSET;\n    }\n\n    return offset;\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var ResizeModule = {\n    __depends__: [\n      RulesModule$1,\n      DraggingModule,\n      PreviewSupportModule\n    ],\n    __init__: [\n      'resize',\n      'resizePreview',\n      'resizeHandles'\n    ],\n    resize: [ 'type', Resize ],\n    resizePreview: [ 'type', ResizePreview ],\n    resizeHandles: [ 'type', ResizeHandles ]\n  };\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../modeling/BpmnFactory').default} BpmnFactory\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js-direct-editing/lib/DirectEditing').default} DirectEditing\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   * @typedef {import('diagram-js/lib/features/resize/ResizeHandles').default} ResizeHandles\n   * @typedef {import('../../draw/TextRenderer').default} TextRenderer\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef { {\n   *   bounds: {\n   *     x: number;\n   *     y: number;\n   *     width: number;\n   *     height: number;\n   *     minWidth?: number;\n   *     minHeight?: number;\n   *   };\n   *   style: Object;\n   * } } DirectEditingContext\n   */\n\n  var HIGH_PRIORITY$c = 2000;\n\n  /**\n   * @param {EventBus} eventBus\n   * @param {BpmnFactory} bpmnFactory\n   * @param {Canvas} canvas\n   * @param {DirectEditing} directEditing\n   * @param {Modeling} modeling\n   * @param {ResizeHandles} resizeHandles\n   * @param {TextRenderer} textRenderer\n   */\n  function LabelEditingProvider(\n      eventBus, bpmnFactory, canvas, directEditing,\n      modeling, resizeHandles, textRenderer) {\n\n    this._bpmnFactory = bpmnFactory;\n    this._canvas = canvas;\n    this._modeling = modeling;\n    this._textRenderer = textRenderer;\n\n    directEditing.registerProvider(this);\n\n    // listen to dblclick on non-root elements\n    eventBus.on('element.dblclick', function(event) {\n      activateDirectEdit(event.element, true);\n    });\n\n    // complete on followup canvas operation\n    eventBus.on([\n      'autoPlace.start',\n      'canvas.viewbox.changing',\n      'drag.init',\n      'element.mousedown',\n      'popupMenu.open',\n      'root.set',\n      'selection.changed'\n    ], function() {\n      if (directEditing.isActive()) {\n        directEditing.complete();\n      }\n    });\n\n    eventBus.on([\n      'shape.remove',\n      'connection.remove'\n    ], HIGH_PRIORITY$c, function(event) {\n\n      if (directEditing.isActive(event.element)) {\n        directEditing.cancel();\n      }\n    });\n\n    // cancel on command stack changes\n    eventBus.on([ 'commandStack.changed' ], function(e) {\n      if (directEditing.isActive()) {\n        directEditing.cancel();\n      }\n    });\n\n\n    eventBus.on('directEditing.activate', function(event) {\n      resizeHandles.removeResizers();\n    });\n\n    eventBus.on('create.end', 500, function(event) {\n\n      var context = event.context,\n          element = context.shape,\n          canExecute = event.context.canExecute,\n          isTouch = event.isTouch;\n\n      // TODO(nikku): we need to find a way to support the\n      // direct editing on mobile devices; right now this will\n      // break for desworkflowediting on mobile devices\n      // as it breaks the user interaction workflow\n\n      // TODO(nikku): we should temporarily focus the edited element\n      // here and release the focused viewport after the direct edit\n      // operation is finished\n      if (isTouch) {\n        return;\n      }\n\n      if (!canExecute) {\n        return;\n      }\n\n      if (context.hints && context.hints.createElementsBehavior === false) {\n        return;\n      }\n\n      activateDirectEdit(element);\n    });\n\n    eventBus.on('autoPlace.end', 500, function(event) {\n      activateDirectEdit(event.shape);\n    });\n\n\n    function activateDirectEdit(element, force) {\n      if (force ||\n          isAny(element, [ 'bpmn:Task', 'bpmn:TextAnnotation', 'bpmn:Participant' ]) ||\n          isCollapsedSubProcess(element)) {\n\n        directEditing.activate(element);\n      }\n    }\n\n  }\n\n  LabelEditingProvider.$inject = [\n    'eventBus',\n    'bpmnFactory',\n    'canvas',\n    'directEditing',\n    'modeling',\n    'resizeHandles',\n    'textRenderer'\n  ];\n\n\n  /**\n   * Activate direct editing for activities and text annotations.\n   *\n   * @param {Element} element\n   *\n   * @return { {\n   *   text: string;\n   *   options?: {\n   *     autoResize?: boolean;\n   *     centerVertically?: boolean;\n   *     resizable?: boolean;\n   *   }\n   * } & DirectEditingContext }\n   */\n  LabelEditingProvider.prototype.activate = function(element) {\n\n    // text\n    var text = getLabel(element);\n\n    if (text === undefined) {\n      return;\n    }\n\n    var context = {\n      text: text\n    };\n\n    // bounds\n    var bounds = this.getEditingBBox(element);\n\n    assign$1(context, bounds);\n\n    var options = {};\n\n    // tasks\n    if (\n      isAny(element, [\n        'bpmn:Task',\n        'bpmn:Participant',\n        'bpmn:Lane',\n        'bpmn:CallActivity'\n      ]) ||\n      isCollapsedSubProcess(element)\n    ) {\n      assign$1(options, {\n        centerVertically: true\n      });\n    }\n\n    // external labels\n    if (isLabelExternal(element)) {\n      assign$1(options, {\n        autoResize: true\n      });\n    }\n\n    // text annotations\n    if (is$1(element, 'bpmn:TextAnnotation')) {\n      assign$1(options, {\n        resizable: true,\n        autoResize: true\n      });\n    }\n\n    assign$1(context, {\n      options: options\n    });\n\n    return context;\n  };\n\n\n  /**\n   * Get the editing bounding box based on the element's size and position.\n   *\n   * @param {Element} element\n   *\n   * @return {DirectEditingContext}\n   */\n  LabelEditingProvider.prototype.getEditingBBox = function(element) {\n    var canvas = this._canvas;\n\n    var target = element.label || element;\n\n    var bbox = canvas.getAbsoluteBBox(target);\n\n    var mid = {\n      x: bbox.x + bbox.width / 2,\n      y: bbox.y + bbox.height / 2\n    };\n\n    // default position\n    var bounds = { x: bbox.x, y: bbox.y };\n\n    var zoom = canvas.zoom();\n\n    var defaultStyle = this._textRenderer.getDefaultStyle(),\n        externalStyle = this._textRenderer.getExternalStyle();\n\n    // take zoom into account\n    var externalFontSize = externalStyle.fontSize * zoom,\n        externalLineHeight = externalStyle.lineHeight,\n        defaultFontSize = defaultStyle.fontSize * zoom,\n        defaultLineHeight = defaultStyle.lineHeight;\n\n    var style = {\n      fontFamily: this._textRenderer.getDefaultStyle().fontFamily,\n      fontWeight: this._textRenderer.getDefaultStyle().fontWeight\n    };\n\n    // adjust for expanded pools AND lanes\n    if (is$1(element, 'bpmn:Lane') || isExpandedPool(element)) {\n\n      assign$1(bounds, {\n        width: bbox.height,\n        height: 30 * zoom,\n        x: bbox.x - bbox.height / 2 + (15 * zoom),\n        y: mid.y - (30 * zoom) / 2\n      });\n\n      assign$1(style, {\n        fontSize: defaultFontSize + 'px',\n        lineHeight: defaultLineHeight,\n        paddingTop: (7 * zoom) + 'px',\n        paddingBottom: (7 * zoom) + 'px',\n        paddingLeft: (5 * zoom) + 'px',\n        paddingRight: (5 * zoom) + 'px',\n        transform: 'rotate(-90deg)'\n      });\n    }\n\n\n    // internal labels for tasks and collapsed call activities,\n    // sub processes and participants\n    if (isAny(element, [ 'bpmn:Task', 'bpmn:CallActivity' ]) ||\n        isCollapsedPool(element) ||\n        isCollapsedSubProcess(element)) {\n\n      assign$1(bounds, {\n        width: bbox.width,\n        height: bbox.height\n      });\n\n      assign$1(style, {\n        fontSize: defaultFontSize + 'px',\n        lineHeight: defaultLineHeight,\n        paddingTop: (7 * zoom) + 'px',\n        paddingBottom: (7 * zoom) + 'px',\n        paddingLeft: (5 * zoom) + 'px',\n        paddingRight: (5 * zoom) + 'px'\n      });\n    }\n\n\n    // internal labels for expanded sub processes\n    if (isExpandedSubProcess$1(element)) {\n      assign$1(bounds, {\n        width: bbox.width,\n        x: bbox.x\n      });\n\n      assign$1(style, {\n        fontSize: defaultFontSize + 'px',\n        lineHeight: defaultLineHeight,\n        paddingTop: (7 * zoom) + 'px',\n        paddingBottom: (7 * zoom) + 'px',\n        paddingLeft: (5 * zoom) + 'px',\n        paddingRight: (5 * zoom) + 'px'\n      });\n    }\n\n    var width = 90 * zoom,\n        paddingTop = 7 * zoom,\n        paddingBottom = 4 * zoom;\n\n    // external labels for events, data elements, gateways, groups and connections\n    if (target.labelTarget) {\n      assign$1(bounds, {\n        width: width,\n        height: bbox.height + paddingTop + paddingBottom,\n        x: mid.x - width / 2,\n        y: bbox.y - paddingTop\n      });\n\n      assign$1(style, {\n        fontSize: externalFontSize + 'px',\n        lineHeight: externalLineHeight,\n        paddingTop: paddingTop + 'px',\n        paddingBottom: paddingBottom + 'px'\n      });\n    }\n\n    // external label not yet created\n    if (isLabelExternal(target)\n        && !hasExternalLabel(target)\n        && !isLabel(target)) {\n\n      var externalLabelMid = getExternalLabelMid(element);\n\n      var absoluteBBox = canvas.getAbsoluteBBox({\n        x: externalLabelMid.x,\n        y: externalLabelMid.y,\n        width: 0,\n        height: 0\n      });\n\n      var height = externalFontSize + paddingTop + paddingBottom;\n\n      assign$1(bounds, {\n        width: width,\n        height: height,\n        x: absoluteBBox.x - width / 2,\n        y: absoluteBBox.y - height / 2\n      });\n\n      assign$1(style, {\n        fontSize: externalFontSize + 'px',\n        lineHeight: externalLineHeight,\n        paddingTop: paddingTop + 'px',\n        paddingBottom: paddingBottom + 'px'\n      });\n    }\n\n    // text annotations\n    if (is$1(element, 'bpmn:TextAnnotation')) {\n      assign$1(bounds, {\n        width: bbox.width,\n        height: bbox.height,\n        minWidth: 30 * zoom,\n        minHeight: 10 * zoom\n      });\n\n      assign$1(style, {\n        textAlign: 'left',\n        paddingTop: (5 * zoom) + 'px',\n        paddingBottom: (7 * zoom) + 'px',\n        paddingLeft: (7 * zoom) + 'px',\n        paddingRight: (5 * zoom) + 'px',\n        fontSize: defaultFontSize + 'px',\n        lineHeight: defaultLineHeight\n      });\n    }\n\n    return { bounds: bounds, style: style };\n  };\n\n\n  LabelEditingProvider.prototype.update = function(\n      element, newLabel,\n      activeContextText, bounds) {\n\n    var newBounds,\n        bbox;\n\n    if (is$1(element, 'bpmn:TextAnnotation')) {\n\n      bbox = this._canvas.getAbsoluteBBox(element);\n\n      newBounds = {\n        x: element.x,\n        y: element.y,\n        width: element.width / bbox.width * bounds.width,\n        height: element.height / bbox.height * bounds.height\n      };\n    }\n\n    if (isEmptyText$1(newLabel)) {\n      newLabel = null;\n    }\n\n    this._modeling.updateLabel(element, newLabel, newBounds);\n  };\n\n\n\n  // helpers //////////\n\n  function isCollapsedSubProcess(element) {\n    return is$1(element, 'bpmn:SubProcess') && !isExpanded(element);\n  }\n\n  function isExpandedSubProcess$1(element) {\n    return is$1(element, 'bpmn:SubProcess') && isExpanded(element);\n  }\n\n  function isCollapsedPool(element) {\n    return is$1(element, 'bpmn:Participant') && !isExpanded(element);\n  }\n\n  function isExpandedPool(element) {\n    return is$1(element, 'bpmn:Participant') && isExpanded(element);\n  }\n\n  function isEmptyText$1(label) {\n    return !label || !label.trim();\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../../draw/PathMap').default} PathMap\n   */\n\n  var MARKER_HIDDEN = 'djs-element-hidden',\n      MARKER_LABEL_HIDDEN = 'djs-label-hidden';\n\n  /**\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {PathMap} pathMap\n   */\n  function LabelEditingPreview(eventBus, canvas, pathMap) {\n\n    var self = this;\n\n    var defaultLayer = canvas.getDefaultLayer();\n\n    var element, absoluteElementBBox, gfx;\n\n    eventBus.on('directEditing.activate', function(context) {\n      var activeProvider = context.active;\n\n      element = activeProvider.element.label || activeProvider.element;\n\n      // text annotation\n      if (is$1(element, 'bpmn:TextAnnotation')) {\n        absoluteElementBBox = canvas.getAbsoluteBBox(element);\n\n        gfx = create$1('g');\n\n        var textPathData = pathMap.getScaledPath('TEXT_ANNOTATION', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.0,\n            my: 0.0\n          }\n        });\n\n        var path = self.path = create$1('path');\n\n        attr(path, {\n          d: textPathData,\n          strokeWidth: 2,\n          stroke: getStrokeColor(element)\n        });\n\n        append(gfx, path);\n\n        append(defaultLayer, gfx);\n\n        translate$2(gfx, element.x, element.y);\n      }\n\n      if (is$1(element, 'bpmn:TextAnnotation') ||\n          element.labelTarget) {\n        canvas.addMarker(element, MARKER_HIDDEN);\n      } else if (is$1(element, 'bpmn:Task') ||\n                 is$1(element, 'bpmn:CallActivity') ||\n                 is$1(element, 'bpmn:SubProcess') ||\n                 is$1(element, 'bpmn:Participant')) {\n        canvas.addMarker(element, MARKER_LABEL_HIDDEN);\n      }\n    });\n\n    eventBus.on('directEditing.resize', function(context) {\n\n      // text annotation\n      if (is$1(element, 'bpmn:TextAnnotation')) {\n        var height = context.height,\n            dy = context.dy;\n\n        var newElementHeight = Math.max(element.height / absoluteElementBBox.height * (height + dy), 0);\n\n        var textPathData = pathMap.getScaledPath('TEXT_ANNOTATION', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: newElementHeight,\n          position: {\n            mx: 0.0,\n            my: 0.0\n          }\n        });\n\n        attr(self.path, {\n          d: textPathData\n        });\n      }\n    });\n\n    eventBus.on([ 'directEditing.complete', 'directEditing.cancel' ], function(context) {\n      var activeProvider = context.active;\n\n      if (activeProvider) {\n        canvas.removeMarker(activeProvider.element.label || activeProvider.element, MARKER_HIDDEN);\n        canvas.removeMarker(element, MARKER_LABEL_HIDDEN);\n      }\n\n      element = undefined;\n      absoluteElementBBox = undefined;\n\n      if (gfx) {\n        remove$1(gfx);\n\n        gfx = undefined;\n      }\n    });\n  }\n\n  LabelEditingPreview.$inject = [\n    'eventBus',\n    'canvas',\n    'pathMap'\n  ];\n\n\n  // helpers //////////\n\n  function getStrokeColor(element, defaultColor) {\n    var di = getDi(element);\n\n    return di.get('stroke') || defaultColor || 'black';\n  }\n\n  var LabelEditingModule = {\n    __depends__: [\n      ChangeSupportModule,\n      ResizeModule,\n      DirectEditingModule\n    ],\n    __init__: [\n      'labelEditingProvider',\n      'labelEditingPreview'\n    ],\n    labelEditingProvider: [ 'type', LabelEditingProvider ],\n    labelEditingPreview: [ 'type', LabelEditingPreview ]\n  };\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../Modeling').default} Modeling\n   *\n   * @typedef {import('../../../model/Types').Element} Element\n   * @typedef {import('../../../model/Types').Shape} Shape\n   *\n   * @typedef {import('diagram-js/lib/util/Types').DirectionTRBL} DirectionTRBL\n   */\n\n  var ALIGNMENTS = [\n    'top',\n    'bottom',\n    'left',\n    'right'\n  ];\n\n  var ELEMENT_LABEL_DISTANCE = 10;\n\n  /**\n   * A component that makes sure that external labels are added\n   * together with respective elements and properly updated (DI wise)\n   * during move.\n   *\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   */\n  function AdaptiveLabelPositioningBehavior(eventBus, modeling) {\n\n    CommandInterceptor.call(this, eventBus);\n\n    this.postExecuted([\n      'connection.create',\n      'connection.layout',\n      'connection.updateWaypoints'\n    ], function(event) {\n      var context = event.context,\n          connection = context.connection,\n          source = connection.source,\n          target = connection.target,\n          hints = context.hints || {};\n\n      if (hints.createElementsBehavior !== false) {\n        checkLabelAdjustment(source);\n        checkLabelAdjustment(target);\n      }\n    });\n\n\n    this.postExecuted([\n      'label.create'\n    ], function(event) {\n      var context = event.context,\n          shape = context.shape,\n          hints = context.hints || {};\n\n      if (hints.createElementsBehavior !== false) {\n        checkLabelAdjustment(shape.labelTarget);\n      }\n    });\n\n\n    this.postExecuted([\n      'elements.create'\n    ], function(event) {\n      var context = event.context,\n          elements = context.elements,\n          hints = context.hints || {};\n\n      if (hints.createElementsBehavior !== false) {\n        elements.forEach(function(element) {\n          checkLabelAdjustment(element);\n        });\n      }\n    });\n\n    function checkLabelAdjustment(element) {\n\n      // skip non-existing labels\n      if (!hasExternalLabel(element)) {\n        return;\n      }\n\n      var optimalPosition = getOptimalPosition(element);\n\n      // no optimal position found\n      if (!optimalPosition) {\n        return;\n      }\n\n      adjustLabelPosition(element, optimalPosition);\n    }\n\n    function adjustLabelPosition(element, orientation) {\n\n      var elementMid = getMid(element),\n          label = element.label,\n          labelMid = getMid(label);\n\n      // ignore labels that are being created\n      if (!label.parent) {\n        return;\n      }\n\n      var elementTrbl = asTRBL(element);\n\n      var newLabelMid;\n\n      switch (orientation) {\n      case 'top':\n        newLabelMid = {\n          x: elementMid.x,\n          y: elementTrbl.top - ELEMENT_LABEL_DISTANCE - label.height / 2\n        };\n\n        break;\n\n      case 'left':\n\n        newLabelMid = {\n          x: elementTrbl.left - ELEMENT_LABEL_DISTANCE - label.width / 2,\n          y: elementMid.y\n        };\n\n        break;\n\n      case 'bottom':\n\n        newLabelMid = {\n          x: elementMid.x,\n          y: elementTrbl.bottom + ELEMENT_LABEL_DISTANCE + label.height / 2\n        };\n\n        break;\n\n      case 'right':\n\n        newLabelMid = {\n          x: elementTrbl.right + ELEMENT_LABEL_DISTANCE + label.width / 2,\n          y: elementMid.y\n        };\n\n        break;\n      }\n\n      var delta$1 = delta(newLabelMid, labelMid);\n\n      modeling.moveShape(label, delta$1);\n    }\n\n  }\n\n  e$3(AdaptiveLabelPositioningBehavior, CommandInterceptor);\n\n  AdaptiveLabelPositioningBehavior.$inject = [\n    'eventBus',\n    'modeling'\n  ];\n\n\n  // helpers //////////////////////\n\n  /**\n   * Return alignments which are taken by a boundary's host element\n   *\n   * @param {Shape} element\n   *\n   * @return {DirectionTRBL[]}\n   */\n  function getTakenHostAlignments(element) {\n\n    var hostElement = element.host,\n        elementMid = getMid(element),\n        hostOrientation = getOrientation(elementMid, hostElement);\n\n    var freeAlignments;\n\n    // check whether there is a multi-orientation, e.g. 'top-left'\n    if (hostOrientation.indexOf('-') >= 0) {\n      freeAlignments = hostOrientation.split('-');\n    } else {\n      freeAlignments = [ hostOrientation ];\n    }\n\n    var takenAlignments = ALIGNMENTS.filter(function(alignment) {\n\n      return freeAlignments.indexOf(alignment) === -1;\n    });\n\n    return takenAlignments;\n\n  }\n\n  /**\n   * Return alignments which are taken by related connections\n   *\n   * @param {Element} element\n   *\n   * @return {DirectionTRBL[]}\n   */\n  function getTakenConnectionAlignments(element) {\n\n    var elementMid = getMid(element);\n\n    var takenAlignments = [].concat(\n      element.incoming.map(function(c) {\n        return c.waypoints[c.waypoints.length - 2 ];\n      }),\n      element.outgoing.map(function(c) {\n        return c.waypoints[1];\n      })\n    ).map(function(point) {\n      return getApproximateOrientation(elementMid, point);\n    });\n\n    return takenAlignments;\n  }\n\n  /**\n   * Return the optimal label position around an element\n   * or `undefined`, if none was found.\n   *\n   * @param  {Element} element\n   *\n   * @return {DirectionTRBL|undefined}\n   */\n  function getOptimalPosition(element) {\n\n    var labelMid = getMid(element.label);\n\n    var elementMid = getMid(element);\n\n    var labelOrientation = getApproximateOrientation(elementMid, labelMid);\n\n    if (!isAligned(labelOrientation)) {\n      return;\n    }\n\n    var takenAlignments = getTakenConnectionAlignments(element);\n\n    if (element.host) {\n      var takenHostAlignments = getTakenHostAlignments(element);\n\n      takenAlignments = takenAlignments.concat(takenHostAlignments);\n    }\n\n    var freeAlignments = ALIGNMENTS.filter(function(alignment) {\n\n      return takenAlignments.indexOf(alignment) === -1;\n    });\n\n    // NOTHING TO DO; label already aligned a.O.K.\n    if (freeAlignments.indexOf(labelOrientation) !== -1) {\n      return;\n    }\n\n    return freeAlignments[0];\n  }\n\n  function getApproximateOrientation(p0, p1) {\n    return getOrientation(p1, p0, 5);\n  }\n\n  function isAligned(orientation) {\n    return ALIGNMENTS.indexOf(orientation) !== -1;\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   */\n\n  function AppendBehavior(eventBus) {\n\n    CommandInterceptor.call(this, eventBus);\n\n    // assign correct shape position unless already set\n\n    this.preExecute('shape.append', function(context) {\n\n      var source = context.source,\n          shape = context.shape;\n\n      if (!context.position) {\n\n        if (is$1(shape, 'bpmn:TextAnnotation')) {\n          context.position = {\n            x: source.x + source.width / 2 + 75,\n            y: source.y - 50 - shape.height / 2\n          };\n        } else {\n          context.position = {\n            x: source.x + source.width + 80 + shape.width / 2,\n            y: source.y + source.height / 2\n          };\n        }\n      }\n    }, true);\n  }\n\n  e$3(AppendBehavior, CommandInterceptor);\n\n  AppendBehavior.$inject = [\n    'eventBus'\n  ];\n\n  /**\r\n   * @typedef {import('didi').Injector} Injector\r\n   * @typedef {import('../Modeling').default} Modeling\r\n   */\r\n\r\n  /**\r\n   * @param {Injector} injector\r\n   * @param {Modeling} modeling\r\n   */\r\n  function AssociationBehavior(injector, modeling) {\r\n    injector.invoke(CommandInterceptor, this);\r\n\r\n    this.postExecute('shape.move', function(context) {\r\n      var newParent = context.newParent,\r\n          shape = context.shape;\r\n\r\n      var associations = filter(shape.incoming.concat(shape.outgoing), function(connection) {\r\n        return is$1(connection, 'bpmn:Association');\r\n      });\r\n\r\n      forEach$1(associations, function(association) {\r\n        modeling.moveConnection(association, { x: 0, y: 0 }, newParent);\r\n      });\r\n    }, true);\r\n  }\r\n\r\n  e$3(AssociationBehavior, CommandInterceptor);\r\n\r\n  AssociationBehavior.$inject = [\r\n    'injector',\r\n    'modeling'\r\n  ];\n\n  /**\n   * @typedef {import('../../replace/BpmnReplace').default} BpmnReplace\n   * @typedef {import('didi').Injector} Injector\n   */\n\n  var LOW_PRIORITY$d = 500;\n\n\n  /**\n   * Replace intermediate event with boundary event when creating or moving results in attached event.\n   *\n   * @param {BpmnReplace} bpmnReplace\n   * @param {Injector} injector\n   */\n  function AttachEventBehavior(bpmnReplace, injector) {\n    injector.invoke(CommandInterceptor, this);\n\n    this._bpmnReplace = bpmnReplace;\n\n    var self = this;\n\n    this.postExecuted('elements.create', LOW_PRIORITY$d, function(context) {\n      var elements = context.elements;\n\n      elements = elements.filter(function(shape) {\n        var host = shape.host;\n\n        return shouldReplace$1(shape, host);\n      });\n\n      if (elements.length !== 1) {\n        return;\n      }\n\n      elements.map(function(element) {\n        return elements.indexOf(element);\n      }).forEach(function(index) {\n        var host = elements[ index ];\n\n        context.elements[ index ] = self._replaceShape(elements[ index ], host);\n      });\n    }, true);\n\n\n    this.preExecute('elements.move', LOW_PRIORITY$d, function(context) {\n      var shapes = context.shapes,\n          host = context.newHost;\n\n      if (shapes.length !== 1) {\n        return;\n      }\n\n      var shape = shapes[0];\n\n      if (shouldReplace$1(shape, host)) {\n        context.shapes = [ self._replaceShape(shape, host) ];\n      }\n    }, true);\n  }\n\n  AttachEventBehavior.$inject = [\n    'bpmnReplace',\n    'injector'\n  ];\n\n  e$3(AttachEventBehavior, CommandInterceptor);\n\n  AttachEventBehavior.prototype._replaceShape = function(shape, host) {\n    var eventDefinition = getEventDefinition$1(shape);\n\n    var boundaryEvent = {\n      type: 'bpmn:BoundaryEvent',\n      host: host\n    };\n\n    if (eventDefinition) {\n      boundaryEvent.eventDefinitionType = eventDefinition.$type;\n    }\n\n    return this._bpmnReplace.replaceElement(shape, boundaryEvent, { layoutConnection: false });\n  };\n\n\n  // helpers //////////\n\n  function getEventDefinition$1(element) {\n    var businessObject = getBusinessObject(element),\n        eventDefinitions = businessObject.eventDefinitions;\n\n    return eventDefinitions && eventDefinitions[0];\n  }\n\n  function shouldReplace$1(shape, host) {\n    return !isLabel(shape) &&\n      isAny(shape, [ 'bpmn:IntermediateThrowEvent', 'bpmn:IntermediateCatchEvent' ]) && !!host;\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * BPMN specific boundary event behavior.\n   *\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   */\n  function BoundaryEventBehavior(eventBus, modeling) {\n\n    CommandInterceptor.call(this, eventBus);\n\n    function getBoundaryEvents(element) {\n      return filter(element.attachers, function(attacher) {\n        return is$1(attacher, 'bpmn:BoundaryEvent');\n      });\n    }\n\n    // remove after connecting to event-based gateway\n    this.postExecute('connection.create', function(event) {\n      var source = event.context.source,\n          target = event.context.target,\n          boundaryEvents = getBoundaryEvents(target);\n\n      if (\n        is$1(source, 'bpmn:EventBasedGateway') &&\n        is$1(target, 'bpmn:ReceiveTask') &&\n        boundaryEvents.length > 0\n      ) {\n        modeling.removeElements(boundaryEvents);\n      }\n\n    });\n\n    // remove after replacing connected gateway with event-based gateway\n    this.postExecute('connection.reconnect', function(event) {\n      var oldSource = event.context.oldSource,\n          newSource = event.context.newSource;\n\n      if (is$1(oldSource, 'bpmn:Gateway') &&\n          is$1(newSource, 'bpmn:EventBasedGateway')) {\n        forEach$1(newSource.outgoing, function(connection) {\n          var target = connection.target,\n              attachedboundaryEvents = getBoundaryEvents(target);\n\n          if (is$1(target, 'bpmn:ReceiveTask') &&\n              attachedboundaryEvents.length > 0) {\n            modeling.removeElements(attachedboundaryEvents);\n          }\n        });\n      }\n    });\n\n  }\n\n  BoundaryEventBehavior.$inject = [\n    'eventBus',\n    'modeling'\n  ];\n\n  e$3(BoundaryEventBehavior, CommandInterceptor);\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   */\n\n  /**\n   * @param {Injector} injector\n   */\n  function CreateBehavior(injector) {\n    injector.invoke(CommandInterceptor, this);\n\n    this.preExecute('shape.create', 1500, function(event) {\n      var context = event.context,\n          parent = context.parent,\n          shape = context.shape;\n\n      if (is$1(parent, 'bpmn:Lane') && !is$1(shape, 'bpmn:Lane')) {\n        context.parent = getParent(parent, 'bpmn:Participant');\n      }\n    });\n\n  }\n\n\n  CreateBehavior.$inject = [ 'injector' ];\n\n  e$3(CreateBehavior, CommandInterceptor);\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../BpmnFactory').default} BpmnFactory\n   */\n\n  /**\n   * BPMN specific create data object behavior.\n   *\n   * @param {EventBus} eventBus\n   * @param {BpmnFactory} bpmnFactory\n   */\n  function CreateDataObjectBehavior(eventBus, bpmnFactory) {\n\n    CommandInterceptor.call(this, eventBus);\n\n    this.preExecute('shape.create', function(event) {\n\n      var context = event.context,\n          shape = context.shape;\n\n      if (is$1(shape, 'bpmn:DataObjectReference') && shape.type !== 'label') {\n\n        // create a DataObject every time a DataObjectReference is created\n        var dataObject = bpmnFactory.create('bpmn:DataObject');\n\n        // set the reference to the DataObject\n        shape.businessObject.dataObjectRef = dataObject;\n      }\n    });\n\n  }\n\n  CreateDataObjectBehavior.$inject = [\n    'eventBus',\n    'bpmnFactory'\n  ];\n\n  e$3(CreateDataObjectBehavior, CommandInterceptor);\n\n  /**\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  var HORIZONTAL_PARTICIPANT_PADDING = 20,\n      VERTICAL_PARTICIPANT_PADDING = 20;\n\n  var PARTICIPANT_BORDER_WIDTH = 30;\n\n  var HIGH_PRIORITY$b = 2000;\n\n\n  /**\n   * BPMN-specific behavior for creating participants.\n   *\n   * @param {Canvas} canvas\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   */\n  function CreateParticipantBehavior(canvas, eventBus, modeling) {\n    CommandInterceptor.call(this, eventBus);\n\n    // fit participant\n    eventBus.on([\n      'create.start',\n      'shape.move.start'\n    ], HIGH_PRIORITY$b, function(event) {\n      var context = event.context,\n          shape = context.shape,\n          rootElement = canvas.getRootElement();\n\n      if (!is$1(shape, 'bpmn:Participant') ||\n        !is$1(rootElement, 'bpmn:Process') ||\n        !rootElement.children.length) {\n        return;\n      }\n\n      // ignore connections, groups and labels\n      var children = rootElement.children.filter(function(element) {\n        return !is$1(element, 'bpmn:Group') &&\n          !isLabel(element) &&\n          !isConnection(element);\n      });\n\n      // ensure for available children to calculate bounds\n      if (!children.length) {\n        return;\n      }\n\n      var childrenBBox = getBBox(children);\n\n      var participantBounds = getParticipantBounds(shape, childrenBBox);\n\n      // assign width and height\n      assign$1(shape, participantBounds);\n\n      // assign create constraints\n      context.createConstraints = getParticipantCreateConstraints(shape, childrenBBox);\n    });\n\n    // force hovering process when creating first participant\n    eventBus.on('create.start', HIGH_PRIORITY$b, function(event) {\n      var context = event.context,\n          shape = context.shape,\n          rootElement = canvas.getRootElement(),\n          rootElementGfx = canvas.getGraphics(rootElement);\n\n      function ensureHoveringProcess(event) {\n        event.element = rootElement;\n        event.gfx = rootElementGfx;\n      }\n\n      if (is$1(shape, 'bpmn:Participant') && is$1(rootElement, 'bpmn:Process')) {\n        eventBus.on('element.hover', HIGH_PRIORITY$b, ensureHoveringProcess);\n\n        eventBus.once('create.cleanup', function() {\n          eventBus.off('element.hover', ensureHoveringProcess);\n        });\n      }\n    });\n\n    // turn process into collaboration when creating first participant\n    function getOrCreateCollaboration() {\n      var rootElement = canvas.getRootElement();\n\n      if (is$1(rootElement, 'bpmn:Collaboration')) {\n        return rootElement;\n      }\n\n      return modeling.makeCollaboration();\n    }\n\n    // when creating mutliple elements through `elements.create` parent must be set to collaboration\n    // and passed to `shape.create` as hint\n    this.preExecute('elements.create', HIGH_PRIORITY$b, function(context) {\n      var elements = context.elements,\n          parent = context.parent,\n          participant = findParticipant(elements),\n          hints;\n\n      if (participant && is$1(parent, 'bpmn:Process')) {\n        context.parent = getOrCreateCollaboration();\n\n        hints = context.hints = context.hints || {};\n\n        hints.participant = participant;\n        hints.process = parent;\n        hints.processRef = getBusinessObject(participant).get('processRef');\n      }\n    }, true);\n\n    // when creating single shape through `shape.create` parent must be set to collaboration\n    // unless it was already set through `elements.create`\n    this.preExecute('shape.create', function(context) {\n      var parent = context.parent,\n          shape = context.shape;\n\n      if (is$1(shape, 'bpmn:Participant') && is$1(parent, 'bpmn:Process')) {\n        context.parent = getOrCreateCollaboration();\n\n        context.process = parent;\n        context.processRef = getBusinessObject(shape).get('processRef');\n      }\n    }, true);\n\n    // #execute necessary because #preExecute not called on CommandStack#redo\n    this.execute('shape.create', function(context) {\n      var hints = context.hints || {},\n          process = context.process || hints.process,\n          shape = context.shape,\n          participant = hints.participant;\n\n      // both shape.create and elements.create must be handled\n      if (process && (!participant || shape === participant)) {\n\n        // monkey-patch process ref\n        getBusinessObject(shape).set('processRef', getBusinessObject(process));\n      }\n    }, true);\n\n    this.revert('shape.create', function(context) {\n      var hints = context.hints || {},\n          process = context.process || hints.process,\n          processRef = context.processRef || hints.processRef,\n          shape = context.shape,\n          participant = hints.participant;\n\n      // both shape.create and elements.create must be handled\n      if (process && (!participant || shape === participant)) {\n\n        // monkey-patch process ref\n        getBusinessObject(shape).set('processRef', processRef);\n      }\n    }, true);\n\n    this.postExecute('shape.create', function(context) {\n      var hints = context.hints || {},\n          process = context.process || context.hints.process,\n          shape = context.shape,\n          participant = hints.participant;\n\n      if (process) {\n        var children = process.children.slice();\n\n        // both shape.create and elements.create must be handled\n        if (!participant) {\n          modeling.moveElements(children, { x: 0, y: 0 }, shape);\n        } else if (shape === participant) {\n          modeling.moveElements(children, { x: 0, y: 0 }, participant);\n        }\n      }\n    }, true);\n  }\n\n  CreateParticipantBehavior.$inject = [\n    'canvas',\n    'eventBus',\n    'modeling'\n  ];\n\n  e$3(CreateParticipantBehavior, CommandInterceptor);\n\n  // helpers //////////\n\n  function getParticipantBounds(shape, childrenBBox) {\n    childrenBBox = {\n      width: childrenBBox.width + HORIZONTAL_PARTICIPANT_PADDING * 2 + PARTICIPANT_BORDER_WIDTH,\n      height: childrenBBox.height + VERTICAL_PARTICIPANT_PADDING * 2\n    };\n\n    var width = Math.max(shape.width, childrenBBox.width),\n        height = Math.max(shape.height, childrenBBox.height);\n\n    return {\n      x: -width / 2,\n      y: -height / 2,\n      width: width,\n      height: height\n    };\n  }\n\n  function getParticipantCreateConstraints(shape, childrenBBox) {\n    childrenBBox = asTRBL(childrenBBox);\n\n    return {\n      bottom: childrenBBox.top + shape.height / 2 - VERTICAL_PARTICIPANT_PADDING,\n      left: childrenBBox.right - shape.width / 2 + HORIZONTAL_PARTICIPANT_PADDING,\n      top: childrenBBox.bottom - shape.height / 2 + VERTICAL_PARTICIPANT_PADDING,\n      right: childrenBBox.left + shape.width / 2 - HORIZONTAL_PARTICIPANT_PADDING - PARTICIPANT_BORDER_WIDTH\n    };\n  }\n\n  function findParticipant(elements) {\n    return find(elements, function(element) {\n      return is$1(element, 'bpmn:Participant');\n    });\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../BpmnFactory').default} BpmnFactory\n   */\n\n  var TARGET_REF_PLACEHOLDER_NAME = '__targetRef_placeholder';\n\n\n  /**\n   * This behavior makes sure we always set a fake\n   * DataInputAssociation#targetRef as demanded by the BPMN 2.0\n   * XSD schema.\n   *\n   * The reference is set to a bpmn:Property{ name: '__targetRef_placeholder' }\n   * which is created on the fly and cleaned up afterwards if not needed\n   * anymore.\n   *\n   * @param {EventBus} eventBus\n   * @param {BpmnFactory} bpmnFactory\n   */\n  function DataInputAssociationBehavior(eventBus, bpmnFactory) {\n\n    CommandInterceptor.call(this, eventBus);\n\n\n    this.executed([\n      'connection.create',\n      'connection.delete',\n      'connection.move',\n      'connection.reconnect'\n    ], ifDataInputAssociation(fixTargetRef));\n\n    this.reverted([\n      'connection.create',\n      'connection.delete',\n      'connection.move',\n      'connection.reconnect'\n    ], ifDataInputAssociation(fixTargetRef));\n\n\n    function usesTargetRef(element, targetRef, removedConnection) {\n\n      var inputAssociations = element.get('dataInputAssociations');\n\n      return find(inputAssociations, function(association) {\n        return association !== removedConnection &&\n               association.targetRef === targetRef;\n      });\n    }\n\n    function getTargetRef(element, create) {\n\n      var properties = element.get('properties');\n\n      var targetRefProp = find(properties, function(p) {\n        return p.name === TARGET_REF_PLACEHOLDER_NAME;\n      });\n\n      if (!targetRefProp && create) {\n        targetRefProp = bpmnFactory.create('bpmn:Property', {\n          name: TARGET_REF_PLACEHOLDER_NAME\n        });\n\n        add(properties, targetRefProp);\n      }\n\n      return targetRefProp;\n    }\n\n    function cleanupTargetRef(element, connection) {\n\n      var targetRefProp = getTargetRef(element);\n\n      if (!targetRefProp) {\n        return;\n      }\n\n      if (!usesTargetRef(element, targetRefProp, connection)) {\n        remove(element.get('properties'), targetRefProp);\n      }\n    }\n\n    /**\n     * Make sure targetRef is set to a valid property or\n     * `null` if the connection is detached.\n     *\n     * @param {Event} event\n     */\n    function fixTargetRef(event) {\n\n      var context = event.context,\n          connection = context.connection,\n          connectionBo = connection.businessObject,\n          target = connection.target,\n          targetBo = target && target.businessObject,\n          newTarget = context.newTarget,\n          newTargetBo = newTarget && newTarget.businessObject,\n          oldTarget = context.oldTarget || context.target,\n          oldTargetBo = oldTarget && oldTarget.businessObject;\n\n      var dataAssociation = connection.businessObject,\n          targetRefProp;\n\n      if (oldTargetBo && oldTargetBo !== targetBo) {\n        cleanupTargetRef(oldTargetBo, connectionBo);\n      }\n\n      if (newTargetBo && newTargetBo !== targetBo) {\n        cleanupTargetRef(newTargetBo, connectionBo);\n      }\n\n      if (targetBo) {\n        targetRefProp = getTargetRef(targetBo, true);\n        dataAssociation.targetRef = targetRefProp;\n      } else {\n        dataAssociation.targetRef = null;\n      }\n    }\n  }\n\n  DataInputAssociationBehavior.$inject = [\n    'eventBus',\n    'bpmnFactory'\n  ];\n\n  e$3(DataInputAssociationBehavior, CommandInterceptor);\n\n\n  /**\n   * Only call the given function when the event\n   * touches a bpmn:DataInputAssociation.\n   *\n   * @param {Function} fn\n   * @return {Function}\n   */\n  function ifDataInputAssociation(fn) {\n\n    return function(event) {\n      var context = event.context,\n          connection = context.connection;\n\n      if (is$1(connection, 'bpmn:DataInputAssociation')) {\n        return fn(event);\n      }\n    };\n  }\n\n  /**\r\n   * @typedef {import('diagram-js/lib/command/CommandHandler').default} CommandHandler\r\n   *\r\n   * @typedef {import('../BpmnUpdater').default} BpmnUpdater\r\n   */\r\n\r\n  /**\r\n   * @implements {CommandHandler}\r\n   *\r\n   * @param {BpmnUpdater} bpmnUpdater\r\n   */\r\n  function UpdateSemanticParentHandler(bpmnUpdater) {\r\n    this._bpmnUpdater = bpmnUpdater;\r\n  }\r\n\r\n  UpdateSemanticParentHandler.$inject = [ 'bpmnUpdater' ];\r\n\r\n\r\n  UpdateSemanticParentHandler.prototype.execute = function(context) {\r\n    var dataStoreBo = context.dataStoreBo,\r\n        dataStoreDi = context.dataStoreDi,\r\n        newSemanticParent = context.newSemanticParent,\r\n        newDiParent = context.newDiParent;\r\n\r\n    context.oldSemanticParent = dataStoreBo.$parent;\r\n    context.oldDiParent = dataStoreDi.$parent;\r\n\r\n    // update semantic parent\r\n    this._bpmnUpdater.updateSemanticParent(dataStoreBo, newSemanticParent);\r\n\r\n    // update DI parent\r\n    this._bpmnUpdater.updateDiParent(dataStoreDi, newDiParent);\r\n\r\n    return [];\r\n  };\r\n\r\n  UpdateSemanticParentHandler.prototype.revert = function(context) {\r\n    var dataStoreBo = context.dataStoreBo,\r\n        dataStoreDi = context.dataStoreDi,\r\n        oldSemanticParent = context.oldSemanticParent,\r\n        oldDiParent = context.oldDiParent;\r\n\r\n    // update semantic parent\r\n    this._bpmnUpdater.updateSemanticParent(dataStoreBo, oldSemanticParent);\r\n\r\n    // update DI parent\r\n    this._bpmnUpdater.updateDiParent(dataStoreDi, oldDiParent);\r\n\r\n    return [];\r\n  };\n\n  /**\r\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\r\n   * @typedef {import('diagram-js/lib/command/CommandStack').default} CommandStack\r\n   * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\r\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\r\n   */\r\n\r\n  /**\r\n   * BPMN specific data store behavior.\r\n   *\r\n   * @param {Canvas} canvas\r\n   * @param {CommandStack} commandStack\r\n   * @param {ElementRegistry} elementRegistry\r\n   * @param {EventBus} eventBus\r\n   */\r\n  function DataStoreBehavior(\r\n      canvas, commandStack, elementRegistry,\r\n      eventBus) {\r\n\r\n    CommandInterceptor.call(this, eventBus);\r\n\r\n    commandStack.registerHandler('dataStore.updateContainment', UpdateSemanticParentHandler);\r\n\r\n    function getFirstParticipantWithProcessRef() {\r\n      return elementRegistry.filter(function(element) {\r\n        return is$1(element, 'bpmn:Participant') && getBusinessObject(element).processRef;\r\n      })[0];\r\n    }\r\n\r\n    function getDataStores(element) {\r\n      return element.children.filter(function(child) {\r\n        return is$1(child, 'bpmn:DataStoreReference') && !child.labelTarget;\r\n      });\r\n    }\r\n\r\n    function updateDataStoreParent(dataStore, newDataStoreParent) {\r\n      var dataStoreBo = dataStore.businessObject || dataStore;\r\n\r\n      newDataStoreParent = newDataStoreParent || getFirstParticipantWithProcessRef();\r\n\r\n      if (newDataStoreParent) {\r\n        var newDataStoreParentBo = newDataStoreParent.businessObject || newDataStoreParent;\r\n\r\n        commandStack.execute('dataStore.updateContainment', {\r\n          dataStoreBo: dataStoreBo,\r\n          dataStoreDi: getDi(dataStore),\r\n          newSemanticParent: newDataStoreParentBo.processRef || newDataStoreParentBo,\r\n          newDiParent: getDi(newDataStoreParent)\r\n        });\r\n      }\r\n    }\r\n\r\n\r\n    // disable auto-resize for data stores\r\n    this.preExecute('shape.create', function(event) {\r\n\r\n      var context = event.context,\r\n          shape = context.shape;\r\n\r\n      if (is$1(shape, 'bpmn:DataStoreReference') &&\r\n          shape.type !== 'label') {\r\n\r\n        if (!context.hints) {\r\n          context.hints = {};\r\n        }\r\n\r\n        // prevent auto resizing\r\n        context.hints.autoResize = false;\r\n      }\r\n    });\r\n\r\n\r\n    // disable auto-resize for data stores\r\n    this.preExecute('elements.move', function(event) {\r\n      var context = event.context,\r\n          shapes = context.shapes;\r\n\r\n      var dataStoreReferences = shapes.filter(function(shape) {\r\n        return is$1(shape, 'bpmn:DataStoreReference');\r\n      });\r\n\r\n      if (dataStoreReferences.length) {\r\n        if (!context.hints) {\r\n          context.hints = {};\r\n        }\r\n\r\n        // prevent auto resizing for data store references\r\n        context.hints.autoResize = shapes.filter(function(shape) {\r\n          return !is$1(shape, 'bpmn:DataStoreReference');\r\n        });\r\n      }\r\n    });\r\n\r\n\r\n    // update parent on data store created\r\n    this.postExecute('shape.create', function(event) {\r\n      var context = event.context,\r\n          shape = context.shape,\r\n          parent = shape.parent;\r\n\r\n\r\n      if (is$1(shape, 'bpmn:DataStoreReference') &&\r\n          shape.type !== 'label' &&\r\n          is$1(parent, 'bpmn:Collaboration')) {\r\n\r\n        updateDataStoreParent(shape);\r\n      }\r\n    });\r\n\r\n\r\n    // update parent on data store moved\r\n    this.postExecute('shape.move', function(event) {\r\n      var context = event.context,\r\n          shape = context.shape,\r\n          oldParent = context.oldParent,\r\n          parent = shape.parent;\r\n\r\n      if (is$1(oldParent, 'bpmn:Collaboration')) {\r\n\r\n        // do nothing if not necessary\r\n        return;\r\n      }\r\n\r\n      if (is$1(shape, 'bpmn:DataStoreReference') &&\r\n          shape.type !== 'label' &&\r\n          is$1(parent, 'bpmn:Collaboration')) {\r\n\r\n        var participant = is$1(oldParent, 'bpmn:Participant') ?\r\n          oldParent :\r\n          getAncestor(oldParent, 'bpmn:Participant');\r\n\r\n        updateDataStoreParent(shape, participant);\r\n      }\r\n    });\r\n\r\n\r\n    // update data store parents on participant or subprocess deleted\r\n    this.postExecute('shape.delete', function(event) {\r\n      var context = event.context,\r\n          shape = context.shape,\r\n          rootElement = canvas.getRootElement();\r\n\r\n      if (isAny(shape, [ 'bpmn:Participant', 'bpmn:SubProcess' ])\r\n          && is$1(rootElement, 'bpmn:Collaboration')) {\r\n        getDataStores(rootElement)\r\n          .filter(function(dataStore) {\r\n            return isDescendant(dataStore, shape);\r\n          })\r\n          .forEach(function(dataStore) {\r\n            updateDataStoreParent(dataStore);\r\n          });\r\n      }\r\n    });\r\n\r\n    // update data store parents on collaboration -> process\r\n    this.postExecute('canvas.updateRoot', function(event) {\r\n      var context = event.context,\r\n          oldRoot = context.oldRoot,\r\n          newRoot = context.newRoot;\r\n\r\n      var dataStores = getDataStores(oldRoot);\r\n\r\n      dataStores.forEach(function(dataStore) {\r\n\r\n        if (is$1(newRoot, 'bpmn:Process')) {\r\n          updateDataStoreParent(dataStore, newRoot);\r\n        }\r\n\r\n      });\r\n    });\r\n  }\r\n\r\n  DataStoreBehavior.$inject = [\r\n    'canvas',\r\n    'commandStack',\r\n    'elementRegistry',\r\n    'eventBus',\r\n  ];\r\n\r\n  e$3(DataStoreBehavior, CommandInterceptor);\r\n\r\n\r\n  // helpers //////////\r\n\r\n  function isDescendant(descendant, ancestor) {\r\n    var descendantBo = descendant.businessObject || descendant,\r\n        ancestorBo = ancestor.businessObject || ancestor;\r\n\r\n    while (descendantBo.$parent) {\r\n      if (descendantBo.$parent === ancestorBo.processRef || ancestorBo) {\r\n        return true;\r\n      }\r\n\r\n      descendantBo = descendantBo.$parent;\r\n    }\r\n\r\n    return false;\r\n  }\r\n\r\n  function getAncestor(element, type) {\r\n\r\n    while (element.parent) {\r\n      if (is$1(element.parent, type)) {\r\n        return element.parent;\r\n      }\r\n\r\n      element = element.parent;\r\n    }\r\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../../space-tool/BpmnSpaceTool').default} SpaceTool\n   */\n\n  var LOW_PRIORITY$c = 500;\n\n\n  /**\n   * BPMN specific delete lane behavior.\n   *\n   * @param {EventBus} eventBus\n   * @param {SpaceTool} spaceTool\n   */\n  function DeleteLaneBehavior(eventBus, spaceTool) {\n\n    CommandInterceptor.call(this, eventBus);\n\n\n    function compensateLaneDelete(shape, oldParent) {\n\n      var siblings = getChildLanes(oldParent);\n\n      var topAffected = [];\n      var bottomAffected = [];\n\n      eachElement(siblings, function(element) {\n\n        if (element.y > shape.y) {\n          bottomAffected.push(element);\n        } else {\n          topAffected.push(element);\n        }\n\n        return element.children;\n      });\n\n      if (!siblings.length) {\n        return;\n      }\n\n      var offset;\n\n      if (bottomAffected.length && topAffected.length) {\n        offset = shape.height / 2;\n      } else {\n        offset = shape.height;\n      }\n\n      var topAdjustments,\n          bottomAdjustments;\n\n      if (topAffected.length) {\n        topAdjustments = spaceTool.calculateAdjustments(\n          topAffected, 'y', offset, shape.y - 10);\n\n        spaceTool.makeSpace(\n          topAdjustments.movingShapes,\n          topAdjustments.resizingShapes,\n          { x: 0, y: offset }, 's');\n      }\n\n      if (bottomAffected.length) {\n        bottomAdjustments = spaceTool.calculateAdjustments(\n          bottomAffected, 'y', -offset, shape.y + shape.height + 10);\n\n        spaceTool.makeSpace(\n          bottomAdjustments.movingShapes,\n          bottomAdjustments.resizingShapes,\n          { x: 0, y: -offset }, 'n');\n      }\n    }\n\n\n    /**\n     * Adjust sizes of other lanes after lane deletion\n     */\n    this.postExecuted('shape.delete', LOW_PRIORITY$c, function(event) {\n\n      var context = event.context,\n          hints = context.hints,\n          shape = context.shape,\n          oldParent = context.oldParent;\n\n      // only compensate lane deletes\n      if (!is$1(shape, 'bpmn:Lane')) {\n        return;\n      }\n\n      // compensate root deletes only\n      if (hints && hints.nested) {\n        return;\n      }\n\n      compensateLaneDelete(shape, oldParent);\n    });\n  }\n\n  DeleteLaneBehavior.$inject = [\n    'eventBus',\n    'spaceTool'\n  ];\n\n  e$3(DeleteLaneBehavior, CommandInterceptor);\n\n  /**\n   * @typedef {import('../../replace/BpmnReplace').default} BpmnReplace\n   * @typedef {import('didi').Injector} Injector\n   */\n\n  var LOW_PRIORITY$b = 500;\n\n\n  /**\n   * Replace boundary event with intermediate event when creating or moving results in detached event.\n   *\n   * @param {BpmnReplace} bpmnReplace\n   * @param {Injector} injector\n   */\n  function DetachEventBehavior(bpmnReplace, injector) {\n    injector.invoke(CommandInterceptor, this);\n\n    this._bpmnReplace = bpmnReplace;\n\n    var self = this;\n\n    this.postExecuted('elements.create', LOW_PRIORITY$b, function(context) {\n      var elements = context.elements;\n\n      elements.filter(function(shape) {\n        var host = shape.host;\n\n        return shouldReplace(shape, host);\n      }).map(function(shape) {\n        return elements.indexOf(shape);\n      }).forEach(function(index) {\n        context.elements[ index ] = self._replaceShape(elements[ index ]);\n      });\n    }, true);\n\n    this.preExecute('elements.move', LOW_PRIORITY$b, function(context) {\n      var shapes = context.shapes,\n          newHost = context.newHost;\n\n      shapes.forEach(function(shape, index) {\n        var host = shape.host;\n\n        if (shouldReplace(shape, includes$6(shapes, host) ? host : newHost)) {\n          shapes[ index ] = self._replaceShape(shape);\n        }\n      });\n    }, true);\n  }\n\n  DetachEventBehavior.$inject = [\n    'bpmnReplace',\n    'injector'\n  ];\n\n  e$3(DetachEventBehavior, CommandInterceptor);\n\n  DetachEventBehavior.prototype._replaceShape = function(shape) {\n    var eventDefinition = getEventDefinition(shape),\n        intermediateEvent;\n\n    if (eventDefinition) {\n      intermediateEvent = {\n        type: 'bpmn:IntermediateCatchEvent',\n        eventDefinitionType: eventDefinition.$type\n      };\n    } else {\n      intermediateEvent = {\n        type: 'bpmn:IntermediateThrowEvent'\n      };\n    }\n\n    return this._bpmnReplace.replaceElement(shape, intermediateEvent, { layoutConnection: false });\n  };\n\n\n  // helpers //////////\n\n  function getEventDefinition(element) {\n    var businessObject = getBusinessObject(element),\n        eventDefinitions = businessObject.eventDefinitions;\n\n    return eventDefinitions && eventDefinitions[0];\n  }\n\n  function shouldReplace(shape, host) {\n    return !isLabel(shape) && is$1(shape, 'bpmn:BoundaryEvent') && !host;\n  }\n\n  function includes$6(array, item) {\n    return array.indexOf(item) !== -1;\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../../rules/BpmnRules').default} BpmnRules\n   * @typedef {import('../../modeling/Modeling').default} Modeling\n   */\n\n  /**\n   * @param {EventBus} eventBus\n   * @param {BpmnRules} bpmnRules\n   * @param {Modeling} modeling\n   */\n  function DropOnFlowBehavior(eventBus, bpmnRules, modeling) {\n\n    CommandInterceptor.call(this, eventBus);\n\n    /**\n     * Reconnect start / end of a connection after\n     * dropping an element on a flow.\n     */\n\n    function insertShape(shape, targetFlow, positionOrBounds) {\n      var waypoints = targetFlow.waypoints,\n          waypointsBefore,\n          waypointsAfter,\n          dockingPoint,\n          source,\n          target,\n          incomingConnection,\n          outgoingConnection,\n          oldOutgoing = shape.outgoing.slice(),\n          oldIncoming = shape.incoming.slice();\n\n      var mid;\n\n      if (isNumber(positionOrBounds.width)) {\n        mid = getMid(positionOrBounds);\n      } else {\n        mid = positionOrBounds;\n      }\n\n      var intersection = getApproxIntersection(waypoints, mid);\n\n      if (intersection) {\n        waypointsBefore = waypoints.slice(0, intersection.index);\n        waypointsAfter = waypoints.slice(intersection.index + (intersection.bendpoint ? 1 : 0));\n\n        // due to inaccuracy intersection might have been found\n        if (!waypointsBefore.length || !waypointsAfter.length) {\n          return;\n        }\n\n        dockingPoint = intersection.bendpoint ? waypoints[intersection.index] : mid;\n\n        // if last waypointBefore is inside shape's bounds, ignore docking point\n        if (waypointsBefore.length === 1 || !isPointInsideBBox(shape, waypointsBefore[waypointsBefore.length - 1])) {\n          waypointsBefore.push(copy(dockingPoint));\n        }\n\n        // if first waypointAfter is inside shape's bounds, ignore docking point\n        if (waypointsAfter.length === 1 || !isPointInsideBBox(shape, waypointsAfter[0])) {\n          waypointsAfter.unshift(copy(dockingPoint));\n        }\n      }\n\n      source = targetFlow.source;\n      target = targetFlow.target;\n\n      if (bpmnRules.canConnect(source, shape, targetFlow)) {\n\n        // reconnect source -> inserted shape\n        modeling.reconnectEnd(targetFlow, shape, waypointsBefore || mid);\n\n        incomingConnection = targetFlow;\n      }\n\n      if (bpmnRules.canConnect(shape, target, targetFlow)) {\n\n        if (!incomingConnection) {\n\n          // reconnect inserted shape -> end\n          modeling.reconnectStart(targetFlow, shape, waypointsAfter || mid);\n\n          outgoingConnection = targetFlow;\n        } else {\n          outgoingConnection = modeling.connect(\n            shape, target, { type: targetFlow.type, waypoints: waypointsAfter }\n          );\n        }\n      }\n\n      var duplicateConnections = [].concat(\n\n        incomingConnection && filter(oldIncoming, function(connection) {\n          return connection.source === incomingConnection.source;\n        }) || [],\n\n        outgoingConnection && filter(oldOutgoing, function(connection) {\n          return connection.target === outgoingConnection.target;\n        }) || []\n      );\n\n      if (duplicateConnections.length) {\n        modeling.removeElements(duplicateConnections);\n      }\n    }\n\n    this.preExecute('elements.move', function(context) {\n\n      var newParent = context.newParent,\n          shapes = context.shapes,\n          delta = context.delta,\n          shape = shapes[0];\n\n      if (!shape || !newParent) {\n        return;\n      }\n\n      // if the new parent is a connection,\n      // change it to the new parent's parent\n      if (newParent && newParent.waypoints) {\n        context.newParent = newParent = newParent.parent;\n      }\n\n      var shapeMid = getMid(shape);\n      var newShapeMid = {\n        x: shapeMid.x + delta.x,\n        y: shapeMid.y + delta.y\n      };\n\n      // find a connection which intersects with the\n      // element's mid point\n      var connection = find(newParent.children, function(element) {\n        var canInsert = bpmnRules.canInsert(shapes, element);\n\n        return canInsert && getApproxIntersection(element.waypoints, newShapeMid);\n      });\n\n      if (connection) {\n        context.targetFlow = connection;\n        context.position = newShapeMid;\n      }\n\n    }, true);\n\n    this.postExecuted('elements.move', function(context) {\n\n      var shapes = context.shapes,\n          targetFlow = context.targetFlow,\n          position = context.position;\n\n      if (targetFlow) {\n        insertShape(shapes[0], targetFlow, position);\n      }\n\n    }, true);\n\n    this.preExecute('shape.create', function(context) {\n\n      var parent = context.parent,\n          shape = context.shape;\n\n      if (bpmnRules.canInsert(shape, parent)) {\n        context.targetFlow = parent;\n        context.parent = parent.parent;\n      }\n    }, true);\n\n    this.postExecuted('shape.create', function(context) {\n\n      var shape = context.shape,\n          targetFlow = context.targetFlow,\n          positionOrBounds = context.position;\n\n      if (targetFlow) {\n        insertShape(shape, targetFlow, positionOrBounds);\n      }\n    }, true);\n  }\n\n  e$3(DropOnFlowBehavior, CommandInterceptor);\n\n  DropOnFlowBehavior.$inject = [\n    'eventBus',\n    'bpmnRules',\n    'modeling'\n  ];\n\n\n  // helpers /////////////////////\n\n  function isPointInsideBBox(bbox, point) {\n    var x = point.x,\n        y = point.y;\n\n    return x >= bbox.x &&\n      x <= bbox.x + bbox.width &&\n      y >= bbox.y &&\n      y <= bbox.y + bbox.height;\n  }\n\n  function copy(obj) {\n    return assign$1({}, obj);\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   */\n  function EventBasedGatewayBehavior(eventBus, modeling) {\n\n    CommandInterceptor.call(this, eventBus);\n\n    /**\n     * Remove incoming sequence flows of event-based target when creating\n     * sequence flow.\n     *\n     * 1. If source is event-based gateway remove all incoming sequence flows\n     * 2. If source is not event-based gateway remove all incoming sequence flows\n     * whose source is event-based gateway\n     */\n    this.preExecuted('connection.create', function(event) {\n      var context = event.context,\n          connection = context.connection,\n          source = context.source,\n          target = context.target,\n          hints = context.hints;\n\n      if (hints && hints.createElementsBehavior === false) {\n        return;\n      }\n\n      if (!isSequenceFlow(connection)) {\n        return;\n      }\n\n      var sequenceFlows = [];\n\n      if (is$1(source, 'bpmn:EventBasedGateway')) {\n        sequenceFlows = target.incoming.filter(isSequenceFlow);\n      } else {\n        sequenceFlows = target.incoming.filter(function(connection) {\n          return isSequenceFlow(connection)\n            && is$1(connection.source, 'bpmn:EventBasedGateway');\n        });\n      }\n\n      sequenceFlows.forEach(function(sequenceFlow) {\n        modeling.removeConnection(sequenceFlow);\n      });\n    });\n\n    /**\n     * Remove incoming sequence flows of event-based targets when replacing source\n     * with event-based gateway.\n     */\n    this.preExecuted('shape.replace', function(event) {\n      var context = event.context,\n          newShape = context.newShape;\n\n      if (!is$1(newShape, 'bpmn:EventBasedGateway')) {\n        return;\n      }\n\n      var targets = newShape.outgoing.filter(isSequenceFlow)\n        .reduce(function(targets, sequenceFlow) {\n          if (!targets.includes(sequenceFlow.target)) {\n            return targets.concat(sequenceFlow.target);\n          }\n\n          return targets;\n        }, []);\n\n      targets.forEach(function(target) {\n        target.incoming.filter(isSequenceFlow).forEach(function(sequenceFlow) {\n          const sequenceFlowsFromNewShape = target.incoming.filter(isSequenceFlow).filter(function(sequenceFlow) {\n            return sequenceFlow.source === newShape;\n          });\n\n          if (sequenceFlow.source !== newShape || sequenceFlowsFromNewShape.length > 1) {\n            modeling.removeConnection(sequenceFlow);\n          }\n        });\n      });\n    });\n  }\n\n  EventBasedGatewayBehavior.$inject = [\n    'eventBus',\n    'modeling'\n  ];\n\n  e$3(EventBasedGatewayBehavior, CommandInterceptor);\n\n  // helpers //////////\n\n  function isSequenceFlow(connection) {\n    return is$1(connection, 'bpmn:SequenceFlow');\n  }\n\n  /**\r\n   * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\r\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\r\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\r\n   */\r\n\r\n  var HIGH_PRIORITY$a = 1500;\r\n  var HIGHEST_PRIORITY = 2000;\r\n\r\n\r\n  /**\r\n   * Correct hover targets in certain situations to improve diagram interaction.\r\n   *\r\n   * @param {ElementRegistry} elementRegistry\r\n   * @param {EventBus} eventBus\r\n   * @param {Canvas} canvas\r\n   */\r\n  function FixHoverBehavior(elementRegistry, eventBus, canvas) {\r\n\r\n    eventBus.on([\r\n      'create.hover',\r\n      'create.move',\r\n      'create.out',\r\n      'create.end',\r\n      'shape.move.hover',\r\n      'shape.move.move',\r\n      'shape.move.out',\r\n      'shape.move.end'\r\n    ], HIGH_PRIORITY$a, function(event) {\r\n      var context = event.context,\r\n          shape = context.shape || event.shape,\r\n          hover = event.hover;\r\n\r\n      // ensure elements are not dropped onto a bpmn:Lane but onto\r\n      // the underlying bpmn:Participant\r\n      if (is$1(hover, 'bpmn:Lane') && !isAny(shape, [ 'bpmn:Lane', 'bpmn:Participant' ])) {\r\n        event.hover = getLanesRoot(hover);\r\n        event.hoverGfx = elementRegistry.getGraphics(event.hover);\r\n      }\r\n\r\n      var rootElement = canvas.getRootElement();\r\n\r\n      // ensure bpmn:Group and label elements are dropped\r\n      // always onto the root\r\n      if (hover !== rootElement && (shape.labelTarget || is$1(shape, 'bpmn:Group'))) {\r\n        event.hover = rootElement;\r\n        event.hoverGfx = elementRegistry.getGraphics(event.hover);\r\n      }\r\n    });\r\n\r\n    eventBus.on([\r\n      'connect.hover',\r\n      'connect.out',\r\n      'connect.end',\r\n      'connect.cleanup',\r\n      'global-connect.hover',\r\n      'global-connect.out',\r\n      'global-connect.end',\r\n      'global-connect.cleanup'\r\n    ], HIGH_PRIORITY$a, function(event) {\r\n      var hover = event.hover;\r\n\r\n      // ensure connections start/end on bpmn:Participant,\r\n      // not the underlying bpmn:Lane\r\n      if (is$1(hover, 'bpmn:Lane')) {\r\n        event.hover = getLanesRoot(hover) || hover;\r\n        event.hoverGfx = elementRegistry.getGraphics(event.hover);\r\n      }\r\n    });\r\n\r\n\r\n    eventBus.on([\r\n      'bendpoint.move.hover'\r\n    ], HIGH_PRIORITY$a, function(event) {\r\n      var context = event.context,\r\n          hover = event.hover,\r\n          type = context.type;\r\n\r\n      // ensure reconnect start/end on bpmn:Participant,\r\n      // not the underlying bpmn:Lane\r\n      if (is$1(hover, 'bpmn:Lane') && /reconnect/.test(type)) {\r\n        event.hover = getLanesRoot(hover) || hover;\r\n        event.hoverGfx = elementRegistry.getGraphics(event.hover);\r\n      }\r\n    });\r\n\r\n\r\n    eventBus.on([\r\n      'connect.start'\r\n    ], HIGH_PRIORITY$a, function(event) {\r\n      var context = event.context,\r\n          start = context.start;\r\n\r\n      // ensure connect start on bpmn:Participant,\r\n      // not the underlying bpmn:Lane\r\n      if (is$1(start, 'bpmn:Lane')) {\r\n        context.start = getLanesRoot(start) || start;\r\n      }\r\n    });\r\n\r\n\r\n    // allow movement of participants from lanes\r\n    eventBus.on('shape.move.start', HIGHEST_PRIORITY, function(event) {\r\n      var shape = event.shape;\r\n\r\n      if (is$1(shape, 'bpmn:Lane')) {\r\n        event.shape = getLanesRoot(shape) || shape;\r\n      }\r\n    });\r\n\r\n  }\r\n\r\n  FixHoverBehavior.$inject = [\r\n    'elementRegistry',\r\n    'eventBus',\r\n    'canvas'\r\n  ];\n\n  /**\n   * @typedef {import('../../BpmnFactory').default} BpmnFactory\n   *\n   * @typedef {import('../../../model/Types').ModdleElement} ModdleElement\n   */\n\n  /**\n   * Creates a new bpmn:CategoryValue inside a new bpmn:Category\n   *\n   * @param {BpmnFactory} bpmnFactory\n   *\n   * @return {ModdleElement}\n   */\n  function createCategory(bpmnFactory) {\n    return bpmnFactory.create('bpmn:Category');\n  }\n\n  /**\n   * Creates a new bpmn:CategoryValue inside a new bpmn:Category\n   *\n   * @param {BpmnFactory} bpmnFactory\n   *\n   * @return {ModdleElement}\n   */\n  function createCategoryValue(bpmnFactory) {\n    return bpmnFactory.create('bpmn:CategoryValue');\n  }\n\n  /**\n   * Adds category value to definitions\n   *\n   * @param {ModdleElement} categoryValue\n   * @param {ModdleElement} category\n   * @param {ModdleElement} definitions\n   *\n   * @return {ModdleElement}\n   */\n  function linkCategoryValue(categoryValue, category, definitions) {\n    add(category.get('categoryValue'), categoryValue);\n    categoryValue.$parent = category;\n\n    add(definitions.get('rootElements'), category);\n    category.$parent = definitions;\n\n    return categoryValue;\n  }\n\n  /**\n   * Unlink category value from parent\n   *\n   * @param {ModdleElement} categoryValue\n   *\n   * @return {ModdleElement}\n   */\n  function unlinkCategoryValue(categoryValue) {\n    var category = categoryValue.$parent;\n\n    if (category) {\n      remove(category.get('categoryValue'), categoryValue);\n      categoryValue.$parent = null;\n    }\n\n    return categoryValue;\n  }\n\n  /**\n   * Unlink category from parent\n   *\n   * @param {ModdleElement} category\n   *\n   * @return {ModdleElement}\n   */\n  function unlinkCategory(category) {\n    var definitions = category.$parent;\n\n    if (definitions) {\n      remove(definitions.get('rootElements'), category);\n      category.$parent = null;\n    }\n\n    return category;\n  }\n\n  /**\n   * @typedef {import('../BpmnFactory').default} BpmnFactory\n   * @typedef {import('../../../Modeler').default} Modeler\n   * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('didi').Injector} Injector\n   * @typedef {import('../../copy-paste/ModdleCopy').default} ModdleCopy\n   *\n   * @typedef {import('../../../model/Types').Element} Element\n   * @typedef {import('../../../model/Types').Shape} Shape\n   *\n   * @typedef {import('diagram-js/lib/util/Types').DirectionTRBL} DirectionTRBL\n   */\n\n  var LOWER_PRIORITY = 770;\n\n\n  /**\n   * BPMN specific group behavior.\n   *\n   * @param {BpmnFactory} bpmnFactory\n   * @param {Modeler} bpmnjs\n   * @param {ElementRegistry} elementRegistry\n   * @param {EventBus} eventBus\n   * @param {Injector} injector\n   * @param {ModdleCopy} moddleCopy\n   */\n  function GroupBehavior(\n      bpmnFactory,\n      bpmnjs,\n      elementRegistry,\n      eventBus,\n      injector,\n      moddleCopy\n  ) {\n    injector.invoke(CommandInterceptor, this);\n\n    /**\n     * Returns all group element in the current registry.\n     *\n     * @return {Shape[]}\n     */\n    function getGroupElements() {\n      return elementRegistry.filter(function(e) {\n        return is$1(e, 'bpmn:Group');\n      });\n    }\n\n    /**\n     * Returns true if given category is referenced in one of the given elements.\n     *\n     * @param {Element[]} elements\n     * @param {ModdleElement} category\n     *\n     * @return {boolean}\n     */\n    function isReferencedCategory(elements, category) {\n      return elements.some(function(element) {\n        var businessObject = getBusinessObject(element);\n\n        var _category = businessObject.categoryValueRef && businessObject.categoryValueRef.$parent;\n\n        return _category === category;\n      });\n    }\n\n    /**\n     * Returns true if given categoryValue is referenced in one of the given elements.\n     *\n     * @param {Element[]} elements\n     * @param {ModdleElement} categoryValue\n     *\n     * @return {boolean}\n     */\n    function isReferencedCategoryValue(elements, categoryValue) {\n      return elements.some(function(element) {\n        var businessObject = getBusinessObject(element);\n\n        return businessObject.categoryValueRef === categoryValue;\n      });\n    }\n\n    /**\n     * Remove category value unless it is still referenced.\n     *\n     * @param {ModdleElement} categoryValue\n     * @param {ModdleElement} category\n     * @param {ModdleElement} businessObject\n     */\n    function removeCategoryValue(categoryValue, category, businessObject) {\n\n      var groups = getGroupElements().filter(function(element) {\n        return element.businessObject !== businessObject;\n      });\n\n      if (category && !isReferencedCategory(groups, category)) {\n        unlinkCategory(category);\n      }\n\n      if (categoryValue && !isReferencedCategoryValue(groups, categoryValue)) {\n        unlinkCategoryValue(categoryValue);\n      }\n    }\n\n    /**\n     * Add category value.\n     *\n     * @param {ModdleElement} categoryValue\n     * @param {ModdleElement} category\n     *\n     * @return {ModdleElement}\n     */\n    function addCategoryValue(categoryValue, category) {\n      return linkCategoryValue(categoryValue, category, bpmnjs.getDefinitions());\n    }\n\n    function setCategoryValue(element, context) {\n      var businessObject = getBusinessObject(element),\n          categoryValue = businessObject.categoryValueRef;\n\n      if (!categoryValue) {\n        categoryValue =\n        businessObject.categoryValueRef =\n        context.categoryValue = (\n          context.categoryValue || createCategoryValue(bpmnFactory)\n        );\n      }\n\n      var category = categoryValue.$parent;\n\n      if (!category) {\n        category =\n        categoryValue.$parent =\n        context.category = (\n          context.category || createCategory(bpmnFactory)\n        );\n      }\n\n      addCategoryValue(categoryValue, category, bpmnjs.getDefinitions());\n    }\n\n    function unsetCategoryValue(element, context) {\n      var category = context.category,\n          categoryValue = context.categoryValue,\n          businessObject = getBusinessObject(element);\n\n      if (categoryValue) {\n        businessObject.categoryValueRef = null;\n\n        removeCategoryValue(categoryValue, category, businessObject);\n      } else {\n        removeCategoryValue(null, businessObject.categoryValueRef.$parent, businessObject);\n      }\n    }\n\n\n    // ensure category + value exist before label editing\n\n    this.execute('label.create', function(event) {\n      var context = event.context,\n          labelTarget = context.labelTarget;\n\n      if (!is$1(labelTarget, 'bpmn:Group')) {\n        return;\n      }\n\n      setCategoryValue(labelTarget, context);\n    });\n\n    this.revert('label.create', function(event) {\n      var context = event.context,\n          labelTarget = context.labelTarget;\n\n      if (!is$1(labelTarget, 'bpmn:Group')) {\n        return;\n      }\n\n      unsetCategoryValue(labelTarget, context);\n    });\n\n\n    // remove referenced category + value when group was deleted\n\n    this.execute('shape.delete', function(event) {\n\n      var context = event.context,\n          shape = context.shape,\n          businessObject = getBusinessObject(shape);\n\n      if (!is$1(shape, 'bpmn:Group') || shape.labelTarget) {\n        return;\n      }\n\n      var categoryValue = context.categoryValue = businessObject.categoryValueRef,\n          category;\n\n      if (categoryValue) {\n        category = context.category = categoryValue.$parent;\n\n        removeCategoryValue(categoryValue, category, businessObject);\n\n        businessObject.categoryValueRef = null;\n      }\n    });\n\n    this.reverted('shape.delete', function(event) {\n\n      var context = event.context,\n          shape = context.shape;\n\n      if (!is$1(shape, 'bpmn:Group') || shape.labelTarget) {\n        return;\n      }\n\n      var category = context.category,\n          categoryValue = context.categoryValue,\n          businessObject = getBusinessObject(shape);\n\n      if (categoryValue) {\n        businessObject.categoryValueRef = categoryValue;\n\n        addCategoryValue(categoryValue, category);\n      }\n    });\n\n\n    // create new category + value when group was created\n\n    this.execute('shape.create', function(event) {\n      var context = event.context,\n          shape = context.shape;\n\n      if (!is$1(shape, 'bpmn:Group') || shape.labelTarget) {\n        return;\n      }\n\n      if (getBusinessObject(shape).categoryValueRef) {\n        setCategoryValue(shape, context);\n      }\n    });\n\n    this.reverted('shape.create', function(event) {\n\n      var context = event.context,\n          shape = context.shape;\n\n      if (!is$1(shape, 'bpmn:Group') || shape.labelTarget) {\n        return;\n      }\n\n      if (getBusinessObject(shape).categoryValueRef) {\n        unsetCategoryValue(shape, context);\n      }\n    });\n\n\n    // copy + paste categoryValueRef with group\n\n    function copy(bo, clone) {\n      var targetBo = bpmnFactory.create(bo.$type);\n\n      return moddleCopy.copyElement(bo, targetBo, null, clone);\n    }\n\n    eventBus.on('copyPaste.copyElement', LOWER_PRIORITY, function(context) {\n      var descriptor = context.descriptor,\n          element = context.element;\n\n      if (!is$1(element, 'bpmn:Group') || element.labelTarget) {\n        return;\n      }\n\n      var groupBo = getBusinessObject(element);\n\n      if (groupBo.categoryValueRef) {\n\n        var categoryValue = groupBo.categoryValueRef;\n\n        descriptor.categoryValue = copy(categoryValue, true);\n\n        if (categoryValue.$parent) {\n          descriptor.category = copy(categoryValue.$parent, true);\n        }\n      }\n    });\n\n    eventBus.on('copyPaste.pasteElement', LOWER_PRIORITY, function(context) {\n      var descriptor = context.descriptor,\n          businessObject = descriptor.businessObject,\n          categoryValue = descriptor.categoryValue,\n          category = descriptor.category;\n\n      if (categoryValue) {\n        categoryValue = businessObject.categoryValueRef = copy(categoryValue);\n      }\n\n      if (category) {\n        categoryValue.$parent = copy(category);\n      }\n\n      delete descriptor.category;\n      delete descriptor.categoryValue;\n    });\n\n  }\n\n  GroupBehavior.$inject = [\n    'bpmnFactory',\n    'bpmnjs',\n    'elementRegistry',\n    'eventBus',\n    'injector',\n    'moddleCopy'\n  ];\n\n  e$3(GroupBehavior, CommandInterceptor);\n\n  /**\n   * @typedef {import('diagram-js/lib/util/Types').Point} Point\n   */\n\n  /**\n   * Returns the intersection between two line segments a and b.\n   *\n   * @param {Point} l1s\n   * @param {Point} l1e\n   * @param {Point} l2s\n   * @param {Point} l2e\n   *\n   * @return {Point}\n   */\n  function lineIntersect(l1s, l1e, l2s, l2e) {\n\n    // if the lines intersect, the result contains the x and y of the\n    // intersection (treating the lines as infinite) and booleans for\n    // whether line segment 1 or line segment 2 contain the point\n    var denominator, a, b, c, numerator;\n\n    denominator = ((l2e.y - l2s.y) * (l1e.x - l1s.x)) - ((l2e.x - l2s.x) * (l1e.y - l1s.y));\n\n    if (denominator == 0) {\n      return null;\n    }\n\n    a = l1s.y - l2s.y;\n    b = l1s.x - l2s.x;\n    numerator = ((l2e.x - l2s.x) * a) - ((l2e.y - l2s.y) * b);\n\n    c = numerator / denominator;\n\n    // if we cast these lines infinitely in\n    // both directions, they intersect here\n    return {\n      x: Math.round(l1s.x + (c * (l1e.x - l1s.x))),\n      y: Math.round(l1s.y + (c * (l1e.y - l1s.y)))\n    };\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   */\n\n  /**\n   * Fix broken dockings after DI imports.\n   *\n   * @param {EventBus} eventBus\n   */\n  function ImportDockingFix(eventBus) {\n\n    function adjustDocking(startPoint, nextPoint, elementMid) {\n\n      var elementTop = {\n        x: elementMid.x,\n        y: elementMid.y - 50\n      };\n\n      var elementLeft = {\n        x: elementMid.x - 50,\n        y: elementMid.y\n      };\n\n      var verticalIntersect = lineIntersect(startPoint, nextPoint, elementMid, elementTop),\n          horizontalIntersect = lineIntersect(startPoint, nextPoint, elementMid, elementLeft);\n\n      // original is horizontal or vertical center cross intersection\n      var centerIntersect;\n\n      if (verticalIntersect && horizontalIntersect) {\n        if (getDistance$1(verticalIntersect, elementMid) > getDistance$1(horizontalIntersect, elementMid)) {\n          centerIntersect = horizontalIntersect;\n        } else {\n          centerIntersect = verticalIntersect;\n        }\n      } else {\n        centerIntersect = verticalIntersect || horizontalIntersect;\n      }\n\n      startPoint.original = centerIntersect;\n    }\n\n    function fixDockings(connection) {\n      var waypoints = connection.waypoints;\n\n      adjustDocking(\n        waypoints[0],\n        waypoints[1],\n        getMid(connection.source)\n      );\n\n      adjustDocking(\n        waypoints[waypoints.length - 1],\n        waypoints[waypoints.length - 2],\n        getMid(connection.target)\n      );\n    }\n\n    eventBus.on('bpmnElement.added', function(e) {\n\n      var element = e.element;\n\n      if (element.waypoints) {\n        fixDockings(element);\n      }\n    });\n  }\n\n  ImportDockingFix.$inject = [\n    'eventBus'\n  ];\n\n\n  // helpers //////////////////////\n\n  function getDistance$1(p1, p2) {\n    return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2));\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   */\n\n  /**\n   * A component that makes sure that each created or updated\n   * Pool and Lane is assigned an isHorizontal property set to true.\n   *\n   * @param {EventBus} eventBus\n   */\n  function IsHorizontalFix(eventBus) {\n\n    CommandInterceptor.call(this, eventBus);\n\n    var elementTypesToUpdate = [\n      'bpmn:Participant',\n      'bpmn:Lane'\n    ];\n\n    this.executed([ 'shape.move', 'shape.create', 'shape.resize' ], function(event) {\n      var shape = event.context.shape,\n          bo = getBusinessObject(shape),\n          di = getDi(shape);\n\n      if (isAny(bo, elementTypesToUpdate) && !di.get('isHorizontal')) {\n\n        // set attribute directly to avoid modeling#updateProperty side effects\n        di.set('isHorizontal', true);\n      }\n    });\n\n  }\n\n  IsHorizontalFix.$inject = [ 'eventBus' ];\n\n  e$3(IsHorizontalFix, CommandInterceptor);\n\n  /**\n   * @typedef {import('diagram-js/lib/util/Types').Point} Point\n   *\n   * @typedef { {\n  *   type: 'bendpoint' | 'segment';\n  *   position: Point;\n  *   segmentIndex: number;\n  *   bendpointIndex?: number;\n  *   relativeLocation?: number;\n  * } } Attachment\n  */\n\n  var sqrt = Math.sqrt,\n      min$1 = Math.min,\n      max$3 = Math.max,\n      abs$3 = Math.abs;\n\n  /**\n   * Calculate the square (power to two) of a number.\n   *\n   * @param {number} n\n   *\n   * @return {number}\n   */\n  function sq(n) {\n    return Math.pow(n, 2);\n  }\n\n  /**\n   * Get distance between two points.\n   *\n   * @param {Point} p1\n   * @param {Point} p2\n   *\n   * @return {number}\n   */\n  function getDistance(p1, p2) {\n    return sqrt(sq(p1.x - p2.x) + sq(p1.y - p2.y));\n  }\n\n  /**\n   * Return the attachment of the given point on the specified line.\n   *\n   * The attachment is either a bendpoint (attached to the given point)\n   * or segment (attached to a location on a line segment) attachment:\n   *\n   * ```javascript\n   * var pointAttachment = {\n   *   type: 'bendpoint',\n   *   bendpointIndex: 3,\n   *   position: { x: 10, y: 10 } // the attach point on the line\n   * };\n   *\n   * var segmentAttachment = {\n   *   type: 'segment',\n   *   segmentIndex: 2,\n   *   relativeLocation: 0.31, // attach point location between 0 (at start) and 1 (at end)\n   *   position: { x: 10, y: 10 } // the attach point on the line\n   * };\n   * ```\n   *\n   * @param {Point} point\n   * @param {Point[]} line\n   *\n   * @return {Attachment}\n   */\n  function getAttachment(point, line) {\n\n    var idx = 0,\n        segmentStart,\n        segmentEnd,\n        segmentStartDistance,\n        segmentEndDistance,\n        attachmentPosition,\n        minDistance,\n        intersections,\n        attachment,\n        attachmentDistance,\n        closestAttachmentDistance,\n        closestAttachment;\n\n    for (idx = 0; idx < line.length - 1; idx++) {\n\n      segmentStart = line[idx];\n      segmentEnd = line[idx + 1];\n\n      if (pointsEqual(segmentStart, segmentEnd)) {\n        intersections = [ segmentStart ];\n      } else {\n        segmentStartDistance = getDistance(point, segmentStart);\n        segmentEndDistance = getDistance(point, segmentEnd);\n\n        minDistance = min$1(segmentStartDistance, segmentEndDistance);\n\n        intersections = getCircleSegmentIntersections(segmentStart, segmentEnd, point, minDistance);\n      }\n\n      if (intersections.length < 1) {\n        throw new Error('expected between [1, 2] circle -> line intersections');\n      }\n\n      // one intersection -> bendpoint attachment\n      if (intersections.length === 1) {\n        attachment = {\n          type: 'bendpoint',\n          position: intersections[0],\n          segmentIndex: idx,\n          bendpointIndex: pointsEqual(segmentStart, intersections[0]) ? idx : idx + 1\n        };\n      }\n\n      // two intersections -> segment attachment\n      if (intersections.length === 2) {\n\n        attachmentPosition = mid$1(intersections[0], intersections[1]);\n\n        attachment = {\n          type: 'segment',\n          position: attachmentPosition,\n          segmentIndex: idx,\n          relativeLocation: getDistance(segmentStart, attachmentPosition) / getDistance(segmentStart, segmentEnd)\n        };\n      }\n\n      attachmentDistance = getDistance(attachment.position, point);\n\n      if (!closestAttachment || closestAttachmentDistance > attachmentDistance) {\n        closestAttachment = attachment;\n        closestAttachmentDistance = attachmentDistance;\n      }\n    }\n\n    return closestAttachment;\n  }\n\n  /**\n   * Get the intersection between a circle and a line segment.\n   *\n   * @param {Point} s1 segment start\n   * @param {Point} s2 segment end\n   * @param {Point} cc circle center\n   * @param {number} cr circle radius\n   *\n   * @return {Point[]} intersections\n   */\n  function getCircleSegmentIntersections(s1, s2, cc, cr) {\n\n    var baX = s2.x - s1.x;\n    var baY = s2.y - s1.y;\n    var caX = cc.x - s1.x;\n    var caY = cc.y - s1.y;\n\n    var a = baX * baX + baY * baY;\n    var bBy2 = baX * caX + baY * caY;\n    var c = caX * caX + caY * caY - cr * cr;\n\n    var pBy2 = bBy2 / a;\n    var q = c / a;\n\n    var disc = pBy2 * pBy2 - q;\n\n    // check against negative value to work around\n    // negative, very close to zero results (-4e-15)\n    // being produced in some environments\n    if (disc < 0 && disc > -0.000001) {\n      disc = 0;\n    }\n\n    if (disc < 0) {\n      return [];\n    }\n\n    // if disc == 0 ... dealt with later\n    var tmpSqrt = sqrt(disc);\n    var abScalingFactor1 = -pBy2 + tmpSqrt;\n    var abScalingFactor2 = -pBy2 - tmpSqrt;\n\n    var i1 = {\n      x: s1.x - baX * abScalingFactor1,\n      y: s1.y - baY * abScalingFactor1\n    };\n\n    if (disc === 0) { // abScalingFactor1 == abScalingFactor2\n      return [ i1 ];\n    }\n\n    var i2 = {\n      x: s1.x - baX * abScalingFactor2,\n      y: s1.y - baY * abScalingFactor2\n    };\n\n    // return only points on line segment\n    return [ i1, i2 ].filter(function(p) {\n      return isPointInSegment(p, s1, s2);\n    });\n  }\n\n\n  function isPointInSegment(p, segmentStart, segmentEnd) {\n    return (\n      fenced(p.x, segmentStart.x, segmentEnd.x) &&\n      fenced(p.y, segmentStart.y, segmentEnd.y)\n    );\n  }\n\n  function fenced(n, rangeStart, rangeEnd) {\n\n    // use matching threshold to work around\n    // precision errors in intersection computation\n\n    return (\n      n >= min$1(rangeStart, rangeEnd) - EQUAL_THRESHOLD &&\n      n <= max$3(rangeStart, rangeEnd) + EQUAL_THRESHOLD\n    );\n  }\n\n  /**\n   * Calculate the mid between two points.\n   *\n   * @param {Point} p1\n   * @param {Point} p2\n   *\n   * @return {Point}\n   */\n  function mid$1(p1, p2) {\n\n    return {\n      x: (p1.x + p2.x) / 2,\n      y: (p1.y + p2.y) / 2\n    };\n  }\n\n  var EQUAL_THRESHOLD = 0.1;\n\n  function pointsEqual(p1, p2) {\n\n    return (\n      abs$3(p1.x - p2.x) <= EQUAL_THRESHOLD &&\n      abs$3(p1.y - p2.y) <= EQUAL_THRESHOLD\n    );\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/util/Types').Point} Point\n   *\n   * @typedef {import('./LineAttachmentUtil').Attachment} Attachment\n   *\n   * @typedef { {\n   *   point: Point;\n   *   delta: Point;\n   * } } AnchorPointAdjustment\n   *\n   * @typedef { {\n   *   segmentMove?: {\n  *     segmentStartIndex: number;\n  *     newSegmentStartIndex: number;\n  *   };\n  *   bendpointMove?: {\n  *     insert: boolean;\n  *     bendpointIndex: number;\n  *   };\n  *   connectionStart: boolean;\n  *   connectionEnd: boolean;\n  * } } FindNewLineStartIndexHints\n   */\n\n  /**\n   * @param {Point[]} oldWaypoints\n   * @param {Point[]} newWaypoints\n   * @param {Attachment} attachment\n   * @param {FindNewLineStartIndexHints} hints\n   *\n   * @return {number}\n   */\n  function findNewLineStartIndex(oldWaypoints, newWaypoints, attachment, hints) {\n\n    var index = attachment.segmentIndex;\n\n    var offset = newWaypoints.length - oldWaypoints.length;\n\n    // segmentMove happened\n    if (hints.segmentMove) {\n\n      var oldSegmentStartIndex = hints.segmentMove.segmentStartIndex,\n          newSegmentStartIndex = hints.segmentMove.newSegmentStartIndex;\n\n      // if point was on moved segment return new segment index\n      if (index === oldSegmentStartIndex) {\n        return newSegmentStartIndex;\n      }\n\n      // point is after new segment index\n      if (index >= newSegmentStartIndex) {\n        return (index + offset < newSegmentStartIndex) ? newSegmentStartIndex : index + offset;\n      }\n\n      // if point is before new segment index\n      return index;\n    }\n\n    // bendpointMove happened\n    if (hints.bendpointMove) {\n\n      var insert = hints.bendpointMove.insert,\n          bendpointIndex = hints.bendpointMove.bendpointIndex,\n          newIndex;\n\n      // waypoints length didnt change\n      if (offset === 0) {\n        return index;\n      }\n\n      // point behind new/removed bendpoint\n      if (index >= bendpointIndex) {\n        newIndex = insert ? index + 1 : index - 1;\n      }\n\n      // point before new/removed bendpoint\n      if (index < bendpointIndex) {\n\n        newIndex = index;\n\n        // decide point should take right or left segment\n        if (insert && attachment.type !== 'bendpoint' && bendpointIndex - 1 === index) {\n\n          var rel = relativePositionMidWaypoint(newWaypoints, bendpointIndex);\n\n          if (rel < attachment.relativeLocation) {\n            newIndex++;\n          }\n        }\n      }\n\n      return newIndex;\n    }\n\n    // start/end changed\n    if (offset === 0) {\n      return index;\n    }\n\n    if (hints.connectionStart && index === 0) {\n      return 0;\n    }\n\n    if (hints.connectionEnd && index === oldWaypoints.length - 2) {\n      return newWaypoints.length - 2;\n    }\n\n    // if nothing fits, take the middle segment\n    return Math.floor((newWaypoints.length - 2) / 2);\n  }\n\n\n  /**\n   * Calculate the required adjustment (move delta) for the given point\n   * after the connection waypoints got updated.\n   *\n   * @param {Point} position\n   * @param {Point[]} newWaypoints\n   * @param {Point[]} oldWaypoints\n   * @param {FindNewLineStartIndexHints} hints\n   *\n   * @return {AnchorPointAdjustment} result\n   */\n  function getAnchorPointAdjustment(position, newWaypoints, oldWaypoints, hints) {\n\n    var dx = 0,\n        dy = 0;\n\n    var oldPosition = {\n      point: position,\n      delta: { x: 0, y: 0 }\n    };\n\n    // get closest attachment\n    var attachment = getAttachment(position, oldWaypoints),\n        oldLabelLineIndex = attachment.segmentIndex,\n        newLabelLineIndex = findNewLineStartIndex(oldWaypoints, newWaypoints, attachment, hints);\n\n\n    // should never happen\n    // TODO(@janstuemmel): throw an error here when connectionSegmentMove is refactored\n    if (newLabelLineIndex < 0 ||\n        newLabelLineIndex > newWaypoints.length - 2 ||\n        newLabelLineIndex === null) {\n      return oldPosition;\n    }\n\n    var oldLabelLine = getLine(oldWaypoints, oldLabelLineIndex),\n        newLabelLine = getLine(newWaypoints, newLabelLineIndex),\n        oldFoot = attachment.position;\n\n    var relativeFootPosition = getRelativeFootPosition(oldLabelLine, oldFoot),\n        angleDelta = getAngleDelta(oldLabelLine, newLabelLine);\n\n    // special rule if label on bendpoint\n    if (attachment.type === 'bendpoint') {\n\n      var offset = newWaypoints.length - oldWaypoints.length,\n          oldBendpointIndex = attachment.bendpointIndex,\n          oldBendpoint = oldWaypoints[oldBendpointIndex];\n\n      // bendpoint position hasn't changed, return same position\n      if (newWaypoints.indexOf(oldBendpoint) !== -1) {\n        return oldPosition;\n      }\n\n      // new bendpoint and old bendpoint have same index, then just return the offset\n      if (offset === 0) {\n        var newBendpoint = newWaypoints[oldBendpointIndex];\n\n        dx = newBendpoint.x - attachment.position.x,\n        dy = newBendpoint.y - attachment.position.y;\n\n        return {\n          delta: {\n            x: dx,\n            y: dy\n          },\n          point: {\n            x: position.x + dx,\n            y: position.y + dy\n          }\n        };\n      }\n\n      // if bendpoints get removed\n      if (offset < 0 && oldBendpointIndex !== 0 && oldBendpointIndex < oldWaypoints.length - 1) {\n        relativeFootPosition = relativePositionMidWaypoint(oldWaypoints, oldBendpointIndex);\n      }\n    }\n\n    var newFoot = {\n      x: (newLabelLine[1].x - newLabelLine[0].x) * relativeFootPosition + newLabelLine[0].x,\n      y: (newLabelLine[1].y - newLabelLine[0].y) * relativeFootPosition + newLabelLine[0].y\n    };\n\n    // the rotated vector to label\n    var newLabelVector = rotateVector({\n      x: position.x - oldFoot.x,\n      y: position.y - oldFoot.y\n    }, angleDelta);\n\n    // the new relative position\n    dx = newFoot.x + newLabelVector.x - position.x;\n    dy = newFoot.y + newLabelVector.y - position.y;\n\n    return {\n      point: roundPoint(newFoot),\n      delta: roundPoint({\n        x: dx,\n        y: dy\n      })\n    };\n  }\n\n\n  // HELPERS //////////////////////\n\n  function relativePositionMidWaypoint(waypoints, idx) {\n\n    var distanceSegment1 = getDistancePointPoint(waypoints[idx - 1], waypoints[idx]),\n        distanceSegment2 = getDistancePointPoint(waypoints[idx], waypoints[idx + 1]);\n\n    var relativePosition = distanceSegment1 / (distanceSegment1 + distanceSegment2);\n\n    return relativePosition;\n  }\n\n  function getAngleDelta(l1, l2) {\n    var a1 = getAngle(l1),\n        a2 = getAngle(l2);\n    return a2 - a1;\n  }\n\n  function getLine(waypoints, idx) {\n    return [ waypoints[idx], waypoints[idx + 1] ];\n  }\n\n  function getRelativeFootPosition(line, foot) {\n\n    var length = getDistancePointPoint(line[0], line[1]),\n        lengthToFoot = getDistancePointPoint(line[0], foot);\n\n    return length === 0 ? 0 : lengthToFoot / length;\n  }\n\n  /**\n   * Calculate the required adjustment (move delta) for the given label\n   * after the connection waypoints got updated.\n   *\n   * @param {Label} label\n   * @param {Point[]} newWaypoints\n   * @param {Point[]} oldWaypoints\n   * @param {FindNewLineStartIndexHints} hints\n   *\n   * @return {Point}\n   */\n  function getLabelAdjustment(label, newWaypoints, oldWaypoints, hints) {\n    var labelPosition = getMid(label);\n\n    return getAnchorPointAdjustment(labelPosition, newWaypoints, oldWaypoints, hints).delta;\n  }\n\n  /**\n   * @typedef {import('../model/Types').Shape} Shape\n   *\n   * @typedef {import('../util/Types').Point} Point\n   * @typedef {import('../util/Types').Rect} Rect\n   */\n\n  /**\n   * Calculates the absolute point relative to the new element's position.\n   *\n   * @param {Point} point [absolute]\n   * @param {Rect} oldBounds\n   * @param {Rect} newBounds\n   *\n   * @return {Point} point [absolute]\n   */\n  function getNewAttachPoint(point, oldBounds, newBounds) {\n    var oldCenter = center(oldBounds),\n        newCenter = center(newBounds),\n        oldDelta = delta(point, oldCenter);\n\n    var newDelta = {\n      x: oldDelta.x * (newBounds.width / oldBounds.width),\n      y: oldDelta.y * (newBounds.height / oldBounds.height)\n    };\n\n    return roundPoint({\n      x: newCenter.x + newDelta.x,\n      y: newCenter.y + newDelta.y\n    });\n  }\n\n\n  /**\n   * Calculates the shape's delta relative to a new position\n   * of a certain element's bounds.\n   *\n   * @param {Shape} shape\n   * @param {Rect} oldBounds\n   * @param {Rect} newBounds\n   *\n   * @return {Point} delta\n   */\n  function getNewAttachShapeDelta(shape, oldBounds, newBounds) {\n    var shapeCenter = center(shape),\n        oldCenter = center(oldBounds),\n        newCenter = center(newBounds),\n        shapeDelta = delta(shape, shapeCenter),\n        oldCenterDelta = delta(shapeCenter, oldCenter),\n        stickyPositionDelta = getStickyPositionDelta(shapeCenter, oldBounds, newBounds);\n\n    if (stickyPositionDelta) {\n      return stickyPositionDelta;\n    }\n\n    var newCenterDelta = {\n      x: oldCenterDelta.x * (newBounds.width / oldBounds.width),\n      y: oldCenterDelta.y * (newBounds.height / oldBounds.height)\n    };\n\n    var newShapeCenter = {\n      x: newCenter.x + newCenterDelta.x,\n      y: newCenter.y + newCenterDelta.y\n    };\n\n    return roundPoint({\n      x: newShapeCenter.x + shapeDelta.x - shape.x,\n      y: newShapeCenter.y + shapeDelta.y - shape.y\n    });\n  }\n\n  function getStickyPositionDelta(oldShapeCenter, oldBounds, newBounds) {\n    var oldTRBL = asTRBL(oldBounds),\n        newTRBL = asTRBL(newBounds);\n\n    if (isMoved(oldTRBL, newTRBL)) {\n      return null;\n    }\n\n    var oldOrientation = getOrientation(oldBounds, oldShapeCenter),\n        stickyPositionDelta,\n        newShapeCenter,\n        newOrientation;\n\n    if (oldOrientation === 'top') {\n      stickyPositionDelta = {\n        x: 0,\n        y: newTRBL.bottom - oldTRBL.bottom\n      };\n    } else if (oldOrientation === 'bottom') {\n      stickyPositionDelta = {\n        x: 0,\n        y: newTRBL.top - oldTRBL.top\n      };\n    } else if (oldOrientation === 'right') {\n      stickyPositionDelta = {\n        x: newTRBL.left - oldTRBL.left,\n        y: 0\n      };\n    } else if (oldOrientation === 'left') {\n      stickyPositionDelta = {\n        x: newTRBL.right - oldTRBL.right,\n        y: 0\n      };\n    } else {\n\n      // fallback to proportional movement for corner-placed attachments\n      return null;\n    }\n\n    newShapeCenter = {\n      x: oldShapeCenter.x + stickyPositionDelta.x,\n      y: oldShapeCenter.y + stickyPositionDelta.y\n    };\n\n    newOrientation = getOrientation(newBounds, newShapeCenter);\n\n    if (newOrientation !== oldOrientation) {\n\n      // fallback to proportional movement if orientation would otherwise change\n      return null;\n    }\n\n    return stickyPositionDelta;\n  }\n\n  function isMoved(oldTRBL, newTRBL) {\n    return isHorizontallyMoved(oldTRBL, newTRBL) || isVerticallyMoved(oldTRBL, newTRBL);\n  }\n\n  function isHorizontallyMoved(oldTRBL, newTRBL) {\n    return oldTRBL.right !== newTRBL.right && oldTRBL.left !== newTRBL.left;\n  }\n\n  function isVerticallyMoved(oldTRBL, newTRBL) {\n    return oldTRBL.top !== newTRBL.top && oldTRBL.bottom !== newTRBL.bottom;\n  }\n\n  var NAME_PROPERTY = 'name';\n  var TEXT_PROPERTY = 'text';\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../Modeling').default} Modeling\n   * @typedef {import('../BpmnFactory').default} BpmnFactory\n   * @typedef {import('../../../draw/TextRenderer').default} TextRenderer\n   *\n   * @typedef {import('diagram-js/lib/util/Types').Point} Point\n   * @typedef {import('diagram-js/lib/util/Types').Rect} Rect\n   *\n   * @typedef {Point[]} Line\n   */\n\n  /**\n   * A component that makes sure that external labels are added\n   * together with respective elements and properly updated (DI wise)\n   * during move.\n   *\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   * @param {BpmnFactory} bpmnFactory\n   * @param {TextRenderer} textRenderer\n   */\n  function LabelBehavior(\n      eventBus, modeling, bpmnFactory,\n      textRenderer) {\n\n    CommandInterceptor.call(this, eventBus);\n\n    // update label if name property was updated\n    this.postExecute('element.updateProperties', onPropertyUpdate);\n    this.postExecute('element.updateModdleProperties', e => {\n      const elementBo = getBusinessObject(e.context.element);\n\n      if (elementBo === e.context.moddleElement) {\n        onPropertyUpdate(e);\n      }\n    });\n\n    function onPropertyUpdate(e) {\n      var context = e.context,\n          element = context.element,\n          properties = context.properties;\n\n      if (NAME_PROPERTY in properties) {\n        modeling.updateLabel(element, properties[NAME_PROPERTY]);\n      }\n\n      if (TEXT_PROPERTY in properties\n          && is$1(element, 'bpmn:TextAnnotation')) {\n\n        var newBounds = textRenderer.getTextAnnotationBounds(\n          {\n            x: element.x,\n            y: element.y,\n            width: element.width,\n            height: element.height\n          },\n          properties[TEXT_PROPERTY] || ''\n        );\n\n        modeling.updateLabel(element, properties.text, newBounds);\n      }\n    }\n\n    // create label shape after shape/connection was created\n    this.postExecute([ 'shape.create', 'connection.create' ], function(e) {\n      var context = e.context,\n          hints = context.hints || {};\n\n      if (hints.createElementsBehavior === false) {\n        return;\n      }\n\n      var element = context.shape || context.connection;\n\n      if (isLabel(element) || !isLabelExternal(element)) {\n        return;\n      }\n\n      // only create label if attribute available\n      if (!getLabel(element)) {\n        return;\n      }\n\n      modeling.updateLabel(element, getLabel(element));\n    });\n\n    // update label after label shape was deleted\n    this.postExecute('shape.delete', function(event) {\n      var context = event.context,\n          labelTarget = context.labelTarget,\n          hints = context.hints || {};\n\n      // check if label\n      if (labelTarget && hints.unsetLabel !== false) {\n        modeling.updateLabel(labelTarget, null, null, { removeShape: false });\n      }\n    });\n\n    function getVisibleLabelAdjustment(event) {\n\n      var context = event.context,\n          connection = context.connection,\n          label = connection.label,\n          hints = assign$1({}, context.hints),\n          newWaypoints = context.newWaypoints || connection.waypoints,\n          oldWaypoints = context.oldWaypoints;\n\n\n      if (typeof hints.startChanged === 'undefined') {\n        hints.startChanged = !!hints.connectionStart;\n      }\n\n      if (typeof hints.endChanged === 'undefined') {\n        hints.endChanged = !!hints.connectionEnd;\n      }\n\n      return getLabelAdjustment(label, newWaypoints, oldWaypoints, hints);\n    }\n\n    this.postExecute([\n      'connection.layout',\n      'connection.updateWaypoints'\n    ], function(event) {\n      var context = event.context,\n          hints = context.hints || {};\n\n      if (hints.labelBehavior === false) {\n        return;\n      }\n\n      var connection = context.connection,\n          label = connection.label,\n          labelAdjustment;\n\n      // handle missing label as well as the case\n      // that the label parent does not exist (yet),\n      // because it is being pasted / created via multi element create\n      //\n      // Cf. https://github.com/bpmn-io/bpmn-js/pull/1227\n      if (!label || !label.parent) {\n        return;\n      }\n\n      labelAdjustment = getVisibleLabelAdjustment(event);\n\n      modeling.moveShape(label, labelAdjustment);\n    });\n\n\n    // keep label position on shape replace\n    this.postExecute([ 'shape.replace' ], function(event) {\n      var context = event.context,\n          newShape = context.newShape,\n          oldShape = context.oldShape;\n\n      var businessObject = getBusinessObject(newShape);\n\n      if (businessObject\n        && isLabelExternal(businessObject)\n        && oldShape.label\n        && newShape.label) {\n        newShape.label.x = oldShape.label.x;\n        newShape.label.y = oldShape.label.y;\n      }\n    });\n\n\n    // move external label after resizing\n    this.postExecute('shape.resize', function(event) {\n\n      var context = event.context,\n          shape = context.shape,\n          newBounds = context.newBounds,\n          oldBounds = context.oldBounds;\n\n      if (hasExternalLabel(shape)) {\n\n        var label = shape.label,\n            labelMid = getMid(label),\n            edges = asEdges(oldBounds);\n\n        // get nearest border point to label as reference point\n        var referencePoint = getReferencePoint(labelMid, edges);\n\n        var delta = getReferencePointDelta(referencePoint, oldBounds, newBounds);\n\n        modeling.moveShape(label, delta);\n\n      }\n\n    });\n\n  }\n\n  e$3(LabelBehavior, CommandInterceptor);\n\n  LabelBehavior.$inject = [\n    'eventBus',\n    'modeling',\n    'bpmnFactory',\n    'textRenderer'\n  ];\n\n  // helpers //////////////////////\n\n  /**\n   * Calculates a reference point delta relative to a new position\n   * of a certain element's bounds\n   *\n   * @param {Point} referencePoint\n   * @param {Rect} oldBounds\n   * @param {Rect} newBounds\n   *\n   * @return {Point}\n   */\n  function getReferencePointDelta(referencePoint, oldBounds, newBounds) {\n\n    var newReferencePoint = getNewAttachPoint(referencePoint, oldBounds, newBounds);\n\n    return roundPoint(delta(newReferencePoint, referencePoint));\n  }\n\n  /**\n   * Generates the nearest point (reference point) for a given point\n   * onto given set of lines\n   *\n   * @param {Point} point\n   * @param {Line[]} lines\n   *\n   * @return {Point}\n   */\n  function getReferencePoint(point, lines) {\n\n    if (!lines.length) {\n      return;\n    }\n\n    var nearestLine = getNearestLine(point, lines);\n\n    return perpendicularFoot(point, nearestLine);\n  }\n\n  /**\n   * Convert the given bounds to a lines array containing all edges\n   *\n   * @param {Rect|Point} bounds\n   *\n   * @return {Line[]}\n   */\n  function asEdges(bounds) {\n    return [\n      [ // top\n        {\n          x: bounds.x,\n          y: bounds.y\n        },\n        {\n          x: bounds.x + (bounds.width || 0),\n          y: bounds.y\n        }\n      ],\n      [ // right\n        {\n          x: bounds.x + (bounds.width || 0),\n          y: bounds.y\n        },\n        {\n          x: bounds.x + (bounds.width || 0),\n          y: bounds.y + (bounds.height || 0)\n        }\n      ],\n      [ // bottom\n        {\n          x: bounds.x,\n          y: bounds.y + (bounds.height || 0)\n        },\n        {\n          x: bounds.x + (bounds.width || 0),\n          y: bounds.y + (bounds.height || 0)\n        }\n      ],\n      [ // left\n        {\n          x: bounds.x,\n          y: bounds.y\n        },\n        {\n          x: bounds.x,\n          y: bounds.y + (bounds.height || 0)\n        }\n      ]\n    ];\n  }\n\n  /**\n   * Returns the nearest line for a given point by distance\n   * @param {Point} point\n   * @param {Line[]} lines\n   *\n   * @return {Line}\n   */\n  function getNearestLine(point, lines) {\n\n    var distances = lines.map(function(l) {\n      return {\n        line: l,\n        distance: getDistancePointLine(point, l)\n      };\n    });\n\n    var sorted = sortBy(distances, 'distance');\n\n    return sorted[0].line;\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/util/Types').Point} Point\n   *\n   * @typedef {import('./LayoutUtil').FindNewLineStartIndexHints} FindNewLineStartIndexHints\n   */\n\n  /**\n   * Calculate the new point after the connection waypoints got updated.\n   *\n   * @param {Point} position\n   * @param {Point[]} newWaypoints\n   * @param {Point[]} oldWaypoints\n   * @param {FindNewLineStartIndexHints} hints\n   *\n   * @return {Point}\n   */\n  function getConnectionAdjustment(position, newWaypoints, oldWaypoints, hints) {\n    return getAnchorPointAdjustment(position, newWaypoints, oldWaypoints, hints).point;\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * A component that makes sure that Associations connected to Connections\n   * are updated together with the Connection.\n   *\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   */\n  function LayoutConnectionBehavior(eventBus, modeling) {\n\n    CommandInterceptor.call(this, eventBus);\n\n    function getnewAnchorPoint(event, point) {\n\n      var context = event.context,\n          connection = context.connection,\n          hints = assign$1({}, context.hints),\n          newWaypoints = context.newWaypoints || connection.waypoints,\n          oldWaypoints = context.oldWaypoints;\n\n\n      if (typeof hints.startChanged === 'undefined') {\n        hints.startChanged = !!hints.connectionStart;\n      }\n\n      if (typeof hints.endChanged === 'undefined') {\n        hints.endChanged = !!hints.connectionEnd;\n      }\n\n      return getConnectionAdjustment(point, newWaypoints, oldWaypoints, hints);\n    }\n\n    this.postExecute([\n      'connection.layout',\n      'connection.updateWaypoints'\n    ], function(event) {\n      var context = event.context;\n\n      var connection = context.connection,\n          outgoing = connection.outgoing,\n          incoming = connection.incoming;\n\n      incoming.forEach(function(connection) {\n        var endPoint = connection.waypoints[connection.waypoints.length - 1];\n        var newEndpoint = getnewAnchorPoint(event, endPoint);\n\n        var newWaypoints = [].concat(connection.waypoints.slice(0, -1), [ newEndpoint ]);\n\n        modeling.updateWaypoints(connection, newWaypoints);\n      });\n\n      outgoing.forEach(function(connection) {\n        var startpoint = connection.waypoints[0];\n        var newStartpoint = getnewAnchorPoint(event, startpoint);\n\n        var newWaypoints = [].concat([ newStartpoint ], connection.waypoints.slice(1));\n\n        modeling.updateWaypoints(connection, newWaypoints);\n      });\n\n    });\n\n\n    this.postExecute([\n      'connection.move'\n    ], function(event) {\n      var context = event.context;\n\n      var connection = context.connection,\n          outgoing = connection.outgoing,\n          incoming = connection.incoming,\n          delta = context.delta;\n\n      incoming.forEach(function(connection) {\n        var endPoint = connection.waypoints[connection.waypoints.length - 1];\n        var newEndpoint = {\n          x: endPoint.x + delta.x,\n          y: endPoint.y + delta.y\n        };\n\n        var newWaypoints = [].concat(connection.waypoints.slice(0, -1), [ newEndpoint ]);\n\n        modeling.updateWaypoints(connection, newWaypoints);\n      });\n\n      outgoing.forEach(function(connection) {\n        var startpoint = connection.waypoints[0];\n        var newStartpoint = {\n          x: startpoint.x + delta.x,\n          y: startpoint.y + delta.y\n        };\n\n        var newWaypoints = [].concat([ newStartpoint ], connection.waypoints.slice(1));\n\n        modeling.updateWaypoints(connection, newWaypoints);\n      });\n\n    });\n\n  }\n\n  e$3(LayoutConnectionBehavior, CommandInterceptor);\n\n  LayoutConnectionBehavior.$inject = [\n    'eventBus',\n    'modeling'\n  ];\n\n  /**\n   * @typedef {import('../../../../core/Types').ConnectionLike} Connection\n   * @typedef {import('../../../../core/Types').ShapeLike} Shape\n   *\n   * @typedef {import('../../../../util/Types').Point} Point\n   * @typedef {import('../../../../util/Types').Rect} Rect\n   */\n\n  /**\n   * @param {Connection} connection\n   * @param {Shape} shape\n   * @param {Rect} oldBounds\n   * @return {Point}\n   */\n  function getResizedSourceAnchor(connection, shape, oldBounds) {\n\n    var waypoints = safeGetWaypoints(connection),\n        waypointsInsideNewBounds = getWaypointsInsideBounds(waypoints, shape),\n        oldAnchor = waypoints[0];\n\n    // new anchor is the last waypoint enclosed be resized source\n    if (waypointsInsideNewBounds.length) {\n      return waypointsInsideNewBounds[ waypointsInsideNewBounds.length - 1 ];\n    }\n\n    return getNewAttachPoint(oldAnchor.original || oldAnchor, oldBounds, shape);\n  }\n\n\n  function getResizedTargetAnchor(connection, shape, oldBounds) {\n\n    var waypoints = safeGetWaypoints(connection),\n        waypointsInsideNewBounds = getWaypointsInsideBounds(waypoints, shape),\n        oldAnchor = waypoints[waypoints.length - 1];\n\n    // new anchor is the first waypoint enclosed be resized target\n    if (waypointsInsideNewBounds.length) {\n      return waypointsInsideNewBounds[ 0 ];\n    }\n\n    return getNewAttachPoint(oldAnchor.original || oldAnchor, oldBounds, shape);\n  }\n\n\n  function getMovedSourceAnchor(connection, source, moveDelta) {\n\n    var waypoints = safeGetWaypoints(connection),\n        oldBounds = subtract(source, moveDelta),\n        oldAnchor = waypoints[ 0 ];\n\n    return getNewAttachPoint(oldAnchor.original || oldAnchor, oldBounds, source);\n  }\n\n\n  function getMovedTargetAnchor(connection, target, moveDelta) {\n\n    var waypoints = safeGetWaypoints(connection),\n        oldBounds = subtract(target, moveDelta),\n        oldAnchor = waypoints[ waypoints.length - 1 ];\n\n    return getNewAttachPoint(oldAnchor.original || oldAnchor, oldBounds, target);\n  }\n\n\n  // helpers //////////////////////\n\n  function subtract(bounds, delta) {\n    return {\n      x: bounds.x - delta.x,\n      y: bounds.y - delta.y,\n      width: bounds.width,\n      height: bounds.height\n    };\n  }\n\n\n  /**\n   * Return waypoints of given connection; throw if non exists (should not happen!!).\n   *\n   * @param {Connection} connection\n   *\n   * @return {Point[]}\n   */\n  function safeGetWaypoints(connection) {\n\n    var waypoints = connection.waypoints;\n\n    if (!waypoints.length) {\n      throw new Error('connection#' + connection.id + ': no waypoints');\n    }\n\n    return waypoints;\n  }\n\n  function getWaypointsInsideBounds(waypoints, bounds) {\n    var originalWaypoints = map$1(waypoints, getOriginal);\n\n    return filter(originalWaypoints, function(waypoint) {\n      return isInsideBounds(waypoint, bounds);\n    });\n  }\n\n  /**\n   * Checks if point is inside bounds, incl. edges.\n   *\n   * @param {Point} point\n   * @param {Rect} bounds\n   */\n  function isInsideBounds(point, bounds) {\n    return getOrientation(bounds, point, 1) === 'intersect';\n  }\n\n  function getOriginal(point) {\n    return point.original || point;\n  }\n\n  /**\r\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\r\n   * @typedef {import('../Modeling').default} Modeling\r\n   */\r\n\r\n  /**\r\n   * BPMN-specific message flow behavior.\r\n   *\r\n   * @param {EventBus} eventBus\r\n   * @param {Modeling} modeling\r\n   */\r\n  function MessageFlowBehavior(eventBus, modeling) {\r\n\r\n    CommandInterceptor.call(this, eventBus);\r\n\r\n    this.postExecute('shape.replace', function(context) {\r\n      var oldShape = context.oldShape,\r\n          newShape = context.newShape;\r\n\r\n      if (!isParticipantCollapse(oldShape, newShape)) {\r\n        return;\r\n      }\r\n\r\n      var messageFlows = getMessageFlows(oldShape);\r\n\r\n      messageFlows.incoming.forEach(function(incoming) {\r\n        var anchor = getResizedTargetAnchor(incoming, newShape, oldShape);\r\n\r\n        modeling.reconnectEnd(incoming, newShape, anchor);\r\n      });\r\n\r\n      messageFlows.outgoing.forEach(function(outgoing) {\r\n        var anchor = getResizedSourceAnchor(outgoing, newShape, oldShape);\r\n\r\n        modeling.reconnectStart(outgoing, newShape, anchor);\r\n      });\r\n    }, true);\r\n\r\n  }\r\n\r\n  MessageFlowBehavior.$inject = [ 'eventBus', 'modeling' ];\r\n\r\n  e$3(MessageFlowBehavior, CommandInterceptor);\r\n\r\n  // helpers //////////\r\n\r\n  function isParticipantCollapse(oldShape, newShape) {\r\n    return is$1(oldShape, 'bpmn:Participant')\r\n      && isExpanded(oldShape)\r\n      && is$1(newShape, 'bpmn:Participant')\r\n      && !isExpanded(newShape);\r\n  }\r\n\r\n  function getMessageFlows(parent) {\r\n    var elements = selfAndAllChildren([ parent ], false);\r\n\r\n    var incoming = [],\r\n        outgoing = [];\r\n\r\n    elements.forEach(function(element) {\r\n      if (element === parent) {\r\n        return;\r\n      }\r\n\r\n      element.incoming.forEach(function(connection) {\r\n        if (is$1(connection, 'bpmn:MessageFlow')) {\r\n          incoming.push(connection);\r\n        }\r\n      });\r\n\r\n      element.outgoing.forEach(function(connection) {\r\n        if (is$1(connection, 'bpmn:MessageFlow')) {\r\n          outgoing.push(connection);\r\n        }\r\n      });\r\n    }, []);\r\n\r\n    return {\r\n      incoming: incoming,\r\n      outgoing: outgoing\r\n    };\r\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('diagram-js/lib/features/tooltips/Tooltips').default} Tooltips\n   * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n   */\n\n  var COLLAB_ERR_MSG = 'flow elements must be children of pools/participants';\n\n  /**\n   * @param {EventBus} eventBus\n   * @param {Tooltips} tooltips\n   * @param {Translate} translate\n   */\n  function ModelingFeedback(eventBus, tooltips, translate) {\n\n    function showError(position, message, timeout) {\n      tooltips.add({\n        position: {\n          x: position.x + 5,\n          y: position.y + 5\n        },\n        type: 'error',\n        timeout: timeout || 2000,\n        html: '<div>' + message + '</div>'\n      });\n    }\n\n    eventBus.on([ 'shape.move.rejected', 'create.rejected' ], function(event) {\n      var context = event.context,\n          shape = context.shape,\n          target = context.target;\n\n      if (is$1(target, 'bpmn:Collaboration') && is$1(shape, 'bpmn:FlowNode')) {\n        showError(event, translate(COLLAB_ERR_MSG));\n      }\n    });\n\n  }\n\n  ModelingFeedback.$inject = [\n    'eventBus',\n    'tooltips',\n    'translate'\n  ];\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * BPMN specific behavior ensuring that bpmndi:Label's dc:Bounds are removed\n   * when shape is resized.\n   *\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   */\n  function RemoveEmbeddedLabelBoundsBehavior(eventBus, modeling) {\n    CommandInterceptor.call(this, eventBus);\n\n    this.preExecute('shape.resize', function(context) {\n      var shape = context.shape;\n\n      var di = getDi(shape),\n          label = di && di.get('label'),\n          bounds = label && label.get('bounds');\n\n      if (bounds) {\n        modeling.updateModdleProperties(shape, label, {\n          bounds: undefined\n        });\n      }\n    }, true);\n  }\n\n  e$3(RemoveEmbeddedLabelBoundsBehavior, CommandInterceptor);\n\n  RemoveEmbeddedLabelBoundsBehavior.$inject = [\n    'eventBus',\n    'modeling'\n  ];\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../../rules/BpmnRules').default} BpmnRules\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * @param {EventBus} eventBus\n   * @param {BpmnRules} bpmnRules\n   * @param {Modeling} modeling\n   */\n  function RemoveElementBehavior(eventBus, bpmnRules, modeling) {\n\n    CommandInterceptor.call(this, eventBus);\n\n    /**\n     * Combine sequence flows when deleting an element\n     * if there is one incoming and one outgoing\n     * sequence flow\n     */\n    this.preExecute('shape.delete', function(e) {\n\n      var shape = e.context.shape;\n\n      // only handle [a] -> [shape] -> [b] patterns\n      if (shape.incoming.length !== 1 || shape.outgoing.length !== 1) {\n        return;\n      }\n\n      var inConnection = shape.incoming[0],\n          outConnection = shape.outgoing[0];\n\n      // only handle sequence flows\n      if (!is$1(inConnection, 'bpmn:SequenceFlow') || !is$1(outConnection, 'bpmn:SequenceFlow')) {\n        return;\n      }\n\n      if (bpmnRules.canConnect(inConnection.source, outConnection.target, inConnection)) {\n\n        // compute new, combined waypoints\n        var newWaypoints = getNewWaypoints(inConnection.waypoints, outConnection.waypoints);\n\n        modeling.reconnectEnd(inConnection, outConnection.target, newWaypoints);\n      }\n    });\n\n  }\n\n  e$3(RemoveElementBehavior, CommandInterceptor);\n\n  RemoveElementBehavior.$inject = [\n    'eventBus',\n    'bpmnRules',\n    'modeling'\n  ];\n\n\n  // helpers //////////////////////\n\n  function getDocking$1(point) {\n    return point.original || point;\n  }\n\n\n  function getNewWaypoints(inWaypoints, outWaypoints) {\n\n    var intersection = lineIntersect(\n      getDocking$1(inWaypoints[inWaypoints.length - 2]),\n      getDocking$1(inWaypoints[inWaypoints.length - 1]),\n      getDocking$1(outWaypoints[1]),\n      getDocking$1(outWaypoints[0]));\n\n    if (intersection) {\n      return [].concat(\n        inWaypoints.slice(0, inWaypoints.length - 1),\n        [ intersection ],\n        outWaypoints.slice(1));\n    } else {\n      return [\n        getDocking$1(inWaypoints[0]),\n        getDocking$1(outWaypoints[outWaypoints.length - 1])\n      ];\n    }\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * BPMN specific remove behavior.\n   *\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   */\n  function RemoveParticipantBehavior(eventBus, modeling) {\n\n    CommandInterceptor.call(this, eventBus);\n\n\n    /**\n     * morph collaboration diagram into process diagram\n     * after the last participant has been removed\n     */\n\n    this.preExecute('shape.delete', function(context) {\n\n      var shape = context.shape,\n          parent = shape.parent;\n\n      // activate the behavior if the shape to be removed\n      // is a participant\n      if (is$1(shape, 'bpmn:Participant')) {\n        context.collaborationRoot = parent;\n      }\n    }, true);\n\n    this.postExecute('shape.delete', function(context) {\n\n      var collaborationRoot = context.collaborationRoot;\n\n      if (collaborationRoot && !collaborationRoot.businessObject.participants.length) {\n\n        // replace empty collaboration with process diagram\n        modeling.makeProcess();\n      }\n    }, true);\n\n  }\n\n  RemoveParticipantBehavior.$inject = [ 'eventBus', 'modeling' ];\n\n  e$3(RemoveParticipantBehavior, CommandInterceptor);\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../Modeling').default} Modeling\n   * @typedef {import('../../rules/BpmnRules').default} BpmnRules\n   * @typedef {import('didi').Injector} Injector\n   */\n\n  /**\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   * @param {BpmnRules} bpmnRules\n   * @param {Injector} injector\n   */\n  function ReplaceConnectionBehavior(eventBus, modeling, bpmnRules, injector) {\n\n    CommandInterceptor.call(this, eventBus);\n\n    var dragging = injector.get('dragging', false);\n\n    function fixConnection(connection) {\n\n      var source = connection.source,\n          target = connection.target,\n          parent = connection.parent;\n\n      // do not do anything if connection\n      // is already deleted (may happen due to other\n      // behaviors plugged-in before)\n      if (!parent) {\n        return;\n      }\n\n      var replacementType,\n          remove;\n\n      /**\n       * Check if incoming or outgoing connections\n       * can stay or could be substituted with an\n       * appropriate replacement.\n       *\n       * This holds true for SequenceFlow <> MessageFlow.\n       */\n\n      if (is$1(connection, 'bpmn:SequenceFlow')) {\n        if (!bpmnRules.canConnectSequenceFlow(source, target)) {\n          remove = true;\n        }\n\n        if (bpmnRules.canConnectMessageFlow(source, target)) {\n          replacementType = 'bpmn:MessageFlow';\n        }\n      }\n\n      // transform message flows into sequence flows, if possible\n\n      if (is$1(connection, 'bpmn:MessageFlow')) {\n\n        if (!bpmnRules.canConnectMessageFlow(source, target)) {\n          remove = true;\n        }\n\n        if (bpmnRules.canConnectSequenceFlow(source, target)) {\n          replacementType = 'bpmn:SequenceFlow';\n        }\n      }\n\n      if (is$1(connection, 'bpmn:Association') && !bpmnRules.canConnectAssociation(source, target)) {\n        remove = true;\n      }\n\n\n      // remove invalid connection,\n      // unless it has been removed already\n      if (remove) {\n        modeling.removeConnection(connection);\n      }\n\n      // replace SequenceFlow <> MessageFlow\n\n      if (replacementType) {\n        modeling.connect(source, target, {\n          type: replacementType,\n          waypoints: connection.waypoints.slice()\n        });\n      }\n    }\n\n    function replaceReconnectedConnection(event) {\n\n      var context = event.context,\n          connection = context.connection,\n          source = context.newSource || connection.source,\n          target = context.newTarget || connection.target,\n          allowed,\n          replacement;\n\n      allowed = bpmnRules.canConnect(source, target);\n\n      if (!allowed || allowed.type === connection.type) {\n        return;\n      }\n\n      replacement = modeling.connect(source, target, {\n        type: allowed.type,\n        waypoints: connection.waypoints.slice()\n      });\n\n      // remove old connection\n      modeling.removeConnection(connection);\n\n      // replace connection in context to reconnect end/start\n      context.connection = replacement;\n\n      if (dragging) {\n        cleanDraggingSelection(connection, replacement);\n      }\n    }\n\n    // monkey-patch selection saved in dragging in order to re-select it when operation is finished\n    function cleanDraggingSelection(oldConnection, newConnection) {\n      var context = dragging.context(),\n          previousSelection = context && context.payload.previousSelection,\n          index;\n\n      // do nothing if not dragging or no selection was present\n      if (!previousSelection || !previousSelection.length) {\n        return;\n      }\n\n      index = previousSelection.indexOf(oldConnection);\n\n      if (index === -1) {\n        return;\n      }\n\n      previousSelection.splice(index, 1, newConnection);\n    }\n\n    // lifecycle hooks\n\n    this.postExecuted('elements.move', function(context) {\n\n      var closure = context.closure,\n          allConnections = closure.allConnections;\n\n      forEach$1(allConnections, fixConnection);\n    }, true);\n\n    this.preExecute('connection.reconnect', replaceReconnectedConnection);\n\n    this.postExecuted('element.updateProperties', function(event) {\n      var context = event.context,\n          properties = context.properties,\n          element = context.element,\n          businessObject = element.businessObject,\n          connection;\n\n      // remove condition on change to default\n      if (properties.default) {\n        connection = find(\n          element.outgoing,\n          matchPattern({ id: element.businessObject.default.id })\n        );\n\n        if (connection) {\n          modeling.updateProperties(connection, { conditionExpression: undefined });\n        }\n      }\n\n      // remove default from source on change to conditional\n      if (properties.conditionExpression && businessObject.sourceRef.default === businessObject) {\n        modeling.updateProperties(element.source, { default: undefined });\n      }\n    });\n  }\n\n  e$3(ReplaceConnectionBehavior, CommandInterceptor);\n\n  ReplaceConnectionBehavior.$inject = [\n    'eventBus',\n    'modeling',\n    'bpmnRules',\n    'injector'\n  ];\n\n  /**\n   * @typedef {import('../../replace/BpmnReplace').default} BpmnReplace\n   * @typedef {import('../../rules/BpmnRules').default} BpmnRules\n   * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('didi').Injector} Injector\n   * @typedef {import('../Modeling').default} Modeling\n   * @typedef {import('diagram-js/lib/features/selection/Selection').default} Selection\n   */\n\n  /**\n   * BPMN-specific replace behavior.\n   *\n   * @param {BpmnReplace} bpmnReplace\n   * @param {BpmnRules} bpmnRules\n   * @param {ElementRegistry} elementRegistry\n   * @param {Injector} injector\n   * @param {Modeling} modeling\n   * @param {Selection} selection\n   */\n  function ReplaceElementBehaviour(\n      bpmnReplace,\n      bpmnRules,\n      elementRegistry,\n      injector,\n      modeling,\n      selection\n  ) {\n    injector.invoke(CommandInterceptor, this);\n\n    this._bpmnReplace = bpmnReplace;\n    this._elementRegistry = elementRegistry;\n    this._selection = selection;\n\n    // replace elements on create, e.g. during copy-paste\n    this.postExecuted([ 'elements.create' ], 500, function(event) {\n      var context = event.context,\n          target = context.parent,\n          elements = context.elements;\n\n      var elementReplacements = reduce(elements, function(replacements, element) {\n        var canReplace = bpmnRules.canReplace([ element ], element.host || element.parent || target);\n\n        return canReplace ? replacements.concat(canReplace.replacements) : replacements;\n      }, []);\n\n      if (elementReplacements.length) {\n        this._replaceElements(elements, elementReplacements);\n      }\n    }, this);\n\n    // replace elements on move\n    this.postExecuted([ 'elements.move' ], 500, function(event) {\n      var context = event.context,\n          target = context.newParent,\n          newHost = context.newHost,\n          elements = [];\n\n      forEach$1(context.closure.topLevel, function(topLevelElements) {\n        if (isEventSubProcess(topLevelElements)) {\n          elements = elements.concat(topLevelElements.children);\n        } else {\n          elements = elements.concat(topLevelElements);\n        }\n      });\n\n      // set target to host if attaching\n      if (elements.length === 1 && newHost) {\n        target = newHost;\n      }\n\n      var canReplace = bpmnRules.canReplace(elements, target);\n\n      if (canReplace) {\n        this._replaceElements(elements, canReplace.replacements, newHost);\n      }\n    }, this);\n\n    // update attachments on host replace\n    this.postExecute([ 'shape.replace' ], 1500, function(e) {\n      var context = e.context,\n          oldShape = context.oldShape,\n          newShape = context.newShape,\n          attachers = oldShape.attachers,\n          canReplace;\n\n      if (attachers && attachers.length) {\n        canReplace = bpmnRules.canReplace(attachers, newShape);\n\n        this._replaceElements(attachers, canReplace.replacements);\n      }\n\n    }, this);\n\n    // keep ID on shape replace\n    this.postExecuted([ 'shape.replace' ], 1500, function(e) {\n      var context = e.context,\n          oldShape = context.oldShape,\n          newShape = context.newShape;\n\n      modeling.unclaimId(oldShape.businessObject.id, oldShape.businessObject);\n      modeling.updateProperties(newShape, { id: oldShape.id });\n    });\n  }\n\n  e$3(ReplaceElementBehaviour, CommandInterceptor);\n\n  ReplaceElementBehaviour.prototype._replaceElements = function(elements, newElements) {\n    var elementRegistry = this._elementRegistry,\n        bpmnReplace = this._bpmnReplace,\n        selection = this._selection;\n\n    forEach$1(newElements, function(replacement) {\n      var newElement = {\n        type: replacement.newElementType\n      };\n\n      var oldElement = elementRegistry.get(replacement.oldElementId);\n\n      var idx = elements.indexOf(oldElement);\n\n      elements[idx] = bpmnReplace.replaceElement(oldElement, newElement, { select: false });\n    });\n\n    if (newElements) {\n      selection.select(elements);\n    }\n  };\n\n  ReplaceElementBehaviour.$inject = [\n    'bpmnReplace',\n    'bpmnRules',\n    'elementRegistry',\n    'injector',\n    'modeling',\n    'selection'\n  ];\n\n  var HIGH_PRIORITY$9 = 1500;\r\n\r\n  /**\r\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\r\n   *\r\n   * @typedef {import('../../../model/Types').Shape} Shape\r\n   *\r\n   * @typedef {import('diagram-js/lib/util/Types').Dimensions} Dimensions\r\n   * @typedef {import('diagram-js/lib/util/Types').Direction} Direction\r\n   * @typedef {import('diagram-js/lib/util/Types').RectTRBL} RectTRBL\r\n   */\r\n\r\n  /**\r\n   * @type {Dimensions}\r\n   */\r\n  var GROUP_MIN_DIMENSIONS = { width: 140, height: 120 };\r\n\r\n  /**\r\n   * @type {Dimensions}\r\n   */\r\n  var LANE_MIN_DIMENSIONS = { width: 300, height: 60 };\r\n\r\n  /**\r\n   * @type {Dimensions}\r\n   */\r\n  var PARTICIPANT_MIN_DIMENSIONS = { width: 300, height: 150 };\r\n\r\n  /**\r\n   * @type {Dimensions}\r\n   */\r\n  var SUB_PROCESS_MIN_DIMENSIONS = { width: 140, height: 120 };\r\n\r\n  /**\r\n   * @type {Dimensions}\r\n   */\r\n  var TEXT_ANNOTATION_MIN_DIMENSIONS = { width: 50, height: 30 };\r\n\r\n  /**\r\n   * Set minimum bounds/resize constraints on resize.\r\n   *\r\n   * @param {EventBus} eventBus\r\n   */\r\n  function ResizeBehavior(eventBus) {\r\n    eventBus.on('resize.start', HIGH_PRIORITY$9, function(event) {\r\n      var context = event.context,\r\n          shape = context.shape,\r\n          direction = context.direction,\r\n          balanced = context.balanced;\r\n\r\n      if (is$1(shape, 'bpmn:Lane') || is$1(shape, 'bpmn:Participant')) {\r\n        context.resizeConstraints = getParticipantResizeConstraints(shape, direction, balanced);\r\n      }\r\n\r\n      if (is$1(shape, 'bpmn:Participant')) {\r\n        context.minDimensions = PARTICIPANT_MIN_DIMENSIONS;\r\n      }\r\n\r\n      if (is$1(shape, 'bpmn:SubProcess') && isExpanded(shape)) {\r\n        context.minDimensions = SUB_PROCESS_MIN_DIMENSIONS;\r\n      }\r\n\r\n      if (is$1(shape, 'bpmn:TextAnnotation')) {\r\n        context.minDimensions = TEXT_ANNOTATION_MIN_DIMENSIONS;\r\n      }\r\n    });\r\n  }\r\n\r\n  ResizeBehavior.$inject = [ 'eventBus' ];\r\n\r\n\r\n  var abs$2 = Math.abs,\r\n      min = Math.min,\r\n      max$2 = Math.max;\r\n\r\n\r\n  function addToTrbl(trbl, attr, value, choice) {\r\n    var current = trbl[attr];\r\n\r\n    // make sure to set the value if it does not exist\r\n    // or apply the correct value by comparing against\r\n    // choice(value, currentValue)\r\n    trbl[attr] = current === undefined ? value : choice(value, current);\r\n  }\r\n\r\n  function addMin(trbl, attr, value) {\r\n    return addToTrbl(trbl, attr, value, min);\r\n  }\r\n\r\n  function addMax(trbl, attr, value) {\r\n    return addToTrbl(trbl, attr, value, max$2);\r\n  }\r\n\r\n  var LANE_RIGHT_PADDING = 20,\r\n      LANE_LEFT_PADDING = 50,\r\n      LANE_TOP_PADDING = 20,\r\n      LANE_BOTTOM_PADDING = 20;\r\n\r\n  /**\r\n   * @param {Shape} laneShape\r\n   * @param {Direction} resizeDirection\r\n   * @param {boolean} [balanced=false]\r\n   *\r\n   * @return { {\r\n   *   min: RectTRBL;\r\n   *   max: RectTRBL;\r\n   * } }\r\n   */\r\n  function getParticipantResizeConstraints(laneShape, resizeDirection, balanced) {\r\n    var lanesRoot = getLanesRoot(laneShape);\r\n\r\n    var isFirst = true,\r\n        isLast = true;\r\n\r\n    // max top/bottom size for lanes\r\n    var allLanes = collectLanes(lanesRoot, [ lanesRoot ]);\r\n\r\n    var laneTrbl = asTRBL(laneShape);\r\n\r\n    var maxTrbl = {},\r\n        minTrbl = {};\r\n\r\n    if (/e/.test(resizeDirection)) {\r\n      minTrbl.right = laneTrbl.left + LANE_MIN_DIMENSIONS.width;\r\n    } else\r\n    if (/w/.test(resizeDirection)) {\r\n      minTrbl.left = laneTrbl.right - LANE_MIN_DIMENSIONS.width;\r\n    }\r\n\r\n    allLanes.forEach(function(other) {\r\n\r\n      var otherTrbl = asTRBL(other);\r\n\r\n      if (/n/.test(resizeDirection)) {\r\n\r\n        if (otherTrbl.top < (laneTrbl.top - 10)) {\r\n          isFirst = false;\r\n        }\r\n\r\n        // max top size (based on next element)\r\n        if (balanced && abs$2(laneTrbl.top - otherTrbl.bottom) < 10) {\r\n          addMax(maxTrbl, 'top', otherTrbl.top + LANE_MIN_DIMENSIONS.height);\r\n        }\r\n\r\n        // min top size (based on self or nested element)\r\n        if (abs$2(laneTrbl.top - otherTrbl.top) < 5) {\r\n          addMin(minTrbl, 'top', otherTrbl.bottom - LANE_MIN_DIMENSIONS.height);\r\n        }\r\n      }\r\n\r\n      if (/s/.test(resizeDirection)) {\r\n\r\n        if (otherTrbl.bottom > (laneTrbl.bottom + 10)) {\r\n          isLast = false;\r\n        }\r\n\r\n        // max bottom size (based on previous element)\r\n        if (balanced && abs$2(laneTrbl.bottom - otherTrbl.top) < 10) {\r\n          addMin(maxTrbl, 'bottom', otherTrbl.bottom - LANE_MIN_DIMENSIONS.height);\r\n        }\r\n\r\n        // min bottom size (based on self or nested element)\r\n        if (abs$2(laneTrbl.bottom - otherTrbl.bottom) < 5) {\r\n          addMax(minTrbl, 'bottom', otherTrbl.top + LANE_MIN_DIMENSIONS.height);\r\n        }\r\n      }\r\n    });\r\n\r\n    // max top/bottom/left/right size based on flow nodes\r\n    var flowElements = lanesRoot.children.filter(function(s) {\r\n      return !s.hidden && !s.waypoints && (is$1(s, 'bpmn:FlowElement') || is$1(s, 'bpmn:Artifact'));\r\n    });\r\n\r\n    flowElements.forEach(function(flowElement) {\r\n\r\n      var flowElementTrbl = asTRBL(flowElement);\r\n\r\n      if (isFirst && /n/.test(resizeDirection)) {\r\n        addMin(minTrbl, 'top', flowElementTrbl.top - LANE_TOP_PADDING);\r\n      }\r\n\r\n      if (/e/.test(resizeDirection)) {\r\n        addMax(minTrbl, 'right', flowElementTrbl.right + LANE_RIGHT_PADDING);\r\n      }\r\n\r\n      if (isLast && /s/.test(resizeDirection)) {\r\n        addMax(minTrbl, 'bottom', flowElementTrbl.bottom + LANE_BOTTOM_PADDING);\r\n      }\r\n\r\n      if (/w/.test(resizeDirection)) {\r\n        addMin(minTrbl, 'left', flowElementTrbl.left - LANE_LEFT_PADDING);\r\n      }\r\n    });\r\n\r\n    return {\r\n      min: minTrbl,\r\n      max: maxTrbl\r\n    };\r\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  var SLIGHTLY_HIGHER_PRIORITY = 1001;\n\n\n  /**\n   * Invoke {@link Modeling#resizeLane} instead of {@link Modeling#resizeShape}\n   * when resizing a lane or participant shape.\n   *\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   */\n  function ResizeLaneBehavior(eventBus, modeling) {\n\n    eventBus.on('resize.start', SLIGHTLY_HIGHER_PRIORITY + 500, function(event) {\n      var context = event.context,\n          shape = context.shape;\n\n      if (is$1(shape, 'bpmn:Lane') || is$1(shape, 'bpmn:Participant')) {\n\n        // should we resize the opposite lane(s) in\n        // order to compensate for the resize operation?\n        context.balanced = !hasPrimaryModifier(event);\n      }\n    });\n\n    /**\n     * Intercept resize end and call resize lane function instead.\n     */\n    eventBus.on('resize.end', SLIGHTLY_HIGHER_PRIORITY, function(event) {\n      var context = event.context,\n          shape = context.shape,\n          canExecute = context.canExecute,\n          newBounds = context.newBounds;\n\n      if (is$1(shape, 'bpmn:Lane') || is$1(shape, 'bpmn:Participant')) {\n\n        if (canExecute) {\n\n          // ensure we have actual pixel values for new bounds\n          // (important when zoom level was > 1 during move)\n          newBounds = roundBounds(newBounds);\n\n          // perform the actual resize\n          modeling.resizeLane(shape, newBounds, context.balanced);\n        }\n\n        // stop propagation\n        return false;\n      }\n    });\n  }\n\n  ResizeLaneBehavior.$inject = [\n    'eventBus',\n    'modeling'\n  ];\n\n  /**\r\n   * @typedef {import('../../../Modeler').default} Modeler\r\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\r\n   * @typedef {import('didi').Injector} Injector\r\n   * @typedef {import('../../copy-paste/ModdleCopy').default} ModdleCopy\r\n   * @typedef {import('../BpmnFactory').default} BpmnFactory\r\n   *\r\n   * @typedef {import('../../../model/Types').Element} Element\r\n   * @typedef {import('../../../model/Types').Shape} Shape\r\n   *\r\n   * @typedef {import('diagram-js/lib/util/Types').DirectionTRBL} DirectionTRBL\r\n   */\r\n\r\n  var LOW_PRIORITY$a = 500;\r\n\r\n\r\n  /**\r\n   * Add referenced root elements (error, escalation, message, signal) if they don't exist.\r\n   * Copy referenced root elements on copy & paste.\r\n   *\r\n   * @param {Modeler} bpmnjs\r\n   * @param {EventBus} eventBus\r\n   * @param {Injector} injector\r\n   * @param {ModdleCopy} moddleCopy\r\n   * @param {BpmnFactory} bpmnFactory\r\n   */\r\n  function RootElementReferenceBehavior(\r\n      bpmnjs, eventBus, injector, moddleCopy, bpmnFactory\r\n  ) {\r\n    injector.invoke(CommandInterceptor, this);\r\n\r\n    function canHaveRootElementReference(element) {\r\n      return isAny(element, [ 'bpmn:ReceiveTask', 'bpmn:SendTask' ]) ||\r\n        hasAnyEventDefinition(element, [\r\n          'bpmn:ErrorEventDefinition',\r\n          'bpmn:EscalationEventDefinition',\r\n          'bpmn:MessageEventDefinition',\r\n          'bpmn:SignalEventDefinition'\r\n        ]);\r\n    }\r\n\r\n    function hasRootElement(rootElement) {\r\n      var definitions = bpmnjs.getDefinitions(),\r\n          rootElements = definitions.get('rootElements');\r\n\r\n      return !!find(rootElements, matchPattern({ id: rootElement.id }));\r\n    }\r\n\r\n    function getRootElementReferencePropertyName(eventDefinition) {\r\n      if (is$1(eventDefinition, 'bpmn:ErrorEventDefinition')) {\r\n        return 'errorRef';\r\n      } else if (is$1(eventDefinition, 'bpmn:EscalationEventDefinition')) {\r\n        return 'escalationRef';\r\n      } else if (is$1(eventDefinition, 'bpmn:MessageEventDefinition')) {\r\n        return 'messageRef';\r\n      } else if (is$1(eventDefinition, 'bpmn:SignalEventDefinition')) {\r\n        return 'signalRef';\r\n      }\r\n    }\r\n\r\n    function getRootElement(businessObject) {\r\n      if (isAny(businessObject, [ 'bpmn:ReceiveTask', 'bpmn:SendTask' ])) {\r\n        return businessObject.get('messageRef');\r\n      }\r\n\r\n      var eventDefinitions = businessObject.get('eventDefinitions'),\r\n          eventDefinition = eventDefinitions[ 0 ];\r\n\r\n      return eventDefinition.get(getRootElementReferencePropertyName(eventDefinition));\r\n    }\r\n\r\n    function setRootElement(businessObject, rootElement) {\r\n      if (isAny(businessObject, [ 'bpmn:ReceiveTask', 'bpmn:SendTask' ])) {\r\n        return businessObject.set('messageRef', rootElement);\r\n      }\r\n\r\n      var eventDefinitions = businessObject.get('eventDefinitions'),\r\n          eventDefinition = eventDefinitions[ 0 ];\r\n\r\n      return eventDefinition.set(getRootElementReferencePropertyName(eventDefinition), rootElement);\r\n    }\r\n\r\n    // create shape\r\n    this.executed([\r\n      'shape.create',\r\n      'element.updateProperties',\r\n      'element.updateModdleProperties'\r\n    ], function(context) {\r\n      var shape = context.shape || context.element;\r\n\r\n      if (!canHaveRootElementReference(shape)) {\r\n        return;\r\n      }\r\n\r\n      var businessObject = getBusinessObject(shape),\r\n          rootElement = getRootElement(businessObject),\r\n          rootElements;\r\n\r\n      if (rootElement && !hasRootElement(rootElement)) {\r\n        rootElements = bpmnjs.getDefinitions().get('rootElements');\r\n\r\n        // add root element\r\n        add(rootElements, rootElement);\r\n\r\n        context.addedRootElement = rootElement;\r\n      }\r\n    }, true);\r\n\r\n    this.reverted([\r\n      'shape.create',\r\n      'element.updateProperties',\r\n      'element.updateModdleProperties'\r\n    ], function(context) {\r\n      var addedRootElement = context.addedRootElement;\r\n\r\n      if (!addedRootElement) {\r\n        return;\r\n      }\r\n\r\n      var rootElements = bpmnjs.getDefinitions().get('rootElements');\r\n\r\n      // remove root element\r\n      remove(rootElements, addedRootElement);\r\n    }, true);\r\n\r\n    eventBus.on('copyPaste.copyElement', function(context) {\r\n      var descriptor = context.descriptor,\r\n          element = context.element;\r\n\r\n      if (element.labelTarget || !canHaveRootElementReference(element)) {\r\n        return;\r\n      }\r\n\r\n      var businessObject = getBusinessObject(element),\r\n          rootElement = getRootElement(businessObject);\r\n\r\n      if (rootElement) {\r\n\r\n        // TODO(nikku): clone on copy\r\n        descriptor.referencedRootElement = rootElement;\r\n      }\r\n    });\r\n\r\n    eventBus.on('copyPaste.pasteElement', LOW_PRIORITY$a, function(context) {\r\n      var descriptor = context.descriptor,\r\n          businessObject = descriptor.businessObject,\r\n          referencedRootElement = descriptor.referencedRootElement;\r\n\r\n      if (!referencedRootElement) {\r\n        return;\r\n      }\r\n\r\n      if (!hasRootElement(referencedRootElement)) {\r\n        referencedRootElement = moddleCopy.copyElement(\r\n          referencedRootElement,\r\n          bpmnFactory.create(referencedRootElement.$type)\r\n        );\r\n      }\r\n\r\n      setRootElement(businessObject, referencedRootElement);\r\n\r\n      delete descriptor.referencedRootElement;\r\n    });\r\n  }\r\n\r\n  RootElementReferenceBehavior.$inject = [\r\n    'bpmnjs',\r\n    'eventBus',\r\n    'injector',\r\n    'moddleCopy',\r\n    'bpmnFactory'\r\n  ];\r\n\r\n  e$3(RootElementReferenceBehavior, CommandInterceptor);\r\n\r\n  // helpers //////////\r\n\r\n  function hasAnyEventDefinition(element, types) {\r\n    if (!isArray$3(types)) {\r\n      types = [ types ];\r\n    }\r\n\r\n    return some(types, function(type) {\r\n      return hasEventDefinition$2(element, type);\r\n    });\r\n  }\n\n  /**\r\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\r\n   *\r\n   * @typedef {import('../../../model/Types').Shape} Shape\r\n   */\r\n\r\n  var max$1 = Math.max;\r\n\r\n  /**\r\n   * @param {EventBus} eventBus\r\n   */\r\n  function SpaceToolBehavior(eventBus) {\r\n    eventBus.on('spaceTool.getMinDimensions', function(context) {\r\n      var shapes = context.shapes,\r\n          axis = context.axis,\r\n          start = context.start,\r\n          minDimensions = {};\r\n\r\n      forEach$1(shapes, function(shape) {\r\n        var id = shape.id;\r\n\r\n        if (is$1(shape, 'bpmn:Participant')) {\r\n\r\n          if (isHorizontal$1(axis)) {\r\n            minDimensions[ id ] = PARTICIPANT_MIN_DIMENSIONS;\r\n          } else {\r\n            minDimensions[ id ] = {\r\n              width: PARTICIPANT_MIN_DIMENSIONS.width,\r\n              height: getParticipantMinHeight(shape, start)\r\n            };\r\n          }\r\n\r\n        }\r\n\r\n        if (is$1(shape, 'bpmn:SubProcess') && isExpanded(shape)) {\r\n          minDimensions[ id ] = SUB_PROCESS_MIN_DIMENSIONS;\r\n        }\r\n\r\n        if (is$1(shape, 'bpmn:TextAnnotation')) {\r\n          minDimensions[ id ] = TEXT_ANNOTATION_MIN_DIMENSIONS;\r\n        }\r\n\r\n        if (is$1(shape, 'bpmn:Group')) {\r\n          minDimensions[ id ] = GROUP_MIN_DIMENSIONS;\r\n        }\r\n      });\r\n\r\n      return minDimensions;\r\n    });\r\n  }\r\n\r\n  SpaceToolBehavior.$inject = [ 'eventBus' ];\r\n\r\n\r\n  // helpers //////////\r\n  function isHorizontal$1(axis) {\r\n    return axis === 'x';\r\n  }\r\n\r\n  /**\r\n   * Get minimum height for participant taking lanes into account.\r\n   *\r\n   * @param {Shape} participant\r\n   * @param {number} start\r\n   *\r\n   * @return {number}\r\n   */\r\n  function getParticipantMinHeight(participant, start) {\r\n    var lanesMinHeight;\r\n\r\n    if (!hasChildLanes(participant)) {\r\n      return PARTICIPANT_MIN_DIMENSIONS.height;\r\n    }\r\n\r\n    lanesMinHeight = getLanesMinHeight(participant, start);\r\n\r\n    return max$1(PARTICIPANT_MIN_DIMENSIONS.height, lanesMinHeight);\r\n  }\r\n\r\n  function hasChildLanes(element) {\r\n    return !!getChildLanes(element).length;\r\n  }\r\n\r\n  function getLanesMinHeight(participant, resizeStart) {\r\n    var lanes = getChildLanes(participant),\r\n        resizedLane;\r\n\r\n    // find the nested lane which is currently resized\r\n    resizedLane = findResizedLane(lanes, resizeStart);\r\n\r\n    // resized lane cannot shrink below the minimum height\r\n    // but remaining lanes' dimensions are kept intact\r\n    return participant.height - resizedLane.height + LANE_MIN_DIMENSIONS.height;\r\n  }\r\n\r\n  /**\r\n   * Find nested lane which is currently resized.\r\n   *\r\n   * @param {Shape[]} lanes\r\n   * @param {number} resizeStart\r\n   *\r\n   * @return {Shape}\r\n   */\r\n  function findResizedLane(lanes, resizeStart) {\r\n    var i, lane, childLanes;\r\n\r\n    for (i = 0; i < lanes.length; i++) {\r\n      lane = lanes[i];\r\n\r\n      // resizing current lane or a lane nested\r\n      if (resizeStart >= lane.y && resizeStart <= lane.y + lane.height) {\r\n        childLanes = getChildLanes(lane);\r\n\r\n        // a nested lane is resized\r\n        if (childLanes.length) {\r\n          return findResizedLane(childLanes, resizeStart);\r\n        }\r\n\r\n        // current lane is the resized one\r\n        return lane;\r\n      }\r\n    }\r\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../Modeling').default} Modeling\n   * @typedef {import('../ElementFactory').default} ElementFactory\n   * @typedef {import('../BpmnFactory').default} BpmnFactory\n   * @typedef {import('../../../Modeler').default} Modeler\n   * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n   *\n   * @typedef {import('../../../model/Types').Element} Element\n   * @typedef {import('../../../model/Types').Root} Root\n   * @typedef {import('../../../model/Types').ModdleElement} ModdleElement\n   */\n\n  var LOW_PRIORITY$9 = 400;\n  var HIGH_PRIORITY$8 = 600;\n\n  var DEFAULT_POSITION = {\n    x: 180,\n    y: 160\n  };\n\n\n  /**\n   * Creates bpmndi:BPMNPlane elements and canvas planes when collapsed subprocesses are created.\n   *\n   * @param {Canvas} canvas\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   * @param {ElementFactory} elementFactory\n   * @param {BpmnFactory} bpmnFactory\n   * @param {Modeler} bpmnjs\n   * @param {ElementRegistry} elementRegistry\n   */\n  function SubProcessPlaneBehavior(\n      canvas, eventBus, modeling,\n      elementFactory, bpmnFactory, bpmnjs, elementRegistry) {\n\n    CommandInterceptor.call(this, eventBus);\n\n    this._canvas = canvas;\n    this._eventBus = eventBus;\n    this._modeling = modeling;\n    this._elementFactory = elementFactory;\n    this._bpmnFactory = bpmnFactory;\n    this._bpmnjs = bpmnjs;\n    this._elementRegistry = elementRegistry;\n\n    var self = this;\n\n    function isCollapsedSubProcess(element) {\n      return is$1(element, 'bpmn:SubProcess') && !isExpanded(element);\n    }\n\n    function createRoot(context) {\n      var shape = context.shape,\n          rootElement = context.newRootElement;\n\n      var businessObject = getBusinessObject(shape);\n\n      rootElement = self._addDiagram(rootElement || businessObject);\n\n      context.newRootElement = canvas.addRootElement(rootElement);\n    }\n\n    function removeRoot(context) {\n      var shape = context.shape;\n\n      var businessObject = getBusinessObject(shape);\n      self._removeDiagram(businessObject);\n\n      var rootElement = context.newRootElement = elementRegistry.get(getPlaneIdFromShape(businessObject));\n\n      canvas.removeRootElement(rootElement);\n    }\n\n    // add plane elements for newly created sub-processes\n    // this ensures we can actually drill down into the element\n    this.executed('shape.create', function(context) {\n      var shape = context.shape;\n      if (!isCollapsedSubProcess(shape)) {\n        return;\n      }\n\n      createRoot(context);\n    }, true);\n\n\n    this.postExecuted('shape.create', function(context) {\n      var shape = context.shape,\n          rootElement = context.newRootElement;\n\n      if (!rootElement || !shape.children) {\n        return;\n      }\n\n      self._showRecursively(shape.children);\n\n      self._moveChildrenToShape(shape, rootElement);\n    }, true);\n\n\n    this.reverted('shape.create', function(context) {\n      var shape = context.shape;\n      if (!isCollapsedSubProcess(shape)) {\n        return;\n      }\n\n      removeRoot(context);\n    }, true);\n\n\n    this.preExecuted('shape.delete', function(context) {\n      var shape = context.shape;\n      if (!isCollapsedSubProcess(shape)) {\n        return;\n      }\n\n      var attachedRoot = elementRegistry.get(getPlaneIdFromShape(shape));\n\n      if (!attachedRoot) {\n        return;\n      }\n\n      modeling.removeElements(attachedRoot.children.slice());\n    }, true);\n\n\n    this.executed('shape.delete', function(context) {\n      var shape = context.shape;\n      if (!isCollapsedSubProcess(shape)) {\n        return;\n      }\n      removeRoot(context);\n    }, true);\n\n\n    this.reverted('shape.delete', function(context) {\n      var shape = context.shape;\n      if (!isCollapsedSubProcess(shape)) {\n        return;\n      }\n\n      createRoot(context);\n    }, true);\n\n\n    this.preExecuted('shape.replace', function(context) {\n      var oldShape = context.oldShape;\n      var newShape = context.newShape;\n\n      if (!isCollapsedSubProcess(oldShape) || !isCollapsedSubProcess(newShape)) {\n        return;\n      }\n\n      // old plane could have content,\n      // we remove it so it is not recursively deleted from 'shape.delete'\n      context.oldRoot = canvas.removeRootElement(getPlaneIdFromShape(oldShape));\n    }, true);\n\n\n    this.postExecuted('shape.replace', function(context) {\n      var newShape = context.newShape,\n          source = context.oldRoot,\n          target = canvas.findRoot(getPlaneIdFromShape(newShape));\n\n      if (!source || !target) {\n        return;\n      }\n      var elements = source.children;\n\n      modeling.moveElements(elements, { x: 0, y: 0 }, target);\n    }, true);\n\n\n    // rename primary elements when the secondary element changes\n    // this ensures rootElement.id = element.id + '_plane'\n    this.executed('element.updateProperties', function(context) {\n      var shape = context.element;\n\n      if (!is$1(shape, 'bpmn:SubProcess')) {\n        return;\n      }\n\n      var properties = context.properties;\n      var oldProperties = context.oldProperties;\n\n      var oldId = oldProperties.id,\n          newId = properties.id;\n\n      if (oldId === newId) {\n        return;\n      }\n\n      if (isPlane(shape)) {\n        elementRegistry.updateId(shape, toPlaneId(newId));\n        elementRegistry.updateId(oldId, newId);\n\n        return;\n      }\n\n      var planeElement = elementRegistry.get(toPlaneId(oldId));\n\n      if (!planeElement) {\n        return;\n      }\n\n      elementRegistry.updateId(toPlaneId(oldId), toPlaneId(newId));\n    }, true);\n\n\n    this.reverted('element.updateProperties', function(context) {\n      var shape = context.element;\n\n      if (!is$1(shape, 'bpmn:SubProcess')) {\n        return;\n      }\n\n      var properties = context.properties;\n      var oldProperties = context.oldProperties;\n\n      var oldId = oldProperties.id,\n          newId = properties.id;\n\n      if (oldId === newId) {\n        return;\n      }\n\n      if (isPlane(shape)) {\n        elementRegistry.updateId(shape, toPlaneId(oldId));\n        elementRegistry.updateId(newId, oldId);\n\n        return;\n      }\n\n      var planeElement = elementRegistry.get(toPlaneId(newId));\n\n      if (!planeElement) {\n        return;\n      }\n\n      elementRegistry.updateId(planeElement, toPlaneId(oldId));\n    }, true);\n\n    // re-throw element.changed to re-render primary shape if associated plane has\n    // changed (e.g. bpmn:name property has changed)\n    eventBus.on('element.changed', function(context) {\n      var element = context.element;\n\n      if (!isPlane(element)) {\n        return;\n      }\n\n      var plane = element;\n\n      var primaryShape = elementRegistry.get(getShapeIdFromPlane(plane));\n\n      // do not re-throw if no associated primary shape (e.g. bpmn:Process)\n      if (!primaryShape || primaryShape === plane) {\n        return;\n      }\n\n      eventBus.fire('element.changed', { element: primaryShape });\n    });\n\n\n    // create/remove plane for the subprocess\n    this.executed('shape.toggleCollapse', LOW_PRIORITY$9, function(context) {\n      var shape = context.shape;\n\n      if (!is$1(shape, 'bpmn:SubProcess')) {\n        return;\n      }\n\n      if (!isExpanded(shape)) {\n        createRoot(context);\n        self._showRecursively(shape.children);\n      } else {\n        removeRoot(context);\n      }\n\n    }, true);\n\n\n    // create/remove plane for the subprocess\n    this.reverted('shape.toggleCollapse', LOW_PRIORITY$9, function(context) {\n      var shape = context.shape;\n\n      if (!is$1(shape, 'bpmn:SubProcess')) {\n        return;\n      }\n\n      if (!isExpanded(shape)) {\n        createRoot(context);\n        self._showRecursively(shape.children);\n      } else {\n        removeRoot(context);\n      }\n\n    }, true);\n\n    // move elements between planes\n    this.postExecuted('shape.toggleCollapse', HIGH_PRIORITY$8, function(context) {\n      var shape = context.shape;\n\n      if (!is$1(shape, 'bpmn:SubProcess')) {\n        return;\n      }\n\n      var rootElement = context.newRootElement;\n\n      if (!rootElement) {\n        return;\n      }\n\n      if (!isExpanded(shape)) {\n\n        // collapsed\n        self._moveChildrenToShape(shape, rootElement);\n\n      } else {\n        self._moveChildrenToShape(rootElement, shape);\n      }\n    }, true);\n\n\n    // copy-paste ///////////\n\n    // add elements in plane to tree\n    eventBus.on('copyPaste.createTree', function(context) {\n      var element = context.element,\n          children = context.children;\n\n      if (!isCollapsedSubProcess(element)) {\n        return;\n      }\n\n      var id = getPlaneIdFromShape(element);\n      var parent = elementRegistry.get(id);\n\n      if (parent) {\n\n        // do not copy invisible root element\n        children.push.apply(children, parent.children);\n      }\n    });\n\n    // set plane children as direct children of collapsed shape\n    eventBus.on('copyPaste.copyElement', function(context) {\n      var descriptor = context.descriptor,\n          element = context.element,\n          elements = context.elements;\n\n      var parent = element.parent;\n\n      var isPlane = is$1(getDi(parent), 'bpmndi:BPMNPlane');\n      if (!isPlane) {\n        return;\n      }\n\n      var parentId = getShapeIdFromPlane(parent);\n\n      var referencedShape = find(elements, function(element) {\n        return element.id === parentId;\n      });\n\n      if (!referencedShape) {\n        return;\n      }\n\n      descriptor.parent = referencedShape.id;\n    });\n\n    // hide children during pasting\n    eventBus.on('copyPaste.pasteElement', function(context) {\n      var descriptor = context.descriptor;\n\n      if (!descriptor.parent) {\n        return;\n      }\n\n      if (isCollapsedSubProcess(descriptor.parent) || descriptor.parent.hidden) {\n        descriptor.hidden = true;\n      }\n    });\n\n  }\n\n  e$3(SubProcessPlaneBehavior, CommandInterceptor);\n\n  /**\n   * Moves the child elements from source to target.\n   *\n   * If the target is a plane, the children are moved to the top left corner.\n   * Otherwise, the center of the target is used.\n   *\n   * @param {Root} source\n   * @param {Root} target\n   */\n  SubProcessPlaneBehavior.prototype._moveChildrenToShape = function(source, target) {\n    var modeling = this._modeling;\n\n    var children = source.children;\n    var offset;\n\n    if (!children) {\n      return;\n    }\n\n    // add external labels that weren't children of sub process\n    children = children.concat(children.reduce(function(labels, child) {\n      if (child.label && child.label.parent !== source) {\n        return labels.concat(child.label);\n      }\n\n      return labels;\n    }, []));\n\n    // only change plane if there are no visible children, but don't move them\n    var visibleChildren = children.filter(function(child) {\n      return !child.hidden;\n    });\n\n    if (!visibleChildren.length) {\n      modeling.moveElements(children, { x: 0, y: 0 }, target, { autoResize: false });\n      return;\n    }\n\n    var childrenBounds = getBBox(visibleChildren);\n\n    // target is a plane\n    if (!target.x) {\n      offset = {\n        x: DEFAULT_POSITION.x - childrenBounds.x,\n        y: DEFAULT_POSITION.y - childrenBounds.y\n      };\n    }\n\n    // source is a plane\n    else {\n\n      // move relative to the center of the shape\n      var targetMid = getMid(target);\n      var childrenMid = getMid(childrenBounds);\n\n      offset = {\n        x: targetMid.x - childrenMid.x,\n        y: targetMid.y - childrenMid.y\n      };\n    }\n\n    modeling.moveElements(children, offset, target, { autoResize: false });\n  };\n\n  /**\n   * Sets `hidden` property on all children of the given shape.\n   *\n   * @param {Element[]} elements\n   * @param {boolean} [hidden=false]\n   *\n   * @return {Element[]}\n   */\n  SubProcessPlaneBehavior.prototype._showRecursively = function(elements, hidden) {\n    var self = this;\n\n    var result = [];\n    elements.forEach(function(element) {\n      element.hidden = !!hidden;\n\n      result = result.concat(element);\n\n      if (element.children) {\n        result = result.concat(\n          self._showRecursively(element.children, element.collapsed || hidden)\n        );\n      }\n    });\n\n    return result;\n  };\n\n  /**\n   * Adds a given root element to the BPMNDI diagrams.\n   *\n   * @param {Root|ModdleElement} planeElement\n   *\n   * @return {Root}\n   */\n  SubProcessPlaneBehavior.prototype._addDiagram = function(planeElement) {\n    var bpmnjs = this._bpmnjs;\n    var diagrams = bpmnjs.getDefinitions().diagrams;\n\n    if (!planeElement.businessObject) {\n      planeElement = this._createNewDiagram(planeElement);\n    }\n\n    diagrams.push(planeElement.di.$parent);\n\n    return planeElement;\n  };\n\n\n  /**\n   * Creates a new plane element for the given sub process.\n   *\n   * @param {ModdleElement} bpmnElement\n   *\n   * @return {Root}\n   */\n  SubProcessPlaneBehavior.prototype._createNewDiagram = function(bpmnElement) {\n    var bpmnFactory = this._bpmnFactory,\n        elementFactory = this._elementFactory;\n\n    var diPlane = bpmnFactory.create('bpmndi:BPMNPlane', {\n      bpmnElement: bpmnElement\n    });\n\n    var diDiagram = bpmnFactory.create('bpmndi:BPMNDiagram', {\n      plane: diPlane\n    });\n\n    diPlane.$parent = diDiagram;\n\n    // add a virtual element (not being drawn),\n    // a copy cat of our BpmnImporter code\n    var planeElement = elementFactory.createRoot({\n      id: getPlaneIdFromShape(bpmnElement),\n      type: bpmnElement.$type,\n      di: diPlane,\n      businessObject: bpmnElement,\n      collapsed: true\n    });\n\n    return planeElement;\n  };\n\n  /**\n   * Removes the diagram for a given root element.\n   *\n   * @param {Root} rootElement\n   *\n   * @return {ModdleElement}\n   */\n  SubProcessPlaneBehavior.prototype._removeDiagram = function(rootElement) {\n    var bpmnjs = this._bpmnjs;\n\n    var diagrams = bpmnjs.getDefinitions().diagrams;\n\n    var removedDiagram = find(diagrams, function(diagram) {\n      return diagram.plane.bpmnElement.id === rootElement.id;\n    });\n\n    diagrams.splice(diagrams.indexOf(removedDiagram), 1);\n\n    return removedDiagram;\n  };\n\n\n  SubProcessPlaneBehavior.$inject = [\n    'canvas',\n    'eventBus',\n    'modeling',\n    'elementFactory',\n    'bpmnFactory',\n    'bpmnjs',\n    'elementRegistry'\n  ];\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * Add start event replacing element with expanded sub process.\n   *\n   * @param {Injector} injector\n   * @param {Modeling} modeling\n   */\n  function SubProcessStartEventBehavior(injector, modeling) {\n    injector.invoke(CommandInterceptor, this);\n\n    this.postExecuted('shape.replace', function(event) {\n      var oldShape = event.context.oldShape,\n          newShape = event.context.newShape;\n\n      if (\n        !is$1(newShape, 'bpmn:SubProcess') ||\n        ! (is$1(oldShape, 'bpmn:Task') || is$1(oldShape, 'bpmn:CallActivity')) ||\n        !isExpanded(newShape)\n      ) {\n        return;\n      }\n\n      var position = getStartEventPosition(newShape);\n\n      modeling.createShape({ type: 'bpmn:StartEvent' }, position, newShape);\n    });\n  }\n\n  SubProcessStartEventBehavior.$inject = [\n    'injector',\n    'modeling'\n  ];\n\n  e$3(SubProcessStartEventBehavior, CommandInterceptor);\n\n  // helpers //////////\n\n  function getStartEventPosition(shape) {\n    return {\n      x: shape.x + shape.width / 6,\n      y: shape.y + shape.height / 2\n    };\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../Modeling').default} Modeling\n   *\n   * @typedef {import('../../../model/Types').Element} Element\n   * @typedef {import('../../../model/Types').Shape} Shape\n   *\n   * @typedef {import('diagram-js/lib/util/Types').DirectionTRBL} DirectionTRBL\n   */\n\n  /**\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   */\n  function ToggleCollapseConnectionBehaviour(\n      eventBus, modeling\n  ) {\n\n    CommandInterceptor.call(this, eventBus);\n\n    this.postExecuted('shape.toggleCollapse', 1500, function(context) {\n\n      // var shape = context.shape;\n      var shape = context.shape;\n\n      // only change connections when collapsing\n      if (isExpanded(shape)) {\n        return;\n      }\n\n      var allChildren = selfAndAllChildren(shape);\n\n      allChildren.forEach(function(child) {\n\n        // Ensure that the connection array is not modified during iteration\n        var incomingConnections = child.incoming.slice(),\n            outgoingConnections = child.outgoing.slice();\n\n        forEach$1(incomingConnections, function(c) {\n          handleConnection(c, true);\n        });\n\n        forEach$1(outgoingConnections, function(c) {\n          handleConnection(c, false);\n        });\n      });\n\n\n      function handleConnection(c, incoming) {\n        if (allChildren.indexOf(c.source) !== -1 && allChildren.indexOf(c.target) !== -1) {\n          return;\n        }\n\n        if (incoming) {\n          modeling.reconnectEnd(c, shape, getMid(shape));\n        } else {\n          modeling.reconnectStart(c, shape, getMid(shape));\n        }\n\n      }\n\n    }, true);\n\n  }\n\n  e$3(ToggleCollapseConnectionBehaviour, CommandInterceptor);\n\n  ToggleCollapseConnectionBehaviour.$inject = [\n    'eventBus',\n    'modeling',\n  ];\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../ElementFactory').default} ElementFactory\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  var LOW_PRIORITY$8 = 500;\n\n  /**\n   * @param {EventBus} eventBus\n   * @param {ElementFactory} elementFactory\n   * @param {Modeling} modeling\n   */\n  function ToggleElementCollapseBehaviour(\n      eventBus, elementFactory, modeling) {\n\n    CommandInterceptor.call(this, eventBus);\n\n\n    function hideEmptyLabels(children) {\n      if (children.length) {\n        children.forEach(function(child) {\n          if (child.type === 'label' && !child.businessObject.name) {\n            child.hidden = true;\n          }\n        });\n      }\n    }\n\n    function expandedBounds(shape, defaultSize) {\n      var children = shape.children,\n          newBounds = defaultSize,\n          visibleElements,\n          visibleBBox;\n\n      visibleElements = filterVisible(children).concat([ shape ]);\n\n      visibleBBox = computeChildrenBBox(visibleElements);\n\n      if (visibleBBox) {\n\n        // center to visibleBBox with max(defaultSize, childrenBounds)\n        newBounds.width = Math.max(visibleBBox.width, newBounds.width);\n        newBounds.height = Math.max(visibleBBox.height, newBounds.height);\n\n        newBounds.x = visibleBBox.x + (visibleBBox.width - newBounds.width) / 2;\n        newBounds.y = visibleBBox.y + (visibleBBox.height - newBounds.height) / 2;\n      } else {\n\n        // center to collapsed shape with defaultSize\n        newBounds.x = shape.x + (shape.width - newBounds.width) / 2;\n        newBounds.y = shape.y + (shape.height - newBounds.height) / 2;\n      }\n\n      return newBounds;\n    }\n\n    function collapsedBounds(shape, defaultSize) {\n\n      return {\n        x: shape.x + (shape.width - defaultSize.width) / 2,\n        y: shape.y + (shape.height - defaultSize.height) / 2,\n        width: defaultSize.width,\n        height: defaultSize.height\n      };\n    }\n\n    this.executed([ 'shape.toggleCollapse' ], LOW_PRIORITY$8, function(e) {\n\n      var context = e.context,\n          shape = context.shape;\n\n      if (!is$1(shape, 'bpmn:SubProcess')) {\n        return;\n      }\n\n      if (!shape.collapsed) {\n\n        // all children got made visible through djs, hide empty labels\n        hideEmptyLabels(shape.children);\n\n        // remove collapsed marker\n        getDi(shape).isExpanded = true;\n      } else {\n\n        // place collapsed marker\n        getDi(shape).isExpanded = false;\n      }\n    });\n\n    this.reverted([ 'shape.toggleCollapse' ], LOW_PRIORITY$8, function(e) {\n\n      var context = e.context;\n      var shape = context.shape;\n\n\n      // revert removing/placing collapsed marker\n      if (!shape.collapsed) {\n        getDi(shape).isExpanded = true;\n\n      } else {\n        getDi(shape).isExpanded = false;\n      }\n    });\n\n    this.postExecuted([ 'shape.toggleCollapse' ], LOW_PRIORITY$8, function(e) {\n      var shape = e.context.shape,\n          defaultSize = elementFactory.getDefaultSize(shape),\n          newBounds;\n\n      if (shape.collapsed) {\n\n        // resize to default size of collapsed shapes\n        newBounds = collapsedBounds(shape, defaultSize);\n      } else {\n\n        // resize to bounds of max(visible children, defaultSize)\n        newBounds = expandedBounds(shape, defaultSize);\n      }\n\n      modeling.resizeShape(shape, newBounds, null, {\n        autoResize: shape.collapsed ? false : 'nwse'\n      });\n    });\n\n  }\n\n\n  e$3(ToggleElementCollapseBehaviour, CommandInterceptor);\n\n  ToggleElementCollapseBehaviour.$inject = [\n    'eventBus',\n    'elementFactory',\n    'modeling'\n  ];\n\n\n  // helpers //////////////////////\n\n  function filterVisible(elements) {\n    return elements.filter(function(e) {\n      return !e.hidden;\n    });\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('didi').Injector} Injector\n   * @typedef {import('../Modeling').default} Modeling\n   *\n   * @typedef {import('../../../model/Types').Moddle} Moddle\n   */\n\n  /**\n   * Unclaims model IDs on element deletion.\n   *\n   * @param {Canvas} canvas\n   * @param {Injector} injector\n   * @param {Moddle} moddle\n   * @param {Modeling} modeling\n   */\n  function UnclaimIdBehavior(canvas, injector, moddle, modeling) {\n    injector.invoke(CommandInterceptor, this);\n\n    this.preExecute('shape.delete', function(event) {\n      var context = event.context,\n          shape = context.shape,\n          shapeBo = shape.businessObject;\n\n      if (isLabel(shape)) {\n        return;\n      }\n\n      if (is$1(shape, 'bpmn:Participant') && isExpanded(shape)) {\n        moddle.ids.unclaim(shapeBo.processRef.id);\n      }\n\n      modeling.unclaimId(shapeBo.id, shapeBo);\n    });\n\n\n    this.preExecute('connection.delete', function(event) {\n      var context = event.context,\n          connection = context.connection,\n          connectionBo = connection.businessObject;\n\n      modeling.unclaimId(connectionBo.id, connectionBo);\n    });\n\n    this.preExecute('canvas.updateRoot', function() {\n      var rootElement = canvas.getRootElement(),\n          rootElementBo = rootElement.businessObject;\n\n      if (is$1(rootElement, 'bpmn:Collaboration')) {\n        moddle.ids.unclaim(rootElementBo.id);\n      }\n    });\n  }\n\n  e$3(UnclaimIdBehavior, CommandInterceptor);\n\n  UnclaimIdBehavior.$inject = [ 'canvas', 'injector', 'moddle', 'modeling' ];\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * A behavior that unsets the Default property of sequence flow source on\n   * element delete, if the removed element is the Gateway or Task's default flow.\n   *\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   */\n  function DeleteSequenceFlowBehavior(eventBus, modeling) {\n\n    CommandInterceptor.call(this, eventBus);\n\n\n    this.preExecute('connection.delete', function(event) {\n      var context = event.context,\n          connection = context.connection,\n          source = connection.source;\n\n      if (isDefaultFlow(connection, source)) {\n        modeling.updateProperties(source, {\n          'default': null\n        });\n      }\n    });\n  }\n\n  e$3(DeleteSequenceFlowBehavior, CommandInterceptor);\n\n  DeleteSequenceFlowBehavior.$inject = [\n    'eventBus',\n    'modeling'\n  ];\n\n\n  // helpers //////////////////////\n\n  function isDefaultFlow(connection, source) {\n\n    if (!is$1(connection, 'bpmn:SequenceFlow')) {\n      return false;\n    }\n\n    var sourceBo = getBusinessObject(source),\n        sequenceFlow = getBusinessObject(connection);\n\n    return sourceBo.get('default') === sequenceFlow;\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../Modeling').default} Modeling\n   * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n   */\n\n  var LOW_PRIORITY$7 = 500,\n      HIGH_PRIORITY$7 = 5000;\n\n\n  /**\n   * BPMN specific delete lane behavior.\n   *\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   * @param {Translate} translate\n   */\n  function UpdateFlowNodeRefsBehavior(eventBus, modeling, translate) {\n\n    CommandInterceptor.call(this, eventBus);\n\n    /**\n     * Update Lane#flowNodeRefs and FlowNode#lanes with every flow node\n     * move/resize and lane move/resize. Groups elements to recompute containments\n     * as efficient as possible.\n     */\n\n    // the update context\n    var context;\n\n\n    function initContext() {\n      context = context || new UpdateContext();\n      context.enter();\n\n      return context;\n    }\n\n    function getContext() {\n      if (!context) {\n        throw new Error(translate('out of bounds release'));\n      }\n\n      return context;\n    }\n\n    function releaseContext() {\n\n      if (!context) {\n        throw new Error(translate('out of bounds release'));\n      }\n\n      var triggerUpdate = context.leave();\n\n      if (triggerUpdate) {\n        modeling.updateLaneRefs(context.flowNodes, context.lanes);\n\n        context = null;\n      }\n\n      return triggerUpdate;\n    }\n\n\n    var laneRefUpdateEvents = [\n      'spaceTool',\n      'lane.add',\n      'lane.resize',\n      'lane.split',\n      'elements.create',\n      'elements.delete',\n      'elements.move',\n      'shape.create',\n      'shape.delete',\n      'shape.move',\n      'shape.resize'\n    ];\n\n\n    // listen to a lot of stuff to group lane updates\n\n    this.preExecute(laneRefUpdateEvents, HIGH_PRIORITY$7, function(event) {\n      initContext();\n    });\n\n    this.postExecuted(laneRefUpdateEvents, LOW_PRIORITY$7, function(event) {\n      releaseContext();\n    });\n\n\n    // Mark flow nodes + lanes that need an update\n\n    this.preExecute([\n      'shape.create',\n      'shape.move',\n      'shape.delete',\n      'shape.resize'\n    ], function(event) {\n\n      var context = event.context,\n          shape = context.shape;\n\n      var updateContext = getContext();\n\n      // no need to update labels\n      if (shape.labelTarget) {\n        return;\n      }\n\n      if (is$1(shape, 'bpmn:Lane')) {\n        updateContext.addLane(shape);\n      }\n\n      if (is$1(shape, 'bpmn:FlowNode')) {\n        updateContext.addFlowNode(shape);\n      }\n    });\n  }\n\n  UpdateFlowNodeRefsBehavior.$inject = [\n    'eventBus',\n    'modeling' ,\n    'translate'\n  ];\n\n  e$3(UpdateFlowNodeRefsBehavior, CommandInterceptor);\n\n\n  function UpdateContext() {\n\n    this.flowNodes = [];\n    this.lanes = [];\n\n    this.counter = 0;\n\n    this.addLane = function(lane) {\n      this.lanes.push(lane);\n    };\n\n    this.addFlowNode = function(flowNode) {\n      this.flowNodes.push(flowNode);\n    };\n\n    this.enter = function() {\n      this.counter++;\n    };\n\n    this.leave = function() {\n      this.counter--;\n\n      return !this.counter;\n    };\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var BehaviorModule = {\n    __init__: [\n      'adaptiveLabelPositioningBehavior',\n      'appendBehavior',\n      'associationBehavior',\n      'attachEventBehavior',\n      'boundaryEventBehavior',\n      'createBehavior',\n      'createDataObjectBehavior',\n      'createParticipantBehavior',\n      'dataInputAssociationBehavior',\n      'dataStoreBehavior',\n      'deleteLaneBehavior',\n      'detachEventBehavior',\n      'dropOnFlowBehavior',\n      'eventBasedGatewayBehavior',\n      'fixHoverBehavior',\n      'groupBehavior',\n      'importDockingFix',\n      'isHorizontalFix',\n      'labelBehavior',\n      'layoutConnectionBehavior',\n      'messageFlowBehavior',\n      'modelingFeedback',\n      'removeElementBehavior',\n      'removeEmbeddedLabelBoundsBehavior',\n      'removeParticipantBehavior',\n      'replaceConnectionBehavior',\n      'replaceElementBehaviour',\n      'resizeBehavior',\n      'resizeLaneBehavior',\n      'rootElementReferenceBehavior',\n      'spaceToolBehavior',\n      'subProcessPlaneBehavior',\n      'subProcessStartEventBehavior',\n      'toggleCollapseConnectionBehaviour',\n      'toggleElementCollapseBehaviour',\n      'unclaimIdBehavior',\n      'updateFlowNodeRefsBehavior',\n      'unsetDefaultFlowBehavior'\n    ],\n    adaptiveLabelPositioningBehavior: [ 'type', AdaptiveLabelPositioningBehavior ],\n    appendBehavior: [ 'type', AppendBehavior ],\n    associationBehavior: [ 'type', AssociationBehavior ],\n    attachEventBehavior: [ 'type', AttachEventBehavior ],\n    boundaryEventBehavior: [ 'type', BoundaryEventBehavior ],\n    createBehavior: [ 'type', CreateBehavior ],\n    createDataObjectBehavior: [ 'type', CreateDataObjectBehavior ],\n    createParticipantBehavior: [ 'type', CreateParticipantBehavior ],\n    dataInputAssociationBehavior: [ 'type', DataInputAssociationBehavior ],\n    dataStoreBehavior: [ 'type', DataStoreBehavior ],\n    deleteLaneBehavior: [ 'type', DeleteLaneBehavior ],\n    detachEventBehavior: [ 'type', DetachEventBehavior ],\n    dropOnFlowBehavior: [ 'type', DropOnFlowBehavior ],\n    eventBasedGatewayBehavior: [ 'type', EventBasedGatewayBehavior ],\n    fixHoverBehavior: [ 'type', FixHoverBehavior ],\n    groupBehavior: [ 'type', GroupBehavior ],\n    importDockingFix: [ 'type', ImportDockingFix ],\n    isHorizontalFix: [ 'type', IsHorizontalFix ],\n    labelBehavior: [ 'type', LabelBehavior ],\n    layoutConnectionBehavior: [ 'type', LayoutConnectionBehavior ],\n    messageFlowBehavior: [ 'type', MessageFlowBehavior ],\n    modelingFeedback: [ 'type', ModelingFeedback ],\n    removeElementBehavior: [ 'type', RemoveElementBehavior ],\n    removeEmbeddedLabelBoundsBehavior: [ 'type', RemoveEmbeddedLabelBoundsBehavior ],\n    removeParticipantBehavior: [ 'type', RemoveParticipantBehavior ],\n    replaceConnectionBehavior: [ 'type', ReplaceConnectionBehavior ],\n    replaceElementBehaviour: [ 'type', ReplaceElementBehaviour ],\n    resizeBehavior: [ 'type', ResizeBehavior ],\n    resizeLaneBehavior: [ 'type', ResizeLaneBehavior ],\n    rootElementReferenceBehavior: [ 'type', RootElementReferenceBehavior ],\n    spaceToolBehavior: [ 'type', SpaceToolBehavior ],\n    subProcessPlaneBehavior: [ 'type', SubProcessPlaneBehavior ],\n    subProcessStartEventBehavior: [ 'type', SubProcessStartEventBehavior ],\n    toggleCollapseConnectionBehaviour: [ 'type', ToggleCollapseConnectionBehaviour ],\n    toggleElementCollapseBehaviour : [ 'type', ToggleElementCollapseBehaviour ],\n    unclaimIdBehavior: [ 'type', UnclaimIdBehavior ],\n    unsetDefaultFlowBehavior: [ 'type', DeleteSequenceFlowBehavior ],\n    updateFlowNodeRefsBehavior: [ 'type', UpdateFlowNodeRefsBehavior ]\n  };\n\n  /**\r\n   * @typedef {import('diagram-js/lib/util/Types').DirectionTRBL} DirectionTRBL\r\n   * @typedef {import('diagram-js/lib/util/Types').Point} Point\r\n   * @typedef {import('diagram-js/lib/util/Types').Rect} Rect\r\n   */\r\n\r\n  /**\r\n   * @param {Point} position\r\n   * @param {Rect} targetBounds\r\n   *\r\n   * @return {DirectionTRBL|null}\r\n   */\r\n  function getBoundaryAttachment(position, targetBounds) {\r\n\r\n    var orientation = getOrientation(position, targetBounds, -15);\r\n\r\n    if (orientation !== 'intersect') {\r\n      return orientation;\r\n    } else {\r\n      return null;\r\n    }\r\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   *\n   * @typedef {import('../../model/Types').Connection} Connection\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Shape} Shape\n   * @typedef {import('../../model/Types').ModdleElement} ModdleElement\n   *\n   * @typedef {import('diagram-js/lib/util/Types').Point} Point\n   * @typedef {import('diagram-js/lib/util/Types').Rect} Rect\n   *\n   * @typedef { {\n   *   associationDirection?: string;\n   *   type: string;\n   * } | boolean | null } CanConnectResult\n   *\n   * @typedef { {\n   *   id: string;\n   *   type: string;\n   * } | boolean } CanReplaceResult\n   */\n\n  /**\n   * BPMN-specific modeling rules.\n   *\n   * @param {EventBus} eventBus\n   */\n  function BpmnRules(eventBus) {\n    RuleProvider.call(this, eventBus);\n  }\n\n  e$3(BpmnRules, RuleProvider);\n\n  BpmnRules.$inject = [ 'eventBus' ];\n\n  BpmnRules.prototype.init = function() {\n\n    this.addRule('connection.start', function(context) {\n      var source = context.source;\n\n      return canStartConnection(source);\n    });\n\n    this.addRule('connection.create', function(context) {\n      var source = context.source,\n          target = context.target,\n          hints = context.hints || {},\n          targetParent = hints.targetParent,\n          targetAttach = hints.targetAttach;\n\n      // don't allow incoming connections on\n      // newly created boundary events\n      // to boundary events\n      if (targetAttach) {\n        return false;\n      }\n\n      // temporarily set target parent for scoping\n      // checks to work\n      if (targetParent) {\n        target.parent = targetParent;\n      }\n\n      try {\n        return canConnect(source, target);\n      } finally {\n\n        // unset temporary target parent\n        if (targetParent) {\n          target.parent = null;\n        }\n      }\n    });\n\n    this.addRule('connection.reconnect', function(context) {\n\n      var connection = context.connection,\n          source = context.source,\n          target = context.target;\n\n      return canConnect(source, target, connection);\n    });\n\n    this.addRule('connection.updateWaypoints', function(context) {\n      return {\n        type: context.connection.type\n      };\n    });\n\n    this.addRule('shape.resize', function(context) {\n\n      var shape = context.shape,\n          newBounds = context.newBounds;\n\n      return canResize(shape, newBounds);\n    });\n\n    this.addRule('elements.create', function(context) {\n      var elements = context.elements,\n          position = context.position,\n          target = context.target;\n\n      if (isConnection(target) && !canInsert(elements, target)) {\n        return false;\n      }\n\n      return every(elements, function(element) {\n        if (isConnection(element)) {\n          return canConnect(element.source, element.target, element);\n        }\n\n        if (element.host) {\n          return canAttach(element, element.host, null, position);\n        }\n\n        return canCreate(element, target, null);\n      });\n    });\n\n    this.addRule('elements.move', function(context) {\n\n      var target = context.target,\n          shapes = context.shapes,\n          position = context.position;\n\n      return canAttach(shapes, target, null, position) ||\n             canReplace(shapes, target, position) ||\n             canMove(shapes, target) ||\n             canInsert(shapes, target);\n    });\n\n    this.addRule('shape.create', function(context) {\n      return canCreate(\n        context.shape,\n        context.target,\n        context.source,\n        context.position\n      );\n    });\n\n    this.addRule('shape.attach', function(context) {\n\n      return canAttach(\n        context.shape,\n        context.target,\n        null,\n        context.position\n      );\n    });\n\n    this.addRule('element.copy', function(context) {\n      var element = context.element,\n          elements = context.elements;\n\n      return canCopy(elements, element);\n    });\n  };\n\n  BpmnRules.prototype.canConnectMessageFlow = canConnectMessageFlow;\n\n  BpmnRules.prototype.canConnectSequenceFlow = canConnectSequenceFlow;\n\n  BpmnRules.prototype.canConnectDataAssociation = canConnectDataAssociation;\n\n  BpmnRules.prototype.canConnectAssociation = canConnectAssociation;\n\n  BpmnRules.prototype.canMove = canMove;\n\n  BpmnRules.prototype.canAttach = canAttach;\n\n  BpmnRules.prototype.canReplace = canReplace;\n\n  BpmnRules.prototype.canDrop = canDrop;\n\n  BpmnRules.prototype.canInsert = canInsert;\n\n  BpmnRules.prototype.canCreate = canCreate;\n\n  BpmnRules.prototype.canConnect = canConnect;\n\n  BpmnRules.prototype.canResize = canResize;\n\n  BpmnRules.prototype.canCopy = canCopy;\n\n  /**\n   * Utility functions for rule checking\n   */\n\n  /**\n   * Checks if given element can be used for starting connection.\n   *\n   * @param  {Element} source\n   *\n   * @return {boolean}\n   */\n  function canStartConnection(element) {\n    if (nonExistingOrLabel(element)) {\n      return null;\n    }\n\n    return isAny(element, [\n      'bpmn:FlowNode',\n      'bpmn:InteractionNode',\n      'bpmn:DataObjectReference',\n      'bpmn:DataStoreReference',\n      'bpmn:Group',\n      'bpmn:TextAnnotation'\n    ]);\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function nonExistingOrLabel(element) {\n    return !element || isLabel(element);\n  }\n\n  function isSame$1(a, b) {\n    return a === b;\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {ModdleElement}\n   */\n  function getOrganizationalParent(element) {\n\n    do {\n      if (is$1(element, 'bpmn:Process')) {\n        return getBusinessObject(element);\n      }\n\n      if (is$1(element, 'bpmn:Participant')) {\n        return (\n          getBusinessObject(element).processRef ||\n          getBusinessObject(element)\n        );\n      }\n    } while ((element = element.parent));\n\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isTextAnnotation(element) {\n    return is$1(element, 'bpmn:TextAnnotation');\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isGroup(element) {\n    return is$1(element, 'bpmn:Group') && !element.labelTarget;\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isCompensationBoundary(element) {\n    return is$1(element, 'bpmn:BoundaryEvent') &&\n           hasEventDefinition(element, 'bpmn:CompensateEventDefinition');\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isForCompensation(element) {\n    return getBusinessObject(element).isForCompensation;\n  }\n\n  /**\n   * @param {Element} a\n   * @param {Element} b\n   *\n   * @return {boolean}\n   */\n  function isSameOrganization(a, b) {\n    var parentA = getOrganizationalParent(a),\n        parentB = getOrganizationalParent(b);\n\n    return parentA === parentB;\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isMessageFlowSource(element) {\n    return (\n      is$1(element, 'bpmn:InteractionNode') &&\n      !is$1(element, 'bpmn:BoundaryEvent') && (\n        !is$1(element, 'bpmn:Event') || (\n          is$1(element, 'bpmn:ThrowEvent') &&\n          hasEventDefinitionOrNone(element, 'bpmn:MessageEventDefinition')\n        )\n      )\n    );\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isMessageFlowTarget(element) {\n    return (\n      is$1(element, 'bpmn:InteractionNode') &&\n      !isForCompensation(element) && (\n        !is$1(element, 'bpmn:Event') || (\n          is$1(element, 'bpmn:CatchEvent') &&\n          hasEventDefinitionOrNone(element, 'bpmn:MessageEventDefinition')\n        )\n      ) && !(\n        is$1(element, 'bpmn:BoundaryEvent') &&\n        !hasEventDefinition(element, 'bpmn:MessageEventDefinition')\n      )\n    );\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {ModdleElement}\n   */\n  function getScopeParent(element) {\n\n    var parent = element;\n\n    while ((parent = parent.parent)) {\n\n      if (is$1(parent, 'bpmn:FlowElementsContainer')) {\n        return getBusinessObject(parent);\n      }\n\n      if (is$1(parent, 'bpmn:Participant')) {\n        return getBusinessObject(parent).processRef;\n      }\n    }\n\n    return null;\n  }\n\n  /**\n   * @param {Element} a\n   * @param {Element} b\n   *\n   * @return {boolean}\n   */\n  function isSameScope(a, b) {\n    var scopeParentA = getScopeParent(a),\n        scopeParentB = getScopeParent(b);\n\n    return scopeParentA === scopeParentB;\n  }\n\n  /**\n   * @param {Element} element\n   * @param {string} eventDefinition\n   *\n   * @return {boolean}\n   */\n  function hasEventDefinition(element, eventDefinition) {\n    var businessObject = getBusinessObject(element);\n\n    return !!find(businessObject.eventDefinitions || [], function(definition) {\n      return is$1(definition, eventDefinition);\n    });\n  }\n\n  /**\n   * @param {Element} element\n   * @param {string} eventDefinition\n   *\n   * @return {boolean}\n   */\n  function hasEventDefinitionOrNone(element, eventDefinition) {\n    var businessObject = getBusinessObject(element);\n\n    return (businessObject.eventDefinitions || []).every(function(definition) {\n      return is$1(definition, eventDefinition);\n    });\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isSequenceFlowSource(element) {\n    return (\n      is$1(element, 'bpmn:FlowNode') &&\n      !is$1(element, 'bpmn:EndEvent') &&\n      !isEventSubProcess(element) &&\n      !(is$1(element, 'bpmn:IntermediateThrowEvent') &&\n        hasEventDefinition(element, 'bpmn:LinkEventDefinition')\n      ) &&\n      !isCompensationBoundary(element) &&\n      !isForCompensation(element)\n    );\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isSequenceFlowTarget(element) {\n    return (\n      is$1(element, 'bpmn:FlowNode') &&\n      !is$1(element, 'bpmn:StartEvent') &&\n      !is$1(element, 'bpmn:BoundaryEvent') &&\n      !isEventSubProcess(element) &&\n      !(is$1(element, 'bpmn:IntermediateCatchEvent') &&\n        hasEventDefinition(element, 'bpmn:LinkEventDefinition')\n      ) &&\n      !isForCompensation(element)\n    );\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isEventBasedTarget(element) {\n    return (\n      is$1(element, 'bpmn:ReceiveTask') || (\n        is$1(element, 'bpmn:IntermediateCatchEvent') && (\n          hasEventDefinition(element, 'bpmn:MessageEventDefinition') ||\n          hasEventDefinition(element, 'bpmn:TimerEventDefinition') ||\n          hasEventDefinition(element, 'bpmn:ConditionalEventDefinition') ||\n          hasEventDefinition(element, 'bpmn:SignalEventDefinition')\n        )\n      )\n    );\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {Shape[]}\n   */\n  function getParents(element) {\n\n    var parents = [];\n\n    while (element) {\n      element = element.parent;\n\n      if (element) {\n        parents.push(element);\n      }\n    }\n\n    return parents;\n  }\n\n  /**\n   * @param {Shape} possibleParent\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isParent(possibleParent, element) {\n    var allParents = getParents(element);\n\n    return allParents.indexOf(possibleParent) !== -1;\n  }\n\n  /**\n   * @param {Element} source\n   * @param {Element} target\n   * @param {Connection} connection\n   *\n   * @return {CanConnectResult}\n   */\n  function canConnect(source, target, connection) {\n\n    if (nonExistingOrLabel(source) || nonExistingOrLabel(target)) {\n      return null;\n    }\n\n    if (!is$1(connection, 'bpmn:DataAssociation')) {\n\n      if (canConnectMessageFlow(source, target)) {\n        return { type: 'bpmn:MessageFlow' };\n      }\n\n      if (canConnectSequenceFlow(source, target)) {\n        return { type: 'bpmn:SequenceFlow' };\n      }\n    }\n\n    var connectDataAssociation = canConnectDataAssociation(source, target);\n\n    if (connectDataAssociation) {\n      return connectDataAssociation;\n    }\n\n    if (isCompensationBoundary(source) && isForCompensation(target)) {\n      return {\n        type: 'bpmn:Association',\n        associationDirection: 'One'\n      };\n    }\n\n    if (canConnectAssociation(source, target)) {\n\n      return {\n        type: 'bpmn:Association'\n      };\n    }\n\n    return false;\n  }\n\n  /**\n   * Can an element be dropped into the target element.\n   *\n   * @param {Element} element\n   * @param {Shape} target\n   *\n   * @return {boolean}\n   */\n  function canDrop(element, target) {\n\n    // can move labels and groups everywhere\n    if (isLabel(element) || isGroup(element)) {\n      return true;\n    }\n\n\n    // disallow to create elements on collapsed pools\n    if (is$1(target, 'bpmn:Participant') && !isExpanded(target)) {\n      return false;\n    }\n\n    // allow to create new participants on\n    // existing collaboration and process diagrams\n    if (is$1(element, 'bpmn:Participant')) {\n      return is$1(target, 'bpmn:Process') || is$1(target, 'bpmn:Collaboration');\n    }\n\n    // allow moving DataInput / DataOutput within its original container only\n    if (isAny(element, [ 'bpmn:DataInput', 'bpmn:DataOutput' ])) {\n\n      if (element.parent) {\n        return target === element.parent;\n      }\n    }\n\n    // allow creating lanes on participants and other lanes only\n    if (is$1(element, 'bpmn:Lane')) {\n      return is$1(target, 'bpmn:Participant') || is$1(target, 'bpmn:Lane');\n    }\n\n    // disallow dropping boundary events which cannot replace with intermediate event\n    if (is$1(element, 'bpmn:BoundaryEvent') && !isDroppableBoundaryEvent(element)) {\n      return false;\n    }\n\n    // drop flow elements onto flow element containers\n    // and participants\n    if (is$1(element, 'bpmn:FlowElement') && !is$1(element, 'bpmn:DataStoreReference')) {\n      if (is$1(target, 'bpmn:FlowElementsContainer')) {\n        return isExpanded(target);\n      }\n\n      return isAny(target, [ 'bpmn:Participant', 'bpmn:Lane' ]);\n    }\n\n    // disallow dropping data store reference if there is no process to append to\n    if (is$1(element, 'bpmn:DataStoreReference') && is$1(target, 'bpmn:Collaboration')) {\n      return some(getBusinessObject(target).get('participants'), function(participant) {\n        return !!participant.get('processRef');\n      });\n    }\n\n    // account for the fact that data associations are always\n    // rendered and moved to top (Process or Collaboration level)\n    //\n    // artifacts may be placed wherever, too\n    if (isAny(element, [ 'bpmn:Artifact', 'bpmn:DataAssociation', 'bpmn:DataStoreReference' ])) {\n      return isAny(target, [\n        'bpmn:Collaboration',\n        'bpmn:Lane',\n        'bpmn:Participant',\n        'bpmn:Process',\n        'bpmn:SubProcess' ]);\n    }\n\n    if (is$1(element, 'bpmn:MessageFlow')) {\n      return is$1(target, 'bpmn:Collaboration')\n        || element.source.parent == target\n        || element.target.parent == target;\n    }\n\n    return false;\n  }\n\n  /**\n   * @param {Shape} event\n   *\n   * @return {boolean}\n   */\n  function isDroppableBoundaryEvent(event) {\n    return getBusinessObject(event).cancelActivity && (\n      hasNoEventDefinition(event) || hasCommonBoundaryIntermediateEventDefinition(event)\n    );\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isBoundaryEvent(element) {\n    return !isLabel(element) && is$1(element, 'bpmn:BoundaryEvent');\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isLane(element) {\n    return is$1(element, 'bpmn:Lane');\n  }\n\n  /**\n   * `bpmn:IntermediateThrowEvents` are treated as boundary events during create.\n   *\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isBoundaryCandidate(element) {\n    if (isBoundaryEvent(element)) {\n      return true;\n    }\n\n    if (is$1(element, 'bpmn:IntermediateThrowEvent') && hasNoEventDefinition(element)) {\n      return true;\n    }\n\n    return (\n      is$1(element, 'bpmn:IntermediateCatchEvent') &&\n      hasCommonBoundaryIntermediateEventDefinition(element)\n    );\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function hasNoEventDefinition(element) {\n    var businessObject = getBusinessObject(element);\n\n    return businessObject && !(businessObject.eventDefinitions && businessObject.eventDefinitions.length);\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function hasCommonBoundaryIntermediateEventDefinition(element) {\n    return hasOneOfEventDefinitions(element, [\n      'bpmn:MessageEventDefinition',\n      'bpmn:TimerEventDefinition',\n      'bpmn:SignalEventDefinition',\n      'bpmn:ConditionalEventDefinition'\n    ]);\n  }\n\n  /**\n   * @param {Element} element\n   * @param {string[]} eventDefinitions\n   *\n   * @return {boolean}\n   */\n  function hasOneOfEventDefinitions(element, eventDefinitions) {\n    return eventDefinitions.some(function(definition) {\n      return hasEventDefinition(element, definition);\n    });\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isReceiveTaskAfterEventBasedGateway(element) {\n    return (\n      is$1(element, 'bpmn:ReceiveTask') &&\n      find(element.incoming, function(incoming) {\n        return is$1(incoming.source, 'bpmn:EventBasedGateway');\n      })\n    );\n  }\n\n  /**\n   * TODO(philippfromme): remove `source` parameter\n   *\n   * @param {Element[]} elements\n   * @param {Shape} target\n   * @param {Element} source\n   * @param {Point} [position]\n   *\n   * @return {boolean | 'attach'}\n   */\n  function canAttach(elements, target, source, position) {\n\n    if (!Array.isArray(elements)) {\n      elements = [ elements ];\n    }\n\n    // only (re-)attach one element at a time\n    if (elements.length !== 1) {\n      return false;\n    }\n\n    var element = elements[0];\n\n    // do not attach labels\n    if (isLabel(element)) {\n      return false;\n    }\n\n    // only handle boundary events\n    if (!isBoundaryCandidate(element)) {\n      return false;\n    }\n\n    // disallow drop on event sub processes\n    if (isEventSubProcess(target)) {\n      return false;\n    }\n\n    // only allow drop on non compensation activities\n    if (!is$1(target, 'bpmn:Activity') || isForCompensation(target)) {\n      return false;\n    }\n\n    // only attach to subprocess border\n    if (position && !getBoundaryAttachment(position, target)) {\n      return false;\n    }\n\n    // do not attach on receive tasks after event based gateways\n    if (isReceiveTaskAfterEventBasedGateway(target)) {\n      return false;\n    }\n\n    return 'attach';\n  }\n\n  /**\n   * Check whether the given elements can be replaced. Return all elements which\n   * can be replaced.\n   *\n   * @example\n   *\n   * ```javascript\n   * [{\n   *   id: 'IntermediateEvent_1',\n   *   type: 'bpmn:StartEvent'\n   * },\n   * {\n   *   id: 'Task_1',\n   *   type: 'bpmn:ServiceTask'\n   * }]\n   * ```\n   *\n   * @param  {Element[]} elements\n   * @param  {Shape} [target]\n   * @param  {Point} [position]\n   *\n   * @return {CanReplaceResult}\n   */\n  function canReplace(elements, target, position) {\n\n    if (!target) {\n      return false;\n    }\n\n    var canExecute = {\n      replacements: []\n    };\n\n    forEach$1(elements, function(element) {\n\n      if (!isEventSubProcess(target)) {\n\n        if (is$1(element, 'bpmn:StartEvent') &&\n            element.type !== 'label' &&\n            canDrop(element, target)) {\n\n          // replace a non-interrupting start event by a blank interrupting start event\n          // when the target is not an event sub process\n          if (!isInterrupting(element)) {\n            canExecute.replacements.push({\n              oldElementId: element.id,\n              newElementType: 'bpmn:StartEvent'\n            });\n          }\n\n          // replace an error/escalation/compensate start event by a blank interrupting start event\n          // when the target is not an event sub process\n          if (hasErrorEventDefinition(element) ||\n              hasEscalationEventDefinition(element) ||\n              hasCompensateEventDefinition(element)) {\n            canExecute.replacements.push({\n              oldElementId: element.id,\n              newElementType: 'bpmn:StartEvent'\n            });\n          }\n\n          // replace a typed start event by a blank interrupting start event\n          // when the target is a sub process but not an event sub process\n          if (hasOneOfEventDefinitions(element,\n            [\n              'bpmn:MessageEventDefinition',\n              'bpmn:TimerEventDefinition',\n              'bpmn:SignalEventDefinition',\n              'bpmn:ConditionalEventDefinition'\n            ]) &&\n              is$1(target, 'bpmn:SubProcess')) {\n            canExecute.replacements.push({\n              oldElementId: element.id,\n              newElementType: 'bpmn:StartEvent'\n            });\n          }\n        }\n      }\n\n      if (!is$1(target, 'bpmn:Transaction')) {\n        if (hasEventDefinition(element, 'bpmn:CancelEventDefinition') &&\n            element.type !== 'label') {\n\n          if (is$1(element, 'bpmn:EndEvent') && canDrop(element, target)) {\n            canExecute.replacements.push({\n              oldElementId: element.id,\n              newElementType: 'bpmn:EndEvent'\n            });\n          }\n\n          if (is$1(element, 'bpmn:BoundaryEvent') && canAttach(element, target, null, position)) {\n            canExecute.replacements.push({\n              oldElementId: element.id,\n              newElementType: 'bpmn:BoundaryEvent'\n            });\n          }\n        }\n      }\n    });\n\n    return canExecute.replacements.length ? canExecute : false;\n  }\n\n  /**\n   * @param {Element[]} elements\n   * @param {Shape} target\n   *\n   * @return {boolean}\n   */\n  function canMove(elements, target) {\n\n    // do not move selection containing lanes\n    if (some(elements, isLane)) {\n      return false;\n    }\n\n    // allow default move check to start move operation\n    if (!target) {\n      return true;\n    }\n\n    return elements.every(function(element) {\n      return canDrop(element, target);\n    });\n  }\n\n  /**\n   * @param {Shape} shape\n   * @param {Shape} target\n   * @param {Element} source\n   * @param {Point} position\n   *\n   * @return {boolean}\n   */\n  function canCreate(shape, target, source, position) {\n\n    if (!target) {\n      return false;\n    }\n\n    if (isLabel(shape) || isGroup(shape)) {\n      return true;\n    }\n\n    if (isSame$1(source, target)) {\n      return false;\n    }\n\n    // ensure we do not drop the element\n    // into source\n    if (source && isParent(source, target)) {\n      return false;\n    }\n\n    return canDrop(shape, target) || canInsert(shape, target);\n  }\n\n  /**\n   * @param {Shape} shape\n   * @param {Rect} newBounds\n   *\n   * @return {boolean}\n   */\n  function canResize(shape, newBounds) {\n    if (is$1(shape, 'bpmn:SubProcess')) {\n      return (\n        isExpanded(shape) && (\n          !newBounds || (newBounds.width >= 100 && newBounds.height >= 80)\n        )\n      );\n    }\n\n    if (is$1(shape, 'bpmn:Lane')) {\n      return !newBounds || (newBounds.width >= 130 && newBounds.height >= 60);\n    }\n\n    if (is$1(shape, 'bpmn:Participant')) {\n      return !newBounds || (newBounds.width >= 250 && newBounds.height >= 50);\n    }\n\n    if (isTextAnnotation(shape)) {\n      return true;\n    }\n\n    if (isGroup(shape)) {\n      return true;\n    }\n\n    return false;\n  }\n\n  /**\n   * Check whether one of of the elements to be connected is a text annotation.\n   *\n   * @param {Element} source\n   * @param {Element} target\n   *\n   * @return {boolean}\n   */\n  function isOneTextAnnotation(source, target) {\n\n    var sourceTextAnnotation = isTextAnnotation(source),\n        targetTextAnnotation = isTextAnnotation(target);\n\n    return (\n      (sourceTextAnnotation || targetTextAnnotation) &&\n      (sourceTextAnnotation !== targetTextAnnotation)\n    );\n  }\n\n  /**\n   * @param {Element} source\n   * @param {Element} target\n   *\n   * @return {CanConnectResult}\n   */\n  function canConnectAssociation(source, target) {\n\n    // compensation boundary events are exception\n    if (isCompensationBoundary(source) && isForCompensation(target)) {\n      return true;\n    }\n\n    // don't connect parent <-> child\n    if (isParent(target, source) || isParent(source, target)) {\n      return false;\n    }\n\n    // allow connection of associations between <!TextAnnotation> and <TextAnnotation>\n    if (isOneTextAnnotation(source, target)) {\n      return true;\n    }\n\n    // can connect associations where we can connect\n    // data associations, too (!)\n    return !!canConnectDataAssociation(source, target);\n  }\n\n  /**\n   * @param {Element} source\n   * @param {Element} target\n   *\n   * @return {boolean}\n   */\n  function canConnectMessageFlow(source, target) {\n\n    // during connect user might move mouse out of canvas\n    // https://github.com/bpmn-io/bpmn-js/issues/1033\n    if (getRootElement(source) && !getRootElement(target)) {\n      return false;\n    }\n\n    return (\n      isMessageFlowSource(source) &&\n      isMessageFlowTarget(target) &&\n      !isSameOrganization(source, target)\n    );\n  }\n\n  /**\n   * @param {Element} source\n   * @param {Element} target\n   *\n   * @return {boolean}\n   */\n  function canConnectSequenceFlow(source, target) {\n    return isSequenceFlowSource(source) &&\n           isSequenceFlowTarget(target) &&\n           isSameScope(source, target) &&\n           !(is$1(source, 'bpmn:EventBasedGateway') && !isEventBasedTarget(target));\n  }\n\n  /**\n   * @param {Element} source\n   * @param {Element} target\n   *\n   * @return {CanConnectResult}\n   */\n  function canConnectDataAssociation(source, target) {\n\n    if (isAny(source, [ 'bpmn:DataObjectReference', 'bpmn:DataStoreReference' ]) &&\n        isAny(target, [ 'bpmn:Activity', 'bpmn:ThrowEvent' ])) {\n      return { type: 'bpmn:DataInputAssociation' };\n    }\n\n    if (isAny(target, [ 'bpmn:DataObjectReference', 'bpmn:DataStoreReference' ]) &&\n        isAny(source, [ 'bpmn:Activity', 'bpmn:CatchEvent' ])) {\n      return { type: 'bpmn:DataOutputAssociation' };\n    }\n\n    return false;\n  }\n\n  /**\n   * @param {Shape} shape\n   * @param {Connection} connection\n   * @param {Point} position\n   *\n   * @return {boolean}\n   */\n  function canInsert(shape, connection, position) {\n    if (!connection) {\n      return false;\n    }\n\n    if (Array.isArray(shape)) {\n      if (shape.length !== 1) {\n        return false;\n      }\n\n      shape = shape[ 0 ];\n    }\n\n    if (connection.source === shape ||\n        connection.target === shape) {\n      return false;\n    }\n\n    // return true if shape can be inserted into connection parent\n    return (\n      isAny(connection, [ 'bpmn:SequenceFlow', 'bpmn:MessageFlow' ]) &&\n      !isLabel(connection) &&\n      is$1(shape, 'bpmn:FlowNode') &&\n      !is$1(shape, 'bpmn:BoundaryEvent') &&\n      canDrop(shape, connection.parent));\n  }\n\n  /**\n   * @param {Element[]} elements\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function includes$5(elements, element) {\n    return (elements && element) && elements.indexOf(element) !== -1;\n  }\n\n  /**\n   * @param {Element[]} elements\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function canCopy(elements, element) {\n    if (isLabel(element)) {\n      return true;\n    }\n\n    if (is$1(element, 'bpmn:Lane') && !includes$5(elements, element.parent)) {\n      return false;\n    }\n\n    return true;\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {Element|null}\n   */\n  function getRootElement(element) {\n    return getParent(element, 'bpmn:Process') || getParent(element, 'bpmn:Collaboration');\n  }\n\n  var RulesModule = {\n    __depends__: [\n      RulesModule$1\n    ],\n    __init__: [ 'bpmnRules' ],\n    bpmnRules: [ 'type', BpmnRules ]\n  };\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   */\n\n  var HIGH_PRIORITY$6 = 2000;\n\n  /**\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   */\n  function BpmnDiOrdering(eventBus, canvas) {\n\n    eventBus.on('saveXML.start', HIGH_PRIORITY$6, orderDi);\n\n    function orderDi() {\n      var rootElements = canvas.getRootElements();\n\n      forEach$1(rootElements, function(root) {\n        var rootDi = getDi(root),\n            elements,\n            diElements;\n\n        elements = selfAndAllChildren([ root ], false);\n\n        // only bpmndi:Shape and bpmndi:Edge can be direct children of bpmndi:Plane\n        elements = filter(elements, function(element) {\n          return element !== root && !element.labelTarget;\n        });\n\n        diElements = map$1(elements, getDi);\n\n        rootDi.set('planeElement', diElements);\n      });\n    }\n  }\n\n  BpmnDiOrdering.$inject = [ 'eventBus', 'canvas' ];\n\n  var DiOrderingModule = {\n    __init__: [\n      'bpmnDiOrdering'\n    ],\n    bpmnDiOrdering: [ 'type', BpmnDiOrdering ]\n  };\n\n  /**\n   * @typedef {import('../../core/Types').ElementLike} Element\n   * @typedef {import('../../core/Types').ShapeLike} Shape\n   *\n   * @typedef {import('../../core/EventBus').default} EventBus\n   */\n\n  /**\n   * An abstract provider that allows modelers to implement a custom\n   * ordering of diagram elements on the canvas.\n   *\n   * It makes sure that the order is always preserved during element\n   * creation and move operations.\n   *\n   * In order to use this behavior, inherit from it and override\n   * the method {@link OrderingProvider#getOrdering}.\n   *\n   * @example\n   *\n   * ```javascript\n   * function CustomOrderingProvider(eventBus) {\n   *   OrderingProvider.call(this, eventBus);\n   *\n   *   this.getOrdering = function(element, newParent) {\n   *     // always insert elements at the front\n   *     // when moving\n   *     return {\n   *       index: 0,\n   *       parent: newParent\n   *     };\n   *   };\n   * }\n   * ```\n   *\n   * @param {EventBus} eventBus\n   */\n  function OrderingProvider(eventBus) {\n\n    CommandInterceptor.call(this, eventBus);\n\n\n    var self = this;\n\n    this.preExecute([ 'shape.create', 'connection.create' ], function(event) {\n\n      var context = event.context,\n          element = context.shape || context.connection,\n          parent = context.parent;\n\n      var ordering = self.getOrdering(element, parent);\n\n      if (ordering) {\n\n        if (ordering.parent !== undefined) {\n          context.parent = ordering.parent;\n        }\n\n        context.parentIndex = ordering.index;\n      }\n    });\n\n    this.preExecute([ 'shape.move', 'connection.move' ], function(event) {\n\n      var context = event.context,\n          element = context.shape || context.connection,\n          parent = context.newParent || element.parent;\n\n      var ordering = self.getOrdering(element, parent);\n\n      if (ordering) {\n\n        if (ordering.parent !== undefined) {\n          context.newParent = ordering.parent;\n        }\n\n        context.newParentIndex = ordering.index;\n      }\n    });\n  }\n\n  /**\n   * Return a custom ordering of the element, both in terms\n   * of parent element and index in the new parent.\n   *\n   * Implementors of this method must return an object with\n   * `parent` _and_ `index` in it.\n   *\n   * @param {Element} element\n   * @param {Shape} newParent\n   *\n   * @return {Object} ordering descriptor\n   */\n  OrderingProvider.prototype.getOrdering = function(element, newParent) {\n    return null;\n  };\n\n  e$3(OrderingProvider, CommandInterceptor);\n\n  /**\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('diagram-js/i18n/translate/translate').default} Translate\n   */\n\n  /**\n   * A BPMN-specific ordering provider.\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {Translate} translate\n   */\n  function BpmnOrderingProvider(eventBus, canvas, translate) {\n\n    OrderingProvider.call(this, eventBus);\n\n    var orders = [\n      { type: 'bpmn:SubProcess', order: { level: 6 } },\n\n      // handle SequenceFlow(s) like message flows and render them always on top\n      {\n        type: 'bpmn:SequenceFlow',\n        order: {\n          level: 9,\n          containers: [\n            'bpmn:Participant',\n            'bpmn:FlowElementsContainer'\n          ]\n        }\n      },\n\n      // handle DataAssociation(s) like message flows and render them always on top\n      {\n        type: 'bpmn:DataAssociation',\n        order: {\n          level: 9,\n          containers: [\n            'bpmn:Collaboration',\n            'bpmn:FlowElementsContainer'\n          ]\n        }\n      },\n      {\n        type: 'bpmn:MessageFlow', order: {\n          level: 9,\n          containers: [ 'bpmn:Collaboration' ]\n        }\n      },\n      {\n        type: 'bpmn:Association',\n        order: {\n          level: 6,\n          containers: [\n            'bpmn:Participant',\n            'bpmn:FlowElementsContainer',\n            'bpmn:Collaboration'\n          ]\n        }\n      },\n      { type: 'bpmn:BoundaryEvent', order: { level: 8 } },\n      {\n        type: 'bpmn:Group',\n        order: {\n          level: 10,\n          containers: [\n            'bpmn:Collaboration',\n            'bpmn:FlowElementsContainer'\n          ]\n        }\n      },\n      { type: 'bpmn:FlowElement', order: { level: 5 } },\n      { type: 'bpmn:Participant', order: { level: -2 } },\n      { type: 'bpmn:Lane', order: { level: -1 } }\n    ];\n\n    function computeOrder(element) {\n      if (element.labelTarget) {\n        return { level: 10 };\n      }\n\n      var entry = find(orders, function(o) {\n        return isAny(element, [ o.type ]);\n      });\n\n      return entry && entry.order || { level: 1 };\n    }\n\n    function getOrder(element) {\n\n      var order = element.order;\n\n      if (!order) {\n        element.order = order = computeOrder(element);\n      }\n\n      if (!order) {\n        throw new Error('no order for <' + element.id + '>');\n      }\n\n      return order;\n    }\n\n    function findActualParent(element, newParent, containers) {\n\n      var actualParent = newParent;\n\n      while (actualParent) {\n\n        if (isAny(actualParent, containers)) {\n          break;\n        }\n\n        actualParent = actualParent.parent;\n      }\n\n      if (!actualParent) {\n        throw new Error('no parent for <' + element.id + '> in <' + (newParent && newParent.id) + '>');\n      }\n\n      return actualParent;\n    }\n\n    this.getOrdering = function(element, newParent) {\n\n      // render labels always on top\n      if (element.labelTarget) {\n        return {\n          parent: canvas.findRoot(newParent) || canvas.getRootElement(),\n          index: -1\n        };\n      }\n\n      var elementOrder = getOrder(element);\n\n      if (elementOrder.containers) {\n        newParent = findActualParent(element, newParent, elementOrder.containers);\n      }\n\n      var currentIndex = newParent.children.indexOf(element);\n\n      var insertIndex = findIndex(newParent.children, function(child) {\n\n        // do not compare with labels, they are created\n        // in the wrong order (right after elements) during import and\n        // mess up the positioning.\n        if (!element.labelTarget && child.labelTarget) {\n          return false;\n        }\n\n        return elementOrder.level < getOrder(child).level;\n      });\n\n\n      // if the element is already in the child list at\n      // a smaller index, we need to adjust the insert index.\n      // this takes into account that the element is being removed\n      // before being re-inserted\n      if (insertIndex !== -1) {\n        if (currentIndex !== -1 && currentIndex < insertIndex) {\n          insertIndex -= 1;\n        }\n      }\n\n      return {\n        index: insertIndex,\n        parent: newParent\n      };\n    };\n  }\n\n  BpmnOrderingProvider.$inject = [ 'eventBus', 'canvas', 'translate' ];\n\n  e$3(BpmnOrderingProvider, OrderingProvider);\n\n  var OrderingModule = {\n    __depends__: [\n      translate\n    ],\n    __init__: [ 'bpmnOrderingProvider' ],\n    bpmnOrderingProvider: [ 'type', BpmnOrderingProvider ]\n  };\n\n  /**\n   * @typedef {import('../dragging/Dragging').default} Dragging\n   * @typedef {import('../../core/EventBus').default} EventBus\n   *\n   * @typedef {import('../../core/EventBus').Event} Event\n   */\n\n  var LOW_PRIORITY$6 = 250;\n\n  /**\n   * The tool manager acts as middle-man between the available tool's and the Palette,\n   * it takes care of making sure that the correct active state is set.\n   *\n   * @param {EventBus} eventBus\n   * @param {Dragging} dragging\n   */\n  function ToolManager(eventBus, dragging) {\n    this._eventBus = eventBus;\n    this._dragging = dragging;\n\n    this._tools = [];\n    this._active = null;\n  }\n\n  ToolManager.$inject = [ 'eventBus', 'dragging' ];\n\n  /**\n   * Register a tool.\n   *\n   * @param {string} name\n   * @param { {\n   *   dragging: string;\n   *   tool: string;\n   * } } events\n   */\n  ToolManager.prototype.registerTool = function(name, events) {\n    var tools = this._tools;\n\n    if (!events) {\n      throw new Error('A tool has to be registered with it\\'s \"events\"');\n    }\n\n    tools.push(name);\n\n    this.bindEvents(name, events);\n  };\n\n  ToolManager.prototype.isActive = function(tool) {\n    return tool && this._active === tool;\n  };\n\n  ToolManager.prototype.length = function(tool) {\n    return this._tools.length;\n  };\n\n  ToolManager.prototype.setActive = function(tool) {\n    var eventBus = this._eventBus;\n\n    if (this._active !== tool) {\n      this._active = tool;\n\n      eventBus.fire('tool-manager.update', { tool: tool });\n    }\n  };\n\n  ToolManager.prototype.bindEvents = function(name, events) {\n    var eventBus = this._eventBus,\n        dragging = this._dragging;\n\n    var eventsToRegister = [];\n\n    eventBus.on(events.tool + '.init', function(event) {\n      var context = event.context;\n\n      // Active tools that want to reactivate themselves must do this explicitly\n      if (!context.reactivate && this.isActive(name)) {\n        this.setActive(null);\n\n        dragging.cancel();\n        return;\n      }\n\n      this.setActive(name);\n\n    }, this);\n\n    // TODO: add test cases\n    forEach$1(events, function(event) {\n      eventsToRegister.push(event + '.ended');\n      eventsToRegister.push(event + '.canceled');\n    });\n\n    eventBus.on(eventsToRegister, LOW_PRIORITY$6, function(event) {\n\n      // We defer the de-activation of the tool to the .activate phase,\n      // so we're able to check if we want to toggle off the current\n      // active tool or switch to a new one\n      if (!this._active) {\n        return;\n      }\n\n      if (isPaletteClick(event)) {\n        return;\n      }\n\n      this.setActive(null);\n    }, this);\n\n  };\n\n\n  // helpers ///////////////\n\n  /**\n   * Check if a given event is a palette click event.\n   *\n   * @param {Event} event\n   *\n   * @return {boolean}\n   */\n  function isPaletteClick(event) {\n    var target = event.originalEvent && event.originalEvent.target;\n\n    return target && closest(target, '.group[data-group=\"tools\"]');\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var ToolManagerModule = {\n    __depends__: [\n      DraggingModule\n    ],\n    __init__: [ 'toolManager' ],\n    toolManager: [ 'type', ToolManager ]\n  };\n\n  /**\n   * @typedef {import('../../core/Types').ConnectionLike} Connection\n   * @typedef {import('../../core/Types').ShapeLike} Shape\n   *\n   * @typedef {import('../../util/Types').Axis} Axis\n   * @typedef {import('../../util/Types').Direction} Direction\n   * @typedef {import('../../util/Types').Point} Point\n   * @typedef {import('../../util/Types').Rect} Rect\n   */\n\n  /**\n   * Return direction given axis and delta.\n   *\n   * @param {Axis} axis\n   * @param {number} delta\n   *\n   * @return {Direction}\n   */\n  function getDirection(axis, delta) {\n\n    if (axis === 'x') {\n      if (delta > 0) {\n        return 'e';\n      }\n\n      if (delta < 0) {\n        return 'w';\n      }\n    }\n\n    if (axis === 'y') {\n      if (delta > 0) {\n        return 's';\n      }\n\n      if (delta < 0) {\n        return 'n';\n      }\n    }\n\n    return null;\n  }\n\n  /**\n   * Returns connections whose waypoints are to be updated. Waypoints are to be updated if start\n   * or end is to be moved or resized.\n   *\n   * @param {Array<Shape>} movingShapes\n   * @param {Array<Shape>} resizingShapes\n   *\n   * @return {Array<Connection>}\n   */\n  function getWaypointsUpdatingConnections(movingShapes, resizingShapes) {\n    var waypointsUpdatingConnections = [];\n\n    forEach$1(movingShapes.concat(resizingShapes), function(shape) {\n      var incoming = shape.incoming,\n          outgoing = shape.outgoing;\n\n      forEach$1(incoming.concat(outgoing), function(connection) {\n        var source = connection.source,\n            target = connection.target;\n\n        if (includes$4(movingShapes, source) ||\n          includes$4(movingShapes, target) ||\n          includes$4(resizingShapes, source) ||\n          includes$4(resizingShapes, target)) {\n\n          if (!includes$4(waypointsUpdatingConnections, connection)) {\n            waypointsUpdatingConnections.push(connection);\n          }\n        }\n      });\n    });\n\n    return waypointsUpdatingConnections;\n  }\n\n  function includes$4(array, item) {\n    return array.indexOf(item) !== -1;\n  }\n\n  /**\n   * Resize bounds.\n   *\n   * @param {Rect} bounds\n   * @param {Direction} direction\n   * @param {Point} delta\n   *\n   * @return {Rect}\n   */\n  function resizeBounds(bounds, direction, delta) {\n    var x = bounds.x,\n        y = bounds.y,\n        width = bounds.width,\n        height = bounds.height,\n        dx = delta.x,\n        dy = delta.y;\n\n    switch (direction) {\n    case 'n':\n      return {\n        x: x,\n        y: y + dy,\n        width: width,\n        height: height - dy\n      };\n    case 's':\n      return {\n        x: x,\n        y: y,\n        width: width,\n        height: height + dy\n      };\n    case 'w':\n      return {\n        x: x + dx,\n        y: y,\n        width: width - dx,\n        height: height\n      };\n    case 'e':\n      return {\n        x: x,\n        y: y,\n        width: width + dx,\n        height: height\n      };\n    default:\n      throw new Error('unknown direction: ' + direction);\n    }\n  }\n\n  /**\n   * @typedef {import('../../core/Types').ShapeLike} Shape\n   *\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../dragging/Dragging').default} Dragging\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   * @typedef {import('../mouse/Mouse').default} Mouse\n   * @typedef {import('../rules/Rules').default} Rules\n   * @typedef {import('../tool-manager/ToolManager').default} ToolManager\n   *\n   * @typedef {import('../../util/Types').Axis} Axis\n   * @typedef {import('../../util/Types').Direction} Direction\n   * @typedef {import('../../util/Types').Point} Point\n   */\n\n  var abs$1 = Math.abs,\n      round$4 = Math.round;\n\n  var AXIS_TO_DIMENSION = {\n    x: 'width',\n    y: 'height'\n  };\n\n  var CURSOR_CROSSHAIR = 'crosshair';\n\n  var DIRECTION_TO_TRBL = {\n    n: 'top',\n    w: 'left',\n    s: 'bottom',\n    e: 'right'\n  };\n\n  var HIGH_PRIORITY$5 = 1500;\n\n  var DIRECTION_TO_OPPOSITE = {\n    n: 's',\n    w: 'e',\n    s: 'n',\n    e: 'w'\n  };\n\n  var PADDING = 20;\n\n\n  /**\n   * Add or remove space by moving and resizing elements.\n   *\n   * @param {Canvas} canvas\n   * @param {Dragging} dragging\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   * @param {Rules} rules\n   * @param {ToolManager} toolManager\n   * @param {Mouse} mouse\n   */\n  function SpaceTool(\n      canvas, dragging, eventBus,\n      modeling, rules, toolManager,\n      mouse) {\n\n    this._canvas = canvas;\n    this._dragging = dragging;\n    this._eventBus = eventBus;\n    this._modeling = modeling;\n    this._rules = rules;\n    this._toolManager = toolManager;\n    this._mouse = mouse;\n\n    var self = this;\n\n    toolManager.registerTool('space', {\n      tool: 'spaceTool.selection',\n      dragging: 'spaceTool'\n    });\n\n    eventBus.on('spaceTool.selection.end', function(event) {\n      eventBus.once('spaceTool.selection.ended', function() {\n        self.activateMakeSpace(event.originalEvent);\n      });\n    });\n\n    eventBus.on('spaceTool.move', HIGH_PRIORITY$5 , function(event) {\n      var context = event.context,\n          initialized = context.initialized;\n\n      if (!initialized) {\n        initialized = context.initialized = self.init(event, context);\n      }\n\n      if (initialized) {\n        ensureConstraints(event);\n      }\n    });\n\n    eventBus.on('spaceTool.end', function(event) {\n      var context = event.context,\n          axis = context.axis,\n          direction = context.direction,\n          movingShapes = context.movingShapes,\n          resizingShapes = context.resizingShapes,\n          start = context.start;\n\n      if (!context.initialized) {\n        return;\n      }\n\n      ensureConstraints(event);\n\n      var delta = {\n        x: 0,\n        y: 0\n      };\n\n      delta[ axis ] = round$4(event[ 'd' + axis ]);\n\n      self.makeSpace(movingShapes, resizingShapes, delta, direction, start);\n\n      eventBus.once('spaceTool.ended', function(event) {\n\n        // activate space tool selection after make space\n        self.activateSelection(event.originalEvent, true, true);\n      });\n    });\n  }\n\n  SpaceTool.$inject = [\n    'canvas',\n    'dragging',\n    'eventBus',\n    'modeling',\n    'rules',\n    'toolManager',\n    'mouse'\n  ];\n\n  /**\n   * Activate space tool selection.\n   *\n   * @param {MouseEvent|TouchEvent} event\n   * @param {boolean} autoActivate\n   * @param {boolean} reactivate\n   */\n  SpaceTool.prototype.activateSelection = function(event, autoActivate, reactivate) {\n    this._dragging.init(event, 'spaceTool.selection', {\n      autoActivate: autoActivate,\n      cursor: CURSOR_CROSSHAIR,\n      data: {\n        context: {\n          reactivate: reactivate\n        }\n      },\n      trapClick: false\n    });\n  };\n\n  /**\n   * Activate space tool make space.\n   *\n   * @param {MouseEvent|TouchEvent} event\n   */\n  SpaceTool.prototype.activateMakeSpace = function(event) {\n    this._dragging.init(event, 'spaceTool', {\n      autoActivate: true,\n      cursor: CURSOR_CROSSHAIR,\n      data: {\n        context: {}\n      }\n    });\n  };\n\n  /**\n   * Make space.\n   *\n   * @param {Array<Shape>} movingShapes\n   * @param {Array<Shape>} resizingShapes\n   * @param {Point} delta\n   * @param {Direction} direction\n   * @param {number} start\n   */\n  SpaceTool.prototype.makeSpace = function(movingShapes, resizingShapes, delta, direction, start) {\n    return this._modeling.createSpace(movingShapes, resizingShapes, delta, direction, start);\n  };\n\n  /**\n   * Initialize make space and return true if that was successful.\n   *\n   * @param {MouseEvent|TouchEvent} event\n   * @param {Object} context\n   *\n   * @return {boolean}\n   */\n  SpaceTool.prototype.init = function(event, context) {\n    var axis = abs$1(event.dx) > abs$1(event.dy) ? 'x' : 'y',\n        delta = event[ 'd' + axis ],\n        start = event[ axis ] - delta;\n\n    if (abs$1(delta) < 5) {\n      return false;\n    }\n\n    // invert delta to remove space when moving left\n    if (delta < 0) {\n      delta *= -1;\n    }\n\n    // invert delta to add/remove space when removing/adding space if modifier key is pressed\n    if (hasPrimaryModifier(event)) {\n      delta *= -1;\n    }\n\n    var direction = getDirection(axis, delta);\n\n    var root = this._canvas.getRootElement();\n\n    var children = selfAndAllChildren(root, true);\n\n    var elements = this.calculateAdjustments(children, axis, delta, start);\n\n    var minDimensions = this._eventBus.fire('spaceTool.getMinDimensions', {\n      axis: axis,\n      direction: direction,\n      shapes: elements.resizingShapes,\n      start: start\n    });\n\n    var spaceToolConstraints = getSpaceToolConstraints(elements, axis, direction, start, minDimensions);\n\n    assign$1(\n      context,\n      elements,\n      {\n        axis: axis,\n        direction: direction,\n        spaceToolConstraints: spaceToolConstraints,\n        start: start\n      }\n    );\n\n    set('resize-' + (axis === 'x' ? 'ew' : 'ns'));\n\n    return true;\n  };\n\n  /**\n   * Get elements to be moved and resized.\n   *\n   * @param {Array<Shape>} elements\n   * @param {Axis} axis\n   * @param {Point} delta\n   * @param {number} start\n   *\n   * @return {Object}\n   */\n  SpaceTool.prototype.calculateAdjustments = function(elements, axis, delta, start) {\n    var rules = this._rules;\n\n    var movingShapes = [],\n        resizingShapes = [];\n\n    var attachers = [],\n        connections = [];\n\n    function moveShape(shape) {\n      if (!movingShapes.includes(shape)) {\n        movingShapes.push(shape);\n      }\n\n      var label = shape.label;\n\n      // move external label if its label target is moving\n      if (label && !movingShapes.includes(label)) {\n        movingShapes.push(label);\n      }\n    }\n\n    function resizeShape(shape) {\n      if (!resizingShapes.includes(shape)) {\n        resizingShapes.push(shape);\n      }\n    }\n\n    forEach$1(elements, function(element) {\n      if (!element.parent || isLabel(element)) {\n        return;\n      }\n\n      // handle connections separately\n      if (isConnection(element)) {\n        connections.push(element);\n\n        return;\n      }\n\n      var shapeStart = element[ axis ],\n          shapeEnd = shapeStart + element[ AXIS_TO_DIMENSION[ axis ] ];\n\n      // handle attachers separately\n      if (isAttacher$1(element)\n        && ((delta > 0 && getMid(element)[ axis ] > start)\n          || (delta < 0 && getMid(element)[ axis ] < start))) {\n        attachers.push(element);\n\n        return;\n      }\n\n      // move shape if its start is after space tool\n      if ((delta > 0 && shapeStart > start)\n        || (delta < 0 && shapeEnd < start)) {\n        moveShape(element);\n\n        return;\n      }\n\n      // resize shape if it's resizable and its start is before and its end is after space tool\n      if (shapeStart < start\n        && shapeEnd > start\n        && rules.allowed('shape.resize', { shape: element })\n      ) {\n        resizeShape(element);\n\n        return;\n      }\n    });\n\n    // move attacher if its host is moving\n    forEach$1(movingShapes, function(shape) {\n      var attachers = shape.attachers;\n\n      if (attachers) {\n        forEach$1(attachers, function(attacher) {\n          moveShape(attacher);\n        });\n      }\n    });\n\n    var allShapes = movingShapes.concat(resizingShapes);\n\n    // move attacher if its mid is after space tool and its host is moving or resizing\n    forEach$1(attachers, function(attacher) {\n      var host = attacher.host;\n\n      if (includes$3(allShapes, host)) {\n        moveShape(attacher);\n      }\n    });\n\n    allShapes = movingShapes.concat(resizingShapes);\n\n    // move external label if its label target's (connection) source and target are moving\n    forEach$1(connections, function(connection) {\n      var source = connection.source,\n          target = connection.target,\n          label = connection.label;\n\n      if (includes$3(allShapes, source)\n        && includes$3(allShapes, target)\n        && label) {\n        moveShape(label);\n      }\n    });\n\n    return {\n      movingShapes: movingShapes,\n      resizingShapes: resizingShapes\n    };\n  };\n\n  SpaceTool.prototype.toggle = function() {\n\n    if (this.isActive()) {\n      return this._dragging.cancel();\n    }\n\n    var mouseEvent = this._mouse.getLastMoveEvent();\n\n    this.activateSelection(mouseEvent, !!mouseEvent);\n  };\n\n  SpaceTool.prototype.isActive = function() {\n    var context = this._dragging.context();\n\n    if (context) {\n      return /^spaceTool/.test(context.prefix);\n    }\n\n    return false;\n  };\n\n  // helpers //////////\n\n  function addPadding(trbl) {\n    return {\n      top: trbl.top - PADDING,\n      right: trbl.right + PADDING,\n      bottom: trbl.bottom + PADDING,\n      left: trbl.left - PADDING\n    };\n  }\n\n  function ensureConstraints(event) {\n    var context = event.context,\n        spaceToolConstraints = context.spaceToolConstraints;\n\n    if (!spaceToolConstraints) {\n      return;\n    }\n\n    var x, y;\n\n    if (isNumber(spaceToolConstraints.left)) {\n      x = Math.max(event.x, spaceToolConstraints.left);\n\n      event.dx = event.dx + x - event.x;\n      event.x = x;\n    }\n\n    if (isNumber(spaceToolConstraints.right)) {\n      x = Math.min(event.x, spaceToolConstraints.right);\n\n      event.dx = event.dx + x - event.x;\n      event.x = x;\n    }\n\n    if (isNumber(spaceToolConstraints.top)) {\n      y = Math.max(event.y, spaceToolConstraints.top);\n\n      event.dy = event.dy + y - event.y;\n      event.y = y;\n    }\n\n    if (isNumber(spaceToolConstraints.bottom)) {\n      y = Math.min(event.y, spaceToolConstraints.bottom);\n\n      event.dy = event.dy + y - event.y;\n      event.y = y;\n    }\n  }\n\n  function getSpaceToolConstraints(elements, axis, direction, start, minDimensions) {\n    var movingShapes = elements.movingShapes,\n        resizingShapes = elements.resizingShapes;\n\n    if (!resizingShapes.length) {\n      return;\n    }\n\n    var spaceToolConstraints = {},\n        min,\n        max;\n\n    forEach$1(resizingShapes, function(resizingShape) {\n      var attachers = resizingShape.attachers,\n          children = resizingShape.children;\n\n      var resizingShapeBBox = asTRBL(resizingShape);\n\n      // find children that are not moving or resizing\n      var nonMovingResizingChildren = filter(children, function(child) {\n        return !isConnection(child) &&\n          !isLabel(child) &&\n          !includes$3(movingShapes, child) &&\n          !includes$3(resizingShapes, child);\n      });\n\n      // find children that are moving\n      var movingChildren = filter(children, function(child) {\n        return !isConnection(child) && !isLabel(child) && includes$3(movingShapes, child);\n      });\n\n      var minOrMax,\n          nonMovingResizingChildrenBBox,\n          movingChildrenBBox,\n          movingAttachers = [],\n          nonMovingAttachers = [],\n          movingAttachersBBox,\n          movingAttachersConstraint,\n          nonMovingAttachersBBox,\n          nonMovingAttachersConstraint;\n\n      if (nonMovingResizingChildren.length) {\n        nonMovingResizingChildrenBBox = addPadding(asTRBL(getBBox(nonMovingResizingChildren)));\n\n        minOrMax = start -\n          resizingShapeBBox[ DIRECTION_TO_TRBL[ direction ] ] +\n          nonMovingResizingChildrenBBox[ DIRECTION_TO_TRBL[ direction ] ];\n\n        if (direction === 'n') {\n          spaceToolConstraints.bottom = max = isNumber(max) ? Math.min(max, minOrMax) : minOrMax;\n        } else if (direction === 'w') {\n          spaceToolConstraints.right = max = isNumber(max) ? Math.min(max, minOrMax) : minOrMax;\n        } else if (direction === 's') {\n          spaceToolConstraints.top = min = isNumber(min) ? Math.max(min, minOrMax) : minOrMax;\n        } else if (direction === 'e') {\n          spaceToolConstraints.left = min = isNumber(min) ? Math.max(min, minOrMax) : minOrMax;\n        }\n      }\n\n      if (movingChildren.length) {\n        movingChildrenBBox = addPadding(asTRBL(getBBox(movingChildren)));\n\n        minOrMax = start -\n          movingChildrenBBox[ DIRECTION_TO_TRBL[ DIRECTION_TO_OPPOSITE[ direction ] ] ] +\n          resizingShapeBBox[ DIRECTION_TO_TRBL[ DIRECTION_TO_OPPOSITE[ direction ] ] ];\n\n        if (direction === 'n') {\n          spaceToolConstraints.bottom = max = isNumber(max) ? Math.min(max, minOrMax) : minOrMax;\n        } else if (direction === 'w') {\n          spaceToolConstraints.right = max = isNumber(max) ? Math.min(max, minOrMax) : minOrMax;\n        } else if (direction === 's') {\n          spaceToolConstraints.top = min = isNumber(min) ? Math.max(min, minOrMax) : minOrMax;\n        } else if (direction === 'e') {\n          spaceToolConstraints.left = min = isNumber(min) ? Math.max(min, minOrMax) : minOrMax;\n        }\n      }\n\n      if (attachers && attachers.length) {\n        attachers.forEach(function(attacher) {\n          if (includes$3(movingShapes, attacher)) {\n            movingAttachers.push(attacher);\n          } else {\n            nonMovingAttachers.push(attacher);\n          }\n        });\n\n        if (movingAttachers.length) {\n          movingAttachersBBox = asTRBL(getBBox(movingAttachers.map(getMid)));\n\n          movingAttachersConstraint = resizingShapeBBox[ DIRECTION_TO_TRBL[ DIRECTION_TO_OPPOSITE[ direction ] ] ]\n                - (movingAttachersBBox[ DIRECTION_TO_TRBL[ DIRECTION_TO_OPPOSITE[ direction ] ] ] - start);\n        }\n\n        if (nonMovingAttachers.length) {\n          nonMovingAttachersBBox = asTRBL(getBBox(nonMovingAttachers.map(getMid)));\n\n          nonMovingAttachersConstraint = nonMovingAttachersBBox[ DIRECTION_TO_TRBL[ direction ] ]\n                - (resizingShapeBBox[ DIRECTION_TO_TRBL[ direction ] ] - start);\n        }\n\n        if (direction === 'n') {\n          minOrMax = Math.min(movingAttachersConstraint || Infinity, nonMovingAttachersConstraint || Infinity);\n\n          spaceToolConstraints.bottom = max = isNumber(max) ? Math.min(max, minOrMax) : minOrMax;\n        } else if (direction === 'w') {\n          minOrMax = Math.min(movingAttachersConstraint || Infinity, nonMovingAttachersConstraint || Infinity);\n\n          spaceToolConstraints.right = max = isNumber(max) ? Math.min(max, minOrMax) : minOrMax;\n        } else if (direction === 's') {\n          minOrMax = Math.max(movingAttachersConstraint || -Infinity, nonMovingAttachersConstraint || -Infinity);\n\n          spaceToolConstraints.top = min = isNumber(min) ? Math.max(min, minOrMax) : minOrMax;\n        } else if (direction === 'e') {\n          minOrMax = Math.max(movingAttachersConstraint || -Infinity, nonMovingAttachersConstraint || -Infinity);\n\n          spaceToolConstraints.left = min = isNumber(min) ? Math.max(min, minOrMax) : minOrMax;\n        }\n      }\n\n      var resizingShapeMinDimensions = minDimensions && minDimensions[ resizingShape.id ];\n\n      if (resizingShapeMinDimensions) {\n\n        if (direction === 'n') {\n          minOrMax = start +\n            resizingShape[ AXIS_TO_DIMENSION [ axis ] ] -\n            resizingShapeMinDimensions[ AXIS_TO_DIMENSION[ axis ] ];\n\n          spaceToolConstraints.bottom = max = isNumber(max) ? Math.min(max, minOrMax) : minOrMax;\n        } else if (direction === 'w') {\n          minOrMax = start +\n            resizingShape[ AXIS_TO_DIMENSION [ axis ] ] -\n            resizingShapeMinDimensions[ AXIS_TO_DIMENSION[ axis ] ];\n\n          spaceToolConstraints.right = max = isNumber(max) ? Math.min(max, minOrMax) : minOrMax;\n        } else if (direction === 's') {\n          minOrMax = start -\n            resizingShape[ AXIS_TO_DIMENSION [ axis ] ] +\n            resizingShapeMinDimensions[ AXIS_TO_DIMENSION[ axis ] ];\n\n          spaceToolConstraints.top = min = isNumber(min) ? Math.max(min, minOrMax) : minOrMax;\n        } else if (direction === 'e') {\n          minOrMax = start -\n            resizingShape[ AXIS_TO_DIMENSION [ axis ] ] +\n            resizingShapeMinDimensions[ AXIS_TO_DIMENSION[ axis ] ];\n\n          spaceToolConstraints.left = min = isNumber(min) ? Math.max(min, minOrMax) : minOrMax;\n        }\n      }\n    });\n\n    return spaceToolConstraints;\n  }\n\n  function includes$3(array, item) {\n    return array.indexOf(item) !== -1;\n  }\n\n  function isAttacher$1(element) {\n    return !!element.host;\n  }\n\n  var MARKER_DRAGGING$1 = 'djs-dragging',\n      MARKER_RESIZING = 'djs-resizing';\n\n  var LOW_PRIORITY$5 = 250;\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../../draw/Styles').default} Styles\n   */\n\n  var max = Math.max;\n\n\n  /**\n   * Provides previews for selecting/moving/resizing shapes when creating/removing space.\n   *\n   * @param {EventBus} eventBus\n   * @param {ElementRegistry} elementRegistry\n   * @param {Canvas} canvas\n   * @param {Styles} styles\n   */\n  function SpaceToolPreview(\n      eventBus, elementRegistry, canvas,\n      styles, previewSupport) {\n\n    function addPreviewGfx(collection, dragGroup) {\n      forEach$1(collection, function(element) {\n        previewSupport.addDragger(element, dragGroup);\n\n        canvas.addMarker(element, MARKER_DRAGGING$1);\n      });\n    }\n\n    // add crosshair\n    eventBus.on('spaceTool.selection.start', function(event) {\n      var space = canvas.getLayer('space'),\n          context = event.context;\n\n      var orientation = {\n        x: 'M 0,-10000 L 0,10000',\n        y: 'M -10000,0 L 10000,0'\n      };\n\n      var crosshairGroup = create$1('g');\n      attr(crosshairGroup, styles.cls('djs-crosshair-group', [ 'no-events' ]));\n\n      append(space, crosshairGroup);\n\n      // horizontal path\n      var pathX = create$1('path');\n      attr(pathX, 'd', orientation.x);\n      classes(pathX).add('djs-crosshair');\n\n      append(crosshairGroup, pathX);\n\n      // vertical path\n      var pathY = create$1('path');\n      attr(pathY, 'd', orientation.y);\n      classes(pathY).add('djs-crosshair');\n\n      append(crosshairGroup, pathY);\n\n      context.crosshairGroup = crosshairGroup;\n    });\n\n    // update crosshair\n    eventBus.on('spaceTool.selection.move', function(event) {\n      var crosshairGroup = event.context.crosshairGroup;\n\n      translate$2(crosshairGroup, event.x, event.y);\n    });\n\n    // remove crosshair\n    eventBus.on('spaceTool.selection.cleanup', function(event) {\n      var context = event.context,\n          crosshairGroup = context.crosshairGroup;\n\n      if (crosshairGroup) {\n        remove$1(crosshairGroup);\n      }\n    });\n\n    // add and update move/resize previews\n    eventBus.on('spaceTool.move', LOW_PRIORITY$5, function(event) {\n\n      var context = event.context,\n          line = context.line,\n          axis = context.axis,\n          movingShapes = context.movingShapes,\n          resizingShapes = context.resizingShapes;\n\n      if (!context.initialized) {\n        return;\n      }\n\n      if (!context.dragGroup) {\n        var spaceLayer = canvas.getLayer('space');\n\n        line = create$1('path');\n        attr(line, 'd', 'M0,0 L0,0');\n        classes(line).add('djs-crosshair');\n\n        append(spaceLayer, line);\n\n        context.line = line;\n\n        var dragGroup = create$1('g');\n        attr(dragGroup, styles.cls('djs-drag-group', [ 'no-events' ]));\n\n        append(canvas.getActiveLayer(), dragGroup);\n\n        // shapes\n        addPreviewGfx(movingShapes, dragGroup);\n\n        // connections\n        var movingConnections = context.movingConnections = elementRegistry.filter(function(element) {\n          var sourceIsMoving = false;\n\n          forEach$1(movingShapes, function(shape) {\n            forEach$1(shape.outgoing, function(connection) {\n              if (element === connection) {\n                sourceIsMoving = true;\n              }\n            });\n          });\n\n          var targetIsMoving = false;\n\n          forEach$1(movingShapes, function(shape) {\n            forEach$1(shape.incoming, function(connection) {\n              if (element === connection) {\n                targetIsMoving = true;\n              }\n            });\n          });\n\n          var sourceIsResizing = false;\n\n          forEach$1(resizingShapes, function(shape) {\n            forEach$1(shape.outgoing, function(connection) {\n              if (element === connection) {\n                sourceIsResizing = true;\n              }\n            });\n          });\n\n          var targetIsResizing = false;\n\n          forEach$1(resizingShapes, function(shape) {\n            forEach$1(shape.incoming, function(connection) {\n              if (element === connection) {\n                targetIsResizing = true;\n              }\n            });\n          });\n\n          return isConnection(element)\n            && (sourceIsMoving || sourceIsResizing)\n            && (targetIsMoving || targetIsResizing);\n        });\n\n\n        addPreviewGfx(movingConnections, dragGroup);\n\n        context.dragGroup = dragGroup;\n      }\n\n      if (!context.frameGroup) {\n        var frameGroup = create$1('g');\n        attr(frameGroup, styles.cls('djs-frame-group', [ 'no-events' ]));\n\n        append(canvas.getActiveLayer(), frameGroup);\n\n        var frames = [];\n\n        forEach$1(resizingShapes, function(shape) {\n          var frame = previewSupport.addFrame(shape, frameGroup);\n\n          var initialBounds = frame.getBBox();\n\n          frames.push({\n            element: frame,\n            initialBounds: initialBounds\n          });\n\n          canvas.addMarker(shape, MARKER_RESIZING);\n        });\n\n        context.frameGroup = frameGroup;\n        context.frames = frames;\n      }\n\n      var orientation = {\n        x: 'M' + event.x + ', -10000 L' + event.x + ', 10000',\n        y: 'M -10000, ' + event.y + ' L 10000, ' + event.y\n      };\n\n      attr(line, { d: orientation[ axis ] });\n\n      var opposite = { x: 'y', y: 'x' };\n      var delta = { x: event.dx, y: event.dy };\n      delta[ opposite[ context.axis ] ] = 0;\n\n      // update move previews\n      translate$2(context.dragGroup, delta.x, delta.y);\n\n      // update resize previews\n      forEach$1(context.frames, function(frame) {\n        var element = frame.element,\n            initialBounds = frame.initialBounds,\n            width,\n            height;\n\n        if (context.direction === 'e') {\n          attr(element, {\n            width: max(initialBounds.width + delta.x, 5)\n          });\n        } else {\n          width = max(initialBounds.width - delta.x, 5);\n\n          attr(element, {\n            width: width,\n            x: initialBounds.x + initialBounds.width - width\n          });\n        }\n\n        if (context.direction === 's') {\n          attr(element, {\n            height: max(initialBounds.height + delta.y, 5)\n          });\n        } else {\n          height = max(initialBounds.height - delta.y, 5);\n\n          attr(element, {\n            height: height,\n            y: initialBounds.y + initialBounds.height - height\n          });\n        }\n      });\n\n    });\n\n    // remove move/resize previews\n    eventBus.on('spaceTool.cleanup', function(event) {\n\n      var context = event.context,\n          movingShapes = context.movingShapes,\n          movingConnections = context.movingConnections,\n          resizingShapes = context.resizingShapes,\n          line = context.line,\n          dragGroup = context.dragGroup,\n          frameGroup = context.frameGroup;\n\n      // moving shapes\n      forEach$1(movingShapes, function(shape) {\n        canvas.removeMarker(shape, MARKER_DRAGGING$1);\n      });\n\n      // moving connections\n      forEach$1(movingConnections, function(connection) {\n        canvas.removeMarker(connection, MARKER_DRAGGING$1);\n      });\n\n      if (dragGroup) {\n        remove$1(line);\n        remove$1(dragGroup);\n      }\n\n      forEach$1(resizingShapes, function(shape) {\n        canvas.removeMarker(shape, MARKER_RESIZING);\n      });\n\n      if (frameGroup) {\n        remove$1(frameGroup);\n      }\n    });\n  }\n\n  SpaceToolPreview.$inject = [\n    'eventBus',\n    'elementRegistry',\n    'canvas',\n    'styles',\n    'previewSupport'\n  ];\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var SpaceToolModule$1 = {\n    __init__: [ 'spaceToolPreview' ],\n    __depends__: [\n      DraggingModule,\n      RulesModule$1,\n      ToolManagerModule,\n      PreviewSupportModule,\n      MouseModule\n    ],\n    spaceTool: [ 'type', SpaceTool ],\n    spaceToolPreview: [ 'type', SpaceToolPreview ]\n  };\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   *\n   * @typedef {import('../../model/Types').Shape} Shape\n   *\n   * @typedef {import('diagram-js/lib/util/Types').Axis} Axis\n   * @typedef {import('diagram-js/lib/util/Types').Point} Point\n   */\n\n  /**\n   * @param {Injector} injector\n   */\n  function BpmnSpaceTool(injector) {\n    injector.invoke(SpaceTool, this);\n  }\n\n  BpmnSpaceTool.$inject = [\n    'injector'\n  ];\n\n  e$3(BpmnSpaceTool, SpaceTool);\n\n  /**\n   * @param {Shape[]} elements\n   * @param {Axis} axis\n   * @param {Point} delta\n   * @param {number} start\n   *\n   * @return {Object}\n   */\n  BpmnSpaceTool.prototype.calculateAdjustments = function(elements, axis, delta, start) {\n    var adjustments = SpaceTool.prototype.calculateAdjustments.call(this, elements, axis, delta, start);\n\n    // do not resize text annotations\n    adjustments.resizingShapes = adjustments.resizingShapes.filter(function(shape) {\n      return !is$1(shape, 'bpmn:TextAnnotation');\n    });\n\n    return adjustments;\n  };\n\n  var SpaceToolModule = {\n    __depends__: [ SpaceToolModule$1 ],\n    spaceTool: [ 'type', BpmnSpaceTool ]\n  };\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   *\n   * @typedef {import('../core/Types').ElementLike} ElementLike\n   *\n   * @typedef {import('../core/EventBus').default} EventBus\n   * @typedef {import('./CommandHandler').default} CommandHandler\n   *\n   * @typedef { any } CommandContext\n   * @typedef { {\n   *   new (...args: any[]) : CommandHandler\n   * } } CommandHandlerConstructor\n   * @typedef { {\n   *   [key: string]: CommandHandler;\n   * } } CommandHandlerMap\n   * @typedef { {\n   *   command: string;\n   *   context: any;\n   *   id?: any;\n   * } } CommandStackAction\n   * @typedef { {\n   *   actions: CommandStackAction[];\n   *   dirty: ElementLike[];\n   *   trigger: 'execute' | 'undo' | 'redo' | 'clear' | null;\n   *   atomic?: boolean;\n   * } } CurrentExecution\n   */\n\n  /**\n   * A service that offers un- and redoable execution of commands.\n   *\n   * The command stack is responsible for executing modeling actions\n   * in a un- and redoable manner. To do this it delegates the actual\n   * command execution to {@link CommandHandler}s.\n   *\n   * Command handlers provide {@link CommandHandler#execute(ctx)} and\n   * {@link CommandHandler#revert(ctx)} methods to un- and redo a command\n   * identified by a command context.\n   *\n   *\n   * ## Life-Cycle events\n   *\n   * In the process the command stack fires a number of life-cycle events\n   * that other components to participate in the command execution.\n   *\n   *    * preExecute\n   *    * preExecuted\n   *    * execute\n   *    * executed\n   *    * postExecute\n   *    * postExecuted\n   *    * revert\n   *    * reverted\n   *\n   * A special event is used for validating, whether a command can be\n   * performed prior to its execution.\n   *\n   *    * canExecute\n   *\n   * Each of the events is fired as `commandStack.{eventName}` and\n   * `commandStack.{commandName}.{eventName}`, respectively. This gives\n   * components fine grained control on where to hook into.\n   *\n   * The event object fired transports `command`, the name of the\n   * command and `context`, the command context.\n   *\n   *\n   * ## Creating Command Handlers\n   *\n   * Command handlers should provide the {@link CommandHandler#execute(ctx)}\n   * and {@link CommandHandler#revert(ctx)} methods to implement\n   * redoing and undoing of a command.\n   *\n   * A command handler _must_ ensure undo is performed properly in order\n   * not to break the undo chain. It must also return the shapes that\n   * got changed during the `execute` and `revert` operations.\n   *\n   * Command handlers may execute other modeling operations (and thus\n   * commands) in their `preExecute(d)` and `postExecute(d)` phases. The command\n   * stack will properly group all commands together into a logical unit\n   * that may be re- and undone atomically.\n   *\n   * Command handlers must not execute other commands from within their\n   * core implementation (`execute`, `revert`).\n   *\n   *\n   * ## Change Tracking\n   *\n   * During the execution of the CommandStack it will keep track of all\n   * elements that have been touched during the command's execution.\n   *\n   * At the end of the CommandStack execution it will notify interested\n   * components via an 'elements.changed' event with all the dirty\n   * elements.\n   *\n   * The event can be picked up by components that are interested in the fact\n   * that elements have been changed. One use case for this is updating\n   * their graphical representation after moving / resizing or deletion.\n   *\n   * @see CommandHandler\n   *\n   * @param {EventBus} eventBus\n   * @param {Injector} injector\n   */\n  function CommandStack(eventBus, injector) {\n\n    /**\n     * A map of all registered command handlers.\n     *\n     * @type {CommandHandlerMap}\n     */\n    this._handlerMap = {};\n\n    /**\n     * A stack containing all re/undoable actions on the diagram\n     *\n     * @type {CommandStackAction[]}\n     */\n    this._stack = [];\n\n    /**\n     * The current index on the stack\n     *\n     * @type {number}\n     */\n    this._stackIdx = -1;\n\n    /**\n     * Current active commandStack execution\n     *\n     * @type {CurrentExecution}\n     */\n    this._currentExecution = {\n      actions: [],\n      dirty: [],\n      trigger: null\n    };\n\n    /**\n     * @type {Injector}\n     */\n    this._injector = injector;\n\n    /**\n     * @type EventBus\n     */\n    this._eventBus = eventBus;\n\n    /**\n     * @type { number }\n     */\n    this._uid = 1;\n\n    eventBus.on([\n      'diagram.destroy',\n      'diagram.clear'\n    ], function() {\n      this.clear(false);\n    }, this);\n  }\n\n  CommandStack.$inject = [ 'eventBus', 'injector' ];\n\n\n  /**\n   * Execute a command.\n   *\n   * @param {string} command The command to execute.\n   * @param {CommandContext} context The context with which to execute the command.\n   */\n  CommandStack.prototype.execute = function(command, context) {\n    if (!command) {\n      throw new Error('command required');\n    }\n\n    this._currentExecution.trigger = 'execute';\n\n    const action = { command: command, context: context };\n\n    this._pushAction(action);\n    this._internalExecute(action);\n    this._popAction();\n  };\n\n\n  /**\n   * Check whether a command can be executed.\n   *\n   * Implementors may hook into the mechanism on two ways:\n   *\n   *   * in event listeners:\n   *\n   *     Users may prevent the execution via an event listener.\n   *     It must prevent the default action for `commandStack.(<command>.)canExecute` events.\n   *\n   *   * in command handlers:\n   *\n   *     If the method {@link CommandHandler#canExecute} is implemented in a handler\n   *     it will be called to figure out whether the execution is allowed.\n   *\n   * @param {string} command The command to execute.\n   * @param {CommandContext} context The context with which to execute the command.\n   *\n   * @return {boolean} Whether the command can be executed with the given context.\n   */\n  CommandStack.prototype.canExecute = function(command, context) {\n\n    const action = { command: command, context: context };\n\n    const handler = this._getHandler(command);\n\n    let result = this._fire(command, 'canExecute', action);\n\n    // handler#canExecute will only be called if no listener\n    // decided on a result already\n    if (result === undefined) {\n      if (!handler) {\n        return false;\n      }\n\n      if (handler.canExecute) {\n        result = handler.canExecute(context);\n      }\n    }\n\n    return result;\n  };\n\n\n  /**\n   * Clear the command stack, erasing all undo / redo history.\n   *\n   * @param {boolean} [emit=true] Whether to fire an event. Defaults to `true`.\n   */\n  CommandStack.prototype.clear = function(emit) {\n    this._stack.length = 0;\n    this._stackIdx = -1;\n\n    if (emit !== false) {\n      this._fire('changed', { trigger: 'clear' });\n    }\n  };\n\n\n  /**\n   * Undo last command(s)\n   */\n  CommandStack.prototype.undo = function() {\n    let action = this._getUndoAction(),\n        next;\n\n    if (action) {\n      this._currentExecution.trigger = 'undo';\n\n      this._pushAction(action);\n\n      while (action) {\n        this._internalUndo(action);\n        next = this._getUndoAction();\n\n        if (!next || next.id !== action.id) {\n          break;\n        }\n\n        action = next;\n      }\n\n      this._popAction();\n    }\n  };\n\n\n  /**\n   * Redo last command(s)\n   */\n  CommandStack.prototype.redo = function() {\n    let action = this._getRedoAction(),\n        next;\n\n    if (action) {\n      this._currentExecution.trigger = 'redo';\n\n      this._pushAction(action);\n\n      while (action) {\n        this._internalExecute(action, true);\n        next = this._getRedoAction();\n\n        if (!next || next.id !== action.id) {\n          break;\n        }\n\n        action = next;\n      }\n\n      this._popAction();\n    }\n  };\n\n\n  /**\n   * Register a handler instance with the command stack.\n   *\n   * @param {string} command Command to be executed.\n   * @param {CommandHandler} handler Handler to execute the command.\n   */\n  CommandStack.prototype.register = function(command, handler) {\n    this._setHandler(command, handler);\n  };\n\n\n  /**\n   * Register a handler type with the command stack  by instantiating it and\n   * injecting its dependencies.\n   *\n   * @param {string} command Command to be executed.\n   * @param {CommandHandlerConstructor} handlerCls Constructor to instantiate a {@link CommandHandler}.\n   */\n  CommandStack.prototype.registerHandler = function(command, handlerCls) {\n\n    if (!command || !handlerCls) {\n      throw new Error('command and handlerCls must be defined');\n    }\n\n    const handler = this._injector.instantiate(handlerCls);\n    this.register(command, handler);\n  };\n\n  /**\n   * @return {boolean}\n   */\n  CommandStack.prototype.canUndo = function() {\n    return !!this._getUndoAction();\n  };\n\n  /**\n   * @return {boolean}\n   */\n  CommandStack.prototype.canRedo = function() {\n    return !!this._getRedoAction();\n  };\n\n  // stack access  //////////////////////\n\n  CommandStack.prototype._getRedoAction = function() {\n    return this._stack[this._stackIdx + 1];\n  };\n\n\n  CommandStack.prototype._getUndoAction = function() {\n    return this._stack[this._stackIdx];\n  };\n\n\n  // internal functionality //////////////////////\n\n  CommandStack.prototype._internalUndo = function(action) {\n    const command = action.command,\n          context = action.context;\n\n    const handler = this._getHandler(command);\n\n    // guard against illegal nested command stack invocations\n    this._atomicDo(() => {\n      this._fire(command, 'revert', action);\n\n      if (handler.revert) {\n        this._markDirty(handler.revert(context));\n      }\n\n      this._revertedAction(action);\n\n      this._fire(command, 'reverted', action);\n    });\n  };\n\n\n  CommandStack.prototype._fire = function(command, qualifier, event) {\n    if (arguments.length < 3) {\n      event = qualifier;\n      qualifier = null;\n    }\n\n    const names = qualifier ? [ command + '.' + qualifier, qualifier ] : [ command ];\n    let result;\n\n    event = this._eventBus.createEvent(event);\n\n    for (const name of names) {\n      result = this._eventBus.fire('commandStack.' + name, event);\n\n      if (event.cancelBubble) {\n        break;\n      }\n    }\n\n    return result;\n  };\n\n  CommandStack.prototype._createId = function() {\n    return this._uid++;\n  };\n\n  CommandStack.prototype._atomicDo = function(fn) {\n\n    const execution = this._currentExecution;\n\n    execution.atomic = true;\n\n    try {\n      fn();\n    } finally {\n      execution.atomic = false;\n    }\n  };\n\n  CommandStack.prototype._internalExecute = function(action, redo) {\n    const command = action.command,\n          context = action.context;\n\n    const handler = this._getHandler(command);\n\n    if (!handler) {\n      throw new Error('no command handler registered for <' + command + '>');\n    }\n\n    this._pushAction(action);\n\n    if (!redo) {\n      this._fire(command, 'preExecute', action);\n\n      if (handler.preExecute) {\n        handler.preExecute(context);\n      }\n\n      this._fire(command, 'preExecuted', action);\n    }\n\n    // guard against illegal nested command stack invocations\n    this._atomicDo(() => {\n\n      this._fire(command, 'execute', action);\n\n      if (handler.execute) {\n\n        // actual execute + mark return results as dirty\n        this._markDirty(handler.execute(context));\n      }\n\n      // log to stack\n      this._executedAction(action, redo);\n\n      this._fire(command, 'executed', action);\n    });\n\n    if (!redo) {\n      this._fire(command, 'postExecute', action);\n\n      if (handler.postExecute) {\n        handler.postExecute(context);\n      }\n\n      this._fire(command, 'postExecuted', action);\n    }\n\n    this._popAction();\n  };\n\n\n  CommandStack.prototype._pushAction = function(action) {\n\n    const execution = this._currentExecution,\n          actions = execution.actions;\n\n    const baseAction = actions[0];\n\n    if (execution.atomic) {\n      throw new Error('illegal invocation in <execute> or <revert> phase (action: ' + action.command + ')');\n    }\n\n    if (!action.id) {\n      action.id = (baseAction && baseAction.id) || this._createId();\n    }\n\n    actions.push(action);\n  };\n\n\n  CommandStack.prototype._popAction = function() {\n    const execution = this._currentExecution,\n          trigger = execution.trigger,\n          actions = execution.actions,\n          dirty = execution.dirty;\n\n    actions.pop();\n\n    if (!actions.length) {\n      this._eventBus.fire('elements.changed', { elements: uniqueBy('id', dirty.reverse()) });\n\n      dirty.length = 0;\n\n      this._fire('changed', { trigger: trigger });\n\n      execution.trigger = null;\n    }\n  };\n\n\n  CommandStack.prototype._markDirty = function(elements) {\n    const execution = this._currentExecution;\n\n    if (!elements) {\n      return;\n    }\n\n    elements = isArray$3(elements) ? elements : [ elements ];\n\n    execution.dirty = execution.dirty.concat(elements);\n  };\n\n\n  CommandStack.prototype._executedAction = function(action, redo) {\n    const stackIdx = ++this._stackIdx;\n\n    if (!redo) {\n      this._stack.splice(stackIdx, this._stack.length, action);\n    }\n  };\n\n\n  CommandStack.prototype._revertedAction = function(action) {\n    this._stackIdx--;\n  };\n\n\n  CommandStack.prototype._getHandler = function(command) {\n    return this._handlerMap[command];\n  };\n\n  CommandStack.prototype._setHandler = function(command, handler) {\n    if (!command || !handler) {\n      throw new Error('command and handler required');\n    }\n\n    if (this._handlerMap[command]) {\n      throw new Error('overriding handler for command <' + command + '>');\n    }\n\n    this._handlerMap[command] = handler;\n  };\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var CommandModule = {\n    commandStack: [ 'type', CommandStack ]\n  };\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   *\n   * @typedef {import('../../util/Types').RectTRBL} RectTRBL\n   *\n   * @typedef { {\n   *   html: string | HTMLElement;\n   *   position: RectTRBL;\n   *   show?: {\n   *     minZoom?: number;\n   *     maxZoom?: number;\n   *   };\n   *   timeout?: number;\n   * } } Tooltip\n   */\n\n  // document wide unique tooltip ids\n  var ids = new IdGenerator('tt');\n\n\n  function createRoot(parentNode) {\n    var root = domify$1(\n      '<div class=\"djs-tooltip-container\" />'\n    );\n\n    assign(root, {\n      position: 'absolute',\n      width: '0',\n      height: '0'\n    });\n\n    parentNode.insertBefore(root, parentNode.firstChild);\n\n    return root;\n  }\n\n\n  function setPosition(el, x, y) {\n    assign(el, { left: x + 'px', top: y + 'px' });\n  }\n\n  function setVisible(el, visible) {\n    el.style.display = visible === false ? 'none' : '';\n  }\n\n\n  var tooltipClass = 'djs-tooltip',\n      tooltipSelector = '.' + tooltipClass;\n\n  /**\n   * A service that allows users to render tool tips on the diagram.\n   *\n   * The tooltip service will take care of updating the tooltip positioning\n   * during navigation + zooming.\n   *\n   * @example\n   *\n   * ```javascript\n   *\n   * // add a pink badge on the top left of the shape\n   * tooltips.add({\n   *   position: {\n   *     x: 50,\n   *     y: 100\n   *   },\n   *   html: '<div style=\"width: 10px; background: fuchsia; color: white;\">0</div>'\n   * });\n   *\n   * // or with optional life span\n   * tooltips.add({\n   *   position: {\n   *     top: -5,\n   *     left: -5\n   *   },\n   *   html: '<div style=\"width: 10px; background: fuchsia; color: white;\">0</div>',\n   *   ttl: 2000\n   * });\n   *\n   * // remove a tool tip\n   * var id = tooltips.add(...);\n   *\n   * tooltips.remove(id);\n   * ```\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   */\n  function Tooltips(eventBus, canvas) {\n\n    this._eventBus = eventBus;\n    this._canvas = canvas;\n\n    this._ids = ids;\n\n    this._tooltipDefaults = {\n      show: {\n        minZoom: 0.7,\n        maxZoom: 5.0\n      }\n    };\n\n    /**\n     * @type {Record<string, Tooltip>}\n     */\n    this._tooltips = {};\n\n    // root html element for all tooltips\n    this._tooltipRoot = createRoot(canvas.getContainer());\n\n\n    var self = this;\n\n    delegate.bind(this._tooltipRoot, tooltipSelector, 'mousedown', function(event) {\n      event.stopPropagation();\n    });\n\n    delegate.bind(this._tooltipRoot, tooltipSelector, 'mouseover', function(event) {\n      self.trigger('mouseover', event);\n    });\n\n    delegate.bind(this._tooltipRoot, tooltipSelector, 'mouseout', function(event) {\n      self.trigger('mouseout', event);\n    });\n\n    this._init();\n  }\n\n\n  Tooltips.$inject = [ 'eventBus', 'canvas' ];\n\n\n  /**\n   * Adds an HTML tooltip to the diagram.\n   *\n   * @param {Tooltip} tooltip\n   *\n   * @return {string} ID of the tooltip.\n   */\n  Tooltips.prototype.add = function(tooltip) {\n\n    if (!tooltip.position) {\n      throw new Error('must specifiy tooltip position');\n    }\n\n    if (!tooltip.html) {\n      throw new Error('must specifiy tooltip html');\n    }\n\n    var id = this._ids.next();\n\n    tooltip = assign$1({}, this._tooltipDefaults, tooltip, {\n      id: id\n    });\n\n    this._addTooltip(tooltip);\n\n    if (tooltip.timeout) {\n      this.setTimeout(tooltip);\n    }\n\n    return id;\n  };\n\n  /**\n   * @param {string} action\n   * @param {Event} event\n   */\n  Tooltips.prototype.trigger = function(action, event) {\n\n    var node = event.delegateTarget || event.target;\n\n    var tooltip = this.get(attr$1(node, 'data-tooltip-id'));\n\n    if (!tooltip) {\n      return;\n    }\n\n    if (action === 'mouseover' && tooltip.timeout) {\n      this.clearTimeout(tooltip);\n    }\n\n    if (action === 'mouseout' && tooltip.timeout) {\n\n      // cut timeout after mouse out\n      tooltip.timeout = 1000;\n\n      this.setTimeout(tooltip);\n    }\n  };\n\n  /**\n   * Get tooltip with given ID.\n   *\n   * @param {Tooltip|string} id\n   *\n   * @return {Tooltip|undefined}\n   */\n  Tooltips.prototype.get = function(id) {\n\n    if (typeof id !== 'string') {\n      id = id.id;\n    }\n\n    return this._tooltips[id];\n  };\n\n  /**\n   * @param {Tooltip} tooltip\n   */\n  Tooltips.prototype.clearTimeout = function(tooltip) {\n\n    tooltip = this.get(tooltip);\n\n    if (!tooltip) {\n      return;\n    }\n\n    var removeTimer = tooltip.removeTimer;\n\n    if (removeTimer) {\n      clearTimeout(removeTimer);\n      tooltip.removeTimer = null;\n    }\n  };\n\n  /**\n   * @param {Tooltip} tooltip\n   */\n  Tooltips.prototype.setTimeout = function(tooltip) {\n\n    tooltip = this.get(tooltip);\n\n    if (!tooltip) {\n      return;\n    }\n\n    this.clearTimeout(tooltip);\n\n    var self = this;\n\n    tooltip.removeTimer = setTimeout(function() {\n      self.remove(tooltip);\n    }, tooltip.timeout);\n  };\n\n  /**\n   * Remove tooltip with given ID.\n   *\n   * @param {string | Tooltip} id\n   */\n  Tooltips.prototype.remove = function(id) {\n\n    var tooltip = this.get(id);\n\n    if (tooltip) {\n      remove$2(tooltip.html);\n      remove$2(tooltip.htmlContainer);\n\n      delete tooltip.htmlContainer;\n\n      delete this._tooltips[tooltip.id];\n    }\n  };\n\n\n  Tooltips.prototype.show = function() {\n    setVisible(this._tooltipRoot);\n  };\n\n\n  Tooltips.prototype.hide = function() {\n    setVisible(this._tooltipRoot, false);\n  };\n\n\n  Tooltips.prototype._updateRoot = function(viewbox) {\n    var a = viewbox.scale || 1;\n    var d = viewbox.scale || 1;\n\n    var matrix = 'matrix(' + a + ',0,0,' + d + ',' + (-1 * viewbox.x * a) + ',' + (-1 * viewbox.y * d) + ')';\n\n    this._tooltipRoot.style.transform = matrix;\n    this._tooltipRoot.style['-ms-transform'] = matrix;\n  };\n\n\n  Tooltips.prototype._addTooltip = function(tooltip) {\n\n    var id = tooltip.id,\n        html = tooltip.html,\n        htmlContainer,\n        tooltipRoot = this._tooltipRoot;\n\n    // unwrap jquery (for those who need it)\n    if (html.get && html.constructor.prototype.jquery) {\n      html = html.get(0);\n    }\n\n    // create proper html elements from\n    // tooltip HTML strings\n    if (isString(html)) {\n      html = domify$1(html);\n    }\n\n    htmlContainer = domify$1('<div data-tooltip-id=\"' + id + '\" class=\"' + tooltipClass + '\">');\n    assign(htmlContainer, { position: 'absolute' });\n\n    htmlContainer.appendChild(html);\n\n    if (tooltip.type) {\n      classes$1(htmlContainer).add('djs-tooltip-' + tooltip.type);\n    }\n\n    if (tooltip.className) {\n      classes$1(htmlContainer).add(tooltip.className);\n    }\n\n    tooltip.htmlContainer = htmlContainer;\n\n    tooltipRoot.appendChild(htmlContainer);\n\n    this._tooltips[id] = tooltip;\n\n    this._updateTooltip(tooltip);\n  };\n\n\n  Tooltips.prototype._updateTooltip = function(tooltip) {\n\n    var position = tooltip.position,\n        htmlContainer = tooltip.htmlContainer;\n\n    // update overlay html based on tooltip x, y\n\n    setPosition(htmlContainer, position.x, position.y);\n  };\n\n\n  Tooltips.prototype._updateTooltipVisibilty = function(viewbox) {\n\n    forEach$1(this._tooltips, function(tooltip) {\n      var show = tooltip.show,\n          htmlContainer = tooltip.htmlContainer,\n          visible = true;\n\n      if (show) {\n        if (show.minZoom > viewbox.scale ||\n            show.maxZoom < viewbox.scale) {\n          visible = false;\n        }\n\n        setVisible(htmlContainer, visible);\n      }\n    });\n  };\n\n  Tooltips.prototype._init = function() {\n\n    var self = this;\n\n    // scroll/zoom integration\n\n    function updateViewbox(viewbox) {\n      self._updateRoot(viewbox);\n      self._updateTooltipVisibilty(viewbox);\n\n      self.show();\n    }\n\n    this._eventBus.on('canvas.viewbox.changing', function(event) {\n      self.hide();\n    });\n\n    this._eventBus.on('canvas.viewbox.changed', function(event) {\n      updateViewbox(event.viewbox);\n    });\n  };\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var TooltipsModule = {\n    __init__: [ 'tooltips' ],\n    tooltips: [ 'type', Tooltips ]\n  };\n\n  /**\n   * Remove from the beginning of a collection until it is empty.\n   *\n   * This is a null-safe operation that ensures elements\n   * are being removed from the given collection until the\n   * collection is empty.\n   *\n   * The implementation deals with the fact that a remove operation\n   * may touch, i.e. remove multiple elements in the collection\n   * at a time.\n   *\n   * @param {Object[]} [collection]\n   * @param {(element: Object) => void} removeFn\n   *\n   * @return {Object[]} the cleared collection\n   */\n  function saveClear(collection, removeFn) {\n\n    if (typeof removeFn !== 'function') {\n      throw new Error('removeFn iterator must be a function');\n    }\n\n    if (!collection) {\n      return;\n    }\n\n    var e;\n\n    while ((e = collection[0])) {\n      removeFn(e);\n    }\n\n    return collection;\n  }\n\n  var LOW_PRIORITY$4 = 250,\n      HIGH_PRIORITY$4 = 1400;\n\n  /**\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef {import('didi').Injector} Injector\n   *\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   */\n\n  /**\n   * A handler that makes sure labels are properly moved with\n   * their label targets.\n   *\n   * @param {Injector} injector\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   */\n  function LabelSupport(injector, eventBus, modeling) {\n\n    CommandInterceptor.call(this, eventBus);\n\n    var movePreview = injector.get('movePreview', false);\n\n    // remove labels from the collection that are being\n    // moved with other elements anyway\n    eventBus.on('shape.move.start', HIGH_PRIORITY$4, function(e) {\n\n      var context = e.context,\n          shapes = context.shapes,\n          validatedShapes = context.validatedShapes;\n\n      context.shapes = removeLabels(shapes);\n      context.validatedShapes = removeLabels(validatedShapes);\n    });\n\n    // add labels to visual's group\n    movePreview && eventBus.on('shape.move.start', LOW_PRIORITY$4, function(e) {\n\n      var context = e.context,\n          shapes = context.shapes;\n\n      var labels = [];\n\n      forEach$1(shapes, function(element) {\n\n        forEach$1(element.labels, function(label) {\n\n          if (!label.hidden && context.shapes.indexOf(label) === -1) {\n            labels.push(label);\n          }\n\n          if (element.labelTarget) {\n            labels.push(element);\n          }\n        });\n      });\n\n      forEach$1(labels, function(label) {\n        movePreview.makeDraggable(context, label, true);\n      });\n\n    });\n\n    // add all labels to move closure\n    this.preExecuted('elements.move', HIGH_PRIORITY$4, function(e) {\n      var context = e.context,\n          closure = context.closure,\n          enclosedElements = closure.enclosedElements;\n\n      var enclosedLabels = [];\n\n      // find labels that are not part of\n      // move closure yet and add them\n      forEach$1(enclosedElements, function(element) {\n        forEach$1(element.labels, function(label) {\n\n          if (!enclosedElements[label.id]) {\n            enclosedLabels.push(label);\n          }\n        });\n      });\n\n      closure.addAll(enclosedLabels);\n    });\n\n\n    this.preExecute([\n      'connection.delete',\n      'shape.delete'\n    ], function(e) {\n\n      var context = e.context,\n          element = context.connection || context.shape;\n\n      saveClear(element.labels, function(label) {\n        modeling.removeShape(label, { nested: true });\n      });\n    });\n\n\n    this.execute('shape.delete', function(e) {\n\n      var context = e.context,\n          shape = context.shape,\n          labelTarget = shape.labelTarget;\n\n      // unset labelTarget\n      if (labelTarget) {\n        context.labelTargetIndex = indexOf(labelTarget.labels, shape);\n        context.labelTarget = labelTarget;\n\n        shape.labelTarget = null;\n      }\n    });\n\n    this.revert('shape.delete', function(e) {\n\n      var context = e.context,\n          shape = context.shape,\n          labelTarget = context.labelTarget,\n          labelTargetIndex = context.labelTargetIndex;\n\n      // restore labelTarget\n      if (labelTarget) {\n        add(labelTarget.labels, shape, labelTargetIndex);\n\n        shape.labelTarget = labelTarget;\n      }\n    });\n\n  }\n\n  e$3(LabelSupport, CommandInterceptor);\n\n  LabelSupport.$inject = [\n    'injector',\n    'eventBus',\n    'modeling'\n  ];\n\n\n  /**\n   * Return a filtered list of elements that do not\n   * contain attached elements with hosts being part\n   * of the selection.\n   *\n   * @param {Element[]} elements\n   *\n   * @return {Element[]} filtered\n   */\n  function removeLabels(elements) {\n\n    return filter(elements, function(element) {\n\n      // filter out labels that are move together\n      // with their label targets\n      return elements.indexOf(element.labelTarget) === -1;\n    });\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var LabelSupportModule = {\n    __init__: [ 'labelSupport' ],\n    labelSupport: [ 'type', LabelSupport ]\n  };\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../rules/Rules').default} Rules\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   */\n\n  var LOW_PRIORITY$3 = 251,\n      HIGH_PRIORITY$3 = 1401;\n\n  var MARKER_ATTACH$1 = 'attach-ok';\n\n\n  /**\n   * Adds the notion of attached elements to the modeler.\n   *\n   * Optionally depends on `diagram-js/lib/features/move` to render\n   * the attached elements during move preview.\n   *\n   * Optionally depends on `diagram-js/lib/features/label-support`\n   * to render attached labels during move preview.\n   *\n   * @param {Injector} injector\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {Rules} rules\n   * @param {Modeling} modeling\n   */\n  function AttachSupport(injector, eventBus, canvas, rules, modeling) {\n\n    CommandInterceptor.call(this, eventBus);\n\n    var movePreview = injector.get('movePreview', false);\n\n\n    // remove all the attached elements from the shapes to be validated\n    // add all the attached shapes to the overall list of moved shapes\n    eventBus.on('shape.move.start', HIGH_PRIORITY$3, function(e) {\n\n      var context = e.context,\n          shapes = context.shapes,\n          validatedShapes = context.validatedShapes;\n\n      context.shapes = addAttached(shapes);\n\n      context.validatedShapes = removeAttached(validatedShapes);\n    });\n\n    // add attachers to the visual's group\n    movePreview && eventBus.on('shape.move.start', LOW_PRIORITY$3, function(e) {\n\n      var context = e.context,\n          shapes = context.shapes,\n          attachers = getAttachers(shapes);\n\n      forEach$1(attachers, function(attacher) {\n        movePreview.makeDraggable(context, attacher, true);\n\n        forEach$1(attacher.labels, function(label) {\n          movePreview.makeDraggable(context, label, true);\n        });\n      });\n    });\n\n    // add attach-ok marker to current host\n    movePreview && eventBus.on('shape.move.start', function(event) {\n      var context = event.context,\n          shapes = context.shapes;\n\n      if (shapes.length !== 1) {\n        return;\n      }\n\n      var shape = shapes[0];\n\n      var host = shape.host;\n\n      if (host) {\n        canvas.addMarker(host, MARKER_ATTACH$1);\n\n        eventBus.once([\n          'shape.move.out',\n          'shape.move.cleanup'\n        ], function() {\n          canvas.removeMarker(host, MARKER_ATTACH$1);\n        });\n      }\n    });\n\n    // add all attachers to move closure\n    this.preExecuted('elements.move', HIGH_PRIORITY$3, function(e) {\n      var context = e.context,\n          closure = context.closure,\n          shapes = context.shapes,\n          attachers = getAttachers(shapes);\n\n      forEach$1(attachers, function(attacher) {\n        closure.add(attacher, closure.topLevel[attacher.host.id]);\n      });\n    });\n\n    // perform the attaching after shapes are done moving\n    this.postExecuted('elements.move', function(e) {\n\n      var context = e.context,\n          shapes = context.shapes,\n          newHost = context.newHost,\n          attachers;\n\n      // only single elements can be attached\n      // multiply elements can be detached\n      if (newHost && shapes.length !== 1) {\n        return;\n      }\n\n      if (newHost) {\n        attachers = shapes;\n      } else {\n\n        // find attachers moved without host\n        attachers = filter(shapes, function(shape) {\n          var host = shape.host;\n\n          return isAttacher(shape) && !includes$2(shapes, host);\n        });\n      }\n\n      forEach$1(attachers, function(attacher) {\n        modeling.updateAttachment(attacher, newHost);\n      });\n    });\n\n    // ensure invalid attachment connections are removed\n    this.postExecuted('elements.move', function(e) {\n\n      var shapes = e.context.shapes;\n\n      forEach$1(shapes, function(shape) {\n\n        forEach$1(shape.attachers, function(attacher) {\n\n          // remove invalid outgoing connections\n          forEach$1(attacher.outgoing.slice(), function(connection) {\n            var allowed = rules.allowed('connection.reconnect', {\n              connection: connection,\n              source: connection.source,\n              target: connection.target\n            });\n\n            if (!allowed) {\n              modeling.removeConnection(connection);\n            }\n          });\n\n          // remove invalid incoming connections\n          forEach$1(attacher.incoming.slice(), function(connection) {\n            var allowed = rules.allowed('connection.reconnect', {\n              connection: connection,\n              source: connection.source,\n              target: connection.target\n            });\n\n            if (!allowed) {\n              modeling.removeConnection(connection);\n            }\n          });\n        });\n      });\n    });\n\n    this.postExecute('shape.create', function(e) {\n      var context = e.context,\n          shape = context.shape,\n          host = context.host;\n\n      if (host) {\n        modeling.updateAttachment(shape, host);\n      }\n    });\n\n    // update attachments if the host is replaced\n    this.postExecute('shape.replace', function(e) {\n\n      var context = e.context,\n          oldShape = context.oldShape,\n          newShape = context.newShape;\n\n      // move the attachers to the new host\n      saveClear(oldShape.attachers, function(attacher) {\n        var allowed = rules.allowed('elements.move', {\n          target: newShape,\n          shapes: [ attacher ]\n        });\n\n        if (allowed === 'attach') {\n          modeling.updateAttachment(attacher, newShape);\n        } else {\n          modeling.removeShape(attacher);\n        }\n      });\n\n      // move attachers if new host has different size\n      if (newShape.attachers.length) {\n\n        forEach$1(newShape.attachers, function(attacher) {\n          var delta = getNewAttachShapeDelta(attacher, oldShape, newShape);\n          modeling.moveShape(attacher, delta, attacher.parent);\n        });\n      }\n\n    });\n\n    // move shape on host resize\n    this.postExecute('shape.resize', function(event) {\n      var context = event.context,\n          shape = context.shape,\n          oldBounds = context.oldBounds,\n          newBounds = context.newBounds,\n          attachers = shape.attachers,\n          hints = context.hints || {};\n\n      if (hints.attachSupport === false) {\n        return;\n      }\n\n      forEach$1(attachers, function(attacher) {\n        var delta = getNewAttachShapeDelta(attacher, oldBounds, newBounds);\n\n        modeling.moveShape(attacher, delta, attacher.parent);\n\n        forEach$1(attacher.labels, function(label) {\n          modeling.moveShape(label, delta, label.parent);\n        });\n      });\n    });\n\n    // remove attachments\n    this.preExecute('shape.delete', function(event) {\n\n      var shape = event.context.shape;\n\n      saveClear(shape.attachers, function(attacher) {\n        modeling.removeShape(attacher);\n      });\n\n      if (shape.host) {\n        modeling.updateAttachment(shape, null);\n      }\n    });\n  }\n\n  e$3(AttachSupport, CommandInterceptor);\n\n  AttachSupport.$inject = [\n    'injector',\n    'eventBus',\n    'canvas',\n    'rules',\n    'modeling'\n  ];\n\n\n  /**\n   * Return attachers of the given shapes\n   *\n   * @param {Element[]} shapes\n   * @return {Element[]}\n   */\n  function getAttachers(shapes) {\n    return flatten(map$1(shapes, function(s) {\n      return s.attachers || [];\n    }));\n  }\n\n  /**\n   * Return a combined list of elements and\n   * attachers.\n   *\n   * @param {Element[]} elements\n   * @return {Element[]} filtered\n   */\n  function addAttached(elements) {\n    var attachers = getAttachers(elements);\n\n    return unionBy('id', elements, attachers);\n  }\n\n  /**\n   * Return a filtered list of elements that do not\n   * contain attached elements with hosts being part\n   * of the selection.\n   *\n   * @param {Element[]} elements\n   *\n   * @return {Element[]} filtered\n   */\n  function removeAttached(elements) {\n\n    var ids = groupBy(elements, 'id');\n\n    return filter(elements, function(element) {\n      while (element) {\n\n        // host in selection\n        if (element.host && ids[element.host.id]) {\n          return false;\n        }\n\n        element = element.parent;\n      }\n\n      return true;\n    });\n  }\n\n  function isAttacher(shape) {\n    return !!shape.host;\n  }\n\n  function includes$2(array, item) {\n    return array.indexOf(item) !== -1;\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var AttachSupportModule = {\n    __depends__: [\n      RulesModule$1\n    ],\n    __init__: [ 'attachSupport' ],\n    attachSupport: [ 'type', AttachSupport ]\n  };\n\n  /**\n   * @typedef {import('../../model/Types').Moddle} Moddle\n   * @typedef {import('../../model/Types').ModdleElement} ModdleElement\n   *\n   * @typedef {import('diagram-js/lib/util/Types').Point} Point\n   */\n\n  /**\n   * A factory for BPMN elements.\n   *\n   * @param {Moddle} moddle\n   */\n  function BpmnFactory(moddle) {\n    this._model = moddle;\n  }\n\n  BpmnFactory.$inject = [ 'moddle' ];\n\n  /**\n   * @param {ModdleElement} element\n   *\n   * @return {boolean}\n   */\n  BpmnFactory.prototype._needsId = function(element) {\n    return isAny(element, [\n      'bpmn:RootElement',\n      'bpmn:FlowElement',\n      'bpmn:MessageFlow',\n      'bpmn:DataAssociation',\n      'bpmn:Artifact',\n      'bpmn:Participant',\n      'bpmn:Lane',\n      'bpmn:LaneSet',\n      'bpmn:Process',\n      'bpmn:Collaboration',\n      'bpmndi:BPMNShape',\n      'bpmndi:BPMNEdge',\n      'bpmndi:BPMNDiagram',\n      'bpmndi:BPMNPlane',\n      'bpmn:Property',\n      'bpmn:CategoryValue'\n    ]);\n  };\n\n  /**\n   * @param {ModdleElement} element\n   */\n  BpmnFactory.prototype._ensureId = function(element) {\n    if (element.id) {\n      this._model.ids.claim(element.id, element);\n      return;\n    }\n\n    // generate semantic ids for elements\n    // bpmn:SequenceFlow -> SequenceFlow_ID\n    var prefix;\n\n    if (is$1(element, 'bpmn:Activity')) {\n      prefix = 'Activity';\n    } else if (is$1(element, 'bpmn:Event')) {\n      prefix = 'Event';\n    } else if (is$1(element, 'bpmn:Gateway')) {\n      prefix = 'Gateway';\n    } else if (isAny(element, [ 'bpmn:SequenceFlow', 'bpmn:MessageFlow' ])) {\n      prefix = 'Flow';\n    } else {\n      prefix = (element.$type || '').replace(/^[^:]*:/g, '');\n    }\n\n    prefix += '_';\n\n    if (!element.id && this._needsId(element)) {\n      element.id = this._model.ids.nextPrefixed(prefix, element);\n    }\n  };\n\n  /**\n   * Create BPMN element.\n   *\n   * @param {string} type\n   * @param {Object} [attrs]\n   *\n   * @return {ModdleElement}\n   */\n  BpmnFactory.prototype.create = function(type, attrs) {\n    var element = this._model.create(type, attrs || {});\n\n    this._ensureId(element);\n\n    return element;\n  };\n\n  /**\n   * @return {ModdleElement}\n   */\n  BpmnFactory.prototype.createDiLabel = function() {\n    return this.create('bpmndi:BPMNLabel', {\n      bounds: this.createDiBounds()\n    });\n  };\n\n  /**\n   * @param {ModdleElement} semantic\n   * @param {Object} [attrs]\n   * @return {ModdleElement}\n   */\n  BpmnFactory.prototype.createDiShape = function(semantic, attrs) {\n    return this.create('bpmndi:BPMNShape', assign$1({\n      bpmnElement: semantic,\n      bounds: this.createDiBounds()\n    }, attrs));\n  };\n\n  /**\n   * @return {ModdleElement}\n   */\n  BpmnFactory.prototype.createDiBounds = function(bounds) {\n    return this.create('dc:Bounds', bounds);\n  };\n\n  /**\n   * @param {Point[]} waypoints\n   *\n   * @return {ModdleElement[]}\n   */\n  BpmnFactory.prototype.createDiWaypoints = function(waypoints) {\n    var self = this;\n\n    return map$1(waypoints, function(pos) {\n      return self.createDiWaypoint(pos);\n    });\n  };\n\n  /**\n   * @param {Point} point\n   *\n   * @return {ModdleElement}\n   */\n  BpmnFactory.prototype.createDiWaypoint = function(point) {\n    return this.create('dc:Point', pick(point, [ 'x', 'y' ]));\n  };\n\n  /**\n   * @param {ModdleElement} semantic\n   * @param {Object} [attrs]\n   *\n   * @return {ModdleElement}\n   */\n  BpmnFactory.prototype.createDiEdge = function(semantic, attrs) {\n    return this.create('bpmndi:BPMNEdge', assign$1({\n      bpmnElement: semantic,\n      waypoint: this.createDiWaypoints([])\n    }, attrs));\n  };\n\n  /**\n   * @param {ModdleElement} semantic\n   * @param {Object} [attrs]\n   *\n   * @return {ModdleElement}\n   */\n  BpmnFactory.prototype.createDiPlane = function(semantic, attrs) {\n    return this.create('bpmndi:BPMNPlane', assign$1({\n      bpmnElement: semantic\n    }, attrs));\n  };\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('./BpmnFactory').default} BpmnFactory\n   * @typedef {import('diagram-js/lib/layout/CroppingConnectionDocking').default} CroppingConnectionDocking\n   * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n   *\n   * @typedef {import('../../model/Types').Connection} Connection\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Shape} Shape\n   * @typedef {import('../../model/Types').Parent} Parent\n   * @typedef {import('../../model/Types').ModdleElement} ModdleElement\n   */\n\n  /**\n   * A handler responsible for updating the underlying BPMN 2.0 XML & DI\n   * once changes on the diagram happen.\n   *\n   * @param {EventBus} eventBus\n   * @param {BpmnFactory} bpmnFactory\n   * @param {CroppingConnectionDocking} connectionDocking\n   * @param {Translate} translate\n   */\n  function BpmnUpdater(\n      eventBus,\n      bpmnFactory,\n      connectionDocking,\n      translate\n  ) {\n\n    CommandInterceptor.call(this, eventBus);\n\n    this._bpmnFactory = bpmnFactory;\n    this._translate = translate;\n\n    var self = this;\n\n\n\n    // connection cropping //////////////////////\n\n    // crop connection ends during create/update\n    function cropConnection(e) {\n      var context = e.context,\n          hints = context.hints || {},\n          connection;\n\n      if (!context.cropped && hints.createElementsBehavior !== false) {\n        connection = context.connection;\n        connection.waypoints = connectionDocking.getCroppedWaypoints(connection);\n        context.cropped = true;\n      }\n    }\n\n    this.executed([\n      'connection.layout',\n      'connection.create'\n    ], cropConnection);\n\n    this.reverted([ 'connection.layout' ], function(e) {\n      delete e.context.cropped;\n    });\n\n\n\n    // BPMN + DI update //////////////////////\n\n\n    // update parent\n    function updateParent(e) {\n      var context = e.context;\n\n      self.updateParent(context.shape || context.connection, context.oldParent);\n    }\n\n    function reverseUpdateParent(e) {\n      var context = e.context;\n\n      var element = context.shape || context.connection,\n\n          // oldParent is the (old) new parent, because we are undoing\n          oldParent = context.parent || context.newParent;\n\n      self.updateParent(element, oldParent);\n    }\n\n    this.executed([\n      'shape.move',\n      'shape.create',\n      'shape.delete',\n      'connection.create',\n      'connection.move',\n      'connection.delete'\n    ], ifBpmn(updateParent));\n\n    this.reverted([\n      'shape.move',\n      'shape.create',\n      'shape.delete',\n      'connection.create',\n      'connection.move',\n      'connection.delete'\n    ], ifBpmn(reverseUpdateParent));\n\n    /*\n     * ## Updating Parent\n     *\n     * When morphing a Process into a Collaboration or vice-versa,\n     * make sure that both the *semantic* and *di* parent of each element\n     * is updated.\n     *\n     */\n    function updateRoot(event) {\n      var context = event.context,\n          oldRoot = context.oldRoot,\n          children = oldRoot.children;\n\n      forEach$1(children, function(child) {\n        if (is$1(child, 'bpmn:BaseElement')) {\n          self.updateParent(child);\n        }\n      });\n    }\n\n    this.executed([ 'canvas.updateRoot' ], updateRoot);\n    this.reverted([ 'canvas.updateRoot' ], updateRoot);\n\n\n    // update bounds\n    function updateBounds(e) {\n      var shape = e.context.shape;\n\n      if (!is$1(shape, 'bpmn:BaseElement')) {\n        return;\n      }\n\n      self.updateBounds(shape);\n    }\n\n    this.executed([ 'shape.move', 'shape.create', 'shape.resize' ], ifBpmn(function(event) {\n\n      // exclude labels because they're handled separately during shape.changed\n      if (event.context.shape.type === 'label') {\n        return;\n      }\n\n      updateBounds(event);\n    }));\n\n    this.reverted([ 'shape.move', 'shape.create', 'shape.resize' ], ifBpmn(function(event) {\n\n      // exclude labels because they're handled separately during shape.changed\n      if (event.context.shape.type === 'label') {\n        return;\n      }\n\n      updateBounds(event);\n    }));\n\n    // Handle labels separately. This is necessary, because the label bounds have to be updated\n    // every time its shape changes, not only on move, create and resize.\n    eventBus.on('shape.changed', function(event) {\n      if (event.element.type === 'label') {\n        updateBounds({ context: { shape: event.element } });\n      }\n    });\n\n    // attach / detach connection\n    function updateConnection(e) {\n      self.updateConnection(e.context);\n    }\n\n    this.executed([\n      'connection.create',\n      'connection.move',\n      'connection.delete',\n      'connection.reconnect'\n    ], ifBpmn(updateConnection));\n\n    this.reverted([\n      'connection.create',\n      'connection.move',\n      'connection.delete',\n      'connection.reconnect'\n    ], ifBpmn(updateConnection));\n\n\n    // update waypoints\n    function updateConnectionWaypoints(e) {\n      self.updateConnectionWaypoints(e.context.connection);\n    }\n\n    this.executed([\n      'connection.layout',\n      'connection.move',\n      'connection.updateWaypoints',\n    ], ifBpmn(updateConnectionWaypoints));\n\n    this.reverted([\n      'connection.layout',\n      'connection.move',\n      'connection.updateWaypoints',\n    ], ifBpmn(updateConnectionWaypoints));\n\n    // update conditional/default flows\n    this.executed('connection.reconnect', ifBpmn(function(event) {\n      var context = event.context,\n          connection = context.connection,\n          oldSource = context.oldSource,\n          newSource = context.newSource,\n          connectionBo = getBusinessObject(connection),\n          oldSourceBo = getBusinessObject(oldSource),\n          newSourceBo = getBusinessObject(newSource);\n\n      // remove condition from connection on reconnect to new source\n      // if new source can NOT have condional sequence flow\n      if (connectionBo.conditionExpression && !isAny(newSourceBo, [\n        'bpmn:Activity',\n        'bpmn:ExclusiveGateway',\n        'bpmn:InclusiveGateway'\n      ])) {\n        context.oldConditionExpression = connectionBo.conditionExpression;\n\n        delete connectionBo.conditionExpression;\n      }\n\n      // remove default from old source flow on reconnect to new source\n      // if source changed\n      if (oldSource !== newSource && oldSourceBo.default === connectionBo) {\n        context.oldDefault = oldSourceBo.default;\n\n        delete oldSourceBo.default;\n      }\n    }));\n\n    this.reverted('connection.reconnect', ifBpmn(function(event) {\n      var context = event.context,\n          connection = context.connection,\n          oldSource = context.oldSource,\n          newSource = context.newSource,\n          connectionBo = getBusinessObject(connection),\n          oldSourceBo = getBusinessObject(oldSource),\n          newSourceBo = getBusinessObject(newSource);\n\n      // add condition to connection on revert reconnect to new source\n      if (context.oldConditionExpression) {\n        connectionBo.conditionExpression = context.oldConditionExpression;\n      }\n\n      // add default to old source on revert reconnect to new source\n      if (context.oldDefault) {\n        oldSourceBo.default = context.oldDefault;\n\n        delete newSourceBo.default;\n      }\n    }));\n\n    // update attachments\n    function updateAttachment(e) {\n      self.updateAttachment(e.context);\n    }\n\n    this.executed([ 'element.updateAttachment' ], ifBpmn(updateAttachment));\n    this.reverted([ 'element.updateAttachment' ], ifBpmn(updateAttachment));\n\n\n    // update BPMNLabel\n    this.executed('element.updateLabel', ifBpmn(updateBPMNLabel));\n    this.reverted('element.updateLabel', ifBpmn(updateBPMNLabel));\n\n    function updateBPMNLabel(event) {\n      const { element } = event.context,\n            label = getLabel(element);\n      const di = getDi(element),\n            diLabel = di && di.get('label');\n\n      if (isLabelExternal(element)) {\n        return;\n      }\n\n      if (label && !diLabel) {\n        di.set('label', bpmnFactory.create('bpmndi:BPMNLabel'));\n      } else if (!label && diLabel) {\n        di.set('label', undefined);\n      }\n    }\n  }\n\n  e$3(BpmnUpdater, CommandInterceptor);\n\n  BpmnUpdater.$inject = [\n    'eventBus',\n    'bpmnFactory',\n    'connectionDocking',\n    'translate'\n  ];\n\n\n  // implementation //////////////////////\n\n  /**\n   * @param { {\n   *   shape: Shape;\n   *   host: Shape;\n   * } } context\n   */\n  BpmnUpdater.prototype.updateAttachment = function(context) {\n\n    var shape = context.shape,\n        businessObject = shape.businessObject,\n        host = shape.host;\n\n    businessObject.attachedToRef = host && host.businessObject;\n  };\n\n  /**\n   * @param {Element} element\n   * @param {Parent} oldParent\n   */\n  BpmnUpdater.prototype.updateParent = function(element, oldParent) {\n\n    // do not update BPMN 2.0 label parent\n    if (isLabel(element)) {\n      return;\n    }\n\n    // data stores in collaborations are handled separately by DataStoreBehavior\n    if (is$1(element, 'bpmn:DataStoreReference') &&\n        element.parent &&\n        is$1(element.parent, 'bpmn:Collaboration')) {\n      return;\n    }\n\n    var parentShape = element.parent;\n\n    var businessObject = element.businessObject,\n        di = getDi(element),\n        parentBusinessObject = parentShape && parentShape.businessObject,\n        parentDi = getDi(parentShape);\n\n    if (is$1(element, 'bpmn:FlowNode')) {\n      this.updateFlowNodeRefs(businessObject, parentBusinessObject, oldParent && oldParent.businessObject);\n    }\n\n    if (is$1(element, 'bpmn:DataOutputAssociation')) {\n      if (element.source) {\n        parentBusinessObject = element.source.businessObject;\n      } else {\n        parentBusinessObject = null;\n      }\n    }\n\n    if (is$1(element, 'bpmn:DataInputAssociation')) {\n      if (element.target) {\n        parentBusinessObject = element.target.businessObject;\n      } else {\n        parentBusinessObject = null;\n      }\n    }\n\n    this.updateSemanticParent(businessObject, parentBusinessObject);\n\n    if (is$1(element, 'bpmn:DataObjectReference') && businessObject.dataObjectRef) {\n      this.updateSemanticParent(businessObject.dataObjectRef, parentBusinessObject);\n    }\n\n    this.updateDiParent(di, parentDi);\n  };\n\n  /**\n   * @param {Shape} shape\n   */\n  BpmnUpdater.prototype.updateBounds = function(shape) {\n\n    var di = getDi(shape),\n        embeddedLabelBounds = getEmbeddedLabelBounds(shape);\n\n    // update embedded label bounds if possible\n    if (embeddedLabelBounds) {\n      var embeddedLabelBoundsDelta = delta(embeddedLabelBounds, di.get('bounds'));\n\n      assign$1(embeddedLabelBounds, {\n        x: shape.x + embeddedLabelBoundsDelta.x,\n        y: shape.y + embeddedLabelBoundsDelta.y\n      });\n    }\n\n    var target = isLabel(shape) ? this._getLabel(di) : di;\n\n    var bounds = target.bounds;\n\n    if (!bounds) {\n      bounds = this._bpmnFactory.createDiBounds();\n      target.set('bounds', bounds);\n    }\n\n    assign$1(bounds, {\n      x: shape.x,\n      y: shape.y,\n      width: shape.width,\n      height: shape.height\n    });\n  };\n\n  /**\n   * @param {ModdleElement} businessObject\n   * @param {ModdleElement} newContainment\n   * @param {ModdleElement} oldContainment\n   */\n  BpmnUpdater.prototype.updateFlowNodeRefs = function(businessObject, newContainment, oldContainment) {\n\n    if (oldContainment === newContainment) {\n      return;\n    }\n\n    var oldRefs, newRefs;\n\n    if (is$1 (oldContainment, 'bpmn:Lane')) {\n      oldRefs = oldContainment.get('flowNodeRef');\n      remove(oldRefs, businessObject);\n    }\n\n    if (is$1(newContainment, 'bpmn:Lane')) {\n      newRefs = newContainment.get('flowNodeRef');\n      add(newRefs, businessObject);\n    }\n  };\n\n  /**\n   * @param {Connection} connection\n   * @param {Element} newSource\n   * @param {Element} newTarget\n   */\n  BpmnUpdater.prototype.updateDiConnection = function(connection, newSource, newTarget) {\n    var connectionDi = getDi(connection),\n        newSourceDi = getDi(newSource),\n        newTargetDi = getDi(newTarget);\n\n    if (connectionDi.sourceElement && connectionDi.sourceElement.bpmnElement !== getBusinessObject(newSource)) {\n      connectionDi.sourceElement = newSource && newSourceDi;\n    }\n\n    if (connectionDi.targetElement && connectionDi.targetElement.bpmnElement !== getBusinessObject(newTarget)) {\n      connectionDi.targetElement = newTarget && newTargetDi;\n    }\n\n  };\n\n  /**\n   * @param {ModdleElement} di\n   * @param {ModdleElement} parentDi\n   */\n  BpmnUpdater.prototype.updateDiParent = function(di, parentDi) {\n\n    if (parentDi && !is$1(parentDi, 'bpmndi:BPMNPlane')) {\n      parentDi = parentDi.$parent;\n    }\n\n    if (di.$parent === parentDi) {\n      return;\n    }\n\n    var planeElements = (parentDi || di.$parent).get('planeElement');\n\n    if (parentDi) {\n      planeElements.push(di);\n      di.$parent = parentDi;\n    } else {\n      remove(planeElements, di);\n      di.$parent = null;\n    }\n  };\n\n  /**\n   * @param {ModdleElement} element\n   *\n   * @return {ModdleElement}\n   */\n  function getDefinitions(element) {\n    while (element && !is$1(element, 'bpmn:Definitions')) {\n      element = element.$parent;\n    }\n\n    return element;\n  }\n\n  /**\n   * @param {ModdleElement} container\n   *\n   * @return {ModdleElement}\n   */\n  BpmnUpdater.prototype.getLaneSet = function(container) {\n\n    var laneSet, laneSets;\n\n    // bpmn:Lane\n    if (is$1(container, 'bpmn:Lane')) {\n      laneSet = container.childLaneSet;\n\n      if (!laneSet) {\n        laneSet = this._bpmnFactory.create('bpmn:LaneSet');\n        container.childLaneSet = laneSet;\n        laneSet.$parent = container;\n      }\n\n      return laneSet;\n    }\n\n    // bpmn:Participant\n    if (is$1(container, 'bpmn:Participant')) {\n      container = container.processRef;\n    }\n\n    // bpmn:FlowElementsContainer\n    laneSets = container.get('laneSets');\n    laneSet = laneSets[0];\n\n    if (!laneSet) {\n      laneSet = this._bpmnFactory.create('bpmn:LaneSet');\n      laneSet.$parent = container;\n      laneSets.push(laneSet);\n    }\n\n    return laneSet;\n  };\n\n  /**\n   * @param {ModdleElement} businessObject\n   * @param {ModdleElement} newParent\n   * @param {ModdleElement} visualParent\n   */\n  BpmnUpdater.prototype.updateSemanticParent = function(businessObject, newParent, visualParent) {\n\n    var containment,\n        translate = this._translate;\n\n    if (businessObject.$parent === newParent) {\n      return;\n    }\n\n    if (is$1(businessObject, 'bpmn:DataInput') || is$1(businessObject, 'bpmn:DataOutput')) {\n\n      if (is$1(newParent, 'bpmn:Participant') && 'processRef' in newParent) {\n        newParent = newParent.processRef;\n      }\n\n      // already in correct ioSpecification\n      if ('ioSpecification' in newParent && newParent.ioSpecification === businessObject.$parent) {\n        return;\n      }\n    }\n\n    if (is$1(businessObject, 'bpmn:Lane')) {\n\n      if (newParent) {\n        newParent = this.getLaneSet(newParent);\n      }\n\n      containment = 'lanes';\n    } else\n\n    if (is$1(businessObject, 'bpmn:FlowElement')) {\n\n      if (newParent) {\n\n        if (is$1(newParent, 'bpmn:Participant')) {\n          newParent = newParent.processRef;\n        } else\n\n        if (is$1(newParent, 'bpmn:Lane')) {\n          do {\n\n            // unwrap Lane -> LaneSet -> (Lane | FlowElementsContainer)\n            newParent = newParent.$parent.$parent;\n          } while (is$1(newParent, 'bpmn:Lane'));\n\n        }\n      }\n\n      containment = 'flowElements';\n\n    } else\n\n    if (is$1(businessObject, 'bpmn:Artifact')) {\n\n      while (newParent &&\n             !is$1(newParent, 'bpmn:Process') &&\n             !is$1(newParent, 'bpmn:SubProcess') &&\n             !is$1(newParent, 'bpmn:Collaboration')) {\n\n        if (is$1(newParent, 'bpmn:Participant')) {\n          newParent = newParent.processRef;\n          break;\n        } else {\n          newParent = newParent.$parent;\n        }\n      }\n\n      containment = 'artifacts';\n    } else\n\n    if (is$1(businessObject, 'bpmn:MessageFlow')) {\n      containment = 'messageFlows';\n\n    } else\n\n    if (is$1(businessObject, 'bpmn:Participant')) {\n      containment = 'participants';\n\n      // make sure the participants process is properly attached / detached\n      // from the XML document\n\n      var process = businessObject.processRef,\n          definitions;\n\n      if (process) {\n        definitions = getDefinitions(businessObject.$parent || newParent);\n\n        if (businessObject.$parent) {\n          remove(definitions.get('rootElements'), process);\n          process.$parent = null;\n        }\n\n        if (newParent) {\n          add(definitions.get('rootElements'), process);\n          process.$parent = definitions;\n        }\n      }\n    } else\n\n    if (is$1(businessObject, 'bpmn:DataOutputAssociation')) {\n      containment = 'dataOutputAssociations';\n    } else\n\n    if (is$1(businessObject, 'bpmn:DataInputAssociation')) {\n      containment = 'dataInputAssociations';\n    }\n\n    if (!containment) {\n      throw new Error(translate(\n        'no parent for {element} in {parent}',\n        {\n          element: businessObject.id,\n          parent: newParent.id\n        }\n      ));\n    }\n\n    var children;\n\n    if (businessObject.$parent) {\n\n      // remove from old parent\n      children = businessObject.$parent.get(containment);\n      remove(children, businessObject);\n    }\n\n    if (!newParent) {\n      businessObject.$parent = null;\n    } else {\n\n      // add to new parent\n      children = newParent.get(containment);\n      children.push(businessObject);\n      businessObject.$parent = newParent;\n    }\n\n    if (visualParent) {\n      var diChildren = visualParent.get(containment);\n\n      remove(children, businessObject);\n\n      if (newParent) {\n\n        if (!diChildren) {\n          diChildren = [];\n          newParent.set(containment, diChildren);\n        }\n\n        diChildren.push(businessObject);\n      }\n    }\n  };\n\n  /**\n   * @param {Connection} connection\n   */\n  BpmnUpdater.prototype.updateConnectionWaypoints = function(connection) {\n    var di = getDi(connection);\n\n    di.set('waypoint', this._bpmnFactory.createDiWaypoints(connection.waypoints));\n  };\n\n  /**\n   * @param { {\n   *   connection: Connection;\n   *   parent: Parent;\n   *   newParent: Parent;\n   * } } context\n   */\n  BpmnUpdater.prototype.updateConnection = function(context) {\n    var connection = context.connection,\n        businessObject = getBusinessObject(connection),\n        newSource = connection.source,\n        newSourceBo = getBusinessObject(newSource),\n        newTarget = connection.target,\n        newTargetBo = getBusinessObject(connection.target),\n        visualParent;\n\n    if (!is$1(businessObject, 'bpmn:DataAssociation')) {\n\n      var inverseSet = is$1(businessObject, 'bpmn:SequenceFlow');\n\n      if (businessObject.sourceRef !== newSourceBo) {\n        if (inverseSet) {\n          remove(businessObject.sourceRef && businessObject.sourceRef.get('outgoing'), businessObject);\n\n          if (newSourceBo && newSourceBo.get('outgoing')) {\n            newSourceBo.get('outgoing').push(businessObject);\n          }\n        }\n\n        businessObject.sourceRef = newSourceBo;\n      }\n\n      if (businessObject.targetRef !== newTargetBo) {\n        if (inverseSet) {\n          remove(businessObject.targetRef && businessObject.targetRef.get('incoming'), businessObject);\n\n          if (newTargetBo && newTargetBo.get('incoming')) {\n            newTargetBo.get('incoming').push(businessObject);\n          }\n        }\n\n        businessObject.targetRef = newTargetBo;\n      }\n    } else\n\n    if (is$1(businessObject, 'bpmn:DataInputAssociation')) {\n\n      // handle obnoxious isMsome sourceRef\n      businessObject.get('sourceRef')[0] = newSourceBo;\n\n      visualParent = context.parent || context.newParent || newTargetBo;\n\n      this.updateSemanticParent(businessObject, newTargetBo, visualParent);\n    } else\n\n    if (is$1(businessObject, 'bpmn:DataOutputAssociation')) {\n      visualParent = context.parent || context.newParent || newSourceBo;\n\n      this.updateSemanticParent(businessObject, newSourceBo, visualParent);\n\n      // targetRef = new target\n      businessObject.targetRef = newTargetBo;\n    }\n\n    this.updateConnectionWaypoints(connection);\n\n    this.updateDiConnection(connection, newSource, newTarget);\n  };\n\n\n  // helpers //////////////////////\n\n  BpmnUpdater.prototype._getLabel = function(di) {\n    if (!di.label) {\n      di.label = this._bpmnFactory.createDiLabel();\n    }\n\n    return di.label;\n  };\n\n\n  /**\n   * Call function if shape or connection is BPMN element.\n   *\n   * @param  {Function} fn\n   *\n   * @return {Function}\n   */\n  function ifBpmn(fn) {\n\n    return function(event) {\n\n      var context = event.context,\n          element = context.shape || context.connection || context.element;\n\n      if (is$1(element, 'bpmn:BaseElement')) {\n        fn(event);\n      }\n    };\n  }\n\n  /**\n   * Return dc:Bounds of bpmndi:BPMNLabel if exists.\n   *\n   * @param {Shape} shape\n   *\n   * @return {ModdleElement|undefined}\n   */\n  function getEmbeddedLabelBounds(shape) {\n    if (!is$1(shape, 'bpmn:Activity')) {\n      return;\n    }\n\n    var di = getDi(shape);\n\n    if (!di) {\n      return;\n    }\n\n    var label = di.get('label');\n\n    if (!label) {\n      return;\n    }\n\n    return label.get('bounds');\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n   *\n   * @typedef {import('diagram-js/lib/util/Types').Dimensions} Dimensions\n   *\n   * @typedef {import('./BpmnFactory').default} BpmnFactory\n   *\n   * @typedef {import('../../model/Types').BpmnAttributes} BpmnAttributes\n   * @typedef {import('../../model/Types').Connection} Connection\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Label} Label\n   * @typedef {import('../../model/Types').Root} Root\n   * @typedef {import('../../model/Types').Shape} Shape\n   * @typedef {import('../../model/Types').Moddle} Moddle\n   * @typedef {import('../../model/Types').ModdleElement} ModdleElement\n   */\n\n  /**\n   * A BPMN-specific element factory.\n   *\n   * @template {Connection} [T=Connection]\n   * @template {Label} [U=Label]\n   * @template {Root} [V=Root]\n   * @template {Shape} [W=Shape]\n   *\n   * @extends {BaseElementFactory<T, U, V, W>}\n   *\n   * @param {BpmnFactory} bpmnFactory\n   * @param {Moddle} moddle\n   * @param {Translate} translate\n   */\n  function ElementFactory(bpmnFactory, moddle, translate) {\n    ElementFactory$1.call(this);\n\n    this._bpmnFactory = bpmnFactory;\n    this._moddle = moddle;\n    this._translate = translate;\n  }\n\n  e$3(ElementFactory, ElementFactory$1);\n\n  ElementFactory.$inject = [\n    'bpmnFactory',\n    'moddle',\n    'translate'\n  ];\n\n  ElementFactory.prototype._baseCreate = ElementFactory$1.prototype.create;\n\n  /**\n   * Create a root element.\n   *\n   * @overlord\n   * @param {'root'} elementType\n   * @param {Partial<Root> & Partial<BpmnAttributes>} [attrs]\n   * @return {V}\n   */\n\n  /**\n   * Create a shape.\n   *\n   * @overlord\n   * @param {'shape'} elementType\n   * @param {Partial<Shape> & Partial<BpmnAttributes>} [attrs]\n   * @return {W}\n   */\n\n  /**\n   * Create a connection.\n   *\n   * @overlord\n   * @param {'connection'} elementType\n   * @param {Partial<Connection> & Partial<BpmnAttributes>} [attrs]\n   * @return {T}\n   */\n\n  /**\n   * Create a label.\n   *\n   * @param {'label'} elementType\n   * @param {Partial<Label> & Partial<BpmnAttributes>} [attrs]\n   * @return {U}\n   */\n  ElementFactory.prototype.create = function(elementType, attrs) {\n\n    // no special magic for labels,\n    // we assume their businessObjects have already been created\n    // and wired via attrs\n    if (elementType === 'label') {\n      var di = attrs.di || this._bpmnFactory.createDiLabel();\n      return this._baseCreate(elementType, assign$1({ type: 'label', di: di }, DEFAULT_LABEL_SIZE$1, attrs));\n    }\n\n    return this.createElement(elementType, attrs);\n  };\n\n  /**\n   * Create a BPMN root element.\n   *\n   * @overlord\n   * @param {'root'} elementType\n   * @param {Partial<Root> & Partial<BpmnAttributes>} [attrs]\n   * @return {V}\n   */\n\n  /**\n   * Create a BPMN shape.\n   *\n   * @overlord\n   * @param {'shape'} elementType\n   * @param {Partial<Shape> & Partial<BpmnAttributes>} [attrs]\n   * @return {W}\n   */\n\n  /**\n   * Create a BPMN connection.\n   *\n   * @param {'connection'} elementType\n   * @param {Partial<Connection> & Partial<BpmnAttributes>} [attrs]\n   * @return {T}\n   */\n  ElementFactory.prototype.createElement = function(elementType, attrs) {\n    var size,\n        translate = this._translate;\n\n    attrs = assign$1({}, attrs || {});\n\n    var businessObject = attrs.businessObject,\n        di = attrs.di;\n\n    if (!businessObject) {\n      if (!attrs.type) {\n        throw new Error(translate('no shape type specified'));\n      }\n\n      businessObject = this._bpmnFactory.create(attrs.type);\n\n      ensureCompatDiRef(businessObject);\n    }\n\n    if (!isModdleDi(di)) {\n      var diAttrs = assign$1(\n        {},\n        di || {},\n        { id: businessObject.id + '_di' }\n      );\n\n      if (elementType === 'root') {\n        di = this._bpmnFactory.createDiPlane(businessObject, diAttrs);\n      } else\n      if (elementType === 'connection') {\n        di = this._bpmnFactory.createDiEdge(businessObject, diAttrs);\n      } else {\n        di = this._bpmnFactory.createDiShape(businessObject, diAttrs);\n      }\n    }\n\n    if (is$1(businessObject, 'bpmn:Group')) {\n      attrs = assign$1({\n        isFrame: true\n      }, attrs);\n    }\n\n    attrs = applyAttributes(businessObject, attrs, [\n      'processRef',\n      'isInterrupting',\n      'associationDirection',\n      'isForCompensation'\n    ]);\n\n    if (attrs.isExpanded) {\n      attrs = applyAttribute(di, attrs, 'isExpanded');\n    }\n\n    if (is$1(businessObject, 'bpmn:SubProcess')) {\n      attrs.collapsed = !isExpanded(businessObject, di);\n    }\n\n    if (is$1(businessObject, 'bpmn:ExclusiveGateway')) {\n      di.isMarkerVisible = true;\n    }\n\n    if (isDefined(attrs.triggeredByEvent)) {\n      businessObject.triggeredByEvent = attrs.triggeredByEvent;\n      delete attrs.triggeredByEvent;\n    }\n\n    if (isDefined(attrs.cancelActivity)) {\n      businessObject.cancelActivity = attrs.cancelActivity;\n      delete attrs.cancelActivity;\n    }\n\n    var eventDefinitions,\n        newEventDefinition;\n\n    if (attrs.eventDefinitionType) {\n      eventDefinitions = businessObject.get('eventDefinitions') || [];\n      newEventDefinition = this._bpmnFactory.create(attrs.eventDefinitionType, attrs.eventDefinitionAttrs);\n\n      if (attrs.eventDefinitionType === 'bpmn:ConditionalEventDefinition') {\n        newEventDefinition.condition = this._bpmnFactory.create('bpmn:FormalExpression');\n      }\n\n      eventDefinitions.push(newEventDefinition);\n\n      newEventDefinition.$parent = businessObject;\n      businessObject.eventDefinitions = eventDefinitions;\n\n      delete attrs.eventDefinitionType;\n    }\n\n    size = this.getDefaultSize(businessObject, di);\n\n    attrs = assign$1({\n      id: businessObject.id\n    }, size, attrs, {\n      businessObject: businessObject,\n      di: di\n    });\n\n    return this._baseCreate(elementType, attrs);\n  };\n\n  /**\n   * Get the default size of a diagram element.\n   *\n   * @param {Element} element The element.\n   * @param {ModdleElement} di The DI.\n   *\n   * @return {Dimensions} Default width and height of the element.\n   */\n  ElementFactory.prototype.getDefaultSize = function(element, di) {\n\n    var bo = getBusinessObject(element);\n    di = di || getDi(element);\n\n    if (is$1(bo, 'bpmn:SubProcess')) {\n      if (isExpanded(bo, di)) {\n        return { width: 350, height: 200 };\n      } else {\n        return { width: 100, height: 80 };\n      }\n    }\n\n    if (is$1(bo, 'bpmn:Task')) {\n      return { width: 100, height: 80 };\n    }\n\n    if (is$1(bo, 'bpmn:Gateway')) {\n      return { width: 50, height: 50 };\n    }\n\n    if (is$1(bo, 'bpmn:Event')) {\n      return { width: 36, height: 36 };\n    }\n\n    if (is$1(bo, 'bpmn:Participant')) {\n      if (isExpanded(bo, di)) {\n        return { width: 600, height: 250 };\n      } else {\n        return { width: 400, height: 60 };\n      }\n    }\n\n    if (is$1(bo, 'bpmn:Lane')) {\n      return { width: 400, height: 100 };\n    }\n\n    if (is$1(bo, 'bpmn:DataObjectReference')) {\n      return { width: 36, height: 50 };\n    }\n\n    if (is$1(bo, 'bpmn:DataStoreReference')) {\n      return { width: 50, height: 50 };\n    }\n\n    if (is$1(bo, 'bpmn:TextAnnotation')) {\n      return { width: 100, height: 30 };\n    }\n\n    if (is$1(bo, 'bpmn:Group')) {\n      return { width: 300, height: 300 };\n    }\n\n    return { width: 100, height: 80 };\n  };\n\n\n  /**\n   * Create participant.\n   *\n   * @param {boolean|Partial<Shape> & Partial<BpmnAttributes>} [attrs]\n   * Attributes or whether the participant is expanded.\n   *\n   * @return {W} The created participant.\n   */\n  ElementFactory.prototype.createParticipantShape = function(attrs) {\n\n    if (!isObject(attrs)) {\n      attrs = { isExpanded: attrs };\n    }\n\n    attrs = assign$1({ type: 'bpmn:Participant' }, attrs || {});\n\n    // participants are expanded by default\n    if (attrs.isExpanded !== false) {\n      attrs.processRef = this._bpmnFactory.create('bpmn:Process');\n    }\n\n    return this.createShape(attrs);\n  };\n\n\n  // helpers //////////////////////\n\n  /**\n   * Apply attributes from a map to the given element, remove attribute from the\n   * map on application.\n   *\n   * @param {Element} element\n   * @param {Object} attrs (in/out map of attributes)\n   * @param {string[]} attributeNames name of attributes to apply\n   *\n   * @return {Object} changed attrs\n   */\n  function applyAttributes(element, attrs, attributeNames) {\n\n    forEach$1(attributeNames, function(property) {\n      attrs = applyAttribute(element, attrs, property);\n    });\n\n    return attrs;\n  }\n\n  /**\n   * Apply named property to element and drain it from the attrs collection.\n   *\n   * @param {Element} element\n   * @param {Object} attrs (in/out map of attributes)\n   * @param {string} attributeName to apply\n   *\n   * @return {Object} changed attrs\n   */\n  function applyAttribute(element, attrs, attributeName) {\n    if (attrs[attributeName] === undefined) {\n      return attrs;\n    }\n\n    element[attributeName] = attrs[attributeName];\n\n    return omit(attrs, [ attributeName ]);\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isModdleDi(element) {\n    return isAny(element, [\n      'bpmndi:BPMNShape',\n      'bpmndi:BPMNEdge',\n      'bpmndi:BPMNDiagram',\n      'bpmndi:BPMNPlane',\n    ]);\n  }\n\n  /**\n   * @typedef {import('../../../core/Canvas').default} Canvas\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * A handler that align elements in a certain way.\n   *\n   * @param {Modeling} modeling\n   * @param {Canvas} canvas\n   */\n  function AlignElements(modeling, canvas) {\n    this._modeling = modeling;\n    this._canvas = canvas;\n  }\n\n  AlignElements.$inject = [ 'modeling', 'canvas' ];\n\n\n  AlignElements.prototype.preExecute = function(context) {\n    var modeling = this._modeling;\n\n    var elements = context.elements,\n        alignment = context.alignment;\n\n\n    forEach$1(elements, function(element) {\n      var delta = {\n        x: 0,\n        y: 0\n      };\n\n      if (isDefined(alignment.left)) {\n        delta.x = alignment.left - element.x;\n\n      } else if (isDefined(alignment.right)) {\n        delta.x = (alignment.right - element.width) - element.x;\n\n      } else if (isDefined(alignment.center)) {\n        delta.x = (alignment.center - Math.round(element.width / 2)) - element.x;\n\n      } else if (isDefined(alignment.top)) {\n        delta.y = alignment.top - element.y;\n\n      } else if (isDefined(alignment.bottom)) {\n        delta.y = (alignment.bottom - element.height) - element.y;\n\n      } else if (isDefined(alignment.middle)) {\n        delta.y = (alignment.middle - Math.round(element.height / 2)) - element.y;\n      }\n\n      modeling.moveElements([ element ], delta, element.parent);\n    });\n  };\n\n  AlignElements.prototype.postExecute = function(context) {\n\n  };\n\n  /**\n   * @typedef {import('../../../model/Types').Element} Element\n   * @typedef {import('../../../model/Types').Parent} Parent\n   * @typedef {import('../../../model/Types').Shape} Shape\n   *\n   * @typedef {import('../../../util/Types').Point} Point\n   *\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * A handler that implements reversible appending of shapes\n   * to a source shape.\n   *\n   * @param {Modeling} modeling\n   */\n  function AppendShapeHandler(modeling) {\n    this._modeling = modeling;\n  }\n\n  AppendShapeHandler.$inject = [ 'modeling' ];\n\n\n  // api //////////////////////\n\n\n  /**\n   * Creates a new shape.\n   *\n   * @param {Object} context\n   * @param {Partial<Shape>} context.shape The new shape.\n   * @param {Element} context.source The element to which to append the new shape to.\n   * @param {Parent} context.parent The parent.\n   * @param {Point} context.position The position at which to create the new shape.\n   */\n  AppendShapeHandler.prototype.preExecute = function(context) {\n\n    var source = context.source;\n\n    if (!source) {\n      throw new Error('source required');\n    }\n\n    var target = context.target || source.parent,\n        shape = context.shape,\n        hints = context.hints || {};\n\n    shape = context.shape =\n      this._modeling.createShape(\n        shape,\n        context.position,\n        target, { attach: hints.attach });\n\n    context.shape = shape;\n  };\n\n  AppendShapeHandler.prototype.postExecute = function(context) {\n    var hints = context.hints || {};\n\n    if (!existsConnection(context.source, context.shape)) {\n\n      // create connection\n      if (hints.connectionTarget === context.source) {\n        this._modeling.connect(context.shape, context.source, context.connection);\n      } else {\n        this._modeling.connect(context.source, context.shape, context.connection);\n      }\n    }\n  };\n\n\n  function existsConnection(source, target) {\n    return some(source.outgoing, function(c) {\n      return c.target === target;\n    });\n  }\n\n  /**\n   * @typedef {import('../../../model/Types').Element} Element\n   * @typedef {import('../../../model/Types').Shape} Shape\n   *\n   * @typedef {import('../../../util/Types').Point} Point\n   *\n   * @typedef {import('../Modeling').ModelingHints} ModelingHints\n   *\n   * @typedef {import('../../../core/Canvas').default} Canvas\n   * @typedef {import('../../../layout/BaseLayouter').default} Layouter\n   */\n\n  /**\n   * @param {Canvas} canvas\n   * @param {Layouter} layouter\n   */\n  function CreateConnectionHandler(canvas, layouter) {\n    this._canvas = canvas;\n    this._layouter = layouter;\n  }\n\n  CreateConnectionHandler.$inject = [ 'canvas', 'layouter' ];\n\n\n  // api //////////////////////\n\n\n  /**\n   * Creates a new connection between two elements.\n   *\n   * @param {Object} context\n   * @param {Element} context.source The source.\n   * @param {Element} context.target The target.\n   * @param {Shape} context.parent The parent.\n   * @param {number} [context.parentIndex] The optional index at which to add the\n   * connection to the parent's children.\n   * @param {ModelingHints} [context.hints] The optional hints.\n   */\n  CreateConnectionHandler.prototype.execute = function(context) {\n\n    var connection = context.connection,\n        source = context.source,\n        target = context.target,\n        parent = context.parent,\n        parentIndex = context.parentIndex,\n        hints = context.hints;\n\n    if (!source || !target) {\n      throw new Error('source and target required');\n    }\n\n    if (!parent) {\n      throw new Error('parent required');\n    }\n\n    connection.source = source;\n    connection.target = target;\n\n    if (!connection.waypoints) {\n      connection.waypoints = this._layouter.layoutConnection(connection, hints);\n    }\n\n    // add connection\n    this._canvas.addConnection(connection, parent, parentIndex);\n\n    return connection;\n  };\n\n  CreateConnectionHandler.prototype.revert = function(context) {\n    var connection = context.connection;\n\n    this._canvas.removeConnection(connection);\n\n    connection.source = null;\n    connection.target = null;\n\n    return connection;\n  };\n\n  /**\r\n   * @typedef {import('../Modeling').default} Modeling\r\n   */\r\n\r\n  var round$3 = Math.round;\r\n\r\n  /**\r\n   * @param {Modeling} modeling\r\n   */\r\n  function CreateElementsHandler(modeling) {\r\n    this._modeling = modeling;\r\n  }\r\n\r\n  CreateElementsHandler.$inject = [\r\n    'modeling'\r\n  ];\r\n\r\n  CreateElementsHandler.prototype.preExecute = function(context) {\r\n    var elements = context.elements,\r\n        parent = context.parent,\r\n        parentIndex = context.parentIndex,\r\n        position = context.position,\r\n        hints = context.hints;\r\n\r\n    var modeling = this._modeling;\r\n\r\n    // make sure each element has x and y\r\n    forEach$1(elements, function(element) {\r\n      if (!isNumber(element.x)) {\r\n        element.x = 0;\r\n      }\r\n\r\n      if (!isNumber(element.y)) {\r\n        element.y = 0;\r\n      }\r\n    });\r\n\r\n    var visibleElements = filter(elements, function(element) {\r\n      return !element.hidden;\r\n    });\r\n\r\n    var bbox = getBBox(visibleElements);\r\n\r\n    // center elements around position\r\n    forEach$1(elements, function(element) {\r\n      if (isConnection(element)) {\r\n        element.waypoints = map$1(element.waypoints, function(waypoint) {\r\n          return {\r\n            x: round$3(waypoint.x - bbox.x - bbox.width / 2 + position.x),\r\n            y: round$3(waypoint.y - bbox.y - bbox.height / 2 + position.y)\r\n          };\r\n        });\r\n      }\r\n\r\n      assign$1(element, {\r\n        x: round$3(element.x - bbox.x - bbox.width / 2 + position.x),\r\n        y: round$3(element.y - bbox.y - bbox.height / 2 + position.y)\r\n      });\r\n    });\r\n\r\n    var parents = getParents$1(elements);\r\n\r\n    var cache = {};\r\n\r\n    forEach$1(elements, function(element) {\r\n      if (isConnection(element)) {\r\n        cache[ element.id ] = isNumber(parentIndex) ?\r\n          modeling.createConnection(\r\n            cache[ element.source.id ],\r\n            cache[ element.target.id ],\r\n            parentIndex,\r\n            element,\r\n            element.parent || parent,\r\n            hints\r\n          ) :\r\n          modeling.createConnection(\r\n            cache[ element.source.id ],\r\n            cache[ element.target.id ],\r\n            element,\r\n            element.parent || parent,\r\n            hints\r\n          );\r\n\r\n        return;\r\n      }\r\n\r\n      var createShapeHints = assign$1({}, hints);\r\n\r\n      if (parents.indexOf(element) === -1) {\r\n        createShapeHints.autoResize = false;\r\n      }\r\n\r\n      if (isLabel(element)) {\r\n        createShapeHints = omit(createShapeHints, [ 'attach' ]);\r\n      }\r\n\r\n      cache[ element.id ] = isNumber(parentIndex) ?\r\n        modeling.createShape(\r\n          element,\r\n          pick(element, [ 'x', 'y', 'width', 'height' ]),\r\n          element.parent || parent,\r\n          parentIndex,\r\n          createShapeHints\r\n        ) :\r\n        modeling.createShape(\r\n          element,\r\n          pick(element, [ 'x', 'y', 'width', 'height' ]),\r\n          element.parent || parent,\r\n          createShapeHints\r\n        );\r\n    });\r\n\r\n    context.elements = values(cache);\r\n  };\n\n  /**\n   * @typedef {import('../../../model/Types').Element} Element\n   * @typedef {import('../../../util/Types').Point} Point\n   *\n   * @typedef {import('../../../core/Canvas').default} Canvas\n   */\n\n  var round$2 = Math.round;\n\n\n  /**\n   * A handler that implements reversible addition of shapes.\n   *\n   * @param {Canvas} canvas\n   */\n  function CreateShapeHandler(canvas) {\n    this._canvas = canvas;\n  }\n\n  CreateShapeHandler.$inject = [ 'canvas' ];\n\n\n  // api //////////////////////\n\n\n  /**\n   * Appends a shape to a target shape\n   *\n   * @param {Object} context\n   * @param {Element} context.parent The parent.\n   * @param {Point} context.position The position at which to create the new shape.\n   * @param {number} [context.parentIndex] The optional index at which to add the\n   * shape to the parent's children.\n   */\n  CreateShapeHandler.prototype.execute = function(context) {\n\n    var shape = context.shape,\n        positionOrBounds = context.position,\n        parent = context.parent,\n        parentIndex = context.parentIndex;\n\n    if (!parent) {\n      throw new Error('parent required');\n    }\n\n    if (!positionOrBounds) {\n      throw new Error('position required');\n    }\n\n    // (1) add at event center position _or_ at given bounds\n    if (positionOrBounds.width !== undefined) {\n      assign$1(shape, positionOrBounds);\n    } else {\n      assign$1(shape, {\n        x: positionOrBounds.x - round$2(shape.width / 2),\n        y: positionOrBounds.y - round$2(shape.height / 2)\n      });\n    }\n\n    // (2) add to canvas\n    this._canvas.addShape(shape, parent, parentIndex);\n\n    return shape;\n  };\n\n\n  /**\n   * Undo append by removing the shape\n   */\n  CreateShapeHandler.prototype.revert = function(context) {\n\n    var shape = context.shape;\n\n    // (3) remove form canvas\n    this._canvas.removeShape(shape);\n\n    return shape;\n  };\n\n  /**\n   * @typedef {import('../../../core/Canvas').default} Canvas\n   *\n   * @typedef {import('../../../model/Types').Element} Element\n   * @typedef {import('../../../model/Types').Parent} Parent\n   * @typedef {import('../../../model/Types').Shape} Shape\n   * @typedef {import('../../../util/Types').Point} Point\n   */\n\n  /**\n   * A handler that attaches a label to a given target shape.\n   *\n   * @param {Canvas} canvas\n   */\n  function CreateLabelHandler(canvas) {\n    CreateShapeHandler.call(this, canvas);\n  }\n\n  e$3(CreateLabelHandler, CreateShapeHandler);\n\n  CreateLabelHandler.$inject = [ 'canvas' ];\n\n\n  // api //////////////////////\n\n\n  var originalExecute = CreateShapeHandler.prototype.execute;\n\n  /**\n   * Append label to element.\n   *\n   * @param { {\n   *   parent: Parent;\n   *   position: Point;\n   *   shape: Shape;\n   *   target: Element;\n   * } } context\n   */\n  CreateLabelHandler.prototype.execute = function(context) {\n\n    var label = context.shape;\n\n    ensureValidDimensions(label);\n\n    label.labelTarget = context.labelTarget;\n\n    return originalExecute.call(this, context);\n  };\n\n  var originalRevert = CreateShapeHandler.prototype.revert;\n\n  /**\n   * Revert appending by removing label.\n   */\n  CreateLabelHandler.prototype.revert = function(context) {\n    context.shape.labelTarget = null;\n\n    return originalRevert.call(this, context);\n  };\n\n\n  // helpers //////////////////////\n\n  function ensureValidDimensions(label) {\n\n    // make sure a label has valid { width, height } dimensions\n    [ 'width', 'height' ].forEach(function(prop) {\n      if (typeof label[prop] === 'undefined') {\n        label[prop] = 0;\n      }\n    });\n  }\n\n  /**\n   * @typedef {import('../../../core/Canvas').default} Canvas\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * A handler that implements reversible deletion of Connections.\n   */\n  function DeleteConnectionHandler(canvas, modeling) {\n    this._canvas = canvas;\n    this._modeling = modeling;\n  }\n\n  DeleteConnectionHandler.$inject = [\n    'canvas',\n    'modeling'\n  ];\n\n\n  /**\n   * - Remove connections\n   */\n  DeleteConnectionHandler.prototype.preExecute = function(context) {\n\n    var modeling = this._modeling;\n\n    var connection = context.connection;\n\n    // remove connections\n    saveClear(connection.incoming, function(connection) {\n\n      // To make sure that the connection isn't removed twice\n      // For example if a container is removed\n      modeling.removeConnection(connection, { nested: true });\n    });\n\n    saveClear(connection.outgoing, function(connection) {\n      modeling.removeConnection(connection, { nested: true });\n    });\n\n  };\n\n\n  DeleteConnectionHandler.prototype.execute = function(context) {\n\n    var connection = context.connection,\n        parent = connection.parent;\n\n    context.parent = parent;\n\n    // remember containment\n    context.parentIndex = indexOf(parent.children, connection);\n\n    context.source = connection.source;\n    context.target = connection.target;\n\n    this._canvas.removeConnection(connection);\n\n    connection.source = null;\n    connection.target = null;\n\n    return connection;\n  };\n\n  /**\n   * Command revert implementation.\n   */\n  DeleteConnectionHandler.prototype.revert = function(context) {\n\n    var connection = context.connection,\n        parent = context.parent,\n        parentIndex = context.parentIndex;\n\n    connection.source = context.source;\n    connection.target = context.target;\n\n    // restore containment\n    add(parent.children, connection, parentIndex);\n\n    this._canvas.addConnection(connection, parent);\n\n    return connection;\n  };\n\n  /**\n   * @typedef {import('../../../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * @param {Modeling} modeling\n   * @param {ElementRegistry} elementRegistry\n   */\n  function DeleteElementsHandler(modeling, elementRegistry) {\n    this._modeling = modeling;\n    this._elementRegistry = elementRegistry;\n  }\n\n  DeleteElementsHandler.$inject = [\n    'modeling',\n    'elementRegistry'\n  ];\n\n\n  DeleteElementsHandler.prototype.postExecute = function(context) {\n\n    var modeling = this._modeling,\n        elementRegistry = this._elementRegistry,\n        elements = context.elements;\n\n    forEach$1(elements, function(element) {\n\n      // element may have been removed with previous\n      // remove operations already (e.g. in case of nesting)\n      if (!elementRegistry.get(element.id)) {\n        return;\n      }\n\n      if (element.waypoints) {\n        modeling.removeConnection(element);\n      } else {\n        modeling.removeShape(element);\n      }\n    });\n  };\n\n  /**\n   * @typedef {import('../../../core/Canvas').default} Canvas\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * A handler that implements reversible deletion of shapes.\n   *\n   * @param {Canvas} canvas\n   * @param {Modeling} modeling\n   */\n  function DeleteShapeHandler(canvas, modeling) {\n    this._canvas = canvas;\n    this._modeling = modeling;\n  }\n\n  DeleteShapeHandler.$inject = [ 'canvas', 'modeling' ];\n\n\n  /**\n   * - Remove connections\n   * - Remove all direct children\n   */\n  DeleteShapeHandler.prototype.preExecute = function(context) {\n\n    var modeling = this._modeling;\n\n    var shape = context.shape;\n\n    // remove connections\n    saveClear(shape.incoming, function(connection) {\n\n      // To make sure that the connection isn't removed twice\n      // For example if a container is removed\n      modeling.removeConnection(connection, { nested: true });\n    });\n\n    saveClear(shape.outgoing, function(connection) {\n      modeling.removeConnection(connection, { nested: true });\n    });\n\n    // remove child shapes and connections\n    saveClear(shape.children, function(child) {\n      if (isConnection(child)) {\n        modeling.removeConnection(child, { nested: true });\n      } else {\n        modeling.removeShape(child, { nested: true });\n      }\n    });\n  };\n\n  /**\n   * Remove shape and remember the parent\n   */\n  DeleteShapeHandler.prototype.execute = function(context) {\n    var canvas = this._canvas;\n\n    var shape = context.shape,\n        oldParent = shape.parent;\n\n    context.oldParent = oldParent;\n\n    // remove containment\n    context.oldParentIndex = indexOf(oldParent.children, shape);\n\n    // remove shape\n    canvas.removeShape(shape);\n\n    return shape;\n  };\n\n\n  /**\n   * Command revert implementation\n   */\n  DeleteShapeHandler.prototype.revert = function(context) {\n\n    var canvas = this._canvas;\n\n    var shape = context.shape,\n        oldParent = context.oldParent,\n        oldParentIndex = context.oldParentIndex;\n\n    // restore containment\n    add(oldParent.children, shape, oldParentIndex);\n\n    canvas.addShape(shape, oldParent);\n\n    return shape;\n  };\n\n  /**\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * A handler that distributes elements evenly.\n   *\n   * @param {Modeling} modeling\n   */\n  function DistributeElements(modeling) {\n    this._modeling = modeling;\n  }\n\n  DistributeElements.$inject = [ 'modeling' ];\n\n  var OFF_AXIS = {\n    x: 'y',\n    y: 'x'\n  };\n\n  DistributeElements.prototype.preExecute = function(context) {\n    var modeling = this._modeling;\n\n    var groups = context.groups,\n        axis = context.axis,\n        dimension = context.dimension;\n\n    function updateRange(group, element) {\n      group.range.min = Math.min(element[axis], group.range.min);\n      group.range.max = Math.max(element[axis] + element[dimension], group.range.max);\n    }\n\n    function center(element) {\n      return element[axis] + element[dimension] / 2;\n    }\n\n    function lastIdx(arr) {\n      return arr.length - 1;\n    }\n\n    function rangeDiff(range) {\n      return range.max - range.min;\n    }\n\n    function centerElement(refCenter, element) {\n      var delta = { y: 0 };\n\n      delta[axis] = refCenter - center(element);\n\n      if (delta[axis]) {\n\n        delta[OFF_AXIS[axis]] = 0;\n\n        modeling.moveElements([ element ], delta, element.parent);\n      }\n    }\n\n    var firstGroup = groups[0],\n        lastGroupIdx = lastIdx(groups),\n        lastGroup = groups[ lastGroupIdx ];\n\n    var margin,\n        spaceInBetween,\n        groupsSize = 0; // the size of each range\n\n    forEach$1(groups, function(group, idx) {\n      var sortedElements,\n          refElem,\n          refCenter;\n\n      if (group.elements.length < 2) {\n        if (idx && idx !== groups.length - 1) {\n          updateRange(group, group.elements[0]);\n\n          groupsSize += rangeDiff(group.range);\n        }\n        return;\n      }\n\n      sortedElements = sortBy(group.elements, axis);\n\n      refElem = sortedElements[0];\n\n      if (idx === lastGroupIdx) {\n        refElem = sortedElements[lastIdx(sortedElements)];\n      }\n\n      refCenter = center(refElem);\n\n      // wanna update the ranges after the shapes have been centered\n      group.range = null;\n\n      forEach$1(sortedElements, function(element) {\n\n        centerElement(refCenter, element);\n\n        if (group.range === null) {\n          group.range = {\n            min: element[axis],\n            max: element[axis] + element[dimension]\n          };\n\n          return;\n        }\n\n        // update group's range after centering the range elements\n        updateRange(group, element);\n      });\n\n      if (idx && idx !== groups.length - 1) {\n        groupsSize += rangeDiff(group.range);\n      }\n    });\n\n    spaceInBetween = Math.abs(lastGroup.range.min - firstGroup.range.max);\n\n    margin = Math.round((spaceInBetween - groupsSize) / (groups.length - 1));\n\n    if (margin < groups.length - 1) {\n      return;\n    }\n\n    forEach$1(groups, function(group, groupIdx) {\n      var delta = {},\n          prevGroup;\n\n      if (group === firstGroup || group === lastGroup) {\n        return;\n      }\n\n      prevGroup = groups[groupIdx - 1];\n\n      group.range.max = 0;\n\n      forEach$1(group.elements, function(element, idx) {\n        delta[OFF_AXIS[axis]] = 0;\n        delta[axis] = (prevGroup.range.max - element[axis]) + margin;\n\n        if (group.range.min !== element[axis]) {\n          delta[axis] += element[axis] - group.range.min;\n        }\n\n        if (delta[axis]) {\n          modeling.moveElements([ element ], delta, element.parent);\n        }\n\n        group.range.max = Math.max(element[axis] + element[dimension], idx ? group.range.max : 0);\n      });\n    });\n  };\n\n  DistributeElements.prototype.postExecute = function(context) {\n\n  };\n\n  /**\n   * @typedef {import('../../../core/Canvas').default} Canvas\n   * @typedef {import('../../../layout/BaseLayouter').default} Layouter\n   */\n\n  /**\n   * A handler that implements reversible moving of shapes.\n   *\n   * @param {Layouter} layouter\n   * @param {Canvas} canvas\n   */\n  function LayoutConnectionHandler(layouter, canvas) {\n    this._layouter = layouter;\n    this._canvas = canvas;\n  }\n\n  LayoutConnectionHandler.$inject = [ 'layouter', 'canvas' ];\n\n  LayoutConnectionHandler.prototype.execute = function(context) {\n\n    var connection = context.connection;\n\n    var oldWaypoints = connection.waypoints;\n\n    assign$1(context, {\n      oldWaypoints: oldWaypoints\n    });\n\n    connection.waypoints = this._layouter.layoutConnection(connection, context.hints);\n\n    return connection;\n  };\n\n  LayoutConnectionHandler.prototype.revert = function(context) {\n\n    var connection = context.connection;\n\n    connection.waypoints = context.oldWaypoints;\n\n    return connection;\n  };\n\n  /**\n   * A handler that implements reversible moving of connections.\n   *\n   * The handler differs from the layout connection handler in a sense\n   * that it preserves the connection layout.\n   */\n  function MoveConnectionHandler() { }\n\n\n  MoveConnectionHandler.prototype.execute = function(context) {\n\n    var connection = context.connection,\n        delta = context.delta;\n\n    var newParent = context.newParent || connection.parent,\n        newParentIndex = context.newParentIndex,\n        oldParent = connection.parent;\n\n    // save old parent in context\n    context.oldParent = oldParent;\n    context.oldParentIndex = remove(oldParent.children, connection);\n\n    // add to new parent at position\n    add(newParent.children, connection, newParentIndex);\n\n    // update parent\n    connection.parent = newParent;\n\n    // update waypoint positions\n    forEach$1(connection.waypoints, function(p) {\n      p.x += delta.x;\n      p.y += delta.y;\n\n      if (p.original) {\n        p.original.x += delta.x;\n        p.original.y += delta.y;\n      }\n    });\n\n    return connection;\n  };\n\n  MoveConnectionHandler.prototype.revert = function(context) {\n\n    var connection = context.connection,\n        newParent = connection.parent,\n        oldParent = context.oldParent,\n        oldParentIndex = context.oldParentIndex,\n        delta = context.delta;\n\n    // remove from newParent\n    remove(newParent.children, connection);\n\n    // restore previous location in old parent\n    add(oldParent.children, connection, oldParentIndex);\n\n    // restore parent\n    connection.parent = oldParent;\n\n    // revert to old waypoint positions\n    forEach$1(connection.waypoints, function(p) {\n      p.x -= delta.x;\n      p.y -= delta.y;\n\n      if (p.original) {\n        p.original.x -= delta.x;\n        p.original.y -= delta.y;\n      }\n    });\n\n    return connection;\n  };\n\n  /**\n   * @typedef {import('../../../../model/Types').Connection} Connection\n   * @typedef {import('../../../../model/Types').Element} Element\n   * @typedef {import('../../../../model/Types').Shape} Shape\n   */\n\n  function MoveClosure() {\n\n    /**\n     * @type {Record<string, Shape>}\n     */\n    this.allShapes = {};\n\n    /**\n     * @type {Record<string, Connection>}\n     */\n    this.allConnections = {};\n\n    /**\n     * @type {Record<string, Element>}\n     */\n    this.enclosedElements = {};\n\n    /**\n     * @type {Record<string, Connection>}\n     */\n    this.enclosedConnections = {};\n\n    /**\n     * @type {Record<string, Element>}\n     */\n    this.topLevel = {};\n  }\n\n  /**\n   * @param {Element} element\n   * @param {boolean} [isTopLevel]\n   *\n   * @return {MoveClosure}\n   */\n  MoveClosure.prototype.add = function(element, isTopLevel) {\n    return this.addAll([ element ], isTopLevel);\n  };\n\n  /**\n   * @param {Element[]} elements\n   * @param {boolean} [isTopLevel]\n   *\n   * @return {MoveClosure}\n   */\n  MoveClosure.prototype.addAll = function(elements, isTopLevel) {\n\n    var newClosure = getClosure(elements, !!isTopLevel, this);\n\n    assign$1(this, newClosure);\n\n    return this;\n  };\n\n  /**\n   * @typedef {import('../../../../core/Types').ElementLike} Element\n   * @typedef {import('../../../../core/Types').ShapeLike} Shape\n   *\n   * @typedef {import('../../../../util/Types').Point} Point\n   *\n   * @typedef {import('../../Modeling').default} Modeling\n   */\n\n  /**\n   * A helper that is able to carry out serialized move\n   * operations on multiple elements.\n   *\n   * @param {Modeling} modeling\n   */\n  function MoveHelper(modeling) {\n    this._modeling = modeling;\n  }\n\n  /**\n   * Move the specified elements and all children by the given delta.\n   *\n   * This moves all enclosed connections, too and layouts all affected\n   * external connections.\n   *\n   * @template {Element} T\n   *\n   * @param {T[]} elements\n   * @param {Point} delta\n   * @param {Shape} newParent The new parent of all elements that are not nested.\n   *\n   * @return {T[]}\n   */\n  MoveHelper.prototype.moveRecursive = function(elements, delta, newParent) {\n    if (!elements) {\n      return [];\n    } else {\n      return this.moveClosure(this.getClosure(elements), delta, newParent);\n    }\n  };\n\n  /**\n   * Move the given closure of elmements.\n   *\n   * @param {Object} closure\n   * @param {Point} delta\n   * @param {Shape} [newParent]\n   * @param {Shape} [newHost]\n   */\n  MoveHelper.prototype.moveClosure = function(closure, delta, newParent, newHost, primaryShape) {\n    var modeling = this._modeling;\n\n    var allShapes = closure.allShapes,\n        allConnections = closure.allConnections,\n        enclosedConnections = closure.enclosedConnections,\n        topLevel = closure.topLevel,\n        keepParent = false;\n\n    if (primaryShape && primaryShape.parent === newParent) {\n      keepParent = true;\n    }\n\n    // move all shapes\n    forEach$1(allShapes, function(shape) {\n\n      // move the element according to the given delta\n      modeling.moveShape(shape, delta, topLevel[shape.id] && !keepParent && newParent, {\n        recurse: false,\n        layout: false\n      });\n    });\n\n    // move all child connections / layout external connections\n    forEach$1(allConnections, function(c) {\n\n      var sourceMoved = !!allShapes[c.source.id],\n          targetMoved = !!allShapes[c.target.id];\n\n      if (enclosedConnections[c.id] && sourceMoved && targetMoved) {\n        modeling.moveConnection(c, delta, topLevel[c.id] && !keepParent && newParent);\n      } else {\n        modeling.layoutConnection(c, {\n          connectionStart: sourceMoved && getMovedSourceAnchor(c, c.source, delta),\n          connectionEnd: targetMoved && getMovedTargetAnchor(c, c.target, delta)\n        });\n      }\n    });\n  };\n\n  /**\n   * Returns the closure for the selected elements\n   *\n   * @param {Element[]} elements\n   *\n   * @return {MoveClosure}\n   */\n  MoveHelper.prototype.getClosure = function(elements) {\n    return new MoveClosure().addAll(elements, true);\n  };\n\n  /**\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * A handler that implements reversible moving of shapes.\n   *\n   * @param {Modeling} modeling\n   */\n  function MoveElementsHandler(modeling) {\n    this._helper = new MoveHelper(modeling);\n  }\n\n  MoveElementsHandler.$inject = [ 'modeling' ];\n\n  MoveElementsHandler.prototype.preExecute = function(context) {\n    context.closure = this._helper.getClosure(context.shapes);\n  };\n\n  MoveElementsHandler.prototype.postExecute = function(context) {\n\n    var hints = context.hints,\n        primaryShape;\n\n    if (hints && hints.primaryShape) {\n      primaryShape = hints.primaryShape;\n      hints.oldParent = primaryShape.parent;\n    }\n\n    this._helper.moveClosure(\n      context.closure,\n      context.delta,\n      context.newParent,\n      context.newHost,\n      primaryShape\n    );\n  };\n\n  /**\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * A handler that implements reversible moving of shapes.\n   *\n   * @param {Modeling} modeling\n   */\n  function MoveShapeHandler(modeling) {\n    this._modeling = modeling;\n\n    this._helper = new MoveHelper(modeling);\n  }\n\n  MoveShapeHandler.$inject = [ 'modeling' ];\n\n\n  MoveShapeHandler.prototype.execute = function(context) {\n\n    var shape = context.shape,\n        delta = context.delta,\n        newParent = context.newParent || shape.parent,\n        newParentIndex = context.newParentIndex,\n        oldParent = shape.parent;\n\n    context.oldBounds = pick(shape, [ 'x', 'y', 'width', 'height' ]);\n\n    // save old parent in context\n    context.oldParent = oldParent;\n    context.oldParentIndex = remove(oldParent.children, shape);\n\n    // add to new parent at position\n    add(newParent.children, shape, newParentIndex);\n\n    // update shape parent + position\n    assign$1(shape, {\n      parent: newParent,\n      x: shape.x + delta.x,\n      y: shape.y + delta.y\n    });\n\n    return shape;\n  };\n\n  MoveShapeHandler.prototype.postExecute = function(context) {\n\n    var shape = context.shape,\n        delta = context.delta,\n        hints = context.hints;\n\n    var modeling = this._modeling;\n\n    if (hints.layout !== false) {\n\n      forEach$1(shape.incoming, function(c) {\n        modeling.layoutConnection(c, {\n          connectionEnd: getMovedTargetAnchor(c, shape, delta)\n        });\n      });\n\n      forEach$1(shape.outgoing, function(c) {\n        modeling.layoutConnection(c, {\n          connectionStart: getMovedSourceAnchor(c, shape, delta)\n        });\n      });\n    }\n\n    if (hints.recurse !== false) {\n      this.moveChildren(context);\n    }\n  };\n\n  MoveShapeHandler.prototype.revert = function(context) {\n\n    var shape = context.shape,\n        oldParent = context.oldParent,\n        oldParentIndex = context.oldParentIndex,\n        delta = context.delta;\n\n    // restore previous location in old parent\n    add(oldParent.children, shape, oldParentIndex);\n\n    // revert to old position and parent\n    assign$1(shape, {\n      parent: oldParent,\n      x: shape.x - delta.x,\n      y: shape.y - delta.y\n    });\n\n    return shape;\n  };\n\n  MoveShapeHandler.prototype.moveChildren = function(context) {\n\n    var delta = context.delta,\n        shape = context.shape;\n\n    this._helper.moveRecursive(shape.children, delta, null);\n  };\n\n  MoveShapeHandler.prototype.getNewParent = function(context) {\n    return context.newParent || context.shape.parent;\n  };\n\n  /**\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * Reconnect connection handler.\n   *\n   * @param {Modeling} modeling\n   */\n  function ReconnectConnectionHandler(modeling) {\n    this._modeling = modeling;\n  }\n\n  ReconnectConnectionHandler.$inject = [ 'modeling' ];\n\n  ReconnectConnectionHandler.prototype.execute = function(context) {\n    var newSource = context.newSource,\n        newTarget = context.newTarget,\n        connection = context.connection,\n        dockingOrPoints = context.dockingOrPoints;\n\n    if (!newSource && !newTarget) {\n      throw new Error('newSource or newTarget required');\n    }\n\n    if (isArray$3(dockingOrPoints)) {\n      context.oldWaypoints = connection.waypoints;\n      connection.waypoints = dockingOrPoints;\n    }\n\n    if (newSource) {\n      context.oldSource = connection.source;\n      connection.source = newSource;\n    }\n\n    if (newTarget) {\n      context.oldTarget = connection.target;\n      connection.target = newTarget;\n    }\n\n    return connection;\n  };\n\n  ReconnectConnectionHandler.prototype.postExecute = function(context) {\n    var connection = context.connection,\n        newSource = context.newSource,\n        newTarget = context.newTarget,\n        dockingOrPoints = context.dockingOrPoints,\n        hints = context.hints || {};\n\n    var layoutConnectionHints = {};\n\n    if (hints.connectionStart) {\n      layoutConnectionHints.connectionStart = hints.connectionStart;\n    }\n\n    if (hints.connectionEnd) {\n      layoutConnectionHints.connectionEnd = hints.connectionEnd;\n    }\n\n    if (hints.layoutConnection === false) {\n      return;\n    }\n\n    if (newSource && (!newTarget || hints.docking === 'source')) {\n      layoutConnectionHints.connectionStart = layoutConnectionHints.connectionStart\n        || getDocking(isArray$3(dockingOrPoints) ? dockingOrPoints[ 0 ] : dockingOrPoints);\n    }\n\n    if (newTarget && (!newSource || hints.docking === 'target')) {\n      layoutConnectionHints.connectionEnd = layoutConnectionHints.connectionEnd\n        || getDocking(isArray$3(dockingOrPoints) ? dockingOrPoints[ dockingOrPoints.length - 1 ] : dockingOrPoints);\n    }\n\n    if (hints.newWaypoints) {\n      layoutConnectionHints.waypoints = hints.newWaypoints;\n    }\n\n    this._modeling.layoutConnection(connection, layoutConnectionHints);\n  };\n\n  ReconnectConnectionHandler.prototype.revert = function(context) {\n    var oldSource = context.oldSource,\n        oldTarget = context.oldTarget,\n        oldWaypoints = context.oldWaypoints,\n        connection = context.connection;\n\n    if (oldSource) {\n      connection.source = oldSource;\n    }\n\n    if (oldTarget) {\n      connection.target = oldTarget;\n    }\n\n    if (oldWaypoints) {\n      connection.waypoints = oldWaypoints;\n    }\n\n    return connection;\n  };\n\n\n\n  // helpers //////////\n\n  function getDocking(point) {\n    return point.original || point;\n  }\n\n  /**\n   * @typedef {import('../../model/Types').Shape} Shape\n   *\n   * @typedef {import('../Modeling').default} Modeling\n   * @typedef {import('../../rules/Rules').default} Rules\n   */\n\n  /**\n   * Replace shape by adding new shape and removing old shape. Incoming and outgoing connections will\n   * be kept if possible.\n   *\n   * @class\n   * @constructor\n   *\n   * @param {Modeling} modeling\n   * @param {Rules} rules\n   */\n  function ReplaceShapeHandler(modeling, rules) {\n    this._modeling = modeling;\n    this._rules = rules;\n  }\n\n  ReplaceShapeHandler.$inject = [ 'modeling', 'rules' ];\n\n\n  /**\n   * Add new shape.\n   *\n   * @param {Object} context\n   * @param {Shape} context.oldShape\n   * @param {Object} context.newData\n   * @param {string} context.newData.type\n   * @param {number} context.newData.x\n   * @param {number} context.newData.y\n   * @param {Object} [context.hints]\n   */\n  ReplaceShapeHandler.prototype.preExecute = function(context) {\n    var self = this,\n        modeling = this._modeling,\n        rules = this._rules;\n\n    var oldShape = context.oldShape,\n        newData = context.newData,\n        hints = context.hints || {},\n        newShape;\n\n    function canReconnect(source, target, connection) {\n      return rules.allowed('connection.reconnect', {\n        connection: connection,\n        source: source,\n        target: target\n      });\n    }\n\n    // (1) add new shape at given position\n    var position = {\n      x: newData.x,\n      y: newData.y\n    };\n\n    var oldBounds = {\n      x: oldShape.x,\n      y: oldShape.y,\n      width: oldShape.width,\n      height: oldShape.height\n    };\n\n    newShape = context.newShape =\n      context.newShape ||\n      self.createShape(newData, position, oldShape.parent, hints);\n\n    // (2) update host\n    if (oldShape.host) {\n      modeling.updateAttachment(newShape, oldShape.host);\n    }\n\n    // (3) adopt all children from old shape\n    var children;\n\n    if (hints.moveChildren !== false) {\n      children = oldShape.children.slice();\n\n      modeling.moveElements(children, { x: 0, y: 0 }, newShape, hints);\n    }\n\n    // (4) reconnect connections to new shape if possible\n    var incoming = oldShape.incoming.slice(),\n        outgoing = oldShape.outgoing.slice();\n\n    forEach$1(incoming, function(connection) {\n      var source = connection.source,\n          allowed = canReconnect(source, newShape, connection);\n\n      if (allowed) {\n        self.reconnectEnd(\n          connection, newShape,\n          getResizedTargetAnchor(connection, newShape, oldBounds),\n          hints\n        );\n      }\n    });\n\n    forEach$1(outgoing, function(connection) {\n      var target = connection.target,\n          allowed = canReconnect(newShape, target, connection);\n\n      if (allowed) {\n        self.reconnectStart(\n          connection, newShape,\n          getResizedSourceAnchor(connection, newShape, oldBounds),\n          hints\n        );\n      }\n    });\n  };\n\n\n  /**\n   * Remove old shape.\n   */\n  ReplaceShapeHandler.prototype.postExecute = function(context) {\n    var oldShape = context.oldShape;\n\n    this._modeling.removeShape(oldShape);\n  };\n\n\n  ReplaceShapeHandler.prototype.execute = function(context) {};\n\n\n  ReplaceShapeHandler.prototype.revert = function(context) {};\n\n\n  ReplaceShapeHandler.prototype.createShape = function(shape, position, target, hints) {\n    return this._modeling.createShape(shape, position, target, hints);\n  };\n\n\n  ReplaceShapeHandler.prototype.reconnectStart = function(connection, newSource, dockingPoint, hints) {\n    this._modeling.reconnectStart(connection, newSource, dockingPoint, hints);\n  };\n\n\n  ReplaceShapeHandler.prototype.reconnectEnd = function(connection, newTarget, dockingPoint, hints) {\n    this._modeling.reconnectEnd(connection, newTarget, dockingPoint, hints);\n  };\n\n  /**\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * A handler that implements reversible resizing of shapes.\n   *\n   * @param {Modeling} modeling\n   */\n  function ResizeShapeHandler(modeling) {\n    this._modeling = modeling;\n  }\n\n  ResizeShapeHandler.$inject = [ 'modeling' ];\n\n  /**\n   * {\n   *   shape: {....}\n   *   newBounds: {\n   *     width:  20,\n   *     height: 40,\n   *     x:       5,\n   *     y:      10\n   *   }\n   *\n   * }\n   */\n  ResizeShapeHandler.prototype.execute = function(context) {\n    var shape = context.shape,\n        newBounds = context.newBounds,\n        minBounds = context.minBounds;\n\n    if (newBounds.x === undefined || newBounds.y === undefined ||\n        newBounds.width === undefined || newBounds.height === undefined) {\n      throw new Error('newBounds must have {x, y, width, height} properties');\n    }\n\n    if (minBounds && (newBounds.width < minBounds.width\n      || newBounds.height < minBounds.height)) {\n      throw new Error('width and height cannot be less than minimum height and width');\n    } else if (!minBounds\n      && newBounds.width < 10 || newBounds.height < 10) {\n      throw new Error('width and height cannot be less than 10px');\n    }\n\n    // save old bbox in context\n    context.oldBounds = {\n      width:  shape.width,\n      height: shape.height,\n      x:      shape.x,\n      y:      shape.y\n    };\n\n    // update shape\n    assign$1(shape, {\n      width:  newBounds.width,\n      height: newBounds.height,\n      x:      newBounds.x,\n      y:      newBounds.y\n    });\n\n    return shape;\n  };\n\n  ResizeShapeHandler.prototype.postExecute = function(context) {\n    var modeling = this._modeling;\n\n    var shape = context.shape,\n        oldBounds = context.oldBounds,\n        hints = context.hints || {};\n\n    if (hints.layout === false) {\n      return;\n    }\n\n    forEach$1(shape.incoming, function(c) {\n      modeling.layoutConnection(c, {\n        connectionEnd: getResizedTargetAnchor(c, shape, oldBounds)\n      });\n    });\n\n    forEach$1(shape.outgoing, function(c) {\n      modeling.layoutConnection(c, {\n        connectionStart: getResizedSourceAnchor(c, shape, oldBounds)\n      });\n    });\n\n  };\n\n  ResizeShapeHandler.prototype.revert = function(context) {\n\n    var shape = context.shape,\n        oldBounds = context.oldBounds;\n\n    // restore previous bbox\n    assign$1(shape, {\n      width:  oldBounds.width,\n      height: oldBounds.height,\n      x:      oldBounds.x,\n      y:      oldBounds.y\n    });\n\n    return shape;\n  };\n\n  /**\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * Add or remove space by moving and resizing shapes and updating connection waypoints.\n   *\n   * @param {Modeling} modeling\n   */\n  function SpaceToolHandler(modeling) {\n    this._modeling = modeling;\n  }\n\n  SpaceToolHandler.$inject = [ 'modeling' ];\n\n  SpaceToolHandler.prototype.preExecute = function(context) {\n    var delta = context.delta,\n        direction = context.direction,\n        movingShapes = context.movingShapes,\n        resizingShapes = context.resizingShapes,\n        start = context.start,\n        oldBounds = {};\n\n    // (1) move shapes\n    this.moveShapes(movingShapes, delta);\n\n    // (2a) save old bounds of resized shapes\n    forEach$1(resizingShapes, function(shape) {\n      oldBounds[shape.id] = getBounds(shape);\n    });\n\n    // (2b) resize shapes\n    this.resizeShapes(resizingShapes, delta, direction);\n\n    // (3) update connection waypoints\n    this.updateConnectionWaypoints(\n      getWaypointsUpdatingConnections(movingShapes, resizingShapes),\n      delta,\n      direction,\n      start,\n      movingShapes,\n      resizingShapes,\n      oldBounds\n    );\n  };\n\n  SpaceToolHandler.prototype.execute = function() {};\n  SpaceToolHandler.prototype.revert = function() {};\n\n  SpaceToolHandler.prototype.moveShapes = function(shapes, delta) {\n    var self = this;\n\n    forEach$1(shapes, function(element) {\n      self._modeling.moveShape(element, delta, null, {\n        autoResize: false,\n        layout: false,\n        recurse: false\n      });\n    });\n  };\n\n  SpaceToolHandler.prototype.resizeShapes = function(shapes, delta, direction) {\n    var self = this;\n\n    forEach$1(shapes, function(shape) {\n      var newBounds = resizeBounds(shape, direction, delta);\n\n      self._modeling.resizeShape(shape, newBounds, null, {\n        attachSupport: false,\n        autoResize: false,\n        layout: false\n      });\n    });\n  };\n\n  /**\n   * Update connections waypoints according to the rules:\n   *   1. Both source and target are moved/resized => move waypoints by the delta\n   *   2. Only one of source and target is moved/resized => re-layout connection with moved start/end\n   */\n  SpaceToolHandler.prototype.updateConnectionWaypoints = function(\n      connections,\n      delta,\n      direction,\n      start,\n      movingShapes,\n      resizingShapes,\n      oldBounds\n  ) {\n    var self = this,\n        affectedShapes = movingShapes.concat(resizingShapes);\n\n    forEach$1(connections, function(connection) {\n      var source = connection.source,\n          target = connection.target,\n          waypoints = copyWaypoints(connection),\n          axis = getAxisFromDirection(direction),\n          layoutHints = {};\n\n      if (includes$1(affectedShapes, source) && includes$1(affectedShapes, target)) {\n\n        // move waypoints\n        waypoints = map$1(waypoints, function(waypoint) {\n          if (shouldMoveWaypoint(waypoint, start, direction)) {\n\n            // move waypoint\n            waypoint[ axis ] = waypoint[ axis ] + delta[ axis ];\n          }\n\n          if (waypoint.original && shouldMoveWaypoint(waypoint.original, start, direction)) {\n\n            // move waypoint original\n            waypoint.original[ axis ] = waypoint.original[ axis ] + delta[ axis ];\n          }\n\n          return waypoint;\n        });\n\n        self._modeling.updateWaypoints(connection, waypoints, {\n          labelBehavior: false\n        });\n      } else if (includes$1(affectedShapes, source) || includes$1(affectedShapes, target)) {\n\n        // re-layout connection with moved start/end\n        if (includes$1(movingShapes, source)) {\n          layoutHints.connectionStart = getMovedSourceAnchor(connection, source, delta);\n        } else if (includes$1(movingShapes, target)) {\n          layoutHints.connectionEnd = getMovedTargetAnchor(connection, target, delta);\n        } else if (includes$1(resizingShapes, source)) {\n          layoutHints.connectionStart = getResizedSourceAnchor(\n            connection, source, oldBounds[source.id]\n          );\n        } else if (includes$1(resizingShapes, target)) {\n          layoutHints.connectionEnd = getResizedTargetAnchor(\n            connection, target, oldBounds[target.id]\n          );\n        }\n\n        self._modeling.layoutConnection(connection, layoutHints);\n      }\n    });\n  };\n\n\n  // helpers //////////\n\n  function copyWaypoint(waypoint) {\n    return assign$1({}, waypoint);\n  }\n\n  function copyWaypoints(connection) {\n    return map$1(connection.waypoints, function(waypoint) {\n\n      waypoint = copyWaypoint(waypoint);\n\n      if (waypoint.original) {\n        waypoint.original = copyWaypoint(waypoint.original);\n      }\n\n      return waypoint;\n    });\n  }\n\n  function getAxisFromDirection(direction) {\n    switch (direction) {\n    case 'n':\n      return 'y';\n    case 'w':\n      return 'x';\n    case 's':\n      return 'y';\n    case 'e':\n      return 'x';\n    }\n  }\n\n  function shouldMoveWaypoint(waypoint, start, direction) {\n    var relevantAxis = getAxisFromDirection(direction);\n\n    if (/e|s/.test(direction)) {\n      return waypoint[ relevantAxis ] > start;\n    } else if (/n|w/.test(direction)) {\n      return waypoint[ relevantAxis ] < start;\n    }\n  }\n\n  function includes$1(array, item) {\n    return array.indexOf(item) !== -1;\n  }\n\n  function getBounds(shape) {\n    return {\n      x: shape.x,\n      y: shape.y,\n      height: shape.height,\n      width: shape.width\n    };\n  }\n\n  /**\n   * @typedef {import('../../model/Types').Shape} Shape\n   *\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * A handler that toggles the collapsed state of an element\n   * and the visibility of all its children.\n   *\n   * @param {Modeling} modeling\n   */\n  function ToggleShapeCollapseHandler(modeling) {\n    this._modeling = modeling;\n  }\n\n  ToggleShapeCollapseHandler.$inject = [ 'modeling' ];\n\n\n  ToggleShapeCollapseHandler.prototype.execute = function(context) {\n\n    var shape = context.shape,\n        children = shape.children;\n\n    // recursively remember previous visibility of children\n    context.oldChildrenVisibility = getElementsVisibilityRecursive(children);\n\n    // toggle state\n    shape.collapsed = !shape.collapsed;\n\n    // recursively hide/show children\n    var result = setHiddenRecursive(children, shape.collapsed);\n\n    return [ shape ].concat(result);\n  };\n\n\n  ToggleShapeCollapseHandler.prototype.revert = function(context) {\n\n    var shape = context.shape,\n        oldChildrenVisibility = context.oldChildrenVisibility;\n\n    var children = shape.children;\n\n    // recursively set old visability of children\n    var result = restoreVisibilityRecursive(children, oldChildrenVisibility);\n\n    // retoggle state\n    shape.collapsed = !shape.collapsed;\n\n    return [ shape ].concat(result);\n  };\n\n\n  // helpers //////////////////////\n\n  /**\n   * Return a map { elementId -> hiddenState}.\n   *\n   * @param {Shape[]} elements\n   *\n   * @return {Object}\n   */\n  function getElementsVisibilityRecursive(elements) {\n\n    var result = {};\n\n    forEach$1(elements, function(element) {\n      result[element.id] = element.hidden;\n\n      if (element.children) {\n        result = assign$1({}, result, getElementsVisibilityRecursive(element.children));\n      }\n    });\n\n    return result;\n  }\n\n\n  function setHiddenRecursive(elements, newHidden) {\n    var result = [];\n    forEach$1(elements, function(element) {\n      element.hidden = newHidden;\n\n      result = result.concat(element);\n\n      if (element.children) {\n        result = result.concat(setHiddenRecursive(element.children, element.collapsed || newHidden));\n      }\n    });\n\n    return result;\n  }\n\n  function restoreVisibilityRecursive(elements, lastState) {\n    var result = [];\n    forEach$1(elements, function(element) {\n      element.hidden = lastState[element.id];\n\n      result = result.concat(element);\n\n      if (element.children) {\n        result = result.concat(restoreVisibilityRecursive(element.children, lastState));\n      }\n    });\n\n    return result;\n  }\n\n  /**\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * A handler that implements reversible attaching/detaching of shapes.\n   *\n   * @param {Modeling} modeling\n   */\n  function UpdateAttachmentHandler(modeling) {\n    this._modeling = modeling;\n  }\n\n  UpdateAttachmentHandler.$inject = [ 'modeling' ];\n\n\n  UpdateAttachmentHandler.prototype.execute = function(context) {\n    var shape = context.shape,\n        newHost = context.newHost,\n        oldHost = shape.host;\n\n    // (0) detach from old host\n    context.oldHost = oldHost;\n    context.attacherIdx = removeAttacher(oldHost, shape);\n\n    // (1) attach to new host\n    addAttacher(newHost, shape);\n\n    // (2) update host\n    shape.host = newHost;\n\n    return shape;\n  };\n\n  UpdateAttachmentHandler.prototype.revert = function(context) {\n    var shape = context.shape,\n        newHost = context.newHost,\n        oldHost = context.oldHost,\n        attacherIdx = context.attacherIdx;\n\n    // (2) update host\n    shape.host = oldHost;\n\n    // (1) attach to new host\n    removeAttacher(newHost, shape);\n\n    // (0) detach from old host\n    addAttacher(oldHost, shape, attacherIdx);\n\n    return shape;\n  };\n\n\n  function removeAttacher(host, attacher) {\n\n    // remove attacher from host\n    return remove(host && host.attachers, attacher);\n  }\n\n  function addAttacher(host, attacher, idx) {\n\n    if (!host) {\n      return;\n    }\n\n    var attachers = host.attachers;\n\n    if (!attachers) {\n      host.attachers = attachers = [];\n    }\n\n    add(attachers, attacher, idx);\n  }\n\n  function UpdateWaypointsHandler() { }\n\n  UpdateWaypointsHandler.prototype.execute = function(context) {\n\n    var connection = context.connection,\n        newWaypoints = context.newWaypoints;\n\n    context.oldWaypoints = connection.waypoints;\n\n    connection.waypoints = newWaypoints;\n\n    return connection;\n  };\n\n  UpdateWaypointsHandler.prototype.revert = function(context) {\n\n    var connection = context.connection,\n        oldWaypoints = context.oldWaypoints;\n\n    connection.waypoints = oldWaypoints;\n\n    return connection;\n  };\n\n  /**\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Connection} Connection\n   * @typedef {import('../../model/Types').Parent} Parent\n   * @typedef {import('../../model/Types').Shape} Shape\n   * @typedef {import('../../model/Types').Label} Label\n   *\n   * @typedef {import('../../command/CommandStack').default} CommandStack\n   * @typedef {import('../../core/ElementFactory').default} ElementFactory\n   * @typedef {import('../../core/EventBus').default} EventBus\n   *\n   * @typedef {import('../../command/CommandStack').CommandHandlerConstructor} CommandHandlerConstructor\n   *\n   * @typedef {import('../../util/Types').Dimensions} Dimensions\n   * @typedef {import('../../util/Types').Direction} Direction\n   * @typedef {import('../../util/Types').Point} Point\n   * @typedef {import('../../util/Types').Rect} Rect\n   *\n   * @typedef { 'x' | 'y' } ModelingDistributeAxis\n   *\n   * @typedef { 'width' | 'height' } ModelingDistributeDimension\n   *\n   * @typedef { {\n   *   bottom?: number;\n   *   center?: number;\n   *   left?: number;\n   *   middle?: number;\n   *   right?: number;\n   *   top?: number;\n   * } } ModelingAlignAlignment\n   *\n   * @typedef { {\n   *   [key: string]: any;\n   * } } ModelingHints\n   *\n   * @typedef { {\n   *   attach?: boolean;\n   * } & ModelingHints } ModelingMoveElementsHints\n   *\n   * @typedef { {\n   *   attach?: boolean;\n   * } & ModelingHints } ModelingCreateShapeHints\n   */\n\n  /**\n   * @template {Element} U\n   *\n   * @typedef { {\n   *   elements: U[],\n   *   range: {\n   *     min: number;\n   *     max: number;\n   *   } }\n   * } ModelingDistributeGroup\n   */\n\n  /**\n   * The basic modeling entry point.\n   *\n   * @template {Connection} [T=Connection]\n   * @template {Element} [U=Element]\n   * @template {Label} [V=Label]\n   * @template {Parent} [W=Parent]\n   * @template {Shape} [X=Shape]\n   *\n   * @param {EventBus} eventBus\n   * @param {ElementFactory} elementFactory\n   * @param {CommandStack} commandStack\n   */\n  function Modeling$1(eventBus, elementFactory, commandStack) {\n    this._eventBus = eventBus;\n    this._elementFactory = elementFactory;\n    this._commandStack = commandStack;\n\n    var self = this;\n\n    eventBus.on('diagram.init', function() {\n\n      // register modeling handlers\n      self.registerHandlers(commandStack);\n    });\n  }\n\n  Modeling$1.$inject = [ 'eventBus', 'elementFactory', 'commandStack' ];\n\n  /**\n   * Get a map of all command handlers.\n   *\n   * @return {Map<string, CommandHandlerConstructor>}\n   */\n  Modeling$1.prototype.getHandlers = function() {\n    return {\n      'shape.append': AppendShapeHandler,\n      'shape.create': CreateShapeHandler,\n      'shape.delete': DeleteShapeHandler,\n      'shape.move': MoveShapeHandler,\n      'shape.resize': ResizeShapeHandler,\n      'shape.replace': ReplaceShapeHandler,\n      'shape.toggleCollapse': ToggleShapeCollapseHandler,\n\n      'spaceTool': SpaceToolHandler,\n\n      'label.create': CreateLabelHandler,\n\n      'connection.create': CreateConnectionHandler,\n      'connection.delete': DeleteConnectionHandler,\n      'connection.move': MoveConnectionHandler,\n      'connection.layout': LayoutConnectionHandler,\n\n      'connection.updateWaypoints': UpdateWaypointsHandler,\n\n      'connection.reconnect': ReconnectConnectionHandler,\n\n      'elements.create': CreateElementsHandler,\n      'elements.move': MoveElementsHandler,\n      'elements.delete': DeleteElementsHandler,\n\n      'elements.distribute': DistributeElements,\n      'elements.align': AlignElements,\n\n      'element.updateAttachment': UpdateAttachmentHandler\n    };\n  };\n\n  /**\n   * Register handlers with the command stack\n   *\n   * @param {CommandStack} commandStack\n   */\n  Modeling$1.prototype.registerHandlers = function(commandStack) {\n    forEach$1(this.getHandlers(), function(handler, id) {\n      commandStack.registerHandler(id, handler);\n    });\n  };\n\n\n  /**\n   * Move a shape by the given delta and optionally to a new parent.\n   *\n   * @param {X} shape\n   * @param {Point} delta\n   * @param {W} [newParent]\n   * @param {number} [newParentIndex]\n   * @param {ModelingHints} [hints]\n   */\n  Modeling$1.prototype.moveShape = function(shape, delta, newParent, newParentIndex, hints) {\n\n    if (typeof newParentIndex === 'object') {\n      hints = newParentIndex;\n      newParentIndex = null;\n    }\n\n    var context = {\n      shape: shape,\n      delta:  delta,\n      newParent: newParent,\n      newParentIndex: newParentIndex,\n      hints: hints || {}\n    };\n\n    this._commandStack.execute('shape.move', context);\n  };\n\n\n  /**\n   * Update the attachment of a shape.\n   *\n   * @param {X} shape\n   * @param {X} [newHost=undefined]\n   */\n  Modeling$1.prototype.updateAttachment = function(shape, newHost) {\n    var context = {\n      shape: shape,\n      newHost: newHost\n    };\n\n    this._commandStack.execute('element.updateAttachment', context);\n  };\n\n\n  /**\n   * Move elements by a given delta and optionally to a new parent.\n   *\n   * @param {U[]} shapes\n   * @param {Point} delta\n   * @param {W} [target]\n   * @param {ModelingMoveElementsHints} [hints]\n   */\n  Modeling$1.prototype.moveElements = function(shapes, delta, target, hints) {\n\n    hints = hints || {};\n\n    var attach = hints.attach;\n\n    var newParent = target,\n        newHost;\n\n    if (attach === true) {\n      newHost = target;\n      newParent = target.parent;\n    } else\n\n    if (attach === false) {\n      newHost = null;\n    }\n\n    var context = {\n      shapes: shapes,\n      delta: delta,\n      newParent: newParent,\n      newHost: newHost,\n      hints: hints\n    };\n\n    this._commandStack.execute('elements.move', context);\n  };\n\n  /**\n   * Move a shape by the given delta and optionally to a new parent.\n   *\n   * @param {T} connection\n   * @param {Point} delta\n   * @param {W} [newParent]\n   * @param {number} [newParentIndex]\n   * @param {ModelingHints} [hints]\n   */\n  Modeling$1.prototype.moveConnection = function(connection, delta, newParent, newParentIndex, hints) {\n\n    if (typeof newParentIndex === 'object') {\n      hints = newParentIndex;\n      newParentIndex = undefined;\n    }\n\n    var context = {\n      connection: connection,\n      delta: delta,\n      newParent: newParent,\n      newParentIndex: newParentIndex,\n      hints: hints || {}\n    };\n\n    this._commandStack.execute('connection.move', context);\n  };\n\n  /**\n   * Layout a connection.\n   *\n   * @param {T} connection\n   * @param {ModelingHints} [hints]\n   */\n  Modeling$1.prototype.layoutConnection = function(connection, hints) {\n    var context = {\n      connection: connection,\n      hints: hints || {}\n    };\n\n    this._commandStack.execute('connection.layout', context);\n  };\n\n  /**\n   * Create a connection.\n   *\n   * @overlord\n   *\n   * @param {U} source\n   * @param {U} target\n   * @param {Partial<T>} connection\n   * @param {W} parent\n   * @param {ModelingHints} [hints]\n   *\n   * @return {T}\n   */\n\n  /**\n   * Create a connection.\n   *\n   * @param {U} source\n   * @param {U} target\n   * @param {number} parentIndex\n   * @param {Partial<T>} connection\n   * @param {W} parent\n   * @param {ModelingHints} [hints]\n   *\n   * @return {T}\n   */\n  Modeling$1.prototype.createConnection = function(source, target, parentIndex, connection, parent, hints) {\n\n    if (typeof parentIndex === 'object') {\n      hints = parent;\n      parent = connection;\n      connection = parentIndex;\n      parentIndex = undefined;\n    }\n\n    connection = this._create('connection', connection);\n\n    var context = {\n      source: source,\n      target: target,\n      parent: parent,\n      parentIndex: parentIndex,\n      connection: connection,\n      hints: hints\n    };\n\n    this._commandStack.execute('connection.create', context);\n\n    return context.connection;\n  };\n\n\n  /**\n   * Create a shape.\n   *\n   * @overlord\n   *\n   * @param {Partial<X>} shape\n   * @param {Point} position\n   * @param {W} target\n   * @param {ModelingCreateShapeHints} [hints]\n   *\n   * @return {X}\n   */\n\n  /**\n   * Create a shape.\n   *\n   * @param {Partial<X>} shape\n   * @param {Point} position\n   * @param {W} target\n   * @param {number} parentIndex\n   * @param {ModelingCreateShapeHints} [hints]\n   *\n   * @return {X}\n   */\n  Modeling$1.prototype.createShape = function(shape, position, target, parentIndex, hints) {\n\n    if (typeof parentIndex !== 'number') {\n      hints = parentIndex;\n      parentIndex = undefined;\n    }\n\n    hints = hints || {};\n\n    var attach = hints.attach,\n        parent,\n        host;\n\n    shape = this._create('shape', shape);\n\n    if (attach) {\n      parent = target.parent;\n      host = target;\n    } else {\n      parent = target;\n    }\n\n    var context = {\n      position: position,\n      shape: shape,\n      parent: parent,\n      parentIndex: parentIndex,\n      host: host,\n      hints: hints\n    };\n\n    this._commandStack.execute('shape.create', context);\n\n    return context.shape;\n  };\n\n  /**\n   * Create elements.\n   *\n   * @param {Partial<U>[]} elements\n   * @param {Point} position\n   * @param {W} parent\n   * @param {number} [parentIndex]\n   * @param {ModelingHints} [hints]\n   *\n   * @return {U[]}\n   */\n  Modeling$1.prototype.createElements = function(elements, position, parent, parentIndex, hints) {\n    if (!isArray$3(elements)) {\n      elements = [ elements ];\n    }\n\n    if (typeof parentIndex !== 'number') {\n      hints = parentIndex;\n      parentIndex = undefined;\n    }\n\n    hints = hints || {};\n\n    var context = {\n      position: position,\n      elements: elements,\n      parent: parent,\n      parentIndex: parentIndex,\n      hints: hints\n    };\n\n    this._commandStack.execute('elements.create', context);\n\n    return context.elements;\n  };\n\n  /**\n   * Create a label.\n   *\n   * @param {U} labelTarget\n   * @param {Point} position\n   * @param {Partial<V>} label\n   * @param {W} [parent]\n   *\n   * @return {V}\n   */\n  Modeling$1.prototype.createLabel = function(labelTarget, position, label, parent) {\n\n    label = this._create('label', label);\n\n    var context = {\n      labelTarget: labelTarget,\n      position: position,\n      parent: parent || labelTarget.parent,\n      shape: label\n    };\n\n    this._commandStack.execute('label.create', context);\n\n    return context.shape;\n  };\n\n\n  /**\n   * Create and connect a shape to a source.\n   *\n   * @param {U} source\n   * @param {Partial<X>} shape\n   * @param {Point} position\n   * @param {W} target\n   * @param {ModelingHints} [hints]\n   *\n   * @return {X}\n   */\n  Modeling$1.prototype.appendShape = function(source, shape, position, target, hints) {\n\n    hints = hints || {};\n\n    shape = this._create('shape', shape);\n\n    var context = {\n      source: source,\n      position: position,\n      target: target,\n      shape: shape,\n      connection: hints.connection,\n      connectionParent: hints.connectionParent,\n      hints: hints\n    };\n\n    this._commandStack.execute('shape.append', context);\n\n    return context.shape;\n  };\n\n  /**\n   * Remove elements.\n   *\n   * @param {U[]} elements\n   */\n  Modeling$1.prototype.removeElements = function(elements) {\n    var context = {\n      elements: elements\n    };\n\n    this._commandStack.execute('elements.delete', context);\n  };\n\n  /**\n   * Distribute elements along a given axis.\n   *\n   * @param {ModelingDistributeGroup<U>[]} groups\n   * @param {ModelingDistributeAxis} axis\n   * @param {ModelingDistributeDimension} dimension\n   */\n  Modeling$1.prototype.distributeElements = function(groups, axis, dimension) {\n    var context = {\n      groups: groups,\n      axis: axis,\n      dimension: dimension\n    };\n\n    this._commandStack.execute('elements.distribute', context);\n  };\n\n  /**\n   * Remove a shape.\n   *\n   * @param {X} shape\n   * @param {ModelingHints} [hints]\n   */\n  Modeling$1.prototype.removeShape = function(shape, hints) {\n    var context = {\n      shape: shape,\n      hints: hints || {}\n    };\n\n    this._commandStack.execute('shape.delete', context);\n  };\n\n  /**\n   * Remove a connection.\n   *\n   * @param {T} connection\n   * @param {ModelingHints} [hints]\n   */\n  Modeling$1.prototype.removeConnection = function(connection, hints) {\n    var context = {\n      connection: connection,\n      hints: hints || {}\n    };\n\n    this._commandStack.execute('connection.delete', context);\n  };\n\n  /**\n   * Replace a shape.\n   *\n   * @param {X} oldShape\n   * @param {Partial<X>} newShape\n   * @param {ModelingHints} [hints]\n   *\n   * @return {X}\n   */\n  Modeling$1.prototype.replaceShape = function(oldShape, newShape, hints) {\n    var context = {\n      oldShape: oldShape,\n      newData: newShape,\n      hints: hints || {}\n    };\n\n    this._commandStack.execute('shape.replace', context);\n\n    return context.newShape;\n  };\n\n  /**\n   * Align elements.\n   *\n   * @param {U[]} elements\n   * @param {ModelingAlignAlignment} alignment\n   */\n  Modeling$1.prototype.alignElements = function(elements, alignment) {\n    var context = {\n      elements: elements,\n      alignment: alignment\n    };\n\n    this._commandStack.execute('elements.align', context);\n  };\n\n  /**\n   * Resize a shape.\n   *\n   * @param {X} shape\n   * @param {Rect} newBounds\n   * @param {Dimensions} [minBounds]\n   * @param {ModelingHints} [hints]\n   */\n  Modeling$1.prototype.resizeShape = function(shape, newBounds, minBounds, hints) {\n    var context = {\n      shape: shape,\n      newBounds: newBounds,\n      minBounds: minBounds,\n      hints: hints\n    };\n\n    this._commandStack.execute('shape.resize', context);\n  };\n\n  /**\n   * Create space along an horizontally or vertically.\n   *\n   * @param {X[]} movingShapes\n   * @param {X[]} resizingShapes\n   * @param {Point} delta\n   * @param {Direction} direction\n   * @param {number} start\n   */\n  Modeling$1.prototype.createSpace = function(movingShapes, resizingShapes, delta, direction, start) {\n    var context = {\n      delta: delta,\n      direction: direction,\n      movingShapes: movingShapes,\n      resizingShapes: resizingShapes,\n      start: start\n    };\n\n    this._commandStack.execute('spaceTool', context);\n  };\n\n  /**\n   * Update a connetions waypoints.\n   *\n   * @param {T} connection\n   * @param {Point[]} newWaypoints\n   * @param {ModelingHints} [hints]\n   */\n  Modeling$1.prototype.updateWaypoints = function(connection, newWaypoints, hints) {\n    var context = {\n      connection: connection,\n      newWaypoints: newWaypoints,\n      hints: hints || {}\n    };\n\n    this._commandStack.execute('connection.updateWaypoints', context);\n  };\n\n  /**\n   * Reconnect a connections source and/or target.\n   *\n   * @param {T} connection\n   * @param {U} source\n   * @param {U} target\n   * @param {Point|Point[]} dockingOrPoints\n   * @param {ModelingHints} [hints]\n   */\n  Modeling$1.prototype.reconnect = function(connection, source, target, dockingOrPoints, hints) {\n    var context = {\n      connection: connection,\n      newSource: source,\n      newTarget: target,\n      dockingOrPoints: dockingOrPoints,\n      hints: hints || {}\n    };\n\n    this._commandStack.execute('connection.reconnect', context);\n  };\n\n  /**\n   * Reconnect a connections source.\n   *\n   * @param {T} connection\n   * @param {U} newSource\n   * @param {Point|Point[]} dockingOrPoints\n   * @param {ModelingHints} [hints]\n   */\n  Modeling$1.prototype.reconnectStart = function(connection, newSource, dockingOrPoints, hints) {\n    if (!hints) {\n      hints = {};\n    }\n\n    this.reconnect(connection, newSource, connection.target, dockingOrPoints, assign$1(hints, {\n      docking: 'source'\n    }));\n  };\n\n  /**\n   * Reconnect a connections target.\n   *\n   * @param {T} connection\n   * @param {U} newTarget\n   * @param {Point|Point[]} dockingOrPoints\n   * @param {ModelingHints} [hints]\n   */\n  Modeling$1.prototype.reconnectEnd = function(connection, newTarget, dockingOrPoints, hints) {\n    if (!hints) {\n      hints = {};\n    }\n\n    this.reconnect(connection, connection.source, newTarget, dockingOrPoints, assign$1(hints, {\n      docking: 'target'\n    }));\n  };\n\n  /**\n   * Connect two elements.\n   *\n   * @param {U} source\n   * @param {U} target\n   * @param {Partial<T>} [attrs]\n   * @param {ModelingHints} [hints]\n   *\n   * @return {T}\n   */\n  Modeling$1.prototype.connect = function(source, target, attrs, hints) {\n    return this.createConnection(source, target, attrs || {}, source.parent, hints);\n  };\n\n  Modeling$1.prototype._create = function(type, attrs) {\n    if (isModelElement(attrs)) {\n      return attrs;\n    } else {\n      return this._elementFactory.create(type, attrs);\n    }\n  };\n\n  /**\n   * Collapse or expand a shape.\n   *\n   * @param {X} shape\n   * @param {ModelingHints} [hints]\n   */\n  Modeling$1.prototype.toggleCollapse = function(shape, hints) {\n    var context = {\n      shape: shape,\n      hints: hints || {}\n    };\n\n    this._commandStack.execute('shape.toggleCollapse', context);\n  };\n\n  /**\n   * @typedef {import('diagram-js/lib/command/CommandHandler').default} CommandHandler\n   *\n   * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n   *\n   * @typedef {import('../../../model/Types').Shape} Shape\n   * @typedef {import('../../../model/Types').ModdleElement} ModdleElement\n   */\n\n  /**\n   * @implements {CommandHandler}\n   *\n   * @param {ElementRegistry} elementRegistry\n   */\n  function UpdateModdlePropertiesHandler(elementRegistry) {\n    this._elementRegistry = elementRegistry;\n  }\n\n  UpdateModdlePropertiesHandler.$inject = [ 'elementRegistry' ];\n\n  UpdateModdlePropertiesHandler.prototype.execute = function(context) {\n\n    var element = context.element,\n        moddleElement = context.moddleElement,\n        properties = context.properties;\n\n    if (!moddleElement) {\n      throw new Error('<moddleElement> required');\n    }\n\n    // TODO(nikku): we need to ensure that ID properties\n    // are properly registered / unregistered via\n    // this._moddle.ids.assigned(id)\n    var changed = context.changed || this._getVisualReferences(moddleElement).concat(element);\n    var oldProperties = context.oldProperties || getModdleProperties(moddleElement, keys(properties));\n\n    setModdleProperties(moddleElement, properties);\n\n    context.oldProperties = oldProperties;\n    context.changed = changed;\n\n    return changed;\n  };\n\n  UpdateModdlePropertiesHandler.prototype.revert = function(context) {\n    var oldProperties = context.oldProperties,\n        moddleElement = context.moddleElement,\n        changed = context.changed;\n\n    setModdleProperties(moddleElement, oldProperties);\n\n    return changed;\n  };\n\n  /**\n   * Return visual references of given moddle element within the diagram.\n   *\n   * @param {ModdleElement} moddleElement\n   *\n   * @return {Shape[]}\n   */\n  UpdateModdlePropertiesHandler.prototype._getVisualReferences = function(moddleElement) {\n\n    var elementRegistry = this._elementRegistry;\n\n    if (is$1(moddleElement, 'bpmn:DataObject')) {\n      return getAllDataObjectReferences(moddleElement, elementRegistry);\n    }\n\n    return [];\n  };\n\n\n  // helpers /////////////////\n\n  function getModdleProperties(moddleElement, propertyNames) {\n    return reduce(propertyNames, function(result, key) {\n      result[key] = moddleElement.get(key);\n      return result;\n    }, {});\n  }\n\n  function setModdleProperties(moddleElement, properties) {\n    forEach$1(properties, function(value, key) {\n      moddleElement.set(key, value);\n    });\n  }\n\n  function getAllDataObjectReferences(dataObject, elementRegistry) {\n    return elementRegistry.filter(function(element) {\n      return (\n        is$1(element, 'bpmn:DataObjectReference') &&\n            getBusinessObject(element).dataObjectRef === dataObject\n      );\n    });\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/command/CommandHandler').default} CommandHandler\n   * @typedef {import('diagram-js/lib/command/CommandStack').CommandContext} CommandContext\n   *\n   * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../../../model/Types').Moddle} Moddle\n   * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n   * @typedef {import('../Modeling').default} Modeling\n   * @typedef {import('../../../draw/TextRenderer').default} TextRenderer\n   *\n   * @typedef {import('../../../model/Types').Element} Element\n   */\n\n  var DEFAULT_FLOW = 'default',\n      ID = 'id',\n      DI = 'di';\n\n  var NULL_DIMENSIONS$1 = {\n    width: 0,\n    height: 0\n  };\n\n  /**\n   * A handler that implements a BPMN 2.0 property update.\n   *\n   * This should be used to set simple properties on elements with\n   * an underlying BPMN business object.\n   *\n   * Use respective diagram-js provided handlers if you would\n   * like to perform automated modeling.\n   *\n   * @implements {CommandHandler}\n   *\n   * @param {ElementRegistry} elementRegistry\n   * @param {Moddle} moddle\n   * @param {Translate} translate\n   * @param {Modeling} modeling\n   * @param {TextRenderer} textRenderer\n   */\n  function UpdatePropertiesHandler(\n      elementRegistry, moddle, translate,\n      modeling, textRenderer) {\n\n    this._elementRegistry = elementRegistry;\n    this._moddle = moddle;\n    this._translate = translate;\n    this._modeling = modeling;\n    this._textRenderer = textRenderer;\n  }\n\n  UpdatePropertiesHandler.$inject = [\n    'elementRegistry',\n    'moddle',\n    'translate',\n    'modeling',\n    'textRenderer'\n  ];\n\n\n  // api //////////////////////\n\n  /**\n   * Update a BPMN element's properties.\n   *\n   * @param { {\n   *   element: Element;\n   *   properties: Record<string, any>;\n   * } & CommandContext } context\n   *\n   * @return {Element[]}\n   */\n  UpdatePropertiesHandler.prototype.execute = function(context) {\n\n    var element = context.element,\n        changed = [ element ],\n        translate = this._translate;\n\n    if (!element) {\n      throw new Error(translate('element required'));\n    }\n\n    var elementRegistry = this._elementRegistry,\n        ids = this._moddle.ids;\n\n    var businessObject = element.businessObject,\n        properties = unwrapBusinessObjects(context.properties),\n        oldProperties = context.oldProperties || getProperties(element, properties);\n\n    if (isIdChange(properties, businessObject)) {\n      ids.unclaim(businessObject[ID]);\n\n      elementRegistry.updateId(element, properties[ID]);\n\n      ids.claim(properties[ID], businessObject);\n    }\n\n    // correctly indicate visual changes on default flow updates\n    if (DEFAULT_FLOW in properties) {\n\n      if (properties[DEFAULT_FLOW]) {\n        changed.push(elementRegistry.get(properties[DEFAULT_FLOW].id));\n      }\n\n      if (businessObject[DEFAULT_FLOW]) {\n        changed.push(elementRegistry.get(businessObject[DEFAULT_FLOW].id));\n      }\n    }\n\n    // update properties\n    setProperties(element, properties);\n\n    // store old values\n    context.oldProperties = oldProperties;\n    context.changed = changed;\n\n    // indicate changed on objects affected by the update\n    return changed;\n  };\n\n\n  UpdatePropertiesHandler.prototype.postExecute = function(context) {\n    var element = context.element,\n        label = element.label;\n\n    var text = label && getBusinessObject(label).name;\n\n    if (!text) {\n      return;\n    }\n\n    // get layouted text bounds and resize external\n    // external label accordingly\n    var newLabelBounds = this._textRenderer.getExternalLabelBounds(label, text);\n\n    this._modeling.resizeShape(label, newLabelBounds, NULL_DIMENSIONS$1);\n  };\n\n  /**\n   * Revert updating a BPMN element's properties.\n   *\n   * @param { {\n   *   element: Element;\n   *   properties: Record<string, any>;\n   *   oldProperties: Record<string, any>;\n   * } & CommandContext } context\n   *\n   * @return {Element[]}\n   */\n  UpdatePropertiesHandler.prototype.revert = function(context) {\n\n    var element = context.element,\n        properties = context.properties,\n        oldProperties = context.oldProperties,\n        businessObject = element.businessObject,\n        elementRegistry = this._elementRegistry,\n        ids = this._moddle.ids;\n\n    // update properties\n    setProperties(element, oldProperties);\n\n    if (isIdChange(properties, businessObject)) {\n      ids.unclaim(properties[ID]);\n\n      elementRegistry.updateId(element, oldProperties[ID]);\n\n      ids.claim(oldProperties[ID], businessObject);\n    }\n\n    return context.changed;\n  };\n\n\n  function isIdChange(properties, businessObject) {\n    return ID in properties && properties[ID] !== businessObject[ID];\n  }\n\n\n  function getProperties(element, properties) {\n    var propertyNames = keys(properties),\n        businessObject = element.businessObject,\n        di = getDi(element);\n\n    return reduce(propertyNames, function(result, key) {\n\n      // handle DI separately\n      if (key !== DI) {\n        result[key] = businessObject.get(key);\n\n      } else {\n        result[key] = getDiProperties(di, keys(properties.di));\n      }\n\n      return result;\n    }, {});\n  }\n\n\n  function getDiProperties(di, propertyNames) {\n    return reduce(propertyNames, function(result, key) {\n      result[key] = di && di.get(key);\n\n      return result;\n    }, {});\n  }\n\n\n  function setProperties(element, properties) {\n    var businessObject = element.businessObject,\n        di = getDi(element);\n\n    forEach$1(properties, function(value, key) {\n\n      if (key !== DI) {\n        businessObject.set(key, value);\n      } else {\n\n        // only update, if di exists\n        if (di) {\n          setDiProperties(di, value);\n        }\n      }\n    });\n  }\n\n\n  function setDiProperties(di, properties) {\n    forEach$1(properties, function(value, key) {\n      di.set(key, value);\n    });\n  }\n\n\n  var referencePropertyNames = [ 'default' ];\n\n  /**\n   * Make sure we unwrap the actual business object behind diagram element that\n   * may have been passed as arguments.\n   *\n   * @param  {Record<string, any>} properties\n   *\n   * @return {Record<string, any>} unwrappedProps\n   */\n  function unwrapBusinessObjects(properties) {\n\n    var unwrappedProps = assign$1({}, properties);\n\n    referencePropertyNames.forEach(function(name) {\n      if (name in properties) {\n        unwrappedProps[name] = getBusinessObject(unwrappedProps[name]);\n      }\n    });\n\n    return unwrappedProps;\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/command/CommandHandler').default} CommandHandler\n   *\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * @implements {CommandHandler}\n   *\n   * @param {Canvas} canvas\n   * @param {Modeling} modeling\n   */\n  function UpdateCanvasRootHandler(canvas, modeling) {\n    this._canvas = canvas;\n    this._modeling = modeling;\n  }\n\n  UpdateCanvasRootHandler.$inject = [\n    'canvas',\n    'modeling'\n  ];\n\n\n  UpdateCanvasRootHandler.prototype.execute = function(context) {\n\n    var canvas = this._canvas;\n\n    var newRoot = context.newRoot,\n        newRootBusinessObject = newRoot.businessObject,\n        oldRoot = canvas.getRootElement(),\n        oldRootBusinessObject = oldRoot.businessObject,\n        bpmnDefinitions = oldRootBusinessObject.$parent,\n        diPlane = getDi(oldRoot);\n\n    // (1) replace process old <> new root\n    canvas.setRootElement(newRoot);\n    canvas.removeRootElement(oldRoot);\n\n    // (2) update root elements\n    add(bpmnDefinitions.rootElements, newRootBusinessObject);\n    newRootBusinessObject.$parent = bpmnDefinitions;\n\n    remove(bpmnDefinitions.rootElements, oldRootBusinessObject);\n    oldRootBusinessObject.$parent = null;\n\n    // (3) wire di\n    oldRoot.di = null;\n\n    diPlane.bpmnElement = newRootBusinessObject;\n    newRoot.di = diPlane;\n\n    context.oldRoot = oldRoot;\n\n    // TODO(nikku): return changed elements?\n    // return [ newRoot, oldRoot ];\n    return [];\n  };\n\n\n  UpdateCanvasRootHandler.prototype.revert = function(context) {\n\n    var canvas = this._canvas;\n\n    var newRoot = context.newRoot,\n        newRootBusinessObject = newRoot.businessObject,\n        oldRoot = context.oldRoot,\n        oldRootBusinessObject = oldRoot.businessObject,\n        bpmnDefinitions = newRootBusinessObject.$parent,\n        diPlane = getDi(newRoot);\n\n    // (1) replace process old <> new root\n    canvas.setRootElement(oldRoot);\n    canvas.removeRootElement(newRoot);\n\n    // (2) update root elements\n    remove(bpmnDefinitions.rootElements, newRootBusinessObject);\n    newRootBusinessObject.$parent = null;\n\n    add(bpmnDefinitions.rootElements, oldRootBusinessObject);\n    oldRootBusinessObject.$parent = bpmnDefinitions;\n\n    // (3) wire di\n    newRoot.di = null;\n\n    diPlane.bpmnElement = oldRootBusinessObject;\n    oldRoot.di = diPlane;\n\n    // TODO(nikku): return changed elements?\n    // return [ newRoot, oldRoot ];\n\n    return [];\n  };\n\n  /**\n   * @typedef {import('diagram-js/lib/command/CommandHandler').default} CommandHandler\n   *\n   * @typedef {import('../Modeling').default} Modeling\n   * @typedef {import('../../space-tool/BpmnSpaceTool').default} SpaceTool\n   */\n\n  /**\n   * A handler that allows us to add a new lane\n   * above or below an existing one.\n   *\n   * @implements {CommandHandler}\n   *\n   * @param {Modeling} modeling\n   * @param {SpaceTool} spaceTool\n   */\n  function AddLaneHandler(modeling, spaceTool) {\n    this._modeling = modeling;\n    this._spaceTool = spaceTool;\n  }\n\n  AddLaneHandler.$inject = [\n    'modeling',\n    'spaceTool'\n  ];\n\n\n  AddLaneHandler.prototype.preExecute = function(context) {\n\n    var spaceTool = this._spaceTool,\n        modeling = this._modeling;\n\n    var shape = context.shape,\n        location = context.location;\n\n    var lanesRoot = getLanesRoot(shape);\n\n    var isRoot = lanesRoot === shape,\n        laneParent = isRoot ? shape : shape.parent;\n\n    var existingChildLanes = getChildLanes(laneParent);\n\n    // (0) add a lane if we currently got none and are adding to root\n    if (!existingChildLanes.length) {\n      modeling.createShape({ type: 'bpmn:Lane' }, {\n        x: shape.x + LANE_INDENTATION,\n        y: shape.y,\n        width: shape.width - LANE_INDENTATION,\n        height: shape.height\n      }, laneParent);\n    }\n\n    // (1) collect affected elements to create necessary space\n    var allAffected = [];\n\n    eachElement(lanesRoot, function(element) {\n      allAffected.push(element);\n\n      // handle element labels in the diagram root\n      if (element.label) {\n        allAffected.push(element.label);\n      }\n\n      if (element === shape) {\n        return [];\n      }\n\n      return filter(element.children, function(c) {\n        return c !== shape;\n      });\n    });\n\n    var offset = location === 'top' ? -120 : 120,\n        lanePosition = location === 'top' ? shape.y : shape.y + shape.height,\n        spacePos = lanePosition + (location === 'top' ? 10 : -10),\n        direction = location === 'top' ? 'n' : 's';\n\n    var adjustments = spaceTool.calculateAdjustments(allAffected, 'y', offset, spacePos);\n\n    spaceTool.makeSpace(\n      adjustments.movingShapes,\n      adjustments.resizingShapes,\n      { x: 0, y: offset },\n      direction,\n      spacePos\n    );\n\n    // (2) create new lane at open space\n    context.newLane = modeling.createShape({ type: 'bpmn:Lane' }, {\n      x: shape.x + (isRoot ? LANE_INDENTATION : 0),\n      y: lanePosition - (location === 'top' ? 120 : 0),\n      width: shape.width - (isRoot ? LANE_INDENTATION : 0),\n      height: 120\n    }, laneParent);\n  };\n\n  /**\n   * @typedef {import('diagram-js/lib/command/CommandHandler').default} CommandHandler\n   *\n   * @typedef {import('../Modeling').default} Modeling\n   * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n   */\n\n  /**\n   * A handler that splits a lane into a number of sub-lanes,\n   * creating new sub lanes, if necessary.\n   *\n   * @implements {CommandHandler}\n   *\n   * @param {Modeling} modeling\n   * @param {Translate} translate\n   */\n  function SplitLaneHandler(modeling, translate) {\n    this._modeling = modeling;\n    this._translate = translate;\n  }\n\n  SplitLaneHandler.$inject = [\n    'modeling',\n    'translate'\n  ];\n\n\n  SplitLaneHandler.prototype.preExecute = function(context) {\n\n    var modeling = this._modeling,\n        translate = this._translate;\n\n    var shape = context.shape,\n        newLanesCount = context.count;\n\n    var childLanes = getChildLanes(shape),\n        existingLanesCount = childLanes.length;\n\n    if (existingLanesCount > newLanesCount) {\n      throw new Error(translate('more than {count} child lanes', { count: newLanesCount }));\n    }\n\n    var newLanesHeight = Math.round(shape.height / newLanesCount);\n\n    // Iterate from top to bottom in child lane order,\n    // resizing existing lanes and creating new ones\n    // so that they split the parent proportionally.\n    //\n    // Due to rounding related errors, the bottom lane\n    // needs to take up all the remaining space.\n    var laneY,\n        laneHeight,\n        laneBounds,\n        newLaneAttrs,\n        idx;\n\n    for (idx = 0; idx < newLanesCount; idx++) {\n\n      laneY = shape.y + idx * newLanesHeight;\n\n      // if bottom lane\n      if (idx === newLanesCount - 1) {\n        laneHeight = shape.height - (newLanesHeight * idx);\n      } else {\n        laneHeight = newLanesHeight;\n      }\n\n      laneBounds = {\n        x: shape.x + LANE_INDENTATION,\n        y: laneY,\n        width: shape.width - LANE_INDENTATION,\n        height: laneHeight\n      };\n\n      if (idx < existingLanesCount) {\n\n        // resize existing lane\n        modeling.resizeShape(childLanes[idx], laneBounds);\n      } else {\n\n        // create a new lane at position\n        newLaneAttrs = {\n          type: 'bpmn:Lane'\n        };\n\n        modeling.createShape(newLaneAttrs, laneBounds, shape);\n      }\n    }\n  };\n\n  /**\n   * @typedef {import('diagram-js/lib/command/CommandHandler').default} CommandHandler\n   *\n   * @typedef {import('../Modeling').default} Modeling\n   * @typedef {import('../../space-tool/BpmnSpaceTool').default} SpaceTool\n   *\n   * @typedef {import('../../../model/Types').Shape} Shape\n   *\n   * @typedef {import('diagram-js/lib/util/Types').Rect} Rect\n   */\n\n  /**\n   * A handler that resizes a lane.\n   *\n   * @implements {CommandHandler}\n   *\n   * @param {Modeling} modeling\n   * @param {SpaceTool} spaceTool\n   */\n  function ResizeLaneHandler(modeling, spaceTool) {\n    this._modeling = modeling;\n    this._spaceTool = spaceTool;\n  }\n\n  ResizeLaneHandler.$inject = [\n    'modeling',\n    'spaceTool'\n  ];\n\n\n  ResizeLaneHandler.prototype.preExecute = function(context) {\n\n    var shape = context.shape,\n        newBounds = context.newBounds,\n        balanced = context.balanced;\n\n    if (balanced !== false) {\n      this.resizeBalanced(shape, newBounds);\n    } else {\n      this.resizeSpace(shape, newBounds);\n    }\n  };\n\n\n  /**\n   * Resize balanced, adjusting next / previous lane sizes.\n   *\n   * @param {Shape} shape\n   * @param {Rect} newBounds\n   */\n  ResizeLaneHandler.prototype.resizeBalanced = function(shape, newBounds) {\n\n    var modeling = this._modeling;\n\n    var resizeNeeded = computeLanesResize(shape, newBounds);\n\n    // resize the lane\n    modeling.resizeShape(shape, newBounds);\n\n    // resize other lanes as needed\n    resizeNeeded.forEach(function(r) {\n      modeling.resizeShape(r.shape, r.newBounds);\n    });\n  };\n\n\n  /**\n   * Resize, making actual space and moving below / above elements.\n   *\n   * @param {Shape} shape\n   * @param {Rect} newBounds\n   */\n  ResizeLaneHandler.prototype.resizeSpace = function(shape, newBounds) {\n    var spaceTool = this._spaceTool;\n\n    var shapeTrbl = asTRBL(shape),\n        newTrbl = asTRBL(newBounds);\n\n    var trblDiff = substractTRBL(newTrbl, shapeTrbl);\n\n    var lanesRoot = getLanesRoot(shape);\n\n    var allAffected = [],\n        allLanes = [];\n\n    eachElement(lanesRoot, function(element) {\n      allAffected.push(element);\n\n      if (is$1(element, 'bpmn:Lane') || is$1(element, 'bpmn:Participant')) {\n        allLanes.push(element);\n      }\n\n      return element.children;\n    });\n\n    var change,\n        spacePos,\n        direction,\n        offset,\n        adjustments;\n\n    if (trblDiff.bottom || trblDiff.top) {\n\n      change = trblDiff.bottom || trblDiff.top;\n      spacePos = shape.y + (trblDiff.bottom ? shape.height : 0) + (trblDiff.bottom ? -10 : 10);\n      direction = trblDiff.bottom ? 's' : 'n';\n\n      offset = trblDiff.top > 0 || trblDiff.bottom < 0 ? -change : change;\n\n      adjustments = spaceTool.calculateAdjustments(allAffected, 'y', offset, spacePos);\n\n      spaceTool.makeSpace(adjustments.movingShapes, adjustments.resizingShapes, { x: 0, y: change }, direction);\n    }\n\n\n    if (trblDiff.left || trblDiff.right) {\n\n      change = trblDiff.right || trblDiff.left;\n      spacePos = shape.x + (trblDiff.right ? shape.width : 0) + (trblDiff.right ? -10 : 100);\n      direction = trblDiff.right ? 'e' : 'w';\n\n      offset = trblDiff.left > 0 || trblDiff.right < 0 ? -change : change;\n\n      adjustments = spaceTool.calculateAdjustments(allLanes, 'x', offset, spacePos);\n\n      spaceTool.makeSpace(adjustments.movingShapes, adjustments.resizingShapes, { x: change, y: 0 }, direction);\n    }\n  };\n\n  /**\n   * @typedef {import('diagram-js/lib/command/CommandHandler').default} CommandHandler\n   *\n   * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n   *\n   * @typedef {import('../../../model/Types').Shape} Shape\n   */\n\n  var FLOW_NODE_REFS_ATTR = 'flowNodeRef',\n      LANES_ATTR = 'lanes';\n\n\n  /**\n   * A handler that updates lane refs on changed elements.\n   *\n   * @implements {CommandHandler}\n   *\n   * @param {ElementRegistry} elementRegistry\n   */\n  function UpdateFlowNodeRefsHandler(elementRegistry) {\n    this._elementRegistry = elementRegistry;\n  }\n\n  UpdateFlowNodeRefsHandler.$inject = [\n    'elementRegistry'\n  ];\n\n  /**\n   * @param {Shape} flowNodeShapes\n   * @param {Shape} laneShapes\n   *\n   * @return { {\n   *   flowNode: Shape;\n   *   add: Shape[];\n   *   remove: Shape[];\n   * }[] }\n   */\n  UpdateFlowNodeRefsHandler.prototype._computeUpdates = function(flowNodeShapes, laneShapes) {\n\n    var handledNodes = [];\n\n    var updates = [];\n\n    var participantCache = {};\n\n    var allFlowNodeShapes = [];\n\n    function isInLaneShape(element, laneShape) {\n\n      var laneTrbl = asTRBL(laneShape);\n\n      var elementMid = {\n        x: element.x + element.width / 2,\n        y: element.y + element.height / 2\n      };\n\n      return elementMid.x > laneTrbl.left &&\n             elementMid.x < laneTrbl.right &&\n             elementMid.y > laneTrbl.top &&\n             elementMid.y < laneTrbl.bottom;\n    }\n\n    function addFlowNodeShape(flowNodeShape) {\n      if (handledNodes.indexOf(flowNodeShape) === -1) {\n        allFlowNodeShapes.push(flowNodeShape);\n        handledNodes.push(flowNodeShape);\n      }\n    }\n\n    function getAllLaneShapes(flowNodeShape) {\n\n      var root = getLanesRoot(flowNodeShape);\n\n      if (!participantCache[root.id]) {\n        participantCache[root.id] = collectLanes(root);\n      }\n\n      return participantCache[root.id];\n    }\n\n    function getNewLanes(flowNodeShape) {\n      if (!flowNodeShape.parent) {\n        return [];\n      }\n\n      var allLaneShapes = getAllLaneShapes(flowNodeShape);\n\n      return allLaneShapes.filter(function(l) {\n        return isInLaneShape(flowNodeShape, l);\n      }).map(function(shape) {\n        return shape.businessObject;\n      });\n    }\n\n    laneShapes.forEach(function(laneShape) {\n      var root = getLanesRoot(laneShape);\n\n      if (!root || handledNodes.indexOf(root) !== -1) {\n        return;\n      }\n\n      var children = root.children.filter(function(c) {\n        return is$1(c, 'bpmn:FlowNode');\n      });\n\n      children.forEach(addFlowNodeShape);\n\n      handledNodes.push(root);\n    });\n\n    flowNodeShapes.forEach(addFlowNodeShape);\n\n\n    allFlowNodeShapes.forEach(function(flowNodeShape) {\n\n      var flowNode = flowNodeShape.businessObject;\n\n      var lanes = flowNode.get(LANES_ATTR),\n          remove = lanes.slice(),\n          add = getNewLanes(flowNodeShape);\n\n      updates.push({ flowNode: flowNode, remove: remove, add: add });\n    });\n\n    laneShapes.forEach(function(laneShape) {\n\n      var lane = laneShape.businessObject;\n\n      // lane got removed XX-)\n      if (!laneShape.parent) {\n        lane.get(FLOW_NODE_REFS_ATTR).forEach(function(flowNode) {\n          updates.push({ flowNode: flowNode, remove: [ lane ], add: [] });\n        });\n      }\n    });\n\n    return updates;\n  };\n\n  UpdateFlowNodeRefsHandler.prototype.execute = function(context) {\n\n    var updates = context.updates;\n\n    if (!updates) {\n      updates = context.updates = this._computeUpdates(context.flowNodeShapes, context.laneShapes);\n    }\n\n\n    updates.forEach(function(update) {\n\n      var flowNode = update.flowNode,\n          lanes = flowNode.get(LANES_ATTR);\n\n      // unwire old\n      update.remove.forEach(function(oldLane) {\n        remove(lanes, oldLane);\n        remove(oldLane.get(FLOW_NODE_REFS_ATTR), flowNode);\n      });\n\n      // wire new\n      update.add.forEach(function(newLane) {\n        add(lanes, newLane);\n        add(newLane.get(FLOW_NODE_REFS_ATTR), flowNode);\n      });\n    });\n\n    // TODO(nikku): return changed elements\n    // return [ ... ];\n\n    return [];\n  };\n\n\n  UpdateFlowNodeRefsHandler.prototype.revert = function(context) {\n\n    var updates = context.updates;\n\n    updates.forEach(function(update) {\n\n      var flowNode = update.flowNode,\n          lanes = flowNode.get(LANES_ATTR);\n\n      // unwire new\n      update.add.forEach(function(newLane) {\n        remove(lanes, newLane);\n        remove(newLane.get(FLOW_NODE_REFS_ATTR), flowNode);\n      });\n\n      // wire old\n      update.remove.forEach(function(oldLane) {\n        add(lanes, oldLane);\n        add(oldLane.get(FLOW_NODE_REFS_ATTR), flowNode);\n      });\n    });\n\n    // TODO(nikku): return changed elements\n    // return [ ... ];\n\n    return [];\n  };\n\n  /**\n   * @typedef {import('diagram-js/lib/command/CommandHandler').default} CommandHandler\n   *\n   * @typedef {import('../../../model/Types').Moddle} Moddle\n   */\n\n  /**\n   * @implements {CommandHandler}\n   *\n   * @param {Moddle} moddle\n   */\n  function IdClaimHandler(moddle) {\n    this._moddle = moddle;\n  }\n\n  IdClaimHandler.$inject = [ 'moddle' ];\n\n\n  IdClaimHandler.prototype.execute = function(context) {\n    var ids = this._moddle.ids,\n        id = context.id,\n        element = context.element,\n        claiming = context.claiming;\n\n    if (claiming) {\n      ids.claim(id, element);\n    } else {\n      ids.unclaim(id);\n    }\n\n    return [];\n  };\n\n  /**\n   * Command revert implementation.\n   */\n  IdClaimHandler.prototype.revert = function(context) {\n    var ids = this._moddle.ids,\n        id = context.id,\n        element = context.element,\n        claiming = context.claiming;\n\n    if (claiming) {\n      ids.unclaim(id);\n    } else {\n      ids.claim(id, element);\n    }\n\n    return [];\n  };\n\n  /**\r\n   * @typedef {import('diagram-js/lib/command/CommandHandler').default} CommandHandler\r\n   *\r\n   * @typedef {import('diagram-js/lib/command/CommandStack').default} CommandStack\r\n   *\r\n   * @typedef {import('../../../model/Types').ModdleElement} ModdleElement\r\n   */\r\n\r\n  var DEFAULT_COLORS = {\r\n    fill: undefined,\r\n    stroke: undefined\r\n  };\r\n\r\n  /**\r\n   * @implements {CommandHandler}\r\n   *\r\n   * @param {CommandStack} commandStack\r\n   */\r\n  function SetColorHandler(commandStack) {\r\n    this._commandStack = commandStack;\r\n\r\n    this._normalizeColor = function(color) {\r\n\r\n      // Remove color for falsy values.\r\n      if (!color) {\r\n        return undefined;\r\n      }\r\n\r\n      if (isString(color)) {\r\n        var hexColor = colorToHex(color);\r\n\r\n        if (hexColor) {\r\n          return hexColor;\r\n        }\r\n      }\r\n\r\n      throw new Error('invalid color value: ' + color);\r\n    };\r\n  }\r\n\r\n  SetColorHandler.$inject = [\r\n    'commandStack'\r\n  ];\r\n\r\n\r\n  SetColorHandler.prototype.postExecute = function(context) {\r\n    var elements = context.elements,\r\n        colors = context.colors || DEFAULT_COLORS;\r\n\r\n    var self = this;\r\n\r\n    var di = {};\r\n\r\n    if ('fill' in colors) {\r\n      assign$1(di, {\r\n        'background-color': this._normalizeColor(colors.fill) });\r\n    }\r\n\r\n    if ('stroke' in colors) {\r\n      assign$1(di, {\r\n        'border-color': this._normalizeColor(colors.stroke) });\r\n    }\r\n\r\n    forEach$1(elements, function(element) {\r\n      var assignedDi = isConnection(element) ? pick(di, [ 'border-color' ]) : di,\r\n          elementDi = getDi(element);\r\n\r\n      // TODO @barmac: remove once we drop bpmn.io properties\r\n      ensureLegacySupport(assignedDi);\r\n\r\n      if (isLabel(element)) {\r\n\r\n        // set label colors as bpmndi:BPMNLabel#color\r\n        self._commandStack.execute('element.updateModdleProperties', {\r\n          element: element,\r\n          moddleElement: elementDi.label,\r\n          properties: {\r\n            color: di['border-color']\r\n          }\r\n        });\r\n      } else {\r\n\r\n        // ignore non-compliant di\r\n        if (!isAny(elementDi, [ 'bpmndi:BPMNEdge', 'bpmndi:BPMNShape' ])) {\r\n          return;\r\n        }\r\n\r\n        // set colors bpmndi:BPMNEdge or bpmndi:BPMNShape\r\n        self._commandStack.execute('element.updateProperties', {\r\n          element: element,\r\n          properties: {\r\n            di: assignedDi\r\n          }\r\n        });\r\n      }\r\n    });\r\n\r\n  };\r\n\r\n  /**\r\n   * Convert color from rgb(a)/hsl to hex. Returns `null` for unknown color names\r\n   * and for colors with alpha less than 1.0. This depends on `<canvas>`\r\n   * serialization of the `context.fillStyle`.\r\n   * Cf. https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-fillstyle\r\n   *\r\n   * @example\r\n   *\r\n   * ```javascript\r\n   * colorToHex('fuchsia'); // \"#ff00ff\"\r\n   *\r\n   * colorToHex('rgba(1, 2, 3, 0.4)'); // null\r\n   * ```\r\n   *\r\n   * @param {string} color\r\n   *\r\n   * @return {string|null}\r\n   */\r\n  function colorToHex(color) {\r\n    var context = document.createElement('canvas').getContext('2d');\r\n\r\n    // (0) Start with transparent to account for browser default values.\r\n    context.fillStyle = 'transparent';\r\n\r\n    // (1) Assign color so that it's serialized.\r\n    context.fillStyle = color;\r\n\r\n    // (2) Return null for non-hex serialization result.\r\n    return /^#[0-9a-fA-F]{6}$/.test(context.fillStyle) ? context.fillStyle : null;\r\n  }\r\n\r\n  /**\r\n   * Add legacy properties if required.\r\n   *\r\n   * @param {ModdleElement} di\r\n   */\r\n  function ensureLegacySupport(di) {\r\n    if ('border-color' in di) {\r\n      di.stroke = di['border-color'];\r\n    }\r\n\r\n    if ('background-color' in di) {\r\n      di.fill = di['background-color'];\r\n    }\r\n  }\n\n  var NULL_DIMENSIONS = {\n    width: 0,\n    height: 0\n  };\n\n  /**\n   * @typedef {import('../../modeling/Modeling').default} Modeling\n   * @typedef {import('../../../draw/TextRenderer').default} TextRenderer\n   * @typedef {import('../../modeling/BpmnFactory').default} BpmnFactory\n   *\n   * @typedef {import('../../../model/Types').Element} Element\n   */\n\n  /**\n   * A handler that updates the text of a BPMN element.\n   *\n   * @param {Modeling} modeling\n   * @param {TextRenderer} textRenderer\n   * @param {BpmnFactory} bpmnFactory\n   */\n  function UpdateLabelHandler(modeling, textRenderer, bpmnFactory) {\n\n    /**\n     * Set the label and return the changed elements.\n     *\n     * Element parameter can be label itself or connection (i.e. sequence flow).\n     *\n     * @param {Element} element\n     * @param {string} text\n     */\n    function setText(element, text) {\n\n      // external label if present\n      var label = element.label || element;\n\n      var labelTarget = element.labelTarget || element;\n\n      setLabel(label, text);\n\n      return [ label, labelTarget ];\n    }\n\n    function preExecute(ctx) {\n      var element = ctx.element,\n          businessObject = element.businessObject,\n          newLabel = ctx.newLabel;\n\n      if (!isLabel(element)\n          && isLabelExternal(element)\n          && !hasExternalLabel(element)\n          && !isEmptyText(newLabel)) {\n\n        // create label\n        var paddingTop = 7;\n\n        var labelCenter = getExternalLabelMid(element);\n\n        labelCenter = {\n          x: labelCenter.x,\n          y: labelCenter.y + paddingTop\n        };\n\n        modeling.createLabel(element, labelCenter, {\n          id: businessObject.id + '_label',\n          businessObject: businessObject,\n          di: element.di\n        });\n      }\n    }\n\n    function execute(ctx) {\n      ctx.oldLabel = getLabel(ctx.element);\n      return setText(ctx.element, ctx.newLabel);\n    }\n\n    function revert(ctx) {\n      return setText(ctx.element, ctx.oldLabel);\n    }\n\n    function postExecute(ctx) {\n      var element = ctx.element,\n          label = element.label || element,\n          newLabel = ctx.newLabel,\n          newBounds = ctx.newBounds,\n          hints = ctx.hints || {};\n\n      // ignore internal labels for elements except text annotations\n      if (!isLabel(label) && !is$1(label, 'bpmn:TextAnnotation')) {\n        return;\n      }\n\n      if (isLabel(label) && isEmptyText(newLabel)) {\n\n        if (hints.removeShape !== false) {\n          modeling.removeShape(label, { unsetLabel: false });\n        }\n\n        return;\n      }\n\n      var text = getLabel(element);\n\n      // resize element based on label _or_ pre-defined bounds\n      if (typeof newBounds === 'undefined') {\n        newBounds = textRenderer.getExternalLabelBounds(label, text);\n      }\n\n      // setting newBounds to false or _null_ will\n      // disable the postExecute resize operation\n      if (newBounds) {\n        modeling.resizeShape(label, newBounds, NULL_DIMENSIONS);\n      }\n    }\n\n    // API\n\n    this.preExecute = preExecute;\n    this.execute = execute;\n    this.revert = revert;\n    this.postExecute = postExecute;\n  }\n\n  UpdateLabelHandler.$inject = [\n    'modeling',\n    'textRenderer',\n    'bpmnFactory'\n  ];\n\n\n  // helpers //////////\n\n  function isEmptyText(label) {\n    return !label || !label.trim();\n  }\n\n  /**\n   * @typedef {import('../rules/BpmnRules').default} BpmnRules\n   * @typedef {import('diagram-js/lib/command/CommandStack').default} CommandStack\n   * @typedef {import('./ElementFactory').default} ElementFactory\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   *\n   * @typedef {import('diagram-js/lib/features/modeling/Modeling').ModelingHints} ModelingHints\n   *\n   * @typedef {import('../../model/Types').Connection} Connection\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Label} Label\n   * @typedef {import('../../model/Types').Parent} Parent\n   * @typedef {import('../../model/Types').Root} Root\n   * @typedef {import('../../model/Types').Shape} Shape\n   * @typedef {import('../../model/Types').ModdleElement} ModdleElement\n   *\n   * @typedef {import('diagram-js/lib/util/Types').Rect} Rect\n   *\n   * @typedef {import('../../util/Types').Colors} Colors\n   *\n   * @typedef { {\n   *   removeShape?: boolean;\n   * } } UpdateLabelHints\n   */\n\n  /**\n   * The BPMN 2.0 modeling entry point.\n   *\n   * @template {Connection} [T=Connection]\n   * @template {Element} [U=Element]\n   * @template {Label} [V=Label]\n   * @template {Parent} [W=Parent]\n   * @template {Shape} [X=Shape]\n   *\n   * @extends {BaseModeling<T, U, V, W, X>}\n   *\n   * @param {EventBus} eventBus\n   * @param {ElementFactory} elementFactory\n   * @param {CommandStack} commandStack\n   * @param {BpmnRules} bpmnRules\n   */\n  function Modeling(\n      eventBus,\n      elementFactory,\n      commandStack,\n      bpmnRules\n  ) {\n\n    Modeling$1.call(this, eventBus, elementFactory, commandStack);\n\n    this._bpmnRules = bpmnRules;\n  }\n\n  e$3(Modeling, Modeling$1);\n\n  Modeling.$inject = [\n    'eventBus',\n    'elementFactory',\n    'commandStack',\n    'bpmnRules'\n  ];\n\n\n  Modeling.prototype.getHandlers = function() {\n    var handlers = Modeling$1.prototype.getHandlers.call(this);\n\n    handlers['element.updateModdleProperties'] = UpdateModdlePropertiesHandler;\n    handlers['element.updateProperties'] = UpdatePropertiesHandler;\n    handlers['canvas.updateRoot'] = UpdateCanvasRootHandler;\n    handlers['lane.add'] = AddLaneHandler;\n    handlers['lane.resize'] = ResizeLaneHandler;\n    handlers['lane.split'] = SplitLaneHandler;\n    handlers['lane.updateRefs'] = UpdateFlowNodeRefsHandler;\n    handlers['id.updateClaim'] = IdClaimHandler;\n    handlers['element.setColor'] = SetColorHandler;\n    handlers['element.updateLabel'] = UpdateLabelHandler;\n\n    return handlers;\n  };\n\n  /**\n   * Update an element's label.\n   *\n   * @param {Element} element The element.\n   * @param {string} newLabel The new label.\n   * @param {Rect} [newBounds] The optional bounds of the label.\n   * @param {UpdateLabelHints} [hints] The optional hints.\n   */\n  Modeling.prototype.updateLabel = function(element, newLabel, newBounds, hints) {\n    this._commandStack.execute('element.updateLabel', {\n      element: element,\n      newLabel: newLabel,\n      newBounds: newBounds,\n      hints: hints || {}\n    });\n  };\n\n  /**\n   * @param {Element} source\n   * @param {Element} target\n   * @param {Partial<Connection>} attrs\n   * @param {ModelingHints} [hints]\n   *\n   * @return {T}\n   */\n  Modeling.prototype.connect = function(source, target, attrs, hints) {\n\n    var bpmnRules = this._bpmnRules;\n\n    if (!attrs) {\n      attrs = bpmnRules.canConnect(source, target);\n    }\n\n    if (!attrs) {\n      return;\n    }\n\n    return this.createConnection(source, target, attrs, source.parent, hints);\n  };\n\n  /**\n   * Update a model element's properties.\n   *\n   * @param {Element} element The element.\n   * @param {ModdleElement} moddleElement The model element.\n   * @param {Object} properties The updated properties.\n   */\n  Modeling.prototype.updateModdleProperties = function(element, moddleElement, properties) {\n    this._commandStack.execute('element.updateModdleProperties', {\n      element: element,\n      moddleElement: moddleElement,\n      properties: properties\n    });\n  };\n\n  /**\n   * Update an element's properties.\n   *\n   * @param {Element} element The element.\n   * @param {Object} properties The updated properties.\n   */\n  Modeling.prototype.updateProperties = function(element, properties) {\n    this._commandStack.execute('element.updateProperties', {\n      element: element,\n      properties: properties\n    });\n  };\n\n  /**\n   * Resize a lane.\n   *\n   * @param {Shape} laneShape The lane.\n   * @param {Rect} newBounds The new bounds of the lane.\n   * @param {boolean} [balanced] Wether to resize neighboring lanes.\n   */\n  Modeling.prototype.resizeLane = function(laneShape, newBounds, balanced) {\n    this._commandStack.execute('lane.resize', {\n      shape: laneShape,\n      newBounds: newBounds,\n      balanced: balanced\n    });\n  };\n\n  /**\n   * Add a lane.\n   *\n   * @param {Shape} targetLaneShape The shape to add the lane to.\n   * @param {string} location The location.\n   *\n   * @return {Shape} The added lane.\n   */\n  Modeling.prototype.addLane = function(targetLaneShape, location) {\n    var context = {\n      shape: targetLaneShape,\n      location: location\n    };\n\n    this._commandStack.execute('lane.add', context);\n\n    return context.newLane;\n  };\n\n  /**\n   * Split a lane.\n   *\n   * @param {Shape} targetLane The lane to split.\n   * @param {number} count The number of lanes to split the lane into. Must not\n   * exceed the number of existing lanes.\n   */\n  Modeling.prototype.splitLane = function(targetLane, count) {\n    this._commandStack.execute('lane.split', {\n      shape: targetLane,\n      count: count\n    });\n  };\n\n  /**\n   * Turn a process into a collaboration.\n   *\n   * @return {Root} The root of the collaboration.\n   */\n  Modeling.prototype.makeCollaboration = function() {\n\n    var collaborationElement = this._create('root', {\n      type: 'bpmn:Collaboration'\n    });\n\n    var context = {\n      newRoot: collaborationElement\n    };\n\n    this._commandStack.execute('canvas.updateRoot', context);\n\n    return collaborationElement;\n  };\n\n  /**\n   * Transform a collaboration into a process.\n   *\n   * @return {Root} The root of the process.\n   */\n  Modeling.prototype.makeProcess = function() {\n\n    var processElement = this._create('root', {\n      type: 'bpmn:Process'\n    });\n\n    var context = {\n      newRoot: processElement\n    };\n\n    this._commandStack.execute('canvas.updateRoot', context);\n  };\n\n  /**\n   * Update the referenced lanes of each flow node.\n   *\n   * @param {Shape[]} flowNodeShapes The flow nodes to update.\n   * @param {Shape[]} laneShapes The lanes.\n   */\n  Modeling.prototype.updateLaneRefs = function(flowNodeShapes, laneShapes) {\n\n    this._commandStack.execute('lane.updateRefs', {\n      flowNodeShapes: flowNodeShapes,\n      laneShapes: laneShapes\n    });\n  };\n\n  /**\n   * Claim an ID.\n   *\n   * @param {string} id The ID to claim.\n   * @param {ModdleElement} moddleElement The model element the ID is claimed for.\n   */\n  Modeling.prototype.claimId = function(id, moddleElement) {\n    this._commandStack.execute('id.updateClaim', {\n      id: id,\n      element: moddleElement,\n      claiming: true\n    });\n  };\n\n  /**\n   * Unclaim an ID.\n   *\n   * @param {string} id The ID to unclaim.\n   * @param {ModdleElement} moddleElement The model element the ID is claimed for.\n   */\n  Modeling.prototype.unclaimId = function(id, moddleElement) {\n    this._commandStack.execute('id.updateClaim', {\n      id: id,\n      element: moddleElement\n    });\n  };\n\n  /**\n   * Set the color(s) of one or many elements.\n   *\n   * @param {Element[]} elements The elements to set the color(s) for.\n   * @param {Colors} colors The color(s) to set.\n   */\n  Modeling.prototype.setColor = function(elements, colors) {\n    if (!elements.length) {\n      elements = [ elements ];\n    }\n\n    this._commandStack.execute('element.setColor', {\n      elements: elements,\n      colors: colors\n    });\n  };\n\n  /**\n   * @typedef {import('../core/Types').ElementLike} Element\n   * @typedef {import('../core/Types').ConnectionLike} Connection\n   *\n   * @typedef {import('../util').Point} Point\n   *\n   * @typedef { {\n   *   connectionStart?: Point;\n   *   connectionEnd?: Point;\n   *   source?: Element;\n   *   target?: Element;\n   * } } LayoutConnectionHints\n   */\n\n\n  /**\n   * A base connection layouter implementation\n   * that layouts the connection by directly connecting\n   * mid(source) + mid(target).\n   */\n  function BaseLayouter() {}\n\n\n  /**\n   * Return the new layouted waypoints for the given connection.\n   *\n   * The connection passed is still unchanged; you may figure out about\n   * the new connection start / end via the layout hints provided.\n   *\n   * @param {Connection} connection\n   * @param {LayoutConnectionHints} [hints]\n   *\n   * @return {Point[]} The waypoints of the laid out connection.\n   */\n  BaseLayouter.prototype.layoutConnection = function(connection, hints) {\n\n    hints = hints || {};\n\n    return [\n      hints.connectionStart || getMid(hints.source || connection.source),\n      hints.connectionEnd || getMid(hints.target || connection.target)\n    ];\n  };\n\n  /**\n   * @typedef {import('../util/Types').Point} Point\n   * @typedef {import('../util/Types').Rect} Rect\n   */\n\n  var MIN_SEGMENT_LENGTH = 20,\n      POINT_ORIENTATION_PADDING = 5;\n\n  var round$1 = Math.round;\n\n  var INTERSECTION_THRESHOLD = 20,\n      ORIENTATION_THRESHOLD = {\n        'h:h': 20,\n        'v:v': 20,\n        'h:v': -10,\n        'v:h': -10\n      };\n\n  function needsTurn(orientation, startDirection) {\n    return !{\n      t: /top/,\n      r: /right/,\n      b: /bottom/,\n      l: /left/,\n      h: /./,\n      v: /./\n    }[startDirection].test(orientation);\n  }\n\n  function canLayoutStraight(direction, targetOrientation) {\n    return {\n      t: /top/,\n      r: /right/,\n      b: /bottom/,\n      l: /left/,\n      h: /left|right/,\n      v: /top|bottom/\n    }[direction].test(targetOrientation);\n  }\n\n  function getSegmentBendpoints(a, b, directions) {\n    var orientation = getOrientation(b, a, POINT_ORIENTATION_PADDING);\n\n    var startDirection = directions.split(':')[0];\n\n    var xmid = round$1((b.x - a.x) / 2 + a.x),\n        ymid = round$1((b.y - a.y) / 2 + a.y);\n\n    var segmentEnd, segmentDirections;\n\n    var layoutStraight = canLayoutStraight(startDirection, orientation),\n        layoutHorizontal = /h|r|l/.test(startDirection),\n        layoutTurn = false;\n\n    var turnNextDirections = false;\n\n    if (layoutStraight) {\n      segmentEnd = layoutHorizontal ? { x: xmid, y: a.y } : { x: a.x, y: ymid };\n\n      segmentDirections = layoutHorizontal ? 'h:h' : 'v:v';\n    } else {\n      layoutTurn = needsTurn(orientation, startDirection);\n\n      segmentDirections = layoutHorizontal ? 'h:v' : 'v:h';\n\n      if (layoutTurn) {\n\n        if (layoutHorizontal) {\n          turnNextDirections = ymid === a.y;\n\n          segmentEnd = {\n            x: a.x + MIN_SEGMENT_LENGTH * (/l/.test(startDirection) ? -1 : 1),\n            y: turnNextDirections ? ymid + MIN_SEGMENT_LENGTH : ymid\n          };\n        } else {\n          turnNextDirections = xmid === a.x;\n\n          segmentEnd = {\n            x: turnNextDirections ? xmid + MIN_SEGMENT_LENGTH : xmid,\n            y: a.y + MIN_SEGMENT_LENGTH * (/t/.test(startDirection) ? -1 : 1)\n          };\n        }\n\n      } else {\n        segmentEnd = {\n          x: xmid,\n          y: ymid\n        };\n      }\n    }\n\n    return {\n      waypoints: getBendpoints(a, segmentEnd, segmentDirections).concat(segmentEnd),\n      directions:  segmentDirections,\n      turnNextDirections: turnNextDirections\n    };\n  }\n\n  function getStartSegment(a, b, directions) {\n    return getSegmentBendpoints(a, b, directions);\n  }\n\n  function getEndSegment(a, b, directions) {\n    var invertedSegment = getSegmentBendpoints(b, a, invertDirections(directions));\n\n    return {\n      waypoints: invertedSegment.waypoints.slice().reverse(),\n      directions: invertDirections(invertedSegment.directions),\n      turnNextDirections: invertedSegment.turnNextDirections\n    };\n  }\n\n  function getMidSegment(startSegment, endSegment) {\n\n    var startDirection = startSegment.directions.split(':')[1],\n        endDirection = endSegment.directions.split(':')[0];\n\n    if (startSegment.turnNextDirections) {\n      startDirection = startDirection == 'h' ? 'v' : 'h';\n    }\n\n    if (endSegment.turnNextDirections) {\n      endDirection = endDirection == 'h' ? 'v' : 'h';\n    }\n\n    var directions = startDirection + ':' + endDirection;\n\n    var bendpoints = getBendpoints(\n      startSegment.waypoints[startSegment.waypoints.length - 1],\n      endSegment.waypoints[0],\n      directions\n    );\n\n    return {\n      waypoints: bendpoints,\n      directions: directions\n    };\n  }\n\n  function invertDirections(directions) {\n    return directions.split(':').reverse().join(':');\n  }\n\n  /**\n   * Handle simple layouts with maximum two bendpoints.\n   */\n  function getSimpleBendpoints(a, b, directions) {\n\n    var xmid = round$1((b.x - a.x) / 2 + a.x),\n        ymid = round$1((b.y - a.y) / 2 + a.y);\n\n    // one point, right or left from a\n    if (directions === 'h:v') {\n      return [ { x: b.x, y: a.y } ];\n    }\n\n    // one point, above or below a\n    if (directions === 'v:h') {\n      return [ { x: a.x, y: b.y } ];\n    }\n\n    // vertical segment between a and b\n    if (directions === 'h:h') {\n      return [\n        { x: xmid, y: a.y },\n        { x: xmid, y: b.y }\n      ];\n    }\n\n    // horizontal segment between a and b\n    if (directions === 'v:v') {\n      return [\n        { x: a.x, y: ymid },\n        { x: b.x, y: ymid }\n      ];\n    }\n\n    throw new Error('invalid directions: can only handle varians of [hv]:[hv]');\n  }\n\n\n  /**\n   * Returns the mid points for a manhattan connection between two points.\n   *\n   * @example h:h (horizontal:horizontal)\n   *\n   * [a]----[x]\n   *         |\n   *        [x]----[b]\n   *\n   * @example h:v (horizontal:vertical)\n   *\n   * [a]----[x]\n   *         |\n   *        [b]\n   *\n   * @example h:r (horizontal:right)\n   *\n   * [a]----[x]\n   *         |\n   *    [b]-[x]\n   *\n   * @param {Point} a\n   * @param {Point} b\n   * @param {string} directions\n   *\n   * @return {Point[]}\n   */\n  function getBendpoints(a, b, directions) {\n    directions = directions || 'h:h';\n\n    if (!isValidDirections(directions)) {\n      throw new Error(\n        'unknown directions: <' + directions + '>: ' +\n        'must be specified as <start>:<end> ' +\n        'with start/end in { h,v,t,r,b,l }'\n      );\n    }\n\n    // compute explicit directions, involving trbl dockings\n    // using a three segmented layouting algorithm\n    if (isExplicitDirections(directions)) {\n      var startSegment = getStartSegment(a, b, directions),\n          endSegment = getEndSegment(a, b, directions),\n          midSegment = getMidSegment(startSegment, endSegment);\n\n      return [].concat(\n        startSegment.waypoints,\n        midSegment.waypoints,\n        endSegment.waypoints\n      );\n    }\n\n    // handle simple [hv]:[hv] cases that can be easily computed\n    return getSimpleBendpoints(a, b, directions);\n  }\n\n  /**\n   * Create a connection between the two points according\n   * to the manhattan layout (only horizontal and vertical) edges.\n   *\n   * @param {Point} a\n   * @param {Point} b\n   * @param {string} [directions='h:h'] Specifies manhattan directions for each\n   * point as {direction}:{direction}. A direction for a point is either\n   * `h` (horizontal) or `v` (vertical).\n   *\n   * @return {Point[]}\n   */\n  function connectPoints(a, b, directions) {\n\n    var points = getBendpoints(a, b, directions);\n\n    points.unshift(a);\n    points.push(b);\n\n    return withoutRedundantPoints(points);\n  }\n\n\n  /**\n   * Connect two rectangles using a manhattan layouted connection.\n   *\n   * @param {Rect} source source rectangle\n   * @param {Rect} target target rectangle\n   * @param {Point} [start] source docking\n   * @param {Point} [end] target docking\n   * @param {Object} [hints]\n   * @param {string} [hints.preserveDocking=source] preserve docking on selected side\n   * @param {string[]} [hints.preferredLayouts]\n   * @param {Point|boolean} [hints.connectionStart] whether the start changed\n   * @param {Point|boolean} [hints.connectionEnd] whether the end changed\n   *\n   * @return {Point[]} connection points\n   */\n  function connectRectangles(source, target, start, end, hints) {\n\n    var preferredLayouts = hints && hints.preferredLayouts || [];\n\n    var preferredLayout = without(preferredLayouts, 'straight')[0] || 'h:h';\n\n    var threshold = ORIENTATION_THRESHOLD[preferredLayout] || 0;\n\n    var orientation = getOrientation(source, target, threshold);\n\n    var directions = getDirections(orientation, preferredLayout);\n\n    start = start || getMid(source);\n    end = end || getMid(target);\n\n    var directionSplit = directions.split(':');\n\n    // compute actual docking points for start / end\n    // this ensures we properly layout only parts of the\n    // connection that lies in between the two rectangles\n    var startDocking = getDockingPoint(start, source, directionSplit[0], invertOrientation(orientation)),\n        endDocking = getDockingPoint(end, target, directionSplit[1], orientation);\n\n    return connectPoints(startDocking, endDocking, directions);\n  }\n\n\n  /**\n   * Repair the connection between two rectangles, of which one has been updated.\n   *\n   * @param {Rect} source\n   * @param {Rect} target\n   * @param {Point} [start]\n   * @param {Point} [end]\n   * @param {Point[]} [waypoints]\n   * @param {Object} [hints]\n   * @param {string[]} [hints.preferredLayouts] The list of preferred layouts.\n   * @param {boolean} [hints.connectionStart]\n   * @param {boolean} [hints.connectionEnd]\n   *\n   * @return {Point[]} The waypoints of the repaired connection.\n   */\n  function repairConnection(source, target, start, end, waypoints, hints) {\n\n    if (isArray$3(start)) {\n      waypoints = start;\n      hints = end;\n\n      start = getMid(source);\n      end = getMid(target);\n    }\n\n    hints = assign$1({ preferredLayouts: [] }, hints);\n    waypoints = waypoints || [];\n\n    var preferredLayouts = hints.preferredLayouts,\n        preferStraight = preferredLayouts.indexOf('straight') !== -1,\n        repairedWaypoints;\n\n    // just layout non-existing or simple connections\n    // attempt to render straight lines, if required\n\n    // attempt to layout a straight line\n    repairedWaypoints = preferStraight && tryLayoutStraight(source, target, start, end, hints);\n\n    if (repairedWaypoints) {\n      return repairedWaypoints;\n    }\n\n    // try to layout from end\n    repairedWaypoints = hints.connectionEnd && tryRepairConnectionEnd(target, source, end, waypoints);\n\n    if (repairedWaypoints) {\n      return repairedWaypoints;\n    }\n\n    // try to layout from start\n    repairedWaypoints = hints.connectionStart && tryRepairConnectionStart(source, target, start, waypoints);\n\n    if (repairedWaypoints) {\n      return repairedWaypoints;\n    }\n\n    // or whether nothing seems to have changed\n    if (!hints.connectionStart && !hints.connectionEnd && waypoints && waypoints.length) {\n      return waypoints;\n    }\n\n    // simply reconnect if nothing else worked\n    return connectRectangles(source, target, start, end, hints);\n  }\n\n\n  function inRange(a, start, end) {\n    return a >= start && a <= end;\n  }\n\n  function isInRange(axis, a, b) {\n    var size = {\n      x: 'width',\n      y: 'height'\n    };\n\n    return inRange(a[axis], b[axis], b[axis] + b[size[axis]]);\n  }\n\n  /**\n   * Lay out a straight connection.\n   *\n   * @param {Rect} source\n   * @param {Rect} target\n   * @param {Point} start\n   * @param {Point} end\n   * @param {Object} [hints]\n   * @param {string} [hints.preserveDocking]\n   *\n   * @return {Point[]|null} The waypoints or null if layout isn't possible.\n   */\n  function tryLayoutStraight(source, target, start, end, hints) {\n    var axis = {},\n        primaryAxis,\n        orientation;\n\n    orientation = getOrientation(source, target);\n\n    // only layout a straight connection if shapes are\n    // horizontally or vertically aligned\n    if (!/^(top|bottom|left|right)$/.test(orientation)) {\n      return null;\n    }\n\n    if (/top|bottom/.test(orientation)) {\n      primaryAxis = 'x';\n    }\n\n    if (/left|right/.test(orientation)) {\n      primaryAxis = 'y';\n    }\n\n    if (hints.preserveDocking === 'target') {\n\n      if (!isInRange(primaryAxis, end, source)) {\n        return null;\n      }\n\n      axis[primaryAxis] = end[primaryAxis];\n\n      return [\n        {\n          x: axis.x !== undefined ? axis.x : start.x,\n          y: axis.y !== undefined ? axis.y : start.y,\n          original: {\n            x: axis.x !== undefined ? axis.x : start.x,\n            y: axis.y !== undefined ? axis.y : start.y\n          }\n        },\n        {\n          x: end.x,\n          y: end.y\n        }\n      ];\n\n    } else {\n\n      if (!isInRange(primaryAxis, start, target)) {\n        return null;\n      }\n\n      axis[primaryAxis] = start[primaryAxis];\n\n      return [\n        {\n          x: start.x,\n          y: start.y\n        },\n        {\n          x: axis.x !== undefined ? axis.x : end.x,\n          y: axis.y !== undefined ? axis.y : end.y,\n          original: {\n            x: axis.x !== undefined ? axis.x : end.x,\n            y: axis.y !== undefined ? axis.y : end.y\n          }\n        }\n      ];\n    }\n\n  }\n\n  /**\n   * Repair a connection from start.\n   *\n   * @param {Rect} moved\n   * @param {Rect} other\n   * @param {Point} newDocking\n   * @param {Point[]} points originalPoints from moved to other\n   *\n   * @return {Point[]|null} The waypoints of the repaired connection.\n   */\n  function tryRepairConnectionStart(moved, other, newDocking, points) {\n    return _tryRepairConnectionSide(moved, other, newDocking, points);\n  }\n\n  /**\n   * Repair a connection from end.\n   *\n   * @param {Rect} moved\n   * @param {Rect} other\n   * @param {Point} newDocking\n   * @param {Point[]} points originalPoints from moved to other\n   *\n   * @return {Point[]|null} The waypoints of the repaired connection.\n   */\n  function tryRepairConnectionEnd(moved, other, newDocking, points) {\n    var waypoints = points.slice().reverse();\n\n    waypoints = _tryRepairConnectionSide(moved, other, newDocking, waypoints);\n\n    return waypoints ? waypoints.reverse() : null;\n  }\n\n  /**\n   * Repair a connection from one side that moved.\n   *\n   * @param {Rect} moved\n   * @param {Rect} other\n   * @param {Point} newDocking\n   * @param {Point[]} points originalPoints from moved to other\n   *\n   * @return {Point[]} The waypoints of the repaired connection.\n   */\n  function _tryRepairConnectionSide(moved, other, newDocking, points) {\n\n    function needsRelayout(points) {\n      if (points.length < 3) {\n        return true;\n      }\n\n      if (points.length > 4) {\n        return false;\n      }\n\n      // relayout if two points overlap\n      // this is most likely due to\n      return !!find(points, function(p, idx) {\n        var q = points[idx - 1];\n\n        return q && pointDistance(p, q) < 3;\n      });\n    }\n\n    function repairBendpoint(candidate, oldPeer, newPeer) {\n\n      var alignment = pointsAligned(oldPeer, candidate);\n\n      switch (alignment) {\n      case 'v':\n\n        // repair horizontal alignment\n        return { x: newPeer.x, y: candidate.y };\n      case 'h':\n\n        // repair vertical alignment\n        return { x: candidate.x, y: newPeer.y };\n      }\n\n      return { x: candidate.x, y: candidate. y };\n    }\n\n    function removeOverlapping(points, a, b) {\n      var i;\n\n      for (i = points.length - 2; i !== 0; i--) {\n\n        // intersects (?) break, remove all bendpoints up to this one and relayout\n        if (pointInRect(points[i], a, INTERSECTION_THRESHOLD) ||\n            pointInRect(points[i], b, INTERSECTION_THRESHOLD)) {\n\n          // return sliced old connection\n          return points.slice(i);\n        }\n      }\n\n      return points;\n    }\n\n    // (0) only repair what has layoutable bendpoints\n\n    // (1) if only one bendpoint and on shape moved onto other shapes axis\n    //     (horizontally / vertically), relayout\n\n    if (needsRelayout(points)) {\n      return null;\n    }\n\n    var oldDocking = points[0],\n        newPoints = points.slice(),\n        slicedPoints;\n\n    // (2) repair only last line segment and only if it was layouted before\n\n    newPoints[0] = newDocking;\n    newPoints[1] = repairBendpoint(newPoints[1], oldDocking, newDocking);\n\n\n    // (3) if shape intersects with any bendpoint after repair,\n    //     remove all segments up to this bendpoint and repair from there\n    slicedPoints = removeOverlapping(newPoints, moved, other);\n\n    if (slicedPoints !== newPoints) {\n      newPoints = _tryRepairConnectionSide(moved, other, newDocking, slicedPoints);\n    }\n\n    // (4) do NOT repair if repaired bendpoints are aligned\n    if (newPoints && pointsAligned(newPoints)) {\n      return null;\n    }\n\n    return newPoints;\n  }\n\n\n  /**\n   * Returns the manhattan directions connecting two rectangles\n   * with the given orientation.\n   *\n   * Will always return the default layout, if it is specific\n   * regarding sides already (trbl).\n   *\n   * @example\n   *\n   * ```javascript\n   * getDirections('top'); // -> 'v:v'\n   * getDirections('intersect'); // -> 't:t'\n   *\n   * getDirections('top-right', 'v:h'); // -> 'v:h'\n   * getDirections('top-right', 'h:h'); // -> 'h:h'\n   * ```\n   *\n   * @param {string} orientation\n   * @param {string} defaultLayout\n   *\n   * @return {string}\n   */\n  function getDirections(orientation, defaultLayout) {\n\n    // don't override specific trbl directions\n    if (isExplicitDirections(defaultLayout)) {\n      return defaultLayout;\n    }\n\n    switch (orientation) {\n    case 'intersect':\n      return 't:t';\n\n    case 'top':\n    case 'bottom':\n      return 'v:v';\n\n    case 'left':\n    case 'right':\n      return 'h:h';\n\n    // 'top-left'\n    // 'top-right'\n    // 'bottom-left'\n    // 'bottom-right'\n    default:\n      return defaultLayout;\n    }\n  }\n\n  function isValidDirections(directions) {\n    return directions && /^h|v|t|r|b|l:h|v|t|r|b|l$/.test(directions);\n  }\n\n  function isExplicitDirections(directions) {\n    return directions && /t|r|b|l/.test(directions);\n  }\n\n  function invertOrientation(orientation) {\n    return {\n      'top': 'bottom',\n      'bottom': 'top',\n      'left': 'right',\n      'right': 'left',\n      'top-left': 'bottom-right',\n      'bottom-right': 'top-left',\n      'top-right': 'bottom-left',\n      'bottom-left': 'top-right',\n    }[orientation];\n  }\n\n  function getDockingPoint(point, rectangle, dockingDirection, targetOrientation) {\n\n    // ensure we end up with a specific docking direction\n    // based on the targetOrientation, if <h|v> is being passed\n\n    if (dockingDirection === 'h') {\n      dockingDirection = /left/.test(targetOrientation) ? 'l' : 'r';\n    }\n\n    if (dockingDirection === 'v') {\n      dockingDirection = /top/.test(targetOrientation) ? 't' : 'b';\n    }\n\n    if (dockingDirection === 't') {\n      return { original: point, x: point.x, y: rectangle.y };\n    }\n\n    if (dockingDirection === 'r') {\n      return { original: point, x: rectangle.x + rectangle.width, y: point.y };\n    }\n\n    if (dockingDirection === 'b') {\n      return { original: point, x: point.x, y: rectangle.y + rectangle.height };\n    }\n\n    if (dockingDirection === 'l') {\n      return { original: point, x: rectangle.x, y: point.y };\n    }\n\n    throw new Error('unexpected dockingDirection: <' + dockingDirection + '>');\n  }\n\n\n  /**\n   * Return list of waypoints with redundant ones filtered out.\n   *\n   * @example\n   *\n   * Original points:\n   *\n   *   [x] ----- [x] ------ [x]\n   *                         |\n   *                        [x] ----- [x] - [x]\n   *\n   * Filtered:\n   *\n   *   [x] ---------------- [x]\n   *                         |\n   *                        [x] ----------- [x]\n   *\n   * @param {Point[]} waypoints\n   *\n   * @return {Point[]}\n   */\n  function withoutRedundantPoints(waypoints) {\n    return waypoints.reduce(function(points, p, idx) {\n\n      var previous = points[points.length - 1],\n          next = waypoints[idx + 1];\n\n      if (!pointsOnLine(previous, next, p, 0)) {\n        points.push(p);\n      }\n\n      return points;\n    }, []);\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/util/Types').Point} Point\n   *\n   * @typedef {import('../../model/Types').Connection} Connection\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef {import('diagram-js/lib/layout/BaseLayouter').LayoutConnectionHints} LayoutConnectionHints\n   *\n   * @typedef { {\n   *   source?: Element;\n   *   target?: Element;\n   *   waypoints?: Point[];\n   *   connectionStart?: Point;\n   *   connectionEnd?: Point;\n   * } & LayoutConnectionHints } BpmnLayoutConnectionHints\n   */\n\n  var ATTACH_ORIENTATION_PADDING = -10,\n      BOUNDARY_TO_HOST_THRESHOLD$1 = 40;\n\n  var oppositeOrientationMapping = {\n    'top': 'bottom',\n    'top-right': 'bottom-left',\n    'top-left': 'bottom-right',\n    'right': 'left',\n    'bottom': 'top',\n    'bottom-right': 'top-left',\n    'bottom-left': 'top-right',\n    'left': 'right'\n  };\n\n  var orientationDirectionMapping = {\n    top: 't',\n    right: 'r',\n    bottom: 'b',\n    left: 'l'\n  };\n\n  function BpmnLayouter() {}\n\n  e$3(BpmnLayouter, BaseLayouter);\n\n  /**\n   * Returns waypoints of laid out connection.\n   *\n   * @param {Connection} connection\n   * @param {BpmnLayoutConnectionHints} [hints]\n   *\n   * @return {Point[]}\n   */\n  BpmnLayouter.prototype.layoutConnection = function(connection, hints) {\n    if (!hints) {\n      hints = {};\n    }\n\n    var source = hints.source || connection.source,\n        target = hints.target || connection.target,\n        waypoints = hints.waypoints || connection.waypoints,\n        connectionStart = hints.connectionStart,\n        connectionEnd = hints.connectionEnd;\n\n    var manhattanOptions,\n        updatedWaypoints;\n\n    if (!connectionStart) {\n      connectionStart = getConnectionDocking(waypoints && waypoints[ 0 ], source);\n    }\n\n    if (!connectionEnd) {\n      connectionEnd = getConnectionDocking(waypoints && waypoints[ waypoints.length - 1 ], target);\n    }\n\n    // TODO(nikku): support vertical modeling\n    // and invert preferredLayouts accordingly\n\n    if (is$1(connection, 'bpmn:Association') ||\n        is$1(connection, 'bpmn:DataAssociation')) {\n\n      if (waypoints && !isCompensationAssociation(source, target)) {\n        return [].concat([ connectionStart ], waypoints.slice(1, -1), [ connectionEnd ]);\n      }\n    }\n\n    if (is$1(connection, 'bpmn:MessageFlow')) {\n      manhattanOptions = getMessageFlowManhattanOptions(source, target);\n    } else if (is$1(connection, 'bpmn:SequenceFlow') || isCompensationAssociation(source, target)) {\n\n      // layout all connection between flow elements h:h, except for\n      // (1) outgoing of boundary events -> layout based on attach orientation and target orientation\n      // (2) incoming/outgoing of gateways -> v:h for outgoing, h:v for incoming\n      // (3) loops\n      if (source === target) {\n        manhattanOptions = {\n          preferredLayouts: getLoopPreferredLayout(source, connection)\n        };\n      } else if (is$1(source, 'bpmn:BoundaryEvent')) {\n        manhattanOptions = {\n          preferredLayouts: getBoundaryEventPreferredLayouts(source, target, connectionEnd)\n        };\n      } else if (isExpandedSubProcess(source) || isExpandedSubProcess(target)) {\n        manhattanOptions = getSubProcessManhattanOptions(source);\n      } else if (is$1(source, 'bpmn:Gateway')) {\n        manhattanOptions = {\n          preferredLayouts: [ 'v:h' ]\n        };\n      } else if (is$1(target, 'bpmn:Gateway')) {\n        manhattanOptions = {\n          preferredLayouts: [ 'h:v' ]\n        };\n      } else {\n        manhattanOptions = {\n          preferredLayouts: [ 'h:h' ]\n        };\n      }\n    }\n\n    if (manhattanOptions) {\n      manhattanOptions = assign$1(manhattanOptions, hints);\n\n      updatedWaypoints = withoutRedundantPoints(repairConnection(\n        source,\n        target,\n        connectionStart,\n        connectionEnd,\n        waypoints,\n        manhattanOptions\n      ));\n    }\n\n    return updatedWaypoints || [ connectionStart, connectionEnd ];\n  };\n\n\n  // helpers //////////\n\n  function getAttachOrientation(attachedElement) {\n    var hostElement = attachedElement.host;\n\n    return getOrientation(getMid(attachedElement), hostElement, ATTACH_ORIENTATION_PADDING);\n  }\n\n  function getMessageFlowManhattanOptions(source, target) {\n    return {\n      preferredLayouts: [ 'straight', 'v:v' ],\n      preserveDocking: getMessageFlowPreserveDocking(source, target)\n    };\n  }\n\n  function getMessageFlowPreserveDocking(source, target) {\n\n    // (1) docking element connected to participant has precedence\n    if (is$1(target, 'bpmn:Participant')) {\n      return 'source';\n    }\n\n    if (is$1(source, 'bpmn:Participant')) {\n      return 'target';\n    }\n\n    // (2) docking element connected to expanded sub-process has precedence\n    if (isExpandedSubProcess(target)) {\n      return 'source';\n    }\n\n    if (isExpandedSubProcess(source)) {\n      return 'target';\n    }\n\n    // (3) docking event has precedence\n    if (is$1(target, 'bpmn:Event')) {\n      return 'target';\n    }\n\n    if (is$1(source, 'bpmn:Event')) {\n      return 'source';\n    }\n\n    return null;\n  }\n\n  function getSubProcessManhattanOptions(source) {\n    return {\n      preferredLayouts: [ 'straight', 'h:h' ],\n      preserveDocking: getSubProcessPreserveDocking(source)\n    };\n  }\n\n  function getSubProcessPreserveDocking(source) {\n    return isExpandedSubProcess(source) ? 'target' : 'source';\n  }\n\n  function getConnectionDocking(point, shape) {\n    return point ? (point.original || point) : getMid(shape);\n  }\n\n  function isCompensationAssociation(source, target) {\n    return is$1(target, 'bpmn:Activity') &&\n      is$1(source, 'bpmn:BoundaryEvent') &&\n      target.businessObject.isForCompensation;\n  }\n\n  function isExpandedSubProcess(element) {\n    return is$1(element, 'bpmn:SubProcess') && isExpanded(element);\n  }\n\n  function isSame(a, b) {\n    return a === b;\n  }\n\n  function isAnyOrientation(orientation, orientations) {\n    return orientations.indexOf(orientation) !== -1;\n  }\n\n  function getHorizontalOrientation(orientation) {\n    var matches = /right|left/.exec(orientation);\n\n    return matches && matches[0];\n  }\n\n  function getVerticalOrientation(orientation) {\n    var matches = /top|bottom/.exec(orientation);\n\n    return matches && matches[0];\n  }\n\n  function isOppositeOrientation(a, b) {\n    return oppositeOrientationMapping[a] === b;\n  }\n\n  function isOppositeHorizontalOrientation(a, b) {\n    var horizontalOrientation = getHorizontalOrientation(a);\n\n    var oppositeHorizontalOrientation = oppositeOrientationMapping[horizontalOrientation];\n\n    return b.indexOf(oppositeHorizontalOrientation) !== -1;\n  }\n\n  function isOppositeVerticalOrientation(a, b) {\n    var verticalOrientation = getVerticalOrientation(a);\n\n    var oppositeVerticalOrientation = oppositeOrientationMapping[verticalOrientation];\n\n    return b.indexOf(oppositeVerticalOrientation) !== -1;\n  }\n\n  function isHorizontalOrientation(orientation) {\n    return orientation === 'right' || orientation === 'left';\n  }\n\n  function getLoopPreferredLayout(source, connection) {\n    var waypoints = connection.waypoints;\n\n    var orientation = waypoints && waypoints.length && getOrientation(waypoints[0], source);\n\n    if (orientation === 'top') {\n      return [ 't:r' ];\n    } else if (orientation === 'right') {\n      return [ 'r:b' ];\n    } else if (orientation === 'left') {\n      return [ 'l:t' ];\n    }\n\n    return [ 'b:l' ];\n  }\n\n  function getBoundaryEventPreferredLayouts(source, target, end) {\n    var sourceMid = getMid(source),\n        targetMid = getMid(target),\n        attachOrientation = getAttachOrientation(source),\n        sourceLayout,\n        targetLayout;\n\n    var isLoop = isSame(source.host, target);\n\n    var attachedToSide = isAnyOrientation(attachOrientation, [ 'top', 'right', 'bottom', 'left' ]);\n\n    var targetOrientation = getOrientation(targetMid, sourceMid, {\n      x: source.width / 2 + target.width / 2,\n      y: source.height / 2 + target.height / 2\n    });\n\n    if (isLoop) {\n      return getBoundaryEventLoopLayout(attachOrientation, attachedToSide, source, target, end);\n    }\n\n    // source layout\n    sourceLayout = getBoundaryEventSourceLayout(attachOrientation, targetOrientation, attachedToSide);\n\n    // target layout\n    targetLayout = getBoundaryEventTargetLayout(attachOrientation, targetOrientation, attachedToSide);\n\n    return [ sourceLayout + ':' + targetLayout ];\n  }\n\n  function getBoundaryEventLoopLayout(attachOrientation, attachedToSide, source, target, end) {\n    var orientation = attachedToSide ? attachOrientation : getVerticalOrientation(attachOrientation),\n        sourceLayout = orientationDirectionMapping[ orientation ],\n        targetLayout;\n\n    if (attachedToSide) {\n      if (isHorizontalOrientation(attachOrientation)) {\n        targetLayout = shouldConnectToSameSide('y', source, target, end) ? 'h' : 'b';\n      } else {\n        targetLayout = shouldConnectToSameSide('x', source, target, end) ? 'v' : 'l';\n      }\n    } else {\n      targetLayout = 'v';\n    }\n\n    return [ sourceLayout + ':' + targetLayout ];\n  }\n\n  function shouldConnectToSameSide(axis, source, target, end) {\n    var threshold = BOUNDARY_TO_HOST_THRESHOLD$1;\n\n    return !(\n      areCloseOnAxis(axis, end, target, threshold) ||\n      areCloseOnAxis(axis, end, {\n        x: target.x + target.width,\n        y: target.y + target.height\n      }, threshold) ||\n      areCloseOnAxis(axis, end, getMid(source), threshold)\n    );\n  }\n\n  function areCloseOnAxis(axis, a, b, threshold) {\n    return Math.abs(a[ axis ] - b[ axis ]) < threshold;\n  }\n\n  function getBoundaryEventSourceLayout(attachOrientation, targetOrientation, attachedToSide) {\n\n    // attached to either top, right, bottom or left side\n    if (attachedToSide) {\n      return orientationDirectionMapping[ attachOrientation ];\n    }\n\n    // attached to either top-right, top-left, bottom-right or bottom-left corner\n\n    // same vertical or opposite horizontal orientation\n    if (isSame(\n      getVerticalOrientation(attachOrientation), getVerticalOrientation(targetOrientation)\n    ) || isOppositeOrientation(\n      getHorizontalOrientation(attachOrientation), getHorizontalOrientation(targetOrientation)\n    )) {\n      return orientationDirectionMapping[ getVerticalOrientation(attachOrientation) ];\n    }\n\n    // fallback\n    return orientationDirectionMapping[ getHorizontalOrientation(attachOrientation) ];\n  }\n\n  function getBoundaryEventTargetLayout(attachOrientation, targetOrientation, attachedToSide) {\n\n    // attached to either top, right, bottom or left side\n    if (attachedToSide) {\n      if (isHorizontalOrientation(attachOrientation)) {\n\n        // orientation is right or left\n\n        // opposite horizontal orientation or same orientation\n        if (\n          isOppositeHorizontalOrientation(attachOrientation, targetOrientation) ||\n          isSame(attachOrientation, targetOrientation)\n        ) {\n          return 'h';\n        }\n\n        // fallback\n        return 'v';\n      } else {\n\n        // orientation is top or bottom\n\n        // opposite vertical orientation or same orientation\n        if (\n          isOppositeVerticalOrientation(attachOrientation, targetOrientation) ||\n          isSame(attachOrientation, targetOrientation)\n        ) {\n          return 'v';\n        }\n\n        // fallback\n        return 'h';\n      }\n    }\n\n    // attached to either top-right, top-left, bottom-right or bottom-left corner\n\n    // orientation is right, left\n    // or same vertical orientation but also right or left\n    if (isHorizontalOrientation(targetOrientation) ||\n      (isSame(getVerticalOrientation(attachOrientation), getVerticalOrientation(targetOrientation)) &&\n        getHorizontalOrientation(targetOrientation))) {\n      return 'h';\n    } else {\n      return 'v';\n    }\n  }\n\n  /**\n   * @typedef {import('../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../core/GraphicsFactory').default} GraphicsFactory\n   */\n\n  function dockingToPoint(docking) {\n\n    // use the dockings actual point and\n    // retain the original docking\n    return assign$1({ original: docking.point.original || docking.point }, docking.actual);\n  }\n\n\n  /**\n   * A {@link ConnectionDocking} that crops connection waypoints based on\n   * the path(s) of the connection source and target.\n   *\n   * @param {ElementRegistry} elementRegistry\n   * @param {GraphicsFactory} graphicsFactory\n   */\n  function CroppingConnectionDocking(elementRegistry, graphicsFactory) {\n    this._elementRegistry = elementRegistry;\n    this._graphicsFactory = graphicsFactory;\n  }\n\n  CroppingConnectionDocking.$inject = [ 'elementRegistry', 'graphicsFactory' ];\n\n\n  /**\n   * @inheritDoc ConnectionDocking#getCroppedWaypoints\n   */\n  CroppingConnectionDocking.prototype.getCroppedWaypoints = function(connection, source, target) {\n\n    source = source || connection.source;\n    target = target || connection.target;\n\n    var sourceDocking = this.getDockingPoint(connection, source, true),\n        targetDocking = this.getDockingPoint(connection, target);\n\n    var croppedWaypoints = connection.waypoints.slice(sourceDocking.idx + 1, targetDocking.idx);\n\n    croppedWaypoints.unshift(dockingToPoint(sourceDocking));\n    croppedWaypoints.push(dockingToPoint(targetDocking));\n\n    return croppedWaypoints;\n  };\n\n  /**\n   * Return the connection docking point on the specified shape\n   *\n   * @inheritDoc ConnectionDocking#getDockingPoint\n   */\n  CroppingConnectionDocking.prototype.getDockingPoint = function(connection, shape, dockStart) {\n\n    var waypoints = connection.waypoints,\n        dockingIdx,\n        dockingPoint,\n        croppedPoint;\n\n    dockingIdx = dockStart ? 0 : waypoints.length - 1;\n    dockingPoint = waypoints[dockingIdx];\n\n    croppedPoint = this._getIntersection(shape, connection, dockStart);\n\n    return {\n      point: dockingPoint,\n      actual: croppedPoint || dockingPoint,\n      idx: dockingIdx\n    };\n  };\n\n\n  // helpers //////////////////////\n\n  CroppingConnectionDocking.prototype._getIntersection = function(shape, connection, takeFirst) {\n\n    var shapePath = this._getShapePath(shape),\n        connectionPath = this._getConnectionPath(connection);\n\n    return getElementLineIntersection(shapePath, connectionPath, takeFirst);\n  };\n\n  CroppingConnectionDocking.prototype._getConnectionPath = function(connection) {\n    return this._graphicsFactory.getConnectionPath(connection);\n  };\n\n  CroppingConnectionDocking.prototype._getShapePath = function(shape) {\n    return this._graphicsFactory.getShapePath(shape);\n  };\n\n  CroppingConnectionDocking.prototype._getGfx = function(element) {\n    return this._elementRegistry.getGraphics(element);\n  };\n\n  var ModelingModule = {\n    __init__: [\n      'modeling',\n      'bpmnUpdater'\n    ],\n    __depends__: [\n      BehaviorModule,\n      RulesModule,\n      DiOrderingModule,\n      OrderingModule,\n      ReplaceModule,\n      CommandModule,\n      TooltipsModule,\n      LabelSupportModule,\n      AttachSupportModule,\n      SelectionModule,\n      ChangeSupportModule,\n      SpaceToolModule\n    ],\n    bpmnFactory: [ 'type', BpmnFactory ],\n    bpmnUpdater: [ 'type', BpmnUpdater ],\n    elementFactory: [ 'type', ElementFactory ],\n    modeling: [ 'type', Modeling ],\n    layouter: [ 'type', BpmnLayouter ],\n    connectionDocking: [ 'type', CroppingConnectionDocking ]\n  };\n\n  /**\n   * @typedef {import('../../core/Types').ElementLike} Element\n   * @typedef {import('../../core/Types').ShapeLike} Shape\n   *\n   * @typedef {import('../dragging/Dragging').default} Dragging\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   * @typedef {import('../rules/Rules').default} Rules\n   * @typedef {import('../selection/Selection').default} Selection\n   */\n\n  var LOW_PRIORITY$2 = 500,\n      MEDIUM_PRIORITY = 1250,\n      HIGH_PRIORITY$2 = 1500;\n\n  var round = Math.round;\n\n  function mid(element) {\n    return {\n      x: element.x + round(element.width / 2),\n      y: element.y + round(element.height / 2)\n    };\n  }\n\n  /**\n   * A plugin that makes shapes draggable / droppable.\n   *\n   * @param {EventBus} eventBus\n   * @param {Dragging} dragging\n   * @param {Modeling} modeling\n   * @param {Selection} selection\n   * @param {Rules} rules\n   */\n  function MoveEvents(\n      eventBus, dragging, modeling,\n      selection, rules) {\n\n    // rules\n\n    function canMove(shapes, delta, position, target) {\n\n      return rules.allowed('elements.move', {\n        shapes: shapes,\n        delta: delta,\n        position: position,\n        target: target\n      });\n    }\n\n\n    // move events\n\n    // assign a high priority to this handler to setup the environment\n    // others may hook up later, e.g. at default priority and modify\n    // the move environment.\n    //\n    // This sets up the context with\n    //\n    // * shape: the primary shape being moved\n    // * shapes: a list of shapes to be moved\n    // * validatedShapes: a list of shapes that are being checked\n    //                    against the rules before and during move\n    //\n    eventBus.on('shape.move.start', HIGH_PRIORITY$2, function(event) {\n\n      var context = event.context,\n          shape = event.shape,\n          shapes = selection.get().slice();\n\n      // move only single shape if the dragged element\n      // is not part of the current selection\n      if (shapes.indexOf(shape) === -1) {\n        shapes = [ shape ];\n      }\n\n      // ensure we remove nested elements in the collection\n      // and add attachers for a proper dragger\n      shapes = removeNested(shapes);\n\n      // attach shapes to drag context\n      assign$1(context, {\n        shapes: shapes,\n        validatedShapes: shapes,\n        shape: shape\n      });\n    });\n\n\n    // assign a high priority to this handler to setup the environment\n    // others may hook up later, e.g. at default priority and modify\n    // the move environment\n    //\n    eventBus.on('shape.move.start', MEDIUM_PRIORITY, function(event) {\n\n      var context = event.context,\n          validatedShapes = context.validatedShapes,\n          canExecute;\n\n      canExecute = context.canExecute = canMove(validatedShapes);\n\n      // check if we can move the elements\n      if (!canExecute) {\n        return false;\n      }\n    });\n\n    // assign a low priority to this handler\n    // to let others modify the move event before we update\n    // the context\n    //\n    eventBus.on('shape.move.move', LOW_PRIORITY$2, function(event) {\n\n      var context = event.context,\n          validatedShapes = context.validatedShapes,\n          hover = event.hover,\n          delta = { x: event.dx, y: event.dy },\n          position = { x: event.x, y: event.y },\n          canExecute;\n\n      // check if we can move the elements\n      canExecute = canMove(validatedShapes, delta, position, hover);\n\n      context.delta = delta;\n      context.canExecute = canExecute;\n\n      // simply ignore move over\n      if (canExecute === null) {\n        context.target = null;\n\n        return;\n      }\n\n      context.target = hover;\n    });\n\n    eventBus.on('shape.move.end', function(event) {\n\n      var context = event.context;\n\n      var delta = context.delta,\n          canExecute = context.canExecute,\n          isAttach = canExecute === 'attach',\n          shapes = context.shapes;\n\n      if (canExecute === false) {\n        return false;\n      }\n\n      // ensure we have actual pixel values deltas\n      // (important when zoom level was > 1 during move)\n      delta.x = round(delta.x);\n      delta.y = round(delta.y);\n\n      if (delta.x === 0 && delta.y === 0) {\n\n        // didn't move\n        return;\n      }\n\n      modeling.moveElements(shapes, delta, context.target, {\n        primaryShape: context.shape,\n        attach: isAttach\n      });\n    });\n\n\n    // move activation\n\n    eventBus.on('element.mousedown', function(event) {\n\n      if (!isPrimaryButton(event)) {\n        return;\n      }\n\n      var originalEvent = getOriginal$1(event);\n\n      if (!originalEvent) {\n        throw new Error('must supply DOM mousedown event');\n      }\n\n      return start(originalEvent, event.element);\n    });\n\n    /**\n     * Start move.\n     *\n     * @param {MouseEvent|TouchEvent} event\n     * @param {Shape} element\n     * @param {boolean} [activate]\n     * @param {Object} [context]\n     */\n    function start(event, element, activate, context) {\n      if (isObject(activate)) {\n        context = activate;\n        activate = false;\n      }\n\n      // do not move connections or the root element\n      if (element.waypoints || !element.parent) {\n        return;\n      }\n\n      // ignore non-draggable hits\n      if (classes(event.target).has('djs-hit-no-move')) {\n        return;\n      }\n\n      var referencePoint = mid(element);\n\n      dragging.init(event, referencePoint, 'shape.move', {\n        cursor: 'grabbing',\n        autoActivate: activate,\n        data: {\n          shape: element,\n          context: context || {}\n        }\n      });\n\n      // we've handled the event\n      return true;\n    }\n\n    // API\n\n    this.start = start;\n  }\n\n  MoveEvents.$inject = [\n    'eventBus',\n    'dragging',\n    'modeling',\n    'selection',\n    'rules'\n  ];\n\n\n  /**\n   * Return a filtered list of elements that do not contain\n   * those nested into others.\n   *\n   * @param {Element[]} elements\n   *\n   * @return {Element[]} filtered\n   */\n  function removeNested(elements) {\n\n    var ids = groupBy(elements, 'id');\n\n    return filter(elements, function(element) {\n      while ((element = element.parent)) {\n\n        // parent in selection\n        if (ids[element.id]) {\n          return false;\n        }\n      }\n\n      return true;\n    });\n  }\n\n  /**\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../preview-support/PreviewSupport').default} PreviewSupport\n   * @typedef {import('../../draw/Styles').default} Styles\n   */\n\n  var LOW_PRIORITY$1 = 499;\n\n  var MARKER_DRAGGING = 'djs-dragging',\n      MARKER_OK$1 = 'drop-ok',\n      MARKER_NOT_OK$1 = 'drop-not-ok',\n      MARKER_NEW_PARENT = 'new-parent',\n      MARKER_ATTACH = 'attach-ok';\n\n\n  /**\n   * Provides previews for moving shapes when moving.\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {Styles} styles\n   * @param {PreviewSupport} previewSupport\n   */\n  function MovePreview(\n      eventBus, canvas, styles, previewSupport) {\n\n    function getVisualDragShapes(shapes) {\n      var elements = getAllDraggedElements(shapes);\n\n      var filteredElements = removeEdges(elements);\n\n      return filteredElements;\n    }\n\n    function getAllDraggedElements(shapes) {\n      var allShapes = selfAndAllChildren(shapes, true);\n\n      var allConnections = map$1(allShapes, function(shape) {\n        return (shape.incoming || []).concat(shape.outgoing || []);\n      });\n\n      return flatten(allShapes.concat(allConnections));\n    }\n\n    /**\n     * Sets drop marker on an element.\n     */\n    function setMarker(element, marker) {\n\n      [ MARKER_ATTACH, MARKER_OK$1, MARKER_NOT_OK$1, MARKER_NEW_PARENT ].forEach(function(m) {\n\n        if (m === marker) {\n          canvas.addMarker(element, m);\n        } else {\n          canvas.removeMarker(element, m);\n        }\n      });\n    }\n\n    /**\n     * Make an element draggable.\n     *\n     * @param {Object} context\n     * @param {Element} element\n     * @param {boolean} addMarker\n     */\n    function makeDraggable(context, element, addMarker) {\n\n      previewSupport.addDragger(element, context.dragGroup);\n\n      if (addMarker) {\n        canvas.addMarker(element, MARKER_DRAGGING);\n      }\n\n      if (context.allDraggedElements) {\n        context.allDraggedElements.push(element);\n      } else {\n        context.allDraggedElements = [ element ];\n      }\n    }\n\n    // assign a low priority to this handler\n    // to let others modify the move context before\n    // we draw things\n    eventBus.on('shape.move.start', LOW_PRIORITY$1, function(event) {\n      var context = event.context,\n          dragShapes = context.shapes,\n          allDraggedElements = context.allDraggedElements;\n\n      var visuallyDraggedShapes = getVisualDragShapes(dragShapes);\n\n      if (!context.dragGroup) {\n        var dragGroup = create$1('g');\n\n        attr(dragGroup, styles.cls('djs-drag-group', [ 'no-events' ]));\n\n        var activeLayer = canvas.getActiveLayer();\n\n        append(activeLayer, dragGroup);\n\n        context.dragGroup = dragGroup;\n      }\n\n      // add previews\n      visuallyDraggedShapes.forEach(function(shape) {\n        previewSupport.addDragger(shape, context.dragGroup);\n      });\n\n      // cache all dragged elements / gfx\n      // so that we can quickly undo their state changes later\n      if (!allDraggedElements) {\n        allDraggedElements = getAllDraggedElements(dragShapes);\n      } else {\n        allDraggedElements = flatten([\n          allDraggedElements,\n          getAllDraggedElements(dragShapes)\n        ]);\n      }\n\n      // add dragging marker\n      forEach$1(allDraggedElements, function(e) {\n        canvas.addMarker(e, MARKER_DRAGGING);\n      });\n\n      context.allDraggedElements = allDraggedElements;\n\n      // determine, if any of the dragged elements have different parents\n      context.differentParents = haveDifferentParents(dragShapes);\n    });\n\n    // update previews\n    eventBus.on('shape.move.move', LOW_PRIORITY$1, function(event) {\n\n      var context = event.context,\n          dragGroup = context.dragGroup,\n          target = context.target,\n          parent = context.shape.parent,\n          canExecute = context.canExecute;\n\n      if (target) {\n        if (canExecute === 'attach') {\n          setMarker(target, MARKER_ATTACH);\n        } else if (context.canExecute && target && target.id !== parent.id) {\n          setMarker(target, MARKER_NEW_PARENT);\n        } else {\n          setMarker(target, context.canExecute ? MARKER_OK$1 : MARKER_NOT_OK$1);\n        }\n      }\n\n      translate$2(dragGroup, event.dx, event.dy);\n    });\n\n    eventBus.on([ 'shape.move.out', 'shape.move.cleanup' ], function(event) {\n      var context = event.context,\n          target = context.target;\n\n      if (target) {\n        setMarker(target, null);\n      }\n    });\n\n    // remove previews\n    eventBus.on('shape.move.cleanup', function(event) {\n\n      var context = event.context,\n          allDraggedElements = context.allDraggedElements,\n          dragGroup = context.dragGroup;\n\n\n      // remove dragging marker\n      forEach$1(allDraggedElements, function(e) {\n        canvas.removeMarker(e, MARKER_DRAGGING);\n      });\n\n      if (dragGroup) {\n        remove$1(dragGroup);\n      }\n    });\n\n\n    // API //////////////////////\n\n    /**\n     * Make an element draggable.\n     *\n     * @param {Object} context\n     * @param {Element} element\n     * @param {boolean} addMarker\n     */\n    this.makeDraggable = makeDraggable;\n  }\n\n  MovePreview.$inject = [\n    'eventBus',\n    'canvas',\n    'styles',\n    'previewSupport'\n  ];\n\n\n  // helpers //////////////////////\n\n  /**\n   * returns elements minus all connections\n   * where source or target is not elements\n   */\n  function removeEdges(elements) {\n\n    var filteredElements = filter(elements, function(element) {\n\n      if (!isConnection(element)) {\n        return true;\n      } else {\n\n        return (\n          find(elements, matchPattern({ id: element.source.id })) &&\n          find(elements, matchPattern({ id: element.target.id }))\n        );\n      }\n    });\n\n    return filteredElements;\n  }\n\n  function haveDifferentParents(elements) {\n    return size(groupBy(elements, function(e) { return e.parent && e.parent.id; })) !== 1;\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var MoveModule = {\n    __depends__: [\n      InteractionEventsModule$1,\n      SelectionModule,\n      OutlineModule,\n      RulesModule$1,\n      DraggingModule,\n      PreviewSupportModule\n    ],\n    __init__: [\n      'move',\n      'movePreview'\n    ],\n    move: [ 'type', MoveEvents ],\n    movePreview: [ 'type', MovePreview ]\n  };\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   *\n   * @typedef {import('./PaletteProvider').PaletteEntries} PaletteEntries\n   * @typedef {import('./PaletteProvider').default} PaletteProvider\n   */\n\n  var TOGGLE_SELECTOR = '.djs-palette-toggle',\n      ENTRY_SELECTOR = '.entry',\n      ELEMENT_SELECTOR = TOGGLE_SELECTOR + ', ' + ENTRY_SELECTOR;\n\n  var PALETTE_PREFIX = 'djs-palette-',\n      PALETTE_SHOWN_CLS = 'shown',\n      PALETTE_OPEN_CLS = 'open',\n      PALETTE_TWO_COLUMN_CLS = 'two-column';\n\n  var DEFAULT_PRIORITY = 1000;\n\n\n  /**\n   * A palette containing modeling elements.\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   */\n  function Palette(eventBus, canvas) {\n\n    this._eventBus = eventBus;\n    this._canvas = canvas;\n\n    var self = this;\n\n    eventBus.on('tool-manager.update', function(event) {\n      var tool = event.tool;\n\n      self.updateToolHighlight(tool);\n    });\n\n    eventBus.on('i18n.changed', function() {\n      self._update();\n    });\n\n    eventBus.on('diagram.init', function() {\n\n      self._diagramInitialized = true;\n\n      self._rebuild();\n    });\n  }\n\n  Palette.$inject = [ 'eventBus', 'canvas' ];\n\n  /**\n   * @overlord\n   *\n   * Register a palette provider with default priority. See\n   * {@link PaletteProvider} for examples.\n   *\n   * @param {PaletteProvider} provider\n   */\n\n  /**\n   * Register a palette provider with the given priority. See\n   * {@link PaletteProvider} for examples.\n   *\n   * @param {number} priority\n   * @param {PaletteProvider} provider\n   */\n  Palette.prototype.registerProvider = function(priority, provider) {\n    if (!provider) {\n      provider = priority;\n      priority = DEFAULT_PRIORITY;\n    }\n\n    this._eventBus.on('palette.getProviders', priority, function(event) {\n      event.providers.push(provider);\n    });\n\n    this._rebuild();\n  };\n\n\n  /**\n   * Returns the palette entries.\n   *\n   * @return {PaletteEntries}\n   */\n  Palette.prototype.getEntries = function() {\n    var providers = this._getProviders();\n\n    return providers.reduce(addPaletteEntries, {});\n  };\n\n  Palette.prototype._rebuild = function() {\n\n    if (!this._diagramInitialized) {\n      return;\n    }\n\n    var providers = this._getProviders();\n\n    if (!providers.length) {\n      return;\n    }\n\n    if (!this._container) {\n      this._init();\n    }\n\n    this._update();\n  };\n\n  /**\n   * Initialize palette.\n   */\n  Palette.prototype._init = function() {\n\n    var self = this;\n\n    var eventBus = this._eventBus;\n\n    var parentContainer = this._getParentContainer();\n\n    var container = this._container = domify$1(Palette.HTML_MARKUP);\n\n    parentContainer.appendChild(container);\n    classes$1(parentContainer).add(PALETTE_PREFIX + PALETTE_SHOWN_CLS);\n\n    delegate.bind(container, ELEMENT_SELECTOR, 'click', function(event) {\n\n      var target = event.delegateTarget;\n\n      if (matches(target, TOGGLE_SELECTOR)) {\n        return self.toggle();\n      }\n\n      self.trigger('click', event);\n    });\n\n    // prevent drag propagation\n    event.bind(container, 'mousedown', function(event) {\n      event.stopPropagation();\n    });\n\n    // prevent drag propagation\n    delegate.bind(container, ENTRY_SELECTOR, 'dragstart', function(event) {\n      self.trigger('dragstart', event);\n    });\n\n    eventBus.on('canvas.resized', this._layoutChanged, this);\n\n    eventBus.fire('palette.create', {\n      container: container\n    });\n  };\n\n  Palette.prototype._getProviders = function(id) {\n\n    var event = this._eventBus.createEvent({\n      type: 'palette.getProviders',\n      providers: []\n    });\n\n    this._eventBus.fire(event);\n\n    return event.providers;\n  };\n\n  /**\n   * Update palette state.\n   *\n   * @param { {\n   *   open?: boolean;\n   *   twoColumn?: boolean;\n   * } } [state]\n   */\n  Palette.prototype._toggleState = function(state) {\n\n    state = state || {};\n\n    var parent = this._getParentContainer(),\n        container = this._container;\n\n    var eventBus = this._eventBus;\n\n    var twoColumn;\n\n    var cls = classes$1(container),\n        parentCls = classes$1(parent);\n\n    if ('twoColumn' in state) {\n      twoColumn = state.twoColumn;\n    } else {\n      twoColumn = this._needsCollapse(parent.clientHeight, this._entries || {});\n    }\n\n    // always update two column\n    cls.toggle(PALETTE_TWO_COLUMN_CLS, twoColumn);\n    parentCls.toggle(PALETTE_PREFIX + PALETTE_TWO_COLUMN_CLS, twoColumn);\n\n    if ('open' in state) {\n      cls.toggle(PALETTE_OPEN_CLS, state.open);\n      parentCls.toggle(PALETTE_PREFIX + PALETTE_OPEN_CLS, state.open);\n    }\n\n    eventBus.fire('palette.changed', {\n      twoColumn: twoColumn,\n      open: this.isOpen()\n    });\n  };\n\n  Palette.prototype._update = function() {\n\n    var entriesContainer = query('.djs-palette-entries', this._container),\n        entries = this._entries = this.getEntries();\n\n    clear$1(entriesContainer);\n\n    forEach$1(entries, function(entry, id) {\n\n      var grouping = entry.group || 'default';\n\n      var container = query('[data-group=' + escapeCSS(grouping) + ']', entriesContainer);\n      if (!container) {\n        container = domify$1('<div class=\"group\"></div>');\n        attr$1(container, 'data-group', grouping);\n\n        entriesContainer.appendChild(container);\n      }\n\n      var html = entry.html || (\n        entry.separator ?\n          '<hr class=\"separator\" />' :\n          '<div class=\"entry\" draggable=\"true\"></div>');\n\n\n      var control = domify$1(html);\n      container.appendChild(control);\n\n      if (!entry.separator) {\n        attr$1(control, 'data-action', id);\n\n        if (entry.title) {\n          attr$1(control, 'title', entry.title);\n        }\n\n        if (entry.className) {\n          addClasses(control, entry.className);\n        }\n\n        if (entry.imageUrl) {\n          var image = domify$1('<img>');\n          attr$1(image, 'src', entry.imageUrl);\n\n          control.appendChild(image);\n        }\n      }\n    });\n\n    // open after update\n    this.open();\n  };\n\n\n  /**\n   * Trigger an action available on the palette\n   *\n   * @param {string} action\n   * @param {Event} event\n   * @param {boolean} [autoActivate=false]\n   */\n  Palette.prototype.trigger = function(action, event, autoActivate) {\n    var entry,\n        originalEvent,\n        button = event.delegateTarget || event.target;\n\n    if (!button) {\n      return event.preventDefault();\n    }\n\n    entry = attr$1(button, 'data-action');\n    originalEvent = event.originalEvent || event;\n\n    return this.triggerEntry(entry, action, originalEvent, autoActivate);\n  };\n\n  /**\n   * @param {string} entryId\n   * @param {string} action\n   * @param {Event} event\n   * @param {boolean} [autoActivate=false]\n   */\n  Palette.prototype.triggerEntry = function(entryId, action, event, autoActivate) {\n    var entries = this._entries,\n        entry,\n        handler;\n\n    entry = entries[entryId];\n\n    // when user clicks on the palette and not on an action\n    if (!entry) {\n      return;\n    }\n\n    handler = entry.action;\n\n    if (this._eventBus.fire('palette.trigger', { entry, event }) === false) {\n      return;\n    }\n\n    // simple action (via callback function)\n    if (isFunction(handler)) {\n      if (action === 'click') {\n        return handler(event, autoActivate);\n      }\n    } else {\n      if (handler[action]) {\n        return handler[action](event, autoActivate);\n      }\n    }\n\n    // silence other actions\n    event.preventDefault();\n  };\n\n  Palette.prototype._layoutChanged = function() {\n    this._toggleState({});\n  };\n\n  /**\n   * Do we need to collapse to two columns?\n   *\n   * @param {number} availableHeight\n   * @param {PaletteEntries} entries\n   *\n   * @return {boolean}\n   */\n  Palette.prototype._needsCollapse = function(availableHeight, entries) {\n\n    // top margin + bottom toggle + bottom margin\n    // implementors must override this method if they\n    // change the palette styles\n    var margin = 20 + 10 + 20;\n\n    var entriesHeight = Object.keys(entries).length * 46;\n\n    return availableHeight < entriesHeight + margin;\n  };\n\n  /**\n   * Close the palette.\n   */\n  Palette.prototype.close = function() {\n    this._toggleState({\n      open: false,\n      twoColumn: false\n    });\n  };\n\n  /**\n   * Open the palette.\n   */\n  Palette.prototype.open = function() {\n    this._toggleState({ open: true });\n  };\n\n  /**\n   * Toggle the palette.\n   */\n  Palette.prototype.toggle = function() {\n    if (this.isOpen()) {\n      this.close();\n    } else {\n      this.open();\n    }\n  };\n\n  /**\n   * @param {string} tool\n   *\n   * @return {boolean}\n   */\n  Palette.prototype.isActiveTool = function(tool) {\n    return tool && this._activeTool === tool;\n  };\n\n  /**\n   * @param {string} name\n   */\n  Palette.prototype.updateToolHighlight = function(name) {\n    var entriesContainer,\n        toolsContainer;\n\n    if (!this._toolsContainer) {\n      entriesContainer = query('.djs-palette-entries', this._container);\n\n      this._toolsContainer = query('[data-group=tools]', entriesContainer);\n    }\n\n    toolsContainer = this._toolsContainer;\n\n    forEach$1(toolsContainer.children, function(tool) {\n      var actionName = tool.getAttribute('data-action');\n\n      if (!actionName) {\n        return;\n      }\n\n      var toolClasses = classes$1(tool);\n\n      actionName = actionName.replace('-tool', '');\n\n      if (toolClasses.contains('entry') && actionName === name) {\n        toolClasses.add('highlighted-entry');\n      } else {\n        toolClasses.remove('highlighted-entry');\n      }\n    });\n  };\n\n\n  /**\n   * Return `true` if the palette is opened.\n   *\n   * @example\n   *\n   * ```javascript\n   * palette.open();\n   *\n   * if (palette.isOpen()) {\n   *   // yes, we are open\n   * }\n   * ```\n   *\n   * @return {boolean}\n   */\n  Palette.prototype.isOpen = function() {\n    return classes$1(this._container).has(PALETTE_OPEN_CLS);\n  };\n\n  /**\n   * Get parent element of palette.\n   *\n   * @return {HTMLElement}\n   */\n  Palette.prototype._getParentContainer = function() {\n    return this._canvas.getContainer();\n  };\n\n\n  /* markup definition */\n\n  Palette.HTML_MARKUP =\n    '<div class=\"djs-palette\">' +\n      '<div class=\"djs-palette-entries\"></div>' +\n      '<div class=\"djs-palette-toggle\"></div>' +\n    '</div>';\n\n\n  // helpers //////////////////////\n\n  function addClasses(element, classNames) {\n\n    var classes = classes$1(element);\n\n    var actualClassNames = isArray$3(classNames) ? classNames : classNames.split(/\\s+/g);\n    actualClassNames.forEach(function(cls) {\n      classes.add(cls);\n    });\n  }\n\n  function addPaletteEntries(entries, provider) {\n\n    var entriesOrUpdater = provider.getPaletteEntries();\n\n    if (isFunction(entriesOrUpdater)) {\n      return entriesOrUpdater(entries);\n    }\n\n    forEach$1(entriesOrUpdater, function(entry, id) {\n      entries[id] = entry;\n    });\n\n    return entries;\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var PaletteModule$1 = {\n    __init__: [ 'palette' ],\n    palette: [ 'type', Palette ]\n  };\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../dragging/Dragging').default} Dragging\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../mouse/Mouse').default} Mouse\n   * @typedef {import('../selection/Selection').default} Selection\n   * @typedef {import('../tool-manager/ToolManager').default} ToolManager\n   */\n\n  var LASSO_TOOL_CURSOR = 'crosshair';\n\n  /**\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {Dragging} dragging\n   * @param {ElementRegistry} elementRegistry\n   * @param {Selection} selection\n   * @param {ToolManager} toolManager\n   * @param {Mouse} mouse\n   */\n  function LassoTool(\n      eventBus, canvas, dragging,\n      elementRegistry, selection, toolManager,\n      mouse) {\n\n    this._selection = selection;\n    this._dragging = dragging;\n    this._mouse = mouse;\n\n    var self = this;\n\n    // lasso visuals implementation\n\n    /**\n    * A helper that realizes the selection box visual\n    */\n    var visuals = {\n\n      create: function(context) {\n        var container = canvas.getActiveLayer(),\n            frame;\n\n        frame = context.frame = create$1('rect');\n        attr(frame, {\n          class: 'djs-lasso-overlay',\n          width:  1,\n          height: 1,\n          x: 0,\n          y: 0\n        });\n\n        append(container, frame);\n      },\n\n      update: function(context) {\n        var frame = context.frame,\n            bbox = context.bbox;\n\n        attr(frame, {\n          x: bbox.x,\n          y: bbox.y,\n          width: bbox.width,\n          height: bbox.height\n        });\n      },\n\n      remove: function(context) {\n\n        if (context.frame) {\n          remove$1(context.frame);\n        }\n      }\n    };\n\n    toolManager.registerTool('lasso', {\n      tool: 'lasso.selection',\n      dragging: 'lasso'\n    });\n\n    eventBus.on('lasso.selection.end', function(event) {\n      var target = event.originalEvent.target;\n\n      // only reactive on diagram click\n      // on some occasions, event.hover is not set and we have to check if the target is an svg\n      if (!event.hover && !(target instanceof SVGElement)) {\n        return;\n      }\n\n      eventBus.once('lasso.selection.ended', function() {\n        self.activateLasso(event.originalEvent, true);\n      });\n    });\n\n    // lasso interaction implementation\n\n    eventBus.on('lasso.end', function(event) {\n\n      var bbox = toBBox(event);\n\n      var elements = elementRegistry.filter(function(element) {\n        return element;\n      });\n\n      self.select(elements, bbox);\n    });\n\n    eventBus.on('lasso.start', function(event) {\n\n      var context = event.context;\n\n      context.bbox = toBBox(event);\n      visuals.create(context);\n    });\n\n    eventBus.on('lasso.move', function(event) {\n\n      var context = event.context;\n\n      context.bbox = toBBox(event);\n      visuals.update(context);\n    });\n\n    eventBus.on('lasso.cleanup', function(event) {\n\n      var context = event.context;\n\n      visuals.remove(context);\n    });\n\n\n    // event integration\n\n    eventBus.on('element.mousedown', 1500, function(event) {\n\n      if (!hasSecondaryModifier(event)) {\n        return;\n      }\n\n      self.activateLasso(event.originalEvent);\n\n      // we've handled the event\n      return true;\n    });\n  }\n\n  LassoTool.$inject = [\n    'eventBus',\n    'canvas',\n    'dragging',\n    'elementRegistry',\n    'selection',\n    'toolManager',\n    'mouse'\n  ];\n\n\n  LassoTool.prototype.activateLasso = function(event, autoActivate) {\n\n    this._dragging.init(event, 'lasso', {\n      autoActivate: autoActivate,\n      cursor: LASSO_TOOL_CURSOR,\n      data: {\n        context: {}\n      }\n    });\n  };\n\n  LassoTool.prototype.activateSelection = function(event, autoActivate) {\n\n    this._dragging.init(event, 'lasso.selection', {\n      trapClick: false,\n      autoActivate: autoActivate,\n      cursor: LASSO_TOOL_CURSOR,\n      data: {\n        context: {}\n      }\n    });\n  };\n\n  LassoTool.prototype.select = function(elements, bbox) {\n    var selectedElements = getEnclosedElements(elements, bbox);\n\n    this._selection.select(values(selectedElements));\n  };\n\n  LassoTool.prototype.toggle = function() {\n    if (this.isActive()) {\n      return this._dragging.cancel();\n    }\n\n    var mouseEvent = this._mouse.getLastMoveEvent();\n\n    this.activateSelection(mouseEvent, !!mouseEvent);\n  };\n\n  LassoTool.prototype.isActive = function() {\n    var context = this._dragging.context();\n\n    return context && /^lasso/.test(context.prefix);\n  };\n\n\n\n  function toBBox(event) {\n\n    var start = {\n\n      x: event.x - event.dx,\n      y: event.y - event.dy\n    };\n\n    var end = {\n      x: event.x,\n      y: event.y\n    };\n\n    var bbox;\n\n    if ((start.x <= end.x && start.y < end.y) ||\n        (start.x < end.x && start.y <= end.y)) {\n\n      bbox = {\n        x: start.x,\n        y: start.y,\n        width:  end.x - start.x,\n        height: end.y - start.y\n      };\n    } else if ((start.x >= end.x && start.y < end.y) ||\n               (start.x > end.x && start.y <= end.y)) {\n\n      bbox = {\n        x: end.x,\n        y: start.y,\n        width:  start.x - end.x,\n        height: end.y - start.y\n      };\n    } else if ((start.x <= end.x && start.y > end.y) ||\n               (start.x < end.x && start.y >= end.y)) {\n\n      bbox = {\n        x: start.x,\n        y: end.y,\n        width:  end.x - start.x,\n        height: start.y - end.y\n      };\n    } else if ((start.x >= end.x && start.y > end.y) ||\n               (start.x > end.x && start.y >= end.y)) {\n\n      bbox = {\n        x: end.x,\n        y: end.y,\n        width:  start.x - end.x,\n        height: start.y - end.y\n      };\n    } else {\n\n      bbox = {\n        x: end.x,\n        y: end.y,\n        width:  0,\n        height: 0\n      };\n    }\n    return bbox;\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var LassoToolModule = {\n    __depends__: [\n      ToolManagerModule,\n      MouseModule\n    ],\n    __init__: [ 'lassoTool' ],\n    lassoTool: [ 'type', LassoTool ]\n  };\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   *\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../dragging/Dragging').default} Dragging\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../mouse/Mouse').default} Mouse\n   * @typedef {import('../tool-manager/ToolManager').default} ToolManager\n   */\n\n  var HIGH_PRIORITY$1 = 1500;\n  var HAND_CURSOR = 'grab';\n\n  /**\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {Dragging} dragging\n   * @param {Injector} injector\n   * @param {ToolManager} toolManager\n   * @param {Mouse} mouse\n   */\n  function HandTool(\n      eventBus, canvas, dragging,\n      injector, toolManager, mouse) {\n\n    this._dragging = dragging;\n    this._mouse = mouse;\n\n    var self = this,\n        keyboard = injector.get('keyboard', false);\n\n    toolManager.registerTool('hand', {\n      tool: 'hand',\n      dragging: 'hand.move'\n    });\n\n    eventBus.on('element.mousedown', HIGH_PRIORITY$1, function(event) {\n\n      if (!hasPrimaryModifier(event)) {\n        return;\n      }\n\n      self.activateMove(event.originalEvent, true);\n\n      return false;\n    });\n\n    keyboard && keyboard.addListener(HIGH_PRIORITY$1, function(e) {\n      if (!isSpace(e.keyEvent) || self.isActive()) {\n        return;\n      }\n\n      var mouseEvent = self._mouse.getLastMoveEvent();\n\n      self.activateMove(mouseEvent, !!mouseEvent);\n    }, 'keyboard.keydown');\n\n    keyboard && keyboard.addListener(HIGH_PRIORITY$1, function(e) {\n      if (!isSpace(e.keyEvent) || !self.isActive()) {\n        return;\n      }\n\n      self.toggle();\n    }, 'keyboard.keyup');\n\n    eventBus.on('hand.end', function(event) {\n      var target = event.originalEvent.target;\n\n      // only reactive on diagram click\n      // on some occasions, event.hover is not set and we have to check if the target is an svg\n      if (!event.hover && !(target instanceof SVGElement)) {\n        return false;\n      }\n\n      eventBus.once('hand.ended', function() {\n        self.activateMove(event.originalEvent, { reactivate: true });\n      });\n\n    });\n\n    eventBus.on('hand.move.move', function(event) {\n      var scale = canvas.viewbox().scale;\n\n      canvas.scroll({\n        dx: event.dx * scale,\n        dy: event.dy * scale\n      });\n    });\n\n    eventBus.on('hand.move.end', function(event) {\n      var context = event.context,\n          reactivate = context.reactivate;\n\n      // Don't reactivate if the user is using the keyboard keybinding\n      if (!hasPrimaryModifier(event) && reactivate) {\n\n        eventBus.once('hand.move.ended', function(event) {\n          self.activateHand(event.originalEvent, true, true);\n        });\n\n      }\n\n      return false;\n    });\n\n  }\n\n  HandTool.$inject = [\n    'eventBus',\n    'canvas',\n    'dragging',\n    'injector',\n    'toolManager',\n    'mouse'\n  ];\n\n\n  HandTool.prototype.activateMove = function(event, autoActivate, context) {\n    if (typeof autoActivate === 'object') {\n      context = autoActivate;\n      autoActivate = false;\n    }\n\n    this._dragging.init(event, 'hand.move', {\n      autoActivate: autoActivate,\n      cursor: HAND_CURSOR,\n      data: {\n        context: context || {}\n      }\n    });\n  };\n\n  HandTool.prototype.activateHand = function(event, autoActivate, reactivate) {\n    this._dragging.init(event, 'hand', {\n      trapClick: false,\n      autoActivate: autoActivate,\n      cursor: HAND_CURSOR,\n      data: {\n        context: {\n          reactivate: reactivate\n        }\n      }\n    });\n  };\n\n  HandTool.prototype.toggle = function() {\n    if (this.isActive()) {\n      return this._dragging.cancel();\n    }\n\n    var mouseEvent = this._mouse.getLastMoveEvent();\n\n    this.activateHand(mouseEvent, !!mouseEvent);\n  };\n\n  HandTool.prototype.isActive = function() {\n    var context = this._dragging.context();\n\n    if (context) {\n      return /^(hand|hand\\.move)$/.test(context.prefix);\n    }\n\n    return false;\n  };\n\n  // helpers //////////\n\n  function isSpace(keyEvent) {\n    return isKey('Space', keyEvent);\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var HandToolModule = {\n    __depends__: [\n      ToolManagerModule,\n      MouseModule\n    ],\n    __init__: [ 'handTool' ],\n    handTool: [ 'type', HandTool ]\n  };\n\n  var MARKER_OK = 'connect-ok',\n      MARKER_NOT_OK = 'connect-not-ok';\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../connect/Connect').default} Connect\n   * @typedef {import('../dragging/Dragging').default} Dragging\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../mouse/Mouse').default} Mouse\n   * @typedef {import('../rules/Rules').default} Rules\n   * @typedef {import('../tool-manager/ToolManager').default} ToolManager\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   */\n\n  /**\n   * @class\n   * @constructor\n   *\n   * @param {EventBus} eventBus\n   * @param {Dragging} dragging\n   * @param {Connect} connect\n   * @param {Canvas} canvas\n   * @param {ToolManager} toolManager\n   * @param {Rules} rules\n   * @param {Mouse} mouse\n   */\n  function GlobalConnect(\n      eventBus, dragging, connect,\n      canvas, toolManager, rules,\n      mouse) {\n\n    var self = this;\n\n    this._dragging = dragging;\n    this._rules = rules;\n    this._mouse = mouse;\n\n    toolManager.registerTool('global-connect', {\n      tool: 'global-connect',\n      dragging: 'global-connect.drag'\n    });\n\n    eventBus.on('global-connect.hover', function(event) {\n      var context = event.context,\n          startTarget = event.hover;\n\n      var canStartConnect = context.canStartConnect = self.canStartConnect(startTarget);\n\n      // simply ignore hover\n      if (canStartConnect === null) {\n        return;\n      }\n\n      context.startTarget = startTarget;\n\n      canvas.addMarker(startTarget, canStartConnect ? MARKER_OK : MARKER_NOT_OK);\n    });\n\n\n    eventBus.on([ 'global-connect.out', 'global-connect.cleanup' ], function(event) {\n      var startTarget = event.context.startTarget,\n          canStartConnect = event.context.canStartConnect;\n\n      if (startTarget) {\n        canvas.removeMarker(startTarget, canStartConnect ? MARKER_OK : MARKER_NOT_OK);\n      }\n    });\n\n\n    eventBus.on([ 'global-connect.ended' ], function(event) {\n      var context = event.context,\n          startTarget = context.startTarget,\n          startPosition = {\n            x: event.x,\n            y: event.y\n          };\n\n      var canStartConnect = self.canStartConnect(startTarget);\n\n      if (!canStartConnect) {\n        return;\n      }\n\n      eventBus.once('element.out', function() {\n        eventBus.once([ 'connect.ended', 'connect.canceled' ], function() {\n          eventBus.fire('global-connect.drag.ended');\n        });\n\n        connect.start(null, startTarget, startPosition);\n      });\n\n      return false;\n    });\n  }\n\n  GlobalConnect.$inject = [\n    'eventBus',\n    'dragging',\n    'connect',\n    'canvas',\n    'toolManager',\n    'rules',\n    'mouse'\n  ];\n\n  /**\n   * Initiates tool activity.\n   */\n  GlobalConnect.prototype.start = function(event, autoActivate) {\n    this._dragging.init(event, 'global-connect', {\n      autoActivate: autoActivate,\n      trapClick: false,\n      data: {\n        context: {}\n      }\n    });\n  };\n\n  GlobalConnect.prototype.toggle = function() {\n\n    if (this.isActive()) {\n      return this._dragging.cancel();\n    }\n\n    var mouseEvent = this._mouse.getLastMoveEvent();\n\n    return this.start(mouseEvent, !!mouseEvent);\n  };\n\n  GlobalConnect.prototype.isActive = function() {\n    var context = this._dragging.context();\n\n    return context && /^global-connect/.test(context.prefix);\n  };\n\n  /**\n   * Check if source element can initiate connection.\n   *\n   * @param {Element} startTarget\n   * @return {boolean}\n   */\n  GlobalConnect.prototype.canStartConnect = function(startTarget) {\n    return this._rules.allowed('connection.start', { source: startTarget });\n  };\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var GlobalConnectModule = {\n    __depends__: [\n      ConnectModule,\n      RulesModule$1,\n      DraggingModule,\n      ToolManagerModule,\n      MouseModule\n    ],\n    globalConnect: [ 'type', GlobalConnect ]\n  };\n\n  /**\n   * @typedef {import('diagram-js/lib/features/palette/Palette').default} Palette\n   * @typedef {import('diagram-js/lib/features/create/Create').default} Create\n   * @typedef {import('diagram-js/lib/core/ElementFactory').default} ElementFactory\n   * @typedef {import('../space-tool/BpmnSpaceTool').default} SpaceTool\n   * @typedef {import('diagram-js/lib/features/lasso-tool/LassoTool').default} LassoTool\n   * @typedef {import('diagram-js/lib/features/hand-tool/HandTool').default} HandTool\n   * @typedef {import('diagram-js/lib/features/global-connect/GlobalConnect').default} GlobalConnect\n   * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n   *\n   * @typedef {import('diagram-js/lib/features/palette/Palette').PaletteEntries} PaletteEntries\n   */\n\n  /**\n   * A palette provider for BPMN 2.0 elements.\n   *\n   * @param {Palette} palette\n   * @param {Create} create\n   * @param {ElementFactory} elementFactory\n   * @param {SpaceTool} spaceTool\n   * @param {LassoTool} lassoTool\n   * @param {HandTool} handTool\n   * @param {GlobalConnect} globalConnect\n   * @param {Translate} translate\n   */\n  function PaletteProvider(\n      palette, create, elementFactory,\n      spaceTool, lassoTool, handTool,\n      globalConnect, translate) {\n\n    this._palette = palette;\n    this._create = create;\n    this._elementFactory = elementFactory;\n    this._spaceTool = spaceTool;\n    this._lassoTool = lassoTool;\n    this._handTool = handTool;\n    this._globalConnect = globalConnect;\n    this._translate = translate;\n\n    palette.registerProvider(this);\n  }\n\n  PaletteProvider.$inject = [\n    'palette',\n    'create',\n    'elementFactory',\n    'spaceTool',\n    'lassoTool',\n    'handTool',\n    'globalConnect',\n    'translate'\n  ];\n\n  /**\n   * @return {PaletteEntries}\n   */\n  PaletteProvider.prototype.getPaletteEntries = function() {\n\n    var actions = {},\n        create = this._create,\n        elementFactory = this._elementFactory,\n        spaceTool = this._spaceTool,\n        lassoTool = this._lassoTool,\n        handTool = this._handTool,\n        globalConnect = this._globalConnect,\n        translate = this._translate;\n\n    function createAction(type, group, className, title, options) {\n\n      function createListener(event) {\n        var shape = elementFactory.createShape(assign$1({ type: type }, options));\n\n        if (options) {\n          var di = getDi(shape);\n          di.isExpanded = options.isExpanded;\n        }\n\n        create.start(event, shape);\n      }\n\n      var shortType = type.replace(/^bpmn:/, '');\n\n      return {\n        group: group,\n        className: className,\n        title: title || translate('Create {type}', { type: shortType }),\n        action: {\n          dragstart: createListener,\n          click: createListener\n        }\n      };\n    }\n\n    function createSubprocess(event) {\n      var subProcess = elementFactory.createShape({\n        type: 'bpmn:SubProcess',\n        x: 0,\n        y: 0,\n        isExpanded: true\n      });\n\n      var startEvent = elementFactory.createShape({\n        type: 'bpmn:StartEvent',\n        x: 40,\n        y: 82,\n        parent: subProcess\n      });\n\n      create.start(event, [ subProcess, startEvent ], {\n        hints: {\n          autoSelect: [ subProcess ]\n        }\n      });\n    }\n\n    function createParticipant(event) {\n      create.start(event, elementFactory.createParticipantShape());\n    }\n\n    assign$1(actions, {\n      'hand-tool': {\n        group: 'tools',\n        className: 'bpmn-icon-hand-tool',\n        title: translate('Activate the hand tool'),\n        action: {\n          click: function(event) {\n            handTool.activateHand(event);\n          }\n        }\n      },\n      'lasso-tool': {\n        group: 'tools',\n        className: 'bpmn-icon-lasso-tool',\n        title: translate('Activate the lasso tool'),\n        action: {\n          click: function(event) {\n            lassoTool.activateSelection(event);\n          }\n        }\n      },\n      'space-tool': {\n        group: 'tools',\n        className: 'bpmn-icon-space-tool',\n        title: translate('Activate the create/remove space tool'),\n        action: {\n          click: function(event) {\n            spaceTool.activateSelection(event);\n          }\n        }\n      },\n      'global-connect-tool': {\n        group: 'tools',\n        className: 'bpmn-icon-connection-multi',\n        title: translate('Activate the global connect tool'),\n        action: {\n          click: function(event) {\n            globalConnect.start(event);\n          }\n        }\n      },\n      'tool-separator': {\n        group: 'tools',\n        separator: true\n      },\n      'create.start-event': createAction(\n        'bpmn:StartEvent', 'event', 'bpmn-icon-start-event-none',\n        translate('Create StartEvent')\n      ),\n      'create.intermediate-event': createAction(\n        'bpmn:IntermediateThrowEvent', 'event', 'bpmn-icon-intermediate-event-none',\n        translate('Create Intermediate/Boundary Event')\n      ),\n      'create.end-event': createAction(\n        'bpmn:EndEvent', 'event', 'bpmn-icon-end-event-none',\n        translate('Create EndEvent')\n      ),\n      'create.exclusive-gateway': createAction(\n        'bpmn:ExclusiveGateway', 'gateway', 'bpmn-icon-gateway-none',\n        translate('Create Gateway')\n      ),\n      'create.task': createAction(\n        'bpmn:Task', 'activity', 'bpmn-icon-task',\n        translate('Create Task')\n      ),\n      'create.data-object': createAction(\n        'bpmn:DataObjectReference', 'data-object', 'bpmn-icon-data-object',\n        translate('Create DataObjectReference')\n      ),\n      'create.data-store': createAction(\n        'bpmn:DataStoreReference', 'data-store', 'bpmn-icon-data-store',\n        translate('Create DataStoreReference')\n      ),\n      'create.subprocess-expanded': {\n        group: 'activity',\n        className: 'bpmn-icon-subprocess-expanded',\n        title: translate('Create expanded SubProcess'),\n        action: {\n          dragstart: createSubprocess,\n          click: createSubprocess\n        }\n      },\n      'create.participant-expanded': {\n        group: 'collaboration',\n        className: 'bpmn-icon-participant',\n        title: translate('Create Pool/Participant'),\n        action: {\n          dragstart: createParticipant,\n          click: createParticipant\n        }\n      },\n      'create.group': createAction(\n        'bpmn:Group', 'artifact', 'bpmn-icon-group',\n        translate('Create Group')\n      ),\n    });\n\n    return actions;\n  };\n\n  var PaletteModule = {\n    __depends__: [\n      PaletteModule$1,\n      CreateModule,\n      SpaceToolModule,\n      LassoToolModule,\n      HandToolModule,\n      GlobalConnectModule,\n      translate\n    ],\n    __init__: [ 'paletteProvider' ],\n    paletteProvider: [ 'type', PaletteProvider ]\n  };\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('diagram-js/lib/core/ElementFactory').default} ElementFactory\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/features/preview-support/PreviewSupport').default} PreviewSupport\n   */\n\n  var LOW_PRIORITY = 250;\n\n  /**\n   * @param {EventBus} eventBus\n   * @param {ElementRegistry} elementRegistry\n   * @param {ElementFactory} elementFactory\n   * @param {Canvas} canvas\n   * @param {PreviewSupport} previewSupport\n   */\n  function BpmnReplacePreview(\n      eventBus, elementRegistry, elementFactory,\n      canvas, previewSupport) {\n\n    CommandInterceptor.call(this, eventBus);\n\n    /**\n     * Replace the visuals of all elements in the context which can be replaced\n     *\n     * @param  {Object} context\n     */\n    function replaceVisual(context) {\n\n      var replacements = context.canExecute.replacements;\n\n      forEach$1(replacements, function(replacement) {\n\n        var id = replacement.oldElementId;\n\n        var newElement = {\n          type: replacement.newElementType\n        };\n\n        // if the visual of the element is already replaced\n        if (context.visualReplacements[id]) {\n          return;\n        }\n\n        var element = elementRegistry.get(id);\n\n        assign$1(newElement, { x: element.x, y: element.y });\n\n        // create a temporary shape\n        var tempShape = elementFactory.createShape(newElement);\n\n        canvas.addShape(tempShape, element.parent);\n\n        // select the original SVG element related to the element and hide it\n        var gfx = query('[data-element-id=\"' + escapeCSS(element.id) + '\"]', context.dragGroup);\n\n        if (gfx) {\n          attr(gfx, { display: 'none' });\n        }\n\n        // clone the gfx of the temporary shape and add it to the drag group\n        var dragger = previewSupport.addDragger(tempShape, context.dragGroup);\n\n        context.visualReplacements[id] = dragger;\n\n        canvas.removeShape(tempShape);\n      });\n    }\n\n    /**\n     * Restore the original visuals of the previously replaced elements\n     *\n     * @param  {Object} context\n     */\n    function restoreVisual(context) {\n\n      var visualReplacements = context.visualReplacements;\n\n      forEach$1(visualReplacements, function(dragger, id) {\n\n        var originalGfx = query('[data-element-id=\"' + escapeCSS(id) + '\"]', context.dragGroup);\n\n        if (originalGfx) {\n          attr(originalGfx, { display: 'inline' });\n        }\n\n        dragger.remove();\n\n        if (visualReplacements[id]) {\n          delete visualReplacements[id];\n        }\n      });\n    }\n\n    eventBus.on('shape.move.move', LOW_PRIORITY, function(event) {\n\n      var context = event.context,\n          canExecute = context.canExecute;\n\n      if (!context.visualReplacements) {\n        context.visualReplacements = {};\n      }\n\n      if (canExecute && canExecute.replacements) {\n        replaceVisual(context);\n      } else {\n        restoreVisual(context);\n      }\n    });\n  }\n\n  BpmnReplacePreview.$inject = [\n    'eventBus',\n    'elementRegistry',\n    'elementFactory',\n    'canvas',\n    'previewSupport'\n  ];\n\n  e$3(BpmnReplacePreview, CommandInterceptor);\n\n  var ReplacePreviewModule = {\n    __depends__: [\n      PreviewSupportModule\n    ],\n    __init__: [ 'bpmnReplacePreview' ],\n    bpmnReplacePreview: [ 'type', BpmnReplacePreview ]\n  };\n\n  /**\r\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\r\n   *\r\n   * @typedef {import('diagram-js/lib/core/EventBus').Event} Event\r\n   *\r\n   * @typedef {import('../../model/Types').Shape} Shape\r\n   *\r\n   * @typedef {import('diagram-js/lib/util/Types').Axis} Axis\r\n   * @typedef {import('diagram-js/lib/util/Types').Point} Point\r\n   */\r\n\r\n  var HIGHER_PRIORITY$2 = 1250;\r\n\r\n  var BOUNDARY_TO_HOST_THRESHOLD = 40;\r\n\r\n  var TARGET_BOUNDS_PADDING = 20,\r\n      TASK_BOUNDS_PADDING = 10;\r\n\r\n  var TARGET_CENTER_PADDING = 20;\r\n\r\n  var AXES = [ 'x', 'y' ];\r\n\r\n  var abs = Math.abs;\r\n\r\n  /**\r\n   * Snap during connect.\r\n   *\r\n   * @param {EventBus} eventBus\r\n   */\r\n  function BpmnConnectSnapping(eventBus) {\r\n    eventBus.on([\r\n      'connect.hover',\r\n      'connect.move',\r\n      'connect.end',\r\n    ], HIGHER_PRIORITY$2, function(event) {\r\n      var context = event.context,\r\n          canExecute = context.canExecute,\r\n          start = context.start,\r\n          hover = context.hover,\r\n          source = context.source,\r\n          target = context.target;\r\n\r\n      // do NOT snap on CMD\r\n      if (event.originalEvent && isCmd(event.originalEvent)) {\r\n        return;\r\n      }\r\n\r\n      if (!context.initialConnectionStart) {\r\n        context.initialConnectionStart = context.connectionStart;\r\n      }\r\n\r\n      // snap hover\r\n      if (canExecute && hover) {\r\n        snapToShape(event, hover, getTargetBoundsPadding(hover));\r\n      }\r\n\r\n      if (hover && isAnyType(canExecute, [\r\n        'bpmn:Association',\r\n        'bpmn:DataInputAssociation',\r\n        'bpmn:DataOutputAssociation',\r\n        'bpmn:SequenceFlow'\r\n      ])) {\r\n        context.connectionStart = mid$2(start);\r\n\r\n        // snap hover\r\n        if (isAny(hover, [ 'bpmn:Event', 'bpmn:Gateway' ])) {\r\n          snapToPosition(event, mid$2(hover));\r\n        }\r\n\r\n        // snap hover\r\n        if (isAny(hover, [ 'bpmn:Task', 'bpmn:SubProcess' ])) {\r\n          snapToTargetMid(event, hover);\r\n        }\r\n\r\n        // snap source and target\r\n        if (is$1(source, 'bpmn:BoundaryEvent') && target === source.host) {\r\n          snapBoundaryEventLoop(event);\r\n        }\r\n\r\n      } else if (isType(canExecute, 'bpmn:MessageFlow')) {\r\n\r\n        if (is$1(start, 'bpmn:Event')) {\r\n\r\n          // snap start\r\n          context.connectionStart = mid$2(start);\r\n        }\r\n\r\n        if (is$1(hover, 'bpmn:Event')) {\r\n\r\n          // snap hover\r\n          snapToPosition(event, mid$2(hover));\r\n        }\r\n\r\n      } else {\r\n\r\n        // un-snap source\r\n        context.connectionStart = context.initialConnectionStart;\r\n      }\r\n    });\r\n  }\r\n\r\n  BpmnConnectSnapping.$inject = [ 'eventBus' ];\r\n\r\n\r\n  // helpers //////////\r\n\r\n  /**\r\n   * Snap to the given target if the event is inside the bounds of the target.\r\n   *\r\n   * @param {Event} event\r\n   * @param {Shape} target\r\n   * @param {number} padding\r\n   */\r\n  function snapToShape(event, target, padding) {\r\n    AXES.forEach(function(axis) {\r\n      var dimensionForAxis = getDimensionForAxis(axis, target);\r\n\r\n      if (event[ axis ] < target[ axis ] + padding) {\r\n        setSnapped(event, axis, target[ axis ] + padding);\r\n      } else if (event[ axis ] > target[ axis ] + dimensionForAxis - padding) {\r\n        setSnapped(event, axis, target[ axis ] + dimensionForAxis - padding);\r\n      }\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Snap to the target mid if the event is in the target mid.\r\n   *\r\n   * @param {Event} event\r\n   * @param {Shape} target\r\n   */\r\n  function snapToTargetMid(event, target) {\r\n    var targetMid = mid$2(target);\r\n\r\n    AXES.forEach(function(axis) {\r\n      if (isMid(event, target, axis)) {\r\n        setSnapped(event, axis, targetMid[ axis ]);\r\n      }\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Snap to prevent a loop overlapping a boundary event.\r\n   *\r\n   * @param {Event} event\r\n   */\r\n  function snapBoundaryEventLoop(event) {\r\n    var context = event.context,\r\n        source = context.source,\r\n        target = context.target;\r\n\r\n    if (isReverse(context)) {\r\n      return;\r\n    }\r\n\r\n    var sourceMid = mid$2(source),\r\n        orientation = getOrientation(sourceMid, target, -10),\r\n        axes = [];\r\n\r\n    if (/top|bottom/.test(orientation)) {\r\n      axes.push('x');\r\n    }\r\n\r\n    if (/left|right/.test(orientation)) {\r\n      axes.push('y');\r\n    }\r\n\r\n    axes.forEach(function(axis) {\r\n      var coordinate = event[ axis ], newCoordinate;\r\n\r\n      if (abs(coordinate - sourceMid[ axis ]) < BOUNDARY_TO_HOST_THRESHOLD) {\r\n        if (coordinate > sourceMid[ axis ]) {\r\n          newCoordinate = sourceMid[ axis ] + BOUNDARY_TO_HOST_THRESHOLD;\r\n        }\r\n        else {\r\n          newCoordinate = sourceMid[ axis ] - BOUNDARY_TO_HOST_THRESHOLD;\r\n        }\r\n\r\n        setSnapped(event, axis, newCoordinate);\r\n      }\r\n    });\r\n  }\r\n\r\n  /**\r\n   * @param {Event} event\r\n   * @param {Point} position\r\n   */\r\n  function snapToPosition(event, position) {\r\n    setSnapped(event, 'x', position.x);\r\n    setSnapped(event, 'y', position.y);\r\n  }\r\n\r\n  function isType(attrs, type) {\r\n    return attrs && attrs.type === type;\r\n  }\r\n\r\n  function isAnyType(attrs, types) {\r\n    return some(types, function(type) {\r\n      return isType(attrs, type);\r\n    });\r\n  }\r\n\r\n  /**\r\n   * @param {Axis} axis\r\n   * @param {Shape} element\r\n   *\r\n   * @return {number}\r\n   */\r\n  function getDimensionForAxis(axis, element) {\r\n    return axis === 'x' ? element.width : element.height;\r\n  }\r\n\r\n  /**\r\n   * @param {Shape} target\r\n   *\r\n   * @return {number}\r\n   */\r\n  function getTargetBoundsPadding(target) {\r\n    if (is$1(target, 'bpmn:Task')) {\r\n      return TASK_BOUNDS_PADDING;\r\n    } else {\r\n      return TARGET_BOUNDS_PADDING;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @param {Event} event\r\n   * @param {Shape} target\r\n   * @param {Axis} axis\r\n   *\r\n   * @return {boolean}\r\n   */\r\n  function isMid(event, target, axis) {\r\n    return event[ axis ] > target[ axis ] + TARGET_CENTER_PADDING\r\n      && event[ axis ] < target[ axis ] + getDimensionForAxis(axis, target) - TARGET_CENTER_PADDING;\r\n  }\r\n\r\n  function isReverse(context) {\r\n    var hover = context.hover,\r\n        source = context.source;\r\n\r\n    return hover && source && hover === source;\r\n  }\n\n  /**\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef {import('../../util/Types').Axis} Axis\n   * @typedef {import('../../util/Types').DirectionTRBL} DirectionTRBL\n   * @typedef {import('../../util/Types').Point} Point\n   *\n   * @typedef {DirectionTRBL & 'mid'} SnapLocation\n   */\n\n  /**\n   * A snap context, containing the (possibly incomplete)\n   * mappings of drop targets (to identify the snapping)\n   * to computed snap points.\n   */\n  function SnapContext() {\n\n    /**\n     * @type {Record<string, SnapPoints>}\n     */\n    this._targets = {};\n\n    /**\n     * @type {Record<SnapLocation, Point>}\n     */\n    this._snapOrigins = {};\n\n    /**\n     * @type {SnapLocation[]}\n     */\n    this._snapLocations = [];\n\n    /**\n     * @type {Record<SnapLocation, Point[]>}\n     */\n    this._defaultSnaps = {};\n  }\n\n  /**\n   * Get the snap origin for a given location.\n   *\n   * @param {SnapLocation} snapLocation\n   *\n   * @return {Point}\n   */\n  SnapContext.prototype.getSnapOrigin = function(snapLocation) {\n    return this._snapOrigins[snapLocation];\n  };\n\n  /**\n   * Set the snap origin for a given location.\n   *\n   * @param {SnapLocation} snapLocation\n   * @param {Point} snapOrigin\n   */\n  SnapContext.prototype.setSnapOrigin = function(snapLocation, snapOrigin) {\n    this._snapOrigins[snapLocation] = snapOrigin;\n\n    if (this._snapLocations.indexOf(snapLocation) === -1) {\n      this._snapLocations.push(snapLocation);\n    }\n  };\n\n  /**\n   * Add a default snap point.\n   *\n   * @param {SnapLocation} snapLocation\n   * @param {Point} point\n   */\n  SnapContext.prototype.addDefaultSnap = function(snapLocation, point) {\n\n    var snapValues = this._defaultSnaps[snapLocation];\n\n    if (!snapValues) {\n      snapValues = this._defaultSnaps[snapLocation] = [];\n    }\n\n    snapValues.push(point);\n  };\n\n  /**\n   * Get the snap locations for this context.\n   *\n   * @return {SnapLocation[]}\n   */\n  SnapContext.prototype.getSnapLocations = function() {\n    return this._snapLocations;\n  };\n\n  /**\n   * Set the snap locations for this context.\n   *\n   * The order of locations determines precedence.\n   *\n   * @param {SnapLocation[]} snapLocations\n   */\n  SnapContext.prototype.setSnapLocations = function(snapLocations) {\n    this._snapLocations = snapLocations;\n  };\n\n  /**\n   * Get snap points for the given target.\n   *\n   * @param {Element|string} target\n   *\n   * @return {SnapPoints}\n   */\n  SnapContext.prototype.pointsForTarget = function(target) {\n\n    var targetId = target.id || target;\n\n    var snapPoints = this._targets[targetId];\n\n    if (!snapPoints) {\n      snapPoints = this._targets[targetId] = new SnapPoints();\n      snapPoints.initDefaults(this._defaultSnaps);\n    }\n\n    return snapPoints;\n  };\n\n\n  /**\n   * Add points to snap to.\n   */\n  function SnapPoints() {\n\n    /**\n     * Example:\n     *\n     * ```javascript\n     * {\n     *   'top-right': {\n     *     x: [ 100, 200, 300 ]\n     *     y: [ 100, 200, 300 ]\n     *   }\n     * }\n     * ```\n     *\n     * @type {Record<string, Record<Axis, number[]>>}\n     */\n    this._snapValues = {};\n  }\n\n  /**\n   * Add a snap point.\n   *\n   * @param {SnapLocation} snapLocation\n   * @param {Point} point\n   */\n  SnapPoints.prototype.add = function(snapLocation, point) {\n\n    var snapValues = this._snapValues[snapLocation];\n\n    if (!snapValues) {\n      snapValues = this._snapValues[snapLocation] = { x: [], y: [] };\n    }\n\n    if (snapValues.x.indexOf(point.x) === -1) {\n      snapValues.x.push(point.x);\n    }\n\n    if (snapValues.y.indexOf(point.y) === -1) {\n      snapValues.y.push(point.y);\n    }\n  };\n\n  /**\n   * Snap a point's x or y value.\n   *\n   * @param {Point} point\n   * @param {SnapLocation} snapLocation\n   * @param {Axis} axis\n   * @param {number} tolerance\n   *\n   * @return {number}\n   */\n  SnapPoints.prototype.snap = function(point, snapLocation, axis, tolerance) {\n    var snappingValues = this._snapValues[snapLocation];\n\n    return snappingValues && snapTo(point[axis], snappingValues[axis], tolerance);\n  };\n\n  /**\n   * Initialize default snap points.\n   *\n   * @param {Record<SnapLocation, Point[]>} defaultSnaps\n   */\n  SnapPoints.prototype.initDefaults = function(defaultSnaps) {\n\n    var self = this;\n\n    forEach$1(defaultSnaps || {}, function(snapPoints, snapLocation) {\n      forEach$1(snapPoints, function(point) {\n        self.add(snapLocation, point);\n      });\n    });\n  };\n\n  /**\r\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\r\n   * @typedef {import('../../core/EventBus').default} EventBus\r\n   * @typedef {import('./Snapping').default} Snapping\r\n   */\r\n\r\n  var HIGHER_PRIORITY$1 = 1250;\r\n\r\n\r\n  /**\r\n   * Snap during create and move.\r\n   *\r\n   * @param {ElementRegistry} elementRegistry\r\n   * @param {EventBus} eventBus\r\n   * @param {Snapping} snapping\r\n   */\r\n  function CreateMoveSnapping(elementRegistry, eventBus, snapping) {\r\n    var self = this;\r\n\r\n    this._elementRegistry = elementRegistry;\r\n\r\n    eventBus.on([\r\n      'create.start',\r\n      'shape.move.start'\r\n    ], function(event) {\r\n      self.initSnap(event);\r\n    });\r\n\r\n    eventBus.on([\r\n      'create.move',\r\n      'create.end',\r\n      'shape.move.move',\r\n      'shape.move.end'\r\n    ], HIGHER_PRIORITY$1, function(event) {\r\n      var context = event.context,\r\n          shape = context.shape,\r\n          snapContext = context.snapContext,\r\n          target = context.target;\r\n\r\n      if (event.originalEvent && isCmd(event.originalEvent)) {\r\n        return;\r\n      }\r\n\r\n      if (isSnapped(event) || !target) {\r\n        return;\r\n      }\r\n\r\n      var snapPoints = snapContext.pointsForTarget(target);\r\n\r\n      if (!snapPoints.initialized) {\r\n        snapPoints = self.addSnapTargetPoints(snapPoints, shape, target);\r\n\r\n        snapPoints.initialized = true;\r\n      }\r\n\r\n      snapping.snap(event, snapPoints);\r\n    });\r\n\r\n    eventBus.on([\r\n      'create.cleanup',\r\n      'shape.move.cleanup'\r\n    ], function() {\r\n      snapping.hide();\r\n    });\r\n  }\r\n\r\n  CreateMoveSnapping.$inject = [\r\n    'elementRegistry',\r\n    'eventBus',\r\n    'snapping'\r\n  ];\r\n\r\n  CreateMoveSnapping.prototype.initSnap = function(event) {\r\n    var elementRegistry = this._elementRegistry;\r\n\r\n    var context = event.context,\r\n        shape = context.shape,\r\n        snapContext = context.snapContext;\r\n\r\n    if (!snapContext) {\r\n      snapContext = context.snapContext = new SnapContext();\r\n    }\r\n\r\n    var shapeMid;\r\n\r\n    if (elementRegistry.get(shape.id)) {\r\n\r\n      // move\r\n      shapeMid = mid$2(shape, event);\r\n    } else {\r\n\r\n      // create\r\n      shapeMid = {\r\n        x: event.x + mid$2(shape).x,\r\n        y: event.y + mid$2(shape).y\r\n      };\r\n    }\r\n\r\n    var shapeTopLeft = {\r\n          x: shapeMid.x - shape.width / 2,\r\n          y: shapeMid.y - shape.height / 2\r\n        },\r\n        shapeBottomRight = {\r\n          x: shapeMid.x + shape.width / 2,\r\n          y: shapeMid.y + shape.height / 2\r\n        };\r\n\r\n    snapContext.setSnapOrigin('mid', {\r\n      x: shapeMid.x - event.x,\r\n      y: shapeMid.y - event.y\r\n    });\r\n\r\n    // snap labels to mid only\r\n    if (isLabel(shape)) {\r\n      return snapContext;\r\n    }\r\n\r\n    snapContext.setSnapOrigin('top-left', {\r\n      x: shapeTopLeft.x - event.x,\r\n      y: shapeTopLeft.y - event.y\r\n    });\r\n\r\n    snapContext.setSnapOrigin('bottom-right', {\r\n      x: shapeBottomRight.x - event.x,\r\n      y: shapeBottomRight.y - event.y\r\n    });\r\n\r\n    return snapContext;\r\n  };\r\n\r\n  CreateMoveSnapping.prototype.addSnapTargetPoints = function(snapPoints, shape, target) {\r\n    var snapTargets = this.getSnapTargets(shape, target);\r\n\r\n    forEach$1(snapTargets, function(snapTarget) {\r\n\r\n      // handle labels\r\n      if (isLabel(snapTarget)) {\r\n\r\n        if (isLabel(shape)) {\r\n          snapPoints.add('mid', mid$2(snapTarget));\r\n        }\r\n\r\n        return;\r\n      }\r\n\r\n      // handle connections\r\n      if (isConnection(snapTarget)) {\r\n\r\n        // ignore single segment connections\r\n        if (snapTarget.waypoints.length < 3) {\r\n          return;\r\n        }\r\n\r\n        // ignore first and last waypoint\r\n        var waypoints = snapTarget.waypoints.slice(1, -1);\r\n\r\n        forEach$1(waypoints, function(waypoint) {\r\n          snapPoints.add('mid', waypoint);\r\n        });\r\n\r\n        return;\r\n      }\r\n\r\n      // handle shapes\r\n      snapPoints.add('mid', mid$2(snapTarget));\r\n    });\r\n\r\n    if (!isNumber(shape.x) || !isNumber(shape.y)) {\r\n      return snapPoints;\r\n    }\r\n\r\n    // snap to original position when moving\r\n    if (this._elementRegistry.get(shape.id)) {\r\n      snapPoints.add('mid', mid$2(shape));\r\n    }\r\n\r\n    return snapPoints;\r\n  };\r\n\r\n  CreateMoveSnapping.prototype.getSnapTargets = function(shape, target) {\r\n    return getChildren(target).filter(function(child) {\r\n      return !isHidden$1(child);\r\n    });\r\n  };\r\n\r\n  // helpers //////////\r\n\r\n  function isHidden$1(element) {\r\n    return !!element.hidden;\r\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('didi').Injector} Injector\n   *\n   * @typedef {import('diagram-js/lib/features/snapping/SnapContext').default} SnapContext\n   * @typedef {import('diagram-js/lib/features/snapping/SnapContext').SnapPoints} SnapPoints\n   *\n   * @typedef {import('diagram-js/lib/core/EventBus').Event} Event\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Shape} Shape\n   */\n\n  var HIGH_PRIORITY = 1500;\n\n\n  /**\n   * Snap during create and move.\n   *\n   * @param {EventBus} eventBus\n   * @param {Injector} injector\n   */\n  function BpmnCreateMoveSnapping(eventBus, injector) {\n    injector.invoke(CreateMoveSnapping, this);\n\n    // creating first participant\n    eventBus.on([ 'create.move', 'create.end' ], HIGH_PRIORITY, setSnappedIfConstrained);\n\n    // snap boundary events\n    eventBus.on([\n      'create.move',\n      'create.end',\n      'shape.move.move',\n      'shape.move.end'\n    ], HIGH_PRIORITY, function(event) {\n      var context = event.context,\n          canExecute = context.canExecute,\n          target = context.target;\n\n      var canAttach = canExecute && (canExecute === 'attach' || canExecute.attach);\n\n      if (canAttach && !isSnapped(event)) {\n        snapBoundaryEvent(event, target);\n      }\n    });\n  }\n\n  e$3(BpmnCreateMoveSnapping, CreateMoveSnapping);\n\n  BpmnCreateMoveSnapping.$inject = [\n    'eventBus',\n    'injector'\n  ];\n\n  /**\n   * @param {Event} event\n   *\n   * @return {SnapContext}\n   */\n  BpmnCreateMoveSnapping.prototype.initSnap = function(event) {\n    var snapContext = CreateMoveSnapping.prototype.initSnap.call(this, event);\n\n    var shape = event.shape;\n\n    var isMove = !!this._elementRegistry.get(shape.id);\n\n    // snap to docking points\n    forEach$1(shape.outgoing, function(connection) {\n      var docking = connection.waypoints[0];\n\n      docking = docking.original || docking;\n\n      snapContext.setSnapOrigin(connection.id + '-docking', getDockingSnapOrigin(docking, isMove, event));\n    });\n\n    forEach$1(shape.incoming, function(connection) {\n      var docking = connection.waypoints[connection.waypoints.length - 1];\n\n      docking = docking.original || docking;\n\n      snapContext.setSnapOrigin(connection.id + '-docking', getDockingSnapOrigin(docking, isMove, event));\n    });\n\n    if (is$1(shape, 'bpmn:Participant')) {\n\n      // snap to borders with higher priority\n      snapContext.setSnapLocations([ 'top-left', 'bottom-right', 'mid' ]);\n    }\n\n    return snapContext;\n  };\n\n  /**\n   * @param {SnapPoints} snapPoints\n   * @param {Shape} shape\n   * @param {Shape} target\n   *\n   * @return {SnapPoints}\n   */\n  BpmnCreateMoveSnapping.prototype.addSnapTargetPoints = function(snapPoints, shape, target) {\n    CreateMoveSnapping.prototype.addSnapTargetPoints.call(this, snapPoints, shape, target);\n\n    var snapTargets = this.getSnapTargets(shape, target);\n\n    forEach$1(snapTargets, function(snapTarget) {\n\n      // handle TRBL alignment\n      //\n      // * with container elements\n      // * with text annotations\n      if (isContainer(snapTarget) || areAll([ shape, snapTarget ], 'bpmn:TextAnnotation')) {\n        snapPoints.add('top-left', topLeft(snapTarget));\n        snapPoints.add('bottom-right', bottomRight(snapTarget));\n      }\n    });\n\n    var elementRegistry = this._elementRegistry;\n\n    // snap to docking points if not create mode\n    forEach$1(shape.incoming, function(connection) {\n      if (elementRegistry.get(shape.id)) {\n\n        if (!includes(snapTargets, connection.source)) {\n          snapPoints.add('mid', getMid(connection.source));\n        }\n\n        var docking = connection.waypoints[0];\n        snapPoints.add(connection.id + '-docking', docking.original || docking);\n      }\n    });\n\n    forEach$1(shape.outgoing, function(connection) {\n      if (elementRegistry.get(shape.id)) {\n\n        if (!includes(snapTargets, connection.target)) {\n          snapPoints.add('mid', getMid(connection.target));\n        }\n\n        var docking = connection.waypoints[ connection.waypoints.length - 1 ];\n\n        snapPoints.add(connection.id + '-docking', docking.original || docking);\n      }\n    });\n\n    // add sequence flow parents as snap targets\n    if (is$1(target, 'bpmn:SequenceFlow')) {\n      snapPoints = this.addSnapTargetPoints(snapPoints, shape, target.parent);\n    }\n\n    return snapPoints;\n  };\n\n  /**\n   * @param {Shape} shape\n   * @param {Shape} target\n   *\n   * @return {Shape[]}\n   */\n  BpmnCreateMoveSnapping.prototype.getSnapTargets = function(shape, target) {\n    return CreateMoveSnapping.prototype.getSnapTargets.call(this, shape, target)\n      .filter(function(snapTarget) {\n\n        // do not snap to lanes\n        return !is$1(snapTarget, 'bpmn:Lane');\n      });\n  };\n\n  // helpers //////////\n\n  /**\n   * @param {Shape} event\n   * @param {Shape} target\n   */\n  function snapBoundaryEvent(event, target) {\n    var targetTRBL = asTRBL(target);\n\n    var direction = getBoundaryAttachment(event, target);\n\n    var context = event.context,\n        shape = context.shape;\n\n    var offset;\n\n    if (shape.parent) {\n      offset = { x: 0, y: 0 };\n    } else {\n      offset = getMid(shape);\n    }\n\n    if (/top/.test(direction)) {\n      setSnapped(event, 'y', targetTRBL.top - offset.y);\n    } else if (/bottom/.test(direction)) {\n      setSnapped(event, 'y', targetTRBL.bottom - offset.y);\n    }\n\n    if (/left/.test(direction)) {\n      setSnapped(event, 'x', targetTRBL.left - offset.x);\n    } else if (/right/.test(direction)) {\n      setSnapped(event, 'x', targetTRBL.right - offset.x);\n    }\n  }\n\n  /**\n   * @param {Element[]} elements\n   * @param {string} type\n   *\n   * @return {boolean}\n   */\n  function areAll(elements, type) {\n    return elements.every(function(el) {\n      return is$1(el, type);\n    });\n  }\n\n  /**\n   * @param {Element} element\n   */\n  function isContainer(element) {\n    if (is$1(element, 'bpmn:SubProcess') && isExpanded(element)) {\n      return true;\n    }\n\n    return is$1(element, 'bpmn:Participant');\n  }\n\n  /**\n   * @param {Event} event\n   */\n  function setSnappedIfConstrained(event) {\n    var context = event.context,\n        createConstraints = context.createConstraints;\n\n    if (!createConstraints) {\n      return;\n    }\n\n    var top = createConstraints.top,\n        right = createConstraints.right,\n        bottom = createConstraints.bottom,\n        left = createConstraints.left;\n\n    if ((left && left >= event.x) || (right && right <= event.x)) {\n      setSnapped(event, 'x', event.x);\n    }\n\n    if ((top && top >= event.y) || (bottom && bottom <= event.y)) {\n      setSnapped(event, 'y', event.y);\n    }\n  }\n\n  function includes(array, value) {\n    return array.indexOf(value) !== -1;\n  }\n\n  function getDockingSnapOrigin(docking, isMove, event) {\n    return isMove ? (\n      {\n        x: docking.x - event.x,\n        y: docking.y - event.y\n      }\n    ) : {\n      x: docking.x,\n      y: docking.y\n    };\n  }\n\n  /**\r\n   * @typedef {import('../../core/EventBus').default} EventBus\r\n   * @typedef {import('./Snapping').default} Snapping\r\n   */\r\n\r\n  var HIGHER_PRIORITY = 1250;\r\n\r\n\r\n  /**\r\n   * Snap during resize.\r\n   *\r\n   * @param {EventBus} eventBus\r\n   * @param {Snapping} snapping\r\n   */\r\n  function ResizeSnapping(eventBus, snapping) {\r\n    var self = this;\r\n\r\n    eventBus.on([ 'resize.start' ], function(event) {\r\n      self.initSnap(event);\r\n    });\r\n\r\n    eventBus.on([\r\n      'resize.move',\r\n      'resize.end',\r\n    ], HIGHER_PRIORITY, function(event) {\r\n      var context = event.context,\r\n          shape = context.shape,\r\n          parent = shape.parent,\r\n          direction = context.direction,\r\n          snapContext = context.snapContext;\r\n\r\n      if (event.originalEvent && isCmd(event.originalEvent)) {\r\n        return;\r\n      }\r\n\r\n      if (isSnapped(event)) {\r\n        return;\r\n      }\r\n\r\n      var snapPoints = snapContext.pointsForTarget(parent);\r\n\r\n      if (!snapPoints.initialized) {\r\n        snapPoints = self.addSnapTargetPoints(snapPoints, shape, parent, direction);\r\n\r\n        snapPoints.initialized = true;\r\n      }\r\n\r\n      if (isHorizontal(direction)) {\r\n        setSnapped(event, 'x', event.x);\r\n      }\r\n\r\n      if (isVertical(direction)) {\r\n        setSnapped(event, 'y', event.y);\r\n      }\r\n\r\n      snapping.snap(event, snapPoints);\r\n    });\r\n\r\n    eventBus.on([ 'resize.cleanup' ], function() {\r\n      snapping.hide();\r\n    });\r\n  }\r\n\r\n  ResizeSnapping.prototype.initSnap = function(event) {\r\n    var context = event.context,\r\n        shape = context.shape,\r\n        direction = context.direction,\r\n        snapContext = context.snapContext;\r\n\r\n    if (!snapContext) {\r\n      snapContext = context.snapContext = new SnapContext();\r\n    }\r\n\r\n    var snapOrigin = getSnapOrigin(shape, direction);\r\n\r\n    snapContext.setSnapOrigin('corner', {\r\n      x: snapOrigin.x - event.x,\r\n      y: snapOrigin.y - event.y\r\n    });\r\n\r\n    return snapContext;\r\n  };\r\n\r\n  ResizeSnapping.prototype.addSnapTargetPoints = function(snapPoints, shape, target, direction) {\r\n    var snapTargets = this.getSnapTargets(shape, target);\r\n\r\n    forEach$1(snapTargets, function(snapTarget) {\r\n      snapPoints.add('corner', bottomRight(snapTarget));\r\n      snapPoints.add('corner', topLeft(snapTarget));\r\n    });\r\n\r\n    snapPoints.add('corner', getSnapOrigin(shape, direction));\r\n\r\n    return snapPoints;\r\n  };\r\n\r\n  ResizeSnapping.$inject = [\r\n    'eventBus',\r\n    'snapping'\r\n  ];\r\n\r\n  ResizeSnapping.prototype.getSnapTargets = function(shape, target) {\r\n    return getChildren(target).filter(function(child) {\r\n      return !isAttached(child, shape)\r\n        && !isConnection(child)\r\n        && !isHidden(child)\r\n        && !isLabel(child);\r\n    });\r\n  };\r\n\r\n  // helpers //////////\r\n\r\n  function getSnapOrigin(shape, direction) {\r\n    var mid = getMid(shape),\r\n        trbl = asTRBL(shape);\r\n\r\n    var snapOrigin = {\r\n      x: mid.x,\r\n      y: mid.y\r\n    };\r\n\r\n    if (direction.indexOf('n') !== -1) {\r\n      snapOrigin.y = trbl.top;\r\n    } else if (direction.indexOf('s') !== -1) {\r\n      snapOrigin.y = trbl.bottom;\r\n    }\r\n\r\n    if (direction.indexOf('e') !== -1) {\r\n      snapOrigin.x = trbl.right;\r\n    } else if (direction.indexOf('w') !== -1) {\r\n      snapOrigin.x = trbl.left;\r\n    }\r\n\r\n    return snapOrigin;\r\n  }\r\n\r\n  function isAttached(element, host) {\r\n    return element.host === host;\r\n  }\r\n\r\n  function isHidden(element) {\r\n    return !!element.hidden;\r\n  }\r\n\r\n  function isHorizontal(direction) {\r\n    return direction === 'n' || direction === 's';\r\n  }\r\n\r\n  function isVertical(direction) {\r\n    return direction === 'e' || direction === 'w';\r\n  }\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   *\n   * @typedef {import('../../core/EventBus').Event} Event\n   *\n   * @typedef {import('./SnapContext').SnapPoints} SnapPoints\n   */\n\n  var SNAP_TOLERANCE = 7;\n\n  var SNAP_LINE_HIDE_DELAY = 1000;\n\n\n  /**\n   * Generic snapping feature.\n   *\n   * @param {Canvas} canvas\n   */\n  function Snapping(canvas) {\n    this._canvas = canvas;\n\n    // delay hide by 1000 seconds since last snap\n    this._asyncHide = debounce(bind$2(this.hide, this), SNAP_LINE_HIDE_DELAY);\n  }\n\n  Snapping.$inject = [ 'canvas' ];\n\n  /**\n   * Snap an event to given snap points.\n   *\n   * @param {Event} event\n   * @param {SnapPoints} snapPoints\n   */\n  Snapping.prototype.snap = function(event, snapPoints) {\n    var context = event.context,\n        snapContext = context.snapContext,\n        snapLocations = snapContext.getSnapLocations();\n\n    var snapping = {\n      x: isSnapped(event, 'x'),\n      y: isSnapped(event, 'y')\n    };\n\n    forEach$1(snapLocations, function(location) {\n      var snapOrigin = snapContext.getSnapOrigin(location);\n\n      var snapCurrent = {\n        x: event.x + snapOrigin.x,\n        y: event.y + snapOrigin.y\n      };\n\n      // snap both axis if not snapped already\n      forEach$1([ 'x', 'y' ], function(axis) {\n        var locationSnapping;\n\n        if (!snapping[axis]) {\n          locationSnapping = snapPoints.snap(snapCurrent, location, axis, SNAP_TOLERANCE);\n\n          if (locationSnapping !== undefined) {\n            snapping[axis] = {\n              value: locationSnapping,\n              originValue: locationSnapping - snapOrigin[axis]\n            };\n          }\n        }\n      });\n\n      // no need to continue snapping\n      if (snapping.x && snapping.y) {\n        return false;\n      }\n    });\n\n    // show snap lines\n    this.showSnapLine('vertical', snapping.x && snapping.x.value);\n    this.showSnapLine('horizontal', snapping.y && snapping.y.value);\n\n    // snap event\n    forEach$1([ 'x', 'y' ], function(axis) {\n      var axisSnapping = snapping[axis];\n\n      if (isObject(axisSnapping)) {\n        setSnapped(event, axis, axisSnapping.originValue);\n      }\n    });\n  };\n\n  Snapping.prototype._createLine = function(orientation) {\n    var root = this._canvas.getLayer('snap');\n\n    var line = create$1('path');\n\n    attr(line, { d: 'M0,0 L0,0' });\n\n    classes(line).add('djs-snap-line');\n\n    append(root, line);\n\n    return {\n      update: function(position) {\n\n        if (!isNumber(position)) {\n          attr(line, { display: 'none' });\n        } else {\n          if (orientation === 'horizontal') {\n            attr(line, {\n              d: 'M-100000,' + position + ' L+100000,' + position,\n              display: ''\n            });\n          } else {\n            attr(line, {\n              d: 'M ' + position + ',-100000 L ' + position + ', +100000',\n              display: ''\n            });\n          }\n        }\n      }\n    };\n  };\n\n  Snapping.prototype._createSnapLines = function() {\n    this._snapLines = {\n      horizontal: this._createLine('horizontal'),\n      vertical: this._createLine('vertical')\n    };\n  };\n\n  Snapping.prototype.showSnapLine = function(orientation, position) {\n\n    var line = this.getSnapLine(orientation);\n\n    if (line) {\n      line.update(position);\n    }\n\n    this._asyncHide();\n  };\n\n  Snapping.prototype.getSnapLine = function(orientation) {\n    if (!this._snapLines) {\n      this._createSnapLines();\n    }\n\n    return this._snapLines[orientation];\n  };\n\n  Snapping.prototype.hide = function() {\n    forEach$1(this._snapLines, function(snapLine) {\n      snapLine.update();\n    });\n  };\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var SnappingModule$1 = {\n    __init__: [\n      'createMoveSnapping',\n      'resizeSnapping',\n      'snapping'\n    ],\n    createMoveSnapping: [ 'type', CreateMoveSnapping ],\n    resizeSnapping: [ 'type', ResizeSnapping ],\n    snapping: [ 'type', Snapping ]\n  };\n\n  var SnappingModule = {\n    __depends__: [ SnappingModule$1 ],\n    __init__: [\n      'connectSnapping',\n      'createMoveSnapping'\n    ],\n    connectSnapping: [ 'type', BpmnConnectSnapping ],\n    createMoveSnapping: [ 'type', BpmnCreateMoveSnapping ]\n  };\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../overlays/Overlays').default} Overlays\n   * @typedef {import('../selection/Selection').default} Selection\n   *\n   * @typedef {import('../overlays/Overlays').OverlayAttrs} OverlayAttrs\n   *\n   * @typedef {import('../../util/Types').Dimensions} Dimensions\n   *\n   * @typedef {import('./SearchPadProvider').default} SearchPadProvider\n   * @typedef {import('./SearchPadProvider').SearchResult} SearchResult\n   * @typedef {import('./SearchPadProvider').Token} Token\n   */\n\n  /**\n   * Provides searching infrastructure.\n   *\n   * @param {Canvas} canvas\n   * @param {EventBus} eventBus\n   * @param {Overlays} overlays\n   * @param {Selection} selection\n   */\n  function SearchPad(canvas, eventBus, overlays, selection) {\n    this._open = false;\n    this._results = [];\n    this._eventMaps = [];\n\n    this._canvas = canvas;\n    this._eventBus = eventBus;\n    this._overlays = overlays;\n    this._selection = selection;\n\n    // setup elements\n    this._container = domify$1(SearchPad.BOX_HTML);\n    this._searchInput = query(SearchPad.INPUT_SELECTOR, this._container);\n    this._resultsContainer = query(SearchPad.RESULTS_CONTAINER_SELECTOR, this._container);\n\n    // attach search pad\n    this._canvas.getContainer().appendChild(this._container);\n\n    // cleanup on destroy\n    eventBus.on([ 'canvas.destroy', 'diagram.destroy' ], this.close, this);\n  }\n\n\n  SearchPad.$inject = [\n    'canvas',\n    'eventBus',\n    'overlays',\n    'selection'\n  ];\n\n\n  /**\n   * Binds and keeps track of all event listereners\n   */\n  SearchPad.prototype._bindEvents = function() {\n    var self = this;\n\n    function listen(el, selector, type, fn) {\n      self._eventMaps.push({\n        el: el,\n        type: type,\n        listener: delegate.bind(el, selector, type, fn)\n      });\n    }\n\n    // close search on clicking anywhere outside\n    listen(document, 'html', 'click', function(e) {\n      self.close();\n    });\n\n    // stop event from propagating and closing search\n    // focus on input\n    listen(this._container, SearchPad.INPUT_SELECTOR, 'click', function(e) {\n      e.stopPropagation();\n      e.delegateTarget.focus();\n    });\n\n    // preselect result on hover\n    listen(this._container, SearchPad.RESULT_SELECTOR, 'mouseover', function(e) {\n      e.stopPropagation();\n      self._scrollToNode(e.delegateTarget);\n      self._preselect(e.delegateTarget);\n    });\n\n    // selects desired result on mouse click\n    listen(this._container, SearchPad.RESULT_SELECTOR, 'click', function(e) {\n      e.stopPropagation();\n      self._select(e.delegateTarget);\n    });\n\n    // prevent cursor in input from going left and right when using up/down to\n    // navigate results\n    listen(this._container, SearchPad.INPUT_SELECTOR, 'keydown', function(e) {\n\n      if (isKey('ArrowUp', e)) {\n        e.preventDefault();\n      }\n\n      if (isKey('ArrowDown', e)) {\n        e.preventDefault();\n      }\n    });\n\n    // handle keyboard input\n    listen(this._container, SearchPad.INPUT_SELECTOR, 'keyup', function(e) {\n\n      if (isKey('Escape', e)) {\n        return self.close();\n      }\n\n      if (isKey('Enter', e)) {\n        var selected = self._getCurrentResult();\n\n        return selected ? self._select(selected) : self.close();\n      }\n\n      if (isKey('ArrowUp', e)) {\n        return self._scrollToDirection(true);\n      }\n\n      if (isKey('ArrowDown', e)) {\n        return self._scrollToDirection();\n      }\n\n      // do not search while navigating text input\n      if (isKey([ 'ArrowLeft', 'ArrowRight' ], e)) {\n        return;\n      }\n\n      // anything else\n      self._search(e.delegateTarget.value);\n    });\n  };\n\n\n  /**\n   * Unbinds all previously established listeners\n   */\n  SearchPad.prototype._unbindEvents = function() {\n    this._eventMaps.forEach(function(m) {\n      delegate.unbind(m.el, m.type, m.listener);\n    });\n  };\n\n\n  /**\n   * Performs a search for the given pattern.\n   *\n   * @param {string} pattern\n   */\n  SearchPad.prototype._search = function(pattern) {\n    var self = this;\n\n    this._clearResults();\n\n    // do not search on empty query\n    if (!pattern || pattern === '') {\n      return;\n    }\n\n    var searchResults = this._searchProvider.find(pattern);\n\n    if (!searchResults.length) {\n      return;\n    }\n\n    // append new results\n    searchResults.forEach(function(result) {\n      var id = result.element.id;\n      var node = self._createResultNode(result, id);\n      self._results[id] = {\n        element: result.element,\n        node: node\n      };\n    });\n\n    // preselect first result\n    var node = query(SearchPad.RESULT_SELECTOR, this._resultsContainer);\n    this._scrollToNode(node);\n    this._preselect(node);\n  };\n\n\n  /**\n   * Navigate to the previous/next result. Defaults to next result.\n   *\n   * @param {boolean} previous\n   */\n  SearchPad.prototype._scrollToDirection = function(previous) {\n    var selected = this._getCurrentResult();\n    if (!selected) {\n      return;\n    }\n\n    var node = previous ? selected.previousElementSibling : selected.nextElementSibling;\n    if (node) {\n      this._scrollToNode(node);\n      this._preselect(node);\n    }\n  };\n\n\n  /**\n   * Scroll to the node if it is not visible.\n   *\n   * @param {HTMLElement} node\n   */\n  SearchPad.prototype._scrollToNode = function(node) {\n    if (!node || node === this._getCurrentResult()) {\n      return;\n    }\n\n    var nodeOffset = node.offsetTop;\n    var containerScroll = this._resultsContainer.scrollTop;\n\n    var bottomScroll = nodeOffset - this._resultsContainer.clientHeight + node.clientHeight;\n\n    if (nodeOffset < containerScroll) {\n      this._resultsContainer.scrollTop = nodeOffset;\n    } else if (containerScroll < bottomScroll) {\n      this._resultsContainer.scrollTop = bottomScroll;\n    }\n  };\n\n\n  /**\n   * Clears all results data.\n   */\n  SearchPad.prototype._clearResults = function() {\n    clear$1(this._resultsContainer);\n\n    this._results = [];\n\n    this._resetOverlay();\n\n    this._eventBus.fire('searchPad.cleared');\n  };\n\n\n  /**\n   * Get currently selected result.\n   *\n   * @return {HTMLElement}\n   */\n  SearchPad.prototype._getCurrentResult = function() {\n    return query(SearchPad.RESULT_SELECTED_SELECTOR, this._resultsContainer);\n  };\n\n\n  /**\n   * Create result DOM element within results container\n   * that corresponds to a search result.\n   *\n   * 'result' : one of the elements returned by Pad\n   * 'id' : id attribute value to assign to the new DOM node\n   * return : created DOM element\n   *\n   * @param {SearchResult} result\n   * @param {string} id\n   *\n   * @return {HTMLElement}\n   */\n  SearchPad.prototype._createResultNode = function(result, id) {\n    var node = domify$1(SearchPad.RESULT_HTML);\n\n    // create only if available\n    if (result.primaryTokens.length > 0) {\n      createInnerTextNode(node, result.primaryTokens, SearchPad.RESULT_PRIMARY_HTML);\n    }\n\n    // secondary tokens (represent element ID) are allways available\n    createInnerTextNode(node, result.secondaryTokens, SearchPad.RESULT_SECONDARY_HTML);\n\n    attr$1(node, SearchPad.RESULT_ID_ATTRIBUTE, id);\n\n    this._resultsContainer.appendChild(node);\n\n    return node;\n  };\n\n\n  /**\n   * Register search element provider.\n   *\n   * @param {SearchPadProvider} provider\n   */\n  SearchPad.prototype.registerProvider = function(provider) {\n    this._searchProvider = provider;\n  };\n\n\n  /**\n   * Open search pad.\n   */\n  SearchPad.prototype.open = function() {\n    if (!this._searchProvider) {\n      throw new Error('no search provider registered');\n    }\n\n    if (this.isOpen()) {\n      return;\n    }\n\n    this._bindEvents();\n\n    this._open = true;\n\n    classes$1(this._container).add('open');\n\n    this._searchInput.focus();\n\n    this._eventBus.fire('searchPad.opened');\n  };\n\n\n  /**\n   * Close search pad.\n   */\n  SearchPad.prototype.close = function() {\n    if (!this.isOpen()) {\n      return;\n    }\n\n    this._unbindEvents();\n\n    this._open = false;\n\n    classes$1(this._container).remove('open');\n\n    this._clearResults();\n\n    this._searchInput.value = '';\n    this._searchInput.blur();\n\n    this._resetOverlay();\n\n    this._eventBus.fire('searchPad.closed');\n  };\n\n\n  /**\n   * Toggles search pad on/off.\n   */\n  SearchPad.prototype.toggle = function() {\n    this.isOpen() ? this.close() : this.open();\n  };\n\n\n  /**\n   * Report state of search pad.\n   */\n  SearchPad.prototype.isOpen = function() {\n    return this._open;\n  };\n\n\n  /**\n   * Preselect result entry.\n   *\n   * @param {HTMLElement} element\n   */\n  SearchPad.prototype._preselect = function(node) {\n    var selectedNode = this._getCurrentResult();\n\n    // already selected\n    if (node === selectedNode) {\n      return;\n    }\n\n    // removing preselection from current node\n    if (selectedNode) {\n      classes$1(selectedNode).remove(SearchPad.RESULT_SELECTED_CLASS);\n    }\n\n    var id = attr$1(node, SearchPad.RESULT_ID_ATTRIBUTE);\n    var element = this._results[id].element;\n\n    classes$1(node).add(SearchPad.RESULT_SELECTED_CLASS);\n\n    this._resetOverlay(element);\n\n    this._canvas.scrollToElement(element, { top: 400 });\n\n    this._selection.select(element);\n\n    this._eventBus.fire('searchPad.preselected', element);\n  };\n\n\n  /**\n   * Select result node.\n   *\n   * @param {HTMLElement} element\n   */\n  SearchPad.prototype._select = function(node) {\n    var id = attr$1(node, SearchPad.RESULT_ID_ATTRIBUTE);\n    var element = this._results[id].element;\n\n    this.close();\n\n    this._resetOverlay();\n\n    this._canvas.scrollToElement(element, { top: 400 });\n\n    this._selection.select(element);\n\n    this._eventBus.fire('searchPad.selected', element);\n  };\n\n\n  /**\n   * Reset overlay removes and, optionally, set\n   * overlay to a new element.\n   *\n   * @param {HTMLElement} element\n   */\n  SearchPad.prototype._resetOverlay = function(element) {\n    if (this._overlayId) {\n      this._overlays.remove(this._overlayId);\n    }\n\n    if (element) {\n      var box = getBBox(element);\n      var overlay = constructOverlay(box);\n      this._overlayId = this._overlays.add(element, overlay);\n    }\n  };\n\n\n  /**\n   * Construct overlay object for the given bounding box.\n   *\n   * @param {Dimensions} box\n   *\n   * @return {OverlayAttrs}\n   */\n  function constructOverlay(box) {\n\n    var offset = 6;\n    var w = box.width + offset * 2;\n    var h = box.height + offset * 2;\n\n    var styles = {\n      width: w + 'px',\n      height: h + 'px'\n    };\n\n    var html = domify$1('<div class=\"' + SearchPad.OVERLAY_CLASS + '\"></div>');\n\n    assign(html, styles);\n\n    return {\n      position: {\n        bottom: h - offset,\n        right: w - offset\n      },\n      show: true,\n      html: html\n    };\n  }\n\n\n  /**\n   * Creates and appends child node from result tokens and HTML template.\n   *\n   * @param {HTMLElement} node\n   * @param {Token[]} tokens\n   * @param {string} template\n   */\n  function createInnerTextNode(parentNode, tokens, template) {\n    var text = createHtmlText(tokens);\n    var childNode = domify$1(template);\n    childNode.innerHTML = text;\n    parentNode.appendChild(childNode);\n  }\n\n  /**\n   * Create internal HTML markup from result tokens.\n   * Caters for highlighting pattern matched tokens.\n   *\n   * @param {Token[]} tokens\n   *\n   * @return {string|null}\n   */\n  function createHtmlText(tokens) {\n    var htmlText = '';\n\n    tokens.forEach(function(t) {\n      if (t.matched) {\n        htmlText += '<strong class=\"' + SearchPad.RESULT_HIGHLIGHT_CLASS + '\">' + escapeHTML(t.matched) + '</strong>';\n      } else {\n        htmlText += escapeHTML(t.normal);\n      }\n    });\n\n    return htmlText !== '' ? htmlText : null;\n  }\n\n\n  /**\n   * CONSTANTS\n   */\n  SearchPad.CONTAINER_SELECTOR = '.djs-search-container';\n  SearchPad.INPUT_SELECTOR = '.djs-search-input input';\n  SearchPad.RESULTS_CONTAINER_SELECTOR = '.djs-search-results';\n  SearchPad.RESULT_SELECTOR = '.djs-search-result';\n  SearchPad.RESULT_SELECTED_CLASS = 'djs-search-result-selected';\n  SearchPad.RESULT_SELECTED_SELECTOR = '.' + SearchPad.RESULT_SELECTED_CLASS;\n  SearchPad.RESULT_ID_ATTRIBUTE = 'data-result-id';\n  SearchPad.RESULT_HIGHLIGHT_CLASS = 'djs-search-highlight';\n  SearchPad.OVERLAY_CLASS = 'djs-search-overlay';\n\n  SearchPad.BOX_HTML =\n    '<div class=\"djs-search-container djs-draggable djs-scrollable\">' +\n      '<div class=\"djs-search-input\">' +\n        '<input type=\"text\"/>' +\n      '</div>' +\n      '<div class=\"djs-search-results\"></div>' +\n    '</div>';\n\n  SearchPad.RESULT_HTML =\n    '<div class=\"djs-search-result\"></div>';\n\n  SearchPad.RESULT_PRIMARY_HTML =\n    '<div class=\"djs-search-result-primary\"></div>';\n\n  SearchPad.RESULT_SECONDARY_HTML =\n    '<p class=\"djs-search-result-secondary\"></p>';\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var SearchPadModule = {\n    __depends__: [\n      OverlaysModule,\n      SelectionModule\n    ],\n    searchPad: [ 'type', SearchPad ]\n  };\n\n  /**\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('diagram-js/lib/features/search-pad/SearchPad').default} SearchPad\n   *\n   * @typedef {import('diagram-js/lib/features/search-pad/SearchPadProvider').default} SearchPadProvider\n   * @typedef {import('diagram-js/lib/features/search-pad/SearchPadProvider').SearchResult} SearchResult\n   */\n\n  /**\n   * Provides ability to search for BPMN elements.\n   *\n   * @implements {SearchPadProvider}\n   *\n   * @param {ElementRegistry} elementRegistry\n   * @param {SearchPad} searchPad\n   * @param {Canvas} canvas\n   */\n  function BpmnSearchProvider(elementRegistry, searchPad, canvas) {\n    this._elementRegistry = elementRegistry;\n    this._canvas = canvas;\n\n    searchPad.registerProvider(this);\n  }\n\n  BpmnSearchProvider.$inject = [\n    'elementRegistry',\n    'searchPad',\n    'canvas'\n  ];\n\n  /**\n   * @param {string} pattern\n   *\n   * @return {SearchResult[]}\n   */\n  BpmnSearchProvider.prototype.find = function(pattern) {\n    var rootElement = this._canvas.getRootElement();\n\n    var elements = this._elementRegistry.filter(function(element) {\n      if (element.labelTarget) {\n        return false;\n      }\n      return true;\n    });\n\n    // do not include root element\n    elements = filter(elements, function(element) {\n      return element !== rootElement;\n    });\n\n    elements = map$1(elements, function(element) {\n      return {\n        primaryTokens: matchAndSplit(getLabel(element), pattern),\n        secondaryTokens: matchAndSplit(element.id, pattern),\n        element: element\n      };\n    });\n\n    // exclude non-matched elements\n    elements = filter(elements, function(element) {\n      return hasMatched(element.primaryTokens) || hasMatched(element.secondaryTokens);\n    });\n\n    elements = sortBy(elements, function(element) {\n      return getLabel(element.element) + element.element.id;\n    });\n\n    return elements;\n  };\n\n  /**\n   * @param {Token[]} tokens\n   *\n   * @return {boolean}\n   */\n  function hasMatched(tokens) {\n    var matched = filter(tokens, function(token) {\n      return !!token.matched;\n    });\n\n    return matched.length > 0;\n  }\n\n  /**\n   * @param {string} text\n   * @param {string} pattern\n   *\n   * @return {Token[]}\n   */\n  function matchAndSplit(text, pattern) {\n    var tokens = [],\n        originalText = text;\n\n    if (!text) {\n      return tokens;\n    }\n\n    text = text.toLowerCase();\n    pattern = pattern.toLowerCase();\n\n    var i = text.indexOf(pattern);\n\n    if (i > -1) {\n      if (i !== 0) {\n        tokens.push({\n          normal: originalText.substr(0, i)\n        });\n      }\n\n      tokens.push({\n        matched: originalText.substr(i, pattern.length)\n      });\n\n      if (pattern.length + i < text.length) {\n        tokens.push({\n          normal: originalText.substr(pattern.length + i, text.length)\n        });\n      }\n    } else {\n      tokens.push({\n        normal: originalText\n      });\n    }\n\n    return tokens;\n  }\n\n  var SearchModule = {\n    __depends__: [\n      SearchPadModule\n    ],\n    __init__: [ 'bpmnSearch' ],\n    bpmnSearch: [ 'type', BpmnSearchProvider ]\n  };\n\n  var initialDiagram =\n    '<?xml version=\"1.0\" encoding=\"UTF-8\"?>' +\n    '<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ' +\n                      'xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" ' +\n                      'xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" ' +\n                      'xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" ' +\n                      'targetNamespace=\"http://bpmn.io/schema/bpmn\" ' +\n                      'id=\"Definitions_1\">' +\n      '<bpmn:process id=\"Process_1\" isExecutable=\"false\">' +\n        '<bpmn:startEvent id=\"StartEvent_1\"/>' +\n      '</bpmn:process>' +\n      '<bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">' +\n        '<bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">' +\n          '<bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">' +\n            '<dc:Bounds height=\"36.0\" width=\"36.0\" x=\"173.0\" y=\"102.0\"/>' +\n          '</bpmndi:BPMNShape>' +\n        '</bpmndi:BPMNPlane>' +\n      '</bpmndi:BPMNDiagram>' +\n    '</bpmn:definitions>';\n\n\n  /**\n   * @typedef {import('./BaseViewer').BaseViewerOptions} BaseViewerOptions\n   * @typedef {import('./BaseViewer').ImportXMLResult} ImportXMLResult\n   */\n\n  /**\n   * A modeler for BPMN 2.0 diagrams.\n   *\n   *\n   * ## Extending the Modeler\n   *\n   * In order to extend the viewer pass extension modules to bootstrap via the\n   * `additionalModules` option. An extension module is an object that exposes\n   * named services.\n   *\n   * The following example depicts the integration of a simple\n   * logging component that integrates with interaction events:\n   *\n   *\n   * ```javascript\n   *\n   * // logging component\n   * function InteractionLogger(eventBus) {\n   *   eventBus.on('element.hover', function(event) {\n   *     console.log()\n   *   })\n   * }\n   *\n   * InteractionLogger.$inject = [ 'eventBus' ]; // minification save\n   *\n   * // extension module\n   * var extensionModule = {\n   *   __init__: [ 'interactionLogger' ],\n   *   interactionLogger: [ 'type', InteractionLogger ]\n   * };\n   *\n   * // extend the viewer\n   * var bpmnModeler = new Modeler({ additionalModules: [ extensionModule ] });\n   * bpmnModeler.importXML(...);\n   * ```\n   *\n   *\n   * ## Customizing / Replacing Components\n   *\n   * You can replace individual diagram components by redefining them in override modules.\n   * This works for all components, including those defined in the core.\n   *\n   * Pass in override modules via the `options.additionalModules` flag like this:\n   *\n   * ```javascript\n   * function CustomContextPadProvider(contextPad) {\n   *\n   *   contextPad.registerProvider(this);\n   *\n   *   this.getContextPadEntries = function(element) {\n   *     // no entries, effectively disable the context pad\n   *     return {};\n   *   };\n   * }\n   *\n   * CustomContextPadProvider.$inject = [ 'contextPad' ];\n   *\n   * var overrideModule = {\n   *   contextPadProvider: [ 'type', CustomContextPadProvider ]\n   * };\n   *\n   * var bpmnModeler = new Modeler({ additionalModules: [ overrideModule ]});\n   * ```\n   *\n   * @param {BaseViewerOptions} [options] The options to configure the modeler.\n   */\n  function Modeler(options) {\n    BaseModeler.call(this, options);\n  }\n\n  e$3(Modeler, BaseModeler);\n\n\n  Modeler.Viewer = Viewer;\n  Modeler.NavigatedViewer = NavigatedViewer;\n\n  /**\n   * Create a new diagram to start modeling.\n   *\n   * @throws {ImportXMLError} An error thrown during the import of the XML.\n   *\n   * @return {Promise<ImportXMLResult>} A promise resolving with warnings that were produced during the import.\n   */\n  Modeler.prototype.createDiagram = function createDiagram() {\n    return this.importXML(initialDiagram);\n  };\n\n  Modeler.prototype.createDiagram = wrapForCompatibility(Modeler.prototype.createDiagram);\n\n\n  Modeler.prototype._interactionModules = [\n\n    // non-modeling components\n    KeyboardMoveModule,\n    MoveCanvasModule,\n    TouchModule,\n    ZoomScrollModule\n  ];\n\n  Modeler.prototype._modelingModules = [\n\n    // modeling components\n    AlignElementsModule,\n    AutoPlaceModule,\n    AutoScrollModule,\n    AutoResizeModule,\n    BendpointsModule,\n    ConnectModule,\n    ConnectionPreviewModule,\n    ContextPadModule,\n    CopyPasteModule,\n    CreateModule,\n    DistributeElementsModule,\n    EditorActionsModule,\n    GridSnappingModule,\n    InteractionEventsModule,\n    KeyboardModule,\n    KeyboardMoveSelectionModule,\n    LabelEditingModule,\n    ModelingModule,\n    MoveModule,\n    PaletteModule,\n    ReplacePreviewModule,\n    ResizeModule,\n    SnappingModule,\n    SearchModule\n  ];\n\n\n  // modules the modeler is composed of\n  //\n  // - viewer modules\n  // - interaction modules\n  // - modeling modules\n\n  Modeler.prototype._modules = [].concat(\n    Viewer.prototype._modules,\n    Modeler.prototype._interactionModules,\n    Modeler.prototype._modelingModules\n  );\n\n  return Modeler;\n\n}));\n"
  },
  {
    "path": "easyflow-flow-bpmn/static/plugins/bpmnjs/bpmn-navigated-viewer.development.js",
    "content": "/*!\n * bpmn-js - bpmn-navigated-viewer v13.2.1\n *\n * Copyright (c) 2014-present, camunda Services GmbH\n *\n * Released under the bpmn.io license\n * http://bpmn.io/license\n *\n * Source Code: https://github.com/bpmn-io/bpmn-js\n *\n * Date: 2023-08-05\n */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n  typeof define === 'function' && define.amd ? define(factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.BpmnNavigatedViewer = factory());\n})(this, (function () { 'use strict';\n\n  function e(e,t){t&&(e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}));}\n\n  /**\n   * Flatten array, one level deep.\n   *\n   * @template T\n   *\n   * @param {T[][]} arr\n   *\n   * @return {T[]}\n   */\n\n  const nativeToString$1 = Object.prototype.toString;\n  const nativeHasOwnProperty$1 = Object.prototype.hasOwnProperty;\n\n  function isUndefined$2(obj) {\n    return obj === undefined;\n  }\n\n  function isDefined(obj) {\n    return obj !== undefined;\n  }\n\n  function isArray$2(obj) {\n    return nativeToString$1.call(obj) === '[object Array]';\n  }\n\n  function isObject(obj) {\n    return nativeToString$1.call(obj) === '[object Object]';\n  }\n\n  function isNumber(obj) {\n    return nativeToString$1.call(obj) === '[object Number]';\n  }\n\n  /**\n   * @param {any} obj\n   *\n   * @return {boolean}\n   */\n  function isFunction(obj) {\n    const tag = nativeToString$1.call(obj);\n\n    return (\n      tag === '[object Function]' ||\n      tag === '[object AsyncFunction]' ||\n      tag === '[object GeneratorFunction]' ||\n      tag === '[object AsyncGeneratorFunction]' ||\n      tag === '[object Proxy]'\n    );\n  }\n\n  function isString(obj) {\n    return nativeToString$1.call(obj) === '[object String]';\n  }\n\n  /**\n   * Return true, if target owns a property with the given key.\n   *\n   * @param {Object} target\n   * @param {String} key\n   *\n   * @return {Boolean}\n   */\n  function has$1(target, key) {\n    return nativeHasOwnProperty$1.call(target, key);\n  }\n\n  /**\n   * @template T\n   * @typedef { (\n   *   ((e: T) => boolean) |\n   *   ((e: T, idx: number) => boolean) |\n   *   ((e: T, key: string) => boolean) |\n   *   string |\n   *   number\n   * ) } Matcher\n   */\n\n  /**\n   * @template T\n   * @template U\n   *\n   * @typedef { (\n   *   ((e: T) => U) | string | number\n   * ) } Extractor\n   */\n\n\n  /**\n   * @template T\n   * @typedef { (val: T, key: any) => boolean } MatchFn\n   */\n\n  /**\n   * @template T\n   * @typedef { T[] } ArrayCollection\n   */\n\n  /**\n   * @template T\n   * @typedef { { [key: string]: T } } StringKeyValueCollection\n   */\n\n  /**\n   * @template T\n   * @typedef { { [key: number]: T } } NumberKeyValueCollection\n   */\n\n  /**\n   * @template T\n   * @typedef { StringKeyValueCollection<T> | NumberKeyValueCollection<T> } KeyValueCollection\n   */\n\n  /**\n   * @template T\n   * @typedef { KeyValueCollection<T> | ArrayCollection<T> } Collection\n   */\n\n  /**\n   * Find element in collection.\n   *\n   * @template T\n   * @param {Collection<T>} collection\n   * @param {Matcher<T>} matcher\n   *\n   * @return {Object}\n   */\n  function find(collection, matcher) {\n\n    const matchFn = toMatcher(matcher);\n\n    let match;\n\n    forEach$1(collection, function(val, key) {\n      if (matchFn(val, key)) {\n        match = val;\n\n        return false;\n      }\n    });\n\n    return match;\n\n  }\n\n\n  /**\n   * Find element index in collection.\n   *\n   * @template T\n   * @param {Collection<T>} collection\n   * @param {Matcher<T>} matcher\n   *\n   * @return {number}\n   */\n  function findIndex(collection, matcher) {\n\n    const matchFn = toMatcher(matcher);\n\n    let idx = isArray$2(collection) ? -1 : undefined;\n\n    forEach$1(collection, function(val, key) {\n      if (matchFn(val, key)) {\n        idx = key;\n\n        return false;\n      }\n    });\n\n    return idx;\n  }\n\n\n  /**\n   * Filter elements in collection.\n   *\n   * @template T\n   * @param {Collection<T>} collection\n   * @param {Matcher<T>} matcher\n   *\n   * @return {T[]} result\n   */\n  function filter(collection, matcher) {\n\n    const matchFn = toMatcher(matcher);\n\n    let result = [];\n\n    forEach$1(collection, function(val, key) {\n      if (matchFn(val, key)) {\n        result.push(val);\n      }\n    });\n\n    return result;\n  }\n\n\n  /**\n   * Iterate over collection; returning something\n   * (non-undefined) will stop iteration.\n   *\n   * @template T\n   * @param {Collection<T>} collection\n   * @param { ((item: T, idx: number) => (boolean|void)) | ((item: T, key: string) => (boolean|void)) } iterator\n   *\n   * @return {T} return result that stopped the iteration\n   */\n  function forEach$1(collection, iterator) {\n\n    let val,\n        result;\n\n    if (isUndefined$2(collection)) {\n      return;\n    }\n\n    const convertKey = isArray$2(collection) ? toNum$1 : identity$1;\n\n    for (let key in collection) {\n\n      if (has$1(collection, key)) {\n        val = collection[key];\n\n        result = iterator(val, convertKey(key));\n\n        if (result === false) {\n          return val;\n        }\n      }\n    }\n  }\n\n\n  /**\n   * Reduce collection, returning a single result.\n   *\n   * @template T\n   * @template V\n   *\n   * @param {Collection<T>} collection\n   * @param {(result: V, entry: T, index: any) => V} iterator\n   * @param {V} result\n   *\n   * @return {V} result returned from last iterator\n   */\n  function reduce(collection, iterator, result) {\n\n    forEach$1(collection, function(value, idx) {\n      result = iterator(result, value, idx);\n    });\n\n    return result;\n  }\n\n\n  /**\n   * Return true if every element in the collection\n   * matches the criteria.\n   *\n   * @param  {Object|Array} collection\n   * @param  {Function} matcher\n   *\n   * @return {Boolean}\n   */\n  function every(collection, matcher) {\n\n    return !!reduce(collection, function(matches, val, key) {\n      return matches && matcher(val, key);\n    }, true);\n  }\n\n\n  /**\n   * Return true if some elements in the collection\n   * match the criteria.\n   *\n   * @param  {Object|Array} collection\n   * @param  {Function} matcher\n   *\n   * @return {Boolean}\n   */\n  function some(collection, matcher) {\n\n    return !!find(collection, matcher);\n  }\n\n\n  /**\n   * Transform a collection into another collection\n   * by piping each member through the given fn.\n   *\n   * @param  {Object|Array}   collection\n   * @param  {Function} fn\n   *\n   * @return {Array} transformed collection\n   */\n  function map$1(collection, fn) {\n\n    let result = [];\n\n    forEach$1(collection, function(val, key) {\n      result.push(fn(val, key));\n    });\n\n    return result;\n  }\n\n\n  /**\n   * Create an object pattern matcher.\n   *\n   * @example\n   *\n   * ```javascript\n   * const matcher = matchPattern({ id: 1 });\n   *\n   * let element = find(elements, matcher);\n   * ```\n   *\n   * @template T\n   *\n   * @param {T} pattern\n   *\n   * @return { (el: any) =>  boolean } matcherFn\n   */\n  function matchPattern(pattern) {\n\n    return function(el) {\n\n      return every(pattern, function(val, key) {\n        return el[key] === val;\n      });\n\n    };\n  }\n\n\n  /**\n   * @template T\n   * @param {Matcher<T>} matcher\n   *\n   * @return {MatchFn<T>}\n   */\n  function toMatcher(matcher) {\n    return isFunction(matcher) ? matcher : (e) => {\n      return e === matcher;\n    };\n  }\n\n\n  function identity$1(arg) {\n    return arg;\n  }\n\n  function toNum$1(arg) {\n    return Number(arg);\n  }\n\n  /* global setTimeout clearTimeout */\n\n  /**\n   * @typedef { {\n   *   (...args: any[]): any;\n   *   flush: () => void;\n   *   cancel: () => void;\n   * } } DebouncedFunction\n   */\n\n  /**\n   * Debounce fn, calling it only once if the given time\n   * elapsed between calls.\n   *\n   * Lodash-style the function exposes methods to `#clear`\n   * and `#flush` to control internal behavior.\n   *\n   * @param  {Function} fn\n   * @param  {Number} timeout\n   *\n   * @return {DebouncedFunction} debounced function\n   */\n  function debounce(fn, timeout) {\n\n    let timer;\n\n    let lastArgs;\n    let lastThis;\n\n    let lastNow;\n\n    function fire(force) {\n\n      let now = Date.now();\n\n      let scheduledDiff = force ? 0 : (lastNow + timeout) - now;\n\n      if (scheduledDiff > 0) {\n        return schedule(scheduledDiff);\n      }\n\n      fn.apply(lastThis, lastArgs);\n\n      clear();\n    }\n\n    function schedule(timeout) {\n      timer = setTimeout(fire, timeout);\n    }\n\n    function clear() {\n      if (timer) {\n        clearTimeout(timer);\n      }\n\n      timer = lastNow = lastArgs = lastThis = undefined;\n    }\n\n    function flush() {\n      if (timer) {\n        fire(true);\n      }\n\n      clear();\n    }\n\n    /**\n     * @type { DebouncedFunction }\n     */\n    function callback(...args) {\n      lastNow = Date.now();\n\n      lastArgs = args;\n      lastThis = this;\n\n      // ensure an execution is scheduled\n      if (!timer) {\n        schedule(timeout);\n      }\n    }\n\n    callback.flush = flush;\n    callback.cancel = clear;\n\n    return callback;\n  }\n\n  /**\n   * Bind function against target <this>.\n   *\n   * @param  {Function} fn\n   * @param  {Object}   target\n   *\n   * @return {Function} bound function\n   */\n  function bind$2(fn, target) {\n    return fn.bind(target);\n  }\n\n  /**\n   * Convenience wrapper for `Object.assign`.\n   *\n   * @param {Object} target\n   * @param {...Object} others\n   *\n   * @return {Object} the target\n   */\n  function assign$1(target, ...others) {\n    return Object.assign(target, ...others);\n  }\n\n  /**\n   * Pick properties from the given target.\n   *\n   * @template T\n   * @template {any[]} V\n   *\n   * @param {T} target\n   * @param {V} properties\n   *\n   * @return Pick<T, V>\n   */\n  function pick(target, properties) {\n\n    let result = {};\n\n    let obj = Object(target);\n\n    forEach$1(properties, function(prop) {\n\n      if (prop in obj) {\n        result[prop] = target[prop];\n      }\n    });\n\n    return result;\n  }\n\n  /**\n   * Pick all target properties, excluding the given ones.\n   *\n   * @template T\n   * @template {any[]} V\n   *\n   * @param {T} target\n   * @param {V} properties\n   *\n   * @return {Omit<T, V>} target\n   */\n  function omit(target, properties) {\n\n    let result = {};\n\n    let obj = Object(target);\n\n    forEach$1(obj, function(prop, key) {\n\n      if (properties.indexOf(key) === -1) {\n        result[key] = prop;\n      }\n    });\n\n    return result;\n  }\n\n  var DEFAULT_RENDER_PRIORITY$1 = 1000;\n\n  /**\n   * @typedef {import('../core/Types').ElementLike} Element\n   * @typedef {import('../core/Types').ConnectionLike} Connection\n   * @typedef {import('../core/Types').ShapeLike} Shape\n   *\n   * @typedef {import('../core/EventBus').default} EventBus\n   */\n\n  /**\n   * The base implementation of shape and connection renderers.\n   *\n   * @param {EventBus} eventBus\n   * @param {number} [renderPriority=1000]\n   */\n  function BaseRenderer(eventBus, renderPriority) {\n    var self = this;\n\n    renderPriority = renderPriority || DEFAULT_RENDER_PRIORITY$1;\n\n    eventBus.on([ 'render.shape', 'render.connection' ], renderPriority, function(evt, context) {\n      var type = evt.type,\n          element = context.element,\n          visuals = context.gfx,\n          attrs = context.attrs;\n\n      if (self.canRender(element)) {\n        if (type === 'render.shape') {\n          return self.drawShape(visuals, element, attrs);\n        } else {\n          return self.drawConnection(visuals, element, attrs);\n        }\n      }\n    });\n\n    eventBus.on([ 'render.getShapePath', 'render.getConnectionPath' ], renderPriority, function(evt, element) {\n      if (self.canRender(element)) {\n        if (evt.type === 'render.getShapePath') {\n          return self.getShapePath(element);\n        } else {\n          return self.getConnectionPath(element);\n        }\n      }\n    });\n  }\n\n  /**\n   * Checks whether an element can be rendered.\n   *\n   * @param {Element} element The element to be rendered.\n   *\n   * @return {boolean} Whether the element can be rendered.\n   */\n  BaseRenderer.prototype.canRender = function(element) {};\n\n  /**\n   * Draws a shape.\n   *\n   * @param {SVGElement} visuals The SVG element to draw the shape into.\n   * @param {Shape} shape The shape to be drawn.\n   *\n   * @return {SVGElement} The SVG element of the shape drawn.\n   */\n  BaseRenderer.prototype.drawShape = function(visuals, shape) {};\n\n  /**\n   * Draws a connection.\n   *\n   * @param {SVGElement} visuals The SVG element to draw the connection into.\n   * @param {Connection} connection The connection to be drawn.\n   *\n   * @return {SVGElement} The SVG element of the connection drawn.\n   */\n  BaseRenderer.prototype.drawConnection = function(visuals, connection) {};\n\n  /**\n   * Gets the SVG path of the graphical representation of a shape.\n   *\n   * @param {Shape} shape The shape.\n   *\n   * @return {string} The SVG path of the shape.\n   */\n  BaseRenderer.prototype.getShapePath = function(shape) {};\n\n  /**\n   * Gets the SVG path of the graphical representation of a connection.\n   *\n   * @param {Connection} connection The connection.\n   *\n   * @return {string} The SVG path of the connection.\n   */\n  BaseRenderer.prototype.getConnectionPath = function(connection) {};\n\n  /**\n   * @typedef { import('../model/Types').Element } Element\n   * @typedef { import('../model/Types').ModdleElement } ModdleElement\n   */\n\n  /**\n   * Is an element of the given BPMN type?\n   *\n   * @param  {Element|ModdleElement} element\n   * @param  {string} type\n   *\n   * @return {boolean}\n   */\n  function is$1(element, type) {\n    var bo = getBusinessObject(element);\n\n    return bo && (typeof bo.$instanceOf === 'function') && bo.$instanceOf(type);\n  }\n\n\n  /**\n   * Return true if element has any of the given types.\n   *\n   * @param {Element|ModdleElement} element\n   * @param {string[]} types\n   *\n   * @return {boolean}\n   */\n  function isAny(element, types) {\n    return some(types, function(t) {\n      return is$1(element, t);\n    });\n  }\n\n  /**\n   * Return the business object for a given element.\n   *\n   * @param {Element|ModdleElement} element\n   *\n   * @return {ModdleElement}\n   */\n  function getBusinessObject(element) {\n    return (element && element.businessObject) || element;\n  }\n\n  /**\n   * Return the di object for a given element.\n   *\n   * @param {Element} element\n   *\n   * @return {ModdleElement}\n   */\n  function getDi(element) {\n    return element && element.di;\n  }\n\n  /**\n   * @typedef {import('../model/Types').Element} Element\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   */\n\n  /**\n   * @param {Element} element\n   * @param {ModdleElement} [di]\n   *\n   * @return {boolean}\n   */\n  function isExpanded(element, di) {\n\n    if (is$1(element, 'bpmn:CallActivity')) {\n      return false;\n    }\n\n    if (is$1(element, 'bpmn:SubProcess')) {\n      di = di || getDi(element);\n\n      if (di && is$1(di, 'bpmndi:BPMNPlane')) {\n        return true;\n      }\n\n      return di && !!di.isExpanded;\n    }\n\n    if (is$1(element, 'bpmn:Participant')) {\n      return !!getBusinessObject(element).processRef;\n    }\n\n    return true;\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isEventSubProcess(element) {\n    return element && !!getBusinessObject(element).triggeredByEvent;\n  }\n\n  /**\n   * Checks whether a value is an instance of Connection.\n   *\n   * @param {any} value\n   *\n   * @return {boolean}\n   */\n  function isConnection(value) {\n    return isObject(value) && has$1(value, 'waypoints');\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/util/Types').Point} Point\n   * @typedef {import('diagram-js/lib/util/Types').Rect} Rect\n   *\n   * @typedef {import('../model/Types').Element} Element\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   */\n\n  var DEFAULT_LABEL_SIZE$1 = {\n    width: 90,\n    height: 20\n  };\n\n  var FLOW_LABEL_INDENT = 15;\n\n\n  /**\n   * Return true if the given semantic has an external label.\n   *\n   * @param {Element} semantic\n   *\n   * @return {boolean}\n   */\n  function isLabelExternal(semantic) {\n    return is$1(semantic, 'bpmn:Event') ||\n           is$1(semantic, 'bpmn:Gateway') ||\n           is$1(semantic, 'bpmn:DataStoreReference') ||\n           is$1(semantic, 'bpmn:DataObjectReference') ||\n           is$1(semantic, 'bpmn:DataInput') ||\n           is$1(semantic, 'bpmn:DataOutput') ||\n           is$1(semantic, 'bpmn:SequenceFlow') ||\n           is$1(semantic, 'bpmn:MessageFlow') ||\n           is$1(semantic, 'bpmn:Group');\n  }\n\n  /**\n   * Get the position of a sequence flow label.\n   *\n   * @param  {Point[]} waypoints\n   *\n   * @return {Point}\n   */\n  function getFlowLabelPosition(waypoints) {\n\n    // get the waypoints mid\n    var mid = waypoints.length / 2 - 1;\n\n    var first = waypoints[Math.floor(mid)];\n    var second = waypoints[Math.ceil(mid + 0.01)];\n\n    // get position\n    var position = getWaypointsMid(waypoints);\n\n    // calculate angle\n    var angle = Math.atan((second.y - first.y) / (second.x - first.x));\n\n    var x = position.x,\n        y = position.y;\n\n    if (Math.abs(angle) < Math.PI / 2) {\n      y -= FLOW_LABEL_INDENT;\n    } else {\n      x += FLOW_LABEL_INDENT;\n    }\n\n    return { x: x, y: y };\n  }\n\n\n  /**\n   * Get the middle of a number of waypoints.\n   *\n   * @param  {Point[]} waypoints\n   *\n   * @return {Point}\n   */\n  function getWaypointsMid(waypoints) {\n\n    var mid = waypoints.length / 2 - 1;\n\n    var first = waypoints[Math.floor(mid)];\n    var second = waypoints[Math.ceil(mid + 0.01)];\n\n    return {\n      x: first.x + (second.x - first.x) / 2,\n      y: first.y + (second.y - first.y) / 2\n    };\n  }\n\n  /**\n   * Get the middle of the external label of an element.\n   *\n   * @param {Element} element\n   *\n   * @return {Point}\n   */\n  function getExternalLabelMid(element) {\n\n    if (element.waypoints) {\n      return getFlowLabelPosition(element.waypoints);\n    } else if (is$1(element, 'bpmn:Group')) {\n      return {\n        x: element.x + element.width / 2,\n        y: element.y + DEFAULT_LABEL_SIZE$1.height / 2\n      };\n    } else {\n      return {\n        x: element.x + element.width / 2,\n        y: element.y + element.height + DEFAULT_LABEL_SIZE$1.height / 2\n      };\n    }\n  }\n\n\n  /**\n   * Return the bounds of an elements label, parsed from the elements DI or\n   * generated from its bounds.\n   *\n   * @param {ModdleElement} di\n   * @param {Element} element\n   *\n   * @return {Rect}\n   */\n  function getExternalLabelBounds(di, element) {\n\n    var mid,\n        size,\n        bounds,\n        label = di.label;\n\n    if (label && label.bounds) {\n      bounds = label.bounds;\n\n      size = {\n        width: Math.max(DEFAULT_LABEL_SIZE$1.width, bounds.width),\n        height: bounds.height\n      };\n\n      mid = {\n        x: bounds.x + bounds.width / 2,\n        y: bounds.y + bounds.height / 2\n      };\n    } else {\n\n      mid = getExternalLabelMid(element);\n\n      size = DEFAULT_LABEL_SIZE$1;\n    }\n\n    return assign$1({\n      x: mid.x - size.width / 2,\n      y: mid.y - size.height / 2\n    }, size);\n  }\n\n  /**\n   * @param {ModdleElement} semantic\n   *\n   * @returns {string}\n   */\n  function getLabelAttr(semantic) {\n    if (\n      is$1(semantic, 'bpmn:FlowElement') ||\n      is$1(semantic, 'bpmn:Participant') ||\n      is$1(semantic, 'bpmn:Lane') ||\n      is$1(semantic, 'bpmn:SequenceFlow') ||\n      is$1(semantic, 'bpmn:MessageFlow') ||\n      is$1(semantic, 'bpmn:DataInput') ||\n      is$1(semantic, 'bpmn:DataOutput')\n    ) {\n      return 'name';\n    }\n\n    if (is$1(semantic, 'bpmn:TextAnnotation')) {\n      return 'text';\n    }\n\n    if (is$1(semantic, 'bpmn:Group')) {\n      return 'categoryValueRef';\n    }\n  }\n\n  /**\n   * @param {ModdleElement} semantic\n   *\n   * @returns {string}\n   */\n  function getCategoryValue(semantic) {\n    var categoryValueRef = semantic['categoryValueRef'];\n\n    if (!categoryValueRef) {\n      return '';\n    }\n\n\n    return categoryValueRef.value || '';\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {string}\n   */\n  function getLabel(element) {\n    var semantic = element.businessObject,\n        attr = getLabelAttr(semantic);\n\n    if (attr) {\n\n      if (attr === 'categoryValueRef') {\n\n        return getCategoryValue(semantic);\n      }\n\n      return semantic[attr] || '';\n    }\n  }\n\n  function ensureImported(element, target) {\n\n    if (element.ownerDocument !== target.ownerDocument) {\n      try {\n\n        // may fail on webkit\n        return target.ownerDocument.importNode(element, true);\n      } catch (e) {\n\n        // ignore\n      }\n    }\n\n    return element;\n  }\n\n  /**\n   * appendTo utility\n   */\n\n  /**\n   * Append a node to a target element and return the appended node.\n   *\n   * @param  {SVGElement} element\n   * @param  {SVGElement} target\n   *\n   * @return {SVGElement} the appended node\n   */\n  function appendTo(element, target) {\n    return target.appendChild(ensureImported(element, target));\n  }\n\n  /**\n   * append utility\n   */\n\n  /**\n   * Append a node to an element\n   *\n   * @param  {SVGElement} element\n   * @param  {SVGElement} node\n   *\n   * @return {SVGElement} the element\n   */\n  function append(target, node) {\n    appendTo(node, target);\n    return target;\n  }\n\n  /**\n   * attribute accessor utility\n   */\n\n  var LENGTH_ATTR = 2;\n\n  var CSS_PROPERTIES = {\n    'alignment-baseline': 1,\n    'baseline-shift': 1,\n    'clip': 1,\n    'clip-path': 1,\n    'clip-rule': 1,\n    'color': 1,\n    'color-interpolation': 1,\n    'color-interpolation-filters': 1,\n    'color-profile': 1,\n    'color-rendering': 1,\n    'cursor': 1,\n    'direction': 1,\n    'display': 1,\n    'dominant-baseline': 1,\n    'enable-background': 1,\n    'fill': 1,\n    'fill-opacity': 1,\n    'fill-rule': 1,\n    'filter': 1,\n    'flood-color': 1,\n    'flood-opacity': 1,\n    'font': 1,\n    'font-family': 1,\n    'font-size': LENGTH_ATTR,\n    'font-size-adjust': 1,\n    'font-stretch': 1,\n    'font-style': 1,\n    'font-variant': 1,\n    'font-weight': 1,\n    'glyph-orientation-horizontal': 1,\n    'glyph-orientation-vertical': 1,\n    'image-rendering': 1,\n    'kerning': 1,\n    'letter-spacing': 1,\n    'lighting-color': 1,\n    'marker': 1,\n    'marker-end': 1,\n    'marker-mid': 1,\n    'marker-start': 1,\n    'mask': 1,\n    'opacity': 1,\n    'overflow': 1,\n    'pointer-events': 1,\n    'shape-rendering': 1,\n    'stop-color': 1,\n    'stop-opacity': 1,\n    'stroke': 1,\n    'stroke-dasharray': 1,\n    'stroke-dashoffset': 1,\n    'stroke-linecap': 1,\n    'stroke-linejoin': 1,\n    'stroke-miterlimit': 1,\n    'stroke-opacity': 1,\n    'stroke-width': LENGTH_ATTR,\n    'text-anchor': 1,\n    'text-decoration': 1,\n    'text-rendering': 1,\n    'unicode-bidi': 1,\n    'visibility': 1,\n    'word-spacing': 1,\n    'writing-mode': 1\n  };\n\n\n  function getAttribute(node, name) {\n    if (CSS_PROPERTIES[name]) {\n      return node.style[name];\n    } else {\n      return node.getAttributeNS(null, name);\n    }\n  }\n\n  function setAttribute(node, name, value) {\n    var hyphenated = name.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n\n    var type = CSS_PROPERTIES[hyphenated];\n\n    if (type) {\n\n      // append pixel unit, unless present\n      if (type === LENGTH_ATTR && typeof value === 'number') {\n        value = String(value) + 'px';\n      }\n\n      node.style[hyphenated] = value;\n    } else {\n      node.setAttributeNS(null, name, value);\n    }\n  }\n\n  function setAttributes(node, attrs) {\n\n    var names = Object.keys(attrs), i, name;\n\n    for (i = 0, name; (name = names[i]); i++) {\n      setAttribute(node, name, attrs[name]);\n    }\n  }\n\n  /**\n   * Gets or sets raw attributes on a node.\n   *\n   * @param  {SVGElement} node\n   * @param  {Object} [attrs]\n   * @param  {String} [name]\n   * @param  {String} [value]\n   *\n   * @return {String}\n   */\n  function attr$1(node, name, value) {\n    if (typeof name === 'string') {\n      if (value !== undefined) {\n        setAttribute(node, name, value);\n      } else {\n        return getAttribute(node, name);\n      }\n    } else {\n      setAttributes(node, name);\n    }\n\n    return node;\n  }\n\n  /**\r\n   * Taken from https://github.com/component/classes\r\n   *\r\n   * Without the component bits.\r\n   */\r\n\r\n  /**\r\n   * toString reference.\r\n   */\r\n\r\n  const toString$1 = Object.prototype.toString;\r\n\r\n  /**\r\n    * Wrap `el` in a `ClassList`.\r\n    *\r\n    * @param {Element} el\r\n    * @return {ClassList}\r\n    * @api public\r\n    */\r\n\r\n  function classes$1(el) {\r\n    return new ClassList$1(el);\r\n  }\r\n\r\n  function ClassList$1(el) {\r\n    if (!el || !el.nodeType) {\r\n      throw new Error('A DOM element reference is required');\r\n    }\r\n    this.el = el;\r\n    this.list = el.classList;\r\n  }\r\n\r\n  /**\r\n    * Add class `name` if not already present.\r\n    *\r\n    * @param {String} name\r\n    * @return {ClassList}\r\n    * @api public\r\n    */\r\n\r\n  ClassList$1.prototype.add = function(name) {\r\n    this.list.add(name);\r\n    return this;\r\n  };\r\n\r\n  /**\r\n    * Remove class `name` when present, or\r\n    * pass a regular expression to remove\r\n    * any which match.\r\n    *\r\n    * @param {String|RegExp} name\r\n    * @return {ClassList}\r\n    * @api public\r\n    */\r\n\r\n  ClassList$1.prototype.remove = function(name) {\r\n    if ('[object RegExp]' == toString$1.call(name)) {\r\n      return this.removeMatching(name);\r\n    }\r\n\r\n    this.list.remove(name);\r\n    return this;\r\n  };\r\n\r\n  /**\r\n    * Remove all classes matching `re`.\r\n    *\r\n    * @param {RegExp} re\r\n    * @return {ClassList}\r\n    * @api private\r\n    */\r\n\r\n  ClassList$1.prototype.removeMatching = function(re) {\r\n    const arr = this.array();\r\n    for (let i = 0; i < arr.length; i++) {\r\n      if (re.test(arr[i])) {\r\n        this.remove(arr[i]);\r\n      }\r\n    }\r\n    return this;\r\n  };\r\n\r\n  /**\r\n    * Toggle class `name`, can force state via `force`.\r\n    *\r\n    * For browsers that support classList, but do not support `force` yet,\r\n    * the mistake will be detected and corrected.\r\n    *\r\n    * @param {String} name\r\n    * @param {Boolean} force\r\n    * @return {ClassList}\r\n    * @api public\r\n    */\r\n\r\n  ClassList$1.prototype.toggle = function(name, force) {\r\n    if ('undefined' !== typeof force) {\r\n      if (force !== this.list.toggle(name, force)) {\r\n        this.list.toggle(name); // toggle again to correct\r\n      }\r\n    } else {\r\n      this.list.toggle(name);\r\n    }\r\n    return this;\r\n  };\r\n\r\n  /**\r\n    * Return an array of classes.\r\n    *\r\n    * @return {Array}\r\n    * @api public\r\n    */\r\n\r\n  ClassList$1.prototype.array = function() {\r\n    return Array.from(this.list);\r\n  };\r\n\r\n  /**\r\n    * Check if class `name` is present.\r\n    *\r\n    * @param {String} name\r\n    * @return {ClassList}\r\n    * @api public\r\n    */\r\n\r\n  ClassList$1.prototype.has =\r\n   ClassList$1.prototype.contains = function(name) {\r\n     return this.list.contains(name);\r\n   };\n\n  function remove$2(element) {\n    var parent = element.parentNode;\n\n    if (parent) {\n      parent.removeChild(element);\n    }\n\n    return element;\n  }\n\n  /**\n   * Clear utility\n   */\n\n  /**\n   * Removes all children from the given element\n   *\n   * @param  {DOMElement} element\n   * @return {DOMElement} the element (for chaining)\n   */\n  function clear$1(element) {\n    var child;\n\n    while ((child = element.firstChild)) {\n      remove$2(child);\n    }\n\n    return element;\n  }\n\n  var ns = {\n    svg: 'http://www.w3.org/2000/svg'\n  };\n\n  /**\n   * DOM parsing utility\n   */\n\n  var SVG_START = '<svg xmlns=\"' + ns.svg + '\"';\n\n  function parse$1(svg) {\n\n    var unwrap = false;\n\n    // ensure we import a valid svg document\n    if (svg.substring(0, 4) === '<svg') {\n      if (svg.indexOf(ns.svg) === -1) {\n        svg = SVG_START + svg.substring(4);\n      }\n    } else {\n\n      // namespace svg\n      svg = SVG_START + '>' + svg + '</svg>';\n      unwrap = true;\n    }\n\n    var parsed = parseDocument(svg);\n\n    if (!unwrap) {\n      return parsed;\n    }\n\n    var fragment = document.createDocumentFragment();\n\n    var parent = parsed.firstChild;\n\n    while (parent.firstChild) {\n      fragment.appendChild(parent.firstChild);\n    }\n\n    return fragment;\n  }\n\n  function parseDocument(svg) {\n\n    var parser;\n\n    // parse\n    parser = new DOMParser();\n    parser.async = false;\n\n    return parser.parseFromString(svg, 'text/xml');\n  }\n\n  /**\n   * Create utility for SVG elements\n   */\n\n\n  /**\n   * Create a specific type from name or SVG markup.\n   *\n   * @param {String} name the name or markup of the element\n   * @param {Object} [attrs] attributes to set on the element\n   *\n   * @returns {SVGElement}\n   */\n  function create$1(name, attrs) {\n    var element;\n\n    if (name.charAt(0) === '<') {\n      element = parse$1(name).firstChild;\n      element = document.importNode(element, true);\n    } else {\n      element = document.createElementNS(ns.svg, name);\n    }\n\n    if (attrs) {\n      attr$1(element, attrs);\n    }\n\n    return element;\n  }\n\n  /**\n   * Geometry helpers\n   */\n\n  // fake node used to instantiate svg geometry elements\n  var node = null;\n\n  function getNode() {\n    if (node === null) {\n      node = create$1('svg');\n    }\n\n    return node;\n  }\n\n  function extend$1(object, props) {\n    var i, k, keys = Object.keys(props);\n\n    for (i = 0; (k = keys[i]); i++) {\n      object[k] = props[k];\n    }\n\n    return object;\n  }\n\n  /**\n   * Create matrix via args.\n   *\n   * @example\n   *\n   * createMatrix({ a: 1, b: 1 });\n   * createMatrix();\n   * createMatrix(1, 2, 0, 0, 30, 20);\n   *\n   * @return {SVGMatrix}\n   */\n  function createMatrix(a, b, c, d, e, f) {\n    var matrix = getNode().createSVGMatrix();\n\n    switch (arguments.length) {\n    case 0:\n      return matrix;\n    case 1:\n      return extend$1(matrix, a);\n    case 6:\n      return extend$1(matrix, {\n        a: a,\n        b: b,\n        c: c,\n        d: d,\n        e: e,\n        f: f\n      });\n    }\n  }\n\n  function createTransform(matrix) {\n    if (matrix) {\n      return getNode().createSVGTransformFromMatrix(matrix);\n    } else {\n      return getNode().createSVGTransform();\n    }\n  }\n\n  /**\n   * Serialization util\n   */\n\n  var TEXT_ENTITIES = /([&<>]{1})/g;\n  var ATTR_ENTITIES = /([\\n\\r\"]{1})/g;\n\n  var ENTITY_REPLACEMENT = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '\\''\n  };\n\n  function escape$1(str, pattern) {\n\n    function replaceFn(match, entity) {\n      return ENTITY_REPLACEMENT[entity] || entity;\n    }\n\n    return str.replace(pattern, replaceFn);\n  }\n\n  function serialize(node, output) {\n\n    var i, len, attrMap, attrNode, childNodes;\n\n    switch (node.nodeType) {\n\n    // TEXT\n    case 3:\n\n      // replace special XML characters\n      output.push(escape$1(node.textContent, TEXT_ENTITIES));\n      break;\n\n    // ELEMENT\n    case 1:\n      output.push('<', node.tagName);\n\n      if (node.hasAttributes()) {\n        attrMap = node.attributes;\n        for (i = 0, len = attrMap.length; i < len; ++i) {\n          attrNode = attrMap.item(i);\n          output.push(' ', attrNode.name, '=\"', escape$1(attrNode.value, ATTR_ENTITIES), '\"');\n        }\n      }\n\n      if (node.hasChildNodes()) {\n        output.push('>');\n        childNodes = node.childNodes;\n        for (i = 0, len = childNodes.length; i < len; ++i) {\n          serialize(childNodes.item(i), output);\n        }\n        output.push('</', node.tagName, '>');\n      } else {\n        output.push('/>');\n      }\n      break;\n\n    // COMMENT\n    case 8:\n      output.push('<!--', escape$1(node.nodeValue, TEXT_ENTITIES), '-->');\n      break;\n\n    // CDATA\n    case 4:\n      output.push('<![CDATA[', node.nodeValue, ']]>');\n      break;\n\n    default:\n      throw new Error('unable to handle node ' + node.nodeType);\n    }\n\n    return output;\n  }\n\n  /**\n   * innerHTML like functionality for SVG elements.\n   * based on innerSVG (https://code.google.com/p/innersvg)\n   */\n\n\n  function set$1(element, svg) {\n\n    var parsed = parse$1(svg);\n\n    // clear element contents\n    clear$1(element);\n\n    if (!svg) {\n      return;\n    }\n\n    if (!isFragment(parsed)) {\n\n      // extract <svg> from parsed document\n      parsed = parsed.documentElement;\n    }\n\n    var nodes = slice$1(parsed.childNodes);\n\n    // import + append each node\n    for (var i = 0; i < nodes.length; i++) {\n      appendTo(nodes[i], element);\n    }\n\n  }\n\n  function get(element) {\n    var child = element.firstChild,\n        output = [];\n\n    while (child) {\n      serialize(child, output);\n      child = child.nextSibling;\n    }\n\n    return output.join('');\n  }\n\n  function isFragment(node) {\n    return node.nodeName === '#document-fragment';\n  }\n\n  function innerSVG(element, svg) {\n\n    if (svg !== undefined) {\n\n      try {\n        set$1(element, svg);\n      } catch (e) {\n        throw new Error('error parsing SVG: ' + e.message);\n      }\n\n      return element;\n    } else {\n      return get(element);\n    }\n  }\n\n\n  function slice$1(arr) {\n    return Array.prototype.slice.call(arr);\n  }\n\n  /**\n   * transform accessor utility\n   */\n\n  function wrapMatrix(transformList, transform) {\n    if (transform instanceof SVGMatrix) {\n      return transformList.createSVGTransformFromMatrix(transform);\n    }\n\n    return transform;\n  }\n\n\n  function setTransforms(transformList, transforms) {\n    var i, t;\n\n    transformList.clear();\n\n    for (i = 0; (t = transforms[i]); i++) {\n      transformList.appendItem(wrapMatrix(transformList, t));\n    }\n  }\n\n  /**\n   * Get or set the transforms on the given node.\n   *\n   * @param {SVGElement} node\n   * @param  {SVGTransform|SVGMatrix|Array<SVGTransform|SVGMatrix>} [transforms]\n   *\n   * @return {SVGTransform} the consolidated transform\n   */\n  function transform$1(node, transforms) {\n    var transformList = node.transform.baseVal;\n\n    if (transforms) {\n\n      if (!Array.isArray(transforms)) {\n        transforms = [ transforms ];\n      }\n\n      setTransforms(transformList, transforms);\n    }\n\n    return transformList.consolidate();\n  }\n\n  /**\n   * @typedef {(string|number)[]} Component\n   *\n   * @typedef {import('../util/Types').Point} Point\n   */\n\n  /**\n   * @param {Component[] | Component[][]} elements\n   *\n   * @return {string}\n   */\n  function componentsToPath(elements) {\n    return elements.flat().join(',').replace(/,?([A-z]),?/g, '$1');\n  }\n\n  /**\n   * @param {Point} point\n   *\n   * @return {Component[]}\n   */\n  function move(point) {\n    return [ 'M', point.x, point.y ];\n  }\n\n  /**\n   * @param {Point} point\n   *\n   * @return {Component[]}\n   */\n  function lineTo(point) {\n    return [ 'L', point.x, point.y ];\n  }\n\n  /**\n   * @param {Point} p1\n   * @param {Point} p2\n   * @param {Point} p3\n   *\n   * @return {Component[]}\n   */\n  function curveTo(p1, p2, p3) {\n    return [ 'C', p1.x, p1.y, p2.x, p2.y, p3.x, p3.y ];\n  }\n\n  /**\n   * @param {Point[]} waypoints\n   * @param {number} [cornerRadius]\n   * @return {Component[][]}\n   */\n  function drawPath(waypoints, cornerRadius) {\n    const pointCount = waypoints.length;\n\n    const path = [ move(waypoints[0]) ];\n\n    for (let i = 1; i < pointCount; i++) {\n\n      const pointBefore = waypoints[i - 1];\n      const point = waypoints[i];\n      const pointAfter = waypoints[i + 1];\n\n      if (!pointAfter || !cornerRadius) {\n        path.push(lineTo(point));\n\n        continue;\n      }\n\n      const effectiveRadius = Math.min(\n        cornerRadius,\n        vectorLength(point.x - pointBefore.x, point.y - pointBefore.y),\n        vectorLength(pointAfter.x - point.x, pointAfter.y - point.y)\n      );\n\n      if (!effectiveRadius) {\n        path.push(lineTo(point));\n\n        continue;\n      }\n\n      const beforePoint = getPointAtLength(point, pointBefore, effectiveRadius);\n      const beforePoint2 = getPointAtLength(point, pointBefore, effectiveRadius * .5);\n\n      const afterPoint = getPointAtLength(point, pointAfter, effectiveRadius);\n      const afterPoint2 = getPointAtLength(point, pointAfter, effectiveRadius * .5);\n\n      path.push(lineTo(beforePoint));\n      path.push(curveTo(beforePoint2, afterPoint2, afterPoint));\n    }\n\n    return path;\n  }\n\n  function getPointAtLength(start, end, length) {\n\n    const deltaX = end.x - start.x;\n    const deltaY = end.y - start.y;\n\n    const totalLength = vectorLength(deltaX, deltaY);\n\n    const percent = length / totalLength;\n\n    return {\n      x: start.x + deltaX * percent,\n      y: start.y + deltaY * percent\n    };\n  }\n\n  function vectorLength(x, y) {\n    return Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));\n  }\n\n  /**\n   * @param {Point[]} points\n   * @param {number|Object} [attrs]\n   * @param {number} [radius]\n   *\n   * @return {SVGElement}\n   */\n  function createLine(points, attrs, radius) {\n\n    if (isNumber(attrs)) {\n      radius = attrs;\n      attrs = null;\n    }\n\n    if (!attrs) {\n      attrs = {};\n    }\n\n    const line = create$1('path', attrs);\n\n    if (isNumber(radius)) {\n      line.dataset.cornerRadius = String(radius);\n    }\n\n    return updateLine(line, points);\n  }\n\n  /**\n   * @param {SVGElement} gfx\n   * @param {Point[]} points\n   *\n   * @return {SVGElement}\n   */\n  function updateLine(gfx, points) {\n\n    const cornerRadius = parseInt(gfx.dataset.cornerRadius, 10) || 0;\n\n    attr$1(gfx, {\n      d: componentsToPath(drawPath(points, cornerRadius))\n    });\n\n    return gfx;\n  }\n\n  var black = 'hsl(225, 10%, 15%)';\n\n  // element utils //////////////////////\n\n  /**\n   * Checks if eventDefinition of the given element matches with semantic type.\n   *\n   * @param {ModdleElement} event\n   * @param {string} eventDefinitionType\n   *\n   * @return {boolean}\n   */\n  function isTypedEvent(event, eventDefinitionType) {\n    return some(event.eventDefinitions, function(definition) {\n      return definition.$type === eventDefinitionType;\n    });\n  }\n\n  /**\n   * Check if element is a throw event.\n   *\n   * @param {ModdleElement} event\n   *\n   * @return {boolean}\n   */\n  function isThrowEvent(event) {\n    return (event.$type === 'bpmn:IntermediateThrowEvent') || (event.$type === 'bpmn:EndEvent');\n  }\n\n  /**\n   * Check if element is a throw event.\n   *\n   * @param {ModdleElement} element\n   *\n   * @return {boolean}\n   */\n  function isCollection(element) {\n    var dataObject = element.dataObjectRef;\n\n    return element.isCollection || (dataObject && dataObject.isCollection);\n  }\n\n\n  // color access //////////////////////\n\n  /**\n   * @param {Element} element\n   * @param {string} [defaultColor]\n   *\n   * @return {string}\n   */\n  function getFillColor(element, defaultColor) {\n    var di = getDi(element);\n\n    return di.get('color:background-color') || di.get('bioc:fill') || defaultColor || 'white';\n  }\n\n  /**\n   * @param {Element} element\n   * @param {string} [defaultColor]\n   *\n   * @return {string}\n   */\n  function getStrokeColor(element, defaultColor) {\n    var di = getDi(element);\n\n    return di.get('color:border-color') || di.get('bioc:stroke') || defaultColor || black;\n  }\n\n  /**\n   * @param {Element} element\n   * @param {string} [defaultColor]\n   * @param {string} [defaultStrokeColor]\n   *\n   * @return {string}\n   */\n  function getLabelColor(element, defaultColor, defaultStrokeColor) {\n    var di = getDi(element),\n        label = di.get('label');\n\n    return label && label.get('color:color') || defaultColor ||\n      getStrokeColor(element, defaultStrokeColor);\n  }\n\n  // cropping path customizations //////////////////////\n\n  /**\n   * @param {ShapeLike} shape\n   *\n   * @return {string} path\n   */\n  function getCirclePath(shape) {\n\n    var cx = shape.x + shape.width / 2,\n        cy = shape.y + shape.height / 2,\n        radius = shape.width / 2;\n\n    var circlePath = [\n      [ 'M', cx, cy ],\n      [ 'm', 0, -radius ],\n      [ 'a', radius, radius, 0, 1, 1, 0, 2 * radius ],\n      [ 'a', radius, radius, 0, 1, 1, 0, -2 * radius ],\n      [ 'z' ]\n    ];\n\n    return componentsToPath(circlePath);\n  }\n\n  /**\n   * @param {ShapeLike} shape\n   * @param {number} [borderRadius]\n   *\n   * @return {string} path\n   */\n  function getRoundRectPath(shape, borderRadius) {\n\n    var x = shape.x,\n        y = shape.y,\n        width = shape.width,\n        height = shape.height;\n\n    var roundRectPath = [\n      [ 'M', x + borderRadius, y ],\n      [ 'l', width - borderRadius * 2, 0 ],\n      [ 'a', borderRadius, borderRadius, 0, 0, 1, borderRadius, borderRadius ],\n      [ 'l', 0, height - borderRadius * 2 ],\n      [ 'a', borderRadius, borderRadius, 0, 0, 1, -borderRadius, borderRadius ],\n      [ 'l', borderRadius * 2 - width, 0 ],\n      [ 'a', borderRadius, borderRadius, 0, 0, 1, -borderRadius, -borderRadius ],\n      [ 'l', 0, borderRadius * 2 - height ],\n      [ 'a', borderRadius, borderRadius, 0, 0, 1, borderRadius, -borderRadius ],\n      [ 'z' ]\n    ];\n\n    return componentsToPath(roundRectPath);\n  }\n\n  /**\n   * @param {ShapeLike} shape\n   *\n   * @return {string} path\n   */\n  function getDiamondPath(shape) {\n\n    var width = shape.width,\n        height = shape.height,\n        x = shape.x,\n        y = shape.y,\n        halfWidth = width / 2,\n        halfHeight = height / 2;\n\n    var diamondPath = [\n      [ 'M', x + halfWidth, y ],\n      [ 'l', halfWidth, halfHeight ],\n      [ 'l', -halfWidth, halfHeight ],\n      [ 'l', -halfWidth, -halfHeight ],\n      [ 'z' ]\n    ];\n\n    return componentsToPath(diamondPath);\n  }\n\n  /**\n   * @param {ShapeLike} shape\n   *\n   * @return {string} path\n   */\n  function getRectPath(shape) {\n    var x = shape.x,\n        y = shape.y,\n        width = shape.width,\n        height = shape.height;\n\n    var rectPath = [\n      [ 'M', x, y ],\n      [ 'l', width, 0 ],\n      [ 'l', 0, height ],\n      [ 'l', -width, 0 ],\n      [ 'z' ]\n    ];\n\n    return componentsToPath(rectPath);\n  }\n\n  function _mergeNamespaces$1(n, m) {\n    m.forEach(function (e) {\n      e && typeof e !== 'string' && !Array.isArray(e) && Object.keys(e).forEach(function (k) {\n        if (k !== 'default' && !(k in n)) {\n          var d = Object.getOwnPropertyDescriptor(e, k);\n          Object.defineProperty(n, k, d.get ? d : {\n            enumerable: true,\n            get: function () { return e[k]; }\n          });\n        }\n      });\n    });\n    return Object.freeze(n);\n  }\n\n  /**\n   * Flatten array, one level deep.\n   *\n   * @param {Array<?>} arr\n   *\n   * @return {Array<?>}\n   */\n\n  const nativeToString = Object.prototype.toString;\n  const nativeHasOwnProperty = Object.prototype.hasOwnProperty;\n\n  function isUndefined$1(obj) {\n    return obj === undefined;\n  }\n\n  function isArray$1(obj) {\n    return nativeToString.call(obj) === '[object Array]';\n  }\n\n  /**\n   * Return true, if target owns a property with the given key.\n   *\n   * @param {Object} target\n   * @param {String} key\n   *\n   * @return {Boolean}\n   */\n  function has(target, key) {\n    return nativeHasOwnProperty.call(target, key);\n  }\n\n\n  /**\n   * Iterate over collection; returning something\n   * (non-undefined) will stop iteration.\n   *\n   * @param  {Array|Object} collection\n   * @param  {Function} iterator\n   *\n   * @return {Object} return result that stopped the iteration\n   */\n  function forEach(collection, iterator) {\n\n    let val,\n        result;\n\n    if (isUndefined$1(collection)) {\n      return;\n    }\n\n    const convertKey = isArray$1(collection) ? toNum : identity;\n\n    for (let key in collection) {\n\n      if (has(collection, key)) {\n        val = collection[key];\n\n        result = iterator(val, convertKey(key));\n\n        if (result === false) {\n          return val;\n        }\n      }\n    }\n  }\n\n\n  function identity(arg) {\n    return arg;\n  }\n\n  function toNum(arg) {\n    return Number(arg);\n  }\n\n  /**\n   * Assigns style attributes in a style-src compliant way.\n   *\n   * @param {Element} element\n   * @param {...Object} styleSources\n   *\n   * @return {Element} the element\n   */\n  function assign(element, ...styleSources) {\n    const target = element.style;\n\n    forEach(styleSources, function(style) {\n      if (!style) {\n        return;\n      }\n\n      forEach(style, function(value, key) {\n        target[key] = value;\n      });\n    });\n\n    return element;\n  }\n\n  /**\n   * Set attribute `name` to `val`, or get attr `name`.\n   *\n   * @param {Element} el\n   * @param {String} name\n   * @param {String} [val]\n   * @api public\n   */\n  function attr(el, name, val) {\n\n    // get\n    if (arguments.length == 2) {\n      return el.getAttribute(name);\n    }\n\n    // remove\n    if (val === null) {\n      return el.removeAttribute(name);\n    }\n\n    // set\n    el.setAttribute(name, val);\n\n    return el;\n  }\n\n  /**\n   * Taken from https://github.com/component/classes\n   *\n   * Without the component bits.\n   */\n\n  /**\n   * toString reference.\n   */\n\n  const toString = Object.prototype.toString;\n\n  /**\n   * Wrap `el` in a `ClassList`.\n   *\n   * @param {Element} el\n   * @return {ClassList}\n   * @api public\n   */\n\n  function classes(el) {\n    return new ClassList(el);\n  }\n\n  /**\n   * Initialize a new ClassList for `el`.\n   *\n   * @param {Element} el\n   * @api private\n   */\n\n  function ClassList(el) {\n    if (!el || !el.nodeType) {\n      throw new Error('A DOM element reference is required');\n    }\n    this.el = el;\n    this.list = el.classList;\n  }\n\n  /**\n   * Add class `name` if not already present.\n   *\n   * @param {String} name\n   * @return {ClassList}\n   * @api public\n   */\n\n  ClassList.prototype.add = function(name) {\n    this.list.add(name);\n    return this;\n  };\n\n  /**\n   * Remove class `name` when present, or\n   * pass a regular expression to remove\n   * any which match.\n   *\n   * @param {String|RegExp} name\n   * @return {ClassList}\n   * @api public\n   */\n\n  ClassList.prototype.remove = function(name) {\n    if ('[object RegExp]' == toString.call(name)) {\n      return this.removeMatching(name);\n    }\n\n    this.list.remove(name);\n    return this;\n  };\n\n  /**\n   * Remove all classes matching `re`.\n   *\n   * @param {RegExp} re\n   * @return {ClassList}\n   * @api private\n   */\n\n  ClassList.prototype.removeMatching = function(re) {\n    const arr = this.array();\n    for (let i = 0; i < arr.length; i++) {\n      if (re.test(arr[i])) {\n        this.remove(arr[i]);\n      }\n    }\n    return this;\n  };\n\n  /**\n   * Toggle class `name`, can force state via `force`.\n   *\n   * For browsers that support classList, but do not support `force` yet,\n   * the mistake will be detected and corrected.\n   *\n   * @param {String} name\n   * @param {Boolean} force\n   * @return {ClassList}\n   * @api public\n   */\n\n  ClassList.prototype.toggle = function(name, force) {\n    if ('undefined' !== typeof force) {\n      if (force !== this.list.toggle(name, force)) {\n        this.list.toggle(name); // toggle again to correct\n      }\n    } else {\n      this.list.toggle(name);\n    }\n    return this;\n  };\n\n  /**\n   * Return an array of classes.\n   *\n   * @return {Array}\n   * @api public\n   */\n\n  ClassList.prototype.array = function() {\n    return Array.from(this.list);\n  };\n\n  /**\n   * Check if class `name` is present.\n   *\n   * @param {String} name\n   * @return {ClassList}\n   * @api public\n   */\n\n  ClassList.prototype.has =\n  ClassList.prototype.contains = function(name) {\n    return this.list.contains(name);\n  };\n\n  /**\n   * Remove all children from the given element.\n   */\n  function clear(el) {\n\n    var c;\n\n    while (el.childNodes.length) {\n      c = el.childNodes[0];\n      el.removeChild(c);\n    }\n\n    return el;\n  }\n\n  /**\n   * @param { HTMLElement } element\n   * @param { String } selector\n   *\n   * @return { boolean }\n   */\n  function matches(element, selector) {\n    return element && typeof element.matches === 'function' && element.matches(selector);\n  }\n\n  /**\n   * Closest\n   *\n   * @param {Element} el\n   * @param {String} selector\n   * @param {Boolean} checkYourSelf (optional)\n   */\n  function closest(element, selector, checkYourSelf) {\n    var currentElem = checkYourSelf ? element : element.parentNode;\n\n    while (currentElem && currentElem.nodeType !== document.DOCUMENT_NODE &&\n        currentElem.nodeType !== document.DOCUMENT_FRAGMENT_NODE) {\n\n      if (matches(currentElem, selector)) {\n        return currentElem;\n      }\n\n      currentElem = currentElem.parentNode;\n    }\n\n    return matches(currentElem, selector) ? currentElem : null;\n  }\n\n  var componentEvent = {};\n\n  var bind$1, unbind$1, prefix$6;\n\n  function detect () {\n    bind$1 = window.addEventListener ? 'addEventListener' : 'attachEvent';\n    unbind$1 = window.removeEventListener ? 'removeEventListener' : 'detachEvent';\n    prefix$6 = bind$1 !== 'addEventListener' ? 'on' : '';\n  }\n\n  /**\n   * Bind `el` event `type` to `fn`.\n   *\n   * @param {Element} el\n   * @param {String} type\n   * @param {Function} fn\n   * @param {Boolean} capture\n   * @return {Function}\n   * @api public\n   */\n\n  var bind_1 = componentEvent.bind = function(el, type, fn, capture){\n    if (!bind$1) detect();\n    el[bind$1](prefix$6 + type, fn, capture || false);\n    return fn;\n  };\n\n  /**\n   * Unbind `el` event `type`'s callback `fn`.\n   *\n   * @param {Element} el\n   * @param {String} type\n   * @param {Function} fn\n   * @param {Boolean} capture\n   * @return {Function}\n   * @api public\n   */\n\n  var unbind_1 = componentEvent.unbind = function(el, type, fn, capture){\n    if (!unbind$1) detect();\n    el[unbind$1](prefix$6 + type, fn, capture || false);\n    return fn;\n  };\n\n  var event = /*#__PURE__*/_mergeNamespaces$1({\n    __proto__: null,\n    bind: bind_1,\n    unbind: unbind_1,\n    'default': componentEvent\n  }, [componentEvent]);\n\n  /**\n   * Module dependencies.\n   */\n\n  /**\n   * Delegate event `type` to `selector`\n   * and invoke `fn(e)`. A callback function\n   * is returned which may be passed to `.unbind()`.\n   *\n   * @param {Element} el\n   * @param {String} selector\n   * @param {String} type\n   * @param {Function} fn\n   * @param {Boolean} capture\n   * @return {Function}\n   * @api public\n   */\n\n  // Some events don't bubble, so we want to bind to the capture phase instead\n  // when delegating.\n  var forceCaptureEvents = [ 'focus', 'blur' ];\n\n  function bind(el, selector, type, fn, capture) {\n    if (forceCaptureEvents.indexOf(type) !== -1) {\n      capture = true;\n    }\n\n    return event.bind(el, type, function(e) {\n      var target = e.target || e.srcElement;\n      e.delegateTarget = closest(target, selector, true);\n      if (e.delegateTarget) {\n        fn.call(el, e);\n      }\n    }, capture);\n  }\n\n  /**\n   * Unbind event `type`'s callback `fn`.\n   *\n   * @param {Element} el\n   * @param {String} type\n   * @param {Function} fn\n   * @param {Boolean} capture\n   * @api public\n   */\n  function unbind(el, type, fn, capture) {\n    if (forceCaptureEvents.indexOf(type) !== -1) {\n      capture = true;\n    }\n\n    return event.unbind(el, type, fn, capture);\n  }\n\n  var delegate = {\n    bind,\n    unbind\n  };\n\n  /**\n   * Expose `parse`.\n   */\n\n  var domify = parse;\n\n  /**\n   * Tests for browser support.\n   */\n\n  var innerHTMLBug = false;\n  var bugTestDiv;\n  if (typeof document !== 'undefined') {\n    bugTestDiv = document.createElement('div');\n    // Setup\n    bugTestDiv.innerHTML = '  <link/><table></table><a href=\"/a\">a</a><input type=\"checkbox\"/>';\n    // Make sure that link elements get serialized correctly by innerHTML\n    // This requires a wrapper element in IE\n    innerHTMLBug = !bugTestDiv.getElementsByTagName('link').length;\n    bugTestDiv = undefined;\n  }\n\n  /**\n   * Wrap map from jquery.\n   */\n\n  var map = {\n    legend: [1, '<fieldset>', '</fieldset>'],\n    tr: [2, '<table><tbody>', '</tbody></table>'],\n    col: [2, '<table><tbody></tbody><colgroup>', '</colgroup></table>'],\n    // for script/link/style tags to work in IE6-8, you have to wrap\n    // in a div with a non-whitespace character in front, ha!\n    _default: innerHTMLBug ? [1, 'X<div>', '</div>'] : [0, '', '']\n  };\n\n  map.td =\n  map.th = [3, '<table><tbody><tr>', '</tr></tbody></table>'];\n\n  map.option =\n  map.optgroup = [1, '<select multiple=\"multiple\">', '</select>'];\n\n  map.thead =\n  map.tbody =\n  map.colgroup =\n  map.caption =\n  map.tfoot = [1, '<table>', '</table>'];\n\n  map.polyline =\n  map.ellipse =\n  map.polygon =\n  map.circle =\n  map.text =\n  map.line =\n  map.path =\n  map.rect =\n  map.g = [1, '<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\">','</svg>'];\n\n  /**\n   * Parse `html` and return a DOM Node instance, which could be a TextNode,\n   * HTML DOM Node of some kind (<div> for example), or a DocumentFragment\n   * instance, depending on the contents of the `html` string.\n   *\n   * @param {String} html - HTML string to \"domify\"\n   * @param {Document} doc - The `document` instance to create the Node for\n   * @return {DOMNode} the TextNode, DOM Node, or DocumentFragment instance\n   * @api private\n   */\n\n  function parse(html, doc) {\n    if ('string' != typeof html) throw new TypeError('String expected');\n\n    // default to the global `document` object\n    if (!doc) doc = document;\n\n    // tag name\n    var m = /<([\\w:]+)/.exec(html);\n    if (!m) return doc.createTextNode(html);\n\n    html = html.replace(/^\\s+|\\s+$/g, ''); // Remove leading/trailing whitespace\n\n    var tag = m[1];\n\n    // body support\n    if (tag == 'body') {\n      var el = doc.createElement('html');\n      el.innerHTML = html;\n      return el.removeChild(el.lastChild);\n    }\n\n    // wrap map\n    var wrap = Object.prototype.hasOwnProperty.call(map, tag) ? map[tag] : map._default;\n    var depth = wrap[0];\n    var prefix = wrap[1];\n    var suffix = wrap[2];\n    var el = doc.createElement('div');\n    el.innerHTML = prefix + html + suffix;\n    while (depth--) el = el.lastChild;\n\n    // one element\n    if (el.firstChild == el.lastChild) {\n      return el.removeChild(el.firstChild);\n    }\n\n    // several elements\n    var fragment = doc.createDocumentFragment();\n    while (el.firstChild) {\n      fragment.appendChild(el.removeChild(el.firstChild));\n    }\n\n    return fragment;\n  }\n\n  var domify$1 = domify;\n\n  function query(selector, el) {\n    el = el || document;\n\n    return el.querySelector(selector);\n  }\n\n  function all(selector, el) {\n    el = el || document;\n\n    return el.querySelectorAll(selector);\n  }\n\n  function remove$1(el) {\n    el.parentNode && el.parentNode.removeChild(el);\n  }\n\n  /**\r\n   * @param {SVGElement} gfx\r\n   * @param {number} x\r\n   * @param {number} y\r\n   * @param {number} [angle]\r\n   * @param {number} [amount]\r\n   */\r\n  function transform(gfx, x, y, angle, amount) {\r\n    var translate = createTransform();\r\n    translate.setTranslate(x, y);\r\n\r\n    var rotate = createTransform();\r\n    rotate.setRotate(angle || 0, 0, 0);\r\n\r\n    var scale = createTransform();\r\n    scale.setScale(amount || 1, amount || 1);\r\n\r\n    transform$1(gfx, [ translate, rotate, scale ]);\r\n  }\r\n\r\n\r\n  /**\r\n   * @param {SVGElement} gfx\r\n   * @param {number} x\r\n   * @param {number} y\r\n   */\r\n  function translate$1(gfx, x, y) {\r\n    var translate = createTransform();\r\n    translate.setTranslate(x, y);\r\n\r\n    transform$1(gfx, translate);\r\n  }\r\n\r\n\r\n  /**\r\n   * @param {SVGElement} gfx\r\n   * @param {number} angle\r\n   */\r\n  function rotate(gfx, angle) {\r\n    var rotate = createTransform();\r\n    rotate.setRotate(angle, 0, 0);\r\n\r\n    transform$1(gfx, rotate);\r\n  }\n\n  function createCommonjsModule(fn, module) {\n  \treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n  }\n\n  var hat_1 = createCommonjsModule(function (module) {\n  var hat = module.exports = function (bits, base) {\n      if (!base) base = 16;\n      if (bits === undefined) bits = 128;\n      if (bits <= 0) return '0';\n      \n      var digits = Math.log(Math.pow(2, bits)) / Math.log(base);\n      for (var i = 2; digits === Infinity; i *= 2) {\n          digits = Math.log(Math.pow(2, bits / i)) / Math.log(base) * i;\n      }\n      \n      var rem = digits - Math.floor(digits);\n      \n      var res = '';\n      \n      for (var i = 0; i < Math.floor(digits); i++) {\n          var x = Math.floor(Math.random() * base).toString(base);\n          res = x + res;\n      }\n      \n      if (rem) {\n          var b = Math.pow(base, rem);\n          var x = Math.floor(Math.random() * b).toString(base);\n          res = x + res;\n      }\n      \n      var parsed = parseInt(res, base);\n      if (parsed !== Infinity && parsed >= Math.pow(2, bits)) {\n          return hat(bits, base)\n      }\n      else return res;\n  };\n\n  hat.rack = function (bits, base, expandBy) {\n      var fn = function (data) {\n          var iters = 0;\n          do {\n              if (iters ++ > 10) {\n                  if (expandBy) bits += expandBy;\n                  else throw new Error('too many ID collisions, use more bits')\n              }\n              \n              var id = hat(bits, base);\n          } while (Object.hasOwnProperty.call(hats, id));\n          \n          hats[id] = data;\n          return id;\n      };\n      var hats = fn.hats = {};\n      \n      fn.get = function (id) {\n          return fn.hats[id];\n      };\n      \n      fn.set = function (id, value) {\n          fn.hats[id] = value;\n          return fn;\n      };\n      \n      fn.bits = bits || 128;\n      fn.base = base || 16;\n      return fn;\n  };\n  });\n\n  /**\n   * Create a new id generator / cache instance.\n   *\n   * You may optionally provide a seed that is used internally.\n   *\n   * @param {Seed} seed\n   */\n\n  function Ids(seed) {\n    if (!(this instanceof Ids)) {\n      return new Ids(seed);\n    }\n\n    seed = seed || [128, 36, 1];\n    this._seed = seed.length ? hat_1.rack(seed[0], seed[1], seed[2]) : seed;\n  }\n  /**\n   * Generate a next id.\n   *\n   * @param {Object} [element] element to bind the id to\n   *\n   * @return {String} id\n   */\n\n  Ids.prototype.next = function (element) {\n    return this._seed(element || true);\n  };\n  /**\n   * Generate a next id with a given prefix.\n   *\n   * @param {Object} [element] element to bind the id to\n   *\n   * @return {String} id\n   */\n\n\n  Ids.prototype.nextPrefixed = function (prefix, element) {\n    var id;\n\n    do {\n      id = prefix + this.next(true);\n    } while (this.assigned(id)); // claim {prefix}{random}\n\n\n    this.claim(id, element); // return\n\n    return id;\n  };\n  /**\n   * Manually claim an existing id.\n   *\n   * @param {String} id\n   * @param {String} [element] element the id is claimed by\n   */\n\n\n  Ids.prototype.claim = function (id, element) {\n    this._seed.set(id, element || true);\n  };\n  /**\n   * Returns true if the given id has already been assigned.\n   *\n   * @param  {String} id\n   * @return {Boolean}\n   */\n\n\n  Ids.prototype.assigned = function (id) {\n    return this._seed.get(id) || false;\n  };\n  /**\n   * Unclaim an id.\n   *\n   * @param  {String} id the id to unclaim\n   */\n\n\n  Ids.prototype.unclaim = function (id) {\n    delete this._seed.hats[id];\n  };\n  /**\n   * Clear all claimed ids.\n   */\n\n\n  Ids.prototype.clear = function () {\n    var hats = this._seed.hats,\n        id;\n\n    for (id in hats) {\n      this.unclaim(id);\n    }\n  };\n\n  var RENDERER_IDS = new Ids();\n\n  var TASK_BORDER_RADIUS = 10;\n  var INNER_OUTER_DIST = 3;\n\n  var DEFAULT_FILL_OPACITY = .95,\n      HIGH_FILL_OPACITY = .35;\n\n  var ELEMENT_LABEL_DISTANCE = 10;\n\n  /**\n   * @typedef { Partial<{\n   *   defaultFillColor: string,\n   *   defaultStrokeColor: string,\n   *   defaultLabelColor: string\n   * }> } BpmnRendererConfig\n   */\n\n  /**\n   * @typedef { import('../model/Types').Element } Element\n   */\n\n  /**\n   * A renderer for BPMN elements\n   *\n   * @param {BpmnRendererConfig} config\n   * @param {import('diagram-js/lib/core/EventBus').default} eventBus\n   * @param {import('diagram-js/lib/draw/Styles').default} styles\n   * @param {import('./PathMap').default} pathMap\n   * @param {import('diagram-js/lib/core/Canvas').default} canvas\n   * @param {import('./TextRenderer').default} textRenderer\n   * @param {number} [priority]\n   */\n  function BpmnRenderer(\n      config, eventBus, styles, pathMap,\n      canvas, textRenderer, priority) {\n\n    BaseRenderer.call(this, eventBus, priority);\n\n    var defaultFillColor = config && config.defaultFillColor,\n        defaultStrokeColor = config && config.defaultStrokeColor,\n        defaultLabelColor = config && config.defaultLabelColor;\n\n    var rendererId = RENDERER_IDS.next();\n\n    var markers = {};\n\n    function shapeStyle(attrs) {\n      return styles.computeStyle(attrs, {\n        strokeLinecap: 'round',\n        strokeLinejoin: 'round',\n        stroke: black,\n        strokeWidth: 2,\n        fill: 'white'\n      });\n    }\n\n    function lineStyle(attrs) {\n      return styles.computeStyle(attrs, [ 'no-fill' ], {\n        strokeLinecap: 'round',\n        strokeLinejoin: 'round',\n        stroke: black,\n        strokeWidth: 2\n      });\n    }\n\n    function addMarker(id, options) {\n      var {\n        ref = { x: 0, y: 0 },\n        scale = 1,\n        element\n      } = options;\n\n      var marker = create$1('marker', {\n        id: id,\n        viewBox: '0 0 20 20',\n        refX: ref.x,\n        refY: ref.y,\n        markerWidth: 20 * scale,\n        markerHeight: 20 * scale,\n        orient: 'auto'\n      });\n\n      append(marker, element);\n\n      var defs = query('defs', canvas._svg);\n\n      if (!defs) {\n        defs = create$1('defs');\n\n        append(canvas._svg, defs);\n      }\n\n      append(defs, marker);\n\n      markers[id] = marker;\n    }\n\n    function colorEscape(str) {\n\n      // only allow characters and numbers\n      return str.replace(/[^0-9a-zA-Z]+/g, '_');\n    }\n\n    function marker(type, fill, stroke) {\n      var id = type + '-' + colorEscape(fill) + '-' + colorEscape(stroke) + '-' + rendererId;\n\n      if (!markers[id]) {\n        createMarker(id, type, fill, stroke);\n      }\n\n      return 'url(#' + id + ')';\n    }\n\n    function createMarker(id, type, fill, stroke) {\n\n      if (type === 'sequenceflow-end') {\n        var sequenceflowEnd = create$1('path', {\n          d: 'M 1 5 L 11 10 L 1 15 Z',\n          ...shapeStyle({\n            fill: stroke,\n            stroke: stroke,\n            strokeWidth: 1\n          })\n        });\n\n        addMarker(id, {\n          element: sequenceflowEnd,\n          ref: { x: 11, y: 10 },\n          scale: 0.5\n        });\n      }\n\n      if (type === 'messageflow-start') {\n        var messageflowStart = create$1('circle', {\n          cx: 6,\n          cy: 6,\n          r: 3.5,\n          ...shapeStyle({\n            fill: fill,\n            stroke: stroke,\n            strokeWidth: 1,\n\n            // fix for safari / chrome / firefox bug not correctly\n            // resetting stroke dash array\n            strokeDasharray: [ 10000, 1 ]\n          })\n        });\n\n        addMarker(id, {\n          element: messageflowStart,\n          ref: { x: 6, y: 6 }\n        });\n      }\n\n      if (type === 'messageflow-end') {\n        var messageflowEnd = create$1('path', {\n          d: 'm 1 5 l 0 -3 l 7 3 l -7 3 z',\n          ...shapeStyle({\n            fill: fill,\n            stroke: stroke,\n            strokeWidth: 1,\n\n            // fix for safari / chrome / firefox bug not correctly\n            // resetting stroke dash array\n            strokeDasharray: [ 10000, 1 ]\n          })\n        });\n\n        addMarker(id, {\n          element: messageflowEnd,\n          ref: { x: 8.5, y: 5 }\n        });\n      }\n\n      if (type === 'association-start') {\n        var associationStart = create$1('path', {\n          d: 'M 11 5 L 1 10 L 11 15',\n          ...lineStyle({\n            fill: 'none',\n            stroke: stroke,\n            strokeWidth: 1.5,\n\n            // fix for safari / chrome / firefox bug not correctly\n            // resetting stroke dash array\n            strokeDasharray: [ 10000, 1 ]\n          })\n        });\n\n        addMarker(id, {\n          element: associationStart,\n          ref: { x: 1, y: 10 },\n          scale: 0.5\n        });\n      }\n\n      if (type === 'association-end') {\n        var associationEnd = create$1('path', {\n          d: 'M 1 5 L 11 10 L 1 15',\n          ...lineStyle({\n            fill: 'none',\n            stroke: stroke,\n            strokeWidth: 1.5,\n\n            // fix for safari / chrome / firefox bug not correctly\n            // resetting stroke dash array\n            strokeDasharray: [ 10000, 1 ]\n          })\n        });\n\n        addMarker(id, {\n          element: associationEnd,\n          ref: { x: 11, y: 10 },\n          scale: 0.5\n        });\n      }\n\n      if (type === 'conditional-flow-marker') {\n        var conditionalFlowMarker = create$1('path', {\n          d: 'M 0 10 L 8 6 L 16 10 L 8 14 Z',\n          ...shapeStyle({\n            fill: fill,\n            stroke: stroke\n          })\n        });\n\n        addMarker(id, {\n          element: conditionalFlowMarker,\n          ref: { x: -1, y: 10 },\n          scale: 0.5\n        });\n      }\n\n      if (type === 'conditional-default-flow-marker') {\n        var defaultFlowMarker = create$1('path', {\n          d: 'M 6 4 L 10 16',\n          ...shapeStyle({\n            stroke: stroke\n          })\n        });\n\n        addMarker(id, {\n          element: defaultFlowMarker,\n          ref: { x: 0, y: 10 },\n          scale: 0.5\n        });\n      }\n    }\n\n    function drawCircle(parentGfx, width, height, offset, attrs) {\n\n      if (isObject(offset)) {\n        attrs = offset;\n        offset = 0;\n      }\n\n      offset = offset || 0;\n\n      attrs = shapeStyle(attrs);\n\n      if (attrs.fill === 'none') {\n        delete attrs.fillOpacity;\n      }\n\n      var cx = width / 2,\n          cy = height / 2;\n\n      var circle = create$1('circle', {\n        cx: cx,\n        cy: cy,\n        r: Math.round((width + height) / 4 - offset),\n        ...attrs\n      });\n\n      append(parentGfx, circle);\n\n      return circle;\n    }\n\n    function drawRect(parentGfx, width, height, r, offset, attrs) {\n\n      if (isObject(offset)) {\n        attrs = offset;\n        offset = 0;\n      }\n\n      offset = offset || 0;\n\n      attrs = shapeStyle(attrs);\n\n      var rect = create$1('rect', {\n        x: offset,\n        y: offset,\n        width: width - offset * 2,\n        height: height - offset * 2,\n        rx: r,\n        ry: r,\n        ...attrs\n      });\n\n      append(parentGfx, rect);\n\n      return rect;\n    }\n\n    function drawDiamond(parentGfx, width, height, attrs) {\n\n      var x_2 = width / 2;\n      var y_2 = height / 2;\n\n      var points = [\n        { x: x_2, y: 0 },\n        { x: width, y: y_2 },\n        { x: x_2, y: height },\n        { x: 0, y: y_2 }\n      ];\n\n      var pointsString = points.map(function(point) {\n        return point.x + ',' + point.y;\n      }).join(' ');\n\n      attrs = shapeStyle(attrs);\n\n      var polygon = create$1('polygon', {\n        ...attrs,\n        points: pointsString\n      });\n\n      append(parentGfx, polygon);\n\n      return polygon;\n    }\n\n    /**\n     * @param {SVGElement} parentGfx\n     * @param {Point[]} waypoints\n     * @param {any} attrs\n     * @param {number} [radius]\n     *\n     * @return {SVGElement}\n     */\n    function drawLine(parentGfx, waypoints, attrs, radius) {\n      attrs = lineStyle(attrs);\n\n      var line = createLine(waypoints, attrs, radius);\n\n      append(parentGfx, line);\n\n      return line;\n    }\n\n    /**\n     * @param {SVGElement} parentGfx\n     * @param {Point[]} waypoints\n     * @param {any} attrs\n     *\n     * @return {SVGElement}\n     */\n    function drawConnectionSegments(parentGfx, waypoints, attrs) {\n      return drawLine(parentGfx, waypoints, attrs, 5);\n    }\n\n    function drawPath(parentGfx, d, attrs) {\n\n      attrs = lineStyle(attrs);\n\n      var path = create$1('path', {\n        ...attrs,\n        d\n      });\n\n      append(parentGfx, path);\n\n      return path;\n    }\n\n    function drawMarker(type, parentGfx, path, attrs) {\n      return drawPath(parentGfx, path, assign$1({ 'data-marker': type }, attrs));\n    }\n\n    function renderer(type) {\n      return handlers[type];\n    }\n\n    function as(type) {\n      return function(parentGfx, element, options) {\n        return renderer(type)(parentGfx, element, options);\n      };\n    }\n\n    function renderEventContent(element, parentGfx) {\n\n      var event = getBusinessObject(element);\n      var isThrowing = isThrowEvent(event);\n\n      if (event.eventDefinitions && event.eventDefinitions.length > 1) {\n        if (event.parallelMultiple) {\n          return renderer('bpmn:ParallelMultipleEventDefinition')(parentGfx, element, isThrowing);\n        }\n        else {\n          return renderer('bpmn:MultipleEventDefinition')(parentGfx, element, isThrowing);\n        }\n      }\n\n      if (isTypedEvent(event, 'bpmn:MessageEventDefinition')) {\n        return renderer('bpmn:MessageEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:TimerEventDefinition')) {\n        return renderer('bpmn:TimerEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:ConditionalEventDefinition')) {\n        return renderer('bpmn:ConditionalEventDefinition')(parentGfx, element);\n      }\n\n      if (isTypedEvent(event, 'bpmn:SignalEventDefinition')) {\n        return renderer('bpmn:SignalEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:EscalationEventDefinition')) {\n        return renderer('bpmn:EscalationEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:LinkEventDefinition')) {\n        return renderer('bpmn:LinkEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:ErrorEventDefinition')) {\n        return renderer('bpmn:ErrorEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:CancelEventDefinition')) {\n        return renderer('bpmn:CancelEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:CompensateEventDefinition')) {\n        return renderer('bpmn:CompensateEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:TerminateEventDefinition')) {\n        return renderer('bpmn:TerminateEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      return null;\n    }\n\n    function renderLabel(parentGfx, label, options) {\n\n      options = assign$1({\n        size: {\n          width: 100\n        }\n      }, options);\n\n      var text = textRenderer.createText(label || '', options);\n\n      classes$1(text).add('djs-label');\n\n      append(parentGfx, text);\n\n      return text;\n    }\n\n    function renderEmbeddedLabel(parentGfx, element, align) {\n      var semantic = getBusinessObject(element);\n\n      return renderLabel(parentGfx, semantic.name, {\n        box: element,\n        align: align,\n        padding: 7,\n        style: {\n          fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor)\n        }\n      });\n    }\n\n    function renderExternalLabel(parentGfx, element) {\n\n      var box = {\n        width: 90,\n        height: 30,\n        x: element.width / 2 + element.x,\n        y: element.height / 2 + element.y\n      };\n\n      return renderLabel(parentGfx, getLabel(element), {\n        box: box,\n        fitBox: true,\n        style: assign$1(\n          {},\n          textRenderer.getExternalStyle(),\n          {\n            fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor)\n          }\n        )\n      });\n    }\n\n    function renderLaneLabel(parentGfx, text, element) {\n      var textBox = renderLabel(parentGfx, text, {\n        box: {\n          height: 30,\n          width: element.height\n        },\n        align: 'center-middle',\n        style: {\n          fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor)\n        }\n      });\n\n      var top = -1 * element.height;\n\n      transform(textBox, 0, -top, 270);\n    }\n\n    var handlers = this.handlers = {\n      'bpmn:Event': function(parentGfx, element, attrs) {\n\n        if (!('fillOpacity' in attrs)) {\n          attrs.fillOpacity = DEFAULT_FILL_OPACITY;\n        }\n\n        return drawCircle(parentGfx, element.width, element.height, attrs);\n      },\n      'bpmn:StartEvent': function(parentGfx, element, options) {\n        var attrs = {\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        };\n\n        var semantic = getBusinessObject(element);\n\n        if (!semantic.isInterrupting) {\n          attrs = {\n            strokeDasharray: '6',\n            fill: getFillColor(element, defaultFillColor),\n            stroke: getStrokeColor(element, defaultStrokeColor)\n          };\n        }\n\n        var circle = renderer('bpmn:Event')(parentGfx, element, attrs);\n\n        if (!options || options.renderIcon !== false) {\n          renderEventContent(element, parentGfx);\n        }\n\n        return circle;\n      },\n      'bpmn:MessageEventDefinition': function(parentGfx, element, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_MESSAGE', {\n          xScaleFactor: 0.9,\n          yScaleFactor: 0.9,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.235,\n            my: 0.315\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor(element, defaultStrokeColor) : getFillColor(element, defaultFillColor);\n        var stroke = isThrowing ? getFillColor(element, defaultFillColor) : getStrokeColor(element, defaultStrokeColor);\n\n        var messagePath = drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: stroke\n        });\n\n        return messagePath;\n      },\n      'bpmn:TimerEventDefinition': function(parentGfx, element) {\n        var circle = drawCircle(parentGfx, element.width, element.height, 0.2 * element.height, {\n          strokeWidth: 2,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        var pathData = pathMap.getScaledPath('EVENT_TIMER_WH', {\n          xScaleFactor: 0.75,\n          yScaleFactor: 0.75,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.5,\n            my: 0.5\n          }\n        });\n\n        drawPath(parentGfx, pathData, {\n          strokeWidth: 2,\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        for (var i = 0;i < 12; i++) {\n\n          var linePathData = pathMap.getScaledPath('EVENT_TIMER_LINE', {\n            xScaleFactor: 0.75,\n            yScaleFactor: 0.75,\n            containerWidth: element.width,\n            containerHeight: element.height,\n            position: {\n              mx: 0.5,\n              my: 0.5\n            }\n          });\n\n          var width = element.width / 2;\n          var height = element.height / 2;\n\n          drawPath(parentGfx, linePathData, {\n            strokeWidth: 1,\n            transform: 'rotate(' + (i * 30) + ',' + height + ',' + width + ')',\n            stroke: getStrokeColor(element, defaultStrokeColor)\n          });\n        }\n\n        return circle;\n      },\n      'bpmn:EscalationEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_ESCALATION', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.5,\n            my: 0.2\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor(event, defaultStrokeColor) : 'none';\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: getStrokeColor(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:ConditionalEventDefinition': function(parentGfx, event) {\n        var pathData = pathMap.getScaledPath('EVENT_CONDITIONAL', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.5,\n            my: 0.222\n          }\n        });\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          stroke: getStrokeColor(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:LinkEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_LINK', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.57,\n            my: 0.263\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor(event, defaultStrokeColor) : 'none';\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: getStrokeColor(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:ErrorEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_ERROR', {\n          xScaleFactor: 1.1,\n          yScaleFactor: 1.1,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.2,\n            my: 0.722\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor(event, defaultStrokeColor) : 'none';\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: getStrokeColor(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:CancelEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_CANCEL_45', {\n          xScaleFactor: 1.0,\n          yScaleFactor: 1.0,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.638,\n            my: -0.055\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor(event, defaultStrokeColor) : 'none';\n\n        var path = drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: getStrokeColor(event, defaultStrokeColor)\n        });\n\n        rotate(path, 45);\n\n        return path;\n      },\n      'bpmn:CompensateEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_COMPENSATION', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.22,\n            my: 0.5\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor(event, defaultStrokeColor) : 'none';\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: getStrokeColor(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:SignalEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_SIGNAL', {\n          xScaleFactor: 0.9,\n          yScaleFactor: 0.9,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.5,\n            my: 0.2\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor(event, defaultStrokeColor) : 'none';\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: getStrokeColor(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:MultipleEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_MULTIPLE', {\n          xScaleFactor: 1.1,\n          yScaleFactor: 1.1,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.222,\n            my: 0.36\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor(event, defaultStrokeColor) : 'none';\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill\n        });\n      },\n      'bpmn:ParallelMultipleEventDefinition': function(parentGfx, event) {\n        var pathData = pathMap.getScaledPath('EVENT_PARALLEL_MULTIPLE', {\n          xScaleFactor: 1.2,\n          yScaleFactor: 1.2,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.458,\n            my: 0.194\n          }\n        });\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: getStrokeColor(event, defaultStrokeColor),\n          stroke: getStrokeColor(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:EndEvent': function(parentGfx, element, options) {\n        var circle = renderer('bpmn:Event')(parentGfx, element, {\n          strokeWidth: 4,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        if (!options || options.renderIcon !== false) {\n          renderEventContent(element, parentGfx);\n        }\n\n        return circle;\n      },\n      'bpmn:TerminateEventDefinition': function(parentGfx, element) {\n        var circle = drawCircle(parentGfx, element.width, element.height, 8, {\n          strokeWidth: 4,\n          fill: getStrokeColor(element, defaultStrokeColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return circle;\n      },\n      'bpmn:IntermediateEvent': function(parentGfx, element, options) {\n        var outer = renderer('bpmn:Event')(parentGfx, element, {\n          strokeWidth: 1.5,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        /* inner */\n        drawCircle(parentGfx, element.width, element.height, INNER_OUTER_DIST, {\n          strokeWidth: 1.5,\n          fill: getFillColor(element, 'none'),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        if (!options || options.renderIcon !== false) {\n          renderEventContent(element, parentGfx);\n        }\n\n        return outer;\n      },\n      'bpmn:IntermediateCatchEvent': as('bpmn:IntermediateEvent'),\n      'bpmn:IntermediateThrowEvent': as('bpmn:IntermediateEvent'),\n\n      'bpmn:Activity': function(parentGfx, element, attrs) {\n\n        attrs = attrs || {};\n\n        if (!('fillOpacity' in attrs)) {\n          attrs.fillOpacity = DEFAULT_FILL_OPACITY;\n        }\n\n        return drawRect(parentGfx, element.width, element.height, TASK_BORDER_RADIUS, attrs);\n      },\n\n      'bpmn:Task': function(parentGfx, element) {\n        var attrs = {\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        };\n\n        var rect = renderer('bpmn:Activity')(parentGfx, element, attrs);\n\n        renderEmbeddedLabel(parentGfx, element, 'center-middle');\n        attachTaskMarkers(parentGfx, element);\n\n        return rect;\n      },\n      'bpmn:ServiceTask': function(parentGfx, element) {\n        var task = renderer('bpmn:Task')(parentGfx, element);\n\n        var pathDataBG = pathMap.getScaledPath('TASK_TYPE_SERVICE', {\n          abspos: {\n            x: 12,\n            y: 18\n          }\n        });\n\n        /* service bg */ drawPath(parentGfx, pathDataBG, {\n          strokeWidth: 1,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        var fillPathData = pathMap.getScaledPath('TASK_TYPE_SERVICE_FILL', {\n          abspos: {\n            x: 17.2,\n            y: 18\n          }\n        });\n\n        /* service fill */ drawPath(parentGfx, fillPathData, {\n          strokeWidth: 0,\n          fill: getFillColor(element, defaultFillColor)\n        });\n\n        var pathData = pathMap.getScaledPath('TASK_TYPE_SERVICE', {\n          abspos: {\n            x: 17,\n            y: 22\n          }\n        });\n\n        /* service */ drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return task;\n      },\n      'bpmn:UserTask': function(parentGfx, element) {\n        var task = renderer('bpmn:Task')(parentGfx, element);\n\n        var x = 15;\n        var y = 12;\n\n        var pathData = pathMap.getScaledPath('TASK_TYPE_USER_1', {\n          abspos: {\n            x: x,\n            y: y\n          }\n        });\n\n        /* user path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 0.5,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        var pathData2 = pathMap.getScaledPath('TASK_TYPE_USER_2', {\n          abspos: {\n            x: x,\n            y: y\n          }\n        });\n\n        /* user2 path */ drawPath(parentGfx, pathData2, {\n          strokeWidth: 0.5,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        var pathData3 = pathMap.getScaledPath('TASK_TYPE_USER_3', {\n          abspos: {\n            x: x,\n            y: y\n          }\n        });\n\n        /* user3 path */ drawPath(parentGfx, pathData3, {\n          strokeWidth: 0.5,\n          fill: getStrokeColor(element, defaultStrokeColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return task;\n      },\n      'bpmn:ManualTask': function(parentGfx, element) {\n        var task = renderer('bpmn:Task')(parentGfx, element);\n\n        var pathData = pathMap.getScaledPath('TASK_TYPE_MANUAL', {\n          abspos: {\n            x: 17,\n            y: 15\n          }\n        });\n\n        /* manual path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 0.5, // 0.25,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return task;\n      },\n      'bpmn:SendTask': function(parentGfx, element) {\n        var task = renderer('bpmn:Task')(parentGfx, element);\n\n        var pathData = pathMap.getScaledPath('TASK_TYPE_SEND', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: 21,\n          containerHeight: 14,\n          position: {\n            mx: 0.285,\n            my: 0.357\n          }\n        });\n\n        /* send path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: getStrokeColor(element, defaultStrokeColor),\n          stroke: getFillColor(element, defaultFillColor)\n        });\n\n        return task;\n      },\n      'bpmn:ReceiveTask' : function(parentGfx, element) {\n        var semantic = getBusinessObject(element);\n\n        var task = renderer('bpmn:Task')(parentGfx, element);\n        var pathData;\n\n        if (semantic.instantiate) {\n          drawCircle(parentGfx, 28, 28, 20 * 0.22, { strokeWidth: 1 });\n\n          pathData = pathMap.getScaledPath('TASK_TYPE_INSTANTIATING_SEND', {\n            abspos: {\n              x: 7.77,\n              y: 9.52\n            }\n          });\n        } else {\n\n          pathData = pathMap.getScaledPath('TASK_TYPE_SEND', {\n            xScaleFactor: 0.9,\n            yScaleFactor: 0.9,\n            containerWidth: 21,\n            containerHeight: 14,\n            position: {\n              mx: 0.3,\n              my: 0.4\n            }\n          });\n        }\n\n        /* receive path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return task;\n      },\n      'bpmn:ScriptTask': function(parentGfx, element) {\n        var task = renderer('bpmn:Task')(parentGfx, element);\n\n        var pathData = pathMap.getScaledPath('TASK_TYPE_SCRIPT', {\n          abspos: {\n            x: 15,\n            y: 20\n          }\n        });\n\n        /* script path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return task;\n      },\n      'bpmn:BusinessRuleTask': function(parentGfx, element) {\n        var task = renderer('bpmn:Task')(parentGfx, element);\n\n        var headerPathData = pathMap.getScaledPath('TASK_TYPE_BUSINESS_RULE_HEADER', {\n          abspos: {\n            x: 8,\n            y: 8\n          }\n        });\n\n        var businessHeaderPath = drawPath(parentGfx, headerPathData);\n        attr$1(businessHeaderPath, {\n          strokeWidth: 1,\n          fill: getFillColor(element, '#aaaaaa'),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        var headerData = pathMap.getScaledPath('TASK_TYPE_BUSINESS_RULE_MAIN', {\n          abspos: {\n            x: 8,\n            y: 8\n          }\n        });\n\n        var businessPath = drawPath(parentGfx, headerData);\n        attr$1(businessPath, {\n          strokeWidth: 1,\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return task;\n      },\n      'bpmn:SubProcess': function(parentGfx, element, attrs) {\n        attrs = {\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor),\n          ...attrs\n        };\n\n        var rect = renderer('bpmn:Activity')(parentGfx, element, attrs);\n\n        var expanded = isExpanded(element);\n\n        if (isEventSubProcess(element)) {\n          attr$1(rect, {\n            strokeDasharray: '0, 5.5',\n            strokeWidth: 2.5\n          });\n        }\n\n        renderEmbeddedLabel(parentGfx, element, expanded ? 'center-top' : 'center-middle');\n\n        if (expanded) {\n          attachTaskMarkers(parentGfx, element);\n        } else {\n          attachTaskMarkers(parentGfx, element, [ 'SubProcessMarker' ]);\n        }\n\n        return rect;\n      },\n      'bpmn:AdHocSubProcess': function(parentGfx, element) {\n        return renderer('bpmn:SubProcess')(parentGfx, element);\n      },\n      'bpmn:Transaction': function(parentGfx, element) {\n        var outer = renderer('bpmn:SubProcess')(parentGfx, element, { strokeWidth: 1.5 });\n\n        var innerAttrs = styles.style([ 'no-fill', 'no-events' ], {\n          stroke: getStrokeColor(element, defaultStrokeColor),\n          strokeWidth: 1.5\n        });\n\n        /* inner path */ drawRect(parentGfx, element.width, element.height, TASK_BORDER_RADIUS - 3, INNER_OUTER_DIST, innerAttrs);\n\n        return outer;\n      },\n      'bpmn:CallActivity': function(parentGfx, element) {\n        return renderer('bpmn:SubProcess')(parentGfx, element, {\n          strokeWidth: 5\n        });\n      },\n      'bpmn:Participant': function(parentGfx, element) {\n\n        var strokeWidth = 1.5;\n\n        var attrs = {\n          fillOpacity: DEFAULT_FILL_OPACITY,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor),\n          strokeWidth\n        };\n\n        var lane = renderer('bpmn:Lane')(parentGfx, element, attrs);\n\n        var expandedPool = isExpanded(element);\n\n        if (expandedPool) {\n          drawLine(parentGfx, [\n            { x: 30, y: 0 },\n            { x: 30, y: element.height }\n          ], {\n            stroke: getStrokeColor(element, defaultStrokeColor),\n            strokeWidth\n          });\n          var text = getBusinessObject(element).name;\n          renderLaneLabel(parentGfx, text, element);\n        } else {\n\n          // collapsed pool draw text inline\n          var text2 = getBusinessObject(element).name;\n          renderLabel(parentGfx, text2, {\n            box: element, align: 'center-middle',\n            style: {\n              fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor)\n            }\n          });\n        }\n\n        var participantMultiplicity = !!(getBusinessObject(element).participantMultiplicity);\n\n        if (participantMultiplicity) {\n          renderer('ParticipantMultiplicityMarker')(parentGfx, element);\n        }\n\n        return lane;\n      },\n      'bpmn:Lane': function(parentGfx, element, attrs) {\n        var rect = drawRect(parentGfx, element.width, element.height, 0, {\n          fill: getFillColor(element, defaultFillColor),\n          fillOpacity: HIGH_FILL_OPACITY,\n          stroke: getStrokeColor(element, defaultStrokeColor),\n          strokeWidth: 1.5,\n          ...attrs\n        });\n\n        var semantic = getBusinessObject(element);\n\n        if (semantic.$type === 'bpmn:Lane') {\n          var text = semantic.name;\n          renderLaneLabel(parentGfx, text, element);\n        }\n\n        return rect;\n      },\n      'bpmn:InclusiveGateway': function(parentGfx, element) {\n        var diamond = renderer('bpmn:Gateway')(parentGfx, element);\n\n        /* circle path */\n        drawCircle(parentGfx, element.width, element.height, element.height * 0.24, {\n          strokeWidth: 2.5,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return diamond;\n      },\n      'bpmn:ExclusiveGateway': function(parentGfx, element) {\n        var diamond = renderer('bpmn:Gateway')(parentGfx, element);\n\n        var pathData = pathMap.getScaledPath('GATEWAY_EXCLUSIVE', {\n          xScaleFactor: 0.4,\n          yScaleFactor: 0.4,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.32,\n            my: 0.3\n          }\n        });\n\n        if ((getDi(element).isMarkerVisible)) {\n          drawPath(parentGfx, pathData, {\n            strokeWidth: 1,\n            fill: getStrokeColor(element, defaultStrokeColor),\n            stroke: getStrokeColor(element, defaultStrokeColor)\n          });\n        }\n\n        return diamond;\n      },\n      'bpmn:ComplexGateway': function(parentGfx, element) {\n        var diamond = renderer('bpmn:Gateway')(parentGfx, element);\n\n        var pathData = pathMap.getScaledPath('GATEWAY_COMPLEX', {\n          xScaleFactor: 0.5,\n          yScaleFactor:0.5,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.46,\n            my: 0.26\n          }\n        });\n\n        /* complex path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: getStrokeColor(element, defaultStrokeColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return diamond;\n      },\n      'bpmn:ParallelGateway': function(parentGfx, element) {\n        var diamond = renderer('bpmn:Gateway')(parentGfx, element);\n\n        var pathData = pathMap.getScaledPath('GATEWAY_PARALLEL', {\n          xScaleFactor: 0.6,\n          yScaleFactor:0.6,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.46,\n            my: 0.2\n          }\n        });\n\n        /* parallel path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: getStrokeColor(element, defaultStrokeColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return diamond;\n      },\n      'bpmn:EventBasedGateway': function(parentGfx, element) {\n\n        var semantic = getBusinessObject(element);\n\n        var diamond = renderer('bpmn:Gateway')(parentGfx, element);\n\n        /* outer circle path */ drawCircle(parentGfx, element.width, element.height, element.height * 0.20, {\n          strokeWidth: 1,\n          fill: 'none',\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        var type = semantic.eventGatewayType;\n        var instantiate = !!semantic.instantiate;\n\n        function drawEvent() {\n\n          var pathData = pathMap.getScaledPath('GATEWAY_EVENT_BASED', {\n            xScaleFactor: 0.18,\n            yScaleFactor: 0.18,\n            containerWidth: element.width,\n            containerHeight: element.height,\n            position: {\n              mx: 0.36,\n              my: 0.44\n            }\n          });\n\n          /* event path */ drawPath(parentGfx, pathData, {\n            strokeWidth: 2,\n            fill: getFillColor(element, 'none'),\n            stroke: getStrokeColor(element, defaultStrokeColor)\n          });\n        }\n\n        if (type === 'Parallel') {\n\n          var pathData = pathMap.getScaledPath('GATEWAY_PARALLEL', {\n            xScaleFactor: 0.4,\n            yScaleFactor:0.4,\n            containerWidth: element.width,\n            containerHeight: element.height,\n            position: {\n              mx: 0.474,\n              my: 0.296\n            }\n          });\n\n          drawPath(parentGfx, pathData, {\n            strokeWidth: 1,\n            fill: 'none'\n          });\n        } else if (type === 'Exclusive') {\n\n          if (!instantiate) {\n            drawCircle(parentGfx, element.width, element.height, element.height * 0.26, {\n              strokeWidth: 1,\n              fill: 'none',\n              stroke: getStrokeColor(element, defaultStrokeColor)\n            });\n          }\n\n          drawEvent();\n        }\n\n\n        return diamond;\n      },\n      'bpmn:Gateway': function(parentGfx, element) {\n        return drawDiamond(parentGfx, element.width, element.height, {\n          fill: getFillColor(element, defaultFillColor),\n          fillOpacity: DEFAULT_FILL_OPACITY,\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n      },\n      'bpmn:SequenceFlow': function(parentGfx, element) {\n        var fill = getFillColor(element, defaultFillColor),\n            stroke = getStrokeColor(element, defaultStrokeColor);\n\n        var path = drawConnectionSegments(parentGfx, element.waypoints, {\n          markerEnd: marker('sequenceflow-end', fill, stroke),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        var sequenceFlow = getBusinessObject(element);\n\n        var source;\n\n        if (element.source) {\n          source = element.source.businessObject;\n\n          // conditional flow marker\n          if (sequenceFlow.conditionExpression && source.$instanceOf('bpmn:Activity')) {\n            attr$1(path, {\n              markerStart: marker('conditional-flow-marker', fill, stroke)\n            });\n          }\n\n          // default marker\n          if (source.default && (source.$instanceOf('bpmn:Gateway') || source.$instanceOf('bpmn:Activity')) &&\n              source.default === sequenceFlow) {\n            attr$1(path, {\n              markerStart: marker('conditional-default-flow-marker', fill, stroke)\n            });\n          }\n        }\n\n        return path;\n      },\n      'bpmn:Association': function(parentGfx, element, attrs) {\n\n        var semantic = getBusinessObject(element);\n\n        var fill = getFillColor(element, defaultFillColor),\n            stroke = getStrokeColor(element, defaultStrokeColor);\n\n        attrs = {\n          strokeDasharray: '0, 5',\n          stroke: getStrokeColor(element, defaultStrokeColor),\n          ...attrs\n        };\n\n        if (semantic.associationDirection === 'One' ||\n            semantic.associationDirection === 'Both') {\n          attrs.markerEnd = marker('association-end', fill, stroke);\n        }\n\n        if (semantic.associationDirection === 'Both') {\n          attrs.markerStart = marker('association-start', fill, stroke);\n        }\n\n        return drawConnectionSegments(parentGfx, element.waypoints, attrs);\n      },\n      'bpmn:DataInputAssociation': function(parentGfx, element) {\n        var fill = getFillColor(element, defaultFillColor),\n            stroke = getStrokeColor(element, defaultStrokeColor);\n\n        return renderer('bpmn:Association')(parentGfx, element, {\n          markerEnd: marker('association-end', fill, stroke)\n        });\n      },\n      'bpmn:DataOutputAssociation': function(parentGfx, element) {\n        var fill = getFillColor(element, defaultFillColor),\n            stroke = getStrokeColor(element, defaultStrokeColor);\n\n        return renderer('bpmn:Association')(parentGfx, element, {\n          markerEnd: marker('association-end', fill, stroke)\n        });\n      },\n      'bpmn:MessageFlow': function(parentGfx, element) {\n\n        var semantic = getBusinessObject(element),\n            di = getDi(element);\n\n        var fill = getFillColor(element, defaultFillColor),\n            stroke = getStrokeColor(element, defaultStrokeColor);\n\n        var path = drawConnectionSegments(parentGfx, element.waypoints, {\n          markerEnd: marker('messageflow-end', fill, stroke),\n          markerStart: marker('messageflow-start', fill, stroke),\n          strokeDasharray: '10, 11',\n          strokeWidth: 1.5,\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        if (semantic.messageRef) {\n          var midPoint = path.getPointAtLength(path.getTotalLength() / 2);\n\n          var markerPathData = pathMap.getScaledPath('MESSAGE_FLOW_MARKER', {\n            abspos: {\n              x: midPoint.x,\n              y: midPoint.y\n            }\n          });\n\n          var messageAttrs = { strokeWidth: 1 };\n\n          if (di.messageVisibleKind === 'initiating') {\n            messageAttrs.fill = 'white';\n            messageAttrs.stroke = black;\n          } else {\n            messageAttrs.fill = '#888';\n            messageAttrs.stroke = 'white';\n          }\n\n          var message = drawPath(parentGfx, markerPathData, messageAttrs);\n\n          var labelText = semantic.messageRef.name;\n          var label = renderLabel(parentGfx, labelText, {\n            align: 'center-top',\n            fitBox: true,\n            style: {\n              fill: getStrokeColor(element, defaultLabelColor)\n            }\n          });\n\n          var messageBounds = message.getBBox(),\n              labelBounds = label.getBBox();\n\n          var translateX = midPoint.x - labelBounds.width / 2,\n              translateY = midPoint.y + messageBounds.height / 2 + ELEMENT_LABEL_DISTANCE;\n\n          transform(label, translateX, translateY, 0);\n\n        }\n\n        return path;\n      },\n      'bpmn:DataObject': function(parentGfx, element) {\n        var pathData = pathMap.getScaledPath('DATA_OBJECT_PATH', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.474,\n            my: 0.296\n          }\n        });\n\n        var elementObject = drawPath(parentGfx, pathData, {\n          fill: getFillColor(element, defaultFillColor),\n          fillOpacity: DEFAULT_FILL_OPACITY,\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        var semantic = getBusinessObject(element);\n\n        if (isCollection(semantic)) {\n          renderDataItemCollection(parentGfx, element);\n        }\n\n        return elementObject;\n      },\n      'bpmn:DataObjectReference': as('bpmn:DataObject'),\n      'bpmn:DataInput': function(parentGfx, element) {\n\n        var arrowPathData = pathMap.getRawPath('DATA_ARROW');\n\n        // page\n        var elementObject = renderer('bpmn:DataObject')(parentGfx, element);\n\n        /* input arrow path */ drawPath(parentGfx, arrowPathData, { strokeWidth: 1 });\n\n        return elementObject;\n      },\n      'bpmn:DataOutput': function(parentGfx, element) {\n        var arrowPathData = pathMap.getRawPath('DATA_ARROW');\n\n        // page\n        var elementObject = renderer('bpmn:DataObject')(parentGfx, element);\n\n        /* output arrow path */ drawPath(parentGfx, arrowPathData, {\n          strokeWidth: 1,\n          fill: black\n        });\n\n        return elementObject;\n      },\n      'bpmn:DataStoreReference': function(parentGfx, element) {\n        var DATA_STORE_PATH = pathMap.getScaledPath('DATA_STORE', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0,\n            my: 0.133\n          }\n        });\n\n        var elementStore = drawPath(parentGfx, DATA_STORE_PATH, {\n          strokeWidth: 2,\n          fill: getFillColor(element, defaultFillColor),\n          fillOpacity: DEFAULT_FILL_OPACITY,\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return elementStore;\n      },\n      'bpmn:BoundaryEvent': function(parentGfx, element, options) {\n\n        var semantic = getBusinessObject(element),\n            cancel = semantic.cancelActivity;\n\n        var attrs = {\n          strokeWidth: 1.5,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        };\n\n        if (!cancel) {\n          attrs.strokeDasharray = '6';\n        }\n\n        // apply fillOpacity\n        var outerAttrs = {\n          ...attrs,\n          fillOpacity: 1\n        };\n\n        // apply no-fill\n        var innerAttrs = {\n          ...attrs,\n          fill: 'none'\n        };\n\n        var outer = renderer('bpmn:Event')(parentGfx, element, outerAttrs);\n\n        /* inner path */ drawCircle(parentGfx, element.width, element.height, INNER_OUTER_DIST, innerAttrs);\n\n        if (!options || options.renderIcon !== false) {\n          renderEventContent(element, parentGfx);\n        }\n\n        return outer;\n      },\n      'bpmn:Group': function(parentGfx, element) {\n        return drawRect(parentGfx, element.width, element.height, TASK_BORDER_RADIUS, {\n          stroke: getStrokeColor(element, defaultStrokeColor),\n          strokeWidth: 1.5,\n          strokeDasharray: '10,6,0,6',\n          fill: 'none',\n          pointerEvents: 'none'\n        });\n      },\n      'label': function(parentGfx, element) {\n        return renderExternalLabel(parentGfx, element);\n      },\n      'bpmn:TextAnnotation': function(parentGfx, element) {\n        var textElement = drawRect(parentGfx, element.width, element.height, 0, 0, {\n          'fill': 'none',\n          'stroke': 'none'\n        });\n\n        var textPathData = pathMap.getScaledPath('TEXT_ANNOTATION', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.0,\n            my: 0.0\n          }\n        });\n\n        drawPath(parentGfx, textPathData, {\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        var text = getBusinessObject(element).text || '';\n        renderLabel(parentGfx, text, {\n          box: element,\n          align: 'left-top',\n          padding: 7,\n          style: {\n            fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor)\n          }\n        });\n\n        return textElement;\n      },\n      'ParticipantMultiplicityMarker': function(parentGfx, element) {\n        var markerPath = pathMap.getScaledPath('MARKER_PARALLEL', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: ((element.width / 2) / element.width),\n            my: (element.height - 15) / element.height\n          }\n        });\n\n        drawMarker('participant-multiplicity', parentGfx, markerPath, {\n          strokeWidth: 2,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n      },\n      'SubProcessMarker': function(parentGfx, element) {\n        var markerRect = drawRect(parentGfx, 14, 14, 0, {\n          strokeWidth: 1,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        // Process marker is placed in the middle of the box\n        // therefore fixed values can be used here\n        translate$1(markerRect, element.width / 2 - 7.5, element.height - 20);\n\n        var markerPath = pathMap.getScaledPath('MARKER_SUB_PROCESS', {\n          xScaleFactor: 1.5,\n          yScaleFactor: 1.5,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: (element.width / 2 - 7.5) / element.width,\n            my: (element.height - 20) / element.height\n          }\n        });\n\n        drawMarker('sub-process', parentGfx, markerPath, {\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n      },\n      'ParallelMarker': function(parentGfx, element, position) {\n        var markerPath = pathMap.getScaledPath('MARKER_PARALLEL', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: ((element.width / 2 + position.parallel) / element.width),\n            my: (element.height - 20) / element.height\n          }\n        });\n\n        drawMarker('parallel', parentGfx, markerPath, {\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n      },\n      'SequentialMarker': function(parentGfx, element, position) {\n        var markerPath = pathMap.getScaledPath('MARKER_SEQUENTIAL', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: ((element.width / 2 + position.seq) / element.width),\n            my: (element.height - 19) / element.height\n          }\n        });\n\n        drawMarker('sequential', parentGfx, markerPath, {\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n      },\n      'CompensationMarker': function(parentGfx, element, position) {\n        var markerMath = pathMap.getScaledPath('MARKER_COMPENSATION', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: ((element.width / 2 + position.compensation) / element.width),\n            my: (element.height - 13) / element.height\n          }\n        });\n\n        drawMarker('compensation', parentGfx, markerMath, {\n          strokeWidth: 1,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n      },\n      'LoopMarker': function(parentGfx, element, position) {\n        var markerPath = pathMap.getScaledPath('MARKER_LOOP', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: ((element.width / 2 + position.loop) / element.width),\n            my: (element.height - 7) / element.height\n          }\n        });\n\n        drawMarker('loop', parentGfx, markerPath, {\n          strokeWidth: 1.5,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor),\n          strokeMiterlimit: 0.5\n        });\n      },\n      'AdhocMarker': function(parentGfx, element, position) {\n        var markerPath = pathMap.getScaledPath('MARKER_ADHOC', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: ((element.width / 2 + position.adhoc) / element.width),\n            my: (element.height - 15) / element.height\n          }\n        });\n\n        drawMarker('adhoc', parentGfx, markerPath, {\n          strokeWidth: 1,\n          fill: getStrokeColor(element, defaultStrokeColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n      }\n    };\n\n    function attachTaskMarkers(parentGfx, element, taskMarkers) {\n      var obj = getBusinessObject(element);\n\n      var subprocess = taskMarkers && taskMarkers.indexOf('SubProcessMarker') !== -1;\n      var position;\n\n      if (subprocess) {\n        position = {\n          seq: -21,\n          parallel: -22,\n          compensation: -42,\n          loop: -18,\n          adhoc: 10\n        };\n      } else {\n        position = {\n          seq: -3,\n          parallel: -6,\n          compensation: -27,\n          loop: 0,\n          adhoc: 10\n        };\n      }\n\n      forEach$1(taskMarkers, function(marker) {\n        renderer(marker)(parentGfx, element, position);\n      });\n\n      if (obj.isForCompensation) {\n        renderer('CompensationMarker')(parentGfx, element, position);\n      }\n\n      if (obj.$type === 'bpmn:AdHocSubProcess') {\n        renderer('AdhocMarker')(parentGfx, element, position);\n      }\n\n      var loopCharacteristics = obj.loopCharacteristics,\n          isSequential = loopCharacteristics && loopCharacteristics.isSequential;\n\n      if (loopCharacteristics) {\n\n        if (isSequential === undefined) {\n          renderer('LoopMarker')(parentGfx, element, position);\n        }\n\n        if (isSequential === false) {\n          renderer('ParallelMarker')(parentGfx, element, position);\n        }\n\n        if (isSequential === true) {\n          renderer('SequentialMarker')(parentGfx, element, position);\n        }\n      }\n    }\n\n    function renderDataItemCollection(parentGfx, element) {\n\n      var yPosition = (element.height - 18) / element.height;\n\n      var pathData = pathMap.getScaledPath('DATA_OBJECT_COLLECTION_PATH', {\n        xScaleFactor: 1,\n        yScaleFactor: 1,\n        containerWidth: element.width,\n        containerHeight: element.height,\n        position: {\n          mx: 0.33,\n          my: yPosition\n        }\n      });\n\n      /* collection path */ drawPath(parentGfx, pathData, {\n        strokeWidth: 2\n      });\n    }\n\n\n    // extension API, use at your own risk\n    this._drawPath = drawPath;\n\n    this._renderer = renderer;\n  }\n\n\n  e(BpmnRenderer, BaseRenderer);\n\n  BpmnRenderer.$inject = [\n    'config.bpmnRenderer',\n    'eventBus',\n    'styles',\n    'pathMap',\n    'canvas',\n    'textRenderer'\n  ];\n\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  BpmnRenderer.prototype.canRender = function(element) {\n    return is$1(element, 'bpmn:BaseElement');\n  };\n\n  /**\n   * Draw shape into parentGfx.\n   *\n   * @param {SVGElement} parentGfx\n   * @param {Element} element\n   *\n   * @return {SVGElement} mainGfx\n   */\n  BpmnRenderer.prototype.drawShape = function(parentGfx, element) {\n    var type = element.type;\n    var h = this._renderer(type);\n\n    /* jshint -W040 */\n    return h(parentGfx, element);\n  };\n\n  /**\n   * Draw connection into parentGfx.\n   *\n   * @param {SVGElement} parentGfx\n   * @param {Element} element\n   *\n   * @return {SVGElement} mainGfx\n   */\n  BpmnRenderer.prototype.drawConnection = function(parentGfx, element) {\n    var type = element.type;\n    var h = this._renderer(type);\n\n    /* jshint -W040 */\n    return h(parentGfx, element);\n  };\n\n  /**\n   * Get shape path.\n   *\n   * @param {Element} element\n   *\n   * @return {string} path\n   */\n  BpmnRenderer.prototype.getShapePath = function(element) {\n\n    if (is$1(element, 'bpmn:Event')) {\n      return getCirclePath(element);\n    }\n\n    if (is$1(element, 'bpmn:Activity')) {\n      return getRoundRectPath(element, TASK_BORDER_RADIUS);\n    }\n\n    if (is$1(element, 'bpmn:Gateway')) {\n      return getDiamondPath(element);\n    }\n\n    return getRectPath(element);\n  };\n\n  /**\n   * @typedef {import('../util/Types').Dimensions} Dimensions\n   *\n   * @typedef { {\n   *   top: number;\n   *   left: number;\n   *   right: number;\n   *   bottom: number;\n   * } } Padding\n   *\n   * @typedef { number | Partial<Padding> } PaddingConfig\n   *\n   * @typedef { {\n   *   horizontal: 'center' | 'left';\n   *   vertical: 'top' | 'center';\n   * } } Alignment\n   *\n   *  @typedef { 'center-middle' | 'center-top' } AlignmentConfig\n   *\n   * @typedef { Partial<{\n   *   align: AlignmentConfig;\n   *   style: Record<string, number | string>;\n   *   padding: PaddingConfig;\n   * }> } BaseTextConfig\n   *\n   * @typedef { BaseTextConfig & Partial<{\n   *   size: Dimensions;\n   * }> } TextConfig\n   *\n   * @typedef { BaseTextConfig & Partial<{\n   *   box: Dimensions;\n   *   fitBox: boolean;\n   * }> } TextLayoutConfig\n   *\n   *  @typedef { Dimensions & {\n   *  text: string;\n   * } } LineDescriptor\n   */\n\n  var DEFAULT_BOX_PADDING = 0;\n\n  var DEFAULT_LABEL_SIZE = {\n    width: 150,\n    height: 50\n  };\n\n\n  /**\n   * @param {AlignmentConfig} align\n   * @return {Alignment}\n   */\n  function parseAlign(align) {\n\n    var parts = align.split('-');\n\n    return {\n      horizontal: parts[0] || 'center',\n      vertical: parts[1] || 'top'\n    };\n  }\n\n  /**\n   * @param {PaddingConfig} padding\n   *\n   * @return {Padding}\n   */\n  function parsePadding(padding) {\n\n    if (isObject(padding)) {\n      return assign$1({ top: 0, left: 0, right: 0, bottom: 0 }, padding);\n    } else {\n      return {\n        top: padding,\n        left: padding,\n        right: padding,\n        bottom: padding\n      };\n    }\n  }\n\n  /**\n   * @param {string} text\n   * @param {SVGTextElement} fakeText\n   *\n   * @return {import('../util/Types').Dimensions}\n   */\n  function getTextBBox(text, fakeText) {\n\n    fakeText.textContent = text;\n\n    var textBBox;\n\n    try {\n      var bbox,\n          emptyLine = text === '';\n\n      // add dummy text, when line is empty to\n      // determine correct height\n      fakeText.textContent = emptyLine ? 'dummy' : text;\n\n      textBBox = fakeText.getBBox();\n\n      // take text rendering related horizontal\n      // padding into account\n      bbox = {\n        width: textBBox.width + textBBox.x * 2,\n        height: textBBox.height\n      };\n\n      if (emptyLine) {\n\n        // correct width\n        bbox.width = 0;\n      }\n\n      return bbox;\n    } catch (e) {\n      return { width: 0, height: 0 };\n    }\n  }\n\n\n  /**\n   * Layout the next line and return the layouted element.\n   *\n   * Alters the lines passed.\n   *\n   * @param {string[]} lines\n   * @param {number} maxWidth\n   * @param {SVGTextElement} fakeText\n   *\n   * @return {LineDescriptor} the line descriptor\n   */\n  function layoutNext(lines, maxWidth, fakeText) {\n\n    var originalLine = lines.shift(),\n        fitLine = originalLine;\n\n    var textBBox;\n\n    for (;;) {\n      textBBox = getTextBBox(fitLine, fakeText);\n\n      textBBox.width = fitLine ? textBBox.width : 0;\n\n      // try to fit\n      if (fitLine === ' ' || fitLine === '' || textBBox.width < Math.round(maxWidth) || fitLine.length < 2) {\n        return fit(lines, fitLine, originalLine, textBBox);\n      }\n\n      fitLine = shortenLine(fitLine, textBBox.width, maxWidth);\n    }\n  }\n\n  /**\n   * @param {string[]} lines\n   * @param {string} fitLine\n   * @param {string} originalLine\n   * @param {Dimensions} textBBox\n   *\n   * @return {LineDescriptor}\n   */\n  function fit(lines, fitLine, originalLine, textBBox) {\n    if (fitLine.length < originalLine.length) {\n      var remainder = originalLine.slice(fitLine.length).trim();\n\n      lines.unshift(remainder);\n    }\n\n    return {\n      width: textBBox.width,\n      height: textBBox.height,\n      text: fitLine\n    };\n  }\n\n  var SOFT_BREAK = '\\u00AD';\n\n\n  /**\n   * Shortens a line based on spacing and hyphens.\n   * Returns the shortened result on success.\n   *\n   * @param {string} line\n   * @param {number} maxLength the maximum characters of the string\n   *\n   * @return {string} the shortened string\n   */\n  function semanticShorten(line, maxLength) {\n\n    var parts = line.split(/(\\s|-|\\u00AD)/g),\n        part,\n        shortenedParts = [],\n        length = 0;\n\n    // try to shorten via break chars\n    if (parts.length > 1) {\n\n      while ((part = parts.shift())) {\n        if (part.length + length < maxLength) {\n          shortenedParts.push(part);\n          length += part.length;\n        } else {\n\n          // remove previous part, too if hyphen does not fit anymore\n          if (part === '-' || part === SOFT_BREAK) {\n            shortenedParts.pop();\n          }\n\n          break;\n        }\n      }\n    }\n\n    var last = shortenedParts[shortenedParts.length - 1];\n\n    // translate trailing soft break to actual hyphen\n    if (last && last === SOFT_BREAK) {\n      shortenedParts[shortenedParts.length - 1] = '-';\n    }\n\n    return shortenedParts.join('');\n  }\n\n\n  /**\n   * @param {string} line\n   * @param {number} width\n   * @param {number} maxWidth\n   *\n   * @return {string}\n   */\n  function shortenLine(line, width, maxWidth) {\n    var length = Math.max(line.length * (maxWidth / width), 1);\n\n    // try to shorten semantically (i.e. based on spaces and hyphens)\n    var shortenedLine = semanticShorten(line, length);\n\n    if (!shortenedLine) {\n\n      // force shorten by cutting the long word\n      shortenedLine = line.slice(0, Math.max(Math.round(length - 1), 1));\n    }\n\n    return shortenedLine;\n  }\n\n\n  /**\n   * @return {SVGSVGElement}\n   */\n  function getHelperSvg() {\n    var helperSvg = document.getElementById('helper-svg');\n\n    if (!helperSvg) {\n      helperSvg = create$1('svg');\n\n      attr$1(helperSvg, {\n        id: 'helper-svg'\n      });\n\n      assign(helperSvg, {\n        visibility: 'hidden',\n        position: 'fixed',\n        width: 0,\n        height: 0\n      });\n\n      document.body.appendChild(helperSvg);\n    }\n\n    return helperSvg;\n  }\n\n\n  /**\n   * Creates a new label utility\n   *\n   * @param {TextConfig} config\n   */\n  function Text(config) {\n\n    this._config = assign$1({}, {\n      size: DEFAULT_LABEL_SIZE,\n      padding: DEFAULT_BOX_PADDING,\n      style: {},\n      align: 'center-top'\n    }, config || {});\n  }\n\n  /**\n   * Returns the layouted text as an SVG element.\n   *\n   * @param {string} text\n   * @param {TextLayoutConfig} options\n   *\n   * @return {SVGElement}\n   */\n  Text.prototype.createText = function(text, options) {\n    return this.layoutText(text, options).element;\n  };\n\n  /**\n   * Returns a labels layouted dimensions.\n   *\n   * @param {string} text to layout\n   * @param {TextLayoutConfig} options\n   *\n   * @return {Dimensions}\n   */\n  Text.prototype.getDimensions = function(text, options) {\n    return this.layoutText(text, options).dimensions;\n  };\n\n  /**\n   * Creates and returns a label and its bounding box.\n   *\n   * @param {string} text the text to render on the label\n   * @param {TextLayoutConfig} options\n   *\n   * @return { {\n   *   element: SVGElement,\n   *   dimensions: Dimensions\n   * } }\n   */\n  Text.prototype.layoutText = function(text, options) {\n    var box = assign$1({}, this._config.size, options.box),\n        style = assign$1({}, this._config.style, options.style),\n        align = parseAlign(options.align || this._config.align),\n        padding = parsePadding(options.padding !== undefined ? options.padding : this._config.padding),\n        fitBox = options.fitBox || false;\n\n    var lineHeight = getLineHeight(style);\n\n    // we split text by lines and normalize\n    // {soft break} + {line break} => { line break }\n    var lines = text.split(/\\u00AD?\\r?\\n/),\n        layouted = [];\n\n    var maxWidth = box.width - padding.left - padding.right;\n\n    // ensure correct rendering by attaching helper text node to invisible SVG\n    var helperText = create$1('text');\n    attr$1(helperText, { x: 0, y: 0 });\n    attr$1(helperText, style);\n\n    var helperSvg = getHelperSvg();\n\n    append(helperSvg, helperText);\n\n    while (lines.length) {\n      layouted.push(layoutNext(lines, maxWidth, helperText));\n    }\n\n    if (align.vertical === 'middle') {\n      padding.top = padding.bottom = 0;\n    }\n\n    var totalHeight = reduce(layouted, function(sum, line, idx) {\n      return sum + (lineHeight || line.height);\n    }, 0) + padding.top + padding.bottom;\n\n    var maxLineWidth = reduce(layouted, function(sum, line, idx) {\n      return line.width > sum ? line.width : sum;\n    }, 0);\n\n    // the y position of the next line\n    var y = padding.top;\n\n    if (align.vertical === 'middle') {\n      y += (box.height - totalHeight) / 2;\n    }\n\n    // magic number initial offset\n    y -= (lineHeight || layouted[0].height) / 4;\n\n\n    var textElement = create$1('text');\n\n    attr$1(textElement, style);\n\n    // layout each line taking into account that parent\n    // shape might resize to fit text size\n    forEach$1(layouted, function(line) {\n\n      var x;\n\n      y += (lineHeight || line.height);\n\n      switch (align.horizontal) {\n      case 'left':\n        x = padding.left;\n        break;\n\n      case 'right':\n        x = ((fitBox ? maxLineWidth : maxWidth)\n          - padding.right - line.width);\n        break;\n\n      default:\n\n        // aka center\n        x = Math.max((((fitBox ? maxLineWidth : maxWidth)\n          - line.width) / 2 + padding.left), 0);\n      }\n\n      var tspan = create$1('tspan');\n      attr$1(tspan, { x: x, y: y });\n\n      tspan.textContent = line.text;\n\n      append(textElement, tspan);\n    });\n\n    remove$2(helperText);\n\n    var dimensions = {\n      width: maxLineWidth,\n      height: totalHeight\n    };\n\n    return {\n      dimensions: dimensions,\n      element: textElement\n    };\n  };\n\n\n  function getLineHeight(style) {\n    if ('fontSize' in style && 'lineHeight' in style) {\n      return style.lineHeight * parseInt(style.fontSize, 10);\n    }\n  }\n\n  var DEFAULT_FONT_SIZE = 12;\n  var LINE_HEIGHT_RATIO = 1.2;\n\n  var MIN_TEXT_ANNOTATION_HEIGHT = 30;\n\n  /**\n   * @typedef { {\n   *   fontFamily: string;\n   *   fontSize: number;\n   *   fontWeight: string;\n   *   lineHeight: number;\n   * } } TextRendererStyle\n   *\n   * @typedef { {\n   *   defaultStyle?: Partial<TextRendererStyle>;\n   *   externalStyle?: Partial<TextRendererStyle>;\n   * } } TextRendererConfig\n   *\n   * @typedef { import('diagram-js/lib/util/Text').TextLayoutConfig } TextLayoutConfig\n   *\n   * @typedef { import('diagram-js/lib/util/Types').Rect } Rect\n   */\n\n\n  /**\n   * Renders text and computes text bounding boxes.\n   *\n   * @param {TextRendererConfig} [config]\n   */\n  function TextRenderer(config) {\n\n    var defaultStyle = assign$1({\n      fontFamily: 'Arial, sans-serif',\n      fontSize: DEFAULT_FONT_SIZE,\n      fontWeight: 'normal',\n      lineHeight: LINE_HEIGHT_RATIO\n    }, config && config.defaultStyle || {});\n\n    var fontSize = parseInt(defaultStyle.fontSize, 10) - 1;\n\n    var externalStyle = assign$1({}, defaultStyle, {\n      fontSize: fontSize\n    }, config && config.externalStyle || {});\n\n    var textUtil = new Text({\n      style: defaultStyle\n    });\n\n    /**\n     * Get the new bounds of an externally rendered,\n     * layouted label.\n     *\n     * @param {Rect} bounds\n     * @param {string} text\n     *\n     * @return {Rect}\n     */\n    this.getExternalLabelBounds = function(bounds, text) {\n\n      var layoutedDimensions = textUtil.getDimensions(text, {\n        box: {\n          width: 90,\n          height: 30\n        },\n        style: externalStyle\n      });\n\n      // resize label shape to fit label text\n      return {\n        x: Math.round(bounds.x + bounds.width / 2 - layoutedDimensions.width / 2),\n        y: Math.round(bounds.y),\n        width: Math.ceil(layoutedDimensions.width),\n        height: Math.ceil(layoutedDimensions.height)\n      };\n\n    };\n\n    /**\n     * Get the new bounds of text annotation.\n     *\n     * @param {Rect} bounds\n     * @param {string} text\n     *\n     * @return {Rect}\n     */\n    this.getTextAnnotationBounds = function(bounds, text) {\n\n      var layoutedDimensions = textUtil.getDimensions(text, {\n        box: bounds,\n        style: defaultStyle,\n        align: 'left-top',\n        padding: 5\n      });\n\n      return {\n        x: bounds.x,\n        y: bounds.y,\n        width: bounds.width,\n        height: Math.max(MIN_TEXT_ANNOTATION_HEIGHT, Math.round(layoutedDimensions.height))\n      };\n    };\n\n    /**\n     * Create a layouted text element.\n     *\n     * @param {string} text\n     * @param {TextLayoutConfig} [options]\n     *\n     * @return {SVGElement} rendered text\n     */\n    this.createText = function(text, options) {\n      return textUtil.createText(text, options || {});\n    };\n\n    /**\n     * Get default text style.\n     */\n    this.getDefaultStyle = function() {\n      return defaultStyle;\n    };\n\n    /**\n     * Get the external text style.\n     */\n    this.getExternalStyle = function() {\n      return externalStyle;\n    };\n\n  }\n\n  TextRenderer.$inject = [\n    'config.textRenderer'\n  ];\n\n  /**\n   * Map containing SVG paths needed by BpmnRenderer\n   */\n  function PathMap() {\n\n    /**\n     * Contains a map of path elements\n     *\n     * <h1>Path definition</h1>\n     * A parameterized path is defined like this:\n     * <pre>\n     * 'GATEWAY_PARALLEL': {\n     *   d: 'm {mx},{my} {e.x0},0 0,{e.x1} {e.x1},0 0,{e.y0} -{e.x1},0 0,{e.y1} ' +\n            '-{e.x0},0 0,-{e.y1} -{e.x1},0 0,-{e.y0} {e.x1},0 z',\n     *   height: 17.5,\n     *   width:  17.5,\n     *   heightElements: [2.5, 7.5],\n     *   widthElements: [2.5, 7.5]\n     * }\n     * </pre>\n     * <p>It's important to specify a correct <b>height and width</b> for the path as the scaling\n     * is based on the ratio between the specified height and width in this object and the\n     * height and width that is set as scale target (Note x,y coordinates will be scaled with\n     * individual ratios).</p>\n     * <p>The '<b>heightElements</b>' and '<b>widthElements</b>' array must contain the values that will be scaled.\n     * The scaling is based on the computed ratios.\n     * Coordinates on the y axis should be in the <b>heightElement</b>'s array, they will be scaled using\n     * the computed ratio coefficient.\n     * In the parameterized path the scaled values can be accessed through the 'e' object in {} brackets.\n     *   <ul>\n     *    <li>The values for the y axis can be accessed in the path string using {e.y0}, {e.y1}, ....</li>\n     *    <li>The values for the x axis can be accessed in the path string using {e.x0}, {e.x1}, ....</li>\n     *   </ul>\n     *   The numbers x0, x1 respectively y0, y1, ... map to the corresponding array index.\n     * </p>\n     */\n    this.pathMap = {\n      'EVENT_MESSAGE': {\n        d: 'm {mx},{my} l 0,{e.y1} l {e.x1},0 l 0,-{e.y1} z l {e.x0},{e.y0} l {e.x0},-{e.y0}',\n        height: 36,\n        width:  36,\n        heightElements: [ 6, 14 ],\n        widthElements: [ 10.5, 21 ]\n      },\n      'EVENT_SIGNAL': {\n        d: 'M {mx},{my} l {e.x0},{e.y0} l -{e.x1},0 Z',\n        height: 36,\n        width: 36,\n        heightElements: [ 18 ],\n        widthElements: [ 10, 20 ]\n      },\n      'EVENT_ESCALATION': {\n        d: 'M {mx},{my} l {e.x0},{e.y0} l -{e.x0},-{e.y1} l -{e.x0},{e.y1} Z',\n        height: 36,\n        width: 36,\n        heightElements: [ 20, 7 ],\n        widthElements: [ 8 ]\n      },\n      'EVENT_CONDITIONAL': {\n        d: 'M {e.x0},{e.y0} l {e.x1},0 l 0,{e.y2} l -{e.x1},0 Z ' +\n           'M {e.x2},{e.y3} l {e.x0},0 ' +\n           'M {e.x2},{e.y4} l {e.x0},0 ' +\n           'M {e.x2},{e.y5} l {e.x0},0 ' +\n           'M {e.x2},{e.y6} l {e.x0},0 ' +\n           'M {e.x2},{e.y7} l {e.x0},0 ' +\n           'M {e.x2},{e.y8} l {e.x0},0 ',\n        height: 36,\n        width:  36,\n        heightElements: [ 8.5, 14.5, 18, 11.5, 14.5, 17.5, 20.5, 23.5, 26.5 ],\n        widthElements:  [ 10.5, 14.5, 12.5 ]\n      },\n      'EVENT_LINK': {\n        d: 'm {mx},{my} 0,{e.y0} -{e.x1},0 0,{e.y1} {e.x1},0 0,{e.y0} {e.x0},-{e.y2} -{e.x0},-{e.y2} z',\n        height: 36,\n        width: 36,\n        heightElements: [ 4.4375, 6.75, 7.8125 ],\n        widthElements: [ 9.84375, 13.5 ]\n      },\n      'EVENT_ERROR': {\n        d: 'm {mx},{my} {e.x0},-{e.y0} {e.x1},-{e.y1} {e.x2},{e.y2} {e.x3},-{e.y3} -{e.x4},{e.y4} -{e.x5},-{e.y5} z',\n        height: 36,\n        width: 36,\n        heightElements: [ 0.023, 8.737, 8.151, 16.564, 10.591, 8.714 ],\n        widthElements: [ 0.085, 6.672, 6.97, 4.273, 5.337, 6.636 ]\n      },\n      'EVENT_CANCEL_45': {\n        d: 'm {mx},{my} -{e.x1},0 0,{e.x0} {e.x1},0 0,{e.y1} {e.x0},0 ' +\n          '0,-{e.y1} {e.x1},0 0,-{e.y0} -{e.x1},0 0,-{e.y1} -{e.x0},0 z',\n        height: 36,\n        width: 36,\n        heightElements: [ 4.75, 8.5 ],\n        widthElements: [ 4.75, 8.5 ]\n      },\n      'EVENT_COMPENSATION': {\n        d: 'm {mx},{my} {e.x0},-{e.y0} 0,{e.y1} z m {e.x1},-{e.y2} {e.x2},-{e.y3} 0,{e.y1} -{e.x2},-{e.y3} z',\n        height: 36,\n        width: 36,\n        heightElements: [ 6.5, 13, 0.4, 6.1 ],\n        widthElements: [ 9, 9.3, 8.7 ]\n      },\n      'EVENT_TIMER_WH': {\n        d: 'M {mx},{my} l {e.x0},-{e.y0} m -{e.x0},{e.y0} l {e.x1},{e.y1} ',\n        height: 36,\n        width:  36,\n        heightElements: [ 10, 2 ],\n        widthElements: [ 3, 7 ]\n      },\n      'EVENT_TIMER_LINE': {\n        d:  'M {mx},{my} ' +\n            'm {e.x0},{e.y0} l -{e.x1},{e.y1} ',\n        height: 36,\n        width:  36,\n        heightElements: [ 10, 3 ],\n        widthElements: [ 0, 0 ]\n      },\n      'EVENT_MULTIPLE': {\n        d:'m {mx},{my} {e.x1},-{e.y0} {e.x1},{e.y0} -{e.x0},{e.y1} -{e.x2},0 z',\n        height: 36,\n        width:  36,\n        heightElements: [ 6.28099, 12.56199 ],\n        widthElements: [ 3.1405, 9.42149, 12.56198 ]\n      },\n      'EVENT_PARALLEL_MULTIPLE': {\n        d:'m {mx},{my} {e.x0},0 0,{e.y1} {e.x1},0 0,{e.y0} -{e.x1},0 0,{e.y1} ' +\n          '-{e.x0},0 0,-{e.y1} -{e.x1},0 0,-{e.y0} {e.x1},0 z',\n        height: 36,\n        width:  36,\n        heightElements: [ 2.56228, 7.68683 ],\n        widthElements: [ 2.56228, 7.68683 ]\n      },\n      'GATEWAY_EXCLUSIVE': {\n        d:'m {mx},{my} {e.x0},{e.y0} {e.x1},{e.y0} {e.x2},0 {e.x4},{e.y2} ' +\n                      '{e.x4},{e.y1} {e.x2},0 {e.x1},{e.y3} {e.x0},{e.y3} ' +\n                      '{e.x3},0 {e.x5},{e.y1} {e.x5},{e.y2} {e.x3},0 z',\n        height: 17.5,\n        width:  17.5,\n        heightElements: [ 8.5, 6.5312, -6.5312, -8.5 ],\n        widthElements:  [ 6.5, -6.5, 3, -3, 5, -5 ]\n      },\n      'GATEWAY_PARALLEL': {\n        d:'m {mx},{my} 0,{e.y1} -{e.x1},0 0,{e.y0} {e.x1},0 0,{e.y1} {e.x0},0 ' +\n          '0,-{e.y1} {e.x1},0 0,-{e.y0} -{e.x1},0 0,-{e.y1} -{e.x0},0 z',\n        height: 30,\n        width:  30,\n        heightElements: [ 5, 12.5 ],\n        widthElements: [ 5, 12.5 ]\n      },\n      'GATEWAY_EVENT_BASED': {\n        d:'m {mx},{my} {e.x0},{e.y0} {e.x0},{e.y1} {e.x1},{e.y2} {e.x2},0 z',\n        height: 11,\n        width:  11,\n        heightElements: [ -6, 6, 12, -12 ],\n        widthElements: [ 9, -3, -12 ]\n      },\n      'GATEWAY_COMPLEX': {\n        d:'m {mx},{my} 0,{e.y0} -{e.x0},-{e.y1} -{e.x1},{e.y2} {e.x0},{e.y1} -{e.x2},0 0,{e.y3} ' +\n          '{e.x2},0  -{e.x0},{e.y1} l {e.x1},{e.y2} {e.x0},-{e.y1} 0,{e.y0} {e.x3},0 0,-{e.y0} {e.x0},{e.y1} ' +\n          '{e.x1},-{e.y2} -{e.x0},-{e.y1} {e.x2},0 0,-{e.y3} -{e.x2},0 {e.x0},-{e.y1} -{e.x1},-{e.y2} ' +\n          '-{e.x0},{e.y1} 0,-{e.y0} -{e.x3},0 z',\n        height: 17.125,\n        width:  17.125,\n        heightElements: [ 4.875, 3.4375, 2.125, 3 ],\n        widthElements: [ 3.4375, 2.125, 4.875, 3 ]\n      },\n      'DATA_OBJECT_PATH': {\n        d:'m 0,0 {e.x1},0 {e.x0},{e.y0} 0,{e.y1} -{e.x2},0 0,-{e.y2} {e.x1},0 0,{e.y0} {e.x0},0',\n        height: 61,\n        width:  51,\n        heightElements: [ 10, 50, 60 ],\n        widthElements: [ 10, 40, 50, 60 ]\n      },\n      'DATA_OBJECT_COLLECTION_PATH': {\n        d: 'm{mx},{my} m 3,2 l 0,10 m 3,-10 l 0,10 m 3,-10 l 0,10',\n        height: 10,\n        width: 10,\n        heightElements: [],\n        widthElements: []\n      },\n      'DATA_ARROW': {\n        d:'m 5,9 9,0 0,-3 5,5 -5,5 0,-3 -9,0 z',\n        height: 61,\n        width:  51,\n        heightElements: [],\n        widthElements: []\n      },\n      'DATA_STORE': {\n        d:'m  {mx},{my} ' +\n          'l  0,{e.y2} ' +\n          'c  {e.x0},{e.y1} {e.x1},{e.y1}  {e.x2},0 ' +\n          'l  0,-{e.y2} ' +\n          'c -{e.x0},-{e.y1} -{e.x1},-{e.y1} -{e.x2},0' +\n          'c  {e.x0},{e.y1} {e.x1},{e.y1}  {e.x2},0 ' +\n          'm  -{e.x2},{e.y0}' +\n          'c  {e.x0},{e.y1} {e.x1},{e.y1} {e.x2},0' +\n          'm  -{e.x2},{e.y0}' +\n          'c  {e.x0},{e.y1} {e.x1},{e.y1}  {e.x2},0',\n        height: 61,\n        width:  61,\n        heightElements: [ 7, 10, 45 ],\n        widthElements:  [ 2, 58, 60 ]\n      },\n      'TEXT_ANNOTATION': {\n        d: 'm {mx}, {my} m 10,0 l -10,0 l 0,{e.y0} l 10,0',\n        height: 30,\n        width: 10,\n        heightElements: [ 30 ],\n        widthElements: [ 10 ]\n      },\n      'MARKER_SUB_PROCESS': {\n        d: 'm{mx},{my} m 7,2 l 0,10 m -5,-5 l 10,0',\n        height: 10,\n        width: 10,\n        heightElements: [],\n        widthElements: []\n      },\n      'MARKER_PARALLEL': {\n        d: 'm{mx},{my} m 3,2 l 0,10 m 3,-10 l 0,10 m 3,-10 l 0,10',\n        height: 10,\n        width: 10,\n        heightElements: [],\n        widthElements: []\n      },\n      'MARKER_SEQUENTIAL': {\n        d: 'm{mx},{my} m 0,3 l 10,0 m -10,3 l 10,0 m -10,3 l 10,0',\n        height: 10,\n        width: 10,\n        heightElements: [],\n        widthElements: []\n      },\n      'MARKER_COMPENSATION': {\n        d: 'm {mx},{my} 7,-5 0,10 z m 7.1,-0.3 6.9,-4.7 0,10 -6.9,-4.7 z',\n        height: 10,\n        width: 21,\n        heightElements: [],\n        widthElements: []\n      },\n      'MARKER_LOOP': {\n        d: 'm {mx},{my} c 3.526979,0 6.386161,-2.829858 6.386161,-6.320661 0,-3.490806 -2.859182,-6.320661 ' +\n          '-6.386161,-6.320661 -3.526978,0 -6.38616,2.829855 -6.38616,6.320661 0,1.745402 ' +\n          '0.714797,3.325567 1.870463,4.469381 0.577834,0.571908 1.265885,1.034728 2.029916,1.35457 ' +\n          'l -0.718163,-3.909793 m 0.718163,3.909793 -3.885211,0.802902',\n        height: 13.9,\n        width: 13.7,\n        heightElements: [],\n        widthElements: []\n      },\n      'MARKER_ADHOC': {\n        d: 'm {mx},{my} m 0.84461,2.64411 c 1.05533,-1.23780996 2.64337,-2.07882 4.29653,-1.97997996 2.05163,0.0805 ' +\n          '3.85579,1.15803 5.76082,1.79107 1.06385,0.34139996 2.24454,0.1438 3.18759,-0.43767 0.61743,-0.33642 ' +\n          '1.2775,-0.64078 1.7542,-1.17511 0,0.56023 0,1.12046 0,1.6807 -0.98706,0.96237996 -2.29792,1.62393996 ' +\n          '-3.6918,1.66181996 -1.24459,0.0927 -2.46671,-0.2491 -3.59505,-0.74812 -1.35789,-0.55965 ' +\n          '-2.75133,-1.33436996 -4.27027,-1.18121996 -1.37741,0.14601 -2.41842,1.13685996 -3.44288,1.96782996 z',\n        height: 4,\n        width: 15,\n        heightElements: [],\n        widthElements: []\n      },\n      'TASK_TYPE_SEND': {\n        d: 'm {mx},{my} l 0,{e.y1} l {e.x1},0 l 0,-{e.y1} z l {e.x0},{e.y0} l {e.x0},-{e.y0}',\n        height: 14,\n        width:  21,\n        heightElements: [ 6, 14 ],\n        widthElements: [ 10.5, 21 ]\n      },\n      'TASK_TYPE_SCRIPT': {\n        d: 'm {mx},{my} c 9.966553,-6.27276 -8.000926,-7.91932 2.968968,-14.938 l -8.802728,0 ' +\n          'c -10.969894,7.01868 6.997585,8.66524 -2.968967,14.938 z ' +\n          'm -7,-12 l 5,0 ' +\n          'm -4.5,3 l 4.5,0 ' +\n          'm -3,3 l 5,0' +\n          'm -4,3 l 5,0',\n        height: 15,\n        width:  12.6,\n        heightElements: [ 6, 14 ],\n        widthElements: [ 10.5, 21 ]\n      },\n      'TASK_TYPE_USER_1': {\n        d: 'm {mx},{my} c 0.909,-0.845 1.594,-2.049 1.594,-3.385 0,-2.554 -1.805,-4.62199999 ' +\n          '-4.357,-4.62199999 -2.55199998,0 -4.28799998,2.06799999 -4.28799998,4.62199999 0,1.348 ' +\n          '0.974,2.562 1.89599998,3.405 -0.52899998,0.187 -5.669,2.097 -5.794,4.7560005 v 6.718 ' +\n          'h 17 v -6.718 c 0,-2.2980005 -5.5279996,-4.5950005 -6.0509996,-4.7760005 z' +\n          'm -8,6 l 0,5.5 m 11,0 l 0,-5'\n      },\n      'TASK_TYPE_USER_2': {\n        d: 'm {mx},{my} m 2.162,1.009 c 0,2.4470005 -2.158,4.4310005 -4.821,4.4310005 ' +\n          '-2.66499998,0 -4.822,-1.981 -4.822,-4.4310005 '\n      },\n      'TASK_TYPE_USER_3': {\n        d: 'm {mx},{my} m -6.9,-3.80 c 0,0 2.25099998,-2.358 4.27399998,-1.177 2.024,1.181 4.221,1.537 ' +\n          '4.124,0.965 -0.098,-0.57 -0.117,-3.79099999 -4.191,-4.13599999 -3.57499998,0.001 ' +\n          '-4.20799998,3.36699999 -4.20699998,4.34799999 z'\n      },\n      'TASK_TYPE_MANUAL': {\n        d: 'm {mx},{my} c 0.234,-0.01 5.604,0.008 8.029,0.004 0.808,0 1.271,-0.172 1.417,-0.752 0.227,-0.898 ' +\n          '-0.334,-1.314 -1.338,-1.316 -2.467,-0.01 -7.886,-0.004 -8.108,-0.004 -0.014,-0.079 0.016,-0.533 0,-0.61 ' +\n          '0.195,-0.042 8.507,0.006 9.616,0.002 0.877,-0.007 1.35,-0.438 1.353,-1.208 0.003,-0.768 -0.479,-1.09 ' +\n          '-1.35,-1.091 -2.968,-0.002 -9.619,-0.013 -9.619,-0.013 v -0.591 c 0,0 5.052,-0.016 7.225,-0.016 ' +\n          '0.888,-0.002 1.354,-0.416 1.351,-1.193 -0.006,-0.761 -0.492,-1.196 -1.361,-1.196 -3.473,-0.005 ' +\n          '-10.86,-0.003 -11.0829995,-0.003 -0.022,-0.047 -0.045,-0.094 -0.069,-0.139 0.3939995,-0.319 ' +\n          '2.0409995,-1.626 2.4149995,-2.017 0.469,-0.4870005 0.519,-1.1650005 0.162,-1.6040005 -0.414,-0.511 ' +\n          '-0.973,-0.5 -1.48,-0.236 -1.4609995,0.764 -6.5999995,3.6430005 -7.7329995,4.2710005 -0.9,0.499 ' +\n          '-1.516,1.253 -1.882,2.19 -0.37000002,0.95 -0.17,2.01 -0.166,2.979 0.004,0.718 -0.27300002,1.345 ' +\n          '-0.055,2.063 0.629,2.087 2.425,3.312 4.859,3.318 4.6179995,0.014 9.2379995,-0.139 13.8569995,-0.158 ' +\n          '0.755,-0.004 1.171,-0.301 1.182,-1.033 0.012,-0.754 -0.423,-0.969 -1.183,-0.973 -1.778,-0.01 ' +\n          '-5.824,-0.004 -6.04,-0.004 10e-4,-0.084 0.003,-0.586 10e-4,-0.67 z'\n      },\n      'TASK_TYPE_INSTANTIATING_SEND': {\n        d: 'm {mx},{my} l 0,8.4 l 12.6,0 l 0,-8.4 z l 6.3,3.6 l 6.3,-3.6'\n      },\n      'TASK_TYPE_SERVICE': {\n        d: 'm {mx},{my} v -1.71335 c 0.352326,-0.0705 0.703932,-0.17838 1.047628,-0.32133 ' +\n          '0.344416,-0.14465 0.665822,-0.32133 0.966377,-0.52145 l 1.19431,1.18005 1.567487,-1.57688 ' +\n          '-1.195028,-1.18014 c 0.403376,-0.61394 0.683079,-1.29908 0.825447,-2.01824 l 1.622133,-0.01 ' +\n          'v -2.2196 l -1.636514,0.01 c -0.07333,-0.35153 -0.178319,-0.70024 -0.323564,-1.04372 ' +\n          '-0.145244,-0.34406 -0.321407,-0.6644 -0.522735,-0.96217 l 1.131035,-1.13631 -1.583305,-1.56293 ' +\n          '-1.129598,1.13589 c -0.614052,-0.40108 -1.302883,-0.68093 -2.022633,-0.82247 l 0.0093,-1.61852 ' +\n          'h -2.241173 l 0.0042,1.63124 c -0.353763,0.0736 -0.705369,0.17977 -1.049785,0.32371 -0.344415,0.14437 ' +\n          '-0.665102,0.32092 -0.9635006,0.52046 l -1.1698628,-1.15823 -1.5667691,1.5792 1.1684265,1.15669 ' +\n          'c -0.4026573,0.61283 -0.68308,1.29797 -0.8247287,2.01713 l -1.6588041,0.003 v 2.22174 ' +\n          'l 1.6724648,-0.006 c 0.073327,0.35077 0.1797598,0.70243 0.3242851,1.04472 0.1452428,0.34448 ' +\n          '0.3214064,0.6644 0.5227339,0.96066 l -1.1993431,1.19723 1.5840256,1.56011 1.1964668,-1.19348 ' +\n          'c 0.6140517,0.40346 1.3028827,0.68232 2.0233517,0.82331 l 7.19e-4,1.69892 h 2.226848 z ' +\n          'm 0.221462,-3.9957 c -1.788948,0.7502 -3.8576,-0.0928 -4.6097055,-1.87438 -0.7521065,-1.78321 ' +\n          '0.090598,-3.84627 1.8802645,-4.59604 1.78823,-0.74936 3.856881,0.0929 4.608987,1.87437 ' +\n          '0.752106,1.78165 -0.0906,3.84612 -1.879546,4.59605 z'\n      },\n      'TASK_TYPE_SERVICE_FILL': {\n        d: 'm {mx},{my} c -1.788948,0.7502 -3.8576,-0.0928 -4.6097055,-1.87438 -0.7521065,-1.78321 ' +\n          '0.090598,-3.84627 1.8802645,-4.59604 1.78823,-0.74936 3.856881,0.0929 4.608987,1.87437 ' +\n          '0.752106,1.78165 -0.0906,3.84612 -1.879546,4.59605 z'\n      },\n      'TASK_TYPE_BUSINESS_RULE_HEADER': {\n        d: 'm {mx},{my} 0,4 20,0 0,-4 z'\n      },\n      'TASK_TYPE_BUSINESS_RULE_MAIN': {\n        d: 'm {mx},{my} 0,12 20,0 0,-12 z' +\n          'm 0,8 l 20,0 ' +\n          'm -13,-4 l 0,8'\n      },\n      'MESSAGE_FLOW_MARKER': {\n        d: 'm {mx},{my} m -10.5 ,-7 l 0,14 l 21,0 l 0,-14 z l 10.5,6 l 10.5,-6'\n      }\n    };\n\n    /**\n     * Return raw path for the given ID.\n     *\n     * @param {string} pathId\n     *\n     * @return {string} raw path\n     */\n    this.getRawPath = function getRawPath(pathId) {\n      return this.pathMap[pathId].d;\n    };\n\n    /**\n     * Scales the path to the given height and width.\n     * <h1>Use case</h1>\n     * <p>Use case is to scale the content of elements (event, gateways) based\n     * on the element bounding box's size.\n     * </p>\n     * <h1>Why not transform</h1>\n     * <p>Scaling a path with transform() will also scale the stroke and IE does not support\n     * the option 'non-scaling-stroke' to prevent this.\n     * Also there are use cases where only some parts of a path should be\n     * scaled.</p>\n     *\n     * @param {string} pathId The ID of the path.\n     * @param {Object} param <p>\n     *   Example param object scales the path to 60% size of the container (data.width, data.height).\n     *   <pre>\n     *   {\n     *     xScaleFactor: 0.6,\n     *     yScaleFactor:0.6,\n     *     containerWidth: data.width,\n     *     containerHeight: data.height,\n     *     position: {\n     *       mx: 0.46,\n     *       my: 0.2,\n     *     }\n     *   }\n     *   </pre>\n     *   <ul>\n     *    <li>targetpathwidth = xScaleFactor * containerWidth</li>\n     *    <li>targetpathheight = yScaleFactor * containerHeight</li>\n     *    <li>Position is used to set the starting coordinate of the path. M is computed:\n      *    <ul>\n      *      <li>position.x * containerWidth</li>\n      *      <li>position.y * containerHeight</li>\n      *    </ul>\n      *    Center of the container <pre> position: {\n     *       mx: 0.5,\n     *       my: 0.5,\n     *     }</pre>\n     *     Upper left corner of the container\n     *     <pre> position: {\n     *       mx: 0.0,\n     *       my: 0.0,\n     *     }</pre>\n     *    </li>\n     *   </ul>\n     * </p>\n     *\n     * @return {string} scaled path\n     */\n    this.getScaledPath = function getScaledPath(pathId, param) {\n      var rawPath = this.pathMap[pathId];\n\n      // positioning\n      // compute the start point of the path\n      var mx, my;\n\n      if (param.abspos) {\n        mx = param.abspos.x;\n        my = param.abspos.y;\n      } else {\n        mx = param.containerWidth * param.position.mx;\n        my = param.containerHeight * param.position.my;\n      }\n\n      var coordinates = {}; // map for the scaled coordinates\n      if (param.position) {\n\n        // path\n        var heightRatio = (param.containerHeight / rawPath.height) * param.yScaleFactor;\n        var widthRatio = (param.containerWidth / rawPath.width) * param.xScaleFactor;\n\n\n        // Apply height ratio\n        for (var heightIndex = 0; heightIndex < rawPath.heightElements.length; heightIndex++) {\n          coordinates['y' + heightIndex] = rawPath.heightElements[heightIndex] * heightRatio;\n        }\n\n        // Apply width ratio\n        for (var widthIndex = 0; widthIndex < rawPath.widthElements.length; widthIndex++) {\n          coordinates['x' + widthIndex] = rawPath.widthElements[widthIndex] * widthRatio;\n        }\n      }\n\n      // Apply value to raw path\n      var path = format(\n        rawPath.d, {\n          mx: mx,\n          my: my,\n          e: coordinates\n        }\n      );\n      return path;\n    };\n  }\n\n  // helpers //////////////////////\n\n  // copied and adjusted from https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js\n  var tokenRegex = /\\{([^{}]+)\\}/g,\n      objNotationRegex = /(?:(?:^|\\.)(.+?)(?=\\[|\\.|$|\\()|\\[('|\")(.+?)\\2\\])(\\(\\))?/g; // matches .xxxxx or [\"xxxxx\"] to run over object properties\n\n  function replacer(all, key, obj) {\n    var res = obj;\n    key.replace(objNotationRegex, function(all, name, quote, quotedName, isFunc) {\n      name = name || quotedName;\n      if (res) {\n        if (name in res) {\n          res = res[name];\n        }\n        typeof res == 'function' && isFunc && (res = res());\n      }\n    });\n    res = (res == null || res == obj ? all : res) + '';\n\n    return res;\n  }\n\n  function format(str, obj) {\n    return String(str).replace(tokenRegex, function(all, key) {\n      return replacer(all, key, obj);\n    });\n  }\n\n  var DrawModule$1 = {\n    __init__: [ 'bpmnRenderer' ],\n    bpmnRenderer: [ 'type', BpmnRenderer ],\n    textRenderer: [ 'type', TextRenderer ],\n    pathMap: [ 'type', PathMap ]\n  };\n\n  /**\n   * @typedef { {\n   *   [key: string]: string;\n   * } } TranslateReplacements\n   */\n\n  /**\n   * A simple translation stub to be used for multi-language support\n   * in diagrams. Can be easily replaced with a more sophisticated\n   * solution.\n   *\n   * @example\n   *\n   * ```javascript\n   * // use it inside any diagram component by injecting `translate`.\n   *\n   * function MyService(translate) {\n   *   alert(translate('HELLO {you}', { you: 'You!' }));\n   * }\n   * ```\n   *\n   * @param {string} template to interpolate\n   * @param {TranslateReplacements} [replacements] a map with substitutes\n   *\n   * @return {string} the translated string\n   */\n  function translate(template, replacements) {\n\n    replacements = replacements || {};\n\n    return template.replace(/{([^}]+)}/g, function(_, key) {\n      return replacements[key] || '{' + key + '}';\n    });\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var TranslateModule = {\n    translate: [ 'value', translate ]\n  };\n\n  function getDefaultExportFromCjs (x) {\n  \treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n  }\n\n  /**\n   * @param {Point} point\n   *\n   * @returns {Point}\n   */\n  function roundPoint(point) {\n\n    return {\n      x: Math.round(point.x),\n      y: Math.round(point.y)\n    };\n  }\n\n\n  /**\n   * Convert the given bounds to a { top, left, bottom, right } descriptor.\n   *\n   * @param {Point|Rect} bounds\n   *\n   * @return {RectTRBL}\n   */\n  function asTRBL(bounds) {\n    return {\n      top: bounds.y,\n      right: bounds.x + (bounds.width || 0),\n      bottom: bounds.y + (bounds.height || 0),\n      left: bounds.x\n    };\n  }\n\n\n  /**\n   * Convert a { top, left, bottom, right } to an objects bounds.\n   *\n   * @param {RectTRBL} trbl\n   *\n   * @return {Rect}\n   */\n  function asBounds(trbl) {\n    return {\n      x: trbl.left,\n      y: trbl.top,\n      width: trbl.right - trbl.left,\n      height: trbl.bottom - trbl.top\n    };\n  }\n\n\n  /**\n   * Get the mid of the given bounds or point.\n   *\n   * @param {Point|Rect} bounds\n   *\n   * @return {Point}\n   */\n  function getBoundsMid(bounds) {\n    return roundPoint({\n      x: bounds.x + (bounds.width || 0) / 2,\n      y: bounds.y + (bounds.height || 0) / 2\n    });\n  }\n\n\n  /**\n   * Get the mid of the given Connection.\n   *\n   * @param {Connection} connection\n   *\n   * @return {Point}\n   */\n  function getConnectionMid(connection) {\n    var waypoints = connection.waypoints;\n\n    // calculate total length and length of each segment\n    var parts = waypoints.reduce(function(parts, point, index) {\n\n      var lastPoint = waypoints[index - 1];\n\n      if (lastPoint) {\n        var lastPart = parts[parts.length - 1];\n\n        var startLength = lastPart && lastPart.endLength || 0;\n        var length = distance(lastPoint, point);\n\n        parts.push({\n          start: lastPoint,\n          end: point,\n          startLength: startLength,\n          endLength: startLength + length,\n          length: length\n        });\n      }\n\n      return parts;\n    }, []);\n\n    var totalLength = parts.reduce(function(length, part) {\n      return length + part.length;\n    }, 0);\n\n    // find which segement contains middle point\n    var midLength = totalLength / 2;\n\n    var i = 0;\n    var midSegment = parts[i];\n\n    while (midSegment.endLength < midLength) {\n      midSegment = parts[++i];\n    }\n\n    // calculate relative position on mid segment\n    var segmentProgress = (midLength - midSegment.startLength) / midSegment.length;\n\n    var midPoint = {\n      x: midSegment.start.x + (midSegment.end.x - midSegment.start.x) * segmentProgress,\n      y: midSegment.start.y + (midSegment.end.y - midSegment.start.y) * segmentProgress\n    };\n\n    return midPoint;\n  }\n\n\n  /**\n   * Get the mid of the given Element.\n   *\n   * @param {Element} element\n   *\n   * @return {Point}\n   */\n  function getMid(element) {\n    if (isConnection(element)) {\n      return getConnectionMid(element);\n    }\n\n    return getBoundsMid(element);\n  }\n\n  // helpers //////////////////////\n\n  function distance(a, b) {\n    return Math.sqrt(Math.pow(a.x - b.x, 2) + Math.pow(a.y - b.y, 2));\n  }\n\n  function elementToString(e) {\n    if (!e) {\n      return '<null>';\n    }\n\n    return '<' + e.$type + (e.id ? ' id=\"' + e.id : '') + '\" />';\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n   *\n   * @typedef {import('../features/modeling/ElementFactory').default} ElementFactory\n   * @typedef {import('../draw/TextRenderer').default} TextRenderer\n   *\n   * @typedef {import('../model/Types').Element} Element\n   * @typedef {import('../model/Types').Label} Label\n   * @typedef {import('../model/Types').Shape} Shape\n   * @typedef {import('../model/Types').Connection} Connection\n   * @typedef {import('../model/Types').Root} Root\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   */\n\n  /**\n   * @param {ModdleElement} semantic\n   * @param {ModdleElement} di\n   * @param {Object} [attrs=null]\n   *\n   * @return {Object}\n   */\n  function elementData(semantic, di, attrs) {\n    return assign$1({\n      id: semantic.id,\n      type: semantic.$type,\n      businessObject: semantic,\n      di: di\n    }, attrs);\n  }\n\n  function getWaypoints(di, source, target) {\n\n    var waypoints = di.waypoint;\n\n    if (!waypoints || waypoints.length < 2) {\n      return [ getMid(source), getMid(target) ];\n    }\n\n    return waypoints.map(function(p) {\n      return { x: p.x, y: p.y };\n    });\n  }\n\n  function notYetDrawn(translate, semantic, refSemantic, property) {\n    return new Error(translate('element {element} referenced by {referenced}#{property} not yet drawn', {\n      element: elementToString(refSemantic),\n      referenced: elementToString(semantic),\n      property: property\n    }));\n  }\n\n\n  /**\n   * An importer that adds bpmn elements to the canvas\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {ElementFactory} elementFactory\n   * @param {ElementRegistry} elementRegistry\n   * @param {Function} translate\n   * @param {TextRenderer} textRenderer\n   */\n  function BpmnImporter(\n      eventBus, canvas, elementFactory,\n      elementRegistry, translate, textRenderer) {\n\n    this._eventBus = eventBus;\n    this._canvas = canvas;\n    this._elementFactory = elementFactory;\n    this._elementRegistry = elementRegistry;\n    this._translate = translate;\n    this._textRenderer = textRenderer;\n  }\n\n  BpmnImporter.$inject = [\n    'eventBus',\n    'canvas',\n    'elementFactory',\n    'elementRegistry',\n    'translate',\n    'textRenderer'\n  ];\n\n\n  /**\n   * Add a BPMN element (semantic) to the canvas making it a child of the\n   * given parent.\n   *\n   * @param {ModdleElement} semantic\n   * @param {ModdleElement} di\n   * @param {Shape} parentElement\n   *\n   * @return {Shape | Root | Connection}\n   */\n  BpmnImporter.prototype.add = function(semantic, di, parentElement) {\n    var element,\n        translate = this._translate,\n        hidden;\n\n    var parentIndex;\n\n    // ROOT ELEMENT\n    // handle the special case that we deal with a\n    // invisible root element (process, subprocess or collaboration)\n    if (is$1(di, 'bpmndi:BPMNPlane')) {\n\n      var attrs = is$1(semantic, 'bpmn:SubProcess')\n        ? { id: semantic.id + '_plane' }\n        : {};\n\n      // add a virtual element (not being drawn)\n      element = this._elementFactory.createRoot(elementData(semantic, di, attrs));\n\n      this._canvas.addRootElement(element);\n    }\n\n    // SHAPE\n    else if (is$1(di, 'bpmndi:BPMNShape')) {\n\n      var collapsed = !isExpanded(semantic, di),\n          isFrame = isFrameElement$1(semantic);\n\n      hidden = parentElement && (parentElement.hidden || parentElement.collapsed);\n\n      var bounds = di.bounds;\n\n      element = this._elementFactory.createShape(elementData(semantic, di, {\n        collapsed: collapsed,\n        hidden: hidden,\n        x: Math.round(bounds.x),\n        y: Math.round(bounds.y),\n        width: Math.round(bounds.width),\n        height: Math.round(bounds.height),\n        isFrame: isFrame\n      }));\n\n      if (is$1(semantic, 'bpmn:BoundaryEvent')) {\n        this._attachBoundary(semantic, element);\n      }\n\n      // insert lanes behind other flow nodes (cf. #727)\n      if (is$1(semantic, 'bpmn:Lane')) {\n        parentIndex = 0;\n      }\n\n      if (is$1(semantic, 'bpmn:DataStoreReference')) {\n\n        // check whether data store is inside our outside of its semantic parent\n        if (!isPointInsideBBox(parentElement, getMid(bounds))) {\n          parentElement = this._canvas.findRoot(parentElement);\n        }\n      }\n\n      this._canvas.addShape(element, parentElement, parentIndex);\n    }\n\n    // CONNECTION\n    else if (is$1(di, 'bpmndi:BPMNEdge')) {\n\n      var source = this._getSource(semantic),\n          target = this._getTarget(semantic);\n\n      hidden = parentElement && (parentElement.hidden || parentElement.collapsed);\n\n      element = this._elementFactory.createConnection(elementData(semantic, di, {\n        hidden: hidden,\n        source: source,\n        target: target,\n        waypoints: getWaypoints(di, source, target)\n      }));\n\n      if (is$1(semantic, 'bpmn:DataAssociation')) {\n\n        // render always on top; this ensures DataAssociations\n        // are rendered correctly across different \"hacks\" people\n        // love to model such as cross participant / sub process\n        // associations\n        parentElement = this._canvas.findRoot(parentElement);\n      }\n\n      this._canvas.addConnection(element, parentElement, parentIndex);\n    } else {\n      throw new Error(translate('unknown di {di} for element {semantic}', {\n        di: elementToString(di),\n        semantic: elementToString(semantic)\n      }));\n    }\n\n    // (optional) LABEL\n    if (isLabelExternal(semantic) && getLabel(element)) {\n      this.addLabel(semantic, di, element);\n    }\n\n\n    this._eventBus.fire('bpmnElement.added', { element: element });\n\n    return element;\n  };\n\n\n  /**\n   * Attach a boundary element to the given host.\n   *\n   * @param {ModdleElement} boundarySemantic\n   * @param {Shape} boundaryElement\n   */\n  BpmnImporter.prototype._attachBoundary = function(boundarySemantic, boundaryElement) {\n    var translate = this._translate;\n    var hostSemantic = boundarySemantic.attachedToRef;\n\n    if (!hostSemantic) {\n      throw new Error(translate('missing {semantic}#attachedToRef', {\n        semantic: elementToString(boundarySemantic)\n      }));\n    }\n\n    var host = this._elementRegistry.get(hostSemantic.id),\n        attachers = host && host.attachers;\n\n    if (!host) {\n      throw notYetDrawn(translate, boundarySemantic, hostSemantic, 'attachedToRef');\n    }\n\n    // wire element.host <> host.attachers\n    boundaryElement.host = host;\n\n    if (!attachers) {\n      host.attachers = attachers = [];\n    }\n\n    if (attachers.indexOf(boundaryElement) === -1) {\n      attachers.push(boundaryElement);\n    }\n  };\n\n\n  /**\n   * Add a label to a given element.\n   *\n   * @param {ModdleElement} semantic\n   * @param {ModdleElement} di\n   * @param {Element} element\n   *\n   * @return {Label}\n   */\n  BpmnImporter.prototype.addLabel = function(semantic, di, element) {\n    var bounds,\n        text,\n        label;\n\n    bounds = getExternalLabelBounds(di, element);\n\n    text = getLabel(element);\n\n    if (text) {\n\n      // get corrected bounds from actual layouted text\n      bounds = this._textRenderer.getExternalLabelBounds(bounds, text);\n    }\n\n    label = this._elementFactory.createLabel(elementData(semantic, di, {\n      id: semantic.id + '_label',\n      labelTarget: element,\n      type: 'label',\n      hidden: element.hidden || !getLabel(element),\n      x: Math.round(bounds.x),\n      y: Math.round(bounds.y),\n      width: Math.round(bounds.width),\n      height: Math.round(bounds.height)\n    }));\n\n    return this._canvas.addShape(label, element.parent);\n  };\n\n  /**\n   * Get the source or target of the given connection.\n   *\n   * @param {ModdleElement} semantic\n   * @param {'source' | 'target'} side\n   *\n   * @return {Element}\n   */\n  BpmnImporter.prototype._getConnectedElement = function(semantic, side) {\n\n    var element,\n        refSemantic,\n        type = semantic.$type,\n        translate = this._translate;\n\n    refSemantic = semantic[side + 'Ref'];\n\n    // handle mysterious isMany DataAssociation#sourceRef\n    if (side === 'source' && type === 'bpmn:DataInputAssociation') {\n      refSemantic = refSemantic && refSemantic[0];\n    }\n\n    // fix source / target for DataInputAssociation / DataOutputAssociation\n    if (side === 'source' && type === 'bpmn:DataOutputAssociation' ||\n        side === 'target' && type === 'bpmn:DataInputAssociation') {\n\n      refSemantic = semantic.$parent;\n    }\n\n    element = refSemantic && this._getElement(refSemantic);\n\n    if (element) {\n      return element;\n    }\n\n    if (refSemantic) {\n      throw notYetDrawn(translate, semantic, refSemantic, side + 'Ref');\n    } else {\n      throw new Error(translate('{semantic}#{side} Ref not specified', {\n        semantic: elementToString(semantic),\n        side: side\n      }));\n    }\n  };\n\n  BpmnImporter.prototype._getSource = function(semantic) {\n    return this._getConnectedElement(semantic, 'source');\n  };\n\n  BpmnImporter.prototype._getTarget = function(semantic) {\n    return this._getConnectedElement(semantic, 'target');\n  };\n\n\n  BpmnImporter.prototype._getElement = function(semantic) {\n    return this._elementRegistry.get(semantic.id);\n  };\n\n\n  // helpers ////////////////////\n\n  function isPointInsideBBox(bbox, point) {\n    var x = point.x,\n        y = point.y;\n\n    return x >= bbox.x &&\n      x <= bbox.x + bbox.width &&\n      y >= bbox.y &&\n      y <= bbox.y + bbox.height;\n  }\n\n  function isFrameElement$1(semantic) {\n    return is$1(semantic, 'bpmn:Group');\n  }\n\n  var ImportModule = {\n    __depends__: [\n      TranslateModule\n    ],\n    bpmnImporter: [ 'type', BpmnImporter ]\n  };\n\n  var CoreModule$1 = {\n    __depends__: [\n      DrawModule$1,\n      ImportModule\n    ]\n  };\n\n  /**\n   * @typedef {import('../util/Types').Point} Point\n   */\n\n  /**\n   * @param {import('../core/EventBus').Event} event\n   *\n   * @return {Event}\n   */\n  function getOriginal(event) {\n    return event.originalEvent || event.srcEvent;\n  }\n\n  /**\n   * @param {Event} event\n   *\n   * @return {Point|null}\n   */\n  function toPoint(event) {\n\n    if (event.pointers && event.pointers.length) {\n      event = event.pointers[0];\n    }\n\n    if (event.touches && event.touches.length) {\n      event = event.touches[0];\n    }\n\n    return event ? {\n      x: event.clientX,\n      y: event.clientY\n    } : null;\n  }\n\n  function isMac() {\n    return (/mac/i).test(navigator.platform);\n  }\n\n  /**\n   * @param {MouseEvent} event\n   * @param {string} button\n   *\n   * @return {boolean}\n   */\n  function isButton(event, button) {\n    return (getOriginal(event) || event).button === button;\n  }\n\n  /**\n   * @param {MouseEvent} event\n   *\n   * @return {boolean}\n   */\n  function isPrimaryButton(event) {\n\n    // button === 0 -> left áka primary mouse button\n    return isButton(event, 0);\n  }\n\n  /**\n   * @param {MouseEvent} event\n   *\n   * @return {boolean}\n   */\n  function isAuxiliaryButton(event) {\n\n    // button === 1 -> auxiliary áka wheel button\n    return isButton(event, 1);\n  }\n\n  /**\n   * @param {MouseEvent} event\n   *\n   * @return {boolean}\n   */\n  function hasPrimaryModifier(event) {\n    var originalEvent = getOriginal(event) || event;\n\n    if (!isPrimaryButton(event)) {\n      return false;\n    }\n\n    // Use cmd as primary modifier key for mac OS\n    if (isMac()) {\n      return originalEvent.metaKey;\n    } else {\n      return originalEvent.ctrlKey;\n    }\n  }\n\n  /**\n   * @param {MouseEvent} event\n   *\n   * @return {boolean}\n   */\n  function hasSecondaryModifier(event) {\n    var originalEvent = getOriginal(event) || event;\n\n    return isPrimaryButton(event) && originalEvent.shiftKey;\n  }\n\n  /**\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../../draw/Styles').default} Styles\n   *\n   * @typedef {import('../../util/Types').Point} Point\n   */\n\n  function allowAll(event) { return true; }\n\n  function allowPrimaryAndAuxiliary(event) {\n    return isPrimaryButton(event) || isAuxiliaryButton(event);\n  }\n\n  var LOW_PRIORITY$4 = 500;\n\n\n  /**\n   * A plugin that provides interaction events for diagram elements.\n   *\n   * It emits the following events:\n   *\n   *   * element.click\n   *   * element.contextmenu\n   *   * element.dblclick\n   *   * element.hover\n   *   * element.mousedown\n   *   * element.mousemove\n   *   * element.mouseup\n   *   * element.out\n   *\n   * Each event is a tuple { element, gfx, originalEvent }.\n   *\n   * Canceling the event via Event#preventDefault()\n   * prevents the original DOM operation.\n   *\n   * @param {EventBus} eventBus\n   * @param {ElementRegistry} elementRegistry\n   * @param {Styles} styles\n   */\n  function InteractionEvents(eventBus, elementRegistry, styles) {\n\n    var self = this;\n\n    /**\n     * Fire an interaction event.\n     *\n     * @param {string} type local event name, e.g. element.click.\n     * @param {MouseEvent|TouchEvent} event native event\n     * @param {Element} [element] the diagram element to emit the event on;\n     *                                   defaults to the event target\n     */\n    function fire(type, event, element) {\n\n      if (isIgnored(type, event)) {\n        return;\n      }\n\n      var target, gfx, returnValue;\n\n      if (!element) {\n        target = event.delegateTarget || event.target;\n\n        if (target) {\n          gfx = target;\n          element = elementRegistry.get(gfx);\n        }\n      } else {\n        gfx = elementRegistry.getGraphics(element);\n      }\n\n      if (!gfx || !element) {\n        return;\n      }\n\n      returnValue = eventBus.fire(type, {\n        element: element,\n        gfx: gfx,\n        originalEvent: event\n      });\n\n      if (returnValue === false) {\n        event.stopPropagation();\n        event.preventDefault();\n      }\n    }\n\n    // TODO(nikku): document this\n    var handlers = {};\n\n    function mouseHandler(localEventName) {\n      return handlers[localEventName];\n    }\n\n    function isIgnored(localEventName, event) {\n\n      var filter = ignoredFilters[localEventName] || isPrimaryButton;\n\n      // only react on left mouse button interactions\n      // except for interaction events that are enabled\n      // for secundary mouse button\n      return !filter(event);\n    }\n\n    var bindings = {\n      click: 'element.click',\n      contextmenu: 'element.contextmenu',\n      dblclick: 'element.dblclick',\n      mousedown: 'element.mousedown',\n      mousemove: 'element.mousemove',\n      mouseover: 'element.hover',\n      mouseout: 'element.out',\n      mouseup: 'element.mouseup',\n    };\n\n    var ignoredFilters = {\n      'element.contextmenu': allowAll,\n      'element.mousedown': allowPrimaryAndAuxiliary,\n      'element.mouseup': allowPrimaryAndAuxiliary,\n      'element.click': allowPrimaryAndAuxiliary,\n      'element.dblclick': allowPrimaryAndAuxiliary\n    };\n\n\n    // manual event trigger //////////\n\n    /**\n     * Trigger an interaction event (based on a native dom event)\n     * on the target shape or connection.\n     *\n     * @param {string} eventName the name of the triggered DOM event\n     * @param {MouseEvent|TouchEvent} event\n     * @param {Element} targetElement\n     */\n    function triggerMouseEvent(eventName, event, targetElement) {\n\n      // i.e. element.mousedown...\n      var localEventName = bindings[eventName];\n\n      if (!localEventName) {\n        throw new Error('unmapped DOM event name <' + eventName + '>');\n      }\n\n      return fire(localEventName, event, targetElement);\n    }\n\n\n    var ELEMENT_SELECTOR = 'svg, .djs-element';\n\n    // event handling ///////\n\n    function registerEvent(node, event, localEvent, ignoredFilter) {\n\n      var handler = handlers[localEvent] = function(event) {\n        fire(localEvent, event);\n      };\n\n      if (ignoredFilter) {\n        ignoredFilters[localEvent] = ignoredFilter;\n      }\n\n      handler.$delegate = delegate.bind(node, ELEMENT_SELECTOR, event, handler);\n    }\n\n    function unregisterEvent(node, event, localEvent) {\n\n      var handler = mouseHandler(localEvent);\n\n      if (!handler) {\n        return;\n      }\n\n      delegate.unbind(node, event, handler.$delegate);\n    }\n\n    function registerEvents(svg) {\n      forEach$1(bindings, function(val, key) {\n        registerEvent(svg, key, val);\n      });\n    }\n\n    function unregisterEvents(svg) {\n      forEach$1(bindings, function(val, key) {\n        unregisterEvent(svg, key, val);\n      });\n    }\n\n    eventBus.on('canvas.destroy', function(event) {\n      unregisterEvents(event.svg);\n    });\n\n    eventBus.on('canvas.init', function(event) {\n      registerEvents(event.svg);\n    });\n\n\n    // hit box updating ////////////////\n\n    eventBus.on([ 'shape.added', 'connection.added' ], function(event) {\n      var element = event.element,\n          gfx = event.gfx;\n\n      eventBus.fire('interactionEvents.createHit', { element: element, gfx: gfx });\n    });\n\n    // Update djs-hit on change.\n    // A low priortity is necessary, because djs-hit of labels has to be updated\n    // after the label bounds have been updated in the renderer.\n    eventBus.on([\n      'shape.changed',\n      'connection.changed'\n    ], LOW_PRIORITY$4, function(event) {\n\n      var element = event.element,\n          gfx = event.gfx;\n\n      eventBus.fire('interactionEvents.updateHit', { element: element, gfx: gfx });\n    });\n\n    eventBus.on('interactionEvents.createHit', LOW_PRIORITY$4, function(event) {\n      var element = event.element,\n          gfx = event.gfx;\n\n      self.createDefaultHit(element, gfx);\n    });\n\n    eventBus.on('interactionEvents.updateHit', function(event) {\n      var element = event.element,\n          gfx = event.gfx;\n\n      self.updateDefaultHit(element, gfx);\n    });\n\n\n    // hit styles ////////////\n\n    var STROKE_HIT_STYLE = createHitStyle('djs-hit djs-hit-stroke');\n\n    var CLICK_STROKE_HIT_STYLE = createHitStyle('djs-hit djs-hit-click-stroke');\n\n    var ALL_HIT_STYLE = createHitStyle('djs-hit djs-hit-all');\n\n    var NO_MOVE_HIT_STYLE = createHitStyle('djs-hit djs-hit-no-move');\n\n    var HIT_TYPES = {\n      'all': ALL_HIT_STYLE,\n      'click-stroke': CLICK_STROKE_HIT_STYLE,\n      'stroke': STROKE_HIT_STYLE,\n      'no-move': NO_MOVE_HIT_STYLE\n    };\n\n    function createHitStyle(classNames, attrs) {\n\n      attrs = assign$1({\n        stroke: 'white',\n        strokeWidth: 15\n      }, attrs || {});\n\n      return styles.cls(classNames, [ 'no-fill', 'no-border' ], attrs);\n    }\n\n\n    // style helpers ///////////////\n\n    function applyStyle(hit, type) {\n\n      var attrs = HIT_TYPES[type];\n\n      if (!attrs) {\n        throw new Error('invalid hit type <' + type + '>');\n      }\n\n      attr$1(hit, attrs);\n\n      return hit;\n    }\n\n    function appendHit(gfx, hit) {\n      append(gfx, hit);\n    }\n\n\n    // API\n\n    /**\n     * Remove hints on the given graphics.\n     *\n     * @param {SVGElement} gfx\n     */\n    this.removeHits = function(gfx) {\n      var hits = all('.djs-hit', gfx);\n\n      forEach$1(hits, remove$2);\n    };\n\n    /**\n     * Create default hit for the given element.\n     *\n     * @param {Element} element\n     * @param {SVGElement} gfx\n     *\n     * @return {SVGElement} created hit\n     */\n    this.createDefaultHit = function(element, gfx) {\n      var waypoints = element.waypoints,\n          isFrame = element.isFrame,\n          boxType;\n\n      if (waypoints) {\n        return this.createWaypointsHit(gfx, waypoints);\n      } else {\n\n        boxType = isFrame ? 'stroke' : 'all';\n\n        return this.createBoxHit(gfx, boxType, {\n          width: element.width,\n          height: element.height\n        });\n      }\n    };\n\n    /**\n     * Create hits for the given waypoints.\n     *\n     * @param {SVGElement} gfx\n     * @param {Point[]} waypoints\n     *\n     * @return {SVGElement}\n     */\n    this.createWaypointsHit = function(gfx, waypoints) {\n\n      var hit = createLine(waypoints);\n\n      applyStyle(hit, 'stroke');\n\n      appendHit(gfx, hit);\n\n      return hit;\n    };\n\n    /**\n     * Create hits for a box.\n     *\n     * @param {SVGElement} gfx\n     * @param {string} type\n     * @param {Object} attrs\n     *\n     * @return {SVGElement}\n     */\n    this.createBoxHit = function(gfx, type, attrs) {\n\n      attrs = assign$1({\n        x: 0,\n        y: 0\n      }, attrs);\n\n      var hit = create$1('rect');\n\n      applyStyle(hit, type);\n\n      attr$1(hit, attrs);\n\n      appendHit(gfx, hit);\n\n      return hit;\n    };\n\n    /**\n     * Update default hit of the element.\n     *\n     * @param {Element} element\n     * @param {SVGElement} gfx\n     *\n     * @return {SVGElement} updated hit\n     */\n    this.updateDefaultHit = function(element, gfx) {\n\n      var hit = query('.djs-hit', gfx);\n\n      if (!hit) {\n        return;\n      }\n\n      if (element.waypoints) {\n        updateLine(hit, element.waypoints);\n      } else {\n        attr$1(hit, {\n          width: element.width,\n          height: element.height\n        });\n      }\n\n      return hit;\n    };\n\n    this.fire = fire;\n\n    this.triggerMouseEvent = triggerMouseEvent;\n\n    this.mouseHandler = mouseHandler;\n\n    this.registerEvent = registerEvent;\n    this.unregisterEvent = unregisterEvent;\n  }\n\n\n  InteractionEvents.$inject = [\n    'eventBus',\n    'elementRegistry',\n    'styles'\n  ];\n\n\n  /**\n   * An event indicating that the mouse hovered over an element\n   *\n   * @event element.hover\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * An event indicating that the mouse has left an element\n   *\n   * @event element.out\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * An event indicating that the mouse has clicked an element\n   *\n   * @event element.click\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * An event indicating that the mouse has double clicked an element\n   *\n   * @event element.dblclick\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * An event indicating that the mouse has gone down on an element.\n   *\n   * @event element.mousedown\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * An event indicating that the mouse has gone up on an element.\n   *\n   * @event element.mouseup\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * An event indicating that the context menu action is triggered\n   * via mouse or touch controls.\n   *\n   * @event element.contextmenu\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var InteractionEventsModule = {\n    __init__: [ 'interactionEvents' ],\n    interactionEvents: [ 'type', InteractionEvents ]\n  };\n\n  /**\n   * Returns the surrounding bbox for all elements in\n   * the array or the element primitive.\n   *\n   * @param {Element|Element[]} elements\n   * @param {boolean} [stopRecursion=false]\n   *\n   * @return {Rect}\n   */\n  function getBBox(elements, stopRecursion) {\n\n    stopRecursion = !!stopRecursion;\n    if (!isArray$2(elements)) {\n      elements = [ elements ];\n    }\n\n    var minX,\n        minY,\n        maxX,\n        maxY;\n\n    forEach$1(elements, function(element) {\n\n      // If element is a connection the bbox must be computed first\n      var bbox = element;\n      if (element.waypoints && !stopRecursion) {\n        bbox = getBBox(element.waypoints, true);\n      }\n\n      var x = bbox.x,\n          y = bbox.y,\n          height = bbox.height || 0,\n          width = bbox.width || 0;\n\n      if (x < minX || minX === undefined) {\n        minX = x;\n      }\n      if (y < minY || minY === undefined) {\n        minY = y;\n      }\n\n      if ((x + width) > maxX || maxX === undefined) {\n        maxX = x + width;\n      }\n      if ((y + height) > maxY || maxY === undefined) {\n        maxY = y + height;\n      }\n    });\n\n    return {\n      x: minX,\n      y: minY,\n      height: maxY - minY,\n      width: maxX - minX\n    };\n  }\n\n  /**\n   * Get the element's type\n   *\n   * @param {Element} element\n   *\n   * @return {'connection' | 'shape' | 'root'}\n   */\n  function getType(element) {\n\n    if ('waypoints' in element) {\n      return 'connection';\n    }\n\n    if ('x' in element) {\n      return 'shape';\n    }\n\n    return 'root';\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isFrameElement(element) {\n    return !!(element && element.isFrame);\n  }\n\n  var LOW_PRIORITY$3 = 500;\n\n  /**\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../../draw/Styles').default} Styles\n   */\n\n  /**\n   * @class\n   *\n   * A plugin that adds an outline to shapes and connections that may be activated and styled\n   * via CSS classes.\n   *\n   * @param {EventBus} eventBus\n   * @param {Styles} styles\n   */\n  function Outline(eventBus, styles) {\n\n    this.offset = 6;\n\n    var OUTLINE_STYLE = styles.cls('djs-outline', [ 'no-fill' ]);\n\n    var self = this;\n\n    function createOutline(gfx, bounds) {\n      var outline = create$1('rect');\n\n      attr$1(outline, assign$1({\n        x: 10,\n        y: 10,\n        rx: 4,\n        width: 100,\n        height: 100\n      }, OUTLINE_STYLE));\n\n      append(gfx, outline);\n\n      return outline;\n    }\n\n    // A low priortity is necessary, because outlines of labels have to be updated\n    // after the label bounds have been updated in the renderer.\n    eventBus.on([ 'shape.added', 'shape.changed' ], LOW_PRIORITY$3, function(event) {\n      var element = event.element,\n          gfx = event.gfx;\n\n      var outline = query('.djs-outline', gfx);\n\n      if (!outline) {\n        outline = createOutline(gfx);\n      }\n\n      self.updateShapeOutline(outline, element);\n    });\n\n    eventBus.on([ 'connection.added', 'connection.changed' ], function(event) {\n      var element = event.element,\n          gfx = event.gfx;\n\n      var outline = query('.djs-outline', gfx);\n\n      if (!outline) {\n        outline = createOutline(gfx);\n      }\n\n      self.updateConnectionOutline(outline, element);\n    });\n  }\n\n\n  /**\n   * Updates the outline of a shape respecting the dimension of the\n   * element and an outline offset.\n   *\n   * @param {SVGElement} outline\n   * @param {Element} element\n   */\n  Outline.prototype.updateShapeOutline = function(outline, element) {\n\n    attr$1(outline, {\n      x: -this.offset,\n      y: -this.offset,\n      width: element.width + this.offset * 2,\n      height: element.height + this.offset * 2\n    });\n\n  };\n\n\n  /**\n   * Updates the outline of a connection respecting the bounding box of\n   * the connection and an outline offset.\n   *\n   * @param {SVGElement} outline\n   * @param {Element} connection\n   */\n  Outline.prototype.updateConnectionOutline = function(outline, connection) {\n\n    var bbox = getBBox(connection);\n\n    attr$1(outline, {\n      x: bbox.x - this.offset,\n      y: bbox.y - this.offset,\n      width: bbox.width + this.offset * 2,\n      height: bbox.height + this.offset * 2\n    });\n\n  };\n\n\n  Outline.$inject = [ 'eventBus', 'styles', 'elementRegistry' ];\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var OutlineModule = {\n    __init__: [ 'outline' ],\n    outline: [ 'type', Outline ]\n  };\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   */\n\n  /**\n   * A service that offers the current selection in a diagram.\n   * Offers the api to control the selection, too.\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   */\n  function Selection(eventBus, canvas) {\n\n    this._eventBus = eventBus;\n    this._canvas = canvas;\n\n    /**\n     * @type {Object[]}\n     */\n    this._selectedElements = [];\n\n    var self = this;\n\n    eventBus.on([ 'shape.remove', 'connection.remove' ], function(e) {\n      var element = e.element;\n      self.deselect(element);\n    });\n\n    eventBus.on([ 'diagram.clear', 'root.set' ], function(e) {\n      self.select(null);\n    });\n  }\n\n  Selection.$inject = [ 'eventBus', 'canvas' ];\n\n  /**\n   * Deselect an element.\n   *\n   * @param {Object} element The element to deselect.\n   */\n  Selection.prototype.deselect = function(element) {\n    var selectedElements = this._selectedElements;\n\n    var idx = selectedElements.indexOf(element);\n\n    if (idx !== -1) {\n      var oldSelection = selectedElements.slice();\n\n      selectedElements.splice(idx, 1);\n\n      this._eventBus.fire('selection.changed', { oldSelection: oldSelection, newSelection: selectedElements });\n    }\n  };\n\n  /**\n   * Get the selected elements.\n   *\n   * @return {Object[]} The selected elements.\n   */\n  Selection.prototype.get = function() {\n    return this._selectedElements;\n  };\n\n  /**\n   * Check whether an element is selected.\n   *\n   * @param {Object} element The element.\n   *\n   * @return {boolean} Whether the element is selected.\n   */\n  Selection.prototype.isSelected = function(element) {\n    return this._selectedElements.indexOf(element) !== -1;\n  };\n\n\n  /**\n   * Select one or many elements.\n   *\n   * @param {Object|Object[]} elements The element(s) to select.\n   * @param {boolean} [add] Whether to add the element(s) to the selected elements.\n   * Defaults to `false`.\n   */\n  Selection.prototype.select = function(elements, add) {\n    var selectedElements = this._selectedElements,\n        oldSelection = selectedElements.slice();\n\n    if (!isArray$2(elements)) {\n      elements = elements ? [ elements ] : [];\n    }\n\n    var canvas = this._canvas;\n\n    var rootElement = canvas.getRootElement();\n\n    elements = elements.filter(function(element) {\n      var elementRoot = canvas.findRoot(element);\n\n      return rootElement === elementRoot;\n    });\n\n    // selection may be cleared by passing an empty array or null\n    // to the method\n    if (add) {\n      forEach$1(elements, function(element) {\n        if (selectedElements.indexOf(element) !== -1) {\n\n          // already selected\n          return;\n        } else {\n          selectedElements.push(element);\n        }\n      });\n    } else {\n      this._selectedElements = selectedElements = elements.slice();\n    }\n\n    this._eventBus.fire('selection.changed', { oldSelection: oldSelection, newSelection: selectedElements });\n  };\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('./Selection').default} Selection\n   */\n\n  var MARKER_HOVER = 'hover',\n      MARKER_SELECTED = 'selected';\n\n  var SELECTION_OUTLINE_PADDING = 6;\n\n\n  /**\n   * A plugin that adds a visible selection UI to shapes and connections\n   * by appending the <code>hover</code> and <code>selected</code> classes to them.\n   *\n   * @class\n   *\n   * Makes elements selectable, too.\n   *\n   * @param {Canvas} canvas\n   * @param {EventBus} eventBus\n   * @param {Selection} selection\n   */\n  function SelectionVisuals(canvas, eventBus, selection) {\n    this._canvas = canvas;\n\n    var self = this;\n\n    this._multiSelectionBox = null;\n\n    function addMarker(e, cls) {\n      canvas.addMarker(e, cls);\n    }\n\n    function removeMarker(e, cls) {\n      canvas.removeMarker(e, cls);\n    }\n\n    eventBus.on('element.hover', function(event) {\n      addMarker(event.element, MARKER_HOVER);\n    });\n\n    eventBus.on('element.out', function(event) {\n      removeMarker(event.element, MARKER_HOVER);\n    });\n\n    eventBus.on('selection.changed', function(event) {\n\n      function deselect(s) {\n        removeMarker(s, MARKER_SELECTED);\n      }\n\n      function select(s) {\n        addMarker(s, MARKER_SELECTED);\n      }\n\n      var oldSelection = event.oldSelection,\n          newSelection = event.newSelection;\n\n      forEach$1(oldSelection, function(e) {\n        if (newSelection.indexOf(e) === -1) {\n          deselect(e);\n        }\n      });\n\n      forEach$1(newSelection, function(e) {\n        if (oldSelection.indexOf(e) === -1) {\n          select(e);\n        }\n      });\n\n      self._updateSelectionOutline(newSelection);\n    });\n\n\n    eventBus.on('element.changed', function(event) {\n      if (selection.isSelected(event.element)) {\n        self._updateSelectionOutline(selection.get());\n      }\n    });\n  }\n\n  SelectionVisuals.$inject = [\n    'canvas',\n    'eventBus',\n    'selection'\n  ];\n\n  SelectionVisuals.prototype._updateSelectionOutline = function(selection) {\n    var layer = this._canvas.getLayer('selectionOutline');\n\n    clear$1(layer);\n\n    var enabled = selection.length > 1;\n\n    var container = this._canvas.getContainer();\n\n    classes$1(container)[enabled ? 'add' : 'remove']('djs-multi-select');\n\n    if (!enabled) {\n      return;\n    }\n\n    var bBox = addSelectionOutlinePadding(getBBox(selection));\n\n    var rect = create$1('rect');\n\n    attr$1(rect, assign$1({\n      rx: 3\n    }, bBox));\n\n    classes$1(rect).add('djs-selection-outline');\n\n    append(layer, rect);\n  };\n\n  // helpers //////////\n\n  function addSelectionOutlinePadding(bBox) {\n    return {\n      x: bBox.x - SELECTION_OUTLINE_PADDING,\n      y: bBox.y - SELECTION_OUTLINE_PADDING,\n      width: bBox.width + SELECTION_OUTLINE_PADDING * 2,\n      height: bBox.height + SELECTION_OUTLINE_PADDING * 2\n    };\n  }\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('./Selection').default} Selection\n   */\n\n  /**\n   * @param {EventBus} eventBus\n   * @param {Selection} selection\n   * @param {Canvas} canvas\n   * @param {ElementRegistry} elementRegistry\n   */\n  function SelectionBehavior(eventBus, selection, canvas, elementRegistry) {\n\n    // Select elements on create\n    eventBus.on('create.end', 500, function(event) {\n      var context = event.context,\n          canExecute = context.canExecute,\n          elements = context.elements,\n          hints = context.hints || {},\n          autoSelect = hints.autoSelect;\n\n      if (canExecute) {\n        if (autoSelect === false) {\n\n          // Select no elements\n          return;\n        }\n\n        if (isArray$2(autoSelect)) {\n          selection.select(autoSelect);\n        } else {\n\n          // Select all elements by default\n          selection.select(elements.filter(isShown));\n        }\n      }\n    });\n\n    // Select connection targets on connect\n    eventBus.on('connect.end', 500, function(event) {\n      var context = event.context,\n          connection = context.connection;\n\n      if (connection) {\n        selection.select(connection);\n      }\n    });\n\n    // Select shapes on move\n    eventBus.on('shape.move.end', 500, function(event) {\n      var previousSelection = event.previousSelection || [];\n\n      var shape = elementRegistry.get(event.context.shape.id);\n\n      // Always select main shape on move\n      var isSelected = find(previousSelection, function(selectedShape) {\n        return shape.id === selectedShape.id;\n      });\n\n      if (!isSelected) {\n        selection.select(shape);\n      }\n    });\n\n    // Select elements on click\n    eventBus.on('element.click', function(event) {\n\n      if (!isPrimaryButton(event)) {\n        return;\n      }\n\n      var element = event.element;\n\n      if (element === canvas.getRootElement()) {\n        element = null;\n      }\n\n      var isSelected = selection.isSelected(element),\n          isMultiSelect = selection.get().length > 1;\n\n      // Add to selection if CTRL or SHIFT pressed\n      var add = hasPrimaryModifier(event) || hasSecondaryModifier(event);\n\n      if (isSelected && isMultiSelect) {\n        if (add) {\n\n          // Deselect element\n          return selection.deselect(element);\n        } else {\n\n          // Select element only\n          return selection.select(element);\n        }\n      } else if (!isSelected) {\n\n        // Select element\n        selection.select(element, add);\n      } else {\n\n        // Deselect element\n        selection.deselect(element);\n      }\n    });\n  }\n\n  SelectionBehavior.$inject = [\n    'eventBus',\n    'selection',\n    'canvas',\n    'elementRegistry'\n  ];\n\n\n  function isShown(element) {\n    return !element.hidden;\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var SelectionModule = {\n    __init__: [ 'selectionVisuals', 'selectionBehavior' ],\n    __depends__: [\n      InteractionEventsModule,\n      OutlineModule\n    ],\n    selection: [ 'type', Selection ],\n    selectionVisuals: [ 'type', SelectionVisuals ],\n    selectionBehavior: [ 'type', SelectionBehavior ]\n  };\n\n  /**\n   * Util that provides unique IDs.\n   *\n   * @class\n   * @constructor\n   *\n   * The ids can be customized via a given prefix and contain a random value to avoid collisions.\n   *\n   * @param {string} [prefix] a prefix to prepend to generated ids (for better readability)\n   */\n  function IdGenerator(prefix) {\n\n    this._counter = 0;\n    this._prefix = (prefix ? prefix + '-' : '') + Math.floor(Math.random() * 1000000000) + '-';\n  }\n\n  /**\n   * Returns a next unique ID.\n   *\n   * @return {string} the id\n   */\n  IdGenerator.prototype.next = function() {\n    return this._prefix + (++this._counter);\n  };\n\n  // document wide unique overlay ids\n  var ids = new IdGenerator('ov');\n\n  var LOW_PRIORITY$2 = 500;\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../../core/EventBus').default} EventBus\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef { {\n   *   minZoom?: number,\n   *   maxZoom?: number\n   * } } OverlaysConfigShow\n   *\n   * @typedef { {\n   *   min?: number,\n   *   max?: number\n   * } } OverlaysConfigScale\n   *\n   * @typedef { {\n  *   id: string,\n  *   type: string | null,\n  *   element: Element | string\n  * } & OverlayAttrs } Overlay\n  *\n   * @typedef { {\n   *   html: HTMLElement | string,\n   *   position: {\n   *     top?: number,\n   *     right?: number,\n   *     bottom?: number,\n   *     left?: number\n   *   }\n   * } & OverlaysConfigDefault } OverlayAttrs\n   *\n   * @typedef { {\n   *   html: HTMLElement,\n   *   element: Element,\n   *   overlays: Overlay[]\n   * } } OverlayContainer\n   *\n   * @typedef {{\n   *   defaults?: OverlaysConfigDefault\n   * }} OverlaysConfig\n   *\n   * @typedef { {\n   *  show?: OverlaysConfigShow,\n   *  scale?: OverlaysConfigScale | boolean\n   * } } OverlaysConfigDefault\n   *\n   * @typedef { {\n   *   id?: string;\n   *   element?: Element | string;\n   *   type?: string;\n   * } | string } OverlaysFilter\n   */\n\n  /**\n   * A service that allows users to attach overlays to diagram elements.\n   *\n   * The overlay service will take care of overlay positioning during updates.\n   *\n   * @example\n   *\n   * ```javascript\n   * // add a pink badge on the top left of the shape\n   *\n   * overlays.add(someShape, {\n   *   position: {\n   *     top: -5,\n   *     left: -5\n   *   },\n   *   html: '<div style=\"width: 10px; background: fuchsia; color: white;\">0</div>'\n   * });\n   *\n   * // or add via shape id\n   *\n   * overlays.add('some-element-id', {\n   *   position: {\n   *     top: -5,\n   *     left: -5\n   *   }\n   *   html: '<div style=\"width: 10px; background: fuchsia; color: white;\">0</div>'\n   * });\n   *\n   * // or add with optional type\n   *\n   * overlays.add(someShape, 'badge', {\n   *   position: {\n   *     top: -5,\n   *     left: -5\n   *   }\n   *   html: '<div style=\"width: 10px; background: fuchsia; color: white;\">0</div>'\n   * });\n   * ```\n   *\n   * ```javascript\n   * // remove an overlay\n   *\n   * var id = overlays.add(...);\n   * overlays.remove(id);\n   *\n   *\n   * You may configure overlay defaults during tool by providing a `config` module\n   * with `overlays.defaults` as an entry:\n   *\n   * {\n   *   overlays: {\n   *     defaults: {\n   *       show: {\n   *         minZoom: 0.7,\n   *         maxZoom: 5.0\n   *       },\n   *       scale: {\n   *         min: 1\n   *       }\n   *     }\n   * }\n   * ```\n   *\n   * @param {OverlaysConfig} config\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {ElementRegistry} elementRegistry\n   */\n  function Overlays(config, eventBus, canvas, elementRegistry) {\n    this._eventBus = eventBus;\n    this._canvas = canvas;\n    this._elementRegistry = elementRegistry;\n\n    this._ids = ids;\n\n    /**\n     * @type {OverlaysConfigDefault}\n     */\n    this._overlayDefaults = assign$1({\n\n      // no show constraints\n      show: null,\n\n      // always scale\n      scale: true\n    }, config && config.defaults);\n\n    /**\n     * @type {Map<string, Overlay>}\n     */\n    this._overlays = {};\n\n    /**\n     * @type {OverlayContainer[]}\n     */\n    this._overlayContainers = [];\n\n    /**\n     * @type {HTMLElement}\n     */\n    this._overlayRoot = createRoot(canvas.getContainer());\n\n    this._init();\n  }\n\n\n  Overlays.$inject = [\n    'config.overlays',\n    'eventBus',\n    'canvas',\n    'elementRegistry'\n  ];\n\n\n  /**\n   * Returns the overlay with the specified ID or a list of overlays\n   * for an element with a given type.\n   *\n   * @example\n   *\n   * ```javascript\n   * // return the single overlay with the given ID\n   * overlays.get('some-id');\n   *\n   * // return all overlays for the shape\n   * overlays.get({ element: someShape });\n   *\n   * // return all overlays on shape with type 'badge'\n   * overlays.get({ element: someShape, type: 'badge' });\n   *\n   * // shape can also be specified as ID\n   * overlays.get({ element: 'element-id', type: 'badge' });\n   * ```\n   *\n   * @param {OverlaysFilter} search The filter to be used to find the overlay(s).\n   *\n   * @return {Overlay|Overlay[]} The overlay(s).\n   */\n  Overlays.prototype.get = function(search) {\n\n    if (isString(search)) {\n      search = { id: search };\n    }\n\n    if (isString(search.element)) {\n      search.element = this._elementRegistry.get(search.element);\n    }\n\n    if (search.element) {\n      var container = this._getOverlayContainer(search.element, true);\n\n      // return a list of overlays when searching by element (+type)\n      if (container) {\n        return search.type ? filter(container.overlays, matchPattern({ type: search.type })) : container.overlays.slice();\n      } else {\n        return [];\n      }\n    } else\n    if (search.type) {\n      return filter(this._overlays, matchPattern({ type: search.type }));\n    } else {\n\n      // return single element when searching by id\n      return search.id ? this._overlays[search.id] : null;\n    }\n  };\n\n  /**\n   * Adds an HTML overlay to an element.\n   *\n   * @param {Element|string} element The element to add the overlay to.\n   * @param {string} [type] An optional type that can be used to filter.\n   * @param {OverlayAttrs} overlay The overlay.\n   *\n   * @return {string} The overlay's ID that can be used to get or remove it.\n   */\n  Overlays.prototype.add = function(element, type, overlay) {\n\n    if (isObject(type)) {\n      overlay = type;\n      type = null;\n    }\n\n    if (!element.id) {\n      element = this._elementRegistry.get(element);\n    }\n\n    if (!overlay.position) {\n      throw new Error('must specifiy overlay position');\n    }\n\n    if (!overlay.html) {\n      throw new Error('must specifiy overlay html');\n    }\n\n    if (!element) {\n      throw new Error('invalid element specified');\n    }\n\n    var id = this._ids.next();\n\n    overlay = assign$1({}, this._overlayDefaults, overlay, {\n      id: id,\n      type: type,\n      element: element,\n      html: overlay.html\n    });\n\n    this._addOverlay(overlay);\n\n    return id;\n  };\n\n\n  /**\n   * Remove an overlay with the given ID or all overlays matching the given filter.\n   *\n   * @see Overlays#get for filter options.\n   *\n   * @param {OverlaysFilter} filter The filter to be used to find the overlay.\n   */\n  Overlays.prototype.remove = function(filter) {\n\n    var overlays = this.get(filter) || [];\n\n    if (!isArray$2(overlays)) {\n      overlays = [ overlays ];\n    }\n\n    var self = this;\n\n    forEach$1(overlays, function(overlay) {\n\n      var container = self._getOverlayContainer(overlay.element, true);\n\n      if (overlay) {\n        remove$1(overlay.html);\n        remove$1(overlay.htmlContainer);\n\n        delete overlay.htmlContainer;\n        delete overlay.element;\n\n        delete self._overlays[overlay.id];\n      }\n\n      if (container) {\n        var idx = container.overlays.indexOf(overlay);\n        if (idx !== -1) {\n          container.overlays.splice(idx, 1);\n        }\n      }\n    });\n\n  };\n\n  /**\n   * Checks whether overlays are shown.\n   *\n   * @return {boolean} Whether overlays are shown.\n   */\n  Overlays.prototype.isShown = function() {\n    return this._overlayRoot.style.display !== 'none';\n  };\n\n  /**\n   * Show all overlays.\n   */\n  Overlays.prototype.show = function() {\n    setVisible(this._overlayRoot);\n  };\n\n  /**\n   * Hide all overlays.\n   */\n  Overlays.prototype.hide = function() {\n    setVisible(this._overlayRoot, false);\n  };\n\n  /**\n   * Remove all overlays and their container.\n   */\n  Overlays.prototype.clear = function() {\n    this._overlays = {};\n\n    this._overlayContainers = [];\n\n    clear(this._overlayRoot);\n  };\n\n  Overlays.prototype._updateOverlayContainer = function(container) {\n    var element = container.element,\n        html = container.html;\n\n    // update container left,top according to the elements x,y coordinates\n    // this ensures we can attach child elements relative to this container\n\n    var x = element.x,\n        y = element.y;\n\n    if (element.waypoints) {\n      var bbox = getBBox(element);\n      x = bbox.x;\n      y = bbox.y;\n    }\n\n    setPosition(html, x, y);\n\n    attr(container.html, 'data-container-id', element.id);\n  };\n\n\n  Overlays.prototype._updateOverlay = function(overlay) {\n\n    var position = overlay.position,\n        htmlContainer = overlay.htmlContainer,\n        element = overlay.element;\n\n    // update overlay html relative to shape because\n    // it is already positioned on the element\n\n    // update relative\n    var left = position.left,\n        top = position.top;\n\n    if (position.right !== undefined) {\n\n      var width;\n\n      if (element.waypoints) {\n        width = getBBox(element).width;\n      } else {\n        width = element.width;\n      }\n\n      left = position.right * -1 + width;\n    }\n\n    if (position.bottom !== undefined) {\n\n      var height;\n\n      if (element.waypoints) {\n        height = getBBox(element).height;\n      } else {\n        height = element.height;\n      }\n\n      top = position.bottom * -1 + height;\n    }\n\n    setPosition(htmlContainer, left || 0, top || 0);\n    this._updateOverlayVisibilty(overlay, this._canvas.viewbox());\n  };\n\n\n  Overlays.prototype._createOverlayContainer = function(element) {\n    var html = domify$1('<div class=\"djs-overlays\" />');\n    assign(html, { position: 'absolute' });\n\n    this._overlayRoot.appendChild(html);\n\n    var container = {\n      html: html,\n      element: element,\n      overlays: []\n    };\n\n    this._updateOverlayContainer(container);\n\n    this._overlayContainers.push(container);\n\n    return container;\n  };\n\n\n  Overlays.prototype._updateRoot = function(viewbox) {\n    var scale = viewbox.scale || 1;\n\n    var matrix = 'matrix(' +\n    [\n      scale,\n      0,\n      0,\n      scale,\n      -1 * viewbox.x * scale,\n      -1 * viewbox.y * scale\n    ].join(',') +\n    ')';\n\n    setTransform(this._overlayRoot, matrix);\n  };\n\n\n  Overlays.prototype._getOverlayContainer = function(element, raw) {\n    var container = find(this._overlayContainers, function(c) {\n      return c.element === element;\n    });\n\n\n    if (!container && !raw) {\n      return this._createOverlayContainer(element);\n    }\n\n    return container;\n  };\n\n\n  Overlays.prototype._addOverlay = function(overlay) {\n\n    var id = overlay.id,\n        element = overlay.element,\n        html = overlay.html,\n        htmlContainer,\n        overlayContainer;\n\n    // unwrap jquery (for those who need it)\n    if (html.get && html.constructor.prototype.jquery) {\n      html = html.get(0);\n    }\n\n    // create proper html elements from\n    // overlay HTML strings\n    if (isString(html)) {\n      html = domify$1(html);\n    }\n\n    overlayContainer = this._getOverlayContainer(element);\n\n    htmlContainer = domify$1('<div class=\"djs-overlay\" data-overlay-id=\"' + id + '\">');\n    assign(htmlContainer, { position: 'absolute' });\n\n    htmlContainer.appendChild(html);\n\n    if (overlay.type) {\n      classes(htmlContainer).add('djs-overlay-' + overlay.type);\n    }\n\n    var elementRoot = this._canvas.findRoot(element);\n    var activeRoot = this._canvas.getRootElement();\n\n    setVisible(htmlContainer, elementRoot === activeRoot);\n\n    overlay.htmlContainer = htmlContainer;\n\n    overlayContainer.overlays.push(overlay);\n    overlayContainer.html.appendChild(htmlContainer);\n\n    this._overlays[id] = overlay;\n\n    this._updateOverlay(overlay);\n    this._updateOverlayVisibilty(overlay, this._canvas.viewbox());\n  };\n\n\n  Overlays.prototype._updateOverlayVisibilty = function(overlay, viewbox) {\n    var show = overlay.show,\n        rootElement = this._canvas.findRoot(overlay.element),\n        minZoom = show && show.minZoom,\n        maxZoom = show && show.maxZoom,\n        htmlContainer = overlay.htmlContainer,\n        activeRootElement = this._canvas.getRootElement(),\n        visible = true;\n\n    if (rootElement !== activeRootElement) {\n      visible = false;\n    } else if (show) {\n      if (\n        (isDefined(minZoom) && minZoom > viewbox.scale) ||\n        (isDefined(maxZoom) && maxZoom < viewbox.scale)\n      ) {\n        visible = false;\n      }\n    }\n\n    setVisible(htmlContainer, visible);\n\n    this._updateOverlayScale(overlay, viewbox);\n  };\n\n\n  Overlays.prototype._updateOverlayScale = function(overlay, viewbox) {\n    var shouldScale = overlay.scale,\n        minScale,\n        maxScale,\n        htmlContainer = overlay.htmlContainer;\n\n    var scale, transform = '';\n\n    if (shouldScale !== true) {\n\n      if (shouldScale === false) {\n        minScale = 1;\n        maxScale = 1;\n      } else {\n        minScale = shouldScale.min;\n        maxScale = shouldScale.max;\n      }\n\n      if (isDefined(minScale) && viewbox.scale < minScale) {\n        scale = (1 / viewbox.scale || 1) * minScale;\n      }\n\n      if (isDefined(maxScale) && viewbox.scale > maxScale) {\n        scale = (1 / viewbox.scale || 1) * maxScale;\n      }\n    }\n\n    if (isDefined(scale)) {\n      transform = 'scale(' + scale + ',' + scale + ')';\n    }\n\n    setTransform(htmlContainer, transform);\n  };\n\n\n  Overlays.prototype._updateOverlaysVisibilty = function(viewbox) {\n\n    var self = this;\n\n    forEach$1(this._overlays, function(overlay) {\n      self._updateOverlayVisibilty(overlay, viewbox);\n    });\n  };\n\n\n  Overlays.prototype._init = function() {\n\n    var eventBus = this._eventBus;\n\n    var self = this;\n\n\n    // scroll/zoom integration\n\n    function updateViewbox(viewbox) {\n      self._updateRoot(viewbox);\n      self._updateOverlaysVisibilty(viewbox);\n\n      self.show();\n    }\n\n    eventBus.on('canvas.viewbox.changing', function(event) {\n      self.hide();\n    });\n\n    eventBus.on('canvas.viewbox.changed', function(event) {\n      updateViewbox(event.viewbox);\n    });\n\n\n    // remove integration\n\n    eventBus.on([ 'shape.remove', 'connection.remove' ], function(e) {\n      var element = e.element;\n      var overlays = self.get({ element: element });\n\n      forEach$1(overlays, function(o) {\n        self.remove(o.id);\n      });\n\n      var container = self._getOverlayContainer(element);\n\n      if (container) {\n        remove$1(container.html);\n        var i = self._overlayContainers.indexOf(container);\n        if (i !== -1) {\n          self._overlayContainers.splice(i, 1);\n        }\n      }\n    });\n\n\n    // move integration\n\n    eventBus.on('element.changed', LOW_PRIORITY$2, function(e) {\n      var element = e.element;\n\n      var container = self._getOverlayContainer(element, true);\n\n      if (container) {\n        forEach$1(container.overlays, function(overlay) {\n          self._updateOverlay(overlay);\n        });\n\n        self._updateOverlayContainer(container);\n      }\n    });\n\n\n    // marker integration, simply add them on the overlays as classes, too.\n\n    eventBus.on('element.marker.update', function(e) {\n      var container = self._getOverlayContainer(e.element, true);\n      if (container) {\n        classes(container.html)[e.add ? 'add' : 'remove'](e.marker);\n      }\n    });\n\n\n    eventBus.on('root.set', function() {\n      self._updateOverlaysVisibilty(self._canvas.viewbox());\n    });\n\n    // clear overlays with diagram\n\n    eventBus.on('diagram.clear', this.clear, this);\n  };\n\n\n\n  // helpers /////////////////////////////\n\n  function createRoot(parentNode) {\n    var root = domify$1(\n      '<div class=\"djs-overlay-container\" />'\n    );\n\n    assign(root, {\n      position: 'absolute',\n      width: 0,\n      height: 0\n    });\n\n    parentNode.insertBefore(root, parentNode.firstChild);\n\n    return root;\n  }\n\n  function setPosition(el, x, y) {\n    assign(el, { left: x + 'px', top: y + 'px' });\n  }\n\n  /**\n   * Set element visible\n   *\n   * @param {DOMElement} el\n   * @param {boolean} [visible=true]\n   */\n  function setVisible(el, visible) {\n    el.style.display = visible === false ? 'none' : '';\n  }\n\n  function setTransform(el, transform) {\n\n    el.style['transform-origin'] = 'top left';\n\n    [ '', '-ms-', '-webkit-' ].forEach(function(prefix) {\n      el.style[prefix + 'transform'] = transform;\n    });\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var OverlaysModule = {\n    __init__: [ 'overlays' ],\n    overlays: [ 'type', Overlays ]\n  };\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../../core/GraphicsFactory').default} GraphicsFactory\n   */\n\n  /**\n   * Adds change support to the diagram, including\n   *\n   * <ul>\n   *   <li>redrawing shapes and connections on change</li>\n   * </ul>\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {ElementRegistry} elementRegistry\n   * @param {GraphicsFactory} graphicsFactory\n   */\n  function ChangeSupport(\n      eventBus, canvas, elementRegistry,\n      graphicsFactory) {\n\n\n    // redraw shapes / connections on change\n\n    eventBus.on('element.changed', function(event) {\n\n      var element = event.element;\n\n      // element might have been deleted and replaced by new element with same ID\n      // thus check for parent of element except for root element\n      if (element.parent || element === canvas.getRootElement()) {\n        event.gfx = elementRegistry.getGraphics(element);\n      }\n\n      // shape + gfx may have been deleted\n      if (!event.gfx) {\n        return;\n      }\n\n      eventBus.fire(getType(element) + '.changed', event);\n    });\n\n    eventBus.on('elements.changed', function(event) {\n\n      var elements = event.elements;\n\n      elements.forEach(function(e) {\n        eventBus.fire('element.changed', { element: e });\n      });\n\n      graphicsFactory.updateContainments(elements);\n    });\n\n    eventBus.on('shape.changed', function(event) {\n      graphicsFactory.update('shape', event.element, event.gfx);\n    });\n\n    eventBus.on('connection.changed', function(event) {\n      graphicsFactory.update('connection', event.element, event.gfx);\n    });\n  }\n\n  ChangeSupport.$inject = [\n    'eventBus',\n    'canvas',\n    'elementRegistry',\n    'graphicsFactory'\n  ];\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var ChangeSupportModule = {\n    __init__: [ 'changeSupport' ],\n    changeSupport: [ 'type', ChangeSupport ]\n  };\n\n  /**\n   * @typedef {import('../core/Types').ElementLike} ElementLike\n   * @typedef {import('../core/EventBus').default} EventBus\n   * @typedef {import('./CommandStack').CommandContext} CommandContext\n   *\n   * @typedef {string|string[]} Events\n   * @typedef { (context: CommandContext) => ElementLike[] | void } HandlerFunction\n   * @typedef { (context: CommandContext) => void } ComposeHandlerFunction\n   */\n\n  var DEFAULT_PRIORITY$2 = 1000;\n\n  /**\n   * A utility that can be used to plug into the command execution for\n   * extension and/or validation.\n   *\n   * @class\n   * @constructor\n   *\n   * @example\n   *\n   * ```javascript\n   * import CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n   *\n   * class CommandLogger extends CommandInterceptor {\n   *   constructor(eventBus) {\n   *     super(eventBus);\n   *\n   *   this.preExecute('shape.create', (event) => {\n   *     console.log('commandStack.shape-create.preExecute', event);\n   *   });\n   * }\n   * ```\n   *\n   * @param {EventBus} eventBus\n   */\n  function CommandInterceptor(eventBus) {\n\n    /**\n     * @type {EventBus}\n     */\n    this._eventBus = eventBus;\n  }\n\n  CommandInterceptor.$inject = [ 'eventBus' ];\n\n  function unwrapEvent(fn, that) {\n    return function(event) {\n      return fn.call(that || null, event.context, event.command, event);\n    };\n  }\n\n\n  /**\n   * Intercept a command during one of the phases.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {string} [hook] phase to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.on = function(events, hook, priority, handlerFn, unwrap, that) {\n\n    if (isFunction(hook) || isNumber(hook)) {\n      that = unwrap;\n      unwrap = handlerFn;\n      handlerFn = priority;\n      priority = hook;\n      hook = null;\n    }\n\n    if (isFunction(priority)) {\n      that = unwrap;\n      unwrap = handlerFn;\n      handlerFn = priority;\n      priority = DEFAULT_PRIORITY$2;\n    }\n\n    if (isObject(unwrap)) {\n      that = unwrap;\n      unwrap = false;\n    }\n\n    if (!isFunction(handlerFn)) {\n      throw new Error('handlerFn must be a function');\n    }\n\n    if (!isArray$2(events)) {\n      events = [ events ];\n    }\n\n    var eventBus = this._eventBus;\n\n    forEach$1(events, function(event) {\n\n      // concat commandStack(.event)?(.hook)?\n      var fullEvent = [ 'commandStack', event, hook ].filter(function(e) { return e; }).join('.');\n\n      eventBus.on(fullEvent, priority, unwrap ? unwrapEvent(handlerFn, that) : handlerFn, that);\n    });\n  };\n\n  /**\n   * Add a <canExecute> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.canExecute = createHook('canExecute');\n\n  /**\n   * Add a <preExecute> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.preExecute = createHook('preExecute');\n\n  /**\n   * Add a <preExecuted> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.preExecuted = createHook('preExecuted');\n\n  /**\n   * Add a <execute> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.execute = createHook('execute');\n\n  /**\n   * Add a <executed> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.executed = createHook('executed');\n\n  /**\n   * Add a <postExecute> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.postExecute = createHook('postExecute');\n\n  /**\n   * Add a <postExecuted> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.postExecuted = createHook('postExecuted');\n\n  /**\n   * Add a <revert> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.revert = createHook('revert');\n\n  /**\n   * Add a <reverted> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.reverted = createHook('reverted');\n\n  /*\n   * Add prototype methods for each phase of command execution (e.g. execute,\n   * revert).\n   *\n   * @param {string} hook\n   *\n   * @return { (\n   *   events?: Events,\n   *   priority?: number,\n   *   handlerFn: ComposeHandlerFunction|HandlerFunction,\n   *   unwrap?: boolean\n   * ) => any }\n   */\n  function createHook(hook) {\n\n    /**\n     * @this {CommandInterceptor}\n     *\n     * @param {Events} [events]\n     * @param {number} [priority]\n     * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n     * @param {boolean} [unwrap]\n     * @param {any} [that]\n     */\n    const hookFn = function(events, priority, handlerFn, unwrap, that) {\n\n      if (isFunction(events) || isNumber(events)) {\n        that = unwrap;\n        unwrap = handlerFn;\n        handlerFn = priority;\n        priority = events;\n        events = null;\n      }\n\n      this.on(events, hook, priority, handlerFn, unwrap, that);\n    };\n\n    return hookFn;\n  }\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   *\n   * @typedef {import('../../core/Canvas').default} Canvas\n   */\n\n  /**\n   * A modeling behavior that ensures we set the correct root element\n   * as we undo and redo commands.\n   *\n   * @param {Canvas} canvas\n   * @param {Injector} injector\n   */\n  function RootElementsBehavior(canvas, injector) {\n\n    injector.invoke(CommandInterceptor, this);\n\n    this.executed(function(event) {\n      var context = event.context;\n\n      if (context.rootElement) {\n        canvas.setRootElement(context.rootElement);\n      } else {\n        context.rootElement = canvas.getRootElement();\n      }\n    });\n\n    this.revert(function(event) {\n      var context = event.context;\n\n      if (context.rootElement) {\n        canvas.setRootElement(context.rootElement);\n      }\n    });\n  }\n\n  e(RootElementsBehavior, CommandInterceptor);\n\n  RootElementsBehavior.$inject = [ 'canvas', 'injector' ];\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var RootElementsModule = {\n    __init__: [ 'rootElementsBehavior' ],\n    rootElementsBehavior: [ 'type', RootElementsBehavior ]\n  };\n\n  /**\n   * @param {string} str\n   *\n   * @return {string}\n   */\n\n  var HTML_ESCAPE_MAP = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    '\\'': '&#39;'\n  };\n\n  /**\n   * @param {string} str\n   *\n   * @return {string}\n   */\n  function escapeHTML(str) {\n    str = '' + str;\n\n    return str && str.replace(/[&<>\"']/g, function(match) {\n      return HTML_ESCAPE_MAP[match];\n    });\n  }\n\n  /**\n   * @typedef {import('../model/Types').Element} Element\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   */\n\n  var planeSuffix = '_plane';\n\n  /**\n   * Get plane ID for a primary shape.\n   *\n   * @param  {Element|ModdleElement} element\n   *\n   * @return {string}\n   */\n  function getPlaneIdFromShape(element) {\n    var id = element.id;\n\n    if (is$1(element, 'bpmn:SubProcess')) {\n      return addPlaneSuffix(id);\n    }\n\n    return id;\n  }\n\n  function addPlaneSuffix(id) {\n    return id + planeSuffix;\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Shape} Shape\n   */\n\n  var OPEN_CLASS = 'bjs-breadcrumbs-shown';\n\n\n  /**\n   * Adds overlays that allow switching planes on collapsed subprocesses.\n   *\n   * @param {EventBus} eventBus\n   * @param {ElementRegistry} elementRegistry\n   * @param {Canvas} canvas\n   */\n  function DrilldownBreadcrumbs(eventBus, elementRegistry, canvas) {\n    var breadcrumbs = domify$1('<ul class=\"bjs-breadcrumbs\"></ul>');\n    var container = canvas.getContainer();\n    var containerClasses = classes(container);\n    container.appendChild(breadcrumbs);\n\n    var businessObjectParents = [];\n\n    // update breadcrumbs if name or ID of the primary shape changes\n    eventBus.on('element.changed', function(event) {\n      var shape = event.element,\n          businessObject = getBusinessObject(shape);\n\n      var isPresent = find(businessObjectParents, function(element) {\n        return element === businessObject;\n      });\n\n      if (!isPresent) {\n        return;\n      }\n\n      updateBreadcrumbs();\n    });\n\n    /**\n     * Updates the displayed breadcrumbs. If no element is provided, only the\n     * labels are updated.\n     *\n     * @param {Element} [element]\n     */\n    function updateBreadcrumbs(element) {\n      if (element) {\n        businessObjectParents = getBusinessObjectParentChain(element);\n      }\n\n      var path = businessObjectParents.map(function(parent) {\n        var title = escapeHTML(parent.name || parent.id);\n        var link = domify$1('<li><span class=\"bjs-crumb\"><a title=\"' + title + '\">' + title + '</a></span></li>');\n\n        var parentPlane = canvas.findRoot(getPlaneIdFromShape(parent)) || canvas.findRoot(parent.id);\n\n        // when the root is a collaboration, the process does not have a corresponding\n        // element in the elementRegisty. Instead, we search for the corresponding participant\n        if (!parentPlane && is$1(parent, 'bpmn:Process')) {\n          var participant = elementRegistry.find(function(element) {\n            var businessObject = getBusinessObject(element);\n\n            return businessObject && businessObject.get('processRef') && businessObject.get('processRef') === parent;\n          });\n\n          parentPlane = canvas.findRoot(participant.id);\n        }\n\n        link.addEventListener('click', function() {\n          canvas.setRootElement(parentPlane);\n        });\n\n        return link;\n      });\n\n      breadcrumbs.innerHTML = '';\n\n      // show breadcrumbs and expose state to .djs-container\n      var visible = path.length > 1;\n\n      containerClasses.toggle(OPEN_CLASS, visible);\n\n      path.forEach(function(element) {\n        breadcrumbs.appendChild(element);\n      });\n    }\n\n    eventBus.on('root.set', function(event) {\n      updateBreadcrumbs(event.element);\n    });\n\n  }\n\n  DrilldownBreadcrumbs.$inject = [ 'eventBus', 'elementRegistry', 'canvas' ];\n\n\n  // helpers //////////\n\n  /**\n   * Returns the parents for the element using the business object chain,\n   * starting with the root element.\n   *\n   * @param {Shape} child\n   *\n   * @return {Shape}\n   */\n  function getBusinessObjectParentChain(child) {\n    var businessObject = getBusinessObject(child);\n\n    var parents = [];\n\n    for (var element = businessObject; element; element = element.$parent) {\n      if (is$1(element, 'bpmn:SubProcess') || is$1(element, 'bpmn:Process')) {\n        parents.push(element);\n      }\n    }\n\n    return parents.reverse();\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   */\n\n  /**\n   * Move collapsed subprocesses into view when drilling down.\n   *\n   * Zoom and scroll are saved in a session.\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   */\n  function DrilldownCentering(eventBus, canvas) {\n\n    var currentRoot = null;\n    var positionMap = new Map();\n\n    eventBus.on('root.set', function(event) {\n      var newRoot = event.element;\n      var currentViewbox = canvas.viewbox();\n      var storedViewbox = positionMap.get(newRoot);\n\n      positionMap.set(currentRoot, {\n        x: currentViewbox.x,\n        y: currentViewbox.y,\n        zoom: currentViewbox.scale\n      });\n\n      currentRoot = newRoot;\n\n      // current root was replaced with a collaboration, we don't update the viewbox\n      if (is$1(newRoot, 'bpmn:Collaboration') && !storedViewbox) {\n        return;\n      }\n\n      storedViewbox = storedViewbox || { x: 0, y: 0, zoom: 1 };\n\n      var dx = (currentViewbox.x - storedViewbox.x) * currentViewbox.scale,\n          dy = (currentViewbox.y - storedViewbox.y) * currentViewbox.scale;\n\n      if (dx !== 0 || dy !== 0) {\n        canvas.scroll({\n          dx: dx,\n          dy: dy\n        });\n      }\n\n      if (storedViewbox.zoom !== currentViewbox.scale) {\n        canvas.zoom(storedViewbox.zoom, { x: 0, y: 0 });\n      }\n    });\n\n    eventBus.on('diagram.clear', function() {\n      positionMap.clear();\n      currentRoot = null;\n    });\n\n  }\n\n  DrilldownCentering.$inject = [ 'eventBus', 'canvas' ];\n\n\n  /**\n   * ES5 Map implementation. Works.\n   */\n  function Map() {\n\n    this._entries = [];\n\n    this.set = function(key, value) {\n\n      var found = false;\n\n      for (var k in this._entries) {\n        if (this._entries[k][0] === key) {\n          this._entries[k][1] = value;\n\n          found = true;\n\n          break;\n        }\n      }\n\n      if (!found) {\n        this._entries.push([ key, value ]);\n      }\n    };\n\n    this.get = function(key) {\n\n      for (var k in this._entries) {\n        if (this._entries[k][0] === key) {\n          return this._entries[k][1];\n        }\n      }\n\n      return null;\n    };\n\n    this.clear = function() {\n      this._entries.length = 0;\n    };\n\n    this.remove = function(key) {\n\n      var idx = -1;\n\n      for (var k in this._entries) {\n        if (this._entries[k][0] === key) {\n          idx = k;\n\n          break;\n        }\n      }\n\n      if (idx !== -1) {\n        this._entries.splice(idx, 1);\n      }\n    };\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../../model/Types').Moddle} Moddle\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Shape} Shape\n   *\n   * @typedef {import('diagram-js/lib/core/Canvas').CanvasPlane} CanvasPlane\n   *\n   * @typedef {import('diagram-js/lib/util/Types').Rect} Rect\n   */\n\n  var DEFAULT_POSITION = {\n    x: 180,\n    y: 160\n  };\n\n  /**\n   * Hook into `import.render.start` and create new planes for diagrams with\n   * collapsed subprocesses and all DI elements on the same plane.\n   *\n   * @param {EventBus} eventBus\n   * @param {Moddle} moddle\n   */\n  function SubprocessCompatibility(eventBus, moddle) {\n    this._eventBus = eventBus;\n    this._moddle = moddle;\n\n    var self = this;\n\n    eventBus.on('import.render.start', 1500, function(e, context) {\n      self._handleImport(context.definitions);\n    });\n  }\n\n  /**\n   * @param {ModdleElement} definitions\n   */\n  SubprocessCompatibility.prototype._handleImport = function(definitions) {\n    if (!definitions.diagrams) {\n      return;\n    }\n\n    var self = this;\n    this._definitions = definitions;\n    this._processToDiagramMap = {};\n\n    definitions.diagrams.forEach(function(diagram) {\n      if (!diagram.plane || !diagram.plane.bpmnElement) {\n        return;\n      }\n\n      self._processToDiagramMap[diagram.plane.bpmnElement.id] = diagram;\n    });\n\n    var newDiagrams = [];\n    definitions.diagrams.forEach(function(diagram) {\n      var createdDiagrams = self._createNewDiagrams(diagram.plane);\n      Array.prototype.push.apply(newDiagrams, createdDiagrams);\n    });\n\n    newDiagrams.forEach(function(diagram) {\n      self._movePlaneElementsToOrigin(diagram.plane);\n    });\n  };\n\n\n  /**\n   * Moves all DI elements from collapsed subprocesses to a new plane.\n   *\n   * @param {CanvasPlane} plane\n   *\n   * @return {ModdleElement[]} new diagrams created for the collapsed subprocesses\n   */\n  SubprocessCompatibility.prototype._createNewDiagrams = function(plane) {\n    var self = this;\n\n    var collapsedElements = [];\n    var elementsToMove = [];\n\n    plane.get('planeElement').forEach(function(diElement) {\n      var businessObject = diElement.bpmnElement;\n\n      if (!businessObject) {\n        return;\n      }\n\n      var parent = businessObject.$parent;\n\n      if (is$1(businessObject, 'bpmn:SubProcess') && !diElement.isExpanded) {\n        collapsedElements.push(businessObject);\n      }\n\n      if (shouldMoveToPlane(businessObject, plane)) {\n\n        // don't change the array while we iterate over it\n        elementsToMove.push({ diElement: diElement, parent: parent });\n      }\n    });\n\n    var newDiagrams = [];\n\n    // create new planes for all collapsed subprocesses, even when they are empty\n    collapsedElements.forEach(function(element) {\n      if (!self._processToDiagramMap[ element.id ]) {\n        var diagram = self._createDiagram(element);\n\n        self._processToDiagramMap[element.id] = diagram;\n\n        newDiagrams.push(diagram);\n      }\n    });\n\n    elementsToMove.forEach(function(element) {\n      var diElement = element.diElement;\n      var parent = element.parent;\n\n      // parent is expanded, get nearest collapsed parent\n      while (parent && collapsedElements.indexOf(parent) === -1) {\n        parent = parent.$parent;\n      }\n\n      // false positive, all parents are expanded\n      if (!parent) {\n        return;\n      }\n\n      var diagram = self._processToDiagramMap[ parent.id ];\n\n      self._moveToDiPlane(diElement, diagram.plane);\n    });\n\n    return newDiagrams;\n  };\n\n  /**\n   * @param {CanvasPlane} plane\n   */\n  SubprocessCompatibility.prototype._movePlaneElementsToOrigin = function(plane) {\n    var elements = plane.get('planeElement');\n\n    // get bounding box of all elements\n    var planeBounds = getPlaneBounds(plane);\n\n    var offset = {\n      x: planeBounds.x - DEFAULT_POSITION.x,\n      y: planeBounds.y - DEFAULT_POSITION.y\n    };\n\n    elements.forEach(function(diElement) {\n      if (diElement.waypoint) {\n        diElement.waypoint.forEach(function(waypoint) {\n          waypoint.x = waypoint.x - offset.x;\n          waypoint.y = waypoint.y - offset.y;\n        });\n      } else if (diElement.bounds) {\n        diElement.bounds.x = diElement.bounds.x - offset.x;\n        diElement.bounds.y = diElement.bounds.y - offset.y;\n      }\n    });\n  };\n\n  /**\n   * @param {ModdleElement} diElement\n   * @param {CanvasPlane} newPlane\n   */\n  SubprocessCompatibility.prototype._moveToDiPlane = function(diElement, newPlane) {\n    var containingDiagram = findRootDiagram(diElement);\n\n    // remove DI from old Plane and add it to the new one\n    var parentPlaneElement = containingDiagram.plane.get('planeElement');\n\n    parentPlaneElement.splice(parentPlaneElement.indexOf(diElement), 1);\n\n    newPlane.get('planeElement').push(diElement);\n  };\n\n  /**\n   * @param {ModdleElement} businessObject\n   *\n   * @return {ModdleElement}\n   */\n  SubprocessCompatibility.prototype._createDiagram = function(businessObject) {\n    var plane = this._moddle.create('bpmndi:BPMNPlane', {\n      bpmnElement: businessObject\n    });\n\n    var diagram = this._moddle.create('bpmndi:BPMNDiagram', {\n      plane: plane\n    });\n\n    plane.$parent = diagram;\n\n    plane.bpmnElement = businessObject;\n\n    diagram.$parent = this._definitions;\n\n    this._definitions.diagrams.push(diagram);\n\n    return diagram;\n  };\n\n  SubprocessCompatibility.$inject = [ 'eventBus', 'moddle' ];\n\n\n  // helpers //////////\n\n  function findRootDiagram(element) {\n    if (is$1(element, 'bpmndi:BPMNDiagram')) {\n      return element;\n    } else {\n      return findRootDiagram(element.$parent);\n    }\n  }\n\n  /**\n   * @param {CanvasPlane} plane\n   *\n   * @return {Rect}\n   */\n  function getPlaneBounds(plane) {\n    var planeTrbl = {\n      top: Infinity,\n      right: -Infinity,\n      bottom: -Infinity,\n      left: Infinity\n    };\n\n    plane.planeElement.forEach(function(element) {\n      if (!element.bounds) {\n        return;\n      }\n\n      var trbl = asTRBL(element.bounds);\n\n      planeTrbl.top = Math.min(trbl.top, planeTrbl.top);\n      planeTrbl.left = Math.min(trbl.left, planeTrbl.left);\n    });\n\n    return asBounds(planeTrbl);\n  }\n\n  /**\n   * @param {ModdleElement} businessObject\n   * @param {CanvasPlane} plane\n   *\n   * @return {boolean}\n   */\n  function shouldMoveToPlane(businessObject, plane) {\n    var parent = businessObject.$parent;\n\n    // don't move elements that are already on the plane\n    if (!is$1(parent, 'bpmn:SubProcess') || parent === plane.bpmnElement) {\n      return false;\n    }\n\n    // dataAssociations are children of the subprocess but rendered on process level\n    // cf. https://github.com/bpmn-io/bpmn-js/issues/1619\n    if (isAny(businessObject, [ 'bpmn:DataInputAssociation', 'bpmn:DataOutputAssociation' ])) {\n      return false;\n    }\n\n    return true;\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('diagram-js/lib/features/overlays/Overlays').default} Overlays\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Parent} Parent\n   * @typedef {import('../../model/Types').Shape} Shape\n   */\n\n  var LOW_PRIORITY$1 = 250;\n  var ARROW_DOWN_SVG = '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 16 16\"><path fill-rule=\"evenodd\" d=\"M4.81801948,3.50735931 L10.4996894,9.1896894 L10.5,4 L12,4 L12,12 L4,12 L4,10.5 L9.6896894,10.4996894 L3.75735931,4.56801948 C3.46446609,4.27512627 3.46446609,3.80025253 3.75735931,3.50735931 C4.05025253,3.21446609 4.52512627,3.21446609 4.81801948,3.50735931 Z\"/></svg>';\n\n  var EMPTY_MARKER = 'bjs-drilldown-empty';\n\n  /**\n   * @param {Canvas} canvas\n   * @param {EventBus} eventBus\n   * @param {ElementRegistry} elementRegistry\n   * @param {Overlays} overlays\n   */\n  function DrilldownOverlayBehavior(\n      canvas, eventBus, elementRegistry, overlays\n  ) {\n    CommandInterceptor.call(this, eventBus);\n\n    this._canvas = canvas;\n    this._eventBus = eventBus;\n    this._elementRegistry = elementRegistry;\n    this._overlays = overlays;\n\n    var self = this;\n\n    this.executed('shape.toggleCollapse', LOW_PRIORITY$1, function(context) {\n      var shape = context.shape;\n\n      // Add overlay to the collapsed shape\n      if (self._canDrillDown(shape)) {\n        self._addOverlay(shape);\n      } else {\n        self._removeOverlay(shape);\n      }\n    }, true);\n\n\n    this.reverted('shape.toggleCollapse', LOW_PRIORITY$1, function(context) {\n      var shape = context.shape;\n\n      // Add overlay to the collapsed shape\n      if (self._canDrillDown(shape)) {\n        self._addOverlay(shape);\n      } else {\n        self._removeOverlay(shape);\n      }\n    }, true);\n\n\n    this.executed([ 'shape.create', 'shape.move', 'shape.delete' ], LOW_PRIORITY$1,\n      function(context) {\n        var oldParent = context.oldParent,\n            newParent = context.newParent || context.parent,\n            shape = context.shape;\n\n        // Add overlay to the collapsed shape\n        if (self._canDrillDown(shape)) {\n          self._addOverlay(shape);\n        }\n\n        self._updateDrilldownOverlay(oldParent);\n        self._updateDrilldownOverlay(newParent);\n        self._updateDrilldownOverlay(shape);\n      }, true);\n\n\n    this.reverted([ 'shape.create', 'shape.move', 'shape.delete' ], LOW_PRIORITY$1,\n      function(context) {\n        var oldParent = context.oldParent,\n            newParent = context.newParent || context.parent,\n            shape = context.shape;\n\n        // Add overlay to the collapsed shape\n        if (self._canDrillDown(shape)) {\n          self._addOverlay(shape);\n        }\n\n        self._updateDrilldownOverlay(oldParent);\n        self._updateDrilldownOverlay(newParent);\n        self._updateDrilldownOverlay(shape);\n      }, true);\n\n\n    eventBus.on('import.render.complete', function() {\n      elementRegistry.filter(function(e) {\n        return self._canDrillDown(e);\n      }).map(function(el) {\n        self._addOverlay(el);\n      });\n    });\n\n  }\n\n  e(DrilldownOverlayBehavior, CommandInterceptor);\n\n  /**\n   * @param {Shape} shape\n   */\n  DrilldownOverlayBehavior.prototype._updateDrilldownOverlay = function(shape) {\n    var canvas = this._canvas;\n\n    if (!shape) {\n      return;\n    }\n\n    var root = canvas.findRoot(shape);\n\n    if (root) {\n      this._updateOverlayVisibility(root);\n    }\n  };\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  DrilldownOverlayBehavior.prototype._canDrillDown = function(element) {\n    var canvas = this._canvas;\n\n    return is$1(element, 'bpmn:SubProcess') && canvas.findRoot(getPlaneIdFromShape(element));\n  };\n\n  /**\n   * Update the visibility of the drilldown overlay. If the plane has no elements,\n   * the drilldown will only be shown when the element is selected.\n   *\n   * @param {Parent} element The collapsed root or shape.\n   */\n  DrilldownOverlayBehavior.prototype._updateOverlayVisibility = function(element) {\n    var overlays = this._overlays;\n\n    var businessObject = getBusinessObject(element);\n\n    var overlay = overlays.get({ element: businessObject.id, type: 'drilldown' })[0];\n\n    if (!overlay) {\n      return;\n    }\n\n    var hasFlowElements = businessObject\n      && businessObject.get('flowElements')\n      && businessObject.get('flowElements').length;\n\n    classes(overlay.html).toggle(EMPTY_MARKER, !hasFlowElements);\n  };\n\n  /**\n   * Add a drilldown button to the given element assuming the plane has the same\n   * ID as the element.\n   *\n   * @param {Shape} element The collapsed shape.\n   */\n  DrilldownOverlayBehavior.prototype._addOverlay = function(element) {\n    var canvas = this._canvas,\n        overlays = this._overlays;\n\n    var existingOverlays = overlays.get({ element: element, type: 'drilldown' });\n\n    if (existingOverlays.length) {\n      this._removeOverlay(element);\n    }\n\n    var button = domify$1('<button class=\"bjs-drilldown\">' + ARROW_DOWN_SVG + '</button>');\n\n    button.addEventListener('click', function() {\n      canvas.setRootElement(canvas.findRoot(getPlaneIdFromShape(element)));\n    });\n\n    overlays.add(element, 'drilldown', {\n      position: {\n        bottom: -7,\n        right: -8\n      },\n      html: button\n    });\n\n    this._updateOverlayVisibility(element);\n  };\n\n  DrilldownOverlayBehavior.prototype._removeOverlay = function(element) {\n    var overlays = this._overlays;\n\n    overlays.remove({\n      element: element,\n      type: 'drilldown'\n    });\n  };\n\n  DrilldownOverlayBehavior.$inject = [\n    'canvas',\n    'eventBus',\n    'elementRegistry',\n    'overlays'\n  ];\n\n  var DrilldownModdule = {\n    __depends__: [ OverlaysModule, ChangeSupportModule, RootElementsModule ],\n    __init__: [ 'drilldownBreadcrumbs', 'drilldownOverlayBehavior', 'drilldownCentering', 'subprocessCompatibility' ],\n    drilldownBreadcrumbs: [ 'type', DrilldownBreadcrumbs ],\n    drilldownCentering: [ 'type', DrilldownCentering ],\n    drilldownOverlayBehavior: [ 'type', DrilldownOverlayBehavior ],\n    subprocessCompatibility: [ 'type', SubprocessCompatibility ]\n  };\n\n  const CLASS_PATTERN = /^class[ {]/;\n\n\n  /**\n   * @param {function} fn\n   *\n   * @return {boolean}\n   */\n  function isClass(fn) {\n    return CLASS_PATTERN.test(fn.toString());\n  }\n\n  /**\n   * @param {any} obj\n   *\n   * @return {boolean}\n   */\n  function isArray(obj) {\n    return Array.isArray(obj);\n  }\n\n  /**\n   * @param {any} obj\n   * @param {string} prop\n   *\n   * @return {boolean}\n   */\n  function hasOwnProp(obj, prop) {\n    return Object.prototype.hasOwnProperty.call(obj, prop);\n  }\n\n  /**\n   * @typedef {import('./index').InjectAnnotated } InjectAnnotated\n   */\n\n  /**\n   * @template T\n   *\n   * @params {[...string[], T] | ...string[], T} args\n   *\n   * @return {T & InjectAnnotated}\n   */\n  function annotate(...args) {\n\n    if (args.length === 1 && isArray(args[0])) {\n      args = args[0];\n    }\n\n    args = [ ...args ];\n\n    const fn = args.pop();\n\n    fn.$inject = args;\n\n    return fn;\n  }\n\n\n  // Current limitations:\n  // - can't put into \"function arg\" comments\n  // function /* (no parenthesis like this) */ (){}\n  // function abc( /* xx (no parenthesis like this) */ a, b) {}\n  //\n  // Just put the comment before function or inside:\n  // /* (((this is fine))) */ function(a, b) {}\n  // function abc(a) { /* (((this is fine))) */}\n  //\n  // - can't reliably auto-annotate constructor; we'll match the\n  // first constructor(...) pattern found which may be the one\n  // of a nested class, too.\n\n  const CONSTRUCTOR_ARGS = /constructor\\s*[^(]*\\(\\s*([^)]*)\\)/m;\n  const FN_ARGS = /^(?:async\\s+)?(?:function\\s*[^(]*)?(?:\\(\\s*([^)]*)\\)|(\\w+))/m;\n  const FN_ARG = /\\/\\*([^*]*)\\*\\//m;\n\n  /**\n   * @param {unknown} fn\n   *\n   * @return {string[]}\n   */\n  function parseAnnotations(fn) {\n\n    if (typeof fn !== 'function') {\n      throw new Error(`Cannot annotate \"${fn}\". Expected a function!`);\n    }\n\n    const match = fn.toString().match(isClass(fn) ? CONSTRUCTOR_ARGS : FN_ARGS);\n\n    // may parse class without constructor\n    if (!match) {\n      return [];\n    }\n\n    const args = match[1] || match[2];\n\n    return args && args.split(',').map(arg => {\n      const argMatch = arg.match(FN_ARG);\n      return (argMatch && argMatch[1] || arg).trim();\n    }) || [];\n  }\n\n  /**\n   * @typedef { import('./index').ModuleDeclaration } ModuleDeclaration\n   * @typedef { import('./index').ModuleDefinition } ModuleDefinition\n   * @typedef { import('./index').InjectorContext } InjectorContext\n   */\n\n  /**\n   * Create a new injector with the given modules.\n   *\n   * @param {ModuleDefinition[]} modules\n   * @param {InjectorContext} [parent]\n   */\n  function Injector(modules, parent) {\n    parent = parent || {\n      get: function(name, strict) {\n        currentlyResolving.push(name);\n\n        if (strict === false) {\n          return null;\n        } else {\n          throw error(`No provider for \"${ name }\"!`);\n        }\n      }\n    };\n\n    const currentlyResolving = [];\n    const providers = this._providers = Object.create(parent._providers || null);\n    const instances = this._instances = Object.create(null);\n\n    const self = instances.injector = this;\n\n    const error = function(msg) {\n      const stack = currentlyResolving.join(' -> ');\n      currentlyResolving.length = 0;\n      return new Error(stack ? `${ msg } (Resolving: ${ stack })` : msg);\n    };\n\n    /**\n     * Return a named service.\n     *\n     * @param {string} name\n     * @param {boolean} [strict=true] if false, resolve missing services to null\n     *\n     * @return {any}\n     */\n    function get(name, strict) {\n      if (!providers[name] && name.indexOf('.') !== -1) {\n        const parts = name.split('.');\n        let pivot = get(parts.shift());\n\n        while (parts.length) {\n          pivot = pivot[parts.shift()];\n        }\n\n        return pivot;\n      }\n\n      if (hasOwnProp(instances, name)) {\n        return instances[name];\n      }\n\n      if (hasOwnProp(providers, name)) {\n        if (currentlyResolving.indexOf(name) !== -1) {\n          currentlyResolving.push(name);\n          throw error('Cannot resolve circular dependency!');\n        }\n\n        currentlyResolving.push(name);\n        instances[name] = providers[name][0](providers[name][1]);\n        currentlyResolving.pop();\n\n        return instances[name];\n      }\n\n      return parent.get(name, strict);\n    }\n\n    function fnDef(fn, locals) {\n\n      if (typeof locals === 'undefined') {\n        locals = {};\n      }\n\n      if (typeof fn !== 'function') {\n        if (isArray(fn)) {\n          fn = annotate(fn.slice());\n        } else {\n          throw error(`Cannot invoke \"${ fn }\". Expected a function!`);\n        }\n      }\n\n      const inject = fn.$inject || parseAnnotations(fn);\n      const dependencies = inject.map(dep => {\n        if (hasOwnProp(locals, dep)) {\n          return locals[dep];\n        } else {\n          return get(dep);\n        }\n      });\n\n      return {\n        fn: fn,\n        dependencies: dependencies\n      };\n    }\n\n    function instantiate(Type) {\n      const {\n        fn,\n        dependencies\n      } = fnDef(Type);\n\n      // instantiate var args constructor\n      const Constructor = Function.prototype.bind.apply(fn, [ null ].concat(dependencies));\n\n      return new Constructor();\n    }\n\n    function invoke(func, context, locals) {\n      const {\n        fn,\n        dependencies\n      } = fnDef(func, locals);\n\n      return fn.apply(context, dependencies);\n    }\n\n    /**\n     * @param {Injector} childInjector\n     *\n     * @return {Function}\n     */\n    function createPrivateInjectorFactory(childInjector) {\n      return annotate(key => childInjector.get(key));\n    }\n\n    /**\n     * @param {ModuleDefinition[]} modules\n     * @param {string[]} [forceNewInstances]\n     *\n     * @return {Injector}\n     */\n    function createChild(modules, forceNewInstances) {\n      if (forceNewInstances && forceNewInstances.length) {\n        const fromParentModule = Object.create(null);\n        const matchedScopes = Object.create(null);\n\n        const privateInjectorsCache = [];\n        const privateChildInjectors = [];\n        const privateChildFactories = [];\n\n        let provider;\n        let cacheIdx;\n        let privateChildInjector;\n        let privateChildInjectorFactory;\n\n        for (let name in providers) {\n          provider = providers[name];\n\n          if (forceNewInstances.indexOf(name) !== -1) {\n            if (provider[2] === 'private') {\n              cacheIdx = privateInjectorsCache.indexOf(provider[3]);\n              if (cacheIdx === -1) {\n                privateChildInjector = provider[3].createChild([], forceNewInstances);\n                privateChildInjectorFactory = createPrivateInjectorFactory(privateChildInjector);\n                privateInjectorsCache.push(provider[3]);\n                privateChildInjectors.push(privateChildInjector);\n                privateChildFactories.push(privateChildInjectorFactory);\n                fromParentModule[name] = [ privateChildInjectorFactory, name, 'private', privateChildInjector ];\n              } else {\n                fromParentModule[name] = [ privateChildFactories[cacheIdx], name, 'private', privateChildInjectors[cacheIdx] ];\n              }\n            } else {\n              fromParentModule[name] = [ provider[2], provider[1] ];\n            }\n            matchedScopes[name] = true;\n          }\n\n          if ((provider[2] === 'factory' || provider[2] === 'type') && provider[1].$scope) {\n            /* jshint -W083 */\n            forceNewInstances.forEach(scope => {\n              if (provider[1].$scope.indexOf(scope) !== -1) {\n                fromParentModule[name] = [ provider[2], provider[1] ];\n                matchedScopes[scope] = true;\n              }\n            });\n          }\n        }\n\n        forceNewInstances.forEach(scope => {\n          if (!matchedScopes[scope]) {\n            throw new Error('No provider for \"' + scope + '\". Cannot use provider from the parent!');\n          }\n        });\n\n        modules.unshift(fromParentModule);\n      }\n\n      return new Injector(modules, self);\n    }\n\n    const factoryMap = {\n      factory: invoke,\n      type: instantiate,\n      value: function(value) {\n        return value;\n      }\n    };\n\n    /**\n     * @param {ModuleDefinition} moduleDefinition\n     * @param {Injector} injector\n     */\n    function createInitializer(moduleDefinition, injector) {\n\n      const initializers = moduleDefinition.__init__ || [];\n\n      return function() {\n        initializers.forEach(initializer => {\n\n          // eagerly resolve component (fn or string)\n          if (typeof initializer === 'string') {\n            injector.get(initializer);\n          } else {\n            injector.invoke(initializer);\n          }\n        });\n      };\n    }\n\n    /**\n     * @param {ModuleDefinition} moduleDefinition\n     */\n    function loadModule(moduleDefinition) {\n\n      const moduleExports = moduleDefinition.__exports__;\n\n      // private module\n      if (moduleExports) {\n        const nestedModules = moduleDefinition.__modules__;\n\n        const clonedModule = Object.keys(moduleDefinition).reduce((clonedModule, key) => {\n\n          if (key !== '__exports__' && key !== '__modules__' && key !== '__init__' && key !== '__depends__') {\n            clonedModule[key] = moduleDefinition[key];\n          }\n\n          return clonedModule;\n        }, Object.create(null));\n\n        const childModules = (nestedModules || []).concat(clonedModule);\n\n        const privateInjector = createChild(childModules);\n        const getFromPrivateInjector = annotate(function(key) {\n          return privateInjector.get(key);\n        });\n\n        moduleExports.forEach(function(key) {\n          providers[key] = [ getFromPrivateInjector, key, 'private', privateInjector ];\n        });\n\n        // ensure child injector initializes\n        const initializers = (moduleDefinition.__init__ || []).slice();\n\n        initializers.unshift(function() {\n          privateInjector.init();\n        });\n\n        moduleDefinition = Object.assign({}, moduleDefinition, {\n          __init__: initializers\n        });\n\n        return createInitializer(moduleDefinition, privateInjector);\n      }\n\n      // normal module\n      Object.keys(moduleDefinition).forEach(function(key) {\n\n        if (key === '__init__' || key === '__depends__') {\n          return;\n        }\n\n        if (moduleDefinition[key][2] === 'private') {\n          providers[key] = moduleDefinition[key];\n          return;\n        }\n\n        const type = moduleDefinition[key][0];\n        const value = moduleDefinition[key][1];\n\n        providers[key] = [ factoryMap[type], arrayUnwrap(type, value), type ];\n      });\n\n      return createInitializer(moduleDefinition, self);\n    }\n\n    /**\n     * @param {ModuleDefinition[]} moduleDefinitions\n     * @param {ModuleDefinition} moduleDefinition\n     *\n     * @return {ModuleDefinition[]}\n     */\n    function resolveDependencies(moduleDefinitions, moduleDefinition) {\n\n      if (moduleDefinitions.indexOf(moduleDefinition) !== -1) {\n        return moduleDefinitions;\n      }\n\n      moduleDefinitions = (moduleDefinition.__depends__ || []).reduce(resolveDependencies, moduleDefinitions);\n\n      if (moduleDefinitions.indexOf(moduleDefinition) !== -1) {\n        return moduleDefinitions;\n      }\n\n      return moduleDefinitions.concat(moduleDefinition);\n    }\n\n    /**\n     * @param {ModuleDefinition[]} moduleDefinitions\n     *\n     * @return { () => void } initializerFn\n     */\n    function bootstrap(moduleDefinitions) {\n\n      const initializers = moduleDefinitions\n        .reduce(resolveDependencies, [])\n        .map(loadModule);\n\n      let initialized = false;\n\n      return function() {\n\n        if (initialized) {\n          return;\n        }\n\n        initialized = true;\n\n        initializers.forEach(initializer => initializer());\n      };\n    }\n\n    // public API\n    this.get = get;\n    this.invoke = invoke;\n    this.instantiate = instantiate;\n    this.createChild = createChild;\n\n    // setup\n    this.init = bootstrap(modules);\n  }\n\n\n  // helpers ///////////////\n\n  function arrayUnwrap(type, value) {\n    if (type !== 'value' && isArray(value)) {\n      value = annotate(value.slice());\n    }\n\n    return value;\n  }\n\n  /**\n   * @typedef {import('../core/EventBus').default} EventBus\n   * @typedef {import('./Styles').default} Styles\n   */\n\n  // apply default renderer with lowest possible priority\n  // so that it only kicks in if noone else could render\n  var DEFAULT_RENDER_PRIORITY = 1;\n\n  /**\n   * The default renderer used for shapes and connections.\n   *\n   * @param {EventBus} eventBus\n   * @param {Styles} styles\n   */\n  function DefaultRenderer(eventBus, styles) {\n\n    BaseRenderer.call(this, eventBus, DEFAULT_RENDER_PRIORITY);\n\n    this.CONNECTION_STYLE = styles.style([ 'no-fill' ], { strokeWidth: 5, stroke: 'fuchsia' });\n    this.SHAPE_STYLE = styles.style({ fill: 'white', stroke: 'fuchsia', strokeWidth: 2 });\n    this.FRAME_STYLE = styles.style([ 'no-fill' ], { stroke: 'fuchsia', strokeDasharray: 4, strokeWidth: 2 });\n  }\n\n  e(DefaultRenderer, BaseRenderer);\n\n\n  /**\n   * @private\n   */\n  DefaultRenderer.prototype.canRender = function() {\n    return true;\n  };\n\n  /**\n   * @private\n   */\n  DefaultRenderer.prototype.drawShape = function drawShape(visuals, element, attrs) {\n    var rect = create$1('rect');\n\n    attr$1(rect, {\n      x: 0,\n      y: 0,\n      width: element.width || 0,\n      height: element.height || 0\n    });\n\n    if (isFrameElement(element)) {\n      attr$1(rect, assign$1({}, this.FRAME_STYLE, attrs || {}));\n    } else {\n      attr$1(rect, assign$1({}, this.SHAPE_STYLE, attrs || {}));\n    }\n\n    append(visuals, rect);\n\n    return rect;\n  };\n\n  /**\n   * @private\n   */\n  DefaultRenderer.prototype.drawConnection = function drawConnection(visuals, connection, attrs) {\n\n    var line = createLine(connection.waypoints, assign$1({}, this.CONNECTION_STYLE, attrs || {}));\n    append(visuals, line);\n\n    return line;\n  };\n\n  /**\n   * @private\n   */\n  DefaultRenderer.prototype.getShapePath = function getShapePath(shape) {\n\n    var x = shape.x,\n        y = shape.y,\n        width = shape.width,\n        height = shape.height;\n\n    var shapePath = [\n      [ 'M', x, y ],\n      [ 'l', width, 0 ],\n      [ 'l', 0, height ],\n      [ 'l', -width, 0 ],\n      [ 'z' ]\n    ];\n\n    return componentsToPath(shapePath);\n  };\n\n  /**\n   * @private\n   */\n  DefaultRenderer.prototype.getConnectionPath = function getConnectionPath(connection) {\n    var waypoints = connection.waypoints;\n\n    var idx, point, connectionPath = [];\n\n    for (idx = 0; (point = waypoints[idx]); idx++) {\n\n      // take invisible docking into account\n      // when creating the path\n      point = point.original || point;\n\n      connectionPath.push([ idx === 0 ? 'M' : 'L', point.x, point.y ]);\n    }\n\n    return componentsToPath(connectionPath);\n  };\n\n  DefaultRenderer.$inject = [ 'eventBus', 'styles' ];\n\n  /**\n   * A component that manages shape styles\n   */\n  function Styles() {\n\n    var defaultTraits = {\n\n      'no-fill': {\n        fill: 'none'\n      },\n      'no-border': {\n        strokeOpacity: 0.0\n      },\n      'no-events': {\n        pointerEvents: 'none'\n      }\n    };\n\n    var self = this;\n\n    /**\n     * Builds a style definition from a className, a list of traits and an object\n     * of additional attributes.\n     *\n     * @param {string} className\n     * @param {string[]} [traits]\n     * @param {Object} [additionalAttrs]\n     *\n     * @return {Object} the style definition\n     */\n    this.cls = function(className, traits, additionalAttrs) {\n      var attrs = this.style(traits, additionalAttrs);\n\n      return assign$1(attrs, { 'class': className });\n    };\n\n    /**\n     * Builds a style definition from a list of traits and an object of additional\n     * attributes.\n     *\n     * @param {string[]} [traits]\n     * @param {Object} additionalAttrs\n     *\n     * @return {Object} the style definition\n     */\n    this.style = function(traits, additionalAttrs) {\n\n      if (!isArray$2(traits) && !additionalAttrs) {\n        additionalAttrs = traits;\n        traits = [];\n      }\n\n      var attrs = reduce(traits, function(attrs, t) {\n        return assign$1(attrs, defaultTraits[t] || {});\n      }, {});\n\n      return additionalAttrs ? assign$1(attrs, additionalAttrs) : attrs;\n    };\n\n\n    /**\n     * Computes a style definition from a list of traits and an object of\n     * additional attributes, with custom style definition object.\n     *\n     * @param {Object} custom\n     * @param {string[]} [traits]\n     * @param {Object} defaultStyles\n     *\n     * @return {Object} the style definition\n     */\n    this.computeStyle = function(custom, traits, defaultStyles) {\n      if (!isArray$2(traits)) {\n        defaultStyles = traits;\n        traits = [];\n      }\n\n      return self.style(traits || [], assign$1({}, defaultStyles, custom || {}));\n    };\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var DrawModule = {\n    __init__: [ 'defaultRenderer' ],\n    defaultRenderer: [ 'type', DefaultRenderer ],\n    styles: [ 'type', Styles ]\n  };\n\n  /**\n   * Failsafe remove an element from a collection\n   *\n   * @param {Array<Object>} [collection]\n   * @param {Object} [element]\n   *\n   * @return {number} the previous index of the element\n   */\n  function remove(collection, element) {\n\n    if (!collection || !element) {\n      return -1;\n    }\n\n    var idx = collection.indexOf(element);\n\n    if (idx !== -1) {\n      collection.splice(idx, 1);\n    }\n\n    return idx;\n  }\n\n  /**\n   * Fail save add an element to the given connection, ensuring\n   * it does not yet exist.\n   *\n   * @param {Array<Object>} collection\n   * @param {Object} element\n   * @param {number} [idx]\n   */\n  function add(collection, element, idx) {\n\n    if (!collection || !element) {\n      return;\n    }\n\n    if (typeof idx !== 'number') {\n      idx = -1;\n    }\n\n    var currentIdx = collection.indexOf(element);\n\n    if (currentIdx !== -1) {\n\n      if (currentIdx === idx) {\n\n        // nothing to do, position has not changed\n        return;\n      } else {\n\n        if (idx !== -1) {\n\n          // remove from current position\n          collection.splice(currentIdx, 1);\n        } else {\n\n          // already exists in collection\n          return;\n        }\n      }\n    }\n\n    if (idx !== -1) {\n\n      // insert at specified position\n      collection.splice(idx, 0, element);\n    } else {\n\n      // push to end\n      collection.push(element);\n    }\n  }\n\n  /**\n   * @typedef {import('./Types').ConnectionLike} ConnectionLike\n   * @typedef {import('./Types').RootLike} RootLike\n   * @typedef {import('./Types').ParentLike } ParentLike\n   * @typedef {import('./Types').ShapeLike} ShapeLike\n   *\n   * @typedef { {\n   *   container?: HTMLElement;\n   *   deferUpdate?: boolean;\n   *   width?: number;\n   *   height?: number;\n   * } } CanvasConfig\n   * @typedef { {\n   *   group: SVGElement;\n   *   index: number;\n   *   visible: boolean;\n   * } } CanvasLayer\n   * @typedef { {\n   *   [key: string]: CanvasLayer;\n   * } } CanvasLayers\n   * @typedef { {\n   *   rootElement: ShapeLike;\n   *   layer: CanvasLayer;\n   * } } CanvasPlane\n   * @typedef { {\n   *   scale: number;\n   *   inner: Rect;\n   *   outer: Dimensions;\n   * } & Rect } CanvasViewbox\n   *\n   * @typedef {import('./ElementRegistry').default} ElementRegistry\n   * @typedef {import('./EventBus').default} EventBus\n   * @typedef {import('./GraphicsFactory').default} GraphicsFactory\n   *\n   * @typedef {import('../util/Types').Dimensions} Dimensions\n   * @typedef {import('../util/Types').Point} Point\n   * @typedef {import('../util/Types').Rect} Rect\n   * @typedef {import('../util/Types').RectTRBL} RectTRBL\n   */\n\n  function round(number, resolution) {\n    return Math.round(number * resolution) / resolution;\n  }\n\n  function ensurePx(number) {\n    return isNumber(number) ? number + 'px' : number;\n  }\n\n  function findRoot(element) {\n    while (element.parent) {\n      element = element.parent;\n    }\n\n    return element;\n  }\n\n  /**\n   * Creates a HTML container element for a SVG element with\n   * the given configuration\n   *\n   * @param {CanvasConfig} options\n   *\n   * @return {HTMLElement} the container element\n   */\n  function createContainer(options) {\n\n    options = assign$1({}, { width: '100%', height: '100%' }, options);\n\n    const container = options.container || document.body;\n\n    // create a <div> around the svg element with the respective size\n    // this way we can always get the correct container size\n    // (this is impossible for <svg> elements at the moment)\n    const parent = document.createElement('div');\n    parent.setAttribute('class', 'djs-container djs-parent');\n\n    assign(parent, {\n      position: 'relative',\n      overflow: 'hidden',\n      width: ensurePx(options.width),\n      height: ensurePx(options.height)\n    });\n\n    container.appendChild(parent);\n\n    return parent;\n  }\n\n  function createGroup(parent, cls, childIndex) {\n    const group = create$1('g');\n    classes$1(group).add(cls);\n\n    const index = childIndex !== undefined ? childIndex : parent.childNodes.length - 1;\n\n    // must ensure second argument is node or _null_\n    // cf. https://developer.mozilla.org/en-US/docs/Web/API/Node/insertBefore\n    parent.insertBefore(group, parent.childNodes[index] || null);\n\n    return group;\n  }\n\n  const BASE_LAYER = 'base';\n\n  // render plane contents behind utility layers\n  const PLANE_LAYER_INDEX = 0;\n  const UTILITY_LAYER_INDEX = 1;\n\n\n  const REQUIRED_MODEL_ATTRS = {\n    shape: [ 'x', 'y', 'width', 'height' ],\n    connection: [ 'waypoints' ]\n  };\n\n  /**\n   * The main drawing canvas.\n   *\n   * @class\n   * @constructor\n   *\n   * @emits Canvas#canvas.init\n   *\n   * @param {CanvasConfig|null} config\n   * @param {EventBus} eventBus\n   * @param {GraphicsFactory} graphicsFactory\n   * @param {ElementRegistry} elementRegistry\n   */\n  function Canvas(config, eventBus, graphicsFactory, elementRegistry) {\n    this._eventBus = eventBus;\n    this._elementRegistry = elementRegistry;\n    this._graphicsFactory = graphicsFactory;\n\n    /**\n     * @type {number}\n     */\n    this._rootsIdx = 0;\n\n    /**\n     * @type {CanvasLayers}\n     */\n    this._layers = {};\n\n    /**\n     * @type {CanvasPlane[]}\n     */\n    this._planes = [];\n\n    /**\n     * @type {RootLike|null}\n     */\n    this._rootElement = null;\n\n    this._init(config || {});\n  }\n\n  Canvas.$inject = [\n    'config.canvas',\n    'eventBus',\n    'graphicsFactory',\n    'elementRegistry'\n  ];\n\n  /**\n   * Creates a <svg> element that is wrapped into a <div>.\n   * This way we are always able to correctly figure out the size of the svg element\n   * by querying the parent node.\n\n   * (It is not possible to get the size of a svg element cross browser @ 2014-04-01)\n\n   * <div class=\"djs-container\" style=\"width: {desired-width}, height: {desired-height}\">\n   *   <svg width=\"100%\" height=\"100%\">\n   *    ...\n   *   </svg>\n   * </div>\n   *\n   * @param {CanvasConfig} config\n   */\n  Canvas.prototype._init = function(config) {\n\n    const eventBus = this._eventBus;\n\n    // html container\n    const container = this._container = createContainer(config);\n\n    const svg = this._svg = create$1('svg');\n    attr$1(svg, { width: '100%', height: '100%' });\n\n    append(container, svg);\n\n    const viewport = this._viewport = createGroup(svg, 'viewport');\n\n    // debounce canvas.viewbox.changed events\n    // for smoother diagram interaction\n    if (config.deferUpdate !== false) {\n      this._viewboxChanged = debounce(bind$2(this._viewboxChanged, this), 300);\n    }\n\n    eventBus.on('diagram.init', () => {\n\n      /**\n       * An event indicating that the canvas is ready to be drawn on.\n       *\n       * @memberOf Canvas\n       *\n       * @event canvas.init\n       *\n       * @type {Object}\n       * @property {SVGElement} svg the created svg element\n       * @property {SVGElement} viewport the direct parent of diagram elements and shapes\n       */\n      eventBus.fire('canvas.init', {\n        svg: svg,\n        viewport: viewport\n      });\n\n    });\n\n    // reset viewbox on shape changes to\n    // recompute the viewbox\n    eventBus.on([\n      'shape.added',\n      'connection.added',\n      'shape.removed',\n      'connection.removed',\n      'elements.changed',\n      'root.set'\n    ], () => {\n      delete this._cachedViewbox;\n    });\n\n    eventBus.on('diagram.destroy', 500, this._destroy, this);\n    eventBus.on('diagram.clear', 500, this._clear, this);\n  };\n\n  Canvas.prototype._destroy = function() {\n    this._eventBus.fire('canvas.destroy', {\n      svg: this._svg,\n      viewport: this._viewport\n    });\n\n    const parent = this._container.parentNode;\n\n    if (parent) {\n      parent.removeChild(this._container);\n    }\n\n    delete this._svg;\n    delete this._container;\n    delete this._layers;\n    delete this._planes;\n    delete this._rootElement;\n    delete this._viewport;\n  };\n\n  Canvas.prototype._clear = function() {\n\n    const allElements = this._elementRegistry.getAll();\n\n    // remove all elements\n    allElements.forEach(element => {\n      const type = getType(element);\n\n      if (type === 'root') {\n        this.removeRootElement(element);\n      } else {\n        this._removeElement(element, type);\n      }\n    });\n\n    // remove all planes\n    this._planes = [];\n    this._rootElement = null;\n\n    // force recomputation of view box\n    delete this._cachedViewbox;\n  };\n\n  /**\n   * Returns the default layer on which\n   * all elements are drawn.\n   *\n   * @return {SVGElement}  The SVG element of the layer.\n   */\n  Canvas.prototype.getDefaultLayer = function() {\n    return this.getLayer(BASE_LAYER, PLANE_LAYER_INDEX);\n  };\n\n  /**\n   * Returns a layer that is used to draw elements\n   * or annotations on it.\n   *\n   * Non-existing layers retrieved through this method\n   * will be created. During creation, the optional index\n   * may be used to create layers below or above existing layers.\n   * A layer with a certain index is always created above all\n   * existing layers with the same index.\n   *\n   * @param {string} name The name of the layer.\n   * @param {number} [index] The index of the layer.\n   *\n   * @return {SVGElement} The SVG element of the layer.\n   */\n  Canvas.prototype.getLayer = function(name, index) {\n\n    if (!name) {\n      throw new Error('must specify a name');\n    }\n\n    let layer = this._layers[name];\n\n    if (!layer) {\n      layer = this._layers[name] = this._createLayer(name, index);\n    }\n\n    // throw an error if layer creation / retrival is\n    // requested on different index\n    if (typeof index !== 'undefined' && layer.index !== index) {\n      throw new Error('layer <' + name + '> already created at index <' + index + '>');\n    }\n\n    return layer.group;\n  };\n\n  /**\n   * For a given index, return the number of layers that have a higher index and\n   * are visible.\n   *\n   * This is used to determine the node a layer should be inserted at.\n   *\n   * @param {number} index\n   *\n   * @return {number}\n   */\n  Canvas.prototype._getChildIndex = function(index) {\n    return reduce(this._layers, function(childIndex, layer) {\n      if (layer.visible && index >= layer.index) {\n        childIndex++;\n      }\n\n      return childIndex;\n    }, 0);\n  };\n\n  /**\n   * Creates a given layer and returns it.\n   *\n   * @param {string} name\n   * @param {number} [index=0]\n   *\n   * @return {CanvasLayer}\n   */\n  Canvas.prototype._createLayer = function(name, index) {\n\n    if (typeof index === 'undefined') {\n      index = UTILITY_LAYER_INDEX;\n    }\n\n    const childIndex = this._getChildIndex(index);\n\n    return {\n      group: createGroup(this._viewport, 'layer-' + name, childIndex),\n      index: index,\n      visible: true\n    };\n  };\n\n\n  /**\n   * Shows a given layer.\n   *\n   * @param {string} name The name of the layer.\n   *\n   * @return {SVGElement} The SVG element of the layer.\n   */\n  Canvas.prototype.showLayer = function(name) {\n\n    if (!name) {\n      throw new Error('must specify a name');\n    }\n\n    const layer = this._layers[name];\n\n    if (!layer) {\n      throw new Error('layer <' + name + '> does not exist');\n    }\n\n    const viewport = this._viewport;\n    const group = layer.group;\n    const index = layer.index;\n\n    if (layer.visible) {\n      return group;\n    }\n\n    const childIndex = this._getChildIndex(index);\n\n    viewport.insertBefore(group, viewport.childNodes[childIndex] || null);\n\n    layer.visible = true;\n\n    return group;\n  };\n\n  /**\n   * Hides a given layer.\n   *\n   * @param {string} name The name of the layer.\n   *\n   * @return {SVGElement} The SVG element of the layer.\n   */\n  Canvas.prototype.hideLayer = function(name) {\n\n    if (!name) {\n      throw new Error('must specify a name');\n    }\n\n    const layer = this._layers[name];\n\n    if (!layer) {\n      throw new Error('layer <' + name + '> does not exist');\n    }\n\n    const group = layer.group;\n\n    if (!layer.visible) {\n      return group;\n    }\n\n    remove$2(group);\n\n    layer.visible = false;\n\n    return group;\n  };\n\n\n  Canvas.prototype._removeLayer = function(name) {\n\n    const layer = this._layers[name];\n\n    if (layer) {\n      delete this._layers[name];\n\n      remove$2(layer.group);\n    }\n  };\n\n  /**\n   * Returns the currently active layer. Can be null.\n   *\n   * @return {CanvasLayer|null} The active layer of `null`.\n   */\n  Canvas.prototype.getActiveLayer = function() {\n    const plane = this._findPlaneForRoot(this.getRootElement());\n\n    if (!plane) {\n      return null;\n    }\n\n    return plane.layer;\n  };\n\n\n  /**\n   * Returns the plane which contains the given element.\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element or its ID.\n   *\n   * @return {RootLike|undefined} The root of the element.\n   */\n  Canvas.prototype.findRoot = function(element) {\n    if (typeof element === 'string') {\n      element = this._elementRegistry.get(element);\n    }\n\n    if (!element) {\n      return;\n    }\n\n    const plane = this._findPlaneForRoot(\n      findRoot(element)\n    ) || {};\n\n    return plane.rootElement;\n  };\n\n  /**\n   * Return a list of all root elements on the diagram.\n   *\n   * @return {(RootLike)[]} The list of root elements.\n   */\n  Canvas.prototype.getRootElements = function() {\n    return this._planes.map(function(plane) {\n      return plane.rootElement;\n    });\n  };\n\n  Canvas.prototype._findPlaneForRoot = function(rootElement) {\n    return find(this._planes, function(plane) {\n      return plane.rootElement === rootElement;\n    });\n  };\n\n\n  /**\n   * Returns the html element that encloses the\n   * drawing canvas.\n   *\n   * @return {HTMLElement} The HTML element of the container.\n   */\n  Canvas.prototype.getContainer = function() {\n    return this._container;\n  };\n\n\n  // markers //////////////////////\n\n  Canvas.prototype._updateMarker = function(element, marker, add) {\n    let container;\n\n    if (!element.id) {\n      element = this._elementRegistry.get(element);\n    }\n\n    // we need to access all\n    container = this._elementRegistry._elements[element.id];\n\n    if (!container) {\n      return;\n    }\n\n    forEach$1([ container.gfx, container.secondaryGfx ], function(gfx) {\n      if (gfx) {\n\n        // invoke either addClass or removeClass based on mode\n        if (add) {\n          classes$1(gfx).add(marker);\n        } else {\n          classes$1(gfx).remove(marker);\n        }\n      }\n    });\n\n    /**\n     * An event indicating that a marker has been updated for an element\n     *\n     * @event element.marker.update\n     * @type {Object}\n     * @property {Element} element the shape\n     * @property {SVGElement} gfx the graphical representation of the shape\n     * @property {string} marker\n     * @property {boolean} add true if the marker was added, false if it got removed\n     */\n    this._eventBus.fire('element.marker.update', { element: element, gfx: container.gfx, marker: marker, add: !!add });\n  };\n\n\n  /**\n   * Adds a marker to an element (basically a css class).\n   *\n   * Fires the element.marker.update event, making it possible to\n   * integrate extension into the marker life-cycle, too.\n   *\n   * @example\n   *\n   * ```javascript\n   * canvas.addMarker('foo', 'some-marker');\n   *\n   * const fooGfx = canvas.getGraphics('foo');\n   *\n   * fooGfx; // <g class=\"... some-marker\"> ... </g>\n   * ```\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element or its ID.\n   * @param {string} marker The marker.\n   */\n  Canvas.prototype.addMarker = function(element, marker) {\n    this._updateMarker(element, marker, true);\n  };\n\n\n  /**\n   * Remove a marker from an element.\n   *\n   * Fires the element.marker.update event, making it possible to\n   * integrate extension into the marker life-cycle, too.\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element or its ID.\n   * @param {string} marker The marker.\n   */\n  Canvas.prototype.removeMarker = function(element, marker) {\n    this._updateMarker(element, marker, false);\n  };\n\n  /**\n   * Check whether an element has a given marker.\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element or its ID.\n   * @param {string} marker The marker.\n   */\n  Canvas.prototype.hasMarker = function(element, marker) {\n    if (!element.id) {\n      element = this._elementRegistry.get(element);\n    }\n\n    const gfx = this.getGraphics(element);\n\n    return classes$1(gfx).has(marker);\n  };\n\n  /**\n   * Toggles a marker on an element.\n   *\n   * Fires the element.marker.update event, making it possible to\n   * integrate extension into the marker life-cycle, too.\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element or its ID.\n   * @param {string} marker The marker.\n   */\n  Canvas.prototype.toggleMarker = function(element, marker) {\n    if (this.hasMarker(element, marker)) {\n      this.removeMarker(element, marker);\n    } else {\n      this.addMarker(element, marker);\n    }\n  };\n\n  /**\n   * Returns the current root element.\n   *\n   * Supports two different modes for handling root elements:\n   *\n   * 1. if no root element has been added before, an implicit root will be added\n   * and returned. This is used in applications that don't require explicit\n   * root elements.\n   *\n   * 2. when root elements have been added before calling `getRootElement`,\n   * root elements can be null. This is used for applications that want to manage\n   * root elements themselves.\n   *\n   * @return {RootLike} The current root element.\n   */\n  Canvas.prototype.getRootElement = function() {\n    const rootElement = this._rootElement;\n\n    // can return null if root elements are present but none was set yet\n    if (rootElement || this._planes.length) {\n      return rootElement;\n    }\n\n    return this.setRootElement(this.addRootElement(null));\n  };\n\n  /**\n   * Adds a given root element and returns it.\n   *\n   * @param {RootLike} [rootElement] The root element to be added.\n   *\n   * @return {RootLike} The added root element or an implicit root element.\n   */\n  Canvas.prototype.addRootElement = function(rootElement) {\n    const idx = this._rootsIdx++;\n\n    if (!rootElement) {\n      rootElement = {\n        id: '__implicitroot_' + idx,\n        children: [],\n        isImplicit: true\n      };\n    }\n\n    const layerName = rootElement.layer = 'root-' + idx;\n\n    this._ensureValid('root', rootElement);\n\n    const layer = this.getLayer(layerName, PLANE_LAYER_INDEX);\n\n    this.hideLayer(layerName);\n\n    this._addRoot(rootElement, layer);\n\n    this._planes.push({\n      rootElement: rootElement,\n      layer: layer\n    });\n\n    return rootElement;\n  };\n\n  /**\n   * Removes a given root element and returns it.\n   *\n   * @param {RootLike|string} rootElement element or element ID\n   *\n   * @return {RootLike|undefined} removed element\n   */\n  Canvas.prototype.removeRootElement = function(rootElement) {\n\n    if (typeof rootElement === 'string') {\n      rootElement = this._elementRegistry.get(rootElement);\n    }\n\n    const plane = this._findPlaneForRoot(rootElement);\n\n    if (!plane) {\n      return;\n    }\n\n    // hook up life-cycle events\n    this._removeRoot(rootElement);\n\n    // clean up layer\n    this._removeLayer(rootElement.layer);\n\n    // clean up plane\n    this._planes = this._planes.filter(function(plane) {\n      return plane.rootElement !== rootElement;\n    });\n\n    // clean up active root\n    if (this._rootElement === rootElement) {\n      this._rootElement = null;\n    }\n\n    return rootElement;\n  };\n\n\n  /**\n   * Sets a given element as the new root element for the canvas\n   * and returns the new root element.\n   *\n   * @param {RootLike} rootElement The root element to be set.\n   *\n   * @return {RootLike} The set root element.\n   */\n  Canvas.prototype.setRootElement = function(rootElement) {\n\n    if (rootElement === this._rootElement) {\n      return;\n    }\n\n    let plane;\n\n    if (!rootElement) {\n      throw new Error('rootElement required');\n    }\n\n    plane = this._findPlaneForRoot(rootElement);\n\n    // give set add semantics for backwards compatibility\n    if (!plane) {\n      rootElement = this.addRootElement(rootElement);\n    }\n\n    this._setRoot(rootElement);\n\n    return rootElement;\n  };\n\n\n  Canvas.prototype._removeRoot = function(element) {\n    const elementRegistry = this._elementRegistry,\n          eventBus = this._eventBus;\n\n    // simulate element remove event sequence\n    eventBus.fire('root.remove', { element: element });\n    eventBus.fire('root.removed', { element: element });\n\n    elementRegistry.remove(element);\n  };\n\n\n  Canvas.prototype._addRoot = function(element, gfx) {\n    const elementRegistry = this._elementRegistry,\n          eventBus = this._eventBus;\n\n    // resemble element add event sequence\n    eventBus.fire('root.add', { element: element });\n\n    elementRegistry.add(element, gfx);\n\n    eventBus.fire('root.added', { element: element, gfx: gfx });\n  };\n\n\n  Canvas.prototype._setRoot = function(rootElement, layer) {\n\n    const currentRoot = this._rootElement;\n\n    if (currentRoot) {\n\n      // un-associate previous root element <svg>\n      this._elementRegistry.updateGraphics(currentRoot, null, true);\n\n      // hide previous layer\n      this.hideLayer(currentRoot.layer);\n    }\n\n    if (rootElement) {\n\n      if (!layer) {\n        layer = this._findPlaneForRoot(rootElement).layer;\n      }\n\n      // associate element with <svg>\n      this._elementRegistry.updateGraphics(rootElement, this._svg, true);\n\n      // show root layer\n      this.showLayer(rootElement.layer);\n    }\n\n    this._rootElement = rootElement;\n\n    this._eventBus.fire('root.set', { element: rootElement });\n  };\n\n  Canvas.prototype._ensureValid = function(type, element) {\n    if (!element.id) {\n      throw new Error('element must have an id');\n    }\n\n    if (this._elementRegistry.get(element.id)) {\n      throw new Error('element <' + element.id + '> already exists');\n    }\n\n    const requiredAttrs = REQUIRED_MODEL_ATTRS[type];\n\n    const valid = every(requiredAttrs, function(attr) {\n      return typeof element[attr] !== 'undefined';\n    });\n\n    if (!valid) {\n      throw new Error(\n        'must supply { ' + requiredAttrs.join(', ') + ' } with ' + type);\n    }\n  };\n\n  Canvas.prototype._setParent = function(element, parent, parentIndex) {\n    add(parent.children, element, parentIndex);\n    element.parent = parent;\n  };\n\n  /**\n   * Adds an element to the canvas.\n   *\n   * This wires the parent <-> child relationship between the element and\n   * a explicitly specified parent or an implicit root element.\n   *\n   * During add it emits the events\n   *\n   *  * <{type}.add> (element, parent)\n   *  * <{type}.added> (element, gfx)\n   *\n   * Extensions may hook into these events to perform their magic.\n   *\n   * @param {string} type\n   * @param {ConnectionLike|ShapeLike} element\n   * @param {ShapeLike} [parent]\n   * @param {number} [parentIndex]\n   *\n   * @return {ConnectionLike|ShapeLike} The added element.\n   */\n  Canvas.prototype._addElement = function(type, element, parent, parentIndex) {\n\n    parent = parent || this.getRootElement();\n\n    const eventBus = this._eventBus,\n          graphicsFactory = this._graphicsFactory;\n\n    this._ensureValid(type, element);\n\n    eventBus.fire(type + '.add', { element: element, parent: parent });\n\n    this._setParent(element, parent, parentIndex);\n\n    // create graphics\n    const gfx = graphicsFactory.create(type, element, parentIndex);\n\n    this._elementRegistry.add(element, gfx);\n\n    // update its visual\n    graphicsFactory.update(type, element, gfx);\n\n    eventBus.fire(type + '.added', { element: element, gfx: gfx });\n\n    return element;\n  };\n\n  /**\n   * Adds a shape to the canvas.\n   *\n   * @param {ShapeLike} shape The shape to be added\n   * @param {ParentLike} [parent] The shape's parent.\n   * @param {number} [parentIndex] The index at which to add the shape to the parent's children.\n   *\n   * @return {ShapeLike} The added shape.\n   */\n  Canvas.prototype.addShape = function(shape, parent, parentIndex) {\n    return this._addElement('shape', shape, parent, parentIndex);\n  };\n\n  /**\n   * Adds a connection to the canvas.\n   *\n   * @param {ConnectionLike} connection The connection to be added.\n   * @param {ParentLike} [parent] The connection's parent.\n   * @param {number} [parentIndex] The index at which to add the connection to the parent's children.\n   *\n   * @return {ConnectionLike} The added connection.\n   */\n  Canvas.prototype.addConnection = function(connection, parent, parentIndex) {\n    return this._addElement('connection', connection, parent, parentIndex);\n  };\n\n\n  /**\n   * Internal remove element\n   */\n  Canvas.prototype._removeElement = function(element, type) {\n\n    const elementRegistry = this._elementRegistry,\n          graphicsFactory = this._graphicsFactory,\n          eventBus = this._eventBus;\n\n    element = elementRegistry.get(element.id || element);\n\n    if (!element) {\n\n      // element was removed already\n      return;\n    }\n\n    eventBus.fire(type + '.remove', { element: element });\n\n    graphicsFactory.remove(element);\n\n    // unset parent <-> child relationship\n    remove(element.parent && element.parent.children, element);\n    element.parent = null;\n\n    eventBus.fire(type + '.removed', { element: element });\n\n    elementRegistry.remove(element);\n\n    return element;\n  };\n\n\n  /**\n   * Removes a shape from the canvas.\n   *\n   * @fires ShapeRemoveEvent\n   * @fires ShapeRemovedEvent\n   *\n   * @param {ShapeLike|string} shape The shape or its ID.\n   *\n   * @return {ShapeLike} The removed shape.\n   */\n  Canvas.prototype.removeShape = function(shape) {\n\n    /**\n     * An event indicating that a shape is about to be removed from the canvas.\n     *\n     * @memberOf Canvas\n     *\n     * @event ShapeRemoveEvent\n     * @type {Object}\n     * @property {ShapeLike} element The shape.\n     * @property {SVGElement} gfx The graphical element.\n     */\n\n    /**\n     * An event indicating that a shape has been removed from the canvas.\n     *\n     * @memberOf Canvas\n     *\n     * @event ShapeRemovedEvent\n     * @type {Object}\n     * @property {ShapeLike} element The shape.\n     * @property {SVGElement} gfx The graphical element.\n     */\n    return this._removeElement(shape, 'shape');\n  };\n\n\n  /**\n   * Removes a connection from the canvas.\n   *\n   * @fires ConnectionRemoveEvent\n   * @fires ConnectionRemovedEvent\n   *\n   * @param {ConnectionLike|string} connection The connection or its ID.\n   *\n   * @return {ConnectionLike} The removed connection.\n   */\n  Canvas.prototype.removeConnection = function(connection) {\n\n    /**\n     * An event indicating that a connection is about to be removed from the canvas.\n     *\n     * @memberOf Canvas\n     *\n     * @event ConnectionRemoveEvent\n     * @type {Object}\n     * @property {ConnectionLike} element The connection.\n     * @property {SVGElement} gfx The graphical element.\n     */\n\n    /**\n     * An event indicating that a connection has been removed from the canvas.\n     *\n     * @memberOf Canvas\n     *\n     * @event ConnectionRemovedEvent\n     * @type {Object}\n     * @property {ConnectionLike} element The connection.\n     * @property {SVGElement} gfx The graphical element.\n     */\n    return this._removeElement(connection, 'connection');\n  };\n\n\n  /**\n   * Returns the graphical element of an element.\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element or its ID.\n   * @param {boolean} [secondary=false] Whether to return the secondary graphical element.\n   *\n   * @return {SVGElement} The graphical element.\n   */\n  Canvas.prototype.getGraphics = function(element, secondary) {\n    return this._elementRegistry.getGraphics(element, secondary);\n  };\n\n\n  /**\n   * Perform a viewbox update via a given change function.\n   *\n   * @param {Function} changeFn\n   */\n  Canvas.prototype._changeViewbox = function(changeFn) {\n\n    // notify others of the upcoming viewbox change\n    this._eventBus.fire('canvas.viewbox.changing');\n\n    // perform actual change\n    changeFn.apply(this);\n\n    // reset the cached viewbox so that\n    // a new get operation on viewbox or zoom\n    // triggers a viewbox re-computation\n    this._cachedViewbox = null;\n\n    // notify others of the change; this step\n    // may or may not be debounced\n    this._viewboxChanged();\n  };\n\n  Canvas.prototype._viewboxChanged = function() {\n    this._eventBus.fire('canvas.viewbox.changed', { viewbox: this.viewbox() });\n  };\n\n\n  /**\n   * Gets or sets the view box of the canvas, i.e. the\n   * area that is currently displayed.\n   *\n   * The getter may return a cached viewbox (if it is currently\n   * changing). To force a recomputation, pass `false` as the first argument.\n   *\n   * @example\n   *\n   * ```javascript\n   * canvas.viewbox({ x: 100, y: 100, width: 500, height: 500 })\n   *\n   * // sets the visible area of the diagram to (100|100) -> (600|100)\n   * // and and scales it according to the diagram width\n   *\n   * const viewbox = canvas.viewbox(); // pass `false` to force recomputing the box.\n   *\n   * console.log(viewbox);\n   * // {\n   * //   inner: Dimensions,\n   * //   outer: Dimensions,\n   * //   scale,\n   * //   x, y,\n   * //   width, height\n   * // }\n   *\n   * // if the current diagram is zoomed and scrolled, you may reset it to the\n   * // default zoom via this method, too:\n   *\n   * const zoomedAndScrolledViewbox = canvas.viewbox();\n   *\n   * canvas.viewbox({\n   *   x: 0,\n   *   y: 0,\n   *   width: zoomedAndScrolledViewbox.outer.width,\n   *   height: zoomedAndScrolledViewbox.outer.height\n   * });\n   * ```\n   *\n   * @param {Rect} [box] The viewbox to be set.\n   *\n   * @return {CanvasViewbox} The set viewbox.\n   */\n  Canvas.prototype.viewbox = function(box) {\n\n    if (box === undefined && this._cachedViewbox) {\n      return this._cachedViewbox;\n    }\n\n    const viewport = this._viewport,\n          outerBox = this.getSize();\n    let innerBox,\n        matrix,\n        activeLayer,\n        transform,\n        scale,\n        x, y;\n\n    if (!box) {\n\n      // compute the inner box based on the\n      // diagrams active layer. This allows us to exclude\n      // external components, such as overlays\n\n      activeLayer = this._rootElement ? this.getActiveLayer() : null;\n      innerBox = activeLayer && activeLayer.getBBox() || {};\n\n      transform = transform$1(viewport);\n      matrix = transform ? transform.matrix : createMatrix();\n      scale = round(matrix.a, 1000);\n\n      x = round(-matrix.e || 0, 1000);\n      y = round(-matrix.f || 0, 1000);\n\n      box = this._cachedViewbox = {\n        x: x ? x / scale : 0,\n        y: y ? y / scale : 0,\n        width: outerBox.width / scale,\n        height: outerBox.height / scale,\n        scale: scale,\n        inner: {\n          width: innerBox.width || 0,\n          height: innerBox.height || 0,\n          x: innerBox.x || 0,\n          y: innerBox.y || 0\n        },\n        outer: outerBox\n      };\n\n      return box;\n    } else {\n\n      this._changeViewbox(function() {\n        scale = Math.min(outerBox.width / box.width, outerBox.height / box.height);\n\n        const matrix = this._svg.createSVGMatrix()\n          .scale(scale)\n          .translate(-box.x, -box.y);\n\n        transform$1(viewport, matrix);\n      });\n    }\n\n    return box;\n  };\n\n\n  /**\n   * Gets or sets the scroll of the canvas.\n   *\n   * @param {Point} [delta] The scroll to be set.\n   *\n   * @return {Point}\n   */\n  Canvas.prototype.scroll = function(delta) {\n\n    const node = this._viewport;\n    let matrix = node.getCTM();\n\n    if (delta) {\n      this._changeViewbox(function() {\n        delta = assign$1({ dx: 0, dy: 0 }, delta || {});\n\n        matrix = this._svg.createSVGMatrix().translate(delta.dx, delta.dy).multiply(matrix);\n\n        setCTM(node, matrix);\n      });\n    }\n\n    return { x: matrix.e, y: matrix.f };\n  };\n\n  /**\n   * Scrolls the viewbox to contain the given element.\n   * Optionally specify a padding to be applied to the edges.\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element to scroll to or its ID.\n   * @param {RectTRBL|number} [padding=100] The padding to be applied. Can also specify top, bottom, left and right.\n   */\n  Canvas.prototype.scrollToElement = function(element, padding) {\n    let defaultPadding = 100;\n\n    if (typeof element === 'string') {\n      element = this._elementRegistry.get(element);\n    }\n\n    // set to correct rootElement\n    const rootElement = this.findRoot(element);\n\n    if (rootElement !== this.getRootElement()) {\n      this.setRootElement(rootElement);\n    }\n\n    if (!padding) {\n      padding = {};\n    }\n    if (typeof padding === 'number') {\n      defaultPadding = padding;\n    }\n\n    padding = {\n      top: padding.top || defaultPadding,\n      right: padding.right || defaultPadding,\n      bottom: padding.bottom || defaultPadding,\n      left: padding.left || defaultPadding\n    };\n\n    const elementBounds = getBBox(element),\n          elementTrbl = asTRBL(elementBounds),\n          viewboxBounds = this.viewbox(),\n          zoom = this.zoom();\n    let dx, dy;\n\n    // shrink viewboxBounds with padding\n    viewboxBounds.y += padding.top / zoom;\n    viewboxBounds.x += padding.left / zoom;\n    viewboxBounds.width -= (padding.right + padding.left) / zoom;\n    viewboxBounds.height -= (padding.bottom + padding.top) / zoom;\n\n    const viewboxTrbl = asTRBL(viewboxBounds);\n\n    const canFit = elementBounds.width < viewboxBounds.width && elementBounds.height < viewboxBounds.height;\n\n    if (!canFit) {\n\n      // top-left when element can't fit\n      dx = elementBounds.x - viewboxBounds.x;\n      dy = elementBounds.y - viewboxBounds.y;\n\n    } else {\n\n      const dRight = Math.max(0, elementTrbl.right - viewboxTrbl.right),\n            dLeft = Math.min(0, elementTrbl.left - viewboxTrbl.left),\n            dBottom = Math.max(0, elementTrbl.bottom - viewboxTrbl.bottom),\n            dTop = Math.min(0, elementTrbl.top - viewboxTrbl.top);\n\n      dx = dRight || dLeft;\n      dy = dBottom || dTop;\n\n    }\n\n    this.scroll({ dx: -dx * zoom, dy: -dy * zoom });\n  };\n\n  /**\n   * Gets or sets the current zoom of the canvas, optionally zooming to the\n   * specified position.\n   *\n   * The getter may return a cached zoom level. Call it with `false` as the first\n   * argument to force recomputation of the current level.\n   *\n   * @param {number|'fit-viewport'} [newScale] The new zoom level, either a number,\n   * i.e. 0.9, or `fit-viewport` to adjust the size to fit the current viewport.\n   * @param {Point} [center] The reference point { x: ..., y: ...} to zoom to.\n   *\n   * @return {number} The set zoom level.\n   */\n  Canvas.prototype.zoom = function(newScale, center) {\n\n    if (!newScale) {\n      return this.viewbox(newScale).scale;\n    }\n\n    if (newScale === 'fit-viewport') {\n      return this._fitViewport(center);\n    }\n\n    let outer,\n        matrix;\n\n    this._changeViewbox(function() {\n\n      if (typeof center !== 'object') {\n        outer = this.viewbox().outer;\n\n        center = {\n          x: outer.width / 2,\n          y: outer.height / 2\n        };\n      }\n\n      matrix = this._setZoom(newScale, center);\n    });\n\n    return round(matrix.a, 1000);\n  };\n\n  function setCTM(node, m) {\n    const mstr = 'matrix(' + m.a + ',' + m.b + ',' + m.c + ',' + m.d + ',' + m.e + ',' + m.f + ')';\n    node.setAttribute('transform', mstr);\n  }\n\n  Canvas.prototype._fitViewport = function(center) {\n\n    const vbox = this.viewbox(),\n          outer = vbox.outer,\n          inner = vbox.inner;\n    let newScale,\n        newViewbox;\n\n    // display the complete diagram without zooming in.\n    // instead of relying on internal zoom, we perform a\n    // hard reset on the canvas viewbox to realize this\n    //\n    // if diagram does not need to be zoomed in, we focus it around\n    // the diagram origin instead\n\n    if (inner.x >= 0 &&\n        inner.y >= 0 &&\n        inner.x + inner.width <= outer.width &&\n        inner.y + inner.height <= outer.height &&\n        !center) {\n\n      newViewbox = {\n        x: 0,\n        y: 0,\n        width: Math.max(inner.width + inner.x, outer.width),\n        height: Math.max(inner.height + inner.y, outer.height)\n      };\n    } else {\n\n      newScale = Math.min(1, outer.width / inner.width, outer.height / inner.height);\n      newViewbox = {\n        x: inner.x + (center ? inner.width / 2 - outer.width / newScale / 2 : 0),\n        y: inner.y + (center ? inner.height / 2 - outer.height / newScale / 2 : 0),\n        width: outer.width / newScale,\n        height: outer.height / newScale\n      };\n    }\n\n    this.viewbox(newViewbox);\n\n    return this.viewbox(false).scale;\n  };\n\n\n  Canvas.prototype._setZoom = function(scale, center) {\n\n    const svg = this._svg,\n          viewport = this._viewport;\n\n    const matrix = svg.createSVGMatrix();\n    const point = svg.createSVGPoint();\n\n    let centerPoint,\n        originalPoint,\n        currentMatrix,\n        scaleMatrix,\n        newMatrix;\n\n    currentMatrix = viewport.getCTM();\n\n    const currentScale = currentMatrix.a;\n\n    if (center) {\n      centerPoint = assign$1(point, center);\n\n      // revert applied viewport transformations\n      originalPoint = centerPoint.matrixTransform(currentMatrix.inverse());\n\n      // create scale matrix\n      scaleMatrix = matrix\n        .translate(originalPoint.x, originalPoint.y)\n        .scale(1 / currentScale * scale)\n        .translate(-originalPoint.x, -originalPoint.y);\n\n      newMatrix = currentMatrix.multiply(scaleMatrix);\n    } else {\n      newMatrix = matrix.scale(scale);\n    }\n\n    setCTM(this._viewport, newMatrix);\n\n    return newMatrix;\n  };\n\n\n  /**\n   * Returns the size of the canvas.\n   *\n   * @return {Dimensions} The size of the canvas.\n   */\n  Canvas.prototype.getSize = function() {\n    return {\n      width: this._container.clientWidth,\n      height: this._container.clientHeight\n    };\n  };\n\n\n  /**\n   * Returns the absolute bounding box of an element.\n   *\n   * The absolute bounding box may be used to display overlays in the callers\n   * (browser) coordinate system rather than the zoomed in/out canvas coordinates.\n   *\n   * @param {ShapeLike|ConnectionLike} element The element.\n   *\n   * @return {Rect} The element's absolute bounding box.\n   */\n  Canvas.prototype.getAbsoluteBBox = function(element) {\n    const vbox = this.viewbox();\n    let bbox;\n\n    // connection\n    // use svg bbox\n    if (element.waypoints) {\n      const gfx = this.getGraphics(element);\n\n      bbox = gfx.getBBox();\n    }\n\n    // shapes\n    // use data\n    else {\n      bbox = element;\n    }\n\n    const x = bbox.x * vbox.scale - vbox.x * vbox.scale;\n    const y = bbox.y * vbox.scale - vbox.y * vbox.scale;\n\n    const width = bbox.width * vbox.scale;\n    const height = bbox.height * vbox.scale;\n\n    return {\n      x: x,\n      y: y,\n      width: width,\n      height: height\n    };\n  };\n\n  /**\n   * Fires an event so other modules can react to the canvas resizing.\n   */\n  Canvas.prototype.resized = function() {\n\n    // force recomputation of view box\n    delete this._cachedViewbox;\n\n    this._eventBus.fire('canvas.resized');\n  };\n\n  var ELEMENT_ID = 'data-element-id';\n\n  /**\n   * @typedef {import('./Types').ElementLike} ElementLike\n   *\n   * @typedef {import('./EventBus').default} EventBus\n   *\n   * @typedef { (element: ElementLike, gfx: SVGElement) => boolean|any } ElementRegistryFilterCallback\n   * @typedef { (element: ElementLike, gfx: SVGElement) => any } ElementRegistryForEachCallback\n   */\n\n  /**\n   * A registry that keeps track of all shapes in the diagram.\n   *\n   * @class\n   * @constructor\n   *\n   * @param {EventBus} eventBus\n   */\n  function ElementRegistry(eventBus) {\n\n    /**\n     * @type { {\n     *   [id: string]: {\n     *     element: ElementLike;\n     *     gfx?: SVGElement;\n     *     secondaryGfx?: SVGElement;\n     *   }\n     * } }\n     */\n    this._elements = {};\n\n    this._eventBus = eventBus;\n  }\n\n  ElementRegistry.$inject = [ 'eventBus' ];\n\n  /**\n   * Add an element and its graphical representation(s) to the registry.\n   *\n   * @param {ElementLike} element The element to be added.\n   * @param {SVGElement} gfx The primary graphical representation.\n   * @param {SVGElement} [secondaryGfx] The secondary graphical representation.\n   */\n  ElementRegistry.prototype.add = function(element, gfx, secondaryGfx) {\n\n    var id = element.id;\n\n    this._validateId(id);\n\n    // associate dom node with element\n    attr$1(gfx, ELEMENT_ID, id);\n\n    if (secondaryGfx) {\n      attr$1(secondaryGfx, ELEMENT_ID, id);\n    }\n\n    this._elements[id] = { element: element, gfx: gfx, secondaryGfx: secondaryGfx };\n  };\n\n  /**\n   * Remove an element from the registry.\n   *\n   * @param {ElementLike|string} element\n   */\n  ElementRegistry.prototype.remove = function(element) {\n    var elements = this._elements,\n        id = element.id || element,\n        container = id && elements[id];\n\n    if (container) {\n\n      // unset element id on gfx\n      attr$1(container.gfx, ELEMENT_ID, '');\n\n      if (container.secondaryGfx) {\n        attr$1(container.secondaryGfx, ELEMENT_ID, '');\n      }\n\n      delete elements[id];\n    }\n  };\n\n  /**\n   * Update an elements ID.\n   *\n   * @param {ElementLike|string} element The element or its ID.\n   * @param {string} newId The new ID.\n   */\n  ElementRegistry.prototype.updateId = function(element, newId) {\n\n    this._validateId(newId);\n\n    if (typeof element === 'string') {\n      element = this.get(element);\n    }\n\n    this._eventBus.fire('element.updateId', {\n      element: element,\n      newId: newId\n    });\n\n    var gfx = this.getGraphics(element),\n        secondaryGfx = this.getGraphics(element, true);\n\n    this.remove(element);\n\n    element.id = newId;\n\n    this.add(element, gfx, secondaryGfx);\n  };\n\n  /**\n   * Update the graphical representation of an element.\n   *\n   * @param {ElementLike|string} filter The element or its ID.\n   * @param {SVGElement} gfx The new graphical representation.\n   * @param {boolean} [secondary=false] Whether to update the secondary graphical representation.\n   */\n  ElementRegistry.prototype.updateGraphics = function(filter, gfx, secondary) {\n    var id = filter.id || filter;\n\n    var container = this._elements[id];\n\n    if (secondary) {\n      container.secondaryGfx = gfx;\n    } else {\n      container.gfx = gfx;\n    }\n\n    if (gfx) {\n      attr$1(gfx, ELEMENT_ID, id);\n    }\n\n    return gfx;\n  };\n\n  /**\n   * Get the element with the given ID or graphical representation.\n   *\n   * @example\n   *\n   * ```javascript\n   * elementRegistry.get('SomeElementId_1');\n   *\n   * elementRegistry.get(gfx);\n   * ```\n   *\n   * @param {string|SVGElement} filter The elements ID or graphical representation.\n   *\n   * @return {ElementLike|undefined} The element.\n   */\n  ElementRegistry.prototype.get = function(filter) {\n    var id;\n\n    if (typeof filter === 'string') {\n      id = filter;\n    } else {\n      id = filter && attr$1(filter, ELEMENT_ID);\n    }\n\n    var container = this._elements[id];\n    return container && container.element;\n  };\n\n  /**\n   * Return all elements that match a given filter function.\n   *\n   * @param {ElementRegistryFilterCallback} fn The filter function.\n   *\n   * @return {ElementLike[]} The matching elements.\n   */\n  ElementRegistry.prototype.filter = function(fn) {\n\n    var filtered = [];\n\n    this.forEach(function(element, gfx) {\n      if (fn(element, gfx)) {\n        filtered.push(element);\n      }\n    });\n\n    return filtered;\n  };\n\n  /**\n   * Return the first element that matches the given filter function.\n   *\n   * @param {ElementRegistryFilterCallback} fn The filter function.\n   *\n   * @return {ElementLike|undefined} The matching element.\n   */\n  ElementRegistry.prototype.find = function(fn) {\n    var map = this._elements,\n        keys = Object.keys(map);\n\n    for (var i = 0; i < keys.length; i++) {\n      var id = keys[i],\n          container = map[id],\n          element = container.element,\n          gfx = container.gfx;\n\n      if (fn(element, gfx)) {\n        return element;\n      }\n    }\n  };\n\n  /**\n   * Get all elements.\n   *\n   * @return {ElementLike[]} All elements.\n   */\n  ElementRegistry.prototype.getAll = function() {\n    return this.filter(function(e) { return e; });\n  };\n\n  /**\n   * Execute a given function for each element.\n   *\n   * @param {ElementRegistryForEachCallback} fn The function to execute.\n   */\n  ElementRegistry.prototype.forEach = function(fn) {\n\n    var map = this._elements;\n\n    Object.keys(map).forEach(function(id) {\n      var container = map[id],\n          element = container.element,\n          gfx = container.gfx;\n\n      return fn(element, gfx);\n    });\n  };\n\n  /**\n   * Return the graphical representation of an element.\n   *\n   * @example\n   *\n   * ```javascript\n   * elementRegistry.getGraphics('SomeElementId_1');\n   *\n   * elementRegistry.getGraphics(rootElement); // <g ...>\n   *\n   * elementRegistry.getGraphics(rootElement, true); // <svg ...>\n   * ```\n   *\n   * @param {ElementLike|string} filter The element or its ID.\n   * @param {boolean} [secondary=false] Whether to return the secondary graphical representation.\n   *\n   * @return {SVGElement} The graphical representation.\n   */\n  ElementRegistry.prototype.getGraphics = function(filter, secondary) {\n    var id = filter.id || filter;\n\n    var container = this._elements[id];\n    return container && (secondary ? container.secondaryGfx : container.gfx);\n  };\n\n  /**\n   * Validate an ID and throw an error if invalid.\n   *\n   * @param {string} id\n   *\n   * @throws {Error} Error indicating that the ID is invalid or already assigned.\n   */\n  ElementRegistry.prototype._validateId = function(id) {\n    if (!id) {\n      throw new Error('element must have an id');\n    }\n\n    if (this._elements[id]) {\n      throw new Error('element with id ' + id + ' already added');\n    }\n  };\n\n  var objectRefs = {exports: {}};\n\n  var collection = {};\n\n  /**\n   * An empty collection stub. Use {@link RefsCollection.extend} to extend a\n   * collection with ref semantics.\n   *\n   * @class RefsCollection\n   */\n\n  /**\n   * Extends a collection with {@link Refs} aware methods\n   *\n   * @memberof RefsCollection\n   * @static\n   *\n   * @param  {Array<Object>} collection\n   * @param  {Refs} refs instance\n   * @param  {Object} property represented by the collection\n   * @param  {Object} target object the collection is attached to\n   *\n   * @return {RefsCollection<Object>} the extended array\n   */\n  function extend(collection, refs, property, target) {\n\n    var inverseProperty = property.inverse;\n\n    /**\n     * Removes the given element from the array and returns it.\n     *\n     * @method RefsCollection#remove\n     *\n     * @param {Object} element the element to remove\n     */\n    Object.defineProperty(collection, 'remove', {\n      value: function(element) {\n        var idx = this.indexOf(element);\n        if (idx !== -1) {\n          this.splice(idx, 1);\n\n          // unset inverse\n          refs.unset(element, inverseProperty, target);\n        }\n\n        return element;\n      }\n    });\n\n    /**\n     * Returns true if the collection contains the given element\n     *\n     * @method RefsCollection#contains\n     *\n     * @param {Object} element the element to check for\n     */\n    Object.defineProperty(collection, 'contains', {\n      value: function(element) {\n        return this.indexOf(element) !== -1;\n      }\n    });\n\n    /**\n     * Adds an element to the array, unless it exists already (set semantics).\n     *\n     * @method RefsCollection#add\n     *\n     * @param {Object} element the element to add\n     * @param {Number} optional index to add element to\n     *                 (possibly moving other elements around)\n     */\n    Object.defineProperty(collection, 'add', {\n      value: function(element, idx) {\n\n        var currentIdx = this.indexOf(element);\n\n        if (typeof idx === 'undefined') {\n\n          if (currentIdx !== -1) {\n            // element already in collection (!)\n            return;\n          }\n\n          // add to end of array, as no idx is specified\n          idx = this.length;\n        }\n\n        // handle already in collection\n        if (currentIdx !== -1) {\n\n          // remove element from currentIdx\n          this.splice(currentIdx, 1);\n        }\n\n        // add element at idx\n        this.splice(idx, 0, element);\n\n        if (currentIdx === -1) {\n          // set inverse, unless element was\n          // in collection already\n          refs.set(element, inverseProperty, target);\n        }\n      }\n    });\n\n    // a simple marker, identifying this element\n    // as being a refs collection\n    Object.defineProperty(collection, '__refs_collection', {\n      value: true\n    });\n\n    return collection;\n  }\n\n\n  function isExtended(collection) {\n    return collection.__refs_collection === true;\n  }\n\n  collection.extend = extend;\n\n  collection.isExtended = isExtended;\n\n  var Collection = collection;\n\n  function hasOwnProperty$1(e, property) {\n    return Object.prototype.hasOwnProperty.call(e, property.name || property);\n  }\n\n  function defineCollectionProperty(ref, property, target) {\n\n    var collection = Collection.extend(target[property.name] || [], ref, property, target);\n\n    Object.defineProperty(target, property.name, {\n      enumerable: property.enumerable,\n      value: collection\n    });\n\n    if (collection.length) {\n\n      collection.forEach(function(o) {\n        ref.set(o, property.inverse, target);\n      });\n    }\n  }\n\n\n  function defineProperty$1(ref, property, target) {\n\n    var inverseProperty = property.inverse;\n\n    var _value = target[property.name];\n\n    Object.defineProperty(target, property.name, {\n      configurable: property.configurable,\n      enumerable: property.enumerable,\n\n      get: function() {\n        return _value;\n      },\n\n      set: function(value) {\n\n        // return if we already performed all changes\n        if (value === _value) {\n          return;\n        }\n\n        var old = _value;\n\n        // temporary set null\n        _value = null;\n\n        if (old) {\n          ref.unset(old, inverseProperty, target);\n        }\n\n        // set new value\n        _value = value;\n\n        // set inverse value\n        ref.set(_value, inverseProperty, target);\n      }\n    });\n\n  }\n\n  /**\n   * Creates a new references object defining two inversly related\n   * attribute descriptors a and b.\n   *\n   * <p>\n   *   When bound to an object using {@link Refs#bind} the references\n   *   get activated and ensure that add and remove operations are applied\n   *   reversely, too.\n   * </p>\n   *\n   * <p>\n   *   For attributes represented as collections {@link Refs} provides the\n   *   {@link RefsCollection#add}, {@link RefsCollection#remove} and {@link RefsCollection#contains} extensions\n   *   that must be used to properly hook into the inverse change mechanism.\n   * </p>\n   *\n   * @class Refs\n   *\n   * @classdesc A bi-directional reference between two attributes.\n   *\n   * @param {Refs.AttributeDescriptor} a property descriptor\n   * @param {Refs.AttributeDescriptor} b property descriptor\n   *\n   * @example\n   *\n   * var refs = Refs({ name: 'wheels', collection: true, enumerable: true }, { name: 'car' });\n   *\n   * var car = { name: 'toyota' };\n   * var wheels = [{ pos: 'front-left' }, { pos: 'front-right' }];\n   *\n   * refs.bind(car, 'wheels');\n   *\n   * car.wheels // []\n   * car.wheels.add(wheels[0]);\n   * car.wheels.add(wheels[1]);\n   *\n   * car.wheels // [{ pos: 'front-left' }, { pos: 'front-right' }]\n   *\n   * wheels[0].car // { name: 'toyota' };\n   * car.wheels.remove(wheels[0]);\n   *\n   * wheels[0].car // undefined\n   */\n  function Refs$1(a, b) {\n\n    if (!(this instanceof Refs$1)) {\n      return new Refs$1(a, b);\n    }\n\n    // link\n    a.inverse = b;\n    b.inverse = a;\n\n    this.props = {};\n    this.props[a.name] = a;\n    this.props[b.name] = b;\n  }\n\n  /**\n   * Binds one side of a bi-directional reference to a\n   * target object.\n   *\n   * @memberOf Refs\n   *\n   * @param  {Object} target\n   * @param  {String} property\n   */\n  Refs$1.prototype.bind = function(target, property) {\n    if (typeof property === 'string') {\n      if (!this.props[property]) {\n        throw new Error('no property <' + property + '> in ref');\n      }\n      property = this.props[property];\n    }\n\n    if (property.collection) {\n      defineCollectionProperty(this, property, target);\n    } else {\n      defineProperty$1(this, property, target);\n    }\n  };\n\n  Refs$1.prototype.ensureRefsCollection = function(target, property) {\n\n    var collection = target[property.name];\n\n    if (!Collection.isExtended(collection)) {\n      defineCollectionProperty(this, property, target);\n    }\n\n    return collection;\n  };\n\n  Refs$1.prototype.ensureBound = function(target, property) {\n    if (!hasOwnProperty$1(target, property)) {\n      this.bind(target, property);\n    }\n  };\n\n  Refs$1.prototype.unset = function(target, property, value) {\n\n    if (target) {\n      this.ensureBound(target, property);\n\n      if (property.collection) {\n        this.ensureRefsCollection(target, property).remove(value);\n      } else {\n        target[property.name] = undefined;\n      }\n    }\n  };\n\n  Refs$1.prototype.set = function(target, property, value) {\n\n    if (target) {\n      this.ensureBound(target, property);\n\n      if (property.collection) {\n        this.ensureRefsCollection(target, property).add(value);\n      } else {\n        target[property.name] = value;\n      }\n    }\n  };\n\n  var refs = Refs$1;\n\n  objectRefs.exports = refs;\n\n  objectRefs.exports.Collection = collection;\n\n  var objectRefsExports = objectRefs.exports;\n  var Refs = /*@__PURE__*/getDefaultExportFromCjs(objectRefsExports);\n\n  var parentRefs = new Refs({ name: 'children', enumerable: true, collection: true }, { name: 'parent' }),\n      labelRefs = new Refs({ name: 'labels', enumerable: true, collection: true }, { name: 'labelTarget' }),\n      attacherRefs = new Refs({ name: 'attachers', collection: true }, { name: 'host' }),\n      outgoingRefs = new Refs({ name: 'outgoing', collection: true }, { name: 'source' }),\n      incomingRefs = new Refs({ name: 'incoming', collection: true }, { name: 'target' });\n\n  /**\n   * @typedef {import('./Types').Element} Element\n   * @typedef {import('./Types').Shape} Shape\n   * @typedef {import('./Types').Root} Root\n   * @typedef {import('./Types').Label} Label\n   * @typedef {import('./Types').Connection} Connection\n   */\n\n  /**\n   * The basic graphical representation\n   *\n   * @class\n   * @constructor\n   */\n  function ElementImpl() {\n\n    /**\n     * The object that backs up the shape\n     *\n     * @name Element#businessObject\n     * @type Object\n     */\n    Object.defineProperty(this, 'businessObject', {\n      writable: true\n    });\n\n\n    /**\n     * Single label support, will mapped to multi label array\n     *\n     * @name Element#label\n     * @type Object\n     */\n    Object.defineProperty(this, 'label', {\n      get: function() {\n        return this.labels[0];\n      },\n      set: function(newLabel) {\n\n        var label = this.label,\n            labels = this.labels;\n\n        if (!newLabel && label) {\n          labels.remove(label);\n        } else {\n          labels.add(newLabel, 0);\n        }\n      }\n    });\n\n    /**\n     * The parent shape\n     *\n     * @name Element#parent\n     * @type Shape\n     */\n    parentRefs.bind(this, 'parent');\n\n    /**\n     * The list of labels\n     *\n     * @name Element#labels\n     * @type Label\n     */\n    labelRefs.bind(this, 'labels');\n\n    /**\n     * The list of outgoing connections\n     *\n     * @name Element#outgoing\n     * @type Array<Connection>\n     */\n    outgoingRefs.bind(this, 'outgoing');\n\n    /**\n     * The list of incoming connections\n     *\n     * @name Element#incoming\n     * @type Array<Connection>\n     */\n    incomingRefs.bind(this, 'incoming');\n  }\n\n\n  /**\n   * A graphical object\n   *\n   * @class\n   * @constructor\n   *\n   * @extends ElementImpl\n   */\n  function ShapeImpl() {\n    ElementImpl.call(this);\n\n    /**\n     * Indicates frame shapes\n     *\n     * @name ShapeImpl#isFrame\n     * @type boolean\n     */\n\n    /**\n     * The list of children\n     *\n     * @name ShapeImpl#children\n     * @type Element[]\n     */\n    parentRefs.bind(this, 'children');\n\n    /**\n     * @name ShapeImpl#host\n     * @type Shape\n     */\n    attacherRefs.bind(this, 'host');\n\n    /**\n     * @name ShapeImpl#attachers\n     * @type Shape\n     */\n    attacherRefs.bind(this, 'attachers');\n  }\n\n  e(ShapeImpl, ElementImpl);\n\n\n  /**\n   * A root graphical object\n   *\n   * @class\n   * @constructor\n   *\n   * @extends ElementImpl\n   */\n  function RootImpl() {\n    ElementImpl.call(this);\n\n    /**\n     * The list of children\n     *\n     * @name RootImpl#children\n     * @type Element[]\n     */\n    parentRefs.bind(this, 'children');\n  }\n\n  e(RootImpl, ShapeImpl);\n\n\n  /**\n   * A label for an element\n   *\n   * @class\n   * @constructor\n   *\n   * @extends ShapeImpl\n   */\n  function LabelImpl() {\n    ShapeImpl.call(this);\n\n    /**\n     * The labeled element\n     *\n     * @name LabelImpl#labelTarget\n     * @type Element\n     */\n    labelRefs.bind(this, 'labelTarget');\n  }\n\n  e(LabelImpl, ShapeImpl);\n\n\n  /**\n   * A connection between two elements\n   *\n   * @class\n   * @constructor\n   *\n   * @extends ElementImpl\n   */\n  function ConnectionImpl() {\n    ElementImpl.call(this);\n\n    /**\n     * The element this connection originates from\n     *\n     * @name ConnectionImpl#source\n     * @type Element\n     */\n    outgoingRefs.bind(this, 'source');\n\n    /**\n     * The element this connection points to\n     *\n     * @name ConnectionImpl#target\n     * @type Element\n     */\n    incomingRefs.bind(this, 'target');\n  }\n\n  e(ConnectionImpl, ElementImpl);\n\n\n  var types$6 = {\n    connection: ConnectionImpl,\n    shape: ShapeImpl,\n    label: LabelImpl,\n    root: RootImpl\n  };\n\n  /**\n   * Creates a root element.\n   *\n   * @overlord\n   *\n   * @example\n   *\n   * ```javascript\n   * import * as Model from 'diagram-js/lib/model';\n   *\n   * const root = Model.create('root', {\n   *   x: 100,\n   *   y: 100,\n   *   width: 100,\n   *   height: 100\n   * });\n   * ```\n   *\n   * @param {'root'} type\n   * @param {any} [attrs]\n   *\n   * @return {Root}\n   */\n\n  /**\n   * Creates a connection.\n   *\n   * @overlord\n   *\n   * @example\n   *\n   * ```javascript\n   * import * as Model from 'diagram-js/lib/model';\n   *\n   * const connection = Model.create('connection', {\n   *   waypoints: [\n   *     { x: 100, y: 100 },\n   *     { x: 200, y: 100 }\n   *   ]\n   * });\n   * ```\n   *\n   * @param {'connection'} type\n   * @param {any} [attrs]\n   *\n   * @return {Connection}\n   */\n\n  /**\n   * Creates a shape.\n   *\n   * @overlord\n   *\n   * @example\n   *\n   * ```javascript\n   * import * as Model from 'diagram-js/lib/model';\n   *\n   * const shape = Model.create('shape', {\n   *   x: 100,\n   *   y: 100,\n   *   width: 100,\n   *   height: 100\n   * });\n   * ```\n   *\n   * @param {'shape'} type\n   * @param {any} [attrs]\n   *\n   * @return {Shape}\n   */\n\n  /**\n   * Creates a label.\n   *\n   * @example\n   *\n   * ```javascript\n   * import * as Model from 'diagram-js/lib/model';\n   *\n   * const label = Model.create('label', {\n   *   x: 100,\n   *   y: 100,\n   *   width: 100,\n   *   height: 100,\n   *   labelTarget: shape\n   * });\n   * ```\n   *\n   * @param {'label'} type\n   * @param {Object} [attrs]\n   *\n   * @return {Label}\n   */\n  function create(type, attrs) {\n    var Type = types$6[type];\n    if (!Type) {\n      throw new Error('unknown type: <' + type + '>');\n    }\n    return assign$1(new Type(), attrs);\n  }\n\n  /**\n   * @typedef {import('../model/Types').Element} Element\n   * @typedef {import('../model/Types').Connection} Connection\n   * @typedef {import('../model/Types').Label} Label\n   * @typedef {import('../model/Types').Root} Root\n   * @typedef {import('../model/Types').Shape} Shape\n   */\n\n  /**\n   * A factory for model elements.\n   *\n   * @template {Connection} [T=Connection]\n   * @template {Label} [U=Label]\n   * @template {Root} [V=Root]\n   * @template {Shape} [W=Shape]\n   */\n  function ElementFactory() {\n    this._uid = 12;\n  }\n\n  /**\n   * Create a root element.\n   *\n   * @param {Partial<Root>} [attrs]\n   *\n   * @return {V} The created root element.\n   */\n  ElementFactory.prototype.createRoot = function(attrs) {\n    return this.create('root', attrs);\n  };\n\n  /**\n   * Create a label.\n   *\n   * @param {Partial<Label>} [attrs]\n   *\n   * @return {U} The created label.\n   */\n  ElementFactory.prototype.createLabel = function(attrs) {\n    return this.create('label', attrs);\n  };\n\n  /**\n   * Create a shape.\n   *\n   * @param {Partial<Shape>} [attrs]\n   *\n   * @return {W} The created shape.\n   */\n  ElementFactory.prototype.createShape = function(attrs) {\n    return this.create('shape', attrs);\n  };\n\n  /**\n   * Create a connection.\n   *\n   * @param {Partial<Connection>} [attrs]\n   *\n   * @return {T} The created connection.\n   */\n  ElementFactory.prototype.createConnection = function(attrs) {\n    return this.create('connection', attrs);\n  };\n\n  /**\n   * Create a root element.\n   *\n   * @overlord\n   * @param {'root'} type\n   * @param {Partial<Root>} [attrs]\n   * @return {V}\n   */\n  /**\n   * Create a shape.\n   *\n   * @overlord\n   * @param {'shape'} type\n   * @param {Partial<Shape>} [attrs]\n   * @return {W}\n   */\n  /**\n   * Create a connection.\n   *\n   * @overlord\n   * @param {'connection'} type\n   * @param {Partial<Connection>} [attrs]\n   * @return {T}\n   */\n  /**\n   * Create a label.\n   *\n   * @param {'label'} type\n   * @param {Partial<Label>} [attrs]\n   * @return {U}\n   */\n  ElementFactory.prototype.create = function(type, attrs) {\n\n    attrs = assign$1({}, attrs || {});\n\n    if (!attrs.id) {\n      attrs.id = type + '_' + (this._uid++);\n    }\n\n    return create(type, attrs);\n  };\n\n  var FN_REF = '__fn';\n\n  var DEFAULT_PRIORITY$1 = 1000;\n\n  var slice = Array.prototype.slice;\n\n  /**\n   * @typedef { {\n   *   stopPropagation(): void;\n   *   preventDefault(): void;\n   *   cancelBubble: boolean;\n   *   defaultPrevented: boolean;\n   *   returnValue: any;\n   * } } Event\n   */\n\n  /**\n   * @template E\n   *\n   * @typedef { (event: E & Event, ...any) => any } EventBusEventCallback\n   */\n\n  /**\n   * @typedef { {\n   *  priority: number;\n   *  next: EventBusListener | null;\n   *  callback: EventBusEventCallback<any>;\n   * } } EventBusListener\n   */\n\n  /**\n   * A general purpose event bus.\n   *\n   * This component is used to communicate across a diagram instance.\n   * Other parts of a diagram can use it to listen to and broadcast events.\n   *\n   *\n   * ## Registering for Events\n   *\n   * The event bus provides the {@link EventBus#on} and {@link EventBus#once}\n   * methods to register for events. {@link EventBus#off} can be used to\n   * remove event registrations. Listeners receive an instance of {@link Event}\n   * as the first argument. It allows them to hook into the event execution.\n   *\n   * ```javascript\n   *\n   * // listen for event\n   * eventBus.on('foo', function(event) {\n   *\n   *   // access event type\n   *   event.type; // 'foo'\n   *\n   *   // stop propagation to other listeners\n   *   event.stopPropagation();\n   *\n   *   // prevent event default\n   *   event.preventDefault();\n   * });\n   *\n   * // listen for event with custom payload\n   * eventBus.on('bar', function(event, payload) {\n   *   console.log(payload);\n   * });\n   *\n   * // listen for event returning value\n   * eventBus.on('foobar', function(event) {\n   *\n   *   // stop event propagation + prevent default\n   *   return false;\n   *\n   *   // stop event propagation + return custom result\n   *   return {\n   *     complex: 'listening result'\n   *   };\n   * });\n   *\n   *\n   * // listen with custom priority (default=1000, higher is better)\n   * eventBus.on('priorityfoo', 1500, function(event) {\n   *   console.log('invoked first!');\n   * });\n   *\n   *\n   * // listen for event and pass the context (`this`)\n   * eventBus.on('foobar', function(event) {\n   *   this.foo();\n   * }, this);\n   * ```\n   *\n   *\n   * ## Emitting Events\n   *\n   * Events can be emitted via the event bus using {@link EventBus#fire}.\n   *\n   * ```javascript\n   *\n   * // false indicates that the default action\n   * // was prevented by listeners\n   * if (eventBus.fire('foo') === false) {\n   *   console.log('default has been prevented!');\n   * };\n   *\n   *\n   * // custom args + return value listener\n   * eventBus.on('sum', function(event, a, b) {\n   *   return a + b;\n   * });\n   *\n   * // you can pass custom arguments + retrieve result values.\n   * var sum = eventBus.fire('sum', 1, 2);\n   * console.log(sum); // 3\n   * ```\n   */\n  function EventBus() {\n\n    /**\n     * @type { Record<string, EventBusListener> }\n     */\n    this._listeners = {};\n\n    // cleanup on destroy on lowest priority to allow\n    // message passing until the bitter end\n    this.on('diagram.destroy', 1, this._destroy, this);\n  }\n\n\n  /**\n   * Register an event listener for events with the given name.\n   *\n   * The callback will be invoked with `event, ...additionalArguments`\n   * that have been passed to {@link EventBus#fire}.\n   *\n   * Returning false from a listener will prevent the events default action\n   * (if any is specified). To stop an event from being processed further in\n   * other listeners execute {@link Event#stopPropagation}.\n   *\n   * Returning anything but `undefined` from a listener will stop the listener propagation.\n   *\n   * @template T\n   *\n   * @param {string|string[]} events to subscribe to\n   * @param {number} [priority=1000] listen priority\n   * @param {EventBusEventCallback<T>} callback\n   * @param {any} [that] callback context\n   */\n  EventBus.prototype.on = function(events, priority, callback, that) {\n\n    events = isArray$2(events) ? events : [ events ];\n\n    if (isFunction(priority)) {\n      that = callback;\n      callback = priority;\n      priority = DEFAULT_PRIORITY$1;\n    }\n\n    if (!isNumber(priority)) {\n      throw new Error('priority must be a number');\n    }\n\n    var actualCallback = callback;\n\n    if (that) {\n      actualCallback = bind$2(callback, that);\n\n      // make sure we remember and are able to remove\n      // bound callbacks via {@link #off} using the original\n      // callback\n      actualCallback[FN_REF] = callback[FN_REF] || callback;\n    }\n\n    var self = this;\n\n    events.forEach(function(e) {\n      self._addListener(e, {\n        priority: priority,\n        callback: actualCallback,\n        next: null\n      });\n    });\n  };\n\n  /**\n   * Register an event listener that is called only once.\n   *\n   * @template T\n   *\n   * @param {string|string[]} events to subscribe to\n   * @param {number} [priority=1000] the listen priority\n   * @param {EventBusEventCallback<T>} callback\n   * @param {any} [that] callback context\n   */\n  EventBus.prototype.once = function(events, priority, callback, that) {\n    var self = this;\n\n    if (isFunction(priority)) {\n      that = callback;\n      callback = priority;\n      priority = DEFAULT_PRIORITY$1;\n    }\n\n    if (!isNumber(priority)) {\n      throw new Error('priority must be a number');\n    }\n\n    function wrappedCallback() {\n      wrappedCallback.__isTomb = true;\n\n      var result = callback.apply(that, arguments);\n\n      self.off(events, wrappedCallback);\n\n      return result;\n    }\n\n    // make sure we remember and are able to remove\n    // bound callbacks via {@link #off} using the original\n    // callback\n    wrappedCallback[FN_REF] = callback;\n\n    this.on(events, priority, wrappedCallback);\n  };\n\n\n  /**\n   * Removes event listeners by event and callback.\n   *\n   * If no callback is given, all listeners for a given event name are being removed.\n   *\n   * @param {string|string[]} events\n   * @param {EventBusEventCallback} [callback]\n   */\n  EventBus.prototype.off = function(events, callback) {\n\n    events = isArray$2(events) ? events : [ events ];\n\n    var self = this;\n\n    events.forEach(function(event) {\n      self._removeListener(event, callback);\n    });\n\n  };\n\n\n  /**\n   * Create an event recognized be the event bus.\n   *\n   * @param {Object} data Event data.\n   *\n   * @return {Event} An event that will be recognized by the event bus.\n   */\n  EventBus.prototype.createEvent = function(data) {\n    var event = new InternalEvent();\n\n    event.init(data);\n\n    return event;\n  };\n\n\n  /**\n   * Fires an event.\n   *\n   * @example\n   *\n   * ```javascript\n   * // fire event by name\n   * events.fire('foo');\n   *\n   * // fire event object with nested type\n   * var event = { type: 'foo' };\n   * events.fire(event);\n   *\n   * // fire event with explicit type\n   * var event = { x: 10, y: 20 };\n   * events.fire('element.moved', event);\n   *\n   * // pass additional arguments to the event\n   * events.on('foo', function(event, bar) {\n   *   alert(bar);\n   * });\n   *\n   * events.fire({ type: 'foo' }, 'I am bar!');\n   * ```\n   *\n   * @param {string} [type] event type\n   * @param {Object} [data] event or event data\n   * @param {...any} [args] additional arguments the callback will be called with.\n   *\n   * @return {any} The return value. Will be set to `false` if the default was prevented.\n   */\n  EventBus.prototype.fire = function(type, data) {\n    var event,\n        firstListener,\n        returnValue,\n        args;\n\n    args = slice.call(arguments);\n\n    if (typeof type === 'object') {\n      data = type;\n      type = data.type;\n    }\n\n    if (!type) {\n      throw new Error('no event type specified');\n    }\n\n    firstListener = this._listeners[type];\n\n    if (!firstListener) {\n      return;\n    }\n\n    // we make sure we fire instances of our home made\n    // events here. We wrap them only once, though\n    if (data instanceof InternalEvent) {\n\n      // we are fine, we alread have an event\n      event = data;\n    } else {\n      event = this.createEvent(data);\n    }\n\n    // ensure we pass the event as the first parameter\n    args[0] = event;\n\n    // original event type (in case we delegate)\n    var originalType = event.type;\n\n    // update event type before delegation\n    if (type !== originalType) {\n      event.type = type;\n    }\n\n    try {\n      returnValue = this._invokeListeners(event, args, firstListener);\n    } finally {\n\n      // reset event type after delegation\n      if (type !== originalType) {\n        event.type = originalType;\n      }\n    }\n\n    // set the return value to false if the event default\n    // got prevented and no other return value exists\n    if (returnValue === undefined && event.defaultPrevented) {\n      returnValue = false;\n    }\n\n    return returnValue;\n  };\n\n  /**\n   * Handle an error by firing an event.\n   *\n   * @param {Error} error The error to be handled.\n   *\n   * @return {boolean} Whether the error was handled.\n   */\n  EventBus.prototype.handleError = function(error) {\n    return this.fire('error', { error: error }) === false;\n  };\n\n\n  EventBus.prototype._destroy = function() {\n    this._listeners = {};\n  };\n\n  /**\n   * @param {Event} event\n   * @param {any[]} args\n   * @param {EventBusListener} listener\n   *\n   * @return {any}\n   */\n  EventBus.prototype._invokeListeners = function(event, args, listener) {\n\n    var returnValue;\n\n    while (listener) {\n\n      // handle stopped propagation\n      if (event.cancelBubble) {\n        break;\n      }\n\n      returnValue = this._invokeListener(event, args, listener);\n\n      listener = listener.next;\n    }\n\n    return returnValue;\n  };\n\n  /**\n   * @param {Event} event\n   * @param {any[]} args\n   * @param {EventBusListener} listener\n   *\n   * @return {any}\n   */\n  EventBus.prototype._invokeListener = function(event, args, listener) {\n\n    var returnValue;\n\n    if (listener.callback.__isTomb) {\n      return returnValue;\n    }\n\n    try {\n\n      // returning false prevents the default action\n      returnValue = invokeFunction(listener.callback, args);\n\n      // stop propagation on return value\n      if (returnValue !== undefined) {\n        event.returnValue = returnValue;\n        event.stopPropagation();\n      }\n\n      // prevent default on return false\n      if (returnValue === false) {\n        event.preventDefault();\n      }\n    } catch (error) {\n      if (!this.handleError(error)) {\n        console.error('unhandled error in event listener', error);\n\n        throw error;\n      }\n    }\n\n    return returnValue;\n  };\n\n  /**\n   * Add new listener with a certain priority to the list\n   * of listeners (for the given event).\n   *\n   * The semantics of listener registration / listener execution are\n   * first register, first serve: New listeners will always be inserted\n   * after existing listeners with the same priority.\n   *\n   * Example: Inserting two listeners with priority 1000 and 1300\n   *\n   *    * before: [ 1500, 1500, 1000, 1000 ]\n   *    * after: [ 1500, 1500, (new=1300), 1000, 1000, (new=1000) ]\n   *\n   * @param {string} event\n   * @param {EventBusListener} newListener\n   */\n  EventBus.prototype._addListener = function(event, newListener) {\n\n    var listener = this._getListeners(event),\n        previousListener;\n\n    // no prior listeners\n    if (!listener) {\n      this._setListeners(event, newListener);\n\n      return;\n    }\n\n    // ensure we order listeners by priority from\n    // 0 (high) to n > 0 (low)\n    while (listener) {\n\n      if (listener.priority < newListener.priority) {\n\n        newListener.next = listener;\n\n        if (previousListener) {\n          previousListener.next = newListener;\n        } else {\n          this._setListeners(event, newListener);\n        }\n\n        return;\n      }\n\n      previousListener = listener;\n      listener = listener.next;\n    }\n\n    // add new listener to back\n    previousListener.next = newListener;\n  };\n\n\n  /**\n   * @param {string} name\n   *\n   * @return {EventBusListener}\n   */\n  EventBus.prototype._getListeners = function(name) {\n    return this._listeners[name];\n  };\n\n  /**\n   * @param {string} name\n   * @param {EventBusListener} listener\n   */\n  EventBus.prototype._setListeners = function(name, listener) {\n    this._listeners[name] = listener;\n  };\n\n  EventBus.prototype._removeListener = function(event, callback) {\n\n    var listener = this._getListeners(event),\n        nextListener,\n        previousListener,\n        listenerCallback;\n\n    if (!callback) {\n\n      // clear listeners\n      this._setListeners(event, null);\n\n      return;\n    }\n\n    while (listener) {\n\n      nextListener = listener.next;\n\n      listenerCallback = listener.callback;\n\n      if (listenerCallback === callback || listenerCallback[FN_REF] === callback) {\n        if (previousListener) {\n          previousListener.next = nextListener;\n        } else {\n\n          // new first listener\n          this._setListeners(event, nextListener);\n        }\n      }\n\n      previousListener = listener;\n      listener = nextListener;\n    }\n  };\n\n  /**\n   * A event that is emitted via the event bus.\n   */\n  function InternalEvent() { }\n\n  InternalEvent.prototype.stopPropagation = function() {\n    this.cancelBubble = true;\n  };\n\n  InternalEvent.prototype.preventDefault = function() {\n    this.defaultPrevented = true;\n  };\n\n  InternalEvent.prototype.init = function(data) {\n    assign$1(this, data || {});\n  };\n\n\n  /**\n   * Invoke function. Be fast...\n   *\n   * @param {Function} fn\n   * @param {any[]} args\n   *\n   * @return {any}\n   */\n  function invokeFunction(fn, args) {\n    return fn.apply(null, args);\n  }\n\n  /**\n   * SVGs for elements are generated by the {@link GraphicsFactory}.\n   *\n   * This utility gives quick access to the important semantic\n   * parts of an element.\n   */\n\n  /**\n   * Returns the visual part of a diagram element.\n   *\n   * @param {SVGElement} gfx\n   *\n   * @return {SVGElement}\n   */\n  function getVisual(gfx) {\n    return gfx.childNodes[0];\n  }\n\n  /**\n   * Returns the children for a given diagram element.\n   *\n   * @param {SVGElement} gfx\n   * @return {SVGElement}\n   */\n  function getChildren(gfx) {\n    return gfx.parentNode.childNodes[1];\n  }\n\n  /**\n   * @typedef {import('./Types').ConnectionLike} ConnectionLike\n   * @typedef {import('./Types').ElementLike} ElementLike\n   * @typedef {import('./Types').ShapeLike} ShapeLike\n   *\n   * @typedef {import('./ElementRegistry').default} ElementRegistry\n   * @typedef {import('./EventBus').default} EventBus\n   */\n\n  /**\n   * A factory that creates graphical elements.\n   *\n   * @param {EventBus} eventBus\n   * @param {ElementRegistry} elementRegistry\n   */\n  function GraphicsFactory(eventBus, elementRegistry) {\n    this._eventBus = eventBus;\n    this._elementRegistry = elementRegistry;\n  }\n\n  GraphicsFactory.$inject = [ 'eventBus' , 'elementRegistry' ];\n\n  /**\n   * @param { { parent?: any } } element\n   * @return {SVGElement}\n   */\n  GraphicsFactory.prototype._getChildrenContainer = function(element) {\n\n    var gfx = this._elementRegistry.getGraphics(element);\n\n    var childrenGfx;\n\n    // root element\n    if (!element.parent) {\n      childrenGfx = gfx;\n    } else {\n      childrenGfx = getChildren(gfx);\n      if (!childrenGfx) {\n        childrenGfx = create$1('g');\n        classes$1(childrenGfx).add('djs-children');\n\n        append(gfx.parentNode, childrenGfx);\n      }\n    }\n\n    return childrenGfx;\n  };\n\n  /**\n   * Clears the graphical representation of the element and returns the\n   * cleared visual (the <g class=\"djs-visual\" /> element).\n   */\n  GraphicsFactory.prototype._clear = function(gfx) {\n    var visual = getVisual(gfx);\n\n    clear(visual);\n\n    return visual;\n  };\n\n  /**\n   * Creates a gfx container for shapes and connections\n   *\n   * The layout is as follows:\n   *\n   * <g class=\"djs-group\">\n   *\n   *   <!-- the gfx -->\n   *   <g class=\"djs-element djs-(shape|connection|frame)\">\n   *     <g class=\"djs-visual\">\n   *       <!-- the renderer draws in here -->\n   *     </g>\n   *\n   *     <!-- extensions (overlays, click box, ...) goes here\n   *   </g>\n   *\n   *   <!-- the gfx child nodes -->\n   *   <g class=\"djs-children\"></g>\n   * </g>\n   *\n   * @param {string} type the type of the element, i.e. shape | connection\n   * @param {SVGElement} childrenGfx\n   * @param {number} [parentIndex] position to create container in parent\n   * @param {boolean} [isFrame] is frame element\n   *\n   * @return {SVGElement}\n   */\n  GraphicsFactory.prototype._createContainer = function(\n      type, childrenGfx, parentIndex, isFrame\n  ) {\n    var outerGfx = create$1('g');\n    classes$1(outerGfx).add('djs-group');\n\n    // insert node at position\n    if (typeof parentIndex !== 'undefined') {\n      prependTo(outerGfx, childrenGfx, childrenGfx.childNodes[parentIndex]);\n    } else {\n      append(childrenGfx, outerGfx);\n    }\n\n    var gfx = create$1('g');\n    classes$1(gfx).add('djs-element');\n    classes$1(gfx).add('djs-' + type);\n\n    if (isFrame) {\n      classes$1(gfx).add('djs-frame');\n    }\n\n    append(outerGfx, gfx);\n\n    // create visual\n    var visual = create$1('g');\n    classes$1(visual).add('djs-visual');\n\n    append(gfx, visual);\n\n    return gfx;\n  };\n\n  /**\n   * Create a graphical element.\n   *\n   * @param { 'shape' | 'connection' | 'label' | 'root' } type The type of the element.\n   * @param {ElementLike} element The element.\n   * @param {number} [parentIndex] The index at which to add the graphical element to its parent's children.\n   *\n   * @return {SVGElement} The graphical element.\n   */\n  GraphicsFactory.prototype.create = function(type, element, parentIndex) {\n    var childrenGfx = this._getChildrenContainer(element.parent);\n    return this._createContainer(type, childrenGfx, parentIndex, isFrameElement(element));\n  };\n\n  /**\n   * Update the containments of the given elements.\n   *\n   * @param {ElementLike[]} elements The elements.\n   */\n  GraphicsFactory.prototype.updateContainments = function(elements) {\n\n    var self = this,\n        elementRegistry = this._elementRegistry,\n        parents;\n\n    parents = reduce(elements, function(map, e) {\n\n      if (e.parent) {\n        map[e.parent.id] = e.parent;\n      }\n\n      return map;\n    }, {});\n\n    // update all parents of changed and reorganized their children\n    // in the correct order (as indicated in our model)\n    forEach$1(parents, function(parent) {\n\n      var children = parent.children;\n\n      if (!children) {\n        return;\n      }\n\n      var childrenGfx = self._getChildrenContainer(parent);\n\n      forEach$1(children.slice().reverse(), function(child) {\n        var childGfx = elementRegistry.getGraphics(child);\n\n        prependTo(childGfx.parentNode, childrenGfx);\n      });\n    });\n  };\n\n  /**\n   * Draw a shape.\n   *\n   * @param {SVGElement} visual The graphical element.\n   * @param {ShapeLike} element The shape.\n   *\n   * @return {SVGElement}\n   */\n  GraphicsFactory.prototype.drawShape = function(visual, element) {\n    var eventBus = this._eventBus;\n\n    return eventBus.fire('render.shape', { gfx: visual, element: element });\n  };\n\n  /**\n   * Get the path of a shape.\n   *\n   * @param {ShapeLike} element The shape.\n   *\n   * @return {string} The path of the shape.\n   */\n  GraphicsFactory.prototype.getShapePath = function(element) {\n    var eventBus = this._eventBus;\n\n    return eventBus.fire('render.getShapePath', element);\n  };\n\n  /**\n   * Draw a connection.\n   *\n   * @param {SVGElement} visual The graphical element.\n   * @param {ConnectionLike} element The connection.\n   *\n   * @return {SVGElement}\n   */\n  GraphicsFactory.prototype.drawConnection = function(visual, element) {\n    var eventBus = this._eventBus;\n\n    return eventBus.fire('render.connection', { gfx: visual, element: element });\n  };\n\n  /**\n   * Get the path of a connection.\n   *\n   * @param {ConnectionLike} connection The connection.\n   *\n   * @return {string} The path of the connection.\n   */\n  GraphicsFactory.prototype.getConnectionPath = function(connection) {\n    var eventBus = this._eventBus;\n\n    return eventBus.fire('render.getConnectionPath', connection);\n  };\n\n  /**\n   * Update an elements graphical representation.\n   *\n   * @param {'shape'|'connection'} type\n   * @param {ElementLike} element\n   * @param {SVGElement} gfx\n   */\n  GraphicsFactory.prototype.update = function(type, element, gfx) {\n\n    // do NOT update root element\n    if (!element.parent) {\n      return;\n    }\n\n    var visual = this._clear(gfx);\n\n    // redraw\n    if (type === 'shape') {\n      this.drawShape(visual, element);\n\n      // update positioning\n      translate$1(gfx, element.x, element.y);\n    } else\n    if (type === 'connection') {\n      this.drawConnection(visual, element);\n    } else {\n      throw new Error('unknown type: ' + type);\n    }\n\n    if (element.hidden) {\n      attr$1(gfx, 'display', 'none');\n    } else {\n      attr$1(gfx, 'display', 'block');\n    }\n  };\n\n  /**\n   * Remove a graphical element.\n   *\n   * @param {ElementLike} element The element.\n   */\n  GraphicsFactory.prototype.remove = function(element) {\n    var gfx = this._elementRegistry.getGraphics(element);\n\n    // remove\n    remove$2(gfx.parentNode);\n  };\n\n\n  // helpers //////////\n\n  function prependTo(newNode, parentNode, siblingNode) {\n    var node = siblingNode || parentNode.firstChild;\n\n    // do not prepend node to itself to prevent IE from crashing\n    // https://github.com/bpmn-io/bpmn-js/issues/746\n    if (newNode === node) {\n      return;\n    }\n\n    parentNode.insertBefore(newNode, node);\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var CoreModule = {\n    __depends__: [ DrawModule ],\n    __init__: [ 'canvas' ],\n    canvas: [ 'type', Canvas ],\n    elementRegistry: [ 'type', ElementRegistry ],\n    elementFactory: [ 'type', ElementFactory ],\n    eventBus: [ 'type', EventBus ],\n    graphicsFactory: [ 'type', GraphicsFactory ]\n  };\n\n  /**\n   * @typedef {import('didi').InjectionContext} InjectionContext\n   * @typedef {import('didi').LocalsMap} LocalsMap\n   * @typedef {import('didi').ModuleDeclaration} ModuleDeclaration\n   *\n   * @typedef { {\n   *   modules?: ModuleDeclaration[];\n   * } & Record<string, any> } DiagramOptions\n   */\n\n  /**\n   * Bootstrap an injector from a list of modules, instantiating a number of default components\n   *\n   * @param {ModuleDeclaration[]} modules\n   *\n   * @return {Injector} a injector to use to access the components\n   */\n  function bootstrap(modules) {\n    var injector = new Injector(modules);\n\n    injector.init();\n\n    return injector;\n  }\n\n  /**\n   * Creates an injector from passed options.\n   *\n   * @param {DiagramOptions} [options]\n   *\n   * @return {Injector}\n   */\n  function createInjector(options) {\n\n    options = options || {};\n\n    /**\n     * @type { ModuleDeclaration }\n     */\n    var configModule = {\n      'config': [ 'value', options ]\n    };\n\n    var modules = [ configModule, CoreModule ].concat(options.modules || []);\n\n    return bootstrap(modules);\n  }\n\n\n  /**\n   * The main diagram-js entry point that bootstraps the diagram with the given\n   * configuration.\n   *\n   * To register extensions with the diagram, pass them as Array<Module> to the constructor.\n   *\n   * @class\n   * @constructor\n   *\n   * @example Creating a plug-in that logs whenever a shape is added to the canvas.\n   *\n   * ```javascript\n   * // plug-in implementation\n   * function MyLoggingPlugin(eventBus) {\n   *   eventBus.on('shape.added', function(event) {\n   *     console.log('shape ', event.shape, ' was added to the diagram');\n   *   });\n   * }\n   *\n   * // export as module\n   * export default {\n   *   __init__: [ 'myLoggingPlugin' ],\n   *     myLoggingPlugin: [ 'type', MyLoggingPlugin ]\n   * };\n   * ```\n   *\n   * Use the plug-in in a Diagram instance:\n   *\n   * ```javascript\n   * import MyLoggingModule from 'path-to-my-logging-plugin';\n   *\n   * var diagram = new Diagram({\n   *   modules: [\n   *     MyLoggingModule\n   *   ]\n   * });\n   *\n   * diagram.invoke([ 'canvas', function(canvas) {\n   *   // add shape to drawing canvas\n   *   canvas.addShape({ x: 10, y: 10 });\n   * });\n   *\n   * // 'shape ... was added to the diagram' logged to console\n   * ```\n   *\n   * @param {DiagramOptions} [options]\n   * @param {Injector} [injector] An (optional) injector to bootstrap the diagram with.\n   */\n  function Diagram(options, injector) {\n\n    this._injector = injector = injector || createInjector(options);\n\n    // API\n\n    /**\n     * Resolves a diagram service.\n     *\n     * @template T\n     *\n     * @param {string} name The name of the service to get.\n     * @param {boolean} [strict=true] If false, resolve missing services to null.\n     *\n     * @return {T|null}\n     */\n    this.get = injector.get;\n\n    /**\n     * Executes a function with its dependencies injected.\n     *\n     * @template T\n     *\n     * @param {Function} func function to be invoked\n     * @param {InjectionContext} [context] context of the invocation\n     * @param {LocalsMap} [locals] locals provided\n     *\n     * @return {T|null}\n     */\n    this.invoke = injector.invoke;\n\n    // init\n\n    // indicate via event\n\n\n    /**\n     * An event indicating that all plug-ins are loaded.\n     *\n     * Use this event to fire other events to interested plug-ins\n     *\n     * @memberOf Diagram\n     *\n     * @event diagram.init\n     *\n     * @example\n     *\n     * ```javascript\n     * eventBus.on('diagram.init', function() {\n     *   eventBus.fire('my-custom-event', { foo: 'BAR' });\n     * });\n     * ```\n     *\n     * @type {Object}\n     */\n    this.get('eventBus').fire('diagram.init');\n  }\n\n\n  /**\n   * Destroys the diagram\n   */\n  Diagram.prototype.destroy = function() {\n    this.get('eventBus').fire('diagram.destroy');\n  };\n\n  /**\n   * Clear the diagram, removing all contents.\n   */\n  Diagram.prototype.clear = function() {\n    this.get('eventBus').fire('diagram.clear');\n  };\n\n  /**\n   * Moddle base element.\n   */\n  function Base() { }\n\n  Base.prototype.get = function(name) {\n    return this.$model.properties.get(this, name);\n  };\n\n  Base.prototype.set = function(name, value) {\n    this.$model.properties.set(this, name, value);\n  };\n\n  /**\n   * A model element factory.\n   *\n   * @param {Moddle} model\n   * @param {Properties} properties\n   */\n  function Factory(model, properties) {\n    this.model = model;\n    this.properties = properties;\n  }\n\n\n  Factory.prototype.createType = function(descriptor) {\n\n    var model = this.model;\n\n    var props = this.properties,\n        prototype = Object.create(Base.prototype);\n\n    // initialize default values\n    forEach$1(descriptor.properties, function(p) {\n      if (!p.isMany && p.default !== undefined) {\n        prototype[p.name] = p.default;\n      }\n    });\n\n    props.defineModel(prototype, model);\n    props.defineDescriptor(prototype, descriptor);\n\n    var name = descriptor.ns.name;\n\n    /**\n     * The new type constructor\n     */\n    function ModdleElement(attrs) {\n      props.define(this, '$type', { value: name, enumerable: true });\n      props.define(this, '$attrs', { value: {} });\n      props.define(this, '$parent', { writable: true });\n\n      forEach$1(attrs, bind$2(function(val, key) {\n        this.set(key, val);\n      }, this));\n    }\n\n    ModdleElement.prototype = prototype;\n\n    ModdleElement.hasType = prototype.$instanceOf = this.model.hasType;\n\n    // static links\n    props.defineModel(ModdleElement, model);\n    props.defineDescriptor(ModdleElement, descriptor);\n\n    return ModdleElement;\n  };\n\n  /**\n   * Built-in moddle types\n   */\n  var BUILTINS = {\n    String: true,\n    Boolean: true,\n    Integer: true,\n    Real: true,\n    Element: true\n  };\n\n  /**\n   * Converters for built in types from string representations\n   */\n  var TYPE_CONVERTERS = {\n    String: function(s) { return s; },\n    Boolean: function(s) { return s === 'true'; },\n    Integer: function(s) { return parseInt(s, 10); },\n    Real: function(s) { return parseFloat(s); }\n  };\n\n  /**\n   * Convert a type to its real representation\n   */\n  function coerceType(type, value) {\n\n    var converter = TYPE_CONVERTERS[type];\n\n    if (converter) {\n      return converter(value);\n    } else {\n      return value;\n    }\n  }\n\n  /**\n   * Return whether the given type is built-in\n   */\n  function isBuiltIn(type) {\n    return !!BUILTINS[type];\n  }\n\n  /**\n   * Return whether the given type is simple\n   */\n  function isSimple(type) {\n    return !!TYPE_CONVERTERS[type];\n  }\n\n  /**\n   * Parses a namespaced attribute name of the form (ns:)localName to an object,\n   * given a default prefix to assume in case no explicit namespace is given.\n   *\n   * @param {String} name\n   * @param {String} [defaultPrefix] the default prefix to take, if none is present.\n   *\n   * @return {Object} the parsed name\n   */\n  function parseName(name, defaultPrefix) {\n    var parts = name.split(/:/),\n        localName, prefix;\n\n    // no prefix (i.e. only local name)\n    if (parts.length === 1) {\n      localName = name;\n      prefix = defaultPrefix;\n    } else\n\n    // prefix + local name\n    if (parts.length === 2) {\n      localName = parts[1];\n      prefix = parts[0];\n    } else {\n      throw new Error('expected <prefix:localName> or <localName>, got ' + name);\n    }\n\n    name = (prefix ? prefix + ':' : '') + localName;\n\n    return {\n      name: name,\n      prefix: prefix,\n      localName: localName\n    };\n  }\n\n  /**\n   * A utility to build element descriptors.\n   */\n  function DescriptorBuilder(nameNs) {\n    this.ns = nameNs;\n    this.name = nameNs.name;\n    this.allTypes = [];\n    this.allTypesByName = {};\n    this.properties = [];\n    this.propertiesByName = {};\n  }\n\n\n  DescriptorBuilder.prototype.build = function() {\n    return pick(this, [\n      'ns',\n      'name',\n      'allTypes',\n      'allTypesByName',\n      'properties',\n      'propertiesByName',\n      'bodyProperty',\n      'idProperty'\n    ]);\n  };\n\n  /**\n   * Add property at given index.\n   *\n   * @param {Object} p\n   * @param {Number} [idx]\n   * @param {Boolean} [validate=true]\n   */\n  DescriptorBuilder.prototype.addProperty = function(p, idx, validate) {\n\n    if (typeof idx === 'boolean') {\n      validate = idx;\n      idx = undefined;\n    }\n\n    this.addNamedProperty(p, validate !== false);\n\n    var properties = this.properties;\n\n    if (idx !== undefined) {\n      properties.splice(idx, 0, p);\n    } else {\n      properties.push(p);\n    }\n  };\n\n\n  DescriptorBuilder.prototype.replaceProperty = function(oldProperty, newProperty, replace) {\n    var oldNameNs = oldProperty.ns;\n\n    var props = this.properties,\n        propertiesByName = this.propertiesByName,\n        rename = oldProperty.name !== newProperty.name;\n\n    if (oldProperty.isId) {\n      if (!newProperty.isId) {\n        throw new Error(\n          'property <' + newProperty.ns.name + '> must be id property ' +\n          'to refine <' + oldProperty.ns.name + '>');\n      }\n\n      this.setIdProperty(newProperty, false);\n    }\n\n    if (oldProperty.isBody) {\n\n      if (!newProperty.isBody) {\n        throw new Error(\n          'property <' + newProperty.ns.name + '> must be body property ' +\n          'to refine <' + oldProperty.ns.name + '>');\n      }\n\n      // TODO: Check compatibility\n      this.setBodyProperty(newProperty, false);\n    }\n\n    // validate existence and get location of old property\n    var idx = props.indexOf(oldProperty);\n    if (idx === -1) {\n      throw new Error('property <' + oldNameNs.name + '> not found in property list');\n    }\n\n    // remove old property\n    props.splice(idx, 1);\n\n    // replacing the named property is intentional\n    //\n    //  * validate only if this is a \"rename\" operation\n    //  * add at specific index unless we \"replace\"\n    //\n    this.addProperty(newProperty, replace ? undefined : idx, rename);\n\n    // make new property available under old name\n    propertiesByName[oldNameNs.name] = propertiesByName[oldNameNs.localName] = newProperty;\n  };\n\n\n  DescriptorBuilder.prototype.redefineProperty = function(p, targetPropertyName, replace) {\n\n    var nsPrefix = p.ns.prefix;\n    var parts = targetPropertyName.split('#');\n\n    var name = parseName(parts[0], nsPrefix);\n    var attrName = parseName(parts[1], name.prefix).name;\n\n    var redefinedProperty = this.propertiesByName[attrName];\n    if (!redefinedProperty) {\n      throw new Error('refined property <' + attrName + '> not found');\n    } else {\n      this.replaceProperty(redefinedProperty, p, replace);\n    }\n\n    delete p.redefines;\n  };\n\n  DescriptorBuilder.prototype.addNamedProperty = function(p, validate) {\n    var ns = p.ns,\n        propsByName = this.propertiesByName;\n\n    if (validate) {\n      this.assertNotDefined(p, ns.name);\n      this.assertNotDefined(p, ns.localName);\n    }\n\n    propsByName[ns.name] = propsByName[ns.localName] = p;\n  };\n\n  DescriptorBuilder.prototype.removeNamedProperty = function(p) {\n    var ns = p.ns,\n        propsByName = this.propertiesByName;\n\n    delete propsByName[ns.name];\n    delete propsByName[ns.localName];\n  };\n\n  DescriptorBuilder.prototype.setBodyProperty = function(p, validate) {\n\n    if (validate && this.bodyProperty) {\n      throw new Error(\n        'body property defined multiple times ' +\n        '(<' + this.bodyProperty.ns.name + '>, <' + p.ns.name + '>)');\n    }\n\n    this.bodyProperty = p;\n  };\n\n  DescriptorBuilder.prototype.setIdProperty = function(p, validate) {\n\n    if (validate && this.idProperty) {\n      throw new Error(\n        'id property defined multiple times ' +\n        '(<' + this.idProperty.ns.name + '>, <' + p.ns.name + '>)');\n    }\n\n    this.idProperty = p;\n  };\n\n  DescriptorBuilder.prototype.assertNotDefined = function(p, name) {\n    var propertyName = p.name,\n        definedProperty = this.propertiesByName[propertyName];\n\n    if (definedProperty) {\n      throw new Error(\n        'property <' + propertyName + '> already defined; ' +\n        'override of <' + definedProperty.definedBy.ns.name + '#' + definedProperty.ns.name + '> by ' +\n        '<' + p.definedBy.ns.name + '#' + p.ns.name + '> not allowed without redefines');\n    }\n  };\n\n  DescriptorBuilder.prototype.hasProperty = function(name) {\n    return this.propertiesByName[name];\n  };\n\n  DescriptorBuilder.prototype.addTrait = function(t, inherited) {\n\n    var typesByName = this.allTypesByName,\n        types = this.allTypes;\n\n    var typeName = t.name;\n\n    if (typeName in typesByName) {\n      return;\n    }\n\n    forEach$1(t.properties, bind$2(function(p) {\n\n      // clone property to allow extensions\n      p = assign$1({}, p, {\n        name: p.ns.localName,\n        inherited: inherited\n      });\n\n      Object.defineProperty(p, 'definedBy', {\n        value: t\n      });\n\n      var replaces = p.replaces,\n          redefines = p.redefines;\n\n      // add replace/redefine support\n      if (replaces || redefines) {\n        this.redefineProperty(p, replaces || redefines, replaces);\n      } else {\n        if (p.isBody) {\n          this.setBodyProperty(p);\n        }\n        if (p.isId) {\n          this.setIdProperty(p);\n        }\n        this.addProperty(p);\n      }\n    }, this));\n\n    types.push(t);\n    typesByName[typeName] = t;\n  };\n\n  /**\n   * A registry of Moddle packages.\n   *\n   * @param {Array<Package>} packages\n   * @param {Properties} properties\n   */\n  function Registry(packages, properties) {\n    this.packageMap = {};\n    this.typeMap = {};\n\n    this.packages = [];\n\n    this.properties = properties;\n\n    forEach$1(packages, bind$2(this.registerPackage, this));\n  }\n\n\n  Registry.prototype.getPackage = function(uriOrPrefix) {\n    return this.packageMap[uriOrPrefix];\n  };\n\n  Registry.prototype.getPackages = function() {\n    return this.packages;\n  };\n\n\n  Registry.prototype.registerPackage = function(pkg) {\n\n    // copy package\n    pkg = assign$1({}, pkg);\n\n    var pkgMap = this.packageMap;\n\n    ensureAvailable(pkgMap, pkg, 'prefix');\n    ensureAvailable(pkgMap, pkg, 'uri');\n\n    // register types\n    forEach$1(pkg.types, bind$2(function(descriptor) {\n      this.registerType(descriptor, pkg);\n    }, this));\n\n    pkgMap[pkg.uri] = pkgMap[pkg.prefix] = pkg;\n    this.packages.push(pkg);\n  };\n\n\n  /**\n   * Register a type from a specific package with us\n   */\n  Registry.prototype.registerType = function(type, pkg) {\n\n    type = assign$1({}, type, {\n      superClass: (type.superClass || []).slice(),\n      extends: (type.extends || []).slice(),\n      properties: (type.properties || []).slice(),\n      meta: assign$1((type.meta || {}))\n    });\n\n    var ns = parseName(type.name, pkg.prefix),\n        name = ns.name,\n        propertiesByName = {};\n\n    // parse properties\n    forEach$1(type.properties, bind$2(function(p) {\n\n      // namespace property names\n      var propertyNs = parseName(p.name, ns.prefix),\n          propertyName = propertyNs.name;\n\n      // namespace property types\n      if (!isBuiltIn(p.type)) {\n        p.type = parseName(p.type, propertyNs.prefix).name;\n      }\n\n      assign$1(p, {\n        ns: propertyNs,\n        name: propertyName\n      });\n\n      propertiesByName[propertyName] = p;\n    }, this));\n\n    // update ns + name\n    assign$1(type, {\n      ns: ns,\n      name: name,\n      propertiesByName: propertiesByName\n    });\n\n    forEach$1(type.extends, bind$2(function(extendsName) {\n      var extended = this.typeMap[extendsName];\n\n      extended.traits = extended.traits || [];\n      extended.traits.push(name);\n    }, this));\n\n    // link to package\n    this.definePackage(type, pkg);\n\n    // register\n    this.typeMap[name] = type;\n  };\n\n\n  /**\n   * Traverse the type hierarchy from bottom to top,\n   * calling iterator with (type, inherited) for all elements in\n   * the inheritance chain.\n   *\n   * @param {Object} nsName\n   * @param {Function} iterator\n   * @param {Boolean} [trait=false]\n   */\n  Registry.prototype.mapTypes = function(nsName, iterator, trait) {\n\n    var type = isBuiltIn(nsName.name) ? { name: nsName.name } : this.typeMap[nsName.name];\n\n    var self = this;\n\n    /**\n     * Traverse the selected trait.\n     *\n     * @param {String} cls\n     */\n    function traverseTrait(cls) {\n      return traverseSuper(cls, true);\n    }\n\n    /**\n     * Traverse the selected super type or trait\n     *\n     * @param {String} cls\n     * @param {Boolean} [trait=false]\n     */\n    function traverseSuper(cls, trait) {\n      var parentNs = parseName(cls, isBuiltIn(cls) ? '' : nsName.prefix);\n      self.mapTypes(parentNs, iterator, trait);\n    }\n\n    if (!type) {\n      throw new Error('unknown type <' + nsName.name + '>');\n    }\n\n    forEach$1(type.superClass, trait ? traverseTrait : traverseSuper);\n\n    // call iterator with (type, inherited=!trait)\n    iterator(type, !trait);\n\n    forEach$1(type.traits, traverseTrait);\n  };\n\n\n  /**\n   * Returns the effective descriptor for a type.\n   *\n   * @param  {String} type the namespaced name (ns:localName) of the type\n   *\n   * @return {Descriptor} the resulting effective descriptor\n   */\n  Registry.prototype.getEffectiveDescriptor = function(name) {\n\n    var nsName = parseName(name);\n\n    var builder = new DescriptorBuilder(nsName);\n\n    this.mapTypes(nsName, function(type, inherited) {\n      builder.addTrait(type, inherited);\n    });\n\n    var descriptor = builder.build();\n\n    // define package link\n    this.definePackage(descriptor, descriptor.allTypes[descriptor.allTypes.length - 1].$pkg);\n\n    return descriptor;\n  };\n\n\n  Registry.prototype.definePackage = function(target, pkg) {\n    this.properties.define(target, '$pkg', { value: pkg });\n  };\n\n\n\n  // helpers ////////////////////////////\n\n  function ensureAvailable(packageMap, pkg, identifierKey) {\n\n    var value = pkg[identifierKey];\n\n    if (value in packageMap) {\n      throw new Error('package with ' + identifierKey + ' <' + value + '> already defined');\n    }\n  }\n\n  /**\n   * A utility that gets and sets properties of model elements.\n   *\n   * @param {Model} model\n   */\n  function Properties(model) {\n    this.model = model;\n  }\n\n\n  /**\n   * Sets a named property on the target element.\n   * If the value is undefined, the property gets deleted.\n   *\n   * @param {Object} target\n   * @param {String} name\n   * @param {Object} value\n   */\n  Properties.prototype.set = function(target, name, value) {\n\n    if (!isString(name) || !name.length) {\n      throw new TypeError('property name must be a non-empty string');\n    }\n\n    var property = this.model.getPropertyDescriptor(target, name);\n\n    var propertyName = property && property.name;\n\n    if (isUndefined(value)) {\n\n      // unset the property, if the specified value is undefined;\n      // delete from $attrs (for extensions) or the target itself\n      if (property) {\n        delete target[propertyName];\n      } else {\n        delete target.$attrs[name];\n      }\n    } else {\n\n      // set the property, defining well defined properties on the fly\n      // or simply updating them in target.$attrs (for extensions)\n      if (property) {\n        if (propertyName in target) {\n          target[propertyName] = value;\n        } else {\n          defineProperty(target, property, value);\n        }\n      } else {\n        target.$attrs[name] = value;\n      }\n    }\n  };\n\n  /**\n   * Returns the named property of the given element\n   *\n   * @param  {Object} target\n   * @param  {String} name\n   *\n   * @return {Object}\n   */\n  Properties.prototype.get = function(target, name) {\n\n    var property = this.model.getPropertyDescriptor(target, name);\n\n    if (!property) {\n      return target.$attrs[name];\n    }\n\n    var propertyName = property.name;\n\n    // check if access to collection property and lazily initialize it\n    if (!target[propertyName] && property.isMany) {\n      defineProperty(target, property, []);\n    }\n\n    return target[propertyName];\n  };\n\n\n  /**\n   * Define a property on the target element\n   *\n   * @param  {Object} target\n   * @param  {String} name\n   * @param  {Object} options\n   */\n  Properties.prototype.define = function(target, name, options) {\n\n    if (!options.writable) {\n\n      var value = options.value;\n\n      // use getters for read-only variables to support ES6 proxies\n      // cf. https://github.com/bpmn-io/internal-docs/issues/386\n      options = assign$1({}, options, {\n        get: function() { return value; }\n      });\n\n      delete options.value;\n    }\n\n    Object.defineProperty(target, name, options);\n  };\n\n\n  /**\n   * Define the descriptor for an element\n   */\n  Properties.prototype.defineDescriptor = function(target, descriptor) {\n    this.define(target, '$descriptor', { value: descriptor });\n  };\n\n  /**\n   * Define the model for an element\n   */\n  Properties.prototype.defineModel = function(target, model) {\n    this.define(target, '$model', { value: model });\n  };\n\n\n  function isUndefined(val) {\n    return typeof val === 'undefined';\n  }\n\n  function defineProperty(target, property, value) {\n    Object.defineProperty(target, property.name, {\n      enumerable: !property.isReference,\n      writable: true,\n      value: value,\n      configurable: true\n    });\n  }\n\n  // Moddle implementation /////////////////////////////////////////////////\n\n  /**\n   * @class Moddle\n   *\n   * A model that can be used to create elements of a specific type.\n   *\n   * @example\n   *\n   * var Moddle = require('moddle');\n   *\n   * var pkg = {\n   *   name: 'mypackage',\n   *   prefix: 'my',\n   *   types: [\n   *     { name: 'Root' }\n   *   ]\n   * };\n   *\n   * var moddle = new Moddle([pkg]);\n   *\n   * @param {Array<Package>} packages the packages to contain\n   */\n  function Moddle(packages) {\n\n    this.properties = new Properties(this);\n\n    this.factory = new Factory(this, this.properties);\n    this.registry = new Registry(packages, this.properties);\n\n    this.typeCache = {};\n  }\n\n\n  /**\n   * Create an instance of the specified type.\n   *\n   * @method Moddle#create\n   *\n   * @example\n   *\n   * var foo = moddle.create('my:Foo');\n   * var bar = moddle.create('my:Bar', { id: 'BAR_1' });\n   *\n   * @param  {String|Object} descriptor the type descriptor or name know to the model\n   * @param  {Object} attrs   a number of attributes to initialize the model instance with\n   * @return {Object}         model instance\n   */\n  Moddle.prototype.create = function(descriptor, attrs) {\n    var Type = this.getType(descriptor);\n\n    if (!Type) {\n      throw new Error('unknown type <' + descriptor + '>');\n    }\n\n    return new Type(attrs);\n  };\n\n\n  /**\n   * Returns the type representing a given descriptor\n   *\n   * @method Moddle#getType\n   *\n   * @example\n   *\n   * var Foo = moddle.getType('my:Foo');\n   * var foo = new Foo({ 'id' : 'FOO_1' });\n   *\n   * @param  {String|Object} descriptor the type descriptor or name know to the model\n   * @return {Object}         the type representing the descriptor\n   */\n  Moddle.prototype.getType = function(descriptor) {\n\n    var cache = this.typeCache;\n\n    var name = isString(descriptor) ? descriptor : descriptor.ns.name;\n\n    var type = cache[name];\n\n    if (!type) {\n      descriptor = this.registry.getEffectiveDescriptor(name);\n      type = cache[name] = this.factory.createType(descriptor);\n    }\n\n    return type;\n  };\n\n\n  /**\n   * Creates an any-element type to be used within model instances.\n   *\n   * This can be used to create custom elements that lie outside the meta-model.\n   * The created element contains all the meta-data required to serialize it\n   * as part of meta-model elements.\n   *\n   * @method Moddle#createAny\n   *\n   * @example\n   *\n   * var foo = moddle.createAny('vendor:Foo', 'http://vendor', {\n   *   value: 'bar'\n   * });\n   *\n   * var container = moddle.create('my:Container', 'http://my', {\n   *   any: [ foo ]\n   * });\n   *\n   * // go ahead and serialize the stuff\n   *\n   *\n   * @param  {String} name  the name of the element\n   * @param  {String} nsUri the namespace uri of the element\n   * @param  {Object} [properties] a map of properties to initialize the instance with\n   * @return {Object} the any type instance\n   */\n  Moddle.prototype.createAny = function(name, nsUri, properties) {\n\n    var nameNs = parseName(name);\n\n    var element = {\n      $type: name,\n      $instanceOf: function(type) {\n        return type === this.$type;\n      }\n    };\n\n    var descriptor = {\n      name: name,\n      isGeneric: true,\n      ns: {\n        prefix: nameNs.prefix,\n        localName: nameNs.localName,\n        uri: nsUri\n      }\n    };\n\n    this.properties.defineDescriptor(element, descriptor);\n    this.properties.defineModel(element, this);\n    this.properties.define(element, '$parent', { enumerable: false, writable: true });\n    this.properties.define(element, '$instanceOf', { enumerable: false, writable: true });\n\n    forEach$1(properties, function(a, key) {\n      if (isObject(a) && a.value !== undefined) {\n        element[a.name] = a.value;\n      } else {\n        element[key] = a;\n      }\n    });\n\n    return element;\n  };\n\n  /**\n   * Returns a registered package by uri or prefix\n   *\n   * @return {Object} the package\n   */\n  Moddle.prototype.getPackage = function(uriOrPrefix) {\n    return this.registry.getPackage(uriOrPrefix);\n  };\n\n  /**\n   * Returns a snapshot of all known packages\n   *\n   * @return {Object} the package\n   */\n  Moddle.prototype.getPackages = function() {\n    return this.registry.getPackages();\n  };\n\n  /**\n   * Returns the descriptor for an element\n   */\n  Moddle.prototype.getElementDescriptor = function(element) {\n    return element.$descriptor;\n  };\n\n  /**\n   * Returns true if the given descriptor or instance\n   * represents the given type.\n   *\n   * May be applied to this, if element is omitted.\n   */\n  Moddle.prototype.hasType = function(element, type) {\n    if (type === undefined) {\n      type = element;\n      element = this;\n    }\n\n    var descriptor = element.$model.getElementDescriptor(element);\n\n    return (type in descriptor.allTypesByName);\n  };\n\n  /**\n   * Returns the descriptor of an elements named property\n   */\n  Moddle.prototype.getPropertyDescriptor = function(element, property) {\n    return this.getElementDescriptor(element).propertiesByName[property];\n  };\n\n  /**\n   * Returns a mapped type's descriptor\n   */\n  Moddle.prototype.getTypeDescriptor = function(type) {\n    return this.registry.typeMap[type];\n  };\n\n  var fromCharCode = String.fromCharCode;\n\n  var hasOwnProperty = Object.prototype.hasOwnProperty;\n\n  var ENTITY_PATTERN = /&#(\\d+);|&#x([0-9a-f]+);|&(\\w+);/ig;\n\n  var ENTITY_MAPPING = {\n    'amp': '&',\n    'apos': '\\'',\n    'gt': '>',\n    'lt': '<',\n    'quot': '\"'\n  };\n\n  // map UPPERCASE variants of supported special chars\n  Object.keys(ENTITY_MAPPING).forEach(function(k) {\n    ENTITY_MAPPING[k.toUpperCase()] = ENTITY_MAPPING[k];\n  });\n\n\n  function replaceEntities(_, d, x, z) {\n\n    // reserved names, i.e. &nbsp;\n    if (z) {\n      if (hasOwnProperty.call(ENTITY_MAPPING, z)) {\n        return ENTITY_MAPPING[z];\n      } else {\n\n        // fall back to original value\n        return '&' + z + ';';\n      }\n    }\n\n    // decimal encoded char\n    if (d) {\n      return fromCharCode(d);\n    }\n\n    // hex encoded char\n    return fromCharCode(parseInt(x, 16));\n  }\n\n\n  /**\n   * A basic entity decoder that can decode a minimal\n   * sub-set of reserved names (&amp;) as well as\n   * hex (&#xaaf;) and decimal (&#1231;) encoded characters.\n   *\n   * @param {string} str\n   *\n   * @return {string} decoded string\n   */\n  function decodeEntities(s) {\n    if (s.length > 3 && s.indexOf('&') !== -1) {\n      return s.replace(ENTITY_PATTERN, replaceEntities);\n    }\n\n    return s;\n  }\n\n  var XSI_URI = 'http://www.w3.org/2001/XMLSchema-instance';\n  var XSI_PREFIX = 'xsi';\n  var XSI_TYPE$1 = 'xsi:type';\n\n  var NON_WHITESPACE_OUTSIDE_ROOT_NODE = 'non-whitespace outside of root node';\n\n  function error$1(msg) {\n    return new Error(msg);\n  }\n\n  function missingNamespaceForPrefix(prefix) {\n    return 'missing namespace for prefix <' + prefix + '>';\n  }\n\n  function getter(getFn) {\n    return {\n      'get': getFn,\n      'enumerable': true\n    };\n  }\n\n  function cloneNsMatrix(nsMatrix) {\n    var clone = {}, key;\n    for (key in nsMatrix) {\n      clone[key] = nsMatrix[key];\n    }\n    return clone;\n  }\n\n  function uriPrefix(prefix) {\n    return prefix + '$uri';\n  }\n\n  function buildNsMatrix(nsUriToPrefix) {\n    var nsMatrix = {},\n        uri,\n        prefix;\n\n    for (uri in nsUriToPrefix) {\n      prefix = nsUriToPrefix[uri];\n      nsMatrix[prefix] = prefix;\n      nsMatrix[uriPrefix(prefix)] = uri;\n    }\n\n    return nsMatrix;\n  }\n\n  function noopGetContext() {\n    return { 'line': 0, 'column': 0 };\n  }\n\n  function throwFunc(err) {\n    throw err;\n  }\n\n  /**\n   * Creates a new parser with the given options.\n   *\n   * @constructor\n   *\n   * @param  {!Object<string, ?>=} options\n   */\n  function Parser(options) {\n\n    if (!this) {\n      return new Parser(options);\n    }\n\n    var proxy = options && options['proxy'];\n\n    var onText,\n        onOpenTag,\n        onCloseTag,\n        onCDATA,\n        onError = throwFunc,\n        onWarning,\n        onComment,\n        onQuestion,\n        onAttention;\n\n    var getContext = noopGetContext;\n\n    /**\n     * Do we need to parse the current elements attributes for namespaces?\n     *\n     * @type {boolean}\n     */\n    var maybeNS = false;\n\n    /**\n     * Do we process namespaces at all?\n     *\n     * @type {boolean}\n     */\n    var isNamespace = false;\n\n    /**\n     * The caught error returned on parse end\n     *\n     * @type {Error}\n     */\n    var returnError = null;\n\n    /**\n     * Should we stop parsing?\n     *\n     * @type {boolean}\n     */\n    var parseStop = false;\n\n    /**\n     * A map of { uri: prefix } used by the parser.\n     *\n     * This map will ensure we can normalize prefixes during processing;\n     * for each uri, only one prefix will be exposed to the handlers.\n     *\n     * @type {!Object<string, string>}}\n     */\n    var nsUriToPrefix;\n\n    /**\n     * Handle parse error.\n     *\n     * @param  {string|Error} err\n     */\n    function handleError(err) {\n      if (!(err instanceof Error)) {\n        err = error$1(err);\n      }\n\n      returnError = err;\n\n      onError(err, getContext);\n    }\n\n    /**\n     * Handle parse error.\n     *\n     * @param  {string|Error} err\n     */\n    function handleWarning(err) {\n\n      if (!onWarning) {\n        return;\n      }\n\n      if (!(err instanceof Error)) {\n        err = error$1(err);\n      }\n\n      onWarning(err, getContext);\n    }\n\n    /**\n     * Register parse listener.\n     *\n     * @param  {string}   name\n     * @param  {Function} cb\n     *\n     * @return {Parser}\n     */\n    this['on'] = function(name, cb) {\n\n      if (typeof cb !== 'function') {\n        throw error$1('required args <name, cb>');\n      }\n\n      switch (name) {\n      case 'openTag': onOpenTag = cb; break;\n      case 'text': onText = cb; break;\n      case 'closeTag': onCloseTag = cb; break;\n      case 'error': onError = cb; break;\n      case 'warn': onWarning = cb; break;\n      case 'cdata': onCDATA = cb; break;\n      case 'attention': onAttention = cb; break; // <!XXXXX zzzz=\"eeee\">\n      case 'question': onQuestion = cb; break; // <? ....  ?>\n      case 'comment': onComment = cb; break;\n      default:\n        throw error$1('unsupported event: ' + name);\n      }\n\n      return this;\n    };\n\n    /**\n     * Set the namespace to prefix mapping.\n     *\n     * @example\n     *\n     * parser.ns({\n     *   'http://foo': 'foo',\n     *   'http://bar': 'bar'\n     * });\n     *\n     * @param  {!Object<string, string>} nsMap\n     *\n     * @return {Parser}\n     */\n    this['ns'] = function(nsMap) {\n\n      if (typeof nsMap === 'undefined') {\n        nsMap = {};\n      }\n\n      if (typeof nsMap !== 'object') {\n        throw error$1('required args <nsMap={}>');\n      }\n\n      var _nsUriToPrefix = {}, k;\n\n      for (k in nsMap) {\n        _nsUriToPrefix[k] = nsMap[k];\n      }\n\n      // FORCE default mapping for schema instance\n      _nsUriToPrefix[XSI_URI] = XSI_PREFIX;\n\n      isNamespace = true;\n      nsUriToPrefix = _nsUriToPrefix;\n\n      return this;\n    };\n\n    /**\n     * Parse xml string.\n     *\n     * @param  {string} xml\n     *\n     * @return {Error} returnError, if not thrown\n     */\n    this['parse'] = function(xml) {\n      if (typeof xml !== 'string') {\n        throw error$1('required args <xml=string>');\n      }\n\n      returnError = null;\n\n      parse(xml);\n\n      getContext = noopGetContext;\n      parseStop = false;\n\n      return returnError;\n    };\n\n    /**\n     * Stop parsing.\n     */\n    this['stop'] = function() {\n      parseStop = true;\n    };\n\n    /**\n     * Parse string, invoking configured listeners on element.\n     *\n     * @param  {string} xml\n     */\n    function parse(xml) {\n      var nsMatrixStack = isNamespace ? [] : null,\n          nsMatrix = isNamespace ? buildNsMatrix(nsUriToPrefix) : null,\n          _nsMatrix,\n          nodeStack = [],\n          anonymousNsCount = 0,\n          tagStart = false,\n          tagEnd = false,\n          i = 0, j = 0,\n          x, y, q, w, v,\n          xmlns,\n          elementName,\n          _elementName,\n          elementProxy\n          ;\n\n      var attrsString = '',\n          attrsStart = 0,\n          cachedAttrs // false = parsed with errors, null = needs parsing\n          ;\n\n      /**\n       * Parse attributes on demand and returns the parsed attributes.\n       *\n       * Return semantics: (1) `false` on attribute parse error,\n       * (2) object hash on extracted attrs.\n       *\n       * @return {boolean|Object}\n       */\n      function getAttrs() {\n        if (cachedAttrs !== null) {\n          return cachedAttrs;\n        }\n\n        var nsUri,\n            nsUriPrefix,\n            nsName,\n            defaultAlias = isNamespace && nsMatrix['xmlns'],\n            attrList = isNamespace && maybeNS ? [] : null,\n            i = attrsStart,\n            s = attrsString,\n            l = s.length,\n            hasNewMatrix,\n            newalias,\n            value,\n            alias,\n            name,\n            attrs = {},\n            seenAttrs = {},\n            skipAttr,\n            w,\n            j;\n\n        parseAttr:\n        for (; i < l; i++) {\n          skipAttr = false;\n          w = s.charCodeAt(i);\n\n          if (w === 32 || (w < 14 && w > 8)) { // WHITESPACE={ \\f\\n\\r\\t\\v}\n            continue;\n          }\n\n          // wait for non whitespace character\n          if (w < 65 || w > 122 || (w > 90 && w < 97)) {\n            if (w !== 95 && w !== 58) { // char 95\"_\" 58\":\"\n              handleWarning('illegal first char attribute name');\n              skipAttr = true;\n            }\n          }\n\n          // parse attribute name\n          for (j = i + 1; j < l; j++) {\n            w = s.charCodeAt(j);\n\n            if (\n              w > 96 && w < 123 ||\n              w > 64 && w < 91 ||\n              w > 47 && w < 59 ||\n              w === 46 || // '.'\n              w === 45 || // '-'\n              w === 95 // '_'\n            ) {\n              continue;\n            }\n\n            // unexpected whitespace\n            if (w === 32 || (w < 14 && w > 8)) { // WHITESPACE\n              handleWarning('missing attribute value');\n              i = j;\n\n              continue parseAttr;\n            }\n\n            // expected \"=\"\n            if (w === 61) { // \"=\" == 61\n              break;\n            }\n\n            handleWarning('illegal attribute name char');\n            skipAttr = true;\n          }\n\n          name = s.substring(i, j);\n\n          if (name === 'xmlns:xmlns') {\n            handleWarning('illegal declaration of xmlns');\n            skipAttr = true;\n          }\n\n          w = s.charCodeAt(j + 1);\n\n          if (w === 34) { // '\"'\n            j = s.indexOf('\"', i = j + 2);\n\n            if (j === -1) {\n              j = s.indexOf('\\'', i);\n\n              if (j !== -1) {\n                handleWarning('attribute value quote missmatch');\n                skipAttr = true;\n              }\n            }\n\n          } else if (w === 39) { // \"'\"\n            j = s.indexOf('\\'', i = j + 2);\n\n            if (j === -1) {\n              j = s.indexOf('\"', i);\n\n              if (j !== -1) {\n                handleWarning('attribute value quote missmatch');\n                skipAttr = true;\n              }\n            }\n\n          } else {\n            handleWarning('missing attribute value quotes');\n            skipAttr = true;\n\n            // skip to next space\n            for (j = j + 1; j < l; j++) {\n              w = s.charCodeAt(j + 1);\n\n              if (w === 32 || (w < 14 && w > 8)) { // WHITESPACE\n                break;\n              }\n            }\n\n          }\n\n          if (j === -1) {\n            handleWarning('missing closing quotes');\n\n            j = l;\n            skipAttr = true;\n          }\n\n          if (!skipAttr) {\n            value = s.substring(i, j);\n          }\n\n          i = j;\n\n          // ensure SPACE follows attribute\n          // skip illegal content otherwise\n          // example a=\"b\"c\n          for (; j + 1 < l; j++) {\n            w = s.charCodeAt(j + 1);\n\n            if (w === 32 || (w < 14 && w > 8)) { // WHITESPACE\n              break;\n            }\n\n            // FIRST ILLEGAL CHAR\n            if (i === j) {\n              handleWarning('illegal character after attribute end');\n              skipAttr = true;\n            }\n          }\n\n          // advance cursor to next attribute\n          i = j + 1;\n\n          if (skipAttr) {\n            continue parseAttr;\n          }\n\n          // check attribute re-declaration\n          if (name in seenAttrs) {\n            handleWarning('attribute <' + name + '> already defined');\n            continue;\n          }\n\n          seenAttrs[name] = true;\n\n          if (!isNamespace) {\n            attrs[name] = value;\n            continue;\n          }\n\n          // try to extract namespace information\n          if (maybeNS) {\n            newalias = (\n              name === 'xmlns'\n                ? 'xmlns'\n                : (name.charCodeAt(0) === 120 && name.substr(0, 6) === 'xmlns:')\n                  ? name.substr(6)\n                  : null\n            );\n\n            // handle xmlns(:alias) assignment\n            if (newalias !== null) {\n              nsUri = decodeEntities(value);\n              nsUriPrefix = uriPrefix(newalias);\n\n              alias = nsUriToPrefix[nsUri];\n\n              if (!alias) {\n\n                // no prefix defined or prefix collision\n                if (\n                  (newalias === 'xmlns') ||\n                  (nsUriPrefix in nsMatrix && nsMatrix[nsUriPrefix] !== nsUri)\n                ) {\n\n                  // alocate free ns prefix\n                  do {\n                    alias = 'ns' + (anonymousNsCount++);\n                  } while (typeof nsMatrix[alias] !== 'undefined');\n                } else {\n                  alias = newalias;\n                }\n\n                nsUriToPrefix[nsUri] = alias;\n              }\n\n              if (nsMatrix[newalias] !== alias) {\n                if (!hasNewMatrix) {\n                  nsMatrix = cloneNsMatrix(nsMatrix);\n                  hasNewMatrix = true;\n                }\n\n                nsMatrix[newalias] = alias;\n                if (newalias === 'xmlns') {\n                  nsMatrix[uriPrefix(alias)] = nsUri;\n                  defaultAlias = alias;\n                }\n\n                nsMatrix[nsUriPrefix] = nsUri;\n              }\n\n              // expose xmlns(:asd)=\"...\" in attributes\n              attrs[name] = value;\n              continue;\n            }\n\n            // collect attributes until all namespace\n            // declarations are processed\n            attrList.push(name, value);\n            continue;\n\n          } /** end if (maybeNs) */\n\n          // handle attributes on element without\n          // namespace declarations\n          w = name.indexOf(':');\n          if (w === -1) {\n            attrs[name] = value;\n            continue;\n          }\n\n          // normalize ns attribute name\n          if (!(nsName = nsMatrix[name.substring(0, w)])) {\n            handleWarning(missingNamespaceForPrefix(name.substring(0, w)));\n            continue;\n          }\n\n          name = defaultAlias === nsName\n            ? name.substr(w + 1)\n            : nsName + name.substr(w);\n\n          // end: normalize ns attribute name\n\n          // normalize xsi:type ns attribute value\n          if (name === XSI_TYPE$1) {\n            w = value.indexOf(':');\n\n            if (w !== -1) {\n              nsName = value.substring(0, w);\n\n              // handle default prefixes, i.e. xs:String gracefully\n              nsName = nsMatrix[nsName] || nsName;\n              value = nsName + value.substring(w);\n            } else {\n              value = defaultAlias + ':' + value;\n            }\n          }\n\n          // end: normalize xsi:type ns attribute value\n\n          attrs[name] = value;\n        }\n\n\n        // handle deferred, possibly namespaced attributes\n        if (maybeNS) {\n\n          // normalize captured attributes\n          for (i = 0, l = attrList.length; i < l; i++) {\n\n            name = attrList[i++];\n            value = attrList[i];\n\n            w = name.indexOf(':');\n\n            if (w !== -1) {\n\n              // normalize ns attribute name\n              if (!(nsName = nsMatrix[name.substring(0, w)])) {\n                handleWarning(missingNamespaceForPrefix(name.substring(0, w)));\n                continue;\n              }\n\n              name = defaultAlias === nsName\n                ? name.substr(w + 1)\n                : nsName + name.substr(w);\n\n              // end: normalize ns attribute name\n\n              // normalize xsi:type ns attribute value\n              if (name === XSI_TYPE$1) {\n                w = value.indexOf(':');\n\n                if (w !== -1) {\n                  nsName = value.substring(0, w);\n\n                  // handle default prefixes, i.e. xs:String gracefully\n                  nsName = nsMatrix[nsName] || nsName;\n                  value = nsName + value.substring(w);\n                } else {\n                  value = defaultAlias + ':' + value;\n                }\n              }\n\n              // end: normalize xsi:type ns attribute value\n            }\n\n            attrs[name] = value;\n          }\n\n          // end: normalize captured attributes\n        }\n\n        return cachedAttrs = attrs;\n      }\n\n      /**\n       * Extract the parse context { line, column, part }\n       * from the current parser position.\n       *\n       * @return {Object} parse context\n       */\n      function getParseContext() {\n        var splitsRe = /(\\r\\n|\\r|\\n)/g;\n\n        var line = 0;\n        var column = 0;\n        var startOfLine = 0;\n        var endOfLine = j;\n        var match;\n        var data;\n\n        while (i >= startOfLine) {\n\n          match = splitsRe.exec(xml);\n\n          if (!match) {\n            break;\n          }\n\n          // end of line = (break idx + break chars)\n          endOfLine = match[0].length + match.index;\n\n          if (endOfLine > i) {\n            break;\n          }\n\n          // advance to next line\n          line += 1;\n\n          startOfLine = endOfLine;\n        }\n\n        // EOF errors\n        if (i == -1) {\n          column = endOfLine;\n          data = xml.substring(j);\n        } else\n\n        // start errors\n        if (j === 0) {\n          data = xml.substring(j, i);\n        }\n\n        // other errors\n        else {\n          column = i - startOfLine;\n          data = (j == -1 ? xml.substring(i) : xml.substring(i, j + 1));\n        }\n\n        return {\n          'data': data,\n          'line': line,\n          'column': column\n        };\n      }\n\n      getContext = getParseContext;\n\n\n      if (proxy) {\n        elementProxy = Object.create({}, {\n          'name': getter(function() {\n            return elementName;\n          }),\n          'originalName': getter(function() {\n            return _elementName;\n          }),\n          'attrs': getter(getAttrs),\n          'ns': getter(function() {\n            return nsMatrix;\n          })\n        });\n      }\n\n      // actual parse logic\n      while (j !== -1) {\n\n        if (xml.charCodeAt(j) === 60) { // \"<\"\n          i = j;\n        } else {\n          i = xml.indexOf('<', j);\n        }\n\n        // parse end\n        if (i === -1) {\n          if (nodeStack.length) {\n            return handleError('unexpected end of file');\n          }\n\n          if (j === 0) {\n            return handleError('missing start tag');\n          }\n\n          if (j < xml.length) {\n            if (xml.substring(j).trim()) {\n              handleWarning(NON_WHITESPACE_OUTSIDE_ROOT_NODE);\n            }\n          }\n\n          return;\n        }\n\n        // parse text\n        if (j !== i) {\n\n          if (nodeStack.length) {\n            if (onText) {\n              onText(xml.substring(j, i), decodeEntities, getContext);\n\n              if (parseStop) {\n                return;\n              }\n            }\n          } else {\n            if (xml.substring(j, i).trim()) {\n              handleWarning(NON_WHITESPACE_OUTSIDE_ROOT_NODE);\n\n              if (parseStop) {\n                return;\n              }\n            }\n          }\n        }\n\n        w = xml.charCodeAt(i+1);\n\n        // parse comments + CDATA\n        if (w === 33) { // \"!\"\n          q = xml.charCodeAt(i+2);\n\n          // CDATA section\n          if (q === 91 && xml.substr(i + 3, 6) === 'CDATA[') { // 91 == \"[\"\n            j = xml.indexOf(']]>', i);\n            if (j === -1) {\n              return handleError('unclosed cdata');\n            }\n\n            if (onCDATA) {\n              onCDATA(xml.substring(i + 9, j), getContext);\n              if (parseStop) {\n                return;\n              }\n            }\n\n            j += 3;\n            continue;\n          }\n\n          // comment\n          if (q === 45 && xml.charCodeAt(i + 3) === 45) { // 45 == \"-\"\n            j = xml.indexOf('-->', i);\n            if (j === -1) {\n              return handleError('unclosed comment');\n            }\n\n\n            if (onComment) {\n              onComment(xml.substring(i + 4, j), decodeEntities, getContext);\n              if (parseStop) {\n                return;\n              }\n            }\n\n            j += 3;\n            continue;\n          }\n        }\n\n        // parse question <? ... ?>\n        if (w === 63) { // \"?\"\n          j = xml.indexOf('?>', i);\n          if (j === -1) {\n            return handleError('unclosed question');\n          }\n\n          if (onQuestion) {\n            onQuestion(xml.substring(i, j + 2), getContext);\n            if (parseStop) {\n              return;\n            }\n          }\n\n          j += 2;\n          continue;\n        }\n\n        // find matching closing tag for attention or standard tags\n        // for that we must skip through attribute values\n        // (enclosed in single or double quotes)\n        for (x = i + 1; ; x++) {\n          v = xml.charCodeAt(x);\n          if (isNaN(v)) {\n            j = -1;\n            return handleError('unclosed tag');\n          }\n\n          // [10] AttValue ::= '\"' ([^<&\"] | Reference)* '\"' | \"'\" ([^<&'] | Reference)* \"'\"\n          // skips the quoted string\n          // (double quotes) does not appear in a literal enclosed by (double quotes)\n          // (single quote) does not appear in a literal enclosed by (single quote)\n          if (v === 34) { //  '\"'\n            q = xml.indexOf('\"', x + 1);\n            x = q !== -1 ? q : x;\n          } else if (v === 39) { // \"'\"\n            q = xml.indexOf(\"'\", x + 1);\n            x = q !== -1 ? q : x;\n          } else if (v === 62) { // '>'\n            j = x;\n            break;\n          }\n        }\n\n\n        // parse attention <! ...>\n        // previously comment and CDATA have already been parsed\n        if (w === 33) { // \"!\"\n\n          if (onAttention) {\n            onAttention(xml.substring(i, j + 1), decodeEntities, getContext);\n            if (parseStop) {\n              return;\n            }\n          }\n\n          j += 1;\n          continue;\n        }\n\n        // don't process attributes;\n        // there are none\n        cachedAttrs = {};\n\n        // if (xml.charCodeAt(i+1) === 47) { // </...\n        if (w === 47) { // </...\n          tagStart = false;\n          tagEnd = true;\n\n          if (!nodeStack.length) {\n            return handleError('missing open tag');\n          }\n\n          // verify open <-> close tag match\n          x = elementName = nodeStack.pop();\n          q = i + 2 + x.length;\n\n          if (xml.substring(i + 2, q) !== x) {\n            return handleError('closing tag mismatch');\n          }\n\n          // verify chars in close tag\n          for (; q < j; q++) {\n            w = xml.charCodeAt(q);\n\n            if (w === 32 || (w > 8 && w < 14)) { // \\f\\n\\r\\t\\v space\n              continue;\n            }\n\n            return handleError('close tag');\n          }\n\n        } else {\n          if (xml.charCodeAt(j - 1) === 47) { // .../>\n            x = elementName = xml.substring(i + 1, j - 1);\n\n            tagStart = true;\n            tagEnd = true;\n\n          } else {\n            x = elementName = xml.substring(i + 1, j);\n\n            tagStart = true;\n            tagEnd = false;\n          }\n\n          if (!(w > 96 && w < 123 || w > 64 && w < 91 || w === 95 || w === 58)) { // char 95\"_\" 58\":\"\n            return handleError('illegal first char nodeName');\n          }\n\n          for (q = 1, y = x.length; q < y; q++) {\n            w = x.charCodeAt(q);\n\n            if (w > 96 && w < 123 || w > 64 && w < 91 || w > 47 && w < 59 || w === 45 || w === 95 || w == 46) {\n              continue;\n            }\n\n            if (w === 32 || (w < 14 && w > 8)) { // \\f\\n\\r\\t\\v space\n              elementName = x.substring(0, q);\n\n              // maybe there are attributes\n              cachedAttrs = null;\n              break;\n            }\n\n            return handleError('invalid nodeName');\n          }\n\n          if (!tagEnd) {\n            nodeStack.push(elementName);\n          }\n        }\n\n        if (isNamespace) {\n\n          _nsMatrix = nsMatrix;\n\n          if (tagStart) {\n\n            // remember old namespace\n            // unless we're self-closing\n            if (!tagEnd) {\n              nsMatrixStack.push(_nsMatrix);\n            }\n\n            if (cachedAttrs === null) {\n\n              // quick check, whether there may be namespace\n              // declarations on the node; if that is the case\n              // we need to eagerly parse the node attributes\n              if ((maybeNS = x.indexOf('xmlns', q) !== -1)) {\n                attrsStart = q;\n                attrsString = x;\n\n                getAttrs();\n\n                maybeNS = false;\n              }\n            }\n          }\n\n          _elementName = elementName;\n\n          w = elementName.indexOf(':');\n          if (w !== -1) {\n            xmlns = nsMatrix[elementName.substring(0, w)];\n\n            // prefix given; namespace must exist\n            if (!xmlns) {\n              return handleError('missing namespace on <' + _elementName + '>');\n            }\n\n            elementName = elementName.substr(w + 1);\n          } else {\n            xmlns = nsMatrix['xmlns'];\n\n            // if no default namespace is defined,\n            // we'll import the element as anonymous.\n            //\n            // it is up to users to correct that to the document defined\n            // targetNamespace, or whatever their undersanding of the\n            // XML spec mandates.\n          }\n\n          // adjust namespace prefixs as configured\n          if (xmlns) {\n            elementName = xmlns + ':' + elementName;\n          }\n\n        }\n\n        if (tagStart) {\n          attrsStart = q;\n          attrsString = x;\n\n          if (onOpenTag) {\n            if (proxy) {\n              onOpenTag(elementProxy, decodeEntities, tagEnd, getContext);\n            } else {\n              onOpenTag(elementName, getAttrs, decodeEntities, tagEnd, getContext);\n            }\n\n            if (parseStop) {\n              return;\n            }\n          }\n\n        }\n\n        if (tagEnd) {\n\n          if (onCloseTag) {\n            onCloseTag(proxy ? elementProxy : elementName, decodeEntities, tagStart, getContext);\n\n            if (parseStop) {\n              return;\n            }\n          }\n\n          // restore old namespace\n          if (isNamespace) {\n            if (!tagStart) {\n              nsMatrix = nsMatrixStack.pop();\n            } else {\n              nsMatrix = _nsMatrix;\n            }\n          }\n        }\n\n        j += 1;\n      }\n    } /** end parse */\n\n  }\n\n  function hasLowerCaseAlias(pkg) {\n    return pkg.xml && pkg.xml.tagAlias === 'lowerCase';\n  }\n\n  var DEFAULT_NS_MAP = {\n    'xsi': 'http://www.w3.org/2001/XMLSchema-instance',\n    'xml': 'http://www.w3.org/XML/1998/namespace'\n  };\n\n  var XSI_TYPE = 'xsi:type';\n\n  function serializeFormat(element) {\n    return element.xml && element.xml.serialize;\n  }\n\n  function serializeAsType(element) {\n    return serializeFormat(element) === XSI_TYPE;\n  }\n\n  function serializeAsProperty(element) {\n    return serializeFormat(element) === 'property';\n  }\n\n  function capitalize(str) {\n    return str.charAt(0).toUpperCase() + str.slice(1);\n  }\n\n  function aliasToName(aliasNs, pkg) {\n\n    if (!hasLowerCaseAlias(pkg)) {\n      return aliasNs.name;\n    }\n\n    return aliasNs.prefix + ':' + capitalize(aliasNs.localName);\n  }\n\n  function prefixedToName(nameNs, pkg) {\n\n    var name = nameNs.name,\n        localName = nameNs.localName;\n\n    var typePrefix = pkg.xml && pkg.xml.typePrefix;\n\n    if (typePrefix && localName.indexOf(typePrefix) === 0) {\n      return nameNs.prefix + ':' + localName.slice(typePrefix.length);\n    } else {\n      return name;\n    }\n  }\n\n  function normalizeXsiTypeName(name, model) {\n\n    var nameNs = parseName(name);\n    var pkg = model.getPackage(nameNs.prefix);\n\n    return prefixedToName(nameNs, pkg);\n  }\n\n  function error(message) {\n    return new Error(message);\n  }\n\n  /**\n   * Get the moddle descriptor for a given instance or type.\n   *\n   * @param  {ModdleElement|Function} element\n   *\n   * @return {Object} the moddle descriptor\n   */\n  function getModdleDescriptor(element) {\n    return element.$descriptor;\n  }\n\n\n  /**\n   * A parse context.\n   *\n   * @class\n   *\n   * @param {Object} options\n   * @param {ElementHandler} options.rootHandler the root handler for parsing a document\n   * @param {boolean} [options.lax=false] whether or not to ignore invalid elements\n   */\n  function Context(options) {\n\n    /**\n     * @property {ElementHandler} rootHandler\n     */\n\n    /**\n     * @property {Boolean} lax\n     */\n\n    assign$1(this, options);\n\n    this.elementsById = {};\n    this.references = [];\n    this.warnings = [];\n\n    /**\n     * Add an unresolved reference.\n     *\n     * @param {Object} reference\n     */\n    this.addReference = function(reference) {\n      this.references.push(reference);\n    };\n\n    /**\n     * Add a processed element.\n     *\n     * @param {ModdleElement} element\n     */\n    this.addElement = function(element) {\n\n      if (!element) {\n        throw error('expected element');\n      }\n\n      var elementsById = this.elementsById;\n\n      var descriptor = getModdleDescriptor(element);\n\n      var idProperty = descriptor.idProperty,\n          id;\n\n      if (idProperty) {\n        id = element.get(idProperty.name);\n\n        if (id) {\n\n          // for QName validation as per http://www.w3.org/TR/REC-xml/#NT-NameChar\n          //if (!/^([a-z][\\w-.]*:)?[a-z_][\\w-.]*$/i.test(id)) {\n          //  throw new Error('illegal ID <' + id + '>');\n          //}\n\n          if (elementsById[id]) {\n            throw error('duplicate ID <' + id + '>');\n          }\n\n          elementsById[id] = element;\n        }\n      }\n    };\n\n    /**\n     * Add an import warning.\n     *\n     * @param {Object} warning\n     * @param {String} warning.message\n     * @param {Error} [warning.error]\n     */\n    this.addWarning = function(warning) {\n      this.warnings.push(warning);\n    };\n  }\n\n  function BaseHandler() {}\n\n  BaseHandler.prototype.handleEnd = function() {};\n  BaseHandler.prototype.handleText = function() {};\n  BaseHandler.prototype.handleNode = function() {};\n\n\n  /**\n   * A simple pass through handler that does nothing except for\n   * ignoring all input it receives.\n   *\n   * This is used to ignore unknown elements and\n   * attributes.\n   */\n  function NoopHandler() { }\n\n  NoopHandler.prototype = Object.create(BaseHandler.prototype);\n\n  NoopHandler.prototype.handleNode = function() {\n    return this;\n  };\n\n  function BodyHandler() {}\n\n  BodyHandler.prototype = Object.create(BaseHandler.prototype);\n\n  BodyHandler.prototype.handleText = function(text) {\n    this.body = (this.body || '') + text;\n  };\n\n  function ReferenceHandler(property, context) {\n    this.property = property;\n    this.context = context;\n  }\n\n  ReferenceHandler.prototype = Object.create(BodyHandler.prototype);\n\n  ReferenceHandler.prototype.handleNode = function(node) {\n\n    if (this.element) {\n      throw error('expected no sub nodes');\n    } else {\n      this.element = this.createReference(node);\n    }\n\n    return this;\n  };\n\n  ReferenceHandler.prototype.handleEnd = function() {\n    this.element.id = this.body;\n  };\n\n  ReferenceHandler.prototype.createReference = function(node) {\n    return {\n      property: this.property.ns.name,\n      id: ''\n    };\n  };\n\n  function ValueHandler(propertyDesc, element) {\n    this.element = element;\n    this.propertyDesc = propertyDesc;\n  }\n\n  ValueHandler.prototype = Object.create(BodyHandler.prototype);\n\n  ValueHandler.prototype.handleEnd = function() {\n\n    var value = this.body || '',\n        element = this.element,\n        propertyDesc = this.propertyDesc;\n\n    value = coerceType(propertyDesc.type, value);\n\n    if (propertyDesc.isMany) {\n      element.get(propertyDesc.name).push(value);\n    } else {\n      element.set(propertyDesc.name, value);\n    }\n  };\n\n\n  function BaseElementHandler() {}\n\n  BaseElementHandler.prototype = Object.create(BodyHandler.prototype);\n\n  BaseElementHandler.prototype.handleNode = function(node) {\n    var parser = this,\n        element = this.element;\n\n    if (!element) {\n      element = this.element = this.createElement(node);\n\n      this.context.addElement(element);\n    } else {\n      parser = this.handleChild(node);\n    }\n\n    return parser;\n  };\n\n  /**\n   * @class Reader.ElementHandler\n   *\n   */\n  function ElementHandler(model, typeName, context) {\n    this.model = model;\n    this.type = model.getType(typeName);\n    this.context = context;\n  }\n\n  ElementHandler.prototype = Object.create(BaseElementHandler.prototype);\n\n  ElementHandler.prototype.addReference = function(reference) {\n    this.context.addReference(reference);\n  };\n\n  ElementHandler.prototype.handleText = function(text) {\n\n    var element = this.element,\n        descriptor = getModdleDescriptor(element),\n        bodyProperty = descriptor.bodyProperty;\n\n    if (!bodyProperty) {\n      throw error('unexpected body text <' + text + '>');\n    }\n\n    BodyHandler.prototype.handleText.call(this, text);\n  };\n\n  ElementHandler.prototype.handleEnd = function() {\n\n    var value = this.body,\n        element = this.element,\n        descriptor = getModdleDescriptor(element),\n        bodyProperty = descriptor.bodyProperty;\n\n    if (bodyProperty && value !== undefined) {\n      value = coerceType(bodyProperty.type, value);\n      element.set(bodyProperty.name, value);\n    }\n  };\n\n  /**\n   * Create an instance of the model from the given node.\n   *\n   * @param  {Element} node the xml node\n   */\n  ElementHandler.prototype.createElement = function(node) {\n    var attributes = node.attributes,\n        Type = this.type,\n        descriptor = getModdleDescriptor(Type),\n        context = this.context,\n        instance = new Type({}),\n        model = this.model,\n        propNameNs;\n\n    forEach$1(attributes, function(value, name) {\n\n      var prop = descriptor.propertiesByName[name],\n          values;\n\n      if (prop && prop.isReference) {\n\n        if (!prop.isMany) {\n          context.addReference({\n            element: instance,\n            property: prop.ns.name,\n            id: value\n          });\n        } else {\n\n          // IDREFS: parse references as whitespace-separated list\n          values = value.split(' ');\n\n          forEach$1(values, function(v) {\n            context.addReference({\n              element: instance,\n              property: prop.ns.name,\n              id: v\n            });\n          });\n        }\n\n      } else {\n        if (prop) {\n          value = coerceType(prop.type, value);\n        } else\n        if (name !== 'xmlns') {\n          propNameNs = parseName(name, descriptor.ns.prefix);\n\n          // check whether attribute is defined in a well-known namespace\n          // if that is the case we emit a warning to indicate potential misuse\n          if (model.getPackage(propNameNs.prefix)) {\n\n            context.addWarning({\n              message: 'unknown attribute <' + name + '>',\n              element: instance,\n              property: name,\n              value: value\n            });\n          }\n        }\n\n        instance.set(name, value);\n      }\n    });\n\n    return instance;\n  };\n\n  ElementHandler.prototype.getPropertyForNode = function(node) {\n\n    var name = node.name;\n    var nameNs = parseName(name);\n\n    var type = this.type,\n        model = this.model,\n        descriptor = getModdleDescriptor(type);\n\n    var propertyName = nameNs.name,\n        property = descriptor.propertiesByName[propertyName],\n        elementTypeName,\n        elementType;\n\n    // search for properties by name first\n\n    if (property && !property.isAttr) {\n\n      if (serializeAsType(property)) {\n        elementTypeName = node.attributes[XSI_TYPE];\n\n        // xsi type is optional, if it does not exists the\n        // default type is assumed\n        if (elementTypeName) {\n\n          // take possible type prefixes from XML\n          // into account, i.e.: xsi:type=\"t{ActualType}\"\n          elementTypeName = normalizeXsiTypeName(elementTypeName, model);\n\n          elementType = model.getType(elementTypeName);\n\n          return assign$1({}, property, {\n            effectiveType: getModdleDescriptor(elementType).name\n          });\n        }\n      }\n\n      // search for properties by name first\n      return property;\n    }\n\n    var pkg = model.getPackage(nameNs.prefix);\n\n    if (pkg) {\n      elementTypeName = aliasToName(nameNs, pkg);\n      elementType = model.getType(elementTypeName);\n\n      // search for collection members later\n      property = find(descriptor.properties, function(p) {\n        return !p.isVirtual && !p.isReference && !p.isAttribute && elementType.hasType(p.type);\n      });\n\n      if (property) {\n        return assign$1({}, property, {\n          effectiveType: getModdleDescriptor(elementType).name\n        });\n      }\n    } else {\n\n      // parse unknown element (maybe extension)\n      property = find(descriptor.properties, function(p) {\n        return !p.isReference && !p.isAttribute && p.type === 'Element';\n      });\n\n      if (property) {\n        return property;\n      }\n    }\n\n    throw error('unrecognized element <' + nameNs.name + '>');\n  };\n\n  ElementHandler.prototype.toString = function() {\n    return 'ElementDescriptor[' + getModdleDescriptor(this.type).name + ']';\n  };\n\n  ElementHandler.prototype.valueHandler = function(propertyDesc, element) {\n    return new ValueHandler(propertyDesc, element);\n  };\n\n  ElementHandler.prototype.referenceHandler = function(propertyDesc) {\n    return new ReferenceHandler(propertyDesc, this.context);\n  };\n\n  ElementHandler.prototype.handler = function(type) {\n    if (type === 'Element') {\n      return new GenericElementHandler(this.model, type, this.context);\n    } else {\n      return new ElementHandler(this.model, type, this.context);\n    }\n  };\n\n  /**\n   * Handle the child element parsing\n   *\n   * @param  {Element} node the xml node\n   */\n  ElementHandler.prototype.handleChild = function(node) {\n    var propertyDesc, type, element, childHandler;\n\n    propertyDesc = this.getPropertyForNode(node);\n    element = this.element;\n\n    type = propertyDesc.effectiveType || propertyDesc.type;\n\n    if (isSimple(type)) {\n      return this.valueHandler(propertyDesc, element);\n    }\n\n    if (propertyDesc.isReference) {\n      childHandler = this.referenceHandler(propertyDesc).handleNode(node);\n    } else {\n      childHandler = this.handler(type).handleNode(node);\n    }\n\n    var newElement = childHandler.element;\n\n    // child handles may decide to skip elements\n    // by not returning anything\n    if (newElement !== undefined) {\n\n      if (propertyDesc.isMany) {\n        element.get(propertyDesc.name).push(newElement);\n      } else {\n        element.set(propertyDesc.name, newElement);\n      }\n\n      if (propertyDesc.isReference) {\n        assign$1(newElement, {\n          element: element\n        });\n\n        this.context.addReference(newElement);\n      } else {\n\n        // establish child -> parent relationship\n        newElement.$parent = element;\n      }\n    }\n\n    return childHandler;\n  };\n\n  /**\n   * An element handler that performs special validation\n   * to ensure the node it gets initialized with matches\n   * the handlers type (namespace wise).\n   *\n   * @param {Moddle} model\n   * @param {String} typeName\n   * @param {Context} context\n   */\n  function RootElementHandler(model, typeName, context) {\n    ElementHandler.call(this, model, typeName, context);\n  }\n\n  RootElementHandler.prototype = Object.create(ElementHandler.prototype);\n\n  RootElementHandler.prototype.createElement = function(node) {\n\n    var name = node.name,\n        nameNs = parseName(name),\n        model = this.model,\n        type = this.type,\n        pkg = model.getPackage(nameNs.prefix),\n        typeName = pkg && aliasToName(nameNs, pkg) || name;\n\n    // verify the correct namespace if we parse\n    // the first element in the handler tree\n    //\n    // this ensures we don't mistakenly import wrong namespace elements\n    if (!type.hasType(typeName)) {\n      throw error('unexpected element <' + node.originalName + '>');\n    }\n\n    return ElementHandler.prototype.createElement.call(this, node);\n  };\n\n\n  function GenericElementHandler(model, typeName, context) {\n    this.model = model;\n    this.context = context;\n  }\n\n  GenericElementHandler.prototype = Object.create(BaseElementHandler.prototype);\n\n  GenericElementHandler.prototype.createElement = function(node) {\n\n    var name = node.name,\n        ns = parseName(name),\n        prefix = ns.prefix,\n        uri = node.ns[prefix + '$uri'],\n        attributes = node.attributes;\n\n    return this.model.createAny(name, uri, attributes);\n  };\n\n  GenericElementHandler.prototype.handleChild = function(node) {\n\n    var handler = new GenericElementHandler(this.model, 'Element', this.context).handleNode(node),\n        element = this.element;\n\n    var newElement = handler.element,\n        children;\n\n    if (newElement !== undefined) {\n      children = element.$children = element.$children || [];\n      children.push(newElement);\n\n      // establish child -> parent relationship\n      newElement.$parent = element;\n    }\n\n    return handler;\n  };\n\n  GenericElementHandler.prototype.handleEnd = function() {\n    if (this.body) {\n      this.element.$body = this.body;\n    }\n  };\n\n  /**\n   * A reader for a meta-model\n   *\n   * @param {Object} options\n   * @param {Model} options.model used to read xml files\n   * @param {Boolean} options.lax whether to make parse errors warnings\n   */\n  function Reader(options) {\n\n    if (options instanceof Moddle) {\n      options = {\n        model: options\n      };\n    }\n\n    assign$1(this, { lax: false }, options);\n  }\n\n  /**\n   * The fromXML result.\n   *\n   * @typedef {Object} ParseResult\n   *\n   * @property {ModdleElement} rootElement\n   * @property {Array<Object>} references\n   * @property {Array<Error>} warnings\n   * @property {Object} elementsById - a mapping containing each ID -> ModdleElement\n   */\n\n  /**\n   * The fromXML result.\n   *\n   * @typedef {Error} ParseError\n   *\n   * @property {Array<Error>} warnings\n   */\n\n  /**\n   * Parse the given XML into a moddle document tree.\n   *\n   * @param {String} xml\n   * @param {ElementHandler|Object} options or rootHandler\n   *\n   * @returns {Promise<ParseResult, ParseError>}\n   */\n  Reader.prototype.fromXML = function(xml, options, done) {\n\n    var rootHandler = options.rootHandler;\n\n    if (options instanceof ElementHandler) {\n\n      // root handler passed via (xml, { rootHandler: ElementHandler }, ...)\n      rootHandler = options;\n      options = {};\n    } else {\n      if (typeof options === 'string') {\n\n        // rootHandler passed via (xml, 'someString', ...)\n        rootHandler = this.handler(options);\n        options = {};\n      } else if (typeof rootHandler === 'string') {\n\n        // rootHandler passed via (xml, { rootHandler: 'someString' }, ...)\n        rootHandler = this.handler(rootHandler);\n      }\n    }\n\n    var model = this.model,\n        lax = this.lax;\n\n    var context = new Context(assign$1({}, options, { rootHandler: rootHandler })),\n        parser = new Parser({ proxy: true }),\n        stack = createStack();\n\n    rootHandler.context = context;\n\n    // push root handler\n    stack.push(rootHandler);\n\n\n    /**\n     * Handle error.\n     *\n     * @param  {Error} err\n     * @param  {Function} getContext\n     * @param  {boolean} lax\n     *\n     * @return {boolean} true if handled\n     */\n    function handleError(err, getContext, lax) {\n\n      var ctx = getContext();\n\n      var line = ctx.line,\n          column = ctx.column,\n          data = ctx.data;\n\n      // we receive the full context data here,\n      // for elements trim down the information\n      // to the tag name, only\n      if (data.charAt(0) === '<' && data.indexOf(' ') !== -1) {\n        data = data.slice(0, data.indexOf(' ')) + '>';\n      }\n\n      var message =\n        'unparsable content ' + (data ? data + ' ' : '') + 'detected\\n\\t' +\n          'line: ' + line + '\\n\\t' +\n          'column: ' + column + '\\n\\t' +\n          'nested error: ' + err.message;\n\n      if (lax) {\n        context.addWarning({\n          message: message,\n          error: err\n        });\n\n        return true;\n      } else {\n        throw error(message);\n      }\n    }\n\n    function handleWarning(err, getContext) {\n\n      // just like handling errors in <lax=true> mode\n      return handleError(err, getContext, true);\n    }\n\n    /**\n     * Resolve collected references on parse end.\n     */\n    function resolveReferences() {\n\n      var elementsById = context.elementsById;\n      var references = context.references;\n\n      var i, r;\n\n      for (i = 0; (r = references[i]); i++) {\n        var element = r.element;\n        var reference = elementsById[r.id];\n        var property = getModdleDescriptor(element).propertiesByName[r.property];\n\n        if (!reference) {\n          context.addWarning({\n            message: 'unresolved reference <' + r.id + '>',\n            element: r.element,\n            property: r.property,\n            value: r.id\n          });\n        }\n\n        if (property.isMany) {\n          var collection = element.get(property.name),\n              idx = collection.indexOf(r);\n\n          // we replace an existing place holder (idx != -1) or\n          // append to the collection instead\n          if (idx === -1) {\n            idx = collection.length;\n          }\n\n          if (!reference) {\n\n            // remove unresolvable reference\n            collection.splice(idx, 1);\n          } else {\n\n            // add or update reference in collection\n            collection[idx] = reference;\n          }\n        } else {\n          element.set(property.name, reference);\n        }\n      }\n    }\n\n    function handleClose() {\n      stack.pop().handleEnd();\n    }\n\n    var PREAMBLE_START_PATTERN = /^<\\?xml /i;\n\n    var ENCODING_PATTERN = / encoding=\"([^\"]+)\"/i;\n\n    var UTF_8_PATTERN = /^utf-8$/i;\n\n    function handleQuestion(question) {\n\n      if (!PREAMBLE_START_PATTERN.test(question)) {\n        return;\n      }\n\n      var match = ENCODING_PATTERN.exec(question);\n      var encoding = match && match[1];\n\n      if (!encoding || UTF_8_PATTERN.test(encoding)) {\n        return;\n      }\n\n      context.addWarning({\n        message:\n          'unsupported document encoding <' + encoding + '>, ' +\n          'falling back to UTF-8'\n      });\n    }\n\n    function handleOpen(node, getContext) {\n      var handler = stack.peek();\n\n      try {\n        stack.push(handler.handleNode(node));\n      } catch (err) {\n\n        if (handleError(err, getContext, lax)) {\n          stack.push(new NoopHandler());\n        }\n      }\n    }\n\n    function handleCData(text, getContext) {\n\n      try {\n        stack.peek().handleText(text);\n      } catch (err) {\n        handleWarning(err, getContext);\n      }\n    }\n\n    function handleText(text, getContext) {\n\n      // strip whitespace only nodes, i.e. before\n      // <!CDATA[ ... ]> sections and in between tags\n\n      if (!text.trim()) {\n        return;\n      }\n\n      handleCData(text, getContext);\n    }\n\n    var uriMap = model.getPackages().reduce(function(uriMap, p) {\n      uriMap[p.uri] = p.prefix;\n\n      return uriMap;\n    }, {\n      'http://www.w3.org/XML/1998/namespace': 'xml' // add default xml ns\n    });\n    parser\n      .ns(uriMap)\n      .on('openTag', function(obj, decodeStr, selfClosing, getContext) {\n\n        // gracefully handle unparsable attributes (attrs=false)\n        var attrs = obj.attrs || {};\n\n        var decodedAttrs = Object.keys(attrs).reduce(function(d, key) {\n          var value = decodeStr(attrs[key]);\n\n          d[key] = value;\n\n          return d;\n        }, {});\n\n        var node = {\n          name: obj.name,\n          originalName: obj.originalName,\n          attributes: decodedAttrs,\n          ns: obj.ns\n        };\n\n        handleOpen(node, getContext);\n      })\n      .on('question', handleQuestion)\n      .on('closeTag', handleClose)\n      .on('cdata', handleCData)\n      .on('text', function(text, decodeEntities, getContext) {\n        handleText(decodeEntities(text), getContext);\n      })\n      .on('error', handleError)\n      .on('warn', handleWarning);\n\n    // async XML parsing to make sure the execution environment\n    // (node or brower) is kept responsive and that certain optimization\n    // strategies can kick in.\n    return new Promise(function(resolve, reject) {\n\n      var err;\n\n      try {\n        parser.parse(xml);\n\n        resolveReferences();\n      } catch (e) {\n        err = e;\n      }\n\n      var rootElement = rootHandler.element;\n\n      if (!err && !rootElement) {\n        err = error('failed to parse document as <' + rootHandler.type.$descriptor.name + '>');\n      }\n\n      var warnings = context.warnings;\n      var references = context.references;\n      var elementsById = context.elementsById;\n\n      if (err) {\n        err.warnings = warnings;\n\n        return reject(err);\n      } else {\n        return resolve({\n          rootElement: rootElement,\n          elementsById: elementsById,\n          references: references,\n          warnings: warnings\n        });\n      }\n    });\n  };\n\n  Reader.prototype.handler = function(name) {\n    return new RootElementHandler(this.model, name);\n  };\n\n\n  // helpers //////////////////////////\n\n  function createStack() {\n    var stack = [];\n\n    Object.defineProperty(stack, 'peek', {\n      value: function() {\n        return this[this.length - 1];\n      }\n    });\n\n    return stack;\n  }\n\n  var XML_PREAMBLE = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n';\n\n  var ESCAPE_ATTR_CHARS = /<|>|'|\"|&|\\n\\r|\\n/g;\n  var ESCAPE_CHARS = /<|>|&/g;\n\n\n  function Namespaces(parent) {\n\n    var prefixMap = {};\n    var uriMap = {};\n    var used = {};\n\n    var wellknown = [];\n    var custom = [];\n\n    // API\n\n    this.byUri = function(uri) {\n      return uriMap[uri] || (\n        parent && parent.byUri(uri)\n      );\n    };\n\n    this.add = function(ns, isWellknown) {\n\n      uriMap[ns.uri] = ns;\n\n      if (isWellknown) {\n        wellknown.push(ns);\n      } else {\n        custom.push(ns);\n      }\n\n      this.mapPrefix(ns.prefix, ns.uri);\n    };\n\n    this.uriByPrefix = function(prefix) {\n      return prefixMap[prefix || 'xmlns'];\n    };\n\n    this.mapPrefix = function(prefix, uri) {\n      prefixMap[prefix || 'xmlns'] = uri;\n    };\n\n    this.getNSKey = function(ns) {\n      return (ns.prefix !== undefined) ? (ns.uri + '|' + ns.prefix) : ns.uri;\n    };\n\n    this.logUsed = function(ns) {\n\n      var uri = ns.uri;\n      var nsKey = this.getNSKey(ns);\n\n      used[nsKey] = this.byUri(uri);\n\n      // Inform parent recursively about the usage of this NS\n      if (parent) {\n        parent.logUsed(ns);\n      }\n    };\n\n    this.getUsed = function(ns) {\n\n      function isUsed(ns) {\n        var nsKey = self.getNSKey(ns);\n\n        return used[nsKey];\n      }\n\n      var self = this;\n\n      var allNs = [].concat(wellknown, custom);\n\n      return allNs.filter(isUsed);\n    };\n\n  }\n\n  function lower(string) {\n    return string.charAt(0).toLowerCase() + string.slice(1);\n  }\n\n  function nameToAlias(name, pkg) {\n    if (hasLowerCaseAlias(pkg)) {\n      return lower(name);\n    } else {\n      return name;\n    }\n  }\n\n  function inherits(ctor, superCtor) {\n    ctor.super_ = superCtor;\n    ctor.prototype = Object.create(superCtor.prototype, {\n      constructor: {\n        value: ctor,\n        enumerable: false,\n        writable: true,\n        configurable: true\n      }\n    });\n  }\n\n  function nsName(ns) {\n    if (isString(ns)) {\n      return ns;\n    } else {\n      return (ns.prefix ? ns.prefix + ':' : '') + ns.localName;\n    }\n  }\n\n  function getNsAttrs(namespaces) {\n\n    return namespaces.getUsed().filter(function(ns) {\n\n      // do not serialize built in <xml> namespace\n      return ns.prefix !== 'xml';\n    }).map(function(ns) {\n      var name = 'xmlns' + (ns.prefix ? ':' + ns.prefix : '');\n      return { name: name, value: ns.uri };\n    });\n\n  }\n\n  function getElementNs(ns, descriptor) {\n    if (descriptor.isGeneric) {\n      return assign$1({ localName: descriptor.ns.localName }, ns);\n    } else {\n      return assign$1({ localName: nameToAlias(descriptor.ns.localName, descriptor.$pkg) }, ns);\n    }\n  }\n\n  function getPropertyNs(ns, descriptor) {\n    return assign$1({ localName: descriptor.ns.localName }, ns);\n  }\n\n  function getSerializableProperties(element) {\n    var descriptor = element.$descriptor;\n\n    return filter(descriptor.properties, function(p) {\n      var name = p.name;\n\n      if (p.isVirtual) {\n        return false;\n      }\n\n      // do not serialize defaults\n      if (!has$1(element, name)) {\n        return false;\n      }\n\n      var value = element[name];\n\n      // do not serialize default equals\n      if (value === p.default) {\n        return false;\n      }\n\n      // do not serialize null properties\n      if (value === null) {\n        return false;\n      }\n\n      return p.isMany ? value.length : true;\n    });\n  }\n\n  var ESCAPE_ATTR_MAP = {\n    '\\n': '#10',\n    '\\n\\r': '#10',\n    '\"': '#34',\n    '\\'': '#39',\n    '<': '#60',\n    '>': '#62',\n    '&': '#38'\n  };\n\n  var ESCAPE_MAP = {\n    '<': 'lt',\n    '>': 'gt',\n    '&': 'amp'\n  };\n\n  function escape(str, charPattern, replaceMap) {\n\n    // ensure we are handling strings here\n    str = isString(str) ? str : '' + str;\n\n    return str.replace(charPattern, function(s) {\n      return '&' + replaceMap[s] + ';';\n    });\n  }\n\n  /**\n   * Escape a string attribute to not contain any bad values (line breaks, '\"', ...)\n   *\n   * @param {String} str the string to escape\n   * @return {String} the escaped string\n   */\n  function escapeAttr(str) {\n    return escape(str, ESCAPE_ATTR_CHARS, ESCAPE_ATTR_MAP);\n  }\n\n  function escapeBody(str) {\n    return escape(str, ESCAPE_CHARS, ESCAPE_MAP);\n  }\n\n  function filterAttributes(props) {\n    return filter(props, function(p) { return p.isAttr; });\n  }\n\n  function filterContained(props) {\n    return filter(props, function(p) { return !p.isAttr; });\n  }\n\n\n  function ReferenceSerializer(tagName) {\n    this.tagName = tagName;\n  }\n\n  ReferenceSerializer.prototype.build = function(element) {\n    this.element = element;\n    return this;\n  };\n\n  ReferenceSerializer.prototype.serializeTo = function(writer) {\n    writer\n      .appendIndent()\n      .append('<' + this.tagName + '>' + this.element.id + '</' + this.tagName + '>')\n      .appendNewLine();\n  };\n\n  function BodySerializer() {}\n\n  BodySerializer.prototype.serializeValue =\n  BodySerializer.prototype.serializeTo = function(writer) {\n    writer.append(\n      this.escape\n        ? escapeBody(this.value)\n        : this.value\n    );\n  };\n\n  BodySerializer.prototype.build = function(prop, value) {\n    this.value = value;\n\n    if (prop.type === 'String' && value.search(ESCAPE_CHARS) !== -1) {\n      this.escape = true;\n    }\n\n    return this;\n  };\n\n  function ValueSerializer(tagName) {\n    this.tagName = tagName;\n  }\n\n  inherits(ValueSerializer, BodySerializer);\n\n  ValueSerializer.prototype.serializeTo = function(writer) {\n\n    writer\n      .appendIndent()\n      .append('<' + this.tagName + '>');\n\n    this.serializeValue(writer);\n\n    writer\n      .append('</' + this.tagName + '>')\n      .appendNewLine();\n  };\n\n  function ElementSerializer(parent, propertyDescriptor) {\n    this.body = [];\n    this.attrs = [];\n\n    this.parent = parent;\n    this.propertyDescriptor = propertyDescriptor;\n  }\n\n  ElementSerializer.prototype.build = function(element) {\n    this.element = element;\n\n    var elementDescriptor = element.$descriptor,\n        propertyDescriptor = this.propertyDescriptor;\n\n    var otherAttrs,\n        properties;\n\n    var isGeneric = elementDescriptor.isGeneric;\n\n    if (isGeneric) {\n      otherAttrs = this.parseGeneric(element);\n    } else {\n      otherAttrs = this.parseNsAttributes(element);\n    }\n\n    if (propertyDescriptor) {\n      this.ns = this.nsPropertyTagName(propertyDescriptor);\n    } else {\n      this.ns = this.nsTagName(elementDescriptor);\n    }\n\n    // compute tag name\n    this.tagName = this.addTagName(this.ns);\n\n    if (!isGeneric) {\n      properties = getSerializableProperties(element);\n\n      this.parseAttributes(filterAttributes(properties));\n      this.parseContainments(filterContained(properties));\n    }\n\n    this.parseGenericAttributes(element, otherAttrs);\n\n    return this;\n  };\n\n  ElementSerializer.prototype.nsTagName = function(descriptor) {\n    var effectiveNs = this.logNamespaceUsed(descriptor.ns);\n    return getElementNs(effectiveNs, descriptor);\n  };\n\n  ElementSerializer.prototype.nsPropertyTagName = function(descriptor) {\n    var effectiveNs = this.logNamespaceUsed(descriptor.ns);\n    return getPropertyNs(effectiveNs, descriptor);\n  };\n\n  ElementSerializer.prototype.isLocalNs = function(ns) {\n    return ns.uri === this.ns.uri;\n  };\n\n  /**\n   * Get the actual ns attribute name for the given element.\n   *\n   * @param {Object} element\n   * @param {Boolean} [element.inherited=false]\n   *\n   * @return {Object} nsName\n   */\n  ElementSerializer.prototype.nsAttributeName = function(element) {\n\n    var ns;\n\n    if (isString(element)) {\n      ns = parseName(element);\n    } else {\n      ns = element.ns;\n    }\n\n    // return just local name for inherited attributes\n    if (element.inherited) {\n      return { localName: ns.localName };\n    }\n\n    // parse + log effective ns\n    var effectiveNs = this.logNamespaceUsed(ns);\n\n    // LOG ACTUAL namespace use\n    this.getNamespaces().logUsed(effectiveNs);\n\n    // strip prefix if same namespace like parent\n    if (this.isLocalNs(effectiveNs)) {\n      return { localName: ns.localName };\n    } else {\n      return assign$1({ localName: ns.localName }, effectiveNs);\n    }\n  };\n\n  ElementSerializer.prototype.parseGeneric = function(element) {\n\n    var self = this,\n        body = this.body;\n\n    var attributes = [];\n\n    forEach$1(element, function(val, key) {\n\n      var nonNsAttr;\n\n      if (key === '$body') {\n        body.push(new BodySerializer().build({ type: 'String' }, val));\n      } else\n      if (key === '$children') {\n        forEach$1(val, function(child) {\n          body.push(new ElementSerializer(self).build(child));\n        });\n      } else\n      if (key.indexOf('$') !== 0) {\n        nonNsAttr = self.parseNsAttribute(element, key, val);\n\n        if (nonNsAttr) {\n          attributes.push({ name: key, value: val });\n        }\n      }\n    });\n\n    return attributes;\n  };\n\n  ElementSerializer.prototype.parseNsAttribute = function(element, name, value) {\n    var model = element.$model;\n\n    var nameNs = parseName(name);\n\n    var ns;\n\n    // parse xmlns:foo=\"http://foo.bar\"\n    if (nameNs.prefix === 'xmlns') {\n      ns = { prefix: nameNs.localName, uri: value };\n    }\n\n    // parse xmlns=\"http://foo.bar\"\n    if (!nameNs.prefix && nameNs.localName === 'xmlns') {\n      ns = { uri: value };\n    }\n\n    if (!ns) {\n      return {\n        name: name,\n        value: value\n      };\n    }\n\n    if (model && model.getPackage(value)) {\n\n      // register well known namespace\n      this.logNamespace(ns, true, true);\n    } else {\n\n      // log custom namespace directly as used\n      var actualNs = this.logNamespaceUsed(ns, true);\n\n      this.getNamespaces().logUsed(actualNs);\n    }\n  };\n\n\n  /**\n   * Parse namespaces and return a list of left over generic attributes\n   *\n   * @param  {Object} element\n   * @return {Array<Object>}\n   */\n  ElementSerializer.prototype.parseNsAttributes = function(element, attrs) {\n    var self = this;\n\n    var genericAttrs = element.$attrs;\n\n    var attributes = [];\n\n    // parse namespace attributes first\n    // and log them. push non namespace attributes to a list\n    // and process them later\n    forEach$1(genericAttrs, function(value, name) {\n\n      var nonNsAttr = self.parseNsAttribute(element, name, value);\n\n      if (nonNsAttr) {\n        attributes.push(nonNsAttr);\n      }\n    });\n\n    return attributes;\n  };\n\n  ElementSerializer.prototype.parseGenericAttributes = function(element, attributes) {\n\n    var self = this;\n\n    forEach$1(attributes, function(attr) {\n\n      // do not serialize xsi:type attribute\n      // it is set manually based on the actual implementation type\n      if (attr.name === XSI_TYPE) {\n        return;\n      }\n\n      try {\n        self.addAttribute(self.nsAttributeName(attr.name), attr.value);\n      } catch (e) {\n        /* global console */\n\n        console.warn(\n          'missing namespace information for ',\n          attr.name, '=', attr.value, 'on', element,\n          e);\n      }\n    });\n  };\n\n  ElementSerializer.prototype.parseContainments = function(properties) {\n\n    var self = this,\n        body = this.body,\n        element = this.element;\n\n    forEach$1(properties, function(p) {\n      var value = element.get(p.name),\n          isReference = p.isReference,\n          isMany = p.isMany;\n\n      if (!isMany) {\n        value = [ value ];\n      }\n\n      if (p.isBody) {\n        body.push(new BodySerializer().build(p, value[0]));\n      } else\n      if (isSimple(p.type)) {\n        forEach$1(value, function(v) {\n          body.push(new ValueSerializer(self.addTagName(self.nsPropertyTagName(p))).build(p, v));\n        });\n      } else\n      if (isReference) {\n        forEach$1(value, function(v) {\n          body.push(new ReferenceSerializer(self.addTagName(self.nsPropertyTagName(p))).build(v));\n        });\n      } else {\n\n        // allow serialization via type\n        // rather than element name\n        var asType = serializeAsType(p),\n            asProperty = serializeAsProperty(p);\n\n        forEach$1(value, function(v) {\n          var serializer;\n\n          if (asType) {\n            serializer = new TypeSerializer(self, p);\n          } else\n          if (asProperty) {\n            serializer = new ElementSerializer(self, p);\n          } else {\n            serializer = new ElementSerializer(self);\n          }\n\n          body.push(serializer.build(v));\n        });\n      }\n    });\n  };\n\n  ElementSerializer.prototype.getNamespaces = function(local) {\n\n    var namespaces = this.namespaces,\n        parent = this.parent,\n        parentNamespaces;\n\n    if (!namespaces) {\n      parentNamespaces = parent && parent.getNamespaces();\n\n      if (local || !parentNamespaces) {\n        this.namespaces = namespaces = new Namespaces(parentNamespaces);\n      } else {\n        namespaces = parentNamespaces;\n      }\n    }\n\n    return namespaces;\n  };\n\n  ElementSerializer.prototype.logNamespace = function(ns, wellknown, local) {\n    var namespaces = this.getNamespaces(local);\n\n    var nsUri = ns.uri,\n        nsPrefix = ns.prefix;\n\n    var existing = namespaces.byUri(nsUri);\n\n    if (!existing || local) {\n      namespaces.add(ns, wellknown);\n    }\n\n    namespaces.mapPrefix(nsPrefix, nsUri);\n\n    return ns;\n  };\n\n  ElementSerializer.prototype.logNamespaceUsed = function(ns, local) {\n    var element = this.element,\n        model = element.$model,\n        namespaces = this.getNamespaces(local);\n\n    // ns may be\n    //\n    //   * prefix only\n    //   * prefix:uri\n    //   * localName only\n\n    var prefix = ns.prefix,\n        uri = ns.uri,\n        newPrefix, idx,\n        wellknownUri;\n\n    // handle anonymous namespaces (elementForm=unqualified), cf. #23\n    if (!prefix && !uri) {\n      return { localName: ns.localName };\n    }\n\n    wellknownUri = DEFAULT_NS_MAP[prefix] || model && (model.getPackage(prefix) || {}).uri;\n\n    uri = uri || wellknownUri || namespaces.uriByPrefix(prefix);\n\n    if (!uri) {\n      throw new Error('no namespace uri given for prefix <' + prefix + '>');\n    }\n\n    ns = namespaces.byUri(uri);\n\n    if (!ns) {\n      newPrefix = prefix;\n      idx = 1;\n\n      // find a prefix that is not mapped yet\n      while (namespaces.uriByPrefix(newPrefix)) {\n        newPrefix = prefix + '_' + idx++;\n      }\n\n      ns = this.logNamespace({ prefix: newPrefix, uri: uri }, wellknownUri === uri);\n    }\n\n    if (prefix) {\n      namespaces.mapPrefix(prefix, uri);\n    }\n\n    return ns;\n  };\n\n  ElementSerializer.prototype.parseAttributes = function(properties) {\n    var self = this,\n        element = this.element;\n\n    forEach$1(properties, function(p) {\n\n      var value = element.get(p.name);\n\n      if (p.isReference) {\n\n        if (!p.isMany) {\n          value = value.id;\n        }\n        else {\n          var values = [];\n          forEach$1(value, function(v) {\n            values.push(v.id);\n          });\n\n          // IDREFS is a whitespace-separated list of references.\n          value = values.join(' ');\n        }\n\n      }\n\n      self.addAttribute(self.nsAttributeName(p), value);\n    });\n  };\n\n  ElementSerializer.prototype.addTagName = function(nsTagName) {\n    var actualNs = this.logNamespaceUsed(nsTagName);\n\n    this.getNamespaces().logUsed(actualNs);\n\n    return nsName(nsTagName);\n  };\n\n  ElementSerializer.prototype.addAttribute = function(name, value) {\n    var attrs = this.attrs;\n\n    if (isString(value)) {\n      value = escapeAttr(value);\n    }\n\n    // de-duplicate attributes\n    // https://github.com/bpmn-io/moddle-xml/issues/66\n    var idx = findIndex(attrs, function(element) {\n      return (\n        element.name.localName === name.localName &&\n        element.name.uri === name.uri &&\n        element.name.prefix === name.prefix\n      );\n    });\n\n    var attr = { name: name, value: value };\n\n    if (idx !== -1) {\n      attrs.splice(idx, 1, attr);\n    } else {\n      attrs.push(attr);\n    }\n  };\n\n  ElementSerializer.prototype.serializeAttributes = function(writer) {\n    var attrs = this.attrs,\n        namespaces = this.namespaces;\n\n    if (namespaces) {\n      attrs = getNsAttrs(namespaces).concat(attrs);\n    }\n\n    forEach$1(attrs, function(a) {\n      writer\n        .append(' ')\n        .append(nsName(a.name)).append('=\"').append(a.value).append('\"');\n    });\n  };\n\n  ElementSerializer.prototype.serializeTo = function(writer) {\n    var firstBody = this.body[0],\n        indent = firstBody && firstBody.constructor !== BodySerializer;\n\n    writer\n      .appendIndent()\n      .append('<' + this.tagName);\n\n    this.serializeAttributes(writer);\n\n    writer.append(firstBody ? '>' : ' />');\n\n    if (firstBody) {\n\n      if (indent) {\n        writer\n          .appendNewLine()\n          .indent();\n      }\n\n      forEach$1(this.body, function(b) {\n        b.serializeTo(writer);\n      });\n\n      if (indent) {\n        writer\n          .unindent()\n          .appendIndent();\n      }\n\n      writer.append('</' + this.tagName + '>');\n    }\n\n    writer.appendNewLine();\n  };\n\n  /**\n   * A serializer for types that handles serialization of data types\n   */\n  function TypeSerializer(parent, propertyDescriptor) {\n    ElementSerializer.call(this, parent, propertyDescriptor);\n  }\n\n  inherits(TypeSerializer, ElementSerializer);\n\n  TypeSerializer.prototype.parseNsAttributes = function(element) {\n\n    // extracted attributes\n    var attributes = ElementSerializer.prototype.parseNsAttributes.call(this, element);\n\n    var descriptor = element.$descriptor;\n\n    // only serialize xsi:type if necessary\n    if (descriptor.name === this.propertyDescriptor.type) {\n      return attributes;\n    }\n\n    var typeNs = this.typeNs = this.nsTagName(descriptor);\n    this.getNamespaces().logUsed(this.typeNs);\n\n    // add xsi:type attribute to represent the elements\n    // actual type\n\n    var pkg = element.$model.getPackage(typeNs.uri),\n        typePrefix = (pkg.xml && pkg.xml.typePrefix) || '';\n\n    this.addAttribute(\n      this.nsAttributeName(XSI_TYPE),\n      (typeNs.prefix ? typeNs.prefix + ':' : '') + typePrefix + descriptor.ns.localName\n    );\n\n    return attributes;\n  };\n\n  TypeSerializer.prototype.isLocalNs = function(ns) {\n    return ns.uri === (this.typeNs || this.ns).uri;\n  };\n\n  function SavingWriter() {\n    this.value = '';\n\n    this.write = function(str) {\n      this.value += str;\n    };\n  }\n\n  function FormatingWriter(out, format) {\n\n    var indent = [ '' ];\n\n    this.append = function(str) {\n      out.write(str);\n\n      return this;\n    };\n\n    this.appendNewLine = function() {\n      if (format) {\n        out.write('\\n');\n      }\n\n      return this;\n    };\n\n    this.appendIndent = function() {\n      if (format) {\n        out.write(indent.join('  '));\n      }\n\n      return this;\n    };\n\n    this.indent = function() {\n      indent.push('');\n      return this;\n    };\n\n    this.unindent = function() {\n      indent.pop();\n      return this;\n    };\n  }\n\n  /**\n   * A writer for meta-model backed document trees\n   *\n   * @param {Object} options output options to pass into the writer\n   */\n  function Writer(options) {\n\n    options = assign$1({ format: false, preamble: true }, options || {});\n\n    function toXML(tree, writer) {\n      var internalWriter = writer || new SavingWriter();\n      var formatingWriter = new FormatingWriter(internalWriter, options.format);\n\n      if (options.preamble) {\n        formatingWriter.append(XML_PREAMBLE);\n      }\n\n      new ElementSerializer().build(tree).serializeTo(formatingWriter);\n\n      if (!writer) {\n        return internalWriter.value;\n      }\n    }\n\n    return {\n      toXML: toXML\n    };\n  }\n\n  /**\n   * A sub class of {@link Moddle} with support for import and export of BPMN 2.0 xml files.\n   *\n   * @class BpmnModdle\n   * @extends Moddle\n   *\n   * @param {Object|Array} packages to use for instantiating the model\n   * @param {Object} [options] additional options to pass over\n   */\n  function BpmnModdle(packages, options) {\n    Moddle.call(this, packages, options);\n  }\n\n  BpmnModdle.prototype = Object.create(Moddle.prototype);\n\n  /**\n   * The fromXML result.\n   *\n   * @typedef {Object} ParseResult\n   *\n   * @property {ModdleElement} rootElement\n   * @property {Array<Object>} references\n   * @property {Array<Error>} warnings\n   * @property {Object} elementsById - a mapping containing each ID -> ModdleElement\n   */\n\n  /**\n   * The fromXML error.\n   *\n   * @typedef {Error} ParseError\n   *\n   * @property {Array<Error>} warnings\n   */\n\n  /**\n   * Instantiates a BPMN model tree from a given xml string.\n   *\n   * @param {String}   xmlStr\n   * @param {String}   [typeName='bpmn:Definitions'] name of the root element\n   * @param {Object}   [options]  options to pass to the underlying reader\n   *\n   * @returns {Promise<ParseResult, ParseError>}\n   */\n  BpmnModdle.prototype.fromXML = function(xmlStr, typeName, options) {\n\n    if (!isString(typeName)) {\n      options = typeName;\n      typeName = 'bpmn:Definitions';\n    }\n\n    var reader = new Reader(assign$1({ model: this, lax: true }, options));\n    var rootHandler = reader.handler(typeName);\n\n    return reader.fromXML(xmlStr, rootHandler);\n  };\n\n\n  /**\n   * The toXML result.\n   *\n   * @typedef {Object} SerializationResult\n   *\n   * @property {String} xml\n   */\n\n  /**\n   * Serializes a BPMN 2.0 object tree to XML.\n   *\n   * @param {String}   element    the root element, typically an instance of `bpmn:Definitions`\n   * @param {Object}   [options]  to pass to the underlying writer\n   *\n   * @returns {Promise<SerializationResult, Error>}\n   */\n  BpmnModdle.prototype.toXML = function(element, options) {\n\n    var writer = new Writer(options);\n\n    return new Promise(function(resolve, reject) {\n      try {\n        var result = writer.toXML(element);\n\n        return resolve({\n          xml: result\n        });\n      } catch (err) {\n        return reject(err);\n      }\n    });\n  };\n\n  var name$5 = \"BPMN20\";\n  var uri$5 = \"http://www.omg.org/spec/BPMN/20100524/MODEL\";\n  var prefix$5 = \"bpmn\";\n  var associations$5 = [\n  ];\n  var types$5 = [\n  \t{\n  \t\tname: \"Interface\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"operations\",\n  \t\t\t\ttype: \"Operation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"implementationRef\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Operation\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inMessageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outMessageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"errorRef\",\n  \t\t\t\ttype: \"Error\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"implementationRef\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"EndPoint\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Auditing\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalTask\",\n  \t\tsuperClass: [\n  \t\t\t\"CallableElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"resources\",\n  \t\t\t\ttype: \"ResourceRole\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Monitoring\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Performer\",\n  \t\tsuperClass: [\n  \t\t\t\"ResourceRole\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Process\",\n  \t\tsuperClass: [\n  \t\t\t\"FlowElementsContainer\",\n  \t\t\t\"CallableElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"processType\",\n  \t\t\t\ttype: \"ProcessType\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isClosed\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"auditing\",\n  \t\t\t\ttype: \"Auditing\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"monitoring\",\n  \t\t\t\ttype: \"Monitoring\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"properties\",\n  \t\t\t\ttype: \"Property\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"laneSets\",\n  \t\t\t\tisMany: true,\n  \t\t\t\treplaces: \"FlowElementsContainer#laneSets\",\n  \t\t\t\ttype: \"LaneSet\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"flowElements\",\n  \t\t\t\tisMany: true,\n  \t\t\t\treplaces: \"FlowElementsContainer#flowElements\",\n  \t\t\t\ttype: \"FlowElement\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"artifacts\",\n  \t\t\t\ttype: \"Artifact\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"resources\",\n  \t\t\t\ttype: \"ResourceRole\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"correlationSubscriptions\",\n  \t\t\t\ttype: \"CorrelationSubscription\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"supports\",\n  \t\t\t\ttype: \"Process\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"definitionalCollaborationRef\",\n  \t\t\t\ttype: \"Collaboration\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isExecutable\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"LaneSet\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"lanes\",\n  \t\t\t\ttype: \"Lane\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Lane\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"partitionElementRef\",\n  \t\t\t\ttype: \"BaseElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"partitionElement\",\n  \t\t\t\ttype: \"BaseElement\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"flowNodeRef\",\n  \t\t\t\ttype: \"FlowNode\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"childLaneSet\",\n  \t\t\t\ttype: \"LaneSet\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalManualTask\",\n  \t\tsuperClass: [\n  \t\t\t\"GlobalTask\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ManualTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"UserTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"renderings\",\n  \t\t\t\ttype: \"Rendering\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Rendering\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"HumanPerformer\",\n  \t\tsuperClass: [\n  \t\t\t\"Performer\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"PotentialOwner\",\n  \t\tsuperClass: [\n  \t\t\t\"HumanPerformer\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalUserTask\",\n  \t\tsuperClass: [\n  \t\t\t\"GlobalTask\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"renderings\",\n  \t\t\t\ttype: \"Rendering\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Gateway\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"FlowNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"gatewayDirection\",\n  \t\t\t\ttype: \"GatewayDirection\",\n  \t\t\t\t\"default\": \"Unspecified\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"EventBasedGateway\",\n  \t\tsuperClass: [\n  \t\t\t\"Gateway\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"instantiate\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"eventGatewayType\",\n  \t\t\t\ttype: \"EventBasedGatewayType\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\t\"default\": \"Exclusive\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ComplexGateway\",\n  \t\tsuperClass: [\n  \t\t\t\"Gateway\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"activationCondition\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"default\",\n  \t\t\t\ttype: \"SequenceFlow\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ExclusiveGateway\",\n  \t\tsuperClass: [\n  \t\t\t\"Gateway\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"default\",\n  \t\t\t\ttype: \"SequenceFlow\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"InclusiveGateway\",\n  \t\tsuperClass: [\n  \t\t\t\"Gateway\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"default\",\n  \t\t\t\ttype: \"SequenceFlow\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ParallelGateway\",\n  \t\tsuperClass: [\n  \t\t\t\"Gateway\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"RootElement\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Relationship\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"type\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"direction\",\n  \t\t\t\ttype: \"RelationshipDirection\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"source\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"Element\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"target\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"Element\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BaseElement\",\n  \t\tisAbstract: true,\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"id\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\",\n  \t\t\t\tisId: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"documentation\",\n  \t\t\t\ttype: \"Documentation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extensionDefinitions\",\n  \t\t\t\ttype: \"ExtensionDefinition\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extensionElements\",\n  \t\t\t\ttype: \"ExtensionElements\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Extension\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"mustUnderstand\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"definition\",\n  \t\t\t\ttype: \"ExtensionDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ExtensionDefinition\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extensionAttributeDefinitions\",\n  \t\t\t\ttype: \"ExtensionAttributeDefinition\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ExtensionAttributeDefinition\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"type\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isReference\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extensionDefinition\",\n  \t\t\t\ttype: \"ExtensionDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ExtensionElements\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"valueRef\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"Element\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"values\",\n  \t\t\t\ttype: \"Element\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extensionAttributeDefinition\",\n  \t\t\t\ttype: \"ExtensionAttributeDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Documentation\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"text\",\n  \t\t\t\ttype: \"String\",\n  \t\t\t\tisBody: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"textFormat\",\n  \t\t\t\t\"default\": \"text/plain\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Event\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"FlowNode\",\n  \t\t\t\"InteractionNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"properties\",\n  \t\t\t\ttype: \"Property\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"IntermediateCatchEvent\",\n  \t\tsuperClass: [\n  \t\t\t\"CatchEvent\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"IntermediateThrowEvent\",\n  \t\tsuperClass: [\n  \t\t\t\"ThrowEvent\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"EndEvent\",\n  \t\tsuperClass: [\n  \t\t\t\"ThrowEvent\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"StartEvent\",\n  \t\tsuperClass: [\n  \t\t\t\"CatchEvent\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"isInterrupting\",\n  \t\t\t\t\"default\": true,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ThrowEvent\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Event\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"dataInputs\",\n  \t\t\t\ttype: \"DataInput\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataInputAssociations\",\n  \t\t\t\ttype: \"DataInputAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputSet\",\n  \t\t\t\ttype: \"InputSet\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"eventDefinitions\",\n  \t\t\t\ttype: \"EventDefinition\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"eventDefinitionRef\",\n  \t\t\t\ttype: \"EventDefinition\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CatchEvent\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Event\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"parallelMultiple\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\",\n  \t\t\t\t\"default\": false\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataOutputs\",\n  \t\t\t\ttype: \"DataOutput\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataOutputAssociations\",\n  \t\t\t\ttype: \"DataOutputAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputSet\",\n  \t\t\t\ttype: \"OutputSet\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"eventDefinitions\",\n  \t\t\t\ttype: \"EventDefinition\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"eventDefinitionRef\",\n  \t\t\t\ttype: \"EventDefinition\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BoundaryEvent\",\n  \t\tsuperClass: [\n  \t\t\t\"CatchEvent\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"cancelActivity\",\n  \t\t\t\t\"default\": true,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"attachedToRef\",\n  \t\t\t\ttype: \"Activity\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"EventDefinition\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CancelEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ErrorEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"errorRef\",\n  \t\t\t\ttype: \"Error\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"TerminateEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"EscalationEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"escalationRef\",\n  \t\t\t\ttype: \"Escalation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Escalation\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"structureRef\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"escalationCode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CompensateEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"waitForCompletion\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\",\n  \t\t\t\t\"default\": true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"activityRef\",\n  \t\t\t\ttype: \"Activity\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"TimerEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"timeDate\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"timeCycle\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"timeDuration\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"LinkEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"target\",\n  \t\t\t\ttype: \"LinkEventDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"source\",\n  \t\t\t\ttype: \"LinkEventDefinition\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"MessageEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"messageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"operationRef\",\n  \t\t\t\ttype: \"Operation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ConditionalEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"condition\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"SignalEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"signalRef\",\n  \t\t\t\ttype: \"Signal\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Signal\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"structureRef\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ImplicitThrowEvent\",\n  \t\tsuperClass: [\n  \t\t\t\"ThrowEvent\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataState\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ItemAwareElement\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"itemSubjectRef\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataState\",\n  \t\t\t\ttype: \"DataState\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataAssociation\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"sourceRef\",\n  \t\t\t\ttype: \"ItemAwareElement\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetRef\",\n  \t\t\t\ttype: \"ItemAwareElement\",\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"transformation\",\n  \t\t\t\ttype: \"FormalExpression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"property\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"assignment\",\n  \t\t\t\ttype: \"Assignment\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataInput\",\n  \t\tsuperClass: [\n  \t\t\t\"ItemAwareElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isCollection\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputSetRef\",\n  \t\t\t\ttype: \"InputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputSetWithOptional\",\n  \t\t\t\ttype: \"InputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputSetWithWhileExecuting\",\n  \t\t\t\ttype: \"InputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataOutput\",\n  \t\tsuperClass: [\n  \t\t\t\"ItemAwareElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isCollection\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputSetRef\",\n  \t\t\t\ttype: \"OutputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputSetWithOptional\",\n  \t\t\t\ttype: \"OutputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputSetWithWhileExecuting\",\n  \t\t\t\ttype: \"OutputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"InputSet\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataInputRefs\",\n  \t\t\t\ttype: \"DataInput\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"optionalInputRefs\",\n  \t\t\t\ttype: \"DataInput\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"whileExecutingInputRefs\",\n  \t\t\t\ttype: \"DataInput\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputSetRefs\",\n  \t\t\t\ttype: \"OutputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"OutputSet\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"dataOutputRefs\",\n  \t\t\t\ttype: \"DataOutput\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputSetRefs\",\n  \t\t\t\ttype: \"InputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"optionalOutputRefs\",\n  \t\t\t\ttype: \"DataOutput\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"whileExecutingOutputRefs\",\n  \t\t\t\ttype: \"DataOutput\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Property\",\n  \t\tsuperClass: [\n  \t\t\t\"ItemAwareElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataInputAssociation\",\n  \t\tsuperClass: [\n  \t\t\t\"DataAssociation\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataOutputAssociation\",\n  \t\tsuperClass: [\n  \t\t\t\"DataAssociation\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"InputOutputSpecification\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"dataInputs\",\n  \t\t\t\ttype: \"DataInput\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataOutputs\",\n  \t\t\t\ttype: \"DataOutput\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputSets\",\n  \t\t\t\ttype: \"InputSet\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputSets\",\n  \t\t\t\ttype: \"OutputSet\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataObject\",\n  \t\tsuperClass: [\n  \t\t\t\"FlowElement\",\n  \t\t\t\"ItemAwareElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"isCollection\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"InputOutputBinding\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"inputDataRef\",\n  \t\t\t\ttype: \"InputSet\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputDataRef\",\n  \t\t\t\ttype: \"OutputSet\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"operationRef\",\n  \t\t\t\ttype: \"Operation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Assignment\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"from\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"to\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataStore\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\",\n  \t\t\t\"ItemAwareElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"capacity\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Integer\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isUnlimited\",\n  \t\t\t\t\"default\": true,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataStoreReference\",\n  \t\tsuperClass: [\n  \t\t\t\"ItemAwareElement\",\n  \t\t\t\"FlowElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"dataStoreRef\",\n  \t\t\t\ttype: \"DataStore\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataObjectReference\",\n  \t\tsuperClass: [\n  \t\t\t\"ItemAwareElement\",\n  \t\t\t\"FlowElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"dataObjectRef\",\n  \t\t\t\ttype: \"DataObject\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ConversationLink\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"sourceRef\",\n  \t\t\t\ttype: \"InteractionNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetRef\",\n  \t\t\t\ttype: \"InteractionNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ConversationAssociation\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"innerConversationNodeRef\",\n  \t\t\t\ttype: \"ConversationNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outerConversationNodeRef\",\n  \t\t\t\ttype: \"ConversationNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CallConversation\",\n  \t\tsuperClass: [\n  \t\t\t\"ConversationNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"calledCollaborationRef\",\n  \t\t\t\ttype: \"Collaboration\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantAssociations\",\n  \t\t\t\ttype: \"ParticipantAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Conversation\",\n  \t\tsuperClass: [\n  \t\t\t\"ConversationNode\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"SubConversation\",\n  \t\tsuperClass: [\n  \t\t\t\"ConversationNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"conversationNodes\",\n  \t\t\t\ttype: \"ConversationNode\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ConversationNode\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"InteractionNode\",\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageFlowRefs\",\n  \t\t\t\ttype: \"MessageFlow\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"correlationKeys\",\n  \t\t\t\ttype: \"CorrelationKey\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalConversation\",\n  \t\tsuperClass: [\n  \t\t\t\"Collaboration\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"PartnerEntity\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"PartnerRole\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CorrelationProperty\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"correlationPropertyRetrievalExpression\",\n  \t\t\t\ttype: \"CorrelationPropertyRetrievalExpression\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"type\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Error\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"structureRef\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"errorCode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CorrelationKey\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"correlationPropertyRef\",\n  \t\t\t\ttype: \"CorrelationProperty\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Expression\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tisAbstract: false,\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"body\",\n  \t\t\t\tisBody: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"FormalExpression\",\n  \t\tsuperClass: [\n  \t\t\t\"Expression\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"language\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"evaluatesToTypeRef\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Message\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"itemRef\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ItemDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"itemKind\",\n  \t\t\t\ttype: \"ItemKind\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"structureRef\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isCollection\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"import\",\n  \t\t\t\ttype: \"Import\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"FlowElement\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"auditing\",\n  \t\t\t\ttype: \"Auditing\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"monitoring\",\n  \t\t\t\ttype: \"Monitoring\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"categoryValueRef\",\n  \t\t\t\ttype: \"CategoryValue\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"SequenceFlow\",\n  \t\tsuperClass: [\n  \t\t\t\"FlowElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"isImmediate\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"conditionExpression\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"sourceRef\",\n  \t\t\t\ttype: \"FlowNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetRef\",\n  \t\t\t\ttype: \"FlowNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"FlowElementsContainer\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"laneSets\",\n  \t\t\t\ttype: \"LaneSet\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"flowElements\",\n  \t\t\t\ttype: \"FlowElement\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CallableElement\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"ioSpecification\",\n  \t\t\t\ttype: \"InputOutputSpecification\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"property\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"supportedInterfaceRef\",\n  \t\t\t\ttype: \"Interface\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"ioBinding\",\n  \t\t\t\ttype: \"InputOutputBinding\",\n  \t\t\t\tisMany: true,\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"property\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"FlowNode\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"FlowElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"incoming\",\n  \t\t\t\ttype: \"SequenceFlow\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outgoing\",\n  \t\t\t\ttype: \"SequenceFlow\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"lanes\",\n  \t\t\t\ttype: \"Lane\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CorrelationPropertyRetrievalExpression\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"messagePath\",\n  \t\t\t\ttype: \"FormalExpression\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CorrelationPropertyBinding\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"dataPath\",\n  \t\t\t\ttype: \"FormalExpression\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"correlationPropertyRef\",\n  \t\t\t\ttype: \"CorrelationProperty\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Resource\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"resourceParameters\",\n  \t\t\t\ttype: \"ResourceParameter\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ResourceParameter\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isRequired\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"type\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CorrelationSubscription\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"correlationKeyRef\",\n  \t\t\t\ttype: \"CorrelationKey\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"correlationPropertyBinding\",\n  \t\t\t\ttype: \"CorrelationPropertyBinding\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"MessageFlow\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"sourceRef\",\n  \t\t\t\ttype: \"InteractionNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetRef\",\n  \t\t\t\ttype: \"InteractionNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"MessageFlowAssociation\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"innerMessageFlowRef\",\n  \t\t\t\ttype: \"MessageFlow\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outerMessageFlowRef\",\n  \t\t\t\ttype: \"MessageFlow\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"InteractionNode\",\n  \t\tisAbstract: true,\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"incomingConversationLinks\",\n  \t\t\t\ttype: \"ConversationLink\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outgoingConversationLinks\",\n  \t\t\t\ttype: \"ConversationLink\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Participant\",\n  \t\tsuperClass: [\n  \t\t\t\"InteractionNode\",\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"interfaceRef\",\n  \t\t\t\ttype: \"Interface\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantMultiplicity\",\n  \t\t\t\ttype: \"ParticipantMultiplicity\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"endPointRefs\",\n  \t\t\t\ttype: \"EndPoint\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"processRef\",\n  \t\t\t\ttype: \"Process\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ParticipantAssociation\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"innerParticipantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outerParticipantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ParticipantMultiplicity\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"minimum\",\n  \t\t\t\t\"default\": 0,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Integer\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"maximum\",\n  \t\t\t\t\"default\": 1,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Integer\"\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Collaboration\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isClosed\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participants\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageFlows\",\n  \t\t\t\ttype: \"MessageFlow\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"artifacts\",\n  \t\t\t\ttype: \"Artifact\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"conversations\",\n  \t\t\t\ttype: \"ConversationNode\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"conversationAssociations\",\n  \t\t\t\ttype: \"ConversationAssociation\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantAssociations\",\n  \t\t\t\ttype: \"ParticipantAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageFlowAssociations\",\n  \t\t\t\ttype: \"MessageFlowAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"correlationKeys\",\n  \t\t\t\ttype: \"CorrelationKey\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"choreographyRef\",\n  \t\t\t\ttype: \"Choreography\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"conversationLinks\",\n  \t\t\t\ttype: \"ConversationLink\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ChoreographyActivity\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"FlowNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"participantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"initiatingParticipantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"correlationKeys\",\n  \t\t\t\ttype: \"CorrelationKey\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopType\",\n  \t\t\t\ttype: \"ChoreographyLoopType\",\n  \t\t\t\t\"default\": \"None\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CallChoreography\",\n  \t\tsuperClass: [\n  \t\t\t\"ChoreographyActivity\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"calledChoreographyRef\",\n  \t\t\t\ttype: \"Choreography\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantAssociations\",\n  \t\t\t\ttype: \"ParticipantAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"SubChoreography\",\n  \t\tsuperClass: [\n  \t\t\t\"ChoreographyActivity\",\n  \t\t\t\"FlowElementsContainer\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"artifacts\",\n  \t\t\t\ttype: \"Artifact\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ChoreographyTask\",\n  \t\tsuperClass: [\n  \t\t\t\"ChoreographyActivity\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"messageFlowRef\",\n  \t\t\t\ttype: \"MessageFlow\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Choreography\",\n  \t\tsuperClass: [\n  \t\t\t\"Collaboration\",\n  \t\t\t\"FlowElementsContainer\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalChoreographyTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Choreography\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"initiatingParticipantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"TextAnnotation\",\n  \t\tsuperClass: [\n  \t\t\t\"Artifact\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"text\",\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"textFormat\",\n  \t\t\t\t\"default\": \"text/plain\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Group\",\n  \t\tsuperClass: [\n  \t\t\t\"Artifact\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"categoryValueRef\",\n  \t\t\t\ttype: \"CategoryValue\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Association\",\n  \t\tsuperClass: [\n  \t\t\t\"Artifact\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"associationDirection\",\n  \t\t\t\ttype: \"AssociationDirection\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"sourceRef\",\n  \t\t\t\ttype: \"BaseElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetRef\",\n  \t\t\t\ttype: \"BaseElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Category\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"categoryValue\",\n  \t\t\t\ttype: \"CategoryValue\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Artifact\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CategoryValue\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"categorizedFlowElements\",\n  \t\t\t\ttype: \"FlowElement\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"value\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Activity\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"FlowNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"isForCompensation\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"default\",\n  \t\t\t\ttype: \"SequenceFlow\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"ioSpecification\",\n  \t\t\t\ttype: \"InputOutputSpecification\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"property\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"boundaryEventRefs\",\n  \t\t\t\ttype: \"BoundaryEvent\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"properties\",\n  \t\t\t\ttype: \"Property\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataInputAssociations\",\n  \t\t\t\ttype: \"DataInputAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataOutputAssociations\",\n  \t\t\t\ttype: \"DataOutputAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"startQuantity\",\n  \t\t\t\t\"default\": 1,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Integer\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"resources\",\n  \t\t\t\ttype: \"ResourceRole\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"completionQuantity\",\n  \t\t\t\t\"default\": 1,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Integer\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopCharacteristics\",\n  \t\t\t\ttype: \"LoopCharacteristics\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ServiceTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"operationRef\",\n  \t\t\t\ttype: \"Operation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"SubProcess\",\n  \t\tsuperClass: [\n  \t\t\t\"Activity\",\n  \t\t\t\"FlowElementsContainer\",\n  \t\t\t\"InteractionNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"triggeredByEvent\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"artifacts\",\n  \t\t\t\ttype: \"Artifact\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"LoopCharacteristics\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"MultiInstanceLoopCharacteristics\",\n  \t\tsuperClass: [\n  \t\t\t\"LoopCharacteristics\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"isSequential\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"behavior\",\n  \t\t\t\ttype: \"MultiInstanceBehavior\",\n  \t\t\t\t\"default\": \"All\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopCardinality\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopDataInputRef\",\n  \t\t\t\ttype: \"ItemAwareElement\",\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopDataOutputRef\",\n  \t\t\t\ttype: \"ItemAwareElement\",\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputDataItem\",\n  \t\t\t\ttype: \"DataInput\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"property\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputDataItem\",\n  \t\t\t\ttype: \"DataOutput\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"property\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"complexBehaviorDefinition\",\n  \t\t\t\ttype: \"ComplexBehaviorDefinition\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"completionCondition\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"oneBehaviorEventRef\",\n  \t\t\t\ttype: \"EventDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"noneBehaviorEventRef\",\n  \t\t\t\ttype: \"EventDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"StandardLoopCharacteristics\",\n  \t\tsuperClass: [\n  \t\t\t\"LoopCharacteristics\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"testBefore\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopCondition\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopMaximum\",\n  \t\t\t\ttype: \"Integer\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CallActivity\",\n  \t\tsuperClass: [\n  \t\t\t\"Activity\",\n  \t\t\t\"InteractionNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"calledElement\",\n  \t\t\t\ttype: \"String\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Task\",\n  \t\tsuperClass: [\n  \t\t\t\"Activity\",\n  \t\t\t\"InteractionNode\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"SendTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"operationRef\",\n  \t\t\t\ttype: \"Operation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ReceiveTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"instantiate\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"operationRef\",\n  \t\t\t\ttype: \"Operation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ScriptTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"scriptFormat\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"script\",\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BusinessRuleTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"AdHocSubProcess\",\n  \t\tsuperClass: [\n  \t\t\t\"SubProcess\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"completionCondition\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"ordering\",\n  \t\t\t\ttype: \"AdHocOrdering\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"cancelRemainingInstances\",\n  \t\t\t\t\"default\": true,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Transaction\",\n  \t\tsuperClass: [\n  \t\t\t\"SubProcess\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"protocol\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"method\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalScriptTask\",\n  \t\tsuperClass: [\n  \t\t\t\"GlobalTask\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"scriptLanguage\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"script\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalBusinessRuleTask\",\n  \t\tsuperClass: [\n  \t\t\t\"GlobalTask\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ComplexBehaviorDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"condition\",\n  \t\t\t\ttype: \"FormalExpression\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"event\",\n  \t\t\t\ttype: \"ImplicitThrowEvent\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ResourceRole\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"resourceRef\",\n  \t\t\t\ttype: \"Resource\",\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"resourceParameterBindings\",\n  \t\t\t\ttype: \"ResourceParameterBinding\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"resourceAssignmentExpression\",\n  \t\t\t\ttype: \"ResourceAssignmentExpression\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ResourceParameterBinding\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"expression\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"parameterRef\",\n  \t\t\t\ttype: \"ResourceParameter\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ResourceAssignmentExpression\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"expression\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Import\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"importType\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"location\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"namespace\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Definitions\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetNamespace\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"expressionLanguage\",\n  \t\t\t\t\"default\": \"http://www.w3.org/1999/XPath\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"typeLanguage\",\n  \t\t\t\t\"default\": \"http://www.w3.org/2001/XMLSchema\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"imports\",\n  \t\t\t\ttype: \"Import\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extensions\",\n  \t\t\t\ttype: \"Extension\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"rootElements\",\n  \t\t\t\ttype: \"RootElement\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"diagrams\",\n  \t\t\t\tisMany: true,\n  \t\t\t\ttype: \"bpmndi:BPMNDiagram\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"exporter\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"relationships\",\n  \t\t\t\ttype: \"Relationship\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"exporterVersion\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var enumerations$3 = [\n  \t{\n  \t\tname: \"ProcessType\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"None\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Public\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Private\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GatewayDirection\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"Unspecified\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Converging\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Diverging\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Mixed\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"EventBasedGatewayType\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"Parallel\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Exclusive\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"RelationshipDirection\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"None\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Forward\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Backward\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Both\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ItemKind\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"Physical\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Information\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ChoreographyLoopType\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"None\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Standard\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"MultiInstanceSequential\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"MultiInstanceParallel\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"AssociationDirection\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"None\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"One\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Both\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"MultiInstanceBehavior\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"None\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"One\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"All\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Complex\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"AdHocOrdering\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"Parallel\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Sequential\"\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var xml$1 = {\n  \ttagAlias: \"lowerCase\",\n  \ttypePrefix: \"t\"\n  };\n  var BpmnPackage = {\n  \tname: name$5,\n  \turi: uri$5,\n  \tprefix: prefix$5,\n  \tassociations: associations$5,\n  \ttypes: types$5,\n  \tenumerations: enumerations$3,\n  \txml: xml$1\n  };\n\n  var name$4 = \"BPMNDI\";\n  var uri$4 = \"http://www.omg.org/spec/BPMN/20100524/DI\";\n  var prefix$4 = \"bpmndi\";\n  var types$4 = [\n  \t{\n  \t\tname: \"BPMNDiagram\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"plane\",\n  \t\t\t\ttype: \"BPMNPlane\",\n  \t\t\t\tredefines: \"di:Diagram#rootElement\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"labelStyle\",\n  \t\t\t\ttype: \"BPMNLabelStyle\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"di:Diagram\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BPMNPlane\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"bpmnElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"bpmn:BaseElement\",\n  \t\t\t\tredefines: \"di:DiagramElement#modelElement\"\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"di:Plane\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BPMNShape\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"bpmnElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"bpmn:BaseElement\",\n  \t\t\t\tredefines: \"di:DiagramElement#modelElement\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isHorizontal\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isExpanded\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isMarkerVisible\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"label\",\n  \t\t\t\ttype: \"BPMNLabel\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isMessageVisible\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantBandKind\",\n  \t\t\t\ttype: \"ParticipantBandKind\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"choreographyActivityShape\",\n  \t\t\t\ttype: \"BPMNShape\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"di:LabeledShape\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BPMNEdge\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"label\",\n  \t\t\t\ttype: \"BPMNLabel\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"bpmnElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"bpmn:BaseElement\",\n  \t\t\t\tredefines: \"di:DiagramElement#modelElement\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"sourceElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"di:DiagramElement\",\n  \t\t\t\tredefines: \"di:Edge#source\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"di:DiagramElement\",\n  \t\t\t\tredefines: \"di:Edge#target\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageVisibleKind\",\n  \t\t\t\ttype: \"MessageVisibleKind\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\t\"default\": \"initiating\"\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"di:LabeledEdge\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BPMNLabel\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"labelStyle\",\n  \t\t\t\ttype: \"BPMNLabelStyle\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\tredefines: \"di:DiagramElement#style\"\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"di:Label\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BPMNLabelStyle\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"font\",\n  \t\t\t\ttype: \"dc:Font\"\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"di:Style\"\n  \t\t]\n  \t}\n  ];\n  var enumerations$2 = [\n  \t{\n  \t\tname: \"ParticipantBandKind\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"top_initiating\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"middle_initiating\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"bottom_initiating\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"top_non_initiating\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"middle_non_initiating\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"bottom_non_initiating\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"MessageVisibleKind\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"initiating\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"non_initiating\"\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var associations$4 = [\n  ];\n  var BpmnDiPackage = {\n  \tname: name$4,\n  \turi: uri$4,\n  \tprefix: prefix$4,\n  \ttypes: types$4,\n  \tenumerations: enumerations$2,\n  \tassociations: associations$4\n  };\n\n  var name$3 = \"DC\";\n  var uri$3 = \"http://www.omg.org/spec/DD/20100524/DC\";\n  var prefix$3 = \"dc\";\n  var types$3 = [\n  \t{\n  \t\tname: \"Boolean\"\n  \t},\n  \t{\n  \t\tname: \"Integer\"\n  \t},\n  \t{\n  \t\tname: \"Real\"\n  \t},\n  \t{\n  \t\tname: \"String\"\n  \t},\n  \t{\n  \t\tname: \"Font\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\ttype: \"String\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"size\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isBold\",\n  \t\t\t\ttype: \"Boolean\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isItalic\",\n  \t\t\t\ttype: \"Boolean\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isUnderline\",\n  \t\t\t\ttype: \"Boolean\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isStrikeThrough\",\n  \t\t\t\ttype: \"Boolean\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Point\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"x\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\t\"default\": \"0\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"y\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\t\"default\": \"0\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Bounds\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"x\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\t\"default\": \"0\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"y\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\t\"default\": \"0\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"width\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"height\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var associations$3 = [\n  ];\n  var DcPackage = {\n  \tname: name$3,\n  \turi: uri$3,\n  \tprefix: prefix$3,\n  \ttypes: types$3,\n  \tassociations: associations$3\n  };\n\n  var name$2 = \"DI\";\n  var uri$2 = \"http://www.omg.org/spec/DD/20100524/DI\";\n  var prefix$2 = \"di\";\n  var types$2 = [\n  \t{\n  \t\tname: \"DiagramElement\",\n  \t\tisAbstract: true,\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"id\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisId: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extension\",\n  \t\t\t\ttype: \"Extension\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"owningDiagram\",\n  \t\t\t\ttype: \"Diagram\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"owningElement\",\n  \t\t\t\ttype: \"DiagramElement\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"modelElement\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"Element\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"style\",\n  \t\t\t\ttype: \"Style\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"ownedElement\",\n  \t\t\t\ttype: \"DiagramElement\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Node\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"DiagramElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Edge\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"DiagramElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"source\",\n  \t\t\t\ttype: \"DiagramElement\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"target\",\n  \t\t\t\ttype: \"DiagramElement\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"waypoint\",\n  \t\t\t\tisUnique: false,\n  \t\t\t\tisMany: true,\n  \t\t\t\ttype: \"dc:Point\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Diagram\",\n  \t\tisAbstract: true,\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"id\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisId: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"rootElement\",\n  \t\t\t\ttype: \"DiagramElement\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"documentation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"resolution\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Real\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"ownedStyle\",\n  \t\t\t\ttype: \"Style\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Shape\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Node\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"bounds\",\n  \t\t\t\ttype: \"dc:Bounds\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Plane\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Node\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"planeElement\",\n  \t\t\t\ttype: \"DiagramElement\",\n  \t\t\t\tsubsettedProperty: \"DiagramElement-ownedElement\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"LabeledEdge\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Edge\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"ownedLabel\",\n  \t\t\t\ttype: \"Label\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tsubsettedProperty: \"DiagramElement-ownedElement\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"LabeledShape\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Shape\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"ownedLabel\",\n  \t\t\t\ttype: \"Label\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tsubsettedProperty: \"DiagramElement-ownedElement\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Label\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Node\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"bounds\",\n  \t\t\t\ttype: \"dc:Bounds\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Style\",\n  \t\tisAbstract: true,\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"id\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisId: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Extension\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"values\",\n  \t\t\t\tisMany: true,\n  \t\t\t\ttype: \"Element\"\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var associations$2 = [\n  ];\n  var xml = {\n  \ttagAlias: \"lowerCase\"\n  };\n  var DiPackage = {\n  \tname: name$2,\n  \turi: uri$2,\n  \tprefix: prefix$2,\n  \ttypes: types$2,\n  \tassociations: associations$2,\n  \txml: xml\n  };\n\n  var name$1 = \"bpmn.io colors for BPMN\";\n  var uri$1 = \"http://bpmn.io/schema/bpmn/biocolor/1.0\";\n  var prefix$1 = \"bioc\";\n  var types$1 = [\n  \t{\n  \t\tname: \"ColoredShape\",\n  \t\t\"extends\": [\n  \t\t\t\"bpmndi:BPMNShape\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"stroke\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"fill\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ColoredEdge\",\n  \t\t\"extends\": [\n  \t\t\t\"bpmndi:BPMNEdge\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"stroke\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"fill\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var enumerations$1 = [\n  ];\n  var associations$1 = [\n  ];\n  var BiocPackage = {\n  \tname: name$1,\n  \turi: uri$1,\n  \tprefix: prefix$1,\n  \ttypes: types$1,\n  \tenumerations: enumerations$1,\n  \tassociations: associations$1\n  };\n\n  var name = \"BPMN in Color\";\n  var uri = \"http://www.omg.org/spec/BPMN/non-normative/color/1.0\";\n  var prefix = \"color\";\n  var types = [\n  \t{\n  \t\tname: \"ColoredLabel\",\n  \t\t\"extends\": [\n  \t\t\t\"bpmndi:BPMNLabel\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"color\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ColoredShape\",\n  \t\t\"extends\": [\n  \t\t\t\"bpmndi:BPMNShape\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"background-color\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"border-color\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ColoredEdge\",\n  \t\t\"extends\": [\n  \t\t\t\"bpmndi:BPMNEdge\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"border-color\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var enumerations = [\n  ];\n  var associations = [\n  ];\n  var BpmnInColorPackage = {\n  \tname: name,\n  \turi: uri,\n  \tprefix: prefix,\n  \ttypes: types,\n  \tenumerations: enumerations,\n  \tassociations: associations\n  };\n\n  var packages = {\n    bpmn: BpmnPackage,\n    bpmndi: BpmnDiPackage,\n    dc: DcPackage,\n    di: DiPackage,\n    bioc: BiocPackage,\n    color: BpmnInColorPackage\n  };\n\n  function simple(additionalPackages, options) {\n    var pks = assign$1({}, packages, additionalPackages);\n\n    return new BpmnModdle(pks, options);\n  }\n\n  /**\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   */\n\n  // TODO(nikku): remove with future bpmn-js version\n\n  /**\n   * Wraps APIs to check:\n   *\n   * 1) If a callback is passed -> Warn users about callback deprecation.\n   * 2) If Promise class is implemented in current environment.\n   *\n   * @private\n   *\n   * @param {Function} api\n   *\n   * @return {Function}\n   */\n  function wrapForCompatibility(api) {\n\n    return function() {\n\n      if (!window.Promise) {\n        throw new Error('Promises is not supported in this environment. Please polyfill Promise.');\n      }\n\n      var argLen = arguments.length;\n      if (argLen >= 1 && isFunction(arguments[argLen - 1])) {\n\n        var callback = arguments[argLen - 1];\n\n        console.warn(new Error(\n          'Passing callbacks to ' + api.name + ' is deprecated and will be removed in a future major release. ' +\n          'Please switch to promises: https://bpmn.io/l/moving-to-promises.html'\n        ));\n\n        var argsWithoutCallback = Array.prototype.slice.call(arguments, 0, -1);\n\n        api.apply(this, argsWithoutCallback).then(function(result) {\n\n          var firstKey = Object.keys(result)[0];\n\n          // The APIs we are wrapping all resolve a single item depending on the API.\n          // For instance, importXML resolves { warnings } and saveXML returns { xml }.\n          // That's why we can call the callback with the first item of result.\n          return callback(null, result[firstKey]);\n\n          // Passing a second paramter instead of catch because we don't want to\n          // catch errors thrown by callback().\n        }, function(err) {\n\n          return callback(err, err.warnings);\n        });\n      } else {\n\n        return api.apply(this, arguments);\n      }\n    };\n  }\n\n\n  // TODO(nikku): remove with future bpmn-js version\n\n  var DI_ERROR_MESSAGE = 'Tried to access di from the businessObject. The di is available through the diagram element only. For more information, see https://github.com/bpmn-io/bpmn-js/issues/1472';\n\n  /**\n   * @private\n   *\n   * @param {ModdleElement} businessObject\n   */\n  function ensureCompatDiRef(businessObject) {\n\n    // bpmnElement can have multiple independent DIs\n    if (!has$1(businessObject, 'di')) {\n      Object.defineProperty(businessObject, 'di', {\n        enumerable: false,\n        get: function() {\n          throw new Error(DI_ERROR_MESSAGE);\n        }\n      });\n    }\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n   *\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   */\n\n  /**\n   * Returns true if an element is of the given meta-model type.\n   *\n   * @param {ModdleElement} element\n   * @param {string} type\n   *\n   * @return {boolean}\n   */\n  function is(element, type) {\n    return element.$instanceOf(type);\n  }\n\n\n  /**\n   * Find a suitable display candidate for definitions where the DI does not\n   * correctly specify one.\n   *\n   * @param {ModdleElement} definitions\n   *\n   * @return {ModdleElement}\n   */\n  function findDisplayCandidate(definitions) {\n    return find(definitions.rootElements, function(e) {\n      return is(e, 'bpmn:Process') || is(e, 'bpmn:Collaboration');\n    });\n  }\n\n  /**\n   * @param {Record<'element' | 'root' | 'error', Function>} handler\n   * @param {Translate} translate\n   */\n  function BpmnTreeWalker(handler, translate) {\n\n    // list of containers already walked\n    var handledElements = {};\n\n    // list of elements to handle deferred to ensure\n    // prerequisites are drawn\n    var deferred = [];\n\n    var diMap = {};\n\n    // Helpers //////////////////////\n\n    function contextual(fn, ctx) {\n      return function(e) {\n        fn(e, ctx);\n      };\n    }\n\n    function handled(element) {\n      handledElements[element.id] = element;\n    }\n\n    function isHandled(element) {\n      return handledElements[element.id];\n    }\n\n    function visit(element, ctx) {\n\n      var gfx = element.gfx;\n\n      // avoid multiple rendering of elements\n      if (gfx) {\n        throw new Error(\n          translate('already rendered {element}', { element: elementToString(element) })\n        );\n      }\n\n      // call handler\n      return handler.element(element, diMap[element.id], ctx);\n    }\n\n    function visitRoot(element, diagram) {\n      return handler.root(element, diMap[element.id], diagram);\n    }\n\n    function visitIfDi(element, ctx) {\n\n      try {\n        var gfx = diMap[element.id] && visit(element, ctx);\n\n        handled(element);\n\n        return gfx;\n      } catch (e) {\n        logError(e.message, { element: element, error: e });\n\n        console.error(translate('failed to import {element}', { element: elementToString(element) }));\n        console.error(e);\n      }\n    }\n\n    function logError(message, context) {\n      handler.error(message, context);\n    }\n\n    // DI handling //////////////////////\n\n    var registerDi = this.registerDi = function registerDi(di) {\n      var bpmnElement = di.bpmnElement;\n\n      if (bpmnElement) {\n        if (diMap[bpmnElement.id]) {\n          logError(\n            translate('multiple DI elements defined for {element}', {\n              element: elementToString(bpmnElement)\n            }),\n            { element: bpmnElement }\n          );\n        } else {\n          diMap[bpmnElement.id] = di;\n\n          ensureCompatDiRef(bpmnElement);\n        }\n      } else {\n        logError(\n          translate('no bpmnElement referenced in {element}', {\n            element: elementToString(di)\n          }),\n          { element: di }\n        );\n      }\n    };\n\n    function handleDiagram(diagram) {\n      handlePlane(diagram.plane);\n    }\n\n    function handlePlane(plane) {\n      registerDi(plane);\n\n      forEach$1(plane.planeElement, handlePlaneElement);\n    }\n\n    function handlePlaneElement(planeElement) {\n      registerDi(planeElement);\n    }\n\n\n    // Semantic handling //////////////////////\n\n    /**\n     * Handle definitions and return the rendered diagram (if any).\n     *\n     * @param {ModdleElement} definitions to walk and import\n     * @param {ModdleElement} [diagram] specific diagram to import and display\n     *\n     * @throws {Error} if no diagram to display could be found\n     */\n    this.handleDefinitions = function handleDefinitions(definitions, diagram) {\n\n      // make sure we walk the correct bpmnElement\n\n      var diagrams = definitions.diagrams;\n\n      if (diagram && diagrams.indexOf(diagram) === -1) {\n        throw new Error(translate('diagram not part of bpmn:Definitions'));\n      }\n\n      if (!diagram && diagrams && diagrams.length) {\n        diagram = diagrams[0];\n      }\n\n      // no diagram -> nothing to import\n      if (!diagram) {\n        throw new Error(translate('no diagram to display'));\n      }\n\n      // load DI from selected diagram only\n      diMap = {};\n      handleDiagram(diagram);\n\n\n      var plane = diagram.plane;\n\n      if (!plane) {\n        throw new Error(translate(\n          'no plane for {element}',\n          { element: elementToString(diagram) }\n        ));\n      }\n\n      var rootElement = plane.bpmnElement;\n\n      // ensure we default to a suitable display candidate (process or collaboration),\n      // even if non is specified in DI\n      if (!rootElement) {\n        rootElement = findDisplayCandidate(definitions);\n\n        if (!rootElement) {\n          throw new Error(translate('no process or collaboration to display'));\n        } else {\n\n          logError(\n            translate('correcting missing bpmnElement on {plane} to {rootElement}', {\n              plane: elementToString(plane),\n              rootElement: elementToString(rootElement)\n            })\n          );\n\n          // correct DI on the fly\n          plane.bpmnElement = rootElement;\n          registerDi(plane);\n        }\n      }\n\n\n      var ctx = visitRoot(rootElement, plane);\n\n      if (is(rootElement, 'bpmn:Process') || is(rootElement, 'bpmn:SubProcess')) {\n        handleProcess(rootElement, ctx);\n      } else if (is(rootElement, 'bpmn:Collaboration')) {\n        handleCollaboration(rootElement, ctx);\n\n        // force drawing of everything not yet drawn that is part of the target DI\n        handleUnhandledProcesses(definitions.rootElements, ctx);\n      } else {\n        throw new Error(\n          translate('unsupported bpmnElement for {plane}: {rootElement}', {\n            plane: elementToString(plane),\n            rootElement: elementToString(rootElement)\n          })\n        );\n      }\n\n      // handle all deferred elements\n      handleDeferred(deferred);\n    };\n\n    var handleDeferred = this.handleDeferred = function handleDeferred() {\n\n      var fn;\n\n      // drain deferred until empty\n      while (deferred.length) {\n        fn = deferred.shift();\n\n        fn();\n      }\n    };\n\n    function handleProcess(process, context) {\n      handleFlowElementsContainer(process, context);\n      handleIoSpecification(process.ioSpecification, context);\n\n      handleArtifacts(process.artifacts, context);\n\n      // log process handled\n      handled(process);\n    }\n\n    function handleUnhandledProcesses(rootElements, ctx) {\n\n      // walk through all processes that have not yet been drawn and draw them\n      // if they contain lanes with DI information.\n      // we do this to pass the free-floating lane test cases in the MIWG test suite\n      var processes = filter(rootElements, function(e) {\n        return !isHandled(e) && is(e, 'bpmn:Process') && e.laneSets;\n      });\n\n      processes.forEach(contextual(handleProcess, ctx));\n    }\n\n    function handleMessageFlow(messageFlow, context) {\n      visitIfDi(messageFlow, context);\n    }\n\n    function handleMessageFlows(messageFlows, context) {\n      forEach$1(messageFlows, contextual(handleMessageFlow, context));\n    }\n\n    function handleDataAssociation(association, context) {\n      visitIfDi(association, context);\n    }\n\n    function handleDataInput(dataInput, context) {\n      visitIfDi(dataInput, context);\n    }\n\n    function handleDataOutput(dataOutput, context) {\n      visitIfDi(dataOutput, context);\n    }\n\n    function handleArtifact(artifact, context) {\n\n      // bpmn:TextAnnotation\n      // bpmn:Group\n      // bpmn:Association\n\n      visitIfDi(artifact, context);\n    }\n\n    function handleArtifacts(artifacts, context) {\n\n      forEach$1(artifacts, function(e) {\n        if (is(e, 'bpmn:Association')) {\n          deferred.push(function() {\n            handleArtifact(e, context);\n          });\n        } else {\n          handleArtifact(e, context);\n        }\n      });\n    }\n\n    function handleIoSpecification(ioSpecification, context) {\n\n      if (!ioSpecification) {\n        return;\n      }\n\n      forEach$1(ioSpecification.dataInputs, contextual(handleDataInput, context));\n      forEach$1(ioSpecification.dataOutputs, contextual(handleDataOutput, context));\n    }\n\n    var handleSubProcess = this.handleSubProcess = function handleSubProcess(subProcess, context) {\n      handleFlowElementsContainer(subProcess, context);\n      handleArtifacts(subProcess.artifacts, context);\n    };\n\n    function handleFlowNode(flowNode, context) {\n      var childCtx = visitIfDi(flowNode, context);\n\n      if (is(flowNode, 'bpmn:SubProcess')) {\n        handleSubProcess(flowNode, childCtx || context);\n      }\n\n      if (is(flowNode, 'bpmn:Activity')) {\n        handleIoSpecification(flowNode.ioSpecification, context);\n      }\n\n      // defer handling of associations\n      // affected types:\n      //\n      //   * bpmn:Activity\n      //   * bpmn:ThrowEvent\n      //   * bpmn:CatchEvent\n      //\n      deferred.push(function() {\n        forEach$1(flowNode.dataInputAssociations, contextual(handleDataAssociation, context));\n        forEach$1(flowNode.dataOutputAssociations, contextual(handleDataAssociation, context));\n      });\n    }\n\n    function handleSequenceFlow(sequenceFlow, context) {\n      visitIfDi(sequenceFlow, context);\n    }\n\n    function handleDataElement(dataObject, context) {\n      visitIfDi(dataObject, context);\n    }\n\n    function handleLane(lane, context) {\n\n      deferred.push(function() {\n\n        var newContext = visitIfDi(lane, context);\n\n        if (lane.childLaneSet) {\n          handleLaneSet(lane.childLaneSet, newContext || context);\n        }\n\n        wireFlowNodeRefs(lane);\n      });\n    }\n\n    function handleLaneSet(laneSet, context) {\n      forEach$1(laneSet.lanes, contextual(handleLane, context));\n    }\n\n    function handleLaneSets(laneSets, context) {\n      forEach$1(laneSets, contextual(handleLaneSet, context));\n    }\n\n    function handleFlowElementsContainer(container, context) {\n      handleFlowElements(container.flowElements, context);\n\n      if (container.laneSets) {\n        handleLaneSets(container.laneSets, context);\n      }\n    }\n\n    function handleFlowElements(flowElements, context) {\n      forEach$1(flowElements, function(e) {\n        if (is(e, 'bpmn:SequenceFlow')) {\n          deferred.push(function() {\n            handleSequenceFlow(e, context);\n          });\n        } else if (is(e, 'bpmn:BoundaryEvent')) {\n          deferred.unshift(function() {\n            handleFlowNode(e, context);\n          });\n        } else if (is(e, 'bpmn:FlowNode')) {\n          handleFlowNode(e, context);\n        } else if (is(e, 'bpmn:DataObject')) ; else if (is(e, 'bpmn:DataStoreReference')) {\n          handleDataElement(e, context);\n        } else if (is(e, 'bpmn:DataObjectReference')) {\n          handleDataElement(e, context);\n        } else {\n          logError(\n            translate('unrecognized flowElement {element} in context {context}', {\n              element: elementToString(e),\n              context: (context ? elementToString(context.businessObject) : 'null')\n            }),\n            { element: e, context: context }\n          );\n        }\n      });\n    }\n\n    function handleParticipant(participant, context) {\n      var newCtx = visitIfDi(participant, context);\n\n      var process = participant.processRef;\n      if (process) {\n        handleProcess(process, newCtx || context);\n      }\n    }\n\n    function handleCollaboration(collaboration, context) {\n\n      forEach$1(collaboration.participants, contextual(handleParticipant, context));\n\n      handleArtifacts(collaboration.artifacts, context);\n\n      // handle message flows latest in the process\n      deferred.push(function() {\n        handleMessageFlows(collaboration.messageFlows, context);\n      });\n    }\n\n\n    function wireFlowNodeRefs(lane) {\n\n      // wire the virtual flowNodeRefs <-> relationship\n      forEach$1(lane.flowNodeRef, function(flowNode) {\n        var lanes = flowNode.get('lanes');\n\n        if (lanes) {\n          lanes.push(lane);\n        }\n      });\n    }\n  }\n\n  /**\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   *\n   * @typedef { {\n   *   warnings: string[];\n   * } } ImportBPMNDiagramResult\n   *\n   * @typedef {ImportBPMNDiagramResult & Error} ImportBPMNDiagramError\n   */\n\n  /**\n   * Import the definitions into a diagram.\n   *\n   * Errors and warnings are reported through the specified callback.\n   *\n   * @param {ModdleElement} diagram\n   * @param {ModdleElement} definitions\n   * @param {ModdleElement} [bpmnDiagram] The diagram to be rendered (if not\n   * provided, the first one will be rendered).\n   *\n   * @return {Promise<ImportBPMNDiagramResult>}\n   */\n  function importBpmnDiagram(diagram, definitions, bpmnDiagram) {\n\n    var importer,\n        eventBus,\n        translate,\n        canvas;\n\n    var error,\n        warnings = [];\n\n    /**\n     * Walk the diagram semantically, importing (=drawing)\n     * all elements you encounter.\n     *\n     * @param {ModdleElement} definitions\n     * @param {ModdleElement} bpmnDiagram\n     */\n    function render(definitions, bpmnDiagram) {\n\n      var visitor = {\n\n        root: function(element, di) {\n          return importer.add(element, di);\n        },\n\n        element: function(element, di, parentShape) {\n          return importer.add(element, di, parentShape);\n        },\n\n        error: function(message, context) {\n          warnings.push({ message: message, context: context });\n        }\n      };\n\n      var walker = new BpmnTreeWalker(visitor, translate);\n\n\n      bpmnDiagram = bpmnDiagram || (definitions.diagrams && definitions.diagrams[0]);\n\n      var diagramsToImport = getDiagramsToImport(definitions, bpmnDiagram);\n\n      if (!diagramsToImport) {\n        throw new Error(translate('no diagram to display'));\n      }\n\n      // traverse BPMN 2.0 document model,\n      // starting at definitions\n      forEach$1(diagramsToImport, function(diagram) {\n        walker.handleDefinitions(definitions, diagram);\n      });\n\n      var rootId = bpmnDiagram.plane.bpmnElement.id;\n\n      // we do need to account for different ways we create root elements\n      // each nested imported <root> do have the `_plane` suffix, while\n      // the root <root> is found under the business object ID\n      canvas.setRootElement(\n        canvas.findRoot(rootId + '_plane') || canvas.findRoot(rootId)\n      );\n    }\n\n    return new Promise(function(resolve, reject) {\n      try {\n        importer = diagram.get('bpmnImporter');\n        eventBus = diagram.get('eventBus');\n        translate = diagram.get('translate');\n        canvas = diagram.get('canvas');\n\n        eventBus.fire('import.render.start', { definitions: definitions });\n\n        render(definitions, bpmnDiagram);\n\n        eventBus.fire('import.render.complete', {\n          error: error,\n          warnings: warnings\n        });\n\n        return resolve({ warnings: warnings });\n      } catch (e) {\n\n        e.warnings = warnings;\n        return reject(e);\n      }\n    });\n  }\n\n  /**\n   * Returns all diagrams in the same hierarchy as the requested diagram.\n   * Includes all parent and sub process diagrams.\n   *\n   * @param {ModdleElement} definitions\n   * @param {ModdleElement} bpmnDiagram\n   *\n   * @return {ModdleElement[]}\n   */\n  function getDiagramsToImport(definitions, bpmnDiagram) {\n    if (!bpmnDiagram) {\n      return;\n    }\n\n    var bpmnElement = bpmnDiagram.plane.bpmnElement,\n        rootElement = bpmnElement;\n\n    if (!is$1(bpmnElement, 'bpmn:Process') && !is$1(bpmnElement, 'bpmn:Collaboration')) {\n      rootElement = findRootProcess(bpmnElement);\n    }\n\n    // in case the process is part of a collaboration, the plane references the\n    // collaboration, not the process\n    var collaboration;\n\n    if (is$1(rootElement, 'bpmn:Collaboration')) {\n      collaboration = rootElement;\n    } else {\n      collaboration = find(definitions.rootElements, function(element) {\n        if (!is$1(element, 'bpmn:Collaboration')) {\n          return;\n        }\n\n        return find(element.participants, function(participant) {\n          return participant.processRef === rootElement;\n        });\n      });\n    }\n\n    var rootElements = [ rootElement ];\n\n    // all collaboration processes can contain sub-diagrams\n    if (collaboration) {\n      rootElements = map$1(collaboration.participants, function(participant) {\n        return participant.processRef;\n      });\n\n      rootElements.push(collaboration);\n    }\n\n    var allChildren = selfAndAllFlowElements(rootElements);\n\n    // if we have multiple diagrams referencing the same element, we\n    // use the first in the file\n    var diagramsToImport = [ bpmnDiagram ];\n    var handledElements = [ bpmnElement ];\n\n    forEach$1(definitions.diagrams, function(diagram) {\n      var businessObject = diagram.plane.bpmnElement;\n\n      if (\n        allChildren.indexOf(businessObject) !== -1 &&\n        handledElements.indexOf(businessObject) === -1\n      ) {\n        diagramsToImport.push(diagram);\n        handledElements.push(businessObject);\n      }\n    });\n\n\n    return diagramsToImport;\n  }\n\n  function selfAndAllFlowElements(elements) {\n    var result = [];\n\n    forEach$1(elements, function(element) {\n      if (!element) {\n        return;\n      }\n\n      result.push(element);\n\n      result = result.concat(selfAndAllFlowElements(element.flowElements));\n    });\n\n    return result;\n  }\n\n  function findRootProcess(element) {\n    var parent = element;\n\n    while (parent) {\n      if (is$1(parent, 'bpmn:Process')) {\n        return parent;\n      }\n\n      parent = parent.$parent;\n    }\n  }\n\n  /**\n   * This file must not be changed or exchanged.\n   *\n   * @see http://bpmn.io/license for more information.\n   */\n\n\n  // inlined ../../resources/logo.svg\n  var BPMNIO_LOGO_SVG = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 14.02 5.57\" width=\"53\" height=\"21\"><path fill=\"currentColor\" d=\"M1.88.92v.14c0 .41-.13.68-.4.8.33.14.46.44.46.86v.33c0 .61-.33.95-.95.95H0V0h.95c.65 0 .93.3.93.92zM.63.57v1.06h.24c.24 0 .38-.1.38-.43V.98c0-.28-.1-.4-.32-.4zm0 1.63v1.22h.36c.2 0 .32-.1.32-.39v-.35c0-.37-.12-.48-.4-.48H.63zM4.18.99v.52c0 .64-.31.98-.94.98h-.3V4h-.62V0h.92c.63 0 .94.35.94.99zM2.94.57v1.35h.3c.2 0 .3-.09.3-.37v-.6c0-.29-.1-.38-.3-.38h-.3zm2.89 2.27L6.25 0h.88v4h-.6V1.12L6.1 3.99h-.6l-.46-2.82v2.82h-.55V0h.87zM8.14 1.1V4h-.56V0h.79L9 2.4V0h.56v4h-.64zm2.49 2.29v.6h-.6v-.6zM12.12 1c0-.63.33-1 .95-1 .61 0 .95.37.95 1v2.04c0 .64-.34 1-.95 1-.62 0-.95-.37-.95-1zm.62 2.08c0 .28.13.39.33.39s.32-.1.32-.4V.98c0-.29-.12-.4-.32-.4s-.33.11-.33.4z\"/><path fill=\"currentColor\" d=\"M0 4.53h14.02v1.04H0zM11.08 0h.63v.62h-.63zm.63 4V1h-.63v2.98z\"/></svg>';\n\n  var BPMNIO_IMG = BPMNIO_LOGO_SVG;\n\n  var LOGO_STYLES = {\n    verticalAlign: 'middle'\n  };\n\n  var LINK_STYLES = {\n    'color': '#404040'\n  };\n\n  var LIGHTBOX_STYLES = {\n    'zIndex': '1001',\n    'position': 'fixed',\n    'top': '0',\n    'left': '0',\n    'right': '0',\n    'bottom': '0'\n  };\n\n  var BACKDROP_STYLES = {\n    'width': '100%',\n    'height': '100%',\n    'background': 'rgba(40,40,40,0.2)'\n  };\n\n  var NOTICE_STYLES = {\n    'position': 'absolute',\n    'left': '50%',\n    'top': '40%',\n    'transform': 'translate(-50%)',\n    'width': '260px',\n    'padding': '10px',\n    'background': 'white',\n    'boxShadow': '0 1px 4px rgba(0,0,0,0.3)',\n    'fontFamily': 'Helvetica, Arial, sans-serif',\n    'fontSize': '14px',\n    'display': 'flex',\n    'lineHeight': '1.3'\n  };\n\n  var LIGHTBOX_MARKUP =\n    '<div class=\"bjs-powered-by-lightbox\">' +\n      '<div class=\"backdrop\"></div>' +\n      '<div class=\"notice\">' +\n        '<a href=\"https://bpmn.io\" target=\"_blank\" rel=\"noopener\" class=\"link\">' +\n          BPMNIO_IMG +\n        '</a>' +\n        '<span>' +\n          'Web-based tooling for BPMN, DMN and forms ' +\n          'powered by <a href=\"https://bpmn.io\" target=\"_blank\" rel=\"noopener\">bpmn.io</a>.' +\n        '</span>' +\n      '</div>' +\n    '</div>';\n\n\n  var lightbox;\n\n  function createLightbox() {\n    lightbox = domify$1(LIGHTBOX_MARKUP);\n\n    assign(lightbox, LIGHTBOX_STYLES);\n    assign(query('svg', lightbox), LOGO_STYLES);\n    assign(query('.backdrop', lightbox), BACKDROP_STYLES);\n    assign(query('.notice', lightbox), NOTICE_STYLES);\n    assign(query('.link', lightbox), LINK_STYLES, {\n      'margin': '15px 20px 15px 10px',\n      'alignSelf': 'center'\n    });\n  }\n\n  function open() {\n\n    if (!lightbox) {\n      createLightbox();\n\n      delegate.bind(lightbox, '.backdrop', 'click', function(event) {\n        document.body.removeChild(lightbox);\n      });\n    }\n\n    document.body.appendChild(lightbox);\n  }\n\n  /**\n   * The code in the <project-logo></project-logo> area\n   * must not be changed.\n   *\n   * @see http://bpmn.io/license for more information.\n   */\n\n  /**\n   * @template T\n   *\n   * @typedef {import('diagram-js/lib/core/EventBus').EventBusEventCallback<T>} EventBusEventCallback\n   */\n\n  /**\n   * @typedef {import('didi').ModuleDeclaration} ModuleDeclaration\n   *\n   * @typedef {import('./model/Types').Moddle} Moddle\n   * @typedef {import('./model/Types').ModdleElement} ModdleElement\n   * @typedef {import('./model/Types').ModdleExtension} ModdleExtension\n   *\n   * @typedef { {\n   *   width?: number|string;\n   *   height?: number|string;\n   *   position?: string;\n   *   container?: string|HTMLElement;\n   *   moddleExtensions?: ModdleExtensions;\n   *   additionalModules?: ModuleDeclaration[];\n   * } & Record<string, any> } BaseViewerOptions\n   *\n   * @typedef {Record<string, ModdleElement>} ModdleElementsById\n   *\n   * @typedef { {\n   *   [key: string]: ModdleExtension;\n   * } } ModdleExtensions\n   *\n   * @typedef { {\n   *   warnings: string[];\n   * } } ImportXMLResult\n   *\n   * @typedef {ImportXMLResult & Error} ImportXMLError\n   *\n   * @typedef {ImportXMLResult} ImportDefinitionsResult\n   *\n   * @typedef {ImportXMLError} ImportDefinitionsError\n   *\n   * @typedef {ImportXMLResult} OpenResult\n   *\n   * @typedef {ImportXMLError} OpenError\n   *\n   * @typedef { {\n   *   format?: boolean;\n   *   preamble?: boolean;\n   * } } SaveXMLOptions\n   *\n   * @typedef { {\n   *   xml?: string;\n   *   error?: Error;\n   * } } SaveXMLResult\n   *\n   * @typedef { {\n   *   svg: string;\n   * } } SaveSVGResult\n   *\n   * @typedef { {\n   *   xml: string;\n   * } } ImportParseStartEvent\n   *\n   * @typedef { {\n   *   error?: ImportXMLError;\n   *   definitions?: ModdleElement;\n   *   elementsById?: ModdleElementsById;\n   *   references?: ModdleElement[];\n   *   warnings: string[];\n   * } } ImportParseCompleteEvent\n   *\n   * @typedef { {\n   *   error?: ImportXMLError;\n   *   warnings: string[];\n   * } } ImportDoneEvent\n   *\n   * @typedef { {\n   *   definitions: ModdleElement;\n   * } } SaveXMLStartEvent\n   *\n   * @typedef {SaveXMLResult} SaveXMLDoneEvent\n   *\n   * @typedef { {\n   *   error?: Error;\n   *   svg: string;\n   * } } SaveSVGDoneEvent\n   */\n\n  /**\n   * A base viewer for BPMN 2.0 diagrams.\n   *\n   * Have a look at {@link Viewer}, {@link NavigatedViewer} or {@link Modeler} for\n   * bundles that include actual features.\n   *\n   * @param {BaseViewerOptions} [options] The options to configure the viewer.\n   */\n  function BaseViewer(options) {\n\n    /**\n     * @type {BaseViewerOptions}\n     */\n    options = assign$1({}, DEFAULT_OPTIONS, options);\n\n    /**\n     * @type {Moddle}\n     */\n    this._moddle = this._createModdle(options);\n\n    /**\n     * @type {HTMLElement}\n     */\n    this._container = this._createContainer(options);\n\n    /* <project-logo> */\n\n    addProjectLogo(this._container);\n\n    /* </project-logo> */\n\n    this._init(this._container, this._moddle, options);\n  }\n\n  e(BaseViewer, Diagram);\n\n  /**\n   * Parse and render a BPMN 2.0 diagram.\n   *\n   * Once finished the viewer reports back the result to the\n   * provided callback function with (err, warnings).\n   *\n   * ## Life-Cycle Events\n   *\n   * During import the viewer will fire life-cycle events:\n   *\n   *   * import.parse.start (about to read model from XML)\n   *   * import.parse.complete (model read; may have worked or not)\n   *   * import.render.start (graphical import start)\n   *   * import.render.complete (graphical import finished)\n   *   * import.done (everything done)\n   *\n   * You can use these events to hook into the life-cycle.\n   *\n   * @throws {ImportXMLError} An error thrown during the import of the XML.\n   *\n   * @fires BaseViewer#ImportParseStartEvent\n   * @fires BaseViewer#ImportParseCompleteEvent\n   * @fires Importer#ImportRenderStartEvent\n   * @fires Importer#ImportRenderCompleteEvent\n   * @fires BaseViewer#ImportDoneEvent\n   *\n   * @param {string} xml The BPMN 2.0 XML to be imported.\n   * @param {ModdleElement|string} [bpmnDiagram] The optional diagram or Id of the BPMN diagram to open.\n   *\n   * @return {Promise<ImportXMLResult>} A promise resolving with warnings that were produced during the import.\n   */\n  BaseViewer.prototype.importXML = async function importXML(xml, bpmnDiagram) {\n\n    const self = this;\n\n    function ParseCompleteEvent(data) {\n\n      const event = self.get('eventBus').createEvent(data);\n\n      // TODO(nikku): remove with future bpmn-js version\n      Object.defineProperty(event, 'context', {\n        enumerable: true,\n        get: function() {\n\n          console.warn(new Error(\n            'import.parse.complete <context> is deprecated ' +\n            'and will be removed in future library versions'\n          ));\n\n          return {\n            warnings: data.warnings,\n            references: data.references,\n            elementsById: data.elementsById\n          };\n        }\n      });\n\n      return event;\n    }\n\n    let aggregatedWarnings = [];\n    try {\n\n      // hook in pre-parse listeners +\n      // allow xml manipulation\n\n      /**\n       * A `import.parse.start` event.\n       *\n       * @event BaseViewer#ImportParseStartEvent\n       * @type {ImportParseStartEvent}\n       */\n      xml = this._emit('import.parse.start', { xml: xml }) || xml;\n\n      let parseResult;\n      try {\n        parseResult = await this._moddle.fromXML(xml, 'bpmn:Definitions');\n      } catch (error) {\n        this._emit('import.parse.complete', {\n          error\n        });\n\n        throw error;\n      }\n\n      let definitions = parseResult.rootElement;\n      const references = parseResult.references;\n      const parseWarnings = parseResult.warnings;\n      const elementsById = parseResult.elementsById;\n\n      aggregatedWarnings = aggregatedWarnings.concat(parseWarnings);\n\n      // hook in post parse listeners +\n      // allow definitions manipulation\n\n      /**\n       * A `import.parse.complete` event.\n       *\n       * @event BaseViewer#ImportParseCompleteEvent\n       * @type {ImportParseCompleteEvent}\n       */\n      definitions = this._emit('import.parse.complete', ParseCompleteEvent({\n        error: null,\n        definitions: definitions,\n        elementsById: elementsById,\n        references: references,\n        warnings: aggregatedWarnings\n      })) || definitions;\n\n      const importResult = await this.importDefinitions(definitions, bpmnDiagram);\n\n      aggregatedWarnings = aggregatedWarnings.concat(importResult.warnings);\n\n      /**\n       * A `import.parse.complete` event.\n       *\n       * @event BaseViewer#ImportDoneEvent\n       * @type {ImportDoneEvent}\n       */\n      this._emit('import.done', { error: null, warnings: aggregatedWarnings });\n\n      return { warnings: aggregatedWarnings };\n    } catch (err) {\n      let error = err;\n      aggregatedWarnings = aggregatedWarnings.concat(error.warnings || []);\n      addWarningsToError(error, aggregatedWarnings);\n\n      error = checkValidationError(error);\n\n      this._emit('import.done', { error, warnings: error.warnings });\n\n      throw error;\n    }\n  };\n\n  BaseViewer.prototype.importXML = wrapForCompatibility(BaseViewer.prototype.importXML);\n\n\n  /**\n   * Import parsed definitions and render a BPMN 2.0 diagram.\n   *\n   * Once finished the viewer reports back the result to the\n   * provided callback function with (err, warnings).\n   *\n   * ## Life-Cycle Events\n   *\n   * During import the viewer will fire life-cycle events:\n   *\n   *   * import.render.start (graphical import start)\n   *   * import.render.complete (graphical import finished)\n   *\n   * You can use these events to hook into the life-cycle.\n   *\n   * @throws {ImportDefinitionsError} An error thrown during the import of the definitions.\n   *\n   * @param {ModdleElement} definitions The definitions.\n   * @param {ModdleElement|string} [bpmnDiagram] The optional diagram or ID of the BPMN diagram to open.\n   *\n   * @return {Promise<ImportDefinitionsResult>} A promise resolving with warnings that were produced during the import.\n   */\n  BaseViewer.prototype.importDefinitions = async function importDefinitions(definitions, bpmnDiagram) {\n    this._setDefinitions(definitions);\n    const result = await this.open(bpmnDiagram);\n\n    return { warnings: result.warnings };\n  };\n\n  BaseViewer.prototype.importDefinitions = wrapForCompatibility(BaseViewer.prototype.importDefinitions);\n\n\n  /**\n   * Open diagram of previously imported XML.\n   *\n   * Once finished the viewer reports back the result to the\n   * provided callback function with (err, warnings).\n   *\n   * ## Life-Cycle Events\n   *\n   * During switch the viewer will fire life-cycle events:\n   *\n   *   * import.render.start (graphical import start)\n   *   * import.render.complete (graphical import finished)\n   *\n   * You can use these events to hook into the life-cycle.\n   *\n   * @throws {OpenError} An error thrown during opening.\n   *\n   * @param {ModdleElement|string} bpmnDiagramOrId The diagram or Id of the BPMN diagram to open.\n   *\n   * @return {Promise<OpenResult>} A promise resolving with warnings that were produced during opening.\n   */\n  BaseViewer.prototype.open = async function open(bpmnDiagramOrId) {\n\n    const definitions = this._definitions;\n    let bpmnDiagram = bpmnDiagramOrId;\n\n    if (!definitions) {\n      const error = new Error('no XML imported');\n      addWarningsToError(error, []);\n\n      throw error;\n    }\n\n    if (typeof bpmnDiagramOrId === 'string') {\n      bpmnDiagram = findBPMNDiagram(definitions, bpmnDiagramOrId);\n\n      if (!bpmnDiagram) {\n        const error = new Error('BPMNDiagram <' + bpmnDiagramOrId + '> not found');\n        addWarningsToError(error, []);\n\n        throw error;\n      }\n    }\n\n    // clear existing rendered diagram\n    // catch synchronous exceptions during #clear()\n    try {\n      this.clear();\n    } catch (error) {\n      addWarningsToError(error, []);\n\n      throw error;\n    }\n\n    // perform graphical import\n    const { warnings } = await importBpmnDiagram(this, definitions, bpmnDiagram);\n\n    return { warnings };\n  };\n\n  BaseViewer.prototype.open = wrapForCompatibility(BaseViewer.prototype.open);\n\n  /**\n   * Export the currently displayed BPMN 2.0 diagram as\n   * a BPMN 2.0 XML document.\n   *\n   * ## Life-Cycle Events\n   *\n   * During XML saving the viewer will fire life-cycle events:\n   *\n   *   * saveXML.start (before serialization)\n   *   * saveXML.serialized (after xml generation)\n   *   * saveXML.done (everything done)\n   *\n   * You can use these events to hook into the life-cycle.\n   *\n   * @throws {Error} An error thrown during export.\n   *\n   * @fires BaseViewer#SaveXMLStart\n   * @fires BaseViewer#SaveXMLDone\n   *\n   * @param {SaveXMLOptions} [options] The options.\n   *\n   * @return {Promise<SaveXMLResult>} A promise resolving with the XML.\n   */\n  BaseViewer.prototype.saveXML = async function saveXML(options) {\n\n    options = options || {};\n\n    let definitions = this._definitions,\n        error, xml;\n\n    try {\n      if (!definitions) {\n        throw new Error('no definitions loaded');\n      }\n\n      // allow to fiddle around with definitions\n\n      /**\n       * A `saveXML.start` event.\n       *\n       * @event BaseViewer#SaveXMLStartEvent\n       * @type {SaveXMLStartEvent}\n       */\n      definitions = this._emit('saveXML.start', {\n        definitions\n      }) || definitions;\n\n      const result = await this._moddle.toXML(definitions, options);\n      xml = result.xml;\n\n      xml = this._emit('saveXML.serialized', {\n        xml\n      }) || xml;\n    } catch (err) {\n      error = err;\n    }\n\n    const result = error ? { error } : { xml };\n\n    /**\n     * A `saveXML.done` event.\n     *\n     * @event BaseViewer#SaveXMLDoneEvent\n     * @type {SaveXMLDoneEvent}\n     */\n    this._emit('saveXML.done', result);\n\n    if (error) {\n      throw error;\n    }\n\n    return result;\n  };\n\n  BaseViewer.prototype.saveXML = wrapForCompatibility(BaseViewer.prototype.saveXML);\n\n\n  /**\n   * Export the currently displayed BPMN 2.0 diagram as\n   * an SVG image.\n   *\n   * ## Life-Cycle Events\n   *\n   * During SVG saving the viewer will fire life-cycle events:\n   *\n   *   * saveSVG.start (before serialization)\n   *   * saveSVG.done (everything done)\n   *\n   * You can use these events to hook into the life-cycle.\n   *\n   * @throws {Error} An error thrown during export.\n   *\n   * @fires BaseViewer#SaveSVGDone\n   *\n   * @return {Promise<SaveSVGResult>} A promise resolving with the SVG.\n   */\n  BaseViewer.prototype.saveSVG = async function saveSVG() {\n    this._emit('saveSVG.start');\n\n    let svg, err;\n\n    try {\n      const canvas = this.get('canvas');\n\n      const contentNode = canvas.getActiveLayer(),\n            defsNode = query('defs', canvas._svg);\n\n      const contents = innerSVG(contentNode),\n            defs = defsNode ? '<defs>' + innerSVG(defsNode) + '</defs>' : '';\n\n      const bbox = contentNode.getBBox();\n\n      svg =\n        '<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n' +\n        '<!-- created with bpmn-js / http://bpmn.io -->\\n' +\n        '<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n' +\n        '<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" ' +\n        'width=\"' + bbox.width + '\" height=\"' + bbox.height + '\" ' +\n        'viewBox=\"' + bbox.x + ' ' + bbox.y + ' ' + bbox.width + ' ' + bbox.height + '\" version=\"1.1\">' +\n        defs + contents +\n        '</svg>';\n    } catch (e) {\n      err = e;\n    }\n\n    /**\n     * A `saveSVG.done` event.\n     *\n     * @event BaseViewer#SaveSVGDoneEvent\n     * @type {SaveSVGDoneEvent}\n     */\n    this._emit('saveSVG.done', {\n      error: err,\n      svg: svg\n    });\n\n    if (err) {\n      throw err;\n    }\n\n    return { svg };\n  };\n\n  BaseViewer.prototype.saveSVG = wrapForCompatibility(BaseViewer.prototype.saveSVG);\n\n  /**\n   * Get a named diagram service.\n   *\n   * @example\n   *\n   * const elementRegistry = viewer.get('elementRegistry');\n   * const startEventShape = elementRegistry.get('StartEvent_1');\n   *\n   * @param {string} name\n   *\n   * @return {Object} diagram service instance\n   *\n   * @method BaseViewer#get\n   */\n\n  /**\n   * Invoke a function in the context of this viewer.\n   *\n   * @example\n   *\n   * viewer.invoke(function(elementRegistry) {\n   *   const startEventShape = elementRegistry.get('StartEvent_1');\n   * });\n   *\n   * @param {Function} fn to be invoked\n   *\n   * @return {Object} the functions return value\n   *\n   * @method BaseViewer#invoke\n   */\n\n\n  BaseViewer.prototype._setDefinitions = function(definitions) {\n    this._definitions = definitions;\n  };\n\n  /**\n   * Return modules to instantiate with.\n   *\n   * @return {ModuleDeclaration[]} The modules.\n   */\n  BaseViewer.prototype.getModules = function() {\n    return this._modules;\n  };\n\n  /**\n   * Remove all drawn elements from the viewer.\n   *\n   * After calling this method the viewer can still be reused for opening another\n   * diagram.\n   */\n  BaseViewer.prototype.clear = function() {\n    if (!this.getDefinitions()) {\n\n      // no diagram to clear\n      return;\n    }\n\n    // remove drawn elements\n    Diagram.prototype.clear.call(this);\n  };\n\n  /**\n   * Destroy the viewer instance and remove all its remainders from the document\n   * tree.\n   */\n  BaseViewer.prototype.destroy = function() {\n\n    // diagram destroy\n    Diagram.prototype.destroy.call(this);\n\n    // dom detach\n    remove$1(this._container);\n  };\n\n  /**\n   * Register an event listener.\n   *\n   * Remove an event listener via {@link BaseViewer#off}.\n   *\n   * @template T\n   *\n   * @param {string|string[]} events The event(s) to listen to.\n   * @param {number} [priority] The priority with which to listen.\n   * @param {EventBusEventCallback<T>} callback The callback.\n   * @param {any} [that] Value of `this` the callback will be called with.\n   */\n  BaseViewer.prototype.on = function(events, priority, callback, that) {\n    return this.get('eventBus').on(events, priority, callback, that);\n  };\n\n  /**\n   * Remove an event listener.\n   *\n   * @param {string|string[]} events The event(s).\n   * @param {Function} [callback] The callback.\n   */\n  BaseViewer.prototype.off = function(events, callback) {\n    this.get('eventBus').off(events, callback);\n  };\n\n  /**\n   * Attach the viewer to an HTML element.\n   *\n   * @param {HTMLElement} parentNode The parent node to attach to.\n   */\n  BaseViewer.prototype.attachTo = function(parentNode) {\n\n    if (!parentNode) {\n      throw new Error('parentNode required');\n    }\n\n    // ensure we detach from the\n    // previous, old parent\n    this.detach();\n\n    // unwrap jQuery if provided\n    if (parentNode.get && parentNode.constructor.prototype.jquery) {\n      parentNode = parentNode.get(0);\n    }\n\n    if (typeof parentNode === 'string') {\n      parentNode = query(parentNode);\n    }\n\n    parentNode.appendChild(this._container);\n\n    this._emit('attach', {});\n\n    this.get('canvas').resized();\n  };\n\n  /**\n   * Get the definitions model element.\n   *\n   * @return {ModdleElement} The definitions model element.\n   */\n  BaseViewer.prototype.getDefinitions = function() {\n    return this._definitions;\n  };\n\n  /**\n   * Detach the viewer.\n   *\n   * @fires BaseViewer#DetachEvent\n   */\n  BaseViewer.prototype.detach = function() {\n\n    const container = this._container,\n          parentNode = container.parentNode;\n\n    if (!parentNode) {\n      return;\n    }\n\n    /**\n     * A `detach` event.\n     *\n     * @event BaseViewer#DetachEvent\n     * @type {Object}\n     */\n    this._emit('detach', {});\n\n    parentNode.removeChild(container);\n  };\n\n  BaseViewer.prototype._init = function(container, moddle, options) {\n\n    const baseModules = options.modules || this.getModules(options),\n          additionalModules = options.additionalModules || [],\n          staticModules = [\n            {\n              bpmnjs: [ 'value', this ],\n              moddle: [ 'value', moddle ]\n            }\n          ];\n\n    const diagramModules = [].concat(staticModules, baseModules, additionalModules);\n\n    const diagramOptions = assign$1(omit(options, [ 'additionalModules' ]), {\n      canvas: assign$1({}, options.canvas, { container: container }),\n      modules: diagramModules\n    });\n\n    // invoke diagram constructor\n    Diagram.call(this, diagramOptions);\n\n    if (options && options.container) {\n      this.attachTo(options.container);\n    }\n  };\n\n  /**\n   * Emit an event on the underlying {@link EventBus}\n   *\n   * @param  {string} type\n   * @param  {Object} event\n   *\n   * @return {Object} The return value after calling all event listeners.\n   */\n  BaseViewer.prototype._emit = function(type, event) {\n    return this.get('eventBus').fire(type, event);\n  };\n\n  /**\n   * @param {BaseViewerOptions} options\n   *\n   * @return {HTMLElement}\n   */\n  BaseViewer.prototype._createContainer = function(options) {\n\n    const container = domify$1('<div class=\"bjs-container\"></div>');\n\n    assign(container, {\n      width: ensureUnit(options.width),\n      height: ensureUnit(options.height),\n      position: options.position\n    });\n\n    return container;\n  };\n\n  /**\n   * @param {BaseViewerOptions} options\n   *\n   * @return {Moddle}\n   */\n  BaseViewer.prototype._createModdle = function(options) {\n    const moddleOptions = assign$1({}, this._moddleExtensions, options.moddleExtensions);\n\n    return new simple(moddleOptions);\n  };\n\n  BaseViewer.prototype._modules = [];\n\n  // helpers ///////////////\n\n  function addWarningsToError(err, warningsAry) {\n    err.warnings = warningsAry;\n    return err;\n  }\n\n  function checkValidationError(err) {\n\n    // check if we can help the user by indicating wrong BPMN 2.0 xml\n    // (in case he or the exporting tool did not get that right)\n\n    const pattern = /unparsable content <([^>]+)> detected([\\s\\S]*)$/;\n    const match = pattern.exec(err.message);\n\n    if (match) {\n      err.message =\n        'unparsable content <' + match[1] + '> detected; ' +\n        'this may indicate an invalid BPMN 2.0 diagram file' + match[2];\n    }\n\n    return err;\n  }\n\n  const DEFAULT_OPTIONS = {\n    width: '100%',\n    height: '100%',\n    position: 'relative'\n  };\n\n\n  /**\n   * Ensure the passed argument is a proper unit (defaulting to px)\n   */\n  function ensureUnit(val) {\n    return val + (isNumber(val) ? 'px' : '');\n  }\n\n\n  /**\n   * Find BPMNDiagram in definitions by ID\n   *\n   * @param {ModdleElement<Definitions>} definitions\n   * @param {string} diagramId\n   *\n   * @return {ModdleElement<BPMNDiagram>|null}\n   */\n  function findBPMNDiagram(definitions, diagramId) {\n    if (!diagramId) {\n      return null;\n    }\n\n    return find(definitions.diagrams, function(element) {\n      return element.id === diagramId;\n    }) || null;\n  }\n\n  /**\n   * Adds the project logo to the diagram container as\n   * required by the bpmn.io license.\n   *\n   * @see http://bpmn.io/license\n   *\n   * @param {Element} container\n   */\n  function addProjectLogo(container) {\n    const img = BPMNIO_IMG;\n\n    const linkMarkup =\n      '<a href=\"http://bpmn.io\" ' +\n      'target=\"_blank\" ' +\n      'class=\"bjs-powered-by\" ' +\n      'title=\"Powered by bpmn.io\" ' +\n      '>' +\n      img +\n      '</a>';\n\n    const linkElement = domify$1(linkMarkup);\n\n    assign(query('svg', linkElement), LOGO_STYLES);\n    assign(linkElement, LINK_STYLES, {\n      position: 'absolute',\n      bottom: '15px',\n      right: '15px',\n      zIndex: '100'\n    });\n\n    container.appendChild(linkElement);\n\n    event.bind(linkElement, 'click', function(event) {\n      open();\n\n      event.preventDefault();\n    });\n  }\n\n  /* </project-logo> */\n\n  /**\n   * @typedef { import('./BaseViewer').BaseViewerOptions } BaseViewerOptions\n   */\n\n  /**\n   * A viewer for BPMN 2.0 diagrams.\n   *\n   * Have a look at {@link NavigatedViewer} or {@link Modeler} for bundles that include\n   * additional features.\n   *\n   *\n   * ## Extending the Viewer\n   *\n   * In order to extend the viewer pass extension modules to bootstrap via the\n   * `additionalModules` option. An extension module is an object that exposes\n   * named services.\n   *\n   * The following example depicts the integration of a simple\n   * logging component that integrates with interaction events:\n   *\n   *\n   * ```javascript\n   *\n   * // logging component\n   * function InteractionLogger(eventBus) {\n   *   eventBus.on('element.hover', function(event) {\n   *     console.log()\n   *   })\n   * }\n   *\n   * InteractionLogger.$inject = [ 'eventBus' ]; // minification save\n   *\n   * // extension module\n   * var extensionModule = {\n   *   __init__: [ 'interactionLogger' ],\n   *   interactionLogger: [ 'type', InteractionLogger ]\n   * };\n   *\n   * // extend the viewer\n   * var bpmnViewer = new Viewer({ additionalModules: [ extensionModule ] });\n   * bpmnViewer.importXML(...);\n   * ```\n   *\n   * @param {BaseViewerOptions} [options] The options to configure the viewer.\n   */\n  function Viewer(options) {\n    BaseViewer.call(this, options);\n  }\n\n  e(Viewer, BaseViewer);\n\n  // modules the viewer is composed of\n  Viewer.prototype._modules = [\n    CoreModule$1,\n    TranslateModule,\n    SelectionModule,\n    OverlaysModule,\n    DrilldownModdule\n  ];\n\n  // default moddle extensions the viewer is composed of\n  Viewer.prototype._moddleExtensions = {};\n\n  var KEYS_COPY = [ 'c', 'C' ];\r\n  var KEYS_PASTE = [ 'v', 'V' ];\r\n  var KEYS_REDO = [ 'y', 'Y' ];\r\n  var KEYS_UNDO = [ 'z', 'Z' ];\r\n\r\n  /**\r\n   * Returns true if event was triggered with any modifier\r\n   * @param {KeyboardEvent} event\r\n   */\r\n  function hasModifier(event) {\r\n    return (event.ctrlKey || event.metaKey || event.shiftKey || event.altKey);\r\n  }\r\n\r\n  /**\r\n   * @param {KeyboardEvent} event\r\n   * @return {boolean}\r\n   */\r\n  function isCmd(event) {\r\n\r\n    // ensure we don't react to AltGr\r\n    // (mapped to CTRL + ALT)\r\n    if (event.altKey) {\r\n      return false;\r\n    }\r\n\r\n    return event.ctrlKey || event.metaKey;\r\n  }\r\n\r\n  /**\r\n   * Checks if key pressed is one of provided keys.\r\n   *\r\n   * @param {string|string[]} keys\r\n   * @param {KeyboardEvent} event\r\n   * @return {boolean}\r\n   */\r\n  function isKey(keys, event) {\r\n    keys = isArray$2(keys) ? keys : [ keys ];\r\n\r\n    return keys.indexOf(event.key) !== -1 || keys.indexOf(event.code) !== -1;\r\n  }\r\n\r\n  /**\r\n   * @param {KeyboardEvent} event\r\n   */\r\n  function isShift(event) {\r\n    return event.shiftKey;\r\n  }\r\n\r\n  /**\r\n   * @param {KeyboardEvent} event\r\n   */\r\n  function isCopy(event) {\r\n    return isCmd(event) && isKey(KEYS_COPY, event);\r\n  }\r\n\r\n  /**\r\n   * @param {KeyboardEvent} event\r\n   */\r\n  function isPaste(event) {\r\n    return isCmd(event) && isKey(KEYS_PASTE, event);\r\n  }\r\n\r\n  /**\r\n   * @param {KeyboardEvent} event\r\n   */\r\n  function isUndo(event) {\r\n    return isCmd(event) && !isShift(event) && isKey(KEYS_UNDO, event);\r\n  }\r\n\r\n  /**\r\n   * @param {KeyboardEvent} event\r\n   */\r\n  function isRedo(event) {\r\n    return isCmd(event) && (\r\n      isKey(KEYS_REDO, event) || (\r\n        isKey(KEYS_UNDO, event) && isShift(event)\r\n      )\r\n    );\r\n  }\n\n  /**\n   * @typedef {import('../../core/EventBus').default} EventBus\n   *\n   * @typedef {({ keyEvent: KeyboardEvent }) => any} Listener\n   */\n\n  var KEYDOWN_EVENT = 'keyboard.keydown',\n      KEYUP_EVENT = 'keyboard.keyup';\n\n  var HANDLE_MODIFIER_ATTRIBUTE = 'input-handle-modified-keys';\n\n  var DEFAULT_PRIORITY = 1000;\n\n  /**\n   * A keyboard abstraction that may be activated and\n   * deactivated by users at will, consuming global key events\n   * and triggering diagram actions.\n   *\n   * For keys pressed down, keyboard fires `keyboard.keydown` event.\n   * The event context contains one field which is `KeyboardEvent` event.\n   *\n   * The implementation fires the following key events that allow\n   * other components to hook into key handling:\n   *\n   *  - keyboard.bind\n   *  - keyboard.unbind\n   *  - keyboard.init\n   *  - keyboard.destroy\n   *\n   * All events contain one field which is node.\n   *\n   * A default binding for the keyboard may be specified via the\n   * `keyboard.bindTo` configuration option.\n   *\n   * @param {Object} config\n   * @param {EventTarget} [config.bindTo]\n   * @param {EventBus} eventBus\n   */\n  function Keyboard(config, eventBus) {\n    var self = this;\n\n    this._config = config || {};\n    this._eventBus = eventBus;\n\n    this._keydownHandler = this._keydownHandler.bind(this);\n    this._keyupHandler = this._keyupHandler.bind(this);\n\n    // properly clean dom registrations\n    eventBus.on('diagram.destroy', function() {\n      self._fire('destroy');\n\n      self.unbind();\n    });\n\n    eventBus.on('diagram.init', function() {\n      self._fire('init');\n    });\n\n    eventBus.on('attach', function() {\n      if (config && config.bindTo) {\n        self.bind(config.bindTo);\n      }\n    });\n\n    eventBus.on('detach', function() {\n      self.unbind();\n    });\n  }\n\n  Keyboard.$inject = [\n    'config.keyboard',\n    'eventBus'\n  ];\n\n  Keyboard.prototype._keydownHandler = function(event) {\n    this._keyHandler(event, KEYDOWN_EVENT);\n  };\n\n  Keyboard.prototype._keyupHandler = function(event) {\n    this._keyHandler(event, KEYUP_EVENT);\n  };\n\n  Keyboard.prototype._keyHandler = function(event, type) {\n    var eventBusResult;\n\n    if (this._isEventIgnored(event)) {\n      return;\n    }\n\n    var context = {\n      keyEvent: event\n    };\n\n    eventBusResult = this._eventBus.fire(type || KEYDOWN_EVENT, context);\n\n    if (eventBusResult) {\n      event.preventDefault();\n    }\n  };\n\n  Keyboard.prototype._isEventIgnored = function(event) {\n    if (event.defaultPrevented) {\n      return true;\n    }\n\n    return isInput(event.target) && this._isModifiedKeyIgnored(event);\n  };\n\n  Keyboard.prototype._isModifiedKeyIgnored = function(event) {\n    if (!isCmd(event)) {\n      return true;\n    }\n\n    var allowedModifiers = this._getAllowedModifiers(event.target);\n    return allowedModifiers.indexOf(event.key) === -1;\n  };\n\n  Keyboard.prototype._getAllowedModifiers = function(element) {\n    var modifierContainer = closest(element, '[' + HANDLE_MODIFIER_ATTRIBUTE + ']', true);\n\n    if (!modifierContainer || (this._node && !this._node.contains(modifierContainer))) {\n      return [];\n    }\n\n    return modifierContainer.getAttribute(HANDLE_MODIFIER_ATTRIBUTE).split(',');\n  };\n\n  /**\n   * Bind keyboard events to the given DOM node.\n   *\n   * @param {EventTarget} node\n   */\n  Keyboard.prototype.bind = function(node) {\n\n    // make sure that the keyboard is only bound once to the DOM\n    this.unbind();\n\n    this._node = node;\n\n    // bind key events\n    event.bind(node, 'keydown', this._keydownHandler);\n    event.bind(node, 'keyup', this._keyupHandler);\n\n    this._fire('bind');\n  };\n\n  /**\n   * @return {EventTarget}\n   */\n  Keyboard.prototype.getBinding = function() {\n    return this._node;\n  };\n\n  Keyboard.prototype.unbind = function() {\n    var node = this._node;\n\n    if (node) {\n      this._fire('unbind');\n\n      // unbind key events\n      event.unbind(node, 'keydown', this._keydownHandler);\n      event.unbind(node, 'keyup', this._keyupHandler);\n    }\n\n    this._node = null;\n  };\n\n  /**\n   * @param {string} event\n   */\n  Keyboard.prototype._fire = function(event) {\n    this._eventBus.fire('keyboard.' + event, { node: this._node });\n  };\n\n  /**\n   * Add a listener function that is notified with `KeyboardEvent` whenever\n   * the keyboard is bound and the user presses a key. If no priority is\n   * provided, the default value of 1000 is used.\n   *\n   * @param {number} [priority]\n   * @param {Listener} listener\n   * @param {string} [type='keyboard.keydown']\n   */\n  Keyboard.prototype.addListener = function(priority, listener, type) {\n    if (isFunction(priority)) {\n      type = listener;\n      listener = priority;\n      priority = DEFAULT_PRIORITY;\n    }\n\n    this._eventBus.on(type || KEYDOWN_EVENT, priority, listener);\n  };\n\n  /**\n   * Remove a listener function.\n   *\n   * @param {Listener} listener\n   * @param {string} [type='keyboard.keydown']\n   */\n  Keyboard.prototype.removeListener = function(listener, type) {\n    this._eventBus.off(type || KEYDOWN_EVENT, listener);\n  };\n\n  Keyboard.prototype.hasModifier = hasModifier;\n  Keyboard.prototype.isCmd = isCmd;\n  Keyboard.prototype.isShift = isShift;\n  Keyboard.prototype.isKey = isKey;\n\n\n\n  // helpers ///////\n\n  function isInput(target) {\n    return target && (matches(target, 'input, textarea') || target.contentEditable === 'true');\n  }\n\n  var LOW_PRIORITY = 500;\n\n\n  /**\n   * Adds default keyboard bindings.\n   *\n   * This does not pull in any features will bind only actions that\n   * have previously been registered against the editorActions component.\n   *\n   * @param {EventBus} eventBus\n   * @param {Keyboard} keyboard\n   */\n  function KeyboardBindings(eventBus, keyboard) {\n\n    var self = this;\n\n    eventBus.on('editorActions.init', LOW_PRIORITY, function(event) {\n\n      var editorActions = event.editorActions;\n\n      self.registerBindings(keyboard, editorActions);\n    });\n  }\n\n  KeyboardBindings.$inject = [\n    'eventBus',\n    'keyboard'\n  ];\n\n\n  /**\n   * Register available keyboard bindings.\n   *\n   * @param {Keyboard} keyboard\n   * @param {EditorActions} editorActions\n   */\n  KeyboardBindings.prototype.registerBindings = function(keyboard, editorActions) {\n\n    /**\n     * Add keyboard binding if respective editor action\n     * is registered.\n     *\n     * @param {string} action name\n     * @param {Function} fn that implements the key binding\n     */\n    function addListener(action, fn) {\n\n      if (editorActions.isRegistered(action)) {\n        keyboard.addListener(fn);\n      }\n    }\n\n\n    // undo\n    // (CTRL|CMD) + Z\n    addListener('undo', function(context) {\n\n      var event = context.keyEvent;\n\n      if (isUndo(event)) {\n        editorActions.trigger('undo');\n\n        return true;\n      }\n    });\n\n    // redo\n    // CTRL + Y\n    // CMD + SHIFT + Z\n    addListener('redo', function(context) {\n\n      var event = context.keyEvent;\n\n      if (isRedo(event)) {\n        editorActions.trigger('redo');\n\n        return true;\n      }\n    });\n\n    // copy\n    // CTRL/CMD + C\n    addListener('copy', function(context) {\n\n      var event = context.keyEvent;\n\n      if (isCopy(event)) {\n        editorActions.trigger('copy');\n\n        return true;\n      }\n    });\n\n    // paste\n    // CTRL/CMD + V\n    addListener('paste', function(context) {\n\n      var event = context.keyEvent;\n\n      if (isPaste(event)) {\n        editorActions.trigger('paste');\n\n        return true;\n      }\n    });\n\n    // zoom in one step\n    // CTRL/CMD + +\n    addListener('stepZoom', function(context) {\n\n      var event = context.keyEvent;\n\n      // quirk: it has to be triggered by `=` as well to work on international keyboard layout\n      // cf: https://github.com/bpmn-io/bpmn-js/issues/1362#issuecomment-722989754\n      if (isKey([ '+', 'Add', '=' ], event) && isCmd(event)) {\n        editorActions.trigger('stepZoom', { value: 1 });\n\n        return true;\n      }\n    });\n\n    // zoom out one step\n    // CTRL + -\n    addListener('stepZoom', function(context) {\n\n      var event = context.keyEvent;\n\n      if (isKey([ '-', 'Subtract' ], event) && isCmd(event)) {\n        editorActions.trigger('stepZoom', { value: -1 });\n\n        return true;\n      }\n    });\n\n    // zoom to the default level\n    // CTRL + 0\n    addListener('zoom', function(context) {\n\n      var event = context.keyEvent;\n\n      if (isKey('0', event) && isCmd(event)) {\n        editorActions.trigger('zoom', { value: 1 });\n\n        return true;\n      }\n    });\n\n    // delete selected element\n    // DEL\n    addListener('removeSelection', function(context) {\n\n      var event = context.keyEvent;\n\n      if (isKey([ 'Backspace', 'Delete', 'Del' ], event)) {\n        editorActions.trigger('removeSelection');\n\n        return true;\n      }\n    });\n  };\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var KeyboardModule = {\n    __init__: [ 'keyboard', 'keyboardBindings' ],\n    keyboard: [ 'type', Keyboard ],\n    keyboardBindings: [ 'type', KeyboardBindings ]\n  };\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../features/keyboard/Keyboard').default} Keyboard\n   */\n\n  var DEFAULT_CONFIG = {\n    moveSpeed: 50,\n    moveSpeedAccelerated: 200\n  };\n\n\n  /**\n   * A feature that allows users to move the canvas using the keyboard.\n   *\n   * @param {Object} config\n   * @param {number} [config.moveSpeed=50]\n   * @param {number} [config.moveSpeedAccelerated=200]\n   * @param {Keyboard} keyboard\n   * @param {Canvas} canvas\n   */\n  function KeyboardMove(\n      config,\n      keyboard,\n      canvas\n  ) {\n\n    var self = this;\n\n    this._config = assign$1({}, DEFAULT_CONFIG, config || {});\n\n    keyboard.addListener(arrowsListener);\n\n\n    function arrowsListener(context) {\n\n      var event = context.keyEvent,\n          config = self._config;\n\n      if (!keyboard.isCmd(event)) {\n        return;\n      }\n\n      if (keyboard.isKey([\n        'ArrowLeft', 'Left',\n        'ArrowUp', 'Up',\n        'ArrowDown', 'Down',\n        'ArrowRight', 'Right'\n      ], event)) {\n\n        var speed = (\n          keyboard.isShift(event) ?\n            config.moveSpeedAccelerated :\n            config.moveSpeed\n        );\n\n        var direction;\n\n        switch (event.key) {\n        case 'ArrowLeft':\n        case 'Left':\n          direction = 'left';\n          break;\n        case 'ArrowUp':\n        case 'Up':\n          direction = 'up';\n          break;\n        case 'ArrowRight':\n        case 'Right':\n          direction = 'right';\n          break;\n        case 'ArrowDown':\n        case 'Down':\n          direction = 'down';\n          break;\n        }\n\n        self.moveCanvas({\n          speed: speed,\n          direction: direction\n        });\n\n        return true;\n      }\n    }\n\n    /**\n     * @param {{\n     *   direction: 'up' | 'down' | 'left' | 'right';\n     *   speed: number;\n     * }} options\n     */\n    this.moveCanvas = function(options) {\n\n      var dx = 0,\n          dy = 0,\n          speed = options.speed;\n\n      var actualSpeed = speed / Math.min(Math.sqrt(canvas.viewbox().scale), 1);\n\n      switch (options.direction) {\n      case 'left': // Left\n        dx = actualSpeed;\n        break;\n      case 'up': // Up\n        dy = actualSpeed;\n        break;\n      case 'right': // Right\n        dx = -actualSpeed;\n        break;\n      case 'down': // Down\n        dy = -actualSpeed;\n        break;\n      }\n\n      canvas.scroll({\n        dx: dx,\n        dy: dy\n      });\n    };\n\n  }\n\n\n  KeyboardMove.$inject = [\n    'config.keyboardMove',\n    'keyboard',\n    'canvas'\n  ];\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var KeyboardMoveModule = {\n    __depends__: [\n      KeyboardModule\n    ],\n    __init__: [ 'keyboardMove' ],\n    keyboardMove: [ 'type', KeyboardMove ]\n  };\n\n  var CURSOR_CLS_PATTERN = /^djs-cursor-.*$/;\n\n  /**\n   * @param {string} mode\n   */\n  function set(mode) {\n    var classes$1 = classes(document.body);\n\n    classes$1.removeMatching(CURSOR_CLS_PATTERN);\n\n    if (mode) {\n      classes$1.add('djs-cursor-' + mode);\n    }\n  }\n\n  function unset() {\n    set(null);\n  }\n\n  /**\n   * @typedef {import('../core/EventBus').EventBus} EventBus\n   */\n\n  var TRAP_PRIORITY = 5000;\n\n  /**\n   * Installs a click trap that prevents a ghost click following a dragging operation.\n   *\n   * @param {EventBus} eventBus\n   * @param {string} [eventName='element.click']\n   *\n   * @return {() => void} a function to immediately remove the installed trap.\n   */\n  function install(eventBus, eventName) {\n\n    eventName = eventName || 'element.click';\n\n    function trap() {\n      return false;\n    }\n\n    eventBus.once(eventName, TRAP_PRIORITY, trap);\n\n    return function() {\n      eventBus.off(eventName, trap);\n    };\n  }\n\n  /**\n   * @typedef {import('../util/Types').Point} Point\n   * @typedef {import('../util/Types').Rect} Rect\n   */\n\n\n  /**\n   * @param {Point} a\n   * @param {Point} b\n   * @return {Point}\n   */\n  function delta(a, b) {\n    return {\n      x: a.x - b.x,\n      y: a.y - b.y\n    };\n  }\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   */\n\n  var THRESHOLD = 15;\n\n\n  /**\n   * Move the canvas via mouse.\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   */\n  function MoveCanvas(eventBus, canvas) {\n\n    var context;\n\n\n    // listen for move on element mouse down;\n    // allow others to hook into the event before us though\n    // (dragging / element moving will do this)\n    eventBus.on('element.mousedown', 500, function(e) {\n      return handleStart(e.originalEvent);\n    });\n\n\n    function handleMove(event) {\n\n      var start = context.start,\n          button = context.button,\n          position = toPoint(event),\n          delta$1 = delta(position, start);\n\n      if (!context.dragging && length(delta$1) > THRESHOLD) {\n        context.dragging = true;\n\n        if (button === 0) {\n          install(eventBus);\n        }\n\n        set('grab');\n      }\n\n      if (context.dragging) {\n\n        var lastPosition = context.last || context.start;\n\n        delta$1 = delta(position, lastPosition);\n\n        canvas.scroll({\n          dx: delta$1.x,\n          dy: delta$1.y\n        });\n\n        context.last = position;\n      }\n\n      // prevent select\n      event.preventDefault();\n    }\n\n\n    function handleEnd(event$1) {\n      event.unbind(document, 'mousemove', handleMove);\n      event.unbind(document, 'mouseup', handleEnd);\n\n      context = null;\n\n      unset();\n    }\n\n    function handleStart(event$1) {\n\n      // event is already handled by '.djs-draggable'\n      if (closest(event$1.target, '.djs-draggable')) {\n        return;\n      }\n\n      var button = event$1.button;\n\n      // reject right mouse button or modifier key\n      if (button >= 2 || event$1.ctrlKey || event$1.shiftKey || event$1.altKey) {\n        return;\n      }\n\n      context = {\n        button: button,\n        start: toPoint(event$1)\n      };\n\n      event.bind(document, 'mousemove', handleMove);\n      event.bind(document, 'mouseup', handleEnd);\n\n      // we've handled the event\n      return true;\n    }\n\n    this.isActive = function() {\n      return !!context;\n    };\n\n  }\n\n\n  MoveCanvas.$inject = [\n    'eventBus',\n    'canvas'\n  ];\n\n\n\n  // helpers ///////\n\n  function length(point) {\n    return Math.sqrt(Math.pow(point.x, 2) + Math.pow(point.y, 2));\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var MoveCanvasModule = {\n    __init__: [ 'moveCanvas' ],\n    moveCanvas: [ 'type', MoveCanvas ]\n  };\n\n  /**\n   * Get the logarithm of x with base 10.\n   *\n   * @param {number} x\n   */\n  function log10(x) {\n    return Math.log(x) / Math.log(10);\n  }\n\n  /**\n   * Get step size for given range and number of steps.\n   *\n   * @param {Object} range\n   * @param {number} range.min\n   * @param {number} range.max\n   * @param {number} steps\n   */\n  function getStepSize(range, steps) {\n\n    var minLinearRange = log10(range.min),\n        maxLinearRange = log10(range.max);\n\n    var absoluteLinearRange = Math.abs(minLinearRange) + Math.abs(maxLinearRange);\n\n    return absoluteLinearRange / steps;\n  }\n\n  /**\n   * @param {Object} range\n   * @param {number} range.min\n   * @param {number} range.max\n   * @param {number} scale\n   */\n  function cap(range, scale) {\n    return Math.max(range.min, Math.min(range.max, scale));\n  }\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   *\n   * @typedef {import('../../util/Types').Point} Point\n   */\n\n  var sign = Math.sign || function(n) {\n    return n >= 0 ? 1 : -1;\n  };\n\n  var RANGE = { min: 0.2, max: 4 },\n      NUM_STEPS = 10;\n\n  var DELTA_THRESHOLD = 0.1;\n\n  var DEFAULT_SCALE = 0.75;\n\n  /**\n   * An implementation of zooming and scrolling within the\n   * {@link Canvas} via the mouse wheel.\n   *\n   * Mouse wheel zooming / scrolling may be disabled using\n   * the {@link toggle(enabled)} method.\n   *\n   * @param {Object} [config]\n   * @param {boolean} [config.enabled=true] default enabled state\n   * @param {number} [config.scale=.75] scroll sensivity\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   */\n  function ZoomScroll(config, eventBus, canvas) {\n\n    config = config || {};\n\n    this._enabled = false;\n\n    this._canvas = canvas;\n    this._container = canvas._container;\n\n    this._handleWheel = bind$2(this._handleWheel, this);\n\n    this._totalDelta = 0;\n    this._scale = config.scale || DEFAULT_SCALE;\n\n    var self = this;\n\n    eventBus.on('canvas.init', function(e) {\n      self._init(config.enabled !== false);\n    });\n  }\n\n  ZoomScroll.$inject = [\n    'config.zoomScroll',\n    'eventBus',\n    'canvas'\n  ];\n\n  /**\n   * @param {Point} delta\n   */\n  ZoomScroll.prototype.scroll = function scroll(delta) {\n    this._canvas.scroll(delta);\n  };\n\n\n  ZoomScroll.prototype.reset = function reset() {\n    this._canvas.zoom('fit-viewport');\n  };\n\n  /**\n   * Zoom depending on delta.\n   *\n   * @param {number} delta\n   * @param {Point} position\n   */\n  ZoomScroll.prototype.zoom = function zoom(delta, position) {\n\n    // zoom with half the step size of stepZoom\n    var stepSize = getStepSize(RANGE, NUM_STEPS * 2);\n\n    // add until threshold reached\n    this._totalDelta += delta;\n\n    if (Math.abs(this._totalDelta) > DELTA_THRESHOLD) {\n      this._zoom(delta, position, stepSize);\n\n      // reset\n      this._totalDelta = 0;\n    }\n  };\n\n\n  ZoomScroll.prototype._handleWheel = function handleWheel(event) {\n\n    // event is already handled by '.djs-scrollable'\n    if (closest(event.target, '.djs-scrollable', true)) {\n      return;\n    }\n\n    var element = this._container;\n\n    event.preventDefault();\n\n    // pinch to zoom is mapped to wheel + ctrlKey = true\n    // in modern browsers (!)\n\n    var isZoom = event.ctrlKey;\n\n    var isHorizontalScroll = event.shiftKey;\n\n    var factor = -1 * this._scale,\n        delta;\n\n    if (isZoom) {\n      factor *= event.deltaMode === 0 ? 0.020 : 0.32;\n    } else {\n      factor *= event.deltaMode === 0 ? 1.0 : 16.0;\n    }\n\n    if (isZoom) {\n      var elementRect = element.getBoundingClientRect();\n\n      var offset = {\n        x: event.clientX - elementRect.left,\n        y: event.clientY - elementRect.top\n      };\n\n      delta = (\n        Math.sqrt(\n          Math.pow(event.deltaY, 2) +\n          Math.pow(event.deltaX, 2)\n        ) * sign(event.deltaY) * factor\n      );\n\n      // zoom in relative to diagram {x,y} coordinates\n      this.zoom(delta, offset);\n    } else {\n\n      if (isHorizontalScroll) {\n        delta = {\n          dx: factor * event.deltaY,\n          dy: 0\n        };\n      } else {\n        delta = {\n          dx: factor * event.deltaX,\n          dy: factor * event.deltaY\n        };\n      }\n\n      this.scroll(delta);\n    }\n  };\n\n  /**\n   * Zoom with fixed step size.\n   *\n   * @param {number} delta Zoom delta (1 for zooming in, -1 for zooming out).\n   * @param {Point} position\n   */\n  ZoomScroll.prototype.stepZoom = function stepZoom(delta, position) {\n\n    var stepSize = getStepSize(RANGE, NUM_STEPS);\n\n    this._zoom(delta, position, stepSize);\n  };\n\n\n  /**\n   * Zoom in/out given a step size.\n   *\n   * @param {number} delta\n   * @param {Point} position\n   * @param {number} stepSize\n   */\n  ZoomScroll.prototype._zoom = function(delta, position, stepSize) {\n    var canvas = this._canvas;\n\n    var direction = delta > 0 ? 1 : -1;\n\n    var currentLinearZoomLevel = log10(canvas.zoom());\n\n    // snap to a proximate zoom step\n    var newLinearZoomLevel = Math.round(currentLinearZoomLevel / stepSize) * stepSize;\n\n    // increase or decrease one zoom step in the given direction\n    newLinearZoomLevel += stepSize * direction;\n\n    // calculate the absolute logarithmic zoom level based on the linear zoom level\n    // (e.g. 2 for an absolute x2 zoom)\n    var newLogZoomLevel = Math.pow(10, newLinearZoomLevel);\n\n    canvas.zoom(cap(RANGE, newLogZoomLevel), position);\n  };\n\n\n  /**\n   * Toggle the zoom scroll ability via mouse wheel.\n   *\n   * @param {boolean} [newEnabled] new enabled state\n   */\n  ZoomScroll.prototype.toggle = function toggle(newEnabled) {\n\n    var element = this._container;\n    var handleWheel = this._handleWheel;\n\n    var oldEnabled = this._enabled;\n\n    if (typeof newEnabled === 'undefined') {\n      newEnabled = !oldEnabled;\n    }\n\n    // only react on actual changes\n    if (oldEnabled !== newEnabled) {\n\n      // add or remove wheel listener based on\n      // changed enabled state\n      event[newEnabled ? 'bind' : 'unbind'](element, 'wheel', handleWheel, false);\n    }\n\n    this._enabled = newEnabled;\n\n    return newEnabled;\n  };\n\n\n  ZoomScroll.prototype._init = function(newEnabled) {\n    this.toggle(newEnabled);\n  };\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var ZoomScrollModule = {\n    __init__: [ 'zoomScroll' ],\n    zoomScroll: [ 'type', ZoomScroll ]\n  };\n\n  /**\n   * @typedef { import('./BaseViewer').BaseViewerOptions } BaseViewerOptions\n   */\n\n  /**\n   * A viewer with mouse and keyboard navigation features.\n   *\n   * @param {BaseViewerOptions} [options]\n   */\n  function NavigatedViewer(options) {\n    Viewer.call(this, options);\n  }\n\n  e(NavigatedViewer, Viewer);\n\n\n  NavigatedViewer.prototype._navigationModules = [\n    KeyboardMoveModule,\n    MoveCanvasModule,\n    ZoomScrollModule\n  ];\n\n  NavigatedViewer.prototype._modules = [].concat(\n    Viewer.prototype._modules,\n    NavigatedViewer.prototype._navigationModules\n  );\n\n  return NavigatedViewer;\n\n}));\n"
  },
  {
    "path": "easyflow-flow-bpmn/static/plugins/bpmnjs/bpmn-viewer.development.js",
    "content": "/*!\n * bpmn-js - bpmn-viewer v13.2.1\n *\n * Copyright (c) 2014-present, camunda Services GmbH\n *\n * Released under the bpmn.io license\n * http://bpmn.io/license\n *\n * Source Code: https://github.com/bpmn-io/bpmn-js\n *\n * Date: 2023-08-05\n */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n  typeof define === 'function' && define.amd ? define(factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.BpmnViewer = factory());\n})(this, (function () { 'use strict';\n\n  function e(e,t){t&&(e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}));}\n\n  /**\n   * Flatten array, one level deep.\n   *\n   * @template T\n   *\n   * @param {T[][]} arr\n   *\n   * @return {T[]}\n   */\n\n  const nativeToString$1 = Object.prototype.toString;\n  const nativeHasOwnProperty$1 = Object.prototype.hasOwnProperty;\n\n  function isUndefined$2(obj) {\n    return obj === undefined;\n  }\n\n  function isDefined(obj) {\n    return obj !== undefined;\n  }\n\n  function isArray$2(obj) {\n    return nativeToString$1.call(obj) === '[object Array]';\n  }\n\n  function isObject(obj) {\n    return nativeToString$1.call(obj) === '[object Object]';\n  }\n\n  function isNumber(obj) {\n    return nativeToString$1.call(obj) === '[object Number]';\n  }\n\n  /**\n   * @param {any} obj\n   *\n   * @return {boolean}\n   */\n  function isFunction(obj) {\n    const tag = nativeToString$1.call(obj);\n\n    return (\n      tag === '[object Function]' ||\n      tag === '[object AsyncFunction]' ||\n      tag === '[object GeneratorFunction]' ||\n      tag === '[object AsyncGeneratorFunction]' ||\n      tag === '[object Proxy]'\n    );\n  }\n\n  function isString(obj) {\n    return nativeToString$1.call(obj) === '[object String]';\n  }\n\n  /**\n   * Return true, if target owns a property with the given key.\n   *\n   * @param {Object} target\n   * @param {String} key\n   *\n   * @return {Boolean}\n   */\n  function has$1(target, key) {\n    return nativeHasOwnProperty$1.call(target, key);\n  }\n\n  /**\n   * @template T\n   * @typedef { (\n   *   ((e: T) => boolean) |\n   *   ((e: T, idx: number) => boolean) |\n   *   ((e: T, key: string) => boolean) |\n   *   string |\n   *   number\n   * ) } Matcher\n   */\n\n  /**\n   * @template T\n   * @template U\n   *\n   * @typedef { (\n   *   ((e: T) => U) | string | number\n   * ) } Extractor\n   */\n\n\n  /**\n   * @template T\n   * @typedef { (val: T, key: any) => boolean } MatchFn\n   */\n\n  /**\n   * @template T\n   * @typedef { T[] } ArrayCollection\n   */\n\n  /**\n   * @template T\n   * @typedef { { [key: string]: T } } StringKeyValueCollection\n   */\n\n  /**\n   * @template T\n   * @typedef { { [key: number]: T } } NumberKeyValueCollection\n   */\n\n  /**\n   * @template T\n   * @typedef { StringKeyValueCollection<T> | NumberKeyValueCollection<T> } KeyValueCollection\n   */\n\n  /**\n   * @template T\n   * @typedef { KeyValueCollection<T> | ArrayCollection<T> } Collection\n   */\n\n  /**\n   * Find element in collection.\n   *\n   * @template T\n   * @param {Collection<T>} collection\n   * @param {Matcher<T>} matcher\n   *\n   * @return {Object}\n   */\n  function find(collection, matcher) {\n\n    const matchFn = toMatcher(matcher);\n\n    let match;\n\n    forEach$1(collection, function(val, key) {\n      if (matchFn(val, key)) {\n        match = val;\n\n        return false;\n      }\n    });\n\n    return match;\n\n  }\n\n\n  /**\n   * Find element index in collection.\n   *\n   * @template T\n   * @param {Collection<T>} collection\n   * @param {Matcher<T>} matcher\n   *\n   * @return {number}\n   */\n  function findIndex(collection, matcher) {\n\n    const matchFn = toMatcher(matcher);\n\n    let idx = isArray$2(collection) ? -1 : undefined;\n\n    forEach$1(collection, function(val, key) {\n      if (matchFn(val, key)) {\n        idx = key;\n\n        return false;\n      }\n    });\n\n    return idx;\n  }\n\n\n  /**\n   * Filter elements in collection.\n   *\n   * @template T\n   * @param {Collection<T>} collection\n   * @param {Matcher<T>} matcher\n   *\n   * @return {T[]} result\n   */\n  function filter(collection, matcher) {\n\n    const matchFn = toMatcher(matcher);\n\n    let result = [];\n\n    forEach$1(collection, function(val, key) {\n      if (matchFn(val, key)) {\n        result.push(val);\n      }\n    });\n\n    return result;\n  }\n\n\n  /**\n   * Iterate over collection; returning something\n   * (non-undefined) will stop iteration.\n   *\n   * @template T\n   * @param {Collection<T>} collection\n   * @param { ((item: T, idx: number) => (boolean|void)) | ((item: T, key: string) => (boolean|void)) } iterator\n   *\n   * @return {T} return result that stopped the iteration\n   */\n  function forEach$1(collection, iterator) {\n\n    let val,\n        result;\n\n    if (isUndefined$2(collection)) {\n      return;\n    }\n\n    const convertKey = isArray$2(collection) ? toNum$1 : identity$1;\n\n    for (let key in collection) {\n\n      if (has$1(collection, key)) {\n        val = collection[key];\n\n        result = iterator(val, convertKey(key));\n\n        if (result === false) {\n          return val;\n        }\n      }\n    }\n  }\n\n\n  /**\n   * Reduce collection, returning a single result.\n   *\n   * @template T\n   * @template V\n   *\n   * @param {Collection<T>} collection\n   * @param {(result: V, entry: T, index: any) => V} iterator\n   * @param {V} result\n   *\n   * @return {V} result returned from last iterator\n   */\n  function reduce(collection, iterator, result) {\n\n    forEach$1(collection, function(value, idx) {\n      result = iterator(result, value, idx);\n    });\n\n    return result;\n  }\n\n\n  /**\n   * Return true if every element in the collection\n   * matches the criteria.\n   *\n   * @param  {Object|Array} collection\n   * @param  {Function} matcher\n   *\n   * @return {Boolean}\n   */\n  function every(collection, matcher) {\n\n    return !!reduce(collection, function(matches, val, key) {\n      return matches && matcher(val, key);\n    }, true);\n  }\n\n\n  /**\n   * Return true if some elements in the collection\n   * match the criteria.\n   *\n   * @param  {Object|Array} collection\n   * @param  {Function} matcher\n   *\n   * @return {Boolean}\n   */\n  function some(collection, matcher) {\n\n    return !!find(collection, matcher);\n  }\n\n\n  /**\n   * Transform a collection into another collection\n   * by piping each member through the given fn.\n   *\n   * @param  {Object|Array}   collection\n   * @param  {Function} fn\n   *\n   * @return {Array} transformed collection\n   */\n  function map$1(collection, fn) {\n\n    let result = [];\n\n    forEach$1(collection, function(val, key) {\n      result.push(fn(val, key));\n    });\n\n    return result;\n  }\n\n\n  /**\n   * Create an object pattern matcher.\n   *\n   * @example\n   *\n   * ```javascript\n   * const matcher = matchPattern({ id: 1 });\n   *\n   * let element = find(elements, matcher);\n   * ```\n   *\n   * @template T\n   *\n   * @param {T} pattern\n   *\n   * @return { (el: any) =>  boolean } matcherFn\n   */\n  function matchPattern(pattern) {\n\n    return function(el) {\n\n      return every(pattern, function(val, key) {\n        return el[key] === val;\n      });\n\n    };\n  }\n\n\n  /**\n   * @template T\n   * @param {Matcher<T>} matcher\n   *\n   * @return {MatchFn<T>}\n   */\n  function toMatcher(matcher) {\n    return isFunction(matcher) ? matcher : (e) => {\n      return e === matcher;\n    };\n  }\n\n\n  function identity$1(arg) {\n    return arg;\n  }\n\n  function toNum$1(arg) {\n    return Number(arg);\n  }\n\n  /* global setTimeout clearTimeout */\n\n  /**\n   * @typedef { {\n   *   (...args: any[]): any;\n   *   flush: () => void;\n   *   cancel: () => void;\n   * } } DebouncedFunction\n   */\n\n  /**\n   * Debounce fn, calling it only once if the given time\n   * elapsed between calls.\n   *\n   * Lodash-style the function exposes methods to `#clear`\n   * and `#flush` to control internal behavior.\n   *\n   * @param  {Function} fn\n   * @param  {Number} timeout\n   *\n   * @return {DebouncedFunction} debounced function\n   */\n  function debounce(fn, timeout) {\n\n    let timer;\n\n    let lastArgs;\n    let lastThis;\n\n    let lastNow;\n\n    function fire(force) {\n\n      let now = Date.now();\n\n      let scheduledDiff = force ? 0 : (lastNow + timeout) - now;\n\n      if (scheduledDiff > 0) {\n        return schedule(scheduledDiff);\n      }\n\n      fn.apply(lastThis, lastArgs);\n\n      clear();\n    }\n\n    function schedule(timeout) {\n      timer = setTimeout(fire, timeout);\n    }\n\n    function clear() {\n      if (timer) {\n        clearTimeout(timer);\n      }\n\n      timer = lastNow = lastArgs = lastThis = undefined;\n    }\n\n    function flush() {\n      if (timer) {\n        fire(true);\n      }\n\n      clear();\n    }\n\n    /**\n     * @type { DebouncedFunction }\n     */\n    function callback(...args) {\n      lastNow = Date.now();\n\n      lastArgs = args;\n      lastThis = this;\n\n      // ensure an execution is scheduled\n      if (!timer) {\n        schedule(timeout);\n      }\n    }\n\n    callback.flush = flush;\n    callback.cancel = clear;\n\n    return callback;\n  }\n\n  /**\n   * Bind function against target <this>.\n   *\n   * @param  {Function} fn\n   * @param  {Object}   target\n   *\n   * @return {Function} bound function\n   */\n  function bind$2(fn, target) {\n    return fn.bind(target);\n  }\n\n  /**\n   * Convenience wrapper for `Object.assign`.\n   *\n   * @param {Object} target\n   * @param {...Object} others\n   *\n   * @return {Object} the target\n   */\n  function assign$1(target, ...others) {\n    return Object.assign(target, ...others);\n  }\n\n  /**\n   * Pick properties from the given target.\n   *\n   * @template T\n   * @template {any[]} V\n   *\n   * @param {T} target\n   * @param {V} properties\n   *\n   * @return Pick<T, V>\n   */\n  function pick(target, properties) {\n\n    let result = {};\n\n    let obj = Object(target);\n\n    forEach$1(properties, function(prop) {\n\n      if (prop in obj) {\n        result[prop] = target[prop];\n      }\n    });\n\n    return result;\n  }\n\n  /**\n   * Pick all target properties, excluding the given ones.\n   *\n   * @template T\n   * @template {any[]} V\n   *\n   * @param {T} target\n   * @param {V} properties\n   *\n   * @return {Omit<T, V>} target\n   */\n  function omit(target, properties) {\n\n    let result = {};\n\n    let obj = Object(target);\n\n    forEach$1(obj, function(prop, key) {\n\n      if (properties.indexOf(key) === -1) {\n        result[key] = prop;\n      }\n    });\n\n    return result;\n  }\n\n  var DEFAULT_RENDER_PRIORITY$1 = 1000;\n\n  /**\n   * @typedef {import('../core/Types').ElementLike} Element\n   * @typedef {import('../core/Types').ConnectionLike} Connection\n   * @typedef {import('../core/Types').ShapeLike} Shape\n   *\n   * @typedef {import('../core/EventBus').default} EventBus\n   */\n\n  /**\n   * The base implementation of shape and connection renderers.\n   *\n   * @param {EventBus} eventBus\n   * @param {number} [renderPriority=1000]\n   */\n  function BaseRenderer(eventBus, renderPriority) {\n    var self = this;\n\n    renderPriority = renderPriority || DEFAULT_RENDER_PRIORITY$1;\n\n    eventBus.on([ 'render.shape', 'render.connection' ], renderPriority, function(evt, context) {\n      var type = evt.type,\n          element = context.element,\n          visuals = context.gfx,\n          attrs = context.attrs;\n\n      if (self.canRender(element)) {\n        if (type === 'render.shape') {\n          return self.drawShape(visuals, element, attrs);\n        } else {\n          return self.drawConnection(visuals, element, attrs);\n        }\n      }\n    });\n\n    eventBus.on([ 'render.getShapePath', 'render.getConnectionPath' ], renderPriority, function(evt, element) {\n      if (self.canRender(element)) {\n        if (evt.type === 'render.getShapePath') {\n          return self.getShapePath(element);\n        } else {\n          return self.getConnectionPath(element);\n        }\n      }\n    });\n  }\n\n  /**\n   * Checks whether an element can be rendered.\n   *\n   * @param {Element} element The element to be rendered.\n   *\n   * @return {boolean} Whether the element can be rendered.\n   */\n  BaseRenderer.prototype.canRender = function(element) {};\n\n  /**\n   * Draws a shape.\n   *\n   * @param {SVGElement} visuals The SVG element to draw the shape into.\n   * @param {Shape} shape The shape to be drawn.\n   *\n   * @return {SVGElement} The SVG element of the shape drawn.\n   */\n  BaseRenderer.prototype.drawShape = function(visuals, shape) {};\n\n  /**\n   * Draws a connection.\n   *\n   * @param {SVGElement} visuals The SVG element to draw the connection into.\n   * @param {Connection} connection The connection to be drawn.\n   *\n   * @return {SVGElement} The SVG element of the connection drawn.\n   */\n  BaseRenderer.prototype.drawConnection = function(visuals, connection) {};\n\n  /**\n   * Gets the SVG path of the graphical representation of a shape.\n   *\n   * @param {Shape} shape The shape.\n   *\n   * @return {string} The SVG path of the shape.\n   */\n  BaseRenderer.prototype.getShapePath = function(shape) {};\n\n  /**\n   * Gets the SVG path of the graphical representation of a connection.\n   *\n   * @param {Connection} connection The connection.\n   *\n   * @return {string} The SVG path of the connection.\n   */\n  BaseRenderer.prototype.getConnectionPath = function(connection) {};\n\n  /**\n   * @typedef { import('../model/Types').Element } Element\n   * @typedef { import('../model/Types').ModdleElement } ModdleElement\n   */\n\n  /**\n   * Is an element of the given BPMN type?\n   *\n   * @param  {Element|ModdleElement} element\n   * @param  {string} type\n   *\n   * @return {boolean}\n   */\n  function is$1(element, type) {\n    var bo = getBusinessObject(element);\n\n    return bo && (typeof bo.$instanceOf === 'function') && bo.$instanceOf(type);\n  }\n\n\n  /**\n   * Return true if element has any of the given types.\n   *\n   * @param {Element|ModdleElement} element\n   * @param {string[]} types\n   *\n   * @return {boolean}\n   */\n  function isAny(element, types) {\n    return some(types, function(t) {\n      return is$1(element, t);\n    });\n  }\n\n  /**\n   * Return the business object for a given element.\n   *\n   * @param {Element|ModdleElement} element\n   *\n   * @return {ModdleElement}\n   */\n  function getBusinessObject(element) {\n    return (element && element.businessObject) || element;\n  }\n\n  /**\n   * Return the di object for a given element.\n   *\n   * @param {Element} element\n   *\n   * @return {ModdleElement}\n   */\n  function getDi(element) {\n    return element && element.di;\n  }\n\n  /**\n   * @typedef {import('../model/Types').Element} Element\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   */\n\n  /**\n   * @param {Element} element\n   * @param {ModdleElement} [di]\n   *\n   * @return {boolean}\n   */\n  function isExpanded(element, di) {\n\n    if (is$1(element, 'bpmn:CallActivity')) {\n      return false;\n    }\n\n    if (is$1(element, 'bpmn:SubProcess')) {\n      di = di || getDi(element);\n\n      if (di && is$1(di, 'bpmndi:BPMNPlane')) {\n        return true;\n      }\n\n      return di && !!di.isExpanded;\n    }\n\n    if (is$1(element, 'bpmn:Participant')) {\n      return !!getBusinessObject(element).processRef;\n    }\n\n    return true;\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isEventSubProcess(element) {\n    return element && !!getBusinessObject(element).triggeredByEvent;\n  }\n\n  /**\n   * Checks whether a value is an instance of Connection.\n   *\n   * @param {any} value\n   *\n   * @return {boolean}\n   */\n  function isConnection(value) {\n    return isObject(value) && has$1(value, 'waypoints');\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/util/Types').Point} Point\n   * @typedef {import('diagram-js/lib/util/Types').Rect} Rect\n   *\n   * @typedef {import('../model/Types').Element} Element\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   */\n\n  var DEFAULT_LABEL_SIZE$1 = {\n    width: 90,\n    height: 20\n  };\n\n  var FLOW_LABEL_INDENT = 15;\n\n\n  /**\n   * Return true if the given semantic has an external label.\n   *\n   * @param {Element} semantic\n   *\n   * @return {boolean}\n   */\n  function isLabelExternal(semantic) {\n    return is$1(semantic, 'bpmn:Event') ||\n           is$1(semantic, 'bpmn:Gateway') ||\n           is$1(semantic, 'bpmn:DataStoreReference') ||\n           is$1(semantic, 'bpmn:DataObjectReference') ||\n           is$1(semantic, 'bpmn:DataInput') ||\n           is$1(semantic, 'bpmn:DataOutput') ||\n           is$1(semantic, 'bpmn:SequenceFlow') ||\n           is$1(semantic, 'bpmn:MessageFlow') ||\n           is$1(semantic, 'bpmn:Group');\n  }\n\n  /**\n   * Get the position of a sequence flow label.\n   *\n   * @param  {Point[]} waypoints\n   *\n   * @return {Point}\n   */\n  function getFlowLabelPosition(waypoints) {\n\n    // get the waypoints mid\n    var mid = waypoints.length / 2 - 1;\n\n    var first = waypoints[Math.floor(mid)];\n    var second = waypoints[Math.ceil(mid + 0.01)];\n\n    // get position\n    var position = getWaypointsMid(waypoints);\n\n    // calculate angle\n    var angle = Math.atan((second.y - first.y) / (second.x - first.x));\n\n    var x = position.x,\n        y = position.y;\n\n    if (Math.abs(angle) < Math.PI / 2) {\n      y -= FLOW_LABEL_INDENT;\n    } else {\n      x += FLOW_LABEL_INDENT;\n    }\n\n    return { x: x, y: y };\n  }\n\n\n  /**\n   * Get the middle of a number of waypoints.\n   *\n   * @param  {Point[]} waypoints\n   *\n   * @return {Point}\n   */\n  function getWaypointsMid(waypoints) {\n\n    var mid = waypoints.length / 2 - 1;\n\n    var first = waypoints[Math.floor(mid)];\n    var second = waypoints[Math.ceil(mid + 0.01)];\n\n    return {\n      x: first.x + (second.x - first.x) / 2,\n      y: first.y + (second.y - first.y) / 2\n    };\n  }\n\n  /**\n   * Get the middle of the external label of an element.\n   *\n   * @param {Element} element\n   *\n   * @return {Point}\n   */\n  function getExternalLabelMid(element) {\n\n    if (element.waypoints) {\n      return getFlowLabelPosition(element.waypoints);\n    } else if (is$1(element, 'bpmn:Group')) {\n      return {\n        x: element.x + element.width / 2,\n        y: element.y + DEFAULT_LABEL_SIZE$1.height / 2\n      };\n    } else {\n      return {\n        x: element.x + element.width / 2,\n        y: element.y + element.height + DEFAULT_LABEL_SIZE$1.height / 2\n      };\n    }\n  }\n\n\n  /**\n   * Return the bounds of an elements label, parsed from the elements DI or\n   * generated from its bounds.\n   *\n   * @param {ModdleElement} di\n   * @param {Element} element\n   *\n   * @return {Rect}\n   */\n  function getExternalLabelBounds(di, element) {\n\n    var mid,\n        size,\n        bounds,\n        label = di.label;\n\n    if (label && label.bounds) {\n      bounds = label.bounds;\n\n      size = {\n        width: Math.max(DEFAULT_LABEL_SIZE$1.width, bounds.width),\n        height: bounds.height\n      };\n\n      mid = {\n        x: bounds.x + bounds.width / 2,\n        y: bounds.y + bounds.height / 2\n      };\n    } else {\n\n      mid = getExternalLabelMid(element);\n\n      size = DEFAULT_LABEL_SIZE$1;\n    }\n\n    return assign$1({\n      x: mid.x - size.width / 2,\n      y: mid.y - size.height / 2\n    }, size);\n  }\n\n  /**\n   * @param {ModdleElement} semantic\n   *\n   * @returns {string}\n   */\n  function getLabelAttr(semantic) {\n    if (\n      is$1(semantic, 'bpmn:FlowElement') ||\n      is$1(semantic, 'bpmn:Participant') ||\n      is$1(semantic, 'bpmn:Lane') ||\n      is$1(semantic, 'bpmn:SequenceFlow') ||\n      is$1(semantic, 'bpmn:MessageFlow') ||\n      is$1(semantic, 'bpmn:DataInput') ||\n      is$1(semantic, 'bpmn:DataOutput')\n    ) {\n      return 'name';\n    }\n\n    if (is$1(semantic, 'bpmn:TextAnnotation')) {\n      return 'text';\n    }\n\n    if (is$1(semantic, 'bpmn:Group')) {\n      return 'categoryValueRef';\n    }\n  }\n\n  /**\n   * @param {ModdleElement} semantic\n   *\n   * @returns {string}\n   */\n  function getCategoryValue(semantic) {\n    var categoryValueRef = semantic['categoryValueRef'];\n\n    if (!categoryValueRef) {\n      return '';\n    }\n\n\n    return categoryValueRef.value || '';\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {string}\n   */\n  function getLabel(element) {\n    var semantic = element.businessObject,\n        attr = getLabelAttr(semantic);\n\n    if (attr) {\n\n      if (attr === 'categoryValueRef') {\n\n        return getCategoryValue(semantic);\n      }\n\n      return semantic[attr] || '';\n    }\n  }\n\n  function ensureImported(element, target) {\n\n    if (element.ownerDocument !== target.ownerDocument) {\n      try {\n\n        // may fail on webkit\n        return target.ownerDocument.importNode(element, true);\n      } catch (e) {\n\n        // ignore\n      }\n    }\n\n    return element;\n  }\n\n  /**\n   * appendTo utility\n   */\n\n  /**\n   * Append a node to a target element and return the appended node.\n   *\n   * @param  {SVGElement} element\n   * @param  {SVGElement} target\n   *\n   * @return {SVGElement} the appended node\n   */\n  function appendTo(element, target) {\n    return target.appendChild(ensureImported(element, target));\n  }\n\n  /**\n   * append utility\n   */\n\n  /**\n   * Append a node to an element\n   *\n   * @param  {SVGElement} element\n   * @param  {SVGElement} node\n   *\n   * @return {SVGElement} the element\n   */\n  function append(target, node) {\n    appendTo(node, target);\n    return target;\n  }\n\n  /**\n   * attribute accessor utility\n   */\n\n  var LENGTH_ATTR = 2;\n\n  var CSS_PROPERTIES = {\n    'alignment-baseline': 1,\n    'baseline-shift': 1,\n    'clip': 1,\n    'clip-path': 1,\n    'clip-rule': 1,\n    'color': 1,\n    'color-interpolation': 1,\n    'color-interpolation-filters': 1,\n    'color-profile': 1,\n    'color-rendering': 1,\n    'cursor': 1,\n    'direction': 1,\n    'display': 1,\n    'dominant-baseline': 1,\n    'enable-background': 1,\n    'fill': 1,\n    'fill-opacity': 1,\n    'fill-rule': 1,\n    'filter': 1,\n    'flood-color': 1,\n    'flood-opacity': 1,\n    'font': 1,\n    'font-family': 1,\n    'font-size': LENGTH_ATTR,\n    'font-size-adjust': 1,\n    'font-stretch': 1,\n    'font-style': 1,\n    'font-variant': 1,\n    'font-weight': 1,\n    'glyph-orientation-horizontal': 1,\n    'glyph-orientation-vertical': 1,\n    'image-rendering': 1,\n    'kerning': 1,\n    'letter-spacing': 1,\n    'lighting-color': 1,\n    'marker': 1,\n    'marker-end': 1,\n    'marker-mid': 1,\n    'marker-start': 1,\n    'mask': 1,\n    'opacity': 1,\n    'overflow': 1,\n    'pointer-events': 1,\n    'shape-rendering': 1,\n    'stop-color': 1,\n    'stop-opacity': 1,\n    'stroke': 1,\n    'stroke-dasharray': 1,\n    'stroke-dashoffset': 1,\n    'stroke-linecap': 1,\n    'stroke-linejoin': 1,\n    'stroke-miterlimit': 1,\n    'stroke-opacity': 1,\n    'stroke-width': LENGTH_ATTR,\n    'text-anchor': 1,\n    'text-decoration': 1,\n    'text-rendering': 1,\n    'unicode-bidi': 1,\n    'visibility': 1,\n    'word-spacing': 1,\n    'writing-mode': 1\n  };\n\n\n  function getAttribute(node, name) {\n    if (CSS_PROPERTIES[name]) {\n      return node.style[name];\n    } else {\n      return node.getAttributeNS(null, name);\n    }\n  }\n\n  function setAttribute(node, name, value) {\n    var hyphenated = name.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n\n    var type = CSS_PROPERTIES[hyphenated];\n\n    if (type) {\n\n      // append pixel unit, unless present\n      if (type === LENGTH_ATTR && typeof value === 'number') {\n        value = String(value) + 'px';\n      }\n\n      node.style[hyphenated] = value;\n    } else {\n      node.setAttributeNS(null, name, value);\n    }\n  }\n\n  function setAttributes(node, attrs) {\n\n    var names = Object.keys(attrs), i, name;\n\n    for (i = 0, name; (name = names[i]); i++) {\n      setAttribute(node, name, attrs[name]);\n    }\n  }\n\n  /**\n   * Gets or sets raw attributes on a node.\n   *\n   * @param  {SVGElement} node\n   * @param  {Object} [attrs]\n   * @param  {String} [name]\n   * @param  {String} [value]\n   *\n   * @return {String}\n   */\n  function attr$1(node, name, value) {\n    if (typeof name === 'string') {\n      if (value !== undefined) {\n        setAttribute(node, name, value);\n      } else {\n        return getAttribute(node, name);\n      }\n    } else {\n      setAttributes(node, name);\n    }\n\n    return node;\n  }\n\n  /**\r\n   * Taken from https://github.com/component/classes\r\n   *\r\n   * Without the component bits.\r\n   */\r\n\r\n  /**\r\n   * toString reference.\r\n   */\r\n\r\n  const toString$1 = Object.prototype.toString;\r\n\r\n  /**\r\n    * Wrap `el` in a `ClassList`.\r\n    *\r\n    * @param {Element} el\r\n    * @return {ClassList}\r\n    * @api public\r\n    */\r\n\r\n  function classes$1(el) {\r\n    return new ClassList$1(el);\r\n  }\r\n\r\n  function ClassList$1(el) {\r\n    if (!el || !el.nodeType) {\r\n      throw new Error('A DOM element reference is required');\r\n    }\r\n    this.el = el;\r\n    this.list = el.classList;\r\n  }\r\n\r\n  /**\r\n    * Add class `name` if not already present.\r\n    *\r\n    * @param {String} name\r\n    * @return {ClassList}\r\n    * @api public\r\n    */\r\n\r\n  ClassList$1.prototype.add = function(name) {\r\n    this.list.add(name);\r\n    return this;\r\n  };\r\n\r\n  /**\r\n    * Remove class `name` when present, or\r\n    * pass a regular expression to remove\r\n    * any which match.\r\n    *\r\n    * @param {String|RegExp} name\r\n    * @return {ClassList}\r\n    * @api public\r\n    */\r\n\r\n  ClassList$1.prototype.remove = function(name) {\r\n    if ('[object RegExp]' == toString$1.call(name)) {\r\n      return this.removeMatching(name);\r\n    }\r\n\r\n    this.list.remove(name);\r\n    return this;\r\n  };\r\n\r\n  /**\r\n    * Remove all classes matching `re`.\r\n    *\r\n    * @param {RegExp} re\r\n    * @return {ClassList}\r\n    * @api private\r\n    */\r\n\r\n  ClassList$1.prototype.removeMatching = function(re) {\r\n    const arr = this.array();\r\n    for (let i = 0; i < arr.length; i++) {\r\n      if (re.test(arr[i])) {\r\n        this.remove(arr[i]);\r\n      }\r\n    }\r\n    return this;\r\n  };\r\n\r\n  /**\r\n    * Toggle class `name`, can force state via `force`.\r\n    *\r\n    * For browsers that support classList, but do not support `force` yet,\r\n    * the mistake will be detected and corrected.\r\n    *\r\n    * @param {String} name\r\n    * @param {Boolean} force\r\n    * @return {ClassList}\r\n    * @api public\r\n    */\r\n\r\n  ClassList$1.prototype.toggle = function(name, force) {\r\n    if ('undefined' !== typeof force) {\r\n      if (force !== this.list.toggle(name, force)) {\r\n        this.list.toggle(name); // toggle again to correct\r\n      }\r\n    } else {\r\n      this.list.toggle(name);\r\n    }\r\n    return this;\r\n  };\r\n\r\n  /**\r\n    * Return an array of classes.\r\n    *\r\n    * @return {Array}\r\n    * @api public\r\n    */\r\n\r\n  ClassList$1.prototype.array = function() {\r\n    return Array.from(this.list);\r\n  };\r\n\r\n  /**\r\n    * Check if class `name` is present.\r\n    *\r\n    * @param {String} name\r\n    * @return {ClassList}\r\n    * @api public\r\n    */\r\n\r\n  ClassList$1.prototype.has =\r\n   ClassList$1.prototype.contains = function(name) {\r\n     return this.list.contains(name);\r\n   };\n\n  function remove$2(element) {\n    var parent = element.parentNode;\n\n    if (parent) {\n      parent.removeChild(element);\n    }\n\n    return element;\n  }\n\n  /**\n   * Clear utility\n   */\n\n  /**\n   * Removes all children from the given element\n   *\n   * @param  {DOMElement} element\n   * @return {DOMElement} the element (for chaining)\n   */\n  function clear$1(element) {\n    var child;\n\n    while ((child = element.firstChild)) {\n      remove$2(child);\n    }\n\n    return element;\n  }\n\n  var ns = {\n    svg: 'http://www.w3.org/2000/svg'\n  };\n\n  /**\n   * DOM parsing utility\n   */\n\n  var SVG_START = '<svg xmlns=\"' + ns.svg + '\"';\n\n  function parse$1(svg) {\n\n    var unwrap = false;\n\n    // ensure we import a valid svg document\n    if (svg.substring(0, 4) === '<svg') {\n      if (svg.indexOf(ns.svg) === -1) {\n        svg = SVG_START + svg.substring(4);\n      }\n    } else {\n\n      // namespace svg\n      svg = SVG_START + '>' + svg + '</svg>';\n      unwrap = true;\n    }\n\n    var parsed = parseDocument(svg);\n\n    if (!unwrap) {\n      return parsed;\n    }\n\n    var fragment = document.createDocumentFragment();\n\n    var parent = parsed.firstChild;\n\n    while (parent.firstChild) {\n      fragment.appendChild(parent.firstChild);\n    }\n\n    return fragment;\n  }\n\n  function parseDocument(svg) {\n\n    var parser;\n\n    // parse\n    parser = new DOMParser();\n    parser.async = false;\n\n    return parser.parseFromString(svg, 'text/xml');\n  }\n\n  /**\n   * Create utility for SVG elements\n   */\n\n\n  /**\n   * Create a specific type from name or SVG markup.\n   *\n   * @param {String} name the name or markup of the element\n   * @param {Object} [attrs] attributes to set on the element\n   *\n   * @returns {SVGElement}\n   */\n  function create$1(name, attrs) {\n    var element;\n\n    if (name.charAt(0) === '<') {\n      element = parse$1(name).firstChild;\n      element = document.importNode(element, true);\n    } else {\n      element = document.createElementNS(ns.svg, name);\n    }\n\n    if (attrs) {\n      attr$1(element, attrs);\n    }\n\n    return element;\n  }\n\n  /**\n   * Geometry helpers\n   */\n\n  // fake node used to instantiate svg geometry elements\n  var node = null;\n\n  function getNode() {\n    if (node === null) {\n      node = create$1('svg');\n    }\n\n    return node;\n  }\n\n  function extend$1(object, props) {\n    var i, k, keys = Object.keys(props);\n\n    for (i = 0; (k = keys[i]); i++) {\n      object[k] = props[k];\n    }\n\n    return object;\n  }\n\n  /**\n   * Create matrix via args.\n   *\n   * @example\n   *\n   * createMatrix({ a: 1, b: 1 });\n   * createMatrix();\n   * createMatrix(1, 2, 0, 0, 30, 20);\n   *\n   * @return {SVGMatrix}\n   */\n  function createMatrix(a, b, c, d, e, f) {\n    var matrix = getNode().createSVGMatrix();\n\n    switch (arguments.length) {\n    case 0:\n      return matrix;\n    case 1:\n      return extend$1(matrix, a);\n    case 6:\n      return extend$1(matrix, {\n        a: a,\n        b: b,\n        c: c,\n        d: d,\n        e: e,\n        f: f\n      });\n    }\n  }\n\n  function createTransform(matrix) {\n    if (matrix) {\n      return getNode().createSVGTransformFromMatrix(matrix);\n    } else {\n      return getNode().createSVGTransform();\n    }\n  }\n\n  /**\n   * Serialization util\n   */\n\n  var TEXT_ENTITIES = /([&<>]{1})/g;\n  var ATTR_ENTITIES = /([\\n\\r\"]{1})/g;\n\n  var ENTITY_REPLACEMENT = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '\\''\n  };\n\n  function escape$1(str, pattern) {\n\n    function replaceFn(match, entity) {\n      return ENTITY_REPLACEMENT[entity] || entity;\n    }\n\n    return str.replace(pattern, replaceFn);\n  }\n\n  function serialize(node, output) {\n\n    var i, len, attrMap, attrNode, childNodes;\n\n    switch (node.nodeType) {\n\n    // TEXT\n    case 3:\n\n      // replace special XML characters\n      output.push(escape$1(node.textContent, TEXT_ENTITIES));\n      break;\n\n    // ELEMENT\n    case 1:\n      output.push('<', node.tagName);\n\n      if (node.hasAttributes()) {\n        attrMap = node.attributes;\n        for (i = 0, len = attrMap.length; i < len; ++i) {\n          attrNode = attrMap.item(i);\n          output.push(' ', attrNode.name, '=\"', escape$1(attrNode.value, ATTR_ENTITIES), '\"');\n        }\n      }\n\n      if (node.hasChildNodes()) {\n        output.push('>');\n        childNodes = node.childNodes;\n        for (i = 0, len = childNodes.length; i < len; ++i) {\n          serialize(childNodes.item(i), output);\n        }\n        output.push('</', node.tagName, '>');\n      } else {\n        output.push('/>');\n      }\n      break;\n\n    // COMMENT\n    case 8:\n      output.push('<!--', escape$1(node.nodeValue, TEXT_ENTITIES), '-->');\n      break;\n\n    // CDATA\n    case 4:\n      output.push('<![CDATA[', node.nodeValue, ']]>');\n      break;\n\n    default:\n      throw new Error('unable to handle node ' + node.nodeType);\n    }\n\n    return output;\n  }\n\n  /**\n   * innerHTML like functionality for SVG elements.\n   * based on innerSVG (https://code.google.com/p/innersvg)\n   */\n\n\n  function set(element, svg) {\n\n    var parsed = parse$1(svg);\n\n    // clear element contents\n    clear$1(element);\n\n    if (!svg) {\n      return;\n    }\n\n    if (!isFragment(parsed)) {\n\n      // extract <svg> from parsed document\n      parsed = parsed.documentElement;\n    }\n\n    var nodes = slice$1(parsed.childNodes);\n\n    // import + append each node\n    for (var i = 0; i < nodes.length; i++) {\n      appendTo(nodes[i], element);\n    }\n\n  }\n\n  function get(element) {\n    var child = element.firstChild,\n        output = [];\n\n    while (child) {\n      serialize(child, output);\n      child = child.nextSibling;\n    }\n\n    return output.join('');\n  }\n\n  function isFragment(node) {\n    return node.nodeName === '#document-fragment';\n  }\n\n  function innerSVG(element, svg) {\n\n    if (svg !== undefined) {\n\n      try {\n        set(element, svg);\n      } catch (e) {\n        throw new Error('error parsing SVG: ' + e.message);\n      }\n\n      return element;\n    } else {\n      return get(element);\n    }\n  }\n\n\n  function slice$1(arr) {\n    return Array.prototype.slice.call(arr);\n  }\n\n  /**\n   * transform accessor utility\n   */\n\n  function wrapMatrix(transformList, transform) {\n    if (transform instanceof SVGMatrix) {\n      return transformList.createSVGTransformFromMatrix(transform);\n    }\n\n    return transform;\n  }\n\n\n  function setTransforms(transformList, transforms) {\n    var i, t;\n\n    transformList.clear();\n\n    for (i = 0; (t = transforms[i]); i++) {\n      transformList.appendItem(wrapMatrix(transformList, t));\n    }\n  }\n\n  /**\n   * Get or set the transforms on the given node.\n   *\n   * @param {SVGElement} node\n   * @param  {SVGTransform|SVGMatrix|Array<SVGTransform|SVGMatrix>} [transforms]\n   *\n   * @return {SVGTransform} the consolidated transform\n   */\n  function transform$1(node, transforms) {\n    var transformList = node.transform.baseVal;\n\n    if (transforms) {\n\n      if (!Array.isArray(transforms)) {\n        transforms = [ transforms ];\n      }\n\n      setTransforms(transformList, transforms);\n    }\n\n    return transformList.consolidate();\n  }\n\n  /**\n   * @typedef {(string|number)[]} Component\n   *\n   * @typedef {import('../util/Types').Point} Point\n   */\n\n  /**\n   * @param {Component[] | Component[][]} elements\n   *\n   * @return {string}\n   */\n  function componentsToPath(elements) {\n    return elements.flat().join(',').replace(/,?([A-z]),?/g, '$1');\n  }\n\n  /**\n   * @param {Point} point\n   *\n   * @return {Component[]}\n   */\n  function move(point) {\n    return [ 'M', point.x, point.y ];\n  }\n\n  /**\n   * @param {Point} point\n   *\n   * @return {Component[]}\n   */\n  function lineTo(point) {\n    return [ 'L', point.x, point.y ];\n  }\n\n  /**\n   * @param {Point} p1\n   * @param {Point} p2\n   * @param {Point} p3\n   *\n   * @return {Component[]}\n   */\n  function curveTo(p1, p2, p3) {\n    return [ 'C', p1.x, p1.y, p2.x, p2.y, p3.x, p3.y ];\n  }\n\n  /**\n   * @param {Point[]} waypoints\n   * @param {number} [cornerRadius]\n   * @return {Component[][]}\n   */\n  function drawPath(waypoints, cornerRadius) {\n    const pointCount = waypoints.length;\n\n    const path = [ move(waypoints[0]) ];\n\n    for (let i = 1; i < pointCount; i++) {\n\n      const pointBefore = waypoints[i - 1];\n      const point = waypoints[i];\n      const pointAfter = waypoints[i + 1];\n\n      if (!pointAfter || !cornerRadius) {\n        path.push(lineTo(point));\n\n        continue;\n      }\n\n      const effectiveRadius = Math.min(\n        cornerRadius,\n        vectorLength(point.x - pointBefore.x, point.y - pointBefore.y),\n        vectorLength(pointAfter.x - point.x, pointAfter.y - point.y)\n      );\n\n      if (!effectiveRadius) {\n        path.push(lineTo(point));\n\n        continue;\n      }\n\n      const beforePoint = getPointAtLength(point, pointBefore, effectiveRadius);\n      const beforePoint2 = getPointAtLength(point, pointBefore, effectiveRadius * .5);\n\n      const afterPoint = getPointAtLength(point, pointAfter, effectiveRadius);\n      const afterPoint2 = getPointAtLength(point, pointAfter, effectiveRadius * .5);\n\n      path.push(lineTo(beforePoint));\n      path.push(curveTo(beforePoint2, afterPoint2, afterPoint));\n    }\n\n    return path;\n  }\n\n  function getPointAtLength(start, end, length) {\n\n    const deltaX = end.x - start.x;\n    const deltaY = end.y - start.y;\n\n    const totalLength = vectorLength(deltaX, deltaY);\n\n    const percent = length / totalLength;\n\n    return {\n      x: start.x + deltaX * percent,\n      y: start.y + deltaY * percent\n    };\n  }\n\n  function vectorLength(x, y) {\n    return Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));\n  }\n\n  /**\n   * @param {Point[]} points\n   * @param {number|Object} [attrs]\n   * @param {number} [radius]\n   *\n   * @return {SVGElement}\n   */\n  function createLine(points, attrs, radius) {\n\n    if (isNumber(attrs)) {\n      radius = attrs;\n      attrs = null;\n    }\n\n    if (!attrs) {\n      attrs = {};\n    }\n\n    const line = create$1('path', attrs);\n\n    if (isNumber(radius)) {\n      line.dataset.cornerRadius = String(radius);\n    }\n\n    return updateLine(line, points);\n  }\n\n  /**\n   * @param {SVGElement} gfx\n   * @param {Point[]} points\n   *\n   * @return {SVGElement}\n   */\n  function updateLine(gfx, points) {\n\n    const cornerRadius = parseInt(gfx.dataset.cornerRadius, 10) || 0;\n\n    attr$1(gfx, {\n      d: componentsToPath(drawPath(points, cornerRadius))\n    });\n\n    return gfx;\n  }\n\n  var black = 'hsl(225, 10%, 15%)';\n\n  // element utils //////////////////////\n\n  /**\n   * Checks if eventDefinition of the given element matches with semantic type.\n   *\n   * @param {ModdleElement} event\n   * @param {string} eventDefinitionType\n   *\n   * @return {boolean}\n   */\n  function isTypedEvent(event, eventDefinitionType) {\n    return some(event.eventDefinitions, function(definition) {\n      return definition.$type === eventDefinitionType;\n    });\n  }\n\n  /**\n   * Check if element is a throw event.\n   *\n   * @param {ModdleElement} event\n   *\n   * @return {boolean}\n   */\n  function isThrowEvent(event) {\n    return (event.$type === 'bpmn:IntermediateThrowEvent') || (event.$type === 'bpmn:EndEvent');\n  }\n\n  /**\n   * Check if element is a throw event.\n   *\n   * @param {ModdleElement} element\n   *\n   * @return {boolean}\n   */\n  function isCollection(element) {\n    var dataObject = element.dataObjectRef;\n\n    return element.isCollection || (dataObject && dataObject.isCollection);\n  }\n\n\n  // color access //////////////////////\n\n  /**\n   * @param {Element} element\n   * @param {string} [defaultColor]\n   *\n   * @return {string}\n   */\n  function getFillColor(element, defaultColor) {\n    var di = getDi(element);\n\n    return di.get('color:background-color') || di.get('bioc:fill') || defaultColor || 'white';\n  }\n\n  /**\n   * @param {Element} element\n   * @param {string} [defaultColor]\n   *\n   * @return {string}\n   */\n  function getStrokeColor(element, defaultColor) {\n    var di = getDi(element);\n\n    return di.get('color:border-color') || di.get('bioc:stroke') || defaultColor || black;\n  }\n\n  /**\n   * @param {Element} element\n   * @param {string} [defaultColor]\n   * @param {string} [defaultStrokeColor]\n   *\n   * @return {string}\n   */\n  function getLabelColor(element, defaultColor, defaultStrokeColor) {\n    var di = getDi(element),\n        label = di.get('label');\n\n    return label && label.get('color:color') || defaultColor ||\n      getStrokeColor(element, defaultStrokeColor);\n  }\n\n  // cropping path customizations //////////////////////\n\n  /**\n   * @param {ShapeLike} shape\n   *\n   * @return {string} path\n   */\n  function getCirclePath(shape) {\n\n    var cx = shape.x + shape.width / 2,\n        cy = shape.y + shape.height / 2,\n        radius = shape.width / 2;\n\n    var circlePath = [\n      [ 'M', cx, cy ],\n      [ 'm', 0, -radius ],\n      [ 'a', radius, radius, 0, 1, 1, 0, 2 * radius ],\n      [ 'a', radius, radius, 0, 1, 1, 0, -2 * radius ],\n      [ 'z' ]\n    ];\n\n    return componentsToPath(circlePath);\n  }\n\n  /**\n   * @param {ShapeLike} shape\n   * @param {number} [borderRadius]\n   *\n   * @return {string} path\n   */\n  function getRoundRectPath(shape, borderRadius) {\n\n    var x = shape.x,\n        y = shape.y,\n        width = shape.width,\n        height = shape.height;\n\n    var roundRectPath = [\n      [ 'M', x + borderRadius, y ],\n      [ 'l', width - borderRadius * 2, 0 ],\n      [ 'a', borderRadius, borderRadius, 0, 0, 1, borderRadius, borderRadius ],\n      [ 'l', 0, height - borderRadius * 2 ],\n      [ 'a', borderRadius, borderRadius, 0, 0, 1, -borderRadius, borderRadius ],\n      [ 'l', borderRadius * 2 - width, 0 ],\n      [ 'a', borderRadius, borderRadius, 0, 0, 1, -borderRadius, -borderRadius ],\n      [ 'l', 0, borderRadius * 2 - height ],\n      [ 'a', borderRadius, borderRadius, 0, 0, 1, borderRadius, -borderRadius ],\n      [ 'z' ]\n    ];\n\n    return componentsToPath(roundRectPath);\n  }\n\n  /**\n   * @param {ShapeLike} shape\n   *\n   * @return {string} path\n   */\n  function getDiamondPath(shape) {\n\n    var width = shape.width,\n        height = shape.height,\n        x = shape.x,\n        y = shape.y,\n        halfWidth = width / 2,\n        halfHeight = height / 2;\n\n    var diamondPath = [\n      [ 'M', x + halfWidth, y ],\n      [ 'l', halfWidth, halfHeight ],\n      [ 'l', -halfWidth, halfHeight ],\n      [ 'l', -halfWidth, -halfHeight ],\n      [ 'z' ]\n    ];\n\n    return componentsToPath(diamondPath);\n  }\n\n  /**\n   * @param {ShapeLike} shape\n   *\n   * @return {string} path\n   */\n  function getRectPath(shape) {\n    var x = shape.x,\n        y = shape.y,\n        width = shape.width,\n        height = shape.height;\n\n    var rectPath = [\n      [ 'M', x, y ],\n      [ 'l', width, 0 ],\n      [ 'l', 0, height ],\n      [ 'l', -width, 0 ],\n      [ 'z' ]\n    ];\n\n    return componentsToPath(rectPath);\n  }\n\n  function _mergeNamespaces$1(n, m) {\n    m.forEach(function (e) {\n      e && typeof e !== 'string' && !Array.isArray(e) && Object.keys(e).forEach(function (k) {\n        if (k !== 'default' && !(k in n)) {\n          var d = Object.getOwnPropertyDescriptor(e, k);\n          Object.defineProperty(n, k, d.get ? d : {\n            enumerable: true,\n            get: function () { return e[k]; }\n          });\n        }\n      });\n    });\n    return Object.freeze(n);\n  }\n\n  /**\n   * Flatten array, one level deep.\n   *\n   * @param {Array<?>} arr\n   *\n   * @return {Array<?>}\n   */\n\n  const nativeToString = Object.prototype.toString;\n  const nativeHasOwnProperty = Object.prototype.hasOwnProperty;\n\n  function isUndefined$1(obj) {\n    return obj === undefined;\n  }\n\n  function isArray$1(obj) {\n    return nativeToString.call(obj) === '[object Array]';\n  }\n\n  /**\n   * Return true, if target owns a property with the given key.\n   *\n   * @param {Object} target\n   * @param {String} key\n   *\n   * @return {Boolean}\n   */\n  function has(target, key) {\n    return nativeHasOwnProperty.call(target, key);\n  }\n\n\n  /**\n   * Iterate over collection; returning something\n   * (non-undefined) will stop iteration.\n   *\n   * @param  {Array|Object} collection\n   * @param  {Function} iterator\n   *\n   * @return {Object} return result that stopped the iteration\n   */\n  function forEach(collection, iterator) {\n\n    let val,\n        result;\n\n    if (isUndefined$1(collection)) {\n      return;\n    }\n\n    const convertKey = isArray$1(collection) ? toNum : identity;\n\n    for (let key in collection) {\n\n      if (has(collection, key)) {\n        val = collection[key];\n\n        result = iterator(val, convertKey(key));\n\n        if (result === false) {\n          return val;\n        }\n      }\n    }\n  }\n\n\n  function identity(arg) {\n    return arg;\n  }\n\n  function toNum(arg) {\n    return Number(arg);\n  }\n\n  /**\n   * Assigns style attributes in a style-src compliant way.\n   *\n   * @param {Element} element\n   * @param {...Object} styleSources\n   *\n   * @return {Element} the element\n   */\n  function assign(element, ...styleSources) {\n    const target = element.style;\n\n    forEach(styleSources, function(style) {\n      if (!style) {\n        return;\n      }\n\n      forEach(style, function(value, key) {\n        target[key] = value;\n      });\n    });\n\n    return element;\n  }\n\n  /**\n   * Set attribute `name` to `val`, or get attr `name`.\n   *\n   * @param {Element} el\n   * @param {String} name\n   * @param {String} [val]\n   * @api public\n   */\n  function attr(el, name, val) {\n\n    // get\n    if (arguments.length == 2) {\n      return el.getAttribute(name);\n    }\n\n    // remove\n    if (val === null) {\n      return el.removeAttribute(name);\n    }\n\n    // set\n    el.setAttribute(name, val);\n\n    return el;\n  }\n\n  /**\n   * Taken from https://github.com/component/classes\n   *\n   * Without the component bits.\n   */\n\n  /**\n   * toString reference.\n   */\n\n  const toString = Object.prototype.toString;\n\n  /**\n   * Wrap `el` in a `ClassList`.\n   *\n   * @param {Element} el\n   * @return {ClassList}\n   * @api public\n   */\n\n  function classes(el) {\n    return new ClassList(el);\n  }\n\n  /**\n   * Initialize a new ClassList for `el`.\n   *\n   * @param {Element} el\n   * @api private\n   */\n\n  function ClassList(el) {\n    if (!el || !el.nodeType) {\n      throw new Error('A DOM element reference is required');\n    }\n    this.el = el;\n    this.list = el.classList;\n  }\n\n  /**\n   * Add class `name` if not already present.\n   *\n   * @param {String} name\n   * @return {ClassList}\n   * @api public\n   */\n\n  ClassList.prototype.add = function(name) {\n    this.list.add(name);\n    return this;\n  };\n\n  /**\n   * Remove class `name` when present, or\n   * pass a regular expression to remove\n   * any which match.\n   *\n   * @param {String|RegExp} name\n   * @return {ClassList}\n   * @api public\n   */\n\n  ClassList.prototype.remove = function(name) {\n    if ('[object RegExp]' == toString.call(name)) {\n      return this.removeMatching(name);\n    }\n\n    this.list.remove(name);\n    return this;\n  };\n\n  /**\n   * Remove all classes matching `re`.\n   *\n   * @param {RegExp} re\n   * @return {ClassList}\n   * @api private\n   */\n\n  ClassList.prototype.removeMatching = function(re) {\n    const arr = this.array();\n    for (let i = 0; i < arr.length; i++) {\n      if (re.test(arr[i])) {\n        this.remove(arr[i]);\n      }\n    }\n    return this;\n  };\n\n  /**\n   * Toggle class `name`, can force state via `force`.\n   *\n   * For browsers that support classList, but do not support `force` yet,\n   * the mistake will be detected and corrected.\n   *\n   * @param {String} name\n   * @param {Boolean} force\n   * @return {ClassList}\n   * @api public\n   */\n\n  ClassList.prototype.toggle = function(name, force) {\n    if ('undefined' !== typeof force) {\n      if (force !== this.list.toggle(name, force)) {\n        this.list.toggle(name); // toggle again to correct\n      }\n    } else {\n      this.list.toggle(name);\n    }\n    return this;\n  };\n\n  /**\n   * Return an array of classes.\n   *\n   * @return {Array}\n   * @api public\n   */\n\n  ClassList.prototype.array = function() {\n    return Array.from(this.list);\n  };\n\n  /**\n   * Check if class `name` is present.\n   *\n   * @param {String} name\n   * @return {ClassList}\n   * @api public\n   */\n\n  ClassList.prototype.has =\n  ClassList.prototype.contains = function(name) {\n    return this.list.contains(name);\n  };\n\n  /**\n   * Remove all children from the given element.\n   */\n  function clear(el) {\n\n    var c;\n\n    while (el.childNodes.length) {\n      c = el.childNodes[0];\n      el.removeChild(c);\n    }\n\n    return el;\n  }\n\n  /**\n   * @param { HTMLElement } element\n   * @param { String } selector\n   *\n   * @return { boolean }\n   */\n  function matches(element, selector) {\n    return element && typeof element.matches === 'function' && element.matches(selector);\n  }\n\n  /**\n   * Closest\n   *\n   * @param {Element} el\n   * @param {String} selector\n   * @param {Boolean} checkYourSelf (optional)\n   */\n  function closest(element, selector, checkYourSelf) {\n    var currentElem = checkYourSelf ? element : element.parentNode;\n\n    while (currentElem && currentElem.nodeType !== document.DOCUMENT_NODE &&\n        currentElem.nodeType !== document.DOCUMENT_FRAGMENT_NODE) {\n\n      if (matches(currentElem, selector)) {\n        return currentElem;\n      }\n\n      currentElem = currentElem.parentNode;\n    }\n\n    return matches(currentElem, selector) ? currentElem : null;\n  }\n\n  var componentEvent = {};\n\n  var bind$1, unbind$1, prefix$6;\n\n  function detect () {\n    bind$1 = window.addEventListener ? 'addEventListener' : 'attachEvent';\n    unbind$1 = window.removeEventListener ? 'removeEventListener' : 'detachEvent';\n    prefix$6 = bind$1 !== 'addEventListener' ? 'on' : '';\n  }\n\n  /**\n   * Bind `el` event `type` to `fn`.\n   *\n   * @param {Element} el\n   * @param {String} type\n   * @param {Function} fn\n   * @param {Boolean} capture\n   * @return {Function}\n   * @api public\n   */\n\n  var bind_1 = componentEvent.bind = function(el, type, fn, capture){\n    if (!bind$1) detect();\n    el[bind$1](prefix$6 + type, fn, capture || false);\n    return fn;\n  };\n\n  /**\n   * Unbind `el` event `type`'s callback `fn`.\n   *\n   * @param {Element} el\n   * @param {String} type\n   * @param {Function} fn\n   * @param {Boolean} capture\n   * @return {Function}\n   * @api public\n   */\n\n  var unbind_1 = componentEvent.unbind = function(el, type, fn, capture){\n    if (!unbind$1) detect();\n    el[unbind$1](prefix$6 + type, fn, capture || false);\n    return fn;\n  };\n\n  var event = /*#__PURE__*/_mergeNamespaces$1({\n    __proto__: null,\n    bind: bind_1,\n    unbind: unbind_1,\n    'default': componentEvent\n  }, [componentEvent]);\n\n  /**\n   * Module dependencies.\n   */\n\n  /**\n   * Delegate event `type` to `selector`\n   * and invoke `fn(e)`. A callback function\n   * is returned which may be passed to `.unbind()`.\n   *\n   * @param {Element} el\n   * @param {String} selector\n   * @param {String} type\n   * @param {Function} fn\n   * @param {Boolean} capture\n   * @return {Function}\n   * @api public\n   */\n\n  // Some events don't bubble, so we want to bind to the capture phase instead\n  // when delegating.\n  var forceCaptureEvents = [ 'focus', 'blur' ];\n\n  function bind(el, selector, type, fn, capture) {\n    if (forceCaptureEvents.indexOf(type) !== -1) {\n      capture = true;\n    }\n\n    return event.bind(el, type, function(e) {\n      var target = e.target || e.srcElement;\n      e.delegateTarget = closest(target, selector, true);\n      if (e.delegateTarget) {\n        fn.call(el, e);\n      }\n    }, capture);\n  }\n\n  /**\n   * Unbind event `type`'s callback `fn`.\n   *\n   * @param {Element} el\n   * @param {String} type\n   * @param {Function} fn\n   * @param {Boolean} capture\n   * @api public\n   */\n  function unbind(el, type, fn, capture) {\n    if (forceCaptureEvents.indexOf(type) !== -1) {\n      capture = true;\n    }\n\n    return event.unbind(el, type, fn, capture);\n  }\n\n  var delegate = {\n    bind,\n    unbind\n  };\n\n  /**\n   * Expose `parse`.\n   */\n\n  var domify = parse;\n\n  /**\n   * Tests for browser support.\n   */\n\n  var innerHTMLBug = false;\n  var bugTestDiv;\n  if (typeof document !== 'undefined') {\n    bugTestDiv = document.createElement('div');\n    // Setup\n    bugTestDiv.innerHTML = '  <link/><table></table><a href=\"/a\">a</a><input type=\"checkbox\"/>';\n    // Make sure that link elements get serialized correctly by innerHTML\n    // This requires a wrapper element in IE\n    innerHTMLBug = !bugTestDiv.getElementsByTagName('link').length;\n    bugTestDiv = undefined;\n  }\n\n  /**\n   * Wrap map from jquery.\n   */\n\n  var map = {\n    legend: [1, '<fieldset>', '</fieldset>'],\n    tr: [2, '<table><tbody>', '</tbody></table>'],\n    col: [2, '<table><tbody></tbody><colgroup>', '</colgroup></table>'],\n    // for script/link/style tags to work in IE6-8, you have to wrap\n    // in a div with a non-whitespace character in front, ha!\n    _default: innerHTMLBug ? [1, 'X<div>', '</div>'] : [0, '', '']\n  };\n\n  map.td =\n  map.th = [3, '<table><tbody><tr>', '</tr></tbody></table>'];\n\n  map.option =\n  map.optgroup = [1, '<select multiple=\"multiple\">', '</select>'];\n\n  map.thead =\n  map.tbody =\n  map.colgroup =\n  map.caption =\n  map.tfoot = [1, '<table>', '</table>'];\n\n  map.polyline =\n  map.ellipse =\n  map.polygon =\n  map.circle =\n  map.text =\n  map.line =\n  map.path =\n  map.rect =\n  map.g = [1, '<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\">','</svg>'];\n\n  /**\n   * Parse `html` and return a DOM Node instance, which could be a TextNode,\n   * HTML DOM Node of some kind (<div> for example), or a DocumentFragment\n   * instance, depending on the contents of the `html` string.\n   *\n   * @param {String} html - HTML string to \"domify\"\n   * @param {Document} doc - The `document` instance to create the Node for\n   * @return {DOMNode} the TextNode, DOM Node, or DocumentFragment instance\n   * @api private\n   */\n\n  function parse(html, doc) {\n    if ('string' != typeof html) throw new TypeError('String expected');\n\n    // default to the global `document` object\n    if (!doc) doc = document;\n\n    // tag name\n    var m = /<([\\w:]+)/.exec(html);\n    if (!m) return doc.createTextNode(html);\n\n    html = html.replace(/^\\s+|\\s+$/g, ''); // Remove leading/trailing whitespace\n\n    var tag = m[1];\n\n    // body support\n    if (tag == 'body') {\n      var el = doc.createElement('html');\n      el.innerHTML = html;\n      return el.removeChild(el.lastChild);\n    }\n\n    // wrap map\n    var wrap = Object.prototype.hasOwnProperty.call(map, tag) ? map[tag] : map._default;\n    var depth = wrap[0];\n    var prefix = wrap[1];\n    var suffix = wrap[2];\n    var el = doc.createElement('div');\n    el.innerHTML = prefix + html + suffix;\n    while (depth--) el = el.lastChild;\n\n    // one element\n    if (el.firstChild == el.lastChild) {\n      return el.removeChild(el.firstChild);\n    }\n\n    // several elements\n    var fragment = doc.createDocumentFragment();\n    while (el.firstChild) {\n      fragment.appendChild(el.removeChild(el.firstChild));\n    }\n\n    return fragment;\n  }\n\n  var domify$1 = domify;\n\n  function query(selector, el) {\n    el = el || document;\n\n    return el.querySelector(selector);\n  }\n\n  function all(selector, el) {\n    el = el || document;\n\n    return el.querySelectorAll(selector);\n  }\n\n  function remove$1(el) {\n    el.parentNode && el.parentNode.removeChild(el);\n  }\n\n  /**\r\n   * @param {SVGElement} gfx\r\n   * @param {number} x\r\n   * @param {number} y\r\n   * @param {number} [angle]\r\n   * @param {number} [amount]\r\n   */\r\n  function transform(gfx, x, y, angle, amount) {\r\n    var translate = createTransform();\r\n    translate.setTranslate(x, y);\r\n\r\n    var rotate = createTransform();\r\n    rotate.setRotate(angle || 0, 0, 0);\r\n\r\n    var scale = createTransform();\r\n    scale.setScale(amount || 1, amount || 1);\r\n\r\n    transform$1(gfx, [ translate, rotate, scale ]);\r\n  }\r\n\r\n\r\n  /**\r\n   * @param {SVGElement} gfx\r\n   * @param {number} x\r\n   * @param {number} y\r\n   */\r\n  function translate$1(gfx, x, y) {\r\n    var translate = createTransform();\r\n    translate.setTranslate(x, y);\r\n\r\n    transform$1(gfx, translate);\r\n  }\r\n\r\n\r\n  /**\r\n   * @param {SVGElement} gfx\r\n   * @param {number} angle\r\n   */\r\n  function rotate(gfx, angle) {\r\n    var rotate = createTransform();\r\n    rotate.setRotate(angle, 0, 0);\r\n\r\n    transform$1(gfx, rotate);\r\n  }\n\n  function createCommonjsModule(fn, module) {\n  \treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n  }\n\n  var hat_1 = createCommonjsModule(function (module) {\n  var hat = module.exports = function (bits, base) {\n      if (!base) base = 16;\n      if (bits === undefined) bits = 128;\n      if (bits <= 0) return '0';\n      \n      var digits = Math.log(Math.pow(2, bits)) / Math.log(base);\n      for (var i = 2; digits === Infinity; i *= 2) {\n          digits = Math.log(Math.pow(2, bits / i)) / Math.log(base) * i;\n      }\n      \n      var rem = digits - Math.floor(digits);\n      \n      var res = '';\n      \n      for (var i = 0; i < Math.floor(digits); i++) {\n          var x = Math.floor(Math.random() * base).toString(base);\n          res = x + res;\n      }\n      \n      if (rem) {\n          var b = Math.pow(base, rem);\n          var x = Math.floor(Math.random() * b).toString(base);\n          res = x + res;\n      }\n      \n      var parsed = parseInt(res, base);\n      if (parsed !== Infinity && parsed >= Math.pow(2, bits)) {\n          return hat(bits, base)\n      }\n      else return res;\n  };\n\n  hat.rack = function (bits, base, expandBy) {\n      var fn = function (data) {\n          var iters = 0;\n          do {\n              if (iters ++ > 10) {\n                  if (expandBy) bits += expandBy;\n                  else throw new Error('too many ID collisions, use more bits')\n              }\n              \n              var id = hat(bits, base);\n          } while (Object.hasOwnProperty.call(hats, id));\n          \n          hats[id] = data;\n          return id;\n      };\n      var hats = fn.hats = {};\n      \n      fn.get = function (id) {\n          return fn.hats[id];\n      };\n      \n      fn.set = function (id, value) {\n          fn.hats[id] = value;\n          return fn;\n      };\n      \n      fn.bits = bits || 128;\n      fn.base = base || 16;\n      return fn;\n  };\n  });\n\n  /**\n   * Create a new id generator / cache instance.\n   *\n   * You may optionally provide a seed that is used internally.\n   *\n   * @param {Seed} seed\n   */\n\n  function Ids(seed) {\n    if (!(this instanceof Ids)) {\n      return new Ids(seed);\n    }\n\n    seed = seed || [128, 36, 1];\n    this._seed = seed.length ? hat_1.rack(seed[0], seed[1], seed[2]) : seed;\n  }\n  /**\n   * Generate a next id.\n   *\n   * @param {Object} [element] element to bind the id to\n   *\n   * @return {String} id\n   */\n\n  Ids.prototype.next = function (element) {\n    return this._seed(element || true);\n  };\n  /**\n   * Generate a next id with a given prefix.\n   *\n   * @param {Object} [element] element to bind the id to\n   *\n   * @return {String} id\n   */\n\n\n  Ids.prototype.nextPrefixed = function (prefix, element) {\n    var id;\n\n    do {\n      id = prefix + this.next(true);\n    } while (this.assigned(id)); // claim {prefix}{random}\n\n\n    this.claim(id, element); // return\n\n    return id;\n  };\n  /**\n   * Manually claim an existing id.\n   *\n   * @param {String} id\n   * @param {String} [element] element the id is claimed by\n   */\n\n\n  Ids.prototype.claim = function (id, element) {\n    this._seed.set(id, element || true);\n  };\n  /**\n   * Returns true if the given id has already been assigned.\n   *\n   * @param  {String} id\n   * @return {Boolean}\n   */\n\n\n  Ids.prototype.assigned = function (id) {\n    return this._seed.get(id) || false;\n  };\n  /**\n   * Unclaim an id.\n   *\n   * @param  {String} id the id to unclaim\n   */\n\n\n  Ids.prototype.unclaim = function (id) {\n    delete this._seed.hats[id];\n  };\n  /**\n   * Clear all claimed ids.\n   */\n\n\n  Ids.prototype.clear = function () {\n    var hats = this._seed.hats,\n        id;\n\n    for (id in hats) {\n      this.unclaim(id);\n    }\n  };\n\n  var RENDERER_IDS = new Ids();\n\n  var TASK_BORDER_RADIUS = 10;\n  var INNER_OUTER_DIST = 3;\n\n  var DEFAULT_FILL_OPACITY = .95,\n      HIGH_FILL_OPACITY = .35;\n\n  var ELEMENT_LABEL_DISTANCE = 10;\n\n  /**\n   * @typedef { Partial<{\n   *   defaultFillColor: string,\n   *   defaultStrokeColor: string,\n   *   defaultLabelColor: string\n   * }> } BpmnRendererConfig\n   */\n\n  /**\n   * @typedef { import('../model/Types').Element } Element\n   */\n\n  /**\n   * A renderer for BPMN elements\n   *\n   * @param {BpmnRendererConfig} config\n   * @param {import('diagram-js/lib/core/EventBus').default} eventBus\n   * @param {import('diagram-js/lib/draw/Styles').default} styles\n   * @param {import('./PathMap').default} pathMap\n   * @param {import('diagram-js/lib/core/Canvas').default} canvas\n   * @param {import('./TextRenderer').default} textRenderer\n   * @param {number} [priority]\n   */\n  function BpmnRenderer(\n      config, eventBus, styles, pathMap,\n      canvas, textRenderer, priority) {\n\n    BaseRenderer.call(this, eventBus, priority);\n\n    var defaultFillColor = config && config.defaultFillColor,\n        defaultStrokeColor = config && config.defaultStrokeColor,\n        defaultLabelColor = config && config.defaultLabelColor;\n\n    var rendererId = RENDERER_IDS.next();\n\n    var markers = {};\n\n    function shapeStyle(attrs) {\n      return styles.computeStyle(attrs, {\n        strokeLinecap: 'round',\n        strokeLinejoin: 'round',\n        stroke: black,\n        strokeWidth: 2,\n        fill: 'white'\n      });\n    }\n\n    function lineStyle(attrs) {\n      return styles.computeStyle(attrs, [ 'no-fill' ], {\n        strokeLinecap: 'round',\n        strokeLinejoin: 'round',\n        stroke: black,\n        strokeWidth: 2\n      });\n    }\n\n    function addMarker(id, options) {\n      var {\n        ref = { x: 0, y: 0 },\n        scale = 1,\n        element\n      } = options;\n\n      var marker = create$1('marker', {\n        id: id,\n        viewBox: '0 0 20 20',\n        refX: ref.x,\n        refY: ref.y,\n        markerWidth: 20 * scale,\n        markerHeight: 20 * scale,\n        orient: 'auto'\n      });\n\n      append(marker, element);\n\n      var defs = query('defs', canvas._svg);\n\n      if (!defs) {\n        defs = create$1('defs');\n\n        append(canvas._svg, defs);\n      }\n\n      append(defs, marker);\n\n      markers[id] = marker;\n    }\n\n    function colorEscape(str) {\n\n      // only allow characters and numbers\n      return str.replace(/[^0-9a-zA-Z]+/g, '_');\n    }\n\n    function marker(type, fill, stroke) {\n      var id = type + '-' + colorEscape(fill) + '-' + colorEscape(stroke) + '-' + rendererId;\n\n      if (!markers[id]) {\n        createMarker(id, type, fill, stroke);\n      }\n\n      return 'url(#' + id + ')';\n    }\n\n    function createMarker(id, type, fill, stroke) {\n\n      if (type === 'sequenceflow-end') {\n        var sequenceflowEnd = create$1('path', {\n          d: 'M 1 5 L 11 10 L 1 15 Z',\n          ...shapeStyle({\n            fill: stroke,\n            stroke: stroke,\n            strokeWidth: 1\n          })\n        });\n\n        addMarker(id, {\n          element: sequenceflowEnd,\n          ref: { x: 11, y: 10 },\n          scale: 0.5\n        });\n      }\n\n      if (type === 'messageflow-start') {\n        var messageflowStart = create$1('circle', {\n          cx: 6,\n          cy: 6,\n          r: 3.5,\n          ...shapeStyle({\n            fill: fill,\n            stroke: stroke,\n            strokeWidth: 1,\n\n            // fix for safari / chrome / firefox bug not correctly\n            // resetting stroke dash array\n            strokeDasharray: [ 10000, 1 ]\n          })\n        });\n\n        addMarker(id, {\n          element: messageflowStart,\n          ref: { x: 6, y: 6 }\n        });\n      }\n\n      if (type === 'messageflow-end') {\n        var messageflowEnd = create$1('path', {\n          d: 'm 1 5 l 0 -3 l 7 3 l -7 3 z',\n          ...shapeStyle({\n            fill: fill,\n            stroke: stroke,\n            strokeWidth: 1,\n\n            // fix for safari / chrome / firefox bug not correctly\n            // resetting stroke dash array\n            strokeDasharray: [ 10000, 1 ]\n          })\n        });\n\n        addMarker(id, {\n          element: messageflowEnd,\n          ref: { x: 8.5, y: 5 }\n        });\n      }\n\n      if (type === 'association-start') {\n        var associationStart = create$1('path', {\n          d: 'M 11 5 L 1 10 L 11 15',\n          ...lineStyle({\n            fill: 'none',\n            stroke: stroke,\n            strokeWidth: 1.5,\n\n            // fix for safari / chrome / firefox bug not correctly\n            // resetting stroke dash array\n            strokeDasharray: [ 10000, 1 ]\n          })\n        });\n\n        addMarker(id, {\n          element: associationStart,\n          ref: { x: 1, y: 10 },\n          scale: 0.5\n        });\n      }\n\n      if (type === 'association-end') {\n        var associationEnd = create$1('path', {\n          d: 'M 1 5 L 11 10 L 1 15',\n          ...lineStyle({\n            fill: 'none',\n            stroke: stroke,\n            strokeWidth: 1.5,\n\n            // fix for safari / chrome / firefox bug not correctly\n            // resetting stroke dash array\n            strokeDasharray: [ 10000, 1 ]\n          })\n        });\n\n        addMarker(id, {\n          element: associationEnd,\n          ref: { x: 11, y: 10 },\n          scale: 0.5\n        });\n      }\n\n      if (type === 'conditional-flow-marker') {\n        var conditionalFlowMarker = create$1('path', {\n          d: 'M 0 10 L 8 6 L 16 10 L 8 14 Z',\n          ...shapeStyle({\n            fill: fill,\n            stroke: stroke\n          })\n        });\n\n        addMarker(id, {\n          element: conditionalFlowMarker,\n          ref: { x: -1, y: 10 },\n          scale: 0.5\n        });\n      }\n\n      if (type === 'conditional-default-flow-marker') {\n        var defaultFlowMarker = create$1('path', {\n          d: 'M 6 4 L 10 16',\n          ...shapeStyle({\n            stroke: stroke\n          })\n        });\n\n        addMarker(id, {\n          element: defaultFlowMarker,\n          ref: { x: 0, y: 10 },\n          scale: 0.5\n        });\n      }\n    }\n\n    function drawCircle(parentGfx, width, height, offset, attrs) {\n\n      if (isObject(offset)) {\n        attrs = offset;\n        offset = 0;\n      }\n\n      offset = offset || 0;\n\n      attrs = shapeStyle(attrs);\n\n      if (attrs.fill === 'none') {\n        delete attrs.fillOpacity;\n      }\n\n      var cx = width / 2,\n          cy = height / 2;\n\n      var circle = create$1('circle', {\n        cx: cx,\n        cy: cy,\n        r: Math.round((width + height) / 4 - offset),\n        ...attrs\n      });\n\n      append(parentGfx, circle);\n\n      return circle;\n    }\n\n    function drawRect(parentGfx, width, height, r, offset, attrs) {\n\n      if (isObject(offset)) {\n        attrs = offset;\n        offset = 0;\n      }\n\n      offset = offset || 0;\n\n      attrs = shapeStyle(attrs);\n\n      var rect = create$1('rect', {\n        x: offset,\n        y: offset,\n        width: width - offset * 2,\n        height: height - offset * 2,\n        rx: r,\n        ry: r,\n        ...attrs\n      });\n\n      append(parentGfx, rect);\n\n      return rect;\n    }\n\n    function drawDiamond(parentGfx, width, height, attrs) {\n\n      var x_2 = width / 2;\n      var y_2 = height / 2;\n\n      var points = [\n        { x: x_2, y: 0 },\n        { x: width, y: y_2 },\n        { x: x_2, y: height },\n        { x: 0, y: y_2 }\n      ];\n\n      var pointsString = points.map(function(point) {\n        return point.x + ',' + point.y;\n      }).join(' ');\n\n      attrs = shapeStyle(attrs);\n\n      var polygon = create$1('polygon', {\n        ...attrs,\n        points: pointsString\n      });\n\n      append(parentGfx, polygon);\n\n      return polygon;\n    }\n\n    /**\n     * @param {SVGElement} parentGfx\n     * @param {Point[]} waypoints\n     * @param {any} attrs\n     * @param {number} [radius]\n     *\n     * @return {SVGElement}\n     */\n    function drawLine(parentGfx, waypoints, attrs, radius) {\n      attrs = lineStyle(attrs);\n\n      var line = createLine(waypoints, attrs, radius);\n\n      append(parentGfx, line);\n\n      return line;\n    }\n\n    /**\n     * @param {SVGElement} parentGfx\n     * @param {Point[]} waypoints\n     * @param {any} attrs\n     *\n     * @return {SVGElement}\n     */\n    function drawConnectionSegments(parentGfx, waypoints, attrs) {\n      return drawLine(parentGfx, waypoints, attrs, 5);\n    }\n\n    function drawPath(parentGfx, d, attrs) {\n\n      attrs = lineStyle(attrs);\n\n      var path = create$1('path', {\n        ...attrs,\n        d\n      });\n\n      append(parentGfx, path);\n\n      return path;\n    }\n\n    function drawMarker(type, parentGfx, path, attrs) {\n      return drawPath(parentGfx, path, assign$1({ 'data-marker': type }, attrs));\n    }\n\n    function renderer(type) {\n      return handlers[type];\n    }\n\n    function as(type) {\n      return function(parentGfx, element, options) {\n        return renderer(type)(parentGfx, element, options);\n      };\n    }\n\n    function renderEventContent(element, parentGfx) {\n\n      var event = getBusinessObject(element);\n      var isThrowing = isThrowEvent(event);\n\n      if (event.eventDefinitions && event.eventDefinitions.length > 1) {\n        if (event.parallelMultiple) {\n          return renderer('bpmn:ParallelMultipleEventDefinition')(parentGfx, element, isThrowing);\n        }\n        else {\n          return renderer('bpmn:MultipleEventDefinition')(parentGfx, element, isThrowing);\n        }\n      }\n\n      if (isTypedEvent(event, 'bpmn:MessageEventDefinition')) {\n        return renderer('bpmn:MessageEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:TimerEventDefinition')) {\n        return renderer('bpmn:TimerEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:ConditionalEventDefinition')) {\n        return renderer('bpmn:ConditionalEventDefinition')(parentGfx, element);\n      }\n\n      if (isTypedEvent(event, 'bpmn:SignalEventDefinition')) {\n        return renderer('bpmn:SignalEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:EscalationEventDefinition')) {\n        return renderer('bpmn:EscalationEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:LinkEventDefinition')) {\n        return renderer('bpmn:LinkEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:ErrorEventDefinition')) {\n        return renderer('bpmn:ErrorEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:CancelEventDefinition')) {\n        return renderer('bpmn:CancelEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:CompensateEventDefinition')) {\n        return renderer('bpmn:CompensateEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:TerminateEventDefinition')) {\n        return renderer('bpmn:TerminateEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      return null;\n    }\n\n    function renderLabel(parentGfx, label, options) {\n\n      options = assign$1({\n        size: {\n          width: 100\n        }\n      }, options);\n\n      var text = textRenderer.createText(label || '', options);\n\n      classes$1(text).add('djs-label');\n\n      append(parentGfx, text);\n\n      return text;\n    }\n\n    function renderEmbeddedLabel(parentGfx, element, align) {\n      var semantic = getBusinessObject(element);\n\n      return renderLabel(parentGfx, semantic.name, {\n        box: element,\n        align: align,\n        padding: 7,\n        style: {\n          fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor)\n        }\n      });\n    }\n\n    function renderExternalLabel(parentGfx, element) {\n\n      var box = {\n        width: 90,\n        height: 30,\n        x: element.width / 2 + element.x,\n        y: element.height / 2 + element.y\n      };\n\n      return renderLabel(parentGfx, getLabel(element), {\n        box: box,\n        fitBox: true,\n        style: assign$1(\n          {},\n          textRenderer.getExternalStyle(),\n          {\n            fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor)\n          }\n        )\n      });\n    }\n\n    function renderLaneLabel(parentGfx, text, element) {\n      var textBox = renderLabel(parentGfx, text, {\n        box: {\n          height: 30,\n          width: element.height\n        },\n        align: 'center-middle',\n        style: {\n          fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor)\n        }\n      });\n\n      var top = -1 * element.height;\n\n      transform(textBox, 0, -top, 270);\n    }\n\n    var handlers = this.handlers = {\n      'bpmn:Event': function(parentGfx, element, attrs) {\n\n        if (!('fillOpacity' in attrs)) {\n          attrs.fillOpacity = DEFAULT_FILL_OPACITY;\n        }\n\n        return drawCircle(parentGfx, element.width, element.height, attrs);\n      },\n      'bpmn:StartEvent': function(parentGfx, element, options) {\n        var attrs = {\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        };\n\n        var semantic = getBusinessObject(element);\n\n        if (!semantic.isInterrupting) {\n          attrs = {\n            strokeDasharray: '6',\n            fill: getFillColor(element, defaultFillColor),\n            stroke: getStrokeColor(element, defaultStrokeColor)\n          };\n        }\n\n        var circle = renderer('bpmn:Event')(parentGfx, element, attrs);\n\n        if (!options || options.renderIcon !== false) {\n          renderEventContent(element, parentGfx);\n        }\n\n        return circle;\n      },\n      'bpmn:MessageEventDefinition': function(parentGfx, element, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_MESSAGE', {\n          xScaleFactor: 0.9,\n          yScaleFactor: 0.9,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.235,\n            my: 0.315\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor(element, defaultStrokeColor) : getFillColor(element, defaultFillColor);\n        var stroke = isThrowing ? getFillColor(element, defaultFillColor) : getStrokeColor(element, defaultStrokeColor);\n\n        var messagePath = drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: stroke\n        });\n\n        return messagePath;\n      },\n      'bpmn:TimerEventDefinition': function(parentGfx, element) {\n        var circle = drawCircle(parentGfx, element.width, element.height, 0.2 * element.height, {\n          strokeWidth: 2,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        var pathData = pathMap.getScaledPath('EVENT_TIMER_WH', {\n          xScaleFactor: 0.75,\n          yScaleFactor: 0.75,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.5,\n            my: 0.5\n          }\n        });\n\n        drawPath(parentGfx, pathData, {\n          strokeWidth: 2,\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        for (var i = 0;i < 12; i++) {\n\n          var linePathData = pathMap.getScaledPath('EVENT_TIMER_LINE', {\n            xScaleFactor: 0.75,\n            yScaleFactor: 0.75,\n            containerWidth: element.width,\n            containerHeight: element.height,\n            position: {\n              mx: 0.5,\n              my: 0.5\n            }\n          });\n\n          var width = element.width / 2;\n          var height = element.height / 2;\n\n          drawPath(parentGfx, linePathData, {\n            strokeWidth: 1,\n            transform: 'rotate(' + (i * 30) + ',' + height + ',' + width + ')',\n            stroke: getStrokeColor(element, defaultStrokeColor)\n          });\n        }\n\n        return circle;\n      },\n      'bpmn:EscalationEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_ESCALATION', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.5,\n            my: 0.2\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor(event, defaultStrokeColor) : 'none';\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: getStrokeColor(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:ConditionalEventDefinition': function(parentGfx, event) {\n        var pathData = pathMap.getScaledPath('EVENT_CONDITIONAL', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.5,\n            my: 0.222\n          }\n        });\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          stroke: getStrokeColor(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:LinkEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_LINK', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.57,\n            my: 0.263\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor(event, defaultStrokeColor) : 'none';\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: getStrokeColor(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:ErrorEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_ERROR', {\n          xScaleFactor: 1.1,\n          yScaleFactor: 1.1,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.2,\n            my: 0.722\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor(event, defaultStrokeColor) : 'none';\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: getStrokeColor(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:CancelEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_CANCEL_45', {\n          xScaleFactor: 1.0,\n          yScaleFactor: 1.0,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.638,\n            my: -0.055\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor(event, defaultStrokeColor) : 'none';\n\n        var path = drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: getStrokeColor(event, defaultStrokeColor)\n        });\n\n        rotate(path, 45);\n\n        return path;\n      },\n      'bpmn:CompensateEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_COMPENSATION', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.22,\n            my: 0.5\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor(event, defaultStrokeColor) : 'none';\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: getStrokeColor(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:SignalEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_SIGNAL', {\n          xScaleFactor: 0.9,\n          yScaleFactor: 0.9,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.5,\n            my: 0.2\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor(event, defaultStrokeColor) : 'none';\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: getStrokeColor(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:MultipleEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_MULTIPLE', {\n          xScaleFactor: 1.1,\n          yScaleFactor: 1.1,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.222,\n            my: 0.36\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor(event, defaultStrokeColor) : 'none';\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill\n        });\n      },\n      'bpmn:ParallelMultipleEventDefinition': function(parentGfx, event) {\n        var pathData = pathMap.getScaledPath('EVENT_PARALLEL_MULTIPLE', {\n          xScaleFactor: 1.2,\n          yScaleFactor: 1.2,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.458,\n            my: 0.194\n          }\n        });\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: getStrokeColor(event, defaultStrokeColor),\n          stroke: getStrokeColor(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:EndEvent': function(parentGfx, element, options) {\n        var circle = renderer('bpmn:Event')(parentGfx, element, {\n          strokeWidth: 4,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        if (!options || options.renderIcon !== false) {\n          renderEventContent(element, parentGfx);\n        }\n\n        return circle;\n      },\n      'bpmn:TerminateEventDefinition': function(parentGfx, element) {\n        var circle = drawCircle(parentGfx, element.width, element.height, 8, {\n          strokeWidth: 4,\n          fill: getStrokeColor(element, defaultStrokeColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return circle;\n      },\n      'bpmn:IntermediateEvent': function(parentGfx, element, options) {\n        var outer = renderer('bpmn:Event')(parentGfx, element, {\n          strokeWidth: 1.5,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        /* inner */\n        drawCircle(parentGfx, element.width, element.height, INNER_OUTER_DIST, {\n          strokeWidth: 1.5,\n          fill: getFillColor(element, 'none'),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        if (!options || options.renderIcon !== false) {\n          renderEventContent(element, parentGfx);\n        }\n\n        return outer;\n      },\n      'bpmn:IntermediateCatchEvent': as('bpmn:IntermediateEvent'),\n      'bpmn:IntermediateThrowEvent': as('bpmn:IntermediateEvent'),\n\n      'bpmn:Activity': function(parentGfx, element, attrs) {\n\n        attrs = attrs || {};\n\n        if (!('fillOpacity' in attrs)) {\n          attrs.fillOpacity = DEFAULT_FILL_OPACITY;\n        }\n\n        return drawRect(parentGfx, element.width, element.height, TASK_BORDER_RADIUS, attrs);\n      },\n\n      'bpmn:Task': function(parentGfx, element) {\n        var attrs = {\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        };\n\n        var rect = renderer('bpmn:Activity')(parentGfx, element, attrs);\n\n        renderEmbeddedLabel(parentGfx, element, 'center-middle');\n        attachTaskMarkers(parentGfx, element);\n\n        return rect;\n      },\n      'bpmn:ServiceTask': function(parentGfx, element) {\n        var task = renderer('bpmn:Task')(parentGfx, element);\n\n        var pathDataBG = pathMap.getScaledPath('TASK_TYPE_SERVICE', {\n          abspos: {\n            x: 12,\n            y: 18\n          }\n        });\n\n        /* service bg */ drawPath(parentGfx, pathDataBG, {\n          strokeWidth: 1,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        var fillPathData = pathMap.getScaledPath('TASK_TYPE_SERVICE_FILL', {\n          abspos: {\n            x: 17.2,\n            y: 18\n          }\n        });\n\n        /* service fill */ drawPath(parentGfx, fillPathData, {\n          strokeWidth: 0,\n          fill: getFillColor(element, defaultFillColor)\n        });\n\n        var pathData = pathMap.getScaledPath('TASK_TYPE_SERVICE', {\n          abspos: {\n            x: 17,\n            y: 22\n          }\n        });\n\n        /* service */ drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return task;\n      },\n      'bpmn:UserTask': function(parentGfx, element) {\n        var task = renderer('bpmn:Task')(parentGfx, element);\n\n        var x = 15;\n        var y = 12;\n\n        var pathData = pathMap.getScaledPath('TASK_TYPE_USER_1', {\n          abspos: {\n            x: x,\n            y: y\n          }\n        });\n\n        /* user path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 0.5,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        var pathData2 = pathMap.getScaledPath('TASK_TYPE_USER_2', {\n          abspos: {\n            x: x,\n            y: y\n          }\n        });\n\n        /* user2 path */ drawPath(parentGfx, pathData2, {\n          strokeWidth: 0.5,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        var pathData3 = pathMap.getScaledPath('TASK_TYPE_USER_3', {\n          abspos: {\n            x: x,\n            y: y\n          }\n        });\n\n        /* user3 path */ drawPath(parentGfx, pathData3, {\n          strokeWidth: 0.5,\n          fill: getStrokeColor(element, defaultStrokeColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return task;\n      },\n      'bpmn:ManualTask': function(parentGfx, element) {\n        var task = renderer('bpmn:Task')(parentGfx, element);\n\n        var pathData = pathMap.getScaledPath('TASK_TYPE_MANUAL', {\n          abspos: {\n            x: 17,\n            y: 15\n          }\n        });\n\n        /* manual path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 0.5, // 0.25,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return task;\n      },\n      'bpmn:SendTask': function(parentGfx, element) {\n        var task = renderer('bpmn:Task')(parentGfx, element);\n\n        var pathData = pathMap.getScaledPath('TASK_TYPE_SEND', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: 21,\n          containerHeight: 14,\n          position: {\n            mx: 0.285,\n            my: 0.357\n          }\n        });\n\n        /* send path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: getStrokeColor(element, defaultStrokeColor),\n          stroke: getFillColor(element, defaultFillColor)\n        });\n\n        return task;\n      },\n      'bpmn:ReceiveTask' : function(parentGfx, element) {\n        var semantic = getBusinessObject(element);\n\n        var task = renderer('bpmn:Task')(parentGfx, element);\n        var pathData;\n\n        if (semantic.instantiate) {\n          drawCircle(parentGfx, 28, 28, 20 * 0.22, { strokeWidth: 1 });\n\n          pathData = pathMap.getScaledPath('TASK_TYPE_INSTANTIATING_SEND', {\n            abspos: {\n              x: 7.77,\n              y: 9.52\n            }\n          });\n        } else {\n\n          pathData = pathMap.getScaledPath('TASK_TYPE_SEND', {\n            xScaleFactor: 0.9,\n            yScaleFactor: 0.9,\n            containerWidth: 21,\n            containerHeight: 14,\n            position: {\n              mx: 0.3,\n              my: 0.4\n            }\n          });\n        }\n\n        /* receive path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return task;\n      },\n      'bpmn:ScriptTask': function(parentGfx, element) {\n        var task = renderer('bpmn:Task')(parentGfx, element);\n\n        var pathData = pathMap.getScaledPath('TASK_TYPE_SCRIPT', {\n          abspos: {\n            x: 15,\n            y: 20\n          }\n        });\n\n        /* script path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return task;\n      },\n      'bpmn:BusinessRuleTask': function(parentGfx, element) {\n        var task = renderer('bpmn:Task')(parentGfx, element);\n\n        var headerPathData = pathMap.getScaledPath('TASK_TYPE_BUSINESS_RULE_HEADER', {\n          abspos: {\n            x: 8,\n            y: 8\n          }\n        });\n\n        var businessHeaderPath = drawPath(parentGfx, headerPathData);\n        attr$1(businessHeaderPath, {\n          strokeWidth: 1,\n          fill: getFillColor(element, '#aaaaaa'),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        var headerData = pathMap.getScaledPath('TASK_TYPE_BUSINESS_RULE_MAIN', {\n          abspos: {\n            x: 8,\n            y: 8\n          }\n        });\n\n        var businessPath = drawPath(parentGfx, headerData);\n        attr$1(businessPath, {\n          strokeWidth: 1,\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return task;\n      },\n      'bpmn:SubProcess': function(parentGfx, element, attrs) {\n        attrs = {\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor),\n          ...attrs\n        };\n\n        var rect = renderer('bpmn:Activity')(parentGfx, element, attrs);\n\n        var expanded = isExpanded(element);\n\n        if (isEventSubProcess(element)) {\n          attr$1(rect, {\n            strokeDasharray: '0, 5.5',\n            strokeWidth: 2.5\n          });\n        }\n\n        renderEmbeddedLabel(parentGfx, element, expanded ? 'center-top' : 'center-middle');\n\n        if (expanded) {\n          attachTaskMarkers(parentGfx, element);\n        } else {\n          attachTaskMarkers(parentGfx, element, [ 'SubProcessMarker' ]);\n        }\n\n        return rect;\n      },\n      'bpmn:AdHocSubProcess': function(parentGfx, element) {\n        return renderer('bpmn:SubProcess')(parentGfx, element);\n      },\n      'bpmn:Transaction': function(parentGfx, element) {\n        var outer = renderer('bpmn:SubProcess')(parentGfx, element, { strokeWidth: 1.5 });\n\n        var innerAttrs = styles.style([ 'no-fill', 'no-events' ], {\n          stroke: getStrokeColor(element, defaultStrokeColor),\n          strokeWidth: 1.5\n        });\n\n        /* inner path */ drawRect(parentGfx, element.width, element.height, TASK_BORDER_RADIUS - 3, INNER_OUTER_DIST, innerAttrs);\n\n        return outer;\n      },\n      'bpmn:CallActivity': function(parentGfx, element) {\n        return renderer('bpmn:SubProcess')(parentGfx, element, {\n          strokeWidth: 5\n        });\n      },\n      'bpmn:Participant': function(parentGfx, element) {\n\n        var strokeWidth = 1.5;\n\n        var attrs = {\n          fillOpacity: DEFAULT_FILL_OPACITY,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor),\n          strokeWidth\n        };\n\n        var lane = renderer('bpmn:Lane')(parentGfx, element, attrs);\n\n        var expandedPool = isExpanded(element);\n\n        if (expandedPool) {\n          drawLine(parentGfx, [\n            { x: 30, y: 0 },\n            { x: 30, y: element.height }\n          ], {\n            stroke: getStrokeColor(element, defaultStrokeColor),\n            strokeWidth\n          });\n          var text = getBusinessObject(element).name;\n          renderLaneLabel(parentGfx, text, element);\n        } else {\n\n          // collapsed pool draw text inline\n          var text2 = getBusinessObject(element).name;\n          renderLabel(parentGfx, text2, {\n            box: element, align: 'center-middle',\n            style: {\n              fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor)\n            }\n          });\n        }\n\n        var participantMultiplicity = !!(getBusinessObject(element).participantMultiplicity);\n\n        if (participantMultiplicity) {\n          renderer('ParticipantMultiplicityMarker')(parentGfx, element);\n        }\n\n        return lane;\n      },\n      'bpmn:Lane': function(parentGfx, element, attrs) {\n        var rect = drawRect(parentGfx, element.width, element.height, 0, {\n          fill: getFillColor(element, defaultFillColor),\n          fillOpacity: HIGH_FILL_OPACITY,\n          stroke: getStrokeColor(element, defaultStrokeColor),\n          strokeWidth: 1.5,\n          ...attrs\n        });\n\n        var semantic = getBusinessObject(element);\n\n        if (semantic.$type === 'bpmn:Lane') {\n          var text = semantic.name;\n          renderLaneLabel(parentGfx, text, element);\n        }\n\n        return rect;\n      },\n      'bpmn:InclusiveGateway': function(parentGfx, element) {\n        var diamond = renderer('bpmn:Gateway')(parentGfx, element);\n\n        /* circle path */\n        drawCircle(parentGfx, element.width, element.height, element.height * 0.24, {\n          strokeWidth: 2.5,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return diamond;\n      },\n      'bpmn:ExclusiveGateway': function(parentGfx, element) {\n        var diamond = renderer('bpmn:Gateway')(parentGfx, element);\n\n        var pathData = pathMap.getScaledPath('GATEWAY_EXCLUSIVE', {\n          xScaleFactor: 0.4,\n          yScaleFactor: 0.4,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.32,\n            my: 0.3\n          }\n        });\n\n        if ((getDi(element).isMarkerVisible)) {\n          drawPath(parentGfx, pathData, {\n            strokeWidth: 1,\n            fill: getStrokeColor(element, defaultStrokeColor),\n            stroke: getStrokeColor(element, defaultStrokeColor)\n          });\n        }\n\n        return diamond;\n      },\n      'bpmn:ComplexGateway': function(parentGfx, element) {\n        var diamond = renderer('bpmn:Gateway')(parentGfx, element);\n\n        var pathData = pathMap.getScaledPath('GATEWAY_COMPLEX', {\n          xScaleFactor: 0.5,\n          yScaleFactor:0.5,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.46,\n            my: 0.26\n          }\n        });\n\n        /* complex path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: getStrokeColor(element, defaultStrokeColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return diamond;\n      },\n      'bpmn:ParallelGateway': function(parentGfx, element) {\n        var diamond = renderer('bpmn:Gateway')(parentGfx, element);\n\n        var pathData = pathMap.getScaledPath('GATEWAY_PARALLEL', {\n          xScaleFactor: 0.6,\n          yScaleFactor:0.6,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.46,\n            my: 0.2\n          }\n        });\n\n        /* parallel path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: getStrokeColor(element, defaultStrokeColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return diamond;\n      },\n      'bpmn:EventBasedGateway': function(parentGfx, element) {\n\n        var semantic = getBusinessObject(element);\n\n        var diamond = renderer('bpmn:Gateway')(parentGfx, element);\n\n        /* outer circle path */ drawCircle(parentGfx, element.width, element.height, element.height * 0.20, {\n          strokeWidth: 1,\n          fill: 'none',\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        var type = semantic.eventGatewayType;\n        var instantiate = !!semantic.instantiate;\n\n        function drawEvent() {\n\n          var pathData = pathMap.getScaledPath('GATEWAY_EVENT_BASED', {\n            xScaleFactor: 0.18,\n            yScaleFactor: 0.18,\n            containerWidth: element.width,\n            containerHeight: element.height,\n            position: {\n              mx: 0.36,\n              my: 0.44\n            }\n          });\n\n          /* event path */ drawPath(parentGfx, pathData, {\n            strokeWidth: 2,\n            fill: getFillColor(element, 'none'),\n            stroke: getStrokeColor(element, defaultStrokeColor)\n          });\n        }\n\n        if (type === 'Parallel') {\n\n          var pathData = pathMap.getScaledPath('GATEWAY_PARALLEL', {\n            xScaleFactor: 0.4,\n            yScaleFactor:0.4,\n            containerWidth: element.width,\n            containerHeight: element.height,\n            position: {\n              mx: 0.474,\n              my: 0.296\n            }\n          });\n\n          drawPath(parentGfx, pathData, {\n            strokeWidth: 1,\n            fill: 'none'\n          });\n        } else if (type === 'Exclusive') {\n\n          if (!instantiate) {\n            drawCircle(parentGfx, element.width, element.height, element.height * 0.26, {\n              strokeWidth: 1,\n              fill: 'none',\n              stroke: getStrokeColor(element, defaultStrokeColor)\n            });\n          }\n\n          drawEvent();\n        }\n\n\n        return diamond;\n      },\n      'bpmn:Gateway': function(parentGfx, element) {\n        return drawDiamond(parentGfx, element.width, element.height, {\n          fill: getFillColor(element, defaultFillColor),\n          fillOpacity: DEFAULT_FILL_OPACITY,\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n      },\n      'bpmn:SequenceFlow': function(parentGfx, element) {\n        var fill = getFillColor(element, defaultFillColor),\n            stroke = getStrokeColor(element, defaultStrokeColor);\n\n        var path = drawConnectionSegments(parentGfx, element.waypoints, {\n          markerEnd: marker('sequenceflow-end', fill, stroke),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        var sequenceFlow = getBusinessObject(element);\n\n        var source;\n\n        if (element.source) {\n          source = element.source.businessObject;\n\n          // conditional flow marker\n          if (sequenceFlow.conditionExpression && source.$instanceOf('bpmn:Activity')) {\n            attr$1(path, {\n              markerStart: marker('conditional-flow-marker', fill, stroke)\n            });\n          }\n\n          // default marker\n          if (source.default && (source.$instanceOf('bpmn:Gateway') || source.$instanceOf('bpmn:Activity')) &&\n              source.default === sequenceFlow) {\n            attr$1(path, {\n              markerStart: marker('conditional-default-flow-marker', fill, stroke)\n            });\n          }\n        }\n\n        return path;\n      },\n      'bpmn:Association': function(parentGfx, element, attrs) {\n\n        var semantic = getBusinessObject(element);\n\n        var fill = getFillColor(element, defaultFillColor),\n            stroke = getStrokeColor(element, defaultStrokeColor);\n\n        attrs = {\n          strokeDasharray: '0, 5',\n          stroke: getStrokeColor(element, defaultStrokeColor),\n          ...attrs\n        };\n\n        if (semantic.associationDirection === 'One' ||\n            semantic.associationDirection === 'Both') {\n          attrs.markerEnd = marker('association-end', fill, stroke);\n        }\n\n        if (semantic.associationDirection === 'Both') {\n          attrs.markerStart = marker('association-start', fill, stroke);\n        }\n\n        return drawConnectionSegments(parentGfx, element.waypoints, attrs);\n      },\n      'bpmn:DataInputAssociation': function(parentGfx, element) {\n        var fill = getFillColor(element, defaultFillColor),\n            stroke = getStrokeColor(element, defaultStrokeColor);\n\n        return renderer('bpmn:Association')(parentGfx, element, {\n          markerEnd: marker('association-end', fill, stroke)\n        });\n      },\n      'bpmn:DataOutputAssociation': function(parentGfx, element) {\n        var fill = getFillColor(element, defaultFillColor),\n            stroke = getStrokeColor(element, defaultStrokeColor);\n\n        return renderer('bpmn:Association')(parentGfx, element, {\n          markerEnd: marker('association-end', fill, stroke)\n        });\n      },\n      'bpmn:MessageFlow': function(parentGfx, element) {\n\n        var semantic = getBusinessObject(element),\n            di = getDi(element);\n\n        var fill = getFillColor(element, defaultFillColor),\n            stroke = getStrokeColor(element, defaultStrokeColor);\n\n        var path = drawConnectionSegments(parentGfx, element.waypoints, {\n          markerEnd: marker('messageflow-end', fill, stroke),\n          markerStart: marker('messageflow-start', fill, stroke),\n          strokeDasharray: '10, 11',\n          strokeWidth: 1.5,\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        if (semantic.messageRef) {\n          var midPoint = path.getPointAtLength(path.getTotalLength() / 2);\n\n          var markerPathData = pathMap.getScaledPath('MESSAGE_FLOW_MARKER', {\n            abspos: {\n              x: midPoint.x,\n              y: midPoint.y\n            }\n          });\n\n          var messageAttrs = { strokeWidth: 1 };\n\n          if (di.messageVisibleKind === 'initiating') {\n            messageAttrs.fill = 'white';\n            messageAttrs.stroke = black;\n          } else {\n            messageAttrs.fill = '#888';\n            messageAttrs.stroke = 'white';\n          }\n\n          var message = drawPath(parentGfx, markerPathData, messageAttrs);\n\n          var labelText = semantic.messageRef.name;\n          var label = renderLabel(parentGfx, labelText, {\n            align: 'center-top',\n            fitBox: true,\n            style: {\n              fill: getStrokeColor(element, defaultLabelColor)\n            }\n          });\n\n          var messageBounds = message.getBBox(),\n              labelBounds = label.getBBox();\n\n          var translateX = midPoint.x - labelBounds.width / 2,\n              translateY = midPoint.y + messageBounds.height / 2 + ELEMENT_LABEL_DISTANCE;\n\n          transform(label, translateX, translateY, 0);\n\n        }\n\n        return path;\n      },\n      'bpmn:DataObject': function(parentGfx, element) {\n        var pathData = pathMap.getScaledPath('DATA_OBJECT_PATH', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.474,\n            my: 0.296\n          }\n        });\n\n        var elementObject = drawPath(parentGfx, pathData, {\n          fill: getFillColor(element, defaultFillColor),\n          fillOpacity: DEFAULT_FILL_OPACITY,\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        var semantic = getBusinessObject(element);\n\n        if (isCollection(semantic)) {\n          renderDataItemCollection(parentGfx, element);\n        }\n\n        return elementObject;\n      },\n      'bpmn:DataObjectReference': as('bpmn:DataObject'),\n      'bpmn:DataInput': function(parentGfx, element) {\n\n        var arrowPathData = pathMap.getRawPath('DATA_ARROW');\n\n        // page\n        var elementObject = renderer('bpmn:DataObject')(parentGfx, element);\n\n        /* input arrow path */ drawPath(parentGfx, arrowPathData, { strokeWidth: 1 });\n\n        return elementObject;\n      },\n      'bpmn:DataOutput': function(parentGfx, element) {\n        var arrowPathData = pathMap.getRawPath('DATA_ARROW');\n\n        // page\n        var elementObject = renderer('bpmn:DataObject')(parentGfx, element);\n\n        /* output arrow path */ drawPath(parentGfx, arrowPathData, {\n          strokeWidth: 1,\n          fill: black\n        });\n\n        return elementObject;\n      },\n      'bpmn:DataStoreReference': function(parentGfx, element) {\n        var DATA_STORE_PATH = pathMap.getScaledPath('DATA_STORE', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0,\n            my: 0.133\n          }\n        });\n\n        var elementStore = drawPath(parentGfx, DATA_STORE_PATH, {\n          strokeWidth: 2,\n          fill: getFillColor(element, defaultFillColor),\n          fillOpacity: DEFAULT_FILL_OPACITY,\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return elementStore;\n      },\n      'bpmn:BoundaryEvent': function(parentGfx, element, options) {\n\n        var semantic = getBusinessObject(element),\n            cancel = semantic.cancelActivity;\n\n        var attrs = {\n          strokeWidth: 1.5,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        };\n\n        if (!cancel) {\n          attrs.strokeDasharray = '6';\n        }\n\n        // apply fillOpacity\n        var outerAttrs = {\n          ...attrs,\n          fillOpacity: 1\n        };\n\n        // apply no-fill\n        var innerAttrs = {\n          ...attrs,\n          fill: 'none'\n        };\n\n        var outer = renderer('bpmn:Event')(parentGfx, element, outerAttrs);\n\n        /* inner path */ drawCircle(parentGfx, element.width, element.height, INNER_OUTER_DIST, innerAttrs);\n\n        if (!options || options.renderIcon !== false) {\n          renderEventContent(element, parentGfx);\n        }\n\n        return outer;\n      },\n      'bpmn:Group': function(parentGfx, element) {\n        return drawRect(parentGfx, element.width, element.height, TASK_BORDER_RADIUS, {\n          stroke: getStrokeColor(element, defaultStrokeColor),\n          strokeWidth: 1.5,\n          strokeDasharray: '10,6,0,6',\n          fill: 'none',\n          pointerEvents: 'none'\n        });\n      },\n      'label': function(parentGfx, element) {\n        return renderExternalLabel(parentGfx, element);\n      },\n      'bpmn:TextAnnotation': function(parentGfx, element) {\n        var textElement = drawRect(parentGfx, element.width, element.height, 0, 0, {\n          'fill': 'none',\n          'stroke': 'none'\n        });\n\n        var textPathData = pathMap.getScaledPath('TEXT_ANNOTATION', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.0,\n            my: 0.0\n          }\n        });\n\n        drawPath(parentGfx, textPathData, {\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        var text = getBusinessObject(element).text || '';\n        renderLabel(parentGfx, text, {\n          box: element,\n          align: 'left-top',\n          padding: 7,\n          style: {\n            fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor)\n          }\n        });\n\n        return textElement;\n      },\n      'ParticipantMultiplicityMarker': function(parentGfx, element) {\n        var markerPath = pathMap.getScaledPath('MARKER_PARALLEL', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: ((element.width / 2) / element.width),\n            my: (element.height - 15) / element.height\n          }\n        });\n\n        drawMarker('participant-multiplicity', parentGfx, markerPath, {\n          strokeWidth: 2,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n      },\n      'SubProcessMarker': function(parentGfx, element) {\n        var markerRect = drawRect(parentGfx, 14, 14, 0, {\n          strokeWidth: 1,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        // Process marker is placed in the middle of the box\n        // therefore fixed values can be used here\n        translate$1(markerRect, element.width / 2 - 7.5, element.height - 20);\n\n        var markerPath = pathMap.getScaledPath('MARKER_SUB_PROCESS', {\n          xScaleFactor: 1.5,\n          yScaleFactor: 1.5,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: (element.width / 2 - 7.5) / element.width,\n            my: (element.height - 20) / element.height\n          }\n        });\n\n        drawMarker('sub-process', parentGfx, markerPath, {\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n      },\n      'ParallelMarker': function(parentGfx, element, position) {\n        var markerPath = pathMap.getScaledPath('MARKER_PARALLEL', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: ((element.width / 2 + position.parallel) / element.width),\n            my: (element.height - 20) / element.height\n          }\n        });\n\n        drawMarker('parallel', parentGfx, markerPath, {\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n      },\n      'SequentialMarker': function(parentGfx, element, position) {\n        var markerPath = pathMap.getScaledPath('MARKER_SEQUENTIAL', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: ((element.width / 2 + position.seq) / element.width),\n            my: (element.height - 19) / element.height\n          }\n        });\n\n        drawMarker('sequential', parentGfx, markerPath, {\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n      },\n      'CompensationMarker': function(parentGfx, element, position) {\n        var markerMath = pathMap.getScaledPath('MARKER_COMPENSATION', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: ((element.width / 2 + position.compensation) / element.width),\n            my: (element.height - 13) / element.height\n          }\n        });\n\n        drawMarker('compensation', parentGfx, markerMath, {\n          strokeWidth: 1,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n      },\n      'LoopMarker': function(parentGfx, element, position) {\n        var markerPath = pathMap.getScaledPath('MARKER_LOOP', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: ((element.width / 2 + position.loop) / element.width),\n            my: (element.height - 7) / element.height\n          }\n        });\n\n        drawMarker('loop', parentGfx, markerPath, {\n          strokeWidth: 1.5,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor),\n          strokeMiterlimit: 0.5\n        });\n      },\n      'AdhocMarker': function(parentGfx, element, position) {\n        var markerPath = pathMap.getScaledPath('MARKER_ADHOC', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: ((element.width / 2 + position.adhoc) / element.width),\n            my: (element.height - 15) / element.height\n          }\n        });\n\n        drawMarker('adhoc', parentGfx, markerPath, {\n          strokeWidth: 1,\n          fill: getStrokeColor(element, defaultStrokeColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n      }\n    };\n\n    function attachTaskMarkers(parentGfx, element, taskMarkers) {\n      var obj = getBusinessObject(element);\n\n      var subprocess = taskMarkers && taskMarkers.indexOf('SubProcessMarker') !== -1;\n      var position;\n\n      if (subprocess) {\n        position = {\n          seq: -21,\n          parallel: -22,\n          compensation: -42,\n          loop: -18,\n          adhoc: 10\n        };\n      } else {\n        position = {\n          seq: -3,\n          parallel: -6,\n          compensation: -27,\n          loop: 0,\n          adhoc: 10\n        };\n      }\n\n      forEach$1(taskMarkers, function(marker) {\n        renderer(marker)(parentGfx, element, position);\n      });\n\n      if (obj.isForCompensation) {\n        renderer('CompensationMarker')(parentGfx, element, position);\n      }\n\n      if (obj.$type === 'bpmn:AdHocSubProcess') {\n        renderer('AdhocMarker')(parentGfx, element, position);\n      }\n\n      var loopCharacteristics = obj.loopCharacteristics,\n          isSequential = loopCharacteristics && loopCharacteristics.isSequential;\n\n      if (loopCharacteristics) {\n\n        if (isSequential === undefined) {\n          renderer('LoopMarker')(parentGfx, element, position);\n        }\n\n        if (isSequential === false) {\n          renderer('ParallelMarker')(parentGfx, element, position);\n        }\n\n        if (isSequential === true) {\n          renderer('SequentialMarker')(parentGfx, element, position);\n        }\n      }\n    }\n\n    function renderDataItemCollection(parentGfx, element) {\n\n      var yPosition = (element.height - 18) / element.height;\n\n      var pathData = pathMap.getScaledPath('DATA_OBJECT_COLLECTION_PATH', {\n        xScaleFactor: 1,\n        yScaleFactor: 1,\n        containerWidth: element.width,\n        containerHeight: element.height,\n        position: {\n          mx: 0.33,\n          my: yPosition\n        }\n      });\n\n      /* collection path */ drawPath(parentGfx, pathData, {\n        strokeWidth: 2\n      });\n    }\n\n\n    // extension API, use at your own risk\n    this._drawPath = drawPath;\n\n    this._renderer = renderer;\n  }\n\n\n  e(BpmnRenderer, BaseRenderer);\n\n  BpmnRenderer.$inject = [\n    'config.bpmnRenderer',\n    'eventBus',\n    'styles',\n    'pathMap',\n    'canvas',\n    'textRenderer'\n  ];\n\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  BpmnRenderer.prototype.canRender = function(element) {\n    return is$1(element, 'bpmn:BaseElement');\n  };\n\n  /**\n   * Draw shape into parentGfx.\n   *\n   * @param {SVGElement} parentGfx\n   * @param {Element} element\n   *\n   * @return {SVGElement} mainGfx\n   */\n  BpmnRenderer.prototype.drawShape = function(parentGfx, element) {\n    var type = element.type;\n    var h = this._renderer(type);\n\n    /* jshint -W040 */\n    return h(parentGfx, element);\n  };\n\n  /**\n   * Draw connection into parentGfx.\n   *\n   * @param {SVGElement} parentGfx\n   * @param {Element} element\n   *\n   * @return {SVGElement} mainGfx\n   */\n  BpmnRenderer.prototype.drawConnection = function(parentGfx, element) {\n    var type = element.type;\n    var h = this._renderer(type);\n\n    /* jshint -W040 */\n    return h(parentGfx, element);\n  };\n\n  /**\n   * Get shape path.\n   *\n   * @param {Element} element\n   *\n   * @return {string} path\n   */\n  BpmnRenderer.prototype.getShapePath = function(element) {\n\n    if (is$1(element, 'bpmn:Event')) {\n      return getCirclePath(element);\n    }\n\n    if (is$1(element, 'bpmn:Activity')) {\n      return getRoundRectPath(element, TASK_BORDER_RADIUS);\n    }\n\n    if (is$1(element, 'bpmn:Gateway')) {\n      return getDiamondPath(element);\n    }\n\n    return getRectPath(element);\n  };\n\n  /**\n   * @typedef {import('../util/Types').Dimensions} Dimensions\n   *\n   * @typedef { {\n   *   top: number;\n   *   left: number;\n   *   right: number;\n   *   bottom: number;\n   * } } Padding\n   *\n   * @typedef { number | Partial<Padding> } PaddingConfig\n   *\n   * @typedef { {\n   *   horizontal: 'center' | 'left';\n   *   vertical: 'top' | 'center';\n   * } } Alignment\n   *\n   *  @typedef { 'center-middle' | 'center-top' } AlignmentConfig\n   *\n   * @typedef { Partial<{\n   *   align: AlignmentConfig;\n   *   style: Record<string, number | string>;\n   *   padding: PaddingConfig;\n   * }> } BaseTextConfig\n   *\n   * @typedef { BaseTextConfig & Partial<{\n   *   size: Dimensions;\n   * }> } TextConfig\n   *\n   * @typedef { BaseTextConfig & Partial<{\n   *   box: Dimensions;\n   *   fitBox: boolean;\n   * }> } TextLayoutConfig\n   *\n   *  @typedef { Dimensions & {\n   *  text: string;\n   * } } LineDescriptor\n   */\n\n  var DEFAULT_BOX_PADDING = 0;\n\n  var DEFAULT_LABEL_SIZE = {\n    width: 150,\n    height: 50\n  };\n\n\n  /**\n   * @param {AlignmentConfig} align\n   * @return {Alignment}\n   */\n  function parseAlign(align) {\n\n    var parts = align.split('-');\n\n    return {\n      horizontal: parts[0] || 'center',\n      vertical: parts[1] || 'top'\n    };\n  }\n\n  /**\n   * @param {PaddingConfig} padding\n   *\n   * @return {Padding}\n   */\n  function parsePadding(padding) {\n\n    if (isObject(padding)) {\n      return assign$1({ top: 0, left: 0, right: 0, bottom: 0 }, padding);\n    } else {\n      return {\n        top: padding,\n        left: padding,\n        right: padding,\n        bottom: padding\n      };\n    }\n  }\n\n  /**\n   * @param {string} text\n   * @param {SVGTextElement} fakeText\n   *\n   * @return {import('../util/Types').Dimensions}\n   */\n  function getTextBBox(text, fakeText) {\n\n    fakeText.textContent = text;\n\n    var textBBox;\n\n    try {\n      var bbox,\n          emptyLine = text === '';\n\n      // add dummy text, when line is empty to\n      // determine correct height\n      fakeText.textContent = emptyLine ? 'dummy' : text;\n\n      textBBox = fakeText.getBBox();\n\n      // take text rendering related horizontal\n      // padding into account\n      bbox = {\n        width: textBBox.width + textBBox.x * 2,\n        height: textBBox.height\n      };\n\n      if (emptyLine) {\n\n        // correct width\n        bbox.width = 0;\n      }\n\n      return bbox;\n    } catch (e) {\n      return { width: 0, height: 0 };\n    }\n  }\n\n\n  /**\n   * Layout the next line and return the layouted element.\n   *\n   * Alters the lines passed.\n   *\n   * @param {string[]} lines\n   * @param {number} maxWidth\n   * @param {SVGTextElement} fakeText\n   *\n   * @return {LineDescriptor} the line descriptor\n   */\n  function layoutNext(lines, maxWidth, fakeText) {\n\n    var originalLine = lines.shift(),\n        fitLine = originalLine;\n\n    var textBBox;\n\n    for (;;) {\n      textBBox = getTextBBox(fitLine, fakeText);\n\n      textBBox.width = fitLine ? textBBox.width : 0;\n\n      // try to fit\n      if (fitLine === ' ' || fitLine === '' || textBBox.width < Math.round(maxWidth) || fitLine.length < 2) {\n        return fit(lines, fitLine, originalLine, textBBox);\n      }\n\n      fitLine = shortenLine(fitLine, textBBox.width, maxWidth);\n    }\n  }\n\n  /**\n   * @param {string[]} lines\n   * @param {string} fitLine\n   * @param {string} originalLine\n   * @param {Dimensions} textBBox\n   *\n   * @return {LineDescriptor}\n   */\n  function fit(lines, fitLine, originalLine, textBBox) {\n    if (fitLine.length < originalLine.length) {\n      var remainder = originalLine.slice(fitLine.length).trim();\n\n      lines.unshift(remainder);\n    }\n\n    return {\n      width: textBBox.width,\n      height: textBBox.height,\n      text: fitLine\n    };\n  }\n\n  var SOFT_BREAK = '\\u00AD';\n\n\n  /**\n   * Shortens a line based on spacing and hyphens.\n   * Returns the shortened result on success.\n   *\n   * @param {string} line\n   * @param {number} maxLength the maximum characters of the string\n   *\n   * @return {string} the shortened string\n   */\n  function semanticShorten(line, maxLength) {\n\n    var parts = line.split(/(\\s|-|\\u00AD)/g),\n        part,\n        shortenedParts = [],\n        length = 0;\n\n    // try to shorten via break chars\n    if (parts.length > 1) {\n\n      while ((part = parts.shift())) {\n        if (part.length + length < maxLength) {\n          shortenedParts.push(part);\n          length += part.length;\n        } else {\n\n          // remove previous part, too if hyphen does not fit anymore\n          if (part === '-' || part === SOFT_BREAK) {\n            shortenedParts.pop();\n          }\n\n          break;\n        }\n      }\n    }\n\n    var last = shortenedParts[shortenedParts.length - 1];\n\n    // translate trailing soft break to actual hyphen\n    if (last && last === SOFT_BREAK) {\n      shortenedParts[shortenedParts.length - 1] = '-';\n    }\n\n    return shortenedParts.join('');\n  }\n\n\n  /**\n   * @param {string} line\n   * @param {number} width\n   * @param {number} maxWidth\n   *\n   * @return {string}\n   */\n  function shortenLine(line, width, maxWidth) {\n    var length = Math.max(line.length * (maxWidth / width), 1);\n\n    // try to shorten semantically (i.e. based on spaces and hyphens)\n    var shortenedLine = semanticShorten(line, length);\n\n    if (!shortenedLine) {\n\n      // force shorten by cutting the long word\n      shortenedLine = line.slice(0, Math.max(Math.round(length - 1), 1));\n    }\n\n    return shortenedLine;\n  }\n\n\n  /**\n   * @return {SVGSVGElement}\n   */\n  function getHelperSvg() {\n    var helperSvg = document.getElementById('helper-svg');\n\n    if (!helperSvg) {\n      helperSvg = create$1('svg');\n\n      attr$1(helperSvg, {\n        id: 'helper-svg'\n      });\n\n      assign(helperSvg, {\n        visibility: 'hidden',\n        position: 'fixed',\n        width: 0,\n        height: 0\n      });\n\n      document.body.appendChild(helperSvg);\n    }\n\n    return helperSvg;\n  }\n\n\n  /**\n   * Creates a new label utility\n   *\n   * @param {TextConfig} config\n   */\n  function Text(config) {\n\n    this._config = assign$1({}, {\n      size: DEFAULT_LABEL_SIZE,\n      padding: DEFAULT_BOX_PADDING,\n      style: {},\n      align: 'center-top'\n    }, config || {});\n  }\n\n  /**\n   * Returns the layouted text as an SVG element.\n   *\n   * @param {string} text\n   * @param {TextLayoutConfig} options\n   *\n   * @return {SVGElement}\n   */\n  Text.prototype.createText = function(text, options) {\n    return this.layoutText(text, options).element;\n  };\n\n  /**\n   * Returns a labels layouted dimensions.\n   *\n   * @param {string} text to layout\n   * @param {TextLayoutConfig} options\n   *\n   * @return {Dimensions}\n   */\n  Text.prototype.getDimensions = function(text, options) {\n    return this.layoutText(text, options).dimensions;\n  };\n\n  /**\n   * Creates and returns a label and its bounding box.\n   *\n   * @param {string} text the text to render on the label\n   * @param {TextLayoutConfig} options\n   *\n   * @return { {\n   *   element: SVGElement,\n   *   dimensions: Dimensions\n   * } }\n   */\n  Text.prototype.layoutText = function(text, options) {\n    var box = assign$1({}, this._config.size, options.box),\n        style = assign$1({}, this._config.style, options.style),\n        align = parseAlign(options.align || this._config.align),\n        padding = parsePadding(options.padding !== undefined ? options.padding : this._config.padding),\n        fitBox = options.fitBox || false;\n\n    var lineHeight = getLineHeight(style);\n\n    // we split text by lines and normalize\n    // {soft break} + {line break} => { line break }\n    var lines = text.split(/\\u00AD?\\r?\\n/),\n        layouted = [];\n\n    var maxWidth = box.width - padding.left - padding.right;\n\n    // ensure correct rendering by attaching helper text node to invisible SVG\n    var helperText = create$1('text');\n    attr$1(helperText, { x: 0, y: 0 });\n    attr$1(helperText, style);\n\n    var helperSvg = getHelperSvg();\n\n    append(helperSvg, helperText);\n\n    while (lines.length) {\n      layouted.push(layoutNext(lines, maxWidth, helperText));\n    }\n\n    if (align.vertical === 'middle') {\n      padding.top = padding.bottom = 0;\n    }\n\n    var totalHeight = reduce(layouted, function(sum, line, idx) {\n      return sum + (lineHeight || line.height);\n    }, 0) + padding.top + padding.bottom;\n\n    var maxLineWidth = reduce(layouted, function(sum, line, idx) {\n      return line.width > sum ? line.width : sum;\n    }, 0);\n\n    // the y position of the next line\n    var y = padding.top;\n\n    if (align.vertical === 'middle') {\n      y += (box.height - totalHeight) / 2;\n    }\n\n    // magic number initial offset\n    y -= (lineHeight || layouted[0].height) / 4;\n\n\n    var textElement = create$1('text');\n\n    attr$1(textElement, style);\n\n    // layout each line taking into account that parent\n    // shape might resize to fit text size\n    forEach$1(layouted, function(line) {\n\n      var x;\n\n      y += (lineHeight || line.height);\n\n      switch (align.horizontal) {\n      case 'left':\n        x = padding.left;\n        break;\n\n      case 'right':\n        x = ((fitBox ? maxLineWidth : maxWidth)\n          - padding.right - line.width);\n        break;\n\n      default:\n\n        // aka center\n        x = Math.max((((fitBox ? maxLineWidth : maxWidth)\n          - line.width) / 2 + padding.left), 0);\n      }\n\n      var tspan = create$1('tspan');\n      attr$1(tspan, { x: x, y: y });\n\n      tspan.textContent = line.text;\n\n      append(textElement, tspan);\n    });\n\n    remove$2(helperText);\n\n    var dimensions = {\n      width: maxLineWidth,\n      height: totalHeight\n    };\n\n    return {\n      dimensions: dimensions,\n      element: textElement\n    };\n  };\n\n\n  function getLineHeight(style) {\n    if ('fontSize' in style && 'lineHeight' in style) {\n      return style.lineHeight * parseInt(style.fontSize, 10);\n    }\n  }\n\n  var DEFAULT_FONT_SIZE = 12;\n  var LINE_HEIGHT_RATIO = 1.2;\n\n  var MIN_TEXT_ANNOTATION_HEIGHT = 30;\n\n  /**\n   * @typedef { {\n   *   fontFamily: string;\n   *   fontSize: number;\n   *   fontWeight: string;\n   *   lineHeight: number;\n   * } } TextRendererStyle\n   *\n   * @typedef { {\n   *   defaultStyle?: Partial<TextRendererStyle>;\n   *   externalStyle?: Partial<TextRendererStyle>;\n   * } } TextRendererConfig\n   *\n   * @typedef { import('diagram-js/lib/util/Text').TextLayoutConfig } TextLayoutConfig\n   *\n   * @typedef { import('diagram-js/lib/util/Types').Rect } Rect\n   */\n\n\n  /**\n   * Renders text and computes text bounding boxes.\n   *\n   * @param {TextRendererConfig} [config]\n   */\n  function TextRenderer(config) {\n\n    var defaultStyle = assign$1({\n      fontFamily: 'Arial, sans-serif',\n      fontSize: DEFAULT_FONT_SIZE,\n      fontWeight: 'normal',\n      lineHeight: LINE_HEIGHT_RATIO\n    }, config && config.defaultStyle || {});\n\n    var fontSize = parseInt(defaultStyle.fontSize, 10) - 1;\n\n    var externalStyle = assign$1({}, defaultStyle, {\n      fontSize: fontSize\n    }, config && config.externalStyle || {});\n\n    var textUtil = new Text({\n      style: defaultStyle\n    });\n\n    /**\n     * Get the new bounds of an externally rendered,\n     * layouted label.\n     *\n     * @param {Rect} bounds\n     * @param {string} text\n     *\n     * @return {Rect}\n     */\n    this.getExternalLabelBounds = function(bounds, text) {\n\n      var layoutedDimensions = textUtil.getDimensions(text, {\n        box: {\n          width: 90,\n          height: 30\n        },\n        style: externalStyle\n      });\n\n      // resize label shape to fit label text\n      return {\n        x: Math.round(bounds.x + bounds.width / 2 - layoutedDimensions.width / 2),\n        y: Math.round(bounds.y),\n        width: Math.ceil(layoutedDimensions.width),\n        height: Math.ceil(layoutedDimensions.height)\n      };\n\n    };\n\n    /**\n     * Get the new bounds of text annotation.\n     *\n     * @param {Rect} bounds\n     * @param {string} text\n     *\n     * @return {Rect}\n     */\n    this.getTextAnnotationBounds = function(bounds, text) {\n\n      var layoutedDimensions = textUtil.getDimensions(text, {\n        box: bounds,\n        style: defaultStyle,\n        align: 'left-top',\n        padding: 5\n      });\n\n      return {\n        x: bounds.x,\n        y: bounds.y,\n        width: bounds.width,\n        height: Math.max(MIN_TEXT_ANNOTATION_HEIGHT, Math.round(layoutedDimensions.height))\n      };\n    };\n\n    /**\n     * Create a layouted text element.\n     *\n     * @param {string} text\n     * @param {TextLayoutConfig} [options]\n     *\n     * @return {SVGElement} rendered text\n     */\n    this.createText = function(text, options) {\n      return textUtil.createText(text, options || {});\n    };\n\n    /**\n     * Get default text style.\n     */\n    this.getDefaultStyle = function() {\n      return defaultStyle;\n    };\n\n    /**\n     * Get the external text style.\n     */\n    this.getExternalStyle = function() {\n      return externalStyle;\n    };\n\n  }\n\n  TextRenderer.$inject = [\n    'config.textRenderer'\n  ];\n\n  /**\n   * Map containing SVG paths needed by BpmnRenderer\n   */\n  function PathMap() {\n\n    /**\n     * Contains a map of path elements\n     *\n     * <h1>Path definition</h1>\n     * A parameterized path is defined like this:\n     * <pre>\n     * 'GATEWAY_PARALLEL': {\n     *   d: 'm {mx},{my} {e.x0},0 0,{e.x1} {e.x1},0 0,{e.y0} -{e.x1},0 0,{e.y1} ' +\n            '-{e.x0},0 0,-{e.y1} -{e.x1},0 0,-{e.y0} {e.x1},0 z',\n     *   height: 17.5,\n     *   width:  17.5,\n     *   heightElements: [2.5, 7.5],\n     *   widthElements: [2.5, 7.5]\n     * }\n     * </pre>\n     * <p>It's important to specify a correct <b>height and width</b> for the path as the scaling\n     * is based on the ratio between the specified height and width in this object and the\n     * height and width that is set as scale target (Note x,y coordinates will be scaled with\n     * individual ratios).</p>\n     * <p>The '<b>heightElements</b>' and '<b>widthElements</b>' array must contain the values that will be scaled.\n     * The scaling is based on the computed ratios.\n     * Coordinates on the y axis should be in the <b>heightElement</b>'s array, they will be scaled using\n     * the computed ratio coefficient.\n     * In the parameterized path the scaled values can be accessed through the 'e' object in {} brackets.\n     *   <ul>\n     *    <li>The values for the y axis can be accessed in the path string using {e.y0}, {e.y1}, ....</li>\n     *    <li>The values for the x axis can be accessed in the path string using {e.x0}, {e.x1}, ....</li>\n     *   </ul>\n     *   The numbers x0, x1 respectively y0, y1, ... map to the corresponding array index.\n     * </p>\n     */\n    this.pathMap = {\n      'EVENT_MESSAGE': {\n        d: 'm {mx},{my} l 0,{e.y1} l {e.x1},0 l 0,-{e.y1} z l {e.x0},{e.y0} l {e.x0},-{e.y0}',\n        height: 36,\n        width:  36,\n        heightElements: [ 6, 14 ],\n        widthElements: [ 10.5, 21 ]\n      },\n      'EVENT_SIGNAL': {\n        d: 'M {mx},{my} l {e.x0},{e.y0} l -{e.x1},0 Z',\n        height: 36,\n        width: 36,\n        heightElements: [ 18 ],\n        widthElements: [ 10, 20 ]\n      },\n      'EVENT_ESCALATION': {\n        d: 'M {mx},{my} l {e.x0},{e.y0} l -{e.x0},-{e.y1} l -{e.x0},{e.y1} Z',\n        height: 36,\n        width: 36,\n        heightElements: [ 20, 7 ],\n        widthElements: [ 8 ]\n      },\n      'EVENT_CONDITIONAL': {\n        d: 'M {e.x0},{e.y0} l {e.x1},0 l 0,{e.y2} l -{e.x1},0 Z ' +\n           'M {e.x2},{e.y3} l {e.x0},0 ' +\n           'M {e.x2},{e.y4} l {e.x0},0 ' +\n           'M {e.x2},{e.y5} l {e.x0},0 ' +\n           'M {e.x2},{e.y6} l {e.x0},0 ' +\n           'M {e.x2},{e.y7} l {e.x0},0 ' +\n           'M {e.x2},{e.y8} l {e.x0},0 ',\n        height: 36,\n        width:  36,\n        heightElements: [ 8.5, 14.5, 18, 11.5, 14.5, 17.5, 20.5, 23.5, 26.5 ],\n        widthElements:  [ 10.5, 14.5, 12.5 ]\n      },\n      'EVENT_LINK': {\n        d: 'm {mx},{my} 0,{e.y0} -{e.x1},0 0,{e.y1} {e.x1},0 0,{e.y0} {e.x0},-{e.y2} -{e.x0},-{e.y2} z',\n        height: 36,\n        width: 36,\n        heightElements: [ 4.4375, 6.75, 7.8125 ],\n        widthElements: [ 9.84375, 13.5 ]\n      },\n      'EVENT_ERROR': {\n        d: 'm {mx},{my} {e.x0},-{e.y0} {e.x1},-{e.y1} {e.x2},{e.y2} {e.x3},-{e.y3} -{e.x4},{e.y4} -{e.x5},-{e.y5} z',\n        height: 36,\n        width: 36,\n        heightElements: [ 0.023, 8.737, 8.151, 16.564, 10.591, 8.714 ],\n        widthElements: [ 0.085, 6.672, 6.97, 4.273, 5.337, 6.636 ]\n      },\n      'EVENT_CANCEL_45': {\n        d: 'm {mx},{my} -{e.x1},0 0,{e.x0} {e.x1},0 0,{e.y1} {e.x0},0 ' +\n          '0,-{e.y1} {e.x1},0 0,-{e.y0} -{e.x1},0 0,-{e.y1} -{e.x0},0 z',\n        height: 36,\n        width: 36,\n        heightElements: [ 4.75, 8.5 ],\n        widthElements: [ 4.75, 8.5 ]\n      },\n      'EVENT_COMPENSATION': {\n        d: 'm {mx},{my} {e.x0},-{e.y0} 0,{e.y1} z m {e.x1},-{e.y2} {e.x2},-{e.y3} 0,{e.y1} -{e.x2},-{e.y3} z',\n        height: 36,\n        width: 36,\n        heightElements: [ 6.5, 13, 0.4, 6.1 ],\n        widthElements: [ 9, 9.3, 8.7 ]\n      },\n      'EVENT_TIMER_WH': {\n        d: 'M {mx},{my} l {e.x0},-{e.y0} m -{e.x0},{e.y0} l {e.x1},{e.y1} ',\n        height: 36,\n        width:  36,\n        heightElements: [ 10, 2 ],\n        widthElements: [ 3, 7 ]\n      },\n      'EVENT_TIMER_LINE': {\n        d:  'M {mx},{my} ' +\n            'm {e.x0},{e.y0} l -{e.x1},{e.y1} ',\n        height: 36,\n        width:  36,\n        heightElements: [ 10, 3 ],\n        widthElements: [ 0, 0 ]\n      },\n      'EVENT_MULTIPLE': {\n        d:'m {mx},{my} {e.x1},-{e.y0} {e.x1},{e.y0} -{e.x0},{e.y1} -{e.x2},0 z',\n        height: 36,\n        width:  36,\n        heightElements: [ 6.28099, 12.56199 ],\n        widthElements: [ 3.1405, 9.42149, 12.56198 ]\n      },\n      'EVENT_PARALLEL_MULTIPLE': {\n        d:'m {mx},{my} {e.x0},0 0,{e.y1} {e.x1},0 0,{e.y0} -{e.x1},0 0,{e.y1} ' +\n          '-{e.x0},0 0,-{e.y1} -{e.x1},0 0,-{e.y0} {e.x1},0 z',\n        height: 36,\n        width:  36,\n        heightElements: [ 2.56228, 7.68683 ],\n        widthElements: [ 2.56228, 7.68683 ]\n      },\n      'GATEWAY_EXCLUSIVE': {\n        d:'m {mx},{my} {e.x0},{e.y0} {e.x1},{e.y0} {e.x2},0 {e.x4},{e.y2} ' +\n                      '{e.x4},{e.y1} {e.x2},0 {e.x1},{e.y3} {e.x0},{e.y3} ' +\n                      '{e.x3},0 {e.x5},{e.y1} {e.x5},{e.y2} {e.x3},0 z',\n        height: 17.5,\n        width:  17.5,\n        heightElements: [ 8.5, 6.5312, -6.5312, -8.5 ],\n        widthElements:  [ 6.5, -6.5, 3, -3, 5, -5 ]\n      },\n      'GATEWAY_PARALLEL': {\n        d:'m {mx},{my} 0,{e.y1} -{e.x1},0 0,{e.y0} {e.x1},0 0,{e.y1} {e.x0},0 ' +\n          '0,-{e.y1} {e.x1},0 0,-{e.y0} -{e.x1},0 0,-{e.y1} -{e.x0},0 z',\n        height: 30,\n        width:  30,\n        heightElements: [ 5, 12.5 ],\n        widthElements: [ 5, 12.5 ]\n      },\n      'GATEWAY_EVENT_BASED': {\n        d:'m {mx},{my} {e.x0},{e.y0} {e.x0},{e.y1} {e.x1},{e.y2} {e.x2},0 z',\n        height: 11,\n        width:  11,\n        heightElements: [ -6, 6, 12, -12 ],\n        widthElements: [ 9, -3, -12 ]\n      },\n      'GATEWAY_COMPLEX': {\n        d:'m {mx},{my} 0,{e.y0} -{e.x0},-{e.y1} -{e.x1},{e.y2} {e.x0},{e.y1} -{e.x2},0 0,{e.y3} ' +\n          '{e.x2},0  -{e.x0},{e.y1} l {e.x1},{e.y2} {e.x0},-{e.y1} 0,{e.y0} {e.x3},0 0,-{e.y0} {e.x0},{e.y1} ' +\n          '{e.x1},-{e.y2} -{e.x0},-{e.y1} {e.x2},0 0,-{e.y3} -{e.x2},0 {e.x0},-{e.y1} -{e.x1},-{e.y2} ' +\n          '-{e.x0},{e.y1} 0,-{e.y0} -{e.x3},0 z',\n        height: 17.125,\n        width:  17.125,\n        heightElements: [ 4.875, 3.4375, 2.125, 3 ],\n        widthElements: [ 3.4375, 2.125, 4.875, 3 ]\n      },\n      'DATA_OBJECT_PATH': {\n        d:'m 0,0 {e.x1},0 {e.x0},{e.y0} 0,{e.y1} -{e.x2},0 0,-{e.y2} {e.x1},0 0,{e.y0} {e.x0},0',\n        height: 61,\n        width:  51,\n        heightElements: [ 10, 50, 60 ],\n        widthElements: [ 10, 40, 50, 60 ]\n      },\n      'DATA_OBJECT_COLLECTION_PATH': {\n        d: 'm{mx},{my} m 3,2 l 0,10 m 3,-10 l 0,10 m 3,-10 l 0,10',\n        height: 10,\n        width: 10,\n        heightElements: [],\n        widthElements: []\n      },\n      'DATA_ARROW': {\n        d:'m 5,9 9,0 0,-3 5,5 -5,5 0,-3 -9,0 z',\n        height: 61,\n        width:  51,\n        heightElements: [],\n        widthElements: []\n      },\n      'DATA_STORE': {\n        d:'m  {mx},{my} ' +\n          'l  0,{e.y2} ' +\n          'c  {e.x0},{e.y1} {e.x1},{e.y1}  {e.x2},0 ' +\n          'l  0,-{e.y2} ' +\n          'c -{e.x0},-{e.y1} -{e.x1},-{e.y1} -{e.x2},0' +\n          'c  {e.x0},{e.y1} {e.x1},{e.y1}  {e.x2},0 ' +\n          'm  -{e.x2},{e.y0}' +\n          'c  {e.x0},{e.y1} {e.x1},{e.y1} {e.x2},0' +\n          'm  -{e.x2},{e.y0}' +\n          'c  {e.x0},{e.y1} {e.x1},{e.y1}  {e.x2},0',\n        height: 61,\n        width:  61,\n        heightElements: [ 7, 10, 45 ],\n        widthElements:  [ 2, 58, 60 ]\n      },\n      'TEXT_ANNOTATION': {\n        d: 'm {mx}, {my} m 10,0 l -10,0 l 0,{e.y0} l 10,0',\n        height: 30,\n        width: 10,\n        heightElements: [ 30 ],\n        widthElements: [ 10 ]\n      },\n      'MARKER_SUB_PROCESS': {\n        d: 'm{mx},{my} m 7,2 l 0,10 m -5,-5 l 10,0',\n        height: 10,\n        width: 10,\n        heightElements: [],\n        widthElements: []\n      },\n      'MARKER_PARALLEL': {\n        d: 'm{mx},{my} m 3,2 l 0,10 m 3,-10 l 0,10 m 3,-10 l 0,10',\n        height: 10,\n        width: 10,\n        heightElements: [],\n        widthElements: []\n      },\n      'MARKER_SEQUENTIAL': {\n        d: 'm{mx},{my} m 0,3 l 10,0 m -10,3 l 10,0 m -10,3 l 10,0',\n        height: 10,\n        width: 10,\n        heightElements: [],\n        widthElements: []\n      },\n      'MARKER_COMPENSATION': {\n        d: 'm {mx},{my} 7,-5 0,10 z m 7.1,-0.3 6.9,-4.7 0,10 -6.9,-4.7 z',\n        height: 10,\n        width: 21,\n        heightElements: [],\n        widthElements: []\n      },\n      'MARKER_LOOP': {\n        d: 'm {mx},{my} c 3.526979,0 6.386161,-2.829858 6.386161,-6.320661 0,-3.490806 -2.859182,-6.320661 ' +\n          '-6.386161,-6.320661 -3.526978,0 -6.38616,2.829855 -6.38616,6.320661 0,1.745402 ' +\n          '0.714797,3.325567 1.870463,4.469381 0.577834,0.571908 1.265885,1.034728 2.029916,1.35457 ' +\n          'l -0.718163,-3.909793 m 0.718163,3.909793 -3.885211,0.802902',\n        height: 13.9,\n        width: 13.7,\n        heightElements: [],\n        widthElements: []\n      },\n      'MARKER_ADHOC': {\n        d: 'm {mx},{my} m 0.84461,2.64411 c 1.05533,-1.23780996 2.64337,-2.07882 4.29653,-1.97997996 2.05163,0.0805 ' +\n          '3.85579,1.15803 5.76082,1.79107 1.06385,0.34139996 2.24454,0.1438 3.18759,-0.43767 0.61743,-0.33642 ' +\n          '1.2775,-0.64078 1.7542,-1.17511 0,0.56023 0,1.12046 0,1.6807 -0.98706,0.96237996 -2.29792,1.62393996 ' +\n          '-3.6918,1.66181996 -1.24459,0.0927 -2.46671,-0.2491 -3.59505,-0.74812 -1.35789,-0.55965 ' +\n          '-2.75133,-1.33436996 -4.27027,-1.18121996 -1.37741,0.14601 -2.41842,1.13685996 -3.44288,1.96782996 z',\n        height: 4,\n        width: 15,\n        heightElements: [],\n        widthElements: []\n      },\n      'TASK_TYPE_SEND': {\n        d: 'm {mx},{my} l 0,{e.y1} l {e.x1},0 l 0,-{e.y1} z l {e.x0},{e.y0} l {e.x0},-{e.y0}',\n        height: 14,\n        width:  21,\n        heightElements: [ 6, 14 ],\n        widthElements: [ 10.5, 21 ]\n      },\n      'TASK_TYPE_SCRIPT': {\n        d: 'm {mx},{my} c 9.966553,-6.27276 -8.000926,-7.91932 2.968968,-14.938 l -8.802728,0 ' +\n          'c -10.969894,7.01868 6.997585,8.66524 -2.968967,14.938 z ' +\n          'm -7,-12 l 5,0 ' +\n          'm -4.5,3 l 4.5,0 ' +\n          'm -3,3 l 5,0' +\n          'm -4,3 l 5,0',\n        height: 15,\n        width:  12.6,\n        heightElements: [ 6, 14 ],\n        widthElements: [ 10.5, 21 ]\n      },\n      'TASK_TYPE_USER_1': {\n        d: 'm {mx},{my} c 0.909,-0.845 1.594,-2.049 1.594,-3.385 0,-2.554 -1.805,-4.62199999 ' +\n          '-4.357,-4.62199999 -2.55199998,0 -4.28799998,2.06799999 -4.28799998,4.62199999 0,1.348 ' +\n          '0.974,2.562 1.89599998,3.405 -0.52899998,0.187 -5.669,2.097 -5.794,4.7560005 v 6.718 ' +\n          'h 17 v -6.718 c 0,-2.2980005 -5.5279996,-4.5950005 -6.0509996,-4.7760005 z' +\n          'm -8,6 l 0,5.5 m 11,0 l 0,-5'\n      },\n      'TASK_TYPE_USER_2': {\n        d: 'm {mx},{my} m 2.162,1.009 c 0,2.4470005 -2.158,4.4310005 -4.821,4.4310005 ' +\n          '-2.66499998,0 -4.822,-1.981 -4.822,-4.4310005 '\n      },\n      'TASK_TYPE_USER_3': {\n        d: 'm {mx},{my} m -6.9,-3.80 c 0,0 2.25099998,-2.358 4.27399998,-1.177 2.024,1.181 4.221,1.537 ' +\n          '4.124,0.965 -0.098,-0.57 -0.117,-3.79099999 -4.191,-4.13599999 -3.57499998,0.001 ' +\n          '-4.20799998,3.36699999 -4.20699998,4.34799999 z'\n      },\n      'TASK_TYPE_MANUAL': {\n        d: 'm {mx},{my} c 0.234,-0.01 5.604,0.008 8.029,0.004 0.808,0 1.271,-0.172 1.417,-0.752 0.227,-0.898 ' +\n          '-0.334,-1.314 -1.338,-1.316 -2.467,-0.01 -7.886,-0.004 -8.108,-0.004 -0.014,-0.079 0.016,-0.533 0,-0.61 ' +\n          '0.195,-0.042 8.507,0.006 9.616,0.002 0.877,-0.007 1.35,-0.438 1.353,-1.208 0.003,-0.768 -0.479,-1.09 ' +\n          '-1.35,-1.091 -2.968,-0.002 -9.619,-0.013 -9.619,-0.013 v -0.591 c 0,0 5.052,-0.016 7.225,-0.016 ' +\n          '0.888,-0.002 1.354,-0.416 1.351,-1.193 -0.006,-0.761 -0.492,-1.196 -1.361,-1.196 -3.473,-0.005 ' +\n          '-10.86,-0.003 -11.0829995,-0.003 -0.022,-0.047 -0.045,-0.094 -0.069,-0.139 0.3939995,-0.319 ' +\n          '2.0409995,-1.626 2.4149995,-2.017 0.469,-0.4870005 0.519,-1.1650005 0.162,-1.6040005 -0.414,-0.511 ' +\n          '-0.973,-0.5 -1.48,-0.236 -1.4609995,0.764 -6.5999995,3.6430005 -7.7329995,4.2710005 -0.9,0.499 ' +\n          '-1.516,1.253 -1.882,2.19 -0.37000002,0.95 -0.17,2.01 -0.166,2.979 0.004,0.718 -0.27300002,1.345 ' +\n          '-0.055,2.063 0.629,2.087 2.425,3.312 4.859,3.318 4.6179995,0.014 9.2379995,-0.139 13.8569995,-0.158 ' +\n          '0.755,-0.004 1.171,-0.301 1.182,-1.033 0.012,-0.754 -0.423,-0.969 -1.183,-0.973 -1.778,-0.01 ' +\n          '-5.824,-0.004 -6.04,-0.004 10e-4,-0.084 0.003,-0.586 10e-4,-0.67 z'\n      },\n      'TASK_TYPE_INSTANTIATING_SEND': {\n        d: 'm {mx},{my} l 0,8.4 l 12.6,0 l 0,-8.4 z l 6.3,3.6 l 6.3,-3.6'\n      },\n      'TASK_TYPE_SERVICE': {\n        d: 'm {mx},{my} v -1.71335 c 0.352326,-0.0705 0.703932,-0.17838 1.047628,-0.32133 ' +\n          '0.344416,-0.14465 0.665822,-0.32133 0.966377,-0.52145 l 1.19431,1.18005 1.567487,-1.57688 ' +\n          '-1.195028,-1.18014 c 0.403376,-0.61394 0.683079,-1.29908 0.825447,-2.01824 l 1.622133,-0.01 ' +\n          'v -2.2196 l -1.636514,0.01 c -0.07333,-0.35153 -0.178319,-0.70024 -0.323564,-1.04372 ' +\n          '-0.145244,-0.34406 -0.321407,-0.6644 -0.522735,-0.96217 l 1.131035,-1.13631 -1.583305,-1.56293 ' +\n          '-1.129598,1.13589 c -0.614052,-0.40108 -1.302883,-0.68093 -2.022633,-0.82247 l 0.0093,-1.61852 ' +\n          'h -2.241173 l 0.0042,1.63124 c -0.353763,0.0736 -0.705369,0.17977 -1.049785,0.32371 -0.344415,0.14437 ' +\n          '-0.665102,0.32092 -0.9635006,0.52046 l -1.1698628,-1.15823 -1.5667691,1.5792 1.1684265,1.15669 ' +\n          'c -0.4026573,0.61283 -0.68308,1.29797 -0.8247287,2.01713 l -1.6588041,0.003 v 2.22174 ' +\n          'l 1.6724648,-0.006 c 0.073327,0.35077 0.1797598,0.70243 0.3242851,1.04472 0.1452428,0.34448 ' +\n          '0.3214064,0.6644 0.5227339,0.96066 l -1.1993431,1.19723 1.5840256,1.56011 1.1964668,-1.19348 ' +\n          'c 0.6140517,0.40346 1.3028827,0.68232 2.0233517,0.82331 l 7.19e-4,1.69892 h 2.226848 z ' +\n          'm 0.221462,-3.9957 c -1.788948,0.7502 -3.8576,-0.0928 -4.6097055,-1.87438 -0.7521065,-1.78321 ' +\n          '0.090598,-3.84627 1.8802645,-4.59604 1.78823,-0.74936 3.856881,0.0929 4.608987,1.87437 ' +\n          '0.752106,1.78165 -0.0906,3.84612 -1.879546,4.59605 z'\n      },\n      'TASK_TYPE_SERVICE_FILL': {\n        d: 'm {mx},{my} c -1.788948,0.7502 -3.8576,-0.0928 -4.6097055,-1.87438 -0.7521065,-1.78321 ' +\n          '0.090598,-3.84627 1.8802645,-4.59604 1.78823,-0.74936 3.856881,0.0929 4.608987,1.87437 ' +\n          '0.752106,1.78165 -0.0906,3.84612 -1.879546,4.59605 z'\n      },\n      'TASK_TYPE_BUSINESS_RULE_HEADER': {\n        d: 'm {mx},{my} 0,4 20,0 0,-4 z'\n      },\n      'TASK_TYPE_BUSINESS_RULE_MAIN': {\n        d: 'm {mx},{my} 0,12 20,0 0,-12 z' +\n          'm 0,8 l 20,0 ' +\n          'm -13,-4 l 0,8'\n      },\n      'MESSAGE_FLOW_MARKER': {\n        d: 'm {mx},{my} m -10.5 ,-7 l 0,14 l 21,0 l 0,-14 z l 10.5,6 l 10.5,-6'\n      }\n    };\n\n    /**\n     * Return raw path for the given ID.\n     *\n     * @param {string} pathId\n     *\n     * @return {string} raw path\n     */\n    this.getRawPath = function getRawPath(pathId) {\n      return this.pathMap[pathId].d;\n    };\n\n    /**\n     * Scales the path to the given height and width.\n     * <h1>Use case</h1>\n     * <p>Use case is to scale the content of elements (event, gateways) based\n     * on the element bounding box's size.\n     * </p>\n     * <h1>Why not transform</h1>\n     * <p>Scaling a path with transform() will also scale the stroke and IE does not support\n     * the option 'non-scaling-stroke' to prevent this.\n     * Also there are use cases where only some parts of a path should be\n     * scaled.</p>\n     *\n     * @param {string} pathId The ID of the path.\n     * @param {Object} param <p>\n     *   Example param object scales the path to 60% size of the container (data.width, data.height).\n     *   <pre>\n     *   {\n     *     xScaleFactor: 0.6,\n     *     yScaleFactor:0.6,\n     *     containerWidth: data.width,\n     *     containerHeight: data.height,\n     *     position: {\n     *       mx: 0.46,\n     *       my: 0.2,\n     *     }\n     *   }\n     *   </pre>\n     *   <ul>\n     *    <li>targetpathwidth = xScaleFactor * containerWidth</li>\n     *    <li>targetpathheight = yScaleFactor * containerHeight</li>\n     *    <li>Position is used to set the starting coordinate of the path. M is computed:\n      *    <ul>\n      *      <li>position.x * containerWidth</li>\n      *      <li>position.y * containerHeight</li>\n      *    </ul>\n      *    Center of the container <pre> position: {\n     *       mx: 0.5,\n     *       my: 0.5,\n     *     }</pre>\n     *     Upper left corner of the container\n     *     <pre> position: {\n     *       mx: 0.0,\n     *       my: 0.0,\n     *     }</pre>\n     *    </li>\n     *   </ul>\n     * </p>\n     *\n     * @return {string} scaled path\n     */\n    this.getScaledPath = function getScaledPath(pathId, param) {\n      var rawPath = this.pathMap[pathId];\n\n      // positioning\n      // compute the start point of the path\n      var mx, my;\n\n      if (param.abspos) {\n        mx = param.abspos.x;\n        my = param.abspos.y;\n      } else {\n        mx = param.containerWidth * param.position.mx;\n        my = param.containerHeight * param.position.my;\n      }\n\n      var coordinates = {}; // map for the scaled coordinates\n      if (param.position) {\n\n        // path\n        var heightRatio = (param.containerHeight / rawPath.height) * param.yScaleFactor;\n        var widthRatio = (param.containerWidth / rawPath.width) * param.xScaleFactor;\n\n\n        // Apply height ratio\n        for (var heightIndex = 0; heightIndex < rawPath.heightElements.length; heightIndex++) {\n          coordinates['y' + heightIndex] = rawPath.heightElements[heightIndex] * heightRatio;\n        }\n\n        // Apply width ratio\n        for (var widthIndex = 0; widthIndex < rawPath.widthElements.length; widthIndex++) {\n          coordinates['x' + widthIndex] = rawPath.widthElements[widthIndex] * widthRatio;\n        }\n      }\n\n      // Apply value to raw path\n      var path = format(\n        rawPath.d, {\n          mx: mx,\n          my: my,\n          e: coordinates\n        }\n      );\n      return path;\n    };\n  }\n\n  // helpers //////////////////////\n\n  // copied and adjusted from https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js\n  var tokenRegex = /\\{([^{}]+)\\}/g,\n      objNotationRegex = /(?:(?:^|\\.)(.+?)(?=\\[|\\.|$|\\()|\\[('|\")(.+?)\\2\\])(\\(\\))?/g; // matches .xxxxx or [\"xxxxx\"] to run over object properties\n\n  function replacer(all, key, obj) {\n    var res = obj;\n    key.replace(objNotationRegex, function(all, name, quote, quotedName, isFunc) {\n      name = name || quotedName;\n      if (res) {\n        if (name in res) {\n          res = res[name];\n        }\n        typeof res == 'function' && isFunc && (res = res());\n      }\n    });\n    res = (res == null || res == obj ? all : res) + '';\n\n    return res;\n  }\n\n  function format(str, obj) {\n    return String(str).replace(tokenRegex, function(all, key) {\n      return replacer(all, key, obj);\n    });\n  }\n\n  var DrawModule$1 = {\n    __init__: [ 'bpmnRenderer' ],\n    bpmnRenderer: [ 'type', BpmnRenderer ],\n    textRenderer: [ 'type', TextRenderer ],\n    pathMap: [ 'type', PathMap ]\n  };\n\n  /**\n   * @typedef { {\n   *   [key: string]: string;\n   * } } TranslateReplacements\n   */\n\n  /**\n   * A simple translation stub to be used for multi-language support\n   * in diagrams. Can be easily replaced with a more sophisticated\n   * solution.\n   *\n   * @example\n   *\n   * ```javascript\n   * // use it inside any diagram component by injecting `translate`.\n   *\n   * function MyService(translate) {\n   *   alert(translate('HELLO {you}', { you: 'You!' }));\n   * }\n   * ```\n   *\n   * @param {string} template to interpolate\n   * @param {TranslateReplacements} [replacements] a map with substitutes\n   *\n   * @return {string} the translated string\n   */\n  function translate(template, replacements) {\n\n    replacements = replacements || {};\n\n    return template.replace(/{([^}]+)}/g, function(_, key) {\n      return replacements[key] || '{' + key + '}';\n    });\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var TranslateModule = {\n    translate: [ 'value', translate ]\n  };\n\n  function getDefaultExportFromCjs (x) {\n  \treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n  }\n\n  /**\n   * @param {Point} point\n   *\n   * @returns {Point}\n   */\n  function roundPoint(point) {\n\n    return {\n      x: Math.round(point.x),\n      y: Math.round(point.y)\n    };\n  }\n\n\n  /**\n   * Convert the given bounds to a { top, left, bottom, right } descriptor.\n   *\n   * @param {Point|Rect} bounds\n   *\n   * @return {RectTRBL}\n   */\n  function asTRBL(bounds) {\n    return {\n      top: bounds.y,\n      right: bounds.x + (bounds.width || 0),\n      bottom: bounds.y + (bounds.height || 0),\n      left: bounds.x\n    };\n  }\n\n\n  /**\n   * Convert a { top, left, bottom, right } to an objects bounds.\n   *\n   * @param {RectTRBL} trbl\n   *\n   * @return {Rect}\n   */\n  function asBounds(trbl) {\n    return {\n      x: trbl.left,\n      y: trbl.top,\n      width: trbl.right - trbl.left,\n      height: trbl.bottom - trbl.top\n    };\n  }\n\n\n  /**\n   * Get the mid of the given bounds or point.\n   *\n   * @param {Point|Rect} bounds\n   *\n   * @return {Point}\n   */\n  function getBoundsMid(bounds) {\n    return roundPoint({\n      x: bounds.x + (bounds.width || 0) / 2,\n      y: bounds.y + (bounds.height || 0) / 2\n    });\n  }\n\n\n  /**\n   * Get the mid of the given Connection.\n   *\n   * @param {Connection} connection\n   *\n   * @return {Point}\n   */\n  function getConnectionMid(connection) {\n    var waypoints = connection.waypoints;\n\n    // calculate total length and length of each segment\n    var parts = waypoints.reduce(function(parts, point, index) {\n\n      var lastPoint = waypoints[index - 1];\n\n      if (lastPoint) {\n        var lastPart = parts[parts.length - 1];\n\n        var startLength = lastPart && lastPart.endLength || 0;\n        var length = distance(lastPoint, point);\n\n        parts.push({\n          start: lastPoint,\n          end: point,\n          startLength: startLength,\n          endLength: startLength + length,\n          length: length\n        });\n      }\n\n      return parts;\n    }, []);\n\n    var totalLength = parts.reduce(function(length, part) {\n      return length + part.length;\n    }, 0);\n\n    // find which segement contains middle point\n    var midLength = totalLength / 2;\n\n    var i = 0;\n    var midSegment = parts[i];\n\n    while (midSegment.endLength < midLength) {\n      midSegment = parts[++i];\n    }\n\n    // calculate relative position on mid segment\n    var segmentProgress = (midLength - midSegment.startLength) / midSegment.length;\n\n    var midPoint = {\n      x: midSegment.start.x + (midSegment.end.x - midSegment.start.x) * segmentProgress,\n      y: midSegment.start.y + (midSegment.end.y - midSegment.start.y) * segmentProgress\n    };\n\n    return midPoint;\n  }\n\n\n  /**\n   * Get the mid of the given Element.\n   *\n   * @param {Element} element\n   *\n   * @return {Point}\n   */\n  function getMid(element) {\n    if (isConnection(element)) {\n      return getConnectionMid(element);\n    }\n\n    return getBoundsMid(element);\n  }\n\n  // helpers //////////////////////\n\n  function distance(a, b) {\n    return Math.sqrt(Math.pow(a.x - b.x, 2) + Math.pow(a.y - b.y, 2));\n  }\n\n  function elementToString(e) {\n    if (!e) {\n      return '<null>';\n    }\n\n    return '<' + e.$type + (e.id ? ' id=\"' + e.id : '') + '\" />';\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n   *\n   * @typedef {import('../features/modeling/ElementFactory').default} ElementFactory\n   * @typedef {import('../draw/TextRenderer').default} TextRenderer\n   *\n   * @typedef {import('../model/Types').Element} Element\n   * @typedef {import('../model/Types').Label} Label\n   * @typedef {import('../model/Types').Shape} Shape\n   * @typedef {import('../model/Types').Connection} Connection\n   * @typedef {import('../model/Types').Root} Root\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   */\n\n  /**\n   * @param {ModdleElement} semantic\n   * @param {ModdleElement} di\n   * @param {Object} [attrs=null]\n   *\n   * @return {Object}\n   */\n  function elementData(semantic, di, attrs) {\n    return assign$1({\n      id: semantic.id,\n      type: semantic.$type,\n      businessObject: semantic,\n      di: di\n    }, attrs);\n  }\n\n  function getWaypoints(di, source, target) {\n\n    var waypoints = di.waypoint;\n\n    if (!waypoints || waypoints.length < 2) {\n      return [ getMid(source), getMid(target) ];\n    }\n\n    return waypoints.map(function(p) {\n      return { x: p.x, y: p.y };\n    });\n  }\n\n  function notYetDrawn(translate, semantic, refSemantic, property) {\n    return new Error(translate('element {element} referenced by {referenced}#{property} not yet drawn', {\n      element: elementToString(refSemantic),\n      referenced: elementToString(semantic),\n      property: property\n    }));\n  }\n\n\n  /**\n   * An importer that adds bpmn elements to the canvas\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {ElementFactory} elementFactory\n   * @param {ElementRegistry} elementRegistry\n   * @param {Function} translate\n   * @param {TextRenderer} textRenderer\n   */\n  function BpmnImporter(\n      eventBus, canvas, elementFactory,\n      elementRegistry, translate, textRenderer) {\n\n    this._eventBus = eventBus;\n    this._canvas = canvas;\n    this._elementFactory = elementFactory;\n    this._elementRegistry = elementRegistry;\n    this._translate = translate;\n    this._textRenderer = textRenderer;\n  }\n\n  BpmnImporter.$inject = [\n    'eventBus',\n    'canvas',\n    'elementFactory',\n    'elementRegistry',\n    'translate',\n    'textRenderer'\n  ];\n\n\n  /**\n   * Add a BPMN element (semantic) to the canvas making it a child of the\n   * given parent.\n   *\n   * @param {ModdleElement} semantic\n   * @param {ModdleElement} di\n   * @param {Shape} parentElement\n   *\n   * @return {Shape | Root | Connection}\n   */\n  BpmnImporter.prototype.add = function(semantic, di, parentElement) {\n    var element,\n        translate = this._translate,\n        hidden;\n\n    var parentIndex;\n\n    // ROOT ELEMENT\n    // handle the special case that we deal with a\n    // invisible root element (process, subprocess or collaboration)\n    if (is$1(di, 'bpmndi:BPMNPlane')) {\n\n      var attrs = is$1(semantic, 'bpmn:SubProcess')\n        ? { id: semantic.id + '_plane' }\n        : {};\n\n      // add a virtual element (not being drawn)\n      element = this._elementFactory.createRoot(elementData(semantic, di, attrs));\n\n      this._canvas.addRootElement(element);\n    }\n\n    // SHAPE\n    else if (is$1(di, 'bpmndi:BPMNShape')) {\n\n      var collapsed = !isExpanded(semantic, di),\n          isFrame = isFrameElement$1(semantic);\n\n      hidden = parentElement && (parentElement.hidden || parentElement.collapsed);\n\n      var bounds = di.bounds;\n\n      element = this._elementFactory.createShape(elementData(semantic, di, {\n        collapsed: collapsed,\n        hidden: hidden,\n        x: Math.round(bounds.x),\n        y: Math.round(bounds.y),\n        width: Math.round(bounds.width),\n        height: Math.round(bounds.height),\n        isFrame: isFrame\n      }));\n\n      if (is$1(semantic, 'bpmn:BoundaryEvent')) {\n        this._attachBoundary(semantic, element);\n      }\n\n      // insert lanes behind other flow nodes (cf. #727)\n      if (is$1(semantic, 'bpmn:Lane')) {\n        parentIndex = 0;\n      }\n\n      if (is$1(semantic, 'bpmn:DataStoreReference')) {\n\n        // check whether data store is inside our outside of its semantic parent\n        if (!isPointInsideBBox(parentElement, getMid(bounds))) {\n          parentElement = this._canvas.findRoot(parentElement);\n        }\n      }\n\n      this._canvas.addShape(element, parentElement, parentIndex);\n    }\n\n    // CONNECTION\n    else if (is$1(di, 'bpmndi:BPMNEdge')) {\n\n      var source = this._getSource(semantic),\n          target = this._getTarget(semantic);\n\n      hidden = parentElement && (parentElement.hidden || parentElement.collapsed);\n\n      element = this._elementFactory.createConnection(elementData(semantic, di, {\n        hidden: hidden,\n        source: source,\n        target: target,\n        waypoints: getWaypoints(di, source, target)\n      }));\n\n      if (is$1(semantic, 'bpmn:DataAssociation')) {\n\n        // render always on top; this ensures DataAssociations\n        // are rendered correctly across different \"hacks\" people\n        // love to model such as cross participant / sub process\n        // associations\n        parentElement = this._canvas.findRoot(parentElement);\n      }\n\n      this._canvas.addConnection(element, parentElement, parentIndex);\n    } else {\n      throw new Error(translate('unknown di {di} for element {semantic}', {\n        di: elementToString(di),\n        semantic: elementToString(semantic)\n      }));\n    }\n\n    // (optional) LABEL\n    if (isLabelExternal(semantic) && getLabel(element)) {\n      this.addLabel(semantic, di, element);\n    }\n\n\n    this._eventBus.fire('bpmnElement.added', { element: element });\n\n    return element;\n  };\n\n\n  /**\n   * Attach a boundary element to the given host.\n   *\n   * @param {ModdleElement} boundarySemantic\n   * @param {Shape} boundaryElement\n   */\n  BpmnImporter.prototype._attachBoundary = function(boundarySemantic, boundaryElement) {\n    var translate = this._translate;\n    var hostSemantic = boundarySemantic.attachedToRef;\n\n    if (!hostSemantic) {\n      throw new Error(translate('missing {semantic}#attachedToRef', {\n        semantic: elementToString(boundarySemantic)\n      }));\n    }\n\n    var host = this._elementRegistry.get(hostSemantic.id),\n        attachers = host && host.attachers;\n\n    if (!host) {\n      throw notYetDrawn(translate, boundarySemantic, hostSemantic, 'attachedToRef');\n    }\n\n    // wire element.host <> host.attachers\n    boundaryElement.host = host;\n\n    if (!attachers) {\n      host.attachers = attachers = [];\n    }\n\n    if (attachers.indexOf(boundaryElement) === -1) {\n      attachers.push(boundaryElement);\n    }\n  };\n\n\n  /**\n   * Add a label to a given element.\n   *\n   * @param {ModdleElement} semantic\n   * @param {ModdleElement} di\n   * @param {Element} element\n   *\n   * @return {Label}\n   */\n  BpmnImporter.prototype.addLabel = function(semantic, di, element) {\n    var bounds,\n        text,\n        label;\n\n    bounds = getExternalLabelBounds(di, element);\n\n    text = getLabel(element);\n\n    if (text) {\n\n      // get corrected bounds from actual layouted text\n      bounds = this._textRenderer.getExternalLabelBounds(bounds, text);\n    }\n\n    label = this._elementFactory.createLabel(elementData(semantic, di, {\n      id: semantic.id + '_label',\n      labelTarget: element,\n      type: 'label',\n      hidden: element.hidden || !getLabel(element),\n      x: Math.round(bounds.x),\n      y: Math.round(bounds.y),\n      width: Math.round(bounds.width),\n      height: Math.round(bounds.height)\n    }));\n\n    return this._canvas.addShape(label, element.parent);\n  };\n\n  /**\n   * Get the source or target of the given connection.\n   *\n   * @param {ModdleElement} semantic\n   * @param {'source' | 'target'} side\n   *\n   * @return {Element}\n   */\n  BpmnImporter.prototype._getConnectedElement = function(semantic, side) {\n\n    var element,\n        refSemantic,\n        type = semantic.$type,\n        translate = this._translate;\n\n    refSemantic = semantic[side + 'Ref'];\n\n    // handle mysterious isMany DataAssociation#sourceRef\n    if (side === 'source' && type === 'bpmn:DataInputAssociation') {\n      refSemantic = refSemantic && refSemantic[0];\n    }\n\n    // fix source / target for DataInputAssociation / DataOutputAssociation\n    if (side === 'source' && type === 'bpmn:DataOutputAssociation' ||\n        side === 'target' && type === 'bpmn:DataInputAssociation') {\n\n      refSemantic = semantic.$parent;\n    }\n\n    element = refSemantic && this._getElement(refSemantic);\n\n    if (element) {\n      return element;\n    }\n\n    if (refSemantic) {\n      throw notYetDrawn(translate, semantic, refSemantic, side + 'Ref');\n    } else {\n      throw new Error(translate('{semantic}#{side} Ref not specified', {\n        semantic: elementToString(semantic),\n        side: side\n      }));\n    }\n  };\n\n  BpmnImporter.prototype._getSource = function(semantic) {\n    return this._getConnectedElement(semantic, 'source');\n  };\n\n  BpmnImporter.prototype._getTarget = function(semantic) {\n    return this._getConnectedElement(semantic, 'target');\n  };\n\n\n  BpmnImporter.prototype._getElement = function(semantic) {\n    return this._elementRegistry.get(semantic.id);\n  };\n\n\n  // helpers ////////////////////\n\n  function isPointInsideBBox(bbox, point) {\n    var x = point.x,\n        y = point.y;\n\n    return x >= bbox.x &&\n      x <= bbox.x + bbox.width &&\n      y >= bbox.y &&\n      y <= bbox.y + bbox.height;\n  }\n\n  function isFrameElement$1(semantic) {\n    return is$1(semantic, 'bpmn:Group');\n  }\n\n  var ImportModule = {\n    __depends__: [\n      TranslateModule\n    ],\n    bpmnImporter: [ 'type', BpmnImporter ]\n  };\n\n  var CoreModule$1 = {\n    __depends__: [\n      DrawModule$1,\n      ImportModule\n    ]\n  };\n\n  /**\n   * @typedef {import('../util/Types').Point} Point\n   */\n\n  /**\n   * @param {import('../core/EventBus').Event} event\n   *\n   * @return {Event}\n   */\n  function getOriginal(event) {\n    return event.originalEvent || event.srcEvent;\n  }\n\n  function isMac() {\n    return (/mac/i).test(navigator.platform);\n  }\n\n  /**\n   * @param {MouseEvent} event\n   * @param {string} button\n   *\n   * @return {boolean}\n   */\n  function isButton(event, button) {\n    return (getOriginal(event) || event).button === button;\n  }\n\n  /**\n   * @param {MouseEvent} event\n   *\n   * @return {boolean}\n   */\n  function isPrimaryButton(event) {\n\n    // button === 0 -> left áka primary mouse button\n    return isButton(event, 0);\n  }\n\n  /**\n   * @param {MouseEvent} event\n   *\n   * @return {boolean}\n   */\n  function isAuxiliaryButton(event) {\n\n    // button === 1 -> auxiliary áka wheel button\n    return isButton(event, 1);\n  }\n\n  /**\n   * @param {MouseEvent} event\n   *\n   * @return {boolean}\n   */\n  function hasPrimaryModifier(event) {\n    var originalEvent = getOriginal(event) || event;\n\n    if (!isPrimaryButton(event)) {\n      return false;\n    }\n\n    // Use cmd as primary modifier key for mac OS\n    if (isMac()) {\n      return originalEvent.metaKey;\n    } else {\n      return originalEvent.ctrlKey;\n    }\n  }\n\n  /**\n   * @param {MouseEvent} event\n   *\n   * @return {boolean}\n   */\n  function hasSecondaryModifier(event) {\n    var originalEvent = getOriginal(event) || event;\n\n    return isPrimaryButton(event) && originalEvent.shiftKey;\n  }\n\n  /**\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../../draw/Styles').default} Styles\n   *\n   * @typedef {import('../../util/Types').Point} Point\n   */\n\n  function allowAll(event) { return true; }\n\n  function allowPrimaryAndAuxiliary(event) {\n    return isPrimaryButton(event) || isAuxiliaryButton(event);\n  }\n\n  var LOW_PRIORITY$3 = 500;\n\n\n  /**\n   * A plugin that provides interaction events for diagram elements.\n   *\n   * It emits the following events:\n   *\n   *   * element.click\n   *   * element.contextmenu\n   *   * element.dblclick\n   *   * element.hover\n   *   * element.mousedown\n   *   * element.mousemove\n   *   * element.mouseup\n   *   * element.out\n   *\n   * Each event is a tuple { element, gfx, originalEvent }.\n   *\n   * Canceling the event via Event#preventDefault()\n   * prevents the original DOM operation.\n   *\n   * @param {EventBus} eventBus\n   * @param {ElementRegistry} elementRegistry\n   * @param {Styles} styles\n   */\n  function InteractionEvents(eventBus, elementRegistry, styles) {\n\n    var self = this;\n\n    /**\n     * Fire an interaction event.\n     *\n     * @param {string} type local event name, e.g. element.click.\n     * @param {MouseEvent|TouchEvent} event native event\n     * @param {Element} [element] the diagram element to emit the event on;\n     *                                   defaults to the event target\n     */\n    function fire(type, event, element) {\n\n      if (isIgnored(type, event)) {\n        return;\n      }\n\n      var target, gfx, returnValue;\n\n      if (!element) {\n        target = event.delegateTarget || event.target;\n\n        if (target) {\n          gfx = target;\n          element = elementRegistry.get(gfx);\n        }\n      } else {\n        gfx = elementRegistry.getGraphics(element);\n      }\n\n      if (!gfx || !element) {\n        return;\n      }\n\n      returnValue = eventBus.fire(type, {\n        element: element,\n        gfx: gfx,\n        originalEvent: event\n      });\n\n      if (returnValue === false) {\n        event.stopPropagation();\n        event.preventDefault();\n      }\n    }\n\n    // TODO(nikku): document this\n    var handlers = {};\n\n    function mouseHandler(localEventName) {\n      return handlers[localEventName];\n    }\n\n    function isIgnored(localEventName, event) {\n\n      var filter = ignoredFilters[localEventName] || isPrimaryButton;\n\n      // only react on left mouse button interactions\n      // except for interaction events that are enabled\n      // for secundary mouse button\n      return !filter(event);\n    }\n\n    var bindings = {\n      click: 'element.click',\n      contextmenu: 'element.contextmenu',\n      dblclick: 'element.dblclick',\n      mousedown: 'element.mousedown',\n      mousemove: 'element.mousemove',\n      mouseover: 'element.hover',\n      mouseout: 'element.out',\n      mouseup: 'element.mouseup',\n    };\n\n    var ignoredFilters = {\n      'element.contextmenu': allowAll,\n      'element.mousedown': allowPrimaryAndAuxiliary,\n      'element.mouseup': allowPrimaryAndAuxiliary,\n      'element.click': allowPrimaryAndAuxiliary,\n      'element.dblclick': allowPrimaryAndAuxiliary\n    };\n\n\n    // manual event trigger //////////\n\n    /**\n     * Trigger an interaction event (based on a native dom event)\n     * on the target shape or connection.\n     *\n     * @param {string} eventName the name of the triggered DOM event\n     * @param {MouseEvent|TouchEvent} event\n     * @param {Element} targetElement\n     */\n    function triggerMouseEvent(eventName, event, targetElement) {\n\n      // i.e. element.mousedown...\n      var localEventName = bindings[eventName];\n\n      if (!localEventName) {\n        throw new Error('unmapped DOM event name <' + eventName + '>');\n      }\n\n      return fire(localEventName, event, targetElement);\n    }\n\n\n    var ELEMENT_SELECTOR = 'svg, .djs-element';\n\n    // event handling ///////\n\n    function registerEvent(node, event, localEvent, ignoredFilter) {\n\n      var handler = handlers[localEvent] = function(event) {\n        fire(localEvent, event);\n      };\n\n      if (ignoredFilter) {\n        ignoredFilters[localEvent] = ignoredFilter;\n      }\n\n      handler.$delegate = delegate.bind(node, ELEMENT_SELECTOR, event, handler);\n    }\n\n    function unregisterEvent(node, event, localEvent) {\n\n      var handler = mouseHandler(localEvent);\n\n      if (!handler) {\n        return;\n      }\n\n      delegate.unbind(node, event, handler.$delegate);\n    }\n\n    function registerEvents(svg) {\n      forEach$1(bindings, function(val, key) {\n        registerEvent(svg, key, val);\n      });\n    }\n\n    function unregisterEvents(svg) {\n      forEach$1(bindings, function(val, key) {\n        unregisterEvent(svg, key, val);\n      });\n    }\n\n    eventBus.on('canvas.destroy', function(event) {\n      unregisterEvents(event.svg);\n    });\n\n    eventBus.on('canvas.init', function(event) {\n      registerEvents(event.svg);\n    });\n\n\n    // hit box updating ////////////////\n\n    eventBus.on([ 'shape.added', 'connection.added' ], function(event) {\n      var element = event.element,\n          gfx = event.gfx;\n\n      eventBus.fire('interactionEvents.createHit', { element: element, gfx: gfx });\n    });\n\n    // Update djs-hit on change.\n    // A low priortity is necessary, because djs-hit of labels has to be updated\n    // after the label bounds have been updated in the renderer.\n    eventBus.on([\n      'shape.changed',\n      'connection.changed'\n    ], LOW_PRIORITY$3, function(event) {\n\n      var element = event.element,\n          gfx = event.gfx;\n\n      eventBus.fire('interactionEvents.updateHit', { element: element, gfx: gfx });\n    });\n\n    eventBus.on('interactionEvents.createHit', LOW_PRIORITY$3, function(event) {\n      var element = event.element,\n          gfx = event.gfx;\n\n      self.createDefaultHit(element, gfx);\n    });\n\n    eventBus.on('interactionEvents.updateHit', function(event) {\n      var element = event.element,\n          gfx = event.gfx;\n\n      self.updateDefaultHit(element, gfx);\n    });\n\n\n    // hit styles ////////////\n\n    var STROKE_HIT_STYLE = createHitStyle('djs-hit djs-hit-stroke');\n\n    var CLICK_STROKE_HIT_STYLE = createHitStyle('djs-hit djs-hit-click-stroke');\n\n    var ALL_HIT_STYLE = createHitStyle('djs-hit djs-hit-all');\n\n    var NO_MOVE_HIT_STYLE = createHitStyle('djs-hit djs-hit-no-move');\n\n    var HIT_TYPES = {\n      'all': ALL_HIT_STYLE,\n      'click-stroke': CLICK_STROKE_HIT_STYLE,\n      'stroke': STROKE_HIT_STYLE,\n      'no-move': NO_MOVE_HIT_STYLE\n    };\n\n    function createHitStyle(classNames, attrs) {\n\n      attrs = assign$1({\n        stroke: 'white',\n        strokeWidth: 15\n      }, attrs || {});\n\n      return styles.cls(classNames, [ 'no-fill', 'no-border' ], attrs);\n    }\n\n\n    // style helpers ///////////////\n\n    function applyStyle(hit, type) {\n\n      var attrs = HIT_TYPES[type];\n\n      if (!attrs) {\n        throw new Error('invalid hit type <' + type + '>');\n      }\n\n      attr$1(hit, attrs);\n\n      return hit;\n    }\n\n    function appendHit(gfx, hit) {\n      append(gfx, hit);\n    }\n\n\n    // API\n\n    /**\n     * Remove hints on the given graphics.\n     *\n     * @param {SVGElement} gfx\n     */\n    this.removeHits = function(gfx) {\n      var hits = all('.djs-hit', gfx);\n\n      forEach$1(hits, remove$2);\n    };\n\n    /**\n     * Create default hit for the given element.\n     *\n     * @param {Element} element\n     * @param {SVGElement} gfx\n     *\n     * @return {SVGElement} created hit\n     */\n    this.createDefaultHit = function(element, gfx) {\n      var waypoints = element.waypoints,\n          isFrame = element.isFrame,\n          boxType;\n\n      if (waypoints) {\n        return this.createWaypointsHit(gfx, waypoints);\n      } else {\n\n        boxType = isFrame ? 'stroke' : 'all';\n\n        return this.createBoxHit(gfx, boxType, {\n          width: element.width,\n          height: element.height\n        });\n      }\n    };\n\n    /**\n     * Create hits for the given waypoints.\n     *\n     * @param {SVGElement} gfx\n     * @param {Point[]} waypoints\n     *\n     * @return {SVGElement}\n     */\n    this.createWaypointsHit = function(gfx, waypoints) {\n\n      var hit = createLine(waypoints);\n\n      applyStyle(hit, 'stroke');\n\n      appendHit(gfx, hit);\n\n      return hit;\n    };\n\n    /**\n     * Create hits for a box.\n     *\n     * @param {SVGElement} gfx\n     * @param {string} type\n     * @param {Object} attrs\n     *\n     * @return {SVGElement}\n     */\n    this.createBoxHit = function(gfx, type, attrs) {\n\n      attrs = assign$1({\n        x: 0,\n        y: 0\n      }, attrs);\n\n      var hit = create$1('rect');\n\n      applyStyle(hit, type);\n\n      attr$1(hit, attrs);\n\n      appendHit(gfx, hit);\n\n      return hit;\n    };\n\n    /**\n     * Update default hit of the element.\n     *\n     * @param {Element} element\n     * @param {SVGElement} gfx\n     *\n     * @return {SVGElement} updated hit\n     */\n    this.updateDefaultHit = function(element, gfx) {\n\n      var hit = query('.djs-hit', gfx);\n\n      if (!hit) {\n        return;\n      }\n\n      if (element.waypoints) {\n        updateLine(hit, element.waypoints);\n      } else {\n        attr$1(hit, {\n          width: element.width,\n          height: element.height\n        });\n      }\n\n      return hit;\n    };\n\n    this.fire = fire;\n\n    this.triggerMouseEvent = triggerMouseEvent;\n\n    this.mouseHandler = mouseHandler;\n\n    this.registerEvent = registerEvent;\n    this.unregisterEvent = unregisterEvent;\n  }\n\n\n  InteractionEvents.$inject = [\n    'eventBus',\n    'elementRegistry',\n    'styles'\n  ];\n\n\n  /**\n   * An event indicating that the mouse hovered over an element\n   *\n   * @event element.hover\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * An event indicating that the mouse has left an element\n   *\n   * @event element.out\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * An event indicating that the mouse has clicked an element\n   *\n   * @event element.click\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * An event indicating that the mouse has double clicked an element\n   *\n   * @event element.dblclick\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * An event indicating that the mouse has gone down on an element.\n   *\n   * @event element.mousedown\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * An event indicating that the mouse has gone up on an element.\n   *\n   * @event element.mouseup\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * An event indicating that the context menu action is triggered\n   * via mouse or touch controls.\n   *\n   * @event element.contextmenu\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var InteractionEventsModule = {\n    __init__: [ 'interactionEvents' ],\n    interactionEvents: [ 'type', InteractionEvents ]\n  };\n\n  /**\n   * Returns the surrounding bbox for all elements in\n   * the array or the element primitive.\n   *\n   * @param {Element|Element[]} elements\n   * @param {boolean} [stopRecursion=false]\n   *\n   * @return {Rect}\n   */\n  function getBBox(elements, stopRecursion) {\n\n    stopRecursion = !!stopRecursion;\n    if (!isArray$2(elements)) {\n      elements = [ elements ];\n    }\n\n    var minX,\n        minY,\n        maxX,\n        maxY;\n\n    forEach$1(elements, function(element) {\n\n      // If element is a connection the bbox must be computed first\n      var bbox = element;\n      if (element.waypoints && !stopRecursion) {\n        bbox = getBBox(element.waypoints, true);\n      }\n\n      var x = bbox.x,\n          y = bbox.y,\n          height = bbox.height || 0,\n          width = bbox.width || 0;\n\n      if (x < minX || minX === undefined) {\n        minX = x;\n      }\n      if (y < minY || minY === undefined) {\n        minY = y;\n      }\n\n      if ((x + width) > maxX || maxX === undefined) {\n        maxX = x + width;\n      }\n      if ((y + height) > maxY || maxY === undefined) {\n        maxY = y + height;\n      }\n    });\n\n    return {\n      x: minX,\n      y: minY,\n      height: maxY - minY,\n      width: maxX - minX\n    };\n  }\n\n  /**\n   * Get the element's type\n   *\n   * @param {Element} element\n   *\n   * @return {'connection' | 'shape' | 'root'}\n   */\n  function getType(element) {\n\n    if ('waypoints' in element) {\n      return 'connection';\n    }\n\n    if ('x' in element) {\n      return 'shape';\n    }\n\n    return 'root';\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isFrameElement(element) {\n    return !!(element && element.isFrame);\n  }\n\n  var LOW_PRIORITY$2 = 500;\n\n  /**\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../../draw/Styles').default} Styles\n   */\n\n  /**\n   * @class\n   *\n   * A plugin that adds an outline to shapes and connections that may be activated and styled\n   * via CSS classes.\n   *\n   * @param {EventBus} eventBus\n   * @param {Styles} styles\n   */\n  function Outline(eventBus, styles) {\n\n    this.offset = 6;\n\n    var OUTLINE_STYLE = styles.cls('djs-outline', [ 'no-fill' ]);\n\n    var self = this;\n\n    function createOutline(gfx, bounds) {\n      var outline = create$1('rect');\n\n      attr$1(outline, assign$1({\n        x: 10,\n        y: 10,\n        rx: 4,\n        width: 100,\n        height: 100\n      }, OUTLINE_STYLE));\n\n      append(gfx, outline);\n\n      return outline;\n    }\n\n    // A low priortity is necessary, because outlines of labels have to be updated\n    // after the label bounds have been updated in the renderer.\n    eventBus.on([ 'shape.added', 'shape.changed' ], LOW_PRIORITY$2, function(event) {\n      var element = event.element,\n          gfx = event.gfx;\n\n      var outline = query('.djs-outline', gfx);\n\n      if (!outline) {\n        outline = createOutline(gfx);\n      }\n\n      self.updateShapeOutline(outline, element);\n    });\n\n    eventBus.on([ 'connection.added', 'connection.changed' ], function(event) {\n      var element = event.element,\n          gfx = event.gfx;\n\n      var outline = query('.djs-outline', gfx);\n\n      if (!outline) {\n        outline = createOutline(gfx);\n      }\n\n      self.updateConnectionOutline(outline, element);\n    });\n  }\n\n\n  /**\n   * Updates the outline of a shape respecting the dimension of the\n   * element and an outline offset.\n   *\n   * @param {SVGElement} outline\n   * @param {Element} element\n   */\n  Outline.prototype.updateShapeOutline = function(outline, element) {\n\n    attr$1(outline, {\n      x: -this.offset,\n      y: -this.offset,\n      width: element.width + this.offset * 2,\n      height: element.height + this.offset * 2\n    });\n\n  };\n\n\n  /**\n   * Updates the outline of a connection respecting the bounding box of\n   * the connection and an outline offset.\n   *\n   * @param {SVGElement} outline\n   * @param {Element} connection\n   */\n  Outline.prototype.updateConnectionOutline = function(outline, connection) {\n\n    var bbox = getBBox(connection);\n\n    attr$1(outline, {\n      x: bbox.x - this.offset,\n      y: bbox.y - this.offset,\n      width: bbox.width + this.offset * 2,\n      height: bbox.height + this.offset * 2\n    });\n\n  };\n\n\n  Outline.$inject = [ 'eventBus', 'styles', 'elementRegistry' ];\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var OutlineModule = {\n    __init__: [ 'outline' ],\n    outline: [ 'type', Outline ]\n  };\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   */\n\n  /**\n   * A service that offers the current selection in a diagram.\n   * Offers the api to control the selection, too.\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   */\n  function Selection(eventBus, canvas) {\n\n    this._eventBus = eventBus;\n    this._canvas = canvas;\n\n    /**\n     * @type {Object[]}\n     */\n    this._selectedElements = [];\n\n    var self = this;\n\n    eventBus.on([ 'shape.remove', 'connection.remove' ], function(e) {\n      var element = e.element;\n      self.deselect(element);\n    });\n\n    eventBus.on([ 'diagram.clear', 'root.set' ], function(e) {\n      self.select(null);\n    });\n  }\n\n  Selection.$inject = [ 'eventBus', 'canvas' ];\n\n  /**\n   * Deselect an element.\n   *\n   * @param {Object} element The element to deselect.\n   */\n  Selection.prototype.deselect = function(element) {\n    var selectedElements = this._selectedElements;\n\n    var idx = selectedElements.indexOf(element);\n\n    if (idx !== -1) {\n      var oldSelection = selectedElements.slice();\n\n      selectedElements.splice(idx, 1);\n\n      this._eventBus.fire('selection.changed', { oldSelection: oldSelection, newSelection: selectedElements });\n    }\n  };\n\n  /**\n   * Get the selected elements.\n   *\n   * @return {Object[]} The selected elements.\n   */\n  Selection.prototype.get = function() {\n    return this._selectedElements;\n  };\n\n  /**\n   * Check whether an element is selected.\n   *\n   * @param {Object} element The element.\n   *\n   * @return {boolean} Whether the element is selected.\n   */\n  Selection.prototype.isSelected = function(element) {\n    return this._selectedElements.indexOf(element) !== -1;\n  };\n\n\n  /**\n   * Select one or many elements.\n   *\n   * @param {Object|Object[]} elements The element(s) to select.\n   * @param {boolean} [add] Whether to add the element(s) to the selected elements.\n   * Defaults to `false`.\n   */\n  Selection.prototype.select = function(elements, add) {\n    var selectedElements = this._selectedElements,\n        oldSelection = selectedElements.slice();\n\n    if (!isArray$2(elements)) {\n      elements = elements ? [ elements ] : [];\n    }\n\n    var canvas = this._canvas;\n\n    var rootElement = canvas.getRootElement();\n\n    elements = elements.filter(function(element) {\n      var elementRoot = canvas.findRoot(element);\n\n      return rootElement === elementRoot;\n    });\n\n    // selection may be cleared by passing an empty array or null\n    // to the method\n    if (add) {\n      forEach$1(elements, function(element) {\n        if (selectedElements.indexOf(element) !== -1) {\n\n          // already selected\n          return;\n        } else {\n          selectedElements.push(element);\n        }\n      });\n    } else {\n      this._selectedElements = selectedElements = elements.slice();\n    }\n\n    this._eventBus.fire('selection.changed', { oldSelection: oldSelection, newSelection: selectedElements });\n  };\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('./Selection').default} Selection\n   */\n\n  var MARKER_HOVER = 'hover',\n      MARKER_SELECTED = 'selected';\n\n  var SELECTION_OUTLINE_PADDING = 6;\n\n\n  /**\n   * A plugin that adds a visible selection UI to shapes and connections\n   * by appending the <code>hover</code> and <code>selected</code> classes to them.\n   *\n   * @class\n   *\n   * Makes elements selectable, too.\n   *\n   * @param {Canvas} canvas\n   * @param {EventBus} eventBus\n   * @param {Selection} selection\n   */\n  function SelectionVisuals(canvas, eventBus, selection) {\n    this._canvas = canvas;\n\n    var self = this;\n\n    this._multiSelectionBox = null;\n\n    function addMarker(e, cls) {\n      canvas.addMarker(e, cls);\n    }\n\n    function removeMarker(e, cls) {\n      canvas.removeMarker(e, cls);\n    }\n\n    eventBus.on('element.hover', function(event) {\n      addMarker(event.element, MARKER_HOVER);\n    });\n\n    eventBus.on('element.out', function(event) {\n      removeMarker(event.element, MARKER_HOVER);\n    });\n\n    eventBus.on('selection.changed', function(event) {\n\n      function deselect(s) {\n        removeMarker(s, MARKER_SELECTED);\n      }\n\n      function select(s) {\n        addMarker(s, MARKER_SELECTED);\n      }\n\n      var oldSelection = event.oldSelection,\n          newSelection = event.newSelection;\n\n      forEach$1(oldSelection, function(e) {\n        if (newSelection.indexOf(e) === -1) {\n          deselect(e);\n        }\n      });\n\n      forEach$1(newSelection, function(e) {\n        if (oldSelection.indexOf(e) === -1) {\n          select(e);\n        }\n      });\n\n      self._updateSelectionOutline(newSelection);\n    });\n\n\n    eventBus.on('element.changed', function(event) {\n      if (selection.isSelected(event.element)) {\n        self._updateSelectionOutline(selection.get());\n      }\n    });\n  }\n\n  SelectionVisuals.$inject = [\n    'canvas',\n    'eventBus',\n    'selection'\n  ];\n\n  SelectionVisuals.prototype._updateSelectionOutline = function(selection) {\n    var layer = this._canvas.getLayer('selectionOutline');\n\n    clear$1(layer);\n\n    var enabled = selection.length > 1;\n\n    var container = this._canvas.getContainer();\n\n    classes$1(container)[enabled ? 'add' : 'remove']('djs-multi-select');\n\n    if (!enabled) {\n      return;\n    }\n\n    var bBox = addSelectionOutlinePadding(getBBox(selection));\n\n    var rect = create$1('rect');\n\n    attr$1(rect, assign$1({\n      rx: 3\n    }, bBox));\n\n    classes$1(rect).add('djs-selection-outline');\n\n    append(layer, rect);\n  };\n\n  // helpers //////////\n\n  function addSelectionOutlinePadding(bBox) {\n    return {\n      x: bBox.x - SELECTION_OUTLINE_PADDING,\n      y: bBox.y - SELECTION_OUTLINE_PADDING,\n      width: bBox.width + SELECTION_OUTLINE_PADDING * 2,\n      height: bBox.height + SELECTION_OUTLINE_PADDING * 2\n    };\n  }\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('./Selection').default} Selection\n   */\n\n  /**\n   * @param {EventBus} eventBus\n   * @param {Selection} selection\n   * @param {Canvas} canvas\n   * @param {ElementRegistry} elementRegistry\n   */\n  function SelectionBehavior(eventBus, selection, canvas, elementRegistry) {\n\n    // Select elements on create\n    eventBus.on('create.end', 500, function(event) {\n      var context = event.context,\n          canExecute = context.canExecute,\n          elements = context.elements,\n          hints = context.hints || {},\n          autoSelect = hints.autoSelect;\n\n      if (canExecute) {\n        if (autoSelect === false) {\n\n          // Select no elements\n          return;\n        }\n\n        if (isArray$2(autoSelect)) {\n          selection.select(autoSelect);\n        } else {\n\n          // Select all elements by default\n          selection.select(elements.filter(isShown));\n        }\n      }\n    });\n\n    // Select connection targets on connect\n    eventBus.on('connect.end', 500, function(event) {\n      var context = event.context,\n          connection = context.connection;\n\n      if (connection) {\n        selection.select(connection);\n      }\n    });\n\n    // Select shapes on move\n    eventBus.on('shape.move.end', 500, function(event) {\n      var previousSelection = event.previousSelection || [];\n\n      var shape = elementRegistry.get(event.context.shape.id);\n\n      // Always select main shape on move\n      var isSelected = find(previousSelection, function(selectedShape) {\n        return shape.id === selectedShape.id;\n      });\n\n      if (!isSelected) {\n        selection.select(shape);\n      }\n    });\n\n    // Select elements on click\n    eventBus.on('element.click', function(event) {\n\n      if (!isPrimaryButton(event)) {\n        return;\n      }\n\n      var element = event.element;\n\n      if (element === canvas.getRootElement()) {\n        element = null;\n      }\n\n      var isSelected = selection.isSelected(element),\n          isMultiSelect = selection.get().length > 1;\n\n      // Add to selection if CTRL or SHIFT pressed\n      var add = hasPrimaryModifier(event) || hasSecondaryModifier(event);\n\n      if (isSelected && isMultiSelect) {\n        if (add) {\n\n          // Deselect element\n          return selection.deselect(element);\n        } else {\n\n          // Select element only\n          return selection.select(element);\n        }\n      } else if (!isSelected) {\n\n        // Select element\n        selection.select(element, add);\n      } else {\n\n        // Deselect element\n        selection.deselect(element);\n      }\n    });\n  }\n\n  SelectionBehavior.$inject = [\n    'eventBus',\n    'selection',\n    'canvas',\n    'elementRegistry'\n  ];\n\n\n  function isShown(element) {\n    return !element.hidden;\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var SelectionModule = {\n    __init__: [ 'selectionVisuals', 'selectionBehavior' ],\n    __depends__: [\n      InteractionEventsModule,\n      OutlineModule\n    ],\n    selection: [ 'type', Selection ],\n    selectionVisuals: [ 'type', SelectionVisuals ],\n    selectionBehavior: [ 'type', SelectionBehavior ]\n  };\n\n  /**\n   * Util that provides unique IDs.\n   *\n   * @class\n   * @constructor\n   *\n   * The ids can be customized via a given prefix and contain a random value to avoid collisions.\n   *\n   * @param {string} [prefix] a prefix to prepend to generated ids (for better readability)\n   */\n  function IdGenerator(prefix) {\n\n    this._counter = 0;\n    this._prefix = (prefix ? prefix + '-' : '') + Math.floor(Math.random() * 1000000000) + '-';\n  }\n\n  /**\n   * Returns a next unique ID.\n   *\n   * @return {string} the id\n   */\n  IdGenerator.prototype.next = function() {\n    return this._prefix + (++this._counter);\n  };\n\n  // document wide unique overlay ids\n  var ids = new IdGenerator('ov');\n\n  var LOW_PRIORITY$1 = 500;\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../../core/EventBus').default} EventBus\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef { {\n   *   minZoom?: number,\n   *   maxZoom?: number\n   * } } OverlaysConfigShow\n   *\n   * @typedef { {\n   *   min?: number,\n   *   max?: number\n   * } } OverlaysConfigScale\n   *\n   * @typedef { {\n  *   id: string,\n  *   type: string | null,\n  *   element: Element | string\n  * } & OverlayAttrs } Overlay\n  *\n   * @typedef { {\n   *   html: HTMLElement | string,\n   *   position: {\n   *     top?: number,\n   *     right?: number,\n   *     bottom?: number,\n   *     left?: number\n   *   }\n   * } & OverlaysConfigDefault } OverlayAttrs\n   *\n   * @typedef { {\n   *   html: HTMLElement,\n   *   element: Element,\n   *   overlays: Overlay[]\n   * } } OverlayContainer\n   *\n   * @typedef {{\n   *   defaults?: OverlaysConfigDefault\n   * }} OverlaysConfig\n   *\n   * @typedef { {\n   *  show?: OverlaysConfigShow,\n   *  scale?: OverlaysConfigScale | boolean\n   * } } OverlaysConfigDefault\n   *\n   * @typedef { {\n   *   id?: string;\n   *   element?: Element | string;\n   *   type?: string;\n   * } | string } OverlaysFilter\n   */\n\n  /**\n   * A service that allows users to attach overlays to diagram elements.\n   *\n   * The overlay service will take care of overlay positioning during updates.\n   *\n   * @example\n   *\n   * ```javascript\n   * // add a pink badge on the top left of the shape\n   *\n   * overlays.add(someShape, {\n   *   position: {\n   *     top: -5,\n   *     left: -5\n   *   },\n   *   html: '<div style=\"width: 10px; background: fuchsia; color: white;\">0</div>'\n   * });\n   *\n   * // or add via shape id\n   *\n   * overlays.add('some-element-id', {\n   *   position: {\n   *     top: -5,\n   *     left: -5\n   *   }\n   *   html: '<div style=\"width: 10px; background: fuchsia; color: white;\">0</div>'\n   * });\n   *\n   * // or add with optional type\n   *\n   * overlays.add(someShape, 'badge', {\n   *   position: {\n   *     top: -5,\n   *     left: -5\n   *   }\n   *   html: '<div style=\"width: 10px; background: fuchsia; color: white;\">0</div>'\n   * });\n   * ```\n   *\n   * ```javascript\n   * // remove an overlay\n   *\n   * var id = overlays.add(...);\n   * overlays.remove(id);\n   *\n   *\n   * You may configure overlay defaults during tool by providing a `config` module\n   * with `overlays.defaults` as an entry:\n   *\n   * {\n   *   overlays: {\n   *     defaults: {\n   *       show: {\n   *         minZoom: 0.7,\n   *         maxZoom: 5.0\n   *       },\n   *       scale: {\n   *         min: 1\n   *       }\n   *     }\n   * }\n   * ```\n   *\n   * @param {OverlaysConfig} config\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {ElementRegistry} elementRegistry\n   */\n  function Overlays(config, eventBus, canvas, elementRegistry) {\n    this._eventBus = eventBus;\n    this._canvas = canvas;\n    this._elementRegistry = elementRegistry;\n\n    this._ids = ids;\n\n    /**\n     * @type {OverlaysConfigDefault}\n     */\n    this._overlayDefaults = assign$1({\n\n      // no show constraints\n      show: null,\n\n      // always scale\n      scale: true\n    }, config && config.defaults);\n\n    /**\n     * @type {Map<string, Overlay>}\n     */\n    this._overlays = {};\n\n    /**\n     * @type {OverlayContainer[]}\n     */\n    this._overlayContainers = [];\n\n    /**\n     * @type {HTMLElement}\n     */\n    this._overlayRoot = createRoot(canvas.getContainer());\n\n    this._init();\n  }\n\n\n  Overlays.$inject = [\n    'config.overlays',\n    'eventBus',\n    'canvas',\n    'elementRegistry'\n  ];\n\n\n  /**\n   * Returns the overlay with the specified ID or a list of overlays\n   * for an element with a given type.\n   *\n   * @example\n   *\n   * ```javascript\n   * // return the single overlay with the given ID\n   * overlays.get('some-id');\n   *\n   * // return all overlays for the shape\n   * overlays.get({ element: someShape });\n   *\n   * // return all overlays on shape with type 'badge'\n   * overlays.get({ element: someShape, type: 'badge' });\n   *\n   * // shape can also be specified as ID\n   * overlays.get({ element: 'element-id', type: 'badge' });\n   * ```\n   *\n   * @param {OverlaysFilter} search The filter to be used to find the overlay(s).\n   *\n   * @return {Overlay|Overlay[]} The overlay(s).\n   */\n  Overlays.prototype.get = function(search) {\n\n    if (isString(search)) {\n      search = { id: search };\n    }\n\n    if (isString(search.element)) {\n      search.element = this._elementRegistry.get(search.element);\n    }\n\n    if (search.element) {\n      var container = this._getOverlayContainer(search.element, true);\n\n      // return a list of overlays when searching by element (+type)\n      if (container) {\n        return search.type ? filter(container.overlays, matchPattern({ type: search.type })) : container.overlays.slice();\n      } else {\n        return [];\n      }\n    } else\n    if (search.type) {\n      return filter(this._overlays, matchPattern({ type: search.type }));\n    } else {\n\n      // return single element when searching by id\n      return search.id ? this._overlays[search.id] : null;\n    }\n  };\n\n  /**\n   * Adds an HTML overlay to an element.\n   *\n   * @param {Element|string} element The element to add the overlay to.\n   * @param {string} [type] An optional type that can be used to filter.\n   * @param {OverlayAttrs} overlay The overlay.\n   *\n   * @return {string} The overlay's ID that can be used to get or remove it.\n   */\n  Overlays.prototype.add = function(element, type, overlay) {\n\n    if (isObject(type)) {\n      overlay = type;\n      type = null;\n    }\n\n    if (!element.id) {\n      element = this._elementRegistry.get(element);\n    }\n\n    if (!overlay.position) {\n      throw new Error('must specifiy overlay position');\n    }\n\n    if (!overlay.html) {\n      throw new Error('must specifiy overlay html');\n    }\n\n    if (!element) {\n      throw new Error('invalid element specified');\n    }\n\n    var id = this._ids.next();\n\n    overlay = assign$1({}, this._overlayDefaults, overlay, {\n      id: id,\n      type: type,\n      element: element,\n      html: overlay.html\n    });\n\n    this._addOverlay(overlay);\n\n    return id;\n  };\n\n\n  /**\n   * Remove an overlay with the given ID or all overlays matching the given filter.\n   *\n   * @see Overlays#get for filter options.\n   *\n   * @param {OverlaysFilter} filter The filter to be used to find the overlay.\n   */\n  Overlays.prototype.remove = function(filter) {\n\n    var overlays = this.get(filter) || [];\n\n    if (!isArray$2(overlays)) {\n      overlays = [ overlays ];\n    }\n\n    var self = this;\n\n    forEach$1(overlays, function(overlay) {\n\n      var container = self._getOverlayContainer(overlay.element, true);\n\n      if (overlay) {\n        remove$1(overlay.html);\n        remove$1(overlay.htmlContainer);\n\n        delete overlay.htmlContainer;\n        delete overlay.element;\n\n        delete self._overlays[overlay.id];\n      }\n\n      if (container) {\n        var idx = container.overlays.indexOf(overlay);\n        if (idx !== -1) {\n          container.overlays.splice(idx, 1);\n        }\n      }\n    });\n\n  };\n\n  /**\n   * Checks whether overlays are shown.\n   *\n   * @return {boolean} Whether overlays are shown.\n   */\n  Overlays.prototype.isShown = function() {\n    return this._overlayRoot.style.display !== 'none';\n  };\n\n  /**\n   * Show all overlays.\n   */\n  Overlays.prototype.show = function() {\n    setVisible(this._overlayRoot);\n  };\n\n  /**\n   * Hide all overlays.\n   */\n  Overlays.prototype.hide = function() {\n    setVisible(this._overlayRoot, false);\n  };\n\n  /**\n   * Remove all overlays and their container.\n   */\n  Overlays.prototype.clear = function() {\n    this._overlays = {};\n\n    this._overlayContainers = [];\n\n    clear(this._overlayRoot);\n  };\n\n  Overlays.prototype._updateOverlayContainer = function(container) {\n    var element = container.element,\n        html = container.html;\n\n    // update container left,top according to the elements x,y coordinates\n    // this ensures we can attach child elements relative to this container\n\n    var x = element.x,\n        y = element.y;\n\n    if (element.waypoints) {\n      var bbox = getBBox(element);\n      x = bbox.x;\n      y = bbox.y;\n    }\n\n    setPosition(html, x, y);\n\n    attr(container.html, 'data-container-id', element.id);\n  };\n\n\n  Overlays.prototype._updateOverlay = function(overlay) {\n\n    var position = overlay.position,\n        htmlContainer = overlay.htmlContainer,\n        element = overlay.element;\n\n    // update overlay html relative to shape because\n    // it is already positioned on the element\n\n    // update relative\n    var left = position.left,\n        top = position.top;\n\n    if (position.right !== undefined) {\n\n      var width;\n\n      if (element.waypoints) {\n        width = getBBox(element).width;\n      } else {\n        width = element.width;\n      }\n\n      left = position.right * -1 + width;\n    }\n\n    if (position.bottom !== undefined) {\n\n      var height;\n\n      if (element.waypoints) {\n        height = getBBox(element).height;\n      } else {\n        height = element.height;\n      }\n\n      top = position.bottom * -1 + height;\n    }\n\n    setPosition(htmlContainer, left || 0, top || 0);\n    this._updateOverlayVisibilty(overlay, this._canvas.viewbox());\n  };\n\n\n  Overlays.prototype._createOverlayContainer = function(element) {\n    var html = domify$1('<div class=\"djs-overlays\" />');\n    assign(html, { position: 'absolute' });\n\n    this._overlayRoot.appendChild(html);\n\n    var container = {\n      html: html,\n      element: element,\n      overlays: []\n    };\n\n    this._updateOverlayContainer(container);\n\n    this._overlayContainers.push(container);\n\n    return container;\n  };\n\n\n  Overlays.prototype._updateRoot = function(viewbox) {\n    var scale = viewbox.scale || 1;\n\n    var matrix = 'matrix(' +\n    [\n      scale,\n      0,\n      0,\n      scale,\n      -1 * viewbox.x * scale,\n      -1 * viewbox.y * scale\n    ].join(',') +\n    ')';\n\n    setTransform(this._overlayRoot, matrix);\n  };\n\n\n  Overlays.prototype._getOverlayContainer = function(element, raw) {\n    var container = find(this._overlayContainers, function(c) {\n      return c.element === element;\n    });\n\n\n    if (!container && !raw) {\n      return this._createOverlayContainer(element);\n    }\n\n    return container;\n  };\n\n\n  Overlays.prototype._addOverlay = function(overlay) {\n\n    var id = overlay.id,\n        element = overlay.element,\n        html = overlay.html,\n        htmlContainer,\n        overlayContainer;\n\n    // unwrap jquery (for those who need it)\n    if (html.get && html.constructor.prototype.jquery) {\n      html = html.get(0);\n    }\n\n    // create proper html elements from\n    // overlay HTML strings\n    if (isString(html)) {\n      html = domify$1(html);\n    }\n\n    overlayContainer = this._getOverlayContainer(element);\n\n    htmlContainer = domify$1('<div class=\"djs-overlay\" data-overlay-id=\"' + id + '\">');\n    assign(htmlContainer, { position: 'absolute' });\n\n    htmlContainer.appendChild(html);\n\n    if (overlay.type) {\n      classes(htmlContainer).add('djs-overlay-' + overlay.type);\n    }\n\n    var elementRoot = this._canvas.findRoot(element);\n    var activeRoot = this._canvas.getRootElement();\n\n    setVisible(htmlContainer, elementRoot === activeRoot);\n\n    overlay.htmlContainer = htmlContainer;\n\n    overlayContainer.overlays.push(overlay);\n    overlayContainer.html.appendChild(htmlContainer);\n\n    this._overlays[id] = overlay;\n\n    this._updateOverlay(overlay);\n    this._updateOverlayVisibilty(overlay, this._canvas.viewbox());\n  };\n\n\n  Overlays.prototype._updateOverlayVisibilty = function(overlay, viewbox) {\n    var show = overlay.show,\n        rootElement = this._canvas.findRoot(overlay.element),\n        minZoom = show && show.minZoom,\n        maxZoom = show && show.maxZoom,\n        htmlContainer = overlay.htmlContainer,\n        activeRootElement = this._canvas.getRootElement(),\n        visible = true;\n\n    if (rootElement !== activeRootElement) {\n      visible = false;\n    } else if (show) {\n      if (\n        (isDefined(minZoom) && minZoom > viewbox.scale) ||\n        (isDefined(maxZoom) && maxZoom < viewbox.scale)\n      ) {\n        visible = false;\n      }\n    }\n\n    setVisible(htmlContainer, visible);\n\n    this._updateOverlayScale(overlay, viewbox);\n  };\n\n\n  Overlays.prototype._updateOverlayScale = function(overlay, viewbox) {\n    var shouldScale = overlay.scale,\n        minScale,\n        maxScale,\n        htmlContainer = overlay.htmlContainer;\n\n    var scale, transform = '';\n\n    if (shouldScale !== true) {\n\n      if (shouldScale === false) {\n        minScale = 1;\n        maxScale = 1;\n      } else {\n        minScale = shouldScale.min;\n        maxScale = shouldScale.max;\n      }\n\n      if (isDefined(minScale) && viewbox.scale < minScale) {\n        scale = (1 / viewbox.scale || 1) * minScale;\n      }\n\n      if (isDefined(maxScale) && viewbox.scale > maxScale) {\n        scale = (1 / viewbox.scale || 1) * maxScale;\n      }\n    }\n\n    if (isDefined(scale)) {\n      transform = 'scale(' + scale + ',' + scale + ')';\n    }\n\n    setTransform(htmlContainer, transform);\n  };\n\n\n  Overlays.prototype._updateOverlaysVisibilty = function(viewbox) {\n\n    var self = this;\n\n    forEach$1(this._overlays, function(overlay) {\n      self._updateOverlayVisibilty(overlay, viewbox);\n    });\n  };\n\n\n  Overlays.prototype._init = function() {\n\n    var eventBus = this._eventBus;\n\n    var self = this;\n\n\n    // scroll/zoom integration\n\n    function updateViewbox(viewbox) {\n      self._updateRoot(viewbox);\n      self._updateOverlaysVisibilty(viewbox);\n\n      self.show();\n    }\n\n    eventBus.on('canvas.viewbox.changing', function(event) {\n      self.hide();\n    });\n\n    eventBus.on('canvas.viewbox.changed', function(event) {\n      updateViewbox(event.viewbox);\n    });\n\n\n    // remove integration\n\n    eventBus.on([ 'shape.remove', 'connection.remove' ], function(e) {\n      var element = e.element;\n      var overlays = self.get({ element: element });\n\n      forEach$1(overlays, function(o) {\n        self.remove(o.id);\n      });\n\n      var container = self._getOverlayContainer(element);\n\n      if (container) {\n        remove$1(container.html);\n        var i = self._overlayContainers.indexOf(container);\n        if (i !== -1) {\n          self._overlayContainers.splice(i, 1);\n        }\n      }\n    });\n\n\n    // move integration\n\n    eventBus.on('element.changed', LOW_PRIORITY$1, function(e) {\n      var element = e.element;\n\n      var container = self._getOverlayContainer(element, true);\n\n      if (container) {\n        forEach$1(container.overlays, function(overlay) {\n          self._updateOverlay(overlay);\n        });\n\n        self._updateOverlayContainer(container);\n      }\n    });\n\n\n    // marker integration, simply add them on the overlays as classes, too.\n\n    eventBus.on('element.marker.update', function(e) {\n      var container = self._getOverlayContainer(e.element, true);\n      if (container) {\n        classes(container.html)[e.add ? 'add' : 'remove'](e.marker);\n      }\n    });\n\n\n    eventBus.on('root.set', function() {\n      self._updateOverlaysVisibilty(self._canvas.viewbox());\n    });\n\n    // clear overlays with diagram\n\n    eventBus.on('diagram.clear', this.clear, this);\n  };\n\n\n\n  // helpers /////////////////////////////\n\n  function createRoot(parentNode) {\n    var root = domify$1(\n      '<div class=\"djs-overlay-container\" />'\n    );\n\n    assign(root, {\n      position: 'absolute',\n      width: 0,\n      height: 0\n    });\n\n    parentNode.insertBefore(root, parentNode.firstChild);\n\n    return root;\n  }\n\n  function setPosition(el, x, y) {\n    assign(el, { left: x + 'px', top: y + 'px' });\n  }\n\n  /**\n   * Set element visible\n   *\n   * @param {DOMElement} el\n   * @param {boolean} [visible=true]\n   */\n  function setVisible(el, visible) {\n    el.style.display = visible === false ? 'none' : '';\n  }\n\n  function setTransform(el, transform) {\n\n    el.style['transform-origin'] = 'top left';\n\n    [ '', '-ms-', '-webkit-' ].forEach(function(prefix) {\n      el.style[prefix + 'transform'] = transform;\n    });\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var OverlaysModule = {\n    __init__: [ 'overlays' ],\n    overlays: [ 'type', Overlays ]\n  };\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../../core/GraphicsFactory').default} GraphicsFactory\n   */\n\n  /**\n   * Adds change support to the diagram, including\n   *\n   * <ul>\n   *   <li>redrawing shapes and connections on change</li>\n   * </ul>\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {ElementRegistry} elementRegistry\n   * @param {GraphicsFactory} graphicsFactory\n   */\n  function ChangeSupport(\n      eventBus, canvas, elementRegistry,\n      graphicsFactory) {\n\n\n    // redraw shapes / connections on change\n\n    eventBus.on('element.changed', function(event) {\n\n      var element = event.element;\n\n      // element might have been deleted and replaced by new element with same ID\n      // thus check for parent of element except for root element\n      if (element.parent || element === canvas.getRootElement()) {\n        event.gfx = elementRegistry.getGraphics(element);\n      }\n\n      // shape + gfx may have been deleted\n      if (!event.gfx) {\n        return;\n      }\n\n      eventBus.fire(getType(element) + '.changed', event);\n    });\n\n    eventBus.on('elements.changed', function(event) {\n\n      var elements = event.elements;\n\n      elements.forEach(function(e) {\n        eventBus.fire('element.changed', { element: e });\n      });\n\n      graphicsFactory.updateContainments(elements);\n    });\n\n    eventBus.on('shape.changed', function(event) {\n      graphicsFactory.update('shape', event.element, event.gfx);\n    });\n\n    eventBus.on('connection.changed', function(event) {\n      graphicsFactory.update('connection', event.element, event.gfx);\n    });\n  }\n\n  ChangeSupport.$inject = [\n    'eventBus',\n    'canvas',\n    'elementRegistry',\n    'graphicsFactory'\n  ];\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var ChangeSupportModule = {\n    __init__: [ 'changeSupport' ],\n    changeSupport: [ 'type', ChangeSupport ]\n  };\n\n  /**\n   * @typedef {import('../core/Types').ElementLike} ElementLike\n   * @typedef {import('../core/EventBus').default} EventBus\n   * @typedef {import('./CommandStack').CommandContext} CommandContext\n   *\n   * @typedef {string|string[]} Events\n   * @typedef { (context: CommandContext) => ElementLike[] | void } HandlerFunction\n   * @typedef { (context: CommandContext) => void } ComposeHandlerFunction\n   */\n\n  var DEFAULT_PRIORITY$1 = 1000;\n\n  /**\n   * A utility that can be used to plug into the command execution for\n   * extension and/or validation.\n   *\n   * @class\n   * @constructor\n   *\n   * @example\n   *\n   * ```javascript\n   * import CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n   *\n   * class CommandLogger extends CommandInterceptor {\n   *   constructor(eventBus) {\n   *     super(eventBus);\n   *\n   *   this.preExecute('shape.create', (event) => {\n   *     console.log('commandStack.shape-create.preExecute', event);\n   *   });\n   * }\n   * ```\n   *\n   * @param {EventBus} eventBus\n   */\n  function CommandInterceptor(eventBus) {\n\n    /**\n     * @type {EventBus}\n     */\n    this._eventBus = eventBus;\n  }\n\n  CommandInterceptor.$inject = [ 'eventBus' ];\n\n  function unwrapEvent(fn, that) {\n    return function(event) {\n      return fn.call(that || null, event.context, event.command, event);\n    };\n  }\n\n\n  /**\n   * Intercept a command during one of the phases.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {string} [hook] phase to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.on = function(events, hook, priority, handlerFn, unwrap, that) {\n\n    if (isFunction(hook) || isNumber(hook)) {\n      that = unwrap;\n      unwrap = handlerFn;\n      handlerFn = priority;\n      priority = hook;\n      hook = null;\n    }\n\n    if (isFunction(priority)) {\n      that = unwrap;\n      unwrap = handlerFn;\n      handlerFn = priority;\n      priority = DEFAULT_PRIORITY$1;\n    }\n\n    if (isObject(unwrap)) {\n      that = unwrap;\n      unwrap = false;\n    }\n\n    if (!isFunction(handlerFn)) {\n      throw new Error('handlerFn must be a function');\n    }\n\n    if (!isArray$2(events)) {\n      events = [ events ];\n    }\n\n    var eventBus = this._eventBus;\n\n    forEach$1(events, function(event) {\n\n      // concat commandStack(.event)?(.hook)?\n      var fullEvent = [ 'commandStack', event, hook ].filter(function(e) { return e; }).join('.');\n\n      eventBus.on(fullEvent, priority, unwrap ? unwrapEvent(handlerFn, that) : handlerFn, that);\n    });\n  };\n\n  /**\n   * Add a <canExecute> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.canExecute = createHook('canExecute');\n\n  /**\n   * Add a <preExecute> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.preExecute = createHook('preExecute');\n\n  /**\n   * Add a <preExecuted> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.preExecuted = createHook('preExecuted');\n\n  /**\n   * Add a <execute> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.execute = createHook('execute');\n\n  /**\n   * Add a <executed> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.executed = createHook('executed');\n\n  /**\n   * Add a <postExecute> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.postExecute = createHook('postExecute');\n\n  /**\n   * Add a <postExecuted> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.postExecuted = createHook('postExecuted');\n\n  /**\n   * Add a <revert> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.revert = createHook('revert');\n\n  /**\n   * Add a <reverted> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.reverted = createHook('reverted');\n\n  /*\n   * Add prototype methods for each phase of command execution (e.g. execute,\n   * revert).\n   *\n   * @param {string} hook\n   *\n   * @return { (\n   *   events?: Events,\n   *   priority?: number,\n   *   handlerFn: ComposeHandlerFunction|HandlerFunction,\n   *   unwrap?: boolean\n   * ) => any }\n   */\n  function createHook(hook) {\n\n    /**\n     * @this {CommandInterceptor}\n     *\n     * @param {Events} [events]\n     * @param {number} [priority]\n     * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n     * @param {boolean} [unwrap]\n     * @param {any} [that]\n     */\n    const hookFn = function(events, priority, handlerFn, unwrap, that) {\n\n      if (isFunction(events) || isNumber(events)) {\n        that = unwrap;\n        unwrap = handlerFn;\n        handlerFn = priority;\n        priority = events;\n        events = null;\n      }\n\n      this.on(events, hook, priority, handlerFn, unwrap, that);\n    };\n\n    return hookFn;\n  }\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   *\n   * @typedef {import('../../core/Canvas').default} Canvas\n   */\n\n  /**\n   * A modeling behavior that ensures we set the correct root element\n   * as we undo and redo commands.\n   *\n   * @param {Canvas} canvas\n   * @param {Injector} injector\n   */\n  function RootElementsBehavior(canvas, injector) {\n\n    injector.invoke(CommandInterceptor, this);\n\n    this.executed(function(event) {\n      var context = event.context;\n\n      if (context.rootElement) {\n        canvas.setRootElement(context.rootElement);\n      } else {\n        context.rootElement = canvas.getRootElement();\n      }\n    });\n\n    this.revert(function(event) {\n      var context = event.context;\n\n      if (context.rootElement) {\n        canvas.setRootElement(context.rootElement);\n      }\n    });\n  }\n\n  e(RootElementsBehavior, CommandInterceptor);\n\n  RootElementsBehavior.$inject = [ 'canvas', 'injector' ];\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var RootElementsModule = {\n    __init__: [ 'rootElementsBehavior' ],\n    rootElementsBehavior: [ 'type', RootElementsBehavior ]\n  };\n\n  /**\n   * @param {string} str\n   *\n   * @return {string}\n   */\n\n  var HTML_ESCAPE_MAP = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    '\\'': '&#39;'\n  };\n\n  /**\n   * @param {string} str\n   *\n   * @return {string}\n   */\n  function escapeHTML(str) {\n    str = '' + str;\n\n    return str && str.replace(/[&<>\"']/g, function(match) {\n      return HTML_ESCAPE_MAP[match];\n    });\n  }\n\n  /**\n   * @typedef {import('../model/Types').Element} Element\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   */\n\n  var planeSuffix = '_plane';\n\n  /**\n   * Get plane ID for a primary shape.\n   *\n   * @param  {Element|ModdleElement} element\n   *\n   * @return {string}\n   */\n  function getPlaneIdFromShape(element) {\n    var id = element.id;\n\n    if (is$1(element, 'bpmn:SubProcess')) {\n      return addPlaneSuffix(id);\n    }\n\n    return id;\n  }\n\n  function addPlaneSuffix(id) {\n    return id + planeSuffix;\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Shape} Shape\n   */\n\n  var OPEN_CLASS = 'bjs-breadcrumbs-shown';\n\n\n  /**\n   * Adds overlays that allow switching planes on collapsed subprocesses.\n   *\n   * @param {EventBus} eventBus\n   * @param {ElementRegistry} elementRegistry\n   * @param {Canvas} canvas\n   */\n  function DrilldownBreadcrumbs(eventBus, elementRegistry, canvas) {\n    var breadcrumbs = domify$1('<ul class=\"bjs-breadcrumbs\"></ul>');\n    var container = canvas.getContainer();\n    var containerClasses = classes(container);\n    container.appendChild(breadcrumbs);\n\n    var businessObjectParents = [];\n\n    // update breadcrumbs if name or ID of the primary shape changes\n    eventBus.on('element.changed', function(event) {\n      var shape = event.element,\n          businessObject = getBusinessObject(shape);\n\n      var isPresent = find(businessObjectParents, function(element) {\n        return element === businessObject;\n      });\n\n      if (!isPresent) {\n        return;\n      }\n\n      updateBreadcrumbs();\n    });\n\n    /**\n     * Updates the displayed breadcrumbs. If no element is provided, only the\n     * labels are updated.\n     *\n     * @param {Element} [element]\n     */\n    function updateBreadcrumbs(element) {\n      if (element) {\n        businessObjectParents = getBusinessObjectParentChain(element);\n      }\n\n      var path = businessObjectParents.map(function(parent) {\n        var title = escapeHTML(parent.name || parent.id);\n        var link = domify$1('<li><span class=\"bjs-crumb\"><a title=\"' + title + '\">' + title + '</a></span></li>');\n\n        var parentPlane = canvas.findRoot(getPlaneIdFromShape(parent)) || canvas.findRoot(parent.id);\n\n        // when the root is a collaboration, the process does not have a corresponding\n        // element in the elementRegisty. Instead, we search for the corresponding participant\n        if (!parentPlane && is$1(parent, 'bpmn:Process')) {\n          var participant = elementRegistry.find(function(element) {\n            var businessObject = getBusinessObject(element);\n\n            return businessObject && businessObject.get('processRef') && businessObject.get('processRef') === parent;\n          });\n\n          parentPlane = canvas.findRoot(participant.id);\n        }\n\n        link.addEventListener('click', function() {\n          canvas.setRootElement(parentPlane);\n        });\n\n        return link;\n      });\n\n      breadcrumbs.innerHTML = '';\n\n      // show breadcrumbs and expose state to .djs-container\n      var visible = path.length > 1;\n\n      containerClasses.toggle(OPEN_CLASS, visible);\n\n      path.forEach(function(element) {\n        breadcrumbs.appendChild(element);\n      });\n    }\n\n    eventBus.on('root.set', function(event) {\n      updateBreadcrumbs(event.element);\n    });\n\n  }\n\n  DrilldownBreadcrumbs.$inject = [ 'eventBus', 'elementRegistry', 'canvas' ];\n\n\n  // helpers //////////\n\n  /**\n   * Returns the parents for the element using the business object chain,\n   * starting with the root element.\n   *\n   * @param {Shape} child\n   *\n   * @return {Shape}\n   */\n  function getBusinessObjectParentChain(child) {\n    var businessObject = getBusinessObject(child);\n\n    var parents = [];\n\n    for (var element = businessObject; element; element = element.$parent) {\n      if (is$1(element, 'bpmn:SubProcess') || is$1(element, 'bpmn:Process')) {\n        parents.push(element);\n      }\n    }\n\n    return parents.reverse();\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   */\n\n  /**\n   * Move collapsed subprocesses into view when drilling down.\n   *\n   * Zoom and scroll are saved in a session.\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   */\n  function DrilldownCentering(eventBus, canvas) {\n\n    var currentRoot = null;\n    var positionMap = new Map();\n\n    eventBus.on('root.set', function(event) {\n      var newRoot = event.element;\n      var currentViewbox = canvas.viewbox();\n      var storedViewbox = positionMap.get(newRoot);\n\n      positionMap.set(currentRoot, {\n        x: currentViewbox.x,\n        y: currentViewbox.y,\n        zoom: currentViewbox.scale\n      });\n\n      currentRoot = newRoot;\n\n      // current root was replaced with a collaboration, we don't update the viewbox\n      if (is$1(newRoot, 'bpmn:Collaboration') && !storedViewbox) {\n        return;\n      }\n\n      storedViewbox = storedViewbox || { x: 0, y: 0, zoom: 1 };\n\n      var dx = (currentViewbox.x - storedViewbox.x) * currentViewbox.scale,\n          dy = (currentViewbox.y - storedViewbox.y) * currentViewbox.scale;\n\n      if (dx !== 0 || dy !== 0) {\n        canvas.scroll({\n          dx: dx,\n          dy: dy\n        });\n      }\n\n      if (storedViewbox.zoom !== currentViewbox.scale) {\n        canvas.zoom(storedViewbox.zoom, { x: 0, y: 0 });\n      }\n    });\n\n    eventBus.on('diagram.clear', function() {\n      positionMap.clear();\n      currentRoot = null;\n    });\n\n  }\n\n  DrilldownCentering.$inject = [ 'eventBus', 'canvas' ];\n\n\n  /**\n   * ES5 Map implementation. Works.\n   */\n  function Map() {\n\n    this._entries = [];\n\n    this.set = function(key, value) {\n\n      var found = false;\n\n      for (var k in this._entries) {\n        if (this._entries[k][0] === key) {\n          this._entries[k][1] = value;\n\n          found = true;\n\n          break;\n        }\n      }\n\n      if (!found) {\n        this._entries.push([ key, value ]);\n      }\n    };\n\n    this.get = function(key) {\n\n      for (var k in this._entries) {\n        if (this._entries[k][0] === key) {\n          return this._entries[k][1];\n        }\n      }\n\n      return null;\n    };\n\n    this.clear = function() {\n      this._entries.length = 0;\n    };\n\n    this.remove = function(key) {\n\n      var idx = -1;\n\n      for (var k in this._entries) {\n        if (this._entries[k][0] === key) {\n          idx = k;\n\n          break;\n        }\n      }\n\n      if (idx !== -1) {\n        this._entries.splice(idx, 1);\n      }\n    };\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../../model/Types').Moddle} Moddle\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Shape} Shape\n   *\n   * @typedef {import('diagram-js/lib/core/Canvas').CanvasPlane} CanvasPlane\n   *\n   * @typedef {import('diagram-js/lib/util/Types').Rect} Rect\n   */\n\n  var DEFAULT_POSITION = {\n    x: 180,\n    y: 160\n  };\n\n  /**\n   * Hook into `import.render.start` and create new planes for diagrams with\n   * collapsed subprocesses and all DI elements on the same plane.\n   *\n   * @param {EventBus} eventBus\n   * @param {Moddle} moddle\n   */\n  function SubprocessCompatibility(eventBus, moddle) {\n    this._eventBus = eventBus;\n    this._moddle = moddle;\n\n    var self = this;\n\n    eventBus.on('import.render.start', 1500, function(e, context) {\n      self._handleImport(context.definitions);\n    });\n  }\n\n  /**\n   * @param {ModdleElement} definitions\n   */\n  SubprocessCompatibility.prototype._handleImport = function(definitions) {\n    if (!definitions.diagrams) {\n      return;\n    }\n\n    var self = this;\n    this._definitions = definitions;\n    this._processToDiagramMap = {};\n\n    definitions.diagrams.forEach(function(diagram) {\n      if (!diagram.plane || !diagram.plane.bpmnElement) {\n        return;\n      }\n\n      self._processToDiagramMap[diagram.plane.bpmnElement.id] = diagram;\n    });\n\n    var newDiagrams = [];\n    definitions.diagrams.forEach(function(diagram) {\n      var createdDiagrams = self._createNewDiagrams(diagram.plane);\n      Array.prototype.push.apply(newDiagrams, createdDiagrams);\n    });\n\n    newDiagrams.forEach(function(diagram) {\n      self._movePlaneElementsToOrigin(diagram.plane);\n    });\n  };\n\n\n  /**\n   * Moves all DI elements from collapsed subprocesses to a new plane.\n   *\n   * @param {CanvasPlane} plane\n   *\n   * @return {ModdleElement[]} new diagrams created for the collapsed subprocesses\n   */\n  SubprocessCompatibility.prototype._createNewDiagrams = function(plane) {\n    var self = this;\n\n    var collapsedElements = [];\n    var elementsToMove = [];\n\n    plane.get('planeElement').forEach(function(diElement) {\n      var businessObject = diElement.bpmnElement;\n\n      if (!businessObject) {\n        return;\n      }\n\n      var parent = businessObject.$parent;\n\n      if (is$1(businessObject, 'bpmn:SubProcess') && !diElement.isExpanded) {\n        collapsedElements.push(businessObject);\n      }\n\n      if (shouldMoveToPlane(businessObject, plane)) {\n\n        // don't change the array while we iterate over it\n        elementsToMove.push({ diElement: diElement, parent: parent });\n      }\n    });\n\n    var newDiagrams = [];\n\n    // create new planes for all collapsed subprocesses, even when they are empty\n    collapsedElements.forEach(function(element) {\n      if (!self._processToDiagramMap[ element.id ]) {\n        var diagram = self._createDiagram(element);\n\n        self._processToDiagramMap[element.id] = diagram;\n\n        newDiagrams.push(diagram);\n      }\n    });\n\n    elementsToMove.forEach(function(element) {\n      var diElement = element.diElement;\n      var parent = element.parent;\n\n      // parent is expanded, get nearest collapsed parent\n      while (parent && collapsedElements.indexOf(parent) === -1) {\n        parent = parent.$parent;\n      }\n\n      // false positive, all parents are expanded\n      if (!parent) {\n        return;\n      }\n\n      var diagram = self._processToDiagramMap[ parent.id ];\n\n      self._moveToDiPlane(diElement, diagram.plane);\n    });\n\n    return newDiagrams;\n  };\n\n  /**\n   * @param {CanvasPlane} plane\n   */\n  SubprocessCompatibility.prototype._movePlaneElementsToOrigin = function(plane) {\n    var elements = plane.get('planeElement');\n\n    // get bounding box of all elements\n    var planeBounds = getPlaneBounds(plane);\n\n    var offset = {\n      x: planeBounds.x - DEFAULT_POSITION.x,\n      y: planeBounds.y - DEFAULT_POSITION.y\n    };\n\n    elements.forEach(function(diElement) {\n      if (diElement.waypoint) {\n        diElement.waypoint.forEach(function(waypoint) {\n          waypoint.x = waypoint.x - offset.x;\n          waypoint.y = waypoint.y - offset.y;\n        });\n      } else if (diElement.bounds) {\n        diElement.bounds.x = diElement.bounds.x - offset.x;\n        diElement.bounds.y = diElement.bounds.y - offset.y;\n      }\n    });\n  };\n\n  /**\n   * @param {ModdleElement} diElement\n   * @param {CanvasPlane} newPlane\n   */\n  SubprocessCompatibility.prototype._moveToDiPlane = function(diElement, newPlane) {\n    var containingDiagram = findRootDiagram(diElement);\n\n    // remove DI from old Plane and add it to the new one\n    var parentPlaneElement = containingDiagram.plane.get('planeElement');\n\n    parentPlaneElement.splice(parentPlaneElement.indexOf(diElement), 1);\n\n    newPlane.get('planeElement').push(diElement);\n  };\n\n  /**\n   * @param {ModdleElement} businessObject\n   *\n   * @return {ModdleElement}\n   */\n  SubprocessCompatibility.prototype._createDiagram = function(businessObject) {\n    var plane = this._moddle.create('bpmndi:BPMNPlane', {\n      bpmnElement: businessObject\n    });\n\n    var diagram = this._moddle.create('bpmndi:BPMNDiagram', {\n      plane: plane\n    });\n\n    plane.$parent = diagram;\n\n    plane.bpmnElement = businessObject;\n\n    diagram.$parent = this._definitions;\n\n    this._definitions.diagrams.push(diagram);\n\n    return diagram;\n  };\n\n  SubprocessCompatibility.$inject = [ 'eventBus', 'moddle' ];\n\n\n  // helpers //////////\n\n  function findRootDiagram(element) {\n    if (is$1(element, 'bpmndi:BPMNDiagram')) {\n      return element;\n    } else {\n      return findRootDiagram(element.$parent);\n    }\n  }\n\n  /**\n   * @param {CanvasPlane} plane\n   *\n   * @return {Rect}\n   */\n  function getPlaneBounds(plane) {\n    var planeTrbl = {\n      top: Infinity,\n      right: -Infinity,\n      bottom: -Infinity,\n      left: Infinity\n    };\n\n    plane.planeElement.forEach(function(element) {\n      if (!element.bounds) {\n        return;\n      }\n\n      var trbl = asTRBL(element.bounds);\n\n      planeTrbl.top = Math.min(trbl.top, planeTrbl.top);\n      planeTrbl.left = Math.min(trbl.left, planeTrbl.left);\n    });\n\n    return asBounds(planeTrbl);\n  }\n\n  /**\n   * @param {ModdleElement} businessObject\n   * @param {CanvasPlane} plane\n   *\n   * @return {boolean}\n   */\n  function shouldMoveToPlane(businessObject, plane) {\n    var parent = businessObject.$parent;\n\n    // don't move elements that are already on the plane\n    if (!is$1(parent, 'bpmn:SubProcess') || parent === plane.bpmnElement) {\n      return false;\n    }\n\n    // dataAssociations are children of the subprocess but rendered on process level\n    // cf. https://github.com/bpmn-io/bpmn-js/issues/1619\n    if (isAny(businessObject, [ 'bpmn:DataInputAssociation', 'bpmn:DataOutputAssociation' ])) {\n      return false;\n    }\n\n    return true;\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('diagram-js/lib/features/overlays/Overlays').default} Overlays\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Parent} Parent\n   * @typedef {import('../../model/Types').Shape} Shape\n   */\n\n  var LOW_PRIORITY = 250;\n  var ARROW_DOWN_SVG = '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 16 16\"><path fill-rule=\"evenodd\" d=\"M4.81801948,3.50735931 L10.4996894,9.1896894 L10.5,4 L12,4 L12,12 L4,12 L4,10.5 L9.6896894,10.4996894 L3.75735931,4.56801948 C3.46446609,4.27512627 3.46446609,3.80025253 3.75735931,3.50735931 C4.05025253,3.21446609 4.52512627,3.21446609 4.81801948,3.50735931 Z\"/></svg>';\n\n  var EMPTY_MARKER = 'bjs-drilldown-empty';\n\n  /**\n   * @param {Canvas} canvas\n   * @param {EventBus} eventBus\n   * @param {ElementRegistry} elementRegistry\n   * @param {Overlays} overlays\n   */\n  function DrilldownOverlayBehavior(\n      canvas, eventBus, elementRegistry, overlays\n  ) {\n    CommandInterceptor.call(this, eventBus);\n\n    this._canvas = canvas;\n    this._eventBus = eventBus;\n    this._elementRegistry = elementRegistry;\n    this._overlays = overlays;\n\n    var self = this;\n\n    this.executed('shape.toggleCollapse', LOW_PRIORITY, function(context) {\n      var shape = context.shape;\n\n      // Add overlay to the collapsed shape\n      if (self._canDrillDown(shape)) {\n        self._addOverlay(shape);\n      } else {\n        self._removeOverlay(shape);\n      }\n    }, true);\n\n\n    this.reverted('shape.toggleCollapse', LOW_PRIORITY, function(context) {\n      var shape = context.shape;\n\n      // Add overlay to the collapsed shape\n      if (self._canDrillDown(shape)) {\n        self._addOverlay(shape);\n      } else {\n        self._removeOverlay(shape);\n      }\n    }, true);\n\n\n    this.executed([ 'shape.create', 'shape.move', 'shape.delete' ], LOW_PRIORITY,\n      function(context) {\n        var oldParent = context.oldParent,\n            newParent = context.newParent || context.parent,\n            shape = context.shape;\n\n        // Add overlay to the collapsed shape\n        if (self._canDrillDown(shape)) {\n          self._addOverlay(shape);\n        }\n\n        self._updateDrilldownOverlay(oldParent);\n        self._updateDrilldownOverlay(newParent);\n        self._updateDrilldownOverlay(shape);\n      }, true);\n\n\n    this.reverted([ 'shape.create', 'shape.move', 'shape.delete' ], LOW_PRIORITY,\n      function(context) {\n        var oldParent = context.oldParent,\n            newParent = context.newParent || context.parent,\n            shape = context.shape;\n\n        // Add overlay to the collapsed shape\n        if (self._canDrillDown(shape)) {\n          self._addOverlay(shape);\n        }\n\n        self._updateDrilldownOverlay(oldParent);\n        self._updateDrilldownOverlay(newParent);\n        self._updateDrilldownOverlay(shape);\n      }, true);\n\n\n    eventBus.on('import.render.complete', function() {\n      elementRegistry.filter(function(e) {\n        return self._canDrillDown(e);\n      }).map(function(el) {\n        self._addOverlay(el);\n      });\n    });\n\n  }\n\n  e(DrilldownOverlayBehavior, CommandInterceptor);\n\n  /**\n   * @param {Shape} shape\n   */\n  DrilldownOverlayBehavior.prototype._updateDrilldownOverlay = function(shape) {\n    var canvas = this._canvas;\n\n    if (!shape) {\n      return;\n    }\n\n    var root = canvas.findRoot(shape);\n\n    if (root) {\n      this._updateOverlayVisibility(root);\n    }\n  };\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  DrilldownOverlayBehavior.prototype._canDrillDown = function(element) {\n    var canvas = this._canvas;\n\n    return is$1(element, 'bpmn:SubProcess') && canvas.findRoot(getPlaneIdFromShape(element));\n  };\n\n  /**\n   * Update the visibility of the drilldown overlay. If the plane has no elements,\n   * the drilldown will only be shown when the element is selected.\n   *\n   * @param {Parent} element The collapsed root or shape.\n   */\n  DrilldownOverlayBehavior.prototype._updateOverlayVisibility = function(element) {\n    var overlays = this._overlays;\n\n    var businessObject = getBusinessObject(element);\n\n    var overlay = overlays.get({ element: businessObject.id, type: 'drilldown' })[0];\n\n    if (!overlay) {\n      return;\n    }\n\n    var hasFlowElements = businessObject\n      && businessObject.get('flowElements')\n      && businessObject.get('flowElements').length;\n\n    classes(overlay.html).toggle(EMPTY_MARKER, !hasFlowElements);\n  };\n\n  /**\n   * Add a drilldown button to the given element assuming the plane has the same\n   * ID as the element.\n   *\n   * @param {Shape} element The collapsed shape.\n   */\n  DrilldownOverlayBehavior.prototype._addOverlay = function(element) {\n    var canvas = this._canvas,\n        overlays = this._overlays;\n\n    var existingOverlays = overlays.get({ element: element, type: 'drilldown' });\n\n    if (existingOverlays.length) {\n      this._removeOverlay(element);\n    }\n\n    var button = domify$1('<button class=\"bjs-drilldown\">' + ARROW_DOWN_SVG + '</button>');\n\n    button.addEventListener('click', function() {\n      canvas.setRootElement(canvas.findRoot(getPlaneIdFromShape(element)));\n    });\n\n    overlays.add(element, 'drilldown', {\n      position: {\n        bottom: -7,\n        right: -8\n      },\n      html: button\n    });\n\n    this._updateOverlayVisibility(element);\n  };\n\n  DrilldownOverlayBehavior.prototype._removeOverlay = function(element) {\n    var overlays = this._overlays;\n\n    overlays.remove({\n      element: element,\n      type: 'drilldown'\n    });\n  };\n\n  DrilldownOverlayBehavior.$inject = [\n    'canvas',\n    'eventBus',\n    'elementRegistry',\n    'overlays'\n  ];\n\n  var DrilldownModdule = {\n    __depends__: [ OverlaysModule, ChangeSupportModule, RootElementsModule ],\n    __init__: [ 'drilldownBreadcrumbs', 'drilldownOverlayBehavior', 'drilldownCentering', 'subprocessCompatibility' ],\n    drilldownBreadcrumbs: [ 'type', DrilldownBreadcrumbs ],\n    drilldownCentering: [ 'type', DrilldownCentering ],\n    drilldownOverlayBehavior: [ 'type', DrilldownOverlayBehavior ],\n    subprocessCompatibility: [ 'type', SubprocessCompatibility ]\n  };\n\n  const CLASS_PATTERN = /^class[ {]/;\n\n\n  /**\n   * @param {function} fn\n   *\n   * @return {boolean}\n   */\n  function isClass(fn) {\n    return CLASS_PATTERN.test(fn.toString());\n  }\n\n  /**\n   * @param {any} obj\n   *\n   * @return {boolean}\n   */\n  function isArray(obj) {\n    return Array.isArray(obj);\n  }\n\n  /**\n   * @param {any} obj\n   * @param {string} prop\n   *\n   * @return {boolean}\n   */\n  function hasOwnProp(obj, prop) {\n    return Object.prototype.hasOwnProperty.call(obj, prop);\n  }\n\n  /**\n   * @typedef {import('./index').InjectAnnotated } InjectAnnotated\n   */\n\n  /**\n   * @template T\n   *\n   * @params {[...string[], T] | ...string[], T} args\n   *\n   * @return {T & InjectAnnotated}\n   */\n  function annotate(...args) {\n\n    if (args.length === 1 && isArray(args[0])) {\n      args = args[0];\n    }\n\n    args = [ ...args ];\n\n    const fn = args.pop();\n\n    fn.$inject = args;\n\n    return fn;\n  }\n\n\n  // Current limitations:\n  // - can't put into \"function arg\" comments\n  // function /* (no parenthesis like this) */ (){}\n  // function abc( /* xx (no parenthesis like this) */ a, b) {}\n  //\n  // Just put the comment before function or inside:\n  // /* (((this is fine))) */ function(a, b) {}\n  // function abc(a) { /* (((this is fine))) */}\n  //\n  // - can't reliably auto-annotate constructor; we'll match the\n  // first constructor(...) pattern found which may be the one\n  // of a nested class, too.\n\n  const CONSTRUCTOR_ARGS = /constructor\\s*[^(]*\\(\\s*([^)]*)\\)/m;\n  const FN_ARGS = /^(?:async\\s+)?(?:function\\s*[^(]*)?(?:\\(\\s*([^)]*)\\)|(\\w+))/m;\n  const FN_ARG = /\\/\\*([^*]*)\\*\\//m;\n\n  /**\n   * @param {unknown} fn\n   *\n   * @return {string[]}\n   */\n  function parseAnnotations(fn) {\n\n    if (typeof fn !== 'function') {\n      throw new Error(`Cannot annotate \"${fn}\". Expected a function!`);\n    }\n\n    const match = fn.toString().match(isClass(fn) ? CONSTRUCTOR_ARGS : FN_ARGS);\n\n    // may parse class without constructor\n    if (!match) {\n      return [];\n    }\n\n    const args = match[1] || match[2];\n\n    return args && args.split(',').map(arg => {\n      const argMatch = arg.match(FN_ARG);\n      return (argMatch && argMatch[1] || arg).trim();\n    }) || [];\n  }\n\n  /**\n   * @typedef { import('./index').ModuleDeclaration } ModuleDeclaration\n   * @typedef { import('./index').ModuleDefinition } ModuleDefinition\n   * @typedef { import('./index').InjectorContext } InjectorContext\n   */\n\n  /**\n   * Create a new injector with the given modules.\n   *\n   * @param {ModuleDefinition[]} modules\n   * @param {InjectorContext} [parent]\n   */\n  function Injector(modules, parent) {\n    parent = parent || {\n      get: function(name, strict) {\n        currentlyResolving.push(name);\n\n        if (strict === false) {\n          return null;\n        } else {\n          throw error(`No provider for \"${ name }\"!`);\n        }\n      }\n    };\n\n    const currentlyResolving = [];\n    const providers = this._providers = Object.create(parent._providers || null);\n    const instances = this._instances = Object.create(null);\n\n    const self = instances.injector = this;\n\n    const error = function(msg) {\n      const stack = currentlyResolving.join(' -> ');\n      currentlyResolving.length = 0;\n      return new Error(stack ? `${ msg } (Resolving: ${ stack })` : msg);\n    };\n\n    /**\n     * Return a named service.\n     *\n     * @param {string} name\n     * @param {boolean} [strict=true] if false, resolve missing services to null\n     *\n     * @return {any}\n     */\n    function get(name, strict) {\n      if (!providers[name] && name.indexOf('.') !== -1) {\n        const parts = name.split('.');\n        let pivot = get(parts.shift());\n\n        while (parts.length) {\n          pivot = pivot[parts.shift()];\n        }\n\n        return pivot;\n      }\n\n      if (hasOwnProp(instances, name)) {\n        return instances[name];\n      }\n\n      if (hasOwnProp(providers, name)) {\n        if (currentlyResolving.indexOf(name) !== -1) {\n          currentlyResolving.push(name);\n          throw error('Cannot resolve circular dependency!');\n        }\n\n        currentlyResolving.push(name);\n        instances[name] = providers[name][0](providers[name][1]);\n        currentlyResolving.pop();\n\n        return instances[name];\n      }\n\n      return parent.get(name, strict);\n    }\n\n    function fnDef(fn, locals) {\n\n      if (typeof locals === 'undefined') {\n        locals = {};\n      }\n\n      if (typeof fn !== 'function') {\n        if (isArray(fn)) {\n          fn = annotate(fn.slice());\n        } else {\n          throw error(`Cannot invoke \"${ fn }\". Expected a function!`);\n        }\n      }\n\n      const inject = fn.$inject || parseAnnotations(fn);\n      const dependencies = inject.map(dep => {\n        if (hasOwnProp(locals, dep)) {\n          return locals[dep];\n        } else {\n          return get(dep);\n        }\n      });\n\n      return {\n        fn: fn,\n        dependencies: dependencies\n      };\n    }\n\n    function instantiate(Type) {\n      const {\n        fn,\n        dependencies\n      } = fnDef(Type);\n\n      // instantiate var args constructor\n      const Constructor = Function.prototype.bind.apply(fn, [ null ].concat(dependencies));\n\n      return new Constructor();\n    }\n\n    function invoke(func, context, locals) {\n      const {\n        fn,\n        dependencies\n      } = fnDef(func, locals);\n\n      return fn.apply(context, dependencies);\n    }\n\n    /**\n     * @param {Injector} childInjector\n     *\n     * @return {Function}\n     */\n    function createPrivateInjectorFactory(childInjector) {\n      return annotate(key => childInjector.get(key));\n    }\n\n    /**\n     * @param {ModuleDefinition[]} modules\n     * @param {string[]} [forceNewInstances]\n     *\n     * @return {Injector}\n     */\n    function createChild(modules, forceNewInstances) {\n      if (forceNewInstances && forceNewInstances.length) {\n        const fromParentModule = Object.create(null);\n        const matchedScopes = Object.create(null);\n\n        const privateInjectorsCache = [];\n        const privateChildInjectors = [];\n        const privateChildFactories = [];\n\n        let provider;\n        let cacheIdx;\n        let privateChildInjector;\n        let privateChildInjectorFactory;\n\n        for (let name in providers) {\n          provider = providers[name];\n\n          if (forceNewInstances.indexOf(name) !== -1) {\n            if (provider[2] === 'private') {\n              cacheIdx = privateInjectorsCache.indexOf(provider[3]);\n              if (cacheIdx === -1) {\n                privateChildInjector = provider[3].createChild([], forceNewInstances);\n                privateChildInjectorFactory = createPrivateInjectorFactory(privateChildInjector);\n                privateInjectorsCache.push(provider[3]);\n                privateChildInjectors.push(privateChildInjector);\n                privateChildFactories.push(privateChildInjectorFactory);\n                fromParentModule[name] = [ privateChildInjectorFactory, name, 'private', privateChildInjector ];\n              } else {\n                fromParentModule[name] = [ privateChildFactories[cacheIdx], name, 'private', privateChildInjectors[cacheIdx] ];\n              }\n            } else {\n              fromParentModule[name] = [ provider[2], provider[1] ];\n            }\n            matchedScopes[name] = true;\n          }\n\n          if ((provider[2] === 'factory' || provider[2] === 'type') && provider[1].$scope) {\n            /* jshint -W083 */\n            forceNewInstances.forEach(scope => {\n              if (provider[1].$scope.indexOf(scope) !== -1) {\n                fromParentModule[name] = [ provider[2], provider[1] ];\n                matchedScopes[scope] = true;\n              }\n            });\n          }\n        }\n\n        forceNewInstances.forEach(scope => {\n          if (!matchedScopes[scope]) {\n            throw new Error('No provider for \"' + scope + '\". Cannot use provider from the parent!');\n          }\n        });\n\n        modules.unshift(fromParentModule);\n      }\n\n      return new Injector(modules, self);\n    }\n\n    const factoryMap = {\n      factory: invoke,\n      type: instantiate,\n      value: function(value) {\n        return value;\n      }\n    };\n\n    /**\n     * @param {ModuleDefinition} moduleDefinition\n     * @param {Injector} injector\n     */\n    function createInitializer(moduleDefinition, injector) {\n\n      const initializers = moduleDefinition.__init__ || [];\n\n      return function() {\n        initializers.forEach(initializer => {\n\n          // eagerly resolve component (fn or string)\n          if (typeof initializer === 'string') {\n            injector.get(initializer);\n          } else {\n            injector.invoke(initializer);\n          }\n        });\n      };\n    }\n\n    /**\n     * @param {ModuleDefinition} moduleDefinition\n     */\n    function loadModule(moduleDefinition) {\n\n      const moduleExports = moduleDefinition.__exports__;\n\n      // private module\n      if (moduleExports) {\n        const nestedModules = moduleDefinition.__modules__;\n\n        const clonedModule = Object.keys(moduleDefinition).reduce((clonedModule, key) => {\n\n          if (key !== '__exports__' && key !== '__modules__' && key !== '__init__' && key !== '__depends__') {\n            clonedModule[key] = moduleDefinition[key];\n          }\n\n          return clonedModule;\n        }, Object.create(null));\n\n        const childModules = (nestedModules || []).concat(clonedModule);\n\n        const privateInjector = createChild(childModules);\n        const getFromPrivateInjector = annotate(function(key) {\n          return privateInjector.get(key);\n        });\n\n        moduleExports.forEach(function(key) {\n          providers[key] = [ getFromPrivateInjector, key, 'private', privateInjector ];\n        });\n\n        // ensure child injector initializes\n        const initializers = (moduleDefinition.__init__ || []).slice();\n\n        initializers.unshift(function() {\n          privateInjector.init();\n        });\n\n        moduleDefinition = Object.assign({}, moduleDefinition, {\n          __init__: initializers\n        });\n\n        return createInitializer(moduleDefinition, privateInjector);\n      }\n\n      // normal module\n      Object.keys(moduleDefinition).forEach(function(key) {\n\n        if (key === '__init__' || key === '__depends__') {\n          return;\n        }\n\n        if (moduleDefinition[key][2] === 'private') {\n          providers[key] = moduleDefinition[key];\n          return;\n        }\n\n        const type = moduleDefinition[key][0];\n        const value = moduleDefinition[key][1];\n\n        providers[key] = [ factoryMap[type], arrayUnwrap(type, value), type ];\n      });\n\n      return createInitializer(moduleDefinition, self);\n    }\n\n    /**\n     * @param {ModuleDefinition[]} moduleDefinitions\n     * @param {ModuleDefinition} moduleDefinition\n     *\n     * @return {ModuleDefinition[]}\n     */\n    function resolveDependencies(moduleDefinitions, moduleDefinition) {\n\n      if (moduleDefinitions.indexOf(moduleDefinition) !== -1) {\n        return moduleDefinitions;\n      }\n\n      moduleDefinitions = (moduleDefinition.__depends__ || []).reduce(resolveDependencies, moduleDefinitions);\n\n      if (moduleDefinitions.indexOf(moduleDefinition) !== -1) {\n        return moduleDefinitions;\n      }\n\n      return moduleDefinitions.concat(moduleDefinition);\n    }\n\n    /**\n     * @param {ModuleDefinition[]} moduleDefinitions\n     *\n     * @return { () => void } initializerFn\n     */\n    function bootstrap(moduleDefinitions) {\n\n      const initializers = moduleDefinitions\n        .reduce(resolveDependencies, [])\n        .map(loadModule);\n\n      let initialized = false;\n\n      return function() {\n\n        if (initialized) {\n          return;\n        }\n\n        initialized = true;\n\n        initializers.forEach(initializer => initializer());\n      };\n    }\n\n    // public API\n    this.get = get;\n    this.invoke = invoke;\n    this.instantiate = instantiate;\n    this.createChild = createChild;\n\n    // setup\n    this.init = bootstrap(modules);\n  }\n\n\n  // helpers ///////////////\n\n  function arrayUnwrap(type, value) {\n    if (type !== 'value' && isArray(value)) {\n      value = annotate(value.slice());\n    }\n\n    return value;\n  }\n\n  /**\n   * @typedef {import('../core/EventBus').default} EventBus\n   * @typedef {import('./Styles').default} Styles\n   */\n\n  // apply default renderer with lowest possible priority\n  // so that it only kicks in if noone else could render\n  var DEFAULT_RENDER_PRIORITY = 1;\n\n  /**\n   * The default renderer used for shapes and connections.\n   *\n   * @param {EventBus} eventBus\n   * @param {Styles} styles\n   */\n  function DefaultRenderer(eventBus, styles) {\n\n    BaseRenderer.call(this, eventBus, DEFAULT_RENDER_PRIORITY);\n\n    this.CONNECTION_STYLE = styles.style([ 'no-fill' ], { strokeWidth: 5, stroke: 'fuchsia' });\n    this.SHAPE_STYLE = styles.style({ fill: 'white', stroke: 'fuchsia', strokeWidth: 2 });\n    this.FRAME_STYLE = styles.style([ 'no-fill' ], { stroke: 'fuchsia', strokeDasharray: 4, strokeWidth: 2 });\n  }\n\n  e(DefaultRenderer, BaseRenderer);\n\n\n  /**\n   * @private\n   */\n  DefaultRenderer.prototype.canRender = function() {\n    return true;\n  };\n\n  /**\n   * @private\n   */\n  DefaultRenderer.prototype.drawShape = function drawShape(visuals, element, attrs) {\n    var rect = create$1('rect');\n\n    attr$1(rect, {\n      x: 0,\n      y: 0,\n      width: element.width || 0,\n      height: element.height || 0\n    });\n\n    if (isFrameElement(element)) {\n      attr$1(rect, assign$1({}, this.FRAME_STYLE, attrs || {}));\n    } else {\n      attr$1(rect, assign$1({}, this.SHAPE_STYLE, attrs || {}));\n    }\n\n    append(visuals, rect);\n\n    return rect;\n  };\n\n  /**\n   * @private\n   */\n  DefaultRenderer.prototype.drawConnection = function drawConnection(visuals, connection, attrs) {\n\n    var line = createLine(connection.waypoints, assign$1({}, this.CONNECTION_STYLE, attrs || {}));\n    append(visuals, line);\n\n    return line;\n  };\n\n  /**\n   * @private\n   */\n  DefaultRenderer.prototype.getShapePath = function getShapePath(shape) {\n\n    var x = shape.x,\n        y = shape.y,\n        width = shape.width,\n        height = shape.height;\n\n    var shapePath = [\n      [ 'M', x, y ],\n      [ 'l', width, 0 ],\n      [ 'l', 0, height ],\n      [ 'l', -width, 0 ],\n      [ 'z' ]\n    ];\n\n    return componentsToPath(shapePath);\n  };\n\n  /**\n   * @private\n   */\n  DefaultRenderer.prototype.getConnectionPath = function getConnectionPath(connection) {\n    var waypoints = connection.waypoints;\n\n    var idx, point, connectionPath = [];\n\n    for (idx = 0; (point = waypoints[idx]); idx++) {\n\n      // take invisible docking into account\n      // when creating the path\n      point = point.original || point;\n\n      connectionPath.push([ idx === 0 ? 'M' : 'L', point.x, point.y ]);\n    }\n\n    return componentsToPath(connectionPath);\n  };\n\n  DefaultRenderer.$inject = [ 'eventBus', 'styles' ];\n\n  /**\n   * A component that manages shape styles\n   */\n  function Styles() {\n\n    var defaultTraits = {\n\n      'no-fill': {\n        fill: 'none'\n      },\n      'no-border': {\n        strokeOpacity: 0.0\n      },\n      'no-events': {\n        pointerEvents: 'none'\n      }\n    };\n\n    var self = this;\n\n    /**\n     * Builds a style definition from a className, a list of traits and an object\n     * of additional attributes.\n     *\n     * @param {string} className\n     * @param {string[]} [traits]\n     * @param {Object} [additionalAttrs]\n     *\n     * @return {Object} the style definition\n     */\n    this.cls = function(className, traits, additionalAttrs) {\n      var attrs = this.style(traits, additionalAttrs);\n\n      return assign$1(attrs, { 'class': className });\n    };\n\n    /**\n     * Builds a style definition from a list of traits and an object of additional\n     * attributes.\n     *\n     * @param {string[]} [traits]\n     * @param {Object} additionalAttrs\n     *\n     * @return {Object} the style definition\n     */\n    this.style = function(traits, additionalAttrs) {\n\n      if (!isArray$2(traits) && !additionalAttrs) {\n        additionalAttrs = traits;\n        traits = [];\n      }\n\n      var attrs = reduce(traits, function(attrs, t) {\n        return assign$1(attrs, defaultTraits[t] || {});\n      }, {});\n\n      return additionalAttrs ? assign$1(attrs, additionalAttrs) : attrs;\n    };\n\n\n    /**\n     * Computes a style definition from a list of traits and an object of\n     * additional attributes, with custom style definition object.\n     *\n     * @param {Object} custom\n     * @param {string[]} [traits]\n     * @param {Object} defaultStyles\n     *\n     * @return {Object} the style definition\n     */\n    this.computeStyle = function(custom, traits, defaultStyles) {\n      if (!isArray$2(traits)) {\n        defaultStyles = traits;\n        traits = [];\n      }\n\n      return self.style(traits || [], assign$1({}, defaultStyles, custom || {}));\n    };\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var DrawModule = {\n    __init__: [ 'defaultRenderer' ],\n    defaultRenderer: [ 'type', DefaultRenderer ],\n    styles: [ 'type', Styles ]\n  };\n\n  /**\n   * Failsafe remove an element from a collection\n   *\n   * @param {Array<Object>} [collection]\n   * @param {Object} [element]\n   *\n   * @return {number} the previous index of the element\n   */\n  function remove(collection, element) {\n\n    if (!collection || !element) {\n      return -1;\n    }\n\n    var idx = collection.indexOf(element);\n\n    if (idx !== -1) {\n      collection.splice(idx, 1);\n    }\n\n    return idx;\n  }\n\n  /**\n   * Fail save add an element to the given connection, ensuring\n   * it does not yet exist.\n   *\n   * @param {Array<Object>} collection\n   * @param {Object} element\n   * @param {number} [idx]\n   */\n  function add(collection, element, idx) {\n\n    if (!collection || !element) {\n      return;\n    }\n\n    if (typeof idx !== 'number') {\n      idx = -1;\n    }\n\n    var currentIdx = collection.indexOf(element);\n\n    if (currentIdx !== -1) {\n\n      if (currentIdx === idx) {\n\n        // nothing to do, position has not changed\n        return;\n      } else {\n\n        if (idx !== -1) {\n\n          // remove from current position\n          collection.splice(currentIdx, 1);\n        } else {\n\n          // already exists in collection\n          return;\n        }\n      }\n    }\n\n    if (idx !== -1) {\n\n      // insert at specified position\n      collection.splice(idx, 0, element);\n    } else {\n\n      // push to end\n      collection.push(element);\n    }\n  }\n\n  /**\n   * @typedef {import('./Types').ConnectionLike} ConnectionLike\n   * @typedef {import('./Types').RootLike} RootLike\n   * @typedef {import('./Types').ParentLike } ParentLike\n   * @typedef {import('./Types').ShapeLike} ShapeLike\n   *\n   * @typedef { {\n   *   container?: HTMLElement;\n   *   deferUpdate?: boolean;\n   *   width?: number;\n   *   height?: number;\n   * } } CanvasConfig\n   * @typedef { {\n   *   group: SVGElement;\n   *   index: number;\n   *   visible: boolean;\n   * } } CanvasLayer\n   * @typedef { {\n   *   [key: string]: CanvasLayer;\n   * } } CanvasLayers\n   * @typedef { {\n   *   rootElement: ShapeLike;\n   *   layer: CanvasLayer;\n   * } } CanvasPlane\n   * @typedef { {\n   *   scale: number;\n   *   inner: Rect;\n   *   outer: Dimensions;\n   * } & Rect } CanvasViewbox\n   *\n   * @typedef {import('./ElementRegistry').default} ElementRegistry\n   * @typedef {import('./EventBus').default} EventBus\n   * @typedef {import('./GraphicsFactory').default} GraphicsFactory\n   *\n   * @typedef {import('../util/Types').Dimensions} Dimensions\n   * @typedef {import('../util/Types').Point} Point\n   * @typedef {import('../util/Types').Rect} Rect\n   * @typedef {import('../util/Types').RectTRBL} RectTRBL\n   */\n\n  function round(number, resolution) {\n    return Math.round(number * resolution) / resolution;\n  }\n\n  function ensurePx(number) {\n    return isNumber(number) ? number + 'px' : number;\n  }\n\n  function findRoot(element) {\n    while (element.parent) {\n      element = element.parent;\n    }\n\n    return element;\n  }\n\n  /**\n   * Creates a HTML container element for a SVG element with\n   * the given configuration\n   *\n   * @param {CanvasConfig} options\n   *\n   * @return {HTMLElement} the container element\n   */\n  function createContainer(options) {\n\n    options = assign$1({}, { width: '100%', height: '100%' }, options);\n\n    const container = options.container || document.body;\n\n    // create a <div> around the svg element with the respective size\n    // this way we can always get the correct container size\n    // (this is impossible for <svg> elements at the moment)\n    const parent = document.createElement('div');\n    parent.setAttribute('class', 'djs-container djs-parent');\n\n    assign(parent, {\n      position: 'relative',\n      overflow: 'hidden',\n      width: ensurePx(options.width),\n      height: ensurePx(options.height)\n    });\n\n    container.appendChild(parent);\n\n    return parent;\n  }\n\n  function createGroup(parent, cls, childIndex) {\n    const group = create$1('g');\n    classes$1(group).add(cls);\n\n    const index = childIndex !== undefined ? childIndex : parent.childNodes.length - 1;\n\n    // must ensure second argument is node or _null_\n    // cf. https://developer.mozilla.org/en-US/docs/Web/API/Node/insertBefore\n    parent.insertBefore(group, parent.childNodes[index] || null);\n\n    return group;\n  }\n\n  const BASE_LAYER = 'base';\n\n  // render plane contents behind utility layers\n  const PLANE_LAYER_INDEX = 0;\n  const UTILITY_LAYER_INDEX = 1;\n\n\n  const REQUIRED_MODEL_ATTRS = {\n    shape: [ 'x', 'y', 'width', 'height' ],\n    connection: [ 'waypoints' ]\n  };\n\n  /**\n   * The main drawing canvas.\n   *\n   * @class\n   * @constructor\n   *\n   * @emits Canvas#canvas.init\n   *\n   * @param {CanvasConfig|null} config\n   * @param {EventBus} eventBus\n   * @param {GraphicsFactory} graphicsFactory\n   * @param {ElementRegistry} elementRegistry\n   */\n  function Canvas(config, eventBus, graphicsFactory, elementRegistry) {\n    this._eventBus = eventBus;\n    this._elementRegistry = elementRegistry;\n    this._graphicsFactory = graphicsFactory;\n\n    /**\n     * @type {number}\n     */\n    this._rootsIdx = 0;\n\n    /**\n     * @type {CanvasLayers}\n     */\n    this._layers = {};\n\n    /**\n     * @type {CanvasPlane[]}\n     */\n    this._planes = [];\n\n    /**\n     * @type {RootLike|null}\n     */\n    this._rootElement = null;\n\n    this._init(config || {});\n  }\n\n  Canvas.$inject = [\n    'config.canvas',\n    'eventBus',\n    'graphicsFactory',\n    'elementRegistry'\n  ];\n\n  /**\n   * Creates a <svg> element that is wrapped into a <div>.\n   * This way we are always able to correctly figure out the size of the svg element\n   * by querying the parent node.\n\n   * (It is not possible to get the size of a svg element cross browser @ 2014-04-01)\n\n   * <div class=\"djs-container\" style=\"width: {desired-width}, height: {desired-height}\">\n   *   <svg width=\"100%\" height=\"100%\">\n   *    ...\n   *   </svg>\n   * </div>\n   *\n   * @param {CanvasConfig} config\n   */\n  Canvas.prototype._init = function(config) {\n\n    const eventBus = this._eventBus;\n\n    // html container\n    const container = this._container = createContainer(config);\n\n    const svg = this._svg = create$1('svg');\n    attr$1(svg, { width: '100%', height: '100%' });\n\n    append(container, svg);\n\n    const viewport = this._viewport = createGroup(svg, 'viewport');\n\n    // debounce canvas.viewbox.changed events\n    // for smoother diagram interaction\n    if (config.deferUpdate !== false) {\n      this._viewboxChanged = debounce(bind$2(this._viewboxChanged, this), 300);\n    }\n\n    eventBus.on('diagram.init', () => {\n\n      /**\n       * An event indicating that the canvas is ready to be drawn on.\n       *\n       * @memberOf Canvas\n       *\n       * @event canvas.init\n       *\n       * @type {Object}\n       * @property {SVGElement} svg the created svg element\n       * @property {SVGElement} viewport the direct parent of diagram elements and shapes\n       */\n      eventBus.fire('canvas.init', {\n        svg: svg,\n        viewport: viewport\n      });\n\n    });\n\n    // reset viewbox on shape changes to\n    // recompute the viewbox\n    eventBus.on([\n      'shape.added',\n      'connection.added',\n      'shape.removed',\n      'connection.removed',\n      'elements.changed',\n      'root.set'\n    ], () => {\n      delete this._cachedViewbox;\n    });\n\n    eventBus.on('diagram.destroy', 500, this._destroy, this);\n    eventBus.on('diagram.clear', 500, this._clear, this);\n  };\n\n  Canvas.prototype._destroy = function() {\n    this._eventBus.fire('canvas.destroy', {\n      svg: this._svg,\n      viewport: this._viewport\n    });\n\n    const parent = this._container.parentNode;\n\n    if (parent) {\n      parent.removeChild(this._container);\n    }\n\n    delete this._svg;\n    delete this._container;\n    delete this._layers;\n    delete this._planes;\n    delete this._rootElement;\n    delete this._viewport;\n  };\n\n  Canvas.prototype._clear = function() {\n\n    const allElements = this._elementRegistry.getAll();\n\n    // remove all elements\n    allElements.forEach(element => {\n      const type = getType(element);\n\n      if (type === 'root') {\n        this.removeRootElement(element);\n      } else {\n        this._removeElement(element, type);\n      }\n    });\n\n    // remove all planes\n    this._planes = [];\n    this._rootElement = null;\n\n    // force recomputation of view box\n    delete this._cachedViewbox;\n  };\n\n  /**\n   * Returns the default layer on which\n   * all elements are drawn.\n   *\n   * @return {SVGElement}  The SVG element of the layer.\n   */\n  Canvas.prototype.getDefaultLayer = function() {\n    return this.getLayer(BASE_LAYER, PLANE_LAYER_INDEX);\n  };\n\n  /**\n   * Returns a layer that is used to draw elements\n   * or annotations on it.\n   *\n   * Non-existing layers retrieved through this method\n   * will be created. During creation, the optional index\n   * may be used to create layers below or above existing layers.\n   * A layer with a certain index is always created above all\n   * existing layers with the same index.\n   *\n   * @param {string} name The name of the layer.\n   * @param {number} [index] The index of the layer.\n   *\n   * @return {SVGElement} The SVG element of the layer.\n   */\n  Canvas.prototype.getLayer = function(name, index) {\n\n    if (!name) {\n      throw new Error('must specify a name');\n    }\n\n    let layer = this._layers[name];\n\n    if (!layer) {\n      layer = this._layers[name] = this._createLayer(name, index);\n    }\n\n    // throw an error if layer creation / retrival is\n    // requested on different index\n    if (typeof index !== 'undefined' && layer.index !== index) {\n      throw new Error('layer <' + name + '> already created at index <' + index + '>');\n    }\n\n    return layer.group;\n  };\n\n  /**\n   * For a given index, return the number of layers that have a higher index and\n   * are visible.\n   *\n   * This is used to determine the node a layer should be inserted at.\n   *\n   * @param {number} index\n   *\n   * @return {number}\n   */\n  Canvas.prototype._getChildIndex = function(index) {\n    return reduce(this._layers, function(childIndex, layer) {\n      if (layer.visible && index >= layer.index) {\n        childIndex++;\n      }\n\n      return childIndex;\n    }, 0);\n  };\n\n  /**\n   * Creates a given layer and returns it.\n   *\n   * @param {string} name\n   * @param {number} [index=0]\n   *\n   * @return {CanvasLayer}\n   */\n  Canvas.prototype._createLayer = function(name, index) {\n\n    if (typeof index === 'undefined') {\n      index = UTILITY_LAYER_INDEX;\n    }\n\n    const childIndex = this._getChildIndex(index);\n\n    return {\n      group: createGroup(this._viewport, 'layer-' + name, childIndex),\n      index: index,\n      visible: true\n    };\n  };\n\n\n  /**\n   * Shows a given layer.\n   *\n   * @param {string} name The name of the layer.\n   *\n   * @return {SVGElement} The SVG element of the layer.\n   */\n  Canvas.prototype.showLayer = function(name) {\n\n    if (!name) {\n      throw new Error('must specify a name');\n    }\n\n    const layer = this._layers[name];\n\n    if (!layer) {\n      throw new Error('layer <' + name + '> does not exist');\n    }\n\n    const viewport = this._viewport;\n    const group = layer.group;\n    const index = layer.index;\n\n    if (layer.visible) {\n      return group;\n    }\n\n    const childIndex = this._getChildIndex(index);\n\n    viewport.insertBefore(group, viewport.childNodes[childIndex] || null);\n\n    layer.visible = true;\n\n    return group;\n  };\n\n  /**\n   * Hides a given layer.\n   *\n   * @param {string} name The name of the layer.\n   *\n   * @return {SVGElement} The SVG element of the layer.\n   */\n  Canvas.prototype.hideLayer = function(name) {\n\n    if (!name) {\n      throw new Error('must specify a name');\n    }\n\n    const layer = this._layers[name];\n\n    if (!layer) {\n      throw new Error('layer <' + name + '> does not exist');\n    }\n\n    const group = layer.group;\n\n    if (!layer.visible) {\n      return group;\n    }\n\n    remove$2(group);\n\n    layer.visible = false;\n\n    return group;\n  };\n\n\n  Canvas.prototype._removeLayer = function(name) {\n\n    const layer = this._layers[name];\n\n    if (layer) {\n      delete this._layers[name];\n\n      remove$2(layer.group);\n    }\n  };\n\n  /**\n   * Returns the currently active layer. Can be null.\n   *\n   * @return {CanvasLayer|null} The active layer of `null`.\n   */\n  Canvas.prototype.getActiveLayer = function() {\n    const plane = this._findPlaneForRoot(this.getRootElement());\n\n    if (!plane) {\n      return null;\n    }\n\n    return plane.layer;\n  };\n\n\n  /**\n   * Returns the plane which contains the given element.\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element or its ID.\n   *\n   * @return {RootLike|undefined} The root of the element.\n   */\n  Canvas.prototype.findRoot = function(element) {\n    if (typeof element === 'string') {\n      element = this._elementRegistry.get(element);\n    }\n\n    if (!element) {\n      return;\n    }\n\n    const plane = this._findPlaneForRoot(\n      findRoot(element)\n    ) || {};\n\n    return plane.rootElement;\n  };\n\n  /**\n   * Return a list of all root elements on the diagram.\n   *\n   * @return {(RootLike)[]} The list of root elements.\n   */\n  Canvas.prototype.getRootElements = function() {\n    return this._planes.map(function(plane) {\n      return plane.rootElement;\n    });\n  };\n\n  Canvas.prototype._findPlaneForRoot = function(rootElement) {\n    return find(this._planes, function(plane) {\n      return plane.rootElement === rootElement;\n    });\n  };\n\n\n  /**\n   * Returns the html element that encloses the\n   * drawing canvas.\n   *\n   * @return {HTMLElement} The HTML element of the container.\n   */\n  Canvas.prototype.getContainer = function() {\n    return this._container;\n  };\n\n\n  // markers //////////////////////\n\n  Canvas.prototype._updateMarker = function(element, marker, add) {\n    let container;\n\n    if (!element.id) {\n      element = this._elementRegistry.get(element);\n    }\n\n    // we need to access all\n    container = this._elementRegistry._elements[element.id];\n\n    if (!container) {\n      return;\n    }\n\n    forEach$1([ container.gfx, container.secondaryGfx ], function(gfx) {\n      if (gfx) {\n\n        // invoke either addClass or removeClass based on mode\n        if (add) {\n          classes$1(gfx).add(marker);\n        } else {\n          classes$1(gfx).remove(marker);\n        }\n      }\n    });\n\n    /**\n     * An event indicating that a marker has been updated for an element\n     *\n     * @event element.marker.update\n     * @type {Object}\n     * @property {Element} element the shape\n     * @property {SVGElement} gfx the graphical representation of the shape\n     * @property {string} marker\n     * @property {boolean} add true if the marker was added, false if it got removed\n     */\n    this._eventBus.fire('element.marker.update', { element: element, gfx: container.gfx, marker: marker, add: !!add });\n  };\n\n\n  /**\n   * Adds a marker to an element (basically a css class).\n   *\n   * Fires the element.marker.update event, making it possible to\n   * integrate extension into the marker life-cycle, too.\n   *\n   * @example\n   *\n   * ```javascript\n   * canvas.addMarker('foo', 'some-marker');\n   *\n   * const fooGfx = canvas.getGraphics('foo');\n   *\n   * fooGfx; // <g class=\"... some-marker\"> ... </g>\n   * ```\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element or its ID.\n   * @param {string} marker The marker.\n   */\n  Canvas.prototype.addMarker = function(element, marker) {\n    this._updateMarker(element, marker, true);\n  };\n\n\n  /**\n   * Remove a marker from an element.\n   *\n   * Fires the element.marker.update event, making it possible to\n   * integrate extension into the marker life-cycle, too.\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element or its ID.\n   * @param {string} marker The marker.\n   */\n  Canvas.prototype.removeMarker = function(element, marker) {\n    this._updateMarker(element, marker, false);\n  };\n\n  /**\n   * Check whether an element has a given marker.\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element or its ID.\n   * @param {string} marker The marker.\n   */\n  Canvas.prototype.hasMarker = function(element, marker) {\n    if (!element.id) {\n      element = this._elementRegistry.get(element);\n    }\n\n    const gfx = this.getGraphics(element);\n\n    return classes$1(gfx).has(marker);\n  };\n\n  /**\n   * Toggles a marker on an element.\n   *\n   * Fires the element.marker.update event, making it possible to\n   * integrate extension into the marker life-cycle, too.\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element or its ID.\n   * @param {string} marker The marker.\n   */\n  Canvas.prototype.toggleMarker = function(element, marker) {\n    if (this.hasMarker(element, marker)) {\n      this.removeMarker(element, marker);\n    } else {\n      this.addMarker(element, marker);\n    }\n  };\n\n  /**\n   * Returns the current root element.\n   *\n   * Supports two different modes for handling root elements:\n   *\n   * 1. if no root element has been added before, an implicit root will be added\n   * and returned. This is used in applications that don't require explicit\n   * root elements.\n   *\n   * 2. when root elements have been added before calling `getRootElement`,\n   * root elements can be null. This is used for applications that want to manage\n   * root elements themselves.\n   *\n   * @return {RootLike} The current root element.\n   */\n  Canvas.prototype.getRootElement = function() {\n    const rootElement = this._rootElement;\n\n    // can return null if root elements are present but none was set yet\n    if (rootElement || this._planes.length) {\n      return rootElement;\n    }\n\n    return this.setRootElement(this.addRootElement(null));\n  };\n\n  /**\n   * Adds a given root element and returns it.\n   *\n   * @param {RootLike} [rootElement] The root element to be added.\n   *\n   * @return {RootLike} The added root element or an implicit root element.\n   */\n  Canvas.prototype.addRootElement = function(rootElement) {\n    const idx = this._rootsIdx++;\n\n    if (!rootElement) {\n      rootElement = {\n        id: '__implicitroot_' + idx,\n        children: [],\n        isImplicit: true\n      };\n    }\n\n    const layerName = rootElement.layer = 'root-' + idx;\n\n    this._ensureValid('root', rootElement);\n\n    const layer = this.getLayer(layerName, PLANE_LAYER_INDEX);\n\n    this.hideLayer(layerName);\n\n    this._addRoot(rootElement, layer);\n\n    this._planes.push({\n      rootElement: rootElement,\n      layer: layer\n    });\n\n    return rootElement;\n  };\n\n  /**\n   * Removes a given root element and returns it.\n   *\n   * @param {RootLike|string} rootElement element or element ID\n   *\n   * @return {RootLike|undefined} removed element\n   */\n  Canvas.prototype.removeRootElement = function(rootElement) {\n\n    if (typeof rootElement === 'string') {\n      rootElement = this._elementRegistry.get(rootElement);\n    }\n\n    const plane = this._findPlaneForRoot(rootElement);\n\n    if (!plane) {\n      return;\n    }\n\n    // hook up life-cycle events\n    this._removeRoot(rootElement);\n\n    // clean up layer\n    this._removeLayer(rootElement.layer);\n\n    // clean up plane\n    this._planes = this._planes.filter(function(plane) {\n      return plane.rootElement !== rootElement;\n    });\n\n    // clean up active root\n    if (this._rootElement === rootElement) {\n      this._rootElement = null;\n    }\n\n    return rootElement;\n  };\n\n\n  /**\n   * Sets a given element as the new root element for the canvas\n   * and returns the new root element.\n   *\n   * @param {RootLike} rootElement The root element to be set.\n   *\n   * @return {RootLike} The set root element.\n   */\n  Canvas.prototype.setRootElement = function(rootElement) {\n\n    if (rootElement === this._rootElement) {\n      return;\n    }\n\n    let plane;\n\n    if (!rootElement) {\n      throw new Error('rootElement required');\n    }\n\n    plane = this._findPlaneForRoot(rootElement);\n\n    // give set add semantics for backwards compatibility\n    if (!plane) {\n      rootElement = this.addRootElement(rootElement);\n    }\n\n    this._setRoot(rootElement);\n\n    return rootElement;\n  };\n\n\n  Canvas.prototype._removeRoot = function(element) {\n    const elementRegistry = this._elementRegistry,\n          eventBus = this._eventBus;\n\n    // simulate element remove event sequence\n    eventBus.fire('root.remove', { element: element });\n    eventBus.fire('root.removed', { element: element });\n\n    elementRegistry.remove(element);\n  };\n\n\n  Canvas.prototype._addRoot = function(element, gfx) {\n    const elementRegistry = this._elementRegistry,\n          eventBus = this._eventBus;\n\n    // resemble element add event sequence\n    eventBus.fire('root.add', { element: element });\n\n    elementRegistry.add(element, gfx);\n\n    eventBus.fire('root.added', { element: element, gfx: gfx });\n  };\n\n\n  Canvas.prototype._setRoot = function(rootElement, layer) {\n\n    const currentRoot = this._rootElement;\n\n    if (currentRoot) {\n\n      // un-associate previous root element <svg>\n      this._elementRegistry.updateGraphics(currentRoot, null, true);\n\n      // hide previous layer\n      this.hideLayer(currentRoot.layer);\n    }\n\n    if (rootElement) {\n\n      if (!layer) {\n        layer = this._findPlaneForRoot(rootElement).layer;\n      }\n\n      // associate element with <svg>\n      this._elementRegistry.updateGraphics(rootElement, this._svg, true);\n\n      // show root layer\n      this.showLayer(rootElement.layer);\n    }\n\n    this._rootElement = rootElement;\n\n    this._eventBus.fire('root.set', { element: rootElement });\n  };\n\n  Canvas.prototype._ensureValid = function(type, element) {\n    if (!element.id) {\n      throw new Error('element must have an id');\n    }\n\n    if (this._elementRegistry.get(element.id)) {\n      throw new Error('element <' + element.id + '> already exists');\n    }\n\n    const requiredAttrs = REQUIRED_MODEL_ATTRS[type];\n\n    const valid = every(requiredAttrs, function(attr) {\n      return typeof element[attr] !== 'undefined';\n    });\n\n    if (!valid) {\n      throw new Error(\n        'must supply { ' + requiredAttrs.join(', ') + ' } with ' + type);\n    }\n  };\n\n  Canvas.prototype._setParent = function(element, parent, parentIndex) {\n    add(parent.children, element, parentIndex);\n    element.parent = parent;\n  };\n\n  /**\n   * Adds an element to the canvas.\n   *\n   * This wires the parent <-> child relationship between the element and\n   * a explicitly specified parent or an implicit root element.\n   *\n   * During add it emits the events\n   *\n   *  * <{type}.add> (element, parent)\n   *  * <{type}.added> (element, gfx)\n   *\n   * Extensions may hook into these events to perform their magic.\n   *\n   * @param {string} type\n   * @param {ConnectionLike|ShapeLike} element\n   * @param {ShapeLike} [parent]\n   * @param {number} [parentIndex]\n   *\n   * @return {ConnectionLike|ShapeLike} The added element.\n   */\n  Canvas.prototype._addElement = function(type, element, parent, parentIndex) {\n\n    parent = parent || this.getRootElement();\n\n    const eventBus = this._eventBus,\n          graphicsFactory = this._graphicsFactory;\n\n    this._ensureValid(type, element);\n\n    eventBus.fire(type + '.add', { element: element, parent: parent });\n\n    this._setParent(element, parent, parentIndex);\n\n    // create graphics\n    const gfx = graphicsFactory.create(type, element, parentIndex);\n\n    this._elementRegistry.add(element, gfx);\n\n    // update its visual\n    graphicsFactory.update(type, element, gfx);\n\n    eventBus.fire(type + '.added', { element: element, gfx: gfx });\n\n    return element;\n  };\n\n  /**\n   * Adds a shape to the canvas.\n   *\n   * @param {ShapeLike} shape The shape to be added\n   * @param {ParentLike} [parent] The shape's parent.\n   * @param {number} [parentIndex] The index at which to add the shape to the parent's children.\n   *\n   * @return {ShapeLike} The added shape.\n   */\n  Canvas.prototype.addShape = function(shape, parent, parentIndex) {\n    return this._addElement('shape', shape, parent, parentIndex);\n  };\n\n  /**\n   * Adds a connection to the canvas.\n   *\n   * @param {ConnectionLike} connection The connection to be added.\n   * @param {ParentLike} [parent] The connection's parent.\n   * @param {number} [parentIndex] The index at which to add the connection to the parent's children.\n   *\n   * @return {ConnectionLike} The added connection.\n   */\n  Canvas.prototype.addConnection = function(connection, parent, parentIndex) {\n    return this._addElement('connection', connection, parent, parentIndex);\n  };\n\n\n  /**\n   * Internal remove element\n   */\n  Canvas.prototype._removeElement = function(element, type) {\n\n    const elementRegistry = this._elementRegistry,\n          graphicsFactory = this._graphicsFactory,\n          eventBus = this._eventBus;\n\n    element = elementRegistry.get(element.id || element);\n\n    if (!element) {\n\n      // element was removed already\n      return;\n    }\n\n    eventBus.fire(type + '.remove', { element: element });\n\n    graphicsFactory.remove(element);\n\n    // unset parent <-> child relationship\n    remove(element.parent && element.parent.children, element);\n    element.parent = null;\n\n    eventBus.fire(type + '.removed', { element: element });\n\n    elementRegistry.remove(element);\n\n    return element;\n  };\n\n\n  /**\n   * Removes a shape from the canvas.\n   *\n   * @fires ShapeRemoveEvent\n   * @fires ShapeRemovedEvent\n   *\n   * @param {ShapeLike|string} shape The shape or its ID.\n   *\n   * @return {ShapeLike} The removed shape.\n   */\n  Canvas.prototype.removeShape = function(shape) {\n\n    /**\n     * An event indicating that a shape is about to be removed from the canvas.\n     *\n     * @memberOf Canvas\n     *\n     * @event ShapeRemoveEvent\n     * @type {Object}\n     * @property {ShapeLike} element The shape.\n     * @property {SVGElement} gfx The graphical element.\n     */\n\n    /**\n     * An event indicating that a shape has been removed from the canvas.\n     *\n     * @memberOf Canvas\n     *\n     * @event ShapeRemovedEvent\n     * @type {Object}\n     * @property {ShapeLike} element The shape.\n     * @property {SVGElement} gfx The graphical element.\n     */\n    return this._removeElement(shape, 'shape');\n  };\n\n\n  /**\n   * Removes a connection from the canvas.\n   *\n   * @fires ConnectionRemoveEvent\n   * @fires ConnectionRemovedEvent\n   *\n   * @param {ConnectionLike|string} connection The connection or its ID.\n   *\n   * @return {ConnectionLike} The removed connection.\n   */\n  Canvas.prototype.removeConnection = function(connection) {\n\n    /**\n     * An event indicating that a connection is about to be removed from the canvas.\n     *\n     * @memberOf Canvas\n     *\n     * @event ConnectionRemoveEvent\n     * @type {Object}\n     * @property {ConnectionLike} element The connection.\n     * @property {SVGElement} gfx The graphical element.\n     */\n\n    /**\n     * An event indicating that a connection has been removed from the canvas.\n     *\n     * @memberOf Canvas\n     *\n     * @event ConnectionRemovedEvent\n     * @type {Object}\n     * @property {ConnectionLike} element The connection.\n     * @property {SVGElement} gfx The graphical element.\n     */\n    return this._removeElement(connection, 'connection');\n  };\n\n\n  /**\n   * Returns the graphical element of an element.\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element or its ID.\n   * @param {boolean} [secondary=false] Whether to return the secondary graphical element.\n   *\n   * @return {SVGElement} The graphical element.\n   */\n  Canvas.prototype.getGraphics = function(element, secondary) {\n    return this._elementRegistry.getGraphics(element, secondary);\n  };\n\n\n  /**\n   * Perform a viewbox update via a given change function.\n   *\n   * @param {Function} changeFn\n   */\n  Canvas.prototype._changeViewbox = function(changeFn) {\n\n    // notify others of the upcoming viewbox change\n    this._eventBus.fire('canvas.viewbox.changing');\n\n    // perform actual change\n    changeFn.apply(this);\n\n    // reset the cached viewbox so that\n    // a new get operation on viewbox or zoom\n    // triggers a viewbox re-computation\n    this._cachedViewbox = null;\n\n    // notify others of the change; this step\n    // may or may not be debounced\n    this._viewboxChanged();\n  };\n\n  Canvas.prototype._viewboxChanged = function() {\n    this._eventBus.fire('canvas.viewbox.changed', { viewbox: this.viewbox() });\n  };\n\n\n  /**\n   * Gets or sets the view box of the canvas, i.e. the\n   * area that is currently displayed.\n   *\n   * The getter may return a cached viewbox (if it is currently\n   * changing). To force a recomputation, pass `false` as the first argument.\n   *\n   * @example\n   *\n   * ```javascript\n   * canvas.viewbox({ x: 100, y: 100, width: 500, height: 500 })\n   *\n   * // sets the visible area of the diagram to (100|100) -> (600|100)\n   * // and and scales it according to the diagram width\n   *\n   * const viewbox = canvas.viewbox(); // pass `false` to force recomputing the box.\n   *\n   * console.log(viewbox);\n   * // {\n   * //   inner: Dimensions,\n   * //   outer: Dimensions,\n   * //   scale,\n   * //   x, y,\n   * //   width, height\n   * // }\n   *\n   * // if the current diagram is zoomed and scrolled, you may reset it to the\n   * // default zoom via this method, too:\n   *\n   * const zoomedAndScrolledViewbox = canvas.viewbox();\n   *\n   * canvas.viewbox({\n   *   x: 0,\n   *   y: 0,\n   *   width: zoomedAndScrolledViewbox.outer.width,\n   *   height: zoomedAndScrolledViewbox.outer.height\n   * });\n   * ```\n   *\n   * @param {Rect} [box] The viewbox to be set.\n   *\n   * @return {CanvasViewbox} The set viewbox.\n   */\n  Canvas.prototype.viewbox = function(box) {\n\n    if (box === undefined && this._cachedViewbox) {\n      return this._cachedViewbox;\n    }\n\n    const viewport = this._viewport,\n          outerBox = this.getSize();\n    let innerBox,\n        matrix,\n        activeLayer,\n        transform,\n        scale,\n        x, y;\n\n    if (!box) {\n\n      // compute the inner box based on the\n      // diagrams active layer. This allows us to exclude\n      // external components, such as overlays\n\n      activeLayer = this._rootElement ? this.getActiveLayer() : null;\n      innerBox = activeLayer && activeLayer.getBBox() || {};\n\n      transform = transform$1(viewport);\n      matrix = transform ? transform.matrix : createMatrix();\n      scale = round(matrix.a, 1000);\n\n      x = round(-matrix.e || 0, 1000);\n      y = round(-matrix.f || 0, 1000);\n\n      box = this._cachedViewbox = {\n        x: x ? x / scale : 0,\n        y: y ? y / scale : 0,\n        width: outerBox.width / scale,\n        height: outerBox.height / scale,\n        scale: scale,\n        inner: {\n          width: innerBox.width || 0,\n          height: innerBox.height || 0,\n          x: innerBox.x || 0,\n          y: innerBox.y || 0\n        },\n        outer: outerBox\n      };\n\n      return box;\n    } else {\n\n      this._changeViewbox(function() {\n        scale = Math.min(outerBox.width / box.width, outerBox.height / box.height);\n\n        const matrix = this._svg.createSVGMatrix()\n          .scale(scale)\n          .translate(-box.x, -box.y);\n\n        transform$1(viewport, matrix);\n      });\n    }\n\n    return box;\n  };\n\n\n  /**\n   * Gets or sets the scroll of the canvas.\n   *\n   * @param {Point} [delta] The scroll to be set.\n   *\n   * @return {Point}\n   */\n  Canvas.prototype.scroll = function(delta) {\n\n    const node = this._viewport;\n    let matrix = node.getCTM();\n\n    if (delta) {\n      this._changeViewbox(function() {\n        delta = assign$1({ dx: 0, dy: 0 }, delta || {});\n\n        matrix = this._svg.createSVGMatrix().translate(delta.dx, delta.dy).multiply(matrix);\n\n        setCTM(node, matrix);\n      });\n    }\n\n    return { x: matrix.e, y: matrix.f };\n  };\n\n  /**\n   * Scrolls the viewbox to contain the given element.\n   * Optionally specify a padding to be applied to the edges.\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element to scroll to or its ID.\n   * @param {RectTRBL|number} [padding=100] The padding to be applied. Can also specify top, bottom, left and right.\n   */\n  Canvas.prototype.scrollToElement = function(element, padding) {\n    let defaultPadding = 100;\n\n    if (typeof element === 'string') {\n      element = this._elementRegistry.get(element);\n    }\n\n    // set to correct rootElement\n    const rootElement = this.findRoot(element);\n\n    if (rootElement !== this.getRootElement()) {\n      this.setRootElement(rootElement);\n    }\n\n    if (!padding) {\n      padding = {};\n    }\n    if (typeof padding === 'number') {\n      defaultPadding = padding;\n    }\n\n    padding = {\n      top: padding.top || defaultPadding,\n      right: padding.right || defaultPadding,\n      bottom: padding.bottom || defaultPadding,\n      left: padding.left || defaultPadding\n    };\n\n    const elementBounds = getBBox(element),\n          elementTrbl = asTRBL(elementBounds),\n          viewboxBounds = this.viewbox(),\n          zoom = this.zoom();\n    let dx, dy;\n\n    // shrink viewboxBounds with padding\n    viewboxBounds.y += padding.top / zoom;\n    viewboxBounds.x += padding.left / zoom;\n    viewboxBounds.width -= (padding.right + padding.left) / zoom;\n    viewboxBounds.height -= (padding.bottom + padding.top) / zoom;\n\n    const viewboxTrbl = asTRBL(viewboxBounds);\n\n    const canFit = elementBounds.width < viewboxBounds.width && elementBounds.height < viewboxBounds.height;\n\n    if (!canFit) {\n\n      // top-left when element can't fit\n      dx = elementBounds.x - viewboxBounds.x;\n      dy = elementBounds.y - viewboxBounds.y;\n\n    } else {\n\n      const dRight = Math.max(0, elementTrbl.right - viewboxTrbl.right),\n            dLeft = Math.min(0, elementTrbl.left - viewboxTrbl.left),\n            dBottom = Math.max(0, elementTrbl.bottom - viewboxTrbl.bottom),\n            dTop = Math.min(0, elementTrbl.top - viewboxTrbl.top);\n\n      dx = dRight || dLeft;\n      dy = dBottom || dTop;\n\n    }\n\n    this.scroll({ dx: -dx * zoom, dy: -dy * zoom });\n  };\n\n  /**\n   * Gets or sets the current zoom of the canvas, optionally zooming to the\n   * specified position.\n   *\n   * The getter may return a cached zoom level. Call it with `false` as the first\n   * argument to force recomputation of the current level.\n   *\n   * @param {number|'fit-viewport'} [newScale] The new zoom level, either a number,\n   * i.e. 0.9, or `fit-viewport` to adjust the size to fit the current viewport.\n   * @param {Point} [center] The reference point { x: ..., y: ...} to zoom to.\n   *\n   * @return {number} The set zoom level.\n   */\n  Canvas.prototype.zoom = function(newScale, center) {\n\n    if (!newScale) {\n      return this.viewbox(newScale).scale;\n    }\n\n    if (newScale === 'fit-viewport') {\n      return this._fitViewport(center);\n    }\n\n    let outer,\n        matrix;\n\n    this._changeViewbox(function() {\n\n      if (typeof center !== 'object') {\n        outer = this.viewbox().outer;\n\n        center = {\n          x: outer.width / 2,\n          y: outer.height / 2\n        };\n      }\n\n      matrix = this._setZoom(newScale, center);\n    });\n\n    return round(matrix.a, 1000);\n  };\n\n  function setCTM(node, m) {\n    const mstr = 'matrix(' + m.a + ',' + m.b + ',' + m.c + ',' + m.d + ',' + m.e + ',' + m.f + ')';\n    node.setAttribute('transform', mstr);\n  }\n\n  Canvas.prototype._fitViewport = function(center) {\n\n    const vbox = this.viewbox(),\n          outer = vbox.outer,\n          inner = vbox.inner;\n    let newScale,\n        newViewbox;\n\n    // display the complete diagram without zooming in.\n    // instead of relying on internal zoom, we perform a\n    // hard reset on the canvas viewbox to realize this\n    //\n    // if diagram does not need to be zoomed in, we focus it around\n    // the diagram origin instead\n\n    if (inner.x >= 0 &&\n        inner.y >= 0 &&\n        inner.x + inner.width <= outer.width &&\n        inner.y + inner.height <= outer.height &&\n        !center) {\n\n      newViewbox = {\n        x: 0,\n        y: 0,\n        width: Math.max(inner.width + inner.x, outer.width),\n        height: Math.max(inner.height + inner.y, outer.height)\n      };\n    } else {\n\n      newScale = Math.min(1, outer.width / inner.width, outer.height / inner.height);\n      newViewbox = {\n        x: inner.x + (center ? inner.width / 2 - outer.width / newScale / 2 : 0),\n        y: inner.y + (center ? inner.height / 2 - outer.height / newScale / 2 : 0),\n        width: outer.width / newScale,\n        height: outer.height / newScale\n      };\n    }\n\n    this.viewbox(newViewbox);\n\n    return this.viewbox(false).scale;\n  };\n\n\n  Canvas.prototype._setZoom = function(scale, center) {\n\n    const svg = this._svg,\n          viewport = this._viewport;\n\n    const matrix = svg.createSVGMatrix();\n    const point = svg.createSVGPoint();\n\n    let centerPoint,\n        originalPoint,\n        currentMatrix,\n        scaleMatrix,\n        newMatrix;\n\n    currentMatrix = viewport.getCTM();\n\n    const currentScale = currentMatrix.a;\n\n    if (center) {\n      centerPoint = assign$1(point, center);\n\n      // revert applied viewport transformations\n      originalPoint = centerPoint.matrixTransform(currentMatrix.inverse());\n\n      // create scale matrix\n      scaleMatrix = matrix\n        .translate(originalPoint.x, originalPoint.y)\n        .scale(1 / currentScale * scale)\n        .translate(-originalPoint.x, -originalPoint.y);\n\n      newMatrix = currentMatrix.multiply(scaleMatrix);\n    } else {\n      newMatrix = matrix.scale(scale);\n    }\n\n    setCTM(this._viewport, newMatrix);\n\n    return newMatrix;\n  };\n\n\n  /**\n   * Returns the size of the canvas.\n   *\n   * @return {Dimensions} The size of the canvas.\n   */\n  Canvas.prototype.getSize = function() {\n    return {\n      width: this._container.clientWidth,\n      height: this._container.clientHeight\n    };\n  };\n\n\n  /**\n   * Returns the absolute bounding box of an element.\n   *\n   * The absolute bounding box may be used to display overlays in the callers\n   * (browser) coordinate system rather than the zoomed in/out canvas coordinates.\n   *\n   * @param {ShapeLike|ConnectionLike} element The element.\n   *\n   * @return {Rect} The element's absolute bounding box.\n   */\n  Canvas.prototype.getAbsoluteBBox = function(element) {\n    const vbox = this.viewbox();\n    let bbox;\n\n    // connection\n    // use svg bbox\n    if (element.waypoints) {\n      const gfx = this.getGraphics(element);\n\n      bbox = gfx.getBBox();\n    }\n\n    // shapes\n    // use data\n    else {\n      bbox = element;\n    }\n\n    const x = bbox.x * vbox.scale - vbox.x * vbox.scale;\n    const y = bbox.y * vbox.scale - vbox.y * vbox.scale;\n\n    const width = bbox.width * vbox.scale;\n    const height = bbox.height * vbox.scale;\n\n    return {\n      x: x,\n      y: y,\n      width: width,\n      height: height\n    };\n  };\n\n  /**\n   * Fires an event so other modules can react to the canvas resizing.\n   */\n  Canvas.prototype.resized = function() {\n\n    // force recomputation of view box\n    delete this._cachedViewbox;\n\n    this._eventBus.fire('canvas.resized');\n  };\n\n  var ELEMENT_ID = 'data-element-id';\n\n  /**\n   * @typedef {import('./Types').ElementLike} ElementLike\n   *\n   * @typedef {import('./EventBus').default} EventBus\n   *\n   * @typedef { (element: ElementLike, gfx: SVGElement) => boolean|any } ElementRegistryFilterCallback\n   * @typedef { (element: ElementLike, gfx: SVGElement) => any } ElementRegistryForEachCallback\n   */\n\n  /**\n   * A registry that keeps track of all shapes in the diagram.\n   *\n   * @class\n   * @constructor\n   *\n   * @param {EventBus} eventBus\n   */\n  function ElementRegistry(eventBus) {\n\n    /**\n     * @type { {\n     *   [id: string]: {\n     *     element: ElementLike;\n     *     gfx?: SVGElement;\n     *     secondaryGfx?: SVGElement;\n     *   }\n     * } }\n     */\n    this._elements = {};\n\n    this._eventBus = eventBus;\n  }\n\n  ElementRegistry.$inject = [ 'eventBus' ];\n\n  /**\n   * Add an element and its graphical representation(s) to the registry.\n   *\n   * @param {ElementLike} element The element to be added.\n   * @param {SVGElement} gfx The primary graphical representation.\n   * @param {SVGElement} [secondaryGfx] The secondary graphical representation.\n   */\n  ElementRegistry.prototype.add = function(element, gfx, secondaryGfx) {\n\n    var id = element.id;\n\n    this._validateId(id);\n\n    // associate dom node with element\n    attr$1(gfx, ELEMENT_ID, id);\n\n    if (secondaryGfx) {\n      attr$1(secondaryGfx, ELEMENT_ID, id);\n    }\n\n    this._elements[id] = { element: element, gfx: gfx, secondaryGfx: secondaryGfx };\n  };\n\n  /**\n   * Remove an element from the registry.\n   *\n   * @param {ElementLike|string} element\n   */\n  ElementRegistry.prototype.remove = function(element) {\n    var elements = this._elements,\n        id = element.id || element,\n        container = id && elements[id];\n\n    if (container) {\n\n      // unset element id on gfx\n      attr$1(container.gfx, ELEMENT_ID, '');\n\n      if (container.secondaryGfx) {\n        attr$1(container.secondaryGfx, ELEMENT_ID, '');\n      }\n\n      delete elements[id];\n    }\n  };\n\n  /**\n   * Update an elements ID.\n   *\n   * @param {ElementLike|string} element The element or its ID.\n   * @param {string} newId The new ID.\n   */\n  ElementRegistry.prototype.updateId = function(element, newId) {\n\n    this._validateId(newId);\n\n    if (typeof element === 'string') {\n      element = this.get(element);\n    }\n\n    this._eventBus.fire('element.updateId', {\n      element: element,\n      newId: newId\n    });\n\n    var gfx = this.getGraphics(element),\n        secondaryGfx = this.getGraphics(element, true);\n\n    this.remove(element);\n\n    element.id = newId;\n\n    this.add(element, gfx, secondaryGfx);\n  };\n\n  /**\n   * Update the graphical representation of an element.\n   *\n   * @param {ElementLike|string} filter The element or its ID.\n   * @param {SVGElement} gfx The new graphical representation.\n   * @param {boolean} [secondary=false] Whether to update the secondary graphical representation.\n   */\n  ElementRegistry.prototype.updateGraphics = function(filter, gfx, secondary) {\n    var id = filter.id || filter;\n\n    var container = this._elements[id];\n\n    if (secondary) {\n      container.secondaryGfx = gfx;\n    } else {\n      container.gfx = gfx;\n    }\n\n    if (gfx) {\n      attr$1(gfx, ELEMENT_ID, id);\n    }\n\n    return gfx;\n  };\n\n  /**\n   * Get the element with the given ID or graphical representation.\n   *\n   * @example\n   *\n   * ```javascript\n   * elementRegistry.get('SomeElementId_1');\n   *\n   * elementRegistry.get(gfx);\n   * ```\n   *\n   * @param {string|SVGElement} filter The elements ID or graphical representation.\n   *\n   * @return {ElementLike|undefined} The element.\n   */\n  ElementRegistry.prototype.get = function(filter) {\n    var id;\n\n    if (typeof filter === 'string') {\n      id = filter;\n    } else {\n      id = filter && attr$1(filter, ELEMENT_ID);\n    }\n\n    var container = this._elements[id];\n    return container && container.element;\n  };\n\n  /**\n   * Return all elements that match a given filter function.\n   *\n   * @param {ElementRegistryFilterCallback} fn The filter function.\n   *\n   * @return {ElementLike[]} The matching elements.\n   */\n  ElementRegistry.prototype.filter = function(fn) {\n\n    var filtered = [];\n\n    this.forEach(function(element, gfx) {\n      if (fn(element, gfx)) {\n        filtered.push(element);\n      }\n    });\n\n    return filtered;\n  };\n\n  /**\n   * Return the first element that matches the given filter function.\n   *\n   * @param {ElementRegistryFilterCallback} fn The filter function.\n   *\n   * @return {ElementLike|undefined} The matching element.\n   */\n  ElementRegistry.prototype.find = function(fn) {\n    var map = this._elements,\n        keys = Object.keys(map);\n\n    for (var i = 0; i < keys.length; i++) {\n      var id = keys[i],\n          container = map[id],\n          element = container.element,\n          gfx = container.gfx;\n\n      if (fn(element, gfx)) {\n        return element;\n      }\n    }\n  };\n\n  /**\n   * Get all elements.\n   *\n   * @return {ElementLike[]} All elements.\n   */\n  ElementRegistry.prototype.getAll = function() {\n    return this.filter(function(e) { return e; });\n  };\n\n  /**\n   * Execute a given function for each element.\n   *\n   * @param {ElementRegistryForEachCallback} fn The function to execute.\n   */\n  ElementRegistry.prototype.forEach = function(fn) {\n\n    var map = this._elements;\n\n    Object.keys(map).forEach(function(id) {\n      var container = map[id],\n          element = container.element,\n          gfx = container.gfx;\n\n      return fn(element, gfx);\n    });\n  };\n\n  /**\n   * Return the graphical representation of an element.\n   *\n   * @example\n   *\n   * ```javascript\n   * elementRegistry.getGraphics('SomeElementId_1');\n   *\n   * elementRegistry.getGraphics(rootElement); // <g ...>\n   *\n   * elementRegistry.getGraphics(rootElement, true); // <svg ...>\n   * ```\n   *\n   * @param {ElementLike|string} filter The element or its ID.\n   * @param {boolean} [secondary=false] Whether to return the secondary graphical representation.\n   *\n   * @return {SVGElement} The graphical representation.\n   */\n  ElementRegistry.prototype.getGraphics = function(filter, secondary) {\n    var id = filter.id || filter;\n\n    var container = this._elements[id];\n    return container && (secondary ? container.secondaryGfx : container.gfx);\n  };\n\n  /**\n   * Validate an ID and throw an error if invalid.\n   *\n   * @param {string} id\n   *\n   * @throws {Error} Error indicating that the ID is invalid or already assigned.\n   */\n  ElementRegistry.prototype._validateId = function(id) {\n    if (!id) {\n      throw new Error('element must have an id');\n    }\n\n    if (this._elements[id]) {\n      throw new Error('element with id ' + id + ' already added');\n    }\n  };\n\n  var objectRefs = {exports: {}};\n\n  var collection = {};\n\n  /**\n   * An empty collection stub. Use {@link RefsCollection.extend} to extend a\n   * collection with ref semantics.\n   *\n   * @class RefsCollection\n   */\n\n  /**\n   * Extends a collection with {@link Refs} aware methods\n   *\n   * @memberof RefsCollection\n   * @static\n   *\n   * @param  {Array<Object>} collection\n   * @param  {Refs} refs instance\n   * @param  {Object} property represented by the collection\n   * @param  {Object} target object the collection is attached to\n   *\n   * @return {RefsCollection<Object>} the extended array\n   */\n  function extend(collection, refs, property, target) {\n\n    var inverseProperty = property.inverse;\n\n    /**\n     * Removes the given element from the array and returns it.\n     *\n     * @method RefsCollection#remove\n     *\n     * @param {Object} element the element to remove\n     */\n    Object.defineProperty(collection, 'remove', {\n      value: function(element) {\n        var idx = this.indexOf(element);\n        if (idx !== -1) {\n          this.splice(idx, 1);\n\n          // unset inverse\n          refs.unset(element, inverseProperty, target);\n        }\n\n        return element;\n      }\n    });\n\n    /**\n     * Returns true if the collection contains the given element\n     *\n     * @method RefsCollection#contains\n     *\n     * @param {Object} element the element to check for\n     */\n    Object.defineProperty(collection, 'contains', {\n      value: function(element) {\n        return this.indexOf(element) !== -1;\n      }\n    });\n\n    /**\n     * Adds an element to the array, unless it exists already (set semantics).\n     *\n     * @method RefsCollection#add\n     *\n     * @param {Object} element the element to add\n     * @param {Number} optional index to add element to\n     *                 (possibly moving other elements around)\n     */\n    Object.defineProperty(collection, 'add', {\n      value: function(element, idx) {\n\n        var currentIdx = this.indexOf(element);\n\n        if (typeof idx === 'undefined') {\n\n          if (currentIdx !== -1) {\n            // element already in collection (!)\n            return;\n          }\n\n          // add to end of array, as no idx is specified\n          idx = this.length;\n        }\n\n        // handle already in collection\n        if (currentIdx !== -1) {\n\n          // remove element from currentIdx\n          this.splice(currentIdx, 1);\n        }\n\n        // add element at idx\n        this.splice(idx, 0, element);\n\n        if (currentIdx === -1) {\n          // set inverse, unless element was\n          // in collection already\n          refs.set(element, inverseProperty, target);\n        }\n      }\n    });\n\n    // a simple marker, identifying this element\n    // as being a refs collection\n    Object.defineProperty(collection, '__refs_collection', {\n      value: true\n    });\n\n    return collection;\n  }\n\n\n  function isExtended(collection) {\n    return collection.__refs_collection === true;\n  }\n\n  collection.extend = extend;\n\n  collection.isExtended = isExtended;\n\n  var Collection = collection;\n\n  function hasOwnProperty$1(e, property) {\n    return Object.prototype.hasOwnProperty.call(e, property.name || property);\n  }\n\n  function defineCollectionProperty(ref, property, target) {\n\n    var collection = Collection.extend(target[property.name] || [], ref, property, target);\n\n    Object.defineProperty(target, property.name, {\n      enumerable: property.enumerable,\n      value: collection\n    });\n\n    if (collection.length) {\n\n      collection.forEach(function(o) {\n        ref.set(o, property.inverse, target);\n      });\n    }\n  }\n\n\n  function defineProperty$1(ref, property, target) {\n\n    var inverseProperty = property.inverse;\n\n    var _value = target[property.name];\n\n    Object.defineProperty(target, property.name, {\n      configurable: property.configurable,\n      enumerable: property.enumerable,\n\n      get: function() {\n        return _value;\n      },\n\n      set: function(value) {\n\n        // return if we already performed all changes\n        if (value === _value) {\n          return;\n        }\n\n        var old = _value;\n\n        // temporary set null\n        _value = null;\n\n        if (old) {\n          ref.unset(old, inverseProperty, target);\n        }\n\n        // set new value\n        _value = value;\n\n        // set inverse value\n        ref.set(_value, inverseProperty, target);\n      }\n    });\n\n  }\n\n  /**\n   * Creates a new references object defining two inversly related\n   * attribute descriptors a and b.\n   *\n   * <p>\n   *   When bound to an object using {@link Refs#bind} the references\n   *   get activated and ensure that add and remove operations are applied\n   *   reversely, too.\n   * </p>\n   *\n   * <p>\n   *   For attributes represented as collections {@link Refs} provides the\n   *   {@link RefsCollection#add}, {@link RefsCollection#remove} and {@link RefsCollection#contains} extensions\n   *   that must be used to properly hook into the inverse change mechanism.\n   * </p>\n   *\n   * @class Refs\n   *\n   * @classdesc A bi-directional reference between two attributes.\n   *\n   * @param {Refs.AttributeDescriptor} a property descriptor\n   * @param {Refs.AttributeDescriptor} b property descriptor\n   *\n   * @example\n   *\n   * var refs = Refs({ name: 'wheels', collection: true, enumerable: true }, { name: 'car' });\n   *\n   * var car = { name: 'toyota' };\n   * var wheels = [{ pos: 'front-left' }, { pos: 'front-right' }];\n   *\n   * refs.bind(car, 'wheels');\n   *\n   * car.wheels // []\n   * car.wheels.add(wheels[0]);\n   * car.wheels.add(wheels[1]);\n   *\n   * car.wheels // [{ pos: 'front-left' }, { pos: 'front-right' }]\n   *\n   * wheels[0].car // { name: 'toyota' };\n   * car.wheels.remove(wheels[0]);\n   *\n   * wheels[0].car // undefined\n   */\n  function Refs$1(a, b) {\n\n    if (!(this instanceof Refs$1)) {\n      return new Refs$1(a, b);\n    }\n\n    // link\n    a.inverse = b;\n    b.inverse = a;\n\n    this.props = {};\n    this.props[a.name] = a;\n    this.props[b.name] = b;\n  }\n\n  /**\n   * Binds one side of a bi-directional reference to a\n   * target object.\n   *\n   * @memberOf Refs\n   *\n   * @param  {Object} target\n   * @param  {String} property\n   */\n  Refs$1.prototype.bind = function(target, property) {\n    if (typeof property === 'string') {\n      if (!this.props[property]) {\n        throw new Error('no property <' + property + '> in ref');\n      }\n      property = this.props[property];\n    }\n\n    if (property.collection) {\n      defineCollectionProperty(this, property, target);\n    } else {\n      defineProperty$1(this, property, target);\n    }\n  };\n\n  Refs$1.prototype.ensureRefsCollection = function(target, property) {\n\n    var collection = target[property.name];\n\n    if (!Collection.isExtended(collection)) {\n      defineCollectionProperty(this, property, target);\n    }\n\n    return collection;\n  };\n\n  Refs$1.prototype.ensureBound = function(target, property) {\n    if (!hasOwnProperty$1(target, property)) {\n      this.bind(target, property);\n    }\n  };\n\n  Refs$1.prototype.unset = function(target, property, value) {\n\n    if (target) {\n      this.ensureBound(target, property);\n\n      if (property.collection) {\n        this.ensureRefsCollection(target, property).remove(value);\n      } else {\n        target[property.name] = undefined;\n      }\n    }\n  };\n\n  Refs$1.prototype.set = function(target, property, value) {\n\n    if (target) {\n      this.ensureBound(target, property);\n\n      if (property.collection) {\n        this.ensureRefsCollection(target, property).add(value);\n      } else {\n        target[property.name] = value;\n      }\n    }\n  };\n\n  var refs = Refs$1;\n\n  objectRefs.exports = refs;\n\n  objectRefs.exports.Collection = collection;\n\n  var objectRefsExports = objectRefs.exports;\n  var Refs = /*@__PURE__*/getDefaultExportFromCjs(objectRefsExports);\n\n  var parentRefs = new Refs({ name: 'children', enumerable: true, collection: true }, { name: 'parent' }),\n      labelRefs = new Refs({ name: 'labels', enumerable: true, collection: true }, { name: 'labelTarget' }),\n      attacherRefs = new Refs({ name: 'attachers', collection: true }, { name: 'host' }),\n      outgoingRefs = new Refs({ name: 'outgoing', collection: true }, { name: 'source' }),\n      incomingRefs = new Refs({ name: 'incoming', collection: true }, { name: 'target' });\n\n  /**\n   * @typedef {import('./Types').Element} Element\n   * @typedef {import('./Types').Shape} Shape\n   * @typedef {import('./Types').Root} Root\n   * @typedef {import('./Types').Label} Label\n   * @typedef {import('./Types').Connection} Connection\n   */\n\n  /**\n   * The basic graphical representation\n   *\n   * @class\n   * @constructor\n   */\n  function ElementImpl() {\n\n    /**\n     * The object that backs up the shape\n     *\n     * @name Element#businessObject\n     * @type Object\n     */\n    Object.defineProperty(this, 'businessObject', {\n      writable: true\n    });\n\n\n    /**\n     * Single label support, will mapped to multi label array\n     *\n     * @name Element#label\n     * @type Object\n     */\n    Object.defineProperty(this, 'label', {\n      get: function() {\n        return this.labels[0];\n      },\n      set: function(newLabel) {\n\n        var label = this.label,\n            labels = this.labels;\n\n        if (!newLabel && label) {\n          labels.remove(label);\n        } else {\n          labels.add(newLabel, 0);\n        }\n      }\n    });\n\n    /**\n     * The parent shape\n     *\n     * @name Element#parent\n     * @type Shape\n     */\n    parentRefs.bind(this, 'parent');\n\n    /**\n     * The list of labels\n     *\n     * @name Element#labels\n     * @type Label\n     */\n    labelRefs.bind(this, 'labels');\n\n    /**\n     * The list of outgoing connections\n     *\n     * @name Element#outgoing\n     * @type Array<Connection>\n     */\n    outgoingRefs.bind(this, 'outgoing');\n\n    /**\n     * The list of incoming connections\n     *\n     * @name Element#incoming\n     * @type Array<Connection>\n     */\n    incomingRefs.bind(this, 'incoming');\n  }\n\n\n  /**\n   * A graphical object\n   *\n   * @class\n   * @constructor\n   *\n   * @extends ElementImpl\n   */\n  function ShapeImpl() {\n    ElementImpl.call(this);\n\n    /**\n     * Indicates frame shapes\n     *\n     * @name ShapeImpl#isFrame\n     * @type boolean\n     */\n\n    /**\n     * The list of children\n     *\n     * @name ShapeImpl#children\n     * @type Element[]\n     */\n    parentRefs.bind(this, 'children');\n\n    /**\n     * @name ShapeImpl#host\n     * @type Shape\n     */\n    attacherRefs.bind(this, 'host');\n\n    /**\n     * @name ShapeImpl#attachers\n     * @type Shape\n     */\n    attacherRefs.bind(this, 'attachers');\n  }\n\n  e(ShapeImpl, ElementImpl);\n\n\n  /**\n   * A root graphical object\n   *\n   * @class\n   * @constructor\n   *\n   * @extends ElementImpl\n   */\n  function RootImpl() {\n    ElementImpl.call(this);\n\n    /**\n     * The list of children\n     *\n     * @name RootImpl#children\n     * @type Element[]\n     */\n    parentRefs.bind(this, 'children');\n  }\n\n  e(RootImpl, ShapeImpl);\n\n\n  /**\n   * A label for an element\n   *\n   * @class\n   * @constructor\n   *\n   * @extends ShapeImpl\n   */\n  function LabelImpl() {\n    ShapeImpl.call(this);\n\n    /**\n     * The labeled element\n     *\n     * @name LabelImpl#labelTarget\n     * @type Element\n     */\n    labelRefs.bind(this, 'labelTarget');\n  }\n\n  e(LabelImpl, ShapeImpl);\n\n\n  /**\n   * A connection between two elements\n   *\n   * @class\n   * @constructor\n   *\n   * @extends ElementImpl\n   */\n  function ConnectionImpl() {\n    ElementImpl.call(this);\n\n    /**\n     * The element this connection originates from\n     *\n     * @name ConnectionImpl#source\n     * @type Element\n     */\n    outgoingRefs.bind(this, 'source');\n\n    /**\n     * The element this connection points to\n     *\n     * @name ConnectionImpl#target\n     * @type Element\n     */\n    incomingRefs.bind(this, 'target');\n  }\n\n  e(ConnectionImpl, ElementImpl);\n\n\n  var types$6 = {\n    connection: ConnectionImpl,\n    shape: ShapeImpl,\n    label: LabelImpl,\n    root: RootImpl\n  };\n\n  /**\n   * Creates a root element.\n   *\n   * @overlord\n   *\n   * @example\n   *\n   * ```javascript\n   * import * as Model from 'diagram-js/lib/model';\n   *\n   * const root = Model.create('root', {\n   *   x: 100,\n   *   y: 100,\n   *   width: 100,\n   *   height: 100\n   * });\n   * ```\n   *\n   * @param {'root'} type\n   * @param {any} [attrs]\n   *\n   * @return {Root}\n   */\n\n  /**\n   * Creates a connection.\n   *\n   * @overlord\n   *\n   * @example\n   *\n   * ```javascript\n   * import * as Model from 'diagram-js/lib/model';\n   *\n   * const connection = Model.create('connection', {\n   *   waypoints: [\n   *     { x: 100, y: 100 },\n   *     { x: 200, y: 100 }\n   *   ]\n   * });\n   * ```\n   *\n   * @param {'connection'} type\n   * @param {any} [attrs]\n   *\n   * @return {Connection}\n   */\n\n  /**\n   * Creates a shape.\n   *\n   * @overlord\n   *\n   * @example\n   *\n   * ```javascript\n   * import * as Model from 'diagram-js/lib/model';\n   *\n   * const shape = Model.create('shape', {\n   *   x: 100,\n   *   y: 100,\n   *   width: 100,\n   *   height: 100\n   * });\n   * ```\n   *\n   * @param {'shape'} type\n   * @param {any} [attrs]\n   *\n   * @return {Shape}\n   */\n\n  /**\n   * Creates a label.\n   *\n   * @example\n   *\n   * ```javascript\n   * import * as Model from 'diagram-js/lib/model';\n   *\n   * const label = Model.create('label', {\n   *   x: 100,\n   *   y: 100,\n   *   width: 100,\n   *   height: 100,\n   *   labelTarget: shape\n   * });\n   * ```\n   *\n   * @param {'label'} type\n   * @param {Object} [attrs]\n   *\n   * @return {Label}\n   */\n  function create(type, attrs) {\n    var Type = types$6[type];\n    if (!Type) {\n      throw new Error('unknown type: <' + type + '>');\n    }\n    return assign$1(new Type(), attrs);\n  }\n\n  /**\n   * @typedef {import('../model/Types').Element} Element\n   * @typedef {import('../model/Types').Connection} Connection\n   * @typedef {import('../model/Types').Label} Label\n   * @typedef {import('../model/Types').Root} Root\n   * @typedef {import('../model/Types').Shape} Shape\n   */\n\n  /**\n   * A factory for model elements.\n   *\n   * @template {Connection} [T=Connection]\n   * @template {Label} [U=Label]\n   * @template {Root} [V=Root]\n   * @template {Shape} [W=Shape]\n   */\n  function ElementFactory() {\n    this._uid = 12;\n  }\n\n  /**\n   * Create a root element.\n   *\n   * @param {Partial<Root>} [attrs]\n   *\n   * @return {V} The created root element.\n   */\n  ElementFactory.prototype.createRoot = function(attrs) {\n    return this.create('root', attrs);\n  };\n\n  /**\n   * Create a label.\n   *\n   * @param {Partial<Label>} [attrs]\n   *\n   * @return {U} The created label.\n   */\n  ElementFactory.prototype.createLabel = function(attrs) {\n    return this.create('label', attrs);\n  };\n\n  /**\n   * Create a shape.\n   *\n   * @param {Partial<Shape>} [attrs]\n   *\n   * @return {W} The created shape.\n   */\n  ElementFactory.prototype.createShape = function(attrs) {\n    return this.create('shape', attrs);\n  };\n\n  /**\n   * Create a connection.\n   *\n   * @param {Partial<Connection>} [attrs]\n   *\n   * @return {T} The created connection.\n   */\n  ElementFactory.prototype.createConnection = function(attrs) {\n    return this.create('connection', attrs);\n  };\n\n  /**\n   * Create a root element.\n   *\n   * @overlord\n   * @param {'root'} type\n   * @param {Partial<Root>} [attrs]\n   * @return {V}\n   */\n  /**\n   * Create a shape.\n   *\n   * @overlord\n   * @param {'shape'} type\n   * @param {Partial<Shape>} [attrs]\n   * @return {W}\n   */\n  /**\n   * Create a connection.\n   *\n   * @overlord\n   * @param {'connection'} type\n   * @param {Partial<Connection>} [attrs]\n   * @return {T}\n   */\n  /**\n   * Create a label.\n   *\n   * @param {'label'} type\n   * @param {Partial<Label>} [attrs]\n   * @return {U}\n   */\n  ElementFactory.prototype.create = function(type, attrs) {\n\n    attrs = assign$1({}, attrs || {});\n\n    if (!attrs.id) {\n      attrs.id = type + '_' + (this._uid++);\n    }\n\n    return create(type, attrs);\n  };\n\n  var FN_REF = '__fn';\n\n  var DEFAULT_PRIORITY = 1000;\n\n  var slice = Array.prototype.slice;\n\n  /**\n   * @typedef { {\n   *   stopPropagation(): void;\n   *   preventDefault(): void;\n   *   cancelBubble: boolean;\n   *   defaultPrevented: boolean;\n   *   returnValue: any;\n   * } } Event\n   */\n\n  /**\n   * @template E\n   *\n   * @typedef { (event: E & Event, ...any) => any } EventBusEventCallback\n   */\n\n  /**\n   * @typedef { {\n   *  priority: number;\n   *  next: EventBusListener | null;\n   *  callback: EventBusEventCallback<any>;\n   * } } EventBusListener\n   */\n\n  /**\n   * A general purpose event bus.\n   *\n   * This component is used to communicate across a diagram instance.\n   * Other parts of a diagram can use it to listen to and broadcast events.\n   *\n   *\n   * ## Registering for Events\n   *\n   * The event bus provides the {@link EventBus#on} and {@link EventBus#once}\n   * methods to register for events. {@link EventBus#off} can be used to\n   * remove event registrations. Listeners receive an instance of {@link Event}\n   * as the first argument. It allows them to hook into the event execution.\n   *\n   * ```javascript\n   *\n   * // listen for event\n   * eventBus.on('foo', function(event) {\n   *\n   *   // access event type\n   *   event.type; // 'foo'\n   *\n   *   // stop propagation to other listeners\n   *   event.stopPropagation();\n   *\n   *   // prevent event default\n   *   event.preventDefault();\n   * });\n   *\n   * // listen for event with custom payload\n   * eventBus.on('bar', function(event, payload) {\n   *   console.log(payload);\n   * });\n   *\n   * // listen for event returning value\n   * eventBus.on('foobar', function(event) {\n   *\n   *   // stop event propagation + prevent default\n   *   return false;\n   *\n   *   // stop event propagation + return custom result\n   *   return {\n   *     complex: 'listening result'\n   *   };\n   * });\n   *\n   *\n   * // listen with custom priority (default=1000, higher is better)\n   * eventBus.on('priorityfoo', 1500, function(event) {\n   *   console.log('invoked first!');\n   * });\n   *\n   *\n   * // listen for event and pass the context (`this`)\n   * eventBus.on('foobar', function(event) {\n   *   this.foo();\n   * }, this);\n   * ```\n   *\n   *\n   * ## Emitting Events\n   *\n   * Events can be emitted via the event bus using {@link EventBus#fire}.\n   *\n   * ```javascript\n   *\n   * // false indicates that the default action\n   * // was prevented by listeners\n   * if (eventBus.fire('foo') === false) {\n   *   console.log('default has been prevented!');\n   * };\n   *\n   *\n   * // custom args + return value listener\n   * eventBus.on('sum', function(event, a, b) {\n   *   return a + b;\n   * });\n   *\n   * // you can pass custom arguments + retrieve result values.\n   * var sum = eventBus.fire('sum', 1, 2);\n   * console.log(sum); // 3\n   * ```\n   */\n  function EventBus() {\n\n    /**\n     * @type { Record<string, EventBusListener> }\n     */\n    this._listeners = {};\n\n    // cleanup on destroy on lowest priority to allow\n    // message passing until the bitter end\n    this.on('diagram.destroy', 1, this._destroy, this);\n  }\n\n\n  /**\n   * Register an event listener for events with the given name.\n   *\n   * The callback will be invoked with `event, ...additionalArguments`\n   * that have been passed to {@link EventBus#fire}.\n   *\n   * Returning false from a listener will prevent the events default action\n   * (if any is specified). To stop an event from being processed further in\n   * other listeners execute {@link Event#stopPropagation}.\n   *\n   * Returning anything but `undefined` from a listener will stop the listener propagation.\n   *\n   * @template T\n   *\n   * @param {string|string[]} events to subscribe to\n   * @param {number} [priority=1000] listen priority\n   * @param {EventBusEventCallback<T>} callback\n   * @param {any} [that] callback context\n   */\n  EventBus.prototype.on = function(events, priority, callback, that) {\n\n    events = isArray$2(events) ? events : [ events ];\n\n    if (isFunction(priority)) {\n      that = callback;\n      callback = priority;\n      priority = DEFAULT_PRIORITY;\n    }\n\n    if (!isNumber(priority)) {\n      throw new Error('priority must be a number');\n    }\n\n    var actualCallback = callback;\n\n    if (that) {\n      actualCallback = bind$2(callback, that);\n\n      // make sure we remember and are able to remove\n      // bound callbacks via {@link #off} using the original\n      // callback\n      actualCallback[FN_REF] = callback[FN_REF] || callback;\n    }\n\n    var self = this;\n\n    events.forEach(function(e) {\n      self._addListener(e, {\n        priority: priority,\n        callback: actualCallback,\n        next: null\n      });\n    });\n  };\n\n  /**\n   * Register an event listener that is called only once.\n   *\n   * @template T\n   *\n   * @param {string|string[]} events to subscribe to\n   * @param {number} [priority=1000] the listen priority\n   * @param {EventBusEventCallback<T>} callback\n   * @param {any} [that] callback context\n   */\n  EventBus.prototype.once = function(events, priority, callback, that) {\n    var self = this;\n\n    if (isFunction(priority)) {\n      that = callback;\n      callback = priority;\n      priority = DEFAULT_PRIORITY;\n    }\n\n    if (!isNumber(priority)) {\n      throw new Error('priority must be a number');\n    }\n\n    function wrappedCallback() {\n      wrappedCallback.__isTomb = true;\n\n      var result = callback.apply(that, arguments);\n\n      self.off(events, wrappedCallback);\n\n      return result;\n    }\n\n    // make sure we remember and are able to remove\n    // bound callbacks via {@link #off} using the original\n    // callback\n    wrappedCallback[FN_REF] = callback;\n\n    this.on(events, priority, wrappedCallback);\n  };\n\n\n  /**\n   * Removes event listeners by event and callback.\n   *\n   * If no callback is given, all listeners for a given event name are being removed.\n   *\n   * @param {string|string[]} events\n   * @param {EventBusEventCallback} [callback]\n   */\n  EventBus.prototype.off = function(events, callback) {\n\n    events = isArray$2(events) ? events : [ events ];\n\n    var self = this;\n\n    events.forEach(function(event) {\n      self._removeListener(event, callback);\n    });\n\n  };\n\n\n  /**\n   * Create an event recognized be the event bus.\n   *\n   * @param {Object} data Event data.\n   *\n   * @return {Event} An event that will be recognized by the event bus.\n   */\n  EventBus.prototype.createEvent = function(data) {\n    var event = new InternalEvent();\n\n    event.init(data);\n\n    return event;\n  };\n\n\n  /**\n   * Fires an event.\n   *\n   * @example\n   *\n   * ```javascript\n   * // fire event by name\n   * events.fire('foo');\n   *\n   * // fire event object with nested type\n   * var event = { type: 'foo' };\n   * events.fire(event);\n   *\n   * // fire event with explicit type\n   * var event = { x: 10, y: 20 };\n   * events.fire('element.moved', event);\n   *\n   * // pass additional arguments to the event\n   * events.on('foo', function(event, bar) {\n   *   alert(bar);\n   * });\n   *\n   * events.fire({ type: 'foo' }, 'I am bar!');\n   * ```\n   *\n   * @param {string} [type] event type\n   * @param {Object} [data] event or event data\n   * @param {...any} [args] additional arguments the callback will be called with.\n   *\n   * @return {any} The return value. Will be set to `false` if the default was prevented.\n   */\n  EventBus.prototype.fire = function(type, data) {\n    var event,\n        firstListener,\n        returnValue,\n        args;\n\n    args = slice.call(arguments);\n\n    if (typeof type === 'object') {\n      data = type;\n      type = data.type;\n    }\n\n    if (!type) {\n      throw new Error('no event type specified');\n    }\n\n    firstListener = this._listeners[type];\n\n    if (!firstListener) {\n      return;\n    }\n\n    // we make sure we fire instances of our home made\n    // events here. We wrap them only once, though\n    if (data instanceof InternalEvent) {\n\n      // we are fine, we alread have an event\n      event = data;\n    } else {\n      event = this.createEvent(data);\n    }\n\n    // ensure we pass the event as the first parameter\n    args[0] = event;\n\n    // original event type (in case we delegate)\n    var originalType = event.type;\n\n    // update event type before delegation\n    if (type !== originalType) {\n      event.type = type;\n    }\n\n    try {\n      returnValue = this._invokeListeners(event, args, firstListener);\n    } finally {\n\n      // reset event type after delegation\n      if (type !== originalType) {\n        event.type = originalType;\n      }\n    }\n\n    // set the return value to false if the event default\n    // got prevented and no other return value exists\n    if (returnValue === undefined && event.defaultPrevented) {\n      returnValue = false;\n    }\n\n    return returnValue;\n  };\n\n  /**\n   * Handle an error by firing an event.\n   *\n   * @param {Error} error The error to be handled.\n   *\n   * @return {boolean} Whether the error was handled.\n   */\n  EventBus.prototype.handleError = function(error) {\n    return this.fire('error', { error: error }) === false;\n  };\n\n\n  EventBus.prototype._destroy = function() {\n    this._listeners = {};\n  };\n\n  /**\n   * @param {Event} event\n   * @param {any[]} args\n   * @param {EventBusListener} listener\n   *\n   * @return {any}\n   */\n  EventBus.prototype._invokeListeners = function(event, args, listener) {\n\n    var returnValue;\n\n    while (listener) {\n\n      // handle stopped propagation\n      if (event.cancelBubble) {\n        break;\n      }\n\n      returnValue = this._invokeListener(event, args, listener);\n\n      listener = listener.next;\n    }\n\n    return returnValue;\n  };\n\n  /**\n   * @param {Event} event\n   * @param {any[]} args\n   * @param {EventBusListener} listener\n   *\n   * @return {any}\n   */\n  EventBus.prototype._invokeListener = function(event, args, listener) {\n\n    var returnValue;\n\n    if (listener.callback.__isTomb) {\n      return returnValue;\n    }\n\n    try {\n\n      // returning false prevents the default action\n      returnValue = invokeFunction(listener.callback, args);\n\n      // stop propagation on return value\n      if (returnValue !== undefined) {\n        event.returnValue = returnValue;\n        event.stopPropagation();\n      }\n\n      // prevent default on return false\n      if (returnValue === false) {\n        event.preventDefault();\n      }\n    } catch (error) {\n      if (!this.handleError(error)) {\n        console.error('unhandled error in event listener', error);\n\n        throw error;\n      }\n    }\n\n    return returnValue;\n  };\n\n  /**\n   * Add new listener with a certain priority to the list\n   * of listeners (for the given event).\n   *\n   * The semantics of listener registration / listener execution are\n   * first register, first serve: New listeners will always be inserted\n   * after existing listeners with the same priority.\n   *\n   * Example: Inserting two listeners with priority 1000 and 1300\n   *\n   *    * before: [ 1500, 1500, 1000, 1000 ]\n   *    * after: [ 1500, 1500, (new=1300), 1000, 1000, (new=1000) ]\n   *\n   * @param {string} event\n   * @param {EventBusListener} newListener\n   */\n  EventBus.prototype._addListener = function(event, newListener) {\n\n    var listener = this._getListeners(event),\n        previousListener;\n\n    // no prior listeners\n    if (!listener) {\n      this._setListeners(event, newListener);\n\n      return;\n    }\n\n    // ensure we order listeners by priority from\n    // 0 (high) to n > 0 (low)\n    while (listener) {\n\n      if (listener.priority < newListener.priority) {\n\n        newListener.next = listener;\n\n        if (previousListener) {\n          previousListener.next = newListener;\n        } else {\n          this._setListeners(event, newListener);\n        }\n\n        return;\n      }\n\n      previousListener = listener;\n      listener = listener.next;\n    }\n\n    // add new listener to back\n    previousListener.next = newListener;\n  };\n\n\n  /**\n   * @param {string} name\n   *\n   * @return {EventBusListener}\n   */\n  EventBus.prototype._getListeners = function(name) {\n    return this._listeners[name];\n  };\n\n  /**\n   * @param {string} name\n   * @param {EventBusListener} listener\n   */\n  EventBus.prototype._setListeners = function(name, listener) {\n    this._listeners[name] = listener;\n  };\n\n  EventBus.prototype._removeListener = function(event, callback) {\n\n    var listener = this._getListeners(event),\n        nextListener,\n        previousListener,\n        listenerCallback;\n\n    if (!callback) {\n\n      // clear listeners\n      this._setListeners(event, null);\n\n      return;\n    }\n\n    while (listener) {\n\n      nextListener = listener.next;\n\n      listenerCallback = listener.callback;\n\n      if (listenerCallback === callback || listenerCallback[FN_REF] === callback) {\n        if (previousListener) {\n          previousListener.next = nextListener;\n        } else {\n\n          // new first listener\n          this._setListeners(event, nextListener);\n        }\n      }\n\n      previousListener = listener;\n      listener = nextListener;\n    }\n  };\n\n  /**\n   * A event that is emitted via the event bus.\n   */\n  function InternalEvent() { }\n\n  InternalEvent.prototype.stopPropagation = function() {\n    this.cancelBubble = true;\n  };\n\n  InternalEvent.prototype.preventDefault = function() {\n    this.defaultPrevented = true;\n  };\n\n  InternalEvent.prototype.init = function(data) {\n    assign$1(this, data || {});\n  };\n\n\n  /**\n   * Invoke function. Be fast...\n   *\n   * @param {Function} fn\n   * @param {any[]} args\n   *\n   * @return {any}\n   */\n  function invokeFunction(fn, args) {\n    return fn.apply(null, args);\n  }\n\n  /**\n   * SVGs for elements are generated by the {@link GraphicsFactory}.\n   *\n   * This utility gives quick access to the important semantic\n   * parts of an element.\n   */\n\n  /**\n   * Returns the visual part of a diagram element.\n   *\n   * @param {SVGElement} gfx\n   *\n   * @return {SVGElement}\n   */\n  function getVisual(gfx) {\n    return gfx.childNodes[0];\n  }\n\n  /**\n   * Returns the children for a given diagram element.\n   *\n   * @param {SVGElement} gfx\n   * @return {SVGElement}\n   */\n  function getChildren(gfx) {\n    return gfx.parentNode.childNodes[1];\n  }\n\n  /**\n   * @typedef {import('./Types').ConnectionLike} ConnectionLike\n   * @typedef {import('./Types').ElementLike} ElementLike\n   * @typedef {import('./Types').ShapeLike} ShapeLike\n   *\n   * @typedef {import('./ElementRegistry').default} ElementRegistry\n   * @typedef {import('./EventBus').default} EventBus\n   */\n\n  /**\n   * A factory that creates graphical elements.\n   *\n   * @param {EventBus} eventBus\n   * @param {ElementRegistry} elementRegistry\n   */\n  function GraphicsFactory(eventBus, elementRegistry) {\n    this._eventBus = eventBus;\n    this._elementRegistry = elementRegistry;\n  }\n\n  GraphicsFactory.$inject = [ 'eventBus' , 'elementRegistry' ];\n\n  /**\n   * @param { { parent?: any } } element\n   * @return {SVGElement}\n   */\n  GraphicsFactory.prototype._getChildrenContainer = function(element) {\n\n    var gfx = this._elementRegistry.getGraphics(element);\n\n    var childrenGfx;\n\n    // root element\n    if (!element.parent) {\n      childrenGfx = gfx;\n    } else {\n      childrenGfx = getChildren(gfx);\n      if (!childrenGfx) {\n        childrenGfx = create$1('g');\n        classes$1(childrenGfx).add('djs-children');\n\n        append(gfx.parentNode, childrenGfx);\n      }\n    }\n\n    return childrenGfx;\n  };\n\n  /**\n   * Clears the graphical representation of the element and returns the\n   * cleared visual (the <g class=\"djs-visual\" /> element).\n   */\n  GraphicsFactory.prototype._clear = function(gfx) {\n    var visual = getVisual(gfx);\n\n    clear(visual);\n\n    return visual;\n  };\n\n  /**\n   * Creates a gfx container for shapes and connections\n   *\n   * The layout is as follows:\n   *\n   * <g class=\"djs-group\">\n   *\n   *   <!-- the gfx -->\n   *   <g class=\"djs-element djs-(shape|connection|frame)\">\n   *     <g class=\"djs-visual\">\n   *       <!-- the renderer draws in here -->\n   *     </g>\n   *\n   *     <!-- extensions (overlays, click box, ...) goes here\n   *   </g>\n   *\n   *   <!-- the gfx child nodes -->\n   *   <g class=\"djs-children\"></g>\n   * </g>\n   *\n   * @param {string} type the type of the element, i.e. shape | connection\n   * @param {SVGElement} childrenGfx\n   * @param {number} [parentIndex] position to create container in parent\n   * @param {boolean} [isFrame] is frame element\n   *\n   * @return {SVGElement}\n   */\n  GraphicsFactory.prototype._createContainer = function(\n      type, childrenGfx, parentIndex, isFrame\n  ) {\n    var outerGfx = create$1('g');\n    classes$1(outerGfx).add('djs-group');\n\n    // insert node at position\n    if (typeof parentIndex !== 'undefined') {\n      prependTo(outerGfx, childrenGfx, childrenGfx.childNodes[parentIndex]);\n    } else {\n      append(childrenGfx, outerGfx);\n    }\n\n    var gfx = create$1('g');\n    classes$1(gfx).add('djs-element');\n    classes$1(gfx).add('djs-' + type);\n\n    if (isFrame) {\n      classes$1(gfx).add('djs-frame');\n    }\n\n    append(outerGfx, gfx);\n\n    // create visual\n    var visual = create$1('g');\n    classes$1(visual).add('djs-visual');\n\n    append(gfx, visual);\n\n    return gfx;\n  };\n\n  /**\n   * Create a graphical element.\n   *\n   * @param { 'shape' | 'connection' | 'label' | 'root' } type The type of the element.\n   * @param {ElementLike} element The element.\n   * @param {number} [parentIndex] The index at which to add the graphical element to its parent's children.\n   *\n   * @return {SVGElement} The graphical element.\n   */\n  GraphicsFactory.prototype.create = function(type, element, parentIndex) {\n    var childrenGfx = this._getChildrenContainer(element.parent);\n    return this._createContainer(type, childrenGfx, parentIndex, isFrameElement(element));\n  };\n\n  /**\n   * Update the containments of the given elements.\n   *\n   * @param {ElementLike[]} elements The elements.\n   */\n  GraphicsFactory.prototype.updateContainments = function(elements) {\n\n    var self = this,\n        elementRegistry = this._elementRegistry,\n        parents;\n\n    parents = reduce(elements, function(map, e) {\n\n      if (e.parent) {\n        map[e.parent.id] = e.parent;\n      }\n\n      return map;\n    }, {});\n\n    // update all parents of changed and reorganized their children\n    // in the correct order (as indicated in our model)\n    forEach$1(parents, function(parent) {\n\n      var children = parent.children;\n\n      if (!children) {\n        return;\n      }\n\n      var childrenGfx = self._getChildrenContainer(parent);\n\n      forEach$1(children.slice().reverse(), function(child) {\n        var childGfx = elementRegistry.getGraphics(child);\n\n        prependTo(childGfx.parentNode, childrenGfx);\n      });\n    });\n  };\n\n  /**\n   * Draw a shape.\n   *\n   * @param {SVGElement} visual The graphical element.\n   * @param {ShapeLike} element The shape.\n   *\n   * @return {SVGElement}\n   */\n  GraphicsFactory.prototype.drawShape = function(visual, element) {\n    var eventBus = this._eventBus;\n\n    return eventBus.fire('render.shape', { gfx: visual, element: element });\n  };\n\n  /**\n   * Get the path of a shape.\n   *\n   * @param {ShapeLike} element The shape.\n   *\n   * @return {string} The path of the shape.\n   */\n  GraphicsFactory.prototype.getShapePath = function(element) {\n    var eventBus = this._eventBus;\n\n    return eventBus.fire('render.getShapePath', element);\n  };\n\n  /**\n   * Draw a connection.\n   *\n   * @param {SVGElement} visual The graphical element.\n   * @param {ConnectionLike} element The connection.\n   *\n   * @return {SVGElement}\n   */\n  GraphicsFactory.prototype.drawConnection = function(visual, element) {\n    var eventBus = this._eventBus;\n\n    return eventBus.fire('render.connection', { gfx: visual, element: element });\n  };\n\n  /**\n   * Get the path of a connection.\n   *\n   * @param {ConnectionLike} connection The connection.\n   *\n   * @return {string} The path of the connection.\n   */\n  GraphicsFactory.prototype.getConnectionPath = function(connection) {\n    var eventBus = this._eventBus;\n\n    return eventBus.fire('render.getConnectionPath', connection);\n  };\n\n  /**\n   * Update an elements graphical representation.\n   *\n   * @param {'shape'|'connection'} type\n   * @param {ElementLike} element\n   * @param {SVGElement} gfx\n   */\n  GraphicsFactory.prototype.update = function(type, element, gfx) {\n\n    // do NOT update root element\n    if (!element.parent) {\n      return;\n    }\n\n    var visual = this._clear(gfx);\n\n    // redraw\n    if (type === 'shape') {\n      this.drawShape(visual, element);\n\n      // update positioning\n      translate$1(gfx, element.x, element.y);\n    } else\n    if (type === 'connection') {\n      this.drawConnection(visual, element);\n    } else {\n      throw new Error('unknown type: ' + type);\n    }\n\n    if (element.hidden) {\n      attr$1(gfx, 'display', 'none');\n    } else {\n      attr$1(gfx, 'display', 'block');\n    }\n  };\n\n  /**\n   * Remove a graphical element.\n   *\n   * @param {ElementLike} element The element.\n   */\n  GraphicsFactory.prototype.remove = function(element) {\n    var gfx = this._elementRegistry.getGraphics(element);\n\n    // remove\n    remove$2(gfx.parentNode);\n  };\n\n\n  // helpers //////////\n\n  function prependTo(newNode, parentNode, siblingNode) {\n    var node = siblingNode || parentNode.firstChild;\n\n    // do not prepend node to itself to prevent IE from crashing\n    // https://github.com/bpmn-io/bpmn-js/issues/746\n    if (newNode === node) {\n      return;\n    }\n\n    parentNode.insertBefore(newNode, node);\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var CoreModule = {\n    __depends__: [ DrawModule ],\n    __init__: [ 'canvas' ],\n    canvas: [ 'type', Canvas ],\n    elementRegistry: [ 'type', ElementRegistry ],\n    elementFactory: [ 'type', ElementFactory ],\n    eventBus: [ 'type', EventBus ],\n    graphicsFactory: [ 'type', GraphicsFactory ]\n  };\n\n  /**\n   * @typedef {import('didi').InjectionContext} InjectionContext\n   * @typedef {import('didi').LocalsMap} LocalsMap\n   * @typedef {import('didi').ModuleDeclaration} ModuleDeclaration\n   *\n   * @typedef { {\n   *   modules?: ModuleDeclaration[];\n   * } & Record<string, any> } DiagramOptions\n   */\n\n  /**\n   * Bootstrap an injector from a list of modules, instantiating a number of default components\n   *\n   * @param {ModuleDeclaration[]} modules\n   *\n   * @return {Injector} a injector to use to access the components\n   */\n  function bootstrap(modules) {\n    var injector = new Injector(modules);\n\n    injector.init();\n\n    return injector;\n  }\n\n  /**\n   * Creates an injector from passed options.\n   *\n   * @param {DiagramOptions} [options]\n   *\n   * @return {Injector}\n   */\n  function createInjector(options) {\n\n    options = options || {};\n\n    /**\n     * @type { ModuleDeclaration }\n     */\n    var configModule = {\n      'config': [ 'value', options ]\n    };\n\n    var modules = [ configModule, CoreModule ].concat(options.modules || []);\n\n    return bootstrap(modules);\n  }\n\n\n  /**\n   * The main diagram-js entry point that bootstraps the diagram with the given\n   * configuration.\n   *\n   * To register extensions with the diagram, pass them as Array<Module> to the constructor.\n   *\n   * @class\n   * @constructor\n   *\n   * @example Creating a plug-in that logs whenever a shape is added to the canvas.\n   *\n   * ```javascript\n   * // plug-in implementation\n   * function MyLoggingPlugin(eventBus) {\n   *   eventBus.on('shape.added', function(event) {\n   *     console.log('shape ', event.shape, ' was added to the diagram');\n   *   });\n   * }\n   *\n   * // export as module\n   * export default {\n   *   __init__: [ 'myLoggingPlugin' ],\n   *     myLoggingPlugin: [ 'type', MyLoggingPlugin ]\n   * };\n   * ```\n   *\n   * Use the plug-in in a Diagram instance:\n   *\n   * ```javascript\n   * import MyLoggingModule from 'path-to-my-logging-plugin';\n   *\n   * var diagram = new Diagram({\n   *   modules: [\n   *     MyLoggingModule\n   *   ]\n   * });\n   *\n   * diagram.invoke([ 'canvas', function(canvas) {\n   *   // add shape to drawing canvas\n   *   canvas.addShape({ x: 10, y: 10 });\n   * });\n   *\n   * // 'shape ... was added to the diagram' logged to console\n   * ```\n   *\n   * @param {DiagramOptions} [options]\n   * @param {Injector} [injector] An (optional) injector to bootstrap the diagram with.\n   */\n  function Diagram(options, injector) {\n\n    this._injector = injector = injector || createInjector(options);\n\n    // API\n\n    /**\n     * Resolves a diagram service.\n     *\n     * @template T\n     *\n     * @param {string} name The name of the service to get.\n     * @param {boolean} [strict=true] If false, resolve missing services to null.\n     *\n     * @return {T|null}\n     */\n    this.get = injector.get;\n\n    /**\n     * Executes a function with its dependencies injected.\n     *\n     * @template T\n     *\n     * @param {Function} func function to be invoked\n     * @param {InjectionContext} [context] context of the invocation\n     * @param {LocalsMap} [locals] locals provided\n     *\n     * @return {T|null}\n     */\n    this.invoke = injector.invoke;\n\n    // init\n\n    // indicate via event\n\n\n    /**\n     * An event indicating that all plug-ins are loaded.\n     *\n     * Use this event to fire other events to interested plug-ins\n     *\n     * @memberOf Diagram\n     *\n     * @event diagram.init\n     *\n     * @example\n     *\n     * ```javascript\n     * eventBus.on('diagram.init', function() {\n     *   eventBus.fire('my-custom-event', { foo: 'BAR' });\n     * });\n     * ```\n     *\n     * @type {Object}\n     */\n    this.get('eventBus').fire('diagram.init');\n  }\n\n\n  /**\n   * Destroys the diagram\n   */\n  Diagram.prototype.destroy = function() {\n    this.get('eventBus').fire('diagram.destroy');\n  };\n\n  /**\n   * Clear the diagram, removing all contents.\n   */\n  Diagram.prototype.clear = function() {\n    this.get('eventBus').fire('diagram.clear');\n  };\n\n  /**\n   * Moddle base element.\n   */\n  function Base() { }\n\n  Base.prototype.get = function(name) {\n    return this.$model.properties.get(this, name);\n  };\n\n  Base.prototype.set = function(name, value) {\n    this.$model.properties.set(this, name, value);\n  };\n\n  /**\n   * A model element factory.\n   *\n   * @param {Moddle} model\n   * @param {Properties} properties\n   */\n  function Factory(model, properties) {\n    this.model = model;\n    this.properties = properties;\n  }\n\n\n  Factory.prototype.createType = function(descriptor) {\n\n    var model = this.model;\n\n    var props = this.properties,\n        prototype = Object.create(Base.prototype);\n\n    // initialize default values\n    forEach$1(descriptor.properties, function(p) {\n      if (!p.isMany && p.default !== undefined) {\n        prototype[p.name] = p.default;\n      }\n    });\n\n    props.defineModel(prototype, model);\n    props.defineDescriptor(prototype, descriptor);\n\n    var name = descriptor.ns.name;\n\n    /**\n     * The new type constructor\n     */\n    function ModdleElement(attrs) {\n      props.define(this, '$type', { value: name, enumerable: true });\n      props.define(this, '$attrs', { value: {} });\n      props.define(this, '$parent', { writable: true });\n\n      forEach$1(attrs, bind$2(function(val, key) {\n        this.set(key, val);\n      }, this));\n    }\n\n    ModdleElement.prototype = prototype;\n\n    ModdleElement.hasType = prototype.$instanceOf = this.model.hasType;\n\n    // static links\n    props.defineModel(ModdleElement, model);\n    props.defineDescriptor(ModdleElement, descriptor);\n\n    return ModdleElement;\n  };\n\n  /**\n   * Built-in moddle types\n   */\n  var BUILTINS = {\n    String: true,\n    Boolean: true,\n    Integer: true,\n    Real: true,\n    Element: true\n  };\n\n  /**\n   * Converters for built in types from string representations\n   */\n  var TYPE_CONVERTERS = {\n    String: function(s) { return s; },\n    Boolean: function(s) { return s === 'true'; },\n    Integer: function(s) { return parseInt(s, 10); },\n    Real: function(s) { return parseFloat(s); }\n  };\n\n  /**\n   * Convert a type to its real representation\n   */\n  function coerceType(type, value) {\n\n    var converter = TYPE_CONVERTERS[type];\n\n    if (converter) {\n      return converter(value);\n    } else {\n      return value;\n    }\n  }\n\n  /**\n   * Return whether the given type is built-in\n   */\n  function isBuiltIn(type) {\n    return !!BUILTINS[type];\n  }\n\n  /**\n   * Return whether the given type is simple\n   */\n  function isSimple(type) {\n    return !!TYPE_CONVERTERS[type];\n  }\n\n  /**\n   * Parses a namespaced attribute name of the form (ns:)localName to an object,\n   * given a default prefix to assume in case no explicit namespace is given.\n   *\n   * @param {String} name\n   * @param {String} [defaultPrefix] the default prefix to take, if none is present.\n   *\n   * @return {Object} the parsed name\n   */\n  function parseName(name, defaultPrefix) {\n    var parts = name.split(/:/),\n        localName, prefix;\n\n    // no prefix (i.e. only local name)\n    if (parts.length === 1) {\n      localName = name;\n      prefix = defaultPrefix;\n    } else\n\n    // prefix + local name\n    if (parts.length === 2) {\n      localName = parts[1];\n      prefix = parts[0];\n    } else {\n      throw new Error('expected <prefix:localName> or <localName>, got ' + name);\n    }\n\n    name = (prefix ? prefix + ':' : '') + localName;\n\n    return {\n      name: name,\n      prefix: prefix,\n      localName: localName\n    };\n  }\n\n  /**\n   * A utility to build element descriptors.\n   */\n  function DescriptorBuilder(nameNs) {\n    this.ns = nameNs;\n    this.name = nameNs.name;\n    this.allTypes = [];\n    this.allTypesByName = {};\n    this.properties = [];\n    this.propertiesByName = {};\n  }\n\n\n  DescriptorBuilder.prototype.build = function() {\n    return pick(this, [\n      'ns',\n      'name',\n      'allTypes',\n      'allTypesByName',\n      'properties',\n      'propertiesByName',\n      'bodyProperty',\n      'idProperty'\n    ]);\n  };\n\n  /**\n   * Add property at given index.\n   *\n   * @param {Object} p\n   * @param {Number} [idx]\n   * @param {Boolean} [validate=true]\n   */\n  DescriptorBuilder.prototype.addProperty = function(p, idx, validate) {\n\n    if (typeof idx === 'boolean') {\n      validate = idx;\n      idx = undefined;\n    }\n\n    this.addNamedProperty(p, validate !== false);\n\n    var properties = this.properties;\n\n    if (idx !== undefined) {\n      properties.splice(idx, 0, p);\n    } else {\n      properties.push(p);\n    }\n  };\n\n\n  DescriptorBuilder.prototype.replaceProperty = function(oldProperty, newProperty, replace) {\n    var oldNameNs = oldProperty.ns;\n\n    var props = this.properties,\n        propertiesByName = this.propertiesByName,\n        rename = oldProperty.name !== newProperty.name;\n\n    if (oldProperty.isId) {\n      if (!newProperty.isId) {\n        throw new Error(\n          'property <' + newProperty.ns.name + '> must be id property ' +\n          'to refine <' + oldProperty.ns.name + '>');\n      }\n\n      this.setIdProperty(newProperty, false);\n    }\n\n    if (oldProperty.isBody) {\n\n      if (!newProperty.isBody) {\n        throw new Error(\n          'property <' + newProperty.ns.name + '> must be body property ' +\n          'to refine <' + oldProperty.ns.name + '>');\n      }\n\n      // TODO: Check compatibility\n      this.setBodyProperty(newProperty, false);\n    }\n\n    // validate existence and get location of old property\n    var idx = props.indexOf(oldProperty);\n    if (idx === -1) {\n      throw new Error('property <' + oldNameNs.name + '> not found in property list');\n    }\n\n    // remove old property\n    props.splice(idx, 1);\n\n    // replacing the named property is intentional\n    //\n    //  * validate only if this is a \"rename\" operation\n    //  * add at specific index unless we \"replace\"\n    //\n    this.addProperty(newProperty, replace ? undefined : idx, rename);\n\n    // make new property available under old name\n    propertiesByName[oldNameNs.name] = propertiesByName[oldNameNs.localName] = newProperty;\n  };\n\n\n  DescriptorBuilder.prototype.redefineProperty = function(p, targetPropertyName, replace) {\n\n    var nsPrefix = p.ns.prefix;\n    var parts = targetPropertyName.split('#');\n\n    var name = parseName(parts[0], nsPrefix);\n    var attrName = parseName(parts[1], name.prefix).name;\n\n    var redefinedProperty = this.propertiesByName[attrName];\n    if (!redefinedProperty) {\n      throw new Error('refined property <' + attrName + '> not found');\n    } else {\n      this.replaceProperty(redefinedProperty, p, replace);\n    }\n\n    delete p.redefines;\n  };\n\n  DescriptorBuilder.prototype.addNamedProperty = function(p, validate) {\n    var ns = p.ns,\n        propsByName = this.propertiesByName;\n\n    if (validate) {\n      this.assertNotDefined(p, ns.name);\n      this.assertNotDefined(p, ns.localName);\n    }\n\n    propsByName[ns.name] = propsByName[ns.localName] = p;\n  };\n\n  DescriptorBuilder.prototype.removeNamedProperty = function(p) {\n    var ns = p.ns,\n        propsByName = this.propertiesByName;\n\n    delete propsByName[ns.name];\n    delete propsByName[ns.localName];\n  };\n\n  DescriptorBuilder.prototype.setBodyProperty = function(p, validate) {\n\n    if (validate && this.bodyProperty) {\n      throw new Error(\n        'body property defined multiple times ' +\n        '(<' + this.bodyProperty.ns.name + '>, <' + p.ns.name + '>)');\n    }\n\n    this.bodyProperty = p;\n  };\n\n  DescriptorBuilder.prototype.setIdProperty = function(p, validate) {\n\n    if (validate && this.idProperty) {\n      throw new Error(\n        'id property defined multiple times ' +\n        '(<' + this.idProperty.ns.name + '>, <' + p.ns.name + '>)');\n    }\n\n    this.idProperty = p;\n  };\n\n  DescriptorBuilder.prototype.assertNotDefined = function(p, name) {\n    var propertyName = p.name,\n        definedProperty = this.propertiesByName[propertyName];\n\n    if (definedProperty) {\n      throw new Error(\n        'property <' + propertyName + '> already defined; ' +\n        'override of <' + definedProperty.definedBy.ns.name + '#' + definedProperty.ns.name + '> by ' +\n        '<' + p.definedBy.ns.name + '#' + p.ns.name + '> not allowed without redefines');\n    }\n  };\n\n  DescriptorBuilder.prototype.hasProperty = function(name) {\n    return this.propertiesByName[name];\n  };\n\n  DescriptorBuilder.prototype.addTrait = function(t, inherited) {\n\n    var typesByName = this.allTypesByName,\n        types = this.allTypes;\n\n    var typeName = t.name;\n\n    if (typeName in typesByName) {\n      return;\n    }\n\n    forEach$1(t.properties, bind$2(function(p) {\n\n      // clone property to allow extensions\n      p = assign$1({}, p, {\n        name: p.ns.localName,\n        inherited: inherited\n      });\n\n      Object.defineProperty(p, 'definedBy', {\n        value: t\n      });\n\n      var replaces = p.replaces,\n          redefines = p.redefines;\n\n      // add replace/redefine support\n      if (replaces || redefines) {\n        this.redefineProperty(p, replaces || redefines, replaces);\n      } else {\n        if (p.isBody) {\n          this.setBodyProperty(p);\n        }\n        if (p.isId) {\n          this.setIdProperty(p);\n        }\n        this.addProperty(p);\n      }\n    }, this));\n\n    types.push(t);\n    typesByName[typeName] = t;\n  };\n\n  /**\n   * A registry of Moddle packages.\n   *\n   * @param {Array<Package>} packages\n   * @param {Properties} properties\n   */\n  function Registry(packages, properties) {\n    this.packageMap = {};\n    this.typeMap = {};\n\n    this.packages = [];\n\n    this.properties = properties;\n\n    forEach$1(packages, bind$2(this.registerPackage, this));\n  }\n\n\n  Registry.prototype.getPackage = function(uriOrPrefix) {\n    return this.packageMap[uriOrPrefix];\n  };\n\n  Registry.prototype.getPackages = function() {\n    return this.packages;\n  };\n\n\n  Registry.prototype.registerPackage = function(pkg) {\n\n    // copy package\n    pkg = assign$1({}, pkg);\n\n    var pkgMap = this.packageMap;\n\n    ensureAvailable(pkgMap, pkg, 'prefix');\n    ensureAvailable(pkgMap, pkg, 'uri');\n\n    // register types\n    forEach$1(pkg.types, bind$2(function(descriptor) {\n      this.registerType(descriptor, pkg);\n    }, this));\n\n    pkgMap[pkg.uri] = pkgMap[pkg.prefix] = pkg;\n    this.packages.push(pkg);\n  };\n\n\n  /**\n   * Register a type from a specific package with us\n   */\n  Registry.prototype.registerType = function(type, pkg) {\n\n    type = assign$1({}, type, {\n      superClass: (type.superClass || []).slice(),\n      extends: (type.extends || []).slice(),\n      properties: (type.properties || []).slice(),\n      meta: assign$1((type.meta || {}))\n    });\n\n    var ns = parseName(type.name, pkg.prefix),\n        name = ns.name,\n        propertiesByName = {};\n\n    // parse properties\n    forEach$1(type.properties, bind$2(function(p) {\n\n      // namespace property names\n      var propertyNs = parseName(p.name, ns.prefix),\n          propertyName = propertyNs.name;\n\n      // namespace property types\n      if (!isBuiltIn(p.type)) {\n        p.type = parseName(p.type, propertyNs.prefix).name;\n      }\n\n      assign$1(p, {\n        ns: propertyNs,\n        name: propertyName\n      });\n\n      propertiesByName[propertyName] = p;\n    }, this));\n\n    // update ns + name\n    assign$1(type, {\n      ns: ns,\n      name: name,\n      propertiesByName: propertiesByName\n    });\n\n    forEach$1(type.extends, bind$2(function(extendsName) {\n      var extended = this.typeMap[extendsName];\n\n      extended.traits = extended.traits || [];\n      extended.traits.push(name);\n    }, this));\n\n    // link to package\n    this.definePackage(type, pkg);\n\n    // register\n    this.typeMap[name] = type;\n  };\n\n\n  /**\n   * Traverse the type hierarchy from bottom to top,\n   * calling iterator with (type, inherited) for all elements in\n   * the inheritance chain.\n   *\n   * @param {Object} nsName\n   * @param {Function} iterator\n   * @param {Boolean} [trait=false]\n   */\n  Registry.prototype.mapTypes = function(nsName, iterator, trait) {\n\n    var type = isBuiltIn(nsName.name) ? { name: nsName.name } : this.typeMap[nsName.name];\n\n    var self = this;\n\n    /**\n     * Traverse the selected trait.\n     *\n     * @param {String} cls\n     */\n    function traverseTrait(cls) {\n      return traverseSuper(cls, true);\n    }\n\n    /**\n     * Traverse the selected super type or trait\n     *\n     * @param {String} cls\n     * @param {Boolean} [trait=false]\n     */\n    function traverseSuper(cls, trait) {\n      var parentNs = parseName(cls, isBuiltIn(cls) ? '' : nsName.prefix);\n      self.mapTypes(parentNs, iterator, trait);\n    }\n\n    if (!type) {\n      throw new Error('unknown type <' + nsName.name + '>');\n    }\n\n    forEach$1(type.superClass, trait ? traverseTrait : traverseSuper);\n\n    // call iterator with (type, inherited=!trait)\n    iterator(type, !trait);\n\n    forEach$1(type.traits, traverseTrait);\n  };\n\n\n  /**\n   * Returns the effective descriptor for a type.\n   *\n   * @param  {String} type the namespaced name (ns:localName) of the type\n   *\n   * @return {Descriptor} the resulting effective descriptor\n   */\n  Registry.prototype.getEffectiveDescriptor = function(name) {\n\n    var nsName = parseName(name);\n\n    var builder = new DescriptorBuilder(nsName);\n\n    this.mapTypes(nsName, function(type, inherited) {\n      builder.addTrait(type, inherited);\n    });\n\n    var descriptor = builder.build();\n\n    // define package link\n    this.definePackage(descriptor, descriptor.allTypes[descriptor.allTypes.length - 1].$pkg);\n\n    return descriptor;\n  };\n\n\n  Registry.prototype.definePackage = function(target, pkg) {\n    this.properties.define(target, '$pkg', { value: pkg });\n  };\n\n\n\n  // helpers ////////////////////////////\n\n  function ensureAvailable(packageMap, pkg, identifierKey) {\n\n    var value = pkg[identifierKey];\n\n    if (value in packageMap) {\n      throw new Error('package with ' + identifierKey + ' <' + value + '> already defined');\n    }\n  }\n\n  /**\n   * A utility that gets and sets properties of model elements.\n   *\n   * @param {Model} model\n   */\n  function Properties(model) {\n    this.model = model;\n  }\n\n\n  /**\n   * Sets a named property on the target element.\n   * If the value is undefined, the property gets deleted.\n   *\n   * @param {Object} target\n   * @param {String} name\n   * @param {Object} value\n   */\n  Properties.prototype.set = function(target, name, value) {\n\n    if (!isString(name) || !name.length) {\n      throw new TypeError('property name must be a non-empty string');\n    }\n\n    var property = this.model.getPropertyDescriptor(target, name);\n\n    var propertyName = property && property.name;\n\n    if (isUndefined(value)) {\n\n      // unset the property, if the specified value is undefined;\n      // delete from $attrs (for extensions) or the target itself\n      if (property) {\n        delete target[propertyName];\n      } else {\n        delete target.$attrs[name];\n      }\n    } else {\n\n      // set the property, defining well defined properties on the fly\n      // or simply updating them in target.$attrs (for extensions)\n      if (property) {\n        if (propertyName in target) {\n          target[propertyName] = value;\n        } else {\n          defineProperty(target, property, value);\n        }\n      } else {\n        target.$attrs[name] = value;\n      }\n    }\n  };\n\n  /**\n   * Returns the named property of the given element\n   *\n   * @param  {Object} target\n   * @param  {String} name\n   *\n   * @return {Object}\n   */\n  Properties.prototype.get = function(target, name) {\n\n    var property = this.model.getPropertyDescriptor(target, name);\n\n    if (!property) {\n      return target.$attrs[name];\n    }\n\n    var propertyName = property.name;\n\n    // check if access to collection property and lazily initialize it\n    if (!target[propertyName] && property.isMany) {\n      defineProperty(target, property, []);\n    }\n\n    return target[propertyName];\n  };\n\n\n  /**\n   * Define a property on the target element\n   *\n   * @param  {Object} target\n   * @param  {String} name\n   * @param  {Object} options\n   */\n  Properties.prototype.define = function(target, name, options) {\n\n    if (!options.writable) {\n\n      var value = options.value;\n\n      // use getters for read-only variables to support ES6 proxies\n      // cf. https://github.com/bpmn-io/internal-docs/issues/386\n      options = assign$1({}, options, {\n        get: function() { return value; }\n      });\n\n      delete options.value;\n    }\n\n    Object.defineProperty(target, name, options);\n  };\n\n\n  /**\n   * Define the descriptor for an element\n   */\n  Properties.prototype.defineDescriptor = function(target, descriptor) {\n    this.define(target, '$descriptor', { value: descriptor });\n  };\n\n  /**\n   * Define the model for an element\n   */\n  Properties.prototype.defineModel = function(target, model) {\n    this.define(target, '$model', { value: model });\n  };\n\n\n  function isUndefined(val) {\n    return typeof val === 'undefined';\n  }\n\n  function defineProperty(target, property, value) {\n    Object.defineProperty(target, property.name, {\n      enumerable: !property.isReference,\n      writable: true,\n      value: value,\n      configurable: true\n    });\n  }\n\n  // Moddle implementation /////////////////////////////////////////////////\n\n  /**\n   * @class Moddle\n   *\n   * A model that can be used to create elements of a specific type.\n   *\n   * @example\n   *\n   * var Moddle = require('moddle');\n   *\n   * var pkg = {\n   *   name: 'mypackage',\n   *   prefix: 'my',\n   *   types: [\n   *     { name: 'Root' }\n   *   ]\n   * };\n   *\n   * var moddle = new Moddle([pkg]);\n   *\n   * @param {Array<Package>} packages the packages to contain\n   */\n  function Moddle(packages) {\n\n    this.properties = new Properties(this);\n\n    this.factory = new Factory(this, this.properties);\n    this.registry = new Registry(packages, this.properties);\n\n    this.typeCache = {};\n  }\n\n\n  /**\n   * Create an instance of the specified type.\n   *\n   * @method Moddle#create\n   *\n   * @example\n   *\n   * var foo = moddle.create('my:Foo');\n   * var bar = moddle.create('my:Bar', { id: 'BAR_1' });\n   *\n   * @param  {String|Object} descriptor the type descriptor or name know to the model\n   * @param  {Object} attrs   a number of attributes to initialize the model instance with\n   * @return {Object}         model instance\n   */\n  Moddle.prototype.create = function(descriptor, attrs) {\n    var Type = this.getType(descriptor);\n\n    if (!Type) {\n      throw new Error('unknown type <' + descriptor + '>');\n    }\n\n    return new Type(attrs);\n  };\n\n\n  /**\n   * Returns the type representing a given descriptor\n   *\n   * @method Moddle#getType\n   *\n   * @example\n   *\n   * var Foo = moddle.getType('my:Foo');\n   * var foo = new Foo({ 'id' : 'FOO_1' });\n   *\n   * @param  {String|Object} descriptor the type descriptor or name know to the model\n   * @return {Object}         the type representing the descriptor\n   */\n  Moddle.prototype.getType = function(descriptor) {\n\n    var cache = this.typeCache;\n\n    var name = isString(descriptor) ? descriptor : descriptor.ns.name;\n\n    var type = cache[name];\n\n    if (!type) {\n      descriptor = this.registry.getEffectiveDescriptor(name);\n      type = cache[name] = this.factory.createType(descriptor);\n    }\n\n    return type;\n  };\n\n\n  /**\n   * Creates an any-element type to be used within model instances.\n   *\n   * This can be used to create custom elements that lie outside the meta-model.\n   * The created element contains all the meta-data required to serialize it\n   * as part of meta-model elements.\n   *\n   * @method Moddle#createAny\n   *\n   * @example\n   *\n   * var foo = moddle.createAny('vendor:Foo', 'http://vendor', {\n   *   value: 'bar'\n   * });\n   *\n   * var container = moddle.create('my:Container', 'http://my', {\n   *   any: [ foo ]\n   * });\n   *\n   * // go ahead and serialize the stuff\n   *\n   *\n   * @param  {String} name  the name of the element\n   * @param  {String} nsUri the namespace uri of the element\n   * @param  {Object} [properties] a map of properties to initialize the instance with\n   * @return {Object} the any type instance\n   */\n  Moddle.prototype.createAny = function(name, nsUri, properties) {\n\n    var nameNs = parseName(name);\n\n    var element = {\n      $type: name,\n      $instanceOf: function(type) {\n        return type === this.$type;\n      }\n    };\n\n    var descriptor = {\n      name: name,\n      isGeneric: true,\n      ns: {\n        prefix: nameNs.prefix,\n        localName: nameNs.localName,\n        uri: nsUri\n      }\n    };\n\n    this.properties.defineDescriptor(element, descriptor);\n    this.properties.defineModel(element, this);\n    this.properties.define(element, '$parent', { enumerable: false, writable: true });\n    this.properties.define(element, '$instanceOf', { enumerable: false, writable: true });\n\n    forEach$1(properties, function(a, key) {\n      if (isObject(a) && a.value !== undefined) {\n        element[a.name] = a.value;\n      } else {\n        element[key] = a;\n      }\n    });\n\n    return element;\n  };\n\n  /**\n   * Returns a registered package by uri or prefix\n   *\n   * @return {Object} the package\n   */\n  Moddle.prototype.getPackage = function(uriOrPrefix) {\n    return this.registry.getPackage(uriOrPrefix);\n  };\n\n  /**\n   * Returns a snapshot of all known packages\n   *\n   * @return {Object} the package\n   */\n  Moddle.prototype.getPackages = function() {\n    return this.registry.getPackages();\n  };\n\n  /**\n   * Returns the descriptor for an element\n   */\n  Moddle.prototype.getElementDescriptor = function(element) {\n    return element.$descriptor;\n  };\n\n  /**\n   * Returns true if the given descriptor or instance\n   * represents the given type.\n   *\n   * May be applied to this, if element is omitted.\n   */\n  Moddle.prototype.hasType = function(element, type) {\n    if (type === undefined) {\n      type = element;\n      element = this;\n    }\n\n    var descriptor = element.$model.getElementDescriptor(element);\n\n    return (type in descriptor.allTypesByName);\n  };\n\n  /**\n   * Returns the descriptor of an elements named property\n   */\n  Moddle.prototype.getPropertyDescriptor = function(element, property) {\n    return this.getElementDescriptor(element).propertiesByName[property];\n  };\n\n  /**\n   * Returns a mapped type's descriptor\n   */\n  Moddle.prototype.getTypeDescriptor = function(type) {\n    return this.registry.typeMap[type];\n  };\n\n  var fromCharCode = String.fromCharCode;\n\n  var hasOwnProperty = Object.prototype.hasOwnProperty;\n\n  var ENTITY_PATTERN = /&#(\\d+);|&#x([0-9a-f]+);|&(\\w+);/ig;\n\n  var ENTITY_MAPPING = {\n    'amp': '&',\n    'apos': '\\'',\n    'gt': '>',\n    'lt': '<',\n    'quot': '\"'\n  };\n\n  // map UPPERCASE variants of supported special chars\n  Object.keys(ENTITY_MAPPING).forEach(function(k) {\n    ENTITY_MAPPING[k.toUpperCase()] = ENTITY_MAPPING[k];\n  });\n\n\n  function replaceEntities(_, d, x, z) {\n\n    // reserved names, i.e. &nbsp;\n    if (z) {\n      if (hasOwnProperty.call(ENTITY_MAPPING, z)) {\n        return ENTITY_MAPPING[z];\n      } else {\n\n        // fall back to original value\n        return '&' + z + ';';\n      }\n    }\n\n    // decimal encoded char\n    if (d) {\n      return fromCharCode(d);\n    }\n\n    // hex encoded char\n    return fromCharCode(parseInt(x, 16));\n  }\n\n\n  /**\n   * A basic entity decoder that can decode a minimal\n   * sub-set of reserved names (&amp;) as well as\n   * hex (&#xaaf;) and decimal (&#1231;) encoded characters.\n   *\n   * @param {string} str\n   *\n   * @return {string} decoded string\n   */\n  function decodeEntities(s) {\n    if (s.length > 3 && s.indexOf('&') !== -1) {\n      return s.replace(ENTITY_PATTERN, replaceEntities);\n    }\n\n    return s;\n  }\n\n  var XSI_URI = 'http://www.w3.org/2001/XMLSchema-instance';\n  var XSI_PREFIX = 'xsi';\n  var XSI_TYPE$1 = 'xsi:type';\n\n  var NON_WHITESPACE_OUTSIDE_ROOT_NODE = 'non-whitespace outside of root node';\n\n  function error$1(msg) {\n    return new Error(msg);\n  }\n\n  function missingNamespaceForPrefix(prefix) {\n    return 'missing namespace for prefix <' + prefix + '>';\n  }\n\n  function getter(getFn) {\n    return {\n      'get': getFn,\n      'enumerable': true\n    };\n  }\n\n  function cloneNsMatrix(nsMatrix) {\n    var clone = {}, key;\n    for (key in nsMatrix) {\n      clone[key] = nsMatrix[key];\n    }\n    return clone;\n  }\n\n  function uriPrefix(prefix) {\n    return prefix + '$uri';\n  }\n\n  function buildNsMatrix(nsUriToPrefix) {\n    var nsMatrix = {},\n        uri,\n        prefix;\n\n    for (uri in nsUriToPrefix) {\n      prefix = nsUriToPrefix[uri];\n      nsMatrix[prefix] = prefix;\n      nsMatrix[uriPrefix(prefix)] = uri;\n    }\n\n    return nsMatrix;\n  }\n\n  function noopGetContext() {\n    return { 'line': 0, 'column': 0 };\n  }\n\n  function throwFunc(err) {\n    throw err;\n  }\n\n  /**\n   * Creates a new parser with the given options.\n   *\n   * @constructor\n   *\n   * @param  {!Object<string, ?>=} options\n   */\n  function Parser(options) {\n\n    if (!this) {\n      return new Parser(options);\n    }\n\n    var proxy = options && options['proxy'];\n\n    var onText,\n        onOpenTag,\n        onCloseTag,\n        onCDATA,\n        onError = throwFunc,\n        onWarning,\n        onComment,\n        onQuestion,\n        onAttention;\n\n    var getContext = noopGetContext;\n\n    /**\n     * Do we need to parse the current elements attributes for namespaces?\n     *\n     * @type {boolean}\n     */\n    var maybeNS = false;\n\n    /**\n     * Do we process namespaces at all?\n     *\n     * @type {boolean}\n     */\n    var isNamespace = false;\n\n    /**\n     * The caught error returned on parse end\n     *\n     * @type {Error}\n     */\n    var returnError = null;\n\n    /**\n     * Should we stop parsing?\n     *\n     * @type {boolean}\n     */\n    var parseStop = false;\n\n    /**\n     * A map of { uri: prefix } used by the parser.\n     *\n     * This map will ensure we can normalize prefixes during processing;\n     * for each uri, only one prefix will be exposed to the handlers.\n     *\n     * @type {!Object<string, string>}}\n     */\n    var nsUriToPrefix;\n\n    /**\n     * Handle parse error.\n     *\n     * @param  {string|Error} err\n     */\n    function handleError(err) {\n      if (!(err instanceof Error)) {\n        err = error$1(err);\n      }\n\n      returnError = err;\n\n      onError(err, getContext);\n    }\n\n    /**\n     * Handle parse error.\n     *\n     * @param  {string|Error} err\n     */\n    function handleWarning(err) {\n\n      if (!onWarning) {\n        return;\n      }\n\n      if (!(err instanceof Error)) {\n        err = error$1(err);\n      }\n\n      onWarning(err, getContext);\n    }\n\n    /**\n     * Register parse listener.\n     *\n     * @param  {string}   name\n     * @param  {Function} cb\n     *\n     * @return {Parser}\n     */\n    this['on'] = function(name, cb) {\n\n      if (typeof cb !== 'function') {\n        throw error$1('required args <name, cb>');\n      }\n\n      switch (name) {\n      case 'openTag': onOpenTag = cb; break;\n      case 'text': onText = cb; break;\n      case 'closeTag': onCloseTag = cb; break;\n      case 'error': onError = cb; break;\n      case 'warn': onWarning = cb; break;\n      case 'cdata': onCDATA = cb; break;\n      case 'attention': onAttention = cb; break; // <!XXXXX zzzz=\"eeee\">\n      case 'question': onQuestion = cb; break; // <? ....  ?>\n      case 'comment': onComment = cb; break;\n      default:\n        throw error$1('unsupported event: ' + name);\n      }\n\n      return this;\n    };\n\n    /**\n     * Set the namespace to prefix mapping.\n     *\n     * @example\n     *\n     * parser.ns({\n     *   'http://foo': 'foo',\n     *   'http://bar': 'bar'\n     * });\n     *\n     * @param  {!Object<string, string>} nsMap\n     *\n     * @return {Parser}\n     */\n    this['ns'] = function(nsMap) {\n\n      if (typeof nsMap === 'undefined') {\n        nsMap = {};\n      }\n\n      if (typeof nsMap !== 'object') {\n        throw error$1('required args <nsMap={}>');\n      }\n\n      var _nsUriToPrefix = {}, k;\n\n      for (k in nsMap) {\n        _nsUriToPrefix[k] = nsMap[k];\n      }\n\n      // FORCE default mapping for schema instance\n      _nsUriToPrefix[XSI_URI] = XSI_PREFIX;\n\n      isNamespace = true;\n      nsUriToPrefix = _nsUriToPrefix;\n\n      return this;\n    };\n\n    /**\n     * Parse xml string.\n     *\n     * @param  {string} xml\n     *\n     * @return {Error} returnError, if not thrown\n     */\n    this['parse'] = function(xml) {\n      if (typeof xml !== 'string') {\n        throw error$1('required args <xml=string>');\n      }\n\n      returnError = null;\n\n      parse(xml);\n\n      getContext = noopGetContext;\n      parseStop = false;\n\n      return returnError;\n    };\n\n    /**\n     * Stop parsing.\n     */\n    this['stop'] = function() {\n      parseStop = true;\n    };\n\n    /**\n     * Parse string, invoking configured listeners on element.\n     *\n     * @param  {string} xml\n     */\n    function parse(xml) {\n      var nsMatrixStack = isNamespace ? [] : null,\n          nsMatrix = isNamespace ? buildNsMatrix(nsUriToPrefix) : null,\n          _nsMatrix,\n          nodeStack = [],\n          anonymousNsCount = 0,\n          tagStart = false,\n          tagEnd = false,\n          i = 0, j = 0,\n          x, y, q, w, v,\n          xmlns,\n          elementName,\n          _elementName,\n          elementProxy\n          ;\n\n      var attrsString = '',\n          attrsStart = 0,\n          cachedAttrs // false = parsed with errors, null = needs parsing\n          ;\n\n      /**\n       * Parse attributes on demand and returns the parsed attributes.\n       *\n       * Return semantics: (1) `false` on attribute parse error,\n       * (2) object hash on extracted attrs.\n       *\n       * @return {boolean|Object}\n       */\n      function getAttrs() {\n        if (cachedAttrs !== null) {\n          return cachedAttrs;\n        }\n\n        var nsUri,\n            nsUriPrefix,\n            nsName,\n            defaultAlias = isNamespace && nsMatrix['xmlns'],\n            attrList = isNamespace && maybeNS ? [] : null,\n            i = attrsStart,\n            s = attrsString,\n            l = s.length,\n            hasNewMatrix,\n            newalias,\n            value,\n            alias,\n            name,\n            attrs = {},\n            seenAttrs = {},\n            skipAttr,\n            w,\n            j;\n\n        parseAttr:\n        for (; i < l; i++) {\n          skipAttr = false;\n          w = s.charCodeAt(i);\n\n          if (w === 32 || (w < 14 && w > 8)) { // WHITESPACE={ \\f\\n\\r\\t\\v}\n            continue;\n          }\n\n          // wait for non whitespace character\n          if (w < 65 || w > 122 || (w > 90 && w < 97)) {\n            if (w !== 95 && w !== 58) { // char 95\"_\" 58\":\"\n              handleWarning('illegal first char attribute name');\n              skipAttr = true;\n            }\n          }\n\n          // parse attribute name\n          for (j = i + 1; j < l; j++) {\n            w = s.charCodeAt(j);\n\n            if (\n              w > 96 && w < 123 ||\n              w > 64 && w < 91 ||\n              w > 47 && w < 59 ||\n              w === 46 || // '.'\n              w === 45 || // '-'\n              w === 95 // '_'\n            ) {\n              continue;\n            }\n\n            // unexpected whitespace\n            if (w === 32 || (w < 14 && w > 8)) { // WHITESPACE\n              handleWarning('missing attribute value');\n              i = j;\n\n              continue parseAttr;\n            }\n\n            // expected \"=\"\n            if (w === 61) { // \"=\" == 61\n              break;\n            }\n\n            handleWarning('illegal attribute name char');\n            skipAttr = true;\n          }\n\n          name = s.substring(i, j);\n\n          if (name === 'xmlns:xmlns') {\n            handleWarning('illegal declaration of xmlns');\n            skipAttr = true;\n          }\n\n          w = s.charCodeAt(j + 1);\n\n          if (w === 34) { // '\"'\n            j = s.indexOf('\"', i = j + 2);\n\n            if (j === -1) {\n              j = s.indexOf('\\'', i);\n\n              if (j !== -1) {\n                handleWarning('attribute value quote missmatch');\n                skipAttr = true;\n              }\n            }\n\n          } else if (w === 39) { // \"'\"\n            j = s.indexOf('\\'', i = j + 2);\n\n            if (j === -1) {\n              j = s.indexOf('\"', i);\n\n              if (j !== -1) {\n                handleWarning('attribute value quote missmatch');\n                skipAttr = true;\n              }\n            }\n\n          } else {\n            handleWarning('missing attribute value quotes');\n            skipAttr = true;\n\n            // skip to next space\n            for (j = j + 1; j < l; j++) {\n              w = s.charCodeAt(j + 1);\n\n              if (w === 32 || (w < 14 && w > 8)) { // WHITESPACE\n                break;\n              }\n            }\n\n          }\n\n          if (j === -1) {\n            handleWarning('missing closing quotes');\n\n            j = l;\n            skipAttr = true;\n          }\n\n          if (!skipAttr) {\n            value = s.substring(i, j);\n          }\n\n          i = j;\n\n          // ensure SPACE follows attribute\n          // skip illegal content otherwise\n          // example a=\"b\"c\n          for (; j + 1 < l; j++) {\n            w = s.charCodeAt(j + 1);\n\n            if (w === 32 || (w < 14 && w > 8)) { // WHITESPACE\n              break;\n            }\n\n            // FIRST ILLEGAL CHAR\n            if (i === j) {\n              handleWarning('illegal character after attribute end');\n              skipAttr = true;\n            }\n          }\n\n          // advance cursor to next attribute\n          i = j + 1;\n\n          if (skipAttr) {\n            continue parseAttr;\n          }\n\n          // check attribute re-declaration\n          if (name in seenAttrs) {\n            handleWarning('attribute <' + name + '> already defined');\n            continue;\n          }\n\n          seenAttrs[name] = true;\n\n          if (!isNamespace) {\n            attrs[name] = value;\n            continue;\n          }\n\n          // try to extract namespace information\n          if (maybeNS) {\n            newalias = (\n              name === 'xmlns'\n                ? 'xmlns'\n                : (name.charCodeAt(0) === 120 && name.substr(0, 6) === 'xmlns:')\n                  ? name.substr(6)\n                  : null\n            );\n\n            // handle xmlns(:alias) assignment\n            if (newalias !== null) {\n              nsUri = decodeEntities(value);\n              nsUriPrefix = uriPrefix(newalias);\n\n              alias = nsUriToPrefix[nsUri];\n\n              if (!alias) {\n\n                // no prefix defined or prefix collision\n                if (\n                  (newalias === 'xmlns') ||\n                  (nsUriPrefix in nsMatrix && nsMatrix[nsUriPrefix] !== nsUri)\n                ) {\n\n                  // alocate free ns prefix\n                  do {\n                    alias = 'ns' + (anonymousNsCount++);\n                  } while (typeof nsMatrix[alias] !== 'undefined');\n                } else {\n                  alias = newalias;\n                }\n\n                nsUriToPrefix[nsUri] = alias;\n              }\n\n              if (nsMatrix[newalias] !== alias) {\n                if (!hasNewMatrix) {\n                  nsMatrix = cloneNsMatrix(nsMatrix);\n                  hasNewMatrix = true;\n                }\n\n                nsMatrix[newalias] = alias;\n                if (newalias === 'xmlns') {\n                  nsMatrix[uriPrefix(alias)] = nsUri;\n                  defaultAlias = alias;\n                }\n\n                nsMatrix[nsUriPrefix] = nsUri;\n              }\n\n              // expose xmlns(:asd)=\"...\" in attributes\n              attrs[name] = value;\n              continue;\n            }\n\n            // collect attributes until all namespace\n            // declarations are processed\n            attrList.push(name, value);\n            continue;\n\n          } /** end if (maybeNs) */\n\n          // handle attributes on element without\n          // namespace declarations\n          w = name.indexOf(':');\n          if (w === -1) {\n            attrs[name] = value;\n            continue;\n          }\n\n          // normalize ns attribute name\n          if (!(nsName = nsMatrix[name.substring(0, w)])) {\n            handleWarning(missingNamespaceForPrefix(name.substring(0, w)));\n            continue;\n          }\n\n          name = defaultAlias === nsName\n            ? name.substr(w + 1)\n            : nsName + name.substr(w);\n\n          // end: normalize ns attribute name\n\n          // normalize xsi:type ns attribute value\n          if (name === XSI_TYPE$1) {\n            w = value.indexOf(':');\n\n            if (w !== -1) {\n              nsName = value.substring(0, w);\n\n              // handle default prefixes, i.e. xs:String gracefully\n              nsName = nsMatrix[nsName] || nsName;\n              value = nsName + value.substring(w);\n            } else {\n              value = defaultAlias + ':' + value;\n            }\n          }\n\n          // end: normalize xsi:type ns attribute value\n\n          attrs[name] = value;\n        }\n\n\n        // handle deferred, possibly namespaced attributes\n        if (maybeNS) {\n\n          // normalize captured attributes\n          for (i = 0, l = attrList.length; i < l; i++) {\n\n            name = attrList[i++];\n            value = attrList[i];\n\n            w = name.indexOf(':');\n\n            if (w !== -1) {\n\n              // normalize ns attribute name\n              if (!(nsName = nsMatrix[name.substring(0, w)])) {\n                handleWarning(missingNamespaceForPrefix(name.substring(0, w)));\n                continue;\n              }\n\n              name = defaultAlias === nsName\n                ? name.substr(w + 1)\n                : nsName + name.substr(w);\n\n              // end: normalize ns attribute name\n\n              // normalize xsi:type ns attribute value\n              if (name === XSI_TYPE$1) {\n                w = value.indexOf(':');\n\n                if (w !== -1) {\n                  nsName = value.substring(0, w);\n\n                  // handle default prefixes, i.e. xs:String gracefully\n                  nsName = nsMatrix[nsName] || nsName;\n                  value = nsName + value.substring(w);\n                } else {\n                  value = defaultAlias + ':' + value;\n                }\n              }\n\n              // end: normalize xsi:type ns attribute value\n            }\n\n            attrs[name] = value;\n          }\n\n          // end: normalize captured attributes\n        }\n\n        return cachedAttrs = attrs;\n      }\n\n      /**\n       * Extract the parse context { line, column, part }\n       * from the current parser position.\n       *\n       * @return {Object} parse context\n       */\n      function getParseContext() {\n        var splitsRe = /(\\r\\n|\\r|\\n)/g;\n\n        var line = 0;\n        var column = 0;\n        var startOfLine = 0;\n        var endOfLine = j;\n        var match;\n        var data;\n\n        while (i >= startOfLine) {\n\n          match = splitsRe.exec(xml);\n\n          if (!match) {\n            break;\n          }\n\n          // end of line = (break idx + break chars)\n          endOfLine = match[0].length + match.index;\n\n          if (endOfLine > i) {\n            break;\n          }\n\n          // advance to next line\n          line += 1;\n\n          startOfLine = endOfLine;\n        }\n\n        // EOF errors\n        if (i == -1) {\n          column = endOfLine;\n          data = xml.substring(j);\n        } else\n\n        // start errors\n        if (j === 0) {\n          data = xml.substring(j, i);\n        }\n\n        // other errors\n        else {\n          column = i - startOfLine;\n          data = (j == -1 ? xml.substring(i) : xml.substring(i, j + 1));\n        }\n\n        return {\n          'data': data,\n          'line': line,\n          'column': column\n        };\n      }\n\n      getContext = getParseContext;\n\n\n      if (proxy) {\n        elementProxy = Object.create({}, {\n          'name': getter(function() {\n            return elementName;\n          }),\n          'originalName': getter(function() {\n            return _elementName;\n          }),\n          'attrs': getter(getAttrs),\n          'ns': getter(function() {\n            return nsMatrix;\n          })\n        });\n      }\n\n      // actual parse logic\n      while (j !== -1) {\n\n        if (xml.charCodeAt(j) === 60) { // \"<\"\n          i = j;\n        } else {\n          i = xml.indexOf('<', j);\n        }\n\n        // parse end\n        if (i === -1) {\n          if (nodeStack.length) {\n            return handleError('unexpected end of file');\n          }\n\n          if (j === 0) {\n            return handleError('missing start tag');\n          }\n\n          if (j < xml.length) {\n            if (xml.substring(j).trim()) {\n              handleWarning(NON_WHITESPACE_OUTSIDE_ROOT_NODE);\n            }\n          }\n\n          return;\n        }\n\n        // parse text\n        if (j !== i) {\n\n          if (nodeStack.length) {\n            if (onText) {\n              onText(xml.substring(j, i), decodeEntities, getContext);\n\n              if (parseStop) {\n                return;\n              }\n            }\n          } else {\n            if (xml.substring(j, i).trim()) {\n              handleWarning(NON_WHITESPACE_OUTSIDE_ROOT_NODE);\n\n              if (parseStop) {\n                return;\n              }\n            }\n          }\n        }\n\n        w = xml.charCodeAt(i+1);\n\n        // parse comments + CDATA\n        if (w === 33) { // \"!\"\n          q = xml.charCodeAt(i+2);\n\n          // CDATA section\n          if (q === 91 && xml.substr(i + 3, 6) === 'CDATA[') { // 91 == \"[\"\n            j = xml.indexOf(']]>', i);\n            if (j === -1) {\n              return handleError('unclosed cdata');\n            }\n\n            if (onCDATA) {\n              onCDATA(xml.substring(i + 9, j), getContext);\n              if (parseStop) {\n                return;\n              }\n            }\n\n            j += 3;\n            continue;\n          }\n\n          // comment\n          if (q === 45 && xml.charCodeAt(i + 3) === 45) { // 45 == \"-\"\n            j = xml.indexOf('-->', i);\n            if (j === -1) {\n              return handleError('unclosed comment');\n            }\n\n\n            if (onComment) {\n              onComment(xml.substring(i + 4, j), decodeEntities, getContext);\n              if (parseStop) {\n                return;\n              }\n            }\n\n            j += 3;\n            continue;\n          }\n        }\n\n        // parse question <? ... ?>\n        if (w === 63) { // \"?\"\n          j = xml.indexOf('?>', i);\n          if (j === -1) {\n            return handleError('unclosed question');\n          }\n\n          if (onQuestion) {\n            onQuestion(xml.substring(i, j + 2), getContext);\n            if (parseStop) {\n              return;\n            }\n          }\n\n          j += 2;\n          continue;\n        }\n\n        // find matching closing tag for attention or standard tags\n        // for that we must skip through attribute values\n        // (enclosed in single or double quotes)\n        for (x = i + 1; ; x++) {\n          v = xml.charCodeAt(x);\n          if (isNaN(v)) {\n            j = -1;\n            return handleError('unclosed tag');\n          }\n\n          // [10] AttValue ::= '\"' ([^<&\"] | Reference)* '\"' | \"'\" ([^<&'] | Reference)* \"'\"\n          // skips the quoted string\n          // (double quotes) does not appear in a literal enclosed by (double quotes)\n          // (single quote) does not appear in a literal enclosed by (single quote)\n          if (v === 34) { //  '\"'\n            q = xml.indexOf('\"', x + 1);\n            x = q !== -1 ? q : x;\n          } else if (v === 39) { // \"'\"\n            q = xml.indexOf(\"'\", x + 1);\n            x = q !== -1 ? q : x;\n          } else if (v === 62) { // '>'\n            j = x;\n            break;\n          }\n        }\n\n\n        // parse attention <! ...>\n        // previously comment and CDATA have already been parsed\n        if (w === 33) { // \"!\"\n\n          if (onAttention) {\n            onAttention(xml.substring(i, j + 1), decodeEntities, getContext);\n            if (parseStop) {\n              return;\n            }\n          }\n\n          j += 1;\n          continue;\n        }\n\n        // don't process attributes;\n        // there are none\n        cachedAttrs = {};\n\n        // if (xml.charCodeAt(i+1) === 47) { // </...\n        if (w === 47) { // </...\n          tagStart = false;\n          tagEnd = true;\n\n          if (!nodeStack.length) {\n            return handleError('missing open tag');\n          }\n\n          // verify open <-> close tag match\n          x = elementName = nodeStack.pop();\n          q = i + 2 + x.length;\n\n          if (xml.substring(i + 2, q) !== x) {\n            return handleError('closing tag mismatch');\n          }\n\n          // verify chars in close tag\n          for (; q < j; q++) {\n            w = xml.charCodeAt(q);\n\n            if (w === 32 || (w > 8 && w < 14)) { // \\f\\n\\r\\t\\v space\n              continue;\n            }\n\n            return handleError('close tag');\n          }\n\n        } else {\n          if (xml.charCodeAt(j - 1) === 47) { // .../>\n            x = elementName = xml.substring(i + 1, j - 1);\n\n            tagStart = true;\n            tagEnd = true;\n\n          } else {\n            x = elementName = xml.substring(i + 1, j);\n\n            tagStart = true;\n            tagEnd = false;\n          }\n\n          if (!(w > 96 && w < 123 || w > 64 && w < 91 || w === 95 || w === 58)) { // char 95\"_\" 58\":\"\n            return handleError('illegal first char nodeName');\n          }\n\n          for (q = 1, y = x.length; q < y; q++) {\n            w = x.charCodeAt(q);\n\n            if (w > 96 && w < 123 || w > 64 && w < 91 || w > 47 && w < 59 || w === 45 || w === 95 || w == 46) {\n              continue;\n            }\n\n            if (w === 32 || (w < 14 && w > 8)) { // \\f\\n\\r\\t\\v space\n              elementName = x.substring(0, q);\n\n              // maybe there are attributes\n              cachedAttrs = null;\n              break;\n            }\n\n            return handleError('invalid nodeName');\n          }\n\n          if (!tagEnd) {\n            nodeStack.push(elementName);\n          }\n        }\n\n        if (isNamespace) {\n\n          _nsMatrix = nsMatrix;\n\n          if (tagStart) {\n\n            // remember old namespace\n            // unless we're self-closing\n            if (!tagEnd) {\n              nsMatrixStack.push(_nsMatrix);\n            }\n\n            if (cachedAttrs === null) {\n\n              // quick check, whether there may be namespace\n              // declarations on the node; if that is the case\n              // we need to eagerly parse the node attributes\n              if ((maybeNS = x.indexOf('xmlns', q) !== -1)) {\n                attrsStart = q;\n                attrsString = x;\n\n                getAttrs();\n\n                maybeNS = false;\n              }\n            }\n          }\n\n          _elementName = elementName;\n\n          w = elementName.indexOf(':');\n          if (w !== -1) {\n            xmlns = nsMatrix[elementName.substring(0, w)];\n\n            // prefix given; namespace must exist\n            if (!xmlns) {\n              return handleError('missing namespace on <' + _elementName + '>');\n            }\n\n            elementName = elementName.substr(w + 1);\n          } else {\n            xmlns = nsMatrix['xmlns'];\n\n            // if no default namespace is defined,\n            // we'll import the element as anonymous.\n            //\n            // it is up to users to correct that to the document defined\n            // targetNamespace, or whatever their undersanding of the\n            // XML spec mandates.\n          }\n\n          // adjust namespace prefixs as configured\n          if (xmlns) {\n            elementName = xmlns + ':' + elementName;\n          }\n\n        }\n\n        if (tagStart) {\n          attrsStart = q;\n          attrsString = x;\n\n          if (onOpenTag) {\n            if (proxy) {\n              onOpenTag(elementProxy, decodeEntities, tagEnd, getContext);\n            } else {\n              onOpenTag(elementName, getAttrs, decodeEntities, tagEnd, getContext);\n            }\n\n            if (parseStop) {\n              return;\n            }\n          }\n\n        }\n\n        if (tagEnd) {\n\n          if (onCloseTag) {\n            onCloseTag(proxy ? elementProxy : elementName, decodeEntities, tagStart, getContext);\n\n            if (parseStop) {\n              return;\n            }\n          }\n\n          // restore old namespace\n          if (isNamespace) {\n            if (!tagStart) {\n              nsMatrix = nsMatrixStack.pop();\n            } else {\n              nsMatrix = _nsMatrix;\n            }\n          }\n        }\n\n        j += 1;\n      }\n    } /** end parse */\n\n  }\n\n  function hasLowerCaseAlias(pkg) {\n    return pkg.xml && pkg.xml.tagAlias === 'lowerCase';\n  }\n\n  var DEFAULT_NS_MAP = {\n    'xsi': 'http://www.w3.org/2001/XMLSchema-instance',\n    'xml': 'http://www.w3.org/XML/1998/namespace'\n  };\n\n  var XSI_TYPE = 'xsi:type';\n\n  function serializeFormat(element) {\n    return element.xml && element.xml.serialize;\n  }\n\n  function serializeAsType(element) {\n    return serializeFormat(element) === XSI_TYPE;\n  }\n\n  function serializeAsProperty(element) {\n    return serializeFormat(element) === 'property';\n  }\n\n  function capitalize(str) {\n    return str.charAt(0).toUpperCase() + str.slice(1);\n  }\n\n  function aliasToName(aliasNs, pkg) {\n\n    if (!hasLowerCaseAlias(pkg)) {\n      return aliasNs.name;\n    }\n\n    return aliasNs.prefix + ':' + capitalize(aliasNs.localName);\n  }\n\n  function prefixedToName(nameNs, pkg) {\n\n    var name = nameNs.name,\n        localName = nameNs.localName;\n\n    var typePrefix = pkg.xml && pkg.xml.typePrefix;\n\n    if (typePrefix && localName.indexOf(typePrefix) === 0) {\n      return nameNs.prefix + ':' + localName.slice(typePrefix.length);\n    } else {\n      return name;\n    }\n  }\n\n  function normalizeXsiTypeName(name, model) {\n\n    var nameNs = parseName(name);\n    var pkg = model.getPackage(nameNs.prefix);\n\n    return prefixedToName(nameNs, pkg);\n  }\n\n  function error(message) {\n    return new Error(message);\n  }\n\n  /**\n   * Get the moddle descriptor for a given instance or type.\n   *\n   * @param  {ModdleElement|Function} element\n   *\n   * @return {Object} the moddle descriptor\n   */\n  function getModdleDescriptor(element) {\n    return element.$descriptor;\n  }\n\n\n  /**\n   * A parse context.\n   *\n   * @class\n   *\n   * @param {Object} options\n   * @param {ElementHandler} options.rootHandler the root handler for parsing a document\n   * @param {boolean} [options.lax=false] whether or not to ignore invalid elements\n   */\n  function Context(options) {\n\n    /**\n     * @property {ElementHandler} rootHandler\n     */\n\n    /**\n     * @property {Boolean} lax\n     */\n\n    assign$1(this, options);\n\n    this.elementsById = {};\n    this.references = [];\n    this.warnings = [];\n\n    /**\n     * Add an unresolved reference.\n     *\n     * @param {Object} reference\n     */\n    this.addReference = function(reference) {\n      this.references.push(reference);\n    };\n\n    /**\n     * Add a processed element.\n     *\n     * @param {ModdleElement} element\n     */\n    this.addElement = function(element) {\n\n      if (!element) {\n        throw error('expected element');\n      }\n\n      var elementsById = this.elementsById;\n\n      var descriptor = getModdleDescriptor(element);\n\n      var idProperty = descriptor.idProperty,\n          id;\n\n      if (idProperty) {\n        id = element.get(idProperty.name);\n\n        if (id) {\n\n          // for QName validation as per http://www.w3.org/TR/REC-xml/#NT-NameChar\n          //if (!/^([a-z][\\w-.]*:)?[a-z_][\\w-.]*$/i.test(id)) {\n          //  throw new Error('illegal ID <' + id + '>');\n          //}\n\n          if (elementsById[id]) {\n            throw error('duplicate ID <' + id + '>');\n          }\n\n          elementsById[id] = element;\n        }\n      }\n    };\n\n    /**\n     * Add an import warning.\n     *\n     * @param {Object} warning\n     * @param {String} warning.message\n     * @param {Error} [warning.error]\n     */\n    this.addWarning = function(warning) {\n      this.warnings.push(warning);\n    };\n  }\n\n  function BaseHandler() {}\n\n  BaseHandler.prototype.handleEnd = function() {};\n  BaseHandler.prototype.handleText = function() {};\n  BaseHandler.prototype.handleNode = function() {};\n\n\n  /**\n   * A simple pass through handler that does nothing except for\n   * ignoring all input it receives.\n   *\n   * This is used to ignore unknown elements and\n   * attributes.\n   */\n  function NoopHandler() { }\n\n  NoopHandler.prototype = Object.create(BaseHandler.prototype);\n\n  NoopHandler.prototype.handleNode = function() {\n    return this;\n  };\n\n  function BodyHandler() {}\n\n  BodyHandler.prototype = Object.create(BaseHandler.prototype);\n\n  BodyHandler.prototype.handleText = function(text) {\n    this.body = (this.body || '') + text;\n  };\n\n  function ReferenceHandler(property, context) {\n    this.property = property;\n    this.context = context;\n  }\n\n  ReferenceHandler.prototype = Object.create(BodyHandler.prototype);\n\n  ReferenceHandler.prototype.handleNode = function(node) {\n\n    if (this.element) {\n      throw error('expected no sub nodes');\n    } else {\n      this.element = this.createReference(node);\n    }\n\n    return this;\n  };\n\n  ReferenceHandler.prototype.handleEnd = function() {\n    this.element.id = this.body;\n  };\n\n  ReferenceHandler.prototype.createReference = function(node) {\n    return {\n      property: this.property.ns.name,\n      id: ''\n    };\n  };\n\n  function ValueHandler(propertyDesc, element) {\n    this.element = element;\n    this.propertyDesc = propertyDesc;\n  }\n\n  ValueHandler.prototype = Object.create(BodyHandler.prototype);\n\n  ValueHandler.prototype.handleEnd = function() {\n\n    var value = this.body || '',\n        element = this.element,\n        propertyDesc = this.propertyDesc;\n\n    value = coerceType(propertyDesc.type, value);\n\n    if (propertyDesc.isMany) {\n      element.get(propertyDesc.name).push(value);\n    } else {\n      element.set(propertyDesc.name, value);\n    }\n  };\n\n\n  function BaseElementHandler() {}\n\n  BaseElementHandler.prototype = Object.create(BodyHandler.prototype);\n\n  BaseElementHandler.prototype.handleNode = function(node) {\n    var parser = this,\n        element = this.element;\n\n    if (!element) {\n      element = this.element = this.createElement(node);\n\n      this.context.addElement(element);\n    } else {\n      parser = this.handleChild(node);\n    }\n\n    return parser;\n  };\n\n  /**\n   * @class Reader.ElementHandler\n   *\n   */\n  function ElementHandler(model, typeName, context) {\n    this.model = model;\n    this.type = model.getType(typeName);\n    this.context = context;\n  }\n\n  ElementHandler.prototype = Object.create(BaseElementHandler.prototype);\n\n  ElementHandler.prototype.addReference = function(reference) {\n    this.context.addReference(reference);\n  };\n\n  ElementHandler.prototype.handleText = function(text) {\n\n    var element = this.element,\n        descriptor = getModdleDescriptor(element),\n        bodyProperty = descriptor.bodyProperty;\n\n    if (!bodyProperty) {\n      throw error('unexpected body text <' + text + '>');\n    }\n\n    BodyHandler.prototype.handleText.call(this, text);\n  };\n\n  ElementHandler.prototype.handleEnd = function() {\n\n    var value = this.body,\n        element = this.element,\n        descriptor = getModdleDescriptor(element),\n        bodyProperty = descriptor.bodyProperty;\n\n    if (bodyProperty && value !== undefined) {\n      value = coerceType(bodyProperty.type, value);\n      element.set(bodyProperty.name, value);\n    }\n  };\n\n  /**\n   * Create an instance of the model from the given node.\n   *\n   * @param  {Element} node the xml node\n   */\n  ElementHandler.prototype.createElement = function(node) {\n    var attributes = node.attributes,\n        Type = this.type,\n        descriptor = getModdleDescriptor(Type),\n        context = this.context,\n        instance = new Type({}),\n        model = this.model,\n        propNameNs;\n\n    forEach$1(attributes, function(value, name) {\n\n      var prop = descriptor.propertiesByName[name],\n          values;\n\n      if (prop && prop.isReference) {\n\n        if (!prop.isMany) {\n          context.addReference({\n            element: instance,\n            property: prop.ns.name,\n            id: value\n          });\n        } else {\n\n          // IDREFS: parse references as whitespace-separated list\n          values = value.split(' ');\n\n          forEach$1(values, function(v) {\n            context.addReference({\n              element: instance,\n              property: prop.ns.name,\n              id: v\n            });\n          });\n        }\n\n      } else {\n        if (prop) {\n          value = coerceType(prop.type, value);\n        } else\n        if (name !== 'xmlns') {\n          propNameNs = parseName(name, descriptor.ns.prefix);\n\n          // check whether attribute is defined in a well-known namespace\n          // if that is the case we emit a warning to indicate potential misuse\n          if (model.getPackage(propNameNs.prefix)) {\n\n            context.addWarning({\n              message: 'unknown attribute <' + name + '>',\n              element: instance,\n              property: name,\n              value: value\n            });\n          }\n        }\n\n        instance.set(name, value);\n      }\n    });\n\n    return instance;\n  };\n\n  ElementHandler.prototype.getPropertyForNode = function(node) {\n\n    var name = node.name;\n    var nameNs = parseName(name);\n\n    var type = this.type,\n        model = this.model,\n        descriptor = getModdleDescriptor(type);\n\n    var propertyName = nameNs.name,\n        property = descriptor.propertiesByName[propertyName],\n        elementTypeName,\n        elementType;\n\n    // search for properties by name first\n\n    if (property && !property.isAttr) {\n\n      if (serializeAsType(property)) {\n        elementTypeName = node.attributes[XSI_TYPE];\n\n        // xsi type is optional, if it does not exists the\n        // default type is assumed\n        if (elementTypeName) {\n\n          // take possible type prefixes from XML\n          // into account, i.e.: xsi:type=\"t{ActualType}\"\n          elementTypeName = normalizeXsiTypeName(elementTypeName, model);\n\n          elementType = model.getType(elementTypeName);\n\n          return assign$1({}, property, {\n            effectiveType: getModdleDescriptor(elementType).name\n          });\n        }\n      }\n\n      // search for properties by name first\n      return property;\n    }\n\n    var pkg = model.getPackage(nameNs.prefix);\n\n    if (pkg) {\n      elementTypeName = aliasToName(nameNs, pkg);\n      elementType = model.getType(elementTypeName);\n\n      // search for collection members later\n      property = find(descriptor.properties, function(p) {\n        return !p.isVirtual && !p.isReference && !p.isAttribute && elementType.hasType(p.type);\n      });\n\n      if (property) {\n        return assign$1({}, property, {\n          effectiveType: getModdleDescriptor(elementType).name\n        });\n      }\n    } else {\n\n      // parse unknown element (maybe extension)\n      property = find(descriptor.properties, function(p) {\n        return !p.isReference && !p.isAttribute && p.type === 'Element';\n      });\n\n      if (property) {\n        return property;\n      }\n    }\n\n    throw error('unrecognized element <' + nameNs.name + '>');\n  };\n\n  ElementHandler.prototype.toString = function() {\n    return 'ElementDescriptor[' + getModdleDescriptor(this.type).name + ']';\n  };\n\n  ElementHandler.prototype.valueHandler = function(propertyDesc, element) {\n    return new ValueHandler(propertyDesc, element);\n  };\n\n  ElementHandler.prototype.referenceHandler = function(propertyDesc) {\n    return new ReferenceHandler(propertyDesc, this.context);\n  };\n\n  ElementHandler.prototype.handler = function(type) {\n    if (type === 'Element') {\n      return new GenericElementHandler(this.model, type, this.context);\n    } else {\n      return new ElementHandler(this.model, type, this.context);\n    }\n  };\n\n  /**\n   * Handle the child element parsing\n   *\n   * @param  {Element} node the xml node\n   */\n  ElementHandler.prototype.handleChild = function(node) {\n    var propertyDesc, type, element, childHandler;\n\n    propertyDesc = this.getPropertyForNode(node);\n    element = this.element;\n\n    type = propertyDesc.effectiveType || propertyDesc.type;\n\n    if (isSimple(type)) {\n      return this.valueHandler(propertyDesc, element);\n    }\n\n    if (propertyDesc.isReference) {\n      childHandler = this.referenceHandler(propertyDesc).handleNode(node);\n    } else {\n      childHandler = this.handler(type).handleNode(node);\n    }\n\n    var newElement = childHandler.element;\n\n    // child handles may decide to skip elements\n    // by not returning anything\n    if (newElement !== undefined) {\n\n      if (propertyDesc.isMany) {\n        element.get(propertyDesc.name).push(newElement);\n      } else {\n        element.set(propertyDesc.name, newElement);\n      }\n\n      if (propertyDesc.isReference) {\n        assign$1(newElement, {\n          element: element\n        });\n\n        this.context.addReference(newElement);\n      } else {\n\n        // establish child -> parent relationship\n        newElement.$parent = element;\n      }\n    }\n\n    return childHandler;\n  };\n\n  /**\n   * An element handler that performs special validation\n   * to ensure the node it gets initialized with matches\n   * the handlers type (namespace wise).\n   *\n   * @param {Moddle} model\n   * @param {String} typeName\n   * @param {Context} context\n   */\n  function RootElementHandler(model, typeName, context) {\n    ElementHandler.call(this, model, typeName, context);\n  }\n\n  RootElementHandler.prototype = Object.create(ElementHandler.prototype);\n\n  RootElementHandler.prototype.createElement = function(node) {\n\n    var name = node.name,\n        nameNs = parseName(name),\n        model = this.model,\n        type = this.type,\n        pkg = model.getPackage(nameNs.prefix),\n        typeName = pkg && aliasToName(nameNs, pkg) || name;\n\n    // verify the correct namespace if we parse\n    // the first element in the handler tree\n    //\n    // this ensures we don't mistakenly import wrong namespace elements\n    if (!type.hasType(typeName)) {\n      throw error('unexpected element <' + node.originalName + '>');\n    }\n\n    return ElementHandler.prototype.createElement.call(this, node);\n  };\n\n\n  function GenericElementHandler(model, typeName, context) {\n    this.model = model;\n    this.context = context;\n  }\n\n  GenericElementHandler.prototype = Object.create(BaseElementHandler.prototype);\n\n  GenericElementHandler.prototype.createElement = function(node) {\n\n    var name = node.name,\n        ns = parseName(name),\n        prefix = ns.prefix,\n        uri = node.ns[prefix + '$uri'],\n        attributes = node.attributes;\n\n    return this.model.createAny(name, uri, attributes);\n  };\n\n  GenericElementHandler.prototype.handleChild = function(node) {\n\n    var handler = new GenericElementHandler(this.model, 'Element', this.context).handleNode(node),\n        element = this.element;\n\n    var newElement = handler.element,\n        children;\n\n    if (newElement !== undefined) {\n      children = element.$children = element.$children || [];\n      children.push(newElement);\n\n      // establish child -> parent relationship\n      newElement.$parent = element;\n    }\n\n    return handler;\n  };\n\n  GenericElementHandler.prototype.handleEnd = function() {\n    if (this.body) {\n      this.element.$body = this.body;\n    }\n  };\n\n  /**\n   * A reader for a meta-model\n   *\n   * @param {Object} options\n   * @param {Model} options.model used to read xml files\n   * @param {Boolean} options.lax whether to make parse errors warnings\n   */\n  function Reader(options) {\n\n    if (options instanceof Moddle) {\n      options = {\n        model: options\n      };\n    }\n\n    assign$1(this, { lax: false }, options);\n  }\n\n  /**\n   * The fromXML result.\n   *\n   * @typedef {Object} ParseResult\n   *\n   * @property {ModdleElement} rootElement\n   * @property {Array<Object>} references\n   * @property {Array<Error>} warnings\n   * @property {Object} elementsById - a mapping containing each ID -> ModdleElement\n   */\n\n  /**\n   * The fromXML result.\n   *\n   * @typedef {Error} ParseError\n   *\n   * @property {Array<Error>} warnings\n   */\n\n  /**\n   * Parse the given XML into a moddle document tree.\n   *\n   * @param {String} xml\n   * @param {ElementHandler|Object} options or rootHandler\n   *\n   * @returns {Promise<ParseResult, ParseError>}\n   */\n  Reader.prototype.fromXML = function(xml, options, done) {\n\n    var rootHandler = options.rootHandler;\n\n    if (options instanceof ElementHandler) {\n\n      // root handler passed via (xml, { rootHandler: ElementHandler }, ...)\n      rootHandler = options;\n      options = {};\n    } else {\n      if (typeof options === 'string') {\n\n        // rootHandler passed via (xml, 'someString', ...)\n        rootHandler = this.handler(options);\n        options = {};\n      } else if (typeof rootHandler === 'string') {\n\n        // rootHandler passed via (xml, { rootHandler: 'someString' }, ...)\n        rootHandler = this.handler(rootHandler);\n      }\n    }\n\n    var model = this.model,\n        lax = this.lax;\n\n    var context = new Context(assign$1({}, options, { rootHandler: rootHandler })),\n        parser = new Parser({ proxy: true }),\n        stack = createStack();\n\n    rootHandler.context = context;\n\n    // push root handler\n    stack.push(rootHandler);\n\n\n    /**\n     * Handle error.\n     *\n     * @param  {Error} err\n     * @param  {Function} getContext\n     * @param  {boolean} lax\n     *\n     * @return {boolean} true if handled\n     */\n    function handleError(err, getContext, lax) {\n\n      var ctx = getContext();\n\n      var line = ctx.line,\n          column = ctx.column,\n          data = ctx.data;\n\n      // we receive the full context data here,\n      // for elements trim down the information\n      // to the tag name, only\n      if (data.charAt(0) === '<' && data.indexOf(' ') !== -1) {\n        data = data.slice(0, data.indexOf(' ')) + '>';\n      }\n\n      var message =\n        'unparsable content ' + (data ? data + ' ' : '') + 'detected\\n\\t' +\n          'line: ' + line + '\\n\\t' +\n          'column: ' + column + '\\n\\t' +\n          'nested error: ' + err.message;\n\n      if (lax) {\n        context.addWarning({\n          message: message,\n          error: err\n        });\n\n        return true;\n      } else {\n        throw error(message);\n      }\n    }\n\n    function handleWarning(err, getContext) {\n\n      // just like handling errors in <lax=true> mode\n      return handleError(err, getContext, true);\n    }\n\n    /**\n     * Resolve collected references on parse end.\n     */\n    function resolveReferences() {\n\n      var elementsById = context.elementsById;\n      var references = context.references;\n\n      var i, r;\n\n      for (i = 0; (r = references[i]); i++) {\n        var element = r.element;\n        var reference = elementsById[r.id];\n        var property = getModdleDescriptor(element).propertiesByName[r.property];\n\n        if (!reference) {\n          context.addWarning({\n            message: 'unresolved reference <' + r.id + '>',\n            element: r.element,\n            property: r.property,\n            value: r.id\n          });\n        }\n\n        if (property.isMany) {\n          var collection = element.get(property.name),\n              idx = collection.indexOf(r);\n\n          // we replace an existing place holder (idx != -1) or\n          // append to the collection instead\n          if (idx === -1) {\n            idx = collection.length;\n          }\n\n          if (!reference) {\n\n            // remove unresolvable reference\n            collection.splice(idx, 1);\n          } else {\n\n            // add or update reference in collection\n            collection[idx] = reference;\n          }\n        } else {\n          element.set(property.name, reference);\n        }\n      }\n    }\n\n    function handleClose() {\n      stack.pop().handleEnd();\n    }\n\n    var PREAMBLE_START_PATTERN = /^<\\?xml /i;\n\n    var ENCODING_PATTERN = / encoding=\"([^\"]+)\"/i;\n\n    var UTF_8_PATTERN = /^utf-8$/i;\n\n    function handleQuestion(question) {\n\n      if (!PREAMBLE_START_PATTERN.test(question)) {\n        return;\n      }\n\n      var match = ENCODING_PATTERN.exec(question);\n      var encoding = match && match[1];\n\n      if (!encoding || UTF_8_PATTERN.test(encoding)) {\n        return;\n      }\n\n      context.addWarning({\n        message:\n          'unsupported document encoding <' + encoding + '>, ' +\n          'falling back to UTF-8'\n      });\n    }\n\n    function handleOpen(node, getContext) {\n      var handler = stack.peek();\n\n      try {\n        stack.push(handler.handleNode(node));\n      } catch (err) {\n\n        if (handleError(err, getContext, lax)) {\n          stack.push(new NoopHandler());\n        }\n      }\n    }\n\n    function handleCData(text, getContext) {\n\n      try {\n        stack.peek().handleText(text);\n      } catch (err) {\n        handleWarning(err, getContext);\n      }\n    }\n\n    function handleText(text, getContext) {\n\n      // strip whitespace only nodes, i.e. before\n      // <!CDATA[ ... ]> sections and in between tags\n\n      if (!text.trim()) {\n        return;\n      }\n\n      handleCData(text, getContext);\n    }\n\n    var uriMap = model.getPackages().reduce(function(uriMap, p) {\n      uriMap[p.uri] = p.prefix;\n\n      return uriMap;\n    }, {\n      'http://www.w3.org/XML/1998/namespace': 'xml' // add default xml ns\n    });\n    parser\n      .ns(uriMap)\n      .on('openTag', function(obj, decodeStr, selfClosing, getContext) {\n\n        // gracefully handle unparsable attributes (attrs=false)\n        var attrs = obj.attrs || {};\n\n        var decodedAttrs = Object.keys(attrs).reduce(function(d, key) {\n          var value = decodeStr(attrs[key]);\n\n          d[key] = value;\n\n          return d;\n        }, {});\n\n        var node = {\n          name: obj.name,\n          originalName: obj.originalName,\n          attributes: decodedAttrs,\n          ns: obj.ns\n        };\n\n        handleOpen(node, getContext);\n      })\n      .on('question', handleQuestion)\n      .on('closeTag', handleClose)\n      .on('cdata', handleCData)\n      .on('text', function(text, decodeEntities, getContext) {\n        handleText(decodeEntities(text), getContext);\n      })\n      .on('error', handleError)\n      .on('warn', handleWarning);\n\n    // async XML parsing to make sure the execution environment\n    // (node or brower) is kept responsive and that certain optimization\n    // strategies can kick in.\n    return new Promise(function(resolve, reject) {\n\n      var err;\n\n      try {\n        parser.parse(xml);\n\n        resolveReferences();\n      } catch (e) {\n        err = e;\n      }\n\n      var rootElement = rootHandler.element;\n\n      if (!err && !rootElement) {\n        err = error('failed to parse document as <' + rootHandler.type.$descriptor.name + '>');\n      }\n\n      var warnings = context.warnings;\n      var references = context.references;\n      var elementsById = context.elementsById;\n\n      if (err) {\n        err.warnings = warnings;\n\n        return reject(err);\n      } else {\n        return resolve({\n          rootElement: rootElement,\n          elementsById: elementsById,\n          references: references,\n          warnings: warnings\n        });\n      }\n    });\n  };\n\n  Reader.prototype.handler = function(name) {\n    return new RootElementHandler(this.model, name);\n  };\n\n\n  // helpers //////////////////////////\n\n  function createStack() {\n    var stack = [];\n\n    Object.defineProperty(stack, 'peek', {\n      value: function() {\n        return this[this.length - 1];\n      }\n    });\n\n    return stack;\n  }\n\n  var XML_PREAMBLE = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n';\n\n  var ESCAPE_ATTR_CHARS = /<|>|'|\"|&|\\n\\r|\\n/g;\n  var ESCAPE_CHARS = /<|>|&/g;\n\n\n  function Namespaces(parent) {\n\n    var prefixMap = {};\n    var uriMap = {};\n    var used = {};\n\n    var wellknown = [];\n    var custom = [];\n\n    // API\n\n    this.byUri = function(uri) {\n      return uriMap[uri] || (\n        parent && parent.byUri(uri)\n      );\n    };\n\n    this.add = function(ns, isWellknown) {\n\n      uriMap[ns.uri] = ns;\n\n      if (isWellknown) {\n        wellknown.push(ns);\n      } else {\n        custom.push(ns);\n      }\n\n      this.mapPrefix(ns.prefix, ns.uri);\n    };\n\n    this.uriByPrefix = function(prefix) {\n      return prefixMap[prefix || 'xmlns'];\n    };\n\n    this.mapPrefix = function(prefix, uri) {\n      prefixMap[prefix || 'xmlns'] = uri;\n    };\n\n    this.getNSKey = function(ns) {\n      return (ns.prefix !== undefined) ? (ns.uri + '|' + ns.prefix) : ns.uri;\n    };\n\n    this.logUsed = function(ns) {\n\n      var uri = ns.uri;\n      var nsKey = this.getNSKey(ns);\n\n      used[nsKey] = this.byUri(uri);\n\n      // Inform parent recursively about the usage of this NS\n      if (parent) {\n        parent.logUsed(ns);\n      }\n    };\n\n    this.getUsed = function(ns) {\n\n      function isUsed(ns) {\n        var nsKey = self.getNSKey(ns);\n\n        return used[nsKey];\n      }\n\n      var self = this;\n\n      var allNs = [].concat(wellknown, custom);\n\n      return allNs.filter(isUsed);\n    };\n\n  }\n\n  function lower(string) {\n    return string.charAt(0).toLowerCase() + string.slice(1);\n  }\n\n  function nameToAlias(name, pkg) {\n    if (hasLowerCaseAlias(pkg)) {\n      return lower(name);\n    } else {\n      return name;\n    }\n  }\n\n  function inherits(ctor, superCtor) {\n    ctor.super_ = superCtor;\n    ctor.prototype = Object.create(superCtor.prototype, {\n      constructor: {\n        value: ctor,\n        enumerable: false,\n        writable: true,\n        configurable: true\n      }\n    });\n  }\n\n  function nsName(ns) {\n    if (isString(ns)) {\n      return ns;\n    } else {\n      return (ns.prefix ? ns.prefix + ':' : '') + ns.localName;\n    }\n  }\n\n  function getNsAttrs(namespaces) {\n\n    return namespaces.getUsed().filter(function(ns) {\n\n      // do not serialize built in <xml> namespace\n      return ns.prefix !== 'xml';\n    }).map(function(ns) {\n      var name = 'xmlns' + (ns.prefix ? ':' + ns.prefix : '');\n      return { name: name, value: ns.uri };\n    });\n\n  }\n\n  function getElementNs(ns, descriptor) {\n    if (descriptor.isGeneric) {\n      return assign$1({ localName: descriptor.ns.localName }, ns);\n    } else {\n      return assign$1({ localName: nameToAlias(descriptor.ns.localName, descriptor.$pkg) }, ns);\n    }\n  }\n\n  function getPropertyNs(ns, descriptor) {\n    return assign$1({ localName: descriptor.ns.localName }, ns);\n  }\n\n  function getSerializableProperties(element) {\n    var descriptor = element.$descriptor;\n\n    return filter(descriptor.properties, function(p) {\n      var name = p.name;\n\n      if (p.isVirtual) {\n        return false;\n      }\n\n      // do not serialize defaults\n      if (!has$1(element, name)) {\n        return false;\n      }\n\n      var value = element[name];\n\n      // do not serialize default equals\n      if (value === p.default) {\n        return false;\n      }\n\n      // do not serialize null properties\n      if (value === null) {\n        return false;\n      }\n\n      return p.isMany ? value.length : true;\n    });\n  }\n\n  var ESCAPE_ATTR_MAP = {\n    '\\n': '#10',\n    '\\n\\r': '#10',\n    '\"': '#34',\n    '\\'': '#39',\n    '<': '#60',\n    '>': '#62',\n    '&': '#38'\n  };\n\n  var ESCAPE_MAP = {\n    '<': 'lt',\n    '>': 'gt',\n    '&': 'amp'\n  };\n\n  function escape(str, charPattern, replaceMap) {\n\n    // ensure we are handling strings here\n    str = isString(str) ? str : '' + str;\n\n    return str.replace(charPattern, function(s) {\n      return '&' + replaceMap[s] + ';';\n    });\n  }\n\n  /**\n   * Escape a string attribute to not contain any bad values (line breaks, '\"', ...)\n   *\n   * @param {String} str the string to escape\n   * @return {String} the escaped string\n   */\n  function escapeAttr(str) {\n    return escape(str, ESCAPE_ATTR_CHARS, ESCAPE_ATTR_MAP);\n  }\n\n  function escapeBody(str) {\n    return escape(str, ESCAPE_CHARS, ESCAPE_MAP);\n  }\n\n  function filterAttributes(props) {\n    return filter(props, function(p) { return p.isAttr; });\n  }\n\n  function filterContained(props) {\n    return filter(props, function(p) { return !p.isAttr; });\n  }\n\n\n  function ReferenceSerializer(tagName) {\n    this.tagName = tagName;\n  }\n\n  ReferenceSerializer.prototype.build = function(element) {\n    this.element = element;\n    return this;\n  };\n\n  ReferenceSerializer.prototype.serializeTo = function(writer) {\n    writer\n      .appendIndent()\n      .append('<' + this.tagName + '>' + this.element.id + '</' + this.tagName + '>')\n      .appendNewLine();\n  };\n\n  function BodySerializer() {}\n\n  BodySerializer.prototype.serializeValue =\n  BodySerializer.prototype.serializeTo = function(writer) {\n    writer.append(\n      this.escape\n        ? escapeBody(this.value)\n        : this.value\n    );\n  };\n\n  BodySerializer.prototype.build = function(prop, value) {\n    this.value = value;\n\n    if (prop.type === 'String' && value.search(ESCAPE_CHARS) !== -1) {\n      this.escape = true;\n    }\n\n    return this;\n  };\n\n  function ValueSerializer(tagName) {\n    this.tagName = tagName;\n  }\n\n  inherits(ValueSerializer, BodySerializer);\n\n  ValueSerializer.prototype.serializeTo = function(writer) {\n\n    writer\n      .appendIndent()\n      .append('<' + this.tagName + '>');\n\n    this.serializeValue(writer);\n\n    writer\n      .append('</' + this.tagName + '>')\n      .appendNewLine();\n  };\n\n  function ElementSerializer(parent, propertyDescriptor) {\n    this.body = [];\n    this.attrs = [];\n\n    this.parent = parent;\n    this.propertyDescriptor = propertyDescriptor;\n  }\n\n  ElementSerializer.prototype.build = function(element) {\n    this.element = element;\n\n    var elementDescriptor = element.$descriptor,\n        propertyDescriptor = this.propertyDescriptor;\n\n    var otherAttrs,\n        properties;\n\n    var isGeneric = elementDescriptor.isGeneric;\n\n    if (isGeneric) {\n      otherAttrs = this.parseGeneric(element);\n    } else {\n      otherAttrs = this.parseNsAttributes(element);\n    }\n\n    if (propertyDescriptor) {\n      this.ns = this.nsPropertyTagName(propertyDescriptor);\n    } else {\n      this.ns = this.nsTagName(elementDescriptor);\n    }\n\n    // compute tag name\n    this.tagName = this.addTagName(this.ns);\n\n    if (!isGeneric) {\n      properties = getSerializableProperties(element);\n\n      this.parseAttributes(filterAttributes(properties));\n      this.parseContainments(filterContained(properties));\n    }\n\n    this.parseGenericAttributes(element, otherAttrs);\n\n    return this;\n  };\n\n  ElementSerializer.prototype.nsTagName = function(descriptor) {\n    var effectiveNs = this.logNamespaceUsed(descriptor.ns);\n    return getElementNs(effectiveNs, descriptor);\n  };\n\n  ElementSerializer.prototype.nsPropertyTagName = function(descriptor) {\n    var effectiveNs = this.logNamespaceUsed(descriptor.ns);\n    return getPropertyNs(effectiveNs, descriptor);\n  };\n\n  ElementSerializer.prototype.isLocalNs = function(ns) {\n    return ns.uri === this.ns.uri;\n  };\n\n  /**\n   * Get the actual ns attribute name for the given element.\n   *\n   * @param {Object} element\n   * @param {Boolean} [element.inherited=false]\n   *\n   * @return {Object} nsName\n   */\n  ElementSerializer.prototype.nsAttributeName = function(element) {\n\n    var ns;\n\n    if (isString(element)) {\n      ns = parseName(element);\n    } else {\n      ns = element.ns;\n    }\n\n    // return just local name for inherited attributes\n    if (element.inherited) {\n      return { localName: ns.localName };\n    }\n\n    // parse + log effective ns\n    var effectiveNs = this.logNamespaceUsed(ns);\n\n    // LOG ACTUAL namespace use\n    this.getNamespaces().logUsed(effectiveNs);\n\n    // strip prefix if same namespace like parent\n    if (this.isLocalNs(effectiveNs)) {\n      return { localName: ns.localName };\n    } else {\n      return assign$1({ localName: ns.localName }, effectiveNs);\n    }\n  };\n\n  ElementSerializer.prototype.parseGeneric = function(element) {\n\n    var self = this,\n        body = this.body;\n\n    var attributes = [];\n\n    forEach$1(element, function(val, key) {\n\n      var nonNsAttr;\n\n      if (key === '$body') {\n        body.push(new BodySerializer().build({ type: 'String' }, val));\n      } else\n      if (key === '$children') {\n        forEach$1(val, function(child) {\n          body.push(new ElementSerializer(self).build(child));\n        });\n      } else\n      if (key.indexOf('$') !== 0) {\n        nonNsAttr = self.parseNsAttribute(element, key, val);\n\n        if (nonNsAttr) {\n          attributes.push({ name: key, value: val });\n        }\n      }\n    });\n\n    return attributes;\n  };\n\n  ElementSerializer.prototype.parseNsAttribute = function(element, name, value) {\n    var model = element.$model;\n\n    var nameNs = parseName(name);\n\n    var ns;\n\n    // parse xmlns:foo=\"http://foo.bar\"\n    if (nameNs.prefix === 'xmlns') {\n      ns = { prefix: nameNs.localName, uri: value };\n    }\n\n    // parse xmlns=\"http://foo.bar\"\n    if (!nameNs.prefix && nameNs.localName === 'xmlns') {\n      ns = { uri: value };\n    }\n\n    if (!ns) {\n      return {\n        name: name,\n        value: value\n      };\n    }\n\n    if (model && model.getPackage(value)) {\n\n      // register well known namespace\n      this.logNamespace(ns, true, true);\n    } else {\n\n      // log custom namespace directly as used\n      var actualNs = this.logNamespaceUsed(ns, true);\n\n      this.getNamespaces().logUsed(actualNs);\n    }\n  };\n\n\n  /**\n   * Parse namespaces and return a list of left over generic attributes\n   *\n   * @param  {Object} element\n   * @return {Array<Object>}\n   */\n  ElementSerializer.prototype.parseNsAttributes = function(element, attrs) {\n    var self = this;\n\n    var genericAttrs = element.$attrs;\n\n    var attributes = [];\n\n    // parse namespace attributes first\n    // and log them. push non namespace attributes to a list\n    // and process them later\n    forEach$1(genericAttrs, function(value, name) {\n\n      var nonNsAttr = self.parseNsAttribute(element, name, value);\n\n      if (nonNsAttr) {\n        attributes.push(nonNsAttr);\n      }\n    });\n\n    return attributes;\n  };\n\n  ElementSerializer.prototype.parseGenericAttributes = function(element, attributes) {\n\n    var self = this;\n\n    forEach$1(attributes, function(attr) {\n\n      // do not serialize xsi:type attribute\n      // it is set manually based on the actual implementation type\n      if (attr.name === XSI_TYPE) {\n        return;\n      }\n\n      try {\n        self.addAttribute(self.nsAttributeName(attr.name), attr.value);\n      } catch (e) {\n        /* global console */\n\n        console.warn(\n          'missing namespace information for ',\n          attr.name, '=', attr.value, 'on', element,\n          e);\n      }\n    });\n  };\n\n  ElementSerializer.prototype.parseContainments = function(properties) {\n\n    var self = this,\n        body = this.body,\n        element = this.element;\n\n    forEach$1(properties, function(p) {\n      var value = element.get(p.name),\n          isReference = p.isReference,\n          isMany = p.isMany;\n\n      if (!isMany) {\n        value = [ value ];\n      }\n\n      if (p.isBody) {\n        body.push(new BodySerializer().build(p, value[0]));\n      } else\n      if (isSimple(p.type)) {\n        forEach$1(value, function(v) {\n          body.push(new ValueSerializer(self.addTagName(self.nsPropertyTagName(p))).build(p, v));\n        });\n      } else\n      if (isReference) {\n        forEach$1(value, function(v) {\n          body.push(new ReferenceSerializer(self.addTagName(self.nsPropertyTagName(p))).build(v));\n        });\n      } else {\n\n        // allow serialization via type\n        // rather than element name\n        var asType = serializeAsType(p),\n            asProperty = serializeAsProperty(p);\n\n        forEach$1(value, function(v) {\n          var serializer;\n\n          if (asType) {\n            serializer = new TypeSerializer(self, p);\n          } else\n          if (asProperty) {\n            serializer = new ElementSerializer(self, p);\n          } else {\n            serializer = new ElementSerializer(self);\n          }\n\n          body.push(serializer.build(v));\n        });\n      }\n    });\n  };\n\n  ElementSerializer.prototype.getNamespaces = function(local) {\n\n    var namespaces = this.namespaces,\n        parent = this.parent,\n        parentNamespaces;\n\n    if (!namespaces) {\n      parentNamespaces = parent && parent.getNamespaces();\n\n      if (local || !parentNamespaces) {\n        this.namespaces = namespaces = new Namespaces(parentNamespaces);\n      } else {\n        namespaces = parentNamespaces;\n      }\n    }\n\n    return namespaces;\n  };\n\n  ElementSerializer.prototype.logNamespace = function(ns, wellknown, local) {\n    var namespaces = this.getNamespaces(local);\n\n    var nsUri = ns.uri,\n        nsPrefix = ns.prefix;\n\n    var existing = namespaces.byUri(nsUri);\n\n    if (!existing || local) {\n      namespaces.add(ns, wellknown);\n    }\n\n    namespaces.mapPrefix(nsPrefix, nsUri);\n\n    return ns;\n  };\n\n  ElementSerializer.prototype.logNamespaceUsed = function(ns, local) {\n    var element = this.element,\n        model = element.$model,\n        namespaces = this.getNamespaces(local);\n\n    // ns may be\n    //\n    //   * prefix only\n    //   * prefix:uri\n    //   * localName only\n\n    var prefix = ns.prefix,\n        uri = ns.uri,\n        newPrefix, idx,\n        wellknownUri;\n\n    // handle anonymous namespaces (elementForm=unqualified), cf. #23\n    if (!prefix && !uri) {\n      return { localName: ns.localName };\n    }\n\n    wellknownUri = DEFAULT_NS_MAP[prefix] || model && (model.getPackage(prefix) || {}).uri;\n\n    uri = uri || wellknownUri || namespaces.uriByPrefix(prefix);\n\n    if (!uri) {\n      throw new Error('no namespace uri given for prefix <' + prefix + '>');\n    }\n\n    ns = namespaces.byUri(uri);\n\n    if (!ns) {\n      newPrefix = prefix;\n      idx = 1;\n\n      // find a prefix that is not mapped yet\n      while (namespaces.uriByPrefix(newPrefix)) {\n        newPrefix = prefix + '_' + idx++;\n      }\n\n      ns = this.logNamespace({ prefix: newPrefix, uri: uri }, wellknownUri === uri);\n    }\n\n    if (prefix) {\n      namespaces.mapPrefix(prefix, uri);\n    }\n\n    return ns;\n  };\n\n  ElementSerializer.prototype.parseAttributes = function(properties) {\n    var self = this,\n        element = this.element;\n\n    forEach$1(properties, function(p) {\n\n      var value = element.get(p.name);\n\n      if (p.isReference) {\n\n        if (!p.isMany) {\n          value = value.id;\n        }\n        else {\n          var values = [];\n          forEach$1(value, function(v) {\n            values.push(v.id);\n          });\n\n          // IDREFS is a whitespace-separated list of references.\n          value = values.join(' ');\n        }\n\n      }\n\n      self.addAttribute(self.nsAttributeName(p), value);\n    });\n  };\n\n  ElementSerializer.prototype.addTagName = function(nsTagName) {\n    var actualNs = this.logNamespaceUsed(nsTagName);\n\n    this.getNamespaces().logUsed(actualNs);\n\n    return nsName(nsTagName);\n  };\n\n  ElementSerializer.prototype.addAttribute = function(name, value) {\n    var attrs = this.attrs;\n\n    if (isString(value)) {\n      value = escapeAttr(value);\n    }\n\n    // de-duplicate attributes\n    // https://github.com/bpmn-io/moddle-xml/issues/66\n    var idx = findIndex(attrs, function(element) {\n      return (\n        element.name.localName === name.localName &&\n        element.name.uri === name.uri &&\n        element.name.prefix === name.prefix\n      );\n    });\n\n    var attr = { name: name, value: value };\n\n    if (idx !== -1) {\n      attrs.splice(idx, 1, attr);\n    } else {\n      attrs.push(attr);\n    }\n  };\n\n  ElementSerializer.prototype.serializeAttributes = function(writer) {\n    var attrs = this.attrs,\n        namespaces = this.namespaces;\n\n    if (namespaces) {\n      attrs = getNsAttrs(namespaces).concat(attrs);\n    }\n\n    forEach$1(attrs, function(a) {\n      writer\n        .append(' ')\n        .append(nsName(a.name)).append('=\"').append(a.value).append('\"');\n    });\n  };\n\n  ElementSerializer.prototype.serializeTo = function(writer) {\n    var firstBody = this.body[0],\n        indent = firstBody && firstBody.constructor !== BodySerializer;\n\n    writer\n      .appendIndent()\n      .append('<' + this.tagName);\n\n    this.serializeAttributes(writer);\n\n    writer.append(firstBody ? '>' : ' />');\n\n    if (firstBody) {\n\n      if (indent) {\n        writer\n          .appendNewLine()\n          .indent();\n      }\n\n      forEach$1(this.body, function(b) {\n        b.serializeTo(writer);\n      });\n\n      if (indent) {\n        writer\n          .unindent()\n          .appendIndent();\n      }\n\n      writer.append('</' + this.tagName + '>');\n    }\n\n    writer.appendNewLine();\n  };\n\n  /**\n   * A serializer for types that handles serialization of data types\n   */\n  function TypeSerializer(parent, propertyDescriptor) {\n    ElementSerializer.call(this, parent, propertyDescriptor);\n  }\n\n  inherits(TypeSerializer, ElementSerializer);\n\n  TypeSerializer.prototype.parseNsAttributes = function(element) {\n\n    // extracted attributes\n    var attributes = ElementSerializer.prototype.parseNsAttributes.call(this, element);\n\n    var descriptor = element.$descriptor;\n\n    // only serialize xsi:type if necessary\n    if (descriptor.name === this.propertyDescriptor.type) {\n      return attributes;\n    }\n\n    var typeNs = this.typeNs = this.nsTagName(descriptor);\n    this.getNamespaces().logUsed(this.typeNs);\n\n    // add xsi:type attribute to represent the elements\n    // actual type\n\n    var pkg = element.$model.getPackage(typeNs.uri),\n        typePrefix = (pkg.xml && pkg.xml.typePrefix) || '';\n\n    this.addAttribute(\n      this.nsAttributeName(XSI_TYPE),\n      (typeNs.prefix ? typeNs.prefix + ':' : '') + typePrefix + descriptor.ns.localName\n    );\n\n    return attributes;\n  };\n\n  TypeSerializer.prototype.isLocalNs = function(ns) {\n    return ns.uri === (this.typeNs || this.ns).uri;\n  };\n\n  function SavingWriter() {\n    this.value = '';\n\n    this.write = function(str) {\n      this.value += str;\n    };\n  }\n\n  function FormatingWriter(out, format) {\n\n    var indent = [ '' ];\n\n    this.append = function(str) {\n      out.write(str);\n\n      return this;\n    };\n\n    this.appendNewLine = function() {\n      if (format) {\n        out.write('\\n');\n      }\n\n      return this;\n    };\n\n    this.appendIndent = function() {\n      if (format) {\n        out.write(indent.join('  '));\n      }\n\n      return this;\n    };\n\n    this.indent = function() {\n      indent.push('');\n      return this;\n    };\n\n    this.unindent = function() {\n      indent.pop();\n      return this;\n    };\n  }\n\n  /**\n   * A writer for meta-model backed document trees\n   *\n   * @param {Object} options output options to pass into the writer\n   */\n  function Writer(options) {\n\n    options = assign$1({ format: false, preamble: true }, options || {});\n\n    function toXML(tree, writer) {\n      var internalWriter = writer || new SavingWriter();\n      var formatingWriter = new FormatingWriter(internalWriter, options.format);\n\n      if (options.preamble) {\n        formatingWriter.append(XML_PREAMBLE);\n      }\n\n      new ElementSerializer().build(tree).serializeTo(formatingWriter);\n\n      if (!writer) {\n        return internalWriter.value;\n      }\n    }\n\n    return {\n      toXML: toXML\n    };\n  }\n\n  /**\n   * A sub class of {@link Moddle} with support for import and export of BPMN 2.0 xml files.\n   *\n   * @class BpmnModdle\n   * @extends Moddle\n   *\n   * @param {Object|Array} packages to use for instantiating the model\n   * @param {Object} [options] additional options to pass over\n   */\n  function BpmnModdle(packages, options) {\n    Moddle.call(this, packages, options);\n  }\n\n  BpmnModdle.prototype = Object.create(Moddle.prototype);\n\n  /**\n   * The fromXML result.\n   *\n   * @typedef {Object} ParseResult\n   *\n   * @property {ModdleElement} rootElement\n   * @property {Array<Object>} references\n   * @property {Array<Error>} warnings\n   * @property {Object} elementsById - a mapping containing each ID -> ModdleElement\n   */\n\n  /**\n   * The fromXML error.\n   *\n   * @typedef {Error} ParseError\n   *\n   * @property {Array<Error>} warnings\n   */\n\n  /**\n   * Instantiates a BPMN model tree from a given xml string.\n   *\n   * @param {String}   xmlStr\n   * @param {String}   [typeName='bpmn:Definitions'] name of the root element\n   * @param {Object}   [options]  options to pass to the underlying reader\n   *\n   * @returns {Promise<ParseResult, ParseError>}\n   */\n  BpmnModdle.prototype.fromXML = function(xmlStr, typeName, options) {\n\n    if (!isString(typeName)) {\n      options = typeName;\n      typeName = 'bpmn:Definitions';\n    }\n\n    var reader = new Reader(assign$1({ model: this, lax: true }, options));\n    var rootHandler = reader.handler(typeName);\n\n    return reader.fromXML(xmlStr, rootHandler);\n  };\n\n\n  /**\n   * The toXML result.\n   *\n   * @typedef {Object} SerializationResult\n   *\n   * @property {String} xml\n   */\n\n  /**\n   * Serializes a BPMN 2.0 object tree to XML.\n   *\n   * @param {String}   element    the root element, typically an instance of `bpmn:Definitions`\n   * @param {Object}   [options]  to pass to the underlying writer\n   *\n   * @returns {Promise<SerializationResult, Error>}\n   */\n  BpmnModdle.prototype.toXML = function(element, options) {\n\n    var writer = new Writer(options);\n\n    return new Promise(function(resolve, reject) {\n      try {\n        var result = writer.toXML(element);\n\n        return resolve({\n          xml: result\n        });\n      } catch (err) {\n        return reject(err);\n      }\n    });\n  };\n\n  var name$5 = \"BPMN20\";\n  var uri$5 = \"http://www.omg.org/spec/BPMN/20100524/MODEL\";\n  var prefix$5 = \"bpmn\";\n  var associations$5 = [\n  ];\n  var types$5 = [\n  \t{\n  \t\tname: \"Interface\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"operations\",\n  \t\t\t\ttype: \"Operation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"implementationRef\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Operation\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inMessageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outMessageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"errorRef\",\n  \t\t\t\ttype: \"Error\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"implementationRef\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"EndPoint\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Auditing\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalTask\",\n  \t\tsuperClass: [\n  \t\t\t\"CallableElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"resources\",\n  \t\t\t\ttype: \"ResourceRole\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Monitoring\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Performer\",\n  \t\tsuperClass: [\n  \t\t\t\"ResourceRole\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Process\",\n  \t\tsuperClass: [\n  \t\t\t\"FlowElementsContainer\",\n  \t\t\t\"CallableElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"processType\",\n  \t\t\t\ttype: \"ProcessType\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isClosed\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"auditing\",\n  \t\t\t\ttype: \"Auditing\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"monitoring\",\n  \t\t\t\ttype: \"Monitoring\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"properties\",\n  \t\t\t\ttype: \"Property\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"laneSets\",\n  \t\t\t\tisMany: true,\n  \t\t\t\treplaces: \"FlowElementsContainer#laneSets\",\n  \t\t\t\ttype: \"LaneSet\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"flowElements\",\n  \t\t\t\tisMany: true,\n  \t\t\t\treplaces: \"FlowElementsContainer#flowElements\",\n  \t\t\t\ttype: \"FlowElement\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"artifacts\",\n  \t\t\t\ttype: \"Artifact\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"resources\",\n  \t\t\t\ttype: \"ResourceRole\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"correlationSubscriptions\",\n  \t\t\t\ttype: \"CorrelationSubscription\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"supports\",\n  \t\t\t\ttype: \"Process\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"definitionalCollaborationRef\",\n  \t\t\t\ttype: \"Collaboration\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isExecutable\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"LaneSet\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"lanes\",\n  \t\t\t\ttype: \"Lane\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Lane\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"partitionElementRef\",\n  \t\t\t\ttype: \"BaseElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"partitionElement\",\n  \t\t\t\ttype: \"BaseElement\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"flowNodeRef\",\n  \t\t\t\ttype: \"FlowNode\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"childLaneSet\",\n  \t\t\t\ttype: \"LaneSet\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalManualTask\",\n  \t\tsuperClass: [\n  \t\t\t\"GlobalTask\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ManualTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"UserTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"renderings\",\n  \t\t\t\ttype: \"Rendering\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Rendering\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"HumanPerformer\",\n  \t\tsuperClass: [\n  \t\t\t\"Performer\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"PotentialOwner\",\n  \t\tsuperClass: [\n  \t\t\t\"HumanPerformer\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalUserTask\",\n  \t\tsuperClass: [\n  \t\t\t\"GlobalTask\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"renderings\",\n  \t\t\t\ttype: \"Rendering\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Gateway\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"FlowNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"gatewayDirection\",\n  \t\t\t\ttype: \"GatewayDirection\",\n  \t\t\t\t\"default\": \"Unspecified\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"EventBasedGateway\",\n  \t\tsuperClass: [\n  \t\t\t\"Gateway\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"instantiate\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"eventGatewayType\",\n  \t\t\t\ttype: \"EventBasedGatewayType\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\t\"default\": \"Exclusive\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ComplexGateway\",\n  \t\tsuperClass: [\n  \t\t\t\"Gateway\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"activationCondition\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"default\",\n  \t\t\t\ttype: \"SequenceFlow\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ExclusiveGateway\",\n  \t\tsuperClass: [\n  \t\t\t\"Gateway\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"default\",\n  \t\t\t\ttype: \"SequenceFlow\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"InclusiveGateway\",\n  \t\tsuperClass: [\n  \t\t\t\"Gateway\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"default\",\n  \t\t\t\ttype: \"SequenceFlow\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ParallelGateway\",\n  \t\tsuperClass: [\n  \t\t\t\"Gateway\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"RootElement\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Relationship\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"type\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"direction\",\n  \t\t\t\ttype: \"RelationshipDirection\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"source\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"Element\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"target\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"Element\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BaseElement\",\n  \t\tisAbstract: true,\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"id\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\",\n  \t\t\t\tisId: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"documentation\",\n  \t\t\t\ttype: \"Documentation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extensionDefinitions\",\n  \t\t\t\ttype: \"ExtensionDefinition\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extensionElements\",\n  \t\t\t\ttype: \"ExtensionElements\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Extension\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"mustUnderstand\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"definition\",\n  \t\t\t\ttype: \"ExtensionDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ExtensionDefinition\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extensionAttributeDefinitions\",\n  \t\t\t\ttype: \"ExtensionAttributeDefinition\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ExtensionAttributeDefinition\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"type\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isReference\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extensionDefinition\",\n  \t\t\t\ttype: \"ExtensionDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ExtensionElements\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"valueRef\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"Element\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"values\",\n  \t\t\t\ttype: \"Element\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extensionAttributeDefinition\",\n  \t\t\t\ttype: \"ExtensionAttributeDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Documentation\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"text\",\n  \t\t\t\ttype: \"String\",\n  \t\t\t\tisBody: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"textFormat\",\n  \t\t\t\t\"default\": \"text/plain\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Event\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"FlowNode\",\n  \t\t\t\"InteractionNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"properties\",\n  \t\t\t\ttype: \"Property\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"IntermediateCatchEvent\",\n  \t\tsuperClass: [\n  \t\t\t\"CatchEvent\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"IntermediateThrowEvent\",\n  \t\tsuperClass: [\n  \t\t\t\"ThrowEvent\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"EndEvent\",\n  \t\tsuperClass: [\n  \t\t\t\"ThrowEvent\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"StartEvent\",\n  \t\tsuperClass: [\n  \t\t\t\"CatchEvent\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"isInterrupting\",\n  \t\t\t\t\"default\": true,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ThrowEvent\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Event\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"dataInputs\",\n  \t\t\t\ttype: \"DataInput\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataInputAssociations\",\n  \t\t\t\ttype: \"DataInputAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputSet\",\n  \t\t\t\ttype: \"InputSet\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"eventDefinitions\",\n  \t\t\t\ttype: \"EventDefinition\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"eventDefinitionRef\",\n  \t\t\t\ttype: \"EventDefinition\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CatchEvent\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Event\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"parallelMultiple\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\",\n  \t\t\t\t\"default\": false\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataOutputs\",\n  \t\t\t\ttype: \"DataOutput\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataOutputAssociations\",\n  \t\t\t\ttype: \"DataOutputAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputSet\",\n  \t\t\t\ttype: \"OutputSet\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"eventDefinitions\",\n  \t\t\t\ttype: \"EventDefinition\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"eventDefinitionRef\",\n  \t\t\t\ttype: \"EventDefinition\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BoundaryEvent\",\n  \t\tsuperClass: [\n  \t\t\t\"CatchEvent\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"cancelActivity\",\n  \t\t\t\t\"default\": true,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"attachedToRef\",\n  \t\t\t\ttype: \"Activity\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"EventDefinition\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CancelEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ErrorEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"errorRef\",\n  \t\t\t\ttype: \"Error\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"TerminateEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"EscalationEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"escalationRef\",\n  \t\t\t\ttype: \"Escalation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Escalation\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"structureRef\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"escalationCode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CompensateEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"waitForCompletion\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\",\n  \t\t\t\t\"default\": true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"activityRef\",\n  \t\t\t\ttype: \"Activity\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"TimerEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"timeDate\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"timeCycle\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"timeDuration\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"LinkEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"target\",\n  \t\t\t\ttype: \"LinkEventDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"source\",\n  \t\t\t\ttype: \"LinkEventDefinition\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"MessageEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"messageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"operationRef\",\n  \t\t\t\ttype: \"Operation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ConditionalEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"condition\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"SignalEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"signalRef\",\n  \t\t\t\ttype: \"Signal\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Signal\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"structureRef\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ImplicitThrowEvent\",\n  \t\tsuperClass: [\n  \t\t\t\"ThrowEvent\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataState\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ItemAwareElement\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"itemSubjectRef\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataState\",\n  \t\t\t\ttype: \"DataState\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataAssociation\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"sourceRef\",\n  \t\t\t\ttype: \"ItemAwareElement\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetRef\",\n  \t\t\t\ttype: \"ItemAwareElement\",\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"transformation\",\n  \t\t\t\ttype: \"FormalExpression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"property\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"assignment\",\n  \t\t\t\ttype: \"Assignment\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataInput\",\n  \t\tsuperClass: [\n  \t\t\t\"ItemAwareElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isCollection\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputSetRef\",\n  \t\t\t\ttype: \"InputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputSetWithOptional\",\n  \t\t\t\ttype: \"InputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputSetWithWhileExecuting\",\n  \t\t\t\ttype: \"InputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataOutput\",\n  \t\tsuperClass: [\n  \t\t\t\"ItemAwareElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isCollection\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputSetRef\",\n  \t\t\t\ttype: \"OutputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputSetWithOptional\",\n  \t\t\t\ttype: \"OutputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputSetWithWhileExecuting\",\n  \t\t\t\ttype: \"OutputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"InputSet\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataInputRefs\",\n  \t\t\t\ttype: \"DataInput\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"optionalInputRefs\",\n  \t\t\t\ttype: \"DataInput\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"whileExecutingInputRefs\",\n  \t\t\t\ttype: \"DataInput\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputSetRefs\",\n  \t\t\t\ttype: \"OutputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"OutputSet\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"dataOutputRefs\",\n  \t\t\t\ttype: \"DataOutput\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputSetRefs\",\n  \t\t\t\ttype: \"InputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"optionalOutputRefs\",\n  \t\t\t\ttype: \"DataOutput\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"whileExecutingOutputRefs\",\n  \t\t\t\ttype: \"DataOutput\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Property\",\n  \t\tsuperClass: [\n  \t\t\t\"ItemAwareElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataInputAssociation\",\n  \t\tsuperClass: [\n  \t\t\t\"DataAssociation\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataOutputAssociation\",\n  \t\tsuperClass: [\n  \t\t\t\"DataAssociation\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"InputOutputSpecification\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"dataInputs\",\n  \t\t\t\ttype: \"DataInput\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataOutputs\",\n  \t\t\t\ttype: \"DataOutput\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputSets\",\n  \t\t\t\ttype: \"InputSet\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputSets\",\n  \t\t\t\ttype: \"OutputSet\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataObject\",\n  \t\tsuperClass: [\n  \t\t\t\"FlowElement\",\n  \t\t\t\"ItemAwareElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"isCollection\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"InputOutputBinding\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"inputDataRef\",\n  \t\t\t\ttype: \"InputSet\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputDataRef\",\n  \t\t\t\ttype: \"OutputSet\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"operationRef\",\n  \t\t\t\ttype: \"Operation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Assignment\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"from\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"to\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataStore\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\",\n  \t\t\t\"ItemAwareElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"capacity\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Integer\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isUnlimited\",\n  \t\t\t\t\"default\": true,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataStoreReference\",\n  \t\tsuperClass: [\n  \t\t\t\"ItemAwareElement\",\n  \t\t\t\"FlowElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"dataStoreRef\",\n  \t\t\t\ttype: \"DataStore\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataObjectReference\",\n  \t\tsuperClass: [\n  \t\t\t\"ItemAwareElement\",\n  \t\t\t\"FlowElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"dataObjectRef\",\n  \t\t\t\ttype: \"DataObject\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ConversationLink\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"sourceRef\",\n  \t\t\t\ttype: \"InteractionNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetRef\",\n  \t\t\t\ttype: \"InteractionNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ConversationAssociation\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"innerConversationNodeRef\",\n  \t\t\t\ttype: \"ConversationNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outerConversationNodeRef\",\n  \t\t\t\ttype: \"ConversationNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CallConversation\",\n  \t\tsuperClass: [\n  \t\t\t\"ConversationNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"calledCollaborationRef\",\n  \t\t\t\ttype: \"Collaboration\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantAssociations\",\n  \t\t\t\ttype: \"ParticipantAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Conversation\",\n  \t\tsuperClass: [\n  \t\t\t\"ConversationNode\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"SubConversation\",\n  \t\tsuperClass: [\n  \t\t\t\"ConversationNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"conversationNodes\",\n  \t\t\t\ttype: \"ConversationNode\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ConversationNode\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"InteractionNode\",\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageFlowRefs\",\n  \t\t\t\ttype: \"MessageFlow\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"correlationKeys\",\n  \t\t\t\ttype: \"CorrelationKey\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalConversation\",\n  \t\tsuperClass: [\n  \t\t\t\"Collaboration\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"PartnerEntity\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"PartnerRole\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CorrelationProperty\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"correlationPropertyRetrievalExpression\",\n  \t\t\t\ttype: \"CorrelationPropertyRetrievalExpression\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"type\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Error\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"structureRef\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"errorCode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CorrelationKey\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"correlationPropertyRef\",\n  \t\t\t\ttype: \"CorrelationProperty\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Expression\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tisAbstract: false,\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"body\",\n  \t\t\t\tisBody: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"FormalExpression\",\n  \t\tsuperClass: [\n  \t\t\t\"Expression\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"language\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"evaluatesToTypeRef\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Message\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"itemRef\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ItemDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"itemKind\",\n  \t\t\t\ttype: \"ItemKind\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"structureRef\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isCollection\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"import\",\n  \t\t\t\ttype: \"Import\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"FlowElement\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"auditing\",\n  \t\t\t\ttype: \"Auditing\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"monitoring\",\n  \t\t\t\ttype: \"Monitoring\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"categoryValueRef\",\n  \t\t\t\ttype: \"CategoryValue\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"SequenceFlow\",\n  \t\tsuperClass: [\n  \t\t\t\"FlowElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"isImmediate\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"conditionExpression\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"sourceRef\",\n  \t\t\t\ttype: \"FlowNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetRef\",\n  \t\t\t\ttype: \"FlowNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"FlowElementsContainer\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"laneSets\",\n  \t\t\t\ttype: \"LaneSet\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"flowElements\",\n  \t\t\t\ttype: \"FlowElement\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CallableElement\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"ioSpecification\",\n  \t\t\t\ttype: \"InputOutputSpecification\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"property\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"supportedInterfaceRef\",\n  \t\t\t\ttype: \"Interface\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"ioBinding\",\n  \t\t\t\ttype: \"InputOutputBinding\",\n  \t\t\t\tisMany: true,\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"property\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"FlowNode\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"FlowElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"incoming\",\n  \t\t\t\ttype: \"SequenceFlow\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outgoing\",\n  \t\t\t\ttype: \"SequenceFlow\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"lanes\",\n  \t\t\t\ttype: \"Lane\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CorrelationPropertyRetrievalExpression\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"messagePath\",\n  \t\t\t\ttype: \"FormalExpression\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CorrelationPropertyBinding\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"dataPath\",\n  \t\t\t\ttype: \"FormalExpression\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"correlationPropertyRef\",\n  \t\t\t\ttype: \"CorrelationProperty\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Resource\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"resourceParameters\",\n  \t\t\t\ttype: \"ResourceParameter\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ResourceParameter\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isRequired\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"type\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CorrelationSubscription\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"correlationKeyRef\",\n  \t\t\t\ttype: \"CorrelationKey\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"correlationPropertyBinding\",\n  \t\t\t\ttype: \"CorrelationPropertyBinding\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"MessageFlow\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"sourceRef\",\n  \t\t\t\ttype: \"InteractionNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetRef\",\n  \t\t\t\ttype: \"InteractionNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"MessageFlowAssociation\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"innerMessageFlowRef\",\n  \t\t\t\ttype: \"MessageFlow\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outerMessageFlowRef\",\n  \t\t\t\ttype: \"MessageFlow\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"InteractionNode\",\n  \t\tisAbstract: true,\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"incomingConversationLinks\",\n  \t\t\t\ttype: \"ConversationLink\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outgoingConversationLinks\",\n  \t\t\t\ttype: \"ConversationLink\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Participant\",\n  \t\tsuperClass: [\n  \t\t\t\"InteractionNode\",\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"interfaceRef\",\n  \t\t\t\ttype: \"Interface\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantMultiplicity\",\n  \t\t\t\ttype: \"ParticipantMultiplicity\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"endPointRefs\",\n  \t\t\t\ttype: \"EndPoint\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"processRef\",\n  \t\t\t\ttype: \"Process\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ParticipantAssociation\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"innerParticipantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outerParticipantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ParticipantMultiplicity\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"minimum\",\n  \t\t\t\t\"default\": 0,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Integer\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"maximum\",\n  \t\t\t\t\"default\": 1,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Integer\"\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Collaboration\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isClosed\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participants\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageFlows\",\n  \t\t\t\ttype: \"MessageFlow\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"artifacts\",\n  \t\t\t\ttype: \"Artifact\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"conversations\",\n  \t\t\t\ttype: \"ConversationNode\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"conversationAssociations\",\n  \t\t\t\ttype: \"ConversationAssociation\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantAssociations\",\n  \t\t\t\ttype: \"ParticipantAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageFlowAssociations\",\n  \t\t\t\ttype: \"MessageFlowAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"correlationKeys\",\n  \t\t\t\ttype: \"CorrelationKey\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"choreographyRef\",\n  \t\t\t\ttype: \"Choreography\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"conversationLinks\",\n  \t\t\t\ttype: \"ConversationLink\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ChoreographyActivity\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"FlowNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"participantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"initiatingParticipantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"correlationKeys\",\n  \t\t\t\ttype: \"CorrelationKey\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopType\",\n  \t\t\t\ttype: \"ChoreographyLoopType\",\n  \t\t\t\t\"default\": \"None\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CallChoreography\",\n  \t\tsuperClass: [\n  \t\t\t\"ChoreographyActivity\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"calledChoreographyRef\",\n  \t\t\t\ttype: \"Choreography\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantAssociations\",\n  \t\t\t\ttype: \"ParticipantAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"SubChoreography\",\n  \t\tsuperClass: [\n  \t\t\t\"ChoreographyActivity\",\n  \t\t\t\"FlowElementsContainer\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"artifacts\",\n  \t\t\t\ttype: \"Artifact\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ChoreographyTask\",\n  \t\tsuperClass: [\n  \t\t\t\"ChoreographyActivity\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"messageFlowRef\",\n  \t\t\t\ttype: \"MessageFlow\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Choreography\",\n  \t\tsuperClass: [\n  \t\t\t\"Collaboration\",\n  \t\t\t\"FlowElementsContainer\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalChoreographyTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Choreography\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"initiatingParticipantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"TextAnnotation\",\n  \t\tsuperClass: [\n  \t\t\t\"Artifact\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"text\",\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"textFormat\",\n  \t\t\t\t\"default\": \"text/plain\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Group\",\n  \t\tsuperClass: [\n  \t\t\t\"Artifact\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"categoryValueRef\",\n  \t\t\t\ttype: \"CategoryValue\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Association\",\n  \t\tsuperClass: [\n  \t\t\t\"Artifact\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"associationDirection\",\n  \t\t\t\ttype: \"AssociationDirection\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"sourceRef\",\n  \t\t\t\ttype: \"BaseElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetRef\",\n  \t\t\t\ttype: \"BaseElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Category\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"categoryValue\",\n  \t\t\t\ttype: \"CategoryValue\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Artifact\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CategoryValue\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"categorizedFlowElements\",\n  \t\t\t\ttype: \"FlowElement\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"value\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Activity\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"FlowNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"isForCompensation\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"default\",\n  \t\t\t\ttype: \"SequenceFlow\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"ioSpecification\",\n  \t\t\t\ttype: \"InputOutputSpecification\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"property\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"boundaryEventRefs\",\n  \t\t\t\ttype: \"BoundaryEvent\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"properties\",\n  \t\t\t\ttype: \"Property\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataInputAssociations\",\n  \t\t\t\ttype: \"DataInputAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataOutputAssociations\",\n  \t\t\t\ttype: \"DataOutputAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"startQuantity\",\n  \t\t\t\t\"default\": 1,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Integer\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"resources\",\n  \t\t\t\ttype: \"ResourceRole\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"completionQuantity\",\n  \t\t\t\t\"default\": 1,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Integer\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopCharacteristics\",\n  \t\t\t\ttype: \"LoopCharacteristics\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ServiceTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"operationRef\",\n  \t\t\t\ttype: \"Operation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"SubProcess\",\n  \t\tsuperClass: [\n  \t\t\t\"Activity\",\n  \t\t\t\"FlowElementsContainer\",\n  \t\t\t\"InteractionNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"triggeredByEvent\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"artifacts\",\n  \t\t\t\ttype: \"Artifact\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"LoopCharacteristics\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"MultiInstanceLoopCharacteristics\",\n  \t\tsuperClass: [\n  \t\t\t\"LoopCharacteristics\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"isSequential\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"behavior\",\n  \t\t\t\ttype: \"MultiInstanceBehavior\",\n  \t\t\t\t\"default\": \"All\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopCardinality\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopDataInputRef\",\n  \t\t\t\ttype: \"ItemAwareElement\",\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopDataOutputRef\",\n  \t\t\t\ttype: \"ItemAwareElement\",\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputDataItem\",\n  \t\t\t\ttype: \"DataInput\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"property\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputDataItem\",\n  \t\t\t\ttype: \"DataOutput\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"property\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"complexBehaviorDefinition\",\n  \t\t\t\ttype: \"ComplexBehaviorDefinition\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"completionCondition\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"oneBehaviorEventRef\",\n  \t\t\t\ttype: \"EventDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"noneBehaviorEventRef\",\n  \t\t\t\ttype: \"EventDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"StandardLoopCharacteristics\",\n  \t\tsuperClass: [\n  \t\t\t\"LoopCharacteristics\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"testBefore\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopCondition\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopMaximum\",\n  \t\t\t\ttype: \"Integer\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CallActivity\",\n  \t\tsuperClass: [\n  \t\t\t\"Activity\",\n  \t\t\t\"InteractionNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"calledElement\",\n  \t\t\t\ttype: \"String\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Task\",\n  \t\tsuperClass: [\n  \t\t\t\"Activity\",\n  \t\t\t\"InteractionNode\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"SendTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"operationRef\",\n  \t\t\t\ttype: \"Operation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ReceiveTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"instantiate\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"operationRef\",\n  \t\t\t\ttype: \"Operation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ScriptTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"scriptFormat\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"script\",\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BusinessRuleTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"AdHocSubProcess\",\n  \t\tsuperClass: [\n  \t\t\t\"SubProcess\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"completionCondition\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"ordering\",\n  \t\t\t\ttype: \"AdHocOrdering\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"cancelRemainingInstances\",\n  \t\t\t\t\"default\": true,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Transaction\",\n  \t\tsuperClass: [\n  \t\t\t\"SubProcess\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"protocol\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"method\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalScriptTask\",\n  \t\tsuperClass: [\n  \t\t\t\"GlobalTask\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"scriptLanguage\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"script\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalBusinessRuleTask\",\n  \t\tsuperClass: [\n  \t\t\t\"GlobalTask\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ComplexBehaviorDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"condition\",\n  \t\t\t\ttype: \"FormalExpression\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"event\",\n  \t\t\t\ttype: \"ImplicitThrowEvent\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ResourceRole\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"resourceRef\",\n  \t\t\t\ttype: \"Resource\",\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"resourceParameterBindings\",\n  \t\t\t\ttype: \"ResourceParameterBinding\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"resourceAssignmentExpression\",\n  \t\t\t\ttype: \"ResourceAssignmentExpression\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ResourceParameterBinding\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"expression\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"parameterRef\",\n  \t\t\t\ttype: \"ResourceParameter\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ResourceAssignmentExpression\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"expression\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Import\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"importType\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"location\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"namespace\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Definitions\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetNamespace\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"expressionLanguage\",\n  \t\t\t\t\"default\": \"http://www.w3.org/1999/XPath\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"typeLanguage\",\n  \t\t\t\t\"default\": \"http://www.w3.org/2001/XMLSchema\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"imports\",\n  \t\t\t\ttype: \"Import\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extensions\",\n  \t\t\t\ttype: \"Extension\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"rootElements\",\n  \t\t\t\ttype: \"RootElement\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"diagrams\",\n  \t\t\t\tisMany: true,\n  \t\t\t\ttype: \"bpmndi:BPMNDiagram\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"exporter\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"relationships\",\n  \t\t\t\ttype: \"Relationship\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"exporterVersion\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var enumerations$3 = [\n  \t{\n  \t\tname: \"ProcessType\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"None\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Public\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Private\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GatewayDirection\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"Unspecified\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Converging\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Diverging\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Mixed\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"EventBasedGatewayType\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"Parallel\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Exclusive\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"RelationshipDirection\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"None\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Forward\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Backward\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Both\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ItemKind\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"Physical\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Information\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ChoreographyLoopType\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"None\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Standard\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"MultiInstanceSequential\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"MultiInstanceParallel\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"AssociationDirection\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"None\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"One\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Both\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"MultiInstanceBehavior\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"None\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"One\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"All\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Complex\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"AdHocOrdering\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"Parallel\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Sequential\"\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var xml$1 = {\n  \ttagAlias: \"lowerCase\",\n  \ttypePrefix: \"t\"\n  };\n  var BpmnPackage = {\n  \tname: name$5,\n  \turi: uri$5,\n  \tprefix: prefix$5,\n  \tassociations: associations$5,\n  \ttypes: types$5,\n  \tenumerations: enumerations$3,\n  \txml: xml$1\n  };\n\n  var name$4 = \"BPMNDI\";\n  var uri$4 = \"http://www.omg.org/spec/BPMN/20100524/DI\";\n  var prefix$4 = \"bpmndi\";\n  var types$4 = [\n  \t{\n  \t\tname: \"BPMNDiagram\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"plane\",\n  \t\t\t\ttype: \"BPMNPlane\",\n  \t\t\t\tredefines: \"di:Diagram#rootElement\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"labelStyle\",\n  \t\t\t\ttype: \"BPMNLabelStyle\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"di:Diagram\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BPMNPlane\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"bpmnElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"bpmn:BaseElement\",\n  \t\t\t\tredefines: \"di:DiagramElement#modelElement\"\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"di:Plane\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BPMNShape\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"bpmnElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"bpmn:BaseElement\",\n  \t\t\t\tredefines: \"di:DiagramElement#modelElement\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isHorizontal\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isExpanded\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isMarkerVisible\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"label\",\n  \t\t\t\ttype: \"BPMNLabel\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isMessageVisible\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantBandKind\",\n  \t\t\t\ttype: \"ParticipantBandKind\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"choreographyActivityShape\",\n  \t\t\t\ttype: \"BPMNShape\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"di:LabeledShape\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BPMNEdge\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"label\",\n  \t\t\t\ttype: \"BPMNLabel\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"bpmnElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"bpmn:BaseElement\",\n  \t\t\t\tredefines: \"di:DiagramElement#modelElement\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"sourceElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"di:DiagramElement\",\n  \t\t\t\tredefines: \"di:Edge#source\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"di:DiagramElement\",\n  \t\t\t\tredefines: \"di:Edge#target\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageVisibleKind\",\n  \t\t\t\ttype: \"MessageVisibleKind\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\t\"default\": \"initiating\"\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"di:LabeledEdge\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BPMNLabel\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"labelStyle\",\n  \t\t\t\ttype: \"BPMNLabelStyle\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\tredefines: \"di:DiagramElement#style\"\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"di:Label\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BPMNLabelStyle\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"font\",\n  \t\t\t\ttype: \"dc:Font\"\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"di:Style\"\n  \t\t]\n  \t}\n  ];\n  var enumerations$2 = [\n  \t{\n  \t\tname: \"ParticipantBandKind\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"top_initiating\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"middle_initiating\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"bottom_initiating\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"top_non_initiating\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"middle_non_initiating\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"bottom_non_initiating\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"MessageVisibleKind\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"initiating\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"non_initiating\"\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var associations$4 = [\n  ];\n  var BpmnDiPackage = {\n  \tname: name$4,\n  \turi: uri$4,\n  \tprefix: prefix$4,\n  \ttypes: types$4,\n  \tenumerations: enumerations$2,\n  \tassociations: associations$4\n  };\n\n  var name$3 = \"DC\";\n  var uri$3 = \"http://www.omg.org/spec/DD/20100524/DC\";\n  var prefix$3 = \"dc\";\n  var types$3 = [\n  \t{\n  \t\tname: \"Boolean\"\n  \t},\n  \t{\n  \t\tname: \"Integer\"\n  \t},\n  \t{\n  \t\tname: \"Real\"\n  \t},\n  \t{\n  \t\tname: \"String\"\n  \t},\n  \t{\n  \t\tname: \"Font\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\ttype: \"String\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"size\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isBold\",\n  \t\t\t\ttype: \"Boolean\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isItalic\",\n  \t\t\t\ttype: \"Boolean\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isUnderline\",\n  \t\t\t\ttype: \"Boolean\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isStrikeThrough\",\n  \t\t\t\ttype: \"Boolean\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Point\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"x\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\t\"default\": \"0\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"y\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\t\"default\": \"0\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Bounds\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"x\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\t\"default\": \"0\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"y\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\t\"default\": \"0\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"width\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"height\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var associations$3 = [\n  ];\n  var DcPackage = {\n  \tname: name$3,\n  \turi: uri$3,\n  \tprefix: prefix$3,\n  \ttypes: types$3,\n  \tassociations: associations$3\n  };\n\n  var name$2 = \"DI\";\n  var uri$2 = \"http://www.omg.org/spec/DD/20100524/DI\";\n  var prefix$2 = \"di\";\n  var types$2 = [\n  \t{\n  \t\tname: \"DiagramElement\",\n  \t\tisAbstract: true,\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"id\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisId: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extension\",\n  \t\t\t\ttype: \"Extension\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"owningDiagram\",\n  \t\t\t\ttype: \"Diagram\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"owningElement\",\n  \t\t\t\ttype: \"DiagramElement\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"modelElement\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"Element\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"style\",\n  \t\t\t\ttype: \"Style\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"ownedElement\",\n  \t\t\t\ttype: \"DiagramElement\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Node\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"DiagramElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Edge\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"DiagramElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"source\",\n  \t\t\t\ttype: \"DiagramElement\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"target\",\n  \t\t\t\ttype: \"DiagramElement\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"waypoint\",\n  \t\t\t\tisUnique: false,\n  \t\t\t\tisMany: true,\n  \t\t\t\ttype: \"dc:Point\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Diagram\",\n  \t\tisAbstract: true,\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"id\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisId: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"rootElement\",\n  \t\t\t\ttype: \"DiagramElement\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"documentation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"resolution\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Real\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"ownedStyle\",\n  \t\t\t\ttype: \"Style\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Shape\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Node\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"bounds\",\n  \t\t\t\ttype: \"dc:Bounds\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Plane\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Node\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"planeElement\",\n  \t\t\t\ttype: \"DiagramElement\",\n  \t\t\t\tsubsettedProperty: \"DiagramElement-ownedElement\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"LabeledEdge\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Edge\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"ownedLabel\",\n  \t\t\t\ttype: \"Label\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tsubsettedProperty: \"DiagramElement-ownedElement\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"LabeledShape\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Shape\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"ownedLabel\",\n  \t\t\t\ttype: \"Label\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tsubsettedProperty: \"DiagramElement-ownedElement\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Label\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Node\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"bounds\",\n  \t\t\t\ttype: \"dc:Bounds\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Style\",\n  \t\tisAbstract: true,\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"id\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisId: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Extension\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"values\",\n  \t\t\t\tisMany: true,\n  \t\t\t\ttype: \"Element\"\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var associations$2 = [\n  ];\n  var xml = {\n  \ttagAlias: \"lowerCase\"\n  };\n  var DiPackage = {\n  \tname: name$2,\n  \turi: uri$2,\n  \tprefix: prefix$2,\n  \ttypes: types$2,\n  \tassociations: associations$2,\n  \txml: xml\n  };\n\n  var name$1 = \"bpmn.io colors for BPMN\";\n  var uri$1 = \"http://bpmn.io/schema/bpmn/biocolor/1.0\";\n  var prefix$1 = \"bioc\";\n  var types$1 = [\n  \t{\n  \t\tname: \"ColoredShape\",\n  \t\t\"extends\": [\n  \t\t\t\"bpmndi:BPMNShape\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"stroke\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"fill\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ColoredEdge\",\n  \t\t\"extends\": [\n  \t\t\t\"bpmndi:BPMNEdge\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"stroke\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"fill\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var enumerations$1 = [\n  ];\n  var associations$1 = [\n  ];\n  var BiocPackage = {\n  \tname: name$1,\n  \turi: uri$1,\n  \tprefix: prefix$1,\n  \ttypes: types$1,\n  \tenumerations: enumerations$1,\n  \tassociations: associations$1\n  };\n\n  var name = \"BPMN in Color\";\n  var uri = \"http://www.omg.org/spec/BPMN/non-normative/color/1.0\";\n  var prefix = \"color\";\n  var types = [\n  \t{\n  \t\tname: \"ColoredLabel\",\n  \t\t\"extends\": [\n  \t\t\t\"bpmndi:BPMNLabel\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"color\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ColoredShape\",\n  \t\t\"extends\": [\n  \t\t\t\"bpmndi:BPMNShape\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"background-color\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"border-color\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ColoredEdge\",\n  \t\t\"extends\": [\n  \t\t\t\"bpmndi:BPMNEdge\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"border-color\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var enumerations = [\n  ];\n  var associations = [\n  ];\n  var BpmnInColorPackage = {\n  \tname: name,\n  \turi: uri,\n  \tprefix: prefix,\n  \ttypes: types,\n  \tenumerations: enumerations,\n  \tassociations: associations\n  };\n\n  var packages = {\n    bpmn: BpmnPackage,\n    bpmndi: BpmnDiPackage,\n    dc: DcPackage,\n    di: DiPackage,\n    bioc: BiocPackage,\n    color: BpmnInColorPackage\n  };\n\n  function simple(additionalPackages, options) {\n    var pks = assign$1({}, packages, additionalPackages);\n\n    return new BpmnModdle(pks, options);\n  }\n\n  /**\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   */\n\n  // TODO(nikku): remove with future bpmn-js version\n\n  /**\n   * Wraps APIs to check:\n   *\n   * 1) If a callback is passed -> Warn users about callback deprecation.\n   * 2) If Promise class is implemented in current environment.\n   *\n   * @private\n   *\n   * @param {Function} api\n   *\n   * @return {Function}\n   */\n  function wrapForCompatibility(api) {\n\n    return function() {\n\n      if (!window.Promise) {\n        throw new Error('Promises is not supported in this environment. Please polyfill Promise.');\n      }\n\n      var argLen = arguments.length;\n      if (argLen >= 1 && isFunction(arguments[argLen - 1])) {\n\n        var callback = arguments[argLen - 1];\n\n        console.warn(new Error(\n          'Passing callbacks to ' + api.name + ' is deprecated and will be removed in a future major release. ' +\n          'Please switch to promises: https://bpmn.io/l/moving-to-promises.html'\n        ));\n\n        var argsWithoutCallback = Array.prototype.slice.call(arguments, 0, -1);\n\n        api.apply(this, argsWithoutCallback).then(function(result) {\n\n          var firstKey = Object.keys(result)[0];\n\n          // The APIs we are wrapping all resolve a single item depending on the API.\n          // For instance, importXML resolves { warnings } and saveXML returns { xml }.\n          // That's why we can call the callback with the first item of result.\n          return callback(null, result[firstKey]);\n\n          // Passing a second paramter instead of catch because we don't want to\n          // catch errors thrown by callback().\n        }, function(err) {\n\n          return callback(err, err.warnings);\n        });\n      } else {\n\n        return api.apply(this, arguments);\n      }\n    };\n  }\n\n\n  // TODO(nikku): remove with future bpmn-js version\n\n  var DI_ERROR_MESSAGE = 'Tried to access di from the businessObject. The di is available through the diagram element only. For more information, see https://github.com/bpmn-io/bpmn-js/issues/1472';\n\n  /**\n   * @private\n   *\n   * @param {ModdleElement} businessObject\n   */\n  function ensureCompatDiRef(businessObject) {\n\n    // bpmnElement can have multiple independent DIs\n    if (!has$1(businessObject, 'di')) {\n      Object.defineProperty(businessObject, 'di', {\n        enumerable: false,\n        get: function() {\n          throw new Error(DI_ERROR_MESSAGE);\n        }\n      });\n    }\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n   *\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   */\n\n  /**\n   * Returns true if an element is of the given meta-model type.\n   *\n   * @param {ModdleElement} element\n   * @param {string} type\n   *\n   * @return {boolean}\n   */\n  function is(element, type) {\n    return element.$instanceOf(type);\n  }\n\n\n  /**\n   * Find a suitable display candidate for definitions where the DI does not\n   * correctly specify one.\n   *\n   * @param {ModdleElement} definitions\n   *\n   * @return {ModdleElement}\n   */\n  function findDisplayCandidate(definitions) {\n    return find(definitions.rootElements, function(e) {\n      return is(e, 'bpmn:Process') || is(e, 'bpmn:Collaboration');\n    });\n  }\n\n  /**\n   * @param {Record<'element' | 'root' | 'error', Function>} handler\n   * @param {Translate} translate\n   */\n  function BpmnTreeWalker(handler, translate) {\n\n    // list of containers already walked\n    var handledElements = {};\n\n    // list of elements to handle deferred to ensure\n    // prerequisites are drawn\n    var deferred = [];\n\n    var diMap = {};\n\n    // Helpers //////////////////////\n\n    function contextual(fn, ctx) {\n      return function(e) {\n        fn(e, ctx);\n      };\n    }\n\n    function handled(element) {\n      handledElements[element.id] = element;\n    }\n\n    function isHandled(element) {\n      return handledElements[element.id];\n    }\n\n    function visit(element, ctx) {\n\n      var gfx = element.gfx;\n\n      // avoid multiple rendering of elements\n      if (gfx) {\n        throw new Error(\n          translate('already rendered {element}', { element: elementToString(element) })\n        );\n      }\n\n      // call handler\n      return handler.element(element, diMap[element.id], ctx);\n    }\n\n    function visitRoot(element, diagram) {\n      return handler.root(element, diMap[element.id], diagram);\n    }\n\n    function visitIfDi(element, ctx) {\n\n      try {\n        var gfx = diMap[element.id] && visit(element, ctx);\n\n        handled(element);\n\n        return gfx;\n      } catch (e) {\n        logError(e.message, { element: element, error: e });\n\n        console.error(translate('failed to import {element}', { element: elementToString(element) }));\n        console.error(e);\n      }\n    }\n\n    function logError(message, context) {\n      handler.error(message, context);\n    }\n\n    // DI handling //////////////////////\n\n    var registerDi = this.registerDi = function registerDi(di) {\n      var bpmnElement = di.bpmnElement;\n\n      if (bpmnElement) {\n        if (diMap[bpmnElement.id]) {\n          logError(\n            translate('multiple DI elements defined for {element}', {\n              element: elementToString(bpmnElement)\n            }),\n            { element: bpmnElement }\n          );\n        } else {\n          diMap[bpmnElement.id] = di;\n\n          ensureCompatDiRef(bpmnElement);\n        }\n      } else {\n        logError(\n          translate('no bpmnElement referenced in {element}', {\n            element: elementToString(di)\n          }),\n          { element: di }\n        );\n      }\n    };\n\n    function handleDiagram(diagram) {\n      handlePlane(diagram.plane);\n    }\n\n    function handlePlane(plane) {\n      registerDi(plane);\n\n      forEach$1(plane.planeElement, handlePlaneElement);\n    }\n\n    function handlePlaneElement(planeElement) {\n      registerDi(planeElement);\n    }\n\n\n    // Semantic handling //////////////////////\n\n    /**\n     * Handle definitions and return the rendered diagram (if any).\n     *\n     * @param {ModdleElement} definitions to walk and import\n     * @param {ModdleElement} [diagram] specific diagram to import and display\n     *\n     * @throws {Error} if no diagram to display could be found\n     */\n    this.handleDefinitions = function handleDefinitions(definitions, diagram) {\n\n      // make sure we walk the correct bpmnElement\n\n      var diagrams = definitions.diagrams;\n\n      if (diagram && diagrams.indexOf(diagram) === -1) {\n        throw new Error(translate('diagram not part of bpmn:Definitions'));\n      }\n\n      if (!diagram && diagrams && diagrams.length) {\n        diagram = diagrams[0];\n      }\n\n      // no diagram -> nothing to import\n      if (!diagram) {\n        throw new Error(translate('no diagram to display'));\n      }\n\n      // load DI from selected diagram only\n      diMap = {};\n      handleDiagram(diagram);\n\n\n      var plane = diagram.plane;\n\n      if (!plane) {\n        throw new Error(translate(\n          'no plane for {element}',\n          { element: elementToString(diagram) }\n        ));\n      }\n\n      var rootElement = plane.bpmnElement;\n\n      // ensure we default to a suitable display candidate (process or collaboration),\n      // even if non is specified in DI\n      if (!rootElement) {\n        rootElement = findDisplayCandidate(definitions);\n\n        if (!rootElement) {\n          throw new Error(translate('no process or collaboration to display'));\n        } else {\n\n          logError(\n            translate('correcting missing bpmnElement on {plane} to {rootElement}', {\n              plane: elementToString(plane),\n              rootElement: elementToString(rootElement)\n            })\n          );\n\n          // correct DI on the fly\n          plane.bpmnElement = rootElement;\n          registerDi(plane);\n        }\n      }\n\n\n      var ctx = visitRoot(rootElement, plane);\n\n      if (is(rootElement, 'bpmn:Process') || is(rootElement, 'bpmn:SubProcess')) {\n        handleProcess(rootElement, ctx);\n      } else if (is(rootElement, 'bpmn:Collaboration')) {\n        handleCollaboration(rootElement, ctx);\n\n        // force drawing of everything not yet drawn that is part of the target DI\n        handleUnhandledProcesses(definitions.rootElements, ctx);\n      } else {\n        throw new Error(\n          translate('unsupported bpmnElement for {plane}: {rootElement}', {\n            plane: elementToString(plane),\n            rootElement: elementToString(rootElement)\n          })\n        );\n      }\n\n      // handle all deferred elements\n      handleDeferred(deferred);\n    };\n\n    var handleDeferred = this.handleDeferred = function handleDeferred() {\n\n      var fn;\n\n      // drain deferred until empty\n      while (deferred.length) {\n        fn = deferred.shift();\n\n        fn();\n      }\n    };\n\n    function handleProcess(process, context) {\n      handleFlowElementsContainer(process, context);\n      handleIoSpecification(process.ioSpecification, context);\n\n      handleArtifacts(process.artifacts, context);\n\n      // log process handled\n      handled(process);\n    }\n\n    function handleUnhandledProcesses(rootElements, ctx) {\n\n      // walk through all processes that have not yet been drawn and draw them\n      // if they contain lanes with DI information.\n      // we do this to pass the free-floating lane test cases in the MIWG test suite\n      var processes = filter(rootElements, function(e) {\n        return !isHandled(e) && is(e, 'bpmn:Process') && e.laneSets;\n      });\n\n      processes.forEach(contextual(handleProcess, ctx));\n    }\n\n    function handleMessageFlow(messageFlow, context) {\n      visitIfDi(messageFlow, context);\n    }\n\n    function handleMessageFlows(messageFlows, context) {\n      forEach$1(messageFlows, contextual(handleMessageFlow, context));\n    }\n\n    function handleDataAssociation(association, context) {\n      visitIfDi(association, context);\n    }\n\n    function handleDataInput(dataInput, context) {\n      visitIfDi(dataInput, context);\n    }\n\n    function handleDataOutput(dataOutput, context) {\n      visitIfDi(dataOutput, context);\n    }\n\n    function handleArtifact(artifact, context) {\n\n      // bpmn:TextAnnotation\n      // bpmn:Group\n      // bpmn:Association\n\n      visitIfDi(artifact, context);\n    }\n\n    function handleArtifacts(artifacts, context) {\n\n      forEach$1(artifacts, function(e) {\n        if (is(e, 'bpmn:Association')) {\n          deferred.push(function() {\n            handleArtifact(e, context);\n          });\n        } else {\n          handleArtifact(e, context);\n        }\n      });\n    }\n\n    function handleIoSpecification(ioSpecification, context) {\n\n      if (!ioSpecification) {\n        return;\n      }\n\n      forEach$1(ioSpecification.dataInputs, contextual(handleDataInput, context));\n      forEach$1(ioSpecification.dataOutputs, contextual(handleDataOutput, context));\n    }\n\n    var handleSubProcess = this.handleSubProcess = function handleSubProcess(subProcess, context) {\n      handleFlowElementsContainer(subProcess, context);\n      handleArtifacts(subProcess.artifacts, context);\n    };\n\n    function handleFlowNode(flowNode, context) {\n      var childCtx = visitIfDi(flowNode, context);\n\n      if (is(flowNode, 'bpmn:SubProcess')) {\n        handleSubProcess(flowNode, childCtx || context);\n      }\n\n      if (is(flowNode, 'bpmn:Activity')) {\n        handleIoSpecification(flowNode.ioSpecification, context);\n      }\n\n      // defer handling of associations\n      // affected types:\n      //\n      //   * bpmn:Activity\n      //   * bpmn:ThrowEvent\n      //   * bpmn:CatchEvent\n      //\n      deferred.push(function() {\n        forEach$1(flowNode.dataInputAssociations, contextual(handleDataAssociation, context));\n        forEach$1(flowNode.dataOutputAssociations, contextual(handleDataAssociation, context));\n      });\n    }\n\n    function handleSequenceFlow(sequenceFlow, context) {\n      visitIfDi(sequenceFlow, context);\n    }\n\n    function handleDataElement(dataObject, context) {\n      visitIfDi(dataObject, context);\n    }\n\n    function handleLane(lane, context) {\n\n      deferred.push(function() {\n\n        var newContext = visitIfDi(lane, context);\n\n        if (lane.childLaneSet) {\n          handleLaneSet(lane.childLaneSet, newContext || context);\n        }\n\n        wireFlowNodeRefs(lane);\n      });\n    }\n\n    function handleLaneSet(laneSet, context) {\n      forEach$1(laneSet.lanes, contextual(handleLane, context));\n    }\n\n    function handleLaneSets(laneSets, context) {\n      forEach$1(laneSets, contextual(handleLaneSet, context));\n    }\n\n    function handleFlowElementsContainer(container, context) {\n      handleFlowElements(container.flowElements, context);\n\n      if (container.laneSets) {\n        handleLaneSets(container.laneSets, context);\n      }\n    }\n\n    function handleFlowElements(flowElements, context) {\n      forEach$1(flowElements, function(e) {\n        if (is(e, 'bpmn:SequenceFlow')) {\n          deferred.push(function() {\n            handleSequenceFlow(e, context);\n          });\n        } else if (is(e, 'bpmn:BoundaryEvent')) {\n          deferred.unshift(function() {\n            handleFlowNode(e, context);\n          });\n        } else if (is(e, 'bpmn:FlowNode')) {\n          handleFlowNode(e, context);\n        } else if (is(e, 'bpmn:DataObject')) ; else if (is(e, 'bpmn:DataStoreReference')) {\n          handleDataElement(e, context);\n        } else if (is(e, 'bpmn:DataObjectReference')) {\n          handleDataElement(e, context);\n        } else {\n          logError(\n            translate('unrecognized flowElement {element} in context {context}', {\n              element: elementToString(e),\n              context: (context ? elementToString(context.businessObject) : 'null')\n            }),\n            { element: e, context: context }\n          );\n        }\n      });\n    }\n\n    function handleParticipant(participant, context) {\n      var newCtx = visitIfDi(participant, context);\n\n      var process = participant.processRef;\n      if (process) {\n        handleProcess(process, newCtx || context);\n      }\n    }\n\n    function handleCollaboration(collaboration, context) {\n\n      forEach$1(collaboration.participants, contextual(handleParticipant, context));\n\n      handleArtifacts(collaboration.artifacts, context);\n\n      // handle message flows latest in the process\n      deferred.push(function() {\n        handleMessageFlows(collaboration.messageFlows, context);\n      });\n    }\n\n\n    function wireFlowNodeRefs(lane) {\n\n      // wire the virtual flowNodeRefs <-> relationship\n      forEach$1(lane.flowNodeRef, function(flowNode) {\n        var lanes = flowNode.get('lanes');\n\n        if (lanes) {\n          lanes.push(lane);\n        }\n      });\n    }\n  }\n\n  /**\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   *\n   * @typedef { {\n   *   warnings: string[];\n   * } } ImportBPMNDiagramResult\n   *\n   * @typedef {ImportBPMNDiagramResult & Error} ImportBPMNDiagramError\n   */\n\n  /**\n   * Import the definitions into a diagram.\n   *\n   * Errors and warnings are reported through the specified callback.\n   *\n   * @param {ModdleElement} diagram\n   * @param {ModdleElement} definitions\n   * @param {ModdleElement} [bpmnDiagram] The diagram to be rendered (if not\n   * provided, the first one will be rendered).\n   *\n   * @return {Promise<ImportBPMNDiagramResult>}\n   */\n  function importBpmnDiagram(diagram, definitions, bpmnDiagram) {\n\n    var importer,\n        eventBus,\n        translate,\n        canvas;\n\n    var error,\n        warnings = [];\n\n    /**\n     * Walk the diagram semantically, importing (=drawing)\n     * all elements you encounter.\n     *\n     * @param {ModdleElement} definitions\n     * @param {ModdleElement} bpmnDiagram\n     */\n    function render(definitions, bpmnDiagram) {\n\n      var visitor = {\n\n        root: function(element, di) {\n          return importer.add(element, di);\n        },\n\n        element: function(element, di, parentShape) {\n          return importer.add(element, di, parentShape);\n        },\n\n        error: function(message, context) {\n          warnings.push({ message: message, context: context });\n        }\n      };\n\n      var walker = new BpmnTreeWalker(visitor, translate);\n\n\n      bpmnDiagram = bpmnDiagram || (definitions.diagrams && definitions.diagrams[0]);\n\n      var diagramsToImport = getDiagramsToImport(definitions, bpmnDiagram);\n\n      if (!diagramsToImport) {\n        throw new Error(translate('no diagram to display'));\n      }\n\n      // traverse BPMN 2.0 document model,\n      // starting at definitions\n      forEach$1(diagramsToImport, function(diagram) {\n        walker.handleDefinitions(definitions, diagram);\n      });\n\n      var rootId = bpmnDiagram.plane.bpmnElement.id;\n\n      // we do need to account for different ways we create root elements\n      // each nested imported <root> do have the `_plane` suffix, while\n      // the root <root> is found under the business object ID\n      canvas.setRootElement(\n        canvas.findRoot(rootId + '_plane') || canvas.findRoot(rootId)\n      );\n    }\n\n    return new Promise(function(resolve, reject) {\n      try {\n        importer = diagram.get('bpmnImporter');\n        eventBus = diagram.get('eventBus');\n        translate = diagram.get('translate');\n        canvas = diagram.get('canvas');\n\n        eventBus.fire('import.render.start', { definitions: definitions });\n\n        render(definitions, bpmnDiagram);\n\n        eventBus.fire('import.render.complete', {\n          error: error,\n          warnings: warnings\n        });\n\n        return resolve({ warnings: warnings });\n      } catch (e) {\n\n        e.warnings = warnings;\n        return reject(e);\n      }\n    });\n  }\n\n  /**\n   * Returns all diagrams in the same hierarchy as the requested diagram.\n   * Includes all parent and sub process diagrams.\n   *\n   * @param {ModdleElement} definitions\n   * @param {ModdleElement} bpmnDiagram\n   *\n   * @return {ModdleElement[]}\n   */\n  function getDiagramsToImport(definitions, bpmnDiagram) {\n    if (!bpmnDiagram) {\n      return;\n    }\n\n    var bpmnElement = bpmnDiagram.plane.bpmnElement,\n        rootElement = bpmnElement;\n\n    if (!is$1(bpmnElement, 'bpmn:Process') && !is$1(bpmnElement, 'bpmn:Collaboration')) {\n      rootElement = findRootProcess(bpmnElement);\n    }\n\n    // in case the process is part of a collaboration, the plane references the\n    // collaboration, not the process\n    var collaboration;\n\n    if (is$1(rootElement, 'bpmn:Collaboration')) {\n      collaboration = rootElement;\n    } else {\n      collaboration = find(definitions.rootElements, function(element) {\n        if (!is$1(element, 'bpmn:Collaboration')) {\n          return;\n        }\n\n        return find(element.participants, function(participant) {\n          return participant.processRef === rootElement;\n        });\n      });\n    }\n\n    var rootElements = [ rootElement ];\n\n    // all collaboration processes can contain sub-diagrams\n    if (collaboration) {\n      rootElements = map$1(collaboration.participants, function(participant) {\n        return participant.processRef;\n      });\n\n      rootElements.push(collaboration);\n    }\n\n    var allChildren = selfAndAllFlowElements(rootElements);\n\n    // if we have multiple diagrams referencing the same element, we\n    // use the first in the file\n    var diagramsToImport = [ bpmnDiagram ];\n    var handledElements = [ bpmnElement ];\n\n    forEach$1(definitions.diagrams, function(diagram) {\n      var businessObject = diagram.plane.bpmnElement;\n\n      if (\n        allChildren.indexOf(businessObject) !== -1 &&\n        handledElements.indexOf(businessObject) === -1\n      ) {\n        diagramsToImport.push(diagram);\n        handledElements.push(businessObject);\n      }\n    });\n\n\n    return diagramsToImport;\n  }\n\n  function selfAndAllFlowElements(elements) {\n    var result = [];\n\n    forEach$1(elements, function(element) {\n      if (!element) {\n        return;\n      }\n\n      result.push(element);\n\n      result = result.concat(selfAndAllFlowElements(element.flowElements));\n    });\n\n    return result;\n  }\n\n  function findRootProcess(element) {\n    var parent = element;\n\n    while (parent) {\n      if (is$1(parent, 'bpmn:Process')) {\n        return parent;\n      }\n\n      parent = parent.$parent;\n    }\n  }\n\n  /**\n   * This file must not be changed or exchanged.\n   *\n   * @see http://bpmn.io/license for more information.\n   */\n\n\n  // inlined ../../resources/logo.svg\n  var BPMNIO_LOGO_SVG = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 14.02 5.57\" width=\"53\" height=\"21\"><path fill=\"currentColor\" d=\"M1.88.92v.14c0 .41-.13.68-.4.8.33.14.46.44.46.86v.33c0 .61-.33.95-.95.95H0V0h.95c.65 0 .93.3.93.92zM.63.57v1.06h.24c.24 0 .38-.1.38-.43V.98c0-.28-.1-.4-.32-.4zm0 1.63v1.22h.36c.2 0 .32-.1.32-.39v-.35c0-.37-.12-.48-.4-.48H.63zM4.18.99v.52c0 .64-.31.98-.94.98h-.3V4h-.62V0h.92c.63 0 .94.35.94.99zM2.94.57v1.35h.3c.2 0 .3-.09.3-.37v-.6c0-.29-.1-.38-.3-.38h-.3zm2.89 2.27L6.25 0h.88v4h-.6V1.12L6.1 3.99h-.6l-.46-2.82v2.82h-.55V0h.87zM8.14 1.1V4h-.56V0h.79L9 2.4V0h.56v4h-.64zm2.49 2.29v.6h-.6v-.6zM12.12 1c0-.63.33-1 .95-1 .61 0 .95.37.95 1v2.04c0 .64-.34 1-.95 1-.62 0-.95-.37-.95-1zm.62 2.08c0 .28.13.39.33.39s.32-.1.32-.4V.98c0-.29-.12-.4-.32-.4s-.33.11-.33.4z\"/><path fill=\"currentColor\" d=\"M0 4.53h14.02v1.04H0zM11.08 0h.63v.62h-.63zm.63 4V1h-.63v2.98z\"/></svg>';\n\n  var BPMNIO_IMG = BPMNIO_LOGO_SVG;\n\n  var LOGO_STYLES = {\n    verticalAlign: 'middle'\n  };\n\n  var LINK_STYLES = {\n    'color': '#404040'\n  };\n\n  var LIGHTBOX_STYLES = {\n    'zIndex': '1001',\n    'position': 'fixed',\n    'top': '0',\n    'left': '0',\n    'right': '0',\n    'bottom': '0'\n  };\n\n  var BACKDROP_STYLES = {\n    'width': '100%',\n    'height': '100%',\n    'background': 'rgba(40,40,40,0.2)'\n  };\n\n  var NOTICE_STYLES = {\n    'position': 'absolute',\n    'left': '50%',\n    'top': '40%',\n    'transform': 'translate(-50%)',\n    'width': '260px',\n    'padding': '10px',\n    'background': 'white',\n    'boxShadow': '0 1px 4px rgba(0,0,0,0.3)',\n    'fontFamily': 'Helvetica, Arial, sans-serif',\n    'fontSize': '14px',\n    'display': 'flex',\n    'lineHeight': '1.3'\n  };\n\n  var LIGHTBOX_MARKUP =\n    '<div class=\"bjs-powered-by-lightbox\">' +\n      '<div class=\"backdrop\"></div>' +\n      '<div class=\"notice\">' +\n        '<a href=\"https://bpmn.io\" target=\"_blank\" rel=\"noopener\" class=\"link\">' +\n          BPMNIO_IMG +\n        '</a>' +\n        '<span>' +\n          'Web-based tooling for BPMN, DMN and forms ' +\n          'powered by <a href=\"https://bpmn.io\" target=\"_blank\" rel=\"noopener\">bpmn.io</a>.' +\n        '</span>' +\n      '</div>' +\n    '</div>';\n\n\n  var lightbox;\n\n  function createLightbox() {\n    lightbox = domify$1(LIGHTBOX_MARKUP);\n\n    assign(lightbox, LIGHTBOX_STYLES);\n    assign(query('svg', lightbox), LOGO_STYLES);\n    assign(query('.backdrop', lightbox), BACKDROP_STYLES);\n    assign(query('.notice', lightbox), NOTICE_STYLES);\n    assign(query('.link', lightbox), LINK_STYLES, {\n      'margin': '15px 20px 15px 10px',\n      'alignSelf': 'center'\n    });\n  }\n\n  function open() {\n\n    if (!lightbox) {\n      createLightbox();\n\n      delegate.bind(lightbox, '.backdrop', 'click', function(event) {\n        document.body.removeChild(lightbox);\n      });\n    }\n\n    document.body.appendChild(lightbox);\n  }\n\n  /**\n   * The code in the <project-logo></project-logo> area\n   * must not be changed.\n   *\n   * @see http://bpmn.io/license for more information.\n   */\n\n  /**\n   * @template T\n   *\n   * @typedef {import('diagram-js/lib/core/EventBus').EventBusEventCallback<T>} EventBusEventCallback\n   */\n\n  /**\n   * @typedef {import('didi').ModuleDeclaration} ModuleDeclaration\n   *\n   * @typedef {import('./model/Types').Moddle} Moddle\n   * @typedef {import('./model/Types').ModdleElement} ModdleElement\n   * @typedef {import('./model/Types').ModdleExtension} ModdleExtension\n   *\n   * @typedef { {\n   *   width?: number|string;\n   *   height?: number|string;\n   *   position?: string;\n   *   container?: string|HTMLElement;\n   *   moddleExtensions?: ModdleExtensions;\n   *   additionalModules?: ModuleDeclaration[];\n   * } & Record<string, any> } BaseViewerOptions\n   *\n   * @typedef {Record<string, ModdleElement>} ModdleElementsById\n   *\n   * @typedef { {\n   *   [key: string]: ModdleExtension;\n   * } } ModdleExtensions\n   *\n   * @typedef { {\n   *   warnings: string[];\n   * } } ImportXMLResult\n   *\n   * @typedef {ImportXMLResult & Error} ImportXMLError\n   *\n   * @typedef {ImportXMLResult} ImportDefinitionsResult\n   *\n   * @typedef {ImportXMLError} ImportDefinitionsError\n   *\n   * @typedef {ImportXMLResult} OpenResult\n   *\n   * @typedef {ImportXMLError} OpenError\n   *\n   * @typedef { {\n   *   format?: boolean;\n   *   preamble?: boolean;\n   * } } SaveXMLOptions\n   *\n   * @typedef { {\n   *   xml?: string;\n   *   error?: Error;\n   * } } SaveXMLResult\n   *\n   * @typedef { {\n   *   svg: string;\n   * } } SaveSVGResult\n   *\n   * @typedef { {\n   *   xml: string;\n   * } } ImportParseStartEvent\n   *\n   * @typedef { {\n   *   error?: ImportXMLError;\n   *   definitions?: ModdleElement;\n   *   elementsById?: ModdleElementsById;\n   *   references?: ModdleElement[];\n   *   warnings: string[];\n   * } } ImportParseCompleteEvent\n   *\n   * @typedef { {\n   *   error?: ImportXMLError;\n   *   warnings: string[];\n   * } } ImportDoneEvent\n   *\n   * @typedef { {\n   *   definitions: ModdleElement;\n   * } } SaveXMLStartEvent\n   *\n   * @typedef {SaveXMLResult} SaveXMLDoneEvent\n   *\n   * @typedef { {\n   *   error?: Error;\n   *   svg: string;\n   * } } SaveSVGDoneEvent\n   */\n\n  /**\n   * A base viewer for BPMN 2.0 diagrams.\n   *\n   * Have a look at {@link Viewer}, {@link NavigatedViewer} or {@link Modeler} for\n   * bundles that include actual features.\n   *\n   * @param {BaseViewerOptions} [options] The options to configure the viewer.\n   */\n  function BaseViewer(options) {\n\n    /**\n     * @type {BaseViewerOptions}\n     */\n    options = assign$1({}, DEFAULT_OPTIONS, options);\n\n    /**\n     * @type {Moddle}\n     */\n    this._moddle = this._createModdle(options);\n\n    /**\n     * @type {HTMLElement}\n     */\n    this._container = this._createContainer(options);\n\n    /* <project-logo> */\n\n    addProjectLogo(this._container);\n\n    /* </project-logo> */\n\n    this._init(this._container, this._moddle, options);\n  }\n\n  e(BaseViewer, Diagram);\n\n  /**\n   * Parse and render a BPMN 2.0 diagram.\n   *\n   * Once finished the viewer reports back the result to the\n   * provided callback function with (err, warnings).\n   *\n   * ## Life-Cycle Events\n   *\n   * During import the viewer will fire life-cycle events:\n   *\n   *   * import.parse.start (about to read model from XML)\n   *   * import.parse.complete (model read; may have worked or not)\n   *   * import.render.start (graphical import start)\n   *   * import.render.complete (graphical import finished)\n   *   * import.done (everything done)\n   *\n   * You can use these events to hook into the life-cycle.\n   *\n   * @throws {ImportXMLError} An error thrown during the import of the XML.\n   *\n   * @fires BaseViewer#ImportParseStartEvent\n   * @fires BaseViewer#ImportParseCompleteEvent\n   * @fires Importer#ImportRenderStartEvent\n   * @fires Importer#ImportRenderCompleteEvent\n   * @fires BaseViewer#ImportDoneEvent\n   *\n   * @param {string} xml The BPMN 2.0 XML to be imported.\n   * @param {ModdleElement|string} [bpmnDiagram] The optional diagram or Id of the BPMN diagram to open.\n   *\n   * @return {Promise<ImportXMLResult>} A promise resolving with warnings that were produced during the import.\n   */\n  BaseViewer.prototype.importXML = async function importXML(xml, bpmnDiagram) {\n\n    const self = this;\n\n    function ParseCompleteEvent(data) {\n\n      const event = self.get('eventBus').createEvent(data);\n\n      // TODO(nikku): remove with future bpmn-js version\n      Object.defineProperty(event, 'context', {\n        enumerable: true,\n        get: function() {\n\n          console.warn(new Error(\n            'import.parse.complete <context> is deprecated ' +\n            'and will be removed in future library versions'\n          ));\n\n          return {\n            warnings: data.warnings,\n            references: data.references,\n            elementsById: data.elementsById\n          };\n        }\n      });\n\n      return event;\n    }\n\n    let aggregatedWarnings = [];\n    try {\n\n      // hook in pre-parse listeners +\n      // allow xml manipulation\n\n      /**\n       * A `import.parse.start` event.\n       *\n       * @event BaseViewer#ImportParseStartEvent\n       * @type {ImportParseStartEvent}\n       */\n      xml = this._emit('import.parse.start', { xml: xml }) || xml;\n\n      let parseResult;\n      try {\n        parseResult = await this._moddle.fromXML(xml, 'bpmn:Definitions');\n      } catch (error) {\n        this._emit('import.parse.complete', {\n          error\n        });\n\n        throw error;\n      }\n\n      let definitions = parseResult.rootElement;\n      const references = parseResult.references;\n      const parseWarnings = parseResult.warnings;\n      const elementsById = parseResult.elementsById;\n\n      aggregatedWarnings = aggregatedWarnings.concat(parseWarnings);\n\n      // hook in post parse listeners +\n      // allow definitions manipulation\n\n      /**\n       * A `import.parse.complete` event.\n       *\n       * @event BaseViewer#ImportParseCompleteEvent\n       * @type {ImportParseCompleteEvent}\n       */\n      definitions = this._emit('import.parse.complete', ParseCompleteEvent({\n        error: null,\n        definitions: definitions,\n        elementsById: elementsById,\n        references: references,\n        warnings: aggregatedWarnings\n      })) || definitions;\n\n      const importResult = await this.importDefinitions(definitions, bpmnDiagram);\n\n      aggregatedWarnings = aggregatedWarnings.concat(importResult.warnings);\n\n      /**\n       * A `import.parse.complete` event.\n       *\n       * @event BaseViewer#ImportDoneEvent\n       * @type {ImportDoneEvent}\n       */\n      this._emit('import.done', { error: null, warnings: aggregatedWarnings });\n\n      return { warnings: aggregatedWarnings };\n    } catch (err) {\n      let error = err;\n      aggregatedWarnings = aggregatedWarnings.concat(error.warnings || []);\n      addWarningsToError(error, aggregatedWarnings);\n\n      error = checkValidationError(error);\n\n      this._emit('import.done', { error, warnings: error.warnings });\n\n      throw error;\n    }\n  };\n\n  BaseViewer.prototype.importXML = wrapForCompatibility(BaseViewer.prototype.importXML);\n\n\n  /**\n   * Import parsed definitions and render a BPMN 2.0 diagram.\n   *\n   * Once finished the viewer reports back the result to the\n   * provided callback function with (err, warnings).\n   *\n   * ## Life-Cycle Events\n   *\n   * During import the viewer will fire life-cycle events:\n   *\n   *   * import.render.start (graphical import start)\n   *   * import.render.complete (graphical import finished)\n   *\n   * You can use these events to hook into the life-cycle.\n   *\n   * @throws {ImportDefinitionsError} An error thrown during the import of the definitions.\n   *\n   * @param {ModdleElement} definitions The definitions.\n   * @param {ModdleElement|string} [bpmnDiagram] The optional diagram or ID of the BPMN diagram to open.\n   *\n   * @return {Promise<ImportDefinitionsResult>} A promise resolving with warnings that were produced during the import.\n   */\n  BaseViewer.prototype.importDefinitions = async function importDefinitions(definitions, bpmnDiagram) {\n    this._setDefinitions(definitions);\n    const result = await this.open(bpmnDiagram);\n\n    return { warnings: result.warnings };\n  };\n\n  BaseViewer.prototype.importDefinitions = wrapForCompatibility(BaseViewer.prototype.importDefinitions);\n\n\n  /**\n   * Open diagram of previously imported XML.\n   *\n   * Once finished the viewer reports back the result to the\n   * provided callback function with (err, warnings).\n   *\n   * ## Life-Cycle Events\n   *\n   * During switch the viewer will fire life-cycle events:\n   *\n   *   * import.render.start (graphical import start)\n   *   * import.render.complete (graphical import finished)\n   *\n   * You can use these events to hook into the life-cycle.\n   *\n   * @throws {OpenError} An error thrown during opening.\n   *\n   * @param {ModdleElement|string} bpmnDiagramOrId The diagram or Id of the BPMN diagram to open.\n   *\n   * @return {Promise<OpenResult>} A promise resolving with warnings that were produced during opening.\n   */\n  BaseViewer.prototype.open = async function open(bpmnDiagramOrId) {\n\n    const definitions = this._definitions;\n    let bpmnDiagram = bpmnDiagramOrId;\n\n    if (!definitions) {\n      const error = new Error('no XML imported');\n      addWarningsToError(error, []);\n\n      throw error;\n    }\n\n    if (typeof bpmnDiagramOrId === 'string') {\n      bpmnDiagram = findBPMNDiagram(definitions, bpmnDiagramOrId);\n\n      if (!bpmnDiagram) {\n        const error = new Error('BPMNDiagram <' + bpmnDiagramOrId + '> not found');\n        addWarningsToError(error, []);\n\n        throw error;\n      }\n    }\n\n    // clear existing rendered diagram\n    // catch synchronous exceptions during #clear()\n    try {\n      this.clear();\n    } catch (error) {\n      addWarningsToError(error, []);\n\n      throw error;\n    }\n\n    // perform graphical import\n    const { warnings } = await importBpmnDiagram(this, definitions, bpmnDiagram);\n\n    return { warnings };\n  };\n\n  BaseViewer.prototype.open = wrapForCompatibility(BaseViewer.prototype.open);\n\n  /**\n   * Export the currently displayed BPMN 2.0 diagram as\n   * a BPMN 2.0 XML document.\n   *\n   * ## Life-Cycle Events\n   *\n   * During XML saving the viewer will fire life-cycle events:\n   *\n   *   * saveXML.start (before serialization)\n   *   * saveXML.serialized (after xml generation)\n   *   * saveXML.done (everything done)\n   *\n   * You can use these events to hook into the life-cycle.\n   *\n   * @throws {Error} An error thrown during export.\n   *\n   * @fires BaseViewer#SaveXMLStart\n   * @fires BaseViewer#SaveXMLDone\n   *\n   * @param {SaveXMLOptions} [options] The options.\n   *\n   * @return {Promise<SaveXMLResult>} A promise resolving with the XML.\n   */\n  BaseViewer.prototype.saveXML = async function saveXML(options) {\n\n    options = options || {};\n\n    let definitions = this._definitions,\n        error, xml;\n\n    try {\n      if (!definitions) {\n        throw new Error('no definitions loaded');\n      }\n\n      // allow to fiddle around with definitions\n\n      /**\n       * A `saveXML.start` event.\n       *\n       * @event BaseViewer#SaveXMLStartEvent\n       * @type {SaveXMLStartEvent}\n       */\n      definitions = this._emit('saveXML.start', {\n        definitions\n      }) || definitions;\n\n      const result = await this._moddle.toXML(definitions, options);\n      xml = result.xml;\n\n      xml = this._emit('saveXML.serialized', {\n        xml\n      }) || xml;\n    } catch (err) {\n      error = err;\n    }\n\n    const result = error ? { error } : { xml };\n\n    /**\n     * A `saveXML.done` event.\n     *\n     * @event BaseViewer#SaveXMLDoneEvent\n     * @type {SaveXMLDoneEvent}\n     */\n    this._emit('saveXML.done', result);\n\n    if (error) {\n      throw error;\n    }\n\n    return result;\n  };\n\n  BaseViewer.prototype.saveXML = wrapForCompatibility(BaseViewer.prototype.saveXML);\n\n\n  /**\n   * Export the currently displayed BPMN 2.0 diagram as\n   * an SVG image.\n   *\n   * ## Life-Cycle Events\n   *\n   * During SVG saving the viewer will fire life-cycle events:\n   *\n   *   * saveSVG.start (before serialization)\n   *   * saveSVG.done (everything done)\n   *\n   * You can use these events to hook into the life-cycle.\n   *\n   * @throws {Error} An error thrown during export.\n   *\n   * @fires BaseViewer#SaveSVGDone\n   *\n   * @return {Promise<SaveSVGResult>} A promise resolving with the SVG.\n   */\n  BaseViewer.prototype.saveSVG = async function saveSVG() {\n    this._emit('saveSVG.start');\n\n    let svg, err;\n\n    try {\n      const canvas = this.get('canvas');\n\n      const contentNode = canvas.getActiveLayer(),\n            defsNode = query('defs', canvas._svg);\n\n      const contents = innerSVG(contentNode),\n            defs = defsNode ? '<defs>' + innerSVG(defsNode) + '</defs>' : '';\n\n      const bbox = contentNode.getBBox();\n\n      svg =\n        '<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n' +\n        '<!-- created with bpmn-js / http://bpmn.io -->\\n' +\n        '<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n' +\n        '<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" ' +\n        'width=\"' + bbox.width + '\" height=\"' + bbox.height + '\" ' +\n        'viewBox=\"' + bbox.x + ' ' + bbox.y + ' ' + bbox.width + ' ' + bbox.height + '\" version=\"1.1\">' +\n        defs + contents +\n        '</svg>';\n    } catch (e) {\n      err = e;\n    }\n\n    /**\n     * A `saveSVG.done` event.\n     *\n     * @event BaseViewer#SaveSVGDoneEvent\n     * @type {SaveSVGDoneEvent}\n     */\n    this._emit('saveSVG.done', {\n      error: err,\n      svg: svg\n    });\n\n    if (err) {\n      throw err;\n    }\n\n    return { svg };\n  };\n\n  BaseViewer.prototype.saveSVG = wrapForCompatibility(BaseViewer.prototype.saveSVG);\n\n  /**\n   * Get a named diagram service.\n   *\n   * @example\n   *\n   * const elementRegistry = viewer.get('elementRegistry');\n   * const startEventShape = elementRegistry.get('StartEvent_1');\n   *\n   * @param {string} name\n   *\n   * @return {Object} diagram service instance\n   *\n   * @method BaseViewer#get\n   */\n\n  /**\n   * Invoke a function in the context of this viewer.\n   *\n   * @example\n   *\n   * viewer.invoke(function(elementRegistry) {\n   *   const startEventShape = elementRegistry.get('StartEvent_1');\n   * });\n   *\n   * @param {Function} fn to be invoked\n   *\n   * @return {Object} the functions return value\n   *\n   * @method BaseViewer#invoke\n   */\n\n\n  BaseViewer.prototype._setDefinitions = function(definitions) {\n    this._definitions = definitions;\n  };\n\n  /**\n   * Return modules to instantiate with.\n   *\n   * @return {ModuleDeclaration[]} The modules.\n   */\n  BaseViewer.prototype.getModules = function() {\n    return this._modules;\n  };\n\n  /**\n   * Remove all drawn elements from the viewer.\n   *\n   * After calling this method the viewer can still be reused for opening another\n   * diagram.\n   */\n  BaseViewer.prototype.clear = function() {\n    if (!this.getDefinitions()) {\n\n      // no diagram to clear\n      return;\n    }\n\n    // remove drawn elements\n    Diagram.prototype.clear.call(this);\n  };\n\n  /**\n   * Destroy the viewer instance and remove all its remainders from the document\n   * tree.\n   */\n  BaseViewer.prototype.destroy = function() {\n\n    // diagram destroy\n    Diagram.prototype.destroy.call(this);\n\n    // dom detach\n    remove$1(this._container);\n  };\n\n  /**\n   * Register an event listener.\n   *\n   * Remove an event listener via {@link BaseViewer#off}.\n   *\n   * @template T\n   *\n   * @param {string|string[]} events The event(s) to listen to.\n   * @param {number} [priority] The priority with which to listen.\n   * @param {EventBusEventCallback<T>} callback The callback.\n   * @param {any} [that] Value of `this` the callback will be called with.\n   */\n  BaseViewer.prototype.on = function(events, priority, callback, that) {\n    return this.get('eventBus').on(events, priority, callback, that);\n  };\n\n  /**\n   * Remove an event listener.\n   *\n   * @param {string|string[]} events The event(s).\n   * @param {Function} [callback] The callback.\n   */\n  BaseViewer.prototype.off = function(events, callback) {\n    this.get('eventBus').off(events, callback);\n  };\n\n  /**\n   * Attach the viewer to an HTML element.\n   *\n   * @param {HTMLElement} parentNode The parent node to attach to.\n   */\n  BaseViewer.prototype.attachTo = function(parentNode) {\n\n    if (!parentNode) {\n      throw new Error('parentNode required');\n    }\n\n    // ensure we detach from the\n    // previous, old parent\n    this.detach();\n\n    // unwrap jQuery if provided\n    if (parentNode.get && parentNode.constructor.prototype.jquery) {\n      parentNode = parentNode.get(0);\n    }\n\n    if (typeof parentNode === 'string') {\n      parentNode = query(parentNode);\n    }\n\n    parentNode.appendChild(this._container);\n\n    this._emit('attach', {});\n\n    this.get('canvas').resized();\n  };\n\n  /**\n   * Get the definitions model element.\n   *\n   * @return {ModdleElement} The definitions model element.\n   */\n  BaseViewer.prototype.getDefinitions = function() {\n    return this._definitions;\n  };\n\n  /**\n   * Detach the viewer.\n   *\n   * @fires BaseViewer#DetachEvent\n   */\n  BaseViewer.prototype.detach = function() {\n\n    const container = this._container,\n          parentNode = container.parentNode;\n\n    if (!parentNode) {\n      return;\n    }\n\n    /**\n     * A `detach` event.\n     *\n     * @event BaseViewer#DetachEvent\n     * @type {Object}\n     */\n    this._emit('detach', {});\n\n    parentNode.removeChild(container);\n  };\n\n  BaseViewer.prototype._init = function(container, moddle, options) {\n\n    const baseModules = options.modules || this.getModules(options),\n          additionalModules = options.additionalModules || [],\n          staticModules = [\n            {\n              bpmnjs: [ 'value', this ],\n              moddle: [ 'value', moddle ]\n            }\n          ];\n\n    const diagramModules = [].concat(staticModules, baseModules, additionalModules);\n\n    const diagramOptions = assign$1(omit(options, [ 'additionalModules' ]), {\n      canvas: assign$1({}, options.canvas, { container: container }),\n      modules: diagramModules\n    });\n\n    // invoke diagram constructor\n    Diagram.call(this, diagramOptions);\n\n    if (options && options.container) {\n      this.attachTo(options.container);\n    }\n  };\n\n  /**\n   * Emit an event on the underlying {@link EventBus}\n   *\n   * @param  {string} type\n   * @param  {Object} event\n   *\n   * @return {Object} The return value after calling all event listeners.\n   */\n  BaseViewer.prototype._emit = function(type, event) {\n    return this.get('eventBus').fire(type, event);\n  };\n\n  /**\n   * @param {BaseViewerOptions} options\n   *\n   * @return {HTMLElement}\n   */\n  BaseViewer.prototype._createContainer = function(options) {\n\n    const container = domify$1('<div class=\"bjs-container\"></div>');\n\n    assign(container, {\n      width: ensureUnit(options.width),\n      height: ensureUnit(options.height),\n      position: options.position\n    });\n\n    return container;\n  };\n\n  /**\n   * @param {BaseViewerOptions} options\n   *\n   * @return {Moddle}\n   */\n  BaseViewer.prototype._createModdle = function(options) {\n    const moddleOptions = assign$1({}, this._moddleExtensions, options.moddleExtensions);\n\n    return new simple(moddleOptions);\n  };\n\n  BaseViewer.prototype._modules = [];\n\n  // helpers ///////////////\n\n  function addWarningsToError(err, warningsAry) {\n    err.warnings = warningsAry;\n    return err;\n  }\n\n  function checkValidationError(err) {\n\n    // check if we can help the user by indicating wrong BPMN 2.0 xml\n    // (in case he or the exporting tool did not get that right)\n\n    const pattern = /unparsable content <([^>]+)> detected([\\s\\S]*)$/;\n    const match = pattern.exec(err.message);\n\n    if (match) {\n      err.message =\n        'unparsable content <' + match[1] + '> detected; ' +\n        'this may indicate an invalid BPMN 2.0 diagram file' + match[2];\n    }\n\n    return err;\n  }\n\n  const DEFAULT_OPTIONS = {\n    width: '100%',\n    height: '100%',\n    position: 'relative'\n  };\n\n\n  /**\n   * Ensure the passed argument is a proper unit (defaulting to px)\n   */\n  function ensureUnit(val) {\n    return val + (isNumber(val) ? 'px' : '');\n  }\n\n\n  /**\n   * Find BPMNDiagram in definitions by ID\n   *\n   * @param {ModdleElement<Definitions>} definitions\n   * @param {string} diagramId\n   *\n   * @return {ModdleElement<BPMNDiagram>|null}\n   */\n  function findBPMNDiagram(definitions, diagramId) {\n    if (!diagramId) {\n      return null;\n    }\n\n    return find(definitions.diagrams, function(element) {\n      return element.id === diagramId;\n    }) || null;\n  }\n\n  /**\n   * Adds the project logo to the diagram container as\n   * required by the bpmn.io license.\n   *\n   * @see http://bpmn.io/license\n   *\n   * @param {Element} container\n   */\n  function addProjectLogo(container) {\n    const img = BPMNIO_IMG;\n\n    const linkMarkup =\n      '<a href=\"http://bpmn.io\" ' +\n      'target=\"_blank\" ' +\n      'class=\"bjs-powered-by\" ' +\n      'title=\"Powered by bpmn.io\" ' +\n      '>' +\n      img +\n      '</a>';\n\n    const linkElement = domify$1(linkMarkup);\n\n    assign(query('svg', linkElement), LOGO_STYLES);\n    assign(linkElement, LINK_STYLES, {\n      position: 'absolute',\n      bottom: '15px',\n      right: '15px',\n      zIndex: '100'\n    });\n\n    container.appendChild(linkElement);\n\n    event.bind(linkElement, 'click', function(event) {\n      open();\n\n      event.preventDefault();\n    });\n  }\n\n  /* </project-logo> */\n\n  /**\n   * @typedef { import('./BaseViewer').BaseViewerOptions } BaseViewerOptions\n   */\n\n  /**\n   * A viewer for BPMN 2.0 diagrams.\n   *\n   * Have a look at {@link NavigatedViewer} or {@link Modeler} for bundles that include\n   * additional features.\n   *\n   *\n   * ## Extending the Viewer\n   *\n   * In order to extend the viewer pass extension modules to bootstrap via the\n   * `additionalModules` option. An extension module is an object that exposes\n   * named services.\n   *\n   * The following example depicts the integration of a simple\n   * logging component that integrates with interaction events:\n   *\n   *\n   * ```javascript\n   *\n   * // logging component\n   * function InteractionLogger(eventBus) {\n   *   eventBus.on('element.hover', function(event) {\n   *     console.log()\n   *   })\n   * }\n   *\n   * InteractionLogger.$inject = [ 'eventBus' ]; // minification save\n   *\n   * // extension module\n   * var extensionModule = {\n   *   __init__: [ 'interactionLogger' ],\n   *   interactionLogger: [ 'type', InteractionLogger ]\n   * };\n   *\n   * // extend the viewer\n   * var bpmnViewer = new Viewer({ additionalModules: [ extensionModule ] });\n   * bpmnViewer.importXML(...);\n   * ```\n   *\n   * @param {BaseViewerOptions} [options] The options to configure the viewer.\n   */\n  function Viewer(options) {\n    BaseViewer.call(this, options);\n  }\n\n  e(Viewer, BaseViewer);\n\n  // modules the viewer is composed of\n  Viewer.prototype._modules = [\n    CoreModule$1,\n    TranslateModule,\n    SelectionModule,\n    OverlaysModule,\n    DrilldownModdule\n  ];\n\n  // default moddle extensions the viewer is composed of\n  Viewer.prototype._moddleExtensions = {};\n\n  return Viewer;\n\n}));\n"
  },
  {
    "path": "easyflow-flow-bpmn/static/plugins/bpmnjs/changeForEasyflow/changelog.txt",
    "content": "bpmn js download url: git clone https://github.com/bpmn-io/bpmn-js.git -b v13.2.1 .\n\nWe made some changes for easyflow. Details are as follows:\n1.For the purpose of using Viewer and Modeler at the same time, we change rollup.config.js to export different control name.(see rollup.config.js)\n2.For the purpose of supporting other language of 'ID', we change node_modules\\moddle-xml\\dist\\index.js and node_modules\\moddle-xml\\dist\\index.esm.js, commenting the line `throw new Error('illegal ID <' + id + '>');`. \nAfter above change ,we can run 'npm run distro' command to build a new version of bpmn.js."
  },
  {
    "path": "easyflow-flow-bpmn/static/plugins/bpmnjs/changeForEasyflow/rollup.config.js",
    "content": "/* eslint-env node */\n\nimport terser from '@rollup/plugin-terser';\nimport nodeResolve from '@rollup/plugin-node-resolve';\nimport commonjs from '@rollup/plugin-commonjs';\nimport json from '@rollup/plugin-json';\nimport replace from '@rollup/plugin-replace';\nimport license from 'rollup-plugin-license';\n\nimport {\n  readFileSync\n} from 'fs';\n\nimport pkg from './package.json';\n\nconst outputDir = 'dist';\n\nconst distros = [\n  {\n    input: 'Viewer',\n    output: 'bpmn-viewer'\n  },\n  {\n    input: 'NavigatedViewer',\n    output: 'bpmn-navigated-viewer'\n  },\n  {\n    input: 'Modeler',\n    output: 'bpmn-modeler'\n  }\n];\n\nconst configs = distros.reduce(function(configs, distro) {\n  const {\n    input,\n    output\n  } = distro;\n\n  return [\n    ...configs,\n    {\n      input: `./lib/${input}.js`,\n      output: {\n        name: `Bpmn${input}`,\n        file: `${outputDir}/${output}.development.js`,\n        format: 'umd'\n      },\n      plugins: pgl([\n        banner(output)\n      ], 'development')\n    },\n    {\n      input: `./lib/${input}.js`,\n      output: {\n        name: `Bpmn${input}`,\n        file: `${outputDir}/${output}.production.min.js`,\n        format: 'umd'\n      },\n      plugins: pgl([\n        banner(output, true),\n        terser({\n          output: {\n            comments: /license|@preserve/\n          }\n        })\n      ], 'production')\n    }\n  ];\n}, []);\n\nexport default configs;\n\n\n// helpers //////////////////////\n\nfunction banner(bundleName, minified) {\n\n  const bannerName = (\n    minified\n      ? 'banner-min'\n      : 'banner'\n  );\n\n  const bannerTemplate = readFileSync(`${__dirname}/resources/${bannerName}.txt`, 'utf8');\n\n  const banner = processTemplate(bannerTemplate, {\n    version: pkg.version,\n    date: today(),\n    name: bundleName\n  });\n\n  return license({\n    banner\n  });\n}\n\nfunction pgl(plugins = [], env = 'production') {\n  return [\n    replace({\n      preventAssignment: true,\n      'process.env.NODE_ENV': JSON.stringify(env)\n    }),\n    nodeResolve(),\n    commonjs(),\n    json(),\n    ...plugins\n  ];\n}\n\nfunction pad(n) {\n  if (n < 10) {\n    return '0' + n;\n  } else {\n    return n;\n  }\n}\n\nfunction today() {\n  const d = new Date();\n\n  return [\n    d.getFullYear(),\n    pad(d.getMonth() + 1),\n    pad(d.getDate())\n  ].join('-');\n}\n\nfunction processTemplate(str, args) {\n  return str.replace(/\\{\\{\\s*([^\\s]+)\\s*\\}\\}/g, function(_, n) {\n\n    var replacement = args[n];\n\n    if (!replacement) {\n      throw new Error('unknown template {{ ' + n + '}}');\n    }\n\n    return replacement;\n  });\n}"
  },
  {
    "path": "easyflow-flow-bpmn/static/plugins/flow/bpmn.js",
    "content": "(function(J) {\n    /**\n     * Context pad\n     */\n    class EasyFlowContextPad {\n        constructor(config, contextPad, create, elementFactory, injector, translate) {\n            this.create = create;\n            this.elementFactory = elementFactory;\n            this.translate = translate;\n\n            if (config.autoPlace !== false) {\n                this.autoPlace = injector.get('autoPlace', false);\n            }\n\n            contextPad.registerProvider(this);\n        }\n\n        getContextPadEntries(element) {\n            const {\n                autoPlace,\n                create,\n                elementFactory,\n                translate\n            } = this;\n\n            function appendScriptTask(event, element) {\n                if (autoPlace) {\n                    const shape = elementFactory.createShape({ type: 'bpmn:ScriptTask' });\n\n                    autoPlace.append(element, shape);\n                } else {\n                    appendScriptTaskStart(event, element);\n                }\n            }\n\n            function appendScriptTaskStart(event) {\n                const shape = elementFactory.createShape({ type: 'bpmn:ScriptTask' });\n\n                create.start(event, shape, element);\n            }\n\n            function appendIntermediateCatchEvent(event, element) {\n                if (autoPlace) {\n                    const shape = elementFactory.createShape({ type: 'bpmn:IntermediateCatchEvent', eventDefinitionType: 'bpmn:MessageEventDefinition' });\n\n                    autoPlace.append(element, shape);\n                } else {\n                    appendIntermediateCatchEventStart(event, element);\n                }\n            }\n\n            function appendIntermediateCatchEventStart(event) {\n                const shape = elementFactory.createShape({ type: 'bpmn:IntermediateCatchEvent' });\n                create.start(event, shape, element);\n            }\n\n            return function(entries) {\n                if (entries['append.append-task']) {\n                    entries['append.append-task'].action.click = appendScriptTask;\n                    entries['append.append-task'].action.dragstart = appendScriptTaskStart;\n                }\n                if (entries['append.intermediate-event']) {\n                    entries['append.intermediate-event'].action.click = appendIntermediateCatchEvent;\n                    entries['append.intermediate-event'].action.dragstart = appendIntermediateCatchEventStart;\n                }\n\n                return entries;\n            }\n        }\n    }\n\n    EasyFlowContextPad.$inject = [\n        'config',\n        'contextPad',\n        'create',\n        'elementFactory',\n        'injector',\n        'translate'\n    ];\n    class EasyFlowPalette {\n        constructor(create, elementFactory, palette, translate) {\n            this.create = create;\n            this.elementFactory = elementFactory;\n            this.translate = translate;\n\n            palette.registerProvider(this);\n        }\n\n        getPaletteEntries(element) {\n            const {\n                create,\n                elementFactory,\n                translate\n            } = this;\n\n            function createScriptTask(event) {\n                const shape = elementFactory.createShape({ type: 'bpmn:ScriptTask' });\n\n                create.start(event, shape);\n            }\n\n\n            return function(entries) {\n                var newEntries = {\n                    \"create.start-event\": entries['create.start-event'],\n                    'create.script-task': {\n                        group: 'activity',\n                        className: 'bpmn-icon-script-task',\n                        title: translate('Create ScriptTask'),\n                        action: {\n                            dragstart: createScriptTask,\n                            click: createScriptTask\n                        }\n                    },\n                    'create.exclusive-gateway': entries['create.exclusive-gateway'],\n                    \"create.data-store\": entries['create.data-store'],\n                    \"create.participant-expanded\": entries['create.participant-expanded'],\n                    'create.group': entries['create.group'],\n                    \"lasso-tool\": entries['lasso-tool'],\n                }\n\n                return newEntries;\n            }\n        }\n\n\n    }\n\n    EasyFlowPalette.$inject = [\n        'create',\n        'elementFactory',\n        'palette',\n        'translate'\n    ];\n\n    /**\n     * Dropdown option\n     */\n    function EasyFlowReplaceMenuProvider(\n        bpmnFactory, popupMenu, modeling, moddle,\n        bpmnReplace, rules, translate) {\n\n        this._bpmnFactory = bpmnFactory;\n        this._popupMenu = popupMenu;\n        this._modeling = modeling;\n        this._moddle = moddle;\n        this._bpmnReplace = bpmnReplace;\n        this._rules = rules;\n        this._translate = translate;\n\n        this.register = function() {\n            this._popupMenu.registerProvider('bpmn-replace', this);\n        }\n\n        this.getPopupMenuEntries = function(element) {\n            return function(entries) {\n                return entries;\n            }\n        }\n        this.getPopupMenuHeaderEntries = function(element) {\n            return function(entries) {\n                return entries;\n            }\n        };\n        this.register();\n    }\n\n    EasyFlowReplaceMenuProvider.$inject = [\n        'bpmnFactory',\n        'popupMenu',\n        'modeling',\n        'moddle',\n        'bpmnReplace',\n        'rules',\n        'translate'\n    ];\n\n    /**\n     * Self define module\n     */\n    var easyFlowModule = {\n        __init__: ['easyFlowContextPad', 'easyFlowPalette', 'easyFlowReplaceMenuProvider'],\n        easyFlowContextPad: ['type', EasyFlowContextPad],\n        easyFlowPalette: ['type', EasyFlowPalette],\n        easyFlowReplaceMenuProvider: ['type', EasyFlowReplaceMenuProvider],\n        translate: ['value', easyFlowTranslate],\n        \"config.zoomScroll\": ['value', { enabled: false }]\n    }\n\n    var easyFlowViewModule = {\n        translate: ['value', easyFlowTranslate],\n        \"config.zoomScroll\": ['value', { enabled: false }]\n    }\n\n    /**\n     * Create BPMN Control\n     */\n    J.BpmnControl = function(cfg) {\n        this.init = function(cfg) {\n            this.cfg = cfg;\n            this.data = cfg.data ? cfg.data : {};\n            this.$bpmnContainer = cfg.$bpmnContainer;\n            this.originData = JSON.parse(JSON.stringify(this.data));\n            return this;\n        }\n        this.render = async function($bpmnContainer) {\n            var _self = this;\n            if ($bpmnContainer) { this.$bpmnContainer = $bpmnContainer };\n            $bpmnContainer = this.$bpmnContainer;\n            $bpmnContainer.append(this._html());\n            // Render control\n            var config = {\n                container: $bpmnContainer.find(\".j-flow-canvas\"),\n                keyboar: {\n                    bindTo: window\n                },\n                moddleExtensions: {\n                    easyflow: easyflowExtension\n                },\n                additionalModules: cfg.mode == 'view' ? [easyFlowViewModule] : [easyFlowModule]\n            };\n            this.bpmnModeler = this.cfg.mode == 'view' ? new BpmnNavigatedViewer(config) : new BpmnModeler(config);\n            // shrink\n            this.$bpmnContainer.find(\".j-bpmn-zoomin\").click(function() {\n                const zoomScroll = _self.bpmnModeler.get('zoomScroll');\n                zoomScroll.stepZoom(-1);\n            });\n            // enlarge\n            this.$bpmnContainer.find(\".j-bpmn-zoomout\").click(function() {\n                const zoomScroll = _self.bpmnModeler.get('zoomScroll');\n                zoomScroll.stepZoom(1);\n            });\n            // svg download\n            this.$bpmnContainer.find(\".j-bpmn-svgdownload\").click(function() {\n                _self.downloadSvg();\n            });\n            // fullscreen\n            this.$bpmnContainer.find(\".j-bpmn-fullscreen\").click(function() {\n                _self.$bpmnContainer.find(\".j-bpmn-panel\").toggleClass(\"j-bpmn-panel-normal j-bpmn-panel-fullscreen\");\n                $(this).find(\"i\").toggleClass(\"fa-expand fa-compress\");\n            });\n            // import\n            this.$bpmnContainer.find(\".j-bpmn-import\").click(function() {\n                $(this).find(\"i\").toggleClass(\"fa-info\");\n                _self.import();\n            });\n            // export\n            this.$bpmnContainer.find(\".j-bpmn-export\").click(function() {\n                _self.export();\n            });\n            // comment\n            this.$bpmnContainer.find(\".j-bpmn-comment-select\").multiselect({nonSelectedText:J.msg[\"bpmn.detailInfoType\"]});\n            this.$bpmnContainer.find(\".j-bpmn-comment-select\").change(function() {\n                _self._commentAll();\n            });\n            // min panel\n            this.$bpmnContainer.find(\".j-bpmn-info-switch\").click(function() {\n                _self.$bpmnContainer.find(\".j-bpmn-info-title\").toggle();\n                _self.$bpmnContainer.find(\".infoPanel>form\").toggle();\n                _self.$bpmnContainer.find(\".infoPanel\").toggleClass(\"infoPanel-up\");\n            })\n            if (this.cfg.mode == 'view') {\n                _self.$bpmnContainer.find(\".j-bpmn-info-title\").toggle();\n                _self.$bpmnContainer.find(\".infoPanel>form\").toggle();\n                _self.$bpmnContainer.find(\".infoPanel\").toggleClass(\"infoPanel-up\");\n            }\n            // event bind\n            var eventBus = this.bpmnModeler.get('eventBus');\n\n            var $infoPanel = this.$bpmnContainer.find(\".infoPanel\");\n            var $form = $infoPanel.find('form');\n            $form.validate();\n            eventBus.on(\"element.click\", function(e) {\n                var elementType = e.element.businessObject.$type;\n                console.log('click on ' + e.element.id + \" type:\" + e.element.businessObject.$type);\n                $form.empty();\n                if (_self._elementPanelRender[elementType]) {\n                    _self._elementPanelRender[elementType].call(_self, $form, e.element);\n                }\n            });\n            eventBus.on(\"selection.changed\", function(e) {\n                var selectedElements = e.newSelection;\n                if (!selectedElements || selectedElements.length!=1) {\n                    $form.empty();\n                    return;\n                }\n                var element = selectedElements[0];\n                var elementType = element.businessObject.$type;\n                console.log('click on ' + element.id + \" type:\" + element.businessObject.$type);\n                $form.empty();\n                if (_self._elementPanelRender[elementType]) {\n                    _self._elementPanelRender[elementType].call(_self, $form, element);\n                }\n            });            \n            eventBus.on(\"element.changed\", function(e) {\n                console.log(\"change\");\n                _self._comment(e.element);\n            });\n            // BPMN Definition View Panel\n            this.$bpmnContainer.find(\".j-bpmn-view\").click(function() {\n                _self.exportDiagram().then(function(result) {\n                    var elementHtml = _self._bpmnViewHtml();\n                    var bpmnXml = result.xml;\n                    $.jDialog({\n                        title: J.msg['bpmn.bpmnFlowDefinition'],\n                        size: \"modal-lg\",\n                        element: elementHtml,\n                        action: function($dialog) {\n                            $dialog.find(\".bpmnDef\").val(bpmnXml);\n                            // bind button action\n                            _self._bindDialogButtonAction($dialog);\n                        }\n                    });\n                });\n            });            \n            // open flow definition\n            var diagram = this.data.bpmnXmlData ? this.data.bpmnXmlData : this.initialDiagram;\n            await this.openDiagram(diagram);\n        }\n        this.collect = async function() {\n            // JSON data has been set\n            this.data.bpmnXmlData = (await this.exportDiagram()).xml;\n            return this.data.bpmnXmlData;\n        }\n        this.init(cfg);\n        return this;\n    }\n\n    /**\n     * Bind dialog action\n     */\n    J.BpmnControl.prototype._bindDialogButtonAction = function($dialog) {\n        var _self = this;\n        // render button\n        $dialog.find(\".j-btn-bpmn-render\").click(function() {\n            var bpmnXml = $dialog.find(\".bpmnDef\").val();\n            _self.openDiagram(bpmnXml).then(function() {\n                $dialog.modal(\"hide\");\n            });\n        });\n        // view JSON button\n        $dialog.find(\".j-btn-bpmn-json\").click(function() {\n            var bpmnXml = $dialog.find(\".bpmnDef\").val();\n            var bpmn2JsonUrl = window.bpmn2JsonUrl ? window.bpmn2JsonUrl : ($.getBaseUrl() && $.getBaseUrl().indexOf(\"http\")==0 ? $.getBaseUrl() + \"/public/ajax/bpmn2Json\": null);\n            $.post(bpmn2JsonUrl, { bpmnXmlData: bpmnXml }, function(result) {\n                // error tip\n                if (result.resultMsg) {\n                    $.jMessage({ msg: result.resultMsg });\n                    return;\n                }\n                // JSON content show\n                var html =\n                    '<div class=\"row\">        ' +\n    '<div class=\"form-group col\"> ' +\n        '<label><span class=\"j-require\">*</span>' + J.msg['bpmn.flowJsonDefinition'] + ':</label>' +\n        '<textarea class=\"jsonDef form-control\" rows=\"30\" readonly=\"readonly\"></textarea>' +\n    '</div>' +\n'</div>';\n                $.jDialog({\n                    \"title\": J.msg[\"bpmn.jsonContent\"], element: html, action: function($dialog) {\n                        $dialog.find(\"textarea\").val(result.resultData);\n                    }\n                })\n            }, \"json\").fail(function(){$.jMessage({ msg: J.msg['bpmn.convertErrorTip'] + bpmn2JsonUrl });});\n        });\n        // BPMN Compare\n        $dialog.find(\".j-btn-compare-bpmn\").click(function() {\n            var newVal = $dialog.find(\".bpmnDef\").val();\n            var oldVal = _self.originData.bpmnXmlData;\n            $.jDiffDialog({ left: { title: J.msg['bpmn.newFlowDefinition'], content: newVal }, right: { title: J.msg['bpmn.oldFlowDefinition'], content: oldVal } });\n        });\n        // EasyFlow Compare\n        $dialog.find(\".j-btn-compare-easyflow\").click(function() {\n            var oldVal = _self.originData.jsonData;\n            var bpmnXml = $dialog.find(\".bpmnDef\").val();\n            var bpmn2JsonUrl = window.bpmn2JsonUrl ? window.bpmn2JsonUrl : $.getBaseUrl() + \"/public/ajax/bpmn2Json\";\n            $.post(bpmn2JsonUrl, { bpmnXmlData: bpmnXml }, function(result) {\n                // Error tip\n                if (result.resultMsg) {\n                    $.jMessage({ msg: result.resultMsg });\n                    return;\n                }\n                $.jDiffDialog({ left: { title: J.msg['bpmn.newFlowDefinition'], content: result.resultData }, right: { title: J.msg['bpmn.oldFlowDefinition'], content: oldVal } });\n            });\n        });\n    }\n\n    /**\n     *Open BPMN\n      */\n    J.BpmnControl.prototype.openDiagram = async function(bpmnXML) {\n        // import diagram\n        var bpmnModeler = this.bpmnModeler;\n        await bpmnModeler.importXML(bpmnXML);\n        // access modeler components\n        var canvas = bpmnModeler.get('canvas');\n        var overlays = bpmnModeler.get('overlays');\n        // zoom to fit full viewport\n        canvas.zoom('fit-viewport');\n        this._initPropertiesPanel();\n        this._commentAll();\n        var processElements = _findProcessElement(bpmnModeler);\n        var callback = this.cfg.openDiagramCallBack;\n        callback && callback.call(this, processElements);\n    }\n\n    /**\n     * Export BPMN\n     */\n    J.BpmnControl.prototype.exportDiagram = async function() {\n        var result = await this.bpmnModeler.saveXML({\n            format: true\n        });\n        console.log('DIAGRAM', result.xml);\n        return result;\n    }\n\n    /**\n     * Download SVG\n     */\n    J.BpmnControl.prototype.downloadSvg = async function() {\n        var _self = this;\n        this.bpmnModeler.saveSVG({ format: true }).then(function(obj) {\n            var svg = obj.svg;\n            var encodedData = encodeURIComponent(svg);\n            var processId = _findProcessElement(_self.bpmnModeler)[0].businessObject.id;\n            var fileName = processId + \"-\" + J.getNowDatetime(\"\", \"-\", \"\") + '.svg';\n            var downloadLink = document.createElement('a');\n            downloadLink.download = fileName;\n            downloadLink.innerHTML = 'Get BPMN SVG';\n            downloadLink.href = 'data:application/bpmn20-xml;charset=UTF-8,' + encodedData;\n            downloadLink.onclick = function(event) {\n                document.body.removeChild(event.target);\n            };\n            downloadLink.style.visibility = 'hidden';\n            document.body.appendChild(downloadLink);\n            downloadLink.click();\n        });\n    }\n\n    /**\n    * Import\n    */\n    J.BpmnControl.prototype.import = function() {\n        var _self = this;\n        $(`<input type=\"file\" value=\"SelectFile\"></input>`)\n            .click()\n            .on('change', event => {\n                let file = event.target.files[0];\n                let file_reader = new FileReader();\n                file_reader.onload = () => {\n                    let fc = file_reader.result;\n                    _self.openDiagram(fc);\n                };\n                file_reader.readAsText(file, 'UTF-8');\n            });\n    }\n\n    /**\n     * Export\n     */\n    J.BpmnControl.prototype.export = async function() {\n        var _self = this;\n        this.bpmnModeler.saveXML({ format: true }).then(function(obj) {\n            var xml = obj.xml;\n            var encodedData = encodeURIComponent(xml);\n            var processId = _findProcessElement(_self.bpmnModeler)[0].businessObject.id;\n            var fileName = processId + \"-\" + J.getNowDatetime(\"\", \"-\", \"\") + '.bpmn';\n            var downloadLink = document.createElement('a');\n            downloadLink.download = fileName;\n            downloadLink.innerHTML = 'Get BPMN XML';\n            downloadLink.href = 'data:application/bpmn20-xml;charset=UTF-8,' + encodedData;\n            downloadLink.onclick = function(event) {\n                document.body.removeChild(event.target);\n            };\n            downloadLink.style.visibility = 'hidden';\n            document.body.appendChild(downloadLink);\n            downloadLink.click();\n        });\n    }\n    /**\n    *Init info panel\n    */\n    J.BpmnControl.prototype._initPropertiesPanel = function() {\n        // Show flow definition panel\n        var processElements = _findProcessElement(this.bpmnModeler);\n        if (processElements.length != 1) {\n            var $infoPanel = this.$bpmnContainer.find(\".infoPanel\");\n            var $form = $infoPanel.find('form');\n             $form.empty();\n            return;\n        }\n        this._elementPanelRender['bpmn:Process'].call(this, this.$bpmnContainer.find(\".infoPanel\").find(\"form\"), processElements[0]);\n    }\n\n    J.BpmnControl.prototype._elementPanelRender = {};\n    /**\n     * Basic element render\n     */\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:Element\"] = function($infoPanel, element, hasProperties) {\n        this.$bpmnContainer.find(\".infoPanel\").find(\"form\").empty();\n        const moddle = this.bpmnModeler.get('moddle');\n        var bo = element.businessObject;\n        var eventBus = this.bpmnModeler.get('eventBus');\n        var _self = this;\n        // ID\n        var elementId = bo.id;\n        var elementIdHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><span class=\"j-require\">*</span><label>ID:</label> <input type=\"text\" class=\"form-control j-elementId\" name=\"j-elementId\" value=\"' + elementId + '\"/></div>'\n            + '</div>';\n        var $elementIdElement = $(elementIdHtml).appendTo($infoPanel);\n        var $elementId = $elementIdElement.find(\".j-elementId\");\n        $elementId.tooltip({ title: J.msg['bpmn.idTooltip'] });\n        $elementId.rules('add', { required: true });\n        $elementId.blur(function() {\n            var newElementId = $elementId.val();\n            if (!newElementId) {\n                alert(J.msg['bpmn.idEmptyError']);\n                $elementId.val(elementId);\n                return;\n            }\n            if (newElementId == elementId) {\n                return;\n            }\n            var elementRegistry = _self.bpmnModeler.get('elementRegistry');\n            var exists = elementRegistry.find(function(element){\n                return element.businessObject.id==newElementId;\n            });\n            if (exists) {\n                alert(J.msg['bpmn.idExistsError']);\n                $elementId.val(elementId);\n                return; \n            }\n            \n            \n            bo.id = newElementId;\n            _self.cfg.onBpmnDefinitionChange && _self.cfg.onBpmnDefinitionChange.call(_self, bo, \"id\", newElementId, elementId);\n            _self._comment(element);\n\t\t\telementId = newElementId;\n        });\n        // Name\n        var elementName = bo.name;\n        var elementNameHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.name'] + ':</label> <input type=\"text\" class=\"form-control j-elementName\" name=\"j-elementName\" value=\"' + (elementName ? elementName : '') + '\"/></div>'\n            + '</div>';\n        var $elementNameElement = $(elementNameHtml).appendTo($infoPanel);\n        var $elementName = $elementNameElement.find(\".j-elementName\");\n        $elementName.tooltip({ title: J.msg['bpmn.nameTooltip'] })\n        $elementName.blur(function() {\n            var newElementName = $elementName.val();\n            bo.name = newElementName;\n            _self.cfg.onBpmnDefinitionChange && _self.cfg.onBpmnDefinitionChange.call(_self, bo, \"name\", newElementName, elementName);\n            eventBus.fire(\"element.changed\", { element: element });\n        });\n        // Documentation\n        var documentation = bo.documentation ? bo.documentation[0].text : '';\n        var documentationHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.documentation'] + ':</label> <textarea class=\"form-control j-documentation\" name=\"j-documentation\"></textarea></div>'\n            + '</div>';\n        var $documentationElement = $(documentationHtml).appendTo($infoPanel);\n        var $documentation = $documentationElement.find(\".j-documentation\");\n        $documentation.tooltip({ title: J.msg['bpmn.documentationTooltip'] })\n        $documentation.text(documentation);\n        $documentation.blur(function() {\n            var newDocumentation = $documentation.val();\n            if (!newDocumentation) {\n                delete bo.documentation;\n            } else {\n                if (!bo.documentation) {\n                    bo.documentation = [moddle.create('bpmn:Documentation')];\n                }\n                bo.documentation[0].text = newDocumentation;\n            }\n        });\n        \n        // Property\n        if (hasProperties === false) {\n            return;\n        }\n        var properties = getExtensionBody(bo, \"easyflow:Properties\");\n        var propertiesHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.property'] + '(<button type=\"button\" class=\"j-properties-mode btn btn-link p-0\">' + J.msg['bpmn.switchJsonMode'] + '</button>):</label> <textarea class=\"form-control j-properties\" name=\"j-properties\"></textarea></div>'\n            + '</div>';\n        var $propertiesElement = $(propertiesHtml).appendTo($infoPanel);\n        var $properties = $propertiesElement.find(\".j-properties\");\n        $properties.tooltip({ title: J.msg['bpmn.propertyTooltip'] });\n        $properties.rules('add', { json: true });\n        $properties.text(properties);\n        $properties.blur(function() {\n            var newProperties = $properties.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:Properties\", newProperties);\n            _self._comment(element);\n        });\n        \n        $properties.jJsonPropertyEditor({mode:\"ROW\"});\n        var $propertiesMode = $propertiesElement.find(\".j-properties-mode\");\n        $propertiesMode.click(function(){\n            if (!$(this).data('j-properties-mode') || $(this).data('j-properties-mode')=='ROW') {\n                $(this).text(J.msg['bpmn.switchRowMode']);\n                $properties.jJsonPropertyEditor(\"changeMode\", \"JSON\");\n                $(this).data('j-properties-mode', \"JSON\");\n            } else {\n                $(this).text(J.msg['bpmn.switchJsonMode']);\n                $properties.jJsonPropertyEditor(\"changeMode\", \"ROW\");     \n                $(this).data('j-properties-mode', \"ROW\");           \n            }\n        });\n\n    }\n\n    /**\n     * Condition type\n     */\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:ExtConditionType\"] = function($infoPanel, element) {\n        const moddle = this.bpmnModeler.get('moddle');\n        var bo = element.businessObject;\n        var eventBus = this.bpmnModeler.get('eventBus');\n        var _self = this;\n        // Property\n        var conditionType = getExtensionBody(bo, \"easyflow:ConditionType\");\n        var conditionTypeHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg[\"bpmn.conditionType\"] + ':</label> ' +\n            '<select class=\"form-control j-bpmn-conditionType\" name=\"j-conditionType\">' +\n                '<option value=\"\">' + J.msg['bpmn.conditionType.inclusive'] + '</option>' +\n                '<option value=\"exclusive\">' + J.msg['bpmn.conditionType.exclusive'] + '</option>' +\n            '</select>' +\n            '</div>' +\n           '</div>';\n        var $conditionTypeElement = $(conditionTypeHtml).appendTo($infoPanel);\n        var $conditionType = $conditionTypeElement.find(\".j-bpmn-conditionType\");\n        $conditionType.tooltip({ title: J.msg['bpmn.conditionTypeTooltip'] });\n        $conditionType.val(conditionType);\n        $conditionType.blur(function() {\n            var newConditionType = $conditionType.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:ConditionType\", newConditionType);\n            _self._comment(element);\n        });\n\n    }\n    \n     /**\n     * Start node\n     */\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:NodeStart\"] = function($infoPanel, element) {\n        const moddle = this.bpmnModeler.get('moddle');\n        var bo = element.businessObject;\n        var eventBus = this.bpmnModeler.get('eventBus');\n        var _self = this;\n        // Property\n        var start = getExtensionBody(bo, \"easyflow:Start\");\n        var startHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.startNode'] + ':</label> ' +\n            '<select class=\"form-control j-bpmn-start\" name=\"j-start\">' +\n                '<option value=\"\">' + J.msg['bpmn.startNode.false'] + '</option>' +\n                '<option value=\"true\">' + J.msg['bpmn.startNode.true'] + '</option>' +\n            '</select>' +\n            '</div>' +\n           '</div>';\n        var $startElement = $(startHtml).appendTo($infoPanel);\n        var $start = $startElement.find(\".j-bpmn-start\");\n        $start.tooltip({ title: J.msg['bpmn.startNodeTooltip'] });\n        $start.val(start);\n        $start.blur(function() {\n            var newStart = $start.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:Start\", newStart);\n            _self._comment(element);\n        });\n\n    }\n    \n    /**\n     * Pre\n     */\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:NodePre\"] = function($infoPanel, element) {\n        const moddle = this.bpmnModeler.get('moddle');\n        var bo = element.businessObject;\n        var eventBus = this.bpmnModeler.get('eventBus');\n        var _self = this;\n        // Property\n        var pre = getExtensionBody(bo, \"easyflow:Pre\");\n        var preHtml = '<div class=\"row\"><div class=\"form-group col\"><label>' + J.msg['bpmn.selfPre'] + ':</label> <textarea class=\"form-control j-bpmn-pre\" name=\"j-bpmn-pre\"></textarea></div></div>';\n        var $preElement = $(preHtml).appendTo($infoPanel);\n        var $pre = $preElement.find(\".j-bpmn-pre\");\n        $pre.tooltip({ title: J.msg['bpmn.selfPreTooltip'] });\n        $pre.val(pre);\n        $pre.blur(function() {\n            var newPre = $pre.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:Pre\", newPre);\n            _self._comment(element);\n        });\n\n    }\n    \n    /**\n     * Action\n     */\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:NodeAction\"] = function($infoPanel, element) {\n        const moddle = this.bpmnModeler.get('moddle');\n        var bo = element.businessObject;\n        var eventBus = this.bpmnModeler.get('eventBus');\n        var _self = this;\n        // Property\n        var action = getExtensionBody(bo, \"easyflow:Action\");\n        var actionHtml = '<div class=\"row\"><div class=\"form-group col\"><label>' + J.msg['bpmn.selfAction'] + ':</label> <textarea class=\"form-control j-bpmn-action\" name=\"j-bpmn-action\"></textarea></div></div>';\n        var $actionElement = $(actionHtml).appendTo($infoPanel);\n        var $action = $actionElement.find(\".j-bpmn-action\");\n        $action.tooltip({ title: J.msg['bpmn.selfActionTooltip'] });\n        $action.val(action);\n        $action.blur(function() {\n            var newAction = $action.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:Action\", newAction);\n            _self._comment(element);\n        });\n\n    }\n    \n    /**\n     * Post\n     */\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:NodePost\"] = function($infoPanel, element) {\n        const moddle = this.bpmnModeler.get('moddle');\n        var bo = element.businessObject;\n        var eventBus = this.bpmnModeler.get('eventBus');\n        var _self = this;\n        // Property\n        var post = getExtensionBody(bo, \"easyflow:Post\");\n        var postHtml = '<div class=\"row\"><div class=\"form-group col\"><label>' + J.msg['bpmn.selfPost'] + ':</label> <textarea class=\"form-control j-bpmn-post\" name=\"j-bpmn-post\"></textarea></div></div>';\n        var $postElement = $(postHtml).appendTo($infoPanel);\n        var $post = $postElement.find(\".j-bpmn-post\");\n        $post.tooltip({ title: J.msg['bpmn.selfPostTooltip'] });\n        $post.val(post);\n        $post.blur(function() {\n            var newPost = $post.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:Post\", newPost);\n            _self._comment(element);\n        });\n\n    }\n\n    // Collaboration\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:Collaboration\"] = function($infoPanel, element) {\n        var participants = element.businessObject.participants;\n        if (participants && participants.length == 1) {\n          var processBusinessObject= participants[0].processRef;\n          if (! processBusinessObject) {\n              return;\n          }\n          var processElement = {};\n          processElement.businessObject = processBusinessObject;\n          this._elementPanelRender[\"bpmn:Process\"].call(this, $infoPanel, processElement);\n        }\n    }\n    \n    // Participant\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:Participant\"] = function($infoPanel, element) {\n        var processBusinessObject = element.businessObject.processRef;\n        if (! processBusinessObject) {\n            return;\n        }\n        var processElement = {};\n        processElement.businessObject = processBusinessObject;\n        this._elementPanelRender[\"bpmn:Process\"].call(this, $infoPanel, processElement);\n    }\n\n    // Lane\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:Lane\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Participant\"].call(this, $infoPanel, element.parent);\n    }    \n\n    // Flow\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:Process\"] = function($infoPanel, element) {\n        var _self = this;\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        var bo = element.businessObject;\n        var eventBus = this.bpmnModeler.get('eventBus');\n        // Flow pre handler\n        var flowPreHandler = getExtensionBody(bo, \"easyflow:Pre\");\n        var flowPreHandlerHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.flowPreHandler'] + ':</label> <textarea class=\"form-control j-bpmn-flowprehandler\" name=\"j-bpmn-flowprehandler\"></textarea></div>'\n            + '</div>';\n        var $flowPreHandlerElement = $(flowPreHandlerHtml).appendTo($infoPanel);\n        var $flowPreHandler = $flowPreHandlerElement.find(\".j-bpmn-flowprehandler\");\n        $flowPreHandler.tooltip({ title: J.msg['bpmn.flowPreHandlerTooltip'] })\n        $flowPreHandler.rules('add', { json: true });\n        $flowPreHandler.text(flowPreHandler);\n        $flowPreHandler.blur(function() {\n            var newFlowPreHandler = $flowPreHandler.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:Pre\", newFlowPreHandler);\n        });\n        // Flow post handler\n        var flowPostHandler = getExtensionBody(bo, \"easyflow:Post\");\n        var flowPostHandlerHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.flowPostHandler'] + ':</label> <textarea class=\"form-control j-bpmn-flowposthandler\" name=\"j-bpmn-flowposthandler\"></textarea></div>'\n            + '</div>';\n        var $flowPostHandlerElement = $(flowPostHandlerHtml).appendTo($infoPanel);\n        var $flowPostHandler = $flowPostHandlerElement.find(\".j-bpmn-flowposthandler\");\n        $flowPostHandler.tooltip({ title: J.msg['bpmn.flowPostHandlerTooltip'] })\n        $flowPostHandler.rules('add', { json: true });\n        $flowPostHandler.text(flowPostHandler);\n        $flowPostHandler.blur(function() {\n            var newFlowPostHandler = $flowPostHandler.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:Post\", newFlowPostHandler);\n        });        \n        \n        // Listener\n        var listeners = getExtensionBody(bo, \"easyflow:Listeners\");\n        var listenersHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.listeners'] + ':</label> <textarea class=\"form-control j-listeners\" name=\"j-listeners\"></textarea></div>'\n            + '</div>';\n        var $listenersElement = $(listenersHtml).appendTo($infoPanel);\n        var $listeners = $listenersElement.find(\".j-listeners\");\n        $listeners.tooltip({ title: J.msg['bpmn.listenersTooltip'] })\n        $listeners.rules('add', { json: true });\n        $listeners.text(listeners);\n        $listeners.blur(function() {\n            var newListeners = $listeners.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:Listeners\", newListeners);\n        });\n        // Filter\n        var filters = getExtensionBody(bo, \"easyflow:Filters\");\n        var filtersHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.filters'] + ':</label> <textarea class=\"form-control j-filters\" name=\"j-filters\"></textarea></div>'\n            + '</div>';\n        var $filtersElement = $(filtersHtml).appendTo($infoPanel);\n        var $filters = $filtersElement.find(\".j-filters\");\n        $filters.tooltip({ title: J.msg['bpmn.filtersTooltip'] });\n        $filters.rules('add', { json: true });\n        $filters.text(filters);\n        $filters.blur(function() {\n            var newFilters = $filters.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:Filters\", newFilters);\n        });\n        // Node filter\n        var nodeFilters = getExtensionBody(bo, \"easyflow:NodeFilters\");\n        var nodeFiltersHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.nodeFilters'] + ':</label> <textarea class=\"form-control j-nodefilters\" name=\"j-nodefilters\"></textarea></div>'\n            + '</div>';\n        var $nodeFiltersElement = $(nodeFiltersHtml).appendTo($infoPanel);\n        var $nodeFilters = $nodeFiltersElement.find(\".j-nodefilters\");\n        $nodeFilters.tooltip({ title: J.msg['bpmn.nodeFiltersTooltip'] });\n        $nodeFilters.rules('add', { json: true });\n        $nodeFilters.text(nodeFilters);\n        $nodeFilters.blur(function() {\n            var newNodeFilters = $nodeFilters.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:NodeFilters\", newNodeFilters);\n        });\n        // Node pre handler filter\n        var nodePreHandlerFilters = getExtensionBody(bo, \"easyflow:NodePreHandlerFilters\");\n        var nodePreHandlerFiltersHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.nodePreHandlerFilters'] + ':</label> <textarea class=\"form-control j-nodeprehandlerfilters\" name=\"j-nodeprehandlerfilters\"></textarea></div>'\n            + '</div>';\n        var $nodePreHandlerFiltersElement = $(nodePreHandlerFiltersHtml).appendTo($infoPanel);\n        var $nodePreHandlerFilters = $nodePreHandlerFiltersElement.find(\".j-nodeprehandlerfilters\");\n        $nodePreHandlerFilters.tooltip({ title: J.msg['bpmn.nodePreHandlerFiltersTooltip'] })\n        $nodePreHandlerFilters.rules('add', { json: true });\n        $nodePreHandlerFilters.text(nodePreHandlerFilters);\n        $nodePreHandlerFilters.blur(function() {\n            var newNodePreHandlerFilters = $nodePreHandlerFilters.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:NodePreHandlerFilters\", newNodePreHandlerFilters);\n        });        \n        // Node action filter\n        var nodeActionFilters = getExtensionBody(bo, \"easyflow:NodeActionFilters\");\n        var nodeActionFiltersHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.nodeActionFilters'] + ':</label> <textarea class=\"form-control j-nodeactionfilters\" name=\"j-nodeactionfilters\"></textarea></div>'\n            + '</div>';\n        var $nodeActionFiltersElement = $(nodeActionFiltersHtml).appendTo($infoPanel);\n        var $nodeActionFilters = $nodeActionFiltersElement.find(\".j-nodeactionfilters\");\n        $nodeActionFilters.tooltip({ title: J.msg['bpmn.nodeActionFiltersTooltip'] })\n        $nodeActionFilters.rules('add', { json: true });\n        $nodeActionFilters.text(nodeActionFilters);\n        $nodeActionFilters.blur(function() {\n            var newNodeActionFilters = $nodeActionFilters.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:NodeActionFilters\", newNodeActionFilters);\n        });\n        // Node post handler filter\n        var nodePostHandlerFilters = getExtensionBody(bo, \"easyflow:NodePostHandlerFilters\");\n        var nodePostHandlerFiltersHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.nodePostHandlerFilters'] + ':</label> <textarea class=\"form-control j-nodeposthandlerfilters\" name=\"j-nodeposthandlerfilters\"></textarea></div>'\n            + '</div>';\n        var $nodePostHandlerFiltersElement = $(nodePostHandlerFiltersHtml).appendTo($infoPanel);\n        var $nodePostHandlerFilters = $nodePostHandlerFiltersElement.find(\".j-nodeposthandlerfilters\");\n        $nodePostHandlerFilters.tooltip({ title: J.msg['bpmn.nodePostHandlerFiltersTooltip'] })\n        $nodePostHandlerFilters.rules('add', { json: true });\n        $nodePostHandlerFilters.text(nodePostHandlerFilters);\n        $nodePostHandlerFilters.blur(function() {\n            var newNodePostHandlerFilters = $nodePostHandlerFilters.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:NodePostHandlerFilters\", newNodePostHandlerFilters);\n        });  \n        // Flow pre handler filter\n        var flowPreHandlerFilters = getExtensionBody(bo, \"easyflow:FlowPreHandlerFilters\");\n        var flowPreHandlerFiltersHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.flowPreHandlerFilters'] + ':</label> <textarea class=\"form-control j-flowprehandlerfilters\" name=\"j-flowprehandlerfilters\"></textarea></div>'\n            + '</div>';\n        var $flowPreHandlerFiltersElement = $(flowPreHandlerFiltersHtml).appendTo($infoPanel);\n        var $flowPreHandlerFilters = $flowPreHandlerFiltersElement.find(\".j-flowprehandlerfilters\");\n        $flowPreHandlerFilters.tooltip({ title: J.msg['bpmn.flowPreHandlerFiltersTooltip'] })\n        $flowPreHandlerFilters.rules('add', { json: true });\n        $flowPreHandlerFilters.text(flowPreHandlerFilters);\n        $flowPreHandlerFilters.blur(function() {\n            var newFlowPreHandlerFilters = $flowPreHandlerFilters.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:FlowPreHandlerFilters\", newFlowPreHandlerFilters);\n        }); \n        // Flow post handler filter\n        var flowPostHandlerFilters = getExtensionBody(bo, \"easyflow:FlowPostHandlerFilters\");\n        var flowPostHandlerFiltersHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.flowPostHandlerFilters'] + ':</label> <textarea class=\"form-control j-flowposthandlerfilters\" name=\"j-flowposthandlerfilters\"></textarea></div>'\n            + '</div>';\n        var $flowPostHandlerFiltersElement = $(flowPostHandlerFiltersHtml).appendTo($infoPanel);\n        var $flowPostHandlerFilters = $flowPostHandlerFiltersElement.find(\".j-flowposthandlerfilters\");\n        $flowPostHandlerFilters.tooltip({ title: J.msg['bpmn.flowPostHandlerFiltersTooltip'] })\n        $flowPostHandlerFilters.rules('add', { json: true });\n        $flowPostHandlerFilters.text(flowPostHandlerFilters);\n        $flowPostHandlerFilters.blur(function() {\n            var newFlowPostHandlerFilters = $flowPostHandlerFilters.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:FlowPostHandlerFilters\", newFlowPostHandlerFilters);\n        });                       \n        // Flow runner\n        var runner = getExtensionBody(bo, \"easyflow:Runner\");\n        var runnerHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.runner'] + ':</label> <textarea class=\"form-control j-bpmn-runner\" name=\"j-bpmn-runner\"></textarea></div>'\n            + '</div>';\n        var $runnerElement = $(runnerHtml).appendTo($infoPanel);\n        var $runner = $runnerElement.find(\".j-bpmn-runner\");\n        $runner.tooltip({ title: J.msg['bpmn.runnerTooltip'] })\n        $runner.rules('add', { json: true });\n        $runner.text(runner);\n        $runner.blur(function() {\n            var newRunner = $runner.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:Runner\", newRunner);\n        });\n        // Flow parse listeners \n        var parseListenersExp = getExtensionBody(bo, \"easyflow:ParseListeners\");\n        var parseListenersHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.parseListeners'] + ':</label> <textarea class=\"form-control j-bpmn-parselisteners\" name=\"j-bpmn-parselisteners\"></textarea></div>'\n            + '</div>';\n        var $parseListenersElement = $(parseListenersHtml).appendTo($infoPanel);\n        var $parseListeners = $parseListenersElement.find(\".j-bpmn-parselisteners\");\n        $parseListeners.tooltip({ title: J.msg['bpmn.parseListenersTooltip'] })\n        $parseListeners.rules('add', { json: true });\n        $parseListeners.text(parseListenersExp);\n        $parseListeners.blur(function() {\n            var newParseListeners = $parseListeners.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:ParseListeners\", newParseListeners);\n        });  \n        // Log flag\n        var logFlag = getExtensionBody(bo, \"easyflow:LogFlag\");\n        var logFlagHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.logFlag'] + ':</label> ' +\n               '<select class=\"form-control j-bpmn-logflag\">' +\n               '<option value=\"\">' + J.msg['bpmn.default'] + '</option>' +\n               '<option value=\"true\">' + J.msg['bpmn.true'] + '</option>' +\n               '<option value=\"false\">' + J.msg['bpmn.false'] + '</option>' +\n            '</select>' +\n            '</div>';\n        var $logFlagElement = $(logFlagHtml).appendTo($infoPanel);\n        $logFlagElement.tooltip({ title: J.msg['bpmn.logFlagTooltip'] });\n        var $logFlag = $logFlagElement.find(\".j-bpmn-logflag\");\n        $logFlag.val(logFlag);\n        $logFlag.blur(function() {\n            var newLogFlag = $logFlag.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:LogFlag\", newLogFlag);\n        });  \n    }\n    // Script task\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:ScriptTask\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        var bo = element.businessObject;\n        var _self = this;\n        // Script format\n        var scriptFormat = bo.scriptFormat;\n        var scriptFormatHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.scriptFormat'] + ':</label> ' +\n               '<select class=\"form-control j-bpmn-scriptformat\">' +\n               '<option value=\"exp\">' + J.msg['bpmn.scriptFormat.exp'] + '</option>' +\n               '<option value=\"createExp\">' + J.msg['bpmn.scriptFormat.createExp'] + '</option>' +\n            '</select>' +\n            '</div>';\n        var $scriptFormatElement = $(scriptFormatHtml).appendTo($infoPanel);\n        $scriptFormatElement.tooltip({ title: J.msg['bpmn.scriptFormatTooltip'] });\n        var $scriptFormat = $scriptFormatElement.find(\".j-bpmn-scriptformat\");\n        $scriptFormat.val(scriptFormat);\n        $scriptFormat.blur(function() {\n            var newScriptFormat = $scriptFormat.val();\n            if (newScriptFormat == 'exp') {\n                delete bo.scriptFormat;\n            } else {\n                bo.scriptFormat = newScriptFormat;\n            }\n        });\n        // task script\n        var script = bo.script;\n        var scriptHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.script'] + ':</label> <textarea class=\"form-control j-bpmn-script\" name=\"j-bpmn-script\"></textarea></div>'\n            + '</div>';\n        var $scriptElement = $(scriptHtml).appendTo($infoPanel);\n        $scriptElement.tooltip({ title: J.msg['bpmn.scriptTooltip'] });\n        var $script = $scriptElement.find(\".j-bpmn-script\");\n        $script.text(script);\n        $script.blur(function() {\n            var newScript = $script.val();\n            bo.script = newScript;\n            _self._comment(element);\n        });\n        \n        this._elementPanelRender[\"bpmn:ExtConditionType\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeStart\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePre\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePost\"].call(this, $infoPanel, element);\n    }\n    // User task\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:UserTask\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:ExtConditionType\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeStart\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePre\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePost\"].call(this, $infoPanel, element);\n    }\n    // Receive task\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:ReceiveTask\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:ExtConditionType\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeStart\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePre\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePost\"].call(this, $infoPanel, element);\n    }\n    // Task\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:Task\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:ExtConditionType\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeStart\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePre\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePost\"].call(this, $infoPanel, element);\n    }      \n    // Send task\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:SendTask\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:ExtConditionType\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeStart\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePre\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePost\"].call(this, $infoPanel, element);\n    }    \n    // Manual Task\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:ManualTask\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:ExtConditionType\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeStart\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePre\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePost\"].call(this, $infoPanel, element);\n    }   \n    // BusinessRuleTask Task\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:BusinessRuleTask\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:ExtConditionType\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeStart\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePre\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePost\"].call(this, $infoPanel, element);\n    }   \n    // Service Task\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:ServiceTask\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:ExtConditionType\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeStart\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePre\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePost\"].call(this, $infoPanel, element);\n    }             \n    // Call activity\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:CallActivity\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        var bo = element.businessObject;\n        var _self = this;\n        // Called element\n        var calledElement = bo.calledElement;\n        var calledElementHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><span class=\"j-require\">*</span><label>' + J.msg['bpmn.calledElement'] + ':</label> ' +\n               '<input class=\"form-control j-bpmn-calledelement\"/>' +\n            '</div>';\n        var $calledElementElement = $(calledElementHtml).appendTo($infoPanel);\n        $calledElementElement.tooltip({ title: J.msg['bpmn.calledElementTooltip'] });\n        var $calledElement = $calledElementElement.find(\".j-bpmn-calledelement\");\n        $calledElement.val(calledElement);\n        $calledElement.blur(function() {\n            var newCalledElement = $calledElement.val();\n                bo.calledElement = newCalledElement;\n        });\n        this._elementPanelRender[\"bpmn:ExtConditionType\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeStart\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePre\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePost\"].call(this, $infoPanel, element);\n    }\n    // Sub process\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:SubProcess\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        var bo = element.businessObject;\n        var _self = this;\n        // Flow\n        var flow = getExtensionBody(bo, \"easyflow:Flow\");\n        var flowHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.flow'] + ':</label> <textarea class=\"form-control j-bpmn-flow\" name=\"j-bpmn-flow\"></textarea></div>'\n            + '</div>';\n        var $flowElement = $(flowHtml).appendTo($infoPanel);\n        var $flow = $flowElement.find(\".j-bpmn-flow\");\n        $flow.tooltip({ title: J.msg['bpmn.flowTooltip'] })\n        $flow.rules('add', { json: true });\n        $flow.text(flow);\n        $flow.blur(function() {\n            var newFlow = $flow.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:Flow\", newFlow);\n        });\n        this._elementPanelRender[\"bpmn:ExtConditionType\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeStart\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePre\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePost\"].call(this, $infoPanel, element);\n    }    \n    // Transaction\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:Transaction\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        var bo = element.businessObject;\n        var _self = this;\n        // Flow\n        var flow = getExtensionBody(bo, \"easyflow:Flow\");\n        var flowHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.flow'] + ':</label> <textarea class=\"form-control j-bpmn-flow\" name=\"j-bpmn-flow\"></textarea></div>'\n            + '</div>';\n        var $flowElement = $(flowHtml).appendTo($infoPanel);\n        var $flow = $flowElement.find(\".j-bpmn-flow\");\n        $flow.tooltip({ title: J.msg['bpmn.flowTooltip'] })\n        $flow.rules('add', { json: true });\n        $flow.text(flow);\n        $flow.blur(function() {\n            var newFlow = $flow.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:Flow\", newFlow);\n        });\n        this._elementPanelRender[\"bpmn:ExtConditionType\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeStart\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePre\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePost\"].call(this, $infoPanel, element);\n    }        \n    // Start event\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:StartEvent\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:ExtConditionType\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePost\"].call(this, $infoPanel, element);\n    }\n    // End event\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:EndEvent\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePre\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n    }\n    // Catch event\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:IntermediateCatchEvent\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:ExtConditionType\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePre\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePost\"].call(this, $infoPanel, element);\n    }\n    // Throw event\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:IntermediateThrowEvent\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:ExtConditionType\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePre\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePost\"].call(this, $infoPanel, element);\n    }    \n    // Exclusive gateway\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:ExclusiveGateway\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePre\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePost\"].call(this, $infoPanel, element);\n    }\n    // Inclusive gateway\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:InclusiveGateway\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePre\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePost\"].call(this, $infoPanel, element);\n    }\n    // Parallel gateway\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:ParallelGateway\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePre\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePost\"].call(this, $infoPanel, element);\n    }\n    // Complex gateway\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:ComplexGateway\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePre\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePost\"].call(this, $infoPanel, element);\n    }  \n    // Event based gateway\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:EventBasedGateway\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePre\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePost\"].call(this, $infoPanel, element);\n    }       \n    // Sequence flow\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:SequenceFlow\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element, false);\n        var bo = element.businessObject;\n        var _self = this;\n        // Conditional expression\n        var conditionExpression = bo.conditionExpression ? bo.conditionExpression.body : '';\n        var conditionExpressionHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.conditionExp'] + ':</label> <textarea class=\"form-control j-bpmn-conditionExpression\" name=\"j-bpmn-conditionExpression\"></textarea></div>'\n            + '</div>';\n        var $conditionExpressionElement = $(conditionExpressionHtml).appendTo($infoPanel);\n        $conditionExpressionElement.tooltip({ title: J.msg[\"bpmn.conditionExpTooltip\"] });\n        var $conditionExpression = $conditionExpressionElement.find(\".j-bpmn-conditionExpression\");\n        $conditionExpression.text(conditionExpression);\n        $conditionExpression.blur(function() {\n            var newConditionExpression = $conditionExpression.val();\n            if (!newConditionExpression) {\n                delete bo.conditionExpression;\n            } else {\n                const moddle = _self.bpmnModeler.get('moddle');\n                (!bo.conditionExpression) && (bo.conditionExpression = moddle.create('bpmn:FormalExpression'));\n                bo.conditionExpression.body = newConditionExpression;\n            }\n            var eventBus = _self.bpmnModeler.get('eventBus');\n            eventBus.fire(\"element.changed\", { element: element });\n            _self._comment(element);\n        });\n    }\n\n    J.BpmnControl.prototype._commentAll = function() {\n        var commentType = this.$bpmnContainer.find(\".j-bpmn-comment-select\").val();\n        var _self = this;\n        var elementRegistry = this.bpmnModeler.get('elementRegistry');\n        var commentTypes = [\"bpmn:StartEvent\", \"bpmn:EndEvent\", \"bpmn:IntermediateCatchEvent\",\"bpmn:IntermediateThrowEvent\",\n            \"bpmn:ExclusiveGateway\", \"bpmn:InclusiveGateway\", \"bpmn:ParallelGateway\", \"bpmn:ComplexGateway\",, \"bpmn:EventBasedGateway\",\n            \"bpmn:ScriptTask\", \"bpmn:ReceiveTask\", \"bpmn:UserTask\",\"bpmn:UserTask\",\"bpmn:CallActivity\",\"bpmn:SubProcess\",\"bpmn:Transaction\",\n            \"bpmn:Task\",\"bpmn:SendTask\",\"bpmn:ManualTask\",\"bpmn:BusinessRuleTask\",\"bpmn:ServiceTask\",\n            \"bpmn:SequenceFlow\"];\n        var commentElements = elementRegistry.filter(function(e) {\n            return commentTypes.indexOf(e.type) >= 0;\n        });\n        commentElements.forEach(function(element) {\n            _self._comment(element, commentType);\n        });\n    }\n\n    /**\n     * Comment\n     */\n    J.BpmnControl.prototype._comment = function(element, commentType) {\n        var commentTypes = [\"bpmn:StartEvent\", \"bpmn:EndEvent\", \"bpmn:IntermediateCatchEvent\",\"bpmn:IntermediateThrowEvent\",\n            \"bpmn:ExclusiveGateway\", \"bpmn:InclusiveGateway\", \"bpmn:ParallelGateway\", \"bpmn:ComplexGateway\",, \"bpmn:EventBasedGateway\",\n            \"bpmn:ScriptTask\", \"bpmn:ReceiveTask\", \"bpmn:UserTask\",\"bpmn:CallActivity\",\"bpmn:SubProcess\",\"bpmn:Transaction\",\n           \"bpmn:Task\", \"bpmn:SendTask\",\"bpmn:ManualTask\",\"bpmn:BusinessRuleTask\",\"bpmn:ServiceTask\",\n            \"bpmn:SequenceFlow\"];\n            if (! commentTypes.includes(element.type)) {\n                return;\n            }\n        if (commentType === undefined) {\n            commentType = this.$bpmnContainer.find(\".j-bpmn-comment-select\").val();\n        }\n        var _self = this;\n        var overlays = this.bpmnModeler.get('overlays');\n        var bo = element.businessObject;\n        overlays.remove({ element: element.id, type:\"easyflow-comment\"});\n        if (!commentType.includes(\"node\") && !commentType.includes(\"condition\")) {\n            return;\n        }\n        // Judge type\n        if (\"bpmn:SequenceFlow\" == element.type) {\n            if (!commentType.includes(\"condition\") || !bo.conditionExpression) {\n                return;\n            }\n        }\n        if ([\"bpmn:StartEvent\", \"bpmn:EndEvent\", \"bpmn:IntermediateCatchEvent\",\"bpmn:IntermediateThrowEvent\",\n            \"bpmn:ExclusiveGateway\", \"bpmn:InclusiveGateway\", \"bpmn:ParallelGateway\", \"bpmn:ComplexGateway\",, \"bpmn:EventBasedGateway\",\n            \"bpmn:ScriptTask\", \"bpmn:ReceiveTask\", \"bpmn:UserTask\",\"bpmn:CallActivity\",\"bpmn:SubProcess\",\"bpmn:Transaction\",\n            \"bpmn:Task\",\"bpmn:SendTask\",\"bpmn:ManualTask\",\"bpmn:BusinessRuleTask\",\"bpmn:ServiceTask\",\n            \"bpmn:SubProcess\",\"bpmn:Transaction\"].includes(element.type)) {\n            if (!commentType.includes(\"node\")) {\n                return;\n            }\n        }\n        \n        var elementRegistry = this.bpmnModeler.get('elementRegistry');\n        var element = elementRegistry.get(element.id);\n        if (! element) {\n            return;\n        }\n        \n        var commentId = \"comment_\" + $.jSequence.next();\n        var clazz = \"\";\n        if(\"bpmn:SequenceFlow\" == element.type) {\n            clazz = \" j-bpmn-comment-condition\";\n        }\n        var html = '<div class=\"j-bpmn-comment' + clazz + '\" id=\"' + commentId + '\"><dl>';\n            html += '<dt>ID:</dt><dd>' + bo.id + (bo.name?\"(\" + bo.name + \")\":\"\") + '</dd>';\n        if (element.type == \"bpmn:SequenceFlow\") {\n            html += '<dt>' + J.msg['bpmn.condition'] + ':</dt><dd>' + (bo.conditionExpression ? bo.conditionExpression.body : J.msg['bpmn.none']) + '</dd>'\n        }\n        if (element.type == 'bpmn:ScriptTask') {\n            html += '<dt>' + J.msg['bpmn.script'] + ':</dt><dd>' + (bo.script ? bo.script : J.msg['bpmn.none']) + '</dd>';\n        }\n        if (element.type=='bpmn:CallActivity') {\n            html += '<dt>' + J.msg['bpmn.calledElement'] + ':</dt><dd>' + (bo.calledElement ? bo.calledElement : J.msg['bpmn.none']) + '</dd>';\n        }\n            var properties = getExtensionBody(bo, \"easyflow:Properties\");\n            if (properties) {\n                html += '<dt>' + J.msg['bpmn.property'] + ':</dt><dd>' + properties + '</dd>';\n            }\n        if (element.type == 'bpmn:ScriptTask' || element.type=='bpmn:UserTask' || element.type=='bpmn:ReceiveTask') {\n           var conditionType = getExtensionBody(bo, \"easyflow:ConditionType\");\n            if (conditionType == 'exclusive') {\n                html += '<dt>' + J.msg['bpmn.branchType'] + ':</dt><dd>' + J.msg['bpmn.branchType.exclusive'] + '</dd>';\n            }\n            var start = getExtensionBody(bo, \"easyflow:Start\");\n            if (start == 'true') {\n                html += '<dt>' + J.msg['bpmn.startNode'] + ':</dt><dd>' + J.msg['bpmn.startNode.true'] + '</dd>';\n            }            \n        }\n        \n        var nodePre = getExtensionBody(bo, \"easyflow:Pre\");\n        if (nodePre) {\n            html += '<dt>' + J.msg['bpmn.selfPre'] + ':</dt><dd>' + nodePre + '</dd>';\n        }\n         var nodeAction = getExtensionBody(bo, \"easyflow:Action\");\n        if (nodeAction) {\n            html += '<dt>' + J.msg['bpmn.selfAction'] + ':</dt><dd>' + nodeAction + '</dd>';\n        }    \n         var nodePost = getExtensionBody(bo, \"easyflow:Post\");\n        if (nodePost) {\n            html += '<dt>' + J.msg['bpmn.selfPost'] + ':</dt><dd>' + nodePost + '</dd>';\n        }               \n \n        \n        html += '</dl></div>';\n        // attach an overlay to a node\n        var extPropertiesStr = getExtensionBody(bo, \"easyflow:ExtProperties\");\n        var extProperties = extPropertiesStr ? JSON.parse(extPropertiesStr) : {};\n        var pos = extProperties && extProperties.commentPosition ? extProperties.commentPosition : { top:3, left:20 };\n        overlays.add(element.id, \"easyflow-comment\", {\n            position: pos,\n            html: html,\n            scale:{max:1}\n        });\n        var $comment = $(\"#\" + commentId);\n        var $commentParent = $comment.parent();\n        var width = extProperties && extProperties.commentWidth ? extProperties.commentWidth : 110;\n        $comment.width(width);\n        // Drag event\n        $comment.on(\"mousemove\", function(e){\n            var offset = $comment.offset();\n            if ((offset.left + $comment.width() - e.pageX) < 5) {\n                $comment.css(\"cursor\", \"e-resize\");\n            } else if (e.pageX-offset.left < 5 || e.pageY-offset.top<5 || offset.top+$comment.height() - e.pageY < 5) {\n                $comment.css(\"cursor\", \"move\");\n            } else {\n                $comment.css(\"cursor\", \"auto\");\n            }  \n        });\n        $comment.on(\"mousedown\", function(e) {\n            $comment.pageX = e.pageX;\n            $comment.pageY = e.pageY;\n            var offset = $comment.offset();\n            if ((offset.left + $comment.width() - e.pageX) < 5) {\n                $comment.eventType = 'width';\n                $comment.css(\"cursor\", \"e-resize\");\n            } else if (e.pageX-offset.left < 5 || e.pageY-offset.top<5 || offset.top+$comment.height() - e.pageY < 5) {\n                $comment.eventType = \"drag\";\n                $comment.css(\"cursor\", \"move\");\n            } else {\n                $comment.eventType = null;\n                $comment.css(\"cursor\", \"auto\");\n            }\n            var mousemoveFunction = function(e) {\n                if ($comment.eventType == \"drag\") {\n                    var top = pos.top + (e.pageY - $comment.pageY);\n                    var left = pos.left + (e.pageX - $comment.pageX);\n                    $commentParent.css({ top: top + \"px\", left: left + \"px\" });\n                } else if ($comment.eventType == 'width') {\n                    var currentWidth = width + (e.pageX - $comment.pageX);\n                    $comment.width(currentWidth);\n                }\n            };\n            var mouseupFunction = function(e) {\n                $(document).off(\"mousemove\", mousemoveFunction).off(\"mouseup\", mouseupFunction);\n                var extPropertiesStr = getExtensionBody(bo, \"easyflow:ExtProperties\");\n                var extProperties = extPropertiesStr ? JSON.parse(extPropertiesStr) : {};\n                $comment.css(\"cursor\", \"auto\");\n                if ($comment.eventType == \"drag\") {\n                    pos.left += e.pageX - $comment.pageX;\n                    pos.top += e.pageY - $comment.pageY;                   \n                    extProperties.commentPosition = pos;\n                    updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:ExtProperties\", JSON.stringify(extProperties));\n                } else if ($comment.eventType=='width') {\n                    width += e.pageX - $comment.pageX;\n                    extProperties.commentWidth = width;\n                    updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:ExtProperties\", JSON.stringify(extProperties));\n                }\n            }\n            if ($comment.eventType){\n                $(document).on(\"mousemove\", mousemoveFunction).on(\"mouseup\", mouseupFunction)\n            }\n        });\n    }\n    /**\n     * html of show\n     */\n    J.BpmnControl.prototype._html = function() {\n        return '<div class=\"j-bpmn-panel j-bpmn-panel-normal\">' +                                                           \n          '<div class=\"j-flow-canvas\"></div> ' +    \n          '<div class=\"text-left j-bpmn-btn-group\">     ' +                                                                   \n              '<button type=\"button\" class=\"btn btn-primary j-bpmn-view\">' + J.msg['bpmn.bpmnDefinition'] + '</button>\\n' +\n            (this.cfg.mode == 'view' ? '' : '<button type=\"button\" class=\"btn btn-secondary j-bpmn-import\">' + J.msg['bpmn.import'] + '</button>\\n') +\n              '<button type=\"button\" class=\"btn btn-secondary j-bpmn-export\">' + J.msg['bpmn.export'] + '</button>\\n' +\n              '<button type=\"button\" class=\"btn btn-secondary j-bpmn-svgdownload\">' + J.msg['bpmn.svg'] + '</button>\\n' +\n              '<button type=\"button\" class=\"btn btn-secondary j-bpmn-zoomin\" data-toggle=\"tooltip\" title=\"' + J.msg['bpmn.zoomIn'] + '\">-</button>\\n' +\n              '<button type=\"button\" class=\"btn btn-secondary j-bpmn-zoomout\" data-toggle=\"tooltip\" title=\"' + J.msg['bpmn.zoomOut'] + '\">+</button>\\n' +\n              '<button type=\"button\" class=\"btn btn-secondary j-bpmn-fullscreen\" data-toggle=\"tooltip\" title=\"' + J.msg['bpmn.fullScreen'] + '\"><i class=\"fas fa-expand\"></i></button>\\n' +\n              '<div class=\"j-bpmn-comment-select-container\"><select multiple=\"multiple\" class=\"j-bpmn-comment-select d-none\">' +\n                  '<option value=\"node\">' + J.msg['bpmn.node'] + '</option>' +\n                  '<option value=\"condition\">' + J.msg['bpmn.condition'] + '</option>' +\n              '</select></div> ' +\n          '</div>  ' +                                                \n         '<div class=\"infoPanel\"><div class=\"infoPanelHead\"><span class=\"j-bpmn-info-title\"><b>' + J.msg['bpmn.infoPanel'] + '</b></span><i class=\"fa fa-info-circle j-bpmn-info-switch\"></i><div style=\"clear:both\"></div></div><form class=\"container\"></form></div>  ' +                                          \n      '</div>    ';\n    }\n\n    J.BpmnControl.prototype._bpmnViewHtml = function() {\n        return '<div class=\"bpmnDefContainer\">                                                                                 ' +\n            '    <div class=\"row\">                                                                                          ' +\n            '        <div class=\"form-group col\">                                                                           ' +\n            '            <label><span class=\"j-require\">*</span>' + J.msg['bpmn.flowBpmnDefinition'] + ':</label>                                       ' +\n            '            <textarea class=\"bpmnDef form-control\" rows=\"30\"></textarea>                                       ' +\n            '        </div>                                                                                                 ' +\n            '    </div>                                                                                                     ' +\n            '    <div class=\"row\">                                                                                          ' +\n            '        <div class=\"col text-center\">                                                                          ' +\n            (this.cfg.mode == 'view' ? '' : '            <button type=\"button\" class=\"btn btn-primary j-btn-bpmn-render\">' + J.msg['bpmn.renderFlowDiagram'] +'</button>              ') +\n            '            <button type=\"button\" class=\"btn btn-secondary j-btn-primary j-btn-bpmn-json\">' + J.msg['bpmn.viewFlowDefinition'] + '</button>           ' +\n            (this.cfg.mode != 'edit' ? '' : '            <button type=\"button\" class=\"btn btn-secondary j-btn-compare-bpmn\">' + J.msg['bpmn.oldNewBpmnCompare'] + '</button>       ') +\n            (this.cfg.mode != 'edit' ? '' : '            <button type=\"button\" class=\"btn btn-secondary j-btn-compare-easyflow\">' + J.msg['bpmn.oldNewEasyFlowCompare'] + '</button>   ') +\n            '            <button type=\"button\" class=\"btn btn-secondary j-btn-cancel\">' + J.msg['bpmn.cancel'] + '</button>                         ' +\n            '        </div>                                                                                                 ' +\n            '    </div>                                                                                                     ' +\n            '</div>                                                                                                         ' +\n            '';\n    }\n\n    J.BpmnControl.prototype.initialDiagram = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>'\n        + '<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ' +\n        'xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" ' +\n        'xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" ' +\n        'xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" ' +\n        'targetNamespace=\"http://bpmn.io/schema/bpmn\" ' +\n        'id=\"Definitions_1\">'\n        + '<bpmn:process id=\"Process_1\" isExecutable=\"false\">'\n        + '<bpmn:startEvent id=\"StartEvent_1\"/>'\n        + '</bpmn:process>'\n        + '<bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">'\n        + '<bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">'\n        + '<bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">'\n        + '<dc:Bounds height=\"36.0\" width=\"36.0\" x=\"173.0\" y=\"102.0\"/>'\n        + '</bpmndi:BPMNShape>' + '</bpmndi:BPMNPlane>'\n        + '</bpmndi:BPMNDiagram>' + '</bpmn:definitions>';\n\n/**\n* Find BPMN Element\n*/\n\tJ.BpmnControl.prototype.findProcessElements = function() {\n\t\tvar bpmnModeler = this.bpmnModeler;\n\t\treturn _findProcessElement(bpmnModeler);\n\t}\n    function _findProcessElement(bpmnModeler) {\n        var elementRegistry = bpmnModeler.get('elementRegistry');\n        var processes = elementRegistry.filter(function(element) {\n            return element.type == 'bpmn:Process';\n        });\n        if (processes.length>0) {\n            return processes;\n        }\n        var participants = elementRegistry.filter(function(element) {\n            return element.type == 'bpmn:Participant';\n        });\n        participants.forEach(function(element){\n            var processBusinessObject = element.businessObject.processRef;\n            if (processBusinessObject) {\n              processes.push({businessObject:processBusinessObject});\n            }\n        });\n        return processes;\n    }\n    \n\n    /**\n     * Read extension field\n     */\n    function getExtensionElement(element, type) {\n        if (!element.extensionElements || !element.extensionElements.values) {\n            return;\n        }\n        return element.extensionElements.values.filter((extensionElement) => {\n            return extensionElement.$instanceOf(type);\n        })[0];\n    }\n\n    function getExtensionBody(bo, type) {\n        var extensionElement = getExtensionElement(bo, type);\n        return extensionElement ? extensionElement.$body : null;\n    }\n\n    /**\n     * Update body of extension\n     */\n    function updateExtensionBody(bpmnModeler, bo, type, value) {\n        // Delete element\n        if (!value) {\n            if (!bo.extensionElements || !bo.extensionElements.values) {\n                return;\n            }\n            var values = [];\n            bo.extensionElements.values && bo.extensionElements.values.forEach(function(el) {\n                if (!el.$instanceOf(type)) {\n                    values.push(el);\n                }\n            });\n            if (values.length == 0) {\n                delete bo.extensionElements;\n            } else {\n                bo.extensionElements.values = values;\n            }\n        } else {\n            // Add or modify element\n            var element = getExtensionElement(bo, type);\n            if (element) {\n                // modify element\n                element.$body = value;\n            } else {\n                // add element\n                const moddle = bpmnModeler.get('moddle');\n                (!bo.extensionElements) && (bo.extensionElements = moddle.create('bpmn:ExtensionElements'));\n                var element = moddle.create(type);\n                element.$body = value;\n                bo.extensionElements.get('values').push(element);\n            }\n        }\n    }\n\n    var easyflowExtension =\n    {\n        \"name\": \"easyflow\",\n        \"uri\": \"http://jd.com/easyflow\",\n        \"prefix\": \"easyflow\",\n        \"xml\": {\n            \"tagAlias\": \"lowerCase\"\n        },\n        \"types\": [\n            {\n                \"name\": \"Properties\",\n                \"superClass\": [\"Element\"],\n                \"properties\": [\n                    {\n                        \"name\": \"$body\",\n                        \"isBody\": true,\n                        \"type\": \"String\"\n                    }\n                ]\n            },\n            {\n                \"name\": \"Listeners\",\n                \"superClass\": [\"Element\"],\n                \"properties\": [\n                    {\n                        \"name\": \"$body\",\n                        \"isBody\": true,\n                        \"type\": \"String\"\n                    }\n                ]\n            },\n            {\n                \"name\": \"Filters\",\n                \"superClass\": [\"Element\"],\n                \"properties\": [\n                    {\n                        \"name\": \"$body\",\n                        \"isBody\": true,\n                        \"type\": \"String\"\n                    }\n                ]\n            },\n            {\n                \"name\": \"NodeFilters\",\n                \"superClass\": [\"Element\"],\n                \"properties\": [\n                    {\n                        \"name\": \"$body\",\n                        \"isBody\": true,\n                        \"type\": \"String\"\n                    }\n                ]\n            },\n            {\n                \"name\": \"NodePreHandlerFilters\",\n                \"superClass\": [\"Element\"],\n                \"properties\": [\n                    {\n                        \"name\": \"$body\",\n                        \"isBody\": true,\n                        \"type\": \"String\"\n                    }\n                ]\n            },\n            {\n                \"name\": \"NodeActionFilters\",\n                \"superClass\": [\"Element\"],\n                \"properties\": [\n                    {\n                        \"name\": \"$body\",\n                        \"isBody\": true,\n                        \"type\": \"String\"\n                    }\n                ]\n            },\n            {\n                \"name\": \"NodePostHandlerFilters\",\n                \"superClass\": [\"Element\"],\n                \"properties\": [\n                    {\n                        \"name\": \"$body\",\n                        \"isBody\": true,\n                        \"type\": \"String\"\n                    }\n                ]\n            },   \n            {\n                \"name\": \"FlowPreHandlerFilters\",\n                \"superClass\": [\"Element\"],\n                \"properties\": [\n                    {\n                        \"name\": \"$body\",\n                        \"isBody\": true,\n                        \"type\": \"String\"\n                    }\n                ]\n            }, \n            {\n                \"name\": \"FlowPostHandlerFilters\",\n                \"superClass\": [\"Element\"],\n                \"properties\": [\n                    {\n                        \"name\": \"$body\",\n                        \"isBody\": true,\n                        \"type\": \"String\"\n                    }\n                ]\n            },                                              \n            {\n                \"name\": \"ConditionType\",\n                \"superClass\": [\"Element\"],\n                \"properties\": [\n                    {\n                        \"name\": \"$body\",\n                        \"isBody\": true,\n                        \"type\": \"String\"\n                    }\n                ]\n            },\n            {\n                \"name\": \"Start\",\n                \"superClass\": [\"Element\"],\n                \"properties\": [\n                    {\n                        \"name\": \"$body\",\n                        \"isBody\": true,\n                        \"type\": \"String\"\n                    }\n                ]\n            },   \n            {\n                \"name\": \"Pre\",\n                \"superClass\": [\"Element\"],\n                \"properties\": [\n                    {\n                        \"name\": \"$body\",\n                        \"isBody\": true,\n                        \"type\": \"String\"\n                    }\n                ]\n            }, \n            {\n                \"name\": \"Action\",\n                \"superClass\": [\"Element\"],\n                \"properties\": [\n                    {\n                        \"name\": \"$body\",\n                        \"isBody\": true,\n                        \"type\": \"String\"\n                    }\n                ]\n            },                         \n            {\n                \"name\": \"Post\",\n                \"superClass\": [\"Element\"],\n                \"properties\": [\n                    {\n                        \"name\": \"$body\",\n                        \"isBody\": true,\n                        \"type\": \"String\"\n                    }\n                ]\n            },   \t\t\t\n            {\n                \"name\": \"Runner\",\n                \"superClass\": [\"Element\"],\n                \"properties\": [\n                    {\n                        \"name\": \"$body\",\n                        \"isBody\": true,\n                        \"type\": \"String\"\n                    }\n                ]\n            },\n            {\n                \"name\": \"ParseListeners\",\n                \"superClass\": [\"Element\"],\n                \"properties\": [\n                    {\n                        \"name\": \"$body\",\n                        \"isBody\": true,\n                        \"type\": \"String\"\n                    }\n                ]\n            },                    \n            {\n                \"name\": \"ExtProperties\",\n                \"superClass\": [\"Element\"],\n                \"properties\": [\n                    {\n                        \"name\": \"$body\",\n                        \"isBody\": true,\n                        \"type\": \"String\"\n                    }\n                ]\n            },\n            {\n                \"name\": \"Flow\",\n                \"superClass\": [\"Element\"],\n                \"properties\": [\n                    {\n                        \"name\": \"$body\",\n                        \"isBody\": true,\n                        \"type\": \"String\"\n                    }\n                ]\n            },\n            {\n                \"name\": \"LogFlag\",\n                \"superClass\": [\"Element\"],\n                \"properties\": [\n                    {\n                        \"name\": \"$body\",\n                        \"isBody\": true,\n                        \"type\": \"String\"\n                    }\n                ]\n            }                                \n        ]\n    };\n\n\n\n    function easyFlowTranslate(template, replacements) {\n        replacements = replacements || {};\n\n        // Translate\n        template = J.bpmnIOTranslations[template] || template;\n\n        // Replace\n        return template.replace(/{([^}]+)}/g, function(_, key) {\n            return replacements[key] || '{' + key + '}';\n        });\n    }\n\n\n})(window.J);                "
  },
  {
    "path": "easyflow-flow-bpmn/static/plugins/flow/flow.css",
    "content": "/**BPMN panel*/\n.j-bpmn-panel {\n    background-color: white\n}\n\n.j-bpmn-panel-normal {\n    position:relative;\n    height:500px;   \n}\n\n.j-bpmn-panel-fullscreen {\n    position:fixed;\n    top:0;\n    bottom:0;\n    left:0;\n    right:0;\n    z-index:1000\n}\n\n.j-flow-canvas {\n    height: 100%\n}\n\n.j-bpmn-btn-group {\n    position:absolute;\n    left:10px;\n    bottom:0;\n\n}\n/**info panel*/\n.infoPanel {\n    padding:4px;\n    position: absolute;\n    right: 0;\n    top: 0;\n    bottom:50px;\n    overflow:scroll;\n    background: white;\n    border: 1px solid #ccc;\n}\n\n.infoPanel-up {\n\tbottom:auto;\n\toverflow:hidden;\n}\n\n.infoPanel form {\n\twidth:300px;\n}\n.infoPanel .col {\n    padding-left:0px;\n    padding-right: 0px;\n}\n\n.infoPanel textarea.form-control {\n    height:30px;\n}\n\n.j-bpmn-info-switch {\n    float:right;\n    cursor: pointer;\n}\n\n/**instance info style*/\n.j-bpmn-node-close:not(.djs-connection) .djs-visual>:nth-child(1) {\n    fill: #F0FFF0 !important; /* color elements as green */\n}\n\n.j-bpmn-node-active:not(.djs-connection) .djs-visual>:nth-child(1) {\n    fill: #FFFACD !important; /* color elements as green */\n}\n\n\n.j-bpmn-comment-select-container {\n\tdisplay: inline-block;\n}\n\n.j-bpmn-comment {\n    border-radius:2px;\n    background-color:#cf9;\n    opacity: 0.8\n}\n\n.j-bpmn-comment-condition {\n\t    background-color:#ff3;\n}\n\n/**Detail info style*/\n.j-bpmn-comment dl {\n    font-size: 10px;\n    margin:0;\n    padding:3px;\n}\n.j-bpmn-comment dt {\n    float:left\n}\n.j-bpmn-comment dd {\n    margin-bottom:1px;\n    word-break:break-all;\n}\n\nselect.j-bpmn-comment-btn {\n   display:inline;width:90px \n}\n\n.j-prop-key {\n    font-size: 11px;\n}\n\n.j-prop-type {\n    font-size: 11px;\n}\n\n.j-prop-val {\n   font-size: 11px; \n}"
  },
  {
    "path": "easyflow-flow-bpmn/static/plugins/flow/flow.js",
    "content": "(function (J) {\n    /**\n     * Define panel control\n     */\n    J.FlowControl = function (cfg) {\n        /**\n         *Init\n         */\n        this.init = function (cfg) {\n            this.cfg = cfg;\n            this.data = cfg.data ? cfg.data : {};\n            this.originData = JSON.parse(JSON.stringify(this.data));\n            this.$container = cfg.$container;\n            var _self = this;\n            this.bpmnControl = new J.BpmnControl({\n                data: {bpmnXmlData: this.data.bpmnXmlData},\n                mode: cfg.mode,\n                openDiagramCallBack: function (processElements) {\n                    if (_self.$flowContainer.find(\"[name='format']\").val() != 'FLOW-bpmn') {\n                        return;\n                    }\n                    if (processElements.length==0) {\n                        return;\n                    }\n                    _self.$flowContainer.find(\"[name='defId']\").val(processElements[0].businessObject.id);\n                    _self.$flowContainer.find(\"[name='defName']\").val(processElements[0].businessObject.name);\n                },\n                onBpmnDefinitionChange: function (bo, key, newVal, oldVal) {\n                    if (_self.$flowContainer.find(\"[name='format']\").val()!='FLOW-bpmn') {\n                        return;\n                    }\n                    if (bo.$type == 'bpmn:Process') {\n\t\t\t\t\t\tif (key == 'id' || key == 'name') {\n\t\t\t\t\t\t\tvar processElements = this.findProcessElements();\n\t\t\t\t\t\t\tif (bo.id == processElements[0].businessObject.id) {\n\t\t                        if (key == 'id') {\n\t\t                            _self.$flowContainer.find(\"[name='defId']\").val(newVal);\n\t\t                        } else if (key == 'name') {\n\t\t                            _self.$flowContainer.find(\"[name='defName']\").val(newVal);\n\t\t                        }\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n                    }\n                }\n            });\n        }\n        /**\n         * Render\n         */\n        this.render = async function () {\n            var $flowContainer = this.$flowContainer = $(_html()).appendTo(this.$container);\n            $flowContainer.find(\"[name='defId']\").val(this.data.defId);\n            $flowContainer.find(\"[name='defName']\").val(this.data.defName);\n            this.data.format && $flowContainer.find(\"[name='format']\").val(this.data.format);\n            this.data.bizType && $flowContainer.find(\"[name='bizType']\").val(this.data.bizType);\n            this.data.category && $flowContainer.find(\"[name='category']\").val(this.data.category);\n            if (this.cfg.mode == 'view') {\n                $flowContainer.find(\"[name='format']\").attr(\"disabled\", true);\n                $flowContainer.find(\"[name='bizType']\").attr(\"disabled\", true);\n                $flowContainer.find(\"[name='category']\").attr(\"disabled\", true);\n            }\n\n            var _self = this;\n            // Define type select\n            $flowContainer.find('[name=\"format\"]').change(function () {\n                _self._renderTabs();\n            });\n\n            // Format select\n            $flowContainer.find('[name=\"format\"]').change(function() {_self._renderTabs();});\n            // Show tab\n            this._renderTabs();\n            // Render BPMN panel\n            await this._renderBpmnPanel();\n            $(function(){\n            $flowContainer.find(\".bpmnContainer\").addClass(\" tab-pane\");\n            });\n            // Render JSON Panel\n            this._renderJsonPanel();\n            return this;\n        }\n        this.init(cfg);\n        return this;\n    }\n\n    /**\n     * Render BPMN Panel\n     */\n    J.FlowControl.prototype._renderBpmnPanel = function () {\n        var $bpmnContainer = this.$flowContainer.find(\".bpmnContainer\");\n        this.bpmnControl.render($bpmnContainer);\n    }\n\n    /**\n     * Render JSON Panel\n     */\n    J.FlowControl.prototype._renderJsonPanel = function () {\n        this._renderJsonDataContainer();\n        var _self = this;\n        this.$flowContainer.find(\".jsonContainer\").find(\".j-json-def\").click(function () {\n            var elementHtml = _self._jsonViewHtml();\n            $.jDialog({\n                title: J.msg['flow.jsonDefTitle'],\n                size: \"modal-lg\",\n                element: elementHtml,\n                action: function ($dialog) {\n                    $dialog.find(\".jsonDef\").val(_self.data.jsonData);\n                    // Render buttons\n                    $dialog.find(\".j-btn-json-render\").click(function () {\n                        var dataStr = $dialog.find(\".jsonDef\").val();\n                        var data;\n                        try {\n                           data =  JSON.parse(dataStr);\n                        } catch (e) {\n                            $.jMessage({msg:J.msg['jqueryValidate.json']});\n                            return;\n                        }\n                        \n                        _self.data.jsonData = dataStr;\n                        _self._renderJsonDataContainer();\n                        if (data instanceof Array) {\n                            data = data[0];\n                        }\n                        _self.$flowContainer.find(\"[name='defId']\").val(data.id);\n                        _self.$flowContainer.find(\"[name='defName']\").val(data.name);\n                        $dialog.modal(\"hide\");\n                    });\n                    // Compare\n                    $dialog.find(\".j-btn-json-compare\").click(function () {\n                        var newData = $dialog.find(\".jsonDef\").val();\n                        var oldData = _self.originData.jsonData;\n                        $.jDiffDialog({\n                            left: {title: J.msg['flow.newFlowDef'] + \":\", content: newData},\n                            right: {title: J.msg['flow.oldFlowDef'] + \":\", content: oldData}\n                        });\n                    });\n                }\n            });\n        });\n\n    }\n\n    J.FlowControl.prototype._renderJsonDataContainer = function () {\n        var $jsonContainer = this.$jsonContainer = this.$flowContainer.find(\".jsonContainer\");\n        $jsonContainer.find(\".jsonDataContainer\").empty();\n        var jsonData = this.data.jsonData;\n        if (!jsonData) {\n            $jsonContainer.find(\".jsonDataContainer\").append(\"<div>\" + J.msg['flow.noJsonDataTip'] + \"</div>\");\n            return;\n        }\n        var def = JSON.parse(jsonData);\n        // Node panel\n        var table = '<table class=\"table table-striped table-bordered\"><thead><tr><th>' + J.msg['flow.id'] + '</th><th>' + J.msg['flow.nodeId'] + '</th><th>' + J.msg['flow.nodeName'] + '</th></tr></thead>';\n        var format = this.$flowContainer.find(\"[name='format']\").val();\n        ;\n        if (format == 'FSM-easy') {\n\t\t\tif (def.states) {\n\t            for (var i = 0; i < def.states.length; i++) {\n\t                table += \"<tr><td>\" + def.id + \"</td><td>\" + def.states[i].id + \"</td><td>\" + (def.states[i].name ? def.states[i].name : '') + \"</td></tr>\";\n\t            }\n\t\t\t}\n        } else {\n            if (def instanceof Array) {\n             for (var j in def) {\n\t\t\t\tif (def[j].nodes) {\n\t              for (var i = 0; i < def[j].nodes.length; i++) {\n\t                table += \"<tr><td>\" + def[j].id + \"</td><td>\" + def[j].nodes[i].id + \"</td><td>\" + (def[j].nodes[i].name ? def[j].nodes[i].name : '') + \"</td></tr>\";\n\t              }\n\t\t\t  }\n                }\n            } else {\n\t\t\t\tif (def.nodes) {\n\t            for (var i = 0; i < def.nodes.length; i++) {\n\t                table += \"<tr><td>\" + def.id + \"</td><td>\" + def.nodes[i].id + \"</td><td>\" + (def.nodes[i].name ? def.nodes[i].name : '') + \"</td></tr>\";\n\t            }\n\t\t\t}\n            }\n        }\n        table += \"</table>\";\n        $jsonContainer.find(\".jsonDataContainer\").append(table);\n    }\n\n\n    /**\n     * Render tab\n     */\n    J.FlowControl.prototype._renderTabs = function () {\n        var format = this.$flowContainer.find('[name=\"format\"]').val();\n        if (format == 'FLOW-bpmn') {\n            this.$flowContainer.find(\".nav-bpmnContainer\").show();\n            this.$flowContainer.find(\".nav-jsonContainer,.nav-plantUmlContainer\").hide();\n            this.$flowContainer.find(\".nav-bpmnContainer\").tab(\"show\");\n        } else {\n            this.$flowContainer.find(\".nav-bpmnContainer,.nav-jsonContainer\").show();\n            this.$flowContainer.find(\".nav-plantUmlContainer\").hide();\n            this.$flowContainer.find(\".nav-jsonContainer\").tab(\"show\");\n        }\n    };\n\n    /**\n     * Collect data\n     */\n    J.FlowControl.prototype.collect = async function () {\n        this.data.defId = this.$flowContainer.find(\"[name='defId']\").val();\n        this.data.defName = this.$flowContainer.find(\"[name='defName']\").val();\n        this.data.bizType = this.$flowContainer.find(\"[name='bizType']\").val();\n        this.data.category = this.$flowContainer.find(\"[name='category']\").val();\n        this.data.format = this.$flowContainer.find(\"[name='format']\").val();\n        // JSON Data has been set\n        this.data.bpmnXmlData = await this.bpmnControl.collect();\n        // hack! judge by length\n        if (this.data.bpmnXmlData.length < 1000) {\n            this.data.bpmnXmlData = null;\n        }\n        return this.data;\n    }\n\n\n    var _html = function () {\n        var bpmnContainerId = \"bpmnContainer\" + $.jSequence.next();\n        var jsonContainerId = \"jsonContainer\" + $.jSequence.next();\n        var bizTypeHtml = \"\";\n        if (window.flowBizType) {\n            for (var field in window.flowBizType) {\n                bizTypeHtml += \"<option value='\" + field + \"'>\" + window.flowBizType[field] + \"</option>\";\n            }\n        }\n        var categoryHtml = \"\";\n        if (window.flowCategory) {\n            for (var field in window.flowCategory) {\n                categoryHtml += \"<option value='\" + field + \"'>\" + window.flowCategory[field] + \"</option>\";\n            }\n        }\n            return  '    <div class=\" container-fluid\">                                                                   ' +\n                '        <div class=\"row\"> ' +\n                '            <div class=\"form-group col\">                                                             ' +\n                '                <label>' + J.msg['flow.flowDefId'] + ':</label><input type=\"text\" name=\"defId\"                            ' +\n                '                    class=\"form-control\" readonly=\"readonly\"/>                                                          ' +\n                '            </div>                                                                                   ' +\n                '            <div class=\"form-group col\">                                                             ' +\n                '                <label>' + J.msg['flow.flowDefName'] + ':</label><input type=\"text\" name=\"defName\"                            ' +\n                '                    class=\"form-control\" readonly=\"readonly\"/>                                                          ' +\n                '            </div>                                                                                   ' +\n                '            <div class=\"form-group col\">                                                             ' +\n                '                <label>' + J.msg['flow.flowDefType'] + ':</label> <select class=\"form-control\" name=\"format\"' +\n                '                         class=\"form-control\"> ' +\n                '                         <option value=\"FLOW-bpmn\">' + J.msg['flow.flowDefType.flowBpmn'] + '</option>          ' +\n                '                         <option value=\"FLOW-easy\">' + J.msg['flow.flowDefType.flowJson'] + '</option>          ' +\n                '                         <option value=\"FSM-easy\">' + J.msg['flow.flowDefType.fsmJson'] + '</option>             ' +\n                '                         </select>              ' +\n                '            </div>                                                                                   ' +\n                '            <div class=\"form-group col\">                                                             ' +\n                '                <label>' + J.msg['flow.bizType'] + ':</label> <select class=\"form-control\" name=\"bizType\"' +\n                '                         class=\"form-control\"/>                ' + bizTypeHtml +\n                '                         </select>              ' +\n                '            </div>                                                                                   ' +\n                '            <div class=\"form-group col\">                                                             ' +\n                '                <label>' + J.msg['flow.category'] + ':</label> <select class=\"form-control\" name=\"category\"' +\n                '                         class=\"form-control\"/>                ' + categoryHtml +\n                '                         </select>              ' +\n                '            </div>                                                                                   ' +\n                '        </div>                                                                                        '+\n                '        <div>                                                                                        ' +\n                '            <ul class=\"nav nav-tabs\">                                                                ' +\n                '                <li class=\"nav-item\"><a class=\"nav-link nav-jsonContainer\" data-toggle=\"tab\"  data-target=\"#' + jsonContainerId + '\">' + J.msg['flow.flowDefinition'] + '</a></li>          ' +\n                '                <li class=\"nav-item\"><a class=\"nav-link nav-bpmnContainer\" data-toggle=\"tab\" data-target=\"#' + bpmnContainerId + '\">' + J.msg['flow.flowDiagram'] + '</a></li>                                        ' +\n                '            </ul>                                                                                    ' +\n                '            <div class=\"tab-content\">                                                                ' +\n                // bpmnContainer\n                '                <div id=\"' + bpmnContainerId + '\" class=\"bpmnContainer\">                                       ' +\n                '                </div>                                                                               ' +\n                // jsonContainer\n                '        <div id=\"' + jsonContainerId + '\" class=\"jsonContainer tab-pane\">                                                ' +\n                '            <div class=\"row jsonDataContainer\">                                                                         ' +\n                '            </div>                                                                                    ' +\n                '            <div class=\"row\">                                                                         ' +\n                '                <button type=\"button\" class=\"btn btn-primary j-json-def\">'+J.msg['flow.jsonDefinition'] + '</button>          ' +\n                '            </div>                                                                                    ' +\n                '        </div>                                                                                        ' +\n\n                '            </div>                                                                                   ' +\n                '</div>                                                                                                ' +\n                '';\n    }\n\n    J.FlowControl.prototype._jsonViewHtml = function () {\n        return '<div class=\"jsonDefContainer\">                                                                                 ' +\n            '    <div class=\"row\">                                                                                          ' +\n            '        <div class=\"form-group col\">                                                                           ' +\n            '            <label><span class=\"j-require\">*</span>'+J.msg['flow.flowJsonDefinition'] + ':</label>                                       ' +\n            '            <textarea class=\"jsonDef form-control\" rows=\"30\"></textarea>                                       ' +\n            '        </div>                                                                                                 ' +\n            '    </div>                                                                                                     ' +\n            '    <div class=\"row\">                                                                                          ' +\n            '        <div class=\"col text-center\">                                                                          ' +\n            (this.cfg.mode == 'view' ? '' : '            <button type=\"button\" class=\"btn btn-primary j-btn-json-render\">'+J.msg['flow.update'] + '</button>              ') +\n            (this.cfg.mode != 'edit' ? '' : '            <button type=\"button\" class=\"btn btn-secondary j-btn-json-compare\">'+J.msg['flow.oldNewCompare'] + '</button>              ') +\n            '            <button type=\"button\" class=\"btn btn-secondary j-btn-cancel\">'+J.msg['flow.cancel'] + '</button>                         ' +\n            '        </div>                                                                                                 ' +\n            '    </div>                                                                                                     ' +\n            '</div>                                                                                                         ' +\n            '';\n    }\n})(window.J);    "
  },
  {
    "path": "easyflow-flow-bpmn/static/plugins/fontawesome/css/all.css",
    "content": ".fa,\n.fas,\n.far,\n.fal,\n.fab {\n  -moz-osx-font-smoothing: grayscale;\n  -webkit-font-smoothing: antialiased;\n  display: inline-block;\n  font-style: normal;\n  font-variant: normal;\n  text-rendering: auto;\n  line-height: 1; }\n\n.fa-lg {\n  font-size: 1.33333em;\n  line-height: 0.75em;\n  vertical-align: -.0667em; }\n\n.fa-xs {\n  font-size: .75em; }\n\n.fa-sm {\n  font-size: .875em; }\n\n.fa-1x {\n  font-size: 1em; }\n\n.fa-2x {\n  font-size: 2em; }\n\n.fa-3x {\n  font-size: 3em; }\n\n.fa-4x {\n  font-size: 4em; }\n\n.fa-5x {\n  font-size: 5em; }\n\n.fa-6x {\n  font-size: 6em; }\n\n.fa-7x {\n  font-size: 7em; }\n\n.fa-8x {\n  font-size: 8em; }\n\n.fa-9x {\n  font-size: 9em; }\n\n.fa-10x {\n  font-size: 10em; }\n\n.fa-fw {\n  text-align: center;\n  width: 1.25em; }\n\n.fa-ul {\n  list-style-type: none;\n  margin-left: 2.5em;\n  padding-left: 0; }\n  .fa-ul > li {\n    position: relative; }\n\n.fa-li {\n  left: -2em;\n  position: absolute;\n  text-align: center;\n  width: 2em;\n  line-height: inherit; }\n\n.fa-border {\n  border: solid 0.08em #eee;\n  border-radius: .1em;\n  padding: .2em .25em .15em; }\n\n.fa-pull-left {\n  float: left; }\n\n.fa-pull-right {\n  float: right; }\n\n.fa.fa-pull-left,\n.fas.fa-pull-left,\n.far.fa-pull-left,\n.fal.fa-pull-left,\n.fab.fa-pull-left {\n  margin-right: .3em; }\n\n.fa.fa-pull-right,\n.fas.fa-pull-right,\n.far.fa-pull-right,\n.fal.fa-pull-right,\n.fab.fa-pull-right {\n  margin-left: .3em; }\n\n.fa-spin {\n  -webkit-animation: fa-spin 2s infinite linear;\n          animation: fa-spin 2s infinite linear; }\n\n.fa-pulse {\n  -webkit-animation: fa-spin 1s infinite steps(8);\n          animation: fa-spin 1s infinite steps(8); }\n\n@-webkit-keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg); }\n  100% {\n    -webkit-transform: rotate(360deg);\n            transform: rotate(360deg); } }\n\n@keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg); }\n  100% {\n    -webkit-transform: rotate(360deg);\n            transform: rotate(360deg); } }\n\n.fa-rotate-90 {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)\";\n  -webkit-transform: rotate(90deg);\n          transform: rotate(90deg); }\n\n.fa-rotate-180 {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)\";\n  -webkit-transform: rotate(180deg);\n          transform: rotate(180deg); }\n\n.fa-rotate-270 {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)\";\n  -webkit-transform: rotate(270deg);\n          transform: rotate(270deg); }\n\n.fa-flip-horizontal {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)\";\n  -webkit-transform: scale(-1, 1);\n          transform: scale(-1, 1); }\n\n.fa-flip-vertical {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\";\n  -webkit-transform: scale(1, -1);\n          transform: scale(1, -1); }\n\n.fa-flip-horizontal.fa-flip-vertical {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\";\n  -webkit-transform: scale(-1, -1);\n          transform: scale(-1, -1); }\n\n:root .fa-rotate-90,\n:root .fa-rotate-180,\n:root .fa-rotate-270,\n:root .fa-flip-horizontal,\n:root .fa-flip-vertical {\n  -webkit-filter: none;\n          filter: none; }\n\n.fa-stack {\n  display: inline-block;\n  height: 2em;\n  line-height: 2em;\n  position: relative;\n  vertical-align: middle;\n  width: 2.5em; }\n\n.fa-stack-1x,\n.fa-stack-2x {\n  left: 0;\n  position: absolute;\n  text-align: center;\n  width: 100%; }\n\n.fa-stack-1x {\n  line-height: inherit; }\n\n.fa-stack-2x {\n  font-size: 2em; }\n\n.fa-inverse {\n  color: #fff; }\n\n/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\nreaders do not read off random characters that represent icons */\n.fa-500px:before {\n  content: \"\\f26e\"; }\n\n.fa-accessible-icon:before {\n  content: \"\\f368\"; }\n\n.fa-accusoft:before {\n  content: \"\\f369\"; }\n\n.fa-acquisitions-incorporated:before {\n  content: \"\\f6af\"; }\n\n.fa-ad:before {\n  content: \"\\f641\"; }\n\n.fa-address-book:before {\n  content: \"\\f2b9\"; }\n\n.fa-address-card:before {\n  content: \"\\f2bb\"; }\n\n.fa-adjust:before {\n  content: \"\\f042\"; }\n\n.fa-adn:before {\n  content: \"\\f170\"; }\n\n.fa-adobe:before {\n  content: \"\\f778\"; }\n\n.fa-adversal:before {\n  content: \"\\f36a\"; }\n\n.fa-affiliatetheme:before {\n  content: \"\\f36b\"; }\n\n.fa-air-freshener:before {\n  content: \"\\f5d0\"; }\n\n.fa-algolia:before {\n  content: \"\\f36c\"; }\n\n.fa-align-center:before {\n  content: \"\\f037\"; }\n\n.fa-align-justify:before {\n  content: \"\\f039\"; }\n\n.fa-align-left:before {\n  content: \"\\f036\"; }\n\n.fa-align-right:before {\n  content: \"\\f038\"; }\n\n.fa-alipay:before {\n  content: \"\\f642\"; }\n\n.fa-allergies:before {\n  content: \"\\f461\"; }\n\n.fa-amazon:before {\n  content: \"\\f270\"; }\n\n.fa-amazon-pay:before {\n  content: \"\\f42c\"; }\n\n.fa-ambulance:before {\n  content: \"\\f0f9\"; }\n\n.fa-american-sign-language-interpreting:before {\n  content: \"\\f2a3\"; }\n\n.fa-amilia:before {\n  content: \"\\f36d\"; }\n\n.fa-anchor:before {\n  content: \"\\f13d\"; }\n\n.fa-android:before {\n  content: \"\\f17b\"; }\n\n.fa-angellist:before {\n  content: \"\\f209\"; }\n\n.fa-angle-double-down:before {\n  content: \"\\f103\"; }\n\n.fa-angle-double-left:before {\n  content: \"\\f100\"; }\n\n.fa-angle-double-right:before {\n  content: \"\\f101\"; }\n\n.fa-angle-double-up:before {\n  content: \"\\f102\"; }\n\n.fa-angle-down:before {\n  content: \"\\f107\"; }\n\n.fa-angle-left:before {\n  content: \"\\f104\"; }\n\n.fa-angle-right:before {\n  content: \"\\f105\"; }\n\n.fa-angle-up:before {\n  content: \"\\f106\"; }\n\n.fa-angry:before {\n  content: \"\\f556\"; }\n\n.fa-angrycreative:before {\n  content: \"\\f36e\"; }\n\n.fa-angular:before {\n  content: \"\\f420\"; }\n\n.fa-ankh:before {\n  content: \"\\f644\"; }\n\n.fa-app-store:before {\n  content: \"\\f36f\"; }\n\n.fa-app-store-ios:before {\n  content: \"\\f370\"; }\n\n.fa-apper:before {\n  content: \"\\f371\"; }\n\n.fa-apple:before {\n  content: \"\\f179\"; }\n\n.fa-apple-alt:before {\n  content: \"\\f5d1\"; }\n\n.fa-apple-pay:before {\n  content: \"\\f415\"; }\n\n.fa-archive:before {\n  content: \"\\f187\"; }\n\n.fa-archway:before {\n  content: \"\\f557\"; }\n\n.fa-arrow-alt-circle-down:before {\n  content: \"\\f358\"; }\n\n.fa-arrow-alt-circle-left:before {\n  content: \"\\f359\"; }\n\n.fa-arrow-alt-circle-right:before {\n  content: \"\\f35a\"; }\n\n.fa-arrow-alt-circle-up:before {\n  content: \"\\f35b\"; }\n\n.fa-arrow-circle-down:before {\n  content: \"\\f0ab\"; }\n\n.fa-arrow-circle-left:before {\n  content: \"\\f0a8\"; }\n\n.fa-arrow-circle-right:before {\n  content: \"\\f0a9\"; }\n\n.fa-arrow-circle-up:before {\n  content: \"\\f0aa\"; }\n\n.fa-arrow-down:before {\n  content: \"\\f063\"; }\n\n.fa-arrow-left:before {\n  content: \"\\f060\"; }\n\n.fa-arrow-right:before {\n  content: \"\\f061\"; }\n\n.fa-arrow-up:before {\n  content: \"\\f062\"; }\n\n.fa-arrows-alt:before {\n  content: \"\\f0b2\"; }\n\n.fa-arrows-alt-h:before {\n  content: \"\\f337\"; }\n\n.fa-arrows-alt-v:before {\n  content: \"\\f338\"; }\n\n.fa-artstation:before {\n  content: \"\\f77a\"; }\n\n.fa-assistive-listening-systems:before {\n  content: \"\\f2a2\"; }\n\n.fa-asterisk:before {\n  content: \"\\f069\"; }\n\n.fa-asymmetrik:before {\n  content: \"\\f372\"; }\n\n.fa-at:before {\n  content: \"\\f1fa\"; }\n\n.fa-atlas:before {\n  content: \"\\f558\"; }\n\n.fa-atlassian:before {\n  content: \"\\f77b\"; }\n\n.fa-atom:before {\n  content: \"\\f5d2\"; }\n\n.fa-audible:before {\n  content: \"\\f373\"; }\n\n.fa-audio-description:before {\n  content: \"\\f29e\"; }\n\n.fa-autoprefixer:before {\n  content: \"\\f41c\"; }\n\n.fa-avianex:before {\n  content: \"\\f374\"; }\n\n.fa-aviato:before {\n  content: \"\\f421\"; }\n\n.fa-award:before {\n  content: \"\\f559\"; }\n\n.fa-aws:before {\n  content: \"\\f375\"; }\n\n.fa-baby:before {\n  content: \"\\f77c\"; }\n\n.fa-baby-carriage:before {\n  content: \"\\f77d\"; }\n\n.fa-backspace:before {\n  content: \"\\f55a\"; }\n\n.fa-backward:before {\n  content: \"\\f04a\"; }\n\n.fa-balance-scale:before {\n  content: \"\\f24e\"; }\n\n.fa-ban:before {\n  content: \"\\f05e\"; }\n\n.fa-band-aid:before {\n  content: \"\\f462\"; }\n\n.fa-bandcamp:before {\n  content: \"\\f2d5\"; }\n\n.fa-barcode:before {\n  content: \"\\f02a\"; }\n\n.fa-bars:before {\n  content: \"\\f0c9\"; }\n\n.fa-baseball-ball:before {\n  content: \"\\f433\"; }\n\n.fa-basketball-ball:before {\n  content: \"\\f434\"; }\n\n.fa-bath:before {\n  content: \"\\f2cd\"; }\n\n.fa-battery-empty:before {\n  content: \"\\f244\"; }\n\n.fa-battery-full:before {\n  content: \"\\f240\"; }\n\n.fa-battery-half:before {\n  content: \"\\f242\"; }\n\n.fa-battery-quarter:before {\n  content: \"\\f243\"; }\n\n.fa-battery-three-quarters:before {\n  content: \"\\f241\"; }\n\n.fa-bed:before {\n  content: \"\\f236\"; }\n\n.fa-beer:before {\n  content: \"\\f0fc\"; }\n\n.fa-behance:before {\n  content: \"\\f1b4\"; }\n\n.fa-behance-square:before {\n  content: \"\\f1b5\"; }\n\n.fa-bell:before {\n  content: \"\\f0f3\"; }\n\n.fa-bell-slash:before {\n  content: \"\\f1f6\"; }\n\n.fa-bezier-curve:before {\n  content: \"\\f55b\"; }\n\n.fa-bible:before {\n  content: \"\\f647\"; }\n\n.fa-bicycle:before {\n  content: \"\\f206\"; }\n\n.fa-bimobject:before {\n  content: \"\\f378\"; }\n\n.fa-binoculars:before {\n  content: \"\\f1e5\"; }\n\n.fa-biohazard:before {\n  content: \"\\f780\"; }\n\n.fa-birthday-cake:before {\n  content: \"\\f1fd\"; }\n\n.fa-bitbucket:before {\n  content: \"\\f171\"; }\n\n.fa-bitcoin:before {\n  content: \"\\f379\"; }\n\n.fa-bity:before {\n  content: \"\\f37a\"; }\n\n.fa-black-tie:before {\n  content: \"\\f27e\"; }\n\n.fa-blackberry:before {\n  content: \"\\f37b\"; }\n\n.fa-blender:before {\n  content: \"\\f517\"; }\n\n.fa-blender-phone:before {\n  content: \"\\f6b6\"; }\n\n.fa-blind:before {\n  content: \"\\f29d\"; }\n\n.fa-blog:before {\n  content: \"\\f781\"; }\n\n.fa-blogger:before {\n  content: \"\\f37c\"; }\n\n.fa-blogger-b:before {\n  content: \"\\f37d\"; }\n\n.fa-bluetooth:before {\n  content: \"\\f293\"; }\n\n.fa-bluetooth-b:before {\n  content: \"\\f294\"; }\n\n.fa-bold:before {\n  content: \"\\f032\"; }\n\n.fa-bolt:before {\n  content: \"\\f0e7\"; }\n\n.fa-bomb:before {\n  content: \"\\f1e2\"; }\n\n.fa-bone:before {\n  content: \"\\f5d7\"; }\n\n.fa-bong:before {\n  content: \"\\f55c\"; }\n\n.fa-book:before {\n  content: \"\\f02d\"; }\n\n.fa-book-dead:before {\n  content: \"\\f6b7\"; }\n\n.fa-book-open:before {\n  content: \"\\f518\"; }\n\n.fa-book-reader:before {\n  content: \"\\f5da\"; }\n\n.fa-bookmark:before {\n  content: \"\\f02e\"; }\n\n.fa-bowling-ball:before {\n  content: \"\\f436\"; }\n\n.fa-box:before {\n  content: \"\\f466\"; }\n\n.fa-box-open:before {\n  content: \"\\f49e\"; }\n\n.fa-boxes:before {\n  content: \"\\f468\"; }\n\n.fa-braille:before {\n  content: \"\\f2a1\"; }\n\n.fa-brain:before {\n  content: \"\\f5dc\"; }\n\n.fa-briefcase:before {\n  content: \"\\f0b1\"; }\n\n.fa-briefcase-medical:before {\n  content: \"\\f469\"; }\n\n.fa-broadcast-tower:before {\n  content: \"\\f519\"; }\n\n.fa-broom:before {\n  content: \"\\f51a\"; }\n\n.fa-brush:before {\n  content: \"\\f55d\"; }\n\n.fa-btc:before {\n  content: \"\\f15a\"; }\n\n.fa-bug:before {\n  content: \"\\f188\"; }\n\n.fa-building:before {\n  content: \"\\f1ad\"; }\n\n.fa-bullhorn:before {\n  content: \"\\f0a1\"; }\n\n.fa-bullseye:before {\n  content: \"\\f140\"; }\n\n.fa-burn:before {\n  content: \"\\f46a\"; }\n\n.fa-buromobelexperte:before {\n  content: \"\\f37f\"; }\n\n.fa-bus:before {\n  content: \"\\f207\"; }\n\n.fa-bus-alt:before {\n  content: \"\\f55e\"; }\n\n.fa-business-time:before {\n  content: \"\\f64a\"; }\n\n.fa-buysellads:before {\n  content: \"\\f20d\"; }\n\n.fa-calculator:before {\n  content: \"\\f1ec\"; }\n\n.fa-calendar:before {\n  content: \"\\f133\"; }\n\n.fa-calendar-alt:before {\n  content: \"\\f073\"; }\n\n.fa-calendar-check:before {\n  content: \"\\f274\"; }\n\n.fa-calendar-day:before {\n  content: \"\\f783\"; }\n\n.fa-calendar-minus:before {\n  content: \"\\f272\"; }\n\n.fa-calendar-plus:before {\n  content: \"\\f271\"; }\n\n.fa-calendar-times:before {\n  content: \"\\f273\"; }\n\n.fa-calendar-week:before {\n  content: \"\\f784\"; }\n\n.fa-camera:before {\n  content: \"\\f030\"; }\n\n.fa-camera-retro:before {\n  content: \"\\f083\"; }\n\n.fa-campground:before {\n  content: \"\\f6bb\"; }\n\n.fa-canadian-maple-leaf:before {\n  content: \"\\f785\"; }\n\n.fa-candy-cane:before {\n  content: \"\\f786\"; }\n\n.fa-cannabis:before {\n  content: \"\\f55f\"; }\n\n.fa-capsules:before {\n  content: \"\\f46b\"; }\n\n.fa-car:before {\n  content: \"\\f1b9\"; }\n\n.fa-car-alt:before {\n  content: \"\\f5de\"; }\n\n.fa-car-battery:before {\n  content: \"\\f5df\"; }\n\n.fa-car-crash:before {\n  content: \"\\f5e1\"; }\n\n.fa-car-side:before {\n  content: \"\\f5e4\"; }\n\n.fa-caret-down:before {\n  content: \"\\f0d7\"; }\n\n.fa-caret-left:before {\n  content: \"\\f0d9\"; }\n\n.fa-caret-right:before {\n  content: \"\\f0da\"; }\n\n.fa-caret-square-down:before {\n  content: \"\\f150\"; }\n\n.fa-caret-square-left:before {\n  content: \"\\f191\"; }\n\n.fa-caret-square-right:before {\n  content: \"\\f152\"; }\n\n.fa-caret-square-up:before {\n  content: \"\\f151\"; }\n\n.fa-caret-up:before {\n  content: \"\\f0d8\"; }\n\n.fa-carrot:before {\n  content: \"\\f787\"; }\n\n.fa-cart-arrow-down:before {\n  content: \"\\f218\"; }\n\n.fa-cart-plus:before {\n  content: \"\\f217\"; }\n\n.fa-cash-register:before {\n  content: \"\\f788\"; }\n\n.fa-cat:before {\n  content: \"\\f6be\"; }\n\n.fa-cc-amazon-pay:before {\n  content: \"\\f42d\"; }\n\n.fa-cc-amex:before {\n  content: \"\\f1f3\"; }\n\n.fa-cc-apple-pay:before {\n  content: \"\\f416\"; }\n\n.fa-cc-diners-club:before {\n  content: \"\\f24c\"; }\n\n.fa-cc-discover:before {\n  content: \"\\f1f2\"; }\n\n.fa-cc-jcb:before {\n  content: \"\\f24b\"; }\n\n.fa-cc-mastercard:before {\n  content: \"\\f1f1\"; }\n\n.fa-cc-paypal:before {\n  content: \"\\f1f4\"; }\n\n.fa-cc-stripe:before {\n  content: \"\\f1f5\"; }\n\n.fa-cc-visa:before {\n  content: \"\\f1f0\"; }\n\n.fa-centercode:before {\n  content: \"\\f380\"; }\n\n.fa-centos:before {\n  content: \"\\f789\"; }\n\n.fa-certificate:before {\n  content: \"\\f0a3\"; }\n\n.fa-chair:before {\n  content: \"\\f6c0\"; }\n\n.fa-chalkboard:before {\n  content: \"\\f51b\"; }\n\n.fa-chalkboard-teacher:before {\n  content: \"\\f51c\"; }\n\n.fa-charging-station:before {\n  content: \"\\f5e7\"; }\n\n.fa-chart-area:before {\n  content: \"\\f1fe\"; }\n\n.fa-chart-bar:before {\n  content: \"\\f080\"; }\n\n.fa-chart-line:before {\n  content: \"\\f201\"; }\n\n.fa-chart-pie:before {\n  content: \"\\f200\"; }\n\n.fa-check:before {\n  content: \"\\f00c\"; }\n\n.fa-check-circle:before {\n  content: \"\\f058\"; }\n\n.fa-check-double:before {\n  content: \"\\f560\"; }\n\n.fa-check-square:before {\n  content: \"\\f14a\"; }\n\n.fa-chess:before {\n  content: \"\\f439\"; }\n\n.fa-chess-bishop:before {\n  content: \"\\f43a\"; }\n\n.fa-chess-board:before {\n  content: \"\\f43c\"; }\n\n.fa-chess-king:before {\n  content: \"\\f43f\"; }\n\n.fa-chess-knight:before {\n  content: \"\\f441\"; }\n\n.fa-chess-pawn:before {\n  content: \"\\f443\"; }\n\n.fa-chess-queen:before {\n  content: \"\\f445\"; }\n\n.fa-chess-rook:before {\n  content: \"\\f447\"; }\n\n.fa-chevron-circle-down:before {\n  content: \"\\f13a\"; }\n\n.fa-chevron-circle-left:before {\n  content: \"\\f137\"; }\n\n.fa-chevron-circle-right:before {\n  content: \"\\f138\"; }\n\n.fa-chevron-circle-up:before {\n  content: \"\\f139\"; }\n\n.fa-chevron-down:before {\n  content: \"\\f078\"; }\n\n.fa-chevron-left:before {\n  content: \"\\f053\"; }\n\n.fa-chevron-right:before {\n  content: \"\\f054\"; }\n\n.fa-chevron-up:before {\n  content: \"\\f077\"; }\n\n.fa-child:before {\n  content: \"\\f1ae\"; }\n\n.fa-chrome:before {\n  content: \"\\f268\"; }\n\n.fa-church:before {\n  content: \"\\f51d\"; }\n\n.fa-circle:before {\n  content: \"\\f111\"; }\n\n.fa-circle-notch:before {\n  content: \"\\f1ce\"; }\n\n.fa-city:before {\n  content: \"\\f64f\"; }\n\n.fa-clipboard:before {\n  content: \"\\f328\"; }\n\n.fa-clipboard-check:before {\n  content: \"\\f46c\"; }\n\n.fa-clipboard-list:before {\n  content: \"\\f46d\"; }\n\n.fa-clock:before {\n  content: \"\\f017\"; }\n\n.fa-clone:before {\n  content: \"\\f24d\"; }\n\n.fa-closed-captioning:before {\n  content: \"\\f20a\"; }\n\n.fa-cloud:before {\n  content: \"\\f0c2\"; }\n\n.fa-cloud-download-alt:before {\n  content: \"\\f381\"; }\n\n.fa-cloud-meatball:before {\n  content: \"\\f73b\"; }\n\n.fa-cloud-moon:before {\n  content: \"\\f6c3\"; }\n\n.fa-cloud-moon-rain:before {\n  content: \"\\f73c\"; }\n\n.fa-cloud-rain:before {\n  content: \"\\f73d\"; }\n\n.fa-cloud-showers-heavy:before {\n  content: \"\\f740\"; }\n\n.fa-cloud-sun:before {\n  content: \"\\f6c4\"; }\n\n.fa-cloud-sun-rain:before {\n  content: \"\\f743\"; }\n\n.fa-cloud-upload-alt:before {\n  content: \"\\f382\"; }\n\n.fa-cloudscale:before {\n  content: \"\\f383\"; }\n\n.fa-cloudsmith:before {\n  content: \"\\f384\"; }\n\n.fa-cloudversify:before {\n  content: \"\\f385\"; }\n\n.fa-cocktail:before {\n  content: \"\\f561\"; }\n\n.fa-code:before {\n  content: \"\\f121\"; }\n\n.fa-code-branch:before {\n  content: \"\\f126\"; }\n\n.fa-codepen:before {\n  content: \"\\f1cb\"; }\n\n.fa-codiepie:before {\n  content: \"\\f284\"; }\n\n.fa-coffee:before {\n  content: \"\\f0f4\"; }\n\n.fa-cog:before {\n  content: \"\\f013\"; }\n\n.fa-cogs:before {\n  content: \"\\f085\"; }\n\n.fa-coins:before {\n  content: \"\\f51e\"; }\n\n.fa-columns:before {\n  content: \"\\f0db\"; }\n\n.fa-comment:before {\n  content: \"\\f075\"; }\n\n.fa-comment-alt:before {\n  content: \"\\f27a\"; }\n\n.fa-comment-dollar:before {\n  content: \"\\f651\"; }\n\n.fa-comment-dots:before {\n  content: \"\\f4ad\"; }\n\n.fa-comment-slash:before {\n  content: \"\\f4b3\"; }\n\n.fa-comments:before {\n  content: \"\\f086\"; }\n\n.fa-comments-dollar:before {\n  content: \"\\f653\"; }\n\n.fa-compact-disc:before {\n  content: \"\\f51f\"; }\n\n.fa-compass:before {\n  content: \"\\f14e\"; }\n\n.fa-compress:before {\n  content: \"\\f066\"; }\n\n.fa-compress-arrows-alt:before {\n  content: \"\\f78c\"; }\n\n.fa-concierge-bell:before {\n  content: \"\\f562\"; }\n\n.fa-confluence:before {\n  content: \"\\f78d\"; }\n\n.fa-connectdevelop:before {\n  content: \"\\f20e\"; }\n\n.fa-contao:before {\n  content: \"\\f26d\"; }\n\n.fa-cookie:before {\n  content: \"\\f563\"; }\n\n.fa-cookie-bite:before {\n  content: \"\\f564\"; }\n\n.fa-copy:before {\n  content: \"\\f0c5\"; }\n\n.fa-copyright:before {\n  content: \"\\f1f9\"; }\n\n.fa-couch:before {\n  content: \"\\f4b8\"; }\n\n.fa-cpanel:before {\n  content: \"\\f388\"; }\n\n.fa-creative-commons:before {\n  content: \"\\f25e\"; }\n\n.fa-creative-commons-by:before {\n  content: \"\\f4e7\"; }\n\n.fa-creative-commons-nc:before {\n  content: \"\\f4e8\"; }\n\n.fa-creative-commons-nc-eu:before {\n  content: \"\\f4e9\"; }\n\n.fa-creative-commons-nc-jp:before {\n  content: \"\\f4ea\"; }\n\n.fa-creative-commons-nd:before {\n  content: \"\\f4eb\"; }\n\n.fa-creative-commons-pd:before {\n  content: \"\\f4ec\"; }\n\n.fa-creative-commons-pd-alt:before {\n  content: \"\\f4ed\"; }\n\n.fa-creative-commons-remix:before {\n  content: \"\\f4ee\"; }\n\n.fa-creative-commons-sa:before {\n  content: \"\\f4ef\"; }\n\n.fa-creative-commons-sampling:before {\n  content: \"\\f4f0\"; }\n\n.fa-creative-commons-sampling-plus:before {\n  content: \"\\f4f1\"; }\n\n.fa-creative-commons-share:before {\n  content: \"\\f4f2\"; }\n\n.fa-creative-commons-zero:before {\n  content: \"\\f4f3\"; }\n\n.fa-credit-card:before {\n  content: \"\\f09d\"; }\n\n.fa-critical-role:before {\n  content: \"\\f6c9\"; }\n\n.fa-crop:before {\n  content: \"\\f125\"; }\n\n.fa-crop-alt:before {\n  content: \"\\f565\"; }\n\n.fa-cross:before {\n  content: \"\\f654\"; }\n\n.fa-crosshairs:before {\n  content: \"\\f05b\"; }\n\n.fa-crow:before {\n  content: \"\\f520\"; }\n\n.fa-crown:before {\n  content: \"\\f521\"; }\n\n.fa-css3:before {\n  content: \"\\f13c\"; }\n\n.fa-css3-alt:before {\n  content: \"\\f38b\"; }\n\n.fa-cube:before {\n  content: \"\\f1b2\"; }\n\n.fa-cubes:before {\n  content: \"\\f1b3\"; }\n\n.fa-cut:before {\n  content: \"\\f0c4\"; }\n\n.fa-cuttlefish:before {\n  content: \"\\f38c\"; }\n\n.fa-d-and-d:before {\n  content: \"\\f38d\"; }\n\n.fa-d-and-d-beyond:before {\n  content: \"\\f6ca\"; }\n\n.fa-dashcube:before {\n  content: \"\\f210\"; }\n\n.fa-database:before {\n  content: \"\\f1c0\"; }\n\n.fa-deaf:before {\n  content: \"\\f2a4\"; }\n\n.fa-delicious:before {\n  content: \"\\f1a5\"; }\n\n.fa-democrat:before {\n  content: \"\\f747\"; }\n\n.fa-deploydog:before {\n  content: \"\\f38e\"; }\n\n.fa-deskpro:before {\n  content: \"\\f38f\"; }\n\n.fa-desktop:before {\n  content: \"\\f108\"; }\n\n.fa-dev:before {\n  content: \"\\f6cc\"; }\n\n.fa-deviantart:before {\n  content: \"\\f1bd\"; }\n\n.fa-dharmachakra:before {\n  content: \"\\f655\"; }\n\n.fa-dhl:before {\n  content: \"\\f790\"; }\n\n.fa-diagnoses:before {\n  content: \"\\f470\"; }\n\n.fa-diaspora:before {\n  content: \"\\f791\"; }\n\n.fa-dice:before {\n  content: \"\\f522\"; }\n\n.fa-dice-d20:before {\n  content: \"\\f6cf\"; }\n\n.fa-dice-d6:before {\n  content: \"\\f6d1\"; }\n\n.fa-dice-five:before {\n  content: \"\\f523\"; }\n\n.fa-dice-four:before {\n  content: \"\\f524\"; }\n\n.fa-dice-one:before {\n  content: \"\\f525\"; }\n\n.fa-dice-six:before {\n  content: \"\\f526\"; }\n\n.fa-dice-three:before {\n  content: \"\\f527\"; }\n\n.fa-dice-two:before {\n  content: \"\\f528\"; }\n\n.fa-digg:before {\n  content: \"\\f1a6\"; }\n\n.fa-digital-ocean:before {\n  content: \"\\f391\"; }\n\n.fa-digital-tachograph:before {\n  content: \"\\f566\"; }\n\n.fa-directions:before {\n  content: \"\\f5eb\"; }\n\n.fa-discord:before {\n  content: \"\\f392\"; }\n\n.fa-discourse:before {\n  content: \"\\f393\"; }\n\n.fa-divide:before {\n  content: \"\\f529\"; }\n\n.fa-dizzy:before {\n  content: \"\\f567\"; }\n\n.fa-dna:before {\n  content: \"\\f471\"; }\n\n.fa-dochub:before {\n  content: \"\\f394\"; }\n\n.fa-docker:before {\n  content: \"\\f395\"; }\n\n.fa-dog:before {\n  content: \"\\f6d3\"; }\n\n.fa-dollar-sign:before {\n  content: \"\\f155\"; }\n\n.fa-dolly:before {\n  content: \"\\f472\"; }\n\n.fa-dolly-flatbed:before {\n  content: \"\\f474\"; }\n\n.fa-donate:before {\n  content: \"\\f4b9\"; }\n\n.fa-door-closed:before {\n  content: \"\\f52a\"; }\n\n.fa-door-open:before {\n  content: \"\\f52b\"; }\n\n.fa-dot-circle:before {\n  content: \"\\f192\"; }\n\n.fa-dove:before {\n  content: \"\\f4ba\"; }\n\n.fa-download:before {\n  content: \"\\f019\"; }\n\n.fa-draft2digital:before {\n  content: \"\\f396\"; }\n\n.fa-drafting-compass:before {\n  content: \"\\f568\"; }\n\n.fa-dragon:before {\n  content: \"\\f6d5\"; }\n\n.fa-draw-polygon:before {\n  content: \"\\f5ee\"; }\n\n.fa-dribbble:before {\n  content: \"\\f17d\"; }\n\n.fa-dribbble-square:before {\n  content: \"\\f397\"; }\n\n.fa-dropbox:before {\n  content: \"\\f16b\"; }\n\n.fa-drum:before {\n  content: \"\\f569\"; }\n\n.fa-drum-steelpan:before {\n  content: \"\\f56a\"; }\n\n.fa-drumstick-bite:before {\n  content: \"\\f6d7\"; }\n\n.fa-drupal:before {\n  content: \"\\f1a9\"; }\n\n.fa-dumbbell:before {\n  content: \"\\f44b\"; }\n\n.fa-dumpster:before {\n  content: \"\\f793\"; }\n\n.fa-dumpster-fire:before {\n  content: \"\\f794\"; }\n\n.fa-dungeon:before {\n  content: \"\\f6d9\"; }\n\n.fa-dyalog:before {\n  content: \"\\f399\"; }\n\n.fa-earlybirds:before {\n  content: \"\\f39a\"; }\n\n.fa-ebay:before {\n  content: \"\\f4f4\"; }\n\n.fa-edge:before {\n  content: \"\\f282\"; }\n\n.fa-edit:before {\n  content: \"\\f044\"; }\n\n.fa-eject:before {\n  content: \"\\f052\"; }\n\n.fa-elementor:before {\n  content: \"\\f430\"; }\n\n.fa-ellipsis-h:before {\n  content: \"\\f141\"; }\n\n.fa-ellipsis-v:before {\n  content: \"\\f142\"; }\n\n.fa-ello:before {\n  content: \"\\f5f1\"; }\n\n.fa-ember:before {\n  content: \"\\f423\"; }\n\n.fa-empire:before {\n  content: \"\\f1d1\"; }\n\n.fa-envelope:before {\n  content: \"\\f0e0\"; }\n\n.fa-envelope-open:before {\n  content: \"\\f2b6\"; }\n\n.fa-envelope-open-text:before {\n  content: \"\\f658\"; }\n\n.fa-envelope-square:before {\n  content: \"\\f199\"; }\n\n.fa-envira:before {\n  content: \"\\f299\"; }\n\n.fa-equals:before {\n  content: \"\\f52c\"; }\n\n.fa-eraser:before {\n  content: \"\\f12d\"; }\n\n.fa-erlang:before {\n  content: \"\\f39d\"; }\n\n.fa-ethereum:before {\n  content: \"\\f42e\"; }\n\n.fa-ethernet:before {\n  content: \"\\f796\"; }\n\n.fa-etsy:before {\n  content: \"\\f2d7\"; }\n\n.fa-euro-sign:before {\n  content: \"\\f153\"; }\n\n.fa-exchange-alt:before {\n  content: \"\\f362\"; }\n\n.fa-exclamation:before {\n  content: \"\\f12a\"; }\n\n.fa-exclamation-circle:before {\n  content: \"\\f06a\"; }\n\n.fa-exclamation-triangle:before {\n  content: \"\\f071\"; }\n\n.fa-expand:before {\n  content: \"\\f065\"; }\n\n.fa-expand-arrows-alt:before {\n  content: \"\\f31e\"; }\n\n.fa-expeditedssl:before {\n  content: \"\\f23e\"; }\n\n.fa-external-link-alt:before {\n  content: \"\\f35d\"; }\n\n.fa-external-link-square-alt:before {\n  content: \"\\f360\"; }\n\n.fa-eye:before {\n  content: \"\\f06e\"; }\n\n.fa-eye-dropper:before {\n  content: \"\\f1fb\"; }\n\n.fa-eye-slash:before {\n  content: \"\\f070\"; }\n\n.fa-facebook:before {\n  content: \"\\f09a\"; }\n\n.fa-facebook-f:before {\n  content: \"\\f39e\"; }\n\n.fa-facebook-messenger:before {\n  content: \"\\f39f\"; }\n\n.fa-facebook-square:before {\n  content: \"\\f082\"; }\n\n.fa-fantasy-flight-games:before {\n  content: \"\\f6dc\"; }\n\n.fa-fast-backward:before {\n  content: \"\\f049\"; }\n\n.fa-fast-forward:before {\n  content: \"\\f050\"; }\n\n.fa-fax:before {\n  content: \"\\f1ac\"; }\n\n.fa-feather:before {\n  content: \"\\f52d\"; }\n\n.fa-feather-alt:before {\n  content: \"\\f56b\"; }\n\n.fa-fedex:before {\n  content: \"\\f797\"; }\n\n.fa-fedora:before {\n  content: \"\\f798\"; }\n\n.fa-female:before {\n  content: \"\\f182\"; }\n\n.fa-fighter-jet:before {\n  content: \"\\f0fb\"; }\n\n.fa-figma:before {\n  content: \"\\f799\"; }\n\n.fa-file:before {\n  content: \"\\f15b\"; }\n\n.fa-file-alt:before {\n  content: \"\\f15c\"; }\n\n.fa-file-archive:before {\n  content: \"\\f1c6\"; }\n\n.fa-file-audio:before {\n  content: \"\\f1c7\"; }\n\n.fa-file-code:before {\n  content: \"\\f1c9\"; }\n\n.fa-file-contract:before {\n  content: \"\\f56c\"; }\n\n.fa-file-csv:before {\n  content: \"\\f6dd\"; }\n\n.fa-file-download:before {\n  content: \"\\f56d\"; }\n\n.fa-file-excel:before {\n  content: \"\\f1c3\"; }\n\n.fa-file-export:before {\n  content: \"\\f56e\"; }\n\n.fa-file-image:before {\n  content: \"\\f1c5\"; }\n\n.fa-file-import:before {\n  content: \"\\f56f\"; }\n\n.fa-file-invoice:before {\n  content: \"\\f570\"; }\n\n.fa-file-invoice-dollar:before {\n  content: \"\\f571\"; }\n\n.fa-file-medical:before {\n  content: \"\\f477\"; }\n\n.fa-file-medical-alt:before {\n  content: \"\\f478\"; }\n\n.fa-file-pdf:before {\n  content: \"\\f1c1\"; }\n\n.fa-file-powerpoint:before {\n  content: \"\\f1c4\"; }\n\n.fa-file-prescription:before {\n  content: \"\\f572\"; }\n\n.fa-file-signature:before {\n  content: \"\\f573\"; }\n\n.fa-file-upload:before {\n  content: \"\\f574\"; }\n\n.fa-file-video:before {\n  content: \"\\f1c8\"; }\n\n.fa-file-word:before {\n  content: \"\\f1c2\"; }\n\n.fa-fill:before {\n  content: \"\\f575\"; }\n\n.fa-fill-drip:before {\n  content: \"\\f576\"; }\n\n.fa-film:before {\n  content: \"\\f008\"; }\n\n.fa-filter:before {\n  content: \"\\f0b0\"; }\n\n.fa-fingerprint:before {\n  content: \"\\f577\"; }\n\n.fa-fire:before {\n  content: \"\\f06d\"; }\n\n.fa-fire-alt:before {\n  content: \"\\f7e4\"; }\n\n.fa-fire-extinguisher:before {\n  content: \"\\f134\"; }\n\n.fa-firefox:before {\n  content: \"\\f269\"; }\n\n.fa-first-aid:before {\n  content: \"\\f479\"; }\n\n.fa-first-order:before {\n  content: \"\\f2b0\"; }\n\n.fa-first-order-alt:before {\n  content: \"\\f50a\"; }\n\n.fa-firstdraft:before {\n  content: \"\\f3a1\"; }\n\n.fa-fish:before {\n  content: \"\\f578\"; }\n\n.fa-fist-raised:before {\n  content: \"\\f6de\"; }\n\n.fa-flag:before {\n  content: \"\\f024\"; }\n\n.fa-flag-checkered:before {\n  content: \"\\f11e\"; }\n\n.fa-flag-usa:before {\n  content: \"\\f74d\"; }\n\n.fa-flask:before {\n  content: \"\\f0c3\"; }\n\n.fa-flickr:before {\n  content: \"\\f16e\"; }\n\n.fa-flipboard:before {\n  content: \"\\f44d\"; }\n\n.fa-flushed:before {\n  content: \"\\f579\"; }\n\n.fa-fly:before {\n  content: \"\\f417\"; }\n\n.fa-folder:before {\n  content: \"\\f07b\"; }\n\n.fa-folder-minus:before {\n  content: \"\\f65d\"; }\n\n.fa-folder-open:before {\n  content: \"\\f07c\"; }\n\n.fa-folder-plus:before {\n  content: \"\\f65e\"; }\n\n.fa-font:before {\n  content: \"\\f031\"; }\n\n.fa-font-awesome:before {\n  content: \"\\f2b4\"; }\n\n.fa-font-awesome-alt:before {\n  content: \"\\f35c\"; }\n\n.fa-font-awesome-flag:before {\n  content: \"\\f425\"; }\n\n.fa-font-awesome-logo-full:before {\n  content: \"\\f4e6\"; }\n\n.fa-fonticons:before {\n  content: \"\\f280\"; }\n\n.fa-fonticons-fi:before {\n  content: \"\\f3a2\"; }\n\n.fa-football-ball:before {\n  content: \"\\f44e\"; }\n\n.fa-fort-awesome:before {\n  content: \"\\f286\"; }\n\n.fa-fort-awesome-alt:before {\n  content: \"\\f3a3\"; }\n\n.fa-forumbee:before {\n  content: \"\\f211\"; }\n\n.fa-forward:before {\n  content: \"\\f04e\"; }\n\n.fa-foursquare:before {\n  content: \"\\f180\"; }\n\n.fa-free-code-camp:before {\n  content: \"\\f2c5\"; }\n\n.fa-freebsd:before {\n  content: \"\\f3a4\"; }\n\n.fa-frog:before {\n  content: \"\\f52e\"; }\n\n.fa-frown:before {\n  content: \"\\f119\"; }\n\n.fa-frown-open:before {\n  content: \"\\f57a\"; }\n\n.fa-fulcrum:before {\n  content: \"\\f50b\"; }\n\n.fa-funnel-dollar:before {\n  content: \"\\f662\"; }\n\n.fa-futbol:before {\n  content: \"\\f1e3\"; }\n\n.fa-galactic-republic:before {\n  content: \"\\f50c\"; }\n\n.fa-galactic-senate:before {\n  content: \"\\f50d\"; }\n\n.fa-gamepad:before {\n  content: \"\\f11b\"; }\n\n.fa-gas-pump:before {\n  content: \"\\f52f\"; }\n\n.fa-gavel:before {\n  content: \"\\f0e3\"; }\n\n.fa-gem:before {\n  content: \"\\f3a5\"; }\n\n.fa-genderless:before {\n  content: \"\\f22d\"; }\n\n.fa-get-pocket:before {\n  content: \"\\f265\"; }\n\n.fa-gg:before {\n  content: \"\\f260\"; }\n\n.fa-gg-circle:before {\n  content: \"\\f261\"; }\n\n.fa-ghost:before {\n  content: \"\\f6e2\"; }\n\n.fa-gift:before {\n  content: \"\\f06b\"; }\n\n.fa-gifts:before {\n  content: \"\\f79c\"; }\n\n.fa-git:before {\n  content: \"\\f1d3\"; }\n\n.fa-git-square:before {\n  content: \"\\f1d2\"; }\n\n.fa-github:before {\n  content: \"\\f09b\"; }\n\n.fa-github-alt:before {\n  content: \"\\f113\"; }\n\n.fa-github-square:before {\n  content: \"\\f092\"; }\n\n.fa-gitkraken:before {\n  content: \"\\f3a6\"; }\n\n.fa-gitlab:before {\n  content: \"\\f296\"; }\n\n.fa-gitter:before {\n  content: \"\\f426\"; }\n\n.fa-glass-cheers:before {\n  content: \"\\f79f\"; }\n\n.fa-glass-martini:before {\n  content: \"\\f000\"; }\n\n.fa-glass-martini-alt:before {\n  content: \"\\f57b\"; }\n\n.fa-glass-whiskey:before {\n  content: \"\\f7a0\"; }\n\n.fa-glasses:before {\n  content: \"\\f530\"; }\n\n.fa-glide:before {\n  content: \"\\f2a5\"; }\n\n.fa-glide-g:before {\n  content: \"\\f2a6\"; }\n\n.fa-globe:before {\n  content: \"\\f0ac\"; }\n\n.fa-globe-africa:before {\n  content: \"\\f57c\"; }\n\n.fa-globe-americas:before {\n  content: \"\\f57d\"; }\n\n.fa-globe-asia:before {\n  content: \"\\f57e\"; }\n\n.fa-globe-europe:before {\n  content: \"\\f7a2\"; }\n\n.fa-gofore:before {\n  content: \"\\f3a7\"; }\n\n.fa-golf-ball:before {\n  content: \"\\f450\"; }\n\n.fa-goodreads:before {\n  content: \"\\f3a8\"; }\n\n.fa-goodreads-g:before {\n  content: \"\\f3a9\"; }\n\n.fa-google:before {\n  content: \"\\f1a0\"; }\n\n.fa-google-drive:before {\n  content: \"\\f3aa\"; }\n\n.fa-google-play:before {\n  content: \"\\f3ab\"; }\n\n.fa-google-plus:before {\n  content: \"\\f2b3\"; }\n\n.fa-google-plus-g:before {\n  content: \"\\f0d5\"; }\n\n.fa-google-plus-square:before {\n  content: \"\\f0d4\"; }\n\n.fa-google-wallet:before {\n  content: \"\\f1ee\"; }\n\n.fa-gopuram:before {\n  content: \"\\f664\"; }\n\n.fa-graduation-cap:before {\n  content: \"\\f19d\"; }\n\n.fa-gratipay:before {\n  content: \"\\f184\"; }\n\n.fa-grav:before {\n  content: \"\\f2d6\"; }\n\n.fa-greater-than:before {\n  content: \"\\f531\"; }\n\n.fa-greater-than-equal:before {\n  content: \"\\f532\"; }\n\n.fa-grimace:before {\n  content: \"\\f57f\"; }\n\n.fa-grin:before {\n  content: \"\\f580\"; }\n\n.fa-grin-alt:before {\n  content: \"\\f581\"; }\n\n.fa-grin-beam:before {\n  content: \"\\f582\"; }\n\n.fa-grin-beam-sweat:before {\n  content: \"\\f583\"; }\n\n.fa-grin-hearts:before {\n  content: \"\\f584\"; }\n\n.fa-grin-squint:before {\n  content: \"\\f585\"; }\n\n.fa-grin-squint-tears:before {\n  content: \"\\f586\"; }\n\n.fa-grin-stars:before {\n  content: \"\\f587\"; }\n\n.fa-grin-tears:before {\n  content: \"\\f588\"; }\n\n.fa-grin-tongue:before {\n  content: \"\\f589\"; }\n\n.fa-grin-tongue-squint:before {\n  content: \"\\f58a\"; }\n\n.fa-grin-tongue-wink:before {\n  content: \"\\f58b\"; }\n\n.fa-grin-wink:before {\n  content: \"\\f58c\"; }\n\n.fa-grip-horizontal:before {\n  content: \"\\f58d\"; }\n\n.fa-grip-lines:before {\n  content: \"\\f7a4\"; }\n\n.fa-grip-lines-vertical:before {\n  content: \"\\f7a5\"; }\n\n.fa-grip-vertical:before {\n  content: \"\\f58e\"; }\n\n.fa-gripfire:before {\n  content: \"\\f3ac\"; }\n\n.fa-grunt:before {\n  content: \"\\f3ad\"; }\n\n.fa-guitar:before {\n  content: \"\\f7a6\"; }\n\n.fa-gulp:before {\n  content: \"\\f3ae\"; }\n\n.fa-h-square:before {\n  content: \"\\f0fd\"; }\n\n.fa-hacker-news:before {\n  content: \"\\f1d4\"; }\n\n.fa-hacker-news-square:before {\n  content: \"\\f3af\"; }\n\n.fa-hackerrank:before {\n  content: \"\\f5f7\"; }\n\n.fa-hammer:before {\n  content: \"\\f6e3\"; }\n\n.fa-hamsa:before {\n  content: \"\\f665\"; }\n\n.fa-hand-holding:before {\n  content: \"\\f4bd\"; }\n\n.fa-hand-holding-heart:before {\n  content: \"\\f4be\"; }\n\n.fa-hand-holding-usd:before {\n  content: \"\\f4c0\"; }\n\n.fa-hand-lizard:before {\n  content: \"\\f258\"; }\n\n.fa-hand-paper:before {\n  content: \"\\f256\"; }\n\n.fa-hand-peace:before {\n  content: \"\\f25b\"; }\n\n.fa-hand-point-down:before {\n  content: \"\\f0a7\"; }\n\n.fa-hand-point-left:before {\n  content: \"\\f0a5\"; }\n\n.fa-hand-point-right:before {\n  content: \"\\f0a4\"; }\n\n.fa-hand-point-up:before {\n  content: \"\\f0a6\"; }\n\n.fa-hand-pointer:before {\n  content: \"\\f25a\"; }\n\n.fa-hand-rock:before {\n  content: \"\\f255\"; }\n\n.fa-hand-scissors:before {\n  content: \"\\f257\"; }\n\n.fa-hand-spock:before {\n  content: \"\\f259\"; }\n\n.fa-hands:before {\n  content: \"\\f4c2\"; }\n\n.fa-hands-helping:before {\n  content: \"\\f4c4\"; }\n\n.fa-handshake:before {\n  content: \"\\f2b5\"; }\n\n.fa-hanukiah:before {\n  content: \"\\f6e6\"; }\n\n.fa-hashtag:before {\n  content: \"\\f292\"; }\n\n.fa-hat-wizard:before {\n  content: \"\\f6e8\"; }\n\n.fa-haykal:before {\n  content: \"\\f666\"; }\n\n.fa-hdd:before {\n  content: \"\\f0a0\"; }\n\n.fa-heading:before {\n  content: \"\\f1dc\"; }\n\n.fa-headphones:before {\n  content: \"\\f025\"; }\n\n.fa-headphones-alt:before {\n  content: \"\\f58f\"; }\n\n.fa-headset:before {\n  content: \"\\f590\"; }\n\n.fa-heart:before {\n  content: \"\\f004\"; }\n\n.fa-heart-broken:before {\n  content: \"\\f7a9\"; }\n\n.fa-heartbeat:before {\n  content: \"\\f21e\"; }\n\n.fa-helicopter:before {\n  content: \"\\f533\"; }\n\n.fa-highlighter:before {\n  content: \"\\f591\"; }\n\n.fa-hiking:before {\n  content: \"\\f6ec\"; }\n\n.fa-hippo:before {\n  content: \"\\f6ed\"; }\n\n.fa-hips:before {\n  content: \"\\f452\"; }\n\n.fa-hire-a-helper:before {\n  content: \"\\f3b0\"; }\n\n.fa-history:before {\n  content: \"\\f1da\"; }\n\n.fa-hockey-puck:before {\n  content: \"\\f453\"; }\n\n.fa-holly-berry:before {\n  content: \"\\f7aa\"; }\n\n.fa-home:before {\n  content: \"\\f015\"; }\n\n.fa-hooli:before {\n  content: \"\\f427\"; }\n\n.fa-hornbill:before {\n  content: \"\\f592\"; }\n\n.fa-horse:before {\n  content: \"\\f6f0\"; }\n\n.fa-horse-head:before {\n  content: \"\\f7ab\"; }\n\n.fa-hospital:before {\n  content: \"\\f0f8\"; }\n\n.fa-hospital-alt:before {\n  content: \"\\f47d\"; }\n\n.fa-hospital-symbol:before {\n  content: \"\\f47e\"; }\n\n.fa-hot-tub:before {\n  content: \"\\f593\"; }\n\n.fa-hotel:before {\n  content: \"\\f594\"; }\n\n.fa-hotjar:before {\n  content: \"\\f3b1\"; }\n\n.fa-hourglass:before {\n  content: \"\\f254\"; }\n\n.fa-hourglass-end:before {\n  content: \"\\f253\"; }\n\n.fa-hourglass-half:before {\n  content: \"\\f252\"; }\n\n.fa-hourglass-start:before {\n  content: \"\\f251\"; }\n\n.fa-house-damage:before {\n  content: \"\\f6f1\"; }\n\n.fa-houzz:before {\n  content: \"\\f27c\"; }\n\n.fa-hryvnia:before {\n  content: \"\\f6f2\"; }\n\n.fa-html5:before {\n  content: \"\\f13b\"; }\n\n.fa-hubspot:before {\n  content: \"\\f3b2\"; }\n\n.fa-i-cursor:before {\n  content: \"\\f246\"; }\n\n.fa-icicles:before {\n  content: \"\\f7ad\"; }\n\n.fa-id-badge:before {\n  content: \"\\f2c1\"; }\n\n.fa-id-card:before {\n  content: \"\\f2c2\"; }\n\n.fa-id-card-alt:before {\n  content: \"\\f47f\"; }\n\n.fa-igloo:before {\n  content: \"\\f7ae\"; }\n\n.fa-image:before {\n  content: \"\\f03e\"; }\n\n.fa-images:before {\n  content: \"\\f302\"; }\n\n.fa-imdb:before {\n  content: \"\\f2d8\"; }\n\n.fa-inbox:before {\n  content: \"\\f01c\"; }\n\n.fa-indent:before {\n  content: \"\\f03c\"; }\n\n.fa-industry:before {\n  content: \"\\f275\"; }\n\n.fa-infinity:before {\n  content: \"\\f534\"; }\n\n.fa-info:before {\n  content: \"\\f129\"; }\n\n.fa-info-circle:before {\n  content: \"\\f05a\"; }\n\n.fa-instagram:before {\n  content: \"\\f16d\"; }\n\n.fa-intercom:before {\n  content: \"\\f7af\"; }\n\n.fa-internet-explorer:before {\n  content: \"\\f26b\"; }\n\n.fa-invision:before {\n  content: \"\\f7b0\"; }\n\n.fa-ioxhost:before {\n  content: \"\\f208\"; }\n\n.fa-italic:before {\n  content: \"\\f033\"; }\n\n.fa-itunes:before {\n  content: \"\\f3b4\"; }\n\n.fa-itunes-note:before {\n  content: \"\\f3b5\"; }\n\n.fa-java:before {\n  content: \"\\f4e4\"; }\n\n.fa-jedi:before {\n  content: \"\\f669\"; }\n\n.fa-jedi-order:before {\n  content: \"\\f50e\"; }\n\n.fa-jenkins:before {\n  content: \"\\f3b6\"; }\n\n.fa-jira:before {\n  content: \"\\f7b1\"; }\n\n.fa-joget:before {\n  content: \"\\f3b7\"; }\n\n.fa-joint:before {\n  content: \"\\f595\"; }\n\n.fa-joomla:before {\n  content: \"\\f1aa\"; }\n\n.fa-journal-whills:before {\n  content: \"\\f66a\"; }\n\n.fa-js:before {\n  content: \"\\f3b8\"; }\n\n.fa-js-square:before {\n  content: \"\\f3b9\"; }\n\n.fa-jsfiddle:before {\n  content: \"\\f1cc\"; }\n\n.fa-kaaba:before {\n  content: \"\\f66b\"; }\n\n.fa-kaggle:before {\n  content: \"\\f5fa\"; }\n\n.fa-key:before {\n  content: \"\\f084\"; }\n\n.fa-keybase:before {\n  content: \"\\f4f5\"; }\n\n.fa-keyboard:before {\n  content: \"\\f11c\"; }\n\n.fa-keycdn:before {\n  content: \"\\f3ba\"; }\n\n.fa-khanda:before {\n  content: \"\\f66d\"; }\n\n.fa-kickstarter:before {\n  content: \"\\f3bb\"; }\n\n.fa-kickstarter-k:before {\n  content: \"\\f3bc\"; }\n\n.fa-kiss:before {\n  content: \"\\f596\"; }\n\n.fa-kiss-beam:before {\n  content: \"\\f597\"; }\n\n.fa-kiss-wink-heart:before {\n  content: \"\\f598\"; }\n\n.fa-kiwi-bird:before {\n  content: \"\\f535\"; }\n\n.fa-korvue:before {\n  content: \"\\f42f\"; }\n\n.fa-landmark:before {\n  content: \"\\f66f\"; }\n\n.fa-language:before {\n  content: \"\\f1ab\"; }\n\n.fa-laptop:before {\n  content: \"\\f109\"; }\n\n.fa-laptop-code:before {\n  content: \"\\f5fc\"; }\n\n.fa-laravel:before {\n  content: \"\\f3bd\"; }\n\n.fa-lastfm:before {\n  content: \"\\f202\"; }\n\n.fa-lastfm-square:before {\n  content: \"\\f203\"; }\n\n.fa-laugh:before {\n  content: \"\\f599\"; }\n\n.fa-laugh-beam:before {\n  content: \"\\f59a\"; }\n\n.fa-laugh-squint:before {\n  content: \"\\f59b\"; }\n\n.fa-laugh-wink:before {\n  content: \"\\f59c\"; }\n\n.fa-layer-group:before {\n  content: \"\\f5fd\"; }\n\n.fa-leaf:before {\n  content: \"\\f06c\"; }\n\n.fa-leanpub:before {\n  content: \"\\f212\"; }\n\n.fa-lemon:before {\n  content: \"\\f094\"; }\n\n.fa-less:before {\n  content: \"\\f41d\"; }\n\n.fa-less-than:before {\n  content: \"\\f536\"; }\n\n.fa-less-than-equal:before {\n  content: \"\\f537\"; }\n\n.fa-level-down-alt:before {\n  content: \"\\f3be\"; }\n\n.fa-level-up-alt:before {\n  content: \"\\f3bf\"; }\n\n.fa-life-ring:before {\n  content: \"\\f1cd\"; }\n\n.fa-lightbulb:before {\n  content: \"\\f0eb\"; }\n\n.fa-line:before {\n  content: \"\\f3c0\"; }\n\n.fa-link:before {\n  content: \"\\f0c1\"; }\n\n.fa-linkedin:before {\n  content: \"\\f08c\"; }\n\n.fa-linkedin-in:before {\n  content: \"\\f0e1\"; }\n\n.fa-linode:before {\n  content: \"\\f2b8\"; }\n\n.fa-linux:before {\n  content: \"\\f17c\"; }\n\n.fa-lira-sign:before {\n  content: \"\\f195\"; }\n\n.fa-list:before {\n  content: \"\\f03a\"; }\n\n.fa-list-alt:before {\n  content: \"\\f022\"; }\n\n.fa-list-ol:before {\n  content: \"\\f0cb\"; }\n\n.fa-list-ul:before {\n  content: \"\\f0ca\"; }\n\n.fa-location-arrow:before {\n  content: \"\\f124\"; }\n\n.fa-lock:before {\n  content: \"\\f023\"; }\n\n.fa-lock-open:before {\n  content: \"\\f3c1\"; }\n\n.fa-long-arrow-alt-down:before {\n  content: \"\\f309\"; }\n\n.fa-long-arrow-alt-left:before {\n  content: \"\\f30a\"; }\n\n.fa-long-arrow-alt-right:before {\n  content: \"\\f30b\"; }\n\n.fa-long-arrow-alt-up:before {\n  content: \"\\f30c\"; }\n\n.fa-low-vision:before {\n  content: \"\\f2a8\"; }\n\n.fa-luggage-cart:before {\n  content: \"\\f59d\"; }\n\n.fa-lyft:before {\n  content: \"\\f3c3\"; }\n\n.fa-magento:before {\n  content: \"\\f3c4\"; }\n\n.fa-magic:before {\n  content: \"\\f0d0\"; }\n\n.fa-magnet:before {\n  content: \"\\f076\"; }\n\n.fa-mail-bulk:before {\n  content: \"\\f674\"; }\n\n.fa-mailchimp:before {\n  content: \"\\f59e\"; }\n\n.fa-male:before {\n  content: \"\\f183\"; }\n\n.fa-mandalorian:before {\n  content: \"\\f50f\"; }\n\n.fa-map:before {\n  content: \"\\f279\"; }\n\n.fa-map-marked:before {\n  content: \"\\f59f\"; }\n\n.fa-map-marked-alt:before {\n  content: \"\\f5a0\"; }\n\n.fa-map-marker:before {\n  content: \"\\f041\"; }\n\n.fa-map-marker-alt:before {\n  content: \"\\f3c5\"; }\n\n.fa-map-pin:before {\n  content: \"\\f276\"; }\n\n.fa-map-signs:before {\n  content: \"\\f277\"; }\n\n.fa-markdown:before {\n  content: \"\\f60f\"; }\n\n.fa-marker:before {\n  content: \"\\f5a1\"; }\n\n.fa-mars:before {\n  content: \"\\f222\"; }\n\n.fa-mars-double:before {\n  content: \"\\f227\"; }\n\n.fa-mars-stroke:before {\n  content: \"\\f229\"; }\n\n.fa-mars-stroke-h:before {\n  content: \"\\f22b\"; }\n\n.fa-mars-stroke-v:before {\n  content: \"\\f22a\"; }\n\n.fa-mask:before {\n  content: \"\\f6fa\"; }\n\n.fa-mastodon:before {\n  content: \"\\f4f6\"; }\n\n.fa-maxcdn:before {\n  content: \"\\f136\"; }\n\n.fa-medal:before {\n  content: \"\\f5a2\"; }\n\n.fa-medapps:before {\n  content: \"\\f3c6\"; }\n\n.fa-medium:before {\n  content: \"\\f23a\"; }\n\n.fa-medium-m:before {\n  content: \"\\f3c7\"; }\n\n.fa-medkit:before {\n  content: \"\\f0fa\"; }\n\n.fa-medrt:before {\n  content: \"\\f3c8\"; }\n\n.fa-meetup:before {\n  content: \"\\f2e0\"; }\n\n.fa-megaport:before {\n  content: \"\\f5a3\"; }\n\n.fa-meh:before {\n  content: \"\\f11a\"; }\n\n.fa-meh-blank:before {\n  content: \"\\f5a4\"; }\n\n.fa-meh-rolling-eyes:before {\n  content: \"\\f5a5\"; }\n\n.fa-memory:before {\n  content: \"\\f538\"; }\n\n.fa-mendeley:before {\n  content: \"\\f7b3\"; }\n\n.fa-menorah:before {\n  content: \"\\f676\"; }\n\n.fa-mercury:before {\n  content: \"\\f223\"; }\n\n.fa-meteor:before {\n  content: \"\\f753\"; }\n\n.fa-microchip:before {\n  content: \"\\f2db\"; }\n\n.fa-microphone:before {\n  content: \"\\f130\"; }\n\n.fa-microphone-alt:before {\n  content: \"\\f3c9\"; }\n\n.fa-microphone-alt-slash:before {\n  content: \"\\f539\"; }\n\n.fa-microphone-slash:before {\n  content: \"\\f131\"; }\n\n.fa-microscope:before {\n  content: \"\\f610\"; }\n\n.fa-microsoft:before {\n  content: \"\\f3ca\"; }\n\n.fa-minus:before {\n  content: \"\\f068\"; }\n\n.fa-minus-circle:before {\n  content: \"\\f056\"; }\n\n.fa-minus-square:before {\n  content: \"\\f146\"; }\n\n.fa-mitten:before {\n  content: \"\\f7b5\"; }\n\n.fa-mix:before {\n  content: \"\\f3cb\"; }\n\n.fa-mixcloud:before {\n  content: \"\\f289\"; }\n\n.fa-mizuni:before {\n  content: \"\\f3cc\"; }\n\n.fa-mobile:before {\n  content: \"\\f10b\"; }\n\n.fa-mobile-alt:before {\n  content: \"\\f3cd\"; }\n\n.fa-modx:before {\n  content: \"\\f285\"; }\n\n.fa-monero:before {\n  content: \"\\f3d0\"; }\n\n.fa-money-bill:before {\n  content: \"\\f0d6\"; }\n\n.fa-money-bill-alt:before {\n  content: \"\\f3d1\"; }\n\n.fa-money-bill-wave:before {\n  content: \"\\f53a\"; }\n\n.fa-money-bill-wave-alt:before {\n  content: \"\\f53b\"; }\n\n.fa-money-check:before {\n  content: \"\\f53c\"; }\n\n.fa-money-check-alt:before {\n  content: \"\\f53d\"; }\n\n.fa-monument:before {\n  content: \"\\f5a6\"; }\n\n.fa-moon:before {\n  content: \"\\f186\"; }\n\n.fa-mortar-pestle:before {\n  content: \"\\f5a7\"; }\n\n.fa-mosque:before {\n  content: \"\\f678\"; }\n\n.fa-motorcycle:before {\n  content: \"\\f21c\"; }\n\n.fa-mountain:before {\n  content: \"\\f6fc\"; }\n\n.fa-mouse-pointer:before {\n  content: \"\\f245\"; }\n\n.fa-mug-hot:before {\n  content: \"\\f7b6\"; }\n\n.fa-music:before {\n  content: \"\\f001\"; }\n\n.fa-napster:before {\n  content: \"\\f3d2\"; }\n\n.fa-neos:before {\n  content: \"\\f612\"; }\n\n.fa-network-wired:before {\n  content: \"\\f6ff\"; }\n\n.fa-neuter:before {\n  content: \"\\f22c\"; }\n\n.fa-newspaper:before {\n  content: \"\\f1ea\"; }\n\n.fa-nimblr:before {\n  content: \"\\f5a8\"; }\n\n.fa-nintendo-switch:before {\n  content: \"\\f418\"; }\n\n.fa-node:before {\n  content: \"\\f419\"; }\n\n.fa-node-js:before {\n  content: \"\\f3d3\"; }\n\n.fa-not-equal:before {\n  content: \"\\f53e\"; }\n\n.fa-notes-medical:before {\n  content: \"\\f481\"; }\n\n.fa-npm:before {\n  content: \"\\f3d4\"; }\n\n.fa-ns8:before {\n  content: \"\\f3d5\"; }\n\n.fa-nutritionix:before {\n  content: \"\\f3d6\"; }\n\n.fa-object-group:before {\n  content: \"\\f247\"; }\n\n.fa-object-ungroup:before {\n  content: \"\\f248\"; }\n\n.fa-odnoklassniki:before {\n  content: \"\\f263\"; }\n\n.fa-odnoklassniki-square:before {\n  content: \"\\f264\"; }\n\n.fa-oil-can:before {\n  content: \"\\f613\"; }\n\n.fa-old-republic:before {\n  content: \"\\f510\"; }\n\n.fa-om:before {\n  content: \"\\f679\"; }\n\n.fa-opencart:before {\n  content: \"\\f23d\"; }\n\n.fa-openid:before {\n  content: \"\\f19b\"; }\n\n.fa-opera:before {\n  content: \"\\f26a\"; }\n\n.fa-optin-monster:before {\n  content: \"\\f23c\"; }\n\n.fa-osi:before {\n  content: \"\\f41a\"; }\n\n.fa-otter:before {\n  content: \"\\f700\"; }\n\n.fa-outdent:before {\n  content: \"\\f03b\"; }\n\n.fa-page4:before {\n  content: \"\\f3d7\"; }\n\n.fa-pagelines:before {\n  content: \"\\f18c\"; }\n\n.fa-paint-brush:before {\n  content: \"\\f1fc\"; }\n\n.fa-paint-roller:before {\n  content: \"\\f5aa\"; }\n\n.fa-palette:before {\n  content: \"\\f53f\"; }\n\n.fa-palfed:before {\n  content: \"\\f3d8\"; }\n\n.fa-pallet:before {\n  content: \"\\f482\"; }\n\n.fa-paper-plane:before {\n  content: \"\\f1d8\"; }\n\n.fa-paperclip:before {\n  content: \"\\f0c6\"; }\n\n.fa-parachute-box:before {\n  content: \"\\f4cd\"; }\n\n.fa-paragraph:before {\n  content: \"\\f1dd\"; }\n\n.fa-parking:before {\n  content: \"\\f540\"; }\n\n.fa-passport:before {\n  content: \"\\f5ab\"; }\n\n.fa-pastafarianism:before {\n  content: \"\\f67b\"; }\n\n.fa-paste:before {\n  content: \"\\f0ea\"; }\n\n.fa-patreon:before {\n  content: \"\\f3d9\"; }\n\n.fa-pause:before {\n  content: \"\\f04c\"; }\n\n.fa-pause-circle:before {\n  content: \"\\f28b\"; }\n\n.fa-paw:before {\n  content: \"\\f1b0\"; }\n\n.fa-paypal:before {\n  content: \"\\f1ed\"; }\n\n.fa-peace:before {\n  content: \"\\f67c\"; }\n\n.fa-pen:before {\n  content: \"\\f304\"; }\n\n.fa-pen-alt:before {\n  content: \"\\f305\"; }\n\n.fa-pen-fancy:before {\n  content: \"\\f5ac\"; }\n\n.fa-pen-nib:before {\n  content: \"\\f5ad\"; }\n\n.fa-pen-square:before {\n  content: \"\\f14b\"; }\n\n.fa-pencil-alt:before {\n  content: \"\\f303\"; }\n\n.fa-pencil-ruler:before {\n  content: \"\\f5ae\"; }\n\n.fa-penny-arcade:before {\n  content: \"\\f704\"; }\n\n.fa-people-carry:before {\n  content: \"\\f4ce\"; }\n\n.fa-percent:before {\n  content: \"\\f295\"; }\n\n.fa-percentage:before {\n  content: \"\\f541\"; }\n\n.fa-periscope:before {\n  content: \"\\f3da\"; }\n\n.fa-person-booth:before {\n  content: \"\\f756\"; }\n\n.fa-phabricator:before {\n  content: \"\\f3db\"; }\n\n.fa-phoenix-framework:before {\n  content: \"\\f3dc\"; }\n\n.fa-phoenix-squadron:before {\n  content: \"\\f511\"; }\n\n.fa-phone:before {\n  content: \"\\f095\"; }\n\n.fa-phone-slash:before {\n  content: \"\\f3dd\"; }\n\n.fa-phone-square:before {\n  content: \"\\f098\"; }\n\n.fa-phone-volume:before {\n  content: \"\\f2a0\"; }\n\n.fa-php:before {\n  content: \"\\f457\"; }\n\n.fa-pied-piper:before {\n  content: \"\\f2ae\"; }\n\n.fa-pied-piper-alt:before {\n  content: \"\\f1a8\"; }\n\n.fa-pied-piper-hat:before {\n  content: \"\\f4e5\"; }\n\n.fa-pied-piper-pp:before {\n  content: \"\\f1a7\"; }\n\n.fa-piggy-bank:before {\n  content: \"\\f4d3\"; }\n\n.fa-pills:before {\n  content: \"\\f484\"; }\n\n.fa-pinterest:before {\n  content: \"\\f0d2\"; }\n\n.fa-pinterest-p:before {\n  content: \"\\f231\"; }\n\n.fa-pinterest-square:before {\n  content: \"\\f0d3\"; }\n\n.fa-place-of-worship:before {\n  content: \"\\f67f\"; }\n\n.fa-plane:before {\n  content: \"\\f072\"; }\n\n.fa-plane-arrival:before {\n  content: \"\\f5af\"; }\n\n.fa-plane-departure:before {\n  content: \"\\f5b0\"; }\n\n.fa-play:before {\n  content: \"\\f04b\"; }\n\n.fa-play-circle:before {\n  content: \"\\f144\"; }\n\n.fa-playstation:before {\n  content: \"\\f3df\"; }\n\n.fa-plug:before {\n  content: \"\\f1e6\"; }\n\n.fa-plus:before {\n  content: \"\\f067\"; }\n\n.fa-plus-circle:before {\n  content: \"\\f055\"; }\n\n.fa-plus-square:before {\n  content: \"\\f0fe\"; }\n\n.fa-podcast:before {\n  content: \"\\f2ce\"; }\n\n.fa-poll:before {\n  content: \"\\f681\"; }\n\n.fa-poll-h:before {\n  content: \"\\f682\"; }\n\n.fa-poo:before {\n  content: \"\\f2fe\"; }\n\n.fa-poo-storm:before {\n  content: \"\\f75a\"; }\n\n.fa-poop:before {\n  content: \"\\f619\"; }\n\n.fa-portrait:before {\n  content: \"\\f3e0\"; }\n\n.fa-pound-sign:before {\n  content: \"\\f154\"; }\n\n.fa-power-off:before {\n  content: \"\\f011\"; }\n\n.fa-pray:before {\n  content: \"\\f683\"; }\n\n.fa-praying-hands:before {\n  content: \"\\f684\"; }\n\n.fa-prescription:before {\n  content: \"\\f5b1\"; }\n\n.fa-prescription-bottle:before {\n  content: \"\\f485\"; }\n\n.fa-prescription-bottle-alt:before {\n  content: \"\\f486\"; }\n\n.fa-print:before {\n  content: \"\\f02f\"; }\n\n.fa-procedures:before {\n  content: \"\\f487\"; }\n\n.fa-product-hunt:before {\n  content: \"\\f288\"; }\n\n.fa-project-diagram:before {\n  content: \"\\f542\"; }\n\n.fa-pushed:before {\n  content: \"\\f3e1\"; }\n\n.fa-puzzle-piece:before {\n  content: \"\\f12e\"; }\n\n.fa-python:before {\n  content: \"\\f3e2\"; }\n\n.fa-qq:before {\n  content: \"\\f1d6\"; }\n\n.fa-qrcode:before {\n  content: \"\\f029\"; }\n\n.fa-question:before {\n  content: \"\\f128\"; }\n\n.fa-question-circle:before {\n  content: \"\\f059\"; }\n\n.fa-quidditch:before {\n  content: \"\\f458\"; }\n\n.fa-quinscape:before {\n  content: \"\\f459\"; }\n\n.fa-quora:before {\n  content: \"\\f2c4\"; }\n\n.fa-quote-left:before {\n  content: \"\\f10d\"; }\n\n.fa-quote-right:before {\n  content: \"\\f10e\"; }\n\n.fa-quran:before {\n  content: \"\\f687\"; }\n\n.fa-r-project:before {\n  content: \"\\f4f7\"; }\n\n.fa-radiation:before {\n  content: \"\\f7b9\"; }\n\n.fa-radiation-alt:before {\n  content: \"\\f7ba\"; }\n\n.fa-rainbow:before {\n  content: \"\\f75b\"; }\n\n.fa-random:before {\n  content: \"\\f074\"; }\n\n.fa-raspberry-pi:before {\n  content: \"\\f7bb\"; }\n\n.fa-ravelry:before {\n  content: \"\\f2d9\"; }\n\n.fa-react:before {\n  content: \"\\f41b\"; }\n\n.fa-reacteurope:before {\n  content: \"\\f75d\"; }\n\n.fa-readme:before {\n  content: \"\\f4d5\"; }\n\n.fa-rebel:before {\n  content: \"\\f1d0\"; }\n\n.fa-receipt:before {\n  content: \"\\f543\"; }\n\n.fa-recycle:before {\n  content: \"\\f1b8\"; }\n\n.fa-red-river:before {\n  content: \"\\f3e3\"; }\n\n.fa-reddit:before {\n  content: \"\\f1a1\"; }\n\n.fa-reddit-alien:before {\n  content: \"\\f281\"; }\n\n.fa-reddit-square:before {\n  content: \"\\f1a2\"; }\n\n.fa-redhat:before {\n  content: \"\\f7bc\"; }\n\n.fa-redo:before {\n  content: \"\\f01e\"; }\n\n.fa-redo-alt:before {\n  content: \"\\f2f9\"; }\n\n.fa-registered:before {\n  content: \"\\f25d\"; }\n\n.fa-renren:before {\n  content: \"\\f18b\"; }\n\n.fa-reply:before {\n  content: \"\\f3e5\"; }\n\n.fa-reply-all:before {\n  content: \"\\f122\"; }\n\n.fa-replyd:before {\n  content: \"\\f3e6\"; }\n\n.fa-republican:before {\n  content: \"\\f75e\"; }\n\n.fa-researchgate:before {\n  content: \"\\f4f8\"; }\n\n.fa-resolving:before {\n  content: \"\\f3e7\"; }\n\n.fa-restroom:before {\n  content: \"\\f7bd\"; }\n\n.fa-retweet:before {\n  content: \"\\f079\"; }\n\n.fa-rev:before {\n  content: \"\\f5b2\"; }\n\n.fa-ribbon:before {\n  content: \"\\f4d6\"; }\n\n.fa-ring:before {\n  content: \"\\f70b\"; }\n\n.fa-road:before {\n  content: \"\\f018\"; }\n\n.fa-robot:before {\n  content: \"\\f544\"; }\n\n.fa-rocket:before {\n  content: \"\\f135\"; }\n\n.fa-rocketchat:before {\n  content: \"\\f3e8\"; }\n\n.fa-rockrms:before {\n  content: \"\\f3e9\"; }\n\n.fa-route:before {\n  content: \"\\f4d7\"; }\n\n.fa-rss:before {\n  content: \"\\f09e\"; }\n\n.fa-rss-square:before {\n  content: \"\\f143\"; }\n\n.fa-ruble-sign:before {\n  content: \"\\f158\"; }\n\n.fa-ruler:before {\n  content: \"\\f545\"; }\n\n.fa-ruler-combined:before {\n  content: \"\\f546\"; }\n\n.fa-ruler-horizontal:before {\n  content: \"\\f547\"; }\n\n.fa-ruler-vertical:before {\n  content: \"\\f548\"; }\n\n.fa-running:before {\n  content: \"\\f70c\"; }\n\n.fa-rupee-sign:before {\n  content: \"\\f156\"; }\n\n.fa-sad-cry:before {\n  content: \"\\f5b3\"; }\n\n.fa-sad-tear:before {\n  content: \"\\f5b4\"; }\n\n.fa-safari:before {\n  content: \"\\f267\"; }\n\n.fa-sass:before {\n  content: \"\\f41e\"; }\n\n.fa-satellite:before {\n  content: \"\\f7bf\"; }\n\n.fa-satellite-dish:before {\n  content: \"\\f7c0\"; }\n\n.fa-save:before {\n  content: \"\\f0c7\"; }\n\n.fa-schlix:before {\n  content: \"\\f3ea\"; }\n\n.fa-school:before {\n  content: \"\\f549\"; }\n\n.fa-screwdriver:before {\n  content: \"\\f54a\"; }\n\n.fa-scribd:before {\n  content: \"\\f28a\"; }\n\n.fa-scroll:before {\n  content: \"\\f70e\"; }\n\n.fa-sd-card:before {\n  content: \"\\f7c2\"; }\n\n.fa-search:before {\n  content: \"\\f002\"; }\n\n.fa-search-dollar:before {\n  content: \"\\f688\"; }\n\n.fa-search-location:before {\n  content: \"\\f689\"; }\n\n.fa-search-minus:before {\n  content: \"\\f010\"; }\n\n.fa-search-plus:before {\n  content: \"\\f00e\"; }\n\n.fa-searchengin:before {\n  content: \"\\f3eb\"; }\n\n.fa-seedling:before {\n  content: \"\\f4d8\"; }\n\n.fa-sellcast:before {\n  content: \"\\f2da\"; }\n\n.fa-sellsy:before {\n  content: \"\\f213\"; }\n\n.fa-server:before {\n  content: \"\\f233\"; }\n\n.fa-servicestack:before {\n  content: \"\\f3ec\"; }\n\n.fa-shapes:before {\n  content: \"\\f61f\"; }\n\n.fa-share:before {\n  content: \"\\f064\"; }\n\n.fa-share-alt:before {\n  content: \"\\f1e0\"; }\n\n.fa-share-alt-square:before {\n  content: \"\\f1e1\"; }\n\n.fa-share-square:before {\n  content: \"\\f14d\"; }\n\n.fa-shekel-sign:before {\n  content: \"\\f20b\"; }\n\n.fa-shield-alt:before {\n  content: \"\\f3ed\"; }\n\n.fa-ship:before {\n  content: \"\\f21a\"; }\n\n.fa-shipping-fast:before {\n  content: \"\\f48b\"; }\n\n.fa-shirtsinbulk:before {\n  content: \"\\f214\"; }\n\n.fa-shoe-prints:before {\n  content: \"\\f54b\"; }\n\n.fa-shopping-bag:before {\n  content: \"\\f290\"; }\n\n.fa-shopping-basket:before {\n  content: \"\\f291\"; }\n\n.fa-shopping-cart:before {\n  content: \"\\f07a\"; }\n\n.fa-shopware:before {\n  content: \"\\f5b5\"; }\n\n.fa-shower:before {\n  content: \"\\f2cc\"; }\n\n.fa-shuttle-van:before {\n  content: \"\\f5b6\"; }\n\n.fa-sign:before {\n  content: \"\\f4d9\"; }\n\n.fa-sign-in-alt:before {\n  content: \"\\f2f6\"; }\n\n.fa-sign-language:before {\n  content: \"\\f2a7\"; }\n\n.fa-sign-out-alt:before {\n  content: \"\\f2f5\"; }\n\n.fa-signal:before {\n  content: \"\\f012\"; }\n\n.fa-signature:before {\n  content: \"\\f5b7\"; }\n\n.fa-sim-card:before {\n  content: \"\\f7c4\"; }\n\n.fa-simplybuilt:before {\n  content: \"\\f215\"; }\n\n.fa-sistrix:before {\n  content: \"\\f3ee\"; }\n\n.fa-sitemap:before {\n  content: \"\\f0e8\"; }\n\n.fa-sith:before {\n  content: \"\\f512\"; }\n\n.fa-skating:before {\n  content: \"\\f7c5\"; }\n\n.fa-sketch:before {\n  content: \"\\f7c6\"; }\n\n.fa-skiing:before {\n  content: \"\\f7c9\"; }\n\n.fa-skiing-nordic:before {\n  content: \"\\f7ca\"; }\n\n.fa-skull:before {\n  content: \"\\f54c\"; }\n\n.fa-skull-crossbones:before {\n  content: \"\\f714\"; }\n\n.fa-skyatlas:before {\n  content: \"\\f216\"; }\n\n.fa-skype:before {\n  content: \"\\f17e\"; }\n\n.fa-slack:before {\n  content: \"\\f198\"; }\n\n.fa-slack-hash:before {\n  content: \"\\f3ef\"; }\n\n.fa-slash:before {\n  content: \"\\f715\"; }\n\n.fa-sleigh:before {\n  content: \"\\f7cc\"; }\n\n.fa-sliders-h:before {\n  content: \"\\f1de\"; }\n\n.fa-slideshare:before {\n  content: \"\\f1e7\"; }\n\n.fa-smile:before {\n  content: \"\\f118\"; }\n\n.fa-smile-beam:before {\n  content: \"\\f5b8\"; }\n\n.fa-smile-wink:before {\n  content: \"\\f4da\"; }\n\n.fa-smog:before {\n  content: \"\\f75f\"; }\n\n.fa-smoking:before {\n  content: \"\\f48d\"; }\n\n.fa-smoking-ban:before {\n  content: \"\\f54d\"; }\n\n.fa-sms:before {\n  content: \"\\f7cd\"; }\n\n.fa-snapchat:before {\n  content: \"\\f2ab\"; }\n\n.fa-snapchat-ghost:before {\n  content: \"\\f2ac\"; }\n\n.fa-snapchat-square:before {\n  content: \"\\f2ad\"; }\n\n.fa-snowboarding:before {\n  content: \"\\f7ce\"; }\n\n.fa-snowflake:before {\n  content: \"\\f2dc\"; }\n\n.fa-snowman:before {\n  content: \"\\f7d0\"; }\n\n.fa-snowplow:before {\n  content: \"\\f7d2\"; }\n\n.fa-socks:before {\n  content: \"\\f696\"; }\n\n.fa-solar-panel:before {\n  content: \"\\f5ba\"; }\n\n.fa-sort:before {\n  content: \"\\f0dc\"; }\n\n.fa-sort-alpha-down:before {\n  content: \"\\f15d\"; }\n\n.fa-sort-alpha-up:before {\n  content: \"\\f15e\"; }\n\n.fa-sort-amount-down:before {\n  content: \"\\f160\"; }\n\n.fa-sort-amount-up:before {\n  content: \"\\f161\"; }\n\n.fa-sort-down:before {\n  content: \"\\f0dd\"; }\n\n.fa-sort-numeric-down:before {\n  content: \"\\f162\"; }\n\n.fa-sort-numeric-up:before {\n  content: \"\\f163\"; }\n\n.fa-sort-up:before {\n  content: \"\\f0de\"; }\n\n.fa-soundcloud:before {\n  content: \"\\f1be\"; }\n\n.fa-sourcetree:before {\n  content: \"\\f7d3\"; }\n\n.fa-spa:before {\n  content: \"\\f5bb\"; }\n\n.fa-space-shuttle:before {\n  content: \"\\f197\"; }\n\n.fa-speakap:before {\n  content: \"\\f3f3\"; }\n\n.fa-spider:before {\n  content: \"\\f717\"; }\n\n.fa-spinner:before {\n  content: \"\\f110\"; }\n\n.fa-splotch:before {\n  content: \"\\f5bc\"; }\n\n.fa-spotify:before {\n  content: \"\\f1bc\"; }\n\n.fa-spray-can:before {\n  content: \"\\f5bd\"; }\n\n.fa-square:before {\n  content: \"\\f0c8\"; }\n\n.fa-square-full:before {\n  content: \"\\f45c\"; }\n\n.fa-square-root-alt:before {\n  content: \"\\f698\"; }\n\n.fa-squarespace:before {\n  content: \"\\f5be\"; }\n\n.fa-stack-exchange:before {\n  content: \"\\f18d\"; }\n\n.fa-stack-overflow:before {\n  content: \"\\f16c\"; }\n\n.fa-stamp:before {\n  content: \"\\f5bf\"; }\n\n.fa-star:before {\n  content: \"\\f005\"; }\n\n.fa-star-and-crescent:before {\n  content: \"\\f699\"; }\n\n.fa-star-half:before {\n  content: \"\\f089\"; }\n\n.fa-star-half-alt:before {\n  content: \"\\f5c0\"; }\n\n.fa-star-of-david:before {\n  content: \"\\f69a\"; }\n\n.fa-star-of-life:before {\n  content: \"\\f621\"; }\n\n.fa-staylinked:before {\n  content: \"\\f3f5\"; }\n\n.fa-steam:before {\n  content: \"\\f1b6\"; }\n\n.fa-steam-square:before {\n  content: \"\\f1b7\"; }\n\n.fa-steam-symbol:before {\n  content: \"\\f3f6\"; }\n\n.fa-step-backward:before {\n  content: \"\\f048\"; }\n\n.fa-step-forward:before {\n  content: \"\\f051\"; }\n\n.fa-stethoscope:before {\n  content: \"\\f0f1\"; }\n\n.fa-sticker-mule:before {\n  content: \"\\f3f7\"; }\n\n.fa-sticky-note:before {\n  content: \"\\f249\"; }\n\n.fa-stop:before {\n  content: \"\\f04d\"; }\n\n.fa-stop-circle:before {\n  content: \"\\f28d\"; }\n\n.fa-stopwatch:before {\n  content: \"\\f2f2\"; }\n\n.fa-store:before {\n  content: \"\\f54e\"; }\n\n.fa-store-alt:before {\n  content: \"\\f54f\"; }\n\n.fa-strava:before {\n  content: \"\\f428\"; }\n\n.fa-stream:before {\n  content: \"\\f550\"; }\n\n.fa-street-view:before {\n  content: \"\\f21d\"; }\n\n.fa-strikethrough:before {\n  content: \"\\f0cc\"; }\n\n.fa-stripe:before {\n  content: \"\\f429\"; }\n\n.fa-stripe-s:before {\n  content: \"\\f42a\"; }\n\n.fa-stroopwafel:before {\n  content: \"\\f551\"; }\n\n.fa-studiovinari:before {\n  content: \"\\f3f8\"; }\n\n.fa-stumbleupon:before {\n  content: \"\\f1a4\"; }\n\n.fa-stumbleupon-circle:before {\n  content: \"\\f1a3\"; }\n\n.fa-subscript:before {\n  content: \"\\f12c\"; }\n\n.fa-subway:before {\n  content: \"\\f239\"; }\n\n.fa-suitcase:before {\n  content: \"\\f0f2\"; }\n\n.fa-suitcase-rolling:before {\n  content: \"\\f5c1\"; }\n\n.fa-sun:before {\n  content: \"\\f185\"; }\n\n.fa-superpowers:before {\n  content: \"\\f2dd\"; }\n\n.fa-superscript:before {\n  content: \"\\f12b\"; }\n\n.fa-supple:before {\n  content: \"\\f3f9\"; }\n\n.fa-surprise:before {\n  content: \"\\f5c2\"; }\n\n.fa-suse:before {\n  content: \"\\f7d6\"; }\n\n.fa-swatchbook:before {\n  content: \"\\f5c3\"; }\n\n.fa-swimmer:before {\n  content: \"\\f5c4\"; }\n\n.fa-swimming-pool:before {\n  content: \"\\f5c5\"; }\n\n.fa-synagogue:before {\n  content: \"\\f69b\"; }\n\n.fa-sync:before {\n  content: \"\\f021\"; }\n\n.fa-sync-alt:before {\n  content: \"\\f2f1\"; }\n\n.fa-syringe:before {\n  content: \"\\f48e\"; }\n\n.fa-table:before {\n  content: \"\\f0ce\"; }\n\n.fa-table-tennis:before {\n  content: \"\\f45d\"; }\n\n.fa-tablet:before {\n  content: \"\\f10a\"; }\n\n.fa-tablet-alt:before {\n  content: \"\\f3fa\"; }\n\n.fa-tablets:before {\n  content: \"\\f490\"; }\n\n.fa-tachometer-alt:before {\n  content: \"\\f3fd\"; }\n\n.fa-tag:before {\n  content: \"\\f02b\"; }\n\n.fa-tags:before {\n  content: \"\\f02c\"; }\n\n.fa-tape:before {\n  content: \"\\f4db\"; }\n\n.fa-tasks:before {\n  content: \"\\f0ae\"; }\n\n.fa-taxi:before {\n  content: \"\\f1ba\"; }\n\n.fa-teamspeak:before {\n  content: \"\\f4f9\"; }\n\n.fa-teeth:before {\n  content: \"\\f62e\"; }\n\n.fa-teeth-open:before {\n  content: \"\\f62f\"; }\n\n.fa-telegram:before {\n  content: \"\\f2c6\"; }\n\n.fa-telegram-plane:before {\n  content: \"\\f3fe\"; }\n\n.fa-temperature-high:before {\n  content: \"\\f769\"; }\n\n.fa-temperature-low:before {\n  content: \"\\f76b\"; }\n\n.fa-tencent-weibo:before {\n  content: \"\\f1d5\"; }\n\n.fa-tenge:before {\n  content: \"\\f7d7\"; }\n\n.fa-terminal:before {\n  content: \"\\f120\"; }\n\n.fa-text-height:before {\n  content: \"\\f034\"; }\n\n.fa-text-width:before {\n  content: \"\\f035\"; }\n\n.fa-th:before {\n  content: \"\\f00a\"; }\n\n.fa-th-large:before {\n  content: \"\\f009\"; }\n\n.fa-th-list:before {\n  content: \"\\f00b\"; }\n\n.fa-the-red-yeti:before {\n  content: \"\\f69d\"; }\n\n.fa-theater-masks:before {\n  content: \"\\f630\"; }\n\n.fa-themeco:before {\n  content: \"\\f5c6\"; }\n\n.fa-themeisle:before {\n  content: \"\\f2b2\"; }\n\n.fa-thermometer:before {\n  content: \"\\f491\"; }\n\n.fa-thermometer-empty:before {\n  content: \"\\f2cb\"; }\n\n.fa-thermometer-full:before {\n  content: \"\\f2c7\"; }\n\n.fa-thermometer-half:before {\n  content: \"\\f2c9\"; }\n\n.fa-thermometer-quarter:before {\n  content: \"\\f2ca\"; }\n\n.fa-thermometer-three-quarters:before {\n  content: \"\\f2c8\"; }\n\n.fa-think-peaks:before {\n  content: \"\\f731\"; }\n\n.fa-thumbs-down:before {\n  content: \"\\f165\"; }\n\n.fa-thumbs-up:before {\n  content: \"\\f164\"; }\n\n.fa-thumbtack:before {\n  content: \"\\f08d\"; }\n\n.fa-ticket-alt:before {\n  content: \"\\f3ff\"; }\n\n.fa-times:before {\n  content: \"\\f00d\"; }\n\n.fa-times-circle:before {\n  content: \"\\f057\"; }\n\n.fa-tint:before {\n  content: \"\\f043\"; }\n\n.fa-tint-slash:before {\n  content: \"\\f5c7\"; }\n\n.fa-tired:before {\n  content: \"\\f5c8\"; }\n\n.fa-toggle-off:before {\n  content: \"\\f204\"; }\n\n.fa-toggle-on:before {\n  content: \"\\f205\"; }\n\n.fa-toilet:before {\n  content: \"\\f7d8\"; }\n\n.fa-toilet-paper:before {\n  content: \"\\f71e\"; }\n\n.fa-toolbox:before {\n  content: \"\\f552\"; }\n\n.fa-tools:before {\n  content: \"\\f7d9\"; }\n\n.fa-tooth:before {\n  content: \"\\f5c9\"; }\n\n.fa-torah:before {\n  content: \"\\f6a0\"; }\n\n.fa-torii-gate:before {\n  content: \"\\f6a1\"; }\n\n.fa-tractor:before {\n  content: \"\\f722\"; }\n\n.fa-trade-federation:before {\n  content: \"\\f513\"; }\n\n.fa-trademark:before {\n  content: \"\\f25c\"; }\n\n.fa-traffic-light:before {\n  content: \"\\f637\"; }\n\n.fa-train:before {\n  content: \"\\f238\"; }\n\n.fa-tram:before {\n  content: \"\\f7da\"; }\n\n.fa-transgender:before {\n  content: \"\\f224\"; }\n\n.fa-transgender-alt:before {\n  content: \"\\f225\"; }\n\n.fa-trash:before {\n  content: \"\\f1f8\"; }\n\n.fa-trash-alt:before {\n  content: \"\\f2ed\"; }\n\n.fa-tree:before {\n  content: \"\\f1bb\"; }\n\n.fa-trello:before {\n  content: \"\\f181\"; }\n\n.fa-tripadvisor:before {\n  content: \"\\f262\"; }\n\n.fa-trophy:before {\n  content: \"\\f091\"; }\n\n.fa-truck:before {\n  content: \"\\f0d1\"; }\n\n.fa-truck-loading:before {\n  content: \"\\f4de\"; }\n\n.fa-truck-monster:before {\n  content: \"\\f63b\"; }\n\n.fa-truck-moving:before {\n  content: \"\\f4df\"; }\n\n.fa-truck-pickup:before {\n  content: \"\\f63c\"; }\n\n.fa-tshirt:before {\n  content: \"\\f553\"; }\n\n.fa-tty:before {\n  content: \"\\f1e4\"; }\n\n.fa-tumblr:before {\n  content: \"\\f173\"; }\n\n.fa-tumblr-square:before {\n  content: \"\\f174\"; }\n\n.fa-tv:before {\n  content: \"\\f26c\"; }\n\n.fa-twitch:before {\n  content: \"\\f1e8\"; }\n\n.fa-twitter:before {\n  content: \"\\f099\"; }\n\n.fa-twitter-square:before {\n  content: \"\\f081\"; }\n\n.fa-typo3:before {\n  content: \"\\f42b\"; }\n\n.fa-uber:before {\n  content: \"\\f402\"; }\n\n.fa-ubuntu:before {\n  content: \"\\f7df\"; }\n\n.fa-uikit:before {\n  content: \"\\f403\"; }\n\n.fa-umbrella:before {\n  content: \"\\f0e9\"; }\n\n.fa-umbrella-beach:before {\n  content: \"\\f5ca\"; }\n\n.fa-underline:before {\n  content: \"\\f0cd\"; }\n\n.fa-undo:before {\n  content: \"\\f0e2\"; }\n\n.fa-undo-alt:before {\n  content: \"\\f2ea\"; }\n\n.fa-uniregistry:before {\n  content: \"\\f404\"; }\n\n.fa-universal-access:before {\n  content: \"\\f29a\"; }\n\n.fa-university:before {\n  content: \"\\f19c\"; }\n\n.fa-unlink:before {\n  content: \"\\f127\"; }\n\n.fa-unlock:before {\n  content: \"\\f09c\"; }\n\n.fa-unlock-alt:before {\n  content: \"\\f13e\"; }\n\n.fa-untappd:before {\n  content: \"\\f405\"; }\n\n.fa-upload:before {\n  content: \"\\f093\"; }\n\n.fa-ups:before {\n  content: \"\\f7e0\"; }\n\n.fa-usb:before {\n  content: \"\\f287\"; }\n\n.fa-user:before {\n  content: \"\\f007\"; }\n\n.fa-user-alt:before {\n  content: \"\\f406\"; }\n\n.fa-user-alt-slash:before {\n  content: \"\\f4fa\"; }\n\n.fa-user-astronaut:before {\n  content: \"\\f4fb\"; }\n\n.fa-user-check:before {\n  content: \"\\f4fc\"; }\n\n.fa-user-circle:before {\n  content: \"\\f2bd\"; }\n\n.fa-user-clock:before {\n  content: \"\\f4fd\"; }\n\n.fa-user-cog:before {\n  content: \"\\f4fe\"; }\n\n.fa-user-edit:before {\n  content: \"\\f4ff\"; }\n\n.fa-user-friends:before {\n  content: \"\\f500\"; }\n\n.fa-user-graduate:before {\n  content: \"\\f501\"; }\n\n.fa-user-injured:before {\n  content: \"\\f728\"; }\n\n.fa-user-lock:before {\n  content: \"\\f502\"; }\n\n.fa-user-md:before {\n  content: \"\\f0f0\"; }\n\n.fa-user-minus:before {\n  content: \"\\f503\"; }\n\n.fa-user-ninja:before {\n  content: \"\\f504\"; }\n\n.fa-user-plus:before {\n  content: \"\\f234\"; }\n\n.fa-user-secret:before {\n  content: \"\\f21b\"; }\n\n.fa-user-shield:before {\n  content: \"\\f505\"; }\n\n.fa-user-slash:before {\n  content: \"\\f506\"; }\n\n.fa-user-tag:before {\n  content: \"\\f507\"; }\n\n.fa-user-tie:before {\n  content: \"\\f508\"; }\n\n.fa-user-times:before {\n  content: \"\\f235\"; }\n\n.fa-users:before {\n  content: \"\\f0c0\"; }\n\n.fa-users-cog:before {\n  content: \"\\f509\"; }\n\n.fa-usps:before {\n  content: \"\\f7e1\"; }\n\n.fa-ussunnah:before {\n  content: \"\\f407\"; }\n\n.fa-utensil-spoon:before {\n  content: \"\\f2e5\"; }\n\n.fa-utensils:before {\n  content: \"\\f2e7\"; }\n\n.fa-vaadin:before {\n  content: \"\\f408\"; }\n\n.fa-vector-square:before {\n  content: \"\\f5cb\"; }\n\n.fa-venus:before {\n  content: \"\\f221\"; }\n\n.fa-venus-double:before {\n  content: \"\\f226\"; }\n\n.fa-venus-mars:before {\n  content: \"\\f228\"; }\n\n.fa-viacoin:before {\n  content: \"\\f237\"; }\n\n.fa-viadeo:before {\n  content: \"\\f2a9\"; }\n\n.fa-viadeo-square:before {\n  content: \"\\f2aa\"; }\n\n.fa-vial:before {\n  content: \"\\f492\"; }\n\n.fa-vials:before {\n  content: \"\\f493\"; }\n\n.fa-viber:before {\n  content: \"\\f409\"; }\n\n.fa-video:before {\n  content: \"\\f03d\"; }\n\n.fa-video-slash:before {\n  content: \"\\f4e2\"; }\n\n.fa-vihara:before {\n  content: \"\\f6a7\"; }\n\n.fa-vimeo:before {\n  content: \"\\f40a\"; }\n\n.fa-vimeo-square:before {\n  content: \"\\f194\"; }\n\n.fa-vimeo-v:before {\n  content: \"\\f27d\"; }\n\n.fa-vine:before {\n  content: \"\\f1ca\"; }\n\n.fa-vk:before {\n  content: \"\\f189\"; }\n\n.fa-vnv:before {\n  content: \"\\f40b\"; }\n\n.fa-volleyball-ball:before {\n  content: \"\\f45f\"; }\n\n.fa-volume-down:before {\n  content: \"\\f027\"; }\n\n.fa-volume-mute:before {\n  content: \"\\f6a9\"; }\n\n.fa-volume-off:before {\n  content: \"\\f026\"; }\n\n.fa-volume-up:before {\n  content: \"\\f028\"; }\n\n.fa-vote-yea:before {\n  content: \"\\f772\"; }\n\n.fa-vr-cardboard:before {\n  content: \"\\f729\"; }\n\n.fa-vuejs:before {\n  content: \"\\f41f\"; }\n\n.fa-walking:before {\n  content: \"\\f554\"; }\n\n.fa-wallet:before {\n  content: \"\\f555\"; }\n\n.fa-warehouse:before {\n  content: \"\\f494\"; }\n\n.fa-water:before {\n  content: \"\\f773\"; }\n\n.fa-weebly:before {\n  content: \"\\f5cc\"; }\n\n.fa-weibo:before {\n  content: \"\\f18a\"; }\n\n.fa-weight:before {\n  content: \"\\f496\"; }\n\n.fa-weight-hanging:before {\n  content: \"\\f5cd\"; }\n\n.fa-weixin:before {\n  content: \"\\f1d7\"; }\n\n.fa-whatsapp:before {\n  content: \"\\f232\"; }\n\n.fa-whatsapp-square:before {\n  content: \"\\f40c\"; }\n\n.fa-wheelchair:before {\n  content: \"\\f193\"; }\n\n.fa-whmcs:before {\n  content: \"\\f40d\"; }\n\n.fa-wifi:before {\n  content: \"\\f1eb\"; }\n\n.fa-wikipedia-w:before {\n  content: \"\\f266\"; }\n\n.fa-wind:before {\n  content: \"\\f72e\"; }\n\n.fa-window-close:before {\n  content: \"\\f410\"; }\n\n.fa-window-maximize:before {\n  content: \"\\f2d0\"; }\n\n.fa-window-minimize:before {\n  content: \"\\f2d1\"; }\n\n.fa-window-restore:before {\n  content: \"\\f2d2\"; }\n\n.fa-windows:before {\n  content: \"\\f17a\"; }\n\n.fa-wine-bottle:before {\n  content: \"\\f72f\"; }\n\n.fa-wine-glass:before {\n  content: \"\\f4e3\"; }\n\n.fa-wine-glass-alt:before {\n  content: \"\\f5ce\"; }\n\n.fa-wix:before {\n  content: \"\\f5cf\"; }\n\n.fa-wizards-of-the-coast:before {\n  content: \"\\f730\"; }\n\n.fa-wolf-pack-battalion:before {\n  content: \"\\f514\"; }\n\n.fa-won-sign:before {\n  content: \"\\f159\"; }\n\n.fa-wordpress:before {\n  content: \"\\f19a\"; }\n\n.fa-wordpress-simple:before {\n  content: \"\\f411\"; }\n\n.fa-wpbeginner:before {\n  content: \"\\f297\"; }\n\n.fa-wpexplorer:before {\n  content: \"\\f2de\"; }\n\n.fa-wpforms:before {\n  content: \"\\f298\"; }\n\n.fa-wpressr:before {\n  content: \"\\f3e4\"; }\n\n.fa-wrench:before {\n  content: \"\\f0ad\"; }\n\n.fa-x-ray:before {\n  content: \"\\f497\"; }\n\n.fa-xbox:before {\n  content: \"\\f412\"; }\n\n.fa-xing:before {\n  content: \"\\f168\"; }\n\n.fa-xing-square:before {\n  content: \"\\f169\"; }\n\n.fa-y-combinator:before {\n  content: \"\\f23b\"; }\n\n.fa-yahoo:before {\n  content: \"\\f19e\"; }\n\n.fa-yandex:before {\n  content: \"\\f413\"; }\n\n.fa-yandex-international:before {\n  content: \"\\f414\"; }\n\n.fa-yarn:before {\n  content: \"\\f7e3\"; }\n\n.fa-yelp:before {\n  content: \"\\f1e9\"; }\n\n.fa-yen-sign:before {\n  content: \"\\f157\"; }\n\n.fa-yin-yang:before {\n  content: \"\\f6ad\"; }\n\n.fa-yoast:before {\n  content: \"\\f2b1\"; }\n\n.fa-youtube:before {\n  content: \"\\f167\"; }\n\n.fa-youtube-square:before {\n  content: \"\\f431\"; }\n\n.fa-zhihu:before {\n  content: \"\\f63f\"; }\n\n.sr-only {\n  border: 0;\n  clip: rect(0, 0, 0, 0);\n  height: 1px;\n  margin: -1px;\n  overflow: hidden;\n  padding: 0;\n  position: absolute;\n  width: 1px; }\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n  clip: auto;\n  height: auto;\n  margin: 0;\n  overflow: visible;\n  position: static;\n  width: auto; }\n@font-face {\n  font-family: 'Font Awesome 5 Brands';\n  font-style: normal;\n  font-weight: normal;\n  src: url(\"../webfonts/fa-brands-400.eot\");\n  src: url(\"../webfonts/fa-brands-400.eot?#iefix\") format(\"embedded-opentype\"), url(\"../webfonts/fa-brands-400.woff2\") format(\"woff2\"), url(\"../webfonts/fa-brands-400.woff\") format(\"woff\"), url(\"../webfonts/fa-brands-400.ttf\") format(\"truetype\"), url(\"../webfonts/fa-brands-400.svg#fontawesome\") format(\"svg\"); }\n\n.fab {\n  font-family: 'Font Awesome 5 Brands'; }\n@font-face {\n  font-family: 'Font Awesome 5 Free';\n  font-style: normal;\n  font-weight: 400;\n  src: url(\"../webfonts/fa-regular-400.eot\");\n  src: url(\"../webfonts/fa-regular-400.eot?#iefix\") format(\"embedded-opentype\"), url(\"../webfonts/fa-regular-400.woff2\") format(\"woff2\"), url(\"../webfonts/fa-regular-400.woff\") format(\"woff\"), url(\"../webfonts/fa-regular-400.ttf\") format(\"truetype\"), url(\"../webfonts/fa-regular-400.svg#fontawesome\") format(\"svg\"); }\n\n.far {\n  font-family: 'Font Awesome 5 Free';\n  font-weight: 400; }\n@font-face {\n  font-family: 'Font Awesome 5 Free';\n  font-style: normal;\n  font-weight: 900;\n  src: url(\"../webfonts/fa-solid-900.eot\");\n  src: url(\"../webfonts/fa-solid-900.eot?#iefix\") format(\"embedded-opentype\"), url(\"../webfonts/fa-solid-900.woff2\") format(\"woff2\"), url(\"../webfonts/fa-solid-900.woff\") format(\"woff\"), url(\"../webfonts/fa-solid-900.ttf\") format(\"truetype\"), url(\"../webfonts/fa-solid-900.svg#fontawesome\") format(\"svg\"); }\n\n.fa,\n.fas {\n  font-family: 'Font Awesome 5 Free';\n  font-weight: 900; }\n"
  },
  {
    "path": "easyflow-flow-bpmn/static/plugins/jquery/jquery-3.6.0.js",
    "content": "/*!\n * jQuery JavaScript Library v3.6.0\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * Copyright OpenJS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2021-03-02T17:08Z\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar flat = arr.flat ? function( array ) {\n\treturn arr.flat.call( array );\n} : function( array ) {\n\treturn arr.concat.apply( [], array );\n};\n\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\nvar isFunction = function isFunction( obj ) {\n\n\t\t// Support: Chrome <=57, Firefox <=52\n\t\t// In some browsers, typeof returns \"function\" for HTML <object> elements\n\t\t// (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n\t\t// We don't want to classify *any* DOM node as a function.\n\t\t// Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5\n\t\t// Plus for old WebKit, typeof returns \"function\" for HTML collections\n\t\t// (e.g., `typeof document.getElementsByTagName(\"div\") === \"function\"`). (gh-4756)\n\t\treturn typeof obj === \"function\" && typeof obj.nodeType !== \"number\" &&\n\t\t\ttypeof obj.item !== \"function\";\n\t};\n\n\nvar isWindow = function isWindow( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t};\n\n\nvar document = window.document;\n\n\n\n\tvar preservedScriptAttributes = {\n\t\ttype: true,\n\t\tsrc: true,\n\t\tnonce: true,\n\t\tnoModule: true\n\t};\n\n\tfunction DOMEval( code, node, doc ) {\n\t\tdoc = doc || document;\n\n\t\tvar i, val,\n\t\t\tscript = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tif ( node ) {\n\t\t\tfor ( i in preservedScriptAttributes ) {\n\n\t\t\t\t// Support: Firefox 64+, Edge 18+\n\t\t\t\t// Some browsers don't support the \"nonce\" property on scripts.\n\t\t\t\t// On the other hand, just using `getAttribute` is not enough as\n\t\t\t\t// the `nonce` attribute is reset to an empty string whenever it\n\t\t\t\t// becomes browsing-context connected.\n\t\t\t\t// See https://github.com/whatwg/html/issues/2369\n\t\t\t\t// See https://html.spec.whatwg.org/#nonce-attributes\n\t\t\t\t// The `node.getAttribute` check was added for the sake of\n\t\t\t\t// `jQuery.globalEval` so that it can fake a nonce-containing node\n\t\t\t\t// via an object.\n\t\t\t\tval = node[ i ] || node.getAttribute && node.getAttribute( i );\n\t\t\t\tif ( val ) {\n\t\t\t\t\tscript.setAttribute( i, val );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n\n\nfunction toType( obj ) {\n\tif ( obj == null ) {\n\t\treturn obj + \"\";\n\t}\n\n\t// Support: Android <=2.3 only (functionish RegExp)\n\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\ttypeof obj;\n}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar\n\tversion = \"3.6.0\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t};\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teven: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn ( i + 1 ) % 2;\n\t\t} ) );\n\t},\n\n\todd: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn i % 2;\n\t\t} ) );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent Object.prototype pollution\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( name === \"__proto__\" || target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) {\n\t\t\t\t\tsrc = target[ name ];\n\n\t\t\t\t\t// Ensure proper type for the source value\n\t\t\t\t\tif ( copyIsArray && !Array.isArray( src ) ) {\n\t\t\t\t\t\tclone = [];\n\t\t\t\t\t} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {\n\t\t\t\t\t\tclone = {};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src;\n\t\t\t\t\t}\n\t\t\t\t\tcopyIsArray = false;\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\t// Evaluates a script in a provided context; falls back to the global one\n\t// if not specified.\n\tglobalEval: function( code, options, doc ) {\n\t\tDOMEval( code, { nonce: options && options.nonce }, doc );\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn flat( ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\n\tfunction( _i, name ) {\n\t\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n\t} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = toType( obj );\n\n\tif ( isFunction( obj ) || isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.3.6\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://js.foundation/\n *\n * Date: 2021-02-16\n */\n( function( window ) {\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tnonnativeSelectorCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// Instance methods\n\thasOwn = ( {} ).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpushNative = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\n\t// Use a stripped-down indexOf as it's faster than native\n\t// https://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[ i ] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|\" +\n\t\t\"ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\n\t// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram\n\tidentifier = \"(?:\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace +\n\t\t\"?|\\\\\\\\[^\\\\r\\\\n\\\\f]|[\\\\w-]|[^\\0-\\\\x7f])+\",\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\n\t\t// \"Attribute values must be CSS identifiers [capture 5]\n\t\t// or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" +\n\t\twhitespace + \"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" +\n\t\twhitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace +\n\t\t\"*\" ),\n\trdescend = new RegExp( whitespace + \"|>\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" +\n\t\t\twhitespace + \"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" +\n\t\t\twhitespace + \"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace +\n\t\t\t\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" + whitespace +\n\t\t\t\"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trhtml = /HTML$/i,\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace + \"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\", \"g\" ),\n\tfunescape = function( escape, nonHex ) {\n\t\tvar high = \"0x\" + escape.slice( 1 ) - 0x10000;\n\n\t\treturn nonHex ?\n\n\t\t\t// Strip the backslash prefix from a non-hex escape sequence\n\t\t\tnonHex :\n\n\t\t\t// Replace a hexadecimal escape sequence with the encoded Unicode code point\n\t\t\t// Support: IE <=11+\n\t\t\t// For values outside the Basic Multilingual Plane (BMP), manually construct a\n\t\t\t// surrogate pair\n\t\t\thigh < 0 ?\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// CSS string/identifier serialization\n\t// https://drafts.csswg.org/cssom/#common-serializing-idioms\n\trcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,\n\tfcssescape = function( ch, asCodePoint ) {\n\t\tif ( asCodePoint ) {\n\n\t\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\t\tif ( ch === \"\\0\" ) {\n\t\t\t\treturn \"\\uFFFD\";\n\t\t\t}\n\n\t\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\t\treturn ch.slice( 0, -1 ) + \"\\\\\" +\n\t\t\t\tch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t\t}\n\n\t\t// Other potentially-special ASCII characters get backslash-escaped\n\t\treturn \"\\\\\" + ch;\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tinDisabledFieldset = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && elem.nodeName.toLowerCase() === \"fieldset\";\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t( arr = slice.call( preferredDoc.childNodes ) ),\n\t\tpreferredDoc.childNodes\n\t);\n\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\t// eslint-disable-next-line no-unused-expressions\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpushNative.apply( target, slice.call( els ) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( ( target[ j++ ] = els[ i++ ] ) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\t\tsetDocument( context );\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( ( m = match[ 1 ] ) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( ( elem = context.getElementById( m ) ) ) {\n\n\t\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && ( elem = newContext.getElementById( m ) ) &&\n\t\t\t\t\t\t\tcontains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[ 2 ] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&\n\t\t\t\t\tcontext.getElementsByClassName ) {\n\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( support.qsa &&\n\t\t\t\t!nonnativeSelectorCache[ selector + \" \" ] &&\n\t\t\t\t( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&\n\n\t\t\t\t// Support: IE 8 only\n\t\t\t\t// Exclude object elements\n\t\t\t\t( nodeType !== 1 || context.nodeName.toLowerCase() !== \"object\" ) ) {\n\n\t\t\t\tnewSelector = selector;\n\t\t\t\tnewContext = context;\n\n\t\t\t\t// qSA considers elements outside a scoping root when evaluating child or\n\t\t\t\t// descendant combinators, which is not what we want.\n\t\t\t\t// In such cases, we work around the behavior by prefixing every selector in the\n\t\t\t\t// list with an ID selector referencing the scope context.\n\t\t\t\t// The technique has to be used as well when a leading combinator is used\n\t\t\t\t// as such selectors are not recognized by querySelectorAll.\n\t\t\t\t// Thanks to Andrew Dupont for this technique.\n\t\t\t\tif ( nodeType === 1 &&\n\t\t\t\t\t( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\n\t\t\t\t\t// We can use :scope instead of the ID hack if the browser\n\t\t\t\t\t// supports it & if we're not changing the context.\n\t\t\t\t\tif ( newContext !== context || !support.scope ) {\n\n\t\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\t\tif ( ( nid = context.getAttribute( \"id\" ) ) ) {\n\t\t\t\t\t\t\tnid = nid.replace( rcssescape, fcssescape );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcontext.setAttribute( \"id\", ( nid = expando ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[ i ] = ( nid ? \"#\" + nid : \":scope\" ) + \" \" +\n\t\t\t\t\t\t\ttoSelector( groups[ i ] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\tnonnativeSelectorCache( selector, true );\n\t\t\t\t} finally {\n\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn ( cache[ key + \" \" ] = value );\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement( \"fieldset\" );\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch ( e ) {\n\t\treturn false;\n\t} finally {\n\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split( \"|\" ),\n\t\ti = arr.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[ i ] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\ta.sourceIndex - b.sourceIndex;\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( ( cur = cur.nextSibling ) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn ( name === \"input\" || name === \"button\" ) && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\t/* jshint -W018 */\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\tinDisabledFieldset( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction( function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction( function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ ( j = matchIndexes[ i ] ) ] ) {\n\t\t\t\t\tseed[ j ] = !( matches[ j ] = seed[ j ] );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t} );\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\tvar namespace = elem && elem.namespaceURI,\n\t\tdocElem = elem && ( elem.ownerDocument || elem ).documentElement;\n\n\t// Support: IE <=8\n\t// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes\n\t// https://bugs.jquery.com/ticket/4833\n\treturn !rhtml.test( namespace || docElem && docElem.nodeName || \"HTML\" );\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocElem = document.documentElement;\n\tdocumentIsHTML = !isXML( document );\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( preferredDoc != document &&\n\t\t( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 11, Edge\n\t\tif ( subWindow.addEventListener ) {\n\t\t\tsubWindow.addEventListener( \"unload\", unloadHandler, false );\n\n\t\t// Support: IE 9 - 10 only\n\t\t} else if ( subWindow.attachEvent ) {\n\t\t\tsubWindow.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t// Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,\n\t// Safari 4 - 5 only, Opera <=11.6 - 12.x only\n\t// IE/Edge & older browsers don't support the :scope pseudo-class.\n\t// Support: Safari 6.0 only\n\t// Safari 6.0 supports :scope but it's an alias of :root there.\n\tsupport.scope = assert( function( el ) {\n\t\tdocElem.appendChild( el ).appendChild( document.createElement( \"div\" ) );\n\t\treturn typeof el.querySelectorAll !== \"undefined\" &&\n\t\t\t!el.querySelectorAll( \":scope fieldset div\" ).length;\n\t} );\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert( function( el ) {\n\t\tel.className = \"i\";\n\t\treturn !el.getAttribute( \"className\" );\n\t} );\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert( function( el ) {\n\t\tel.appendChild( document.createComment( \"\" ) );\n\t\treturn !el.getElementsByTagName( \"*\" ).length;\n\t} );\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert( function( el ) {\n\t\tdocElem.appendChild( el ).id = expando;\n\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\n\t} );\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter[ \"ID\" ] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute( \"id\" ) === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find[ \"ID\" ] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter[ \"ID\" ] =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode( \"id\" );\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find[ \"ID\" ] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( ( elem = elems[ i++ ] ) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[ \"TAG\" ] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[ \"CLASS\" ] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See https://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {\n\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert( function( el ) {\n\n\t\t\tvar input;\n\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// https://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( el ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\r\\\\' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( el.querySelectorAll( \"[msallowcapture^='']\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !el.querySelectorAll( \"[selected]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n\t\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"~=\" );\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 15 - 18+\n\t\t\t// IE 11/Edge don't find elements on a `[name='']` query in some cases.\n\t\t\t// Adding a temporary attribute to the document before the selection works\n\t\t\t// around the issue.\n\t\t\t// Interestingly, IE 10 & older don't seem to have the issue.\n\t\t\tinput = document.createElement( \"input\" );\n\t\t\tinput.setAttribute( \"name\", \"\" );\n\t\t\tel.appendChild( input );\n\t\t\tif ( !el.querySelectorAll( \"[name='']\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*name\" + whitespace + \"*=\" +\n\t\t\t\t\twhitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !el.querySelectorAll( \":checked\" ).length ) {\n\t\t\t\trbuggyQSA.push( \":checked\" );\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push( \".#.+[+~]\" );\n\t\t\t}\n\n\t\t\t// Support: Firefox <=3.6 - 5 only\n\t\t\t// Old Firefox doesn't throw on a badly-escaped identifier.\n\t\t\tel.querySelectorAll( \"\\\\\\f\" );\n\t\t\trbuggyQSA.push( \"[\\\\r\\\\n\\\\f]\" );\n\t\t} );\n\n\t\tassert( function( el ) {\n\t\t\tel.innerHTML = \"<a href='' disabled='disabled'></a>\" +\n\t\t\t\t\"<select disabled='disabled'><option/></select>\";\n\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = document.createElement( \"input\" );\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( el.querySelectorAll( \"[name=d]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( el.querySelectorAll( \":enabled\" ).length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t\tdocElem.appendChild( el ).disabled = true;\n\t\t\tif ( el.querySelectorAll( \":disabled\" ).length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: Opera 10 - 11 only\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tel.querySelectorAll( \"*,:x\" );\n\t\t\trbuggyQSA.push( \",.*:\" );\n\t\t} );\n\t}\n\n\tif ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector ) ) ) ) {\n\n\t\tassert( function( el ) {\n\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( el, \"*\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( el, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t} );\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( \"|\" ) );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( \"|\" ) );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully self-exclusive\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t) );\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( ( b = b.parentNode ) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t// two documents; shallow comparisons work.\n\t\t// eslint-disable-next-line eqeqeq\n\t\tcompare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( a == document || a.ownerDocument == preferredDoc &&\n\t\t\t\tcontains( preferredDoc, a ) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( b == document || b.ownerDocument == preferredDoc &&\n\t\t\t\tcontains( preferredDoc, b ) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t/* eslint-disable eqeqeq */\n\t\t\treturn a == document ? -1 :\n\t\t\t\tb == document ? 1 :\n\t\t\t\t/* eslint-enable eqeqeq */\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( ( cur = cur.parentNode ) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( ( cur = cur.parentNode ) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[ i ] === bp[ i ] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[ i ], bp[ i ] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t/* eslint-disable eqeqeq */\n\t\t\tap[ i ] == preferredDoc ? -1 :\n\t\t\tbp[ i ] == preferredDoc ? 1 :\n\t\t\t/* eslint-enable eqeqeq */\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\tsetDocument( elem );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t!nonnativeSelectorCache[ expr + \" \" ] &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\n\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t// fragment in IE 9\n\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\tnonnativeSelectorCache( expr, true );\n\t\t}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( context.ownerDocument || context ) != document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( elem.ownerDocument || elem ) != document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t( val = elem.getAttributeNode( name ) ) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.escape = function( sel ) {\n\treturn ( sel + \"\" ).replace( rcssescape, fcssescape );\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( ( node = elem[ i++ ] ) ) {\n\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[ 1 ] = match[ 1 ].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[ 3 ] = ( match[ 3 ] || match[ 4 ] ||\n\t\t\t\tmatch[ 5 ] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[ 2 ] === \"~=\" ) {\n\t\t\t\tmatch[ 3 ] = \" \" + match[ 3 ] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[ 1 ] = match[ 1 ].toLowerCase();\n\n\t\t\tif ( match[ 1 ].slice( 0, 3 ) === \"nth\" ) {\n\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[ 3 ] ) {\n\t\t\t\t\tSizzle.error( match[ 0 ] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[ 4 ] = +( match[ 4 ] ?\n\t\t\t\t\tmatch[ 5 ] + ( match[ 6 ] || 1 ) :\n\t\t\t\t\t2 * ( match[ 3 ] === \"even\" || match[ 3 ] === \"odd\" ) );\n\t\t\t\tmatch[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === \"odd\" );\n\n\t\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[ 3 ] ) {\n\t\t\t\tSizzle.error( match[ 0 ] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[ 6 ] && match[ 2 ];\n\n\t\t\tif ( matchExpr[ \"CHILD\" ].test( match[ 0 ] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[ 3 ] ) {\n\t\t\t\tmatch[ 2 ] = match[ 4 ] || match[ 5 ] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t( excess = tokenize( unquoted, true ) ) &&\n\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t( excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length ) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[ 0 ] = match[ 0 ].slice( 0, excess );\n\t\t\t\tmatch[ 2 ] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() {\n\t\t\t\t\treturn true;\n\t\t\t\t} :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t( pattern = new RegExp( \"(^|\" + whitespace +\n\t\t\t\t\t\")\" + className + \"(\" + whitespace + \"|$)\" ) ) && classCache(\n\t\t\t\t\t\tclassName, function( elem ) {\n\t\t\t\t\t\t\treturn pattern.test(\n\t\t\t\t\t\t\t\ttypeof elem.className === \"string\" && elem.className ||\n\t\t\t\t\t\t\t\ttypeof elem.getAttribute !== \"undefined\" &&\n\t\t\t\t\t\t\t\t\telem.getAttribute( \"class\" ) ||\n\t\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t\t\t);\n\t\t\t\t} );\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\t/* eslint-disable max-len */\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t\t/* eslint-enable max-len */\n\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, _argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tvar cache, uniqueCache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( ( node = node[ dir ] ) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\n\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\tnode = parent;\n\t\t\t\t\t\t\touterCache = node[ expando ] || ( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\n\t\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\touterCache = node[ expando ] || ( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction( function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[ i ] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} ) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction( function( selector ) {\n\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction( function( seed, matches, _context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\t\t\t\t\tseed[ i ] = !( matches[ i ] = elem );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} ) :\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tinput[ 0 ] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[ 0 ] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t} ),\n\n\t\t\"has\": markFunction( function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t} ),\n\n\t\t\"contains\": markFunction( function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t} ),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test( lang || \"\" ) ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( ( elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute( \"xml:lang\" ) || elem.getAttribute( \"lang\" ) ) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t} ),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement &&\n\t\t\t\t( !document.hasFocus || document.hasFocus() ) &&\n\t\t\t\t!!( elem.type || elem.href || ~elem.tabIndex );\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": createDisabledPseudo( false ),\n\t\t\"disabled\": createDisabledPseudo( true ),\n\n\t\t\"checked\": function( elem ) {\n\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn ( nodeName === \"input\" && !!elem.checked ) ||\n\t\t\t\t( nodeName === \"option\" && !!elem.selected );\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\t// eslint-disable-next-line no-unused-expressions\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t//   but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[ \"empty\" ]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( ( attr = elem.getAttribute( \"type\" ) ) == null ||\n\t\t\t\t\tattr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo( function() {\n\t\t\treturn [ 0 ];\n\t\t} ),\n\n\t\t\"last\": createPositionalPseudo( function( _matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t} ),\n\n\t\t\"eq\": createPositionalPseudo( function( _matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t} ),\n\n\t\t\"even\": createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"odd\": createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"lt\": createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ?\n\t\t\t\targument + length :\n\t\t\t\targument > length ?\n\t\t\t\t\tlength :\n\t\t\t\t\targument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"gt\": createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} )\n\t}\n};\n\nExpr.pseudos[ \"nth\" ] = Expr.pseudos[ \"eq\" ];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || ( match = rcomma.exec( soFar ) ) ) {\n\t\t\tif ( match ) {\n\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[ 0 ].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( ( tokens = [] ) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( ( match = rcombinators.exec( soFar ) ) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push( {\n\t\t\t\tvalue: matched,\n\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[ 0 ].replace( rtrim, \" \" )\n\t\t\t} );\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||\n\t\t\t\t( match = preFilters[ type ]( match ) ) ) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push( {\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t} );\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[ i ].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tskip = combinator.next,\n\t\tkey = skip || dir,\n\t\tcheckNonElements = base && key === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, uniqueCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || ( elem[ expando ] = {} );\n\n\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\tuniqueCache = outerCache[ elem.uniqueID ] ||\n\t\t\t\t\t\t\t( outerCache[ elem.uniqueID ] = {} );\n\n\t\t\t\t\t\tif ( skip && skip === elem.nodeName.toLowerCase() ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( ( oldCache = uniqueCache[ key ] ) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn ( newCache[ 2 ] = oldCache[ 2 ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\tuniqueCache[ key ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[ i ]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[ 0 ];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[ i ], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction( function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts(\n\t\t\t\tselector || \"*\",\n\t\t\t\tcontext.nodeType ? [ context ] : context,\n\t\t\t\t[]\n\t\t\t),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( ( elem = temp[ i ] ) ) {\n\t\t\t\t\tmatcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) ) {\n\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( ( matcherIn[ i ] = elem ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, ( matcherOut = [] ), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) &&\n\t\t\t\t\t\t( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {\n\n\t\t\t\t\t\tseed[ temp ] = !( results[ temp ] = elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t} );\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[ 0 ].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[ \" \" ],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t( checkContext = context ).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {\n\t\t\tmatchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[ j ].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\n\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\ttokens\n\t\t\t\t\t\t.slice( 0, i - 1 )\n\t\t\t\t\t\t.concat( { value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" } )\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[ \"TAG\" ]( \"*\", outermost ),\n\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\n\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\toutermostContext = context == document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\n\t\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\t\tif ( !context && elem.ownerDocument != document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( ( matcher = elementMatchers[ j++ ] ) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( ( elem = !matcher && elem ) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( ( matcher = setMatchers[ j++ ] ) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !( unmatched[ i ] || setMatched[ i ] ) ) {\n\t\t\t\t\t\t\t\tsetMatched[ i ] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[ i ] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache(\n\t\t\tselector,\n\t\t\tmatcherFromGroupMatchers( elementMatchers, setMatchers )\n\t\t);\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n *  selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n *  selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( ( selector = compiled.selector || selector ) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[ 0 ] = match[ 0 ].slice( 0 );\n\t\tif ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === \"ID\" &&\n\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {\n\n\t\t\tcontext = ( Expr.find[ \"ID\" ]( token.matches[ 0 ]\n\t\t\t\t.replace( runescape, funescape ), context ) || [] )[ 0 ];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[ \"needsContext\" ].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[ i ];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ ( type = token.type ) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( ( find = Expr.find[ type ] ) ) {\n\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( ( seed = find(\n\t\t\t\t\ttoken.matches[ 0 ].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext\n\t\t\t\t) ) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split( \"\" ).sort( sortOrder ).join( \"\" ) === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert( function( el ) {\n\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement( \"fieldset\" ) ) & 1;\n} );\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert( function( el ) {\n\tel.innerHTML = \"<a href='#'></a>\";\n\treturn el.firstChild.getAttribute( \"href\" ) === \"#\";\n} ) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t} );\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert( function( el ) {\n\tel.innerHTML = \"<input/>\";\n\tel.firstChild.setAttribute( \"value\", \"\" );\n\treturn el.firstChild.getAttribute( \"value\" ) === \"\";\n} ) ) {\n\taddHandle( \"value\", function( elem, _name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t} );\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert( function( el ) {\n\treturn el.getAttribute( \"disabled\" ) == null;\n} ) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t( val = elem.getAttributeNode( name ) ) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\t\tnull;\n\t\t}\n\t} );\n}\n\nreturn Sizzle;\n\n} )( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\njQuery.escapeSelector = Sizzle.escape;\n\n\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\n\n\nfunction nodeName( elem, name ) {\n\n\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\n}\nvar rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\t}\n\n\t// Single element\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\t}\n\n\t// Arraylike of elements (jQuery, arguments, Array)\n\tif ( typeof qualifier !== \"string\" ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t\t} );\n\t}\n\n\t// Filtered directly for both simple and complex selectors\n\treturn jQuery.filter( qualifier, elements, not );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\tif ( elems.length === 1 && elem.nodeType === 1 ) {\n\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n\t}\n\n\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\treturn elem.nodeType === 1;\n\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i, ret,\n\t\t\tlen = this.length,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tret = this.pushStack( [] );\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\t// Shortcut simple #id case for speed\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\ttargets = typeof selectors !== \"string\" && jQuery( selectors );\n\n\t\t// Positional selectors never match, since there's no _selection_ context\n\t\tif ( !rneedsContext.test( selectors ) ) {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t\t// Always skip document fragments\n\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ?\n\t\t\t\t\t\ttargets.index( cur ) > -1 :\n\n\t\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\tif ( elem.contentDocument != null &&\n\n\t\t\t// Support: IE 11+\n\t\t\t// <object> elements with no `data` attribute has an object\n\t\t\t// `contentDocument` with a `null` prototype.\n\t\t\tgetProto( elem.contentDocument ) ) {\n\n\t\t\treturn elem.contentDocument;\n\t\t}\n\n\t\t// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n\t\t// Treat the template element as a regular one in browsers that\n\t\t// don't support it.\n\t\tif ( nodeName( elem, \"template\" ) ) {\n\t\t\telem = elem.content || elem;\n\t\t}\n\n\t\treturn jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = locked || options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && toType( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory && !firing ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\nfunction Identity( v ) {\n\treturn v;\n}\nfunction Thrower( ex ) {\n\tthrow ex;\n}\n\nfunction adoptValue( value, resolve, reject, noValue ) {\n\tvar method;\n\n\ttry {\n\n\t\t// Check for promise aspect first to privilege synchronous behavior\n\t\tif ( value && isFunction( ( method = value.promise ) ) ) {\n\t\t\tmethod.call( value ).done( resolve ).fail( reject );\n\n\t\t// Other thenables\n\t\t} else if ( value && isFunction( ( method = value.then ) ) ) {\n\t\t\tmethod.call( value, resolve, reject );\n\n\t\t// Other non-thenables\n\t\t} else {\n\n\t\t\t// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n\t\t\t// * false: [ value ].slice( 0 ) => resolve( value )\n\t\t\t// * true: [ value ].slice( 1 ) => resolve()\n\t\t\tresolve.apply( undefined, [ value ].slice( noValue ) );\n\t\t}\n\n\t// For Promises/A+, convert exceptions into rejections\n\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n\t// Deferred#then to conditionally suppress rejection.\n\t} catch ( value ) {\n\n\t\t// Support: Android 4.0 only\n\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\treject.apply( undefined, [ value ] );\n\t}\n}\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, callbacks,\n\t\t\t\t// ... .then handlers, argument index, [final state]\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"memory\" ), 2 ],\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\t\"catch\": function( fn ) {\n\t\t\t\t\treturn promise.then( null, fn );\n\t\t\t\t},\n\n\t\t\t\t// Keep pipe for back-compat\n\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( _i, tuple ) {\n\n\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress)\n\t\t\t\t\t\t\tvar fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify })\n\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve })\n\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject })\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) {\n\t\t\t\t\tvar maxDepth = 0;\n\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tvar that = this,\n\t\t\t\t\t\t\t\targs = arguments,\n\t\t\t\t\t\t\t\tmightThrow = function() {\n\t\t\t\t\t\t\t\t\tvar returned, then;\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59\n\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts\n\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args );\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48\n\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) {\n\t\t\t\t\t\t\t\t\t\tthrow new TypeError( \"Thenable self-resolution\" );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75\n\t\t\t\t\t\t\t\t\t// Retrieve `then` only once\n\t\t\t\t\t\t\t\t\tthen = returned &&\n\n\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4\n\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64\n\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability\n\t\t\t\t\t\t\t\t\t\t( typeof returned === \"object\" ||\n\t\t\t\t\t\t\t\t\t\t\ttypeof returned === \"function\" ) &&\n\t\t\t\t\t\t\t\t\t\treturned.then;\n\n\t\t\t\t\t\t\t\t\t// Handle a returned thenable\n\t\t\t\t\t\t\t\t\tif ( isFunction( then ) ) {\n\n\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution\n\t\t\t\t\t\t\t\t\t\tif ( special ) {\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special )\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values\n\t\t\t\t\t\t\t\t\t\t\tmaxDepth++;\n\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Handle all other returned values\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) {\n\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\targs = [ returned ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Process the value(s)\n\t\t\t\t\t\t\t\t\t\t// Default process is resolve\n\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions\n\t\t\t\t\t\t\t\tprocess = special ?\n\t\t\t\t\t\t\t\t\tmightThrow :\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tmightThrow();\n\t\t\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) {\n\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e,\n\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.stackTrace );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1\n\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61\n\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions\n\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1\n\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57\n\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from\n\t\t\t\t\t\t\t// subsequent errors\n\t\t\t\t\t\t\tif ( depth ) {\n\t\t\t\t\t\t\t\tprocess();\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Call an optional hook to record the stack, in case of exception\n\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async\n\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.stackTrace = jQuery.Deferred.getStackHook();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twindow.setTimeout( process );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\n\t\t\t\t\t\t// progress_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 0 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onProgress ) ?\n\t\t\t\t\t\t\t\t\tonProgress :\n\t\t\t\t\t\t\t\t\tIdentity,\n\t\t\t\t\t\t\t\tnewDefer.notifyWith\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// fulfilled_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 1 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onFulfilled ) ?\n\t\t\t\t\t\t\t\t\tonFulfilled :\n\t\t\t\t\t\t\t\t\tIdentity\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// rejected_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 2 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onRejected ) ?\n\t\t\t\t\t\t\t\t\tonRejected :\n\t\t\t\t\t\t\t\t\tThrower\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 5 ];\n\n\t\t\t// promise.progress = list.add\n\t\t\t// promise.done = list.add\n\t\t\t// promise.fail = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(\n\t\t\t\t\tfunction() {\n\n\t\t\t\t\t\t// state = \"resolved\" (i.e., fulfilled)\n\t\t\t\t\t\t// state = \"rejected\"\n\t\t\t\t\t\tstate = stateString;\n\t\t\t\t\t},\n\n\t\t\t\t\t// rejected_callbacks.disable\n\t\t\t\t\t// fulfilled_callbacks.disable\n\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable,\n\n\t\t\t\t\t// rejected_handlers.disable\n\t\t\t\t\t// fulfilled_handlers.disable\n\t\t\t\t\ttuples[ 3 - i ][ 3 ].disable,\n\n\t\t\t\t\t// progress_callbacks.lock\n\t\t\t\t\ttuples[ 0 ][ 2 ].lock,\n\n\t\t\t\t\t// progress_handlers.lock\n\t\t\t\t\ttuples[ 0 ][ 3 ].lock\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// progress_handlers.fire\n\t\t\t// fulfilled_handlers.fire\n\t\t\t// rejected_handlers.fire\n\t\t\tlist.add( tuple[ 3 ].fire );\n\n\t\t\t// deferred.notify = function() { deferred.notifyWith(...) }\n\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) }\n\t\t\t// deferred.reject = function() { deferred.rejectWith(...) }\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t// deferred.notifyWith = list.fireWith\n\t\t\t// deferred.resolveWith = list.fireWith\n\t\t\t// deferred.rejectWith = list.fireWith\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( singleValue ) {\n\t\tvar\n\n\t\t\t// count of uncompleted subordinates\n\t\t\tremaining = arguments.length,\n\n\t\t\t// count of unprocessed arguments\n\t\t\ti = remaining,\n\n\t\t\t// subordinate fulfillment data\n\t\t\tresolveContexts = Array( i ),\n\t\t\tresolveValues = slice.call( arguments ),\n\n\t\t\t// the primary Deferred\n\t\t\tprimary = jQuery.Deferred(),\n\n\t\t\t// subordinate callback factory\n\t\t\tupdateFunc = function( i ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tresolveContexts[ i ] = this;\n\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( !( --remaining ) ) {\n\t\t\t\t\t\tprimary.resolveWith( resolveContexts, resolveValues );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t// Single- and empty arguments are adopted like Promise.resolve\n\t\tif ( remaining <= 1 ) {\n\t\t\tadoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,\n\t\t\t\t!remaining );\n\n\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000)\n\t\t\tif ( primary.state() === \"pending\" ||\n\t\t\t\tisFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn primary.then();\n\t\t\t}\n\t\t}\n\n\t\t// Multiple arguments are aggregated like Promise.all array elements\n\t\twhile ( i-- ) {\n\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );\n\t\t}\n\n\t\treturn primary.promise();\n\t}\n} );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\nvar rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\njQuery.Deferred.exceptionHook = function( error, stack ) {\n\n\t// Support: IE 8 - 9 only\n\t// Console exists when dev tools are open, which can happen at any time\n\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n\t\twindow.console.warn( \"jQuery.Deferred exception: \" + error.message, error.stack, stack );\n\t}\n};\n\n\n\n\njQuery.readyException = function( error ) {\n\twindow.setTimeout( function() {\n\t\tthrow error;\n\t} );\n};\n\n\n\n\n// The deferred used on DOM ready\nvar readyList = jQuery.Deferred();\n\njQuery.fn.ready = function( fn ) {\n\n\treadyList\n\t\t.then( fn )\n\n\t\t// Wrap jQuery.readyException in a function so that the lookup\n\t\t// happens at the time of error handling instead of callback\n\t\t// registration.\n\t\t.catch( function( error ) {\n\t\t\tjQuery.readyException( error );\n\t\t} );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\t}\n} );\n\njQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\nif ( document.readyState === \"complete\" ||\n\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\twindow.setTimeout( jQuery.ready );\n\n} else {\n\n\t// Use the handy event callback\n\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t// A fallback to window.onload, that will always work\n\twindow.addEventListener( \"load\", completed );\n}\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( toType( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, _key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\t\tvalue :\n\t\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( chainable ) {\n\t\treturn elems;\n\t}\n\n\t// Gets\n\tif ( bulk ) {\n\t\treturn fn.call( elems );\n\t}\n\n\treturn len ? fn( elems[ 0 ], key ) : emptyGet;\n};\n\n\n// Matches dashed string for camelizing\nvar rmsPrefix = /^-ms-/,\n\trdashAlpha = /-([a-z])/g;\n\n// Used by camelCase as callback to replace()\nfunction fcamelCase( _all, letter ) {\n\treturn letter.toUpperCase();\n}\n\n// Convert dashed to camelCase; used by the css and data modules\n// Support: IE <=9 - 11, Edge 12 - 15\n// Microsoft forgot to hump their vendor prefix (#9572)\nfunction camelCase( string ) {\n\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n}\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t//  - Node\n\t//    - Node.ELEMENT_NODE\n\t//    - Node.DOCUMENT_NODE\n\t//  - Object\n\t//    - Any\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tcache: function( owner ) {\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see #8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\t// Always use camelCase key (gh-2257)\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ camelCase( data ) ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ camelCase( prop ) ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\n\t\t\t// Always use camelCase key (gh-2257)\n\t\t\towner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];\n\t},\n\taccess: function( owner, key, value ) {\n\n\t\t// In cases where either:\n\t\t//\n\t\t//   1. No key was specified\n\t\t//   2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t//   1. The entire cache object\n\t\t//   2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\treturn this.get( owner, key );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t//   1. An object of properties\n\t\t//   2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key !== undefined ) {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( Array.isArray( key ) ) {\n\n\t\t\t\t// If key is an array of keys...\n\t\t\t\t// We always set camelCase keys, so remove that.\n\t\t\t\tkey = key.map( camelCase );\n\t\t\t} else {\n\t\t\t\tkey = camelCase( key );\n\n\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\tkey = key in cache ?\n\t\t\t\t\t[ key ] :\n\t\t\t\t\t( key.match( rnothtmlwhite ) || [] );\n\t\t\t}\n\n\t\t\ti = key.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ key[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <=35 - 45\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction getData( data ) {\n\tif ( data === \"true\" ) {\n\t\treturn true;\n\t}\n\n\tif ( data === \"false\" ) {\n\t\treturn false;\n\t}\n\n\tif ( data === \"null\" ) {\n\t\treturn null;\n\t}\n\n\t// Only convert to a number if it doesn't change the string\n\tif ( data === +data + \"\" ) {\n\t\treturn +data;\n\t}\n\n\tif ( rbrace.test( data ) ) {\n\t\treturn JSON.parse( data );\n\t}\n\n\treturn data;\n}\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = getData( data );\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE 11 only\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// The key will always be camelCased in Data\n\t\t\t\tdata = dataUser.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each( function() {\n\n\t\t\t\t// We always store the camelCased key\n\t\t\t\tdataUser.set( this, key, value );\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || Array.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar documentElement = document.documentElement;\n\n\n\n\tvar isAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem );\n\t\t},\n\t\tcomposed = { composed: true };\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only\n\t// Check attachment across shadow DOM boundaries when possible (gh-3504)\n\t// Support: iOS 10.0-10.2 only\n\t// Early iOS 10 versions support `attachShadow` but not `getRootNode`,\n\t// leading to errors. We need to check for `getRootNode`.\n\tif ( documentElement.getRootNode ) {\n\t\tisAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem ) ||\n\t\t\t\telem.getRootNode( composed ) === elem.ownerDocument;\n\t\t};\n\t}\nvar isHiddenWithinTree = function( elem, el ) {\n\n\t\t// isHiddenWithinTree might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\n\t\t// Inline style trumps all\n\t\treturn elem.style.display === \"none\" ||\n\t\t\telem.style.display === \"\" &&\n\n\t\t\t// Otherwise, check computed style\n\t\t\t// Support: Firefox <=43 - 45\n\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is\n\t\t\t// in the document.\n\t\t\tisAttached( elem ) &&\n\n\t\t\tjQuery.css( elem, \"display\" ) === \"none\";\n\t};\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted, scale,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() {\n\t\t\t\treturn tween.cur();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\treturn jQuery.css( elem, prop, \"\" );\n\t\t\t},\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = elem.nodeType &&\n\t\t\t( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Support: Firefox <=54\n\t\t// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)\n\t\tinitial = initial / 2;\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\twhile ( maxIterations-- ) {\n\n\t\t\t// Evaluate and update our best guess (doubling guesses that zero out).\n\t\t\t// Finish if the scale equals or crosses 1 (making the old*new product non-positive).\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\t\t\tif ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {\n\t\t\t\tmaxIterations = 0;\n\t\t\t}\n\t\t\tinitialInUnit = initialInUnit / scale;\n\n\t\t}\n\n\t\tinitialInUnit = initialInUnit * 2;\n\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\nvar defaultDisplayMap = {};\n\nfunction getDefaultDisplay( elem ) {\n\tvar temp,\n\t\tdoc = elem.ownerDocument,\n\t\tnodeName = elem.nodeName,\n\t\tdisplay = defaultDisplayMap[ nodeName ];\n\n\tif ( display ) {\n\t\treturn display;\n\t}\n\n\ttemp = doc.body.appendChild( doc.createElement( nodeName ) );\n\tdisplay = jQuery.css( temp, \"display\" );\n\n\ttemp.parentNode.removeChild( temp );\n\n\tif ( display === \"none\" ) {\n\t\tdisplay = \"block\";\n\t}\n\tdefaultDisplayMap[ nodeName ] = display;\n\n\treturn display;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\t// Determine new display value for elements that need to change\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n\t\t\t// check is required in this first loop unless we have a nonempty display value (either\n\t\t\t// inline or about-to-be-restored)\n\t\t\tif ( display === \"none\" ) {\n\t\t\t\tvalues[ index ] = dataPriv.get( elem, \"display\" ) || null;\n\t\t\t\tif ( !values[ index ] ) {\n\t\t\t\t\telem.style.display = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n\t\t\t\tvalues[ index ] = getDefaultDisplay( elem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( display !== \"none\" ) {\n\t\t\t\tvalues[ index ] = \"none\";\n\n\t\t\t\t// Remember what we're overwriting\n\t\t\t\tdataPriv.set( elem, \"display\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of the elements in a second loop to avoid constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( values[ index ] != null ) {\n\t\t\telements[ index ].style.display = values[ index ];\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend( {\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHiddenWithinTree( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i );\n\nvar rscriptType = ( /^$|^module$|\\/(?:java|ecma)script/i );\n\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0 - 4.3 only\n\t// Check state lost if the name is set (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Android <=4.1 only\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE <=11 only\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n\n\t// Support: IE <=9 only\n\t// IE <=9 replaces <option> tags with their contents when inserted outside of\n\t// the select element.\n\tdiv.innerHTML = \"<option></option>\";\n\tsupport.option = !!div.lastChild;\n} )();\n\n\n// We have to close these tags to support XHTML (#13200)\nvar wrapMap = {\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting <tbody> or other required elements.\n\tthead: [ 1, \"<table>\", \"</table>\" ],\n\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// Support: IE <=9 only\nif ( !support.option ) {\n\twrapMap.optgroup = wrapMap.option = [ 1, \"<select multiple='multiple'>\", \"</select>\" ];\n}\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (#15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, attached, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( toType( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (#12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tattached = isAttached( elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( attached ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\nvar rtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE <=9 - 11+\n// focus() and blur() are asynchronous, except when they are no-op.\n// So expect focus to be synchronous when the element is already active,\n// and blur to be synchronous when the element is not already active.\n// (focus and blur are always synchronous in other supported browsers,\n// this just defines when we can count on it).\nfunction expectSync( elem, type ) {\n\treturn ( elem === safeActiveElement() ) === ( type === \"focus\" );\n}\n\n// Support: IE <=9 only\n// Accessing document.activeElement can throw unexpectedly\n// https://bugs.jquery.com/ticket/13393\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Only attach events to objects that accept data\n\t\tif ( !acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = Object.create( null );\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\n\t\t\t// Make a writable jQuery.Event from the native event object\n\t\t\tevent = jQuery.event.fix( nativeEvent ),\n\n\t\t\thandlers = (\n\t\t\t\tdataPriv.get( this, \"events\" ) || Object.create( null )\n\t\t\t)[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// If the event is namespaced, then each handler is only invoked if it is\n\t\t\t\t// specially universal or its namespaces are a superset of the event's.\n\t\t\t\tif ( !event.rnamespace || handleObj.namespace === false ||\n\t\t\t\t\tevent.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG <use> instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tclick: {\n\n\t\t\t// Utilize native event to ensure correct state for checkable inputs\n\t\t\tsetup: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Claim the first handler\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\t// dataPriv.set( el, \"click\", ... )\n\t\t\t\t\tleverageNative( el, \"click\", returnTrue );\n\t\t\t\t}\n\n\t\t\t\t// Return false to allow normal processing in the caller\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\ttrigger: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Force setup before triggering a click\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\tleverageNative( el, \"click\" );\n\t\t\t\t}\n\n\t\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, suppress native .click() on links\n\t\t\t// Also prevent it if we're currently inside a leveraged native-event stack\n\t\t\t_default: function( event ) {\n\t\t\t\tvar target = event.target;\n\t\t\t\treturn rcheckableType.test( target.type ) &&\n\t\t\t\t\ttarget.click && nodeName( target, \"input\" ) &&\n\t\t\t\t\tdataPriv.get( target, \"click\" ) ||\n\t\t\t\t\tnodeName( target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Ensure the presence of an event listener that handles manually-triggered\n// synthetic events by interrupting progress until reinvoked in response to\n// *native* events that it fires directly, ensuring that state changes have\n// already occurred before other listeners are invoked.\nfunction leverageNative( el, type, expectSync ) {\n\n\t// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add\n\tif ( !expectSync ) {\n\t\tif ( dataPriv.get( el, type ) === undefined ) {\n\t\t\tjQuery.event.add( el, type, returnTrue );\n\t\t}\n\t\treturn;\n\t}\n\n\t// Register the controller as a special universal handler for all event namespaces\n\tdataPriv.set( el, type, false );\n\tjQuery.event.add( el, type, {\n\t\tnamespace: false,\n\t\thandler: function( event ) {\n\t\t\tvar notAsync, result,\n\t\t\t\tsaved = dataPriv.get( this, type );\n\n\t\t\tif ( ( event.isTrigger & 1 ) && this[ type ] ) {\n\n\t\t\t\t// Interrupt processing of the outer synthetic .trigger()ed event\n\t\t\t\t// Saved data should be false in such cases, but might be a leftover capture object\n\t\t\t\t// from an async native handler (gh-4350)\n\t\t\t\tif ( !saved.length ) {\n\n\t\t\t\t\t// Store arguments for use when handling the inner native event\n\t\t\t\t\t// There will always be at least one argument (an event object), so this array\n\t\t\t\t\t// will not be confused with a leftover capture object.\n\t\t\t\t\tsaved = slice.call( arguments );\n\t\t\t\t\tdataPriv.set( this, type, saved );\n\n\t\t\t\t\t// Trigger the native event and capture its result\n\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t// focus() and blur() are asynchronous\n\t\t\t\t\tnotAsync = expectSync( this, type );\n\t\t\t\t\tthis[ type ]();\n\t\t\t\t\tresult = dataPriv.get( this, type );\n\t\t\t\t\tif ( saved !== result || notAsync ) {\n\t\t\t\t\t\tdataPriv.set( this, type, false );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult = {};\n\t\t\t\t\t}\n\t\t\t\t\tif ( saved !== result ) {\n\n\t\t\t\t\t\t// Cancel the outer synthetic event\n\t\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t\t// Support: Chrome 86+\n\t\t\t\t\t\t// In Chrome, if an element having a focusout handler is blurred by\n\t\t\t\t\t\t// clicking outside of it, it invokes the handler synchronously. If\n\t\t\t\t\t\t// that handler calls `.remove()` on the element, the data is cleared,\n\t\t\t\t\t\t// leaving `result` undefined. We need to guard against this.\n\t\t\t\t\t\treturn result && result.value;\n\t\t\t\t\t}\n\n\t\t\t\t// If this is an inner synthetic event for an event with a bubbling surrogate\n\t\t\t\t// (focus or blur), assume that the surrogate already propagated from triggering the\n\t\t\t\t// native event and prevent that from happening again here.\n\t\t\t\t// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the\n\t\t\t\t// bubbling surrogate propagates *after* the non-bubbling base), but that seems\n\t\t\t\t// less bad than duplication.\n\t\t\t\t} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t}\n\n\t\t\t// If this is a native event triggered above, everything is now in order\n\t\t\t// Fire an inner synthetic event with the original arguments\n\t\t\t} else if ( saved.length ) {\n\n\t\t\t\t// ...and capture the result\n\t\t\t\tdataPriv.set( this, type, {\n\t\t\t\t\tvalue: jQuery.event.trigger(\n\n\t\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t\t// Extend with the prototype to reset the above stopImmediatePropagation()\n\t\t\t\t\t\tjQuery.extend( saved[ 0 ], jQuery.Event.prototype ),\n\t\t\t\t\t\tsaved.slice( 1 ),\n\t\t\t\t\t\tthis\n\t\t\t\t\t)\n\t\t\t\t} );\n\n\t\t\t\t// Abort handling of the native event\n\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t}\n\t\t}\n\t} );\n}\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (#504, #13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || Date.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcode: true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\twhich: true\n}, jQuery.event.addProp );\n\njQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( type, delegateType ) {\n\tjQuery.event.special[ type ] = {\n\n\t\t// Utilize native event if possible so blur/focus sequence is correct\n\t\tsetup: function() {\n\n\t\t\t// Claim the first handler\n\t\t\t// dataPriv.set( this, \"focus\", ... )\n\t\t\t// dataPriv.set( this, \"blur\", ... )\n\t\t\tleverageNative( this, type, expectSync );\n\n\t\t\t// Return false to allow normal processing in the caller\n\t\t\treturn false;\n\t\t},\n\t\ttrigger: function() {\n\n\t\t\t// Force setup before trigger\n\t\t\tleverageNative( this, type );\n\n\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\treturn true;\n\t\t},\n\n\t\t// Suppress native focus or blur as it's already being fired\n\t\t// in leverageNative.\n\t\t_default: function() {\n\t\t\treturn true;\n\t\t},\n\n\t\tdelegateType: delegateType\n\t};\n} );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t// Support: IE <=10 - 11, Edge 12 - 13 only\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /<script|<style|<link/i,\n\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, \"table\" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn jQuery( elem ).children( \"tbody\" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tif ( ( elem.type || \"\" ).slice( 0, 5 ) === \"true/\" ) {\n\t\telem.type = elem.type.slice( 5 );\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.get( src );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdataPriv.remove( dest, \"handle events\" );\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = flat( args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tvalueIsFunction = isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( valueIsFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Reenable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src && ( node.type || \"\" ).toLowerCase()  !== \"module\" ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl && !node.noModule ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src, {\n\t\t\t\t\t\t\t\t\tnonce: node.nonce || node.getAttribute( \"nonce\" )\n\t\t\t\t\t\t\t\t}, doc );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), node, doc );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && isAttached( node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html;\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = isAttached( elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\nvar swap = function( elem, options, callback ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.call( elem );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\nvar rboxStyle = new RegExp( cssExpand.join( \"|\" ), \"i\" );\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.cssText = \"position:absolute;left:-11111px;width:60px;\" +\n\t\t\t\"margin-top:1px;padding:0;border:0\";\n\t\tdiv.style.cssText =\n\t\t\t\"position:relative;display:block;box-sizing:border-box;overflow:scroll;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"width:60%;top:1%\";\n\t\tdocumentElement.appendChild( container ).appendChild( div );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;\n\n\t\t// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.right = \"60%\";\n\t\tpixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;\n\n\t\t// Support: IE 9 - 11 only\n\t\t// Detect misreporting of content dimensions for box-sizing:border-box elements\n\t\tboxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;\n\n\t\t// Support: IE 9 only\n\t\t// Detect overflow:scroll screwiness (gh-3699)\n\t\t// Support: Chrome <=64\n\t\t// Don't get tricked when zoom affects offsetWidth (gh-4029)\n\t\tdiv.style.position = \"absolute\";\n\t\tscrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tfunction roundPixelMeasures( measure ) {\n\t\treturn Math.round( parseFloat( measure ) );\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,\n\t\treliableTrDimensionsVal, reliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (#8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tjQuery.extend( support, {\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelBoxStyles: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelBoxStylesVal;\n\t\t},\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t},\n\t\tscrollboxSize: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn scrollboxSizeVal;\n\t\t},\n\n\t\t// Support: IE 9 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Behavior in IE 9 is more subtle than in newer versions & it passes\n\t\t// some versions of this test; make sure not to make it pass there!\n\t\t//\n\t\t// Support: Firefox 70+\n\t\t// Only Firefox includes border widths\n\t\t// in computed dimensions. (gh-4529)\n\t\treliableTrDimensions: function() {\n\t\t\tvar table, tr, trChild, trStyle;\n\t\t\tif ( reliableTrDimensionsVal == null ) {\n\t\t\t\ttable = document.createElement( \"table\" );\n\t\t\t\ttr = document.createElement( \"tr\" );\n\t\t\t\ttrChild = document.createElement( \"div\" );\n\n\t\t\t\ttable.style.cssText = \"position:absolute;left:-11111px;border-collapse:separate\";\n\t\t\t\ttr.style.cssText = \"border:1px solid\";\n\n\t\t\t\t// Support: Chrome 86+\n\t\t\t\t// Height set through cssText does not get applied.\n\t\t\t\t// Computed height then comes back as 0.\n\t\t\t\ttr.style.height = \"1px\";\n\t\t\t\ttrChild.style.height = \"9px\";\n\n\t\t\t\t// Support: Android 8 Chrome 86+\n\t\t\t\t// In our bodyBackground.html iframe,\n\t\t\t\t// display for all div elements is set to \"inline\",\n\t\t\t\t// which causes a problem only in Android 8 Chrome 86.\n\t\t\t\t// Ensuring the div is display: block\n\t\t\t\t// gets around this issue.\n\t\t\t\ttrChild.style.display = \"block\";\n\n\t\t\t\tdocumentElement\n\t\t\t\t\t.appendChild( table )\n\t\t\t\t\t.appendChild( tr )\n\t\t\t\t\t.appendChild( trChild );\n\n\t\t\t\ttrStyle = window.getComputedStyle( tr );\n\t\t\t\treliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +\n\t\t\t\t\tparseInt( trStyle.borderTopWidth, 10 ) +\n\t\t\t\t\tparseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;\n\n\t\t\t\tdocumentElement.removeChild( table );\n\t\t\t}\n\t\t\treturn reliableTrDimensionsVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t//   .css('filter') (IE 9 only, #12537)\n\t//   .css('--customProperty) (#3144)\n\tif ( computed ) {\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( ret === \"\" && !isAttached( elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar cssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style,\n\tvendorProps = {};\n\n// Return a vendor-prefixed property or undefined\nfunction vendorPropName( name ) {\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a potentially-mapped jQuery.cssProps or vendor prefixed property\nfunction finalPropName( name ) {\n\tvar final = jQuery.cssProps[ name ] || vendorProps[ name ];\n\n\tif ( final ) {\n\t\treturn final;\n\t}\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\treturn vendorProps[ name ] = vendorPropName( name ) || name;\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trcustomProp = /^--/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t};\n\nfunction setPositiveNumber( _elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {\n\tvar i = dimension === \"width\" ? 1 : 0,\n\t\textra = 0,\n\t\tdelta = 0;\n\n\t// Adjustment may not be necessary\n\tif ( box === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\treturn 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin\n\t\tif ( box === \"margin\" ) {\n\t\t\tdelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\t// If we get here with a content-box, we're seeking \"padding\" or \"border\" or \"margin\"\n\t\tif ( !isBorderBox ) {\n\n\t\t\t// Add padding\n\t\t\tdelta += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// For \"border\" or \"margin\", add border\n\t\t\tif ( box !== \"padding\" ) {\n\t\t\t\tdelta += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\n\t\t\t// But still keep track of it otherwise\n\t\t\t} else {\n\t\t\t\textra += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\n\t\t// If we get here with a border-box (content + padding + border), we're seeking \"content\" or\n\t\t// \"padding\" or \"margin\"\n\t\t} else {\n\n\t\t\t// For \"content\", subtract padding\n\t\t\tif ( box === \"content\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// For \"content\" or \"padding\", subtract border\n\t\t\tif ( box !== \"margin\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Account for positive content-box scroll gutter when requested by providing computedVal\n\tif ( !isBorderBox && computedVal >= 0 ) {\n\n\t\t// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n\t\t// Assuming integer scroll gutter, subtract the rest and round down\n\t\tdelta += Math.max( 0, Math.ceil(\n\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\tcomputedVal -\n\t\t\tdelta -\n\t\t\textra -\n\t\t\t0.5\n\n\t\t// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter\n\t\t// Use an explicit zero to avoid NaN (gh-3964)\n\t\t) ) || 0;\n\t}\n\n\treturn delta;\n}\n\nfunction getWidthOrHeight( elem, dimension, extra ) {\n\n\t// Start with computed style\n\tvar styles = getStyles( elem ),\n\n\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).\n\t\t// Fake content-box until we know it's needed to know the true value.\n\t\tboxSizingNeeded = !support.boxSizingReliable() || extra,\n\t\tisBorderBox = boxSizingNeeded &&\n\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\tvalueIsBorderBox = isBorderBox,\n\n\t\tval = curCSS( elem, dimension, styles ),\n\t\toffsetProp = \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );\n\n\t// Support: Firefox <=54\n\t// Return a confounding non-pixel value or feign ignorance, as appropriate.\n\tif ( rnumnonpx.test( val ) ) {\n\t\tif ( !extra ) {\n\t\t\treturn val;\n\t\t}\n\t\tval = \"auto\";\n\t}\n\n\n\t// Support: IE 9 - 11 only\n\t// Use offsetWidth/offsetHeight for when box sizing is unreliable.\n\t// In those cases, the computed value can be trusted to be border-box.\n\tif ( ( !support.boxSizingReliable() && isBorderBox ||\n\n\t\t// Support: IE 10 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Interestingly, in some cases IE 9 doesn't suffer from this issue.\n\t\t!support.reliableTrDimensions() && nodeName( elem, \"tr\" ) ||\n\n\t\t// Fall back to offsetWidth/offsetHeight when value is \"auto\"\n\t\t// This happens for inline elements with no explicit setting (gh-3571)\n\t\tval === \"auto\" ||\n\n\t\t// Support: Android <=4.1 - 4.3 only\n\t\t// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n\t\t!parseFloat( val ) && jQuery.css( elem, \"display\", false, styles ) === \"inline\" ) &&\n\n\t\t// Make sure the element is visible & connected\n\t\telem.getClientRects().length ) {\n\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t\t// Where available, offsetWidth/offsetHeight approximate border box dimensions.\n\t\t// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the\n\t\t// retrieved value as a content box dimension.\n\t\tvalueIsBorderBox = offsetProp in elem;\n\t\tif ( valueIsBorderBox ) {\n\t\t\tval = elem[ offsetProp ];\n\t\t}\n\t}\n\n\t// Normalize \"\" and auto\n\tval = parseFloat( val ) || 0;\n\n\t// Adjust for the element's box model\n\treturn ( val +\n\t\tboxModelAdjustment(\n\t\t\telem,\n\t\t\tdimension,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles,\n\n\t\t\t// Provide the current computed size to request scroll gutter calculation (gh-3589)\n\t\t\tval\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"animationIterationCount\": true,\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"gridArea\": true,\n\t\t\"gridColumn\": true,\n\t\t\"gridColumnEnd\": true,\n\t\t\"gridColumnStart\": true,\n\t\t\"gridRow\": true,\n\t\t\"gridRowEnd\": true,\n\t\t\"gridRowStart\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (#7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (#7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\t// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append\n\t\t\t// \"px\" to a few hardcoded values.\n\t\t\tif ( type === \"number\" && !isCustomProp ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( _i, dimension ) {\n\tjQuery.cssHooks[ dimension ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, dimension, extra );\n\t\t\t\t\t} ) :\n\t\t\t\t\tgetWidthOrHeight( elem, dimension, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = getStyles( elem ),\n\n\t\t\t\t// Only read styles.position if the test has a chance to fail\n\t\t\t\t// to avoid forcing a reflow.\n\t\t\t\tscrollboxSizeBuggy = !support.scrollboxSize() &&\n\t\t\t\t\tstyles.position === \"absolute\",\n\n\t\t\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)\n\t\t\t\tboxSizingNeeded = scrollboxSizeBuggy || extra,\n\t\t\t\tisBorderBox = boxSizingNeeded &&\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\tsubtract = extra ?\n\t\t\t\t\tboxModelAdjustment(\n\t\t\t\t\t\telem,\n\t\t\t\t\t\tdimension,\n\t\t\t\t\t\textra,\n\t\t\t\t\t\tisBorderBox,\n\t\t\t\t\t\tstyles\n\t\t\t\t\t) :\n\t\t\t\t\t0;\n\n\t\t\t// Account for unreliable border-box dimensions by comparing offset* to computed and\n\t\t\t// faking a content-box to get border and padding (gh-3699)\n\t\t\tif ( isBorderBox && scrollboxSizeBuggy ) {\n\t\t\t\tsubtract -= Math.ceil(\n\t\t\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\t\t\tparseFloat( styles[ dimension ] ) -\n\t\t\t\t\tboxModelAdjustment( elem, dimension, \"border\", false, styles ) -\n\t\t\t\t\t0.5\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ dimension ] = value;\n\t\t\t\tvalue = jQuery.css( elem, dimension );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( prefix !== \"margin\" ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 && (\n\t\t\t\tjQuery.cssHooks[ tween.prop ] ||\n\t\t\t\t\ttween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, inProgress,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction schedule() {\n\tif ( inProgress ) {\n\t\tif ( document.hidden === false && window.requestAnimationFrame ) {\n\t\t\twindow.requestAnimationFrame( schedule );\n\t\t} else {\n\t\t\twindow.setTimeout( schedule, jQuery.fx.interval );\n\t\t}\n\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = Date.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 15\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY and Edge just mirrors\n\t\t// the overflowX value there.\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( Array.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\t// If there's more to do, yield\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t}\n\n\t\t\t// If this was an empty animation, synthesize a final progress notification\n\t\t\tif ( !length ) {\n\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t}\n\n\t\t\t// Resolve the animation and report its conclusion\n\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\treturn false;\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tresult.stop.bind( result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\t// Attach callbacks from options\n\tanimation\n\t\t.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\treturn animation;\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tisFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off\n\tif ( jQuery.fx.off ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\n\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( _i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = Date.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Run the timer and safely remove it when done (allowing for external removal)\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tjQuery.fx.start();\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( inProgress ) {\n\t\treturn;\n\t}\n\n\tinProgress = true;\n\tschedule();\n};\n\njQuery.fx.stop = function() {\n\tinProgress = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tnodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( _i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\nfunction classesToArray( value ) {\n\tif ( Array.isArray( value ) ) {\n\t\treturn value;\n\t}\n\tif ( typeof value === \"string\" ) {\n\t\treturn value.match( rnothtmlwhite ) || [];\n\t}\n\treturn [];\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value,\n\t\t\tisValidValue = type === \"string\" || Array.isArray( value );\n\n\t\tif ( typeof stateVal === \"boolean\" && isValidValue ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar className, i, self, classNames;\n\n\t\t\tif ( isValidValue ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\ti = 0;\n\t\t\t\tself = jQuery( this );\n\t\t\t\tclassNames = classesToArray( value );\n\n\t\t\t\twhile ( ( className = classNames[ i++ ] ) ) {\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, valueIsFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueIsFunction = isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( Array.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (#14686, #14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\nsupport.focusin = \"onfocusin\" in window;\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\tstopPropagationCallback = function( e ) {\n\t\te.stopPropagation();\n\t};\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special, lastElement,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = lastElement = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tlastElement = cur;\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( dataPriv.get( cur, \"events\" ) || Object.create( null ) )[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.addEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\telem[ type ]();\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.removeEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\n// Support: Firefox <=44\n// Firefox doesn't have focus(in | out) events\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n//\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n// focus(in | out) events fire after focus & blur events,\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\nif ( !support.focusin ) {\n\tjQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\n\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\n\t\t\t\t// Handle: regular nodes (via `this.ownerDocument`), window\n\t\t\t\t// (via `this.document`) & document (via `this`).\n\t\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdataPriv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\nvar location = window.location;\n\nvar nonce = { guid: Date.now() };\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml, parserErrorElem;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {}\n\n\tparserErrorElem = xml && xml.getElementsByTagName( \"parsererror\" )[ 0 ];\n\tif ( !xml || parserErrorElem ) {\n\t\tjQuery.error( \"Invalid XML: \" + (\n\t\t\tparserErrorElem ?\n\t\t\t\tjQuery.map( parserErrorElem.childNodes, function( el ) {\n\t\t\t\t\treturn el.textContent;\n\t\t\t\t} ).join( \"\\n\" ) :\n\t\t\t\tdata\n\t\t) );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && toType( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\tif ( a == null ) {\n\t\treturn \"\";\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} ).filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} ).map( function( _i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\noriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() + \" \" ] =\n\t\t\t\t\t\t\t\t\t( responseHeaders[ match[ 1 ].toLowerCase() + \" \" ] || [] )\n\t\t\t\t\t\t\t\t\t\t.concat( match[ 2 ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() + \" \" ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match.join( \", \" );\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 15\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available and should be processed, append data to url\n\t\t\tif ( s.data && ( s.processData || typeof s.data === \"string\" ) ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce.guid++ ) +\n\t\t\t\t\tuncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Use a noop converter for missing script but not if jsonp\n\t\t\tif ( !isSuccess &&\n\t\t\t\tjQuery.inArray( \"script\", s.dataTypes ) > -1 &&\n\t\t\t\tjQuery.inArray( \"json\", s.dataTypes ) < 0 ) {\n\t\t\t\ts.converters[ \"text script\" ] = function() {};\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( _i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\njQuery.ajaxPrefilter( function( s ) {\n\tvar i;\n\tfor ( i in s.headers ) {\n\t\tif ( i.toLowerCase() === \"content-type\" ) {\n\t\t\ts.contentType = s.headers[ i ] || \"\";\n\t\t}\n\t}\n} );\n\n\njQuery._evalUrl = function( url, options, doc ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (#11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\n\t\t// Only evaluate the response if it is successful (gh-4126)\n\t\t// dataFilter is not invoked for failure responses, so using it instead\n\t\t// of the default converter is kludgy but it works.\n\t\tconverters: {\n\t\t\t\"text script\": function() {}\n\t\t},\n\t\tdataFilter: function( response ) {\n\t\t\tjQuery.globalEval( response, options, doc );\n\t\t}\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar htmlIsFunction = isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// #1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.ontimeout =\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see #8605, #14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\"  ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = xhr.ontimeout = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// #14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain or forced-by-attrs requests\n\tif ( s.crossDomain || s.scriptAttrs ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"<script>\" )\n\t\t\t\t\t.attr( s.scriptAttrs || {} )\n\t\t\t\t\t.prop( { charset: s.scriptCharset, src: s.url } )\n\t\t\t\t\t.on( \"load error\", callback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup( {\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce.guid++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n} );\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" &&\n\t\t\t\t( s.contentType || \"\" )\n\t\t\t\t\t.indexOf( \"application/x-www-form-urlencoded\" ) === 0 &&\n\t\t\t\trjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[ \"script json\" ] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// Force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always( function() {\n\n\t\t\t// If previous value didn't exist - remove it\n\t\t\tif ( overwritten === undefined ) {\n\t\t\t\tjQuery( window ).removeProp( callbackName );\n\n\t\t\t// Otherwise restore preexisting value\n\t\t\t} else {\n\t\t\t\twindow[ callbackName ] = overwritten;\n\t\t\t}\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\n\t\t\t\t// Make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// Save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t} );\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n} );\n\n\n\n\n// Support: Safari 8 only\n// In Safari 8 documents created via document.implementation.createHTMLDocument\n// collapse sibling forms: the second one becomes a child of the first one.\n// Because of that, this security measure has to be disabled in Safari 8.\n// https://bugs.webkit.org/show_bug.cgi?id=137337\nsupport.createHTMLDocument = ( function() {\n\tvar body = document.implementation.createHTMLDocument( \"\" ).body;\n\tbody.innerHTML = \"<form></form><form></form>\";\n\treturn body.childNodes.length === 2;\n} )();\n\n\n// Argument \"data\" should be string of html\n// context (optional): If specified, the fragment will be created in this context,\n// defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( typeof data !== \"string\" ) {\n\t\treturn [];\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\n\tvar base, parsed, scripts;\n\n\tif ( !context ) {\n\n\t\t// Stop scripts or inline event handlers from being executed immediately\n\t\t// by using document.implementation\n\t\tif ( support.createHTMLDocument ) {\n\t\t\tcontext = document.implementation.createHTMLDocument( \"\" );\n\n\t\t\t// Set the base href for the created document\n\t\t\t// so any parsed elements with URLs\n\t\t\t// are based on the document's URL (gh-2965)\n\t\t\tbase = context.createElement( \"base\" );\n\t\t\tbase.href = document.location.href;\n\t\t\tcontext.head.appendChild( base );\n\t\t} else {\n\t\t\tcontext = document;\n\t\t}\n\t}\n\n\tparsed = rsingleTag.exec( data );\n\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[ 1 ] ) ];\n\t}\n\n\tparsed = buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf( \" \" );\n\n\tif ( off > -1 ) {\n\t\tselector = stripAndCollapse( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax( {\n\t\t\turl: url,\n\n\t\t\t// If \"type\" variable is undefined, then \"GET\" method will be used.\n\t\t\t// Make value of this field explicit since\n\t\t\t// user can override it through ajaxSetup method\n\t\t\ttype: type || \"GET\",\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t} ).done( function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery( \"<div>\" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t// If the request succeeds, this function gets \"data\", \"status\", \"jqXHR\"\n\t\t// but they are ignored because response was set above.\n\t\t// If it fails, this function gets \"jqXHR\", \"status\", \"error\"\n\t\t} ).always( callback && function( jqXHR, status ) {\n\t\t\tself.each( function() {\n\t\t\t\tcallback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t\t} );\n\t\t} );\n\t}\n\n\treturn this;\n};\n\n\n\n\njQuery.expr.pseudos.animated = function( elem ) {\n\treturn jQuery.grep( jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t} ).length;\n};\n\n\n\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf( \"auto\" ) > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( isFunction( options ) ) {\n\n\t\t\t// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n\t\t\toptions = options.call( elem, i, jQuery.extend( {}, curOffset ) );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend( {\n\n\t// offset() relates an element's border box to the document origin\n\toffset: function( options ) {\n\n\t\t// Preserve chaining for setter\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each( function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t} );\n\t\t}\n\n\t\tvar rect, win,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !elem ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Return zeros for disconnected and hidden (display: none) elements (gh-2310)\n\t\t// Support: IE <=11 only\n\t\t// Running getBoundingClientRect on a\n\t\t// disconnected node in IE throws an error\n\t\tif ( !elem.getClientRects().length ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\t// Get document-relative position by adding viewport scroll to viewport-relative gBCR\n\t\trect = elem.getBoundingClientRect();\n\t\twin = elem.ownerDocument.defaultView;\n\t\treturn {\n\t\t\ttop: rect.top + win.pageYOffset,\n\t\t\tleft: rect.left + win.pageXOffset\n\t\t};\n\t},\n\n\t// position() relates an element's margin box to its offset parent's padding box\n\t// This corresponds to the behavior of CSS absolute positioning\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset, doc,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// position:fixed elements are offset from the viewport, which itself always has zero offset\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\n\t\t\t// Assume position:fixed implies availability of getBoundingClientRect\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\t\t\toffset = this.offset();\n\n\t\t\t// Account for the *real* offset parent, which can be the document or its root element\n\t\t\t// when a statically positioned element is identified\n\t\t\tdoc = elem.ownerDocument;\n\t\t\toffsetParent = elem.offsetParent || doc.documentElement;\n\t\t\twhile ( offsetParent &&\n\t\t\t\t( offsetParent === doc.body || offsetParent === doc.documentElement ) &&\n\t\t\t\tjQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\n\t\t\t\toffsetParent = offsetParent.parentNode;\n\t\t\t}\n\t\t\tif ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {\n\n\t\t\t\t// Incorporate borders into its offset, since they are outside its content origin\n\t\t\t\tparentOffset = jQuery( offsetParent ).offset();\n\t\t\t\tparentOffset.top += jQuery.css( offsetParent, \"borderTopWidth\", true );\n\t\t\t\tparentOffset.left += jQuery.css( offsetParent, \"borderLeftWidth\", true );\n\t\t\t}\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\t// This method will return documentElement in the following cases:\n\t// 1) For the element inside the iframe without offsetParent, this method will return\n\t//    documentElement of the parent window\n\t// 2) For the hidden or detached element\n\t// 3) For body or html element, i.e. in case of the html node - it will return itself\n\t//\n\t// but those exceptions were never presented as a real life use-cases\n\t// and might be considered as more preferable results.\n\t//\n\t// This logic, however, is not guaranteed and can change at any point in the future\n\toffsetParent: function() {\n\t\treturn this.map( function() {\n\t\t\tvar offsetParent = this.offsetParent;\n\n\t\t\twhile ( offsetParent && jQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || documentElement;\n\t\t} );\n\t}\n} );\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\n\t\t\t// Coalesce documents and windows\n\t\t\tvar win;\n\t\t\tif ( isWindow( elem ) ) {\n\t\t\t\twin = elem;\n\t\t\t} else if ( elem.nodeType === 9 ) {\n\t\t\t\twin = elem.defaultView;\n\t\t\t}\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : win.pageXOffset,\n\t\t\t\t\ttop ? val : win.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length );\n\t};\n} );\n\n// Support: Safari <=7 - 9.1, Chrome <=37 - 49\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( _i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n} );\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( {\n\t\tpadding: \"inner\" + name,\n\t\tcontent: type,\n\t\t\"\": \"outer\" + name\n\t}, function( defaultExtra, funcName ) {\n\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( isWindow( elem ) ) {\n\n\t\t\t\t\t// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)\n\t\t\t\t\treturn funcName.indexOf( \"outer\" ) === 0 ?\n\t\t\t\t\t\telem[ \"inner\" + name ] :\n\t\t\t\t\t\telem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable );\n\t\t};\n\t} );\n} );\n\n\njQuery.each( [\n\t\"ajaxStart\",\n\t\"ajaxStop\",\n\t\"ajaxComplete\",\n\t\"ajaxError\",\n\t\"ajaxSuccess\",\n\t\"ajaxSend\"\n], function( _i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n} );\n\n\n\n\njQuery.fn.extend( {\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ?\n\t\t\tthis.off( selector, \"**\" ) :\n\t\t\tthis.off( types, selector || \"**\", fn );\n\t},\n\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n} );\n\njQuery.each(\n\t( \"blur focus focusin focusout resize scroll click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup contextmenu\" ).split( \" \" ),\n\tfunction( _i, name ) {\n\n\t\t// Handle event binding\n\t\tjQuery.fn[ name ] = function( data, fn ) {\n\t\t\treturn arguments.length > 0 ?\n\t\t\t\tthis.on( name, null, data, fn ) :\n\t\t\t\tthis.trigger( name );\n\t\t};\n\t}\n);\n\n\n\n\n// Support: Android <=4.0 only\n// Make sure we trim BOM and NBSP\nvar rtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n\n// Bind a function to a context, optionally partially applying any\n// arguments.\n// jQuery.proxy is deprecated to promote standards (specifically Function#bind)\n// However, it is not slated for removal any time soon\njQuery.proxy = function( fn, context ) {\n\tvar tmp, args, proxy;\n\n\tif ( typeof context === \"string\" ) {\n\t\ttmp = fn[ context ];\n\t\tcontext = fn;\n\t\tfn = tmp;\n\t}\n\n\t// Quick check to determine if target is callable, in the spec\n\t// this throws a TypeError, but we will just return undefined.\n\tif ( !isFunction( fn ) ) {\n\t\treturn undefined;\n\t}\n\n\t// Simulated bind\n\targs = slice.call( arguments, 2 );\n\tproxy = function() {\n\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t};\n\n\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\treturn proxy;\n};\n\njQuery.holdReady = function( hold ) {\n\tif ( hold ) {\n\t\tjQuery.readyWait++;\n\t} else {\n\t\tjQuery.ready( true );\n\t}\n};\njQuery.isArray = Array.isArray;\njQuery.parseJSON = JSON.parse;\njQuery.nodeName = nodeName;\njQuery.isFunction = isFunction;\njQuery.isWindow = isWindow;\njQuery.camelCase = camelCase;\njQuery.type = toType;\n\njQuery.now = Date.now;\n\njQuery.isNumeric = function( obj ) {\n\n\t// As of jQuery 3.0, isNumeric is limited to\n\t// strings and numbers (primitives or objects)\n\t// that can be coerced to finite numbers (gh-2662)\n\tvar type = jQuery.type( obj );\n\treturn ( type === \"number\" || type === \"string\" ) &&\n\n\t\t// parseFloat NaNs numeric-cast false positives (\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t!isNaN( obj - parseFloat( obj ) );\n};\n\njQuery.trim = function( text ) {\n\treturn text == null ?\n\t\t\"\" :\n\t\t( text + \"\" ).replace( rtrim, \"\" );\n};\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( \"jquery\", [], function() {\n\t\treturn jQuery;\n\t} );\n}\n\n\n\n\nvar\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\nif ( typeof noGlobal === \"undefined\" ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n} );\n"
  },
  {
    "path": "easyflow-flow-bpmn/static/plugins/jquery-validation/jquery.validate.js",
    "content": "/*!\n * jQuery Validation Plugin v1.15.1\n *\n * http://jqueryvalidation.org/\n *\n * Copyright (c) 2016 Jörn Zaefferer\n * Released under the MIT license\n */\n(function( factory ) {\n\tif ( typeof define === \"function\" && define.amd ) {\n\t\tdefine( [\"jquery\"], factory );\n\t} else if (typeof module === \"object\" && module.exports) {\n\t\tmodule.exports = factory( require( \"jquery\" ) );\n\t} else {\n\t\tfactory( jQuery );\n\t}\n}(function( $ ) {\n\n$.extend( $.fn, {\n\n\t// http://jqueryvalidation.org/validate/\n\tvalidate: function( options ) {\n\n\t\t// If nothing is selected, return nothing; can't chain anyway\n\t\tif ( !this.length ) {\n\t\t\tif ( options && options.debug && window.console ) {\n\t\t\t\tconsole.warn( \"Nothing selected, can't validate, returning nothing.\" );\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Check if a validator for this form was already created\n\t\tvar validator = $.data( this[ 0 ], \"validator\" );\n\t\tif ( validator ) {\n\t\t\treturn validator;\n\t\t}\n\n\t\t// Add novalidate tag if HTML5.\n\t\tthis.attr( \"novalidate\", \"novalidate\" );\n\n\t\tvalidator = new $.validator( options, this[ 0 ] );\n\t\t$.data( this[ 0 ], \"validator\", validator );\n\n\t\tif ( validator.settings.onsubmit ) {\n\n\t\t\tthis.on( \"click.validate\", \":submit\", function( event ) {\n\t\t\t\tif ( validator.settings.submitHandler ) {\n\t\t\t\t\tvalidator.submitButton = event.target;\n\t\t\t\t}\n\n\t\t\t\t// Allow suppressing validation by adding a cancel class to the submit button\n\t\t\t\tif ( $( this ).hasClass( \"cancel\" ) ) {\n\t\t\t\t\tvalidator.cancelSubmit = true;\n\t\t\t\t}\n\n\t\t\t\t// Allow suppressing validation by adding the html5 formnovalidate attribute to the submit button\n\t\t\t\tif ( $( this ).attr( \"formnovalidate\" ) !== undefined ) {\n\t\t\t\t\tvalidator.cancelSubmit = true;\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Validate the form on submit\n\t\t\tthis.on( \"submit.validate\", function( event ) {\n\t\t\t\tif ( validator.settings.debug ) {\n\n\t\t\t\t\t// Prevent form submit to be able to see console output\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t\tfunction handle() {\n\t\t\t\t\tvar hidden, result;\n\t\t\t\t\tif ( validator.settings.submitHandler ) {\n\t\t\t\t\t\tif ( validator.submitButton ) {\n\n\t\t\t\t\t\t\t// Insert a hidden input as a replacement for the missing submit button\n\t\t\t\t\t\t\thidden = $( \"<input type='hidden'/>\" )\n\t\t\t\t\t\t\t\t.attr( \"name\", validator.submitButton.name )\n\t\t\t\t\t\t\t\t.val( $( validator.submitButton ).val() )\n\t\t\t\t\t\t\t\t.appendTo( validator.currentForm );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresult = validator.settings.submitHandler.call( validator, validator.currentForm, event );\n\t\t\t\t\t\tif ( validator.submitButton ) {\n\n\t\t\t\t\t\t\t// And clean up afterwards; thanks to no-block-scope, hidden can be referenced\n\t\t\t\t\t\t\thidden.remove();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( result !== undefined ) {\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\t// Prevent submit for invalid forms or custom submit handlers\n\t\t\t\tif ( validator.cancelSubmit ) {\n\t\t\t\t\tvalidator.cancelSubmit = false;\n\t\t\t\t\treturn handle();\n\t\t\t\t}\n\t\t\t\tif ( validator.form() ) {\n\t\t\t\t\tif ( validator.pendingRequest ) {\n\t\t\t\t\t\tvalidator.formSubmitted = true;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn handle();\n\t\t\t\t} else {\n\t\t\t\t\tvalidator.focusInvalid();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn validator;\n\t},\n\n\t// http://jqueryvalidation.org/valid/\n\tvalid: function() {\n\t\tvar valid, validator, errorList;\n\n\t\tif ( $( this[ 0 ] ).is( \"form\" ) ) {\n\t\t\tvalid = this.validate().form();\n\t\t} else {\n\t\t\terrorList = [];\n\t\t\tvalid = true;\n\t\t\tvalidator = $( this[ 0 ].form ).validate();\n\t\t\tthis.each( function() {\n\t\t\t\tvalid = validator.element( this ) && valid;\n\t\t\t\tif ( !valid ) {\n\t\t\t\t\terrorList = errorList.concat( validator.errorList );\n\t\t\t\t}\n\t\t\t} );\n\t\t\tvalidator.errorList = errorList;\n\t\t}\n\t\treturn valid;\n\t},\n\n\t// http://jqueryvalidation.org/rules/\n\trules: function( command, argument ) {\n\t\tvar element = this[ 0 ],\n\t\t\tsettings, staticRules, existingRules, data, param, filtered;\n\n\t\t// If nothing is selected, return empty object; can't chain anyway\n\t\tif ( element == null || element.form == null ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( command ) {\n\t\t\tsettings = $.data( element.form, \"validator\" ).settings;\n\t\t\tstaticRules = settings.rules;\n\t\t\texistingRules = $.validator.staticRules( element );\n\t\t\tswitch ( command ) {\n\t\t\tcase \"add\":\n\t\t\t\t$.extend( existingRules, $.validator.normalizeRule( argument ) );\n\n\t\t\t\t// Remove messages from rules, but allow them to be set separately\n\t\t\t\tdelete existingRules.messages;\n\t\t\t\tstaticRules[ element.name ] = existingRules;\n\t\t\t\tif ( argument.messages ) {\n\t\t\t\t\tsettings.messages[ element.name ] = $.extend( settings.messages[ element.name ], argument.messages );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"remove\":\n\t\t\t\tif ( !argument ) {\n\t\t\t\t\tdelete staticRules[ element.name ];\n\t\t\t\t\treturn existingRules;\n\t\t\t\t}\n\t\t\t\tfiltered = {};\n\t\t\t\t$.each( argument.split( /\\s/ ), function( index, method ) {\n\t\t\t\t\tfiltered[ method ] = existingRules[ method ];\n\t\t\t\t\tdelete existingRules[ method ];\n\t\t\t\t\tif ( method === \"required\" ) {\n\t\t\t\t\t\t$( element ).removeAttr( \"aria-required\" );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn filtered;\n\t\t\t}\n\t\t}\n\n\t\tdata = $.validator.normalizeRules(\n\t\t$.extend(\n\t\t\t{},\n\t\t\t$.validator.classRules( element ),\n\t\t\t$.validator.attributeRules( element ),\n\t\t\t$.validator.dataRules( element ),\n\t\t\t$.validator.staticRules( element )\n\t\t), element );\n\n\t\t// Make sure required is at front\n\t\tif ( data.required ) {\n\t\t\tparam = data.required;\n\t\t\tdelete data.required;\n\t\t\tdata = $.extend( { required: param }, data );\n\t\t\t$( element ).attr( \"aria-required\", \"true\" );\n\t\t}\n\n\t\t// Make sure remote is at back\n\t\tif ( data.remote ) {\n\t\t\tparam = data.remote;\n\t\t\tdelete data.remote;\n\t\t\tdata = $.extend( data, { remote: param } );\n\t\t}\n\n\t\treturn data;\n\t}\n} );\n\n// Custom selectors\n$.extend( $.expr[ \":\" ], {\n\n\t// http://jqueryvalidation.org/blank-selector/\n\tblank: function( a ) {\n\t\treturn !$.trim( \"\" + $( a ).val() );\n\t},\n\n\t// http://jqueryvalidation.org/filled-selector/\n\tfilled: function( a ) {\n\t\tvar val = $( a ).val();\n\t\treturn val !== null && !!$.trim( \"\" + val );\n\t},\n\n\t// http://jqueryvalidation.org/unchecked-selector/\n\tunchecked: function( a ) {\n\t\treturn !$( a ).prop( \"checked\" );\n\t}\n} );\n\n// Constructor for validator\n$.validator = function( options, form ) {\n\tthis.settings = $.extend( true, {}, $.validator.defaults, options );\n\tthis.currentForm = form;\n\tthis.init();\n};\n\n// http://jqueryvalidation.org/jQuery.validator.format/\n$.validator.format = function( source, params ) {\n\tif ( arguments.length === 1 ) {\n\t\treturn function() {\n\t\t\tvar args = $.makeArray( arguments );\n\t\t\targs.unshift( source );\n\t\t\treturn $.validator.format.apply( this, args );\n\t\t};\n\t}\n\tif ( params === undefined ) {\n\t\treturn source;\n\t}\n\tif ( arguments.length > 2 && params.constructor !== Array  ) {\n\t\tparams = $.makeArray( arguments ).slice( 1 );\n\t}\n\tif ( params.constructor !== Array ) {\n\t\tparams = [ params ];\n\t}\n\t$.each( params, function( i, n ) {\n\t\tsource = source.replace( new RegExp( \"\\\\{\" + i + \"\\\\}\", \"g\" ), function() {\n\t\t\treturn n;\n\t\t} );\n\t} );\n\treturn source;\n};\n\n$.extend( $.validator, {\n\n\tdefaults: {\n\t\tmessages: {},\n\t\tgroups: {},\n\t\trules: {},\n\t\terrorClass: \"error\",\n\t\tpendingClass: \"pending\",\n\t\tvalidClass: \"valid\",\n\t\terrorElement: \"label\",\n\t\tfocusCleanup: false,\n\t\tfocusInvalid: true,\n\t\terrorContainer: $( [] ),\n\t\terrorLabelContainer: $( [] ),\n\t\tonsubmit: true,\n\t\tignore: \":hidden\",\n\t\tignoreTitle: false,\n\t\tonfocusin: function( element ) {\n\t\t\tthis.lastActive = element;\n\n\t\t\t// Hide error label and remove error class on focus if enabled\n\t\t\tif ( this.settings.focusCleanup ) {\n\t\t\t\tif ( this.settings.unhighlight ) {\n\t\t\t\t\tthis.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );\n\t\t\t\t}\n\t\t\t\tthis.hideThese( this.errorsFor( element ) );\n\t\t\t}\n\t\t},\n\t\tonfocusout: function( element ) {\n\t\t\tif ( !this.checkable( element ) && ( element.name in this.submitted || !this.optional( element ) ) ) {\n\t\t\t\tthis.element( element );\n\t\t\t}\n\t\t},\n\t\tonkeyup: function( element, event ) {\n\n\t\t\t// Avoid revalidate the field when pressing one of the following keys\n\t\t\t// Shift       => 16\n\t\t\t// Ctrl        => 17\n\t\t\t// Alt         => 18\n\t\t\t// Caps lock   => 20\n\t\t\t// End         => 35\n\t\t\t// Home        => 36\n\t\t\t// Left arrow  => 37\n\t\t\t// Up arrow    => 38\n\t\t\t// Right arrow => 39\n\t\t\t// Down arrow  => 40\n\t\t\t// Insert      => 45\n\t\t\t// Num lock    => 144\n\t\t\t// AltGr key   => 225\n\t\t\tvar excludedKeys = [\n\t\t\t\t16, 17, 18, 20, 35, 36, 37,\n\t\t\t\t38, 39, 40, 45, 144, 225\n\t\t\t];\n\n\t\t\tif ( event.which === 9 && this.elementValue( element ) === \"\" || $.inArray( event.keyCode, excludedKeys ) !== -1 ) {\n\t\t\t\treturn;\n\t\t\t} else if ( element.name in this.submitted || element.name in this.invalid ) {\n\t\t\t\tthis.element( element );\n\t\t\t}\n\t\t},\n\t\tonclick: function( element ) {\n\n\t\t\t// Click on selects, radiobuttons and checkboxes\n\t\t\tif ( element.name in this.submitted ) {\n\t\t\t\tthis.element( element );\n\n\t\t\t// Or option elements, check parent select in that case\n\t\t\t} else if ( element.parentNode.name in this.submitted ) {\n\t\t\t\tthis.element( element.parentNode );\n\t\t\t}\n\t\t},\n\t\thighlight: function( element, errorClass, validClass ) {\n\t\t\tif ( element.type === \"radio\" ) {\n\t\t\t\tthis.findByName( element.name ).addClass( errorClass ).removeClass( validClass );\n\t\t\t} else {\n\t\t\t\t$( element ).addClass( errorClass ).removeClass( validClass );\n\t\t\t}\n\t\t},\n\t\tunhighlight: function( element, errorClass, validClass ) {\n\t\t\tif ( element.type === \"radio\" ) {\n\t\t\t\tthis.findByName( element.name ).removeClass( errorClass ).addClass( validClass );\n\t\t\t} else {\n\t\t\t\t$( element ).removeClass( errorClass ).addClass( validClass );\n\t\t\t}\n\t\t}\n\t},\n\n\t// http://jqueryvalidation.org/jQuery.validator.setDefaults/\n\tsetDefaults: function( settings ) {\n\t\t$.extend( $.validator.defaults, settings );\n\t},\n\n\tmessages: {\n\t\trequired: \"This field is required.\",\n\t\tremote: \"Please fix this field.\",\n\t\temail: \"Please enter a valid email address.\",\n\t\turl: \"Please enter a valid URL.\",\n\t\tdate: \"Please enter a valid date.\",\n\t\tdateISO: \"Please enter a valid date (ISO).\",\n\t\tnumber: \"Please enter a valid number.\",\n\t\tdigits: \"Please enter only digits.\",\n\t\tequalTo: \"Please enter the same value again.\",\n\t\tmaxlength: $.validator.format( \"Please enter no more than {0} characters.\" ),\n\t\tminlength: $.validator.format( \"Please enter at least {0} characters.\" ),\n\t\trangelength: $.validator.format( \"Please enter a value between {0} and {1} characters long.\" ),\n\t\trange: $.validator.format( \"Please enter a value between {0} and {1}.\" ),\n\t\tmax: $.validator.format( \"Please enter a value less than or equal to {0}.\" ),\n\t\tmin: $.validator.format( \"Please enter a value greater than or equal to {0}.\" ),\n\t\tstep: $.validator.format( \"Please enter a multiple of {0}.\" )\n\t},\n\n\tautoCreateRanges: false,\n\n\tprototype: {\n\n\t\tinit: function() {\n\t\t\tthis.labelContainer = $( this.settings.errorLabelContainer );\n\t\t\tthis.errorContext = this.labelContainer.length && this.labelContainer || $( this.currentForm );\n\t\t\tthis.containers = $( this.settings.errorContainer ).add( this.settings.errorLabelContainer );\n\t\t\tthis.submitted = {};\n\t\t\tthis.valueCache = {};\n\t\t\tthis.pendingRequest = 0;\n\t\t\tthis.pending = {};\n\t\t\tthis.invalid = {};\n\t\t\tthis.reset();\n\n\t\t\tvar groups = ( this.groups = {} ),\n\t\t\t\trules;\n\t\t\t$.each( this.settings.groups, function( key, value ) {\n\t\t\t\tif ( typeof value === \"string\" ) {\n\t\t\t\t\tvalue = value.split( /\\s/ );\n\t\t\t\t}\n\t\t\t\t$.each( value, function( index, name ) {\n\t\t\t\t\tgroups[ name ] = key;\n\t\t\t\t} );\n\t\t\t} );\n\t\t\trules = this.settings.rules;\n\t\t\t$.each( rules, function( key, value ) {\n\t\t\t\trules[ key ] = $.validator.normalizeRule( value );\n\t\t\t} );\n\n\t\t\tfunction delegate( event ) {\n\n\t\t\t\t// Set form expando on contenteditable\n\t\t\t\tif ( !this.form && this.hasAttribute( \"contenteditable\" ) ) {\n\t\t\t\t\tthis.form = $( this ).closest( \"form\" )[ 0 ];\n\t\t\t\t}\n\n\t\t\t\tvar validator = $.data( this.form, \"validator\" ),\n\t\t\t\t\teventType = \"on\" + event.type.replace( /^validate/, \"\" ),\n\t\t\t\t\tsettings = validator.settings;\n\t\t\t\tif ( settings[ eventType ] && !$( this ).is( settings.ignore ) ) {\n\t\t\t\t\tsettings[ eventType ].call( validator, this, event );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$( this.currentForm )\n\t\t\t\t.on( \"focusin.validate focusout.validate keyup.validate\",\n\t\t\t\t\t\":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], \" +\n\t\t\t\t\t\"[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], \" +\n\t\t\t\t\t\"[type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], \" +\n\t\t\t\t\t\"[type='radio'], [type='checkbox'], [contenteditable]\", delegate )\n\n\t\t\t\t// Support: Chrome, oldIE\n\t\t\t\t// \"select\" is provided as event.target when clicking a option\n\t\t\t\t.on( \"click.validate\", \"select, option, [type='radio'], [type='checkbox']\", delegate );\n\n\t\t\tif ( this.settings.invalidHandler ) {\n\t\t\t\t$( this.currentForm ).on( \"invalid-form.validate\", this.settings.invalidHandler );\n\t\t\t}\n\n\t\t\t// Add aria-required to any Static/Data/Class required fields before first validation\n\t\t\t// Screen readers require this attribute to be present before the initial submission http://www.w3.org/TR/WCAG-TECHS/ARIA2.html\n\t\t\t$( this.currentForm ).find( \"[required], [data-rule-required], .required\" ).attr( \"aria-required\", \"true\" );\n\t\t},\n\n\t\t// http://jqueryvalidation.org/Validator.form/\n\t\tform: function() {\n\t\t\tthis.checkForm();\n\t\t\t$.extend( this.submitted, this.errorMap );\n\t\t\tthis.invalid = $.extend( {}, this.errorMap );\n\t\t\tif ( !this.valid() ) {\n\t\t\t\t$( this.currentForm ).triggerHandler( \"invalid-form\", [ this ] );\n\t\t\t}\n\t\t\tthis.showErrors();\n\t\t\treturn this.valid();\n\t\t},\n\n\t\tcheckForm: function() {\n\t\t\tthis.prepareForm();\n\t\t\tfor ( var i = 0, elements = ( this.currentElements = this.elements() ); elements[ i ]; i++ ) {\n\t\t\t\tthis.check( elements[ i ] );\n\t\t\t}\n\t\t\treturn this.valid();\n\t\t},\n\n\t\t// http://jqueryvalidation.org/Validator.element/\n\t\telement: function( element ) {\n\t\t\tvar cleanElement = this.clean( element ),\n\t\t\t\tcheckElement = this.validationTargetFor( cleanElement ),\n\t\t\t\tv = this,\n\t\t\t\tresult = true,\n\t\t\t\trs, group;\n\n\t\t\tif ( checkElement === undefined ) {\n\t\t\t\tdelete this.invalid[ cleanElement.name ];\n\t\t\t} else {\n\t\t\t\tthis.prepareElement( checkElement );\n\t\t\t\tthis.currentElements = $( checkElement );\n\n\t\t\t\t// If this element is grouped, then validate all group elements already\n\t\t\t\t// containing a value\n\t\t\t\tgroup = this.groups[ checkElement.name ];\n\t\t\t\tif ( group ) {\n\t\t\t\t\t$.each( this.groups, function( name, testgroup ) {\n\t\t\t\t\t\tif ( testgroup === group && name !== checkElement.name ) {\n\t\t\t\t\t\t\tcleanElement = v.validationTargetFor( v.clean( v.findByName( name ) ) );\n\t\t\t\t\t\t\tif ( cleanElement && cleanElement.name in v.invalid ) {\n\t\t\t\t\t\t\t\tv.currentElements.push( cleanElement );\n\t\t\t\t\t\t\t\tresult = v.check( cleanElement ) && result;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\trs = this.check( checkElement ) !== false;\n\t\t\t\tresult = result && rs;\n\t\t\t\tif ( rs ) {\n\t\t\t\t\tthis.invalid[ checkElement.name ] = false;\n\t\t\t\t} else {\n\t\t\t\t\tthis.invalid[ checkElement.name ] = true;\n\t\t\t\t}\n\n\t\t\t\tif ( !this.numberOfInvalids() ) {\n\n\t\t\t\t\t// Hide error containers on last error\n\t\t\t\t\tthis.toHide = this.toHide.add( this.containers );\n\t\t\t\t}\n\t\t\t\tthis.showErrors();\n\n\t\t\t\t// Add aria-invalid status for screen readers\n\t\t\t\t$( element ).attr( \"aria-invalid\", !rs );\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\n\t\t// http://jqueryvalidation.org/Validator.showErrors/\n\t\tshowErrors: function( errors ) {\n\t\t\tif ( errors ) {\n\t\t\t\tvar validator = this;\n\n\t\t\t\t// Add items to error list and map\n\t\t\t\t$.extend( this.errorMap, errors );\n\t\t\t\tthis.errorList = $.map( this.errorMap, function( message, name ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tmessage: message,\n\t\t\t\t\t\telement: validator.findByName( name )[ 0 ]\n\t\t\t\t\t};\n\t\t\t\t} );\n\n\t\t\t\t// Remove items from success list\n\t\t\t\tthis.successList = $.grep( this.successList, function( element ) {\n\t\t\t\t\treturn !( element.name in errors );\n\t\t\t\t} );\n\t\t\t}\n\t\t\tif ( this.settings.showErrors ) {\n\t\t\t\tthis.settings.showErrors.call( this, this.errorMap, this.errorList );\n\t\t\t} else {\n\t\t\t\tthis.defaultShowErrors();\n\t\t\t}\n\t\t},\n\n\t\t// http://jqueryvalidation.org/Validator.resetForm/\n\t\tresetForm: function() {\n\t\t\tif ( $.fn.resetForm ) {\n\t\t\t\t$( this.currentForm ).resetForm();\n\t\t\t}\n\t\t\tthis.invalid = {};\n\t\t\tthis.submitted = {};\n\t\t\tthis.prepareForm();\n\t\t\tthis.hideErrors();\n\t\t\tvar elements = this.elements()\n\t\t\t\t.removeData( \"previousValue\" )\n\t\t\t\t.removeAttr( \"aria-invalid\" );\n\n\t\t\tthis.resetElements( elements );\n\t\t},\n\n\t\tresetElements: function( elements ) {\n\t\t\tvar i;\n\n\t\t\tif ( this.settings.unhighlight ) {\n\t\t\t\tfor ( i = 0; elements[ i ]; i++ ) {\n\t\t\t\t\tthis.settings.unhighlight.call( this, elements[ i ],\n\t\t\t\t\t\tthis.settings.errorClass, \"\" );\n\t\t\t\t\tthis.findByName( elements[ i ].name ).removeClass( this.settings.validClass );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\telements\n\t\t\t\t\t.removeClass( this.settings.errorClass )\n\t\t\t\t\t.removeClass( this.settings.validClass );\n\t\t\t}\n\t\t},\n\n\t\tnumberOfInvalids: function() {\n\t\t\treturn this.objectLength( this.invalid );\n\t\t},\n\n\t\tobjectLength: function( obj ) {\n\t\t\t/* jshint unused: false */\n\t\t\tvar count = 0,\n\t\t\t\ti;\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( obj[ i ] ) {\n\t\t\t\t\tcount++;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn count;\n\t\t},\n\n\t\thideErrors: function() {\n\t\t\tthis.hideThese( this.toHide );\n\t\t},\n\n\t\thideThese: function( errors ) {\n\t\t\terrors.not( this.containers ).text( \"\" );\n\t\t\tthis.addWrapper( errors ).hide();\n\t\t},\n\n\t\tvalid: function() {\n\t\t\treturn this.size() === 0;\n\t\t},\n\n\t\tsize: function() {\n\t\t\treturn this.errorList.length;\n\t\t},\n\n\t\tfocusInvalid: function() {\n\t\t\tif ( this.settings.focusInvalid ) {\n\t\t\t\ttry {\n\t\t\t\t\t$( this.findLastActive() || this.errorList.length && this.errorList[ 0 ].element || [] )\n\t\t\t\t\t.filter( \":visible\" )\n\t\t\t\t\t.focus()\n\n\t\t\t\t\t// Manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find\n\t\t\t\t\t.trigger( \"focusin\" );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// Ignore IE throwing errors when focusing hidden elements\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tfindLastActive: function() {\n\t\t\tvar lastActive = this.lastActive;\n\t\t\treturn lastActive && $.grep( this.errorList, function( n ) {\n\t\t\t\treturn n.element.name === lastActive.name;\n\t\t\t} ).length === 1 && lastActive;\n\t\t},\n\n\t\telements: function() {\n\t\t\tvar validator = this,\n\t\t\t\trulesCache = {};\n\n\t\t\t// Select all valid inputs inside the form (no submit or reset buttons)\n\t\t\treturn $( this.currentForm )\n\t\t\t.find( \"input, select, textarea, [contenteditable]\" )\n\t\t\t.not( \":submit, :reset, :image, :disabled\" )\n\t\t\t.not( this.settings.ignore )\n\t\t\t.filter( function() {\n\t\t\t\tvar name = this.name || $( this ).attr( \"name\" ); // For contenteditable\n\t\t\t\tif ( !name && validator.settings.debug && window.console ) {\n\t\t\t\t\tconsole.error( \"%o has no name assigned\", this );\n\t\t\t\t}\n\n\t\t\t\t// Set form expando on contenteditable\n\t\t\t\tif ( this.hasAttribute( \"contenteditable\" ) ) {\n\t\t\t\t\tthis.form = $( this ).closest( \"form\" )[ 0 ];\n\t\t\t\t}\n\n\t\t\t\t// Select only the first element for each name, and only those with rules specified\n\t\t\t\tif ( name in rulesCache || !validator.objectLength( $( this ).rules() ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\trulesCache[ name ] = true;\n\t\t\t\treturn true;\n\t\t\t} );\n\t\t},\n\n\t\tclean: function( selector ) {\n\t\t\treturn $( selector )[ 0 ];\n\t\t},\n\n\t\terrors: function() {\n\t\t\tvar errorClass = this.settings.errorClass.split( \" \" ).join( \".\" );\n\t\t\treturn $( this.settings.errorElement + \".\" + errorClass, this.errorContext );\n\t\t},\n\n\t\tresetInternals: function() {\n\t\t\tthis.successList = [];\n\t\t\tthis.errorList = [];\n\t\t\tthis.errorMap = {};\n\t\t\tthis.toShow = $( [] );\n\t\t\tthis.toHide = $( [] );\n\t\t},\n\n\t\treset: function() {\n\t\t\tthis.resetInternals();\n\t\t\tthis.currentElements = $( [] );\n\t\t},\n\n\t\tprepareForm: function() {\n\t\t\tthis.reset();\n\t\t\tthis.toHide = this.errors().add( this.containers );\n\t\t},\n\n\t\tprepareElement: function( element ) {\n\t\t\tthis.reset();\n\t\t\tthis.toHide = this.errorsFor( element );\n\t\t},\n\n\t\telementValue: function( element ) {\n\t\t\tvar $element = $( element ),\n\t\t\t\ttype = element.type,\n\t\t\t\tval, idx;\n\n\t\t\tif ( type === \"radio\" || type === \"checkbox\" ) {\n\t\t\t\treturn this.findByName( element.name ).filter( \":checked\" ).val();\n\t\t\t} else if ( type === \"number\" && typeof element.validity !== \"undefined\" ) {\n\t\t\t\treturn element.validity.badInput ? \"NaN\" : $element.val();\n\t\t\t}\n\n\t\t\tif ( element.hasAttribute( \"contenteditable\" ) ) {\n\t\t\t\tval = $element.text();\n\t\t\t} else {\n\t\t\t\tval = $element.val();\n\t\t\t}\n\n\t\t\tif ( type === \"file\" ) {\n\n\t\t\t\t// Modern browser (chrome & safari)\n\t\t\t\tif ( val.substr( 0, 12 ) === \"C:\\\\fakepath\\\\\" ) {\n\t\t\t\t\treturn val.substr( 12 );\n\t\t\t\t}\n\n\t\t\t\t// Legacy browsers\n\t\t\t\t// Unix-based path\n\t\t\t\tidx = val.lastIndexOf( \"/\" );\n\t\t\t\tif ( idx >= 0 ) {\n\t\t\t\t\treturn val.substr( idx + 1 );\n\t\t\t\t}\n\n\t\t\t\t// Windows-based path\n\t\t\t\tidx = val.lastIndexOf( \"\\\\\" );\n\t\t\t\tif ( idx >= 0 ) {\n\t\t\t\t\treturn val.substr( idx + 1 );\n\t\t\t\t}\n\n\t\t\t\t// Just the file name\n\t\t\t\treturn val;\n\t\t\t}\n\n\t\t\tif ( typeof val === \"string\" ) {\n\t\t\t\treturn val.replace( /\\r/g, \"\" );\n\t\t\t}\n\t\t\treturn val;\n\t\t},\n\n\t\tcheck: function( element ) {\n\t\t\telement = this.validationTargetFor( this.clean( element ) );\n\n\t\t\tvar rules = $( element ).rules(),\n\t\t\t\trulesCount = $.map( rules, function( n, i ) {\n\t\t\t\t\treturn i;\n\t\t\t\t} ).length,\n\t\t\t\tdependencyMismatch = false,\n\t\t\t\tval = this.elementValue( element ),\n\t\t\t\tresult, method, rule;\n\n\t\t\t// If a normalizer is defined for this element, then\n\t\t\t// call it to retreive the changed value instead\n\t\t\t// of using the real one.\n\t\t\t// Note that `this` in the normalizer is `element`.\n\t\t\tif ( typeof rules.normalizer === \"function\" ) {\n\t\t\t\tval = rules.normalizer.call( element, val );\n\n\t\t\t\tif ( typeof val !== \"string\" ) {\n\t\t\t\t\tthrow new TypeError( \"The normalizer should return a string value.\" );\n\t\t\t\t}\n\n\t\t\t\t// Delete the normalizer from rules to avoid treating\n\t\t\t\t// it as a pre-defined method.\n\t\t\t\tdelete rules.normalizer;\n\t\t\t}\n\n\t\t\tfor ( method in rules ) {\n\t\t\t\trule = { method: method, parameters: rules[ method ] };\n\t\t\t\ttry {\n\t\t\t\t\tresult = $.validator.methods[ method ].call( this, val, element, rule.parameters );\n\n\t\t\t\t\t// If a method indicates that the field is optional and therefore valid,\n\t\t\t\t\t// don't mark it as valid when there are no other rules\n\t\t\t\t\tif ( result === \"dependency-mismatch\" && rulesCount === 1 ) {\n\t\t\t\t\t\tdependencyMismatch = true;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tdependencyMismatch = false;\n\n\t\t\t\t\tif ( result === \"pending\" ) {\n\t\t\t\t\t\tthis.toHide = this.toHide.not( this.errorsFor( element ) );\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !result ) {\n\t\t\t\t\t\tthis.formatAndAdd( element, rule );\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} catch ( e ) {\n\t\t\t\t\tif ( this.settings.debug && window.console ) {\n\t\t\t\t\t\tconsole.log( \"Exception occurred when checking element \" + element.id + \", check the '\" + rule.method + \"' method.\", e );\n\t\t\t\t\t}\n\t\t\t\t\tif ( e instanceof TypeError ) {\n\t\t\t\t\t\te.message += \".  Exception occurred when checking element \" + element.id + \", check the '\" + rule.method + \"' method.\";\n\t\t\t\t\t}\n\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( dependencyMismatch ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( this.objectLength( rules ) ) {\n\t\t\t\tthis.successList.push( element );\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t// Return the custom message for the given element and validation method\n\t\t// specified in the element's HTML5 data attribute\n\t\t// return the generic message if present and no method specific message is present\n\t\tcustomDataMessage: function( element, method ) {\n\t\t\treturn $( element ).data( \"msg\" + method.charAt( 0 ).toUpperCase() +\n\t\t\t\tmethod.substring( 1 ).toLowerCase() ) || $( element ).data( \"msg\" );\n\t\t},\n\n\t\t// Return the custom message for the given element name and validation method\n\t\tcustomMessage: function( name, method ) {\n\t\t\tvar m = this.settings.messages[ name ];\n\t\t\treturn m && ( m.constructor === String ? m : m[ method ] );\n\t\t},\n\n\t\t// Return the first defined argument, allowing empty strings\n\t\tfindDefined: function() {\n\t\t\tfor ( var i = 0; i < arguments.length; i++ ) {\n\t\t\t\tif ( arguments[ i ] !== undefined ) {\n\t\t\t\t\treturn arguments[ i ];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\n\t\t// The second parameter 'rule' used to be a string, and extended to an object literal\n\t\t// of the following form:\n\t\t// rule = {\n\t\t//     method: \"method name\",\n\t\t//     parameters: \"the given method parameters\"\n\t\t// }\n\t\t//\n\t\t// The old behavior still supported, kept to maintain backward compatibility with\n\t\t// old code, and will be removed in the next major release.\n\t\tdefaultMessage: function( element, rule ) {\n\t\t\tif ( typeof rule === \"string\" ) {\n\t\t\t\trule = { method: rule };\n\t\t\t}\n\n\t\t\tvar message = this.findDefined(\n\t\t\t\t\tthis.customMessage( element.name, rule.method ),\n\t\t\t\t\tthis.customDataMessage( element, rule.method ),\n\n\t\t\t\t\t// 'title' is never undefined, so handle empty string as undefined\n\t\t\t\t\t!this.settings.ignoreTitle && element.title || undefined,\n\t\t\t\t\t$.validator.messages[ rule.method ],\n\t\t\t\t\t\"<strong>Warning: No message defined for \" + element.name + \"</strong>\"\n\t\t\t\t),\n\t\t\t\ttheregex = /\\$?\\{(\\d+)\\}/g;\n\t\t\tif ( typeof message === \"function\" ) {\n\t\t\t\tmessage = message.call( this, rule.parameters, element );\n\t\t\t} else if ( theregex.test( message ) ) {\n\t\t\t\tmessage = $.validator.format( message.replace( theregex, \"{$1}\" ), rule.parameters );\n\t\t\t}\n\n\t\t\treturn message;\n\t\t},\n\n\t\tformatAndAdd: function( element, rule ) {\n\t\t\tvar message = this.defaultMessage( element, rule );\n\n\t\t\tthis.errorList.push( {\n\t\t\t\tmessage: message,\n\t\t\t\telement: element,\n\t\t\t\tmethod: rule.method\n\t\t\t} );\n\n\t\t\tthis.errorMap[ element.name ] = message;\n\t\t\tthis.submitted[ element.name ] = message;\n\t\t},\n\n\t\taddWrapper: function( toToggle ) {\n\t\t\tif ( this.settings.wrapper ) {\n\t\t\t\ttoToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );\n\t\t\t}\n\t\t\treturn toToggle;\n\t\t},\n\n\t\tdefaultShowErrors: function() {\n\t\t\tvar i, elements, error;\n\t\t\tfor ( i = 0; this.errorList[ i ]; i++ ) {\n\t\t\t\terror = this.errorList[ i ];\n\t\t\t\tif ( this.settings.highlight ) {\n\t\t\t\t\tthis.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass );\n\t\t\t\t}\n\t\t\t\tthis.showLabel( error.element, error.message );\n\t\t\t}\n\t\t\tif ( this.errorList.length ) {\n\t\t\t\tthis.toShow = this.toShow.add( this.containers );\n\t\t\t}\n\t\t\tif ( this.settings.success ) {\n\t\t\t\tfor ( i = 0; this.successList[ i ]; i++ ) {\n\t\t\t\t\tthis.showLabel( this.successList[ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( this.settings.unhighlight ) {\n\t\t\t\tfor ( i = 0, elements = this.validElements(); elements[ i ]; i++ ) {\n\t\t\t\t\tthis.settings.unhighlight.call( this, elements[ i ], this.settings.errorClass, this.settings.validClass );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.toHide = this.toHide.not( this.toShow );\n\t\t\tthis.hideErrors();\n\t\t\tthis.addWrapper( this.toShow ).show();\n\t\t},\n\n\t\tvalidElements: function() {\n\t\t\treturn this.currentElements.not( this.invalidElements() );\n\t\t},\n\n\t\tinvalidElements: function() {\n\t\t\treturn $( this.errorList ).map( function() {\n\t\t\t\treturn this.element;\n\t\t\t} );\n\t\t},\n\n\t\tshowLabel: function( element, message ) {\n\t\t\tvar place, group, errorID, v,\n\t\t\t\terror = this.errorsFor( element ),\n\t\t\t\telementID = this.idOrName( element ),\n\t\t\t\tdescribedBy = $( element ).attr( \"aria-describedby\" );\n\n\t\t\tif ( error.length ) {\n\n\t\t\t\t// Refresh error/success class\n\t\t\t\terror.removeClass( this.settings.validClass ).addClass( this.settings.errorClass );\n\n\t\t\t\t// Replace message on existing label\n\t\t\t\terror.html( message );\n\t\t\t} else {\n\n\t\t\t\t// Create error element\n\t\t\t\terror = $( \"<\" + this.settings.errorElement + \">\" )\n\t\t\t\t\t.attr( \"id\", elementID + \"-error\" )\n\t\t\t\t\t.addClass( this.settings.errorClass )\n\t\t\t\t\t.html( message || \"\" );\n\n\t\t\t\t// Maintain reference to the element to be placed into the DOM\n\t\t\t\tplace = error;\n\t\t\t\tif ( this.settings.wrapper ) {\n\n\t\t\t\t\t// Make sure the element is visible, even in IE\n\t\t\t\t\t// actually showing the wrapped element is handled elsewhere\n\t\t\t\t\tplace = error.hide().show().wrap( \"<\" + this.settings.wrapper + \"/>\" ).parent();\n\t\t\t\t}\n\t\t\t\tif ( this.labelContainer.length ) {\n\t\t\t\t\tthis.labelContainer.append( place );\n\t\t\t\t} else if ( this.settings.errorPlacement ) {\n\t\t\t\t\tthis.settings.errorPlacement.call( this, place, $( element ) );\n\t\t\t\t} else {\n\t\t\t\t\tplace.insertAfter( element );\n\t\t\t\t}\n\n\t\t\t\t// Link error back to the element\n\t\t\t\tif ( error.is( \"label\" ) ) {\n\n\t\t\t\t\t// If the error is a label, then associate using 'for'\n\t\t\t\t\terror.attr( \"for\", elementID );\n\n\t\t\t\t\t// If the element is not a child of an associated label, then it's necessary\n\t\t\t\t\t// to explicitly apply aria-describedby\n\t\t\t\t} else if ( error.parents( \"label[for='\" + this.escapeCssMeta( elementID ) + \"']\" ).length === 0 ) {\n\t\t\t\t\terrorID = error.attr( \"id\" );\n\n\t\t\t\t\t// Respect existing non-error aria-describedby\n\t\t\t\t\tif ( !describedBy ) {\n\t\t\t\t\t\tdescribedBy = errorID;\n\t\t\t\t\t} else if ( !describedBy.match( new RegExp( \"\\\\b\" + this.escapeCssMeta( errorID ) + \"\\\\b\" ) ) ) {\n\n\t\t\t\t\t\t// Add to end of list if not already present\n\t\t\t\t\t\tdescribedBy += \" \" + errorID;\n\t\t\t\t\t}\n\t\t\t\t\t$( element ).attr( \"aria-describedby\", describedBy );\n\n\t\t\t\t\t// If this element is grouped, then assign to all elements in the same group\n\t\t\t\t\tgroup = this.groups[ element.name ];\n\t\t\t\t\tif ( group ) {\n\t\t\t\t\t\tv = this;\n\t\t\t\t\t\t$.each( v.groups, function( name, testgroup ) {\n\t\t\t\t\t\t\tif ( testgroup === group ) {\n\t\t\t\t\t\t\t\t$( \"[name='\" + v.escapeCssMeta( name ) + \"']\", v.currentForm )\n\t\t\t\t\t\t\t\t\t.attr( \"aria-describedby\", error.attr( \"id\" ) );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( !message && this.settings.success ) {\n\t\t\t\terror.text( \"\" );\n\t\t\t\tif ( typeof this.settings.success === \"string\" ) {\n\t\t\t\t\terror.addClass( this.settings.success );\n\t\t\t\t} else {\n\t\t\t\t\tthis.settings.success( error, element );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.toShow = this.toShow.add( error );\n\t\t},\n\n\t\terrorsFor: function( element ) {\n\t\t\tvar name = this.escapeCssMeta( this.idOrName( element ) ),\n\t\t\t\tdescriber = $( element ).attr( \"aria-describedby\" ),\n\t\t\t\tselector = \"label[for='\" + name + \"'], label[for='\" + name + \"'] *\";\n\n\t\t\t// 'aria-describedby' should directly reference the error element\n\t\t\tif ( describer ) {\n\t\t\t\tselector = selector + \", #\" + this.escapeCssMeta( describer )\n\t\t\t\t\t.replace( /\\s+/g, \", #\" );\n\t\t\t}\n\n\t\t\treturn this\n\t\t\t\t.errors()\n\t\t\t\t.filter( selector );\n\t\t},\n\n\t\t// See https://api.jquery.com/category/selectors/, for CSS\n\t\t// meta-characters that should be escaped in order to be used with JQuery\n\t\t// as a literal part of a name/id or any selector.\n\t\tescapeCssMeta: function( string ) {\n\t\t\treturn string.replace( /([\\\\!\"#$%&'()*+,./:;<=>?@\\[\\]^`{|}~])/g, \"\\\\$1\" );\n\t\t},\n\n\t\tidOrName: function( element ) {\n\t\t\treturn this.groups[ element.name ] || ( this.checkable( element ) ? element.name : element.id || element.name );\n\t\t},\n\n\t\tvalidationTargetFor: function( element ) {\n\n\t\t\t// If radio/checkbox, validate first element in group instead\n\t\t\tif ( this.checkable( element ) ) {\n\t\t\t\telement = this.findByName( element.name );\n\t\t\t}\n\n\t\t\t// Always apply ignore filter\n\t\t\treturn $( element ).not( this.settings.ignore )[ 0 ];\n\t\t},\n\n\t\tcheckable: function( element ) {\n\t\t\treturn ( /radio|checkbox/i ).test( element.type );\n\t\t},\n\n\t\tfindByName: function( name ) {\n\t\t\treturn $( this.currentForm ).find( \"[name='\" + this.escapeCssMeta( name ) + \"']\" );\n\t\t},\n\n\t\tgetLength: function( value, element ) {\n\t\t\tswitch ( element.nodeName.toLowerCase() ) {\n\t\t\tcase \"select\":\n\t\t\t\treturn $( \"option:selected\", element ).length;\n\t\t\tcase \"input\":\n\t\t\t\tif ( this.checkable( element ) ) {\n\t\t\t\t\treturn this.findByName( element.name ).filter( \":checked\" ).length;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn value.length;\n\t\t},\n\n\t\tdepend: function( param, element ) {\n\t\t\treturn this.dependTypes[ typeof param ] ? this.dependTypes[ typeof param ]( param, element ) : true;\n\t\t},\n\n\t\tdependTypes: {\n\t\t\t\"boolean\": function( param ) {\n\t\t\t\treturn param;\n\t\t\t},\n\t\t\t\"string\": function( param, element ) {\n\t\t\t\treturn !!$( param, element.form ).length;\n\t\t\t},\n\t\t\t\"function\": function( param, element ) {\n\t\t\t\treturn param( element );\n\t\t\t}\n\t\t},\n\n\t\toptional: function( element ) {\n\t\t\tvar val = this.elementValue( element );\n\t\t\treturn !$.validator.methods.required.call( this, val, element ) && \"dependency-mismatch\";\n\t\t},\n\n\t\tstartRequest: function( element ) {\n\t\t\tif ( !this.pending[ element.name ] ) {\n\t\t\t\tthis.pendingRequest++;\n\t\t\t\t$( element ).addClass( this.settings.pendingClass );\n\t\t\t\tthis.pending[ element.name ] = true;\n\t\t\t}\n\t\t},\n\n\t\tstopRequest: function( element, valid ) {\n\t\t\tthis.pendingRequest--;\n\n\t\t\t// Sometimes synchronization fails, make sure pendingRequest is never < 0\n\t\t\tif ( this.pendingRequest < 0 ) {\n\t\t\t\tthis.pendingRequest = 0;\n\t\t\t}\n\t\t\tdelete this.pending[ element.name ];\n\t\t\t$( element ).removeClass( this.settings.pendingClass );\n\t\t\tif ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() ) {\n\t\t\t\t$( this.currentForm ).submit();\n\t\t\t\tthis.formSubmitted = false;\n\t\t\t} else if ( !valid && this.pendingRequest === 0 && this.formSubmitted ) {\n\t\t\t\t$( this.currentForm ).triggerHandler( \"invalid-form\", [ this ] );\n\t\t\t\tthis.formSubmitted = false;\n\t\t\t}\n\t\t},\n\n\t\tpreviousValue: function( element, method ) {\n\t\t\tmethod = typeof method === \"string\" && method || \"remote\";\n\n\t\t\treturn $.data( element, \"previousValue\" ) || $.data( element, \"previousValue\", {\n\t\t\t\told: null,\n\t\t\t\tvalid: true,\n\t\t\t\tmessage: this.defaultMessage( element, { method: method } )\n\t\t\t} );\n\t\t},\n\n\t\t// Cleans up all forms and elements, removes validator-specific events\n\t\tdestroy: function() {\n\t\t\tthis.resetForm();\n\n\t\t\t$( this.currentForm )\n\t\t\t\t.off( \".validate\" )\n\t\t\t\t.removeData( \"validator\" )\n\t\t\t\t.find( \".validate-equalTo-blur\" )\n\t\t\t\t\t.off( \".validate-equalTo\" )\n\t\t\t\t\t.removeClass( \"validate-equalTo-blur\" );\n\t\t}\n\n\t},\n\n\tclassRuleSettings: {\n\t\trequired: { required: true },\n\t\temail: { email: true },\n\t\turl: { url: true },\n\t\tdate: { date: true },\n\t\tdateISO: { dateISO: true },\n\t\tnumber: { number: true },\n\t\tdigits: { digits: true },\n\t\tcreditcard: { creditcard: true }\n\t},\n\n\taddClassRules: function( className, rules ) {\n\t\tif ( className.constructor === String ) {\n\t\t\tthis.classRuleSettings[ className ] = rules;\n\t\t} else {\n\t\t\t$.extend( this.classRuleSettings, className );\n\t\t}\n\t},\n\n\tclassRules: function( element ) {\n\t\tvar rules = {},\n\t\t\tclasses = $( element ).attr( \"class\" );\n\n\t\tif ( classes ) {\n\t\t\t$.each( classes.split( \" \" ), function() {\n\t\t\t\tif ( this in $.validator.classRuleSettings ) {\n\t\t\t\t\t$.extend( rules, $.validator.classRuleSettings[ this ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t\treturn rules;\n\t},\n\n\tnormalizeAttributeRule: function( rules, type, method, value ) {\n\n\t\t// Convert the value to a number for number inputs, and for text for backwards compability\n\t\t// allows type=\"date\" and others to be compared as strings\n\t\tif ( /min|max|step/.test( method ) && ( type === null || /number|range|text/.test( type ) ) ) {\n\t\t\tvalue = Number( value );\n\n\t\t\t// Support Opera Mini, which returns NaN for undefined minlength\n\t\t\tif ( isNaN( value ) ) {\n\t\t\t\tvalue = undefined;\n\t\t\t}\n\t\t}\n\n\t\tif ( value || value === 0 ) {\n\t\t\trules[ method ] = value;\n\t\t} else if ( type === method && type !== \"range\" ) {\n\n\t\t\t// Exception: the jquery validate 'range' method\n\t\t\t// does not test for the html5 'range' type\n\t\t\trules[ method ] = true;\n\t\t}\n\t},\n\n\tattributeRules: function( element ) {\n\t\tvar rules = {},\n\t\t\t$element = $( element ),\n\t\t\ttype = element.getAttribute( \"type\" ),\n\t\t\tmethod, value;\n\n\t\tfor ( method in $.validator.methods ) {\n\n\t\t\t// Support for <input required> in both html5 and older browsers\n\t\t\tif ( method === \"required\" ) {\n\t\t\t\tvalue = element.getAttribute( method );\n\n\t\t\t\t// Some browsers return an empty string for the required attribute\n\t\t\t\t// and non-HTML5 browsers might have required=\"\" markup\n\t\t\t\tif ( value === \"\" ) {\n\t\t\t\t\tvalue = true;\n\t\t\t\t}\n\n\t\t\t\t// Force non-HTML5 browsers to return bool\n\t\t\t\tvalue = !!value;\n\t\t\t} else {\n\t\t\t\tvalue = $element.attr( method );\n\t\t\t}\n\n\t\t\tthis.normalizeAttributeRule( rules, type, method, value );\n\t\t}\n\n\t\t// 'maxlength' may be returned as -1, 2147483647 ( IE ) and 524288 ( safari ) for text inputs\n\t\tif ( rules.maxlength && /-1|2147483647|524288/.test( rules.maxlength ) ) {\n\t\t\tdelete rules.maxlength;\n\t\t}\n\n\t\treturn rules;\n\t},\n\n\tdataRules: function( element ) {\n\t\tvar rules = {},\n\t\t\t$element = $( element ),\n\t\t\ttype = element.getAttribute( \"type\" ),\n\t\t\tmethod, value;\n\n\t\tfor ( method in $.validator.methods ) {\n\t\t\tvalue = $element.data( \"rule\" + method.charAt( 0 ).toUpperCase() + method.substring( 1 ).toLowerCase() );\n\t\t\tthis.normalizeAttributeRule( rules, type, method, value );\n\t\t}\n\t\treturn rules;\n\t},\n\n\tstaticRules: function( element ) {\n\t\tvar rules = {},\n\t\t\tvalidator = $.data( element.form, \"validator\" );\n\n\t\tif ( validator.settings.rules ) {\n\t\t\trules = $.validator.normalizeRule( validator.settings.rules[ element.name ] ) || {};\n\t\t}\n\t\treturn rules;\n\t},\n\n\tnormalizeRules: function( rules, element ) {\n\n\t\t// Handle dependency check\n\t\t$.each( rules, function( prop, val ) {\n\n\t\t\t// Ignore rule when param is explicitly false, eg. required:false\n\t\t\tif ( val === false ) {\n\t\t\t\tdelete rules[ prop ];\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( val.param || val.depends ) {\n\t\t\t\tvar keepRule = true;\n\t\t\t\tswitch ( typeof val.depends ) {\n\t\t\t\tcase \"string\":\n\t\t\t\t\tkeepRule = !!$( val.depends, element.form ).length;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"function\":\n\t\t\t\t\tkeepRule = val.depends.call( element, element );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif ( keepRule ) {\n\t\t\t\t\trules[ prop ] = val.param !== undefined ? val.param : true;\n\t\t\t\t} else {\n\t\t\t\t\t$.data( element.form, \"validator\" ).resetElements( $( element ) );\n\t\t\t\t\tdelete rules[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\t// Evaluate parameters\n\t\t$.each( rules, function( rule, parameter ) {\n\t\t\trules[ rule ] = $.isFunction( parameter ) && rule !== \"normalizer\" ? parameter( element ) : parameter;\n\t\t} );\n\n\t\t// Clean number parameters\n\t\t$.each( [ \"minlength\", \"maxlength\" ], function() {\n\t\t\tif ( rules[ this ] ) {\n\t\t\t\trules[ this ] = Number( rules[ this ] );\n\t\t\t}\n\t\t} );\n\t\t$.each( [ \"rangelength\", \"range\" ], function() {\n\t\t\tvar parts;\n\t\t\tif ( rules[ this ] ) {\n\t\t\t\tif ( $.isArray( rules[ this ] ) ) {\n\t\t\t\t\trules[ this ] = [ Number( rules[ this ][ 0 ] ), Number( rules[ this ][ 1 ] ) ];\n\t\t\t\t} else if ( typeof rules[ this ] === \"string\" ) {\n\t\t\t\t\tparts = rules[ this ].replace( /[\\[\\]]/g, \"\" ).split( /[\\s,]+/ );\n\t\t\t\t\trules[ this ] = [ Number( parts[ 0 ] ), Number( parts[ 1 ] ) ];\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\tif ( $.validator.autoCreateRanges ) {\n\n\t\t\t// Auto-create ranges\n\t\t\tif ( rules.min != null && rules.max != null ) {\n\t\t\t\trules.range = [ rules.min, rules.max ];\n\t\t\t\tdelete rules.min;\n\t\t\t\tdelete rules.max;\n\t\t\t}\n\t\t\tif ( rules.minlength != null && rules.maxlength != null ) {\n\t\t\t\trules.rangelength = [ rules.minlength, rules.maxlength ];\n\t\t\t\tdelete rules.minlength;\n\t\t\t\tdelete rules.maxlength;\n\t\t\t}\n\t\t}\n\n\t\treturn rules;\n\t},\n\n\t// Converts a simple string to a {string: true} rule, e.g., \"required\" to {required:true}\n\tnormalizeRule: function( data ) {\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tvar transformed = {};\n\t\t\t$.each( data.split( /\\s/ ), function() {\n\t\t\t\ttransformed[ this ] = true;\n\t\t\t} );\n\t\t\tdata = transformed;\n\t\t}\n\t\treturn data;\n\t},\n\n\t// http://jqueryvalidation.org/jQuery.validator.addMethod/\n\taddMethod: function( name, method, message ) {\n\t\t$.validator.methods[ name ] = method;\n\t\t$.validator.messages[ name ] = message !== undefined ? message : $.validator.messages[ name ];\n\t\tif ( method.length < 3 ) {\n\t\t\t$.validator.addClassRules( name, $.validator.normalizeRule( name ) );\n\t\t}\n\t},\n\n\t// http://jqueryvalidation.org/jQuery.validator.methods/\n\tmethods: {\n\n\t\t// http://jqueryvalidation.org/required-method/\n\t\trequired: function( value, element, param ) {\n\n\t\t\t// Check if dependency is met\n\t\t\tif ( !this.depend( param, element ) ) {\n\t\t\t\treturn \"dependency-mismatch\";\n\t\t\t}\n\t\t\tif ( element.nodeName.toLowerCase() === \"select\" ) {\n\n\t\t\t\t// Could be an array for select-multiple or a string, both are fine this way\n\t\t\t\tvar val = $( element ).val();\n\t\t\t\treturn val && val.length > 0;\n\t\t\t}\n\t\t\tif ( this.checkable( element ) ) {\n\t\t\t\treturn this.getLength( value, element ) > 0;\n\t\t\t}\n\t\t\treturn value.length > 0;\n\t\t},\n\n\t\t// http://jqueryvalidation.org/email-method/\n\t\temail: function( value, element ) {\n\n\t\t\t// From https://html.spec.whatwg.org/multipage/forms.html#valid-e-mail-address\n\t\t\t// Retrieved 2014-01-14\n\t\t\t// If you have a problem with this implementation, report a bug against the above spec\n\t\t\t// Or use custom methods to implement your own email validation\n\t\t\treturn this.optional( element ) || /^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test( value );\n\t\t},\n\n\t\t// http://jqueryvalidation.org/url-method/\n\t\turl: function( value, element ) {\n\n\t\t\t// Copyright (c) 2010-2013 Diego Perini, MIT licensed\n\t\t\t// https://gist.github.com/dperini/729294\n\t\t\t// see also https://mathiasbynens.be/demo/url-regex\n\t\t\t// modified to allow protocol-relative URLs\n\t\t\treturn this.optional( element ) || /^(?:(?:(?:https?|ftp):)?\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})).?)(?::\\d{2,5})?(?:[/?#]\\S*)?$/i.test( value );\n\t\t},\n\n\t\t// http://jqueryvalidation.org/date-method/\n\t\tdate: function( value, element ) {\n\t\t\treturn this.optional( element ) || !/Invalid|NaN/.test( new Date( value ).toString() );\n\t\t},\n\n\t\t// http://jqueryvalidation.org/dateISO-method/\n\t\tdateISO: function( value, element ) {\n\t\t\treturn this.optional( element ) || /^\\d{4}[\\/\\-](0?[1-9]|1[012])[\\/\\-](0?[1-9]|[12][0-9]|3[01])$/.test( value );\n\t\t},\n\n\t\t// http://jqueryvalidation.org/number-method/\n\t\tnumber: function( value, element ) {\n\t\t\treturn this.optional( element ) || /^(?:-?\\d+|-?\\d{1,3}(?:,\\d{3})+)?(?:\\.\\d+)?$/.test( value );\n\t\t},\n\n\t\t// http://jqueryvalidation.org/digits-method/\n\t\tdigits: function( value, element ) {\n\t\t\treturn this.optional( element ) || /^\\d+$/.test( value );\n\t\t},\n\n\t\t// http://jqueryvalidation.org/minlength-method/\n\t\tminlength: function( value, element, param ) {\n\t\t\tvar length = $.isArray( value ) ? value.length : this.getLength( value, element );\n\t\t\treturn this.optional( element ) || length >= param;\n\t\t},\n\n\t\t// http://jqueryvalidation.org/maxlength-method/\n\t\tmaxlength: function( value, element, param ) {\n\t\t\tvar length = $.isArray( value ) ? value.length : this.getLength( value, element );\n\t\t\treturn this.optional( element ) || length <= param;\n\t\t},\n\n\t\t// http://jqueryvalidation.org/rangelength-method/\n\t\trangelength: function( value, element, param ) {\n\t\t\tvar length = $.isArray( value ) ? value.length : this.getLength( value, element );\n\t\t\treturn this.optional( element ) || ( length >= param[ 0 ] && length <= param[ 1 ] );\n\t\t},\n\n\t\t// http://jqueryvalidation.org/min-method/\n\t\tmin: function( value, element, param ) {\n\t\t\treturn this.optional( element ) || value >= param;\n\t\t},\n\n\t\t// http://jqueryvalidation.org/max-method/\n\t\tmax: function( value, element, param ) {\n\t\t\treturn this.optional( element ) || value <= param;\n\t\t},\n\n\t\t// http://jqueryvalidation.org/range-method/\n\t\trange: function( value, element, param ) {\n\t\t\treturn this.optional( element ) || ( value >= param[ 0 ] && value <= param[ 1 ] );\n\t\t},\n\n\t\t// http://jqueryvalidation.org/step-method/\n\t\tstep: function( value, element, param ) {\n\t\t\tvar type = $( element ).attr( \"type\" ),\n\t\t\t\terrorMessage = \"Step attribute on input type \" + type + \" is not supported.\",\n\t\t\t\tsupportedTypes = [ \"text\", \"number\", \"range\" ],\n\t\t\t\tre = new RegExp( \"\\\\b\" + type + \"\\\\b\" ),\n\t\t\t\tnotSupported = type && !re.test( supportedTypes.join() ),\n\t\t\t\tdecimalPlaces = function( num ) {\n\t\t\t\t\tvar match = ( \"\" + num ).match( /(?:\\.(\\d+))?$/ );\n\t\t\t\t\tif ( !match ) {\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Number of digits right of decimal point.\n\t\t\t\t\treturn match[ 1 ] ? match[ 1 ].length : 0;\n\t\t\t\t},\n\t\t\t\ttoInt = function( num ) {\n\t\t\t\t\treturn Math.round( num * Math.pow( 10, decimals ) );\n\t\t\t\t},\n\t\t\t\tvalid = true,\n\t\t\t\tdecimals;\n\n\t\t\t// Works only for text, number and range input types\n\t\t\t// TODO find a way to support input types date, datetime, datetime-local, month, time and week\n\t\t\tif ( notSupported ) {\n\t\t\t\tthrow new Error( errorMessage );\n\t\t\t}\n\n\t\t\tdecimals = decimalPlaces( param );\n\n\t\t\t// Value can't have too many decimals\n\t\t\tif ( decimalPlaces( value ) > decimals || toInt( value ) % toInt( param ) !== 0 ) {\n\t\t\t\tvalid = false;\n\t\t\t}\n\n\t\t\treturn this.optional( element ) || valid;\n\t\t},\n\n\t\t// http://jqueryvalidation.org/equalTo-method/\n\t\tequalTo: function( value, element, param ) {\n\n\t\t\t// Bind to the blur event of the target in order to revalidate whenever the target field is updated\n\t\t\tvar target = $( param );\n\t\t\tif ( this.settings.onfocusout && target.not( \".validate-equalTo-blur\" ).length ) {\n\t\t\t\ttarget.addClass( \"validate-equalTo-blur\" ).on( \"blur.validate-equalTo\", function() {\n\t\t\t\t\t$( element ).valid();\n\t\t\t\t} );\n\t\t\t}\n\t\t\treturn value === target.val();\n\t\t},\n\n\t\t// http://jqueryvalidation.org/remote-method/\n\t\tremote: function( value, element, param, method ) {\n\t\t\tif ( this.optional( element ) ) {\n\t\t\t\treturn \"dependency-mismatch\";\n\t\t\t}\n\n\t\t\tmethod = typeof method === \"string\" && method || \"remote\";\n\n\t\t\tvar previous = this.previousValue( element, method ),\n\t\t\t\tvalidator, data, optionDataString;\n\n\t\t\tif ( !this.settings.messages[ element.name ] ) {\n\t\t\t\tthis.settings.messages[ element.name ] = {};\n\t\t\t}\n\t\t\tprevious.originalMessage = previous.originalMessage || this.settings.messages[ element.name ][ method ];\n\t\t\tthis.settings.messages[ element.name ][ method ] = previous.message;\n\n\t\t\tparam = typeof param === \"string\" && { url: param } || param;\n\t\t\toptionDataString = $.param( $.extend( { data: value }, param.data ) );\n\t\t\tif ( previous.old === optionDataString ) {\n\t\t\t\treturn previous.valid;\n\t\t\t}\n\n\t\t\tprevious.old = optionDataString;\n\t\t\tvalidator = this;\n\t\t\tthis.startRequest( element );\n\t\t\tdata = {};\n\t\t\tdata[ element.name ] = value;\n\t\t\t$.ajax( $.extend( true, {\n\t\t\t\tmode: \"abort\",\n\t\t\t\tport: \"validate\" + element.name,\n\t\t\t\tdataType: \"json\",\n\t\t\t\tdata: data,\n\t\t\t\tcontext: validator.currentForm,\n\t\t\t\tsuccess: function( response ) {\n\t\t\t\t\tvar valid = response === true || response === \"true\",\n\t\t\t\t\t\terrors, message, submitted;\n\n\t\t\t\t\tvalidator.settings.messages[ element.name ][ method ] = previous.originalMessage;\n\t\t\t\t\tif ( valid ) {\n\t\t\t\t\t\tsubmitted = validator.formSubmitted;\n\t\t\t\t\t\tvalidator.resetInternals();\n\t\t\t\t\t\tvalidator.toHide = validator.errorsFor( element );\n\t\t\t\t\t\tvalidator.formSubmitted = submitted;\n\t\t\t\t\t\tvalidator.successList.push( element );\n\t\t\t\t\t\tvalidator.invalid[ element.name ] = false;\n\t\t\t\t\t\tvalidator.showErrors();\n\t\t\t\t\t} else {\n\t\t\t\t\t\terrors = {};\n\t\t\t\t\t\tmessage = response || validator.defaultMessage( element, { method: method, parameters: value } );\n\t\t\t\t\t\terrors[ element.name ] = previous.message = message;\n\t\t\t\t\t\tvalidator.invalid[ element.name ] = true;\n\t\t\t\t\t\tvalidator.showErrors( errors );\n\t\t\t\t\t}\n\t\t\t\t\tprevious.valid = valid;\n\t\t\t\t\tvalidator.stopRequest( element, valid );\n\t\t\t\t}\n\t\t\t}, param ) );\n\t\t\treturn \"pending\";\n\t\t}\n\t}\n\n} );\n\n// Ajax mode: abort\n// usage: $.ajax({ mode: \"abort\"[, port: \"uniqueport\"]});\n// if mode:\"abort\" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()\n\nvar pendingRequests = {},\n\tajax;\n\n// Use a prefilter if available (1.5+)\nif ( $.ajaxPrefilter ) {\n\t$.ajaxPrefilter( function( settings, _, xhr ) {\n\t\tvar port = settings.port;\n\t\tif ( settings.mode === \"abort\" ) {\n\t\t\tif ( pendingRequests[ port ] ) {\n\t\t\t\tpendingRequests[ port ].abort();\n\t\t\t}\n\t\t\tpendingRequests[ port ] = xhr;\n\t\t}\n\t} );\n} else {\n\n\t// Proxy ajax\n\tajax = $.ajax;\n\t$.ajax = function( settings ) {\n\t\tvar mode = ( \"mode\" in settings ? settings : $.ajaxSettings ).mode,\n\t\t\tport = ( \"port\" in settings ? settings : $.ajaxSettings ).port;\n\t\tif ( mode === \"abort\" ) {\n\t\t\tif ( pendingRequests[ port ] ) {\n\t\t\t\tpendingRequests[ port ].abort();\n\t\t\t}\n\t\t\tpendingRequests[ port ] = ajax.apply( this, arguments );\n\t\t\treturn pendingRequests[ port ];\n\t\t}\n\t\treturn ajax.apply( this, arguments );\n\t};\n}\n\n}));"
  },
  {
    "path": "easyflow-flow-bpmn/static/plugins/std-common/common.css",
    "content": "html, body {\n    font-size: 12px;\n}\n/* Sticky footer styles\n-------------------------------------------------- */\nhtml {\n    position: relative;\n    min-height: 100%;\n}\nbody {\n    margin-bottom: 60px;\n    margin-top: 100px;\n    background-color: #fff;\n    font-family: Microsoft YaHei,tahoma,arial,Hiragino Sans GB,\\\\5b8b\\4f53,sans-serif;\n}\n\n@media ( min-width :768px) {\n    body {\n        margin-top: 48px;\n    }\n}\n\n.multiselect {\n    color:#495057 !important;\n    background-color:#fff !important;\n    border-color:rgb(206, 212, 218) !important;\n}\n/*jquery validate*/\n.error {\n  color: red;\n  margin: 0;\n}\n\n.j-form-horizontal .form-group>label.error {\n\t/*width:100%;*/\n\ttext-align:left;\n\t/*padding-left:90px;*/\n}\n\n/*Form setting*/\n.j-form-horizontal .form-group {\n    display: flex;\n    align-items:flex-start;\n    flex-wrap:nowrap;\n}\n.j-form-horizontal .form-group>label {\n        padding-right:4px;\n        width:88px;\n        white-space: nowrap;\n        text-align:right;\n        margin:0;\n        line-height:2.5rem;\n        padding-bottom:0.5rem;\n        padding-right:2px;\n}\n.j-form-horizontal .form-group>.form-control,\n.j-form-horizontal .form-group>.input-group,\n.j-form-horizontal .form-group>.multiselect-native-select {\n        flex:1;\n}\n\n\n.j-info-container {\n    margin-top:1rem;\n}\n/*text info*/\n.j-info-group {\n    display:flex;\n    flex-flow:row;\n    flex-wrap:wrap;\n}\n.j-info-group dt {\n    text-align:right;\n    width:80px;\n}\n\n.j-info-group dd {\n    flex:1;\n    margin-left:5px;\n    word-wrap: break-word;\n    word-break: break-all;\n}\n\n/*Required*/\n.j-require {\n\tcolor:red;\n}\n/*loading*/\n#jloading {\n  position: fixed;\n  left: 0;\n  z-index: 10000;\n  display: none;\n}\n#jloading i{\n  position: absolute;\n}\n/*tooltip*/\n.j-tip {\n  position: fixed;\n  padding: 3px 5px;\n  background: #6495ed;\n  margin: 0 auto;\n  text-align: center;\n  width: auto;\n  color: #ffffff;\n  opacity: 0.8;\n  cursor: move;\n  z-index: 10000;\n}\n\n.bootstrap-table a.j-op {\n\tcolor:rgb(0, 123, 255);\n\tcursor:pointer;\n\t white-space:nowrap;\n}\n.bootstrap-table a.j-op:hover {\n\tcolor:#0056b3;\n\ttext-decoration:underline;\n}\n\n.bootstrap-table button.j-op {\n    white-space:nowrap;\n}\n\n.contentSider {\n\tpadding-left: 5px;\n}\n\n.sider-control {\n\tposition:absolute;\n\tleft:-10px;\n\ttop:10px;\n\tz-index:200;\n\tcursor:pointer;\n}\n\n.j-element-config .form-group.col {\n\tpadding-left:5px;\n\tpadding-right:5px;\n}\n\n.j-page-container .card-header {\n\tpadding:0.5rem 1.25rem\n}\n\n.j-page-container .card-body {\n\tmargin-bottom: 0;\n\tpadding:1.25rem 1.25rem 0 1.25rem;\n}\n.j-page-container .form-group {\n\tmargin-bottom:0.75rem;\n}\n.j-mask-input {\n\tcursor:pointer;\n\tposition:absolute;\n\tright:20px;\n\ttop:32px;\n}\n"
  },
  {
    "path": "easyflow-flow-bpmn/static/plugins/std-common/common.js",
    "content": "if (! window.J) {\n  window.J = {};\n}\n(function (J) {\n// bootstrap datatable plugin default setting.\n$.fn.bootstrapTable && $.extend($.fn.bootstrapTable.defaults, {\n    pagination : true,\n    pageList:[10,25,100],\n    sidePagination : \"server\",\n    locale : J.msg['locale'],\n    cache : false,\n    clickToSelect : true,\n    showRefresh : true,\n    showColumns : true,\n    queryParamsType: \"\",\n    escape:true,\n    ajaxOptions : {\n        traditional: true\n    },\n    responseHandler : function(res) {\n        return {\n            total : res.resultData.count,\n            rows : res.resultData.list\n        }\n    },\n});\n\n// jquery datetimepicker default setting\n$.fn.datetimepicker && ($.fn.datetimepicker.defaults={\n        fontAwesome:true,\n        format : \"yyyy-mm-dd\",\n        minView : \"month\",\n        autoclose : 1,\n        language:J.msg['locale'],\n        todayBtn:true\n})\n\n// bootstrap multiselect default setting\n$.fn.multiselect && $.extend($.fn.multiselect.Constructor.prototype.defaults, {\n    nonSelectedText:J.msg['multiselect.nonSelectedText'],\n    nSelectedText:J.msg['multiselect.nSelectedText'],\n    allSelectedText:J.msg['multiselect.allSelectedText:msg'],\n    filterPlaceholder:J.msg['multiselect.filterPlaceholder'],\n    selectAllText:J.msg['multiselect.selectAllText'],\n    includeSelectAllOption: true,\n    buttonWidth:\"100%\",\n    filterBehavior:\"both\",\n    numberDisplayed:2,\n    maxHeight: 200\n});\n\n\n\n/*Get form original data*/\n   $.fn.serializeObject = function() {\n       \"use strict\";\n       var result = {};\n       var extend = function(i, element) {\n           var node = result[element.name];\n           if ('undefined' !== typeof node && node !== null) {\n               if ($.isArray(node)) {\n                   node.push(element.value);\n               } else {\n                   result[element.name] = [node, element.value];\n               }\n           } else {\n               result[element.name] = element.value;\n           }\n       };\n\n       $.each(this.serializeArray(), extend);\n       return result;\n   };\n// ====jquery validate====  \n   if(jQuery.validator) {\n        $.validator.setDefaults({\n            ignore:\"\",\n            errorPlacement: function(error, element) {\n                if(element.is(\".dtselect\")) {\n                    error.insertAfter(element.parent());\n                } else {\n                    error.insertAfter(element); \n                }\n            },\n            onfocusout: function( element ) {\n                if (!this.checkable( element ) && \"file\" != element.type) {\n                    this.element( element );\n                }\n            }\n            });\n        /**Date validate*/\n        jQuery.validator.addMethod(\"strictDate\", function(value, element, param) {\n            if (value == null || value==\"\") {\n                return true;\n            }\n            var r = value.match(/^(\\d{1,4})(-|\\/)(\\d{1,2})\\2(\\d{1,2})$/);\n            if(r==null) return false;\n            var d = new Date(r[1], r[3]-1,r[4]);\n            return (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]);\n        }, $.validator.format(J.msg['jqueryValidate.strictDate']));\n        /**JSON format validate*/\n        jQuery.validator.addMethod(\"json\", function(value, element) {\n            if (value == null || value==\"\") {\n                return true;\n            }\n            try {\n                var obj=JSON.parse(value);\n                return typeof obj == 'object' && obj;\n            } catch (err) {\n                console.log(\"not json:\" + value);\n                return false;\n            }\n        }, $.validator.format(J.msg['jqueryValidate.json']));     \n        \n        jQuery.validator.addMethod(\"fileinputRequiredByPreview\", function(value, element) {\n            var preview = $(element).fileinput(\"getPreview\");\n            if (preview != null && preview.config!=null && preview.config.length>0) {\n                return true;\n            }\n            return false;\n            \n        }, $.validator.format(J.msg['jqueryValidate.fileInput']));          \n\n    jQuery.extend(jQuery.validator.messages, {\n        required: J.msg[\"jqueryValidate.required\"],\n        remote: J.msg[\"jqueryValidate.remote\"],\n        email: J.msg[\"jqueryValidate.email\"],\n        url: J.msg[\"jqueryValidate.url\"],\n        date: J.msg[\"jqueryValidate.date\"],\n        dateISO: J.msg[\"jqueryValidate.dateISO\"],\n        number: J.msg[\"jqueryValidate.number\"],\n        digits: J.msg[\"jqueryValidate.digits\"],\n        creditcard: J.msg[\"jqueryValidate.creditcard\"],\n        equalTo: J.msg[\"jqueryValidate.equalTo\"],\n        accept: J.msg[\"jqueryValidate.accept\"],\n        maxlength: jQuery.validator.format(J.msg[\"jqueryValidate.maxlength\"]),\n        minlength: jQuery.validator.format(J.msg[\"jqueryValidate.minlength\"]),\n        rangelength: jQuery.validator.format(J.msg[\"jqueryValidate.rangelength\"]),\n        range: jQuery.validator.format(J.msg[\"jqueryValidate.range\"]),\n        max: jQuery.validator.format(J.msg[\"jqueryValidate.max\"]),\n        min: jQuery.validator.format(J.msg[\"jqueryValidate.min\"])\n    });\n    }\n    \n    // Get Current date\n    J.getNowDate=function(sep1) {\n        var date = new Date();\n            var seperator1 = sep1!==undefined ? sep1 : \"-\";\n        var month = date.getMonth() + 1<10? \"0\"+(date.getMonth() + 1):date.getMonth() + 1;\n        var strDate = date.getDate()<10? \"0\" + date.getDate():date.getDate();\n        var currentdate = date.getFullYear() + seperator1  + month  + seperator1  + strDate;\n        return currentdate;\n    }\n\n    J.getNowDatetime=function(sep1, sep2, sep3) {\n            var date = new Date();\n            var seperator1 = sep1!==undefined ? sep1 : \"-\";\n            var seperator2 = sep2!==undefined ? sep2 : \" \";\n            var seperator3 = sep3!==undefined ? sep3 : \":\";\n            var month = date.getMonth() + 1<10? \"0\"+(date.getMonth() + 1):date.getMonth() + 1;\n            var strDate = date.getDate()<10? \"0\" + date.getDate():date.getDate();\n\n            var hours = date.getHours()<10? \"0\" + date.getHours():date.getHours();\n            var min  = date.getMinutes()<10? \"0\" + date.getMinutes():date.getMinutes();\n            var seconds = date.getSeconds()<10? \"0\" + date.getSeconds():date.getSeconds();\n            var currentdate = date.getFullYear() + seperator1  + month  + seperator1  + strDate  + seperator2 + hours + seperator3 + min + seperator3 + seconds;\n            return currentdate;\n    }\n\n   })(window.J);\n   \n// ====JTabs====\n$.fn.jTabs=function(option, extOption) {\n    // Create tab\n    if (typeof option !== 'string') {\n        // Construct tabs\n        this.append('<ul class=\"nav nav-tabs\" id=\"tab\" role=\"tablist\" style=\"display:none\"></ul>')\n            .append('<div class=\"tab-content\" id=\"tab-content\"></div>');\n\n    } else {\n        if (option == 'open') {\n            // Open tab\n            var tabId = (extOption.id).replace(/\\./g,\"\");\n            var $tabs = this.find(\".nav-tabs\");\n            var $content = this.find(\".tab-content\");\n            var panelId = \"panel_\" + tabId;\n            if ($(\"#\"+tabId).length==0) {\n                var tabName = extOption.name ? extOption.name : extOption.id;\n                var closeBtn = extOption.closeable!==false ? \"<button type='button' class='close'><span>&times;</span></button>\":\"\";\n                $tabs.append(\"<li class='nav-item'><a class='nav-link' id='\" + tabId +\"' data-toggle='tab' href='#\" + panelId +  \"' role='tab'>\"+tabName+closeBtn + \"</a></li>\");\n                $content.append(\"<div class='tab-pane' id='\" +  panelId + \"' role='tabpanel'></div>\");\n                // element is jquery type.\n                if (extOption.element != null) {\n                    $(\"#\"+panelId).append(extOption.element);\n                // ajax url type\n                } else {\n                $(\"#\"+panelId).load(extOption.url);\n                }\n            }\n            if ($tabs.children(\".nav-item\").length>1) {\n                $tabs.show();\n            }\n            $(\"#\"+tabId).tab('show');\n        }\n    }\n    return this;\n}\n    \n    // tab close button\n$(function(){\n    $(\"body\").on(\"click\", \".nav-tabs .close\", function(){\n    var tab = $(this).parent().parent();\n    var panel = $($(this).parent().attr(\"href\"));\n    var tabs = tab.parent();\n    var active = $(this).parent().hasClass(\"active\");\n    tab.remove();\n    panel.remove();\n    if (active) {\n        tabs.find(\"[role='tab']:eq(0)\").tab(\"show\");\n    }\n      if(tabs.children(\"li\").length==1) {\n          tabs.hide();\n       }\n    \n  });\n});\n\n// ajax success callback\nvar _ajaxSuccessCallback = function(data, option, $element) {\n      var resCode = data.resultCode;\n      var showMsg = data.resultMsg;\n      var extData = data.extData;\n      var successUrl = option.successUrl;\n      if (data.extData && data.extData.successUrl) {\n            successUrl = data.extData.successUrl;\n      }\n      // Success response\n      if (resCode == null || resCode == \"0000000\") {          \n          // Tip success in page.\n          if (showMsg === null || showMsg === '') {\n              showMsg = J.msg['ajaxSuccessCallback.successShowMsg'];\n          }\n         $.jPageTip(showMsg);\n         // redirect URL\n         if (successUrl != null) {\n             window.location.href=successUrl;\n             return;\n         }\n         // Close dialog\n         var $dialog = $element != null ? $element.parents(\".modal\"):null;\n         if ($dialog!=null && $dialog.length > 0) {\n           $dialog.modal('hide').modal(\"dispose\").remove();\n         }\n         // Refresh table\n         var $bstable = $(\"body\").find(\".bootstrap-table\");\n         if ($bstable.length > 0) {\n             $bstable.find(\".table\").bootstrapTable(\"refresh\");\n         }\n      // Fail response\n      } else if (resCode = '0000002') {\n        if (showMsg != null) {\n            $.jMessage({\n                title : '&nbsp;',\n                msg : showMsg\n            });\n        }\n        // Has error\n        var fieldErrors = extData == null ? null : extData[\"fieldErrors\"];\n        if (fieldErrors != null) {\n            for (var i = 0; i < fieldErrors.length; i++) {\n                $.jFormTip($element, fieldErrors[i].field, fieldErrors[i].msg);\n            }\n        }\n    } else {\n        // show exception in dialog\n        if (showMsg === null || showMsg === '') {\n            showMsg = J.msg['ajaxSuccessCallback.exceptionShowMsg'];;\n        }\n        $.jMessage({\n            title : '&nbsp;',\n            msg : showMsg\n        });\n    }\n      \n  };\n  \n  \n  $.extend({\n        getNowDate:function() {\n            var date = new Date();\n            var seperator1 = \"-\";\n            var month = date.getMonth() + 1<10? \"0\"+(date.getMonth() + 1):date.getMonth() + 1;\n            var strDate = date.getDate()<10? \"0\" + date.getDate():date.getDate();\n            var currentdate = date.getFullYear() + seperator1  + month  + seperator1  + strDate;\n            return currentdate;\n        },\n        getBaseUrl: function () {\n            if ($._baseUrl) return $._baseUrl;\n            var commonCss = '/static/css/common.css';\n            var scriptTags = document.getElementsByTagName('link');\n            if (scriptTags.length <= 0) return;\n            for (var i = 0; i < scriptTags.length; i++) {\n                var src = scriptTags[i].href;\n                if (src.indexOf(commonCss) > -1) {\n                    $._baseUrl = src.substring(0, src.indexOf(\"/static\"));\n                    return $._baseUrl;\n                }\n            }\n        },\n        jSequence : {\n                   current: 1000,\n                   next: function () {\n                       return this.current++;\n                   }\n         },\n      //====Config====\n      jConfig : {\n                loading : {\n                    top:45,\n                    left:225\n                }   \n            },   \n     //====Loading====\n        jLoading: {\n            entity: null,\n            count : 0,\n            show: function () {\n                if (this.entity == null) {\n                    $(\"body\").append(\"<div id='jloading'><i class='fa fa-spinner fa-pulse' style='font-size:5rem'></i></div>\");\n                    this.entity = $(\"#jloading\");\n                }\n                var top = $.jConfig.loading.top;\n                var left = $.jConfig.loading.left;\n                this.entity.css({top:top, left: left, width: $(\"body\").width() - left, height: $(\"body\").height() - top, background: \"none\"});\n                this.entity.find(\"i\").hide();\n                this.entity.show();\n\n                var _self=this;\n                var pointer = {};\n                this.count++;\n                var timer = setTimeout(function () {\n                    _self.entity.find(\"i\").css({top: 200, left: ($(window).width() - $.jConfig.loading.left - 100) / 2}).show();\n                    _self.entity.css({background: \"#FFFFFF\"}).fadeTo(\"fast\", 0.3);\n                }, 1000);\n                pointer.timer = timer;\n                return pointer;\n            },\n            hide: function (pointer) {\n                clearTimeout(pointer.timer);\n                this.count--;\n                if(this.count == 0) {\n                    this.entity.hide();\n                }\n            }\n        },  \n      // JMsg\n      jMessage:function(option){\n          var popId = \"pop_\" + $.jSequence.next();\n          var title = option.title ? option.title : \"&nbsp;\";\n          $(\"body\").append(\"<div id='\" + popId + \"' class='modal' tabindex='-1' role='dialog'>\" + \n                              \"<div class='modal-dialog' role='document'>\" + \n                                \"<div class='modal-content'>\" + \n                                   \"<div class='modal-header'><h5 class='modal-title'>\" + title + \"</h5><button type='button' class='close' data-dismiss='modal' aria-label='Close'><span>&times;</span></button></div>\" +\n                                   \"<div class='modal-body'><p>\" + option.msg + \"</p></div>\" + \n                                   \"<div class='modal-footer'><button type='button' class='btn btn-secondary j-btn-close' data-dismiss='modal'>\" + J.msg['jDialog.close'] + \"</button></div>\" +\n                                \"</div>\" + \n                               \"</div>\" + \n                            \"</div>\");\n          var $element = this.$element = $(\"#\" + popId);\n          this.$element.modal().on(\"hidden.bs.modal\", function(){\n              $element.modal(\"dispose\");\n              $element.remove();\n              if(option.callback) {\n                  option.callback.call(window);\n              }\n          });\n      },\n      // ====JConfirm====\n      jConfirm:function(option){\n          var popId = \"pop_\" + jQuery.jSequence.next();\n          var title = option.title ? option.title : \"\";\n          $(\"body\").append(\"<div id='\" + popId + \"' class='modal' tabindex='-1' role='dialog'>\" + \n                  \"<div class='modal-dialog' role='document'>\" + \n                    \"<div class='modal-content'>\" + \n                       \"<div class='modal-header'><h5 class='modal-title'>\" + title + \"</h5><button type='button' class='close' data-dismiss='modal' aria-label='Close'><span>&times;</span></button></div>\" +\n                       \"<div class='modal-body'><p>\" + option.msg + \"</p></div>\" + \n                       \"<div class='modal-footer'><button type='button' class='btn btn-primary j-btn-ok'>\" + J.msg['jDialog.confirm'] + \"</button><button type='button' class='btn btn-secondary' data-dismiss='modal'>\" + J.msg['jDialog.cancel'] + \"</button></div>\" + \n                    \"</div>\" + \n                   \"</div>\" + \n                \"</div>\");\n        var $element = $(\"#\" + popId);\n        $element.modal();\n        $element.on(\"hidden.bs.modal\", function(){\n            $element.modal(\"dispose\").remove();\n        });\n         $(\"#\" + popId + \" .j-btn-ok\").click(function () {\n             $element.modal(\"hide\");\n           if(option.callback) {\n            option.callback.call(window);\n           }\n       });  \n      },\n      // ====JDialog====\n    jDialog: function(option) {\n        var title = option.title;\n        var size = option.size ? option.size : \"modal-xl\";\n        var $dialog = $('<div class=\"modal\" tabindex=\"-1\" role=\"dialog\">' + \n                  '<div class=\"modal-dialog  modal-dialog-scrollable ' + size + '\" role=\"document\" >' +\n                    '<div class=\"modal-content\">' + \n                      '<div class=\"modal-header\">' + \n                        '<h5 class=\"modal-title\">' + option.title + '</h5>' +\n                        '<button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\">' +\n                          '<span aria-hidden=\"true\">&times;</span>' + \n                        '</button>' + \n                      '</div>' + \n                      '<div class=\"modal-body\">' + \n                      '</div>' +\n                    '</div>' +\n                  '</div>' + \n                '</div>').appendTo($(\"body\"));\n        if(option.element != null) {\n        $dialog.find(\".modal-body\").append(option.element);\n        option.success && option.success.call($dialog);\n        $dialog.modal(\"handleUpdate\");\n        } else if (option.url != null) {\n            $dialog.find(\".modal-body\").load(option.url, function(response){\n                option.success && option.success.call($dialog);\n                $dialog.modal(\"handleUpdate\");\n            });\n        }\n          $dialog.on(\"hidden.bs.modal\", function(){\n            $dialog.modal(\"dispose\");\n            $dialog.remove();\n          });\n       $dialog.on(\"click\", \".j-btn-cancel\", function(){\n           $dialog.modal(\"hide\");\n       });\n       if (option.action) {\n           option.action.call(this, $dialog);\n       }\n        $dialog.modal();\n        \n    },\n    // Compare dialog\n    jDiffDialog : function(option) {\n        var element = `\n<div class=\"row\">\n    <div class=\"col j-diff-left\"><label>${option.left.title}:</label><textarea class=\"bpmnDef form-control\" rows=\"30\" readonly=\"readonly\"></textarea></div>\n    <div class=\"col j-diff-right\"><label>${option.right.title}:</label><textarea class=\"bpmnDef form-control\" rows=\"30\" readonly=\"readonly\"></textarea></div>\n</div>        \n        `;\n        option.element = element;\n        option.action = ($dialog)=>{\n            $dialog.find(\".j-diff-left textarea\").text(option.left.content);\n            $dialog.find(\".j-diff-right textarea\").text(option.right.content);\n        }\n        $.jDialog(option);\n    },\n      //====JFormTip====\n      jFormTip:function () {\n            if (arguments.length == 2) {\n                var form = arguments[0];\n                var tips = arguments[1];\n                $.jMessage({msg: tips});\n            } else {\n                var form = arguments[0];\n                var field = arguments[1];\n                var tips = arguments[2];\n                var error = {};\n                error[field] = tips;\n                form.validate().showErrors(error);\n            }\n        },\n     //====jPageTip====\n    jPageTip:function(tips){\n        var windowWidth = document.documentElement.clientWidth;\n        var $element = $(\"body\").find(\".jtip\");\n        if ($element.length==0) {\n            $element = $(\"<div class='j-tip'><span class='j-tip-content'></span></div>\").appendTo(\"body\");\n            $element.css({display: \"none\", 'top': 100 + 'px', 'left': ( windowWidth / 2 ) + 'px'});\n        }\n        $element.find(\".j-tip-content\").html(tips);\n        $element.show()\n        .fadeTo(\"fast\", 1.0, function () {\n            setTimeout(function () {\n                $element.fadeTo(\"slow\", 0, function () {\n                    $(this).hide();\n                });\n            }, 2000);\n        });\n    },\n    //====jAjax\n    jAjax : function (option, $element) {\n        var confirm = option.confirm;\n        \n        var type = option.type;\n        if (! type) {\n            type=\"GET\";\n        }\n        var loading = null;\n        \n        var ajaxCall = function() {\n            loading = $.jLoading.show();\n            $.ajax({\n                cache: false,\n                type: type,\n                url: option.url,\n                data: option.data,\n                traditional: true,\n                dataType: \"text\",\n                success: function (data) {\n                    data = (data == null || data == '') ? {}:$.parseJSON(data);\n                    $.jLoading.hide(loading);\n                    if (option.success) {\n                        option.success.call(window, data);\n                    } else {\n                        _ajaxSuccessCallback.call(window, data, option, $element);\n                    }\n                },\n                error: function () {\n                    $.jLoading.hide(loading);\n                    $.jMessage({title: '&nbsp;', msg: J.msg['jAjax.requestException']});\n                }\n            });\n        };\n        \n           // Has confirm dialog\n           if (confirm) {\n             $.jConfirm({msg:confirm, callback:function(){\n                ajaxCall();\n            }});\n           // No confirm dialog\n           } else {\n            ajaxCall();\n           }\n    }\n  });\n  //====jAjaxSubmit====\n  $.fn.jAjaxSubmit=function(option) {\n      var $form = this;\n      option = option == null ? {}:option;\n      var successUrl = $form.data(\"success-url\");\n      option.successUrl = successUrl;\n      var confirm = $form.data(\"confirm\");\n      \n      var fileInputs = $('input[type=file]', $form);\n      var hasFileInputs = fileInputs.length > 0;\n      if(hasFileInputs) {\n        throw new Error(\"file type is unsupported\");\n      }\n      option.dataType = \"text\";\n      \n      var loading = null;\n      // Success callback\n      var callback = option.callback;\n      if (! callback) {\n          // Default callback process\n          callback = _ajaxSuccessCallback;\n      }\n      option.success = function (data) {\n           $.jLoading.hide(loading);\n           data = (data == null || data == '') ? {}:$.parseJSON(data);\n           callback.call(window, data, option, $form);\n       };\n       // Fail callback\n      option.error = function () {\n           $.jLoading.hide(loading);\n           $.jMessage({title: '&nbsp;', msg: J.msg['jAjax.requestException']});\n       };\n\n       // Has confirm dialog\n       if (confirm) {\n         $.jConfirm({msg:confirm, callback:function(){\n            loading = $.jLoading.show();\n            _jAjaxSubmit($form, option);\n        }});\n       // No confirm dialog\n       } else {\n        loading=$.jLoading.show();\n        _jAjaxSubmit($form, option);\n       }\n  };\n  \n  var _jAjaxSubmit=function($form, option) {\n\tvar url = $form.attr(\"action\");\n\tvar data = $form.serialize();\n\t$.ajax({\n\t\ttype:\"POST\",\n\t\turl:url,\n\t\tdata: data,\n\t\tdataType:\"text\",\n\t\tsuccess:option.success,\n\t\terror:option.error\n\t});\n\t\n  }\n  \n//Table select control\n  var JTableSelect=function(option) {\n        this.$container = option.container;\n        this.fieldValueName=option.name;//form field name, required\n        this.inputFieldName = option.inputFieldName;//name of input control, not required,jquery validate\n        this.selectType = option.selectType===\"multiple\"?\"multiple\":\"single\";//select type\n        this.initValue = option.initValue;//init value,single select is tring,multiple select is array\n        this.initInput = option.initInput;//init input,single select is tring,multiple select is array\n        this.valueColumn=option.valueColumn?option.valueColumn:option.name;// value column of table(input back to select)\n        this.inputColumn=option.inputColumn?option.inputColumn:this.valueColumn;// input column of talbe(input back to input)\n        this.showValue=option.showValue === true ? true:false;\n        this.editable = option.editable==true?true:false;\n        this.readonly = option.readonly==true?true:false;\n        this.title = option.title||J.msg['jListSelect.select'];//dialog title\n        this.clearable = option.clearable===true?true:false;\n        this.url = option.url;\n        this.initUrl = option.initUrl;\n        this.onSetValue = option.onSetValue; \n        var _self = this;\n        // set value and input\n        this.setValue=function(value, input){\n            if(this.selectType == \"single\") {\n                if ($.type(value)==\"array\") {\n                    value = value[0];\n                }\n            } else {\n                if ($.type(value)==\"string\"){\n                    value = [value];\n                }\n            }\n            this._renderValue(value);\n            this._renderInput(this._inputText(input, value));\n            if (_self.onSetValue) {\n                _self.onSetValue(value);\n            }\n        };\n        // render value\n        this._renderValue = function(valueData) {\n            this.$valueField.empty();\n            if (\"single\" == this.selectType) {\n                if(valueData === \"\" || valueData === undefined || valueData===null) {\n                    this.$valueField.val(valueData);\n                    return;\n                }\n                this.$valueField.append(\"<option value='\" + valueData + \"' selected='selected'/>\");\n            } else {\n                if(valueData) {\n                    for(var i = 0; i < valueData.length; i++) {\n                        this.$valueField.append(\"<option value='\" + valueData[i] + \"' selected='selected'/>\");\n                    }\n                }\n            }\n        }\n        // render input\n        this._renderInput = function(inputData) {\n            this.$inputField.val(inputData);\n        }\n        \n        this._inputText = function(input, value) {\n            if(_self.selectType == \"single\") {\n                if (value===undefined || input ===undefined || value===null || input===null) {\n                    return '';\n                }\n                return this.showValue ? value+'-'+input : input;\n            } else {\n                if (value===undefined || input ===undefined || value===null || input===null) {\n                    return '';\n                }\n                if (! this.showValue) return input;\n                var inputText = '';\n                for (var i in input){\n                    inputText += value[i]+'-'+input[i] + \",\";\n                }\n                return inputText;\n            }\n        }\n        \n        this.render=function() {\n            this.$container.addClass(\"j-tableSelect input-group\");\n            this.$container.append(\"<select style='display:none' class='form-control dtselect' \" + (this.selectType == \"multiple\" ? \"multiple='multiple'\":\"\") + \" name='\" + this.fieldValueName + \"'></select>\" +\n                    \"<input type='text' class='form-control'\" + (this.editable ? \"\":\"readOnly='true'\") +  (this.inputFieldName ? \" name='\" + this.inputFieldName + \"'\" : \"\") + \"/>\" +\n                            \"<div class='input-group-append'><button class='btn btn-outline-secondary' type='button'>...</button>\" + \n                            ((this.clearable && !this.editable) ? \"<button class='btn btn-outline-secondary' type='button'>X</button>\":\"\") + \"</div>\");\n            $btnGroup=this.$container.find(\".input-group-append\");\n            this.$selectBtn = $btnGroup.find(\":contains(...)\");\n            this.$clearBtn = $btnGroup.find(\":contains(X)\");\n            this.$valueField = this.$container.find(\"select\");\n            this.$inputField = this.$container.find(\"input\");\n            this._renderValue(this.initValue);\n            this._renderInput(this._inputText(this.initInput, this.initValue));\n            //ajax get init show value.input format {value:value},output format {input:input},single select is string,multiple select is array\n            if (this.initValue !== '' && this.initValue !== null && this.initValue !== undefined && (this.initInput === undefined || this.initInput===''||this.initInput===null) && this.initUrl) {\n                this._renderInput(this.initValue);\n                $.ajax({url: this.initUrl, data:JSON.stringify({value:this.initValue}),\n                    type:\"POST\", \n                    dataType: \"json\",\n                    contentType : \"application/json\",\n                    success: function(data){\n                        _self._renderInput(_self._inputText(data.resultData.input,_self.initValue));\n                    }\n                });\n            }\n            // input event\n            if(this.editable) {\n                this.$inputField.change(function(){\n                    var inputData;\n                    if(_self.selectType == \"single\") {\n                        inputData = _self.$inputField.val();\n                    } else {\n                        inputData = _self.$inputField.val().split(\",\");\n                    }\n                    _self._renderValue(inputData, inputData);\n                });\n            }\n            if (! _self.readonly) {\n            // clear button\n            this.$clearBtn.click(function(){\n                _self.setValue(\"\",\"\");\n            });\n            // select button\n            this.$selectBtn.click(function(){\n                $.jDialog({\n                    title:_self.title,\n                    url:_self.url+\"?selectId=_select_\"+$.jSequence.next(),\n                    // open callback\n                    success:function(){\n                        var $dialog = this;\n                        var $table = $dialog.find(\".table\");\n                        //close after select in single select mode\n                        if(_self.selectType == \"single\") {\n                            //has bug\n                            // _self.valueData && $table.bootstrapTable('checkBy', {field: _self.valueColumn, values:[_self.initValue]})\n                            // select event\n                             $table.on(\"check.bs.table\", function($element, row){\n                                   _self.setValue(row[_self.valueColumn], row[_self.inputColumn]);\n                                   $dialog.modal(\"hide\");\n                                 });  \n                             \n                            //close after click confirm button\n                        } else {\n                            //has bug\n                            //_self.valueData&& $table.bootstrapTable('checkBy', {field: _self.valueColumn, values:_self.initValue})\n                            $dialog.find(\".j-btn-ok\").on(\"click\", function(){\n                                var selections = $table.bootstrapTable(\"getSelections\");\n                                var valueData = [];\n                                var inputData = [];\n                                for(var i in selections) {\n                                    valueData.push(selections[i][_self.valueColumn]);\n                                    inputData.push(selections[i][_self.inputColumn]);\n                                }\n                                _self.setValue(valueData, inputData);\n                               $dialog.modal(\"hide\");\n                            });\n                        }\n                    }\n                });\n            });\n         }\n            \n        }\n        \n  };\n\n  $.fn.jTableSelect=function(option) { \n        // create datatableSelect\n    if (typeof option !== 'string') {\n        option.container = this;\n        var tableSelect = new JTableSelect(option);\n        tableSelect.render();\n        $(this).data(\"jTableSelect\",tableSelect);\n      }\n };\n \n // List select control\n var JListSelect = function (option) {\n        this.$container = option.container;\n        this.initValue = option.initValue;//init value,array\n        this.initUrl = option.initUrl;//init show url\n        var _self = this;\n        this.render=function() {\n            this.$container.addClass(\"j-listSelect input-group\");\n            this.$container.append(\"<textarea class='form-control' name='\"+this.fieldValueName + \"'></textarea>\" +\n                            \"<div class='input-group-append'><button class='btn btn-outline-secondary j-list-select-btn' type='button'>\" + J.msg['jListSelect.view'] +\"</button>\");\n            this.$selectBtn = this.$container.find(\".j-list-select-btn\");\n            this.$valueField = this.$container.find(\"textarea\");\n            this.$valueField.text(this.initValue);\n            // Select Button\n            this.$selectBtn.click(function(){\n                var value = _self.$valueField.val();\n                if (value === undefined || value === null || value === \"\") {\n                    alert(J.msg['jListSelect.inputTip']);\n                    return;\n                }\n                var values;\n                if (value.trim().charAt(0)=='[') {\n                    values = JSON.parse(value);\n                } else {\n                    values = value.split(\",\");\n                }\n                $.ajax({url: _self.initUrl, data:JSON.stringify({value:values}),\n                    type:\"POST\", \n                    dataType: \"json\",\n                    contentType : \"application/json\",\n                    success: function(data){\n                        var input = data.resultData.input;\n                        var table = '<table class=\"table table-striped table-bordered\"><thead><tr><th>' + J.msg['jListSelect.value'] + '</th><th>' + + J.msg['jListSelect.info'] + '</th></tr></thead>';\n                        for (var i = 0; i < values.length; i++) {\n                            table += \"<tr><td>\" + values[i] + \"</td><td>\" + input[i] + \"</td></tr>\";\n                        }\n                        table += \"</table>\";\n                        var modal = \"<div>\" + table + \"</div>\";\n                        $.jDialog({title:J.msg[\"jDialog.view\"],element:modal});\n                    }\n                });\n            });\n         }\n     this.setValue = function() {\n         \n     }\n }\n $.fn.jListSelect=function(option) { \n        // Create listSelect\n    if (typeof option !== 'string') {\n        option.container = this;\n        var listSelect = new JListSelect(option);\n        listSelect.render();\n        $(this).data(\"jListSelect\",listSelect);\n      }\n}; \n \n  $(function () {\n      $(document).on(\"submit\", \".j-ajax-form\", function(){\n          $(this).jAjaxSubmit();\n          return false;\n          });\n  });   \n  \n// JSON PATH\nJ.jp = {\n            parse:function(exp) {\n                var parts = exp.split(/[\\.|\\[]/);\n                var result = [];\n                for (var i in parts) {\n                    if (parts[i] == \"$\" || parts[i]==\"\") {\n                        continue;\n                    }\n                    // Array\n                    if (parts[i].indexOf(\"]\")>0) {\n                        result.push({type:\"array\", val:parts[i].substr(0, parts[i].length - 1)});\n                    } else {\n                        //Object\n                        result.push({type:\"obj\",val:parts[i]});\n                    }\n                }\n                return result;\n            },\n            value:function(obj, exp, newValue) {\n                // Query mode\n                if (newValue === undefined) {\n                    var result = obj;\n                    if (obj === undefined || obj === null) {\n                        return result;\n                    }\n                    var parts = this.parse(exp);\n                    for (var i in parts) {\n                        var part = parts[i];\n                        obj = obj[part.val];\n                        if (obj === undefined || obj === null) {\n                            return obj;\n                        }\n                    }\n                    return obj;\n                // Set value mode\n                } else {\n                    var parts = this.parse(exp);\n                    var parent,parentAttr;\n                    var current = obj;\n                    for (var i in parts) {\n                        if (!current) {\n                            current = parts[i].type=='array' ? []:{};\n                            if (i == 0){obj=current}\n                            parent && (parent[parentAttr]=current);\n                        }\n                        if (i == parts.length - 1) {\n                            current[parts[i].val] = newValue;\n                            break;\n                        }\n                        \n                        parent = current;\n                        parentAttr = parts[i].val;\n                        current = current[parts[i].val];\n                    }\n                    return obj;\n                }\n            }\n                \n        }\n\nfunction timestampToTime(timestampMs) {\n    let date = new Date(timestampMs);\n    let Y = date.getFullYear() + '-';\n    let M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1) : date.getMonth()+1) + '-';\n    let D = date.getDate() + ' ';\n    let h = date.getHours() + ':';\n    let m = date.getMinutes() + ':';\n    let s = date.getSeconds();\n    return Y+M+D+h+m+s;\n}\n J.formatTime = function(timestampMs) {\n    if(timestampMs === undefined || timestampMs === \"\") {\n        return \"\";\n    }\n     var check = function(m) {\n         return m<10 ? '0' + m : m\n     };\n     var time = new Date(timestampMs);\n     var y = time.getFullYear();\n     var m = time.getMonth()+1;\n     var d = time.getDate();\n     var h = time.getHours();\n     var mm = time.getMinutes();\n     var s = time.getSeconds();\n     return y+'-'+check(m)+'-'+check(d)+' '+check(h)+':'+check(mm)+':'+check(s);\n };\nJ.formatTimeYmd = function(timestampMs) {\n    if(timestampMs === undefined || timestampMs === \"\") {\n        return \"\";\n    }\n    var check = function(m) {\n        return m<10 ? '0' + m : m\n    };\n    var time = new Date(timestampMs);\n    var y = time.getFullYear();\n    var m = time.getMonth()+1;\n    var d = time.getDate();\n    return y+'-'+check(m)+'-'+check(d);\n};\nJ.formatTimeYm = function(timestampMs) {\n    if(timestampMs === undefined || timestampMs === \"\") {\n        return \"\";\n    }\n    var check = function(m) {\n        return m<10 ? '0' + m : m\n    };\n    var time = new Date(timestampMs);\n    var y = time.getFullYear();\n    var m = time.getMonth()+1;\n    return y+'-'+check(m);\n};\n//yyyy-mm-dd hh:mm:ss\nJ.formatTimestampOrStrTime = function(timesMs) {\n    if(timesMs === undefined || timesMs === \"\") {\n        return \"\";\n    }\n    var time = new Date(timesMs);\n    if(time == 'Invalid Date' ){ //yyyymmddhhmmss convert to yyyy-mm-dd hh:mm:ss\n        time = timesMs.replace(/^(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})$/, \"$1-$2-$3 $4:$5:$6\")\n        return time;\n    }\n    var check = function(m) {\n        return m<10 ? '0' + m : m\n    };\n    var y = time.getFullYear();\n    var m = time.getMonth()+1;\n    var d = time.getDate();\n    var h = time.getHours();\n    var mm = time.getMinutes();\n    var s = time.getSeconds();\n    return y+'-'+check(m)+'-'+check(d)+' '+check(h)+':'+check(mm)+':'+check(s);\n};\n\n/**\n * Open window\n */\nJ.openWindow=function(url, name, specs, replace) {\n    if (self != top) {\n        window.location.href=url;\n    } else {\n        window.open(url, name, specs, replace);\n    }\n}\n\n/**\n * eval js, print exception.\n */\nJ.eval = function(js, ctxData) {\n    try {\n        eval(js);\n    } catch (err) {\n        console.dir(err);\n        console.log(\"eval exception, js:\" + js);\n        if (ctxData) {\n            console.log(\"ctxData:\" + JSON.stringify(ctxData));\n        };\n        throw err;\n    }\n}\n\n $.fn.jJsonPropertyEditor=function(option, arg) { \n        // Create listSelect\n    if (typeof option !== 'string') {\n        option = option ? option : {}\n        option.$originalControl = $(this);\n        var jJsonPropertyEditor =  $(this).data(\"j-json-property-editor\");\n        if (! jJsonPropertyEditor) {\n            jJsonPropertyEditor = new JJsonPropertyEditor(option);\n            $(this).data(\"j-json-property-editor\",jJsonPropertyEditor);\n        }\n        jJsonPropertyEditor.render();\n      } else {\n        var jJsonPropertyEditor = $(this).data(\"j-json-property-editor\");\n        var result = jJsonPropertyEditor[option](arg);\n        return result;\n      }\n}; \n\n/**\n * JSON property control\n */\nvar JJsonPropertyEditor = function(option) {\n    this.$originalControl = option.$originalControl;\n    this.$container = option.$container ? option.$container : this.$originalControl.parent();\n    this.mode = option.mode ? option.mode : \"ROW\";\n    this.render = function() {\n        var _this = this;\n        this.$control = $(\"<div class='container-fluid'></div>\").appendTo(this.$container);\n       this.$control.on(\"click\", \".j-row-add\", function(){\n          _this.addRow($(this).parent().parent());\n       });   \n       this.$control.on(\"click\", \".j-row-del\", function(){\n           if (_this.$control.find(\".j-prop-record\").length==1){\n               $(this).parent().parent().find(\"input,textarea\").val(\"\");\n           } else {\n           $(this).parent().parent().remove();\n           }\n       });  \n       this.$control.on(\"blur\", \".j-prop-key,.j-prop-type,.j-prop-val\", function(){\n           var newVal = _this.collect();\n           if (Array.isArray(newVal)) {\n               alert(newVal + \" \" + J.msg['bpmn.property.valueFormatInvalid']);\n               return false;\n           }\n           _this.$originalControl.val(Object.keys(newVal).length==0 ? \"\" : JSON.stringify(newVal, null, 2));\n           _this.$originalControl.blur();\n       });  \n        this.$control.on(\"change\", \".j-prop-type\", function(){\n           $(this).parent().parent().find(\".j-prop-val\").val(\"\");\n       });      \n       this._innerRender();           \n    }\n    \n    this._innerRender = function() {\n                if (this.mode == \"JSON\") {\n            this.$originalControl.show();\n            this.$control.hide();\n        } else {\n            this.$originalControl.hide();\n            this.$control.show();\n            this.$control.empty();\n            var valStr = this.$originalControl.val();\n            var value = {};\n            try {\n                value = valStr ? JSON.parse(valStr) : {};\n            } catch (e) {\n                alert(J.msg['jqueryValidate.json'] + \",\" + valStr);\n            } \n            var keys = Object.keys(value);\n          if (keys.length==0) {\n            this.addRow();\n        } else {\n            for (var key in value) {\n                this.addRow(null, key, value[key]);\n            }\n        }  \n        } \n    }\n    \n    this.changeMode = function(mode) {\n        if (mode == this.mode) {\n            return;\n        } else {\n            this.mode = mode;\n            this._innerRender();\n        }\n    }\n    \n    this.addRow = function($after, key, val) {\n        var $html = $(\"<div class='row j-prop-record'>\"\n         + \"<div class='col-3 p-0'><input class='form-control p-0 j-prop-key' placeholder='\" + J.msg['bpmn.property.propertyKey'] + \"'></input></div>\"\n         + \"<div class='col-2 p-0'><select class='form-control p-0 j-prop-type'>\"\n            + \"<option value='string' selected='selected'>\" + J.msg['bpmn.property.typeString'] + \"</option>\"\n            + \"<option value='number'>\" + J.msg['bpmn.property.typeNumber'] + \"</option>\"\n            + \"<option value='boolean'>\" + J.msg['bpmn.property.typeBoolean'] + \"</option>\"\n            + \"<option value='object'>\" + J.msg['bpmn.property.typeObject'] + \"</option>\"\n            + \"<option value='array'>\" + J.msg['bpmn.property.typeArray'] + \"</option>\"\n            + \"<option value='null'>\" + J.msg['bpmn.property.typeNull'] + \"</option></select></div>\" \n        + \"<div class='col-6 p-0'><textarea wrap='off' class='form-control p-0 j-prop-val' placeholder='\" + J.msg['bpmn.property.propertyValue'] + \"'></textarea></div>\"\n        + \"<div class='col-1 p-0'><i class='fa fa-plus j-row-add' style='cursor:pointer'>\"\n        + \"</i><i class='fa fa-trash j-row-del' style='cursor:pointer'></i></div></div>\");\n         var $row = $after ? $html.insertAfter($after) : $html.appendTo(this.$control);\n          var $key = $row.find(\".j-prop-key\");\n          $key.tooltip({title:function(){return $(this).val()}});\n          var $val = $row.find(\".j-prop-val\");\n          $val.tooltip({title:function(){return $(this).val()}});          \n        if (key) {\n          var $type = $row.find(\".j-prop-type\");\n          $key.val(key);\n          var type = $.type(val);\n          if (type == \"object\" && Array.isArray(val)) {\n              type = \"array\";\n          }\n          $type.val(type);\n          if (type == \"null\") {\n          } else if (type == \"string\") {\n              $val.val(val);\n          } else if (type == \"number\") {\n              $val.val(val); \n          } else if (type == \"boolean\") {\n              $val.val(val);               \n          } else if (type == \"object\") {\n              $val.val(JSON.stringify(val, null, 2));                             \n          } else if (type == \"array\") {\n              $val.val(JSON.stringify(val, null, 2));                             \n          } else {\n              throw \"invalid type:\" + type;\n          }\n        }\n        \n    }\n\n    this.collect = function () {\n        var result = {};\n        var errorKeys = [];\n        this.$control.find(\".j-prop-record\").each(function(){\n          var key = $(this).find(\".j-prop-key\").val();\n          var type = $(this).find(\".j-prop-type\").val();\n          var val = $(this).find(\".j-prop-val\").val();\n          var valObj = null;\n          //var isJsonPath = key.indexOf(\"$\")==0;\n            if (key) {\n                if (val == \"\") {\n                    return;\n                }\n                if (type == \"null\") {\n                    valObj = null;\n                    if (val.trim() !== \"\") {\n                        errorKeys.push(key);\n                        return;\n                    }\n                } else if (type == \"string\") {\n                    valObj = val.trim();\n                } else if (type == \"number\") {\n                    valObj = Number(val.trim());\n                    if (Number.isNaN(valObj)) {\n                        errorKeys.push(key);\n                        return;\n                    }\n                } else if (type == \"boolean\") {\n                    if (val.trim() == 'true') {\n                        valObj = true;\n                    } else if (val.trim()=='false') {\n                        valObj = false;\n                    } else {\n                        errorKeys.push(key);\n                        return;\n                    }\n                } else if (type == \"object\") {\n                    try {\n                      valObj = JSON.parse(val);\n                      } catch (e) {\n                        errorKeys.push(key);\n                        return; \n                      }\n                      if (Array.isArray(valObj)) {\n                          errorKeys.push(key);\n                          return;\n                      }\n                } else if (type == \"array\") {\n                    try {\n                    valObj = JSON.parse(val);\n                    } catch (e) {\n                        errorKeys.push(key);\n                        return; \n                    }\n                    if (! Array.isArray(valObj)) {\n                          errorKeys.push(key);\n                          return;\n                      }\n                }\n                result[key] = valObj;\n            }\n        });\n        return errorKeys.length>0 ? errorKeys : result;\n    }\n}\n\n\n\n\n"
  },
  {
    "path": "easyflow-flow-bpmn/static/plugins/std-common/messages_default.js",
    "content": "if (!window.J) {\n    window.J = {};\n}\n\n(function(J) {\n    J.msg = {};\n    if (!window.jLocale) {\n        var lang = (navigator.language || navigator.userLanguage).toLowerCase();\n        if (lang.indexOf('zh') == -1) {\n            window.jLocale = \"en_US\";\n        } else {\n            window.jLocale = \"zh_CN\";\n        }\n    }\n    $.extend(J.msg, {\n    \"locale\":\"en_US\",\n\n    \"multiselect.nonSelectedText\":\"Please Select\",\n    \"multiselect.nSelectedText\":\"Selected\",\n    \"multiselect.allSelectedText\":\"All Selected\",\n    \"multiselect.filterPlaceholder\":\"Search\",\n    \"multiselect.selectAllText\":\"Select All\",\n    \n    \"jqueryValidate.strictDate\":\"Date format is illegal\",  \n    \"jqueryValidate.json\":\"JSON format is illegal\",  \n    \"jqueryValidate.fileInput\":\"File cannot be null\", \n    \"jqueryValidate.required\":\"Required filed\", \n    \"jqueryValidate.remote\":\"Please correct this field\", \n    \"jqueryValidate.email\":\"Email format is illegal\", \n    \"jqueryValidate.url\":\"URL is illegal\", \n    \"jqueryValidate.date\":\"Date format is illegal\", \n    \"jqueryValidate.dateISO\":\"Please input date (ISO).\", \n    \"jqueryValidate.number\":\"Please input digit\", \n    \"jqueryValidate.digits\":\"Please input integer number(>=0)\", \n    \"jqueryValidate.creditcard\":\"Please input valid credit card\", \n    \"jqueryValidate.equalTo\":\"Please input same value\", \n    \"jqueryValidate.accept\":\"Please input valid suffix string\", \n    \"jqueryValidate.maxlength\":\"Max length is {0}\", \n    \"jqueryValidate.minlength\":\"Min length is {0}\", \n    \"jqueryValidate.rangelength\":\"Length should between {0} and {1}\", \n    \"jqueryValidate.range\":\"Please input value between {0} and {1}\", \n    \"jqueryValidate.max\":\"Max value is {0}\", \n    \"jqueryValidate.min\":\"Min value is {0}\",\n    \n    \"ajaxSuccessCallback.successShowMsg\":\"Operate Success!\",\n    \"ajaxSuccessCallback.exceptionShowMsg\":\"System Exception!\",\n    \n    \"jDialog.confirm\":\"Confirm\",\n    \"jDialog.cancel\":\"Cancel\",\n    \"jDialog.close\":\"Close\",\n    \"jDialog.view\":\"View\",\n    \n    \"jAjax.requestException\":\"Request Exception\",\n    \n    \"jListSelect.select\":\"Select\",   \n    \"jListSelect.value\":\"Value\",\n    \"jListSelect.info\":\"Info\",\n    \"jListSelect.inputTip\":\"Plase input value of element\",\n    \"jListSelect.view\":\"View\",\n    \n    \"jListSelect.select\":\"Select\",\n    \n    \"flow.jsonDefTitle\":\"JSON Flow Definition\",\n    \"flow.flowJsonDefinition\":\"JSON Flow Definition\",    \n    \"flow.newFlowDef\":\"New Flow Definition\",\n    \"flow.oldFlowDef\":\"Old Flow Definition\",\n    \"flow.noJsonDataTip\":\"No JSON flow definition data\",\n    \"flow.id\":\"Flow ID\",    \n    \"flow.nodeId\":\"Node ID\",\n    \"flow.nodeName\":\"Node Name\",\n    \"flow.flowDefId\":\"Flow Definition ID\",\n    \"flow.flowDefName\":\"Flow Definition Name\",\n    \"flow.flowDefType\":\"Flow Definition Type\",\n    \"flow.flowDefType.flowBpmn\":\"FlowEngine-BPMN\",\n    \"flow.flowDefType.flowJson\":\"FlowEngine-JSON\",\n    \"flow.flowDefType.fsmJson\":\"StateMachine-JSON\",\n    \"flow.bizType\":\"Business Type\",\n    \"flow.category\":\"Category\",\n    \"flow.flowDefinition\":\"Flow Definition\",\n    \"flow.flowDiagram\":\"Flow Diagram\",\n    \"flow.jsonDefinition\":\"JSON Definition\",\n    \"flow.flowJsonDefinitioin\":\"Flow JSON Definition\",\n    \"flow.update\":\"Update\",\n    \"flow.oldNewCompare\":\"Old/New Compare\",\n    \"flow.cancel\":\"Cancel\",\n    \n    \"bpmn.detailInfoType\":\"Detail Info Type\",\n    \"bpmn.bpmnFlowDefinition\":\"BPMN Flow Definition\",\n    \"bpmn.flowJsonDefinition\":\"Flow JSON Definition\",\n    \"bpmn.jsonContent\":\"JSON Content\",\n    \"bpmn.convertErrorTip\":\"BPMN convert to JSON request exception,this is ajax request, please confirm url or service whether or not normal,current url:\",\n    \"bpmn.newFlowDefinition\":\"New Flow Definition\",\n    \"bpmn.oldFlowDefinition\":\"Old Flow Definition\",\n    \"bpmn.idTooltip\":\"Element ID,Not NULL,IMPORTANT!suggest english with business meaning\",\n    \"bpmn.idEmptyError\":\"ID cannot be null\",\n    \"bpmn.idExistsError\":\"ID exists\",    \n    \"bpmn.name\":\"Name\",\n    \"bpmn.nameTooltip\":\"Element Name,can be null\",\n    \"bpmn.documentation\":\"Documentation\",\n    \"bpmn.documentationTooltip\":\"Element description\",    \n    \"bpmn.property\":\"Properties\",\n    \"bpmn.propertyTooltip\":\"Element properties,IMPORTANT!JSON format,see reference doc\",    \n    \"bpmn.conditionType\":\"Branch Condition Type\",\n    \"bpmn.conditionType.exclusive\":\"Exclusive\",\n    \"bpmn.conditionType.inclusive\":\"Inclusive\",\n    \"bpmn.conditionTypeTooltip\":\"Branch type,default is inclusive(every branch will be evaluated,all branch with true result will be executed); Use default option when only one branch.\",   \n    \"bpmn.startNode\":\"Start Node\",\n    \"bpmn.startNode.true\":\"True\",\n    \"bpmn.startNode.false\":\"False\",\n    \"bpmn.startNodeTooltip\":\"Identify this is a start node\",\n    \"bpmn.selfPre\":\"Customize PreHandler\",\n    \"bpmn.selfPreTooltip\":\"Customize node pre handler, will override pre handler of diagram semantics\",\n    \"bpmn.selfAction\":\"Customize Action\",\n    \"bpmn.selfActionTooltip\":\"Customize node action,will override node action of diagram semantics\",        \n    \"bpmn.selfPost\":\"Customize Branch\",\n    \"bpmn.selfPostTooltip\":\"Customize branch,will override branch of diagram,for free flow\",\n    \"bpmn.listeners\":\"Listeners\",\n    \"bpmn.listenersTooltip\":\"Flow listeners,JSON array format,see reference doc\",\n    \"bpmn.filters\":\"Flow Filters\",\n    \"bpmn.filtersTooltip\":\"Flow Filters,JSON array format,see reference doc\",\n    \"bpmn.nodeFilters\":\"Node Filters\",\n    \"bpmn.nodeFiltersTooltip\":\"Node Filters,JSON array format,see reference doc\",    \n    \"bpmn.nodePreHandlerFilters\":\"Node PreHandler Filters\",\n    \"bpmn.nodePreHandlerFiltersTooltip\":\"Node PreHandler Filters,JSON array format,see reference doc\",      \n    \"bpmn.nodeActionFilters\":\"Node Action Filters\",\n    \"bpmn.nodeActionFiltersTooltip\":\"Node Action Filters,JSON array format,see reference doc\",    \n    \"bpmn.nodePostHandlerFilters\":\"Node PostHandler Filters\",\n    \"bpmn.nodePostHandlerFiltersTooltip\":\"Node PostHandler Filters,JSON array format,see reference doc\",    \n    \"bpmn.flowPreHandlerFilters\":\"Flow PreHandler Filters\",\n    \"bpmn.flowPreHandlerFiltersTooltip\":\"Flow PreHandler Filters,JSON array format,see reference doc\",      \n    \"bpmn.flowPostHandlerFilters\":\"Flow PostHandler Filters\",\n    \"bpmn.flowPostHandlerFiltersTooltip\":\"Flow PostHandler Filters,JSON array format,see reference doc\",        \n    \"bpmn.runner\":\"Flow Runner\",\n    \"bpmn.runnerTooltip\":\"Flow Runner, default is sequential runner\",\n    \"bpmn.parseListeners\":\"Flow Parse Event Listeners\",\n    \"bpmn.parseListenersTooltip\":\"Flow parse event listeners\",      \n    \"bpmn.scriptFormat\":\"Script Format\",\n    \"bpmn.scriptFormat.exp\":\"SpringEL Expression\",\n    \"bpmn.scriptFormat.createExp\":\"Create Expression\",\n    \"bpmn.scriptFormatTooltip\":\"Script format\",\n    \"bpmn.script\":\"Script\",\n    \"bpmn.scriptTooltip\":\"Script,see reference doc\",\n    \"bpmn.conditionExp\":\"Condition Expression\",\n    \"bpmn.conditionExpTooltip\":\"Condition Expression,SPEL Format\",\n    \"bpmn.condition\":\"Condition\",\n    \"bpmn.none\":\"None\",\n    \"bpmn.branchType\":\"Branch Type\",\n    \"bpmn.branchType.exclusive\":\"Exclusive\",\n    \"bpmn.bpmnDefinition\":\"BPMN Definition\",\n    \"bpmn.import\":\"Import\",\n    \"bpmn.export\":\"Export\",\n    \"bpmn.svg\":\"SVG\",\n    \"bpmn.zoomIn\":\"Zoom In\",\n    \"bpmn.zoomOut\":\"Zoom Out\",\n    \"bpmn.fullScreen\":\"Full Screen\",\n    \"bpmn.node\":\"Node\",\n    \"bpmn.infoPanel\":\"Information Panel\",\n    \"bpmn.flowBpmnDefinition\":\"Flow BPMN Definition\",\n    \"bpmn.renderFlowDiagram\":\"Render Flow Diagram\",\n    \"bpmn.viewFlowDefinition\":\"View EasyFlow Definition\",\n    \"bpmn.oldNewBpmnCompare\":\"Old/New BPMN Definition Compare\",\n    \"bpmn.oldNewEasyFlowCompare\":\"Old/New EasyFlow Definition Compare\",\n    \"bpmn.cancel\":\"Cancel\",\n    \"bpmn.flowPreHandler\":\"Flow PreHandler\",\n    \"bpmn.flowPreHandlerTooltip\":\"Flow PreHandler\",\n    \"bpmn.flowPostHandler\":\"Flow PostHandler\",\n    \"bpmn.flowPostHandlerTooltip\":\"Flow PostHandler\",\n    \"bpmn.calledElement\":\"Sub Flow ID\",\n    \"bpmn.calledElementTooltip\":\"Sub Flow ID\",\n    \"bpmn.flow\":\"Flow Info\",\n    \"bpmn.flowTooltip\":\"Flow info, id is required\",\n    \"bpmn.calledElement\":\"Called ID\",\n    \"bpmn.logFlag\":\"Log flag\",\n    \"bpmn.logFlagTooltip\":\"Print log flag, default true\",\n    \"bpmn.default\":\"Default\",\n    \"bpmn.true\":\"True\",\n    \"bpmn.false\":\"False\",\n    \"bpmn.switchRowMode\":\"Switch Row Mode\",\n    \"bpmn.switchJsonMode\":\"Switch JSON Mode\",\n    \"bpmn.property.propertyKey\":\"Key\",    \n    \"bpmn.property.propertyValue\":\"Value\",    \n    \"bpmn.property.typeString\":\"String\",    \n    \"bpmn.property.typeNumber\":\"Number\",    \n    \"bpmn.property.typeBoolean\":\"Boolean\",    \n    \"bpmn.property.typeObject\":\"Object\",    \n    \"bpmn.property.typeArray\":\"Array\",    \n    \"bpmn.property.typeNull\":\"Null\",       \n    \"bpmn.property.valueFormatInvalid\":\"Value Format Invalid!\",      \n    });\n    \n    J.bpmnIOTranslations = {};\n\n    // bpmn io translations\n    $.extend(J.bpmnIOTranslations, {\n    });\n\n})(window.J)"
  },
  {
    "path": "easyflow-flow-bpmn/static/plugins/std-common/messages_zh.js",
    "content": "(function (J) {\nif (window.jLocale=='zh_CN') {\n$.extend(J.msg, {\n    \"locale\":\"zh_CN\",\n\n    \"multiselect.nonSelectedText\":\"请选择\",\n    \"multiselect.nSelectedText\":\"已选择\",\n    \"multiselect.allSelectedText\":\"已全选\",\n    \"multiselect.filterPlaceholder\":\"搜索\",\n    \"multiselect.selectAllText\":\"全部选择\",\n    \n    \"jqueryValidate.strictDate\":\"日期格式不合法\",  \n    \"jqueryValidate.json\":\"JSON格式不合法\",  \n    \"jqueryValidate.fileInput\":\"文件不能为空\", \n    \"jqueryValidate.required\":\"必须字段\", \n    \"jqueryValidate.remote\":\"请修正该字段\", \n    \"jqueryValidate.email\":\"请输入正确格式的电子邮件\", \n    \"jqueryValidate.url\":\"请输入合法的网址\", \n    \"jqueryValidate.date\":\"请输入合法的日期\", \n    \"jqueryValidate.dateISO\":\"请输入合法的日期 (ISO).\", \n    \"jqueryValidate.number\":\"请输入合法的数字\", \n    \"jqueryValidate.digits\":\"只能输入大于等于零的整数\", \n    \"jqueryValidate.creditcard\":\"请输入合法的信用卡号\", \n    \"jqueryValidate.equalTo\":\"请再次输入相同的值\", \n    \"jqueryValidate.accept\":\"请输入拥有合法后缀名的字符串\", \n    \"jqueryValidate.maxlength\":\"长度最长为 {0}\", \n    \"jqueryValidate.minlength\":\"长度最少为 {0}\", \n    \"jqueryValidate.rangelength\":\"长度必须在 {0}到 {1}之间\", \n    \"jqueryValidate.range\":\"请输入一个介于 {0} 和 {1} 之间的值\", \n    \"jqueryValidate.max\":\"请输入一个最大为{0} 的值\", \n    \"jqueryValidate.min\":\"请输入一个最小为{0} 的值\",\n    \n    \"ajaxSuccessCallback.successShowMsg\":\"操作成功\",\n    \"ajaxSuccessCallback.exceptionShowMsg\":\"系统异常\",\n    \n    \"jDialog.confirm\":\"确定\",\n    \"jDialog.cancel\":\"取消\",\n    \"jDialog.close\":\"关闭\",\n    \"jDialog.view\":\"查看\",\n    \n    \"jAjax.requestException\":\"请求异常\",\n \n    \"jListSelect.select\":\"选择\",   \n    \"jListSelect.value\":\"值\",\n    \"jListSelect.info\":\"信息\",\n    \"jListSelect.inputTip\":\"请先输入元素值\",\n    \"jListSelect.view\":\"查看\",\n    \n    \"jListSelect.select\":\"选择\",\n    \n    \"flow.jsonDefTitle\":\"JSON流程定义\",\n    \"flow.flowJsonDefinition\":\"JSON流程定义\",        \n    \"flow.newFlowDef\":\"新流程定义\",\n    \"flow.oldFlowDef\":\"旧流程定义\",\n    \"flow.noJsonDataTip\":\"无JSON流程定义数据\",\n    \"flow.id\":\"流程ID\",        \n    \"flow.nodeId\":\"节点ID\",\n    \"flow.nodeName\":\"节点名称\",\n    \"flow.flowDefId\":\"流程定义ID\",\n    \"flow.flowDefName\":\"流程定义名称\",\n    \"flow.flowDefType\":\"流程定义类型\",\n    \"flow.flowDefType.flowBpmn\":\"流程引擎-BPMN\",\n    \"flow.flowDefType.flowJson\":\"流程引擎-JSON\",\n    \"flow.flowDefType.fsmJson\":\"状态机-JSON\",\n    \"flow.bizType\":\"业务类型\",\n    \"flow.category\":\"流程类别\",\n    \"flow.flowDefinition\":\"流程定义\",\n    \"flow.flowDiagram\":\"流程图\",\n    \"flow.jsonDefinition\":\"JSON定义\",\n    \"flow.flowJsonDefinitioin\":\"流程JSON定义\",\n    \"flow.update\":\"更新\",\n    \"flow.oldNewCompare\":\"新旧比对\",\n    \"flow.cancel\":\"取消\",\n    \n    \"bpmn.detailInfoType\":\"详情信息类型\",\n    \"bpmn.bpmnFlowDefinition\":\"BPMN流程定义\",\n    \"bpmn.flowJsonDefinition\":\"流程JSON定义\",\n    \"bpmn.jsonContent\":\"JSON内容\",\n    \"bpmn.convertErrorTip\":\"BPMN转换JSON请求异常，此请求为ajax请求,请确认地址或服务是否正确,当前地址:\",\n    \"bpmn.newFlowDefinition\":\"新流程定义\",\n    \"bpmn.oldFlowDefinition\":\"旧流程定义\",\n    \"bpmn.idTooltip\":\"元素ID，非空，重要！建议英文，命名要有业务含义\",\n    \"bpmn.idEmptyError\":\"ID不能为空\",\n    \"bpmn.idExistsError\":\"ID已存在\",\n    \"bpmn.name\":\"名称\",\n    \"bpmn.nameTooltip\":\"元素名称，中文，可为空\",\n    \"bpmn.documentation\":\"说明\",\n    \"bpmn.documentationTooltip\":\"元素描述说明\",    \n    \"bpmn.property\":\"属性\",\n    \"bpmn.propertyTooltip\":\"元素属性，重要！JSON格式，具体参考配置文档\",    \n    \"bpmn.conditionType\":\"分支条件类型\",\n    \"bpmn.conditionType.exclusive\":\"排他网关\",\n    \"bpmn.conditionType.inclusive\":\"包容网关\",\n    \"bpmn.conditionTypeTooltip\":\"分支类型，默认为包容类型(每个分支条件都会计算，结果为true的均执行);一个分支时选择默认,非并行分支选择排他\",   \n    \"bpmn.startNode\":\"开始节点\",\n    \"bpmn.startNode.true\":\"是\",\n    \"bpmn.startNode.false\":\"否\",\n    \"bpmn.startNodeTooltip\":\"开始节点标识\",\n    \"bpmn.selfPre\":\"自定义前置\",\n    \"bpmn.selfPreTooltip\":\"自定义前置处理, 会覆盖流程图原语义，高级用法\",\n    \"bpmn.selfAction\":\"自定义动作\",\n    \"bpmn.selfActionTooltip\":\"自定义节点动作，会覆盖流程图原语义，高级用法\",        \n    \"bpmn.selfPost\":\"自定义流转\",\n    \"bpmn.selfPostTooltip\":\"自定义流转，会覆盖图中流转方向，自由流场景使用\",\n    \"bpmn.listeners\":\"监听器\",\n    \"bpmn.listenersTooltip\":\"流程监听器，JSON数组格式，具体参考配置文档\",\n    \"bpmn.filters\":\"流程过滤器\",\n    \"bpmn.filtersTooltip\":\"流程过滤器，JSON数组格式，具体参考配置文档\",\n    \"bpmn.nodeFilters\":\"节点过滤器\",\n    \"bpmn.nodeFiltersTooltip\":\"节点过滤器，JSON数组格式，具体参考配置文档\",    \n    \"bpmn.nodePreHandlerFilters\":\"节点前置处理过滤器\",\n    \"bpmn.nodePreHandlerFiltersTooltip\":\"节点前置处理过滤器，JSON数组格式，具体参考配置文档\",        \n    \"bpmn.nodeActionFilters\":\"节点动作过滤器\",\n    \"bpmn.nodeActionFiltersTooltip\":\"节点动作过滤器，JSON数组格式，具体参考配置文档\",  \n    \"bpmn.nodePostHandlerFilters\":\"节点后置处理过滤器\",\n    \"bpmn.nodePostHandlerFiltersTooltip\":\"节点后置处理过滤器，JSON数组格式，具体参考配置文档\",     \n    \"bpmn.flowPreHandlerFilters\":\"流程前置处理过滤器\",\n    \"bpmn.flowPreHandlerFiltersTooltip\":\"流程前置处理过滤器，JSON数组格式，具体参考配置文档\",        \n    \"bpmn.flowPostHandlerFilters\":\"流程后置处理过滤器\",\n    \"bpmn.flowPostHandlerFiltersTooltip\":\"流程后置处理过滤器，JSON数组格式，具体参考配置文档\",        \n    \"bpmn.runner\":\"流程执行器\",\n    \"bpmn.runnerTooltip\":\"流程执行器，默认为串行执行器\",\n    \"bpmn.parseListeners\":\"流程解析事件监听器\",\n    \"bpmn.parseListenersTooltip\":\"流程解析事件监听器\",            \n    \"bpmn.scriptFormat\":\"脚本格式\",\n    \"bpmn.scriptFormat.exp\":\"spel表达式\",\n    \"bpmn.scriptFormat.createExp\":\"create表达式\",\n    \"bpmn.scriptFormatTooltip\":\"脚本格式\",\n    \"bpmn.script\":\"脚本\",\n    \"bpmn.scriptTooltip\":\"脚本，具体格式参考配置文档\",\n    \"bpmn.conditionExp\":\"条件表达式\",\n    \"bpmn.conditionExpTooltip\":\"条件表达式，SPEL格式\",\n    \"bpmn.condition\":\"条件\",\n    \"bpmn.none\":\"无\",\n    \"bpmn.branchType\":\"分支类型\",\n    \"bpmn.branchType.exclusive\":\"排他\",\n    \"bpmn.bpmnDefinition\":\"BPMN定义\",\n    \"bpmn.import\":\"导入\",\n    \"bpmn.export\":\"导出\",\n    \"bpmn.svg\":\"SVG\",\n    \"bpmn.zoomIn\":\"缩小\",\n    \"bpmn.zoomOut\":\"放大\",\n    \"bpmn.fullScreen\":\"全屏\",\n    \"bpmn.node\":\"节点\",\n    \"bpmn.infoPanel\":\"信息面板\",\n    \"bpmn.flowBpmnDefinition\":\"流程BPMN定义\",\n    \"bpmn.renderFlowDiagram\":\"渲染流程图\",\n    \"bpmn.viewFlowDefinition\":\"查看EasyFlow定义\",\n    \"bpmn.oldNewBpmnCompare\":\"新旧BPMN定义比对\",\n    \"bpmn.oldNewEasyFlowCompare\":\"新旧EasyFlow定义比对\",\n    \"bpmn.cancel\":\"取消\",\n    \"bpmn.flowPreHandler\":\"流程前置处理器\",\n    \"bpmn.flowPreHandlerTooltip\":\"流程前置处理器\",\n    \"bpmn.flowPostHandler\":\"流程后置处理器\",\n    \"bpmn.flowPostHandlerTooltip\":\"流程后置处理器\",\n    \"bpmn.calledElement\":\"子流程ID\",\n    \"bpmn.calledElementTooltip\":\"子流程ID\",\n    \"bpmn.flow\":\"流程信息\",\n    \"bpmn.flowTooltip\":\"流程信息,至少需配置id\",\n    \"bpmn.calledElement\":\"调用ID\",\n    \"bpmn.logFlag\":\"打印日志开关\",\n    \"bpmn.logFlagTooltip\":\"打印日志开关，缺省开\",\n    \"bpmn.default\":\"缺省\",\n    \"bpmn.true\":\"是\",\n    \"bpmn.false\":\"否\",\n    \"bpmn.switchRowMode\":\"切换行模式\",\n    \"bpmn.switchJsonMode\":\"切换JSON模式\",\n    \"bpmn.property.propertyKey\":\"属性键\",    \n    \"bpmn.property.propertyValue\":\"属性值\",    \n    \"bpmn.property.typeString\":\"字符\",    \n    \"bpmn.property.typeNumber\":\"数值\",    \n    \"bpmn.property.typeBoolean\":\"真假\",    \n    \"bpmn.property.typeObject\":\"对象\",    \n    \"bpmn.property.typeArray\":\"数组\",    \n    \"bpmn.property.typeNull\":\"空值\",   \n    \"bpmn.property.valueFormatInvalid\":\"值格式不正确!\"    \n});\n\n\n    J.bpmnIOTranslations = {\n        \"Add Lane above\": \"添加到通道之上\",\n        \"Add Lane below\": \"添加到通道之下\",\n        \"Append compensation activity\": \"追加补偿活动\",\n        \"Append {type}\": \"追加 {type}\",\n        \"Append EndEvent\": \"追加结束事件\",\n        \"Append Gateway\": \"追加网关\",\n        \"Append Task\": \"追加任务\",\n        \"Append Intermediate/Boundary Event\": \"追加消息接收事件\",\n        \"Append TextAnnotation\": \"追加文本标注\",\n        \"Business Rule Task\": \"规则任务\",\n        \"Call Activity\": \"调用流程\",\n        \"Cancel Boundary Event\": \"取消边界事件\",\n        \"Cancel End Event\": \"结束取消事件\",\n        \"Change type\": \"更改类型\",\n        \"Collapsed Pool\": \"折叠池\",\n        \"Compensation Boundary Event\": \"补偿边界事件\",\n        \"Compensation End Event\": \"结束补偿事件\",\n        \"Compensation Intermediate Throw Event\": \"中间补偿抛出事件\",\n        \"Compensation Start Event\": \"补偿启动事件\",\n        \"Complex Gateway\": \"复杂网关\",\n        \"Conditional Boundary Event (non-interrupting)\": \"条件边界事件 (非中断)\",\n        \"Conditional Boundary Event\": \"条件边界事件\",\n        \"Conditional Flow\": \"条件流转\",        \n        \"Conditional Intermediate Catch Event\": \"中间条件捕获事件\",\n        \"Conditional Start Event (non-interrupting)\": \"条件启动事件 (非中断)\",\n        \"Conditional Start Event\": \"条件启动事件\",\n        \"Connect using Association\": \"文本关联\",\n        \"Connect using DataInputAssociation\": \"数据关联\",\n        \"Connect using Sequence/MessageFlow or Association\": \"连接\",\n        \"Create DataStoreReference\": \"创建数据存储(仅用于展示)\",\n        \"Create IntermediateThrowEvent/BoundaryEvent\": \"创建中间抛出/边界事件\",\n        \"Create Pool/Participant\": \"创建池/参与者\",\n        \"Create expanded SubProcess\": \"创建可折叠子流程\",\n        \"Create {type}\": \"创建 {type}\",\n        \"Create StartEvent\": \"创建事件\",\n        \"Create ScriptTask\": \"创建任务\",\n        \"Create Gateway\": \"创建网关\",\n        \"Create Group\": \"创建分组\",\n        \"Default Flow\": \"缺省流转\",\n        \"Data Store Reference\": \"数据存储\",\n        \"Data Object Reference\": \"数据对象\",\n        \"Divide into three Lanes\": \"分成三条通道\",\n        \"Divide into two Lanes\": \"分成两条通道\",\n        \"Empty Pool\": \"空池\",\n        \"Empty Pool (removes content)\":\"空池(清空内容)\",\n        \"End Event\": \"结束事件\",\n        \"Error Boundary Event\": \"错误边界事件\",\n        \"Error End Event\": \"结束错误事件\",\n        \"Error Start Event\": \"错误启动事件\",\n        \"Escalation Boundary Event (non-interrupting)\": \"升级边界事件 (非中断)\",\n        \"Escalation Boundary Event\": \"升级边界事件\",\n        \"Escalation End Event\": \"结束升级事件\",\n        \"Escalation Intermediate Throw Event\": \"中间升级抛出事件\",\n        \"Escalation Start Event (non-interrupting)\": \"升级启动事件 (非中断)\",\n        \"Escalation Start Event\": \"升级启动事件\",\n        \"Event Sub Process\": \"事件子流程\",\n        \"Event based Gateway\": \"事件网关\",\n        \"Exclusive Gateway\": \"排他网关\",\n        \"Expanded Pool\": \"展开池\",\n        \"Inclusive Gateway\": \"包容网关\",\n        \"Intermediate Throw Event\": \"中间抛出事件\",\n        \"Link Intermediate Catch Event\": \"中间链接捕获事件\",\n        \"Link Intermediate Throw Event\": \"中间链接抛出事件\",\n        \"Loop\": \"循环\",\n        \"Manual Task\": \"手动任务\",\n        \"Message Boundary Event (non-interrupting)\": \"消息边界事件 (非中断)\",\n        \"Message Boundary Event\": \"消息边界事件\",\n        \"Message End Event\": \"结束消息事件\",\n        \"Message Intermediate Catch Event\": \"中间消息捕获事件\",\n        \"Message Intermediate Throw Event\": \"中间消息抛出事件\",\n        \"Message Start Event (non-interrupting)\": \"消息启动事件 (非中断)\",\n        \"Message Start Event\": \"消息启动事件\",\n        \"Parallel Gateway\": \"并行网关\",\n        \"Parallel Multi Instance\": \"并行多实例\",\n        \"Receive Task\": \"接收消息任务\",\n        \"Remove\": \"移除\",\n        \"Script Task\": \"脚本任务\",\n        \"Send Task\": \"发送任务\",\n        \"Sequence Flow\": \"顺序流转\",\n        \"Sequential Multi Instance\": \"串行多实例\",\n        \"Service Task\": \"服务任务\",\n        \"Signal Boundary Event (non-interrupting)\": \"信号边界事件 (非中断)\",\n        \"Signal Boundary Event\": \"信号边界事件\",\n        \"Signal End Event\": \"结束信号事件\",\n        \"Signal Intermediate Catch Event\": \"中间信号捕获事件\",\n        \"Signal Intermediate Throw Event\": \"中间信号抛出事件\",\n        \"Signal Start Event (non-interrupting)\": \"信号启动事件 (非中断)\",\n        \"Signal Start Event\": \"信号启动事件\",\n        \"Start Event\": \"开始事件\",\n        \"Sub Process (collapsed)\": \"折叠子流程\",\n        \"Sub Process (expanded)\": \"展开子流程\",\n        \"Sub Process\": \"子流程\",\n        \"Task\": \"任务\",\n        \"TextAnnotation\": \"文本标注\",\n        \"Terminate End Event\": \"终止边界事件\",\n        \"Timer Boundary Event (non-interrupting)\": \"定时边界事件 (非中断)\",\n        \"Timer Boundary Event\": \"定时边界事件\",\n        \"Timer Intermediate Catch Event\": \"中间定时捕获事件\",\n        \"Timer Start Event (non-interrupting)\": \"定时启动事件 (非中断)\",\n        \"Timer Start Event\": \"定时启动事件\",\n        \"Transaction\": \"事务\",\n        \"User Task\": \"用户任务\",\n        \"already rendered {element}\": \"{element} 已呈现\",\n        \"diagram not part of bpmn:Definitions\": \"图表不是 bpmn:Definitions 的一部分\",\n        \"element required\": \"需要元素\",\n        \"element {element} referenced by {referenced}#{property} not yet drawn\": \"元素 {element} 的引用 {referenced}#{property} 尚未绘制\",\n        \"failed to import {element}\": \"{element} 导入失败\",\n        \"flow elements must be children of pools/participants\": \"元素必须是池/参与者的子级\",\n        \"more than {count} child lanes\": \"超过 {count} 条通道\",\n        \"no diagram to display\": \"没有要显示的图表\",\n        \"no parent for {element} in {parent}\": \"在 {element} 中没有父元素 {parent}\",\n        \"no process or collaboration to display\": \"没有可显示的流程或协作\",\n        \"no shape type specified\": \"未指定形状类型\",\n        \"out of bounds release\": \"越界释放\",\n        \"Change element\":\"更换元素\",\n        \"Activate the lasso tool\":\"区域选择\"\n    };\n\n}\n})(window.J);"
  },
  {
    "path": "easyflow-flow-bpmn/static/test/JsonPropertyEditor.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n<meta charset=\"UTF-8\" />\n<title>JJsonPropertyEditor</title>\n\n<!-- required modeler styles -->\n<link rel=\"stylesheet\" href=\"../plugins/fontawesome/css/all.css\">\n<link rel=\"stylesheet\" href=\"../plugins/bootstrap/css/bootstrap.css\" />\n<link rel=\"stylesheet\" href=\"../plugins/std-common/common.css\" />\n<style>\nbody {margin-top: 5px}\n</style>\n</head>\n\n<body>\n<div class=\"container-fluid\">\n<div class=\"row\">\n    <div class=\"col\">\n        <textarea id=\"textarea1\"></textarea>\n        <div id=\"control1\"></div>\n    </div>\n</div>\n<div class=\"row\">\n    <div class=\"col\">\n        <button id=\"switchJson\">JSON mode</button>\n        <button id=\"switchRow\">Row mode</button>\n        <button id=\"viewValue\">View JSON value</button>\n    </div>\n   \n</div>\n</div>\n</body>\n<script>\n//window.jLocale=\"en_US\";\n</script>\n<script src=\"../plugins/jquery/jquery-3.6.0.js\"></script>\n<script src=\"../plugins/jquery-validation/jquery.validate.js\"></script>\n<script src=\"../plugins/bootstrap/js/bootstrap.bundle.js\"></script>\n<script src=\"../plugins/std-common/messages_default.js\"></script>\n<script src=\"../plugins/std-common/messages_zh.js\"></script>\n<script src=\"../plugins/std-common/common.js\"></script>\n<script>\nvar val = {\"a\":1, \"b\":\"2\", \"c\":true, \"d\":{\"d\":1}, \"e\":[1,2,3], \"f\":null};\n$(\"#textarea1\").val(JSON.stringify(val));\n$(\"#textarea1\").jJsonPropertyEditor();\n$(\"#switchJson\").click(function(){$(\"#textarea1\").jJsonPropertyEditor(\"changeMode\", \"JSON\")});\n$(\"#switchRow\").click(function(){$(\"#textarea1\").jJsonPropertyEditor(\"changeMode\", \"ROW\")});\n$(\"#viewValue\").click(function() {\n  var val = $(\"#textarea1\").jJsonPropertyEditor(\"collect\");\n  alert(JSON.stringify(val));\n});\n</script>\n</html>"
  },
  {
    "path": "easyflow-flow-extension/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n    xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>easyflow-parent</artifactId>\n        <groupId>com.jd.easyflow</groupId>\n        <version>1.7.3</version>\n    </parent>\n    <artifactId>easyflow-flow-extension</artifactId>\n    <name>easyflow-flow-extension</name>\n    <packaging>jar</packaging>\n    <properties>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>com.jd.easyflow</groupId>\n            <artifactId>easyflow-flow</artifactId>\n        </dependency>            \n        <!--other -->\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-classic</artifactId>\n            <scope>test</scope>\n        </dependency>        \n        <dependency>\n            <groupId>junit</groupId>\n            <artifactId>junit</artifactId>\n            <scope>test</scope>\n        </dependency>\t\t\n    </dependencies>\n\n</project>"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/chain/BaseChainPlugin.java",
    "content": "package com.jd.easyflow.flow.ext.chain;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.util.ExceptionUtil;\n\n/**\n * Node action with chain pattern.\n * \n * @author liyuliang5\n *\n */\npublic abstract class BaseChainPlugin implements NodeAction {\n    \n    private static final Logger logger = LoggerFactory.getLogger(BaseChainPlugin.class);\n\n    /**\n     * execute node action.\n     */\n    @Override\n    public <T> T execute(NodeContext nodeContext, FlowContext context) {\n        String stage = context.get(ChainConstants.STAGE);\n        if (stage == null) {\n            stage = ChainConstants.STAGE_PRE;\n            context.put(ChainConstants.STAGE, ChainConstants.STAGE_PRE);\n        }\n        if (ChainConstants.STAGE_PRE.equals(stage)) {\n            try {\n                boolean result = preHandle(nodeContext, context);\n                if (result == false) {\n                    context.put(ChainConstants.STAGE, ChainConstants.STAGE_POST);\n                }\n            } catch (Throwable t) {\n                if (context.isLogOn() && logger.isErrorEnabled()) {\n                    logger.error(this.getClass().getName() + \" pre handle exception:\" + t.getMessage());\n                }\n                context.put(ChainConstants.STAGE, ChainConstants.STAGE_POST);\n                context.put(ChainConstants.EXCEPTION, t);\n            }\n        } else {\n            try {\n                postHandle(nodeContext, context);\n            } catch (Throwable t) {\n                if (context.isLogOn() && logger.isErrorEnabled()) {\n                    logger.error(this.getClass().getName() + \"post handle exception:\" + t.getMessage());\n                }\n                context.put(ChainConstants.EXCEPTION, t);\n            }\n        }\n        return null;\n    }\n\n    /**\n     * Pre handle.\n     * \n     * @param nodeContext\n     * @param context\n     * @return\n     */\n    public abstract boolean preHandle(NodeContext nodeContext, FlowContext context);\n\n    /**\n     * Post handle.\n     * \n     * @param nodeContext\n     * @param context\n     */\n    public void postHandle(NodeContext nodeContext, FlowContext context) {\n        Throwable t = context.get(ChainConstants.EXCEPTION);\n        if (t == null) {\n            postHandleNormal(nodeContext, context);\n        } else {\n            postHandleException(t, nodeContext, context);\n        }\n    }\n\n    /**\n     * Normal post handle.\n     * \n     * @param nodeContext\n     * @param context\n     */\n    public void postHandleNormal(NodeContext nodeContext, FlowContext context) {\n        return;\n    }\n\n    /**\n     * Post handle when exception.\n     * \n     * @param t\n     * @param nodeContext\n     * @param context\n     */\n    public void postHandleException(Throwable t, NodeContext nodeContext, FlowContext context) {\n        throw ExceptionUtil.throwException(t);\n    }\n\n    /**\n     * Clear exception.\n     * \n     * @param nodeContext\n     * @param context\n     */\n    public void clearException(NodeContext nodeContext, FlowContext context) {\n        context.put(ChainConstants.EXCEPTION, null);\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/chain/ChainConstants.java",
    "content": "package com.jd.easyflow.flow.ext.chain;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ChainConstants {\n\n\n    public static final String STAGE = \"chainStage\";\n\n    public static final String EXCEPTION = \"chainException\";\n\n    public static final String STAGE_PRE = \"PRE\";\n\n    public static final String STAGE_POST = \"POST\";\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/chain/ChainInvoker.java",
    "content": "package com.jd.easyflow.flow.ext.chain;\n\nimport java.util.function.Function;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowEngine;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.NodeExecutor;\nimport com.jd.easyflow.flow.util.ExceptionUtil;\nimport com.jd.easyflow.flow.util.FlowConstants;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ChainInvoker {\n\n    private FlowEngine flowEngine;\n    \n    public <T, R>R invoke(String chainFlowId, T param, Function<T, R> targetAction) {\n        FlowParam flowParam = new FlowParam(chainFlowId, param);\n        flowParam.put(FlowConstants.PARAM_ACTION_EXECUTOR, new NodeExecutor<Object>() {\n            @Override\n            public Object execute(NodeContext nodeContext, FlowContext context) {\n                try {\n                    return targetAction.apply(context.getParam().getParam());\n                } catch (Exception e) {\n                    throw ExceptionUtil.throwException(e);\n                }\n            }\n        });\n        FlowResult result = flowEngine.execute(flowParam);\n        Throwable exception = result.getContext().get(ChainConstants.EXCEPTION);\n        if (exception != null) {\n            throw ExceptionUtil.throwException(exception);\n        }\n        return result.getResult();\n    }\n\n    public FlowEngine getFlowEngine() {\n        return flowEngine;\n    }\n\n    public void setFlowEngine(FlowEngine flowEngine) {\n        this.flowEngine = flowEngine;\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/chain/TargetAction.java",
    "content": "package com.jd.easyflow.flow.ext.chain;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.action.ParamExecutorNodeAction;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class TargetAction extends ParamExecutorNodeAction {\n    \n    private static final Logger logger = LoggerFactory.getLogger(TargetAction.class);\n\n    @Override\n    public Void execute(NodeContext nodeContext, FlowContext context) {\n        try {\n            Object result = super.execute(nodeContext, context);\n            context.getResult().setResult(result);\n            return null;\n        } catch (Throwable t) {\n            if (context.isLogOn() && logger.isErrorEnabled()) {\n                logger.error(\"Target action execute exception:\" + t.getMessage());\n            }\n            context.put(ChainConstants.EXCEPTION, t);\n            return null;\n        } finally {\n            context.put(ChainConstants.STAGE, ChainConstants.STAGE_POST);\n        }\n    }\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/check/CheckErrorItem.java",
    "content": "package com.jd.easyflow.flow.ext.check;\n\nimport com.jd.easyflow.flow.model.Flow;\n\n/**\n * @author liyuliang5\n */\npublic class CheckErrorItem {\n\n    String errorType;\n    String errorMessage;\n    String flowId;\n    String nodeId;\n    Flow flow;\n    \n    public CheckErrorItem() {\n        \n    }\n    \n    public CheckErrorItem(String errorType, String errorMessage, String flowId, String nodeId, Flow flow) {\n        this.errorType = errorType;\n        this.errorMessage = errorMessage;\n        this.flowId = flowId;\n        this.nodeId = nodeId;\n        this.flow = flow;\n    }\n    \n    public String getErrorType() {\n        return errorType;\n    }\n    public void setErrorType(String errorType) {\n        this.errorType = errorType;\n    }\n    public String getErrorMessage() {\n        return errorMessage;\n    }\n    public void setErrorMessage(String errorMessage) {\n        this.errorMessage = errorMessage;\n    }\n    public String getFlowId() {\n        return flowId;\n    }\n    public void setFlowId(String flowId) {\n        this.flowId = flowId;\n    }\n    public String getNodeId() {\n        return nodeId;\n    }\n    public void setNodeId(String nodeId) {\n        this.nodeId = nodeId;\n    }\n\n    public Flow getFlow() {\n        return flow;\n    }\n\n    public void setFlow(Flow flow) {\n        this.flow = flow;\n    }\n    \n    \n    \n    \n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/check/CheckParam.java",
    "content": "package com.jd.easyflow.flow.ext.check;\n\nimport com.jd.easyflow.flow.model.Flow;\n\n/**\n * @author liyuliang5\n */\npublic class CheckParam {\n\n    private Flow flow;\n    \n    private Object config;\n\n    public Flow getFlow() {\n        return flow;\n    }\n\n    public void setFlow(Flow flow) {\n        this.flow = flow;\n    }\n\n    public Object getConfig() {\n        return config;\n    }\n\n    public void setConfig(Object config) {\n        this.config = config;\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/check/CheckResult.java",
    "content": "package com.jd.easyflow.flow.ext.check;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * @author liyuliang5\n */\npublic class CheckResult {\n    \n    List<CheckErrorItem> errorItemList = new ArrayList<CheckErrorItem>();\n    \n    public void addErrorItem(CheckErrorItem errorItem) {\n        errorItemList.add(errorItem);\n    }\n\n    public List<CheckErrorItem> getErrorItemList() {\n        return errorItemList;\n    }\n\n    public void setErrorItemList(List<CheckErrorItem> errorItemList) {\n        this.errorItemList = errorItemList;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/check/FlowChecker.java",
    "content": "package com.jd.easyflow.flow.ext.check;\n\n/**\n * @author liyuliang5\n */\npublic interface FlowChecker {\n\n    public CheckResult check(CheckParam param);\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/check/impl/AllFlowNodeLinkChecker.java",
    "content": "package com.jd.easyflow.flow.ext.check.impl;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map.Entry;\nimport java.util.Set;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.context.SmartLifecycle;\n\nimport com.jd.easyflow.flow.engine.impl.CoreFlowEngine;\nimport com.jd.easyflow.flow.exception.FlowException;\nimport com.jd.easyflow.flow.ext.check.CheckErrorItem;\nimport com.jd.easyflow.flow.ext.check.CheckParam;\nimport com.jd.easyflow.flow.ext.check.CheckResult;\nimport com.jd.easyflow.flow.model.Flow;\n\n/**\n * @author liyuliang5\n */\npublic class AllFlowNodeLinkChecker implements SmartLifecycle {\n    \n    private static final Logger logger = LoggerFactory.getLogger(AllFlowNodeLinkChecker.class);\n    \n    private static final String VERSION_PREFIX = \"--V_\";\n\n\n    public static final int CHECK_POLICY_OFF = 0;\n    public static final int CHECK_POLICY_WARN = 1;\n    public static final int CHECK_POLICY_EXCEPTION = 2;\n\n    private boolean check = true;\n\n    private int checkNodeIsolatedPolicy = CHECK_POLICY_EXCEPTION;\n    private int checkNextNodesNotExistsPolicy = CHECK_POLICY_EXCEPTION;\n    private int checkPreCheckNodesNotExistsPolicy = CHECK_POLICY_EXCEPTION;\n    private int checkNonStartNodeNoPreviousPolicy = CHECK_POLICY_EXCEPTION;\n    private int checkNonEndNodeNoNextPolicy = CHECK_POLICY_OFF;\n\n    private FlowNodeLinkChecker checker = new FlowNodeLinkChecker();\n    \n    private Set<String> flowWhitelist;\n    \n\n    private  int phase = Integer.MIN_VALUE + 1;\n    \n    private boolean autoStartup = true;\n\n    private volatile boolean isRunning = false;\n    \n    private CoreFlowEngine flowEngine;\n    \n    public void check() {\n        List<CheckErrorItem> itemList = doCheck();\n        boolean exception = false;\n        for (CheckErrorItem item : itemList) {\n            logger.warn(\"Flow check error, type:\" + item.getErrorType() + \" flowId:\" + item.getFlowId() + \" nodeId:\"\n                    + item.getNodeId() + \" flow:\\n\" + item.getFlow().stringify());\n            int policy;\n            switch (item.getErrorType()) {\n            case FlowNodeLinkChecker.ERROR_TYPE_NODE_ISOLATED: {\n                policy = checkNodeIsolatedPolicy;\n                break;\n            }\n            case FlowNodeLinkChecker.ERROR_TYPE_NEXT_NODES_NOT_EXISTS: {\n                policy = checkNextNodesNotExistsPolicy;\n                break;\n            }\n            case FlowNodeLinkChecker.ERROR_TYPE_PRE_CHECK_NODES_NOT_EXISTS: {\n                policy = checkPreCheckNodesNotExistsPolicy;\n                break;\n            }\n            case FlowNodeLinkChecker.ERROR_TYPE_NON_START_NODE_NO_PREVIOUS: {\n                policy = checkNonStartNodeNoPreviousPolicy;\n                break;\n            }\n            case FlowNodeLinkChecker.ERROR_TYPE_NON_END_NODE_NO_NEXT: {\n                policy = checkNonEndNodeNoNextPolicy;\n                break;\n            }\n            default: {\n                policy = CHECK_POLICY_OFF;\n            }\n            }\n            if (!exception && policy == CHECK_POLICY_EXCEPTION) {\n                exception = true;\n            }\n        }\n        if (exception) {\n            throw new FlowException(\"Flow check error!\");\n        }\n    }\n    \n    public List<CheckErrorItem> doCheck() {\n        List<Flow> allFlowList = getAllFlowList();\n        return doCheck(allFlowList);\n    }\n    \n    public List<CheckErrorItem> doCheck(List<Flow> allFlowList) {\n        List<CheckErrorItem> list = new ArrayList<CheckErrorItem>();\n        if (! check) {\n            logger.info(\"check flag is false, return.\");\n            return list;\n        }\n        logger.info(\"start do flow check\");\n        CheckParam param = new CheckParam();\n        FlowNodeLinkCheckConfig config = new FlowNodeLinkCheckConfig();\n        config.setCheckNodeIsolated(checkNodeIsolatedPolicy != CHECK_POLICY_OFF);\n        config.setCheckNextNodesNotExists(checkNextNodesNotExistsPolicy != CHECK_POLICY_OFF);\n        config.setCheckPreCheckNodesNotExists(checkPreCheckNodesNotExistsPolicy != CHECK_POLICY_OFF);\n        config.setCheckNonStartNodeNoPrevious(checkNonStartNodeNoPreviousPolicy != CHECK_POLICY_OFF);\n        config.setCheckNonEndNodeNoNext(checkNonEndNodeNoNextPolicy != CHECK_POLICY_OFF);\n        param.setConfig(config);\n        for (Flow flow : allFlowList) {\n            if (flowWhitelist != null && flowWhitelist.contains(flow.getId())) {\n                continue;\n            }\n            param.setFlow(flow);\n            CheckResult checkResult = checker.check(param);\n            if (checkResult.getErrorItemList() != null && checkResult.getErrorItemList().size() > 0) {\n                list.addAll(checkResult.getErrorItemList());\n            }\n        }\n        logger.info(\"end do flow check, flow size:\" + allFlowList.size() + \", error size:\" + list.size());\n        return list;\n    }\n    \n    protected List<Flow> getAllFlowList() {\n        List<Flow> list = new ArrayList<Flow>();\n        for (Entry<String, Flow> entry : flowEngine.getFlowMap().entrySet()) {\n            if (entry.getKey().endsWith(VERSION_PREFIX)) {\n                continue;\n            }\n            list.add(entry.getValue());\n        }\n        return list;\n    }\n    \n\n    @Override\n    public void start() {\n        check();\n        isRunning = true;\n    }\n\n    @Override\n    public void stop() {\n        isRunning = false;\n    }\n    \n    @Override\n    public boolean isAutoStartup() {\n        return autoStartup;\n    }\n    \n    @Override\n    public void stop(Runnable callback) {\n        stop();\n        callback.run();\n    }\n\n    @Override\n    public boolean isRunning() {\n        return isRunning;\n    }\n    \n    @Override\n    public int getPhase() {\n        return phase;\n    }\n\n    public void setPhase(int phase) {\n        this.phase = phase;\n    }\n\n    public void setAutoStartup(boolean autoStartup) {\n        this.autoStartup = autoStartup;\n    }\n\n\n    public boolean isCheck() {\n        return check;\n    }\n\n\n    public void setCheck(boolean check) {\n        this.check = check;\n    }\n\n\n    public int getCheckNodeIsolatedPolicy() {\n        return checkNodeIsolatedPolicy;\n    }\n\n\n    public void setCheckNodeIsolatedPolicy(int checkNodeIsolatedPolicy) {\n        this.checkNodeIsolatedPolicy = checkNodeIsolatedPolicy;\n    }\n\n\n    public int getCheckNextNodesNotExistsPolicy() {\n        return checkNextNodesNotExistsPolicy;\n    }\n\n\n    public void setCheckNextNodesNotExistsPolicy(int checkNextNodesNotExistsPolicy) {\n        this.checkNextNodesNotExistsPolicy = checkNextNodesNotExistsPolicy;\n    }\n\n\n    public int getCheckPreCheckNodesNotExistsPolicy() {\n        return checkPreCheckNodesNotExistsPolicy;\n    }\n\n\n    public void setCheckPreCheckNodesNotExistsPolicy(int checkPreCheckNodesNotExistsPolicy) {\n        this.checkPreCheckNodesNotExistsPolicy = checkPreCheckNodesNotExistsPolicy;\n    }\n\n\n    public int getCheckNonStartNodeNoPreviousPolicy() {\n        return checkNonStartNodeNoPreviousPolicy;\n    }\n\n\n    public void setCheckNonStartNodeNoPreviousPolicy(int checkNonStartNodeNoPreviousPolicy) {\n        this.checkNonStartNodeNoPreviousPolicy = checkNonStartNodeNoPreviousPolicy;\n    }\n\n\n    public int getCheckNonEndNodeNoNextPolicy() {\n        return checkNonEndNodeNoNextPolicy;\n    }\n\n\n    public void setCheckNonEndNodeNoNextPolicy(int checkNonEndNodeNoNextPolicy) {\n        this.checkNonEndNodeNoNextPolicy = checkNonEndNodeNoNextPolicy;\n    }\n\n\n    public FlowNodeLinkChecker getChecker() {\n        return checker;\n    }\n\n\n    public void setChecker(FlowNodeLinkChecker checker) {\n        this.checker = checker;\n    }\n\n\n    public Set<String> getFlowWhitelist() {\n        return flowWhitelist;\n    }\n\n\n    public void setFlowWhitelist(Set<String> flowWhitelist) {\n        this.flowWhitelist = flowWhitelist;\n    }\n\n    public CoreFlowEngine getFlowEngine() {\n        return flowEngine;\n    }\n\n    public void setFlowEngine(CoreFlowEngine flowEngine) {\n        this.flowEngine = flowEngine;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/check/impl/ExpNodeActionDotCheckFlowParseListener.java",
    "content": "package com.jd.easyflow.flow.ext.check.impl;\n\nimport java.util.Map;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.exception.FlowException;\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.action.EventNodeAction;\nimport com.jd.easyflow.flow.model.action.ExpNodeAction;\nimport com.jd.easyflow.flow.model.node.NodeImpl;\nimport com.jd.easyflow.flow.model.parser.event.FlowParseEvent;\nimport com.jd.easyflow.flow.model.parser.event.FlowParseEventListener;\nimport com.jd.easyflow.flow.model.parser.event.FlowParseEventTypes;\nimport com.jd.easyflow.flow.util.FlowConstants;\n\n/**\n * Check the exp of ExpNodeAction contains dot to avoid '@xxxBean' format.\n * @author liyuliang5\n * \n */\npublic class ExpNodeActionDotCheckFlowParseListener implements FlowParseEventListener {\n    \n    private static final Logger logger = LoggerFactory.getLogger(ExpNodeActionDotCheckFlowParseListener.class);\n\n    private static final String NODE_ACTION_EXP_NO_DOT_POLICY_WARN = \"WARN\";\n    private static final String NODE_ACTION_EXP_NO_DOT_POLICY_EXCEPTION = \"EXCEPTION\";\n\n    private String nodeActionExpNoDotPolicy;\n\n    @Override\n    public void on(FlowParseEvent event) {\n        switch (event.getType()) {\n        case FlowParseEventTypes.INIT_FLOW_END: {\n            if (logger.isDebugEnabled()) {\n                logger.debug(\"Start flow check, flow ID:\" + event.getFlow().getId());\n            }\n            Flow flow = event.getFlow();\n            if (flow.getNodeList() != null) {\n                for (FlowNode node : flow.getNodeList()) {\n                    if (node instanceof NodeImpl) {\n                        NodeImpl nodeImpl = (NodeImpl) node;\n                        NodeAction nodeAction = nodeImpl.getAction();\n                        if (nodeAction instanceof ExpNodeAction) {\n                            // exp node action\n                            validateNodeActionExp((ExpNodeAction) nodeAction, flow, nodeImpl);\n                        } else if (nodeAction instanceof EventNodeAction) {\n                            // event node action\n                            Map<String, NodeAction> eventActionMap = node\n                                    .getProperty(FlowConstants.PROP_RUNTIME_EVENT_NODE_ACTION_MAP);\n                            if (eventActionMap != null) {\n                                for (NodeAction subNodeAction : eventActionMap.values()) {\n                                    if (subNodeAction instanceof ExpNodeAction) {\n                                        validateNodeActionExp((ExpNodeAction) subNodeAction, flow, nodeImpl);\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n        }\n\n    }\n\n    private void validateNodeActionExp(ExpNodeAction expNodeAction, Flow flow, FlowNode node) {\n        String exp = expNodeAction.getExp();\n        if (!exp.contains(\".\")) {\n            String errorMsg =  \"[EXP INVALID]Flow:\" + flow.getId() + \" Node:\" + node.getId() + \" Exp:[\" + exp + \"] invalid, should contains dot\";\n            logger.warn(errorMsg);\n            if (NODE_ACTION_EXP_NO_DOT_POLICY_EXCEPTION.equals(nodeActionExpNoDotPolicy)) {\n                throw new FlowException(errorMsg);\n            } \n        }\n    }\n\n    public String getNodeActionExpNoDotPolicy() {\n        return nodeActionExpNoDotPolicy;\n    }\n\n    public void setNodeActionExpNoDotPolicy(String nodeActionExpNoDotPolicy) {\n        this.nodeActionExpNoDotPolicy = nodeActionExpNoDotPolicy;\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/check/impl/FlowNodeLinkCheckConfig.java",
    "content": "package com.jd.easyflow.flow.ext.check.impl;\n\n/**\n * @author liyuliang5\n */\npublic class FlowNodeLinkCheckConfig {\n\n    private boolean checkNodeIsolated;\n    \n    private boolean checkNextNodesNotExists;\n    \n    private boolean checkPreCheckNodesNotExists;\n\n    private boolean checkNonStartNodeNoPrevious;\n    \n    private boolean checkNonEndNodeNoNext;\n\n\n    public boolean isCheckNodeIsolated() {\n        return checkNodeIsolated;\n    }\n\n    public void setCheckNodeIsolated(boolean checkNodeIsolated) {\n        this.checkNodeIsolated = checkNodeIsolated;\n    }\n\n    public boolean isCheckNextNodesNotExists() {\n        return checkNextNodesNotExists;\n    }\n\n    public void setCheckNextNodesNotExists(boolean checkNextNodesNotExists) {\n        this.checkNextNodesNotExists = checkNextNodesNotExists;\n    }\n\n    public boolean isCheckPreCheckNodesNotExists() {\n        return checkPreCheckNodesNotExists;\n    }\n\n    public void setCheckPreCheckNodesNotExists(boolean checkPreCheckNodesNotExists) {\n        this.checkPreCheckNodesNotExists = checkPreCheckNodesNotExists;\n    }\n\n    public boolean isCheckNonStartNodeNoPrevious() {\n        return checkNonStartNodeNoPrevious;\n    }\n\n    public void setCheckNonStartNodeNoPrevious(boolean checkNonStartNodeNoPrevious) {\n        this.checkNonStartNodeNoPrevious = checkNonStartNodeNoPrevious;\n    }\n\n    public boolean isCheckNonEndNodeNoNext() {\n        return checkNonEndNodeNoNext;\n    }\n\n    public void setCheckNonEndNodeNoNext(boolean checkNonEndNodeNoNext) {\n        this.checkNonEndNodeNoNext = checkNonEndNodeNoNext;\n    }\n  \n    \n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/check/impl/FlowNodeLinkCheckFlowParseListener.java",
    "content": "package com.jd.easyflow.flow.ext.check.impl;\n\nimport java.util.Set;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.exception.FlowException;\nimport com.jd.easyflow.flow.ext.check.CheckErrorItem;\nimport com.jd.easyflow.flow.ext.check.CheckParam;\nimport com.jd.easyflow.flow.ext.check.CheckResult;\nimport com.jd.easyflow.flow.model.parser.event.FlowParseEvent;\nimport com.jd.easyflow.flow.model.parser.event.FlowParseEventListener;\nimport com.jd.easyflow.flow.model.parser.event.FlowParseEventTypes;\n\n/**\n * @author liyuliang5\n */\npublic class FlowNodeLinkCheckFlowParseListener implements FlowParseEventListener {\n\n    private static final Logger logger = LoggerFactory.getLogger(FlowNodeLinkCheckFlowParseListener.class);\n\n    public static final int CHECK_POLICY_OFF = 0;\n    public static final int CHECK_POLICY_WARN = 1;\n    public static final int CHECK_POLICY_EXCEPTION = 2;\n\n    private boolean check = true;\n\n    private int checkNodeIsolatedPolicy = CHECK_POLICY_EXCEPTION;\n    private int checkNextNodesNotExistsPolicy = CHECK_POLICY_EXCEPTION;\n    private int checkPreCheckNodesNotExistsPolicy = CHECK_POLICY_EXCEPTION;\n    private int checkNonStartNodeNoPreviousPolicy = CHECK_POLICY_EXCEPTION;\n    private int checkNonEndNodeNoNextPolicy = CHECK_POLICY_OFF;\n\n    private FlowNodeLinkChecker checker = new FlowNodeLinkChecker();\n    \n    private Set<String> flowWhitelist;\n    \n    private boolean checkOnlyParseEl = false;\n\n    @Override\n    public void on(FlowParseEvent event) {\n        if (!check) {\n            return;\n        }\n        switch (event.getType()) {\n        case FlowParseEventTypes.INIT_FLOW_END: {\n            if (checkOnlyParseEl && ! event.isParseEl()) {\n                return;\n            }\n            if (logger.isDebugEnabled()) {\n                logger.debug(\"Start node link check, flow ID:\" + event.getFlow().getId());\n            }\n            if (flowWhitelist != null && flowWhitelist.contains(event.getFlow().getId())) {\n                return;\n            }\n            CheckParam param = new CheckParam();\n            param.setFlow(event.getFlow());\n            FlowNodeLinkCheckConfig config = new FlowNodeLinkCheckConfig();\n            config.setCheckNodeIsolated(checkNodeIsolatedPolicy != CHECK_POLICY_OFF);\n            config.setCheckNextNodesNotExists(checkNextNodesNotExistsPolicy != CHECK_POLICY_OFF);\n            config.setCheckPreCheckNodesNotExists(checkPreCheckNodesNotExistsPolicy != CHECK_POLICY_OFF);\n            config.setCheckNonStartNodeNoPrevious(checkNonStartNodeNoPreviousPolicy != CHECK_POLICY_OFF);\n            config.setCheckNonEndNodeNoNext(checkNonEndNodeNoNextPolicy != CHECK_POLICY_OFF);\n            param.setConfig(config);\n            CheckResult result = checker.check(param);\n            for (CheckErrorItem item : result.getErrorItemList()) {\n                int policy;\n                switch (item.getErrorType()) {\n                case FlowNodeLinkChecker.ERROR_TYPE_NODE_ISOLATED: {\n                    policy = checkNodeIsolatedPolicy;\n                    break;\n                }\n                case FlowNodeLinkChecker.ERROR_TYPE_NEXT_NODES_NOT_EXISTS: {\n                    policy = checkNextNodesNotExistsPolicy;\n                    break;\n                }\n                case FlowNodeLinkChecker.ERROR_TYPE_PRE_CHECK_NODES_NOT_EXISTS: {\n                    policy = checkPreCheckNodesNotExistsPolicy;\n                    break;\n                }\n                case FlowNodeLinkChecker.ERROR_TYPE_NON_START_NODE_NO_PREVIOUS: {\n                    policy = checkNonStartNodeNoPreviousPolicy;\n                    break;\n                } case FlowNodeLinkChecker.ERROR_TYPE_NON_END_NODE_NO_NEXT: {\n                    policy = checkNonEndNodeNoNextPolicy;\n                    break;\n                }\n                default: {\n                    policy = CHECK_POLICY_OFF;\n                }\n                }\n                logger.warn(\"Flow check error, type:\" + item.getErrorType() + \" flowId:\" + item.getFlowId() + \" nodeId:\"\n                        + item.getNodeId() + \"flow:\\n\" + item.getFlow().stringify());\n                if (policy == CHECK_POLICY_EXCEPTION) {\n                    throw new FlowException(\"Flow check error, type:\" + item.getErrorType() + \" flowId:\"\n                            + item.getFlowId() + \" nodeId:\" + item.getNodeId());\n                }\n            }\n        }\n        }\n    }\n\n    public boolean isCheck() {\n        return check;\n    }\n\n    public void setCheck(boolean check) {\n        this.check = check;\n    }\n\n    public int getCheckNodeIsolatedPolicy() {\n        return checkNodeIsolatedPolicy;\n    }\n\n    public void setCheckNodeIsolatedPolicy(int checkNodeIsolatedPolicy) {\n        this.checkNodeIsolatedPolicy = checkNodeIsolatedPolicy;\n    }\n\n    public int getCheckNextNodesNotExistsPolicy() {\n        return checkNextNodesNotExistsPolicy;\n    }\n\n    public void setCheckNextNodesNotExistsPolicy(int checkNextNodesNotExistsPolicy) {\n        this.checkNextNodesNotExistsPolicy = checkNextNodesNotExistsPolicy;\n    }\n\n    public int getCheckPreCheckNodesNotExistsPolicy() {\n        return checkPreCheckNodesNotExistsPolicy;\n    }\n\n    public void setCheckPreCheckNodesNotExistsPolicy(int checkPreCheckNodesNotExistsPolicy) {\n        this.checkPreCheckNodesNotExistsPolicy = checkPreCheckNodesNotExistsPolicy;\n    }\n\n    public int getCheckNonStartNodeNoPreviousPolicy() {\n        return checkNonStartNodeNoPreviousPolicy;\n    }\n\n    public void setCheckNonStartNodeNoPreviousPolicy(int checkNonStartNodeNoPreviousPolicy) {\n        this.checkNonStartNodeNoPreviousPolicy = checkNonStartNodeNoPreviousPolicy;\n    }\n    \n\n    public int getCheckNonEndNodeNoNextPolicy() {\n        return checkNonEndNodeNoNextPolicy;\n    }\n\n    public void setCheckNonEndNodeNoNextPolicy(int checkNonEndNodeNoNextPolicy) {\n        this.checkNonEndNodeNoNextPolicy = checkNonEndNodeNoNextPolicy;\n    }\n\n    public Set<String> getFlowWhitelist() {\n        return flowWhitelist;\n    }\n\n    public void setFlowWhitelist(Set<String> flowWhitelist) {\n        this.flowWhitelist = flowWhitelist;\n    }\n\n    public FlowNodeLinkChecker getChecker() {\n        return checker;\n    }\n\n    public void setChecker(FlowNodeLinkChecker checker) {\n        this.checker = checker;\n    }\n\n    public boolean isCheckOnlyParseEl() {\n        return checkOnlyParseEl;\n    }\n\n    public void setCheckOnlyParseEl(boolean checkOnlyParseEl) {\n        this.checkOnlyParseEl = checkOnlyParseEl;\n    }\n    \n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/check/impl/FlowNodeLinkChecker.java",
    "content": "package com.jd.easyflow.flow.ext.check.impl;\n\nimport java.util.List;\n\nimport com.jd.easyflow.flow.ext.check.CheckErrorItem;\nimport com.jd.easyflow.flow.ext.check.CheckParam;\nimport com.jd.easyflow.flow.ext.check.CheckResult;\nimport com.jd.easyflow.flow.ext.check.FlowChecker;\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.util.FlowNodeLinkUtil;\n\n/**\n * @author liyuliang5\n */\npublic class FlowNodeLinkChecker implements FlowChecker {\n\n    public static final String ERROR_TYPE_NODE_ISOLATED = \"NODE_ISOLATED\";\n    public static final String ERROR_TYPE_NEXT_NODES_NOT_EXISTS = \"NEXT_NODES_NOT_EXISTS\";\n    public static final String ERROR_TYPE_PRE_CHECK_NODES_NOT_EXISTS = \"PRE_CHECK_NODES_NOT_EXISTS\";\n    public static final String ERROR_TYPE_NON_START_NODE_NO_PREVIOUS = \"NON_START_NODE_NO_PREVIOUS\";\n    public static final String ERROR_TYPE_NON_END_NODE_NO_NEXT = \"NON_END_NODE_NO_NEXT\";\n    \n    public CheckResult check(CheckParam param) {\n        Flow flow = param.getFlow();\n        FlowNodeLinkCheckConfig config = (FlowNodeLinkCheckConfig) param.getConfig();\n        CheckResult result = new CheckResult();\n        if (flow.getNodeList() == null) {\n            return result;\n        }\n        for (FlowNode node : flow.getNodeList()) {\n            List<String> previousNodeIds = FlowNodeLinkUtil.getPreviousNodeIds(node, flow);\n            List<String> nextNodeIds = FlowNodeLinkUtil.getNextNodes(node, flow);\n            List<String> preCheckNodeIds = FlowNodeLinkUtil.getPreCheckNodes(node, flow);\n            // node isolated.\n            if (config.isCheckNodeIsolated()) {\n                if (previousNodeIds.size() == 0 && nextNodeIds.size() == 0 && flow.getNodeList().size() > 1) {\n                    result.addErrorItem(new CheckErrorItem(ERROR_TYPE_NODE_ISOLATED, null, flow.getId(), node.getId(), flow));\n                }\n            }\n            // next nodes none exists.\n            if (config.isCheckNextNodesNotExists()) {\n                if (nextNodeIds.size() > 0) {\n                    for (String nodeId : nextNodeIds) {\n                        if (!nodeId.equals(FlowNodeLinkUtil.NODE_ID_UNKNOWN) && flow.getNode(nodeId) == null) {\n                            result.addErrorItem(new CheckErrorItem(ERROR_TYPE_NEXT_NODES_NOT_EXISTS, null, flow.getId(), node.getId(), flow));\n                        }\n                    }\n                }\n            }\n            // pre check nodes none exists.\n            if (config.isCheckPreCheckNodesNotExists()) {\n                if (preCheckNodeIds.size() > 0) {\n                    for (String nodeId : preCheckNodeIds) {\n                        if (!nodeId.equals(FlowNodeLinkUtil.NODE_ID_UNKNOWN) && flow.getNode(nodeId) == null) {\n                            result.addErrorItem(new CheckErrorItem(ERROR_TYPE_PRE_CHECK_NODES_NOT_EXISTS, null, flow.getId(), node.getId(), flow));\n                        }\n                    }\n                }\n            }\n            // non-start node has no previous.\n            if (config.isCheckNonStartNodeNoPrevious()) {\n                if (previousNodeIds.size() == 0 && !arrayContains(flow.getStartNodeIds(), node.getId())) {\n                    result.addErrorItem(new CheckErrorItem(ERROR_TYPE_NON_START_NODE_NO_PREVIOUS, null, flow.getId(), node.getId(), flow));\n                }\n            }\n            // non-end node has no next.\n            if (config.isCheckNonEndNodeNoNext()) {\n                if (nextNodeIds.size() == 0 && ! Boolean.TRUE.equals(node.getProperty(\"end\"))) {\n                    result.addErrorItem(new CheckErrorItem(ERROR_TYPE_NON_END_NODE_NO_NEXT, null, flow.getId(), node.getId(), flow));\n                }\n            }\n        }\n        return result;\n    }\n\n    private static boolean arrayContains(String[] array, String element) {\n        if (array == null) {\n            return false;\n        }\n        for (String e : array) {\n            if (element.equals(e)) {\n                return true;\n            }\n        }\n        return false;\n    }\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/check/impl/InfiniteLoopCheckFlowParseListener.java",
    "content": "package com.jd.easyflow.flow.ext.check.impl;\n\nimport java.util.Set;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.exception.FlowException;\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.parser.event.FlowParseEvent;\nimport com.jd.easyflow.flow.model.parser.event.FlowParseEventListener;\nimport com.jd.easyflow.flow.model.parser.event.FlowParseEventTypes;\nimport com.jd.easyflow.flow.util.FlowNodeLinkUtil;\n\n/**\n * @author liyuliang5\n */\npublic class InfiniteLoopCheckFlowParseListener implements FlowParseEventListener {\n\n    private static final Logger logger = LoggerFactory.getLogger(InfiniteLoopCheckFlowParseListener.class);\n    \n    private Set<String> flowWhitelist;\n\n\n    @Override\n    public void on(FlowParseEvent event) {\n        switch (event.getType()) {\n        case FlowParseEventTypes.INIT_FLOW_END: {\n            if (logger.isDebugEnabled()) {\n                logger.debug(\"Start flow infinite loop check, flow ID:\" + event.getFlow().getId());\n            }\n            if (flowWhitelist != null && flowWhitelist.contains(event.getFlow().getId())) {\n                return;\n            }\n            Flow flow = event.getFlow();\n            for (FlowNode node : flow.getNodeList()) {\n                boolean infiniteLoop = FlowNodeLinkUtil.isReachable(node.getId(), node.getId(), flow);\n                if (infiniteLoop) {\n                    throw new FlowException(\"flow:\" + flow.getId() + \" node:\" + node.getId() + \" is infinite loop node!\");\n                }\n            }\n        }\n\n        }\n    }\n\n\n    public Set<String> getFlowWhitelist() {\n        return flowWhitelist;\n    }\n\n\n    public void setFlowWhitelist(Set<String> flowWhitelist) {\n        this.flowWhitelist = flowWhitelist;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/check/impl/SubFlowCheckFlowParseListener.java",
    "content": "package com.jd.easyflow.flow.ext.check.impl;\n\nimport java.util.Map;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.exception.FlowException;\nimport com.jd.easyflow.flow.filter.Filter;\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.action.EventNodeAction;\nimport com.jd.easyflow.flow.model.action.FlowNodeAction;\nimport com.jd.easyflow.flow.model.action.compensate.CompensateNodeFilter;\nimport com.jd.easyflow.flow.model.node.NodeImpl;\nimport com.jd.easyflow.flow.model.parser.event.FlowParseEvent;\nimport com.jd.easyflow.flow.model.parser.event.FlowParseEventListener;\nimport com.jd.easyflow.flow.model.parser.event.FlowParseEventTypes;\nimport com.jd.easyflow.flow.model.pre.InclusiveCheckPreHandler;\nimport com.jd.easyflow.flow.util.FlowConstants;\n\n/**\n * @author liyuliang5\n */\npublic class SubFlowCheckFlowParseListener implements FlowParseEventListener {\n\n    private static final Logger logger = LoggerFactory.getLogger(SubFlowCheckFlowParseListener.class);\n\n    @Override\n    public void on(FlowParseEvent event) {\n        switch (event.getType()) {\n        case FlowParseEventTypes.INIT_FLOW_END: {\n            if (logger.isDebugEnabled()) {\n                logger.debug(\"Start flow check, flow ID:\" + event.getFlow().getId());\n            }\n            Flow flow = event.getFlow();\n            boolean containsInheritFlowNodeAction = false;\n            boolean containsInclusiveCheckPreHandler = false;\n            boolean containsCompensateNodeFilter = false;\n            if (flow.getNodeList() != null) {\n                for (FlowNode node : flow.getNodeList()) {\n                    if (node instanceof NodeImpl) {\n                        NodeImpl nodeImpl = (NodeImpl) node;\n                        if (nodeImpl.getPreHandler() instanceof InclusiveCheckPreHandler) {\n                            containsInclusiveCheckPreHandler = true;\n                        }\n                        NodeAction nodeAction = nodeImpl.getAction();\n                        if (nodeAction instanceof FlowNodeAction) {\n                            FlowNodeAction flowNodeAction = (FlowNodeAction) nodeAction;\n                            if (flowNodeAction.isInherit()) {\n                                containsInheritFlowNodeAction = true;\n                            }\n                        } else if (nodeAction instanceof EventNodeAction) {\n                            // event node action\n                            Map<String, NodeAction> eventActionMap = node\n                                    .getProperty(FlowConstants.PROP_RUNTIME_EVENT_NODE_ACTION_MAP);\n                            if (eventActionMap != null) {\n                                for (NodeAction subNodeAction : eventActionMap.values()) {\n                                    if (subNodeAction instanceof FlowNodeAction) {\n                                        FlowNodeAction flowNodeAction = (FlowNodeAction) subNodeAction;\n                                        if (flowNodeAction.isInherit()) {\n                                            containsInheritFlowNodeAction = true;\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n            if (flow.getFilterManager().getNodeFilters() != null) {\n                for (Filter filter : flow.getFilterManager().getNodeFilters()) {\n                    if (filter instanceof CompensateNodeFilter) {\n                        containsCompensateNodeFilter = true;\n                    }\n                }\n            }\n            if (containsInheritFlowNodeAction) {\n                if (containsInclusiveCheckPreHandler) {\n                    throw new FlowException(\"FlowNodeAction with inherit conflict with InclusiveCheckPreHandler, set inherit to false\");\n                }\n                if (containsCompensateNodeFilter) {\n                    throw new FlowException(\"FlowNodeAction with inherit conflict with CompensateNodeFilter, set inherit to false\");\n                }\n            }\n        }\n        }\n\n    }\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/funcall/FunCallConstants.java",
    "content": "package com.jd.easyflow.flow.ext.funcall;\n\n/**\n * Function call constants.\n * @author liyuliang5\n *\n */\npublic class FunCallConstants {\n    \n    public static final String CTX_NODE_ACTION_DATA_MAP = \"ext.funcall.nodeActionInfoMap\";\n    \n    public static final String RESULT_SCOPE_ACTION = \"action\";\n    public static final String RESULT_SCOPE_NODE = \"node\";\n    public static final String RESULT_SCOPE_FLOW = \"flow\";\n    \n\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/funcall/FunCallEventListener.java",
    "content": "package com.jd.easyflow.flow.ext.funcall;\n\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.event.BaseFlowEventListener;\nimport com.jd.easyflow.flow.engine.event.FlowEvent;\nimport com.jd.easyflow.flow.engine.event.FlowEventListener;\nimport com.jd.easyflow.flow.util.FlowEventTypes;\nimport com.jd.easyflow.flow.util.Pair;\n\n/**\n * Function call event listener.\n * \n * @author liyuliang5\n *\n */\npublic class FunCallEventListener extends BaseFlowEventListener {\n\n    private static final Pair<String, Integer>[] DEFAULT_ACCEPTED_EVENTS = new Pair[] { Pair.of(FlowEventTypes.FLOW_START, 0),\n            Pair.of(FlowEventTypes.FLOW_END, 0), Pair.of(FlowEventTypes.FLOW_COMPLETE, 0) };\n\n    private List<Map<String, Object>> paramList;\n\n    private List<Map<String, Object>> resultList;\n\n    public FunCallEventListener(Map<String, Object> conf) {\n        paramList = (List<Map<String, Object>>) conf.get(\"param\");\n        resultList = (List<Map<String, Object>>) conf.get(\"result\");\n        this.acceptedEvents = DEFAULT_ACCEPTED_EVENTS;\n    }\n\n\n\n    @Override\n    public void on(FlowEvent flowEvent) {\n        FlowContext context = flowEvent.getContext();\n        switch (flowEvent.getType()) {\n        case FlowEventTypes.FLOW_START: {\n            Map<String, Object> nodeActionDataMap = context.get(FunCallConstants.CTX_NODE_ACTION_DATA_MAP);\n            if (nodeActionDataMap == null) {\n                nodeActionDataMap = new ConcurrentHashMap<>();\n                context.put(FunCallConstants.CTX_NODE_ACTION_DATA_MAP, nodeActionDataMap);\n            }\n\n            if (paramList != null) {\n                Map<String, Object> paramMap = new HashMap<>();\n                for (Map<String, Object> param : paramList) {\n                    String key = (String) param.get(\"key\");\n                    String valueExp = (String) param.get(\"value\");\n                    Object value = context.getElEvaluator().eval(valueExp, null, context, null);\n                    paramMap.put(key, value);\n                }\n                context.getParam().setParam(paramMap);\n            }\n            break;\n        }\n        case FlowEventTypes.FLOW_END: {\n            if (resultList != null) {\n                Map<String, Object> outputMap = new HashMap<>();\n                Map<String, Object> contextMap = new HashMap<>();\n                contextMap.put(\"node\", context.get(FunCallConstants.CTX_NODE_ACTION_DATA_MAP));\n                for (Map<String, Object> result : resultList) {\n                    String key = (String) result.get(\"key\");\n                    String valueExp = (String) result.get(\"value\");\n                    Object value = context.getElEvaluator().eval(valueExp, null, context, contextMap);\n                    outputMap.put(key, value);\n                }\n                context.getResult().setResult(outputMap);\n            }\n            break;\n        }\n        case FlowEventTypes.FLOW_COMPLETE: {\n            break;\n        }\n\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/funcall/FunCallFlowPostHandler.java",
    "content": "package com.jd.easyflow.flow.ext.funcall;\n\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport com.jd.easyflow.flow.el.ElFactory;\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.FlowPostHandler;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FunCallFlowPostHandler implements FlowPostHandler {\n\n    private List<Map<String, Object>> resultList;\n\n    public FunCallFlowPostHandler(Map<String, Object> conf) {\n        resultList = (List<Map<String, Object>>) conf.get(\"result\");\n    }\n\n    @Override\n    public void postHandle(FlowContext context) {\n        if (resultList != null) {\n            Map<String, Object> outputMap = new HashMap<>();\n            Map<String, Object> contextMap = new HashMap<>();\n            contextMap.put(\"node\", context.get(FunCallConstants.CTX_NODE_ACTION_DATA_MAP));\n            for (Map<String, Object> result : resultList) {\n                String key = (String) result.get(\"key\");\n                String valueExp = (String) result.get(\"value\");\n                Object value = context.getElEvaluator().eval(valueExp, null, context, contextMap);\n                outputMap.put(key, value);\n            }\n            context.getResult().setResult(outputMap);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/funcall/FunCallFlowPreHandler.java",
    "content": "package com.jd.easyflow.flow.ext.funcall;\n\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.FlowPreHandler;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FunCallFlowPreHandler implements FlowPreHandler {\n\n    private List<Map<String, Object>> paramList;\n\n    public FunCallFlowPreHandler(Map<String, Object> conf) {\n        paramList = (List<Map<String, Object>>) conf.get(\"param\");\n    }\n\n    @Override\n    public boolean preHandle(FlowContext context) {\n        Map<String, Object> nodeActionDataMap = context.get(FunCallConstants.CTX_NODE_ACTION_DATA_MAP);\n        if (nodeActionDataMap == null) {\n            nodeActionDataMap = new ConcurrentHashMap<>();\n            context.put(FunCallConstants.CTX_NODE_ACTION_DATA_MAP, nodeActionDataMap);\n        }\n\n        if (paramList != null) {\n            Map<String, Object> paramMap = new HashMap<>();\n            for (Map<String, Object> param : paramList) {\n                String key = (String) param.get(\"key\");\n                String valueExp = (String) param.get(\"value\");\n                Object value = context.getElEvaluator().eval(valueExp, null, context, null);\n                paramMap.put(key, value);\n            }\n            context.getParam().setParam(paramMap);\n        }\n        return true;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/funcall/FunCallNodeAction.java",
    "content": "package com.jd.easyflow.flow.ext.funcall;\n\nimport java.lang.reflect.InvocationTargetException;\nimport java.lang.reflect.Method;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.BeansException;\nimport org.springframework.context.ApplicationContext;\nimport org.springframework.context.ApplicationContextAware;\nimport org.springframework.util.ClassUtils;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.exception.FlowException;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.util.FlowStringUtil;\n\n/**\n * Function call node action.\n * \n * @author liyuliang5\n *\n */\npublic class FunCallNodeAction implements NodeAction, ApplicationContextAware {\n\n    private static final Logger logger = LoggerFactory.getLogger(FunCallNodeAction.class);\n\n    private Object instance;\n\n    private Method method;\n\n    private List<Map<String, Object>> paramList;\n\n    private List<Map<String, Object>> resultList;\n\n    private String nodeId;\n\n    private ApplicationContext applicationContext;\n\n    public void create(Map<String, Object> actionConf, FlowNode node) throws Exception {\n        FunCallNodeAction nodeAction = new FunCallNodeAction();\n        nodeAction.applicationContext = this.applicationContext;\n        nodeAction.init(actionConf, node);\n    }\n\n    public FunCallNodeAction() {\n        // NOOP\n    }\n\n    public FunCallNodeAction(Map<String, Object> actionConf, FlowNode node) throws Exception {\n        init(actionConf, node);\n    }\n\n    public void init(Map<String, Object> actionConf, FlowNode node) throws Exception {\n        paramList = (List<Map<String, Object>>) actionConf.get(\"param\");\n        resultList = (List<Map<String, Object>>) actionConf.get(\"result\");\n\n        String classMethod = (String) actionConf.get(\"classMethod\");\n        String methodName = null;\n        Class clazz = null;\n        if (FlowStringUtil.isNotEmpty(classMethod)) {\n            String[] info = classMethod.split(\"::\");\n            String clazzName = info[0];\n            methodName = info[1];\n            clazz = Class.forName(clazzName);\n            instance = clazz.newInstance();\n        }\n        if (instance == null) {\n            String beanMethod = (String) actionConf.get(\"beanMethod\");\n            if (FlowStringUtil.isEmpty(beanMethod)) {\n                String[] info = classMethod.split(\"::\");\n                methodName = info[1];\n                instance = applicationContext.getBean(methodName);\n                clazz = instance.getClass();\n            }\n        }\n\n        method = ClassUtils.getMethod(clazz, methodName, Map.class);\n        nodeId = node.getId();\n    }\n\n    @Override\n    public <T> T execute(NodeContext nodeContext, FlowContext context) {\n        Map<String, Object> inputMap = new HashMap<>();\n        Map<String, Object> nodeActionMap = context.get(FunCallConstants.CTX_NODE_ACTION_DATA_MAP);\n        if (paramList != null) {\n            for (Map<String, Object> param : paramList) {\n                String key = (String) param.get(\"key\");\n                String valueExp = (String) param.get(\"value\");\n                Map<String, Object> contextMap = new HashMap<>();\n                contextMap.put(\"node\", nodeActionMap);\n                String value = context.getElEvaluator().eval(valueExp, nodeContext, context, contextMap);\n                inputMap.put(key, value);\n            }\n        }\n\n        try {\n            if (context.isLogOn() && logger.isInfoEnabled()) {\n                logger.info(\"function input:\" + inputMap);\n            }\n            Map<String, Object> outputMap = (Map<String, Object>) method.invoke(instance, inputMap);\n            if (context.isLogOn() && logger.isInfoEnabled()) {\n                logger.info(\"function output:\" + outputMap);\n            }\n\n            Map<String, Object> resultMap = outputMap;\n            if (resultList != null) {\n                resultMap = new HashMap<>();\n                Map<String, Object> contextMap = new HashMap<>();\n                contextMap.put(\"node\", context.get(FunCallConstants.CTX_NODE_ACTION_DATA_MAP));\n                for (Map<String, Object> result : resultList) {\n                    String key = (String) result.get(\"key\");\n                    String valueExp = (String) result.get(\"value\");\n                    Object value = null;\n                    if (FlowStringUtil.isNotEmpty(valueExp)) {\n                        value = context.getElEvaluator().eval(valueExp, null, context, contextMap);\n                    } else {\n                        value = result.get(key);\n                    }\n                    String scope = (String) result.get(\"scope\");\n                    if (FunCallConstants.RESULT_SCOPE_NODE.equals(scope)) {\n                        nodeContext.put(key, value);\n                    } else if (FunCallConstants.RESULT_SCOPE_FLOW.equals(scope)) {\n                        context.put(key, value);\n                    } else {\n                        result.put(key, value);\n                    }\n                }\n            }\n            if (context.isLogOn() && logger.isInfoEnabled()) {\n                logger.info(\"function result:\" + resultMap);\n            }\n            Map<String, Object> info = new HashMap<>();\n            info.put(\"res\", outputMap);\n            nodeActionMap.put(nodeId, info);\n\n        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {\n            throw new FlowException(e);\n        }\n        return null;\n    }\n\n    @Override\n    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {\n        this.applicationContext = applicationContext;\n\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/interrupt/ExtInterruptNodeAction.java",
    "content": "package com.jd.easyflow.flow.ext.interrupt;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.filter.Filter;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.InitContext;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.action.InterruptNodeAction;\nimport com.jd.easyflow.flow.util.Triple;\n\n/**\n * @author liyuliang5\n */\npublic class ExtInterruptNodeAction extends InterruptNodeAction {\n\n    @Override\n    public void init(InitContext initContext, Object flowNode) {\n        initFlowFilter(initContext, flowNode);\n        initNodeFilter(initContext, flowNode);\n    }\n    \n    private void initFlowFilter(InitContext initContext, Object flowNode) {\n        List<Filter<FlowContext, FlowResult>> filters = initContext.getFlow().getFilterManager().getFilters();\n        boolean contains = false;\n        if (filters == null) {\n            filters = new ArrayList<>();\n            initContext.getFlow().getFilterManager().setFilters(filters);\n        }\n        for (Filter filter : filters) {\n            if (filter instanceof ExtNodeThreadInterruptFlowFilter) {\n                contains = true;\n                break;\n            }\n        }\n        if (!contains) {\n            filters.add(0, new ExtNodeThreadInterruptFlowFilter());\n            initContext.getFlow().getFilterManager().setFilters(filters);\n        }\n    }\n    \n    private void initNodeFilter(InitContext initContext, Object flowNode) {\n        List<Filter<Triple<FlowNode, NodeContext, FlowContext>, NodeContext>> filters = initContext.getFlow().getFilterManager().getNodeFilters();\n        boolean contains = false;\n        if (filters == null) {\n            filters = new ArrayList<>();\n            initContext.getFlow().getFilterManager().setNodeFilters(filters);\n        }\n        for (Filter filter : filters) {\n            if (filter instanceof ExtNodeThreadInterruptNodeFilter) {\n                contains = true;\n                break;\n            }\n        }\n        if (!contains) {\n            filters.add(0, new ExtNodeThreadInterruptNodeFilter());\n            initContext.getFlow().getFilterManager().setNodeFilters(filters);\n        }\n    }\n    \n\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/interrupt/ExtNodeThreadHolder.java",
    "content": "package com.jd.easyflow.flow.ext.interrupt;\n\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * @author liyuliang5\n */\nclass ExtNodeThreadHolder {\n\n    volatile Thread executionThread;\n    Object lock = new Object();\n    volatile boolean complete = false;\n    volatile NodeContext nodeContext;\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/interrupt/ExtNodeThreadInterruptFlowFilter.java",
    "content": "package com.jd.easyflow.flow.ext.interrupt;\n\nimport java.util.Collections;\nimport java.util.HashSet;\nimport java.util.Set;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.filter.FilterChain;\nimport com.jd.easyflow.flow.model.filter.impl.BaseFlowFilter;\n\n/**\n * @author liyuliang5\n */\npublic class ExtNodeThreadInterruptFlowFilter extends BaseFlowFilter {\n    \n    private static final Logger logger = LoggerFactory.getLogger(ExtNodeThreadInterruptFlowFilter.class);\n    \n    public ExtNodeThreadInterruptFlowFilter() {}\n    \n    public ExtNodeThreadInterruptFlowFilter(int order) {\n        this.order = order;\n    }\n\n    @Override\n    public FlowResult doFilter(FlowContext request, FilterChain<FlowContext, FlowResult> chain) {\n        Set<ExtNodeThreadHolder> holderSet = Collections.synchronizedSet(new HashSet<>());\n        request.put(ExtNodeThreadInterruptHelper.CTX_NODE_THREAD_HOLDER_SET, holderSet);\n        try {\n            return chain.doFilter(request);\n        } finally {\n            for (ExtNodeThreadHolder holder : holderSet) {\n                synchronized (holder.lock) {\n                    if (!holder.complete) {\n                        if (request.isLogOn() && logger.isInfoEnabled()) {\n                            logger.info(holder.nodeContext.getNodeId() + \" interrupted\");\n                        }\n                        holder.executionThread.interrupt();\n                    }\n                }\n            }\n            holderSet.clear();\n        }\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/interrupt/ExtNodeThreadInterruptHelper.java",
    "content": "package com.jd.easyflow.flow.ext.interrupt;\n\n/**\n * @author liyuliang5\n */\nclass ExtNodeThreadInterruptHelper {\n\n    static final String CTX_NODE_THREAD_HOLDER_SET = \"_nodeThreadHolderSet\";\n    static final String NODECTX_NODE_THREAD_HODLER = \"_nodeThreadHolder\";\n\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/interrupt/ExtNodeThreadInterruptNodeFilter.java",
    "content": "package com.jd.easyflow.flow.ext.interrupt;\n\nimport java.util.Set;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.filter.FilterChain;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.filter.impl.BaseNodeFilter;\nimport com.jd.easyflow.flow.util.Triple;\n\n/**\n * @author liyuliang5\n */\npublic class ExtNodeThreadInterruptNodeFilter extends BaseNodeFilter {\n    \n    public ExtNodeThreadInterruptNodeFilter() {}\n    \n    public ExtNodeThreadInterruptNodeFilter(int order) {\n        this.order = order;\n    }\n\n    @Override\n    public NodeContext doFilter(Triple<FlowNode, NodeContext, FlowContext> request,\n            FilterChain<Triple<FlowNode, NodeContext, FlowContext>, NodeContext> chain) {\n        ExtNodeThreadHolder holder = new ExtNodeThreadHolder();\n        holder.nodeContext = request.getMiddle();\n        holder.executionThread = Thread.currentThread();\n        Set<ExtNodeThreadHolder> set = request.getRight().get(ExtNodeThreadInterruptHelper.CTX_NODE_THREAD_HOLDER_SET);\n        set.add(holder);\n        try {\n            return chain.doFilter(request);\n        } finally {\n            synchronized (holder.lock) {\n                holder.complete = true;\n                Thread.interrupted();\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/model/action/JavaScriptNodeAction.java",
    "content": "package com.jd.easyflow.flow.ext.model.action;\n\nimport javax.script.Bindings;\nimport javax.script.ScriptEngine;\nimport javax.script.ScriptEngineManager;\nimport javax.script.ScriptException;\nimport javax.script.SimpleBindings;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.exception.FlowException;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.InitContext;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class JavaScriptNodeAction implements NodeAction {\n\n    private String javaScript;\n\n    @Override\n    public <T> T execute(NodeContext nodeContext, FlowContext context) {\n        ScriptEngineManager manager = new ScriptEngineManager();\n        ScriptEngine engine = manager.getEngineByName(\"JavaScript\");\n        Bindings bindings = new SimpleBindings();\n        bindings.put(\"flowContext\", context);\n        bindings.put(\"nodeContext\", nodeContext);\n        Object result;\n        try {\n            result = engine.eval(javaScript, bindings);\n        } catch (ScriptException e) {\n            throw new FlowException(e);\n        }\n        return (T) result;\n    }\n\n    @Override\n    public void init(InitContext initContext, Object node) {\n        javaScript = ((FlowNode) node).getProperty(\"javascript\");\n\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/model/action/ShellNodeAction.java",
    "content": "package com.jd.easyflow.flow.ext.model.action;\n\nimport java.io.IOException;\nimport java.util.List;\nimport java.util.concurrent.TimeUnit;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.exception.FlowException;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.InitContext;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.util.FlowIOUtil;\nimport com.jd.easyflow.flow.util.FlowStringUtil;\n\npublic class ShellNodeAction implements NodeAction {\n    \n    private static final Logger logger = LoggerFactory.getLogger(ShellNodeAction.class);\n    \n    private List<String> shellCommand;\n    \n    private String shellCommandExp;\n    \n    private Integer timeoutSeconds;\n\n    @Override\n    public String execute(NodeContext nodeContext, FlowContext context) {\n        List<String> command = null;\n        if (FlowStringUtil.isNotEmpty(shellCommandExp)) {\n            command = context.getElEvaluator().eval(shellCommandExp, nodeContext, context, null);\n        } else {\n            command = shellCommand;\n        }\n        // execute shell\n        if (context.isLogOn() && logger.isInfoEnabled()) {\n            logger.info(\"Shell command is:\" + command);\n        }\n        \n        String result;\n        try {\n            Process process = Runtime.getRuntime().exec(command.toArray(new String[] {}));\n            // wait for result\n            process.waitFor(timeoutSeconds, TimeUnit.SECONDS);\n            result = FlowIOUtil.toString(process.getInputStream());\n        } catch (IOException e) {\n            throw new FlowException(e);\n        } catch (InterruptedException e) {\n            throw new FlowException(e);\n        }\n        logger.info(\"shell result:\" + result);\n        return result;\n    }\n    \n    @Override\n    public void init(InitContext initContext, Object parent) {\n        FlowNode node = (FlowNode) parent;\n        shellCommand = node.getProperty(\"shellCommand\");\n        shellCommandExp = node.getProperty(\"shellCommandExp\");\n        timeoutSeconds = node.getProperty(\"shellTimeoutSeconds\");\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/serialize/FlowParamAssembleData.java",
    "content": "package com.jd.easyflow.flow.ext.serialize;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * @author liyuliang5\n */\npublic class FlowParamAssembleData {\n\n    private FlowContext flowContext;\n    \n    private NodeContext nodeContext;\n\n    public FlowContext getFlowContext() {\n        return flowContext;\n    }\n\n    public void setFlowContext(FlowContext flowContext) {\n        this.flowContext = flowContext;\n    }\n\n    public NodeContext getNodeContext() {\n        return nodeContext;\n    }\n\n    public void setNodeContext(NodeContext nodeContext) {\n        this.nodeContext = nodeContext;\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/serialize/FlowParamAssembleManager.java",
    "content": "package com.jd.easyflow.flow.ext.serialize;\n\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.util.ExceptionUtil;\n\n/**\n * @author liyuliang5\n */\npublic class FlowParamAssembleManager {\n    \n    private static final FlowParamAssembleManager INSTANCE  = new FlowParamAssembleManager();\n    \n    public static FlowParamAssembleManager getInstance() {\n        return INSTANCE;\n    }\n    \n    private Map<String, FlowParamAssembler> assemblerMap = new ConcurrentHashMap<String, FlowParamAssembler>();\n    \n    public FlowParamAssembler getAssembler(String className) {\n        return assemblerMap.computeIfAbsent(className, key -> {\n            try {\n                return (FlowParamAssembler) Class.forName(className).newInstance();\n            } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {\n                throw ExceptionUtil.throwException(e);\n            }\n        });\n    }\n\n    public FlowParam assemble(String assemblerClass, FlowParamAssembleData assembleData, Map<String, Object> assembleConfig) {\n        FlowParamAssembler assembler = getAssembler(assemblerClass);\n        FlowParam flowParam = assembler.assemble(assembleData, assembleConfig);\n        return flowParam;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/serialize/FlowParamAssembler.java",
    "content": "package com.jd.easyflow.flow.ext.serialize;\n\nimport java.util.Map;\n\nimport com.jd.easyflow.flow.engine.FlowParam;\n\npublic interface FlowParamAssembler {\n    \n    public FlowParam assemble(FlowParamAssembleData data, Map<String, Object> assembleConfig);\n\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/serialize/FlowParamSerializeManager.java",
    "content": "package com.jd.easyflow.flow.ext.serialize;\n\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.util.ExceptionUtil;\n\n/**\n * @author liyuliang5\n */\npublic class FlowParamSerializeManager {\n\n\n    private static FlowParamSerializeManager INSTANCE = new FlowParamSerializeManager();\n    \n    private Map<String, FlowParamSerializer> serializerMap = new ConcurrentHashMap<>();\n\n    public static FlowParamSerializeManager getInstance() {\n        return INSTANCE;\n    }\n    \n    public FlowParamSerializer getSerializer(String className) {\n        return serializerMap.computeIfAbsent(className, key -> {\n            try {\n                return (FlowParamSerializer) Class.forName(className).newInstance();\n            } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {\n                throw ExceptionUtil.throwException(e);\n            }\n        });\n    }\n    \n    public String serialize(String className, FlowParam param, Map<String, Object> config) {\n        FlowParamSerializer serializer = getSerializer(className);\n        String s = serializer.serialize(param, config);\n        return s;\n    }\n    \n    public FlowParam deserialize(String className, String s, Map<String, Object> config) {\n        FlowParamSerializer serializer = getSerializer(className);\n        FlowParam param = serializer.deserialize(s, config);\n        return param;\n    }\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/serialize/FlowParamSerializer.java",
    "content": "package com.jd.easyflow.flow.ext.serialize;\n\nimport java.util.Map;\n\nimport com.jd.easyflow.flow.engine.FlowParam;\n\n/**\n * @author liyuliang5\n */\npublic interface FlowParamSerializer {\n\n    public String serialize(FlowParam flowParam, Map<String, Object> config);\n    \n    public FlowParam deserialize(String s, Map<String, Object> config);\n    \n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/serialize/impl/BaseFlowParamSerializer.java",
    "content": "package com.jd.easyflow.flow.ext.serialize.impl;\n\nimport java.util.Map;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.ext.serialize.FlowParamSerializer;\nimport com.jd.easyflow.flow.util.ExceptionUtil;\n\n/**\n * @author liyuliang5\n */\npublic abstract class BaseFlowParamSerializer implements FlowParamSerializer {\n    \n    protected FlowParam createFlowParamToSerialize(FlowParam flowParam, Map<String, Object> config) {\n        try {\n            FlowParam newFlowParam = flowParam.getClass().newInstance();\n            newFlowParam.setFlowId(flowParam.getFlowId());\n            newFlowParam.setLogFlag(flowParam.getLogFlag());\n            newFlowParam.setNodeIds(flowParam.getNodeIds());\n            newFlowParam.setParam(flowParam.getParam());\n            newFlowParam.setDataMapFrom(flowParam);\n\n            if (flowParam.getContext() != null) {\n                FlowContext flowContext = flowParam.getContext();\n                FlowContext newFlowContext;\n\n                newFlowContext = flowContext.getClass().newInstance();\n\n                newFlowContext.setContext(flowContext.getContext());\n                newFlowContext.getData().putAll(flowContext.getData());\n                newFlowContext.setLogFlag(flowContext.getLogFlag());\n                newFlowParam.setContext(newFlowContext);\n            }\n            return newFlowParam;\n        } catch (InstantiationException | IllegalAccessException e) {\n            throw ExceptionUtil.throwException(e);\n        }\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/serialize/impl/DefaultFlowParamAssembler.java",
    "content": "package com.jd.easyflow.flow.ext.serialize.impl;\n\nimport java.util.Map;\n\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.ext.serialize.FlowParamAssembleData;\nimport com.jd.easyflow.flow.ext.serialize.FlowParamAssembler;\nimport com.jd.easyflow.flow.util.ExceptionUtil;\n\n/**\n * @author liyuliang5\n */\npublic class DefaultFlowParamAssembler implements FlowParamAssembler {\n\n    @Override\n    public FlowParam assemble(FlowParamAssembleData data, Map<String, Object> assembleConfig) {\n        try {\n            FlowParam flowParam = data.getFlowContext().getParam();\n            FlowParam newFlowParam = flowParam.getClass().newInstance();\n            newFlowParam.setFlowId(flowParam.getFlowId());\n            newFlowParam.setLogFlag(flowParam.getLogFlag());\n            newFlowParam.setParam(flowParam.getParam());\n            newFlowParam.setDataMapFrom(flowParam);\n\n            if (data.getNodeContext() != null) {\n                newFlowParam.setNodeId(data.getNodeContext().getNodeId());\n            } else {\n                newFlowParam.setNodeIds(flowParam.getNodeIds());\n            }\n            // TODO add flowContext\n            return newFlowParam;\n        } catch (Exception e) {\n            throw ExceptionUtil.throwException(e);\n        }\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/serialize/impl/JavaFlowParamSerializer.java",
    "content": "package com.jd.easyflow.flow.ext.serialize.impl;\n\nimport java.io.ByteArrayInputStream;\nimport java.io.ByteArrayOutputStream;\nimport java.io.IOException;\nimport java.io.ObjectInputStream;\nimport java.io.ObjectOutputStream;\nimport java.util.Base64;\nimport java.util.Map;\n\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.util.ExceptionUtil;\n\n/**\n * @author liyuliang5\n */\npublic class JavaFlowParamSerializer extends BaseFlowParamSerializer {\n\n    @Override\n    public String serialize(FlowParam flowParam, Map<String, Object> config) {\n        try {\n            FlowParam newFlowParam = super.createFlowParamToSerialize(flowParam, config);\n            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();\n            ObjectOutputStream stream = new ObjectOutputStream(byteArrayOutputStream);\n            stream.writeObject(newFlowParam);\n            String result = Base64.getEncoder().encodeToString(byteArrayOutputStream.toByteArray());\n            return result;\n        } catch (IOException e) {\n            throw ExceptionUtil.throwException(e);\n        }\n    }\n\n    @Override\n    public FlowParam deserialize(String s, Map<String, Object> config) {\n        try {\n            ObjectInputStream stream = new ObjectInputStream(new ByteArrayInputStream(Base64.getDecoder().decode(s)));\n            FlowParam flowParam = (FlowParam) stream.readObject();\n            return flowParam;\n        } catch (Exception e) {\n            throw ExceptionUtil.throwException(e);\n        }\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/serialize/impl/JsonFlowParamSerializer.java",
    "content": "package com.jd.easyflow.flow.ext.serialize.impl;\n\nimport java.util.Map;\n\nimport com.fasterxml.jackson.annotation.JsonAutoDetect;\nimport com.fasterxml.jackson.annotation.JsonTypeInfo;\nimport com.fasterxml.jackson.annotation.PropertyAccessor;\nimport com.fasterxml.jackson.core.JsonProcessingException;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.util.ExceptionUtil;\n\n/**\n * @author liyuliang5\n */\npublic class JsonFlowParamSerializer extends BaseFlowParamSerializer {\n    \n    private ObjectMapper mapper;\n    {\n        mapper = new ObjectMapper();\n        mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL,\n                JsonTypeInfo.As.PROPERTY);\n        mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);\n    }\n\n    @Override\n    public String serialize(FlowParam flowParam, Map<String, Object> config) {\n        FlowParam param = super.createFlowParamToSerialize(flowParam, config);\n        try {\n            String s = mapper.writeValueAsString(param);\n            return s;\n        } catch (JsonProcessingException e) {\n            throw ExceptionUtil.throwException(e);\n        }\n    }\n    \n    @Override\n    public FlowParam deserialize(String s, Map<String, Object> config) {\n        try {\n            FlowParam param = mapper.readValue(s, FlowParam.class);\n            return param;\n        } catch (JsonProcessingException e) {\n            throw ExceptionUtil.throwException(e);\n        }\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/session/FlowSession.java",
    "content": "package com.jd.easyflow.flow.ext.session;\n\n/**\n * Session that cross flow.\n * \n * @author liyuliang5\n *\n */\npublic interface FlowSession {\n    \n    String getId();\n\n    void put(String key, Object value);\n\n    <T> T get(String key);\n    \n    Object remove(String key);\n\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/session/FlowSessionConstants.java",
    "content": "package com.jd.easyflow.flow.ext.session;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FlowSessionConstants {\n\n    public static final String CONTEXT_SESSION_KEY = \"_SESSION\";\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/session/FlowSessionImpl.java",
    "content": "package com.jd.easyflow.flow.ext.session;\n\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.atomic.AtomicLong;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FlowSessionImpl implements FlowSession {\n\n    private static AtomicLong idStart = new AtomicLong(System.currentTimeMillis());\n\n    private String id;\n\n    private Map<String, Object> data = new ConcurrentHashMap<>();\n\n    public FlowSessionImpl() {\n        id = idStart.getAndIncrement() + \"\";\n    }\n\n    @Override\n    public void put(String key, Object value) {\n        if (value == null) {\n            data.remove(key);\n        } else {\n            data.put(key, value);\n        }\n    }\n\n    @Override\n    public <T> T get(String key) {\n        return (T) data.get(key);\n    }\n\n    public Object remove(String key) {\n        return data.remove(key);\n    }\n\n    public String getId() {\n        return id;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/session/SessionMultiCheckPreHandler.java",
    "content": "package com.jd.easyflow.flow.ext.session;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.exception.FlowException;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.NodePreHandler;\nimport com.jd.easyflow.flow.util.FlowConstants;\n\n/**\n * Session level multiple nodes check pre-handler.\n * \n * @author liyuliang5\n *\n */\npublic class SessionMultiCheckPreHandler implements NodePreHandler {\n\n    private static final Logger logger = LoggerFactory.getLogger(SessionMultiCheckPreHandler.class);\n\n    private List<String> preNodes;\n\n    public SessionMultiCheckPreHandler() {\n\n    }\n\n    public SessionMultiCheckPreHandler(List<String> preNodes) {\n        this.preNodes = preNodes;\n    }\n\n    /**\n     * Judge all pre nodes finished.\n     * \n     */\n    @Override\n    public boolean preHandle(NodeContext nodeContext, final FlowContext context) {\n        if (nodeContext.getPreviousNode() == null) {\n            return false;\n        }\n        Boolean checkResult = nodeContext.get(FlowConstants.NODECTX_PRE_RESULT);\n        if (checkResult != null) {\n            if (context.isLogOn() && logger.isInfoEnabled()) {\n                logger.info(\"Pre result checked:\" + checkResult);\n            }\n            return checkResult;\n        }\n        final Object lockObj;\n        final FlowSession session = context.get(FlowSessionConstants.CONTEXT_SESSION_KEY);\n        synchronized (session) {\n            Object sessionLockObj = session.get(FlowConstants.CTX_LOCK_PREFIX + nodeContext.getNodeId());\n            if (sessionLockObj == null) {\n                sessionLockObj = new Object();\n                session.put(FlowConstants.CTX_LOCK_PREFIX + nodeContext.getNodeId(), sessionLockObj);\n            }\n            lockObj = sessionLockObj;\n        }\n        synchronized (lockObj) {\n            List<String> preNodes = session.get(FlowConstants.CTX_PRE_NODES_PREFIX + nodeContext.getNodeId());\n            if (preNodes == null) {\n                preNodes = new ArrayList<String>();\n                session.put(FlowConstants.CTX_PRE_NODES_PREFIX + nodeContext.getNodeId(), preNodes);\n            }\n            preNodes.add(nodeContext.getPreviousNode().getNodeId());\n\n            FlowNode currentNode = context.getFlow().getNode(nodeContext.getNodeId());\n            List<String> configPreNodes = this.preNodes != null ? this.preNodes\n                    : currentNode.getProperty(FlowConstants.PROP_PRENODES);\n            if (context.isLogOn() && logger.isInfoEnabled()) {\n                logger.info(\"Pre nodes executed:\" + preNodes);\n            }\n            if (preNodes.size() != configPreNodes.size()) {\n                return false;\n            }\n            for (String s : configPreNodes) {\n                if (!preNodes.contains(s)) {\n                    throw new FlowException(\n                            \"node info inconsistent, config:\" + configPreNodes + \", runtime:\" + preNodes);\n                }\n            }\n            if (context.isLogOn() && logger.isInfoEnabled()) {\n                logger.info(\"All pre nodes finished\");\n            }\n            session.remove(FlowConstants.CTX_PRE_NODES_PREFIX + nodeContext.getNodeId());\n            return true;\n\n        }\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/timeout/TimeoutFlowFilter.java",
    "content": "package com.jd.easyflow.flow.ext.timeout;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.Executors;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.exception.FlowException;\nimport com.jd.easyflow.flow.filter.BaseFilter;\nimport com.jd.easyflow.flow.filter.FilterChain;\nimport com.jd.easyflow.flow.model.InitContext;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * @author liyuliang5\n */\npublic class TimeoutFlowFilter extends BaseFilter<FlowContext, FlowResult> {\n    \n\n    private static final Logger logger = LoggerFactory.getLogger(TimeoutFlowFilter.class);\n\n    protected ExecutorService defaultExecutorService;\n    \n    protected Map<String, ExecutorService> executorServiceMap = new ConcurrentHashMap<String, ExecutorService>();\n\n    private TimeoutTemplate timeoutTemplate = new TimeoutTemplate();\n\n    public TimeoutFlowFilter() {\n\n    }\n\n    public TimeoutFlowFilter(ExecutorService defaultExecutorService) {\n        this.defaultExecutorService = defaultExecutorService;\n    }\n\n    @Override\n    public void init(InitContext initContext, Object parent) {\n        if (this.defaultExecutorService == null) {\n            this.defaultExecutorService = Executors.newCachedThreadPool();\n        }\n    }\n\n    @Override\n    public FlowResult doFilter(FlowContext context,\n            FilterChain<FlowContext, FlowResult> chain) {\n        Map<String, Object> timeoutConfig = context.getFlow().getProperty(\"timeout\");\n        boolean enableTimeout = timeoutConfig != null && !Boolean.FALSE.equals(timeoutConfig.get(\"enable\"));\n        if (!enableTimeout) {\n            // no timeout configuration.\n            return chain.doFilter(context);\n        } else {\n            // has timeout configuration.\n            String executorServiceKey = (String) timeoutConfig.get(\"executorServiceKey\");\n            Integer timeoutMillis = null;\n            String timeoutMillisExp = (String) timeoutConfig.get(\"timeoutMillisExp\");\n            if (timeoutMillisExp != null) {\n                timeoutMillis = (int) context.getElEvaluator().eval(timeoutMillisExp, null, context, timeoutConfig);\n            }\n            if (timeoutMillis == null) {\n                timeoutMillis = (Integer) timeoutConfig.get(\"timeoutMillis\");\n            }\n            if (timeoutMillis == null) {\n                throw new FlowException(\"timeoutMills can not be null, check config\");\n            }\n            boolean interruptOnTimeout = ! Boolean.FALSE.equals(timeoutConfig.get(\"interruptOnTimeout\"));\n            ExecutorService executorService = getExecutorService(executorServiceKey, null, context);\n            FlowResult result = timeoutTemplate.execute(() -> {\n                // normal method.\n                return chain.doFilter(context);\n            }, () -> {\n                // timeout method.\n                String onTimeoutExp = (String) timeoutConfig.get(\"onTimeoutExp\");\n                Map<String, Object> timeoutContext = new HashMap<String, Object>();\n                timeoutContext.put(\"timeoutConfig\", timeoutConfig);\n                Object evalResult = context.getElEvaluator().eval(onTimeoutExp, null, context, timeoutContext);\n                if (! (evalResult instanceof FlowResult)) {\n                    throw new FlowException(\"eval result should be FlowResult type\");\n                }\n                return (FlowResult) evalResult;\n            }, timeoutMillis, executorService, context.isLogOn(), interruptOnTimeout);\n\n            return result;\n        }\n\n    }\n\n    public ExecutorService getExecutorService(String executorServiceKey, NodeContext nodeContext, FlowContext flowContext) {\n        if (executorServiceKey == null) {\n            return defaultExecutorService;\n        }\n        ExecutorService executorService = executorServiceMap.computeIfAbsent(executorServiceKey, key -> {\n            return Executors.newCachedThreadPool();\n        });\n        return executorService;\n    }\n\n    public ExecutorService getDefaultExecutorService() {\n        return defaultExecutorService;\n    }\n\n    public void setDefaultExecutorService(ExecutorService defaultExecutorService) {\n        this.defaultExecutorService = defaultExecutorService;\n    }\n\n    public Map<String, ExecutorService> getExecutorServiceMap() {\n        return executorServiceMap;\n    }\n\n    public void setExecutorServiceMap(Map<String, ExecutorService> executorServiceMap) {\n        this.executorServiceMap = executorServiceMap;\n    }\n\n    public TimeoutTemplate getTimeoutTemplate() {\n        return timeoutTemplate;\n    }\n\n    public void setTimeoutTemplate(TimeoutTemplate timeoutTemplate) {\n        this.timeoutTemplate = timeoutTemplate;\n    }\n\n\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/timeout/TimeoutNodeActionFilter.java",
    "content": "package com.jd.easyflow.flow.ext.timeout;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.Executors;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.exception.FlowException;\nimport com.jd.easyflow.flow.filter.BaseFilter;\nimport com.jd.easyflow.flow.filter.FilterChain;\nimport com.jd.easyflow.flow.model.InitContext;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.util.FlowUtil;\nimport com.jd.easyflow.flow.util.Pair;\n\n/**\n * \n * @author liyuliang5\n */\npublic class TimeoutNodeActionFilter extends BaseFilter<Pair<NodeContext, FlowContext>, Object> {\n\n    private static final Logger logger = LoggerFactory.getLogger(TimeoutNodeActionFilter.class);\n\n    protected ExecutorService defaultExecutorService;\n    \n    protected Map<String, ExecutorService> executorServiceMap = new ConcurrentHashMap<String, ExecutorService>();\n    \n\n    private TimeoutTemplate timeoutTemplate = new TimeoutTemplate();\n\n    public TimeoutNodeActionFilter() {\n\n    }\n\n    public TimeoutNodeActionFilter(ExecutorService defaultExecutorService) {\n        this.defaultExecutorService = defaultExecutorService;\n    }\n\n    @Override\n    public void init(InitContext initContext, Object parent) {\n        if (this.defaultExecutorService == null) {\n            this.defaultExecutorService = Executors.newCachedThreadPool();\n        }\n    }\n\n    @Override\n    public Object doFilter(Pair<NodeContext, FlowContext> request,\n            FilterChain<Pair<NodeContext, FlowContext>, Object> chain) {\n        NodeContext nodeContext = request.getLeft();\n        FlowContext context = request.getRight();\n        Map<String, Object> timeoutConfig = FlowUtil.nodeProperty(\"timeout\", nodeContext, context);\n        boolean enableTimeout = timeoutConfig != null && !Boolean.FALSE.equals(timeoutConfig.get(\"enable\"));\n        if (!enableTimeout) {\n            // no timeout configuration.\n            return chain.doFilter(request);\n        } else {\n            // has timeout configuration.\n            String executorServiceKey = (String) timeoutConfig.get(\"executorServiceKey\");\n            Integer timeoutMillis = null;\n            String timeoutMillisExp = (String) timeoutConfig.get(\"timeoutMillisExp\");\n            if (timeoutMillisExp != null) {\n                timeoutMillis = (int) context.getElEvaluator().eval(timeoutMillisExp, nodeContext, context, timeoutConfig);\n            }\n            if (timeoutMillis == null) {\n                timeoutMillis = (Integer) timeoutConfig.get(\"timeoutMillis\");\n            }\n            if (timeoutMillis == null) {\n                throw new FlowException(\"timeoutMills can not be null, check config\");\n            }\n            boolean interruptOnTimeout = ! Boolean.FALSE.equals(timeoutConfig.get(\"interruptOnTimeout\"));\n            ExecutorService executorService = getExecutorService(executorServiceKey, nodeContext, context);\n            Object actionResult = timeoutTemplate.execute(() -> {\n                // normal method.\n                return chain.doFilter(request);\n            }, () -> {\n                // timeout method.\n                String onTimeoutExp = (String) timeoutConfig.get(\"onTimeoutExp\");\n                Map<String, Object> timeoutContext = new HashMap<String, Object>();\n                timeoutContext.put(\"timeoutConfig\", timeoutConfig);\n                return context.getElEvaluator().eval(onTimeoutExp, nodeContext, context, timeoutContext);\n            }, timeoutMillis, executorService, context.isLogOn(), interruptOnTimeout);\n\n            return actionResult;\n        }\n\n    }\n\n    public ExecutorService getExecutorService(String executorServiceKey, NodeContext nodeContext, FlowContext flowContext) {\n        if (executorServiceKey == null) {\n            return defaultExecutorService;\n        }\n        ExecutorService executorService = executorServiceMap.computeIfAbsent(executorServiceKey, key -> {\n            return Executors.newCachedThreadPool();\n        });\n        return executorService;\n    }\n\n    public ExecutorService getDefaultExecutorService() {\n        return defaultExecutorService;\n    }\n\n    public void setDefaultExecutorService(ExecutorService defaultExecutorService) {\n        this.defaultExecutorService = defaultExecutorService;\n    }\n\n    public Map<String, ExecutorService> getExecutorServiceMap() {\n        return executorServiceMap;\n    }\n\n    public void setExecutorServiceMap(Map<String, ExecutorService> executorServiceMap) {\n        this.executorServiceMap = executorServiceMap;\n    }\n\n    public TimeoutTemplate getTimeoutTemplate() {\n        return timeoutTemplate;\n    }\n\n    public void setTimeoutTemplate(TimeoutTemplate timeoutTemplate) {\n        this.timeoutTemplate = timeoutTemplate;\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/main/java/com/jd/easyflow/flow/ext/timeout/TimeoutTemplate.java",
    "content": "package com.jd.easyflow.flow.ext.timeout;\n\nimport java.util.concurrent.Callable;\nimport java.util.concurrent.ExecutionException;\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.Future;\nimport java.util.concurrent.TimeUnit;\nimport java.util.concurrent.TimeoutException;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.util.ExceptionUtil;\n\n/**\n * \n * @author liyuliang5\n */\npublic class TimeoutTemplate {\n    \n    private static final Logger logger = LoggerFactory.getLogger(TimeoutTemplate.class);\n    \n    private static final TimeoutTemplate INSTANCE = new TimeoutTemplate();\n    \n    public static TimeoutTemplate getInstance() {\n        return INSTANCE;\n    }\n    \n    public <T>T execute(Callable<T> callable, Callable<T> timeoutCallable, long timeoutMillis, ExecutorService executorService, boolean logOn) {\n        return execute(callable, timeoutCallable, timeoutMillis, executorService, logOn, true);\n    }\n    \n    public <T>T execute(Callable<T> callable, Callable<T> timeoutCallable, long timeoutMillis, ExecutorService executorService, boolean logOn, boolean interruptOnTimeout) {\n        ExecutionThreadHolder holder = new ExecutionThreadHolder();\n        Future<T> future = executorService.submit(() -> {\n            if (holder.timeout) {\n                if (logOn) {\n                    logger.warn(\"caller timeout, return\");\n                }\n                return null;\n            }\n            holder.executionThread = Thread.currentThread();\n            try {\n                T result = callable.call();\n                return result;\n            } finally {\n                if (interruptOnTimeout) {\n                    synchronized (holder.lock) {\n                        holder.complete = true;\n                        Thread.interrupted();\n                    }\n                }\n            }\n        });\n\n        T result = null;\n        try {\n            result = future.get(timeoutMillis, TimeUnit.MILLISECONDS);\n        } catch (TimeoutException e) {\n            if (logOn) {\n                logger.error(\"callable timeout!\");\n            }\n            holder.timeout = true;\n            if (interruptOnTimeout) {\n                synchronized (holder.lock) {\n                    if (!holder.complete && holder.executionThread != null) {\n                        holder.executionThread.interrupt();\n                    }\n                }\n            }\n            try {\n                result = timeoutCallable.call();\n            } catch (Exception e1) {\n                throw ExceptionUtil.throwException(e1);\n            }\n        } catch (ExecutionException e) {\n            if (logOn) {\n                logger.error(\"execution error!\");\n            }\n            throw ExceptionUtil.throwException(e.getCause());\n        } catch (InterruptedException e) {\n            if (logOn) {\n                logger.warn(\"thread interrupted!\");\n            }\n            throw ExceptionUtil.throwException(e);\n        }\n\n        return result;\n    }\n    \n    private static class ExecutionThreadHolder {\n        volatile Thread executionThread;\n        Object lock = new Object();\n        volatile boolean complete = false;\n        volatile boolean timeout = false;\n    }\n\n\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/test/java/com/jd/easyflow/flow/ext/FlowExtTestSuite.java",
    "content": "package com.jd.easyflow.flow.ext;\n\nimport org.junit.runner.RunWith;\nimport org.junit.runners.Suite;\nimport org.junit.runners.Suite.SuiteClasses;\n\nimport com.jd.easyflow.flow.ext.cases.chain.ChainTest;\nimport com.jd.easyflow.flow.ext.cases.check.FlowNodeLinkCheckTest;\nimport com.jd.easyflow.flow.ext.cases.check.InfiniteLoopCheckTest;\nimport com.jd.easyflow.flow.ext.cases.funcall.FunCallTest;\nimport com.jd.easyflow.flow.ext.cases.session.SessionFlowTest;\n\n/**\n * \n * @author liyuliang5\n *\n */\n@RunWith(Suite.class)\n@SuiteClasses ({\n    SessionFlowTest.class,\n    ChainTest.class,\n    FunCallTest.class,\n    FlowNodeLinkCheckTest.class,\n    InfiniteLoopCheckTest.class\n})\npublic class FlowExtTestSuite {\n\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/test/java/com/jd/easyflow/flow/ext/cases/chain/ChainTest.java",
    "content": "package com.jd.easyflow.flow.ext.cases.chain;\n\nimport static org.junit.Assert.assertEquals;\n\nimport java.util.function.Function;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\nimport com.jd.easyflow.flow.ext.chain.ChainInvoker;\n\npublic class ChainTest {\n    \n    private static final Logger logger = LoggerFactory.getLogger(ChainTest.class);\n\n    \n    @Test\n    public void testChain2() {\n        // Init flow engine.\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/chain/flow_chaintest2.json\");\n        flowEngine.init();\n        \n        ChainInvoker invoker = new ChainInvoker();\n        invoker.setFlowEngine(flowEngine);\n        \n        Function<Object, Object> targetAction = (o) -> {\n            return new ChainTestService().execute();\n        };\n        Object result = invoker.invoke(\"flow_chaintest2\", null, targetAction);\n        logger.info(\"Result:\" + result);\n        assertEquals(\"abc\", result);\n    }\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/test/java/com/jd/easyflow/flow/ext/cases/chain/ChainTestService.java",
    "content": "package com.jd.easyflow.flow.ext.cases.chain;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\npublic class ChainTestService {\n    \n    private static final Logger logger = LoggerFactory.getLogger(ChainTestService.class);\n\n    public Object execute() {\n        logger.info(\"ChainTestService execute\");\n        return \"abc\";\n    }\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/test/java/com/jd/easyflow/flow/ext/cases/chain/Filter1.java",
    "content": "package com.jd.easyflow.flow.ext.cases.chain;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.filter.Filter;\nimport com.jd.easyflow.flow.filter.FilterChain;\n\npublic class Filter1 implements Filter<FlowContext, FlowResult>{\n    \n    private static final Logger logger = LoggerFactory.getLogger(Filter1.class);\n\n    @Override\n    public FlowResult doFilter(FlowContext request, FilterChain<FlowContext, FlowResult> chain) {\n        logger.info(\"filter1 start\");\n        FlowResult result = chain.doFilter(request);\n        logger.info(\"filter1 end\");\n        return result;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/test/java/com/jd/easyflow/flow/ext/cases/chain/Filter2.java",
    "content": "package com.jd.easyflow.flow.ext.cases.chain;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.filter.Filter;\nimport com.jd.easyflow.flow.filter.FilterChain;\n\npublic class Filter2 implements Filter<FlowContext, FlowResult>{\n    \n    private static final Logger logger = LoggerFactory.getLogger(Filter2.class);\n\n    @Override\n    public FlowResult doFilter(FlowContext request, FilterChain<FlowContext, FlowResult> chain) {\n        logger.info(\"filter2 start\");\n        FlowResult result = chain.doFilter(request);\n        logger.info(\"filter2 end\");\n        return result;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/test/java/com/jd/easyflow/flow/ext/cases/chain/Filter3.java",
    "content": "package com.jd.easyflow.flow.ext.cases.chain;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.filter.Filter;\nimport com.jd.easyflow.flow.filter.FilterChain;\n\npublic class Filter3 implements Filter<FlowContext, FlowResult>{\n    \n    private static final Logger logger = LoggerFactory.getLogger(Filter3.class);\n\n    @Override\n    public FlowResult doFilter(FlowContext request, FilterChain<FlowContext, FlowResult> chain) {\n        logger.info(\"filter3 start\");\n        FlowResult result = chain.doFilter(request);\n        logger.info(\"filter3 end\");\n        return result;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/test/java/com/jd/easyflow/flow/ext/cases/chain/Plugin1.java",
    "content": "package com.jd.easyflow.flow.ext.cases.chain;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.ext.chain.BaseChainPlugin;\nimport com.jd.easyflow.flow.model.NodeContext;\n\npublic class Plugin1 extends BaseChainPlugin {\n    \n    private static final Logger logger = LoggerFactory.getLogger(Plugin1.class);\n    \n\n    @Override\n    public boolean preHandle(NodeContext nodeContext, FlowContext context) {\n        logger.info(\"Plugin1 pre handle\");\n        return true;\n    }\n\n    @Override\n    public void postHandleNormal(NodeContext nodeContext, FlowContext context) {\n        logger.info(\"Plugin1 post handle normal\");\n    }\n\n    @Override\n    public void postHandleException(Throwable t, NodeContext nodeContext, FlowContext context) {\n        logger.info(\"Plugin1 post handle exception\");\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/test/java/com/jd/easyflow/flow/ext/cases/chain/Plugin2.java",
    "content": "package com.jd.easyflow.flow.ext.cases.chain;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.ext.chain.BaseChainPlugin;\nimport com.jd.easyflow.flow.model.NodeContext;\n\npublic class Plugin2 extends BaseChainPlugin {\n    \n    private static final Logger logger = LoggerFactory.getLogger(Plugin2.class);\n    \n\n    @Override\n    public boolean preHandle(NodeContext nodeContext, FlowContext context) {\n        logger.info(\"Plugin2 pre handle\");\n        return true;\n    }\n\n    @Override\n    public void postHandleNormal(NodeContext nodeContext, FlowContext context) {\n        logger.info(\"Plugin2 post handle normal\");\n    }\n\n    @Override\n    public void postHandleException(Throwable t, NodeContext nodeContext, FlowContext context) {\n        logger.info(\"Plugin2 post handle exception\");\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/test/java/com/jd/easyflow/flow/ext/cases/chain/Plugin3.java",
    "content": "package com.jd.easyflow.flow.ext.cases.chain;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.ext.chain.BaseChainPlugin;\nimport com.jd.easyflow.flow.model.NodeContext;\n\npublic class Plugin3 extends BaseChainPlugin {\n    \n    private static final Logger logger = LoggerFactory.getLogger(Plugin3.class);\n    \n\n    @Override\n    public boolean preHandle(NodeContext nodeContext, FlowContext context) {\n        logger.info(\"Plugin3 pre handle\");\n        return true;\n    }\n\n    @Override\n    public void postHandleNormal(NodeContext nodeContext, FlowContext context) {\n        logger.info(\"Plugin3 post handle normal\");\n    }\n\n    @Override\n    public void postHandleException(Throwable t, NodeContext nodeContext, FlowContext context) {\n        logger.info(\"Plugin3 post handle exception\");\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/test/java/com/jd/easyflow/flow/ext/cases/check/FlowNodeLinkCheckTest.java",
    "content": "package com.jd.easyflow.flow.ext.cases.check;\n\nimport static org.junit.Assert.assertEquals;\n\nimport java.util.Arrays;\n\nimport org.junit.Test;\n\nimport com.jd.easyflow.flow.exception.FlowException;\nimport com.jd.easyflow.flow.ext.check.CheckErrorItem;\nimport com.jd.easyflow.flow.ext.check.CheckParam;\nimport com.jd.easyflow.flow.ext.check.CheckResult;\nimport com.jd.easyflow.flow.ext.check.impl.FlowNodeLinkCheckConfig;\nimport com.jd.easyflow.flow.ext.check.impl.FlowNodeLinkCheckFlowParseListener;\nimport com.jd.easyflow.flow.ext.check.impl.FlowNodeLinkChecker;\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.flow.model.parser.FlowParser;\nimport com.jd.easyflow.flow.model.parser.FlowParserImpl;\nimport com.jd.easyflow.flow.util.FlowIOUtil;\n\n/**\n * @author liyuliang5\n */\npublic class FlowNodeLinkCheckTest {\n\n    @Test\n    public void testCheckNodeIsolated001() throws Exception {\n        FlowParser flowParser = new FlowParserImpl();\n        Flow flow = flowParser.parse(FlowIOUtil.toString(this.getClass().getResourceAsStream(\"/flow/cases/check/check_isolated_001.json\"))).get(0);\n        FlowNodeLinkChecker checker = new FlowNodeLinkChecker();\n        CheckParam param = new CheckParam();\n        param.setFlow(flow);\n        FlowNodeLinkCheckConfig config = new FlowNodeLinkCheckConfig();\n        param.setConfig(config);\n        config.setCheckNodeIsolated(true);\n        CheckResult result = checker.check(param);\n        assertEquals(1, result.getErrorItemList().size());\n        CheckErrorItem item1 = result.getErrorItemList().get(0);\n        assertEquals(FlowNodeLinkChecker.ERROR_TYPE_NODE_ISOLATED, item1.getErrorType());\n    }\n    \n    @Test\n    public void testCheckNodeIsolated002() throws Exception {\n        FlowParser flowParser = new FlowParserImpl();\n        Flow flow = flowParser.parse(FlowIOUtil.toString(this.getClass().getResourceAsStream(\"/flow/cases/check/check_isolated_002.json\"))).get(0);\n        FlowNodeLinkChecker checker = new FlowNodeLinkChecker();\n        CheckParam param = new CheckParam();\n        param.setFlow(flow);\n        FlowNodeLinkCheckConfig config = new FlowNodeLinkCheckConfig();\n        param.setConfig(config);\n        config.setCheckNodeIsolated(true);\n        CheckResult result = checker.check(param);\n        assertEquals(0, result.getErrorItemList().size());\n    }\n    \n    @Test\n    public void testCheckNotExists() throws Exception {\n        FlowParser flowParser = new FlowParserImpl();\n        Flow flow = flowParser.parse(FlowIOUtil.toString(this.getClass().getResourceAsStream(\"/flow/cases/check/check_notexists_001.json\"))).get(0);\n        FlowNodeLinkChecker checker = new FlowNodeLinkChecker();\n        CheckParam param = new CheckParam();\n        param.setFlow(flow);\n        FlowNodeLinkCheckConfig config = new FlowNodeLinkCheckConfig();\n        param.setConfig(config);\n        config.setCheckNextNodesNotExists(true);\n        CheckResult result = checker.check(param);\n        assertEquals(1, result.getErrorItemList().size());\n        CheckErrorItem item1 = result.getErrorItemList().get(0);\n        assertEquals(FlowNodeLinkChecker.ERROR_TYPE_NEXT_NODES_NOT_EXISTS, item1.getErrorType());\n    }   \n    \n    @Test\n    public void testCheckPreCheckNodesNotExists() throws Exception {\n        FlowParser flowParser = new FlowParserImpl();\n        Flow flow = flowParser.parse(FlowIOUtil.toString(this.getClass().getResourceAsStream(\"/flow/cases/check/check_preCheckNodesNotExists_001.json\"))).get(0);\n        FlowNodeLinkChecker checker = new FlowNodeLinkChecker();\n        CheckParam param = new CheckParam();\n        param.setFlow(flow);\n        FlowNodeLinkCheckConfig config = new FlowNodeLinkCheckConfig();\n        param.setConfig(config);\n        config.setCheckPreCheckNodesNotExists(true);\n        CheckResult result = checker.check(param);\n        assertEquals(1, result.getErrorItemList().size());\n        CheckErrorItem item1 = result.getErrorItemList().get(0);\n        assertEquals(FlowNodeLinkChecker.ERROR_TYPE_PRE_CHECK_NODES_NOT_EXISTS, item1.getErrorType());\n    } \n    \n    @Test\n    public void testCheckNonStartNoPrevious() throws Exception {\n        FlowParser flowParser = new FlowParserImpl();\n        Flow flow = flowParser.parse(FlowIOUtil.toString(this.getClass().getResourceAsStream(\"/flow/cases/check/check_nonStart_001.json\"))).get(0);\n        FlowNodeLinkChecker checker = new FlowNodeLinkChecker();\n        CheckParam param = new CheckParam();\n        param.setFlow(flow);\n        FlowNodeLinkCheckConfig config = new FlowNodeLinkCheckConfig();\n        param.setConfig(config);\n        config.setCheckNonStartNodeNoPrevious(true);\n        CheckResult result = checker.check(param);\n        assertEquals(1, result.getErrorItemList().size());\n        CheckErrorItem item1 = result.getErrorItemList().get(0);\n        assertEquals(FlowNodeLinkChecker.ERROR_TYPE_NON_START_NODE_NO_PREVIOUS, item1.getErrorType());\n    } \n    \n    @Test\n    public void testCheckNonEndNoNext() throws Exception {\n        FlowParser flowParser = new FlowParserImpl();\n        Flow flow = flowParser.parse(FlowIOUtil.toString(this.getClass().getResourceAsStream(\"/flow/cases/check/check_nonEnd_001.json\"))).get(0);\n        FlowNodeLinkChecker checker = new FlowNodeLinkChecker();\n        CheckParam param = new CheckParam();\n        param.setFlow(flow);\n        FlowNodeLinkCheckConfig config = new FlowNodeLinkCheckConfig();\n        param.setConfig(config);\n        config.setCheckNonEndNodeNoNext(true);\n        CheckResult result = checker.check(param);\n        assertEquals(1, result.getErrorItemList().size());\n        CheckErrorItem item1 = result.getErrorItemList().get(0);\n        assertEquals(FlowNodeLinkChecker.ERROR_TYPE_NON_END_NODE_NO_NEXT, item1.getErrorType());\n    } \n    \n    @Test(expected = FlowException.class)\n    public void testCheckListener() throws Exception {\n        FlowParserImpl flowParser = new FlowParserImpl();\n        FlowNodeLinkCheckFlowParseListener listener = new FlowNodeLinkCheckFlowParseListener();\n        listener.setCheckNodeIsolatedPolicy(FlowNodeLinkCheckFlowParseListener.CHECK_POLICY_EXCEPTION);\n        flowParser.setPreListeners(Arrays.asList(listener));\n        \n        Flow flow = flowParser.parse(FlowIOUtil.toString(this.getClass().getResourceAsStream(\"/flow/cases/check/check_isolated_001.json\"))).get(0);\n    } \n    \n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/test/java/com/jd/easyflow/flow/ext/cases/check/InfiniteLoopCheckTest.java",
    "content": "package com.jd.easyflow.flow.ext.cases.check;\n\nimport java.util.Arrays;\n\nimport org.junit.Test;\n\nimport com.jd.easyflow.flow.exception.FlowException;\nimport com.jd.easyflow.flow.ext.check.impl.InfiniteLoopCheckFlowParseListener;\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.flow.model.parser.FlowParserImpl;\nimport com.jd.easyflow.flow.util.FlowIOUtil;\n\n/**\n * @author liyuliang5\n */\npublic class InfiniteLoopCheckTest {\n\n    @Test(expected = FlowException.class)\n    public void testInfiniteLoop001() throws Exception {\n        FlowParserImpl flowParser = new FlowParserImpl();\n        flowParser.setPostListeners(Arrays.asList(new InfiniteLoopCheckFlowParseListener()));\n        Flow flow = flowParser.parse(FlowIOUtil.toString(this.getClass().getResourceAsStream(\"/flow/cases/check/check_infinite_loop_001.json\"))).get(0);\n        \n    }\n    \n    @Test(expected = FlowException.class)\n    public void testInfiniteLoop002() throws Exception {\n        FlowParserImpl flowParser = new FlowParserImpl();\n        flowParser.setPostListeners(Arrays.asList(new InfiniteLoopCheckFlowParseListener()));\n        Flow flow = flowParser.parse(FlowIOUtil.toString(this.getClass().getResourceAsStream(\"/flow/cases/check/check_infinite_loop_002.json\"))).get(0);\n        \n    }\n    \n    @Test\n    public void testInfiniteLoop003() throws Exception {\n        FlowParserImpl flowParser = new FlowParserImpl();\n        flowParser.setPostListeners(Arrays.asList(new InfiniteLoopCheckFlowParseListener()));\n        Flow flow = flowParser.parse(FlowIOUtil.toString(this.getClass().getResourceAsStream(\"/flow/cases/check/check_infinite_loop_003.json\"))).get(0);\n        \n    }\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/test/java/com/jd/easyflow/flow/ext/cases/funcall/FunCallTest.java",
    "content": "package com.jd.easyflow.flow.ext.cases.funcall;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FunCallTest {\n    \n    private static final Logger logger = LoggerFactory.getLogger(FunCallTest.class);\n\n    /**\n     * Test customize action.\n     */\n    @Test\n    public void testFunCall001() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/funcall/funcall_test_001.json\");\n        flowEngine.init();\n        \n        Map<String, Object> bizParam = new HashMap<>();\n        bizParam.put(\"a\", \"a1\");\n        bizParam.put(\"b\", \"b1\");\n        logger.info(\"Param:\" + bizParam);\n        FlowParam param = new FlowParam(\"funcall_test_001\", bizParam);\n        FlowResult result = flowEngine.execute(param);\n        logger.info(\"Result:\" + result.getResult());\n    }\n    \n    /**\n     * Test customize action.\n     */\n    @Test\n    public void testFunCall002() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/funcall/funcall_test_002.json\");\n        flowEngine.init();\n        \n        Map<String, Object> bizParam = new HashMap<>();\n        bizParam.put(\"a\", \"a1\");\n        bizParam.put(\"b\", \"b1\");\n        logger.info(\"Param:\" + bizParam);\n        FlowParam param = new FlowParam(\"funcall_test_002\", bizParam);\n        FlowResult result = flowEngine.execute(param);\n        logger.info(\"Result:\" + result.getResult());\n    }\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/test/java/com/jd/easyflow/flow/ext/cases/funcall/MockActionClass.java",
    "content": "package com.jd.easyflow.flow.ext.cases.funcall;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class MockActionClass {\n\n    public Map<String, Object> method1(Map<String, Object> param) {\n        Map<String, Object> result = new HashMap<>();\n        result.put(\"r1\", \"hello \" + param.get(\"A\"));\n        result.put(\"r2\", \"hello r2\");\n        return result;\n    }\n    \n    public Map<String, Object> method3(Map<String, Object> param) {\n        Map<String, Object> result = new HashMap<>();\n        result.put(\"r3\", \"hello \" + param.get(\"A\"));\n        return result;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/test/java/com/jd/easyflow/flow/ext/cases/interrupt/ExtInterruptTest.java",
    "content": "package com.jd.easyflow.flow.ext.cases.interrupt;\n\nimport static org.junit.Assert.assertEquals;\n\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.SynchronousQueue;\nimport java.util.concurrent.ThreadPoolExecutor;\nimport java.util.concurrent.ThreadPoolExecutor.AbortPolicy;\nimport java.util.concurrent.TimeUnit;\nimport java.util.concurrent.atomic.AtomicInteger;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\nimport com.jd.easyflow.flow.engine.impl.ReusableThreadFlowRunner;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.util.FlowUtil;\n\n/**\n * @author liyuliang5\n */\npublic class ExtInterruptTest {\n    \n    private static final Logger logger = LoggerFactory.getLogger(ExtInterruptTest.class);\n\n    /**\n     * Test interrupt.\n     * node001 sleep 1000ms return false.\n     * node0021 sleep 2000ms return true -> node0022 sleep 1000ms return false.\n     * node003 sleep 3000ms return false.\n     * expect false.\n     * \n     */\n    @Test\n    public void testInterrupt001() throws Exception {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/interrupt/ext_interrupt_001.json\");\n        flowEngine.init();\n        \n        \n        FlowParam param = new FlowParam(\"ext_interrupt_001\");\n        AtomicInteger successBizCount = new AtomicInteger(0);\n        param.putContextData(\"successBizCount\", successBizCount);\n        \n        FlowResult result = flowEngine.execute(param);\n        \n        logger.info(\"successBizCount:\" + successBizCount.get());\n        logger.info(\"final result:\" + (successBizCount.get() == result.getContext().getFlow().getNodeList().size()));\n        assertEquals(0, successBizCount.get());\n        // sleep to see node002 and node003 log.\n        //Thread.sleep(5000);\n    }\n    \n  \n}\n\n\n class ExtTestReusableThreadRunner extends ReusableThreadFlowRunner {\n\n    public ExtTestReusableThreadRunner() {\n        this.executor = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS,\n                new SynchronousQueue<Runnable>(), Executors.defaultThreadFactory(), new AbortPolicy());\n    }\n    \n    public ExtTestReusableThreadRunner(long timeout) {\n        this.executor = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS,\n                new SynchronousQueue<Runnable>(), Executors.defaultThreadFactory(), new AbortPolicy());\n        this.timeout = timeout;\n    }    \n\n}\n\n class ExtTestInterruptBizNodeAction implements NodeAction {\n    \n    private static final Logger logger = LoggerFactory.getLogger(ExtTestInterruptBizNodeAction.class);\n    \n    private long sleepMills;\n    \n    private boolean result;\n    \n    public ExtTestInterruptBizNodeAction(long sleepMills, boolean result) {\n        this.sleepMills = sleepMills;\n        this.result = result;\n    }\n    \n    @Override\n    public Boolean execute(NodeContext nodeContext, FlowContext context) {\n        try {\n            logger.info(FlowUtil.node(nodeContext, context).getId() + \" start\");\n            // biz1 use 1000ms, return result.\n            Thread.sleep(sleepMills);\n            if (result) {\n                ((AtomicInteger) context.get(\"successBizCount\")).incrementAndGet();\n            } else {\n                context.setInterrupted();\n            }\n            logger.info(FlowUtil.node(nodeContext, context).getId() + \" end\");\n            return result;\n        } catch (InterruptedException e) {\n            throw new RuntimeException(e);\n        }\n    }\n    \n}"
  },
  {
    "path": "easyflow-flow-extension/src/test/java/com/jd/easyflow/flow/ext/cases/model/action/JavaScriptNodeActionTest.java",
    "content": "package com.jd.easyflow.flow.ext.cases.model.action;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class JavaScriptNodeActionTest {\n    \n    private static final Logger logger = LoggerFactory.getLogger(JavaScriptNodeActionTest.class);\n\n    /**\n     * Test customize action.\n     */\n    @Test\n    public void testLoop001() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/model/action/javascript_test_001.json\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"javascript_test_001\", null);\n        FlowResult result = flowEngine.execute(param);\n        logger.info(\"javascript result:\" + (result.getContext().getEndNodes()).get(0).getActionResult());\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/test/java/com/jd/easyflow/flow/ext/cases/model/action/ShellNodeActionTest.java",
    "content": "package com.jd.easyflow.flow.ext.cases.model.action;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ShellNodeActionTest {\n    \n    private static final Logger logger = LoggerFactory.getLogger(ShellNodeActionTest.class);\n\n    /**\n     * Test customize action.\n     */\n    @Test\n    public void testLoop001() {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/model/action/shell_test_001.json\");\n        flowEngine.init();\n        FlowParam param = new FlowParam(\"shell_test_001\", null);\n        FlowResult result = flowEngine.execute(param);\n        logger.info(\"shell result:\" + (result.getContext().getEndNodes()).get(0).getActionResult());\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/test/java/com/jd/easyflow/flow/ext/cases/session/MockRequestAsyncCall.java",
    "content": "package com.jd.easyflow.flow.ext.cases.session;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class MockRequestAsyncCall {\n\n    private static final Logger logger = LoggerFactory.getLogger(MockRequestAsyncCall.class);\n\n    public void call(String data) {\n        logger.info(\"call with data:\" + data);\n    }\n\n    public void resultProcess(String data, NodeContext nodeContext, FlowContext context) {\n        logger.info(\"result with data:\" + data);\n        Boolean end = context.getFlow().getNode(nodeContext.getNodeId()).getProperty(\"end\");\n        if (Boolean.TRUE.equals(end)) {\n            logger.info(\"flow end\");\n        }\n    }\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/test/java/com/jd/easyflow/flow/ext/cases/session/SessionFlowTest.java",
    "content": "package com.jd.easyflow.flow.ext.cases.session;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\nimport com.jd.easyflow.flow.ext.session.FlowSession;\nimport com.jd.easyflow.flow.ext.session.FlowSessionConstants;\nimport com.jd.easyflow.flow.ext.session.FlowSessionImpl;\nimport com.jd.easyflow.flow.util.FlowConstants;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class SessionFlowTest {\n\n    public static final Logger logger = LoggerFactory.getLogger(SessionFlowTest.class);\n\n    @Test\n    public void testEventFlowMultipleTimes() throws Exception {   \n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/session/flow_session_001.json\");\n        flowEngine.init();\n\n        FlowSession session = new FlowSessionImpl();\n        \n        // start request\n        logger.info(\"==============start request\");\n        FlowParam param = new FlowParam(\"flow_session_001\", \"NODE1\", \"request1\");\n        param.putContextData(FlowSessionConstants.CONTEXT_SESSION_KEY, session);\n        FlowResult result = flowEngine.execute(param);\n        // receieve node1 result\n        logger.info(\"==============receieve node1 result\");\n        param = new FlowParam(\"flow_session_001\", \"NODE1\", \"request1 node1 result\");\n        param.put(FlowConstants.PARAM_DATA_EVENT, \"RESULT\");\n        param.putContextData(FlowSessionConstants.CONTEXT_SESSION_KEY, session);\n        result = flowEngine.execute(param);\n        // receieve node2 result\n        logger.info(\"==============receieve node2 result\");\n        param = new FlowParam(\"flow_session_001\", \"NODE2\", \"request1 node2 result\");\n        param.put(FlowConstants.PARAM_DATA_EVENT, \"RESULT\");\n        param.putContextData(FlowSessionConstants.CONTEXT_SESSION_KEY, session);\n        result = flowEngine.execute(param);\n\n        // receieve node3 result\n        logger.info(\"==============receieve node3 result\");        \n        param = new FlowParam(\"flow_session_001\", \"NODE3\", \"request1 node3 result\");\n        param.put(FlowConstants.PARAM_DATA_EVENT, \"RESULT\");\n        param.putContextData(FlowSessionConstants.CONTEXT_SESSION_KEY, session);\n        result = flowEngine.execute(param);\n\n        // receieve node4 result\n        logger.info(\"==============receieve node4 result\");                \n        param = new FlowParam(\"flow_session_001\", \"NODE4\", \"request1 node4 result\");\n        param.put(FlowConstants.PARAM_DATA_EVENT, \"RESULT\");\n        param.putContextData(FlowSessionConstants.CONTEXT_SESSION_KEY, session);\n        result = flowEngine.execute(param);\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/test/java/com/jd/easyflow/flow/ext/cases/timeout/TestTimeoutNodeAction.java",
    "content": "package com.jd.easyflow.flow.ext.cases.timeout;\n\nimport java.util.Map;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * \n * @author liyuliang5\n */\npublic class TestTimeoutNodeAction implements NodeAction {\n    \n    private static final Logger logger = LoggerFactory.getLogger(TestTimeoutNodeAction.class);\n\n    @Override\n    public <T> T execute(NodeContext nodeContext, FlowContext context) {\n        try {\n            Thread.sleep(1000);\n        } catch (InterruptedException e) {\n            logger.error(\"thread interrupted\");\n            throw new RuntimeException(e);\n        }\n        return null;\n    }\n    \n    public Object onTimeout(Map<String, Object> config) {\n        logger.info(\"timeout!, config:{}\", config);\n        return \"timeout!\";\n    }\n\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/test/java/com/jd/easyflow/flow/ext/cases/timeout/TimeoutFilterTest.java",
    "content": "package com.jd.easyflow.flow.ext.cases.timeout;\n\nimport java.util.Map;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\n\n/**\n * \n * @author liyuliang5\n */\npublic class TimeoutFilterTest {\n    \n    private static final Logger logger = LoggerFactory.getLogger(TimeoutFilterTest.class);\n\n    @Test\n    public void testNodeActionFilter() throws Exception {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/timeout/flow_timeout_001.json\");\n        flowEngine.init();\n        \n        FlowParam flowParam = new FlowParam(\"timeout_test_001\");\n        FlowResult flowResult = flowEngine.execute(flowParam);\n        Thread.sleep(2000);\n        \n    }\n    \n    @Test\n    public void testFlowFilter() throws Exception {\n        FlowEngineImpl flowEngine = new FlowEngineImpl();\n        flowEngine.setFlowPath(\"classpath:flow/cases/timeout/flow_timeout_002.json\");\n        flowEngine.init();\n        \n        FlowParam flowParam = new FlowParam(\"timeout_test_002\");\n        FlowResult flowResult = flowEngine.execute(flowParam);\n        Thread.sleep(2000);\n        \n    }\n    \n    public FlowResult onTimeout(Map<String, Object> config, FlowContext context) {\n        logger.info(\"flow exeucte timeout\");\n        return context.getResult();\n    }\n}\n"
  },
  {
    "path": "easyflow-flow-extension/src/test/java/com/jd/easyflow/flow/ext/serialize/impl/JsonFlowParamSerializerTest.java",
    "content": "package com.jd.easyflow.flow.ext.serialize.impl;\n\nimport static org.junit.Assert.assertArrayEquals;\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertNotNull;\n\nimport org.junit.Before;\nimport org.junit.Test;\n\nimport com.jd.easyflow.flow.engine.FlowParam;\n\n/**\n * Unit tests for JsonFlowParamSerializer\n * \n * @author liyuliang5\n */\npublic class JsonFlowParamSerializerTest {\n\n    private JsonFlowParamSerializer serializer;\n\n    @Before\n    public void setUp() {\n        serializer = new JsonFlowParamSerializer();\n    }\n\n    @Test\n    public void testSerializeAndDeserializeBasicFlowParam() {\n        // Create basic FlowParam\n        FlowParam originalParam = new FlowParam();\n        originalParam.setFlowId(\"test-flow-001\");\n        originalParam.setNodeIds(new String[]{\"node1\", \"node2\"});\n        originalParam.setParam(\"test-param\");\n        originalParam.setLogFlag(true);\n        originalParam.put(\"key1\", \"value1\");\n        originalParam.put(\"key2\", 123);\n\n        // Serialize\n        String serializedJson = serializer.serialize(originalParam, null);\n        assertNotNull(\"Serialized result should not be null\", serializedJson);\n        assertFalse(\"Serialized result should not be empty\", serializedJson.isEmpty());\n\n        // Deserialize\n        FlowParam deserializedParam = serializer.deserialize(serializedJson, null);\n        \n        // Verify deserialized result\n        assertNotNull(\"Deserialized result should not be null\", deserializedParam);\n        assertEquals(\"FlowId should be equal\", originalParam.getFlowId(), deserializedParam.getFlowId());\n        assertArrayEquals(\"NodeIds should be equal\", originalParam.getNodeIds(), deserializedParam.getNodeIds());\n        assertEquals(\"LogFlag should be equal\", originalParam.getLogFlag(), deserializedParam.getLogFlag());\n        assertEquals(\"DataMap key1 should be equal\", (String) originalParam.get(\"key1\"), deserializedParam.get(\"key1\"));\n        assertEquals(\"DataMap key2 should be equal\", (Integer) originalParam.get(\"key2\"), deserializedParam.get(\"key2\"));\n    }\n\n}"
  },
  {
    "path": "easyflow-flow-extension/src/test/resources/flow/cases/chain/flow_chaintest2.json",
    "content": "{\n\"id\":\"flow_chaintest2\",\n\"nodes\":[\n{\"id\":\"targetAction\", \"action\":{\"createExp\":\"new com.jd.easyflow.flow.ext.chain.TargetAction()\"}, \"start\":true}\n],\n\"filters\":[\n{\"createExp\":\"new com.jd.easyflow.flow.ext.cases.chain.Filter1()\"},\n{\"createExp\":\"new com.jd.easyflow.flow.ext.cases.chain.Filter2()\"},\n{\"createExp\":\"new com.jd.easyflow.flow.ext.cases.chain.Filter3()\"}\n]\n}"
  },
  {
    "path": "easyflow-flow-extension/src/test/resources/flow/cases/check/check_infinite_loop_001.json",
    "content": "{\"id\":\"infinite_loop_001\",\n\"nodes\":[\n\t{\"id\":\"node001\", \"post\":{\"to\":\"node002\"}},\n\t{\"id\":\"node002\", \"post\":{\"to\":\"node003\"}},\n\t{\"id\":\"node003\", \"post\":{\"to\":\"node001\"}}\n]\t\n}"
  },
  {
    "path": "easyflow-flow-extension/src/test/resources/flow/cases/check/check_infinite_loop_002.json",
    "content": "{\"id\":\"infinite_loop_002\",\n\"nodes\":[\n\t{\"id\":\"node001\", \"post\":{\"to\":\"node001\"}}\n]\t\n}"
  },
  {
    "path": "easyflow-flow-extension/src/test/resources/flow/cases/check/check_infinite_loop_003.json",
    "content": "{\"id\":\"infinite_loop_003\",\n\"nodes\":[\n\t{\"id\":\"node001\", \"post\":{\"to\":\"node002\"}},\n\t{\"id\":\"node002\"}\n]\t\n}"
  },
  {
    "path": "easyflow-flow-extension/src/test/resources/flow/cases/check/check_isolated_001.json",
    "content": "{\n\"id\":\"check_isolated_001\",\n\"nodes\":[\n{\"id\":\"node001\"},\n{\"id\":\"node002\",\"post\":{\"to\":\"end\"}},\n{\"id\":\"end\"}\n]\n}"
  },
  {
    "path": "easyflow-flow-extension/src/test/resources/flow/cases/check/check_isolated_002.json",
    "content": "{\n\"id\":\"check_isolated_001\",\n\"nodes\":[\n{\"id\":\"node001\",\"properties\":{\"nextNodes\":[\"node002\"]}},\n{\"id\":\"node002\",\"post\":{\"to\":\"end\"}},\n{\"id\":\"end\"}\n]\n}"
  },
  {
    "path": "easyflow-flow-extension/src/test/resources/flow/cases/check/check_nonEnd_001.json",
    "content": "{\n\"id\":\"check_noneEnd_001\",\n\"nodes\":[\n{\"id\":\"node001\", \"post\":{\"to\":\"node002\"}, \"start\":true},\n{\"id\":\"node002\", \"post\":{\"to\":\"end\"}},\n{\"id\":\"end\"}\n]\n}"
  },
  {
    "path": "easyflow-flow-extension/src/test/resources/flow/cases/check/check_nonStart_001.json",
    "content": "{\n\"id\":\"check_noneStart_001\",\n\"nodes\":[\n{\"id\":\"node001\", \"post\":{\"to\":\"node002\"}, \"start\":true},\n{\"id\":\"node002\"},\n{\"id\":\"end\"}\n]\n}"
  },
  {
    "path": "easyflow-flow-extension/src/test/resources/flow/cases/check/check_notexists_001.json",
    "content": "{\n\"id\":\"check_notexists_001\",\n\"nodes\":[\n{\"id\":\"node001\", \"post\":{\"to\":\"notexists\"}},\n{\"id\":\"node002\",\"post\":{\"to\":\"end\"}},\n{\"id\":\"end\"}\n]\n}"
  },
  {
    "path": "easyflow-flow-extension/src/test/resources/flow/cases/check/check_preCheckNodesNotExists_001.json",
    "content": "{\n\"id\":\"check_preCheckNodesNotExists_001\",\n\"nodes\":[\n{\"id\":\"node001\", \"post\":{\"to\":\"node002\"}},\n{\"id\":\"node002\",\"post\":{\"to\":\"end\"}, \"properties\":{\"preNodes\":[\"notexists\"]}},\n{\"id\":\"end\",\"properties\":{\"preNodes\":[\"node002\"]}}\n]\n}"
  },
  {
    "path": "easyflow-flow-extension/src/test/resources/flow/cases/funcall/funcall_test_001.json",
    "content": "{    \"id\": \"funcall_test_001\",\n    \"name\": \"Function Call Test 001\",\n    \"nodes\": [\n        {\"id\": \"node001\",\"name\": \"Node001\",\"start\": true,\n                \"action\": {\n                    \"createExp\":\"new com.jd.easyflow.flow.ext.funcall.FunCallNodeAction(definition, node)\",\n                    \n                    \"classMethod\": \"com.jd.easyflow.flow.ext.cases.funcall.MockActionClass::method1\", \n                    \"param\":[{\"key\":\"A\", \"value\":\"bizParam.A\"},{\"key\":\"B\", \"value\":\"bizParam.B\"}], \n                    \"result\":[{\"key\":\"r1\"},{\"key\":\"r2\"}] \n                },\n            \"post\": {\"to\": \"node002\"}},\n            \n        {\"id\": \"node002\",\"name\": \"Node002\",\n            \"post\": {\"to\": \"node003\"}},\n            \n        {\"id\": \"node003\",\"name\": \"Node003\",\n        \"action\": {\n                    \"createExp\":\"new com.jd.easyflow.flow.ext.funcall.FunCallNodeAction(definition, node)\",\n                    \n                    \"classMethod\": \"com.jd.easyflow.flow.ext.cases.funcall.MockActionClass::method3\", \n                    \"param\":[{\"key\":\"A\", \"value\":\"node['node001'].res.r1\"},{\"key\":\"B\", \"value\":\"bizParam.C\"}], \n                    \"result\":[{\"key\":\"r3\"}] \n                }}\n        ],\n     \"listeners\":[\n         {\"createExp\":\"new com.jd.easyflow.flow.ext.funcall.FunCallEventListener(definition)\", \n         \"param\":[{\"key\":\"A\", \"value\":\"bizParam.a\"},{\"key\":\"B\", \"value\":\"bizParam.b\"}, {\"key\":\"C\", \"value\":\"'static'\"} ],\n         \"result\":[{\"key\":\"result1\", \"value\":\"node['node003'].res.r3\"},{\"key\":\"result2\", \"value\":\"node['node001'].res.r2\"}]}\n     ]\n\n}"
  },
  {
    "path": "easyflow-flow-extension/src/test/resources/flow/cases/funcall/funcall_test_002.json",
    "content": "{    \"id\": \"funcall_test_002\",\n    \"name\": \"Function Call Test 002\",\n    \n    \"pre\":{\"createExp\":\"new com.jd.easyflow.flow.ext.funcall.FunCallFlowPreHandler(definition)\", \n         \"param\":[{\"key\":\"A\", \"value\":\"bizParam.a\"},{\"key\":\"B\", \"value\":\"bizParam.b\"}, {\"key\":\"C\", \"value\":\"'static'\"} ]},\n         \n    \"nodes\": [\n        {\"id\": \"node001\",\"name\": \"Node001\",\"start\": true,\n                \"action\": {\n                    \"createExp\":\"new com.jd.easyflow.flow.ext.funcall.FunCallNodeAction(definition, node)\",\n                    \n                    \"classMethod\": \"com.jd.easyflow.flow.ext.cases.funcall.MockActionClass::method1\", \n                    \"param\":[{\"key\":\"A\", \"value\":\"bizParam.A\"},{\"key\":\"B\", \"value\":\"bizParam.B\"}], \n                    \"result\":[{\"key\":\"r1\"},{\"key\":\"r2\"}] \n                },\n            \"post\": {\"to\": \"node002\"}},\n            \n        {\"id\": \"node002\",\"name\": \"Node002\",\n            \"post\": {\"to\": \"node003\"}},\n            \n        {\"id\": \"node003\",\"name\": \"Node003\",\n        \"action\": {\n                    \"createExp\":\"new com.jd.easyflow.flow.ext.funcall.FunCallNodeAction(definition, node)\",\n                    \n                    \"classMethod\": \"com.jd.easyflow.flow.ext.cases.funcall.MockActionClass::method3\", \n                    \"param\":[{\"key\":\"A\", \"value\":\"node['node001'].res.r1\"},{\"key\":\"B\", \"value\":\"bizParam.C\"}], \n                    \"result\":[{\"key\":\"r3\"}] \n                }}\n        ],\n        \n     \"post\":{\"createExp\":\"new com.jd.easyflow.flow.ext.funcall.FunCallFlowPostHandler(definition)\", \n         \"result\":[{\"key\":\"result1\", \"value\":\"node['node003'].res.r3\"},{\"key\":\"result2\", \"value\":\"node['node001'].res.r2\"}]}\n\n}"
  },
  {
    "path": "easyflow-flow-extension/src/test/resources/flow/cases/interrupt/ext_interrupt_001.json",
    "content": "{   \"id\": \"ext_interrupt_001\",\n    \"nodes\": [\n        {\"id\": \"node001\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.ext.cases.interrupt.ExtTestInterruptBizNodeAction(1000, false)\"}, \"start\":true}, \n          \n        {\"id\": \"node0021\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.ext.cases.interrupt.ExtTestInterruptBizNodeAction(2000, true)\"}, \"post\":{\"when\":\"actionResult\", \"to\":\"node022\"}, \"start\":true},   \n        {\"id\": \"node0022\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.ext.cases.interrupt.ExtTestInterruptBizNodeAction(1000, false)\"}}, \n        \n        {\"id\": \"node003\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.ext.cases.interrupt.ExtTestInterruptBizNodeAction(3000, false)\"}, \"start\":true} \n    ],\n    \"runner\":{\"createExp\":\"new com.jd.easyflow.flow.ext.cases.interrupt.ExtTestReusableThreadRunner(10000)\"},\n\t\"filters\":[{\"createExp\":\"new com.jd.easyflow.flow.ext.interrupt.ExtNodeThreadInterruptFlowFilter()\"}],\n\t\"nodeFilters\":[{\"createExp\":\"new com.jd.easyflow.flow.ext.interrupt.ExtNodeThreadInterruptNodeFilter()\"}]\n}"
  },
  {
    "path": "easyflow-flow-extension/src/test/resources/flow/cases/model/action/javascript_test_001.json",
    "content": "{\n    \"id\": \"javascript_test_001\",\n    \"name\": \"JavaScript Test 001\",\n    \"nodes\": [\n        {\n            \"id\": \"node001\",\n            \"name\": \"Node001\",\n            \"start\": true,\n            \"action\": {\n                \"createExp\": \"new com.jd.easyflow.flow.ext.model.action.JavaScriptNodeAction()\"\n            },\n            \"properties\": {\n                \"javascript\":\"1+2\"\n            }\n        }\n    ]\n}"
  },
  {
    "path": "easyflow-flow-extension/src/test/resources/flow/cases/model/action/shell_test_001.json",
    "content": "{\n    \"id\": \"shell_test_001\",\n    \"name\": \"Shell Test 001\",\n    \"nodes\": [\n        {\n            \"id\": \"node001\",\n            \"name\": \"Node001\",\n            \"start\": true,\n            \"action\": {\n                \"createExp\": \"new com.jd.easyflow.flow.ext.model.action.ShellNodeAction()\"\n            },\n            \"properties\": {\n                \"shellTimeoutSeconds\":10,\n                \"shellCommand\":[\"ls\"]\n            }\n        }\n    ]\n}"
  },
  {
    "path": "easyflow-flow-extension/src/test/resources/flow/cases/session/flow_session_001.json",
    "content": "{\n    \"id\": \"flow_session_001\",\"name\": \"Flow session 001\",\n    \"nodes\": [\n        {\"id\": \"NODE1\",\"name\": \"Node1\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.model.action.EventNodeAction()\"},\n            \"post\":{\"createExp\":\"new com.jd.easyflow.flow.model.post.EventPostHandler()\"}, \n            \"properties\":{\"events\":{\n                \"NONE\":\"new com.jd.easyflow.flow.ext.cases.session.MockRequestAsyncCall().call(bizParam)\",\n                \"RESULT\":{\"action\":{\"exp\":\"new com.jd.easyflow.flow.ext.cases.session.MockRequestAsyncCall().resultProcess(bizParam, nodeContext, context)\"}, \"post\":{\"to\":[\"NODE2\", \"NODE3\"]}}\n         }}},\n         \n        {\"id\": \"NODE2\",\"name\": \"Node2\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.model.action.EventNodeAction()\"},\n            \"post\":{\"createExp\":\"new com.jd.easyflow.flow.model.post.EventPostHandler()\"}, \n            \"properties\":{\"events\":{\n                \"NONE\":\"new com.jd.easyflow.flow.ext.cases.session.MockRequestAsyncCall().call(bizParam)\",\n                \"RESULT\":{\"action\":{\"exp\":\"new com.jd.easyflow.flow.ext.cases.session.MockRequestAsyncCall().resultProcess(bizParam, nodeContext, context)\"}, \"post\":{\"to\":\"NODE4\"}}\n         }}},\n         \n        {\"id\": \"NODE3\",\"name\": \"Node3\",\"action\":{\"createExp\":\"new com.jd.easyflow.flow.model.action.EventNodeAction()\"},\n            \"post\":{\"createExp\":\"new com.jd.easyflow.flow.model.post.EventPostHandler()\"}, \n            \"properties\":{\"events\":{\n                \"NONE\":\"new com.jd.easyflow.flow.ext.cases.session.MockRequestAsyncCall().call(bizParam)\",\n                \"RESULT\":{\"action\":{\"exp\":\"new com.jd.easyflow.flow.ext.cases.session.MockRequestAsyncCall().resultProcess(bizParam, nodeContext, context)\"}, \"post\":{\"to\":\"NODE4\"}}\n         }}},    \n         \n        {\"id\": \"NODE4\",\"name\": \"Node4\",\n            \"pre\":{\"createExp\":\"new com.jd.easyflow.flow.model.pre.ExpNodePreHandler('nodeContext.get(\\\"EVENT\\\")==\\\"RESULT\\\" || new com.jd.easyflow.flow.ext.session.SessionMultiCheckPreHandler().preHandle(nodeContext, context)')\"},\n            \"action\":{\"createExp\":\"new com.jd.easyflow.flow.model.action.EventNodeAction()\"},\n            \"post\":{\"createExp\":\"new com.jd.easyflow.flow.model.post.EventPostHandler()\"}, \n            \"properties\":{\n              \"preNodes\":[\"NODE2\",\"NODE3\"],\n              \"events\":{\n                \"NONE\":\"new com.jd.easyflow.flow.ext.cases.session.MockRequestAsyncCall().call(bizParam)\",\n                \"RESULT\":{\"action\":{\"exp\":\"new com.jd.easyflow.flow.ext.cases.session.MockRequestAsyncCall().resultProcess(bizParam, nodeContext, context)\"}}},\n              \"end\":true\n         }}                         \n        \n    ],\n    \"listeners\":[{\"createExp\":\"new com.jd.easyflow.flow.engine.event.impl.EventFlowListener()\"}]\n}"
  },
  {
    "path": "easyflow-flow-extension/src/test/resources/flow/cases/timeout/flow_timeout_001.json",
    "content": "{\"id\":\"timeout_test_001\",\n\"nodes\":[\n    {\"id\":\"start\", \"post\":{\"to\":\"timeout_node\"}, \"start\":true},\n    {\"id\":\"timeout_node\", \"action\":{\"createExp\":\"new com.jd.easyflow.flow.ext.cases.timeout.TestTimeoutNodeAction()\"}, \"post\":{\"to\":\"end\"},\n     \"properties\":{\"timeout\":{\"timeoutMillisExp\":\"500\", \"onTimeoutExp\":\"new com.jd.easyflow.flow.ext.cases.timeout.TestTimeoutNodeAction().onTimeout(timeoutConfig)\"}}},\n    {\"id\":\"end\"}\n],\n\"nodeActionFilters\":[\n    {\"createExp\":\"new com.jd.easyflow.flow.ext.timeout.TimeoutNodeActionFilter()\"}\n]\n}"
  },
  {
    "path": "easyflow-flow-extension/src/test/resources/flow/cases/timeout/flow_timeout_002.json",
    "content": "{\"id\":\"timeout_test_002\",\n\"nodes\":[\n    {\"id\":\"start\", \"post\":{\"to\":\"timeout_node\"}, \"start\":true},\n    {\"id\":\"timeout_node\", \"action\":{\"createExp\":\"new com.jd.easyflow.flow.ext.cases.timeout.TestTimeoutNodeAction()\"}, \"post\":{\"to\":\"end\"}},\n    {\"id\":\"end\"}\n],\n\"filters\":[\n    {\"createExp\":\"new com.jd.easyflow.flow.ext.timeout.TimeoutFlowFilter()\"}\n],\n\"properties\":{\"timeout\":{\"timeoutMillisExp\":\"500\", \"onTimeoutExp\":\"new com.jd.easyflow.flow.ext.cases.timeout.TimeoutFilterTest().onTimeout(timeoutConfig, context)\"}}\n}"
  },
  {
    "path": "easyflow-fsm/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n    xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>easyflow-parent</artifactId>\n        <groupId>com.jd.easyflow</groupId>\n        <version>1.7.3</version>\n    </parent>\n    <artifactId>easyflow-fsm</artifactId>\n    <name>easyflow-fsm</name>\n    <packaging>jar</packaging>\n    <dependencies>\n        <!--spring-->\n        <dependency>\n            <groupId>org.springframework</groupId>\n            <artifactId>spring-context</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework</groupId>\n            <artifactId>spring-expression</artifactId>\n        </dependency>\n        <!-- logback & slf4j dependencies -->\n        <dependency>\n            <groupId>ch.qos.logback</groupId>\n            <artifactId>logback-classic</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n        </dependency>\n\n        <!-- Jackson -->\n        <dependency>\n            <groupId>com.fasterxml.jackson.core</groupId>\n            <artifactId>jackson-databind</artifactId>\n        </dependency>\n        <!--other -->\n        <dependency>\n            <groupId>junit</groupId>\n            <artifactId>junit</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n\n</project>"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/CoreFsmManager.java",
    "content": "package com.jd.easyflow.fsm;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.fsm.el.ElEvaluator;\nimport com.jd.easyflow.fsm.el.ElFactory;\nimport com.jd.easyflow.fsm.event.FsmEventListener;\nimport com.jd.easyflow.fsm.event.FsmEventTrigger;\nimport com.jd.easyflow.fsm.exception.FsmException;\nimport com.jd.easyflow.fsm.filter.Filter;\nimport com.jd.easyflow.fsm.filter.FilterChain;\nimport com.jd.easyflow.fsm.parser.FsmParser;\nimport com.jd.easyflow.fsm.util.FsmConstants;\nimport com.jd.easyflow.fsm.util.FsmEventTypes;\nimport com.jd.easyflow.fsm.util.FsmIOUtil;\nimport com.jd.easyflow.fsm.util.Pair;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic abstract class CoreFsmManager {\n\n    public static final Logger logger = LoggerFactory.getLogger(CoreFsmManager.class);\n\n    protected Map<String, Fsm> fsmMap = new ConcurrentHashMap<>();\n\n    protected Map<String, String> fsmDefinitionMap = new ConcurrentHashMap<String, String>();\n\n    protected String fsmPath;\n\n    protected FsmEventTrigger eventTrigger = new FsmEventTrigger();\n\n    protected List<FsmEventListener> listeners;\n\n\n    protected volatile boolean inited = false;\n\n    protected List<Filter<Pair<FsmParam, CoreFsmManager>, FsmResult>> filters;\n    \n    protected Map<String, Object> properties = new ConcurrentHashMap<String, Object>();\n    \n    protected ElEvaluator elEvaluator;\n\n    public void init() {\n        if (inited) {\n            return;\n        }\n        if (elEvaluator == null) {\n            elEvaluator = ElFactory.get();\n        }\n        loadFsm();\n        if (listeners != null) {\n            listeners.forEach(listener -> eventTrigger.addListener(listener));\n        }\n        eventTrigger.init(null, null);\n        if (filters != null) {\n            filters.forEach(filter -> {\n                filter.init(null, null);\n            });\n        }\n        inited = true;\n    }\n    \n    public void destroy () {\n        if (fsmMap != null) {\n            for (Entry<String, Fsm> entry : fsmMap.entrySet()) {\n                entry.getValue().destroy();\n            }\n        }\n        eventTrigger.destroy();\n        if (filters != null) {\n            filters.forEach(filter -> {\n                filter.destroy();\n            });\n        }\n    }\n\n    /**\n     * \n     * Loan fsm.\n     *\n     */\n    protected abstract void loadFsm();\n    \n    protected void loadFsmInputStream(InputStream inputstream) throws IOException {\n        String fsmDefinition = FsmIOUtil.toString(inputstream);\n        Fsm fsm = FsmParser.parse(fsmDefinition, true, elEvaluator);\n        if (fsmDefinitionMap.containsKey(fsm.getId())) {\n            throw new FsmException(\"Fsm id \"  + fsm.getId() + \" already exists\");\n        }\n        fsmDefinitionMap.put(fsm.getId(), fsmDefinition);\n        fsmMap.put(fsm.getId(), fsm);\n    }\n\n    public void add(Fsm fsm) {\n        if (!fsmMap.containsKey(fsm.getId())) {\n            fsmMap.put(fsm.getId(), fsm);\n        }\n    }\n\n    public Fsm getFsm(String id) {\n        return fsmMap.get(id);\n    }\n\n    public FsmResult run(FsmParam param) {\n        if (! inited) {\n            throw new FsmException(\"Fsm is not inited. fsmId:\" + param.getFsmId());\n        }\n        boolean logFlag = param.getContext() != null ? param.getContext().isLogOn() : (param.getLogFlag() == null || param.getLogFlag().booleanValue());\n        if (logFlag && logger.isInfoEnabled()) {\n            logger.info(\"FSM MANAGER RUN. fsmId: \" + param.getFsmId() + \" event:\" + param.getEventId() + \" currentStateId:\"\n                    + param.getCurrentStateId() + \" opType:\" + param.getOpType());\n        }\n        param.put(FsmConstants.PARAM_KEY_EL_EVALUATOR, this.getElEvaluator());\n        if (filters == null || filters.size() == 0) {\n            return invokeFsm(param);\n        } else {\n            FilterChain<Pair<FsmParam, CoreFsmManager>, FsmResult> chain = new FilterChain<Pair<FsmParam, CoreFsmManager>, FsmResult>(filters, p -> invokeFsm(p.getLeft()));\n            return chain.doFilter(Pair.of(param, this));\n        }\n    }\n\n    protected FsmResult invokeFsm(FsmParam param) {\n        // No fsm manager listener scenario.\n        if (eventTrigger.getListenerList() == null || eventTrigger.getListenerList().size() == 0) {\n            Fsm fsm = getFsm(param.getFsmId());\n            if (fsm == null) {\n                throw new RuntimeException(\"FSM:\" + param.getFsmId() + \" not exists\");\n            }\n            FsmResult result = fsm.run(param);\n            return result;\n        }\n        // Has fsm manager listener scenario.\n        Map<String, Object> data = new HashMap<>();\n        data.put(FsmConstants.FSM_MANAGER_EVENT_DATA_KEY_PARAM, param);\n        data.put(FsmConstants.FSM_MANAGER_EVENT_DATA_KEY_FSM_MANAGER, this);\n        try {\n            eventTrigger.triggerEvent(FsmEventTypes.FSM_MANAGER_START, data, null, false);\n            Fsm fsm = getFsm(param.getFsmId());\n            if (fsm == null) {\n                throw new RuntimeException(\"FSM:\" + param.getFsmId() + \" not exists\");\n            }\n            FsmResult result = fsm.run(param);\n            data.put(FsmConstants.FSM_MANAGER_EVENT_DATA_KEY_RESULT, result);\n            eventTrigger.triggerEvent(FsmEventTypes.FSM_MANAGER_END, data, null, false);\n            return result;\n        } catch (Throwable t) {\n            data.put(FsmConstants.FSM_MANAGER_EVENT_DATA_KEY_EXCEPTION, t);\n            throw t;\n        } finally {\n            eventTrigger.triggerEvent(FsmEventTypes.FSM_MANAGER_COMPLETE, data, null, true);\n        }\n    }\n\n    public String getFsmPath() {\n        return fsmPath;\n    }\n\n    public void setFsmPath(String fsmPath) {\n        this.fsmPath = fsmPath;\n    }\n\n    public List<FsmEventListener> getListeners() {\n        return listeners;\n    }\n\n    public void setListeners(List<FsmEventListener> listeners) {\n        this.listeners = listeners;\n    }\n\n    public Map<String, Fsm> getFsmMap() {\n        return fsmMap;\n    }\n\n    public void setFsmMap(Map<String, Fsm> fsmMap) {\n        this.fsmMap = fsmMap;\n    }\n\n    public FsmEventTrigger getEventTrigger() {\n        return eventTrigger;\n    }\n\n    public void setEventTrigger(FsmEventTrigger eventTrigger) {\n        this.eventTrigger = eventTrigger;\n    }\n\n    public Map<String, String> getFsmDefinitionMap() {\n        return fsmDefinitionMap;\n    }\n\n    public void setFsmDefinitionMap(Map<String, String> fsmDefinitionMap) {\n        this.fsmDefinitionMap = fsmDefinitionMap;\n    }\n\n\n    public boolean isInited() {\n        return inited;\n    }\n\n    public void setInited(boolean inited) {\n        this.inited = inited;\n    }\n\n    public List<Filter<Pair<FsmParam, CoreFsmManager>, FsmResult>> getFilters() {\n        return filters;\n    }\n\n    public void setFilters(List<Filter<Pair<FsmParam, CoreFsmManager>, FsmResult>> filters) {\n        this.filters = filters;\n    }\n\n\n    public Map<String, Object> getProperties() {\n        return properties;\n    }\n\n    public void setProperties(Map<String, Object> properties) {\n        this.properties = properties;\n    }\n    \n    public <T>T getProperty(String key) {\n        return (T) properties.get(key);\n    }\n    \n    public void setProperty(String key, Object value) {\n        properties.put(key, value);\n    }\n\n    public ElEvaluator getElEvaluator() {\n        return elEvaluator;\n    }\n\n    public void setElEvaluator(ElEvaluator elEvaluator) {\n        this.elEvaluator = elEvaluator;\n    }\n    \n    \n\n\n    \n    \n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/Fsm.java",
    "content": "package com.jd.easyflow.fsm;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.fsm.el.ElEvaluator;\nimport com.jd.easyflow.fsm.el.ElFactory;\nimport com.jd.easyflow.fsm.event.FsmEventListener;\nimport com.jd.easyflow.fsm.event.FsmEventTrigger;\nimport com.jd.easyflow.fsm.filter.Filter;\nimport com.jd.easyflow.fsm.filter.FilterChain;\nimport com.jd.easyflow.fsm.model.Event;\nimport com.jd.easyflow.fsm.model.FsmLifeCycle;\nimport com.jd.easyflow.fsm.model.FsmPostHandler;\nimport com.jd.easyflow.fsm.model.FsmPreHandler;\nimport com.jd.easyflow.fsm.model.InitContext;\nimport com.jd.easyflow.fsm.model.PostHandleResult;\nimport com.jd.easyflow.fsm.model.State;\nimport com.jd.easyflow.fsm.model.Transition;\nimport com.jd.easyflow.fsm.model.TransitionContext;\nimport com.jd.easyflow.fsm.util.FsmConstants;\nimport com.jd.easyflow.fsm.util.FsmEventTypes;\nimport com.jd.easyflow.fsm.util.JsonUtil;\nimport com.jd.easyflow.fsm.util.Pair;\nimport com.jd.easyflow.fsm.util.Triple;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class Fsm implements FsmLifeCycle {\n\n    public static final Logger logger = LoggerFactory.getLogger(Fsm.class);\n\n    public static final String DOLLAR = \"$\";\n    \n    private static final String FSM_STRING_KEY = \"_fsm_string\";\n\n    private String id;\n\n    private String name;\n\n    private FsmPreHandler preHandler;\n\n    private FsmPostHandler postHandler;\n\n    private List<State> stateList = new ArrayList<State>();\n\n    private String startStateId;\n\n    private Map<String, State> stateMap = new HashMap<String, State>();\n\n    private Map<String, Integer> stateIndexMap = new HashMap<>();\n\n    private List<Event> eventList = new ArrayList<Event>();\n\n    private Map<String, Event> eventMap = new HashMap<String, Event>();\n\n    private List<Transition> transitionList = new ArrayList<Transition>();\n\n    private Map<String, Transition> transitionMap = new HashMap<String, Transition>();\n\n    private FsmEventTrigger eventTrigger = new FsmEventTrigger();\n\n    private Map<String, Object> properties = new ConcurrentHashMap<String, Object>();\n\n    private List<Filter<FsmContext, FsmResult>> filters;\n\n    private List<Filter<Triple<Transition, TransitionContext, FsmContext>, Void>> transitionFilters;\n    \n    private List<Filter<Pair<TransitionContext, FsmContext>, Object>> transitionActionFilters;   \n\n    private List<Filter<Pair<TransitionContext, FsmContext>, Boolean>> transitionPreHandlerFilters;\n    \n    private List<Filter<Pair<TransitionContext, FsmContext>, PostHandleResult>> transitionPostHandlerFilters;\n    \n    private Boolean logFlag;\n    \n    @Override\n    public void init(InitContext initContext, Object parent) {\n        if (preHandler != null) {\n            preHandler.init(initContext, this);\n        }\n        if (transitionList != null) {\n            for (Transition transition : transitionList) {\n                transition.init(initContext, this);\n            }\n        }\n        if (postHandler != null) {\n            postHandler.init(initContext, this);\n        }\n        eventTrigger.init(initContext, this);\n        if (filters != null) {\n            for (Filter filter : filters) {\n                filter.init(initContext, this);\n            }\n        }\n        if (transitionFilters != null) {\n            for (Filter filter : transitionFilters) {\n                filter.init(initContext, this);\n            }\n        }\n        if (transitionActionFilters != null) {\n            for (Filter filter : transitionActionFilters) {\n                filter.init(initContext, this);\n            }\n        }\n        if (transitionPreHandlerFilters != null) {\n            for (Filter filter : transitionPreHandlerFilters) {\n                filter.init(initContext, this);\n            }\n        }\n        if (transitionPostHandlerFilters != null) {\n            for (Filter filter : transitionPostHandlerFilters) {\n                filter.init(initContext, this);\n            }\n        }\n        \n    }\n\n    /**\n     * \n     * @param event\n     * @param context\n     */\n    public FsmResult run(FsmParam param) {\n        boolean logFlag = param.getContext() != null ? param.getContext().isLogOn() : (param.getLogFlag() == null || param.getLogFlag().booleanValue());\n        if (logFlag && logger.isInfoEnabled()) {\n            logger.info(\"FSM START,fsmId: \" + param.getFsmId() + \" event:\" + param.getEventId() + \" currentStateId:\"\n                    + param.getCurrentStateId() + \" opType:\" + param.getOpType());\n        }\n        if (logFlag && logger.isDebugEnabled()) {\n            try {\n                logger.debug(\"Param:\" + JsonUtil.toJsonString(param));\n            } catch (Throwable t) {\n                logger.debug(\"Param to json string exception:\" + t.getMessage());\n            }\n        }\n        FsmContext context = initContext(param);\n        if (filters == null || filters.size() == 0) {\n            return invokeFsm(context);\n        } else {\n            FilterChain<FsmContext, FsmResult> chain = new FilterChain<FsmContext, FsmResult>(filters,\n                    p -> invokeFsm(p));\n            return chain.doFilter(context);\n        }\n    }\n\n    protected FsmResult invokeFsm(FsmContext context) {\n        Throwable throwable = null;\n        try {\n            eventTrigger.triggerEvent(FsmEventTypes.FSM_START, context);\n            // init start state\n            initStartState(context);\n            if (this.preHandler != null) {\n                boolean preResult = this.preHandler.preHandle(context);\n                context.setPreResult(preResult);\n                if (!preResult) {\n                    if (context.isLogOn()) {\n                        logger.info(\"pre result false\");\n                    }\n                    eventTrigger.triggerEvent(FsmEventTypes.FSM_END, context);\n                    return wrapResult(context);\n                }\n            }\n            while (true) {\n                if (context.isInterrupted()) {\n                    if (context.isLogOn() && logger.isInfoEnabled()) {\n                        logger.info(\"fsm interrupted\");\n                    }\n                    break;\n                }\n\n                State currentState = context.getCurrentState();\n                Event currentEvent = context.getCurrentEvent();\n                if (context.isLogOn() && logger.isInfoEnabled()) {\n                    logger.info(\"Current state:\" + (currentState == null ? null : currentState.getId()) + \", Current event:\"\n                            + (currentEvent == null ? null : currentEvent.getId()));\n                }\n                if (currentState == null) {\n                    throw new RuntimeException(\"Current state is null\");\n                }\n                if (currentEvent == null) {\n                    if (context.isLogOn() && logger.isInfoEnabled()) {\n                        logger.info(\"Current event is null, EXIT\");\n                    }\n                    break;\n                }\n                String transitionKey = createTransitionKey(currentState, currentEvent);\n                Transition transition = transitionMap.get(transitionKey);\n                if (transition == null) {\n                    if (context.isLogOn()) {\n                        logger.warn(\"No transition found, currentState:\" + currentState.getId() + \" currentEvent:\"\n                                + currentEvent.getId() + \", EXIT\");\n                    }\n                    break;\n                }\n                beforeTransition(context);\n                TransitionContext transitionContext = new TransitionContext();\n                transitionContext.setTransition(transition);\n                if (context.isRecordHistory()) {\n                    context.addTransition(transitionContext);\n                }\n                try {\n                    runTransition(transition, transitionContext, context);\n                } catch (Throwable t) { // NOSONAR\n                    transitionContext.setThrowable(t);\n                    throw t;\n                }\n                afterTransition(context);\n\n            }\n            if (this.postHandler != null) {\n                this.postHandler.postHandle(context);\n            }\n            eventTrigger.triggerEvent(FsmEventTypes.FSM_END, context);\n            return wrapResult(context);\n        } catch (Throwable t) { // NOSONAR\n            throwable = t;\n            if (context.isLogOn() && logger.isErrorEnabled()) {\n                logger.error(\"Fsm execute exception, fsmId:\" + this.id + \",\" +  t.getMessage());\n            }\n            throw t;\n        } finally {\n            eventTrigger.triggerEvent(FsmEventTypes.FSM_COMPLETE, throwable, context, true);\n        }\n    }\n\n    private void runTransition(Transition transition, TransitionContext transitionContext, FsmContext context) {\n        if (this.transitionFilters == null || this.transitionFilters.size() == 0) {\n            invokeTransition(transition, transitionContext, context);\n            return;\n        }\n        FilterChain<Triple<Transition, TransitionContext, FsmContext>, Void> chain = new FilterChain<Triple<Transition, TransitionContext, FsmContext>, Void>(\n                this.transitionFilters, p -> {\n                    invokeTransition(transition, transitionContext, context);\n                    return null;\n                });\n        chain.doFilter(Triple.of(transition, transitionContext, context));\n    }\n\n    private void invokeTransition(Transition transition, TransitionContext transitionContext, FsmContext context) {\n        Throwable tstThrowable;\n        try {\n            eventTrigger.triggerEvent(FsmEventTypes.TST_START, transitionContext, context, false);\n            transition.execute(transitionContext, context);\n            eventTrigger.triggerEvent(FsmEventTypes.TST_END, transitionContext, context, false);\n        } catch (Throwable t) { // NOSONAR\n            tstThrowable = t;\n            transitionContext.setThrowable(tstThrowable);\n            if (context.isLogOn() && logger.isErrorEnabled()) {\n                logger.error(\"Transition Exception, fromId:\" + transition.getFromId() + \" eventId:\" + transition.getEventId());\n            }\n            throw t;\n        } finally {\n            eventTrigger.triggerEvent(FsmEventTypes.TST_COMPLETE, transitionContext, context, true);\n        }\n    }\n\n    /**\n     * \n     * Init Context, Event and state should in context.\n     *\n     * @param param\n     * @return\n     */\n    public FsmContext initContext(FsmParam param) {\n        FsmContext context = param.getContext() != null ? param.getContext() : new FsmContext();\n        FsmResult result = new FsmResult();\n        context.setParam(param);\n        context.setResult(result);\n        result.setContext(context);\n        context.setFsm(this);\n        if (param.getCurrentStateId() != null) {\n            State state = getState(param.getCurrentStateId());\n            if (state == null) {\n                logger.warn(\"State:\" + param.getCurrentStateId() + \" not exists\");\n            }\n            context.setCurrentState(state);\n        }\n        if (param.getEventId() != null) {\n            Event event = getEvent(param.getEventId());\n            if (event == null) {\n                logger.warn(\"Event:\" + param.getEventId() + \" not exists\");\n            }\n            context.setCurrentEvent(event);\n        }\n        if (context.getElEvaluator() == null) {\n            ElEvaluator elEvaluator = param.get(FsmConstants.PARAM_KEY_EL_EVALUATOR);\n            if (elEvaluator == null) {\n                elEvaluator = ElFactory.get();\n            }\n            context.setElEvaluator(elEvaluator);\n        }\n        // set log flag\n        if (context.getLogFlag() == null) {\n            if (param.getLogFlag() != null) {\n                context.setLogFlag(param.getLogFlag());\n            } else {\n                context.setLogFlag(this.getLogFlag());\n            }\n        }\n        return context;\n    }\n\n    private State initStartState(FsmContext context) {\n        State currentState = context.getCurrentState();\n        if (currentState == null) {\n            currentState = getState(startStateId);\n            context.setCurrentState(currentState);\n        }\n        return currentState;\n    }\n\n    public FsmResult wrapResult(FsmContext context) {\n        FsmResult result = context.getResult();\n        result.setInstance(context.getStateInstance());\n        result.setInstanceId(context.getStateInstanceId());\n        result.setState(context.getCurrentState());\n        result.setResult(context.getFirstTransitionActionResult());\n\n        result.setTransitionExecuted(context.isTransitionExecuted());\n        result.setFirstTransition(context.isFirstTransition());\n\n        result.setFirstTransitionState(context.getFirstTransitionState());\n        result.setFirstTransitionEvent(context.getFirstTransitionEvent());\n        result.setFirstTransitionResult(context.getFirstTransitionActionResult());\n\n        result.setLastTransitionState(context.getTransitionState());\n        result.setLastTransitionEvent(context.getTransitionEvent());\n        result.setLastTransitionResult(context.getTransitionActionResult());\n\n        return result;\n    }\n    \n    public void destroy() {\n        if (preHandler != null) {\n            preHandler.destroy();\n        }\n        if (transitionList != null) {\n            for (Transition transition : transitionList) {\n                transition.destroy();\n            }\n        }\n        if (postHandler != null) {\n            postHandler.destroy();\n        }\n        eventTrigger.destroy();\n        if (filters != null) {\n            for (Filter filter : filters) {\n                filter.destroy();\n            }\n        }\n        if (transitionFilters != null) {\n            for (Filter filter : transitionFilters) {\n                filter.destroy();\n            }\n        }\n        if (transitionActionFilters != null) {\n            for (Filter filter : transitionActionFilters) {\n                filter.destroy();\n            }\n        }\n        if (transitionPreHandlerFilters != null) {\n            for (Filter filter : transitionPreHandlerFilters) {\n                filter.destroy();\n            }\n        }\n        if (transitionPostHandlerFilters != null) {\n            for (Filter filter : transitionPostHandlerFilters) {\n                filter.destroy();\n            }\n        }\n        \n    }\n\n    public String getId() {\n        return id;\n    }\n\n    public void setId(String id) {\n        this.id = id;\n    }\n\n    public List<State> getStateList() {\n        return stateList;\n    }\n\n    public void initStateList(List<State> stateList) {\n        for (State state : stateList) {\n            addState(state);\n        }\n    }\n\n    public List<Event> getEventList() {\n        return eventList;\n    }\n\n    public void setEventList(List<Event> eventList) {\n        this.eventList = eventList;\n    }\n\n    public void addState(State state) {\n        if (state.getId().startsWith(DOLLAR)) {\n            throw new IllegalArgumentException(\"State ID CANNOT start with $\");\n        }\n        if (!stateMap.containsKey(state.getId())) {\n            stateMap.put(state.getId(), state);\n            stateList.add(state);\n            stateIndexMap.put(state.getId(), stateList.size() - 1);\n        }\n    }\n\n    public State getState(String stateId) {\n        return stateMap.get(stateId);\n    }\n\n    public void addEvent(Event event) {\n        if (!eventMap.containsKey(event.getId())) {\n            eventMap.put(event.getId(), event);\n            eventList.add(event);\n        }\n    }\n\n    public Event getEvent(String eventId) {\n        return eventMap.get(eventId);\n    }\n\n    public void addTransition(Transition transition) {\n        String fromId = transition.getFromId();\n        String eventId = transition.getEventId();\n        if (fromId == null) {\n            throw new RuntimeException(\"fromId can not be empty\");\n        }\n        if (eventId == null) {\n            throw new RuntimeException(\"eventId  can not be empty\");\n        }\n        transitionList.add(transition);\n        transitionMap.put(createTransitionKey(fromId, eventId), transition);\n    }\n\n    /**\n     * \n     * Process before transition.\n     *\n     * @param context\n     */\n    public void beforeTransition(FsmContext context) {\n        if (!context.isTransitionExecuted() && context.isFirstTransition()) {\n            context.setFirstTransitionState(context.getCurrentState());\n            context.setFirstTransitionEvent(context.getCurrentEvent());\n        }\n        // execute on next transition\n        if (context.isTransitionExecuted()) {\n            context.setFirstTransition(false);\n        }\n        context.setTransitionState(context.getCurrentState());\n        context.setTransitionEvent(context.getCurrentEvent());\n        context.setTransitionActionResult(null);\n        context.setTransitionPostState(null);\n    }\n\n    /**\n     * \n     * Process after transition.\n     *\n     * @param context\n     */\n    public void afterTransition(FsmContext context) {\n        context.setTransitionExecuted(true);\n    }\n\n    private String createTransitionKey(State from, Event event) {\n        return \"state_\" + from.getId() + \"_event_\" + event.getId();\n    }\n\n    private String createTransitionKey(String fromId, String eventId) {\n        return \"state_\" + fromId + \"_event_\" + eventId;\n    }\n\n    public void addListener(FsmEventListener listener) {\n        eventTrigger.addListener(listener);\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public List<Transition> getTransitionList() {\n        return transitionList;\n    }\n\n    public void setTransitionList(List<Transition> transitionList) {\n        this.transitionList = transitionList;\n    }\n\n    public String getStartStateId() {\n        return startStateId;\n    }\n\n    public void setStartStateId(String startStateId) {\n        this.startStateId = startStateId;\n    }\n\n    public FsmEventTrigger getEventTrigger() {\n        return eventTrigger;\n    }\n\n    public void setEventTrigger(FsmEventTrigger eventTrigger) {\n        this.eventTrigger = eventTrigger;\n    }\n\n    public void setProperty(String key, Object value) {\n        if (value == null) {\n            properties.remove(key);\n        } else {\n            properties.put(key, value);\n        }\n    }\n\n    public <T> T getProperty(String key) {\n        return (T) properties.get(key);\n    }\n\n    public Map<String, Object> getProperties() {\n        return properties;\n    }\n    \n    public void setProperties(Map<String, Object> properties) {\n        this.properties.clear();\n        putProperties(properties);\n    }\n\n    \n    public void putProperties(Map<String, Object> properties) {\n        if (properties == null) {\n            return;\n        }\n        for (Entry<String, Object> entry : properties.entrySet()) {\n            if (entry.getValue() == null) {\n                this.properties.remove(entry.getKey());\n            } else {\n                this.properties.put(entry.getKey(), entry.getValue());\n            }\n        }\n    }\n\n    public List<Filter<FsmContext, FsmResult>> getFilters() {\n        return filters;\n    }\n\n    public void setFilters(List<Filter<FsmContext, FsmResult>> filters) {\n        this.filters = filters;\n    }\n\n    public void addFilter(Filter<FsmContext, FsmResult> filter) {\n        if (this.filters == null) {\n            this.filters = new ArrayList<Filter<FsmContext, FsmResult>>();\n        }\n        this.filters.add(filter);\n    }\n\n    public List<Filter<Pair<TransitionContext, FsmContext>, Object>> getTransitionActionFilters() {\n        return transitionActionFilters;\n    }\n\n    public void setTransitionActionFilters(\n            List<Filter<Pair<TransitionContext, FsmContext>, Object>> transitionActionFilters) {\n        this.transitionActionFilters = transitionActionFilters;\n    }\n    \n    public List<Filter<Pair<TransitionContext, FsmContext>, Boolean>> getTransitionPreHandlerFilters() {\n        return transitionPreHandlerFilters;\n    }\n\n    public void setTransitionPreHandlerFilters(\n            List<Filter<Pair<TransitionContext, FsmContext>, Boolean>> transitionPreHandlerFilters) {\n        this.transitionPreHandlerFilters = transitionPreHandlerFilters;\n    }\n\n    public List<Filter<Pair<TransitionContext, FsmContext>, PostHandleResult>> getTransitionPostHandlerFilters() {\n        return transitionPostHandlerFilters;\n    }\n\n    public void setTransitionPostHandlerFilters(\n            List<Filter<Pair<TransitionContext, FsmContext>, PostHandleResult>> transitionPostHandlerFilters) {\n        this.transitionPostHandlerFilters = transitionPostHandlerFilters;\n    }\n\n    public void addTransitionActionFilter(Filter<Pair<TransitionContext, FsmContext>, Object> filter) {\n        if (this.transitionActionFilters == null) {\n            this.transitionActionFilters = new ArrayList<Filter<Pair<TransitionContext, FsmContext>, Object>>();\n        }\n        this.transitionActionFilters.add(filter);\n    }\n    \n    public void addTransitionPreHandlerFilter(Filter<Pair<TransitionContext, FsmContext>, Boolean> filter) {\n        if (this.transitionPreHandlerFilters == null) {\n            this.transitionPreHandlerFilters = new ArrayList<Filter<Pair<TransitionContext, FsmContext>, Boolean>>();\n        }\n        this.transitionPreHandlerFilters.add(filter);\n    }\n    \n    public void addTransitionPostHandlerFilter(Filter<Pair<TransitionContext, FsmContext>, PostHandleResult> filter) {\n        if (this.transitionPostHandlerFilters == null) {\n            this.transitionPostHandlerFilters = new ArrayList<Filter<Pair<TransitionContext, FsmContext>, PostHandleResult>>();\n        }\n        this.transitionPostHandlerFilters.add(filter);\n    }\n\n    public List<Filter<Triple<Transition, TransitionContext, FsmContext>, Void>> getTransitionFilters() {\n        return transitionFilters;\n    }\n\n    public void setTransitionFilters(\n            List<Filter<Triple<Transition, TransitionContext, FsmContext>, Void>> transitionFilters) {\n        this.transitionFilters = transitionFilters;\n    }\n\n    public void addTransitionFilter(Filter<Triple<Transition, TransitionContext, FsmContext>, Void> transitionFilter) {\n        if (this.transitionFilters == null) {\n            this.transitionFilters = new ArrayList<Filter<Triple<Transition, TransitionContext, FsmContext>, Void>>();\n        }\n        this.transitionFilters.add(transitionFilter);\n    }\n\n    public int getStateIndex(String stateId) {\n        return stateIndexMap.get(stateId);\n    }\n\n    public FsmPreHandler getPreHandler() {\n        return preHandler;\n    }\n\n    public void setPreHandler(FsmPreHandler preHandler) {\n        this.preHandler = preHandler;\n    }\n\n    public FsmPostHandler getPostHandler() {\n        return postHandler;\n    }\n\n    public void setPostHandler(FsmPostHandler postHandler) {\n        this.postHandler = postHandler;\n    }\n\n    public Boolean getLogFlag() {\n        return logFlag;\n    }\n\n    public void setLogFlag(Boolean logFlag) {\n        this.logFlag = logFlag;\n    }\n    \n    public String stringify() {\n        return this.getProperty(FSM_STRING_KEY);\n    }\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/FsmContext.java",
    "content": "package com.jd.easyflow.fsm;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport com.fasterxml.jackson.annotation.JsonIgnore;\nimport com.jd.easyflow.fsm.el.ElEvaluator;\nimport com.jd.easyflow.fsm.model.Event;\nimport com.jd.easyflow.fsm.model.State;\nimport com.jd.easyflow.fsm.model.TransitionContext;\nimport com.jd.easyflow.fsm.util.FsmConstants;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FsmContext {\n    \n    private State currentState;\n\n    private State previousState;\n\n    private Event currentEvent;\n\n    private Event previousEvent;\n\n    private Object stateInstance;\n\n    private String stateInstanceId;\n\n    @JsonIgnore\n    private Fsm fsm;\n\n    FsmParam param;\n\n    FsmResult result;\n    \n    private boolean transitionExecuted = false;\n\n    private boolean firstTransition = true;\n    \n\n    private State firstTransitionState;\n\n    private Event firstTransitionEvent;\n\n    private State firstTransitionPostState;\n\n    private Object firstTransitionActionResult;\n    \n    /**\n     * State of last transition\n     */\n    private State transitionState;\n    /**\n     * Event of last transition\n     */\n    private Event transitionEvent;\n    /**\n     * Last transition post state.\n     */\n    private State transitionPostState;\n    /**\n     * Last transition action result.\n     */\n    private Object transitionActionResult;\n\n    private Map<String, Object> data = new HashMap<String, Object>();\n    /**\n     * Transition list to record history.\n     */\n    private List<TransitionContext> transitionList;\n    /**\n     * Fsm interrupted flag.\n     */\n    private volatile boolean interrupted = false;\n    \n    private Boolean preResult;\n    \n    private Object context;\n    \n    private ElEvaluator elEvaluator;\n    \n    private Boolean logFlag;\n    \n    private Boolean recordHistory;\n\n    public Object getStateInstance() {\n        return stateInstance;\n    }\n\n    public void setStateInstance(Object stateInstance) {\n        this.stateInstance = stateInstance;\n    }\n\n    public String getStateInstanceId() {\n        return stateInstanceId;\n    }\n\n    public void setStateInstanceId(String stateInstanceId) {\n        this.stateInstanceId = stateInstanceId;\n    }\n\n    public State getCurrentState() {\n        return currentState;\n    }\n\n    public void setCurrentState(State currentState) {\n        this.currentState = currentState;\n    }\n\n    public Event getCurrentEvent() {\n        return currentEvent;\n    }\n\n    public void setCurrentEvent(Event currentEvent) {\n        this.currentEvent = currentEvent;\n    }\n\n    public Fsm getFsm() {\n        return fsm;\n    }\n\n    public void setFsm(Fsm fsm) {\n        this.fsm = fsm;\n    }\n\n    public Map<String, Object> getData() {\n        return data;\n    }\n\n    public void setData(Map<String, Object> data) {\n        this.data = data;\n    }\n\n    public <T> T getData(String key) {\n        return (T) data.get(key);\n    }\n\n    public void putData(String key, Object value) {\n        data.put(key, value);\n    }\n\n    public FsmParam getParam() {\n        return param;\n    }\n\n    public void setParam(FsmParam param) {\n        this.param = param;\n    }\n\n    public FsmResult getResult() {\n        return result;\n    }\n\n    public void setResult(FsmResult result) {\n        this.result = result;\n    }\n\n    public boolean isFirstTransition() {\n        return firstTransition;\n    }\n\n    public void setFirstTransition(boolean firstTransition) {\n        this.firstTransition = firstTransition;\n    }\n\n    public Object getTransitionActionResult() {\n        return transitionActionResult;\n    }\n\n    public void setTransitionActionResult(Object transitionActionResult) {\n        this.transitionActionResult = transitionActionResult;\n    }\n\n    public State getPreviousState() {\n        return previousState;\n    }\n\n    public void setPreviousState(State previousState) {\n        this.previousState = previousState;\n    }\n\n    public Event getPreviousEvent() {\n        return previousEvent;\n    }\n\n    public void setPreviousEvent(Event previousEvent) {\n        this.previousEvent = previousEvent;\n    }\n\n    public Object getFirstTransitionActionResult() {\n        return firstTransitionActionResult;\n    }\n\n    public void setFirstTransitionActionResult(Object firstTransitionActionResult) {\n        this.firstTransitionActionResult = firstTransitionActionResult;\n    }\n\n    public State getFirstTransitionPostState() {\n        return firstTransitionPostState;\n    }\n\n    public void setFirstTransitionPostState(State firstTransitionPostState) {\n        this.firstTransitionPostState = firstTransitionPostState;\n    }\n\n    public State getTransitionPostState() {\n        return transitionPostState;\n    }\n\n    public void setTransitionPostState(State transitionPostState) {\n        this.transitionPostState = transitionPostState;\n    }\n\n    public State getFirstTransitionState() {\n        return firstTransitionState;\n    }\n\n    public void setFirstTransitionState(State firstTransitionState) {\n        this.firstTransitionState = firstTransitionState;\n    }\n\n    public Event getFirstTransitionEvent() {\n        return firstTransitionEvent;\n    }\n\n    public void setFirstTransitionEvent(Event firstTransitionEvent) {\n        this.firstTransitionEvent = firstTransitionEvent;\n    }\n\n    public State getTransitionState() {\n        return transitionState;\n    }\n\n    public void setTransitionState(State transitionState) {\n        this.transitionState = transitionState;\n    }\n\n    public Event getTransitionEvent() {\n        return transitionEvent;\n    }\n\n    public void setTransitionEvent(Event transitionEvent) {\n        this.transitionEvent = transitionEvent;\n    }\n\n    public boolean isTransitionExecuted() {\n        return transitionExecuted;\n    }\n\n    public void setTransitionExecuted(boolean transitionExecuted) {\n        this.transitionExecuted = transitionExecuted;\n    }\n    \n    public void addTransition(TransitionContext transition) {\n        if (this.transitionList == null) {\n            this.transitionList = new ArrayList();\n        }\n        this.transitionList.add(transition);\n    }\n\n    public List<TransitionContext> getTransitionList() {\n        return transitionList;\n    }\n\n    public void setTransitionList(List<TransitionContext> transitionList) {\n        this.transitionList = transitionList;\n    }\n\n    public boolean isInterrupted() {\n        return interrupted;\n    }\n\n    public void setInterrupted() {\n        this.interrupted = true;\n    }\n\n    public Boolean getPreResult() {\n        return preResult;\n    }\n\n    public void setPreResult(Boolean preResult) {\n        this.preResult = preResult;\n    }\n\n    public <T>T getContext() {\n        return (T) context;\n    }\n\n    public void setContext(Object context) {\n        this.context = context;\n    }\n\n    public ElEvaluator getElEvaluator() {\n        return elEvaluator;\n    }\n\n    public void setElEvaluator(ElEvaluator elEvaluator) {\n        this.elEvaluator = elEvaluator;\n    }\n\n    public Boolean getLogFlag() {\n        return logFlag;\n    }\n\n    public void setLogFlag(Boolean logFlag) {\n        this.logFlag = logFlag;\n    }\n    \n    public boolean isLogOn() {\n        return logFlag == null || this.logFlag.booleanValue();\n    }\n    \n    public boolean isRecordHistory() {\n        if (recordHistory == null) {\n            recordHistory = ! Boolean.FALSE.equals(fsm.getProperty(FsmConstants.FSM_PROPERTY_RECORD_HISTORY));\n        }\n        return recordHistory;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/FsmManager.java",
    "content": "package com.jd.easyflow.fsm;\n\nimport java.io.IOException;\nimport java.io.InputStream;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.context.ApplicationContext;\nimport org.springframework.context.ApplicationContextAware;\nimport org.springframework.context.SmartLifecycle;\nimport org.springframework.core.io.Resource;\nimport org.springframework.core.io.support.PathMatchingResourcePatternResolver;\n\nimport com.jd.easyflow.fsm.el.ElEvaluator;\nimport com.jd.easyflow.fsm.el.ElFactory;\nimport com.jd.easyflow.fsm.el.SpelEvaluator;\n\n/**\n * Fsm Manager. Adding spring integration based on CoreFsmManager.\n * @author liyuliang5\n *\n */\npublic class FsmManager extends CoreFsmManager implements SmartLifecycle, ApplicationContextAware {\n\n    public static final Logger logger = LoggerFactory.getLogger(FsmManager.class);\n\n    private ApplicationContext applicationContext;\n\n    private int phase = Integer.MIN_VALUE;\n\n    private boolean autoStartup = true;\n\n    private volatile boolean isRunning = false;\n    \n    public FsmManager() {\n        \n    }\n    \n    public FsmManager(String fsmPath) {\n        this.fsmPath =fsmPath;\n    }\n\n    public void init() {\n        if (inited) {\n            return;\n        }\n        if (applicationContext != null) {\n            ElEvaluator elEvaluator = ElFactory.get();\n            if (elEvaluator instanceof SpelEvaluator) {\n                SpelEvaluator spelEvaluator = (SpelEvaluator) elEvaluator;\n                if (spelEvaluator.getApplicationContext() == null) {\n                    spelEvaluator.setApplicationContext(applicationContext);\n                }\n            }           \n        }\n        super.init();\n        inited = true;\n    }\n\n    /**\n     * \n     * Loan fsm.\n     *\n     */\n    protected void loadFsm() {\n        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();\n        Resource[] resources;\n        try {\n            resources = resolver.getResources(fsmPath);\n            for (Resource resource : resources) {\n                logger.info(\"Start parse fsm definition file:\" + resource.getURI());\n                try (InputStream is = resource.getInputStream()) {\n                   loadFsmInputStream(is);\n                }\n            }\n        } catch (IOException e) {\n            throw new RuntimeException(\"Fsm definition file load exception\", e);\n        }\n    }\n\n    public ApplicationContext getApplicationContext() {\n        return applicationContext;\n    }\n\n    @Override\n    public void setApplicationContext(ApplicationContext applicationContext) {\n        this.applicationContext = applicationContext;\n    }\n\n    @Override\n    public void start() {\n        init();\n        isRunning = true;\n    }\n\n    @Override\n    public void stop() {\n        isRunning = false;\n        destroy();\n    }\n\n    @Override\n    public boolean isRunning() {\n        return isRunning;\n    }\n\n    @Override\n    public boolean isAutoStartup() {\n        return autoStartup;\n    }\n\n    @Override\n    public void stop(Runnable callback) {\n        stop();\n        callback.run();\n    }\n\n    @Override\n    public int getPhase() {\n        return phase;\n    }\n\n    public void setPhase(int phase) {\n        this.phase = phase;\n    }\n\n    public void setAutoStartup(boolean autoStartup) {\n        this.autoStartup = autoStartup;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/FsmParam.java",
    "content": "package com.jd.easyflow.fsm;\n\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport com.fasterxml.jackson.annotation.JsonIgnore;\n\n/**\n * \n* \n* Fsm Param.\n* CREATE: No required field.\n* EXECUTE:EventId is necessary.\n* \n* @author liyuliang5\n* @version 1.0\n* @since 1.0\n */\npublic class FsmParam {\n    \n    public enum OpType {\n        /**Create Fsm Instance*/\n        CREATE, \n        /**Execute Fsm*/\n        EXECUTE\n    }\n    \n    private OpType opType = OpType.EXECUTE;\n    \n    private String fsmId;\n    \n    private String bizType;\n    \n    private String instanceId;\n    \n    private Object instance;\n    \n    private String currentStateId;\n    \n    private String eventId;\n    @JsonIgnore\n    private FsmContext context;\n    // business param\n    private Object param;\n    \n    private Map<String, Object> dataMap;\n    \n    private Boolean logFlag;\n\n    public String getInstanceId() {\n        return instanceId;\n    }\n\n    public void setInstanceId(String instanceId) {\n        this.instanceId = instanceId;\n    }\n\n    public String getEventId() {\n        return eventId;\n    }\n\n    public void setEventId(String eventId) {\n        this.eventId = eventId;\n    }\n\n    public FsmContext getContext() {\n        return context;\n    }\n\n    public void setContext(FsmContext context) {\n        this.context = context;\n    }\n\n    public Object getInstance() {\n        return instance;\n    }\n\n    public void setInstance(Object instance) {\n        this.instance = instance;\n    }\n\n    public String getCurrentStateId() {\n        return currentStateId;\n    }\n\n    public void setCurrentStateId(String currentStateId) {\n        this.currentStateId = currentStateId;\n    }\n    \n    public <T>T getParam() {\n        return (T) param;\n    }\n\n    public void setParam(Object param) {\n        this.param = param;\n    }\n\n    public OpType getOpType() {\n        return opType;\n    }\n\n    public void setOpType(OpType opType) {\n        this.opType = opType;\n    }\n\n    public String getFsmId() {\n        return fsmId;\n    }\n\n    public void setFsmId(String fsmId) {\n        this.fsmId = fsmId;\n    }\n\n    public String getBizType() {\n        return bizType;\n    }\n\n    public void setBizType(String bizType) {\n        this.bizType = bizType;\n    }\n    \n\n    public Map<String, Object> getDataMap() {\n        return dataMap;\n    }\n\n    public void setDataMap(Map<String, Object> dataMap) {\n        this.dataMap = dataMap;\n    }\n\n    public void put(String key, Object value) {\n        if (dataMap == null) {\n            dataMap = new ConcurrentHashMap<String, Object>();\n        }\n        if (value == null) {\n            dataMap.remove(key);\n        } else {\n            dataMap.put(key, value);\n        }\n    }\n\n    public <T> T get(String key) {\n        if (dataMap == null) {\n            return null;\n        }\n        return (T) dataMap.get(key);\n    }\n    \n    public void putContextData(String key, Object value) {\n        if (context == null) {\n            context = new FsmContext();\n        }\n        context.putData(key, value);\n    }\n    \n    public void setBizContext(Object bizContext) {\n        if (context == null) {\n            context = new FsmContext();\n        }\n        context.setContext(bizContext);\n    }\n\n    public Boolean getLogFlag() {\n        return logFlag;\n    }\n\n    public void setLogFlag(Boolean logFlag) {\n        this.logFlag = logFlag;\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/FsmResult.java",
    "content": "package com.jd.easyflow.fsm;\n\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport com.fasterxml.jackson.annotation.JsonIgnore;\nimport com.jd.easyflow.fsm.model.Event;\nimport com.jd.easyflow.fsm.model.State;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FsmResult {\n    \n    /**\n     * Fsm instance ID\n     */\n    private String instanceId;\n    /**\n     * Fsm instance\n     */\n    private Object instance;\n    /**\n     * Fsm state\n     */\n    private State state;\n    /**\n     * First transition result!\n     * business result.\n     */\n    private Object result;\n    \n\n    private boolean transitionExecuted;\n    /**\n     * only first transition executed.\n     */\n    private boolean firstTransition;\n\n    /**\n     * First transition result.\n     */\n    private State firstTransitionState;\n    private Event firstTransitionEvent;\n    private Object firstTransitionResult;\n    /**\n     * Last transition result.\n     */\n    private State lastTransitionState;\n    private Event lastTransitionEvent;\n    private Object lastTransitionResult;\n    @JsonIgnore\n    private FsmContext context;\n    \n    /**\n     * common result data.\n     */\n    private Map<String, Object> dataMap;\n    \n\n    public String getInstanceId() {\n        return instanceId;\n    }\n\n    public void setInstanceId(String instanceId) {\n        this.instanceId = instanceId;\n    }\n\n    public Object getInstance() {\n        return instance;\n    }\n\n    public void setInstance(Object instance) {\n        this.instance = instance;\n    }\n\n    public State getState() {\n        return state;\n    }\n\n    public void setState(State state) {\n        this.state = state;\n    }\n\n    public FsmContext getContext() {\n        return context;\n    }\n\n    public void setContext(FsmContext context) {\n        this.context = context;\n    }\n\n    public Object getResult() {\n        return result;\n    }\n\n    public void setResult(Object result) {\n        this.result = result;\n    }\n\n    public boolean isTransitionExecuted() {\n        return transitionExecuted;\n    }\n\n    public void setTransitionExecuted(boolean transitionExecuted) {\n        this.transitionExecuted = transitionExecuted;\n    }\n\n    public boolean isFirstTransition() {\n        return firstTransition;\n    }\n\n    public void setFirstTransition(boolean firstTransition) {\n        this.firstTransition = firstTransition;\n    }\n\n    public State getFirstTransitionState() {\n        return firstTransitionState;\n    }\n\n    public void setFirstTransitionState(State firstTransitionState) {\n        this.firstTransitionState = firstTransitionState;\n    }\n\n    public Event getFirstTransitionEvent() {\n        return firstTransitionEvent;\n    }\n\n    public void setFirstTransitionEvent(Event firstTransitionEvent) {\n        this.firstTransitionEvent = firstTransitionEvent;\n    }\n\n    public Object getFirstTransitionResult() {\n        return firstTransitionResult;\n    }\n\n    public void setFirstTransitionResult(Object firstTransitionResult) {\n        this.firstTransitionResult = firstTransitionResult;\n    }\n\n    public State getLastTransitionState() {\n        return lastTransitionState;\n    }\n\n    public void setLastTransitionState(State lastTransitionState) {\n        this.lastTransitionState = lastTransitionState;\n    }\n\n    public Event getLastTransitionEvent() {\n        return lastTransitionEvent;\n    }\n\n    public void setLastTransitionEvent(Event lastTransitionEvent) {\n        this.lastTransitionEvent = lastTransitionEvent;\n    }\n\n    public Object getLastTransitionResult() {\n        return lastTransitionResult;\n    }\n\n    public void setLastTransitionResult(Object lastTransitionResult) {\n        this.lastTransitionResult = lastTransitionResult;\n    }\n\n    public Map<String, Object> getDataMap() {\n        return dataMap;\n    }\n\n    public void setDataMap(Map<String, Object> dataMap) {\n        this.dataMap = dataMap;\n    }\n\n    public void put(String key, Object value) {\n        if (dataMap == null) {\n            dataMap = new ConcurrentHashMap<>();\n        }\n        if (value == null) {\n            dataMap.remove(key);\n        } else {\n            dataMap.put(key, value);\n        }\n    }\n\n    public <T> T get(String key) {\n        if (dataMap == null) {\n            return null;\n        }\n        return (T) dataMap.get(key);\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/builder/FsmBuilder.java",
    "content": "package com.jd.easyflow.fsm.builder;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Map;\n\nimport com.jd.easyflow.fsm.Fsm;\nimport com.jd.easyflow.fsm.FsmContext;\nimport com.jd.easyflow.fsm.FsmResult;\nimport com.jd.easyflow.fsm.event.FsmEventListener;\nimport com.jd.easyflow.fsm.filter.Filter;\nimport com.jd.easyflow.fsm.model.Event;\nimport com.jd.easyflow.fsm.model.FsmPostHandler;\nimport com.jd.easyflow.fsm.model.FsmPreHandler;\nimport com.jd.easyflow.fsm.model.InitContext;\nimport com.jd.easyflow.fsm.model.PostHandleResult;\nimport com.jd.easyflow.fsm.model.State;\nimport com.jd.easyflow.fsm.model.Transition;\nimport com.jd.easyflow.fsm.model.TransitionAction;\nimport com.jd.easyflow.fsm.model.TransitionContext;\nimport com.jd.easyflow.fsm.model.TransitionPostHandler;\nimport com.jd.easyflow.fsm.model.TransitionPreHandler;\nimport com.jd.easyflow.fsm.model.builder.TransitionBuilder;\nimport com.jd.easyflow.fsm.model.impl.EventImpl;\nimport com.jd.easyflow.fsm.model.impl.StateImpl;\nimport com.jd.easyflow.fsm.util.Pair;\nimport com.jd.easyflow.fsm.util.Triple;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FsmBuilder {\n\n    private Fsm fsm;\n\n    private FsmBuilder() {\n        // NOOP\n    }\n\n    public static FsmBuilder create(String id) {\n        return create(id, null);\n    }\n\n    public static FsmBuilder create(String id, String name) {\n        FsmBuilder builder = new FsmBuilder();\n        Fsm fsm = new Fsm();\n        fsm.setId(id);\n        fsm.setName(name);\n        builder.fsm = fsm;\n        return builder;\n    }\n\n    public FsmBuilder state(State state) {\n        fsm.addState(state);\n        return this;\n    }\n    \n    public FsmBuilder startState(State state) {\n        fsm.addState(state);\n        fsm.setStartStateId(state.getId());\n        return this;\n    }\n    \n    public FsmBuilder startState(String stateId) {\n        return startState(addState(stateId));\n    }\n    \n    \n\n    public FsmBuilder state(String id, String name) {\n        return state(id, name, false);\n    }\n    \n    public FsmBuilder state(String id, String name, boolean start) {\n        StateImpl state = new StateImpl(id, name);\n        fsm.addState(state);\n        if (start) {\n            fsm.setStartStateId(id);\n        }\n        return this;\n    }\n\n    public FsmBuilder states(State[] states) {\n        for (State state : states) {\n            fsm.addState(state);\n        }\n        return this;\n    }\n\n    public FsmBuilder event(Event event) {\n        fsm.addEvent(event);\n        return this;\n    }\n\n    public FsmBuilder event(String id, String name) {\n        EventImpl event = new EventImpl(id, name);\n        fsm.addEvent(event);\n        return this;\n    }\n\n    public FsmBuilder events(Event[] events) {\n        for (Event event : events) {\n            fsm.addEvent(event);\n        }\n        return this;\n    }\n\n    public FsmBuilder transition(String fromId, String eventId, String toId) {\n        State from = addState(fromId);\n        Event event = addEvent(eventId);\n        State to = addState(toId);\n        transition(from, event, to);\n        return this;\n    }\n\n    public FsmBuilder transition(State from, Event event, State to) {\n        TransitionBuilder builder = TransitionBuilder.create();\n        builder.fromId(from.getId()).eventId(event.getId()).to(to)\n                .toIdList(to == null ? null : Arrays.asList(to.getId()));\n        Transition transition = builder.build();\n        fsm.addState(from);\n        if (to != null) {\n            fsm.addState(to);\n        }\n        fsm.addEvent(event);\n        fsm.addTransition(transition);\n        return this;\n    }\n\n    public FsmBuilder transition(Transition transition) {\n        addState(transition.getFromId());\n        addEvent(transition.getEventId());\n        if (transition.getToIdList() != null) {\n            for (String toId : transition.getToIdList()) {\n                addState(toId);\n            }\n        }\n        fsm.addTransition(transition);\n        return this;\n    }\n\n    public FsmBuilder transition(String fromId, String eventId, List<String> toIdList, TransitionPreHandler preHandler,\n            TransitionAction action, TransitionPostHandler postHandler) {\n        State from = addState(fromId);\n        Event event = addEvent(eventId);\n\n        List<State> toList = new ArrayList<>();\n        if (toIdList != null) {\n            for (String toId : toIdList) {\n                State to = addState(toId);\n                toList.add(to);\n            }\n        }\n        transition(from, event, toList, preHandler, action, postHandler);\n        return this;\n    }\n\n    public FsmBuilder transition(State from, Event event, List<State> toList, TransitionPreHandler preHandler,\n            TransitionAction action, TransitionPostHandler postHandler) {\n        fsm.addState(from);\n        fsm.addEvent(event);\n        for (State to : toList) {\n            fsm.addState(to);\n        }\n\n        List<String> toIdList = new ArrayList<>();\n        for (State to : toList) {\n            toIdList.add(to.getId());\n        }\n        TransitionBuilder builder = TransitionBuilder.create();\n        builder.fromId(from.getId()).eventId(event.getId()).toIdList(toIdList).preHandler(preHandler).action(action)\n                .postHandler(postHandler);\n        Transition transition = builder.build();\n        fsm.addTransition(transition);\n        return this;\n    }\n    \n    public FsmBuilder listener(FsmEventListener listener) {\n        fsm.addListener(listener);\n        return this;\n    }\n    \n    public FsmBuilder filter(Filter<FsmContext, FsmResult> filter) {\n        fsm.addFilter(filter);\n        return this;\n    }\n    \n    public FsmBuilder transitionFilter(Filter<Triple<Transition, TransitionContext, FsmContext>, Void> filter) {\n        fsm.addTransitionFilter(filter);\n        return this;\n    }\n    \n    public FsmBuilder transitionActionFilter(Filter<Pair<TransitionContext, FsmContext>, Object> filter) {\n        fsm.addTransitionActionFilter(filter);\n        return this;\n    }\n    \n    public FsmBuilder transitionPreHandlerFilter(Filter<Pair<TransitionContext, FsmContext>, Boolean> filter) {\n        fsm.addTransitionPreHandlerFilter(filter);\n        return this;\n    }\n    \n    public FsmBuilder transitionPostHandlerFilter(Filter<Pair<TransitionContext, FsmContext>, PostHandleResult> filter) {\n        fsm.addTransitionPostHandlerFilter(filter);\n        return this;\n    }\n    \n    public FsmBuilder properties(Map<String, Object> properties) {\n        fsm.setProperties(properties);\n        return this;\n    }\n    \n    public FsmBuilder putProperties(Map<String, Object> properties) {\n        fsm.putProperties(properties);\n        return this;\n    }\n    \n    public FsmBuilder fsmPreHandler(FsmPreHandler preHandler) {\n        fsm.setPreHandler(preHandler);\n        return this;\n    }\n    \n    public FsmBuilder fsmPostHandler(FsmPostHandler postHandler) {\n        fsm.setPostHandler(postHandler);\n        return this;\n    }\n    \n    public FsmBuilder logFlag(Boolean logFlag) {\n        fsm.setLogFlag(logFlag);;\n        return this;\n    }\n    \n    public Fsm build() {\n        return fsm;\n    }\n    \n    public Fsm buildAndInit() {\n        InitContext initContext = new InitContext();\n        initContext.setParseEl(true);\n        initContext.setFsmDefinitionMap(null);\n        initContext.setFsm(fsm);\n        fsm.init(initContext, null);\n        return fsm;\n    }\n    \n    private State addState(String stateId) {\n        if (stateId == null) {\n            return null;\n        }\n        State state = fsm.getState(stateId);\n        if (state == null) {\n            state = new StateImpl(stateId);\n            fsm.addState(state);\n        }\n        return state;\n    }\n    \n    private Event addEvent(String eventId) {\n        Event event = fsm.getEvent(eventId);\n        if (event == null) {\n            event = new EventImpl(eventId);\n            fsm.addEvent(event);\n        }\n        return event;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/builder/FsmContextBuilder.java",
    "content": "package com.jd.easyflow.fsm.builder;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FsmContextBuilder {\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/el/ElEvaluator.java",
    "content": "package com.jd.easyflow.fsm.el;\n\nimport java.util.Map;\n\nimport com.jd.easyflow.fsm.FsmContext;\nimport com.jd.easyflow.fsm.model.TransitionContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic interface ElEvaluator {\n    \n    /**\n     * Evaluate value using default context.\n     * @param <T>\n     * @param exp\n     * @param root\n     * @param cache\n     * @return\n     */\n    <T> T evalWithDefaultContext(String exp, Object root, boolean cache);\n    \n    /**\n     * Evaluate EL\n     * @param <T>\n     * @param exp\n     * @param transitionContext\n     * @param fsmContext\n     * @param data\n     * @return\n     */\n    <T> T eval(String exp, TransitionContext transitionContext, FsmContext fsmContext, Map<String, Object> data);\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/el/ElFactory.java",
    "content": "package com.jd.easyflow.fsm.el;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ElFactory {\n    \n    private static ElEvaluator defaultEvaluator = new SpelEvaluator();\n    \n    public static ElEvaluator get() {\n        return defaultEvaluator;\n    }\n    \n    public static void setDefaultEvaluator(ElEvaluator evaluator) {\n        defaultEvaluator = evaluator;\n    }\n    \n    public void setDefault(ElEvaluator evaluator) {\n        ElFactory.defaultEvaluator = evaluator;\n    }\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/el/ElRootMap.java",
    "content": "package com.jd.easyflow.fsm.el;\n\nimport java.util.Collection;\nimport java.util.Map;\nimport java.util.Set;\n\nimport com.jd.easyflow.fsm.FsmContext;\nimport com.jd.easyflow.fsm.FsmParam;\nimport com.jd.easyflow.fsm.FsmResult;\nimport com.jd.easyflow.fsm.model.TransitionContext;\n\n/**\n * \n * @author liyuliang5\n */\npublic class ElRootMap implements Map<String, Object> {\n\n    private static final String KEY_CONTEXT = \"context\";\n    private static final String KEY_BIZ_CONTEXT = \"bizContext\";\n    private static final String KEY_PARAM = \"param\";\n    private static final String KEY_BIZ_PARAM = \"bizParam\";\n    private static final String KEY_PARAM_DATA = \"paramData\";\n    private static final String KEY_RESULT = \"result\";\n    private static final String KEY_BIZ_RESULT = \"bizResult\";\n    private static final String KEY_TRANSITION_CONTEXT = \"transitionContext\";\n    private static final String KEY_ACTION_RESULT = \"actionResult\";\n    private static final String KEY_TRANSITION_BIZ_CONTEXT = \"transitionBizContext\";\n\n    FsmContext context;\n\n    Object bizContext;\n\n    FsmParam param;\n\n    Object paramData;\n    \n    Object bizParam;\n\n    FsmResult result;\n\n    Object bizResult;\n\n    TransitionContext transitionContext;\n    \n    Object actionResult;\n    \n    Object transitionBizContext;\n\n    Map<String, Object> data;\n\n\n    @Override\n    public boolean isEmpty() {\n        return false;\n    }\n\n    @Override\n    public boolean containsKey(Object key) {\n        if (key == null) {\n            return data == null ? false : data.containsKey(key);\n        }\n        if (key instanceof String) {\n            switch ((String) key) {\n            case KEY_CONTEXT:\n            case KEY_BIZ_CONTEXT:\n            case KEY_PARAM:\n            case KEY_BIZ_PARAM:\n            case KEY_PARAM_DATA:\n            case KEY_RESULT:\n            case KEY_BIZ_RESULT:\n            case KEY_TRANSITION_CONTEXT:\n            case KEY_ACTION_RESULT:\n            case KEY_TRANSITION_BIZ_CONTEXT:\n                return true;\n            default:\n                return data == null ? false : data.containsKey(key);\n            }\n        }\n        return false;\n    }\n\n    @Override\n    public Object get(Object key) {\n        if (key == null) {\n            return data == null ? null : data.get(key);\n        }\n        if (key.getClass() == String.class) {\n            Object value = null;\n            switch ((String) key) {\n            case KEY_CONTEXT:\n                value = context;\n                break;\n            case KEY_BIZ_CONTEXT:\n                value = bizContext;\n                break;\n            case KEY_PARAM:\n                value = param;\n                break;\n            case KEY_BIZ_PARAM:\n                return bizParam;\n            case KEY_PARAM_DATA:\n                value = paramData;\n                break;\n            case KEY_RESULT:\n                value = result;\n                break;\n            case KEY_BIZ_RESULT:\n                value = bizResult;\n                break;\n            case KEY_TRANSITION_CONTEXT:\n                value = transitionContext;\n                break;\n            case KEY_ACTION_RESULT:\n                value = actionResult;\n                break;\n            case KEY_TRANSITION_BIZ_CONTEXT:\n                value = transitionBizContext;\n                break;\n            default:\n                // NOOP\n            }\n            if (value == null && data != null) {\n                value = data.get(key);\n            }\n            return value;            \n        }\n        return null;\n    }\n    \n    @Override\n    public int size() {\n        throw new UnsupportedOperationException();\n    }\n\n    @Override\n    public boolean containsValue(Object value) {\n        throw new UnsupportedOperationException();\n    }\n\n    @Override\n    public Object put(String key, Object value) {\n        throw new UnsupportedOperationException();\n    }\n\n    @Override\n    public Object remove(Object key) {\n        throw new UnsupportedOperationException();\n    }\n\n    @Override\n    public void putAll(Map<? extends String, ? extends Object> m) {\n        throw new UnsupportedOperationException();\n\n    }\n\n    @Override\n    public void clear() {\n        throw new UnsupportedOperationException();\n\n    }\n\n    @Override\n    public Set<String> keySet() {\n        throw new UnsupportedOperationException();\n    }\n\n    @Override\n    public Collection<Object> values() {\n        throw new UnsupportedOperationException();\n    }\n\n    @Override\n    public Set<Entry<String, Object>> entrySet() {\n        throw new UnsupportedOperationException();\n    }\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/el/SpelEvaluator.java",
    "content": "package com.jd.easyflow.fsm.el;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.context.ApplicationContext;\nimport org.springframework.context.expression.BeanFactoryResolver;\nimport org.springframework.context.expression.MapAccessor;\nimport org.springframework.expression.Expression;\nimport org.springframework.expression.ExpressionParser;\nimport org.springframework.expression.spel.standard.SpelExpressionParser;\nimport org.springframework.expression.spel.support.StandardEvaluationContext;\n\nimport com.jd.easyflow.fsm.FsmContext;\nimport com.jd.easyflow.fsm.model.TransitionContext;\nimport com.jd.easyflow.fsm.util.JsonUtil;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class SpelEvaluator implements ElEvaluator {\n\n    private static final Logger logger = LoggerFactory.getLogger(SpelEvaluator.class);\n\n    // Normal implementation.\n    public static final int ROOT_TYPE_HASH_MAP = 0;\n    // Performance is higher than HashMap\n    public static final int ROOT_TYPE_ROOT_MAP = 1;\n\n    private int rootType = ROOT_TYPE_ROOT_MAP;\n    \n    private boolean cache = true;\n    \n    public static StandardEvaluationContext context = new StandardEvaluationContext();\n\n    private static Map<String, Expression> cacheMap = new ConcurrentHashMap();\n\n    private static ExpressionParser parser = new SpelExpressionParser();\n\n    private static ApplicationContext applicationContext;\n\n    {\n        context.addPropertyAccessor(new MapAccessor());\n    }\n\n    @Override\n    public <T> T evalWithDefaultContext(String exp, Object root, boolean cache) {\n        try {\n            Expression expression;\n            if (cache) {\n                expression = cacheMap.get(exp);\n                if (expression == null) {\n                    expression = parser.parseExpression(exp);\n                    cacheMap.put(exp, expression);\n                }\n            } else {\n                expression = parser.parseExpression(exp);\n            }\n\n            Object value = expression.getValue(context, root);\n            return (T) value;\n        } catch (Exception e) {\n            if (logger.isErrorEnabled()) {\n                logger.error(\"eval spel exception, exp:\" + exp + \",\" + e.getMessage());\n            }\n            throw e;\n        }\n    }\n\n    @Override\n    public <T> T eval(String exp, TransitionContext transitionContext, FsmContext fsmContext,\n            Map<String, Object> data) {\n        if ((fsmContext == null || fsmContext.isLogOn()) && logger.isInfoEnabled()) {\n            logger.info(\"EVAL SPEL:\" + exp);\n        }\n        Object root = null;\n        switch (rootType) {\n        case ROOT_TYPE_HASH_MAP:\n            root = buildHashMapRoot(transitionContext, fsmContext, data);\n            break;\n        case ROOT_TYPE_ROOT_MAP:\n            root = buildRootMapRoot(transitionContext, fsmContext, data);\n            break;\n        }\n\n        Object result = null;\n        try {\n            result =  evalWithDefaultContext(exp, root, cache);\n        } catch (Exception e) {\n            if ((fsmContext == null || fsmContext.isLogOn()) && logger.isErrorEnabled()) {\n                logger.error(\"EVAL SPEL EXCEPTION, exp:\" + exp + \",\" + e.getMessage());\n            } \n            throw e;\n        }\n        if ((fsmContext == null || fsmContext.isLogOn()) && logger.isInfoEnabled()) {\n            try {\n                logger.info(\"SPEL RESULT:\" + JsonUtil.toJsonString(result));\n            } catch (Throwable t) {\n                logger.info(\"spel result to json string exception:\" + t.getMessage());\n            }\n        }\n        return (T) result;\n    }\n\n    private Object buildHashMapRoot(TransitionContext transitionContext, FsmContext fsmContext,\n            Map<String, Object> data) {\n        Map<String, Object> root = new HashMap<>();\n        if (fsmContext != null) {\n            root.put(\"context\", fsmContext);\n            if (fsmContext.getContext() != null) {\n                root.put(\"bizContext\", fsmContext.getContext());\n            }\n            root.put(\"param\", fsmContext.getParam());\n            if (fsmContext.getParam() != null && fsmContext.getParam().getParam() != null) {\n                root.put(\"bizParam\", fsmContext.getParam().getParam());\n            }\n            if (fsmContext.getParam() != null && fsmContext.getParam().getDataMap() != null) {\n                root.put(\"paramData\", fsmContext.getParam().getDataMap());\n            }\n            root.put(\"result\", fsmContext.getResult());\n            if (fsmContext.getResult() != null && fsmContext.getResult().getResult() != null) {\n                root.put(\"bizResult\", fsmContext.getResult().getResult());\n            }\n        }\n        if (transitionContext != null) {\n            root.put(\"transitionContext\", transitionContext);\n            root.put(\"actionResult\", transitionContext.getActionResult());\n            if (transitionContext.getTransitionContext() != null) {\n                root.put(\"transitionBizContext\", transitionContext.getTransitionContext());\n            }\n        }\n        if (data != null) {\n            root.putAll(data);\n        }\n        return root;\n    }\n\n    private Object buildRootMapRoot(TransitionContext transitionContext, FsmContext fsmContext,\n            Map<String, Object> data) {\n        ElRootMap root = new ElRootMap();\n        if (fsmContext != null) {\n            root.context = fsmContext;\n            if (fsmContext.getContext() != null) {\n                root.bizContext = fsmContext.getContext();\n            }\n            root.param = fsmContext.getParam();\n            if (fsmContext.getParam() != null && fsmContext.getParam().getParam() != null) {\n                root.bizParam = fsmContext.getParam().getParam();\n            }\n            if (fsmContext.getParam() != null && fsmContext.getParam().getDataMap() != null) {\n                root.paramData = fsmContext.getParam().getDataMap();\n            }\n            root.result = fsmContext.getResult();\n            if (fsmContext.getResult() != null && fsmContext.getResult().getResult() != null) {\n                root.bizResult = fsmContext.getResult().getResult();\n            }\n        }\n        if (transitionContext != null) {\n            root.transitionContext = transitionContext;\n            root.actionResult = transitionContext.getActionResult();\n            if (transitionContext.getTransitionContext() != null) {\n                root.transitionBizContext = transitionContext.getTransitionContext();\n            }\n        }\n        if (data != null) {\n            root.data = data;\n        }\n        return root;\n    }\n\n    public int getRootType() {\n        return rootType;\n    }\n\n    public void setRootType(int rootType) {\n        this.rootType = rootType;\n    }\n\n    public boolean isCache() {\n        return cache;\n    }\n\n    public void setCache(boolean cache) {\n        this.cache = cache;\n    }\n    \n\n\n    public ApplicationContext getApplicationContext() {\n        return applicationContext;\n    }\n\n    public void setApplicationContext(ApplicationContext applicationContext) {\n        this.applicationContext = applicationContext;\n        context.setBeanResolver(new BeanFactoryResolver(applicationContext));\n    }\n\n    \n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/event/ExpFsmEventListener.java",
    "content": "package com.jd.easyflow.fsm.event;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport com.jd.easyflow.fsm.el.ElEvaluator;\nimport com.jd.easyflow.fsm.el.ElFactory;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ExpFsmEventListener implements FsmEventListener {\n    \n    private ElEvaluator elEvaluator;\n\n    private String exp;\n    \n    public ExpFsmEventListener() {\n        \n    }\n    \n    public ExpFsmEventListener(String exp) {\n        this.exp = exp;\n    }\n\n    @Override\n    public void on(FsmEvent event) {\n        Map<String, Object> data = new HashMap<>();\n        data.put(\"event\", event);\n        ElEvaluator elEvaluator = this.elEvaluator;\n        if (elEvaluator == null && event.getContext() != null) {\n            elEvaluator = event.getContext().getElEvaluator();\n        }\n        if (elEvaluator == null) {\n            elEvaluator = ElFactory.get();\n        }\n        elEvaluator.eval(exp, null, event.getContext(), data);\n    }\n\n    public ElEvaluator getElEvaluator() {\n        return elEvaluator;\n    }\n\n    public void setElEvaluator(ElEvaluator elEvaluator) {\n        this.elEvaluator = elEvaluator;\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/event/FsmEvent.java",
    "content": "package com.jd.easyflow.fsm.event;\n\nimport com.jd.easyflow.fsm.FsmContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FsmEvent {\n\n\tprivate String type;\n\t\n\tprivate Object data;\n\t\n\tprivate FsmContext context;\n\n\tpublic String getType() {\n\t\treturn type;\n\t}\n\n\tpublic void setType(String type) {\n\t\tthis.type = type;\n\t}\n\n\tpublic Object getData() {\n\t\treturn data;\n\t}\n\n\tpublic void setData(Object data) {\n\t\tthis.data = data;\n\t}\n\n\tpublic FsmContext getContext() {\n\t\treturn context;\n\t}\n\n\tpublic void setContext(FsmContext context) {\n\t\tthis.context = context;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/event/FsmEventListener.java",
    "content": "package com.jd.easyflow.fsm.event;\n\nimport com.jd.easyflow.fsm.model.FsmLifeCycle;\nimport com.jd.easyflow.fsm.util.Pair;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic interface FsmEventListener extends FsmLifeCycle {\n\t\n\t/**\n\t * Get accepted events.\n\t * @return\n\t */\n\tdefault Pair<String, Integer>[] getAcceptedEvents() {\n\t\treturn null;\n\t}\n\t\n\t/**\n\t * Get listener id.\n\t * @return\n\t */\n\tdefault String getId() {\n\t    return this.getClass().getName();\n\t}\n\n\t/**\n\t * Event process.\n\t * @param event\n\t */\n    public void on(FsmEvent event);\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/event/FsmEventTrigger.java",
    "content": "package com.jd.easyflow.fsm.event;\n\nimport java.util.ArrayList;\nimport java.util.Comparator;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.TreeMap;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.fsm.Fsm;\nimport com.jd.easyflow.fsm.FsmContext;\nimport com.jd.easyflow.fsm.model.InitContext;\nimport com.jd.easyflow.fsm.util.Pair;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FsmEventTrigger {\n\n    public static final Logger logger = LoggerFactory.getLogger(FsmEventTrigger.class);\n\n    public static final String NULL_KEY = null;\n\n    private List<FsmEventListener> listenerList;\n\n    private Map<String, TreeMap<Integer, List<FsmEventListener>>> listenerMap;\n    \n    public void init(InitContext initContext, Fsm fsm) {\n        if (listenerList != null) {\n            for (FsmEventListener listener : listenerList) {\n                listener.init(initContext, fsm);\n            }\n        }\n    }\n    \n    public void destroy() {\n        if (listenerList != null) {\n            for (FsmEventListener listener : listenerList) {\n                listener.destroy();\n            }            \n        }\n    }\n\n    public void addListener(FsmEventListener listener) {\n        if (listenerList == null) {\n            listenerList = new ArrayList();\n            listenerMap = new HashMap<>();\n        }\n        listenerList.add(listener);\n        Pair<String, Integer>[] pairs = listener.getAcceptedEvents();\n        if (pairs == null) {\n            pairs = new Pair[] { Pair.of(NULL_KEY, 0) };\n        }\n        for (Pair<String, Integer> pair : pairs) {\n            TreeMap<Integer, List<FsmEventListener>> map = listenerMap.get(pair.getLeft());\n            if (map == null) {\n                map = new TreeMap<Integer, List<FsmEventListener>>(Comparator.reverseOrder());\n                listenerMap.put(pair.getLeft(), map);\n            }\n            List<FsmEventListener> listeners = map.get(pair.getRight());\n            if (listeners == null) {\n                listeners = new ArrayList();\n                map.put(pair.getRight(), listeners);\n            }\n            listeners.add(listener);\n        }\n    }\n\n    public void triggerEvent(String eventType, FsmContext context) {\n        triggerEvent(eventType, null, context, false);\n    }\n\n    public void triggerEvent(String eventType, Object eventData, FsmContext context, boolean catchThrowable) {\n        if (listenerList == null || listenerList.size() == 0) {\n            return;\n        }\n        \n        FsmEvent event = null;\n        TreeMap<Integer, List<FsmEventListener>> map = listenerMap.get(eventType);\n        if (map != null) {\n            event = createEvent(eventType, eventData, context);\n        }\n        // priority>0\n        if (map != null) {\n            for (Entry<Integer, List<FsmEventListener>> entry : map.entrySet()) {\n                if (entry.getKey() <= 0) {\n                    break;\n                }\n                for (FsmEventListener listener : entry.getValue()) {\n                    onEvent(event, listener, catchThrowable);\n                }\n            }\n        }\n        \n        // key exists and priority=0\n        if (map != null) {\n            List<FsmEventListener> keyZeroListeners = map.get(0);\n            if (keyZeroListeners != null) {\n                for (FsmEventListener listener : keyZeroListeners) {\n                    onEvent(event, listener, catchThrowable);\n                }\n            }\n        }\n        // key null\n        TreeMap<Integer, List<FsmEventListener>> nullMap = listenerMap.get(NULL_KEY);\n        if (nullMap != null) {\n            List<FsmEventListener> nullZeroListeners = nullMap.get(0);\n            if (nullZeroListeners != null) {\n                if (event == null) {\n                    event = createEvent(eventType, eventData, context);\n                }\n                for (FsmEventListener listener : nullZeroListeners) {\n                    onEvent(event, listener, catchThrowable);\n                }\n            }\n        }\n        // priority<0\n        if (map != null) {\n            for (Entry<Integer, List<FsmEventListener>> entry : map.entrySet()) {\n                if (entry.getKey() >= 0) {\n                    continue;\n                }\n                for (int i = 0; i < entry.getValue().size(); i++) {\n                    onEvent(event, entry.getValue().get(entry.getValue().size() - 1 - i), catchThrowable);\n                }\n            } \n        }\n    }\n    \n    private FsmEvent createEvent(String eventType, Object eventData, FsmContext context) {\n        FsmEvent event = new FsmEvent();\n        event.setType(eventType);\n        event.setData(eventData);\n        if (context != null) {\n            event.setContext(context);\n        }\n        return event;\n    }\n    \n    private void onEvent(FsmEvent event, FsmEventListener listener, boolean catchThrowable) {\n        if (!catchThrowable) {\n            listener.on(event);\n        } else {\n            try {\n                listener.on(event);\n            } catch (Throwable t) { //NOSONAR\n                logger.error(\"Exception on event of \" + listener.getClass().getName() + \", message:\" + t.getMessage(), t);\n            }\n        }\n    }\n\n    public List<FsmEventListener> getListenerList() {\n        return listenerList;\n    }\n\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/exception/FsmException.java",
    "content": "package com.jd.easyflow.fsm.exception;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FsmException extends RuntimeException{\n\n    public FsmException() {\n        super();\n    }\n    \n    public FsmException(String message) {\n        super(message);\n    }\n    \n    public FsmException(String message, Throwable cause) {\n        super(message, cause);\n    }\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/filter/ExpFilter.java",
    "content": "package com.jd.easyflow.fsm.filter;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport com.jd.easyflow.fsm.FsmContext;\nimport com.jd.easyflow.fsm.FsmManager;\nimport com.jd.easyflow.fsm.el.ElEvaluator;\nimport com.jd.easyflow.fsm.el.ElFactory;\nimport com.jd.easyflow.fsm.util.Pair;\nimport com.jd.easyflow.fsm.util.Triple;\n\n/**\n * \n * @author liyuliang5\n *\n * @param <T>\n * @param <R>\n */\npublic class ExpFilter<T, R> implements Filter<T, R> {\n\n    private ElEvaluator elEvaluator;\n\n    private String exp;\n\n    public ExpFilter() {\n\n    }\n\n    public ExpFilter(String exp) {\n        this.exp = exp;\n    }\n\n    @Override\n    public R doFilter(T request, FilterChain<T, R> chain) {\n        Map<String, Object> data = new HashMap<>();\n        data.put(\"request\", request);\n        data.put(\"chain\", chain);\n        ElEvaluator evaluator = this.elEvaluator;\n        if (evaluator == null) {\n            if (request instanceof FsmContext) {\n                evaluator = ((FsmContext) request).getElEvaluator();\n            } else if (request instanceof Pair) {\n                if (((Pair) request).getRight() instanceof FsmContext) {\n                    evaluator = ((FsmContext) ((Pair) request).getRight()).getElEvaluator();\n                } else if (((Pair) request).getRight() instanceof FsmManager) {\n                    evaluator = ((FsmManager) ((Pair) request).getRight()).getElEvaluator();\n                }\n            } else if (request instanceof Triple && ((Triple) request).getRight() instanceof FsmContext) {\n                evaluator = ((FsmContext) ((Triple) request).getRight()).getElEvaluator();\n            }\n        }\n\n        if (evaluator == null) {\n            evaluator = ElFactory.get();\n        }\n        return evaluator.eval(exp, null, null, data);\n    }\n\n    public ElEvaluator getElEvaluator() {\n        return elEvaluator;\n    }\n\n    public void setElEvaluator(ElEvaluator elEvaluator) {\n        this.elEvaluator = elEvaluator;\n    }\n\n    public String getExp() {\n        return exp;\n    }\n\n    public void setExp(String exp) {\n        this.exp = exp;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/filter/Filter.java",
    "content": "package com.jd.easyflow.fsm.filter;\n\nimport com.jd.easyflow.fsm.model.FsmLifeCycle;\n\n/**\n * \n * @author liyuliang5\n *\n * @param <T>\n * @param <R>\n */\npublic interface Filter<T,R> extends FsmLifeCycle {\n    \n    /**\n     * Do filter.\n     * @param request\n     * @param chain\n     * @return\n     */\n    public R doFilter(T request, FilterChain<T, R> chain);\n    \n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/filter/FilterChain.java",
    "content": "package com.jd.easyflow.fsm.filter;\n\nimport java.util.List;\nimport java.util.function.Function;\n\n/**\n * \n * @author liyuliang5\n *\n * @param <T>\n * @param <R>\n */\npublic class FilterChain<T, R> {\n\n    private List<Filter<T, R>> filters;\n\n    private Function<T, R> invoker;\n\n    private int pos = -1;\n\n    public FilterChain(List<Filter<T, R>> filters, Function<T, R> invoker) {\n        this.filters = filters;\n        this.invoker = invoker;\n    }\n\n    public R doFilter(T param) {\n        pos++;\n        if (pos < filters.size()) {\n            return filters.get(pos).doFilter(param, this);\n        }\n        return invoker.apply(param);\n    }\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/listener/FsmCommonListener.java",
    "content": "package com.jd.easyflow.fsm.listener;\n\nimport com.jd.easyflow.fsm.event.FsmEvent;\nimport com.jd.easyflow.fsm.event.FsmEventListener;\nimport com.jd.easyflow.fsm.util.FsmConstants;\nimport com.jd.easyflow.fsm.util.FsmEventTypes;\nimport com.jd.easyflow.fsm.util.Pair;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FsmCommonListener implements FsmEventListener {\n    \n    @Override\n    public Pair<String, Integer>[] getAcceptedEvents() {\n        return new Pair[] {Pair.of(FsmEventTypes.FSM_START, FsmConstants.EVENT_ORDER_START),\n                Pair.of(FsmEventTypes.TST_END, -FsmConstants.EVENT_ORDER_START)};\n    }\n\n    @Override\n    public void on(FsmEvent event) {\n        switch (event.getType()) {\n        // If there is no event after FSM start, default to enter event when creating instance.\n        // TODO: Add enter and exit event is better.\n        case FsmEventTypes.FSM_START : {\n            if (event.getContext().getCurrentEvent() == null) {\n                event.getContext().setCurrentEvent(FsmConstants.COMMON_ENTER_EVENT);\n            }\n            break;\n        }\n        // If there is next state after transition, but no event, we set to enter event.\n        case FsmEventTypes.TST_END: {\n            if ( event.getContext().getCurrentEvent() == null && event.getContext().getTransitionPostState() != null) {\n                event.getContext().setCurrentEvent(FsmConstants.COMMON_ENTER_EVENT);\n            }\n            break;\n        }\n        default : {\n            // NOOP\n        }\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/model/Event.java",
    "content": "package com.jd.easyflow.fsm.model;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic interface Event {\n\n    /**\n     * Get event id.\n     * @return\n     */\n\tString getId();\n\t\n\t/**\n\t * Get event name.\n\t * @return\n\t */\n\tString getName();\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/model/FsmLifeCycle.java",
    "content": "package com.jd.easyflow.fsm.model;\n\nimport java.util.Map;\n\n/**\n * \n * @author liyuliang5\n */\npublic interface FsmLifeCycle {\n\n    /**\n     * Invoked after element constructed on fsm parsing, the element SHOULD BE new instance, SHOULD NOT BE singleton or reusable.\n     * @param definition\n     * @param context\n     */\n    default void postConstruct(Map<String, Object> definition, Map<String, Object> context) {}\n    \n    /**\n     * Invoked after Fsm is constructed,  the element SHOULD BE new instance, SHOULD NOT BE singleton or reusable.\n     * @param initContext\n     * @param parent\n     */\n    default void init(InitContext initContext, Object parent) {}\n    \n    /**\n     * Invoked on FsmManager destroy,  the element SHOULD BE new instance, SHOULD NOT BE singleton or reusable.\n     */\n    default void destroy() {}\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/model/FsmPostHandler.java",
    "content": "package com.jd.easyflow.fsm.model;\n\nimport com.jd.easyflow.fsm.FsmContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic interface FsmPostHandler extends FsmLifeCycle {\n\n    public void postHandle(FsmContext context);\n   \n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/model/FsmPreHandler.java",
    "content": "package com.jd.easyflow.fsm.model;\n\nimport com.jd.easyflow.fsm.FsmContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic interface FsmPreHandler extends FsmLifeCycle {\n\n    public boolean preHandle(FsmContext context);\n    \n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/model/InitContext.java",
    "content": "package com.jd.easyflow.fsm.model;\n\nimport java.util.Map;\n\nimport com.jd.easyflow.fsm.Fsm;\n\n/**\n * \n * @author liyuliang5\n */\npublic class InitContext {\n\n\n    private boolean parseEl;\n        \n    Fsm fsm;\n    \n    private Map<String, Object> fsmDefinitionMap;\n\n    public boolean isParseEl() {\n        return parseEl;\n    }\n\n    public void setParseEl(boolean parseEl) {\n        this.parseEl = parseEl;\n    }\n\n    public Fsm getFsm() {\n        return fsm;\n    }\n\n    public void setFsm(Fsm fsm) {\n        this.fsm = fsm;\n    }\n\n    public Map<String, Object> getFsmDefinitionMap() {\n        return fsmDefinitionMap;\n    }\n\n    public void setFsmDefinitionMap(Map<String, Object> fsmDefinitionMap) {\n        this.fsmDefinitionMap = fsmDefinitionMap;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/model/PostHandleResult.java",
    "content": "package com.jd.easyflow.fsm.model;\n\n/**\n * Post handle result.\n * @author liyuliang5\n *\n */\npublic class PostHandleResult {\n\n    private String postStateId;\n    \n    private String postEventId;\n    \n    public PostHandleResult() {\n        // NOOP\n    }\n    \n    public PostHandleResult(String postStateId) {\n        this.postStateId = postStateId;\n    }\n    \n    public PostHandleResult(String postStateId, String postEventId) {\n        this.postStateId = postStateId;\n        this.postEventId = postEventId;\n    }\n\n    public String getPostStateId() {\n        return postStateId;\n    }\n\n    public void setPostStateId(String postStateId) {\n        this.postStateId = postStateId;\n    }\n\n    public String getPostEventId() {\n        return postEventId;\n    }\n\n    public void setPostEventId(String postEventId) {\n        this.postEventId = postEventId;\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/model/State.java",
    "content": "package com.jd.easyflow.fsm.model;\n\nimport java.util.Map;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic interface State {\n\t\n    /**\n     * Get state ID.\n     * @return\n     */\n\tString getId();\n\t\n\t/**\n\t * Get state name.\n\t * @return\n\t */\n\tString getName();\n\t\n\t/**\n\t * Get properties.\n\t * @return\n\t */\n\tMap<String, Object> getProperties();\n\t\n\t/**\n\t * Get property.\n\t * @param <T>\n\t * @param key\n\t * @return\n\t */\n\t<T> T getProperty(String key);\n\t\n\t/**\n\t * Set property.\n\t * @param key\n\t * @param value\n\t */\n    void setProperty(String key, Object value);\n\t\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/model/Transition.java",
    "content": "package com.jd.easyflow.fsm.model;\n\nimport java.util.List;\n\nimport com.jd.easyflow.fsm.FsmContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic interface Transition extends FsmLifeCycle {\n    \n    /**\n     * Get from node ID.\n     * @return\n     */\n    String getFromId();\n    \n    /**\n     * Get event ID.\n     * @return\n     */\n    String getEventId();\n    \n    /**\n     * Get to node ID.\n     * @return\n     */\n    List<String> getToIdList();\n\n    /**\n     * Two responsibility. \n     * 1. Execute Action, save result to context\n     * 2. Get next state, put to context\n     * @param transitionContext\n     * @param context\n     * @return\n     */\n\tvoid execute(TransitionContext transitionContext, FsmContext context);\n\t\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/model/TransitionAction.java",
    "content": "package com.jd.easyflow.fsm.model;\n\nimport com.jd.easyflow.fsm.FsmContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic interface TransitionAction extends FsmLifeCycle {\n\n    /**\n     * Execute transition.\n     * @param transitionContext\n     * @param context\n     * @return\n     */\n\tObject execute(TransitionContext transitionContext, FsmContext context);\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/model/TransitionContext.java",
    "content": "package com.jd.easyflow.fsm.model;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class TransitionContext {\n    /**\n     * Transition definition, for history trace.\n     */\n    private Transition transition;\n    \n    private Boolean preResult;\n    \n    private Object actionResult;\n    \n    private String postStateId;\n    \n    private String postEventId;\n\n    /**\n     * Common Data Map;\n     */\n    private Map<String, Object> dataMap = new HashMap<String, Object>();\n    \n    private Throwable throwable;\n    \n    private Object transitionContext;\n\n    public Map<String, Object> getDataMap() {\n        return dataMap;\n    }\n\n    public void setDataMap(Map<String, Object> dataMap) {\n        this.dataMap = dataMap;\n    }\n    \n    public void put(String key, Object value) {\n        dataMap.put(key, value);\n    }\n\n    public <T> T get(String key) {\n        return (T) dataMap.get(key);\n    }\n\n    public void remove(String key) {\n        dataMap.remove(key);\n    }\n\n    public Throwable getThrowable() {\n        return throwable;\n    }\n\n    public void setThrowable(Throwable throwable) {\n        this.throwable = throwable;\n    }\n\n    public Boolean getPreResult() {\n        return preResult;\n    }\n\n    public void setPreResult(Boolean preResult) {\n        this.preResult = preResult;\n    }\n\n    public Object getActionResult() {\n        return actionResult;\n    }\n\n    public void setActionResult(Object actionResult) {\n        this.actionResult = actionResult;\n    }\n\n    public String getPostStateId() {\n        return postStateId;\n    }\n\n    public void setPostStateId(String postStateId) {\n        this.postStateId = postStateId;\n    }\n\n    public Transition getTransition() {\n        return transition;\n    }\n\n    public void setTransition(Transition transition) {\n        this.transition = transition;\n    }\n\n    public String getPostEventId() {\n        return postEventId;\n    }\n\n    public void setPostEventId(String postEventId) {\n        this.postEventId = postEventId;\n    }\n\n    public <T>T getTransitionContext() {\n        return (T) transitionContext;\n    }\n\n    public void setTransitionContext(Object transitionContext) {\n        this.transitionContext = transitionContext;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/model/TransitionExecutor.java",
    "content": "package com.jd.easyflow.fsm.model;\n\nimport com.jd.easyflow.fsm.FsmContext;\n\n/**\n * \n * @author liyuliang5\n *\n * @param <T>\n */\npublic interface TransitionExecutor<T> {\n    \n    /**\n     * Execute transition.\n     * @param transitionContext\n     * @param fsmContext\n     * @return\n     */\n    T execute(TransitionContext transitionContext, FsmContext fsmContext);\n}\n\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/model/TransitionPostHandler.java",
    "content": "package com.jd.easyflow.fsm.model;\n\nimport com.jd.easyflow.fsm.FsmContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic interface TransitionPostHandler extends FsmLifeCycle {\n    \n    /**\n     * Post handle.\n     * @param transitionContext\n     * @param context\n     * @return\n     */\n\tPostHandleResult postHandle(TransitionContext transitionContext, FsmContext context);\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/model/TransitionPreHandler.java",
    "content": "package com.jd.easyflow.fsm.model;\n\nimport com.jd.easyflow.fsm.FsmContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic interface TransitionPreHandler extends FsmLifeCycle {\n\n    /**\n     * Pre handle.\n     * @param transitionContext\n     * @param context\n     * @return\n     */\n\tboolean preHandle(TransitionContext transitionContext, FsmContext context);\n\t\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/model/builder/TransitionBuilder.java",
    "content": "package com.jd.easyflow.fsm.model.builder;\n\nimport java.util.List;\n\nimport com.jd.easyflow.fsm.model.State;\nimport com.jd.easyflow.fsm.model.Transition;\nimport com.jd.easyflow.fsm.model.TransitionAction;\nimport com.jd.easyflow.fsm.model.TransitionPostHandler;\nimport com.jd.easyflow.fsm.model.TransitionPreHandler;\nimport com.jd.easyflow.fsm.model.impl.TransitionImpl;\nimport com.jd.easyflow.fsm.model.impl.post.FixedTransitionPostHandler;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class TransitionBuilder {\n\t\n\tprivate TransitionImpl transition = new TransitionImpl();\n\t\n\tprivate TransitionBuilder() {\n\t\t// NOOP\n\t}\n\n\tpublic static TransitionBuilder create() {\n\t\treturn new TransitionBuilder();\n\t}\n\t\n\tpublic TransitionBuilder fromId(String fromId) {\n\t    transition.setFromId(fromId);\n\t    return this;\n\t}\n\t\n\tpublic TransitionBuilder eventId(String eventId) {\n\t    transition.setEventId(eventId);\n\t    return this;\n\t}\n\t\n\tpublic TransitionBuilder toIdList(List<String> toIdList) {\n\t    transition.setToIdList(toIdList);\n\t    return this;\n\t}\n\t\n\t\n\tpublic TransitionBuilder preHandler(TransitionPreHandler preHandler) {\n\t\ttransition.setPreHandler(preHandler);\n\t\treturn this;\n\t}\n\t\n\tpublic TransitionBuilder action(TransitionAction action) {\n\t\ttransition.setAction(action);\n\t\treturn this;\n\t}\n\t\n\tpublic TransitionBuilder postHandler(TransitionPostHandler postHandler) {\n\t\ttransition.setPostHandler(postHandler);\n\t\treturn this;\n\t}\n\t\n\t\n\tpublic TransitionBuilder to(State state) {\n\t    if (state == null) {\n\t        return this;\n\t    }\n\t\ttransition.setPostHandler(new FixedTransitionPostHandler(state.getId()));\n\t\treturn this;\n\t}\n\t\n\tpublic Transition build() {\n\t\treturn this.transition;\n\t}\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/model/check/CheckErrorItem.java",
    "content": "package com.jd.easyflow.fsm.model.check;\n\nimport com.jd.easyflow.fsm.Fsm;\n\n/**\n * @author liyuliang5\n */\npublic class CheckErrorItem {\n\n    String errorType;\n    String errorMessage;\n    String fsmId;\n    String stateId;\n    Fsm fsm;\n    \n    public CheckErrorItem() {\n        \n    }\n    \n    public CheckErrorItem(String errorType, String errorMessage, String fsmId, String stateId, Fsm fsm) {\n        this.errorType = errorType;\n        this.errorMessage = errorMessage;\n        this.fsmId = fsmId;\n        this.stateId = stateId;\n        this.fsm = fsm;\n    }\n\n    public String getErrorType() {\n        return errorType;\n    }\n\n    public void setErrorType(String errorType) {\n        this.errorType = errorType;\n    }\n\n    public String getErrorMessage() {\n        return errorMessage;\n    }\n\n    public void setErrorMessage(String errorMessage) {\n        this.errorMessage = errorMessage;\n    }\n\n    public String getFsmId() {\n        return fsmId;\n    }\n\n    public void setFsmId(String fsmId) {\n        this.fsmId = fsmId;\n    }\n\n    public String getStateId() {\n        return stateId;\n    }\n\n    public void setStateId(String stateId) {\n        this.stateId = stateId;\n    }\n\n    public Fsm getFsm() {\n        return fsm;\n    }\n\n    public void setFsm(Fsm fsm) {\n        this.fsm = fsm;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/model/check/CheckParam.java",
    "content": "package com.jd.easyflow.fsm.model.check;\n\nimport com.jd.easyflow.fsm.Fsm;\n\n/**\n * @author liyuliang5\n */\npublic class CheckParam {\n    \n    private Fsm fsm;\n    \n    private Object config;\n\n    public Fsm getFsm() {\n        return fsm;\n    }\n\n    public void setFsm(Fsm fsm) {\n        this.fsm = fsm;\n    }\n\n    public Object getConfig() {\n        return config;\n    }\n\n    public void setConfig(Object config) {\n        this.config = config;\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/model/check/CheckResult.java",
    "content": "package com.jd.easyflow.fsm.model.check;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n\n/**\n * @author liyuliang5\n */\npublic class CheckResult {\n\n    List<CheckErrorItem> errorItemList = new ArrayList<CheckErrorItem>();\n    \n    public void addErrorItem(CheckErrorItem errorItem) {\n        errorItemList.add(errorItem);\n    }\n\n    public List<CheckErrorItem> getErrorItemList() {\n        return errorItemList;\n    }\n\n    public void setErrorItemList(List<CheckErrorItem> errorItemList) {\n        this.errorItemList = errorItemList;\n    }\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/model/check/FsmChecker.java",
    "content": "package com.jd.easyflow.fsm.model.check;\n\n/**\n * @author liyuliang5\n */\npublic interface FsmChecker {\n\n    public CheckResult check(CheckParam param);\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/model/check/impl/AllFsmStateLinkChecker.java",
    "content": "package com.jd.easyflow.fsm.model.check.impl;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map.Entry;\nimport java.util.Set;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.context.SmartLifecycle;\n\nimport com.jd.easyflow.fsm.CoreFsmManager;\nimport com.jd.easyflow.fsm.Fsm;\nimport com.jd.easyflow.fsm.exception.FsmException;\nimport com.jd.easyflow.fsm.model.check.CheckErrorItem;\nimport com.jd.easyflow.fsm.model.check.CheckParam;\nimport com.jd.easyflow.fsm.model.check.CheckResult;\n\n/**\n * @author liyuliang5\n */\npublic class AllFsmStateLinkChecker  implements SmartLifecycle {\n    \n    private static final Logger logger = LoggerFactory.getLogger(AllFsmStateLinkChecker.class);\n    \n\n    public static final int CHECK_POLICY_OFF = 0;\n    public static final int CHECK_POLICY_WARN = 1;\n    public static final int CHECK_POLICY_EXCEPTION = 2;\n\n    private boolean check = true;\n\n    private int checkStateIsolatedPolicy = CHECK_POLICY_EXCEPTION;\n    private int checkNextStatesNotExistsPolicy = CHECK_POLICY_EXCEPTION;\n    private int checkNonStartStateNoPreviousPolicy = CHECK_POLICY_EXCEPTION;\n    private int checkNonEndStateNoNextPolicy = CHECK_POLICY_OFF;\n    \n    private static final String VERSION_PREFIX = \"--V_\";\n\n    private FsmStateLinkChecker checker = new FsmStateLinkChecker();\n    \n    private Set<String> fsmWhitelist;\n    \n\n    private  int phase = Integer.MIN_VALUE + 1;\n    \n    private boolean autoStartup = true;\n\n    private volatile boolean isRunning = false;\n    \n    private CoreFsmManager fsmManager;\n    \n    public void check() {\n        List<CheckErrorItem> itemList = doCheck();\n        boolean exception = false;\n        for (CheckErrorItem item : itemList) {\n            logger.warn(\"Fsm check error, type:\" + item.getErrorType() + \" flowId:\" + item.getFsmId() + \" stateId:\"\n                    + item.getStateId() + \" fsm:\\n\" + item.getFsm().stringify());\n            int policy;\n            switch (item.getErrorType()) {\n            case FsmStateLinkChecker.ERROR_TYPE_STATE_ISOLATED: {\n                policy = checkStateIsolatedPolicy;\n                break;\n            }\n            case FsmStateLinkChecker.ERROR_TYPE_NEXT_STATES_NOT_EXISTS: {\n                policy = checkNextStatesNotExistsPolicy;\n                break;\n            }\n            case FsmStateLinkChecker.ERROR_TYPE_NON_START_STATE_NO_PREVIOUS: {\n                policy = checkNonStartStateNoPreviousPolicy;\n                break;\n            }\n            case FsmStateLinkChecker.ERROR_TYPE_NON_END_STATE_NO_NEXT: {\n                policy = checkNonEndStateNoNextPolicy;\n                break;\n            }\n            default: {\n                policy = CHECK_POLICY_OFF;\n            }\n            }\n            if (!exception && policy == CHECK_POLICY_EXCEPTION) {\n                exception = true;\n            }\n        }\n        if (exception) {\n            throw new FsmException(\"Fsm check error!\");\n        }\n    }\n    \n    public List<CheckErrorItem> doCheck() {\n        List<Fsm> allFsmList = getAllFsmList();\n        return doCheck(allFsmList);\n    }\n    \n    public List<CheckErrorItem> doCheck(List<Fsm> allFsmList) {\n        List<CheckErrorItem> list = new ArrayList<CheckErrorItem>();\n        if (! check) {\n            logger.info(\"check flag is false, return.\");\n            return list;\n        }\n        logger.info(\"start do fsm check\");\n        CheckParam param = new CheckParam();\n        FsmStateLinkCheckConfig config = new FsmStateLinkCheckConfig();\n        config.setCheckStateIsolated(checkStateIsolatedPolicy != CHECK_POLICY_OFF);\n        config.setCheckNextStatesNotExists(checkNextStatesNotExistsPolicy != CHECK_POLICY_OFF);\n        config.setCheckNonStartStateNoPrevious(checkNonStartStateNoPreviousPolicy != CHECK_POLICY_OFF);\n        param.setConfig(config);\n        for (Fsm fsm : allFsmList) {\n            if (fsmWhitelist != null && fsmWhitelist.contains(fsm.getId())) {\n                continue;\n            }\n            param.setFsm(fsm);\n            CheckResult checkResult = checker.check(param);\n            if (checkResult.getErrorItemList() != null && checkResult.getErrorItemList().size() > 0) {\n                list.addAll(checkResult.getErrorItemList());\n            }\n        }\n        logger.info(\"end do fsm check, fsm size:\" + allFsmList.size() + \", error size:\" + list.size());\n        return list;\n    }\n    \n    protected List<Fsm> getAllFsmList() {\n        List<Fsm> list = new ArrayList<Fsm>();\n        for (Entry<String, Fsm> entry : fsmManager.getFsmMap().entrySet()) {\n            if (entry.getKey().endsWith(VERSION_PREFIX)) {\n                continue;\n            }\n            list.add(entry.getValue());\n        }\n        return list;\n    }\n    \n\n    @Override\n    public void start() {\n        check();\n        isRunning = true;\n    }\n\n    @Override\n    public void stop() {\n        isRunning = false;\n    }\n    \n    @Override\n    public boolean isAutoStartup() {\n        return autoStartup;\n    }\n    \n    @Override\n    public void stop(Runnable callback) {\n        stop();\n        callback.run();\n    }\n\n    @Override\n    public boolean isRunning() {\n        return isRunning;\n    }\n    \n    @Override\n    public int getPhase() {\n        return phase;\n    }\n\n    public void setPhase(int phase) {\n        this.phase = phase;\n    }\n\n    public void setAutoStartup(boolean autoStartup) {\n        this.autoStartup = autoStartup;\n    }\n\n\n    public boolean isCheck() {\n        return check;\n    }\n\n\n    public void setCheck(boolean check) {\n        this.check = check;\n    }\n\n    public int getCheckStateIsolatedPolicy() {\n        return checkStateIsolatedPolicy;\n    }\n\n    public void setCheckStateIsolatedPolicy(int checkStateIsolatedPolicy) {\n        this.checkStateIsolatedPolicy = checkStateIsolatedPolicy;\n    }\n\n    public int getCheckNextStatesNotExistsPolicy() {\n        return checkNextStatesNotExistsPolicy;\n    }\n\n    public void setCheckNextStatesNotExistsPolicy(int checkNextStatesNotExistsPolicy) {\n        this.checkNextStatesNotExistsPolicy = checkNextStatesNotExistsPolicy;\n    }\n\n    public int getCheckNonStartStateNoPreviousPolicy() {\n        return checkNonStartStateNoPreviousPolicy;\n    }\n\n    public void setCheckNonStartStateNoPreviousPolicy(int checkNonStartStateNoPreviousPolicy) {\n        this.checkNonStartStateNoPreviousPolicy = checkNonStartStateNoPreviousPolicy;\n    }\n\n    public int getCheckNonEndStateNoNextPolicy() {\n        return checkNonEndStateNoNextPolicy;\n    }\n\n    public void setCheckNonEndStateNoNextPolicy(int checkNonEndStateNoNextPolicy) {\n        this.checkNonEndStateNoNextPolicy = checkNonEndStateNoNextPolicy;\n    }\n\n    public FsmStateLinkChecker getChecker() {\n        return checker;\n    }\n\n    public void setChecker(FsmStateLinkChecker checker) {\n        this.checker = checker;\n    }\n\n    public Set<String> getFsmWhitelist() {\n        return fsmWhitelist;\n    }\n\n    public void setFsmWhitelist(Set<String> fsmWhitelist) {\n        this.fsmWhitelist = fsmWhitelist;\n    }\n\n    public CoreFsmManager getFsmManager() {\n        return fsmManager;\n    }\n\n    public void setFsmManager(CoreFsmManager fsmManager) {\n        this.fsmManager = fsmManager;\n    }\n\n\n    \n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/model/check/impl/FsmStateLinkCheckConfig.java",
    "content": "package com.jd.easyflow.fsm.model.check.impl;\n\n/**\n * @author liyuliang5\n */\npublic class FsmStateLinkCheckConfig {\n\n    private boolean checkStateIsolated;\n    \n    private boolean checkNextStatesNotExists;\n    \n    private boolean checkNonStartStateNoPrevious;\n    \n    private boolean checkNonEndStateNoNext;\n\n\n    public boolean isCheckStateIsolated() {\n        return checkStateIsolated;\n    }\n\n    public void setCheckStateIsolated(boolean checkStateIsolated) {\n        this.checkStateIsolated = checkStateIsolated;\n    }\n\n    public boolean isCheckNextStatesNotExists() {\n        return checkNextStatesNotExists;\n    }\n\n    public void setCheckNextStatesNotExists(boolean checkNextStatesNotExists) {\n        this.checkNextStatesNotExists = checkNextStatesNotExists;\n    }\n\n    public boolean isCheckNonStartStateNoPrevious() {\n        return checkNonStartStateNoPrevious;\n    }\n\n    public void setCheckNonStartStateNoPrevious(boolean checkNonStartStateNoPrevious) {\n        this.checkNonStartStateNoPrevious = checkNonStartStateNoPrevious;\n    }\n\n    public boolean isCheckNonEndStateNoNext() {\n        return checkNonEndStateNoNext;\n    }\n\n    public void setCheckNonEndStateNoNext(boolean checkNonEndStateNoNext) {\n        this.checkNonEndStateNoNext = checkNonEndStateNoNext;\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/model/check/impl/FsmStateLinkCheckFsmParseListener.java",
    "content": "package com.jd.easyflow.fsm.model.check.impl;\n\nimport java.util.Set;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.fsm.exception.FsmException;\nimport com.jd.easyflow.fsm.model.check.CheckErrorItem;\nimport com.jd.easyflow.fsm.model.check.CheckParam;\nimport com.jd.easyflow.fsm.model.check.CheckResult;\nimport com.jd.easyflow.fsm.parser.event.FsmParseEvent;\nimport com.jd.easyflow.fsm.parser.event.FsmParseEventListener;\nimport com.jd.easyflow.fsm.parser.event.FsmParseEventTypes;\n\n/**\n * @author liyuliang5\n */\npublic class FsmStateLinkCheckFsmParseListener implements FsmParseEventListener {\n\n    private static final Logger logger = LoggerFactory.getLogger(FsmStateLinkCheckFsmParseListener.class);\n\n    public static final int CHECK_POLICY_OFF = 0;\n    public static final int CHECK_POLICY_WARN = 1;\n    public static final int CHECK_POLICY_EXCEPTION = 2;\n\n    private boolean check = true;\n\n    private int checkStateIsolatedPolicy = CHECK_POLICY_EXCEPTION;\n    private int checkNextStatesNotExistsPolicy = CHECK_POLICY_EXCEPTION;\n    private int checkNonStartStateNoPreviousPolicy = CHECK_POLICY_EXCEPTION;\n    private int checkNonEndStateNoNextPolicy = CHECK_POLICY_OFF;\n\n    private FsmStateLinkChecker checker = new FsmStateLinkChecker();\n    \n    private Set<String> fsmWhitelist;\n    \n    private boolean checkOnlyParseEl = false;\n\n    @Override\n    public void on(FsmParseEvent event) {\n        if (!check) {\n            return;\n        }\n        switch (event.getType()) {\n        case FsmParseEventTypes.INIT_FSM_END: {\n            if (checkOnlyParseEl && ! event.isParseEl()) {\n                return;\n            }\n            if (logger.isDebugEnabled()) {\n                logger.debug(\"Start state link check, fsm ID:\" + event.getFsm().getId());\n            }\n            if (fsmWhitelist != null && fsmWhitelist.contains(event.getFsm().getId())) {\n                return;\n            }\n            CheckParam param = new CheckParam();\n            param.setFsm(event.getFsm());\n            FsmStateLinkCheckConfig config = new FsmStateLinkCheckConfig();\n            config.setCheckStateIsolated(checkStateIsolatedPolicy != CHECK_POLICY_OFF);\n            config.setCheckNextStatesNotExists(checkNextStatesNotExistsPolicy != CHECK_POLICY_OFF);\n            config.setCheckNonStartStateNoPrevious(checkNonStartStateNoPreviousPolicy != CHECK_POLICY_OFF);\n            param.setConfig(config);\n            CheckResult result = checker.check(param);\n            for (CheckErrorItem item : result.getErrorItemList()) {\n                int policy;\n                switch (item.getErrorType()) {\n                case FsmStateLinkChecker.ERROR_TYPE_STATE_ISOLATED: {\n                    policy = checkStateIsolatedPolicy;\n                    break;\n                }\n                case FsmStateLinkChecker.ERROR_TYPE_NEXT_STATES_NOT_EXISTS: {\n                    policy = checkNextStatesNotExistsPolicy;\n                    break;\n                }\n                case FsmStateLinkChecker.ERROR_TYPE_NON_START_STATE_NO_PREVIOUS: {\n                    policy = checkNonStartStateNoPreviousPolicy;\n                    break;\n                }\n                case FsmStateLinkChecker.ERROR_TYPE_NON_END_STATE_NO_NEXT: {\n                    policy = checkNonEndStateNoNextPolicy;\n                    break;\n                }\n                default: {\n                    policy = CHECK_POLICY_OFF;\n                }\n                }\n                logger.warn(\"Fsm check error, type:\" + item.getErrorType() + \" flowId:\" + item.getFsmId() + \" stateId:\"\n                        + item.getStateId() + \" fsm:\\n\" + item.getFsm().stringify());\n                if (policy == CHECK_POLICY_EXCEPTION) {\n                    throw new FsmException(\"Fsm check error, type:\" + item.getErrorType() + \" flowId:\" + item.getFsmId()\n                            + \" stateId:\" + item.getStateId());\n                }\n            }\n        }\n        }\n    }\n\n    public boolean isCheck() {\n        return check;\n    }\n\n    public void setCheck(boolean check) {\n        this.check = check;\n    }\n\n    public int getCheckStateIsolatedPolicy() {\n        return checkStateIsolatedPolicy;\n    }\n\n    public void setCheckStateIsolatedPolicy(int checkStateIsolatedPolicy) {\n        this.checkStateIsolatedPolicy = checkStateIsolatedPolicy;\n    }\n\n    public int getCheckNextStatesNotExistsPolicy() {\n        return checkNextStatesNotExistsPolicy;\n    }\n\n    public void setCheckNextStatesNotExistsPolicy(int checkNextStatesNotExistsPolicy) {\n        this.checkNextStatesNotExistsPolicy = checkNextStatesNotExistsPolicy;\n    }\n\n    public int getCheckNonStartStateNoPreviousPolicy() {\n        return checkNonStartStateNoPreviousPolicy;\n    }\n\n    public void setCheckNonStartStateNoPreviousPolicy(int checkNonStartStateNoPreviousPolicy) {\n        this.checkNonStartStateNoPreviousPolicy = checkNonStartStateNoPreviousPolicy;\n    }\n\n    public int getCheckNonEndStateNoNextPolicy() {\n        return checkNonEndStateNoNextPolicy;\n    }\n\n    public void setCheckNonEndStateNoNextPolicy(int checkNonEndStateNoNextPolicy) {\n        this.checkNonEndStateNoNextPolicy = checkNonEndStateNoNextPolicy;\n    }\n\n    public FsmStateLinkChecker getChecker() {\n        return checker;\n    }\n\n    public void setChecker(FsmStateLinkChecker checker) {\n        this.checker = checker;\n    }\n\n    public Set<String> getFsmWhitelist() {\n        return fsmWhitelist;\n    }\n\n    public void setFsmWhitelist(Set<String> fsmWhitelist) {\n        this.fsmWhitelist = fsmWhitelist;\n    }\n\n    public boolean isCheckOnlyParseEl() {\n        return checkOnlyParseEl;\n    }\n\n    public void setCheckOnlyParseEl(boolean checkOnlyParseEl) {\n        this.checkOnlyParseEl = checkOnlyParseEl;\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/model/check/impl/FsmStateLinkChecker.java",
    "content": "package com.jd.easyflow.fsm.model.check.impl;\n\nimport java.util.List;\n\nimport com.jd.easyflow.fsm.Fsm;\nimport com.jd.easyflow.fsm.model.State;\nimport com.jd.easyflow.fsm.model.check.CheckErrorItem;\nimport com.jd.easyflow.fsm.model.check.CheckParam;\nimport com.jd.easyflow.fsm.model.check.CheckResult;\nimport com.jd.easyflow.fsm.model.check.FsmChecker;\nimport com.jd.easyflow.fsm.util.FsmStateLinkUtil;\n\n/**\n * @author liyuliang5\n */\npublic class FsmStateLinkChecker implements FsmChecker {\n\n\n    public static final String ERROR_TYPE_STATE_ISOLATED = \"STATE_ISOLATED\";\n    public static final String ERROR_TYPE_NEXT_STATES_NOT_EXISTS = \"NEXT_STATES_NOT_EXISTS\";\n    public static final String ERROR_TYPE_NON_START_STATE_NO_PREVIOUS = \"NON_START_STATE_NO_PREVIOUS\";\n    public static final String ERROR_TYPE_NON_END_STATE_NO_NEXT = \"NON_END_STATE_NO_NEXT\";\n    \n    public CheckResult check(CheckParam param) {\n        Fsm fsm = param.getFsm();\n        FsmStateLinkCheckConfig config = (FsmStateLinkCheckConfig) param.getConfig();\n        CheckResult result = new CheckResult();\n        if (fsm.getStateList() == null) {\n            return result;\n        }\n        for (State state : fsm.getStateList()) {\n            List<String> previousStateIds = FsmStateLinkUtil.getPreviousStates(state, fsm);\n            List<String> nextStateIds = FsmStateLinkUtil.getNextStates(state, fsm);\n            // state isolated.\n            if (config.isCheckStateIsolated()) {\n                if (previousStateIds.size() == 0 && nextStateIds.size() == 0 && fsm.getStateList().size() > 1) {\n                    result.addErrorItem(new CheckErrorItem(ERROR_TYPE_STATE_ISOLATED, null, fsm.getId(), state.getId(), fsm));\n                }\n            }\n            // next states none exists.\n            if (config.isCheckNextStatesNotExists()) {\n                if (nextStateIds.size() > 0) {\n                    for (String stateId : nextStateIds) {\n                        if (!stateId.equals(FsmStateLinkUtil.STATE_ID_UNKNOWN) && fsm.getState(stateId) == null) {\n                            result.addErrorItem(new CheckErrorItem(ERROR_TYPE_NEXT_STATES_NOT_EXISTS, null, fsm.getId(), state.getId(), fsm));\n                        }\n                    }\n                }\n            }\n            // none start node has no previous.\n            if (config.isCheckNonStartStateNoPrevious()) {\n                if (previousStateIds.size() == 0 && ! state.getId().equals(fsm.getStartStateId())) {\n                    result.addErrorItem(new CheckErrorItem(ERROR_TYPE_NON_START_STATE_NO_PREVIOUS, null, fsm.getId(), state.getId(), fsm));\n                }\n            }\n            // none end node has no next.\n            if (config.isCheckNonEndStateNoNext()) {\n                if (nextStateIds.size() == 0 && ! Boolean.TRUE.equals(state.getProperty(\"end\"))) {\n                    result.addErrorItem(new CheckErrorItem(ERROR_TYPE_NON_END_STATE_NO_NEXT, null, fsm.getId(), state.getId(), fsm));\n                }\n            }            \n            \n        }\n        return result;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/model/definition/DefConstants.java",
    "content": "package com.jd.easyflow.fsm.model.definition;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class DefConstants {\n\n    public static final String COMMON_PROP_ID = \"id\";\n    public static final String COMMON_PROP_NAME = \"name\";\n    public static final String COMMON_PROP_EXP = \"exp\";\n    public static final String COMMON_PROP_FLOW = \"flow\";\n    public static final String COMMON_PROP_CREATE_EXP = \"createExp\";\n    public static final String COMMON_PROP_PROPERTIES = \"properties\";\n    public static final String COMMON_PROP_CREATE = \"create\";\n    public static final String COMMON_PROP_TYPE = \"type\";\n    \n    public static final String STATE_PROP_START = \"start\";\n    \n    public static final String FSM_PROP_PARSE_LISTENERS = \"parseListeners\";\n\n    public static final String FSM_PROP_PRE = \"pre\";\n    public static final String FSM_PROP_POST = \"post\";\n    public static final String FSM_PROP_STATES = \"states\";\n    public static final String FSM_PROP_EVENTS = \"events\";\n    public static final String FSM_PROP_TRANSITIONS = \"transitions\";\n    public static final String FSM_PROP_LISTENERS = \"listeners\";\n    public static final String FSM_PROP_FILTERS = \"filters\";\n    public static final String FSM_PROP_TRANSITION_FILTERS = \"transitionFilters\";\n    public static final String FSM_PROP_TRANSITION_ACTION_FILTERS = \"transitionActionFilters\";\n    public static final String FSM_PROP_TRANSITION_PRE_HANDLER_FILTERS = \"transitionPreHandlerFilters\";\n    public static final String FSM_PROP_TRANSITION_POST_HANDLER_FILTERS = \"transitionPostHandlerFilters\";\n    public static final String FSM_PROP_LOG_FLAG = \"logFlag\";\n    \n    public static final String TST_PROP_ACTION = \"action\";\n    public static final String TST_PROP_PRE = \"pre\";\n    public static final String TST_PROP_POST = \"post\";\n    \n    public static final String TST_PROP_TOLIST = \"toList\";\n    public static final String TST_PROP_FROM = \"from\";\n    public static final String TST_PROP_EVENT = \"event\";\n    \n    public static final String TST_POST_PROP_TO = \"to\";\n    public static final String TST_POST_TYPE_FIXED = \"fixed\";\n\n    \n    public static final String TST_POST_TYPE_CONDITION = \"condition\";\n    public static final String TST_POST_PROP_CONDITIONS = \"conditions\";\n    public static final String TST_POST_PROP_WHEN = \"when\";\n    \n\n    \n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/model/impl/EventImpl.java",
    "content": "package com.jd.easyflow.fsm.model.impl;\n\nimport com.jd.easyflow.fsm.model.Event;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class EventImpl implements Event {\n\n    public EventImpl(String id) {\n        this.id = id;\n    }\n\n    public EventImpl(String id, String name) {\n        this.id = id;\n        this.name = name;\n    }\n\n    private String id;\n\n    private String name;\n\n    @Override\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    @Override\n    public String getId() {\n        return id;\n    }\n\n    public void setId(String id) {\n        this.id = id;\n    }\n\n    @Override\n    public int hashCode() {\n        final int prime = 31;\n        int result = 1;\n        result = prime * result + ((id == null) ? 0 : id.hashCode());\n        return result;\n    }\n\n    @Override\n    public boolean equals(Object obj) {\n        if (this == obj) {\n            return true;\n        }\n        if (obj == null) {\n            return false;\n        }\n        if (getClass() != obj.getClass()) {\n            return false;\n        }\n        EventImpl other = (EventImpl) obj;\n        if (id == null) {\n            if (other.id != null) {\n                return false;\n            }\n        } else if (!id.equals(other.id)) {\n            return false;\n        }\n        return true;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/model/impl/StateImpl.java",
    "content": "package com.jd.easyflow.fsm.model.impl;\n\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport com.jd.easyflow.fsm.model.State;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class StateImpl implements State {\n\n    public StateImpl(String id) {\n        this.id = id;\n    }\n\n    public StateImpl(String id, String name) {\n        this.id = id;\n        this.name = name;\n    }\n\n    public StateImpl(String id, String name, Map<String, Object> properties) {\n        this.id = id;\n        this.name = name;\n        setProperties(properties);\n    }\n\n    private String id;\n\n    private String name;\n\n    private Map<String, Object> properties = new ConcurrentHashMap<String, Object>();\n\n    @Override\n    public String getId() {\n        return id;\n    }\n\n    public void setId(String id) {\n        this.id = id;\n    }\n\n    @Override\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    @Override\n    public Map<String, Object> getProperties() {\n        return properties;\n    }\n\n    public void setProperties(Map<String, Object> properties) {\n        this.properties.clear();\n        putProperties(properties);\n    }\n\n    @Override\n    public int hashCode() {\n        final int prime = 31;\n        int result = 1;\n        result = prime * result + ((id == null) ? 0 : id.hashCode());\n        return result;\n    }\n\n    @Override\n    public boolean equals(Object obj) {\n        if (this == obj) {\n            return true;\n        }\n        if (obj == null) {\n            return false;\n        }\n        if (getClass() != obj.getClass()) {\n            return false;\n        }\n        StateImpl other = (StateImpl) obj;\n        if (id == null) {\n            if (other.id != null) {\n                return false;\n            }\n        } else if (!id.equals(other.id)) {\n            return false;\n        }\n        return true;\n    }\n    \n    @Override\n    public <T> T getProperty(String key) {\n        return (T) properties.get(key);\n    }\n\n    @Override\n    public void setProperty(String key, Object value) {\n        if (value == null) {\n            properties.remove(key);\n        } else {\n            properties.put(key, value);\n        }\n    }\n    \n    public void putProperties(Map<String, Object> properties) {\n        if (properties == null) {\n            return;\n        }\n        for (Entry<String, Object> entry : properties.entrySet()) {\n            if (entry.getValue() == null) {\n                this.properties.remove(entry.getKey());\n            } else {\n                this.properties.put(entry.getKey(), entry.getValue());\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/model/impl/TransitionImpl.java",
    "content": "package com.jd.easyflow.fsm.model.impl;\n\nimport java.util.List;\n\nimport com.jd.easyflow.fsm.FsmContext;\nimport com.jd.easyflow.fsm.filter.Filter;\nimport com.jd.easyflow.fsm.filter.FilterChain;\nimport com.jd.easyflow.fsm.model.InitContext;\nimport com.jd.easyflow.fsm.model.PostHandleResult;\nimport com.jd.easyflow.fsm.model.Transition;\nimport com.jd.easyflow.fsm.model.TransitionAction;\nimport com.jd.easyflow.fsm.model.TransitionContext;\nimport com.jd.easyflow.fsm.model.TransitionPostHandler;\nimport com.jd.easyflow.fsm.model.TransitionPreHandler;\nimport com.jd.easyflow.fsm.util.FsmEventTypes;\nimport com.jd.easyflow.fsm.util.Pair;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class TransitionImpl implements Transition {\n\n    protected String fromId;\n\n    protected String eventId;\n\n    protected List<String> toIdList;\n\n    protected TransitionPreHandler preHandler;\n\n    protected TransitionAction action;\n\n    protected TransitionPostHandler postHandler;\n    \n    @Override\n    public void init(InitContext initContext, Object parent) {\n        if (preHandler != null) {\n            preHandler.init(initContext, this);\n        }\n        if (action != null) {\n            action.init(initContext, this);\n        }\n        if (postHandler != null) {\n            postHandler.init(initContext, this);\n        }\n    }\n\n    @Override\n    public void execute(TransitionContext transitionContext, FsmContext context) {\n        if (! executePreHandler(transitionContext, context)) {\n            return;\n        }\n        executeAction(transitionContext, context);\n        executePostHandler(transitionContext, context);\n    }\n\n    /**\n     * Execute transition action.\n     * \n     * @param transitionContext\n     * @param context\n     */\n    protected void executeAction(TransitionContext transitionContext, FsmContext context) {\n        List<Filter<Pair<TransitionContext, FsmContext>, Object>> filters = context.getFsm().getTransitionActionFilters();\n        if (filters == null || filters.size() == 0) {\n            invokeAction(transitionContext, context);\n        } else {\n            FilterChain<Pair<TransitionContext, FsmContext>, Object> chain = new FilterChain<Pair<TransitionContext, FsmContext>, Object>(\n                    filters, p -> {\n                        return invokeAction(p.getLeft(), p.getRight());\n                    });\n            Object result = chain.doFilter(Pair.of(transitionContext, context));\n            transitionContext.setActionResult(result);\n        }\n        \n        if (context.isFirstTransition()) {\n            context.setFirstTransitionActionResult(transitionContext.getActionResult());\n        }\n        context.setTransitionActionResult(transitionContext.getActionResult());\n    }\n    \n    protected Object invokeAction(TransitionContext transitionContext, FsmContext context) {\n        if (action != null) {\n            context.getFsm().getEventTrigger().triggerEvent(FsmEventTypes.TST_ACTION_START, transitionContext, context,\n                    false);\n            Object actionResult = action.execute(transitionContext, context);\n            transitionContext.setActionResult(actionResult);\n            context.getFsm().getEventTrigger().triggerEvent(FsmEventTypes.TST_ACTION_END, transitionContext, context,\n                    false);\n        }\n        return transitionContext.getActionResult();\n    }\n    \n    /**\n     * Execute transition preHandler.\n     * \n     * @param transitionContext\n     * @param context\n     */\n    protected boolean executePreHandler(TransitionContext transitionContext, FsmContext context) {\n        List<Filter<Pair<TransitionContext, FsmContext>, Boolean>> filters = context.getFsm().getTransitionPreHandlerFilters();\n        if (filters == null || filters.size() == 0) {\n            return invokePreHandler(transitionContext, context);\n        }\n        FilterChain<Pair<TransitionContext, FsmContext>, Boolean> chain = new FilterChain<Pair<TransitionContext, FsmContext>, Boolean>(\n                filters, p -> {\n                    return invokePreHandler(p.getLeft(), p.getRight());\n                });\n        Boolean preResult = chain.doFilter(Pair.of(transitionContext, context));\n        transitionContext.setPreResult(preResult);\n        return preResult == null ? true : preResult;\n    }\n    \n    protected boolean invokePreHandler(TransitionContext transitionContext, FsmContext context) {\n        if (preHandler != null) {\n            context.getFsm().getEventTrigger().triggerEvent(FsmEventTypes.TST_PRE_START, transitionContext, context,\n                    false);\n            boolean preResult = preHandler.preHandle(transitionContext, context);\n            transitionContext.setPreResult(preResult);\n            context.getFsm().getEventTrigger().triggerEvent(FsmEventTypes.TST_PRE_END, transitionContext, context,\n                    false);\n        }\n        return transitionContext.getPreResult() == null ? true : transitionContext.getPreResult();\n    }\n    \n    /**\n     * Execute transition postHandler.\n     * \n     * @param transitionContext\n     * @param context\n     */\n    protected void executePostHandler(TransitionContext transitionContext, FsmContext context) {\n        List<Filter<Pair<TransitionContext, FsmContext>, PostHandleResult>> filters = context.getFsm()\n                .getTransitionPostHandlerFilters();\n        PostHandleResult postHandleResult = null;\n        if (filters == null || filters.size() == 0) {\n            postHandleResult = invokePostHandler(transitionContext, context);\n        } else {\n            FilterChain<Pair<TransitionContext, FsmContext>, PostHandleResult> chain = new FilterChain<Pair<TransitionContext, FsmContext>, PostHandleResult>(\n                    filters, p -> {\n                        return invokePostHandler(p.getLeft(), p.getRight());\n                    });\n            postHandleResult = chain.doFilter(Pair.of(transitionContext, context));\n            transitionContext.setPostStateId(postHandleResult == null ? null : postHandleResult.getPostStateId());\n            transitionContext.setPostEventId(postHandleResult == null ? null : postHandleResult.getPostEventId());\n        }\n        \n        String postStateId = postHandleResult == null ? null : postHandleResult.getPostStateId();\n        String postEventId = postHandleResult == null ? null :  postHandleResult.getPostEventId();\n        if (context.isFirstTransition()) {\n            context.setFirstTransitionPostState(context.getFsm().getState(postStateId));\n        }\n        context.setTransitionPostState(context.getFsm().getState(postStateId));\n        \n        if (postStateId != null) {\n            context.setPreviousState(context.getCurrentState());\n            context.setCurrentState(context.getFsm().getState(postStateId));\n        }\n        context.setPreviousEvent(context.getCurrentEvent());\n        context.setCurrentEvent(postEventId == null ? null : context.getFsm().getEvent(postEventId));\n    }\n    \n    protected PostHandleResult invokePostHandler(TransitionContext transitionContext, FsmContext context) {\n        String postStateId = null;\n        String postEventId = null;\n        if (postHandler != null) {\n            context.getFsm().getEventTrigger().triggerEvent(FsmEventTypes.TST_POST_START, transitionContext, context,\n                    false);\n            PostHandleResult postHandleResult = postHandler.postHandle(transitionContext, context);\n            if (postHandleResult != null) {\n                postStateId = postHandleResult.getPostStateId();\n                postEventId = postHandleResult.getPostEventId();\n            }\n            transitionContext.setPostStateId(postStateId);\n            transitionContext.setPostEventId(postEventId);\n            context.getFsm().getEventTrigger().triggerEvent(FsmEventTypes.TST_POST_END, transitionContext, context,\n                    false);\n            postStateId = transitionContext.getPostStateId();\n            postEventId = transitionContext.getPostEventId();\n        }\n        if (postStateId == null && postEventId == null) {\n            return null;\n        }\n        return new PostHandleResult(postStateId, postEventId);\n    }\n    \n    @Override\n    public void destroy() {\n        if (preHandler != null) {\n            preHandler.destroy();\n        }\n        if (action != null) {\n            action.destroy();\n        }\n        if (postHandler != null) {\n            postHandler.destroy();\n        }\n    }\n\n    public TransitionPreHandler getPreHandler() {\n        return preHandler;\n    }\n\n    public void setPreHandler(TransitionPreHandler preHandler) {\n        this.preHandler = preHandler;\n    }\n\n    public TransitionAction getAction() {\n        return action;\n    }\n\n    public void setAction(TransitionAction action) {\n        this.action = action;\n    }\n\n    public TransitionPostHandler getPostHandler() {\n        return postHandler;\n    }\n\n    public void setPostHandler(TransitionPostHandler postHandler) {\n        this.postHandler = postHandler;\n    }\n\n    @Override\n    public String getFromId() {\n        return fromId;\n    }\n\n    public void setFromId(String fromId) {\n        this.fromId = fromId;\n    }\n\n    @Override\n    public String getEventId() {\n        return eventId;\n    }\n\n    public void setEventId(String eventId) {\n        this.eventId = eventId;\n    }\n\n    @Override\n    public List<String> getToIdList() {\n        return toIdList;\n    }\n\n    public void setToIdList(List<String> toIdList) {\n        this.toIdList = toIdList;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/model/impl/action/ActionResultEl.java",
    "content": "package com.jd.easyflow.fsm.model.impl.action;\n\nimport com.jd.easyflow.fsm.FsmContext;\nimport com.jd.easyflow.fsm.model.TransitionContext;\nimport com.jd.easyflow.fsm.model.TransitionExecutor;\n\n/**\n * Used for condition create expression.\n * @author liyuliang5\n */\npublic class ActionResultEl implements TransitionExecutor<Boolean> {\n\n    public static final String OP_EQ = \"==\";\n    public static final String OP_NEQ = \"!=\";\n\n    private String operator;\n\n    private Object value;\n\n    public ActionResultEl() {\n\n    }\n\n    public ActionResultEl(String operator, Object value) {\n        this.operator = operator;\n        this.value = value;\n    }\n\n    public static ActionResultEl create(String operator, Object value) {\n        ActionResultEl el = new ActionResultEl();\n        el.operator = operator;\n        el.value = value;\n        return el;\n    }\n\n    @Override\n    public Boolean execute(TransitionContext transitionContext, FsmContext context) {\n        Object actionResult = transitionContext.getActionResult();\n        switch (operator) {\n        case OP_EQ:\n            return actionResult == value || (actionResult != null && actionResult.equals(value));\n        case OP_NEQ:\n            return actionResult != value && (actionResult == null || !actionResult.equals(value));\n\n        default: {\n            throw new UnsupportedOperationException(\"Unsupported operator \" + operator);\n        }\n        }\n    }\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/model/impl/action/ExpTransitionAction.java",
    "content": "package com.jd.easyflow.fsm.model.impl.action;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.fsm.FsmContext;\nimport com.jd.easyflow.fsm.model.TransitionAction;\nimport com.jd.easyflow.fsm.model.TransitionContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ExpTransitionAction  implements TransitionAction {\n\n\tprivate static final Logger logger = LoggerFactory.getLogger(ExpTransitionAction.class);\n\n\tprivate String exp;\n\n\tpublic ExpTransitionAction() {\n\t}\n\n\tpublic ExpTransitionAction(String exp) {\n\t\tthis.exp = exp;\n\t}\n\n\t@Override\n\tpublic Object execute(TransitionContext transitionContext, FsmContext context) {\n\t\tObject result = context.getElEvaluator().eval(exp, transitionContext, context, null);\n\t\treturn result;\n\t}\n\n\tpublic String getExp() {\n\t\treturn exp;\n\t}\n\n\tpublic void setExp(String exp) {\n\t\tthis.exp = exp;\n\t}\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/model/impl/fsm/post/ExpFsmPostHandler.java",
    "content": "package com.jd.easyflow.fsm.model.impl.fsm.post;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.fsm.FsmContext;\nimport com.jd.easyflow.fsm.model.FsmPostHandler;\n\npublic class ExpFsmPostHandler implements FsmPostHandler {\n\n    private static final Logger logger = LoggerFactory.getLogger(ExpFsmPostHandler.class);\n\n    private String exp;\n\n    public ExpFsmPostHandler() {\n    }\n\n    public ExpFsmPostHandler(String exp) {\n        this.exp = exp;\n    }\n\n    @Override\n    public void postHandle(FsmContext context) {\n        Object result = context.getElEvaluator().eval(exp, null, context, null);\n        if (context.isLogOn() && logger.isInfoEnabled()) {\n            logger.info(\"Exp:\" + exp + \" result:\" + result);\n        }\n    }\n\n    public String getExp() {\n        return exp;\n    }\n\n    public void setExp(String exp) {\n        this.exp = exp;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/model/impl/fsm/pre/ExpFsmPreHandler.java",
    "content": "package com.jd.easyflow.fsm.model.impl.fsm.pre;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.fsm.FsmContext;\nimport com.jd.easyflow.fsm.model.FsmPreHandler;\nimport com.jd.easyflow.fsm.model.impl.fsm.post.ExpFsmPostHandler;\n\npublic class ExpFsmPreHandler implements FsmPreHandler {\n\n    private static final Logger logger = LoggerFactory.getLogger(ExpFsmPostHandler.class);\n\n    private String exp;\n\n    public ExpFsmPreHandler() {\n    }\n\n    public ExpFsmPreHandler(String exp) {\n        this.exp = exp;\n    }\n\n    @Override\n    public boolean preHandle(FsmContext context) {\n        boolean result = context.getElEvaluator().eval(exp, null, context, null);\n        if (context.isLogOn() && logger.isInfoEnabled()) {\n            logger.info(\"Exp:\" + exp + \" result:\" + result);\n        }\n        return result;\n    }\n\n    public String getExp() {\n        return exp;\n    }\n\n    public void setExp(String exp) {\n        this.exp = exp;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/model/impl/post/AbstractTransitionPostHandler.java",
    "content": "package com.jd.easyflow.fsm.model.impl.post;\n\nimport java.util.Map;\n\nimport com.jd.easyflow.fsm.Fsm;\nimport com.jd.easyflow.fsm.FsmContext;\nimport com.jd.easyflow.fsm.model.PostHandleResult;\nimport com.jd.easyflow.fsm.model.TransitionContext;\nimport com.jd.easyflow.fsm.model.TransitionPostHandler;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic abstract class AbstractTransitionPostHandler implements TransitionPostHandler {\n\n    private static final String IDX_VAR_PREFIX = \"$\";\n\n    protected PostHandleResult parseTo(Object to, TransitionContext transitionContext, FsmContext fsmContext) {\n        // String type\n        if (to instanceof String) {\n            String toStr = (String) to;\n            if (!toStr.startsWith(IDX_VAR_PREFIX)) {\n                return new PostHandleResult(toStr);\n            } else {\n                return new PostHandleResult(parseIndexVar(toStr, transitionContext, fsmContext));\n            }\n        } else if (to instanceof Integer) {\n            int toIdx = (Integer) to;\n            return new PostHandleResult(fsmContext.getFsm().getStateList().get(toIdx).getId());\n        } else if (to instanceof Map) {\n            String state = (String) ((Map) to).get(\"state\");\n            String event = (String) ((Map) to).get(\"event\");\n            return new PostHandleResult(state, event);\n        } else {\n            throw new UnsupportedOperationException(\"Unsupported type\" + to.getClass());\n        }\n    }\n\n    private String parseIndexVar(String var, TransitionContext transitionContext, FsmContext fsmContext) {\n        int index = -1;\n        Fsm fsm = fsmContext.getFsm();\n        switch (var) {\n        case \"$first\": {\n            index = 0;\n            break;\n        }\n        case \"$last\": {\n            index = fsm.getStateList().size() - 1;\n            break;\n        }\n        case \"$previous\": {\n            index = fsm.getStateIndex(fsmContext.getCurrentState().getId()) - 1;\n            break;\n        }\n        case \"$next\": {\n            index = fsm.getStateIndex(fsmContext.getCurrentState().getId()) + 1;\n            break;\n        }\n        default: {\n            throw new UnsupportedOperationException(\"Unsupported var:\" + var);\n        }\n        }\n        return fsm.getStateList().get(index).getId();\n    }\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/model/impl/post/ConditionalTransitionPostHandler.java",
    "content": "package com.jd.easyflow.fsm.model.impl.post;\n\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Map;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.fsm.FsmContext;\nimport com.jd.easyflow.fsm.model.PostHandleResult;\nimport com.jd.easyflow.fsm.model.TransitionContext;\nimport com.jd.easyflow.fsm.model.TransitionExecutor;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ConditionalTransitionPostHandler  extends AbstractTransitionPostHandler {\n\n    private static final Logger logger = LoggerFactory.getLogger(ConditionalTransitionPostHandler.class);\n\n    private List<Map<String, Object>> branchList;\n\n    public ConditionalTransitionPostHandler() {\n    }\n\n    public ConditionalTransitionPostHandler(Map<String, Object> branch) {\n        this.branchList = Arrays.asList(branch);\n    }\n\n    public ConditionalTransitionPostHandler(List<Map<String, Object>> branchList) {\n        this.branchList = branchList;\n    }\n\n    @Override\n    public PostHandleResult postHandle(TransitionContext transitionContext, FsmContext context) {\n        for (Map<String, Object> branch : branchList) {\n            boolean result = evalCondition(branch.get(\"when\"), transitionContext, context);\n            if (result) {\n                Object next = branch.get(\"to\");\n                return super.parseTo(next, transitionContext, context);\n            }\n        }\n        return null;\n    }\n\n    private boolean evalCondition(Object condition, TransitionContext transitionContext, FsmContext context) {\n        if (condition == null) {\n            return true;\n        }\n        if (condition instanceof String) {\n            return context.getElEvaluator().eval((String) condition, transitionContext, context, null);\n        }\n        return ((TransitionExecutor<Boolean>) condition).execute(transitionContext, context);\n    }\n\n    public List<Map<String, Object>> getBranchList() {\n        return branchList;\n    }\n\n    public void setBranchList(List<Map<String, Object>> branchList) {\n        this.branchList = branchList;\n    }\n    \n}"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/model/impl/post/ExpTransitionPostHandler.java",
    "content": "package com.jd.easyflow.fsm.model.impl.post;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.fsm.FsmContext;\nimport com.jd.easyflow.fsm.model.PostHandleResult;\nimport com.jd.easyflow.fsm.model.TransitionContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ExpTransitionPostHandler extends AbstractTransitionPostHandler {\n\n\tprivate static final Logger logger = LoggerFactory.getLogger(ExpTransitionPostHandler.class);\n\n\tprivate String exp;\n\n\tpublic ExpTransitionPostHandler() {\n\t}\n\n\tpublic ExpTransitionPostHandler(String exp) {\n\t\tthis.exp = exp;\n\t}\n\n\t@Override\n\tpublic PostHandleResult postHandle(TransitionContext transitionContext, FsmContext context) {\n\t    if (context.isLogOn() && logger.isInfoEnabled()) {\n\t        logger.info(\"EVAL SPEL:\" + exp);\n\t    }\n\t\tString result = context.getElEvaluator().eval(exp, transitionContext, context, null);\n\t\tif (context.isLogOn() && logger.isInfoEnabled()) {\n\t\t    logger.info(\"SPEL RESULT:\" + result);\n\t\t}\n\t\treturn new PostHandleResult(result);\n\t}\n\n\tpublic String getExp() {\n\t\treturn exp;\n\t}\n\n\tpublic void setExp(String exp) {\n\t\tthis.exp = exp;\n\t}\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/model/impl/post/FixedTransitionPostHandler.java",
    "content": "package com.jd.easyflow.fsm.model.impl.post;\n\nimport com.jd.easyflow.fsm.FsmContext;\nimport com.jd.easyflow.fsm.model.PostHandleResult;\nimport com.jd.easyflow.fsm.model.TransitionContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FixedTransitionPostHandler extends AbstractTransitionPostHandler {\n\t\n\tprivate Object to;\n\t\n\tpublic FixedTransitionPostHandler(Object to) {\n\t\tthis.to = to;\n\t}\n\n\t@Override\n\tpublic PostHandleResult postHandle(TransitionContext transitionContext, FsmContext context) {\n\t\treturn super.parseTo(to, transitionContext, context);\n\t}\n\n    public Object getTo() {\n        return to;\n    }\n\n    public void setTo(Object to) {\n        this.to = to;\n    }\n\t\n\t\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/model/impl/post/TransitionContextResultPostHandler.java",
    "content": "package com.jd.easyflow.fsm.model.impl.post;\n\nimport com.jd.easyflow.fsm.FsmContext;\nimport com.jd.easyflow.fsm.model.PostHandleResult;\nimport com.jd.easyflow.fsm.model.TransitionContext;\n\n/**\n * \n * @author liyuliang5\n */\npublic class TransitionContextResultPostHandler extends AbstractTransitionPostHandler {\n\n    @Override\n    public PostHandleResult postHandle(TransitionContext transitionContext, FsmContext context) {\n        return new PostHandleResult(transitionContext.getPostStateId(), transitionContext.getPostEventId());\n    }\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/model/impl/pre/ExpTransitionPreHandler.java",
    "content": "package com.jd.easyflow.fsm.model.impl.pre;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.fsm.FsmContext;\nimport com.jd.easyflow.fsm.model.TransitionContext;\nimport com.jd.easyflow.fsm.model.TransitionPreHandler;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ExpTransitionPreHandler implements TransitionPreHandler {\n\n\tprivate static final Logger logger = LoggerFactory.getLogger(ExpTransitionPreHandler.class);\n\n\tprivate String exp;\n\n\tpublic ExpTransitionPreHandler() {\n\t}\n\n\tpublic ExpTransitionPreHandler(String exp) {\n\t\tthis.exp = exp;\n\t}\n\n\t@Override\n\tpublic boolean preHandle(TransitionContext transitionContext, FsmContext context) {\n\t\tboolean result = context.getElEvaluator().eval(exp, transitionContext, context, null);\n\t\treturn result;\n\t}\n\n\tpublic String getExp() {\n\t\treturn exp;\n\t}\n\n\tpublic void setExp(String exp) {\n\t\tthis.exp = exp;\n\t}\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/parser/FsmParser.java",
    "content": "package com.jd.easyflow.fsm.parser;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.fsm.Fsm;\nimport com.jd.easyflow.fsm.builder.FsmBuilder;\nimport com.jd.easyflow.fsm.el.ElEvaluator;\nimport com.jd.easyflow.fsm.el.ElFactory;\nimport com.jd.easyflow.fsm.event.ExpFsmEventListener;\nimport com.jd.easyflow.fsm.event.FsmEventListener;\nimport com.jd.easyflow.fsm.filter.ExpFilter;\nimport com.jd.easyflow.fsm.filter.Filter;\nimport com.jd.easyflow.fsm.model.FsmPostHandler;\nimport com.jd.easyflow.fsm.model.FsmPreHandler;\nimport com.jd.easyflow.fsm.model.InitContext;\nimport com.jd.easyflow.fsm.model.Transition;\nimport com.jd.easyflow.fsm.model.TransitionAction;\nimport com.jd.easyflow.fsm.model.TransitionPostHandler;\nimport com.jd.easyflow.fsm.model.TransitionPreHandler;\nimport com.jd.easyflow.fsm.model.builder.TransitionBuilder;\nimport com.jd.easyflow.fsm.model.definition.DefConstants;\nimport com.jd.easyflow.fsm.model.impl.StateImpl;\nimport com.jd.easyflow.fsm.model.impl.action.ExpTransitionAction;\nimport com.jd.easyflow.fsm.model.impl.fsm.post.ExpFsmPostHandler;\nimport com.jd.easyflow.fsm.model.impl.fsm.pre.ExpFsmPreHandler;\nimport com.jd.easyflow.fsm.model.impl.post.ConditionalTransitionPostHandler;\nimport com.jd.easyflow.fsm.model.impl.post.ExpTransitionPostHandler;\nimport com.jd.easyflow.fsm.model.impl.post.FixedTransitionPostHandler;\nimport com.jd.easyflow.fsm.model.impl.pre.ExpTransitionPreHandler;\nimport com.jd.easyflow.fsm.parser.event.ExpFsmParseEventListener;\nimport com.jd.easyflow.fsm.parser.event.FsmParseEvent;\nimport com.jd.easyflow.fsm.parser.event.FsmParseEventListener;\nimport com.jd.easyflow.fsm.parser.event.FsmParseEventTypes;\nimport com.jd.easyflow.fsm.util.JsonUtil;\n\n/**\n * \n * Fsm Parser.\n * \n * @author liyuliang5\n * @version 1.0\n * @since 1.0\n */\npublic class FsmParser {\n\n    private static final Logger logger = LoggerFactory.getLogger(FsmParser.class);\n\n    private static final String FSM_STRING_KEY = \"_fsm_string\";\n    \n    private static List<FsmParseEventListener> preListeners;\n    \n    private static List<FsmParseEventListener> postListeners;\n    \n    public static Fsm parse(String data) {\n        return parse(data, true);\n    }\n    \n    public static Fsm parse(String data, boolean parseEl)  {\n        return parse(data, parseEl, ElFactory.get());\n    }\n    \n    /**\n     * Parse string definition to java model.\n     * \n     * @param data\n     * @return\n     */\n    public static Fsm parse(String data, boolean parseEl, ElEvaluator elEvaluator) {\n        Map<String, Object> map = JsonUtil.parseObject(data, Map.class);\n        String fsmId = (String) map.get(DefConstants.COMMON_PROP_ID);\n        String fsmName = (String) map.get(DefConstants.COMMON_PROP_NAME);\n        FsmBuilder builder = FsmBuilder.create(fsmId, fsmName);\n        builder.logFlag((Boolean) map.get(DefConstants.FSM_PROP_LOG_FLAG));\n        List<FsmParseEventListener> parseListeners = parseParseListeners(map, builder.build(), parseEl, elEvaluator);\n        if (preListeners != null) {\n            if (parseListeners == null) {\n                parseListeners = new ArrayList<FsmParseEventListener>();\n            }\n            parseListeners.addAll(0, preListeners);\n        }\n        if (postListeners != null) {\n            if (parseListeners == null) {\n                parseListeners = new ArrayList<FsmParseEventListener>();\n            }\n            parseListeners.addAll(postListeners);\n        }\n        \n        triggerParseEvent(parseListeners, FsmParseEventTypes.PARSE_FSM_START, map, builder.build(), null, elEvaluator, parseEl);\n        \n        // Parse property\n        Map<String, Object> properties = (Map<String, Object>) map.get(DefConstants.COMMON_PROP_PROPERTIES);\n        builder.putProperties(properties);\n        \n        // Parse pre handler\n        FsmPreHandler fsmPreHandler = parseFsmPreHandler(map.get(DefConstants.FSM_PROP_PRE), parseEl, elEvaluator);\n        builder.fsmPreHandler(fsmPreHandler);\n        // Parse state\n        List<Map<String, Object>> states = (List<Map<String, Object>>) map.get(DefConstants.FSM_PROP_STATES);\n        if (states != null) {\n            for (Map<String, Object> state : states) {\n                boolean start = Boolean.TRUE.equals(state.get(DefConstants.STATE_PROP_START));\n                StateImpl stateInfo = new StateImpl((String) state.get(DefConstants.COMMON_PROP_ID),\n                        (String) state.get(DefConstants.COMMON_PROP_NAME),\n                        (Map<String, Object>) state.get(DefConstants.COMMON_PROP_PROPERTIES));\n                if (start) {\n                    builder.startState(stateInfo);\n                } else {\n                    builder.state(stateInfo);\n                }\n            }\n        }\n        // Parse post handler\n        FsmPostHandler fsmPostHandler = parseFsmPostHandler(map.get(DefConstants.FSM_PROP_POST), parseEl, elEvaluator);\n        builder.fsmPostHandler(fsmPostHandler);\n        // Parse event\n        List<Map<String, Object>> events = (List<Map<String, Object>>) map.get(DefConstants.FSM_PROP_EVENTS);\n        if (events != null) {\n            for (Map<String, Object> event : events) {\n                builder.event((String) event.get(DefConstants.COMMON_PROP_ID),\n                        (String) event.get(DefConstants.COMMON_PROP_NAME));\n            }\n        }\n        // Parse transition\n        List<Map<String, Object>> transitions = (List<Map<String, Object>>) map.get(DefConstants.FSM_PROP_TRANSITIONS);\n        if (transitions != null) {\n            for (Map<String, Object> transition : transitions) {\n                // create exp is unsupported.\n                TransitionPreHandler preHandler = parseTransitionPreHandler(transition.get(DefConstants.TST_PROP_PRE),\n                        parseEl, elEvaluator);\n                TransitionAction transAction = parseTransitionAction(transition.get(DefConstants.TST_PROP_ACTION),\n                        parseEl, elEvaluator);\n                TransitionPostHandler postHandler = parseTransitionPostHandler(\n                        transition.get(DefConstants.TST_PROP_POST), parseEl, elEvaluator);\n                List<String> toList = (List<String>) transition.get(DefConstants.TST_PROP_TOLIST);\n\n                Object from = transition.get(DefConstants.TST_PROP_FROM);\n                List<String> froms = from instanceof String ? Arrays.asList((String) from) : (List<String>) from;\n                Object event = transition.get(DefConstants.TST_PROP_EVENT);\n                List<String> evts = event instanceof String ? Arrays.asList((String) event) : (List<String>) event;\n                for (String fromId : froms) {\n                    for (String eventId : evts) {\n                        TransitionBuilder transBuilder = TransitionBuilder.create();\n                        Transition trans = transBuilder.fromId(fromId).eventId(eventId).toIdList(toList)\n                                .preHandler(preHandler).action(transAction).postHandler(postHandler).build();\n                        if (trans != null) {\n                            trans.postConstruct(transition, null);\n                            builder.transition(trans);\n                        }\n                    }\n                }\n\n            }\n        }\n        // Listener\n        parseListeners(map, builder, parseEl, elEvaluator);\n        // Filter\n        parseFilters(map, builder, parseEl, elEvaluator);\n        // Transition Filter.\n        parseTransitionFilters(map, builder, parseEl, elEvaluator);\n        // Transition PreHandler Filter.\n        parseTransitionPreHandlerFilters(map, builder, parseEl, elEvaluator);\n        // Transition Action Filter.\n        parseTransitionActionFilters(map, builder, parseEl, elEvaluator);\n        // Transition PostHandler Filter.\n        parseTransitionPostHandlerFilters(map, builder, parseEl, elEvaluator);\n\n        \n        Fsm fsm = builder.build();\n        fsm.setProperty(FSM_STRING_KEY, data);\n        \n        fsm.postConstruct(map, null);\n        \n        triggerParseEvent(parseListeners, FsmParseEventTypes.PARSE_FSM_END, map, fsm, null, elEvaluator, parseEl);\n        \n        triggerParseEvent(parseListeners, FsmParseEventTypes.INIT_FSM_START, map, fsm, null, elEvaluator, parseEl);\n        InitContext initContext = new InitContext();\n        initContext.setParseEl(parseEl);\n        initContext.setFsm(fsm);\n        initContext.setFsmDefinitionMap(map);\n        fsm.init(initContext, null);\n        triggerParseEvent(parseListeners, FsmParseEventTypes.INIT_FSM_END, map, fsm, null, elEvaluator, parseEl);\n                \n        return fsm;\n    }\n\n    /**\n     * Listener.\n     * \n     * @param map\n     * @param builder\n     * @param parseEl\n     */\n    private static void parseListeners(Map<String, Object> map, FsmBuilder builder, boolean parseEl, ElEvaluator elEvaluator) {\n        List<Map<String, Object>> listeners = (List<Map<String, Object>>) map.get(DefConstants.FSM_PROP_LISTENERS);\n        if (listeners != null) {\n            for (Object listenerObj : listeners) {\n                if (listenerObj instanceof String) {\n                    ExpFsmEventListener expFsmEventListener = new ExpFsmEventListener((String) listenerObj);\n                    builder.listener(expFsmEventListener);\n                } else {\n                    Map<String, Object> listener = (Map<String, Object>) listenerObj;\n                    String type = (String) listener.get(DefConstants.COMMON_PROP_TYPE);\n                    if (DefConstants.COMMON_PROP_CREATE.equals(type)\n                            || listener.containsKey(DefConstants.COMMON_PROP_CREATE_EXP)) {\n                        if (parseEl) {\n                            String exp = (String) listener.get(DefConstants.COMMON_PROP_CREATE_EXP);\n                            Map<String, Object> createElContext = createElContext(listener);\n                            FsmEventListener eventListener = elEvaluator.evalWithDefaultContext(exp, createElContext, false);\n                            if (eventListener != null) {\n                                eventListener.postConstruct(listener, null);\n                                builder.listener(eventListener);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * Filter.\n     * \n     * @param map\n     * @param builder\n     * @param parseEl\n     */\n    private static void parseFilters(Map<String, Object> map, FsmBuilder builder, boolean parseEl, ElEvaluator elEvaluator) {\n        List<Map<String, Object>> filters = (List<Map<String, Object>>) map.get(DefConstants.FSM_PROP_FILTERS);\n        if (filters != null) {\n            for (Object filterObj : filters) {\n                if (filterObj instanceof String) {\n                    ExpFilter expFilter = new ExpFilter<>((String) filterObj);\n                    builder.filter(expFilter);\n                } else {\n                    Map<String, Object> filter = (Map<String, Object>) filterObj;\n                    String type = (String) filter.get(DefConstants.COMMON_PROP_TYPE);\n                    if (DefConstants.COMMON_PROP_CREATE.equals(type)\n                            || filter.containsKey(DefConstants.COMMON_PROP_CREATE_EXP)) {\n                        if (parseEl) {\n                            String exp = (String) filter.get(DefConstants.COMMON_PROP_CREATE_EXP);\n                            Map<String, Object> createElContext = createElContext(filter);\n                            Filter fsmFilter = elEvaluator.evalWithDefaultContext(exp, createElContext, false);\n                            if (fsmFilter != null) {\n                                fsmFilter.postConstruct(filter, null);\n                                builder.filter(fsmFilter);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * Transition Filter.\n     * \n     * @param map\n     * @param builder\n     * @param parseEl\n     */\n    private static void parseTransitionFilters(Map<String, Object> map, FsmBuilder builder, boolean parseEl, ElEvaluator elEvaluator) {\n        List<Map<String, Object>> transitionFilters = (List<Map<String, Object>>) map\n                .get(DefConstants.FSM_PROP_TRANSITION_FILTERS);\n        if (transitionFilters != null) {\n            for (Object filterObj : transitionFilters) {\n                if (filterObj instanceof String) {\n                    ExpFilter expFilter = new ExpFilter<>((String) filterObj);\n                    builder.transitionFilter(expFilter);\n                } else {\n                    Map<String, Object> filter = (Map<String, Object>) filterObj;\n                    String type = (String) filter.get(DefConstants.COMMON_PROP_TYPE);\n                    if (DefConstants.COMMON_PROP_CREATE.equals(type)\n                            || filter.containsKey(DefConstants.COMMON_PROP_CREATE_EXP)) {\n                        if (parseEl) {\n                            String exp = (String) filter.get(DefConstants.COMMON_PROP_CREATE_EXP);\n                            Map<String, Object> createElContext = createElContext(filter);\n                            Filter transitionFilter = elEvaluator.evalWithDefaultContext(exp, createElContext, false);\n                            if (transitionFilter != null) {\n                                transitionFilter.postConstruct(filter, null);\n                                builder.transitionFilter(transitionFilter);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * Transition action filter.\n     * \n     * @param map\n     * @param builder\n     * @param parseEl\n     */\n    private static void parseTransitionActionFilters(Map<String, Object> map, FsmBuilder builder, boolean parseEl, ElEvaluator elEvaluator) {\n        List<Map<String, Object>> transitionActionFilters = (List<Map<String, Object>>) map\n                .get(DefConstants.FSM_PROP_TRANSITION_ACTION_FILTERS);\n        if (transitionActionFilters != null) {\n            for (Object filterObj : transitionActionFilters) {\n                if (filterObj instanceof String) {\n                    ExpFilter expFilter = new ExpFilter<>((String) filterObj);\n                    builder.transitionActionFilter(expFilter);\n                } else {\n                    Map<String, Object> filter = (Map<String, Object>) filterObj;\n                    String type = (String) filter.get(DefConstants.COMMON_PROP_TYPE);\n                    if (DefConstants.COMMON_PROP_CREATE.equals(type)\n                            || filter.containsKey(DefConstants.COMMON_PROP_CREATE_EXP)) {\n                        if (parseEl) {\n                            String exp = (String) filter.get(DefConstants.COMMON_PROP_CREATE_EXP);\n                            Map<String, Object> createElContext = createElContext(filter);\n                            Filter transitionActionFilter = elEvaluator.evalWithDefaultContext(exp, createElContext, false);\n                            if (transitionActionFilter != null) {\n                                transitionActionFilter.postConstruct(filter, null);\n                                builder.transitionActionFilter(transitionActionFilter);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n    \n    /**\n     * Transition preHandler filter.\n     * \n     * @param map\n     * @param builder\n     * @param parseEl\n     */\n    private static void parseTransitionPreHandlerFilters(Map<String, Object> map, FsmBuilder builder, boolean parseEl, ElEvaluator elEvaluator) {\n        List<Map<String, Object>> transitionPreHandlerFilters = (List<Map<String, Object>>) map\n                .get(DefConstants.FSM_PROP_TRANSITION_PRE_HANDLER_FILTERS);\n        if (transitionPreHandlerFilters != null) {\n            for (Object filterObj : transitionPreHandlerFilters) {\n                if (filterObj instanceof String) {\n                    ExpFilter expFilter = new ExpFilter<>((String) filterObj);\n                    builder.transitionPreHandlerFilter(expFilter);\n                } else {\n                    Map<String, Object> filter = (Map<String, Object>) filterObj;\n                    String type = (String) filter.get(DefConstants.COMMON_PROP_TYPE);\n                    if (DefConstants.COMMON_PROP_CREATE.equals(type)\n                            || filter.containsKey(DefConstants.COMMON_PROP_CREATE_EXP)) {\n                        if (parseEl) {\n                            String exp = (String) filter.get(DefConstants.COMMON_PROP_CREATE_EXP);\n                            Map<String, Object> createElContext = createElContext(filter);\n                            Filter transitionPreHandlerFilter = elEvaluator.evalWithDefaultContext(exp, createElContext, false);\n                            if (transitionPreHandlerFilter != null) {\n                                transitionPreHandlerFilter.postConstruct(filter, null);\n                                builder.transitionPreHandlerFilter(transitionPreHandlerFilter);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n    \n    /**\n     * Transition postHandler filter.\n     * \n     * @param map\n     * @param builder\n     * @param parseEl\n     */\n    private static void parseTransitionPostHandlerFilters(Map<String, Object> map, FsmBuilder builder, boolean parseEl, ElEvaluator elEvaluator) {\n        List<Map<String, Object>> transitionPostHandlerFilters = (List<Map<String, Object>>) map\n                .get(DefConstants.FSM_PROP_TRANSITION_POST_HANDLER_FILTERS);\n        if (transitionPostHandlerFilters != null) {\n            for (Object filterObj : transitionPostHandlerFilters) {\n                if (filterObj instanceof String) {\n                    ExpFilter expFilter = new ExpFilter<>((String) filterObj);\n                    builder.transitionPostHandlerFilter(expFilter);\n                } else {\n                    Map<String, Object> filter = (Map<String, Object>) filterObj;\n                    String type = (String) filter.get(DefConstants.COMMON_PROP_TYPE);\n                    if (DefConstants.COMMON_PROP_CREATE.equals(type)\n                            || filter.containsKey(DefConstants.COMMON_PROP_CREATE_EXP)) {\n                        if (parseEl) {\n                            String exp = (String) filter.get(DefConstants.COMMON_PROP_CREATE_EXP);\n                            Map<String, Object> createElContext = createElContext(filter);\n                            Filter transitionPostHandlerFilter = elEvaluator.evalWithDefaultContext(exp, createElContext, false);\n                            if (transitionPostHandlerFilter != null) {\n                                transitionPostHandlerFilter.postConstruct(filter, null);\n                                builder.transitionPostHandlerFilter(transitionPostHandlerFilter);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    public static FsmPreHandler parseFsmPreHandler(Object preObj, boolean parseEl, ElEvaluator elEvaluator) {\n        if (preObj == null) {\n            return null;\n        }\n        if (preObj instanceof String) {\n            ExpFsmPreHandler preHandler = new ExpFsmPreHandler();\n            preHandler.setExp((String) preObj);\n            return preHandler;\n        }\n        Map<String, Object> pre = (Map<String, Object>) preObj;\n        String type = (String) pre.get(DefConstants.COMMON_PROP_TYPE);\n        if (DefConstants.COMMON_PROP_CREATE.equals(type) || pre.containsKey(DefConstants.COMMON_PROP_CREATE_EXP)) {\n            if (!parseEl) {\n                return null;\n            }\n            String exp = (String) pre.get(DefConstants.COMMON_PROP_CREATE_EXP);\n            Map<String, Object> createElContext = createElContext(pre);\n            FsmPreHandler preHandler = elEvaluator.evalWithDefaultContext(exp, createElContext, false);\n            if (preHandler != null) {\n                preHandler.postConstruct(pre, null);\n            }\n            return preHandler;\n        } else if (DefConstants.COMMON_PROP_EXP.equals(type) || pre.containsKey(DefConstants.COMMON_PROP_EXP)) {\n            ExpFsmPreHandler preHandler = new ExpFsmPreHandler();\n            String exp = (String) pre.get(DefConstants.COMMON_PROP_EXP);\n            preHandler.setExp(exp);\n            preHandler.postConstruct(pre, null);\n            return preHandler;\n        }\n        throw new IllegalArgumentException(\"Param illegal:\" + pre);\n    }\n\n    public static FsmPostHandler parseFsmPostHandler(Object postObj, boolean parseEl, ElEvaluator elEvaluator) {\n        if (postObj == null) {\n            return null;\n        }\n        if (postObj instanceof String) {\n            ExpFsmPostHandler postHandler = new ExpFsmPostHandler();\n            postHandler.setExp((String) postObj);\n            return postHandler;\n        }\n        Map<String, Object> post = (Map<String, Object>) postObj;\n        String type = (String) post.get(DefConstants.COMMON_PROP_TYPE);\n        if (DefConstants.COMMON_PROP_CREATE.equals(type) || post.containsKey(DefConstants.COMMON_PROP_CREATE_EXP)) {\n            if (!parseEl) {\n                return null;\n            }\n            String exp = (String) post.get(DefConstants.COMMON_PROP_CREATE_EXP);\n            Map<String, Object> createElContext = createElContext(post);\n            FsmPostHandler postHandler = elEvaluator.evalWithDefaultContext(exp, createElContext, false);\n            if (postHandler != null) {\n                postHandler.postConstruct(post, null);\n            }\n            return postHandler;\n        } else if (DefConstants.COMMON_PROP_EXP.equals(type) || post.containsKey(DefConstants.COMMON_PROP_EXP)) {\n            ExpFsmPostHandler postHandler = new ExpFsmPostHandler();\n            String exp = (String) post.get(DefConstants.COMMON_PROP_EXP);\n            postHandler.setExp(exp);\n            postHandler.postConstruct(post, null);\n            return postHandler;\n        }\n        throw new IllegalArgumentException(\"Param illegal:\" + post);\n    }\n\n    public static TransitionPreHandler parseTransitionPreHandler(Object preObj, boolean parseEl, ElEvaluator elEvaluator) {\n        if (preObj == null) {\n            return null;\n        }\n        if (preObj instanceof String) {\n            ExpTransitionPreHandler preHandler = new ExpTransitionPreHandler();\n            preHandler.setExp((String) preObj);\n            return preHandler;\n        }\n        Map<String, Object> pre = (Map<String, Object>) preObj;\n        String type = (String) pre.get(DefConstants.COMMON_PROP_TYPE);\n        if (DefConstants.COMMON_PROP_CREATE.equals(type) || pre.containsKey(DefConstants.COMMON_PROP_CREATE_EXP)) {\n            if (!parseEl) {\n                return null;\n            }\n            String exp = (String) pre.get(DefConstants.COMMON_PROP_CREATE_EXP);\n            Map<String, Object> createElContext = createElContext(pre);\n            TransitionPreHandler preHandler = elEvaluator.evalWithDefaultContext(exp, createElContext, false);\n            if (preHandler != null) {\n                preHandler.postConstruct(pre, null);\n            }\n            return preHandler;\n        } else if (DefConstants.COMMON_PROP_EXP.equals(type) || pre.containsKey(DefConstants.COMMON_PROP_EXP)) {\n            ExpTransitionPreHandler preHandler = new ExpTransitionPreHandler();\n            String exp = (String) pre.get(DefConstants.COMMON_PROP_EXP);\n            preHandler.setExp(exp);\n            preHandler.postConstruct(pre, null);\n            return preHandler;\n        }\n        throw new IllegalArgumentException(\"Param illegal:\" + pre);\n\n    }\n\n    public static TransitionAction parseTransitionAction(Object actionObj, boolean parseEl, ElEvaluator elEvaluator) {\n        if (actionObj == null) {\n            return null;\n        }\n        if (actionObj instanceof String) {\n            ExpTransitionAction transAction = new ExpTransitionAction();\n            transAction.setExp((String) actionObj);\n            return transAction;\n        }\n        Map<String, Object> action = (Map<String, Object>) actionObj;\n        String type = (String) action.get(DefConstants.COMMON_PROP_TYPE);\n        if (DefConstants.COMMON_PROP_CREATE.equals(type) || action.containsKey(DefConstants.COMMON_PROP_CREATE_EXP)) {\n            if (!parseEl) {\n                return null;\n            }\n            String exp = (String) action.get(DefConstants.COMMON_PROP_CREATE_EXP);\n            Map<String, Object> createElContext = createElContext(action);\n            TransitionAction nodeAction = elEvaluator.evalWithDefaultContext(exp, createElContext, false);\n            if (nodeAction != null) {\n                nodeAction.postConstruct(action, null);\n            }\n            return nodeAction;\n        } else if (DefConstants.COMMON_PROP_EXP.equals(type) || action.containsKey(DefConstants.COMMON_PROP_EXP)) {\n            ExpTransitionAction transAction = new ExpTransitionAction();\n            String exp = (String) action.get(DefConstants.COMMON_PROP_EXP);\n            transAction.setExp(exp);\n            transAction.postConstruct(action, null);\n            return transAction;\n        }\n        throw new IllegalArgumentException(\"Param illegal:\" + action);\n    }\n\n    public static TransitionPostHandler parseTransitionPostHandler(Object postObj, boolean parseEl, ElEvaluator elEvaluator) {\n        if (postObj == null) {\n            return null;\n        }\n        if (postObj instanceof String) {\n            ExpTransitionPostHandler postHandler = new ExpTransitionPostHandler();\n            postHandler.setExp((String) postObj);\n            return postHandler;\n        }\n        Map<String, Object> post = (Map<String, Object>) postObj;\n        String type = (String) post.get(DefConstants.COMMON_PROP_TYPE);\n        if (DefConstants.COMMON_PROP_CREATE.equals(type) || post.containsKey(DefConstants.COMMON_PROP_CREATE_EXP)) {\n            if (!parseEl) {\n                return null;\n            }\n            String exp = (String) post.get(DefConstants.COMMON_PROP_CREATE_EXP);\n            Map<String, Object> createElContext = createElContext(post);\n            TransitionPostHandler postHandler = elEvaluator.evalWithDefaultContext(exp, createElContext, false);\n            if (postHandler != null) {\n                postHandler.postConstruct(post, null);\n            }\n            return postHandler;\n        } else if (DefConstants.COMMON_PROP_EXP.equals(type) || post.containsKey(DefConstants.COMMON_PROP_EXP)) {\n            ExpTransitionPostHandler postHandler = new ExpTransitionPostHandler();\n            String exp = (String) post.get(DefConstants.COMMON_PROP_EXP);\n            postHandler.setExp(exp);\n            postHandler.postConstruct(post, null);\n            return postHandler;\n        } else if (DefConstants.TST_POST_TYPE_CONDITION.equals(type)\n                || post.containsKey(DefConstants.TST_POST_PROP_CONDITIONS)\n                || post.containsKey(DefConstants.TST_POST_PROP_WHEN)) {\n            List<Map<String, Object>> conditionList = null;\n            if (post.containsKey(DefConstants.TST_POST_PROP_CONDITIONS)) {\n                conditionList = (List<Map<String, Object>>) post.get(DefConstants.TST_POST_PROP_CONDITIONS);\n            } else {\n                conditionList = Arrays.asList(post);\n            }\n            ConditionalTransitionPostHandler postHandler = new ConditionalTransitionPostHandler(conditionList);\n            postHandler.postConstruct(post, null);\n            return postHandler;\n\n        } else if (DefConstants.TST_POST_TYPE_FIXED.equals(type) || post.containsKey(DefConstants.TST_POST_PROP_TO)) {\n            Object nextState = (Object) post.get(DefConstants.TST_POST_PROP_TO);\n            FixedTransitionPostHandler postHandler = new FixedTransitionPostHandler(nextState);\n            return postHandler;\n        }\n        throw new IllegalArgumentException(\"Param illegal:\" + post);\n    }\n    \n    protected static List<FsmParseEventListener> parseParseListeners(Map<String, Object> map, Fsm fsm,\n            boolean parseEl, ElEvaluator elEvaluator) {\n        List<Object> parseListenerConfList = (List<Object>) map.get(DefConstants.FSM_PROP_PARSE_LISTENERS);\n        if (parseListenerConfList == null) {\n            return null;\n        }\n\n        List<FsmParseEventListener> parseListeners = new ArrayList<>();\n        for (Object listenerObj : parseListenerConfList) {\n            if (listenerObj instanceof String) {\n                ExpFsmParseEventListener parseListener = new ExpFsmParseEventListener((String) listenerObj);\n                parseListeners.add(parseListener);\n            } else {\n                Map<String, Object> listener = (Map<String, Object>) listenerObj;\n                String type = (String) listener.get(DefConstants.COMMON_PROP_TYPE);\n                if (DefConstants.COMMON_PROP_CREATE.equals(type)\n                        || listener.containsKey(DefConstants.COMMON_PROP_CREATE_EXP)) {\n                    if (parseEl) {\n                        String exp = (String) listener.get(DefConstants.COMMON_PROP_CREATE_EXP);\n                        Map<String, Object> elContext = new HashMap<>();\n                        elContext.put(\"def\", map);\n                        elContext.put(\"fsm\", fsm);\n                        FsmParseEventListener parseListener = elEvaluator.evalWithDefaultContext(exp, elContext,\n                                false);\n                        if (parseListener != null) {\n                            parseListener.postConstruct(listener, null);\n                            parseListeners.add(parseListener);\n                        }\n                    }\n                }\n            }\n        }\n        return parseListeners;\n    }\n\n    private static void triggerParseEvent(List<FsmParseEventListener> listeners, String eventType,\n            Map<String, Object> fsmDef, Fsm fsm, Object data, ElEvaluator elEvaluator, boolean parseEl) {\n        if (listeners == null || listeners.size() == 0) {\n            return;\n        }\n        FsmParseEvent event = new FsmParseEvent();\n        event.setType(eventType);\n        event.setFsm(fsm);\n        event.setFsmDef(fsmDef);\n        event.setData(data);\n        event.setElEvaluator(elEvaluator);\n        event.setParseEl(parseEl);\n        for (FsmParseEventListener listener : listeners) {\n            listener.on(event);\n        }\n    }\n\n    /**\n     * \n     * Java model to string.\n     *\n     * @param flow\n     * @return\n     */\n    public static String stringify(Fsm fsm) {\n        if (fsm.getProperty(FSM_STRING_KEY) != null) {\n            return fsm.getProperty(FSM_STRING_KEY);\n        }\n        logger.warn(\"Original fsm string definition not found, unsupported now. fsmId:\" + fsm.getId());\n        return null;\n    }\n    \n    private static Map<String, Object> createElContext(Map<String, Object> currentDef) {\n        Map<String, Object> context = new HashMap<>(3);\n        context.put(\"definition\", currentDef);\n        return context;\n    }\n\n    public static List<FsmParseEventListener> getPreListeners() {\n        return preListeners;\n    }\n\n    public static void setPreListeners(List<FsmParseEventListener> preListeners) {\n        FsmParser.preListeners = preListeners;\n    }\n\n    public static List<FsmParseEventListener> getPostListeners() {\n        return postListeners;\n    }\n\n    public static void setPostListeners(List<FsmParseEventListener> postListeners) {\n        FsmParser.postListeners = postListeners;\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/parser/event/ExpFsmParseEventListener.java",
    "content": "package com.jd.easyflow.fsm.parser.event;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * \n * @author liyuliang5\n */\npublic class ExpFsmParseEventListener implements FsmParseEventListener {\n    \n    private String exp;\n    \n    public ExpFsmParseEventListener() {\n        \n    }\n    \n    public ExpFsmParseEventListener(String exp) {\n        this.exp = exp;\n    }\n\n    @Override\n    public void on(FsmParseEvent event) {\n        Map<String, Object> data =  new HashMap<>();\n        data.put(\"event\", event);\n        event.getElEvaluator().evalWithDefaultContext(exp, data, false);   \n    }\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/parser/event/FsmParseEvent.java",
    "content": "package com.jd.easyflow.fsm.parser.event;\n\nimport java.util.Map;\n\nimport com.jd.easyflow.fsm.Fsm;\nimport com.jd.easyflow.fsm.el.ElEvaluator;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FsmParseEvent {\n    \n    private String type;\n    \n    private Map<String, Object> fsmDef;\n    \n    private Fsm fsm;\n    \n    private Object data;\n    \n    private ElEvaluator elEvaluator;\n    \n    private boolean parseEl;\n\n    public String getType() {\n        return type;\n    }\n\n    public void setType(String type) {\n        this.type = type;\n    }\n\n    public Map<String, Object> getFsmDef() {\n        return fsmDef;\n    }\n\n    public void setFsmDef(Map<String, Object> fsmDef) {\n        this.fsmDef = fsmDef;\n    }\n\n    public Fsm getFsm() {\n        return fsm;\n    }\n\n    public void setFsm(Fsm fsm) {\n        this.fsm = fsm;\n    }\n\n    public Object getData() {\n        return data;\n    }\n\n    public void setData(Object data) {\n        this.data = data;\n    }\n\n    public ElEvaluator getElEvaluator() {\n        return elEvaluator;\n    }\n\n    public void setElEvaluator(ElEvaluator elEvaluator) {\n        this.elEvaluator = elEvaluator;\n    }\n\n    public boolean isParseEl() {\n        return parseEl;\n    }\n\n    public void setParseEl(boolean parseEl) {\n        this.parseEl = parseEl;\n    }\n    \n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/parser/event/FsmParseEventListener.java",
    "content": "package com.jd.easyflow.fsm.parser.event;\n\nimport java.util.Map;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic interface FsmParseEventListener {\n    \n    public void on(FsmParseEvent event);\n    \n    default void postConstruct(Map<String, Object> definition, Map<String, Object> context) {}\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/parser/event/FsmParseEventTypes.java",
    "content": "package com.jd.easyflow.fsm.parser.event;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FsmParseEventTypes {\n    \n    public static final String PARSE_FSM_START = \"PARSE_FSM_START\";\n    public static final String PARSE_FSM_END = \"PARSE_FSM_END\";\n\n    public static final String INIT_FSM_START = \"INIT_FSM_START\";\n    public static final String INIT_FSM_END = \"INIT_FSM_END\";\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/util/FsmConstants.java",
    "content": "package com.jd.easyflow.fsm.util;\n\nimport com.jd.easyflow.fsm.model.Event;\nimport com.jd.easyflow.fsm.model.impl.EventImpl;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FsmConstants {\n    \n    public static final String NS_SEP = \":\";\n    \n    public static final String NS_EASYFLOW = \"easyflow\";\n    \n    public static final String EASYFLOW_NS_PREFIX = NS_EASYFLOW + NS_EASYFLOW;\n\n    public static final Event COMMON_ENTER_EVENT = new EventImpl(\"_state_enter\", \"State Enter Event\");\n    public static final Event COMMON_CHECK_EVENT = new EventImpl(\"_state_check\", \"State Check Event\");\n\n    public static final int EVENT_ORDER_START = 10000;\n    \n    /**\n     * Record execute history, default is true\n     */\n    public static final String FSM_PROPERTY_RECORD_HISTORY = \"fsm.recordHistory\";\n    \n    public static final String CTX_PARENT_CONTEXT = \"_parentContext\";\n    \n    public static final String CTX_PARENT_TRANSITION_CONTEXT = \"_parentTransitionContext\";\n    \n    /**\n     * initContextKey\n     */\n    public static final String INIT_CONTEXT_KEY = \"initContext\";\n    \n    public static final String PARAM_KEY_EL_EVALUATOR = \"_fsm.elEvaluator\";\n    \n    public static final String FSM_MANAGER_EVENT_DATA_KEY_PARAM = \"param\";\n    public static final String FSM_MANAGER_EVENT_DATA_KEY_FSM_MANAGER = \"fsmManager\";\n    public static final String FSM_MANAGER_EVENT_DATA_KEY_RESULT = \"result\";\n    public static final String FSM_MANAGER_EVENT_DATA_KEY_EXCEPTION = \"exception\";\n    \n    public static final String STATE_PROP_NEXT_STATES = \"nextStates\";\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/util/FsmEventTypes.java",
    "content": "package com.jd.easyflow.fsm.util;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FsmEventTypes {\n\n\t/**\n\t * Common Event.\n\t */\n    public static final String FSM_MANAGER_START = \"FSM_MANAGER_START\";\n    public static final String FSM_MANAGER_END = \"FSM_MANAGER_END\";\n    public static final String FSM_MANAGER_COMPLETE = \"FSM_MANAGER_COMPLETE\";\n    \n\tpublic static final String FSM_START = \"FSM_START\";\n\tpublic static final String FSM_END = \"FSM_END\";\n\tpublic static final String FSM_COMPLETE = \"FSM_COMPLETE\";\n\n\tpublic static final String TST_START = \"TST_START\";\n\tpublic static final String TST_END = \"TST_END\";\n\tpublic static final String TST_COMPLETE = \"TST_COMPLETE\";\n\t\n\t/**\n\t * Extension Event.\n\t */\n    public static final String TST_PRE_START = \"TST_PRE_START\";\n    public static final String TST_PRE_END = \"TST_PRE_END\";\n    public static final String TST_ACTION_START = \"TST_ACTION_START\";\n    public static final String TST_ACTION_END = \"TST_ACTION_END\";\n    public static final String TST_POST_START = \"TST_POST_START\";\n    public static final String TST_POST_END = \"TST_POST_END\";\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/util/FsmIOUtil.java",
    "content": "package com.jd.easyflow.fsm.util;\n\nimport java.io.ByteArrayOutputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.nio.charset.StandardCharsets;\n\n/**\n * \n * @author liyuliang5\n */\npublic class FsmIOUtil {\n\n    public static String toString(InputStream inputStream) throws IOException {\n        ByteArrayOutputStream result = new ByteArrayOutputStream();\n        byte[] buffer = new byte[1024];\n        int length;\n        while ((length = inputStream.read(buffer)) != -1) {\n            result.write(buffer, 0, length);\n        }\n        String str = result.toString(StandardCharsets.UTF_8.name());\n        return str;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/util/FsmStateLinkUtil.java",
    "content": "package com.jd.easyflow.fsm.util;\n\nimport java.util.ArrayList;\nimport java.util.LinkedHashSet;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.fsm.Fsm;\nimport com.jd.easyflow.fsm.model.State;\nimport com.jd.easyflow.fsm.model.Transition;\nimport com.jd.easyflow.fsm.model.TransitionPostHandler;\nimport com.jd.easyflow.fsm.model.impl.TransitionImpl;\nimport com.jd.easyflow.fsm.model.impl.post.ConditionalTransitionPostHandler;\nimport com.jd.easyflow.fsm.model.impl.post.FixedTransitionPostHandler;\n\n/**\n * @author liyuliang5\n */\npublic class FsmStateLinkUtil {\n\n    private static final Logger logger = LoggerFactory.getLogger(FsmStateLinkUtil.class);\n\n    private static final String STATE_PROP_NEXT_STATES_CACHE = \"_$nextStatesCache\";\n    private static final String STATE_PROP_PREVIOUS_STATES_CACHE = \"_$previousStatesCache\";\n\n    public static final String STATE_ID_ALL = \"$*\";\n    public static final String STATE_ID_UNKNOWN = \"$?\";\n    private static final String IDX_VAR_PREFIX = \"$\";\n\n\n    public static List<String> getNextStates(String stateId, Fsm fsm) {\n        State state = fsm.getState(stateId);\n        return getNextStates(state, fsm);\n    }\n\n    public static List<String> getNextStates(State state, Fsm fsm) {\n        List<String> nextStates = state.getProperty(STATE_PROP_NEXT_STATES_CACHE);\n        if (nextStates != null) {\n            return nextStates;\n        }\n        nextStates = state.getProperty(FsmConstants.STATE_PROP_NEXT_STATES);\n        if (nextStates == null) {\n            nextStates = new ArrayList<String>();\n            String stateId = state.getId();\n            for (Transition transition : fsm.getTransitionList()) {\n                if (!transition.getFromId().equals(stateId)) {\n                    continue;\n                }\n                if (transition instanceof TransitionImpl) {\n                    TransitionImpl transitionImpl = (TransitionImpl) transition;\n                    TransitionPostHandler postHandler = transitionImpl.getPostHandler();\n                    if (postHandler == null) {\n                        // NOOP\n                    } else if (postHandler instanceof FixedTransitionPostHandler) {\n                        FixedTransitionPostHandler fixed = (FixedTransitionPostHandler) postHandler;\n                        nextStates.addAll(parseTo(fixed.getTo(), stateId, fsm));\n                    } else if (postHandler instanceof ConditionalTransitionPostHandler) {\n                        ConditionalTransitionPostHandler conditional = (ConditionalTransitionPostHandler) postHandler;\n                        List<Map<String, Object>> branchList = conditional.getBranchList();\n                        for (Map<String, Object> branch : branchList) {\n                            Object next = branch.get(\"to\");\n                            List<String> toList = parseTo(next, stateId, fsm);\n                            nextStates.addAll(toList);\n                        }\n                    } else {\n                        nextStates.add(STATE_ID_UNKNOWN);\n                    }\n                } else {\n                    nextStates.add(STATE_ID_UNKNOWN);\n                }\n            }\n        }\n        if (nextStates.size() > 1) {\n            Set<String> nextStateIdsSet = new LinkedHashSet<String>();\n            nextStateIdsSet.addAll(nextStates);\n            nextStates = new ArrayList<String>(nextStateIdsSet);\n        }\n        if (nextStates.contains(STATE_ID_UNKNOWN)) {\n            if (logger.isInfoEnabled()) {\n                logger.info(fsm.getId() + \":\" + state.getId() + \" next states contains unknown\");\n            }\n        }\n        state.setProperty(STATE_PROP_NEXT_STATES_CACHE, nextStates);\n        return nextStates;\n\n    }\n\n    public static List<String> getPreviousStates(String stateId, Fsm fsm) {\n        State state = fsm.getState(stateId);\n        return getPreviousStates(state, fsm);\n    }\n\n    public static List<String> getPreviousStates(State state, Fsm fsm) {\n        List<String> previousStateIds = state.getProperty(STATE_PROP_PREVIOUS_STATES_CACHE);\n        if (previousStateIds != null) {\n            return previousStateIds;\n        }\n        String stateId = state.getId();\n        previousStateIds = new ArrayList<String>();\n        boolean containsUnknown = false;\n        for (State fsmState : fsm.getStateList()) {\n            List<String> nextStateIds = getNextStates(fsmState, fsm);\n            for (String nextStateId : nextStateIds) {\n                if (STATE_ID_UNKNOWN.equals(nextStateId)) {\n                    containsUnknown = true;\n                } else if (stateId.equals(nextStateId) || STATE_ID_ALL.equals(nextStateId)) {\n                    previousStateIds.add(fsmState.getId());\n                    break;\n                }\n            }\n        }\n        if (containsUnknown) {\n            previousStateIds.add(STATE_ID_UNKNOWN);\n        }\n        state.setProperty(STATE_PROP_PREVIOUS_STATES_CACHE, previousStateIds);\n        return previousStateIds;\n    }\n    \n    private static List<String> parseTo(Object to, String stateId, Fsm fsm) {\n        List<String> result = new ArrayList<String>();\n        // String type\n        if (to instanceof String) {\n            String toStr = (String) to;\n            if (!toStr.startsWith(IDX_VAR_PREFIX)) {\n                result.add(toStr);\n            } else {\n                toStr = parseIndexVar(toStr, stateId, fsm);\n                result.add(toStr);\n            }\n        } else if (to instanceof Integer) {\n            int toIdx = (Integer) to;\n            String toStr = fsm.getStateList().get(toIdx).getId();\n            result.add(toStr);\n            // List type\n        } else if (to instanceof Map) {\n            String toStr = (String) ((Map) to).get(\"state\");\n            result.add(toStr);\n        } else {\n            result.add(STATE_ID_UNKNOWN);\n        }\n        return result;\n    }\n    \n    private static String parseIndexVar(String var, String stateId, Fsm fsm) {\n        int index = -1;\n        switch (var) {\n        case \"$first\": {\n            index = 0;\n            break;\n        }\n        case \"$last\": {\n            index = fsm.getStateList().size() - 1;\n            break;\n        }\n        case \"$previous\": {\n            index = fsm.getStateIndex(stateId) - 1;\n            break;\n        }\n        case \"$next\": {\n            index = fsm.getStateIndex(stateId) + 1;\n            break;\n        }\n        default: {\n            return STATE_ID_UNKNOWN;\n        }\n        }\n        return fsm.getStateList().get(index).getId();\n    }\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/util/FsmStringUtil.java",
    "content": "package com.jd.easyflow.fsm.util;\n\n/**\n * \n * @author liyuliang5\n */\npublic class FsmStringUtil {\n    \n    public static boolean isNotEmpty(final CharSequence cs) {\n        return ! isEmpty(cs);\n    }\n\n    public static boolean isEmpty(final CharSequence cs) {\n        return cs == null || cs.length() == 0;\n    }\n    \n    public static String repeat(final char ch, final int repeat) {\n        if (repeat <= 0) {\n            return \"\";\n        }\n        final char[] buf = new char[repeat];\n        for (int i = repeat - 1; i >= 0; i--) {\n            buf[i] = ch;\n        }\n        return new String(buf);\n    }\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/util/FsmUtil.java",
    "content": "package com.jd.easyflow.fsm.util;\n\nimport com.jd.easyflow.fsm.FsmContext;\nimport com.jd.easyflow.fsm.model.State;\nimport com.jd.easyflow.fsm.model.TransitionContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FsmUtil {\n\n    /**\n     * get state.\n     * \n     * @param transitionContext\n     * @param context\n     */\n    public static State state(TransitionContext transitionContext, FsmContext context) {\n        return context.getFsm().getState(transitionContext.getTransition().getFromId());\n    }\n\n    /**\n     * get state property.\n     * \n     * @param <T>\n     * @param key\n     * @param transitionContext\n     * @param context\n     * @return\n     */\n    public static <T> T stateProperty(String key, TransitionContext transitionContext, FsmContext context) {\n        return (T) state(transitionContext, context).getProperty(key);\n    }\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/util/JsonFacade.java",
    "content": "package com.jd.easyflow.fsm.util;\n\n/**\n * @author liyuliang5\n */\npublic interface JsonFacade {\n\n\n    public String toJsonString(Object o);\n\n    public <T> T parseObject(String s, Class<T> clazz);\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/util/JsonFacadeJacksonImpl.java",
    "content": "package com.jd.easyflow.fsm.util;\n\nimport com.fasterxml.jackson.annotation.JsonInclude.Include;\nimport com.fasterxml.jackson.core.JsonProcessingException;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackson.databind.SerializationFeature;\n\n/**\n * @author liyuliang5\n */\npublic class JsonFacadeJacksonImpl implements JsonFacade {\n\n    private ObjectMapper mapper = new ObjectMapper();\n\n    {\n        mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);\n        mapper.setSerializationInclusion(Include.NON_NULL);\n    }\n\n    @Override\n    public String toJsonString(Object o) {\n        try {\n            return mapper.writeValueAsString(o);\n        } catch (JsonProcessingException e) {\n            throw new RuntimeException(e);\n        }\n    }\n\n    @Override\n    public <T> T parseObject(String s, Class<T> clazz) {\n        try {\n            return mapper.readValue(s, clazz);\n        } catch (Exception e) {\n            throw new RuntimeException(e);\n        }\n    }\n\n    public ObjectMapper getMapper() {\n        return mapper;\n    }\n\n    public void setMapper(ObjectMapper mapper) {\n        this.mapper = mapper;\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/util/JsonUtil.java",
    "content": "package com.jd.easyflow.fsm.util;\n\n/**\n * JSON Util.\n * \n * @author liyuliang5\n *\n */\npublic class JsonUtil {\n\n    private static JsonFacade jsonFacade;\n\n    public static String toJsonString(Object o) {\n        return jsonFacade().toJsonString(o);\n    }\n\n    public static <T> T parseObject(String s, Class<T> clazz) {\n        return jsonFacade().parseObject(s, clazz);\n    }\n    \n   \n    \n    private static JsonFacade jsonFacade() {\n        if (jsonFacade == null) {\n            jsonFacade = new JsonFacadeJacksonImpl();\n        }\n        return jsonFacade;\n    }\n\n\n    public static JsonFacade getJsonFacade() {\n        return jsonFacade;\n    }\n\n\n    public static void setJsonFacade(JsonFacade jsonFacade) {\n        JsonUtil.jsonFacade = jsonFacade;\n    }\n    \n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/util/Pair.java",
    "content": "package com.jd.easyflow.fsm.util;\n\n/**\n * \n * @author liyuliang5\n */\npublic class Pair<L, R> {\n\n    private L left;\n\n    private R right;\n\n    private Pair(L left, R right) {\n        this.left = left;\n        this.right = right;\n    }\n\n    public static <L, R> Pair<L, R> of(L left, R right) {\n        return new Pair<L, R>(left, right);\n    }\n\n    public L getLeft() {\n        return left;\n    }\n\n    public void setLeft(L left) {\n        this.left = left;\n    }\n\n    public R getRight() {\n        return right;\n    }\n\n    public void setRight(R right) {\n        this.right = right;\n    }\n\n    @Override\n    public String toString() {\n        return \"Pair [left=\" + left + \", right=\" + right + \"]\";\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/util/TransitionUtil.java",
    "content": "package com.jd.easyflow.fsm.util;\n\nimport com.jd.easyflow.fsm.FsmContext;\nimport com.jd.easyflow.fsm.model.PostHandleResult;\nimport com.jd.easyflow.fsm.model.TransitionContext;\nimport com.jd.easyflow.fsm.model.TransitionPostHandler;\nimport com.jd.easyflow.fsm.model.impl.TransitionImpl;\n\n/**\n * \n * @author liyuliang5\n */\npublic class TransitionUtil {\n\n    private static FixedPostTransitionImpl INSTANCE = new FixedPostTransitionImpl();\n\n    /**\n     * Used for post manually.\n     * @param postStateId\n     * @param postEventId\n     * @param transitionContext\n     * @param fsmContext\n     */\n    public static void post(String postStateId, String postEventId, TransitionContext transitionContext,\n            FsmContext fsmContext) {\n        INSTANCE.post(postStateId, postEventId, transitionContext, fsmContext);\n    }\n\n    private static class FixedPostTransitionImpl extends TransitionImpl {\n\n        {\n            postHandler = new TransitionPostHandler() {\n\n                @Override\n                public PostHandleResult postHandle(TransitionContext transitionContext, FsmContext context) {\n                    return new PostHandleResult(transitionContext.getPostStateId(), transitionContext.getPostEventId());\n                }\n            };\n        }\n\n        public void post(String postStateId, String postEventId, TransitionContext transitionContext,\n                FsmContext fsmContext) {\n            transitionContext.setPostStateId(postStateId);\n            transitionContext.setPostEventId(postEventId);\n            super.executePostHandler(transitionContext, fsmContext);\n        }\n\n    }\n}\n"
  },
  {
    "path": "easyflow-fsm/src/main/java/com/jd/easyflow/fsm/util/Triple.java",
    "content": "package com.jd.easyflow.fsm.util;\n\n/**\n * \n * @author liyuliang5\n */\npublic class Triple<L, M, R> {\n\n    private L left;\n    \n    private M middle;\n\n    private R right;\n\n    private Triple(L left, M middle, R right) {\n        this.left = left;\n        this.middle = middle;\n        this.right = right;\n    }\n\n    public static <L, M, R> Triple<L, M, R> of(L left, M middle, R right) {\n        return new Triple<L, M, R>(left, middle, right);\n    }\n\n    public L getLeft() {\n        return left;\n    }\n\n    public void setLeft(L left) {\n        this.left = left;\n    }\n    \n    public M getMiddle() {\n        return middle;\n    }\n\n    public void setMiddle(M middle) {\n        this.middle = middle;\n    }\n\n    public R getRight() {\n        return right;\n    }\n\n    public void setRight(R right) {\n        this.right = right;\n    }\n\n    @Override\n    public String toString() {\n        return \"Triple [left=\" + left + \", middle=\" + middle + \", right=\" + right + \"]\";\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-fsm/src/test/java/com/jd/easyflow/fsm/FsmTestSuite.java",
    "content": "package com.jd.easyflow.fsm;\n\nimport org.junit.runner.RunWith;\nimport org.junit.runners.Suite;\nimport org.junit.runners.Suite.SuiteClasses;\n\nimport com.jd.easyflow.fsm.cases.check.FsmStateLinkCheckTest;\nimport com.jd.easyflow.fsm.cases.event.MultipleEventTest;\nimport com.jd.easyflow.fsm.cases.filter.FsmFilterTest;\nimport com.jd.easyflow.fsm.cases.mockbiz.FsmMockBizTest;\nimport com.jd.easyflow.fsm.cases.parser.FsmParserTest;\nimport com.jd.easyflow.fsm.cases.post.PostTest;\nimport com.jd.easyflow.fsm.cases.postevent.PostEventTest;\nimport com.jd.easyflow.fsm.quickstart.FsmQuickStartTest;\n\n/**\n * \n * @author liyuliang5\n *\n */\n@RunWith(Suite.class)\n@SuiteClasses ({\n    FsmMockBizTest.class,\n    FsmQuickStartTest.class,\n    FsmParserTest.class,\n    MultipleEventTest.class,\n    PostEventTest.class,\n    FsmFilterTest.class,\n    PostTest.class,\n    FsmStateLinkCheckTest.class})\npublic class FsmTestSuite {\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/test/java/com/jd/easyflow/fsm/cases/check/FsmStateLinkCheckTest.java",
    "content": "package com.jd.easyflow.fsm.cases.check;\n\nimport static org.junit.Assert.assertEquals;\n\nimport java.util.Arrays;\n\nimport org.junit.Test;\n\nimport com.jd.easyflow.fsm.Fsm;\nimport com.jd.easyflow.fsm.exception.FsmException;\nimport com.jd.easyflow.fsm.model.check.CheckParam;\nimport com.jd.easyflow.fsm.model.check.CheckResult;\nimport com.jd.easyflow.fsm.model.check.impl.FsmStateLinkCheckConfig;\nimport com.jd.easyflow.fsm.model.check.impl.FsmStateLinkCheckFsmParseListener;\nimport com.jd.easyflow.fsm.model.check.impl.FsmStateLinkChecker;\nimport com.jd.easyflow.fsm.parser.FsmParser;\nimport com.jd.easyflow.fsm.util.FsmIOUtil;\n\n/**\n * @author liyuliang5\n */\npublic class FsmStateLinkCheckTest {\n\n    @Test\n    public void testNodeIsolated() throws Exception {\n        Fsm fsm = FsmParser.parse(FsmIOUtil.toString(this.getClass().getResourceAsStream(\"/fsm/cases/check/check_isolated_001.json\")));\n        \n        FsmStateLinkChecker checker = new FsmStateLinkChecker();\n        CheckParam param = new CheckParam();\n        param.setFsm(fsm);\n        FsmStateLinkCheckConfig config = new FsmStateLinkCheckConfig();\n        config.setCheckStateIsolated(true);\n        param.setConfig(config);\n        CheckResult result = checker.check(param);\n        assertEquals(2, result.getErrorItemList().size());\n        assertEquals(FsmStateLinkChecker.ERROR_TYPE_STATE_ISOLATED, result.getErrorItemList().get(0).getErrorType());\n    }\n    \n    @Test\n    public void testNextStateNotExists() throws Exception {\n        Fsm fsm = FsmParser.parse(FsmIOUtil.toString(this.getClass().getResourceAsStream(\"/fsm/cases/check/check_notExists_001.json\")));\n        \n        FsmStateLinkChecker checker = new FsmStateLinkChecker();\n        CheckParam param = new CheckParam();\n        param.setFsm(fsm);\n        FsmStateLinkCheckConfig config = new FsmStateLinkCheckConfig();\n        config.setCheckNextStatesNotExists(true);\n        param.setConfig(config);\n        CheckResult result = checker.check(param);\n        assertEquals(1, result.getErrorItemList().size());\n        assertEquals(FsmStateLinkChecker.ERROR_TYPE_NEXT_STATES_NOT_EXISTS, result.getErrorItemList().get(0).getErrorType());\n    }\n    \n    @Test\n    public void testNonStartNoPrevious() throws Exception {\n        Fsm fsm = FsmParser.parse(FsmIOUtil.toString(this.getClass().getResourceAsStream(\"/fsm/cases/check/check_nonStartNoPrevious_001.json\")));\n        \n        FsmStateLinkChecker checker = new FsmStateLinkChecker();\n        CheckParam param = new CheckParam();\n        param.setFsm(fsm);\n        FsmStateLinkCheckConfig config = new FsmStateLinkCheckConfig();\n        config.setCheckNonStartStateNoPrevious(true);\n        param.setConfig(config);\n        CheckResult result = checker.check(param);\n        assertEquals(1, result.getErrorItemList().size());\n        assertEquals(FsmStateLinkChecker.ERROR_TYPE_NON_START_STATE_NO_PREVIOUS, result.getErrorItemList().get(0).getErrorType());\n    }    \n    \n    @Test\n    public void testNonEndStateNoNext() throws Exception {\n        Fsm fsm = FsmParser.parse(FsmIOUtil.toString(this.getClass().getResourceAsStream(\"/fsm/cases/check/check_nonEndNoNext_001.json\")));\n        \n        FsmStateLinkChecker checker = new FsmStateLinkChecker();\n        CheckParam param = new CheckParam();\n        param.setFsm(fsm);\n        FsmStateLinkCheckConfig config = new FsmStateLinkCheckConfig();\n        config.setCheckNonEndStateNoNext(true);\n        param.setConfig(config);\n        CheckResult result = checker.check(param);\n        assertEquals(1, result.getErrorItemList().size());\n        assertEquals(FsmStateLinkChecker.ERROR_TYPE_NON_END_STATE_NO_NEXT, result.getErrorItemList().get(0).getErrorType());\n    } \n    \n    @Test(expected = FsmException.class)\n    public void testCheckListener() throws Exception {\n        FsmStateLinkCheckFsmParseListener listener = new FsmStateLinkCheckFsmParseListener();\n        listener.setCheckStateIsolatedPolicy(FsmStateLinkCheckFsmParseListener.CHECK_POLICY_EXCEPTION);\n        FsmParser.setPreListeners(Arrays.asList(listener));\n        Fsm fsm = FsmParser.parse(FsmIOUtil.toString(this.getClass().getResourceAsStream(\"/fsm/cases/check/check_isolated_001.json\")));\n             \n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-fsm/src/test/java/com/jd/easyflow/fsm/cases/event/MultipleEventTest.java",
    "content": "package com.jd.easyflow.fsm.cases.event;\n\nimport org.junit.Assert;\nimport org.junit.Test;\n\nimport com.jd.easyflow.fsm.Fsm;\nimport com.jd.easyflow.fsm.FsmManager;\nimport com.jd.easyflow.fsm.FsmParam;\nimport com.jd.easyflow.fsm.FsmResult;\nimport com.jd.easyflow.fsm.model.Transition;\n\n/**\n * Test multiple event.\n * @author liyuliang5\n *\n */\npublic class MultipleEventTest {\n\n    /**\n     * Test multiple event parse\n     */\n    @Test\n    public void testMultipleEvent() {\n        FsmManager manager = new FsmManager();\n        manager.setFsmPath(\"classpath:fsm/cases/multipleevent/fsm_multipleevent.json\");\n        manager.init();\n\n        Fsm fsm = manager.getFsm(\"multiple_event\");\n        Assert.assertEquals(2, fsm.getTransitionList().size());\n        Transition trans1 = fsm.getTransitionList().get(0);\n        Transition trans2 = fsm.getTransitionList().get(1);\n        Assert.assertEquals(\"_state_enter\", trans1.getEventId());\n        Assert.assertEquals(\"_state_check\", trans2.getEventId());\n        \n        FsmParam param1 = new FsmParam();\n        param1.setFsmId(\"multiple_event\");\n        param1.setEventId(\"_state_enter\");\n        param1.setCurrentStateId(\"WHITELIST\");\n        FsmResult result1 = fsm.run(param1);\n        Assert.assertEquals(true, result1.getLastTransitionResult());\n        \n        FsmParam param2 = new FsmParam();\n        param2.setFsmId(\"multiple_event\");\n        param2.setEventId(\"_state_enter\");\n        param2.setCurrentStateId(\"WHITELIST\");\n        FsmResult result2 = fsm.run(param1);\n        Assert.assertEquals(true, result2.getLastTransitionResult());\n    }\n}\n"
  },
  {
    "path": "easyflow-fsm/src/test/java/com/jd/easyflow/fsm/cases/filter/FsmFilterTest.java",
    "content": "package com.jd.easyflow.fsm.cases.filter;\n\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.fsm.Fsm;\nimport com.jd.easyflow.fsm.FsmManager;\nimport com.jd.easyflow.fsm.FsmParam;\nimport com.jd.easyflow.fsm.FsmResult;\nimport com.jd.easyflow.fsm.util.JsonUtil;\n\n/**\n * \n * @author liyuliang5\n */\npublic class FsmFilterTest {\n    \n    public static final Logger logger = LoggerFactory.getLogger(FsmFilterTest.class);\n\n    @Test\n    public void testTransitionPreHandlerFilter() {\n        FsmManager manager = new FsmManager();\n        manager.setFsmPath(\"classpath:fsm/cases/filter/tst_prehandler_filter_001.json\");\n        manager.init();\n\n        Fsm fsm = manager.getFsm(\"tst_prehandler_filter_001\");\n        \n        FsmParam param = new FsmParam();\n        param.setEventId(\"E1\");\n        FsmResult result = fsm.run(param);\n        logger.info(result.getState().getId());\n        logger.info(\"RESULT:\" + JsonUtil.toJsonString(result));\n        Assert.assertEquals(\"C\", result.getContext().getCurrentState().getId());\n    }\n    \n    @Test\n    public void testStateTransitionPreHandlerFilter() {\n        FsmManager manager = new FsmManager();\n        manager.setFsmPath(\"classpath:fsm/cases/filter/tst_prehandler_filter_002.json\");\n        manager.init();\n\n        Fsm fsm = manager.getFsm(\"tst_prehandler_filter_002\");\n        \n        FsmParam param = new FsmParam();\n        param.setCurrentStateId(\"A1\");\n        param.setEventId(\"E1\");\n        FsmResult result = fsm.run(param);\n        logger.info(result.getState().getId());\n        logger.info(\"RESULT:\" + JsonUtil.toJsonString(result));\n        Assert.assertEquals(\"C\", result.getContext().getCurrentState().getId());\n        \n        param.setCurrentStateId(\"A2\");\n        param.setEventId(\"E1\");\n        result = fsm.run(param);\n        logger.info(result.getState().getId());\n        logger.info(\"RESULT:\" + JsonUtil.toJsonString(result));\n        Assert.assertEquals(\"B\", result.getContext().getCurrentState().getId());\n    }\n    \n    @Test\n    public void testPreHandlerPostConstructFilter() {\n        FsmManager manager = new FsmManager();\n        manager.setFsmPath(\"classpath:fsm/cases/filter/tst_prehandler_filter_003.json\");\n        manager.init();\n\n        Fsm fsm = manager.getFsm(\"tst_prehandler_filter_003\");\n        \n        FsmParam param = new FsmParam();\n        param.setCurrentStateId(\"A1\");\n        param.setEventId(\"E1\");\n        FsmResult result = fsm.run(param);\n        logger.info(result.getState().getId());\n        logger.info(\"RESULT:\" + JsonUtil.toJsonString(result));\n        Assert.assertEquals(\"C\", result.getContext().getCurrentState().getId());\n        \n        param.setCurrentStateId(\"A2\");\n        param.setEventId(\"E1\");\n        result = fsm.run(param);\n        logger.info(result.getState().getId());\n        logger.info(\"RESULT:\" + JsonUtil.toJsonString(result));\n        Assert.assertEquals(\"B\", result.getContext().getCurrentState().getId());\n    }\n    \n//    /**\n//     * Dead loop when filter is empty.\n//     */\n//    @Test\n//    public void testEmptyTransitionFilter() {\n//        FsmManager manager = new FsmManager();\n//        manager.setFsmPath(\"classpath:fsm/cases/filter/tst_empty_filter_001.json\");\n//        manager.init();\n//\n//        Fsm fsm = manager.getFsm(\"tst_prehandler_filter_001\");\n//        \n//        FsmParam param = new FsmParam();\n//        param.setCurrentStateId(\"A1\");\n//        param.setEventId(\"E1\");\n//        FsmResult result = fsm.run(param);\n//        logger.info(result.getState().getId());\n//        logger.info(\"RESULT:\" + JsonUtil.toJsonString(result));\n//        \n//    }\n}\n"
  },
  {
    "path": "easyflow-fsm/src/test/java/com/jd/easyflow/fsm/cases/filter/PreHandlerPostConstructTestFilter.java",
    "content": "package com.jd.easyflow.fsm.cases.filter;\n\nimport java.util.List;\nimport java.util.Map;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.fsm.FsmContext;\nimport com.jd.easyflow.fsm.filter.Filter;\nimport com.jd.easyflow.fsm.filter.FilterChain;\nimport com.jd.easyflow.fsm.model.TransitionContext;\nimport com.jd.easyflow.fsm.util.Pair;\n\n/**\n * \n * @author liyuliang5\n */\npublic class PreHandlerPostConstructTestFilter implements Filter<Pair<TransitionContext, FsmContext>, Boolean> {\n    \n    private static final Logger logger = LoggerFactory.getLogger(StateTransitionPreHandlerTestFilter.class);\n    \n    private List<String> stateList;\n\n    @Override\n    public void postConstruct(Map<String, Object> definition, Map<String, Object> context) {\n        stateList = (List<String>) definition.get(\"states\");\n    }\n\n    @Override\n    public Boolean doFilter(Pair<TransitionContext, FsmContext> request,\n            FilterChain<Pair<TransitionContext, FsmContext>, Boolean> chain) {\n        if (stateList != null) {\n            if (! stateList.contains(request.getRight().getCurrentState().getId())) {\n                logger.info(\"preHandler filter skip\");\n                chain.doFilter(request);\n                return true;\n            }\n        }\n        \n        FsmContext context = request.getRight();\n        context.setCurrentState(context.getFsm().getState(\"C\"));\n        return false;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/test/java/com/jd/easyflow/fsm/cases/filter/StateTransitionPreHandlerTestFilter.java",
    "content": "package com.jd.easyflow.fsm.cases.filter;\n\nimport java.util.List;\nimport java.util.Map;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.fsm.FsmContext;\nimport com.jd.easyflow.fsm.filter.Filter;\nimport com.jd.easyflow.fsm.filter.FilterChain;\nimport com.jd.easyflow.fsm.model.TransitionContext;\nimport com.jd.easyflow.fsm.util.Pair;\n\n/**\n * \n * @author liyuliang5\n */\npublic class StateTransitionPreHandlerTestFilter implements Filter<Pair<TransitionContext, FsmContext>, Boolean> {\n    \n    private static final Logger logger = LoggerFactory.getLogger(StateTransitionPreHandlerTestFilter.class);\n    \n    private List<String> stateList;\n\n    public StateTransitionPreHandlerTestFilter(Map<String, Object> def) {\n        stateList = (List<String>) def.get(\"states\");\n    }\n\n    @Override\n    public Boolean doFilter(Pair<TransitionContext, FsmContext> request,\n            FilterChain<Pair<TransitionContext, FsmContext>, Boolean> chain) {\n        if (stateList != null) {\n            if (! stateList.contains(request.getRight().getCurrentState().getId())) {\n                logger.info(\"preHandler filter skip\");\n                chain.doFilter(request);\n                return true;\n            }\n        }\n        \n        FsmContext context = request.getRight();\n        context.setCurrentState(context.getFsm().getState(\"C\"));\n        return false;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/test/java/com/jd/easyflow/fsm/cases/filter/TransitionEmptyFilter.java",
    "content": "package com.jd.easyflow.fsm.cases.filter;\n\nimport com.jd.easyflow.fsm.FsmContext;\nimport com.jd.easyflow.fsm.filter.Filter;\nimport com.jd.easyflow.fsm.filter.FilterChain;\nimport com.jd.easyflow.fsm.model.Transition;\nimport com.jd.easyflow.fsm.model.TransitionContext;\nimport com.jd.easyflow.fsm.util.Triple;\n\npublic class TransitionEmptyFilter implements Filter<Triple<Transition, TransitionContext, FsmContext>, Void> {\n\n    @Override\n    public Void doFilter(Triple<Transition, TransitionContext, FsmContext> request,\n            FilterChain<Triple<Transition, TransitionContext, FsmContext>, Void> chain) {\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/test/java/com/jd/easyflow/fsm/cases/filter/TransitionPreHandlerTestFilter.java",
    "content": "package com.jd.easyflow.fsm.cases.filter;\n\nimport com.jd.easyflow.fsm.FsmContext;\nimport com.jd.easyflow.fsm.filter.Filter;\nimport com.jd.easyflow.fsm.filter.FilterChain;\nimport com.jd.easyflow.fsm.model.TransitionContext;\nimport com.jd.easyflow.fsm.util.Pair;\n\n/**\n * \n * @author liyuliang5\n */\npublic class TransitionPreHandlerTestFilter implements Filter<Pair<TransitionContext, FsmContext>, Boolean> {\n\n    @Override\n    public Boolean doFilter(Pair<TransitionContext, FsmContext> request,\n            FilterChain<Pair<TransitionContext, FsmContext>, Boolean> chain) {\n        FsmContext context = request.getRight();\n        context.setCurrentState(context.getFsm().getState(\"C\"));\n        return false;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/test/java/com/jd/easyflow/fsm/cases/fsmmanager/PocFsm.java",
    "content": "package com.jd.easyflow.fsm.cases.fsmmanager;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport com.jd.easyflow.fsm.FsmContext;\nimport com.jd.easyflow.fsm.FsmParam;\nimport com.jd.easyflow.fsm.FsmResult;\nimport com.jd.easyflow.fsm.model.Event;\nimport com.jd.easyflow.fsm.model.FsmLifeCycle;\nimport com.jd.easyflow.fsm.model.State;\nimport com.jd.easyflow.fsm.model.Transition;\nimport com.jd.easyflow.fsm.model.TransitionContext;\n\n/**\n * This is only a POC Fsm.\n * @author liyuliang5\n */\npublic abstract class PocFsm implements FsmLifeCycle {\n\n    private String id;\n\n    private List<State> stateList = new ArrayList<State>();\n\n    private String startStateId;\n\n    private Map<String, State> stateMap = new HashMap<String, State>();\n\n    private Map<String, Integer> stateIndexMap = new HashMap<>();\n\n    private List<Event> eventList = new ArrayList<Event>();\n\n    private Map<String, Event> eventMap = new HashMap<String, Event>();\n\n    private List<Transition> transitionList = new ArrayList<Transition>();\n\n    private Map<String, Transition> transitionMap = new HashMap<String, Transition>();\n\n    /**\n     * \n     * \n     * @param event\n     * @param context\n     */\n    public FsmResult run(FsmParam param) {\n        // init context\n        FsmContext context = new FsmContext();\n        FsmResult result = new FsmResult();\n        context.setParam(param);\n        context.setResult(result);\n        result.setContext(context);\n        \n        // init start state and event\n        State currentState = getState(param.getCurrentStateId());\n        context.setCurrentState(currentState);\n        Event currentEvent = getEvent(param.getEventId());\n        context.setCurrentEvent(currentEvent);\n\n        // loop run\n        while (true) {\n            currentState = context.getCurrentState();\n            Event event = context.getCurrentEvent();\n            if (event == null) {\n                break;\n            }\n            String transitionKey = createTransitionKey(currentState, event);\n            Transition transition = transitionMap.get(transitionKey);\n            if (transition == null) {\n                break;\n            }\n\n            context.setTransitionState(context.getCurrentState());\n            context.setTransitionEvent(context.getCurrentEvent());\n            context.setTransitionActionResult(null);\n            context.setTransitionPostState(null);\n\n            TransitionContext transitionContext = new TransitionContext();\n            transitionContext.setTransition(transition);\n            transition.execute(transitionContext, context);\n        }\n\n        // return result\n        result.setResult(context.getFirstTransitionActionResult());\n        return result;\n    }\n\n    public String getId() {\n        return id;\n    }\n\n    public void setId(String id) {\n        this.id = id;\n    }\n\n    public List<State> getStateList() {\n        return stateList;\n    }\n\n    public void initStateList(List<State> stateList) {\n        for (State state : stateList) {\n            addState(state);\n        }\n    }\n\n    public List<Event> getEventList() {\n        return eventList;\n    }\n\n    public void setEventList(List<Event> eventList) {\n        this.eventList = eventList;\n    }\n\n    public void addState(State state) {\n        if (!stateMap.containsKey(state.getId())) {\n            stateMap.put(state.getId(), state);\n            stateList.add(state);\n            stateIndexMap.put(state.getId(), stateList.size() - 1);\n        }\n    }\n\n    public State getState(String stateId) {\n        return stateMap.get(stateId);\n    }\n\n    public void addEvent(Event event) {\n        if (!eventMap.containsKey(event.getId())) {\n            eventMap.put(event.getId(), event);\n            eventList.add(event);\n        }\n    }\n\n    public Event getEvent(String eventId) {\n        return eventMap.get(eventId);\n    }\n\n    public void addTransition(Transition transition) {\n        String fromId = transition.getFromId();\n        String eventId = transition.getEventId();\n        if (fromId == null) {\n            throw new RuntimeException(\"fromId can not be empty\");\n        }\n        if (eventId == null) {\n            throw new RuntimeException(\"eventId  can not be empty\");\n        }\n        transitionList.add(transition);\n        transitionMap.put(createTransitionKey(fromId, eventId), transition);\n    }\n\n    /**\n     * \n     * Process before transition.\n     *\n     * @param context\n     */\n    public void beforeTransition(FsmContext context) {\n\n    }\n\n    /**\n     * \n     * Process after transition.\n     *\n     * @param context\n     */\n    public void afterTransition(FsmContext context) {\n        context.setTransitionExecuted(true);\n    }\n\n    private String createTransitionKey(State from, Event event) {\n        return \"state_\" + from.getId() + \"_event_\" + event.getId();\n    }\n\n    private String createTransitionKey(String fromId, String eventId) {\n        return \"state_\" + fromId + \"_event_\" + eventId;\n    }\n\n    public List<Transition> getTransitionList() {\n        return transitionList;\n    }\n\n    public void setTransitionList(List<Transition> transitionList) {\n        this.transitionList = transitionList;\n    }\n\n    public String getStartStateId() {\n        return startStateId;\n    }\n\n    public void setStartStateId(String startStateId) {\n        this.startStateId = startStateId;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/test/java/com/jd/easyflow/fsm/cases/fsmmanager/PocFsmManager.java",
    "content": "package com.jd.easyflow.fsm.cases.fsmmanager;\n\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport com.jd.easyflow.fsm.Fsm;\nimport com.jd.easyflow.fsm.FsmParam;\nimport com.jd.easyflow.fsm.FsmResult;\n\n/**\n * \n * @author liyuliang5\n */\npublic abstract class PocFsmManager {\n\n    protected Map<String, Fsm> fsmMap = new ConcurrentHashMap<>();\n\n    private String fsmPath;\n\n\n    public FsmResult run(FsmParam param) {\n            return invokeFsm(param);\n    }\n\n    protected FsmResult invokeFsm(FsmParam param) {\n            Fsm fsm = fsmMap.get(param.getFsmId());\n            FsmResult result = fsm.run(param);\n            return result;\n    }\n\n    public String getFsmPath() {\n        return fsmPath;\n    }\n\n    public void setFsmPath(String fsmPath) {\n        this.fsmPath = fsmPath;\n    }\n\n    public Map<String, Fsm> getFsmMap() {\n        return fsmMap;\n    }\n\n    public void setFsmMap(Map<String, Fsm> fsmMap) {\n        this.fsmMap = fsmMap;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/test/java/com/jd/easyflow/fsm/cases/fsmmanager/PocTransition.java",
    "content": "package com.jd.easyflow.fsm.cases.fsmmanager;\n\nimport java.util.List;\n\nimport com.jd.easyflow.fsm.FsmContext;\nimport com.jd.easyflow.fsm.model.PostHandleResult;\nimport com.jd.easyflow.fsm.model.Transition;\nimport com.jd.easyflow.fsm.model.TransitionAction;\nimport com.jd.easyflow.fsm.model.TransitionContext;\nimport com.jd.easyflow.fsm.model.TransitionPostHandler;\nimport com.jd.easyflow.fsm.model.TransitionPreHandler;\n\n/**\n * \n * @author liyuliang5\n */\npublic abstract class PocTransition implements Transition {\n\n    protected String fromId;\n\n    protected String eventId;\n\n    protected List<String> toIdList;\n\n    protected TransitionPreHandler preHandler;\n\n    protected TransitionAction action;\n\n    protected TransitionPostHandler postHandler;\n\n    @Override\n    public void execute(TransitionContext transitionContext, FsmContext context) {\n        boolean preResult = true;\n        if (preHandler != null) {\n            preResult = preHandler.preHandle(transitionContext, context);\n            transitionContext.setPreResult(preResult);\n        }\n        if (!preResult) {\n            return;\n        }\n        if (action != null) {\n            Object actionResult = action.execute(transitionContext, context);\n            transitionContext.setActionResult(actionResult);\n        }\n\n        if (postHandler != null) {\n            PostHandleResult postHandleResult = postHandler.postHandle(transitionContext, context);\n            if (postHandleResult != null) {\n                transitionContext.setPostStateId(postHandleResult.getPostStateId());\n                transitionContext.setPostEventId(postHandleResult.getPostEventId());\n            }\n        }\n    }\n\n    public TransitionPreHandler getPreHandler() {\n        return preHandler;\n    }\n\n    public void setPreHandler(TransitionPreHandler preHandler) {\n        this.preHandler = preHandler;\n    }\n\n    public TransitionAction getAction() {\n        return action;\n    }\n\n    public void setAction(TransitionAction action) {\n        this.action = action;\n    }\n\n    public TransitionPostHandler getPostHandler() {\n        return postHandler;\n    }\n\n    public void setPostHandler(TransitionPostHandler postHandler) {\n        this.postHandler = postHandler;\n    }\n\n    @Override\n    public String getFromId() {\n        return fromId;\n    }\n\n    public void setFromId(String fromId) {\n        this.fromId = fromId;\n    }\n\n    @Override\n    public String getEventId() {\n        return eventId;\n    }\n\n    public void setEventId(String eventId) {\n        this.eventId = eventId;\n    }\n\n    @Override\n    public List<String> getToIdList() {\n        return toIdList;\n    }\n\n    public void setToIdList(List<String> toIdList) {\n        this.toIdList = toIdList;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/test/java/com/jd/easyflow/fsm/cases/mockbiz/CompanyAuthService.java",
    "content": "package com.jd.easyflow.fsm.cases.mockbiz;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class CompanyAuthService {\n    \n    public static final Logger logger = LoggerFactory.getLogger(CompanyAuthService.class);\n\n    public boolean isAuth() {\n        return false;\n    }\n    \n    public void saveCompanyAuth(String companyName) {\n        logger.info(\"Save company realname:\" + companyName);\n    }\n}\n"
  },
  {
    "path": "easyflow-fsm/src/test/java/com/jd/easyflow/fsm/cases/mockbiz/FsmMockBizTest.java",
    "content": "package com.jd.easyflow.fsm.cases.mockbiz;\n\nimport static org.junit.Assert.assertEquals;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.fsm.Fsm;\nimport com.jd.easyflow.fsm.FsmManager;\nimport com.jd.easyflow.fsm.FsmParam;\nimport com.jd.easyflow.fsm.FsmResult;\nimport com.jd.easyflow.fsm.util.JsonUtil;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FsmMockBizTest {\n\n    \n    public static final Logger logger = LoggerFactory.getLogger(FsmMockBizTest.class);\n\n    /**\n     * \n     * Test create fsm instance.\n     *\n     */\n    @Test\n    public void testFsm001Create() {\n        FsmManager manager = new FsmManager();\n        manager.setFsmPath(\"classpath:fsm/cases/mockbiz/fsm_mockbiz.json\");\n        manager.init();\n\n        Fsm fsm = manager.getFsm(\"apply_001\");\n        \n        //Empty param, default is create instance, execute from start state.\n        FsmParam param = new FsmParam();\n        FsmResult result = fsm.run(param);\n        logger.info(result.getState().getId());\n        logger.info(\"RESULT:\" + JsonUtil.toJsonString(result));\n    }\n    \n    @Test\n    public void testFsm001Run() {\n        FsmManager manager = new FsmManager();\n        manager.setFsmPath(\"classpath:fsm/cases/mockbiz/fsm_mockbiz.json\");\n        manager.init();\n\n        Fsm fsm = manager.getFsm(\"apply_001\");\n        \n        FsmParam param = new FsmParam();\n        param.setCurrentStateId(\"COMPANY_AUTH\");\n        param.setEventId(\"SUBMIT_COMPANY_AUTH\");\n        param.setParam(\"Test Company\");\n        FsmResult result = fsm.run(param);\n        logger.info(\"Result:\" + JsonUtil.toJsonString(result));\n    }\n    \n    @Test\n    public void testConditionTrue() {\n        WhitelistService.whitelist = true;\n        FsmManager manager = new FsmManager();\n        manager.setFsmPath(\"classpath:fsm/cases/mockbiz/fsm_mockbiz.json\");\n        manager.init();\n\n        Fsm fsm = manager.getFsm(\"apply_001\");\n        \n        FsmParam param = new FsmParam();\n        param.setCurrentStateId(\"WHITELIST\");\n        param.setEventId(\"QUERY_WHITELIST\");\n        param.setParam(\"Test Company\");\n        FsmResult result = fsm.run(param);\n        logger.info(\"Result:\" + JsonUtil.toJsonString(result));    \n        assertEquals(\"COMPANY_AUTH\", result.getState().getId());\n    }\n    \n    @Test\n    public void testConditionFalse() {\n        WhitelistService.whitelist = false;\n        FsmManager manager = new FsmManager();\n        manager.setFsmPath(\"classpath:fsm/cases/mockbiz/fsm_mockbiz.json\");\n        manager.init();\n\n        Fsm fsm = manager.getFsm(\"apply_001\");\n        \n        FsmParam param = new FsmParam();\n        param.setCurrentStateId(\"WHITELIST\");\n        param.setEventId(\"QUERY_WHITELIST\");\n        param.setParam(\"Test Company\");\n        FsmResult result = fsm.run(param);\n        logger.info(\"Result:\" + JsonUtil.toJsonString(result));    \n        assertEquals(\"WHITELIST\", result.getState().getId());\n    }\n}\n"
  },
  {
    "path": "easyflow-fsm/src/test/java/com/jd/easyflow/fsm/cases/mockbiz/WhitelistService.java",
    "content": "package com.jd.easyflow.fsm.cases.mockbiz;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class WhitelistService {\n    \n    public static boolean whitelist = true;\n\n    public boolean isWhitelist() {\n        return whitelist;\n    }\n}\n"
  },
  {
    "path": "easyflow-fsm/src/test/java/com/jd/easyflow/fsm/cases/parser/FsmParserTest.java",
    "content": "package com.jd.easyflow.fsm.cases.parser;\n\nimport java.io.InputStream;\n\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.core.io.Resource;\nimport org.springframework.core.io.support.PathMatchingResourcePatternResolver;\n\nimport com.jd.easyflow.fsm.Fsm;\nimport com.jd.easyflow.fsm.parser.FsmParser;\nimport com.jd.easyflow.fsm.util.FsmIOUtil;\nimport com.jd.easyflow.fsm.util.JsonUtil;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FsmParserTest {\n    \n    private static final Logger logger = LoggerFactory.getLogger(FsmParserTest.class);\n\n    @Test\n    public void testParseFsm() throws Exception {\n        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();\n        Resource[] resources;\n        InputStream is = null;\n        resources = resolver.getResources(\"classpath:fsm/cases/parser/fsm_parser_test.json\");\n        for (Resource resource : resources) {\n            logger.info(\"Start parse definition file:\" + resource.getURI());\n            is = resource.getInputStream();\n            String fsmConfigStr = FsmIOUtil.toString(is);\n            Fsm fsm = FsmParser.parse(fsmConfigStr);\n            logger.info(\"Parse end, model is:\" + JsonUtil.toJsonString(fsm));\n            is.close();\n        }\n    }\n    \n    @Test\n    public void testParseCreateExp() throws Exception {\n        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();\n        Resource[] resources;\n        InputStream is = null;\n        resources = resolver.getResources(\"classpath:fsm/cases/parser/fsm_parser_test_create_exp.json\");\n        for (Resource resource : resources) {\n            logger.info(\"Start parse definition file:\" + resource.getURI());\n            is = resource.getInputStream();\n            String fsmConfigStr = FsmIOUtil.toString(is);\n            Fsm fsm = FsmParser.parse(fsmConfigStr);\n            Assert.assertNotNull(fsm.getTransitionList().get(0));\n            logger.info(\"Parse end, model is:\" + JsonUtil.toJsonString(fsm));\n        }\n    }\n}\n"
  },
  {
    "path": "easyflow-fsm/src/test/java/com/jd/easyflow/fsm/cases/parser/TestTransitionAction.java",
    "content": "package com.jd.easyflow.fsm.cases.parser;\n\nimport com.jd.easyflow.fsm.FsmContext;\nimport com.jd.easyflow.fsm.model.TransitionAction;\nimport com.jd.easyflow.fsm.model.TransitionContext;\n\n/**\n * @author liyuliang5\n *\n */\npublic class TestTransitionAction implements TransitionAction {\n\n    @Override\n    public Object execute(TransitionContext transitionContext, FsmContext context) {\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/test/java/com/jd/easyflow/fsm/cases/post/PostTest.java",
    "content": "package com.jd.easyflow.fsm.cases.post;\n\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.fsm.Fsm;\nimport com.jd.easyflow.fsm.FsmManager;\nimport com.jd.easyflow.fsm.FsmParam;\nimport com.jd.easyflow.fsm.FsmResult;\nimport com.jd.easyflow.fsm.util.JsonUtil;\n\n/**\n * \n * @author liyuliang5\n */\npublic class PostTest {\n\n    public static final Logger logger = LoggerFactory.getLogger(PostTest.class);\n\n    @Test\n    public void testPostManually() {\n        FsmManager manager = new FsmManager();\n        manager.setFsmPath(\"classpath:fsm/cases/post/fsm_post_manually.json\");\n        manager.init();\n        Fsm fsm = manager.getFsm(\"post_manually\");\n        //Empty param, default is create instance, execute from start state.\n        FsmParam param = new FsmParam();\n        FsmResult result = fsm.run(param);\n        logger.info(result.getState().getId());\n        logger.info(\"RESULT:\" + JsonUtil.toJsonString(result));\n        Assert.assertEquals(\"S2\", result.getState().getId());\n    }\n}\n"
  },
  {
    "path": "easyflow-fsm/src/test/java/com/jd/easyflow/fsm/cases/post/TestPostManuallyTransitionPreHandlerFilter.java",
    "content": "package com.jd.easyflow.fsm.cases.post;\n\nimport com.jd.easyflow.fsm.FsmContext;\nimport com.jd.easyflow.fsm.filter.Filter;\nimport com.jd.easyflow.fsm.filter.FilterChain;\nimport com.jd.easyflow.fsm.model.State;\nimport com.jd.easyflow.fsm.model.TransitionContext;\nimport com.jd.easyflow.fsm.util.FsmUtil;\nimport com.jd.easyflow.fsm.util.Pair;\nimport com.jd.easyflow.fsm.util.TransitionUtil;\n\n/**\n * \n * @author liyuliang5\n */\npublic class TestPostManuallyTransitionPreHandlerFilter\n        implements Filter<Pair<TransitionContext, FsmContext>, Boolean> {\n\n    @Override\n    public Boolean doFilter(Pair<TransitionContext, FsmContext> request,\n            FilterChain<Pair<TransitionContext, FsmContext>, Boolean> chain) {\n        TransitionContext transitionContext = request.getLeft();\n        FsmContext fsmContext = request.getRight();\n        State state = FsmUtil.state(transitionContext, fsmContext);\n        if (\"S1\".equals(state.getId())) {\n            TransitionUtil.post(\"S2\", null, transitionContext, fsmContext);\n            return false;\n\n        }\n        return chain.doFilter(request);\n    }\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/test/java/com/jd/easyflow/fsm/cases/postevent/PostEventTest.java",
    "content": "package com.jd.easyflow.fsm.cases.postevent;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.fsm.Fsm;\nimport com.jd.easyflow.fsm.FsmManager;\nimport com.jd.easyflow.fsm.FsmParam;\nimport com.jd.easyflow.fsm.FsmResult;\nimport com.jd.easyflow.fsm.cases.mockbiz.FsmMockBizTest;\nimport com.jd.easyflow.fsm.util.JsonUtil;\n\npublic class PostEventTest {\n\n    public static final Logger logger = LoggerFactory.getLogger(FsmMockBizTest.class);\n\n    /**\n     * \n     * Test create fsm instance.\n     *\n     */\n    @Test\n    public void testFsm001Create() {\n        FsmManager manager = new FsmManager();\n        manager.setFsmPath(\"classpath:fsm/cases/postevent/fsm_postevent.json\");\n        manager.init();\n\n        Fsm fsm = manager.getFsm(\"post_event\");\n        \n        //Empty param, default is create instance, execute from start state.\n        FsmParam param = new FsmParam();\n        FsmResult result = fsm.run(param);\n        logger.info(result.getState().getId());\n        logger.info(\"RESULT:\" + JsonUtil.toJsonString(result));\n    }\n}\n"
  },
  {
    "path": "easyflow-fsm/src/test/java/com/jd/easyflow/fsm/quickstart/AStateE1EventTstAction.java",
    "content": "package com.jd.easyflow.fsm.quickstart;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.fsm.FsmContext;\nimport com.jd.easyflow.fsm.model.TransitionAction;\nimport com.jd.easyflow.fsm.model.TransitionContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class AStateE1EventTstAction implements TransitionAction {\n    \n    private static final Logger logger = LoggerFactory.getLogger(AStateE1EventTstAction.class);\n\n    @Override\n    public Object execute(TransitionContext transitionContext, FsmContext context) {\n        logger.info(\"Execute TST Action\");\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-fsm/src/test/java/com/jd/easyflow/fsm/quickstart/FsmQuickStartTest.java",
    "content": "package com.jd.easyflow.fsm.quickstart;\n\nimport static org.junit.Assert.assertEquals;\n\nimport org.junit.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.fsm.Fsm;\nimport com.jd.easyflow.fsm.FsmContext;\nimport com.jd.easyflow.fsm.FsmManager;\nimport com.jd.easyflow.fsm.FsmParam;\nimport com.jd.easyflow.fsm.FsmResult;\nimport com.jd.easyflow.fsm.builder.FsmBuilder;\nimport com.jd.easyflow.fsm.model.Event;\nimport com.jd.easyflow.fsm.model.State;\nimport com.jd.easyflow.fsm.model.impl.EventImpl;\nimport com.jd.easyflow.fsm.model.impl.StateImpl;\nimport com.jd.easyflow.fsm.util.JsonUtil;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class FsmQuickStartTest {\n\n    private static final Logger logger = LoggerFactory.getLogger(FsmQuickStartTest.class);\n    \n    /**\n     * Build FSM by json configuration.\n     */\n    @Test\n    public void testConfigSample() {\n        FsmManager manager = new FsmManager();\n        manager.setFsmPath(\"classpath:fsm/quickstart/quickstart_001.json\");\n        manager.init();\n\n        Fsm fsm = manager.getFsm(\"quickstart_001\");\n        FsmParam param = new FsmParam();\n        param.setEventId(\"E1\");\n        FsmResult result = fsm.run(param);\n        logger.info(result.getState().getId());\n        logger.info(\"RESULT:\" + JsonUtil.toJsonString(result));\n        assertEquals(\"B\", result.getState().getId());\n    }\n    \n    /**\n     * Build FSM by coding.\n     */\n\t@Test\n\tpublic void testCodingSample() {\n\t\t// Create FSM\n\t\tState stateA = new StateImpl(\"A\");\n\t\tState stateB = new StateImpl(\"B\");\n\t\tEvent event1 = new EventImpl(\"1\");\n\t\tFsm fsm = FsmBuilder.create(\"test\").transition(stateA, event1, stateB).build();\n\t\t// Execute FSM\n\t\tFsmContext context = new FsmContext();\n\t\tcontext.setCurrentState(stateA);\n\t\tcontext.setCurrentEvent(event1);\n\t\tFsmParam param = new FsmParam();\n\t\tparam.setContext(context);\n\t\tFsmResult result = fsm.run(param);\n\t\tlogger.info(\"RESULT:\" + JsonUtil.toJsonString(result));\n\t}\n}\n"
  },
  {
    "path": "easyflow-fsm/src/test/resources/fsm/cases/check/check_isolated_001.json",
    "content": "{\n\"id\":\"check_isolated_001\",\n\"transitions\":[\n{\"from\":\"state001\", \"event\":\"event1\"},\n{\"from\":\"state002\", \"event\":\"event1\"}\n]\n}"
  },
  {
    "path": "easyflow-fsm/src/test/resources/fsm/cases/check/check_nonEndNoNext_001.json",
    "content": "{\n\"id\":\"check_nonEndNoNext_001\",\n\"transitions\":[\n{\"from\":\"state001\", \"event\":\"event1\", \"post\":{\"to\":\"state002\"}},\n{\"from\":\"state002\", \"event\":\"event1\"}\n]\n}"
  },
  {
    "path": "easyflow-fsm/src/test/resources/fsm/cases/check/check_nonStartNoPrevious_001.json",
    "content": "{\n\"id\":\"check_nonStartNoPrevious_001\",\n\"transitions\":[\n{\"from\":\"state001\", \"event\":\"event1\", \"post\":{\"to\":\"state002\"}},\n{\"from\":\"state002\", \"event\":\"event1\"}\n]\n}"
  },
  {
    "path": "easyflow-fsm/src/test/resources/fsm/cases/check/check_notExists_001.json",
    "content": "{\n\"id\":\"check_notExists_001\",\n\"transitions\":[\n{\"from\":\"state001\", \"event\":\"event1\", \"post\":{\"to\":\"state002\"}},\n{\"from\":\"state002\", \"event\":\"event1\", \"post\":{\"to\":\"nonExists\"}}\n]\n}"
  },
  {
    "path": "easyflow-fsm/src/test/resources/fsm/cases/filter/tst_empty_filter_001.json",
    "content": "{\n    \"id\": \"tst_prehandler_filter_001\",\n    \"states\": [\n        {\"id\": \"A\",\"name\": \"A\", \"start\":true},\n        {\"id\": \"B\",\"name\": \"B\"},\n        {\"id\": \"C\",\"name\": \"C\"}\n    ],\n    \"events\": [\n        {\"id\": \"E1\",\"name\": \"Event1\"}\n    ],\n    \"transitions\": [\n        {\"from\": \"A\",\"event\": \"E1\", \"post\":{\"to\":\"B\"}}\n    ],\n    \"listeners\":[\n    {\"createExp\":\"new com.jd.easyflow.fsm.listener.FsmCommonListener()\"}\n    ],\n    \"transitionFilters\":[{\"createExp\":\"new com.jd.easyflow.fsm.cases.filter.TransitionEmptyFilter()\"}]\n}"
  },
  {
    "path": "easyflow-fsm/src/test/resources/fsm/cases/filter/tst_prehandler_filter_001.json",
    "content": "{\n    \"id\": \"tst_prehandler_filter_001\",\n    \"states\": [\n        {\"id\": \"A\",\"name\": \"A\", \"start\":true},\n        {\"id\": \"B\",\"name\": \"B\"},\n        {\"id\": \"C\",\"name\": \"C\"}\n    ],\n    \"events\": [\n        {\"id\": \"E1\",\"name\": \"Event1\"}\n    ],\n    \"transitions\": [\n        {\"from\": \"A\",\"event\": \"E1\", \"post\":{\"to\":\"B\"}}\n    ],\n    \"listeners\":[\n    {\"createExp\":\"new com.jd.easyflow.fsm.listener.FsmCommonListener()\"}\n    ],\n    \"transitionPreHandlerFilters\":[{\"createExp\":\"new com.jd.easyflow.fsm.cases.filter.TransitionPreHandlerTestFilter()\", \"states\":[]}]\n}"
  },
  {
    "path": "easyflow-fsm/src/test/resources/fsm/cases/filter/tst_prehandler_filter_002.json",
    "content": "{\n    \"id\": \"tst_prehandler_filter_002\",\n    \"states\": [\n        {\"id\": \"A1\",\"name\": \"A1\"},\n        {\"id\": \"A2\",\"name\": \"A2\"},\n        {\"id\": \"B\",\"name\": \"B\"},\n        {\"id\": \"C\",\"name\": \"C\"}\n    ],\n    \"events\": [\n        {\"id\": \"E1\",\"name\": \"Event1\"}\n    ],\n    \"transitions\": [\n        {\"from\": [\"A1\", \"A2\"],\"event\": \"E1\", \"post\":{\"to\":\"B\"}}\n    ],\n    \"listeners\":[\n    {\"createExp\":\"new com.jd.easyflow.fsm.listener.FsmCommonListener()\"}\n    ],\n    \"transitionPreHandlerFilters\":[{\"createExp\":\"new com.jd.easyflow.fsm.cases.filter.StateTransitionPreHandlerTestFilter(definition)\", \"states\":[\"A1\"]}]\n}"
  },
  {
    "path": "easyflow-fsm/src/test/resources/fsm/cases/filter/tst_prehandler_filter_003.json",
    "content": "{\n    \"id\": \"tst_prehandler_filter_003\",\n    \"states\": [\n        {\"id\": \"A1\",\"name\": \"A1\"},\n        {\"id\": \"A2\",\"name\": \"A2\"},\n        {\"id\": \"B\",\"name\": \"B\"},\n        {\"id\": \"C\",\"name\": \"C\"}\n    ],\n    \"events\": [\n        {\"id\": \"E1\",\"name\": \"Event1\"}\n    ],\n    \"transitions\": [\n        {\"from\": [\"A1\", \"A2\"],\"event\": \"E1\", \"post\":{\"to\":\"B\"}}\n    ],\n    \"listeners\":[\n    {\"createExp\":\"new com.jd.easyflow.fsm.listener.FsmCommonListener()\"}\n    ],\n    \"transitionPreHandlerFilters\":[{\"createExp\":\"new com.jd.easyflow.fsm.cases.filter.PreHandlerPostConstructTestFilter()\", \"states\":[\"A1\"]}]\n}"
  },
  {
    "path": "easyflow-fsm/src/test/resources/fsm/cases/mockbiz/fsm_mockbiz.json",
    "content": "{\n\t\"id\": \"apply_001\",\n\t\"name\":\"CREDIT ACCESS FLOW\",\n\t\"states\": [\n\t\t{\"id\": \"WHITELIST\",\"name\": \"Whitelist check\", \"start\":true, \"properties\": {}},\n\t\t{\"id\": \"COMPANY_AUTH\",\"name\": \"Company identity auth\", \"properties\": {}},\n\t\t{\"id\": \"COMPANY_INFO\",\"name\": \"Additional info input\", \"properties\": {}}\n\t],\n\t\"events\": [\n\t\t{\"id\": \"QUERY_WHITELIST\",\"name\": \"Query whitelist\"},\n\t\t\n\t\t{\"id\": \"QUERY_COMPANY_AUTH\",\"name\": \"Query company auth status\"},\n\t\t{\"id\": \"SUBMIT_COMPANY_AUTH\",\"name\": \"Submit company auth info\"},\n\t\t\n\t\t{\"id\": \"QUERY_COMPANY_INFO\",\"name\": \"Query additional info\"},\n\t\t{\"id\": \"SUBMIT_COMPANY_INFO\",\"name\": \"Submit additional info\"}\n\t],\n\t\"transitions\": [\n\t    {\"from\": \"WHITELIST\",\"event\": [\"_state_enter\",\"_state_check\"],\"action\":{\"exp\":\"new com.jd.easyflow.fsm.cases.mockbiz.WhitelistService().isWhitelist()\"}, \"post\":{\"conditions\":[{\"when\":\"context.transitionActionResult\", \"to\":\"COMPANY_AUTH\"}]}},\n\t\t{\"from\": \"WHITELIST\",\"event\": \"QUERY_WHITELIST\",\"action\":{\"exp\":\"new com.jd.easyflow.fsm.cases.mockbiz.WhitelistService().isWhitelist()\"}, \"post\":{\"when\":\"context.transitionActionResult\", \"to\":\"COMPANY_AUTH\"}},\n\t\t\n\t\t{\"from\": \"COMPANY_AUTH\",\"event\": \"_state_enter\",\"action\": {\"exp\":\"new com.jd.easyflow.fsm.cases.mockbiz.CompanyAuthService().isAuth()\"},\"post\": {\"conditions\":[{\"when\":\"context.transitionActionResult\", \"to\":\"COMPANY_INFO\"}]}},\n\t\t{\"from\": \"COMPANY_AUTH\",\"event\": \"QUERY_COMPANY_AUTH\",\"action\": {\"exp\":\"\"}},\n\t\t{\"from\": \"COMPANY_AUTH\",\"event\": \"SUBMIT_COMPANY_AUTH\",\"action\": {\"exp\":\"new com.jd.easyflow.fsm.cases.mockbiz.CompanyAuthService().saveCompanyAuth(param.param)\"}, \"post\":{\"to\":\"COMPANY_INFO\"}},\n\t\t\n\t\t{\"from\": \"COMPANY_INFO\",\"event\": \"QUERY_COMPANY_INFO\",\"action\": {\"exp\":\"\"}},\n\t\t{\"from\": \"COMPANY_INFO\",\"event\": \"SUBMIT_COMPANY_INFO\",\"action\": {\"exp\":\"\"},\"post\": {\"exp\":\"\"}}\n\t],\n\t\"listeners\":[\n\t{\"createExp\":\"new com.jd.easyflow.fsm.listener.FsmCommonListener()\"}\n\t]\n}"
  },
  {
    "path": "easyflow-fsm/src/test/resources/fsm/cases/multipleevent/fsm_multipleevent.json",
    "content": "{\n    \"id\": \"multiple_event\",\n    \"name\":\"CREDIT ACCESS FLOW\",\n    \"transitions\": [\n        {\"from\": \"WHITELIST\",\"event\": [\"_state_enter\",\"_state_check\"],\"action\":{\"exp\":\"new com.jd.easyflow.fsm.cases.mockbiz.WhitelistService().isWhitelist()\"}}\n    ]\n}"
  },
  {
    "path": "easyflow-fsm/src/test/resources/fsm/cases/parser/fsm_parser_test.json",
    "content": "{\n\t\"id\": \"parser_001\",\n\t\"name\":\"CREDIT ACCESS FLOW\",\n\t\"states\": [\n\t\t{\"id\": \"WHITELIST\",\"name\": \"Whitelist check\", \"start\":true, \"properties\": {}},\n\t\t{\"id\": \"COMPANY_AUTH\",\"name\": \"Company identity auth\", \"properties\": {}},\n\t\t{\"id\": \"COMPANY_INFO\",\"name\": \"Additional info input\", \"properties\": {}}\n\t],\n\t\"events\": [\n\t\t{\"id\": \"QUERY_WHITELIST\",\"name\": \"Query whitelist\"},\n\t\t\n\t\t{\"id\": \"QUERY_COMPANY_AUTH\",\"name\": \"Query company auth status\"},\n\t\t{\"id\": \"SUBMIT_COMPANY_AUTH\",\"name\": \"Submit company auth info\"},\n\t\t\n\t\t{\"id\": \"QUERY_COMPANY_INFO\",\"name\": \"Query additional info\"},\n\t\t{\"id\": \"SUBMIT_COMPANY_INFO\",\"name\": \"Submit additional info\"}\n\t],\n\t\"transitions\": [\n\t    {\"from\": \"WHITELIST\",\"event\": [\"_state_enter\",\"_state_check\"],\"action\":{\"exp\":\"new com.jd.easyflow.fsm.cases.mockbiz.WhitelistService().isWhitelist()\"}, \"post\":{\"conditions\":[{\"when\":\"context.transitionActionResult\", \"to\":\"COMPANY_AUTH\"}]}},\n\t\t{\"from\": \"WHITELIST\",\"event\": \"QUERY_WHITELIST\",\"action\":{\"exp\":\"new com.jd.easyflow.fsm.cases.mockbiz.WhitelistService().isWhitelist()\"}, \"post\":{\"when\":\"context.transitionActionResult\", \"to\":\"COMPANY_AUTH\"}},\n\t\t\n\t\t{\"from\": \"COMPANY_AUTH\",\"event\": \"_state_enter\",\"action\": {\"exp\":\"new com.jd.easyflow.fsm.cases.mockbiz.CompanyAuthService().isAuth()\"},\"post\": {\"conditions\":[{\"when\":\"context.transitionActionResult\", \"to\":\"COMPANY_INFO\"}]}},\n\t\t{\"from\": \"COMPANY_AUTH\",\"event\": \"QUERY_COMPANY_AUTH\",\"action\": {\"exp\":\"\"}},\n\t\t{\"from\": \"COMPANY_AUTH\",\"event\": \"SUBMIT_COMPANY_AUTH\",\"action\": {\"exp\":\"new com.jd.easyflow.fsm.cases.mockbiz.CompanyAuthService().saveCompanyAuth(param.param)\"}, \"post\":{\"to\":\"COMPANY_INFO\"}},\n\t\t\n\t\t{\"from\": \"COMPANY_INFO\",\"event\": \"QUERY_COMPANY_INFO\",\"action\": {\"exp\":\"\"}},\n\t\t{\"from\": \"COMPANY_INFO\",\"event\": \"SUBMIT_COMPANY_INFO\",\"action\": {\"exp\":\"\"},\"post\": {\"exp\":\"\"}}\n\t],\n\t\"listeners\":[\n\t{\"createExp\":\"new com.jd.easyflow.fsm.listener.FsmCommonListener()\"}\n\t]\n}"
  },
  {
    "path": "easyflow-fsm/src/test/resources/fsm/cases/parser/fsm_parser_test_create_exp.json",
    "content": "{\n\t\"id\": \"parser_createExp_test\",\n\t\"name\":\"CREDIT ACCESS FLOW\",\n\t\"states\": [\n\t\t{\"id\": \"WHITELIST\",\"name\": \"Whitelist check\", \"start\":true, \"properties\": {}}\n\t],\n\t\"transitions\": [\n\t    {\"from\": \"WHITELIST\",\"event\": [\"_state_enter\",\"_state_check\"],\"action\":{\"createExp\":\"new com.jd.easyflow.fsm.cases.parser.TestTransitionAction()\"}}\n\t],\n\t\"listeners\":[\n\t{\"createExp\":\"new com.jd.easyflow.fsm.listener.FsmCommonListener()\"}\n\t]\n}"
  },
  {
    "path": "easyflow-fsm/src/test/resources/fsm/cases/post/fsm_post_manually.json",
    "content": "{\n    \"id\": \"post_manually\",\n    \"states\": [\n        {\"id\": \"S1\", \"start\":true},\n        {\"id\": \"S2\"}\n    ],\n    \"transitions\": [\n        {\"from\": \"S1\",\"event\": \"_state_enter\"}\n        ],    \n    \"listeners\":[{\"createExp\":\"new com.jd.easyflow.fsm.listener.FsmCommonListener()\"}],\n    \"transitionPreHandlerFilters\":[{\"createExp\":\"new com.jd.easyflow.fsm.cases.post.TestPostManuallyTransitionPreHandlerFilter()\"}]\n}"
  },
  {
    "path": "easyflow-fsm/src/test/resources/fsm/cases/postevent/fsm_postevent.json",
    "content": "{\n\t\"id\": \"post_event\",\n\t\"name\":\"CREDIT ACCESS FLOW\",\n\t\"states\": [\n\t\t{\"id\": \"WHITELIST\",\"name\": \"Whitelist check\", \"start\":true, \"properties\": {}},\n\t\t{\"id\": \"COMPANY_AUTH\",\"name\": \"Company identity auth\", \"properties\": {}},\n\t\t{\"id\": \"COMPANY_INFO\",\"name\": \"Additional info input\", \"properties\": {}}\n\t],\n\t\"events\": [\n\t\t{\"id\": \"QUERY_WHITELIST\",\"name\": \"Query whitelist\"},\n\t\t\n\t\t{\"id\": \"QUERY_COMPANY_AUTH\",\"name\": \"Query company auth status\"},\n\t\t{\"id\": \"SUBMIT_COMPANY_AUTH\",\"name\": \"Submit company auth info\"},\n\t\t\n\t\t{\"id\": \"QUERY_COMPANY_INFO\",\"name\": \"Query additional info\"},\n\t\t{\"id\": \"SUBMIT_COMPANY_INFO\",\"name\": \"Submit additional info\"}\n\t],\n\t\"transitions\": [\n\t    {\"from\": \"WHITELIST\",\"event\": [\"_state_enter\",\"_state_check\"],\"action\":{\"exp\":\"new com.jd.easyflow.fsm.cases.mockbiz.WhitelistService().isWhitelist()\"}, \"post\":{\"conditions\":[{\"when\":\"context.transitionActionResult\", \"to\":{\"state\":\"WHITELIST\", \"event\":\"QUERY_WHITELIST\"}}]}},\n\t\t{\"from\": \"WHITELIST\",\"event\": \"QUERY_WHITELIST\",\"action\":{\"exp\":\"new com.jd.easyflow.fsm.cases.mockbiz.WhitelistService().isWhitelist()\"}, \"post\":{\"when\":\"context.transitionActionResult\", \"to\":\"COMPANY_AUTH\"}},\n\t\t\n\t\t{\"from\": \"COMPANY_AUTH\",\"event\": \"_state_enter\",\"action\": {\"exp\":\"new com.jd.easyflow.fsm.cases.mockbiz.CompanyAuthService().isAuth()\"},\"post\": {\"conditions\":[{\"when\":\"context.transitionActionResult\", \"to\":\"COMPANY_INFO\"}]}},\n\t\t{\"from\": \"COMPANY_AUTH\",\"event\": \"QUERY_COMPANY_AUTH\",\"action\": {\"exp\":\"\"}},\n\t\t{\"from\": \"COMPANY_AUTH\",\"event\": \"SUBMIT_COMPANY_AUTH\",\"action\": {\"exp\":\"new com.jd.easyflow.fsm.cases.mockbiz.CompanyAuthService().saveCompanyAuth(param.param)\"}, \"post\":{\"to\":\"COMPANY_INFO\"}},\n\t\t\n\t\t{\"from\": \"COMPANY_INFO\",\"event\": \"QUERY_COMPANY_INFO\",\"action\": {\"exp\":\"\"}},\n\t\t{\"from\": \"COMPANY_INFO\",\"event\": \"SUBMIT_COMPANY_INFO\",\"action\": {\"exp\":\"\"},\"post\": {\"exp\":\"\"}}\n\t],\n\t\"listeners\":[\n\t{\"createExp\":\"new com.jd.easyflow.fsm.listener.FsmCommonListener()\"}\n\t]\n}"
  },
  {
    "path": "easyflow-fsm/src/test/resources/fsm/quickstart/quickstart_001.json",
    "content": "{\n    \"id\": \"quickstart_001\",\n    \"name\":\"Quick Start 001\",\n    \"states\": [\n        {\"id\": \"A\",\"name\": \"A\", \"start\":true},\n        {\"id\": \"B\",\"name\": \"B\"}\n    ],\n    \"events\": [\n        {\"id\": \"E1\",\"name\": \"Event1\"}\n    ],\n    \"transitions\": [\n        {\"from\": \"A\",\"event\": \"E1\",\"action\":{\"createExp\":\"new com.jd.easyflow.fsm.quickstart.AStateE1EventTstAction()\"}, \"post\":{\"to\":\"B\"}}\n    ],\n    \"listeners\":[\n    {\"createExp\":\"new com.jd.easyflow.fsm.listener.FsmCommonListener()\"}\n    ]\n}"
  },
  {
    "path": "easyflow-fsm/src/test/resources/logback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<configuration scan=\"true\">\n    <property name=\"APP\" value=\"flow\"/>\n    <property name=\"LOG_HOME\" value=\"/export/log/${APP}\"/>\n    <appender name=\"CONSOLE\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%d{yy-MM-dd.HH:mm:ss.SSS} [%-16t] %-5p %-22c{0} - %m%n</pattern>\n        </encoder>\n    </appender>\n    <root level=\"INFO\">\n        <appender-ref ref=\"CONSOLE\"/>\n    </root>\n</configuration>\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n    xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>easyflow-process</artifactId>\n        <groupId>com.jd.easyflow</groupId>\n        <version>1.7.3</version>\n    </parent>\n    <artifactId>easyflow-process-admin</artifactId>\n    <name>easyflow-process-admin</name>\n    <packaging>jar</packaging>\n    <properties>\n    </properties>\n    <dependencies>\n             <dependency>\n                <groupId>com.jd.easyflow</groupId>\n                <artifactId>easyflow-process-api</artifactId>\n            </dependency>     \n             <dependency>\n                <groupId>com.jd.easyflow</groupId>\n                <artifactId>easyflow-process-common</artifactId>\n            </dependency>    \n        <dependency>\n            <groupId>org.springframework</groupId>\n            <artifactId>spring-web</artifactId>\n        </dependency>           \n             <dependency>\n                <groupId>com.jd.easyflow</groupId>\n                <artifactId>easyflow-flow-bpmn</artifactId>\n            </dependency> \n             <dependency>\n                <groupId>com.jd.easyflow</groupId>\n                <artifactId>easyflow-fsm</artifactId>\n            </dependency>                                              \n    </dependencies>\n\n</project>"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/java/com/jd/easyflow/admin/form/adapter/page/FormTemplateAdminController.java",
    "content": "package com.jd.easyflow.admin.form.adapter.page;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.Model;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.ResponseBody;\nimport org.springframework.web.context.request.NativeWebRequest;\nimport org.springframework.web.context.request.WebRequest;\n\nimport com.jd.easyflow.admin.form.adapter.page.converter.PagerConverter;\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponse;\nimport com.jd.easyflow.common.adapter.export.util.ExportResponseUtil;\nimport com.jd.easyflow.common.adapter.page.BasePageController;\nimport com.jd.easyflow.common.dto.DataResponse;\nimport com.jd.easyflow.common.dto.pager.PagerCondition;\nimport com.jd.easyflow.form.adapter.export.FormTemplateExport;\nimport com.jd.easyflow.form.adapter.export.dto.FormTemplateDTO;\nimport com.jd.easyflow.objects.factory.ObjectFactorys;\n\n/**\n * \n * @author liyuliang5\n *\n */\n@Controller\npublic class FormTemplateAdminController extends BasePageController {\n\n    private FormTemplateExport formTemplateExport;\n\n    @RequestMapping(\"easyflow/formTemplate/formTemplateList\")\n    public String templateList(Model model) {\n        return \"easyflow/formtemplate/formTemplateList\";\n    }\n\n    @RequestMapping(\"easyflow/formTemplate/ajax/getListData\")\n    @ResponseBody\n    public DataResponse<com.jd.easyflow.common.adapter.export.dto.pager.PagerResult> getData(NativeWebRequest request) {\n        PagerCondition condition = getPagerCondition(request);\n        ExportResponse<com.jd.easyflow.common.adapter.export.dto.pager.PagerResult> response = getFormTemplateExport()\n                .find(new ExportRequest(PagerConverter.INSTANCE.convert(condition)));\n        response.getData().getList().forEach(o -> {\n            ((FormTemplateDTO) o).setConfig(null);\n        });\n        return new DataResponse<com.jd.easyflow.common.adapter.export.dto.pager.PagerResult>(\n                ExportResponseUtil.unwrap(response));\n    }\n\n    @RequestMapping(\"easyflow/formTemplate/formTemplateDetail\")\n    public String detailPage(String templateCode, Model model) {\n        ExportResponse<FormTemplateDTO> response = getFormTemplateExport().get(new ExportRequest(templateCode));\n        FormTemplateDTO formTemplate = ExportResponseUtil.unwrap(response);\n        model.addAttribute(\"detail\", formTemplate);\n        return \"easyflow/formtemplate/formTemplateDetail\";\n    }\n\n    @RequestMapping(\"easyflow/formTemplate/formTemplateAdd\")\n    public String addPage(Model model) {\n        return \"easyflow/formtemplate/formTemplateAdd\";\n    }\n\n    @RequestMapping(\"easyflow/formTemplate/formTemplateEdit\")\n    public String editPage(String templateCode, Model model) {\n        ExportResponse<FormTemplateDTO> response = getFormTemplateExport().get(new ExportRequest(templateCode));\n        model.addAttribute(\"detail\", ExportResponseUtil.unwrap(response));\n        return \"easyflow/formtemplate/formTemplateEdit\";\n    }\n\n    @RequestMapping(\"easyflow/formTemplate/ajax/add\")\n    @ResponseBody\n    public DataResponse<Void> add(FormTemplateDTO formTemplate) {\n        getFormTemplateExport().add(new ExportRequest(formTemplate));\n        return new DataResponse<>();\n    }\n\n    @RequestMapping(\"easyflow/formTemplate/ajax/edit\")\n    @ResponseBody\n    public DataResponse<Void> edit(FormTemplateDTO formTemplate) {\n        getFormTemplateExport().update(new ExportRequest(formTemplate));\n        return new DataResponse<>();\n    }\n\n    @RequestMapping(\"easyflow/formTemplate/ajax/getTemplate\")\n    @ResponseBody\n    public DataResponse<Map<String, Object>> getTemplate(String templateCode) {\n        ExportResponse<FormTemplateDTO> response = getFormTemplateExport().get(new ExportRequest(templateCode));\n        Map<String, Object> result = new HashMap<>();\n        String config = null == ExportResponseUtil.unwrap(response) ? null : ExportResponseUtil.unwrap(response).getConfig();\n        result.put(\"config\", config);\n        return new DataResponse<>(result);\n    }\n\n    public FormTemplateExport getFormTemplateExport() {\n        if (formTemplateExport == null) {\n            formTemplateExport = ObjectFactorys.getDefault().getObject(FormTemplateExport.class);\n        }\n        return formTemplateExport;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/java/com/jd/easyflow/admin/form/adapter/page/converter/PagerConverter.java",
    "content": "package com.jd.easyflow.admin.form.adapter.page.converter;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport com.jd.easyflow.common.adapter.export.dto.pager.FieldEntry;\nimport com.jd.easyflow.common.adapter.export.dto.pager.SortEntry;\nimport com.jd.easyflow.common.dto.pager.PagerCondition;\n\n/**\n * @author liyuliang5\n *\n */\npublic class PagerConverter {\n    \n    public static PagerConverter INSTANCE = new PagerConverter();\n    \n    public com.jd.easyflow.common.adapter.export.dto.pager.PagerCondition convert(PagerCondition condition) {\n        if ( condition == null ) {\n            return null;\n        }\n\n        com.jd.easyflow.common.adapter.export.dto.pager.PagerCondition pagerCondition = new com.jd.easyflow.common.adapter.export.dto.pager.PagerCondition();\n\n        pagerCondition.setCount( condition.isCount() );\n        Map<String, Object> map = condition.getExtData();\n        if ( map != null ) {\n            pagerCondition.setExtData( new HashMap<String, Object>( map ) );\n        }\n        pagerCondition.setFieldList( fieldEntryListToFieldEntryList( condition.getFieldList() ) );\n        pagerCondition.setPage( condition.getPage() );\n        pagerCondition.setPageIndex( condition.getPageIndex() );\n        pagerCondition.setPageSize( condition.getPageSize() );\n        pagerCondition.setSortList( sortEntryListToSortEntryList( condition.getSortList() ) );\n        pagerCondition.setStart( condition.getStart() );\n        if ( pagerCondition.getFieldMap() != null ) {\n            Map<String, FieldEntry> map1 = stringFieldEntryMapToStringFieldEntryMap( condition.getFieldMap() );\n            if ( map1 != null ) {\n                pagerCondition.getFieldMap().putAll( map1 );\n            }\n        }\n        if ( pagerCondition.getSortMap() != null ) {\n            Map<String, SortEntry> map2 = stringSortEntryMapToStringSortEntryMap( condition.getSortMap() );\n            if ( map2 != null ) {\n                pagerCondition.getSortMap().putAll( map2 );\n            }\n        }\n\n        return pagerCondition;\n    }\n\n    protected FieldEntry fieldEntryToFieldEntry(com.jd.easyflow.common.dto.pager.FieldEntry fieldEntry) {\n        if ( fieldEntry == null ) {\n            return null;\n        }\n\n        FieldEntry fieldEntry1 = new FieldEntry();\n\n        fieldEntry1.setName( fieldEntry.getName() );\n        fieldEntry1.setValue( fieldEntry.getValue() );\n\n        return fieldEntry1;\n    }\n\n    protected List<FieldEntry> fieldEntryListToFieldEntryList(List<com.jd.easyflow.common.dto.pager.FieldEntry> list) {\n        if ( list == null ) {\n            return null;\n        }\n\n        List<FieldEntry> list1 = new ArrayList<FieldEntry>( list.size() );\n        for ( com.jd.easyflow.common.dto.pager.FieldEntry fieldEntry : list ) {\n            list1.add( fieldEntryToFieldEntry( fieldEntry ) );\n        }\n\n        return list1;\n    }\n\n    protected SortEntry sortEntryToSortEntry(com.jd.easyflow.common.dto.pager.SortEntry sortEntry) {\n        if ( sortEntry == null ) {\n            return null;\n        }\n\n        SortEntry sortEntry1 = new SortEntry();\n\n        sortEntry1.setKey( sortEntry.getKey() );\n        sortEntry1.setSeq( sortEntry.getSeq() );\n        sortEntry1.setType( sortEntry.getType() );\n\n        return sortEntry1;\n    }\n\n    protected List<SortEntry> sortEntryListToSortEntryList(List<com.jd.easyflow.common.dto.pager.SortEntry> list) {\n        if ( list == null ) {\n            return null;\n        }\n\n        List<SortEntry> list1 = new ArrayList<SortEntry>( list.size() );\n        for ( com.jd.easyflow.common.dto.pager.SortEntry sortEntry : list ) {\n            list1.add( sortEntryToSortEntry( sortEntry ) );\n        }\n\n        return list1;\n    }\n\n    protected Map<String, FieldEntry> stringFieldEntryMapToStringFieldEntryMap(Map<String, com.jd.easyflow.common.dto.pager.FieldEntry> map) {\n        if ( map == null ) {\n            return null;\n        }\n\n        Map<String, FieldEntry> map1 = new HashMap<String, FieldEntry>( Math.max( (int) ( map.size() / .75f ) + 1, 16 ) );\n\n        for ( java.util.Map.Entry<String, com.jd.easyflow.common.dto.pager.FieldEntry> entry : map.entrySet() ) {\n            String key = entry.getKey();\n            FieldEntry value = fieldEntryToFieldEntry( entry.getValue() );\n            map1.put( key, value );\n        }\n\n        return map1;\n    }\n\n    protected Map<String, SortEntry> stringSortEntryMapToStringSortEntryMap(Map<String, com.jd.easyflow.common.dto.pager.SortEntry> map) {\n        if ( map == null ) {\n            return null;\n        }\n\n        Map<String, SortEntry> map1 = new HashMap<String, SortEntry>( Math.max( (int) ( map.size() / .75f ) + 1, 16 ) );\n\n        for ( java.util.Map.Entry<String, com.jd.easyflow.common.dto.pager.SortEntry> entry : map.entrySet() ) {\n            String key = entry.getKey();\n            SortEntry value = sortEntryToSortEntry( entry.getValue() );\n            map1.put( key, value );\n        }\n\n        return map1;\n    }\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/java/com/jd/easyflow/admin/process/adapter/page/Bpmn2JsonController.java",
    "content": "package com.jd.easyflow.admin.process.adapter.page;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.CrossOrigin;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.ResponseBody;\n\nimport com.jd.easyflow.common.adapter.page.BasePageController;\nimport com.jd.easyflow.common.dto.DataResponse;\nimport com.jd.easyflow.common.util.CommonErrorCode;\nimport com.jd.easyflow.flow.bpmn.converter.BpmnConverter;\n\n/**\n * @author liyuliang5\n */\n@Controller\npublic class Bpmn2JsonController extends BasePageController {\n\n    @CrossOrigin(origins = \"*\")\n    @RequestMapping(value = \"/public/ajax/bpmn2Json\")\n    @ResponseBody\n    public DataResponse<String> convert2Json(String bpmnXmlData) {\n        try {\n            return new DataResponse<String>(BpmnConverter.convert(bpmnXmlData));\n        } catch (Exception e) {\n            return new DataResponse<String>(CommonErrorCode.E0000001.getCode(), e.getMessage(), null);\n        }\n    }\n    \n    @CrossOrigin(origins = \"*\")\n    @RequestMapping(value = \"/public/ajax/bpmn2Json2\")\n    @ResponseBody\n    public Map<String, String> convert2Json2(String bpmnXmlData) {\n        Map<String, String> result = new HashMap<>();\n        String jsonData = BpmnConverter.convert(bpmnXmlData);\n        result.put(\"resultData\", jsonData);\n        return result;\n    }   \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/java/com/jd/easyflow/admin/process/adapter/page/ProcessDefinitionController.java",
    "content": "package com.jd.easyflow.admin.process.adapter.page;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.Model;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.ResponseBody;\nimport org.springframework.web.context.request.NativeWebRequest;\n\nimport com.jd.easyflow.admin.process.adapter.page.converter.PagerConverter;\nimport com.jd.easyflow.admin.process.adapter.page.converter.ProcessDefinitionConverter;\nimport com.jd.easyflow.admin.process.adapter.page.dto.ProcessDefDTO;\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponse;\nimport com.jd.easyflow.common.adapter.export.dto.pager.PagerResult;\nimport com.jd.easyflow.common.adapter.export.util.ExportResponseUtil;\nimport com.jd.easyflow.common.adapter.page.BasePageController;\nimport com.jd.easyflow.common.adapter.page.WebResponse;\nimport com.jd.easyflow.common.dto.pager.PagerCondition;\nimport com.jd.easyflow.common.exception.UserException;\nimport com.jd.easyflow.common.util.CommonErrorCode;\nimport com.jd.easyflow.objects.factory.ObjectFactorys;\nimport com.jd.easyflow.process.adapter.export.ProcessDefinitionExport;\nimport com.jd.easyflow.process.adapter.export.dto.definition.ProcessDefinitionDTO;\nimport com.jd.easyflow.process.adapter.export.dto.definition.QueryProcessDefinitionReq;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n * @author liyuliang5\n *\n */\n@Controller\n@RequestMapping(\"easyflow/processDefinition\")\npublic class ProcessDefinitionController extends BasePageController {\n\n    private final static int INIT_VERSION = 0;\n\n    private final static String MANUAL = \"MANUAL\";\n\n    private ProcessDefinitionExport processDefinitionExport;\n\n    public ProcessDefinitionController() {\n    }\n\n\n    @RequestMapping(\"list\")\n    public String processDefList() {\n        return \"easyflow/process/processdefinition/processDefinitionList\";\n    }\n    \n    @RequestMapping(\"ajax/getListData\")\n    @ResponseBody\n    public WebResponse<PagerResult> getData(NativeWebRequest request) {\n        PagerCondition condition = getPagerCondition(request);\n        return getData(condition);\n    }\n\n    protected WebResponse<PagerResult> getData(PagerCondition condition) {\n        ExportResponse<com.jd.easyflow.common.adapter.export.dto.pager.PagerResult<ProcessDefinitionDTO>> response = getProcessDefinitionExport()\n                .pageQueryProcessDefinition(new ExportRequest(PagerConverter.INSTANCE.convert(condition)));\n        com.jd.easyflow.common.adapter.export.dto.pager.PagerResult<ProcessDefinitionDTO> result = ExportResponseUtil\n                .unwrap(response);\n        List<ProcessDefDTO> list = new ArrayList<>();\n        for (ProcessDefinitionDTO definition : result.getList()) {\n            list.add(ProcessDefinitionConverter.INSTANCE.adapterConvert(definition));\n        }\n        return WebResponse.buildResponse(CommonErrorCode.E0000000.getCode(), CommonErrorCode.E0000000.getDesc(),\n                new PagerResult<>(result.getCount(), list));\n    }\n\n\n    @RequestMapping(\"ajax/processSelectFrame\")\n    public String processSelectFrame(Model model, String selectId) {\n        model.addAttribute(\"selectId\", selectId);\n        return \"easyflow/process/processdefinition/processSelectFrame\";\n    }\n\n    @RequestMapping(\"add\")\n    public String addPage() {\n        return \"easyflow/process/processdefinition/processDefinitionAdd\";\n    }\n\n\n    @RequestMapping(\"edit\")\n    public String editPage(String defId, Integer defVersion, Model model) {\n        QueryProcessDefinitionReq req = new QueryProcessDefinitionReq();\n        req.setDefId(defId);\n        req.setDefVersion(defVersion);\n        ExportResponse<ProcessDefinitionDTO> response = getProcessDefinitionExport()\n                .queryProcessDefinitionByVersion(new ExportRequest<QueryProcessDefinitionReq>(req));\n        if (!CommonErrorCode.E0000000.getCode().equals(response.getResCode())) {\n            throw new UserException(response.getResCode(), response.getResDesc());\n        }\n        ProcessDefDTO processDef = ProcessDefinitionConverter.INSTANCE.adapterConvert(response.getData());\n        model.addAttribute(\"definition\", processDef);\n        model.addAttribute(\"defData\", JSON.toJSONString(processDef));\n        return \"easyflow/process/processdefinition/processDefinitionEdit\";\n    }\n\n    @RequestMapping(\"detail\")\n    public String processDefView(String defId, Integer defVersion, boolean latest, String fullDefinitionId,\n            Model model) {\n        ExportResponse<ProcessDefinitionDTO> exportResponse;\n        if (latest) {\n            exportResponse = getProcessDefinitionExport().getLatestProcessDefinition(new ExportRequest(defId));\n        } else {\n            if (fullDefinitionId != null && ! fullDefinitionId.isEmpty()) {\n                // Process instance page definition link to here, empty id represent empty version.\n                exportResponse = getProcessDefinitionExport()\n                        .getProcessDefinition(new ExportRequest<String>(fullDefinitionId));\n            } else {\n                QueryProcessDefinitionReq req = new QueryProcessDefinitionReq();\n                req.setDefId(defId);\n                req.setDefVersion(defVersion);\n                exportResponse = getProcessDefinitionExport().queryProcessDefinitionByVersion(new ExportRequest(req));\n            }\n        }\n        if (!CommonErrorCode.E0000000.getCode().equals(exportResponse.getResCode())) {\n            throw new UserException(exportResponse.getResCode(), exportResponse.getResDesc());\n        }\n        ProcessDefDTO processDef = ProcessDefinitionConverter.INSTANCE.adapterConvert(exportResponse.getData());\n        model.addAttribute(\"defData\", JSON.toJSONString(processDef));\n        return \"easyflow/process/processdefinition/processDefinitionDetail\";\n    }\n\n    @RequestMapping(\"ajax/add\")\n    @ResponseBody\n    public WebResponse add(ProcessDefDTO processDef) {\n        ProcessDefinitionDTO processDefinitionReq = ProcessDefinitionConverter.INSTANCE.adapterConvert(processDef);\n        processDefinitionReq.setDefVersion(INIT_VERSION);\n        processDefinitionReq.setDefSource(MANUAL);\n        ExportResponse exportResponse = getProcessDefinitionExport()\n                .addProcessDefinition(new ExportRequest(processDefinitionReq));\n        return WebResponse.buildResponse(exportResponse.getResCode(), exportResponse.getResDesc());\n    }\n\n    @RequestMapping(\"ajax/edit\")\n    @ResponseBody\n    public WebResponse<Void> edit(ProcessDefDTO processDef) {\n        ProcessDefinitionDTO processDefinitionReq = ProcessDefinitionConverter.INSTANCE.adapterConvert(processDef);\n        processDefinitionReq.setDefSource(MANUAL);\n        ExportResponse response = getProcessDefinitionExport()\n                .updateProcessDefinition(new ExportRequest(processDefinitionReq));\n        return WebResponse.buildResponse(response.getResCode(), response.getResDesc());\n    }\n\n    @RequestMapping(\"ajax/forceUpdate\")\n    @ResponseBody\n    public WebResponse<Void> forceUpdate(ProcessDefDTO processDef) {\n        ProcessDefinitionDTO processDefinitionReq = ProcessDefinitionConverter.INSTANCE.adapterConvert(processDef);\n        processDefinitionReq.setDefSource(MANUAL);\n        ExportResponse response = getProcessDefinitionExport()\n                .forceUpdateCurrentVersionProcessDef(new ExportRequest(processDefinitionReq));\n        return WebResponse.buildResponse(response.getResCode(), response.getResDesc());\n    }\n\n    protected ProcessDefinitionExport getProcessDefinitionExport() {\n        if (processDefinitionExport == null) {\n            processDefinitionExport = ObjectFactorys.getDefault().getObject(ProcessDefinitionExport.class);\n        }\n        return processDefinitionExport;\n    }\n\n\n    public void setProcessDefinitionExport(ProcessDefinitionExport processDefinitionExport) {\n        this.processDefinitionExport = processDefinitionExport;\n    }\n\n\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/java/com/jd/easyflow/admin/process/adapter/page/ProcessInstanceController.java",
    "content": "package com.jd.easyflow.admin.process.adapter.page;\n\nimport java.io.IOException;\nimport java.text.SimpleDateFormat;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Objects;\nimport java.util.stream.Collectors;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.Model;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.ResponseBody;\nimport org.springframework.web.context.request.NativeWebRequest;\n\nimport com.jd.easyflow.admin.process.adapter.page.converter.PagerConverter;\nimport com.jd.easyflow.admin.process.adapter.page.converter.ProcessDefinitionConverter;\nimport com.jd.easyflow.admin.process.adapter.page.converter.ProcessInstanceConverter;\nimport com.jd.easyflow.admin.process.adapter.page.dto.CommonTaskProcessInstanceCreateDTO;\nimport com.jd.easyflow.admin.process.adapter.page.dto.ProcessDefDTO;\nimport com.jd.easyflow.admin.process.adapter.page.dto.ProcessInstanceInfoForPagerDTO;\nimport com.jd.easyflow.admin.process.adapter.page.extension.UserGroupAdminExtension;\nimport com.jd.easyflow.codegenerator.adapter.export.CodeGenerateExport;\nimport com.jd.easyflow.codegenerator.adapter.export.dto.GenerateParam;\nimport com.jd.easyflow.codegenerator.adapter.export.dto.GenerateResult;\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponse;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponseCode;\nimport com.jd.easyflow.common.adapter.export.dto.pager.PagerResult;\nimport com.jd.easyflow.common.adapter.export.util.ExportResponseUtil;\nimport com.jd.easyflow.common.adapter.page.BasePageController;\nimport com.jd.easyflow.common.adapter.page.WebResponse;\nimport com.jd.easyflow.common.dto.DataResponse;\nimport com.jd.easyflow.common.dto.pager.FieldEntry;\nimport com.jd.easyflow.common.dto.pager.PagerCondition;\nimport com.jd.easyflow.common.exception.UserException;\nimport com.jd.easyflow.common.util.CommonErrorCode;\nimport com.jd.easyflow.el.ElFactory;\nimport com.jd.easyflow.flow.bpmn.BpmnFlowParser;\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.parser.FlowParser;\nimport com.jd.easyflow.flow.model.parser.FlowParserImpl;\nimport com.jd.easyflow.fsm.Fsm;\nimport com.jd.easyflow.fsm.model.State;\nimport com.jd.easyflow.fsm.parser.FsmParser;\nimport com.jd.easyflow.objects.factory.ObjectFactorys;\nimport com.jd.easyflow.process.adapter.export.ProcessDefinitionExport;\nimport com.jd.easyflow.process.adapter.export.ProcessInstanceExport;\nimport com.jd.easyflow.process.adapter.export.ProcessTaskExport;\nimport com.jd.easyflow.process.adapter.export.constant.ProcessInstanceConstants;\nimport com.jd.easyflow.process.adapter.export.constant.ProcessTaskConstants;\nimport com.jd.easyflow.process.adapter.export.dto.definition.ProcessDefinitionDTO;\nimport com.jd.easyflow.process.adapter.export.dto.definition.QueryProcessDefinitionReq;\nimport com.jd.easyflow.process.adapter.export.dto.instance.CanCancelProcessInstanceReq;\nimport com.jd.easyflow.process.adapter.export.dto.instance.CanCancelProcessInstanceRes;\nimport com.jd.easyflow.process.adapter.export.dto.instance.CancelProcessInstanceReq;\nimport com.jd.easyflow.process.adapter.export.dto.instance.CreateProcessInstanceReq;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessInstanceDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessNodeInstanceDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.QueryProcessInstanceReq;\nimport com.jd.easyflow.process.adapter.export.dto.task.ProcessTaskDTO;\nimport com.jd.easyflow.process.adapter.export.dto.task.QueryTaskReq;\nimport com.jd.easyflow.utils.json.JSON;\nimport com.jd.easyflow.utils.json.JsonSerializeConfig;\n\n@Controller\n@RequestMapping(\"easyflow/processInstance\")\npublic class ProcessInstanceController extends BasePageController {\n    \n    private static final Logger log = LoggerFactory.getLogger(ProcessInstanceController.class);\n\n\n    private static final String INSTANCE_CREATE_PAGE_ID_TASK = \"commonTaskProcessInstanceAdd\";\n\n    private static final String FORMAT_FLOW_BPMN = \"FLOW-bpmn\";\n    private static final String FORMAT_FLOW_EASY = \"FLOW-easy\";\n    private static final String FORMAT_FSM_EASY = \"FSM-easy\";\n\n    @Autowired\n    private UserGroupAdminExtension userGroupAdminExtension;\n\n    private static final String VERSION_PREFIX = \"--V_\";\n\n    private static final String BPMN_FORMAT = \"FLOW-bpmn\";\n\n    private static final String EXT_DATA_BPMN_OF_JSON_KEY = \"bpmnOfJson\";\n\n    private ProcessInstanceExport processInstanceExport;\n\n    private ProcessDefinitionExport processDefinitionExport;\n    \n    private ProcessTaskExport processTaskExport;\n    \n    private CodeGenerateExport codeGenerateExport;\n\n    protected FlowParser flowParser = new BpmnFlowParser();\n    \n    private String elType;\n\n    @RequestMapping(\"list\")\n    public String processInstanceList() {\n        return \"easyflow/process/processinstance/processInstanceList\";\n    }\n    \n    @RequestMapping(\"ajax/getListData\")\n    @ResponseBody\n    public WebResponse<PagerResult> getData(NativeWebRequest request) {\n        PagerCondition condition = getPagerCondition(request);\n        return getData(condition);\n    }\n\n    protected WebResponse<PagerResult> getData(PagerCondition condition) {\n        FieldEntry fieldEntry = condition.getField(\"queryType\");\n        String currentUser = userGroupAdminExtension.getCurrentUser(null);\n        if (fieldEntry != null && \"MY\".equals(fieldEntry.getValue())) {\n            FieldEntry creatorEntry = condition.getField(\"creator\");   \n            if (creatorEntry != null) {\n                String creator = (String) creatorEntry.getValue();\n                if (!Objects.equals(creator, currentUser)) {\n                    log.info(\"creator and current user not same. return empty data.\");\n                    com.jd.easyflow.common.adapter.export.dto.pager.PagerResult pagerResult = new com.jd.easyflow.common.adapter.export.dto.pager.PagerResult();\n                    pagerResult.setCount(0L);\n                    pagerResult.setList(new ArrayList<>());\n                    return WebResponse.buildResponse(CommonErrorCode.E0000000.getCode(),\n                            CommonErrorCode.E0000000.getDesc(), pagerResult);\n                }\n            } else {\n            condition.addField(new FieldEntry(\"creator\", currentUser));\n            }\n        }\n        \n        ExportResponse response = getProcessInstanceExport()\n                .pagerQueryProcessInstance(new ExportRequest(PagerConverter.INSTANCE.convert(condition)));\n        com.jd.easyflow.common.adapter.export.dto.pager.PagerResult pagerResult = (com.jd.easyflow.common.adapter.export.dto.pager.PagerResult) ExportResponseUtil\n                .unwrap(response);\n\n        List<ProcessInstanceInfoForPagerDTO> processInstanceList = ProcessInstanceConverter.INSTANCE\n                .convertPagerResult(pagerResult.getList());\n        List<ProcessInstanceInfoForPagerDTO> pagerDTOList = processInstanceList.stream().map(processInstance -> {\n            CanCancelProcessInstanceReq req = new CanCancelProcessInstanceReq();\n            req.setInstanceNo(processInstance.getInstanceNo());\n            req.setCancelUser(currentUser);\n            ExportResponse<CanCancelProcessInstanceRes> canCancelResponse = getProcessInstanceExport()\n                    .canCancel(new ExportRequest<CanCancelProcessInstanceReq>(req));\n            boolean canCancel = false;\n            if (ExportResponseCode.SUCCESS.getCode().equals(canCancelResponse.getResCode())) {\n                canCancel = ((CanCancelProcessInstanceRes) canCancelResponse.getData()).isCanCancel();\n            } else {\n                log.warn(\"can cancel result exception, code:\" + canCancelResponse.getResCode() + \" desc:\" + canCancelResponse.getResDesc() + \", default to false\");\n            }\n            processInstance.setCanCancel(canCancel);\n            return processInstance;\n        }).collect(Collectors.toList());\n\n        pagerResult.setList(pagerDTOList);\n        return WebResponse.buildResponse(CommonErrorCode.E0000000.getCode(), CommonErrorCode.E0000000.getDesc(),\n                pagerResult);\n    }\n\n    @RequestMapping(\"detail\")\n    public String instanceView(String instanceNo, String processType, String bizNo, Model model) throws IOException {\n        ExportResponse<ProcessInstanceDTO> response;\n        if (instanceNo != null && ! instanceNo.isEmpty()) {\n            response = getProcessInstanceExport().getProcessInstance(new ExportRequest(instanceNo));\n        } else {\n            QueryProcessInstanceReq req = QueryProcessInstanceReq.builder().processType(processType).bizNo(bizNo)\n                    .build();\n            response = getProcessInstanceExport().queryProcessInstanceByProcessTypeAndBizNo(new ExportRequest(req));\n        }\n        if (!CommonErrorCode.E0000000.getCode().equals(response.getResCode())) {\n            throw new UserException(\"Process instance not exists.\");\n        }\n        ProcessInstanceDTO processInstance = ExportResponseUtil.unwrap(response);\n        Object[] processDefInfo = parseProcessDefIdAndVersion(processInstance.getProcessDefId());\n        QueryProcessDefinitionReq req = new QueryProcessDefinitionReq();\n        req.setDefId((String) processDefInfo[0]);\n        req.setDefVersion((Integer) processDefInfo[1]);\n        ExportResponse<ProcessDefinitionDTO> exportResponse = getProcessDefinitionExport()\n                .queryProcessDefinitionByVersion(new ExportRequest(req));\n        ProcessDefinitionDTO processDefinition = exportResponse.getData();\n        ProcessDefDTO processDef = ProcessDefinitionConverter.INSTANCE.adapterConvert(processDefinition);\n        if (processDefinition != null) {\n            if (BPMN_FORMAT.equals(processDefinition.getFormat())) {\n                processDef.setBpmnXmlData(processDefinition.getContent());\n            } else {\n                String extData = processDefinition.getExtData();\n                if (extData != null && ! extData.isEmpty()) {\n                    Map<String, Object> extDataMap = JSON.parseObject(extData, Map.class);\n                    String bpmnData = (String) extDataMap.get(EXT_DATA_BPMN_OF_JSON_KEY);\n                    processDef.setBpmnXmlData(bpmnData);\n                }\n            }\n        }\n\n        model.addAttribute(\"defData\", JSON.toJSONString(processDef));\n        ExportResponse<List<ProcessNodeInstanceDTO>> nodeResponse = getProcessInstanceExport()\n                .queryProcessNodeInstanceByInstanceNo(new ExportRequest(processInstance.getInstanceNo()));\n        List<ProcessNodeInstanceDTO> nodeInstanceList = nodeResponse.getData();\n        nodeInstanceList = nodeInstanceList.stream().filter(node -> !ProcessInstanceConstants.NODE_STATUS_INVALID.equals(node.getStatus()))\n                .collect(Collectors.toList());\n\n        List<ProcessNodeInstanceDTO> sortedNodeInstanceList = sortNodeInstances(nodeInstanceList);\n        fillNodeName(processDef, sortedNodeInstanceList);\n\n        Map<String, Object> processProperties = null;\n        if (processDefinition != null) {\n            if (FORMAT_FSM_EASY.equals(processDefinition.getFormat())) {\n                Fsm fsm = FsmParser.parse(processDefinition.getJsonContent(), false);\n                processProperties = fsm.getProperty(\"process\");\n            } else {\n                Flow flow = flowParser.parse(processDefinition.getJsonContent(), false).get(0);\n                processProperties = flow.getProperty(\"process\");\n            }\n        }\n        String pageUrl = processProperties == null ? null : (String) processProperties.get(\"pageUrl\");\n        if (pageUrl != null) {\n            Map<String, Object> root = new HashMap<String, Object>();\n            root.put(\"instanceNo\", instanceNo);\n            root.put(\"processType\", processType);\n            root.put(\"bizNo\", bizNo);\n            String pageUrlVal = ElFactory.get(elType).evalWithDefaultContext(pageUrl, root, true);\n            if (pageUrlVal != null && ! pageUrlVal.isEmpty()) {\n                return \"redirect:\" + pageUrlVal;\n            }\n        }\n        \n\n        QueryTaskReq queryTaskReq = new QueryTaskReq();\n        queryTaskReq.setProcessInstanceNo(processInstance.getInstanceNo());\n        ExportResponse<List<ProcessTaskDTO>> taskResponse = getProcessTaskExport().queryTask(new ExportRequest<QueryTaskReq>(queryTaskReq));\n        List<ProcessTaskDTO> taskList = ExportResponseUtil.unwrap(taskResponse);\n        \n        String instanceFormId = processProperties == null ? null : (String) processProperties.get(\"formId\");\n        model.addAttribute(\"instanceFormId\", (instanceFormId == null || instanceFormId.isEmpty()) ? \"null\" : instanceFormId);\n        model.addAttribute(\"instanceBizData\", (processInstance.getBizData() == null || processInstance.getBizData().isEmpty()) ? \"null\" : processInstance.getBizData());\n\n        model.addAttribute(\"processDef\", processDef);\n        model.addAttribute(\"processInstance\", processInstance);\n        model.addAttribute(\"processNodeInstances\", sortedNodeInstanceList);\n        model.addAttribute(\"defData\", JSON.toJSONString(processDef));\n        \n        SimpleDateFormat format = new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\");\n        JsonSerializeConfig config = new JsonSerializeConfig();\n        config.setDateFormat(format);\n        model.addAttribute(\"nodeInstancesStr\", JSON.toJSONString(sortedNodeInstanceList, config));\n        model.addAttribute(\"tasksStr\", JSON.toJSONString(taskList, config));\n        \n        return \"easyflow/process/processinstance/processInstanceDetail\";\n    }\n\n    private void fillNodeName(ProcessDefDTO processDef, List<ProcessNodeInstanceDTO> nodeList) {\n        if (processDef == null) {\n            log.warn(\"process definition null\");\n            return;\n        }\n        String definition = processDef.getJsonData();\n        if (FORMAT_FLOW_BPMN.equals(processDef.getFormat()) || FORMAT_FLOW_EASY.equals(processDef.getFormat())) {\n            Flow flow = new FlowParserImpl().parse(definition, false).get(0);\n            for (ProcessNodeInstanceDTO node : nodeList) {\n                FlowNode flowNode = flow.getNode(node.getNodeId());\n                if (flowNode != null) {\n                    node.setNodeName(flowNode.getName());\n                }\n            }\n        } else {\n            Fsm fsm = new FsmParser().parse(definition, false);\n            for (ProcessNodeInstanceDTO node : nodeList) {\n                State state = fsm.getState(node.getNodeId());\n                if (state != null) {\n                    node.setNodeName(state.getName());\n                }\n            }\n        }\n    }\n\n    private Object[] parseProcessDefIdAndVersion(String defId) {\n        defId = defId.substring(defId.indexOf(\"-\") + 1);\n        if (defId.contains(VERSION_PREFIX)) {\n            String versionStr = defId.substring(defId.indexOf(VERSION_PREFIX) + VERSION_PREFIX.length());\n            Integer defVersion = Integer.parseInt(versionStr);\n            String processDefId = defId.substring(0, defId.indexOf(VERSION_PREFIX));\n            return new Object[] {processDefId, defVersion};\n        }\n        return new Object[] {defId, null};\n    }\n\n    @RequestMapping(\"create\")\n    public String create() {\n        return \"easyflow/process/processinstance/processInstanceCreate\";\n    }\n\n    @RequestMapping(\"add\")\n    public String add(String processId, Model model) {\n        ExportResponse<com.jd.easyflow.process.adapter.export.dto.definition.ProcessDefinitionDTO> definitionResponse = getProcessDefinitionExport()\n                .getVersionedProcessDefinition(new ExportRequest<String>(processId));\n        com.jd.easyflow.process.adapter.export.dto.definition.ProcessDefinitionDTO definition = ExportResponseUtil\n                .unwrap(definitionResponse);\n        Flow flow = flowParser.parse(definition.getJsonContent(), false).get(0);\n        Map<String, Object> processProperties = flow.getProperty(\"process\");\n        Map<String, Object> instanceCreateProperties = (Map<String, Object>) processProperties.get(\"instanceCreate\");\n        \n        String pageUrl = processProperties == null ? null : (String) processProperties.get(\"pageUrl\");\n        if (pageUrl != null) {\n            Map<String, Object> root = new HashMap<String, Object>();\n            root.put(\"processId\", processId);\n            root.put(\"flow\", flow);\n            root.put(\"processProperties\", processProperties);\n            String pageUrlVal = ElFactory.get(elType).evalWithDefaultContext(pageUrl, root, true);\n            if (pageUrlVal != null && ! pageUrlVal.isEmpty()) {\n                return \"redirect:\" + pageUrlVal;\n            }\n        }\n\n        String pageId = (String) instanceCreateProperties.get(\"pageId\");\n        String processInstanceFormId = (String) instanceCreateProperties.get(\"formId\");\n        if (processInstanceFormId == null) {\n            processInstanceFormId = (String) processProperties.get(\"formId\");\n        }\n        model.addAttribute(\"instanceFormId\", processInstanceFormId);\n        model.addAttribute(\"definition\", definition);\n        model.addAttribute(\"processName\", flow.getName());\n        if (pageId == null) {\n            pageId = INSTANCE_CREATE_PAGE_ID_TASK;\n        }\n\n        if (INSTANCE_CREATE_PAGE_ID_TASK.equals(pageId)) {\n\n            String startNodeId = flow.getStartNodeIds()[0];\n            FlowNode flowNode = flow.getNode(startNodeId);\n            Map<String, Object> taskProperties = (Map<String, Object>) flowNode.getProperty(\"task\");\n            Map<String, Object> createProperties = (Map<String, Object>) taskProperties.get(\"create\");\n\n            Map<String, Object> flowTaskProperties = flow.getProperty(\"task\");\n            Map<String, Object> flowCreateProperties = (Map<String, Object>) flowTaskProperties.get(\"taskCreate\");\n\n            String formId = (String) createProperties.get(\"formId\");\n            if (formId == null && flowCreateProperties != null) {\n                formId = (String) flowCreateProperties.get(\"formId\");\n            }\n            String instanceFormId = (String) createProperties.get(\"instanceFormId\");\n            if (instanceFormId != null) {\n                model.addAttribute(\"instanceFormId\", instanceFormId);\n            }\n\n            model.addAttribute(\"taskFormId\", formId);\n        }\n        return \"easyflow/process/processinstance/\" + pageId;\n    }\n\n    @RequestMapping(\"ajax/commonTaskProcessInstanceAdd\")\n    @ResponseBody\n    public DataResponse<Object> commonTaskProcessInstanceAdd(CommonTaskProcessInstanceCreateDTO dto) {\n        ExportResponse<com.jd.easyflow.process.adapter.export.dto.definition.ProcessDefinitionDTO> definitionResponse = getProcessDefinitionExport()\n                .getVersionedProcessDefinition(new ExportRequest<String>(dto.getProcessId()));\n        com.jd.easyflow.process.adapter.export.dto.definition.ProcessDefinitionDTO definition = ExportResponseUtil\n                .unwrap(definitionResponse);\n        Flow flow = flowParser.parse(definition.getJsonContent(), false).get(0);\n        Map<String, Object> processProperties = flow.getProperty(\"process\");\n        String processType = (String) processProperties.get(\"processType\");\n\n        CreateProcessInstanceReq req = new CreateProcessInstanceReq();\n        req.setProcessId(dto.getProcessId());\n        req.setProcessType(processType);\n        GenerateParam generateParam = GenerateParam.builder().typeId(\"PROCESS_BIZ_NO\")\n                .codePrefix(\"B\").build();\n        ExportResponse<GenerateResult> response = getCodeGenerateExport().generateUniqueCode(new ExportRequest<GenerateParam>(generateParam));\n        String bizNo = ExportResponseUtil.unwrap(response).getCode();\n        req.setBizNo(bizNo);\n\n        req.setProductCode(dto.getProductCode());\n        req.setCreator(userGroupAdminExtension.getCurrentUser(null));\n        req.setInstanceName(dto.getInstanceName());\n        req.setBizData(dto.getInstanceBizData());\n        req.setKeyField(dto.getKeyField());\n        req.setKeyField2(dto.getKeyField2());\n        Map<String, Object> param = new HashMap<>();\n        param.put(ProcessTaskConstants.PARAM_TASK_EXECUTE_DATA, dto.getTaskData());\n        req.setParam(param);\n\n        ExportResponseUtil.unwrap(\n                getProcessInstanceExport().createProcessInstance(new ExportRequest<CreateProcessInstanceReq>(req)));\n        return DataResponse.buildSuccessResponse(null);\n    }\n\n    protected ProcessInstanceExport getProcessInstanceExport() {\n        if (processInstanceExport == null) {\n            processInstanceExport = ObjectFactorys.getDefault().getObject(ProcessInstanceExport.class);\n        }\n        return processInstanceExport;\n    }\n\n    protected ProcessDefinitionExport getProcessDefinitionExport() {\n        if (processDefinitionExport == null) {\n            processDefinitionExport = ObjectFactorys.getDefault().getObject(ProcessDefinitionExport.class);\n        }\n        return processDefinitionExport;\n    }\n    \n    protected ProcessTaskExport getProcessTaskExport() {\n        if (processTaskExport == null) {\n            processTaskExport = ObjectFactorys.getDefault().getObject(ProcessTaskExport.class);\n        }\n        return processTaskExport;\n    }\n    \n    protected CodeGenerateExport getCodeGenerateExport() {\n        if (codeGenerateExport == null) {\n            codeGenerateExport = ObjectFactorys.getDefault().getObject(CodeGenerateExport.class);\n        }\n        return codeGenerateExport;\n    }\n    \n    private List<ProcessNodeInstanceDTO> sortNodeInstances(List<ProcessNodeInstanceDTO> nodeList) {\n        List<ProcessNodeInstanceDTO> result = new ArrayList<ProcessNodeInstanceDTO>();\n        Map<String, ProcessNodeInstanceDTO> nodeMap = new HashMap<String, ProcessNodeInstanceDTO>(nodeList.size());\n        nodeList.forEach(node -> nodeMap.put(node.getNodeInstanceNo(), node));\n        \n        while (nodeMap.size() > 0) {\n            List<ProcessNodeInstanceDTO> noPreviousList = new ArrayList<ProcessNodeInstanceDTO>();\n            for (ProcessNodeInstanceDTO node : nodeMap.values()) {\n                String previousStr = node.getPreviousNodeInstances();\n                if (previousStr == null || previousStr.isEmpty()) {\n                    noPreviousList.add(node);\n                    continue;\n                }\n                String[] previousList = previousStr.split(\",\");\n                boolean hasPrevious = false;\n                for (String previous : previousList) {\n                    if (nodeMap.containsKey(previous)) {\n                       hasPrevious = true;\n                       break;\n                    }\n                }\n                if (! hasPrevious) {\n                    noPreviousList.add(node);\n                }\n            }\n            \n            if (noPreviousList.size() == 0) {\n                log.warn(\"Node instance list data error\");\n                result.addAll(nodeMap.values());\n                break;\n            }\n            result.addAll(noPreviousList);\n            noPreviousList.forEach(tmp -> nodeMap.remove(tmp.getNodeInstanceNo()));\n        }\n        return result;\n    }\n    \n    @RequestMapping(\"ajax/cancel\")\n    @ResponseBody\n    public DataResponse<Object> cancel(String instanceNo) {\n        String currentUser = userGroupAdminExtension.getCurrentUser(null);\n        CancelProcessInstanceReq req = new CancelProcessInstanceReq();\n        req.setInstanceNo(instanceNo);\n        req.setCancelUser(currentUser);\n        ExportResponseUtil.unwrap(getProcessInstanceExport().cancel(new ExportRequest<CancelProcessInstanceReq>(req)));\n        return DataResponse.buildSuccessResponse(null);\n    }\n\n    public String getElType() {\n        return elType;\n    }\n\n    public void setElType(String elType) {\n        this.elType = elType;\n    }\n\n    public FlowParser getFlowParser() {\n        return flowParser;\n    }\n\n    public void setFlowParser(FlowParser flowParser) {\n        this.flowParser = flowParser;\n    }\n\n    public UserGroupAdminExtension getUserGroupAdminExtension() {\n        return userGroupAdminExtension;\n    }\n\n    public void setUserGroupAdminExtension(UserGroupAdminExtension userGroupAdminExtension) {\n        this.userGroupAdminExtension = userGroupAdminExtension;\n    }\n\n    public void setProcessInstanceExport(ProcessInstanceExport processInstanceExport) {\n        this.processInstanceExport = processInstanceExport;\n    }\n\n    public void setProcessDefinitionExport(ProcessDefinitionExport processDefinitionExport) {\n        this.processDefinitionExport = processDefinitionExport;\n    }\n\n    public void setProcessTaskExport(ProcessTaskExport processTaskExport) {\n        this.processTaskExport = processTaskExport;\n    }\n\n    public void setCodeGenerateExport(CodeGenerateExport codeGenerateExport) {\n        this.codeGenerateExport = codeGenerateExport;\n    }\n    \n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/java/com/jd/easyflow/admin/process/adapter/page/ProcessTaskController.java",
    "content": "package com.jd.easyflow.admin.process.adapter.page;\n\nimport java.util.Arrays;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.stream.Collectors;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.Model;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.ResponseBody;\nimport org.springframework.web.context.request.NativeWebRequest;\n\nimport com.jd.easyflow.admin.process.adapter.page.converter.PagerConverter;\nimport com.jd.easyflow.admin.process.adapter.page.converter.ProcessTaskConverter;\nimport com.jd.easyflow.admin.process.adapter.page.dto.CommonTaskExecuteDTO;\nimport com.jd.easyflow.admin.process.adapter.page.dto.ProcessTaskInfoForPagerDTO;\nimport com.jd.easyflow.admin.process.adapter.page.extension.UserGroupAdminExtension;\nimport com.jd.easyflow.admin.process.adapter.page.util.AdminProcessConstants;\nimport com.jd.easyflow.admin.process.adapter.page.util.ClientErrorCode;\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponse;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponseCode;\nimport com.jd.easyflow.common.adapter.export.dto.pager.PagerResult;\nimport com.jd.easyflow.common.adapter.export.util.ExportResponseUtil;\nimport com.jd.easyflow.common.adapter.page.BasePageController;\nimport com.jd.easyflow.common.adapter.page.WebResponse;\nimport com.jd.easyflow.common.dto.DataResponse;\nimport com.jd.easyflow.common.dto.pager.FieldEntry;\nimport com.jd.easyflow.common.dto.pager.PagerCondition;\nimport com.jd.easyflow.common.exception.UserException;\nimport com.jd.easyflow.common.util.CommonErrorCode;\nimport com.jd.easyflow.common.util.MessageUtil;\nimport com.jd.easyflow.el.ElFactory;\nimport com.jd.easyflow.flow.bpmn.BpmnFlowParser;\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.parser.FlowParser;\nimport com.jd.easyflow.objects.factory.ObjectFactorys;\nimport com.jd.easyflow.process.adapter.export.ProcessDefinitionExport;\nimport com.jd.easyflow.process.adapter.export.ProcessInstanceExport;\nimport com.jd.easyflow.process.adapter.export.ProcessTaskExport;\nimport com.jd.easyflow.process.adapter.export.constant.ProcessInstanceConstants;\nimport com.jd.easyflow.process.adapter.export.constant.ProcessTaskConstants;\nimport com.jd.easyflow.process.adapter.export.dto.definition.ProcessDTO;\nimport com.jd.easyflow.process.adapter.export.dto.definition.ProcessDefinitionDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessInstanceDTO;\nimport com.jd.easyflow.process.adapter.export.dto.task.CanWithdrawTaskReq;\nimport com.jd.easyflow.process.adapter.export.dto.task.CanWithdrawTaskRes;\nimport com.jd.easyflow.process.adapter.export.dto.task.ExecuteTaskReq;\nimport com.jd.easyflow.process.adapter.export.dto.task.ProcessTaskAssignDTO;\nimport com.jd.easyflow.process.adapter.export.dto.task.ProcessTaskDTO;\nimport com.jd.easyflow.process.adapter.export.dto.task.WithdrawTaskReq;\nimport com.jd.easyflow.process.adapter.export.dto.task.cmd.TaskCreateCmd;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n * @author liyuliang5\n */\n@Controller\n@RequestMapping(\"easyflow/processTask\")\npublic class ProcessTaskController extends BasePageController {\n\n    private ProcessTaskExport processTaskExport;\n    private ProcessInstanceExport processInstanceExport;\n    private ProcessDefinitionExport processDefinitionExport;\n\n    @Autowired\n    private UserGroupAdminExtension userGroupAdminExtension;\n\n    private FlowParser flowParser = new BpmnFlowParser();\n    \n    private String elType;\n\n    @RequestMapping(\"list\")\n    public String processTaskList() {\n        return \"easyflow/process/processtask/processTaskList\";\n    }\n    \n    @RequestMapping(\"ajax/getListData\")\n    @ResponseBody\n    public WebResponse<PagerResult> getData(NativeWebRequest request) {\n        PagerCondition condition = getPagerCondition(request);\n        return getData(condition);\n    }\n\n    protected WebResponse<PagerResult> getData(PagerCondition condition) {\n        Map extData = new HashMap<>(1);\n        extData.put(\"productCode\", null == condition.getField(\"productCode\") ? null : condition.getField(\"productCode\").getValue());\n        String currentUser = userGroupAdminExtension.getCurrentUser(extData);\n        List<String> groupList = userGroupAdminExtension.getUserGroupList(currentUser, extData);\n        List<String> group2List = userGroupAdminExtension.getUserGroup2List(currentUser, extData);\n\n        String queryType = (String) condition.getField(\"queryType\").getValue();\n        if (\"MY_TODO\".equals(queryType)) {\n            condition.addField(new FieldEntry(\"assignUser\", currentUser));\n            if (groupList != null) {\n                condition.addField(new FieldEntry(\"assignGroupList\", groupList));\n            }\n            if (group2List != null) {\n                condition.addField(new FieldEntry(\"assignGroup2List\", group2List));\n            }\n            condition.addField(new FieldEntry(\"status\", \"PENDING\"));\n        } else if (\"MY_DONE\".equals(queryType)) {\n            condition.addField(new FieldEntry(\"executor\", currentUser));\n        }\n        condition.putExtData(ProcessTaskConstants.PAGER_EXT_KEY_ASSIGN, ProcessTaskConstants.PAGER_EXT_ASSIGN_PENDING);\n        condition.putExtData(ProcessTaskConstants.PAGER_EXT_KEY_NODE_TASK_CONF,\n                ProcessTaskConstants.PAGER_EXT_NODE_TASK_CONF_PENDING);\n        condition.putExtData(ProcessTaskConstants.PAGER_EXT_KEY_PROCESS_INSTANCE,\n                ProcessTaskConstants.PAGER_EXT_PROCESS_INSTANCE_ALL);\n        if (condition.getSortList() == null || condition.getSortList().isEmpty()) {\n            condition.addSortField(\"createdDate\", 0, \"desc\");\n        }\n        ExportResponse response = getProcessTaskExport()\n                .pagerQueryTask(new ExportRequest(PagerConverter.INSTANCE.convert(condition)));\n        com.jd.easyflow.common.adapter.export.dto.pager.PagerResult pagerResult = (com.jd.easyflow.common.adapter.export.dto.pager.PagerResult) ExportResponseUtil\n                .unwrap(response);\n        List<ProcessTaskInfoForPagerDTO> processTaskList = ProcessTaskConverter.INSTANCE\n                .convertPagerResult(pagerResult.getList());\n        List<String> collectInstanceNos = processTaskList.stream().map(processTask -> {\n            if (ProcessTaskConstants.TASK_STATUS_PENDING.equals(processTask.getStatus())) {\n                return processTask.getProcessInstanceNo();\n            }\n            return null;\n        }).filter(t -> t != null && ! t.isEmpty()).collect(Collectors.toList());\n        Map<String, Object> taskHandleMap = queryTaskAdminPropertyByProcessInstanceNo(collectInstanceNos, \"taskHandle\");\n        for (int i = 0; i < processTaskList.size(); i++) {\n            ProcessTaskInfoForPagerDTO dto = processTaskList.get(i);\n            ProcessInstanceDTO instance = ((ProcessTaskDTO) pagerResult.getList().get(i)).getProcessInstance();\n            dto.setInstanceName(instance.getInstanceName());\n            dto.setInstanceStatus(instance.getStatus());\n            dto.setInstanceCreator(instance.getCreator());\n            dto.setInstanceCreatedDate(instance.getCreatedDate());\n            dto.setInstanceKeyField(instance.getKeyField());\n            dto.setInstanceKeyField2(instance.getKeyField2());\n            List<ProcessTaskAssignDTO> assignList = dto.getAssignList();\n            \n            boolean canHandle = false;\n            if (null != taskHandleMap && Boolean.TRUE.equals(taskHandleMap.get(instance.getInstanceNo()))) {\n                if (assignList != null) {\n                    String assignInfo = dto.getAssignInfo();\n                    Map<String, Object> assignInfoMap = JSON.parseObject(assignInfo, Map.class);\n                    List<String> excludeUserList = assignInfoMap == null ? null : (List<String>)assignInfoMap.get(\"excludeUser\");\n                    if (excludeUserList != null && excludeUserList.contains(currentUser)) {\n                        canHandle = false;\n                    } else {\n                    for (ProcessTaskAssignDTO assign : assignList) {\n                        if (assign.getAssignType().equals(ProcessTaskConstants.ASSIGN_TYPE_USER)) {\n                            if (currentUser.equals(assign.getAssignUser())) {\n                                canHandle = true;\n                                break;\n                            }\n                        } else if (assign.getAssignType().equals(ProcessTaskConstants.ASSIGN_TYPE_GROUP)) {\n                            boolean assignInGroup = null == assign.getAssignGroup2()\n                                    && groupList != null && groupList.contains(assign.getAssignGroup());\n                            boolean assignInGroup2 = null == assign.getAssignGroup()\n                                    && group2List != null\n                                    && group2List.contains(assign.getAssignGroup2());\n                            boolean assignInAllGroup = groupList != null\n                                    && group2List != null && groupList.contains(assign.getAssignGroup())\n                                    && group2List.contains(assign.getAssignGroup2());\n                            if (assignInGroup || assignInGroup2 || assignInAllGroup) {\n                                canHandle = true;\n                                break;\n                            }\n                        }\n                    }\n                    }\n                }\n            }\n            dto.setCanHandle(canHandle);\n            if ((!ProcessInstanceConstants.STATUS_CLOSE.equals(instance.getStatus()))\n                    && (ProcessTaskConstants.TASK_STATUS_FINISH.equals(dto.getStatus()))\n                    && dto.getExecutor().equals(currentUser)) {\n                CanWithdrawTaskReq req = new CanWithdrawTaskReq();\n                req.setUser(currentUser);\n                req.setTaskNo(dto.getTaskNo());\n                ExportResponse<CanWithdrawTaskRes> canWithdrawResponse = getProcessTaskExport()\n                        .canWithdraw(new ExportRequest<CanWithdrawTaskReq>(req));\n                dto.setCanWithdraw(ExportResponseUtil.unwrap(canWithdrawResponse).isCanWithDraw());\n            }\n        }\n        pagerResult.setList(processTaskList);\n        return WebResponse.buildResponse(CommonErrorCode.E0000000.getCode(), CommonErrorCode.E0000000.getDesc(),\n                pagerResult);\n    }\n\n    @RequestMapping(\"handle\")\n    public String handleTaskPage(String taskNo, Model model) {\n        String currentUser = userGroupAdminExtension.getCurrentUser(null);\n        ExportResponse<ProcessTaskDTO> response = getProcessTaskExport().getTask(new ExportRequest<String>(taskNo));\n        ProcessTaskDTO task = ExportResponseUtil.unwrap(response);\n        ExportResponse<ProcessInstanceDTO> instanceResponse = getProcessInstanceExport()\n                .getProcessInstance(new ExportRequest<String>(task.getProcessInstanceNo()));\n        ProcessInstanceDTO instance = ExportResponseUtil.unwrap(instanceResponse);\n        ExportResponse<ProcessDefinitionDTO> definitionResponse = getProcessDefinitionExport()\n                .getProcessDefinition(new ExportRequest<String>(instance.getProcessDefId()));\n        ProcessDefinitionDTO definition = ExportResponseUtil.unwrap(definitionResponse);\n        Flow flow = flowParser.parse(definition.getJsonContent(), false).get(0);\n        FlowNode flowNode = flow.getNode(task.getTaskBizCode());\n        Map<String, Object> taskProperties = (Map<String, Object>) flowNode.getProperty(\"task\");\n        Map<String, Object> executeProperties = (Map<String, Object>) taskProperties.get(\"execute\");\n        Map<String, Object> flowTaskProperties = flow.getProperty(\"task\");\n        Map<String, Object> processProperties = flow.getProperty(\"process\");\n        Map<String, Object> flowExecuteProperties = (Map<String, Object>) flowTaskProperties.get(\"taskExecute\");\n        Map<String, Object> createTaskProperties = (Map<String, Object>) executeProperties.get(\"createTask\");\n        if (createTaskProperties != null && Boolean.TRUE.equals(createTaskProperties.get(\"enable\"))) {\n            model.addAttribute(\"createTask\", true);\n        } else {\n            model.addAttribute(\"createTask\", false);\n        }\n        String pageUrl = executeProperties == null ? null : (String) executeProperties.get(\"pageUrl\");\n        if (pageUrl != null) {\n            Map<String, Object> root = new HashMap<String, Object>();\n            root.put(\"taskNo\", taskNo);\n            root.put(\"flow\", flow);\n            root.put(\"processProperties\", processProperties);\n            root.put(\"taskProperties\", taskProperties);\n            String pageUrlVal = ElFactory.get(elType).evalWithDefaultContext(pageUrl, root, true);\n            if (pageUrlVal != null && ! pageUrlVal.isEmpty()) {\n                return \"redirect:\" + pageUrlVal;\n            }\n        }\n        \n        String pageId = executeProperties == null ? null : (String) executeProperties.get(\"pageId\");\n        if (pageId == null) {\n            pageUrl = flowExecuteProperties == null ? null : (String) flowExecuteProperties.get(\"pageUrl\");\n            if (pageUrl != null) {\n                Map<String, Object> root = new HashMap<String, Object>();\n                root.put(\"taskNo\", taskNo);\n                root.put(\"flow\", flow);\n                root.put(\"processProperties\", processProperties);\n                root.put(\"taskProperties\", taskProperties);\n                String pageUrlVal = ElFactory.get(elType).evalWithDefaultContext(pageUrl, root, true);\n                if (pageUrlVal != null && !pageUrlVal.isEmpty()) {\n                    return \"redirect:\" + pageUrlVal;\n                }\n            }\n            pageId = flowExecuteProperties == null ? null : (String) flowExecuteProperties.get(\"pageId\");\n        }\n        if (pageId == null) {\n            pageId = \"commonProcessTaskPassReject\";\n        }\n        String instanceFormId = (String) executeProperties.get(\"instanceFormId\");\n        if (instanceFormId == null) {\n            instanceFormId = flowExecuteProperties == null ? null : (String) flowExecuteProperties.get(\"instanceFormId\");\n        }\n        if (instanceFormId == null) {\n            instanceFormId = (String) processProperties.get(\"formId\");\n        }\n        model.addAttribute(\"instanceFormId\", instanceFormId);\n        String taskFormId = (String) executeProperties.get(\"formId\");\n        if (taskFormId == null) {\n            taskFormId = flowExecuteProperties == null ? null : (String) flowExecuteProperties.get(\"formId\");\n        }\n        model.addAttribute(\"taskFormId\", taskFormId);\n        boolean instanceDataModify = getTaskAdminProperty(flow.getProperties(), \"instanceDataModify\", false);\n        if (instanceDataModify) {\n            instanceDataModify = getTaskAdminProperty(flowNode.getProperties(), \"instanceDataModify\", false);\n        }\n        model.addAttribute(\"instanceDataModify\", instanceDataModify);\n        model.addAttribute(\"task\", task);\n        model.addAttribute(\"instance\", instance);\n        model.addAttribute(\"definition\", definition);\n        model.addAttribute(\"executeProperties\", executeProperties);\n        \n        String executeBizResult = null;\n        String executeBizData = null;\n        String instanceBizData = instance.getBizData();\n        String extDataStr = task.getExtData();\n        Integer taskVersion = null;\n        if (extDataStr != null && ! extDataStr.isEmpty()) {\n            Map<String, Object> extData = JSON.parseObject(extDataStr, Map.class);\n            taskVersion = (Integer) extData.get(\"taskVersion\");\n            \n            Map<String, Object> taskTmpSaveData = (Map<String, Object>) extData.get(\"taskTmpSaveData\");\n            if (taskTmpSaveData != null) {\n                executeBizResult = (String) taskTmpSaveData.get(\"executeBizResult\");\n                executeBizData = (String) taskTmpSaveData.get(\"executeBizData\");\n                instanceBizData = (String) taskTmpSaveData.get(\"instanceBizData\");\n                }\n            Map<String, Object> userTmpSaveData = (Map<String, Object>) extData.get(\"userTmpSaveData\");\n            if (userTmpSaveData != null && userTmpSaveData.get(currentUser) != null) {\n                Map<String, Object> currentuserTmpSaveData = (Map<String, Object>) userTmpSaveData.get(currentUser);\n                executeBizResult = (String) currentuserTmpSaveData.get(\"executeBizResult\");\n                executeBizData = (String) currentuserTmpSaveData.get(\"executeBizData\");\n                instanceBizData = (String) currentuserTmpSaveData.get(\"instanceBizData\");\n            }\n        }\n\n        Map<String, Object> pageData = new HashMap<>();\n        pageData.put(\"taskNo\", task.getTaskNo());\n        pageData.put(\"version\", taskVersion == null ? 0 : taskVersion);\n        pageData.put(\"instanceBizData\", JSON.parseObject(instanceBizData, Map.class));\n        pageData.put(\"executeBizResult\", executeBizResult);\n        pageData.put(\"executeBizData\",  JSON.parseObject(executeBizData, Map.class));\n        model.addAttribute(\"pageData\", JSON.toJSONString(pageData));\n\n        return \"easyflow/process/processtask/\" + pageId;\n    }\n\n    @RequestMapping(\"ajax/commonTaskExecute\")\n    @ResponseBody\n    public DataResponse<Object> commonTaskExecute(CommonTaskExecuteDTO executeDto) {\n        ExportResponse<ProcessTaskDTO> taskExportRes = getProcessTaskExport().getTask(new ExportRequest<String>(executeDto.getTaskNo()));\n        ProcessTaskDTO processTaskDTO = ExportResponseUtil.unwrap(taskExportRes);\n        String processInstanceNo = processTaskDTO.getProcessInstanceNo();\n        Map<String, Object> taskHandleMap = queryTaskAdminPropertyByProcessInstanceNo(Arrays.asList(processInstanceNo), \"taskHandle\");\n        if (null != taskHandleMap && Boolean.FALSE.equals(taskHandleMap.get(processInstanceNo))) {\n            throw new UserException(MessageUtil.getMessage(\"easyflow.process.admin.tip.handleDisable\"));\n        }\n        Map<String, Object> extData = new HashMap<>();\n\n        ExportResponse<ProcessTaskDTO> taskResponse = getProcessTaskExport().getTask(new ExportRequest<String>(executeDto.getTaskNo()));\n        ProcessTaskDTO task = ExportResponseUtil.unwrap(taskResponse);\n        Integer currentVersion = null;\n        if (task.getExtData() != null && ! task.getExtData().isEmpty()) {\n            Map<String, Object> taskExtData = JSON.parseObject(task.getExtData(), Map.class);\n            currentVersion = (Integer) taskExtData.get(\"taskVersion\");\n        }\n        currentVersion = currentVersion == null ? 0 : currentVersion;\n        if (executeDto.getVersion() != null && ! executeDto.getVersion().equals(currentVersion)) {\n            return new DataResponse<>(CommonErrorCode.E9999999.getCode(), MessageUtil.getMessage(\"easyflow.process.admin.tip.flowChange\"), null);\n        }\n        extData.put(\"taskVersion\", currentVersion + 1);\n        \n        ExecuteTaskReq req = new ExecuteTaskReq();\n        req.setTaskNo(executeDto.getTaskNo());\n        Map extInfo = new HashMap<>(1);\n        extInfo.put(\"productCode\", task.getProductCode());\n        String currentUser = userGroupAdminExtension.getCurrentUser(extInfo);\n        req.setUser(currentUser);\n        req.setGroupList(userGroupAdminExtension.getUserGroupList(currentUser, extInfo));\n        req.setGroup2List(userGroupAdminExtension.getUserGroup2List(currentUser, extInfo));\n        req.setOperation(executeDto.getOperation());     \n        if (executeDto.getOperation() == null\n                || ProcessTaskConstants.TASK_OP_EXECUTE.equals(executeDto.getOperation())) {\n            req.setExecuteBizResult(executeDto.getExecuteBizResult());\n            req.setInstanceBizStatus(executeDto.getExecuteBizResult());\n            req.setExecuteBizData(executeDto.getExecuteBizData());\n            req.setInstanceBizData(\n                    (executeDto.getInstanceBizData() != null && ! executeDto.getInstanceBizData().isEmpty()) ? executeDto.getInstanceBizData() : null);\n            extData.put(\"taskTmpSaveData\", new HashMap<>());\n            extData.put(\"userTmpSaveData\", new HashMap<>());\n            req.setTaskExtData(JSON.toJSONString(extData));\n            if (executeDto.getAssignUserList() != null && ! executeDto.getAssignUserList().isEmpty()) {\n                TaskCreateCmd cmd = new TaskCreateCmd();\n                Map<String, Object> assignInfo = new HashMap<>();\n                assignInfo.put(\"user\", Arrays.asList(executeDto.getAssignUserList().split(\",\")));\n                cmd.setAssignInfo(assignInfo);\n                req.setCmdList(Arrays.asList(cmd));\n            }\n        } else if (ProcessTaskConstants.TASK_OP_SAVE.equals(executeDto.getOperation())) {\n            ExportResponse<ProcessInstanceDTO> instanceResponse = getProcessInstanceExport()\n                    .getProcessInstance(new ExportRequest<String>(processTaskDTO.getProcessInstanceNo()));\n            ProcessInstanceDTO instance = ExportResponseUtil.unwrap(instanceResponse);\n            ExportResponse<ProcessDefinitionDTO> definitionResponse = getProcessDefinitionExport()\n                    .getProcessDefinition(new ExportRequest<String>(instance.getProcessDefId()));\n            ProcessDefinitionDTO definition = ExportResponseUtil.unwrap(definitionResponse);\n            Flow flow = flowParser.parse(definition.getJsonContent(), false).get(0);\n            FlowNode flowNode = flow.getNode(processTaskDTO.getTaskBizCode());\n            Map<String, Object> taskProperties = (Map<String, Object>) flowNode.getProperty(\"task\");\n            Map<String, Object> adminProperties = taskProperties == null ? null : (Map<String, Object>) taskProperties.get(\"admin\");\n            String saveScope = adminProperties == null ? \"USER\" : (String) adminProperties.get(\"saveScope\");\n            \n            Map<String, Object> tmpSaveData = new HashMap<>();\n            tmpSaveData.put(\"executeBizResult\", executeDto.getExecuteBizResult());\n            tmpSaveData.put(\"executeBizData\", executeDto.getExecuteBizData());\n            if (executeDto.getInstanceBizData() != null && ! executeDto.getInstanceBizData().isEmpty()) {\n                tmpSaveData.put(\"instanceBizData\", executeDto.getInstanceBizData());\n            }\n            if (\"TASK\".equals(saveScope)) {\n                extData.put(\"taskTmpSaveData\", tmpSaveData);\n            } else {\n                String extDataStr = processTaskDTO.getExtData();\n                Map<String, Object> taskExtData = JSON.parseObject(extDataStr, Map.class);\n                Map<String, Object> userTmpSaveData = null;\n                if (taskExtData != null) {\n                    userTmpSaveData = (Map<String, Object>) taskExtData.get(\"userTmpSaveData\");\n                }\n                if (userTmpSaveData == null) {\n                    userTmpSaveData = new HashMap<>();\n                }\n                userTmpSaveData.put(currentUser, tmpSaveData);\n                extData.put(\"userTmpSaveData\", userTmpSaveData);\n            }\n            req.setTaskExtData(JSON.toJSONString(extData));\n            req.setExecuteBizResult(null);\n            req.setExecuteBizData(null);\n            req.setInstanceBizStatus(null);\n            req.setInstanceBizData(null);\n        } else {\n            throw new UnsupportedOperationException(\"Unsupported operation:\" + executeDto.getOperation());\n        }\n        \n        \n        ExportResponse response = getProcessTaskExport().executeTask(new ExportRequest(req));\n        if (ExportResponseCode.SUCCESS.getCode().equals(response.getResCode())) {\n            return DataResponse.buildSuccessResponse(null);\n        }\n        if (ClientErrorCode.PTC_0101.name().equals(response.getResCode())) {\n            Map<String, String> errorData = response.getExt() == null ? null\n                    : (Map<String, String>) response.getExt().get(\"errorData\");\n            if (errorData != null) {\n                return new DataResponse<Object>(errorData.get(AdminProcessConstants.BIZ_RES_CODE),\n                        errorData.get(AdminProcessConstants.BIZ_RES_DESC), null);\n            }\n        }\n        return new DataResponse<>(CommonErrorCode.E9999999.getCode(), CommonErrorCode.E9999999.getDesc(), null);\n    }\n\n    @RequestMapping(\"ajax/withdraw\")\n    @ResponseBody\n    public DataResponse<Object> withdraw(String taskNo) {\n        String currentUser = userGroupAdminExtension.getCurrentUser(null);\n        WithdrawTaskReq req = new WithdrawTaskReq();\n        req.setTaskNo(taskNo);\n        req.setUser(currentUser);\n        ExportResponseUtil.unwrap(getProcessTaskExport().withDraw(new ExportRequest<WithdrawTaskReq>(req)));\n        return DataResponse.buildSuccessResponse(null);\n    }\n\n    @RequestMapping(\"detail\")\n    public String detailPage(String taskNo, Model model) {\n        ExportResponse<ProcessTaskDTO> response = getProcessTaskExport().getTask(new ExportRequest<String>(taskNo));\n        ProcessTaskDTO task = ExportResponseUtil.unwrap(response);\n        ExportResponse<ProcessInstanceDTO> instanceResponse = getProcessInstanceExport()\n                .getProcessInstance(new ExportRequest<String>(task.getProcessInstanceNo()));\n        ProcessInstanceDTO instance = ExportResponseUtil.unwrap(instanceResponse);\n        ExportResponse<ProcessDefinitionDTO> definitionResponse = getProcessDefinitionExport()\n                .getProcessDefinition(new ExportRequest<String>(instance.getProcessDefId()));\n        ProcessDefinitionDTO definition = ExportResponseUtil.unwrap(definitionResponse);\n        Flow flow = null; \n        FlowNode flowNode = null;\n        if (definition != null) {\n            flow = flowParser.parse(definition.getJsonContent(), false).get(0);\n            flowNode = flow.getNode(task.getTaskBizCode());\n        } else {\n            logger.warn(\"process:\" + instance.getProcessDefId() + \" is null\");\n        }\n\n        Map<String, Object> taskProperties = flowNode == null ? null : (Map<String, Object>) flowNode.getProperty(\"task\");\n        Map<String, Object> detailProperties = taskProperties == null ? null :  (Map<String, Object>) taskProperties.get(\"detail\");\n        Map<String, Object> flowTaskProperties = flow == null ? null : flow.getProperty(\"task\");\n        Map<String, Object> processProperties = flow == null ? null : flow.getProperty(\"process\");\n        Map<String, Object> flowDetailProperties = flowTaskProperties == null ? null : (Map<String, Object>) flowTaskProperties.get(\"taskDetail\");\n        model.addAttribute(\"task\", task);\n        model.addAttribute(\"instance\", instance);\n        model.addAttribute(\"definition\", definition);\n        String instanceBizData = instance.getBizData();\n        String executeBizResult = null;\n        String executeBizData = null;\n        \n        if (ProcessTaskConstants.TASK_STATUS_PENDING.equals(task.getStatus())) {\n            String assignInfo = \"\";\n            if (task.getAssignList() != null) {\n                for (ProcessTaskAssignDTO assign : task.getAssignList()) {\n                    if (ProcessTaskConstants.ASSIGN_TYPE_USER.equals(assign.getAssignType())) {\n                        assignInfo += MessageUtil.getMessage(\"easyflow.process.admin.user\") + \":\" + assign.getAssignUser() + \";\";\n                    } else {\n                        assignInfo += (assign.getAssignGroup() == null ? \"\" : (MessageUtil.getMessage(\"easyflow.process.admin.userGroup\") + assign.getAssignGroup()))\n                                + (assign.getAssignGroup2() == null ? \" \" : (MessageUtil.getMessage(\"easyflow.process.admin.userGrooup2\") + assign.getAssignGroup2())) + \";\";\n                    }\n                }\n            }\n            model.addAttribute(\"assignInfoStr\", assignInfo);\n            \n            String currentUser = userGroupAdminExtension.getCurrentUser(null);\n            String extDataStr = task.getExtData();\n            if (extDataStr != null && ! extDataStr.isEmpty()) {\n                Map<String, Object> extData = JSON.parseObject(extDataStr, Map.class);\n                Map<String, Object> taskTmpSaveData = (Map<String, Object>) extData.get(\"taskTmpSaveData\");\n                if (taskTmpSaveData != null) {\n                    executeBizResult = (String) taskTmpSaveData.get(\"executeBizResult\");\n                    executeBizData = (String) taskTmpSaveData.get(\"executeBizData\");\n                    instanceBizData = (String) taskTmpSaveData.get(\"instanceBizData\");\n                    }\n                Map<String, Object> userTmpSaveData = (Map<String, Object>) extData.get(\"userTmpSaveData\");\n                if (userTmpSaveData != null && userTmpSaveData.get(currentUser) != null) {\n                    Map<String, Object> currentuserTmpSaveData = (Map<String, Object>) userTmpSaveData.get(currentUser);\n                    executeBizResult = (String) currentuserTmpSaveData.get(\"executeBizResult\");\n                    executeBizData = (String) currentuserTmpSaveData.get(\"executeBizData\");\n                    instanceBizData = (String) currentuserTmpSaveData.get(\"instanceBizData\");\n                }\n            }\n        }\n\n        String instanceFormId = detailProperties == null ? null : (String) detailProperties.get(\"instanceFormId\");\n        if (instanceFormId == null && flowDetailProperties != null) {\n            instanceFormId = (String) flowDetailProperties.get(\"instanceFormId\");\n        }\n        if (instanceFormId == null) {\n            instanceFormId = processProperties == null ? null : (String) processProperties.get(\"formId\");\n        }\n        model.addAttribute(\"instanceFormId\", instanceFormId);\n\n        String pageUrl = detailProperties == null ? null : (String) detailProperties.get(\"pageUrl\");\n        if (pageUrl != null) {\n            Map<String, Object> root = new HashMap<String, Object>();\n            root.put(\"taskNo\", taskNo);\n            root.put(\"flow\", flow);\n            root.put(\"processProperties\", processProperties);\n            root.put(\"taskProperties\", taskProperties);\n            String pageUrlVal = ElFactory.get(elType).evalWithDefaultContext(pageUrl, root, true);\n            if (pageUrlVal != null && ! pageUrlVal.isEmpty()) {\n                return \"redirect:\" + pageUrlVal;\n            }\n        }\n        \n        String pageId = detailProperties == null ? null : (String) detailProperties.get(\"pageId\");\n        if (pageId == null && flowDetailProperties != null) {\n            pageUrl = flowDetailProperties == null ? null : (String) flowDetailProperties.get(\"pageUrl\");\n            if (pageUrl != null) {\n                Map<String, Object> root = new HashMap<String, Object>();\n                root.put(\"taskNo\", taskNo);\n                root.put(\"flow\", flow);\n                root.put(\"processProperties\", processProperties);\n                root.put(\"taskProperties\", taskProperties);\n                String pageUrlVal = ElFactory.get(elType).evalWithDefaultContext(pageUrl, root, true);\n                if (pageUrlVal != null && ! pageUrlVal.isEmpty()) {\n                    return \"redirect:\" + pageUrlVal;\n                }\n            }\n            pageId = (String) flowDetailProperties.get(\"pageId\");\n        }\n        if (pageId == null) {\n            pageId = \"commonProcessTaskDetail\";\n        }\n        String taskDetailFormId = detailProperties == null ? null : (String) detailProperties.get(\"formId\");\n        if (taskDetailFormId == null) {\n            taskDetailFormId = flowDetailProperties == null ? null : (String) flowDetailProperties.get(\"formId\");\n        }\n        model.addAttribute(\"taskDetailFormId\", taskDetailFormId);\n        model.addAttribute(\"taskExecuteBizData\", (task.getExecuteBizData() == null || task.getExecuteBizData().isEmpty()) ? \"null\" : task.getExecuteBizData());\n        Map<String, Object> pageData = new HashMap<>();\n        pageData.put(\"taskNo\", task.getTaskNo());\n        pageData.put(\"instanceBizData\", JSON.parseObject(instanceBizData, Map.class));\n        pageData.put(\"executeBizResult\", executeBizResult);\n        pageData.put(\"executeBizData\",  JSON.parseObject(executeBizData, Map.class));\n        \n        model.addAttribute(\"pageData\", JSON.toJSONString(pageData));\n\n        return \"easyflow/process/processtask/\" + pageId;\n    }\n\n    protected Map<String, Object> queryTaskAdminPropertyByProcessInstanceNo(List<String> processInstanceNos, String propertyKey) {\n        if (processInstanceNos == null || processInstanceNos.isEmpty()) {\n            return null;\n        }\n        ExportResponse<List<ProcessInstanceDTO>> exportResponse = getProcessInstanceExport().queryInstanceByInstanceNos(new ExportRequest<List<String>>(processInstanceNos));\n        List<ProcessInstanceDTO> processInstanceDTOs = ExportResponseUtil.unwrap(exportResponse);\n        Map<String, Object> resultMap = new HashMap<>(processInstanceDTOs.size());\n        processInstanceDTOs.forEach(processInstanceDTO -> {\n            String processDefId = processInstanceDTO.getProcessDefId();\n            boolean value = true;\n            try {\n                Map<String, Object> instanceProperties = ((ProcessDTO) ExportResponseUtil.unwrap(getProcessDefinitionExport()\n                        .getProcessProperties(new ExportRequest(processDefId)))).getProperties();\n                value = getTaskAdminProperty(instanceProperties, propertyKey, value);\n            } catch (Exception e) {\n                logger.error(\"Query processDefinition:{} config exception:{}\", processDefId, e);\n                value = false;\n            }\n            resultMap.put(processInstanceDTO.getInstanceNo(), value);\n        });\n        return resultMap;\n    }\n\n    private <T> T getTaskAdminProperty(Map<String, Object> properties, String taskProperty, T defaultValue) {\n        Map<String, Object> taskProperties = properties == null ? null\n                : (Map<String, Object>) properties.get(\"task\");\n        Map<String, Object> adminProperties = taskProperties == null ? null\n                : (Map<String, Object>) taskProperties.get(\"admin\");\n        if (null != adminProperties) {\n            Object taskPropertyVal = adminProperties.get(taskProperty);\n            if (null != taskPropertyVal) {\n                return (T) taskPropertyVal;\n            }\n        }\n        return defaultValue;\n    }\n\n    protected ProcessInstanceExport getProcessInstanceExport() {\n        if (processInstanceExport == null) {\n            processInstanceExport = ObjectFactorys.getDefault().getObject(ProcessInstanceExport.class);\n        }\n        return processInstanceExport;\n    }\n\n    protected ProcessDefinitionExport getProcessDefinitionExport() {\n        if (processDefinitionExport == null) {\n            processDefinitionExport = ObjectFactorys.getDefault().getObject(ProcessDefinitionExport.class);\n        }\n        return processDefinitionExport;\n    }\n\n    protected ProcessTaskExport getProcessTaskExport() {\n        if (processTaskExport == null) {\n            processTaskExport = ObjectFactorys.getDefault().getObject(ProcessTaskExport.class);\n        }\n        return processTaskExport;\n    }\n\n    @RequestMapping(\"ajax/getTaskHistoryListData\")\n    @ResponseBody\n    public WebResponse<PagerResult> getTaskHistoryData(String taskNo) {\n        ExportResponse<ProcessTaskDTO> taskResponse = getProcessTaskExport().getTask(new ExportRequest<String>(taskNo));\n        ProcessTaskDTO task = ExportResponseUtil.unwrap(taskResponse);\n        String currentUser = userGroupAdminExtension.getCurrentUser(null);\n        PagerCondition condition = new PagerCondition(1, 1000);\n        condition.addField(new FieldEntry(\"processInstanceNo\", task.getProcessInstanceNo()));\n        condition.addField(new FieldEntry(\"status\", \"FINISH\"));\n        ExportResponse response = getProcessTaskExport()\n                .pagerQueryTask(new ExportRequest(PagerConverter.INSTANCE.convert(condition)));\n        com.jd.easyflow.common.adapter.export.dto.pager.PagerResult pagerResult = (com.jd.easyflow.common.adapter.export.dto.pager.PagerResult) ExportResponseUtil\n                .unwrap(response);\n        List<ProcessTaskInfoForPagerDTO> processTaskList = ProcessTaskConverter.INSTANCE\n                .convertPagerResult(pagerResult.getList());\n        pagerResult.setList(processTaskList);\n        return WebResponse.buildResponse(CommonErrorCode.E0000000.getCode(), CommonErrorCode.E0000000.getDesc(),\n                pagerResult);\n    }\n\n    public String getElType() {\n        return elType;\n    }\n\n    public void setElType(String elType) {\n        this.elType = elType;\n    }\n\n    public FlowParser getFlowParser() {\n        return flowParser;\n    }\n\n    public void setFlowParser(FlowParser flowParser) {\n        this.flowParser = flowParser;\n    }\n\n    public UserGroupAdminExtension getUserGroupAdminExtension() {\n        return userGroupAdminExtension;\n    }\n\n    public void setUserGroupAdminExtension(UserGroupAdminExtension userGroupAdminExtension) {\n        this.userGroupAdminExtension = userGroupAdminExtension;\n    }\n\n    public void setProcessTaskExport(ProcessTaskExport processTaskExport) {\n        this.processTaskExport = processTaskExport;\n    }\n\n    public void setProcessInstanceExport(ProcessInstanceExport processInstanceExport) {\n        this.processInstanceExport = processInstanceExport;\n    }\n\n    public void setProcessDefinitionExport(ProcessDefinitionExport processDefinitionExport) {\n        this.processDefinitionExport = processDefinitionExport;\n    }\n\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/java/com/jd/easyflow/admin/process/adapter/page/converter/PagerConverter.java",
    "content": "package com.jd.easyflow.admin.process.adapter.page.converter;\n\n\nimport com.jd.easyflow.common.adapter.export.dto.pager.FieldEntry;\nimport com.jd.easyflow.common.adapter.export.dto.pager.SortEntry;\nimport com.jd.easyflow.common.dto.pager.PagerCondition;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * @author liyuliang5\n *\n */\npublic class PagerConverter {\n    \n    public static PagerConverter INSTANCE = new PagerConverter();\n\n    public com.jd.easyflow.common.adapter.export.dto.pager.PagerCondition convert(PagerCondition condition) {\n        if ( condition == null ) {\n            return null;\n        }\n\n        com.jd.easyflow.common.adapter.export.dto.pager.PagerCondition pagerCondition = new com.jd.easyflow.common.adapter.export.dto.pager.PagerCondition();\n\n        pagerCondition.setCount( condition.isCount() );\n        Map<String, Object> map = condition.getExtData();\n        if ( map != null ) {\n            pagerCondition.setExtData( new HashMap<String, Object>( map ) );\n        }\n        pagerCondition.setFieldList( fieldEntryListToFieldEntryList( condition.getFieldList() ) );\n        pagerCondition.setPage( condition.getPage() );\n        pagerCondition.setPageIndex( condition.getPageIndex() );\n        pagerCondition.setPageSize( condition.getPageSize() );\n        pagerCondition.setSortList( sortEntryListToSortEntryList( condition.getSortList() ) );\n        pagerCondition.setStart( condition.getStart() );\n        if ( pagerCondition.getFieldMap() != null ) {\n            Map<String, FieldEntry> map1 = stringFieldEntryMapToStringFieldEntryMap( condition.getFieldMap() );\n            if ( map1 != null ) {\n                pagerCondition.getFieldMap().putAll( map1 );\n            }\n        }\n        if ( pagerCondition.getSortMap() != null ) {\n            Map<String, SortEntry> map2 = stringSortEntryMapToStringSortEntryMap( condition.getSortMap() );\n            if ( map2 != null ) {\n                pagerCondition.getSortMap().putAll( map2 );\n            }\n        }\n\n        return pagerCondition;\n    }\n\n    protected FieldEntry fieldEntryToFieldEntry(com.jd.easyflow.common.dto.pager.FieldEntry fieldEntry) {\n        if ( fieldEntry == null ) {\n            return null;\n        }\n\n        FieldEntry fieldEntry1 = new FieldEntry();\n\n        fieldEntry1.setName( fieldEntry.getName() );\n        fieldEntry1.setValue( fieldEntry.getValue() );\n\n        return fieldEntry1;\n    }\n\n    protected List<FieldEntry> fieldEntryListToFieldEntryList(List<com.jd.easyflow.common.dto.pager.FieldEntry> list) {\n        if ( list == null ) {\n            return null;\n        }\n\n        List<FieldEntry> list1 = new ArrayList<FieldEntry>( list.size() );\n        for ( com.jd.easyflow.common.dto.pager.FieldEntry fieldEntry : list ) {\n            list1.add( fieldEntryToFieldEntry( fieldEntry ) );\n        }\n\n        return list1;\n    }\n\n    protected SortEntry sortEntryToSortEntry(com.jd.easyflow.common.dto.pager.SortEntry sortEntry) {\n        if ( sortEntry == null ) {\n            return null;\n        }\n\n        SortEntry sortEntry1 = new SortEntry();\n\n        sortEntry1.setKey( sortEntry.getKey() );\n        sortEntry1.setSeq( sortEntry.getSeq() );\n        sortEntry1.setType( sortEntry.getType() );\n\n        return sortEntry1;\n    }\n\n    protected List<SortEntry> sortEntryListToSortEntryList(List<com.jd.easyflow.common.dto.pager.SortEntry> list) {\n        if ( list == null ) {\n            return null;\n        }\n\n        List<SortEntry> list1 = new ArrayList<SortEntry>( list.size() );\n        for ( com.jd.easyflow.common.dto.pager.SortEntry sortEntry : list ) {\n            list1.add( sortEntryToSortEntry( sortEntry ) );\n        }\n\n        return list1;\n    }\n\n    protected Map<String, FieldEntry> stringFieldEntryMapToStringFieldEntryMap(Map<String, com.jd.easyflow.common.dto.pager.FieldEntry> map) {\n        if ( map == null ) {\n            return null;\n        }\n\n        Map<String, FieldEntry> map1 = new HashMap<String, FieldEntry>( Math.max( (int) ( map.size() / .75f ) + 1, 16 ) );\n\n        for ( java.util.Map.Entry<String, com.jd.easyflow.common.dto.pager.FieldEntry> entry : map.entrySet() ) {\n            String key = entry.getKey();\n            FieldEntry value = fieldEntryToFieldEntry( entry.getValue() );\n            map1.put( key, value );\n        }\n\n        return map1;\n    }\n\n    protected Map<String, SortEntry> stringSortEntryMapToStringSortEntryMap(Map<String, com.jd.easyflow.common.dto.pager.SortEntry> map) {\n        if ( map == null ) {\n            return null;\n        }\n\n        Map<String, SortEntry> map1 = new HashMap<String, SortEntry>( Math.max( (int) ( map.size() / .75f ) + 1, 16 ) );\n\n        for ( java.util.Map.Entry<String, com.jd.easyflow.common.dto.pager.SortEntry> entry : map.entrySet() ) {\n            String key = entry.getKey();\n            SortEntry value = sortEntryToSortEntry( entry.getValue() );\n            map1.put( key, value );\n        }\n\n        return map1;\n    }\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/java/com/jd/easyflow/admin/process/adapter/page/converter/ProcessDefinitionConverter.java",
    "content": "package com.jd.easyflow.admin.process.adapter.page.converter;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport com.jd.easyflow.admin.process.adapter.page.dto.ProcessDefDTO;\nimport com.jd.easyflow.flow.bpmn.converter.BpmnConverter;\nimport com.jd.easyflow.process.adapter.export.dto.definition.ProcessDefinitionDTO;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ProcessDefinitionConverter {\n    \n    private static final String BPMN_FORMAT = \"FLOW-bpmn\";\n\n    private static final String EXT_DATA_BPMN_OF_JSON_KEY = \"bpmnOfJson\";\n\n    public static ProcessDefinitionConverter INSTANCE = new ProcessDefinitionConverter();\n    \n\n    public ProcessDefDTO adapterConvert(ProcessDefinitionDTO processDefinition) {\n        if (processDefinition == null) {\n            return null;\n        }\n        ProcessDefDTO processDefDTO = new ProcessDefDTO();\n        processDefDTO.setDefId(processDefinition.getDefId());\n        processDefDTO.setFormat(processDefinition.getFormat());\n        processDefDTO.setId(processDefinition.getId());\n        processDefDTO.setDefSource(processDefinition.getDefSource());\n        processDefDTO.setDefName(processDefinition.getName());\n        processDefDTO.setBizType(processDefinition.getBizType());\n        processDefDTO.setCategory(processDefinition.getCategory());\n        processDefDTO.setDefVersion(processDefinition.getDefVersion());\n        if (BPMN_FORMAT.equals(processDefinition.getFormat())) {\n            processDefDTO.setBpmnXmlData(processDefinition.getContent());\n            processDefDTO.setJsonData(processDefinition.getJsonContent());\n        } else {\n            processDefDTO.setJsonData(processDefinition.getContent());\n            String extData = processDefinition.getExtData();\n            if (extData != null && ! extData.isEmpty()) {\n                Map<String, Object> extDataMap = JSON.parseObject(extData, Map.class);\n                String bpmnData = (String) extDataMap.get(EXT_DATA_BPMN_OF_JSON_KEY);\n                processDefDTO.setBpmnXmlData(bpmnData);\n            }\n        }\n        processDefDTO.setLatest(processDefinition.getLatest());\n        processDefDTO.setCreatedBy(processDefinition.getCreatedBy());\n        processDefDTO.setModifiedBy(processDefinition.getModifiedBy());\n        processDefDTO.setCreatedDate(processDefinition.getCreatedDate());\n        processDefDTO.setModifiedDate(processDefinition.getModifiedDate());\n        return processDefDTO;\n    }\n\n    public ProcessDefinitionDTO adapterConvert(ProcessDefDTO processDef) {\n        if (processDef == null) {\n            return null;\n        }\n        ProcessDefinitionDTO processDefDTO = new ProcessDefinitionDTO();\n        processDefDTO.setDefId(processDef.getDefId());\n        processDefDTO.setFormat(processDef.getFormat());\n        processDefDTO.setId(processDef.getId());\n        processDefDTO.setName(processDef.getDefName());\n        processDefDTO.setDefSource(processDef.getDefSource());\n        processDefDTO.setBizType(processDef.getBizType());\n        processDefDTO.setCategory(processDef.getCategory());\n        processDefDTO.setDefVersion(processDef.getDefVersion());\n        if (BPMN_FORMAT.equals(processDef.getFormat())) {\n            processDefDTO.setContent(processDef.getBpmnXmlData());\n            processDefDTO.setJsonContent(BpmnConverter.convert(processDef.getBpmnXmlData()));\n        } else {\n            processDefDTO.setContent(processDef.getJsonData());\n            processDefDTO.setJsonContent(processDef.getJsonData());\n            if (processDef.getBpmnXmlData() != null && ! processDef.getBpmnXmlData().isEmpty()) {\n                Map<String, Object> extData = new HashMap<>();\n                extData.put(EXT_DATA_BPMN_OF_JSON_KEY, processDef.getBpmnXmlData());\n                processDefDTO.setExtData(JSON.toJSONString(extData));\n            }\n        }\n        processDefDTO.setCreatedBy(processDef.getCreatedBy());\n        processDefDTO.setModifiedBy(processDef.getModifiedBy());\n        processDefDTO.setLatest(processDef.getLatest());\n        return processDefDTO;\n    }\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/java/com/jd/easyflow/admin/process/adapter/page/converter/ProcessInstanceConverter.java",
    "content": "package com.jd.easyflow.admin.process.adapter.page.converter;\n\nimport com.jd.easyflow.admin.process.adapter.page.dto.ProcessInstanceInfoForPagerDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessInstanceDTO;\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessInstanceConverter {\n    \n    public static ProcessInstanceConverter INSTANCE = new ProcessInstanceConverter();\n\n    public List<ProcessInstanceInfoForPagerDTO> convertPagerResult(List<ProcessInstanceDTO> list) {\n        if ( list == null ) {\n            return null;\n        }\n\n        List<ProcessInstanceInfoForPagerDTO> list1 = new ArrayList<ProcessInstanceInfoForPagerDTO>( list.size() );\n        for ( ProcessInstanceDTO processInstanceDTO : list ) {\n            list1.add( processInstanceDTOToProcessInstanceInfoForPagerDTO( processInstanceDTO ) );\n        }\n\n        return list1;\n    }\n\n    protected ProcessInstanceInfoForPagerDTO processInstanceDTOToProcessInstanceInfoForPagerDTO(ProcessInstanceDTO processInstanceDTO) {\n        if ( processInstanceDTO == null ) {\n            return null;\n        }\n\n        ProcessInstanceInfoForPagerDTO processInstanceInfoForPagerDTO = new ProcessInstanceInfoForPagerDTO();\n\n        processInstanceInfoForPagerDTO.setBizData( processInstanceDTO.getBizData() );\n        processInstanceInfoForPagerDTO.setBizNo( processInstanceDTO.getBizNo() );\n        processInstanceInfoForPagerDTO.setBizStatus( processInstanceDTO.getBizStatus() );\n        processInstanceInfoForPagerDTO.setCreatedDate( processInstanceDTO.getCreatedDate() );\n        processInstanceInfoForPagerDTO.setCreator( processInstanceDTO.getCreator() );\n        processInstanceInfoForPagerDTO.setCurrentNodeIds( processInstanceDTO.getCurrentNodeIds() );\n        processInstanceInfoForPagerDTO.setEndTime( processInstanceDTO.getEndTime() );\n        processInstanceInfoForPagerDTO.setExtData( processInstanceDTO.getExtData() );\n        processInstanceInfoForPagerDTO.setInstanceName( processInstanceDTO.getInstanceName() );\n        processInstanceInfoForPagerDTO.setInstanceNo( processInstanceDTO.getInstanceNo() );\n        processInstanceInfoForPagerDTO.setKeyField( processInstanceDTO.getKeyField() );\n        processInstanceInfoForPagerDTO.setKeyField2( processInstanceDTO.getKeyField2() );\n        processInstanceInfoForPagerDTO.setModifiedDate( processInstanceDTO.getModifiedDate() );\n        processInstanceInfoForPagerDTO.setParentInstanceNo( processInstanceDTO.getParentInstanceNo() );\n        processInstanceInfoForPagerDTO.setParentNodeInstanceNo( processInstanceDTO.getParentNodeInstanceNo() );\n        processInstanceInfoForPagerDTO.setProcessDefId( processInstanceDTO.getProcessDefId() );\n        processInstanceInfoForPagerDTO.setProcessType( processInstanceDTO.getProcessType() );\n        processInstanceInfoForPagerDTO.setProductCode( processInstanceDTO.getProductCode() );\n        processInstanceInfoForPagerDTO.setStartTime( processInstanceDTO.getStartTime() );\n        processInstanceInfoForPagerDTO.setStatus( processInstanceDTO.getStatus() );\n        processInstanceInfoForPagerDTO.setVars( processInstanceDTO.getVars() );\n\n        return processInstanceInfoForPagerDTO;\n    }\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/java/com/jd/easyflow/admin/process/adapter/page/converter/ProcessTaskConverter.java",
    "content": "package com.jd.easyflow.admin.process.adapter.page.converter;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport com.jd.easyflow.admin.process.adapter.page.dto.ProcessTaskInfoForPagerDTO;\nimport com.jd.easyflow.process.adapter.export.dto.task.ProcessTaskAssignDTO;\nimport com.jd.easyflow.process.adapter.export.dto.task.ProcessTaskDTO;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessTaskConverter {\n    \n    public static ProcessTaskConverter INSTANCE = new ProcessTaskConverter();\n\n\n    public List<ProcessTaskInfoForPagerDTO> convertPagerResult(List<ProcessTaskDTO> list) {\n        if ( list == null ) {\n            return null;\n        }\n\n        List<ProcessTaskInfoForPagerDTO> list1 = new ArrayList<ProcessTaskInfoForPagerDTO>( list.size() );\n        for ( ProcessTaskDTO processTaskDTO : list ) {\n            list1.add( processTaskDTOToProcessTaskInfoForPagerDTO( processTaskDTO ) );\n        }\n\n        return list1;\n    }\n\n    protected ProcessTaskInfoForPagerDTO processTaskDTOToProcessTaskInfoForPagerDTO(ProcessTaskDTO processTaskDTO) {\n        if ( processTaskDTO == null ) {\n            return null;\n        }\n\n        ProcessTaskInfoForPagerDTO processTaskInfoForPagerDTO = new ProcessTaskInfoForPagerDTO();\n\n        processTaskInfoForPagerDTO.setAssignInfo( processTaskDTO.getAssignInfo() );\n        List<ProcessTaskAssignDTO> list = processTaskDTO.getAssignList();\n        if ( list != null ) {\n            processTaskInfoForPagerDTO.setAssignList( new ArrayList<ProcessTaskAssignDTO>( list ) );\n        }\n        processTaskInfoForPagerDTO.setAssignTime( processTaskDTO.getAssignTime() );\n        processTaskInfoForPagerDTO.setAssignType( processTaskDTO.getAssignType() );\n        processTaskInfoForPagerDTO.setBizNo( processTaskDTO.getBizNo() );\n        processTaskInfoForPagerDTO.setCreatedDate( processTaskDTO.getCreatedDate() );\n        processTaskInfoForPagerDTO.setExecuteBizData( processTaskDTO.getExecuteBizData() );\n        processTaskInfoForPagerDTO.setExecuteBizResult( processTaskDTO.getExecuteBizResult() );\n        processTaskInfoForPagerDTO.setExecuteTime( processTaskDTO.getExecuteTime() );\n        processTaskInfoForPagerDTO.setExecutor( processTaskDTO.getExecutor() );\n        processTaskInfoForPagerDTO.setExtData( processTaskDTO.getExtData() );\n        processTaskInfoForPagerDTO.setModifiedDate( processTaskDTO.getModifiedDate() );\n        processTaskInfoForPagerDTO.setNodeExecutionNo( processTaskDTO.getNodeExecutionNo() );\n        processTaskInfoForPagerDTO.setNodeInstanceNo( processTaskDTO.getNodeInstanceNo() );\n        processTaskInfoForPagerDTO.setProcessInstanceNo( processTaskDTO.getProcessInstanceNo() );\n        processTaskInfoForPagerDTO.setProcessType( processTaskDTO.getProcessType() );\n        processTaskInfoForPagerDTO.setProductCode( processTaskDTO.getProductCode() );\n        processTaskInfoForPagerDTO.setStatus( processTaskDTO.getStatus() );\n        processTaskInfoForPagerDTO.setTaskBizCode( processTaskDTO.getTaskBizCode() );\n        processTaskInfoForPagerDTO.setTaskBizName( processTaskDTO.getTaskBizName() );\n        processTaskInfoForPagerDTO.setTaskNo( processTaskDTO.getTaskNo() );\n        processTaskInfoForPagerDTO.setTaskType( processTaskDTO.getTaskType() );\n\n        return processTaskInfoForPagerDTO;\n    }\n}\n\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/java/com/jd/easyflow/admin/process/adapter/page/dto/CommonTaskExecuteDTO.java",
    "content": "package com.jd.easyflow.admin.process.adapter.page.dto;\n\n/**\n * @author liyuliang5\n *\n */\npublic class CommonTaskExecuteDTO {\n\n    private String taskNo;\n    \n    private String executeBizResult;\n    \n    private String instanceBizData;\n    \n    private String executeBizData;\n    \n    private String assignUserList;\n    \n    private String operation;\n\n    private Integer version;\n    public String getTaskNo() {\n        return taskNo;\n    }\n    public void setTaskNo(String taskNo) {\n        this.taskNo = taskNo;\n    }\n    public String getExecuteBizResult() {\n        return executeBizResult;\n    }\n    public void setExecuteBizResult(String executeBizResult) {\n        this.executeBizResult = executeBizResult;\n    }\n    public String getInstanceBizData() {\n        return instanceBizData;\n    }\n    public void setInstanceBizData(String instanceBizData) {\n        this.instanceBizData = instanceBizData;\n    }\n    public String getExecuteBizData() {\n        return executeBizData;\n    }\n    public void setExecuteBizData(String executeBizData) {\n        this.executeBizData = executeBizData;\n    }\n    public String getAssignUserList() {\n        return assignUserList;\n    }\n    public void setAssignUserList(String assignUserList) {\n        this.assignUserList = assignUserList;\n    }\n    public String getOperation() {\n        return operation;\n    }\n    public void setOperation(String operation) {\n        this.operation = operation;\n    }\n    public Integer getVersion() {\n        return version;\n    }\n    public void setVersion(Integer version) {\n        this.version = version;\n    }\n    @Override\n    public String toString() {\n        return \"CommonTaskExecuteDTO [taskNo=\" + taskNo + \", executeBizResult=\" + executeBizResult\n                + \", instanceBizData=\" + instanceBizData + \", executeBizData=\" + executeBizData + \", assignUserList=\"\n                + assignUserList + \", operation=\" + operation + \", version=\" + version + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/java/com/jd/easyflow/admin/process/adapter/page/dto/CommonTaskProcessInstanceCreateDTO.java",
    "content": "package com.jd.easyflow.admin.process.adapter.page.dto;\n\n/**\n * @author liyuliang5\n *\n */\npublic class CommonTaskProcessInstanceCreateDTO {\n\n    private String processId;\n    private String instanceName;\n    private String productCode;\n    private String instanceBizData;\n    private String keyField;\n    private String keyField2;\n    private String taskData;\n    public String getProcessId() {\n        return processId;\n    }\n    public void setProcessId(String processId) {\n        this.processId = processId;\n    }\n    public String getInstanceName() {\n        return instanceName;\n    }\n    public void setInstanceName(String instanceName) {\n        this.instanceName = instanceName;\n    }\n    public String getProductCode() {\n        return productCode;\n    }\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n    public String getInstanceBizData() {\n        return instanceBizData;\n    }\n    public void setInstanceBizData(String instanceBizData) {\n        this.instanceBizData = instanceBizData;\n    }\n    public String getKeyField() {\n        return keyField;\n    }\n    public void setKeyField(String keyField) {\n        this.keyField = keyField;\n    }\n    public String getKeyField2() {\n        return keyField2;\n    }\n    public void setKeyField2(String keyField2) {\n        this.keyField2 = keyField2;\n    }\n    public String getTaskData() {\n        return taskData;\n    }\n    public void setTaskData(String taskData) {\n        this.taskData = taskData;\n    }\n    @Override\n    public String toString() {\n        return \"CommonTaskProcessInstanceCreateDTO [processId=\" + processId + \", instanceName=\" + instanceName\n                + \", productCode=\" + productCode + \", instanceBizData=\" + instanceBizData + \", keyField=\" + keyField\n                + \", keyField2=\" + keyField2 + \", taskData=\" + taskData + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/java/com/jd/easyflow/admin/process/adapter/page/dto/ProcessDefDTO.java",
    "content": "package com.jd.easyflow.admin.process.adapter.page.dto;\n\nimport java.util.Date;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessDefDTO {\n\n    private Long id;\n    \n    private String defId;\n\n    private Integer defVersion;\n    \n    private String defName;\n    \n    private String format;\n    \n    private String bpmnXmlData;\n    \n    private String jsonData;\n\n    private String bizType;\n\n    private String category;\n\n    private Boolean latest;\n\n    private String defSource;\n    \n    private Date createdDate;\n\n    private Date modifiedDate;\n\n    private String createdBy;\n\n    private String modifiedBy;\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getDefId() {\n        return defId;\n    }\n\n    public void setDefId(String defId) {\n        this.defId = defId;\n    }\n\n    public Integer getDefVersion() {\n        return defVersion;\n    }\n\n    public void setDefVersion(Integer defVersion) {\n        this.defVersion = defVersion;\n    }\n\n    public String getDefName() {\n        return defName;\n    }\n\n    public void setDefName(String defName) {\n        this.defName = defName;\n    }\n\n    public String getFormat() {\n        return format;\n    }\n\n    public void setFormat(String format) {\n        this.format = format;\n    }\n\n    public String getBpmnXmlData() {\n        return bpmnXmlData;\n    }\n\n    public void setBpmnXmlData(String bpmnXmlData) {\n        this.bpmnXmlData = bpmnXmlData;\n    }\n\n    public String getJsonData() {\n        return jsonData;\n    }\n\n    public void setJsonData(String jsonData) {\n        this.jsonData = jsonData;\n    }\n\n    public String getBizType() {\n        return bizType;\n    }\n\n    public void setBizType(String bizType) {\n        this.bizType = bizType;\n    }\n\n    public String getCategory() {\n        return category;\n    }\n\n    public void setCategory(String category) {\n        this.category = category;\n    }\n\n    public Boolean getLatest() {\n        return latest;\n    }\n\n    public void setLatest(Boolean latest) {\n        this.latest = latest;\n    }\n\n    public String getDefSource() {\n        return defSource;\n    }\n\n    public void setDefSource(String defSource) {\n        this.defSource = defSource;\n    }\n\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n\n    public String getCreatedBy() {\n        return createdBy;\n    }\n\n    public void setCreatedBy(String createdBy) {\n        this.createdBy = createdBy;\n    }\n\n    public String getModifiedBy() {\n        return modifiedBy;\n    }\n\n    public void setModifiedBy(String modifiedBy) {\n        this.modifiedBy = modifiedBy;\n    }\n\n    @Override\n    public String toString() {\n        return \"ProcessDefDTO [id=\" + id + \", defId=\" + defId + \", defVersion=\" + defVersion + \", defName=\" + defName\n                + \", format=\" + format + \", bpmnXmlData=\" + bpmnXmlData + \", jsonData=\" + jsonData + \", bizType=\"\n                + bizType + \", category=\" + category + \", latest=\" + latest + \", defSource=\" + defSource\n                + \", createdDate=\" + createdDate + \", modifiedDate=\" + modifiedDate + \", createdBy=\" + createdBy\n                + \", modifiedBy=\" + modifiedBy + \"]\";\n    }\n    \n    \n   \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/java/com/jd/easyflow/admin/process/adapter/page/dto/ProcessInstanceInfoForPagerDTO.java",
    "content": "package com.jd.easyflow.admin.process.adapter.page.dto;\n\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessInstanceDTO;\n\n/**\n * @author liyuliang5\n */\npublic class ProcessInstanceInfoForPagerDTO extends ProcessInstanceDTO {\n\n    \n    private boolean canCancel;\n\n    public boolean isCanCancel() {\n        return canCancel;\n    }\n\n    public void setCanCancel(boolean canCancel) {\n        this.canCancel = canCancel;\n    }\n\n    @Override\n    public String toString() {\n        return \"ProcessInstanceInfoForPagerDTO [canCancel=\" + canCancel + \", toString()=\" + super.toString() + \"]\";\n    }\n\n\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/java/com/jd/easyflow/admin/process/adapter/page/dto/ProcessTaskInfoForPagerDTO.java",
    "content": "package com.jd.easyflow.admin.process.adapter.page.dto;\n\nimport java.util.Date;\nimport java.util.List;\n\nimport com.jd.easyflow.process.adapter.export.dto.task.ProcessTaskAssignDTO;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessTaskInfoForPagerDTO {\n\n\n    private String taskNo;\n\n    private String processType;\n\n    private String bizNo;\n\n    private String taskBizCode;\n    \n    private String taskBizName;\n\n    private String taskType;\n\n    private String processInstanceNo;\n    \n    private String processInstanceCreator;\n\n    private String nodeInstanceNo;\n\n    private String nodeExecutionNo;\n\n    private String assignType;\n\n    private String assignInfo;\n\n    private Date assignTime;\n\n    private String executor;\n\n    private String executeBizResult;\n\n    private String executeBizData;\n\n    private Date executeTime;\n\n    private String productCode;\n\n    private String status;\n    \n    private String bizData;\n\n    private String extData;\n\n    private Date createdDate;\n\n    private Date modifiedDate;\n    \n    private String instanceName;\n    \n    private String instanceStatus;\n    \n    private String instanceCreator;\n    \n    private Date instanceCreatedDate;\n    \n    private String instanceKeyField;\n\n    private String instanceKeyField2;\n\n    private List<ProcessTaskAssignDTO> assignList;\n    \n    private boolean canHandle;\n    \n    private boolean canWithdraw;\n\n    public String getTaskNo() {\n        return taskNo;\n    }\n\n    public void setTaskNo(String taskNo) {\n        this.taskNo = taskNo;\n    }\n\n    public String getProcessType() {\n        return processType;\n    }\n\n    public void setProcessType(String processType) {\n        this.processType = processType;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    public String getTaskBizCode() {\n        return taskBizCode;\n    }\n\n    public void setTaskBizCode(String taskBizCode) {\n        this.taskBizCode = taskBizCode;\n    }\n\n    public String getTaskBizName() {\n        return taskBizName;\n    }\n\n    public void setTaskBizName(String taskBizName) {\n        this.taskBizName = taskBizName;\n    }\n\n    public String getTaskType() {\n        return taskType;\n    }\n\n    public void setTaskType(String taskType) {\n        this.taskType = taskType;\n    }\n\n    public String getProcessInstanceNo() {\n        return processInstanceNo;\n    }\n\n    public void setProcessInstanceNo(String processInstanceNo) {\n        this.processInstanceNo = processInstanceNo;\n    }\n\n    public String getProcessInstanceCreator() {\n        return processInstanceCreator;\n    }\n\n    public void setProcessInstanceCreator(String processInstanceCreator) {\n        this.processInstanceCreator = processInstanceCreator;\n    }\n\n    public String getNodeInstanceNo() {\n        return nodeInstanceNo;\n    }\n\n    public void setNodeInstanceNo(String nodeInstanceNo) {\n        this.nodeInstanceNo = nodeInstanceNo;\n    }\n\n    public String getNodeExecutionNo() {\n        return nodeExecutionNo;\n    }\n\n    public void setNodeExecutionNo(String nodeExecutionNo) {\n        this.nodeExecutionNo = nodeExecutionNo;\n    }\n\n    public String getAssignType() {\n        return assignType;\n    }\n\n    public void setAssignType(String assignType) {\n        this.assignType = assignType;\n    }\n\n    public String getAssignInfo() {\n        return assignInfo;\n    }\n\n    public void setAssignInfo(String assignInfo) {\n        this.assignInfo = assignInfo;\n    }\n\n    public Date getAssignTime() {\n        return assignTime;\n    }\n\n    public void setAssignTime(Date assignTime) {\n        this.assignTime = assignTime;\n    }\n\n    public String getExecutor() {\n        return executor;\n    }\n\n    public void setExecutor(String executor) {\n        this.executor = executor;\n    }\n\n    public String getExecuteBizResult() {\n        return executeBizResult;\n    }\n\n    public void setExecuteBizResult(String executeBizResult) {\n        this.executeBizResult = executeBizResult;\n    }\n\n    public String getExecuteBizData() {\n        return executeBizData;\n    }\n\n    public void setExecuteBizData(String executeBizData) {\n        this.executeBizData = executeBizData;\n    }\n\n    public Date getExecuteTime() {\n        return executeTime;\n    }\n\n    public void setExecuteTime(Date executeTime) {\n        this.executeTime = executeTime;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n\n    public String getStatus() {\n        return status;\n    }\n\n    public void setStatus(String status) {\n        this.status = status;\n    }\n\n    public String getBizData() {\n        return bizData;\n    }\n\n    public void setBizData(String bizData) {\n        this.bizData = bizData;\n    }\n\n    public String getExtData() {\n        return extData;\n    }\n\n    public void setExtData(String extData) {\n        this.extData = extData;\n    }\n\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n\n    public String getInstanceName() {\n        return instanceName;\n    }\n\n    public void setInstanceName(String instanceName) {\n        this.instanceName = instanceName;\n    }\n\n    public String getInstanceStatus() {\n        return instanceStatus;\n    }\n\n    public void setInstanceStatus(String instanceStatus) {\n        this.instanceStatus = instanceStatus;\n    }\n\n    public String getInstanceCreator() {\n        return instanceCreator;\n    }\n\n    public void setInstanceCreator(String instanceCreator) {\n        this.instanceCreator = instanceCreator;\n    }\n\n    public Date getInstanceCreatedDate() {\n        return instanceCreatedDate;\n    }\n\n    public void setInstanceCreatedDate(Date instanceCreatedDate) {\n        this.instanceCreatedDate = instanceCreatedDate;\n    }\n\n    public String getInstanceKeyField() {\n        return instanceKeyField;\n    }\n\n    public void setInstanceKeyField(String instanceKeyField) {\n        this.instanceKeyField = instanceKeyField;\n    }\n\n    public String getInstanceKeyField2() {\n        return instanceKeyField2;\n    }\n\n    public void setInstanceKeyField2(String instanceKeyField2) {\n        this.instanceKeyField2 = instanceKeyField2;\n    }\n\n    public List<ProcessTaskAssignDTO> getAssignList() {\n        return assignList;\n    }\n\n    public void setAssignList(List<ProcessTaskAssignDTO> assignList) {\n        this.assignList = assignList;\n    }\n\n    public boolean isCanHandle() {\n        return canHandle;\n    }\n\n    public void setCanHandle(boolean canHandle) {\n        this.canHandle = canHandle;\n    }\n\n    public boolean isCanWithdraw() {\n        return canWithdraw;\n    }\n\n    public void setCanWithdraw(boolean canWithdraw) {\n        this.canWithdraw = canWithdraw;\n    }\n\n    @Override\n    public String toString() {\n        return \"ProcessTaskInfoForPagerDTO [taskNo=\" + taskNo + \", processType=\" + processType + \", bizNo=\" + bizNo\n                + \", taskBizCode=\" + taskBizCode + \", taskBizName=\" + taskBizName + \", taskType=\" + taskType\n                + \", processInstanceNo=\" + processInstanceNo + \", processInstanceCreator=\" + processInstanceCreator\n                + \", nodeInstanceNo=\" + nodeInstanceNo + \", nodeExecutionNo=\" + nodeExecutionNo + \", assignType=\"\n                + assignType + \", assignInfo=\" + assignInfo + \", assignTime=\" + assignTime + \", executor=\" + executor\n                + \", executeBizResult=\" + executeBizResult + \", executeBizData=\" + executeBizData + \", executeTime=\"\n                + executeTime + \", productCode=\" + productCode + \", status=\" + status + \", bizData=\" + bizData\n                + \", extData=\" + extData + \", createdDate=\" + createdDate + \", modifiedDate=\" + modifiedDate\n                + \", instanceName=\" + instanceName + \", instanceStatus=\" + instanceStatus + \", instanceCreator=\"\n                + instanceCreator + \", instanceCreatedDate=\" + instanceCreatedDate + \", instanceKeyField=\"\n                + instanceKeyField + \", instanceKeyField2=\" + instanceKeyField2 + \", assignList=\" + assignList\n                + \", canHandle=\" + canHandle + \", canWithdraw=\" + canWithdraw + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/java/com/jd/easyflow/admin/process/adapter/page/extension/UserGroupAdminExtension.java",
    "content": "package com.jd.easyflow.admin.process.adapter.page.extension;\n\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic interface UserGroupAdminExtension {\n\n    String getCurrentUser(Map<String, Object> extData);\n\n    List<String> getUserGroupList(String user, Map<String, Object> extData);\n\n    List<String> getUserGroup2List(String user, Map<String, Object> extData);\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/java/com/jd/easyflow/admin/process/adapter/page/util/AdminProcessConstants.java",
    "content": "package com.jd.easyflow.admin.process.adapter.page.util;\n\n/**\n * @author liyuliang5\n *\n */\npublic class AdminProcessConstants {\n\n    public static final String ERROR_DATA = \"errorData\";\n    public static final String BIZ_RES_CODE = \"bizResCode\";\n    public static final String BIZ_RES_DESC = \"bizResDesc\";\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/java/com/jd/easyflow/admin/process/adapter/page/util/ClientErrorCode.java",
    "content": "package com.jd.easyflow.admin.process.adapter.page.util;\n\n/**\n * @author liyuliang5\n *\n */\npublic enum ClientErrorCode {\n\n    PTC_0101(\"Callback service error\");\n\n    private String desc;\n\n    ClientErrorCode(String desc) {\n        this.desc = desc;\n    }\n\n    public String getDesc() {\n        return desc;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/java/com/jd/easyflow/admin/processunit/adapter/page/ProcessUnitController.java",
    "content": "package com.jd.easyflow.admin.processunit.adapter.page;\n\nimport java.io.IOException;\nimport java.util.Arrays;\nimport java.util.List;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.Model;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.ResponseBody;\nimport org.springframework.web.context.request.NativeWebRequest;\nimport org.springframework.web.context.request.WebRequest;\n\nimport com.jd.easyflow.admin.processunit.adapter.page.converter.PagerConverter;\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponse;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponseCode;\nimport com.jd.easyflow.common.adapter.export.dto.pager.PagerResult;\nimport com.jd.easyflow.common.adapter.export.util.ExportResponseUtil;\nimport com.jd.easyflow.common.adapter.page.BasePageController;\nimport com.jd.easyflow.common.adapter.page.WebResponse;\nimport com.jd.easyflow.common.dto.pager.FieldEntry;\nimport com.jd.easyflow.common.dto.pager.PagerCondition;\nimport com.jd.easyflow.common.util.CommonErrorCode;\nimport com.jd.easyflow.objects.factory.ObjectFactorys;\nimport com.jd.easyflow.processunit.adapter.export.ProcessUnitExport;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitDTO;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitExecutionDTO;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitExecutionQueryReq;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitInstanceDTO;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitInstanceQueryReq;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitQueryReq;\nimport com.jd.easyflow.processunit.adapter.export.dto.ShardingInfoDTO;\nimport com.jd.easyflow.processunit.adapter.export.dto.ShardingInfoQueryReq;\n\n/**\n * \n * @author liyuliang5\n */\n@Controller\n@RequestMapping(\"easyflow/processUnit\")\npublic class ProcessUnitController extends BasePageController {\n\n    private static final Logger log = LoggerFactory.getLogger(ProcessUnitController.class);\n    \n    private static final String EXT_DATA_KEY_USING_SLAVE_DB = \"_usingSlaveDb\";\n    \n    private boolean pagerQueryUsingSlaveDb = true;\n\n    private ProcessUnitExport processUnitExport;\n\n    @RequestMapping(\"processUnitInstanceList\")\n    public String processUnitList(Model model) {\n        ExportResponse<List<ProcessUnitDTO>> response = getProcessUnitExport()\n                .queryProcessUnitList(new ExportRequest<ProcessUnitQueryReq>(new ProcessUnitQueryReq()));\n        List<ProcessUnitDTO> processUnitList = ExportResponseUtil.unwrap(response);\n        model.addAttribute(\"processUnitList\", processUnitList);\n        return \"easyflow/processunit/processUnitInstanceList\";\n    }\n\n    @RequestMapping(\"ajax/getProcessUnitInstanceListData\")\n    @ResponseBody\n    public WebResponse<PagerResult> getInstanceData(NativeWebRequest request) {\n        PagerCondition condition = getPagerCondition(request);\n        FieldEntry resultListField = condition.getField(\"resultList\");\n        if (resultListField != null && resultListField.getValue() instanceof String) {\n            resultListField.setValue(new String[] {(String) resultListField.getValue()});\n        }\n        return getInstanceData(condition);\n    }\n\n    protected WebResponse<PagerResult> getInstanceData(PagerCondition condition) {\n        FieldEntry queryTypeField = condition.getField(\"queryType\");\n        FieldEntry createdDateStartField = condition.getField(\"createdDateStart\");\n        FieldEntry createdDateEndField = condition.getField(\"createdDateEnd\");\n        condition.putExtData(EXT_DATA_KEY_USING_SLAVE_DB, pagerQueryUsingSlaveDb);\n        ExportResponse response = getProcessUnitExport()\n                .pagerQueryProcessUnitInstance(new ExportRequest(PagerConverter.INSTANCE.convert(condition)));\n        if (!ExportResponseCode.SUCCESS.getCode().equals(response.getResCode())) {\n            return WebResponse.buildResponse(response.getResCode(), response.getResDesc());\n        }\n        com.jd.easyflow.common.adapter.export.dto.pager.PagerResult pagerResult = (com.jd.easyflow.common.adapter.export.dto.pager.PagerResult) ExportResponseUtil\n                .unwrap(response);\n        return WebResponse.buildResponse(CommonErrorCode.E0000000.getCode(), CommonErrorCode.E0000000.getDesc(),\n                pagerResult);\n    }\n\n    @RequestMapping(\"processUnitInstanceDetail\")\n    public String instanceView(String instanceNo, String processUnitCode, String bizNo, Model model) {\n        ProcessUnitInstanceQueryReq req = new ProcessUnitInstanceQueryReq();\n        req.setProcessUnitCode(processUnitCode);\n        req.setBizNo(bizNo);\n        ExportResponse<ProcessUnitInstanceDTO> response = getProcessUnitExport()\n                .getByBizNoAndProcessUnitCode(new ExportRequest<ProcessUnitInstanceQueryReq>(req));\n        ProcessUnitInstanceDTO instance = ExportResponseUtil.unwrap(response);\n        model.addAttribute(\"detail\", instance);\n\n        \n        ShardingInfoQueryReq query = new ShardingInfoQueryReq();\n        query.setUnitCode(processUnitCode);\n        query.setBizNo(bizNo);\n        ExportResponse<ShardingInfoDTO> shardResponse = getProcessUnitExport().queryShardingInfo(new ExportRequest<ShardingInfoQueryReq>(query));\n        ShardingInfoDTO shardInfo = ExportResponseUtil.unwrap(shardResponse);\n        model.addAttribute(\"shardInfo\", shardInfo);\n\n        return \"easyflow/processunit/processUnitInstanceDetail\";\n    }\n\n    @RequestMapping(\"processUnitExecutionList\")\n    public String processUnitExecutionList(Model model) {\n        ExportResponse<List<ProcessUnitDTO>> response = getProcessUnitExport()\n                .queryProcessUnitList(new ExportRequest<ProcessUnitQueryReq>(new ProcessUnitQueryReq()));\n        List<ProcessUnitDTO> processUnitList = ExportResponseUtil.unwrap(response);\n        model.addAttribute(\"processUnitList\", processUnitList);\n        return \"easyflow/processunit/processUnitExecutionList\";\n    }\n\n    @RequestMapping(\"ajax/getProcessUnitExecutionListData\")\n    @ResponseBody\n    public WebResponse<PagerResult> getExecutionData(NativeWebRequest request) {\n        PagerCondition condition = getPagerCondition(request);\n        FieldEntry resultListField = condition.getField(\"resultList\");\n        if (resultListField != null && resultListField.getValue() instanceof String) {\n            resultListField.setValue(new String[] {(String) resultListField.getValue()});\n        }\n        return getExecutionData(condition);\n    }\n\n    protected WebResponse<PagerResult> getExecutionData(PagerCondition condition) {\n        condition.putExtData(EXT_DATA_KEY_USING_SLAVE_DB, pagerQueryUsingSlaveDb);\n        ExportResponse response = getProcessUnitExport()\n                .pagerQueryProcessUnitExecution(new ExportRequest(PagerConverter.INSTANCE.convert(condition)));\n        if (!ExportResponseCode.SUCCESS.getCode().equals(response.getResCode())) {\n            return WebResponse.buildResponse(response.getResCode(), response.getResDesc());\n        }\n        com.jd.easyflow.common.adapter.export.dto.pager.PagerResult pagerResult = (com.jd.easyflow.common.adapter.export.dto.pager.PagerResult) ExportResponseUtil\n                .unwrap(response);        \n        return WebResponse.buildResponse(CommonErrorCode.E0000000.getCode(), CommonErrorCode.E0000000.getDesc(),\n                pagerResult);\n    }\n\n    @RequestMapping(\"processUnitExecutionDetail\")\n    public String executionView(String executionNo, String processUnitCode, String bizNo, Model model) {\n        ProcessUnitExecutionQueryReq req = new ProcessUnitExecutionQueryReq();\n        req.setProcessUnitCode(processUnitCode);\n        req.setBizNo(bizNo);\n        req.setExecutionNo(executionNo);\n        ExportResponse<ProcessUnitExecutionDTO> response = getProcessUnitExport()\n                .getExecutionByExecutionNo(new ExportRequest<ProcessUnitExecutionQueryReq>(req));\n        ProcessUnitExecutionDTO execution = ExportResponseUtil.unwrap(response);\n        model.addAttribute(\"detail\", execution);\n        return \"easyflow/processunit/processUnitExecutionDetail\";\n    }\n\n    protected ProcessUnitExport getProcessUnitExport() {\n        if (processUnitExport == null) {\n            processUnitExport = ObjectFactorys.getDefault().getObject(ProcessUnitExport.class);\n        }\n        return processUnitExport;\n    }\n\n    public boolean isPagerQueryUsingSlaveDb() {\n        return pagerQueryUsingSlaveDb;\n    }\n\n    public void setPagerQueryUsingSlaveDb(boolean pagerQueryUsingSlaveDb) {\n        this.pagerQueryUsingSlaveDb = pagerQueryUsingSlaveDb;\n    }\n\n    public void setProcessUnitExport(ProcessUnitExport processUnitExport) {\n        this.processUnitExport = processUnitExport;\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/java/com/jd/easyflow/admin/processunit/adapter/page/converter/PagerConverter.java",
    "content": "package com.jd.easyflow.admin.processunit.adapter.page.converter;\n\n\nimport com.jd.easyflow.common.adapter.export.dto.pager.FieldEntry;\nimport com.jd.easyflow.common.adapter.export.dto.pager.SortEntry;\nimport com.jd.easyflow.common.dto.pager.PagerCondition;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * @author liyuliang5\n *\n */\npublic class PagerConverter {\n    \n    public static PagerConverter INSTANCE = new PagerConverter();\n\n    public com.jd.easyflow.common.adapter.export.dto.pager.PagerCondition convert(PagerCondition condition) {\n        if ( condition == null ) {\n            return null;\n        }\n\n        com.jd.easyflow.common.adapter.export.dto.pager.PagerCondition pagerCondition = new com.jd.easyflow.common.adapter.export.dto.pager.PagerCondition();\n\n        pagerCondition.setCount( condition.isCount() );\n        Map<String, Object> map = condition.getExtData();\n        if ( map != null ) {\n            pagerCondition.setExtData( new HashMap<String, Object>( map ) );\n        }\n        pagerCondition.setFieldList( fieldEntryListToFieldEntryList( condition.getFieldList() ) );\n        pagerCondition.setPage( condition.getPage() );\n        pagerCondition.setPageIndex( condition.getPageIndex() );\n        pagerCondition.setPageSize( condition.getPageSize() );\n        pagerCondition.setSortList( sortEntryListToSortEntryList( condition.getSortList() ) );\n        pagerCondition.setStart( condition.getStart() );\n        if ( pagerCondition.getFieldMap() != null ) {\n            Map<String, FieldEntry> map1 = stringFieldEntryMapToStringFieldEntryMap( condition.getFieldMap() );\n            if ( map1 != null ) {\n                pagerCondition.getFieldMap().putAll( map1 );\n            }\n        }\n        if ( pagerCondition.getSortMap() != null ) {\n            Map<String, SortEntry> map2 = stringSortEntryMapToStringSortEntryMap( condition.getSortMap() );\n            if ( map2 != null ) {\n                pagerCondition.getSortMap().putAll( map2 );\n            }\n        }\n\n        return pagerCondition;\n    }\n\n    protected FieldEntry fieldEntryToFieldEntry(com.jd.easyflow.common.dto.pager.FieldEntry fieldEntry) {\n        if ( fieldEntry == null ) {\n            return null;\n        }\n\n        FieldEntry fieldEntry1 = new FieldEntry();\n\n        fieldEntry1.setName( fieldEntry.getName() );\n        fieldEntry1.setValue( fieldEntry.getValue() );\n\n        return fieldEntry1;\n    }\n\n    protected List<FieldEntry> fieldEntryListToFieldEntryList(List<com.jd.easyflow.common.dto.pager.FieldEntry> list) {\n        if ( list == null ) {\n            return null;\n        }\n\n        List<FieldEntry> list1 = new ArrayList<FieldEntry>( list.size() );\n        for ( com.jd.easyflow.common.dto.pager.FieldEntry fieldEntry : list ) {\n            list1.add( fieldEntryToFieldEntry( fieldEntry ) );\n        }\n\n        return list1;\n    }\n\n    protected SortEntry sortEntryToSortEntry(com.jd.easyflow.common.dto.pager.SortEntry sortEntry) {\n        if ( sortEntry == null ) {\n            return null;\n        }\n\n        SortEntry sortEntry1 = new SortEntry();\n\n        sortEntry1.setKey( sortEntry.getKey() );\n        sortEntry1.setSeq( sortEntry.getSeq() );\n        sortEntry1.setType( sortEntry.getType() );\n\n        return sortEntry1;\n    }\n\n    protected List<SortEntry> sortEntryListToSortEntryList(List<com.jd.easyflow.common.dto.pager.SortEntry> list) {\n        if ( list == null ) {\n            return null;\n        }\n\n        List<SortEntry> list1 = new ArrayList<SortEntry>( list.size() );\n        for ( com.jd.easyflow.common.dto.pager.SortEntry sortEntry : list ) {\n            list1.add( sortEntryToSortEntry( sortEntry ) );\n        }\n\n        return list1;\n    }\n\n    protected Map<String, FieldEntry> stringFieldEntryMapToStringFieldEntryMap(Map<String, com.jd.easyflow.common.dto.pager.FieldEntry> map) {\n        if ( map == null ) {\n            return null;\n        }\n\n        Map<String, FieldEntry> map1 = new HashMap<String, FieldEntry>( Math.max( (int) ( map.size() / .75f ) + 1, 16 ) );\n\n        for ( java.util.Map.Entry<String, com.jd.easyflow.common.dto.pager.FieldEntry> entry : map.entrySet() ) {\n            String key = entry.getKey();\n            FieldEntry value = fieldEntryToFieldEntry( entry.getValue() );\n            map1.put( key, value );\n        }\n\n        return map1;\n    }\n\n    protected Map<String, SortEntry> stringSortEntryMapToStringSortEntryMap(Map<String, com.jd.easyflow.common.dto.pager.SortEntry> map) {\n        if ( map == null ) {\n            return null;\n        }\n\n        Map<String, SortEntry> map1 = new HashMap<String, SortEntry>( Math.max( (int) ( map.size() / .75f ) + 1, 16 ) );\n\n        for ( java.util.Map.Entry<String, com.jd.easyflow.common.dto.pager.SortEntry> entry : map.entrySet() ) {\n            String key = entry.getKey();\n            SortEntry value = sortEntryToSortEntry( entry.getValue() );\n            map1.put( key, value );\n        }\n\n        return map1;\n    }\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/java/com/jd/easyflow/common/adapter/page/BasePageController.java",
    "content": "package com.jd.easyflow.common.adapter.page;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.Iterator;\nimport java.util.List;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.propertyeditors.StringTrimmerEditor;\nimport org.springframework.web.bind.WebDataBinder;\nimport org.springframework.web.bind.annotation.InitBinder;\nimport org.springframework.web.context.request.NativeWebRequest;\n\nimport com.jd.easyflow.common.dto.pager.FieldEntry;\nimport com.jd.easyflow.common.dto.pager.PagerCondition;\nimport com.jd.easyflow.common.dto.pager.PagerConditionHelper;\n\n/**\n * @author liyuliang5\n *\n */\npublic class BasePageController {\n\n    protected Logger logger = LoggerFactory.getLogger(this.getClass());\n\n    public static final int MAX_PAGE_SIZE = 1000;\n\n    private static final String SORT_KEY = \"sortName\";\n    private static final String ORDER_KEY = \"sortOrder\";\n    private static final String PAGE_SIZE_KEY = \"pageSize\";\n    private static final String PAGE_NUMBER_KEY = \"pageNumber\";\n\n    @InitBinder\n    public void initBinder(WebDataBinder binder) {\n        binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));\n    }\n    \n\n    protected PagerCondition getPagerCondition(NativeWebRequest request) {\n        PagerCondition condition = new PagerCondition();\n        Iterator<String> names = request.getParameterNames();\n        while (names.hasNext()) {\n            String name = names.next();\n            if (condition.getPageIndex() == -1 && PAGE_NUMBER_KEY.equals(name)) {\n                condition.setPageIndex(Integer.parseInt(request.getParameter(PAGE_NUMBER_KEY)));\n                continue;\n            }\n\n            if (condition.getPageSize() == -1 && PAGE_SIZE_KEY.equals(name)) {\n                int pageSize = Integer.parseInt(request.getParameter(PAGE_SIZE_KEY));\n                if (pageSize > MAX_PAGE_SIZE) {\n                    pageSize = MAX_PAGE_SIZE;\n                }\n                condition.setPageSize(pageSize);\n                continue;\n            }\n\n            if (\"_\".equals(name) || ORDER_KEY.equals(name)) {\n                continue;\n            }\n            if (SORT_KEY.equals(name)) {\n                String value = request.getParameter(name);\n                String order = request.getParameter(ORDER_KEY);\n                if (\"desc\".equals(order) || \"asc\".equals(order)) {\n                    condition.addSortField(value, 1, order);\n                }\n                continue;\n\n            }\n            String[] values = request.getParameterValues(name);\n            if (values.length == 1) {\n                if (values[0] != null && values[0].length() > 0) {\n                    condition.addField(new FieldEntry(name, values[0].trim()));\n                }\n            } else if (values.length > 1) {\n                List<String> valueList = new ArrayList<>();\n                for (String val : values) {\n                    if (val != null && val.length() > 0) {\n                        valueList.add(val.trim());\n                    }\n                }\n                if (valueList.size() > 0) {\n                    values = values.length == valueList.size() ? values : valueList.toArray(new String[] {});\n                    condition.addField(new FieldEntry(name, values));\n                }\n            }\n        }\n        if (condition.getSortList() != null) {\n            Collections.sort(condition.getSortList());\n            Collections.reverse(condition.getSortList());\n        }\n        return condition;\n    }\n\n    /**\n     * \n     * @param condition\n     */\n    protected void checkPageParams(PagerCondition condition) {\n        if (condition.getPageIndex() < 0L) {\n            condition.setPageIndex(1L);\n        }\n        if (condition.getPageSize() < 0) {\n            condition.setPageSize(20);\n        }\n        FieldEntry createdDateEnd = condition.getField(\"createdDateEnd\");\n        if (createdDateEnd != null) {\n            createdDateEnd.setValue(createdDateEnd.getValue() + \" 23:59:59\");\n        }\n        FieldEntry endDate = condition.getField(\"endDate\");\n        if (endDate != null) {\n            endDate.setValue(endDate.getValue() + \" 23:59:59\");\n        }\n        FieldEntry modifiedDateEnd = condition.getField(\"modifiedDateEnd\");\n        if (modifiedDateEnd != null) {\n            modifiedDateEnd.setValue(modifiedDateEnd.getValue() + \" 23:59:59\");\n        }\n        FieldEntry checkDateEnd = condition.getField(\"checkDateEnd\");\n        if (checkDateEnd != null) {\n            checkDateEnd.setValue(checkDateEnd.getValue() + \" 23:59:59\");\n        }\n        PagerConditionHelper.setValueType(condition, \"productCodeList\", List.class);\n    }\n    \n    protected String getRootPath() {\n        return \"\";\n    }\n    \n}\n\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/java/com/jd/easyflow/common/adapter/page/WebResponse.java",
    "content": "package com.jd.easyflow.common.adapter.page;\n\n/**\n* \n* @author liyuliang5\n*/\npublic class WebResponse<T> {\n\n    private String resultCode;\n\n    private String resultMsg;\n\n    private T resultData;\n\n    private Object extData;\n\n    public WebResponse() {\n    }\n    \n    public WebResponse(String resultCode, String resultMsg) {\n        this.resultCode = resultCode;\n        this.resultMsg = resultMsg;\n    }\n\n\n    public WebResponse(String resultCode, String resultMsg,T resultData) {\n        this.resultCode = resultCode;\n        this.resultMsg = resultMsg;\n        this.resultData = resultData;\n    }\n\n\n    public static <T> WebResponse<T> buildResponse(String resultCode, String resultMsg, T resultData){\n        return new WebResponse(resultCode,resultMsg,resultData);\n    }\n\n\n    public static <T> WebResponse buildResponse(String resultCode, String resultMsg){\n        return new WebResponse(resultCode,resultMsg);\n    }\n\n    public String getResultCode() {\n        return resultCode;\n    }\n\n    public void setResultCode(String resultCode) {\n        this.resultCode = resultCode;\n    }\n\n    public String getResultMsg() {\n        return resultMsg;\n    }\n\n    public void setResultMsg(String resultMsg) {\n        this.resultMsg = resultMsg;\n    }\n\n    public T getResultData() {\n        return resultData;\n    }\n\n    public void setResultData(T resultData) {\n        this.resultData = resultData;\n    }\n\n    public Object getExtData() {\n        return extData;\n    }\n\n    public void setExtData(Object extData) {\n        this.extData = extData;\n    }\n\n    @Override\n    public String toString() {\n        return \"WebResponse [resultCode=\" + resultCode + \", resultMsg=\" + resultMsg + \", resultData=\" + resultData\n                + \", extData=\" + extData + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/java/com/jd/easyflow/common/adapter/page/WebResponseCode.java",
    "content": "package com.jd.easyflow.common.adapter.page;\n\n/**\n * @author liyuliang5\n *\n */\npublic enum WebResponseCode {\n\n\n    SUCCESS(\"0000000\",\"Success\"),\n\n    FAIL(\"0000001\",\"Fail\"),\n\n    DATA_EMPTY(\"0000004\",\"Data empty\"),\n\n    FIELD_EMPTY(\"0000005\",\"Field empty\"),\n\n    INVALID(\"0000002\",\"Validate not pass\"),\n\n    EXCEPTION(\"9999999\",\"System exception\"),\n            ;\n\n    private String code;\n\n    private String desc;\n\n    WebResponseCode(String code, String desc) {\n        this.code = code;\n        this.desc = desc;\n    }\n\n    public String getCode() {\n        return code;\n    }\n\n    public String getDesc() {\n        return desc;\n    }\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/easyflow/messages/easyflow-admin-framework.properties",
    "content": "easyflow.admin.framework.page.layout.adminPortal=JDEasyFlow Portal\neasyflow.admin.framework.page.layout.home=Home\neasyflow.admin.framework.page.layout.menu.processAndTask=Process\neasyflow.admin.framework.page.layout.menu.processInstance=Process Instance\neasyflow.admin.framework.page.layout.menu.processTask=Process Task\neasyflow.admin.framework.page.layout.menu.processUnit=Process Unit\neasyflow.admin.framework.page.layout.menu.processUnitInstance=Process Unit Instance\neasyflow.admin.framework.page.layout.menu.processUnitExecution=Process Unit Execution\neasyflow.admin.framework.page.layout.menu.system=System\neasyflow.admin.framework.page.layout.menu.processDefinition=Process Definition\neasyflow.admin.framework.page.layout.menu.formTemplate=Form Template"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/easyflow/messages/easyflow-admin-framework_zh.properties",
    "content": "easyflow.admin.framework.page.layout.adminPortal=JDEasyFlow管理后台\neasyflow.admin.framework.page.layout.home=首页\neasyflow.admin.framework.page.layout.menu.processAndTask=流程任务\neasyflow.admin.framework.page.layout.menu.processInstance=流程管理\neasyflow.admin.framework.page.layout.menu.processTask=任务待办\neasyflow.admin.framework.page.layout.menu.processUnit=事务管理器\neasyflow.admin.framework.page.layout.menu.processUnitInstance=处理单元实例管理\neasyflow.admin.framework.page.layout.menu.processUnitExecution=实例执行明细管理\neasyflow.admin.framework.page.layout.menu.system=系统运营管控\neasyflow.admin.framework.page.layout.menu.processDefinition=流程定义管理\neasyflow.admin.framework.page.layout.menu.formTemplate=表单模板管理"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/easyflow/messages/easyflow-form-admin.properties",
    "content": "easyflow.form.admin.page.formTemplateList.formTemplate=Form template\neasyflow.form.admin.page.formTemplateList.templateCode=Template code\neasyflow.form.admin.page.formTemplateList.query=Query\neasyflow.form.admin.page.formTemplateList.reset=Reset\neasyflow.form.admin.page.formTemplateList.add=Add\neasyflow.form.admin.page.formTemplateList.formTemplateList=Form template list\neasyflow.form.admin.page.formTemplateList.templateCode=Template code\neasyflow.form.admin.page.formTemplateList.templateName=Template name\neasyflow.form.admin.page.formTemplateList.state=Status\neasyflow.form.admin.page.formTemplateList.valid=Valid\neasyflow.form.admin.page.formTemplateList.invalid=Invalid\neasyflow.form.admin.page.formTemplateList.createdDate=Created date\neasyflow.form.admin.page.formTemplateList.modifiedDate=Modified date\neasyflow.form.admin.page.formTemplateList.op=Operation\neasyflow.form.admin.page.formTemplateList.edit=Edit\n\neasyflow.form.admin.page.formTemplateAdd.formTemplateAdd=Form template add\neasyflow.form.admin.page.formTemplateAdd.formTemplateDef=Form template define\neasyflow.form.admin.page.formTemplateAdd.formTemplatePreview=Form template preview\neasyflow.form.admin.page.formTemplateAdd.templateCode=Template code\neasyflow.form.admin.page.formTemplateAdd.templateName=Template name\neasyflow.form.admin.page.formTemplateAdd.status=Status\neasyflow.form.admin.page.formTemplateAdd.valid=Valid\neasyflow.form.admin.page.formTemplateAdd.invalid=Invalid\neasyflow.form.admin.page.formTemplateAdd.templateConfigForDeveloper=Template configure for developer\neasyflow.form.admin.page.formTemplateAdd.viewJsonConfig=View JSON config\neasyflow.form.admin.page.formTemplateAdd.save=Save\neasyflow.form.admin.page.formTemplateAdd.cancel=Cancel\neasyflow.form.admin.page.formTemplateAdd.viewConfig=View configuration\neasyflow.form.admin.page.formTemplateAdd.jsonRender=JSON render\neasyflow.form.admin.page.formTemplateAdd.save=Save\neasyflow.form.admin.page.formTemplateAdd.close=Close\neasyflow.form.admin.page.formTemplateAdd.inputDataToRender=Input data to render(JSON format, optional)\neasyflow.form.admin.page.formTemplateAdd.addPreview=Add preview\neasyflow.form.admin.page.formTemplateAdd.editPreview=Edit preview\neasyflow.form.admin.page.formTemplateAdd.viewPreview=View preview\neasyflow.form.admin.page.formTemplateAdd.addTab=Add tab\neasyflow.form.admin.page.formTemplateAdd.addPanel=Add panel\neasyflow.form.admin.page.formTemplateAdd.addCard=Add card\neasyflow.form.admin.page.formTemplateAdd.addItem=Add item\n\neasyflow.form.admin.page.formTemplateEdit.formTemplateEdit=Form template edit\neasyflow.form.admin.page.formTemplateEdit.formTemplateDef=Form template define\neasyflow.form.admin.page.formTemplateEdit.formTemplatePreview=Form template preview\neasyflow.form.admin.page.formTemplateEdit.templateCode=Template code\neasyflow.form.admin.page.formTemplateEdit.templateName=Template name\neasyflow.form.admin.page.formTemplateEdit.type=Type\neasyflow.form.admin.page.formTemplateEdit.status=Status\neasyflow.form.admin.page.formTemplateEdit.valid=Valid\neasyflow.form.admin.page.formTemplateEdit.invalid=Invalid\neasyflow.form.admin.page.formTemplateEdit.templateConfigForDeveloper=Template configure for developer\neasyflow.form.admin.page.formTemplateEdit.viewJsonConfig=View JSON configuration\neasyflow.form.admin.page.formTemplateEdit.save=Save\neasyflow.form.admin.page.formTemplateEdit.cancel=Cancel\neasyflow.form.admin.page.formTemplateEdit.viewConfig=View configuration\neasyflow.form.admin.page.formTemplateEdit.jsonRender=JSON render\neasyflow.form.admin.page.formTemplateEdit.save=Save\neasyflow.form.admin.page.formTemplateEdit.close=Close\neasyflow.form.admin.page.formTemplateEdit.inputDataToRender=Input data to render(JSON format, optional)\neasyflow.form.admin.page.formTemplateEdit.addPreview=Add preview\neasyflow.form.admin.page.formTemplateEdit.editPreview=Edit preview\neasyflow.form.admin.page.formTemplateEdit.viewPreview=View preview\neasyflow.form.admin.page.formTemplateEdit.addTab=Add tab\neasyflow.form.admin.page.formTemplateEdit.addPanel=Add panel\neasyflow.form.admin.page.formTemplateEdit.addCard=Add card\neasyflow.form.admin.page.formTemplateEdit.addItem=Add item\n\neasyflow.form.admin.page.formTemplateDetail.formTemplateDetail=Form template detail\neasyflow.form.admin.page.formTemplateDetail.formTemplateDef=Form template define\neasyflow.form.admin.page.formTemplateDetail.formTemplatePreview=Form template preview\neasyflow.form.admin.page.formTemplateDetail.templateCode=Template code\neasyflow.form.admin.page.formTemplateDetail.templateName=Template name\neasyflow.form.admin.page.formTemplateDetail.status=Status\neasyflow.form.admin.page.formTemplateDetail.valid=Valid\neasyflow.form.admin.page.formTemplateDetail.invalid=Invalid\neasyflow.form.admin.page.formTemplateDetail.templateConfigForDeveloper=Template configure for developer\neasyflow.form.admin.page.formTemplateDetail.viewJsonConfig=View JSON configuration\neasyflow.form.admin.page.formTemplateDetail.cancel=Cancel\neasyflow.form.admin.page.formTemplateDetail.viewConfig=View configuration\neasyflow.form.admin.page.formTemplateDetail.close=Close\neasyflow.form.admin.page.formTemplateDetail.inputDataToRender=Input data to render(JSON format, optional)\neasyflow.form.admin.page.formTemplateDetail.addPreview=Add preview\neasyflow.form.admin.page.formTemplateDetail.editPreview=Edit preview\neasyflow.form.admin.page.formTemplateDetail.viewPreview=View preview\neasyflow.form.admin.page.formTemplateDetail.addTab=Add tab\neasyflow.form.admin.page.formTemplateDetail.addPanel=Add panel\neasyflow.form.admin.page.formTemplateDetail.addCard=Add card\neasyflow.form.admin.page.formTemplateDetail.addItem=Add item"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/easyflow/messages/easyflow-form-admin_zh.properties",
    "content": "easyflow.form.admin.page.formTemplateList.formTemplate=表单模板管理\neasyflow.form.admin.page.formTemplateList.templateCode=表单模板编码\neasyflow.form.admin.page.formTemplateList.query=查询\neasyflow.form.admin.page.formTemplateList.reset=重置\neasyflow.form.admin.page.formTemplateList.add=增加\neasyflow.form.admin.page.formTemplateList.formTemplateList=表单模板列表\neasyflow.form.admin.page.formTemplateList.templateCode=模板编码\neasyflow.form.admin.page.formTemplateList.templateName=模板名称\neasyflow.form.admin.page.formTemplateList.state=状态\neasyflow.form.admin.page.formTemplateList.valid=有效\neasyflow.form.admin.page.formTemplateList.invalid=无效\neasyflow.form.admin.page.formTemplateList.createdDate=创建时间\neasyflow.form.admin.page.formTemplateList.modifiedDate=更新时间\neasyflow.form.admin.page.formTemplateList.op=操作\neasyflow.form.admin.page.formTemplateList.edit=编辑\n\neasyflow.form.admin.page.formTemplateAdd.formTemplateAdd=表单模板新增\neasyflow.form.admin.page.formTemplateAdd.formTemplateDef=表单模版定义\neasyflow.form.admin.page.formTemplateAdd.formTemplatePreview=表单模版效果\neasyflow.form.admin.page.formTemplateAdd.templateCode=模板编码\neasyflow.form.admin.page.formTemplateAdd.templateName=模板名称\neasyflow.form.admin.page.formTemplateAdd.status=有效标识\neasyflow.form.admin.page.formTemplateAdd.valid=有效\neasyflow.form.admin.page.formTemplateAdd.invalid=无效\neasyflow.form.admin.page.formTemplateAdd.templateConfigForDeveloper=模板配置(研发)\neasyflow.form.admin.page.formTemplateAdd.viewJsonConfig=查看JSON配置\neasyflow.form.admin.page.formTemplateAdd.save=保存\neasyflow.form.admin.page.formTemplateAdd.cancel=取消\neasyflow.form.admin.page.formTemplateAdd.viewConfig=查看配置\neasyflow.form.admin.page.formTemplateAdd.jsonRender=JSON渲染\neasyflow.form.admin.page.formTemplateAdd.save=保存\neasyflow.form.admin.page.formTemplateAdd.close=关闭\neasyflow.form.admin.page.formTemplateAdd.inputDataToRender=请输入渲染的数据(JSON格式，可选)\neasyflow.form.admin.page.formTemplateAdd.addPreview=新增效果\neasyflow.form.admin.page.formTemplateAdd.editPreview=修改效果\neasyflow.form.admin.page.formTemplateAdd.viewPreview=查看效果\neasyflow.form.admin.page.formTemplateAdd.addTab=新增选项卡\neasyflow.form.admin.page.formTemplateAdd.addPanel=新增面板\neasyflow.form.admin.page.formTemplateAdd.addCard=新增卡片\neasyflow.form.admin.page.formTemplateAdd.addItem=新增配置项\n\neasyflow.form.admin.page.formTemplateEdit.formTemplateEdit=表单模板修改\neasyflow.form.admin.page.formTemplateEdit.formTemplateDef=表单模版定义\neasyflow.form.admin.page.formTemplateEdit.formTemplatePreview=表单模版效果\neasyflow.form.admin.page.formTemplateEdit.templateCode=模板编码\neasyflow.form.admin.page.formTemplateEdit.templateName=模板名称\neasyflow.form.admin.page.formTemplateEdit.type=类型\neasyflow.form.admin.page.formTemplateEdit.status=有效标识\neasyflow.form.admin.page.formTemplateEdit.valid=有效\neasyflow.form.admin.page.formTemplateEdit.invalid=无效\neasyflow.form.admin.page.formTemplateEdit.templateConfigForDeveloper=模板配置(研发)\neasyflow.form.admin.page.formTemplateEdit.viewJsonConfig=查看JSON配置\neasyflow.form.admin.page.formTemplateEdit.save=保存\neasyflow.form.admin.page.formTemplateEdit.cancel=取消\neasyflow.form.admin.page.formTemplateEdit.viewConfig=查看配置\neasyflow.form.admin.page.formTemplateEdit.jsonRender=JSON渲染\neasyflow.form.admin.page.formTemplateEdit.save=保存\neasyflow.form.admin.page.formTemplateEdit.close=关闭\neasyflow.form.admin.page.formTemplateEdit.inputDataToRender=请输入渲染的数据(JSON格式，可选)\neasyflow.form.admin.page.formTemplateEdit.addPreview=新增效果\neasyflow.form.admin.page.formTemplateEdit.editPreview=修改效果\neasyflow.form.admin.page.formTemplateEdit.viewPreview=查看效果\neasyflow.form.admin.page.formTemplateEdit.addTab=新增选项卡\neasyflow.form.admin.page.formTemplateEdit.addPanel=新增面板\neasyflow.form.admin.page.formTemplateEdit.addCard=新增卡片\neasyflow.form.admin.page.formTemplateEdit.addItem=新增配置项\n\neasyflow.form.admin.page.formTemplateDetail.formTemplateDetail=表单模板详情\neasyflow.form.admin.page.formTemplateDetail.formTemplateDef=表单模版定义\neasyflow.form.admin.page.formTemplateDetail.formTemplatePreview=表单模版效果\neasyflow.form.admin.page.formTemplateDetail.templateCode=模板编码\neasyflow.form.admin.page.formTemplateDetail.templateName=模板名称\neasyflow.form.admin.page.formTemplateDetail.status=有效标识\neasyflow.form.admin.page.formTemplateDetail.valid=有效\neasyflow.form.admin.page.formTemplateDetail.invalid=无效\neasyflow.form.admin.page.formTemplateDetail.templateConfigForDeveloper=模板配置(研发)\neasyflow.form.admin.page.formTemplateDetail.viewJsonConfig=查看JSON配置\neasyflow.form.admin.page.formTemplateDetail.cancel=取消\neasyflow.form.admin.page.formTemplateDetail.viewConfig=查看配置\neasyflow.form.admin.page.formTemplateDetail.close=关闭\neasyflow.form.admin.page.formTemplateDetail.inputDataToRender=请输入渲染的数据(JSON格式，可选)\neasyflow.form.admin.page.formTemplateDetail.addPreview=新增效果\neasyflow.form.admin.page.formTemplateDetail.editPreview=修改效果\neasyflow.form.admin.page.formTemplateDetail.viewPreview=查看效果\neasyflow.form.admin.page.formTemplateDetail.addTab=新增选项卡\neasyflow.form.admin.page.formTemplateDetail.addPanel=新增面板\neasyflow.form.admin.page.formTemplateDetail.addCard=新增卡片\neasyflow.form.admin.page.formTemplateDetail.addItem=新增配置项"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/easyflow/messages/easyflow-process-admin.properties",
    "content": "easyflow.process.admin.tip.handleDisable=Handle setting of this flow is disabled\neasyflow.process.admin.tip.flowChange = Task info is changed, refresh page and retry\neasyflow.process.admin.user=User\neasyflow.process.admin.group=Group\neasyflow.process.admin.group2=Group2\neasyflow.process.admin.processDefinitionAdd=Process definition add\n\neasyflow.process.admin.page.commonProcessTaskPassReject.taskHandle=Task handle\neasyflow.process.admin.page.commonProcessTaskPassReject.processInfo=Process info\neasyflow.process.admin.page.commonProcessTaskPassReject.processLink=Process link\neasyflow.process.admin.page.commonProcessTaskPassReject.processKeyField=Process key field\neasyflow.process.admin.page.commonProcessTaskPassReject.addHandleUser=Add handle user\neasyflow.process.admin.page.commonProcessTaskPassReject.pass=Pass\neasyflow.process.admin.page.commonProcessTaskPassReject.reject=Reject\neasyflow.process.admin.page.commonProcessTaskPassReject.taskHistory=Task handle history\neasyflow.process.admin.page.commonProcessTaskPassReject.taskHandleUser=Task handle user(sep with comma)\neasyflow.process.admin.page.commonProcessTaskPassReject.confirm=Confirm\neasyflow.process.admin.page.commonProcessTaskPassReject.taskNo=Task no\neasyflow.process.admin.page.commonProcessTaskPassReject.taskName=Task name\neasyflow.process.admin.page.commonProcessTaskPassReject.createdTime=Created time\neasyflow.process.admin.page.commonProcessTaskPassReject.handleResult=Handle result\neasyflow.process.admin.page.commonProcessTaskPassReject.handleUser=Handle user\neasyflow.process.admin.page.commonProcessTaskPassReject.handleTime=Handle time\neasyflow.process.admin.page.commonProcessTaskPassReject.tip=Tip\neasyflow.process.admin.page.commonProcessTaskPassReject.instanceErrorTip=Process instance info error, please check\neasyflow.process.admin.page.commonProcessTaskPassReject.formErrorTip=Form info error, please check\n\neasyflow.process.admin.page.commonProcessTaskDetail.taskDetail=Task detail\neasyflow.process.admin.page.commonProcessTaskDetail.processInfo=Process info\neasyflow.process.admin.page.commonProcessTaskDetail.processInstanceInfo=Process instance info\neasyflow.process.admin.page.commonProcessTaskDetail.processInstance=Process instance\neasyflow.process.admin.page.commonProcessTaskDetail.processDefinitionInfo=Process definition info\neasyflow.process.admin.page.commonProcessTaskDetail.bizType=Biz type\neasyflow.process.admin.page.commonProcessTaskDetail.bizNo=Biz no\neasyflow.process.admin.page.commonProcessTaskDetail.productCode=Product code\neasyflow.process.admin.page.commonProcessTaskDetail.keyField=Key field\neasyflow.process.admin.page.commonProcessTaskDetail.taskInfo=Task info\neasyflow.process.admin.page.commonProcessTaskDetail.taskNo=Task no\neasyflow.process.admin.page.commonProcessTaskDetail.taskCode=Task code\neasyflow.process.admin.page.commonProcessTaskDetail.taskName=Task name\neasyflow.process.admin.page.commonProcessTaskDetail.taskNode=Task node\neasyflow.process.admin.page.commonProcessTaskDetail.taskStatus=Task status\neasyflow.process.admin.page.commonProcessTaskDetail.statusPending=Pending\neasyflow.process.admin.page.commonProcessTaskDetail.statusFinish=Finish\neasyflow.process.admin.page.commonProcessTaskDetail.createTime=Create time\neasyflow.process.admin.page.commonProcessTaskDetail.updateTime=Update time\neasyflow.process.admin.page.commonProcessTaskDetail.creator=Creator\neasyflow.process.admin.page.commonProcessTaskDetail.executor=Executor\neasyflow.process.admin.page.commonProcessTaskDetail.executeResult=Execute result\neasyflow.process.admin.page.commonProcessTaskDetail.taskTodoUser=to-do user\neasyflow.process.admin.page.commonProcessTaskDetail.taskHandleHistory=Task handle history\neasyflow.process.admin.page.commonProcessTaskDetail.processResult=Process result\neasyflow.process.admin.page.commonProcessTaskDetail.taskHandledUser=Handled user\neasyflow.process.admin.page.commonProcessTaskDetail.processTime=Process time\n\neasyflow.process.admin.page.processTaskList.todoTask=Process ask\neasyflow.process.admin.page.processTaskList.queryType=Query type\neasyflow.process.admin.page.processTaskList.myTodo=My to-do\neasyflow.process.admin.page.processTaskList.myDone=My done\neasyflow.process.admin.page.processTaskList.allTask=All\neasyflow.process.admin.page.processTaskList.processType=Process task\neasyflow.process.admin.page.processTaskList.bizNo=Biz no\neasyflow.process.admin.page.processTaskList.productCode=Product code\neasyflow.process.admin.page.processTaskList.taskNo=Task no\neasyflow.process.admin.page.processTaskList.nodeInstanceNo=Node instance no\neasyflow.process.admin.page.processTaskList.processInstanceNo=Process instance no\neasyflow.process.admin.page.processTaskList.keyField=Key field\neasyflow.process.admin.page.processTaskList.query=Query\neasyflow.process.admin.page.processTaskList.reset=Reset\neasyflow.process.admin.page.processTaskList.taskList=Task list\neasyflow.process.admin.page.processTaskList.instanceName=Process\neasyflow.process.admin.page.processTaskList.taskBizName=Task name\neasyflow.process.admin.page.processTaskList.processType=Process type\neasyflow.process.admin.page.processTaskList.processBizNo=Process biz no\neasyflow.process.admin.page.processTaskList.instanceStatus=Instance status\neasyflow.process.admin.page.processTaskList.instanceStatusActive=Active\neasyflow.process.admin.page.processTaskList.instanceStatusFinished=Finished\neasyflow.process.admin.page.processTaskList.instanceCreator=Instance creator\neasyflow.process.admin.page.processTaskList.keyField=Key field\neasyflow.process.admin.page.processTaskList.instanceCreateTime=Instance create time\neasyflow.process.admin.page.processTaskList.taskStatus=Task status\neasyflow.process.admin.page.processTaskList.taskStatusPending=Pending\neasyflow.process.admin.page.processTaskList.taskStatusFinish=Finish\neasyflow.process.admin.page.processTaskList.taskStatusCanceled=Canceled\neasyflow.process.admin.page.processTaskList.taskStatusInvalid=Invalid\neasyflow.process.admin.page.processTaskList.taskExecutor=Task executor\neasyflow.process.admin.page.processTaskList.taskCreatedDate=Task created date\neasyflow.process.admin.page.processTaskList.op=Operation\neasyflow.process.admin.page.processTaskList.opHandle=Handle\neasyflow.process.admin.page.processTaskList.opWithdraw=Withdraw\neasyflow.process.admin.page.processTaskList.opDetail=Detail\neasyflow.process.admin.page.processTaskList.withDrawConfirm=Withdraw this task?\n\neasyflow.process.admin.page.commonProcessTaskExecute.taskHandle=Task handle\neasyflow.process.admin.page.commonProcessTaskExecute.processInfo=Process info\neasyflow.process.admin.page.commonProcessTaskExecute.processLink=Process link\neasyflow.process.admin.page.commonProcessTaskExecute.processKeyField=Process key field\neasyflow.process.admin.page.commonProcessTaskExecute.addHandleUser=Add handle user\neasyflow.process.admin.page.commonProcessTaskExecute.taskHistory=Task history\neasyflow.process.admin.page.commonProcessTaskExecute.taskHandleUser=Task handle user(sep by comma)\neasyflow.process.admin.page.commonProcessTaskExecute.confirm=Confirm\neasyflow.process.admin.page.commonProcessTaskExecute.taskNo=Task no\neasyflow.process.admin.page.commonProcessTaskExecute.taskName=Task name\neasyflow.process.admin.page.commonProcessTaskExecute.createdTime=Created time\neasyflow.process.admin.page.commonProcessTaskExecute.handleResult=Handle result\neasyflow.process.admin.page.commonProcessTaskExecute.handleUser=Handle user\neasyflow.process.admin.page.commonProcessTaskExecute.handleTime=Handle time\n\neasyflow.process.admin.page.commonTaskProcessInstanceAdd.processCreate=Create process\neasyflow.process.admin.page.commonTaskProcessInstanceAdd.processInfo=Process info\neasyflow.process.admin.page.commonTaskProcessInstanceAdd.processDefinition=Process definition\neasyflow.process.admin.page.commonTaskProcessInstanceAdd.processName=Process name\neasyflow.process.admin.page.commonTaskProcessInstanceAdd.processKeyField=Process key field\neasyflow.process.admin.page.commonTaskProcessInstanceAdd.processKeyField2=Process key field2\neasyflow.process.admin.page.commonTaskProcessInstanceAdd.formInfo=Form info\neasyflow.process.admin.page.commonTaskProcessInstanceAdd.createProcess=Create process\neasyflow.process.admin.page.commonTaskProcessInstanceAdd.tip=Tip\neasyflow.process.admin.page.commonTaskProcessInstanceAdd.instancerrorTip=Process instance info error, please check\neasyflow.process.admin.page.commonTaskProcessInstanceAdd.formErrorTip=Form instance info error, please check\n\neasyflow.process.admin.page.processInstanceList.process=Process\neasyflow.process.admin.page.processInstanceList.instanceNo=Instance no\neasyflow.process.admin.page.processInstanceList.bizType=Biz type\neasyflow.process.admin.page.processInstanceList.bizNo=Biz no\neasyflow.process.admin.page.processInstanceList.productCode=Product code\neasyflow.process.admin.page.processInstanceList.creator=Creator\neasyflow.process.admin.page.processInstanceList.processStatus=Process status\neasyflow.process.admin.page.processInstanceList.statusAll=All\neasyflow.process.admin.page.processInstanceList.statusActive=Active\neasyflow.process.admin.page.processInstanceList.statusClose=Close\neasyflow.process.admin.page.processInstanceList.statusCanceled=Canceled\neasyflow.process.admin.page.processInstanceList.keyField=Key field\neasyflow.process.admin.page.processInstanceList.queryType=Query type\neasyflow.process.admin.page.processInstanceList.queryTypeMy=My process\neasyflow.process.admin.page.processInstanceList.queryTypeAll=All process\neasyflow.process.admin.page.processInstanceList.query=Query\neasyflow.process.admin.page.processInstanceList.reset=Reset\neasyflow.process.admin.page.processInstanceList.createProces=Create process\neasyflow.process.admin.page.processInstanceList.processList=Process list\neasyflow.process.admin.page.processInstanceList.instanceNo=Instance no\neasyflow.process.admin.page.processInstanceList.instanceName=Instance name\neasyflow.process.admin.page.processInstanceList.processType=Process type\neasyflow.process.admin.page.processInstanceList.processBizNo=Biz no\neasyflow.process.admin.page.processInstanceList.processDefId=Definition id\neasyflow.process.admin.page.processInstanceList.processStartTime=Process start time\neasyflow.process.admin.page.processInstanceList.processEndTime=Process end time\neasyflow.process.admin.page.processInstanceList.currentNodeId=Current node ID\neasyflow.process.admin.page.processInstanceList.createdDate=Created date\neasyflow.process.admin.page.processInstanceList.modifiedDate=Modified date\neasyflow.process.admin.page.processInstanceList.op=Operation\neasyflow.process.admin.page.processInstanceList.cancel=Cancel\neasyflow.process.admin.page.processInstanceList.cancelConfirm=Cancel this process?\n\neasyflow.process.admin.page.processInstanceDetail.process=Process\neasyflow.process.admin.page.processInstanceDetail.processView=Process view\neasyflow.process.admin.page.processInstanceDetail.instanceNo=Instance no\neasyflow.process.admin.page.processInstanceDetail.instanceName=Instance name\neasyflow.process.admin.page.processInstanceDetail.productCode=Product code\neasyflow.process.admin.page.processInstanceDetail.processType=Process type\neasyflow.process.admin.page.processInstanceDetail.bizNo=Biz no\neasyflow.process.admin.page.processInstanceDetail.processStatus=Process status\neasyflow.process.admin.page.processInstanceDetail.processStatusActive=Active\neasyflow.process.admin.page.processInstanceDetail.processStatusClose=Close\neasyflow.process.admin.page.processInstanceDetail.processStatusCanceled=Canceled\neasyflow.process.admin.page.processInstanceDetail.keyField=Key field\neasyflow.process.admin.page.processInstanceDetail.parentInstanceNo=Parent process instance\neasyflow.process.admin.page.processInstanceDetail.startTime=Start time\neasyflow.process.admin.page.processInstanceDetail.modifiedDate=Modified date\neasyflow.process.admin.page.processInstanceDetail.currentNode=Current node\neasyflow.process.admin.page.processInstanceDetail.processVars=Process variables\neasyflow.process.admin.page.processInstanceDetail.processDef=Process definition\neasyflow.process.admin.page.processInstanceDetail.processBizData=Process biz data\neasyflow.process.admin.page.processInstanceDetail.processNodeStatusGraph=Process node graph\neasyflow.process.admin.page.processInstanceDetail.processNodeData=Process node data\neasyflow.process.admin.page.processInstanceDetail.taskList=Task list\neasyflow.process.admin.page.processInstanceDetail.returnList=Return list\neasyflow.process.admin.page.processInstanceDetail.nodeInstanceNo=Node instance no\neasyflow.process.admin.page.processInstanceDetail.nodeId=Node ID\neasyflow.process.admin.page.processInstanceDetail.nodeName=Node name\neasyflow.process.admin.page.processInstanceDetail.endTime=End time\neasyflow.process.admin.page.processInstanceDetail.nodeStatus=Status\neasyflow.process.admin.page.processInstanceDetail.nodeStatusEnd=End\neasyflow.process.admin.page.processInstanceDetail.nodeStatusInactive=Inactive\neasyflow.process.admin.page.processInstanceDetail.nodeStatusActive=Active\neasyflow.process.admin.page.processInstanceDetail.previousNodeInstances=Previous node instances\neasyflow.process.admin.page.processInstanceDetail.nextNodeInstances=Next node instances\neasyflow.process.admin.page.processInstanceDetail.extData=Extend data\neasyflow.process.admin.page.processInstanceDetail.taskNo=Task no\neasyflow.process.admin.page.processInstanceDetail.taskBizName=Task name\neasyflow.process.admin.page.processInstanceDetail.createdDate=Created date\neasyflow.process.admin.page.processInstanceDetail.taskStatus=Task status\neasyflow.process.admin.page.processInstanceDetail.taskStatusPending=Pending\neasyflow.process.admin.page.processInstanceDetail.taskStatusFinish=Finish\neasyflow.process.admin.page.processInstanceDetail.taskStatusCanceled=Canceled\neasyflow.process.admin.page.processInstanceDetail.taskStatusInvalid=Invalid\neasyflow.process.admin.page.processInstanceDetail.assignInfo=Assign info\neasyflow.process.admin.page.processInstanceDetail.user=User\neasyflow.process.admin.page.processInstanceDetail.userGroup=User group\neasyflow.process.admin.page.processInstanceDetail.userGroup2=User group2\neasyflow.process.admin.page.processInstanceDetail.executeBizResult=Execute result\neasyflow.process.admin.page.processInstanceDetail.pass=Pass\neasyflow.process.admin.page.processInstanceDetail.reject=Reject\neasyflow.process.admin.page.processInstanceDetail.handleUser=Handle user\neasyflow.process.admin.page.processInstanceDetail.handleTime=Handle time\n\neasyflow.process.admin.page.processInstanceCreate.processCreate=Process create\neasyflow.process.admin.page.processInstanceCreate.createProcess=Create process\neasyflow.process.admin.page.processInstanceCreate.defId=Process definition id\n\neasyflow.process.admin.page.processDefinitionList.processDefinition=Process definition\neasyflow.process.admin.page.processDefinitionList.defId=Process definition ID\neasyflow.process.admin.page.processDefinitionList.bizType=Biz type\neasyflow.process.admin.page.processDefinitionList.category=Category\neasyflow.process.admin.page.processDefinitionList.format=Format\neasyflow.process.admin.page.processDefinitionList.formatAll=All\neasyflow.process.admin.page.processDefinitionList.formatFlowEasy=Flow-EASY\neasyflow.process.admin.page.processDefinitionList.formatFlowBpmn=Flow-BPMN\neasyflow.process.admin.page.processDefinitionList.formatFsmEasy=Fsm-EASY\neasyflow.process.admin.page.processDefinitionList.latest=Latest flag\neasyflow.process.admin.page.processDefinitionList.latestAll=All\neasyflow.process.admin.page.processDefinitionList.latestOnly=Latest only\neasyflow.process.admin.page.processDefinitionList.query=Query\neasyflow.process.admin.page.processDefinitionList.reset=Reset\neasyflow.process.admin.page.processDefinitionList.add=Add\neasyflow.process.admin.page.processDefinitionList.processDefinitionList=Process definition list\neasyflow.process.admin.page.processDefinitionList.defId=ID\neasyflow.process.admin.page.processDefinitionList.defName=Name\neasyflow.process.admin.page.processDefinitionList.defVersion=Version\neasyflow.process.admin.page.processDefinitionList.defFormat=Format\neasyflow.process.admin.page.processDefinitionList.latestYes=Yes\neasyflow.process.admin.page.processDefinitionList.latestNo=No\neasyflow.process.admin.page.processDefinitionList.createdDate=Created date\neasyflow.process.admin.page.processDefinitionList.modifiedDate=Modified date\neasyflow.process.admin.page.processDefinitionList.op=Operation\neasyflow.process.admin.page.processDefinitionList.edit=Edit\n\neasyflow.process.admin.page.processDefinitionAdd.processDefinition=Process definition\neasyflow.process.admin.page.processDefinitionAdd.save=Save\neasyflow.process.admin.page.processDefinitionAdd.cancel=Cancel\n\neasyflow.process.admin.page.processDefinitionDetail.processDefinition=Process definition\neasyflow.process.admin.page.processDefinitionDetail.defView=Definition view\neasyflow.process.admin.page.processDefinitionDetail.return=Return\n\neasyflow.process.admin.page.processDefinitionEdit.processDefinition=Process definition\neasyflow.process.admin.page.processDefinitionEdit.defEdit=Definition edit\neasyflow.process.admin.page.processDefinitionEdit.updateCurrentVersion=Update current version\neasyflow.process.admin.page.processDefinitionEdit.forceUpdateTitle=Force update current version will impact  process instance on the way，Take effect only after restart application.\neasyflow.process.admin.page.processDefinitionEdit.save=Save\neasyflow.process.admin.page.processDefinitionEdit.cancel=Cancel\n\neasyflow.process.admin.page.processSelectFrame.defId=ID\neasyflow.process.admin.page.processSelectFrame.format=Format\neasyflow.process.admin.page.processSelectFrame.formatAll=All\neasyflow.process.admin.page.processSelectFrame.formatFlowEasy=Flow-EASY\neasyflow.process.admin.page.processSelectFrame.formatFlowBpmn=Flow-BPMN\neasyflow.process.admin.page.processSelectFrame.formatFsmEasy=Fsm-EASY\neasyflow.process.admin.page.processSelectFrame.latest=Latest flag\neasyflow.process.admin.page.processSelectFrame.latestAll=All\neasyflow.process.admin.page.processSelectFrame.latestOnly=Latest only\neasyflow.process.admin.page.processSelectFrame.bizType=Biz type\neasyflow.process.admin.page.processSelectFrame.bizTypeAll=All\neasyflow.process.admin.page.processSelectFrame.query=Query\neasyflow.process.admin.page.processSelectFrame.reset=Reset\neasyflow.process.admin.page.processSelectFrame.confirm=Confirm\neasyflow.process.admin.page.processSelectFrame.cancel=Cancel\neasyflow.process.admin.page.processSelectFrame.defName=Name\neasyflow.process.admin.page.processSelectFrame.defVersion=Version\neasyflow.process.admin.page.processSelectFrame.defFormat=Format\neasyflow.process.admin.page.processSelectFrame.latestYes=Yes\neasyflow.process.admin.page.processSelectFrame.latestNo=No\n\n\n\n\n\n\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/easyflow/messages/easyflow-process-admin_zh.properties",
    "content": "easyflow.process.admin.tip.handleDisable=该流程设置不可被办理\neasyflow.process.admin.tip.flowChange = 流程任务信息已变更，请刷新页面重试\neasyflow.process.admin.user=用户\neasyflow.process.admin.group=用户组\neasyflow.process.admin.group2=用户组2\neasyflow.process.admin.processDefinitionAdd=流程定义新增\n\neasyflow.process.admin.page.commonProcessTaskPassReject.taskHandle=任务办理\neasyflow.process.admin.page.commonProcessTaskPassReject.processInfo=流程信息\neasyflow.process.admin.page.commonProcessTaskPassReject.processLink=流程链接\neasyflow.process.admin.page.commonProcessTaskPassReject.processKeyField=流程关键字\neasyflow.process.admin.page.commonProcessTaskPassReject.addHandleUser=增加办理人\neasyflow.process.admin.page.commonProcessTaskPassReject.pass=通过\neasyflow.process.admin.page.commonProcessTaskPassReject.reject=拒绝\neasyflow.process.admin.page.commonProcessTaskPassReject.taskHistory=任务办理历史\neasyflow.process.admin.page.commonProcessTaskPassReject.taskHandleUser=办理人(多个逗号隔开)\neasyflow.process.admin.page.commonProcessTaskPassReject.confirm=确定\neasyflow.process.admin.page.commonProcessTaskPassReject.taskNo=任务编号\neasyflow.process.admin.page.commonProcessTaskPassReject.taskName=任务名称\neasyflow.process.admin.page.commonProcessTaskPassReject.createdTime=创建时间\neasyflow.process.admin.page.commonProcessTaskPassReject.handleResult=处理结果\neasyflow.process.admin.page.commonProcessTaskPassReject.handleUser=办理人\neasyflow.process.admin.page.commonProcessTaskPassReject.handleTime=处理时间\neasyflow.process.admin.page.commonProcessTaskPassReject.tip=提示\neasyflow.process.admin.page.commonProcessTaskPassReject.instanceErrorTip=流程实例信息录入有误，请检查\neasyflow.process.admin.page.commonProcessTaskPassReject.formErrorTip=表单信息录入有误，请检查\n\neasyflow.process.admin.page.commonProcessTaskDetail.taskDetail=任务详情\neasyflow.process.admin.page.commonProcessTaskDetail.processInfo=流程信息\neasyflow.process.admin.page.commonProcessTaskDetail.processInstanceInfo=流程实例信息\neasyflow.process.admin.page.commonProcessTaskDetail.processInstance=流程实例\neasyflow.process.admin.page.commonProcessTaskDetail.processDefinitionInfo=流程定义信息\neasyflow.process.admin.page.commonProcessTaskDetail.bizType=业务类型\neasyflow.process.admin.page.commonProcessTaskDetail.bizNo=业务编号\neasyflow.process.admin.page.commonProcessTaskDetail.productCode=产品编码\neasyflow.process.admin.page.commonProcessTaskDetail.keyField=流程关键字\neasyflow.process.admin.page.commonProcessTaskDetail.taskInfo=任务信息\neasyflow.process.admin.page.commonProcessTaskDetail.taskNo=任务编号\neasyflow.process.admin.page.commonProcessTaskDetail.taskCode=任务编码\neasyflow.process.admin.page.commonProcessTaskDetail.taskName=任务名称\neasyflow.process.admin.page.commonProcessTaskDetail.taskNode=任务节点\neasyflow.process.admin.page.commonProcessTaskDetail.taskStatus=任务状态\neasyflow.process.admin.page.commonProcessTaskDetail.statusPending=待处理\neasyflow.process.admin.page.commonProcessTaskDetail.statusFinish=已完成\neasyflow.process.admin.page.commonProcessTaskDetail.createTime=创建时间\neasyflow.process.admin.page.commonProcessTaskDetail.updateTime=更新时间\neasyflow.process.admin.page.commonProcessTaskDetail.creator=创建人\neasyflow.process.admin.page.commonProcessTaskDetail.executor=执行人\neasyflow.process.admin.page.commonProcessTaskDetail.executeResult=执行结果\neasyflow.process.admin.page.commonProcessTaskDetail.taskTodoUser=任务待办人\neasyflow.process.admin.page.commonProcessTaskDetail.taskHandleHistory=任务办理历史\neasyflow.process.admin.page.commonProcessTaskDetail.processResult=处理结果\neasyflow.process.admin.page.commonProcessTaskDetail.taskHandledUser=办理人\neasyflow.process.admin.page.commonProcessTaskDetail.processTime=处理时间\n\neasyflow.process.admin.page.processTaskList.todoTask=待办任务\neasyflow.process.admin.page.processTaskList.queryType=查询类型\neasyflow.process.admin.page.processTaskList.myTodo=我的待办\neasyflow.process.admin.page.processTaskList.myDone=我的已办\neasyflow.process.admin.page.processTaskList.allTask=全部任务\neasyflow.process.admin.page.processTaskList.processType=流程类型\neasyflow.process.admin.page.processTaskList.bizNo=业务编号\neasyflow.process.admin.page.processTaskList.productCode=产品编码\neasyflow.process.admin.page.processTaskList.taskNo=任务编号\neasyflow.process.admin.page.processTaskList.nodeInstanceNo=节点编号\neasyflow.process.admin.page.processTaskList.processInstanceNo=流程编号\neasyflow.process.admin.page.processTaskList.keyField=流程关键字\neasyflow.process.admin.page.processTaskList.query=查询\neasyflow.process.admin.page.processTaskList.reset=重置\neasyflow.process.admin.page.processTaskList.taskList=任务列表\neasyflow.process.admin.page.processTaskList.instanceName=流程\neasyflow.process.admin.page.processTaskList.taskBizName=任务名称\neasyflow.process.admin.page.processTaskList.processType=业务类型\neasyflow.process.admin.page.processTaskList.processBizNo=流程业务编号\neasyflow.process.admin.page.processTaskList.instanceStatus=流程状态\neasyflow.process.admin.page.processTaskList.instanceStatusActive=进行中\neasyflow.process.admin.page.processTaskList.instanceStatusFinished=已完成\neasyflow.process.admin.page.processTaskList.instanceCreator=流程创建者\neasyflow.process.admin.page.processTaskList.keyField=流程关键字\neasyflow.process.admin.page.processTaskList.instanceCreateTime=流程创建时间\neasyflow.process.admin.page.processTaskList.taskStatus=任务状态\neasyflow.process.admin.page.processTaskList.taskStatusPending=待处理\neasyflow.process.admin.page.processTaskList.taskStatusFinish=已完成\neasyflow.process.admin.page.processTaskList.taskStatusCanceled=已取消\neasyflow.process.admin.page.processTaskList.taskStatusInvalid=无效\neasyflow.process.admin.page.processTaskList.taskExecutor=任务办理人\neasyflow.process.admin.page.processTaskList.taskCreatedDate=任务生成时间\neasyflow.process.admin.page.processTaskList.op=操作\neasyflow.process.admin.page.processTaskList.opHandle=办理\neasyflow.process.admin.page.processTaskList.opWithdraw=撤回\neasyflow.process.admin.page.processTaskList.opDetail=详情\neasyflow.process.admin.page.processTaskList.withDrawConfirm=确认撤回该任务?\n\neasyflow.process.admin.page.commonProcessTaskExecute.taskHandle=任务办理\neasyflow.process.admin.page.commonProcessTaskExecute.processInfo=流程信息\neasyflow.process.admin.page.commonProcessTaskExecute.processLink=流程链接\neasyflow.process.admin.page.commonProcessTaskExecute.processKeyField=流程关键字\neasyflow.process.admin.page.commonProcessTaskExecute.addHandleUser=增加办理人\neasyflow.process.admin.page.commonProcessTaskExecute.taskHistory=任务办理历史\neasyflow.process.admin.page.commonProcessTaskExecute.taskHandleUser=办理人(多个逗号隔开)\neasyflow.process.admin.page.commonProcessTaskExecute.confirm=确定\neasyflow.process.admin.page.commonProcessTaskExecute.taskNo=任务编号\neasyflow.process.admin.page.commonProcessTaskExecute.taskName=任务名称\neasyflow.process.admin.page.commonProcessTaskExecute.createdTime=创建时间\neasyflow.process.admin.page.commonProcessTaskExecute.handleResult=处理结果\neasyflow.process.admin.page.commonProcessTaskExecute.handleUser=办理人\neasyflow.process.admin.page.commonProcessTaskExecute.handleTime=处理时间\n\neasyflow.process.admin.page.commonTaskProcessInstanceAdd.processCreate=流程创建\neasyflow.process.admin.page.commonTaskProcessInstanceAdd.processInfo=流程信息\neasyflow.process.admin.page.commonTaskProcessInstanceAdd.processDefinition=流程定义\neasyflow.process.admin.page.commonTaskProcessInstanceAdd.processName=流程名称\neasyflow.process.admin.page.commonTaskProcessInstanceAdd.processKeyField=流程关键字\neasyflow.process.admin.page.commonTaskProcessInstanceAdd.processKeyField2=流程关键字2\neasyflow.process.admin.page.commonTaskProcessInstanceAdd.formInfo=表单信息\neasyflow.process.admin.page.commonTaskProcessInstanceAdd.createProcess=创建流程\neasyflow.process.admin.page.commonTaskProcessInstanceAdd.tip=提示\neasyflow.process.admin.page.commonTaskProcessInstanceAdd.instancerrorTip=流程信息录入有误，请检查\neasyflow.process.admin.page.commonTaskProcessInstanceAdd.formErrorTip=表单信息录入有误，请检查\n\neasyflow.process.admin.page.processInstanceList.process=流程管理\neasyflow.process.admin.page.processInstanceList.instanceNo=流程编号\neasyflow.process.admin.page.processInstanceList.bizType=流程类型\neasyflow.process.admin.page.processInstanceList.bizNo=业务编号\neasyflow.process.admin.page.processInstanceList.productCode=产品编码\neasyflow.process.admin.page.processInstanceList.creator=创建人\neasyflow.process.admin.page.processInstanceList.processStatus=流程状态\neasyflow.process.admin.page.processInstanceList.statusAll=全部\neasyflow.process.admin.page.processInstanceList.statusActive=进行中\neasyflow.process.admin.page.processInstanceList.statusClose=已完成\neasyflow.process.admin.page.processInstanceList.statusCanceled=已取消\neasyflow.process.admin.page.processInstanceList.keyField=关键字\neasyflow.process.admin.page.processInstanceList.queryType=查询类型\neasyflow.process.admin.page.processInstanceList.queryTypeMy=我发起的\neasyflow.process.admin.page.processInstanceList.queryTypeAll=全部流程\neasyflow.process.admin.page.processInstanceList.query=查询\neasyflow.process.admin.page.processInstanceList.reset=重置\neasyflow.process.admin.page.processInstanceList.createProces=创建流程\neasyflow.process.admin.page.processInstanceList.processList=流程列表\neasyflow.process.admin.page.processInstanceList.instanceNo=流程编号\neasyflow.process.admin.page.processInstanceList.instanceName=流程名称\neasyflow.process.admin.page.processInstanceList.processType=业务类型\neasyflow.process.admin.page.processInstanceList.processBizNo=流程业务编号\neasyflow.process.admin.page.processInstanceList.processDefId=流程定义ID\neasyflow.process.admin.page.processInstanceList.processStartTime=流程开始时间\neasyflow.process.admin.page.processInstanceList.processEndTime=流程结束时间\neasyflow.process.admin.page.processInstanceList.currentNodeId=当前节点ID\neasyflow.process.admin.page.processInstanceList.createdDate=创建时间\neasyflow.process.admin.page.processInstanceList.modifiedDate=更新时间\neasyflow.process.admin.page.processInstanceList.op=操作\neasyflow.process.admin.page.processInstanceList.cancel=取消\neasyflow.process.admin.page.processInstanceList.cancelConfirm=确认取消该流程?\n\neasyflow.process.admin.page.processInstanceDetail.process=流程管理\neasyflow.process.admin.page.processInstanceDetail.processView=流程查看\neasyflow.process.admin.page.processInstanceDetail.instanceNo=流程编号\neasyflow.process.admin.page.processInstanceDetail.instanceName=流程名称\neasyflow.process.admin.page.processInstanceDetail.productCode=产品编码\neasyflow.process.admin.page.processInstanceDetail.processType=业务类型\neasyflow.process.admin.page.processInstanceDetail.bizNo=业务编号\neasyflow.process.admin.page.processInstanceDetail.processStatus=流程状态\neasyflow.process.admin.page.processInstanceDetail.processStatusActive=进行中\neasyflow.process.admin.page.processInstanceDetail.processStatusClose=关闭\neasyflow.process.admin.page.processInstanceDetail.processStatusCanceled=已取消\neasyflow.process.admin.page.processInstanceDetail.keyField=关键字\neasyflow.process.admin.page.processInstanceDetail.parentInstanceNo=父流程实例\neasyflow.process.admin.page.processInstanceDetail.startTime=开始时间\neasyflow.process.admin.page.processInstanceDetail.modifiedDate=更新时间\neasyflow.process.admin.page.processInstanceDetail.currentNode=当前节点\neasyflow.process.admin.page.processInstanceDetail.processVars=流程变量\neasyflow.process.admin.page.processInstanceDetail.processDef=流程定义\neasyflow.process.admin.page.processInstanceDetail.processBizData=流程业务数据\neasyflow.process.admin.page.processInstanceDetail.processNodeStatusGraph=流程节点状态图\neasyflow.process.admin.page.processInstanceDetail.processNodeData=流程节点数据\neasyflow.process.admin.page.processInstanceDetail.taskList=任务列表\neasyflow.process.admin.page.processInstanceDetail.returnList=返回列表\neasyflow.process.admin.page.processInstanceDetail.nodeInstanceNo=节点实例编号\neasyflow.process.admin.page.processInstanceDetail.nodeId=节点ID\neasyflow.process.admin.page.processInstanceDetail.nodeName=节点名称\neasyflow.process.admin.page.processInstanceDetail.endTime=结束时间\neasyflow.process.admin.page.processInstanceDetail.nodeStatus=状态\neasyflow.process.admin.page.processInstanceDetail.nodeStatusEnd=结束\neasyflow.process.admin.page.processInstanceDetail.nodeStatusInactive=等待执行\neasyflow.process.admin.page.processInstanceDetail.nodeStatusActive=进行中\neasyflow.process.admin.page.processInstanceDetail.previousNodeInstances=前置节点实例\neasyflow.process.admin.page.processInstanceDetail.nextNodeInstances=后置节点实例\neasyflow.process.admin.page.processInstanceDetail.extData=扩展字段\neasyflow.process.admin.page.processInstanceDetail.taskNo=任务编号\neasyflow.process.admin.page.processInstanceDetail.taskBizName=任务名称\neasyflow.process.admin.page.processInstanceDetail.createdDate=创建时间\neasyflow.process.admin.page.processInstanceDetail.taskStatus=任务状态\neasyflow.process.admin.page.processInstanceDetail.taskStatusPending=待处理\neasyflow.process.admin.page.processInstanceDetail.taskStatusFinish=已完成\neasyflow.process.admin.page.processInstanceDetail.taskStatusCanceled=已取消\neasyflow.process.admin.page.processInstanceDetail.taskStatusInvalid=无效\neasyflow.process.admin.page.processInstanceDetail.assignInfo=分派人员\neasyflow.process.admin.page.processInstanceDetail.user=用户\neasyflow.process.admin.page.processInstanceDetail.userGroup=用户组\neasyflow.process.admin.page.processInstanceDetail.userGroup2=用户组2\neasyflow.process.admin.page.processInstanceDetail.executeBizResult=处理结果\neasyflow.process.admin.page.processInstanceDetail.pass=通过\neasyflow.process.admin.page.processInstanceDetail.reject=拒绝\neasyflow.process.admin.page.processInstanceDetail.handleUser=办理人\neasyflow.process.admin.page.processInstanceDetail.handleTime=处理时间\n\neasyflow.process.admin.page.processInstanceCreate.processCreate=流程创建\neasyflow.process.admin.page.processInstanceCreate.createProcess=创建流程\neasyflow.process.admin.page.processInstanceCreate.defId=流程定义ID\n\neasyflow.process.admin.page.processDefinitionList.processDefinition=流程定义管理\neasyflow.process.admin.page.processDefinitionList.defId=流程定义ID\neasyflow.process.admin.page.processDefinitionList.bizType=业务类型\neasyflow.process.admin.page.processDefinitionList.category=流程分类\neasyflow.process.admin.page.processDefinitionList.format=流程类型\neasyflow.process.admin.page.processDefinitionList.formatAll=全部\neasyflow.process.admin.page.processDefinitionList.formatFlowEasy=流程引擎-EASY\neasyflow.process.admin.page.processDefinitionList.formatFlowBpmn=流程引擎-BPMN\neasyflow.process.admin.page.processDefinitionList.formatFsmEasy=状态机-EASY\neasyflow.process.admin.page.processDefinitionList.latest=最新标识\neasyflow.process.admin.page.processDefinitionList.latestAll=全部\neasyflow.process.admin.page.processDefinitionList.latestOnly=最新\neasyflow.process.admin.page.processDefinitionList.query=查询\neasyflow.process.admin.page.processDefinitionList.reset=重置\neasyflow.process.admin.page.processDefinitionList.add=增加\neasyflow.process.admin.page.processDefinitionList.processDefinitionList=流程定义列表\neasyflow.process.admin.page.processDefinitionList.defId=流程定义ID\neasyflow.process.admin.page.processDefinitionList.defName=流程定义名称\neasyflow.process.admin.page.processDefinitionList.defVersion=流程定义版本\neasyflow.process.admin.page.processDefinitionList.defFormat=流程定义格式\neasyflow.process.admin.page.processDefinitionList.latestYes=是\neasyflow.process.admin.page.processDefinitionList.latestNo=否\neasyflow.process.admin.page.processDefinitionList.createdDate=创建时间\neasyflow.process.admin.page.processDefinitionList.modifiedDate=更新时间\neasyflow.process.admin.page.processDefinitionList.op=操作\neasyflow.process.admin.page.processDefinitionList.edit=编辑\n\neasyflow.process.admin.page.processDefinitionAdd.processDefinition=流程定义管理\neasyflow.process.admin.page.processDefinitionAdd.save=保存\neasyflow.process.admin.page.processDefinitionAdd.cancel=取消\n\neasyflow.process.admin.page.processDefinitionDetail.processDefinition=流程定义管理\neasyflow.process.admin.page.processDefinitionDetail.defView=流程定义查看\neasyflow.process.admin.page.processDefinitionDetail.return=返回\n\neasyflow.process.admin.page.processDefinitionEdit.processDefinition=流程定义管理\neasyflow.process.admin.page.processDefinitionEdit.defEdit=流程定义修改\neasyflow.process.admin.page.processDefinitionEdit.updateCurrentVersion=更新当前版本\neasyflow.process.admin.page.processDefinitionEdit.forceUpdateTitle=更新当前版本会影响在途流程，重启应用才生效\neasyflow.process.admin.page.processDefinitionEdit.save=保存\neasyflow.process.admin.page.processDefinitionEdit.cancel=取消\n\neasyflow.process.admin.page.processSelectFrame.defId=流程定义ID\neasyflow.process.admin.page.processSelectFrame.format=流程类型\neasyflow.process.admin.page.processSelectFrame.formatAll=全部\neasyflow.process.admin.page.processSelectFrame.formatFlowEasy=流程引擎-EASY\neasyflow.process.admin.page.processSelectFrame.formatFlowBpmn=流程引擎-BPMN\neasyflow.process.admin.page.processSelectFrame.formatFsmEasy=状态机-EASY\neasyflow.process.admin.page.processSelectFrame.latest=最新标识\neasyflow.process.admin.page.processSelectFrame.latestAll=全部\neasyflow.process.admin.page.processSelectFrame.latestOnly=最新\neasyflow.process.admin.page.processSelectFrame.bizType=业务类型\neasyflow.process.admin.page.processSelectFrame.bizTypeAll=全部\neasyflow.process.admin.page.processSelectFrame.query=查询\neasyflow.process.admin.page.processSelectFrame.reset=重置\neasyflow.process.admin.page.processSelectFrame.confirm=确定\neasyflow.process.admin.page.processSelectFrame.cancel=取消\neasyflow.process.admin.page.processSelectFrame.defName=流程定义名称\neasyflow.process.admin.page.processSelectFrame.defVersion=流程定义版本\neasyflow.process.admin.page.processSelectFrame.defFormat=流程定义格式\neasyflow.process.admin.page.processSelectFrame.latestYes=是\neasyflow.process.admin.page.processSelectFrame.latestNo=否\n\n\n\n\n\n\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/easyflow/messages/easyflow-processunit-admin.properties",
    "content": "easyflow.process.admin.page.processUnitExecutionDetail.excutionDetailInfo=Execution detail info\neasyflow.process.admin.page.processUnitExecutionDetail.executionNo=Execution no\neasyflow.process.admin.page.processUnitExecutionDetail.requestNo=Request no\neasyflow.process.admin.page.processUnitExecutionDetail.processUnitCode=Process unit code\neasyflow.process.admin.page.processUnitExecutionDetail.bizNo=Biz no\neasyflow.process.admin.page.processUnitExecutionDetail.productCode=Product code\neasyflow.process.admin.page.processUnitExecutionDetail.result=Result\neasyflow.process.admin.page.processUnitExecutionDetail.resultSuccess=Success\neasyflow.process.admin.page.processUnitExecutionDetail.resultFail=Fail\neasyflow.process.admin.page.processUnitExecutionDetail.resultDoing=Doing\neasyflow.process.admin.page.processUnitExecutionDetail.resultException=Exception\neasyflow.process.admin.page.processUnitExecutionDetail.execType=Exec type\neasyflow.process.admin.page.processUnitExecutionDetail.execTypeSync=Sync\neasyflow.process.admin.page.processUnitExecutionDetail.execTypeManual=Manual\neasyflow.process.admin.page.processUnitExecutionDetail.execTypeTask=Task\neasyflow.process.admin.page.processUnitExecutionDetail.execTypeMsg=Message\neasyflow.process.admin.page.processUnitExecutionDetail.elapseTime=Elaspe time\neasyflow.process.admin.page.processUnitExecutionDetail.requestTime=Request time\neasyflow.process.admin.page.processUnitExecutionDetail.responseTime=Response time\neasyflow.process.admin.page.processUnitExecutionDetail.createdDate=Created date\neasyflow.process.admin.page.processUnitExecutionDetail.modifiedDate=Modified date\neasyflow.process.admin.page.processUnitExecutionDetail.requestContent=Request content\neasyflow.process.admin.page.processUnitExecutionDetail.responseContent=Response content\neasyflow.process.admin.page.processUnitExecutionDetail.extData=Ext data\n\neasyflow.process.admin.page.processUnitInstanceDetail.instanceDetailInfo=Instance detail info\neasyflow.process.admin.page.processUnitInstanceDetail.instanceNo=Instance no\neasyflow.process.admin.page.processUnitInstanceDetail.processUnitCode=Process unit code\neasyflow.process.admin.page.processUnitInstanceDetail.bizNo=Biz no\neasyflow.process.admin.page.processUnitInstanceDetail.productCode=Product code\neasyflow.process.admin.page.processUnitInstanceDetail.result=Result\neasyflow.process.admin.page.processUnitInstanceDetail.resultSuccess=Success\neasyflow.process.admin.page.processUnitInstanceDetail.resultFail=Fail\neasyflow.process.admin.page.processUnitInstanceDetail.resultDoing=Doing\neasyflow.process.admin.page.processUnitInstanceDetail.resultException=Exception\neasyflow.process.admin.page.processUnitInstanceDetail.autoRunTimes=Auto run times\neasyflow.process.admin.page.processUnitInstanceDetail.autoRunFlag=Auto run flag\neasyflow.process.admin.page.processUnitInstanceDetail.nextAutoRunTime=Next auto run time\neasyflow.process.admin.page.processUnitInstanceDetail.createdDate=Created date\neasyflow.process.admin.page.processUnitInstanceDetail.modifiedDate=Modified date\neasyflow.process.admin.page.processUnitInstanceDetail.requestContent=Request content\neasyflow.process.admin.page.processUnitInstanceDetail.responseContent=Response content\neasyflow.process.admin.page.processUnitInstanceDetail.vars=Variables\neasyflow.process.admin.page.processUnitInstanceDetail.extData=Ext data\neasyflow.process.admin.page.processUnitInstanceDetail.instanceShardInfo=Instance shard info\neasyflow.process.admin.page.processUnitInstanceDetail.shard=Shard\neasyflow.process.admin.page.processUnitInstanceDetail.db=Db\neasyflow.process.admin.page.processUnitInstanceDetail.table=Table \neasyflow.process.admin.page.processUnitInstanceDetail.slaveShard=Slave shard\neasyflow.process.admin.page.processUnitInstanceDetail.slaveDb=Slave db\neasyflow.process.admin.page.processUnitInstanceDetail.slaveTable=Slave table\neasyflow.process.admin.page.processUnitInstanceDetail.executionNo=Execution no\neasyflow.process.admin.page.processUnitInstanceDetail.executionRequestNo=Request no\neasyflow.process.admin.page.processUnitInstanceDetail.executionResult=Result\neasyflow.process.admin.page.processUnitInstanceDetail.executionResultSuccess=Success\neasyflow.process.admin.page.processUnitInstanceDetail.executionResultFail=Fail\neasyflow.process.admin.page.processUnitInstanceDetail.executionResultDoing=Doing\neasyflow.process.admin.page.processUnitInstanceDetail.executionResultException=Exception\neasyflow.process.admin.page.processUnitInstanceDetail.executionRequestContent=Request content\neasyflow.process.admin.page.processUnitInstanceDetail.executionResponseContent=Response content\neasyflow.process.admin.page.processUnitInstanceDetail.executionExecType=Exec type\neasyflow.process.admin.page.processUnitInstanceDetail.executionExecTypeSync=Sync\neasyflow.process.admin.page.processUnitInstanceDetail.executionExecTypeManual=Manual\neasyflow.process.admin.page.processUnitInstanceDetail.executionExecTypeTask=Task\neasyflow.process.admin.page.processUnitInstanceDetail.executionExecTypeMsg=Message\neasyflow.process.admin.page.processUnitInstanceDetail.executionRequestTime=Request time\neasyflow.process.admin.page.processUnitInstanceDetail.executionResponseTime=Response time\neasyflow.process.admin.page.processUnitInstanceDetail.executionElapseTime=Elapse time\neasyflow.process.admin.page.processUnitInstanceDetail.executionExtData=Ext data\n\n\neasyflow.process.admin.page.processUnitExecutionList.executionManagement=Execution management\neasyflow.process.admin.page.processUnitExecutionList.queryType=Query type\neasyflow.process.admin.page.processUnitExecutionList.queryByInstance=Query by instance\neasyflow.process.admin.page.processUnitExecutionList.queryByInstanceTip=Input instanceNo or unitCode+bizNo\neasyflow.process.admin.page.processUnitExecutionList.queryByTime=Query by time range\neasyflow.process.admin.page.processUnitExecutionList.queryByTimeTip=Input unitCode, time range and other\neasyflow.process.admin.page.processUnitExecutionList.onlyFirstPageSupport=Only support first page\neasyflow.process.admin.page.processUnitExecutionList.queryProcessUnitCode=Process unit code\neasyflow.process.admin.page.processUnitExecutionList.querySelect=Select\neasyflow.process.admin.page.processUnitExecutionList.queryBizNo=Biz no\neasyflow.process.admin.page.processUnitExecutionList.queryInstanceNo=Instance no\neasyflow.process.admin.page.processUnitExecutionList.queryResult=Result\neasyflow.process.admin.page.processUnitExecutionList.queryResultSuccess=Success\neasyflow.process.admin.page.processUnitExecutionList.queryResultFail=Fail\neasyflow.process.admin.page.processUnitExecutionList.queryResultDoing=Doing\neasyflow.process.admin.page.processUnitExecutionList.queryResultException=Exception\neasyflow.process.admin.page.processUnitExecutionList.queryRequestTimeStart=Request time start\neasyflow.process.admin.page.processUnitExecutionList.queryRequestTimeEnd=Request time end\neasyflow.process.admin.page.processUnitExecutionList.queryElapseTimeStart=Elapse time start\neasyflow.process.admin.page.processUnitExecutionList.queryElapseTimeEnd=Elapse time end\neasyflow.process.admin.page.processUnitExecutionList.queryBtn=Query\neasyflow.process.admin.page.processUnitExecutionList.executionList=Execution list\neasyflow.process.admin.page.processUnitExecutionList.dateFormatInvalid=Date format invalid\neasyflow.process.admin.page.processUnitExecutionList.instanceInfoCannotNull=InstanceNo or unitCode+bizNo cannot null\neasyflow.process.admin.page.processUnitExecutionList.processUnitCodeCannotNull=process unit code cannot null\neasyflow.process.admin.page.processUnitExecutionList.timeRangeCannotNull=Start time and end time cannot null\neasyflow.process.admin.page.processUnitExecutionList.startTimeCannotGtEndTime=Start time cannot greater than end time\neasyflow.process.admin.page.processUnitExecutionList.TimeRangeCannotGt30Days=Time range cannot greater than 30 days\neasyflow.process.admin.page.processUnitExecutionList.executionNo=Execution no\neasyflow.process.admin.page.processUnitExecutionList.requestNo=Request no\neasyflow.process.admin.page.processUnitExecutionList.processUnitCode=Process unit code\neasyflow.process.admin.page.processUnitExecutionList.bizNo=Biz no\neasyflow.process.admin.page.processUnitExecutionList.result=Result\neasyflow.process.admin.page.processUnitExecutionList.resultSuccess=Success\neasyflow.process.admin.page.processUnitExecutionList.resultFail=Fail\neasyflow.process.admin.page.processUnitExecutionList.resultDoing=Doing\neasyflow.process.admin.page.processUnitExecutionList.resultException=Exception\neasyflow.process.admin.page.processUnitExecutionList.requestContent=Request content\neasyflow.process.admin.page.processUnitExecutionList.responseContent=Response content\neasyflow.process.admin.page.processUnitExecutionList.execType=Exec type\neasyflow.process.admin.page.processUnitExecutionList.requestTime=Request time\neasyflow.process.admin.page.processUnitExecutionList.responseTime=Response time\neasyflow.process.admin.page.processUnitExecutionList.elapseTime=Elapse time\neasyflow.process.admin.page.processUnitExecutionList.extData=Ext date\neasyflow.process.admin.page.processUnitExecutionList.createdDate=Created date\neasyflow.process.admin.page.processUnitExecutionList.modifiedDate=Modified date\neasyflow.process.admin.page.processUnitExecutionList.nextPage=Next page\n\neasyflow.process.admin.page.processUnitInstanceList.instanceManagement=Instance management\neasyflow.process.admin.page.processUnitInstanceList.queryByInstance=query by instance\neasyflow.process.admin.page.processUnitInstanceList.queryByInstanceTip=Input instanceNo or bizNo+unitCode\neasyflow.process.admin.page.processUnitInstanceList.queryByTime=query by time range\neasyflow.process.admin.page.processUnitInstanceList.queryByTimeTip=Input unitCode, time range and other\neasyflow.process.admin.page.processUnitInstanceList.onlyFirstPageSupport=Only support first page\neasyflow.process.admin.page.processUnitInstanceList.queryProcessUnitCode=Unit code\neasyflow.process.admin.page.processUnitInstanceList.querySelect=Select\neasyflow.process.admin.page.processUnitInstanceList.queryBizNo=Biz no\neasyflow.process.admin.page.processUnitInstanceList.queryInstanceNo=Instance no\neasyflow.process.admin.page.processUnitInstanceList.queryCreatedDateStart=Created date start\neasyflow.process.admin.page.processUnitInstanceList.queryCreatedDateEnd=Created date end\neasyflow.process.admin.page.processUnitInstanceList.queryResult=Result\neasyflow.process.admin.page.processUnitInstanceList.queryResultSuccess=Success\neasyflow.process.admin.page.processUnitInstanceList.queryResultFail=Fail\neasyflow.process.admin.page.processUnitInstanceList.queryResultDoing=Doing\neasyflow.process.admin.page.processUnitInstanceList.queryResultException=Exception\neasyflow.process.admin.page.processUnitInstanceList.queryBtn=Query\neasyflow.process.admin.page.processUnitInstanceList.instanceList=Process unit instance list\neasyflow.process.admin.page.processUnitInstanceList.dateFormatInvalid=Date format invalid\neasyflow.process.admin.page.processUnitInstanceList.instanceInfoCannotNull=Instance no or unitCode+bizNo cannot null\neasyflow.process.admin.page.processUnitInstanceList.processUnitCodeCannotNull=Process unit code cannot null\neasyflow.process.admin.page.processUnitInstanceList.timeRangeCannotNull=Start time and end time cannot null\neasyflow.process.admin.page.processUnitInstanceList.createdDateStartCannotGtEnd=Created date start cannot greater than end\neasyflow.process.admin.page.processUnitInstanceList.TimeRangeCannotGt30Days=Time range cannot greater than 30 days\neasyflow.process.admin.page.processUnitInstanceList.instanceNo=Instance no\neasyflow.process.admin.page.processUnitInstanceList.processUnitCode=Process unit code\neasyflow.process.admin.page.processUnitInstanceList.bizNo=Biz no\neasyflow.process.admin.page.processUnitInstanceList.productCode=Product code\neasyflow.process.admin.page.processUnitInstanceList.result=Result\neasyflow.process.admin.page.processUnitInstanceList.resultSuccess=Success\neasyflow.process.admin.page.processUnitInstanceList.resultFail=Fail\neasyflow.process.admin.page.processUnitInstanceList.resultDoing=Doing\neasyflow.process.admin.page.processUnitInstanceList.resultException=Exception\neasyflow.process.admin.page.processUnitInstanceList.requestContent=Request content\neasyflow.process.admin.page.processUnitInstanceList.responseContent=Response content\neasyflow.process.admin.page.processUnitInstanceList.autoRuntimes=Auto run times\neasyflow.process.admin.page.processUnitInstanceList.autoRunFlag=Auto run flag\neasyflow.process.admin.page.processUnitInstanceList.nextAutoRunTime=Next auto run time\neasyflow.process.admin.page.processUnitInstanceList.vars=Variables\neasyflow.process.admin.page.processUnitInstanceList.extData=Ext data\neasyflow.process.admin.page.processUnitInstanceList.createdDate=Created date\neasyflow.process.admin.page.processUnitInstanceList.modifiedDate=Modified date\neasyflow.process.admin.page.processUnitInstanceList.nextPage=Next page\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/easyflow/messages/easyflow-processunit-admin_zh.properties",
    "content": "easyflow.process.admin.page.processUnitExecutionDetail.excutionDetailInfo=执行明细信息\neasyflow.process.admin.page.processUnitExecutionDetail.executionNo=执行编号\neasyflow.process.admin.page.processUnitExecutionDetail.requestNo=请求编号\neasyflow.process.admin.page.processUnitExecutionDetail.processUnitCode=单元编码\neasyflow.process.admin.page.processUnitExecutionDetail.bizNo=业务编号\neasyflow.process.admin.page.processUnitExecutionDetail.productCode=产品编码\neasyflow.process.admin.page.processUnitExecutionDetail.result=结果\neasyflow.process.admin.page.processUnitExecutionDetail.resultSuccess=成功\neasyflow.process.admin.page.processUnitExecutionDetail.resultFail=失败\neasyflow.process.admin.page.processUnitExecutionDetail.resultDoing=进行中\neasyflow.process.admin.page.processUnitExecutionDetail.resultException=异常\neasyflow.process.admin.page.processUnitExecutionDetail.execType=执行方式\neasyflow.process.admin.page.processUnitExecutionDetail.execTypeSync=同步\neasyflow.process.admin.page.processUnitExecutionDetail.execTypeManual=人工\neasyflow.process.admin.page.processUnitExecutionDetail.execTypeTask=任务\neasyflow.process.admin.page.processUnitExecutionDetail.execTypeMsg=消息\neasyflow.process.admin.page.processUnitExecutionDetail.elapseTime=处理耗时\neasyflow.process.admin.page.processUnitExecutionDetail.requestTime=请求时间\neasyflow.process.admin.page.processUnitExecutionDetail.responseTime=响应时间\neasyflow.process.admin.page.processUnitExecutionDetail.createdDate=创建时间\neasyflow.process.admin.page.processUnitExecutionDetail.modifiedDate=更新时间\neasyflow.process.admin.page.processUnitExecutionDetail.requestContent=请求内容\neasyflow.process.admin.page.processUnitExecutionDetail.responseContent=响应内容\neasyflow.process.admin.page.processUnitExecutionDetail.extData=扩展字段\n\neasyflow.process.admin.page.processUnitInstanceDetail.instanceDetailInfo=实例信息\neasyflow.process.admin.page.processUnitInstanceDetail.instanceNo=实例编号\neasyflow.process.admin.page.processUnitInstanceDetail.processUnitCode=单元编码\neasyflow.process.admin.page.processUnitInstanceDetail.bizNo=业务编号\neasyflow.process.admin.page.processUnitInstanceDetail.productCode=产品编码\neasyflow.process.admin.page.processUnitInstanceDetail.result=结果\neasyflow.process.admin.page.processUnitInstanceDetail.resultSuccess=成功\neasyflow.process.admin.page.processUnitInstanceDetail.resultFail=失败\neasyflow.process.admin.page.processUnitInstanceDetail.resultDoing=进行中\neasyflow.process.admin.page.processUnitInstanceDetail.resultException=异常\neasyflow.process.admin.page.processUnitInstanceDetail.autoRunTimes=自动执行次数\neasyflow.process.admin.page.processUnitInstanceDetail.autoRunFlag=自动执行标识\neasyflow.process.admin.page.processUnitInstanceDetail.nextAutoRunTime=下次执行时间\neasyflow.process.admin.page.processUnitInstanceDetail.createdDate=创建时间\neasyflow.process.admin.page.processUnitInstanceDetail.modifiedDate=更新时间\neasyflow.process.admin.page.processUnitInstanceDetail.requestContent=请求内容\neasyflow.process.admin.page.processUnitInstanceDetail.responseContent=响应内容\neasyflow.process.admin.page.processUnitInstanceDetail.variables=变量\neasyflow.process.admin.page.processUnitInstanceDetail.extData=扩展字段\neasyflow.process.admin.page.processUnitInstanceDetail.instanceShardInfo=实例分区信息\neasyflow.process.admin.page.processUnitInstanceDetail.shard=分区\neasyflow.process.admin.page.processUnitInstanceDetail.db=所在库\neasyflow.process.admin.page.processUnitInstanceDetail.table=所在表\neasyflow.process.admin.page.processUnitInstanceDetail.slaveShard=从分区\neasyflow.process.admin.page.processUnitInstanceDetail.slaveDb=从分区所在库\neasyflow.process.admin.page.processUnitInstanceDetail.slaveTable=从分区所在表\neasyflow.process.admin.page.processUnitInstanceDetail.executionNo=执行编号\neasyflow.process.admin.page.processUnitInstanceDetail.executionRequestNo=请求编号\neasyflow.process.admin.page.processUnitInstanceDetail.executionResult=结果\neasyflow.process.admin.page.processUnitInstanceDetail.executionResultSuccess=成功\neasyflow.process.admin.page.processUnitInstanceDetail.executionResultFail=失败\neasyflow.process.admin.page.processUnitInstanceDetail.executionResultDoing=进行中\neasyflow.process.admin.page.processUnitInstanceDetail.executionResultException=异常\neasyflow.process.admin.page.processUnitInstanceDetail.executionRequestContent=请求内容\neasyflow.process.admin.page.processUnitInstanceDetail.executionResponseContent=响应内容\neasyflow.process.admin.page.processUnitInstanceDetail.executionExecType=执行类型\neasyflow.process.admin.page.processUnitInstanceDetail.executionExecTypeSync=同步\neasyflow.process.admin.page.processUnitInstanceDetail.executionExecTypeManual=人工\neasyflow.process.admin.page.processUnitInstanceDetail.executionExecTypeTask=任务\neasyflow.process.admin.page.processUnitInstanceDetail.executionExecTypeMsg=消息\neasyflow.process.admin.page.processUnitInstanceDetail.executionRequestTime=请求时间\neasyflow.process.admin.page.processUnitInstanceDetail.executionResponseTime=响应时间\neasyflow.process.admin.page.processUnitInstanceDetail.executionElapseTime=耗时\neasyflow.process.admin.page.processUnitInstanceDetail.executionExtData=扩展字段\n\neasyflow.process.admin.page.processUnitExecutionList.executionManagement=实例执行明细管理\neasyflow.process.admin.page.processUnitExecutionList.queryType=查询类型\neasyflow.process.admin.page.processUnitExecutionList.queryByInstance=按实例查询\neasyflow.process.admin.page.processUnitExecutionList.queryByInstanceTip=输入实例编号或单元编码+业务编码查询\neasyflow.process.admin.page.processUnitExecutionList.queryByTime=按时间范围查询\neasyflow.process.admin.page.processUnitExecutionList.queryByTimeTip=输入单元编码、时间范围和其他条件查询\neasyflow.process.admin.page.processUnitExecutionList.onlyFirstPageSupport=仅支持查第一页\neasyflow.process.admin.page.processUnitExecutionList.queryProcessUnitCode=单元编码\neasyflow.process.admin.page.processUnitExecutionList.querySelect=请选择\neasyflow.process.admin.page.processUnitExecutionList.queryBizNo=业务编号\neasyflow.process.admin.page.processUnitExecutionList.queryInstanceNo=实例编号\neasyflow.process.admin.page.processUnitExecutionList.queryResult=结果\neasyflow.process.admin.page.processUnitExecutionList.queryResultSuccess=成功\neasyflow.process.admin.page.processUnitExecutionList.queryResultFail=失败\neasyflow.process.admin.page.processUnitExecutionList.queryResultDoing=进行中\neasyflow.process.admin.page.processUnitExecutionList.queryResultException=异常\neasyflow.process.admin.page.processUnitExecutionList.queryRequestTimeStart=请求时间起\neasyflow.process.admin.page.processUnitExecutionList.queryRequestTimeEnd=请求时间止\neasyflow.process.admin.page.processUnitExecutionList.queryElapseTimeStart=耗时高于\neasyflow.process.admin.page.processUnitExecutionList.queryElapseTimeEnd=耗时低于\neasyflow.process.admin.page.processUnitExecutionList.queryBtn=查询\neasyflow.process.admin.page.processUnitExecutionList.executionList=处理单元执行明细列表\neasyflow.process.admin.page.processUnitExecutionList.dateFormatInvalid=日期时间格式不正确\neasyflow.process.admin.page.processUnitExecutionList.instanceInfoCannotNull=实例编号或单元编码+业务编号不能为空\neasyflow.process.admin.page.processUnitExecutionList.processUnitCodeCannotNull=单元编码不能为空\neasyflow.process.admin.page.processUnitExecutionList.timeRangeCannotNull=范围查询时开始时间和结束时间不能为空\neasyflow.process.admin.page.processUnitExecutionList.startTimeCannotGtEndTime=请求开始时间不能大于请求结束时间\neasyflow.process.admin.page.processUnitExecutionList.TimeRangeCannotGt30Days=查询时间范围不能大于30天\neasyflow.process.admin.page.processUnitExecutionList.executionNo=执行编号\neasyflow.process.admin.page.processUnitExecutionList.requestNo=请求编号\neasyflow.process.admin.page.processUnitExecutionList.processUnitCode=单元编码\neasyflow.process.admin.page.processUnitExecutionList.bizNo=业务编号\neasyflow.process.admin.page.processUnitExecutionList.result=结果\neasyflow.process.admin.page.processUnitExecutionList.resultSuccess=成功\neasyflow.process.admin.page.processUnitExecutionList.resultFail=失败\neasyflow.process.admin.page.processUnitExecutionList.resultDoing=进行中\neasyflow.process.admin.page.processUnitExecutionList.resultException=异常\neasyflow.process.admin.page.processUnitExecutionList.requestContent=请求内容\neasyflow.process.admin.page.processUnitExecutionList.responseContent=响应内容\neasyflow.process.admin.page.processUnitExecutionList.execType=执行类型\neasyflow.process.admin.page.processUnitExecutionList.requestTime=请求时间\neasyflow.process.admin.page.processUnitExecutionList.responseTime=响应时间\neasyflow.process.admin.page.processUnitExecutionList.elapseTime=耗时\neasyflow.process.admin.page.processUnitExecutionList.extData=扩展数据\neasyflow.process.admin.page.processUnitExecutionList.createdDate=创建时间\neasyflow.process.admin.page.processUnitExecutionList.modifiedDate=更新时间\neasyflow.process.admin.page.processUnitExecutionList.nextPage=下一页\n\neasyflow.process.admin.page.processUnitInstanceList.instanceManagement=处理单元实例管理\neasyflow.process.admin.page.processUnitInstanceList.queryType=查询类型\neasyflow.process.admin.page.processUnitInstanceList.queryByInstance=按实例查询\neasyflow.process.admin.page.processUnitInstanceList.queryByInstanceTip=输入实例编号或单元编码+业务编码查询\neasyflow.process.admin.page.processUnitInstanceList.queryByTime=按时间范围查询\neasyflow.process.admin.page.processUnitInstanceList.queryByTimeTip=输入单元编码、时间范围和其他条件查询\neasyflow.process.admin.page.processUnitInstanceList.onlyFirstPageSupport=仅支持查第一页\neasyflow.process.admin.page.processUnitInstanceList.queryProcessUnitCode=单元编码\neasyflow.process.admin.page.processUnitInstanceList.querySelect=请选择\neasyflow.process.admin.page.processUnitInstanceList.queryBizNo=业务编号\neasyflow.process.admin.page.processUnitInstanceList.queryInstanceNo=实例编号\neasyflow.process.admin.page.processUnitInstanceList.queryCreatedDateStart=创建时间起\neasyflow.process.admin.page.processUnitInstanceList.queryCreatedDateEnd=创建时间止\neasyflow.process.admin.page.processUnitInstanceList.queryResult=结果\neasyflow.process.admin.page.processUnitInstanceList.queryResultSuccess=成功\neasyflow.process.admin.page.processUnitInstanceList.queryResultFail=失败\neasyflow.process.admin.page.processUnitInstanceList.queryResultDoing=进行中\neasyflow.process.admin.page.processUnitInstanceList.queryResultException=异常\neasyflow.process.admin.page.processUnitInstanceList.queryBtn=查询\neasyflow.process.admin.page.processUnitInstanceList.instanceList=处理单元实例列表\neasyflow.process.admin.page.processUnitInstanceList.dateFormatInvalid=日期时间格式不正确\neasyflow.process.admin.page.processUnitInstanceList.instanceInfoCannotNull=实例编号或单元编码+业务编号不能为空\neasyflow.process.admin.page.processUnitInstanceList.processUnitCodeCannotNull=单元编码不能为空\neasyflow.process.admin.page.processUnitInstanceList.timeRangeCannotNull=范围查询时开始时间和结束时间不能为空\neasyflow.process.admin.page.processUnitInstanceList.createdDateStartCannotGtEnd=请创建时间起始日不能大于结束日\neasyflow.process.admin.page.processUnitInstanceList.TimeRangeCannotGt30Days=查询时间范围不能大于30天\neasyflow.process.admin.page.processUnitInstanceList.instanceNo=实例编号\neasyflow.process.admin.page.processUnitInstanceList.processUnitCode=单元编码\neasyflow.process.admin.page.processUnitInstanceList.bizNo=业务编号\neasyflow.process.admin.page.processUnitInstanceList.productCode=产品编码\neasyflow.process.admin.page.processUnitInstanceList.result=结果\neasyflow.process.admin.page.processUnitInstanceList.resultSuccess=成功\neasyflow.process.admin.page.processUnitInstanceList.resultFail=失败\neasyflow.process.admin.page.processUnitInstanceList.resultDoing=进行中\neasyflow.process.admin.page.processUnitInstanceList.resultException=异常\neasyflow.process.admin.page.processUnitInstanceList.requestContent=请求内容\neasyflow.process.admin.page.processUnitInstanceList.responseContent=响应内容\neasyflow.process.admin.page.processUnitInstanceList.autoRuntimes=自动执行次数\neasyflow.process.admin.page.processUnitInstanceList.autoRunFlag=自动执行标识\neasyflow.process.admin.page.processUnitInstanceList.nextAutoRunTime=下次执行时间\neasyflow.process.admin.page.processUnitInstanceList.vars=变量\neasyflow.process.admin.page.processUnitInstanceList.extData=扩展数据\neasyflow.process.admin.page.processUnitInstanceList.createdDate=创建时间\neasyflow.process.admin.page.processUnitInstanceList.modifiedDate=更新时间\neasyflow.process.admin.page.processUnitInstanceList.nextPage=下一页\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/css/common.css",
    "content": "html, body {\n    font-size: 12px;\n}\n/* Sticky footer styles\n-------------------------------------------------- */\nhtml {\n    position: relative;\n    min-height: 100%;\n}\nbody {\n    margin-bottom: 60px;\n    margin-top: 100px;\n    background-color: #fff;\n    font-family: Microsoft YaHei,tahoma,arial,Hiragino Sans GB,\\\\5b8b\\4f53,sans-serif;\n}\n\n@media ( min-width :768px) {\n    body {\n        margin-top: 48px;\n    }\n}\n\n.multiselect {\n    color:#495057 !important;\n    background-color:#fff !important;\n    border-color:rgb(206, 212, 218) !important;\n}\n/*jquery validate*/\n.error {\n  color: red;\n  margin: 0;\n}\n\n.j-form-horizontal .form-group>label.error {\n\t/*width:100%;*/\n\ttext-align:left;\n\t/*padding-left:90px;*/\n}\n\n/*Form setting*/\n.j-form-horizontal .form-group {\n    display: flex;\n    align-items:flex-start;\n    flex-wrap:nowrap;\n}\n.j-form-horizontal .form-group>label {\n        padding-right:4px;\n        width:88px;\n        white-space: nowrap;\n        text-align:right;\n        margin:0;\n        line-height:2.5rem;\n        padding-bottom:0.5rem;\n        padding-right:2px;\n}\n.j-form-horizontal .form-group>.form-control,\n.j-form-horizontal .form-group>.input-group,\n.j-form-horizontal .form-group>.multiselect-native-select {\n        flex:1;\n}\n\n\n.j-info-container {\n    margin-top:1rem;\n}\n/*text info*/\n.j-info-group {\n    display:flex;\n    flex-flow:row;\n    flex-wrap:wrap;\n}\n.j-info-group dt {\n    text-align:right;\n    width:80px;\n}\n\n.j-info-group dd {\n    flex:1;\n    margin-left:5px;\n    word-wrap: break-word;\n    word-break: break-all;\n}\n\n/*Required*/\n.j-require {\n\tcolor:red;\n}\n/*loading*/\n#jloading {\n  position: fixed;\n  left: 0;\n  z-index: 10000;\n  display: none;\n}\n#jloading i{\n  position: absolute;\n}\n/*tooltip*/\n.j-tip {\n  position: fixed;\n  padding: 3px 5px;\n  background: #6495ed;\n  margin: 0 auto;\n  text-align: center;\n  width: auto;\n  color: #ffffff;\n  opacity: 0.8;\n  cursor: move;\n  z-index: 10000;\n}\n\n.bootstrap-table a.j-op {\n\tcolor:rgb(0, 123, 255);\n\tcursor:pointer;\n\t white-space:nowrap;\n}\n.bootstrap-table a.j-op:hover {\n\tcolor:#0056b3;\n\ttext-decoration:underline;\n}\n\n.bootstrap-table button.j-op {\n    white-space:nowrap;\n}\n\n.contentSider {\n\tpadding-left: 5px;\n}\n\n.sider-control {\n\tposition:absolute;\n\tleft:-10px;\n\ttop:10px;\n\tz-index:200;\n\tcursor:pointer;\n}\n\n.j-element-config .form-group.col {\n\tpadding-left:5px;\n\tpadding-right:5px;\n}\n\n.j-page-container .card-header {\n\tpadding:0.5rem 1.25rem\n}\n\n.j-page-container .card-body {\n\tmargin-bottom: 0;\n\tpadding:1.25rem 1.25rem 0 1.25rem;\n}\n.j-page-container .form-group {\n\tmargin-bottom:0.75rem;\n}\n.j-mask-input {\n\tcursor:pointer;\n\tposition:absolute;\n\tright:20px;\n\ttop:32px;\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/css/frame.css",
    "content": "#navbar {\n    border-bottom:1px solid #DFDFDF;\n    z-index:1000;\n    background-color: #fff;\n    padding-bottom:0\n}\n.navbar-showside {\n\tborder-color:#ddd;\n}\n.li-level-1 {\n    font-size:14px;\n}\n/* Top Navigation */\n.top-nav {\n    padding: 0 15px;\n    font-size:14px;\n}\n\n.top-nav>li {\n    display: inline-block;\n    float: left;\n}\n\n.top-nav>li>a {\n    padding-top: 15px;\n    padding-bottom: 15px;\n    line-height: 20px;\n    color: #333;\n}\n\n.top-nav>.open>.dropdown-menu {\n    float: left;\n    position: absolute;\n    margin-top: 0;\n    border: 1px solid rgba(0, 0, 0, .15);\n    border-top-left-radius: 0;\n    border-top-right-radius: 0;\n    background-color: #fff;\n    -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n    box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n}\n\n.top-nav>.open>.dropdown-menu>li>a {\n    white-space: normal;\n}\n\n@media ( min-width :768px) {\n    .side-nav {\n        position: fixed;\n        top: 48px;\n        left: 225px;\n        width: 225px;\n        margin-left: -225px;\n        border: none;\n        min-height:calc(100vh - 48px);\n        height:calc(100vh - 48px);  \n        border-radius: 0;\n        overflow-y: auto;\n        background-color: #fff;\n        overflow-x: hidden;\n        padding-bottom: 40px;\n        flex-wrap: nowrap;\n    }\n    .side-nav .nav {\n        flex-wrap: nowrap;\n    }\n    .side-nav>li>a {\n        width: 225px;\n    }\n    .side-nav>li {\n        border-bottom: 1px solid #e7e7e7;\n    }\n    .side-nav li a:hover {\n        outline: none;\n        background-color: #E3EEFF !important;\n    }\n}\n\n\n\n.side-nav>li>ul {\n    padding: 0;\n}\n\n.side-nav>li>ul>li>a {\n    display: block;\n    padding: 10px 15px 10px 38px;\n    text-decoration: none;\n    color: #666666;\n}\n\n.side-nav>li>ul>li>a:hover {\n    color: #007BFF;\n}\n\n.side-nav {\n    background-color: #F5F7FB;\n}\n.side-nav .li-level-1 {\n    color:#666666;\n    padding:1rem 1rem;\n}\n.li-level-1>span{\n\tfloat:right;\n\tpadding-right:20px;\n\tfont-size:12px;\n}\n.li-level-1 .fa-fw {\n    padding-right:22px;\n}\n.li-level-1.active .fa-fw {\n\tcolor: #007BFF;\n}\n\n.side-nav ul li a.active {\n    background-color: #E3EEFF;\n    color: #007BFF;\n    border-right:3px solid #007BFF;\n    font-weight:600;\n}\n\n\n@media ( max-width :768px) {\n    .navbar-sideholder {\n        display: none\n    }\n}\n\n.navbar-sideholder {\n    position: fixed;\n    top: 51px;\n    left: 20px;\n    margin-left: -20px;\n    border: none;\n    border-radius: 0;\n    overflow-y: auto;\n    background-color: transparent;\n    bottom: 0;\n    overflow-x: hidden;\n    padding-bottom: 40px;\n    width: 20px;\n    height: 100%;\n}\n\n.side-nav .sidebar-search {\n    padding: 10px;\n}\n\nli.full:before {\n    content: '\\00a0' !important;\n    padding: 0 5px;\n    color: #ccc;\n}\n\nli.full>a.active {\n    color: #9d9d9d;\n}\n\n\nbody > .container {\n    padding: 60px 15px 0;\n}\n\n.footer {\n    position: absolute;\n    text-align: center;\n    bottom: 0;\n    width: 100%;\n    /* Set the fixed height of the footer here */\n    height: 65px;\n}\n\n.footer > .container {\n    padding-right: 15px;\n    padding-left: 15px;\n}\n\n\n#wrapper {\n    padding-left: 0;\n}\n\n#page-wrapper {\n    width: 100%;\n    padding: 0;\n    background-color: #fff;\n}\n\n@media ( min-width :768px) {\n    #wrapper {\n        padding-left: 225px;\n    }\n    #page-wrapper {\n        padding: 10px;\n    }\n}\n\n/* Flot Chart Containers */\n.flot-chart {\n    display: block;\n    height: 400px;\n}\n\n.flot-chart-content {\n    width: 100%;\n    height: 100%;\n}\n\n.j-iframe #navbar {\n\tdisplay:none;\n}\n.j-iframe #side-menu {\n\tdisplay:none !important;\n}\n.j-iframe .navbar-sideholder {\n\tdisplay:none;\n}\n.j-iframe #wrapper {\n\tpadding-left:0 !important;\n}\n.j-iframe {\n\tmargin-top:0;\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/js/biz.js",
    "content": "J.FsmInput=function(option) {\n    this.$container = option.container;\n    this.$innerContainer = $(\"<div></div>\").appendTo(this.$container);    \n    this.name = option.name;\n    this.jTableSelect = new JTableSelect({\n        container:this.$innerContainer,\n        name:this.name + \"_val\",\n        inputFieldName:this.name,\n        valueColumn:\"defId\",\n        editable:true,\n        url:$.getBaseUrl()+\"/easyflow/processDefinition/ajax/processSelectFrame\"\n    });\n    this.render=function() {\n        var _self = this;\n        this.jTableSelect.render();\n        this.$innerContainer.find(\".input-group-append\").append('<button class=\"btn btn-outline-secondary j-fsm-view\" type=\"button\">' + J.msg['common.view'] + '</button>');\n        this.$innerContainer.find(\".j-fsm-view\").click(function() {\n            var defId = _self.jTableSelect.$inputField.val();\n            J.openWindow($.getBaseUrl() + \"/easyflow/processDefinition/detail?defId=\" + defId + \"&latest=true\",\"_blank\", \"\", \"\");\n        });\n    }\n};\n$.fn.jFsmInput=function(option) {\n if (!option) {\n     option = {};\n }\nif (typeof option !== 'string') {\n    option.container = this;\n    var fsmInput = new J.FsmInput(option);\n    option.container.data(\"jFsmInput\",fsmInput);\n    fsmInput.render();\n  } else {\n      if (option == \"setValue\") {\n          this.data(\"jFsmInput\").setValue();\n      }\n  }\n};\n\nJ.FlowInput=function(option) {\n    this.$container = option.container;\n    this.$innerContainer = $(\"<div></div>\").appendTo(this.$container);    \n    this.name = option.name;\n    this.jTableSelect = new JTableSelect({\n        container:this.$innerContainer,\n        name:this.name + \"_val\",\n        inputFieldName:this.name,\n        valueColumn:\"defId\",\n        editable:true,\n        url:$.getBaseUrl()+\"/easyflow/processDefinition/ajax/processSelectFrame\"\n    });\n    this.render=function() {\n        var _self = this;\n        this.jTableSelect.render();\n        this.$innerContainer.find(\".input-group-append\").append('<button class=\"btn btn-outline-secondary j-flow-view\" type=\"button\">' + J.msg['common.view'] + '</button>');\n        this.$innerContainer.find(\".j-flow-view\").click(function() {\n            var defId = _self.jTableSelect.$inputField.val();\n            J.openWindow($.getBaseUrl() + \"/easyflow/processDefinition/detail?defId=\" + defId + \"&latest=true\",\"\", \"\", \"\");\n        });\n    }\n};\n$.fn.jFlowInput=function(option) {\n if (!option) {\n     option = {};\n }\nif (typeof option !== 'string') {\n    option.container = this;\n    var flowInput = new J.FlowInput(option);\n    option.container.data(\"jFlowInput\",flowInput);\n    flowInput.render();\n  } else {\n      if (option == \"setValue\") {\n          this.data(\"jFlowInput\").setValue();\n      }\n  }\n};\n\nJ.MaskInput=function(option) {\n    this.$input = option.$input;\n    var plaintextFunc = option.plaintextFunc;\n    this.render=function() {\n        var $input = this.$input;\n        var $icon = $('<i class=\"j-mask-input fa fa-eye-slash\"></i>').insertAfter(this.$input);\n        $icon.click(function(){\n            if (!$input.data('j-masktext')) {\n                $input.data('j-masktext', $input.val());\n            }\n            if (!$input.data('j-plaintext-call')) {\n                  plaintextFunc.call(this, function(data){\n                      $input.data('j-plaintext', data.plaintext);\n                      $icon.removeClass('fa-eye-slash').addClass('fa-eye');\n                      $input.val($input.data('j-plaintext'));\n                      $input.data('j-plaintext-call', 'true');\n                  });\n            } else {\n                if ($icon.hasClass('fa-eye-slash')) {\n                    $icon.removeClass('fa-eye-slash').addClass('fa-eye');\n                    $input.val($input.data('j-plaintext'));\n                } else {\n                    $icon.removeClass('fa-eye').addClass('fa-eye-slash');\n                    $input.val($input.data('j-masktext'));\n                }\n            }\n            \n        });\n        \n    }\n};\n\n$.fn.jMaskInput=function(option) {\n if (!option) {\n     option = {};\n }\nif (typeof option !== 'string') {\n    option.$input = this;\n    var maskInput = new J.MaskInput(option);\n    maskInput.render();\n  } else {\n        // NOOP\n  }\n};"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/js/common.js",
    "content": "if (! window.J) {\n  window.J = {};\n}\n(function (J) {\n// bootstrap datatable plugin default setting.\n$.fn.bootstrapTable && $.extend($.fn.bootstrapTable.defaults, {\n    pagination : true,\n    pageList:[10,25,100],\n    sidePagination : \"server\",\n    locale : J.msg['locale'],\n    cache : false,\n    clickToSelect : true,\n    showRefresh : true,\n    showColumns : true,\n    queryParamsType: \"\",\n    escape:true,\n    ajaxOptions : {\n        traditional: true\n    },\n    responseHandler : function(res) {\n        return {\n            total : res.resultData.count,\n            rows : res.resultData.list\n        }\n    },\n});\n\n// jquery datetimepicker default setting\n$.fn.datetimepicker && ($.fn.datetimepicker.defaults={\n        fontAwesome:true,\n        format : \"yyyy-mm-dd\",\n        minView : \"month\",\n        autoclose : 1,\n        language:J.msg['locale'],\n        todayBtn:true\n})\n\n// bootstrap multiselect default setting\n$.fn.multiselect && $.extend($.fn.multiselect.Constructor.prototype.defaults, {\n    nonSelectedText:J.msg['multiselect.nonSelectedText'],\n    nSelectedText:J.msg['multiselect.nSelectedText'],\n    allSelectedText:J.msg['multiselect.allSelectedText:msg'],\n    filterPlaceholder:J.msg['multiselect.filterPlaceholder'],\n    selectAllText:J.msg['multiselect.selectAllText'],\n    includeSelectAllOption: true,\n    buttonWidth:\"100%\",\n    filterBehavior:\"both\",\n    numberDisplayed:2,\n    maxHeight: 200\n});\n\n\n\n/*Get form original data*/\n   $.fn.serializeObject = function() {\n       \"use strict\";\n       var result = {};\n       var extend = function(i, element) {\n           var node = result[element.name];\n           if ('undefined' !== typeof node && node !== null) {\n               if ($.isArray(node)) {\n                   node.push(element.value);\n               } else {\n                   result[element.name] = [node, element.value];\n               }\n           } else {\n               result[element.name] = element.value;\n           }\n       };\n\n       $.each(this.serializeArray(), extend);\n       return result;\n   };\n// ====jquery validate====  \n   if(jQuery.validator) {\n        $.validator.setDefaults({\n            ignore:\"\",\n            errorPlacement: function(error, element) {\n                if(element.is(\".dtselect\")) {\n                    error.insertAfter(element.parent());\n                } else {\n                    error.insertAfter(element); \n                }\n            },\n            onfocusout: function( element ) {\n                if (!this.checkable( element ) && \"file\" != element.type) {\n                    this.element( element );\n                }\n            }\n            });\n        /**Date validate*/\n        jQuery.validator.addMethod(\"strictDate\", function(value, element, param) {\n            if (value == null || value==\"\") {\n                return true;\n            }\n            var r = value.match(/^(\\d{1,4})(-|\\/)(\\d{1,2})\\2(\\d{1,2})$/);\n            if(r==null) return false;\n            var d = new Date(r[1], r[3]-1,r[4]);\n            return (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]);\n        }, $.validator.format(J.msg['jqueryValidate.strictDate']));\n        /**JSON format validate*/\n        jQuery.validator.addMethod(\"json\", function(value, element) {\n            if (value == null || value==\"\") {\n                return true;\n            }\n            try {\n                var obj=JSON.parse(value);\n                return typeof obj == 'object' && obj;\n            } catch (err) {\n                console.log(\"not json:\" + value);\n                return false;\n            }\n        }, $.validator.format(J.msg['jqueryValidate.json']));     \n        \n        jQuery.validator.addMethod(\"fileinputRequiredByPreview\", function(value, element) {\n            var preview = $(element).fileinput(\"getPreview\");\n            if (preview != null && preview.config!=null && preview.config.length>0) {\n                return true;\n            }\n            return false;\n            \n        }, $.validator.format(J.msg['jqueryValidate.fileInput']));          \n\n    jQuery.extend(jQuery.validator.messages, {\n        required: J.msg[\"jqueryValidate.required\"],\n        remote: J.msg[\"jqueryValidate.remote\"],\n        email: J.msg[\"jqueryValidate.email\"],\n        url: J.msg[\"jqueryValidate.url\"],\n        date: J.msg[\"jqueryValidate.date\"],\n        dateISO: J.msg[\"jqueryValidate.dateISO\"],\n        number: J.msg[\"jqueryValidate.number\"],\n        digits: J.msg[\"jqueryValidate.digits\"],\n        creditcard: J.msg[\"jqueryValidate.creditcard\"],\n        equalTo: J.msg[\"jqueryValidate.equalTo\"],\n        accept: J.msg[\"jqueryValidate.accept\"],\n        maxlength: jQuery.validator.format(J.msg[\"jqueryValidate.maxlength\"]),\n        minlength: jQuery.validator.format(J.msg[\"jqueryValidate.minlength\"]),\n        rangelength: jQuery.validator.format(J.msg[\"jqueryValidate.rangelength\"]),\n        range: jQuery.validator.format(J.msg[\"jqueryValidate.range\"]),\n        max: jQuery.validator.format(J.msg[\"jqueryValidate.max\"]),\n        min: jQuery.validator.format(J.msg[\"jqueryValidate.min\"])\n    });\n    }\n    \n    // Get Current date\n    J.getNowDate=function(sep1) {\n        var date = new Date();\n            var seperator1 = sep1!==undefined ? sep1 : \"-\";\n        var month = date.getMonth() + 1<10? \"0\"+(date.getMonth() + 1):date.getMonth() + 1;\n        var strDate = date.getDate()<10? \"0\" + date.getDate():date.getDate();\n        var currentdate = date.getFullYear() + seperator1  + month  + seperator1  + strDate;\n        return currentdate;\n    }\n\n    J.getNowDatetime=function(sep1, sep2, sep3) {\n            var date = new Date();\n            var seperator1 = sep1!==undefined ? sep1 : \"-\";\n            var seperator2 = sep2!==undefined ? sep2 : \" \";\n            var seperator3 = sep3!==undefined ? sep3 : \":\";\n            var month = date.getMonth() + 1<10? \"0\"+(date.getMonth() + 1):date.getMonth() + 1;\n            var strDate = date.getDate()<10? \"0\" + date.getDate():date.getDate();\n\n            var hours = date.getHours()<10? \"0\" + date.getHours():date.getHours();\n            var min  = date.getMinutes()<10? \"0\" + date.getMinutes():date.getMinutes();\n            var seconds = date.getSeconds()<10? \"0\" + date.getSeconds():date.getSeconds();\n            var currentdate = date.getFullYear() + seperator1  + month  + seperator1  + strDate  + seperator2 + hours + seperator3 + min + seperator3 + seconds;\n            return currentdate;\n    }\n\n   })(window.J);\n   \n// ====JTabs====\n$.fn.jTabs=function(option, extOption) {\n    // Create tab\n    if (typeof option !== 'string') {\n        // Construct tabs\n        this.append('<ul class=\"nav nav-tabs\" id=\"tab\" role=\"tablist\" style=\"display:none\"></ul>')\n            .append('<div class=\"tab-content\" id=\"tab-content\"></div>');\n\n    } else {\n        if (option == 'open') {\n            // Open tab\n            var tabId = (extOption.id).replace(/\\./g,\"\");\n            var $tabs = this.find(\".nav-tabs\");\n            var $content = this.find(\".tab-content\");\n            var panelId = \"panel_\" + tabId;\n            if ($(\"#\"+tabId).length==0) {\n                var tabName = extOption.name ? extOption.name : extOption.id;\n                var closeBtn = extOption.closeable!==false ? \"<button type='button' class='close'><span>&times;</span></button>\":\"\";\n                $tabs.append(\"<li class='nav-item'><a class='nav-link' id='\" + tabId +\"' data-toggle='tab' href='#\" + panelId +  \"' role='tab'>\"+tabName+closeBtn + \"</a></li>\");\n                $content.append(\"<div class='tab-pane' id='\" +  panelId + \"' role='tabpanel'></div>\");\n                // element is jquery type.\n                if (extOption.element != null) {\n                    $(\"#\"+panelId).append(extOption.element);\n                // ajax url type\n                } else {\n                $(\"#\"+panelId).load(extOption.url);\n                }\n            }\n            if ($tabs.children(\".nav-item\").length>1) {\n                $tabs.show();\n            }\n            $(\"#\"+tabId).tab('show');\n        }\n    }\n    return this;\n}\n    \n    // tab close button\n$(function(){\n    $(\"body\").on(\"click\", \".nav-tabs .close\", function(){\n    var tab = $(this).parent().parent();\n    var panel = $($(this).parent().attr(\"href\"));\n    var tabs = tab.parent();\n    var active = $(this).parent().hasClass(\"active\");\n    tab.remove();\n    panel.remove();\n    if (active) {\n        tabs.find(\"[role='tab']:eq(0)\").tab(\"show\");\n    }\n      if(tabs.children(\"li\").length==1) {\n          tabs.hide();\n       }\n    \n  });\n});\n\n// ajax success callback\nvar _ajaxSuccessCallback = function(data, option, $element) {\n      var resCode = data.resultCode;\n      var showMsg = data.resultMsg;\n      var extData = data.extData;\n      var successUrl = option.successUrl;\n      if (data.extData && data.extData.successUrl) {\n            successUrl = data.extData.successUrl;\n      }\n      // Success response\n      if (resCode == null || resCode == \"0000000\") {          \n          // Tip success in page.\n          if (showMsg === null || showMsg === '') {\n              showMsg = J.msg['ajaxSuccessCallback.successShowMsg'];\n          }\n         $.jPageTip(showMsg);\n         // redirect URL\n         if (successUrl != null) {\n             window.location.href=successUrl;\n             return;\n         }\n         // Close dialog\n         var $dialog = $element != null ? $element.parents(\".modal\"):null;\n         if ($dialog!=null && $dialog.length > 0) {\n           $dialog.modal('hide').modal(\"dispose\").remove();\n         }\n         // Refresh table\n         var $bstable = $(\"body\").find(\".bootstrap-table\");\n         if ($bstable.length > 0) {\n             $bstable.find(\".table\").bootstrapTable(\"refresh\");\n         }\n      // Fail response\n      } else if (resCode = '0000002') {\n        if (showMsg != null) {\n            $.jMessage({\n                title : '&nbsp;',\n                msg : showMsg\n            });\n        }\n        // Has error\n        var fieldErrors = extData == null ? null : extData[\"fieldErrors\"];\n        if (fieldErrors != null) {\n            for (var i = 0; i < fieldErrors.length; i++) {\n                $.jFormTip($element, fieldErrors[i].field, fieldErrors[i].msg);\n            }\n        }\n    } else {\n        // show exception in dialog\n        if (showMsg === null || showMsg === '') {\n            showMsg = J.msg['ajaxSuccessCallback.exceptionShowMsg'];;\n        }\n        $.jMessage({\n            title : '&nbsp;',\n            msg : showMsg\n        });\n    }\n      \n  };\n  \n  \n  $.extend({\n        getNowDate:function() {\n            var date = new Date();\n            var seperator1 = \"-\";\n            var month = date.getMonth() + 1<10? \"0\"+(date.getMonth() + 1):date.getMonth() + 1;\n            var strDate = date.getDate()<10? \"0\" + date.getDate():date.getDate();\n            var currentdate = date.getFullYear() + seperator1  + month  + seperator1  + strDate;\n            return currentdate;\n        },\n        getBaseUrl: function () {\n            if ($._baseUrl) return $._baseUrl;\n            var commonCss = '/static/css/common.css';\n            var scriptTags = document.getElementsByTagName('link');\n            if (scriptTags.length <= 0) return;\n            for (var i = 0; i < scriptTags.length; i++) {\n                var src = scriptTags[i].href;\n                if (src.indexOf(commonCss) > -1) {\n                    $._baseUrl = src.substring(0, src.indexOf(\"/static\"));\n                    return $._baseUrl;\n                }\n            }\n        },\n        jSequence : {\n                   current: 1000,\n                   next: function () {\n                       return this.current++;\n                   }\n         },\n      //====Config====\n      jConfig : {\n                loading : {\n                    top:45,\n                    left:225\n                }   \n            },   \n     //====Loading====\n        jLoading: {\n            entity: null,\n            count : 0,\n            show: function () {\n                if (this.entity == null) {\n                    $(\"body\").append(\"<div id='jloading'><i class='fa fa-spinner fa-pulse' style='font-size:5rem'></i></div>\");\n                    this.entity = $(\"#jloading\");\n                }\n                var top = $.jConfig.loading.top;\n                var left = $.jConfig.loading.left;\n                this.entity.css({top:top, left: left, width: $(\"body\").width() - left, height: $(\"body\").height() - top, background: \"none\"});\n                this.entity.find(\"i\").hide();\n                this.entity.show();\n\n                var _self=this;\n                var pointer = {};\n                this.count++;\n                var timer = setTimeout(function () {\n                    _self.entity.find(\"i\").css({top: 200, left: ($(window).width() - $.jConfig.loading.left - 100) / 2}).show();\n                    _self.entity.css({background: \"#FFFFFF\"}).fadeTo(\"fast\", 0.3);\n                }, 1000);\n                pointer.timer = timer;\n                return pointer;\n            },\n            hide: function (pointer) {\n                clearTimeout(pointer.timer);\n                this.count--;\n                if(this.count == 0) {\n                    this.entity.hide();\n                }\n            }\n        },  \n      // JMsg\n      jMessage:function(option){\n          var popId = \"pop_\" + $.jSequence.next();\n          var title = option.title ? option.title : \"&nbsp;\";\n          $(\"body\").append(\"<div id='\" + popId + \"' class='modal' tabindex='-1' role='dialog'>\" + \n                              \"<div class='modal-dialog' role='document'>\" + \n                                \"<div class='modal-content'>\" + \n                                   \"<div class='modal-header'><h5 class='modal-title'>\" + title + \"</h5><button type='button' class='close' data-dismiss='modal' aria-label='Close'><span>&times;</span></button></div>\" +\n                                   \"<div class='modal-body'><p>\" + option.msg + \"</p></div>\" + \n                                   \"<div class='modal-footer'><button type='button' class='btn btn-secondary j-btn-close' data-dismiss='modal'>\" + J.msg['jDialog.close'] + \"</button></div>\" +\n                                \"</div>\" + \n                               \"</div>\" + \n                            \"</div>\");\n          var $element = this.$element = $(\"#\" + popId);\n          this.$element.modal().on(\"hidden.bs.modal\", function(){\n              $element.modal(\"dispose\");\n              $element.remove();\n              if(option.callback) {\n                  option.callback.call(window);\n              }\n          });\n      },\n      // ====JConfirm====\n      jConfirm:function(option){\n          var popId = \"pop_\" + jQuery.jSequence.next();\n          var title = option.title ? option.title : \"\";\n          $(\"body\").append(\"<div id='\" + popId + \"' class='modal' tabindex='-1' role='dialog'>\" + \n                  \"<div class='modal-dialog' role='document'>\" + \n                    \"<div class='modal-content'>\" + \n                       \"<div class='modal-header'><h5 class='modal-title'>\" + title + \"</h5><button type='button' class='close' data-dismiss='modal' aria-label='Close'><span>&times;</span></button></div>\" +\n                       \"<div class='modal-body'><p>\" + option.msg + \"</p></div>\" + \n                       \"<div class='modal-footer'><button type='button' class='btn btn-primary j-btn-ok'>\" + J.msg['jDialog.confirm'] + \"</button><button type='button' class='btn btn-secondary' data-dismiss='modal'>\" + J.msg['jDialog.cancel'] + \"</button></div>\" + \n                    \"</div>\" + \n                   \"</div>\" + \n                \"</div>\");\n        var $element = $(\"#\" + popId);\n        $element.modal();\n        $element.on(\"hidden.bs.modal\", function(){\n            $element.modal(\"dispose\").remove();\n        });\n         $(\"#\" + popId + \" .j-btn-ok\").click(function () {\n             $element.modal(\"hide\");\n           if(option.callback) {\n            option.callback.call(window);\n           }\n       });  \n      },\n      // ====JDialog====\n    jDialog: function(option) {\n        var title = option.title;\n        var size = option.size ? option.size : \"modal-xl\";\n        var $dialog = $('<div class=\"modal\" tabindex=\"-1\" role=\"dialog\">' + \n                  '<div class=\"modal-dialog  modal-dialog-scrollable ' + size + '\" role=\"document\" >' +\n                    '<div class=\"modal-content\">' + \n                      '<div class=\"modal-header\">' + \n                        '<h5 class=\"modal-title\">' + option.title + '</h5>' +\n                        '<button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\">' +\n                          '<span aria-hidden=\"true\">&times;</span>' + \n                        '</button>' + \n                      '</div>' + \n                      '<div class=\"modal-body\">' + \n                      '</div>' +\n                    '</div>' +\n                  '</div>' + \n                '</div>').appendTo($(\"body\"));\n        if(option.element != null) {\n        $dialog.find(\".modal-body\").append(option.element);\n        option.success && option.success.call($dialog);\n        $dialog.modal(\"handleUpdate\");\n        } else if (option.url != null) {\n            $dialog.find(\".modal-body\").load(option.url, function(response){\n                option.success && option.success.call($dialog);\n                $dialog.modal(\"handleUpdate\");\n            });\n        }\n          $dialog.on(\"hidden.bs.modal\", function(){\n            $dialog.modal(\"dispose\");\n            $dialog.remove();\n          });\n       $dialog.on(\"click\", \".j-btn-cancel\", function(){\n           $dialog.modal(\"hide\");\n       });\n       if (option.action) {\n           option.action.call(this, $dialog);\n       }\n        $dialog.modal();\n        \n    },\n    // Compare dialog\n    jDiffDialog : function(option) {\n        var element = `\n<div class=\"row\">\n    <div class=\"col j-diff-left\"><label>${option.left.title}:</label><textarea class=\"bpmnDef form-control\" rows=\"30\" readonly=\"readonly\"></textarea></div>\n    <div class=\"col j-diff-right\"><label>${option.right.title}:</label><textarea class=\"bpmnDef form-control\" rows=\"30\" readonly=\"readonly\"></textarea></div>\n</div>        \n        `;\n        option.element = element;\n        option.action = ($dialog)=>{\n            $dialog.find(\".j-diff-left textarea\").text(option.left.content);\n            $dialog.find(\".j-diff-right textarea\").text(option.right.content);\n        }\n        $.jDialog(option);\n    },\n      //====JFormTip====\n      jFormTip:function () {\n            if (arguments.length == 2) {\n                var form = arguments[0];\n                var tips = arguments[1];\n                $.jMessage({msg: tips});\n            } else {\n                var form = arguments[0];\n                var field = arguments[1];\n                var tips = arguments[2];\n                var error = {};\n                error[field] = tips;\n                form.validate().showErrors(error);\n            }\n        },\n     //====jPageTip====\n    jPageTip:function(tips){\n        var windowWidth = document.documentElement.clientWidth;\n        var $element = $(\"body\").find(\".jtip\");\n        if ($element.length==0) {\n            $element = $(\"<div class='j-tip'><span class='j-tip-content'></span></div>\").appendTo(\"body\");\n            $element.css({display: \"none\", 'top': 100 + 'px', 'left': ( windowWidth / 2 ) + 'px'});\n        }\n        $element.find(\".j-tip-content\").html(tips);\n        $element.show()\n        .fadeTo(\"fast\", 1.0, function () {\n            setTimeout(function () {\n                $element.fadeTo(\"slow\", 0, function () {\n                    $(this).hide();\n                });\n            }, 2000);\n        });\n    },\n    //====jAjax\n    jAjax : function (option, $element) {\n        var confirm = option.confirm;\n        \n        var type = option.type;\n        if (! type) {\n            type=\"GET\";\n        }\n        var loading = null;\n        \n        var ajaxCall = function() {\n            loading = $.jLoading.show();\n            $.ajax({\n                cache: false,\n                type: type,\n                url: option.url,\n                data: option.data,\n                traditional: true,\n                dataType: \"text\",\n                success: function (data) {\n                    data = (data == null || data == '') ? {}:$.parseJSON(data);\n                    $.jLoading.hide(loading);\n                    if (option.success) {\n                        option.success.call(window, data);\n                    } else {\n                        _ajaxSuccessCallback.call(window, data, option, $element);\n                    }\n                },\n                error: function () {\n                    $.jLoading.hide(loading);\n                    $.jMessage({title: '&nbsp;', msg: J.msg['jAjax.requestException']});\n                }\n            });\n        };\n        \n           // Has confirm dialog\n           if (confirm) {\n             $.jConfirm({msg:confirm, callback:function(){\n                ajaxCall();\n            }});\n           // No confirm dialog\n           } else {\n            ajaxCall();\n           }\n    }\n  });\n  //====jAjaxSubmit====\n  $.fn.jAjaxSubmit=function(option) {\n      var $form = this;\n      option = option == null ? {}:option;\n      var successUrl = $form.data(\"success-url\");\n      option.successUrl = successUrl;\n      var confirm = $form.data(\"confirm\");\n      \n      var fileInputs = $('input[type=file]', $form);\n      var hasFileInputs = fileInputs.length > 0;\n      if(hasFileInputs) {\n        throw new Error(\"file type is unsupported\");\n      }\n      option.dataType = \"text\";\n      \n      var loading = null;\n      // Success callback\n      var callback = option.callback;\n      if (! callback) {\n          // Default callback process\n          callback = _ajaxSuccessCallback;\n      }\n      option.success = function (data) {\n           $.jLoading.hide(loading);\n           data = (data == null || data == '') ? {}:$.parseJSON(data);\n           callback.call(window, data, option, $form);\n       };\n       // Fail callback\n      option.error = function () {\n           $.jLoading.hide(loading);\n           $.jMessage({title: '&nbsp;', msg: J.msg['jAjax.requestException']});\n       };\n\n       // Has confirm dialog\n       if (confirm) {\n         $.jConfirm({msg:confirm, callback:function(){\n            loading = $.jLoading.show();\n            _jAjaxSubmit($form, option);\n        }});\n       // No confirm dialog\n       } else {\n        loading=$.jLoading.show();\n        _jAjaxSubmit($form, option);\n       }\n  };\n  \n  var _jAjaxSubmit=function($form, option) {\n\tvar url = $form.attr(\"action\");\n\tvar data = $form.serialize();\n\t$.ajax({\n\t\ttype:\"POST\",\n\t\turl:url,\n\t\tdata: data,\n\t\tdataType:\"text\",\n\t\tsuccess:option.success,\n\t\terror:option.error\n\t});\n\t\n  }\n  \n//Table select control\n  var JTableSelect=function(option) {\n        this.$container = option.container;\n        this.fieldValueName=option.name;//form field name, required\n        this.inputFieldName = option.inputFieldName;//name of input control, not required,jquery validate\n        this.selectType = option.selectType===\"multiple\"?\"multiple\":\"single\";//select type\n        this.initValue = option.initValue;//init value,single select is tring,multiple select is array\n        this.initInput = option.initInput;//init input,single select is tring,multiple select is array\n        this.valueColumn=option.valueColumn?option.valueColumn:option.name;// value column of table(input back to select)\n        this.inputColumn=option.inputColumn?option.inputColumn:this.valueColumn;// input column of talbe(input back to input)\n        this.showValue=option.showValue === true ? true:false;\n        this.editable = option.editable==true?true:false;\n        this.readonly = option.readonly==true?true:false;\n        this.title = option.title||J.msg['jListSelect.select'];//dialog title\n        this.clearable = option.clearable===true?true:false;\n        this.url = option.url;\n        this.initUrl = option.initUrl;\n        this.onSetValue = option.onSetValue; \n        var _self = this;\n        // set value and input\n        this.setValue=function(value, input){\n            if(this.selectType == \"single\") {\n                if ($.type(value)==\"array\") {\n                    value = value[0];\n                }\n            } else {\n                if ($.type(value)==\"string\"){\n                    value = [value];\n                }\n            }\n            this._renderValue(value);\n            this._renderInput(this._inputText(input, value));\n            if (_self.onSetValue) {\n                _self.onSetValue(value);\n            }\n        };\n        // render value\n        this._renderValue = function(valueData) {\n            this.$valueField.empty();\n            if (\"single\" == this.selectType) {\n                if(valueData === \"\" || valueData === undefined || valueData===null) {\n                    this.$valueField.val(valueData);\n                    return;\n                }\n                this.$valueField.append(\"<option value='\" + valueData + \"' selected='selected'/>\");\n            } else {\n                if(valueData) {\n                    for(var i = 0; i < valueData.length; i++) {\n                        this.$valueField.append(\"<option value='\" + valueData[i] + \"' selected='selected'/>\");\n                    }\n                }\n            }\n        }\n        // render input\n        this._renderInput = function(inputData) {\n            this.$inputField.val(inputData);\n        }\n        \n        this._inputText = function(input, value) {\n            if(_self.selectType == \"single\") {\n                if (value===undefined || input ===undefined || value===null || input===null) {\n                    return '';\n                }\n                return this.showValue ? value+'-'+input : input;\n            } else {\n                if (value===undefined || input ===undefined || value===null || input===null) {\n                    return '';\n                }\n                if (! this.showValue) return input;\n                var inputText = '';\n                for (var i in input){\n                    inputText += value[i]+'-'+input[i] + \",\";\n                }\n                return inputText;\n            }\n        }\n        \n        this.render=function() {\n            this.$container.addClass(\"j-tableSelect input-group\");\n            this.$container.append(\"<select style='display:none' class='form-control dtselect' \" + (this.selectType == \"multiple\" ? \"multiple='multiple'\":\"\") + \" name='\" + this.fieldValueName + \"'></select>\" +\n                    \"<input type='text' class='form-control'\" + (this.editable ? \"\":\"readOnly='true'\") +  (this.inputFieldName ? \" name='\" + this.inputFieldName + \"'\" : \"\") + \"/>\" +\n                            \"<div class='input-group-append'><button class='btn btn-outline-secondary' type='button'>...</button>\" + \n                            ((this.clearable && !this.editable) ? \"<button class='btn btn-outline-secondary' type='button'>X</button>\":\"\") + \"</div>\");\n            $btnGroup=this.$container.find(\".input-group-append\");\n            this.$selectBtn = $btnGroup.find(\":contains(...)\");\n            this.$clearBtn = $btnGroup.find(\":contains(X)\");\n            this.$valueField = this.$container.find(\"select\");\n            this.$inputField = this.$container.find(\"input\");\n            this._renderValue(this.initValue);\n            this._renderInput(this._inputText(this.initInput, this.initValue));\n            //ajax get init show value.input format {value:value},output format {input:input},single select is string,multiple select is array\n            if (this.initValue !== '' && this.initValue !== null && this.initValue !== undefined && (this.initInput === undefined || this.initInput===''||this.initInput===null) && this.initUrl) {\n                this._renderInput(this.initValue);\n                $.ajax({url: this.initUrl, data:JSON.stringify({value:this.initValue}),\n                    type:\"POST\", \n                    dataType: \"json\",\n                    contentType : \"application/json\",\n                    success: function(data){\n                        _self._renderInput(_self._inputText(data.resultData.input,_self.initValue));\n                    }\n                });\n            }\n            // input event\n            if(this.editable) {\n                this.$inputField.change(function(){\n                    var inputData;\n                    if(_self.selectType == \"single\") {\n                        inputData = _self.$inputField.val();\n                    } else {\n                        inputData = _self.$inputField.val().split(\",\");\n                    }\n                    _self._renderValue(inputData, inputData);\n                });\n            }\n            if (! _self.readonly) {\n            // clear button\n            this.$clearBtn.click(function(){\n                _self.setValue(\"\",\"\");\n            });\n            // select button\n            this.$selectBtn.click(function(){\n                $.jDialog({\n                    title:_self.title,\n                    url:_self.url+\"?selectId=_select_\"+$.jSequence.next(),\n                    // open callback\n                    success:function(){\n                        var $dialog = this;\n                        var $table = $dialog.find(\".table\");\n                        //close after select in single select mode\n                        if(_self.selectType == \"single\") {\n                            //has bug\n                            // _self.valueData && $table.bootstrapTable('checkBy', {field: _self.valueColumn, values:[_self.initValue]})\n                            // select event\n                             $table.on(\"check.bs.table\", function($element, row){\n                                   _self.setValue(row[_self.valueColumn], row[_self.inputColumn]);\n                                   $dialog.modal(\"hide\");\n                                 });  \n                             \n                            //close after click confirm button\n                        } else {\n                            //has bug\n                            //_self.valueData&& $table.bootstrapTable('checkBy', {field: _self.valueColumn, values:_self.initValue})\n                            $dialog.find(\".j-btn-ok\").on(\"click\", function(){\n                                var selections = $table.bootstrapTable(\"getSelections\");\n                                var valueData = [];\n                                var inputData = [];\n                                for(var i in selections) {\n                                    valueData.push(selections[i][_self.valueColumn]);\n                                    inputData.push(selections[i][_self.inputColumn]);\n                                }\n                                _self.setValue(valueData, inputData);\n                               $dialog.modal(\"hide\");\n                            });\n                        }\n                    }\n                });\n            });\n         }\n            \n        }\n        \n  };\n\n  $.fn.jTableSelect=function(option) { \n        // create datatableSelect\n    if (typeof option !== 'string') {\n        option.container = this;\n        var tableSelect = new JTableSelect(option);\n        tableSelect.render();\n        $(this).data(\"jTableSelect\",tableSelect);\n      }\n };\n \n // List select control\n var JListSelect = function (option) {\n        this.$container = option.container;\n        this.initValue = option.initValue;//init value,array\n        this.initUrl = option.initUrl;//init show url\n        var _self = this;\n        this.render=function() {\n            this.$container.addClass(\"j-listSelect input-group\");\n            this.$container.append(\"<textarea class='form-control' name='\"+this.fieldValueName + \"'></textarea>\" +\n                            \"<div class='input-group-append'><button class='btn btn-outline-secondary j-list-select-btn' type='button'>\" + J.msg['jListSelect.view'] +\"</button>\");\n            this.$selectBtn = this.$container.find(\".j-list-select-btn\");\n            this.$valueField = this.$container.find(\"textarea\");\n            this.$valueField.text(this.initValue);\n            // Select Button\n            this.$selectBtn.click(function(){\n                var value = _self.$valueField.val();\n                if (value === undefined || value === null || value === \"\") {\n                    alert(J.msg['jListSelect.inputTip']);\n                    return;\n                }\n                var values;\n                if (value.trim().charAt(0)=='[') {\n                    values = JSON.parse(value);\n                } else {\n                    values = value.split(\",\");\n                }\n                $.ajax({url: _self.initUrl, data:JSON.stringify({value:values}),\n                    type:\"POST\", \n                    dataType: \"json\",\n                    contentType : \"application/json\",\n                    success: function(data){\n                        var input = data.resultData.input;\n                        var table = '<table class=\"table table-striped table-bordered\"><thead><tr><th>' + J.msg['jListSelect.value'] + '</th><th>' + + J.msg['jListSelect.info'] + '</th></tr></thead>';\n                        for (var i = 0; i < values.length; i++) {\n                            table += \"<tr><td>\" + values[i] + \"</td><td>\" + input[i] + \"</td></tr>\";\n                        }\n                        table += \"</table>\";\n                        var modal = \"<div>\" + table + \"</div>\";\n                        $.jDialog({title:J.msg[\"jDialog.view\"],element:modal});\n                    }\n                });\n            });\n         }\n     this.setValue = function() {\n         \n     }\n }\n $.fn.jListSelect=function(option) { \n        // Create listSelect\n    if (typeof option !== 'string') {\n        option.container = this;\n        var listSelect = new JListSelect(option);\n        listSelect.render();\n        $(this).data(\"jListSelect\",listSelect);\n      }\n}; \n \n  $(function () {\n      $(document).on(\"submit\", \".j-ajax-form\", function(){\n          $(this).jAjaxSubmit();\n          return false;\n          });\n  });   \n  \n// JSON PATH\nJ.jp = {\n            parse:function(exp) {\n                var parts = exp.split(/[\\.|\\[]/);\n                var result = [];\n                for (var i in parts) {\n                    if (parts[i] == \"$\" || parts[i]==\"\") {\n                        continue;\n                    }\n                    // Array\n                    if (parts[i].indexOf(\"]\")>0) {\n                        result.push({type:\"array\", val:parts[i].substr(0, parts[i].length - 1)});\n                    } else {\n                        //Object\n                        result.push({type:\"obj\",val:parts[i]});\n                    }\n                }\n                return result;\n            },\n            value:function(obj, exp, newValue) {\n                // Query mode\n                if (newValue === undefined) {\n                    var result = obj;\n                    if (obj === undefined || obj === null) {\n                        return result;\n                    }\n                    var parts = this.parse(exp);\n                    for (var i in parts) {\n                        var part = parts[i];\n                        obj = obj[part.val];\n                        if (obj === undefined || obj === null) {\n                            return obj;\n                        }\n                    }\n                    return obj;\n                // Set value mode\n                } else {\n                    var parts = this.parse(exp);\n                    var parent,parentAttr;\n                    var current = obj;\n                    for (var i in parts) {\n                        if (!current) {\n                            current = parts[i].type=='array' ? []:{};\n                            if (i == 0){obj=current}\n                            parent && (parent[parentAttr]=current);\n                        }\n                        if (i == parts.length - 1) {\n                            current[parts[i].val] = newValue;\n                            break;\n                        }\n                        \n                        parent = current;\n                        parentAttr = parts[i].val;\n                        current = current[parts[i].val];\n                    }\n                    return obj;\n                }\n            }\n                \n        }\n\nfunction timestampToTime(timestampMs) {\n    let date = new Date(timestampMs);\n    let Y = date.getFullYear() + '-';\n    let M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1) : date.getMonth()+1) + '-';\n    let D = date.getDate() + ' ';\n    let h = date.getHours() + ':';\n    let m = date.getMinutes() + ':';\n    let s = date.getSeconds();\n    return Y+M+D+h+m+s;\n}\n J.formatTime = function(timestampMs) {\n    if(timestampMs === undefined || timestampMs === \"\") {\n        return \"\";\n    }\n     var check = function(m) {\n         return m<10 ? '0' + m : m\n     };\n     var time = new Date(timestampMs);\n     var y = time.getFullYear();\n     var m = time.getMonth()+1;\n     var d = time.getDate();\n     var h = time.getHours();\n     var mm = time.getMinutes();\n     var s = time.getSeconds();\n     return y+'-'+check(m)+'-'+check(d)+' '+check(h)+':'+check(mm)+':'+check(s);\n };\nJ.formatTimeYmd = function(timestampMs) {\n    if(timestampMs === undefined || timestampMs === \"\") {\n        return \"\";\n    }\n    var check = function(m) {\n        return m<10 ? '0' + m : m\n    };\n    var time = new Date(timestampMs);\n    var y = time.getFullYear();\n    var m = time.getMonth()+1;\n    var d = time.getDate();\n    return y+'-'+check(m)+'-'+check(d);\n};\nJ.formatTimeYm = function(timestampMs) {\n    if(timestampMs === undefined || timestampMs === \"\") {\n        return \"\";\n    }\n    var check = function(m) {\n        return m<10 ? '0' + m : m\n    };\n    var time = new Date(timestampMs);\n    var y = time.getFullYear();\n    var m = time.getMonth()+1;\n    return y+'-'+check(m);\n};\n//yyyy-mm-dd hh:mm:ss\nJ.formatTimestampOrStrTime = function(timesMs) {\n    if(timesMs === undefined || timesMs === \"\") {\n        return \"\";\n    }\n    var time = new Date(timesMs);\n    if(time == 'Invalid Date' ){ //yyyymmddhhmmss convert to yyyy-mm-dd hh:mm:ss\n        time = timesMs.replace(/^(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})$/, \"$1-$2-$3 $4:$5:$6\")\n        return time;\n    }\n    var check = function(m) {\n        return m<10 ? '0' + m : m\n    };\n    var y = time.getFullYear();\n    var m = time.getMonth()+1;\n    var d = time.getDate();\n    var h = time.getHours();\n    var mm = time.getMinutes();\n    var s = time.getSeconds();\n    return y+'-'+check(m)+'-'+check(d)+' '+check(h)+':'+check(mm)+':'+check(s);\n};\n\n/**\n * Open window\n */\nJ.openWindow=function(url, name, specs, replace) {\n    if (self != top) {\n        window.location.href=url;\n    } else {\n        window.open(url, name, specs, replace);\n    }\n}\n\n/**\n * eval js, print exception.\n */\nJ.eval = function(js, ctxData) {\n    try {\n        eval(js);\n    } catch (err) {\n        console.dir(err);\n        console.log(\"eval exception, js:\" + js);\n        if (ctxData) {\n            console.log(\"ctxData:\" + JSON.stringify(ctxData));\n        };\n        throw err;\n    }\n}\n\n $.fn.jJsonPropertyEditor=function(option, arg) { \n        // Create listSelect\n    if (typeof option !== 'string') {\n        option = option ? option : {}\n        option.$originalControl = $(this);\n        var jJsonPropertyEditor =  $(this).data(\"j-json-property-editor\");\n        if (! jJsonPropertyEditor) {\n            jJsonPropertyEditor = new JJsonPropertyEditor(option);\n            $(this).data(\"j-json-property-editor\",jJsonPropertyEditor);\n        }\n        jJsonPropertyEditor.render();\n      } else {\n        var jJsonPropertyEditor = $(this).data(\"j-json-property-editor\");\n        var result = jJsonPropertyEditor[option](arg);\n        return result;\n      }\n}; \n\n/**\n * JSON property control\n */\nvar JJsonPropertyEditor = function(option) {\n    this.$originalControl = option.$originalControl;\n    this.$container = option.$container ? option.$container : this.$originalControl.parent();\n    this.mode = option.mode ? option.mode : \"ROW\";\n    this.render = function() {\n        var _this = this;\n        this.$control = $(\"<div class='container-fluid'></div>\").appendTo(this.$container);\n       this.$control.on(\"click\", \".j-row-add\", function(){\n          _this.addRow($(this).parent().parent());\n       });   \n       this.$control.on(\"click\", \".j-row-del\", function(){\n           if (_this.$control.find(\".j-prop-record\").length==1){\n               $(this).parent().parent().find(\"input,textarea\").val(\"\");\n           } else {\n           $(this).parent().parent().remove();\n           }\n       });  \n       this.$control.on(\"blur\", \".j-prop-key,.j-prop-type,.j-prop-val\", function(){\n           var newVal = _this.collect();\n           if (Array.isArray(newVal)) {\n               alert(newVal + \" \" + J.msg['bpmn.property.valueFormatInvalid']);\n               return false;\n           }\n           _this.$originalControl.val(Object.keys(newVal).length==0 ? \"\" : JSON.stringify(newVal, null, 2));\n           _this.$originalControl.blur();\n       });  \n        this.$control.on(\"change\", \".j-prop-type\", function(){\n           $(this).parent().parent().find(\".j-prop-val\").val(\"\");\n       });      \n       this._innerRender();           \n    }\n    \n    this._innerRender = function() {\n                if (this.mode == \"JSON\") {\n            this.$originalControl.show();\n            this.$control.hide();\n        } else {\n            this.$originalControl.hide();\n            this.$control.show();\n            this.$control.empty();\n            var valStr = this.$originalControl.val();\n            var value = {};\n            try {\n                value = valStr ? JSON.parse(valStr) : {};\n            } catch (e) {\n                alert(J.msg['jqueryValidate.json'] + \",\" + valStr);\n            } \n            var keys = Object.keys(value);\n          if (keys.length==0) {\n            this.addRow();\n        } else {\n            for (var key in value) {\n                this.addRow(null, key, value[key]);\n            }\n        }  \n        } \n    }\n    \n    this.changeMode = function(mode) {\n        if (mode == this.mode) {\n            return;\n        } else {\n            this.mode = mode;\n            this._innerRender();\n        }\n    }\n    \n    this.addRow = function($after, key, val) {\n        var $html = $(\"<div class='row j-prop-record'>\"\n         + \"<div class='col-3 p-0'><input class='form-control p-0 j-prop-key' placeholder='\" + J.msg['bpmn.property.propertyKey'] + \"'></input></div>\"\n         + \"<div class='col-2 p-0'><select class='form-control p-0 j-prop-type'>\"\n            + \"<option value='string' selected='selected'>\" + J.msg['bpmn.property.typeString'] + \"</option>\"\n            + \"<option value='number'>\" + J.msg['bpmn.property.typeNumber'] + \"</option>\"\n            + \"<option value='boolean'>\" + J.msg['bpmn.property.typeBoolean'] + \"</option>\"\n            + \"<option value='object'>\" + J.msg['bpmn.property.typeObject'] + \"</option>\"\n            + \"<option value='array'>\" + J.msg['bpmn.property.typeArray'] + \"</option>\"\n            + \"<option value='null'>\" + J.msg['bpmn.property.typeNull'] + \"</option></select></div>\" \n        + \"<div class='col-6 p-0'><textarea wrap='off' class='form-control p-0 j-prop-val' placeholder='\" + J.msg['bpmn.property.propertyValue'] + \"'></textarea></div>\"\n        + \"<div class='col-1 p-0'><i class='fa fa-plus j-row-add' style='cursor:pointer'>\"\n        + \"</i><i class='fa fa-trash j-row-del' style='cursor:pointer'></i></div></div>\");\n         var $row = $after ? $html.insertAfter($after) : $html.appendTo(this.$control);\n          var $key = $row.find(\".j-prop-key\");\n          $key.tooltip({title:function(){return $(this).val()}});\n          var $val = $row.find(\".j-prop-val\");\n          $val.tooltip({title:function(){return $(this).val()}});          \n        if (key) {\n          var $type = $row.find(\".j-prop-type\");\n          $key.val(key);\n          var type = $.type(val);\n          if (type == \"object\" && Array.isArray(val)) {\n              type = \"array\";\n          }\n          $type.val(type);\n          if (type == \"null\") {\n          } else if (type == \"string\") {\n              $val.val(val);\n          } else if (type == \"number\") {\n              $val.val(val); \n          } else if (type == \"boolean\") {\n              $val.val(val);               \n          } else if (type == \"object\") {\n              $val.val(JSON.stringify(val, null, 2));                             \n          } else if (type == \"array\") {\n              $val.val(JSON.stringify(val, null, 2));                             \n          } else {\n              throw \"invalid type:\" + type;\n          }\n        }\n        \n    }\n\n    this.collect = function () {\n        var result = {};\n        var errorKeys = [];\n        this.$control.find(\".j-prop-record\").each(function(){\n          var key = $(this).find(\".j-prop-key\").val();\n          var type = $(this).find(\".j-prop-type\").val();\n          var val = $(this).find(\".j-prop-val\").val();\n          var valObj = null;\n          //var isJsonPath = key.indexOf(\"$\")==0;\n            if (key) {\n                if (val == \"\") {\n                    return;\n                }\n                if (type == \"null\") {\n                    valObj = null;\n                    if (val.trim() !== \"\") {\n                        errorKeys.push(key);\n                        return;\n                    }\n                } else if (type == \"string\") {\n                    valObj = val.trim();\n                } else if (type == \"number\") {\n                    valObj = Number(val.trim());\n                    if (Number.isNaN(valObj)) {\n                        errorKeys.push(key);\n                        return;\n                    }\n                } else if (type == \"boolean\") {\n                    if (val.trim() == 'true') {\n                        valObj = true;\n                    } else if (val.trim()=='false') {\n                        valObj = false;\n                    } else {\n                        errorKeys.push(key);\n                        return;\n                    }\n                } else if (type == \"object\") {\n                    try {\n                      valObj = JSON.parse(val);\n                      } catch (e) {\n                        errorKeys.push(key);\n                        return; \n                      }\n                      if (Array.isArray(valObj)) {\n                          errorKeys.push(key);\n                          return;\n                      }\n                } else if (type == \"array\") {\n                    try {\n                    valObj = JSON.parse(val);\n                    } catch (e) {\n                        errorKeys.push(key);\n                        return; \n                    }\n                    if (! Array.isArray(valObj)) {\n                          errorKeys.push(key);\n                          return;\n                      }\n                }\n                result[key] = valObj;\n            }\n        });\n        return errorKeys.length>0 ? errorKeys : result;\n    }\n}\n\n\n\n\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/js/messages_default.js",
    "content": "if (!window.J) {\n    window.J = {};\n}\n\n(function(J) {\n    J.msg = {};\n    if (!window.jLocale) {\n        var lang = (navigator.language || navigator.userLanguage).toLowerCase();\n        if (lang.indexOf('zh') == -1) {\n            window.jLocale = \"en_US\";\n        } else {\n            window.jLocale = \"zh_CN\";\n        }\n    }\n    $.extend(J.msg, {\n    \"locale\":\"en_US\",\n\t\n\t\"common.view\":\"View\",\n\n    \"multiselect.nonSelectedText\":\"Please Select\",\n    \"multiselect.nSelectedText\":\"Selected\",\n    \"multiselect.allSelectedText\":\"All Selected\",\n    \"multiselect.filterPlaceholder\":\"Search\",\n    \"multiselect.selectAllText\":\"Select All\",\n    \n    \"jqueryValidate.strictDate\":\"Date format is illegal\",  \n    \"jqueryValidate.json\":\"JSON format is illegal\",  \n    \"jqueryValidate.fileInput\":\"File cannot be null\", \n    \"jqueryValidate.required\":\"Required filed\", \n    \"jqueryValidate.remote\":\"Please correct this field\", \n    \"jqueryValidate.email\":\"Email format is illegal\", \n    \"jqueryValidate.url\":\"URL is illegal\", \n    \"jqueryValidate.date\":\"Date format is illegal\", \n    \"jqueryValidate.dateISO\":\"Please input date (ISO).\", \n    \"jqueryValidate.number\":\"Please input digit\", \n    \"jqueryValidate.digits\":\"Please input integer number(>=0)\", \n    \"jqueryValidate.creditcard\":\"Please input valid credit card\", \n    \"jqueryValidate.equalTo\":\"Please input same value\", \n    \"jqueryValidate.accept\":\"Please input valid suffix string\", \n    \"jqueryValidate.maxlength\":\"Max length is {0}\", \n    \"jqueryValidate.minlength\":\"Min length is {0}\", \n    \"jqueryValidate.rangelength\":\"Length should between {0} and {1}\", \n    \"jqueryValidate.range\":\"Please input value between {0} and {1}\", \n    \"jqueryValidate.max\":\"Max value is {0}\", \n    \"jqueryValidate.min\":\"Min value is {0}\",\n    \n    \"ajaxSuccessCallback.successShowMsg\":\"Operate Success!\",\n    \"ajaxSuccessCallback.exceptionShowMsg\":\"System Exception!\",\n    \n    \"jDialog.confirm\":\"Confirm\",\n    \"jDialog.cancel\":\"Cancel\",\n    \"jDialog.close\":\"Close\",\n    \"jDialog.view\":\"View\",\n    \n    \"jAjax.requestException\":\"Request Exception\",\n    \n    \"jListSelect.value\":\"Value\",\n    \"jListSelect.info\":\"Info\",\n    \"jListSelect.inputTip\":\"Plase input value of element\",\n    \"jListSelect.view\":\"View\",\n    \n    \"jListSelect.select\":\"Select\",\n    \n    \"flow.jsonDefTitle\":\"JSON Flow Definition\",\n    \"flow.flowJsonDefinition\":\"JSON Flow Definition\",    \n    \"flow.newFlowDef\":\"New Flow Definition\",\n    \"flow.oldFlowDef\":\"Old Flow Definition\",\n    \"flow.noJsonDataTip\":\"No JSON flow definition data\",\n    \"flow.id\":\"Flow ID\",    \n    \"flow.nodeId\":\"Node ID\",\n    \"flow.nodeName\":\"Node Name\",\n    \"flow.flowDefId\":\"Flow Definition ID\",\n    \"flow.flowDefName\":\"Flow Definition Name\",\n    \"flow.flowDefType\":\"Flow Definition Type\",\n    \"flow.flowDefType.flowBpmn\":\"FlowEngine-BPMN\",\n    \"flow.flowDefType.flowJson\":\"FlowEngine-JSON\",\n    \"flow.flowDefType.fsmJson\":\"StateMachine-JSON\",\n    \"flow.bizType\":\"Business Type\",\n    \"flow.category\":\"Category\",\n    \"flow.flowDefinition\":\"Flow Definition\",\n    \"flow.flowDiagram\":\"Flow Diagram\",\n    \"flow.jsonDefinition\":\"JSON Definition\",\n    \"flow.flowJsonDefinitioin\":\"Flow JSON Definition\",\n    \"flow.update\":\"Update\",\n    \"flow.oldNewCompare\":\"Old/New Compare\",\n    \"flow.cancel\":\"Cancel\",\n    \n    \"bpmn.detailInfoType\":\"Detail Info Type\",\n    \"bpmn.bpmnFlowDefinition\":\"BPMN Flow Definition\",\n    \"bpmn.flowJsonDefinition\":\"Flow JSON Definition\",\n    \"bpmn.jsonContent\":\"JSON Content\",\n    \"bpmn.convertErrorTip\":\"BPMN convert to JSON request exception,this is ajax request, please confirm url or service whether or not normal,current url:\",\n    \"bpmn.newFlowDefinition\":\"New Flow Definition\",\n    \"bpmn.oldFlowDefinition\":\"Old Flow Definition\",\n    \"bpmn.idTooltip\":\"Element ID,Not NULL,IMPORTANT!suggest english with business meaning\",\n    \"bpmn.idEmptyError\":\"ID cannot be null\",\n    \"bpmn.idExistsError\":\"ID exists\",    \n    \"bpmn.name\":\"Name\",\n    \"bpmn.nameTooltip\":\"Element Name,can be null\",\n    \"bpmn.documentation\":\"Documentation\",\n    \"bpmn.documentationTooltip\":\"Element description\",    \n    \"bpmn.property\":\"Properties\",\n    \"bpmn.propertyTooltip\":\"Element properties,IMPORTANT!JSON format,see reference doc\",    \n    \"bpmn.conditionType\":\"Branch Condition Type\",\n    \"bpmn.conditionType.exclusive\":\"Exclusive\",\n    \"bpmn.conditionType.inclusive\":\"Inclusive\",\n    \"bpmn.conditionTypeTooltip\":\"Branch type,default is inclusive(every branch will be evaluated,all branch with true result will be executed); Use default option when only one branch.\",   \n    \"bpmn.startNode\":\"Start Node\",\n    \"bpmn.startNode.true\":\"True\",\n    \"bpmn.startNode.false\":\"False\",\n    \"bpmn.startNodeTooltip\":\"Identify this is a start node\",\n    \"bpmn.selfPre\":\"Customize PreHandler\",\n    \"bpmn.selfPreTooltip\":\"Customize node pre handler, will override pre handler of diagram semantics\",\n    \"bpmn.selfAction\":\"Customize Action\",\n    \"bpmn.selfActionTooltip\":\"Customize node action,will override node action of diagram semantics\",        \n    \"bpmn.selfPost\":\"Customize Branch\",\n    \"bpmn.selfPostTooltip\":\"Customize branch,will override branch of diagram,for free flow\",\n    \"bpmn.listeners\":\"Listeners\",\n    \"bpmn.listenersTooltip\":\"Flow listeners,JSON array format,see reference doc\",\n    \"bpmn.filters\":\"Flow Filters\",\n    \"bpmn.filtersTooltip\":\"Flow Filters,JSON array format,see reference doc\",\n    \"bpmn.nodeFilters\":\"Node Filters\",\n    \"bpmn.nodeFiltersTooltip\":\"Node Filters,JSON array format,see reference doc\",    \n    \"bpmn.nodePreHandlerFilters\":\"Node PreHandler Filters\",\n    \"bpmn.nodePreHandlerFiltersTooltip\":\"Node PreHandler Filters,JSON array format,see reference doc\",      \n    \"bpmn.nodeActionFilters\":\"Node Action Filters\",\n    \"bpmn.nodeActionFiltersTooltip\":\"Node Action Filters,JSON array format,see reference doc\",    \n    \"bpmn.nodePostHandlerFilters\":\"Node PostHandler Filters\",\n    \"bpmn.nodePostHandlerFiltersTooltip\":\"Node PostHandler Filters,JSON array format,see reference doc\",    \n    \"bpmn.flowPreHandlerFilters\":\"Flow PreHandler Filters\",\n    \"bpmn.flowPreHandlerFiltersTooltip\":\"Flow PreHandler Filters,JSON array format,see reference doc\",      \n    \"bpmn.flowPostHandlerFilters\":\"Flow PostHandler Filters\",\n    \"bpmn.flowPostHandlerFiltersTooltip\":\"Flow PostHandler Filters,JSON array format,see reference doc\",        \n    \"bpmn.runner\":\"Flow Runner\",\n    \"bpmn.runnerTooltip\":\"Flow Runner, default is sequential runner\",\n    \"bpmn.parseListeners\":\"Flow Parse Event Listeners\",\n    \"bpmn.parseListenersTooltip\":\"Flow parse event listeners\",      \n    \"bpmn.scriptFormat\":\"Script Format\",\n    \"bpmn.scriptFormat.exp\":\"SpringEL Expression\",\n    \"bpmn.scriptFormat.createExp\":\"Create Expression\",\n    \"bpmn.scriptFormatTooltip\":\"Script format\",\n    \"bpmn.script\":\"Script\",\n    \"bpmn.scriptTooltip\":\"Script,see reference doc\",\n    \"bpmn.conditionExp\":\"Condition Expression\",\n    \"bpmn.conditionExpTooltip\":\"Condition Expression,SPEL Format\",\n    \"bpmn.condition\":\"Condition\",\n    \"bpmn.none\":\"None\",\n    \"bpmn.branchType\":\"Branch Type\",\n    \"bpmn.branchType.exclusive\":\"Exclusive\",\n    \"bpmn.bpmnDefinition\":\"BPMN Definition\",\n    \"bpmn.import\":\"Import\",\n    \"bpmn.export\":\"Export\",\n    \"bpmn.svg\":\"SVG\",\n    \"bpmn.zoomIn\":\"Zoom In\",\n    \"bpmn.zoomOut\":\"Zoom Out\",\n    \"bpmn.fullScreen\":\"Full Screen\",\n    \"bpmn.node\":\"Node\",\n    \"bpmn.infoPanel\":\"Information Panel\",\n    \"bpmn.flowBpmnDefinition\":\"Flow BPMN Definition\",\n    \"bpmn.renderFlowDiagram\":\"Render Flow Diagram\",\n    \"bpmn.viewFlowDefinition\":\"View EasyFlow Definition\",\n    \"bpmn.oldNewBpmnCompare\":\"Old/New BPMN Definition Compare\",\n    \"bpmn.oldNewEasyFlowCompare\":\"Old/New EasyFlow Definition Compare\",\n    \"bpmn.cancel\":\"Cancel\",\n    \"bpmn.flowPreHandler\":\"Flow PreHandler\",\n    \"bpmn.flowPreHandlerTooltip\":\"Flow PreHandler\",\n    \"bpmn.flowPostHandler\":\"Flow PostHandler\",\n    \"bpmn.flowPostHandlerTooltip\":\"Flow PostHandler\",\n    \"bpmn.calledElement\":\"Sub Flow ID\",\n    \"bpmn.calledElementTooltip\":\"Sub Flow ID\",\n    \"bpmn.flow\":\"Flow Info\",\n    \"bpmn.flowTooltip\":\"Flow info, id is required\",\n    \"bpmn.calledElement\":\"Called ID\",\n    \"bpmn.logFlag\":\"Log flag\",\n    \"bpmn.logFlagTooltip\":\"Print log flag, default true\",\n    \"bpmn.default\":\"Default\",\n    \"bpmn.true\":\"True\",\n    \"bpmn.false\":\"False\",\n    \"bpmn.switchRowMode\":\"Switch Row Mode\",\n    \"bpmn.switchJsonMode\":\"Switch JSON Mode\",\n    \"bpmn.property.propertyKey\":\"Key\",    \n    \"bpmn.property.propertyValue\":\"Value\",    \n    \"bpmn.property.typeString\":\"String\",    \n    \"bpmn.property.typeNumber\":\"Number\",    \n    \"bpmn.property.typeBoolean\":\"Boolean\",    \n    \"bpmn.property.typeObject\":\"Object\",    \n    \"bpmn.property.typeArray\":\"Array\",    \n    \"bpmn.property.typeNull\":\"Null\",       \n    \"bpmn.property.valueFormatInvalid\":\"Value Format Invalid!\",      \n    });\n    \n    J.bpmnIOTranslations = {};\n\n    // bpmn io translations\n    $.extend(J.bpmnIOTranslations, {\n    });\n\t\n\n\t$.extend(J.msg, {\n\t\t\"common.view\":\"View\",\n\t\t\"dataview.add\":\"Add\",\n\t\t\"dataview.dataInfo\":\"Data info\",\n\t\t\"dataview.originalData\":\"Original data\",\n\t\t\"dataviewcfg.collectPolicy\":\"Collect policy\",\n\t\t\"dataviewcfg.keep\":\"Keep\",\n\t\t\"dataviewcfg.ignore\":\"Ignore\",\n\t\t\"dataviewcfg.topHtml\":\"Top HTML\",\n\t\t\"dataviewcfg.bottomHtml\":\"Bottom HTML\",\n\t\t\"dataviewcfg.pageBeforeRenderScript\":\"Page before render script\",\n\t\t\"dataviewcfg.pageAfterRenderScript\":\"Page after render script\",\n\t\t\"dataviewcfg.pageBeforeCollectScript\":\"Pager before collect script\",\n\t\t\"dataviewcfg.pageAfterCollectScript\":\"Page after collect script\",\n\t\t\"dataviewcfg.nullPolicyTooltip\":\"Collect null value policy\",\n\t\t\"dataviewcfg.tabName\":\"Tab name\",\n\t\t\"dataviewcfg.siderBar\":\"Sider bar\",\n\t\t\"dataviewcfg.siderBarLevel\":\"Sider bar level\",\n\t\t\"dataviewcfg.panelName\":\"Panel name\",\n\t\t\"dataviewcfg.show\":\"Show\",\n\t\t\"dataviewcfg.cardName\":\"Card name\",\n\t\t\"dataviewcfg.elementPerRow\":\"Element per row\",\n\t\t\"dataviewcfg.configName\":\"Element name\",\n\t\t\"dataviewcfg.configType\":\"Element type\",\n\t\t\"dataviewcfg.selectTypeTip\":\"-Select-\",\n\t\t\"dataviewcfg.textType\":\"Text\",\n\t\t\"dataviewcfg.selectType\":\"Select\",\n\t\t\"dataviewcfg.areaType\":\"Textarea\",\n\t\t\"dataviewcfg.fixTextType\":\"Fix text\",\n\t\t\"dataviewcfg.tableSelectType\":\"Table select\",\n\t\t\"dataviewcfg.listSelectType\":\"List select\",\n\t\t\"dataviewcfg.selfType\":\"Self definition\",\n\t\t\"dataviewcfg.flowType\":\"Flow\",\n\t\t\"dataviewcfg.fsmType\":\"Fsm\",\n\t\t\"dataviewcfg.dateType\":\"Date\",\n\t\t\"dataviewcfg.fileType\":\"File\",\n\t\t\"dataviewcfg.cardListType\":\"Card list\",\n\t\t\"dataviewcfg.tableType\":\"Table\",\n\t\t\"dataviewcfg.elementsCardType\":\"Card\",\n\t\t\"dataviewcfg.maskInputType\":\"Mast input\",\n\t\t\"dataviewcfg.gridColNum\":\"Grid col num\",\n\t\t\"dataviewcfg.gridColAuto\":\"Auto\",\n\t\t\"dataviewcfg.newLine\":\"New line\",\n\t\t\"dataviewcfg.yes\":\"Yes\",\n\t\t\"dataviewcfg.no\":\"No\",\n\t\t\"dataviewcfg.colsTooltip\":\"bootstrap col\",\n\t\t\"dataviewcfg.newLineTooltip\":\"Next element in new line\",\n\t\t\"dataviewcfg.paramConfig\":\"Param config\",\n\t\t\"dataviewcfg.config\":\"Config\",\n\t\t\"dataviewcfg.confirm\":\"Confirm\",\n\t\t\"dataviewcfg.required\":\"Required\",\n\t\t\"dataviewcfg.configDesc\":\"Config desc\",\n\t\t\"dataviewcfg.descTooltip\":\"Tip info of element\",\n\t\t\"dataviewcfg.modifyOnAdd\":\"Modify on Add\",\n\t\t\"dataviewcfg.modifyOnAddTooltip\":\"On Add mode, whether this item can be moified, set a default value if no\",\n\t\t\"dataviewcfg.modifyOnEdit\":\"Modify on Edit\",\n\t\t\"dataviewcfg.modifyOnEditTooltip\":\"On Edit mode, whether this item can be modified\",\n\t\t\"dataviewcfg.valType\":\"Value type\",\n\t\t\"dataviewcfg.valTypeTooltip\":\"string type: use value directly; json type: convert to json object\",\n\t\t\"dataviewcfg.defaultVal\":\"Default value\",\n\t\t\"dataviewcfg.defaultValTooltip\":\"Default value on Add mode\",\n\t\t\"dataviewcfg.validateRule\":\"Validate rule\",\n\t\t\"dataviewcfg.validateRuleTooltip\":'Validate rule, Based on jquery validate; demo: [{\"type\":\"maxlength\",\"value\":\"5\",\"message\":\"Max length is 5\"}]',\n\t\t\"dataviewcfg.source\":\"Requirement source\",\n\t\t\"dataviewcfg.sourcePm\":\"PM\",\n\t\t\"dataviewcfg.sourceDev\":\"Developer\",\n\t\t\"dataviewcfg.sourceTooltip\":\"No use currently\",\n\t\t\"dataviewcfg.valProcess\":\"Value process\",\n\t\t\"dataviewcfg.key\":\"Key\",\n\t\t\"dataviewcfg.keyPath\":\"Key and path\",\n\t\t\"dataviewcfg.self\":\"self definition\",\n\t\t\"dataviewcfg.valProcessTooltip\":\"Configure how to map value and json content, key: map to json object first level field; Key and path: map to json path of first key field; self:self definition\",\n\t\t\"dataviewcfg.path\":\"Path\",\n\t\t\"dataviewcfg.script\":\"Script\",\n\t\t\"dataviewcfg.beforeRender\":\"Before render\",\n\t\t\"dataviewcfg.beforeRenderTooltip\":\"High level usage, javascript code, eval before render\",\n\t\t\"dataviewcfg.afterRender\":\"After render\",\n\t\t\"dataviewcfg.afterRenderTooltip\":\"High level usage, javascript code, eval after render\",\n\t\t\"dataviewcfg.extConfig\":\"Extend config\",\n\t\t\"dataviewcfg.extConfigTooltip\":\"High level usage, javascript object, append or override config, key cannot be 'ext'\",\n\t\t\"dataviewcfg.selfScript\":\"Self script\",\n\t\t\"dataviewcfg.selectTypeSelect\":\"Type\",\n\t\t\"dataviewcfg.single\":\"Single\",\n\t\t\"dataviewcfg.multiple\":\"Multiple\",\n\t\t\"dataviewcfg.seqMultipe\":\"Sequence multiple\",\n\t\t\"dataviewcfg.selectValType\":\"Select value type\",\n\t\t\"dataviewcfg.default\":\"Default\",\n\t\t\"dataviewcfg.commaSep\":\"Seperated by comma\",\n\t\t\"dataviewcfg.optionName\":\"Option name\",\n\t\t\"dataviewcfg.optionValue\":\"Option value\",\n\t\t\"dataviewcfg.addConfigItem\":\"Add config item\",\n\t\t\"dataviewcfg.add\":\"Add\",\n\t\t\"dataviewcfg.fileCount\":\"File count\",\n\t\t\"dataviewcfg.singleFile\":\"Single file\",\n\t\t\"dataviewcfg.multipleFile\":\"Multiple file\",\n\t\t\n\t\t\"dataviewapp.viewChange\":\"View change\",\n\t\t\"dataviewapp.dataView\":\"Data view\",\n\t\t\"dataviewapp.dataMap\":\"Data map\",\n\t\t\"dataviewapp.dataMapTtitle\":\"Data map(show datapath when click)\",\n\t\t\"dataviewapp.viewChangeTitle\":\"View template Change\",\n\t\t\"dataviewapp.dataView\":\"Data view\",\n\t\t\"dataviewapp.currentData\":\"Current data\",\n\t\t\"dataviewapp.oldData\":\"Old data\",\n\t\t\"dataviewapp.dataCompare\":\"Data compare\",\n\t\t\"dataviewapp.dataRender\":\"Data render\",\n\t\t\"dataviewapp.save\":\"Save\",\n\t\t\"dataviewapp.close\":\"Colse\",\n\t\t\"dataviewapp.newOldDataCompare\":\"New data and old data compare\",\n\t\t\"dataviewapp.dataItem\":\"Data item\",\n\t\t\"dataviewapp.originalVal\":\"Original val\",\n\t\t\"dataviewapp.afterVal\":\"After val\",\n\t\t\"dataviewapp.dataKey\":\"Data key\",\n\t\t\"dataviewapp.keyPath\":\"Key path\",\n\t\t\"dataviewapp.selectCheck1\":\"Select item missing,please add on template config page. Name\",\n\t\t\"dataviewapp.selectCheck2\":\"Key\",\n\t\t\"dataviewapp.selectCheck3\":\"Item list\",\n\t\t\"dataviewapp.selectCheck4\":\"Current value\",\n\t\t\"dataviewapp.notJsonFormat\":\"Data not JSON format\",\n\t\t\"dataviewapp.enable\":\"Enable\",\n\t\t\"dataviewapp.diable\":\"Disable\",\n\t\t\n\t\t});\n\n})(window.J)"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/js/messages_zh.js",
    "content": "(function (J) {\nif (window.jLocale=='zh_CN') {\n$.extend(J.msg, {\n    \"locale\":\"zh_CN\",\n\n    \"multiselect.nonSelectedText\":\"请选择\",\n    \"multiselect.nSelectedText\":\"已选择\",\n    \"multiselect.allSelectedText\":\"已全选\",\n    \"multiselect.filterPlaceholder\":\"搜索\",\n    \"multiselect.selectAllText\":\"全部选择\",\n    \n    \"jqueryValidate.strictDate\":\"日期格式不合法\",  \n    \"jqueryValidate.json\":\"JSON格式不合法\",  \n    \"jqueryValidate.fileInput\":\"文件不能为空\", \n    \"jqueryValidate.required\":\"必须字段\", \n    \"jqueryValidate.remote\":\"请修正该字段\", \n    \"jqueryValidate.email\":\"请输入正确格式的电子邮件\", \n    \"jqueryValidate.url\":\"请输入合法的网址\", \n    \"jqueryValidate.date\":\"请输入合法的日期\", \n    \"jqueryValidate.dateISO\":\"请输入合法的日期 (ISO).\", \n    \"jqueryValidate.number\":\"请输入合法的数字\", \n    \"jqueryValidate.digits\":\"只能输入大于等于零的整数\", \n    \"jqueryValidate.creditcard\":\"请输入合法的信用卡号\", \n    \"jqueryValidate.equalTo\":\"请再次输入相同的值\", \n    \"jqueryValidate.accept\":\"请输入拥有合法后缀名的字符串\", \n    \"jqueryValidate.maxlength\":\"长度最长为 {0}\", \n    \"jqueryValidate.minlength\":\"长度最少为 {0}\", \n    \"jqueryValidate.rangelength\":\"长度必须在 {0}到 {1}之间\", \n    \"jqueryValidate.range\":\"请输入一个介于 {0} 和 {1} 之间的值\", \n    \"jqueryValidate.max\":\"请输入一个最大为{0} 的值\", \n    \"jqueryValidate.min\":\"请输入一个最小为{0} 的值\",\n    \n    \"ajaxSuccessCallback.successShowMsg\":\"操作成功\",\n    \"ajaxSuccessCallback.exceptionShowMsg\":\"系统异常\",\n    \n    \"jDialog.confirm\":\"确定\",\n    \"jDialog.cancel\":\"取消\",\n    \"jDialog.close\":\"关闭\",\n    \"jDialog.view\":\"查看\",\n    \n    \"jAjax.requestException\":\"请求异常\",\n    \n    \"jListSelect.value\":\"值\",\n    \"jListSelect.info\":\"信息\",\n    \"jListSelect.inputTip\":\"请先输入元素值\",\n    \"jListSelect.view\":\"查看\",\n    \n    \"jListSelect.select\":\"选择\",\n    \n    \"flow.jsonDefTitle\":\"JSON流程定义\",\n    \"flow.flowJsonDefinition\":\"JSON流程定义\",        \n    \"flow.newFlowDef\":\"新流程定义\",\n    \"flow.oldFlowDef\":\"旧流程定义\",\n    \"flow.noJsonDataTip\":\"无JSON流程定义数据\",\n    \"flow.id\":\"流程ID\",        \n    \"flow.nodeId\":\"节点ID\",\n    \"flow.nodeName\":\"节点名称\",\n    \"flow.flowDefId\":\"流程定义ID\",\n    \"flow.flowDefName\":\"流程定义名称\",\n    \"flow.flowDefType\":\"流程定义类型\",\n    \"flow.flowDefType.flowBpmn\":\"流程引擎-BPMN\",\n    \"flow.flowDefType.flowJson\":\"流程引擎-JSON\",\n    \"flow.flowDefType.fsmJson\":\"状态机-JSON\",\n    \"flow.bizType\":\"业务类型\",\n    \"flow.category\":\"流程类别\",\n    \"flow.flowDefinition\":\"流程定义\",\n    \"flow.flowDiagram\":\"流程图\",\n    \"flow.jsonDefinition\":\"JSON定义\",\n    \"flow.flowJsonDefinitioin\":\"流程JSON定义\",\n    \"flow.update\":\"更新\",\n    \"flow.oldNewCompare\":\"新旧比对\",\n    \"flow.cancel\":\"取消\",\n    \n    \"bpmn.detailInfoType\":\"详情信息类型\",\n    \"bpmn.bpmnFlowDefinition\":\"BPMN流程定义\",\n    \"bpmn.flowJsonDefinition\":\"流程JSON定义\",\n    \"bpmn.jsonContent\":\"JSON内容\",\n    \"bpmn.convertErrorTip\":\"BPMN转换JSON请求异常，此请求为ajax请求,请确认地址或服务是否正确,当前地址:\",\n    \"bpmn.newFlowDefinition\":\"新流程定义\",\n    \"bpmn.oldFlowDefinition\":\"旧流程定义\",\n    \"bpmn.idTooltip\":\"元素ID，非空，重要！建议英文，命名要有业务含义\",\n    \"bpmn.idEmptyError\":\"ID不能为空\",\n    \"bpmn.idExistsError\":\"ID已存在\",\n    \"bpmn.name\":\"名称\",\n    \"bpmn.nameTooltip\":\"元素名称，中文，可为空\",\n    \"bpmn.documentation\":\"说明\",\n    \"bpmn.documentationTooltip\":\"元素描述说明\",    \n    \"bpmn.property\":\"属性\",\n    \"bpmn.propertyTooltip\":\"元素属性，重要！JSON格式，具体参考配置文档\",    \n    \"bpmn.conditionType\":\"分支条件类型\",\n    \"bpmn.conditionType.exclusive\":\"排他网关\",\n    \"bpmn.conditionType.inclusive\":\"包容网关\",\n    \"bpmn.conditionTypeTooltip\":\"分支类型，默认为包容类型(每个分支条件都会计算，结果为true的均执行);一个分支时选择默认,非并行分支选择排他\",   \n    \"bpmn.startNode\":\"开始节点\",\n    \"bpmn.startNode.true\":\"是\",\n    \"bpmn.startNode.false\":\"否\",\n    \"bpmn.startNodeTooltip\":\"开始节点标识\",\n    \"bpmn.selfPre\":\"自定义前置\",\n    \"bpmn.selfPreTooltip\":\"自定义前置处理, 会覆盖流程图原语义，高级用法\",\n    \"bpmn.selfAction\":\"自定义动作\",\n    \"bpmn.selfActionTooltip\":\"自定义节点动作，会覆盖流程图原语义，高级用法\",        \n    \"bpmn.selfPost\":\"自定义流转\",\n    \"bpmn.selfPostTooltip\":\"自定义流转，会覆盖图中流转方向，自由流场景使用\",\n    \"bpmn.listeners\":\"监听器\",\n    \"bpmn.listenersTooltip\":\"流程监听器，JSON数组格式，具体参考配置文档\",\n    \"bpmn.filters\":\"流程过滤器\",\n    \"bpmn.filtersTooltip\":\"流程过滤器，JSON数组格式，具体参考配置文档\",\n    \"bpmn.nodeFilters\":\"节点过滤器\",\n    \"bpmn.nodeFiltersTooltip\":\"节点过滤器，JSON数组格式，具体参考配置文档\",    \n    \"bpmn.nodePreHandlerFilters\":\"节点前置处理过滤器\",\n    \"bpmn.nodePreHandlerFiltersTooltip\":\"节点前置处理过滤器，JSON数组格式，具体参考配置文档\",        \n    \"bpmn.nodeActionFilters\":\"节点动作过滤器\",\n    \"bpmn.nodeActionFiltersTooltip\":\"节点动作过滤器，JSON数组格式，具体参考配置文档\",  \n    \"bpmn.nodePostHandlerFilters\":\"节点后置处理过滤器\",\n    \"bpmn.nodePostHandlerFiltersTooltip\":\"节点后置处理过滤器，JSON数组格式，具体参考配置文档\",     \n    \"bpmn.flowPreHandlerFilters\":\"流程前置处理过滤器\",\n    \"bpmn.flowPreHandlerFiltersTooltip\":\"流程前置处理过滤器，JSON数组格式，具体参考配置文档\",        \n    \"bpmn.flowPostHandlerFilters\":\"流程后置处理过滤器\",\n    \"bpmn.flowPostHandlerFiltersTooltip\":\"流程后置处理过滤器，JSON数组格式，具体参考配置文档\",        \n    \"bpmn.runner\":\"流程执行器\",\n    \"bpmn.runnerTooltip\":\"流程执行器，默认为串行执行器\",\n    \"bpmn.parseListeners\":\"流程解析事件监听器\",\n    \"bpmn.parseListenersTooltip\":\"流程解析事件监听器\",            \n    \"bpmn.scriptFormat\":\"脚本格式\",\n    \"bpmn.scriptFormat.exp\":\"spel表达式\",\n    \"bpmn.scriptFormat.createExp\":\"create表达式\",\n    \"bpmn.scriptFormatTooltip\":\"脚本格式\",\n    \"bpmn.script\":\"脚本\",\n    \"bpmn.scriptTooltip\":\"脚本，具体格式参考配置文档\",\n    \"bpmn.conditionExp\":\"条件表达式\",\n    \"bpmn.conditionExpTooltip\":\"条件表达式，SPEL格式\",\n    \"bpmn.condition\":\"条件\",\n    \"bpmn.none\":\"无\",\n    \"bpmn.branchType\":\"分支类型\",\n    \"bpmn.branchType.exclusive\":\"排他\",\n    \"bpmn.bpmnDefinition\":\"BPMN定义\",\n    \"bpmn.import\":\"导入\",\n    \"bpmn.export\":\"导出\",\n    \"bpmn.svg\":\"SVG\",\n    \"bpmn.zoomIn\":\"缩小\",\n    \"bpmn.zoomOut\":\"放大\",\n    \"bpmn.fullScreen\":\"全屏\",\n    \"bpmn.node\":\"节点\",\n    \"bpmn.infoPanel\":\"信息面板\",\n    \"bpmn.flowBpmnDefinition\":\"流程BPMN定义\",\n    \"bpmn.renderFlowDiagram\":\"渲染流程图\",\n    \"bpmn.viewFlowDefinition\":\"查看EasyFlow定义\",\n    \"bpmn.oldNewBpmnCompare\":\"新旧BPMN定义比对\",\n    \"bpmn.oldNewEasyFlowCompare\":\"新旧EasyFlow定义比对\",\n    \"bpmn.cancel\":\"取消\",\n    \"bpmn.flowPreHandler\":\"流程前置处理器\",\n    \"bpmn.flowPreHandlerTooltip\":\"流程前置处理器\",\n    \"bpmn.flowPostHandler\":\"流程后置处理器\",\n    \"bpmn.flowPostHandlerTooltip\":\"流程后置处理器\",\n    \"bpmn.calledElement\":\"子流程ID\",\n    \"bpmn.calledElementTooltip\":\"子流程ID\",\n    \"bpmn.flow\":\"流程信息\",\n    \"bpmn.flowTooltip\":\"流程信息,至少需配置id\",\n    \"bpmn.calledElement\":\"调用ID\",\n    \"bpmn.logFlag\":\"打印日志开关\",\n    \"bpmn.logFlagTooltip\":\"打印日志开关，缺省开\",\n    \"bpmn.default\":\"缺省\",\n    \"bpmn.true\":\"是\",\n    \"bpmn.false\":\"否\",\n    \"bpmn.switchRowMode\":\"切换行模式\",\n    \"bpmn.switchJsonMode\":\"切换JSON模式\",\n    \"bpmn.property.propertyKey\":\"属性键\",    \n    \"bpmn.property.propertyValue\":\"属性值\",    \n    \"bpmn.property.typeString\":\"字符\",    \n    \"bpmn.property.typeNumber\":\"数值\",    \n    \"bpmn.property.typeBoolean\":\"真假\",    \n    \"bpmn.property.typeObject\":\"对象\",    \n    \"bpmn.property.typeArray\":\"数组\",    \n    \"bpmn.property.typeNull\":\"空值\",   \n    \"bpmn.property.valueFormatInvalid\":\"值格式不正确!\"  \n\t\n});\n\n\n    J.bpmnIOTranslations = {\n        \"Add Lane above\": \"添加到通道之上\",\n        \"Add Lane below\": \"添加到通道之下\",\n        \"Append compensation activity\": \"追加补偿活动\",\n        \"Append {type}\": \"追加 {type}\",\n        \"Append EndEvent\": \"追加结束事件\",\n        \"Append Gateway\": \"追加网关\",\n        \"Append Task\": \"追加任务\",\n        \"Append Intermediate/Boundary Event\": \"追加消息接收事件\",\n        \"Append TextAnnotation\": \"追加文本标注\",\n        \"Business Rule Task\": \"规则任务\",\n        \"Call Activity\": \"调用流程\",\n        \"Cancel Boundary Event\": \"取消边界事件\",\n        \"Cancel End Event\": \"结束取消事件\",\n        \"Change type\": \"更改类型\",\n        \"Collapsed Pool\": \"折叠池\",\n        \"Compensation Boundary Event\": \"补偿边界事件\",\n        \"Compensation End Event\": \"结束补偿事件\",\n        \"Compensation Intermediate Throw Event\": \"中间补偿抛出事件\",\n        \"Compensation Start Event\": \"补偿启动事件\",\n        \"Complex Gateway\": \"复杂网关\",\n        \"Conditional Boundary Event (non-interrupting)\": \"条件边界事件 (非中断)\",\n        \"Conditional Boundary Event\": \"条件边界事件\",\n        \"Conditional Flow\": \"条件流转\",        \n        \"Conditional Intermediate Catch Event\": \"中间条件捕获事件\",\n        \"Conditional Start Event (non-interrupting)\": \"条件启动事件 (非中断)\",\n        \"Conditional Start Event\": \"条件启动事件\",\n        \"Connect using Association\": \"文本关联\",\n        \"Connect using DataInputAssociation\": \"数据关联\",\n        \"Connect using Sequence/MessageFlow or Association\": \"连接\",\n        \"Create DataStoreReference\": \"创建数据存储(仅用于展示)\",\n        \"Create IntermediateThrowEvent/BoundaryEvent\": \"创建中间抛出/边界事件\",\n        \"Create Pool/Participant\": \"创建池/参与者\",\n        \"Create expanded SubProcess\": \"创建可折叠子流程\",\n        \"Create {type}\": \"创建 {type}\",\n        \"Create StartEvent\": \"创建事件\",\n        \"Create ScriptTask\": \"创建任务\",\n        \"Create Gateway\": \"创建网关\",\n        \"Create Group\": \"创建分组\",\n        \"Default Flow\": \"缺省流转\",\n        \"Data Store Reference\": \"数据存储\",\n        \"Data Object Reference\": \"数据对象\",\n        \"Divide into three Lanes\": \"分成三条通道\",\n        \"Divide into two Lanes\": \"分成两条通道\",\n        \"Empty Pool\": \"空池\",\n        \"Empty Pool (removes content)\":\"空池(清空内容)\",\n        \"End Event\": \"结束事件\",\n        \"Error Boundary Event\": \"错误边界事件\",\n        \"Error End Event\": \"结束错误事件\",\n        \"Error Start Event\": \"错误启动事件\",\n        \"Escalation Boundary Event (non-interrupting)\": \"升级边界事件 (非中断)\",\n        \"Escalation Boundary Event\": \"升级边界事件\",\n        \"Escalation End Event\": \"结束升级事件\",\n        \"Escalation Intermediate Throw Event\": \"中间升级抛出事件\",\n        \"Escalation Start Event (non-interrupting)\": \"升级启动事件 (非中断)\",\n        \"Escalation Start Event\": \"升级启动事件\",\n        \"Event Sub Process\": \"事件子流程\",\n        \"Event based Gateway\": \"事件网关\",\n        \"Exclusive Gateway\": \"排他网关\",\n        \"Expanded Pool\": \"展开池\",\n        \"Inclusive Gateway\": \"包容网关\",\n        \"Intermediate Throw Event\": \"中间抛出事件\",\n        \"Link Intermediate Catch Event\": \"中间链接捕获事件\",\n        \"Link Intermediate Throw Event\": \"中间链接抛出事件\",\n        \"Loop\": \"循环\",\n        \"Manual Task\": \"手动任务\",\n        \"Message Boundary Event (non-interrupting)\": \"消息边界事件 (非中断)\",\n        \"Message Boundary Event\": \"消息边界事件\",\n        \"Message End Event\": \"结束消息事件\",\n        \"Message Intermediate Catch Event\": \"中间消息捕获事件\",\n        \"Message Intermediate Throw Event\": \"中间消息抛出事件\",\n        \"Message Start Event (non-interrupting)\": \"消息启动事件 (非中断)\",\n        \"Message Start Event\": \"消息启动事件\",\n        \"Parallel Gateway\": \"并行网关\",\n        \"Parallel Multi Instance\": \"并行多实例\",\n        \"Receive Task\": \"接收消息任务\",\n        \"Remove\": \"移除\",\n        \"Script Task\": \"脚本任务\",\n        \"Send Task\": \"发送任务\",\n        \"Sequence Flow\": \"顺序流转\",\n        \"Sequential Multi Instance\": \"串行多实例\",\n        \"Service Task\": \"服务任务\",\n        \"Signal Boundary Event (non-interrupting)\": \"信号边界事件 (非中断)\",\n        \"Signal Boundary Event\": \"信号边界事件\",\n        \"Signal End Event\": \"结束信号事件\",\n        \"Signal Intermediate Catch Event\": \"中间信号捕获事件\",\n        \"Signal Intermediate Throw Event\": \"中间信号抛出事件\",\n        \"Signal Start Event (non-interrupting)\": \"信号启动事件 (非中断)\",\n        \"Signal Start Event\": \"信号启动事件\",\n        \"Start Event\": \"开始事件\",\n        \"Sub Process (collapsed)\": \"折叠子流程\",\n        \"Sub Process (expanded)\": \"展开子流程\",\n        \"Sub Process\": \"子流程\",\n        \"Task\": \"任务\",\n        \"TextAnnotation\": \"文本标注\",\n        \"Terminate End Event\": \"终止边界事件\",\n        \"Timer Boundary Event (non-interrupting)\": \"定时边界事件 (非中断)\",\n        \"Timer Boundary Event\": \"定时边界事件\",\n        \"Timer Intermediate Catch Event\": \"中间定时捕获事件\",\n        \"Timer Start Event (non-interrupting)\": \"定时启动事件 (非中断)\",\n        \"Timer Start Event\": \"定时启动事件\",\n        \"Transaction\": \"事务\",\n        \"User Task\": \"用户任务\",\n        \"already rendered {element}\": \"{element} 已呈现\",\n        \"diagram not part of bpmn:Definitions\": \"图表不是 bpmn:Definitions 的一部分\",\n        \"element required\": \"需要元素\",\n        \"element {element} referenced by {referenced}#{property} not yet drawn\": \"元素 {element} 的引用 {referenced}#{property} 尚未绘制\",\n        \"failed to import {element}\": \"{element} 导入失败\",\n        \"flow elements must be children of pools/participants\": \"元素必须是池/参与者的子级\",\n        \"more than {count} child lanes\": \"超过 {count} 条通道\",\n        \"no diagram to display\": \"没有要显示的图表\",\n        \"no parent for {element} in {parent}\": \"在 {element} 中没有父元素 {parent}\",\n        \"no process or collaboration to display\": \"没有可显示的流程或协作\",\n        \"no shape type specified\": \"未指定形状类型\",\n        \"out of bounds release\": \"越界释放\",\n        \"Change element\":\"更换元素\",\n        \"Activate the lasso tool\":\"区域选择\"\n    };\n\n\t$.extend(J.msg, {\n\t\t\"common.view\":\"查看\",\n\t\t\"dataview.add\":\"新增\",\n\t\t\"dataview.dataInfo\":\"数据信息\",\n\t\t\"dataview.originalData\":\"原始数据\",\n\t\t\"dataviewcfg.collectPolicy\":\"收集策略\",\n\t\t\"dataviewcfg.keep\":\"保留\",\n\t\t\"dataviewcfg.ignore\":\"忽略\",\n\t\t\"dataviewcfg.topHtml\":\"顶部HTML\",\n\t\t\"dataviewcfg.bottomHtml\":\"底部HTML\",\n\t\t\"dataviewcfg.pageBeforeRenderScript\":\"页面前处理脚本\",\n\t\t\"dataviewcfg.pageAfterRenderScript\":\"页面后处理脚本\",\n\t\t\"dataviewcfg.pageBeforeCollectScript\":\"收集前处理脚本\",\n\t\t\"dataviewcfg.pageAfterCollectScript\":\"收集后处理脚本\",\n\t\t\"dataviewcfg.nullPolicyTooltip\":\"配置收集时的null值处理方式,一般全量模板选择忽略，其他选择空或保留\",\n\t\t\"dataviewcfg.tabName\":\"选项卡名称\",\n\t\t\"dataviewcfg.siderBar\":\"侧边栏\",\n\t\t\"dataviewcfg.siderBarLevel\":\"侧边栏层级\",\n\t\t\"dataviewcfg.panelName\":\"面板名称\",\n\t\t\"dataviewcfg.show\":\"显示\",\n\t\t\"dataviewcfg.cardName\":\"卡片名称\",\n\t\t\"dataviewcfg.elementPerRow\":\"每行元素数\",\n\t\t\"dataviewcfg.configName\":\"配置名称\",\n\t\t\"dataviewcfg.configType\":\"配置类型\",\n\t\t\"dataviewcfg.selectTypeTip\":\"请选择\",\n\t\t\"dataviewcfg.textType\":\"文本\",\n\t\t\"dataviewcfg.selectType\":\"下拉\",\n\t\t\"dataviewcfg.areaType\":\"区域\",\n\t\t\"dataviewcfg.fixTextType\":\"固定文本\",\n\t\t\"dataviewcfg.tableSelectType\":\"表格选择\",\n\t\t\"dataviewcfg.listSelectType\":\"列表选择\",\n\t\t\"dataviewcfg.selfType\":\"自定义\",\n\t\t\"dataviewcfg.flowType\":\"流程\",\n\t\t\"dataviewcfg.fsmType\":\"状态机\",\n\t\t\"dataviewcfg.dateType\":\"日期\",\n\t\t\"dataviewcfg.fileType\":\"文件\",\n\t\t\"dataviewcfg.cardListType\":\"卡片列表\",\n\t\t\"dataviewcfg.tableType\":\"表格\",\n\t\t\"dataviewcfg.elementsCardType\":\"卡片\",\n\t\t\"dataviewcfg.maskInputType\":\"掩码输入\",\n\t\t\"dataviewcfg.gridColNum\":\"栅格列数\",\n\t\t\"dataviewcfg.gridColAuto\":\"自动\",\n\t\t\"dataviewcfg.newLine\":\"换行\",\n\t\t\"dataviewcfg.yes\":\"是\",\n\t\t\"dataviewcfg.no\":\"否\",\n\t\t\"dataviewcfg.colsTooltip\":\"对应bootstrap中的col-{栅格列数}，自动代表为col自适应\",\n\t\t\"dataviewcfg.newLineTooltip\":\"下一个元素换行显示\",\n\t\t\"dataviewcfg.paramConfig\":\"参数配置\",\n\t\t\"dataviewcfg.config\":\"配置\",\n\t\t\"dataviewcfg.confirm\":\"确定\",\n\t\t\"dataviewcfg.required\":\"必填\",\n\t\t\"dataviewcfg.configDesc\":\"配置说明\",\n\t\t\"dataviewcfg.descTooltip\":\"提示信息，一般说明此配置项的使用场景、使用方式、如何配置等\",\n\t\t\"dataviewcfg.modifyOnAdd\":\"新增可修改\",\n\t\t\"dataviewcfg.modifyOnAddTooltip\":\"新增页面中，此配置项是否可修改，如不可修改则建议设置一个默认值\",\n\t\t\"dataviewcfg.modifyOnEdit\":\"编辑可修改\",\n\t\t\"dataviewcfg.modifyOnEditTooltip\":\"修改页面中，此配置项是否可修改\",\n\t\t\"dataviewcfg.valType\":\"值类型\",\n\t\t\"dataviewcfg.valTypeTooltip\":\"string类型：元素值获取到后直接使用；json类型：元素值转换为json对象后使用\",\n\t\t\"dataviewcfg.defaultVal\":\"默认值\",\n\t\t\"dataviewcfg.defaultValTooltip\":\"新增时的默认填写值\",\n\t\t\"dataviewcfg.validateRule\":\"校验规则\",\n\t\t\"dataviewcfg.validateRuleTooltip\":'校验规则，基于jquery validate；参考格式为：[{\"type\":\"maxlength\",\"value\":\"5\",\"message\":\"最大长度为5\"}]',\n\t\t\"dataviewcfg.source\":\"需求来源\",\n\t\t\"dataviewcfg.sourcePm\":\"产品\",\n\t\t\"dataviewcfg.sourceDev\":\"研发\",\n\t\t\"dataviewcfg.sourceTooltip\":\"配置参数需求来源，暂无作用\",\n\t\t\"dataviewcfg.valProcess\":\"值处理\",\n\t\t\"dataviewcfg.key\":\"键值\",\n\t\t\"dataviewcfg.keyPath\":\"键值路径\",\n\t\t\"dataviewcfg.self\":\"自定义\",\n\t\t\"dataviewcfg.valProcessTooltip\":\"如何将元素值与json配置映射，键值：映射到json的一级元素；键值路径：映射到json的一级元素中的某个jsonpath，如$.custNo；自定义：其他方式\",\n\t\t\"dataviewcfg.path\":\"路径\",\n\t\t\"dataviewcfg.script\":\"脚本\",\n\t\t\"dataviewcfg.beforeRender\":\"渲染前\",\n\t\t\"dataviewcfg.beforeRenderTooltip\":\"高级自定义用法，元素渲染前的处理方法，javascript代码\",\n\t\t\"dataviewcfg.afterRender\":\"渲染后\",\n\t\t\"dataviewcfg.afterRenderTooltip\":\"高级自定义用法，元素渲染后的处理方法，javascript代码\",\n\t\t\"dataviewcfg.extConfig\":\"扩展配置\",\n\t\t\"dataviewcfg.extConfigTooltip\":\"高级自定义用法，javascript对象，对象中的属性会覆盖或追加到配置数据中，key值不能为ext\",\n\t\t\"dataviewcfg.selfScript\":\"自定义脚本\",\n\t\t\"dataviewcfg.selectTypeSelect\":\"类型\",\n\t\t\"dataviewcfg.single\":\"单选\",\n\t\t\"dataviewcfg.multiple\":\"多选\",\n\t\t\"dataviewcfg.seqMultipe\":\"顺序多选\",\n\t\t\"dataviewcfg.selectValType\":\"选择值类型\",\n\t\t\"dataviewcfg.default\":\"默认\",\n\t\t\"dataviewcfg.commaSep\":\"逗号隔开的字符串\",\n\t\t\"dataviewcfg.optionName\":\"选项名称\",\n\t\t\"dataviewcfg.optionValue\":\"选项值\",\n\t\t\"dataviewcfg.addConfigItem\":\"新增配置项\",\n\t\t\"dataviewcfg.add\":\"增加\",\n\t\t\"dataviewcfg.fileCount\":\"文件个数\",\n\t\t\"dataviewcfg.singleFile\":\"单文件\",\n\t\t\"dataviewcfg.multipleFile\":\"多文件\",\n\t\t\n\t\t\"dataviewapp.viewChange\":\"视图切换\",\n\t\t\"dataviewapp.dataView\":\"数据查看\",\n\t\t\"dataviewapp.dataMap\":\"映射开关\",\n\t\t\"dataviewapp.dataMapTtitle\":\"映射开关(点击文本展示数据路径)\",\n\t\t\"dataviewapp.viewChangeTitle\":\"视图模板切换\",\n\t\t\"dataviewapp.dataView\":\"数据查看\",\n\t\t\"dataviewapp.currentData\":\"当前数据\",\n\t\t\"dataviewapp.oldData\":\"旧数据\",\n\t\t\"dataviewapp.dataCompare\":\"数据比对\",\n\t\t\"dataviewapp.dataRender\":\"数据渲染\",\n\t\t\"dataviewapp.save\":\"提交保存\",\n\t\t\"dataviewapp.close\":\"关闭\",\n\t\t\"dataviewapp.newOldDataCompare\":\"新旧数据比较\",\n\t\t\"dataviewapp.dataItem\":\"数据项\",\n\t\t\"dataviewapp.originalVal\":\"原始值\",\n\t\t\"dataviewapp.afterVal\":\"修改后值\",\n\t\t\"dataviewapp.dataKey\":\"数据键值\",\n\t\t\"dataviewapp.keyPath\":\"键值路径\",\n\t\t\"dataviewapp.selectCheck1\":\"下拉选项不全,请到视图配置模板中添加. 名称\",\n\t\t\"dataviewapp.selectCheck2\":\"键值\",\n\t\t\"dataviewapp.selectCheck3\":\"选项列表\",\n\t\t\"dataviewapp.selectCheck4\":\"当前值\",\n\t\t\"dataviewapp.notJsonFormat\":\"数据非JSON格式\",\n\t\t\"dataviewapp.enable\":\"启用\",\n\t\t\"dataviewapp.diable\":\"禁用\",\n\t\t\n\t\t});\n}\n})(window.J);"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bootstrap-multiselect/css/bootstrap-multiselect.css",
    "content": "span.multiselect-native-select{position:relative}span.multiselect-native-select select{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px -1px -1px -3px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important;left:50%;top:30px}.multiselect-container{position:absolute;list-style-type:none;margin:0;padding:0}.multiselect-container .input-group{margin:5px}.multiselect-container .multiselect-reset .input-group{width:93%}.multiselect-container>li{padding:0}.multiselect-container>li>a.multiselect-all label{font-weight:700}.multiselect-container>li.multiselect-group label{margin:0;padding:3px 20px;height:100%;font-weight:700}.multiselect-container>li.multiselect-group-clickable label{cursor:pointer}.multiselect-container>li>a{padding:0}.multiselect-container>li>a>label{margin:0;height:100%;cursor:pointer;font-weight:400;padding:3px 20px 3px 40px}.multiselect-container>li>a>label.checkbox,.multiselect-container>li>a>label.radio{margin:0}.multiselect-container>li>a>label>input[type=checkbox]{margin-bottom:5px}.btn-group>.btn-group:nth-child(2)>.multiselect.btn{border-top-left-radius:4px;border-bottom-left-radius:4px}.form-inline .multiselect-container label.checkbox,.form-inline .multiselect-container label.radio{padding:3px 20px 3px 40px}.form-inline .multiselect-container li a label.checkbox input[type=checkbox],.form-inline .multiselect-container li a label.radio input[type=radio]{margin-left:-20px;margin-right:0}"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bootstrap-multiselect/js/bootstrap-multiselect.js",
    "content": "/**\n * Bootstrap Multiselect (http://davidstutz.de/bootstrap-multiselect/)\n *\n * Apache License, Version 2.0:\n * Copyright (c) 2012 - 2018 David Stutz\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a\n * copy of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n *\n * BSD 3-Clause License:\n * Copyright (c) 2012 - 2018 David Stutz\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *    - Redistributions of source code must retain the above copyright notice,\n *      this list of conditions and the following disclaimer.\n *    - Redistributions in binary form must reproduce the above copyright notice,\n *      this list of conditions and the following disclaimer in the documentation\n *      and/or other materials provided with the distribution.\n *    - Neither the name of David Stutz nor the names of its contributors may be\n *      used to endorse or promote products derived from this software without\n *      specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n(function (root, factory) {\n    // check to see if 'knockout' AMD module is specified if using requirejs\n    if (typeof define === 'function' && define.amd &&\n        typeof require === 'function' && typeof require.specified === 'function' && require.specified('knockout')) {\n\n        // AMD. Register as an anonymous module.\n        define(['jquery', 'knockout'], factory);\n    } else {\n        // Browser globals\n        factory(root.jQuery, root.ko);\n    }\n})(this, function ($, ko) {\n    \"use strict\";// jshint ;_;\n\n    if (typeof ko !== 'undefined' && ko.bindingHandlers && !ko.bindingHandlers.multiselect) {\n        ko.bindingHandlers.multiselect = {\n            after: ['options', 'value', 'selectedOptions', 'enable', 'disable'],\n\n            init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {\n                var $element = $(element);\n                var config = ko.toJS(valueAccessor());\n\n                $element.multiselect(config);\n\n                if (allBindings.has('options')) {\n                    var options = allBindings.get('options');\n                    if (ko.isObservable(options)) {\n                        ko.computed({\n                            read: function() {\n                                options();\n                                setTimeout(function() {\n                                    var ms = $element.data('multiselect');\n                                    if (ms)\n                                        ms.updateOriginalOptions();//Not sure how beneficial this is.\n                                    $element.multiselect('rebuild');\n                                }, 1);\n                            },\n                            disposeWhenNodeIsRemoved: element\n                        });\n                    }\n                }\n\n                //value and selectedOptions are two-way, so these will be triggered even by our own actions.\n                //It needs some way to tell if they are triggered because of us or because of outside change.\n                //It doesn't loop but it's a waste of processing.\n                if (allBindings.has('value')) {\n                    var value = allBindings.get('value');\n                    if (ko.isObservable(value)) {\n                        ko.computed({\n                            read: function() {\n                                value();\n                                setTimeout(function() {\n                                    $element.multiselect('refresh');\n                                }, 1);\n                            },\n                            disposeWhenNodeIsRemoved: element\n                        }).extend({ rateLimit: 100, notifyWhenChangesStop: true });\n                    }\n                }\n\n                //Switched from arrayChange subscription to general subscription using 'refresh'.\n                //Not sure performance is any better using 'select' and 'deselect'.\n                if (allBindings.has('selectedOptions')) {\n                    var selectedOptions = allBindings.get('selectedOptions');\n                    if (ko.isObservable(selectedOptions)) {\n                        ko.computed({\n                            read: function() {\n                                selectedOptions();\n                                setTimeout(function() {\n                                    $element.multiselect('refresh');\n                                }, 1);\n                            },\n                            disposeWhenNodeIsRemoved: element\n                        }).extend({ rateLimit: 100, notifyWhenChangesStop: true });\n                    }\n                }\n\n                var setEnabled = function (enable) {\n                    setTimeout(function () {\n                        if (enable)\n                            $element.multiselect('enable');\n                        else\n                            $element.multiselect('disable');\n                    });\n                };\n\n                if (allBindings.has('enable')) {\n                    var enable = allBindings.get('enable');\n                    if (ko.isObservable(enable)) {\n                        ko.computed({\n                            read: function () {\n                                setEnabled(enable());\n                            },\n                            disposeWhenNodeIsRemoved: element\n                        }).extend({ rateLimit: 100, notifyWhenChangesStop: true });\n                    } else {\n                        setEnabled(enable);\n                    }\n                }\n\n                if (allBindings.has('disable')) {\n                    var disable = allBindings.get('disable');\n                    if (ko.isObservable(disable)) {\n                        ko.computed({\n                            read: function () {\n                                setEnabled(!disable());\n                            },\n                            disposeWhenNodeIsRemoved: element\n                        }).extend({ rateLimit: 100, notifyWhenChangesStop: true });\n                    } else {\n                        setEnabled(!disable);\n                    }\n                }\n\n                ko.utils.domNodeDisposal.addDisposeCallback(element, function() {\n                    $element.multiselect('destroy');\n                });\n            },\n\n            update: function(element, valueAccessor, allBindings, viewModel, bindingContext) {\n                var $element = $(element);\n                var config = ko.toJS(valueAccessor());\n\n                $element.multiselect('setOptions', config);\n                $element.multiselect('rebuild');\n            }\n        };\n    }\n\n    function forEach(array, callback) {\n        for (var index = 0; index < array.length; ++index) {\n            callback(array[index], index);\n        }\n    }\n\n    /**\n     * Constructor to create a new multiselect using the given select.\n     *\n     * @param {jQuery} select\n     * @param {Object} options\n     * @returns {Multiselect}\n     */\n    function Multiselect(select, options) {\n\n        this.$select = $(select);\n        this.options = this.mergeOptions($.extend({}, options, this.$select.data()));\n\n        // Placeholder via data attributes\n        if (this.$select.attr(\"data-placeholder\")) {\n            this.options.nonSelectedText = this.$select.data(\"placeholder\");\n        }\n\n        // Initialization.\n        // We have to clone to create a new reference.\n        this.originalOptions = this.$select.clone()[0].options;\n        this.query = '';\n        this.searchTimeout = null;\n        this.lastToggledInput = null;\n\n        this.options.multiple = this.$select.attr('multiple') === \"multiple\";\n        this.options.onChange = $.proxy(this.options.onChange, this);\n        this.options.onSelectAll = $.proxy(this.options.onSelectAll, this);\n        this.options.onDeselectAll = $.proxy(this.options.onDeselectAll, this);\n        this.options.onDropdownShow = $.proxy(this.options.onDropdownShow, this);\n        this.options.onDropdownHide = $.proxy(this.options.onDropdownHide, this);\n        this.options.onDropdownShown = $.proxy(this.options.onDropdownShown, this);\n        this.options.onDropdownHidden = $.proxy(this.options.onDropdownHidden, this);\n        this.options.onInitialized = $.proxy(this.options.onInitialized, this);\n        this.options.onFiltering = $.proxy(this.options.onFiltering, this);\n\n        // Build select all if enabled.\n        this.buildContainer();\n        this.buildButton();\n        this.buildDropdown();\n        this.buildReset();\n        this.buildSelectAll();\n        this.buildDropdownOptions();\n        this.buildFilter();\n\n        this.updateButtonText();\n        this.updateSelectAll(true);\n\n        if (this.options.enableClickableOptGroups && this.options.multiple) {\n            this.updateOptGroups();\n        }\n\n        this.options.wasDisabled = this.$select.prop('disabled');\n        if (this.options.disableIfEmpty && $('option', this.$select).length <= 0) {\n            this.disable();\n        }\n\n        this.$select.wrap('<span class=\"multiselect-native-select\" />').after(this.$container);\n        this.options.onInitialized(this.$select, this.$container);\n    }\n\n    Multiselect.prototype = {\n\n        defaults: {\n            /**\n             * Default text function will either print 'None selected' in case no\n             * option is selected or a list of the selected options up to a length\n             * of 3 selected options.\n             *\n             * @param {jQuery} options\n             * @param {jQuery} select\n             * @returns {String}\n             */\n            buttonText: function(options, select) {\n                if (this.disabledText.length > 0\n                        && (select.prop('disabled') || (options.length == 0 && this.disableIfEmpty)))  {\n\n                    return this.disabledText;\n                }\n                else if (options.length === 0) {\n                    return this.nonSelectedText;\n                }\n                else if (this.allSelectedText\n                        && options.length === $('option', $(select)).length\n                        && $('option', $(select)).length !== 1\n                        && this.multiple) {\n\n                    if (this.selectAllNumber) {\n                        return this.allSelectedText + ' (' + options.length + ')';\n                    }\n                    else {\n                        return this.allSelectedText;\n                    }\n                }\n                else if (this.numberDisplayed != 0 && options.length > this.numberDisplayed) {\n                    return options.length + ' ' + this.nSelectedText;\n                }\n                else {\n                    var selected = '';\n                    var delimiter = this.delimiterText;\n\n                    options.each(function() {\n                        var label = ($(this).attr('label') !== undefined) ? $(this).attr('label') : $(this).text();\n                        selected += label + delimiter;\n                    });\n\n                    return selected.substr(0, selected.length - this.delimiterText.length);\n                }\n            },\n            /**\n             * Updates the title of the button similar to the buttonText function.\n             *\n             * @param {jQuery} options\n             * @param {jQuery} select\n             * @returns {@exp;selected@call;substr}\n             */\n            buttonTitle: function(options, select) {\n                if (options.length === 0) {\n                    return this.nonSelectedText;\n                }\n                else {\n                    var selected = '';\n                    var delimiter = this.delimiterText;\n\n                    options.each(function () {\n                        var label = ($(this).attr('label') !== undefined) ? $(this).attr('label') : $(this).text();\n                        selected += label + delimiter;\n                    });\n                    return selected.substr(0, selected.length - this.delimiterText.length);\n                }\n            },\n            checkboxName: function(option) {\n                return false; // no checkbox name\n            },\n            /**\n             * Create a label.\n             *\n             * @param {jQuery} element\n             * @returns {String}\n             */\n            optionLabel: function(element){\n                return $(element).attr('label') || $(element).text();\n            },\n            /**\n             * Create a class.\n             *\n             * @param {jQuery} element\n             * @returns {String}\n             */\n            optionClass: function(element) {\n                return $(element).attr('class') || '';\n            },\n            /**\n             * Triggered on change of the multiselect.\n             *\n             * Not triggered when selecting/deselecting options manually.\n             *\n             * @param {jQuery} option\n             * @param {Boolean} checked\n             */\n            onChange : function(option, checked) {\n\n            },\n            /**\n             * Triggered when the dropdown is shown.\n             *\n             * @param {jQuery} event\n             */\n            onDropdownShow: function(event) {\n\n            },\n            /**\n             * Triggered when the dropdown is hidden.\n             *\n             * @param {jQuery} event\n             */\n            onDropdownHide: function(event) {\n\n            },\n            /**\n             * Triggered after the dropdown is shown.\n             *\n             * @param {jQuery} event\n             */\n            onDropdownShown: function(event) {\n\n            },\n            /**\n             * Triggered after the dropdown is hidden.\n             *\n             * @param {jQuery} event\n             */\n            onDropdownHidden: function(event) {\n\n            },\n            /**\n             * Triggered on select all.\n             */\n            onSelectAll: function() {\n\n            },\n            /**\n             * Triggered on deselect all.\n             */\n            onDeselectAll: function() {\n\n            },\n            /**\n             * Triggered after initializing.\n             *\n             * @param {jQuery} $select\n             * @param {jQuery} $container\n             */\n            onInitialized: function($select, $container) {\n\n            },\n            /**\n             * Triggered on filtering.\n             *\n             * @param {jQuery} $filter\n             */\n            onFiltering: function($filter) {\n\n            },\n            enableHTML: false,\n            buttonClass: 'btn btn-default',\n            inheritClass: false,\n            buttonWidth: 'auto',\n            buttonContainer: '<div class=\"btn-group\" />',\n            dropRight: false,\n            dropUp: false,\n            selectedClass: 'active',\n            // Maximum height of the dropdown menu.\n            // If maximum height is exceeded a scrollbar will be displayed.\n            maxHeight: false,\n            includeSelectAllOption: false,\n            includeSelectAllIfMoreThan: 0,\n            selectAllText: ' Select all',\n            selectAllValue: 'multiselect-all',\n            selectAllName: false,\n            selectAllNumber: true,\n            selectAllJustVisible: true,\n            enableFiltering: false,\n            enableCaseInsensitiveFiltering: false,\n            enableFullValueFiltering: false,\n            enableClickableOptGroups: false,\n            enableCollapsibleOptGroups: false,\n            collapseOptGroupsByDefault: false,\n            filterPlaceholder: 'Search',\n            // possible options: 'text', 'value', 'both'\n            filterBehavior: 'text',\n            includeFilterClearBtn: true,\n            preventInputChangeEvent: false,\n            nonSelectedText: 'None selected',\n            nSelectedText: 'selected',\n            allSelectedText: 'All selected',\n            numberDisplayed: 3,\n            disableIfEmpty: false,\n            disabledText: '',\n            delimiterText: ', ',\n            includeResetOption: false,\n            includeResetDivider: false,\n            resetText: 'Reset',\n            templates: {\n                button: '<button type=\"button\" class=\"multiselect dropdown-toggle\" data-toggle=\"dropdown\"><span class=\"multiselect-selected-text\"></span> <b class=\"caret\"></b></button>',\n                ul: '<ul class=\"multiselect-container dropdown-menu\"></ul>',\n                filter: '<li class=\"multiselect-item multiselect-filter\"><div class=\"input-group\"><span class=\"input-group-addon\"><i class=\"glyphicon glyphicon-search\"></i></span><input class=\"form-control multiselect-search\" type=\"text\" /></div></li>',\n                filterClearBtn: '<span class=\"input-group-btn\"><button class=\"btn btn-default multiselect-clear-filter\" type=\"button\"><i class=\"glyphicon glyphicon-remove-circle\"></i></button></span>',\n                li: '<li><a tabindex=\"0\"><label></label></a></li>',\n                divider: '<li class=\"multiselect-item divider\"></li>',\n                liGroup: '<li class=\"multiselect-item multiselect-group\"><label></label></li>',\n                resetButton: '<li class=\"multiselect-reset text-center\"><div class=\"input-group\"><a class=\"btn btn-default btn-block\"></a></div></li>'\n            }\n        },\n\n        constructor: Multiselect,\n\n        /**\n         * Builds the container of the multiselect.\n         */\n        buildContainer: function() {\n            this.$container = $(this.options.buttonContainer);\n            this.$container.on('show.bs.dropdown', this.options.onDropdownShow);\n            this.$container.on('hide.bs.dropdown', this.options.onDropdownHide);\n            this.$container.on('shown.bs.dropdown', this.options.onDropdownShown);\n            this.$container.on('hidden.bs.dropdown', this.options.onDropdownHidden);\n        },\n\n        /**\n         * Builds the button of the multiselect.\n         */\n        buildButton: function() {\n            this.$button = $(this.options.templates.button).addClass(this.options.buttonClass);\n            if (this.$select.attr('class') && this.options.inheritClass) {\n                this.$button.addClass(this.$select.attr('class'));\n            }\n            // Adopt active state.\n            if (this.$select.prop('disabled')) {\n                this.disable();\n            }\n            else {\n                this.enable();\n            }\n\n            // Manually add button width if set.\n            if (this.options.buttonWidth && this.options.buttonWidth !== 'auto') {\n                this.$button.css({\n                    'width' : '100%', //this.options.buttonWidth,\n                    'overflow' : 'hidden',\n                    'text-overflow' : 'ellipsis'\n                });\n                this.$container.css({\n                    'width': this.options.buttonWidth\n                });\n            }\n\n            // Keep the tab index from the select.\n            var tabindex = this.$select.attr('tabindex');\n            if (tabindex) {\n                this.$button.attr('tabindex', tabindex);\n            }\n\n            this.$container.prepend(this.$button);\n        },\n\n        /**\n         * Builds the ul representing the dropdown menu.\n         */\n        buildDropdown: function() {\n\n            // Build ul.\n            this.$ul = $(this.options.templates.ul);\n\n            if (this.options.dropRight) {\n                this.$ul.addClass('pull-right');\n            }\n\n            // Set max height of dropdown menu to activate auto scrollbar.\n            if (this.options.maxHeight) {\n                // TODO: Add a class for this option to move the css declarations.\n                this.$ul.css({\n                    'max-height': this.options.maxHeight + 'px',\n                    'overflow-y': 'auto',\n                    'overflow-x': 'hidden'\n                });\n            }\n\n            if (this.options.dropUp) {\n\n                var height = Math.min(this.options.maxHeight, $('option[data-role!=\"divider\"]', this.$select).length*26 + $('option[data-role=\"divider\"]', this.$select).length*19 + (this.options.includeSelectAllOption ? 26 : 0) + (this.options.enableFiltering || this.options.enableCaseInsensitiveFiltering ? 44 : 0));\n                var moveCalc = height + 34;\n\n                this.$ul.css({\n                    'max-height': height + 'px',\n                    'overflow-y': 'auto',\n                    'overflow-x': 'hidden',\n                    'margin-top': \"-\" + moveCalc + 'px'\n                });\n            }\n\n            this.$container.append(this.$ul);\n        },\n\n        /**\n         * Build the dropdown options and binds all necessary events.\n         *\n         * Uses createDivider and createOptionValue to create the necessary options.\n         */\n        buildDropdownOptions: function() {\n\n            this.$select.children().each($.proxy(function(index, element) {\n\n                var $element = $(element);\n                // Support optgroups and options without a group simultaneously.\n                var tag = $element.prop('tagName')\n                    .toLowerCase();\n\n                if ($element.prop('value') === this.options.selectAllValue) {\n                    return;\n                }\n\n                if (tag === 'optgroup') {\n                    this.createOptgroup(element);\n                }\n                else if (tag === 'option') {\n\n                    if ($element.data('role') === 'divider') {\n                        this.createDivider();\n                    }\n                    else {\n                        this.createOptionValue(element);\n                    }\n\n                }\n\n                // Other illegal tags will be ignored.\n            }, this));\n\n            // Bind the change event on the dropdown elements.\n            $(this.$ul).off('change', 'li:not(.multiselect-group) input[type=\"checkbox\"], li:not(.multiselect-group) input[type=\"radio\"]');\n            $(this.$ul).on('change', 'li:not(.multiselect-group) input[type=\"checkbox\"], li:not(.multiselect-group) input[type=\"radio\"]', $.proxy(function(event) {\n                var $target = $(event.target);\n\n                var checked = $target.prop('checked') || false;\n                var isSelectAllOption = $target.val() === this.options.selectAllValue;\n\n                // Apply or unapply the configured selected class.\n                if (this.options.selectedClass) {\n                    if (checked) {\n                        $target.closest('li')\n                            .addClass(this.options.selectedClass);\n                    }\n                    else {\n                        $target.closest('li')\n                            .removeClass(this.options.selectedClass);\n                    }\n                }\n\n                // Get the corresponding option.\n                var value = $target.val();\n                var $option = this.getOptionByValue(value);\n\n                var $optionsNotThis = $('option', this.$select).not($option);\n                var $checkboxesNotThis = $('input', this.$container).not($target);\n\n                if (isSelectAllOption) {\n\n                    if (checked) {\n                        this.selectAll(this.options.selectAllJustVisible, true);\n                    }\n                    else {\n                        this.deselectAll(this.options.selectAllJustVisible, true);\n                    }\n                }\n                else {\n                    if (checked) {\n                        $option.prop('selected', true);\n\n                        if (this.options.multiple) {\n                            // Simply select additional option.\n                            $option.prop('selected', true);\n                        }\n                        else {\n                            // Unselect all other options and corresponding checkboxes.\n                            if (this.options.selectedClass) {\n                                $($checkboxesNotThis).closest('li').removeClass(this.options.selectedClass);\n                            }\n\n                            $($checkboxesNotThis).prop('checked', false);\n                            $optionsNotThis.prop('selected', false);\n\n                            // It's a single selection, so close.\n                            this.$button.click();\n                        }\n\n                        if (this.options.selectedClass === \"active\") {\n                            $optionsNotThis.closest(\"a\").css(\"outline\", \"\");\n                        }\n                    }\n                    else {\n                        // Unselect option.\n                        $option.prop('selected', false);\n                    }\n\n                    // To prevent select all from firing onChange: #575\n                    this.options.onChange($option, checked);\n\n                    // Do not update select all or optgroups on select all change!\n                    this.updateSelectAll();\n\n                    if (this.options.enableClickableOptGroups && this.options.multiple) {\n                        this.updateOptGroups();\n                    }\n                }\n\n                this.$select.change();\n                this.updateButtonText();\n\n                if(this.options.preventInputChangeEvent) {\n                    return false;\n                }\n            }, this));\n\n            $('li a', this.$ul).on('mousedown', function(e) {\n                if (e.shiftKey) {\n                    // Prevent selecting text by Shift+click\n                    return false;\n                }\n            });\n\n            $(this.$ul).on('touchstart click', 'li a', $.proxy(function(event) {\n                event.stopPropagation();\n\n                var $target = $(event.target);\n\n                if (event.shiftKey && this.options.multiple) {\n                    if($target.is(\"label\")){ // Handles checkbox selection manually (see https://github.com/davidstutz/bootstrap-multiselect/issues/431)\n                        event.preventDefault();\n                        $target = $target.find(\"input\");\n                        $target.prop(\"checked\", !$target.prop(\"checked\"));\n                    }\n                    var checked = $target.prop('checked') || false;\n\n                    if (this.lastToggledInput !== null && this.lastToggledInput !== $target) { // Make sure we actually have a range\n                        var from = this.$ul.find(\"li:visible\").index($target.parents(\"li\"));\n                        var to = this.$ul.find(\"li:visible\").index(this.lastToggledInput.parents(\"li\"));\n\n                        if (from > to) { // Swap the indices\n                            var tmp = to;\n                            to = from;\n                            from = tmp;\n                        }\n\n                        // Make sure we grab all elements since slice excludes the last index\n                        ++to;\n\n                        // Change the checkboxes and underlying options\n                        var range = this.$ul.find(\"li\").not(\".multiselect-filter-hidden\").slice(from, to).find(\"input\");\n\n                        range.prop('checked', checked);\n\n                        if (this.options.selectedClass) {\n                            range.closest('li')\n                                .toggleClass(this.options.selectedClass, checked);\n                        }\n\n                        for (var i = 0, j = range.length; i < j; i++) {\n                            var $checkbox = $(range[i]);\n\n                            var $option = this.getOptionByValue($checkbox.val());\n\n                            $option.prop('selected', checked);\n                        }\n                    }\n\n                    // Trigger the select \"change\" event\n                    $target.trigger(\"change\");\n                }\n\n                // Remembers last clicked option\n                if($target.is(\"input\") && !$target.closest(\"li\").is(\".multiselect-item\")){\n                    this.lastToggledInput = $target;\n                }\n\n                $target.blur();\n            }, this));\n\n            // Keyboard support.\n            this.$container.off('keydown.multiselect').on('keydown.multiselect', $.proxy(function(event) {\n                if ($('input[type=\"text\"]', this.$container).is(':focus')) {\n                    return;\n                }\n\n                if (event.keyCode === 9 && this.$container.hasClass('open')) {\n                    this.$button.click();\n                }\n                else {\n                    var $items = $(this.$container).find(\"li:not(.divider):not(.disabled) a\").filter(\":visible\");\n\n                    if (!$items.length) {\n                        return;\n                    }\n\n                    var index = $items.index($items.filter(':focus'));\n                    \n                    // Navigation up.\n                    if (event.keyCode === 38 && index > 0) {\n                        index--;\n                    }\n                    // Navigate down.\n                    else if (event.keyCode === 40 && index < $items.length - 1) {\n                        index++;\n                    }\n                    else if (!~index) {\n                        index = 0;\n                    }\n\n                    var $current = $items.eq(index);\n                    $current.focus();\n\n                    if (event.keyCode === 32 || event.keyCode === 13) {\n                        var $checkbox = $current.find('input');\n\n                        $checkbox.prop(\"checked\", !$checkbox.prop(\"checked\"));\n                        $checkbox.change();\n                    }\n\n                    event.stopPropagation();\n                    event.preventDefault();\n                }\n            }, this));\n\n            if (this.options.enableClickableOptGroups && this.options.multiple) {\n                $(\"li.multiselect-group input\", this.$ul).on(\"change\", $.proxy(function(event) {\n                    event.stopPropagation();\n\n                    var $target = $(event.target);\n                    var checked = $target.prop('checked') || false;\n\n                    var $li = $(event.target).closest('li');\n                    var $group = $li.nextUntil(\"li.multiselect-group\")\n                        .not('.multiselect-filter-hidden')\n                        .not('.disabled');\n\n                    var $inputs = $group.find(\"input\");\n\n                    var values = [];\n                    var $options = [];\n\n                    if (this.options.selectedClass) {\n                        if (checked) {\n                            $li.addClass(this.options.selectedClass);\n                        }\n                        else {\n                            $li.removeClass(this.options.selectedClass);\n                        }\n                    }\n\n                    $.each($inputs, $.proxy(function(index, input) {\n                        var value = $(input).val();\n                        var $option = this.getOptionByValue(value);\n\n                        if (checked) {\n                            $(input).prop('checked', true);\n                            $(input).closest('li')\n                                .addClass(this.options.selectedClass);\n\n                            $option.prop('selected', true);\n                        }\n                        else {\n                            $(input).prop('checked', false);\n                            $(input).closest('li')\n                                .removeClass(this.options.selectedClass);\n\n                            $option.prop('selected', false);\n                        }\n\n                        $options.push(this.getOptionByValue(value));\n                    }, this))\n\n                    // Cannot use select or deselect here because it would call updateOptGroups again.\n\n                    this.options.onChange($options, checked);\n\n                    this.$select.change();\n                    this.updateButtonText();\n                    this.updateSelectAll();\n                }, this));\n            }\n\n            if (this.options.enableCollapsibleOptGroups && this.options.multiple) {\n                $(\"li.multiselect-group .caret-container\", this.$ul).on(\"click\", $.proxy(function(event) {\n                    var $li = $(event.target).closest('li');\n                    var $inputs = $li.nextUntil(\"li.multiselect-group\")\n                            .not('.multiselect-filter-hidden');\n\n                    var visible = true;\n                    $inputs.each(function() {\n                        visible = visible && !$(this).hasClass('multiselect-collapsible-hidden');\n                    });\n\n                    if (visible) {\n                        $inputs.hide()\n                            .addClass('multiselect-collapsible-hidden');\n                    }\n                    else {\n                        $inputs.show()\n                            .removeClass('multiselect-collapsible-hidden');\n                    }\n                }, this));\n\n                $(\"li.multiselect-all\", this.$ul).css('background', '#f3f3f3').css('border-bottom', '1px solid #eaeaea');\n                $(\"li.multiselect-all > a > label.checkbox\", this.$ul).css('padding', '3px 20px 3px 35px');\n                $(\"li.multiselect-group > a > input\", this.$ul).css('margin', '4px 0px 5px -20px');\n            }\n        },\n\n        /**\n         * Create an option using the given select option.\n         *\n         * @param {jQuery} element\n         */\n        createOptionValue: function(element) {\n            var $element = $(element);\n            if ($element.is(':selected')) {\n                $element.prop('selected', true);\n            }\n\n            // Support the label attribute on options.\n            var label = this.options.optionLabel(element);\n            var classes = this.options.optionClass(element);\n            var value = $element.val();\n            var inputType = this.options.multiple ? \"checkbox\" : \"radio\";\n\n            var $li = $(this.options.templates.li);\n            var $label = $('label', $li);\n            $label.addClass(inputType);\n            $label.attr(\"title\", label);\n            $li.addClass(classes);\n\n            // Hide all children items when collapseOptGroupsByDefault is true\n            if (this.options.collapseOptGroupsByDefault && $(element).parent().prop(\"tagName\").toLowerCase() === \"optgroup\") {\n                $li.addClass(\"multiselect-collapsible-hidden\");\n                $li.hide();\n            }\n\n            if (this.options.enableHTML) {\n                $label.html(\" \" + label);\n            }\n            else {\n                $label.text(\" \" + label);\n            }\n\n            var $checkbox = $('<input/>').attr('type', inputType);\n\n            var name = this.options.checkboxName($element);\n            if (name) {\n                $checkbox.attr('name', name);\n            }\n\n            $label.prepend($checkbox);\n\n            var selected = $element.prop('selected') || false;\n            $checkbox.val(value);\n\n            if (value === this.options.selectAllValue) {\n                $li.addClass(\"multiselect-item multiselect-all\");\n                $checkbox.parent().parent()\n                    .addClass('multiselect-all');\n            }\n\n            $label.attr('title', $element.attr('title'));\n\n            this.$ul.append($li);\n\n            if ($element.is(':disabled')) {\n                $checkbox.attr('disabled', 'disabled')\n                    .prop('disabled', true)\n                    .closest('a')\n                    .attr(\"tabindex\", \"-1\")\n                    .closest('li')\n                    .addClass('disabled');\n            }\n\n            $checkbox.prop('checked', selected);\n\n            if (selected && this.options.selectedClass) {\n                $checkbox.closest('li')\n                    .addClass(this.options.selectedClass);\n            }\n        },\n\n        /**\n         * Creates a divider using the given select option.\n         *\n         * @param {jQuery} element\n         */\n        createDivider: function(element) {\n            var $divider = $(this.options.templates.divider);\n            this.$ul.append($divider);\n        },\n\n        /**\n         * Creates an optgroup.\n         *\n         * @param {jQuery} group\n         */\n        createOptgroup: function(group) {\n            var label = $(group).attr(\"label\");\n            var value = $(group).attr(\"value\");\n            var $li = $('<li class=\"multiselect-item multiselect-group\"><a href=\"javascript:void(0);\"><label><b></b></label></a></li>');\n\n            var classes = this.options.optionClass(group);\n            $li.addClass(classes);\n\n            if (this.options.enableHTML) {\n                $('label b', $li).html(\" \" + label);\n            }\n            else {\n                $('label b', $li).text(\" \" + label);\n            }\n\n            if (this.options.enableCollapsibleOptGroups && this.options.multiple) {\n                $('a', $li).append('<span class=\"caret-container\"><b class=\"caret\"></b></span>');\n            }\n\n            if (this.options.enableClickableOptGroups && this.options.multiple) {\n                $('a label', $li).prepend('<input type=\"checkbox\" value=\"' + value + '\"/>');\n            }\n\n            if ($(group).is(':disabled')) {\n                $li.addClass('disabled');\n            }\n\n            this.$ul.append($li);\n\n            $(\"option\", group).each($.proxy(function($, group) {\n                this.createOptionValue(group);\n            }, this))\n        },\n\n        /**\n         * Build the reset.\n         *\n         */\n        buildReset: function() {\n            if (this.options.includeResetOption) {\n\n                // Check whether to add a divider after the reset.\n                if (this.options.includeResetDivider) {\n                    this.$ul.prepend($(this.options.templates.divider));\n                }\n\n                var $resetButton = $(this.options.templates.resetButton);\n\n                if (this.options.enableHTML) {\n                    $('a', $resetButton).html(this.options.resetText);\n                }\n                else {\n                    $('a', $resetButton).text(this.options.resetText);\n                }\n\n                $('a', $resetButton).click($.proxy(function(){\n                    this.clearSelection();\n                }, this));\n\n                this.$ul.prepend($resetButton);\n            }\n        },\n\n        /**\n         * Build the select all.\n         *\n         * Checks if a select all has already been created.\n         */\n        buildSelectAll: function() {\n            if (typeof this.options.selectAllValue === 'number') {\n                this.options.selectAllValue = this.options.selectAllValue.toString();\n            }\n\n            var alreadyHasSelectAll = this.hasSelectAll();\n\n            if (!alreadyHasSelectAll && this.options.includeSelectAllOption && this.options.multiple\n                    && $('option', this.$select).length > this.options.includeSelectAllIfMoreThan) {\n\n                // Check whether to add a divider after the select all.\n                if (this.options.includeSelectAllDivider) {\n                    this.$ul.prepend($(this.options.templates.divider));\n                }\n\n                var $li = $(this.options.templates.li);\n                $('label', $li).addClass(\"checkbox\");\n\n                if (this.options.enableHTML) {\n                    $('label', $li).html(\" \" + this.options.selectAllText);\n                }\n                else {\n                    $('label', $li).text(\" \" + this.options.selectAllText);\n                }\n\n                if (this.options.selectAllName) {\n                    $('label', $li).prepend('<input type=\"checkbox\" name=\"' + this.options.selectAllName + '\" />');\n                }\n                else {\n                    $('label', $li).prepend('<input type=\"checkbox\" />');\n                }\n\n                var $checkbox = $('input', $li);\n                $checkbox.val(this.options.selectAllValue);\n\n                $li.addClass(\"multiselect-item multiselect-all\");\n                $checkbox.parent().parent()\n                    .addClass('multiselect-all');\n\n                this.$ul.prepend($li);\n\n                $checkbox.prop('checked', false);\n            }\n        },\n\n        /**\n         * Builds the filter.\n         */\n        buildFilter: function() {\n\n            // Build filter if filtering OR case insensitive filtering is enabled and the number of options exceeds (or equals) enableFilterLength.\n            if (this.options.enableFiltering || this.options.enableCaseInsensitiveFiltering) {\n                var enableFilterLength = Math.max(this.options.enableFiltering, this.options.enableCaseInsensitiveFiltering);\n\n                if (this.$select.find('option').length >= enableFilterLength) {\n\n                    this.$filter = $(this.options.templates.filter);\n                    $('input', this.$filter).attr('placeholder', this.options.filterPlaceholder);\n\n                    // Adds optional filter clear button\n                    if(this.options.includeFilterClearBtn) {\n                        var clearBtn = $(this.options.templates.filterClearBtn);\n                        clearBtn.on('click', $.proxy(function(event){\n                            clearTimeout(this.searchTimeout);\n\n                            this.query = '';\n                            this.$filter.find('.multiselect-search').val('');\n                            $('li', this.$ul).show().removeClass('multiselect-filter-hidden');\n\n                            this.updateSelectAll();\n\n                            if (this.options.enableClickableOptGroups && this.options.multiple) {\n                                this.updateOptGroups();\n                            }\n\n                        }, this));\n                        this.$filter.find('.input-group').append(clearBtn);\n                    }\n\n                    this.$ul.prepend(this.$filter);\n\n                    this.$filter.val(this.query).on('click', function(event) {\n                        event.stopPropagation();\n                    }).on('input keydown', $.proxy(function(event) {\n                        // Cancel enter key default behaviour\n                        if (event.which === 13) {\n                          event.preventDefault();\n                      }\n\n                        // This is useful to catch \"keydown\" events after the browser has updated the control.\n                        clearTimeout(this.searchTimeout);\n\n                        this.searchTimeout = this.asyncFunction($.proxy(function() {\n\n                            if (this.query !== event.target.value) {\n                                this.query = event.target.value;\n\n                                var currentGroup, currentGroupVisible;\n                                $.each($('li', this.$ul), $.proxy(function(index, element) {\n                                    var value = $('input', element).length > 0 ? $('input', element).val() : \"\";\n                                    var text = $('label', element).text();\n\n                                    var filterCandidate = '';\n                                    if ((this.options.filterBehavior === 'text')) {\n                                        filterCandidate = text;\n                                    }\n                                    else if ((this.options.filterBehavior === 'value')) {\n                                        filterCandidate = value;\n                                    }\n                                    else if (this.options.filterBehavior === 'both') {\n                                        filterCandidate = text + '\\n' + value;\n                                    }\n\n                                    if (value !== this.options.selectAllValue && text) {\n\n                                        // By default lets assume that element is not\n                                        // interesting for this search.\n                                        var showElement = false;\n\n                                        if (this.options.enableCaseInsensitiveFiltering) {\n                                            filterCandidate = filterCandidate.toLowerCase();\n                                            this.query = this.query.toLowerCase();\n                                        }\n\n                                        if (this.options.enableFullValueFiltering && this.options.filterBehavior !== 'both') {\n                                            var valueToMatch = filterCandidate.trim().substring(0, this.query.length);\n                                            if (this.query.indexOf(valueToMatch) > -1) {\n                                                showElement = true;\n                                            }\n                                        }\n                                        else if (filterCandidate.indexOf(this.query) > -1) {\n                                            showElement = true;\n                                        }\n\n                                        // Toggle current element (group or group item) according to showElement boolean.\n                                        if(!showElement){\n                                          $(element).css('display', 'none');\n                                          $(element).addClass('multiselect-filter-hidden');\n                                        }\n                                        if(showElement){\n                                          $(element).css('display', 'block');\n                                          $(element).removeClass('multiselect-filter-hidden');\n                                        }\n\n                                        // Differentiate groups and group items.\n                                        if ($(element).hasClass('multiselect-group')) {\n                                            // Remember group status.\n                                            currentGroup = element;\n                                            currentGroupVisible = showElement;\n                                        }\n                                        else {\n                                            // Show group name when at least one of its items is visible.\n                                            if (showElement) {\n                                                $(currentGroup).show()\n                                                    .removeClass('multiselect-filter-hidden');\n                                            }\n\n                                            // Show all group items when group name satisfies filter.\n                                            if (!showElement && currentGroupVisible) {\n                                                $(element).show()\n                                                    .removeClass('multiselect-filter-hidden');\n                                            }\n                                        }\n                                    }\n                                }, this));\n                            }\n\n                            this.updateSelectAll();\n\n                            if (this.options.enableClickableOptGroups && this.options.multiple) {\n                                this.updateOptGroups();\n                            }\n\n                            this.options.onFiltering(event.target);\n\n                        }, this), 300, this);\n                    }, this));\n                }\n            }\n        },\n\n        /**\n         * Unbinds the whole plugin.\n         */\n        destroy: function() {\n            this.$container.remove();\n            this.$select.show();\n\n            // reset original state\n            this.$select.prop('disabled', this.options.wasDisabled);\n\n            this.$select.data('multiselect', null);\n        },\n\n        /**\n         * Refreshs the multiselect based on the selected options of the select.\n         */\n        refresh: function () {\n            var inputs = {};\n            $('li input', this.$ul).each(function() {\n              inputs[$(this).val()] = $(this);\n            });\n\n            $('option', this.$select).each($.proxy(function (index, element) {\n                var $elem = $(element);\n                var $input = inputs[$(element).val()];\n\n                if ($elem.is(':selected')) {\n                    $input.prop('checked', true);\n\n                    if (this.options.selectedClass) {\n                        $input.closest('li')\n                            .addClass(this.options.selectedClass);\n                    }\n                }\n                else {\n                    $input.prop('checked', false);\n\n                    if (this.options.selectedClass) {\n                        $input.closest('li')\n                            .removeClass(this.options.selectedClass);\n                    }\n                }\n\n                if ($elem.is(\":disabled\")) {\n                    $input.attr('disabled', 'disabled')\n                        .prop('disabled', true)\n                        .closest('li')\n                        .addClass('disabled');\n                }\n                else {\n                    $input.prop('disabled', false)\n                        .closest('li')\n                        .removeClass('disabled');\n                }\n            }, this));\n\n            this.updateButtonText();\n            this.updateSelectAll();\n\n            if (this.options.enableClickableOptGroups && this.options.multiple) {\n                this.updateOptGroups();\n            }\n        },\n\n        /**\n         * Select all options of the given values.\n         *\n         * If triggerOnChange is set to true, the on change event is triggered if\n         * and only if one value is passed.\n         *\n         * @param {Array} selectValues\n         * @param {Boolean} triggerOnChange\n         */\n        select: function(selectValues, triggerOnChange) {\n            if(!$.isArray(selectValues)) {\n                selectValues = [selectValues];\n            }\n\n            for (var i = 0; i < selectValues.length; i++) {\n                var value = selectValues[i];\n\n                if (value === null || value === undefined) {\n                    continue;\n                }\n\n                var $option = this.getOptionByValue(value);\n                var $checkbox = this.getInputByValue(value);\n\n                if($option === undefined || $checkbox === undefined) {\n                    continue;\n                }\n\n                if (!this.options.multiple) {\n                    this.deselectAll(false);\n                }\n\n                if (this.options.selectedClass) {\n                    $checkbox.closest('li')\n                        .addClass(this.options.selectedClass);\n                }\n\n                $checkbox.prop('checked', true);\n                $option.prop('selected', true);\n\n                if (triggerOnChange) {\n                    this.options.onChange($option, true);\n                }\n            }\n\n            this.updateButtonText();\n            this.updateSelectAll();\n\n            if (this.options.enableClickableOptGroups && this.options.multiple) {\n                this.updateOptGroups();\n            }\n        },\n\n        /**\n         * Clears all selected items.\n         */\n        clearSelection: function () {\n            this.deselectAll(false);\n            this.updateButtonText();\n            this.updateSelectAll();\n\n            if (this.options.enableClickableOptGroups && this.options.multiple) {\n                this.updateOptGroups();\n            }\n        },\n\n        /**\n         * Deselects all options of the given values.\n         *\n         * If triggerOnChange is set to true, the on change event is triggered, if\n         * and only if one value is passed.\n         *\n         * @param {Array} deselectValues\n         * @param {Boolean} triggerOnChange\n         */\n        deselect: function(deselectValues, triggerOnChange) {\n            if(!$.isArray(deselectValues)) {\n                deselectValues = [deselectValues];\n            }\n\n            for (var i = 0; i < deselectValues.length; i++) {\n                var value = deselectValues[i];\n\n                if (value === null || value === undefined) {\n                    continue;\n                }\n\n                var $option = this.getOptionByValue(value);\n                var $checkbox = this.getInputByValue(value);\n\n                if($option === undefined || $checkbox === undefined) {\n                    continue;\n                }\n\n                if (this.options.selectedClass) {\n                    $checkbox.closest('li')\n                        .removeClass(this.options.selectedClass);\n                }\n\n                $checkbox.prop('checked', false);\n                $option.prop('selected', false);\n\n                if (triggerOnChange) {\n                    this.options.onChange($option, false);\n                }\n            }\n\n            this.updateButtonText();\n            this.updateSelectAll();\n\n            if (this.options.enableClickableOptGroups && this.options.multiple) {\n                this.updateOptGroups();\n            }\n        },\n\n        /**\n         * Selects all enabled & visible options.\n         *\n         * If justVisible is true or not specified, only visible options are selected.\n         *\n         * @param {Boolean} justVisible\n         * @param {Boolean} triggerOnSelectAll\n         */\n        selectAll: function (justVisible, triggerOnSelectAll) {\n\n            var justVisible = typeof justVisible === 'undefined' ? true : justVisible;\n            var allLis = $(\"li:not(.divider):not(.disabled):not(.multiselect-group)\", this.$ul);\n            var visibleLis = $(\"li:not(.divider):not(.disabled):not(.multiselect-group):not(.multiselect-filter-hidden):not(.multiselect-collapisble-hidden)\", this.$ul).filter(':visible');\n\n            if(justVisible) {\n                $('input:enabled' , visibleLis).prop('checked', true);\n                visibleLis.addClass(this.options.selectedClass);\n\n                $('input:enabled' , visibleLis).each($.proxy(function(index, element) {\n                    var value = $(element).val();\n                    var option = this.getOptionByValue(value);\n                    $(option).prop('selected', true);\n                }, this));\n            }\n            else {\n                $('input:enabled' , allLis).prop('checked', true);\n                allLis.addClass(this.options.selectedClass);\n\n                $('input:enabled' , allLis).each($.proxy(function(index, element) {\n                    var value = $(element).val();\n                    var option = this.getOptionByValue(value);\n                    $(option).prop('selected', true);\n                }, this));\n            }\n\n            $('li input[value=\"' + this.options.selectAllValue + '\"]', this.$ul).prop('checked', true);\n\n            if (this.options.enableClickableOptGroups && this.options.multiple) {\n                this.updateOptGroups();\n            }\n\n            if (triggerOnSelectAll) {\n                this.options.onSelectAll();\n            }\n        },\n\n        /**\n         * Deselects all options.\n         *\n         * If justVisible is true or not specified, only visible options are deselected.\n         *\n         * @param {Boolean} justVisible\n         */\n        deselectAll: function (justVisible, triggerOnDeselectAll) {\n\n            var justVisible = typeof justVisible === 'undefined' ? true : justVisible;\n            var allLis = $(\"li:not(.divider):not(.disabled):not(.multiselect-group)\", this.$ul);\n            var visibleLis = $(\"li:not(.divider):not(.disabled):not(.multiselect-group):not(.multiselect-filter-hidden):not(.multiselect-collapisble-hidden)\", this.$ul).filter(':visible');\n\n            if(justVisible) {\n                $('input[type=\"checkbox\"]:enabled' , visibleLis).prop('checked', false);\n                visibleLis.removeClass(this.options.selectedClass);\n\n                $('input[type=\"checkbox\"]:enabled' , visibleLis).each($.proxy(function(index, element) {\n                    var value = $(element).val();\n                    var option = this.getOptionByValue(value);\n                    $(option).prop('selected', false);\n                }, this));\n            }\n            else {\n                $('input[type=\"checkbox\"]:enabled' , allLis).prop('checked', false);\n                allLis.removeClass(this.options.selectedClass);\n\n                $('input[type=\"checkbox\"]:enabled' , allLis).each($.proxy(function(index, element) {\n                    var value = $(element).val();\n                    var option = this.getOptionByValue(value);\n                    $(option).prop('selected', false);\n                }, this));\n            }\n\n            $('li input[value=\"' + this.options.selectAllValue + '\"]', this.$ul).prop('checked', false);\n\n            if (this.options.enableClickableOptGroups && this.options.multiple) {\n                this.updateOptGroups();\n            }\n\n            if (triggerOnDeselectAll) {\n                this.options.onDeselectAll();\n            }\n        },\n\n        /**\n         * Rebuild the plugin.\n         *\n         * Rebuilds the dropdown, the filter and the select all option.\n         */\n        rebuild: function() {\n            this.$ul.html('');\n\n            // Important to distinguish between radios and checkboxes.\n            this.options.multiple = this.$select.attr('multiple') === \"multiple\";\n\n            this.buildSelectAll();\n            this.buildDropdownOptions();\n            this.buildFilter();\n\n            this.updateButtonText();\n            this.updateSelectAll(true);\n\n            if (this.options.enableClickableOptGroups && this.options.multiple) {\n                this.updateOptGroups();\n            }\n\n            if (this.options.disableIfEmpty && $('option', this.$select).length <= 0) {\n                this.disable();\n            }\n            else {\n                this.enable();\n            }\n\n            if (this.options.dropRight) {\n                this.$ul.addClass('pull-right');\n            }\n        },\n\n        /**\n         * The provided data will be used to build the dropdown.\n         */\n        dataprovider: function(dataprovider) {\n\n            var groupCounter = 0;\n            var $select = this.$select.empty();\n\n            $.each(dataprovider, function (index, option) {\n                var $tag;\n\n                if ($.isArray(option.children)) { // create optiongroup tag\n                    groupCounter++;\n\n                    $tag = $('<optgroup/>').attr({\n                        label: option.label || 'Group ' + groupCounter,\n                        disabled: !!option.disabled,\n                        value: option.value\n                    });\n\n                    forEach(option.children, function(subOption) { // add children option tags\n                        var attributes = {\n                            value: subOption.value,\n                            label: subOption.label || subOption.value,\n                            title: subOption.title,\n                            selected: !!subOption.selected,\n                            disabled: !!subOption.disabled\n                        };\n\n                        //Loop through attributes object and add key-value for each attribute\n                       for (var key in subOption.attributes) {\n                            attributes['data-' + key] = subOption.attributes[key];\n                       }\n                         //Append original attributes + new data attributes to option\n                        $tag.append($('<option/>').attr(attributes));\n                    });\n                }\n                else {\n\n                    var attributes = {\n                        'value': option.value,\n                        'label': option.label || option.value,\n                        'title': option.title,\n                        'class': option['class'],\n                        'selected': !!option['selected'],\n                        'disabled': !!option['disabled']\n                    };\n                    //Loop through attributes object and add key-value for each attribute\n                    for (var key in option.attributes) {\n                      attributes['data-' + key] = option.attributes[key];\n                    }\n                    //Append original attributes + new data attributes to option\n                    $tag = $('<option/>').attr(attributes);\n\n                    $tag.text(option.label || option.value);\n                }\n\n                $select.append($tag);\n            });\n\n            this.rebuild();\n        },\n\n        /**\n         * Enable the multiselect.\n         */\n        enable: function() {\n            this.$select.prop('disabled', false);\n            this.$button.prop('disabled', false)\n                .removeClass('disabled');\n        },\n\n        /**\n         * Disable the multiselect.\n         */\n        disable: function() {\n            this.$select.prop('disabled', true);\n            this.$button.prop('disabled', true)\n                .addClass('disabled');\n        },\n\n        /**\n         * Set the options.\n         *\n         * @param {Array} options\n         */\n        setOptions: function(options) {\n            this.options = this.mergeOptions(options);\n        },\n\n        /**\n         * Merges the given options with the default options.\n         *\n         * @param {Array} options\n         * @returns {Array}\n         */\n        mergeOptions: function(options) {\n            return $.extend(true, {}, this.defaults, this.options, options);\n        },\n\n        /**\n         * Checks whether a select all checkbox is present.\n         *\n         * @returns {Boolean}\n         */\n        hasSelectAll: function() {\n            return $('li.multiselect-all', this.$ul).length > 0;\n        },\n\n        /**\n         * Update opt groups.\n         */\n        updateOptGroups: function() {\n            var $groups = $('li.multiselect-group', this.$ul)\n            var selectedClass = this.options.selectedClass;\n\n            $groups.each(function() {\n                var $options = $(this).nextUntil('li.multiselect-group')\n                    .not('.multiselect-filter-hidden')\n                    .not('.disabled');\n\n                var checked = true;\n                $options.each(function() {\n                    var $input = $('input', this);\n\n                    if (!$input.prop('checked')) {\n                        checked = false;\n                    }\n                });\n\n                if (selectedClass) {\n                    if (checked) {\n                        $(this).addClass(selectedClass);\n                    }\n                    else {\n                        $(this).removeClass(selectedClass);\n                    }\n                }\n\n                $('input', this).prop('checked', checked);\n            });\n        },\n\n        /**\n         * Updates the select all checkbox based on the currently displayed and selected checkboxes.\n         */\n        updateSelectAll: function(notTriggerOnSelectAll) {\n            if (this.hasSelectAll()) {\n                var allBoxes = $(\"li:not(.multiselect-item):not(.multiselect-filter-hidden):not(.multiselect-group):not(.disabled) input:enabled\", this.$ul);\n                var allBoxesLength = allBoxes.length;\n                var checkedBoxesLength = allBoxes.filter(\":checked\").length;\n                var selectAllLi  = $(\"li.multiselect-all\", this.$ul);\n                var selectAllInput = selectAllLi.find(\"input\");\n\n                if (checkedBoxesLength > 0 && checkedBoxesLength === allBoxesLength) {\n                    selectAllInput.prop(\"checked\", true);\n                    selectAllLi.addClass(this.options.selectedClass);\n                }\n                else {\n                    selectAllInput.prop(\"checked\", false);\n                    selectAllLi.removeClass(this.options.selectedClass);\n                }\n            }\n        },\n\n        /**\n         * Update the button text and its title based on the currently selected options.\n         */\n        updateButtonText: function() {\n            var options = this.getSelected();\n\n            // First update the displayed button text.\n            if (this.options.enableHTML) {\n                $('.multiselect .multiselect-selected-text', this.$container).html(this.options.buttonText(options, this.$select));\n            }\n            else {\n                $('.multiselect .multiselect-selected-text', this.$container).text(this.options.buttonText(options, this.$select));\n            }\n\n            // Now update the title attribute of the button.\n            $('.multiselect', this.$container).attr('title', this.options.buttonTitle(options, this.$select));\n        },\n\n        /**\n         * Get all selected options.\n         *\n         * @returns {jQUery}\n         */\n        getSelected: function() {\n            return $('option', this.$select).filter(\":selected\");\n        },\n\n        /**\n         * Gets a select option by its value.\n         *\n         * @param {String} value\n         * @returns {jQuery}\n         */\n        getOptionByValue: function (value) {\n\n            var options = $('option', this.$select);\n            var valueToCompare = value.toString();\n\n            for (var i = 0; i < options.length; i = i + 1) {\n                var option = options[i];\n                if (option.value === valueToCompare) {\n                    return $(option);\n                }\n            }\n        },\n\n        /**\n         * Get the input (radio/checkbox) by its value.\n         *\n         * @param {String} value\n         * @returns {jQuery}\n         */\n        getInputByValue: function (value) {\n\n            var checkboxes = $('li input:not(.multiselect-search)', this.$ul);\n            var valueToCompare = value.toString();\n\n            for (var i = 0; i < checkboxes.length; i = i + 1) {\n                var checkbox = checkboxes[i];\n                if (checkbox.value === valueToCompare) {\n                    return $(checkbox);\n                }\n            }\n        },\n\n        /**\n         * Used for knockout integration.\n         */\n        updateOriginalOptions: function() {\n            this.originalOptions = this.$select.clone()[0].options;\n        },\n\n        asyncFunction: function(callback, timeout, self) {\n            var args = Array.prototype.slice.call(arguments, 3);\n            return setTimeout(function() {\n                callback.apply(self || window, args);\n            }, timeout);\n        },\n\n        setAllSelectedText: function(allSelectedText) {\n            this.options.allSelectedText = allSelectedText;\n            this.updateButtonText();\n        }\n    };\n\n    $.fn.multiselect = function(option, parameter, extraOptions) {\n        return this.each(function() {\n            var data = $(this).data('multiselect');\n            var options = typeof option === 'object' && option;\n\n            // Initialize the multiselect.\n            if (!data) {\n                data = new Multiselect(this, options);\n                $(this).data('multiselect', data);\n            }\n\n            // Call multiselect method.\n            if (typeof option === 'string') {\n                data[option](parameter, extraOptions);\n\n                if (option === 'destroy') {\n                    $(this).data('multiselect', false);\n                }\n            }\n        });\n    };\n\n    $.fn.multiselect.Constructor = Multiselect;\n\n    $(function() {\n        $(\"select[data-role=multiselect]\").multiselect();\n    });\n\n});\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bootstrap-multiselect/less/bootstrap-multiselect.less",
    "content": "/**\n * Bootstrap Multiselect (http://davidstutz.de/bootstrap-multiselect/)\n *\n * Apache License, Version 2.0:\n * Copyright (c) 2012 - 2018 David Stutz\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a\n * copy of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations\n * under the License.\n *\n * BSD 3-Clause License:\n * Copyright (c) 2012 - 2018 David Stutz\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *    - Redistributions of source code must retain the above copyright notice,\n *      this list of conditions and the following disclaimer.\n *    - Redistributions in binary form must reproduce the above copyright notice,\n *      this list of conditions and the following disclaimer in the documentation\n *      and/or other materials provided with the distribution.\n *    - Neither the name of David Stutz nor the names of its contributors may be\n *      used to endorse or promote products derived from this software without\n *      specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nspan.multiselect-native-select{\n  position:relative\n}\n\nspan.multiselect-native-select select{\n  border :0 !important;\n  clip: rect(0 0 0 0) !important;\n  height: 1px !important;\n  margin: -1px -1px -1px -3px !important;\n  overflow: hidden !important;\n  padding: 0 !important;\n  position: absolute !important;\n  width: 1px !important;\n  left: 50%;\n  top: 30px;\n}\n\n.multiselect-container {\n  position: absolute;\n  list-style-type: none;\n  margin: 0;\n  padding: 0;\n\n  .input-group {\n    margin: 5px;\n  }\n\n  .multiselect-reset {\n    .input-group {\n      width: 93%;\n    }\n  }\n\n  > li {\n    padding: 0;\n\n    > a.multiselect-all label {\n      font-weight: bold;\n    }\n\n    &.multiselect-group label {\n      margin: 0;\n      padding: 3px 20px 3px 20px;\n      height: 100%;\n      font-weight: bold;\n    }\n\n    &.multiselect-group-clickable label {\n      cursor: pointer;\n    }\n\n    > a {\n      padding: 0;\n\n      > label {\n        margin: 0;\n        height: 100%;\n        cursor: pointer;\n        font-weight: normal;\n        padding: 3px 20px 3px 40px;\n\n        &.radio, &.checkbox {\n          margin: 0;\n        }\n\n        > input[type=\"checkbox\"] {\n          margin-bottom:5px;\n        }\n      }\n    }\n  }\n}\n\n.btn-group > .btn-group:nth-child(2) > .multiselect.btn {\n  border-top-left-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n\n.form-inline .multiselect-container{\n\n  label.checkbox, label.radio{\n    padding: 3px 20px 3px 40px;\n  }\n\n  li a label{\n\n    &.checkbox input[type=\"checkbox\"], &.radio input[type=\"radio\"]{\n      margin-left: -20px;\n      margin-right: 0;\n    }\n  }\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bootstrap-table/bootstrap-table-locale-all.js",
    "content": "(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(require('jquery')) :\n\ttypeof define === 'function' && define.amd ? define(['jquery'], factory) :\n\t(global = global || self, factory(global.jQuery));\n}(this, function ($) { 'use strict';\n\n\t$ = $ && $.hasOwnProperty('default') ? $['default'] : $;\n\n\tvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n\tfunction createCommonjsModule(fn, module) {\n\t\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n\t}\n\n\tvar O = 'object';\n\tvar check = function (it) {\n\t  return it && it.Math == Math && it;\n\t};\n\n\t// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\n\tvar global_1 =\n\t  // eslint-disable-next-line no-undef\n\t  check(typeof globalThis == O && globalThis) ||\n\t  check(typeof window == O && window) ||\n\t  check(typeof self == O && self) ||\n\t  check(typeof commonjsGlobal == O && commonjsGlobal) ||\n\t  // eslint-disable-next-line no-new-func\n\t  Function('return this')();\n\n\tvar fails = function (exec) {\n\t  try {\n\t    return !!exec();\n\t  } catch (error) {\n\t    return true;\n\t  }\n\t};\n\n\t// Thank's IE8 for his funny defineProperty\n\tvar descriptors = !fails(function () {\n\t  return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n\t});\n\n\tvar nativePropertyIsEnumerable = {}.propertyIsEnumerable;\n\tvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n\t// Nashorn ~ JDK8 bug\n\tvar NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1);\n\n\t// `Object.prototype.propertyIsEnumerable` method implementation\n\t// https://tc39.github.io/ecma262/#sec-object.prototype.propertyisenumerable\n\tvar f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n\t  var descriptor = getOwnPropertyDescriptor(this, V);\n\t  return !!descriptor && descriptor.enumerable;\n\t} : nativePropertyIsEnumerable;\n\n\tvar objectPropertyIsEnumerable = {\n\t\tf: f\n\t};\n\n\tvar createPropertyDescriptor = function (bitmap, value) {\n\t  return {\n\t    enumerable: !(bitmap & 1),\n\t    configurable: !(bitmap & 2),\n\t    writable: !(bitmap & 4),\n\t    value: value\n\t  };\n\t};\n\n\tvar toString = {}.toString;\n\n\tvar classofRaw = function (it) {\n\t  return toString.call(it).slice(8, -1);\n\t};\n\n\tvar split = ''.split;\n\n\t// fallback for non-array-like ES3 and non-enumerable old V8 strings\n\tvar indexedObject = fails(function () {\n\t  // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n\t  // eslint-disable-next-line no-prototype-builtins\n\t  return !Object('z').propertyIsEnumerable(0);\n\t}) ? function (it) {\n\t  return classofRaw(it) == 'String' ? split.call(it, '') : Object(it);\n\t} : Object;\n\n\t// `RequireObjectCoercible` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-requireobjectcoercible\n\tvar requireObjectCoercible = function (it) {\n\t  if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n\t  return it;\n\t};\n\n\t// toObject with fallback for non-array-like ES3 strings\n\n\n\n\tvar toIndexedObject = function (it) {\n\t  return indexedObject(requireObjectCoercible(it));\n\t};\n\n\tvar isObject = function (it) {\n\t  return typeof it === 'object' ? it !== null : typeof it === 'function';\n\t};\n\n\t// `ToPrimitive` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-toprimitive\n\t// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n\t// and the second argument - flag - preferred type is a string\n\tvar toPrimitive = function (input, PREFERRED_STRING) {\n\t  if (!isObject(input)) return input;\n\t  var fn, val;\n\t  if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n\t  if (typeof (fn = input.valueOf) == 'function' && !isObject(val = fn.call(input))) return val;\n\t  if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n\t  throw TypeError(\"Can't convert object to primitive value\");\n\t};\n\n\tvar hasOwnProperty = {}.hasOwnProperty;\n\n\tvar has = function (it, key) {\n\t  return hasOwnProperty.call(it, key);\n\t};\n\n\tvar document = global_1.document;\n\t// typeof document.createElement is 'object' in old IE\n\tvar EXISTS = isObject(document) && isObject(document.createElement);\n\n\tvar documentCreateElement = function (it) {\n\t  return EXISTS ? document.createElement(it) : {};\n\t};\n\n\t// Thank's IE8 for his funny defineProperty\n\tvar ie8DomDefine = !descriptors && !fails(function () {\n\t  return Object.defineProperty(documentCreateElement('div'), 'a', {\n\t    get: function () { return 7; }\n\t  }).a != 7;\n\t});\n\n\tvar nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n\t// `Object.getOwnPropertyDescriptor` method\n\t// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\n\tvar f$1 = descriptors ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n\t  O = toIndexedObject(O);\n\t  P = toPrimitive(P, true);\n\t  if (ie8DomDefine) try {\n\t    return nativeGetOwnPropertyDescriptor(O, P);\n\t  } catch (error) { /* empty */ }\n\t  if (has(O, P)) return createPropertyDescriptor(!objectPropertyIsEnumerable.f.call(O, P), O[P]);\n\t};\n\n\tvar objectGetOwnPropertyDescriptor = {\n\t\tf: f$1\n\t};\n\n\tvar anObject = function (it) {\n\t  if (!isObject(it)) {\n\t    throw TypeError(String(it) + ' is not an object');\n\t  } return it;\n\t};\n\n\tvar nativeDefineProperty = Object.defineProperty;\n\n\t// `Object.defineProperty` method\n\t// https://tc39.github.io/ecma262/#sec-object.defineproperty\n\tvar f$2 = descriptors ? nativeDefineProperty : function defineProperty(O, P, Attributes) {\n\t  anObject(O);\n\t  P = toPrimitive(P, true);\n\t  anObject(Attributes);\n\t  if (ie8DomDefine) try {\n\t    return nativeDefineProperty(O, P, Attributes);\n\t  } catch (error) { /* empty */ }\n\t  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported');\n\t  if ('value' in Attributes) O[P] = Attributes.value;\n\t  return O;\n\t};\n\n\tvar objectDefineProperty = {\n\t\tf: f$2\n\t};\n\n\tvar hide = descriptors ? function (object, key, value) {\n\t  return objectDefineProperty.f(object, key, createPropertyDescriptor(1, value));\n\t} : function (object, key, value) {\n\t  object[key] = value;\n\t  return object;\n\t};\n\n\tvar setGlobal = function (key, value) {\n\t  try {\n\t    hide(global_1, key, value);\n\t  } catch (error) {\n\t    global_1[key] = value;\n\t  } return value;\n\t};\n\n\tvar shared = createCommonjsModule(function (module) {\n\tvar SHARED = '__core-js_shared__';\n\tvar store = global_1[SHARED] || setGlobal(SHARED, {});\n\n\t(module.exports = function (key, value) {\n\t  return store[key] || (store[key] = value !== undefined ? value : {});\n\t})('versions', []).push({\n\t  version: '3.1.3',\n\t  mode:  'global',\n\t  copyright: '© 2019 Denis Pushkarev (zloirock.ru)'\n\t});\n\t});\n\n\tvar functionToString = shared('native-function-to-string', Function.toString);\n\n\tvar WeakMap = global_1.WeakMap;\n\n\tvar nativeWeakMap = typeof WeakMap === 'function' && /native code/.test(functionToString.call(WeakMap));\n\n\tvar id = 0;\n\tvar postfix = Math.random();\n\n\tvar uid = function (key) {\n\t  return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36);\n\t};\n\n\tvar keys = shared('keys');\n\n\tvar sharedKey = function (key) {\n\t  return keys[key] || (keys[key] = uid(key));\n\t};\n\n\tvar hiddenKeys = {};\n\n\tvar WeakMap$1 = global_1.WeakMap;\n\tvar set, get, has$1;\n\n\tvar enforce = function (it) {\n\t  return has$1(it) ? get(it) : set(it, {});\n\t};\n\n\tvar getterFor = function (TYPE) {\n\t  return function (it) {\n\t    var state;\n\t    if (!isObject(it) || (state = get(it)).type !== TYPE) {\n\t      throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n\t    } return state;\n\t  };\n\t};\n\n\tif (nativeWeakMap) {\n\t  var store = new WeakMap$1();\n\t  var wmget = store.get;\n\t  var wmhas = store.has;\n\t  var wmset = store.set;\n\t  set = function (it, metadata) {\n\t    wmset.call(store, it, metadata);\n\t    return metadata;\n\t  };\n\t  get = function (it) {\n\t    return wmget.call(store, it) || {};\n\t  };\n\t  has$1 = function (it) {\n\t    return wmhas.call(store, it);\n\t  };\n\t} else {\n\t  var STATE = sharedKey('state');\n\t  hiddenKeys[STATE] = true;\n\t  set = function (it, metadata) {\n\t    hide(it, STATE, metadata);\n\t    return metadata;\n\t  };\n\t  get = function (it) {\n\t    return has(it, STATE) ? it[STATE] : {};\n\t  };\n\t  has$1 = function (it) {\n\t    return has(it, STATE);\n\t  };\n\t}\n\n\tvar internalState = {\n\t  set: set,\n\t  get: get,\n\t  has: has$1,\n\t  enforce: enforce,\n\t  getterFor: getterFor\n\t};\n\n\tvar redefine = createCommonjsModule(function (module) {\n\tvar getInternalState = internalState.get;\n\tvar enforceInternalState = internalState.enforce;\n\tvar TEMPLATE = String(functionToString).split('toString');\n\n\tshared('inspectSource', function (it) {\n\t  return functionToString.call(it);\n\t});\n\n\t(module.exports = function (O, key, value, options) {\n\t  var unsafe = options ? !!options.unsafe : false;\n\t  var simple = options ? !!options.enumerable : false;\n\t  var noTargetGet = options ? !!options.noTargetGet : false;\n\t  if (typeof value == 'function') {\n\t    if (typeof key == 'string' && !has(value, 'name')) hide(value, 'name', key);\n\t    enforceInternalState(value).source = TEMPLATE.join(typeof key == 'string' ? key : '');\n\t  }\n\t  if (O === global_1) {\n\t    if (simple) O[key] = value;\n\t    else setGlobal(key, value);\n\t    return;\n\t  } else if (!unsafe) {\n\t    delete O[key];\n\t  } else if (!noTargetGet && O[key]) {\n\t    simple = true;\n\t  }\n\t  if (simple) O[key] = value;\n\t  else hide(O, key, value);\n\t// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n\t})(Function.prototype, 'toString', function toString() {\n\t  return typeof this == 'function' && getInternalState(this).source || functionToString.call(this);\n\t});\n\t});\n\n\tvar path = global_1;\n\n\tvar aFunction = function (variable) {\n\t  return typeof variable == 'function' ? variable : undefined;\n\t};\n\n\tvar getBuiltIn = function (namespace, method) {\n\t  return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global_1[namespace])\n\t    : path[namespace] && path[namespace][method] || global_1[namespace] && global_1[namespace][method];\n\t};\n\n\tvar ceil = Math.ceil;\n\tvar floor = Math.floor;\n\n\t// `ToInteger` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-tointeger\n\tvar toInteger = function (argument) {\n\t  return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument);\n\t};\n\n\tvar min = Math.min;\n\n\t// `ToLength` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-tolength\n\tvar toLength = function (argument) {\n\t  return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n\t};\n\n\tvar max = Math.max;\n\tvar min$1 = Math.min;\n\n\t// Helper for a popular repeating case of the spec:\n\t// Let integer be ? ToInteger(index).\n\t// If integer < 0, let result be max((length + integer), 0); else let result be min(length, length).\n\tvar toAbsoluteIndex = function (index, length) {\n\t  var integer = toInteger(index);\n\t  return integer < 0 ? max(integer + length, 0) : min$1(integer, length);\n\t};\n\n\t// `Array.prototype.{ indexOf, includes }` methods implementation\n\tvar createMethod = function (IS_INCLUDES) {\n\t  return function ($this, el, fromIndex) {\n\t    var O = toIndexedObject($this);\n\t    var length = toLength(O.length);\n\t    var index = toAbsoluteIndex(fromIndex, length);\n\t    var value;\n\t    // Array#includes uses SameValueZero equality algorithm\n\t    // eslint-disable-next-line no-self-compare\n\t    if (IS_INCLUDES && el != el) while (length > index) {\n\t      value = O[index++];\n\t      // eslint-disable-next-line no-self-compare\n\t      if (value != value) return true;\n\t    // Array#indexOf ignores holes, Array#includes - not\n\t    } else for (;length > index; index++) {\n\t      if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n\t    } return !IS_INCLUDES && -1;\n\t  };\n\t};\n\n\tvar arrayIncludes = {\n\t  // `Array.prototype.includes` method\n\t  // https://tc39.github.io/ecma262/#sec-array.prototype.includes\n\t  includes: createMethod(true),\n\t  // `Array.prototype.indexOf` method\n\t  // https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n\t  indexOf: createMethod(false)\n\t};\n\n\tvar indexOf = arrayIncludes.indexOf;\n\n\n\tvar objectKeysInternal = function (object, names) {\n\t  var O = toIndexedObject(object);\n\t  var i = 0;\n\t  var result = [];\n\t  var key;\n\t  for (key in O) !has(hiddenKeys, key) && has(O, key) && result.push(key);\n\t  // Don't enum bug & hidden keys\n\t  while (names.length > i) if (has(O, key = names[i++])) {\n\t    ~indexOf(result, key) || result.push(key);\n\t  }\n\t  return result;\n\t};\n\n\t// IE8- don't enum bug keys\n\tvar enumBugKeys = [\n\t  'constructor',\n\t  'hasOwnProperty',\n\t  'isPrototypeOf',\n\t  'propertyIsEnumerable',\n\t  'toLocaleString',\n\t  'toString',\n\t  'valueOf'\n\t];\n\n\tvar hiddenKeys$1 = enumBugKeys.concat('length', 'prototype');\n\n\t// `Object.getOwnPropertyNames` method\n\t// https://tc39.github.io/ecma262/#sec-object.getownpropertynames\n\tvar f$3 = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n\t  return objectKeysInternal(O, hiddenKeys$1);\n\t};\n\n\tvar objectGetOwnPropertyNames = {\n\t\tf: f$3\n\t};\n\n\tvar f$4 = Object.getOwnPropertySymbols;\n\n\tvar objectGetOwnPropertySymbols = {\n\t\tf: f$4\n\t};\n\n\t// all object keys, includes non-enumerable and symbols\n\tvar ownKeys = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n\t  var keys = objectGetOwnPropertyNames.f(anObject(it));\n\t  var getOwnPropertySymbols = objectGetOwnPropertySymbols.f;\n\t  return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;\n\t};\n\n\tvar copyConstructorProperties = function (target, source) {\n\t  var keys = ownKeys(source);\n\t  var defineProperty = objectDefineProperty.f;\n\t  var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;\n\t  for (var i = 0; i < keys.length; i++) {\n\t    var key = keys[i];\n\t    if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n\t  }\n\t};\n\n\tvar replacement = /#|\\.prototype\\./;\n\n\tvar isForced = function (feature, detection) {\n\t  var value = data[normalize(feature)];\n\t  return value == POLYFILL ? true\n\t    : value == NATIVE ? false\n\t    : typeof detection == 'function' ? fails(detection)\n\t    : !!detection;\n\t};\n\n\tvar normalize = isForced.normalize = function (string) {\n\t  return String(string).replace(replacement, '.').toLowerCase();\n\t};\n\n\tvar data = isForced.data = {};\n\tvar NATIVE = isForced.NATIVE = 'N';\n\tvar POLYFILL = isForced.POLYFILL = 'P';\n\n\tvar isForced_1 = isForced;\n\n\tvar getOwnPropertyDescriptor$1 = objectGetOwnPropertyDescriptor.f;\n\n\n\n\n\n\n\t/*\n\t  options.target      - name of the target object\n\t  options.global      - target is the global object\n\t  options.stat        - export as static methods of target\n\t  options.proto       - export as prototype methods of target\n\t  options.real        - real prototype method for the `pure` version\n\t  options.forced      - export even if the native feature is available\n\t  options.bind        - bind methods to the target, required for the `pure` version\n\t  options.wrap        - wrap constructors to preventing global pollution, required for the `pure` version\n\t  options.unsafe      - use the simple assignment of property instead of delete + defineProperty\n\t  options.sham        - add a flag to not completely full polyfills\n\t  options.enumerable  - export as enumerable property\n\t  options.noTargetGet - prevent calling a getter on target\n\t*/\n\tvar _export = function (options, source) {\n\t  var TARGET = options.target;\n\t  var GLOBAL = options.global;\n\t  var STATIC = options.stat;\n\t  var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n\t  if (GLOBAL) {\n\t    target = global_1;\n\t  } else if (STATIC) {\n\t    target = global_1[TARGET] || setGlobal(TARGET, {});\n\t  } else {\n\t    target = (global_1[TARGET] || {}).prototype;\n\t  }\n\t  if (target) for (key in source) {\n\t    sourceProperty = source[key];\n\t    if (options.noTargetGet) {\n\t      descriptor = getOwnPropertyDescriptor$1(target, key);\n\t      targetProperty = descriptor && descriptor.value;\n\t    } else targetProperty = target[key];\n\t    FORCED = isForced_1(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n\t    // contained in target\n\t    if (!FORCED && targetProperty !== undefined) {\n\t      if (typeof sourceProperty === typeof targetProperty) continue;\n\t      copyConstructorProperties(sourceProperty, targetProperty);\n\t    }\n\t    // add a flag to not completely full polyfills\n\t    if (options.sham || (targetProperty && targetProperty.sham)) {\n\t      hide(sourceProperty, 'sham', true);\n\t    }\n\t    // extend global\n\t    redefine(target, key, sourceProperty, options);\n\t  }\n\t};\n\n\t// `IsArray` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-isarray\n\tvar isArray = Array.isArray || function isArray(arg) {\n\t  return classofRaw(arg) == 'Array';\n\t};\n\n\t// `ToObject` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-toobject\n\tvar toObject = function (argument) {\n\t  return Object(requireObjectCoercible(argument));\n\t};\n\n\tvar createProperty = function (object, key, value) {\n\t  var propertyKey = toPrimitive(key);\n\t  if (propertyKey in object) objectDefineProperty.f(object, propertyKey, createPropertyDescriptor(0, value));\n\t  else object[propertyKey] = value;\n\t};\n\n\tvar nativeSymbol = !!Object.getOwnPropertySymbols && !fails(function () {\n\t  // Chrome 38 Symbol has incorrect toString conversion\n\t  // eslint-disable-next-line no-undef\n\t  return !String(Symbol());\n\t});\n\n\tvar Symbol$1 = global_1.Symbol;\n\tvar store$1 = shared('wks');\n\n\tvar wellKnownSymbol = function (name) {\n\t  return store$1[name] || (store$1[name] = nativeSymbol && Symbol$1[name]\n\t    || (nativeSymbol ? Symbol$1 : uid)('Symbol.' + name));\n\t};\n\n\tvar SPECIES = wellKnownSymbol('species');\n\n\t// `ArraySpeciesCreate` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-arrayspeciescreate\n\tvar arraySpeciesCreate = function (originalArray, length) {\n\t  var C;\n\t  if (isArray(originalArray)) {\n\t    C = originalArray.constructor;\n\t    // cross-realm fallback\n\t    if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n\t    else if (isObject(C)) {\n\t      C = C[SPECIES];\n\t      if (C === null) C = undefined;\n\t    }\n\t  } return new (C === undefined ? Array : C)(length === 0 ? 0 : length);\n\t};\n\n\tvar SPECIES$1 = wellKnownSymbol('species');\n\n\tvar arrayMethodHasSpeciesSupport = function (METHOD_NAME) {\n\t  return !fails(function () {\n\t    var array = [];\n\t    var constructor = array.constructor = {};\n\t    constructor[SPECIES$1] = function () {\n\t      return { foo: 1 };\n\t    };\n\t    return array[METHOD_NAME](Boolean).foo !== 1;\n\t  });\n\t};\n\n\tvar IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable');\n\tvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\n\tvar MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded';\n\n\tvar IS_CONCAT_SPREADABLE_SUPPORT = !fails(function () {\n\t  var array = [];\n\t  array[IS_CONCAT_SPREADABLE] = false;\n\t  return array.concat()[0] !== array;\n\t});\n\n\tvar SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat');\n\n\tvar isConcatSpreadable = function (O) {\n\t  if (!isObject(O)) return false;\n\t  var spreadable = O[IS_CONCAT_SPREADABLE];\n\t  return spreadable !== undefined ? !!spreadable : isArray(O);\n\t};\n\n\tvar FORCED = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT;\n\n\t// `Array.prototype.concat` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.concat\n\t// with adding support of @@isConcatSpreadable and @@species\n\t_export({ target: 'Array', proto: true, forced: FORCED }, {\n\t  concat: function concat(arg) { // eslint-disable-line no-unused-vars\n\t    var O = toObject(this);\n\t    var A = arraySpeciesCreate(O, 0);\n\t    var n = 0;\n\t    var i, k, length, len, E;\n\t    for (i = -1, length = arguments.length; i < length; i++) {\n\t      E = i === -1 ? O : arguments[i];\n\t      if (isConcatSpreadable(E)) {\n\t        len = toLength(E.length);\n\t        if (n + len > MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n\t        for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]);\n\t      } else {\n\t        if (n >= MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n\t        createProperty(A, n++, E);\n\t      }\n\t    }\n\t    A.length = n;\n\t    return A;\n\t  }\n\t});\n\n\t/**\n\t * Bootstrap Table Afrikaans translation\n\t * Author: Phillip Kruger <phillip.kruger@gmail.com>\n\t */\n\n\t$.fn.bootstrapTable.locales['af-ZA'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Besig om te laai, wag asseblief';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" rekords per bladsy\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"Resultate \".concat(pageFrom, \" tot \").concat(pageTo, \" van \").concat(totalRows, \" rye (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"Resultate \".concat(pageFrom, \" tot \").concat(pageTo, \" van \").concat(totalRows, \" rye\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Clear Search';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Soek';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'Geen rekords gevind nie';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Wys/verberg bladsy nummering';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Herlaai';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Wissel';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Kolomme';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'All';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Export data';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['af-ZA']);\n\n\t/**\n\t * Bootstrap Table English translation\n\t * Author: Zhixin Wen<wenzhixin2010@gmail.com>\n\t */\n\n\t$.fn.bootstrapTable.locales['ar-SA'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'جاري التحميل, يرجى الإنتظار';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" \\u0633\\u062C\\u0644 \\u0644\\u0643\\u0644 \\u0635\\u0641\\u062D\\u0629\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"\\u0627\\u0644\\u0638\\u0627\\u0647\\u0631 \".concat(pageFrom, \" \\u0625\\u0644\\u0649 \").concat(pageTo, \" \\u0645\\u0646 \").concat(totalRows, \" \\u0633\\u062C\\u0644 \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"\\u0627\\u0644\\u0638\\u0627\\u0647\\u0631 \".concat(pageFrom, \" \\u0625\\u0644\\u0649 \").concat(pageTo, \" \\u0645\\u0646 \").concat(totalRows, \" \\u0633\\u062C\\u0644\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Clear Search';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'بحث';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'لا توجد نتائج مطابقة للبحث';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    /* eslint-disable no-useless-escape */\n\t    return 'إخفاء\\إظهار ترقيم الصفحات';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'تحديث';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'تغيير';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'أعمدة';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'All';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Export data';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['ar-SA']);\n\n\t/**\n\t * Bootstrap Table Catalan translation\n\t * Authors: Marc Pina<iwalkalone69@gmail.com>\n\t *          Claudi Martinez<claudix.kernel@gmail.com>\n\t */\n\n\t$.fn.bootstrapTable.locales['ca-ES'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Espereu, si us plau';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" resultats per p\\xE0gina\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"Mostrant de \".concat(pageFrom, \" fins \").concat(pageTo, \" - total \").concat(totalRows, \" resultats (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"Mostrant de \".concat(pageFrom, \" fins \").concat(pageTo, \" - total \").concat(totalRows, \" resultats\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Clear Search';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Cerca';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'No s\\'han trobat resultats';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Amaga/Mostra paginació';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Refresca';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Alterna formatació';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Columnes';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'Tots';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Export data';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['ca-ES']);\n\n\t/**\n\t * Bootstrap Table Czech translation\n\t * Author: Lukas Kral (monarcha@seznam.cz)\n\t * Author: Jakub Svestka <svestka1999@gmail.com>\n\t */\n\n\t$.fn.bootstrapTable.locales['cs-CZ'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Čekejte, prosím';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" polo\\u017Eek na str\\xE1nku\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"Zobrazena \".concat(pageFrom, \". - \").concat(pageTo, \" . polo\\u017Eka z celkov\\xFDch \").concat(totalRows, \" (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"Zobrazena \".concat(pageFrom, \". - \").concat(pageTo, \" . polo\\u017Eka z celkov\\xFDch \").concat(totalRows);\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Clear Search';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Vyhledávání';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'Nenalezena žádná vyhovující položka';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Skrýt/Zobrazit stránkování';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Aktualizovat';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Přepni';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Sloupce';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'Vše';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Export data';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['cs-CZ']);\n\n\t/**\n\t * Bootstrap Table danish translation\n\t * Author: Your Name Jan Borup Coyle, github@coyle.dk\n\t */\n\n\t$.fn.bootstrapTable.locales['da-DK'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Indlæser, vent venligst';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" poster pr side\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"Viser \".concat(pageFrom, \" til \").concat(pageTo, \" af \").concat(totalRows, \" r\\xE6kke\").concat(totalRows > 1 ? 'r' : '', \" (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"Viser \".concat(pageFrom, \" til \").concat(pageTo, \" af \").concat(totalRows, \" r\\xE6kke\").concat(totalRows > 1 ? 'r' : '');\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Viser \".concat(totalRows, \" r\\xE6kke\").concat(totalRows > 1 ? 'r' : '');\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Ryd filtre';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Søg';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'Ingen poster fundet';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Skjul/vis nummerering';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Opdater';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Skift';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Kolonner';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'Alle';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Eksporter';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['da-DK']);\n\n\t/**\n\t* Bootstrap Table German translation\n\t* Author: Paul Mohr - Sopamo<p.mohr@sopamo.de>\n\t*/\n\n\t$.fn.bootstrapTable.locales['de-DE'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Lade, bitte warten';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" Zeilen pro Seite.\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"Zeige Zeile \".concat(pageFrom, \" bis \").concat(pageTo, \" von \").concat(totalRows, \" Zeile\").concat(totalRows > 1 ? 'n' : '', \" (Gefiltert von \").concat(totalNotFiltered, \" Zeile\").concat(totalNotFiltered > 1 ? 'n' : '', \")\");\n\t    }\n\n\t    return \"Zeige Zeile \".concat(pageFrom, \" bis \").concat(pageTo, \" von \").concat(totalRows, \" Zeile\").concat(totalRows > 1 ? 'n' : '', \".\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'Vorherige Seite';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"Zu Seite \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'Nächste Seite';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Zeige \".concat(totalRows, \" Zeile\").concat(totalRows > 1 ? 'n' : '', \".\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Lösche Filter';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Suchen';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'Keine passenden Ergebnisse gefunden';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Verstecke/Zeige Nummerierung';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Zeige Nummerierung';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Verstecke Nummerierung';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Neu laden';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Umschalten';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Normale Ansicht';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Kartenansicht';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Spalten';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Alle umschalten';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Vollbild';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'Alle';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Automatisches Neuladen';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Datenexport';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Erweiterte Suche';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Schließen';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['de-DE']);\n\n\t/**\n\t * Bootstrap Table Greek translation\n\t * Author: giannisdallas\n\t */\n\n\t$.fn.bootstrapTable.locales['el-GR'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Φορτώνει, παρακαλώ περιμένετε';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" \\u03B1\\u03C0\\u03BF\\u03C4\\u03B5\\u03BB\\u03AD\\u03C3\\u03BC\\u03B1\\u03C4\\u03B1 \\u03B1\\u03BD\\u03AC \\u03C3\\u03B5\\u03BB\\u03AF\\u03B4\\u03B1\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"\\u0395\\u03BC\\u03C6\\u03B1\\u03BD\\u03AF\\u03B6\\u03BF\\u03BD\\u03C4\\u03B1\\u03B9 \\u03B1\\u03C0\\u03CC \\u03C4\\u03B7\\u03BD \".concat(pageFrom, \" \\u03C9\\u03C2 \\u03C4\\u03B7\\u03BD \").concat(pageTo, \" \\u03B1\\u03C0\\u03CC \\u03C3\\u03CD\\u03BD\\u03BF\\u03BB\\u03BF \").concat(totalRows, \" \\u03C3\\u03B5\\u03B9\\u03C1\\u03CE\\u03BD (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"\\u0395\\u03BC\\u03C6\\u03B1\\u03BD\\u03AF\\u03B6\\u03BF\\u03BD\\u03C4\\u03B1\\u03B9 \\u03B1\\u03C0\\u03CC \\u03C4\\u03B7\\u03BD \".concat(pageFrom, \" \\u03C9\\u03C2 \\u03C4\\u03B7\\u03BD \").concat(pageTo, \" \\u03B1\\u03C0\\u03CC \\u03C3\\u03CD\\u03BD\\u03BF\\u03BB\\u03BF \").concat(totalRows, \" \\u03C3\\u03B5\\u03B9\\u03C1\\u03CE\\u03BD\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Clear Search';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Αναζητήστε';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'Δεν βρέθηκαν αποτελέσματα';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Hide/Show pagination';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Refresh';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Toggle';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Columns';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'All';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Export data';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['el-GR']);\n\n\t/**\n\t * Bootstrap Table English translation\n\t * Author: Zhixin Wen<wenzhixin2010@gmail.com>\n\t */\n\n\t$.fn.bootstrapTable.locales['en-US'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Loading, please wait';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" rows per page\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"Showing \".concat(pageFrom, \" to \").concat(pageTo, \" of \").concat(totalRows, \" rows (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"Showing \".concat(pageFrom, \" to \").concat(pageTo, \" of \").concat(totalRows, \" rows\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Clear Search';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Search';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'No matching records found';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Hide/Show pagination';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Refresh';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Toggle';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Columns';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'All';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Export data';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['en-US']);\n\n\t/**\n\t * Bootstrap Table Spanish (Argentina) translation\n\t * Author: Felix Vera (felix.vera@gmail.com)\n\t */\n\n\t$.fn.bootstrapTable.locales['es-AR'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Cargando, espere por favor';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" registros por p\\xE1gina\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"Mostrando \".concat(pageFrom, \" a \").concat(pageTo, \" de \").concat(totalRows, \" filas (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"Mostrando \".concat(pageFrom, \" a \").concat(pageTo, \" de \").concat(totalRows, \" filas\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Limpiar búsqueda';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Buscar';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'No se encontraron registros';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Hide/Show pagination';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Refresh';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Toggle';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Columns';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'Todo';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Export data';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['es-AR']);\n\n\t/**\n\t * Traducción de librería Bootstrap Table a Español (Chile)\n\t * @author Brian Álvarez Azócar\n\t * email brianalvarezazocar@gmail.com\n\t */\n\n\t$.fn.bootstrapTable.locales['es-CL'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Cargando, espere por favor';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" filas por p\\xE1gina\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"Mostrando \".concat(pageFrom, \" a \").concat(pageTo, \" de \").concat(totalRows, \" filas (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"Mostrando \".concat(pageFrom, \" a \").concat(pageTo, \" de \").concat(totalRows, \" filas\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Limpiar búsqueda';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Buscar';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'No se encontraron registros';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return \"Ocultar/Mostrar paginaci\\xF3n\";\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Refrescar';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Cambiar';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Columnas';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'Todo';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Export data';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['es-CL']);\n\n\t/**\n\t * Bootstrap Table Spanish (Costa Rica) translation\n\t * Author: Dennis Hernández (http://djhvscf.github.io/Blog/)\n\t */\n\n\t$.fn.bootstrapTable.locales['es-CR'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Cargando, por favor espere';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" registros por p\\xE1gina\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"Mostrando de \".concat(pageFrom, \" a \").concat(pageTo, \" registros de \").concat(totalRows, \" registros en total (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"Mostrando de \".concat(pageFrom, \" a \").concat(pageTo, \" registros de \").concat(totalRows, \" registros en total\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Limpiar búsqueda';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Buscar';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'No se encontraron registros';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Hide/Show pagination';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Refrescar';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Alternar';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Columnas';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'Todo';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Export data';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['es-CR']);\n\n\t/**\n\t * Bootstrap Table Spanish Spain translation\n\t * Author: Marc Pina<iwalkalone69@gmail.com>\n\t */\n\n\t$.fn.bootstrapTable.locales['es-ES'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Por favor espere';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" resultados por p\\xE1gina\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"Mostrando desde \".concat(pageFrom, \" hasta \").concat(pageTo, \" - En total \").concat(totalRows, \" resultados (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"Mostrando desde \".concat(pageFrom, \" hasta \").concat(pageTo, \" - En total \").concat(totalRows, \" resultados\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Limpiar búsqueda';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Buscar';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'No se encontraron resultados';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Ocultar/Mostrar paginación';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Refrescar';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Ocultar/Mostrar';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Columnas';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'Todos';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Exportar los datos';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Búsqueda avanzada';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Cerrar';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['es-ES']);\n\n\t/**\n\t * Bootstrap Table Spanish (México) translation (Obtenido de traducción de Argentina)\n\t * Author: Felix Vera (felix.vera@gmail.com)\n\t * Copiado: Mauricio Vera (mauricioa.vera@gmail.com)\n\t * Revisión: J Manuel Corona (jmcg92@gmail.com) (13/Feb/2018).\n\t */\n\n\t$.fn.bootstrapTable.locales['es-MX'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Cargando, espere por favor';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" registros por p\\xE1gina\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"Mostrando \".concat(pageFrom, \" a \").concat(pageTo, \" de \").concat(totalRows, \" filas (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"Mostrando \".concat(pageFrom, \" a \").concat(pageTo, \" de \").concat(totalRows, \" filas\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Mostrando \".concat(totalRows, \" filas\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Limpiar búsqueda';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Buscar';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'No se encontraron registros que coincidan';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Mostrar/ocultar paginación';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Actualizar';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Cambiar vista';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Columnas';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Pantalla completa';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'Todo';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Export data';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['es-MX']);\n\n\t/**\n\t * Bootstrap Table Spanish (Nicaragua) translation\n\t * Author: Dennis Hernández (http://djhvscf.github.io/Blog/)\n\t */\n\n\t$.fn.bootstrapTable.locales['es-NI'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Cargando, por favor espere';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" registros por p\\xE1gina\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"Mostrando de \".concat(pageFrom, \" a \").concat(pageTo, \" registros de \").concat(totalRows, \" registros en total (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"Mostrando de \".concat(pageFrom, \" a \").concat(pageTo, \" registros de \").concat(totalRows, \" registros en total\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Limpiar búsqueda';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Buscar';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'No se encontraron registros';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Hide/Show pagination';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Refrescar';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Alternar';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Columnas';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'Todo';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Export data';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['es-NI']);\n\n\t/**\n\t * Bootstrap Table Spanish (España) translation\n\t * Author: Antonio Pérez <anpegar@gmail.com>\n\t */\n\n\t$.fn.bootstrapTable.locales['es-SP'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Cargando, por favor espera';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" registros por p&#225;gina.\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"\".concat(pageFrom, \" - \").concat(pageTo, \" de \").concat(totalRows, \" registros (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"\".concat(pageFrom, \" - \").concat(pageTo, \" de \").concat(totalRows, \" registros.\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Limpiar búsqueda';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Buscar';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'No se han encontrado registros.';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Hide/Show pagination';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Actualizar';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Alternar';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Columnas';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'Todo';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Export data';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['es-SP']);\n\n\t/**\n\t * Bootstrap Table Estonian translation\n\t * Author: kristjan@logist.it>\n\t */\n\n\t$.fn.bootstrapTable.locales['et-EE'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Päring käib, palun oota';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" rida lehe kohta\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"N\\xE4itan tulemusi \".concat(pageFrom, \" kuni \").concat(pageTo, \" - kokku \").concat(totalRows, \" tulemust (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"N\\xE4itan tulemusi \".concat(pageFrom, \" kuni \").concat(pageTo, \" - kokku \").concat(totalRows, \" tulemust\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Clear Search';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Otsi';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'Päringu tingimustele ei vastanud ühtegi tulemust';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Näita/Peida lehtedeks jagamine';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Värskenda';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Lülita';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Veerud';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'Kõik';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Export data';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['et-EE']);\n\n\t/**\n\t * Bootstrap Table Basque (Basque Country) translation\n\t * Author: Iker Ibarguren Berasaluze<ikerib@gmail.com>\n\t */\n\n\t$.fn.bootstrapTable.locales['eu-EU'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Itxaron mesedez';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" emaitza orriko.\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"\".concat(totalRows, \" erregistroetatik \").concat(pageFrom, \"etik \").concat(pageTo, \"erakoak erakusten (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"\".concat(totalRows, \" erregistroetatik \").concat(pageFrom, \"etik \").concat(pageTo, \"erakoak erakusten.\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Clear Search';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Bilatu';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'Ez da emaitzarik aurkitu';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Ezkutatu/Erakutsi orrikatzea';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Eguneratu';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Ezkutatu/Erakutsi';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Zutabeak';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'Guztiak';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Export data';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['eu-EU']);\n\n\t/**\n\t * Bootstrap Table Persian translation\n\t * Author: MJ Vakili <mjv.1989@Gmail.com>\n\t */\n\n\t$.fn.bootstrapTable.locales['fa-IR'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'در حال بارگذاری, لطفا صبر کنید';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" \\u0631\\u06A9\\u0648\\u0631\\u062F \\u062F\\u0631 \\u0635\\u0641\\u062D\\u0647\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"\\u0646\\u0645\\u0627\\u06CC\\u0634 \".concat(pageFrom, \" \\u062A\\u0627 \").concat(pageTo, \" \\u0627\\u0632 \").concat(totalRows, \" \\u0631\\u062F\\u06CC\\u0641 (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"\\u0646\\u0645\\u0627\\u06CC\\u0634 \".concat(pageFrom, \" \\u062A\\u0627 \").concat(pageTo, \" \\u0627\\u0632 \").concat(totalRows, \" \\u0631\\u062F\\u06CC\\u0641\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Clear Search';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'جستجو';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'رکوردی یافت نشد.';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'نمایش/مخفی صفحه بندی';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'به روز رسانی';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'تغییر نمایش';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'سطر ها';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'همه';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Export data';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['fa-IR']);\n\n\t/**\n\t * Bootstrap Table Finnish translations\n\t * Author: Minna Lehtomäki <minna.j.lehtomaki@gmail.com>\n\t */\n\n\t$.fn.bootstrapTable.locales['fi-FI'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Ladataan, ole hyvä ja odota';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" rivi\\xE4 sivulla\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"N\\xE4ytet\\xE4\\xE4n rivit \".concat(pageFrom, \" - \").concat(pageTo, \" / \").concat(totalRows, \" (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"N\\xE4ytet\\xE4\\xE4n rivit \".concat(pageFrom, \" - \").concat(pageTo, \" / \").concat(totalRows);\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Poista suodattimet';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Hae';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'Hakuehtoja vastaavia tuloksia ei löytynyt';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Näytä/Piilota sivutus';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Päivitä';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Valitse';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Sarakkeet';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'Kaikki';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Vie tiedot';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['fi-FI']);\n\n\t/**\n\t * Bootstrap Table French (Belgium) translation\n\t * Author: Julien Bisconti (julien.bisconti@gmail.com)\n\t *         Nevets82 <Nevets82@gmail.com>\n\t */\n\n\t$.fn.bootstrapTable.locales['fr-BE'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Chargement en cours';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" lignes par page\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"Affiche de \".concat(pageFrom, \" \\xE0 \").concat(pageTo, \" sur \").concat(totalRows, \" lignes (filtr\\xE9s \\xE0 partir de \").concat(totalNotFiltered, \" lignes)\");\n\t    }\n\n\t    return \"Affiche de \".concat(pageFrom, \" \\xE0 \").concat(pageTo, \" sur \").concat(totalRows, \" lignes\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'page précédente';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"vers la page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'page suivante';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Affiche \".concat(totalRows, \" lignes\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Effacer la recherche';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Recherche';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'Pas de lignes trouvés';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Cacher/Afficher pagination';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Afficher pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Cacher pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Rafraichir';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Basculer';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Afficher vue carte';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Cacher vue carte';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Colonnes';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Tout basculer';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Plein écran';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'Tout';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Rafraîchissement automatique';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Exporter les données';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'Aller à';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Recherche avancée';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Fermer';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['fr-BE']);\n\n\t/**\n\t * Bootstrap Table French (Suisse) translation\n\t * Author: Nevets82 <Nevets82@gmail.com>\n\t */\n\n\t$.fn.bootstrapTable.locales['fr-CH'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Chargement en cours';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" lignes par page\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"Affiche de \".concat(pageFrom, \" \\xE0 \").concat(pageTo, \" sur \").concat(totalRows, \" lignes (filtr\\xE9s \\xE0 partir de \").concat(totalNotFiltered, \" lignes)\");\n\t    }\n\n\t    return \"Affiche de \".concat(pageFrom, \" \\xE0 \").concat(pageTo, \" sur \").concat(totalRows, \" lignes\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'page précédente';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"vers la page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'page suivante';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Affiche \".concat(totalRows, \" lignes\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Effacer la recherche';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Recherche';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'Pas de lignes trouvés';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Cacher/Afficher pagination';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Afficher pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Cacher pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Rafraichir';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Basculer';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Afficher vue carte';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Cacher vue carte';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Colonnes';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Tout basculer';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Plein écran';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'Tout';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Rafraîchissement automatique';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Exporter les données';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'Aller à';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Recherche avancée';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Fermer';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['fr-CH']);\n\n\t/**\n\t * Bootstrap Table French (France) translation\n\t * Author: Dennis Hernández (http://djhvscf.github.io/Blog/)\n\t *         Tidalf (https://github.com/TidalfFR)\n\t *         Nevets82 <Nevets82@gmail.com>\n\t */\n\n\t$.fn.bootstrapTable.locales['fr-FR'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Chargement en cours';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" lignes par page\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"Affiche de \".concat(pageFrom, \" \\xE0 \").concat(pageTo, \" sur \").concat(totalRows, \" lignes (filtr\\xE9s \\xE0 partir de \").concat(totalNotFiltered, \" lignes)\");\n\t    }\n\n\t    return \"Affiche de \".concat(pageFrom, \" \\xE0 \").concat(pageTo, \" sur \").concat(totalRows, \" lignes\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'page précédente';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"vers la page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'page suivante';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Affiche \".concat(totalRows, \" lignes\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Effacer la recherche';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Recherche';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'Pas de lignes trouvés';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Cacher/Afficher pagination';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Afficher pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Cacher pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Rafraichir';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Basculer';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Afficher vue carte';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Cacher vue carte';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Colonnes';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Tout basculer';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Plein écran';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'Tout';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Rafraîchissement automatique';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Exporter les données';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'Aller à';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Recherche avancée';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Fermer';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['fr-FR']);\n\n\t/**\n\t * Bootstrap Table French (Luxembourg) translation\n\t * Author: Nevets82 <Nevets82@gmail.com>\n\t */\n\n\t$.fn.bootstrapTable.locales['fr-LU'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Chargement en cours';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" lignes par page\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"Affiche de \".concat(pageFrom, \" \\xE0 \").concat(pageTo, \" sur \").concat(totalRows, \" lignes (filtr\\xE9s \\xE0 partir de \").concat(totalNotFiltered, \" lignes)\");\n\t    }\n\n\t    return \"Affiche de \".concat(pageFrom, \" \\xE0 \").concat(pageTo, \" sur \").concat(totalRows, \" lignes\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'page précédente';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"vers la page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'page suivante';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Affiche \".concat(totalRows, \" lignes\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Effacer la recherche';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Recherche';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'Pas de lignes trouvés';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Cacher/Afficher pagination';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Afficher pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Cacher pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Rafraichir';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Basculer';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Afficher vue carte';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Cacher vue carte';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Colonnes';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Tout basculer';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Plein écran';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'Tout';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Rafraîchissement automatique';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Exporter les données';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'Aller à';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Recherche avancée';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Fermer';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['fr-LU']);\n\n\t/**\n\t * Bootstrap Table Hebrew translation\n\t * Author: legshooter\n\t */\n\n\t$.fn.bootstrapTable.locales['he-IL'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'טוען, נא להמתין';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" \\u05E9\\u05D5\\u05E8\\u05D5\\u05EA \\u05D1\\u05E2\\u05DE\\u05D5\\u05D3\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"\\u05DE\\u05E6\\u05D9\\u05D2 \".concat(pageFrom, \" \\u05E2\\u05D3 \").concat(pageTo, \" \\u05DE-\").concat(totalRows, \"\\u05E9\\u05D5\\u05E8\\u05D5\\u05EA\").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"\\u05DE\\u05E6\\u05D9\\u05D2 \".concat(pageFrom, \" \\u05E2\\u05D3 \").concat(pageTo, \" \\u05DE-\").concat(totalRows, \" \\u05E9\\u05D5\\u05E8\\u05D5\\u05EA\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Clear Search';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'חיפוש';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'לא נמצאו רשומות תואמות';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'הסתר/הצג מספור דפים';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'רענן';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'החלף תצוגה';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'עמודות';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'הכל';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Export data';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['he-IL']);\n\n\t/**\n\t* Bootstrap Table Croatian translation\n\t* Author: Petra Štrbenac (petra.strbenac@gmail.com)\n\t* Author: Petra Štrbenac (petra.strbenac@gmail.com)\n\t*/\n\n\t$.fn.bootstrapTable.locales['hr-HR'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Molimo pričekajte';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" broj zapisa po stranici\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"Prikazujem \".concat(pageFrom, \". - \").concat(pageTo, \". od ukupnog broja zapisa \").concat(totalRows, \" (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"Prikazujem \".concat(pageFrom, \". - \").concat(pageTo, \". od ukupnog broja zapisa \").concat(totalRows);\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Clear Search';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Pretraži';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'Nije pronađen niti jedan zapis';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Prikaži/sakrij stranice';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Osvježi';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Promijeni prikaz';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Kolone';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'Sve';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Export data';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['hr-HR']);\n\n\t/**\n\t * Bootstrap Table Hungarian translation\n\t * Author: Nagy Gergely <info@nagygergely.eu>\n\t */\n\n\t$.fn.bootstrapTable.locales['hu-HU'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Betöltés, kérem várjon';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" rekord per oldal\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"Megjelen\\xEDtve \".concat(pageFrom, \" - \").concat(pageTo, \" / \").concat(totalRows, \" \\xF6sszesen (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"Megjelen\\xEDtve \".concat(pageFrom, \" - \").concat(pageTo, \" / \").concat(totalRows, \" \\xF6sszesen\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Clear Search';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Keresés';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'Nincs találat';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Lapozó elrejtése/megjelenítése';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Frissítés';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Összecsuk/Kinyit';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Oszlopok';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'Összes';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Export data';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['hu-HU']);\n\n\t/**\n\t * Bootstrap Table Indonesian translation\n\t * Author: Andre Gardiner<andre@sirdre.com>\n\t */\n\n\t$.fn.bootstrapTable.locales['id-ID'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Memuat, mohon tunggu';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" baris per halaman\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"Menampilkan \".concat(pageFrom, \" sampai \").concat(pageTo, \" dari \").concat(totalRows, \" baris (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"Menampilkan \".concat(pageFrom, \" sampai \").concat(pageTo, \" dari \").concat(totalRows, \" baris\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Bersihkan filter';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Pencarian';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'Tidak ditemukan data yang cocok';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Sembunyikan/Tampilkan halaman';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Muat ulang';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Beralih';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'kolom';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'Semua';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Ekspor data';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['id-ID']);\n\n\t/**\n\t * Bootstrap Table Italian translation\n\t * Author: Davide Renzi<davide.renzi@gmail.com>\n\t * Author: Davide Borsatto <davide.borsatto@gmail.com>\n\t * Author: Alessio Felicioni <alessio.felicioni@gmail.com>\n\t */\n\n\t$.fn.bootstrapTable.locales['it-IT'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Caricamento in corso';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" elementi per pagina\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"Visualizzazione da \".concat(pageFrom, \" a \").concat(pageTo, \" di \").concat(totalRows, \" elementi (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"Visualizzazione da \".concat(pageFrom, \" a \").concat(pageTo, \" di \").concat(totalRows, \" elementi\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Pulisci filtri';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Cerca';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'Nessun elemento trovato';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Nascondi/Mostra paginazione';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Aggiorna';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Attiva/Disattiva';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Colonne';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'Tutto';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Esporta dati';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['it-IT']);\n\n\t/**\n\t * Bootstrap Table Japanese translation\n\t * Author: Azamshul Azizy <azamshul@gmail.com>\n\t */\n\n\t$.fn.bootstrapTable.locales['ja-JP'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return '読み込み中です。少々お待ちください。';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\\u30DA\\u30FC\\u30B8\\u5F53\\u305F\\u308A\\u6700\\u5927\".concat(pageNumber, \"\\u4EF6\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"\\u5168\".concat(totalRows, \"\\u4EF6\\u304B\\u3089\\u3001\").concat(pageFrom, \"\\u304B\\u3089\").concat(pageTo, \"\\u4EF6\\u76EE\\u307E\\u3067\\u8868\\u793A\\u3057\\u3066\\u3044\\u307E\\u3059 (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"\\u5168\".concat(totalRows, \"\\u4EF6\\u304B\\u3089\\u3001\").concat(pageFrom, \"\\u304B\\u3089\").concat(pageTo, \"\\u4EF6\\u76EE\\u307E\\u3067\\u8868\\u793A\\u3057\\u3066\\u3044\\u307E\\u3059\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Clear Search';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return '検索';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return '該当するレコードが見つかりません';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'ページ数を表示・非表示';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return '更新';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'トグル';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return '列';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'すべて';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Export data';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['ja-JP']);\n\n\t/**\n\t * Bootstrap Table Georgian translation\n\t * Author: Levan Lotuashvili <l.lotuashvili@gmail.com>\n\t */\n\n\t$.fn.bootstrapTable.locales['ka-GE'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'იტვირთება, გთხოვთ მოიცადოთ';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" \\u10E9\\u10D0\\u10DC\\u10D0\\u10EC\\u10D4\\u10E0\\u10D8 \\u10D7\\u10D8\\u10D7\\u10DD \\u10D2\\u10D5\\u10D4\\u10E0\\u10D3\\u10D6\\u10D4\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"\\u10DC\\u10D0\\u10E9\\u10D5\\u10D4\\u10DC\\u10D4\\u10D1\\u10D8\\u10D0 \".concat(pageFrom, \"-\\u10D3\\u10D0\\u10DC \").concat(pageTo, \"-\\u10DB\\u10D3\\u10D4 \\u10E9\\u10D0\\u10DC\\u10D0\\u10EC\\u10D4\\u10E0\\u10D8 \\u10EF\\u10D0\\u10DB\\u10E3\\u10E0\\u10D8 \").concat(totalRows, \"-\\u10D3\\u10D0\\u10DC (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"\\u10DC\\u10D0\\u10E9\\u10D5\\u10D4\\u10DC\\u10D4\\u10D1\\u10D8\\u10D0 \".concat(pageFrom, \"-\\u10D3\\u10D0\\u10DC \").concat(pageTo, \"-\\u10DB\\u10D3\\u10D4 \\u10E9\\u10D0\\u10DC\\u10D0\\u10EC\\u10D4\\u10E0\\u10D8 \\u10EF\\u10D0\\u10DB\\u10E3\\u10E0\\u10D8 \").concat(totalRows, \"-\\u10D3\\u10D0\\u10DC\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Clear Search';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'ძებნა';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'მონაცემები არ არის';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'გვერდების გადამრთველის დამალვა/გამოჩენა';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'განახლება';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'ჩართვა/გამორთვა';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'სვეტები';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'All';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Export data';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['ka-GE']);\n\n\t/**\n\t * Bootstrap Table Korean translation\n\t * Author: Yi Tae-Hyeong (jsonobject@gmail.com)\n\t */\n\n\t$.fn.bootstrapTable.locales['ko-KR'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return '데이터를 불러오는 중입니다';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\\uD398\\uC774\\uC9C0 \\uB2F9 \".concat(pageNumber, \"\\uAC1C \\uB370\\uC774\\uD130 \\uCD9C\\uB825\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"\\uC804\\uCCB4 \".concat(totalRows, \"\\uAC1C \\uC911 \").concat(pageFrom, \"~\").concat(pageTo, \"\\uBC88\\uC9F8 \\uB370\\uC774\\uD130 \\uCD9C\\uB825, (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"\\uC804\\uCCB4 \".concat(totalRows, \"\\uAC1C \\uC911 \").concat(pageFrom, \"~\").concat(pageTo, \"\\uBC88\\uC9F8 \\uB370\\uC774\\uD130 \\uCD9C\\uB825,\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Clear Search';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return '검색';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return '조회된 데이터가 없습니다.';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Hide/Show pagination';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return '새로 고침';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return '전환';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return '컬럼 필터링';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'All';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Export data';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['ko-KR']);\n\n\t/**\n\t * Bootstrap Table Malay translation\n\t * Author: Azamshul Azizy <azamshul@gmail.com>\n\t */\n\n\t$.fn.bootstrapTable.locales['ms-MY'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Permintaan sedang dimuatkan. Sila tunggu sebentar';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" rekod setiap muka surat\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"Sedang memaparkan rekod \".concat(pageFrom, \" hingga \").concat(pageTo, \" daripada jumlah \").concat(totalRows, \" rekod (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"Sedang memaparkan rekod \".concat(pageFrom, \" hingga \").concat(pageTo, \" daripada jumlah \").concat(totalRows, \" rekod\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Clear Search';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Cari';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'Tiada rekod yang menyamai permintaan';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Tunjuk/sembunyi muka surat';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Muatsemula';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Tukar';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Lajur';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'Semua';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Export data';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['ms-MY']);\n\n\t/**\n\t * Bootstrap Table norwegian translation\n\t * Author: Jim Nordbø, jim@nordb.no\n\t */\n\n\t$.fn.bootstrapTable.locales['nb-NO'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Oppdaterer, vennligst vent';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" poster pr side\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"Viser \".concat(pageFrom, \" til \").concat(pageTo, \" av \").concat(totalRows, \" rekker (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"Viser \".concat(pageFrom, \" til \").concat(pageTo, \" av \").concat(totalRows, \" rekker\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Clear Search';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Søk';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'Ingen poster funnet';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Hide/Show pagination';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Oppdater';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Endre';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Kolonner';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'All';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Export data';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['nb-NO']);\n\n\t/**\n\t * Bootstrap Table Dutch (Belgi�) translation\n\t * Author: Nevets82 <Nevets82@gmail.com>\n\t */\n\n\t$.fn.bootstrapTable.locales['nl-BE'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Laden, even geduld';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" records per pagina\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"Toon \".concat(pageFrom, \" tot \").concat(pageTo, \" van \").concat(totalRows, \" record\").concat(totalRows > 1 ? 's' : '', \" (gefilterd van \").concat(totalNotFiltered, \" records in totaal)\");\n\t    }\n\n\t    return \"Toon \".concat(pageFrom, \" tot \").concat(pageTo, \" van \").concat(totalRows, \" record\").concat(totalRows > 1 ? 's' : '');\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'vorige pagina';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"tot pagina \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'volgende pagina';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Toon \".concat(totalRows, \" record\").concat(totalRows > 1 ? 's' : '');\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Verwijder filters';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Zoeken';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'Geen resultaten gevonden';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Verberg/Toon paginering';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Toon paginering';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Verberg paginering';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Vernieuwen';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Omschakelen';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Toon kaartweergave';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Verberg kaartweergave';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Kolommen';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Allen omschakelen';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Volledig scherm';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'Alle';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Automatisch vernieuwen';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Exporteer gegevens';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GA';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Geavanceerd zoeken';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Sluiten';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['nl-BE']);\n\n\t/**\n\t * Bootstrap Table Dutch (Nederland) translation\n\t * Author: Your Name <info@a2hankes.nl>\n\t *         Nevets82 <Nevets82@gmail.com>\n\t */\n\n\t$.fn.bootstrapTable.locales['nl-NL'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Laden, even geduld';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" records per pagina\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"Toon \".concat(pageFrom, \" tot \").concat(pageTo, \" van \").concat(totalRows, \" record\").concat(totalRows > 1 ? 's' : '', \" (gefilterd van \").concat(totalNotFiltered, \" records in totaal)\");\n\t    }\n\n\t    return \"Toon \".concat(pageFrom, \" tot \").concat(pageTo, \" van \").concat(totalRows, \" record\").concat(totalRows > 1 ? 's' : '');\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'vorige pagina';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"tot pagina \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'volgende pagina';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Toon \".concat(totalRows, \" record\").concat(totalRows > 1 ? 's' : '');\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Verwijder filters';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Zoeken';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'Geen resultaten gevonden';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Verberg/Toon paginering';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Toon paginering';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Verberg paginering';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Vernieuwen';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Omschakelen';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Toon kaartweergave';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Verberg kaartweergave';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Kolommen';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Allen omschakelen';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Volledig scherm';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'Alle';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Automatisch vernieuwen';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Exporteer gegevens';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GA';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Geavanceerd zoeken';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Sluiten';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['nl-NL']);\n\n\t/**\n\t * Bootstrap Table Polish translation\n\t * Author: zergu <michal.zagdan @ gmail com>\n\t */\n\n\t$.fn.bootstrapTable.locales['pl-PL'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Ładowanie, proszę czekać';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" rekord\\xF3w na stron\\u0119\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"Wy\\u015Bwietlanie rekord\\xF3w od \".concat(pageFrom, \" do \").concat(pageTo, \" z \").concat(totalRows, \" (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"Wy\\u015Bwietlanie rekord\\xF3w od \".concat(pageFrom, \" do \").concat(pageTo, \" z \").concat(totalRows);\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Clear Search';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Szukaj';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'Niestety, nic nie znaleziono';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Hide/Show pagination';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Odśwież';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Przełącz';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Kolumny';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'All';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Export data';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['pl-PL']);\n\n\t/**\n\t * Bootstrap Table Brazilian Portuguese Translation\n\t * Author: Eduardo Cerqueira<egcerqueira@gmail.com>\n\t * Update: João Mello<jmello@hotmail.com.br>\n\t * Update: Leandro Felizari<lfelizari@gmail.com>\n\t */\n\n\t$.fn.bootstrapTable.locales['pt-BR'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Carregando, aguarde';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" registros por p\\xE1gina\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"Exibindo \".concat(pageFrom, \" at\\xE9 \").concat(pageTo, \" de \").concat(totalRows, \" linhas (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"Exibindo \".concat(pageFrom, \" at\\xE9 \").concat(pageTo, \" de \").concat(totalRows, \" linhas\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'página anterior';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"Para a p\\xE1gina \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'próxima página';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Mostrando \".concat(totalRows, \" linhas\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Limpar Pasquisa';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Pesquisar';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'Nenhum registro encontrado';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Ocultar/Exibir paginação';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Mostrar Paginação';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Esconder Paginação';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Recarregar';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Alternar';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Colunas';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Tela cheia';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'Tudo';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Atualização Automática';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Exportar dados';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'IR';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Pesquisa Avançada';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Fechar';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['pt-BR']);\n\n\t/**\n\t * Bootstrap Table Portuguese Portugal Translation\n\t * Author: Burnspirit<burnspirit@gmail.com>\n\t */\n\n\t$.fn.bootstrapTable.locales['pt-PT'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'A carregar, por favor aguarde';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" registos por p&aacute;gina\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"A mostrar \".concat(pageFrom, \" at&eacute; \").concat(pageTo, \" de \").concat(totalRows, \" linhas (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"A mostrar \".concat(pageFrom, \" at&eacute; \").concat(pageTo, \" de \").concat(totalRows, \" linhas\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Clear Search';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Pesquisa';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'Nenhum registo encontrado';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Esconder/Mostrar pagina&ccedil&atilde;o';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Atualizar';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Alternar';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Colunas';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'Tudo';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Export data';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['pt-PT']);\n\n\t/**\n\t * Bootstrap Table Romanian translation\n\t * Author: cristake <cristianiosif@me.com>\n\t */\n\n\t$.fn.bootstrapTable.locales['ro-RO'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Se incarca, va rugam asteptati';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" inregistrari pe pagina\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"Arata de la \".concat(pageFrom, \" pana la \").concat(pageTo, \" din \").concat(totalRows, \" randuri (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"Arata de la \".concat(pageFrom, \" pana la \").concat(pageTo, \" din \").concat(totalRows, \" randuri\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Clear Search';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Cauta';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'Nu au fost gasite inregistrari';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Ascunde/Arata paginatia';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Reincarca';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Comuta';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Coloane';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'Toate';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Export data';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['ro-RO']);\n\n\t/**\n\t * Bootstrap Table Russian translation\n\t * Author: Dunaevsky Maxim <dunmaksim@yandex.ru>\n\t */\n\n\t$.fn.bootstrapTable.locales['ru-RU'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Пожалуйста, подождите, идёт загрузка';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" \\u0437\\u0430\\u043F\\u0438\\u0441\\u0435\\u0439 \\u043D\\u0430 \\u0441\\u0442\\u0440\\u0430\\u043D\\u0438\\u0446\\u0443\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"\\u0417\\u0430\\u043F\\u0438\\u0441\\u0438 \\u0441 \".concat(pageFrom, \" \\u043F\\u043E \").concat(pageTo, \" \\u0438\\u0437 \").concat(totalRows, \" (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"\\u0417\\u0430\\u043F\\u0438\\u0441\\u0438 \\u0441 \".concat(pageFrom, \" \\u043F\\u043E \").concat(pageTo, \" \\u0438\\u0437 \").concat(totalRows);\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Очистить фильтры';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Поиск';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'Ничего не найдено';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Hide/Show pagination';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Обновить';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Переключить';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Колонки';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'All';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Export data';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['ru-RU']);\n\n\t/**\n\t * Bootstrap Table Slovak translation\n\t * Author: Jozef Dúc<jozef.d13@gmail.com>\n\t */\n\n\t$.fn.bootstrapTable.locales['sk-SK'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Prosím čakajte';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" z\\xE1znamov na stranu\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"Zobrazen\\xE1 \".concat(pageFrom, \". - \").concat(pageTo, \". polo\\u017Eka z celkov\\xFDch \").concat(totalRows, \" (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"Zobrazen\\xE1 \".concat(pageFrom, \". - \").concat(pageTo, \". polo\\u017Eka z celkov\\xFDch \").concat(totalRows);\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Odstráň filtre';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Vyhľadávanie';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'Nenájdená žiadna vyhovujúca položka';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Skry/Zobraz stránkovanie';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Obnoviť';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Prepni';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Stĺpce';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'Všetky';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Exportuj dáta';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['sk-SK']);\n\n\t/**\n\t * Bootstrap Table Swedish translation\n\t * Author: C Bratt <bratt@inix.se>\n\t */\n\n\t$.fn.bootstrapTable.locales['sv-SE'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Laddar, vänligen vänta';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" rader per sida\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"Visa \".concat(pageFrom, \" till \").concat(pageTo, \" av \").concat(totalRows, \" rader (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"Visa \".concat(pageFrom, \" till \").concat(pageTo, \" av \").concat(totalRows, \" rader\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Clear Search';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Sök';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'Inga matchande resultat funna.';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Hide/Show pagination';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Uppdatera';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Skifta';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'kolumn';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'All';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Export data';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['sv-SE']);\n\n\t/**\n\t * Bootstrap Table Thai translation\n\t * Author: Monchai S.<monchais@gmail.com>\n\t */\n\n\t$.fn.bootstrapTable.locales['th-TH'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'กำลังโหลดข้อมูล, กรุณารอสักครู่';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" \\u0E23\\u0E32\\u0E22\\u0E01\\u0E32\\u0E23\\u0E15\\u0E48\\u0E2D\\u0E2B\\u0E19\\u0E49\\u0E32\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"\\u0E23\\u0E32\\u0E22\\u0E01\\u0E32\\u0E23\\u0E17\\u0E35\\u0E48 \".concat(pageFrom, \" \\u0E16\\u0E36\\u0E07 \").concat(pageTo, \" \\u0E08\\u0E32\\u0E01\\u0E17\\u0E31\\u0E49\\u0E07\\u0E2B\\u0E21\\u0E14 \").concat(totalRows, \" \\u0E23\\u0E32\\u0E22\\u0E01\\u0E32\\u0E23 (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"\\u0E23\\u0E32\\u0E22\\u0E01\\u0E32\\u0E23\\u0E17\\u0E35\\u0E48 \".concat(pageFrom, \" \\u0E16\\u0E36\\u0E07 \").concat(pageTo, \" \\u0E08\\u0E32\\u0E01\\u0E17\\u0E31\\u0E49\\u0E07\\u0E2B\\u0E21\\u0E14 \").concat(totalRows, \" \\u0E23\\u0E32\\u0E22\\u0E01\\u0E32\\u0E23\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Clear Search';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'ค้นหา';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'ไม่พบรายการที่ค้นหา !';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Hide/Show pagination';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'รีเฟรส';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'สลับมุมมอง';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'คอลัมน์';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'All';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Export data';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['th-TH']);\n\n\t/**\n\t * Bootstrap Table Turkish translation\n\t * Author: Emin Şen\n\t * Author: Sercan Cakir <srcnckr@gmail.com>\n\t */\n\n\t$.fn.bootstrapTable.locales['tr-TR'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Yükleniyor, lütfen bekleyin';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"Sayfa ba\\u015F\\u0131na \".concat(pageNumber, \" kay\\u0131t.\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"\".concat(totalRows, \" kay\\u0131ttan \").concat(pageFrom, \"-\").concat(pageTo, \" aras\\u0131 g\\xF6steriliyor (filtered from \").concat(totalNotFiltered, \" total rows).\");\n\t    }\n\n\t    return \"\".concat(totalRows, \" kay\\u0131ttan \").concat(pageFrom, \"-\").concat(pageTo, \" aras\\u0131 g\\xF6steriliyor.\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Clear Search';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Ara';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'Eşleşen kayıt bulunamadı.';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Hide/Show pagination';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Yenile';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Değiştir';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Sütunlar';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'Tüm Satırlar';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Export data';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['tr-TR']);\n\n\t/**\n\t * Bootstrap Table Ukrainian translation\n\t * Author: Vitaliy Timchenko <vitaliy.timchenko@gmail.com>\n\t */\n\n\t$.fn.bootstrapTable.locales['uk-UA'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Завантаження, будь ласка, зачекайте';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" \\u0437\\u0430\\u043F\\u0438\\u0441\\u0456\\u0432 \\u043D\\u0430 \\u0441\\u0442\\u043E\\u0440\\u0456\\u043D\\u043A\\u0443\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"\\u041F\\u043E\\u043A\\u0430\\u0437\\u0430\\u043D\\u043E \\u0437 \".concat(pageFrom, \" \\u043F\\u043E \").concat(pageTo, \". \\u0412\\u0441\\u044C\\u043E\\u0433\\u043E: \").concat(totalRows, \" (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"\\u041F\\u043E\\u043A\\u0430\\u0437\\u0430\\u043D\\u043E \\u0437 \".concat(pageFrom, \" \\u043F\\u043E \").concat(pageTo, \". \\u0412\\u0441\\u044C\\u043E\\u0433\\u043E: \").concat(totalRows);\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Очистити фільтри';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Пошук';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'Не знайдено жодного запису';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Hide/Show pagination';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Оновити';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Змінити';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Стовпці';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'All';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Export data';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['uk-UA']);\n\n\t/**\n\t * Bootstrap Table Urdu translation\n\t * Author: Malik <me@malikrizwan.com>\n\t */\n\n\t$.fn.bootstrapTable.locales['ur-PK'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'براۓ مہربانی انتظار کیجئے';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" \\u0631\\u06CC\\u06A9\\u0627\\u0631\\u0688\\u0632 \\u0641\\u06CC \\u0635\\u0641\\u06C1 \");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"\\u062F\\u06CC\\u06A9\\u06BE\\u06CC\\u06BA \".concat(pageFrom, \" \\u0633\\u06D2 \").concat(pageTo, \" \\u06A9\\u06D2 \").concat(totalRows, \"\\u0631\\u06CC\\u06A9\\u0627\\u0631\\u0688\\u0632 (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"\\u062F\\u06CC\\u06A9\\u06BE\\u06CC\\u06BA \".concat(pageFrom, \" \\u0633\\u06D2 \").concat(pageTo, \" \\u06A9\\u06D2 \").concat(totalRows, \"\\u0631\\u06CC\\u06A9\\u0627\\u0631\\u0688\\u0632\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Clear Search';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'تلاش';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'کوئی ریکارڈ نہیں ملا';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Hide/Show pagination';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'تازہ کریں';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'تبدیل کریں';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'کالم';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'All';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Export data';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['ur-PK']);\n\n\t/**\n\t * Bootstrap Table Uzbek translation\n\t * Author: Nabijon Masharipov <mnabijonz@gmail.com>\n\t */\n\n\t$.fn.bootstrapTable.locales['uz-Latn-UZ'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Yuklanyapti, iltimos kuting';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" qator har sahifada\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"Ko'rsatypati \".concat(pageFrom, \" dan \").concat(pageTo, \" gacha \").concat(totalRows, \" qatorlarni (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"Ko'rsatypati \".concat(pageFrom, \" dan \").concat(pageTo, \" gacha \").concat(totalRows, \" qatorlarni\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Filtrlarni tozalash';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Qidirish';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'Hech narsa topilmadi';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Sahifalashni yashirish/ko\\'rsatish';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Yangilash';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Ko\\'rinish';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Ustunlar';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'Hammasi';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Eksport';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['uz-Latn-UZ']);\n\n\t/**\n\t * Bootstrap Table Vietnamese translation\n\t * Author: Duc N. PHAM <pngduc@gmail.com>\n\t */\n\n\t$.fn.bootstrapTable.locales['vi-VN'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Đang tải';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" b\\u1EA3n ghi m\\u1ED7i trang\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"Hi\\u1EC3n th\\u1ECB t\\u1EEB trang \".concat(pageFrom, \" \\u0111\\u1EBFn \").concat(pageTo, \" c\\u1EE7a \").concat(totalRows, \" b\\u1EA3ng ghi (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"Hi\\u1EC3n th\\u1ECB t\\u1EEB trang \".concat(pageFrom, \" \\u0111\\u1EBFn \").concat(pageTo, \" c\\u1EE7a \").concat(totalRows, \" b\\u1EA3ng ghi\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Clear Search';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Tìm kiếm';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'Không có dữ liệu';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Hide/Show pagination';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Refresh';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Toggle';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Columns';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'All';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return 'Auto Refresh';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return 'Export data';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return 'GO';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return 'Advanced search';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return 'Close';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['vi-VN']);\n\n\t/**\n\t * Bootstrap Table Chinese translation\n\t * Author: Zhixin Wen<wenzhixin2010@gmail.com>\n\t */\n\n\t$.fn.bootstrapTable.locales['zh-CN'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return '正在努力地加载数据中，请稍候';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\\u6BCF\\u9875\\u663E\\u793A \".concat(pageNumber, \" \\u6761\\u8BB0\\u5F55\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"\\u663E\\u793A\\u7B2C \".concat(pageFrom, \" \\u5230\\u7B2C \").concat(pageTo, \" \\u6761\\u8BB0\\u5F55\\uFF0C\\u603B\\u5171 \").concat(totalRows, \" \\u6761\\u8BB0\\u5F55\\uFF08\\u4ECE \").concat(totalNotFiltered, \" \\u603B\\u8BB0\\u5F55\\u4E2D\\u8FC7\\u6EE4\\uFF09\");\n\t    }\n\n\t    return \"\\u663E\\u793A\\u7B2C \".concat(pageFrom, \" \\u5230\\u7B2C \").concat(pageTo, \" \\u6761\\u8BB0\\u5F55\\uFF0C\\u603B\\u5171 \").concat(totalRows, \" \\u6761\\u8BB0\\u5F55\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return '上一页';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"\\u7B2C\".concat(page, \"\\u9875\");\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return '下一页';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"\\u603B\\u5171 \".concat(totalRows, \" \\u6761\\u8BB0\\u5F55\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return '清空过滤';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return '搜索';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return '没有找到匹配的记录';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return '隐藏/显示分页';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return '显示分页';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return '隐藏分页';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return '刷新';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return '切换';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return '显示卡片视图';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return '隐藏卡片视图';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return '列';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return '切换所有';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return '全屏';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return '所有';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return '自动刷新';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return '导出数据';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return '跳转';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return '高级搜索';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return '关闭';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['zh-CN']);\n\n\t/**\n\t * Bootstrap Table Chinese translation\n\t * Author: Zhixin Wen<wenzhixin2010@gmail.com>\n\t */\n\n\t$.fn.bootstrapTable.locales['zh-TW'] = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return '正在努力地載入資料，請稍候';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\\u6BCF\\u9801\\u986F\\u793A \".concat(pageNumber, \" \\u9805\\u8A18\\u9304\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"\\u986F\\u793A\\u7B2C \".concat(pageFrom, \" \\u5230\\u7B2C \").concat(pageTo, \" \\u9805\\u8A18\\u9304\\uFF0C\\u7E3D\\u5171 \").concat(totalRows, \" \\u9805\\u8A18\\u9304\\uFF08\\u5F9E \").concat(totalNotFiltered, \" \\u7E3D\\u8A18\\u9304\\u4E2D\\u904E\\u6FFE\\uFF09\");\n\t    }\n\n\t    return \"\\u986F\\u793A\\u7B2C \".concat(pageFrom, \" \\u5230\\u7B2C \").concat(pageTo, \" \\u9805\\u8A18\\u9304\\uFF0C\\u7E3D\\u5171 \").concat(totalRows, \" \\u9805\\u8A18\\u9304\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return '上一頁';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"\\u7B2C\".concat(page, \"\\u9801\");\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return '下一頁';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"\\u7E3D\\u5171 \".concat(totalRows, \" \\u9805\\u8A18\\u9304\");\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return '清空過濾';\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return '搜尋';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return '沒有找到符合的結果';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return '隱藏/顯示分頁';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return '顯示分頁';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return '隱藏分頁';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return '重新整理';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return '切換';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return '顯示卡片視圖';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return '隱藏卡片視圖';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return '列';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return '切換所有';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return '全屏';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return '所有';\n\t  },\n\t  formatAutoRefresh: function formatAutoRefresh() {\n\t    return '自動刷新';\n\t  },\n\t  formatExport: function formatExport() {\n\t    return '導出數據';\n\t  },\n\t  formatJumpTo: function formatJumpTo() {\n\t    return '跳轉';\n\t  },\n\t  formatAdvancedSearch: function formatAdvancedSearch() {\n\t    return '高級搜尋';\n\t  },\n\t  formatAdvancedCloseButton: function formatAdvancedCloseButton() {\n\t    return '關閉';\n\t  }\n\t};\n\t$.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['zh-TW']);\n\n}));\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bootstrap-table/bootstrap-table-locale-all.min.js",
    "content": "/**\n  * bootstrap-table - An extended table to integration with some of the most widely used CSS frameworks. (Supports Bootstrap, Semantic UI, Bulma, Material Design, Foundation)\n  *\n  * @version v1.15.4\n  * @homepage https://bootstrap-table.com\n  * @author wenzhixin <wenzhixin2010@gmail.com> (http://wenzhixin.net.cn/)\n  * @license MIT\n  */\n\n(function(a,o){\"object\"==typeof exports&&\"undefined\"!=typeof module?o(require(\"jquery\")):\"function\"==typeof define&&define.amd?define([\"jquery\"],o):(a=a||self,o(a.jQuery))})(this,function(a){'use strict';var t=Math.min;function o(a,o){return o={exports:{}},a(o,o.exports),o.exports}a=a&&a.hasOwnProperty(\"default\")?a[\"default\"]:a;var e,r,n,c=\"undefined\"==typeof globalThis?\"undefined\"==typeof window?\"undefined\"==typeof global?\"undefined\"==typeof self?{}:self:global:window:globalThis,i=\"object\",l=function(a){return a&&a.Math==Math&&a},s=l(typeof globalThis==i&&globalThis)||l(typeof window==i&&window)||l(typeof self==i&&self)||l(typeof c==i&&c)||Function(\"return this\")(),m=function(a){try{return!!a()}catch(a){return!0}},g=!m(function(){return 7!=Object.defineProperty({},\"a\",{get:function(){return 7}}).a}),d={}.propertyIsEnumerable,h=Object.getOwnPropertyDescriptor,p=h&&!d.call({1:2},1),u=p?function(a){var o=h(this,a);return!!o&&o.enumerable}:d,f={f:u},S=function(a,o){return{enumerable:!(1&a),configurable:!(2&a),writable:!(4&a),value:o}},w={}.toString,T=function(a){return w.call(a).slice(8,-1)},P=\"\".split,R=m(function(){return!Object(\"z\").propertyIsEnumerable(0)})?function(a){return\"String\"==T(a)?P.call(a,\"\"):Object(a)}:Object,A=function(a){if(a==null)throw TypeError(\"Can't call method on \"+a);return a},x=function(a){return R(A(a))},v=function(a){return\"object\"==typeof a?null!==a:\"function\"==typeof a},b=function(a,o){if(!v(a))return a;var t,e;if(o&&\"function\"==typeof(t=a.toString)&&!v(e=t.call(a)))return e;if(\"function\"==typeof(t=a.valueOf)&&!v(e=t.call(a)))return e;if(!o&&\"function\"==typeof(t=a.toString)&&!v(e=t.call(a)))return e;throw TypeError(\"Can't convert object to primitive value\")},C={}.hasOwnProperty,k=function(a,o){return C.call(a,o)},E=s.document,N=v(E)&&v(E.createElement),M=function(a){return N?E.createElement(a):{}},D=!g&&!m(function(){return 7!=Object.defineProperty(M(\"div\"),\"a\",{get:function(){return 7}}).a}),H=Object.getOwnPropertyDescriptor,F=g?H:function(a,o){if(a=x(a),o=b(o,!0),D)try{return H(a,o)}catch(a){}return k(a,o)?S(!f.f.call(a,o),a[o]):void 0},y={f:F},L=function(a){if(!v(a))throw TypeError(a+\" is not an object\");return a},B=Object.defineProperty,z=g?B:function(a,o,t){if(L(a),o=b(o,!0),L(t),D)try{return B(a,o,t)}catch(a){}if(\"get\"in t||\"set\"in t)throw TypeError(\"Accessors not supported\");return\"value\"in t&&(a[o]=t.value),a},U={f:z},G=g?function(a,o,t){return U.f(a,o,S(1,t))}:function(a,o,t){return a[o]=t,a},J=function(a,o){try{G(s,a,o)}catch(t){s[a]=o}return o},j=o(function(a){var o=s[\"__core-js_shared__\"]||J(\"__core-js_shared__\",{});(a.exports=function(a,t){return o[a]||(o[a]=t===void 0?{}:t)})(\"versions\",[]).push({version:\"3.1.3\",mode:\"global\",copyright:\"\\xA9 2019 Denis Pushkarev (zloirock.ru)\"})}),V=j(\"native-function-to-string\",Function.toString),I=s.WeakMap,Z=\"function\"==typeof I&&/native code/.test(V.call(I)),K=0,O=Math.random(),q=function(a){return\"Symbol(\"+((a===void 0?\"\":a)+\"\")+\")_\"+(++K+O).toString(36)},_=j(\"keys\"),W=function(a){return _[a]||(_[a]=q(a))},Y={},X=s.WeakMap,Q=function(a){return n(a)?r(a):e(a,{})};if(Z){var aa=new X,oa=aa.get,ta=aa.has,ea=aa.set;e=function(a,o){return ea.call(aa,a,o),o},r=function(a){return oa.call(aa,a)||{}},n=function(a){return ta.call(aa,a)}}else{var ra=W(\"state\");Y[ra]=!0,e=function(a,o){return G(a,ra,o),o},r=function(a){return k(a,ra)?a[ra]:{}},n=function(a){return k(a,ra)}}var na={set:e,get:r,has:n,enforce:Q,getterFor:function(a){return function(o){var t;if(!v(o)||(t=r(o)).type!==a)throw TypeError(\"Incompatible receiver, \"+a+\" required\");return t}}},ca=o(function(a){var o=na.get,t=na.enforce,e=(V+\"\").split(\"toString\");j(\"inspectSource\",function(a){return V.call(a)}),(a.exports=function(a,o,r,n){var c=!!n&&!!n.unsafe,i=!!n&&!!n.enumerable,f=!!n&&!!n.noTargetGet;return(\"function\"==typeof r&&(\"string\"==typeof o&&!k(r,\"name\")&&G(r,\"name\",o),t(r).source=e.join(\"string\"==typeof o?o:\"\")),a===s)?void(i?a[o]=r:J(o,r)):void(c?!f&&a[o]&&(i=!0):delete a[o],i?a[o]=r:G(a,o,r))})(Function.prototype,\"toString\",function(){return\"function\"==typeof this&&o(this).source||V.call(this)})}),ia=s,fa=function(a){return\"function\"==typeof a?a:void 0},la=Math.ceil,sa=Math.floor,ma=function(a){return isNaN(a=+a)?0:(0<a?sa:la)(a)},ga=function(a){return 0<a?t(ma(a),9007199254740991):0},da=Math.max,ha=function(a,o){var e=ma(a);return 0>e?da(e+o,0):t(e,o)},pa=function(a){return function(o,t,e){var r,n=x(o),c=ga(n.length),i=ha(e,c);if(a&&t!=t){for(;c>i;)if(r=n[i++],r!=r)return!0;}else for(;c>i;i++)if((a||i in n)&&n[i]===t)return a||i||0;return!a&&-1}},ua={includes:pa(!0),indexOf:pa(!1)},Sa=ua.indexOf,wa=function(a,o){var t,e=x(a),r=0,n=[];for(t in e)!k(Y,t)&&k(e,t)&&n.push(t);for(;o.length>r;)k(e,t=o[r++])&&(~Sa(n,t)||n.push(t));return n},Ta=[\"constructor\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"toLocaleString\",\"toString\",\"valueOf\"].concat(\"length\",\"prototype\"),Pa=Object.getOwnPropertyNames||function(a){return wa(a,Ta)},Ra={f:Pa},Aa=Object.getOwnPropertySymbols,xa={f:Aa},va=function(a,o){return 2>arguments.length?fa(ia[a])||fa(s[a]):ia[a]&&ia[a][o]||s[a]&&s[a][o]}(\"Reflect\",\"ownKeys\")||function(a){var o=Ra.f(L(a)),t=xa.f;return t?o.concat(t(a)):o},ba=function(a,o){for(var t,e=va(o),r=U.f,n=y.f,c=0;c<e.length;c++)t=e[c],k(a,t)||r(a,t,n(o,t))},Ca=/#|\\.prototype\\./,Oa=function(a,o){var t=Ea[ka(a)];return!(t!=Ma)||t!=Na&&(\"function\"==typeof o?m(o):!!o)},ka=Oa.normalize=function(a){return(a+\"\").replace(Ca,\".\").toLowerCase()},Ea=Oa.data={},Na=Oa.NATIVE=\"N\",Ma=Oa.POLYFILL=\"P\",Da=y.f,Ha=Array.isArray||function(a){return\"Array\"==T(a)},Fa=function(a){return Object(A(a))},ya=function(a,o,t){var e=b(o);e in a?U.f(a,e,S(0,t)):a[e]=t},La=!!Object.getOwnPropertySymbols&&!m(function(){return!(Symbol()+\"\")}),Ba=s.Symbol,za=j(\"wks\"),Ua=function(a){return za[a]||(za[a]=La&&Ba[a]||(La?Ba:q)(\"Symbol.\"+a))},Ga=Ua(\"species\"),Ja=function(a,o){var t;return Ha(a)&&(t=a.constructor,\"function\"==typeof t&&(t===Array||Ha(t.prototype))?t=void 0:v(t)&&(t=t[Ga],null===t&&(t=void 0))),new(void 0===t?Array:t)(0===o?0:o)},ja=Ua(\"species\"),Va=Ua(\"isConcatSpreadable\"),Ia=9007199254740991,Za=\"Maximum allowed index exceeded\",Ka=!m(function(){var a=[];return a[Va]=!1,a.concat()[0]!==a}),qa=function(a){return!m(function(){var o=[],t=o.constructor={};return t[ja]=function(){return{foo:1}},1!==o[a](Boolean).foo})}(\"concat\"),_a=function(a){if(!v(a))return!1;var o=a[Va];return o===void 0?Ha(a):!!o};(function(a,o){var t,e,r,n,c,i,f=a.target,l=a.global,m=a.stat;if(e=l?s:m?s[f]||J(f,{}):(s[f]||{}).prototype,e)for(r in o){if(c=o[r],a.noTargetGet?(i=Da(e,r),n=i&&i.value):n=e[r],t=Oa(l?r:f+(m?\".\":\"#\")+r,a.forced),!t&&void 0!==n){if(typeof c==typeof n)continue;ba(c,n)}(a.sham||n&&n.sham)&&G(c,\"sham\",!0),ca(e,r,c,a)}})({target:\"Array\",proto:!0,forced:!Ka||!qa},{concat:function(){var a,o,t,e,r,c=Fa(this),f=Ja(c,0),l=0;for(a=-1,t=arguments.length;a<t;a++)if(r=-1===a?c:arguments[a],_a(r)){if(e=ga(r.length),l+e>Ia)throw TypeError(Za);for(o=0;o<e;o++,l++)o in r&&ya(f,l,r[o])}else{if(l>=Ia)throw TypeError(Za);ya(f,l++,r)}return f.length=l,f}}),a.fn.bootstrapTable.locales[\"af-ZA\"]={formatLoadingMessage:function(){return\"Besig om te laai, wag asseblief\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" rekords per bladsy\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"Resultate \".concat(a,\" tot \").concat(o,\" van \").concat(t,\" rye (filtered from \").concat(e,\" total rows)\"):\"Resultate \".concat(a,\" tot \").concat(o,\" van \").concat(t,\" rye\")},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Showing \".concat(a,\" rows\")},formatClearSearch:function(){return\"Clear Search\"},formatSearch:function(){return\"Soek\"},formatNoMatches:function(){return\"Geen rekords gevind nie\"},formatPaginationSwitch:function(){return\"Wys/verberg bladsy nummering\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"Herlaai\"},formatToggle:function(){return\"Wissel\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"Kolomme\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"All\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Export data\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"af-ZA\"]),a.fn.bootstrapTable.locales[\"ar-SA\"]={formatLoadingMessage:function(){return\"\\u062C\\u0627\\u0631\\u064A \\u0627\\u0644\\u062A\\u062D\\u0645\\u064A\\u0644, \\u064A\\u0631\\u062C\\u0649 \\u0627\\u0644\\u0625\\u0646\\u062A\\u0638\\u0627\\u0631\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" \\u0633\\u062C\\u0644 \\u0644\\u0643\\u0644 \\u0635\\u0641\\u062D\\u0629\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"\\u0627\\u0644\\u0638\\u0627\\u0647\\u0631 \".concat(a,\" \\u0625\\u0644\\u0649 \").concat(o,\" \\u0645\\u0646 \").concat(t,\" \\u0633\\u062C\\u0644 \").concat(e,\" total rows)\"):\"\\u0627\\u0644\\u0638\\u0627\\u0647\\u0631 \".concat(a,\" \\u0625\\u0644\\u0649 \").concat(o,\" \\u0645\\u0646 \").concat(t,\" \\u0633\\u062C\\u0644\")},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Showing \".concat(a,\" rows\")},formatClearSearch:function(){return\"Clear Search\"},formatSearch:function(){return\"\\u0628\\u062D\\u062B\"},formatNoMatches:function(){return\"\\u0644\\u0627 \\u062A\\u0648\\u062C\\u062F \\u0646\\u062A\\u0627\\u0626\\u062C \\u0645\\u0637\\u0627\\u0628\\u0642\\u0629 \\u0644\\u0644\\u0628\\u062D\\u062B\"},formatPaginationSwitch:function(){return\"\\u0625\\u062E\\u0641\\u0627\\u0621\\u0625\\u0638\\u0647\\u0627\\u0631 \\u062A\\u0631\\u0642\\u064A\\u0645 \\u0627\\u0644\\u0635\\u0641\\u062D\\u0627\\u062A\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"\\u062A\\u062D\\u062F\\u064A\\u062B\"},formatToggle:function(){return\"\\u062A\\u063A\\u064A\\u064A\\u0631\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"\\u0623\\u0639\\u0645\\u062F\\u0629\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"All\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Export data\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"ar-SA\"]),a.fn.bootstrapTable.locales[\"ca-ES\"]={formatLoadingMessage:function(){return\"Espereu, si us plau\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" resultats per p\\xE0gina\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"Mostrant de \".concat(a,\" fins \").concat(o,\" - total \").concat(t,\" resultats (filtered from \").concat(e,\" total rows)\"):\"Mostrant de \".concat(a,\" fins \").concat(o,\" - total \").concat(t,\" resultats\")},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Showing \".concat(a,\" rows\")},formatClearSearch:function(){return\"Clear Search\"},formatSearch:function(){return\"Cerca\"},formatNoMatches:function(){return\"No s'han trobat resultats\"},formatPaginationSwitch:function(){return\"Amaga/Mostra paginaci\\xF3\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"Refresca\"},formatToggle:function(){return\"Alterna formataci\\xF3\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"Columnes\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"Tots\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Export data\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"ca-ES\"]),a.fn.bootstrapTable.locales[\"cs-CZ\"]={formatLoadingMessage:function(){return\"\\u010Cekejte, pros\\xEDm\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" polo\\u017Eek na str\\xE1nku\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"Zobrazena \".concat(a,\". - \").concat(o,\" . polo\\u017Eka z celkov\\xFDch \").concat(t,\" (filtered from \").concat(e,\" total rows)\"):\"Zobrazena \".concat(a,\". - \").concat(o,\" . polo\\u017Eka z celkov\\xFDch \").concat(t)},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Showing \".concat(a,\" rows\")},formatClearSearch:function(){return\"Clear Search\"},formatSearch:function(){return\"Vyhled\\xE1v\\xE1n\\xED\"},formatNoMatches:function(){return\"Nenalezena \\u017E\\xE1dn\\xE1 vyhovuj\\xEDc\\xED polo\\u017Eka\"},formatPaginationSwitch:function(){return\"Skr\\xFDt/Zobrazit str\\xE1nkov\\xE1n\\xED\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"Aktualizovat\"},formatToggle:function(){return\"P\\u0159epni\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"Sloupce\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"V\\u0161e\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Export data\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"cs-CZ\"]),a.fn.bootstrapTable.locales[\"da-DK\"]={formatLoadingMessage:function(){return\"Indl\\xE6ser, vent venligst\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" poster pr side\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"Viser \".concat(a,\" til \").concat(o,\" af \").concat(t,\" r\\xE6kke\").concat(1<t?\"r\":\"\",\" (filtered from \").concat(e,\" total rows)\"):\"Viser \".concat(a,\" til \").concat(o,\" af \").concat(t,\" r\\xE6kke\").concat(1<t?\"r\":\"\")},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Viser \".concat(a,\" r\\xE6kke\").concat(1<a?\"r\":\"\")},formatClearSearch:function(){return\"Ryd filtre\"},formatSearch:function(){return\"S\\xF8g\"},formatNoMatches:function(){return\"Ingen poster fundet\"},formatPaginationSwitch:function(){return\"Skjul/vis nummerering\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"Opdater\"},formatToggle:function(){return\"Skift\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"Kolonner\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"Alle\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Eksporter\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"da-DK\"]),a.fn.bootstrapTable.locales[\"de-DE\"]={formatLoadingMessage:function(){return\"Lade, bitte warten\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" Zeilen pro Seite.\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"Zeige Zeile \".concat(a,\" bis \").concat(o,\" von \").concat(t,\" Zeile\").concat(1<t?\"n\":\"\",\" (Gefiltert von \").concat(e,\" Zeile\").concat(1<e?\"n\":\"\",\")\"):\"Zeige Zeile \".concat(a,\" bis \").concat(o,\" von \").concat(t,\" Zeile\").concat(1<t?\"n\":\"\",\".\")},formatSRPaginationPreText:function(){return\"Vorherige Seite\"},formatSRPaginationPageText:function(a){return\"Zu Seite \".concat(a)},formatSRPaginationNextText:function(){return\"N\\xE4chste Seite\"},formatDetailPagination:function(a){return\"Zeige \".concat(a,\" Zeile\").concat(1<a?\"n\":\"\",\".\")},formatClearSearch:function(){return\"L\\xF6sche Filter\"},formatSearch:function(){return\"Suchen\"},formatNoMatches:function(){return\"Keine passenden Ergebnisse gefunden\"},formatPaginationSwitch:function(){return\"Verstecke/Zeige Nummerierung\"},formatPaginationSwitchDown:function(){return\"Zeige Nummerierung\"},formatPaginationSwitchUp:function(){return\"Verstecke Nummerierung\"},formatRefresh:function(){return\"Neu laden\"},formatToggle:function(){return\"Umschalten\"},formatToggleOn:function(){return\"Normale Ansicht\"},formatToggleOff:function(){return\"Kartenansicht\"},formatColumns:function(){return\"Spalten\"},formatColumnsToggleAll:function(){return\"Alle umschalten\"},formatFullscreen:function(){return\"Vollbild\"},formatAllRows:function(){return\"Alle\"},formatAutoRefresh:function(){return\"Automatisches Neuladen\"},formatExport:function(){return\"Datenexport\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Erweiterte Suche\"},formatAdvancedCloseButton:function(){return\"Schlie\\xDFen\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"de-DE\"]),a.fn.bootstrapTable.locales[\"el-GR\"]={formatLoadingMessage:function(){return\"\\u03A6\\u03BF\\u03C1\\u03C4\\u03CE\\u03BD\\u03B5\\u03B9, \\u03C0\\u03B1\\u03C1\\u03B1\\u03BA\\u03B1\\u03BB\\u03CE \\u03C0\\u03B5\\u03C1\\u03B9\\u03BC\\u03AD\\u03BD\\u03B5\\u03C4\\u03B5\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" \\u03B1\\u03C0\\u03BF\\u03C4\\u03B5\\u03BB\\u03AD\\u03C3\\u03BC\\u03B1\\u03C4\\u03B1 \\u03B1\\u03BD\\u03AC \\u03C3\\u03B5\\u03BB\\u03AF\\u03B4\\u03B1\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"\\u0395\\u03BC\\u03C6\\u03B1\\u03BD\\u03AF\\u03B6\\u03BF\\u03BD\\u03C4\\u03B1\\u03B9 \\u03B1\\u03C0\\u03CC \\u03C4\\u03B7\\u03BD \".concat(a,\" \\u03C9\\u03C2 \\u03C4\\u03B7\\u03BD \").concat(o,\" \\u03B1\\u03C0\\u03CC \\u03C3\\u03CD\\u03BD\\u03BF\\u03BB\\u03BF \").concat(t,\" \\u03C3\\u03B5\\u03B9\\u03C1\\u03CE\\u03BD (filtered from \").concat(e,\" total rows)\"):\"\\u0395\\u03BC\\u03C6\\u03B1\\u03BD\\u03AF\\u03B6\\u03BF\\u03BD\\u03C4\\u03B1\\u03B9 \\u03B1\\u03C0\\u03CC \\u03C4\\u03B7\\u03BD \".concat(a,\" \\u03C9\\u03C2 \\u03C4\\u03B7\\u03BD \").concat(o,\" \\u03B1\\u03C0\\u03CC \\u03C3\\u03CD\\u03BD\\u03BF\\u03BB\\u03BF \").concat(t,\" \\u03C3\\u03B5\\u03B9\\u03C1\\u03CE\\u03BD\")},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Showing \".concat(a,\" rows\")},formatClearSearch:function(){return\"Clear Search\"},formatSearch:function(){return\"\\u0391\\u03BD\\u03B1\\u03B6\\u03B7\\u03C4\\u03AE\\u03C3\\u03C4\\u03B5\"},formatNoMatches:function(){return\"\\u0394\\u03B5\\u03BD \\u03B2\\u03C1\\u03AD\\u03B8\\u03B7\\u03BA\\u03B1\\u03BD \\u03B1\\u03C0\\u03BF\\u03C4\\u03B5\\u03BB\\u03AD\\u03C3\\u03BC\\u03B1\\u03C4\\u03B1\"},formatPaginationSwitch:function(){return\"Hide/Show pagination\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"Refresh\"},formatToggle:function(){return\"Toggle\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"Columns\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"All\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Export data\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"el-GR\"]),a.fn.bootstrapTable.locales[\"en-US\"]={formatLoadingMessage:function(){return\"Loading, please wait\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" rows per page\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"Showing \".concat(a,\" to \").concat(o,\" of \").concat(t,\" rows (filtered from \").concat(e,\" total rows)\"):\"Showing \".concat(a,\" to \").concat(o,\" of \").concat(t,\" rows\")},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Showing \".concat(a,\" rows\")},formatClearSearch:function(){return\"Clear Search\"},formatSearch:function(){return\"Search\"},formatNoMatches:function(){return\"No matching records found\"},formatPaginationSwitch:function(){return\"Hide/Show pagination\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"Refresh\"},formatToggle:function(){return\"Toggle\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"Columns\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"All\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Export data\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"en-US\"]),a.fn.bootstrapTable.locales[\"es-AR\"]={formatLoadingMessage:function(){return\"Cargando, espere por favor\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" registros por p\\xE1gina\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"Mostrando \".concat(a,\" a \").concat(o,\" de \").concat(t,\" filas (filtered from \").concat(e,\" total rows)\"):\"Mostrando \".concat(a,\" a \").concat(o,\" de \").concat(t,\" filas\")},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Showing \".concat(a,\" rows\")},formatClearSearch:function(){return\"Limpiar b\\xFAsqueda\"},formatSearch:function(){return\"Buscar\"},formatNoMatches:function(){return\"No se encontraron registros\"},formatPaginationSwitch:function(){return\"Hide/Show pagination\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"Refresh\"},formatToggle:function(){return\"Toggle\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"Columns\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"Todo\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Export data\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"es-AR\"]),a.fn.bootstrapTable.locales[\"es-CL\"]={formatLoadingMessage:function(){return\"Cargando, espere por favor\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" filas por p\\xE1gina\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"Mostrando \".concat(a,\" a \").concat(o,\" de \").concat(t,\" filas (filtered from \").concat(e,\" total rows)\"):\"Mostrando \".concat(a,\" a \").concat(o,\" de \").concat(t,\" filas\")},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Showing \".concat(a,\" rows\")},formatClearSearch:function(){return\"Limpiar b\\xFAsqueda\"},formatSearch:function(){return\"Buscar\"},formatNoMatches:function(){return\"No se encontraron registros\"},formatPaginationSwitch:function(){return\"Ocultar/Mostrar paginaci\\xF3n\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"Refrescar\"},formatToggle:function(){return\"Cambiar\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"Columnas\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"Todo\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Export data\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"es-CL\"]),a.fn.bootstrapTable.locales[\"es-CR\"]={formatLoadingMessage:function(){return\"Cargando, por favor espere\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" registros por p\\xE1gina\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"Mostrando de \".concat(a,\" a \").concat(o,\" registros de \").concat(t,\" registros en total (filtered from \").concat(e,\" total rows)\"):\"Mostrando de \".concat(a,\" a \").concat(o,\" registros de \").concat(t,\" registros en total\")},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Showing \".concat(a,\" rows\")},formatClearSearch:function(){return\"Limpiar b\\xFAsqueda\"},formatSearch:function(){return\"Buscar\"},formatNoMatches:function(){return\"No se encontraron registros\"},formatPaginationSwitch:function(){return\"Hide/Show pagination\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"Refrescar\"},formatToggle:function(){return\"Alternar\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"Columnas\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"Todo\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Export data\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"es-CR\"]),a.fn.bootstrapTable.locales[\"es-ES\"]={formatLoadingMessage:function(){return\"Por favor espere\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" resultados por p\\xE1gina\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"Mostrando desde \".concat(a,\" hasta \").concat(o,\" - En total \").concat(t,\" resultados (filtered from \").concat(e,\" total rows)\"):\"Mostrando desde \".concat(a,\" hasta \").concat(o,\" - En total \").concat(t,\" resultados\")},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Showing \".concat(a,\" rows\")},formatClearSearch:function(){return\"Limpiar b\\xFAsqueda\"},formatSearch:function(){return\"Buscar\"},formatNoMatches:function(){return\"No se encontraron resultados\"},formatPaginationSwitch:function(){return\"Ocultar/Mostrar paginaci\\xF3n\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"Refrescar\"},formatToggle:function(){return\"Ocultar/Mostrar\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"Columnas\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"Todos\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Exportar los datos\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"B\\xFAsqueda avanzada\"},formatAdvancedCloseButton:function(){return\"Cerrar\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"es-ES\"]),a.fn.bootstrapTable.locales[\"es-MX\"]={formatLoadingMessage:function(){return\"Cargando, espere por favor\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" registros por p\\xE1gina\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"Mostrando \".concat(a,\" a \").concat(o,\" de \").concat(t,\" filas (filtered from \").concat(e,\" total rows)\"):\"Mostrando \".concat(a,\" a \").concat(o,\" de \").concat(t,\" filas\")},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Mostrando \".concat(a,\" filas\")},formatClearSearch:function(){return\"Limpiar b\\xFAsqueda\"},formatSearch:function(){return\"Buscar\"},formatNoMatches:function(){return\"No se encontraron registros que coincidan\"},formatPaginationSwitch:function(){return\"Mostrar/ocultar paginaci\\xF3n\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"Actualizar\"},formatToggle:function(){return\"Cambiar vista\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"Columnas\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Pantalla completa\"},formatAllRows:function(){return\"Todo\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Export data\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"es-MX\"]),a.fn.bootstrapTable.locales[\"es-NI\"]={formatLoadingMessage:function(){return\"Cargando, por favor espere\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" registros por p\\xE1gina\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"Mostrando de \".concat(a,\" a \").concat(o,\" registros de \").concat(t,\" registros en total (filtered from \").concat(e,\" total rows)\"):\"Mostrando de \".concat(a,\" a \").concat(o,\" registros de \").concat(t,\" registros en total\")},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Showing \".concat(a,\" rows\")},formatClearSearch:function(){return\"Limpiar b\\xFAsqueda\"},formatSearch:function(){return\"Buscar\"},formatNoMatches:function(){return\"No se encontraron registros\"},formatPaginationSwitch:function(){return\"Hide/Show pagination\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"Refrescar\"},formatToggle:function(){return\"Alternar\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"Columnas\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"Todo\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Export data\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"es-NI\"]),a.fn.bootstrapTable.locales[\"es-SP\"]={formatLoadingMessage:function(){return\"Cargando, por favor espera\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" registros por p&#225;gina.\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"\".concat(a,\" - \").concat(o,\" de \").concat(t,\" registros (filtered from \").concat(e,\" total rows)\"):\"\".concat(a,\" - \").concat(o,\" de \").concat(t,\" registros.\")},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Showing \".concat(a,\" rows\")},formatClearSearch:function(){return\"Limpiar b\\xFAsqueda\"},formatSearch:function(){return\"Buscar\"},formatNoMatches:function(){return\"No se han encontrado registros.\"},formatPaginationSwitch:function(){return\"Hide/Show pagination\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"Actualizar\"},formatToggle:function(){return\"Alternar\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"Columnas\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"Todo\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Export data\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"es-SP\"]),a.fn.bootstrapTable.locales[\"et-EE\"]={formatLoadingMessage:function(){return\"P\\xE4ring k\\xE4ib, palun oota\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" rida lehe kohta\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"N\\xE4itan tulemusi \".concat(a,\" kuni \").concat(o,\" - kokku \").concat(t,\" tulemust (filtered from \").concat(e,\" total rows)\"):\"N\\xE4itan tulemusi \".concat(a,\" kuni \").concat(o,\" - kokku \").concat(t,\" tulemust\")},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Showing \".concat(a,\" rows\")},formatClearSearch:function(){return\"Clear Search\"},formatSearch:function(){return\"Otsi\"},formatNoMatches:function(){return\"P\\xE4ringu tingimustele ei vastanud \\xFChtegi tulemust\"},formatPaginationSwitch:function(){return\"N\\xE4ita/Peida lehtedeks jagamine\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"V\\xE4rskenda\"},formatToggle:function(){return\"L\\xFClita\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"Veerud\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"K\\xF5ik\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Export data\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"et-EE\"]),a.fn.bootstrapTable.locales[\"eu-EU\"]={formatLoadingMessage:function(){return\"Itxaron mesedez\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" emaitza orriko.\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"\".concat(t,\" erregistroetatik \").concat(a,\"etik \").concat(o,\"erakoak erakusten (filtered from \").concat(e,\" total rows)\"):\"\".concat(t,\" erregistroetatik \").concat(a,\"etik \").concat(o,\"erakoak erakusten.\")},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Showing \".concat(a,\" rows\")},formatClearSearch:function(){return\"Clear Search\"},formatSearch:function(){return\"Bilatu\"},formatNoMatches:function(){return\"Ez da emaitzarik aurkitu\"},formatPaginationSwitch:function(){return\"Ezkutatu/Erakutsi orrikatzea\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"Eguneratu\"},formatToggle:function(){return\"Ezkutatu/Erakutsi\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"Zutabeak\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"Guztiak\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Export data\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"eu-EU\"]),a.fn.bootstrapTable.locales[\"fa-IR\"]={formatLoadingMessage:function(){return\"\\u062F\\u0631 \\u062D\\u0627\\u0644 \\u0628\\u0627\\u0631\\u06AF\\u0630\\u0627\\u0631\\u06CC, \\u0644\\u0637\\u0641\\u0627 \\u0635\\u0628\\u0631 \\u06A9\\u0646\\u06CC\\u062F\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" \\u0631\\u06A9\\u0648\\u0631\\u062F \\u062F\\u0631 \\u0635\\u0641\\u062D\\u0647\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"\\u0646\\u0645\\u0627\\u06CC\\u0634 \".concat(a,\" \\u062A\\u0627 \").concat(o,\" \\u0627\\u0632 \").concat(t,\" \\u0631\\u062F\\u06CC\\u0641 (filtered from \").concat(e,\" total rows)\"):\"\\u0646\\u0645\\u0627\\u06CC\\u0634 \".concat(a,\" \\u062A\\u0627 \").concat(o,\" \\u0627\\u0632 \").concat(t,\" \\u0631\\u062F\\u06CC\\u0641\")},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Showing \".concat(a,\" rows\")},formatClearSearch:function(){return\"Clear Search\"},formatSearch:function(){return\"\\u062C\\u0633\\u062A\\u062C\\u0648\"},formatNoMatches:function(){return\"\\u0631\\u06A9\\u0648\\u0631\\u062F\\u06CC \\u06CC\\u0627\\u0641\\u062A \\u0646\\u0634\\u062F.\"},formatPaginationSwitch:function(){return\"\\u0646\\u0645\\u0627\\u06CC\\u0634/\\u0645\\u062E\\u0641\\u06CC \\u0635\\u0641\\u062D\\u0647 \\u0628\\u0646\\u062F\\u06CC\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"\\u0628\\u0647 \\u0631\\u0648\\u0632 \\u0631\\u0633\\u0627\\u0646\\u06CC\"},formatToggle:function(){return\"\\u062A\\u063A\\u06CC\\u06CC\\u0631 \\u0646\\u0645\\u0627\\u06CC\\u0634\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"\\u0633\\u0637\\u0631 \\u0647\\u0627\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"\\u0647\\u0645\\u0647\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Export data\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"fa-IR\"]),a.fn.bootstrapTable.locales[\"fi-FI\"]={formatLoadingMessage:function(){return\"Ladataan, ole hyv\\xE4 ja odota\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" rivi\\xE4 sivulla\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"N\\xE4ytet\\xE4\\xE4n rivit \".concat(a,\" - \").concat(o,\" / \").concat(t,\" (filtered from \").concat(e,\" total rows)\"):\"N\\xE4ytet\\xE4\\xE4n rivit \".concat(a,\" - \").concat(o,\" / \").concat(t)},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Showing \".concat(a,\" rows\")},formatClearSearch:function(){return\"Poista suodattimet\"},formatSearch:function(){return\"Hae\"},formatNoMatches:function(){return\"Hakuehtoja vastaavia tuloksia ei l\\xF6ytynyt\"},formatPaginationSwitch:function(){return\"N\\xE4yt\\xE4/Piilota sivutus\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"P\\xE4ivit\\xE4\"},formatToggle:function(){return\"Valitse\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"Sarakkeet\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"Kaikki\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Vie tiedot\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"fi-FI\"]),a.fn.bootstrapTable.locales[\"fr-BE\"]={formatLoadingMessage:function(){return\"Chargement en cours\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" lignes par page\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"Affiche de \".concat(a,\" \\xE0 \").concat(o,\" sur \").concat(t,\" lignes (filtr\\xE9s \\xE0 partir de \").concat(e,\" lignes)\"):\"Affiche de \".concat(a,\" \\xE0 \").concat(o,\" sur \").concat(t,\" lignes\")},formatSRPaginationPreText:function(){return\"page pr\\xE9c\\xE9dente\"},formatSRPaginationPageText:function(a){return\"vers la page \".concat(a)},formatSRPaginationNextText:function(){return\"page suivante\"},formatDetailPagination:function(a){return\"Affiche \".concat(a,\" lignes\")},formatClearSearch:function(){return\"Effacer la recherche\"},formatSearch:function(){return\"Recherche\"},formatNoMatches:function(){return\"Pas de lignes trouv\\xE9s\"},formatPaginationSwitch:function(){return\"Cacher/Afficher pagination\"},formatPaginationSwitchDown:function(){return\"Afficher pagination\"},formatPaginationSwitchUp:function(){return\"Cacher pagination\"},formatRefresh:function(){return\"Rafraichir\"},formatToggle:function(){return\"Basculer\"},formatToggleOn:function(){return\"Afficher vue carte\"},formatToggleOff:function(){return\"Cacher vue carte\"},formatColumns:function(){return\"Colonnes\"},formatColumnsToggleAll:function(){return\"Tout basculer\"},formatFullscreen:function(){return\"Plein \\xE9cran\"},formatAllRows:function(){return\"Tout\"},formatAutoRefresh:function(){return\"Rafra\\xEEchissement automatique\"},formatExport:function(){return\"Exporter les donn\\xE9es\"},formatJumpTo:function(){return\"Aller \\xE0\"},formatAdvancedSearch:function(){return\"Recherche avanc\\xE9e\"},formatAdvancedCloseButton:function(){return\"Fermer\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"fr-BE\"]),a.fn.bootstrapTable.locales[\"fr-CH\"]={formatLoadingMessage:function(){return\"Chargement en cours\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" lignes par page\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"Affiche de \".concat(a,\" \\xE0 \").concat(o,\" sur \").concat(t,\" lignes (filtr\\xE9s \\xE0 partir de \").concat(e,\" lignes)\"):\"Affiche de \".concat(a,\" \\xE0 \").concat(o,\" sur \").concat(t,\" lignes\")},formatSRPaginationPreText:function(){return\"page pr\\xE9c\\xE9dente\"},formatSRPaginationPageText:function(a){return\"vers la page \".concat(a)},formatSRPaginationNextText:function(){return\"page suivante\"},formatDetailPagination:function(a){return\"Affiche \".concat(a,\" lignes\")},formatClearSearch:function(){return\"Effacer la recherche\"},formatSearch:function(){return\"Recherche\"},formatNoMatches:function(){return\"Pas de lignes trouv\\xE9s\"},formatPaginationSwitch:function(){return\"Cacher/Afficher pagination\"},formatPaginationSwitchDown:function(){return\"Afficher pagination\"},formatPaginationSwitchUp:function(){return\"Cacher pagination\"},formatRefresh:function(){return\"Rafraichir\"},formatToggle:function(){return\"Basculer\"},formatToggleOn:function(){return\"Afficher vue carte\"},formatToggleOff:function(){return\"Cacher vue carte\"},formatColumns:function(){return\"Colonnes\"},formatColumnsToggleAll:function(){return\"Tout basculer\"},formatFullscreen:function(){return\"Plein \\xE9cran\"},formatAllRows:function(){return\"Tout\"},formatAutoRefresh:function(){return\"Rafra\\xEEchissement automatique\"},formatExport:function(){return\"Exporter les donn\\xE9es\"},formatJumpTo:function(){return\"Aller \\xE0\"},formatAdvancedSearch:function(){return\"Recherche avanc\\xE9e\"},formatAdvancedCloseButton:function(){return\"Fermer\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"fr-CH\"]),a.fn.bootstrapTable.locales[\"fr-FR\"]={formatLoadingMessage:function(){return\"Chargement en cours\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" lignes par page\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"Affiche de \".concat(a,\" \\xE0 \").concat(o,\" sur \").concat(t,\" lignes (filtr\\xE9s \\xE0 partir de \").concat(e,\" lignes)\"):\"Affiche de \".concat(a,\" \\xE0 \").concat(o,\" sur \").concat(t,\" lignes\")},formatSRPaginationPreText:function(){return\"page pr\\xE9c\\xE9dente\"},formatSRPaginationPageText:function(a){return\"vers la page \".concat(a)},formatSRPaginationNextText:function(){return\"page suivante\"},formatDetailPagination:function(a){return\"Affiche \".concat(a,\" lignes\")},formatClearSearch:function(){return\"Effacer la recherche\"},formatSearch:function(){return\"Recherche\"},formatNoMatches:function(){return\"Pas de lignes trouv\\xE9s\"},formatPaginationSwitch:function(){return\"Cacher/Afficher pagination\"},formatPaginationSwitchDown:function(){return\"Afficher pagination\"},formatPaginationSwitchUp:function(){return\"Cacher pagination\"},formatRefresh:function(){return\"Rafraichir\"},formatToggle:function(){return\"Basculer\"},formatToggleOn:function(){return\"Afficher vue carte\"},formatToggleOff:function(){return\"Cacher vue carte\"},formatColumns:function(){return\"Colonnes\"},formatColumnsToggleAll:function(){return\"Tout basculer\"},formatFullscreen:function(){return\"Plein \\xE9cran\"},formatAllRows:function(){return\"Tout\"},formatAutoRefresh:function(){return\"Rafra\\xEEchissement automatique\"},formatExport:function(){return\"Exporter les donn\\xE9es\"},formatJumpTo:function(){return\"Aller \\xE0\"},formatAdvancedSearch:function(){return\"Recherche avanc\\xE9e\"},formatAdvancedCloseButton:function(){return\"Fermer\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"fr-FR\"]),a.fn.bootstrapTable.locales[\"fr-LU\"]={formatLoadingMessage:function(){return\"Chargement en cours\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" lignes par page\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"Affiche de \".concat(a,\" \\xE0 \").concat(o,\" sur \").concat(t,\" lignes (filtr\\xE9s \\xE0 partir de \").concat(e,\" lignes)\"):\"Affiche de \".concat(a,\" \\xE0 \").concat(o,\" sur \").concat(t,\" lignes\")},formatSRPaginationPreText:function(){return\"page pr\\xE9c\\xE9dente\"},formatSRPaginationPageText:function(a){return\"vers la page \".concat(a)},formatSRPaginationNextText:function(){return\"page suivante\"},formatDetailPagination:function(a){return\"Affiche \".concat(a,\" lignes\")},formatClearSearch:function(){return\"Effacer la recherche\"},formatSearch:function(){return\"Recherche\"},formatNoMatches:function(){return\"Pas de lignes trouv\\xE9s\"},formatPaginationSwitch:function(){return\"Cacher/Afficher pagination\"},formatPaginationSwitchDown:function(){return\"Afficher pagination\"},formatPaginationSwitchUp:function(){return\"Cacher pagination\"},formatRefresh:function(){return\"Rafraichir\"},formatToggle:function(){return\"Basculer\"},formatToggleOn:function(){return\"Afficher vue carte\"},formatToggleOff:function(){return\"Cacher vue carte\"},formatColumns:function(){return\"Colonnes\"},formatColumnsToggleAll:function(){return\"Tout basculer\"},formatFullscreen:function(){return\"Plein \\xE9cran\"},formatAllRows:function(){return\"Tout\"},formatAutoRefresh:function(){return\"Rafra\\xEEchissement automatique\"},formatExport:function(){return\"Exporter les donn\\xE9es\"},formatJumpTo:function(){return\"Aller \\xE0\"},formatAdvancedSearch:function(){return\"Recherche avanc\\xE9e\"},formatAdvancedCloseButton:function(){return\"Fermer\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"fr-LU\"]),a.fn.bootstrapTable.locales[\"he-IL\"]={formatLoadingMessage:function(){return\"\\u05D8\\u05D5\\u05E2\\u05DF, \\u05E0\\u05D0 \\u05DC\\u05D4\\u05DE\\u05EA\\u05D9\\u05DF\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" \\u05E9\\u05D5\\u05E8\\u05D5\\u05EA \\u05D1\\u05E2\\u05DE\\u05D5\\u05D3\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"\\u05DE\\u05E6\\u05D9\\u05D2 \".concat(a,\" \\u05E2\\u05D3 \").concat(o,\" \\u05DE-\").concat(t,\"\\u05E9\\u05D5\\u05E8\\u05D5\\u05EA\").concat(e,\" total rows)\"):\"\\u05DE\\u05E6\\u05D9\\u05D2 \".concat(a,\" \\u05E2\\u05D3 \").concat(o,\" \\u05DE-\").concat(t,\" \\u05E9\\u05D5\\u05E8\\u05D5\\u05EA\")},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Showing \".concat(a,\" rows\")},formatClearSearch:function(){return\"Clear Search\"},formatSearch:function(){return\"\\u05D7\\u05D9\\u05E4\\u05D5\\u05E9\"},formatNoMatches:function(){return\"\\u05DC\\u05D0 \\u05E0\\u05DE\\u05E6\\u05D0\\u05D5 \\u05E8\\u05E9\\u05D5\\u05DE\\u05D5\\u05EA \\u05EA\\u05D5\\u05D0\\u05DE\\u05D5\\u05EA\"},formatPaginationSwitch:function(){return\"\\u05D4\\u05E1\\u05EA\\u05E8/\\u05D4\\u05E6\\u05D2 \\u05DE\\u05E1\\u05E4\\u05D5\\u05E8 \\u05D3\\u05E4\\u05D9\\u05DD\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"\\u05E8\\u05E2\\u05E0\\u05DF\"},formatToggle:function(){return\"\\u05D4\\u05D7\\u05DC\\u05E3 \\u05EA\\u05E6\\u05D5\\u05D2\\u05D4\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"\\u05E2\\u05DE\\u05D5\\u05D3\\u05D5\\u05EA\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"\\u05D4\\u05DB\\u05DC\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Export data\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"he-IL\"]),a.fn.bootstrapTable.locales[\"hr-HR\"]={formatLoadingMessage:function(){return\"Molimo pri\\u010Dekajte\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" broj zapisa po stranici\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"Prikazujem \".concat(a,\". - \").concat(o,\". od ukupnog broja zapisa \").concat(t,\" (filtered from \").concat(e,\" total rows)\"):\"Prikazujem \".concat(a,\". - \").concat(o,\". od ukupnog broja zapisa \").concat(t)},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Showing \".concat(a,\" rows\")},formatClearSearch:function(){return\"Clear Search\"},formatSearch:function(){return\"Pretra\\u017Ei\"},formatNoMatches:function(){return\"Nije prona\\u0111en niti jedan zapis\"},formatPaginationSwitch:function(){return\"Prika\\u017Ei/sakrij stranice\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"Osvje\\u017Ei\"},formatToggle:function(){return\"Promijeni prikaz\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"Kolone\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"Sve\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Export data\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"hr-HR\"]),a.fn.bootstrapTable.locales[\"hu-HU\"]={formatLoadingMessage:function(){return\"Bet\\xF6lt\\xE9s, k\\xE9rem v\\xE1rjon\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" rekord per oldal\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"Megjelen\\xEDtve \".concat(a,\" - \").concat(o,\" / \").concat(t,\" \\xF6sszesen (filtered from \").concat(e,\" total rows)\"):\"Megjelen\\xEDtve \".concat(a,\" - \").concat(o,\" / \").concat(t,\" \\xF6sszesen\")},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Showing \".concat(a,\" rows\")},formatClearSearch:function(){return\"Clear Search\"},formatSearch:function(){return\"Keres\\xE9s\"},formatNoMatches:function(){return\"Nincs tal\\xE1lat\"},formatPaginationSwitch:function(){return\"Lapoz\\xF3 elrejt\\xE9se/megjelen\\xEDt\\xE9se\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"Friss\\xEDt\\xE9s\"},formatToggle:function(){return\"\\xD6sszecsuk/Kinyit\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"Oszlopok\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"\\xD6sszes\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Export data\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"hu-HU\"]),a.fn.bootstrapTable.locales[\"id-ID\"]={formatLoadingMessage:function(){return\"Memuat, mohon tunggu\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" baris per halaman\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"Menampilkan \".concat(a,\" sampai \").concat(o,\" dari \").concat(t,\" baris (filtered from \").concat(e,\" total rows)\"):\"Menampilkan \".concat(a,\" sampai \").concat(o,\" dari \").concat(t,\" baris\")},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Showing \".concat(a,\" rows\")},formatClearSearch:function(){return\"Bersihkan filter\"},formatSearch:function(){return\"Pencarian\"},formatNoMatches:function(){return\"Tidak ditemukan data yang cocok\"},formatPaginationSwitch:function(){return\"Sembunyikan/Tampilkan halaman\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"Muat ulang\"},formatToggle:function(){return\"Beralih\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"kolom\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"Semua\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Ekspor data\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"id-ID\"]),a.fn.bootstrapTable.locales[\"it-IT\"]={formatLoadingMessage:function(){return\"Caricamento in corso\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" elementi per pagina\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"Visualizzazione da \".concat(a,\" a \").concat(o,\" di \").concat(t,\" elementi (filtered from \").concat(e,\" total rows)\"):\"Visualizzazione da \".concat(a,\" a \").concat(o,\" di \").concat(t,\" elementi\")},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Showing \".concat(a,\" rows\")},formatClearSearch:function(){return\"Pulisci filtri\"},formatSearch:function(){return\"Cerca\"},formatNoMatches:function(){return\"Nessun elemento trovato\"},formatPaginationSwitch:function(){return\"Nascondi/Mostra paginazione\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"Aggiorna\"},formatToggle:function(){return\"Attiva/Disattiva\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"Colonne\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"Tutto\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Esporta dati\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"it-IT\"]),a.fn.bootstrapTable.locales[\"ja-JP\"]={formatLoadingMessage:function(){return\"\\u8AAD\\u307F\\u8FBC\\u307F\\u4E2D\\u3067\\u3059\\u3002\\u5C11\\u3005\\u304A\\u5F85\\u3061\\u304F\\u3060\\u3055\\u3044\\u3002\"},formatRecordsPerPage:function(a){return\"\\u30DA\\u30FC\\u30B8\\u5F53\\u305F\\u308A\\u6700\\u5927\".concat(a,\"\\u4EF6\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"\\u5168\".concat(t,\"\\u4EF6\\u304B\\u3089\\u3001\").concat(a,\"\\u304B\\u3089\").concat(o,\"\\u4EF6\\u76EE\\u307E\\u3067\\u8868\\u793A\\u3057\\u3066\\u3044\\u307E\\u3059 (filtered from \").concat(e,\" total rows)\"):\"\\u5168\".concat(t,\"\\u4EF6\\u304B\\u3089\\u3001\").concat(a,\"\\u304B\\u3089\").concat(o,\"\\u4EF6\\u76EE\\u307E\\u3067\\u8868\\u793A\\u3057\\u3066\\u3044\\u307E\\u3059\")},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Showing \".concat(a,\" rows\")},formatClearSearch:function(){return\"Clear Search\"},formatSearch:function(){return\"\\u691C\\u7D22\"},formatNoMatches:function(){return\"\\u8A72\\u5F53\\u3059\\u308B\\u30EC\\u30B3\\u30FC\\u30C9\\u304C\\u898B\\u3064\\u304B\\u308A\\u307E\\u305B\\u3093\"},formatPaginationSwitch:function(){return\"\\u30DA\\u30FC\\u30B8\\u6570\\u3092\\u8868\\u793A\\u30FB\\u975E\\u8868\\u793A\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"\\u66F4\\u65B0\"},formatToggle:function(){return\"\\u30C8\\u30B0\\u30EB\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"\\u5217\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"\\u3059\\u3079\\u3066\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Export data\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"ja-JP\"]),a.fn.bootstrapTable.locales[\"ka-GE\"]={formatLoadingMessage:function(){return\"\\u10D8\\u10E2\\u10D5\\u10D8\\u10E0\\u10D7\\u10D4\\u10D1\\u10D0, \\u10D2\\u10D7\\u10EE\\u10DD\\u10D5\\u10D7 \\u10DB\\u10DD\\u10D8\\u10EA\\u10D0\\u10D3\\u10DD\\u10D7\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" \\u10E9\\u10D0\\u10DC\\u10D0\\u10EC\\u10D4\\u10E0\\u10D8 \\u10D7\\u10D8\\u10D7\\u10DD \\u10D2\\u10D5\\u10D4\\u10E0\\u10D3\\u10D6\\u10D4\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"\\u10DC\\u10D0\\u10E9\\u10D5\\u10D4\\u10DC\\u10D4\\u10D1\\u10D8\\u10D0 \".concat(a,\"-\\u10D3\\u10D0\\u10DC \").concat(o,\"-\\u10DB\\u10D3\\u10D4 \\u10E9\\u10D0\\u10DC\\u10D0\\u10EC\\u10D4\\u10E0\\u10D8 \\u10EF\\u10D0\\u10DB\\u10E3\\u10E0\\u10D8 \").concat(t,\"-\\u10D3\\u10D0\\u10DC (filtered from \").concat(e,\" total rows)\"):\"\\u10DC\\u10D0\\u10E9\\u10D5\\u10D4\\u10DC\\u10D4\\u10D1\\u10D8\\u10D0 \".concat(a,\"-\\u10D3\\u10D0\\u10DC \").concat(o,\"-\\u10DB\\u10D3\\u10D4 \\u10E9\\u10D0\\u10DC\\u10D0\\u10EC\\u10D4\\u10E0\\u10D8 \\u10EF\\u10D0\\u10DB\\u10E3\\u10E0\\u10D8 \").concat(t,\"-\\u10D3\\u10D0\\u10DC\")},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Showing \".concat(a,\" rows\")},formatClearSearch:function(){return\"Clear Search\"},formatSearch:function(){return\"\\u10EB\\u10D4\\u10D1\\u10DC\\u10D0\"},formatNoMatches:function(){return\"\\u10DB\\u10DD\\u10DC\\u10D0\\u10EA\\u10D4\\u10DB\\u10D4\\u10D1\\u10D8 \\u10D0\\u10E0 \\u10D0\\u10E0\\u10D8\\u10E1\"},formatPaginationSwitch:function(){return\"\\u10D2\\u10D5\\u10D4\\u10E0\\u10D3\\u10D4\\u10D1\\u10D8\\u10E1 \\u10D2\\u10D0\\u10D3\\u10D0\\u10DB\\u10E0\\u10D7\\u10D5\\u10D4\\u10DA\\u10D8\\u10E1 \\u10D3\\u10D0\\u10DB\\u10D0\\u10DA\\u10D5\\u10D0/\\u10D2\\u10D0\\u10DB\\u10DD\\u10E9\\u10D4\\u10DC\\u10D0\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"\\u10D2\\u10D0\\u10DC\\u10D0\\u10EE\\u10DA\\u10D4\\u10D1\\u10D0\"},formatToggle:function(){return\"\\u10E9\\u10D0\\u10E0\\u10D7\\u10D5\\u10D0/\\u10D2\\u10D0\\u10DB\\u10DD\\u10E0\\u10D7\\u10D5\\u10D0\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"\\u10E1\\u10D5\\u10D4\\u10E2\\u10D4\\u10D1\\u10D8\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"All\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Export data\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"ka-GE\"]),a.fn.bootstrapTable.locales[\"ko-KR\"]={formatLoadingMessage:function(){return\"\\uB370\\uC774\\uD130\\uB97C \\uBD88\\uB7EC\\uC624\\uB294 \\uC911\\uC785\\uB2C8\\uB2E4\"},formatRecordsPerPage:function(a){return\"\\uD398\\uC774\\uC9C0 \\uB2F9 \".concat(a,\"\\uAC1C \\uB370\\uC774\\uD130 \\uCD9C\\uB825\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"\\uC804\\uCCB4 \".concat(t,\"\\uAC1C \\uC911 \").concat(a,\"~\").concat(o,\"\\uBC88\\uC9F8 \\uB370\\uC774\\uD130 \\uCD9C\\uB825, (filtered from \").concat(e,\" total rows)\"):\"\\uC804\\uCCB4 \".concat(t,\"\\uAC1C \\uC911 \").concat(a,\"~\").concat(o,\"\\uBC88\\uC9F8 \\uB370\\uC774\\uD130 \\uCD9C\\uB825,\")},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Showing \".concat(a,\" rows\")},formatClearSearch:function(){return\"Clear Search\"},formatSearch:function(){return\"\\uAC80\\uC0C9\"},formatNoMatches:function(){return\"\\uC870\\uD68C\\uB41C \\uB370\\uC774\\uD130\\uAC00 \\uC5C6\\uC2B5\\uB2C8\\uB2E4.\"},formatPaginationSwitch:function(){return\"Hide/Show pagination\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"\\uC0C8\\uB85C \\uACE0\\uCE68\"},formatToggle:function(){return\"\\uC804\\uD658\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"\\uCEEC\\uB7FC \\uD544\\uD130\\uB9C1\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"All\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Export data\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"ko-KR\"]),a.fn.bootstrapTable.locales[\"ms-MY\"]={formatLoadingMessage:function(){return\"Permintaan sedang dimuatkan. Sila tunggu sebentar\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" rekod setiap muka surat\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"Sedang memaparkan rekod \".concat(a,\" hingga \").concat(o,\" daripada jumlah \").concat(t,\" rekod (filtered from \").concat(e,\" total rows)\"):\"Sedang memaparkan rekod \".concat(a,\" hingga \").concat(o,\" daripada jumlah \").concat(t,\" rekod\")},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Showing \".concat(a,\" rows\")},formatClearSearch:function(){return\"Clear Search\"},formatSearch:function(){return\"Cari\"},formatNoMatches:function(){return\"Tiada rekod yang menyamai permintaan\"},formatPaginationSwitch:function(){return\"Tunjuk/sembunyi muka surat\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"Muatsemula\"},formatToggle:function(){return\"Tukar\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"Lajur\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"Semua\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Export data\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"ms-MY\"]),a.fn.bootstrapTable.locales[\"nb-NO\"]={formatLoadingMessage:function(){return\"Oppdaterer, vennligst vent\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" poster pr side\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"Viser \".concat(a,\" til \").concat(o,\" av \").concat(t,\" rekker (filtered from \").concat(e,\" total rows)\"):\"Viser \".concat(a,\" til \").concat(o,\" av \").concat(t,\" rekker\")},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Showing \".concat(a,\" rows\")},formatClearSearch:function(){return\"Clear Search\"},formatSearch:function(){return\"S\\xF8k\"},formatNoMatches:function(){return\"Ingen poster funnet\"},formatPaginationSwitch:function(){return\"Hide/Show pagination\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"Oppdater\"},formatToggle:function(){return\"Endre\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"Kolonner\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"All\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Export data\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"nb-NO\"]),a.fn.bootstrapTable.locales[\"nl-BE\"]={formatLoadingMessage:function(){return\"Laden, even geduld\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" records per pagina\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"Toon \".concat(a,\" tot \").concat(o,\" van \").concat(t,\" record\").concat(1<t?\"s\":\"\",\" (gefilterd van \").concat(e,\" records in totaal)\"):\"Toon \".concat(a,\" tot \").concat(o,\" van \").concat(t,\" record\").concat(1<t?\"s\":\"\")},formatSRPaginationPreText:function(){return\"vorige pagina\"},formatSRPaginationPageText:function(a){return\"tot pagina \".concat(a)},formatSRPaginationNextText:function(){return\"volgende pagina\"},formatDetailPagination:function(a){return\"Toon \".concat(a,\" record\").concat(1<a?\"s\":\"\")},formatClearSearch:function(){return\"Verwijder filters\"},formatSearch:function(){return\"Zoeken\"},formatNoMatches:function(){return\"Geen resultaten gevonden\"},formatPaginationSwitch:function(){return\"Verberg/Toon paginering\"},formatPaginationSwitchDown:function(){return\"Toon paginering\"},formatPaginationSwitchUp:function(){return\"Verberg paginering\"},formatRefresh:function(){return\"Vernieuwen\"},formatToggle:function(){return\"Omschakelen\"},formatToggleOn:function(){return\"Toon kaartweergave\"},formatToggleOff:function(){return\"Verberg kaartweergave\"},formatColumns:function(){return\"Kolommen\"},formatColumnsToggleAll:function(){return\"Allen omschakelen\"},formatFullscreen:function(){return\"Volledig scherm\"},formatAllRows:function(){return\"Alle\"},formatAutoRefresh:function(){return\"Automatisch vernieuwen\"},formatExport:function(){return\"Exporteer gegevens\"},formatJumpTo:function(){return\"GA\"},formatAdvancedSearch:function(){return\"Geavanceerd zoeken\"},formatAdvancedCloseButton:function(){return\"Sluiten\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"nl-BE\"]),a.fn.bootstrapTable.locales[\"nl-NL\"]={formatLoadingMessage:function(){return\"Laden, even geduld\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" records per pagina\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"Toon \".concat(a,\" tot \").concat(o,\" van \").concat(t,\" record\").concat(1<t?\"s\":\"\",\" (gefilterd van \").concat(e,\" records in totaal)\"):\"Toon \".concat(a,\" tot \").concat(o,\" van \").concat(t,\" record\").concat(1<t?\"s\":\"\")},formatSRPaginationPreText:function(){return\"vorige pagina\"},formatSRPaginationPageText:function(a){return\"tot pagina \".concat(a)},formatSRPaginationNextText:function(){return\"volgende pagina\"},formatDetailPagination:function(a){return\"Toon \".concat(a,\" record\").concat(1<a?\"s\":\"\")},formatClearSearch:function(){return\"Verwijder filters\"},formatSearch:function(){return\"Zoeken\"},formatNoMatches:function(){return\"Geen resultaten gevonden\"},formatPaginationSwitch:function(){return\"Verberg/Toon paginering\"},formatPaginationSwitchDown:function(){return\"Toon paginering\"},formatPaginationSwitchUp:function(){return\"Verberg paginering\"},formatRefresh:function(){return\"Vernieuwen\"},formatToggle:function(){return\"Omschakelen\"},formatToggleOn:function(){return\"Toon kaartweergave\"},formatToggleOff:function(){return\"Verberg kaartweergave\"},formatColumns:function(){return\"Kolommen\"},formatColumnsToggleAll:function(){return\"Allen omschakelen\"},formatFullscreen:function(){return\"Volledig scherm\"},formatAllRows:function(){return\"Alle\"},formatAutoRefresh:function(){return\"Automatisch vernieuwen\"},formatExport:function(){return\"Exporteer gegevens\"},formatJumpTo:function(){return\"GA\"},formatAdvancedSearch:function(){return\"Geavanceerd zoeken\"},formatAdvancedCloseButton:function(){return\"Sluiten\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"nl-NL\"]),a.fn.bootstrapTable.locales[\"pl-PL\"]={formatLoadingMessage:function(){return\"\\u0141adowanie, prosz\\u0119 czeka\\u0107\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" rekord\\xF3w na stron\\u0119\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"Wy\\u015Bwietlanie rekord\\xF3w od \".concat(a,\" do \").concat(o,\" z \").concat(t,\" (filtered from \").concat(e,\" total rows)\"):\"Wy\\u015Bwietlanie rekord\\xF3w od \".concat(a,\" do \").concat(o,\" z \").concat(t)},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Showing \".concat(a,\" rows\")},formatClearSearch:function(){return\"Clear Search\"},formatSearch:function(){return\"Szukaj\"},formatNoMatches:function(){return\"Niestety, nic nie znaleziono\"},formatPaginationSwitch:function(){return\"Hide/Show pagination\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"Od\\u015Bwie\\u017C\"},formatToggle:function(){return\"Prze\\u0142\\u0105cz\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"Kolumny\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"All\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Export data\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"pl-PL\"]),a.fn.bootstrapTable.locales[\"pt-BR\"]={formatLoadingMessage:function(){return\"Carregando, aguarde\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" registros por p\\xE1gina\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"Exibindo \".concat(a,\" at\\xE9 \").concat(o,\" de \").concat(t,\" linhas (filtered from \").concat(e,\" total rows)\"):\"Exibindo \".concat(a,\" at\\xE9 \").concat(o,\" de \").concat(t,\" linhas\")},formatSRPaginationPreText:function(){return\"p\\xE1gina anterior\"},formatSRPaginationPageText:function(a){return\"Para a p\\xE1gina \".concat(a)},formatSRPaginationNextText:function(){return\"pr\\xF3xima p\\xE1gina\"},formatDetailPagination:function(a){return\"Mostrando \".concat(a,\" linhas\")},formatClearSearch:function(){return\"Limpar Pasquisa\"},formatSearch:function(){return\"Pesquisar\"},formatNoMatches:function(){return\"Nenhum registro encontrado\"},formatPaginationSwitch:function(){return\"Ocultar/Exibir pagina\\xE7\\xE3o\"},formatPaginationSwitchDown:function(){return\"Mostrar Pagina\\xE7\\xE3o\"},formatPaginationSwitchUp:function(){return\"Esconder Pagina\\xE7\\xE3o\"},formatRefresh:function(){return\"Recarregar\"},formatToggle:function(){return\"Alternar\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"Colunas\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Tela cheia\"},formatAllRows:function(){return\"Tudo\"},formatAutoRefresh:function(){return\"Atualiza\\xE7\\xE3o Autom\\xE1tica\"},formatExport:function(){return\"Exportar dados\"},formatJumpTo:function(){return\"IR\"},formatAdvancedSearch:function(){return\"Pesquisa Avan\\xE7ada\"},formatAdvancedCloseButton:function(){return\"Fechar\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"pt-BR\"]),a.fn.bootstrapTable.locales[\"pt-PT\"]={formatLoadingMessage:function(){return\"A carregar, por favor aguarde\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" registos por p&aacute;gina\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"A mostrar \".concat(a,\" at&eacute; \").concat(o,\" de \").concat(t,\" linhas (filtered from \").concat(e,\" total rows)\"):\"A mostrar \".concat(a,\" at&eacute; \").concat(o,\" de \").concat(t,\" linhas\")},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Showing \".concat(a,\" rows\")},formatClearSearch:function(){return\"Clear Search\"},formatSearch:function(){return\"Pesquisa\"},formatNoMatches:function(){return\"Nenhum registo encontrado\"},formatPaginationSwitch:function(){return\"Esconder/Mostrar pagina&ccedil&atilde;o\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"Atualizar\"},formatToggle:function(){return\"Alternar\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"Colunas\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"Tudo\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Export data\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"pt-PT\"]),a.fn.bootstrapTable.locales[\"ro-RO\"]={formatLoadingMessage:function(){return\"Se incarca, va rugam asteptati\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" inregistrari pe pagina\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"Arata de la \".concat(a,\" pana la \").concat(o,\" din \").concat(t,\" randuri (filtered from \").concat(e,\" total rows)\"):\"Arata de la \".concat(a,\" pana la \").concat(o,\" din \").concat(t,\" randuri\")},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Showing \".concat(a,\" rows\")},formatClearSearch:function(){return\"Clear Search\"},formatSearch:function(){return\"Cauta\"},formatNoMatches:function(){return\"Nu au fost gasite inregistrari\"},formatPaginationSwitch:function(){return\"Ascunde/Arata paginatia\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"Reincarca\"},formatToggle:function(){return\"Comuta\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"Coloane\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"Toate\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Export data\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"ro-RO\"]),a.fn.bootstrapTable.locales[\"ru-RU\"]={formatLoadingMessage:function(){return\"\\u041F\\u043E\\u0436\\u0430\\u043B\\u0443\\u0439\\u0441\\u0442\\u0430, \\u043F\\u043E\\u0434\\u043E\\u0436\\u0434\\u0438\\u0442\\u0435, \\u0438\\u0434\\u0451\\u0442 \\u0437\\u0430\\u0433\\u0440\\u0443\\u0437\\u043A\\u0430\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" \\u0437\\u0430\\u043F\\u0438\\u0441\\u0435\\u0439 \\u043D\\u0430 \\u0441\\u0442\\u0440\\u0430\\u043D\\u0438\\u0446\\u0443\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"\\u0417\\u0430\\u043F\\u0438\\u0441\\u0438 \\u0441 \".concat(a,\" \\u043F\\u043E \").concat(o,\" \\u0438\\u0437 \").concat(t,\" (filtered from \").concat(e,\" total rows)\"):\"\\u0417\\u0430\\u043F\\u0438\\u0441\\u0438 \\u0441 \".concat(a,\" \\u043F\\u043E \").concat(o,\" \\u0438\\u0437 \").concat(t)},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Showing \".concat(a,\" rows\")},formatClearSearch:function(){return\"\\u041E\\u0447\\u0438\\u0441\\u0442\\u0438\\u0442\\u044C \\u0444\\u0438\\u043B\\u044C\\u0442\\u0440\\u044B\"},formatSearch:function(){return\"\\u041F\\u043E\\u0438\\u0441\\u043A\"},formatNoMatches:function(){return\"\\u041D\\u0438\\u0447\\u0435\\u0433\\u043E \\u043D\\u0435 \\u043D\\u0430\\u0439\\u0434\\u0435\\u043D\\u043E\"},formatPaginationSwitch:function(){return\"Hide/Show pagination\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"\\u041E\\u0431\\u043D\\u043E\\u0432\\u0438\\u0442\\u044C\"},formatToggle:function(){return\"\\u041F\\u0435\\u0440\\u0435\\u043A\\u043B\\u044E\\u0447\\u0438\\u0442\\u044C\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"\\u041A\\u043E\\u043B\\u043E\\u043D\\u043A\\u0438\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"All\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Export data\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"ru-RU\"]),a.fn.bootstrapTable.locales[\"sk-SK\"]={formatLoadingMessage:function(){return\"Pros\\xEDm \\u010Dakajte\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" z\\xE1znamov na stranu\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"Zobrazen\\xE1 \".concat(a,\". - \").concat(o,\". polo\\u017Eka z celkov\\xFDch \").concat(t,\" (filtered from \").concat(e,\" total rows)\"):\"Zobrazen\\xE1 \".concat(a,\". - \").concat(o,\". polo\\u017Eka z celkov\\xFDch \").concat(t)},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Showing \".concat(a,\" rows\")},formatClearSearch:function(){return\"Odstr\\xE1\\u0148 filtre\"},formatSearch:function(){return\"Vyh\\u013Ead\\xE1vanie\"},formatNoMatches:function(){return\"Nen\\xE1jden\\xE1 \\u017Eiadna vyhovuj\\xFAca polo\\u017Eka\"},formatPaginationSwitch:function(){return\"Skry/Zobraz str\\xE1nkovanie\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"Obnovi\\u0165\"},formatToggle:function(){return\"Prepni\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"St\\u013Apce\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"V\\u0161etky\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Exportuj d\\xE1ta\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"sk-SK\"]),a.fn.bootstrapTable.locales[\"sv-SE\"]={formatLoadingMessage:function(){return\"Laddar, v\\xE4nligen v\\xE4nta\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" rader per sida\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"Visa \".concat(a,\" till \").concat(o,\" av \").concat(t,\" rader (filtered from \").concat(e,\" total rows)\"):\"Visa \".concat(a,\" till \").concat(o,\" av \").concat(t,\" rader\")},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Showing \".concat(a,\" rows\")},formatClearSearch:function(){return\"Clear Search\"},formatSearch:function(){return\"S\\xF6k\"},formatNoMatches:function(){return\"Inga matchande resultat funna.\"},formatPaginationSwitch:function(){return\"Hide/Show pagination\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"Uppdatera\"},formatToggle:function(){return\"Skifta\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"kolumn\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"All\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Export data\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"sv-SE\"]),a.fn.bootstrapTable.locales[\"th-TH\"]={formatLoadingMessage:function(){return\"\\u0E01\\u0E33\\u0E25\\u0E31\\u0E07\\u0E42\\u0E2B\\u0E25\\u0E14\\u0E02\\u0E49\\u0E2D\\u0E21\\u0E39\\u0E25, \\u0E01\\u0E23\\u0E38\\u0E13\\u0E32\\u0E23\\u0E2D\\u0E2A\\u0E31\\u0E01\\u0E04\\u0E23\\u0E39\\u0E48\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" \\u0E23\\u0E32\\u0E22\\u0E01\\u0E32\\u0E23\\u0E15\\u0E48\\u0E2D\\u0E2B\\u0E19\\u0E49\\u0E32\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"\\u0E23\\u0E32\\u0E22\\u0E01\\u0E32\\u0E23\\u0E17\\u0E35\\u0E48 \".concat(a,\" \\u0E16\\u0E36\\u0E07 \").concat(o,\" \\u0E08\\u0E32\\u0E01\\u0E17\\u0E31\\u0E49\\u0E07\\u0E2B\\u0E21\\u0E14 \").concat(t,\" \\u0E23\\u0E32\\u0E22\\u0E01\\u0E32\\u0E23 (filtered from \").concat(e,\" total rows)\"):\"\\u0E23\\u0E32\\u0E22\\u0E01\\u0E32\\u0E23\\u0E17\\u0E35\\u0E48 \".concat(a,\" \\u0E16\\u0E36\\u0E07 \").concat(o,\" \\u0E08\\u0E32\\u0E01\\u0E17\\u0E31\\u0E49\\u0E07\\u0E2B\\u0E21\\u0E14 \").concat(t,\" \\u0E23\\u0E32\\u0E22\\u0E01\\u0E32\\u0E23\")},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Showing \".concat(a,\" rows\")},formatClearSearch:function(){return\"Clear Search\"},formatSearch:function(){return\"\\u0E04\\u0E49\\u0E19\\u0E2B\\u0E32\"},formatNoMatches:function(){return\"\\u0E44\\u0E21\\u0E48\\u0E1E\\u0E1A\\u0E23\\u0E32\\u0E22\\u0E01\\u0E32\\u0E23\\u0E17\\u0E35\\u0E48\\u0E04\\u0E49\\u0E19\\u0E2B\\u0E32 !\"},formatPaginationSwitch:function(){return\"Hide/Show pagination\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"\\u0E23\\u0E35\\u0E40\\u0E1F\\u0E23\\u0E2A\"},formatToggle:function(){return\"\\u0E2A\\u0E25\\u0E31\\u0E1A\\u0E21\\u0E38\\u0E21\\u0E21\\u0E2D\\u0E07\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"\\u0E04\\u0E2D\\u0E25\\u0E31\\u0E21\\u0E19\\u0E4C\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"All\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Export data\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"th-TH\"]),a.fn.bootstrapTable.locales[\"tr-TR\"]={formatLoadingMessage:function(){return\"Y\\xFCkleniyor, l\\xFCtfen bekleyin\"},formatRecordsPerPage:function(a){return\"Sayfa ba\\u015F\\u0131na \".concat(a,\" kay\\u0131t.\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"\".concat(t,\" kay\\u0131ttan \").concat(a,\"-\").concat(o,\" aras\\u0131 g\\xF6steriliyor (filtered from \").concat(e,\" total rows).\"):\"\".concat(t,\" kay\\u0131ttan \").concat(a,\"-\").concat(o,\" aras\\u0131 g\\xF6steriliyor.\")},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Showing \".concat(a,\" rows\")},formatClearSearch:function(){return\"Clear Search\"},formatSearch:function(){return\"Ara\"},formatNoMatches:function(){return\"E\\u015Fle\\u015Fen kay\\u0131t bulunamad\\u0131.\"},formatPaginationSwitch:function(){return\"Hide/Show pagination\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"Yenile\"},formatToggle:function(){return\"De\\u011Fi\\u015Ftir\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"S\\xFCtunlar\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"T\\xFCm Sat\\u0131rlar\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Export data\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"tr-TR\"]),a.fn.bootstrapTable.locales[\"uk-UA\"]={formatLoadingMessage:function(){return\"\\u0417\\u0430\\u0432\\u0430\\u043D\\u0442\\u0430\\u0436\\u0435\\u043D\\u043D\\u044F, \\u0431\\u0443\\u0434\\u044C \\u043B\\u0430\\u0441\\u043A\\u0430, \\u0437\\u0430\\u0447\\u0435\\u043A\\u0430\\u0439\\u0442\\u0435\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" \\u0437\\u0430\\u043F\\u0438\\u0441\\u0456\\u0432 \\u043D\\u0430 \\u0441\\u0442\\u043E\\u0440\\u0456\\u043D\\u043A\\u0443\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"\\u041F\\u043E\\u043A\\u0430\\u0437\\u0430\\u043D\\u043E \\u0437 \".concat(a,\" \\u043F\\u043E \").concat(o,\". \\u0412\\u0441\\u044C\\u043E\\u0433\\u043E: \").concat(t,\" (filtered from \").concat(e,\" total rows)\"):\"\\u041F\\u043E\\u043A\\u0430\\u0437\\u0430\\u043D\\u043E \\u0437 \".concat(a,\" \\u043F\\u043E \").concat(o,\". \\u0412\\u0441\\u044C\\u043E\\u0433\\u043E: \").concat(t)},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Showing \".concat(a,\" rows\")},formatClearSearch:function(){return\"\\u041E\\u0447\\u0438\\u0441\\u0442\\u0438\\u0442\\u0438 \\u0444\\u0456\\u043B\\u044C\\u0442\\u0440\\u0438\"},formatSearch:function(){return\"\\u041F\\u043E\\u0448\\u0443\\u043A\"},formatNoMatches:function(){return\"\\u041D\\u0435 \\u0437\\u043D\\u0430\\u0439\\u0434\\u0435\\u043D\\u043E \\u0436\\u043E\\u0434\\u043D\\u043E\\u0433\\u043E \\u0437\\u0430\\u043F\\u0438\\u0441\\u0443\"},formatPaginationSwitch:function(){return\"Hide/Show pagination\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"\\u041E\\u043D\\u043E\\u0432\\u0438\\u0442\\u0438\"},formatToggle:function(){return\"\\u0417\\u043C\\u0456\\u043D\\u0438\\u0442\\u0438\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"\\u0421\\u0442\\u043E\\u0432\\u043F\\u0446\\u0456\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"All\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Export data\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"uk-UA\"]),a.fn.bootstrapTable.locales[\"ur-PK\"]={formatLoadingMessage:function(){return\"\\u0628\\u0631\\u0627\\u06D3 \\u0645\\u06C1\\u0631\\u0628\\u0627\\u0646\\u06CC \\u0627\\u0646\\u062A\\u0638\\u0627\\u0631 \\u06A9\\u06CC\\u062C\\u0626\\u06D2\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" \\u0631\\u06CC\\u06A9\\u0627\\u0631\\u0688\\u0632 \\u0641\\u06CC \\u0635\\u0641\\u06C1 \")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"\\u062F\\u06CC\\u06A9\\u06BE\\u06CC\\u06BA \".concat(a,\" \\u0633\\u06D2 \").concat(o,\" \\u06A9\\u06D2 \").concat(t,\"\\u0631\\u06CC\\u06A9\\u0627\\u0631\\u0688\\u0632 (filtered from \").concat(e,\" total rows)\"):\"\\u062F\\u06CC\\u06A9\\u06BE\\u06CC\\u06BA \".concat(a,\" \\u0633\\u06D2 \").concat(o,\" \\u06A9\\u06D2 \").concat(t,\"\\u0631\\u06CC\\u06A9\\u0627\\u0631\\u0688\\u0632\")},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Showing \".concat(a,\" rows\")},formatClearSearch:function(){return\"Clear Search\"},formatSearch:function(){return\"\\u062A\\u0644\\u0627\\u0634\"},formatNoMatches:function(){return\"\\u06A9\\u0648\\u0626\\u06CC \\u0631\\u06CC\\u06A9\\u0627\\u0631\\u0688 \\u0646\\u06C1\\u06CC\\u06BA \\u0645\\u0644\\u0627\"},formatPaginationSwitch:function(){return\"Hide/Show pagination\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"\\u062A\\u0627\\u0632\\u06C1 \\u06A9\\u0631\\u06CC\\u06BA\"},formatToggle:function(){return\"\\u062A\\u0628\\u062F\\u06CC\\u0644 \\u06A9\\u0631\\u06CC\\u06BA\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"\\u06A9\\u0627\\u0644\\u0645\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"All\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Export data\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"ur-PK\"]),a.fn.bootstrapTable.locales[\"uz-Latn-UZ\"]={formatLoadingMessage:function(){return\"Yuklanyapti, iltimos kuting\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" qator har sahifada\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"Ko'rsatypati \".concat(a,\" dan \").concat(o,\" gacha \").concat(t,\" qatorlarni (filtered from \").concat(e,\" total rows)\"):\"Ko'rsatypati \".concat(a,\" dan \").concat(o,\" gacha \").concat(t,\" qatorlarni\")},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Showing \".concat(a,\" rows\")},formatClearSearch:function(){return\"Filtrlarni tozalash\"},formatSearch:function(){return\"Qidirish\"},formatNoMatches:function(){return\"Hech narsa topilmadi\"},formatPaginationSwitch:function(){return\"Sahifalashni yashirish/ko'rsatish\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"Yangilash\"},formatToggle:function(){return\"Ko'rinish\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"Ustunlar\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"Hammasi\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Eksport\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"uz-Latn-UZ\"]),a.fn.bootstrapTable.locales[\"vi-VN\"]={formatLoadingMessage:function(){return\"\\u0110ang t\\u1EA3i\"},formatRecordsPerPage:function(a){return\"\".concat(a,\" b\\u1EA3n ghi m\\u1ED7i trang\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"Hi\\u1EC3n th\\u1ECB t\\u1EEB trang \".concat(a,\" \\u0111\\u1EBFn \").concat(o,\" c\\u1EE7a \").concat(t,\" b\\u1EA3ng ghi (filtered from \").concat(e,\" total rows)\"):\"Hi\\u1EC3n th\\u1ECB t\\u1EEB trang \".concat(a,\" \\u0111\\u1EBFn \").concat(o,\" c\\u1EE7a \").concat(t,\" b\\u1EA3ng ghi\")},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(a){return\"to page \".concat(a)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(a){return\"Showing \".concat(a,\" rows\")},formatClearSearch:function(){return\"Clear Search\"},formatSearch:function(){return\"T\\xECm ki\\u1EBFm\"},formatNoMatches:function(){return\"Kh\\xF4ng c\\xF3 d\\u1EEF li\\u1EC7u\"},formatPaginationSwitch:function(){return\"Hide/Show pagination\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"Refresh\"},formatToggle:function(){return\"Toggle\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"Columns\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"All\"},formatAutoRefresh:function(){return\"Auto Refresh\"},formatExport:function(){return\"Export data\"},formatJumpTo:function(){return\"GO\"},formatAdvancedSearch:function(){return\"Advanced search\"},formatAdvancedCloseButton:function(){return\"Close\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"vi-VN\"]),a.fn.bootstrapTable.locales[\"zh-CN\"]={formatLoadingMessage:function(){return\"\\u6B63\\u5728\\u52AA\\u529B\\u5730\\u52A0\\u8F7D\\u6570\\u636E\\u4E2D\\uFF0C\\u8BF7\\u7A0D\\u5019\"},formatRecordsPerPage:function(a){return\"\\u6BCF\\u9875\\u663E\\u793A \".concat(a,\" \\u6761\\u8BB0\\u5F55\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"\\u663E\\u793A\\u7B2C \".concat(a,\" \\u5230\\u7B2C \").concat(o,\" \\u6761\\u8BB0\\u5F55\\uFF0C\\u603B\\u5171 \").concat(t,\" \\u6761\\u8BB0\\u5F55\\uFF08\\u4ECE \").concat(e,\" \\u603B\\u8BB0\\u5F55\\u4E2D\\u8FC7\\u6EE4\\uFF09\"):\"\\u663E\\u793A\\u7B2C \".concat(a,\" \\u5230\\u7B2C \").concat(o,\" \\u6761\\u8BB0\\u5F55\\uFF0C\\u603B\\u5171 \").concat(t,\" \\u6761\\u8BB0\\u5F55\")},formatSRPaginationPreText:function(){return\"\\u4E0A\\u4E00\\u9875\"},formatSRPaginationPageText:function(a){return\"\\u7B2C\".concat(a,\"\\u9875\")},formatSRPaginationNextText:function(){return\"\\u4E0B\\u4E00\\u9875\"},formatDetailPagination:function(a){return\"\\u603B\\u5171 \".concat(a,\" \\u6761\\u8BB0\\u5F55\")},formatClearSearch:function(){return\"\\u6E05\\u7A7A\\u8FC7\\u6EE4\"},formatSearch:function(){return\"\\u641C\\u7D22\"},formatNoMatches:function(){return\"\\u6CA1\\u6709\\u627E\\u5230\\u5339\\u914D\\u7684\\u8BB0\\u5F55\"},formatPaginationSwitch:function(){return\"\\u9690\\u85CF/\\u663E\\u793A\\u5206\\u9875\"},formatPaginationSwitchDown:function(){return\"\\u663E\\u793A\\u5206\\u9875\"},formatPaginationSwitchUp:function(){return\"\\u9690\\u85CF\\u5206\\u9875\"},formatRefresh:function(){return\"\\u5237\\u65B0\"},formatToggle:function(){return\"\\u5207\\u6362\"},formatToggleOn:function(){return\"\\u663E\\u793A\\u5361\\u7247\\u89C6\\u56FE\"},formatToggleOff:function(){return\"\\u9690\\u85CF\\u5361\\u7247\\u89C6\\u56FE\"},formatColumns:function(){return\"\\u5217\"},formatColumnsToggleAll:function(){return\"\\u5207\\u6362\\u6240\\u6709\"},formatFullscreen:function(){return\"\\u5168\\u5C4F\"},formatAllRows:function(){return\"\\u6240\\u6709\"},formatAutoRefresh:function(){return\"\\u81EA\\u52A8\\u5237\\u65B0\"},formatExport:function(){return\"\\u5BFC\\u51FA\\u6570\\u636E\"},formatJumpTo:function(){return\"\\u8DF3\\u8F6C\"},formatAdvancedSearch:function(){return\"\\u9AD8\\u7EA7\\u641C\\u7D22\"},formatAdvancedCloseButton:function(){return\"\\u5173\\u95ED\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"zh-CN\"]),a.fn.bootstrapTable.locales[\"zh-TW\"]={formatLoadingMessage:function(){return\"\\u6B63\\u5728\\u52AA\\u529B\\u5730\\u8F09\\u5165\\u8CC7\\u6599\\uFF0C\\u8ACB\\u7A0D\\u5019\"},formatRecordsPerPage:function(a){return\"\\u6BCF\\u9801\\u986F\\u793A \".concat(a,\" \\u9805\\u8A18\\u9304\")},formatShowingRows:function(a,o,t,e){return void 0!==e&&0<e&&e>t?\"\\u986F\\u793A\\u7B2C \".concat(a,\" \\u5230\\u7B2C \").concat(o,\" \\u9805\\u8A18\\u9304\\uFF0C\\u7E3D\\u5171 \").concat(t,\" \\u9805\\u8A18\\u9304\\uFF08\\u5F9E \").concat(e,\" \\u7E3D\\u8A18\\u9304\\u4E2D\\u904E\\u6FFE\\uFF09\"):\"\\u986F\\u793A\\u7B2C \".concat(a,\" \\u5230\\u7B2C \").concat(o,\" \\u9805\\u8A18\\u9304\\uFF0C\\u7E3D\\u5171 \").concat(t,\" \\u9805\\u8A18\\u9304\")},formatSRPaginationPreText:function(){return\"\\u4E0A\\u4E00\\u9801\"},formatSRPaginationPageText:function(a){return\"\\u7B2C\".concat(a,\"\\u9801\")},formatSRPaginationNextText:function(){return\"\\u4E0B\\u4E00\\u9801\"},formatDetailPagination:function(a){return\"\\u7E3D\\u5171 \".concat(a,\" \\u9805\\u8A18\\u9304\")},formatClearSearch:function(){return\"\\u6E05\\u7A7A\\u904E\\u6FFE\"},formatSearch:function(){return\"\\u641C\\u5C0B\"},formatNoMatches:function(){return\"\\u6C92\\u6709\\u627E\\u5230\\u7B26\\u5408\\u7684\\u7D50\\u679C\"},formatPaginationSwitch:function(){return\"\\u96B1\\u85CF/\\u986F\\u793A\\u5206\\u9801\"},formatPaginationSwitchDown:function(){return\"\\u986F\\u793A\\u5206\\u9801\"},formatPaginationSwitchUp:function(){return\"\\u96B1\\u85CF\\u5206\\u9801\"},formatRefresh:function(){return\"\\u91CD\\u65B0\\u6574\\u7406\"},formatToggle:function(){return\"\\u5207\\u63DB\"},formatToggleOn:function(){return\"\\u986F\\u793A\\u5361\\u7247\\u8996\\u5716\"},formatToggleOff:function(){return\"\\u96B1\\u85CF\\u5361\\u7247\\u8996\\u5716\"},formatColumns:function(){return\"\\u5217\"},formatColumnsToggleAll:function(){return\"\\u5207\\u63DB\\u6240\\u6709\"},formatFullscreen:function(){return\"\\u5168\\u5C4F\"},formatAllRows:function(){return\"\\u6240\\u6709\"},formatAutoRefresh:function(){return\"\\u81EA\\u52D5\\u5237\\u65B0\"},formatExport:function(){return\"\\u5C0E\\u51FA\\u6578\\u64DA\"},formatJumpTo:function(){return\"\\u8DF3\\u8F49\"},formatAdvancedSearch:function(){return\"\\u9AD8\\u7D1A\\u641C\\u5C0B\"},formatAdvancedCloseButton:function(){return\"\\u95DC\\u9589\"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales[\"zh-TW\"])});\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bootstrap-table/bootstrap-table.css",
    "content": "@charset \"UTF-8\";\n/**\n * @author zhixin wen <wenzhixin2010@gmail.com>\n * version: 1.15.4\n * https://github.com/wenzhixin/bootstrap-table/\n */\n.bootstrap-table .fixed-table-toolbar::after {\n  content: \"\";\n  display: block;\n  clear: both;\n}\n.bootstrap-table .fixed-table-toolbar .bs-bars,\n.bootstrap-table .fixed-table-toolbar .search,\n.bootstrap-table .fixed-table-toolbar .columns {\n  position: relative;\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.bootstrap-table .fixed-table-toolbar .columns .btn-group > .btn-group {\n  display: inline-block;\n  margin-left: -1px !important;\n}\n.bootstrap-table .fixed-table-toolbar .columns .btn-group > .btn-group > .btn {\n  border-radius: 0;\n}\n.bootstrap-table .fixed-table-toolbar .columns .btn-group > .btn-group:first-child > .btn {\n  border-top-left-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n.bootstrap-table .fixed-table-toolbar .columns .btn-group > .btn-group:last-child > .btn {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n.bootstrap-table .fixed-table-toolbar .columns .dropdown-menu {\n  text-align: left;\n  max-height: 300px;\n  overflow: auto;\n  -ms-overflow-style: scrollbar;\n  z-index: 1001;\n}\n.bootstrap-table .fixed-table-toolbar .columns label {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 1.428571429;\n}\n.bootstrap-table .fixed-table-toolbar .columns-left {\n  margin-right: 5px;\n}\n.bootstrap-table .fixed-table-toolbar .columns-right {\n  margin-left: 5px;\n}\n.bootstrap-table .fixed-table-toolbar .pull-right .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n.bootstrap-table .fixed-table-container {\n  position: relative;\n  clear: both;\n}\n.bootstrap-table .fixed-table-container .table {\n  width: 100%;\n  margin-bottom: 0 !important;\n}\n.bootstrap-table .fixed-table-container .table th,\n.bootstrap-table .fixed-table-container .table td {\n  vertical-align: middle;\n  box-sizing: border-box;\n}\n.bootstrap-table .fixed-table-container .table thead th {\n  vertical-align: bottom;\n  padding: 0;\n  margin: 0;\n}\n.bootstrap-table .fixed-table-container .table thead th:focus {\n  outline: 0 solid transparent;\n}\n.bootstrap-table .fixed-table-container .table thead th.detail {\n  width: 30px;\n}\n.bootstrap-table .fixed-table-container .table thead th .th-inner {\n  padding: 0.75rem;\n  vertical-align: bottom;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n.bootstrap-table .fixed-table-container .table thead th .sortable {\n  cursor: pointer;\n  background-position: right;\n  background-repeat: no-repeat;\n  padding-right: 30px;\n}\n.bootstrap-table .fixed-table-container .table thead th .both {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7X QMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC\");\n}\n.bootstrap-table .fixed-table-container .table thead th .asc {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg==\");\n}\n.bootstrap-table .fixed-table-container .table thead th .desc {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII= \");\n}\n.bootstrap-table .fixed-table-container .table tbody tr.selected td {\n  background-color: rgba(0, 0, 0, 0.075);\n}\n.bootstrap-table .fixed-table-container .table tbody tr.no-records-found {\n  text-align: center;\n}\n.bootstrap-table .fixed-table-container .table tbody tr .card-view {\n  display: flex;\n}\n.bootstrap-table .fixed-table-container .table tbody tr .card-view .card-view-title {\n  font-weight: bold;\n  display: inline-block;\n  min-width: 30%;\n  text-align: left !important;\n}\n.bootstrap-table .fixed-table-container .table .bs-checkbox {\n  text-align: center;\n}\n.bootstrap-table .fixed-table-container .table .bs-checkbox label {\n  margin-bottom: 0;\n}\n.bootstrap-table .fixed-table-container .table input[type=radio],\n.bootstrap-table .fixed-table-container .table input[type=checkbox] {\n  margin: 0 auto !important;\n}\n.bootstrap-table .fixed-table-container .table.table-sm .th-inner {\n  padding: 0.3rem;\n}\n.bootstrap-table .fixed-table-container.fixed-height:not(.has-footer) {\n  border-bottom: 1px solid #dee2e6;\n}\n.bootstrap-table .fixed-table-container.fixed-height.has-card-view {\n  border-top: 1px solid #dee2e6;\n  border-bottom: 1px solid #dee2e6;\n}\n.bootstrap-table .fixed-table-container.fixed-height .fixed-table-border {\n  border-left: 1px solid #dee2e6;\n  border-right: 1px solid #dee2e6;\n}\n.bootstrap-table .fixed-table-container.fixed-height .table thead th {\n  border-bottom: 1px solid #dee2e6;\n}\n.bootstrap-table .fixed-table-container.fixed-height .table-dark thead th {\n  border-bottom: 1px solid #32383e;\n}\n.bootstrap-table .fixed-table-container .fixed-table-header {\n  overflow: hidden;\n}\n.bootstrap-table .fixed-table-container .fixed-table-body {\n  overflow-x: auto;\n  overflow-y: auto;\n  height: 100%;\n}\n.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading {\n  align-items: center;\n  background: #fff;\n  display: none;\n  justify-content: center;\n  position: absolute;\n  bottom: 0;\n  width: 100%;\n  z-index: 1000;\n}\n.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap {\n  align-items: baseline;\n  display: flex;\n  justify-content: center;\n}\n.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .loading-text {\n  font-size: 2rem;\n  margin-right: 6px;\n}\n.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .animation-wrap {\n  align-items: center;\n  display: flex;\n  justify-content: center;\n}\n.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .animation-dot,\n.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .animation-wrap::after,\n.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .animation-wrap::before {\n  content: \"\";\n  animation-duration: 1.5s;\n  animation-iteration-count: infinite;\n  animation-name: LOADING;\n  background: #212529;\n  border-radius: 50%;\n  display: block;\n  height: 5px;\n  margin: 0 4px;\n  opacity: 0;\n  width: 5px;\n}\n.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .animation-dot {\n  animation-delay: 0.3s;\n}\n.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .animation-wrap::after {\n  animation-delay: 0.6s;\n}\n.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading.table-dark {\n  background: #212529;\n}\n.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading.table-dark .animation-dot,\n.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading.table-dark .animation-wrap::after,\n.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading.table-dark .animation-wrap::before {\n  background: #fff;\n}\n.bootstrap-table .fixed-table-container .fixed-table-footer {\n  overflow: hidden;\n}\n.bootstrap-table .fixed-table-pagination::after {\n  content: \"\";\n  display: block;\n  clear: both;\n}\n.bootstrap-table .fixed-table-pagination > .pagination-detail,\n.bootstrap-table .fixed-table-pagination > .pagination {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.bootstrap-table .fixed-table-pagination > .pagination-detail .pagination-info {\n  line-height: 34px;\n  margin-right: 5px;\n}\n.bootstrap-table .fixed-table-pagination > .pagination-detail .page-list {\n  display: inline-block;\n}\n.bootstrap-table .fixed-table-pagination > .pagination-detail .page-list .btn-group {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n}\n.bootstrap-table .fixed-table-pagination > .pagination-detail .page-list .btn-group .dropdown-menu {\n  margin-bottom: 0;\n}\n.bootstrap-table .fixed-table-pagination > .pagination ul.pagination {\n  margin: 0;\n}\n.bootstrap-table .fixed-table-pagination > .pagination ul.pagination a {\n  padding: 6px 12px;\n  line-height: 1.428571429;\n}\n.bootstrap-table .fixed-table-pagination > .pagination ul.pagination li.page-intermediate a {\n  color: #c8c8c8;\n}\n.bootstrap-table .fixed-table-pagination > .pagination ul.pagination li.page-intermediate a::before {\n  content: \"⬅\";\n}\n.bootstrap-table .fixed-table-pagination > .pagination ul.pagination li.page-intermediate a::after {\n  content: \"➡\";\n}\n.bootstrap-table .fixed-table-pagination > .pagination ul.pagination li.disabled a {\n  pointer-events: none;\n  cursor: default;\n}\n.bootstrap-table.fullscreen {\n  position: fixed;\n  top: 0;\n  left: 0;\n  z-index: 1050;\n  width: 100% !important;\n  background: #fff;\n  height: calc(100vh);\n  overflow-y: scroll;\n}\n\n/* calculate scrollbar width */\ndiv.fixed-table-scroll-inner {\n  width: 100%;\n  height: 200px;\n}\n\ndiv.fixed-table-scroll-outer {\n  top: 0;\n  left: 0;\n  visibility: hidden;\n  width: 200px;\n  height: 150px;\n  overflow: hidden;\n}\n\n@keyframes LOADING {\n  0% {\n    opacity: 0;\n  }\n  50% {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n\n/*# sourceMappingURL=bootstrap-table.css.map */\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bootstrap-table/bootstrap-table.js",
    "content": "(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery')) :\n\ttypeof define === 'function' && define.amd ? define(['jquery'], factory) :\n\t(global = global || self, global.BootstrapTable = factory(global.jQuery));\n}(this, function ($) { 'use strict';\n\n\t$ = $ && $.hasOwnProperty('default') ? $['default'] : $;\n\n\tvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n\tfunction createCommonjsModule(fn, module) {\n\t\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n\t}\n\n\tvar O = 'object';\n\tvar check = function (it) {\n\t  return it && it.Math == Math && it;\n\t};\n\n\t// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\n\tvar global_1 =\n\t  // eslint-disable-next-line no-undef\n\t  check(typeof globalThis == O && globalThis) ||\n\t  check(typeof window == O && window) ||\n\t  check(typeof self == O && self) ||\n\t  check(typeof commonjsGlobal == O && commonjsGlobal) ||\n\t  // eslint-disable-next-line no-new-func\n\t  Function('return this')();\n\n\tvar fails = function (exec) {\n\t  try {\n\t    return !!exec();\n\t  } catch (error) {\n\t    return true;\n\t  }\n\t};\n\n\t// Thank's IE8 for his funny defineProperty\n\tvar descriptors = !fails(function () {\n\t  return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n\t});\n\n\tvar nativePropertyIsEnumerable = {}.propertyIsEnumerable;\n\tvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n\t// Nashorn ~ JDK8 bug\n\tvar NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1);\n\n\t// `Object.prototype.propertyIsEnumerable` method implementation\n\t// https://tc39.github.io/ecma262/#sec-object.prototype.propertyisenumerable\n\tvar f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n\t  var descriptor = getOwnPropertyDescriptor(this, V);\n\t  return !!descriptor && descriptor.enumerable;\n\t} : nativePropertyIsEnumerable;\n\n\tvar objectPropertyIsEnumerable = {\n\t\tf: f\n\t};\n\n\tvar createPropertyDescriptor = function (bitmap, value) {\n\t  return {\n\t    enumerable: !(bitmap & 1),\n\t    configurable: !(bitmap & 2),\n\t    writable: !(bitmap & 4),\n\t    value: value\n\t  };\n\t};\n\n\tvar toString = {}.toString;\n\n\tvar classofRaw = function (it) {\n\t  return toString.call(it).slice(8, -1);\n\t};\n\n\tvar split = ''.split;\n\n\t// fallback for non-array-like ES3 and non-enumerable old V8 strings\n\tvar indexedObject = fails(function () {\n\t  // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n\t  // eslint-disable-next-line no-prototype-builtins\n\t  return !Object('z').propertyIsEnumerable(0);\n\t}) ? function (it) {\n\t  return classofRaw(it) == 'String' ? split.call(it, '') : Object(it);\n\t} : Object;\n\n\t// `RequireObjectCoercible` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-requireobjectcoercible\n\tvar requireObjectCoercible = function (it) {\n\t  if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n\t  return it;\n\t};\n\n\t// toObject with fallback for non-array-like ES3 strings\n\n\n\n\tvar toIndexedObject = function (it) {\n\t  return indexedObject(requireObjectCoercible(it));\n\t};\n\n\tvar isObject = function (it) {\n\t  return typeof it === 'object' ? it !== null : typeof it === 'function';\n\t};\n\n\t// `ToPrimitive` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-toprimitive\n\t// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n\t// and the second argument - flag - preferred type is a string\n\tvar toPrimitive = function (input, PREFERRED_STRING) {\n\t  if (!isObject(input)) return input;\n\t  var fn, val;\n\t  if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n\t  if (typeof (fn = input.valueOf) == 'function' && !isObject(val = fn.call(input))) return val;\n\t  if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n\t  throw TypeError(\"Can't convert object to primitive value\");\n\t};\n\n\tvar hasOwnProperty = {}.hasOwnProperty;\n\n\tvar has = function (it, key) {\n\t  return hasOwnProperty.call(it, key);\n\t};\n\n\tvar document$1 = global_1.document;\n\t// typeof document.createElement is 'object' in old IE\n\tvar EXISTS = isObject(document$1) && isObject(document$1.createElement);\n\n\tvar documentCreateElement = function (it) {\n\t  return EXISTS ? document$1.createElement(it) : {};\n\t};\n\n\t// Thank's IE8 for his funny defineProperty\n\tvar ie8DomDefine = !descriptors && !fails(function () {\n\t  return Object.defineProperty(documentCreateElement('div'), 'a', {\n\t    get: function () { return 7; }\n\t  }).a != 7;\n\t});\n\n\tvar nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n\t// `Object.getOwnPropertyDescriptor` method\n\t// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\n\tvar f$1 = descriptors ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n\t  O = toIndexedObject(O);\n\t  P = toPrimitive(P, true);\n\t  if (ie8DomDefine) try {\n\t    return nativeGetOwnPropertyDescriptor(O, P);\n\t  } catch (error) { /* empty */ }\n\t  if (has(O, P)) return createPropertyDescriptor(!objectPropertyIsEnumerable.f.call(O, P), O[P]);\n\t};\n\n\tvar objectGetOwnPropertyDescriptor = {\n\t\tf: f$1\n\t};\n\n\tvar anObject = function (it) {\n\t  if (!isObject(it)) {\n\t    throw TypeError(String(it) + ' is not an object');\n\t  } return it;\n\t};\n\n\tvar nativeDefineProperty = Object.defineProperty;\n\n\t// `Object.defineProperty` method\n\t// https://tc39.github.io/ecma262/#sec-object.defineproperty\n\tvar f$2 = descriptors ? nativeDefineProperty : function defineProperty(O, P, Attributes) {\n\t  anObject(O);\n\t  P = toPrimitive(P, true);\n\t  anObject(Attributes);\n\t  if (ie8DomDefine) try {\n\t    return nativeDefineProperty(O, P, Attributes);\n\t  } catch (error) { /* empty */ }\n\t  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported');\n\t  if ('value' in Attributes) O[P] = Attributes.value;\n\t  return O;\n\t};\n\n\tvar objectDefineProperty = {\n\t\tf: f$2\n\t};\n\n\tvar hide = descriptors ? function (object, key, value) {\n\t  return objectDefineProperty.f(object, key, createPropertyDescriptor(1, value));\n\t} : function (object, key, value) {\n\t  object[key] = value;\n\t  return object;\n\t};\n\n\tvar setGlobal = function (key, value) {\n\t  try {\n\t    hide(global_1, key, value);\n\t  } catch (error) {\n\t    global_1[key] = value;\n\t  } return value;\n\t};\n\n\tvar shared = createCommonjsModule(function (module) {\n\tvar SHARED = '__core-js_shared__';\n\tvar store = global_1[SHARED] || setGlobal(SHARED, {});\n\n\t(module.exports = function (key, value) {\n\t  return store[key] || (store[key] = value !== undefined ? value : {});\n\t})('versions', []).push({\n\t  version: '3.1.3',\n\t  mode:  'global',\n\t  copyright: '© 2019 Denis Pushkarev (zloirock.ru)'\n\t});\n\t});\n\n\tvar functionToString = shared('native-function-to-string', Function.toString);\n\n\tvar WeakMap = global_1.WeakMap;\n\n\tvar nativeWeakMap = typeof WeakMap === 'function' && /native code/.test(functionToString.call(WeakMap));\n\n\tvar id = 0;\n\tvar postfix = Math.random();\n\n\tvar uid = function (key) {\n\t  return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36);\n\t};\n\n\tvar keys = shared('keys');\n\n\tvar sharedKey = function (key) {\n\t  return keys[key] || (keys[key] = uid(key));\n\t};\n\n\tvar hiddenKeys = {};\n\n\tvar WeakMap$1 = global_1.WeakMap;\n\tvar set, get, has$1;\n\n\tvar enforce = function (it) {\n\t  return has$1(it) ? get(it) : set(it, {});\n\t};\n\n\tvar getterFor = function (TYPE) {\n\t  return function (it) {\n\t    var state;\n\t    if (!isObject(it) || (state = get(it)).type !== TYPE) {\n\t      throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n\t    } return state;\n\t  };\n\t};\n\n\tif (nativeWeakMap) {\n\t  var store = new WeakMap$1();\n\t  var wmget = store.get;\n\t  var wmhas = store.has;\n\t  var wmset = store.set;\n\t  set = function (it, metadata) {\n\t    wmset.call(store, it, metadata);\n\t    return metadata;\n\t  };\n\t  get = function (it) {\n\t    return wmget.call(store, it) || {};\n\t  };\n\t  has$1 = function (it) {\n\t    return wmhas.call(store, it);\n\t  };\n\t} else {\n\t  var STATE = sharedKey('state');\n\t  hiddenKeys[STATE] = true;\n\t  set = function (it, metadata) {\n\t    hide(it, STATE, metadata);\n\t    return metadata;\n\t  };\n\t  get = function (it) {\n\t    return has(it, STATE) ? it[STATE] : {};\n\t  };\n\t  has$1 = function (it) {\n\t    return has(it, STATE);\n\t  };\n\t}\n\n\tvar internalState = {\n\t  set: set,\n\t  get: get,\n\t  has: has$1,\n\t  enforce: enforce,\n\t  getterFor: getterFor\n\t};\n\n\tvar redefine = createCommonjsModule(function (module) {\n\tvar getInternalState = internalState.get;\n\tvar enforceInternalState = internalState.enforce;\n\tvar TEMPLATE = String(functionToString).split('toString');\n\n\tshared('inspectSource', function (it) {\n\t  return functionToString.call(it);\n\t});\n\n\t(module.exports = function (O, key, value, options) {\n\t  var unsafe = options ? !!options.unsafe : false;\n\t  var simple = options ? !!options.enumerable : false;\n\t  var noTargetGet = options ? !!options.noTargetGet : false;\n\t  if (typeof value == 'function') {\n\t    if (typeof key == 'string' && !has(value, 'name')) hide(value, 'name', key);\n\t    enforceInternalState(value).source = TEMPLATE.join(typeof key == 'string' ? key : '');\n\t  }\n\t  if (O === global_1) {\n\t    if (simple) O[key] = value;\n\t    else setGlobal(key, value);\n\t    return;\n\t  } else if (!unsafe) {\n\t    delete O[key];\n\t  } else if (!noTargetGet && O[key]) {\n\t    simple = true;\n\t  }\n\t  if (simple) O[key] = value;\n\t  else hide(O, key, value);\n\t// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n\t})(Function.prototype, 'toString', function toString() {\n\t  return typeof this == 'function' && getInternalState(this).source || functionToString.call(this);\n\t});\n\t});\n\n\tvar path = global_1;\n\n\tvar aFunction = function (variable) {\n\t  return typeof variable == 'function' ? variable : undefined;\n\t};\n\n\tvar getBuiltIn = function (namespace, method) {\n\t  return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global_1[namespace])\n\t    : path[namespace] && path[namespace][method] || global_1[namespace] && global_1[namespace][method];\n\t};\n\n\tvar ceil = Math.ceil;\n\tvar floor = Math.floor;\n\n\t// `ToInteger` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-tointeger\n\tvar toInteger = function (argument) {\n\t  return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument);\n\t};\n\n\tvar min = Math.min;\n\n\t// `ToLength` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-tolength\n\tvar toLength = function (argument) {\n\t  return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n\t};\n\n\tvar max = Math.max;\n\tvar min$1 = Math.min;\n\n\t// Helper for a popular repeating case of the spec:\n\t// Let integer be ? ToInteger(index).\n\t// If integer < 0, let result be max((length + integer), 0); else let result be min(length, length).\n\tvar toAbsoluteIndex = function (index, length) {\n\t  var integer = toInteger(index);\n\t  return integer < 0 ? max(integer + length, 0) : min$1(integer, length);\n\t};\n\n\t// `Array.prototype.{ indexOf, includes }` methods implementation\n\tvar createMethod = function (IS_INCLUDES) {\n\t  return function ($this, el, fromIndex) {\n\t    var O = toIndexedObject($this);\n\t    var length = toLength(O.length);\n\t    var index = toAbsoluteIndex(fromIndex, length);\n\t    var value;\n\t    // Array#includes uses SameValueZero equality algorithm\n\t    // eslint-disable-next-line no-self-compare\n\t    if (IS_INCLUDES && el != el) while (length > index) {\n\t      value = O[index++];\n\t      // eslint-disable-next-line no-self-compare\n\t      if (value != value) return true;\n\t    // Array#indexOf ignores holes, Array#includes - not\n\t    } else for (;length > index; index++) {\n\t      if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n\t    } return !IS_INCLUDES && -1;\n\t  };\n\t};\n\n\tvar arrayIncludes = {\n\t  // `Array.prototype.includes` method\n\t  // https://tc39.github.io/ecma262/#sec-array.prototype.includes\n\t  includes: createMethod(true),\n\t  // `Array.prototype.indexOf` method\n\t  // https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n\t  indexOf: createMethod(false)\n\t};\n\n\tvar indexOf = arrayIncludes.indexOf;\n\n\n\tvar objectKeysInternal = function (object, names) {\n\t  var O = toIndexedObject(object);\n\t  var i = 0;\n\t  var result = [];\n\t  var key;\n\t  for (key in O) !has(hiddenKeys, key) && has(O, key) && result.push(key);\n\t  // Don't enum bug & hidden keys\n\t  while (names.length > i) if (has(O, key = names[i++])) {\n\t    ~indexOf(result, key) || result.push(key);\n\t  }\n\t  return result;\n\t};\n\n\t// IE8- don't enum bug keys\n\tvar enumBugKeys = [\n\t  'constructor',\n\t  'hasOwnProperty',\n\t  'isPrototypeOf',\n\t  'propertyIsEnumerable',\n\t  'toLocaleString',\n\t  'toString',\n\t  'valueOf'\n\t];\n\n\tvar hiddenKeys$1 = enumBugKeys.concat('length', 'prototype');\n\n\t// `Object.getOwnPropertyNames` method\n\t// https://tc39.github.io/ecma262/#sec-object.getownpropertynames\n\tvar f$3 = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n\t  return objectKeysInternal(O, hiddenKeys$1);\n\t};\n\n\tvar objectGetOwnPropertyNames = {\n\t\tf: f$3\n\t};\n\n\tvar f$4 = Object.getOwnPropertySymbols;\n\n\tvar objectGetOwnPropertySymbols = {\n\t\tf: f$4\n\t};\n\n\t// all object keys, includes non-enumerable and symbols\n\tvar ownKeys = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n\t  var keys = objectGetOwnPropertyNames.f(anObject(it));\n\t  var getOwnPropertySymbols = objectGetOwnPropertySymbols.f;\n\t  return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;\n\t};\n\n\tvar copyConstructorProperties = function (target, source) {\n\t  var keys = ownKeys(source);\n\t  var defineProperty = objectDefineProperty.f;\n\t  var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;\n\t  for (var i = 0; i < keys.length; i++) {\n\t    var key = keys[i];\n\t    if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n\t  }\n\t};\n\n\tvar replacement = /#|\\.prototype\\./;\n\n\tvar isForced = function (feature, detection) {\n\t  var value = data[normalize(feature)];\n\t  return value == POLYFILL ? true\n\t    : value == NATIVE ? false\n\t    : typeof detection == 'function' ? fails(detection)\n\t    : !!detection;\n\t};\n\n\tvar normalize = isForced.normalize = function (string) {\n\t  return String(string).replace(replacement, '.').toLowerCase();\n\t};\n\n\tvar data = isForced.data = {};\n\tvar NATIVE = isForced.NATIVE = 'N';\n\tvar POLYFILL = isForced.POLYFILL = 'P';\n\n\tvar isForced_1 = isForced;\n\n\tvar getOwnPropertyDescriptor$1 = objectGetOwnPropertyDescriptor.f;\n\n\n\n\n\n\n\t/*\n\t  options.target      - name of the target object\n\t  options.global      - target is the global object\n\t  options.stat        - export as static methods of target\n\t  options.proto       - export as prototype methods of target\n\t  options.real        - real prototype method for the `pure` version\n\t  options.forced      - export even if the native feature is available\n\t  options.bind        - bind methods to the target, required for the `pure` version\n\t  options.wrap        - wrap constructors to preventing global pollution, required for the `pure` version\n\t  options.unsafe      - use the simple assignment of property instead of delete + defineProperty\n\t  options.sham        - add a flag to not completely full polyfills\n\t  options.enumerable  - export as enumerable property\n\t  options.noTargetGet - prevent calling a getter on target\n\t*/\n\tvar _export = function (options, source) {\n\t  var TARGET = options.target;\n\t  var GLOBAL = options.global;\n\t  var STATIC = options.stat;\n\t  var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n\t  if (GLOBAL) {\n\t    target = global_1;\n\t  } else if (STATIC) {\n\t    target = global_1[TARGET] || setGlobal(TARGET, {});\n\t  } else {\n\t    target = (global_1[TARGET] || {}).prototype;\n\t  }\n\t  if (target) for (key in source) {\n\t    sourceProperty = source[key];\n\t    if (options.noTargetGet) {\n\t      descriptor = getOwnPropertyDescriptor$1(target, key);\n\t      targetProperty = descriptor && descriptor.value;\n\t    } else targetProperty = target[key];\n\t    FORCED = isForced_1(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n\t    // contained in target\n\t    if (!FORCED && targetProperty !== undefined) {\n\t      if (typeof sourceProperty === typeof targetProperty) continue;\n\t      copyConstructorProperties(sourceProperty, targetProperty);\n\t    }\n\t    // add a flag to not completely full polyfills\n\t    if (options.sham || (targetProperty && targetProperty.sham)) {\n\t      hide(sourceProperty, 'sham', true);\n\t    }\n\t    // extend global\n\t    redefine(target, key, sourceProperty, options);\n\t  }\n\t};\n\n\tvar nativeSymbol = !!Object.getOwnPropertySymbols && !fails(function () {\n\t  // Chrome 38 Symbol has incorrect toString conversion\n\t  // eslint-disable-next-line no-undef\n\t  return !String(Symbol());\n\t});\n\n\t// `IsArray` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-isarray\n\tvar isArray = Array.isArray || function isArray(arg) {\n\t  return classofRaw(arg) == 'Array';\n\t};\n\n\t// `ToObject` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-toobject\n\tvar toObject = function (argument) {\n\t  return Object(requireObjectCoercible(argument));\n\t};\n\n\t// `Object.keys` method\n\t// https://tc39.github.io/ecma262/#sec-object.keys\n\tvar objectKeys = Object.keys || function keys(O) {\n\t  return objectKeysInternal(O, enumBugKeys);\n\t};\n\n\t// `Object.defineProperties` method\n\t// https://tc39.github.io/ecma262/#sec-object.defineproperties\n\tvar objectDefineProperties = descriptors ? Object.defineProperties : function defineProperties(O, Properties) {\n\t  anObject(O);\n\t  var keys = objectKeys(Properties);\n\t  var length = keys.length;\n\t  var index = 0;\n\t  var key;\n\t  while (length > index) objectDefineProperty.f(O, key = keys[index++], Properties[key]);\n\t  return O;\n\t};\n\n\tvar html = getBuiltIn('document', 'documentElement');\n\n\tvar IE_PROTO = sharedKey('IE_PROTO');\n\n\tvar PROTOTYPE = 'prototype';\n\tvar Empty = function () { /* empty */ };\n\n\t// Create object with fake `null` prototype: use iframe Object with cleared prototype\n\tvar createDict = function () {\n\t  // Thrash, waste and sodomy: IE GC bug\n\t  var iframe = documentCreateElement('iframe');\n\t  var length = enumBugKeys.length;\n\t  var lt = '<';\n\t  var script = 'script';\n\t  var gt = '>';\n\t  var js = 'java' + script + ':';\n\t  var iframeDocument;\n\t  iframe.style.display = 'none';\n\t  html.appendChild(iframe);\n\t  iframe.src = String(js);\n\t  iframeDocument = iframe.contentWindow.document;\n\t  iframeDocument.open();\n\t  iframeDocument.write(lt + script + gt + 'document.F=Object' + lt + '/' + script + gt);\n\t  iframeDocument.close();\n\t  createDict = iframeDocument.F;\n\t  while (length--) delete createDict[PROTOTYPE][enumBugKeys[length]];\n\t  return createDict();\n\t};\n\n\t// `Object.create` method\n\t// https://tc39.github.io/ecma262/#sec-object.create\n\tvar objectCreate = Object.create || function create(O, Properties) {\n\t  var result;\n\t  if (O !== null) {\n\t    Empty[PROTOTYPE] = anObject(O);\n\t    result = new Empty();\n\t    Empty[PROTOTYPE] = null;\n\t    // add \"__proto__\" for Object.getPrototypeOf polyfill\n\t    result[IE_PROTO] = O;\n\t  } else result = createDict();\n\t  return Properties === undefined ? result : objectDefineProperties(result, Properties);\n\t};\n\n\thiddenKeys[IE_PROTO] = true;\n\n\tvar nativeGetOwnPropertyNames = objectGetOwnPropertyNames.f;\n\n\tvar toString$1 = {}.toString;\n\n\tvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n\t  ? Object.getOwnPropertyNames(window) : [];\n\n\tvar getWindowNames = function (it) {\n\t  try {\n\t    return nativeGetOwnPropertyNames(it);\n\t  } catch (error) {\n\t    return windowNames.slice();\n\t  }\n\t};\n\n\t// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\n\tvar f$5 = function getOwnPropertyNames(it) {\n\t  return windowNames && toString$1.call(it) == '[object Window]'\n\t    ? getWindowNames(it)\n\t    : nativeGetOwnPropertyNames(toIndexedObject(it));\n\t};\n\n\tvar objectGetOwnPropertyNamesExternal = {\n\t\tf: f$5\n\t};\n\n\tvar Symbol$1 = global_1.Symbol;\n\tvar store$1 = shared('wks');\n\n\tvar wellKnownSymbol = function (name) {\n\t  return store$1[name] || (store$1[name] = nativeSymbol && Symbol$1[name]\n\t    || (nativeSymbol ? Symbol$1 : uid)('Symbol.' + name));\n\t};\n\n\tvar f$6 = wellKnownSymbol;\n\n\tvar wrappedWellKnownSymbol = {\n\t\tf: f$6\n\t};\n\n\tvar defineProperty = objectDefineProperty.f;\n\n\tvar defineWellKnownSymbol = function (NAME) {\n\t  var Symbol = path.Symbol || (path.Symbol = {});\n\t  if (!has(Symbol, NAME)) defineProperty(Symbol, NAME, {\n\t    value: wrappedWellKnownSymbol.f(NAME)\n\t  });\n\t};\n\n\tvar defineProperty$1 = objectDefineProperty.f;\n\n\n\n\tvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\n\tvar setToStringTag = function (it, TAG, STATIC) {\n\t  if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG)) {\n\t    defineProperty$1(it, TO_STRING_TAG, { configurable: true, value: TAG });\n\t  }\n\t};\n\n\tvar aFunction$1 = function (it) {\n\t  if (typeof it != 'function') {\n\t    throw TypeError(String(it) + ' is not a function');\n\t  } return it;\n\t};\n\n\t// optional / simple context binding\n\tvar bindContext = function (fn, that, length) {\n\t  aFunction$1(fn);\n\t  if (that === undefined) return fn;\n\t  switch (length) {\n\t    case 0: return function () {\n\t      return fn.call(that);\n\t    };\n\t    case 1: return function (a) {\n\t      return fn.call(that, a);\n\t    };\n\t    case 2: return function (a, b) {\n\t      return fn.call(that, a, b);\n\t    };\n\t    case 3: return function (a, b, c) {\n\t      return fn.call(that, a, b, c);\n\t    };\n\t  }\n\t  return function (/* ...args */) {\n\t    return fn.apply(that, arguments);\n\t  };\n\t};\n\n\tvar SPECIES = wellKnownSymbol('species');\n\n\t// `ArraySpeciesCreate` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-arrayspeciescreate\n\tvar arraySpeciesCreate = function (originalArray, length) {\n\t  var C;\n\t  if (isArray(originalArray)) {\n\t    C = originalArray.constructor;\n\t    // cross-realm fallback\n\t    if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n\t    else if (isObject(C)) {\n\t      C = C[SPECIES];\n\t      if (C === null) C = undefined;\n\t    }\n\t  } return new (C === undefined ? Array : C)(length === 0 ? 0 : length);\n\t};\n\n\tvar push = [].push;\n\n\t// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex }` methods implementation\n\tvar createMethod$1 = function (TYPE) {\n\t  var IS_MAP = TYPE == 1;\n\t  var IS_FILTER = TYPE == 2;\n\t  var IS_SOME = TYPE == 3;\n\t  var IS_EVERY = TYPE == 4;\n\t  var IS_FIND_INDEX = TYPE == 6;\n\t  var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n\t  return function ($this, callbackfn, that, specificCreate) {\n\t    var O = toObject($this);\n\t    var self = indexedObject(O);\n\t    var boundFunction = bindContext(callbackfn, that, 3);\n\t    var length = toLength(self.length);\n\t    var index = 0;\n\t    var create = specificCreate || arraySpeciesCreate;\n\t    var target = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n\t    var value, result;\n\t    for (;length > index; index++) if (NO_HOLES || index in self) {\n\t      value = self[index];\n\t      result = boundFunction(value, index, O);\n\t      if (TYPE) {\n\t        if (IS_MAP) target[index] = result; // map\n\t        else if (result) switch (TYPE) {\n\t          case 3: return true;              // some\n\t          case 5: return value;             // find\n\t          case 6: return index;             // findIndex\n\t          case 2: push.call(target, value); // filter\n\t        } else if (IS_EVERY) return false;  // every\n\t      }\n\t    }\n\t    return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;\n\t  };\n\t};\n\n\tvar arrayIteration = {\n\t  // `Array.prototype.forEach` method\n\t  // https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n\t  forEach: createMethod$1(0),\n\t  // `Array.prototype.map` method\n\t  // https://tc39.github.io/ecma262/#sec-array.prototype.map\n\t  map: createMethod$1(1),\n\t  // `Array.prototype.filter` method\n\t  // https://tc39.github.io/ecma262/#sec-array.prototype.filter\n\t  filter: createMethod$1(2),\n\t  // `Array.prototype.some` method\n\t  // https://tc39.github.io/ecma262/#sec-array.prototype.some\n\t  some: createMethod$1(3),\n\t  // `Array.prototype.every` method\n\t  // https://tc39.github.io/ecma262/#sec-array.prototype.every\n\t  every: createMethod$1(4),\n\t  // `Array.prototype.find` method\n\t  // https://tc39.github.io/ecma262/#sec-array.prototype.find\n\t  find: createMethod$1(5),\n\t  // `Array.prototype.findIndex` method\n\t  // https://tc39.github.io/ecma262/#sec-array.prototype.findIndex\n\t  findIndex: createMethod$1(6)\n\t};\n\n\tvar $forEach = arrayIteration.forEach;\n\n\tvar HIDDEN = sharedKey('hidden');\n\tvar SYMBOL = 'Symbol';\n\tvar PROTOTYPE$1 = 'prototype';\n\tvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\n\tvar setInternalState = internalState.set;\n\tvar getInternalState = internalState.getterFor(SYMBOL);\n\tvar ObjectPrototype = Object[PROTOTYPE$1];\n\tvar $Symbol = global_1.Symbol;\n\tvar JSON$1 = global_1.JSON;\n\tvar nativeJSONStringify = JSON$1 && JSON$1.stringify;\n\tvar nativeGetOwnPropertyDescriptor$1 = objectGetOwnPropertyDescriptor.f;\n\tvar nativeDefineProperty$1 = objectDefineProperty.f;\n\tvar nativeGetOwnPropertyNames$1 = objectGetOwnPropertyNamesExternal.f;\n\tvar nativePropertyIsEnumerable$1 = objectPropertyIsEnumerable.f;\n\tvar AllSymbols = shared('symbols');\n\tvar ObjectPrototypeSymbols = shared('op-symbols');\n\tvar StringToSymbolRegistry = shared('string-to-symbol-registry');\n\tvar SymbolToStringRegistry = shared('symbol-to-string-registry');\n\tvar WellKnownSymbolsStore = shared('wks');\n\tvar QObject = global_1.QObject;\n\t// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\n\tvar USE_SETTER = !QObject || !QObject[PROTOTYPE$1] || !QObject[PROTOTYPE$1].findChild;\n\n\t// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\n\tvar setSymbolDescriptor = descriptors && fails(function () {\n\t  return objectCreate(nativeDefineProperty$1({}, 'a', {\n\t    get: function () { return nativeDefineProperty$1(this, 'a', { value: 7 }).a; }\n\t  })).a != 7;\n\t}) ? function (O, P, Attributes) {\n\t  var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor$1(ObjectPrototype, P);\n\t  if (ObjectPrototypeDescriptor) delete ObjectPrototype[P];\n\t  nativeDefineProperty$1(O, P, Attributes);\n\t  if (ObjectPrototypeDescriptor && O !== ObjectPrototype) {\n\t    nativeDefineProperty$1(ObjectPrototype, P, ObjectPrototypeDescriptor);\n\t  }\n\t} : nativeDefineProperty$1;\n\n\tvar wrap = function (tag, description) {\n\t  var symbol = AllSymbols[tag] = objectCreate($Symbol[PROTOTYPE$1]);\n\t  setInternalState(symbol, {\n\t    type: SYMBOL,\n\t    tag: tag,\n\t    description: description\n\t  });\n\t  if (!descriptors) symbol.description = description;\n\t  return symbol;\n\t};\n\n\tvar isSymbol = nativeSymbol && typeof $Symbol.iterator == 'symbol' ? function (it) {\n\t  return typeof it == 'symbol';\n\t} : function (it) {\n\t  return Object(it) instanceof $Symbol;\n\t};\n\n\tvar $defineProperty = function defineProperty(O, P, Attributes) {\n\t  if (O === ObjectPrototype) $defineProperty(ObjectPrototypeSymbols, P, Attributes);\n\t  anObject(O);\n\t  var key = toPrimitive(P, true);\n\t  anObject(Attributes);\n\t  if (has(AllSymbols, key)) {\n\t    if (!Attributes.enumerable) {\n\t      if (!has(O, HIDDEN)) nativeDefineProperty$1(O, HIDDEN, createPropertyDescriptor(1, {}));\n\t      O[HIDDEN][key] = true;\n\t    } else {\n\t      if (has(O, HIDDEN) && O[HIDDEN][key]) O[HIDDEN][key] = false;\n\t      Attributes = objectCreate(Attributes, { enumerable: createPropertyDescriptor(0, false) });\n\t    } return setSymbolDescriptor(O, key, Attributes);\n\t  } return nativeDefineProperty$1(O, key, Attributes);\n\t};\n\n\tvar $defineProperties = function defineProperties(O, Properties) {\n\t  anObject(O);\n\t  var properties = toIndexedObject(Properties);\n\t  var keys = objectKeys(properties).concat($getOwnPropertySymbols(properties));\n\t  $forEach(keys, function (key) {\n\t    if (!descriptors || $propertyIsEnumerable.call(properties, key)) $defineProperty(O, key, properties[key]);\n\t  });\n\t  return O;\n\t};\n\n\tvar $create = function create(O, Properties) {\n\t  return Properties === undefined ? objectCreate(O) : $defineProperties(objectCreate(O), Properties);\n\t};\n\n\tvar $propertyIsEnumerable = function propertyIsEnumerable(V) {\n\t  var P = toPrimitive(V, true);\n\t  var enumerable = nativePropertyIsEnumerable$1.call(this, P);\n\t  if (this === ObjectPrototype && has(AllSymbols, P) && !has(ObjectPrototypeSymbols, P)) return false;\n\t  return enumerable || !has(this, P) || !has(AllSymbols, P) || has(this, HIDDEN) && this[HIDDEN][P] ? enumerable : true;\n\t};\n\n\tvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(O, P) {\n\t  var it = toIndexedObject(O);\n\t  var key = toPrimitive(P, true);\n\t  if (it === ObjectPrototype && has(AllSymbols, key) && !has(ObjectPrototypeSymbols, key)) return;\n\t  var descriptor = nativeGetOwnPropertyDescriptor$1(it, key);\n\t  if (descriptor && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) {\n\t    descriptor.enumerable = true;\n\t  }\n\t  return descriptor;\n\t};\n\n\tvar $getOwnPropertyNames = function getOwnPropertyNames(O) {\n\t  var names = nativeGetOwnPropertyNames$1(toIndexedObject(O));\n\t  var result = [];\n\t  $forEach(names, function (key) {\n\t    if (!has(AllSymbols, key) && !has(hiddenKeys, key)) result.push(key);\n\t  });\n\t  return result;\n\t};\n\n\tvar $getOwnPropertySymbols = function getOwnPropertySymbols(O) {\n\t  var IS_OBJECT_PROTOTYPE = O === ObjectPrototype;\n\t  var names = nativeGetOwnPropertyNames$1(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols : toIndexedObject(O));\n\t  var result = [];\n\t  $forEach(names, function (key) {\n\t    if (has(AllSymbols, key) && (!IS_OBJECT_PROTOTYPE || has(ObjectPrototype, key))) {\n\t      result.push(AllSymbols[key]);\n\t    }\n\t  });\n\t  return result;\n\t};\n\n\t// `Symbol` constructor\n\t// https://tc39.github.io/ecma262/#sec-symbol-constructor\n\tif (!nativeSymbol) {\n\t  $Symbol = function Symbol() {\n\t    if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor');\n\t    var description = !arguments.length || arguments[0] === undefined ? undefined : String(arguments[0]);\n\t    var tag = uid(description);\n\t    var setter = function (value) {\n\t      if (this === ObjectPrototype) setter.call(ObjectPrototypeSymbols, value);\n\t      if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n\t      setSymbolDescriptor(this, tag, createPropertyDescriptor(1, value));\n\t    };\n\t    if (descriptors && USE_SETTER) setSymbolDescriptor(ObjectPrototype, tag, { configurable: true, set: setter });\n\t    return wrap(tag, description);\n\t  };\n\n\t  redefine($Symbol[PROTOTYPE$1], 'toString', function toString() {\n\t    return getInternalState(this).tag;\n\t  });\n\n\t  objectPropertyIsEnumerable.f = $propertyIsEnumerable;\n\t  objectDefineProperty.f = $defineProperty;\n\t  objectGetOwnPropertyDescriptor.f = $getOwnPropertyDescriptor;\n\t  objectGetOwnPropertyNames.f = objectGetOwnPropertyNamesExternal.f = $getOwnPropertyNames;\n\t  objectGetOwnPropertySymbols.f = $getOwnPropertySymbols;\n\n\t  if (descriptors) {\n\t    // https://github.com/tc39/proposal-Symbol-description\n\t    nativeDefineProperty$1($Symbol[PROTOTYPE$1], 'description', {\n\t      configurable: true,\n\t      get: function description() {\n\t        return getInternalState(this).description;\n\t      }\n\t    });\n\t    {\n\t      redefine(ObjectPrototype, 'propertyIsEnumerable', $propertyIsEnumerable, { unsafe: true });\n\t    }\n\t  }\n\n\t  wrappedWellKnownSymbol.f = function (name) {\n\t    return wrap(wellKnownSymbol(name), name);\n\t  };\n\t}\n\n\t_export({ global: true, wrap: true, forced: !nativeSymbol, sham: !nativeSymbol }, {\n\t  Symbol: $Symbol\n\t});\n\n\t$forEach(objectKeys(WellKnownSymbolsStore), function (name) {\n\t  defineWellKnownSymbol(name);\n\t});\n\n\t_export({ target: SYMBOL, stat: true, forced: !nativeSymbol }, {\n\t  // `Symbol.for` method\n\t  // https://tc39.github.io/ecma262/#sec-symbol.for\n\t  'for': function (key) {\n\t    var string = String(key);\n\t    if (has(StringToSymbolRegistry, string)) return StringToSymbolRegistry[string];\n\t    var symbol = $Symbol(string);\n\t    StringToSymbolRegistry[string] = symbol;\n\t    SymbolToStringRegistry[symbol] = string;\n\t    return symbol;\n\t  },\n\t  // `Symbol.keyFor` method\n\t  // https://tc39.github.io/ecma262/#sec-symbol.keyfor\n\t  keyFor: function keyFor(sym) {\n\t    if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol');\n\t    if (has(SymbolToStringRegistry, sym)) return SymbolToStringRegistry[sym];\n\t  },\n\t  useSetter: function () { USE_SETTER = true; },\n\t  useSimple: function () { USE_SETTER = false; }\n\t});\n\n\t_export({ target: 'Object', stat: true, forced: !nativeSymbol, sham: !descriptors }, {\n\t  // `Object.create` method\n\t  // https://tc39.github.io/ecma262/#sec-object.create\n\t  create: $create,\n\t  // `Object.defineProperty` method\n\t  // https://tc39.github.io/ecma262/#sec-object.defineproperty\n\t  defineProperty: $defineProperty,\n\t  // `Object.defineProperties` method\n\t  // https://tc39.github.io/ecma262/#sec-object.defineproperties\n\t  defineProperties: $defineProperties,\n\t  // `Object.getOwnPropertyDescriptor` method\n\t  // https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors\n\t  getOwnPropertyDescriptor: $getOwnPropertyDescriptor\n\t});\n\n\t_export({ target: 'Object', stat: true, forced: !nativeSymbol }, {\n\t  // `Object.getOwnPropertyNames` method\n\t  // https://tc39.github.io/ecma262/#sec-object.getownpropertynames\n\t  getOwnPropertyNames: $getOwnPropertyNames,\n\t  // `Object.getOwnPropertySymbols` method\n\t  // https://tc39.github.io/ecma262/#sec-object.getownpropertysymbols\n\t  getOwnPropertySymbols: $getOwnPropertySymbols\n\t});\n\n\t// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives\n\t// https://bugs.chromium.org/p/v8/issues/detail?id=3443\n\t_export({ target: 'Object', stat: true, forced: fails(function () { objectGetOwnPropertySymbols.f(1); }) }, {\n\t  getOwnPropertySymbols: function getOwnPropertySymbols(it) {\n\t    return objectGetOwnPropertySymbols.f(toObject(it));\n\t  }\n\t});\n\n\t// `JSON.stringify` method behavior with symbols\n\t// https://tc39.github.io/ecma262/#sec-json.stringify\n\tJSON$1 && _export({ target: 'JSON', stat: true, forced: !nativeSymbol || fails(function () {\n\t  var symbol = $Symbol();\n\t  // MS Edge converts symbol values to JSON as {}\n\t  return nativeJSONStringify([symbol]) != '[null]'\n\t    // WebKit converts symbol values to JSON as null\n\t    || nativeJSONStringify({ a: symbol }) != '{}'\n\t    // V8 throws on boxed symbols\n\t    || nativeJSONStringify(Object(symbol)) != '{}';\n\t}) }, {\n\t  stringify: function stringify(it) {\n\t    var args = [it];\n\t    var index = 1;\n\t    var replacer, $replacer;\n\t    while (arguments.length > index) args.push(arguments[index++]);\n\t    $replacer = replacer = args[1];\n\t    if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n\t    if (!isArray(replacer)) replacer = function (key, value) {\n\t      if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n\t      if (!isSymbol(value)) return value;\n\t    };\n\t    args[1] = replacer;\n\t    return nativeJSONStringify.apply(JSON$1, args);\n\t  }\n\t});\n\n\t// `Symbol.prototype[@@toPrimitive]` method\n\t// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@toprimitive\n\tif (!$Symbol[PROTOTYPE$1][TO_PRIMITIVE]) hide($Symbol[PROTOTYPE$1], TO_PRIMITIVE, $Symbol[PROTOTYPE$1].valueOf);\n\t// `Symbol.prototype[@@toStringTag]` property\n\t// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@tostringtag\n\tsetToStringTag($Symbol, SYMBOL);\n\n\thiddenKeys[HIDDEN] = true;\n\n\tvar defineProperty$2 = objectDefineProperty.f;\n\n\n\tvar NativeSymbol = global_1.Symbol;\n\n\tif (descriptors && typeof NativeSymbol == 'function' && (!('description' in NativeSymbol.prototype) ||\n\t  // Safari 12 bug\n\t  NativeSymbol().description !== undefined\n\t)) {\n\t  var EmptyStringDescriptionStore = {};\n\t  // wrap Symbol constructor for correct work with undefined description\n\t  var SymbolWrapper = function Symbol() {\n\t    var description = arguments.length < 1 || arguments[0] === undefined ? undefined : String(arguments[0]);\n\t    var result = this instanceof SymbolWrapper\n\t      ? new NativeSymbol(description)\n\t      // in Edge 13, String(Symbol(undefined)) === 'Symbol(undefined)'\n\t      : description === undefined ? NativeSymbol() : NativeSymbol(description);\n\t    if (description === '') EmptyStringDescriptionStore[result] = true;\n\t    return result;\n\t  };\n\t  copyConstructorProperties(SymbolWrapper, NativeSymbol);\n\t  var symbolPrototype = SymbolWrapper.prototype = NativeSymbol.prototype;\n\t  symbolPrototype.constructor = SymbolWrapper;\n\n\t  var symbolToString = symbolPrototype.toString;\n\t  var native = String(NativeSymbol('test')) == 'Symbol(test)';\n\t  var regexp = /^Symbol\\((.*)\\)[^)]+$/;\n\t  defineProperty$2(symbolPrototype, 'description', {\n\t    configurable: true,\n\t    get: function description() {\n\t      var symbol = isObject(this) ? this.valueOf() : this;\n\t      var string = symbolToString.call(symbol);\n\t      if (has(EmptyStringDescriptionStore, symbol)) return '';\n\t      var desc = native ? string.slice(7, -1) : string.replace(regexp, '$1');\n\t      return desc === '' ? undefined : desc;\n\t    }\n\t  });\n\n\t  _export({ global: true, forced: true }, {\n\t    Symbol: SymbolWrapper\n\t  });\n\t}\n\n\t// `Symbol.iterator` well-known symbol\n\t// https://tc39.github.io/ecma262/#sec-symbol.iterator\n\tdefineWellKnownSymbol('iterator');\n\n\tvar createProperty = function (object, key, value) {\n\t  var propertyKey = toPrimitive(key);\n\t  if (propertyKey in object) objectDefineProperty.f(object, propertyKey, createPropertyDescriptor(0, value));\n\t  else object[propertyKey] = value;\n\t};\n\n\tvar SPECIES$1 = wellKnownSymbol('species');\n\n\tvar arrayMethodHasSpeciesSupport = function (METHOD_NAME) {\n\t  return !fails(function () {\n\t    var array = [];\n\t    var constructor = array.constructor = {};\n\t    constructor[SPECIES$1] = function () {\n\t      return { foo: 1 };\n\t    };\n\t    return array[METHOD_NAME](Boolean).foo !== 1;\n\t  });\n\t};\n\n\tvar IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable');\n\tvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\n\tvar MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded';\n\n\tvar IS_CONCAT_SPREADABLE_SUPPORT = !fails(function () {\n\t  var array = [];\n\t  array[IS_CONCAT_SPREADABLE] = false;\n\t  return array.concat()[0] !== array;\n\t});\n\n\tvar SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat');\n\n\tvar isConcatSpreadable = function (O) {\n\t  if (!isObject(O)) return false;\n\t  var spreadable = O[IS_CONCAT_SPREADABLE];\n\t  return spreadable !== undefined ? !!spreadable : isArray(O);\n\t};\n\n\tvar FORCED = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT;\n\n\t// `Array.prototype.concat` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.concat\n\t// with adding support of @@isConcatSpreadable and @@species\n\t_export({ target: 'Array', proto: true, forced: FORCED }, {\n\t  concat: function concat(arg) { // eslint-disable-line no-unused-vars\n\t    var O = toObject(this);\n\t    var A = arraySpeciesCreate(O, 0);\n\t    var n = 0;\n\t    var i, k, length, len, E;\n\t    for (i = -1, length = arguments.length; i < length; i++) {\n\t      E = i === -1 ? O : arguments[i];\n\t      if (isConcatSpreadable(E)) {\n\t        len = toLength(E.length);\n\t        if (n + len > MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n\t        for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]);\n\t      } else {\n\t        if (n >= MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n\t        createProperty(A, n++, E);\n\t      }\n\t    }\n\t    A.length = n;\n\t    return A;\n\t  }\n\t});\n\n\tvar $filter = arrayIteration.filter;\n\n\n\t// `Array.prototype.filter` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.filter\n\t// with adding support of @@species\n\t_export({ target: 'Array', proto: true, forced: !arrayMethodHasSpeciesSupport('filter') }, {\n\t  filter: function filter(callbackfn /* , thisArg */) {\n\t    return $filter(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t  }\n\t});\n\n\tvar UNSCOPABLES = wellKnownSymbol('unscopables');\n\tvar ArrayPrototype = Array.prototype;\n\n\t// Array.prototype[@@unscopables]\n\t// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n\tif (ArrayPrototype[UNSCOPABLES] == undefined) {\n\t  hide(ArrayPrototype, UNSCOPABLES, objectCreate(null));\n\t}\n\n\t// add a key to Array.prototype[@@unscopables]\n\tvar addToUnscopables = function (key) {\n\t  ArrayPrototype[UNSCOPABLES][key] = true;\n\t};\n\n\tvar $find = arrayIteration.find;\n\n\n\tvar FIND = 'find';\n\tvar SKIPS_HOLES = true;\n\n\t// Shouldn't skip holes\n\tif (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; });\n\n\t// `Array.prototype.find` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.find\n\t_export({ target: 'Array', proto: true, forced: SKIPS_HOLES }, {\n\t  find: function find(callbackfn /* , that = undefined */) {\n\t    return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t  }\n\t});\n\n\t// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n\taddToUnscopables(FIND);\n\n\tvar $findIndex = arrayIteration.findIndex;\n\n\n\tvar FIND_INDEX = 'findIndex';\n\tvar SKIPS_HOLES$1 = true;\n\n\t// Shouldn't skip holes\n\tif (FIND_INDEX in []) Array(1)[FIND_INDEX](function () { SKIPS_HOLES$1 = false; });\n\n\t// `Array.prototype.findIndex` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.findindex\n\t_export({ target: 'Array', proto: true, forced: SKIPS_HOLES$1 }, {\n\t  findIndex: function findIndex(callbackfn /* , that = undefined */) {\n\t    return $findIndex(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t  }\n\t});\n\n\t// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n\taddToUnscopables(FIND_INDEX);\n\n\tvar $includes = arrayIncludes.includes;\n\n\n\t// `Array.prototype.includes` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.includes\n\t_export({ target: 'Array', proto: true }, {\n\t  includes: function includes(el /* , fromIndex = 0 */) {\n\t    return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n\t  }\n\t});\n\n\t// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n\taddToUnscopables('includes');\n\n\tvar sloppyArrayMethod = function (METHOD_NAME, argument) {\n\t  var method = [][METHOD_NAME];\n\t  return !method || !fails(function () {\n\t    // eslint-disable-next-line no-useless-call,no-throw-literal\n\t    method.call(null, argument || function () { throw 1; }, 1);\n\t  });\n\t};\n\n\tvar $indexOf = arrayIncludes.indexOf;\n\n\n\tvar nativeIndexOf = [].indexOf;\n\n\tvar NEGATIVE_ZERO = !!nativeIndexOf && 1 / [1].indexOf(1, -0) < 0;\n\tvar SLOPPY_METHOD = sloppyArrayMethod('indexOf');\n\n\t// `Array.prototype.indexOf` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n\t_export({ target: 'Array', proto: true, forced: NEGATIVE_ZERO || SLOPPY_METHOD }, {\n\t  indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {\n\t    return NEGATIVE_ZERO\n\t      // convert -0 to +0\n\t      ? nativeIndexOf.apply(this, arguments) || 0\n\t      : $indexOf(this, searchElement, arguments.length > 1 ? arguments[1] : undefined);\n\t  }\n\t});\n\n\tvar correctPrototypeGetter = !fails(function () {\n\t  function F() { /* empty */ }\n\t  F.prototype.constructor = null;\n\t  return Object.getPrototypeOf(new F()) !== F.prototype;\n\t});\n\n\tvar IE_PROTO$1 = sharedKey('IE_PROTO');\n\tvar ObjectPrototype$1 = Object.prototype;\n\n\t// `Object.getPrototypeOf` method\n\t// https://tc39.github.io/ecma262/#sec-object.getprototypeof\n\tvar objectGetPrototypeOf = correctPrototypeGetter ? Object.getPrototypeOf : function (O) {\n\t  O = toObject(O);\n\t  if (has(O, IE_PROTO$1)) return O[IE_PROTO$1];\n\t  if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n\t    return O.constructor.prototype;\n\t  } return O instanceof Object ? ObjectPrototype$1 : null;\n\t};\n\n\tvar ITERATOR = wellKnownSymbol('iterator');\n\tvar BUGGY_SAFARI_ITERATORS = false;\n\n\tvar returnThis = function () { return this; };\n\n\t// `%IteratorPrototype%` object\n\t// https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object\n\tvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\n\tif ([].keys) {\n\t  arrayIterator = [].keys();\n\t  // Safari 8 has buggy iterators w/o `next`\n\t  if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n\t  else {\n\t    PrototypeOfArrayIteratorPrototype = objectGetPrototypeOf(objectGetPrototypeOf(arrayIterator));\n\t    if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n\t  }\n\t}\n\n\tif (IteratorPrototype == undefined) IteratorPrototype = {};\n\n\t// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\n\tif ( !has(IteratorPrototype, ITERATOR)) hide(IteratorPrototype, ITERATOR, returnThis);\n\n\tvar iteratorsCore = {\n\t  IteratorPrototype: IteratorPrototype,\n\t  BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n\t};\n\n\tvar IteratorPrototype$1 = iteratorsCore.IteratorPrototype;\n\n\tvar createIteratorConstructor = function (IteratorConstructor, NAME, next) {\n\t  var TO_STRING_TAG = NAME + ' Iterator';\n\t  IteratorConstructor.prototype = objectCreate(IteratorPrototype$1, { next: createPropertyDescriptor(1, next) });\n\t  setToStringTag(IteratorConstructor, TO_STRING_TAG, false);\n\t  return IteratorConstructor;\n\t};\n\n\tvar aPossiblePrototype = function (it) {\n\t  if (!isObject(it) && it !== null) {\n\t    throw TypeError(\"Can't set \" + String(it) + ' as a prototype');\n\t  } return it;\n\t};\n\n\t// `Object.setPrototypeOf` method\n\t// https://tc39.github.io/ecma262/#sec-object.setprototypeof\n\t// Works with __proto__ only. Old v8 can't work with null proto objects.\n\t/* eslint-disable no-proto */\n\tvar objectSetPrototypeOf = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n\t  var CORRECT_SETTER = false;\n\t  var test = {};\n\t  var setter;\n\t  try {\n\t    setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set;\n\t    setter.call(test, []);\n\t    CORRECT_SETTER = test instanceof Array;\n\t  } catch (error) { /* empty */ }\n\t  return function setPrototypeOf(O, proto) {\n\t    anObject(O);\n\t    aPossiblePrototype(proto);\n\t    if (CORRECT_SETTER) setter.call(O, proto);\n\t    else O.__proto__ = proto;\n\t    return O;\n\t  };\n\t}() : undefined);\n\n\tvar IteratorPrototype$2 = iteratorsCore.IteratorPrototype;\n\tvar BUGGY_SAFARI_ITERATORS$1 = iteratorsCore.BUGGY_SAFARI_ITERATORS;\n\tvar ITERATOR$1 = wellKnownSymbol('iterator');\n\tvar KEYS = 'keys';\n\tvar VALUES = 'values';\n\tvar ENTRIES = 'entries';\n\n\tvar returnThis$1 = function () { return this; };\n\n\tvar defineIterator = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n\t  createIteratorConstructor(IteratorConstructor, NAME, next);\n\n\t  var getIterationMethod = function (KIND) {\n\t    if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n\t    if (!BUGGY_SAFARI_ITERATORS$1 && KIND in IterablePrototype) return IterablePrototype[KIND];\n\t    switch (KIND) {\n\t      case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };\n\t      case VALUES: return function values() { return new IteratorConstructor(this, KIND); };\n\t      case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };\n\t    } return function () { return new IteratorConstructor(this); };\n\t  };\n\n\t  var TO_STRING_TAG = NAME + ' Iterator';\n\t  var INCORRECT_VALUES_NAME = false;\n\t  var IterablePrototype = Iterable.prototype;\n\t  var nativeIterator = IterablePrototype[ITERATOR$1]\n\t    || IterablePrototype['@@iterator']\n\t    || DEFAULT && IterablePrototype[DEFAULT];\n\t  var defaultIterator = !BUGGY_SAFARI_ITERATORS$1 && nativeIterator || getIterationMethod(DEFAULT);\n\t  var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n\t  var CurrentIteratorPrototype, methods, KEY;\n\n\t  // fix native\n\t  if (anyNativeIterator) {\n\t    CurrentIteratorPrototype = objectGetPrototypeOf(anyNativeIterator.call(new Iterable()));\n\t    if (IteratorPrototype$2 !== Object.prototype && CurrentIteratorPrototype.next) {\n\t      if ( objectGetPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype$2) {\n\t        if (objectSetPrototypeOf) {\n\t          objectSetPrototypeOf(CurrentIteratorPrototype, IteratorPrototype$2);\n\t        } else if (typeof CurrentIteratorPrototype[ITERATOR$1] != 'function') {\n\t          hide(CurrentIteratorPrototype, ITERATOR$1, returnThis$1);\n\t        }\n\t      }\n\t      // Set @@toStringTag to native iterators\n\t      setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true);\n\t    }\n\t  }\n\n\t  // fix Array#{values, @@iterator}.name in V8 / FF\n\t  if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {\n\t    INCORRECT_VALUES_NAME = true;\n\t    defaultIterator = function values() { return nativeIterator.call(this); };\n\t  }\n\n\t  // define iterator\n\t  if ( IterablePrototype[ITERATOR$1] !== defaultIterator) {\n\t    hide(IterablePrototype, ITERATOR$1, defaultIterator);\n\t  }\n\n\t  // export additional methods\n\t  if (DEFAULT) {\n\t    methods = {\n\t      values: getIterationMethod(VALUES),\n\t      keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),\n\t      entries: getIterationMethod(ENTRIES)\n\t    };\n\t    if (FORCED) for (KEY in methods) {\n\t      if (BUGGY_SAFARI_ITERATORS$1 || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n\t        redefine(IterablePrototype, KEY, methods[KEY]);\n\t      }\n\t    } else _export({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS$1 || INCORRECT_VALUES_NAME }, methods);\n\t  }\n\n\t  return methods;\n\t};\n\n\tvar ARRAY_ITERATOR = 'Array Iterator';\n\tvar setInternalState$1 = internalState.set;\n\tvar getInternalState$1 = internalState.getterFor(ARRAY_ITERATOR);\n\n\t// `Array.prototype.entries` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.entries\n\t// `Array.prototype.keys` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.keys\n\t// `Array.prototype.values` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.values\n\t// `Array.prototype[@@iterator]` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype-@@iterator\n\t// `CreateArrayIterator` internal method\n\t// https://tc39.github.io/ecma262/#sec-createarrayiterator\n\tvar es_array_iterator = defineIterator(Array, 'Array', function (iterated, kind) {\n\t  setInternalState$1(this, {\n\t    type: ARRAY_ITERATOR,\n\t    target: toIndexedObject(iterated), // target\n\t    index: 0,                          // next index\n\t    kind: kind                         // kind\n\t  });\n\t// `%ArrayIteratorPrototype%.next` method\n\t// https://tc39.github.io/ecma262/#sec-%arrayiteratorprototype%.next\n\t}, function () {\n\t  var state = getInternalState$1(this);\n\t  var target = state.target;\n\t  var kind = state.kind;\n\t  var index = state.index++;\n\t  if (!target || index >= target.length) {\n\t    state.target = undefined;\n\t    return { value: undefined, done: true };\n\t  }\n\t  if (kind == 'keys') return { value: index, done: false };\n\t  if (kind == 'values') return { value: target[index], done: false };\n\t  return { value: [index, target[index]], done: false };\n\t}, 'values');\n\n\t// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n\taddToUnscopables('keys');\n\taddToUnscopables('values');\n\taddToUnscopables('entries');\n\n\tvar nativeJoin = [].join;\n\n\tvar ES3_STRINGS = indexedObject != Object;\n\tvar SLOPPY_METHOD$1 = sloppyArrayMethod('join', ',');\n\n\t// `Array.prototype.join` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.join\n\t_export({ target: 'Array', proto: true, forced: ES3_STRINGS || SLOPPY_METHOD$1 }, {\n\t  join: function join(separator) {\n\t    return nativeJoin.call(toIndexedObject(this), separator === undefined ? ',' : separator);\n\t  }\n\t});\n\n\tvar SPECIES$2 = wellKnownSymbol('species');\n\tvar nativeSlice = [].slice;\n\tvar max$1 = Math.max;\n\n\t// `Array.prototype.slice` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.slice\n\t// fallback for not array-like ES3 strings and DOM objects\n\t_export({ target: 'Array', proto: true, forced: !arrayMethodHasSpeciesSupport('slice') }, {\n\t  slice: function slice(start, end) {\n\t    var O = toIndexedObject(this);\n\t    var length = toLength(O.length);\n\t    var k = toAbsoluteIndex(start, length);\n\t    var fin = toAbsoluteIndex(end === undefined ? length : end, length);\n\t    // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible\n\t    var Constructor, result, n;\n\t    if (isArray(O)) {\n\t      Constructor = O.constructor;\n\t      // cross-realm fallback\n\t      if (typeof Constructor == 'function' && (Constructor === Array || isArray(Constructor.prototype))) {\n\t        Constructor = undefined;\n\t      } else if (isObject(Constructor)) {\n\t        Constructor = Constructor[SPECIES$2];\n\t        if (Constructor === null) Constructor = undefined;\n\t      }\n\t      if (Constructor === Array || Constructor === undefined) {\n\t        return nativeSlice.call(O, k, fin);\n\t      }\n\t    }\n\t    result = new (Constructor === undefined ? Array : Constructor)(max$1(fin - k, 0));\n\t    for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]);\n\t    result.length = n;\n\t    return result;\n\t  }\n\t});\n\n\tvar nativeSort = [].sort;\n\tvar test = [1, 2, 3];\n\n\t// IE8-\n\tvar FAILS_ON_UNDEFINED = fails(function () {\n\t  test.sort(undefined);\n\t});\n\t// V8 bug\n\tvar FAILS_ON_NULL = fails(function () {\n\t  test.sort(null);\n\t});\n\t// Old WebKit\n\tvar SLOPPY_METHOD$2 = sloppyArrayMethod('sort');\n\n\tvar FORCED$1 = FAILS_ON_UNDEFINED || !FAILS_ON_NULL || SLOPPY_METHOD$2;\n\n\t// `Array.prototype.sort` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.sort\n\t_export({ target: 'Array', proto: true, forced: FORCED$1 }, {\n\t  sort: function sort(comparefn) {\n\t    return comparefn === undefined\n\t      ? nativeSort.call(toObject(this))\n\t      : nativeSort.call(toObject(this), aFunction$1(comparefn));\n\t  }\n\t});\n\n\tvar max$2 = Math.max;\n\tvar min$2 = Math.min;\n\tvar MAX_SAFE_INTEGER$1 = 0x1FFFFFFFFFFFFF;\n\tvar MAXIMUM_ALLOWED_LENGTH_EXCEEDED = 'Maximum allowed length exceeded';\n\n\t// `Array.prototype.splice` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.splice\n\t// with adding support of @@species\n\t_export({ target: 'Array', proto: true, forced: !arrayMethodHasSpeciesSupport('splice') }, {\n\t  splice: function splice(start, deleteCount /* , ...items */) {\n\t    var O = toObject(this);\n\t    var len = toLength(O.length);\n\t    var actualStart = toAbsoluteIndex(start, len);\n\t    var argumentsLength = arguments.length;\n\t    var insertCount, actualDeleteCount, A, k, from, to;\n\t    if (argumentsLength === 0) {\n\t      insertCount = actualDeleteCount = 0;\n\t    } else if (argumentsLength === 1) {\n\t      insertCount = 0;\n\t      actualDeleteCount = len - actualStart;\n\t    } else {\n\t      insertCount = argumentsLength - 2;\n\t      actualDeleteCount = min$2(max$2(toInteger(deleteCount), 0), len - actualStart);\n\t    }\n\t    if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER$1) {\n\t      throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED);\n\t    }\n\t    A = arraySpeciesCreate(O, actualDeleteCount);\n\t    for (k = 0; k < actualDeleteCount; k++) {\n\t      from = actualStart + k;\n\t      if (from in O) createProperty(A, k, O[from]);\n\t    }\n\t    A.length = actualDeleteCount;\n\t    if (insertCount < actualDeleteCount) {\n\t      for (k = actualStart; k < len - actualDeleteCount; k++) {\n\t        from = k + actualDeleteCount;\n\t        to = k + insertCount;\n\t        if (from in O) O[to] = O[from];\n\t        else delete O[to];\n\t      }\n\t      for (k = len; k > len - actualDeleteCount + insertCount; k--) delete O[k - 1];\n\t    } else if (insertCount > actualDeleteCount) {\n\t      for (k = len - actualDeleteCount; k > actualStart; k--) {\n\t        from = k + actualDeleteCount - 1;\n\t        to = k + insertCount - 1;\n\t        if (from in O) O[to] = O[from];\n\t        else delete O[to];\n\t      }\n\t    }\n\t    for (k = 0; k < insertCount; k++) {\n\t      O[k + actualStart] = arguments[k + 2];\n\t    }\n\t    O.length = len - actualDeleteCount + insertCount;\n\t    return A;\n\t  }\n\t});\n\n\t// makes subclassing work correct for wrapped built-ins\n\tvar inheritIfRequired = function ($this, dummy, Wrapper) {\n\t  var NewTarget, NewTargetPrototype;\n\t  if (\n\t    // it can work only with native `setPrototypeOf`\n\t    objectSetPrototypeOf &&\n\t    // we haven't completely correct pre-ES6 way for getting `new.target`, so use this\n\t    typeof (NewTarget = dummy.constructor) == 'function' &&\n\t    NewTarget !== Wrapper &&\n\t    isObject(NewTargetPrototype = NewTarget.prototype) &&\n\t    NewTargetPrototype !== Wrapper.prototype\n\t  ) objectSetPrototypeOf($this, NewTargetPrototype);\n\t  return $this;\n\t};\n\n\t// a string of all valid unicode whitespaces\n\t// eslint-disable-next-line max-len\n\tvar whitespaces = '\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020\\u00A0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n\n\tvar whitespace = '[' + whitespaces + ']';\n\tvar ltrim = RegExp('^' + whitespace + whitespace + '*');\n\tvar rtrim = RegExp(whitespace + whitespace + '*$');\n\n\t// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation\n\tvar createMethod$2 = function (TYPE) {\n\t  return function ($this) {\n\t    var string = String(requireObjectCoercible($this));\n\t    if (TYPE & 1) string = string.replace(ltrim, '');\n\t    if (TYPE & 2) string = string.replace(rtrim, '');\n\t    return string;\n\t  };\n\t};\n\n\tvar stringTrim = {\n\t  // `String.prototype.{ trimLeft, trimStart }` methods\n\t  // https://tc39.github.io/ecma262/#sec-string.prototype.trimstart\n\t  start: createMethod$2(1),\n\t  // `String.prototype.{ trimRight, trimEnd }` methods\n\t  // https://tc39.github.io/ecma262/#sec-string.prototype.trimend\n\t  end: createMethod$2(2),\n\t  // `String.prototype.trim` method\n\t  // https://tc39.github.io/ecma262/#sec-string.prototype.trim\n\t  trim: createMethod$2(3)\n\t};\n\n\tvar getOwnPropertyNames = objectGetOwnPropertyNames.f;\n\tvar getOwnPropertyDescriptor$2 = objectGetOwnPropertyDescriptor.f;\n\tvar defineProperty$3 = objectDefineProperty.f;\n\tvar trim = stringTrim.trim;\n\n\tvar NUMBER = 'Number';\n\tvar NativeNumber = global_1[NUMBER];\n\tvar NumberPrototype = NativeNumber.prototype;\n\n\t// Opera ~12 has broken Object#toString\n\tvar BROKEN_CLASSOF = classofRaw(objectCreate(NumberPrototype)) == NUMBER;\n\n\t// `ToNumber` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-tonumber\n\tvar toNumber = function (argument) {\n\t  var it = toPrimitive(argument, false);\n\t  var first, third, radix, maxCode, digits, length, index, code;\n\t  if (typeof it == 'string' && it.length > 2) {\n\t    it = trim(it);\n\t    first = it.charCodeAt(0);\n\t    if (first === 43 || first === 45) {\n\t      third = it.charCodeAt(2);\n\t      if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix\n\t    } else if (first === 48) {\n\t      switch (it.charCodeAt(1)) {\n\t        case 66: case 98: radix = 2; maxCode = 49; break; // fast equal of /^0b[01]+$/i\n\t        case 79: case 111: radix = 8; maxCode = 55; break; // fast equal of /^0o[0-7]+$/i\n\t        default: return +it;\n\t      }\n\t      digits = it.slice(2);\n\t      length = digits.length;\n\t      for (index = 0; index < length; index++) {\n\t        code = digits.charCodeAt(index);\n\t        // parseInt parses a string to a first unavailable symbol\n\t        // but ToNumber should return NaN if a string contains unavailable symbols\n\t        if (code < 48 || code > maxCode) return NaN;\n\t      } return parseInt(digits, radix);\n\t    }\n\t  } return +it;\n\t};\n\n\t// `Number` constructor\n\t// https://tc39.github.io/ecma262/#sec-number-constructor\n\tif (isForced_1(NUMBER, !NativeNumber(' 0o1') || !NativeNumber('0b1') || NativeNumber('+0x1'))) {\n\t  var NumberWrapper = function Number(value) {\n\t    var it = arguments.length < 1 ? 0 : value;\n\t    var dummy = this;\n\t    return dummy instanceof NumberWrapper\n\t      // check on 1..constructor(foo) case\n\t      && (BROKEN_CLASSOF ? fails(function () { NumberPrototype.valueOf.call(dummy); }) : classofRaw(dummy) != NUMBER)\n\t        ? inheritIfRequired(new NativeNumber(toNumber(it)), dummy, NumberWrapper) : toNumber(it);\n\t  };\n\t  for (var keys$1 = descriptors ? getOwnPropertyNames(NativeNumber) : (\n\t    // ES3:\n\t    'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n\t    // ES2015 (in case, if modules with ES2015 Number statics required before):\n\t    'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +\n\t    'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger'\n\t  ).split(','), j = 0, key; keys$1.length > j; j++) {\n\t    if (has(NativeNumber, key = keys$1[j]) && !has(NumberWrapper, key)) {\n\t      defineProperty$3(NumberWrapper, key, getOwnPropertyDescriptor$2(NativeNumber, key));\n\t    }\n\t  }\n\t  NumberWrapper.prototype = NumberPrototype;\n\t  NumberPrototype.constructor = NumberWrapper;\n\t  redefine(global_1, NUMBER, NumberWrapper);\n\t}\n\n\tvar nativeAssign = Object.assign;\n\n\t// `Object.assign` method\n\t// https://tc39.github.io/ecma262/#sec-object.assign\n\t// should work with symbols and should have deterministic property order (V8 bug)\n\tvar objectAssign = !nativeAssign || fails(function () {\n\t  var A = {};\n\t  var B = {};\n\t  // eslint-disable-next-line no-undef\n\t  var symbol = Symbol();\n\t  var alphabet = 'abcdefghijklmnopqrst';\n\t  A[symbol] = 7;\n\t  alphabet.split('').forEach(function (chr) { B[chr] = chr; });\n\t  return nativeAssign({}, A)[symbol] != 7 || objectKeys(nativeAssign({}, B)).join('') != alphabet;\n\t}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n\t  var T = toObject(target);\n\t  var argumentsLength = arguments.length;\n\t  var index = 1;\n\t  var getOwnPropertySymbols = objectGetOwnPropertySymbols.f;\n\t  var propertyIsEnumerable = objectPropertyIsEnumerable.f;\n\t  while (argumentsLength > index) {\n\t    var S = indexedObject(arguments[index++]);\n\t    var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S);\n\t    var length = keys.length;\n\t    var j = 0;\n\t    var key;\n\t    while (length > j) {\n\t      key = keys[j++];\n\t      if (!descriptors || propertyIsEnumerable.call(S, key)) T[key] = S[key];\n\t    }\n\t  } return T;\n\t} : nativeAssign;\n\n\t// `Object.assign` method\n\t// https://tc39.github.io/ecma262/#sec-object.assign\n\t_export({ target: 'Object', stat: true, forced: Object.assign !== objectAssign }, {\n\t  assign: objectAssign\n\t});\n\n\tvar propertyIsEnumerable = objectPropertyIsEnumerable.f;\n\n\t// `Object.{ entries, values }` methods implementation\n\tvar createMethod$3 = function (TO_ENTRIES) {\n\t  return function (it) {\n\t    var O = toIndexedObject(it);\n\t    var keys = objectKeys(O);\n\t    var length = keys.length;\n\t    var i = 0;\n\t    var result = [];\n\t    var key;\n\t    while (length > i) {\n\t      key = keys[i++];\n\t      if (!descriptors || propertyIsEnumerable.call(O, key)) {\n\t        result.push(TO_ENTRIES ? [key, O[key]] : O[key]);\n\t      }\n\t    }\n\t    return result;\n\t  };\n\t};\n\n\tvar objectToArray = {\n\t  // `Object.entries` method\n\t  // https://tc39.github.io/ecma262/#sec-object.entries\n\t  entries: createMethod$3(true),\n\t  // `Object.values` method\n\t  // https://tc39.github.io/ecma262/#sec-object.values\n\t  values: createMethod$3(false)\n\t};\n\n\tvar $entries = objectToArray.entries;\n\n\t// `Object.entries` method\n\t// https://tc39.github.io/ecma262/#sec-object.entries\n\t_export({ target: 'Object', stat: true }, {\n\t  entries: function entries(O) {\n\t    return $entries(O);\n\t  }\n\t});\n\n\tvar TO_STRING_TAG$1 = wellKnownSymbol('toStringTag');\n\t// ES3 wrong here\n\tvar CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments';\n\n\t// fallback for IE11 Script Access Denied error\n\tvar tryGet = function (it, key) {\n\t  try {\n\t    return it[key];\n\t  } catch (error) { /* empty */ }\n\t};\n\n\t// getting tag from ES6+ `Object.prototype.toString`\n\tvar classof = function (it) {\n\t  var O, tag, result;\n\t  return it === undefined ? 'Undefined' : it === null ? 'Null'\n\t    // @@toStringTag case\n\t    : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG$1)) == 'string' ? tag\n\t    // builtinTag case\n\t    : CORRECT_ARGUMENTS ? classofRaw(O)\n\t    // ES3 arguments fallback\n\t    : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result;\n\t};\n\n\tvar TO_STRING_TAG$2 = wellKnownSymbol('toStringTag');\n\tvar test$1 = {};\n\n\ttest$1[TO_STRING_TAG$2] = 'z';\n\n\t// `Object.prototype.toString` method implementation\n\t// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\n\tvar objectToString = String(test$1) !== '[object z]' ? function toString() {\n\t  return '[object ' + classof(this) + ']';\n\t} : test$1.toString;\n\n\tvar ObjectPrototype$2 = Object.prototype;\n\n\t// `Object.prototype.toString` method\n\t// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\n\tif (objectToString !== ObjectPrototype$2.toString) {\n\t  redefine(ObjectPrototype$2, 'toString', objectToString, { unsafe: true });\n\t}\n\n\tvar trim$1 = stringTrim.trim;\n\n\n\tvar nativeParseFloat = global_1.parseFloat;\n\tvar FORCED$2 = 1 / nativeParseFloat(whitespaces + '-0') !== -Infinity;\n\n\t// `parseFloat` method\n\t// https://tc39.github.io/ecma262/#sec-parsefloat-string\n\tvar _parseFloat = FORCED$2 ? function parseFloat(string) {\n\t  var trimmedString = trim$1(String(string));\n\t  var result = nativeParseFloat(trimmedString);\n\t  return result === 0 && trimmedString.charAt(0) == '-' ? -0 : result;\n\t} : nativeParseFloat;\n\n\t// `parseFloat` method\n\t// https://tc39.github.io/ecma262/#sec-parsefloat-string\n\t_export({ global: true, forced: parseFloat != _parseFloat }, {\n\t  parseFloat: _parseFloat\n\t});\n\n\tvar trim$2 = stringTrim.trim;\n\n\n\tvar nativeParseInt = global_1.parseInt;\n\tvar hex = /^[+-]?0[Xx]/;\n\tvar FORCED$3 = nativeParseInt(whitespaces + '08') !== 8 || nativeParseInt(whitespaces + '0x16') !== 22;\n\n\t// `parseInt` method\n\t// https://tc39.github.io/ecma262/#sec-parseint-string-radix\n\tvar _parseInt = FORCED$3 ? function parseInt(string, radix) {\n\t  var S = trim$2(String(string));\n\t  return nativeParseInt(S, (radix >>> 0) || (hex.test(S) ? 16 : 10));\n\t} : nativeParseInt;\n\n\t// `parseInt` method\n\t// https://tc39.github.io/ecma262/#sec-parseint-string-radix\n\t_export({ global: true, forced: parseInt != _parseInt }, {\n\t  parseInt: _parseInt\n\t});\n\n\t// `RegExp.prototype.flags` getter implementation\n\t// https://tc39.github.io/ecma262/#sec-get-regexp.prototype.flags\n\tvar regexpFlags = function () {\n\t  var that = anObject(this);\n\t  var result = '';\n\t  if (that.global) result += 'g';\n\t  if (that.ignoreCase) result += 'i';\n\t  if (that.multiline) result += 'm';\n\t  if (that.dotAll) result += 's';\n\t  if (that.unicode) result += 'u';\n\t  if (that.sticky) result += 'y';\n\t  return result;\n\t};\n\n\tvar TO_STRING = 'toString';\n\tvar RegExpPrototype = RegExp.prototype;\n\tvar nativeToString = RegExpPrototype[TO_STRING];\n\n\tvar NOT_GENERIC = fails(function () { return nativeToString.call({ source: 'a', flags: 'b' }) != '/a/b'; });\n\t// FF44- RegExp#toString has a wrong name\n\tvar INCORRECT_NAME = nativeToString.name != TO_STRING;\n\n\t// `RegExp.prototype.toString` method\n\t// https://tc39.github.io/ecma262/#sec-regexp.prototype.tostring\n\tif (NOT_GENERIC || INCORRECT_NAME) {\n\t  redefine(RegExp.prototype, TO_STRING, function toString() {\n\t    var R = anObject(this);\n\t    var p = String(R.source);\n\t    var rf = R.flags;\n\t    var f = String(rf === undefined && R instanceof RegExp && !('flags' in RegExpPrototype) ? regexpFlags.call(R) : rf);\n\t    return '/' + p + '/' + f;\n\t  }, { unsafe: true });\n\t}\n\n\tvar MATCH = wellKnownSymbol('match');\n\n\t// `IsRegExp` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-isregexp\n\tvar isRegexp = function (it) {\n\t  var isRegExp;\n\t  return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classofRaw(it) == 'RegExp');\n\t};\n\n\tvar notARegexp = function (it) {\n\t  if (isRegexp(it)) {\n\t    throw TypeError(\"The method doesn't accept regular expressions\");\n\t  } return it;\n\t};\n\n\tvar MATCH$1 = wellKnownSymbol('match');\n\n\tvar correctIsRegexpLogic = function (METHOD_NAME) {\n\t  var regexp = /./;\n\t  try {\n\t    '/./'[METHOD_NAME](regexp);\n\t  } catch (e) {\n\t    try {\n\t      regexp[MATCH$1] = false;\n\t      return '/./'[METHOD_NAME](regexp);\n\t    } catch (f) { /* empty */ }\n\t  } return false;\n\t};\n\n\t// `String.prototype.includes` method\n\t// https://tc39.github.io/ecma262/#sec-string.prototype.includes\n\t_export({ target: 'String', proto: true, forced: !correctIsRegexpLogic('includes') }, {\n\t  includes: function includes(searchString /* , position = 0 */) {\n\t    return !!~String(requireObjectCoercible(this))\n\t      .indexOf(notARegexp(searchString), arguments.length > 1 ? arguments[1] : undefined);\n\t  }\n\t});\n\n\t// `String.prototype.{ codePointAt, at }` methods implementation\n\tvar createMethod$4 = function (CONVERT_TO_STRING) {\n\t  return function ($this, pos) {\n\t    var S = String(requireObjectCoercible($this));\n\t    var position = toInteger(pos);\n\t    var size = S.length;\n\t    var first, second;\n\t    if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n\t    first = S.charCodeAt(position);\n\t    return first < 0xD800 || first > 0xDBFF || position + 1 === size\n\t      || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF\n\t        ? CONVERT_TO_STRING ? S.charAt(position) : first\n\t        : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n\t  };\n\t};\n\n\tvar stringMultibyte = {\n\t  // `String.prototype.codePointAt` method\n\t  // https://tc39.github.io/ecma262/#sec-string.prototype.codepointat\n\t  codeAt: createMethod$4(false),\n\t  // `String.prototype.at` method\n\t  // https://github.com/mathiasbynens/String.prototype.at\n\t  charAt: createMethod$4(true)\n\t};\n\n\tvar charAt = stringMultibyte.charAt;\n\n\n\n\tvar STRING_ITERATOR = 'String Iterator';\n\tvar setInternalState$2 = internalState.set;\n\tvar getInternalState$2 = internalState.getterFor(STRING_ITERATOR);\n\n\t// `String.prototype[@@iterator]` method\n\t// https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator\n\tdefineIterator(String, 'String', function (iterated) {\n\t  setInternalState$2(this, {\n\t    type: STRING_ITERATOR,\n\t    string: String(iterated),\n\t    index: 0\n\t  });\n\t// `%StringIteratorPrototype%.next` method\n\t// https://tc39.github.io/ecma262/#sec-%stringiteratorprototype%.next\n\t}, function next() {\n\t  var state = getInternalState$2(this);\n\t  var string = state.string;\n\t  var index = state.index;\n\t  var point;\n\t  if (index >= string.length) return { value: undefined, done: true };\n\t  point = charAt(string, index);\n\t  state.index += point.length;\n\t  return { value: point, done: false };\n\t});\n\n\tvar nativeExec = RegExp.prototype.exec;\n\t// This always refers to the native implementation, because the\n\t// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n\t// which loads this file before patching the method.\n\tvar nativeReplace = String.prototype.replace;\n\n\tvar patchedExec = nativeExec;\n\n\tvar UPDATES_LAST_INDEX_WRONG = (function () {\n\t  var re1 = /a/;\n\t  var re2 = /b*/g;\n\t  nativeExec.call(re1, 'a');\n\t  nativeExec.call(re2, 'a');\n\t  return re1.lastIndex !== 0 || re2.lastIndex !== 0;\n\t})();\n\n\t// nonparticipating capturing group, copied from es5-shim's String#split patch.\n\tvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\n\tvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED;\n\n\tif (PATCH) {\n\t  patchedExec = function exec(str) {\n\t    var re = this;\n\t    var lastIndex, reCopy, match, i;\n\n\t    if (NPCG_INCLUDED) {\n\t      reCopy = new RegExp('^' + re.source + '$(?!\\\\s)', regexpFlags.call(re));\n\t    }\n\t    if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;\n\n\t    match = nativeExec.call(re, str);\n\n\t    if (UPDATES_LAST_INDEX_WRONG && match) {\n\t      re.lastIndex = re.global ? match.index + match[0].length : lastIndex;\n\t    }\n\t    if (NPCG_INCLUDED && match && match.length > 1) {\n\t      // Fix browsers whose `exec` methods don't consistently return `undefined`\n\t      // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n\t      nativeReplace.call(match[0], reCopy, function () {\n\t        for (i = 1; i < arguments.length - 2; i++) {\n\t          if (arguments[i] === undefined) match[i] = undefined;\n\t        }\n\t      });\n\t    }\n\n\t    return match;\n\t  };\n\t}\n\n\tvar regexpExec = patchedExec;\n\n\tvar SPECIES$3 = wellKnownSymbol('species');\n\n\tvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n\t  // #replace needs built-in support for named groups.\n\t  // #match works fine because it just return the exec results, even if it has\n\t  // a \"grops\" property.\n\t  var re = /./;\n\t  re.exec = function () {\n\t    var result = [];\n\t    result.groups = { a: '7' };\n\t    return result;\n\t  };\n\t  return ''.replace(re, '$<a>') !== '7';\n\t});\n\n\t// Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n\t// Weex JS has frozen built-in prototypes, so use try / catch wrapper\n\tvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () {\n\t  var re = /(?:)/;\n\t  var originalExec = re.exec;\n\t  re.exec = function () { return originalExec.apply(this, arguments); };\n\t  var result = 'ab'.split(re);\n\t  return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';\n\t});\n\n\tvar fixRegexpWellKnownSymbolLogic = function (KEY, length, exec, sham) {\n\t  var SYMBOL = wellKnownSymbol(KEY);\n\n\t  var DELEGATES_TO_SYMBOL = !fails(function () {\n\t    // String methods call symbol-named RegEp methods\n\t    var O = {};\n\t    O[SYMBOL] = function () { return 7; };\n\t    return ''[KEY](O) != 7;\n\t  });\n\n\t  var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {\n\t    // Symbol-named RegExp methods call .exec\n\t    var execCalled = false;\n\t    var re = /a/;\n\t    re.exec = function () { execCalled = true; return null; };\n\n\t    if (KEY === 'split') {\n\t      // RegExp[@@split] doesn't call the regex's exec method, but first creates\n\t      // a new one. We need to return the patched regex when creating the new one.\n\t      re.constructor = {};\n\t      re.constructor[SPECIES$3] = function () { return re; };\n\t    }\n\n\t    re[SYMBOL]('');\n\t    return !execCalled;\n\t  });\n\n\t  if (\n\t    !DELEGATES_TO_SYMBOL ||\n\t    !DELEGATES_TO_EXEC ||\n\t    (KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS) ||\n\t    (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n\t  ) {\n\t    var nativeRegExpMethod = /./[SYMBOL];\n\t    var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {\n\t      if (regexp.exec === regexpExec) {\n\t        if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n\t          // The native String method already delegates to @@method (this\n\t          // polyfilled function), leasing to infinite recursion.\n\t          // We avoid it by directly calling the native @@method method.\n\t          return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n\t        }\n\t        return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n\t      }\n\t      return { done: false };\n\t    });\n\t    var stringMethod = methods[0];\n\t    var regexMethod = methods[1];\n\n\t    redefine(String.prototype, KEY, stringMethod);\n\t    redefine(RegExp.prototype, SYMBOL, length == 2\n\t      // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n\t      // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n\t      ? function (string, arg) { return regexMethod.call(string, this, arg); }\n\t      // 21.2.5.6 RegExp.prototype[@@match](string)\n\t      // 21.2.5.9 RegExp.prototype[@@search](string)\n\t      : function (string) { return regexMethod.call(string, this); }\n\t    );\n\t    if (sham) hide(RegExp.prototype[SYMBOL], 'sham', true);\n\t  }\n\t};\n\n\tvar charAt$1 = stringMultibyte.charAt;\n\n\t// `AdvanceStringIndex` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-advancestringindex\n\tvar advanceStringIndex = function (S, index, unicode) {\n\t  return index + (unicode ? charAt$1(S, index).length : 1);\n\t};\n\n\t// `RegExpExec` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-regexpexec\n\tvar regexpExecAbstract = function (R, S) {\n\t  var exec = R.exec;\n\t  if (typeof exec === 'function') {\n\t    var result = exec.call(R, S);\n\t    if (typeof result !== 'object') {\n\t      throw TypeError('RegExp exec method returned something other than an Object or null');\n\t    }\n\t    return result;\n\t  }\n\n\t  if (classofRaw(R) !== 'RegExp') {\n\t    throw TypeError('RegExp#exec called on incompatible receiver');\n\t  }\n\n\t  return regexpExec.call(R, S);\n\t};\n\n\tvar max$3 = Math.max;\n\tvar min$3 = Math.min;\n\tvar floor$1 = Math.floor;\n\tvar SUBSTITUTION_SYMBOLS = /\\$([$&'`]|\\d\\d?|<[^>]*>)/g;\n\tvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&'`]|\\d\\d?)/g;\n\n\tvar maybeToString = function (it) {\n\t  return it === undefined ? it : String(it);\n\t};\n\n\t// @@replace logic\n\tfixRegexpWellKnownSymbolLogic('replace', 2, function (REPLACE, nativeReplace, maybeCallNative) {\n\t  return [\n\t    // `String.prototype.replace` method\n\t    // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n\t    function replace(searchValue, replaceValue) {\n\t      var O = requireObjectCoercible(this);\n\t      var replacer = searchValue == undefined ? undefined : searchValue[REPLACE];\n\t      return replacer !== undefined\n\t        ? replacer.call(searchValue, O, replaceValue)\n\t        : nativeReplace.call(String(O), searchValue, replaceValue);\n\t    },\n\t    // `RegExp.prototype[@@replace]` method\n\t    // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n\t    function (regexp, replaceValue) {\n\t      var res = maybeCallNative(nativeReplace, regexp, this, replaceValue);\n\t      if (res.done) return res.value;\n\n\t      var rx = anObject(regexp);\n\t      var S = String(this);\n\n\t      var functionalReplace = typeof replaceValue === 'function';\n\t      if (!functionalReplace) replaceValue = String(replaceValue);\n\n\t      var global = rx.global;\n\t      if (global) {\n\t        var fullUnicode = rx.unicode;\n\t        rx.lastIndex = 0;\n\t      }\n\t      var results = [];\n\t      while (true) {\n\t        var result = regexpExecAbstract(rx, S);\n\t        if (result === null) break;\n\n\t        results.push(result);\n\t        if (!global) break;\n\n\t        var matchStr = String(result[0]);\n\t        if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n\t      }\n\n\t      var accumulatedResult = '';\n\t      var nextSourcePosition = 0;\n\t      for (var i = 0; i < results.length; i++) {\n\t        result = results[i];\n\n\t        var matched = String(result[0]);\n\t        var position = max$3(min$3(toInteger(result.index), S.length), 0);\n\t        var captures = [];\n\t        // NOTE: This is equivalent to\n\t        //   captures = result.slice(1).map(maybeToString)\n\t        // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n\t        // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n\t        // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n\t        for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n\t        var namedCaptures = result.groups;\n\t        if (functionalReplace) {\n\t          var replacerArgs = [matched].concat(captures, position, S);\n\t          if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n\t          var replacement = String(replaceValue.apply(undefined, replacerArgs));\n\t        } else {\n\t          replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n\t        }\n\t        if (position >= nextSourcePosition) {\n\t          accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n\t          nextSourcePosition = position + matched.length;\n\t        }\n\t      }\n\t      return accumulatedResult + S.slice(nextSourcePosition);\n\t    }\n\t  ];\n\n\t  // https://tc39.github.io/ecma262/#sec-getsubstitution\n\t  function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n\t    var tailPos = position + matched.length;\n\t    var m = captures.length;\n\t    var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n\t    if (namedCaptures !== undefined) {\n\t      namedCaptures = toObject(namedCaptures);\n\t      symbols = SUBSTITUTION_SYMBOLS;\n\t    }\n\t    return nativeReplace.call(replacement, symbols, function (match, ch) {\n\t      var capture;\n\t      switch (ch.charAt(0)) {\n\t        case '$': return '$';\n\t        case '&': return matched;\n\t        case '`': return str.slice(0, position);\n\t        case \"'\": return str.slice(tailPos);\n\t        case '<':\n\t          capture = namedCaptures[ch.slice(1, -1)];\n\t          break;\n\t        default: // \\d\\d?\n\t          var n = +ch;\n\t          if (n === 0) return match;\n\t          if (n > m) {\n\t            var f = floor$1(n / 10);\n\t            if (f === 0) return match;\n\t            if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n\t            return match;\n\t          }\n\t          capture = captures[n - 1];\n\t      }\n\t      return capture === undefined ? '' : capture;\n\t    });\n\t  }\n\t});\n\n\t// `SameValue` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-samevalue\n\tvar sameValue = Object.is || function is(x, y) {\n\t  // eslint-disable-next-line no-self-compare\n\t  return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n\t};\n\n\t// @@search logic\n\tfixRegexpWellKnownSymbolLogic('search', 1, function (SEARCH, nativeSearch, maybeCallNative) {\n\t  return [\n\t    // `String.prototype.search` method\n\t    // https://tc39.github.io/ecma262/#sec-string.prototype.search\n\t    function search(regexp) {\n\t      var O = requireObjectCoercible(this);\n\t      var searcher = regexp == undefined ? undefined : regexp[SEARCH];\n\t      return searcher !== undefined ? searcher.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n\t    },\n\t    // `RegExp.prototype[@@search]` method\n\t    // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search\n\t    function (regexp) {\n\t      var res = maybeCallNative(nativeSearch, regexp, this);\n\t      if (res.done) return res.value;\n\n\t      var rx = anObject(regexp);\n\t      var S = String(this);\n\n\t      var previousLastIndex = rx.lastIndex;\n\t      if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0;\n\t      var result = regexpExecAbstract(rx, S);\n\t      if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;\n\t      return result === null ? -1 : result.index;\n\t    }\n\t  ];\n\t});\n\n\tvar SPECIES$4 = wellKnownSymbol('species');\n\n\t// `SpeciesConstructor` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-speciesconstructor\n\tvar speciesConstructor = function (O, defaultConstructor) {\n\t  var C = anObject(O).constructor;\n\t  var S;\n\t  return C === undefined || (S = anObject(C)[SPECIES$4]) == undefined ? defaultConstructor : aFunction$1(S);\n\t};\n\n\tvar arrayPush = [].push;\n\tvar min$4 = Math.min;\n\tvar MAX_UINT32 = 0xFFFFFFFF;\n\n\t// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\n\tvar SUPPORTS_Y = !fails(function () { return !RegExp(MAX_UINT32, 'y'); });\n\n\t// @@split logic\n\tfixRegexpWellKnownSymbolLogic('split', 2, function (SPLIT, nativeSplit, maybeCallNative) {\n\t  var internalSplit;\n\t  if (\n\t    'abbc'.split(/(b)*/)[1] == 'c' ||\n\t    'test'.split(/(?:)/, -1).length != 4 ||\n\t    'ab'.split(/(?:ab)*/).length != 2 ||\n\t    '.'.split(/(.?)(.?)/).length != 4 ||\n\t    '.'.split(/()()/).length > 1 ||\n\t    ''.split(/.?/).length\n\t  ) {\n\t    // based on es5-shim implementation, need to rework it\n\t    internalSplit = function (separator, limit) {\n\t      var string = String(requireObjectCoercible(this));\n\t      var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n\t      if (lim === 0) return [];\n\t      if (separator === undefined) return [string];\n\t      // If `separator` is not a regex, use native split\n\t      if (!isRegexp(separator)) {\n\t        return nativeSplit.call(string, separator, lim);\n\t      }\n\t      var output = [];\n\t      var flags = (separator.ignoreCase ? 'i' : '') +\n\t                  (separator.multiline ? 'm' : '') +\n\t                  (separator.unicode ? 'u' : '') +\n\t                  (separator.sticky ? 'y' : '');\n\t      var lastLastIndex = 0;\n\t      // Make `global` and avoid `lastIndex` issues by working with a copy\n\t      var separatorCopy = new RegExp(separator.source, flags + 'g');\n\t      var match, lastIndex, lastLength;\n\t      while (match = regexpExec.call(separatorCopy, string)) {\n\t        lastIndex = separatorCopy.lastIndex;\n\t        if (lastIndex > lastLastIndex) {\n\t          output.push(string.slice(lastLastIndex, match.index));\n\t          if (match.length > 1 && match.index < string.length) arrayPush.apply(output, match.slice(1));\n\t          lastLength = match[0].length;\n\t          lastLastIndex = lastIndex;\n\t          if (output.length >= lim) break;\n\t        }\n\t        if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // Avoid an infinite loop\n\t      }\n\t      if (lastLastIndex === string.length) {\n\t        if (lastLength || !separatorCopy.test('')) output.push('');\n\t      } else output.push(string.slice(lastLastIndex));\n\t      return output.length > lim ? output.slice(0, lim) : output;\n\t    };\n\t  // Chakra, V8\n\t  } else if ('0'.split(undefined, 0).length) {\n\t    internalSplit = function (separator, limit) {\n\t      return separator === undefined && limit === 0 ? [] : nativeSplit.call(this, separator, limit);\n\t    };\n\t  } else internalSplit = nativeSplit;\n\n\t  return [\n\t    // `String.prototype.split` method\n\t    // https://tc39.github.io/ecma262/#sec-string.prototype.split\n\t    function split(separator, limit) {\n\t      var O = requireObjectCoercible(this);\n\t      var splitter = separator == undefined ? undefined : separator[SPLIT];\n\t      return splitter !== undefined\n\t        ? splitter.call(separator, O, limit)\n\t        : internalSplit.call(String(O), separator, limit);\n\t    },\n\t    // `RegExp.prototype[@@split]` method\n\t    // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n\t    //\n\t    // NOTE: This cannot be properly polyfilled in engines that don't support\n\t    // the 'y' flag.\n\t    function (regexp, limit) {\n\t      var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== nativeSplit);\n\t      if (res.done) return res.value;\n\n\t      var rx = anObject(regexp);\n\t      var S = String(this);\n\t      var C = speciesConstructor(rx, RegExp);\n\n\t      var unicodeMatching = rx.unicode;\n\t      var flags = (rx.ignoreCase ? 'i' : '') +\n\t                  (rx.multiline ? 'm' : '') +\n\t                  (rx.unicode ? 'u' : '') +\n\t                  (SUPPORTS_Y ? 'y' : 'g');\n\n\t      // ^(? + rx + ) is needed, in combination with some S slicing, to\n\t      // simulate the 'y' flag.\n\t      var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n\t      var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n\t      if (lim === 0) return [];\n\t      if (S.length === 0) return regexpExecAbstract(splitter, S) === null ? [S] : [];\n\t      var p = 0;\n\t      var q = 0;\n\t      var A = [];\n\t      while (q < S.length) {\n\t        splitter.lastIndex = SUPPORTS_Y ? q : 0;\n\t        var z = regexpExecAbstract(splitter, SUPPORTS_Y ? S : S.slice(q));\n\t        var e;\n\t        if (\n\t          z === null ||\n\t          (e = min$4(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n\t        ) {\n\t          q = advanceStringIndex(S, q, unicodeMatching);\n\t        } else {\n\t          A.push(S.slice(p, q));\n\t          if (A.length === lim) return A;\n\t          for (var i = 1; i <= z.length - 1; i++) {\n\t            A.push(z[i]);\n\t            if (A.length === lim) return A;\n\t          }\n\t          q = p = e;\n\t        }\n\t      }\n\t      A.push(S.slice(p));\n\t      return A;\n\t    }\n\t  ];\n\t}, !SUPPORTS_Y);\n\n\tvar non = '\\u200B\\u0085\\u180E';\n\n\t// check that a method works with the correct list\n\t// of whitespaces and has a correct name\n\tvar forcedStringTrimMethod = function (METHOD_NAME) {\n\t  return fails(function () {\n\t    return !!whitespaces[METHOD_NAME]() || non[METHOD_NAME]() != non || whitespaces[METHOD_NAME].name !== METHOD_NAME;\n\t  });\n\t};\n\n\tvar $trim = stringTrim.trim;\n\n\n\t// `String.prototype.trim` method\n\t// https://tc39.github.io/ecma262/#sec-string.prototype.trim\n\t_export({ target: 'String', proto: true, forced: forcedStringTrimMethod('trim') }, {\n\t  trim: function trim() {\n\t    return $trim(this);\n\t  }\n\t});\n\n\t// iterable DOM collections\n\t// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods\n\tvar domIterables = {\n\t  CSSRuleList: 0,\n\t  CSSStyleDeclaration: 0,\n\t  CSSValueList: 0,\n\t  ClientRectList: 0,\n\t  DOMRectList: 0,\n\t  DOMStringList: 0,\n\t  DOMTokenList: 1,\n\t  DataTransferItemList: 0,\n\t  FileList: 0,\n\t  HTMLAllCollection: 0,\n\t  HTMLCollection: 0,\n\t  HTMLFormElement: 0,\n\t  HTMLSelectElement: 0,\n\t  MediaList: 0,\n\t  MimeTypeArray: 0,\n\t  NamedNodeMap: 0,\n\t  NodeList: 1,\n\t  PaintRequestList: 0,\n\t  Plugin: 0,\n\t  PluginArray: 0,\n\t  SVGLengthList: 0,\n\t  SVGNumberList: 0,\n\t  SVGPathSegList: 0,\n\t  SVGPointList: 0,\n\t  SVGStringList: 0,\n\t  SVGTransformList: 0,\n\t  SourceBufferList: 0,\n\t  StyleSheetList: 0,\n\t  TextTrackCueList: 0,\n\t  TextTrackList: 0,\n\t  TouchList: 0\n\t};\n\n\tvar $forEach$1 = arrayIteration.forEach;\n\n\n\t// `Array.prototype.forEach` method implementation\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n\tvar arrayForEach = sloppyArrayMethod('forEach') ? function forEach(callbackfn /* , thisArg */) {\n\t  return $forEach$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t} : [].forEach;\n\n\tfor (var COLLECTION_NAME in domIterables) {\n\t  var Collection = global_1[COLLECTION_NAME];\n\t  var CollectionPrototype = Collection && Collection.prototype;\n\t  // some Chrome versions have non-configurable methods on DOMTokenList\n\t  if (CollectionPrototype && CollectionPrototype.forEach !== arrayForEach) try {\n\t    hide(CollectionPrototype, 'forEach', arrayForEach);\n\t  } catch (error) {\n\t    CollectionPrototype.forEach = arrayForEach;\n\t  }\n\t}\n\n\tvar ITERATOR$2 = wellKnownSymbol('iterator');\n\tvar TO_STRING_TAG$3 = wellKnownSymbol('toStringTag');\n\tvar ArrayValues = es_array_iterator.values;\n\n\tfor (var COLLECTION_NAME$1 in domIterables) {\n\t  var Collection$1 = global_1[COLLECTION_NAME$1];\n\t  var CollectionPrototype$1 = Collection$1 && Collection$1.prototype;\n\t  if (CollectionPrototype$1) {\n\t    // some Chrome versions have non-configurable methods on DOMTokenList\n\t    if (CollectionPrototype$1[ITERATOR$2] !== ArrayValues) try {\n\t      hide(CollectionPrototype$1, ITERATOR$2, ArrayValues);\n\t    } catch (error) {\n\t      CollectionPrototype$1[ITERATOR$2] = ArrayValues;\n\t    }\n\t    if (!CollectionPrototype$1[TO_STRING_TAG$3]) hide(CollectionPrototype$1, TO_STRING_TAG$3, COLLECTION_NAME$1);\n\t    if (domIterables[COLLECTION_NAME$1]) for (var METHOD_NAME in es_array_iterator) {\n\t      // some Chrome versions have non-configurable methods on DOMTokenList\n\t      if (CollectionPrototype$1[METHOD_NAME] !== es_array_iterator[METHOD_NAME]) try {\n\t        hide(CollectionPrototype$1, METHOD_NAME, es_array_iterator[METHOD_NAME]);\n\t      } catch (error) {\n\t        CollectionPrototype$1[METHOD_NAME] = es_array_iterator[METHOD_NAME];\n\t      }\n\t    }\n\t  }\n\t}\n\n\tfunction _typeof(obj) {\n\t  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n\t    _typeof = function (obj) {\n\t      return typeof obj;\n\t    };\n\t  } else {\n\t    _typeof = function (obj) {\n\t      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n\t    };\n\t  }\n\n\t  return _typeof(obj);\n\t}\n\n\tfunction _classCallCheck(instance, Constructor) {\n\t  if (!(instance instanceof Constructor)) {\n\t    throw new TypeError(\"Cannot call a class as a function\");\n\t  }\n\t}\n\n\tfunction _defineProperties(target, props) {\n\t  for (var i = 0; i < props.length; i++) {\n\t    var descriptor = props[i];\n\t    descriptor.enumerable = descriptor.enumerable || false;\n\t    descriptor.configurable = true;\n\t    if (\"value\" in descriptor) descriptor.writable = true;\n\t    Object.defineProperty(target, descriptor.key, descriptor);\n\t  }\n\t}\n\n\tfunction _createClass(Constructor, protoProps, staticProps) {\n\t  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n\t  if (staticProps) _defineProperties(Constructor, staticProps);\n\t  return Constructor;\n\t}\n\n\tfunction _slicedToArray(arr, i) {\n\t  return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();\n\t}\n\n\tfunction _toConsumableArray(arr) {\n\t  return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();\n\t}\n\n\tfunction _arrayWithoutHoles(arr) {\n\t  if (Array.isArray(arr)) {\n\t    for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n\n\t    return arr2;\n\t  }\n\t}\n\n\tfunction _arrayWithHoles(arr) {\n\t  if (Array.isArray(arr)) return arr;\n\t}\n\n\tfunction _iterableToArray(iter) {\n\t  if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter);\n\t}\n\n\tfunction _iterableToArrayLimit(arr, i) {\n\t  var _arr = [];\n\t  var _n = true;\n\t  var _d = false;\n\t  var _e = undefined;\n\n\t  try {\n\t    for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n\t      _arr.push(_s.value);\n\n\t      if (i && _arr.length === i) break;\n\t    }\n\t  } catch (err) {\n\t    _d = true;\n\t    _e = err;\n\t  } finally {\n\t    try {\n\t      if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n\t    } finally {\n\t      if (_d) throw _e;\n\t    }\n\t  }\n\n\t  return _arr;\n\t}\n\n\tfunction _nonIterableSpread() {\n\t  throw new TypeError(\"Invalid attempt to spread non-iterable instance\");\n\t}\n\n\tfunction _nonIterableRest() {\n\t  throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n\t}\n\n\tvar VERSION = '1.15.4';\n\tvar bootstrapVersion = 4;\n\n\ttry {\n\t  var rawVersion = $.fn.dropdown.Constructor.VERSION; // Only try to parse VERSION if it is defined.\n\t  // It is undefined in older versions of Bootstrap (tested with 3.1.1).\n\n\t  if (rawVersion !== undefined) {\n\t    bootstrapVersion = parseInt(rawVersion, 10);\n\t  }\n\t} catch (e) {// ignore\n\t}\n\n\tvar CONSTANTS = {\n\t  3: {\n\t    iconsPrefix: 'glyphicon',\n\t    icons: {\n\t      paginationSwitchDown: 'glyphicon-collapse-down icon-chevron-down',\n\t      paginationSwitchUp: 'glyphicon-collapse-up icon-chevron-up',\n\t      refresh: 'glyphicon-refresh icon-refresh',\n\t      toggleOff: 'glyphicon-list-alt icon-list-alt',\n\t      toggleOn: 'glyphicon-list-alt icon-list-alt',\n\t      columns: 'glyphicon-th icon-th',\n\t      detailOpen: 'glyphicon-plus icon-plus',\n\t      detailClose: 'glyphicon-minus icon-minus',\n\t      fullscreen: 'glyphicon-fullscreen',\n\t      search: 'glyphicon-search',\n\t      clearSearch: 'glyphicon-trash'\n\t    },\n\t    classes: {\n\t      buttonsPrefix: 'btn',\n\t      buttons: 'default',\n\t      buttonsGroup: 'btn-group',\n\t      buttonsDropdown: 'btn-group',\n\t      pull: 'pull',\n\t      inputGroup: 'input-group',\n\t      input: 'form-control',\n\t      paginationDropdown: 'btn-group dropdown',\n\t      dropup: 'dropup',\n\t      dropdownActive: 'active',\n\t      paginationActive: 'active',\n\t      buttonActive: 'active'\n\t    },\n\t    html: {\n\t      toolbarDropdown: ['<ul class=\"dropdown-menu\" role=\"menu\">', '</ul>'],\n\t      toolbarDropdownItem: '<li role=\"menuitem\"><label>%s</label></li>',\n\t      toolbarDropdownSeperator: '<li class=\"divider\"></li>',\n\t      pageDropdown: ['<ul class=\"dropdown-menu\" role=\"menu\">', '</ul>'],\n\t      pageDropdownItem: '<li role=\"menuitem\" class=\"%s\"><a href=\"#\">%s</a></li>',\n\t      dropdownCaret: '<span class=\"caret\"></span>',\n\t      pagination: ['<ul class=\"pagination%s\">', '</ul>'],\n\t      paginationItem: '<li class=\"page-item%s\"><a class=\"page-link\" aria-label=\"%s\" href=\"javascript:void(0)\">%s</a></li>',\n\t      icon: '<i class=\"%s %s\"></i>',\n\t      inputGroup: '<div class=\"input-group\">%s<span class=\"input-group-btn\">%s</span></div>',\n\t      searchInput: '<input class=\"%s%s\" type=\"text\" placeholder=\"%s\">',\n\t      searchButton: '<button class=\"%s\" type=\"button\" name=\"search\" title=\"%s\">%s %s</button>',\n\t      searchClearButton: '<button class=\"%s\" type=\"button\" name=\"clearSearch\" title=\"%s\">%s %s</button>'\n\t    }\n\t  },\n\t  4: {\n\t    iconsPrefix: 'fa',\n\t    icons: {\n\t      paginationSwitchDown: 'fa-caret-square-down',\n\t      paginationSwitchUp: 'fa-caret-square-up',\n\t      refresh: 'fa-sync',\n\t      toggleOff: 'fa-toggle-off',\n\t      toggleOn: 'fa-toggle-on',\n\t      columns: 'fa-th-list',\n\t      detailOpen: 'fa-plus',\n\t      detailClose: 'fa-minus',\n\t      fullscreen: 'fa-arrows-alt',\n\t      search: 'fa-search',\n\t      clearSearch: 'fa-trash'\n\t    },\n\t    classes: {\n\t      buttonsPrefix: 'btn',\n\t      buttons: 'secondary',\n\t      buttonsGroup: 'btn-group',\n\t      buttonsDropdown: 'btn-group',\n\t      pull: 'float',\n\t      inputGroup: 'btn-group',\n\t      input: 'form-control',\n\t      paginationDropdown: 'btn-group dropdown',\n\t      dropup: 'dropup',\n\t      dropdownActive: 'active',\n\t      paginationActive: 'active',\n\t      buttonActive: 'active'\n\t    },\n\t    html: {\n\t      toolbarDropdown: ['<div class=\"dropdown-menu dropdown-menu-right\">', '</div>'],\n\t      toolbarDropdownItem: '<label class=\"dropdown-item\">%s</label>',\n\t      pageDropdown: ['<div class=\"dropdown-menu\">', '</div>'],\n\t      pageDropdownItem: '<a class=\"dropdown-item %s\" href=\"#\">%s</a>',\n\t      toolbarDropdownSeperator: '<div class=\"dropdown-divider\"></div>',\n\t      dropdownCaret: '<span class=\"caret\"></span>',\n\t      pagination: ['<ul class=\"pagination%s\">', '</ul>'],\n\t      paginationItem: '<li class=\"page-item%s\"><a class=\"page-link\" aria-label=\"%s\" href=\"javascript:void(0)\">%s</a></li>',\n\t      icon: '<i class=\"%s %s\"></i>',\n\t      inputGroup: '<div class=\"input-group\">%s<div class=\"input-group-append\">%s</div></div>',\n\t      searchInput: '<input class=\"%s%s\" type=\"text\" placeholder=\"%s\">',\n\t      searchButton: '<button class=\"%s\" type=\"button\" name=\"search\" title=\"%s\">%s %s</button>',\n\t      searchClearButton: '<button class=\"%s\" type=\"button\" name=\"clearSearch\" title=\"%s\">%s %s</button>'\n\t    }\n\t  }\n\t}[bootstrapVersion];\n\tvar DEFAULTS = {\n\t  height: undefined,\n\t  classes: 'table table-bordered table-hover',\n\t  theadClasses: '',\n\t  rowStyle: function rowStyle(row, index) {\n\t    return {};\n\t  },\n\t  rowAttributes: function rowAttributes(row, index) {\n\t    return {};\n\t  },\n\t  undefinedText: '-',\n\t  locale: undefined,\n\t  virtualScroll: false,\n\t  virtualScrollItemHeight: undefined,\n\t  sortable: true,\n\t  sortClass: undefined,\n\t  silentSort: true,\n\t  sortName: undefined,\n\t  sortOrder: 'asc',\n\t  sortStable: false,\n\t  rememberOrder: false,\n\t  customSort: undefined,\n\t  columns: [[]],\n\t  data: [],\n\t  url: undefined,\n\t  method: 'get',\n\t  cache: true,\n\t  contentType: 'application/json',\n\t  dataType: 'json',\n\t  ajax: undefined,\n\t  ajaxOptions: {},\n\t  queryParams: function queryParams(params) {\n\t    return params;\n\t  },\n\t  queryParamsType: 'limit',\n\t  // 'limit', undefined\n\t  responseHandler: function responseHandler(res) {\n\t    return res;\n\t  },\n\t  totalField: 'total',\n\t  totalNotFilteredField: 'totalNotFiltered',\n\t  dataField: 'rows',\n\t  pagination: false,\n\t  onlyInfoPagination: false,\n\t  showExtendedPagination: false,\n\t  paginationLoop: true,\n\t  sidePagination: 'client',\n\t  // client or server\n\t  totalRows: 0,\n\t  totalNotFiltered: 0,\n\t  pageNumber: 1,\n\t  pageSize: 10,\n\t  pageList: [10, 25, 50, 100],\n\t  paginationHAlign: 'right',\n\t  // right, left\n\t  paginationVAlign: 'bottom',\n\t  // bottom, top, both\n\t  paginationDetailHAlign: 'left',\n\t  // right, left\n\t  paginationPreText: '&lsaquo;',\n\t  paginationNextText: '&rsaquo;',\n\t  paginationSuccessivelySize: 5,\n\t  // Maximum successively number of pages in a row\n\t  paginationPagesBySide: 1,\n\t  // Number of pages on each side (right, left) of the current page.\n\t  paginationUseIntermediate: false,\n\t  // Calculate intermediate pages for quick access\n\t  search: false,\n\t  searchOnEnterKey: false,\n\t  strictSearch: false,\n\t  visibleSearch: false,\n\t  showButtonIcons: true,\n\t  showButtonText: false,\n\t  showSearchButton: false,\n\t  showSearchClearButton: false,\n\t  trimOnSearch: true,\n\t  searchAlign: 'right',\n\t  searchTimeOut: 500,\n\t  searchText: '',\n\t  customSearch: undefined,\n\t  showHeader: true,\n\t  showFooter: false,\n\t  footerStyle: function footerStyle(row, index) {\n\t    return {};\n\t  },\n\t  showColumns: false,\n\t  showColumnsToggleAll: false,\n\t  minimumCountColumns: 1,\n\t  showPaginationSwitch: false,\n\t  showRefresh: false,\n\t  showToggle: false,\n\t  showFullscreen: false,\n\t  smartDisplay: true,\n\t  escape: false,\n\t  filterOptions: {\n\t    filterAlgorithm: 'and'\n\t  },\n\t  idField: undefined,\n\t  selectItemName: 'btSelectItem',\n\t  clickToSelect: false,\n\t  ignoreClickToSelectOn: function ignoreClickToSelectOn(_ref) {\n\t    var tagName = _ref.tagName;\n\t    return ['A', 'BUTTON'].includes(tagName);\n\t  },\n\t  singleSelect: false,\n\t  checkboxHeader: true,\n\t  maintainMetaData: false,\n\t  multipleSelectRow: false,\n\t  uniqueId: undefined,\n\t  cardView: false,\n\t  detailView: false,\n\t  detailViewIcon: true,\n\t  detailViewByClick: false,\n\t  detailFormatter: function detailFormatter(index, row) {\n\t    return '';\n\t  },\n\t  detailFilter: function detailFilter(index, row) {\n\t    return true;\n\t  },\n\t  toolbar: undefined,\n\t  toolbarAlign: 'left',\n\t  buttonsToolbar: undefined,\n\t  buttonsAlign: 'right',\n\t  buttonsPrefix: CONSTANTS.classes.buttonsPrefix,\n\t  buttonsClass: CONSTANTS.classes.buttons,\n\t  icons: CONSTANTS.icons,\n\t  html: CONSTANTS.html,\n\t  iconSize: undefined,\n\t  iconsPrefix: CONSTANTS.iconsPrefix,\n\t  // glyphicon or fa(font-awesome)\n\t  onAll: function onAll(name, args) {\n\t    return false;\n\t  },\n\t  onClickCell: function onClickCell(field, value, row, $element) {\n\t    return false;\n\t  },\n\t  onDblClickCell: function onDblClickCell(field, value, row, $element) {\n\t    return false;\n\t  },\n\t  onClickRow: function onClickRow(item, $element) {\n\t    return false;\n\t  },\n\t  onDblClickRow: function onDblClickRow(item, $element) {\n\t    return false;\n\t  },\n\t  onSort: function onSort(name, order) {\n\t    return false;\n\t  },\n\t  onCheck: function onCheck(row) {\n\t    return false;\n\t  },\n\t  onUncheck: function onUncheck(row) {\n\t    return false;\n\t  },\n\t  onCheckAll: function onCheckAll(rows) {\n\t    return false;\n\t  },\n\t  onUncheckAll: function onUncheckAll(rows) {\n\t    return false;\n\t  },\n\t  onCheckSome: function onCheckSome(rows) {\n\t    return false;\n\t  },\n\t  onUncheckSome: function onUncheckSome(rows) {\n\t    return false;\n\t  },\n\t  onLoadSuccess: function onLoadSuccess(data) {\n\t    return false;\n\t  },\n\t  onLoadError: function onLoadError(status) {\n\t    return false;\n\t  },\n\t  onColumnSwitch: function onColumnSwitch(field, checked) {\n\t    return false;\n\t  },\n\t  onPageChange: function onPageChange(number, size) {\n\t    return false;\n\t  },\n\t  onSearch: function onSearch(text) {\n\t    return false;\n\t  },\n\t  onToggle: function onToggle(cardView) {\n\t    return false;\n\t  },\n\t  onPreBody: function onPreBody(data) {\n\t    return false;\n\t  },\n\t  onPostBody: function onPostBody() {\n\t    return false;\n\t  },\n\t  onPostHeader: function onPostHeader() {\n\t    return false;\n\t  },\n\t  onPostFooter: function onPostFooter() {\n\t    return false;\n\t  },\n\t  onExpandRow: function onExpandRow(index, row, $detail) {\n\t    return false;\n\t  },\n\t  onCollapseRow: function onCollapseRow(index, row) {\n\t    return false;\n\t  },\n\t  onRefreshOptions: function onRefreshOptions(options) {\n\t    return false;\n\t  },\n\t  onRefresh: function onRefresh(params) {\n\t    return false;\n\t  },\n\t  onResetView: function onResetView() {\n\t    return false;\n\t  },\n\t  onScrollBody: function onScrollBody() {\n\t    return false;\n\t  }\n\t};\n\tvar EN = {\n\t  formatLoadingMessage: function formatLoadingMessage() {\n\t    return 'Loading, please wait';\n\t  },\n\t  formatRecordsPerPage: function formatRecordsPerPage(pageNumber) {\n\t    return \"\".concat(pageNumber, \" rows per page\");\n\t  },\n\t  formatShowingRows: function formatShowingRows(pageFrom, pageTo, totalRows, totalNotFiltered) {\n\t    if (totalNotFiltered !== undefined && totalNotFiltered > 0 && totalNotFiltered > totalRows) {\n\t      return \"Showing \".concat(pageFrom, \" to \").concat(pageTo, \" of \").concat(totalRows, \" rows (filtered from \").concat(totalNotFiltered, \" total rows)\");\n\t    }\n\n\t    return \"Showing \".concat(pageFrom, \" to \").concat(pageTo, \" of \").concat(totalRows, \" rows\");\n\t  },\n\t  formatSRPaginationPreText: function formatSRPaginationPreText() {\n\t    return 'previous page';\n\t  },\n\t  formatSRPaginationPageText: function formatSRPaginationPageText(page) {\n\t    return \"to page \".concat(page);\n\t  },\n\t  formatSRPaginationNextText: function formatSRPaginationNextText() {\n\t    return 'next page';\n\t  },\n\t  formatDetailPagination: function formatDetailPagination(totalRows) {\n\t    return \"Showing \".concat(totalRows, \" rows\");\n\t  },\n\t  formatSearch: function formatSearch() {\n\t    return 'Search';\n\t  },\n\t  formatClearSearch: function formatClearSearch() {\n\t    return 'Clear Search';\n\t  },\n\t  formatNoMatches: function formatNoMatches() {\n\t    return 'No matching records found';\n\t  },\n\t  formatPaginationSwitch: function formatPaginationSwitch() {\n\t    return 'Hide/Show pagination';\n\t  },\n\t  formatPaginationSwitchDown: function formatPaginationSwitchDown() {\n\t    return 'Show pagination';\n\t  },\n\t  formatPaginationSwitchUp: function formatPaginationSwitchUp() {\n\t    return 'Hide pagination';\n\t  },\n\t  formatRefresh: function formatRefresh() {\n\t    return 'Refresh';\n\t  },\n\t  formatToggle: function formatToggle() {\n\t    return 'Toggle';\n\t  },\n\t  formatToggleOn: function formatToggleOn() {\n\t    return 'Show card view';\n\t  },\n\t  formatToggleOff: function formatToggleOff() {\n\t    return 'Hide card view';\n\t  },\n\t  formatColumns: function formatColumns() {\n\t    return 'Columns';\n\t  },\n\t  formatColumnsToggleAll: function formatColumnsToggleAll() {\n\t    return 'Toggle all';\n\t  },\n\t  formatFullscreen: function formatFullscreen() {\n\t    return 'Fullscreen';\n\t  },\n\t  formatAllRows: function formatAllRows() {\n\t    return 'All';\n\t  }\n\t};\n\tvar COLUMN_DEFAULTS = {\n\t  field: undefined,\n\t  title: undefined,\n\t  titleTooltip: undefined,\n\t  'class': undefined,\n\t  width: undefined,\n\t  widthUnit: 'px',\n\t  rowspan: undefined,\n\t  colspan: undefined,\n\t  align: undefined,\n\t  // left, right, center\n\t  halign: undefined,\n\t  // left, right, center\n\t  falign: undefined,\n\t  // left, right, center\n\t  valign: undefined,\n\t  // top, middle, bottom\n\t  cellStyle: undefined,\n\t  radio: false,\n\t  checkbox: false,\n\t  checkboxEnabled: true,\n\t  clickToSelect: true,\n\t  showSelectTitle: false,\n\t  sortable: false,\n\t  sortName: undefined,\n\t  order: 'asc',\n\t  // asc, desc\n\t  sorter: undefined,\n\t  visible: true,\n\t  switchable: true,\n\t  cardVisible: true,\n\t  searchable: true,\n\t  formatter: undefined,\n\t  footerFormatter: undefined,\n\t  detailFormatter: undefined,\n\t  searchFormatter: true,\n\t  escape: false,\n\t  events: undefined\n\t};\n\tvar METHODS = ['getOptions', 'refreshOptions', 'getData', 'getSelections', 'getAllSelections', 'load', 'append', 'prepend', 'remove', 'removeAll', 'insertRow', 'updateRow', 'getRowByUniqueId', 'updateByUniqueId', 'removeByUniqueId', 'updateCell', 'updateCellByUniqueId', 'showRow', 'hideRow', 'getHiddenRows', 'showColumn', 'hideColumn', 'getVisibleColumns', 'getHiddenColumns', 'showAllColumns', 'hideAllColumns', 'mergeCells', 'checkAll', 'uncheckAll', 'checkInvert', 'check', 'uncheck', 'checkBy', 'uncheckBy', 'refresh', 'destroy', 'resetView', 'resetWidth', 'showLoading', 'hideLoading', 'togglePagination', 'toggleFullscreen', 'toggleView', 'resetSearch', 'filterBy', 'scrollTo', 'getScrollPosition', 'selectPage', 'prevPage', 'nextPage', 'toggleDetailView', 'expandRow', 'collapseRow', 'expandAllRows', 'collapseAllRows', 'updateColumnTitle', 'updateFormatText'];\n\tvar EVENTS = {\n\t  'all.bs.table': 'onAll',\n\t  'click-row.bs.table': 'onClickRow',\n\t  'dbl-click-row.bs.table': 'onDblClickRow',\n\t  'click-cell.bs.table': 'onClickCell',\n\t  'dbl-click-cell.bs.table': 'onDblClickCell',\n\t  'sort.bs.table': 'onSort',\n\t  'check.bs.table': 'onCheck',\n\t  'uncheck.bs.table': 'onUncheck',\n\t  'check-all.bs.table': 'onCheckAll',\n\t  'uncheck-all.bs.table': 'onUncheckAll',\n\t  'check-some.bs.table': 'onCheckSome',\n\t  'uncheck-some.bs.table': 'onUncheckSome',\n\t  'load-success.bs.table': 'onLoadSuccess',\n\t  'load-error.bs.table': 'onLoadError',\n\t  'column-switch.bs.table': 'onColumnSwitch',\n\t  'page-change.bs.table': 'onPageChange',\n\t  'search.bs.table': 'onSearch',\n\t  'toggle.bs.table': 'onToggle',\n\t  'pre-body.bs.table': 'onPreBody',\n\t  'post-body.bs.table': 'onPostBody',\n\t  'post-header.bs.table': 'onPostHeader',\n\t  'post-footer.bs.table': 'onPostFooter',\n\t  'expand-row.bs.table': 'onExpandRow',\n\t  'collapse-row.bs.table': 'onCollapseRow',\n\t  'refresh-options.bs.table': 'onRefreshOptions',\n\t  'reset-view.bs.table': 'onResetView',\n\t  'refresh.bs.table': 'onRefresh',\n\t  'scroll-body.bs.table': 'onScrollBody'\n\t};\n\tObject.assign(DEFAULTS, EN);\n\tvar Constants = {\n\t  VERSION: VERSION,\n\t  THEME: \"bootstrap\".concat(bootstrapVersion),\n\t  CONSTANTS: CONSTANTS,\n\t  DEFAULTS: DEFAULTS,\n\t  COLUMN_DEFAULTS: COLUMN_DEFAULTS,\n\t  METHODS: METHODS,\n\t  EVENTS: EVENTS,\n\t  LOCALES: {\n\t    en: EN,\n\t    'en-US': EN\n\t  }\n\t};\n\n\t// `FlattenIntoArray` abstract operation\n\t// https://tc39.github.io/proposal-flatMap/#sec-FlattenIntoArray\n\tvar flattenIntoArray = function (target, original, source, sourceLen, start, depth, mapper, thisArg) {\n\t  var targetIndex = start;\n\t  var sourceIndex = 0;\n\t  var mapFn = mapper ? bindContext(mapper, thisArg, 3) : false;\n\t  var element;\n\n\t  while (sourceIndex < sourceLen) {\n\t    if (sourceIndex in source) {\n\t      element = mapFn ? mapFn(source[sourceIndex], sourceIndex, original) : source[sourceIndex];\n\n\t      if (depth > 0 && isArray(element)) {\n\t        targetIndex = flattenIntoArray(target, original, element, toLength(element.length), targetIndex, depth - 1) - 1;\n\t      } else {\n\t        if (targetIndex >= 0x1FFFFFFFFFFFFF) throw TypeError('Exceed the acceptable array length');\n\t        target[targetIndex] = element;\n\t      }\n\n\t      targetIndex++;\n\t    }\n\t    sourceIndex++;\n\t  }\n\t  return targetIndex;\n\t};\n\n\tvar flattenIntoArray_1 = flattenIntoArray;\n\n\t// `Array.prototype.flat` method\n\t// https://github.com/tc39/proposal-flatMap\n\t_export({ target: 'Array', proto: true }, {\n\t  flat: function flat(/* depthArg = 1 */) {\n\t    var depthArg = arguments.length ? arguments[0] : undefined;\n\t    var O = toObject(this);\n\t    var sourceLen = toLength(O.length);\n\t    var A = arraySpeciesCreate(O, 0);\n\t    A.length = flattenIntoArray_1(A, O, O, sourceLen, 0, depthArg === undefined ? 1 : toInteger(depthArg));\n\t    return A;\n\t  }\n\t});\n\n\t// this method was added to unscopables after implementation\n\t// in popular engines, so it's moved to a separate module\n\n\n\taddToUnscopables('flat');\n\n\tvar FAILS_ON_PRIMITIVES = fails(function () { objectKeys(1); });\n\n\t// `Object.keys` method\n\t// https://tc39.github.io/ecma262/#sec-object.keys\n\t_export({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {\n\t  keys: function keys(it) {\n\t    return objectKeys(toObject(it));\n\t  }\n\t});\n\n\tvar Utils = {\n\t  // it only does '%s', and return '' when arguments are undefined\n\t  sprintf: function sprintf(_str) {\n\t    for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n\t      args[_key - 1] = arguments[_key];\n\t    }\n\n\t    var flag = true;\n\t    var i = 0;\n\n\t    var str = _str.replace(/%s/g, function () {\n\t      var arg = args[i++];\n\n\t      if (typeof arg === 'undefined') {\n\t        flag = false;\n\t        return '';\n\t      }\n\n\t      return arg;\n\t    });\n\n\t    return flag ? str : '';\n\t  },\n\t  isEmptyObject: function isEmptyObject() {\n\t    var obj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\t    return Object.entries(obj).length === 0 && obj.constructor === Object;\n\t  },\n\t  isNumeric: function isNumeric(n) {\n\t    return !isNaN(parseFloat(n)) && isFinite(n);\n\t  },\n\t  getFieldTitle: function getFieldTitle(list, value) {\n\t    var _iteratorNormalCompletion = true;\n\t    var _didIteratorError = false;\n\t    var _iteratorError = undefined;\n\n\t    try {\n\t      for (var _iterator = list[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n\t        var item = _step.value;\n\n\t        if (item.field === value) {\n\t          return item.title;\n\t        }\n\t      }\n\t    } catch (err) {\n\t      _didIteratorError = true;\n\t      _iteratorError = err;\n\t    } finally {\n\t      try {\n\t        if (!_iteratorNormalCompletion && _iterator.return != null) {\n\t          _iterator.return();\n\t        }\n\t      } finally {\n\t        if (_didIteratorError) {\n\t          throw _iteratorError;\n\t        }\n\t      }\n\t    }\n\n\t    return '';\n\t  },\n\t  setFieldIndex: function setFieldIndex(columns) {\n\t    var totalCol = 0;\n\t    var flag = [];\n\t    var _iteratorNormalCompletion2 = true;\n\t    var _didIteratorError2 = false;\n\t    var _iteratorError2 = undefined;\n\n\t    try {\n\t      for (var _iterator2 = columns[0][Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n\t        var column = _step2.value;\n\t        totalCol += column.colspan || 1;\n\t      }\n\t    } catch (err) {\n\t      _didIteratorError2 = true;\n\t      _iteratorError2 = err;\n\t    } finally {\n\t      try {\n\t        if (!_iteratorNormalCompletion2 && _iterator2.return != null) {\n\t          _iterator2.return();\n\t        }\n\t      } finally {\n\t        if (_didIteratorError2) {\n\t          throw _iteratorError2;\n\t        }\n\t      }\n\t    }\n\n\t    for (var i = 0; i < columns.length; i++) {\n\t      flag[i] = [];\n\n\t      for (var j = 0; j < totalCol; j++) {\n\t        flag[i][j] = false;\n\t      }\n\t    }\n\n\t    for (var _i = 0; _i < columns.length; _i++) {\n\t      var _iteratorNormalCompletion3 = true;\n\t      var _didIteratorError3 = false;\n\t      var _iteratorError3 = undefined;\n\n\t      try {\n\t        for (var _iterator3 = columns[_i][Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {\n\t          var r = _step3.value;\n\t          var rowspan = r.rowspan || 1;\n\t          var colspan = r.colspan || 1;\n\n\t          var index = flag[_i].indexOf(false);\n\n\t          r.colspanIndex = index;\n\n\t          if (colspan === 1) {\n\t            r.fieldIndex = index; // when field is undefined, use index instead\n\n\t            if (typeof r.field === 'undefined') {\n\t              r.field = index;\n\t            }\n\t          } else {\n\t            r.colspanGroup = r.colspan;\n\t          }\n\n\t          for (var k = 0; k < rowspan; k++) {\n\t            flag[_i + k][index] = true;\n\t          }\n\n\t          for (var _k = 0; _k < colspan; _k++) {\n\t            flag[_i][index + _k] = true;\n\t          }\n\t        }\n\t      } catch (err) {\n\t        _didIteratorError3 = true;\n\t        _iteratorError3 = err;\n\t      } finally {\n\t        try {\n\t          if (!_iteratorNormalCompletion3 && _iterator3.return != null) {\n\t            _iterator3.return();\n\t          }\n\t        } finally {\n\t          if (_didIteratorError3) {\n\t            throw _iteratorError3;\n\t          }\n\t        }\n\t      }\n\t    }\n\t  },\n\t  updateFieldGroup: function updateFieldGroup(columns) {\n\t    var allColumns = columns.flat();\n\t    var _iteratorNormalCompletion4 = true;\n\t    var _didIteratorError4 = false;\n\t    var _iteratorError4 = undefined;\n\n\t    try {\n\t      for (var _iterator4 = columns[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {\n\t        var c = _step4.value;\n\t        var _iteratorNormalCompletion5 = true;\n\t        var _didIteratorError5 = false;\n\t        var _iteratorError5 = undefined;\n\n\t        try {\n\t          for (var _iterator5 = c[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {\n\t            var r = _step5.value;\n\n\t            if (r.colspanGroup > 1) {\n\t              var colspan = 0;\n\n\t              var _loop = function _loop(i) {\n\t                var column = allColumns.find(function (col) {\n\t                  return col.fieldIndex === i;\n\t                });\n\n\t                if (column.visible) {\n\t                  colspan++;\n\t                }\n\t              };\n\n\t              for (var i = r.colspanIndex; i < r.colspanIndex + r.colspanGroup; i++) {\n\t                _loop(i);\n\t              }\n\n\t              r.colspan = colspan;\n\t              r.visible = colspan > 0;\n\t            }\n\t          }\n\t        } catch (err) {\n\t          _didIteratorError5 = true;\n\t          _iteratorError5 = err;\n\t        } finally {\n\t          try {\n\t            if (!_iteratorNormalCompletion5 && _iterator5.return != null) {\n\t              _iterator5.return();\n\t            }\n\t          } finally {\n\t            if (_didIteratorError5) {\n\t              throw _iteratorError5;\n\t            }\n\t          }\n\t        }\n\t      }\n\t    } catch (err) {\n\t      _didIteratorError4 = true;\n\t      _iteratorError4 = err;\n\t    } finally {\n\t      try {\n\t        if (!_iteratorNormalCompletion4 && _iterator4.return != null) {\n\t          _iterator4.return();\n\t        }\n\t      } finally {\n\t        if (_didIteratorError4) {\n\t          throw _iteratorError4;\n\t        }\n\t      }\n\t    }\n\t  },\n\t  getScrollBarWidth: function getScrollBarWidth() {\n\t    if (this.cachedWidth === undefined) {\n\t      var $inner = $('<div/>').addClass('fixed-table-scroll-inner');\n\t      var $outer = $('<div/>').addClass('fixed-table-scroll-outer');\n\t      $outer.append($inner);\n\t      $('body').append($outer);\n\t      var w1 = $inner[0].offsetWidth;\n\t      $outer.css('overflow', 'scroll');\n\t      var w2 = $inner[0].offsetWidth;\n\n\t      if (w1 === w2) {\n\t        w2 = $outer[0].clientWidth;\n\t      }\n\n\t      $outer.remove();\n\t      this.cachedWidth = w1 - w2;\n\t    }\n\n\t    return this.cachedWidth;\n\t  },\n\t  calculateObjectValue: function calculateObjectValue(self, name, args, defaultValue) {\n\t    var func = name;\n\n\t    if (typeof name === 'string') {\n\t      // support obj.func1.func2\n\t      var names = name.split('.');\n\n\t      if (names.length > 1) {\n\t        func = window;\n\t        var _iteratorNormalCompletion6 = true;\n\t        var _didIteratorError6 = false;\n\t        var _iteratorError6 = undefined;\n\n\t        try {\n\t          for (var _iterator6 = names[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) {\n\t            var f = _step6.value;\n\t            func = func[f];\n\t          }\n\t        } catch (err) {\n\t          _didIteratorError6 = true;\n\t          _iteratorError6 = err;\n\t        } finally {\n\t          try {\n\t            if (!_iteratorNormalCompletion6 && _iterator6.return != null) {\n\t              _iterator6.return();\n\t            }\n\t          } finally {\n\t            if (_didIteratorError6) {\n\t              throw _iteratorError6;\n\t            }\n\t          }\n\t        }\n\t      } else {\n\t        func = window[name];\n\t      }\n\t    }\n\n\t    if (func !== null && _typeof(func) === 'object') {\n\t      return func;\n\t    }\n\n\t    if (typeof func === 'function') {\n\t      return func.apply(self, args || []);\n\t    }\n\n\t    if (!func && typeof name === 'string' && this.sprintf.apply(this, [name].concat(_toConsumableArray(args)))) {\n\t      return this.sprintf.apply(this, [name].concat(_toConsumableArray(args)));\n\t    }\n\n\t    return defaultValue;\n\t  },\n\t  compareObjects: function compareObjects(objectA, objectB, compareLength) {\n\t    var aKeys = Object.keys(objectA);\n\t    var bKeys = Object.keys(objectB);\n\n\t    if (compareLength && aKeys.length !== bKeys.length) {\n\t      return false;\n\t    }\n\n\t    for (var _i2 = 0, _aKeys = aKeys; _i2 < _aKeys.length; _i2++) {\n\t      var key = _aKeys[_i2];\n\n\t      if (bKeys.includes(key) && objectA[key] !== objectB[key]) {\n\t        return false;\n\t      }\n\t    }\n\n\t    return true;\n\t  },\n\t  escapeHTML: function escapeHTML(text) {\n\t    if (typeof text === 'string') {\n\t      return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;').replace(/'/g, '&#039;').replace(/`/g, '&#x60;');\n\t    }\n\n\t    return text;\n\t  },\n\t  getRealDataAttr: function getRealDataAttr(dataAttr) {\n\t    for (var _i3 = 0, _Object$entries = Object.entries(dataAttr); _i3 < _Object$entries.length; _i3++) {\n\t      var _Object$entries$_i = _slicedToArray(_Object$entries[_i3], 2),\n\t          attr = _Object$entries$_i[0],\n\t          value = _Object$entries$_i[1];\n\n\t      var auxAttr = attr.split(/(?=[A-Z])/).join('-').toLowerCase();\n\n\t      if (auxAttr !== attr) {\n\t        dataAttr[auxAttr] = value;\n\t        delete dataAttr[attr];\n\t      }\n\t    }\n\n\t    return dataAttr;\n\t  },\n\t  getItemField: function getItemField(item, field, escape) {\n\t    var value = item;\n\n\t    if (typeof field !== 'string' || item.hasOwnProperty(field)) {\n\t      return escape ? this.escapeHTML(item[field]) : item[field];\n\t    }\n\n\t    var props = field.split('.');\n\t    var _iteratorNormalCompletion7 = true;\n\t    var _didIteratorError7 = false;\n\t    var _iteratorError7 = undefined;\n\n\t    try {\n\t      for (var _iterator7 = props[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) {\n\t        var p = _step7.value;\n\t        value = value && value[p];\n\t      }\n\t    } catch (err) {\n\t      _didIteratorError7 = true;\n\t      _iteratorError7 = err;\n\t    } finally {\n\t      try {\n\t        if (!_iteratorNormalCompletion7 && _iterator7.return != null) {\n\t          _iterator7.return();\n\t        }\n\t      } finally {\n\t        if (_didIteratorError7) {\n\t          throw _iteratorError7;\n\t        }\n\t      }\n\t    }\n\n\t    return escape ? this.escapeHTML(value) : value;\n\t  },\n\t  isIEBrowser: function isIEBrowser() {\n\t    return navigator.userAgent.includes('MSIE ') || /Trident.*rv:11\\./.test(navigator.userAgent);\n\t  },\n\t  findIndex: function findIndex(items, item) {\n\t    var _iteratorNormalCompletion8 = true;\n\t    var _didIteratorError8 = false;\n\t    var _iteratorError8 = undefined;\n\n\t    try {\n\t      for (var _iterator8 = items[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) {\n\t        var it = _step8.value;\n\n\t        if (JSON.stringify(it) === JSON.stringify(item)) {\n\t          return items.indexOf(it);\n\t        }\n\t      }\n\t    } catch (err) {\n\t      _didIteratorError8 = true;\n\t      _iteratorError8 = err;\n\t    } finally {\n\t      try {\n\t        if (!_iteratorNormalCompletion8 && _iterator8.return != null) {\n\t          _iterator8.return();\n\t        }\n\t      } finally {\n\t        if (_didIteratorError8) {\n\t          throw _iteratorError8;\n\t        }\n\t      }\n\t    }\n\n\t    return -1;\n\t  },\n\t  trToData: function trToData(columns, $els) {\n\t    var _this = this;\n\n\t    var data = [];\n\t    var m = [];\n\t    $els.each(function (y, el) {\n\t      var row = {}; // save tr's id, class and data-* attributes\n\n\t      row._id = $(el).attr('id');\n\t      row._class = $(el).attr('class');\n\t      row._data = _this.getRealDataAttr($(el).data());\n\t      $(el).find('>td,>th').each(function (_x, el) {\n\t        var cspan = +$(el).attr('colspan') || 1;\n\t        var rspan = +$(el).attr('rowspan') || 1;\n\t        var x = _x; // skip already occupied cells in current row\n\n\t        for (; m[y] && m[y][x]; x++) {} // ignore\n\t        // mark matrix elements occupied by current cell with true\n\n\n\t        for (var tx = x; tx < x + cspan; tx++) {\n\t          for (var ty = y; ty < y + rspan; ty++) {\n\t            if (!m[ty]) {\n\t              // fill missing rows\n\t              m[ty] = [];\n\t            }\n\n\t            m[ty][tx] = true;\n\t          }\n\t        }\n\n\t        var field = columns[x].field;\n\t        row[field] = $(el).html().trim(); // save td's id, class and data-* attributes\n\n\t        row[\"_\".concat(field, \"_id\")] = $(el).attr('id');\n\t        row[\"_\".concat(field, \"_class\")] = $(el).attr('class');\n\t        row[\"_\".concat(field, \"_rowspan\")] = $(el).attr('rowspan');\n\t        row[\"_\".concat(field, \"_colspan\")] = $(el).attr('colspan');\n\t        row[\"_\".concat(field, \"_title\")] = $(el).attr('title');\n\t        row[\"_\".concat(field, \"_data\")] = _this.getRealDataAttr($(el).data());\n\t      });\n\t      data.push(row);\n\t    });\n\t    return data;\n\t  },\n\t  sort: function sort(a, b, order, sortStable) {\n\t    if (a === undefined || a === null) {\n\t      a = '';\n\t    }\n\n\t    if (b === undefined || b === null) {\n\t      b = '';\n\t    }\n\n\t    if (sortStable && a === b) {\n\t      a = a._position;\n\t      b = b._position;\n\t    } // If both values are numeric, do a numeric comparison\n\n\n\t    if (this.isNumeric(a) && this.isNumeric(b)) {\n\t      // Convert numerical values form string to float.\n\t      a = parseFloat(a);\n\t      b = parseFloat(b);\n\n\t      if (a < b) {\n\t        return order * -1;\n\t      }\n\n\t      if (a > b) {\n\t        return order;\n\t      }\n\n\t      return 0;\n\t    }\n\n\t    if (a === b) {\n\t      return 0;\n\t    } // If value is not a string, convert to string\n\n\n\t    if (typeof a !== 'string') {\n\t      a = a.toString();\n\t    }\n\n\t    if (a.localeCompare(b) === -1) {\n\t      return order * -1;\n\t    }\n\n\t    return order;\n\t  }\n\t};\n\n\tvar BLOCK_ROWS = 50;\n\tvar CLUSTER_BLOCKS = 4;\n\n\tvar VirtualScroll =\n\t/*#__PURE__*/\n\tfunction () {\n\t  function VirtualScroll(options) {\n\t    var _this = this;\n\n\t    _classCallCheck(this, VirtualScroll);\n\n\t    this.rows = options.rows;\n\t    this.scrollEl = options.scrollEl;\n\t    this.contentEl = options.contentEl;\n\t    this.callback = options.callback;\n\t    this.itemHeight = options.itemHeight;\n\t    this.cache = {};\n\t    this.scrollTop = this.scrollEl.scrollTop;\n\t    this.initDOM(this.rows);\n\t    this.scrollEl.scrollTop = this.scrollTop;\n\t    this.lastCluster = 0;\n\n\t    var onScroll = function onScroll() {\n\t      if (_this.lastCluster !== (_this.lastCluster = _this.getNum())) {\n\t        _this.initDOM(_this.rows);\n\n\t        _this.callback();\n\t      }\n\t    };\n\n\t    this.scrollEl.addEventListener('scroll', onScroll, false);\n\n\t    this.destroy = function () {\n\t      _this.contentEl.innerHtml = '';\n\n\t      _this.scrollEl.removeEventListener('scroll', onScroll, false);\n\t    };\n\t  }\n\n\t  _createClass(VirtualScroll, [{\n\t    key: \"initDOM\",\n\t    value: function initDOM(rows) {\n\t      if (typeof this.clusterHeight === 'undefined') {\n\t        this.cache.data = this.contentEl.innerHTML = rows[0] + rows[0] + rows[0];\n\t        this.getRowsHeight(rows);\n\t      }\n\n\t      var data = this.initData(rows, this.getNum());\n\t      var thisRows = data.rows.join('');\n\t      var dataChanged = this.checkChanges('data', thisRows);\n\t      var topOffsetChanged = this.checkChanges('top', data.topOffset);\n\t      var bottomOffsetChanged = this.checkChanges('bottom', data.bottomOffset);\n\t      var html = [];\n\n\t      if (dataChanged && topOffsetChanged) {\n\t        if (data.topOffset) {\n\t          html.push(this.getExtra('top', data.topOffset));\n\t        }\n\n\t        html.push(thisRows);\n\n\t        if (data.bottomOffset) {\n\t          html.push(this.getExtra('bottom', data.bottomOffset));\n\t        }\n\n\t        this.contentEl.innerHTML = html.join('');\n\t      } else if (bottomOffsetChanged) {\n\t        this.contentEl.lastChild.style.height = \"\".concat(data.bottomOffset, \"px\");\n\t      }\n\t    }\n\t  }, {\n\t    key: \"getRowsHeight\",\n\t    value: function getRowsHeight() {\n\t      if (typeof this.itemHeight === 'undefined') {\n\t        var nodes = this.contentEl.children;\n\t        var node = nodes[Math.floor(nodes.length / 2)];\n\t        this.itemHeight = node.offsetHeight;\n\t      }\n\n\t      this.blockHeight = this.itemHeight * BLOCK_ROWS;\n\t      this.clusterRows = BLOCK_ROWS * CLUSTER_BLOCKS;\n\t      this.clusterHeight = this.blockHeight * CLUSTER_BLOCKS;\n\t    }\n\t  }, {\n\t    key: \"getNum\",\n\t    value: function getNum() {\n\t      this.scrollTop = this.scrollEl.scrollTop;\n\t      return Math.floor(this.scrollTop / (this.clusterHeight - this.blockHeight)) || 0;\n\t    }\n\t  }, {\n\t    key: \"initData\",\n\t    value: function initData(rows, num) {\n\t      if (rows.length < BLOCK_ROWS) {\n\t        return {\n\t          topOffset: 0,\n\t          bottomOffset: 0,\n\t          rowsAbove: 0,\n\t          rows: rows\n\t        };\n\t      }\n\n\t      var start = Math.max((this.clusterRows - BLOCK_ROWS) * num, 0);\n\t      var end = start + this.clusterRows;\n\t      var topOffset = Math.max(start * this.itemHeight, 0);\n\t      var bottomOffset = Math.max((rows.length - end) * this.itemHeight, 0);\n\t      var thisRows = [];\n\t      var rowsAbove = start;\n\n\t      if (topOffset < 1) {\n\t        rowsAbove++;\n\t      }\n\n\t      for (var i = start; i < end; i++) {\n\t        rows[i] && thisRows.push(rows[i]);\n\t      }\n\n\t      return {\n\t        topOffset: topOffset,\n\t        bottomOffset: bottomOffset,\n\t        rowsAbove: rowsAbove,\n\t        rows: thisRows\n\t      };\n\t    }\n\t  }, {\n\t    key: \"checkChanges\",\n\t    value: function checkChanges(type, value) {\n\t      var changed = value !== this.cache[type];\n\t      this.cache[type] = value;\n\t      return changed;\n\t    }\n\t  }, {\n\t    key: \"getExtra\",\n\t    value: function getExtra(className, height) {\n\t      var tag = document.createElement('tr');\n\t      tag.className = \"virtual-scroll-\".concat(className);\n\n\t      if (height) {\n\t        tag.style.height = \"\".concat(height, \"px\");\n\t      }\n\n\t      return tag.outerHTML;\n\t    }\n\t  }]);\n\n\t  return VirtualScroll;\n\t}();\n\n\tvar BootstrapTable =\n\t/*#__PURE__*/\n\tfunction () {\n\t  function BootstrapTable(el, options) {\n\t    _classCallCheck(this, BootstrapTable);\n\n\t    this.options = options;\n\t    this.$el = $(el);\n\t    this.$el_ = this.$el.clone();\n\t    this.timeoutId_ = 0;\n\t    this.timeoutFooter_ = 0;\n\t    this.init();\n\t  }\n\n\t  _createClass(BootstrapTable, [{\n\t    key: \"init\",\n\t    value: function init() {\n\t      this.initConstants();\n\t      this.initLocale();\n\t      this.initContainer();\n\t      this.initTable();\n\t      this.initHeader();\n\t      this.initData();\n\t      this.initHiddenRows();\n\t      this.initToolbar();\n\t      this.initPagination();\n\t      this.initBody();\n\t      this.initSearchText();\n\t      this.initServer();\n\t    }\n\t  }, {\n\t    key: \"initConstants\",\n\t    value: function initConstants() {\n\t      var o = this.options;\n\t      this.constants = Constants.CONSTANTS;\n\t      this.constants.theme = $.fn.bootstrapTable.theme;\n\t      var buttonsPrefix = o.buttonsPrefix ? \"\".concat(o.buttonsPrefix, \"-\") : '';\n\t      this.constants.buttonsClass = [o.buttonsPrefix, buttonsPrefix + o.buttonsClass, Utils.sprintf(\"\".concat(buttonsPrefix, \"%s\"), o.iconSize)].join(' ').trim();\n\t    }\n\t  }, {\n\t    key: \"initLocale\",\n\t    value: function initLocale() {\n\t      if (this.options.locale) {\n\t        var locales = $.fn.bootstrapTable.locales;\n\t        var parts = this.options.locale.split(/-|_/);\n\t        parts[0] = parts[0].toLowerCase();\n\n\t        if (parts[1]) {\n\t          parts[1] = parts[1].toUpperCase();\n\t        }\n\n\t        if (locales[this.options.locale]) {\n\t          $.extend(this.options, locales[this.options.locale]);\n\t        } else if (locales[parts.join('-')]) {\n\t          $.extend(this.options, locales[parts.join('-')]);\n\t        } else if (locales[parts[0]]) {\n\t          $.extend(this.options, locales[parts[0]]);\n\t        }\n\t      }\n\t    }\n\t  }, {\n\t    key: \"initContainer\",\n\t    value: function initContainer() {\n\t      var topPagination = ['top', 'both'].includes(this.options.paginationVAlign) ? '<div class=\"fixed-table-pagination clearfix\"></div>' : '';\n\t      var bottomPagination = ['bottom', 'both'].includes(this.options.paginationVAlign) ? '<div class=\"fixed-table-pagination\"></div>' : '';\n\t      this.$container = $(\"\\n      <div class=\\\"bootstrap-table \".concat(this.constants.theme, \"\\\">\\n      <div class=\\\"fixed-table-toolbar\\\"></div>\\n      \").concat(topPagination, \"\\n      <div class=\\\"fixed-table-container\\\">\\n      <div class=\\\"fixed-table-header\\\"><table></table></div>\\n      <div class=\\\"fixed-table-body\\\">\\n      <div class=\\\"fixed-table-loading\\\">\\n      <span class=\\\"loading-wrap\\\">\\n      <span class=\\\"loading-text\\\">\").concat(this.options.formatLoadingMessage(), \"</span>\\n      <span class=\\\"animation-wrap\\\"><span class=\\\"animation-dot\\\"></span></span>\\n      </span>\\n      </div>\\n      </div>\\n      <div class=\\\"fixed-table-footer\\\"><table><thead><tr></tr></thead></table></div>\\n      </div>\\n      \").concat(bottomPagination, \"\\n      </div>\\n    \"));\n\t      this.$container.insertAfter(this.$el);\n\t      this.$tableContainer = this.$container.find('.fixed-table-container');\n\t      this.$tableHeader = this.$container.find('.fixed-table-header');\n\t      this.$tableBody = this.$container.find('.fixed-table-body');\n\t      this.$tableLoading = this.$container.find('.fixed-table-loading');\n\t      this.$tableFooter = this.$el.find('tfoot'); // checking if custom table-toolbar exists or not\n\n\t      if (this.options.buttonsToolbar) {\n\t        this.$toolbar = $('body').find(this.options.buttonsToolbar);\n\t      } else {\n\t        this.$toolbar = this.$container.find('.fixed-table-toolbar');\n\t      }\n\n\t      this.$pagination = this.$container.find('.fixed-table-pagination');\n\t      this.$tableBody.append(this.$el);\n\t      this.$container.after('<div class=\"clearfix\"></div>');\n\t      this.$el.addClass(this.options.classes);\n\t      this.$tableLoading.addClass(this.options.classes);\n\n\t      if (this.options.height) {\n\t        this.$tableContainer.addClass('fixed-height');\n\n\t        if (this.options.showFooter) {\n\t          this.$tableContainer.addClass('has-footer');\n\t        }\n\n\t        if (this.options.classes.split(' ').includes('table-bordered')) {\n\t          this.$tableBody.append('<div class=\"fixed-table-border\"></div>');\n\t          this.$tableBorder = this.$tableBody.find('.fixed-table-border');\n\t          this.$tableLoading.addClass('fixed-table-border');\n\t        }\n\n\t        this.$tableFooter = this.$container.find('.fixed-table-footer');\n\t      } else {\n\t        if (!this.$tableFooter.length) {\n\t          this.$el.append('<tfoot><tr></tr></tfoot>');\n\t          this.$tableFooter = this.$el.find('tfoot');\n\t        }\n\t      }\n\t    }\n\t  }, {\n\t    key: \"initTable\",\n\t    value: function initTable() {\n\t      var _this = this;\n\n\t      var columns = [];\n\t      var data = [];\n\t      this.$header = this.$el.find('>thead');\n\n\t      if (!this.$header.length) {\n\t        this.$header = $(\"<thead class=\\\"\".concat(this.options.theadClasses, \"\\\"></thead>\")).appendTo(this.$el);\n\t      } else if (this.options.theadClasses) {\n\t        this.$header.addClass(this.options.theadClasses);\n\t      }\n\n\t      this.$header.find('tr').each(function (i, el) {\n\t        var column = [];\n\t        $(el).find('th').each(function (i, el) {\n\t          // #2014: getFieldIndex and elsewhere assume this is string, causes issues if not\n\t          if (typeof $(el).data('field') !== 'undefined') {\n\t            $(el).data('field', \"\".concat($(el).data('field')));\n\t          }\n\n\t          column.push($.extend({}, {\n\t            title: $(el).html(),\n\t            'class': $(el).attr('class'),\n\t            titleTooltip: $(el).attr('title'),\n\t            rowspan: $(el).attr('rowspan') ? +$(el).attr('rowspan') : undefined,\n\t            colspan: $(el).attr('colspan') ? +$(el).attr('colspan') : undefined\n\t          }, $(el).data()));\n\t        });\n\t        columns.push(column);\n\t      });\n\n\t      if (!Array.isArray(this.options.columns[0])) {\n\t        this.options.columns = [this.options.columns];\n\t      }\n\n\t      this.options.columns = $.extend(true, [], columns, this.options.columns);\n\t      this.columns = [];\n\t      this.fieldsColumnsIndex = [];\n\t      Utils.setFieldIndex(this.options.columns);\n\t      this.options.columns.forEach(function (columns, i) {\n\t        columns.forEach(function (_column, j) {\n\t          var column = $.extend({}, BootstrapTable.COLUMN_DEFAULTS, _column);\n\n\t          if (typeof column.fieldIndex !== 'undefined') {\n\t            _this.columns[column.fieldIndex] = column;\n\t            _this.fieldsColumnsIndex[column.field] = column.fieldIndex;\n\t          }\n\n\t          _this.options.columns[i][j] = column;\n\t        });\n\t      }); // if options.data is setting, do not process tbody and tfoot data\n\n\t      if (!this.options.data.length) {\n\t        this.options.data = Utils.trToData(this.columns, this.$el.find('>tbody>tr'));\n\n\t        if (data.length) {\n\t          this.fromHtml = true;\n\t        }\n\t      }\n\n\t      this.footerData = Utils.trToData(this.columns, this.$el.find('>tfoot>tr'));\n\n\t      if (this.footerData) {\n\t        this.$el.find('tfoot').html('<tr></tr>');\n\t      }\n\n\t      if (!this.options.showFooter || this.options.cardView) {\n\t        this.$tableFooter.hide();\n\t      } else {\n\t        this.$tableFooter.show();\n\t      }\n\t    }\n\t  }, {\n\t    key: \"initHeader\",\n\t    value: function initHeader() {\n\t      var _this2 = this;\n\n\t      var visibleColumns = {};\n\t      var html = [];\n\t      this.header = {\n\t        fields: [],\n\t        styles: [],\n\t        classes: [],\n\t        formatters: [],\n\t        detailFormatters: [],\n\t        events: [],\n\t        sorters: [],\n\t        sortNames: [],\n\t        cellStyles: [],\n\t        searchables: []\n\t      };\n\t      Utils.updateFieldGroup(this.options.columns);\n\t      this.options.columns.forEach(function (columns, i) {\n\t        html.push('<tr>');\n\n\t        if (i === 0 && !_this2.options.cardView && _this2.options.detailView && _this2.options.detailViewIcon) {\n\t          html.push(\"<th class=\\\"detail\\\" rowspan=\\\"\".concat(_this2.options.columns.length, \"\\\">\\n          <div class=\\\"fht-cell\\\"></div>\\n          </th>\\n        \"));\n\t        }\n\n\t        columns.forEach(function (column, j) {\n\t          var class_ = Utils.sprintf(' class=\"%s\"', column['class']);\n\t          var unitWidth = column.widthUnit;\n\t          var width = parseFloat(column.width);\n\t          var halign = Utils.sprintf('text-align: %s; ', column.halign ? column.halign : column.align);\n\t          var align = Utils.sprintf('text-align: %s; ', column.align);\n\t          var style = Utils.sprintf('vertical-align: %s; ', column.valign);\n\t          style += Utils.sprintf('width: %s; ', (column.checkbox || column.radio) && !width ? !column.showSelectTitle ? '36px' : undefined : width ? width + unitWidth : undefined);\n\n\t          if (typeof column.fieldIndex === 'undefined' && !column.visible) {\n\t            return;\n\t          }\n\n\t          if (typeof column.fieldIndex !== 'undefined') {\n\t            _this2.header.fields[column.fieldIndex] = column.field;\n\t            _this2.header.styles[column.fieldIndex] = align + style;\n\t            _this2.header.classes[column.fieldIndex] = class_;\n\t            _this2.header.formatters[column.fieldIndex] = column.formatter;\n\t            _this2.header.detailFormatters[column.fieldIndex] = column.detailFormatter;\n\t            _this2.header.events[column.fieldIndex] = column.events;\n\t            _this2.header.sorters[column.fieldIndex] = column.sorter;\n\t            _this2.header.sortNames[column.fieldIndex] = column.sortName;\n\t            _this2.header.cellStyles[column.fieldIndex] = column.cellStyle;\n\t            _this2.header.searchables[column.fieldIndex] = column.searchable;\n\n\t            if (!column.visible) {\n\t              return;\n\t            }\n\n\t            if (_this2.options.cardView && !column.cardVisible) {\n\t              return;\n\t            }\n\n\t            visibleColumns[column.field] = column;\n\t          }\n\n\t          html.push(\"<th\".concat(Utils.sprintf(' title=\"%s\"', column.titleTooltip)), column.checkbox || column.radio ? Utils.sprintf(' class=\"bs-checkbox %s\"', column['class'] || '') : class_, Utils.sprintf(' style=\"%s\"', halign + style), Utils.sprintf(' rowspan=\"%s\"', column.rowspan), Utils.sprintf(' colspan=\"%s\"', column.colspan), Utils.sprintf(' data-field=\"%s\"', column.field), // If `column` is not the first element of `this.options.columns[0]`, then className 'data-not-first-th' should be added.\n\t          j === 0 && i > 0 ? ' data-not-first-th' : '', '>');\n\t          html.push(Utils.sprintf('<div class=\"th-inner %s\">', _this2.options.sortable && column.sortable ? 'sortable both' : ''));\n\t          var text = _this2.options.escape ? Utils.escapeHTML(column.title) : column.title;\n\t          var title = text;\n\n\t          if (column.checkbox) {\n\t            text = '';\n\n\t            if (!_this2.options.singleSelect && _this2.options.checkboxHeader) {\n\t              text = '<label><input name=\"btSelectAll\" type=\"checkbox\" /><span></span></label>';\n\t            }\n\n\t            _this2.header.stateField = column.field;\n\t          }\n\n\t          if (column.radio) {\n\t            text = '';\n\t            _this2.header.stateField = column.field;\n\t            _this2.options.singleSelect = true;\n\t          }\n\n\t          if (!text && column.showSelectTitle) {\n\t            text += title;\n\t          }\n\n\t          html.push(text);\n\t          html.push('</div>');\n\t          html.push('<div class=\"fht-cell\"></div>');\n\t          html.push('</div>');\n\t          html.push('</th>');\n\t        });\n\t        html.push('</tr>');\n\t      });\n\t      this.$header.html(html.join(''));\n\t      this.$header.find('th[data-field]').each(function (i, el) {\n\t        $(el).data(visibleColumns[$(el).data('field')]);\n\t      });\n\t      this.$container.off('click', '.th-inner').on('click', '.th-inner', function (e) {\n\t        var $this = $(e.currentTarget);\n\n\t        if (_this2.options.detailView && !$this.parent().hasClass('bs-checkbox')) {\n\t          if ($this.closest('.bootstrap-table')[0] !== _this2.$container[0]) {\n\t            return false;\n\t          }\n\t        }\n\n\t        if (_this2.options.sortable && $this.parent().data().sortable) {\n\t          _this2.onSort(e);\n\t        }\n\t      });\n\t      this.$header.children().children().off('keypress').on('keypress', function (e) {\n\t        if (_this2.options.sortable && $(e.currentTarget).data().sortable) {\n\t          var code = e.keyCode || e.which;\n\n\t          if (code === 13) {\n\t            // Enter keycode\n\t            _this2.onSort(e);\n\t          }\n\t        }\n\t      });\n\t      var resizeEvent = \"resize.bootstrap-table\".concat(this.$el.attr('id') || '');\n\t      $(window).off(resizeEvent);\n\n\t      if (!this.options.showHeader || this.options.cardView) {\n\t        this.$header.hide();\n\t        this.$tableHeader.hide();\n\t        this.$tableLoading.css('top', 0);\n\t      } else {\n\t        this.$header.show();\n\t        this.$tableHeader.show();\n\t        this.$tableLoading.css('top', this.$header.outerHeight() + 1); // Assign the correct sortable arrow\n\n\t        this.getCaret();\n\t        $(window).on(resizeEvent, function (e) {\n\t          return _this2.resetWidth(e);\n\t        });\n\t      }\n\n\t      this.$selectAll = this.$header.find('[name=\"btSelectAll\"]');\n\t      this.$selectAll.off('click').on('click', function (_ref) {\n\t        var currentTarget = _ref.currentTarget;\n\t        var checked = $(currentTarget).prop('checked');\n\n\t        _this2[checked ? 'checkAll' : 'uncheckAll']();\n\n\t        _this2.updateSelected();\n\t      });\n\t    }\n\t  }, {\n\t    key: \"initData\",\n\t    value: function initData(data, type) {\n\t      if (type === 'append') {\n\t        this.options.data = this.options.data.concat(data);\n\t      } else if (type === 'prepend') {\n\t        this.options.data = [].concat(data).concat(this.options.data);\n\t      } else {\n\t        this.options.data = data || this.options.data;\n\t      }\n\n\t      this.data = this.options.data;\n\n\t      if (this.options.sidePagination === 'server') {\n\t        return;\n\t      }\n\n\t      this.initSort();\n\t    }\n\t  }, {\n\t    key: \"initSort\",\n\t    value: function initSort() {\n\t      var _this3 = this;\n\n\t      var name = this.options.sortName;\n\t      var order = this.options.sortOrder === 'desc' ? -1 : 1;\n\t      var index = this.header.fields.indexOf(this.options.sortName);\n\t      var timeoutId = 0;\n\n\t      if (index !== -1) {\n\t        if (this.options.sortStable) {\n\t          this.data.forEach(function (row, i) {\n\t            if (!row.hasOwnProperty('_position')) {\n\t              row._position = i;\n\t            }\n\t          });\n\t        }\n\n\t        if (this.options.customSort) {\n\t          Utils.calculateObjectValue(this.options, this.options.customSort, [this.options.sortName, this.options.sortOrder, this.data]);\n\t        } else {\n\t          this.data.sort(function (a, b) {\n\t            if (_this3.header.sortNames[index]) {\n\t              name = _this3.header.sortNames[index];\n\t            }\n\n\t            var aa = Utils.getItemField(a, name, _this3.options.escape);\n\t            var bb = Utils.getItemField(b, name, _this3.options.escape);\n\t            var value = Utils.calculateObjectValue(_this3.header, _this3.header.sorters[index], [aa, bb, a, b]);\n\n\t            if (value !== undefined) {\n\t              if (_this3.options.sortStable && value === 0) {\n\t                return order * (a._position - b._position);\n\t              }\n\n\t              return order * value;\n\t            }\n\n\t            return Utils.sort(aa, bb, order, _this3.options.sortStable);\n\t          });\n\t        }\n\n\t        if (this.options.sortClass !== undefined) {\n\t          clearTimeout(timeoutId);\n\t          timeoutId = setTimeout(function () {\n\t            _this3.$el.removeClass(_this3.options.sortClass);\n\n\t            var index = _this3.$header.find(\"[data-field=\\\"\".concat(_this3.options.sortName, \"\\\"]\")).index();\n\n\t            _this3.$el.find(\"tr td:nth-child(\".concat(index + 1, \")\")).addClass(_this3.options.sortClass);\n\t          }, 250);\n\t        }\n\t      }\n\t    }\n\t  }, {\n\t    key: \"onSort\",\n\t    value: function onSort(_ref2) {\n\t      var type = _ref2.type,\n\t          currentTarget = _ref2.currentTarget;\n\t      var $this = type === 'keypress' ? $(currentTarget) : $(currentTarget).parent();\n\t      var $this_ = this.$header.find('th').eq($this.index());\n\t      this.$header.add(this.$header_).find('span.order').remove();\n\n\t      if (this.options.sortName === $this.data('field')) {\n\t        this.options.sortOrder = this.options.sortOrder === 'asc' ? 'desc' : 'asc';\n\t      } else {\n\t        this.options.sortName = $this.data('field');\n\n\t        if (this.options.rememberOrder) {\n\t          this.options.sortOrder = $this.data('order') === 'asc' ? 'desc' : 'asc';\n\t        } else {\n\t          this.options.sortOrder = this.columns[this.fieldsColumnsIndex[$this.data('field')]].sortOrder || this.columns[this.fieldsColumnsIndex[$this.data('field')]].order;\n\t        }\n\t      }\n\n\t      this.trigger('sort', this.options.sortName, this.options.sortOrder);\n\t      $this.add($this_).data('order', this.options.sortOrder); // Assign the correct sortable arrow\n\n\t      this.getCaret();\n\n\t      if (this.options.sidePagination === 'server') {\n\t        this.options.pageNumber = 1;\n\t        this.initServer(this.options.silentSort);\n\t        return;\n\t      }\n\n\t      this.initSort();\n\t      this.initBody();\n\t    }\n\t  }, {\n\t    key: \"initToolbar\",\n\t    value: function initToolbar() {\n\t      var _this4 = this;\n\n\t      var o = this.options;\n\t      var html = [];\n\t      var timeoutId = 0;\n\t      var $keepOpen;\n\t      var $search;\n\t      var switchableCount = 0;\n\n\t      if (this.$toolbar.find('.bs-bars').children().length) {\n\t        $('body').append($(o.toolbar));\n\t      }\n\n\t      this.$toolbar.html('');\n\n\t      if (typeof o.toolbar === 'string' || _typeof(o.toolbar) === 'object') {\n\t        $(Utils.sprintf('<div class=\"bs-bars %s-%s\"></div>', this.constants.classes.pull, o.toolbarAlign)).appendTo(this.$toolbar).append($(o.toolbar));\n\t      } // showColumns, showToggle, showRefresh\n\n\n\t      html = [\"<div class=\\\"\".concat(['columns', \"columns-\".concat(o.buttonsAlign), this.constants.classes.buttonsGroup, \"\".concat(this.constants.classes.pull, \"-\").concat(o.buttonsAlign)].join(' '), \"\\\">\")];\n\n\t      if (typeof o.icons === 'string') {\n\t        o.icons = Utils.calculateObjectValue(null, o.icons);\n\t      }\n\n\t      if (o.showPaginationSwitch) {\n\t        html.push(\"<button class=\\\"\".concat(this.constants.buttonsClass, \"\\\" type=\\\"button\\\" name=\\\"paginationSwitch\\\"\\n        aria-label=\\\"Pagination Switch\\\" title=\\\"\").concat(o.formatPaginationSwitch(), \"\\\">\\n        \").concat(o.showButtonIcons ? Utils.sprintf(this.constants.html.icon, o.iconsPrefix, o.icons.paginationSwitchDown) : '', \"\\n        \").concat(o.showButtonText ? o.formatPaginationSwitchUp() : '', \"\\n        </button>\"));\n\t      }\n\n\t      if (o.showRefresh) {\n\t        html.push(\"<button class=\\\"\".concat(this.constants.buttonsClass, \"\\\" type=\\\"button\\\" name=\\\"refresh\\\"\\n        aria-label=\\\"Refresh\\\" title=\\\"\").concat(o.formatRefresh(), \"\\\">\\n        \").concat(o.showButtonIcons ? Utils.sprintf(this.constants.html.icon, o.iconsPrefix, o.icons.refresh) : '', \"\\n        \").concat(o.showButtonText ? o.formatRefresh() : '', \"\\n        </button>\"));\n\t      }\n\n\t      if (o.showToggle) {\n\t        html.push(\"<button class=\\\"\".concat(this.constants.buttonsClass, \"\\\" type=\\\"button\\\" name=\\\"toggle\\\"\\n        aria-label=\\\"Toggle\\\" title=\\\"\").concat(o.formatToggle(), \"\\\">\\n        \").concat(o.showButtonIcons ? Utils.sprintf(this.constants.html.icon, o.iconsPrefix, o.icons.toggleOff) : '', \"\\n        \").concat(o.showButtonText ? o.formatToggleOn() : '', \"\\n        </button>\"));\n\t      }\n\n\t      if (o.showFullscreen) {\n\t        html.push(\"<button class=\\\"\".concat(this.constants.buttonsClass, \"\\\" type=\\\"button\\\" name=\\\"fullscreen\\\"\\n        aria-label=\\\"Fullscreen\\\" title=\\\"\").concat(o.formatFullscreen(), \"\\\">\\n        \").concat(o.showButtonIcons ? Utils.sprintf(this.constants.html.icon, o.iconsPrefix, o.icons.fullscreen) : '', \"\\n        \").concat(o.showButtonText ? o.formatFullscreen() : '', \"\\n        </button>\"));\n\t      }\n\n\t      if (o.showColumns) {\n\t        html.push(\"<div class=\\\"keep-open \".concat(this.constants.classes.buttonsDropdown, \"\\\" title=\\\"\").concat(o.formatColumns(), \"\\\">\\n        <button class=\\\"\").concat(this.constants.buttonsClass, \" dropdown-toggle\\\" type=\\\"button\\\" data-toggle=\\\"dropdown\\\"\\n        aria-label=\\\"Columns\\\" title=\\\"\").concat(o.formatColumns(), \"\\\">\\n        \").concat(o.showButtonIcons ? Utils.sprintf(this.constants.html.icon, o.iconsPrefix, o.icons.columns) : '', \"\\n        \").concat(o.showButtonText ? o.formatColumns() : '', \"\\n        \").concat(this.constants.html.dropdownCaret, \"\\n        </button>\\n        \").concat(this.constants.html.toolbarDropdown[0]));\n\n\t        if (o.showColumnsToggleAll) {\n\t          var allFieldsVisible = this.getVisibleColumns().length === this.columns.length;\n\t          html.push(Utils.sprintf(this.constants.html.toolbarDropdownItem, Utils.sprintf('<input type=\"checkbox\" class=\"toggle-all\" %s> <span>%s</span>', allFieldsVisible ? 'checked=\"checked\"' : '', o.formatColumnsToggleAll())));\n\t          html.push(this.constants.html.toolbarDropdownSeperator);\n\t        }\n\n\t        this.columns.forEach(function (column, i) {\n\t          if (column.radio || column.checkbox) {\n\t            return;\n\t          }\n\n\t          if (o.cardView && !column.cardVisible) {\n\t            return;\n\t          }\n\n\t          var checked = column.visible ? ' checked=\"checked\"' : '';\n\n\t          if (column.switchable) {\n\t            html.push(Utils.sprintf(_this4.constants.html.toolbarDropdownItem, Utils.sprintf('<input type=\"checkbox\" data-field=\"%s\" value=\"%s\"%s> <span>%s</span>', column.field, i, checked, column.title)));\n\t            switchableCount++;\n\t          }\n\t        });\n\t        html.push(this.constants.html.toolbarDropdown[1], '</div>');\n\t      }\n\n\t      html.push('</div>'); // Fix #188: this.showToolbar is for extensions\n\n\t      if (this.showToolbar || html.length > 2) {\n\t        this.$toolbar.append(html.join(''));\n\t      }\n\n\t      if (o.showPaginationSwitch) {\n\t        this.$toolbar.find('button[name=\"paginationSwitch\"]').off('click').on('click', function () {\n\t          return _this4.togglePagination();\n\t        });\n\t      }\n\n\t      if (o.showFullscreen) {\n\t        this.$toolbar.find('button[name=\"fullscreen\"]').off('click').on('click', function () {\n\t          return _this4.toggleFullscreen();\n\t        });\n\t      }\n\n\t      if (o.showRefresh) {\n\t        this.$toolbar.find('button[name=\"refresh\"]').off('click').on('click', function () {\n\t          return _this4.refresh();\n\t        });\n\t      }\n\n\t      if (o.showToggle) {\n\t        this.$toolbar.find('button[name=\"toggle\"]').off('click').on('click', function () {\n\t          _this4.toggleView();\n\t        });\n\t      }\n\n\t      if (o.showColumns) {\n\t        $keepOpen = this.$toolbar.find('.keep-open');\n\t        var $checkboxes = $keepOpen.find('input:not(\".toggle-all\")');\n\t        var $toggleAll = $keepOpen.find('input.toggle-all');\n\n\t        if (switchableCount <= o.minimumCountColumns) {\n\t          $keepOpen.find('input').prop('disabled', true);\n\t        }\n\n\t        $keepOpen.find('li, label').off('click').on('click', function (e) {\n\t          e.stopImmediatePropagation();\n\t        });\n\t        $checkboxes.off('click').on('click', function (_ref3) {\n\t          var currentTarget = _ref3.currentTarget;\n\t          var $this = $(currentTarget);\n\n\t          _this4._toggleColumn($this.val(), $this.prop('checked'), false);\n\n\t          _this4.trigger('column-switch', $this.data('field'), $this.prop('checked'));\n\n\t          $toggleAll.prop('checked', $checkboxes.filter(':checked').length === _this4.columns.length);\n\t        });\n\t        $toggleAll.off('click').on('click', function (_ref4) {\n\t          var currentTarget = _ref4.currentTarget;\n\n\t          _this4._toggleAllColumns($(currentTarget).prop('checked'));\n\t        });\n\t      } // Fix #4516: this.showSearchClearButton is for extensions\n\n\n\t      if (o.search || this.showSearchClearButton) {\n\t        html = [];\n\t        var showSearchButton = Utils.sprintf(this.constants.html.searchButton, this.constants.buttonsClass, o.formatSearch(), o.showButtonIcons ? Utils.sprintf(this.constants.html.icon, o.iconsPrefix, o.icons.search) : '', o.showButtonText ? o.formatSearch() : '');\n\t        var showSearchClearButton = Utils.sprintf(this.constants.html.searchClearButton, this.constants.buttonsClass, o.formatClearSearch(), o.showButtonIcons ? Utils.sprintf(this.constants.html.icon, o.iconsPrefix, o.icons.clearSearch) : '', o.showButtonText ? o.formatClearSearch() : '');\n\t        var searchInputHtml = \"<input class=\\\"\".concat(this.constants.classes.input).concat(Utils.sprintf(' input-%s', o.iconSize), \" search-input\\\" type=\\\"text\\\" placeholder=\\\"\").concat(o.formatSearch(), \"\\\">\");\n\t        var searchInputFinalHtml = searchInputHtml;\n\n\t        if (o.showSearchButton || o.showSearchClearButton) {\n\t          var buttonsHtml = (o.showSearchButton ? showSearchButton : '') + (o.showSearchClearButton ? showSearchClearButton : '');\n\t          searchInputFinalHtml = o.search ? Utils.sprintf(this.constants.html.inputGroup, searchInputHtml, buttonsHtml) : buttonsHtml;\n\t        }\n\n\t        html.push(Utils.sprintf(\"\\n        <div class=\\\"\".concat(this.constants.classes.pull, \"-\").concat(o.searchAlign, \" search \").concat(this.constants.classes.inputGroup, \"\\\">\\n          %s\\n        </div>\\n      \"), searchInputFinalHtml));\n\t        this.$toolbar.append(html.join(''));\n\t        var $searchInput = this.$toolbar.find('.search input');\n\t        $search = o.showSearchButton ? this.$toolbar.find('.search button[name=search]') : $searchInput;\n\t        var eventTriggers = o.showSearchButton ? 'click' : Utils.isIEBrowser() ? 'mouseup' : 'keyup drop blur';\n\t        $search.off(eventTriggers).on(eventTriggers, function (event) {\n\t          if (o.searchOnEnterKey && event.keyCode !== 13) {\n\t            return;\n\t          }\n\n\t          if ([37, 38, 39, 40].includes(event.keyCode)) {\n\t            return;\n\t          }\n\n\t          clearTimeout(timeoutId); // doesn't matter if it's 0\n\n\t          timeoutId = setTimeout(function () {\n\t            _this4.onSearch(o.showSearchButton ? {\n\t              currentTarget: $searchInput\n\t            } : event);\n\t          }, o.searchTimeOut);\n\t        });\n\n\t        if (o.showSearchClearButton) {\n\t          this.$toolbar.find('.search button[name=clearSearch]').click(function () {\n\t            _this4.resetSearch();\n\t          });\n\t        }\n\t      }\n\t    }\n\t  }, {\n\t    key: \"onSearch\",\n\t    value: function onSearch() {\n\t      var _ref5 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n\t          currentTarget = _ref5.currentTarget,\n\t          firedByInitSearchText = _ref5.firedByInitSearchText;\n\n\t      var overwriteSearchText = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n\t      if (currentTarget !== undefined && $(currentTarget).length && overwriteSearchText) {\n\t        var text = $(currentTarget).val().trim();\n\n\t        if (this.options.trimOnSearch && $(currentTarget).val() !== text) {\n\t          $(currentTarget).val(text);\n\t        }\n\n\t        if (this.searchText === text) {\n\t          return;\n\t        }\n\n\t        if ($(currentTarget).hasClass('search-input')) {\n\t          this.searchText = text;\n\t          this.options.searchText = text;\n\t        }\n\t      }\n\n\t      if (!firedByInitSearchText) {\n\t        this.options.pageNumber = 1;\n\t      }\n\n\t      this.initSearch();\n\n\t      if (firedByInitSearchText) {\n\t        if (this.options.sidePagination === 'client') {\n\t          this.updatePagination();\n\t        }\n\t      } else {\n\t        this.updatePagination();\n\t      }\n\n\t      this.trigger('search', this.searchText);\n\t    }\n\t  }, {\n\t    key: \"initSearch\",\n\t    value: function initSearch() {\n\t      var _this5 = this;\n\n\t      this.filterOptions = this.filterOptions || this.options.filterOptions;\n\n\t      if (this.options.sidePagination !== 'server') {\n\t        if (this.options.customSearch) {\n\t          this.data = Utils.calculateObjectValue(this.options, this.options.customSearch, [this.options.data, this.searchText, this.filterColumns]);\n\t          return;\n\t        }\n\n\t        var s = this.searchText && (this.options.escape ? Utils.escapeHTML(this.searchText) : this.searchText).toLowerCase();\n\t        var f = Utils.isEmptyObject(this.filterColumns) ? null : this.filterColumns; // Check filter\n\n\t        if (typeof this.filterOptions.filterAlgorithm === 'function') {\n\t          this.data = this.options.data.filter(function (item, i) {\n\t            return _this5.filterOptions.filterAlgorithm.apply(null, [item, f]);\n\t          });\n\t        } else if (typeof this.filterOptions.filterAlgorithm === 'string') {\n\t          this.data = f ? this.options.data.filter(function (item, i) {\n\t            var filterAlgorithm = _this5.filterOptions.filterAlgorithm;\n\n\t            if (filterAlgorithm === 'and') {\n\t              for (var key in f) {\n\t                if (Array.isArray(f[key]) && !f[key].includes(item[key]) || !Array.isArray(f[key]) && item[key] !== f[key]) {\n\t                  return false;\n\t                }\n\t              }\n\t            } else if (filterAlgorithm === 'or') {\n\t              var match = false;\n\n\t              for (var _key in f) {\n\t                if (Array.isArray(f[_key]) && f[_key].includes(item[_key]) || !Array.isArray(f[_key]) && item[_key] === f[_key]) {\n\t                  match = true;\n\t                }\n\t              }\n\n\t              return match;\n\t            }\n\n\t            return true;\n\t          }) : this.options.data;\n\t        }\n\n\t        var visibleFields = this.getVisibleFields();\n\t        this.data = s ? this.data.filter(function (item, i) {\n\t          for (var j = 0; j < _this5.header.fields.length; j++) {\n\t            if (!_this5.header.searchables[j] || _this5.options.visibleSearch && visibleFields.indexOf(_this5.header.fields[j]) === -1) {\n\t              continue;\n\t            }\n\n\t            var key = Utils.isNumeric(_this5.header.fields[j]) ? parseInt(_this5.header.fields[j], 10) : _this5.header.fields[j];\n\t            var column = _this5.columns[_this5.fieldsColumnsIndex[key]];\n\t            var value = void 0;\n\n\t            if (typeof key === 'string') {\n\t              value = item;\n\t              var props = key.split('.');\n\n\t              for (var _i = 0; _i < props.length; _i++) {\n\t                if (value[props[_i]] !== null) {\n\t                  value = value[props[_i]];\n\t                }\n\t              }\n\t            } else {\n\t              value = item[key];\n\t            } // Fix #142: respect searchFormatter boolean\n\n\n\t            if (column && column.searchFormatter) {\n\t              value = Utils.calculateObjectValue(column, _this5.header.formatters[j], [value, item, i, column.field], value);\n\t            }\n\n\t            if (typeof value === 'string' || typeof value === 'number') {\n\t              if (_this5.options.strictSearch) {\n\t                if (\"\".concat(value).toLowerCase() === s) {\n\t                  return true;\n\t                }\n\t              } else {\n\t                var largerSmallerEqualsRegex = /(?:(<=|=>|=<|>=|>|<)(?:\\s+)?(\\d+)?|(\\d+)?(\\s+)?(<=|=>|=<|>=|>|<))/gm;\n\t                var matches = largerSmallerEqualsRegex.exec(s);\n\t                var comparisonCheck = false;\n\n\t                if (matches) {\n\t                  var operator = matches[1] || \"\".concat(matches[5], \"l\");\n\t                  var comparisonValue = matches[2] || matches[3];\n\t                  var int = parseInt(value, 10);\n\t                  var comparisonInt = parseInt(comparisonValue, 10);\n\n\t                  switch (operator) {\n\t                    case '>':\n\t                    case '<l':\n\t                      comparisonCheck = int > comparisonInt;\n\t                      break;\n\n\t                    case '<':\n\t                    case '>l':\n\t                      comparisonCheck = int < comparisonInt;\n\t                      break;\n\n\t                    case '<=':\n\t                    case '=<':\n\t                    case '>=l':\n\t                    case '=>l':\n\t                      comparisonCheck = int <= comparisonInt;\n\t                      break;\n\n\t                    case '>=':\n\t                    case '=>':\n\t                    case '<=l':\n\t                    case '=<l':\n\t                      comparisonCheck = int >= comparisonInt;\n\t                      break;\n\n\t                    default:\n\t                      break;\n\t                  }\n\t                }\n\n\t                if (comparisonCheck || \"\".concat(value).toLowerCase().includes(s)) {\n\t                  return true;\n\t                }\n\t              }\n\t            }\n\t          }\n\n\t          return false;\n\t        }) : this.data;\n\t      }\n\t    }\n\t  }, {\n\t    key: \"initPagination\",\n\t    value: function initPagination() {\n\t      var _this6 = this;\n\n\t      var o = this.options;\n\n\t      if (!o.pagination) {\n\t        this.$pagination.hide();\n\t        return;\n\t      }\n\n\t      this.$pagination.show();\n\t      var html = [];\n\t      var $allSelected = false;\n\t      var i;\n\t      var from;\n\t      var to;\n\t      var $pageList;\n\t      var $pre;\n\t      var $next;\n\t      var $number;\n\t      var data = this.getData({\n\t        includeHiddenRows: false\n\t      });\n\t      var pageList = o.pageList;\n\n\t      if (o.sidePagination !== 'server') {\n\t        o.totalRows = data.length;\n\t      }\n\n\t      this.totalPages = 0;\n\n\t      if (o.totalRows) {\n\t        if (o.pageSize === o.formatAllRows()) {\n\t          o.pageSize = o.totalRows;\n\t          $allSelected = true;\n\t        } else if (o.pageSize === o.totalRows) {\n\t          // Fix #667 Table with pagination,\n\t          // multiple pages and a search this matches to one page throws exception\n\t          var pageLst = typeof o.pageList === 'string' ? o.pageList.replace('[', '').replace(']', '').replace(/ /g, '').toLowerCase().split(',') : o.pageList;\n\n\t          if (pageLst.includes(o.formatAllRows().toLowerCase())) {\n\t            $allSelected = true;\n\t          }\n\t        }\n\n\t        this.totalPages = ~~((o.totalRows - 1) / o.pageSize) + 1;\n\t        o.totalPages = this.totalPages;\n\t      }\n\n\t      if (this.totalPages > 0 && o.pageNumber > this.totalPages) {\n\t        o.pageNumber = this.totalPages;\n\t      }\n\n\t      this.pageFrom = (o.pageNumber - 1) * o.pageSize + 1;\n\t      this.pageTo = o.pageNumber * o.pageSize;\n\n\t      if (this.pageTo > o.totalRows) {\n\t        this.pageTo = o.totalRows;\n\t      }\n\n\t      if (this.options.pagination && this.options.sidePagination !== 'server') {\n\t        this.options.totalNotFiltered = this.options.data.length;\n\t      }\n\n\t      if (!this.options.showExtendedPagination) {\n\t        this.options.totalNotFiltered = undefined;\n\t      }\n\n\t      var paginationInfo = o.onlyInfoPagination ? o.formatDetailPagination(o.totalRows) : o.formatShowingRows(this.pageFrom, this.pageTo, o.totalRows, o.totalNotFiltered);\n\t      html.push(\"<div class=\\\"\".concat(this.constants.classes.pull, \"-\").concat(o.paginationDetailHAlign, \" pagination-detail\\\">\\n      <span class=\\\"pagination-info\\\">\\n      \").concat(paginationInfo, \"\\n      </span>\"));\n\n\t      if (!o.onlyInfoPagination) {\n\t        html.push('<span class=\"page-list\">');\n\t        var pageNumber = [\"<span class=\\\"\".concat(this.constants.classes.paginationDropdown, \"\\\">\\n        <button class=\\\"\").concat(this.constants.buttonsClass, \" dropdown-toggle\\\" type=\\\"button\\\" data-toggle=\\\"dropdown\\\">\\n        <span class=\\\"page-size\\\">\\n        \").concat($allSelected ? o.formatAllRows() : o.pageSize, \"\\n        </span>\\n        \").concat(this.constants.html.dropdownCaret, \"\\n        </button>\\n        \").concat(this.constants.html.pageDropdown[0])];\n\n\t        if (typeof o.pageList === 'string') {\n\t          var list = o.pageList.replace('[', '').replace(']', '').replace(/ /g, '').split(',');\n\t          pageList = [];\n\t          var _iteratorNormalCompletion = true;\n\t          var _didIteratorError = false;\n\t          var _iteratorError = undefined;\n\n\t          try {\n\t            for (var _iterator = list[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n\t              var value = _step.value;\n\t              pageList.push(value.toLowerCase() === o.formatAllRows().toLowerCase() || ['all', 'unlimited'].includes(value.toLowerCase()) ? o.formatAllRows() : +value);\n\t            }\n\t          } catch (err) {\n\t            _didIteratorError = true;\n\t            _iteratorError = err;\n\t          } finally {\n\t            try {\n\t              if (!_iteratorNormalCompletion && _iterator.return != null) {\n\t                _iterator.return();\n\t              }\n\t            } finally {\n\t              if (_didIteratorError) {\n\t                throw _iteratorError;\n\t              }\n\t            }\n\t          }\n\t        }\n\n\t        pageList.forEach(function (page, i) {\n\t          if (!o.smartDisplay || i === 0 || pageList[i - 1] < o.totalRows) {\n\t            var active;\n\n\t            if ($allSelected) {\n\t              active = page === o.formatAllRows() ? _this6.constants.classes.dropdownActive : '';\n\t            } else {\n\t              active = page === o.pageSize ? _this6.constants.classes.dropdownActive : '';\n\t            }\n\n\t            pageNumber.push(Utils.sprintf(_this6.constants.html.pageDropdownItem, active, page));\n\t          }\n\t        });\n\t        pageNumber.push(\"\".concat(this.constants.html.pageDropdown[1], \"</span>\"));\n\t        html.push(o.formatRecordsPerPage(pageNumber.join('')));\n\t        html.push('</span></div>');\n\t        html.push(\"<div class=\\\"\".concat(this.constants.classes.pull, \"-\").concat(o.paginationHAlign, \" pagination\\\">\"), Utils.sprintf(this.constants.html.pagination[0], Utils.sprintf(' pagination-%s', o.iconSize)), Utils.sprintf(this.constants.html.paginationItem, ' page-pre', o.formatSRPaginationPreText(), o.paginationPreText));\n\n\t        if (this.totalPages < o.paginationSuccessivelySize) {\n\t          from = 1;\n\t          to = this.totalPages;\n\t        } else {\n\t          from = o.pageNumber - o.paginationPagesBySide;\n\t          to = from + o.paginationPagesBySide * 2;\n\t        }\n\n\t        if (o.pageNumber < o.paginationSuccessivelySize - 1) {\n\t          to = o.paginationSuccessivelySize;\n\t        }\n\n\t        if (o.paginationSuccessivelySize > this.totalPages - from) {\n\t          from = from - (o.paginationSuccessivelySize - (this.totalPages - from)) + 1;\n\t        }\n\n\t        if (from < 1) {\n\t          from = 1;\n\t        }\n\n\t        if (to > this.totalPages) {\n\t          to = this.totalPages;\n\t        }\n\n\t        var middleSize = Math.round(o.paginationPagesBySide / 2);\n\n\t        var pageItem = function pageItem(i) {\n\t          var classes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n\t          return Utils.sprintf(_this6.constants.html.paginationItem, classes + (i === o.pageNumber ? \" \".concat(_this6.constants.classes.paginationActive) : ''), o.formatSRPaginationPageText(i), i);\n\t        };\n\n\t        if (from > 1) {\n\t          var max = o.paginationPagesBySide;\n\t          if (max >= from) max = from - 1;\n\n\t          for (i = 1; i <= max; i++) {\n\t            html.push(pageItem(i));\n\t          }\n\n\t          if (from - 1 === max + 1) {\n\t            i = from - 1;\n\t            html.push(pageItem(i));\n\t          } else {\n\t            if (from - 1 > max) {\n\t              if (from - o.paginationPagesBySide * 2 > o.paginationPagesBySide && o.paginationUseIntermediate) {\n\t                i = Math.round((from - middleSize) / 2 + middleSize);\n\t                html.push(pageItem(i, ' page-intermediate'));\n\t              } else {\n\t                html.push(Utils.sprintf(this.constants.html.paginationItem, ' page-first-separator disabled', '', '...'));\n\t              }\n\t            }\n\t          }\n\t        }\n\n\t        for (i = from; i <= to; i++) {\n\t          html.push(pageItem(i));\n\t        }\n\n\t        if (this.totalPages > to) {\n\t          var min = this.totalPages - (o.paginationPagesBySide - 1);\n\t          if (to >= min) min = to + 1;\n\n\t          if (to + 1 === min - 1) {\n\t            i = to + 1;\n\t            html.push(pageItem(i));\n\t          } else {\n\t            if (min > to + 1) {\n\t              if (this.totalPages - to > o.paginationPagesBySide * 2 && o.paginationUseIntermediate) {\n\t                i = Math.round((this.totalPages - middleSize - to) / 2 + to);\n\t                html.push(pageItem(i, ' page-intermediate'));\n\t              } else {\n\t                html.push(Utils.sprintf(this.constants.html.paginationItem, ' page-last-separator disabled', '', '...'));\n\t              }\n\t            }\n\t          }\n\n\t          for (i = min; i <= this.totalPages; i++) {\n\t            html.push(pageItem(i));\n\t          }\n\t        }\n\n\t        html.push(Utils.sprintf(this.constants.html.paginationItem, ' page-next', o.formatSRPaginationNextText(), o.paginationNextText));\n\t        html.push(this.constants.html.pagination[1], '</div>');\n\t      }\n\n\t      this.$pagination.html(html.join(''));\n\t      var dropupClass = ['bottom', 'both'].includes(o.paginationVAlign) ? \" \".concat(this.constants.classes.dropup) : '';\n\t      this.$pagination.last().find('.page-list > span').addClass(dropupClass);\n\n\t      if (!o.onlyInfoPagination) {\n\t        $pageList = this.$pagination.find('.page-list a');\n\t        $pre = this.$pagination.find('.page-pre');\n\t        $next = this.$pagination.find('.page-next');\n\t        $number = this.$pagination.find('.page-item').not('.page-next, .page-pre, .page-last-separator, .page-first-separator');\n\n\t        if (this.totalPages <= 1) {\n\t          this.$pagination.find('div.pagination').hide();\n\t        }\n\n\t        if (o.smartDisplay) {\n\t          if (pageList.length < 2 || o.totalRows <= pageList[0]) {\n\t            this.$pagination.find('span.page-list').hide();\n\t          }\n\t        } // when data is empty, hide the pagination\n\n\n\t        this.$pagination[this.getData().length ? 'show' : 'hide']();\n\n\t        if (!o.paginationLoop) {\n\t          if (o.pageNumber === 1) {\n\t            $pre.addClass('disabled');\n\t          }\n\n\t          if (o.pageNumber === this.totalPages) {\n\t            $next.addClass('disabled');\n\t          }\n\t        }\n\n\t        if ($allSelected) {\n\t          o.pageSize = o.formatAllRows();\n\t        } // removed the events for last and first, onPageNumber executeds the same logic\n\n\n\t        $pageList.off('click').on('click', function (e) {\n\t          return _this6.onPageListChange(e);\n\t        });\n\t        $pre.off('click').on('click', function (e) {\n\t          return _this6.onPagePre(e);\n\t        });\n\t        $next.off('click').on('click', function (e) {\n\t          return _this6.onPageNext(e);\n\t        });\n\t        $number.off('click').on('click', function (e) {\n\t          return _this6.onPageNumber(e);\n\t        });\n\t      }\n\t    }\n\t  }, {\n\t    key: \"updatePagination\",\n\t    value: function updatePagination(event) {\n\t      // Fix #171: IE disabled button can be clicked bug.\n\t      if (event && $(event.currentTarget).hasClass('disabled')) {\n\t        return;\n\t      }\n\n\t      if (!this.options.maintainMetaData) {\n\t        this.resetRows();\n\t      }\n\n\t      this.initPagination();\n\n\t      if (this.options.sidePagination === 'server') {\n\t        this.initServer();\n\t      } else {\n\t        this.initBody();\n\t      }\n\n\t      this.trigger('page-change', this.options.pageNumber, this.options.pageSize);\n\t    }\n\t  }, {\n\t    key: \"onPageListChange\",\n\t    value: function onPageListChange(event) {\n\t      event.preventDefault();\n\t      var $this = $(event.currentTarget);\n\t      $this.parent().addClass(this.constants.classes.dropdownActive).siblings().removeClass(this.constants.classes.dropdownActive);\n\t      this.options.pageSize = $this.text().toUpperCase() === this.options.formatAllRows().toUpperCase() ? this.options.formatAllRows() : +$this.text();\n\t      this.$toolbar.find('.page-size').text(this.options.pageSize);\n\t      this.updatePagination(event);\n\t      return false;\n\t    }\n\t  }, {\n\t    key: \"onPagePre\",\n\t    value: function onPagePre(event) {\n\t      event.preventDefault();\n\n\t      if (this.options.pageNumber - 1 === 0) {\n\t        this.options.pageNumber = this.options.totalPages;\n\t      } else {\n\t        this.options.pageNumber--;\n\t      }\n\n\t      this.updatePagination(event);\n\t      return false;\n\t    }\n\t  }, {\n\t    key: \"onPageNext\",\n\t    value: function onPageNext(event) {\n\t      event.preventDefault();\n\n\t      if (this.options.pageNumber + 1 > this.options.totalPages) {\n\t        this.options.pageNumber = 1;\n\t      } else {\n\t        this.options.pageNumber++;\n\t      }\n\n\t      this.updatePagination(event);\n\t      return false;\n\t    }\n\t  }, {\n\t    key: \"onPageNumber\",\n\t    value: function onPageNumber(event) {\n\t      event.preventDefault();\n\n\t      if (this.options.pageNumber === +$(event.currentTarget).text()) {\n\t        return;\n\t      }\n\n\t      this.options.pageNumber = +$(event.currentTarget).text();\n\t      this.updatePagination(event);\n\t      return false;\n\t    }\n\t  }, {\n\t    key: \"initRow\",\n\t    value: function initRow(item, i, data, trFragments) {\n\t      var _this7 = this;\n\n\t      var html = [];\n\t      var style = {};\n\t      var csses = [];\n\t      var data_ = '';\n\t      var attributes = {};\n\t      var htmlAttributes = [];\n\n\t      if (Utils.findIndex(this.hiddenRows, item) > -1) {\n\t        return;\n\t      }\n\n\t      style = Utils.calculateObjectValue(this.options, this.options.rowStyle, [item, i], style);\n\n\t      if (style && style.css) {\n\t        for (var _i2 = 0, _Object$entries = Object.entries(style.css); _i2 < _Object$entries.length; _i2++) {\n\t          var _Object$entries$_i = _slicedToArray(_Object$entries[_i2], 2),\n\t              key = _Object$entries$_i[0],\n\t              value = _Object$entries$_i[1];\n\n\t          csses.push(\"\".concat(key, \": \").concat(value));\n\t        }\n\t      }\n\n\t      attributes = Utils.calculateObjectValue(this.options, this.options.rowAttributes, [item, i], attributes);\n\n\t      if (attributes) {\n\t        for (var _i3 = 0, _Object$entries2 = Object.entries(attributes); _i3 < _Object$entries2.length; _i3++) {\n\t          var _Object$entries2$_i = _slicedToArray(_Object$entries2[_i3], 2),\n\t              key = _Object$entries2$_i[0],\n\t              value = _Object$entries2$_i[1];\n\n\t          htmlAttributes.push(\"\".concat(key, \"=\\\"\").concat(Utils.escapeHTML(value), \"\\\"\"));\n\t        }\n\t      }\n\n\t      if (item._data && !Utils.isEmptyObject(item._data)) {\n\t        for (var _i4 = 0, _Object$entries3 = Object.entries(item._data); _i4 < _Object$entries3.length; _i4++) {\n\t          var _Object$entries3$_i = _slicedToArray(_Object$entries3[_i4], 2),\n\t              k = _Object$entries3$_i[0],\n\t              v = _Object$entries3$_i[1];\n\n\t          // ignore data-index\n\t          if (k === 'index') {\n\t            return;\n\t          }\n\n\t          data_ += \" data-\".concat(k, \"='\").concat(_typeof(v) === 'object' ? JSON.stringify(v) : v, \"'\");\n\t        }\n\t      }\n\n\t      html.push('<tr', Utils.sprintf(' %s', htmlAttributes.length ? htmlAttributes.join(' ') : undefined), Utils.sprintf(' id=\"%s\"', Array.isArray(item) ? undefined : item._id), Utils.sprintf(' class=\"%s\"', style.classes || (Array.isArray(item) ? undefined : item._class)), \" data-index=\\\"\".concat(i, \"\\\"\"), Utils.sprintf(' data-uniqueid=\"%s\"', Utils.getItemField(item, this.options.uniqueId, false)), Utils.sprintf(' data-has-detail-view=\"%s\"', !this.options.cardView && this.options.detailView && Utils.calculateObjectValue(null, this.options.detailFilter, [i, item]) ? 'true' : undefined), Utils.sprintf('%s', data_), '>');\n\n\t      if (this.options.cardView) {\n\t        html.push(\"<td colspan=\\\"\".concat(this.header.fields.length, \"\\\"><div class=\\\"card-views\\\">\"));\n\t      }\n\n\t      if (!this.options.cardView && this.options.detailView && this.options.detailViewIcon) {\n\t        html.push('<td>');\n\n\t        if (Utils.calculateObjectValue(null, this.options.detailFilter, [i, item])) {\n\t          html.push(\"\\n          <a class=\\\"detail-icon\\\" href=\\\"#\\\">\\n          \".concat(Utils.sprintf(this.constants.html.icon, this.options.iconsPrefix, this.options.icons.detailOpen), \"\\n          </a>\\n        \"));\n\t        }\n\n\t        html.push('</td>');\n\t      }\n\n\t      this.header.fields.forEach(function (field, j) {\n\t        var text = '';\n\t        var value_ = Utils.getItemField(item, field, _this7.options.escape);\n\t        var value = '';\n\t        var type = '';\n\t        var cellStyle = {};\n\t        var id_ = '';\n\t        var class_ = _this7.header.classes[j];\n\t        var style_ = '';\n\t        var data_ = '';\n\t        var rowspan_ = '';\n\t        var colspan_ = '';\n\t        var title_ = '';\n\t        var column = _this7.columns[j];\n\n\t        if (_this7.fromHtml && typeof value_ === 'undefined') {\n\t          if (!column.checkbox && !column.radio) {\n\t            return;\n\t          }\n\t        }\n\n\t        if (!column.visible) {\n\t          return;\n\t        }\n\n\t        if (_this7.options.cardView && !column.cardVisible) {\n\t          return;\n\t        }\n\n\t        if (column.escape) {\n\t          value_ = Utils.escapeHTML(value_);\n\t        }\n\n\t        if (csses.concat([_this7.header.styles[j]]).length) {\n\t          style_ = \" style=\\\"\".concat(csses.concat([_this7.header.styles[j]]).join('; '), \"\\\"\");\n\t        } // handle td's id and class\n\n\n\t        if (item[\"_\".concat(field, \"_id\")]) {\n\t          id_ = Utils.sprintf(' id=\"%s\"', item[\"_\".concat(field, \"_id\")]);\n\t        }\n\n\t        if (item[\"_\".concat(field, \"_class\")]) {\n\t          class_ = Utils.sprintf(' class=\"%s\"', item[\"_\".concat(field, \"_class\")]);\n\t        }\n\n\t        if (item[\"_\".concat(field, \"_rowspan\")]) {\n\t          rowspan_ = Utils.sprintf(' rowspan=\"%s\"', item[\"_\".concat(field, \"_rowspan\")]);\n\t        }\n\n\t        if (item[\"_\".concat(field, \"_colspan\")]) {\n\t          colspan_ = Utils.sprintf(' colspan=\"%s\"', item[\"_\".concat(field, \"_colspan\")]);\n\t        }\n\n\t        if (item[\"_\".concat(field, \"_title\")]) {\n\t          title_ = Utils.sprintf(' title=\"%s\"', item[\"_\".concat(field, \"_title\")]);\n\t        }\n\n\t        cellStyle = Utils.calculateObjectValue(_this7.header, _this7.header.cellStyles[j], [value_, item, i, field], cellStyle);\n\n\t        if (cellStyle.classes) {\n\t          class_ = \" class=\\\"\".concat(cellStyle.classes, \"\\\"\");\n\t        }\n\n\t        if (cellStyle.css) {\n\t          var csses_ = [];\n\n\t          for (var _i5 = 0, _Object$entries4 = Object.entries(cellStyle.css); _i5 < _Object$entries4.length; _i5++) {\n\t            var _Object$entries4$_i = _slicedToArray(_Object$entries4[_i5], 2),\n\t                key = _Object$entries4$_i[0],\n\t                _value = _Object$entries4$_i[1];\n\n\t            csses_.push(\"\".concat(key, \": \").concat(_value));\n\t          }\n\n\t          style_ = \" style=\\\"\".concat(csses_.concat(_this7.header.styles[j]).join('; '), \"\\\"\");\n\t        }\n\n\t        value = Utils.calculateObjectValue(column, _this7.header.formatters[j], [value_, item, i, field], value_);\n\n\t        if (item[\"_\".concat(field, \"_data\")] && !Utils.isEmptyObject(item[\"_\".concat(field, \"_data\")])) {\n\t          for (var _i6 = 0, _Object$entries5 = Object.entries(item[\"_\".concat(field, \"_data\")]); _i6 < _Object$entries5.length; _i6++) {\n\t            var _Object$entries5$_i = _slicedToArray(_Object$entries5[_i6], 2),\n\t                k = _Object$entries5$_i[0],\n\t                v = _Object$entries5$_i[1];\n\n\t            // ignore data-index\n\t            if (k === 'index') {\n\t              return;\n\t            }\n\n\t            data_ += \" data-\".concat(k, \"=\\\"\").concat(v, \"\\\"\");\n\t          }\n\t        }\n\n\t        if (column.checkbox || column.radio) {\n\t          type = column.checkbox ? 'checkbox' : type;\n\t          type = column.radio ? 'radio' : type;\n\t          var c = column['class'] || '';\n\t          var isChecked = (value === true || value_ || value && value.checked) && value !== false;\n\t          var isDisabled = !column.checkboxEnabled || value && value.disabled;\n\t          text = [_this7.options.cardView ? \"<div class=\\\"card-view \".concat(c, \"\\\">\") : \"<td class=\\\"bs-checkbox \".concat(c, \"\\\"\").concat(class_).concat(style_, \">\"), \"<label>\\n            <input\\n            data-index=\\\"\".concat(i, \"\\\"\\n            name=\\\"\").concat(_this7.options.selectItemName, \"\\\"\\n            type=\\\"\").concat(type, \"\\\"\\n            \").concat(Utils.sprintf('value=\"%s\"', item[_this7.options.idField]), \"\\n            \").concat(Utils.sprintf('checked=\"%s\"', isChecked ? 'checked' : undefined), \"\\n            \").concat(Utils.sprintf('disabled=\"%s\"', isDisabled ? 'disabled' : undefined), \" />\\n            <span></span>\\n            </label>\"), _this7.header.formatters[j] && typeof value === 'string' ? value : '', _this7.options.cardView ? '</div>' : '</td>'].join('');\n\t          item[_this7.header.stateField] = value === true || !!value_ || value && value.checked;\n\t        } else {\n\t          value = typeof value === 'undefined' || value === null ? _this7.options.undefinedText : value;\n\n\t          if (_this7.options.cardView) {\n\t            var cardTitle = _this7.options.showHeader ? \"<span class=\\\"card-view-title\\\"\".concat(style_, \">\").concat(Utils.getFieldTitle(_this7.columns, field), \"</span>\") : '';\n\t            text = \"<div class=\\\"card-view\\\">\".concat(cardTitle, \"<span class=\\\"card-view-value\\\">\").concat(value, \"</span></div>\");\n\n\t            if (_this7.options.smartDisplay && value === '') {\n\t              text = '<div class=\"card-view\"></div>';\n\t            }\n\t          } else {\n\t            text = \"<td\".concat(id_).concat(class_).concat(style_).concat(data_).concat(rowspan_).concat(colspan_).concat(title_, \">\").concat(value, \"</td>\");\n\t          }\n\t        }\n\n\t        html.push(text);\n\t      });\n\n\t      if (this.options.cardView) {\n\t        html.push('</div></td>');\n\t      }\n\n\t      html.push('</tr>');\n\t      return html.join('');\n\t    }\n\t  }, {\n\t    key: \"initBody\",\n\t    value: function initBody(fixedScroll) {\n\t      var _this8 = this;\n\n\t      var data = this.getData();\n\t      this.trigger('pre-body', data);\n\t      this.$body = this.$el.find('>tbody');\n\n\t      if (!this.$body.length) {\n\t        this.$body = $('<tbody></tbody>').appendTo(this.$el);\n\t      } // Fix #389 Bootstrap-table-flatJSON is not working\n\n\n\t      if (!this.options.pagination || this.options.sidePagination === 'server') {\n\t        this.pageFrom = 1;\n\t        this.pageTo = data.length;\n\t      }\n\n\t      var rows = [];\n\t      var trFragments = $(document.createDocumentFragment());\n\t      var hasTr = false;\n\n\t      for (var i = this.pageFrom - 1; i < this.pageTo; i++) {\n\t        var item = data[i];\n\t        var tr = this.initRow(item, i, data, trFragments);\n\t        hasTr = hasTr || !!tr;\n\n\t        if (tr && typeof tr === 'string') {\n\t          if (!this.options.virtualScroll) {\n\t            trFragments.append(tr);\n\t          } else {\n\t            rows.push(tr);\n\t          }\n\t        }\n\t      } // show no records\n\n\n\t      if (!hasTr) {\n\t        this.$body.html(\"<tr class=\\\"no-records-found\\\">\".concat(Utils.sprintf('<td colspan=\"%s\">%s</td>', this.$header.find('th').length, this.options.formatNoMatches()), \"</tr>\"));\n\t      } else {\n\t        if (!this.options.virtualScroll) {\n\t          this.$body.html(trFragments);\n\t        } else {\n\t          if (this.virtualScroll) {\n\t            this.virtualScroll.destroy();\n\t          }\n\n\t          this.virtualScroll = new VirtualScroll({\n\t            rows: rows,\n\t            scrollEl: this.$tableBody[0],\n\t            contentEl: this.$body[0],\n\t            itemHeight: this.options.virtualScrollItemHeight,\n\t            callback: function callback() {\n\t              _this8.fitHeader();\n\t            }\n\t          });\n\t        }\n\t      }\n\n\t      if (!fixedScroll) {\n\t        this.scrollTo(0);\n\t      } // click to select by column\n\n\n\t      this.$body.find('> tr[data-index] > td').off('click dblclick').on('click dblclick', function (e) {\n\t        var $td = $(e.currentTarget);\n\t        var $tr = $td.parent();\n\t        var $cardViewArr = $(e.target).parents('.card-views').children();\n\t        var $cardViewTarget = $(e.target).parents('.card-view');\n\t        var rowIndex = $tr.data('index');\n\t        var item = _this8.data[rowIndex];\n\t        var index = _this8.options.cardView ? $cardViewArr.index($cardViewTarget) : $td[0].cellIndex;\n\n\t        var fields = _this8.getVisibleFields();\n\n\t        var field = fields[_this8.options.detailView && _this8.detailViewIcon && !_this8.options.cardView ? index - 1 : index];\n\t        var column = _this8.columns[_this8.fieldsColumnsIndex[field]];\n\t        var value = Utils.getItemField(item, field, _this8.options.escape);\n\n\t        if ($td.find('.detail-icon').length) {\n\t          return;\n\t        }\n\n\t        _this8.trigger(e.type === 'click' ? 'click-cell' : 'dbl-click-cell', field, value, item, $td);\n\n\t        _this8.trigger(e.type === 'click' ? 'click-row' : 'dbl-click-row', item, $tr, field); // if click to select - then trigger the checkbox/radio click\n\n\n\t        if (e.type === 'click' && _this8.options.clickToSelect && column.clickToSelect && !Utils.calculateObjectValue(_this8.options, _this8.options.ignoreClickToSelectOn, [e.target])) {\n\t          var $selectItem = $tr.find(Utils.sprintf('[name=\"%s\"]', _this8.options.selectItemName));\n\n\t          if ($selectItem.length) {\n\t            $selectItem[0].click();\n\t          }\n\t        }\n\n\t        if (e.type === 'click' && _this8.options.detailViewByClick) {\n\t          _this8.toggleDetailView(rowIndex, _this8.header.detailFormatters[_this8.fieldsColumnsIndex[field]]);\n\t        }\n\t      }).off('mousedown').on('mousedown', function (e) {\n\t        // https://github.com/jquery/jquery/issues/1741\n\t        _this8.multipleSelectRowCtrlKey = e.ctrlKey || e.metaKey;\n\t        _this8.multipleSelectRowShiftKey = e.shiftKey;\n\t      });\n\t      this.$body.find('> tr[data-index] > td > .detail-icon').off('click').on('click', function (e) {\n\t        e.preventDefault();\n\n\t        _this8.toggleDetailView($(e.currentTarget).parent().parent().data('index'));\n\n\t        return false;\n\t      });\n\t      this.$selectItem = this.$body.find(Utils.sprintf('[name=\"%s\"]', this.options.selectItemName));\n\t      this.$selectItem.off('click').on('click', function (e) {\n\t        e.stopImmediatePropagation();\n\t        var $this = $(e.currentTarget);\n\n\t        _this8._toggleCheck($this.prop('checked'), $this.data('index'));\n\t      });\n\t      this.header.events.forEach(function (_events, i) {\n\t        var events = _events;\n\n\t        if (!events) {\n\t          return;\n\t        } // fix bug, if events is defined with namespace\n\n\n\t        if (typeof events === 'string') {\n\t          events = Utils.calculateObjectValue(null, events);\n\t        }\n\n\t        var field = _this8.header.fields[i];\n\n\t        var fieldIndex = _this8.getVisibleFields().indexOf(field);\n\n\t        if (fieldIndex === -1) {\n\t          return;\n\t        }\n\n\t        if (_this8.options.detailView && !_this8.options.cardView) {\n\t          fieldIndex += 1;\n\t        }\n\n\t        var _loop = function _loop(key) {\n\t          if (!events.hasOwnProperty(key)) {\n\t            return \"continue\";\n\t          }\n\n\t          var event = events[key];\n\n\t          _this8.$body.find('>tr:not(.no-records-found)').each(function (i, tr) {\n\t            var $tr = $(tr);\n\t            var $td = $tr.find(_this8.options.cardView ? '.card-views>.card-view' : '>td').eq(fieldIndex);\n\t            var index = key.indexOf(' ');\n\t            var name = key.substring(0, index);\n\t            var el = key.substring(index + 1);\n\t            $td.find(el).off(name).on(name, function (e) {\n\t              var index = $tr.data('index');\n\t              var row = _this8.data[index];\n\t              var value = row[field];\n\t              event.apply(_this8, [e, value, row, index]);\n\t            });\n\t          });\n\t        };\n\n\t        for (var key in events) {\n\t          var _ret = _loop(key);\n\n\t          if (_ret === \"continue\") continue;\n\t        }\n\t      });\n\t      this.updateSelected();\n\t      this.initFooter();\n\t      this.resetView();\n\n\t      if (this.options.sidePagination !== 'server') {\n\t        this.options.totalRows = data.length;\n\t      }\n\n\t      this.trigger('post-body', data);\n\t    }\n\t  }, {\n\t    key: \"initServer\",\n\t    value: function initServer(silent, query, url) {\n\t      var _this9 = this;\n\n\t      var data = {};\n\t      var index = this.header.fields.indexOf(this.options.sortName);\n\t      var params = {\n\t        searchText: this.searchText,\n\t        sortName: this.options.sortName,\n\t        sortOrder: this.options.sortOrder\n\t      };\n\n\t      if (this.header.sortNames[index]) {\n\t        params.sortName = this.header.sortNames[index];\n\t      }\n\n\t      if (this.options.pagination && this.options.sidePagination === 'server') {\n\t        params.pageSize = this.options.pageSize === this.options.formatAllRows() ? this.options.totalRows : this.options.pageSize;\n\t        params.pageNumber = this.options.pageNumber;\n\t      }\n\n\t      if (!(url || this.options.url) && !this.options.ajax) {\n\t        return;\n\t      }\n\n\t      if (this.options.queryParamsType === 'limit') {\n\t        params = {\n\t          search: params.searchText,\n\t          sort: params.sortName,\n\t          order: params.sortOrder\n\t        };\n\n\t        if (this.options.pagination && this.options.sidePagination === 'server') {\n\t          params.offset = this.options.pageSize === this.options.formatAllRows() ? 0 : this.options.pageSize * (this.options.pageNumber - 1);\n\t          params.limit = this.options.pageSize === this.options.formatAllRows() ? this.options.totalRows : this.options.pageSize;\n\n\t          if (params.limit === 0) {\n\t            delete params.limit;\n\t          }\n\t        }\n\t      }\n\n\t      if (!Utils.isEmptyObject(this.filterColumnsPartial)) {\n\t        params.filter = JSON.stringify(this.filterColumnsPartial, null);\n\t      }\n\n\t      $.extend(params, query || {});\n\t      data = Utils.calculateObjectValue(this.options, this.options.queryParams, [params], data); // false to stop request\n\n\t      if (data === false) {\n\t        return;\n\t      }\n\n\t      if (!silent) {\n\t        this.showLoading();\n\t      }\n\n\t      var request = $.extend({}, Utils.calculateObjectValue(null, this.options.ajaxOptions), {\n\t        type: this.options.method,\n\t        url: url || this.options.url,\n\t        data: this.options.contentType === 'application/json' && this.options.method === 'post' ? JSON.stringify(data) : data,\n\t        cache: this.options.cache,\n\t        contentType: this.options.contentType,\n\t        dataType: this.options.dataType,\n\t        success: function success(_res) {\n\t          var res = Utils.calculateObjectValue(_this9.options, _this9.options.responseHandler, [_res], _res);\n\n\t          _this9.load(res);\n\n\t          _this9.trigger('load-success', res);\n\n\t          if (!silent) {\n\t            _this9.hideLoading();\n\t          }\n\t        },\n\t        error: function error(jqXHR) {\n\t          var data = [];\n\n\t          if (_this9.options.sidePagination === 'server') {\n\t            data = {};\n\t            data[_this9.options.totalField] = 0;\n\t            data[_this9.options.dataField] = [];\n\t          }\n\n\t          _this9.load(data);\n\n\t          _this9.trigger('load-error', jqXHR.status, jqXHR);\n\n\t          if (!silent) _this9.$tableLoading.hide();\n\t        }\n\t      });\n\n\t      if (this.options.ajax) {\n\t        Utils.calculateObjectValue(this, this.options.ajax, [request], null);\n\t      } else {\n\t        if (this._xhr && this._xhr.readyState !== 4) {\n\t          this._xhr.abort();\n\t        }\n\n\t        this._xhr = $.ajax(request);\n\t      }\n\n\t      return data;\n\t    }\n\t  }, {\n\t    key: \"initSearchText\",\n\t    value: function initSearchText() {\n\t      if (this.options.search) {\n\t        this.searchText = '';\n\n\t        if (this.options.searchText !== '') {\n\t          var $search = this.$toolbar.find('.search input');\n\t          $search.val(this.options.searchText);\n\t          this.onSearch({\n\t            currentTarget: $search,\n\t            firedByInitSearchText: true\n\t          });\n\t        }\n\t      }\n\t    }\n\t  }, {\n\t    key: \"getCaret\",\n\t    value: function getCaret() {\n\t      var _this10 = this;\n\n\t      this.$header.find('th').each(function (i, th) {\n\t        $(th).find('.sortable').removeClass('desc asc').addClass($(th).data('field') === _this10.options.sortName ? _this10.options.sortOrder : 'both');\n\t      });\n\t    }\n\t  }, {\n\t    key: \"updateSelected\",\n\t    value: function updateSelected() {\n\t      var checkAll = this.$selectItem.filter(':enabled').length && this.$selectItem.filter(':enabled').length === this.$selectItem.filter(':enabled').filter(':checked').length;\n\t      this.$selectAll.add(this.$selectAll_).prop('checked', checkAll);\n\t      this.$selectItem.each(function (i, el) {\n\t        $(el).closest('tr')[$(el).prop('checked') ? 'addClass' : 'removeClass']('selected');\n\t      });\n\t    }\n\t  }, {\n\t    key: \"updateRows\",\n\t    value: function updateRows() {\n\t      var _this11 = this;\n\n\t      this.$selectItem.each(function (i, el) {\n\t        _this11.data[$(el).data('index')][_this11.header.stateField] = $(el).prop('checked');\n\t      });\n\t    }\n\t  }, {\n\t    key: \"resetRows\",\n\t    value: function resetRows() {\n\t      var _iteratorNormalCompletion2 = true;\n\t      var _didIteratorError2 = false;\n\t      var _iteratorError2 = undefined;\n\n\t      try {\n\t        for (var _iterator2 = this.data[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n\t          var row = _step2.value;\n\t          this.$selectAll.prop('checked', false);\n\t          this.$selectItem.prop('checked', false);\n\n\t          if (this.header.stateField) {\n\t            row[this.header.stateField] = false;\n\t          }\n\t        }\n\t      } catch (err) {\n\t        _didIteratorError2 = true;\n\t        _iteratorError2 = err;\n\t      } finally {\n\t        try {\n\t          if (!_iteratorNormalCompletion2 && _iterator2.return != null) {\n\t            _iterator2.return();\n\t          }\n\t        } finally {\n\t          if (_didIteratorError2) {\n\t            throw _iteratorError2;\n\t          }\n\t        }\n\t      }\n\n\t      this.initHiddenRows();\n\t    }\n\t  }, {\n\t    key: \"trigger\",\n\t    value: function trigger(_name) {\n\t      var _this$options;\n\n\t      var name = \"\".concat(_name, \".bs.table\");\n\n\t      for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key2 = 1; _key2 < _len; _key2++) {\n\t        args[_key2 - 1] = arguments[_key2];\n\t      }\n\n\t      (_this$options = this.options)[BootstrapTable.EVENTS[name]].apply(_this$options, args);\n\n\t      this.$el.trigger($.Event(name), args);\n\t      this.options.onAll(name, args);\n\t      this.$el.trigger($.Event('all.bs.table'), [name, args]);\n\t    }\n\t  }, {\n\t    key: \"resetHeader\",\n\t    value: function resetHeader() {\n\t      var _this12 = this;\n\n\t      // fix #61: the hidden table reset header bug.\n\t      // fix bug: get $el.css('width') error sometime (height = 500)\n\t      clearTimeout(this.timeoutId_);\n\t      this.timeoutId_ = setTimeout(function () {\n\t        return _this12.fitHeader();\n\t      }, this.$el.is(':hidden') ? 100 : 0);\n\t    }\n\t  }, {\n\t    key: \"fitHeader\",\n\t    value: function fitHeader() {\n\t      var _this13 = this;\n\n\t      if (this.$el.is(':hidden')) {\n\t        this.timeoutId_ = setTimeout(function () {\n\t          return _this13.fitHeader();\n\t        }, 100);\n\t        return;\n\t      }\n\n\t      var fixedBody = this.$tableBody.get(0);\n\t      var scrollWidth = fixedBody.scrollWidth > fixedBody.clientWidth && fixedBody.scrollHeight > fixedBody.clientHeight + this.$header.outerHeight() ? Utils.getScrollBarWidth() : 0;\n\t      this.$el.css('margin-top', -this.$header.outerHeight());\n\t      var focused = $(':focus');\n\n\t      if (focused.length > 0) {\n\t        var $th = focused.parents('th');\n\n\t        if ($th.length > 0) {\n\t          var dataField = $th.attr('data-field');\n\n\t          if (dataField !== undefined) {\n\t            var $headerTh = this.$header.find(\"[data-field='\".concat(dataField, \"']\"));\n\n\t            if ($headerTh.length > 0) {\n\t              $headerTh.find(':input').addClass('focus-temp');\n\t            }\n\t          }\n\t        }\n\t      }\n\n\t      this.$header_ = this.$header.clone(true, true);\n\t      this.$selectAll_ = this.$header_.find('[name=\"btSelectAll\"]');\n\t      this.$tableHeader.css('margin-right', scrollWidth).find('table').css('width', this.$el.outerWidth()).html('').attr('class', this.$el.attr('class')).append(this.$header_);\n\t      this.$tableLoading.css('width', this.$el.outerWidth());\n\t      var focusedTemp = $('.focus-temp:visible:eq(0)');\n\n\t      if (focusedTemp.length > 0) {\n\t        focusedTemp.focus();\n\t        this.$header.find('.focus-temp').removeClass('focus-temp');\n\t      } // fix bug: $.data() is not working as expected after $.append()\n\n\n\t      this.$header.find('th[data-field]').each(function (i, el) {\n\t        _this13.$header_.find(Utils.sprintf('th[data-field=\"%s\"]', $(el).data('field'))).data($(el).data());\n\t      });\n\t      var visibleFields = this.getVisibleFields();\n\t      var $ths = this.$header_.find('th');\n\t      var $tr = this.$body.find('>tr:not(.no-records-found,.virtual-scroll-top)').eq(0);\n\n\t      while ($tr.length && $tr.find('>td[colspan]:not([colspan=\"1\"])').length) {\n\t        $tr = $tr.next();\n\t      }\n\n\t      $tr.find('> *').each(function (i, el) {\n\t        var $this = $(el);\n\t        var index = i;\n\n\t        if (_this13.options.detailView && _this13.options.detailViewIcon && !_this13.options.cardView) {\n\t          if (i === 0) {\n\t            var $thDetail = $ths.filter('.detail');\n\n\t            var _zoomWidth = $thDetail.innerWidth() - $thDetail.find('.fht-cell').width();\n\n\t            $thDetail.find('.fht-cell').width($this.innerWidth() - _zoomWidth);\n\t          }\n\n\t          index = i - 1;\n\t        }\n\n\t        if (index === -1) {\n\t          return;\n\t        }\n\n\t        var $th = _this13.$header_.find(Utils.sprintf('th[data-field=\"%s\"]', visibleFields[index]));\n\n\t        if ($th.length > 1) {\n\t          $th = $($ths[$this[0].cellIndex]);\n\t        }\n\n\t        var zoomWidth = $th.innerWidth() - $th.find('.fht-cell').width();\n\t        $th.find('.fht-cell').width($this.innerWidth() - zoomWidth);\n\t      });\n\t      this.horizontalScroll();\n\t      this.trigger('post-header');\n\t    }\n\t  }, {\n\t    key: \"initFooter\",\n\t    value: function initFooter() {\n\t      if (!this.options.showFooter || this.options.cardView) {\n\t        // do nothing\n\t        return;\n\t      }\n\n\t      var data = this.getData();\n\t      var html = [];\n\n\t      if (!this.options.cardView && this.options.detailView && this.options.detailViewIcon) {\n\t        html.push('<th class=\"detail\"><div class=\"th-inner\"></div><div class=\"fht-cell\"></div></th>');\n\t      }\n\n\t      var _iteratorNormalCompletion3 = true;\n\t      var _didIteratorError3 = false;\n\t      var _iteratorError3 = undefined;\n\n\t      try {\n\t        for (var _iterator3 = this.columns[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {\n\t          var column = _step3.value;\n\t          var falign = '';\n\t          var valign = '';\n\t          var csses = [];\n\t          var style = {};\n\t          var class_ = Utils.sprintf(' class=\"%s\"', column['class']);\n\n\t          if (!column.visible) {\n\t            continue;\n\t          }\n\n\t          if (this.options.cardView && !column.cardVisible) {\n\t            return;\n\t          }\n\n\t          falign = Utils.sprintf('text-align: %s; ', column.falign ? column.falign : column.align);\n\t          valign = Utils.sprintf('vertical-align: %s; ', column.valign);\n\t          style = Utils.calculateObjectValue(null, this.options.footerStyle, [column]);\n\n\t          if (style && style.css) {\n\t            for (var _i7 = 0, _Object$entries6 = Object.entries(style.css); _i7 < _Object$entries6.length; _i7++) {\n\t              var _Object$entries6$_i = _slicedToArray(_Object$entries6[_i7], 2),\n\t                  key = _Object$entries6$_i[0],\n\t                  value = _Object$entries6$_i[1];\n\n\t              csses.push(\"\".concat(key, \": \").concat(value));\n\t            }\n\t          }\n\n\t          if (style && style.classes) {\n\t            class_ = Utils.sprintf(' class=\"%s\"', column['class'] ? [column['class'], style.classes].join(' ') : style.classes);\n\t          }\n\n\t          html.push('<th', class_, Utils.sprintf(' style=\"%s\"', falign + valign + csses.concat().join('; ')), '>');\n\t          html.push('<div class=\"th-inner\">');\n\t          html.push(Utils.calculateObjectValue(column, column.footerFormatter, [data], this.footerData[0] && this.footerData[0][column.field] || ''));\n\t          html.push('</div>');\n\t          html.push('<div class=\"fht-cell\"></div>');\n\t          html.push('</div>');\n\t          html.push('</th>');\n\t        }\n\t      } catch (err) {\n\t        _didIteratorError3 = true;\n\t        _iteratorError3 = err;\n\t      } finally {\n\t        try {\n\t          if (!_iteratorNormalCompletion3 && _iterator3.return != null) {\n\t            _iterator3.return();\n\t          }\n\t        } finally {\n\t          if (_didIteratorError3) {\n\t            throw _iteratorError3;\n\t          }\n\t        }\n\t      }\n\n\t      this.$tableFooter.find('tr').html(html.join(''));\n\t      this.trigger('post-footer', this.$tableFooter);\n\t    }\n\t  }, {\n\t    key: \"fitFooter\",\n\t    value: function fitFooter() {\n\t      var _this14 = this;\n\n\t      if (this.$el.is(':hidden')) {\n\t        setTimeout(function () {\n\t          return _this14.fitFooter();\n\t        }, 100);\n\t        return;\n\t      }\n\n\t      var fixedBody = this.$tableBody.get(0);\n\t      var scrollWidth = fixedBody.scrollWidth > fixedBody.clientWidth && fixedBody.scrollHeight > fixedBody.clientHeight + this.$header.outerHeight() ? Utils.getScrollBarWidth() : 0;\n\t      this.$tableFooter.css('margin-right', scrollWidth).find('table').css('width', this.$el.outerWidth()).attr('class', this.$el.attr('class'));\n\t      var visibleFields = this.getVisibleFields();\n\t      var $ths = this.$tableFooter.find('th');\n\t      var $tr = this.$body.find('>tr:first-child:not(.no-records-found)');\n\n\t      while ($tr.length && $tr.find('>td[colspan]:not([colspan=\"1\"])').length) {\n\t        $tr = $tr.next();\n\t      }\n\n\t      $tr.find('> *').each(function (i, el) {\n\t        var $this = $(el);\n\t        var index = i;\n\n\t        if (_this14.options.detailView && !_this14.options.cardView) {\n\t          if (i === 0) {\n\t            var $thDetail = $ths.filter('.detail');\n\n\t            var _zoomWidth2 = $thDetail.innerWidth() - $thDetail.find('.fht-cell').width();\n\n\t            $thDetail.find('.fht-cell').width($this.innerWidth() - _zoomWidth2);\n\t          }\n\n\t          index = i - 1;\n\t        }\n\n\t        if (index === -1) {\n\t          return;\n\t        }\n\n\t        var $th = $ths.eq(i);\n\t        var zoomWidth = $th.innerWidth() - $th.find('.fht-cell').width();\n\t        $th.find('.fht-cell').width($this.innerWidth() - zoomWidth);\n\t      });\n\t      this.horizontalScroll();\n\t    }\n\t  }, {\n\t    key: \"horizontalScroll\",\n\t    value: function horizontalScroll() {\n\t      var _this15 = this;\n\n\t      // horizontal scroll event\n\t      // TODO: it's probably better improving the layout than binding to scroll event\n\t      this.trigger('scroll-body');\n\t      this.$tableBody.off('scroll').on('scroll', function (_ref6) {\n\t        var currentTarget = _ref6.currentTarget;\n\n\t        if (_this15.options.showHeader && _this15.options.height) {\n\t          _this15.$tableHeader.scrollLeft($(currentTarget).scrollLeft());\n\t        }\n\n\t        if (_this15.options.showFooter && !_this15.options.cardView) {\n\t          _this15.$tableFooter.scrollLeft($(currentTarget).scrollLeft());\n\t        }\n\t      });\n\t    }\n\t  }, {\n\t    key: \"getVisibleFields\",\n\t    value: function getVisibleFields() {\n\t      var visibleFields = [];\n\t      var _iteratorNormalCompletion4 = true;\n\t      var _didIteratorError4 = false;\n\t      var _iteratorError4 = undefined;\n\n\t      try {\n\t        for (var _iterator4 = this.header.fields[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {\n\t          var field = _step4.value;\n\t          var column = this.columns[this.fieldsColumnsIndex[field]];\n\n\t          if (!column || !column.visible) {\n\t            continue;\n\t          }\n\n\t          visibleFields.push(field);\n\t        }\n\t      } catch (err) {\n\t        _didIteratorError4 = true;\n\t        _iteratorError4 = err;\n\t      } finally {\n\t        try {\n\t          if (!_iteratorNormalCompletion4 && _iterator4.return != null) {\n\t            _iterator4.return();\n\t          }\n\t        } finally {\n\t          if (_didIteratorError4) {\n\t            throw _iteratorError4;\n\t          }\n\t        }\n\t      }\n\n\t      return visibleFields;\n\t    }\n\t  }, {\n\t    key: \"initHiddenRows\",\n\t    value: function initHiddenRows() {\n\t      this.hiddenRows = [];\n\t    } // PUBLIC FUNCTION DEFINITION\n\t    // =======================\n\n\t  }, {\n\t    key: \"getOptions\",\n\t    value: function getOptions() {\n\t      // deep copy and remove data\n\t      var options = $.extend({}, this.options);\n\t      delete options.data;\n\t      return $.extend(true, {}, options);\n\t    }\n\t  }, {\n\t    key: \"refreshOptions\",\n\t    value: function refreshOptions(options) {\n\t      // If the objects are equivalent then avoid the call of destroy / init methods\n\t      if (Utils.compareObjects(this.options, options, true)) {\n\t        return;\n\t      }\n\n\t      this.options = $.extend(this.options, options);\n\t      this.trigger('refresh-options', this.options);\n\t      this.destroy();\n\t      this.init();\n\t    }\n\t  }, {\n\t    key: \"getData\",\n\t    value: function getData(params) {\n\t      var data = this.options.data;\n\n\t      if (this.searchText || this.options.sortName || !Utils.isEmptyObject(this.filterColumns) || !Utils.isEmptyObject(this.filterColumnsPartial)) {\n\t        data = this.data;\n\t      }\n\n\t      if (params && params.useCurrentPage) {\n\t        data = data.slice(this.pageFrom - 1, this.pageTo);\n\t      }\n\n\t      if (params && !params.includeHiddenRows) {\n\t        var hiddenRows = this.getHiddenRows();\n\t        data = data.filter(function (row) {\n\t          return Utils.findIndex(hiddenRows, row) === -1;\n\t        });\n\t      }\n\n\t      return data;\n\t    }\n\t  }, {\n\t    key: \"getSelections\",\n\t    value: function getSelections() {\n\t      var _this16 = this;\n\n\t      // fix #2424: from html with checkbox\n\t      return this.data.filter(function (row) {\n\t        return row[_this16.header.stateField] === true;\n\t      });\n\t    }\n\t  }, {\n\t    key: \"getAllSelections\",\n\t    value: function getAllSelections() {\n\t      var _this17 = this;\n\n\t      return this.options.data.filter(function (row) {\n\t        return row[_this17.header.stateField] === true;\n\t      });\n\t    }\n\t  }, {\n\t    key: \"load\",\n\t    value: function load(_data) {\n\t      var fixedScroll = false;\n\t      var data = _data; // #431: support pagination\n\n\t      if (this.options.pagination && this.options.sidePagination === 'server') {\n\t        this.options.totalRows = data[this.options.totalField];\n\t      }\n\n\t      if (this.options.pagination && this.options.sidePagination === 'server') {\n\t        this.options.totalNotFiltered = data[this.options.totalNotFilteredField];\n\t      }\n\n\t      fixedScroll = data.fixedScroll;\n\t      data = Array.isArray(data) ? data : data[this.options.dataField];\n\t      this.initData(data);\n\t      this.initSearch();\n\t      this.initPagination();\n\t      this.initBody(fixedScroll);\n\t    }\n\t  }, {\n\t    key: \"append\",\n\t    value: function append(data) {\n\t      this.initData(data, 'append');\n\t      this.initSearch();\n\t      this.initPagination();\n\t      this.initSort();\n\t      this.initBody(true);\n\t    }\n\t  }, {\n\t    key: \"prepend\",\n\t    value: function prepend(data) {\n\t      this.initData(data, 'prepend');\n\t      this.initSearch();\n\t      this.initPagination();\n\t      this.initSort();\n\t      this.initBody(true);\n\t    }\n\t  }, {\n\t    key: \"remove\",\n\t    value: function remove(params) {\n\t      var len = this.options.data.length;\n\t      var i;\n\t      var row;\n\n\t      if (!params.hasOwnProperty('field') || !params.hasOwnProperty('values')) {\n\t        return;\n\t      }\n\n\t      for (i = len - 1; i >= 0; i--) {\n\t        row = this.options.data[i];\n\n\t        if (!row.hasOwnProperty(params.field)) {\n\t          continue;\n\t        }\n\n\t        if (params.values.includes(row[params.field])) {\n\t          this.options.data.splice(i, 1);\n\n\t          if (this.options.sidePagination === 'server') {\n\t            this.options.totalRows -= 1;\n\t          }\n\t        }\n\t      }\n\n\t      if (len === this.options.data.length) {\n\t        return;\n\t      }\n\n\t      this.initSearch();\n\t      this.initPagination();\n\t      this.initSort();\n\t      this.initBody(true);\n\t    }\n\t  }, {\n\t    key: \"removeAll\",\n\t    value: function removeAll() {\n\t      if (this.options.data.length > 0) {\n\t        this.options.data.splice(0, this.options.data.length);\n\t        this.initSearch();\n\t        this.initPagination();\n\t        this.initBody(true);\n\t      }\n\t    }\n\t  }, {\n\t    key: \"insertRow\",\n\t    value: function insertRow(params) {\n\t      if (!params.hasOwnProperty('index') || !params.hasOwnProperty('row')) {\n\t        return;\n\t      }\n\n\t      this.options.data.splice(params.index, 0, params.row);\n\t      this.initSearch();\n\t      this.initPagination();\n\t      this.initSort();\n\t      this.initBody(true);\n\t    }\n\t  }, {\n\t    key: \"updateRow\",\n\t    value: function updateRow(params) {\n\t      var allParams = Array.isArray(params) ? params : [params];\n\t      var _iteratorNormalCompletion5 = true;\n\t      var _didIteratorError5 = false;\n\t      var _iteratorError5 = undefined;\n\n\t      try {\n\t        for (var _iterator5 = allParams[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {\n\t          var _params = _step5.value;\n\n\t          if (!_params.hasOwnProperty('index') || !_params.hasOwnProperty('row')) {\n\t            continue;\n\t          }\n\n\t          $.extend(this.options.data[_params.index], _params.row);\n\n\t          if (_params.hasOwnProperty('replace') && _params.replace) {\n\t            this.options.data[_params.index] = _params.row;\n\t          } else {\n\t            $.extend(this.options.data[_params.index], _params.row);\n\t          }\n\t        }\n\t      } catch (err) {\n\t        _didIteratorError5 = true;\n\t        _iteratorError5 = err;\n\t      } finally {\n\t        try {\n\t          if (!_iteratorNormalCompletion5 && _iterator5.return != null) {\n\t            _iterator5.return();\n\t          }\n\t        } finally {\n\t          if (_didIteratorError5) {\n\t            throw _iteratorError5;\n\t          }\n\t        }\n\t      }\n\n\t      this.initSearch();\n\t      this.initPagination();\n\t      this.initSort();\n\t      this.initBody(true);\n\t    }\n\t  }, {\n\t    key: \"getRowByUniqueId\",\n\t    value: function getRowByUniqueId(_id) {\n\t      var uniqueId = this.options.uniqueId;\n\t      var len = this.options.data.length;\n\t      var id = _id;\n\t      var dataRow = null;\n\t      var i;\n\t      var row;\n\t      var rowUniqueId;\n\n\t      for (i = len - 1; i >= 0; i--) {\n\t        row = this.options.data[i];\n\n\t        if (row.hasOwnProperty(uniqueId)) {\n\t          // uniqueId is a column\n\t          rowUniqueId = row[uniqueId];\n\t        } else if (row._data && row._data.hasOwnProperty(uniqueId)) {\n\t          // uniqueId is a row data property\n\t          rowUniqueId = row._data[uniqueId];\n\t        } else {\n\t          continue;\n\t        }\n\n\t        if (typeof rowUniqueId === 'string') {\n\t          id = id.toString();\n\t        } else if (typeof rowUniqueId === 'number') {\n\t          if (Number(rowUniqueId) === rowUniqueId && rowUniqueId % 1 === 0) {\n\t            id = parseInt(id);\n\t          } else if (rowUniqueId === Number(rowUniqueId) && rowUniqueId !== 0) {\n\t            id = parseFloat(id);\n\t          }\n\t        }\n\n\t        if (rowUniqueId === id) {\n\t          dataRow = row;\n\t          break;\n\t        }\n\t      }\n\n\t      return dataRow;\n\t    }\n\t  }, {\n\t    key: \"updateByUniqueId\",\n\t    value: function updateByUniqueId(params) {\n\t      var allParams = Array.isArray(params) ? params : [params];\n\t      var _iteratorNormalCompletion6 = true;\n\t      var _didIteratorError6 = false;\n\t      var _iteratorError6 = undefined;\n\n\t      try {\n\t        for (var _iterator6 = allParams[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) {\n\t          var _params2 = _step6.value;\n\n\t          if (!_params2.hasOwnProperty('id') || !_params2.hasOwnProperty('row')) {\n\t            continue;\n\t          }\n\n\t          var rowId = this.options.data.indexOf(this.getRowByUniqueId(_params2.id));\n\n\t          if (rowId === -1) {\n\t            continue;\n\t          }\n\n\t          if (_params2.hasOwnProperty('replace') && _params2.replace) {\n\t            this.options.data[rowId] = _params2.row;\n\t          } else {\n\t            $.extend(this.options.data[rowId], _params2.row);\n\t          }\n\t        }\n\t      } catch (err) {\n\t        _didIteratorError6 = true;\n\t        _iteratorError6 = err;\n\t      } finally {\n\t        try {\n\t          if (!_iteratorNormalCompletion6 && _iterator6.return != null) {\n\t            _iterator6.return();\n\t          }\n\t        } finally {\n\t          if (_didIteratorError6) {\n\t            throw _iteratorError6;\n\t          }\n\t        }\n\t      }\n\n\t      this.initSearch();\n\t      this.initPagination();\n\t      this.initSort();\n\t      this.initBody(true);\n\t    }\n\t  }, {\n\t    key: \"removeByUniqueId\",\n\t    value: function removeByUniqueId(id) {\n\t      var len = this.options.data.length;\n\t      var row = this.getRowByUniqueId(id);\n\n\t      if (row) {\n\t        this.options.data.splice(this.options.data.indexOf(row), 1);\n\t      }\n\n\t      if (len === this.options.data.length) {\n\t        return;\n\t      }\n\n\t      this.initSearch();\n\t      this.initPagination();\n\t      this.initBody(true);\n\t    }\n\t  }, {\n\t    key: \"updateCell\",\n\t    value: function updateCell(params) {\n\t      if (!params.hasOwnProperty('index') || !params.hasOwnProperty('field') || !params.hasOwnProperty('value')) {\n\t        return;\n\t      }\n\n\t      this.data[params.index][params.field] = params.value;\n\n\t      if (params.reinit === false) {\n\t        return;\n\t      }\n\n\t      this.initSort();\n\t      this.initBody(true);\n\t    }\n\t  }, {\n\t    key: \"updateCellByUniqueId\",\n\t    value: function updateCellByUniqueId(params) {\n\t      var _this18 = this;\n\n\t      if (!params.hasOwnProperty('id') || !params.hasOwnProperty('field') || !params.hasOwnProperty('value')) {\n\t        return;\n\t      }\n\n\t      var allParams = Array.isArray(params) ? params : [params];\n\t      allParams.forEach(function (_ref7) {\n\t        var id = _ref7.id,\n\t            field = _ref7.field,\n\t            value = _ref7.value;\n\n\t        var rowId = _this18.options.data.indexOf(_this18.getRowByUniqueId(id));\n\n\t        if (rowId === -1) {\n\t          return;\n\t        }\n\n\t        _this18.options.data[rowId][field] = value;\n\t      });\n\n\t      if (params.reinit === false) {\n\t        return;\n\t      }\n\n\t      this.initSort();\n\t      this.initBody(true);\n\t    }\n\t  }, {\n\t    key: \"showRow\",\n\t    value: function showRow(params) {\n\t      this._toggleRow(params, true);\n\t    }\n\t  }, {\n\t    key: \"hideRow\",\n\t    value: function hideRow(params) {\n\t      this._toggleRow(params, false);\n\t    }\n\t  }, {\n\t    key: \"_toggleRow\",\n\t    value: function _toggleRow(params, visible) {\n\t      var row;\n\n\t      if (params.hasOwnProperty('index')) {\n\t        row = this.getData()[params.index];\n\t      } else if (params.hasOwnProperty('uniqueId')) {\n\t        row = this.getRowByUniqueId(params.uniqueId);\n\t      }\n\n\t      if (!row) {\n\t        return;\n\t      }\n\n\t      var index = Utils.findIndex(this.hiddenRows, row);\n\n\t      if (!visible && index === -1) {\n\t        this.hiddenRows.push(row);\n\t      } else if (visible && index > -1) {\n\t        this.hiddenRows.splice(index, 1);\n\t      }\n\n\t      if (visible) {\n\t        this.updatePagination();\n\t      } else {\n\t        this.initBody(true);\n\t        this.initPagination();\n\t      }\n\t    }\n\t  }, {\n\t    key: \"getHiddenRows\",\n\t    value: function getHiddenRows(show) {\n\t      if (show) {\n\t        this.initHiddenRows();\n\t        this.initBody(true);\n\t        return;\n\t      }\n\n\t      var data = this.getData();\n\t      var rows = [];\n\t      var _iteratorNormalCompletion7 = true;\n\t      var _didIteratorError7 = false;\n\t      var _iteratorError7 = undefined;\n\n\t      try {\n\t        for (var _iterator7 = data[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) {\n\t          var row = _step7.value;\n\n\t          if (this.hiddenRows.includes(row)) {\n\t            rows.push(row);\n\t          }\n\t        }\n\t      } catch (err) {\n\t        _didIteratorError7 = true;\n\t        _iteratorError7 = err;\n\t      } finally {\n\t        try {\n\t          if (!_iteratorNormalCompletion7 && _iterator7.return != null) {\n\t            _iterator7.return();\n\t          }\n\t        } finally {\n\t          if (_didIteratorError7) {\n\t            throw _iteratorError7;\n\t          }\n\t        }\n\t      }\n\n\t      this.hiddenRows = rows;\n\t      return rows;\n\t    }\n\t  }, {\n\t    key: \"showColumn\",\n\t    value: function showColumn(field) {\n\t      var _this19 = this;\n\n\t      var fields = Array.isArray(field) ? field : [field];\n\t      fields.forEach(function (field) {\n\t        _this19._toggleColumn(_this19.fieldsColumnsIndex[field], true, true);\n\t      });\n\t    }\n\t  }, {\n\t    key: \"hideColumn\",\n\t    value: function hideColumn(field) {\n\t      var _this20 = this;\n\n\t      var fields = Array.isArray(field) ? field : [field];\n\t      fields.forEach(function (field) {\n\t        _this20._toggleColumn(_this20.fieldsColumnsIndex[field], false, true);\n\t      });\n\t    }\n\t  }, {\n\t    key: \"_toggleColumn\",\n\t    value: function _toggleColumn(index, checked, needUpdate) {\n\t      if (index === -1 || this.columns[index].visible === checked) {\n\t        return;\n\t      }\n\n\t      this.columns[index].visible = checked;\n\t      this.initHeader();\n\t      this.initSearch();\n\t      this.initPagination();\n\t      this.initBody();\n\n\t      if (this.options.showColumns) {\n\t        var $items = this.$toolbar.find('.keep-open input').prop('disabled', false);\n\n\t        if (needUpdate) {\n\t          $items.filter(Utils.sprintf('[value=\"%s\"]', index)).prop('checked', checked);\n\t        }\n\n\t        if ($items.filter(':checked').length <= this.options.minimumCountColumns) {\n\t          $items.filter(':checked').prop('disabled', true);\n\t        }\n\t      }\n\t    }\n\t  }, {\n\t    key: \"getVisibleColumns\",\n\t    value: function getVisibleColumns() {\n\t      return this.columns.filter(function (_ref8) {\n\t        var visible = _ref8.visible;\n\t        return visible;\n\t      });\n\t    }\n\t  }, {\n\t    key: \"getHiddenColumns\",\n\t    value: function getHiddenColumns() {\n\t      return this.columns.filter(function (_ref9) {\n\t        var visible = _ref9.visible;\n\t        return !visible;\n\t      });\n\t    }\n\t  }, {\n\t    key: \"showAllColumns\",\n\t    value: function showAllColumns() {\n\t      this._toggleAllColumns(true);\n\t    }\n\t  }, {\n\t    key: \"hideAllColumns\",\n\t    value: function hideAllColumns() {\n\t      this._toggleAllColumns(false);\n\t    }\n\t  }, {\n\t    key: \"_toggleAllColumns\",\n\t    value: function _toggleAllColumns(visible) {\n\t      var _this21 = this;\n\n\t      var _iteratorNormalCompletion8 = true;\n\t      var _didIteratorError8 = false;\n\t      var _iteratorError8 = undefined;\n\n\t      try {\n\t        for (var _iterator8 = this.columns.slice().reverse()[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) {\n\t          var column = _step8.value;\n\n\t          if (column.switchable) {\n\t            if (!visible && this.options.showColumns && this.getVisibleColumns().length === this.options.minimumCountColumns) {\n\t              continue;\n\t            }\n\n\t            column.visible = visible;\n\t          }\n\t        }\n\t      } catch (err) {\n\t        _didIteratorError8 = true;\n\t        _iteratorError8 = err;\n\t      } finally {\n\t        try {\n\t          if (!_iteratorNormalCompletion8 && _iterator8.return != null) {\n\t            _iterator8.return();\n\t          }\n\t        } finally {\n\t          if (_didIteratorError8) {\n\t            throw _iteratorError8;\n\t          }\n\t        }\n\t      }\n\n\t      this.initHeader();\n\t      this.initSearch();\n\t      this.initPagination();\n\t      this.initBody();\n\n\t      if (this.options.showColumns) {\n\t        var $items = this.$toolbar.find('.keep-open input:not(\".toggle-all\")').prop('disabled', false);\n\n\t        if (visible) {\n\t          $items.prop('checked', visible);\n\t        } else {\n\t          $items.get().reverse().forEach(function (item) {\n\t            if ($items.filter(':checked').length > _this21.options.minimumCountColumns) {\n\t              $(item).prop('checked', visible);\n\t            }\n\t          });\n\t        }\n\n\t        if ($items.filter(':checked').length <= this.options.minimumCountColumns) {\n\t          $items.filter(':checked').prop('disabled', true);\n\t        }\n\t      }\n\t    }\n\t  }, {\n\t    key: \"mergeCells\",\n\t    value: function mergeCells(options) {\n\t      var row = options.index;\n\t      var col = this.getVisibleFields().indexOf(options.field);\n\t      var rowspan = options.rowspan || 1;\n\t      var colspan = options.colspan || 1;\n\t      var i;\n\t      var j;\n\t      var $tr = this.$body.find('>tr');\n\n\t      if (this.options.detailView && !this.options.cardView) {\n\t        col += 1;\n\t      }\n\n\t      var $td = $tr.eq(row).find('>td').eq(col);\n\n\t      if (row < 0 || col < 0 || row >= this.data.length) {\n\t        return;\n\t      }\n\n\t      for (i = row; i < row + rowspan; i++) {\n\t        for (j = col; j < col + colspan; j++) {\n\t          $tr.eq(i).find('>td').eq(j).hide();\n\t        }\n\t      }\n\n\t      $td.attr('rowspan', rowspan).attr('colspan', colspan).show();\n\t    }\n\t  }, {\n\t    key: \"checkAll\",\n\t    value: function checkAll() {\n\t      this._toggleCheckAll(true);\n\t    }\n\t  }, {\n\t    key: \"uncheckAll\",\n\t    value: function uncheckAll() {\n\t      this._toggleCheckAll(false);\n\t    }\n\t  }, {\n\t    key: \"_toggleCheckAll\",\n\t    value: function _toggleCheckAll(checked) {\n\t      var rowsBefore = this.getSelections();\n\t      this.$selectAll.add(this.$selectAll_).prop('checked', checked);\n\t      this.$selectItem.filter(':enabled').prop('checked', checked);\n\t      this.updateRows();\n\t      var rowsAfter = this.getSelections();\n\n\t      if (checked) {\n\t        this.trigger('check-all', rowsAfter, rowsBefore);\n\t        return;\n\t      }\n\n\t      this.trigger('uncheck-all', rowsAfter, rowsBefore);\n\t    }\n\t  }, {\n\t    key: \"checkInvert\",\n\t    value: function checkInvert() {\n\t      var $items = this.$selectItem.filter(':enabled');\n\t      var checked = $items.filter(':checked');\n\t      $items.each(function (i, el) {\n\t        $(el).prop('checked', !$(el).prop('checked'));\n\t      });\n\t      this.updateRows();\n\t      this.updateSelected();\n\t      this.trigger('uncheck-some', checked);\n\t      checked = this.getSelections();\n\t      this.trigger('check-some', checked);\n\t    }\n\t  }, {\n\t    key: \"check\",\n\t    value: function check(index) {\n\t      this._toggleCheck(true, index);\n\t    }\n\t  }, {\n\t    key: \"uncheck\",\n\t    value: function uncheck(index) {\n\t      this._toggleCheck(false, index);\n\t    }\n\t  }, {\n\t    key: \"_toggleCheck\",\n\t    value: function _toggleCheck(checked, index) {\n\t      var $el = this.$selectItem.filter(\"[data-index=\\\"\".concat(index, \"\\\"]\"));\n\t      var row = this.data[index];\n\n\t      if ($el.is(':radio') || this.options.singleSelect || this.options.multipleSelectRow && !this.multipleSelectRowCtrlKey && !this.multipleSelectRowShiftKey) {\n\t        var _iteratorNormalCompletion9 = true;\n\t        var _didIteratorError9 = false;\n\t        var _iteratorError9 = undefined;\n\n\t        try {\n\t          for (var _iterator9 = this.options.data[Symbol.iterator](), _step9; !(_iteratorNormalCompletion9 = (_step9 = _iterator9.next()).done); _iteratorNormalCompletion9 = true) {\n\t            var r = _step9.value;\n\t            r[this.header.stateField] = false;\n\t          }\n\t        } catch (err) {\n\t          _didIteratorError9 = true;\n\t          _iteratorError9 = err;\n\t        } finally {\n\t          try {\n\t            if (!_iteratorNormalCompletion9 && _iterator9.return != null) {\n\t              _iterator9.return();\n\t            }\n\t          } finally {\n\t            if (_didIteratorError9) {\n\t              throw _iteratorError9;\n\t            }\n\t          }\n\t        }\n\n\t        this.$selectItem.filter(':checked').not($el).prop('checked', false);\n\t      }\n\n\t      row[this.header.stateField] = checked;\n\n\t      if (this.options.multipleSelectRow) {\n\t        if (this.multipleSelectRowShiftKey && this.multipleSelectRowLastSelectedIndex >= 0) {\n\t          var indexes = [this.multipleSelectRowLastSelectedIndex, index].sort();\n\n\t          for (var i = indexes[0] + 1; i < indexes[1]; i++) {\n\t            this.data[i][this.header.stateField] = true;\n\t            this.$selectItem.filter(\"[data-index=\\\"\".concat(i, \"\\\"]\")).prop('checked', true);\n\t          }\n\t        }\n\n\t        this.multipleSelectRowCtrlKey = false;\n\t        this.multipleSelectRowShiftKey = false;\n\t        this.multipleSelectRowLastSelectedIndex = checked ? index : -1;\n\t      }\n\n\t      $el.prop('checked', checked);\n\t      this.updateSelected();\n\t      this.trigger(checked ? 'check' : 'uncheck', this.data[index], $el);\n\t    }\n\t  }, {\n\t    key: \"checkBy\",\n\t    value: function checkBy(obj) {\n\t      this._toggleCheckBy(true, obj);\n\t    }\n\t  }, {\n\t    key: \"uncheckBy\",\n\t    value: function uncheckBy(obj) {\n\t      this._toggleCheckBy(false, obj);\n\t    }\n\t  }, {\n\t    key: \"_toggleCheckBy\",\n\t    value: function _toggleCheckBy(checked, obj) {\n\t      var _this22 = this;\n\n\t      if (!obj.hasOwnProperty('field') || !obj.hasOwnProperty('values')) {\n\t        return;\n\t      }\n\n\t      var rows = [];\n\t      this.data.forEach(function (row, i) {\n\t        if (!row.hasOwnProperty(obj.field)) {\n\t          return false;\n\t        }\n\n\t        if (obj.values.includes(row[obj.field])) {\n\t          var $el = _this22.$selectItem.filter(':enabled').filter(Utils.sprintf('[data-index=\"%s\"]', i));\n\n\t          $el = checked ? $el.not(':checked') : $el.filter(':checked');\n\n\t          if (!$el.length) {\n\t            return;\n\t          }\n\n\t          $el.prop('checked', checked);\n\t          row[_this22.header.stateField] = checked;\n\t          rows.push(row);\n\n\t          _this22.trigger(checked ? 'check' : 'uncheck', row, $el);\n\t        }\n\t      });\n\t      this.updateSelected();\n\t      this.trigger(checked ? 'check-some' : 'uncheck-some', rows);\n\t    }\n\t  }, {\n\t    key: \"refresh\",\n\t    value: function refresh(params) {\n\t      if (params && params.url) {\n\t        this.options.url = params.url;\n\t      }\n\n\t      if (params && params.pageNumber) {\n\t        this.options.pageNumber = params.pageNumber;\n\t      }\n\n\t      if (params && params.pageSize) {\n\t        this.options.pageSize = params.pageSize;\n\t      }\n\n\t      this.trigger('refresh', this.initServer(params && params.silent, params && params.query, params && params.url));\n\t    }\n\t  }, {\n\t    key: \"destroy\",\n\t    value: function destroy() {\n\t      this.$el.insertBefore(this.$container);\n\t      $(this.options.toolbar).insertBefore(this.$el);\n\t      this.$container.next().remove();\n\t      this.$container.remove();\n\t      this.$el.html(this.$el_.html()).css('margin-top', '0').attr('class', this.$el_.attr('class') || ''); // reset the class\n\t    }\n\t  }, {\n\t    key: \"resetView\",\n\t    value: function resetView(params) {\n\t      var padding = 0;\n\n\t      if (params && params.height) {\n\t        this.options.height = params.height;\n\t      }\n\n\t      this.$selectAll.prop('checked', this.$selectItem.length > 0 && this.$selectItem.length === this.$selectItem.filter(':checked').length);\n\t      this.$tableContainer.toggleClass('has-card-view', this.options.cardView);\n\n\t      if (!this.options.cardView && this.options.showHeader && this.options.height) {\n\t        this.$tableHeader.show();\n\t        this.resetHeader();\n\t        padding += this.$header.outerHeight(true);\n\t      } else {\n\t        this.$tableHeader.hide();\n\t        this.trigger('post-header');\n\t      }\n\n\t      if (!this.options.cardView && this.options.showFooter) {\n\t        this.$tableFooter.show();\n\t        this.fitFooter();\n\n\t        if (this.options.height) {\n\t          padding += this.$tableFooter.outerHeight(true);\n\t        }\n\t      }\n\n\t      if (this.options.height) {\n\t        var toolbarHeight = this.$toolbar.outerHeight(true);\n\t        var paginationHeight = this.$pagination.outerHeight(true);\n\t        var height = this.options.height - toolbarHeight - paginationHeight;\n\t        var tableHeight = this.$tableBody.find('table').outerHeight(true);\n\t        this.$tableContainer.css('height', \"\".concat(height, \"px\"));\n\t        this.$tableBorder && this.$tableBorder.css('height', \"\".concat(height - tableHeight - padding - 1, \"px\"));\n\t      }\n\n\t      if (this.options.cardView) {\n\t        // remove the element css\n\t        this.$el.css('margin-top', '0');\n\t        this.$tableContainer.css('padding-bottom', '0');\n\t        this.$tableFooter.hide();\n\t      } else {\n\t        // Assign the correct sortable arrow\n\t        this.getCaret();\n\t        this.$tableContainer.css('padding-bottom', \"\".concat(padding, \"px\"));\n\t      }\n\n\t      this.trigger('reset-view');\n\t    }\n\t  }, {\n\t    key: \"resetWidth\",\n\t    value: function resetWidth() {\n\t      if (this.options.showHeader && this.options.height) {\n\t        this.fitHeader();\n\t      }\n\n\t      if (this.options.showFooter && !this.options.cardView) {\n\t        this.fitFooter();\n\t      }\n\t    }\n\t  }, {\n\t    key: \"showLoading\",\n\t    value: function showLoading() {\n\t      this.$tableLoading.css('display', 'flex');\n\t    }\n\t  }, {\n\t    key: \"hideLoading\",\n\t    value: function hideLoading() {\n\t      this.$tableLoading.css('display', 'none');\n\t    }\n\t  }, {\n\t    key: \"togglePagination\",\n\t    value: function togglePagination() {\n\t      this.options.pagination = !this.options.pagination;\n\t      var icon = this.options.showButtonIcons ? this.options.pagination ? this.options.icons.paginationSwitchDown : this.options.icons.paginationSwitchUp : '';\n\t      var text = this.options.showButtonText ? this.options.pagination ? this.options.formatPaginationSwitchUp() : this.options.formatPaginationSwitchDown() : '';\n\t      this.$toolbar.find('button[name=\"paginationSwitch\"]').html(Utils.sprintf(this.constants.html.icon, this.options.iconsPrefix, icon) + ' ' + text);\n\t      this.updatePagination();\n\t    }\n\t  }, {\n\t    key: \"toggleFullscreen\",\n\t    value: function toggleFullscreen() {\n\t      this.$el.closest('.bootstrap-table').toggleClass('fullscreen');\n\t      this.resetView();\n\t    }\n\t  }, {\n\t    key: \"toggleView\",\n\t    value: function toggleView() {\n\t      this.options.cardView = !this.options.cardView;\n\t      this.initHeader();\n\t      var icon = this.options.showButtonIcons ? this.options.cardView ? this.options.icons.toggleOn : this.options.icons.toggleOff : '';\n\t      var text = this.options.showButtonText ? this.options.cardView ? this.options.formatToggleOff() : this.options.formatToggleOn() : '';\n\t      this.$toolbar.find('button[name=\"toggle\"]').html(Utils.sprintf(this.constants.html.icon, this.options.iconsPrefix, icon) + ' ' + text);\n\t      this.initBody();\n\t      this.trigger('toggle', this.options.cardView);\n\t    }\n\t  }, {\n\t    key: \"resetSearch\",\n\t    value: function resetSearch(text) {\n\t      var $search = this.$toolbar.find('.search input');\n\t      $search.val(text || '');\n\t      this.onSearch({\n\t        currentTarget: $search\n\t      });\n\t    }\n\t  }, {\n\t    key: \"filterBy\",\n\t    value: function filterBy(columns, options) {\n\t      this.filterOptions = Utils.isEmptyObject(options) ? this.options.filterOptions : $.extend(this.options.filterOptions, options);\n\t      this.filterColumns = Utils.isEmptyObject(columns) ? {} : columns;\n\t      this.options.pageNumber = 1;\n\t      this.initSearch();\n\t      this.updatePagination();\n\t    }\n\t  }, {\n\t    key: \"scrollTo\",\n\t    value: function scrollTo(params) {\n\t      if (typeof params === 'undefined') {\n\t        return this.$tableBody.scrollTop();\n\t      }\n\n\t      var options = {\n\t        unit: 'px',\n\t        value: 0\n\t      };\n\n\t      if (_typeof(params) === 'object') {\n\t        options = Object.assign(options, params);\n\t      } else if (typeof params === 'string' && params === 'bottom') {\n\t        options.value = this.$tableBody[0].scrollHeight;\n\t      } else if (typeof params === 'string') {\n\t        options.value = params;\n\t      }\n\n\t      var scrollTo = options.value;\n\n\t      if (options.unit === 'rows') {\n\t        scrollTo = 0;\n\t        this.$body.find(\"> tr:lt(\".concat(options.value, \")\")).each(function (i, el) {\n\t          scrollTo += $(el).outerHeight(true);\n\t        });\n\t      }\n\n\t      this.$tableBody.scrollTop(scrollTo);\n\t    }\n\t  }, {\n\t    key: \"getScrollPosition\",\n\t    value: function getScrollPosition() {\n\t      return this.scrollTo();\n\t    }\n\t  }, {\n\t    key: \"selectPage\",\n\t    value: function selectPage(page) {\n\t      if (page > 0 && page <= this.options.totalPages) {\n\t        this.options.pageNumber = page;\n\t        this.updatePagination();\n\t      }\n\t    }\n\t  }, {\n\t    key: \"prevPage\",\n\t    value: function prevPage() {\n\t      if (this.options.pageNumber > 1) {\n\t        this.options.pageNumber--;\n\t        this.updatePagination();\n\t      }\n\t    }\n\t  }, {\n\t    key: \"nextPage\",\n\t    value: function nextPage() {\n\t      if (this.options.pageNumber < this.options.totalPages) {\n\t        this.options.pageNumber++;\n\t        this.updatePagination();\n\t      }\n\t    }\n\t  }, {\n\t    key: \"toggleDetailView\",\n\t    value: function toggleDetailView(index, _columnDetailFormatter) {\n\t      var $tr = this.$body.find(Utils.sprintf('> tr[data-index=\"%s\"]', index));\n\n\t      if ($tr.next().is('tr.detail-view')) {\n\t        this.collapseRow(index);\n\t      } else {\n\t        this.expandRow(index, _columnDetailFormatter);\n\t      }\n\n\t      this.resetView();\n\t    }\n\t  }, {\n\t    key: \"expandRow\",\n\t    value: function expandRow(index, _columnDetailFormatter) {\n\t      var row = this.data[index];\n\t      var $tr = this.$body.find(Utils.sprintf('> tr[data-index=\"%s\"][data-has-detail-view]', index));\n\n\t      if ($tr.next().is('tr.detail-view')) {\n\t        return;\n\t      }\n\n\t      if (this.options.detailViewIcon) {\n\t        $tr.find('a.detail-icon').html(Utils.sprintf(this.constants.html.icon, this.options.iconsPrefix, this.options.icons.detailClose));\n\t      }\n\n\t      $tr.after(Utils.sprintf('<tr class=\"detail-view\"><td colspan=\"%s\"></td></tr>', $tr.children('td').length));\n\t      var $element = $tr.next().find('td');\n\t      var detailFormatter = _columnDetailFormatter || this.options.detailFormatter;\n\t      var content = Utils.calculateObjectValue(this.options, detailFormatter, [index, row, $element], '');\n\n\t      if ($element.length === 1) {\n\t        $element.append(content);\n\t      }\n\n\t      this.trigger('expand-row', index, row, $element);\n\t    }\n\t  }, {\n\t    key: \"collapseRow\",\n\t    value: function collapseRow(index) {\n\t      var row = this.data[index];\n\t      var $tr = this.$body.find(Utils.sprintf('> tr[data-index=\"%s\"][data-has-detail-view]', index));\n\n\t      if (!$tr.next().is('tr.detail-view')) {\n\t        return;\n\t      }\n\n\t      if (this.options.detailViewIcon) {\n\t        $tr.find('a.detail-icon').html(Utils.sprintf(this.constants.html.icon, this.options.iconsPrefix, this.options.icons.detailOpen));\n\t      }\n\n\t      this.trigger('collapse-row', index, row, $tr.next());\n\t      $tr.next().remove();\n\t    }\n\t  }, {\n\t    key: \"expandAllRows\",\n\t    value: function expandAllRows() {\n\t      var trs = this.$body.find('> tr[data-index][data-has-detail-view]');\n\n\t      for (var i = 0; i < trs.length; i++) {\n\t        this.expandRow($(trs[i]).data('index'));\n\t      }\n\t    }\n\t  }, {\n\t    key: \"collapseAllRows\",\n\t    value: function collapseAllRows() {\n\t      var trs = this.$body.find('> tr[data-index][data-has-detail-view]');\n\n\t      for (var i = 0; i < trs.length; i++) {\n\t        this.collapseRow($(trs[i]).data('index'));\n\t      }\n\t    }\n\t  }, {\n\t    key: \"updateColumnTitle\",\n\t    value: function updateColumnTitle(params) {\n\t      if (!params.hasOwnProperty('field') || !params.hasOwnProperty('title')) {\n\t        return;\n\t      }\n\n\t      this.columns[this.fieldsColumnsIndex[params.field]].title = this.options.escape ? Utils.escapeHTML(params.title) : params.title;\n\n\t      if (this.columns[this.fieldsColumnsIndex[params.field]].visible) {\n\t        var header = this.options.height !== undefined ? this.$tableHeader : this.$header;\n\t        header.find('th[data-field]').each(function (i, el) {\n\t          if ($(el).data('field') === params.field) {\n\t            $($(el).find('.th-inner')[0]).text(params.title);\n\t            return false;\n\t          }\n\t        });\n\t      }\n\t    }\n\t  }, {\n\t    key: \"updateFormatText\",\n\t    value: function updateFormatText(formatName, text) {\n\t      if (!/^format/.test(formatName) || !this.options[formatName]) {\n\t        return;\n\t      }\n\n\t      if (typeof text === 'string') {\n\t        this.options[formatName] = function () {\n\t          return text;\n\t        };\n\t      } else if (typeof text === 'function') {\n\t        this.options[formatName] = text;\n\t      }\n\n\t      this.initToolbar();\n\t      this.initPagination();\n\t      this.initBody();\n\t    }\n\t  }]);\n\n\t  return BootstrapTable;\n\t}();\n\n\tBootstrapTable.VERSION = Constants.VERSION;\n\tBootstrapTable.DEFAULTS = Constants.DEFAULTS;\n\tBootstrapTable.LOCALES = Constants.LOCALES;\n\tBootstrapTable.COLUMN_DEFAULTS = Constants.COLUMN_DEFAULTS;\n\tBootstrapTable.METHODS = Constants.METHODS;\n\tBootstrapTable.EVENTS = Constants.EVENTS; // BOOTSTRAP TABLE PLUGIN DEFINITION\n\t// =======================\n\n\t$.BootstrapTable = BootstrapTable;\n\n\t$.fn.bootstrapTable = function (option) {\n\t  for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key3 = 1; _key3 < _len2; _key3++) {\n\t    args[_key3 - 1] = arguments[_key3];\n\t  }\n\n\t  var value;\n\t  this.each(function (i, el) {\n\t    var data = $(el).data('bootstrap.table');\n\t    var options = $.extend({}, BootstrapTable.DEFAULTS, $(el).data(), _typeof(option) === 'object' && option);\n\n\t    if (typeof option === 'string') {\n\t      var _data2;\n\n\t      if (!Constants.METHODS.includes(option)) {\n\t        throw new Error(\"Unknown method: \".concat(option));\n\t      }\n\n\t      if (!data) {\n\t        return;\n\t      }\n\n\t      value = (_data2 = data)[option].apply(_data2, args);\n\n\t      if (option === 'destroy') {\n\t        $(el).removeData('bootstrap.table');\n\t      }\n\t    }\n\n\t    if (!data) {\n\t      $(el).data('bootstrap.table', data = new $.BootstrapTable(el, options));\n\t    }\n\t  });\n\t  return typeof value === 'undefined' ? this : value;\n\t};\n\n\t$.fn.bootstrapTable.Constructor = BootstrapTable;\n\t$.fn.bootstrapTable.theme = Constants.THEME;\n\t$.fn.bootstrapTable.VERSION = Constants.VERSION;\n\t$.fn.bootstrapTable.defaults = BootstrapTable.DEFAULTS;\n\t$.fn.bootstrapTable.columnDefaults = BootstrapTable.COLUMN_DEFAULTS;\n\t$.fn.bootstrapTable.events = BootstrapTable.EVENTS;\n\t$.fn.bootstrapTable.locales = BootstrapTable.LOCALES;\n\t$.fn.bootstrapTable.methods = BootstrapTable.METHODS;\n\t$.fn.bootstrapTable.utils = Utils; // BOOTSTRAP TABLE INIT\n\t// =======================\n\n\t$(function () {\n\t  $('[data-toggle=\"table\"]').bootstrapTable();\n\t});\n\n\treturn BootstrapTable;\n\n}));\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bootstrap-table/bootstrap-table.min.css",
    "content": "/**\n  * bootstrap-table - An extended table to integration with some of the most widely used CSS frameworks. (Supports Bootstrap, Semantic UI, Bulma, Material Design, Foundation)\n  *\n  * @version v1.15.4\n  * @homepage https://bootstrap-table.com\n  * @author wenzhixin <wenzhixin2010@gmail.com> (http://wenzhixin.net.cn/)\n  * @license MIT\n  */\n\n@charset \"UTF-8\";.bootstrap-table .fixed-table-toolbar::after{content:\"\";display:block;clear:both}.bootstrap-table .fixed-table-toolbar .bs-bars,.bootstrap-table .fixed-table-toolbar .search,.bootstrap-table .fixed-table-toolbar .columns{position:relative;margin-top:10px;margin-bottom:10px}.bootstrap-table .fixed-table-toolbar .columns .btn-group>.btn-group{display:inline-block;margin-left:-1px!important}.bootstrap-table .fixed-table-toolbar .columns .btn-group>.btn-group>.btn{border-radius:0}.bootstrap-table .fixed-table-toolbar .columns .btn-group>.btn-group:first-child>.btn{border-top-left-radius:4px;border-bottom-left-radius:4px}.bootstrap-table .fixed-table-toolbar .columns .btn-group>.btn-group:last-child>.btn{border-top-right-radius:4px;border-bottom-right-radius:4px}.bootstrap-table .fixed-table-toolbar .columns .dropdown-menu{text-align:left;max-height:300px;overflow:auto;-ms-overflow-style:scrollbar;z-index:1001}.bootstrap-table .fixed-table-toolbar .columns label{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.428571429}.bootstrap-table .fixed-table-toolbar .columns-left{margin-right:5px}.bootstrap-table .fixed-table-toolbar .columns-right{margin-left:5px}.bootstrap-table .fixed-table-toolbar .pull-right .dropdown-menu{right:0;left:auto}.bootstrap-table .fixed-table-container{position:relative;clear:both}.bootstrap-table .fixed-table-container .table{width:100%;margin-bottom:0!important}.bootstrap-table .fixed-table-container .table th,.bootstrap-table .fixed-table-container .table td{vertical-align:middle;box-sizing:border-box}.bootstrap-table .fixed-table-container .table thead th{vertical-align:bottom;padding:0;margin:0}.bootstrap-table .fixed-table-container .table thead th:focus{outline:0 solid transparent}.bootstrap-table .fixed-table-container .table thead th.detail{width:30px}.bootstrap-table .fixed-table-container .table thead th .th-inner{padding:.75rem;vertical-align:bottom;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bootstrap-table .fixed-table-container .table thead th .sortable{cursor:pointer;background-position:right;background-repeat:no-repeat;padding-right:30px}.bootstrap-table .fixed-table-container .table thead th .both{background-image:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7X QMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC\")}.bootstrap-table .fixed-table-container .table thead th .asc{background-image:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg==\")}.bootstrap-table .fixed-table-container .table thead th .desc{background-image:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII= \")}.bootstrap-table .fixed-table-container .table tbody tr.selected td{background-color:rgba(0,0,0,0.075)}.bootstrap-table .fixed-table-container .table tbody tr.no-records-found{text-align:center}.bootstrap-table .fixed-table-container .table tbody tr .card-view{display:flex}.bootstrap-table .fixed-table-container .table tbody tr .card-view .card-view-title{font-weight:bold;display:inline-block;min-width:30%;text-align:left!important}.bootstrap-table .fixed-table-container .table .bs-checkbox{text-align:center}.bootstrap-table .fixed-table-container .table .bs-checkbox label{margin-bottom:0}.bootstrap-table .fixed-table-container .table input[type=radio],.bootstrap-table .fixed-table-container .table input[type=checkbox]{margin:0 auto!important}.bootstrap-table .fixed-table-container .table.table-sm .th-inner{padding:.3rem}.bootstrap-table .fixed-table-container.fixed-height:not(.has-footer){border-bottom:1px solid #dee2e6}.bootstrap-table .fixed-table-container.fixed-height.has-card-view{border-top:1px solid #dee2e6;border-bottom:1px solid #dee2e6}.bootstrap-table .fixed-table-container.fixed-height .fixed-table-border{border-left:1px solid #dee2e6;border-right:1px solid #dee2e6}.bootstrap-table .fixed-table-container.fixed-height .table thead th{border-bottom:1px solid #dee2e6}.bootstrap-table .fixed-table-container.fixed-height .table-dark thead th{border-bottom:1px solid #32383e}.bootstrap-table .fixed-table-container .fixed-table-header{overflow:hidden}.bootstrap-table .fixed-table-container .fixed-table-body{overflow-x:auto;overflow-y:auto;height:100%}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading{align-items:center;background:#fff;display:none;justify-content:center;position:absolute;bottom:0;width:100%;z-index:1000}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap{align-items:baseline;display:flex;justify-content:center}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .loading-text{font-size:2rem;margin-right:6px}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .animation-wrap{align-items:center;display:flex;justify-content:center}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .animation-dot,.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .animation-wrap::after,.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .animation-wrap::before{content:\"\";animation-duration:1.5s;animation-iteration-count:infinite;animation-name:LOADING;background:#212529;border-radius:50%;display:block;height:5px;margin:0 4px;opacity:0;width:5px}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .animation-dot{animation-delay:.3s}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .animation-wrap::after{animation-delay:.6s}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading.table-dark{background:#212529}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading.table-dark .animation-dot,.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading.table-dark .animation-wrap::after,.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading.table-dark .animation-wrap::before{background:#fff}.bootstrap-table .fixed-table-container .fixed-table-footer{overflow:hidden}.bootstrap-table .fixed-table-pagination::after{content:\"\";display:block;clear:both}.bootstrap-table .fixed-table-pagination>.pagination-detail,.bootstrap-table .fixed-table-pagination>.pagination{margin-top:10px;margin-bottom:10px}.bootstrap-table .fixed-table-pagination>.pagination-detail .pagination-info{line-height:34px;margin-right:5px}.bootstrap-table .fixed-table-pagination>.pagination-detail .page-list{display:inline-block}.bootstrap-table .fixed-table-pagination>.pagination-detail .page-list .btn-group{position:relative;display:inline-block;vertical-align:middle}.bootstrap-table .fixed-table-pagination>.pagination-detail .page-list .btn-group .dropdown-menu{margin-bottom:0}.bootstrap-table .fixed-table-pagination>.pagination ul.pagination{margin:0}.bootstrap-table .fixed-table-pagination>.pagination ul.pagination a{padding:6px 12px;line-height:1.428571429}.bootstrap-table .fixed-table-pagination>.pagination ul.pagination li.page-intermediate a{color:#c8c8c8}.bootstrap-table .fixed-table-pagination>.pagination ul.pagination li.page-intermediate a::before{content:\"⬅\"}.bootstrap-table .fixed-table-pagination>.pagination ul.pagination li.page-intermediate a::after{content:\"➡\"}.bootstrap-table .fixed-table-pagination>.pagination ul.pagination li.disabled a{pointer-events:none;cursor:default}.bootstrap-table.fullscreen{position:fixed;top:0;left:0;z-index:1050;width:100%!important;background:#fff;height:calc(100vh);overflow-y:scroll}div.fixed-table-scroll-inner{width:100%;height:200px}div.fixed-table-scroll-outer{top:0;left:0;visibility:hidden;width:200px;height:150px;overflow:hidden}@keyframes LOADING{0%{opacity:0}50%{opacity:1}to{opacity:0}}"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bootstrap-table/bootstrap-table.min.js",
    "content": "/**\n  * bootstrap-table - An extended table to integration with some of the most widely used CSS frameworks. (Supports Bootstrap, Semantic UI, Bulma, Material Design, Foundation)\n  *\n  * @version v1.15.4\n  * @homepage https://bootstrap-table.com\n  * @author wenzhixin <wenzhixin2010@gmail.com> (http://wenzhixin.net.cn/)\n  * @license MIT\n  */\n\n(function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t(require(\"jquery\")):\"function\"==typeof define&&define.amd?define([\"jquery\"],t):(e=e||self,e.BootstrapTable=t(e.jQuery))})(this,function(t){'use strict';var m=String.prototype,b=Math.max,y=Math.min,w=Math.floor,v=Math.ceil;function e(e,t){return t={exports:{}},e(t,t.exports),t.exports}function n(e){return n=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},n(e)}function a(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function i(e,t){for(var o,n=0;n<t.length;n++)o=t[n],o.enumerable=o.enumerable||!1,o.configurable=!0,\"value\"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}function s(e,t,o){return t&&i(e.prototype,t),o&&i(e,o),e}function l(e,t){return d(e)||u(e,t)||g()}function r(e){return c(e)||p(e)||h()}function c(e){if(Array.isArray(e)){for(var t=0,o=Array(e.length);t<e.length;t++)o[t]=e[t];return o}}function d(e){if(Array.isArray(e))return e}function p(e){if(Symbol.iterator in Object(e)||\"[object Arguments]\"===Object.prototype.toString.call(e))return Array.from(e)}function u(e,t){var o=[],n=!0,a=!1,i=void 0;try{for(var s,l=e[Symbol.iterator]();!(n=(s=l.next()).done)&&(o.push(s.value),!(t&&o.length===t));n=!0);}catch(e){a=!0,i=e}finally{try{n||null==l[\"return\"]||l[\"return\"]()}finally{if(a)throw i}}return o}function h(){throw new TypeError(\"Invalid attempt to spread non-iterable instance\")}function g(){throw new TypeError(\"Invalid attempt to destructure non-iterable instance\")}t=t&&t.hasOwnProperty(\"default\")?t[\"default\"]:t;var S,x,k,T=\"undefined\"==typeof globalThis?\"undefined\"==typeof window?\"undefined\"==typeof global?\"undefined\"==typeof self?{}:self:global:window:globalThis,P=\"object\",o=function(e){return e&&e.Math==Math&&e},C=o(typeof globalThis==P&&globalThis)||o(typeof window==P&&window)||o(typeof self==P&&self)||o(typeof T==P&&T)||Function(\"return this\")(),I=function(e){try{return!!e()}catch(e){return!0}},A=!I(function(){return 7!=Object.defineProperty({},\"a\",{get:function(){return 7}}).a}),E={}.propertyIsEnumerable,R=Object.getOwnPropertyDescriptor,_=R&&!E.call({1:2},1),N=_?function(e){var t=R(this,e);return!!t&&t.enumerable}:E,f={f:N},F=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},D={}.toString,L=function(e){return D.call(e).slice(8,-1)},B=\"\".split,V=I(function(){return!Object(\"z\").propertyIsEnumerable(0)})?function(e){return\"String\"==L(e)?B.call(e,\"\"):Object(e)}:Object,H=function(e){if(null==e)throw TypeError(\"Can't call method on \"+e);return e},M=function(e){return V(H(e))},U=function(e){return\"object\"==typeof e?null!==e:\"function\"==typeof e},q=function(e,t){if(!U(e))return e;var o,n;if(t&&\"function\"==typeof(o=e.toString)&&!U(n=o.call(e)))return n;if(\"function\"==typeof(o=e.valueOf)&&!U(n=o.call(e)))return n;if(!t&&\"function\"==typeof(o=e.toString)&&!U(n=o.call(e)))return n;throw TypeError(\"Can't convert object to primitive value\")},z={}.hasOwnProperty,G=function(e,t){return z.call(e,t)},W=C.document,Y=U(W)&&U(W.createElement),K=function(e){return Y?W.createElement(e):{}},X=!A&&!I(function(){return 7!=Object.defineProperty(K(\"div\"),\"a\",{get:function(){return 7}}).a}),Q=Object.getOwnPropertyDescriptor,J=A?Q:function(e,t){if(e=M(e),t=q(t,!0),X)try{return Q(e,t)}catch(e){}return G(e,t)?F(!f.f.call(e,t),e[t]):void 0},Z={f:J},ee=function(e){if(!U(e))throw TypeError(e+\" is not an object\");return e},te=Object.defineProperty,oe=A?te:function(e,t,o){if(ee(e),t=q(t,!0),ee(o),X)try{return te(e,t,o)}catch(e){}if(\"get\"in o||\"set\"in o)throw TypeError(\"Accessors not supported\");return\"value\"in o&&(e[t]=o.value),e},ne={f:oe},ae=A?function(e,t,o){return ne.f(e,t,F(1,o))}:function(e,t,o){return e[t]=o,e},ie=function(e,t){try{ae(C,e,t)}catch(o){C[e]=t}return t},se=e(function(e){var t=C[\"__core-js_shared__\"]||ie(\"__core-js_shared__\",{});(e.exports=function(e,o){return t[e]||(t[e]=void 0===o?{}:o)})(\"versions\",[]).push({version:\"3.1.3\",mode:\"global\",copyright:\"\\xA9 2019 Denis Pushkarev (zloirock.ru)\"})}),le=se(\"native-function-to-string\",Function.toString),re=C.WeakMap,ce=\"function\"==typeof re&&/native code/.test(le.call(re)),de=0,O=Math.random(),pe=function(e){return\"Symbol(\"+((void 0===e?\"\":e)+\")_\")+(++de+O).toString(36)},ue=se(\"keys\"),he=function(e){return ue[e]||(ue[e]=pe(e))},ge={},fe=C.WeakMap,me=function(e){return k(e)?x(e):S(e,{})};if(ce){var be=new fe,ye=be.get,we=be.has,ve=be.set;S=function(e,t){return ve.call(be,e,t),t},x=function(e){return ye.call(be,e)||{}},k=function(e){return we.call(be,e)}}else{var Se=he(\"state\");ge[Se]=!0,S=function(e,t){return ae(e,Se,t),t},x=function(e){return G(e,Se)?e[Se]:{}},k=function(e){return G(e,Se)}}var xe={set:S,get:x,has:k,enforce:me,getterFor:function(e){return function(t){var o;if(!U(t)||(o=x(t)).type!==e)throw TypeError(\"Incompatible receiver, \"+e+\" required\");return o}}},ke=e(function(e){var t=xe.get,o=xe.enforce,n=(le+\"\").split(\"toString\");se(\"inspectSource\",function(e){return le.call(e)}),(e.exports=function(e,t,a,i){var s=!!i&&!!i.unsafe,l=!!i&&!!i.enumerable,r=!!i&&!!i.noTargetGet;return(\"function\"==typeof a&&(\"string\"==typeof t&&!G(a,\"name\")&&ae(a,\"name\",t),o(a).source=n.join(\"string\"==typeof t?t:\"\")),e===C)?void(l?e[t]=a:ie(t,a)):void(s?!r&&e[t]&&(l=!0):delete e[t],l?e[t]=a:ae(e,t,a))})(Function.prototype,\"toString\",function(){return\"function\"==typeof this&&t(this).source||le.call(this)})}),Te=C,Pe=function(e){return\"function\"==typeof e?e:void 0},Oe=function(e,t){return 2>arguments.length?Pe(Te[e])||Pe(C[e]):Te[e]&&Te[e][t]||C[e]&&C[e][t]},Ce=function(e){return isNaN(e=+e)?0:(0<e?w:v)(e)},Ie=function(e){return 0<e?y(Ce(e),9007199254740991):0},$e=function(e,t){var o=Ce(e);return 0>o?b(o+t,0):y(o,t)},Ae=function(e){return function(t,o,n){var a,i=M(t),s=Ie(i.length),l=$e(n,s);if(e&&o!=o){for(;s>l;)if(a=i[l++],a!=a)return!0;}else for(;s>l;l++)if((e||l in i)&&i[l]===o)return e||l||0;return!e&&-1}},Ee={includes:Ae(!0),indexOf:Ae(!1)},Re=Ee.indexOf,_e=function(e,t){var o,n=M(e),a=0,s=[];for(o in n)!G(ge,o)&&G(n,o)&&s.push(o);for(;t.length>a;)G(n,o=t[a++])&&(~Re(s,o)||s.push(o));return s},Ne=[\"constructor\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"toLocaleString\",\"toString\",\"valueOf\"],Fe=Ne.concat(\"length\",\"prototype\"),De=Object.getOwnPropertyNames||function(e){return _e(e,Fe)},Le={f:De},Be=Object.getOwnPropertySymbols,Ve={f:Be},He=Oe(\"Reflect\",\"ownKeys\")||function(e){var t=Le.f(ee(e)),o=Ve.f;return o?t.concat(o(e)):t},je=function(e,t){for(var o,n=He(t),a=ne.f,s=Z.f,l=0;l<n.length;l++)o=n[l],G(e,o)||a(e,o,s(t,o))},Me=/#|\\.prototype\\./,Ue=function(e,t){var o=ze[qe(e)];return o==We||o!=Ge&&(\"function\"==typeof t?I(t):!!t)},qe=Ue.normalize=function(e){return(e+\"\").replace(Me,\".\").toLowerCase()},ze=Ue.data={},Ge=Ue.NATIVE=\"N\",We=Ue.POLYFILL=\"P\",Ye=Ue,Ke=Z.f,Xe=function(e,t){var o,n,a,i,s,l,r=e.target,c=e.global,d=e.stat;if(n=c?C:d?C[r]||ie(r,{}):(C[r]||{}).prototype,n)for(a in t){if(s=t[a],e.noTargetGet?(l=Ke(n,a),i=l&&l.value):i=n[a],o=Ye(c?a:r+(d?\".\":\"#\")+a,e.forced),!o&&void 0!==i){if(typeof s==typeof i)continue;je(s,i)}(e.sham||i&&i.sham)&&ae(s,\"sham\",!0),ke(n,a,s,e)}},Qe=!!Object.getOwnPropertySymbols&&!I(function(){return!(Symbol()+\"\")}),Je=Array.isArray||function(e){return\"Array\"==L(e)},Ze=function(e){return Object(H(e))},et=Object.keys||function(e){return _e(e,Ne)},tt=A?Object.defineProperties:function(e,t){ee(e);for(var o,n=et(t),a=n.length,i=0;a>i;)ne.f(e,o=n[i++],t[o]);return e},ot=Oe(\"document\",\"documentElement\"),nt=he(\"IE_PROTO\"),at=\"prototype\",it=function(){},st=function(){var e,t=K(\"iframe\"),o=Ne.length,n=\"<\",a=\"script\",i=\">\";for(t.style.display=\"none\",ot.appendChild(t),t.src=\"java\"+a+\":\"+\"\",e=t.contentWindow.document,e.open(),e.write(n+a+i+\"document.F=Object\"+n+\"/\"+a+i),e.close(),st=e.F;o--;)delete st[at][Ne[o]];return st()},lt=Object.create||function(e,t){var o;return null===e?o=st():(it[at]=ee(e),o=new it,it[at]=null,o[nt]=e),void 0===t?o:tt(o,t)};ge[nt]=!0;var rt=Le.f,ct={}.toString,dt=\"object\"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],pt=function(e){try{return rt(e)}catch(e){return dt.slice()}},ut={f:function(e){return dt&&\"[object Window]\"==ct.call(e)?pt(e):rt(M(e))}},ht=C.Symbol,gt=se(\"wks\"),ft=function(e){return gt[e]||(gt[e]=Qe&&ht[e]||(Qe?ht:pe)(\"Symbol.\"+e))},mt={f:ft},bt=ne.f,yt=function(e){var t=Te.Symbol||(Te.Symbol={});G(t,e)||bt(t,e,{value:mt.f(e)})},wt=ne.f,vt=ft(\"toStringTag\"),St=function(e,t,o){e&&!G(e=o?e:e.prototype,vt)&&wt(e,vt,{configurable:!0,value:t})},xt=function(e){if(\"function\"!=typeof e)throw TypeError(e+\" is not a function\");return e},kt=function(e,t,o){return(xt(e),void 0===t)?e:0===o?function(){return e.call(t)}:1===o?function(o){return e.call(t,o)}:2===o?function(o,n){return e.call(t,o,n)}:3===o?function(o,n,a){return e.call(t,o,n,a)}:function(){return e.apply(t,arguments)}},Tt=ft(\"species\"),Pt=function(e,t){var o;return Je(e)&&(o=e.constructor,\"function\"==typeof o&&(o===Array||Je(o.prototype))?o=void 0:U(o)&&(o=o[Tt],null===o&&(o=void 0))),new(void 0===o?Array:o)(0===t?0:t)},Ot=[].push,Ct=function(e){var t=1==e,o=4==e,n=6==e;return function(a,i,s,l){for(var r,c,d=Ze(a),p=V(d),u=kt(i,s,3),h=Ie(p.length),g=0,f=l||Pt,m=t?f(a,h):2==e?f(a,0):void 0;h>g;g++)if((5==e||n||g in p)&&(r=p[g],c=u(r,g,d),e))if(t)m[g]=c;else if(c)switch(e){case 3:return!0;case 5:return r;case 6:return g;case 2:Ot.call(m,r);}else if(o)return!1;return n?-1:3==e||o?o:m}},It={forEach:Ct(0),map:Ct(1),filter:Ct(2),some:Ct(3),every:Ct(4),find:Ct(5),findIndex:Ct(6)},$t=It.forEach,At=he(\"hidden\"),Et=\"Symbol\",Rt=\"prototype\",_t=ft(\"toPrimitive\"),Nt=xe.set,Ft=xe.getterFor(Et),Dt=Object[Rt],Lt=C.Symbol,Bt=C.JSON,Vt=Bt&&Bt.stringify,Ht=Z.f,jt=ne.f,Mt=ut.f,Ut=f.f,qt=se(\"symbols\"),zt=se(\"op-symbols\"),Gt=se(\"string-to-symbol-registry\"),Wt=se(\"symbol-to-string-registry\"),Yt=se(\"wks\"),Kt=C.QObject,Xt=!Kt||!Kt[Rt]||!Kt[Rt].findChild,Qt=A&&I(function(){return 7!=lt(jt({},\"a\",{get:function(){return jt(this,\"a\",{value:7}).a}})).a})?function(e,t,o){var n=Ht(Dt,t);n&&delete Dt[t],jt(e,t,o),n&&e!==Dt&&jt(Dt,t,n)}:jt,Jt=function(e,t){var o=qt[e]=lt(Lt[Rt]);return Nt(o,{type:Et,tag:e,description:t}),A||(o.description=t),o},Zt=Qe&&\"symbol\"==typeof Lt.iterator?function(e){return\"symbol\"==typeof e}:function(e){return Object(e)instanceof Lt},eo=function(e,t,o){e===Dt&&eo(zt,t,o),ee(e);var n=q(t,!0);return ee(o),G(qt,n)?(o.enumerable?(G(e,At)&&e[At][n]&&(e[At][n]=!1),o=lt(o,{enumerable:F(0,!1)})):(!G(e,At)&&jt(e,At,F(1,{})),e[At][n]=!0),Qt(e,n,o)):jt(e,n,o)},to=function(e,t){ee(e);var o=M(t),n=et(o).concat(io(o));return $t(n,function(t){(!A||oo.call(o,t))&&eo(e,t,o[t])}),e},oo=function(e){var t=q(e,!0),o=Ut.call(this,t);return(this!==Dt||!G(qt,t)||G(zt,t))&&(!(o||!G(this,t)||!G(qt,t)||G(this,At)&&this[At][t])||o)},no=function(e,t){var o=M(e),n=q(t,!0);if(o!==Dt||!G(qt,n)||G(zt,n)){var a=Ht(o,n);return a&&G(qt,n)&&!(G(o,At)&&o[At][n])&&(a.enumerable=!0),a}},ao=function(e){var t=Mt(M(e)),o=[];return $t(t,function(e){G(qt,e)||G(ge,e)||o.push(e)}),o},io=function(e){var t=e===Dt,o=Mt(t?zt:M(e)),n=[];return $t(o,function(e){G(qt,e)&&(!t||G(Dt,e))&&n.push(qt[e])}),n};Qe||(Lt=function(){if(this instanceof Lt)throw TypeError(\"Symbol is not a constructor\");var e=arguments.length&&void 0!==arguments[0]?arguments[0]+\"\":void 0,t=pe(e),o=function(e){this===Dt&&o.call(zt,e),G(this,At)&&G(this[At],t)&&(this[At][t]=!1),Qt(this,t,F(1,e))};return A&&Xt&&Qt(Dt,t,{configurable:!0,set:o}),Jt(t,e)},ke(Lt[Rt],\"toString\",function(){return Ft(this).tag}),f.f=oo,ne.f=eo,Z.f=no,Le.f=ut.f=ao,Ve.f=io,A&&(jt(Lt[Rt],\"description\",{configurable:!0,get:function(){return Ft(this).description}}),ke(Dt,\"propertyIsEnumerable\",oo,{unsafe:!0})),mt.f=function(e){return Jt(ft(e),e)}),Xe({global:!0,wrap:!0,forced:!Qe,sham:!Qe},{Symbol:Lt}),$t(et(Yt),function(e){yt(e)}),Xe({target:Et,stat:!0,forced:!Qe},{for:function(e){var t=e+\"\";if(G(Gt,t))return Gt[t];var o=Lt(t);return Gt[t]=o,Wt[o]=t,o},keyFor:function(e){if(!Zt(e))throw TypeError(e+\" is not a symbol\");return G(Wt,e)?Wt[e]:void 0},useSetter:function(){Xt=!0},useSimple:function(){Xt=!1}}),Xe({target:\"Object\",stat:!0,forced:!Qe,sham:!A},{create:function(e,t){return void 0===t?lt(e):to(lt(e),t)},defineProperty:eo,defineProperties:to,getOwnPropertyDescriptor:no}),Xe({target:\"Object\",stat:!0,forced:!Qe},{getOwnPropertyNames:ao,getOwnPropertySymbols:io}),Xe({target:\"Object\",stat:!0,forced:I(function(){Ve.f(1)})},{getOwnPropertySymbols:function(e){return Ve.f(Ze(e))}}),Bt&&Xe({target:\"JSON\",stat:!0,forced:!Qe||I(function(){var e=Lt();return\"[null]\"!=Vt([e])||\"{}\"!=Vt({a:e})||\"{}\"!=Vt(Object(e))})},{stringify:function(e){for(var t,o,n=[e],a=1;arguments.length>a;)n.push(arguments[a++]);if(o=t=n[1],(U(t)||void 0!==e)&&!Zt(e))return Je(t)||(t=function(e,t){if(\"function\"==typeof o&&(t=o.call(this,e,t)),!Zt(t))return t}),n[1]=t,Vt.apply(Bt,n)}}),Lt[Rt][_t]||ae(Lt[Rt],_t,Lt[Rt].valueOf),St(Lt,Et),ge[At]=!0;var so=ne.f,lo=C.Symbol;if(A&&\"function\"==typeof lo&&(!(\"description\"in lo.prototype)||void 0!==lo().description)){var ro={},co=function(){var e=1>arguments.length||void 0===arguments[0]?void 0:arguments[0]+\"\",t=this instanceof co?new lo(e):void 0===e?lo():lo(e);return\"\"===e&&(ro[t]=!0),t};je(co,lo);var po=co.prototype=lo.prototype;po.constructor=co;var uo=po.toString,ho=\"Symbol(test)\"==lo(\"test\")+\"\",go=/^Symbol\\((.*)\\)[^)]+$/;so(po,\"description\",{configurable:!0,get:function(){var e=U(this)?this.valueOf():this,t=uo.call(e);if(G(ro,e))return\"\";var o=ho?t.slice(7,-1):t.replace(go,\"$1\");return\"\"===o?void 0:o}}),Xe({global:!0,forced:!0},{Symbol:co})}yt(\"iterator\");var fo=function(e,t,o){var n=q(t);n in e?ne.f(e,n,F(0,o)):e[n]=o},mo=ft(\"species\"),bo=function(e){return!I(function(){var t=[],o=t.constructor={};return o[mo]=function(){return{foo:1}},1!==t[e](Boolean).foo})},yo=ft(\"isConcatSpreadable\"),wo=9007199254740991,vo=\"Maximum allowed index exceeded\",So=!I(function(){var e=[];return e[yo]=!1,e.concat()[0]!==e}),xo=bo(\"concat\"),ko=function(e){if(!U(e))return!1;var t=e[yo];return void 0===t?Je(e):!!t};Xe({target:\"Array\",proto:!0,forced:!So||!xo},{concat:function(){var e,t,o,a,s,l=Ze(this),r=Pt(l,0),c=0;for(e=-1,o=arguments.length;e<o;e++)if(s=-1===e?l:arguments[e],ko(s)){if(a=Ie(s.length),c+a>wo)throw TypeError(vo);for(t=0;t<a;t++,c++)t in s&&fo(r,c,s[t])}else{if(c>=wo)throw TypeError(vo);fo(r,c++,s)}return r.length=c,r}});var To=It.filter;Xe({target:\"Array\",proto:!0,forced:!bo(\"filter\")},{filter:function(e){return To(this,e,1<arguments.length?arguments[1]:void 0)}});var Po=ft(\"unscopables\"),Oo=Array.prototype;null==Oo[Po]&&ae(Oo,Po,lt(null));var Co=function(e){Oo[Po][e]=!0},Io=It.find,$o=\"find\",Ao=!0;$o in[]&&[,][$o](function(){Ao=!1}),Xe({target:\"Array\",proto:!0,forced:Ao},{find:function(e){return Io(this,e,1<arguments.length?arguments[1]:void 0)}}),Co($o);var Eo=It.findIndex,Ro=\"findIndex\",_o=!0;Ro in[]&&[,][Ro](function(){_o=!1}),Xe({target:\"Array\",proto:!0,forced:_o},{findIndex:function(e){return Eo(this,e,1<arguments.length?arguments[1]:void 0)}}),Co(Ro);var No=Ee.includes;Xe({target:\"Array\",proto:!0},{includes:function(e){return No(this,e,1<arguments.length?arguments[1]:void 0)}}),Co(\"includes\");var Fo=function(e,t){var o=[][e];return!o||!I(function(){o.call(null,t||function(){throw 1},1)})},Do=Ee.indexOf,Lo=[].indexOf,Bo=!!Lo&&0>1/[1].indexOf(1,-0),Vo=Fo(\"indexOf\");Xe({target:\"Array\",proto:!0,forced:Bo||Vo},{indexOf:function(e){return Bo?Lo.apply(this,arguments)||0:Do(this,e,1<arguments.length?arguments[1]:void 0)}});var Ho,jo,Mo,Uo=!I(function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype}),qo=he(\"IE_PROTO\"),zo=Object.prototype,Go=Uo?Object.getPrototypeOf:function(e){return e=Ze(e),G(e,qo)?e[qo]:\"function\"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?zo:null},Wo=ft(\"iterator\"),Yo=!1;[].keys&&(Mo=[].keys(),\"next\"in Mo?(jo=Go(Go(Mo)),jo!==Object.prototype&&(Ho=jo)):Yo=!0),null==Ho&&(Ho={}),G(Ho,Wo)||ae(Ho,Wo,function(){return this});var Ko={IteratorPrototype:Ho,BUGGY_SAFARI_ITERATORS:Yo},Xo=Ko.IteratorPrototype,Qo=function(e,t,o){return e.prototype=lt(Xo,{next:F(1,o)}),St(e,t+\" Iterator\",!1),e},Jo=function(e){if(!U(e)&&null!==e)throw TypeError(\"Can't set \"+(e+\" as a prototype\"));return e},Zo=Object.setPrototypeOf||(\"__proto__\"in{}?function(){var e,t=!1,o={};try{e=Object.getOwnPropertyDescriptor(Object.prototype,\"__proto__\").set,e.call(o,[]),t=o instanceof Array}catch(e){}return function(o,n){return ee(o),Jo(n),t?e.call(o,n):o.__proto__=n,o}}():void 0),en=Ko.IteratorPrototype,tn=Ko.BUGGY_SAFARI_ITERATORS,on=ft(\"iterator\"),nn=\"keys\",an=\"values\",sn=\"entries\",ln=function(){return this},rn=function(e,t,o,n,a,i,s){Qo(o,t,n);var l,r,c,d=function(e){return e===a&&g?g:!tn&&e in u?u[e]:e===nn?function(){return new o(this,e)}:e===an?function(){return new o(this,e)}:e===sn?function(){return new o(this,e)}:function(){return new o(this)}},p=!1,u=e.prototype,h=u[on]||u[\"@@iterator\"]||a&&u[a],g=!tn&&h||d(a),f=\"Array\"==t?u.entries||h:h;if(f&&(l=Go(f.call(new e)),en!==Object.prototype&&l.next&&(Go(l)!==en&&(Zo?Zo(l,en):\"function\"!=typeof l[on]&&ae(l,on,ln)),St(l,t+\" Iterator\",!0))),a==an&&h&&h.name!==an&&(p=!0,g=function(){return h.call(this)}),u[on]!==g&&ae(u,on,g),a)if(r={values:d(an),keys:i?g:d(nn),entries:d(sn)},s)for(c in r)(tn||p||!(c in u))&&ke(u,c,r[c]);else Xe({target:t,proto:!0,forced:tn||p},r);return r},cn=\"Array Iterator\",dn=xe.set,pn=xe.getterFor(cn),un=rn(Array,\"Array\",function(e,t){dn(this,{type:cn,target:M(e),index:0,kind:t})},function(){var e=pn(this),t=e.target,o=e.kind,n=e.index++;return!t||n>=t.length?(e.target=void 0,{value:void 0,done:!0}):\"keys\"==o?{value:n,done:!1}:\"values\"==o?{value:t[n],done:!1}:{value:[n,t[n]],done:!1}},\"values\");Co(\"keys\"),Co(\"values\"),Co(\"entries\");var hn=[].join,gn=V!=Object,fn=Fo(\"join\",\",\");Xe({target:\"Array\",proto:!0,forced:gn||fn},{join:function(e){return hn.call(M(this),void 0===e?\",\":e)}});var mn=ft(\"species\"),bn=[].slice;Xe({target:\"Array\",proto:!0,forced:!bo(\"slice\")},{slice:function(e,t){var o,a,i,s=M(this),l=Ie(s.length),r=$e(e,l),c=$e(void 0===t?l:t,l);if(Je(s)&&(o=s.constructor,\"function\"==typeof o&&(o===Array||Je(o.prototype))?o=void 0:U(o)&&(o=o[mn],null===o&&(o=void 0)),o===Array||void 0===o))return bn.call(s,r,c);for(a=new(void 0===o?Array:o)(b(c-r,0)),i=0;r<c;r++,i++)r in s&&fo(a,i,s[r]);return a.length=i,a}});var yn=[].sort,wn=[1,2,3],vn=I(function(){wn.sort(void 0)}),Sn=I(function(){wn.sort(null)}),xn=Fo(\"sort\");Xe({target:\"Array\",proto:!0,forced:vn||!Sn||xn},{sort:function(e){return void 0===e?yn.call(Ze(this)):yn.call(Ze(this),xt(e))}});Xe({target:\"Array\",proto:!0,forced:!bo(\"splice\")},{splice:function(e,t){var o,n,a,i,s,l,r=Ze(this),c=Ie(r.length),d=$e(e,c),p=arguments.length;if(0===p?o=n=0:1===p?(o=0,n=c-d):(o=p-2,n=y(b(Ce(t),0),c-d)),c+o-n>9007199254740991)throw TypeError(\"Maximum allowed length exceeded\");for(a=Pt(r,n),i=0;i<n;i++)s=d+i,s in r&&fo(a,i,r[s]);if(a.length=n,o<n){for(i=d;i<c-n;i++)s=i+n,l=i+o,s in r?r[l]=r[s]:delete r[l];for(i=c;i>c-n+o;i--)delete r[i-1]}else if(o>n)for(i=c-n;i>d;i--)s=i+n-1,l=i+o-1,s in r?r[l]=r[s]:delete r[l];for(i=0;i<o;i++)r[i+d]=arguments[i+2];return r.length=c-n+o,a}});var kn=function(e,t,o){var n,a;return Zo&&\"function\"==typeof(n=t.constructor)&&n!==o&&U(a=n.prototype)&&a!==o.prototype&&Zo(e,a),e},Tn=\"\\t\\n\\x0B\\f\\r \\xA0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF\",Pn=\"[\"+Tn+\"]\",On=RegExp(\"^\"+Pn+Pn+\"*\"),Cn=RegExp(Pn+Pn+\"*$\"),In=function(e){return function(t){var o=H(t)+\"\";return 1&e&&(o=o.replace(On,\"\")),2&e&&(o=o.replace(Cn,\"\")),o}},$n={start:In(1),end:In(2),trim:In(3)},An=Le.f,En=Z.f,Rn=ne.f,_n=$n.trim,Nn=\"Number\",Fn=C[Nn],Dn=Fn.prototype,Ln=L(lt(Dn))==Nn,Bn=function(e){var t,o,n,a,i,s,l,r,c=q(e,!1);if(\"string\"==typeof c&&2<c.length)if(c=_n(c),t=c.charCodeAt(0),43===t||45===t){if(o=c.charCodeAt(2),88===o||120===o)return NaN;}else if(48===t){switch(c.charCodeAt(1)){case 66:case 98:n=2,a=49;break;case 79:case 111:n=8,a=55;break;default:return+c;}for(i=c.slice(2),s=i.length,l=0;l<s;l++)if(r=i.charCodeAt(l),48>r||r>a)return NaN;return parseInt(i,n)}return+c};if(Ye(Nn,!Fn(\" 0o1\")||!Fn(\"0b1\")||Fn(\"+0x1\"))){for(var Vn,Hn=function(e){var t=1>arguments.length?0:e,o=this;return o instanceof Hn&&(Ln?I(function(){Dn.valueOf.call(o)}):L(o)!=Nn)?kn(new Fn(Bn(t)),o,Hn):Bn(t)},jn=A?An(Fn):[\"MAX_VALUE\",\"MIN_VALUE\",\"NaN\",\"NEGATIVE_INFINITY\",\"POSITIVE_INFINITY\",\"EPSILON\",\"isFinite\",\"isInteger\",\"isNaN\",\"isSafeInteger\",\"MAX_SAFE_INTEGER\",\"MIN_SAFE_INTEGER\",\"parseFloat\",\"parseInt\",\"isInteger\"],Mn=0;jn.length>Mn;Mn++)G(Fn,Vn=jn[Mn])&&!G(Hn,Vn)&&Rn(Hn,Vn,En(Fn,Vn));Hn.prototype=Dn,Dn.constructor=Hn,ke(C,Nn,Hn)}var Un=Object.assign,qn=!Un||I(function(){var e={},t={},o=Symbol(),n=\"abcdefghijklmnopqrst\";return e[o]=7,n.split(\"\").forEach(function(e){t[e]=e}),7!=Un({},e)[o]||et(Un({},t)).join(\"\")!=n})?function(e){for(var t=Ze(e),o=arguments.length,n=1,a=Ve.f,i=f.f;o>n;)for(var s,l=V(arguments[n++]),r=a?et(l).concat(a(l)):et(l),c=r.length,d=0;c>d;)s=r[d++],(!A||i.call(l,s))&&(t[s]=l[s]);return t}:Un;Xe({target:\"Object\",stat:!0,forced:Object.assign!==qn},{assign:qn});var zn=f.f,Gn=function(e){return function(t){for(var o,n=M(t),a=et(n),s=a.length,l=0,r=[];s>l;)o=a[l++],(!A||zn.call(n,o))&&r.push(e?[o,n[o]]:n[o]);return r}},Wn={entries:Gn(!0),values:Gn(!1)},Yn=Wn.entries;Xe({target:\"Object\",stat:!0},{entries:function(e){return Yn(e)}});var Kn=ft(\"toStringTag\"),Xn=\"Arguments\"==L(function(){return arguments}()),Qn=function(e,t){try{return e[t]}catch(e){}},Jn=function(e){var t,o,n;return void 0===e?\"Undefined\":null===e?\"Null\":\"string\"==typeof(o=Qn(t=Object(e),Kn))?o:Xn?L(t):\"Object\"==(n=L(t))&&\"function\"==typeof t.callee?\"Arguments\":n},Zn=ft(\"toStringTag\"),ea={};ea[Zn]=\"z\";var ta=function(){return\"[object \"+Jn(this)+\"]\"},oa=Object.prototype;ta!==oa.toString&&ke(oa,\"toString\",ta,{unsafe:!0});var na=$n.trim,aa=C.parseFloat,ia=1/aa(Tn+\"-0\")!=-Infinity,sa=ia?function(e){var t=na(e+\"\"),o=aa(t);return 0===o&&\"-\"==t.charAt(0)?-0:o}:aa;Xe({global:!0,forced:parseFloat!=sa},{parseFloat:sa});var la=$n.trim,ra=C.parseInt,ca=/^[+-]?0[Xx]/,da=8!==ra(Tn+\"08\")||22!==ra(Tn+\"0x16\"),pa=da?function(e,t){var o=la(e+\"\");return ra(o,t>>>0||(ca.test(o)?16:10))}:ra;Xe({global:!0,forced:parseInt!=pa},{parseInt:pa});var ua=function(){var e=ee(this),t=\"\";return e.global&&(t+=\"g\"),e.ignoreCase&&(t+=\"i\"),e.multiline&&(t+=\"m\"),e.dotAll&&(t+=\"s\"),e.unicode&&(t+=\"u\"),e.sticky&&(t+=\"y\"),t},ha=\"toString\",ga=RegExp.prototype,fa=ga[ha],ma=I(function(){return\"/a/b\"!=fa.call({source:\"a\",flags:\"b\"})}),ba=fa.name!=ha;(ma||ba)&&ke(RegExp.prototype,ha,function(){var e=ee(this),t=e.source+\"\",o=e.flags,n=(void 0===o&&e instanceof RegExp&&!(\"flags\"in ga)?ua.call(e):o)+\"\";return\"/\"+t+\"/\"+n},{unsafe:!0});var ya=ft(\"match\"),wa=function(e){var t;return U(e)&&(void 0===(t=e[ya])?\"RegExp\"==L(e):!!t)},va=function(e){if(wa(e))throw TypeError(\"The method doesn't accept regular expressions\");return e},Sa=ft(\"match\");Xe({target:\"String\",proto:!0,forced:!function(e){var t=/./;try{\"/./\"[e](t)}catch(o){try{return t[Sa]=!1,\"/./\"[e](t)}catch(e){}}return!1}(\"includes\")},{includes:function(e){return!!~(H(this)+\"\").indexOf(va(e),1<arguments.length?arguments[1]:void 0)}});var xa=function(e){return function(t,o){var n,a,i=H(t)+\"\",s=Ce(o),l=i.length;return 0>s||s>=l?e?\"\":void 0:(n=i.charCodeAt(s),55296>n||56319<n||s+1===l||56320>(a=i.charCodeAt(s+1))||57343<a?e?i.charAt(s):n:e?i.slice(s,s+2):(n-55296<<10)+(a-56320)+65536)}},ka={codeAt:xa(!1),charAt:xa(!0)},Ta=ka.charAt,Pa=\"String Iterator\",Oa=xe.set,Ca=xe.getterFor(Pa);rn(String,\"String\",function(e){Oa(this,{type:Pa,string:e+\"\",index:0})},function(){var e,t=Ca(this),o=t.string,n=t.index;return n>=o.length?{value:void 0,done:!0}:(e=Ta(o,n),t.index+=e.length,{value:e,done:!1})});var Ia=RegExp.prototype.exec,$a=m.replace,Aa=Ia,Ea=function(){var e=/a/,t=/b*/g;return Ia.call(e,\"a\"),Ia.call(t,\"a\"),0!==e.lastIndex||0!==t.lastIndex}(),Ra=void 0!==/()??/.exec(\"\")[1];(Ea||Ra)&&(Aa=function(e){var t,o,n,a,s=this;return Ra&&(o=new RegExp(\"^\"+s.source+\"$(?!\\\\s)\",ua.call(s))),Ea&&(t=s.lastIndex),n=Ia.call(s,e),Ea&&n&&(s.lastIndex=s.global?n.index+n[0].length:t),Ra&&n&&1<n.length&&$a.call(n[0],o,function(){for(a=1;a<arguments.length-2;a++)void 0===arguments[a]&&(n[a]=void 0)}),n});var _a=Aa,Na=ft(\"species\"),Fa=!I(function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:\"7\"},e},\"7\"!==\"\".replace(e,\"$<a>\")}),Da=!I(function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var o=\"ab\".split(e);return 2!==o.length||\"a\"!==o[0]||\"b\"!==o[1]}),La=function(e,t,o,n){var a=ft(e),i=!I(function(){var t={};return t[a]=function(){return 7},7!=\"\"[e](t)}),s=i&&!I(function(){var t=!1,o=/a/;return o.exec=function(){return t=!0,null},\"split\"===e&&(o.constructor={},o.constructor[Na]=function(){return o}),o[a](\"\"),!t});if(!i||!s||\"replace\"===e&&!Fa||\"split\"===e&&!Da){var l=/./[a],r=o(a,\"\"[e],function(e,t,o,n,a){return t.exec===_a?i&&!a?{done:!0,value:l.call(t,o,n)}:{done:!0,value:e.call(o,t,n)}:{done:!1}}),c=r[0],d=r[1];ke(String.prototype,e,c),ke(RegExp.prototype,a,2==t?function(e,t){return d.call(e,this,t)}:function(e){return d.call(e,this)}),n&&ae(RegExp.prototype[a],\"sham\",!0)}},Ba=ka.charAt,Va=function(e,t,o){return t+(o?Ba(e,t).length:1)},Ha=function(e,t){var o=e.exec;if(\"function\"==typeof o){var n=o.call(e,t);if(\"object\"!=typeof n)throw TypeError(\"RegExp exec method returned something other than an Object or null\");return n}if(\"RegExp\"!==L(e))throw TypeError(\"RegExp#exec called on incompatible receiver\");return _a.call(e,t)},ja=/\\$([$&'`]|\\d\\d?|<[^>]*>)/g,Ma=/\\$([$&'`]|\\d\\d?)/g,Ua=function(e){return void 0===e?e:e+\"\"};La(\"replace\",2,function(e,t,o){function n(e,o,a,i,s,l){var r=a+e.length,c=i.length,n=Ma;return void 0!==s&&(s=Ze(s),n=ja),t.call(l,n,function(t,l){var d;switch(l.charAt(0)){case\"$\":return\"$\";case\"&\":return e;case\"`\":return o.slice(0,a);case\"'\":return o.slice(r);case\"<\":d=s[l.slice(1,-1)];break;default:var p=+l;if(0==p)return t;if(p>c){var n=w(p/10);return 0===n?t:n<=c?void 0===i[n-1]?l.charAt(1):i[n-1]+l.charAt(1):t}d=i[p-1];}return void 0===d?\"\":d})}return[function(o,n){var a=H(this),i=null==o?void 0:o[e];return void 0===i?t.call(a+\"\",o,n):i.call(o,a,n)},function(e,a){var s=o(t,e,this,a);if(s.done)return s.value;var l=ee(e),r=this+\"\",c=\"function\"==typeof a;c||(a+=\"\");var d=l.global;if(d){var p=l.unicode;l.lastIndex=0}for(var u,h,g=[];(u=Ha(l,r),null!==u)&&(g.push(u),!!d);)h=u[0]+\"\",\"\"==h&&(l.lastIndex=Va(r,Ie(l.lastIndex),p));for(var f=\"\",m=0,w=0;w<g.length;w++){u=g[w];for(var v=u[0]+\"\",S=b(y(Ce(u.index),r.length),0),x=[],k=1;k<u.length;k++)x.push(Ua(u[k]));var T=u.groups;if(c){var P=[v].concat(x,S,r);void 0!==T&&P.push(T);var O=a.apply(void 0,P)+\"\"}else O=n(v,r,S,x,T,a);S>=m&&(f+=r.slice(m,S)+O,m=S+v.length)}return f+r.slice(m)}]});var qa=Object.is||function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t};La(\"search\",1,function(e,t,o){return[function(t){var o=H(this),n=null==t?void 0:t[e];return void 0===n?new RegExp(t)[e](o+\"\"):n.call(t,o)},function(e){var n=o(t,e,this);if(n.done)return n.value;var a=ee(e),i=this+\"\",s=a.lastIndex;qa(s,0)||(a.lastIndex=0);var l=Ha(a,i);return qa(a.lastIndex,s)||(a.lastIndex=s),null===l?-1:l.index}]});var za=ft(\"species\"),Ga=function(e,t){var o,n=ee(e).constructor;return void 0===n||null==(o=ee(n)[za])?t:xt(o)},Wa=[].push,Ya=4294967295,Ka=!I(function(){return!RegExp(Ya,\"y\")});La(\"split\",2,function(e,t,o){var n;return n=\"c\"==\"abbc\".split(/(b)*/)[1]||4!=\"test\".split(/(?:)/,-1).length||2!=\"ab\".split(/(?:ab)*/).length||4!=\".\".split(/(.?)(.?)/).length||1<\".\".split(/()()/).length||\"\".split(/.?/).length?function(e,o){var n=H(this)+\"\",a=void 0===o?Ya:o>>>0;if(0===a)return[];if(void 0===e)return[n];if(!wa(e))return t.call(n,e,a);for(var i,s,l,r=[],c=(e.ignoreCase?\"i\":\"\")+(e.multiline?\"m\":\"\")+(e.unicode?\"u\":\"\")+(e.sticky?\"y\":\"\"),d=0,p=new RegExp(e.source,c+\"g\");(i=_a.call(p,n))&&(s=p.lastIndex,!(s>d&&(r.push(n.slice(d,i.index)),1<i.length&&i.index<n.length&&Wa.apply(r,i.slice(1)),l=i[0].length,d=s,r.length>=a)));)p.lastIndex===i.index&&p.lastIndex++;return d===n.length?(l||!p.test(\"\"))&&r.push(\"\"):r.push(n.slice(d)),r.length>a?r.slice(0,a):r}:function(e,o){return void 0===e&&0===o?[]:t.call(this,e,o)},[function(t,o){var a=H(this),i=null==t?void 0:t[e];return void 0===i?n.call(a+\"\",t,o):i.call(t,a,o)},function(a,s){var l=o(n,a,this,s,n!==t);if(l.done)return l.value;var r=ee(a),c=this+\"\",d=Ga(r,RegExp),u=r.unicode,h=(r.ignoreCase?\"i\":\"\")+(r.multiline?\"m\":\"\")+(r.unicode?\"u\":\"\")+(Ka?\"y\":\"g\"),g=new d(Ka?r:\"^(?:\"+r.source+\")\",h),f=void 0===s?Ya:s>>>0;if(0===f)return[];if(0===c.length)return null===Ha(g,c)?[c]:[];for(var m=0,b=0,w=[];b<c.length;){g.lastIndex=Ka?b:0;var v,S=Ha(g,Ka?c:c.slice(b));if(null===S||(v=y(Ie(g.lastIndex+(Ka?0:b)),c.length))===m)b=Va(c,b,u);else{if(w.push(c.slice(m,b)),w.length===f)return w;for(var x=1;x<=S.length-1;x++)if(w.push(S[x]),w.length===f)return w;b=m=v}}return w.push(c.slice(m)),w}]},!Ka);var Xa=$n.trim;Xe({target:\"String\",proto:!0,forced:function(e){return I(function(){return!!Tn[e]()||\"\\u200B\\x85\\u180E\"!=\"\\u200B\\x85\\u180E\"[e]()||Tn[e].name!==e})}(\"trim\")},{trim:function(){return Xa(this)}});var Qa={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0},Ja=It.forEach,Za=Fo(\"forEach\")?function(e){return Ja(this,e,1<arguments.length?arguments[1]:void 0)}:[].forEach;for(var ei in Qa){var ti=C[ei],oi=ti&&ti.prototype;if(oi&&oi.forEach!==Za)try{ae(oi,\"forEach\",Za)}catch(e){oi.forEach=Za}}var ni=ft(\"iterator\"),ai=ft(\"toStringTag\"),ii=un.values;for(var si in Qa){var li=C[si],ri=li&&li.prototype;if(ri){if(ri[ni]!==ii)try{ae(ri,ni,ii)}catch(e){ri[ni]=ii}if(ri[ai]||ae(ri,ai,si),Qa[si])for(var ci in un)if(ri[ci]!==un[ci])try{ae(ri,ci,un[ci])}catch(e){ri[ci]=un[ci]}}}var di=4;try{var pi=t.fn.dropdown.Constructor.VERSION;void 0!==pi&&(di=parseInt(pi,10))}catch(t){}var ui={3:{iconsPrefix:\"glyphicon\",icons:{paginationSwitchDown:\"glyphicon-collapse-down icon-chevron-down\",paginationSwitchUp:\"glyphicon-collapse-up icon-chevron-up\",refresh:\"glyphicon-refresh icon-refresh\",toggleOff:\"glyphicon-list-alt icon-list-alt\",toggleOn:\"glyphicon-list-alt icon-list-alt\",columns:\"glyphicon-th icon-th\",detailOpen:\"glyphicon-plus icon-plus\",detailClose:\"glyphicon-minus icon-minus\",fullscreen:\"glyphicon-fullscreen\",search:\"glyphicon-search\",clearSearch:\"glyphicon-trash\"},classes:{buttonsPrefix:\"btn\",buttons:\"default\",buttonsGroup:\"btn-group\",buttonsDropdown:\"btn-group\",pull:\"pull\",inputGroup:\"input-group\",input:\"form-control\",paginationDropdown:\"btn-group dropdown\",dropup:\"dropup\",dropdownActive:\"active\",paginationActive:\"active\",buttonActive:\"active\"},html:{toolbarDropdown:[\"<ul class=\\\"dropdown-menu\\\" role=\\\"menu\\\">\",\"</ul>\"],toolbarDropdownItem:\"<li role=\\\"menuitem\\\"><label>%s</label></li>\",toolbarDropdownSeperator:\"<li class=\\\"divider\\\"></li>\",pageDropdown:[\"<ul class=\\\"dropdown-menu\\\" role=\\\"menu\\\">\",\"</ul>\"],pageDropdownItem:\"<li role=\\\"menuitem\\\" class=\\\"%s\\\"><a href=\\\"#\\\">%s</a></li>\",dropdownCaret:\"<span class=\\\"caret\\\"></span>\",pagination:[\"<ul class=\\\"pagination%s\\\">\",\"</ul>\"],paginationItem:\"<li class=\\\"page-item%s\\\"><a class=\\\"page-link\\\" aria-label=\\\"%s\\\" href=\\\"javascript:void(0)\\\">%s</a></li>\",icon:\"<i class=\\\"%s %s\\\"></i>\",inputGroup:\"<div class=\\\"input-group\\\">%s<span class=\\\"input-group-btn\\\">%s</span></div>\",searchInput:\"<input class=\\\"%s%s\\\" type=\\\"text\\\" placeholder=\\\"%s\\\">\",searchButton:\"<button class=\\\"%s\\\" type=\\\"button\\\" name=\\\"search\\\" title=\\\"%s\\\">%s %s</button>\",searchClearButton:\"<button class=\\\"%s\\\" type=\\\"button\\\" name=\\\"clearSearch\\\" title=\\\"%s\\\">%s %s</button>\"}},4:{iconsPrefix:\"fa\",icons:{paginationSwitchDown:\"fa-caret-square-down\",paginationSwitchUp:\"fa-caret-square-up\",refresh:\"fa-sync\",toggleOff:\"fa-toggle-off\",toggleOn:\"fa-toggle-on\",columns:\"fa-th-list\",detailOpen:\"fa-plus\",detailClose:\"fa-minus\",fullscreen:\"fa-arrows-alt\",search:\"fa-search\",clearSearch:\"fa-trash\"},classes:{buttonsPrefix:\"btn\",buttons:\"secondary\",buttonsGroup:\"btn-group\",buttonsDropdown:\"btn-group\",pull:\"float\",inputGroup:\"btn-group\",input:\"form-control\",paginationDropdown:\"btn-group dropdown\",dropup:\"dropup\",dropdownActive:\"active\",paginationActive:\"active\",buttonActive:\"active\"},html:{toolbarDropdown:[\"<div class=\\\"dropdown-menu dropdown-menu-right\\\">\",\"</div>\"],toolbarDropdownItem:\"<label class=\\\"dropdown-item\\\">%s</label>\",pageDropdown:[\"<div class=\\\"dropdown-menu\\\">\",\"</div>\"],pageDropdownItem:\"<a class=\\\"dropdown-item %s\\\" href=\\\"#\\\">%s</a>\",toolbarDropdownSeperator:\"<div class=\\\"dropdown-divider\\\"></div>\",dropdownCaret:\"<span class=\\\"caret\\\"></span>\",pagination:[\"<ul class=\\\"pagination%s\\\">\",\"</ul>\"],paginationItem:\"<li class=\\\"page-item%s\\\"><a class=\\\"page-link\\\" aria-label=\\\"%s\\\" href=\\\"javascript:void(0)\\\">%s</a></li>\",icon:\"<i class=\\\"%s %s\\\"></i>\",inputGroup:\"<div class=\\\"input-group\\\">%s<div class=\\\"input-group-append\\\">%s</div></div>\",searchInput:\"<input class=\\\"%s%s\\\" type=\\\"text\\\" placeholder=\\\"%s\\\">\",searchButton:\"<button class=\\\"%s\\\" type=\\\"button\\\" name=\\\"search\\\" title=\\\"%s\\\">%s %s</button>\",searchClearButton:\"<button class=\\\"%s\\\" type=\\\"button\\\" name=\\\"clearSearch\\\" title=\\\"%s\\\">%s %s</button>\"}}}[di],hi={height:void 0,classes:\"table table-bordered table-hover\",theadClasses:\"\",rowStyle:function(){return{}},rowAttributes:function(){return{}},undefinedText:\"-\",locale:void 0,virtualScroll:!1,virtualScrollItemHeight:void 0,sortable:!0,sortClass:void 0,silentSort:!0,sortName:void 0,sortOrder:\"asc\",sortStable:!1,rememberOrder:!1,customSort:void 0,columns:[[]],data:[],url:void 0,method:\"get\",cache:!0,contentType:\"application/json\",dataType:\"json\",ajax:void 0,ajaxOptions:{},queryParams:function(e){return e},queryParamsType:\"limit\",responseHandler:function(e){return e},totalField:\"total\",totalNotFilteredField:\"totalNotFiltered\",dataField:\"rows\",pagination:!1,onlyInfoPagination:!1,showExtendedPagination:!1,paginationLoop:!0,sidePagination:\"client\",totalRows:0,totalNotFiltered:0,pageNumber:1,pageSize:10,pageList:[10,25,50,100],paginationHAlign:\"right\",paginationVAlign:\"bottom\",paginationDetailHAlign:\"left\",paginationPreText:\"&lsaquo;\",paginationNextText:\"&rsaquo;\",paginationSuccessivelySize:5,paginationPagesBySide:1,paginationUseIntermediate:!1,search:!1,searchOnEnterKey:!1,strictSearch:!1,visibleSearch:!1,showButtonIcons:!0,showButtonText:!1,showSearchButton:!1,showSearchClearButton:!1,trimOnSearch:!0,searchAlign:\"right\",searchTimeOut:500,searchText:\"\",customSearch:void 0,showHeader:!0,showFooter:!1,footerStyle:function(){return{}},showColumns:!1,showColumnsToggleAll:!1,minimumCountColumns:1,showPaginationSwitch:!1,showRefresh:!1,showToggle:!1,showFullscreen:!1,smartDisplay:!0,escape:!1,filterOptions:{filterAlgorithm:\"and\"},idField:void 0,selectItemName:\"btSelectItem\",clickToSelect:!1,ignoreClickToSelectOn:function(e){var t=e.tagName;return[\"A\",\"BUTTON\"].includes(t)},singleSelect:!1,checkboxHeader:!0,maintainMetaData:!1,multipleSelectRow:!1,uniqueId:void 0,cardView:!1,detailView:!1,detailViewIcon:!0,detailViewByClick:!1,detailFormatter:function(){return\"\"},detailFilter:function(){return!0},toolbar:void 0,toolbarAlign:\"left\",buttonsToolbar:void 0,buttonsAlign:\"right\",buttonsPrefix:ui.classes.buttonsPrefix,buttonsClass:ui.classes.buttons,icons:ui.icons,html:ui.html,iconSize:void 0,iconsPrefix:ui.iconsPrefix,onAll:function(){return!1},onClickCell:function(){return!1},onDblClickCell:function(){return!1},onClickRow:function(){return!1},onDblClickRow:function(){return!1},onSort:function(){return!1},onCheck:function(){return!1},onUncheck:function(){return!1},onCheckAll:function(){return!1},onUncheckAll:function(){return!1},onCheckSome:function(){return!1},onUncheckSome:function(){return!1},onLoadSuccess:function(){return!1},onLoadError:function(){return!1},onColumnSwitch:function(){return!1},onPageChange:function(){return!1},onSearch:function(){return!1},onToggle:function(){return!1},onPreBody:function(){return!1},onPostBody:function(){return!1},onPostHeader:function(){return!1},onPostFooter:function(){return!1},onExpandRow:function(){return!1},onCollapseRow:function(){return!1},onRefreshOptions:function(){return!1},onRefresh:function(){return!1},onResetView:function(){return!1},onScrollBody:function(){return!1}},gi={formatLoadingMessage:function(){return\"Loading, please wait\"},formatRecordsPerPage:function(e){return\"\".concat(e,\" rows per page\")},formatShowingRows:function(e,t,o,n){return void 0!==n&&0<n&&n>o?\"Showing \".concat(e,\" to \").concat(t,\" of \").concat(o,\" rows (filtered from \").concat(n,\" total rows)\"):\"Showing \".concat(e,\" to \").concat(t,\" of \").concat(o,\" rows\")},formatSRPaginationPreText:function(){return\"previous page\"},formatSRPaginationPageText:function(e){return\"to page \".concat(e)},formatSRPaginationNextText:function(){return\"next page\"},formatDetailPagination:function(e){return\"Showing \".concat(e,\" rows\")},formatSearch:function(){return\"Search\"},formatClearSearch:function(){return\"Clear Search\"},formatNoMatches:function(){return\"No matching records found\"},formatPaginationSwitch:function(){return\"Hide/Show pagination\"},formatPaginationSwitchDown:function(){return\"Show pagination\"},formatPaginationSwitchUp:function(){return\"Hide pagination\"},formatRefresh:function(){return\"Refresh\"},formatToggle:function(){return\"Toggle\"},formatToggleOn:function(){return\"Show card view\"},formatToggleOff:function(){return\"Hide card view\"},formatColumns:function(){return\"Columns\"},formatColumnsToggleAll:function(){return\"Toggle all\"},formatFullscreen:function(){return\"Fullscreen\"},formatAllRows:function(){return\"All\"}};Object.assign(hi,gi);var fi={VERSION:\"1.15.4\",THEME:\"bootstrap\".concat(di),CONSTANTS:ui,DEFAULTS:hi,COLUMN_DEFAULTS:{field:void 0,title:void 0,titleTooltip:void 0,class:void 0,width:void 0,widthUnit:\"px\",rowspan:void 0,colspan:void 0,align:void 0,halign:void 0,falign:void 0,valign:void 0,cellStyle:void 0,radio:!1,checkbox:!1,checkboxEnabled:!0,clickToSelect:!0,showSelectTitle:!1,sortable:!1,sortName:void 0,order:\"asc\",sorter:void 0,visible:!0,switchable:!0,cardVisible:!0,searchable:!0,formatter:void 0,footerFormatter:void 0,detailFormatter:void 0,searchFormatter:!0,escape:!1,events:void 0},METHODS:[\"getOptions\",\"refreshOptions\",\"getData\",\"getSelections\",\"getAllSelections\",\"load\",\"append\",\"prepend\",\"remove\",\"removeAll\",\"insertRow\",\"updateRow\",\"getRowByUniqueId\",\"updateByUniqueId\",\"removeByUniqueId\",\"updateCell\",\"updateCellByUniqueId\",\"showRow\",\"hideRow\",\"getHiddenRows\",\"showColumn\",\"hideColumn\",\"getVisibleColumns\",\"getHiddenColumns\",\"showAllColumns\",\"hideAllColumns\",\"mergeCells\",\"checkAll\",\"uncheckAll\",\"checkInvert\",\"check\",\"uncheck\",\"checkBy\",\"uncheckBy\",\"refresh\",\"destroy\",\"resetView\",\"resetWidth\",\"showLoading\",\"hideLoading\",\"togglePagination\",\"toggleFullscreen\",\"toggleView\",\"resetSearch\",\"filterBy\",\"scrollTo\",\"getScrollPosition\",\"selectPage\",\"prevPage\",\"nextPage\",\"toggleDetailView\",\"expandRow\",\"collapseRow\",\"expandAllRows\",\"collapseAllRows\",\"updateColumnTitle\",\"updateFormatText\"],EVENTS:{\"all.bs.table\":\"onAll\",\"click-row.bs.table\":\"onClickRow\",\"dbl-click-row.bs.table\":\"onDblClickRow\",\"click-cell.bs.table\":\"onClickCell\",\"dbl-click-cell.bs.table\":\"onDblClickCell\",\"sort.bs.table\":\"onSort\",\"check.bs.table\":\"onCheck\",\"uncheck.bs.table\":\"onUncheck\",\"check-all.bs.table\":\"onCheckAll\",\"uncheck-all.bs.table\":\"onUncheckAll\",\"check-some.bs.table\":\"onCheckSome\",\"uncheck-some.bs.table\":\"onUncheckSome\",\"load-success.bs.table\":\"onLoadSuccess\",\"load-error.bs.table\":\"onLoadError\",\"column-switch.bs.table\":\"onColumnSwitch\",\"page-change.bs.table\":\"onPageChange\",\"search.bs.table\":\"onSearch\",\"toggle.bs.table\":\"onToggle\",\"pre-body.bs.table\":\"onPreBody\",\"post-body.bs.table\":\"onPostBody\",\"post-header.bs.table\":\"onPostHeader\",\"post-footer.bs.table\":\"onPostFooter\",\"expand-row.bs.table\":\"onExpandRow\",\"collapse-row.bs.table\":\"onCollapseRow\",\"refresh-options.bs.table\":\"onRefreshOptions\",\"reset-view.bs.table\":\"onResetView\",\"refresh.bs.table\":\"onRefresh\",\"scroll-body.bs.table\":\"onScrollBody\"},LOCALES:{en:gi,\"en-US\":gi}},mi=function(e,t,o,n,a,i,s,l){for(var r,c=a,d=0,p=!!s&&kt(s,l,3);d<n;){if(d in o){if(r=p?p(o[d],d,t):o[d],0<i&&Je(r))c=mi(e,t,r,Ie(r.length),c,i-1)-1;else{if(9007199254740991<=c)throw TypeError(\"Exceed the acceptable array length\");e[c]=r}c++}d++}return c};Xe({target:\"Array\",proto:!0},{flat:function(){var e=arguments.length?arguments[0]:void 0,t=Ze(this),o=Ie(t.length),n=Pt(t,0);return n.length=mi(n,t,t,o,0,void 0===e?1:Ce(e)),n}}),Co(\"flat\");var bi=I(function(){et(1)});Xe({target:\"Object\",stat:!0,forced:bi},{keys:function(e){return et(Ze(e))}});var yi={sprintf:function(e){for(var t=arguments.length,o=Array(1<t?t-1:0),n=1;n<t;n++)o[n-1]=arguments[n];var a=!0,s=0,l=e.replace(/%s/g,function(){var e=o[s++];return\"undefined\"==typeof e?(a=!1,\"\"):e});return a?l:\"\"},isEmptyObject:function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{};return 0===Object.entries(e).length&&e.constructor===Object},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},getFieldTitle:function(e,t){var o=!0,n=!1,a=void 0;try{for(var i,s,l=e[Symbol.iterator]();!(o=(i=l.next()).done);o=!0)if(s=i.value,s.field===t)return s.title}catch(e){n=!0,a=e}finally{try{o||null==l.return||l.return()}finally{if(n)throw a}}return\"\"},setFieldIndex:function(e){var t=0,o=[],n=!0,a=!1,s=void 0;try{for(var l,c,d=e[0][Symbol.iterator]();!(n=(l=d.next()).done);n=!0)c=l.value,t+=c.colspan||1}catch(e){a=!0,s=e}finally{try{n||null==d.return||d.return()}finally{if(a)throw s}}for(var p=0;p<e.length;p++){o[p]=[];for(var u=0;u<t;u++)o[p][u]=!1}for(var h=0;h<e.length;h++){var g=!0,f=!1,m=void 0;try{for(var b,y=e[h][Symbol.iterator]();!(g=(b=y.next()).done);g=!0){var w=b.value,r=w.rowspan||1,v=w.colspan||1,S=o[h].indexOf(!1);w.colspanIndex=S,1===v?(w.fieldIndex=S,\"undefined\"==typeof w.field&&(w.field=S)):w.colspanGroup=w.colspan;for(var x=0;x<r;x++)o[h+x][S]=!0;for(var T=0;T<v;T++)o[h][S+T]=!0}}catch(e){f=!0,m=e}finally{try{g||null==y.return||y.return()}finally{if(f)throw m}}}},updateFieldGroup:function(e){var t=e.flat(),o=!0,n=!1,a=void 0;try{for(var s,l=e[Symbol.iterator]();!(o=(s=l.next()).done);o=!0){var d=s.value,c=!0,p=!1,u=void 0;try{for(var h,g,f=d[Symbol.iterator]();!(c=(h=f.next()).done);c=!0)if(g=h.value,1<g.colspanGroup){for(var m=0,b=function(e){var o=t.find(function(t){return t.fieldIndex===e});o.visible&&m++},y=g.colspanIndex;y<g.colspanIndex+g.colspanGroup;y++)b(y);g.colspan=m,g.visible=0<m}}catch(e){p=!0,u=e}finally{try{c||null==f.return||f.return()}finally{if(p)throw u}}}}catch(e){n=!0,a=e}finally{try{o||null==l.return||l.return()}finally{if(n)throw a}}},getScrollBarWidth:function(){if(void 0===this.cachedWidth){var e=t(\"<div/>\").addClass(\"fixed-table-scroll-inner\"),o=t(\"<div/>\").addClass(\"fixed-table-scroll-outer\");o.append(e),t(\"body\").append(o);var n=e[0].offsetWidth;o.css(\"overflow\",\"scroll\");var a=e[0].offsetWidth;n===a&&(a=o[0].clientWidth),o.remove(),this.cachedWidth=n-a}return this.cachedWidth},calculateObjectValue:function(e,t,o,a){var i=t;if(\"string\"==typeof t){var s=t.split(\".\");if(1<s.length){i=window;var l=!0,c=!1,d=void 0;try{for(var p,u,h=s[Symbol.iterator]();!(l=(p=h.next()).done);l=!0)u=p.value,i=i[u]}catch(e){c=!0,d=e}finally{try{l||null==h.return||h.return()}finally{if(c)throw d}}}else i=window[t]}return null!==i&&\"object\"===n(i)?i:\"function\"==typeof i?i.apply(e,o||[]):!i&&\"string\"==typeof t&&this.sprintf.apply(this,[t].concat(r(o)))?this.sprintf.apply(this,[t].concat(r(o))):a},compareObjects:function(e,t,o){var n=Object.keys(e),a=Object.keys(t);if(o&&n.length!==a.length)return!1;for(var i,s=0,l=n;s<l.length;s++)if(i=l[s],a.includes(i)&&e[i]!==t[i])return!1;return!0},escapeHTML:function(e){return\"string\"==typeof e?e.replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/\"/g,\"&quot;\").replace(/'/g,\"&#039;\").replace(/`/g,\"&#x60;\"):e},getRealDataAttr:function(e){for(var t=0,o=Object.entries(e);t<o.length;t++){var n=l(o[t],2),a=n[0],i=n[1],s=a.split(/(?=[A-Z])/).join(\"-\").toLowerCase();s!==a&&(e[s]=i,delete e[a])}return e},getItemField:function(e,t,o){var n=e;if(\"string\"!=typeof t||e.hasOwnProperty(t))return o?this.escapeHTML(e[t]):e[t];var a=t.split(\".\"),i=!0,s=!1,l=void 0;try{for(var r,c,d=a[Symbol.iterator]();!(i=(r=d.next()).done);i=!0)c=r.value,n=n&&n[c]}catch(e){s=!0,l=e}finally{try{i||null==d.return||d.return()}finally{if(s)throw l}}return o?this.escapeHTML(n):n},isIEBrowser:function(){return navigator.userAgent.includes(\"MSIE \")||/Trident.*rv:11\\./.test(navigator.userAgent)},findIndex:function(e,t){var o=!0,n=!1,a=void 0;try{for(var i,s,l=e[Symbol.iterator]();!(o=(i=l.next()).done);o=!0)if(s=i.value,JSON.stringify(s)===JSON.stringify(t))return e.indexOf(s)}catch(e){n=!0,a=e}finally{try{o||null==l.return||l.return()}finally{if(n)throw a}}return-1},trToData:function(e,o){var n=this,a=[],i=[];return o.each(function(o,s){var l={};l._id=t(s).attr(\"id\"),l._class=t(s).attr(\"class\"),l._data=n.getRealDataAttr(t(s).data()),t(s).find(\">td,>th\").each(function(a,s){for(var r=+t(s).attr(\"colspan\")||1,c=+t(s).attr(\"rowspan\")||1,d=a;i[o]&&i[o][d];d++);for(var p=d;p<d+r;p++)for(var u=o;u<o+c;u++)i[u]||(i[u]=[]),i[u][p]=!0;var h=e[d].field;l[h]=t(s).html().trim(),l[\"_\".concat(h,\"_id\")]=t(s).attr(\"id\"),l[\"_\".concat(h,\"_class\")]=t(s).attr(\"class\"),l[\"_\".concat(h,\"_rowspan\")]=t(s).attr(\"rowspan\"),l[\"_\".concat(h,\"_colspan\")]=t(s).attr(\"colspan\"),l[\"_\".concat(h,\"_title\")]=t(s).attr(\"title\"),l[\"_\".concat(h,\"_data\")]=n.getRealDataAttr(t(s).data())}),a.push(l)}),a},sort:function(e,t,o,n){return((void 0===e||null===e)&&(e=\"\"),(void 0===t||null===t)&&(t=\"\"),n&&e===t&&(e=e._position,t=t._position),this.isNumeric(e)&&this.isNumeric(t))?(e=parseFloat(e),t=parseFloat(t),e<t?-1*o:e>t?o:0):e===t?0:(\"string\"!=typeof e&&(e=e.toString()),-1===e.localeCompare(t)?-1*o:o)}},wi=50,vi=4,Si=function(){function e(t){var o=this;a(this,e),this.rows=t.rows,this.scrollEl=t.scrollEl,this.contentEl=t.contentEl,this.callback=t.callback,this.itemHeight=t.itemHeight,this.cache={},this.scrollTop=this.scrollEl.scrollTop,this.initDOM(this.rows),this.scrollEl.scrollTop=this.scrollTop,this.lastCluster=0;var n=function(){o.lastCluster!==(o.lastCluster=o.getNum())&&(o.initDOM(o.rows),o.callback())};this.scrollEl.addEventListener(\"scroll\",n,!1),this.destroy=function(){o.contentEl.innerHtml=\"\",o.scrollEl.removeEventListener(\"scroll\",n,!1)}}return s(e,[{key:\"initDOM\",value:function(e){\"undefined\"==typeof this.clusterHeight&&(this.cache.data=this.contentEl.innerHTML=e[0]+e[0]+e[0],this.getRowsHeight(e));var t=this.initData(e,this.getNum()),o=t.rows.join(\"\"),n=this.checkChanges(\"data\",o),a=this.checkChanges(\"top\",t.topOffset),i=this.checkChanges(\"bottom\",t.bottomOffset),s=[];n&&a?(t.topOffset&&s.push(this.getExtra(\"top\",t.topOffset)),s.push(o),t.bottomOffset&&s.push(this.getExtra(\"bottom\",t.bottomOffset)),this.contentEl.innerHTML=s.join(\"\")):i&&(this.contentEl.lastChild.style.height=\"\".concat(t.bottomOffset,\"px\"))}},{key:\"getRowsHeight\",value:function(){if(\"undefined\"==typeof this.itemHeight){var e=this.contentEl.children,t=e[w(e.length/2)];this.itemHeight=t.offsetHeight}this.blockHeight=this.itemHeight*wi,this.clusterRows=wi*vi,this.clusterHeight=this.blockHeight*vi}},{key:\"getNum\",value:function(){return this.scrollTop=this.scrollEl.scrollTop,w(this.scrollTop/(this.clusterHeight-this.blockHeight))||0}},{key:\"initData\",value:function(e,t){if(e.length<wi)return{topOffset:0,bottomOffset:0,rowsAbove:0,rows:e};var o=b((this.clusterRows-wi)*t,0),n=o+this.clusterRows,a=b(o*this.itemHeight,0),s=b((e.length-n)*this.itemHeight,0),l=[],r=o;1>a&&r++;for(var c=o;c<n;c++)e[c]&&l.push(e[c]);return{topOffset:a,bottomOffset:s,rowsAbove:r,rows:l}}},{key:\"checkChanges\",value:function(e,t){var o=t!==this.cache[e];return this.cache[e]=t,o}},{key:\"getExtra\",value:function(e,t){var o=document.createElement(\"tr\");return o.className=\"virtual-scroll-\".concat(e),t&&(o.style.height=\"\".concat(t,\"px\")),o.outerHTML}}]),e}(),xi=function(){function e(o,n){a(this,e),this.options=n,this.$el=t(o),this.$el_=this.$el.clone(),this.timeoutId_=0,this.timeoutFooter_=0,this.init()}return s(e,[{key:\"init\",value:function(){this.initConstants(),this.initLocale(),this.initContainer(),this.initTable(),this.initHeader(),this.initData(),this.initHiddenRows(),this.initToolbar(),this.initPagination(),this.initBody(),this.initSearchText(),this.initServer()}},{key:\"initConstants\",value:function(){var e=this.options;this.constants=fi.CONSTANTS,this.constants.theme=t.fn.bootstrapTable.theme;var o=e.buttonsPrefix?\"\".concat(e.buttonsPrefix,\"-\"):\"\";this.constants.buttonsClass=[e.buttonsPrefix,o+e.buttonsClass,yi.sprintf(\"\".concat(o,\"%s\"),e.iconSize)].join(\" \").trim()}},{key:\"initLocale\",value:function(){if(this.options.locale){var e=t.fn.bootstrapTable.locales,o=this.options.locale.split(/-|_/);o[0]=o[0].toLowerCase(),o[1]&&(o[1]=o[1].toUpperCase()),e[this.options.locale]?t.extend(this.options,e[this.options.locale]):e[o.join(\"-\")]?t.extend(this.options,e[o.join(\"-\")]):e[o[0]]&&t.extend(this.options,e[o[0]])}}},{key:\"initContainer\",value:function(){var e=[\"top\",\"both\"].includes(this.options.paginationVAlign)?\"<div class=\\\"fixed-table-pagination clearfix\\\"></div>\":\"\",o=[\"bottom\",\"both\"].includes(this.options.paginationVAlign)?\"<div class=\\\"fixed-table-pagination\\\"></div>\":\"\";this.$container=t(\"\\n      <div class=\\\"bootstrap-table \".concat(this.constants.theme,\"\\\">\\n      <div class=\\\"fixed-table-toolbar\\\"></div>\\n      \").concat(e,\"\\n      <div class=\\\"fixed-table-container\\\">\\n      <div class=\\\"fixed-table-header\\\"><table></table></div>\\n      <div class=\\\"fixed-table-body\\\">\\n      <div class=\\\"fixed-table-loading\\\">\\n      <span class=\\\"loading-wrap\\\">\\n      <span class=\\\"loading-text\\\">\").concat(this.options.formatLoadingMessage(),\"</span>\\n      <span class=\\\"animation-wrap\\\"><span class=\\\"animation-dot\\\"></span></span>\\n      </span>\\n      </div>\\n      </div>\\n      <div class=\\\"fixed-table-footer\\\"><table><thead><tr></tr></thead></table></div>\\n      </div>\\n      \").concat(o,\"\\n      </div>\\n    \")),this.$container.insertAfter(this.$el),this.$tableContainer=this.$container.find(\".fixed-table-container\"),this.$tableHeader=this.$container.find(\".fixed-table-header\"),this.$tableBody=this.$container.find(\".fixed-table-body\"),this.$tableLoading=this.$container.find(\".fixed-table-loading\"),this.$tableFooter=this.$el.find(\"tfoot\"),this.$toolbar=this.options.buttonsToolbar?t(\"body\").find(this.options.buttonsToolbar):this.$container.find(\".fixed-table-toolbar\"),this.$pagination=this.$container.find(\".fixed-table-pagination\"),this.$tableBody.append(this.$el),this.$container.after(\"<div class=\\\"clearfix\\\"></div>\"),this.$el.addClass(this.options.classes),this.$tableLoading.addClass(this.options.classes),this.options.height?(this.$tableContainer.addClass(\"fixed-height\"),this.options.showFooter&&this.$tableContainer.addClass(\"has-footer\"),this.options.classes.split(\" \").includes(\"table-bordered\")&&(this.$tableBody.append(\"<div class=\\\"fixed-table-border\\\"></div>\"),this.$tableBorder=this.$tableBody.find(\".fixed-table-border\"),this.$tableLoading.addClass(\"fixed-table-border\")),this.$tableFooter=this.$container.find(\".fixed-table-footer\")):!this.$tableFooter.length&&(this.$el.append(\"<tfoot><tr></tr></tfoot>\"),this.$tableFooter=this.$el.find(\"tfoot\"))}},{key:\"initTable\",value:function(){var o=this,n=[];this.$header=this.$el.find(\">thead\"),this.$header.length?this.options.theadClasses&&this.$header.addClass(this.options.theadClasses):this.$header=t(\"<thead class=\\\"\".concat(this.options.theadClasses,\"\\\"></thead>\")).appendTo(this.$el),this.$header.find(\"tr\").each(function(e,o){var a=[];t(o).find(\"th\").each(function(e,o){\"undefined\"!=typeof t(o).data(\"field\")&&t(o).data(\"field\",\"\".concat(t(o).data(\"field\"))),a.push(t.extend({},{title:t(o).html(),class:t(o).attr(\"class\"),titleTooltip:t(o).attr(\"title\"),rowspan:t(o).attr(\"rowspan\")?+t(o).attr(\"rowspan\"):void 0,colspan:t(o).attr(\"colspan\")?+t(o).attr(\"colspan\"):void 0},t(o).data()))}),n.push(a)}),Array.isArray(this.options.columns[0])||(this.options.columns=[this.options.columns]),this.options.columns=t.extend(!0,[],n,this.options.columns),this.columns=[],this.fieldsColumnsIndex=[],yi.setFieldIndex(this.options.columns),this.options.columns.forEach(function(n,a){n.forEach(function(n,i){var s=t.extend({},e.COLUMN_DEFAULTS,n);\"undefined\"!=typeof s.fieldIndex&&(o.columns[s.fieldIndex]=s,o.fieldsColumnsIndex[s.field]=s.fieldIndex),o.options.columns[a][i]=s})}),this.options.data.length||(this.options.data=yi.trToData(this.columns,this.$el.find(\">tbody>tr\")),[].length&&(this.fromHtml=!0)),this.footerData=yi.trToData(this.columns,this.$el.find(\">tfoot>tr\")),this.footerData&&this.$el.find(\"tfoot\").html(\"<tr></tr>\"),!this.options.showFooter||this.options.cardView?this.$tableFooter.hide():this.$tableFooter.show()}},{key:\"initHeader\",value:function(){var o=this,n={},a=[];this.header={fields:[],styles:[],classes:[],formatters:[],detailFormatters:[],events:[],sorters:[],sortNames:[],cellStyles:[],searchables:[]},yi.updateFieldGroup(this.options.columns),this.options.columns.forEach(function(e,t){a.push(\"<tr>\"),0===t&&!o.options.cardView&&o.options.detailView&&o.options.detailViewIcon&&a.push(\"<th class=\\\"detail\\\" rowspan=\\\"\".concat(o.options.columns.length,\"\\\">\\n          <div class=\\\"fht-cell\\\"></div>\\n          </th>\\n        \")),e.forEach(function(e,i){var s=yi.sprintf(\" class=\\\"%s\\\"\",e[\"class\"]),l=e.widthUnit,r=parseFloat(e.width),c=yi.sprintf(\"text-align: %s; \",e.halign?e.halign:e.align),d=yi.sprintf(\"text-align: %s; \",e.align),p=yi.sprintf(\"vertical-align: %s; \",e.valign);if(p+=yi.sprintf(\"width: %s; \",(e.checkbox||e.radio)&&!r?e.showSelectTitle?void 0:\"36px\":r?r+l:void 0),\"undefined\"!=typeof e.fieldIndex||e.visible){if(\"undefined\"!=typeof e.fieldIndex){if(o.header.fields[e.fieldIndex]=e.field,o.header.styles[e.fieldIndex]=d+p,o.header.classes[e.fieldIndex]=s,o.header.formatters[e.fieldIndex]=e.formatter,o.header.detailFormatters[e.fieldIndex]=e.detailFormatter,o.header.events[e.fieldIndex]=e.events,o.header.sorters[e.fieldIndex]=e.sorter,o.header.sortNames[e.fieldIndex]=e.sortName,o.header.cellStyles[e.fieldIndex]=e.cellStyle,o.header.searchables[e.fieldIndex]=e.searchable,!e.visible)return;if(o.options.cardView&&!e.cardVisible)return;n[e.field]=e}a.push(\"<th\".concat(yi.sprintf(\" title=\\\"%s\\\"\",e.titleTooltip)),e.checkbox||e.radio?yi.sprintf(\" class=\\\"bs-checkbox %s\\\"\",e[\"class\"]||\"\"):s,yi.sprintf(\" style=\\\"%s\\\"\",c+p),yi.sprintf(\" rowspan=\\\"%s\\\"\",e.rowspan),yi.sprintf(\" colspan=\\\"%s\\\"\",e.colspan),yi.sprintf(\" data-field=\\\"%s\\\"\",e.field),0===i&&0<t?\" data-not-first-th\":\"\",\">\"),a.push(yi.sprintf(\"<div class=\\\"th-inner %s\\\">\",o.options.sortable&&e.sortable?\"sortable both\":\"\"));var u=o.options.escape?yi.escapeHTML(e.title):e.title,h=u;e.checkbox&&(u=\"\",!o.options.singleSelect&&o.options.checkboxHeader&&(u=\"<label><input name=\\\"btSelectAll\\\" type=\\\"checkbox\\\" /><span></span></label>\"),o.header.stateField=e.field),e.radio&&(u=\"\",o.header.stateField=e.field,o.options.singleSelect=!0),!u&&e.showSelectTitle&&(u+=h),a.push(u),a.push(\"</div>\"),a.push(\"<div class=\\\"fht-cell\\\"></div>\"),a.push(\"</div>\"),a.push(\"</th>\")}}),a.push(\"</tr>\")}),this.$header.html(a.join(\"\")),this.$header.find(\"th[data-field]\").each(function(e,o){t(o).data(n[t(o).data(\"field\")])}),this.$container.off(\"click\",\".th-inner\").on(\"click\",\".th-inner\",function(n){var e=t(n.currentTarget);return(!o.options.detailView||e.parent().hasClass(\"bs-checkbox\")||e.closest(\".bootstrap-table\")[0]===o.$container[0])&&void(o.options.sortable&&e.parent().data().sortable&&o.onSort(n))}),this.$header.children().children().off(\"keypress\").on(\"keypress\",function(n){if(o.options.sortable&&t(n.currentTarget).data().sortable){var e=n.keyCode||n.which;13===e&&o.onSort(n)}});var i=\"resize.bootstrap-table\".concat(this.$el.attr(\"id\")||\"\");t(window).off(i),!this.options.showHeader||this.options.cardView?(this.$header.hide(),this.$tableHeader.hide(),this.$tableLoading.css(\"top\",0)):(this.$header.show(),this.$tableHeader.show(),this.$tableLoading.css(\"top\",this.$header.outerHeight()+1),this.getCaret(),t(window).on(i,function(t){return o.resetWidth(t)})),this.$selectAll=this.$header.find(\"[name=\\\"btSelectAll\\\"]\"),this.$selectAll.off(\"click\").on(\"click\",function(e){var n=e.currentTarget,a=t(n).prop(\"checked\");o[a?\"checkAll\":\"uncheckAll\"](),o.updateSelected()})}},{key:\"initData\",value:function(e,t){this.options.data=\"append\"===t?this.options.data.concat(e):\"prepend\"===t?[].concat(e).concat(this.options.data):e||this.options.data,this.data=this.options.data,\"server\"===this.options.sidePagination||this.initSort()}},{key:\"initSort\",value:function(){var e=this,t=this.options.sortName,o=\"desc\"===this.options.sortOrder?-1:1,n=this.header.fields.indexOf(this.options.sortName),a=0;-1!==n&&(this.options.sortStable&&this.data.forEach(function(e,t){e.hasOwnProperty(\"_position\")||(e._position=t)}),this.options.customSort?yi.calculateObjectValue(this.options,this.options.customSort,[this.options.sortName,this.options.sortOrder,this.data]):this.data.sort(function(i,a){e.header.sortNames[n]&&(t=e.header.sortNames[n]);var s=yi.getItemField(i,t,e.options.escape),l=yi.getItemField(a,t,e.options.escape),r=yi.calculateObjectValue(e.header,e.header.sorters[n],[s,l,i,a]);return void 0===r?yi.sort(s,l,o,e.options.sortStable):e.options.sortStable&&0===r?o*(i._position-a._position):o*r}),void 0!==this.options.sortClass&&(clearTimeout(a),a=setTimeout(function(){e.$el.removeClass(e.options.sortClass);var t=e.$header.find(\"[data-field=\\\"\".concat(e.options.sortName,\"\\\"]\")).index();e.$el.find(\"tr td:nth-child(\".concat(t+1,\")\")).addClass(e.options.sortClass)},250)))}},{key:\"onSort\",value:function(e){var o=e.type,n=e.currentTarget,a=\"keypress\"===o?t(n):t(n).parent(),i=this.$header.find(\"th\").eq(a.index());return this.$header.add(this.$header_).find(\"span.order\").remove(),this.options.sortName===a.data(\"field\")?this.options.sortOrder=\"asc\"===this.options.sortOrder?\"desc\":\"asc\":(this.options.sortName=a.data(\"field\"),this.options.sortOrder=this.options.rememberOrder?\"asc\"===a.data(\"order\")?\"desc\":\"asc\":this.columns[this.fieldsColumnsIndex[a.data(\"field\")]].sortOrder||this.columns[this.fieldsColumnsIndex[a.data(\"field\")]].order),this.trigger(\"sort\",this.options.sortName,this.options.sortOrder),a.add(i).data(\"order\",this.options.sortOrder),this.getCaret(),\"server\"===this.options.sidePagination?(this.options.pageNumber=1,void this.initServer(this.options.silentSort)):void(this.initSort(),this.initBody())}},{key:\"initToolbar\",value:function(){var e,a,s=this,l=this.options,o=[],i=0,r=0;if(this.$toolbar.find(\".bs-bars\").children().length&&t(\"body\").append(t(l.toolbar)),this.$toolbar.html(\"\"),(\"string\"==typeof l.toolbar||\"object\"===n(l.toolbar))&&t(yi.sprintf(\"<div class=\\\"bs-bars %s-%s\\\"></div>\",this.constants.classes.pull,l.toolbarAlign)).appendTo(this.$toolbar).append(t(l.toolbar)),o=[\"<div class=\\\"\".concat([\"columns\",\"columns-\".concat(l.buttonsAlign),this.constants.classes.buttonsGroup,\"\".concat(this.constants.classes.pull,\"-\").concat(l.buttonsAlign)].join(\" \"),\"\\\">\")],\"string\"==typeof l.icons&&(l.icons=yi.calculateObjectValue(null,l.icons)),l.showPaginationSwitch&&o.push(\"<button class=\\\"\".concat(this.constants.buttonsClass,\"\\\" type=\\\"button\\\" name=\\\"paginationSwitch\\\"\\n        aria-label=\\\"Pagination Switch\\\" title=\\\"\").concat(l.formatPaginationSwitch(),\"\\\">\\n        \").concat(l.showButtonIcons?yi.sprintf(this.constants.html.icon,l.iconsPrefix,l.icons.paginationSwitchDown):\"\",\"\\n        \").concat(l.showButtonText?l.formatPaginationSwitchUp():\"\",\"\\n        </button>\")),l.showRefresh&&o.push(\"<button class=\\\"\".concat(this.constants.buttonsClass,\"\\\" type=\\\"button\\\" name=\\\"refresh\\\"\\n        aria-label=\\\"Refresh\\\" title=\\\"\").concat(l.formatRefresh(),\"\\\">\\n        \").concat(l.showButtonIcons?yi.sprintf(this.constants.html.icon,l.iconsPrefix,l.icons.refresh):\"\",\"\\n        \").concat(l.showButtonText?l.formatRefresh():\"\",\"\\n        </button>\")),l.showToggle&&o.push(\"<button class=\\\"\".concat(this.constants.buttonsClass,\"\\\" type=\\\"button\\\" name=\\\"toggle\\\"\\n        aria-label=\\\"Toggle\\\" title=\\\"\").concat(l.formatToggle(),\"\\\">\\n        \").concat(l.showButtonIcons?yi.sprintf(this.constants.html.icon,l.iconsPrefix,l.icons.toggleOff):\"\",\"\\n        \").concat(l.showButtonText?l.formatToggleOn():\"\",\"\\n        </button>\")),l.showFullscreen&&o.push(\"<button class=\\\"\".concat(this.constants.buttonsClass,\"\\\" type=\\\"button\\\" name=\\\"fullscreen\\\"\\n        aria-label=\\\"Fullscreen\\\" title=\\\"\").concat(l.formatFullscreen(),\"\\\">\\n        \").concat(l.showButtonIcons?yi.sprintf(this.constants.html.icon,l.iconsPrefix,l.icons.fullscreen):\"\",\"\\n        \").concat(l.showButtonText?l.formatFullscreen():\"\",\"\\n        </button>\")),l.showColumns){if(o.push(\"<div class=\\\"keep-open \".concat(this.constants.classes.buttonsDropdown,\"\\\" title=\\\"\").concat(l.formatColumns(),\"\\\">\\n        <button class=\\\"\").concat(this.constants.buttonsClass,\" dropdown-toggle\\\" type=\\\"button\\\" data-toggle=\\\"dropdown\\\"\\n        aria-label=\\\"Columns\\\" title=\\\"\").concat(l.formatColumns(),\"\\\">\\n        \").concat(l.showButtonIcons?yi.sprintf(this.constants.html.icon,l.iconsPrefix,l.icons.columns):\"\",\"\\n        \").concat(l.showButtonText?l.formatColumns():\"\",\"\\n        \").concat(this.constants.html.dropdownCaret,\"\\n        </button>\\n        \").concat(this.constants.html.toolbarDropdown[0])),l.showColumnsToggleAll){var c=this.getVisibleColumns().length===this.columns.length;o.push(yi.sprintf(this.constants.html.toolbarDropdownItem,yi.sprintf(\"<input type=\\\"checkbox\\\" class=\\\"toggle-all\\\" %s> <span>%s</span>\",c?\"checked=\\\"checked\\\"\":\"\",l.formatColumnsToggleAll()))),o.push(this.constants.html.toolbarDropdownSeperator)}this.columns.forEach(function(e,t){if(!(e.radio||e.checkbox)&&(!l.cardView||e.cardVisible)){var n=e.visible?\" checked=\\\"checked\\\"\":\"\";e.switchable&&(o.push(yi.sprintf(s.constants.html.toolbarDropdownItem,yi.sprintf(\"<input type=\\\"checkbox\\\" data-field=\\\"%s\\\" value=\\\"%s\\\"%s> <span>%s</span>\",e.field,t,n,e.title))),r++)}}),o.push(this.constants.html.toolbarDropdown[1],\"</div>\")}if(o.push(\"</div>\"),(this.showToolbar||2<o.length)&&this.$toolbar.append(o.join(\"\")),l.showPaginationSwitch&&this.$toolbar.find(\"button[name=\\\"paginationSwitch\\\"]\").off(\"click\").on(\"click\",function(){return s.togglePagination()}),l.showFullscreen&&this.$toolbar.find(\"button[name=\\\"fullscreen\\\"]\").off(\"click\").on(\"click\",function(){return s.toggleFullscreen()}),l.showRefresh&&this.$toolbar.find(\"button[name=\\\"refresh\\\"]\").off(\"click\").on(\"click\",function(){return s.refresh()}),l.showToggle&&this.$toolbar.find(\"button[name=\\\"toggle\\\"]\").off(\"click\").on(\"click\",function(){s.toggleView()}),l.showColumns){e=this.$toolbar.find(\".keep-open\");var d=e.find(\"input:not(\\\".toggle-all\\\")\"),p=e.find(\"input.toggle-all\");r<=l.minimumCountColumns&&e.find(\"input\").prop(\"disabled\",!0),e.find(\"li, label\").off(\"click\").on(\"click\",function(t){t.stopImmediatePropagation()}),d.off(\"click\").on(\"click\",function(e){var o=e.currentTarget,n=t(o);s._toggleColumn(n.val(),n.prop(\"checked\"),!1),s.trigger(\"column-switch\",n.data(\"field\"),n.prop(\"checked\")),p.prop(\"checked\",d.filter(\":checked\").length===s.columns.length)}),p.off(\"click\").on(\"click\",function(e){var o=e.currentTarget;s._toggleAllColumns(t(o).prop(\"checked\"))})}if(l.search||this.showSearchClearButton){o=[];var u=yi.sprintf(this.constants.html.searchButton,this.constants.buttonsClass,l.formatSearch(),l.showButtonIcons?yi.sprintf(this.constants.html.icon,l.iconsPrefix,l.icons.search):\"\",l.showButtonText?l.formatSearch():\"\"),h=yi.sprintf(this.constants.html.searchClearButton,this.constants.buttonsClass,l.formatClearSearch(),l.showButtonIcons?yi.sprintf(this.constants.html.icon,l.iconsPrefix,l.icons.clearSearch):\"\",l.showButtonText?l.formatClearSearch():\"\"),g=\"<input class=\\\"\".concat(this.constants.classes.input).concat(yi.sprintf(\" input-%s\",l.iconSize),\" search-input\\\" type=\\\"text\\\" placeholder=\\\"\").concat(l.formatSearch(),\"\\\">\"),f=g;if(l.showSearchButton||l.showSearchClearButton){var m=(l.showSearchButton?u:\"\")+(l.showSearchClearButton?h:\"\");f=l.search?yi.sprintf(this.constants.html.inputGroup,g,m):m}o.push(yi.sprintf(\"\\n        <div class=\\\"\".concat(this.constants.classes.pull,\"-\").concat(l.searchAlign,\" search \").concat(this.constants.classes.inputGroup,\"\\\">\\n          %s\\n        </div>\\n      \"),f)),this.$toolbar.append(o.join(\"\"));var b=this.$toolbar.find(\".search input\");a=l.showSearchButton?this.$toolbar.find(\".search button[name=search]\"):b;var y=l.showSearchButton?\"click\":yi.isIEBrowser()?\"mouseup\":\"keyup drop blur\";a.off(y).on(y,function(e){l.searchOnEnterKey&&13!==e.keyCode||[37,38,39,40].includes(e.keyCode)||(clearTimeout(i),i=setTimeout(function(){s.onSearch(l.showSearchButton?{currentTarget:b}:e)},l.searchTimeOut))}),l.showSearchClearButton&&this.$toolbar.find(\".search button[name=clearSearch]\").click(function(){s.resetSearch()})}}},{key:\"onSearch\",value:function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},o=e.currentTarget,n=e.firedByInitSearchText,a=!(1<arguments.length&&void 0!==arguments[1])||arguments[1];if(void 0!==o&&t(o).length&&a){var i=t(o).val().trim();if(this.options.trimOnSearch&&t(o).val()!==i&&t(o).val(i),this.searchText===i)return;t(o).hasClass(\"search-input\")&&(this.searchText=i,this.options.searchText=i)}n||(this.options.pageNumber=1),this.initSearch(),n?\"client\"===this.options.sidePagination&&this.updatePagination():this.updatePagination(),this.trigger(\"search\",this.searchText)}},{key:\"initSearch\",value:function(){var e=this;if(this.filterOptions=this.filterOptions||this.options.filterOptions,\"server\"!==this.options.sidePagination){if(this.options.customSearch)return void(this.data=yi.calculateObjectValue(this.options,this.options.customSearch,[this.options.data,this.searchText,this.filterColumns]));var t=this.searchText&&(this.options.escape?yi.escapeHTML(this.searchText):this.searchText).toLowerCase(),o=yi.isEmptyObject(this.filterColumns)?null:this.filterColumns;\"function\"==typeof this.filterOptions.filterAlgorithm?this.data=this.options.data.filter(function(t){return e.filterOptions.filterAlgorithm.apply(null,[t,o])}):\"string\"==typeof this.filterOptions.filterAlgorithm&&(this.data=o?this.options.data.filter(function(t){var n=e.filterOptions.filterAlgorithm;if(\"and\"===n){for(var a in o)if(Array.isArray(o[a])&&!o[a].includes(t[a])||!Array.isArray(o[a])&&t[a]!==o[a])return!1;}else if(\"or\"===n){var i=!1;for(var s in o)(Array.isArray(o[s])&&o[s].includes(t[s])||!Array.isArray(o[s])&&t[s]===o[s])&&(i=!0);return i}return!0}):this.options.data);var n=this.getVisibleFields();this.data=t?this.data.filter(function(o,a){for(var i=0;i<e.header.fields.length;i++)if(e.header.searchables[i]&&(!e.options.visibleSearch||-1!==n.indexOf(e.header.fields[i]))){var s=yi.isNumeric(e.header.fields[i])?parseInt(e.header.fields[i],10):e.header.fields[i],l=e.columns[e.fieldsColumnsIndex[s]],r=void 0;if(\"string\"==typeof s){r=o;for(var c=s.split(\".\"),d=0;d<c.length;d++)null!==r[c[d]]&&(r=r[c[d]])}else r=o[s];if(l&&l.searchFormatter&&(r=yi.calculateObjectValue(l,e.header.formatters[i],[r,o,a,l.field],r)),\"string\"==typeof r||\"number\"==typeof r)if(!e.options.strictSearch){var p=/(?:(<=|=>|=<|>=|>|<)(?:\\s+)?(\\d+)?|(\\d+)?(\\s+)?(<=|=>|=<|>=|>|<))/gm,u=p.exec(t),h=!1;if(u){var g=u[1]||\"\".concat(u[5],\"l\"),f=u[2]||u[3],m=parseInt(r,10),b=parseInt(f,10);switch(g){case\">\":case\"<l\":h=m>b;break;case\"<\":case\">l\":h=m<b;break;case\"<=\":case\"=<\":case\">=l\":case\"=>l\":h=m<=b;break;case\">=\":case\"=>\":case\"<=l\":case\"=<l\":h=m>=b;break;default:}}if(h||\"\".concat(r).toLowerCase().includes(t))return!0}else if(\"\".concat(r).toLowerCase()===t)return!0}return!1}):this.data}}},{key:\"initPagination\",value:function(){var e=Math.round,t=this,n=this.options;if(!n.pagination)return void this.$pagination.hide();this.$pagination.show();var o,a,s,l,r,c,d,p=[],u=!1,h=this.getData({includeHiddenRows:!1}),g=n.pageList;if(\"server\"!==n.sidePagination&&(n.totalRows=h.length),this.totalPages=0,n.totalRows){if(n.pageSize===n.formatAllRows())n.pageSize=n.totalRows,u=!0;else if(n.pageSize===n.totalRows){var f=\"string\"==typeof n.pageList?n.pageList.replace(\"[\",\"\").replace(\"]\",\"\").replace(/ /g,\"\").toLowerCase().split(\",\"):n.pageList;f.includes(n.formatAllRows().toLowerCase())&&(u=!0)}this.totalPages=~~((n.totalRows-1)/n.pageSize)+1,n.totalPages=this.totalPages}0<this.totalPages&&n.pageNumber>this.totalPages&&(n.pageNumber=this.totalPages),this.pageFrom=(n.pageNumber-1)*n.pageSize+1,this.pageTo=n.pageNumber*n.pageSize,this.pageTo>n.totalRows&&(this.pageTo=n.totalRows),this.options.pagination&&\"server\"!==this.options.sidePagination&&(this.options.totalNotFiltered=this.options.data.length),this.options.showExtendedPagination||(this.options.totalNotFiltered=void 0);var m=n.onlyInfoPagination?n.formatDetailPagination(n.totalRows):n.formatShowingRows(this.pageFrom,this.pageTo,n.totalRows,n.totalNotFiltered);if(p.push(\"<div class=\\\"\".concat(this.constants.classes.pull,\"-\").concat(n.paginationDetailHAlign,\" pagination-detail\\\">\\n      <span class=\\\"pagination-info\\\">\\n      \").concat(m,\"\\n      </span>\")),!n.onlyInfoPagination){p.push(\"<span class=\\\"page-list\\\">\");var b=[\"<span class=\\\"\".concat(this.constants.classes.paginationDropdown,\"\\\">\\n        <button class=\\\"\").concat(this.constants.buttonsClass,\" dropdown-toggle\\\" type=\\\"button\\\" data-toggle=\\\"dropdown\\\">\\n        <span class=\\\"page-size\\\">\\n        \").concat(u?n.formatAllRows():n.pageSize,\"\\n        </span>\\n        \").concat(this.constants.html.dropdownCaret,\"\\n        </button>\\n        \").concat(this.constants.html.pageDropdown[0])];if(\"string\"==typeof n.pageList){var y=n.pageList.replace(\"[\",\"\").replace(\"]\",\"\").replace(/ /g,\"\").split(\",\");g=[];var w=!0,v=!1,S=void 0;try{for(var x,k,T=y[Symbol.iterator]();!(w=(x=T.next()).done);w=!0)k=x.value,g.push(k.toLowerCase()===n.formatAllRows().toLowerCase()||[\"all\",\"unlimited\"].includes(k.toLowerCase())?n.formatAllRows():+k)}catch(e){v=!0,S=e}finally{try{w||null==T.return||T.return()}finally{if(v)throw S}}}g.forEach(function(e,o){if(!n.smartDisplay||0===o||g[o-1]<n.totalRows){var a;a=u?e===n.formatAllRows()?t.constants.classes.dropdownActive:\"\":e===n.pageSize?t.constants.classes.dropdownActive:\"\",b.push(yi.sprintf(t.constants.html.pageDropdownItem,a,e))}}),b.push(\"\".concat(this.constants.html.pageDropdown[1],\"</span>\")),p.push(n.formatRecordsPerPage(b.join(\"\"))),p.push(\"</span></div>\"),p.push(\"<div class=\\\"\".concat(this.constants.classes.pull,\"-\").concat(n.paginationHAlign,\" pagination\\\">\"),yi.sprintf(this.constants.html.pagination[0],yi.sprintf(\" pagination-%s\",n.iconSize)),yi.sprintf(this.constants.html.paginationItem,\" page-pre\",n.formatSRPaginationPreText(),n.paginationPreText)),this.totalPages<n.paginationSuccessivelySize?(a=1,s=this.totalPages):(a=n.pageNumber-n.paginationPagesBySide,s=a+2*n.paginationPagesBySide),n.pageNumber<n.paginationSuccessivelySize-1&&(s=n.paginationSuccessivelySize),n.paginationSuccessivelySize>this.totalPages-a&&(a=a-(n.paginationSuccessivelySize-(this.totalPages-a))+1),1>a&&(a=1),s>this.totalPages&&(s=this.totalPages);var P=e(n.paginationPagesBySide/2),O=function(e){var o=1<arguments.length&&void 0!==arguments[1]?arguments[1]:\"\";return yi.sprintf(t.constants.html.paginationItem,o+(e===n.pageNumber?\" \".concat(t.constants.classes.paginationActive):\"\"),n.formatSRPaginationPageText(e),e)};if(1<a){var C=n.paginationPagesBySide;for(C>=a&&(C=a-1),o=1;o<=C;o++)p.push(O(o));a-1===C+1?(o=a-1,p.push(O(o))):a-1>C&&(a-2*n.paginationPagesBySide>n.paginationPagesBySide&&n.paginationUseIntermediate?(o=e((a-P)/2+P),p.push(O(o,\" page-intermediate\"))):p.push(yi.sprintf(this.constants.html.paginationItem,\" page-first-separator disabled\",\"\",\"...\")))}for(o=a;o<=s;o++)p.push(O(o));if(this.totalPages>s){var I=this.totalPages-(n.paginationPagesBySide-1);for(s>=I&&(I=s+1),s+1===I-1?(o=s+1,p.push(O(o))):I>s+1&&(this.totalPages-s>2*n.paginationPagesBySide&&n.paginationUseIntermediate?(o=e((this.totalPages-P-s)/2+s),p.push(O(o,\" page-intermediate\"))):p.push(yi.sprintf(this.constants.html.paginationItem,\" page-last-separator disabled\",\"\",\"...\"))),o=I;o<=this.totalPages;o++)p.push(O(o))}p.push(yi.sprintf(this.constants.html.paginationItem,\" page-next\",n.formatSRPaginationNextText(),n.paginationNextText)),p.push(this.constants.html.pagination[1],\"</div>\")}this.$pagination.html(p.join(\"\"));var $=[\"bottom\",\"both\"].includes(n.paginationVAlign)?\" \".concat(this.constants.classes.dropup):\"\";this.$pagination.last().find(\".page-list > span\").addClass($),n.onlyInfoPagination||(l=this.$pagination.find(\".page-list a\"),r=this.$pagination.find(\".page-pre\"),c=this.$pagination.find(\".page-next\"),d=this.$pagination.find(\".page-item\").not(\".page-next, .page-pre, .page-last-separator, .page-first-separator\"),1>=this.totalPages&&this.$pagination.find(\"div.pagination\").hide(),n.smartDisplay&&(2>g.length||n.totalRows<=g[0])&&this.$pagination.find(\"span.page-list\").hide(),this.$pagination[this.getData().length?\"show\":\"hide\"](),!n.paginationLoop&&(1===n.pageNumber&&r.addClass(\"disabled\"),n.pageNumber===this.totalPages&&c.addClass(\"disabled\")),u&&(n.pageSize=n.formatAllRows()),l.off(\"click\").on(\"click\",function(o){return t.onPageListChange(o)}),r.off(\"click\").on(\"click\",function(o){return t.onPagePre(o)}),c.off(\"click\").on(\"click\",function(o){return t.onPageNext(o)}),d.off(\"click\").on(\"click\",function(o){return t.onPageNumber(o)}))}},{key:\"updatePagination\",value:function(e){e&&t(e.currentTarget).hasClass(\"disabled\")||(!this.options.maintainMetaData&&this.resetRows(),this.initPagination(),\"server\"===this.options.sidePagination?this.initServer():this.initBody(),this.trigger(\"page-change\",this.options.pageNumber,this.options.pageSize))}},{key:\"onPageListChange\",value:function(e){e.preventDefault();var o=t(e.currentTarget);return o.parent().addClass(this.constants.classes.dropdownActive).siblings().removeClass(this.constants.classes.dropdownActive),this.options.pageSize=o.text().toUpperCase()===this.options.formatAllRows().toUpperCase()?this.options.formatAllRows():+o.text(),this.$toolbar.find(\".page-size\").text(this.options.pageSize),this.updatePagination(e),!1}},{key:\"onPagePre\",value:function(e){return e.preventDefault(),0==this.options.pageNumber-1?this.options.pageNumber=this.options.totalPages:this.options.pageNumber--,this.updatePagination(e),!1}},{key:\"onPageNext\",value:function(e){return e.preventDefault(),this.options.pageNumber+1>this.options.totalPages?this.options.pageNumber=1:this.options.pageNumber++,this.updatePagination(e),!1}},{key:\"onPageNumber\",value:function(e){if(e.preventDefault(),this.options.pageNumber!==+t(e.currentTarget).text())return this.options.pageNumber=+t(e.currentTarget).text(),this.updatePagination(e),!1}},{key:\"initRow\",value:function(e,t){var o=this,a=[],i={},s=[],r=\"\",c={},d=[];if(!(-1<yi.findIndex(this.hiddenRows,e))){if(i=yi.calculateObjectValue(this.options,this.options.rowStyle,[e,t],i),i&&i.css)for(var p=0,u=Object.entries(i.css);p<u.length;p++){var h=l(u[p],2),g=h[0],f=h[1];s.push(\"\".concat(g,\": \").concat(f))}if(c=yi.calculateObjectValue(this.options,this.options.rowAttributes,[e,t],c),c)for(var m=0,b=Object.entries(c);m<b.length;m++){var y=l(b[m],2),g=y[0],f=y[1];d.push(\"\".concat(g,\"=\\\"\").concat(yi.escapeHTML(f),\"\\\"\"))}if(e._data&&!yi.isEmptyObject(e._data))for(var w=0,S=Object.entries(e._data);w<S.length;w++){var x=l(S[w],2),T=x[0],k=x[1];if(\"index\"===T)return;r+=\" data-\".concat(T,\"='\").concat(\"object\"===n(k)?JSON.stringify(k):k,\"'\")}return a.push(\"<tr\",yi.sprintf(\" %s\",d.length?d.join(\" \"):void 0),yi.sprintf(\" id=\\\"%s\\\"\",Array.isArray(e)?void 0:e._id),yi.sprintf(\" class=\\\"%s\\\"\",i.classes||(Array.isArray(e)?void 0:e._class)),\" data-index=\\\"\".concat(t,\"\\\"\"),yi.sprintf(\" data-uniqueid=\\\"%s\\\"\",yi.getItemField(e,this.options.uniqueId,!1)),yi.sprintf(\" data-has-detail-view=\\\"%s\\\"\",!this.options.cardView&&this.options.detailView&&yi.calculateObjectValue(null,this.options.detailFilter,[t,e])?\"true\":void 0),yi.sprintf(\"%s\",r),\">\"),this.options.cardView&&a.push(\"<td colspan=\\\"\".concat(this.header.fields.length,\"\\\"><div class=\\\"card-views\\\">\")),!this.options.cardView&&this.options.detailView&&this.options.detailViewIcon&&(a.push(\"<td>\"),yi.calculateObjectValue(null,this.options.detailFilter,[t,e])&&a.push(\"\\n          <a class=\\\"detail-icon\\\" href=\\\"#\\\">\\n          \".concat(yi.sprintf(this.constants.html.icon,this.options.iconsPrefix,this.options.icons.detailOpen),\"\\n          </a>\\n        \")),a.push(\"</td>\")),this.header.fields.forEach(function(n,i){var r=\"\",d=yi.getItemField(e,n,o.options.escape),p=\"\",u=\"\",h={},g=\"\",f=o.header.classes[i],m=\"\",b=\"\",y=\"\",w=\"\",S=\"\",x=o.columns[i];if((!o.fromHtml||\"undefined\"!=typeof d||x.checkbox||x.radio)&&x.visible&&(!o.options.cardView||x.cardVisible)){if(x.escape&&(d=yi.escapeHTML(d)),s.concat([o.header.styles[i]]).length&&(m=\" style=\\\"\".concat(s.concat([o.header.styles[i]]).join(\"; \"),\"\\\"\")),e[\"_\".concat(n,\"_id\")]&&(g=yi.sprintf(\" id=\\\"%s\\\"\",e[\"_\".concat(n,\"_id\")])),e[\"_\".concat(n,\"_class\")]&&(f=yi.sprintf(\" class=\\\"%s\\\"\",e[\"_\".concat(n,\"_class\")])),e[\"_\".concat(n,\"_rowspan\")]&&(y=yi.sprintf(\" rowspan=\\\"%s\\\"\",e[\"_\".concat(n,\"_rowspan\")])),e[\"_\".concat(n,\"_colspan\")]&&(w=yi.sprintf(\" colspan=\\\"%s\\\"\",e[\"_\".concat(n,\"_colspan\")])),e[\"_\".concat(n,\"_title\")]&&(S=yi.sprintf(\" title=\\\"%s\\\"\",e[\"_\".concat(n,\"_title\")])),h=yi.calculateObjectValue(o.header,o.header.cellStyles[i],[d,e,t,n],h),h.classes&&(f=\" class=\\\"\".concat(h.classes,\"\\\"\")),h.css){for(var T=[],P=0,O=Object.entries(h.css);P<O.length;P++){var C=l(O[P],2),I=C[0],$=C[1];T.push(\"\".concat(I,\": \").concat($))}m=\" style=\\\"\".concat(T.concat(o.header.styles[i]).join(\"; \"),\"\\\"\")}if(p=yi.calculateObjectValue(x,o.header.formatters[i],[d,e,t,n],d),e[\"_\".concat(n,\"_data\")]&&!yi.isEmptyObject(e[\"_\".concat(n,\"_data\")]))for(var A=0,E=Object.entries(e[\"_\".concat(n,\"_data\")]);A<E.length;A++){var R=l(E[A],2),_=R[0],k=R[1];if(\"index\"===_)return;b+=\" data-\".concat(_,\"=\\\"\").concat(k,\"\\\"\")}if(x.checkbox||x.radio){u=x.checkbox?\"checkbox\":u,u=x.radio?\"radio\":u;var v=x[\"class\"]||\"\",c=(!0===p||d||p&&p.checked)&&!1!==p,N=!x.checkboxEnabled||p&&p.disabled;r=[o.options.cardView?\"<div class=\\\"card-view \".concat(v,\"\\\">\"):\"<td class=\\\"bs-checkbox \".concat(v,\"\\\"\").concat(f).concat(m,\">\"),\"<label>\\n            <input\\n            data-index=\\\"\".concat(t,\"\\\"\\n            name=\\\"\").concat(o.options.selectItemName,\"\\\"\\n            type=\\\"\").concat(u,\"\\\"\\n            \").concat(yi.sprintf(\"value=\\\"%s\\\"\",e[o.options.idField]),\"\\n            \").concat(yi.sprintf(\"checked=\\\"%s\\\"\",c?\"checked\":void 0),\"\\n            \").concat(yi.sprintf(\"disabled=\\\"%s\\\"\",N?\"disabled\":void 0),\" />\\n            <span></span>\\n            </label>\"),o.header.formatters[i]&&\"string\"==typeof p?p:\"\",o.options.cardView?\"</div>\":\"</td>\"].join(\"\"),e[o.header.stateField]=!0===p||!!d||p&&p.checked}else if(p=\"undefined\"==typeof p||null===p?o.options.undefinedText:p,o.options.cardView){var F=o.options.showHeader?\"<span class=\\\"card-view-title\\\"\".concat(m,\">\").concat(yi.getFieldTitle(o.columns,n),\"</span>\"):\"\";r=\"<div class=\\\"card-view\\\">\".concat(F,\"<span class=\\\"card-view-value\\\">\").concat(p,\"</span></div>\"),o.options.smartDisplay&&\"\"===p&&(r=\"<div class=\\\"card-view\\\"></div>\")}else r=\"<td\".concat(g).concat(f).concat(m).concat(b).concat(y).concat(w).concat(S,\">\").concat(p,\"</td>\");a.push(r)}}),this.options.cardView&&a.push(\"</div></td>\"),a.push(\"</tr>\"),a.join(\"\")}}},{key:\"initBody\",value:function(e){var o=this,n=this.getData();this.trigger(\"pre-body\",n),this.$body=this.$el.find(\">tbody\"),this.$body.length||(this.$body=t(\"<tbody></tbody>\").appendTo(this.$el)),this.options.pagination&&\"server\"!==this.options.sidePagination||(this.pageFrom=1,this.pageTo=n.length);for(var a=[],s=t(document.createDocumentFragment()),l=!1,r=this.pageFrom-1;r<this.pageTo;r++){var c=n[r],d=this.initRow(c,r,n,s);l=l||!!d,d&&\"string\"==typeof d&&(this.options.virtualScroll?a.push(d):s.append(d))}l?this.options.virtualScroll?(this.virtualScroll&&this.virtualScroll.destroy(),this.virtualScroll=new Si({rows:a,scrollEl:this.$tableBody[0],contentEl:this.$body[0],itemHeight:this.options.virtualScrollItemHeight,callback:function(){o.fitHeader()}})):this.$body.html(s):this.$body.html(\"<tr class=\\\"no-records-found\\\">\".concat(yi.sprintf(\"<td colspan=\\\"%s\\\">%s</td>\",this.$header.find(\"th\").length,this.options.formatNoMatches()),\"</tr>\")),e||this.scrollTo(0),this.$body.find(\"> tr[data-index] > td\").off(\"click dblclick\").on(\"click dblclick\",function(n){var e=t(n.currentTarget),a=e.parent(),i=t(n.target).parents(\".card-views\").children(),s=t(n.target).parents(\".card-view\"),l=a.data(\"index\"),r=o.data[l],c=o.options.cardView?i.index(s):e[0].cellIndex,d=o.getVisibleFields(),p=d[o.options.detailView&&o.detailViewIcon&&!o.options.cardView?c-1:c],u=o.columns[o.fieldsColumnsIndex[p]],h=yi.getItemField(r,p,o.options.escape);if(!e.find(\".detail-icon\").length){if(o.trigger(\"click\"===n.type?\"click-cell\":\"dbl-click-cell\",p,h,r,e),o.trigger(\"click\"===n.type?\"click-row\":\"dbl-click-row\",r,a,p),\"click\"===n.type&&o.options.clickToSelect&&u.clickToSelect&&!yi.calculateObjectValue(o.options,o.options.ignoreClickToSelectOn,[n.target])){var g=a.find(yi.sprintf(\"[name=\\\"%s\\\"]\",o.options.selectItemName));g.length&&g[0].click()}\"click\"===n.type&&o.options.detailViewByClick&&o.toggleDetailView(l,o.header.detailFormatters[o.fieldsColumnsIndex[p]])}}).off(\"mousedown\").on(\"mousedown\",function(t){o.multipleSelectRowCtrlKey=t.ctrlKey||t.metaKey,o.multipleSelectRowShiftKey=t.shiftKey}),this.$body.find(\"> tr[data-index] > td > .detail-icon\").off(\"click\").on(\"click\",function(n){return n.preventDefault(),o.toggleDetailView(t(n.currentTarget).parent().parent().data(\"index\")),!1}),this.$selectItem=this.$body.find(yi.sprintf(\"[name=\\\"%s\\\"]\",this.options.selectItemName)),this.$selectItem.off(\"click\").on(\"click\",function(n){n.stopImmediatePropagation();var e=t(n.currentTarget);o._toggleCheck(e.prop(\"checked\"),e.data(\"index\"))}),this.header.events.forEach(function(e,n){var a=e;if(a){\"string\"==typeof a&&(a=yi.calculateObjectValue(null,a));var i=o.header.fields[n],s=o.getVisibleFields().indexOf(i);if(-1!==s){o.options.detailView&&!o.options.cardView&&(s+=1);var l=function(e){if(!a.hasOwnProperty(e))return\"continue\";var n=a[e];o.$body.find(\">tr:not(.no-records-found)\").each(function(a,l){var r=t(l),c=r.find(o.options.cardView?\".card-views>.card-view\":\">td\").eq(s),d=e.indexOf(\" \"),p=e.substring(0,d),u=e.substring(d+1);c.find(u).off(p).on(p,function(t){var e=r.data(\"index\"),a=o.data[e],s=a[i];n.apply(o,[t,s,a,e])})})};for(var r in a){var c=l(r)}}}}),this.updateSelected(),this.initFooter(),this.resetView(),\"server\"!==this.options.sidePagination&&(this.options.totalRows=n.length),this.trigger(\"post-body\",n)}},{key:\"initServer\",value:function(e,o,n){var a=this,i={},s=this.header.fields.indexOf(this.options.sortName),l={searchText:this.searchText,sortName:this.options.sortName,sortOrder:this.options.sortOrder};if((this.header.sortNames[s]&&(l.sortName=this.header.sortNames[s]),this.options.pagination&&\"server\"===this.options.sidePagination&&(l.pageSize=this.options.pageSize===this.options.formatAllRows()?this.options.totalRows:this.options.pageSize,l.pageNumber=this.options.pageNumber),n||this.options.url||this.options.ajax)&&(\"limit\"===this.options.queryParamsType&&(l={search:l.searchText,sort:l.sortName,order:l.sortOrder},this.options.pagination&&\"server\"===this.options.sidePagination&&(l.offset=this.options.pageSize===this.options.formatAllRows()?0:this.options.pageSize*(this.options.pageNumber-1),l.limit=this.options.pageSize===this.options.formatAllRows()?this.options.totalRows:this.options.pageSize,0===l.limit&&delete l.limit)),yi.isEmptyObject(this.filterColumnsPartial)||(l.filter=JSON.stringify(this.filterColumnsPartial,null)),t.extend(l,o||{}),i=yi.calculateObjectValue(this.options,this.options.queryParams,[l],i),!1!==i)){e||this.showLoading();var r=t.extend({},yi.calculateObjectValue(null,this.options.ajaxOptions),{type:this.options.method,url:n||this.options.url,data:\"application/json\"===this.options.contentType&&\"post\"===this.options.method?JSON.stringify(i):i,cache:this.options.cache,contentType:this.options.contentType,dataType:this.options.dataType,success:function(t){var o=yi.calculateObjectValue(a.options,a.options.responseHandler,[t],t);a.load(o),a.trigger(\"load-success\",o),e||a.hideLoading()},error:function(t){var o=[];\"server\"===a.options.sidePagination&&(o={},o[a.options.totalField]=0,o[a.options.dataField]=[]),a.load(o),a.trigger(\"load-error\",t.status,t),e||a.$tableLoading.hide()}});return this.options.ajax?yi.calculateObjectValue(this,this.options.ajax,[r],null):(this._xhr&&4!==this._xhr.readyState&&this._xhr.abort(),this._xhr=t.ajax(r)),i}}},{key:\"initSearchText\",value:function(){if(this.options.search&&(this.searchText=\"\",\"\"!==this.options.searchText)){var e=this.$toolbar.find(\".search input\");e.val(this.options.searchText),this.onSearch({currentTarget:e,firedByInitSearchText:!0})}}},{key:\"getCaret\",value:function(){var e=this;this.$header.find(\"th\").each(function(o,n){t(n).find(\".sortable\").removeClass(\"desc asc\").addClass(t(n).data(\"field\")===e.options.sortName?e.options.sortOrder:\"both\")})}},{key:\"updateSelected\",value:function(){var e=this.$selectItem.filter(\":enabled\").length&&this.$selectItem.filter(\":enabled\").length===this.$selectItem.filter(\":enabled\").filter(\":checked\").length;this.$selectAll.add(this.$selectAll_).prop(\"checked\",e),this.$selectItem.each(function(e,o){t(o).closest(\"tr\")[t(o).prop(\"checked\")?\"addClass\":\"removeClass\"](\"selected\")})}},{key:\"updateRows\",value:function(){var e=this;this.$selectItem.each(function(o,n){e.data[t(n).data(\"index\")][e.header.stateField]=t(n).prop(\"checked\")})}},{key:\"resetRows\",value:function(){var e=!0,t=!1,o=void 0;try{for(var n,a,i=this.data[Symbol.iterator]();!(e=(n=i.next()).done);e=!0)a=n.value,this.$selectAll.prop(\"checked\",!1),this.$selectItem.prop(\"checked\",!1),this.header.stateField&&(a[this.header.stateField]=!1)}catch(e){t=!0,o=e}finally{try{e||null==i.return||i.return()}finally{if(t)throw o}}this.initHiddenRows()}},{key:\"trigger\",value:function(o){for(var n,a=\"\".concat(o,\".bs.table\"),i=arguments.length,s=Array(1<i?i-1:0),l=1;l<i;l++)s[l-1]=arguments[l];(n=this.options)[e.EVENTS[a]].apply(n,s),this.$el.trigger(t.Event(a),s),this.options.onAll(a,s),this.$el.trigger(t.Event(\"all.bs.table\"),[a,s])}},{key:\"resetHeader\",value:function(){var e=this;clearTimeout(this.timeoutId_),this.timeoutId_=setTimeout(function(){return e.fitHeader()},this.$el.is(\":hidden\")?100:0)}},{key:\"fitHeader\",value:function(){var e=this;if(this.$el.is(\":hidden\"))return void(this.timeoutId_=setTimeout(function(){return e.fitHeader()},100));var o=this.$tableBody.get(0),n=o.scrollWidth>o.clientWidth&&o.scrollHeight>o.clientHeight+this.$header.outerHeight()?yi.getScrollBarWidth():0;this.$el.css(\"margin-top\",-this.$header.outerHeight());var a=t(\":focus\");if(0<a.length){var i=a.parents(\"th\");if(0<i.length){var s=i.attr(\"data-field\");if(void 0!==s){var l=this.$header.find(\"[data-field='\".concat(s,\"']\"));0<l.length&&l.find(\":input\").addClass(\"focus-temp\")}}}this.$header_=this.$header.clone(!0,!0),this.$selectAll_=this.$header_.find(\"[name=\\\"btSelectAll\\\"]\"),this.$tableHeader.css(\"margin-right\",n).find(\"table\").css(\"width\",this.$el.outerWidth()).html(\"\").attr(\"class\",this.$el.attr(\"class\")).append(this.$header_),this.$tableLoading.css(\"width\",this.$el.outerWidth());var r=t(\".focus-temp:visible:eq(0)\");0<r.length&&(r.focus(),this.$header.find(\".focus-temp\").removeClass(\"focus-temp\")),this.$header.find(\"th[data-field]\").each(function(o,n){e.$header_.find(yi.sprintf(\"th[data-field=\\\"%s\\\"]\",t(n).data(\"field\"))).data(t(n).data())});for(var c=this.getVisibleFields(),d=this.$header_.find(\"th\"),p=this.$body.find(\">tr:not(.no-records-found,.virtual-scroll-top)\").eq(0);p.length&&p.find(\">td[colspan]:not([colspan=\\\"1\\\"])\").length;)p=p.next();p.find(\"> *\").each(function(o,n){var a=t(n),i=o;if(e.options.detailView&&e.options.detailViewIcon&&!e.options.cardView){if(0===o){var s=d.filter(\".detail\"),l=s.innerWidth()-s.find(\".fht-cell\").width();s.find(\".fht-cell\").width(a.innerWidth()-l)}i=o-1}if(-1!==i){var r=e.$header_.find(yi.sprintf(\"th[data-field=\\\"%s\\\"]\",c[i]));1<r.length&&(r=t(d[a[0].cellIndex]));var p=r.innerWidth()-r.find(\".fht-cell\").width();r.find(\".fht-cell\").width(a.innerWidth()-p)}}),this.horizontalScroll(),this.trigger(\"post-header\")}},{key:\"initFooter\",value:function(){if(this.options.showFooter&&!this.options.cardView){var e=this.getData(),t=[];!this.options.cardView&&this.options.detailView&&this.options.detailViewIcon&&t.push(\"<th class=\\\"detail\\\"><div class=\\\"th-inner\\\"></div><div class=\\\"fht-cell\\\"></div></th>\");var o=!0,n=!1,a=void 0;try{for(var i,s=this.columns[Symbol.iterator]();!(o=(i=s.next()).done);o=!0){var r=i.value,c=\"\",d=\"\",p=[],u={},h=yi.sprintf(\" class=\\\"%s\\\"\",r[\"class\"]);if(r.visible){if(this.options.cardView&&!r.cardVisible)return;if(c=yi.sprintf(\"text-align: %s; \",r.falign?r.falign:r.align),d=yi.sprintf(\"vertical-align: %s; \",r.valign),u=yi.calculateObjectValue(null,this.options.footerStyle,[r]),u&&u.css)for(var g=0,f=Object.entries(u.css);g<f.length;g++){var m=l(f[g],2),b=m[0],y=m[1];p.push(\"\".concat(b,\": \").concat(y))}u&&u.classes&&(h=yi.sprintf(\" class=\\\"%s\\\"\",r[\"class\"]?[r[\"class\"],u.classes].join(\" \"):u.classes)),t.push(\"<th\",h,yi.sprintf(\" style=\\\"%s\\\"\",c+d+p.concat().join(\"; \")),\">\"),t.push(\"<div class=\\\"th-inner\\\">\"),t.push(yi.calculateObjectValue(r,r.footerFormatter,[e],this.footerData[0]&&this.footerData[0][r.field]||\"\")),t.push(\"</div>\"),t.push(\"<div class=\\\"fht-cell\\\"></div>\"),t.push(\"</div>\"),t.push(\"</th>\")}}}catch(e){n=!0,a=e}finally{try{o||null==s.return||s.return()}finally{if(n)throw a}}this.$tableFooter.find(\"tr\").html(t.join(\"\")),this.trigger(\"post-footer\",this.$tableFooter)}}},{key:\"fitFooter\",value:function(){var e=this;if(this.$el.is(\":hidden\"))return void setTimeout(function(){return e.fitFooter()},100);var o=this.$tableBody.get(0),n=o.scrollWidth>o.clientWidth&&o.scrollHeight>o.clientHeight+this.$header.outerHeight()?yi.getScrollBarWidth():0;this.$tableFooter.css(\"margin-right\",n).find(\"table\").css(\"width\",this.$el.outerWidth()).attr(\"class\",this.$el.attr(\"class\"));for(var a=this.getVisibleFields(),s=this.$tableFooter.find(\"th\"),l=this.$body.find(\">tr:first-child:not(.no-records-found)\");l.length&&l.find(\">td[colspan]:not([colspan=\\\"1\\\"])\").length;)l=l.next();l.find(\"> *\").each(function(o,n){var a=t(n),i=o;if(e.options.detailView&&!e.options.cardView){if(0===o){var l=s.filter(\".detail\"),r=l.innerWidth()-l.find(\".fht-cell\").width();l.find(\".fht-cell\").width(a.innerWidth()-r)}i=o-1}if(-1!==i){var c=s.eq(o),d=c.innerWidth()-c.find(\".fht-cell\").width();c.find(\".fht-cell\").width(a.innerWidth()-d)}}),this.horizontalScroll()}},{key:\"horizontalScroll\",value:function(){var e=this;this.trigger(\"scroll-body\"),this.$tableBody.off(\"scroll\").on(\"scroll\",function(o){var n=o.currentTarget;e.options.showHeader&&e.options.height&&e.$tableHeader.scrollLeft(t(n).scrollLeft()),e.options.showFooter&&!e.options.cardView&&e.$tableFooter.scrollLeft(t(n).scrollLeft())})}},{key:\"getVisibleFields\",value:function(){var e=[],t=!0,o=!1,n=void 0;try{for(var a,i=this.header.fields[Symbol.iterator]();!(t=(a=i.next()).done);t=!0){var s=a.value,l=this.columns[this.fieldsColumnsIndex[s]];l&&l.visible&&e.push(s)}}catch(e){o=!0,n=e}finally{try{t||null==i.return||i.return()}finally{if(o)throw n}}return e}},{key:\"initHiddenRows\",value:function(){this.hiddenRows=[]}},{key:\"getOptions\",value:function(){var e=t.extend({},this.options);return delete e.data,t.extend(!0,{},e)}},{key:\"refreshOptions\",value:function(e){yi.compareObjects(this.options,e,!0)||(this.options=t.extend(this.options,e),this.trigger(\"refresh-options\",this.options),this.destroy(),this.init())}},{key:\"getData\",value:function(e){var t=this.options.data;if((this.searchText||this.options.sortName||!yi.isEmptyObject(this.filterColumns)||!yi.isEmptyObject(this.filterColumnsPartial))&&(t=this.data),e&&e.useCurrentPage&&(t=t.slice(this.pageFrom-1,this.pageTo)),e&&!e.includeHiddenRows){var o=this.getHiddenRows();t=t.filter(function(e){return-1===yi.findIndex(o,e)})}return t}},{key:\"getSelections\",value:function(){var e=this;return this.data.filter(function(t){return!0===t[e.header.stateField]})}},{key:\"getAllSelections\",value:function(){var e=this;return this.options.data.filter(function(t){return!0===t[e.header.stateField]})}},{key:\"load\",value:function(e){var t=!1,o=e;this.options.pagination&&\"server\"===this.options.sidePagination&&(this.options.totalRows=o[this.options.totalField]),this.options.pagination&&\"server\"===this.options.sidePagination&&(this.options.totalNotFiltered=o[this.options.totalNotFilteredField]),t=o.fixedScroll,o=Array.isArray(o)?o:o[this.options.dataField],this.initData(o),this.initSearch(),this.initPagination(),this.initBody(t)}},{key:\"append\",value:function(e){this.initData(e,\"append\"),this.initSearch(),this.initPagination(),this.initSort(),this.initBody(!0)}},{key:\"prepend\",value:function(e){this.initData(e,\"prepend\"),this.initSearch(),this.initPagination(),this.initSort(),this.initBody(!0)}},{key:\"remove\",value:function(e){var t,o,n=this.options.data.length;if(e.hasOwnProperty(\"field\")&&e.hasOwnProperty(\"values\")){for(t=n-1;0<=t;t--)(o=this.options.data[t],!!o.hasOwnProperty(e.field))&&e.values.includes(o[e.field])&&(this.options.data.splice(t,1),\"server\"===this.options.sidePagination&&(this.options.totalRows-=1));n===this.options.data.length||(this.initSearch(),this.initPagination(),this.initSort(),this.initBody(!0))}}},{key:\"removeAll\",value:function(){0<this.options.data.length&&(this.options.data.splice(0,this.options.data.length),this.initSearch(),this.initPagination(),this.initBody(!0))}},{key:\"insertRow\",value:function(e){e.hasOwnProperty(\"index\")&&e.hasOwnProperty(\"row\")&&(this.options.data.splice(e.index,0,e.row),this.initSearch(),this.initPagination(),this.initSort(),this.initBody(!0))}},{key:\"updateRow\",value:function(e){var o=Array.isArray(e)?e:[e],n=!0,a=!1,i=void 0;try{for(var s,l,r=o[Symbol.iterator]();!(n=(s=r.next()).done);n=!0)(l=s.value,l.hasOwnProperty(\"index\")&&l.hasOwnProperty(\"row\"))&&(t.extend(this.options.data[l.index],l.row),l.hasOwnProperty(\"replace\")&&l.replace?this.options.data[l.index]=l.row:t.extend(this.options.data[l.index],l.row))}catch(e){a=!0,i=e}finally{try{n||null==r.return||r.return()}finally{if(a)throw i}}this.initSearch(),this.initPagination(),this.initSort(),this.initBody(!0)}},{key:\"getRowByUniqueId\",value:function(e){var t,o,n,a=this.options.uniqueId,s=this.options.data.length,l=e,r=null;for(t=s-1;0<=t;t--){if(o=this.options.data[t],o.hasOwnProperty(a))n=o[a];else if(o._data&&o._data.hasOwnProperty(a))n=o._data[a];else continue;if(\"string\"==typeof n?l=l.toString():\"number\"==typeof n&&(+n===n&&0==n%1?l=parseInt(l):n===+n&&0!==n&&(l=parseFloat(l))),n===l){r=o;break}}return r}},{key:\"updateByUniqueId\",value:function(e){var o=Array.isArray(e)?e:[e],n=!0,a=!1,i=void 0;try{for(var s,l,r=o[Symbol.iterator]();!(n=(s=r.next()).done);n=!0)if(l=s.value,l.hasOwnProperty(\"id\")&&l.hasOwnProperty(\"row\")){var c=this.options.data.indexOf(this.getRowByUniqueId(l.id));-1!==c&&(l.hasOwnProperty(\"replace\")&&l.replace?this.options.data[c]=l.row:t.extend(this.options.data[c],l.row))}}catch(e){a=!0,i=e}finally{try{n||null==r.return||r.return()}finally{if(a)throw i}}this.initSearch(),this.initPagination(),this.initSort(),this.initBody(!0)}},{key:\"removeByUniqueId\",value:function(e){var t=this.options.data.length,o=this.getRowByUniqueId(e);o&&this.options.data.splice(this.options.data.indexOf(o),1),t===this.options.data.length||(this.initSearch(),this.initPagination(),this.initBody(!0))}},{key:\"updateCell\",value:function(e){e.hasOwnProperty(\"index\")&&e.hasOwnProperty(\"field\")&&e.hasOwnProperty(\"value\")&&(this.data[e.index][e.field]=e.value,!1===e.reinit||(this.initSort(),this.initBody(!0)))}},{key:\"updateCellByUniqueId\",value:function(e){var t=this;if(e.hasOwnProperty(\"id\")&&e.hasOwnProperty(\"field\")&&e.hasOwnProperty(\"value\")){var o=Array.isArray(e)?e:[e];o.forEach(function(e){var o=e.id,n=e.field,a=e.value,i=t.options.data.indexOf(t.getRowByUniqueId(o));-1===i||(t.options.data[i][n]=a)}),!1===e.reinit||(this.initSort(),this.initBody(!0))}}},{key:\"showRow\",value:function(e){this._toggleRow(e,!0)}},{key:\"hideRow\",value:function(e){this._toggleRow(e,!1)}},{key:\"_toggleRow\",value:function(e,t){var o;if(e.hasOwnProperty(\"index\")?o=this.getData()[e.index]:e.hasOwnProperty(\"uniqueId\")&&(o=this.getRowByUniqueId(e.uniqueId)),!!o){var n=yi.findIndex(this.hiddenRows,o);t||-1!==n?t&&-1<n&&this.hiddenRows.splice(n,1):this.hiddenRows.push(o),t?this.updatePagination():(this.initBody(!0),this.initPagination())}}},{key:\"getHiddenRows\",value:function(e){if(e)return this.initHiddenRows(),void this.initBody(!0);var t=this.getData(),o=[],n=!0,a=!1,i=void 0;try{for(var s,l,r=t[Symbol.iterator]();!(n=(s=r.next()).done);n=!0)l=s.value,this.hiddenRows.includes(l)&&o.push(l)}catch(e){a=!0,i=e}finally{try{n||null==r.return||r.return()}finally{if(a)throw i}}return this.hiddenRows=o,o}},{key:\"showColumn\",value:function(e){var t=this,o=Array.isArray(e)?e:[e];o.forEach(function(e){t._toggleColumn(t.fieldsColumnsIndex[e],!0,!0)})}},{key:\"hideColumn\",value:function(e){var t=this,o=Array.isArray(e)?e:[e];o.forEach(function(e){t._toggleColumn(t.fieldsColumnsIndex[e],!1,!0)})}},{key:\"_toggleColumn\",value:function(e,t,o){if(-1!==e&&this.columns[e].visible!==t&&(this.columns[e].visible=t,this.initHeader(),this.initSearch(),this.initPagination(),this.initBody(),this.options.showColumns)){var n=this.$toolbar.find(\".keep-open input\").prop(\"disabled\",!1);o&&n.filter(yi.sprintf(\"[value=\\\"%s\\\"]\",e)).prop(\"checked\",t),n.filter(\":checked\").length<=this.options.minimumCountColumns&&n.filter(\":checked\").prop(\"disabled\",!0)}}},{key:\"getVisibleColumns\",value:function(){return this.columns.filter(function(e){var t=e.visible;return t})}},{key:\"getHiddenColumns\",value:function(){return this.columns.filter(function(e){var t=e.visible;return!t})}},{key:\"showAllColumns\",value:function(){this._toggleAllColumns(!0)}},{key:\"hideAllColumns\",value:function(){this._toggleAllColumns(!1)}},{key:\"_toggleAllColumns\",value:function(e){var o=this,n=!0,a=!1,i=void 0;try{for(var s,l,r=this.columns.slice().reverse()[Symbol.iterator]();!(n=(s=r.next()).done);n=!0)if(l=s.value,l.switchable){if(!e&&this.options.showColumns&&this.getVisibleColumns().length===this.options.minimumCountColumns)continue;l.visible=e}}catch(e){a=!0,i=e}finally{try{n||null==r.return||r.return()}finally{if(a)throw i}}if(this.initHeader(),this.initSearch(),this.initPagination(),this.initBody(),this.options.showColumns){var c=this.$toolbar.find(\".keep-open input:not(\\\".toggle-all\\\")\").prop(\"disabled\",!1);e?c.prop(\"checked\",e):c.get().reverse().forEach(function(n){c.filter(\":checked\").length>o.options.minimumCountColumns&&t(n).prop(\"checked\",e)}),c.filter(\":checked\").length<=this.options.minimumCountColumns&&c.filter(\":checked\").prop(\"disabled\",!0)}}},{key:\"mergeCells\",value:function(e){var t,o,n=e.index,a=this.getVisibleFields().indexOf(e.field),s=e.rowspan||1,l=e.colspan||1,r=this.$body.find(\">tr\");this.options.detailView&&!this.options.cardView&&(a+=1);var c=r.eq(n).find(\">td\").eq(a);if(!(0>n||0>a||n>=this.data.length)){for(t=n;t<n+s;t++)for(o=a;o<a+l;o++)r.eq(t).find(\">td\").eq(o).hide();c.attr(\"rowspan\",s).attr(\"colspan\",l).show()}}},{key:\"checkAll\",value:function(){this._toggleCheckAll(!0)}},{key:\"uncheckAll\",value:function(){this._toggleCheckAll(!1)}},{key:\"_toggleCheckAll\",value:function(e){var t=this.getSelections();this.$selectAll.add(this.$selectAll_).prop(\"checked\",e),this.$selectItem.filter(\":enabled\").prop(\"checked\",e),this.updateRows();var o=this.getSelections();return e?void this.trigger(\"check-all\",o,t):void this.trigger(\"uncheck-all\",o,t)}},{key:\"checkInvert\",value:function(){var e=this.$selectItem.filter(\":enabled\"),o=e.filter(\":checked\");e.each(function(e,o){t(o).prop(\"checked\",!t(o).prop(\"checked\"))}),this.updateRows(),this.updateSelected(),this.trigger(\"uncheck-some\",o),o=this.getSelections(),this.trigger(\"check-some\",o)}},{key:\"check\",value:function(e){this._toggleCheck(!0,e)}},{key:\"uncheck\",value:function(e){this._toggleCheck(!1,e)}},{key:\"_toggleCheck\",value:function(e,t){var o=this.$selectItem.filter(\"[data-index=\\\"\".concat(t,\"\\\"]\")),n=this.data[t];if(o.is(\":radio\")||this.options.singleSelect||this.options.multipleSelectRow&&!this.multipleSelectRowCtrlKey&&!this.multipleSelectRowShiftKey){var a=!0,s=!1,l=void 0;try{for(var c,d,p=this.options.data[Symbol.iterator]();!(a=(c=p.next()).done);a=!0)d=c.value,d[this.header.stateField]=!1}catch(e){s=!0,l=e}finally{try{a||null==p.return||p.return()}finally{if(s)throw l}}this.$selectItem.filter(\":checked\").not(o).prop(\"checked\",!1)}if(n[this.header.stateField]=e,this.options.multipleSelectRow){if(this.multipleSelectRowShiftKey&&0<=this.multipleSelectRowLastSelectedIndex)for(var u=[this.multipleSelectRowLastSelectedIndex,t].sort(),h=u[0]+1;h<u[1];h++)this.data[h][this.header.stateField]=!0,this.$selectItem.filter(\"[data-index=\\\"\".concat(h,\"\\\"]\")).prop(\"checked\",!0);this.multipleSelectRowCtrlKey=!1,this.multipleSelectRowShiftKey=!1,this.multipleSelectRowLastSelectedIndex=e?t:-1}o.prop(\"checked\",e),this.updateSelected(),this.trigger(e?\"check\":\"uncheck\",this.data[t],o)}},{key:\"checkBy\",value:function(e){this._toggleCheckBy(!0,e)}},{key:\"uncheckBy\",value:function(e){this._toggleCheckBy(!1,e)}},{key:\"_toggleCheckBy\",value:function(e,t){var o=this;if(t.hasOwnProperty(\"field\")&&t.hasOwnProperty(\"values\")){var n=[];this.data.forEach(function(a,s){if(!a.hasOwnProperty(t.field))return!1;if(t.values.includes(a[t.field])){var i=o.$selectItem.filter(\":enabled\").filter(yi.sprintf(\"[data-index=\\\"%s\\\"]\",s));if(i=e?i.not(\":checked\"):i.filter(\":checked\"),!i.length)return;i.prop(\"checked\",e),a[o.header.stateField]=e,n.push(a),o.trigger(e?\"check\":\"uncheck\",a,i)}}),this.updateSelected(),this.trigger(e?\"check-some\":\"uncheck-some\",n)}}},{key:\"refresh\",value:function(e){e&&e.url&&(this.options.url=e.url),e&&e.pageNumber&&(this.options.pageNumber=e.pageNumber),e&&e.pageSize&&(this.options.pageSize=e.pageSize),this.trigger(\"refresh\",this.initServer(e&&e.silent,e&&e.query,e&&e.url))}},{key:\"destroy\",value:function(){this.$el.insertBefore(this.$container),t(this.options.toolbar).insertBefore(this.$el),this.$container.next().remove(),this.$container.remove(),this.$el.html(this.$el_.html()).css(\"margin-top\",\"0\").attr(\"class\",this.$el_.attr(\"class\")||\"\")}},{key:\"resetView\",value:function(e){var t=0;if(e&&e.height&&(this.options.height=e.height),this.$selectAll.prop(\"checked\",0<this.$selectItem.length&&this.$selectItem.length===this.$selectItem.filter(\":checked\").length),this.$tableContainer.toggleClass(\"has-card-view\",this.options.cardView),!this.options.cardView&&this.options.showHeader&&this.options.height?(this.$tableHeader.show(),this.resetHeader(),t+=this.$header.outerHeight(!0)):(this.$tableHeader.hide(),this.trigger(\"post-header\")),!this.options.cardView&&this.options.showFooter&&(this.$tableFooter.show(),this.fitFooter(),this.options.height&&(t+=this.$tableFooter.outerHeight(!0))),this.options.height){var o=this.$toolbar.outerHeight(!0),n=this.$pagination.outerHeight(!0),a=this.options.height-o-n,i=this.$tableBody.find(\"table\").outerHeight(!0);this.$tableContainer.css(\"height\",\"\".concat(a,\"px\")),this.$tableBorder&&this.$tableBorder.css(\"height\",\"\".concat(a-i-t-1,\"px\"))}this.options.cardView?(this.$el.css(\"margin-top\",\"0\"),this.$tableContainer.css(\"padding-bottom\",\"0\"),this.$tableFooter.hide()):(this.getCaret(),this.$tableContainer.css(\"padding-bottom\",\"\".concat(t,\"px\"))),this.trigger(\"reset-view\")}},{key:\"resetWidth\",value:function(){this.options.showHeader&&this.options.height&&this.fitHeader(),this.options.showFooter&&!this.options.cardView&&this.fitFooter()}},{key:\"showLoading\",value:function(){this.$tableLoading.css(\"display\",\"flex\")}},{key:\"hideLoading\",value:function(){this.$tableLoading.css(\"display\",\"none\")}},{key:\"togglePagination\",value:function(){this.options.pagination=!this.options.pagination;var e=this.options.showButtonIcons?this.options.pagination?this.options.icons.paginationSwitchDown:this.options.icons.paginationSwitchUp:\"\",t=this.options.showButtonText?this.options.pagination?this.options.formatPaginationSwitchUp():this.options.formatPaginationSwitchDown():\"\";this.$toolbar.find(\"button[name=\\\"paginationSwitch\\\"]\").html(yi.sprintf(this.constants.html.icon,this.options.iconsPrefix,e)+\" \"+t),this.updatePagination()}},{key:\"toggleFullscreen\",value:function(){this.$el.closest(\".bootstrap-table\").toggleClass(\"fullscreen\"),this.resetView()}},{key:\"toggleView\",value:function(){this.options.cardView=!this.options.cardView,this.initHeader();var e=this.options.showButtonIcons?this.options.cardView?this.options.icons.toggleOn:this.options.icons.toggleOff:\"\",t=this.options.showButtonText?this.options.cardView?this.options.formatToggleOff():this.options.formatToggleOn():\"\";this.$toolbar.find(\"button[name=\\\"toggle\\\"]\").html(yi.sprintf(this.constants.html.icon,this.options.iconsPrefix,e)+\" \"+t),this.initBody(),this.trigger(\"toggle\",this.options.cardView)}},{key:\"resetSearch\",value:function(e){var t=this.$toolbar.find(\".search input\");t.val(e||\"\"),this.onSearch({currentTarget:t})}},{key:\"filterBy\",value:function(e,o){this.filterOptions=yi.isEmptyObject(o)?this.options.filterOptions:t.extend(this.options.filterOptions,o),this.filterColumns=yi.isEmptyObject(e)?{}:e,this.options.pageNumber=1,this.initSearch(),this.updatePagination()}},{key:\"scrollTo\",value:function e(o){if(\"undefined\"==typeof o)return this.$tableBody.scrollTop();var a={unit:\"px\",value:0};\"object\"===n(o)?a=Object.assign(a,o):\"string\"==typeof o&&\"bottom\"===o?a.value=this.$tableBody[0].scrollHeight:\"string\"==typeof o&&(a.value=o);var e=a.value;\"rows\"===a.unit&&(e=0,this.$body.find(\"> tr:lt(\".concat(a.value,\")\")).each(function(o,n){e+=t(n).outerHeight(!0)})),this.$tableBody.scrollTop(e)}},{key:\"getScrollPosition\",value:function(){return this.scrollTo()}},{key:\"selectPage\",value:function(e){0<e&&e<=this.options.totalPages&&(this.options.pageNumber=e,this.updatePagination())}},{key:\"prevPage\",value:function(){1<this.options.pageNumber&&(this.options.pageNumber--,this.updatePagination())}},{key:\"nextPage\",value:function(){this.options.pageNumber<this.options.totalPages&&(this.options.pageNumber++,this.updatePagination())}},{key:\"toggleDetailView\",value:function(e,t){var o=this.$body.find(yi.sprintf(\"> tr[data-index=\\\"%s\\\"]\",e));o.next().is(\"tr.detail-view\")?this.collapseRow(e):this.expandRow(e,t),this.resetView()}},{key:\"expandRow\",value:function(e,t){var o=this.data[e],n=this.$body.find(yi.sprintf(\"> tr[data-index=\\\"%s\\\"][data-has-detail-view]\",e));if(!n.next().is(\"tr.detail-view\")){this.options.detailViewIcon&&n.find(\"a.detail-icon\").html(yi.sprintf(this.constants.html.icon,this.options.iconsPrefix,this.options.icons.detailClose)),n.after(yi.sprintf(\"<tr class=\\\"detail-view\\\"><td colspan=\\\"%s\\\"></td></tr>\",n.children(\"td\").length));var a=n.next().find(\"td\"),i=t||this.options.detailFormatter,s=yi.calculateObjectValue(this.options,i,[e,o,a],\"\");1===a.length&&a.append(s),this.trigger(\"expand-row\",e,o,a)}}},{key:\"collapseRow\",value:function(e){var t=this.data[e],o=this.$body.find(yi.sprintf(\"> tr[data-index=\\\"%s\\\"][data-has-detail-view]\",e));o.next().is(\"tr.detail-view\")&&(this.options.detailViewIcon&&o.find(\"a.detail-icon\").html(yi.sprintf(this.constants.html.icon,this.options.iconsPrefix,this.options.icons.detailOpen)),this.trigger(\"collapse-row\",e,t,o.next()),o.next().remove())}},{key:\"expandAllRows\",value:function(){for(var e=this.$body.find(\"> tr[data-index][data-has-detail-view]\"),o=0;o<e.length;o++)this.expandRow(t(e[o]).data(\"index\"))}},{key:\"collapseAllRows\",value:function(){for(var e=this.$body.find(\"> tr[data-index][data-has-detail-view]\"),o=0;o<e.length;o++)this.collapseRow(t(e[o]).data(\"index\"))}},{key:\"updateColumnTitle\",value:function(e){if(e.hasOwnProperty(\"field\")&&e.hasOwnProperty(\"title\")&&(this.columns[this.fieldsColumnsIndex[e.field]].title=this.options.escape?yi.escapeHTML(e.title):e.title,this.columns[this.fieldsColumnsIndex[e.field]].visible)){var o=void 0===this.options.height?this.$header:this.$tableHeader;o.find(\"th[data-field]\").each(function(o,n){if(t(n).data(\"field\")===e.field)return t(t(n).find(\".th-inner\")[0]).text(e.title),!1})}}},{key:\"updateFormatText\",value:function(e,t){/^format/.test(e)&&this.options[e]&&(\"string\"==typeof t?this.options[e]=function(){return t}:\"function\"==typeof t&&(this.options[e]=t),this.initToolbar(),this.initPagination(),this.initBody())}}]),e}();return xi.VERSION=fi.VERSION,xi.DEFAULTS=fi.DEFAULTS,xi.LOCALES=fi.LOCALES,xi.COLUMN_DEFAULTS=fi.COLUMN_DEFAULTS,xi.METHODS=fi.METHODS,xi.EVENTS=fi.EVENTS,t.BootstrapTable=xi,t.fn.bootstrapTable=function(e){for(var o=arguments.length,a=Array(1<o?o-1:0),i=1;i<o;i++)a[i-1]=arguments[i];var s;return this.each(function(o,i){var l=t(i).data(\"bootstrap.table\"),r=t.extend({},xi.DEFAULTS,t(i).data(),\"object\"===n(e)&&e);if(\"string\"==typeof e){var c;if(!fi.METHODS.includes(e))throw new Error(\"Unknown method: \".concat(e));if(!l)return;s=(c=l)[e].apply(c,a),\"destroy\"==e&&t(i).removeData(\"bootstrap.table\")}l||t(i).data(\"bootstrap.table\",l=new t.BootstrapTable(i,r))}),\"undefined\"==typeof s?this:s},t.fn.bootstrapTable.Constructor=xi,t.fn.bootstrapTable.theme=fi.THEME,t.fn.bootstrapTable.VERSION=fi.VERSION,t.fn.bootstrapTable.defaults=xi.DEFAULTS,t.fn.bootstrapTable.columnDefaults=xi.COLUMN_DEFAULTS,t.fn.bootstrapTable.events=xi.EVENTS,t.fn.bootstrapTable.locales=xi.LOCALES,t.fn.bootstrapTable.methods=xi.METHODS,t.fn.bootstrapTable.utils=yi,t(function(){t(\"[data-toggle=\\\"table\\\"]\").bootstrapTable()}),xi});\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bootstrap4/css/bootstrap-grid.css",
    "content": "/*!\n * Bootstrap Grid v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\nhtml {\n  box-sizing: border-box;\n  -ms-overflow-style: scrollbar;\n}\n\n*,\n*::before,\n*::after {\n  box-sizing: inherit;\n}\n\n.container {\n  width: 100%;\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n@media (min-width: 576px) {\n  .container {\n    max-width: 540px;\n  }\n}\n\n@media (min-width: 768px) {\n  .container {\n    max-width: 720px;\n  }\n}\n\n@media (min-width: 992px) {\n  .container {\n    max-width: 960px;\n  }\n}\n\n@media (min-width: 1200px) {\n  .container {\n    max-width: 1140px;\n  }\n}\n\n.container-fluid {\n  width: 100%;\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.row {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.no-gutters {\n  margin-right: 0;\n  margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n  position: relative;\n  width: 100%;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n\n.col {\n  -ms-flex-preferred-size: 0;\n  flex-basis: 0;\n  -ms-flex-positive: 1;\n  flex-grow: 1;\n  max-width: 100%;\n}\n\n.col-auto {\n  -ms-flex: 0 0 auto;\n  flex: 0 0 auto;\n  width: auto;\n  max-width: 100%;\n}\n\n.col-1 {\n  -ms-flex: 0 0 8.333333%;\n  flex: 0 0 8.333333%;\n  max-width: 8.333333%;\n}\n\n.col-2 {\n  -ms-flex: 0 0 16.666667%;\n  flex: 0 0 16.666667%;\n  max-width: 16.666667%;\n}\n\n.col-3 {\n  -ms-flex: 0 0 25%;\n  flex: 0 0 25%;\n  max-width: 25%;\n}\n\n.col-4 {\n  -ms-flex: 0 0 33.333333%;\n  flex: 0 0 33.333333%;\n  max-width: 33.333333%;\n}\n\n.col-5 {\n  -ms-flex: 0 0 41.666667%;\n  flex: 0 0 41.666667%;\n  max-width: 41.666667%;\n}\n\n.col-6 {\n  -ms-flex: 0 0 50%;\n  flex: 0 0 50%;\n  max-width: 50%;\n}\n\n.col-7 {\n  -ms-flex: 0 0 58.333333%;\n  flex: 0 0 58.333333%;\n  max-width: 58.333333%;\n}\n\n.col-8 {\n  -ms-flex: 0 0 66.666667%;\n  flex: 0 0 66.666667%;\n  max-width: 66.666667%;\n}\n\n.col-9 {\n  -ms-flex: 0 0 75%;\n  flex: 0 0 75%;\n  max-width: 75%;\n}\n\n.col-10 {\n  -ms-flex: 0 0 83.333333%;\n  flex: 0 0 83.333333%;\n  max-width: 83.333333%;\n}\n\n.col-11 {\n  -ms-flex: 0 0 91.666667%;\n  flex: 0 0 91.666667%;\n  max-width: 91.666667%;\n}\n\n.col-12 {\n  -ms-flex: 0 0 100%;\n  flex: 0 0 100%;\n  max-width: 100%;\n}\n\n.order-first {\n  -ms-flex-order: -1;\n  order: -1;\n}\n\n.order-last {\n  -ms-flex-order: 13;\n  order: 13;\n}\n\n.order-0 {\n  -ms-flex-order: 0;\n  order: 0;\n}\n\n.order-1 {\n  -ms-flex-order: 1;\n  order: 1;\n}\n\n.order-2 {\n  -ms-flex-order: 2;\n  order: 2;\n}\n\n.order-3 {\n  -ms-flex-order: 3;\n  order: 3;\n}\n\n.order-4 {\n  -ms-flex-order: 4;\n  order: 4;\n}\n\n.order-5 {\n  -ms-flex-order: 5;\n  order: 5;\n}\n\n.order-6 {\n  -ms-flex-order: 6;\n  order: 6;\n}\n\n.order-7 {\n  -ms-flex-order: 7;\n  order: 7;\n}\n\n.order-8 {\n  -ms-flex-order: 8;\n  order: 8;\n}\n\n.order-9 {\n  -ms-flex-order: 9;\n  order: 9;\n}\n\n.order-10 {\n  -ms-flex-order: 10;\n  order: 10;\n}\n\n.order-11 {\n  -ms-flex-order: 11;\n  order: 11;\n}\n\n.order-12 {\n  -ms-flex-order: 12;\n  order: 12;\n}\n\n.offset-1 {\n  margin-left: 8.333333%;\n}\n\n.offset-2 {\n  margin-left: 16.666667%;\n}\n\n.offset-3 {\n  margin-left: 25%;\n}\n\n.offset-4 {\n  margin-left: 33.333333%;\n}\n\n.offset-5 {\n  margin-left: 41.666667%;\n}\n\n.offset-6 {\n  margin-left: 50%;\n}\n\n.offset-7 {\n  margin-left: 58.333333%;\n}\n\n.offset-8 {\n  margin-left: 66.666667%;\n}\n\n.offset-9 {\n  margin-left: 75%;\n}\n\n.offset-10 {\n  margin-left: 83.333333%;\n}\n\n.offset-11 {\n  margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n  .col-sm {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-sm-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: 100%;\n  }\n  .col-sm-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-sm-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-sm-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-sm-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-sm-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-sm-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-sm-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-sm-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-sm-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-sm-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-sm-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-sm-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-sm-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-sm-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-sm-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-sm-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-sm-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-sm-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-sm-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-sm-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-sm-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-sm-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-sm-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-sm-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-sm-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-sm-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-sm-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-sm-0 {\n    margin-left: 0;\n  }\n  .offset-sm-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-sm-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-sm-3 {\n    margin-left: 25%;\n  }\n  .offset-sm-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-sm-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-sm-6 {\n    margin-left: 50%;\n  }\n  .offset-sm-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-sm-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-sm-9 {\n    margin-left: 75%;\n  }\n  .offset-sm-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-sm-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 768px) {\n  .col-md {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-md-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: 100%;\n  }\n  .col-md-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-md-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-md-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-md-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-md-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-md-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-md-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-md-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-md-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-md-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-md-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-md-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-md-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-md-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-md-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-md-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-md-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-md-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-md-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-md-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-md-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-md-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-md-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-md-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-md-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-md-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-md-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-md-0 {\n    margin-left: 0;\n  }\n  .offset-md-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-md-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-md-3 {\n    margin-left: 25%;\n  }\n  .offset-md-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-md-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-md-6 {\n    margin-left: 50%;\n  }\n  .offset-md-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-md-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-md-9 {\n    margin-left: 75%;\n  }\n  .offset-md-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-md-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 992px) {\n  .col-lg {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-lg-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: 100%;\n  }\n  .col-lg-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-lg-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-lg-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-lg-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-lg-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-lg-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-lg-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-lg-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-lg-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-lg-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-lg-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-lg-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-lg-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-lg-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-lg-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-lg-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-lg-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-lg-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-lg-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-lg-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-lg-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-lg-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-lg-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-lg-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-lg-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-lg-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-lg-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-lg-0 {\n    margin-left: 0;\n  }\n  .offset-lg-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-lg-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-lg-3 {\n    margin-left: 25%;\n  }\n  .offset-lg-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-lg-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-lg-6 {\n    margin-left: 50%;\n  }\n  .offset-lg-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-lg-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-lg-9 {\n    margin-left: 75%;\n  }\n  .offset-lg-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-lg-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 1200px) {\n  .col-xl {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-xl-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: 100%;\n  }\n  .col-xl-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-xl-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-xl-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-xl-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-xl-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-xl-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-xl-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-xl-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-xl-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-xl-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-xl-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-xl-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-xl-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-xl-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-xl-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-xl-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-xl-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-xl-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-xl-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-xl-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-xl-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-xl-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-xl-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-xl-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-xl-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-xl-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-xl-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-xl-0 {\n    margin-left: 0;\n  }\n  .offset-xl-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-xl-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-xl-3 {\n    margin-left: 25%;\n  }\n  .offset-xl-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-xl-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-xl-6 {\n    margin-left: 50%;\n  }\n  .offset-xl-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-xl-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-xl-9 {\n    margin-left: 75%;\n  }\n  .offset-xl-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-xl-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n.d-none {\n  display: none !important;\n}\n\n.d-inline {\n  display: inline !important;\n}\n\n.d-inline-block {\n  display: inline-block !important;\n}\n\n.d-block {\n  display: block !important;\n}\n\n.d-table {\n  display: table !important;\n}\n\n.d-table-row {\n  display: table-row !important;\n}\n\n.d-table-cell {\n  display: table-cell !important;\n}\n\n.d-flex {\n  display: -ms-flexbox !important;\n  display: flex !important;\n}\n\n.d-inline-flex {\n  display: -ms-inline-flexbox !important;\n  display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n  .d-sm-none {\n    display: none !important;\n  }\n  .d-sm-inline {\n    display: inline !important;\n  }\n  .d-sm-inline-block {\n    display: inline-block !important;\n  }\n  .d-sm-block {\n    display: block !important;\n  }\n  .d-sm-table {\n    display: table !important;\n  }\n  .d-sm-table-row {\n    display: table-row !important;\n  }\n  .d-sm-table-cell {\n    display: table-cell !important;\n  }\n  .d-sm-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-sm-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .d-md-none {\n    display: none !important;\n  }\n  .d-md-inline {\n    display: inline !important;\n  }\n  .d-md-inline-block {\n    display: inline-block !important;\n  }\n  .d-md-block {\n    display: block !important;\n  }\n  .d-md-table {\n    display: table !important;\n  }\n  .d-md-table-row {\n    display: table-row !important;\n  }\n  .d-md-table-cell {\n    display: table-cell !important;\n  }\n  .d-md-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-md-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .d-lg-none {\n    display: none !important;\n  }\n  .d-lg-inline {\n    display: inline !important;\n  }\n  .d-lg-inline-block {\n    display: inline-block !important;\n  }\n  .d-lg-block {\n    display: block !important;\n  }\n  .d-lg-table {\n    display: table !important;\n  }\n  .d-lg-table-row {\n    display: table-row !important;\n  }\n  .d-lg-table-cell {\n    display: table-cell !important;\n  }\n  .d-lg-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-lg-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .d-xl-none {\n    display: none !important;\n  }\n  .d-xl-inline {\n    display: inline !important;\n  }\n  .d-xl-inline-block {\n    display: inline-block !important;\n  }\n  .d-xl-block {\n    display: block !important;\n  }\n  .d-xl-table {\n    display: table !important;\n  }\n  .d-xl-table-row {\n    display: table-row !important;\n  }\n  .d-xl-table-cell {\n    display: table-cell !important;\n  }\n  .d-xl-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-xl-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media print {\n  .d-print-none {\n    display: none !important;\n  }\n  .d-print-inline {\n    display: inline !important;\n  }\n  .d-print-inline-block {\n    display: inline-block !important;\n  }\n  .d-print-block {\n    display: block !important;\n  }\n  .d-print-table {\n    display: table !important;\n  }\n  .d-print-table-row {\n    display: table-row !important;\n  }\n  .d-print-table-cell {\n    display: table-cell !important;\n  }\n  .d-print-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-print-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n.flex-row {\n  -ms-flex-direction: row !important;\n  flex-direction: row !important;\n}\n\n.flex-column {\n  -ms-flex-direction: column !important;\n  flex-direction: column !important;\n}\n\n.flex-row-reverse {\n  -ms-flex-direction: row-reverse !important;\n  flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n  -ms-flex-direction: column-reverse !important;\n  flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n  -ms-flex-wrap: wrap !important;\n  flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n  -ms-flex-wrap: nowrap !important;\n  flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n  -ms-flex-wrap: wrap-reverse !important;\n  flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n  -ms-flex: 1 1 auto !important;\n  flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n  -ms-flex-positive: 0 !important;\n  flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n  -ms-flex-positive: 1 !important;\n  flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n  -ms-flex-negative: 0 !important;\n  flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n  -ms-flex-negative: 1 !important;\n  flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n  -ms-flex-pack: start !important;\n  justify-content: flex-start !important;\n}\n\n.justify-content-end {\n  -ms-flex-pack: end !important;\n  justify-content: flex-end !important;\n}\n\n.justify-content-center {\n  -ms-flex-pack: center !important;\n  justify-content: center !important;\n}\n\n.justify-content-between {\n  -ms-flex-pack: justify !important;\n  justify-content: space-between !important;\n}\n\n.justify-content-around {\n  -ms-flex-pack: distribute !important;\n  justify-content: space-around !important;\n}\n\n.align-items-start {\n  -ms-flex-align: start !important;\n  align-items: flex-start !important;\n}\n\n.align-items-end {\n  -ms-flex-align: end !important;\n  align-items: flex-end !important;\n}\n\n.align-items-center {\n  -ms-flex-align: center !important;\n  align-items: center !important;\n}\n\n.align-items-baseline {\n  -ms-flex-align: baseline !important;\n  align-items: baseline !important;\n}\n\n.align-items-stretch {\n  -ms-flex-align: stretch !important;\n  align-items: stretch !important;\n}\n\n.align-content-start {\n  -ms-flex-line-pack: start !important;\n  align-content: flex-start !important;\n}\n\n.align-content-end {\n  -ms-flex-line-pack: end !important;\n  align-content: flex-end !important;\n}\n\n.align-content-center {\n  -ms-flex-line-pack: center !important;\n  align-content: center !important;\n}\n\n.align-content-between {\n  -ms-flex-line-pack: justify !important;\n  align-content: space-between !important;\n}\n\n.align-content-around {\n  -ms-flex-line-pack: distribute !important;\n  align-content: space-around !important;\n}\n\n.align-content-stretch {\n  -ms-flex-line-pack: stretch !important;\n  align-content: stretch !important;\n}\n\n.align-self-auto {\n  -ms-flex-item-align: auto !important;\n  align-self: auto !important;\n}\n\n.align-self-start {\n  -ms-flex-item-align: start !important;\n  align-self: flex-start !important;\n}\n\n.align-self-end {\n  -ms-flex-item-align: end !important;\n  align-self: flex-end !important;\n}\n\n.align-self-center {\n  -ms-flex-item-align: center !important;\n  align-self: center !important;\n}\n\n.align-self-baseline {\n  -ms-flex-item-align: baseline !important;\n  align-self: baseline !important;\n}\n\n.align-self-stretch {\n  -ms-flex-item-align: stretch !important;\n  align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n  .flex-sm-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-sm-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-sm-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-sm-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-sm-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-sm-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-sm-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-sm-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-sm-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-sm-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-sm-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-sm-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-sm-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-sm-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-sm-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-sm-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-sm-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-sm-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-sm-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-sm-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-sm-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-sm-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-sm-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-sm-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-sm-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-sm-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-sm-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-sm-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-sm-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-sm-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-sm-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-sm-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-sm-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-sm-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .flex-md-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-md-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-md-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-md-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-md-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-md-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-md-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-md-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-md-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-md-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-md-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-md-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-md-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-md-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-md-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-md-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-md-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-md-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-md-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-md-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-md-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-md-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-md-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-md-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-md-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-md-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-md-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-md-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-md-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-md-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-md-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-md-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-md-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-md-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .flex-lg-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-lg-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-lg-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-lg-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-lg-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-lg-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-lg-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-lg-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-lg-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-lg-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-lg-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-lg-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-lg-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-lg-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-lg-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-lg-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-lg-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-lg-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-lg-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-lg-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-lg-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-lg-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-lg-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-lg-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-lg-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-lg-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-lg-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-lg-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-lg-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-lg-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-lg-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-lg-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-lg-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-lg-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .flex-xl-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-xl-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-xl-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-xl-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-xl-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-xl-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-xl-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-xl-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-xl-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-xl-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-xl-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-xl-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-xl-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-xl-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-xl-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-xl-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-xl-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-xl-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-xl-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-xl-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-xl-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-xl-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-xl-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-xl-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-xl-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-xl-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-xl-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-xl-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-xl-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-xl-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-xl-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-xl-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-xl-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-xl-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n.m-0 {\n  margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n  margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n  margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n  margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n  margin-left: 0 !important;\n}\n\n.m-1 {\n  margin: 0.25rem !important;\n}\n\n.mt-1,\n.my-1 {\n  margin-top: 0.25rem !important;\n}\n\n.mr-1,\n.mx-1 {\n  margin-right: 0.25rem !important;\n}\n\n.mb-1,\n.my-1 {\n  margin-bottom: 0.25rem !important;\n}\n\n.ml-1,\n.mx-1 {\n  margin-left: 0.25rem !important;\n}\n\n.m-2 {\n  margin: 0.5rem !important;\n}\n\n.mt-2,\n.my-2 {\n  margin-top: 0.5rem !important;\n}\n\n.mr-2,\n.mx-2 {\n  margin-right: 0.5rem !important;\n}\n\n.mb-2,\n.my-2 {\n  margin-bottom: 0.5rem !important;\n}\n\n.ml-2,\n.mx-2 {\n  margin-left: 0.5rem !important;\n}\n\n.m-3 {\n  margin: 1rem !important;\n}\n\n.mt-3,\n.my-3 {\n  margin-top: 1rem !important;\n}\n\n.mr-3,\n.mx-3 {\n  margin-right: 1rem !important;\n}\n\n.mb-3,\n.my-3 {\n  margin-bottom: 1rem !important;\n}\n\n.ml-3,\n.mx-3 {\n  margin-left: 1rem !important;\n}\n\n.m-4 {\n  margin: 1.5rem !important;\n}\n\n.mt-4,\n.my-4 {\n  margin-top: 1.5rem !important;\n}\n\n.mr-4,\n.mx-4 {\n  margin-right: 1.5rem !important;\n}\n\n.mb-4,\n.my-4 {\n  margin-bottom: 1.5rem !important;\n}\n\n.ml-4,\n.mx-4 {\n  margin-left: 1.5rem !important;\n}\n\n.m-5 {\n  margin: 3rem !important;\n}\n\n.mt-5,\n.my-5 {\n  margin-top: 3rem !important;\n}\n\n.mr-5,\n.mx-5 {\n  margin-right: 3rem !important;\n}\n\n.mb-5,\n.my-5 {\n  margin-bottom: 3rem !important;\n}\n\n.ml-5,\n.mx-5 {\n  margin-left: 3rem !important;\n}\n\n.p-0 {\n  padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n  padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n  padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n  padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n  padding-left: 0 !important;\n}\n\n.p-1 {\n  padding: 0.25rem !important;\n}\n\n.pt-1,\n.py-1 {\n  padding-top: 0.25rem !important;\n}\n\n.pr-1,\n.px-1 {\n  padding-right: 0.25rem !important;\n}\n\n.pb-1,\n.py-1 {\n  padding-bottom: 0.25rem !important;\n}\n\n.pl-1,\n.px-1 {\n  padding-left: 0.25rem !important;\n}\n\n.p-2 {\n  padding: 0.5rem !important;\n}\n\n.pt-2,\n.py-2 {\n  padding-top: 0.5rem !important;\n}\n\n.pr-2,\n.px-2 {\n  padding-right: 0.5rem !important;\n}\n\n.pb-2,\n.py-2 {\n  padding-bottom: 0.5rem !important;\n}\n\n.pl-2,\n.px-2 {\n  padding-left: 0.5rem !important;\n}\n\n.p-3 {\n  padding: 1rem !important;\n}\n\n.pt-3,\n.py-3 {\n  padding-top: 1rem !important;\n}\n\n.pr-3,\n.px-3 {\n  padding-right: 1rem !important;\n}\n\n.pb-3,\n.py-3 {\n  padding-bottom: 1rem !important;\n}\n\n.pl-3,\n.px-3 {\n  padding-left: 1rem !important;\n}\n\n.p-4 {\n  padding: 1.5rem !important;\n}\n\n.pt-4,\n.py-4 {\n  padding-top: 1.5rem !important;\n}\n\n.pr-4,\n.px-4 {\n  padding-right: 1.5rem !important;\n}\n\n.pb-4,\n.py-4 {\n  padding-bottom: 1.5rem !important;\n}\n\n.pl-4,\n.px-4 {\n  padding-left: 1.5rem !important;\n}\n\n.p-5 {\n  padding: 3rem !important;\n}\n\n.pt-5,\n.py-5 {\n  padding-top: 3rem !important;\n}\n\n.pr-5,\n.px-5 {\n  padding-right: 3rem !important;\n}\n\n.pb-5,\n.py-5 {\n  padding-bottom: 3rem !important;\n}\n\n.pl-5,\n.px-5 {\n  padding-left: 3rem !important;\n}\n\n.m-n1 {\n  margin: -0.25rem !important;\n}\n\n.mt-n1,\n.my-n1 {\n  margin-top: -0.25rem !important;\n}\n\n.mr-n1,\n.mx-n1 {\n  margin-right: -0.25rem !important;\n}\n\n.mb-n1,\n.my-n1 {\n  margin-bottom: -0.25rem !important;\n}\n\n.ml-n1,\n.mx-n1 {\n  margin-left: -0.25rem !important;\n}\n\n.m-n2 {\n  margin: -0.5rem !important;\n}\n\n.mt-n2,\n.my-n2 {\n  margin-top: -0.5rem !important;\n}\n\n.mr-n2,\n.mx-n2 {\n  margin-right: -0.5rem !important;\n}\n\n.mb-n2,\n.my-n2 {\n  margin-bottom: -0.5rem !important;\n}\n\n.ml-n2,\n.mx-n2 {\n  margin-left: -0.5rem !important;\n}\n\n.m-n3 {\n  margin: -1rem !important;\n}\n\n.mt-n3,\n.my-n3 {\n  margin-top: -1rem !important;\n}\n\n.mr-n3,\n.mx-n3 {\n  margin-right: -1rem !important;\n}\n\n.mb-n3,\n.my-n3 {\n  margin-bottom: -1rem !important;\n}\n\n.ml-n3,\n.mx-n3 {\n  margin-left: -1rem !important;\n}\n\n.m-n4 {\n  margin: -1.5rem !important;\n}\n\n.mt-n4,\n.my-n4 {\n  margin-top: -1.5rem !important;\n}\n\n.mr-n4,\n.mx-n4 {\n  margin-right: -1.5rem !important;\n}\n\n.mb-n4,\n.my-n4 {\n  margin-bottom: -1.5rem !important;\n}\n\n.ml-n4,\n.mx-n4 {\n  margin-left: -1.5rem !important;\n}\n\n.m-n5 {\n  margin: -3rem !important;\n}\n\n.mt-n5,\n.my-n5 {\n  margin-top: -3rem !important;\n}\n\n.mr-n5,\n.mx-n5 {\n  margin-right: -3rem !important;\n}\n\n.mb-n5,\n.my-n5 {\n  margin-bottom: -3rem !important;\n}\n\n.ml-n5,\n.mx-n5 {\n  margin-left: -3rem !important;\n}\n\n.m-auto {\n  margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n  margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n  margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n  margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n  margin-left: auto !important;\n}\n\n@media (min-width: 576px) {\n  .m-sm-0 {\n    margin: 0 !important;\n  }\n  .mt-sm-0,\n  .my-sm-0 {\n    margin-top: 0 !important;\n  }\n  .mr-sm-0,\n  .mx-sm-0 {\n    margin-right: 0 !important;\n  }\n  .mb-sm-0,\n  .my-sm-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-sm-0,\n  .mx-sm-0 {\n    margin-left: 0 !important;\n  }\n  .m-sm-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-sm-1,\n  .my-sm-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-sm-1,\n  .mx-sm-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-sm-1,\n  .my-sm-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-sm-1,\n  .mx-sm-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-sm-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-sm-2,\n  .my-sm-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-sm-2,\n  .mx-sm-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-sm-2,\n  .my-sm-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-sm-2,\n  .mx-sm-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-sm-3 {\n    margin: 1rem !important;\n  }\n  .mt-sm-3,\n  .my-sm-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-sm-3,\n  .mx-sm-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-sm-3,\n  .my-sm-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-sm-3,\n  .mx-sm-3 {\n    margin-left: 1rem !important;\n  }\n  .m-sm-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-sm-4,\n  .my-sm-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-sm-4,\n  .mx-sm-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-sm-4,\n  .my-sm-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-sm-4,\n  .mx-sm-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-sm-5 {\n    margin: 3rem !important;\n  }\n  .mt-sm-5,\n  .my-sm-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-sm-5,\n  .mx-sm-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-sm-5,\n  .my-sm-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-sm-5,\n  .mx-sm-5 {\n    margin-left: 3rem !important;\n  }\n  .p-sm-0 {\n    padding: 0 !important;\n  }\n  .pt-sm-0,\n  .py-sm-0 {\n    padding-top: 0 !important;\n  }\n  .pr-sm-0,\n  .px-sm-0 {\n    padding-right: 0 !important;\n  }\n  .pb-sm-0,\n  .py-sm-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-sm-0,\n  .px-sm-0 {\n    padding-left: 0 !important;\n  }\n  .p-sm-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-sm-1,\n  .py-sm-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-sm-1,\n  .px-sm-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-sm-1,\n  .py-sm-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-sm-1,\n  .px-sm-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-sm-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-sm-2,\n  .py-sm-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-sm-2,\n  .px-sm-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-sm-2,\n  .py-sm-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-sm-2,\n  .px-sm-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-sm-3 {\n    padding: 1rem !important;\n  }\n  .pt-sm-3,\n  .py-sm-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-sm-3,\n  .px-sm-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-sm-3,\n  .py-sm-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-sm-3,\n  .px-sm-3 {\n    padding-left: 1rem !important;\n  }\n  .p-sm-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-sm-4,\n  .py-sm-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-sm-4,\n  .px-sm-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-sm-4,\n  .py-sm-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-sm-4,\n  .px-sm-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-sm-5 {\n    padding: 3rem !important;\n  }\n  .pt-sm-5,\n  .py-sm-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-sm-5,\n  .px-sm-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-sm-5,\n  .py-sm-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-sm-5,\n  .px-sm-5 {\n    padding-left: 3rem !important;\n  }\n  .m-sm-n1 {\n    margin: -0.25rem !important;\n  }\n  .mt-sm-n1,\n  .my-sm-n1 {\n    margin-top: -0.25rem !important;\n  }\n  .mr-sm-n1,\n  .mx-sm-n1 {\n    margin-right: -0.25rem !important;\n  }\n  .mb-sm-n1,\n  .my-sm-n1 {\n    margin-bottom: -0.25rem !important;\n  }\n  .ml-sm-n1,\n  .mx-sm-n1 {\n    margin-left: -0.25rem !important;\n  }\n  .m-sm-n2 {\n    margin: -0.5rem !important;\n  }\n  .mt-sm-n2,\n  .my-sm-n2 {\n    margin-top: -0.5rem !important;\n  }\n  .mr-sm-n2,\n  .mx-sm-n2 {\n    margin-right: -0.5rem !important;\n  }\n  .mb-sm-n2,\n  .my-sm-n2 {\n    margin-bottom: -0.5rem !important;\n  }\n  .ml-sm-n2,\n  .mx-sm-n2 {\n    margin-left: -0.5rem !important;\n  }\n  .m-sm-n3 {\n    margin: -1rem !important;\n  }\n  .mt-sm-n3,\n  .my-sm-n3 {\n    margin-top: -1rem !important;\n  }\n  .mr-sm-n3,\n  .mx-sm-n3 {\n    margin-right: -1rem !important;\n  }\n  .mb-sm-n3,\n  .my-sm-n3 {\n    margin-bottom: -1rem !important;\n  }\n  .ml-sm-n3,\n  .mx-sm-n3 {\n    margin-left: -1rem !important;\n  }\n  .m-sm-n4 {\n    margin: -1.5rem !important;\n  }\n  .mt-sm-n4,\n  .my-sm-n4 {\n    margin-top: -1.5rem !important;\n  }\n  .mr-sm-n4,\n  .mx-sm-n4 {\n    margin-right: -1.5rem !important;\n  }\n  .mb-sm-n4,\n  .my-sm-n4 {\n    margin-bottom: -1.5rem !important;\n  }\n  .ml-sm-n4,\n  .mx-sm-n4 {\n    margin-left: -1.5rem !important;\n  }\n  .m-sm-n5 {\n    margin: -3rem !important;\n  }\n  .mt-sm-n5,\n  .my-sm-n5 {\n    margin-top: -3rem !important;\n  }\n  .mr-sm-n5,\n  .mx-sm-n5 {\n    margin-right: -3rem !important;\n  }\n  .mb-sm-n5,\n  .my-sm-n5 {\n    margin-bottom: -3rem !important;\n  }\n  .ml-sm-n5,\n  .mx-sm-n5 {\n    margin-left: -3rem !important;\n  }\n  .m-sm-auto {\n    margin: auto !important;\n  }\n  .mt-sm-auto,\n  .my-sm-auto {\n    margin-top: auto !important;\n  }\n  .mr-sm-auto,\n  .mx-sm-auto {\n    margin-right: auto !important;\n  }\n  .mb-sm-auto,\n  .my-sm-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-sm-auto,\n  .mx-sm-auto {\n    margin-left: auto !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .m-md-0 {\n    margin: 0 !important;\n  }\n  .mt-md-0,\n  .my-md-0 {\n    margin-top: 0 !important;\n  }\n  .mr-md-0,\n  .mx-md-0 {\n    margin-right: 0 !important;\n  }\n  .mb-md-0,\n  .my-md-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-md-0,\n  .mx-md-0 {\n    margin-left: 0 !important;\n  }\n  .m-md-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-md-1,\n  .my-md-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-md-1,\n  .mx-md-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-md-1,\n  .my-md-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-md-1,\n  .mx-md-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-md-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-md-2,\n  .my-md-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-md-2,\n  .mx-md-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-md-2,\n  .my-md-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-md-2,\n  .mx-md-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-md-3 {\n    margin: 1rem !important;\n  }\n  .mt-md-3,\n  .my-md-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-md-3,\n  .mx-md-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-md-3,\n  .my-md-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-md-3,\n  .mx-md-3 {\n    margin-left: 1rem !important;\n  }\n  .m-md-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-md-4,\n  .my-md-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-md-4,\n  .mx-md-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-md-4,\n  .my-md-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-md-4,\n  .mx-md-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-md-5 {\n    margin: 3rem !important;\n  }\n  .mt-md-5,\n  .my-md-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-md-5,\n  .mx-md-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-md-5,\n  .my-md-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-md-5,\n  .mx-md-5 {\n    margin-left: 3rem !important;\n  }\n  .p-md-0 {\n    padding: 0 !important;\n  }\n  .pt-md-0,\n  .py-md-0 {\n    padding-top: 0 !important;\n  }\n  .pr-md-0,\n  .px-md-0 {\n    padding-right: 0 !important;\n  }\n  .pb-md-0,\n  .py-md-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-md-0,\n  .px-md-0 {\n    padding-left: 0 !important;\n  }\n  .p-md-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-md-1,\n  .py-md-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-md-1,\n  .px-md-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-md-1,\n  .py-md-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-md-1,\n  .px-md-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-md-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-md-2,\n  .py-md-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-md-2,\n  .px-md-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-md-2,\n  .py-md-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-md-2,\n  .px-md-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-md-3 {\n    padding: 1rem !important;\n  }\n  .pt-md-3,\n  .py-md-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-md-3,\n  .px-md-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-md-3,\n  .py-md-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-md-3,\n  .px-md-3 {\n    padding-left: 1rem !important;\n  }\n  .p-md-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-md-4,\n  .py-md-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-md-4,\n  .px-md-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-md-4,\n  .py-md-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-md-4,\n  .px-md-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-md-5 {\n    padding: 3rem !important;\n  }\n  .pt-md-5,\n  .py-md-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-md-5,\n  .px-md-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-md-5,\n  .py-md-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-md-5,\n  .px-md-5 {\n    padding-left: 3rem !important;\n  }\n  .m-md-n1 {\n    margin: -0.25rem !important;\n  }\n  .mt-md-n1,\n  .my-md-n1 {\n    margin-top: -0.25rem !important;\n  }\n  .mr-md-n1,\n  .mx-md-n1 {\n    margin-right: -0.25rem !important;\n  }\n  .mb-md-n1,\n  .my-md-n1 {\n    margin-bottom: -0.25rem !important;\n  }\n  .ml-md-n1,\n  .mx-md-n1 {\n    margin-left: -0.25rem !important;\n  }\n  .m-md-n2 {\n    margin: -0.5rem !important;\n  }\n  .mt-md-n2,\n  .my-md-n2 {\n    margin-top: -0.5rem !important;\n  }\n  .mr-md-n2,\n  .mx-md-n2 {\n    margin-right: -0.5rem !important;\n  }\n  .mb-md-n2,\n  .my-md-n2 {\n    margin-bottom: -0.5rem !important;\n  }\n  .ml-md-n2,\n  .mx-md-n2 {\n    margin-left: -0.5rem !important;\n  }\n  .m-md-n3 {\n    margin: -1rem !important;\n  }\n  .mt-md-n3,\n  .my-md-n3 {\n    margin-top: -1rem !important;\n  }\n  .mr-md-n3,\n  .mx-md-n3 {\n    margin-right: -1rem !important;\n  }\n  .mb-md-n3,\n  .my-md-n3 {\n    margin-bottom: -1rem !important;\n  }\n  .ml-md-n3,\n  .mx-md-n3 {\n    margin-left: -1rem !important;\n  }\n  .m-md-n4 {\n    margin: -1.5rem !important;\n  }\n  .mt-md-n4,\n  .my-md-n4 {\n    margin-top: -1.5rem !important;\n  }\n  .mr-md-n4,\n  .mx-md-n4 {\n    margin-right: -1.5rem !important;\n  }\n  .mb-md-n4,\n  .my-md-n4 {\n    margin-bottom: -1.5rem !important;\n  }\n  .ml-md-n4,\n  .mx-md-n4 {\n    margin-left: -1.5rem !important;\n  }\n  .m-md-n5 {\n    margin: -3rem !important;\n  }\n  .mt-md-n5,\n  .my-md-n5 {\n    margin-top: -3rem !important;\n  }\n  .mr-md-n5,\n  .mx-md-n5 {\n    margin-right: -3rem !important;\n  }\n  .mb-md-n5,\n  .my-md-n5 {\n    margin-bottom: -3rem !important;\n  }\n  .ml-md-n5,\n  .mx-md-n5 {\n    margin-left: -3rem !important;\n  }\n  .m-md-auto {\n    margin: auto !important;\n  }\n  .mt-md-auto,\n  .my-md-auto {\n    margin-top: auto !important;\n  }\n  .mr-md-auto,\n  .mx-md-auto {\n    margin-right: auto !important;\n  }\n  .mb-md-auto,\n  .my-md-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-md-auto,\n  .mx-md-auto {\n    margin-left: auto !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .m-lg-0 {\n    margin: 0 !important;\n  }\n  .mt-lg-0,\n  .my-lg-0 {\n    margin-top: 0 !important;\n  }\n  .mr-lg-0,\n  .mx-lg-0 {\n    margin-right: 0 !important;\n  }\n  .mb-lg-0,\n  .my-lg-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-lg-0,\n  .mx-lg-0 {\n    margin-left: 0 !important;\n  }\n  .m-lg-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-lg-1,\n  .my-lg-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-lg-1,\n  .mx-lg-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-lg-1,\n  .my-lg-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-lg-1,\n  .mx-lg-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-lg-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-lg-2,\n  .my-lg-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-lg-2,\n  .mx-lg-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-lg-2,\n  .my-lg-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-lg-2,\n  .mx-lg-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-lg-3 {\n    margin: 1rem !important;\n  }\n  .mt-lg-3,\n  .my-lg-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-lg-3,\n  .mx-lg-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-lg-3,\n  .my-lg-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-lg-3,\n  .mx-lg-3 {\n    margin-left: 1rem !important;\n  }\n  .m-lg-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-lg-4,\n  .my-lg-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-lg-4,\n  .mx-lg-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-lg-4,\n  .my-lg-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-lg-4,\n  .mx-lg-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-lg-5 {\n    margin: 3rem !important;\n  }\n  .mt-lg-5,\n  .my-lg-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-lg-5,\n  .mx-lg-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-lg-5,\n  .my-lg-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-lg-5,\n  .mx-lg-5 {\n    margin-left: 3rem !important;\n  }\n  .p-lg-0 {\n    padding: 0 !important;\n  }\n  .pt-lg-0,\n  .py-lg-0 {\n    padding-top: 0 !important;\n  }\n  .pr-lg-0,\n  .px-lg-0 {\n    padding-right: 0 !important;\n  }\n  .pb-lg-0,\n  .py-lg-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-lg-0,\n  .px-lg-0 {\n    padding-left: 0 !important;\n  }\n  .p-lg-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-lg-1,\n  .py-lg-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-lg-1,\n  .px-lg-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-lg-1,\n  .py-lg-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-lg-1,\n  .px-lg-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-lg-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-lg-2,\n  .py-lg-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-lg-2,\n  .px-lg-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-lg-2,\n  .py-lg-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-lg-2,\n  .px-lg-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-lg-3 {\n    padding: 1rem !important;\n  }\n  .pt-lg-3,\n  .py-lg-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-lg-3,\n  .px-lg-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-lg-3,\n  .py-lg-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-lg-3,\n  .px-lg-3 {\n    padding-left: 1rem !important;\n  }\n  .p-lg-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-lg-4,\n  .py-lg-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-lg-4,\n  .px-lg-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-lg-4,\n  .py-lg-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-lg-4,\n  .px-lg-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-lg-5 {\n    padding: 3rem !important;\n  }\n  .pt-lg-5,\n  .py-lg-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-lg-5,\n  .px-lg-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-lg-5,\n  .py-lg-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-lg-5,\n  .px-lg-5 {\n    padding-left: 3rem !important;\n  }\n  .m-lg-n1 {\n    margin: -0.25rem !important;\n  }\n  .mt-lg-n1,\n  .my-lg-n1 {\n    margin-top: -0.25rem !important;\n  }\n  .mr-lg-n1,\n  .mx-lg-n1 {\n    margin-right: -0.25rem !important;\n  }\n  .mb-lg-n1,\n  .my-lg-n1 {\n    margin-bottom: -0.25rem !important;\n  }\n  .ml-lg-n1,\n  .mx-lg-n1 {\n    margin-left: -0.25rem !important;\n  }\n  .m-lg-n2 {\n    margin: -0.5rem !important;\n  }\n  .mt-lg-n2,\n  .my-lg-n2 {\n    margin-top: -0.5rem !important;\n  }\n  .mr-lg-n2,\n  .mx-lg-n2 {\n    margin-right: -0.5rem !important;\n  }\n  .mb-lg-n2,\n  .my-lg-n2 {\n    margin-bottom: -0.5rem !important;\n  }\n  .ml-lg-n2,\n  .mx-lg-n2 {\n    margin-left: -0.5rem !important;\n  }\n  .m-lg-n3 {\n    margin: -1rem !important;\n  }\n  .mt-lg-n3,\n  .my-lg-n3 {\n    margin-top: -1rem !important;\n  }\n  .mr-lg-n3,\n  .mx-lg-n3 {\n    margin-right: -1rem !important;\n  }\n  .mb-lg-n3,\n  .my-lg-n3 {\n    margin-bottom: -1rem !important;\n  }\n  .ml-lg-n3,\n  .mx-lg-n3 {\n    margin-left: -1rem !important;\n  }\n  .m-lg-n4 {\n    margin: -1.5rem !important;\n  }\n  .mt-lg-n4,\n  .my-lg-n4 {\n    margin-top: -1.5rem !important;\n  }\n  .mr-lg-n4,\n  .mx-lg-n4 {\n    margin-right: -1.5rem !important;\n  }\n  .mb-lg-n4,\n  .my-lg-n4 {\n    margin-bottom: -1.5rem !important;\n  }\n  .ml-lg-n4,\n  .mx-lg-n4 {\n    margin-left: -1.5rem !important;\n  }\n  .m-lg-n5 {\n    margin: -3rem !important;\n  }\n  .mt-lg-n5,\n  .my-lg-n5 {\n    margin-top: -3rem !important;\n  }\n  .mr-lg-n5,\n  .mx-lg-n5 {\n    margin-right: -3rem !important;\n  }\n  .mb-lg-n5,\n  .my-lg-n5 {\n    margin-bottom: -3rem !important;\n  }\n  .ml-lg-n5,\n  .mx-lg-n5 {\n    margin-left: -3rem !important;\n  }\n  .m-lg-auto {\n    margin: auto !important;\n  }\n  .mt-lg-auto,\n  .my-lg-auto {\n    margin-top: auto !important;\n  }\n  .mr-lg-auto,\n  .mx-lg-auto {\n    margin-right: auto !important;\n  }\n  .mb-lg-auto,\n  .my-lg-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-lg-auto,\n  .mx-lg-auto {\n    margin-left: auto !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .m-xl-0 {\n    margin: 0 !important;\n  }\n  .mt-xl-0,\n  .my-xl-0 {\n    margin-top: 0 !important;\n  }\n  .mr-xl-0,\n  .mx-xl-0 {\n    margin-right: 0 !important;\n  }\n  .mb-xl-0,\n  .my-xl-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-xl-0,\n  .mx-xl-0 {\n    margin-left: 0 !important;\n  }\n  .m-xl-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-xl-1,\n  .my-xl-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-xl-1,\n  .mx-xl-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-xl-1,\n  .my-xl-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-xl-1,\n  .mx-xl-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-xl-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-xl-2,\n  .my-xl-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-xl-2,\n  .mx-xl-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-xl-2,\n  .my-xl-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-xl-2,\n  .mx-xl-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-xl-3 {\n    margin: 1rem !important;\n  }\n  .mt-xl-3,\n  .my-xl-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-xl-3,\n  .mx-xl-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-xl-3,\n  .my-xl-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-xl-3,\n  .mx-xl-3 {\n    margin-left: 1rem !important;\n  }\n  .m-xl-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-xl-4,\n  .my-xl-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-xl-4,\n  .mx-xl-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-xl-4,\n  .my-xl-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-xl-4,\n  .mx-xl-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-xl-5 {\n    margin: 3rem !important;\n  }\n  .mt-xl-5,\n  .my-xl-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-xl-5,\n  .mx-xl-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-xl-5,\n  .my-xl-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-xl-5,\n  .mx-xl-5 {\n    margin-left: 3rem !important;\n  }\n  .p-xl-0 {\n    padding: 0 !important;\n  }\n  .pt-xl-0,\n  .py-xl-0 {\n    padding-top: 0 !important;\n  }\n  .pr-xl-0,\n  .px-xl-0 {\n    padding-right: 0 !important;\n  }\n  .pb-xl-0,\n  .py-xl-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-xl-0,\n  .px-xl-0 {\n    padding-left: 0 !important;\n  }\n  .p-xl-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-xl-1,\n  .py-xl-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-xl-1,\n  .px-xl-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-xl-1,\n  .py-xl-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-xl-1,\n  .px-xl-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-xl-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-xl-2,\n  .py-xl-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-xl-2,\n  .px-xl-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-xl-2,\n  .py-xl-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-xl-2,\n  .px-xl-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-xl-3 {\n    padding: 1rem !important;\n  }\n  .pt-xl-3,\n  .py-xl-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-xl-3,\n  .px-xl-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-xl-3,\n  .py-xl-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-xl-3,\n  .px-xl-3 {\n    padding-left: 1rem !important;\n  }\n  .p-xl-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-xl-4,\n  .py-xl-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-xl-4,\n  .px-xl-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-xl-4,\n  .py-xl-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-xl-4,\n  .px-xl-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-xl-5 {\n    padding: 3rem !important;\n  }\n  .pt-xl-5,\n  .py-xl-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-xl-5,\n  .px-xl-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-xl-5,\n  .py-xl-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-xl-5,\n  .px-xl-5 {\n    padding-left: 3rem !important;\n  }\n  .m-xl-n1 {\n    margin: -0.25rem !important;\n  }\n  .mt-xl-n1,\n  .my-xl-n1 {\n    margin-top: -0.25rem !important;\n  }\n  .mr-xl-n1,\n  .mx-xl-n1 {\n    margin-right: -0.25rem !important;\n  }\n  .mb-xl-n1,\n  .my-xl-n1 {\n    margin-bottom: -0.25rem !important;\n  }\n  .ml-xl-n1,\n  .mx-xl-n1 {\n    margin-left: -0.25rem !important;\n  }\n  .m-xl-n2 {\n    margin: -0.5rem !important;\n  }\n  .mt-xl-n2,\n  .my-xl-n2 {\n    margin-top: -0.5rem !important;\n  }\n  .mr-xl-n2,\n  .mx-xl-n2 {\n    margin-right: -0.5rem !important;\n  }\n  .mb-xl-n2,\n  .my-xl-n2 {\n    margin-bottom: -0.5rem !important;\n  }\n  .ml-xl-n2,\n  .mx-xl-n2 {\n    margin-left: -0.5rem !important;\n  }\n  .m-xl-n3 {\n    margin: -1rem !important;\n  }\n  .mt-xl-n3,\n  .my-xl-n3 {\n    margin-top: -1rem !important;\n  }\n  .mr-xl-n3,\n  .mx-xl-n3 {\n    margin-right: -1rem !important;\n  }\n  .mb-xl-n3,\n  .my-xl-n3 {\n    margin-bottom: -1rem !important;\n  }\n  .ml-xl-n3,\n  .mx-xl-n3 {\n    margin-left: -1rem !important;\n  }\n  .m-xl-n4 {\n    margin: -1.5rem !important;\n  }\n  .mt-xl-n4,\n  .my-xl-n4 {\n    margin-top: -1.5rem !important;\n  }\n  .mr-xl-n4,\n  .mx-xl-n4 {\n    margin-right: -1.5rem !important;\n  }\n  .mb-xl-n4,\n  .my-xl-n4 {\n    margin-bottom: -1.5rem !important;\n  }\n  .ml-xl-n4,\n  .mx-xl-n4 {\n    margin-left: -1.5rem !important;\n  }\n  .m-xl-n5 {\n    margin: -3rem !important;\n  }\n  .mt-xl-n5,\n  .my-xl-n5 {\n    margin-top: -3rem !important;\n  }\n  .mr-xl-n5,\n  .mx-xl-n5 {\n    margin-right: -3rem !important;\n  }\n  .mb-xl-n5,\n  .my-xl-n5 {\n    margin-bottom: -3rem !important;\n  }\n  .ml-xl-n5,\n  .mx-xl-n5 {\n    margin-left: -3rem !important;\n  }\n  .m-xl-auto {\n    margin: auto !important;\n  }\n  .mt-xl-auto,\n  .my-xl-auto {\n    margin-top: auto !important;\n  }\n  .mr-xl-auto,\n  .mx-xl-auto {\n    margin-right: auto !important;\n  }\n  .mb-xl-auto,\n  .my-xl-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-xl-auto,\n  .mx-xl-auto {\n    margin-left: auto !important;\n  }\n}\n/*# sourceMappingURL=bootstrap-grid.css.map */"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bootstrap4/css/bootstrap-grid.css.map",
    "content": "{\"version\":3,\"sources\":[\"../../scss/bootstrap-grid.scss\",\"bootstrap-grid.css\",\"../../scss/_grid.scss\",\"../../scss/mixins/_grid.scss\",\"../../scss/mixins/_breakpoints.scss\",\"../../scss/_variables.scss\",\"../../scss/mixins/_grid-framework.scss\",\"../../scss/utilities/_display.scss\",\"../../scss/utilities/_flex.scss\",\"../../scss/utilities/_spacing.scss\"],\"names\":[],\"mappings\":\"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vBQ;IHTR,gBAA8C;EF4vB9C;EKnvBQ;IHTR,uBAA8C;EF+vB9C;EKtvBQ;IHTR,uBAA8C;EFkwB9C;EKzvBQ;IHTR,gBAA8C;EFqwB9C;EK5vBQ;IHTR,uBAA8C;EFwwB9C;EK/vBQ;IHTR,uBAA8C;EF2wB9C;AACF;;AMlzBM;EAAwB,wBAA0B;ANszBxD;;AMtzBM;EAAwB,0BAA0B;AN0zBxD;;AM1zBM;EAAwB,gCAA0B;AN8zBxD;;AM9zBM;EAAwB,yBAA0B;ANk0BxD;;AMl0BM;EAAwB,yBAA0B;ANs0BxD;;AMt0BM;EAAwB,6BAA0B;AN00BxD;;AM10BM;EAAwB,8BAA0B;AN80BxD;;AM90BM;EAAwB,+BAA0B;EAA1B,wBAA0B;ANk1BxD;;AMl1BM;EAAwB,sCAA0B;EAA1B,+BAA0B;ANs1BxD;;AGryBI;EGjDE;IAAwB,wBAA0B;EN21BtD;EM31BI;IAAwB,0BAA0B;EN81BtD;EM91BI;IAAwB,gCAA0B;ENi2BtD;EMj2BI;IAAwB,yBAA0B;ENo2BtD;EMp2BI;IAAwB,yBAA0B;ENu2BtD;EMv2BI;IAAwB,6BAA0B;EN02BtD;EM12BI;IAAwB,8BAA0B;EN62BtD;EM72BI;IAAwB,+BAA0B;IAA1B,wBAA0B;ENg3BtD;EMh3BI;IAAwB,sCAA0B;IAA1B,+BAA0B;ENm3BtD;AACF;;AGn0BI;EGjDE;IAAwB,wBAA0B;ENy3BtD;EMz3BI;IAAwB,0BAA0B;EN43BtD;EM53BI;IAAwB,gCAA0B;EN+3BtD;EM/3BI;IAAwB,yBAA0B;ENk4BtD;EMl4BI;IAAwB,yBAA0B;ENq4BtD;EMr4BI;IAAwB,6BAA0B;ENw4BtD;EMx4BI;IAAwB,8BAA0B;EN24BtD;EM34BI;IAAwB,+BAA0B;IAA1B,wBAA0B;EN84BtD;EM94BI;IAAwB,sCAA0B;IAA1B,+BAA0B;ENi5BtD;AACF;;AGj2BI;EGjDE;IAAwB,wBAA0B;ENu5BtD;EMv5BI;IAAwB,0BAA0B;EN05BtD;EM15BI;IAAwB,gCAA0B;EN65BtD;EM75BI;IAAwB,yBAA0B;ENg6BtD;EMh6BI;IAAwB,yBAA0B;ENm6BtD;EMn6BI;IAAwB,6BAA0B;EN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AEE,+BAAwC;ARgoDlD;;AQ9nDQ;;EAEE,gCAA0C;ARioDpD;;AQ/nDQ;;EAEE,8BAAsC;ARkoDhD;;AQjpDQ;EAAgC,uBAA4B;ARqpDpE;;AQppDQ;;EAEE,2BAAoC;ARupD9C;;AQrpDQ;;EAEE,6BAAwC;ARwpDlD;;AQtpDQ;;EAEE,8BAA0C;ARypDpD;;AQvpDQ;;EAEE,4BAAsC;AR0pDhD;;AQzqDQ;EAAgC,qBAA4B;AR6qDpE;;AQ5qDQ;;EAEE,yBAAoC;AR+qD9C;;AQ7qDQ;;EAEE,2BAAwC;ARgrDlD;;AQ9qDQ;;EAEE,4BAA0C;ARirDpD;;AQ/qDQ;;EAEE,0BAAsC;ARkrDhD;;AQjsDQ;EAAgC,2BAA4B;ARqsDpE;;AQpsDQ;;EAEE,+BAAoC;ARusD9C;;AQrsDQ;;EAEE,iCAAwC;ARwsDlD;;AQtsDQ;;EAEE,kCAA0C;ARysDpD;;AQvsDQ;;EAEE,gCAAsC;AR0sDhD;;AQztDQ;EAAgC,0BAA4B;AR6tDpE;;AQ5tDQ;;EAEE,8BAAoC;AR+tD9C;;AQ7tDQ;;EAEE,gCAAwC;ARguDlD;;AQ9tDQ;;EAEE,iCAA0C;ARiuDpD;;AQ/tDQ;;EAEE,+BAAsC;ARkuDhD;;AQjvDQ;EAAgC,wBAA4B;ARqvDpE;;AQpvDQ;;EAEE,4BAAoC;ARuvD9C;;AQrvDQ;;EAEE,8BAAwC;ARwvDlD;;AQtvDQ;;EAEE,+BAA0C;ARyvDpD;;AQvvDQ;;EAEE,6BAAsC;AR0vDhD;;AQzwDQ;EAAgC,0BAA4B;AR6wDpE;;AQ5wDQ;;EAEE,8BAAoC;AR+wD9C;;AQ7wDQ;;EAEE,gCAAwC;ARgxDlD;;AQ9wDQ;;EAEE,iCAA0C;ARixDpD;;AQ/wDQ;;EAEE,+BAAsC;ARkxDhD;;AQjyDQ;EAAgC,wBAA4B;ARqyDpE;;AQpyDQ;;EAEE,4BAAoC;ARuyD9C;;AQryDQ;;EAEE,8BAAwC;ARwyDlD;;AQtyDQ;;EAEE,+BAA0C;ARyyDpD;;AQvyDQ;;EAEE,6BAAsC;AR0yDhD;;AQlyDQ;EAAwB,2BAA2B;ARsyD3D;;AQryDQ;;EAEE,+BAA+B;ARwyDzC;;AQtyDQ;;EAEE,iCAAiC;ARyyD3C;;AQvyDQ;;EAEE,kCAAkC;AR0yD5C;;AQxyDQ;;EAEE,gCAAgC;AR2yD1C;;AQ1zDQ;EAAwB,0BAA2B;AR8zD3D;;AQ7zDQ;;EAEE,8BAA+B;ARg0DzC;;AQ9zDQ;;EAEE,gCAAiC;ARi0D3C;;AQ/zDQ;;EAEE,iCAAkC;ARk0D5C;;AQh0DQ;;EAEE,+BAAgC;ARm0D1C;;AQl1DQ;EAAwB,wBAA2B;ARs1D3D;;AQr1DQ;;EAEE,4BAA+B;ARw1DzC;;AQt1DQ;;EAEE,8BAAiC;ARy1D3C;;AQv1DQ;;EAEE,+BAAkC;AR01D5C;;AQx1DQ;;EAEE,6BAAgC;AR21D1C;;AQ12DQ;EAAwB,0BAA2B;AR82D3D;;AQ72DQ;;EAEE,8BAA+B;ARg3DzC;;AQ92DQ;;EAEE,gCAAiC;ARi3D3C;;AQ/2DQ;;EAEE,iCAAkC;ARk3D5C;;AQh3DQ;;EAEE,+BAAgC;ARm3D1C;;AQl4DQ;EAAwB,wBAA2B;ARs4D3D;;AQr4DQ;;EAEE,4BAA+B;ARw4DzC;;AQt4DQ;;EAEE,8BAAiC;ARy4D3C;;AQv4DQ;;EAEE,+BAAkC;AR04D5C;;AQx4DQ;;EAEE,6BAAgC;AR24D1C;;AQr4DI;EAAmB,uBAAuB;ARy4D9C;;AQx4DI;;EAEE,2BAA2B;AR24DjC;;AQz4DI;;EAEE,6BAA6B;AR44DnC;;AQ14DI;;EAEE,8BAA8B;AR64DpC;;AQ34DI;;EAEE,4BAA4B;AR84DlC;;AGv5DI;EKlDI;IAAgC,oBAA4B;ER88DlE;EQ78DM;;IAEE,wBAAoC;ER+8D5C;EQ78DM;;IAEE,0BAAwC;ER+8DhD;EQ78DM;;IAEE,2BAA0C;ER+8DlD;EQ78DM;;IAEE,yBAAsC;ER+8D9C;EQ99DM;IAAgC,0BAA4B;ERi+DlE;EQh+DM;;IAEE,8BAAoC;ERk+D5C;EQh+DM;;IAEE,gCAAwC;ERk+DhD;EQh+DM;;IAEE,iCAA0C;ERk+DlD;EQh+DM;;IAEE,+BAAsC;ERk+D9C;EQj/DM;IAAgC,yBAA4B;ERo/DlE;EQn/DM;;IAEE,6BAAoC;ERq/D5C;EQn/DM;;IAEE,+BAAwC;ERq/DhD;EQn/DM;;IAEE,gCAA0C;ERq/DlD;EQn/DM;;IAEE,8BAAsC;ERq/D9C;EQpgEM;IAAgC,uBAA4B;ERugElE;EQtgEM;;IAEE,2BAAoC;ERwgE5C;EQtgEM;;IAEE,6BAAwC;ERwgEhD;EQtgEM;;IAEE,8BAA0C;ERwgElD;EQtgEM;;IAEE,4BAAsC;ERwgE9C;EQvhEM;IAAgC,yBAA4B;ER0hElE;EQzhEM;;IAEE,6BAAoC;ER2hE5C;EQzhEM;;IAEE,+BAAwC;ER2hEhD;EQzhEM;;IAEE,gCAA0C;ER2hElD;EQzhEM;;IAEE,8BAAsC;ER2hE9C;EQ1iEM;IAAgC,uBAA4B;ER6iElE;EQ5iEM;;IAEE,2BAAoC;ER8iE5C;EQ5iEM;;IAEE,6BAAwC;ER8iEhD;EQ5iEM;;IAEE,8BAA0C;ER8iElD;EQ5iEM;;IAEE,4BAAsC;ER8iE9C;EQ7jEM;IAAgC,qBAA4B;ERgkElE;EQ/jEM;;IAEE,yBAAoC;ERikE5C;EQ/jEM;;IAEE,2BAAwC;ERikEhD;EQ/jEM;;IAEE,4BAA0C;ERikElD;EQ/jEM;;IAEE,0BAAsC;ERikE9C;EQhlEM;IAAgC,2BAA4B;ERmlElE;EQllEM;;IAEE,+BAAoC;ERolE5C;EQllEM;;IAEE,iCAAwC;ERolEhD;EQllEM;;IAEE,kCAA0C;ERolElD;EQllEM;;IAEE,gCAAsC;ERolE9C;EQnmEM;IAAgC,0BAA4B;ERsmElE;EQrmEM;;IAEE,8BAAoC;ERumE5C;EQrmEM;;IAEE,gCAAwC;ERumEhD;EQrmEM;;IAEE,iCAA0C;ERumElD;EQrmEM;;IAEE,+BAAsC;ERumE9C;EQtnEM;IAAgC,wBAA4B;ERynElE;EQxnEM;;IAEE,4BAAoC;ER0nE5C;EQxnEM;;IAEE,8BAAwC;ER0nEhD;EQxnEM;;IAEE,+BAA0C;ER0nElD;EQxnEM;;IAEE,6BAAsC;ER0nE9C;EQzoEM;IAAgC,0BAA4B;ER4oElE;EQ3oEM;;IAEE,8BAAoC;ER6oE5C;EQ3oEM;;IAEE,gCAAwC;ER6oEhD;EQ3oEM;;IAEE,iCAA0C;ER6oElD;EQ3oEM;;IAEE,+BAAsC;ER6oE9C;EQ5pEM;IAAgC,wBAA4B;ER+pElE;EQ9pEM;;IAEE,4BAAoC;ERgqE5C;EQ9pEM;;IAEE,8BAAwC;ERgqEhD;EQ9pEM;;IAEE,+BAA0C;ERgqElD;EQ9pEM;;IAEE,6BAAsC;ERgqE9C;EQxpEM;IAAwB,2BAA2B;ER2pEzD;EQ1pEM;;IAEE,+BAA+B;ER4pEvC;EQ1pEM;;IAEE,iCAAiC;ER4pEzC;EQ1pEM;;IAEE,kCAAkC;ER4pE1C;EQ1pEM;;IAEE,gCAAgC;ER4pExC;EQ3qEM;IAAwB,0BAA2B;ER8qEzD;EQ7qEM;;IAEE,8BAA+B;ER+qEvC;EQ7qEM;;IAEE,gCAAiC;ER+qEzC;EQ7qEM;;IAEE,iCAAkC;ER+qE1C;EQ7qEM;;IAEE,+BAAgC;ER+qExC;EQ9rEM;IAAwB,wBAA2B;ERisEzD;EQhsEM;;IAEE,4BAA+B;ERksEvC;EQhsEM;;IAEE,8BAAiC;ERksEzC;EQhsEM;;IAEE,+BAAkC;ERksE1C;EQhsEM;;IAEE,6BAAgC;ERksExC;EQjtEM;IAAwB,0BAA2B;ERotEzD;EQntEM;;IAEE,8BAA+B;ERqtEvC;EQntEM;;IAEE,gCAAiC;ERqtEzC;EQntEM;;IAEE,iCAAkC;ERqtE1C;EQntEM;;IAEE,+BAAgC;ERqtExC;EQpuEM;IAAwB,wBAA2B;ERuuEzD;EQtuEM;;IAEE,4BAA+B;ERwuEvC;EQtuEM;;IAEE,8BAAiC;ERwuEzC;EQtuEM;;IAEE,+BAAkC;ERwuE1C;EQtuEM;;IAEE,6BAAgC;ERwuExC;EQluEE;IAAmB,uBAAuB;ERquE5C;EQpuEE;;IAEE,2BAA2B;ERsuE/B;EQpuEE;;IAEE,6BAA6B;ERsuEjC;EQpuEE;;IAEE,8BAA8B;ERsuElC;EQpuEE;;IAEE,4BAA4B;ERsuEhC;AACF;;AGhvEI;EKlDI;IAAgC,oBAA4B;ERuyElE;EQtyEM;;IAEE,wBAAoC;ERwyE5C;EQtyEM;;IAEE,0BAAwC;ERwyEhD;EQtyEM;;IAEE,2BAA0C;ERwyElD;EQtyEM;;IAEE,yBAAsC;ERwyE9C;EQvzEM;IAAgC,0BAA4B;ER0zElE;EQzzEM;;IAEE,8BAAoC;ER2zE5C;EQzzEM;;IAEE,gCAAwC;ER2zEhD;EQzzEM;;IAEE,iCAA0C;ER2zElD;EQzzEM;;IAEE,+BAAsC;ER2zE9C;EQ10EM;IAAgC,yBAA4B;ER60ElE;EQ50EM;;IAEE,6BAAoC;ER80E5C;EQ50EM;;IAEE,+BAAwC;ER80EhD;EQ50EM;;IAEE,gCAA0C;ER80ElD;EQ50EM;;IAEE,8BAAsC;ER80E9C;EQ71EM;IAAgC,uBAA4B;ERg2ElE;EQ/1EM;;IAEE,2BAAoC;ERi2E5C;EQ/1EM;;IAEE,6BAAwC;ERi2EhD;EQ/1EM;;IAEE,8BAA0C;ERi2ElD;EQ/1EM;;IAEE,4BAAsC;ERi2E9C;EQh3EM;IAAgC,yBAA4B;ERm3ElE;EQl3EM;;IAEE,6BAAoC;ERo3E5C;EQl3EM;;IAEE,+BAAwC;ERo3EhD;EQl3EM;;IAEE,gCAA0C;ERo3ElD;EQl3EM;;IAEE,8BAAsC;ERo3E9C;EQn4EM;IAAgC,uBAA4B;ERs4ElE;EQr4EM;;IAEE,2BAAoC;ERu4E5C;EQr4EM;;IAEE,6BAAwC;ERu4EhD;EQr4EM;;IAEE,8BAA0C;ERu4ElD;EQr4EM;;IAEE,4BAAsC;ERu4E9C;EQt5EM;IAAgC,qBAA4B;ERy5ElE;EQx5EM;;IAEE,yBAAoC;ER05E5C;EQx5EM;;IAEE,2BAAwC;ER05EhD;EQx5EM;;IAEE,4BAA0C;ER05ElD;EQx5EM;;IAEE,0BAAsC;ER05E9C;EQz6EM;IAAgC,2BAA4B;ER46ElE;EQ36EM;;IAEE,+BAAoC;ER66E5C;EQ36EM;;IAEE,iCAAwC;ER66EhD;EQ36EM;;IAEE,kCAA0C;ER66ElD;EQ36EM;;IAEE,gCAAsC;ER66E9C;EQ57EM;IAAgC,0BAA4B;ER+7ElE;EQ97EM;;IAEE,8BAAoC;ERg8E5C;EQ97EM;;IAEE,gCAAwC;ERg8EhD;EQ97EM;;IAEE,iCAA0C;ERg8ElD;EQ97EM;;IAEE,+BAAsC;ERg8E9C;EQ/8EM;IAAgC,wBAA4B;ERk9ElE;EQj9EM;;IAEE,4BAAoC;ERm9E5C;EQj9EM;;IAEE,8BAAwC;ERm9EhD;EQj9EM;;IAEE,+BAA0C;ERm9ElD;EQj9EM;;IAEE,6BAAsC;ERm9E9C;EQl+EM;IAAgC,0BAA4B;ERq+ElE;EQp+EM;;IAEE,8BAAoC;ERs+E5C;EQp+EM;;IAEE,gCAAwC;ERs+EhD;EQp+EM;;IAEE,iCAA0C;ERs+ElD;EQp+EM;;IAEE,+BAAsC;ERs+E9C;EQr/EM;IAAgC,wBAA4B;ERw/ElE;EQv/EM;;IAEE,4BAAoC;ERy/E5C;EQv/EM;;IAEE,8BAAwC;ERy/EhD;EQv/EM;;IAEE,+BAA0C;ERy/ElD;EQv/EM;;IAEE,6BAAsC;ERy/E9C;EQj/EM;IAAwB,2BAA2B;ERo/EzD;EQn/EM;;IAEE,+BAA+B;ERq/EvC;EQn/EM;;IAEE,iCAAiC;ERq/EzC;EQn/EM;;IAEE,kCAAkC;ERq/E1C;EQn/EM;;IAEE,gCAAgC;ERq/ExC;EQpgFM;IAAwB,0BAA2B;ERugFzD;EQtgFM;;IAEE,8BAA+B;ERwgFvC;EQtgFM;;IAEE,gCAAiC;ERwgFzC;EQtgFM;;IAEE,iCAAkC;ERwgF1C;EQtgFM;;IAEE,+BAAgC;ERwgFxC;EQvhFM;IAAwB,wBAA2B;ER0hFzD;EQzhFM;;IAEE,4BAA+B;ER2hFvC;EQzhFM;;IAEE,8BAAiC;ER2hFzC;EQzhFM;;IAEE,+BAAkC;ER2hF1C;EQzhFM;;IAEE,6BAAgC;ER2hFxC;EQ1iFM;IAAwB,0BAA2B;ER6iFzD;EQ5iFM;;IAEE,8BAA+B;ER8iFvC;EQ5iFM;;IAEE,gCAAiC;ER8iFzC;EQ5iFM;;IAEE,iCAAkC;ER8iF1C;EQ5iFM;;IAEE,+BAAgC;ER8iFxC;EQ7jFM;IAAwB,wBAA2B;ERgkFzD;EQ/jFM;;IAEE,4BAA+B;ERikFvC;EQ/jFM;;IAEE,8BAAiC;ERikFzC;EQ/jFM;;IAEE,+BAAkC;ERikF1C;EQ/jFM;;IAEE,6BAAgC;ERikFxC;EQ3jFE;IAAmB,uBAAuB;ER8jF5C;EQ7jFE;;IAEE,2BAA2B;ER+jF/B;EQ7jFE;;IAEE,6BAA6B;ER+jFjC;EQ7jFE;;IAEE,8BAA8B;ER+jFlC;EQ7jFE;;IAEE,4BAA4B;ER+jFhC;AACF;;AGzkFI;EKlDI;IAAgC,oBAA4B;ERgoFlE;EQ/nFM;;IAEE,wBAAoC;ERioF5C;EQ/nFM;;IAEE,0BAAwC;ERioFhD;EQ/nFM;;IAEE,2BAA0C;ERioFlD;EQ/nFM;;IAEE,yBAAsC;ERioF9C;EQhpFM;IAAgC,0BAA4B;ERmpFlE;EQlpFM;;IAEE,8BAAoC;ERopF5C;EQlpFM;;IAEE,gCAAwC;ERopFhD;EQlpFM;;IAEE,iCAA0C;ERopFlD;EQlpFM;;IAEE,+BAAsC;ERopF9C;EQnqFM;IAAgC,yBAA4B;ERsqFlE;EQrqFM;;IAEE,6BAAoC;ERuqF5C;EQrqFM;;IAEE,+BAAwC;ERuqFhD;EQrqFM;;IAEE,gCAA0C;ERuqFlD;EQrqFM;;IAEE,8BAAsC;ERuqF9C;EQtrFM;IAAgC,uBAA4B;ERyrFlE;EQxrFM;;IAEE,2BAAoC;ER0rF5C;EQxrFM;;IAEE,6BAAwC;ER0rFhD;EQxrFM;;IAEE,8BAA0C;ER0rFlD;EQxrFM;;IAEE,4BAAsC;ER0rF9C;EQzsFM;IAAgC,yBAA4B;ER4sFlE;EQ3sFM;;IAEE,6BAAoC;ER6sF5C;EQ3sFM;;IAEE,+BAAwC;ER6sFhD;EQ3sFM;;IAEE,gCAA0C;ER6sFlD;EQ3sFM;;IAEE,8BAAsC;ER6sF9C;EQ5tFM;IAAgC,uBAA4B;ER+tFlE;EQ9tFM;;IAEE,2BAAoC;ERguF5C;EQ9tFM;;IAEE,6BAAwC;ERguFhD;EQ9tFM;;IAEE,8BAA0C;ERguFlD;EQ9tFM;;IAEE,4BAAsC;ERguF9C;EQ/uFM;IAAgC,qBAA4B;ERkvFlE;EQjvFM;;IAEE,yBAAoC;ERmvF5C;EQjvFM;;IAEE,2BAAwC;ERmvFhD;EQjvFM;;IAEE,4BAA0C;ERmvFlD;EQjvFM;;IAEE,0BAAsC;ERmvF9C;EQlwFM;IAAgC,2BAA4B;ERqwFlE;EQpwFM;;IAEE,+BAAoC;ERswF5C;EQpwFM;;IAEE,iCAAwC;ERswFhD;EQpwFM;;IAEE,kCAA0C;ERswFlD;EQpwFM;;IAEE,gCAAsC;ERswF9C;EQrxFM;IAAgC,0BAA4B;ERwxFlE;EQvxFM;;IAEE,8BAAoC;ERyxF5C;EQvxFM;;IAEE,gCAAwC;ERyxFhD;EQvxFM;;IAEE,iCAA0C;ERyxFlD;EQvxFM;;IAEE,+BAAsC;ERyxF9C;EQxyFM;IAAgC,wBAA4B;ER2yFlE;EQ1yFM;;IAEE,4BAAoC;ER4yF5C;EQ1yFM;;IAEE,8BAAwC;ER4yFhD;EQ1yFM;;IAEE,+BAA0C;ER4yFlD;EQ1yFM;;IAEE,6BAAsC;ER4yF9C;EQ3zFM;IAAgC,0BAA4B;ER8zFlE;EQ7zFM;;IAEE,8BAAoC;ER+zF5C;EQ7zFM;;IAEE,gCAAwC;ER+zFhD;EQ7zFM;;IAEE,iCAA0C;ER+zFlD;EQ7zFM;;IAEE,+BAAsC;ER+zF9C;EQ90FM;IAAgC,wBAA4B;ERi1FlE;EQh1FM;;IAEE,4BAAoC;ERk1F5C;EQh1FM;;IAEE,8BAAwC;ERk1FhD;EQh1FM;;IAEE,+BAA0C;ERk1FlD;EQh1FM;;IAEE,6BAAsC;ERk1F9C;EQ10FM;IAAwB,2BAA2B;ER60FzD;EQ50FM;;IAEE,+BAA+B;ER80FvC;EQ50FM;;IAEE,iCAAiC;ER80FzC;EQ50FM;;IAEE,kCAAkC;ER80F1C;EQ50FM;;IAEE,gCAAgC;ER80FxC;EQ71FM;IAAwB,0BAA2B;ERg2FzD;EQ/1FM;;IAEE,8BAA+B;ERi2FvC;EQ/1FM;;IAEE,gCAAiC;ERi2FzC;EQ/1FM;;IAEE,iCAAkC;ERi2F1C;EQ/1FM;;IAEE,+BAAgC;ERi2FxC;EQh3FM;IAAwB,wBAA2B;ERm3FzD;EQl3FM;;IAEE,4BAA+B;ERo3FvC;EQl3FM;;IAEE,8BAAiC;ERo3FzC;EQl3FM;;IAEE,+BAAkC;ERo3F1C;EQl3FM;;IAEE,6BAAgC;ERo3FxC;EQn4FM;IAAwB,0BAA2B;ERs4FzD;EQr4FM;;IAEE,8BAA+B;ERu4FvC;EQr4FM;;IAEE,gCAAiC;ERu4FzC;EQr4FM;;IAEE,iCAAkC;ERu4F1C;EQr4FM;;IAEE,+BAAgC;ERu4FxC;EQt5FM;IAAwB,wBAA2B;ERy5FzD;EQx5FM;;IAEE,4BAA+B;ER05FvC;EQx5FM;;IAEE,8BAAiC;ER05FzC;EQx5FM;;IAEE,+BAAkC;ER05F1C;EQx5FM;;IAEE,6BAAgC;ER05FxC;EQp5FE;IAAmB,uBAAuB;ERu5F5C;EQt5FE;;IAEE,2BAA2B;ERw5F/B;EQt5FE;;IAEE,6BAA6B;ERw5FjC;EQt5FE;;IAEE,8BAA8B;ERw5FlC;EQt5FE;;IAEE,4BAA4B;ERw5FhC;AACF;;AGl6FI;EKlDI;IAAgC,oBAA4B;ERy9FlE;EQx9FM;;IAEE,wBAAoC;ER09F5C;EQx9FM;;IAEE,0BAAwC;ER09FhD;EQx9FM;;IAEE,2BAA0C;ER09FlD;EQx9FM;;IAEE,yBAAsC;ER09F9C;EQz+FM;IAAgC,0BAA4B;ER4+FlE;EQ3+FM;;IAEE,8BAAoC;ER6+F5C;EQ3+FM;;IAEE,gCAAwC;ER6+FhD;EQ3+FM;;IAEE,iCAA0C;ER6+FlD;EQ3+FM;;IAEE,+BAAsC;ER6+F9C;EQ5/FM;IAAgC,yBAA4B;ER+/FlE;EQ9/FM;;IAEE,6BAAoC;ERggG5C;EQ9/FM;;IAEE,+BAAwC;ERggGhD;EQ9/FM;;IAEE,gCAA0C;ERggGlD;EQ9/FM;;IAEE,8BAAsC;ERggG9C;EQ/gGM;IAAgC,uBAA4B;ERkhGlE;EQjhGM;;IAEE,2BAAoC;ERmhG5C;EQjhGM;;IAEE,6BAAwC;ERmhGhD;EQjhGM;;IAEE,8BAA0C;ERmhGlD;EQjhGM;;IAEE,4BAAsC;ERmhG9C;EQliGM;IAAgC,yBAA4B;ERqiGlE;EQpiGM;;IAEE,6BAAoC;ERsiG5C;EQpiGM;;IAEE,+BAAwC;ERsiGhD;EQpiGM;;IAEE,gCAA0C;ERsiGlD;EQpiGM;;IAEE,8BAAsC;ERsiG9C;EQrjGM;IAAgC,uBAA4B;ERwjGlE;EQvjGM;;IAEE,2BAAoC;ERyjG5C;EQvjGM;;IAEE,6BAAwC;ERyjGhD;EQvjGM;;IAEE,8BAA0C;ERyjGlD;EQvjGM;;IAEE,4BAAsC;ERyjG9C;EQxkGM;IAAgC,qBAA4B;ER2kGlE;EQ1kGM;;IAEE,yBAAoC;ER4kG5C;EQ1kGM;;IAEE,2BAAwC;ER4kGhD;EQ1kGM;;IAEE,4BAA0C;ER4kGlD;EQ1kGM;;IAEE,0BAAsC;ER4kG9C;EQ3lGM;IAAgC,2BAA4B;ER8lGlE;EQ7lGM;;IAEE,+BAAoC;ER+lG5C;EQ7lGM;;IAEE,iCAAwC;ER+lGhD;EQ7lGM;;IAEE,kCAA0C;ER+lGlD;EQ7lGM;;IAEE,gCAAsC;ER+lG9C;EQ9mGM;IAAgC,0BAA4B;ERinGlE;EQhnGM;;IAEE,8BAAoC;ERknG5C;EQhnGM;;IAEE,gCAAwC;ERknGhD;EQhnGM;;IAEE,iCAA0C;ERknGlD;EQhnGM;;IAEE,+BAAsC;ERknG9C;EQjoGM;IAAgC,wBAA4B;ERooGlE;EQnoGM;;IAEE,4BAAoC;ERqoG5C;EQnoGM;;IAEE,8BAAwC;ERqoGhD;EQnoGM;;IAEE,+BAA0C;ERqoGlD;EQnoGM;;IAEE,6BAAsC;ERqoG9C;EQppGM;IAAgC,0BAA4B;ERupGlE;EQtpGM;;IAEE,8BAAoC;ERwpG5C;EQtpGM;;IAEE,gCAAwC;ERwpGhD;EQtpGM;;IAEE,iCAA0C;ERwpGlD;EQtpGM;;IAEE,+BAAsC;ERwpG9C;EQvqGM;IAAgC,wBAA4B;ER0qGlE;EQzqGM;;IAEE,4BAAoC;ER2qG5C;EQzqGM;;IAEE,8BAAwC;ER2qGhD;EQzqGM;;IAEE,+BAA0C;ER2qGlD;EQzqGM;;IAEE,6BAAsC;ER2qG9C;EQnqGM;IAAwB,2BAA2B;ERsqGzD;EQrqGM;;IAEE,+BAA+B;ERuqGvC;EQrqGM;;IAEE,iCAAiC;ERuqGzC;EQrqGM;;IAEE,kCAAkC;ERuqG1C;EQrqGM;;IAEE,gCAAgC;ERuqGxC;EQtrGM;IAAwB,0BAA2B;ERyrGzD;EQxrGM;;IAEE,8BAA+B;ER0rGvC;EQxrGM;;IAEE,gCAAiC;ER0rGzC;EQxrGM;;IAEE,iCAAkC;ER0rG1C;EQxrGM;;IAEE,+BAAgC;ER0rGxC;EQzsGM;IAAwB,wBAA2B;ER4sGzD;EQ3sGM;;IAEE,4BAA+B;ER6sGvC;EQ3sGM;;IAEE,8BAAiC;ER6sGzC;EQ3sGM;;IAEE,+BAAkC;ER6sG1C;EQ3sGM;;IAEE,6BAAgC;ER6sGxC;EQ5tGM;IAAwB,0BAA2B;ER+tGzD;EQ9tGM;;IAEE,8BAA+B;ERguGvC;EQ9tGM;;IAEE,gCAAiC;ERguGzC;EQ9tGM;;IAEE,iCAAkC;ERguG1C;EQ9tGM;;IAEE,+BAAgC;ERguGxC;EQ/uGM;IAAwB,wBAA2B;ERkvGzD;EQjvGM;;IAEE,4BAA+B;ERmvGvC;EQjvGM;;IAEE,8BAAiC;ERmvGzC;EQjvGM;;IAEE,+BAAkC;ERmvG1C;EQjvGM;;IAEE,6BAAgC;ERmvGxC;EQ7uGE;IAAmB,uBAAuB;ERgvG5C;EQ/uGE;;IAEE,2BAA2B;ERivG/B;EQ/uGE;;IAEE,6BAA6B;ERivGjC;EQ/uGE;;IAEE,8BAA8B;ERivGlC;EQ/uGE;;IAEE,4BAA4B;ERivGhC;AACF\",\"file\":\"bootstrap-grid.css\",\"sourcesContent\":[\"/*!\\n * Bootstrap Grid v4.3.1 (https://getbootstrap.com/)\\n * Copyright 2011-2019 The Bootstrap Authors\\n * Copyright 2011-2019 Twitter, Inc.\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n */\\n\\nhtml {\\n  box-sizing: border-box;\\n  -ms-overflow-style: scrollbar;\\n}\\n\\n*,\\n*::before,\\n*::after {\\n  box-sizing: inherit;\\n}\\n\\n@import \\\"functions\\\";\\n@import \\\"variables\\\";\\n\\n@import \\\"mixins/breakpoints\\\";\\n@import \\\"mixins/grid-framework\\\";\\n@import \\\"mixins/grid\\\";\\n\\n@import \\\"grid\\\";\\n@import \\\"utilities/display\\\";\\n@import \\\"utilities/flex\\\";\\n@import \\\"utilities/spacing\\\";\\n\",\"/*!\\n * Bootstrap Grid v4.3.1 (https://getbootstrap.com/)\\n * Copyright 2011-2019 The Bootstrap Authors\\n * Copyright 2011-2019 Twitter, Inc.\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n */\\nhtml {\\n  box-sizing: border-box;\\n  -ms-overflow-style: scrollbar;\\n}\\n\\n*,\\n*::before,\\n*::after {\\n  box-sizing: inherit;\\n}\\n\\n.container {\\n  width: 100%;\\n  padding-right: 15px;\\n  padding-left: 15px;\\n  margin-right: auto;\\n  margin-left: auto;\\n}\\n\\n@media (min-width: 576px) {\\n  .container {\\n    max-width: 540px;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .container {\\n    max-width: 720px;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .container {\\n    max-width: 960px;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .container {\\n    max-width: 1140px;\\n  }\\n}\\n\\n.container-fluid {\\n  width: 100%;\\n  padding-right: 15px;\\n  padding-left: 15px;\\n  margin-right: auto;\\n  margin-left: auto;\\n}\\n\\n.row {\\n  display: flex;\\n  flex-wrap: wrap;\\n  margin-right: -15px;\\n  margin-left: -15px;\\n}\\n\\n.no-gutters {\\n  margin-right: 0;\\n  margin-left: 0;\\n}\\n\\n.no-gutters > .col,\\n.no-gutters > [class*=\\\"col-\\\"] {\\n  padding-right: 0;\\n  padding-left: 0;\\n}\\n\\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\\n.col-xl-auto {\\n  position: relative;\\n  width: 100%;\\n  padding-right: 15px;\\n  padding-left: 15px;\\n}\\n\\n.col {\\n  flex-basis: 0;\\n  flex-grow: 1;\\n  max-width: 100%;\\n}\\n\\n.col-auto {\\n  flex: 0 0 auto;\\n  width: auto;\\n  max-width: 100%;\\n}\\n\\n.col-1 {\\n  flex: 0 0 8.333333%;\\n  max-width: 8.333333%;\\n}\\n\\n.col-2 {\\n  flex: 0 0 16.666667%;\\n  max-width: 16.666667%;\\n}\\n\\n.col-3 {\\n  flex: 0 0 25%;\\n  max-width: 25%;\\n}\\n\\n.col-4 {\\n  flex: 0 0 33.333333%;\\n  max-width: 33.333333%;\\n}\\n\\n.col-5 {\\n  flex: 0 0 41.666667%;\\n  max-width: 41.666667%;\\n}\\n\\n.col-6 {\\n  flex: 0 0 50%;\\n  max-width: 50%;\\n}\\n\\n.col-7 {\\n  flex: 0 0 58.333333%;\\n  max-width: 58.333333%;\\n}\\n\\n.col-8 {\\n  flex: 0 0 66.666667%;\\n  max-width: 66.666667%;\\n}\\n\\n.col-9 {\\n  flex: 0 0 75%;\\n  max-width: 75%;\\n}\\n\\n.col-10 {\\n  flex: 0 0 83.333333%;\\n  max-width: 83.333333%;\\n}\\n\\n.col-11 {\\n  flex: 0 0 91.666667%;\\n  max-width: 91.666667%;\\n}\\n\\n.col-12 {\\n  flex: 0 0 100%;\\n  max-width: 100%;\\n}\\n\\n.order-first {\\n  order: -1;\\n}\\n\\n.order-last {\\n  order: 13;\\n}\\n\\n.order-0 {\\n  order: 0;\\n}\\n\\n.order-1 {\\n  order: 1;\\n}\\n\\n.order-2 {\\n  order: 2;\\n}\\n\\n.order-3 {\\n  order: 3;\\n}\\n\\n.order-4 {\\n  order: 4;\\n}\\n\\n.order-5 {\\n  order: 5;\\n}\\n\\n.order-6 {\\n  order: 6;\\n}\\n\\n.order-7 {\\n  order: 7;\\n}\\n\\n.order-8 {\\n  order: 8;\\n}\\n\\n.order-9 {\\n  order: 9;\\n}\\n\\n.order-10 {\\n  order: 10;\\n}\\n\\n.order-11 {\\n  order: 11;\\n}\\n\\n.order-12 {\\n  order: 12;\\n}\\n\\n.offset-1 {\\n  margin-left: 8.333333%;\\n}\\n\\n.offset-2 {\\n  margin-left: 16.666667%;\\n}\\n\\n.offset-3 {\\n  margin-left: 25%;\\n}\\n\\n.offset-4 {\\n  margin-left: 33.333333%;\\n}\\n\\n.offset-5 {\\n  margin-left: 41.666667%;\\n}\\n\\n.offset-6 {\\n  margin-left: 50%;\\n}\\n\\n.offset-7 {\\n  margin-left: 58.333333%;\\n}\\n\\n.offset-8 {\\n  margin-left: 66.666667%;\\n}\\n\\n.offset-9 {\\n  margin-left: 75%;\\n}\\n\\n.offset-10 {\\n  margin-left: 83.333333%;\\n}\\n\\n.offset-11 {\\n  margin-left: 91.666667%;\\n}\\n\\n@media (min-width: 576px) {\\n  .col-sm {\\n    flex-basis: 0;\\n    flex-grow: 1;\\n    max-width: 100%;\\n  }\\n  .col-sm-auto {\\n    flex: 0 0 auto;\\n    width: auto;\\n    max-width: 100%;\\n  }\\n  .col-sm-1 {\\n    flex: 0 0 8.333333%;\\n    max-width: 8.333333%;\\n  }\\n  .col-sm-2 {\\n    flex: 0 0 16.666667%;\\n    max-width: 16.666667%;\\n  }\\n  .col-sm-3 {\\n    flex: 0 0 25%;\\n    max-width: 25%;\\n  }\\n  .col-sm-4 {\\n    flex: 0 0 33.333333%;\\n    max-width: 33.333333%;\\n  }\\n  .col-sm-5 {\\n    flex: 0 0 41.666667%;\\n    max-width: 41.666667%;\\n  }\\n  .col-sm-6 {\\n    flex: 0 0 50%;\\n    max-width: 50%;\\n  }\\n  .col-sm-7 {\\n    flex: 0 0 58.333333%;\\n    max-width: 58.333333%;\\n  }\\n  .col-sm-8 {\\n    flex: 0 0 66.666667%;\\n    max-width: 66.666667%;\\n  }\\n  .col-sm-9 {\\n    flex: 0 0 75%;\\n    max-width: 75%;\\n  }\\n  .col-sm-10 {\\n    flex: 0 0 83.333333%;\\n    max-width: 83.333333%;\\n  }\\n  .col-sm-11 {\\n    flex: 0 0 91.666667%;\\n    max-width: 91.666667%;\\n  }\\n  .col-sm-12 {\\n    flex: 0 0 100%;\\n    max-width: 100%;\\n  }\\n  .order-sm-first {\\n    order: -1;\\n  }\\n  .order-sm-last {\\n    order: 13;\\n  }\\n  .order-sm-0 {\\n    order: 0;\\n  }\\n  .order-sm-1 {\\n    order: 1;\\n  }\\n  .order-sm-2 {\\n    order: 2;\\n  }\\n  .order-sm-3 {\\n    order: 3;\\n  }\\n  .order-sm-4 {\\n    order: 4;\\n  }\\n  .order-sm-5 {\\n    order: 5;\\n  }\\n  .order-sm-6 {\\n    order: 6;\\n  }\\n  .order-sm-7 {\\n    order: 7;\\n  }\\n  .order-sm-8 {\\n    order: 8;\\n  }\\n  .order-sm-9 {\\n    order: 9;\\n  }\\n  .order-sm-10 {\\n    order: 10;\\n  }\\n  .order-sm-11 {\\n    order: 11;\\n  }\\n  .order-sm-12 {\\n    order: 12;\\n  }\\n  .offset-sm-0 {\\n    margin-left: 0;\\n  }\\n  .offset-sm-1 {\\n    margin-left: 8.333333%;\\n  }\\n  .offset-sm-2 {\\n    margin-left: 16.666667%;\\n  }\\n  .offset-sm-3 {\\n    margin-left: 25%;\\n  }\\n  .offset-sm-4 {\\n    margin-left: 33.333333%;\\n  }\\n  .offset-sm-5 {\\n    margin-left: 41.666667%;\\n  }\\n  .offset-sm-6 {\\n    margin-left: 50%;\\n  }\\n  .offset-sm-7 {\\n    margin-left: 58.333333%;\\n  }\\n  .offset-sm-8 {\\n    margin-left: 66.666667%;\\n  }\\n  .offset-sm-9 {\\n    margin-left: 75%;\\n  }\\n  .offset-sm-10 {\\n    margin-left: 83.333333%;\\n  }\\n  .offset-sm-11 {\\n    margin-left: 91.666667%;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .col-md {\\n    flex-basis: 0;\\n    flex-grow: 1;\\n    max-width: 100%;\\n  }\\n  .col-md-auto {\\n    flex: 0 0 auto;\\n    width: auto;\\n    max-width: 100%;\\n  }\\n  .col-md-1 {\\n    flex: 0 0 8.333333%;\\n    max-width: 8.333333%;\\n  }\\n  .col-md-2 {\\n    flex: 0 0 16.666667%;\\n    max-width: 16.666667%;\\n  }\\n  .col-md-3 {\\n    flex: 0 0 25%;\\n    max-width: 25%;\\n  }\\n  .col-md-4 {\\n    flex: 0 0 33.333333%;\\n    max-width: 33.333333%;\\n  }\\n  .col-md-5 {\\n    flex: 0 0 41.666667%;\\n    max-width: 41.666667%;\\n  }\\n  .col-md-6 {\\n    flex: 0 0 50%;\\n    max-width: 50%;\\n  }\\n  .col-md-7 {\\n    flex: 0 0 58.333333%;\\n    max-width: 58.333333%;\\n  }\\n  .col-md-8 {\\n    flex: 0 0 66.666667%;\\n    max-width: 66.666667%;\\n  }\\n  .col-md-9 {\\n    flex: 0 0 75%;\\n    max-width: 75%;\\n  }\\n  .col-md-10 {\\n    flex: 0 0 83.333333%;\\n    max-width: 83.333333%;\\n  }\\n  .col-md-11 {\\n    flex: 0 0 91.666667%;\\n    max-width: 91.666667%;\\n  }\\n  .col-md-12 {\\n    flex: 0 0 100%;\\n    max-width: 100%;\\n  }\\n  .order-md-first {\\n    order: -1;\\n  }\\n  .order-md-last {\\n    order: 13;\\n  }\\n  .order-md-0 {\\n    order: 0;\\n  }\\n  .order-md-1 {\\n    order: 1;\\n  }\\n  .order-md-2 {\\n    order: 2;\\n  }\\n  .order-md-3 {\\n    order: 3;\\n  }\\n  .order-md-4 {\\n    order: 4;\\n  }\\n  .order-md-5 {\\n    order: 5;\\n  }\\n  .order-md-6 {\\n    order: 6;\\n  }\\n  .order-md-7 {\\n    order: 7;\\n  }\\n  .order-md-8 {\\n    order: 8;\\n  }\\n  .order-md-9 {\\n    order: 9;\\n  }\\n  .order-md-10 {\\n    order: 10;\\n  }\\n  .order-md-11 {\\n    order: 11;\\n  }\\n  .order-md-12 {\\n    order: 12;\\n  }\\n  .offset-md-0 {\\n    margin-left: 0;\\n  }\\n  .offset-md-1 {\\n    margin-left: 8.333333%;\\n  }\\n  .offset-md-2 {\\n    margin-left: 16.666667%;\\n  }\\n  .offset-md-3 {\\n    margin-left: 25%;\\n  }\\n  .offset-md-4 {\\n    margin-left: 33.333333%;\\n  }\\n  .offset-md-5 {\\n    margin-left: 41.666667%;\\n  }\\n  .offset-md-6 {\\n    margin-left: 50%;\\n  }\\n  .offset-md-7 {\\n    margin-left: 58.333333%;\\n  }\\n  .offset-md-8 {\\n    margin-left: 66.666667%;\\n  }\\n  .offset-md-9 {\\n    margin-left: 75%;\\n  }\\n  .offset-md-10 {\\n    margin-left: 83.333333%;\\n  }\\n  .offset-md-11 {\\n    margin-left: 91.666667%;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .col-lg {\\n    flex-basis: 0;\\n    flex-grow: 1;\\n    max-width: 100%;\\n  }\\n  .col-lg-auto {\\n    flex: 0 0 auto;\\n    width: auto;\\n    max-width: 100%;\\n  }\\n  .col-lg-1 {\\n    flex: 0 0 8.333333%;\\n    max-width: 8.333333%;\\n  }\\n  .col-lg-2 {\\n    flex: 0 0 16.666667%;\\n    max-width: 16.666667%;\\n  }\\n  .col-lg-3 {\\n    flex: 0 0 25%;\\n    max-width: 25%;\\n  }\\n  .col-lg-4 {\\n    flex: 0 0 33.333333%;\\n    max-width: 33.333333%;\\n  }\\n  .col-lg-5 {\\n    flex: 0 0 41.666667%;\\n    max-width: 41.666667%;\\n  }\\n  .col-lg-6 {\\n    flex: 0 0 50%;\\n    max-width: 50%;\\n  }\\n  .col-lg-7 {\\n    flex: 0 0 58.333333%;\\n    max-width: 58.333333%;\\n  }\\n  .col-lg-8 {\\n    flex: 0 0 66.666667%;\\n    max-width: 66.666667%;\\n  }\\n  .col-lg-9 {\\n    flex: 0 0 75%;\\n    max-width: 75%;\\n  }\\n  .col-lg-10 {\\n    flex: 0 0 83.333333%;\\n    max-width: 83.333333%;\\n  }\\n  .col-lg-11 {\\n    flex: 0 0 91.666667%;\\n    max-width: 91.666667%;\\n  }\\n  .col-lg-12 {\\n    flex: 0 0 100%;\\n    max-width: 100%;\\n  }\\n  .order-lg-first {\\n    order: -1;\\n  }\\n  .order-lg-last {\\n    order: 13;\\n  }\\n  .order-lg-0 {\\n    order: 0;\\n  }\\n  .order-lg-1 {\\n    order: 1;\\n  }\\n  .order-lg-2 {\\n    order: 2;\\n  }\\n  .order-lg-3 {\\n    order: 3;\\n  }\\n  .order-lg-4 {\\n    order: 4;\\n  }\\n  .order-lg-5 {\\n    order: 5;\\n  }\\n  .order-lg-6 {\\n    order: 6;\\n  }\\n  .order-lg-7 {\\n    order: 7;\\n  }\\n  .order-lg-8 {\\n    order: 8;\\n  }\\n  .order-lg-9 {\\n    order: 9;\\n  }\\n  .order-lg-10 {\\n    order: 10;\\n  }\\n  .order-lg-11 {\\n    order: 11;\\n  }\\n  .order-lg-12 {\\n    order: 12;\\n  }\\n  .offset-lg-0 {\\n    margin-left: 0;\\n  }\\n  .offset-lg-1 {\\n    margin-left: 8.333333%;\\n  }\\n  .offset-lg-2 {\\n    margin-left: 16.666667%;\\n  }\\n  .offset-lg-3 {\\n    margin-left: 25%;\\n  }\\n  .offset-lg-4 {\\n    margin-left: 33.333333%;\\n  }\\n  .offset-lg-5 {\\n    margin-left: 41.666667%;\\n  }\\n  .offset-lg-6 {\\n    margin-left: 50%;\\n  }\\n  .offset-lg-7 {\\n    margin-left: 58.333333%;\\n  }\\n  .offset-lg-8 {\\n    margin-left: 66.666667%;\\n  }\\n  .offset-lg-9 {\\n    margin-left: 75%;\\n  }\\n  .offset-lg-10 {\\n    margin-left: 83.333333%;\\n  }\\n  .offset-lg-11 {\\n    margin-left: 91.666667%;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .col-xl {\\n    flex-basis: 0;\\n    flex-grow: 1;\\n    max-width: 100%;\\n  }\\n  .col-xl-auto {\\n    flex: 0 0 auto;\\n    width: auto;\\n    max-width: 100%;\\n  }\\n  .col-xl-1 {\\n    flex: 0 0 8.333333%;\\n    max-width: 8.333333%;\\n  }\\n  .col-xl-2 {\\n    flex: 0 0 16.666667%;\\n    max-width: 16.666667%;\\n  }\\n  .col-xl-3 {\\n    flex: 0 0 25%;\\n    max-width: 25%;\\n  }\\n  .col-xl-4 {\\n    flex: 0 0 33.333333%;\\n    max-width: 33.333333%;\\n  }\\n  .col-xl-5 {\\n    flex: 0 0 41.666667%;\\n    max-width: 41.666667%;\\n  }\\n  .col-xl-6 {\\n    flex: 0 0 50%;\\n    max-width: 50%;\\n  }\\n  .col-xl-7 {\\n    flex: 0 0 58.333333%;\\n    max-width: 58.333333%;\\n  }\\n  .col-xl-8 {\\n    flex: 0 0 66.666667%;\\n    max-width: 66.666667%;\\n  }\\n  .col-xl-9 {\\n    flex: 0 0 75%;\\n    max-width: 75%;\\n  }\\n  .col-xl-10 {\\n    flex: 0 0 83.333333%;\\n    max-width: 83.333333%;\\n  }\\n  .col-xl-11 {\\n    flex: 0 0 91.666667%;\\n    max-width: 91.666667%;\\n  }\\n  .col-xl-12 {\\n    flex: 0 0 100%;\\n    max-width: 100%;\\n  }\\n  .order-xl-first {\\n    order: -1;\\n  }\\n  .order-xl-last {\\n    order: 13;\\n  }\\n  .order-xl-0 {\\n    order: 0;\\n  }\\n  .order-xl-1 {\\n    order: 1;\\n  }\\n  .order-xl-2 {\\n    order: 2;\\n  }\\n  .order-xl-3 {\\n    order: 3;\\n  }\\n  .order-xl-4 {\\n    order: 4;\\n  }\\n  .order-xl-5 {\\n    order: 5;\\n  }\\n  .order-xl-6 {\\n    order: 6;\\n  }\\n  .order-xl-7 {\\n    order: 7;\\n  }\\n  .order-xl-8 {\\n    order: 8;\\n  }\\n  .order-xl-9 {\\n    order: 9;\\n  }\\n  .order-xl-10 {\\n    order: 10;\\n  }\\n  .order-xl-11 {\\n    order: 11;\\n  }\\n  .order-xl-12 {\\n    order: 12;\\n  }\\n  .offset-xl-0 {\\n    margin-left: 0;\\n  }\\n  .offset-xl-1 {\\n    margin-left: 8.333333%;\\n  }\\n  .offset-xl-2 {\\n    margin-left: 16.666667%;\\n  }\\n  .offset-xl-3 {\\n    margin-left: 25%;\\n  }\\n  .offset-xl-4 {\\n    margin-left: 33.333333%;\\n  }\\n  .offset-xl-5 {\\n    margin-left: 41.666667%;\\n  }\\n  .offset-xl-6 {\\n    margin-left: 50%;\\n  }\\n  .offset-xl-7 {\\n    margin-left: 58.333333%;\\n  }\\n  .offset-xl-8 {\\n    margin-left: 66.666667%;\\n  }\\n  .offset-xl-9 {\\n    margin-left: 75%;\\n  }\\n  .offset-xl-10 {\\n    margin-left: 83.333333%;\\n  }\\n  .offset-xl-11 {\\n    margin-left: 91.666667%;\\n  }\\n}\\n\\n.d-none {\\n  display: none !important;\\n}\\n\\n.d-inline {\\n  display: inline !important;\\n}\\n\\n.d-inline-block {\\n  display: inline-block !important;\\n}\\n\\n.d-block {\\n  display: block !important;\\n}\\n\\n.d-table {\\n  display: table !important;\\n}\\n\\n.d-table-row {\\n  display: table-row !important;\\n}\\n\\n.d-table-cell {\\n  display: table-cell !important;\\n}\\n\\n.d-flex {\\n  display: flex !important;\\n}\\n\\n.d-inline-flex {\\n  display: inline-flex !important;\\n}\\n\\n@media (min-width: 576px) {\\n  .d-sm-none {\\n    display: none !important;\\n  }\\n  .d-sm-inline {\\n    display: inline !important;\\n  }\\n  .d-sm-inline-block {\\n    display: inline-block !important;\\n  }\\n  .d-sm-block {\\n    display: block !important;\\n  }\\n  .d-sm-table {\\n    display: table !important;\\n  }\\n  .d-sm-table-row {\\n    display: table-row !important;\\n  }\\n  .d-sm-table-cell {\\n    display: table-cell !important;\\n  }\\n  .d-sm-flex {\\n    display: flex !important;\\n  }\\n  .d-sm-inline-flex {\\n    display: inline-flex !important;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .d-md-none {\\n    display: none !important;\\n  }\\n  .d-md-inline {\\n    display: inline !important;\\n  }\\n  .d-md-inline-block {\\n    display: inline-block !important;\\n  }\\n  .d-md-block {\\n    display: block !important;\\n  }\\n  .d-md-table {\\n    display: table !important;\\n  }\\n  .d-md-table-row {\\n    display: table-row !important;\\n  }\\n  .d-md-table-cell {\\n    display: table-cell !important;\\n  }\\n  .d-md-flex {\\n    display: flex !important;\\n  }\\n  .d-md-inline-flex {\\n    display: inline-flex !important;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .d-lg-none {\\n    display: none !important;\\n  }\\n  .d-lg-inline {\\n    display: inline !important;\\n  }\\n  .d-lg-inline-block {\\n    display: inline-block !important;\\n  }\\n  .d-lg-block {\\n    display: block !important;\\n  }\\n  .d-lg-table {\\n    display: table !important;\\n  }\\n  .d-lg-table-row {\\n    display: table-row !important;\\n  }\\n  .d-lg-table-cell {\\n    display: table-cell !important;\\n  }\\n  .d-lg-flex {\\n    display: flex !important;\\n  }\\n  .d-lg-inline-flex {\\n    display: inline-flex !important;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .d-xl-none {\\n    display: none !important;\\n  }\\n  .d-xl-inline {\\n    display: inline !important;\\n  }\\n  .d-xl-inline-block {\\n    display: inline-block !important;\\n  }\\n  .d-xl-block {\\n    display: block !important;\\n  }\\n  .d-xl-table {\\n    display: table !important;\\n  }\\n  .d-xl-table-row {\\n    display: table-row !important;\\n  }\\n  .d-xl-table-cell {\\n    display: table-cell !important;\\n  }\\n  .d-xl-flex {\\n    display: flex !important;\\n  }\\n  .d-xl-inline-flex {\\n    display: inline-flex !important;\\n  }\\n}\\n\\n@media print {\\n  .d-print-none {\\n    display: none !important;\\n  }\\n  .d-print-inline {\\n    display: inline !important;\\n  }\\n  .d-print-inline-block {\\n    display: inline-block !important;\\n  }\\n  .d-print-block {\\n    display: block !important;\\n  }\\n  .d-print-table {\\n    display: table !important;\\n  }\\n  .d-print-table-row {\\n    display: table-row !important;\\n  }\\n  .d-print-table-cell {\\n    display: table-cell !important;\\n  }\\n  .d-print-flex {\\n    display: flex !important;\\n  }\\n  .d-print-inline-flex {\\n    display: inline-flex !important;\\n  }\\n}\\n\\n.flex-row {\\n  flex-direction: row !important;\\n}\\n\\n.flex-column {\\n  flex-direction: column !important;\\n}\\n\\n.flex-row-reverse {\\n  flex-direction: row-reverse !important;\\n}\\n\\n.flex-column-reverse {\\n  flex-direction: column-reverse !important;\\n}\\n\\n.flex-wrap {\\n  flex-wrap: wrap !important;\\n}\\n\\n.flex-nowrap {\\n  flex-wrap: nowrap !important;\\n}\\n\\n.flex-wrap-reverse {\\n  flex-wrap: wrap-reverse !important;\\n}\\n\\n.flex-fill {\\n  flex: 1 1 auto !important;\\n}\\n\\n.flex-grow-0 {\\n  flex-grow: 0 !important;\\n}\\n\\n.flex-grow-1 {\\n  flex-grow: 1 !important;\\n}\\n\\n.flex-shrink-0 {\\n  flex-shrink: 0 !important;\\n}\\n\\n.flex-shrink-1 {\\n  flex-shrink: 1 !important;\\n}\\n\\n.justify-content-start {\\n  justify-content: flex-start !important;\\n}\\n\\n.justify-content-end {\\n  justify-content: flex-end !important;\\n}\\n\\n.justify-content-center {\\n  justify-content: center !important;\\n}\\n\\n.justify-content-between {\\n  justify-content: space-between !important;\\n}\\n\\n.justify-content-around {\\n  justify-content: space-around !important;\\n}\\n\\n.align-items-start {\\n  align-items: flex-start !important;\\n}\\n\\n.align-items-end {\\n  align-items: flex-end !important;\\n}\\n\\n.align-items-center {\\n  align-items: center !important;\\n}\\n\\n.align-items-baseline {\\n  align-items: baseline !important;\\n}\\n\\n.align-items-stretch {\\n  align-items: stretch !important;\\n}\\n\\n.align-content-start {\\n  align-content: flex-start !important;\\n}\\n\\n.align-content-end {\\n  align-content: flex-end !important;\\n}\\n\\n.align-content-center {\\n  align-content: center !important;\\n}\\n\\n.align-content-between {\\n  align-content: space-between !important;\\n}\\n\\n.align-content-around {\\n  align-content: space-around !important;\\n}\\n\\n.align-content-stretch {\\n  align-content: stretch !important;\\n}\\n\\n.align-self-auto {\\n  align-self: auto !important;\\n}\\n\\n.align-self-start {\\n  align-self: flex-start !important;\\n}\\n\\n.align-self-end {\\n  align-self: flex-end !important;\\n}\\n\\n.align-self-center {\\n  align-self: center !important;\\n}\\n\\n.align-self-baseline {\\n  align-self: baseline !important;\\n}\\n\\n.align-self-stretch {\\n  align-self: stretch !important;\\n}\\n\\n@media (min-width: 576px) {\\n  .flex-sm-row {\\n    flex-direction: row !important;\\n  }\\n  .flex-sm-column {\\n    flex-direction: column !important;\\n  }\\n  .flex-sm-row-reverse {\\n    flex-direction: row-reverse !important;\\n  }\\n  .flex-sm-column-reverse {\\n    flex-direction: column-reverse !important;\\n  }\\n  .flex-sm-wrap {\\n    flex-wrap: wrap !important;\\n  }\\n  .flex-sm-nowrap {\\n    flex-wrap: nowrap !important;\\n  }\\n  .flex-sm-wrap-reverse {\\n    flex-wrap: wrap-reverse !important;\\n  }\\n  .flex-sm-fill {\\n    flex: 1 1 auto !important;\\n  }\\n  .flex-sm-grow-0 {\\n    flex-grow: 0 !important;\\n  }\\n  .flex-sm-grow-1 {\\n    flex-grow: 1 !important;\\n  }\\n  .flex-sm-shrink-0 {\\n    flex-shrink: 0 !important;\\n  }\\n  .flex-sm-shrink-1 {\\n    flex-shrink: 1 !important;\\n  }\\n  .justify-content-sm-start {\\n    justify-content: flex-start !important;\\n  }\\n  .justify-content-sm-end {\\n    justify-content: flex-end !important;\\n  }\\n  .justify-content-sm-center {\\n    justify-content: center !important;\\n  }\\n  .justify-content-sm-between {\\n    justify-content: space-between !important;\\n  }\\n  .justify-content-sm-around {\\n    justify-content: space-around !important;\\n  }\\n  .align-items-sm-start {\\n    align-items: flex-start !important;\\n  }\\n  .align-items-sm-end {\\n    align-items: flex-end !important;\\n  }\\n  .align-items-sm-center {\\n    align-items: center !important;\\n  }\\n  .align-items-sm-baseline {\\n    align-items: baseline !important;\\n  }\\n  .align-items-sm-stretch {\\n    align-items: stretch !important;\\n  }\\n  .align-content-sm-start {\\n    align-content: flex-start !important;\\n  }\\n  .align-content-sm-end {\\n    align-content: flex-end !important;\\n  }\\n  .align-content-sm-center {\\n    align-content: center !important;\\n  }\\n  .align-content-sm-between {\\n    align-content: space-between !important;\\n  }\\n  .align-content-sm-around {\\n    align-content: space-around !important;\\n  }\\n  .align-content-sm-stretch {\\n    align-content: stretch !important;\\n  }\\n  .align-self-sm-auto {\\n    align-self: auto !important;\\n  }\\n  .align-self-sm-start {\\n    align-self: flex-start !important;\\n  }\\n  .align-self-sm-end {\\n    align-self: flex-end !important;\\n  }\\n  .align-self-sm-center {\\n    align-self: center !important;\\n  }\\n  .align-self-sm-baseline {\\n    align-self: baseline !important;\\n  }\\n  .align-self-sm-stretch {\\n    align-self: stretch !important;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .flex-md-row {\\n    flex-direction: row !important;\\n  }\\n  .flex-md-column {\\n    flex-direction: column !important;\\n  }\\n  .flex-md-row-reverse {\\n    flex-direction: row-reverse !important;\\n  }\\n  .flex-md-column-reverse {\\n    flex-direction: column-reverse !important;\\n  }\\n  .flex-md-wrap {\\n    flex-wrap: wrap !important;\\n  }\\n  .flex-md-nowrap {\\n    flex-wrap: nowrap !important;\\n  }\\n  .flex-md-wrap-reverse {\\n    flex-wrap: wrap-reverse !important;\\n  }\\n  .flex-md-fill {\\n    flex: 1 1 auto !important;\\n  }\\n  .flex-md-grow-0 {\\n    flex-grow: 0 !important;\\n  }\\n  .flex-md-grow-1 {\\n    flex-grow: 1 !important;\\n  }\\n  .flex-md-shrink-0 {\\n    flex-shrink: 0 !important;\\n  }\\n  .flex-md-shrink-1 {\\n    flex-shrink: 1 !important;\\n  }\\n  .justify-content-md-start {\\n    justify-content: flex-start !important;\\n  }\\n  .justify-content-md-end {\\n    justify-content: flex-end !important;\\n  }\\n  .justify-content-md-center {\\n    justify-content: center !important;\\n  }\\n  .justify-content-md-between {\\n    justify-content: space-between !important;\\n  }\\n  .justify-content-md-around {\\n    justify-content: space-around !important;\\n  }\\n  .align-items-md-start {\\n    align-items: flex-start !important;\\n  }\\n  .align-items-md-end {\\n    align-items: flex-end !important;\\n  }\\n  .align-items-md-center {\\n    align-items: center !important;\\n  }\\n  .align-items-md-baseline {\\n    align-items: baseline !important;\\n  }\\n  .align-items-md-stretch {\\n    align-items: stretch !important;\\n  }\\n  .align-content-md-start {\\n    align-content: flex-start !important;\\n  }\\n  .align-content-md-end {\\n    align-content: flex-end !important;\\n  }\\n  .align-content-md-center {\\n    align-content: center !important;\\n  }\\n  .align-content-md-between {\\n    align-content: space-between !important;\\n  }\\n  .align-content-md-around {\\n    align-content: space-around !important;\\n  }\\n  .align-content-md-stretch {\\n    align-content: stretch !important;\\n  }\\n  .align-self-md-auto {\\n    align-self: auto !important;\\n  }\\n  .align-self-md-start {\\n    align-self: flex-start !important;\\n  }\\n  .align-self-md-end {\\n    align-self: flex-end !important;\\n  }\\n  .align-self-md-center {\\n    align-self: center !important;\\n  }\\n  .align-self-md-baseline {\\n    align-self: baseline !important;\\n  }\\n  .align-self-md-stretch {\\n    align-self: stretch !important;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .flex-lg-row {\\n    flex-direction: row !important;\\n  }\\n  .flex-lg-column {\\n    flex-direction: column !important;\\n  }\\n  .flex-lg-row-reverse {\\n    flex-direction: row-reverse !important;\\n  }\\n  .flex-lg-column-reverse {\\n    flex-direction: column-reverse !important;\\n  }\\n  .flex-lg-wrap {\\n    flex-wrap: wrap !important;\\n  }\\n  .flex-lg-nowrap {\\n    flex-wrap: nowrap !important;\\n  }\\n  .flex-lg-wrap-reverse {\\n    flex-wrap: wrap-reverse !important;\\n  }\\n  .flex-lg-fill {\\n    flex: 1 1 auto !important;\\n  }\\n  .flex-lg-grow-0 {\\n    flex-grow: 0 !important;\\n  }\\n  .flex-lg-grow-1 {\\n    flex-grow: 1 !important;\\n  }\\n  .flex-lg-shrink-0 {\\n    flex-shrink: 0 !important;\\n  }\\n  .flex-lg-shrink-1 {\\n    flex-shrink: 1 !important;\\n  }\\n  .justify-content-lg-start {\\n    justify-content: flex-start !important;\\n  }\\n  .justify-content-lg-end {\\n    justify-content: flex-end !important;\\n  }\\n  .justify-content-lg-center {\\n    justify-content: center !important;\\n  }\\n  .justify-content-lg-between {\\n    justify-content: space-between !important;\\n  }\\n  .justify-content-lg-around {\\n    justify-content: space-around !important;\\n  }\\n  .align-items-lg-start {\\n    align-items: flex-start !important;\\n  }\\n  .align-items-lg-end {\\n    align-items: flex-end !important;\\n  }\\n  .align-items-lg-center {\\n    align-items: center !important;\\n  }\\n  .align-items-lg-baseline {\\n    align-items: baseline !important;\\n  }\\n  .align-items-lg-stretch {\\n    align-items: stretch !important;\\n  }\\n  .align-content-lg-start {\\n    align-content: flex-start !important;\\n  }\\n  .align-content-lg-end {\\n    align-content: flex-end !important;\\n  }\\n  .align-content-lg-center {\\n    align-content: center !important;\\n  }\\n  .align-content-lg-between {\\n    align-content: space-between !important;\\n  }\\n  .align-content-lg-around {\\n    align-content: space-around !important;\\n  }\\n  .align-content-lg-stretch {\\n    align-content: stretch !important;\\n  }\\n  .align-self-lg-auto {\\n    align-self: auto !important;\\n  }\\n  .align-self-lg-start {\\n    align-self: flex-start !important;\\n  }\\n  .align-self-lg-end {\\n    align-self: flex-end !important;\\n  }\\n  .align-self-lg-center {\\n    align-self: center !important;\\n  }\\n  .align-self-lg-baseline {\\n    align-self: baseline !important;\\n  }\\n  .align-self-lg-stretch {\\n    align-self: stretch !important;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .flex-xl-row {\\n    flex-direction: row !important;\\n  }\\n  .flex-xl-column {\\n    flex-direction: column !important;\\n  }\\n  .flex-xl-row-reverse {\\n    flex-direction: row-reverse !important;\\n  }\\n  .flex-xl-column-reverse {\\n    flex-direction: column-reverse !important;\\n  }\\n  .flex-xl-wrap {\\n    flex-wrap: wrap !important;\\n  }\\n  .flex-xl-nowrap {\\n    flex-wrap: nowrap !important;\\n  }\\n  .flex-xl-wrap-reverse {\\n    flex-wrap: wrap-reverse !important;\\n  }\\n  .flex-xl-fill {\\n    flex: 1 1 auto !important;\\n  }\\n  .flex-xl-grow-0 {\\n    flex-grow: 0 !important;\\n  }\\n  .flex-xl-grow-1 {\\n    flex-grow: 1 !important;\\n  }\\n  .flex-xl-shrink-0 {\\n    flex-shrink: 0 !important;\\n  }\\n  .flex-xl-shrink-1 {\\n    flex-shrink: 1 !important;\\n  }\\n  .justify-content-xl-start {\\n    justify-content: flex-start !important;\\n  }\\n  .justify-content-xl-end {\\n    justify-content: flex-end !important;\\n  }\\n  .justify-content-xl-center {\\n    justify-content: center !important;\\n  }\\n  .justify-content-xl-between {\\n    justify-content: space-between !important;\\n  }\\n  .justify-content-xl-around {\\n    justify-content: space-around !important;\\n  }\\n  .align-items-xl-start {\\n    align-items: flex-start !important;\\n  }\\n  .align-items-xl-end {\\n    align-items: flex-end !important;\\n  }\\n  .align-items-xl-center {\\n    align-items: center !important;\\n  }\\n  .align-items-xl-baseline {\\n    align-items: baseline !important;\\n  }\\n  .align-items-xl-stretch {\\n    align-items: stretch !important;\\n  }\\n  .align-content-xl-start {\\n    align-content: flex-start !important;\\n  }\\n  .align-content-xl-end {\\n    align-content: flex-end !important;\\n  }\\n  .align-content-xl-center {\\n    align-content: center !important;\\n  }\\n  .align-content-xl-between {\\n    align-content: space-between !important;\\n  }\\n  .align-content-xl-around {\\n    align-content: space-around !important;\\n  }\\n  .align-content-xl-stretch {\\n    align-content: stretch !important;\\n  }\\n  .align-self-xl-auto {\\n    align-self: auto !important;\\n  }\\n  .align-self-xl-start {\\n    align-self: flex-start !important;\\n  }\\n  .align-self-xl-end {\\n    align-self: flex-end !important;\\n  }\\n  .align-self-xl-center {\\n    align-self: center !important;\\n  }\\n  .align-self-xl-baseline {\\n    align-self: baseline !important;\\n  }\\n  .align-self-xl-stretch {\\n    align-self: stretch !important;\\n  }\\n}\\n\\n.m-0 {\\n  margin: 0 !important;\\n}\\n\\n.mt-0,\\n.my-0 {\\n  margin-top: 0 !important;\\n}\\n\\n.mr-0,\\n.mx-0 {\\n  margin-right: 0 !important;\\n}\\n\\n.mb-0,\\n.my-0 {\\n  margin-bottom: 0 !important;\\n}\\n\\n.ml-0,\\n.mx-0 {\\n  margin-left: 0 !important;\\n}\\n\\n.m-1 {\\n  margin: 0.25rem !important;\\n}\\n\\n.mt-1,\\n.my-1 {\\n  margin-top: 0.25rem !important;\\n}\\n\\n.mr-1,\\n.mx-1 {\\n  margin-right: 0.25rem !important;\\n}\\n\\n.mb-1,\\n.my-1 {\\n  margin-bottom: 0.25rem !important;\\n}\\n\\n.ml-1,\\n.mx-1 {\\n  margin-left: 0.25rem !important;\\n}\\n\\n.m-2 {\\n  margin: 0.5rem !important;\\n}\\n\\n.mt-2,\\n.my-2 {\\n  margin-top: 0.5rem !important;\\n}\\n\\n.mr-2,\\n.mx-2 {\\n  margin-right: 0.5rem !important;\\n}\\n\\n.mb-2,\\n.my-2 {\\n  margin-bottom: 0.5rem !important;\\n}\\n\\n.ml-2,\\n.mx-2 {\\n  margin-left: 0.5rem !important;\\n}\\n\\n.m-3 {\\n  margin: 1rem !important;\\n}\\n\\n.mt-3,\\n.my-3 {\\n  margin-top: 1rem !important;\\n}\\n\\n.mr-3,\\n.mx-3 {\\n  margin-right: 1rem !important;\\n}\\n\\n.mb-3,\\n.my-3 {\\n  margin-bottom: 1rem !important;\\n}\\n\\n.ml-3,\\n.mx-3 {\\n  margin-left: 1rem !important;\\n}\\n\\n.m-4 {\\n  margin: 1.5rem !important;\\n}\\n\\n.mt-4,\\n.my-4 {\\n  margin-top: 1.5rem !important;\\n}\\n\\n.mr-4,\\n.mx-4 {\\n  margin-right: 1.5rem !important;\\n}\\n\\n.mb-4,\\n.my-4 {\\n  margin-bottom: 1.5rem !important;\\n}\\n\\n.ml-4,\\n.mx-4 {\\n  margin-left: 1.5rem !important;\\n}\\n\\n.m-5 {\\n  margin: 3rem !important;\\n}\\n\\n.mt-5,\\n.my-5 {\\n  margin-top: 3rem !important;\\n}\\n\\n.mr-5,\\n.mx-5 {\\n  margin-right: 3rem !important;\\n}\\n\\n.mb-5,\\n.my-5 {\\n  margin-bottom: 3rem !important;\\n}\\n\\n.ml-5,\\n.mx-5 {\\n  margin-left: 3rem !important;\\n}\\n\\n.p-0 {\\n  padding: 0 !important;\\n}\\n\\n.pt-0,\\n.py-0 {\\n  padding-top: 0 !important;\\n}\\n\\n.pr-0,\\n.px-0 {\\n  padding-right: 0 !important;\\n}\\n\\n.pb-0,\\n.py-0 {\\n  padding-bottom: 0 !important;\\n}\\n\\n.pl-0,\\n.px-0 {\\n  padding-left: 0 !important;\\n}\\n\\n.p-1 {\\n  padding: 0.25rem !important;\\n}\\n\\n.pt-1,\\n.py-1 {\\n  padding-top: 0.25rem !important;\\n}\\n\\n.pr-1,\\n.px-1 {\\n  padding-right: 0.25rem !important;\\n}\\n\\n.pb-1,\\n.py-1 {\\n  padding-bottom: 0.25rem !important;\\n}\\n\\n.pl-1,\\n.px-1 {\\n  padding-left: 0.25rem !important;\\n}\\n\\n.p-2 {\\n  padding: 0.5rem !important;\\n}\\n\\n.pt-2,\\n.py-2 {\\n  padding-top: 0.5rem !important;\\n}\\n\\n.pr-2,\\n.px-2 {\\n  padding-right: 0.5rem !important;\\n}\\n\\n.pb-2,\\n.py-2 {\\n  padding-bottom: 0.5rem !important;\\n}\\n\\n.pl-2,\\n.px-2 {\\n  padding-left: 0.5rem !important;\\n}\\n\\n.p-3 {\\n  padding: 1rem !important;\\n}\\n\\n.pt-3,\\n.py-3 {\\n  padding-top: 1rem !important;\\n}\\n\\n.pr-3,\\n.px-3 {\\n  padding-right: 1rem !important;\\n}\\n\\n.pb-3,\\n.py-3 {\\n  padding-bottom: 1rem !important;\\n}\\n\\n.pl-3,\\n.px-3 {\\n  padding-left: 1rem !important;\\n}\\n\\n.p-4 {\\n  padding: 1.5rem !important;\\n}\\n\\n.pt-4,\\n.py-4 {\\n  padding-top: 1.5rem !important;\\n}\\n\\n.pr-4,\\n.px-4 {\\n  padding-right: 1.5rem !important;\\n}\\n\\n.pb-4,\\n.py-4 {\\n  padding-bottom: 1.5rem !important;\\n}\\n\\n.pl-4,\\n.px-4 {\\n  padding-left: 1.5rem !important;\\n}\\n\\n.p-5 {\\n  padding: 3rem !important;\\n}\\n\\n.pt-5,\\n.py-5 {\\n  padding-top: 3rem !important;\\n}\\n\\n.pr-5,\\n.px-5 {\\n  padding-right: 3rem !important;\\n}\\n\\n.pb-5,\\n.py-5 {\\n  padding-bottom: 3rem !important;\\n}\\n\\n.pl-5,\\n.px-5 {\\n  padding-left: 3rem !important;\\n}\\n\\n.m-n1 {\\n  margin: -0.25rem !important;\\n}\\n\\n.mt-n1,\\n.my-n1 {\\n  margin-top: -0.25rem !important;\\n}\\n\\n.mr-n1,\\n.mx-n1 {\\n  margin-right: -0.25rem !important;\\n}\\n\\n.mb-n1,\\n.my-n1 {\\n  margin-bottom: -0.25rem !important;\\n}\\n\\n.ml-n1,\\n.mx-n1 {\\n  margin-left: -0.25rem !important;\\n}\\n\\n.m-n2 {\\n  margin: -0.5rem !important;\\n}\\n\\n.mt-n2,\\n.my-n2 {\\n  margin-top: -0.5rem !important;\\n}\\n\\n.mr-n2,\\n.mx-n2 {\\n  margin-right: -0.5rem !important;\\n}\\n\\n.mb-n2,\\n.my-n2 {\\n  margin-bottom: -0.5rem !important;\\n}\\n\\n.ml-n2,\\n.mx-n2 {\\n  margin-left: -0.5rem !important;\\n}\\n\\n.m-n3 {\\n  margin: -1rem !important;\\n}\\n\\n.mt-n3,\\n.my-n3 {\\n  margin-top: -1rem !important;\\n}\\n\\n.mr-n3,\\n.mx-n3 {\\n  margin-right: -1rem !important;\\n}\\n\\n.mb-n3,\\n.my-n3 {\\n  margin-bottom: -1rem !important;\\n}\\n\\n.ml-n3,\\n.mx-n3 {\\n  margin-left: -1rem !important;\\n}\\n\\n.m-n4 {\\n  margin: -1.5rem !important;\\n}\\n\\n.mt-n4,\\n.my-n4 {\\n  margin-top: -1.5rem !important;\\n}\\n\\n.mr-n4,\\n.mx-n4 {\\n  margin-right: -1.5rem !important;\\n}\\n\\n.mb-n4,\\n.my-n4 {\\n  margin-bottom: -1.5rem !important;\\n}\\n\\n.ml-n4,\\n.mx-n4 {\\n  margin-left: -1.5rem !important;\\n}\\n\\n.m-n5 {\\n  margin: -3rem !important;\\n}\\n\\n.mt-n5,\\n.my-n5 {\\n  margin-top: -3rem !important;\\n}\\n\\n.mr-n5,\\n.mx-n5 {\\n  margin-right: -3rem !important;\\n}\\n\\n.mb-n5,\\n.my-n5 {\\n  margin-bottom: -3rem !important;\\n}\\n\\n.ml-n5,\\n.mx-n5 {\\n  margin-left: -3rem !important;\\n}\\n\\n.m-auto {\\n  margin: auto !important;\\n}\\n\\n.mt-auto,\\n.my-auto {\\n  margin-top: auto !important;\\n}\\n\\n.mr-auto,\\n.mx-auto {\\n  margin-right: auto !important;\\n}\\n\\n.mb-auto,\\n.my-auto {\\n  margin-bottom: auto !important;\\n}\\n\\n.ml-auto,\\n.mx-auto {\\n  margin-left: auto !important;\\n}\\n\\n@media (min-width: 576px) {\\n  .m-sm-0 {\\n    margin: 0 !important;\\n  }\\n  .mt-sm-0,\\n  .my-sm-0 {\\n    margin-top: 0 !important;\\n  }\\n  .mr-sm-0,\\n  .mx-sm-0 {\\n    margin-right: 0 !important;\\n  }\\n  .mb-sm-0,\\n  .my-sm-0 {\\n    margin-bottom: 0 !important;\\n  }\\n  .ml-sm-0,\\n  .mx-sm-0 {\\n    margin-left: 0 !important;\\n  }\\n  .m-sm-1 {\\n    margin: 0.25rem !important;\\n  }\\n  .mt-sm-1,\\n  .my-sm-1 {\\n    margin-top: 0.25rem !important;\\n  }\\n  .mr-sm-1,\\n  .mx-sm-1 {\\n    margin-right: 0.25rem !important;\\n  }\\n  .mb-sm-1,\\n  .my-sm-1 {\\n    margin-bottom: 0.25rem !important;\\n  }\\n  .ml-sm-1,\\n  .mx-sm-1 {\\n    margin-left: 0.25rem !important;\\n  }\\n  .m-sm-2 {\\n    margin: 0.5rem !important;\\n  }\\n  .mt-sm-2,\\n  .my-sm-2 {\\n    margin-top: 0.5rem !important;\\n  }\\n  .mr-sm-2,\\n  .mx-sm-2 {\\n    margin-right: 0.5rem !important;\\n  }\\n  .mb-sm-2,\\n  .my-sm-2 {\\n    margin-bottom: 0.5rem !important;\\n  }\\n  .ml-sm-2,\\n  .mx-sm-2 {\\n    margin-left: 0.5rem !important;\\n  }\\n  .m-sm-3 {\\n    margin: 1rem !important;\\n  }\\n  .mt-sm-3,\\n  .my-sm-3 {\\n    margin-top: 1rem !important;\\n  }\\n  .mr-sm-3,\\n  .mx-sm-3 {\\n    margin-right: 1rem !important;\\n  }\\n  .mb-sm-3,\\n  .my-sm-3 {\\n    margin-bottom: 1rem !important;\\n  }\\n  .ml-sm-3,\\n  .mx-sm-3 {\\n    margin-left: 1rem !important;\\n  }\\n  .m-sm-4 {\\n    margin: 1.5rem !important;\\n  }\\n  .mt-sm-4,\\n  .my-sm-4 {\\n    margin-top: 1.5rem !important;\\n  }\\n  .mr-sm-4,\\n  .mx-sm-4 {\\n    margin-right: 1.5rem !important;\\n  }\\n  .mb-sm-4,\\n  .my-sm-4 {\\n    margin-bottom: 1.5rem !important;\\n  }\\n  .ml-sm-4,\\n  .mx-sm-4 {\\n    margin-left: 1.5rem !important;\\n  }\\n  .m-sm-5 {\\n    margin: 3rem !important;\\n  }\\n  .mt-sm-5,\\n  .my-sm-5 {\\n    margin-top: 3rem !important;\\n  }\\n  .mr-sm-5,\\n  .mx-sm-5 {\\n    margin-right: 3rem !important;\\n  }\\n  .mb-sm-5,\\n  .my-sm-5 {\\n    margin-bottom: 3rem !important;\\n  }\\n  .ml-sm-5,\\n  .mx-sm-5 {\\n    margin-left: 3rem !important;\\n  }\\n  .p-sm-0 {\\n    padding: 0 !important;\\n  }\\n  .pt-sm-0,\\n  .py-sm-0 {\\n    padding-top: 0 !important;\\n  }\\n  .pr-sm-0,\\n  .px-sm-0 {\\n    padding-right: 0 !important;\\n  }\\n  .pb-sm-0,\\n  .py-sm-0 {\\n    padding-bottom: 0 !important;\\n  }\\n  .pl-sm-0,\\n  .px-sm-0 {\\n    padding-left: 0 !important;\\n  }\\n  .p-sm-1 {\\n    padding: 0.25rem !important;\\n  }\\n  .pt-sm-1,\\n  .py-sm-1 {\\n    padding-top: 0.25rem !important;\\n  }\\n  .pr-sm-1,\\n  .px-sm-1 {\\n    padding-right: 0.25rem !important;\\n  }\\n  .pb-sm-1,\\n  .py-sm-1 {\\n    padding-bottom: 0.25rem !important;\\n  }\\n  .pl-sm-1,\\n  .px-sm-1 {\\n    padding-left: 0.25rem !important;\\n  }\\n  .p-sm-2 {\\n    padding: 0.5rem !important;\\n  }\\n  .pt-sm-2,\\n  .py-sm-2 {\\n    padding-top: 0.5rem !important;\\n  }\\n  .pr-sm-2,\\n  .px-sm-2 {\\n    padding-right: 0.5rem !important;\\n  }\\n  .pb-sm-2,\\n  .py-sm-2 {\\n    padding-bottom: 0.5rem !important;\\n  }\\n  .pl-sm-2,\\n  .px-sm-2 {\\n    padding-left: 0.5rem !important;\\n  }\\n  .p-sm-3 {\\n    padding: 1rem !important;\\n  }\\n  .pt-sm-3,\\n  .py-sm-3 {\\n    padding-top: 1rem !important;\\n  }\\n  .pr-sm-3,\\n  .px-sm-3 {\\n    padding-right: 1rem !important;\\n  }\\n  .pb-sm-3,\\n  .py-sm-3 {\\n    padding-bottom: 1rem !important;\\n  }\\n  .pl-sm-3,\\n  .px-sm-3 {\\n    padding-left: 1rem !important;\\n  }\\n  .p-sm-4 {\\n    padding: 1.5rem !important;\\n  }\\n  .pt-sm-4,\\n  .py-sm-4 {\\n    padding-top: 1.5rem !important;\\n  }\\n  .pr-sm-4,\\n  .px-sm-4 {\\n    padding-right: 1.5rem !important;\\n  }\\n  .pb-sm-4,\\n  .py-sm-4 {\\n    padding-bottom: 1.5rem !important;\\n  }\\n  .pl-sm-4,\\n  .px-sm-4 {\\n    padding-left: 1.5rem !important;\\n  }\\n  .p-sm-5 {\\n    padding: 3rem !important;\\n  }\\n  .pt-sm-5,\\n  .py-sm-5 {\\n    padding-top: 3rem !important;\\n  }\\n  .pr-sm-5,\\n  .px-sm-5 {\\n    padding-right: 3rem !important;\\n  }\\n  .pb-sm-5,\\n  .py-sm-5 {\\n    padding-bottom: 3rem !important;\\n  }\\n  .pl-sm-5,\\n  .px-sm-5 {\\n    padding-left: 3rem !important;\\n  }\\n  .m-sm-n1 {\\n    margin: -0.25rem !important;\\n  }\\n  .mt-sm-n1,\\n  .my-sm-n1 {\\n    margin-top: -0.25rem !important;\\n  }\\n  .mr-sm-n1,\\n  .mx-sm-n1 {\\n    margin-right: -0.25rem !important;\\n  }\\n  .mb-sm-n1,\\n  .my-sm-n1 {\\n    margin-bottom: -0.25rem !important;\\n  }\\n  .ml-sm-n1,\\n  .mx-sm-n1 {\\n    margin-left: -0.25rem !important;\\n  }\\n  .m-sm-n2 {\\n    margin: -0.5rem !important;\\n  }\\n  .mt-sm-n2,\\n  .my-sm-n2 {\\n    margin-top: -0.5rem !important;\\n  }\\n  .mr-sm-n2,\\n  .mx-sm-n2 {\\n    margin-right: -0.5rem !important;\\n  }\\n  .mb-sm-n2,\\n  .my-sm-n2 {\\n    margin-bottom: -0.5rem !important;\\n  }\\n  .ml-sm-n2,\\n  .mx-sm-n2 {\\n    margin-left: -0.5rem !important;\\n  }\\n  .m-sm-n3 {\\n    margin: -1rem !important;\\n  }\\n  .mt-sm-n3,\\n  .my-sm-n3 {\\n    margin-top: -1rem !important;\\n  }\\n  .mr-sm-n3,\\n  .mx-sm-n3 {\\n    margin-right: -1rem !important;\\n  }\\n  .mb-sm-n3,\\n  .my-sm-n3 {\\n    margin-bottom: -1rem !important;\\n  }\\n  .ml-sm-n3,\\n  .mx-sm-n3 {\\n    margin-left: -1rem !important;\\n  }\\n  .m-sm-n4 {\\n    margin: -1.5rem !important;\\n  }\\n  .mt-sm-n4,\\n  .my-sm-n4 {\\n    margin-top: -1.5rem !important;\\n  }\\n  .mr-sm-n4,\\n  .mx-sm-n4 {\\n    margin-right: -1.5rem !important;\\n  }\\n  .mb-sm-n4,\\n  .my-sm-n4 {\\n    margin-bottom: -1.5rem !important;\\n  }\\n  .ml-sm-n4,\\n  .mx-sm-n4 {\\n    margin-left: -1.5rem !important;\\n  }\\n  .m-sm-n5 {\\n    margin: -3rem !important;\\n  }\\n  .mt-sm-n5,\\n  .my-sm-n5 {\\n    margin-top: -3rem !important;\\n  }\\n  .mr-sm-n5,\\n  .mx-sm-n5 {\\n    margin-right: -3rem !important;\\n  }\\n  .mb-sm-n5,\\n  .my-sm-n5 {\\n    margin-bottom: -3rem !important;\\n  }\\n  .ml-sm-n5,\\n  .mx-sm-n5 {\\n    margin-left: -3rem !important;\\n  }\\n  .m-sm-auto {\\n    margin: auto !important;\\n  }\\n  .mt-sm-auto,\\n  .my-sm-auto {\\n    margin-top: auto !important;\\n  }\\n  .mr-sm-auto,\\n  .mx-sm-auto {\\n    margin-right: auto !important;\\n  }\\n  .mb-sm-auto,\\n  .my-sm-auto {\\n    margin-bottom: auto !important;\\n  }\\n  .ml-sm-auto,\\n  .mx-sm-auto {\\n    margin-left: auto !important;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .m-md-0 {\\n    margin: 0 !important;\\n  }\\n  .mt-md-0,\\n  .my-md-0 {\\n    margin-top: 0 !important;\\n  }\\n  .mr-md-0,\\n  .mx-md-0 {\\n    margin-right: 0 !important;\\n  }\\n  .mb-md-0,\\n  .my-md-0 {\\n    margin-bottom: 0 !important;\\n  }\\n  .ml-md-0,\\n  .mx-md-0 {\\n    margin-left: 0 !important;\\n  }\\n  .m-md-1 {\\n    margin: 0.25rem !important;\\n  }\\n  .mt-md-1,\\n  .my-md-1 {\\n    margin-top: 0.25rem !important;\\n  }\\n  .mr-md-1,\\n  .mx-md-1 {\\n    margin-right: 0.25rem !important;\\n  }\\n  .mb-md-1,\\n  .my-md-1 {\\n    margin-bottom: 0.25rem !important;\\n  }\\n  .ml-md-1,\\n  .mx-md-1 {\\n    margin-left: 0.25rem !important;\\n  }\\n  .m-md-2 {\\n    margin: 0.5rem !important;\\n  }\\n  .mt-md-2,\\n  .my-md-2 {\\n    margin-top: 0.5rem !important;\\n  }\\n  .mr-md-2,\\n  .mx-md-2 {\\n    margin-right: 0.5rem !important;\\n  }\\n  .mb-md-2,\\n  .my-md-2 {\\n    margin-bottom: 0.5rem !important;\\n  }\\n  .ml-md-2,\\n  .mx-md-2 {\\n    margin-left: 0.5rem !important;\\n  }\\n  .m-md-3 {\\n    margin: 1rem !important;\\n  }\\n  .mt-md-3,\\n  .my-md-3 {\\n    margin-top: 1rem !important;\\n  }\\n  .mr-md-3,\\n  .mx-md-3 {\\n    margin-right: 1rem !important;\\n  }\\n  .mb-md-3,\\n  .my-md-3 {\\n    margin-bottom: 1rem !important;\\n  }\\n  .ml-md-3,\\n  .mx-md-3 {\\n    margin-left: 1rem !important;\\n  }\\n  .m-md-4 {\\n    margin: 1.5rem !important;\\n  }\\n  .mt-md-4,\\n  .my-md-4 {\\n    margin-top: 1.5rem !important;\\n  }\\n  .mr-md-4,\\n  .mx-md-4 {\\n    margin-right: 1.5rem !important;\\n  }\\n  .mb-md-4,\\n  .my-md-4 {\\n    margin-bottom: 1.5rem !important;\\n  }\\n  .ml-md-4,\\n  .mx-md-4 {\\n    margin-left: 1.5rem !important;\\n  }\\n  .m-md-5 {\\n    margin: 3rem !important;\\n  }\\n  .mt-md-5,\\n  .my-md-5 {\\n    margin-top: 3rem !important;\\n  }\\n  .mr-md-5,\\n  .mx-md-5 {\\n    margin-right: 3rem !important;\\n  }\\n  .mb-md-5,\\n  .my-md-5 {\\n    margin-bottom: 3rem !important;\\n  }\\n  .ml-md-5,\\n  .mx-md-5 {\\n    margin-left: 3rem !important;\\n  }\\n  .p-md-0 {\\n    padding: 0 !important;\\n  }\\n  .pt-md-0,\\n  .py-md-0 {\\n    padding-top: 0 !important;\\n  }\\n  .pr-md-0,\\n  .px-md-0 {\\n    padding-right: 0 !important;\\n  }\\n  .pb-md-0,\\n  .py-md-0 {\\n    padding-bottom: 0 !important;\\n  }\\n  .pl-md-0,\\n  .px-md-0 {\\n    padding-left: 0 !important;\\n  }\\n  .p-md-1 {\\n    padding: 0.25rem !important;\\n  }\\n  .pt-md-1,\\n  .py-md-1 {\\n    padding-top: 0.25rem !important;\\n  }\\n  .pr-md-1,\\n  .px-md-1 {\\n    padding-right: 0.25rem !important;\\n  }\\n  .pb-md-1,\\n  .py-md-1 {\\n    padding-bottom: 0.25rem !important;\\n  }\\n  .pl-md-1,\\n  .px-md-1 {\\n    padding-left: 0.25rem !important;\\n  }\\n  .p-md-2 {\\n    padding: 0.5rem !important;\\n  }\\n  .pt-md-2,\\n  .py-md-2 {\\n    padding-top: 0.5rem !important;\\n  }\\n  .pr-md-2,\\n  .px-md-2 {\\n    padding-right: 0.5rem !important;\\n  }\\n  .pb-md-2,\\n  .py-md-2 {\\n    padding-bottom: 0.5rem !important;\\n  }\\n  .pl-md-2,\\n  .px-md-2 {\\n    padding-left: 0.5rem !important;\\n  }\\n  .p-md-3 {\\n    padding: 1rem !important;\\n  }\\n  .pt-md-3,\\n  .py-md-3 {\\n    padding-top: 1rem !important;\\n  }\\n  .pr-md-3,\\n  .px-md-3 {\\n    padding-right: 1rem !important;\\n  }\\n  .pb-md-3,\\n  .py-md-3 {\\n    padding-bottom: 1rem !important;\\n  }\\n  .pl-md-3,\\n  .px-md-3 {\\n    padding-left: 1rem !important;\\n  }\\n  .p-md-4 {\\n    padding: 1.5rem !important;\\n  }\\n  .pt-md-4,\\n  .py-md-4 {\\n    padding-top: 1.5rem !important;\\n  }\\n  .pr-md-4,\\n  .px-md-4 {\\n    padding-right: 1.5rem !important;\\n  }\\n  .pb-md-4,\\n  .py-md-4 {\\n    padding-bottom: 1.5rem !important;\\n  }\\n  .pl-md-4,\\n  .px-md-4 {\\n    padding-left: 1.5rem !important;\\n  }\\n  .p-md-5 {\\n    padding: 3rem !important;\\n  }\\n  .pt-md-5,\\n  .py-md-5 {\\n    padding-top: 3rem !important;\\n  }\\n  .pr-md-5,\\n  .px-md-5 {\\n    padding-right: 3rem !important;\\n  }\\n  .pb-md-5,\\n  .py-md-5 {\\n    padding-bottom: 3rem !important;\\n  }\\n  .pl-md-5,\\n  .px-md-5 {\\n    padding-left: 3rem !important;\\n  }\\n  .m-md-n1 {\\n    margin: -0.25rem !important;\\n  }\\n  .mt-md-n1,\\n  .my-md-n1 {\\n    margin-top: -0.25rem !important;\\n  }\\n  .mr-md-n1,\\n  .mx-md-n1 {\\n    margin-right: -0.25rem !important;\\n  }\\n  .mb-md-n1,\\n  .my-md-n1 {\\n    margin-bottom: -0.25rem !important;\\n  }\\n  .ml-md-n1,\\n  .mx-md-n1 {\\n    margin-left: -0.25rem !important;\\n  }\\n  .m-md-n2 {\\n    margin: -0.5rem !important;\\n  }\\n  .mt-md-n2,\\n  .my-md-n2 {\\n    margin-top: -0.5rem !important;\\n  }\\n  .mr-md-n2,\\n  .mx-md-n2 {\\n    margin-right: -0.5rem !important;\\n  }\\n  .mb-md-n2,\\n  .my-md-n2 {\\n    margin-bottom: -0.5rem !important;\\n  }\\n  .ml-md-n2,\\n  .mx-md-n2 {\\n    margin-left: -0.5rem !important;\\n  }\\n  .m-md-n3 {\\n    margin: -1rem !important;\\n  }\\n  .mt-md-n3,\\n  .my-md-n3 {\\n    margin-top: -1rem !important;\\n  }\\n  .mr-md-n3,\\n  .mx-md-n3 {\\n    margin-right: -1rem !important;\\n  }\\n  .mb-md-n3,\\n  .my-md-n3 {\\n    margin-bottom: -1rem !important;\\n  }\\n  .ml-md-n3,\\n  .mx-md-n3 {\\n    margin-left: -1rem !important;\\n  }\\n  .m-md-n4 {\\n    margin: -1.5rem !important;\\n  }\\n  .mt-md-n4,\\n  .my-md-n4 {\\n    margin-top: -1.5rem !important;\\n  }\\n  .mr-md-n4,\\n  .mx-md-n4 {\\n    margin-right: -1.5rem !important;\\n  }\\n  .mb-md-n4,\\n  .my-md-n4 {\\n    margin-bottom: -1.5rem !important;\\n  }\\n  .ml-md-n4,\\n  .mx-md-n4 {\\n    margin-left: -1.5rem !important;\\n  }\\n  .m-md-n5 {\\n    margin: -3rem !important;\\n  }\\n  .mt-md-n5,\\n  .my-md-n5 {\\n    margin-top: -3rem !important;\\n  }\\n  .mr-md-n5,\\n  .mx-md-n5 {\\n    margin-right: -3rem !important;\\n  }\\n  .mb-md-n5,\\n  .my-md-n5 {\\n    margin-bottom: -3rem !important;\\n  }\\n  .ml-md-n5,\\n  .mx-md-n5 {\\n    margin-left: -3rem !important;\\n  }\\n  .m-md-auto {\\n    margin: auto !important;\\n  }\\n  .mt-md-auto,\\n  .my-md-auto {\\n    margin-top: auto !important;\\n  }\\n  .mr-md-auto,\\n  .mx-md-auto {\\n    margin-right: auto !important;\\n  }\\n  .mb-md-auto,\\n  .my-md-auto {\\n    margin-bottom: auto !important;\\n  }\\n  .ml-md-auto,\\n  .mx-md-auto {\\n    margin-left: auto !important;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .m-lg-0 {\\n    margin: 0 !important;\\n  }\\n  .mt-lg-0,\\n  .my-lg-0 {\\n    margin-top: 0 !important;\\n  }\\n  .mr-lg-0,\\n  .mx-lg-0 {\\n    margin-right: 0 !important;\\n  }\\n  .mb-lg-0,\\n  .my-lg-0 {\\n    margin-bottom: 0 !important;\\n  }\\n  .ml-lg-0,\\n  .mx-lg-0 {\\n    margin-left: 0 !important;\\n  }\\n  .m-lg-1 {\\n    margin: 0.25rem !important;\\n  }\\n  .mt-lg-1,\\n  .my-lg-1 {\\n    margin-top: 0.25rem !important;\\n  }\\n  .mr-lg-1,\\n  .mx-lg-1 {\\n    margin-right: 0.25rem !important;\\n  }\\n  .mb-lg-1,\\n  .my-lg-1 {\\n    margin-bottom: 0.25rem !important;\\n  }\\n  .ml-lg-1,\\n  .mx-lg-1 {\\n    margin-left: 0.25rem !important;\\n  }\\n  .m-lg-2 {\\n    margin: 0.5rem !important;\\n  }\\n  .mt-lg-2,\\n  .my-lg-2 {\\n    margin-top: 0.5rem !important;\\n  }\\n  .mr-lg-2,\\n  .mx-lg-2 {\\n    margin-right: 0.5rem !important;\\n  }\\n  .mb-lg-2,\\n  .my-lg-2 {\\n    margin-bottom: 0.5rem !important;\\n  }\\n  .ml-lg-2,\\n  .mx-lg-2 {\\n    margin-left: 0.5rem !important;\\n  }\\n  .m-lg-3 {\\n    margin: 1rem !important;\\n  }\\n  .mt-lg-3,\\n  .my-lg-3 {\\n    margin-top: 1rem !important;\\n  }\\n  .mr-lg-3,\\n  .mx-lg-3 {\\n    margin-right: 1rem !important;\\n  }\\n  .mb-lg-3,\\n  .my-lg-3 {\\n    margin-bottom: 1rem !important;\\n  }\\n  .ml-lg-3,\\n  .mx-lg-3 {\\n    margin-left: 1rem !important;\\n  }\\n  .m-lg-4 {\\n    margin: 1.5rem !important;\\n  }\\n  .mt-lg-4,\\n  .my-lg-4 {\\n    margin-top: 1.5rem !important;\\n  }\\n  .mr-lg-4,\\n  .mx-lg-4 {\\n    margin-right: 1.5rem !important;\\n  }\\n  .mb-lg-4,\\n  .my-lg-4 {\\n    margin-bottom: 1.5rem !important;\\n  }\\n  .ml-lg-4,\\n  .mx-lg-4 {\\n    margin-left: 1.5rem !important;\\n  }\\n  .m-lg-5 {\\n    margin: 3rem !important;\\n  }\\n  .mt-lg-5,\\n  .my-lg-5 {\\n    margin-top: 3rem !important;\\n  }\\n  .mr-lg-5,\\n  .mx-lg-5 {\\n    margin-right: 3rem !important;\\n  }\\n  .mb-lg-5,\\n  .my-lg-5 {\\n    margin-bottom: 3rem !important;\\n  }\\n  .ml-lg-5,\\n  .mx-lg-5 {\\n    margin-left: 3rem !important;\\n  }\\n  .p-lg-0 {\\n    padding: 0 !important;\\n  }\\n  .pt-lg-0,\\n  .py-lg-0 {\\n    padding-top: 0 !important;\\n  }\\n  .pr-lg-0,\\n  .px-lg-0 {\\n    padding-right: 0 !important;\\n  }\\n  .pb-lg-0,\\n  .py-lg-0 {\\n    padding-bottom: 0 !important;\\n  }\\n  .pl-lg-0,\\n  .px-lg-0 {\\n    padding-left: 0 !important;\\n  }\\n  .p-lg-1 {\\n    padding: 0.25rem !important;\\n  }\\n  .pt-lg-1,\\n  .py-lg-1 {\\n    padding-top: 0.25rem !important;\\n  }\\n  .pr-lg-1,\\n  .px-lg-1 {\\n    padding-right: 0.25rem !important;\\n  }\\n  .pb-lg-1,\\n  .py-lg-1 {\\n    padding-bottom: 0.25rem !important;\\n  }\\n  .pl-lg-1,\\n  .px-lg-1 {\\n    padding-left: 0.25rem !important;\\n  }\\n  .p-lg-2 {\\n    padding: 0.5rem !important;\\n  }\\n  .pt-lg-2,\\n  .py-lg-2 {\\n    padding-top: 0.5rem !important;\\n  }\\n  .pr-lg-2,\\n  .px-lg-2 {\\n    padding-right: 0.5rem !important;\\n  }\\n  .pb-lg-2,\\n  .py-lg-2 {\\n    padding-bottom: 0.5rem !important;\\n  }\\n  .pl-lg-2,\\n  .px-lg-2 {\\n    padding-left: 0.5rem !important;\\n  }\\n  .p-lg-3 {\\n    padding: 1rem !important;\\n  }\\n  .pt-lg-3,\\n  .py-lg-3 {\\n    padding-top: 1rem !important;\\n  }\\n  .pr-lg-3,\\n  .px-lg-3 {\\n    padding-right: 1rem !important;\\n  }\\n  .pb-lg-3,\\n  .py-lg-3 {\\n    padding-bottom: 1rem !important;\\n  }\\n  .pl-lg-3,\\n  .px-lg-3 {\\n    padding-left: 1rem !important;\\n  }\\n  .p-lg-4 {\\n    padding: 1.5rem !important;\\n  }\\n  .pt-lg-4,\\n  .py-lg-4 {\\n    padding-top: 1.5rem !important;\\n  }\\n  .pr-lg-4,\\n  .px-lg-4 {\\n    padding-right: 1.5rem !important;\\n  }\\n  .pb-lg-4,\\n  .py-lg-4 {\\n    padding-bottom: 1.5rem !important;\\n  }\\n  .pl-lg-4,\\n  .px-lg-4 {\\n    padding-left: 1.5rem !important;\\n  }\\n  .p-lg-5 {\\n    padding: 3rem !important;\\n  }\\n  .pt-lg-5,\\n  .py-lg-5 {\\n    padding-top: 3rem !important;\\n  }\\n  .pr-lg-5,\\n  .px-lg-5 {\\n    padding-right: 3rem !important;\\n  }\\n  .pb-lg-5,\\n  .py-lg-5 {\\n    padding-bottom: 3rem !important;\\n  }\\n  .pl-lg-5,\\n  .px-lg-5 {\\n    padding-left: 3rem !important;\\n  }\\n  .m-lg-n1 {\\n    margin: -0.25rem !important;\\n  }\\n  .mt-lg-n1,\\n  .my-lg-n1 {\\n    margin-top: -0.25rem !important;\\n  }\\n  .mr-lg-n1,\\n  .mx-lg-n1 {\\n    margin-right: -0.25rem !important;\\n  }\\n  .mb-lg-n1,\\n  .my-lg-n1 {\\n    margin-bottom: -0.25rem !important;\\n  }\\n  .ml-lg-n1,\\n  .mx-lg-n1 {\\n    margin-left: -0.25rem !important;\\n  }\\n  .m-lg-n2 {\\n    margin: -0.5rem !important;\\n  }\\n  .mt-lg-n2,\\n  .my-lg-n2 {\\n    margin-top: -0.5rem !important;\\n  }\\n  .mr-lg-n2,\\n  .mx-lg-n2 {\\n    margin-right: -0.5rem !important;\\n  }\\n  .mb-lg-n2,\\n  .my-lg-n2 {\\n    margin-bottom: -0.5rem !important;\\n  }\\n  .ml-lg-n2,\\n  .mx-lg-n2 {\\n    margin-left: -0.5rem !important;\\n  }\\n  .m-lg-n3 {\\n    margin: -1rem !important;\\n  }\\n  .mt-lg-n3,\\n  .my-lg-n3 {\\n    margin-top: -1rem !important;\\n  }\\n  .mr-lg-n3,\\n  .mx-lg-n3 {\\n    margin-right: -1rem !important;\\n  }\\n  .mb-lg-n3,\\n  .my-lg-n3 {\\n    margin-bottom: -1rem !important;\\n  }\\n  .ml-lg-n3,\\n  .mx-lg-n3 {\\n    margin-left: -1rem !important;\\n  }\\n  .m-lg-n4 {\\n    margin: -1.5rem !important;\\n  }\\n  .mt-lg-n4,\\n  .my-lg-n4 {\\n    margin-top: -1.5rem !important;\\n  }\\n  .mr-lg-n4,\\n  .mx-lg-n4 {\\n    margin-right: -1.5rem !important;\\n  }\\n  .mb-lg-n4,\\n  .my-lg-n4 {\\n    margin-bottom: -1.5rem !important;\\n  }\\n  .ml-lg-n4,\\n  .mx-lg-n4 {\\n    margin-left: -1.5rem !important;\\n  }\\n  .m-lg-n5 {\\n    margin: -3rem !important;\\n  }\\n  .mt-lg-n5,\\n  .my-lg-n5 {\\n    margin-top: -3rem !important;\\n  }\\n  .mr-lg-n5,\\n  .mx-lg-n5 {\\n    margin-right: -3rem !important;\\n  }\\n  .mb-lg-n5,\\n  .my-lg-n5 {\\n    margin-bottom: -3rem !important;\\n  }\\n  .ml-lg-n5,\\n  .mx-lg-n5 {\\n    margin-left: -3rem !important;\\n  }\\n  .m-lg-auto {\\n    margin: auto !important;\\n  }\\n  .mt-lg-auto,\\n  .my-lg-auto {\\n    margin-top: auto !important;\\n  }\\n  .mr-lg-auto,\\n  .mx-lg-auto {\\n    margin-right: auto !important;\\n  }\\n  .mb-lg-auto,\\n  .my-lg-auto {\\n    margin-bottom: auto !important;\\n  }\\n  .ml-lg-auto,\\n  .mx-lg-auto {\\n    margin-left: auto !important;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .m-xl-0 {\\n    margin: 0 !important;\\n  }\\n  .mt-xl-0,\\n  .my-xl-0 {\\n    margin-top: 0 !important;\\n  }\\n  .mr-xl-0,\\n  .mx-xl-0 {\\n    margin-right: 0 !important;\\n  }\\n  .mb-xl-0,\\n  .my-xl-0 {\\n    margin-bottom: 0 !important;\\n  }\\n  .ml-xl-0,\\n  .mx-xl-0 {\\n    margin-left: 0 !important;\\n  }\\n  .m-xl-1 {\\n    margin: 0.25rem !important;\\n  }\\n  .mt-xl-1,\\n  .my-xl-1 {\\n    margin-top: 0.25rem !important;\\n  }\\n  .mr-xl-1,\\n  .mx-xl-1 {\\n    margin-right: 0.25rem !important;\\n  }\\n  .mb-xl-1,\\n  .my-xl-1 {\\n    margin-bottom: 0.25rem !important;\\n  }\\n  .ml-xl-1,\\n  .mx-xl-1 {\\n    margin-left: 0.25rem !important;\\n  }\\n  .m-xl-2 {\\n    margin: 0.5rem !important;\\n  }\\n  .mt-xl-2,\\n  .my-xl-2 {\\n    margin-top: 0.5rem !important;\\n  }\\n  .mr-xl-2,\\n  .mx-xl-2 {\\n    margin-right: 0.5rem !important;\\n  }\\n  .mb-xl-2,\\n  .my-xl-2 {\\n    margin-bottom: 0.5rem !important;\\n  }\\n  .ml-xl-2,\\n  .mx-xl-2 {\\n    margin-left: 0.5rem !important;\\n  }\\n  .m-xl-3 {\\n    margin: 1rem !important;\\n  }\\n  .mt-xl-3,\\n  .my-xl-3 {\\n    margin-top: 1rem !important;\\n  }\\n  .mr-xl-3,\\n  .mx-xl-3 {\\n    margin-right: 1rem !important;\\n  }\\n  .mb-xl-3,\\n  .my-xl-3 {\\n    margin-bottom: 1rem !important;\\n  }\\n  .ml-xl-3,\\n  .mx-xl-3 {\\n    margin-left: 1rem !important;\\n  }\\n  .m-xl-4 {\\n    margin: 1.5rem !important;\\n  }\\n  .mt-xl-4,\\n  .my-xl-4 {\\n    margin-top: 1.5rem !important;\\n  }\\n  .mr-xl-4,\\n  .mx-xl-4 {\\n    margin-right: 1.5rem !important;\\n  }\\n  .mb-xl-4,\\n  .my-xl-4 {\\n    margin-bottom: 1.5rem !important;\\n  }\\n  .ml-xl-4,\\n  .mx-xl-4 {\\n    margin-left: 1.5rem !important;\\n  }\\n  .m-xl-5 {\\n    margin: 3rem !important;\\n  }\\n  .mt-xl-5,\\n  .my-xl-5 {\\n    margin-top: 3rem !important;\\n  }\\n  .mr-xl-5,\\n  .mx-xl-5 {\\n    margin-right: 3rem !important;\\n  }\\n  .mb-xl-5,\\n  .my-xl-5 {\\n    margin-bottom: 3rem !important;\\n  }\\n  .ml-xl-5,\\n  .mx-xl-5 {\\n    margin-left: 3rem !important;\\n  }\\n  .p-xl-0 {\\n    padding: 0 !important;\\n  }\\n  .pt-xl-0,\\n  .py-xl-0 {\\n    padding-top: 0 !important;\\n  }\\n  .pr-xl-0,\\n  .px-xl-0 {\\n    padding-right: 0 !important;\\n  }\\n  .pb-xl-0,\\n  .py-xl-0 {\\n    padding-bottom: 0 !important;\\n  }\\n  .pl-xl-0,\\n  .px-xl-0 {\\n    padding-left: 0 !important;\\n  }\\n  .p-xl-1 {\\n    padding: 0.25rem !important;\\n  }\\n  .pt-xl-1,\\n  .py-xl-1 {\\n    padding-top: 0.25rem !important;\\n  }\\n  .pr-xl-1,\\n  .px-xl-1 {\\n    padding-right: 0.25rem !important;\\n  }\\n  .pb-xl-1,\\n  .py-xl-1 {\\n    padding-bottom: 0.25rem !important;\\n  }\\n  .pl-xl-1,\\n  .px-xl-1 {\\n    padding-left: 0.25rem !important;\\n  }\\n  .p-xl-2 {\\n    padding: 0.5rem !important;\\n  }\\n  .pt-xl-2,\\n  .py-xl-2 {\\n    padding-top: 0.5rem !important;\\n  }\\n  .pr-xl-2,\\n  .px-xl-2 {\\n    padding-right: 0.5rem !important;\\n  }\\n  .pb-xl-2,\\n  .py-xl-2 {\\n    padding-bottom: 0.5rem !important;\\n  }\\n  .pl-xl-2,\\n  .px-xl-2 {\\n    padding-left: 0.5rem !important;\\n  }\\n  .p-xl-3 {\\n    padding: 1rem !important;\\n  }\\n  .pt-xl-3,\\n  .py-xl-3 {\\n    padding-top: 1rem !important;\\n  }\\n  .pr-xl-3,\\n  .px-xl-3 {\\n    padding-right: 1rem !important;\\n  }\\n  .pb-xl-3,\\n  .py-xl-3 {\\n    padding-bottom: 1rem !important;\\n  }\\n  .pl-xl-3,\\n  .px-xl-3 {\\n    padding-left: 1rem !important;\\n  }\\n  .p-xl-4 {\\n    padding: 1.5rem !important;\\n  }\\n  .pt-xl-4,\\n  .py-xl-4 {\\n    padding-top: 1.5rem !important;\\n  }\\n  .pr-xl-4,\\n  .px-xl-4 {\\n    padding-right: 1.5rem !important;\\n  }\\n  .pb-xl-4,\\n  .py-xl-4 {\\n    padding-bottom: 1.5rem !important;\\n  }\\n  .pl-xl-4,\\n  .px-xl-4 {\\n    padding-left: 1.5rem !important;\\n  }\\n  .p-xl-5 {\\n    padding: 3rem !important;\\n  }\\n  .pt-xl-5,\\n  .py-xl-5 {\\n    padding-top: 3rem !important;\\n  }\\n  .pr-xl-5,\\n  .px-xl-5 {\\n    padding-right: 3rem !important;\\n  }\\n  .pb-xl-5,\\n  .py-xl-5 {\\n    padding-bottom: 3rem !important;\\n  }\\n  .pl-xl-5,\\n  .px-xl-5 {\\n    padding-left: 3rem !important;\\n  }\\n  .m-xl-n1 {\\n    margin: -0.25rem !important;\\n  }\\n  .mt-xl-n1,\\n  .my-xl-n1 {\\n    margin-top: -0.25rem !important;\\n  }\\n  .mr-xl-n1,\\n  .mx-xl-n1 {\\n    margin-right: -0.25rem !important;\\n  }\\n  .mb-xl-n1,\\n  .my-xl-n1 {\\n    margin-bottom: -0.25rem !important;\\n  }\\n  .ml-xl-n1,\\n  .mx-xl-n1 {\\n    margin-left: -0.25rem !important;\\n  }\\n  .m-xl-n2 {\\n    margin: -0.5rem !important;\\n  }\\n  .mt-xl-n2,\\n  .my-xl-n2 {\\n    margin-top: -0.5rem !important;\\n  }\\n  .mr-xl-n2,\\n  .mx-xl-n2 {\\n    margin-right: -0.5rem !important;\\n  }\\n  .mb-xl-n2,\\n  .my-xl-n2 {\\n    margin-bottom: -0.5rem !important;\\n  }\\n  .ml-xl-n2,\\n  .mx-xl-n2 {\\n    margin-left: -0.5rem !important;\\n  }\\n  .m-xl-n3 {\\n    margin: -1rem !important;\\n  }\\n  .mt-xl-n3,\\n  .my-xl-n3 {\\n    margin-top: -1rem !important;\\n  }\\n  .mr-xl-n3,\\n  .mx-xl-n3 {\\n    margin-right: -1rem !important;\\n  }\\n  .mb-xl-n3,\\n  .my-xl-n3 {\\n    margin-bottom: -1rem !important;\\n  }\\n  .ml-xl-n3,\\n  .mx-xl-n3 {\\n    margin-left: -1rem !important;\\n  }\\n  .m-xl-n4 {\\n    margin: -1.5rem !important;\\n  }\\n  .mt-xl-n4,\\n  .my-xl-n4 {\\n    margin-top: -1.5rem !important;\\n  }\\n  .mr-xl-n4,\\n  .mx-xl-n4 {\\n    margin-right: -1.5rem !important;\\n  }\\n  .mb-xl-n4,\\n  .my-xl-n4 {\\n    margin-bottom: -1.5rem !important;\\n  }\\n  .ml-xl-n4,\\n  .mx-xl-n4 {\\n    margin-left: -1.5rem !important;\\n  }\\n  .m-xl-n5 {\\n    margin: -3rem !important;\\n  }\\n  .mt-xl-n5,\\n  .my-xl-n5 {\\n    margin-top: -3rem !important;\\n  }\\n  .mr-xl-n5,\\n  .mx-xl-n5 {\\n    margin-right: -3rem !important;\\n  }\\n  .mb-xl-n5,\\n  .my-xl-n5 {\\n    margin-bottom: -3rem !important;\\n  }\\n  .ml-xl-n5,\\n  .mx-xl-n5 {\\n    margin-left: -3rem !important;\\n  }\\n  .m-xl-auto {\\n    margin: auto !important;\\n  }\\n  .mt-xl-auto,\\n  .my-xl-auto {\\n    margin-top: auto !important;\\n  }\\n  .mr-xl-auto,\\n  .mx-xl-auto {\\n    margin-right: auto !important;\\n  }\\n  .mb-xl-auto,\\n  .my-xl-auto {\\n    margin-bottom: auto !important;\\n  }\\n  .ml-xl-auto,\\n  .mx-xl-auto {\\n    margin-left: auto !important;\\n  }\\n}\\n\\n/*# sourceMappingURL=bootstrap-grid.css.map */\",\"// Container widths\\n//\\n// Set the container width, and override it for fixed navbars in media queries.\\n\\n@if $enable-grid-classes {\\n  .container {\\n    @include make-container();\\n    @include make-container-max-widths();\\n  }\\n}\\n\\n// Fluid container\\n//\\n// Utilizes the mixin meant for fixed width containers, but with 100% width for\\n// fluid, full width layouts.\\n\\n@if $enable-grid-classes {\\n  .container-fluid {\\n    @include make-container();\\n  }\\n}\\n\\n// Row\\n//\\n// Rows contain and clear the floats of your columns.\\n\\n@if $enable-grid-classes {\\n  .row {\\n    @include make-row();\\n  }\\n\\n  // Remove the negative margin from default .row, then the horizontal padding\\n  // from all immediate children columns (to prevent runaway style inheritance).\\n  .no-gutters {\\n    margin-right: 0;\\n    margin-left: 0;\\n\\n    > .col,\\n    > [class*=\\\"col-\\\"] {\\n      padding-right: 0;\\n      padding-left: 0;\\n    }\\n  }\\n}\\n\\n// Columns\\n//\\n// Common styles for small and large grid columns\\n\\n@if $enable-grid-classes {\\n  @include make-grid-columns();\\n}\\n\",\"/// Grid system\\n//\\n// Generate semantic grid columns with these mixins.\\n\\n@mixin make-container($gutter: $grid-gutter-width) {\\n  width: 100%;\\n  padding-right: $gutter / 2;\\n  padding-left: $gutter / 2;\\n  margin-right: auto;\\n  margin-left: auto;\\n}\\n\\n\\n// For each breakpoint, define the maximum width of the container in a media query\\n@mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) {\\n  @each $breakpoint, $container-max-width in $max-widths {\\n    @include media-breakpoint-up($breakpoint, $breakpoints) {\\n      max-width: $container-max-width;\\n    }\\n  }\\n}\\n\\n@mixin make-row($gutter: $grid-gutter-width) {\\n  display: flex;\\n  flex-wrap: wrap;\\n  margin-right: -$gutter / 2;\\n  margin-left: -$gutter / 2;\\n}\\n\\n@mixin make-col-ready($gutter: $grid-gutter-width) {\\n  position: relative;\\n  // Prevent columns from becoming too narrow when at smaller grid tiers by\\n  // always setting `width: 100%;`. This works because we use `flex` values\\n  // later on to override this initial width.\\n  width: 100%;\\n  padding-right: $gutter / 2;\\n  padding-left: $gutter / 2;\\n}\\n\\n@mixin make-col($size, $columns: $grid-columns) {\\n  flex: 0 0 percentage($size / $columns);\\n  // Add a `max-width` to ensure content within each column does not blow out\\n  // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari\\n  // do not appear to require this.\\n  max-width: percentage($size / $columns);\\n}\\n\\n@mixin make-col-offset($size, $columns: $grid-columns) {\\n  $num: $size / $columns;\\n  margin-left: if($num == 0, 0, percentage($num));\\n}\\n\",\"// Breakpoint viewport sizes and media queries.\\n//\\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\\n//\\n//    (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)\\n//\\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\\n\\n// Name of the next breakpoint, or null for the last breakpoint.\\n//\\n//    >> breakpoint-next(sm)\\n//    md\\n//    >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\\n//    md\\n//    >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))\\n//    md\\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\\n  $n: index($breakpoint-names, $name);\\n  @return if($n != null and $n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\\n}\\n\\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\\n//\\n//    >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\\n//    576px\\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\\n  $min: map-get($breakpoints, $name);\\n  @return if($min != 0, $min, null);\\n}\\n\\n// Maximum breakpoint width. Null for the largest (last) breakpoint.\\n// The maximum value is calculated as the minimum of the next one less 0.02px\\n// to work around the limitations of `min-` and `max-` prefixes and viewports with fractional widths.\\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\\n//\\n//    >> breakpoint-max(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\\n//    767.98px\\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\\n  $next: breakpoint-next($name, $breakpoints);\\n  @return if($next, breakpoint-min($next, $breakpoints) - .02, null);\\n}\\n\\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\\n// Useful for making responsive utilities.\\n//\\n//    >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\\n//    \\\"\\\"  (Returns a blank string)\\n//    >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\\n//    \\\"-sm\\\"\\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\\n  @return if(breakpoint-min($name, $breakpoints) == null, \\\"\\\", \\\"-#{$name}\\\");\\n}\\n\\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\\n// Makes the @content apply to the given breakpoint and wider.\\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\\n  $min: breakpoint-min($name, $breakpoints);\\n  @if $min {\\n    @media (min-width: $min) {\\n      @content;\\n    }\\n  } @else {\\n    @content;\\n  }\\n}\\n\\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\\n// Makes the @content apply to the given breakpoint and narrower.\\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\\n  $max: breakpoint-max($name, $breakpoints);\\n  @if $max {\\n    @media (max-width: $max) {\\n      @content;\\n    }\\n  } @else {\\n    @content;\\n  }\\n}\\n\\n// Media that spans multiple breakpoint widths.\\n// Makes the @content apply between the min and max breakpoints\\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\\n  $min: breakpoint-min($lower, $breakpoints);\\n  $max: breakpoint-max($upper, $breakpoints);\\n\\n  @if $min != null and $max != null {\\n    @media (min-width: $min) and (max-width: $max) {\\n      @content;\\n    }\\n  } @else if $max == null {\\n    @include media-breakpoint-up($lower, $breakpoints) {\\n      @content;\\n    }\\n  } @else if $min == null {\\n    @include media-breakpoint-down($upper, $breakpoints) {\\n      @content;\\n    }\\n  }\\n}\\n\\n// Media between the breakpoint's minimum and maximum widths.\\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\\n  $min: breakpoint-min($name, $breakpoints);\\n  $max: breakpoint-max($name, $breakpoints);\\n\\n  @if $min != null and $max != null {\\n    @media (min-width: $min) and (max-width: $max) {\\n      @content;\\n    }\\n  } @else if $max == null {\\n    @include media-breakpoint-up($name, $breakpoints) {\\n      @content;\\n    }\\n  } @else if $min == null {\\n    @include media-breakpoint-down($name, $breakpoints) {\\n      @content;\\n    }\\n  }\\n}\\n\",\"// Variables\\n//\\n// Variables should follow the `$component-state-property-size` formula for\\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\\n\\n// Color system\\n\\n$white:    #fff !default;\\n$gray-100: #f8f9fa !default;\\n$gray-200: #e9ecef !default;\\n$gray-300: #dee2e6 !default;\\n$gray-400: #ced4da !default;\\n$gray-500: #adb5bd !default;\\n$gray-600: #6c757d !default;\\n$gray-700: #495057 !default;\\n$gray-800: #343a40 !default;\\n$gray-900: #212529 !default;\\n$black:    #000 !default;\\n\\n$grays: () !default;\\n// stylelint-disable-next-line scss/dollar-variable-default\\n$grays: map-merge(\\n  (\\n    \\\"100\\\": $gray-100,\\n    \\\"200\\\": $gray-200,\\n    \\\"300\\\": $gray-300,\\n    \\\"400\\\": $gray-400,\\n    \\\"500\\\": $gray-500,\\n    \\\"600\\\": $gray-600,\\n    \\\"700\\\": $gray-700,\\n    \\\"800\\\": $gray-800,\\n    \\\"900\\\": $gray-900\\n  ),\\n  $grays\\n);\\n\\n$blue:    #007bff !default;\\n$indigo:  #6610f2 !default;\\n$purple:  #6f42c1 !default;\\n$pink:    #e83e8c !default;\\n$red:     #dc3545 !default;\\n$orange:  #fd7e14 !default;\\n$yellow:  #ffc107 !default;\\n$green:   #28a745 !default;\\n$teal:    #20c997 !default;\\n$cyan:    #17a2b8 !default;\\n\\n$colors: () !default;\\n// stylelint-disable-next-line scss/dollar-variable-default\\n$colors: map-merge(\\n  (\\n    \\\"blue\\\":       $blue,\\n    \\\"indigo\\\":     $indigo,\\n    \\\"purple\\\":     $purple,\\n    \\\"pink\\\":       $pink,\\n    \\\"red\\\":        $red,\\n    \\\"orange\\\":     $orange,\\n    \\\"yellow\\\":     $yellow,\\n    \\\"green\\\":      $green,\\n    \\\"teal\\\":       $teal,\\n    \\\"cyan\\\":       $cyan,\\n    \\\"white\\\":      $white,\\n    \\\"gray\\\":       $gray-600,\\n    \\\"gray-dark\\\":  $gray-800\\n  ),\\n  $colors\\n);\\n\\n$primary:       $blue !default;\\n$secondary:     $gray-600 !default;\\n$success:       $green !default;\\n$info:          $cyan !default;\\n$warning:       $yellow !default;\\n$danger:        $red !default;\\n$light:         $gray-100 !default;\\n$dark:          $gray-800 !default;\\n\\n$theme-colors: () !default;\\n// stylelint-disable-next-line scss/dollar-variable-default\\n$theme-colors: map-merge(\\n  (\\n    \\\"primary\\\":    $primary,\\n    \\\"secondary\\\":  $secondary,\\n    \\\"success\\\":    $success,\\n    \\\"info\\\":       $info,\\n    \\\"warning\\\":    $warning,\\n    \\\"danger\\\":     $danger,\\n    \\\"light\\\":      $light,\\n    \\\"dark\\\":       $dark\\n  ),\\n  $theme-colors\\n);\\n\\n// Set a specific jump point for requesting color jumps\\n$theme-color-interval:      8% !default;\\n\\n// The yiq lightness value that determines when the lightness of color changes from \\\"dark\\\" to \\\"light\\\". Acceptable values are between 0 and 255.\\n$yiq-contrasted-threshold:  150 !default;\\n\\n// Customize the light and dark text colors for use in our YIQ color contrast function.\\n$yiq-text-dark:             $gray-900 !default;\\n$yiq-text-light:            $white !default;\\n\\n\\n// Options\\n//\\n// Quickly modify global styling by enabling or disabling optional features.\\n\\n$enable-caret:                                true !default;\\n$enable-rounded:                              true !default;\\n$enable-shadows:                              false !default;\\n$enable-gradients:                            false !default;\\n$enable-transitions:                          true !default;\\n$enable-prefers-reduced-motion-media-query:   true !default;\\n$enable-hover-media-query:                    false !default; // Deprecated, no longer affects any compiled CSS\\n$enable-grid-classes:                         true !default;\\n$enable-pointer-cursor-for-buttons:           true !default;\\n$enable-print-styles:                         true !default;\\n$enable-responsive-font-sizes:                false !default;\\n$enable-validation-icons:                     true !default;\\n$enable-deprecation-messages:                 true !default;\\n\\n\\n// Spacing\\n//\\n// Control the default styling of most Bootstrap elements by modifying these\\n// variables. Mostly focused on spacing.\\n// You can add more entries to the $spacers map, should you need more variation.\\n\\n$spacer: 1rem !default;\\n$spacers: () !default;\\n// stylelint-disable-next-line scss/dollar-variable-default\\n$spacers: map-merge(\\n  (\\n    0: 0,\\n    1: ($spacer * .25),\\n    2: ($spacer * .5),\\n    3: $spacer,\\n    4: ($spacer * 1.5),\\n    5: ($spacer * 3)\\n  ),\\n  $spacers\\n);\\n\\n// This variable affects the `.h-*` and `.w-*` classes.\\n$sizes: () !default;\\n// stylelint-disable-next-line scss/dollar-variable-default\\n$sizes: map-merge(\\n  (\\n    25: 25%,\\n    50: 50%,\\n    75: 75%,\\n    100: 100%,\\n    auto: auto\\n  ),\\n  $sizes\\n);\\n\\n\\n// Body\\n//\\n// Settings for the `<body>` element.\\n\\n$body-bg:                   $white !default;\\n$body-color:                $gray-900 !default;\\n\\n\\n// Links\\n//\\n// Style anchor elements.\\n\\n$link-color:                              theme-color(\\\"primary\\\") !default;\\n$link-decoration:                         none !default;\\n$link-hover-color:                        darken($link-color, 15%) !default;\\n$link-hover-decoration:                   underline !default;\\n// Darken percentage for links with `.text-*` class (e.g. `.text-success`)\\n$emphasized-link-hover-darken-percentage: 15% !default;\\n\\n// Paragraphs\\n//\\n// Style p element.\\n\\n$paragraph-margin-bottom:   1rem !default;\\n\\n\\n// Grid breakpoints\\n//\\n// Define the minimum dimensions at which your layout will change,\\n// adapting to different screen sizes, for use in media queries.\\n\\n$grid-breakpoints: (\\n  xs: 0,\\n  sm: 576px,\\n  md: 768px,\\n  lg: 992px,\\n  xl: 1200px\\n) !default;\\n\\n@include _assert-ascending($grid-breakpoints, \\\"$grid-breakpoints\\\");\\n@include _assert-starts-at-zero($grid-breakpoints, \\\"$grid-breakpoints\\\");\\n\\n\\n// Grid containers\\n//\\n// Define the maximum width of `.container` for different screen sizes.\\n\\n$container-max-widths: (\\n  sm: 540px,\\n  md: 720px,\\n  lg: 960px,\\n  xl: 1140px\\n) !default;\\n\\n@include _assert-ascending($container-max-widths, \\\"$container-max-widths\\\");\\n\\n\\n// Grid columns\\n//\\n// Set the number of columns and specify the width of the gutters.\\n\\n$grid-columns:                12 !default;\\n$grid-gutter-width:           30px !default;\\n\\n\\n// Components\\n//\\n// Define common padding and border radius sizes and more.\\n\\n$line-height-lg:              1.5 !default;\\n$line-height-sm:              1.5 !default;\\n\\n$border-width:                1px !default;\\n$border-color:                $gray-300 !default;\\n\\n$border-radius:               .25rem !default;\\n$border-radius-lg:            .3rem !default;\\n$border-radius-sm:            .2rem !default;\\n\\n$rounded-pill:                50rem !default;\\n\\n$box-shadow-sm:               0 .125rem .25rem rgba($black, .075) !default;\\n$box-shadow:                  0 .5rem 1rem rgba($black, .15) !default;\\n$box-shadow-lg:               0 1rem 3rem rgba($black, .175) !default;\\n\\n$component-active-color:      $white !default;\\n$component-active-bg:         theme-color(\\\"primary\\\") !default;\\n\\n$caret-width:                 .3em !default;\\n$caret-vertical-align:        $caret-width * .85 !default;\\n$caret-spacing:               $caret-width * .85 !default;\\n\\n$transition-base:             all .2s ease-in-out !default;\\n$transition-fade:             opacity .15s linear !default;\\n$transition-collapse:         height .35s ease !default;\\n\\n$embed-responsive-aspect-ratios: () !default;\\n// stylelint-disable-next-line scss/dollar-variable-default\\n$embed-responsive-aspect-ratios: join(\\n  (\\n    (21 9),\\n    (16 9),\\n    (4 3),\\n    (1 1),\\n  ),\\n  $embed-responsive-aspect-ratios\\n);\\n\\n// Typography\\n//\\n// Font, line-height, and color for body text, headings, and more.\\n\\n// stylelint-disable value-keyword-case\\n$font-family-sans-serif:      -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, \\\"Helvetica Neue\\\", Arial, \\\"Noto Sans\\\", sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\" !default;\\n$font-family-monospace:       SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace !default;\\n$font-family-base:            $font-family-sans-serif !default;\\n// stylelint-enable value-keyword-case\\n\\n$font-size-base:              1rem !default; // Assumes the browser default, typically `16px`\\n$font-size-lg:                $font-size-base * 1.25 !default;\\n$font-size-sm:                $font-size-base * .875 !default;\\n\\n$font-weight-lighter:         lighter !default;\\n$font-weight-light:           300 !default;\\n$font-weight-normal:          400 !default;\\n$font-weight-bold:            700 !default;\\n$font-weight-bolder:          bolder !default;\\n\\n$font-weight-base:            $font-weight-normal !default;\\n$line-height-base:            1.5 !default;\\n\\n$h1-font-size:                $font-size-base * 2.5 !default;\\n$h2-font-size:                $font-size-base * 2 !default;\\n$h3-font-size:                $font-size-base * 1.75 !default;\\n$h4-font-size:                $font-size-base * 1.5 !default;\\n$h5-font-size:                $font-size-base * 1.25 !default;\\n$h6-font-size:                $font-size-base !default;\\n\\n$headings-margin-bottom:      $spacer / 2 !default;\\n$headings-font-family:        null !default;\\n$headings-font-weight:        500 !default;\\n$headings-line-height:        1.2 !default;\\n$headings-color:              null !default;\\n\\n$display1-size:               6rem !default;\\n$display2-size:               5.5rem !default;\\n$display3-size:               4.5rem !default;\\n$display4-size:               3.5rem !default;\\n\\n$display1-weight:             300 !default;\\n$display2-weight:             300 !default;\\n$display3-weight:             300 !default;\\n$display4-weight:             300 !default;\\n$display-line-height:         $headings-line-height !default;\\n\\n$lead-font-size:              $font-size-base * 1.25 !default;\\n$lead-font-weight:            300 !default;\\n\\n$small-font-size:             80% !default;\\n\\n$text-muted:                  $gray-600 !default;\\n\\n$blockquote-small-color:      $gray-600 !default;\\n$blockquote-small-font-size:  $small-font-size !default;\\n$blockquote-font-size:        $font-size-base * 1.25 !default;\\n\\n$hr-border-color:             rgba($black, .1) !default;\\n$hr-border-width:             $border-width !default;\\n\\n$mark-padding:                .2em !default;\\n\\n$dt-font-weight:              $font-weight-bold !default;\\n\\n$kbd-box-shadow:              inset 0 -.1rem 0 rgba($black, .25) !default;\\n$nested-kbd-font-weight:      $font-weight-bold !default;\\n\\n$list-inline-padding:         .5rem !default;\\n\\n$mark-bg:                     #fcf8e3 !default;\\n\\n$hr-margin-y:                 $spacer !default;\\n\\n\\n// Tables\\n//\\n// Customizes the `.table` component with basic values, each used across all table variations.\\n\\n$table-cell-padding:          .75rem !default;\\n$table-cell-padding-sm:       .3rem !default;\\n\\n$table-color:                 $body-color !default;\\n$table-bg:                    null !default;\\n$table-accent-bg:             rgba($black, .05) !default;\\n$table-hover-color:           $table-color !default;\\n$table-hover-bg:              rgba($black, .075) !default;\\n$table-active-bg:             $table-hover-bg !default;\\n\\n$table-border-width:          $border-width !default;\\n$table-border-color:          $border-color !default;\\n\\n$table-head-bg:               $gray-200 !default;\\n$table-head-color:            $gray-700 !default;\\n\\n$table-dark-color:            $white !default;\\n$table-dark-bg:               $gray-800 !default;\\n$table-dark-accent-bg:        rgba($white, .05) !default;\\n$table-dark-hover-color:      $table-dark-color !default;\\n$table-dark-hover-bg:         rgba($white, .075) !default;\\n$table-dark-border-color:     lighten($table-dark-bg, 7.5%) !default;\\n$table-dark-color:            $white !default;\\n\\n$table-striped-order:         odd !default;\\n\\n$table-caption-color:         $text-muted !default;\\n\\n$table-bg-level:              -9 !default;\\n$table-border-level:          -6 !default;\\n\\n\\n// Buttons + Forms\\n//\\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\\n\\n$input-btn-padding-y:         .375rem !default;\\n$input-btn-padding-x:         .75rem !default;\\n$input-btn-font-family:       null !default;\\n$input-btn-font-size:         $font-size-base !default;\\n$input-btn-line-height:       $line-height-base !default;\\n\\n$input-btn-focus-width:       .2rem !default;\\n$input-btn-focus-color:       rgba($component-active-bg, .25) !default;\\n$input-btn-focus-box-shadow:  0 0 0 $input-btn-focus-width $input-btn-focus-color !default;\\n\\n$input-btn-padding-y-sm:      .25rem !default;\\n$input-btn-padding-x-sm:      .5rem !default;\\n$input-btn-font-size-sm:      $font-size-sm !default;\\n$input-btn-line-height-sm:    $line-height-sm !default;\\n\\n$input-btn-padding-y-lg:      .5rem !default;\\n$input-btn-padding-x-lg:      1rem !default;\\n$input-btn-font-size-lg:      $font-size-lg !default;\\n$input-btn-line-height-lg:    $line-height-lg !default;\\n\\n$input-btn-border-width:      $border-width !default;\\n\\n\\n// Buttons\\n//\\n// For each of Bootstrap's buttons, define text, background, and border color.\\n\\n$btn-padding-y:               $input-btn-padding-y !default;\\n$btn-padding-x:               $input-btn-padding-x !default;\\n$btn-font-family:             $input-btn-font-family !default;\\n$btn-font-size:               $input-btn-font-size !default;\\n$btn-line-height:             $input-btn-line-height !default;\\n\\n$btn-padding-y-sm:            $input-btn-padding-y-sm !default;\\n$btn-padding-x-sm:            $input-btn-padding-x-sm !default;\\n$btn-font-size-sm:            $input-btn-font-size-sm !default;\\n$btn-line-height-sm:          $input-btn-line-height-sm !default;\\n\\n$btn-padding-y-lg:            $input-btn-padding-y-lg !default;\\n$btn-padding-x-lg:            $input-btn-padding-x-lg !default;\\n$btn-font-size-lg:            $input-btn-font-size-lg !default;\\n$btn-line-height-lg:          $input-btn-line-height-lg !default;\\n\\n$btn-border-width:            $input-btn-border-width !default;\\n\\n$btn-font-weight:             $font-weight-normal !default;\\n$btn-box-shadow:              inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\\n$btn-focus-width:             $input-btn-focus-width !default;\\n$btn-focus-box-shadow:        $input-btn-focus-box-shadow !default;\\n$btn-disabled-opacity:        .65 !default;\\n$btn-active-box-shadow:       inset 0 3px 5px rgba($black, .125) !default;\\n\\n$btn-link-disabled-color:     $gray-600 !default;\\n\\n$btn-block-spacing-y:         .5rem !default;\\n\\n// Allows for customizing button radius independently from global border radius\\n$btn-border-radius:           $border-radius !default;\\n$btn-border-radius-lg:        $border-radius-lg !default;\\n$btn-border-radius-sm:        $border-radius-sm !default;\\n\\n$btn-transition:              color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\\n\\n\\n// Forms\\n\\n$label-margin-bottom:                   .5rem !default;\\n\\n$input-padding-y:                       $input-btn-padding-y !default;\\n$input-padding-x:                       $input-btn-padding-x !default;\\n$input-font-family:                     $input-btn-font-family !default;\\n$input-font-size:                       $input-btn-font-size !default;\\n$input-font-weight:                     $font-weight-base !default;\\n$input-line-height:                     $input-btn-line-height !default;\\n\\n$input-padding-y-sm:                    $input-btn-padding-y-sm !default;\\n$input-padding-x-sm:                    $input-btn-padding-x-sm !default;\\n$input-font-size-sm:                    $input-btn-font-size-sm !default;\\n$input-line-height-sm:                  $input-btn-line-height-sm !default;\\n\\n$input-padding-y-lg:                    $input-btn-padding-y-lg !default;\\n$input-padding-x-lg:                    $input-btn-padding-x-lg !default;\\n$input-font-size-lg:                    $input-btn-font-size-lg !default;\\n$input-line-height-lg:                  $input-btn-line-height-lg !default;\\n\\n$input-bg:                              $white !default;\\n$input-disabled-bg:                     $gray-200 !default;\\n\\n$input-color:                           $gray-700 !default;\\n$input-border-color:                    $gray-400 !default;\\n$input-border-width:                    $input-btn-border-width !default;\\n$input-box-shadow:                      inset 0 1px 1px rgba($black, .075) !default;\\n\\n$input-border-radius:                   $border-radius !default;\\n$input-border-radius-lg:                $border-radius-lg !default;\\n$input-border-radius-sm:                $border-radius-sm !default;\\n\\n$input-focus-bg:                        $input-bg !default;\\n$input-focus-border-color:              lighten($component-active-bg, 25%) !default;\\n$input-focus-color:                     $input-color !default;\\n$input-focus-width:                     $input-btn-focus-width !default;\\n$input-focus-box-shadow:                $input-btn-focus-box-shadow !default;\\n\\n$input-placeholder-color:               $gray-600 !default;\\n$input-plaintext-color:                 $body-color !default;\\n\\n$input-height-border:                   $input-border-width * 2 !default;\\n\\n$input-height-inner:                    calc(#{$input-line-height * 1em} + #{$input-padding-y * 2}) !default;\\n$input-height-inner-half:               calc(#{$input-line-height * .5em} + #{$input-padding-y}) !default;\\n$input-height-inner-quarter:            calc(#{$input-line-height * .25em} + #{$input-padding-y / 2}) !default;\\n\\n$input-height:                          calc(#{$input-line-height * 1em} + #{$input-padding-y * 2} + #{$input-height-border}) !default;\\n$input-height-sm:                       calc(#{$input-line-height-sm * 1em} + #{$input-btn-padding-y-sm * 2} + #{$input-height-border}) !default;\\n$input-height-lg:                       calc(#{$input-line-height-lg * 1em} + #{$input-btn-padding-y-lg * 2} + #{$input-height-border}) !default;\\n\\n$input-transition:                      border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\\n\\n$form-text-margin-top:                  .25rem !default;\\n\\n$form-check-input-gutter:               1.25rem !default;\\n$form-check-input-margin-y:             .3rem !default;\\n$form-check-input-margin-x:             .25rem !default;\\n\\n$form-check-inline-margin-x:            .75rem !default;\\n$form-check-inline-input-margin-x:      .3125rem !default;\\n\\n$form-grid-gutter-width:                10px !default;\\n$form-group-margin-bottom:              1rem !default;\\n\\n$input-group-addon-color:               $input-color !default;\\n$input-group-addon-bg:                  $gray-200 !default;\\n$input-group-addon-border-color:        $input-border-color !default;\\n\\n$custom-forms-transition:               background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\\n\\n$custom-control-gutter:                 .5rem !default;\\n$custom-control-spacer-x:               1rem !default;\\n\\n$custom-control-indicator-size:         1rem !default;\\n$custom-control-indicator-bg:           $input-bg !default;\\n\\n$custom-control-indicator-bg-size:      50% 50% !default;\\n$custom-control-indicator-box-shadow:   $input-box-shadow !default;\\n$custom-control-indicator-border-color: $gray-500 !default;\\n$custom-control-indicator-border-width: $input-border-width !default;\\n\\n$custom-control-indicator-disabled-bg:          $input-disabled-bg !default;\\n$custom-control-label-disabled-color:           $gray-600 !default;\\n\\n$custom-control-indicator-checked-color:        $component-active-color !default;\\n$custom-control-indicator-checked-bg:           $component-active-bg !default;\\n$custom-control-indicator-checked-disabled-bg:  rgba(theme-color(\\\"primary\\\"), .5) !default;\\n$custom-control-indicator-checked-box-shadow:   none !default;\\n$custom-control-indicator-checked-border-color: $custom-control-indicator-checked-bg !default;\\n\\n$custom-control-indicator-focus-box-shadow:     $input-focus-box-shadow !default;\\n$custom-control-indicator-focus-border-color:   $input-focus-border-color !default;\\n\\n$custom-control-indicator-active-color:         $component-active-color !default;\\n$custom-control-indicator-active-bg:            lighten($component-active-bg, 35%) !default;\\n$custom-control-indicator-active-box-shadow:    none !default;\\n$custom-control-indicator-active-border-color:  $custom-control-indicator-active-bg !default;\\n\\n$custom-checkbox-indicator-border-radius:       $border-radius !default;\\n$custom-checkbox-indicator-icon-checked:        str-replace(url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='#{$custom-control-indicator-checked-color}' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e\\\"), \\\"#\\\", \\\"%23\\\") !default;\\n\\n$custom-checkbox-indicator-indeterminate-bg:           $component-active-bg !default;\\n$custom-checkbox-indicator-indeterminate-color:        $custom-control-indicator-checked-color !default;\\n$custom-checkbox-indicator-icon-indeterminate:         str-replace(url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='#{$custom-checkbox-indicator-indeterminate-color}' d='M0 2h4'/%3e%3c/svg%3e\\\"), \\\"#\\\", \\\"%23\\\") !default;\\n$custom-checkbox-indicator-indeterminate-box-shadow:   none !default;\\n$custom-checkbox-indicator-indeterminate-border-color: $custom-checkbox-indicator-indeterminate-bg !default;\\n\\n$custom-radio-indicator-border-radius:          50% !default;\\n$custom-radio-indicator-icon-checked:           str-replace(url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='#{$custom-control-indicator-checked-color}'/%3e%3c/svg%3e\\\"), \\\"#\\\", \\\"%23\\\") !default;\\n\\n$custom-switch-width:                           $custom-control-indicator-size * 1.75 !default;\\n$custom-switch-indicator-border-radius:         $custom-control-indicator-size / 2 !default;\\n$custom-switch-indicator-size:                  calc(#{$custom-control-indicator-size} - #{$custom-control-indicator-border-width * 4}) !default;\\n\\n$custom-select-padding-y:           $input-padding-y !default;\\n$custom-select-padding-x:           $input-padding-x !default;\\n$custom-select-font-family:         $input-font-family !default;\\n$custom-select-font-size:           $input-font-size !default;\\n$custom-select-height:              $input-height !default;\\n$custom-select-indicator-padding:   1rem !default; // Extra padding to account for the presence of the background-image based indicator\\n$custom-select-font-weight:         $input-font-weight !default;\\n$custom-select-line-height:         $input-line-height !default;\\n$custom-select-color:               $input-color !default;\\n$custom-select-disabled-color:      $gray-600 !default;\\n$custom-select-bg:                  $input-bg !default;\\n$custom-select-disabled-bg:         $gray-200 !default;\\n$custom-select-bg-size:             8px 10px !default; // In pixels because image dimensions\\n$custom-select-indicator-color:     $gray-800 !default;\\n$custom-select-indicator:           str-replace(url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='#{$custom-select-indicator-color}' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\\\"), \\\"#\\\", \\\"%23\\\") !default;\\n$custom-select-background:          $custom-select-indicator no-repeat right $custom-select-padding-x center / $custom-select-bg-size !default; // Used so we can have multiple background elements (e.g., arrow and feedback icon)\\n\\n$custom-select-feedback-icon-padding-right: calc((1em + #{2 * $custom-select-padding-y}) * 3 / 4 + #{$custom-select-padding-x + $custom-select-indicator-padding}) !default;\\n$custom-select-feedback-icon-position:      center right ($custom-select-padding-x + $custom-select-indicator-padding) !default;\\n$custom-select-feedback-icon-size:          $input-height-inner-half $input-height-inner-half !default;\\n\\n$custom-select-border-width:        $input-border-width !default;\\n$custom-select-border-color:        $input-border-color !default;\\n$custom-select-border-radius:       $border-radius !default;\\n$custom-select-box-shadow:          inset 0 1px 2px rgba($black, .075) !default;\\n\\n$custom-select-focus-border-color:  $input-focus-border-color !default;\\n$custom-select-focus-width:         $input-focus-width !default;\\n$custom-select-focus-box-shadow:    0 0 0 $custom-select-focus-width $input-btn-focus-color !default;\\n\\n$custom-select-padding-y-sm:        $input-padding-y-sm !default;\\n$custom-select-padding-x-sm:        $input-padding-x-sm !default;\\n$custom-select-font-size-sm:        $input-font-size-sm !default;\\n$custom-select-height-sm:           $input-height-sm !default;\\n\\n$custom-select-padding-y-lg:        $input-padding-y-lg !default;\\n$custom-select-padding-x-lg:        $input-padding-x-lg !default;\\n$custom-select-font-size-lg:        $input-font-size-lg !default;\\n$custom-select-height-lg:           $input-height-lg !default;\\n\\n$custom-range-track-width:          100% !default;\\n$custom-range-track-height:         .5rem !default;\\n$custom-range-track-cursor:         pointer !default;\\n$custom-range-track-bg:             $gray-300 !default;\\n$custom-range-track-border-radius:  1rem !default;\\n$custom-range-track-box-shadow:     inset 0 .25rem .25rem rgba($black, .1) !default;\\n\\n$custom-range-thumb-width:                   1rem !default;\\n$custom-range-thumb-height:                  $custom-range-thumb-width !default;\\n$custom-range-thumb-bg:                      $component-active-bg !default;\\n$custom-range-thumb-border:                  0 !default;\\n$custom-range-thumb-border-radius:           1rem !default;\\n$custom-range-thumb-box-shadow:              0 .1rem .25rem rgba($black, .1) !default;\\n$custom-range-thumb-focus-box-shadow:        0 0 0 1px $body-bg, $input-focus-box-shadow !default;\\n$custom-range-thumb-focus-box-shadow-width:  $input-focus-width !default; // For focus box shadow issue in IE/Edge\\n$custom-range-thumb-active-bg:               lighten($component-active-bg, 35%) !default;\\n$custom-range-thumb-disabled-bg:             $gray-500 !default;\\n\\n$custom-file-height:                $input-height !default;\\n$custom-file-height-inner:          $input-height-inner !default;\\n$custom-file-focus-border-color:    $input-focus-border-color !default;\\n$custom-file-focus-box-shadow:      $input-focus-box-shadow !default;\\n$custom-file-disabled-bg:           $input-disabled-bg !default;\\n\\n$custom-file-padding-y:             $input-padding-y !default;\\n$custom-file-padding-x:             $input-padding-x !default;\\n$custom-file-line-height:           $input-line-height !default;\\n$custom-file-font-family:           $input-font-family !default;\\n$custom-file-font-weight:           $input-font-weight !default;\\n$custom-file-color:                 $input-color !default;\\n$custom-file-bg:                    $input-bg !default;\\n$custom-file-border-width:          $input-border-width !default;\\n$custom-file-border-color:          $input-border-color !default;\\n$custom-file-border-radius:         $input-border-radius !default;\\n$custom-file-box-shadow:            $input-box-shadow !default;\\n$custom-file-button-color:          $custom-file-color !default;\\n$custom-file-button-bg:             $input-group-addon-bg !default;\\n$custom-file-text: (\\n  en: \\\"Browse\\\"\\n) !default;\\n\\n\\n// Form validation\\n\\n$form-feedback-margin-top:          $form-text-margin-top !default;\\n$form-feedback-font-size:           $small-font-size !default;\\n$form-feedback-valid-color:         theme-color(\\\"success\\\") !default;\\n$form-feedback-invalid-color:       theme-color(\\\"danger\\\") !default;\\n\\n$form-feedback-icon-valid-color:    $form-feedback-valid-color !default;\\n$form-feedback-icon-valid:          str-replace(url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='#{$form-feedback-icon-valid-color}' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\\\"), \\\"#\\\", \\\"%23\\\") !default;\\n$form-feedback-icon-invalid-color:  $form-feedback-invalid-color !default;\\n$form-feedback-icon-invalid:        str-replace(url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$form-feedback-icon-invalid-color}' viewBox='-2 -2 7 7'%3e%3cpath stroke='#{$form-feedback-icon-invalid-color}' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\\\"), \\\"#\\\", \\\"%23\\\") !default;\\n\\n$form-validation-states: () !default;\\n// stylelint-disable-next-line scss/dollar-variable-default\\n$form-validation-states: map-merge(\\n  (\\n    \\\"valid\\\": (\\n      \\\"color\\\": $form-feedback-valid-color,\\n      \\\"icon\\\": $form-feedback-icon-valid\\n    ),\\n    \\\"invalid\\\": (\\n      \\\"color\\\": $form-feedback-invalid-color,\\n      \\\"icon\\\": $form-feedback-icon-invalid\\n    ),\\n  ),\\n  $form-validation-states\\n);\\n\\n// Z-index master list\\n//\\n// Warning: Avoid customizing these values. They're used for a bird's eye view\\n// of components dependent on the z-axis and are designed to all work together.\\n\\n$zindex-dropdown:                   1000 !default;\\n$zindex-sticky:                     1020 !default;\\n$zindex-fixed:                      1030 !default;\\n$zindex-modal-backdrop:             1040 !default;\\n$zindex-modal:                      1050 !default;\\n$zindex-popover:                    1060 !default;\\n$zindex-tooltip:                    1070 !default;\\n\\n\\n// Navs\\n\\n$nav-link-padding-y:                .5rem !default;\\n$nav-link-padding-x:                1rem !default;\\n$nav-link-disabled-color:           $gray-600 !default;\\n\\n$nav-tabs-border-color:             $gray-300 !default;\\n$nav-tabs-border-width:             $border-width !default;\\n$nav-tabs-border-radius:            $border-radius !default;\\n$nav-tabs-link-hover-border-color:  $gray-200 $gray-200 $nav-tabs-border-color !default;\\n$nav-tabs-link-active-color:        $gray-700 !default;\\n$nav-tabs-link-active-bg:           $body-bg !default;\\n$nav-tabs-link-active-border-color: $gray-300 $gray-300 $nav-tabs-link-active-bg !default;\\n\\n$nav-pills-border-radius:           $border-radius !default;\\n$nav-pills-link-active-color:       $component-active-color !default;\\n$nav-pills-link-active-bg:          $component-active-bg !default;\\n\\n$nav-divider-color:                 $gray-200 !default;\\n$nav-divider-margin-y:              $spacer / 2 !default;\\n\\n\\n// Navbar\\n\\n$navbar-padding-y:                  $spacer / 2 !default;\\n$navbar-padding-x:                  $spacer !default;\\n\\n$navbar-nav-link-padding-x:         .5rem !default;\\n\\n$navbar-brand-font-size:            $font-size-lg !default;\\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\\n$nav-link-height:                   $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\\n$navbar-brand-height:               $navbar-brand-font-size * $line-height-base !default;\\n$navbar-brand-padding-y:            ($nav-link-height - $navbar-brand-height) / 2 !default;\\n\\n$navbar-toggler-padding-y:          .25rem !default;\\n$navbar-toggler-padding-x:          .75rem !default;\\n$navbar-toggler-font-size:          $font-size-lg !default;\\n$navbar-toggler-border-radius:      $btn-border-radius !default;\\n\\n$navbar-dark-color:                 rgba($white, .5) !default;\\n$navbar-dark-hover-color:           rgba($white, .75) !default;\\n$navbar-dark-active-color:          $white !default;\\n$navbar-dark-disabled-color:        rgba($white, .25) !default;\\n$navbar-dark-toggler-icon-bg:       str-replace(url(\\\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='#{$navbar-dark-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\\\"), \\\"#\\\", \\\"%23\\\") !default;\\n$navbar-dark-toggler-border-color:  rgba($white, .1) !default;\\n\\n$navbar-light-color:                rgba($black, .5) !default;\\n$navbar-light-hover-color:          rgba($black, .7) !default;\\n$navbar-light-active-color:         rgba($black, .9) !default;\\n$navbar-light-disabled-color:       rgba($black, .3) !default;\\n$navbar-light-toggler-icon-bg:      str-replace(url(\\\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='#{$navbar-light-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\\\"), \\\"#\\\", \\\"%23\\\") !default;\\n$navbar-light-toggler-border-color: rgba($black, .1) !default;\\n\\n$navbar-light-brand-color:                $navbar-light-active-color !default;\\n$navbar-light-brand-hover-color:          $navbar-light-active-color !default;\\n$navbar-dark-brand-color:                 $navbar-dark-active-color !default;\\n$navbar-dark-brand-hover-color:           $navbar-dark-active-color !default;\\n\\n\\n// Dropdowns\\n//\\n// Dropdown menu container and contents.\\n\\n$dropdown-min-width:                10rem !default;\\n$dropdown-padding-y:                .5rem !default;\\n$dropdown-spacer:                   .125rem !default;\\n$dropdown-font-size:                $font-size-base !default;\\n$dropdown-color:                    $body-color !default;\\n$dropdown-bg:                       $white !default;\\n$dropdown-border-color:             rgba($black, .15) !default;\\n$dropdown-border-radius:            $border-radius !default;\\n$dropdown-border-width:             $border-width !default;\\n$dropdown-inner-border-radius:      calc(#{$dropdown-border-radius} - #{$dropdown-border-width}) !default;\\n$dropdown-divider-bg:               $gray-200 !default;\\n$dropdown-divider-margin-y:         $nav-divider-margin-y !default;\\n$dropdown-box-shadow:               0 .5rem 1rem rgba($black, .175) !default;\\n\\n$dropdown-link-color:               $gray-900 !default;\\n$dropdown-link-hover-color:         darken($gray-900, 5%) !default;\\n$dropdown-link-hover-bg:            $gray-100 !default;\\n\\n$dropdown-link-active-color:        $component-active-color !default;\\n$dropdown-link-active-bg:           $component-active-bg !default;\\n\\n$dropdown-link-disabled-color:      $gray-600 !default;\\n\\n$dropdown-item-padding-y:           .25rem !default;\\n$dropdown-item-padding-x:           1.5rem !default;\\n\\n$dropdown-header-color:             $gray-600 !default;\\n\\n\\n// Pagination\\n\\n$pagination-padding-y:              .5rem !default;\\n$pagination-padding-x:              .75rem !default;\\n$pagination-padding-y-sm:           .25rem !default;\\n$pagination-padding-x-sm:           .5rem !default;\\n$pagination-padding-y-lg:           .75rem !default;\\n$pagination-padding-x-lg:           1.5rem !default;\\n$pagination-line-height:            1.25 !default;\\n\\n$pagination-color:                  $link-color !default;\\n$pagination-bg:                     $white !default;\\n$pagination-border-width:           $border-width !default;\\n$pagination-border-color:           $gray-300 !default;\\n\\n$pagination-focus-box-shadow:       $input-btn-focus-box-shadow !default;\\n$pagination-focus-outline:          0 !default;\\n\\n$pagination-hover-color:            $link-hover-color !default;\\n$pagination-hover-bg:               $gray-200 !default;\\n$pagination-hover-border-color:     $gray-300 !default;\\n\\n$pagination-active-color:           $component-active-color !default;\\n$pagination-active-bg:              $component-active-bg !default;\\n$pagination-active-border-color:    $pagination-active-bg !default;\\n\\n$pagination-disabled-color:         $gray-600 !default;\\n$pagination-disabled-bg:            $white !default;\\n$pagination-disabled-border-color:  $gray-300 !default;\\n\\n\\n// Jumbotron\\n\\n$jumbotron-padding:                 2rem !default;\\n$jumbotron-color:                   null !default;\\n$jumbotron-bg:                      $gray-200 !default;\\n\\n\\n// Cards\\n\\n$card-spacer-y:                     .75rem !default;\\n$card-spacer-x:                     1.25rem !default;\\n$card-border-width:                 $border-width !default;\\n$card-border-radius:                $border-radius !default;\\n$card-border-color:                 rgba($black, .125) !default;\\n$card-inner-border-radius:          calc(#{$card-border-radius} - #{$card-border-width}) !default;\\n$card-cap-bg:                       rgba($black, .03) !default;\\n$card-cap-color:                    null !default;\\n$card-color:                        null !default;\\n$card-bg:                           $white !default;\\n\\n$card-img-overlay-padding:          1.25rem !default;\\n\\n$card-group-margin:                 $grid-gutter-width / 2 !default;\\n$card-deck-margin:                  $card-group-margin !default;\\n\\n$card-columns-count:                3 !default;\\n$card-columns-gap:                  1.25rem !default;\\n$card-columns-margin:               $card-spacer-y !default;\\n\\n\\n// Tooltips\\n\\n$tooltip-font-size:                 $font-size-sm !default;\\n$tooltip-max-width:                 200px !default;\\n$tooltip-color:                     $white !default;\\n$tooltip-bg:                        $black !default;\\n$tooltip-border-radius:             $border-radius !default;\\n$tooltip-opacity:                   .9 !default;\\n$tooltip-padding-y:                 .25rem !default;\\n$tooltip-padding-x:                 .5rem !default;\\n$tooltip-margin:                    0 !default;\\n\\n$tooltip-arrow-width:               .8rem !default;\\n$tooltip-arrow-height:              .4rem !default;\\n$tooltip-arrow-color:               $tooltip-bg !default;\\n\\n// Form tooltips must come after regular tooltips\\n$form-feedback-tooltip-padding-y:     $tooltip-padding-y !default;\\n$form-feedback-tooltip-padding-x:     $tooltip-padding-x !default;\\n$form-feedback-tooltip-font-size:     $tooltip-font-size !default;\\n$form-feedback-tooltip-line-height:   $line-height-base !default;\\n$form-feedback-tooltip-opacity:       $tooltip-opacity !default;\\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\\n\\n\\n// Popovers\\n\\n$popover-font-size:                 $font-size-sm !default;\\n$popover-bg:                        $white !default;\\n$popover-max-width:                 276px !default;\\n$popover-border-width:              $border-width !default;\\n$popover-border-color:              rgba($black, .2) !default;\\n$popover-border-radius:             $border-radius-lg !default;\\n$popover-box-shadow:                0 .25rem .5rem rgba($black, .2) !default;\\n\\n$popover-header-bg:                 darken($popover-bg, 3%) !default;\\n$popover-header-color:              $headings-color !default;\\n$popover-header-padding-y:          .5rem !default;\\n$popover-header-padding-x:          .75rem !default;\\n\\n$popover-body-color:                $body-color !default;\\n$popover-body-padding-y:            $popover-header-padding-y !default;\\n$popover-body-padding-x:            $popover-header-padding-x !default;\\n\\n$popover-arrow-width:               1rem !default;\\n$popover-arrow-height:              .5rem !default;\\n$popover-arrow-color:               $popover-bg !default;\\n\\n$popover-arrow-outer-color:         fade-in($popover-border-color, .05) !default;\\n\\n\\n// Toasts\\n\\n$toast-max-width:                   350px !default;\\n$toast-padding-x:                   .75rem !default;\\n$toast-padding-y:                   .25rem !default;\\n$toast-font-size:                   .875rem !default;\\n$toast-color:                       null !default;\\n$toast-background-color:            rgba($white, .85) !default;\\n$toast-border-width:                1px !default;\\n$toast-border-color:                rgba(0, 0, 0, .1) !default;\\n$toast-border-radius:               .25rem !default;\\n$toast-box-shadow:                  0 .25rem .75rem rgba($black, .1) !default;\\n\\n$toast-header-color:                $gray-600 !default;\\n$toast-header-background-color:     rgba($white, .85) !default;\\n$toast-header-border-color:         rgba(0, 0, 0, .05) !default;\\n\\n\\n// Badges\\n\\n$badge-font-size:                   75% !default;\\n$badge-font-weight:                 $font-weight-bold !default;\\n$badge-padding-y:                   .25em !default;\\n$badge-padding-x:                   .4em !default;\\n$badge-border-radius:               $border-radius !default;\\n\\n$badge-transition:                  $btn-transition !default;\\n$badge-focus-width:                 $input-btn-focus-width !default;\\n\\n$badge-pill-padding-x:              .6em !default;\\n// Use a higher than normal value to ensure completely rounded edges when\\n// customizing padding or font-size on labels.\\n$badge-pill-border-radius:          10rem !default;\\n\\n\\n// Modals\\n\\n// Padding applied to the modal body\\n$modal-inner-padding:               1rem !default;\\n\\n$modal-dialog-margin:               .5rem !default;\\n$modal-dialog-margin-y-sm-up:       1.75rem !default;\\n\\n$modal-title-line-height:           $line-height-base !default;\\n\\n$modal-content-color:               null !default;\\n$modal-content-bg:                  $white !default;\\n$modal-content-border-color:        rgba($black, .2) !default;\\n$modal-content-border-width:        $border-width !default;\\n$modal-content-border-radius:       $border-radius-lg !default;\\n$modal-content-box-shadow-xs:       0 .25rem .5rem rgba($black, .5) !default;\\n$modal-content-box-shadow-sm-up:    0 .5rem 1rem rgba($black, .5) !default;\\n\\n$modal-backdrop-bg:                 $black !default;\\n$modal-backdrop-opacity:            .5 !default;\\n$modal-header-border-color:         $border-color !default;\\n$modal-footer-border-color:         $modal-header-border-color !default;\\n$modal-header-border-width:         $modal-content-border-width !default;\\n$modal-footer-border-width:         $modal-header-border-width !default;\\n$modal-header-padding-y:            1rem !default;\\n$modal-header-padding-x:            1rem !default;\\n$modal-header-padding:              $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\\n\\n$modal-xl:                          1140px !default;\\n$modal-lg:                          800px !default;\\n$modal-md:                          500px !default;\\n$modal-sm:                          300px !default;\\n\\n$modal-fade-transform:              translate(0, -50px) !default;\\n$modal-show-transform:              none !default;\\n$modal-transition:                  transform .3s ease-out !default;\\n\\n\\n// Alerts\\n//\\n// Define alert colors, border radius, and padding.\\n\\n$alert-padding-y:                   .75rem !default;\\n$alert-padding-x:                   1.25rem !default;\\n$alert-margin-bottom:               1rem !default;\\n$alert-border-radius:               $border-radius !default;\\n$alert-link-font-weight:            $font-weight-bold !default;\\n$alert-border-width:                $border-width !default;\\n\\n$alert-bg-level:                    -10 !default;\\n$alert-border-level:                -9 !default;\\n$alert-color-level:                 6 !default;\\n\\n\\n// Progress bars\\n\\n$progress-height:                   1rem !default;\\n$progress-font-size:                $font-size-base * .75 !default;\\n$progress-bg:                       $gray-200 !default;\\n$progress-border-radius:            $border-radius !default;\\n$progress-box-shadow:               inset 0 .1rem .1rem rgba($black, .1) !default;\\n$progress-bar-color:                $white !default;\\n$progress-bar-bg:                   theme-color(\\\"primary\\\") !default;\\n$progress-bar-animation-timing:     1s linear infinite !default;\\n$progress-bar-transition:           width .6s ease !default;\\n\\n\\n// List group\\n\\n$list-group-color:                  null !default;\\n$list-group-bg:                     $white !default;\\n$list-group-border-color:           rgba($black, .125) !default;\\n$list-group-border-width:           $border-width !default;\\n$list-group-border-radius:          $border-radius !default;\\n\\n$list-group-item-padding-y:         .75rem !default;\\n$list-group-item-padding-x:         1.25rem !default;\\n\\n$list-group-hover-bg:               $gray-100 !default;\\n$list-group-active-color:           $component-active-color !default;\\n$list-group-active-bg:              $component-active-bg !default;\\n$list-group-active-border-color:    $list-group-active-bg !default;\\n\\n$list-group-disabled-color:         $gray-600 !default;\\n$list-group-disabled-bg:            $list-group-bg !default;\\n\\n$list-group-action-color:           $gray-700 !default;\\n$list-group-action-hover-color:     $list-group-action-color !default;\\n\\n$list-group-action-active-color:    $body-color !default;\\n$list-group-action-active-bg:       $gray-200 !default;\\n\\n\\n// Image thumbnails\\n\\n$thumbnail-padding:                 .25rem !default;\\n$thumbnail-bg:                      $body-bg !default;\\n$thumbnail-border-width:            $border-width !default;\\n$thumbnail-border-color:            $gray-300 !default;\\n$thumbnail-border-radius:           $border-radius !default;\\n$thumbnail-box-shadow:              0 1px 2px rgba($black, .075) !default;\\n\\n\\n// Figures\\n\\n$figure-caption-font-size:          90% !default;\\n$figure-caption-color:              $gray-600 !default;\\n\\n\\n// Breadcrumbs\\n\\n$breadcrumb-padding-y:              .75rem !default;\\n$breadcrumb-padding-x:              1rem !default;\\n$breadcrumb-item-padding:           .5rem !default;\\n\\n$breadcrumb-margin-bottom:          1rem !default;\\n\\n$breadcrumb-bg:                     $gray-200 !default;\\n$breadcrumb-divider-color:          $gray-600 !default;\\n$breadcrumb-active-color:           $gray-600 !default;\\n$breadcrumb-divider:                quote(\\\"/\\\") !default;\\n\\n$breadcrumb-border-radius:          $border-radius !default;\\n\\n\\n// Carousel\\n\\n$carousel-control-color:             $white !default;\\n$carousel-control-width:             15% !default;\\n$carousel-control-opacity:           .5 !default;\\n$carousel-control-hover-opacity:     .9 !default;\\n$carousel-control-transition:        opacity .15s ease !default;\\n\\n$carousel-indicator-width:           30px !default;\\n$carousel-indicator-height:          3px !default;\\n$carousel-indicator-hit-area-height: 10px !default;\\n$carousel-indicator-spacer:          3px !default;\\n$carousel-indicator-active-bg:       $white !default;\\n$carousel-indicator-transition:      opacity .6s ease !default;\\n\\n$carousel-caption-width:             70% !default;\\n$carousel-caption-color:             $white !default;\\n\\n$carousel-control-icon-width:        20px !default;\\n\\n$carousel-control-prev-icon-bg:      str-replace(url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\\\"), \\\"#\\\", \\\"%23\\\") !default;\\n$carousel-control-next-icon-bg:      str-replace(url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\\\"), \\\"#\\\", \\\"%23\\\") !default;\\n\\n$carousel-transition-duration:       .6s !default;\\n$carousel-transition:                transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\\n\\n\\n// Spinners\\n\\n$spinner-width:         2rem !default;\\n$spinner-height:        $spinner-width !default;\\n$spinner-border-width:  .25em !default;\\n\\n$spinner-width-sm:        1rem !default;\\n$spinner-height-sm:       $spinner-width-sm !default;\\n$spinner-border-width-sm: .2em !default;\\n\\n\\n// Close\\n\\n$close-font-size:                   $font-size-base * 1.5 !default;\\n$close-font-weight:                 $font-weight-bold !default;\\n$close-color:                       $black !default;\\n$close-text-shadow:                 0 1px 0 $white !default;\\n\\n\\n// Code\\n\\n$code-font-size:                    87.5% !default;\\n$code-color:                        $pink !default;\\n\\n$kbd-padding-y:                     .2rem !default;\\n$kbd-padding-x:                     .4rem !default;\\n$kbd-font-size:                     $code-font-size !default;\\n$kbd-color:                         $white !default;\\n$kbd-bg:                            $gray-900 !default;\\n\\n$pre-color:                         $gray-900 !default;\\n$pre-scrollable-max-height:         340px !default;\\n\\n\\n// Utilities\\n\\n$displays: none, inline, inline-block, block, table, table-row, table-cell, flex, inline-flex !default;\\n$overflows: auto, hidden !default;\\n$positions: static, relative, absolute, fixed, sticky !default;\\n\\n\\n// Printing\\n\\n$print-page-size:                   a3 !default;\\n$print-body-min-width:              map-get($grid-breakpoints, \\\"lg\\\") !default;\\n\",\"// Framework grid generation\\n//\\n// Used only by Bootstrap to generate the correct number of grid classes given\\n// any value of `$grid-columns`.\\n\\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\\n  // Common properties for all breakpoints\\n  %grid-column {\\n    position: relative;\\n    width: 100%;\\n    padding-right: $gutter / 2;\\n    padding-left: $gutter / 2;\\n  }\\n\\n  @each $breakpoint in map-keys($breakpoints) {\\n    $infix: breakpoint-infix($breakpoint, $breakpoints);\\n\\n    // Allow columns to stretch full width below their breakpoints\\n    @for $i from 1 through $columns {\\n      .col#{$infix}-#{$i} {\\n        @extend %grid-column;\\n      }\\n    }\\n    .col#{$infix},\\n    .col#{$infix}-auto {\\n      @extend %grid-column;\\n    }\\n\\n    @include media-breakpoint-up($breakpoint, $breakpoints) {\\n      // Provide basic `.col-{bp}` classes for equal-width flexbox columns\\n      .col#{$infix} {\\n        flex-basis: 0;\\n        flex-grow: 1;\\n        max-width: 100%;\\n      }\\n      .col#{$infix}-auto {\\n        flex: 0 0 auto;\\n        width: auto;\\n        max-width: 100%; // Reset earlier grid tiers\\n      }\\n\\n      @for $i from 1 through $columns {\\n        .col#{$infix}-#{$i} {\\n          @include make-col($i, $columns);\\n        }\\n      }\\n\\n      .order#{$infix}-first { order: -1; }\\n\\n      .order#{$infix}-last { order: $columns + 1; }\\n\\n      @for $i from 0 through $columns {\\n        .order#{$infix}-#{$i} { order: $i; }\\n      }\\n\\n      // `$columns - 1` because offsetting by the width of an entire row isn't possible\\n      @for $i from 0 through ($columns - 1) {\\n        @if not ($infix == \\\"\\\" and $i == 0) { // Avoid emitting useless .offset-0\\n          .offset#{$infix}-#{$i} {\\n            @include make-col-offset($i, $columns);\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\n\",\"// stylelint-disable declaration-no-important\\n\\n//\\n// Utilities for common `display` values\\n//\\n\\n@each $breakpoint in map-keys($grid-breakpoints) {\\n  @include media-breakpoint-up($breakpoint) {\\n    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\\n\\n    @each $value in $displays {\\n      .d#{$infix}-#{$value} { display: $value !important; }\\n    }\\n  }\\n}\\n\\n\\n//\\n// Utilities for toggling `display` in print\\n//\\n\\n@media print {\\n  @each $value in $displays {\\n    .d-print-#{$value} { display: $value !important; }\\n  }\\n}\\n\",\"// stylelint-disable declaration-no-important\\n\\n// Flex variation\\n//\\n// Custom styles for additional flex alignment options.\\n\\n@each $breakpoint in map-keys($grid-breakpoints) {\\n  @include media-breakpoint-up($breakpoint) {\\n    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\\n\\n    .flex#{$infix}-row            { flex-direction: row !important; }\\n    .flex#{$infix}-column         { flex-direction: column !important; }\\n    .flex#{$infix}-row-reverse    { flex-direction: row-reverse !important; }\\n    .flex#{$infix}-column-reverse { flex-direction: column-reverse !important; }\\n\\n    .flex#{$infix}-wrap         { flex-wrap: wrap !important; }\\n    .flex#{$infix}-nowrap       { flex-wrap: nowrap !important; }\\n    .flex#{$infix}-wrap-reverse { flex-wrap: wrap-reverse !important; }\\n    .flex#{$infix}-fill         { flex: 1 1 auto !important; }\\n    .flex#{$infix}-grow-0       { flex-grow: 0 !important; }\\n    .flex#{$infix}-grow-1       { flex-grow: 1 !important; }\\n    .flex#{$infix}-shrink-0     { flex-shrink: 0 !important; }\\n    .flex#{$infix}-shrink-1     { flex-shrink: 1 !important; }\\n\\n    .justify-content#{$infix}-start   { justify-content: flex-start !important; }\\n    .justify-content#{$infix}-end     { justify-content: flex-end !important; }\\n    .justify-content#{$infix}-center  { justify-content: center !important; }\\n    .justify-content#{$infix}-between { justify-content: space-between !important; }\\n    .justify-content#{$infix}-around  { justify-content: space-around !important; }\\n\\n    .align-items#{$infix}-start    { align-items: flex-start !important; }\\n    .align-items#{$infix}-end      { align-items: flex-end !important; }\\n    .align-items#{$infix}-center   { align-items: center !important; }\\n    .align-items#{$infix}-baseline { align-items: baseline !important; }\\n    .align-items#{$infix}-stretch  { align-items: stretch !important; }\\n\\n    .align-content#{$infix}-start   { align-content: flex-start !important; }\\n    .align-content#{$infix}-end     { align-content: flex-end !important; }\\n    .align-content#{$infix}-center  { align-content: center !important; }\\n    .align-content#{$infix}-between { align-content: space-between !important; }\\n    .align-content#{$infix}-around  { align-content: space-around !important; }\\n    .align-content#{$infix}-stretch { align-content: stretch !important; }\\n\\n    .align-self#{$infix}-auto     { align-self: auto !important; }\\n    .align-self#{$infix}-start    { align-self: flex-start !important; }\\n    .align-self#{$infix}-end      { align-self: flex-end !important; }\\n    .align-self#{$infix}-center   { align-self: center !important; }\\n    .align-self#{$infix}-baseline { align-self: baseline !important; }\\n    .align-self#{$infix}-stretch  { align-self: stretch !important; }\\n  }\\n}\\n\",\"// stylelint-disable declaration-no-important\\n\\n// Margin and Padding\\n\\n@each $breakpoint in map-keys($grid-breakpoints) {\\n  @include media-breakpoint-up($breakpoint) {\\n    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\\n\\n    @each $prop, $abbrev in (margin: m, padding: p) {\\n      @each $size, $length in $spacers {\\n        .#{$abbrev}#{$infix}-#{$size} { #{$prop}: $length !important; }\\n        .#{$abbrev}t#{$infix}-#{$size},\\n        .#{$abbrev}y#{$infix}-#{$size} {\\n          #{$prop}-top: $length !important;\\n        }\\n        .#{$abbrev}r#{$infix}-#{$size},\\n        .#{$abbrev}x#{$infix}-#{$size} {\\n          #{$prop}-right: $length !important;\\n        }\\n        .#{$abbrev}b#{$infix}-#{$size},\\n        .#{$abbrev}y#{$infix}-#{$size} {\\n          #{$prop}-bottom: $length !important;\\n        }\\n        .#{$abbrev}l#{$infix}-#{$size},\\n        .#{$abbrev}x#{$infix}-#{$size} {\\n          #{$prop}-left: $length !important;\\n        }\\n      }\\n    }\\n\\n    // Negative margins (e.g., where `.mb-n1` is negative version of `.mb-1`)\\n    @each $size, $length in $spacers {\\n      @if $size != 0 {\\n        .m#{$infix}-n#{$size} { margin: -$length !important; }\\n        .mt#{$infix}-n#{$size},\\n        .my#{$infix}-n#{$size} {\\n          margin-top: -$length !important;\\n        }\\n        .mr#{$infix}-n#{$size},\\n        .mx#{$infix}-n#{$size} {\\n          margin-right: -$length !important;\\n        }\\n        .mb#{$infix}-n#{$size},\\n        .my#{$infix}-n#{$size} {\\n          margin-bottom: -$length !important;\\n        }\\n        .ml#{$infix}-n#{$size},\\n        .mx#{$infix}-n#{$size} {\\n          margin-left: -$length !important;\\n        }\\n      }\\n    }\\n\\n    // Some special margin utils\\n    .m#{$infix}-auto { margin: auto !important; }\\n    .mt#{$infix}-auto,\\n    .my#{$infix}-auto {\\n      margin-top: auto !important;\\n    }\\n    .mr#{$infix}-auto,\\n    .mx#{$infix}-auto {\\n      margin-right: auto !important;\\n    }\\n    .mb#{$infix}-auto,\\n    .my#{$infix}-auto {\\n      margin-bottom: auto !important;\\n    }\\n    .ml#{$infix}-auto,\\n    .mx#{$infix}-auto {\\n      margin-left: auto !important;\\n    }\\n  }\\n}\\n\"]}"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bootstrap4/css/bootstrap-grid.min.css",
    "content": "/*!\n * Bootstrap Grid v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */html{box-sizing:border-box;-ms-overflow-style:scrollbar}*,::after,::before{box-sizing:inherit}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}\n/*# sourceMappingURL=bootstrap-grid.min.css.map */"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bootstrap4/css/bootstrap-grid.min.css.map",
    "content": "{\"version\":3,\"sources\":[\"../../scss/bootstrap-grid.scss\",\"dist/css/bootstrap-grid.css\",\"../../scss/_grid.scss\",\"../../scss/mixins/_grid.scss\",\"../../scss/mixins/_breakpoints.scss\",\"../../scss/mixins/_grid-framework.scss\",\"../../scss/utilities/_display.scss\",\"../../scss/utilities/_flex.scss\",\"../../scss/utilities/_spacing.scss\"],\"names\":[],\"mappings\":\"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\",\"sourcesContent\":[\"/*!\\n * Bootstrap Grid v4.3.1 (https://getbootstrap.com/)\\n * Copyright 2011-2019 The Bootstrap Authors\\n * Copyright 2011-2019 Twitter, Inc.\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n */\\n\\nhtml {\\n  box-sizing: border-box;\\n  -ms-overflow-style: scrollbar;\\n}\\n\\n*,\\n*::before,\\n*::after {\\n  box-sizing: inherit;\\n}\\n\\n@import \\\"functions\\\";\\n@import \\\"variables\\\";\\n\\n@import \\\"mixins/breakpoints\\\";\\n@import \\\"mixins/grid-framework\\\";\\n@import \\\"mixins/grid\\\";\\n\\n@import \\\"grid\\\";\\n@import \\\"utilities/display\\\";\\n@import \\\"utilities/flex\\\";\\n@import \\\"utilities/spacing\\\";\\n\",\"/*!\\n * Bootstrap Grid v4.3.1 (https://getbootstrap.com/)\\n * Copyright 2011-2019 The Bootstrap Authors\\n * Copyright 2011-2019 Twitter, Inc.\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n */\\nhtml {\\n  box-sizing: border-box;\\n  -ms-overflow-style: scrollbar;\\n}\\n\\n*,\\n*::before,\\n*::after {\\n  box-sizing: inherit;\\n}\\n\\n.container {\\n  width: 100%;\\n  padding-right: 15px;\\n  padding-left: 15px;\\n  margin-right: auto;\\n  margin-left: auto;\\n}\\n\\n@media (min-width: 576px) {\\n  .container {\\n    max-width: 540px;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .container {\\n    max-width: 720px;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .container {\\n    max-width: 960px;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .container {\\n    max-width: 1140px;\\n  }\\n}\\n\\n.container-fluid {\\n  width: 100%;\\n  padding-right: 15px;\\n  padding-left: 15px;\\n  margin-right: auto;\\n  margin-left: auto;\\n}\\n\\n.row {\\n  display: -ms-flexbox;\\n  display: flex;\\n  -ms-flex-wrap: wrap;\\n  flex-wrap: wrap;\\n  margin-right: -15px;\\n  margin-left: -15px;\\n}\\n\\n.no-gutters {\\n  margin-right: 0;\\n  margin-left: 0;\\n}\\n\\n.no-gutters > .col,\\n.no-gutters > [class*=\\\"col-\\\"] {\\n  padding-right: 0;\\n  padding-left: 0;\\n}\\n\\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\\n.col-xl-auto {\\n  position: relative;\\n  width: 100%;\\n  padding-right: 15px;\\n  padding-left: 15px;\\n}\\n\\n.col {\\n  -ms-flex-preferred-size: 0;\\n  flex-basis: 0;\\n  -ms-flex-positive: 1;\\n  flex-grow: 1;\\n  max-width: 100%;\\n}\\n\\n.col-auto {\\n  -ms-flex: 0 0 auto;\\n  flex: 0 0 auto;\\n  width: auto;\\n  max-width: 100%;\\n}\\n\\n.col-1 {\\n  -ms-flex: 0 0 8.333333%;\\n  flex: 0 0 8.333333%;\\n  max-width: 8.333333%;\\n}\\n\\n.col-2 {\\n  -ms-flex: 0 0 16.666667%;\\n  flex: 0 0 16.666667%;\\n  max-width: 16.666667%;\\n}\\n\\n.col-3 {\\n  -ms-flex: 0 0 25%;\\n  flex: 0 0 25%;\\n  max-width: 25%;\\n}\\n\\n.col-4 {\\n  -ms-flex: 0 0 33.333333%;\\n  flex: 0 0 33.333333%;\\n  max-width: 33.333333%;\\n}\\n\\n.col-5 {\\n  -ms-flex: 0 0 41.666667%;\\n  flex: 0 0 41.666667%;\\n  max-width: 41.666667%;\\n}\\n\\n.col-6 {\\n  -ms-flex: 0 0 50%;\\n  flex: 0 0 50%;\\n  max-width: 50%;\\n}\\n\\n.col-7 {\\n  -ms-flex: 0 0 58.333333%;\\n  flex: 0 0 58.333333%;\\n  max-width: 58.333333%;\\n}\\n\\n.col-8 {\\n  -ms-flex: 0 0 66.666667%;\\n  flex: 0 0 66.666667%;\\n  max-width: 66.666667%;\\n}\\n\\n.col-9 {\\n  -ms-flex: 0 0 75%;\\n  flex: 0 0 75%;\\n  max-width: 75%;\\n}\\n\\n.col-10 {\\n  -ms-flex: 0 0 83.333333%;\\n  flex: 0 0 83.333333%;\\n  max-width: 83.333333%;\\n}\\n\\n.col-11 {\\n  -ms-flex: 0 0 91.666667%;\\n  flex: 0 0 91.666667%;\\n  max-width: 91.666667%;\\n}\\n\\n.col-12 {\\n  -ms-flex: 0 0 100%;\\n  flex: 0 0 100%;\\n  max-width: 100%;\\n}\\n\\n.order-first {\\n  -ms-flex-order: -1;\\n  order: -1;\\n}\\n\\n.order-last {\\n  -ms-flex-order: 13;\\n  order: 13;\\n}\\n\\n.order-0 {\\n  -ms-flex-order: 0;\\n  order: 0;\\n}\\n\\n.order-1 {\\n  -ms-flex-order: 1;\\n  order: 1;\\n}\\n\\n.order-2 {\\n  -ms-flex-order: 2;\\n  order: 2;\\n}\\n\\n.order-3 {\\n  -ms-flex-order: 3;\\n  order: 3;\\n}\\n\\n.order-4 {\\n  -ms-flex-order: 4;\\n  order: 4;\\n}\\n\\n.order-5 {\\n  -ms-flex-order: 5;\\n  order: 5;\\n}\\n\\n.order-6 {\\n  -ms-flex-order: 6;\\n  order: 6;\\n}\\n\\n.order-7 {\\n  -ms-flex-order: 7;\\n  order: 7;\\n}\\n\\n.order-8 {\\n  -ms-flex-order: 8;\\n  order: 8;\\n}\\n\\n.order-9 {\\n  -ms-flex-order: 9;\\n  order: 9;\\n}\\n\\n.order-10 {\\n  -ms-flex-order: 10;\\n  order: 10;\\n}\\n\\n.order-11 {\\n  -ms-flex-order: 11;\\n  order: 11;\\n}\\n\\n.order-12 {\\n  -ms-flex-order: 12;\\n  order: 12;\\n}\\n\\n.offset-1 {\\n  margin-left: 8.333333%;\\n}\\n\\n.offset-2 {\\n  margin-left: 16.666667%;\\n}\\n\\n.offset-3 {\\n  margin-left: 25%;\\n}\\n\\n.offset-4 {\\n  margin-left: 33.333333%;\\n}\\n\\n.offset-5 {\\n  margin-left: 41.666667%;\\n}\\n\\n.offset-6 {\\n  margin-left: 50%;\\n}\\n\\n.offset-7 {\\n  margin-left: 58.333333%;\\n}\\n\\n.offset-8 {\\n  margin-left: 66.666667%;\\n}\\n\\n.offset-9 {\\n  margin-left: 75%;\\n}\\n\\n.offset-10 {\\n  margin-left: 83.333333%;\\n}\\n\\n.offset-11 {\\n  margin-left: 91.666667%;\\n}\\n\\n@media (min-width: 576px) {\\n  .col-sm {\\n    -ms-flex-preferred-size: 0;\\n    flex-basis: 0;\\n    -ms-flex-positive: 1;\\n    flex-grow: 1;\\n    max-width: 100%;\\n  }\\n  .col-sm-auto {\\n    -ms-flex: 0 0 auto;\\n    flex: 0 0 auto;\\n    width: auto;\\n    max-width: 100%;\\n  }\\n  .col-sm-1 {\\n    -ms-flex: 0 0 8.333333%;\\n    flex: 0 0 8.333333%;\\n    max-width: 8.333333%;\\n  }\\n  .col-sm-2 {\\n    -ms-flex: 0 0 16.666667%;\\n    flex: 0 0 16.666667%;\\n    max-width: 16.666667%;\\n  }\\n  .col-sm-3 {\\n    -ms-flex: 0 0 25%;\\n    flex: 0 0 25%;\\n    max-width: 25%;\\n  }\\n  .col-sm-4 {\\n    -ms-flex: 0 0 33.333333%;\\n    flex: 0 0 33.333333%;\\n    max-width: 33.333333%;\\n  }\\n  .col-sm-5 {\\n    -ms-flex: 0 0 41.666667%;\\n    flex: 0 0 41.666667%;\\n    max-width: 41.666667%;\\n  }\\n  .col-sm-6 {\\n    -ms-flex: 0 0 50%;\\n    flex: 0 0 50%;\\n    max-width: 50%;\\n  }\\n  .col-sm-7 {\\n    -ms-flex: 0 0 58.333333%;\\n    flex: 0 0 58.333333%;\\n    max-width: 58.333333%;\\n  }\\n  .col-sm-8 {\\n    -ms-flex: 0 0 66.666667%;\\n    flex: 0 0 66.666667%;\\n    max-width: 66.666667%;\\n  }\\n  .col-sm-9 {\\n    -ms-flex: 0 0 75%;\\n    flex: 0 0 75%;\\n    max-width: 75%;\\n  }\\n  .col-sm-10 {\\n    -ms-flex: 0 0 83.333333%;\\n    flex: 0 0 83.333333%;\\n    max-width: 83.333333%;\\n  }\\n  .col-sm-11 {\\n    -ms-flex: 0 0 91.666667%;\\n    flex: 0 0 91.666667%;\\n    max-width: 91.666667%;\\n  }\\n  .col-sm-12 {\\n    -ms-flex: 0 0 100%;\\n    flex: 0 0 100%;\\n    max-width: 100%;\\n  }\\n  .order-sm-first {\\n    -ms-flex-order: -1;\\n    order: -1;\\n  }\\n  .order-sm-last {\\n    -ms-flex-order: 13;\\n    order: 13;\\n  }\\n  .order-sm-0 {\\n    -ms-flex-order: 0;\\n    order: 0;\\n  }\\n  .order-sm-1 {\\n    -ms-flex-order: 1;\\n    order: 1;\\n  }\\n  .order-sm-2 {\\n    -ms-flex-order: 2;\\n    order: 2;\\n  }\\n  .order-sm-3 {\\n    -ms-flex-order: 3;\\n    order: 3;\\n  }\\n  .order-sm-4 {\\n    -ms-flex-order: 4;\\n    order: 4;\\n  }\\n  .order-sm-5 {\\n    -ms-flex-order: 5;\\n    order: 5;\\n  }\\n  .order-sm-6 {\\n    -ms-flex-order: 6;\\n    order: 6;\\n  }\\n  .order-sm-7 {\\n    -ms-flex-order: 7;\\n    order: 7;\\n  }\\n  .order-sm-8 {\\n    -ms-flex-order: 8;\\n    order: 8;\\n  }\\n  .order-sm-9 {\\n    -ms-flex-order: 9;\\n    order: 9;\\n  }\\n  .order-sm-10 {\\n    -ms-flex-order: 10;\\n    order: 10;\\n  }\\n  .order-sm-11 {\\n    -ms-flex-order: 11;\\n    order: 11;\\n  }\\n  .order-sm-12 {\\n    -ms-flex-order: 12;\\n    order: 12;\\n  }\\n  .offset-sm-0 {\\n    margin-left: 0;\\n  }\\n  .offset-sm-1 {\\n    margin-left: 8.333333%;\\n  }\\n  .offset-sm-2 {\\n    margin-left: 16.666667%;\\n  }\\n  .offset-sm-3 {\\n    margin-left: 25%;\\n  }\\n  .offset-sm-4 {\\n    margin-left: 33.333333%;\\n  }\\n  .offset-sm-5 {\\n    margin-left: 41.666667%;\\n  }\\n  .offset-sm-6 {\\n    margin-left: 50%;\\n  }\\n  .offset-sm-7 {\\n    margin-left: 58.333333%;\\n  }\\n  .offset-sm-8 {\\n    margin-left: 66.666667%;\\n  }\\n  .offset-sm-9 {\\n    margin-left: 75%;\\n  }\\n  .offset-sm-10 {\\n    margin-left: 83.333333%;\\n  }\\n  .offset-sm-11 {\\n    margin-left: 91.666667%;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .col-md {\\n    -ms-flex-preferred-size: 0;\\n    flex-basis: 0;\\n    -ms-flex-positive: 1;\\n    flex-grow: 1;\\n    max-width: 100%;\\n  }\\n  .col-md-auto {\\n    -ms-flex: 0 0 auto;\\n    flex: 0 0 auto;\\n    width: auto;\\n    max-width: 100%;\\n  }\\n  .col-md-1 {\\n    -ms-flex: 0 0 8.333333%;\\n    flex: 0 0 8.333333%;\\n    max-width: 8.333333%;\\n  }\\n  .col-md-2 {\\n    -ms-flex: 0 0 16.666667%;\\n    flex: 0 0 16.666667%;\\n    max-width: 16.666667%;\\n  }\\n  .col-md-3 {\\n    -ms-flex: 0 0 25%;\\n    flex: 0 0 25%;\\n    max-width: 25%;\\n  }\\n  .col-md-4 {\\n    -ms-flex: 0 0 33.333333%;\\n    flex: 0 0 33.333333%;\\n    max-width: 33.333333%;\\n  }\\n  .col-md-5 {\\n    -ms-flex: 0 0 41.666667%;\\n    flex: 0 0 41.666667%;\\n    max-width: 41.666667%;\\n  }\\n  .col-md-6 {\\n    -ms-flex: 0 0 50%;\\n    flex: 0 0 50%;\\n    max-width: 50%;\\n  }\\n  .col-md-7 {\\n    -ms-flex: 0 0 58.333333%;\\n    flex: 0 0 58.333333%;\\n    max-width: 58.333333%;\\n  }\\n  .col-md-8 {\\n    -ms-flex: 0 0 66.666667%;\\n    flex: 0 0 66.666667%;\\n    max-width: 66.666667%;\\n  }\\n  .col-md-9 {\\n    -ms-flex: 0 0 75%;\\n    flex: 0 0 75%;\\n    max-width: 75%;\\n  }\\n  .col-md-10 {\\n    -ms-flex: 0 0 83.333333%;\\n    flex: 0 0 83.333333%;\\n    max-width: 83.333333%;\\n  }\\n  .col-md-11 {\\n    -ms-flex: 0 0 91.666667%;\\n    flex: 0 0 91.666667%;\\n    max-width: 91.666667%;\\n  }\\n  .col-md-12 {\\n    -ms-flex: 0 0 100%;\\n    flex: 0 0 100%;\\n    max-width: 100%;\\n  }\\n  .order-md-first {\\n    -ms-flex-order: -1;\\n    order: -1;\\n  }\\n  .order-md-last {\\n    -ms-flex-order: 13;\\n    order: 13;\\n  }\\n  .order-md-0 {\\n    -ms-flex-order: 0;\\n    order: 0;\\n  }\\n  .order-md-1 {\\n    -ms-flex-order: 1;\\n    order: 1;\\n  }\\n  .order-md-2 {\\n    -ms-flex-order: 2;\\n    order: 2;\\n  }\\n  .order-md-3 {\\n    -ms-flex-order: 3;\\n    order: 3;\\n  }\\n  .order-md-4 {\\n    -ms-flex-order: 4;\\n    order: 4;\\n  }\\n  .order-md-5 {\\n    -ms-flex-order: 5;\\n    order: 5;\\n  }\\n  .order-md-6 {\\n    -ms-flex-order: 6;\\n    order: 6;\\n  }\\n  .order-md-7 {\\n    -ms-flex-order: 7;\\n    order: 7;\\n  }\\n  .order-md-8 {\\n    -ms-flex-order: 8;\\n    order: 8;\\n  }\\n  .order-md-9 {\\n    -ms-flex-order: 9;\\n    order: 9;\\n  }\\n  .order-md-10 {\\n    -ms-flex-order: 10;\\n    order: 10;\\n  }\\n  .order-md-11 {\\n    -ms-flex-order: 11;\\n    order: 11;\\n  }\\n  .order-md-12 {\\n    -ms-flex-order: 12;\\n    order: 12;\\n  }\\n  .offset-md-0 {\\n    margin-left: 0;\\n  }\\n  .offset-md-1 {\\n    margin-left: 8.333333%;\\n  }\\n  .offset-md-2 {\\n    margin-left: 16.666667%;\\n  }\\n  .offset-md-3 {\\n    margin-left: 25%;\\n  }\\n  .offset-md-4 {\\n    margin-left: 33.333333%;\\n  }\\n  .offset-md-5 {\\n    margin-left: 41.666667%;\\n  }\\n  .offset-md-6 {\\n    margin-left: 50%;\\n  }\\n  .offset-md-7 {\\n    margin-left: 58.333333%;\\n  }\\n  .offset-md-8 {\\n    margin-left: 66.666667%;\\n  }\\n  .offset-md-9 {\\n    margin-left: 75%;\\n  }\\n  .offset-md-10 {\\n    margin-left: 83.333333%;\\n  }\\n  .offset-md-11 {\\n    margin-left: 91.666667%;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .col-lg {\\n    -ms-flex-preferred-size: 0;\\n    flex-basis: 0;\\n    -ms-flex-positive: 1;\\n    flex-grow: 1;\\n    max-width: 100%;\\n  }\\n  .col-lg-auto {\\n    -ms-flex: 0 0 auto;\\n    flex: 0 0 auto;\\n    width: auto;\\n    max-width: 100%;\\n  }\\n  .col-lg-1 {\\n    -ms-flex: 0 0 8.333333%;\\n    flex: 0 0 8.333333%;\\n    max-width: 8.333333%;\\n  }\\n  .col-lg-2 {\\n    -ms-flex: 0 0 16.666667%;\\n    flex: 0 0 16.666667%;\\n    max-width: 16.666667%;\\n  }\\n  .col-lg-3 {\\n    -ms-flex: 0 0 25%;\\n    flex: 0 0 25%;\\n    max-width: 25%;\\n  }\\n  .col-lg-4 {\\n    -ms-flex: 0 0 33.333333%;\\n    flex: 0 0 33.333333%;\\n    max-width: 33.333333%;\\n  }\\n  .col-lg-5 {\\n    -ms-flex: 0 0 41.666667%;\\n    flex: 0 0 41.666667%;\\n    max-width: 41.666667%;\\n  }\\n  .col-lg-6 {\\n    -ms-flex: 0 0 50%;\\n    flex: 0 0 50%;\\n    max-width: 50%;\\n  }\\n  .col-lg-7 {\\n    -ms-flex: 0 0 58.333333%;\\n    flex: 0 0 58.333333%;\\n    max-width: 58.333333%;\\n  }\\n  .col-lg-8 {\\n    -ms-flex: 0 0 66.666667%;\\n    flex: 0 0 66.666667%;\\n    max-width: 66.666667%;\\n  }\\n  .col-lg-9 {\\n    -ms-flex: 0 0 75%;\\n    flex: 0 0 75%;\\n    max-width: 75%;\\n  }\\n  .col-lg-10 {\\n    -ms-flex: 0 0 83.333333%;\\n    flex: 0 0 83.333333%;\\n    max-width: 83.333333%;\\n  }\\n  .col-lg-11 {\\n    -ms-flex: 0 0 91.666667%;\\n    flex: 0 0 91.666667%;\\n    max-width: 91.666667%;\\n  }\\n  .col-lg-12 {\\n    -ms-flex: 0 0 100%;\\n    flex: 0 0 100%;\\n    max-width: 100%;\\n  }\\n  .order-lg-first {\\n    -ms-flex-order: -1;\\n    order: -1;\\n  }\\n  .order-lg-last {\\n    -ms-flex-order: 13;\\n    order: 13;\\n  }\\n  .order-lg-0 {\\n    -ms-flex-order: 0;\\n    order: 0;\\n  }\\n  .order-lg-1 {\\n    -ms-flex-order: 1;\\n    order: 1;\\n  }\\n  .order-lg-2 {\\n    -ms-flex-order: 2;\\n    order: 2;\\n  }\\n  .order-lg-3 {\\n    -ms-flex-order: 3;\\n    order: 3;\\n  }\\n  .order-lg-4 {\\n    -ms-flex-order: 4;\\n    order: 4;\\n  }\\n  .order-lg-5 {\\n    -ms-flex-order: 5;\\n    order: 5;\\n  }\\n  .order-lg-6 {\\n    -ms-flex-order: 6;\\n    order: 6;\\n  }\\n  .order-lg-7 {\\n    -ms-flex-order: 7;\\n    order: 7;\\n  }\\n  .order-lg-8 {\\n    -ms-flex-order: 8;\\n    order: 8;\\n  }\\n  .order-lg-9 {\\n    -ms-flex-order: 9;\\n    order: 9;\\n  }\\n  .order-lg-10 {\\n    -ms-flex-order: 10;\\n    order: 10;\\n  }\\n  .order-lg-11 {\\n    -ms-flex-order: 11;\\n    order: 11;\\n  }\\n  .order-lg-12 {\\n    -ms-flex-order: 12;\\n    order: 12;\\n  }\\n  .offset-lg-0 {\\n    margin-left: 0;\\n  }\\n  .offset-lg-1 {\\n    margin-left: 8.333333%;\\n  }\\n  .offset-lg-2 {\\n    margin-left: 16.666667%;\\n  }\\n  .offset-lg-3 {\\n    margin-left: 25%;\\n  }\\n  .offset-lg-4 {\\n    margin-left: 33.333333%;\\n  }\\n  .offset-lg-5 {\\n    margin-left: 41.666667%;\\n  }\\n  .offset-lg-6 {\\n    margin-left: 50%;\\n  }\\n  .offset-lg-7 {\\n    margin-left: 58.333333%;\\n  }\\n  .offset-lg-8 {\\n    margin-left: 66.666667%;\\n  }\\n  .offset-lg-9 {\\n    margin-left: 75%;\\n  }\\n  .offset-lg-10 {\\n    margin-left: 83.333333%;\\n  }\\n  .offset-lg-11 {\\n    margin-left: 91.666667%;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .col-xl {\\n    -ms-flex-preferred-size: 0;\\n    flex-basis: 0;\\n    -ms-flex-positive: 1;\\n    flex-grow: 1;\\n    max-width: 100%;\\n  }\\n  .col-xl-auto {\\n    -ms-flex: 0 0 auto;\\n    flex: 0 0 auto;\\n    width: auto;\\n    max-width: 100%;\\n  }\\n  .col-xl-1 {\\n    -ms-flex: 0 0 8.333333%;\\n    flex: 0 0 8.333333%;\\n    max-width: 8.333333%;\\n  }\\n  .col-xl-2 {\\n    -ms-flex: 0 0 16.666667%;\\n    flex: 0 0 16.666667%;\\n    max-width: 16.666667%;\\n  }\\n  .col-xl-3 {\\n    -ms-flex: 0 0 25%;\\n    flex: 0 0 25%;\\n    max-width: 25%;\\n  }\\n  .col-xl-4 {\\n    -ms-flex: 0 0 33.333333%;\\n    flex: 0 0 33.333333%;\\n    max-width: 33.333333%;\\n  }\\n  .col-xl-5 {\\n    -ms-flex: 0 0 41.666667%;\\n    flex: 0 0 41.666667%;\\n    max-width: 41.666667%;\\n  }\\n  .col-xl-6 {\\n    -ms-flex: 0 0 50%;\\n    flex: 0 0 50%;\\n    max-width: 50%;\\n  }\\n  .col-xl-7 {\\n    -ms-flex: 0 0 58.333333%;\\n    flex: 0 0 58.333333%;\\n    max-width: 58.333333%;\\n  }\\n  .col-xl-8 {\\n    -ms-flex: 0 0 66.666667%;\\n    flex: 0 0 66.666667%;\\n    max-width: 66.666667%;\\n  }\\n  .col-xl-9 {\\n    -ms-flex: 0 0 75%;\\n    flex: 0 0 75%;\\n    max-width: 75%;\\n  }\\n  .col-xl-10 {\\n    -ms-flex: 0 0 83.333333%;\\n    flex: 0 0 83.333333%;\\n    max-width: 83.333333%;\\n  }\\n  .col-xl-11 {\\n    -ms-flex: 0 0 91.666667%;\\n    flex: 0 0 91.666667%;\\n    max-width: 91.666667%;\\n  }\\n  .col-xl-12 {\\n    -ms-flex: 0 0 100%;\\n    flex: 0 0 100%;\\n    max-width: 100%;\\n  }\\n  .order-xl-first {\\n    -ms-flex-order: -1;\\n    order: -1;\\n  }\\n  .order-xl-last {\\n    -ms-flex-order: 13;\\n    order: 13;\\n  }\\n  .order-xl-0 {\\n    -ms-flex-order: 0;\\n    order: 0;\\n  }\\n  .order-xl-1 {\\n    -ms-flex-order: 1;\\n    order: 1;\\n  }\\n  .order-xl-2 {\\n    -ms-flex-order: 2;\\n    order: 2;\\n  }\\n  .order-xl-3 {\\n    -ms-flex-order: 3;\\n    order: 3;\\n  }\\n  .order-xl-4 {\\n    -ms-flex-order: 4;\\n    order: 4;\\n  }\\n  .order-xl-5 {\\n    -ms-flex-order: 5;\\n    order: 5;\\n  }\\n  .order-xl-6 {\\n    -ms-flex-order: 6;\\n    order: 6;\\n  }\\n  .order-xl-7 {\\n    -ms-flex-order: 7;\\n    order: 7;\\n  }\\n  .order-xl-8 {\\n    -ms-flex-order: 8;\\n    order: 8;\\n  }\\n  .order-xl-9 {\\n    -ms-flex-order: 9;\\n    order: 9;\\n  }\\n  .order-xl-10 {\\n    -ms-flex-order: 10;\\n    order: 10;\\n  }\\n  .order-xl-11 {\\n    -ms-flex-order: 11;\\n    order: 11;\\n  }\\n  .order-xl-12 {\\n    -ms-flex-order: 12;\\n    order: 12;\\n  }\\n  .offset-xl-0 {\\n    margin-left: 0;\\n  }\\n  .offset-xl-1 {\\n    margin-left: 8.333333%;\\n  }\\n  .offset-xl-2 {\\n    margin-left: 16.666667%;\\n  }\\n  .offset-xl-3 {\\n    margin-left: 25%;\\n  }\\n  .offset-xl-4 {\\n    margin-left: 33.333333%;\\n  }\\n  .offset-xl-5 {\\n    margin-left: 41.666667%;\\n  }\\n  .offset-xl-6 {\\n    margin-left: 50%;\\n  }\\n  .offset-xl-7 {\\n    margin-left: 58.333333%;\\n  }\\n  .offset-xl-8 {\\n    margin-left: 66.666667%;\\n  }\\n  .offset-xl-9 {\\n    margin-left: 75%;\\n  }\\n  .offset-xl-10 {\\n    margin-left: 83.333333%;\\n  }\\n  .offset-xl-11 {\\n    margin-left: 91.666667%;\\n  }\\n}\\n\\n.d-none {\\n  display: none !important;\\n}\\n\\n.d-inline {\\n  display: inline !important;\\n}\\n\\n.d-inline-block {\\n  display: inline-block !important;\\n}\\n\\n.d-block {\\n  display: block !important;\\n}\\n\\n.d-table {\\n  display: table !important;\\n}\\n\\n.d-table-row {\\n  display: table-row !important;\\n}\\n\\n.d-table-cell {\\n  display: table-cell !important;\\n}\\n\\n.d-flex {\\n  display: -ms-flexbox !important;\\n  display: flex !important;\\n}\\n\\n.d-inline-flex {\\n  display: -ms-inline-flexbox !important;\\n  display: inline-flex !important;\\n}\\n\\n@media (min-width: 576px) {\\n  .d-sm-none {\\n    display: none !important;\\n  }\\n  .d-sm-inline {\\n    display: inline !important;\\n  }\\n  .d-sm-inline-block {\\n    display: inline-block !important;\\n  }\\n  .d-sm-block {\\n    display: block !important;\\n  }\\n  .d-sm-table {\\n    display: table !important;\\n  }\\n  .d-sm-table-row {\\n    display: table-row !important;\\n  }\\n  .d-sm-table-cell {\\n    display: table-cell !important;\\n  }\\n  .d-sm-flex {\\n    display: -ms-flexbox !important;\\n    display: flex !important;\\n  }\\n  .d-sm-inline-flex {\\n    display: -ms-inline-flexbox !important;\\n    display: inline-flex !important;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .d-md-none {\\n    display: none !important;\\n  }\\n  .d-md-inline {\\n    display: inline !important;\\n  }\\n  .d-md-inline-block {\\n    display: inline-block !important;\\n  }\\n  .d-md-block {\\n    display: block !important;\\n  }\\n  .d-md-table {\\n    display: table !important;\\n  }\\n  .d-md-table-row {\\n    display: table-row !important;\\n  }\\n  .d-md-table-cell {\\n    display: table-cell !important;\\n  }\\n  .d-md-flex {\\n    display: -ms-flexbox !important;\\n    display: flex !important;\\n  }\\n  .d-md-inline-flex {\\n    display: -ms-inline-flexbox !important;\\n    display: inline-flex !important;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .d-lg-none {\\n    display: none !important;\\n  }\\n  .d-lg-inline {\\n    display: inline !important;\\n  }\\n  .d-lg-inline-block {\\n    display: inline-block !important;\\n  }\\n  .d-lg-block {\\n    display: block !important;\\n  }\\n  .d-lg-table {\\n    display: table !important;\\n  }\\n  .d-lg-table-row {\\n    display: table-row !important;\\n  }\\n  .d-lg-table-cell {\\n    display: table-cell !important;\\n  }\\n  .d-lg-flex {\\n    display: -ms-flexbox !important;\\n    display: flex !important;\\n  }\\n  .d-lg-inline-flex {\\n    display: -ms-inline-flexbox !important;\\n    display: inline-flex !important;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .d-xl-none {\\n    display: none !important;\\n  }\\n  .d-xl-inline {\\n    display: inline !important;\\n  }\\n  .d-xl-inline-block {\\n    display: inline-block !important;\\n  }\\n  .d-xl-block {\\n    display: block !important;\\n  }\\n  .d-xl-table {\\n    display: table !important;\\n  }\\n  .d-xl-table-row {\\n    display: table-row !important;\\n  }\\n  .d-xl-table-cell {\\n    display: table-cell !important;\\n  }\\n  .d-xl-flex {\\n    display: -ms-flexbox !important;\\n    display: flex !important;\\n  }\\n  .d-xl-inline-flex {\\n    display: -ms-inline-flexbox !important;\\n    display: inline-flex !important;\\n  }\\n}\\n\\n@media print {\\n  .d-print-none {\\n    display: none !important;\\n  }\\n  .d-print-inline {\\n    display: inline !important;\\n  }\\n  .d-print-inline-block {\\n    display: inline-block !important;\\n  }\\n  .d-print-block {\\n    display: block !important;\\n  }\\n  .d-print-table {\\n    display: table !important;\\n  }\\n  .d-print-table-row {\\n    display: table-row !important;\\n  }\\n  .d-print-table-cell {\\n    display: table-cell !important;\\n  }\\n  .d-print-flex {\\n    display: -ms-flexbox !important;\\n    display: flex !important;\\n  }\\n  .d-print-inline-flex {\\n    display: -ms-inline-flexbox !important;\\n    display: inline-flex !important;\\n  }\\n}\\n\\n.flex-row {\\n  -ms-flex-direction: row !important;\\n  flex-direction: row !important;\\n}\\n\\n.flex-column {\\n  -ms-flex-direction: column !important;\\n  flex-direction: column !important;\\n}\\n\\n.flex-row-reverse {\\n  -ms-flex-direction: row-reverse !important;\\n  flex-direction: row-reverse !important;\\n}\\n\\n.flex-column-reverse {\\n  -ms-flex-direction: column-reverse !important;\\n  flex-direction: column-reverse !important;\\n}\\n\\n.flex-wrap {\\n  -ms-flex-wrap: wrap !important;\\n  flex-wrap: wrap !important;\\n}\\n\\n.flex-nowrap {\\n  -ms-flex-wrap: nowrap !important;\\n  flex-wrap: nowrap !important;\\n}\\n\\n.flex-wrap-reverse {\\n  -ms-flex-wrap: wrap-reverse !important;\\n  flex-wrap: wrap-reverse !important;\\n}\\n\\n.flex-fill {\\n  -ms-flex: 1 1 auto !important;\\n  flex: 1 1 auto !important;\\n}\\n\\n.flex-grow-0 {\\n  -ms-flex-positive: 0 !important;\\n  flex-grow: 0 !important;\\n}\\n\\n.flex-grow-1 {\\n  -ms-flex-positive: 1 !important;\\n  flex-grow: 1 !important;\\n}\\n\\n.flex-shrink-0 {\\n  -ms-flex-negative: 0 !important;\\n  flex-shrink: 0 !important;\\n}\\n\\n.flex-shrink-1 {\\n  -ms-flex-negative: 1 !important;\\n  flex-shrink: 1 !important;\\n}\\n\\n.justify-content-start {\\n  -ms-flex-pack: start !important;\\n  justify-content: flex-start !important;\\n}\\n\\n.justify-content-end {\\n  -ms-flex-pack: end !important;\\n  justify-content: flex-end !important;\\n}\\n\\n.justify-content-center {\\n  -ms-flex-pack: center !important;\\n  justify-content: center !important;\\n}\\n\\n.justify-content-between {\\n  -ms-flex-pack: justify !important;\\n  justify-content: space-between !important;\\n}\\n\\n.justify-content-around {\\n  -ms-flex-pack: distribute !important;\\n  justify-content: space-around !important;\\n}\\n\\n.align-items-start {\\n  -ms-flex-align: start !important;\\n  align-items: flex-start !important;\\n}\\n\\n.align-items-end {\\n  -ms-flex-align: end !important;\\n  align-items: flex-end !important;\\n}\\n\\n.align-items-center {\\n  -ms-flex-align: center !important;\\n  align-items: center !important;\\n}\\n\\n.align-items-baseline {\\n  -ms-flex-align: baseline !important;\\n  align-items: baseline !important;\\n}\\n\\n.align-items-stretch {\\n  -ms-flex-align: stretch !important;\\n  align-items: stretch !important;\\n}\\n\\n.align-content-start {\\n  -ms-flex-line-pack: start !important;\\n  align-content: flex-start !important;\\n}\\n\\n.align-content-end {\\n  -ms-flex-line-pack: end !important;\\n  align-content: flex-end !important;\\n}\\n\\n.align-content-center {\\n  -ms-flex-line-pack: center !important;\\n  align-content: center !important;\\n}\\n\\n.align-content-between {\\n  -ms-flex-line-pack: justify !important;\\n  align-content: space-between !important;\\n}\\n\\n.align-content-around {\\n  -ms-flex-line-pack: distribute !important;\\n  align-content: space-around !important;\\n}\\n\\n.align-content-stretch {\\n  -ms-flex-line-pack: stretch !important;\\n  align-content: stretch !important;\\n}\\n\\n.align-self-auto {\\n  -ms-flex-item-align: auto !important;\\n  align-self: auto !important;\\n}\\n\\n.align-self-start {\\n  -ms-flex-item-align: start !important;\\n  align-self: flex-start !important;\\n}\\n\\n.align-self-end {\\n  -ms-flex-item-align: end !important;\\n  align-self: flex-end !important;\\n}\\n\\n.align-self-center {\\n  -ms-flex-item-align: center !important;\\n  align-self: center !important;\\n}\\n\\n.align-self-baseline {\\n  -ms-flex-item-align: baseline !important;\\n  align-self: baseline !important;\\n}\\n\\n.align-self-stretch {\\n  -ms-flex-item-align: stretch !important;\\n  align-self: stretch !important;\\n}\\n\\n@media (min-width: 576px) {\\n  .flex-sm-row {\\n    -ms-flex-direction: row !important;\\n    flex-direction: row !important;\\n  }\\n  .flex-sm-column {\\n    -ms-flex-direction: column !important;\\n    flex-direction: column !important;\\n  }\\n  .flex-sm-row-reverse {\\n    -ms-flex-direction: row-reverse !important;\\n    flex-direction: row-reverse !important;\\n  }\\n  .flex-sm-column-reverse {\\n    -ms-flex-direction: column-reverse !important;\\n    flex-direction: column-reverse !important;\\n  }\\n  .flex-sm-wrap {\\n    -ms-flex-wrap: wrap !important;\\n    flex-wrap: wrap !important;\\n  }\\n  .flex-sm-nowrap {\\n    -ms-flex-wrap: nowrap !important;\\n    flex-wrap: nowrap !important;\\n  }\\n  .flex-sm-wrap-reverse {\\n    -ms-flex-wrap: wrap-reverse !important;\\n    flex-wrap: wrap-reverse !important;\\n  }\\n  .flex-sm-fill {\\n    -ms-flex: 1 1 auto !important;\\n    flex: 1 1 auto !important;\\n  }\\n  .flex-sm-grow-0 {\\n    -ms-flex-positive: 0 !important;\\n    flex-grow: 0 !important;\\n  }\\n  .flex-sm-grow-1 {\\n    -ms-flex-positive: 1 !important;\\n    flex-grow: 1 !important;\\n  }\\n  .flex-sm-shrink-0 {\\n    -ms-flex-negative: 0 !important;\\n    flex-shrink: 0 !important;\\n  }\\n  .flex-sm-shrink-1 {\\n    -ms-flex-negative: 1 !important;\\n    flex-shrink: 1 !important;\\n  }\\n  .justify-content-sm-start {\\n    -ms-flex-pack: start !important;\\n    justify-content: flex-start !important;\\n  }\\n  .justify-content-sm-end {\\n    -ms-flex-pack: end !important;\\n    justify-content: flex-end !important;\\n  }\\n  .justify-content-sm-center {\\n    -ms-flex-pack: center !important;\\n    justify-content: center !important;\\n  }\\n  .justify-content-sm-between {\\n    -ms-flex-pack: justify !important;\\n    justify-content: space-between !important;\\n  }\\n  .justify-content-sm-around {\\n    -ms-flex-pack: distribute !important;\\n    justify-content: space-around !important;\\n  }\\n  .align-items-sm-start {\\n    -ms-flex-align: start !important;\\n    align-items: flex-start !important;\\n  }\\n  .align-items-sm-end {\\n    -ms-flex-align: end !important;\\n    align-items: flex-end !important;\\n  }\\n  .align-items-sm-center {\\n    -ms-flex-align: center !important;\\n    align-items: center !important;\\n  }\\n  .align-items-sm-baseline {\\n    -ms-flex-align: baseline !important;\\n    align-items: baseline !important;\\n  }\\n  .align-items-sm-stretch {\\n    -ms-flex-align: stretch !important;\\n    align-items: stretch !important;\\n  }\\n  .align-content-sm-start {\\n    -ms-flex-line-pack: start !important;\\n    align-content: flex-start !important;\\n  }\\n  .align-content-sm-end {\\n    -ms-flex-line-pack: end !important;\\n    align-content: flex-end !important;\\n  }\\n  .align-content-sm-center {\\n    -ms-flex-line-pack: center !important;\\n    align-content: center !important;\\n  }\\n  .align-content-sm-between {\\n    -ms-flex-line-pack: justify !important;\\n    align-content: space-between !important;\\n  }\\n  .align-content-sm-around {\\n    -ms-flex-line-pack: distribute !important;\\n    align-content: space-around !important;\\n  }\\n  .align-content-sm-stretch {\\n    -ms-flex-line-pack: stretch !important;\\n    align-content: stretch !important;\\n  }\\n  .align-self-sm-auto {\\n    -ms-flex-item-align: auto !important;\\n    align-self: auto !important;\\n  }\\n  .align-self-sm-start {\\n    -ms-flex-item-align: start !important;\\n    align-self: flex-start !important;\\n  }\\n  .align-self-sm-end {\\n    -ms-flex-item-align: end !important;\\n    align-self: flex-end !important;\\n  }\\n  .align-self-sm-center {\\n    -ms-flex-item-align: center !important;\\n    align-self: center !important;\\n  }\\n  .align-self-sm-baseline {\\n    -ms-flex-item-align: baseline !important;\\n    align-self: baseline !important;\\n  }\\n  .align-self-sm-stretch {\\n    -ms-flex-item-align: stretch !important;\\n    align-self: stretch !important;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .flex-md-row {\\n    -ms-flex-direction: row !important;\\n    flex-direction: row !important;\\n  }\\n  .flex-md-column {\\n    -ms-flex-direction: column !important;\\n    flex-direction: column !important;\\n  }\\n  .flex-md-row-reverse {\\n    -ms-flex-direction: row-reverse !important;\\n    flex-direction: row-reverse !important;\\n  }\\n  .flex-md-column-reverse {\\n    -ms-flex-direction: column-reverse !important;\\n    flex-direction: column-reverse !important;\\n  }\\n  .flex-md-wrap {\\n    -ms-flex-wrap: wrap !important;\\n    flex-wrap: wrap !important;\\n  }\\n  .flex-md-nowrap {\\n    -ms-flex-wrap: nowrap !important;\\n    flex-wrap: nowrap !important;\\n  }\\n  .flex-md-wrap-reverse {\\n    -ms-flex-wrap: wrap-reverse !important;\\n    flex-wrap: wrap-reverse !important;\\n  }\\n  .flex-md-fill {\\n    -ms-flex: 1 1 auto !important;\\n    flex: 1 1 auto !important;\\n  }\\n  .flex-md-grow-0 {\\n    -ms-flex-positive: 0 !important;\\n    flex-grow: 0 !important;\\n  }\\n  .flex-md-grow-1 {\\n    -ms-flex-positive: 1 !important;\\n    flex-grow: 1 !important;\\n  }\\n  .flex-md-shrink-0 {\\n    -ms-flex-negative: 0 !important;\\n    flex-shrink: 0 !important;\\n  }\\n  .flex-md-shrink-1 {\\n    -ms-flex-negative: 1 !important;\\n    flex-shrink: 1 !important;\\n  }\\n  .justify-content-md-start {\\n    -ms-flex-pack: start !important;\\n    justify-content: flex-start !important;\\n  }\\n  .justify-content-md-end {\\n    -ms-flex-pack: end !important;\\n    justify-content: flex-end !important;\\n  }\\n  .justify-content-md-center {\\n    -ms-flex-pack: center !important;\\n    justify-content: center !important;\\n  }\\n  .justify-content-md-between {\\n    -ms-flex-pack: justify !important;\\n    justify-content: space-between !important;\\n  }\\n  .justify-content-md-around {\\n    -ms-flex-pack: distribute !important;\\n    justify-content: space-around !important;\\n  }\\n  .align-items-md-start {\\n    -ms-flex-align: start !important;\\n    align-items: flex-start !important;\\n  }\\n  .align-items-md-end {\\n    -ms-flex-align: end !important;\\n    align-items: flex-end !important;\\n  }\\n  .align-items-md-center {\\n    -ms-flex-align: center !important;\\n    align-items: center !important;\\n  }\\n  .align-items-md-baseline {\\n    -ms-flex-align: baseline !important;\\n    align-items: baseline !important;\\n  }\\n  .align-items-md-stretch {\\n    -ms-flex-align: stretch !important;\\n    align-items: stretch !important;\\n  }\\n  .align-content-md-start {\\n    -ms-flex-line-pack: start !important;\\n    align-content: flex-start !important;\\n  }\\n  .align-content-md-end {\\n    -ms-flex-line-pack: end !important;\\n    align-content: flex-end !important;\\n  }\\n  .align-content-md-center {\\n    -ms-flex-line-pack: center !important;\\n    align-content: center !important;\\n  }\\n  .align-content-md-between {\\n    -ms-flex-line-pack: justify !important;\\n    align-content: space-between !important;\\n  }\\n  .align-content-md-around {\\n    -ms-flex-line-pack: distribute !important;\\n    align-content: space-around !important;\\n  }\\n  .align-content-md-stretch {\\n    -ms-flex-line-pack: stretch !important;\\n    align-content: stretch !important;\\n  }\\n  .align-self-md-auto {\\n    -ms-flex-item-align: auto !important;\\n    align-self: auto !important;\\n  }\\n  .align-self-md-start {\\n    -ms-flex-item-align: start !important;\\n    align-self: flex-start !important;\\n  }\\n  .align-self-md-end {\\n    -ms-flex-item-align: end !important;\\n    align-self: flex-end !important;\\n  }\\n  .align-self-md-center {\\n    -ms-flex-item-align: center !important;\\n    align-self: center !important;\\n  }\\n  .align-self-md-baseline {\\n    -ms-flex-item-align: baseline !important;\\n    align-self: baseline !important;\\n  }\\n  .align-self-md-stretch {\\n    -ms-flex-item-align: stretch !important;\\n    align-self: stretch !important;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .flex-lg-row {\\n    -ms-flex-direction: row !important;\\n    flex-direction: row !important;\\n  }\\n  .flex-lg-column {\\n    -ms-flex-direction: column !important;\\n    flex-direction: column !important;\\n  }\\n  .flex-lg-row-reverse {\\n    -ms-flex-direction: row-reverse !important;\\n    flex-direction: row-reverse !important;\\n  }\\n  .flex-lg-column-reverse {\\n    -ms-flex-direction: column-reverse !important;\\n    flex-direction: column-reverse !important;\\n  }\\n  .flex-lg-wrap {\\n    -ms-flex-wrap: wrap !important;\\n    flex-wrap: wrap !important;\\n  }\\n  .flex-lg-nowrap {\\n    -ms-flex-wrap: nowrap !important;\\n    flex-wrap: nowrap !important;\\n  }\\n  .flex-lg-wrap-reverse {\\n    -ms-flex-wrap: wrap-reverse !important;\\n    flex-wrap: wrap-reverse !important;\\n  }\\n  .flex-lg-fill {\\n    -ms-flex: 1 1 auto !important;\\n    flex: 1 1 auto !important;\\n  }\\n  .flex-lg-grow-0 {\\n    -ms-flex-positive: 0 !important;\\n    flex-grow: 0 !important;\\n  }\\n  .flex-lg-grow-1 {\\n    -ms-flex-positive: 1 !important;\\n    flex-grow: 1 !important;\\n  }\\n  .flex-lg-shrink-0 {\\n    -ms-flex-negative: 0 !important;\\n    flex-shrink: 0 !important;\\n  }\\n  .flex-lg-shrink-1 {\\n    -ms-flex-negative: 1 !important;\\n    flex-shrink: 1 !important;\\n  }\\n  .justify-content-lg-start {\\n    -ms-flex-pack: start !important;\\n    justify-content: flex-start !important;\\n  }\\n  .justify-content-lg-end {\\n    -ms-flex-pack: end !important;\\n    justify-content: flex-end !important;\\n  }\\n  .justify-content-lg-center {\\n    -ms-flex-pack: center !important;\\n    justify-content: center !important;\\n  }\\n  .justify-content-lg-between {\\n    -ms-flex-pack: justify !important;\\n    justify-content: space-between !important;\\n  }\\n  .justify-content-lg-around {\\n    -ms-flex-pack: distribute !important;\\n    justify-content: space-around !important;\\n  }\\n  .align-items-lg-start {\\n    -ms-flex-align: start !important;\\n    align-items: flex-start !important;\\n  }\\n  .align-items-lg-end {\\n    -ms-flex-align: end !important;\\n    align-items: flex-end !important;\\n  }\\n  .align-items-lg-center {\\n    -ms-flex-align: center !important;\\n    align-items: center !important;\\n  }\\n  .align-items-lg-baseline {\\n    -ms-flex-align: baseline !important;\\n    align-items: baseline !important;\\n  }\\n  .align-items-lg-stretch {\\n    -ms-flex-align: stretch !important;\\n    align-items: stretch !important;\\n  }\\n  .align-content-lg-start {\\n    -ms-flex-line-pack: start !important;\\n    align-content: flex-start !important;\\n  }\\n  .align-content-lg-end {\\n    -ms-flex-line-pack: end !important;\\n    align-content: flex-end !important;\\n  }\\n  .align-content-lg-center {\\n    -ms-flex-line-pack: center !important;\\n    align-content: center !important;\\n  }\\n  .align-content-lg-between {\\n    -ms-flex-line-pack: justify !important;\\n    align-content: space-between !important;\\n  }\\n  .align-content-lg-around {\\n    -ms-flex-line-pack: distribute !important;\\n    align-content: space-around !important;\\n  }\\n  .align-content-lg-stretch {\\n    -ms-flex-line-pack: stretch !important;\\n    align-content: stretch !important;\\n  }\\n  .align-self-lg-auto {\\n    -ms-flex-item-align: auto !important;\\n    align-self: auto !important;\\n  }\\n  .align-self-lg-start {\\n    -ms-flex-item-align: start !important;\\n    align-self: flex-start !important;\\n  }\\n  .align-self-lg-end {\\n    -ms-flex-item-align: end !important;\\n    align-self: flex-end !important;\\n  }\\n  .align-self-lg-center {\\n    -ms-flex-item-align: center !important;\\n    align-self: center !important;\\n  }\\n  .align-self-lg-baseline {\\n    -ms-flex-item-align: baseline !important;\\n    align-self: baseline !important;\\n  }\\n  .align-self-lg-stretch {\\n    -ms-flex-item-align: stretch !important;\\n    align-self: stretch !important;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .flex-xl-row {\\n    -ms-flex-direction: row !important;\\n    flex-direction: row !important;\\n  }\\n  .flex-xl-column {\\n    -ms-flex-direction: column !important;\\n    flex-direction: column !important;\\n  }\\n  .flex-xl-row-reverse {\\n    -ms-flex-direction: row-reverse !important;\\n    flex-direction: row-reverse !important;\\n  }\\n  .flex-xl-column-reverse {\\n    -ms-flex-direction: column-reverse !important;\\n    flex-direction: column-reverse !important;\\n  }\\n  .flex-xl-wrap {\\n    -ms-flex-wrap: wrap !important;\\n    flex-wrap: wrap !important;\\n  }\\n  .flex-xl-nowrap {\\n    -ms-flex-wrap: nowrap !important;\\n    flex-wrap: nowrap !important;\\n  }\\n  .flex-xl-wrap-reverse {\\n    -ms-flex-wrap: wrap-reverse !important;\\n    flex-wrap: wrap-reverse !important;\\n  }\\n  .flex-xl-fill {\\n    -ms-flex: 1 1 auto !important;\\n    flex: 1 1 auto !important;\\n  }\\n  .flex-xl-grow-0 {\\n    -ms-flex-positive: 0 !important;\\n    flex-grow: 0 !important;\\n  }\\n  .flex-xl-grow-1 {\\n    -ms-flex-positive: 1 !important;\\n    flex-grow: 1 !important;\\n  }\\n  .flex-xl-shrink-0 {\\n    -ms-flex-negative: 0 !important;\\n    flex-shrink: 0 !important;\\n  }\\n  .flex-xl-shrink-1 {\\n    -ms-flex-negative: 1 !important;\\n    flex-shrink: 1 !important;\\n  }\\n  .justify-content-xl-start {\\n    -ms-flex-pack: start !important;\\n    justify-content: flex-start !important;\\n  }\\n  .justify-content-xl-end {\\n    -ms-flex-pack: end !important;\\n    justify-content: flex-end !important;\\n  }\\n  .justify-content-xl-center {\\n    -ms-flex-pack: center !important;\\n    justify-content: center !important;\\n  }\\n  .justify-content-xl-between {\\n    -ms-flex-pack: justify !important;\\n    justify-content: space-between !important;\\n  }\\n  .justify-content-xl-around {\\n    -ms-flex-pack: distribute !important;\\n    justify-content: space-around !important;\\n  }\\n  .align-items-xl-start {\\n    -ms-flex-align: start !important;\\n    align-items: flex-start !important;\\n  }\\n  .align-items-xl-end {\\n    -ms-flex-align: end !important;\\n    align-items: flex-end !important;\\n  }\\n  .align-items-xl-center {\\n    -ms-flex-align: center !important;\\n    align-items: center !important;\\n  }\\n  .align-items-xl-baseline {\\n    -ms-flex-align: baseline !important;\\n    align-items: baseline !important;\\n  }\\n  .align-items-xl-stretch {\\n    -ms-flex-align: stretch !important;\\n    align-items: stretch !important;\\n  }\\n  .align-content-xl-start {\\n    -ms-flex-line-pack: start !important;\\n    align-content: flex-start !important;\\n  }\\n  .align-content-xl-end {\\n    -ms-flex-line-pack: end !important;\\n    align-content: flex-end !important;\\n  }\\n  .align-content-xl-center {\\n    -ms-flex-line-pack: center !important;\\n    align-content: center !important;\\n  }\\n  .align-content-xl-between {\\n    -ms-flex-line-pack: justify !important;\\n    align-content: space-between !important;\\n  }\\n  .align-content-xl-around {\\n    -ms-flex-line-pack: distribute !important;\\n    align-content: space-around !important;\\n  }\\n  .align-content-xl-stretch {\\n    -ms-flex-line-pack: stretch !important;\\n    align-content: stretch !important;\\n  }\\n  .align-self-xl-auto {\\n    -ms-flex-item-align: auto !important;\\n    align-self: auto !important;\\n  }\\n  .align-self-xl-start {\\n    -ms-flex-item-align: start !important;\\n    align-self: flex-start !important;\\n  }\\n  .align-self-xl-end {\\n    -ms-flex-item-align: end !important;\\n    align-self: flex-end !important;\\n  }\\n  .align-self-xl-center {\\n    -ms-flex-item-align: center !important;\\n    align-self: center !important;\\n  }\\n  .align-self-xl-baseline {\\n    -ms-flex-item-align: baseline !important;\\n    align-self: baseline !important;\\n  }\\n  .align-self-xl-stretch {\\n    -ms-flex-item-align: stretch !important;\\n    align-self: stretch !important;\\n  }\\n}\\n\\n.m-0 {\\n  margin: 0 !important;\\n}\\n\\n.mt-0,\\n.my-0 {\\n  margin-top: 0 !important;\\n}\\n\\n.mr-0,\\n.mx-0 {\\n  margin-right: 0 !important;\\n}\\n\\n.mb-0,\\n.my-0 {\\n  margin-bottom: 0 !important;\\n}\\n\\n.ml-0,\\n.mx-0 {\\n  margin-left: 0 !important;\\n}\\n\\n.m-1 {\\n  margin: 0.25rem !important;\\n}\\n\\n.mt-1,\\n.my-1 {\\n  margin-top: 0.25rem !important;\\n}\\n\\n.mr-1,\\n.mx-1 {\\n  margin-right: 0.25rem !important;\\n}\\n\\n.mb-1,\\n.my-1 {\\n  margin-bottom: 0.25rem !important;\\n}\\n\\n.ml-1,\\n.mx-1 {\\n  margin-left: 0.25rem !important;\\n}\\n\\n.m-2 {\\n  margin: 0.5rem !important;\\n}\\n\\n.mt-2,\\n.my-2 {\\n  margin-top: 0.5rem !important;\\n}\\n\\n.mr-2,\\n.mx-2 {\\n  margin-right: 0.5rem !important;\\n}\\n\\n.mb-2,\\n.my-2 {\\n  margin-bottom: 0.5rem !important;\\n}\\n\\n.ml-2,\\n.mx-2 {\\n  margin-left: 0.5rem !important;\\n}\\n\\n.m-3 {\\n  margin: 1rem !important;\\n}\\n\\n.mt-3,\\n.my-3 {\\n  margin-top: 1rem !important;\\n}\\n\\n.mr-3,\\n.mx-3 {\\n  margin-right: 1rem !important;\\n}\\n\\n.mb-3,\\n.my-3 {\\n  margin-bottom: 1rem !important;\\n}\\n\\n.ml-3,\\n.mx-3 {\\n  margin-left: 1rem !important;\\n}\\n\\n.m-4 {\\n  margin: 1.5rem !important;\\n}\\n\\n.mt-4,\\n.my-4 {\\n  margin-top: 1.5rem !important;\\n}\\n\\n.mr-4,\\n.mx-4 {\\n  margin-right: 1.5rem !important;\\n}\\n\\n.mb-4,\\n.my-4 {\\n  margin-bottom: 1.5rem !important;\\n}\\n\\n.ml-4,\\n.mx-4 {\\n  margin-left: 1.5rem !important;\\n}\\n\\n.m-5 {\\n  margin: 3rem !important;\\n}\\n\\n.mt-5,\\n.my-5 {\\n  margin-top: 3rem !important;\\n}\\n\\n.mr-5,\\n.mx-5 {\\n  margin-right: 3rem !important;\\n}\\n\\n.mb-5,\\n.my-5 {\\n  margin-bottom: 3rem !important;\\n}\\n\\n.ml-5,\\n.mx-5 {\\n  margin-left: 3rem !important;\\n}\\n\\n.p-0 {\\n  padding: 0 !important;\\n}\\n\\n.pt-0,\\n.py-0 {\\n  padding-top: 0 !important;\\n}\\n\\n.pr-0,\\n.px-0 {\\n  padding-right: 0 !important;\\n}\\n\\n.pb-0,\\n.py-0 {\\n  padding-bottom: 0 !important;\\n}\\n\\n.pl-0,\\n.px-0 {\\n  padding-left: 0 !important;\\n}\\n\\n.p-1 {\\n  padding: 0.25rem !important;\\n}\\n\\n.pt-1,\\n.py-1 {\\n  padding-top: 0.25rem !important;\\n}\\n\\n.pr-1,\\n.px-1 {\\n  padding-right: 0.25rem !important;\\n}\\n\\n.pb-1,\\n.py-1 {\\n  padding-bottom: 0.25rem !important;\\n}\\n\\n.pl-1,\\n.px-1 {\\n  padding-left: 0.25rem !important;\\n}\\n\\n.p-2 {\\n  padding: 0.5rem !important;\\n}\\n\\n.pt-2,\\n.py-2 {\\n  padding-top: 0.5rem !important;\\n}\\n\\n.pr-2,\\n.px-2 {\\n  padding-right: 0.5rem !important;\\n}\\n\\n.pb-2,\\n.py-2 {\\n  padding-bottom: 0.5rem !important;\\n}\\n\\n.pl-2,\\n.px-2 {\\n  padding-left: 0.5rem !important;\\n}\\n\\n.p-3 {\\n  padding: 1rem !important;\\n}\\n\\n.pt-3,\\n.py-3 {\\n  padding-top: 1rem !important;\\n}\\n\\n.pr-3,\\n.px-3 {\\n  padding-right: 1rem !important;\\n}\\n\\n.pb-3,\\n.py-3 {\\n  padding-bottom: 1rem !important;\\n}\\n\\n.pl-3,\\n.px-3 {\\n  padding-left: 1rem !important;\\n}\\n\\n.p-4 {\\n  padding: 1.5rem !important;\\n}\\n\\n.pt-4,\\n.py-4 {\\n  padding-top: 1.5rem !important;\\n}\\n\\n.pr-4,\\n.px-4 {\\n  padding-right: 1.5rem !important;\\n}\\n\\n.pb-4,\\n.py-4 {\\n  padding-bottom: 1.5rem !important;\\n}\\n\\n.pl-4,\\n.px-4 {\\n  padding-left: 1.5rem !important;\\n}\\n\\n.p-5 {\\n  padding: 3rem !important;\\n}\\n\\n.pt-5,\\n.py-5 {\\n  padding-top: 3rem !important;\\n}\\n\\n.pr-5,\\n.px-5 {\\n  padding-right: 3rem !important;\\n}\\n\\n.pb-5,\\n.py-5 {\\n  padding-bottom: 3rem !important;\\n}\\n\\n.pl-5,\\n.px-5 {\\n  padding-left: 3rem !important;\\n}\\n\\n.m-n1 {\\n  margin: -0.25rem !important;\\n}\\n\\n.mt-n1,\\n.my-n1 {\\n  margin-top: -0.25rem !important;\\n}\\n\\n.mr-n1,\\n.mx-n1 {\\n  margin-right: -0.25rem !important;\\n}\\n\\n.mb-n1,\\n.my-n1 {\\n  margin-bottom: -0.25rem !important;\\n}\\n\\n.ml-n1,\\n.mx-n1 {\\n  margin-left: -0.25rem !important;\\n}\\n\\n.m-n2 {\\n  margin: -0.5rem !important;\\n}\\n\\n.mt-n2,\\n.my-n2 {\\n  margin-top: -0.5rem !important;\\n}\\n\\n.mr-n2,\\n.mx-n2 {\\n  margin-right: -0.5rem !important;\\n}\\n\\n.mb-n2,\\n.my-n2 {\\n  margin-bottom: -0.5rem !important;\\n}\\n\\n.ml-n2,\\n.mx-n2 {\\n  margin-left: -0.5rem !important;\\n}\\n\\n.m-n3 {\\n  margin: -1rem !important;\\n}\\n\\n.mt-n3,\\n.my-n3 {\\n  margin-top: -1rem !important;\\n}\\n\\n.mr-n3,\\n.mx-n3 {\\n  margin-right: -1rem !important;\\n}\\n\\n.mb-n3,\\n.my-n3 {\\n  margin-bottom: -1rem !important;\\n}\\n\\n.ml-n3,\\n.mx-n3 {\\n  margin-left: -1rem !important;\\n}\\n\\n.m-n4 {\\n  margin: -1.5rem !important;\\n}\\n\\n.mt-n4,\\n.my-n4 {\\n  margin-top: -1.5rem !important;\\n}\\n\\n.mr-n4,\\n.mx-n4 {\\n  margin-right: -1.5rem !important;\\n}\\n\\n.mb-n4,\\n.my-n4 {\\n  margin-bottom: -1.5rem !important;\\n}\\n\\n.ml-n4,\\n.mx-n4 {\\n  margin-left: -1.5rem !important;\\n}\\n\\n.m-n5 {\\n  margin: -3rem !important;\\n}\\n\\n.mt-n5,\\n.my-n5 {\\n  margin-top: -3rem !important;\\n}\\n\\n.mr-n5,\\n.mx-n5 {\\n  margin-right: -3rem !important;\\n}\\n\\n.mb-n5,\\n.my-n5 {\\n  margin-bottom: -3rem !important;\\n}\\n\\n.ml-n5,\\n.mx-n5 {\\n  margin-left: -3rem !important;\\n}\\n\\n.m-auto {\\n  margin: auto !important;\\n}\\n\\n.mt-auto,\\n.my-auto {\\n  margin-top: auto !important;\\n}\\n\\n.mr-auto,\\n.mx-auto {\\n  margin-right: auto !important;\\n}\\n\\n.mb-auto,\\n.my-auto {\\n  margin-bottom: auto !important;\\n}\\n\\n.ml-auto,\\n.mx-auto {\\n  margin-left: auto !important;\\n}\\n\\n@media (min-width: 576px) {\\n  .m-sm-0 {\\n    margin: 0 !important;\\n  }\\n  .mt-sm-0,\\n  .my-sm-0 {\\n    margin-top: 0 !important;\\n  }\\n  .mr-sm-0,\\n  .mx-sm-0 {\\n    margin-right: 0 !important;\\n  }\\n  .mb-sm-0,\\n  .my-sm-0 {\\n    margin-bottom: 0 !important;\\n  }\\n  .ml-sm-0,\\n  .mx-sm-0 {\\n    margin-left: 0 !important;\\n  }\\n  .m-sm-1 {\\n    margin: 0.25rem !important;\\n  }\\n  .mt-sm-1,\\n  .my-sm-1 {\\n    margin-top: 0.25rem !important;\\n  }\\n  .mr-sm-1,\\n  .mx-sm-1 {\\n    margin-right: 0.25rem !important;\\n  }\\n  .mb-sm-1,\\n  .my-sm-1 {\\n    margin-bottom: 0.25rem !important;\\n  }\\n  .ml-sm-1,\\n  .mx-sm-1 {\\n    margin-left: 0.25rem !important;\\n  }\\n  .m-sm-2 {\\n    margin: 0.5rem !important;\\n  }\\n  .mt-sm-2,\\n  .my-sm-2 {\\n    margin-top: 0.5rem !important;\\n  }\\n  .mr-sm-2,\\n  .mx-sm-2 {\\n    margin-right: 0.5rem !important;\\n  }\\n  .mb-sm-2,\\n  .my-sm-2 {\\n    margin-bottom: 0.5rem !important;\\n  }\\n  .ml-sm-2,\\n  .mx-sm-2 {\\n    margin-left: 0.5rem !important;\\n  }\\n  .m-sm-3 {\\n    margin: 1rem !important;\\n  }\\n  .mt-sm-3,\\n  .my-sm-3 {\\n    margin-top: 1rem !important;\\n  }\\n  .mr-sm-3,\\n  .mx-sm-3 {\\n    margin-right: 1rem !important;\\n  }\\n  .mb-sm-3,\\n  .my-sm-3 {\\n    margin-bottom: 1rem !important;\\n  }\\n  .ml-sm-3,\\n  .mx-sm-3 {\\n    margin-left: 1rem !important;\\n  }\\n  .m-sm-4 {\\n    margin: 1.5rem !important;\\n  }\\n  .mt-sm-4,\\n  .my-sm-4 {\\n    margin-top: 1.5rem !important;\\n  }\\n  .mr-sm-4,\\n  .mx-sm-4 {\\n    margin-right: 1.5rem !important;\\n  }\\n  .mb-sm-4,\\n  .my-sm-4 {\\n    margin-bottom: 1.5rem !important;\\n  }\\n  .ml-sm-4,\\n  .mx-sm-4 {\\n    margin-left: 1.5rem !important;\\n  }\\n  .m-sm-5 {\\n    margin: 3rem !important;\\n  }\\n  .mt-sm-5,\\n  .my-sm-5 {\\n    margin-top: 3rem !important;\\n  }\\n  .mr-sm-5,\\n  .mx-sm-5 {\\n    margin-right: 3rem !important;\\n  }\\n  .mb-sm-5,\\n  .my-sm-5 {\\n    margin-bottom: 3rem !important;\\n  }\\n  .ml-sm-5,\\n  .mx-sm-5 {\\n    margin-left: 3rem !important;\\n  }\\n  .p-sm-0 {\\n    padding: 0 !important;\\n  }\\n  .pt-sm-0,\\n  .py-sm-0 {\\n    padding-top: 0 !important;\\n  }\\n  .pr-sm-0,\\n  .px-sm-0 {\\n    padding-right: 0 !important;\\n  }\\n  .pb-sm-0,\\n  .py-sm-0 {\\n    padding-bottom: 0 !important;\\n  }\\n  .pl-sm-0,\\n  .px-sm-0 {\\n    padding-left: 0 !important;\\n  }\\n  .p-sm-1 {\\n    padding: 0.25rem !important;\\n  }\\n  .pt-sm-1,\\n  .py-sm-1 {\\n    padding-top: 0.25rem !important;\\n  }\\n  .pr-sm-1,\\n  .px-sm-1 {\\n    padding-right: 0.25rem !important;\\n  }\\n  .pb-sm-1,\\n  .py-sm-1 {\\n    padding-bottom: 0.25rem !important;\\n  }\\n  .pl-sm-1,\\n  .px-sm-1 {\\n    padding-left: 0.25rem !important;\\n  }\\n  .p-sm-2 {\\n    padding: 0.5rem !important;\\n  }\\n  .pt-sm-2,\\n  .py-sm-2 {\\n    padding-top: 0.5rem !important;\\n  }\\n  .pr-sm-2,\\n  .px-sm-2 {\\n    padding-right: 0.5rem !important;\\n  }\\n  .pb-sm-2,\\n  .py-sm-2 {\\n    padding-bottom: 0.5rem !important;\\n  }\\n  .pl-sm-2,\\n  .px-sm-2 {\\n    padding-left: 0.5rem !important;\\n  }\\n  .p-sm-3 {\\n    padding: 1rem !important;\\n  }\\n  .pt-sm-3,\\n  .py-sm-3 {\\n    padding-top: 1rem !important;\\n  }\\n  .pr-sm-3,\\n  .px-sm-3 {\\n    padding-right: 1rem !important;\\n  }\\n  .pb-sm-3,\\n  .py-sm-3 {\\n    padding-bottom: 1rem !important;\\n  }\\n  .pl-sm-3,\\n  .px-sm-3 {\\n    padding-left: 1rem !important;\\n  }\\n  .p-sm-4 {\\n    padding: 1.5rem !important;\\n  }\\n  .pt-sm-4,\\n  .py-sm-4 {\\n    padding-top: 1.5rem !important;\\n  }\\n  .pr-sm-4,\\n  .px-sm-4 {\\n    padding-right: 1.5rem !important;\\n  }\\n  .pb-sm-4,\\n  .py-sm-4 {\\n    padding-bottom: 1.5rem !important;\\n  }\\n  .pl-sm-4,\\n  .px-sm-4 {\\n    padding-left: 1.5rem !important;\\n  }\\n  .p-sm-5 {\\n    padding: 3rem !important;\\n  }\\n  .pt-sm-5,\\n  .py-sm-5 {\\n    padding-top: 3rem !important;\\n  }\\n  .pr-sm-5,\\n  .px-sm-5 {\\n    padding-right: 3rem !important;\\n  }\\n  .pb-sm-5,\\n  .py-sm-5 {\\n    padding-bottom: 3rem !important;\\n  }\\n  .pl-sm-5,\\n  .px-sm-5 {\\n    padding-left: 3rem !important;\\n  }\\n  .m-sm-n1 {\\n    margin: -0.25rem !important;\\n  }\\n  .mt-sm-n1,\\n  .my-sm-n1 {\\n    margin-top: -0.25rem !important;\\n  }\\n  .mr-sm-n1,\\n  .mx-sm-n1 {\\n    margin-right: -0.25rem !important;\\n  }\\n  .mb-sm-n1,\\n  .my-sm-n1 {\\n    margin-bottom: -0.25rem !important;\\n  }\\n  .ml-sm-n1,\\n  .mx-sm-n1 {\\n    margin-left: -0.25rem !important;\\n  }\\n  .m-sm-n2 {\\n    margin: -0.5rem !important;\\n  }\\n  .mt-sm-n2,\\n  .my-sm-n2 {\\n    margin-top: -0.5rem !important;\\n  }\\n  .mr-sm-n2,\\n  .mx-sm-n2 {\\n    margin-right: -0.5rem !important;\\n  }\\n  .mb-sm-n2,\\n  .my-sm-n2 {\\n    margin-bottom: -0.5rem !important;\\n  }\\n  .ml-sm-n2,\\n  .mx-sm-n2 {\\n    margin-left: -0.5rem !important;\\n  }\\n  .m-sm-n3 {\\n    margin: -1rem !important;\\n  }\\n  .mt-sm-n3,\\n  .my-sm-n3 {\\n    margin-top: -1rem !important;\\n  }\\n  .mr-sm-n3,\\n  .mx-sm-n3 {\\n    margin-right: -1rem !important;\\n  }\\n  .mb-sm-n3,\\n  .my-sm-n3 {\\n    margin-bottom: -1rem !important;\\n  }\\n  .ml-sm-n3,\\n  .mx-sm-n3 {\\n    margin-left: -1rem !important;\\n  }\\n  .m-sm-n4 {\\n    margin: -1.5rem !important;\\n  }\\n  .mt-sm-n4,\\n  .my-sm-n4 {\\n    margin-top: -1.5rem !important;\\n  }\\n  .mr-sm-n4,\\n  .mx-sm-n4 {\\n    margin-right: -1.5rem !important;\\n  }\\n  .mb-sm-n4,\\n  .my-sm-n4 {\\n    margin-bottom: -1.5rem !important;\\n  }\\n  .ml-sm-n4,\\n  .mx-sm-n4 {\\n    margin-left: -1.5rem !important;\\n  }\\n  .m-sm-n5 {\\n    margin: -3rem !important;\\n  }\\n  .mt-sm-n5,\\n  .my-sm-n5 {\\n    margin-top: -3rem !important;\\n  }\\n  .mr-sm-n5,\\n  .mx-sm-n5 {\\n    margin-right: -3rem !important;\\n  }\\n  .mb-sm-n5,\\n  .my-sm-n5 {\\n    margin-bottom: -3rem !important;\\n  }\\n  .ml-sm-n5,\\n  .mx-sm-n5 {\\n    margin-left: -3rem !important;\\n  }\\n  .m-sm-auto {\\n    margin: auto !important;\\n  }\\n  .mt-sm-auto,\\n  .my-sm-auto {\\n    margin-top: auto !important;\\n  }\\n  .mr-sm-auto,\\n  .mx-sm-auto {\\n    margin-right: auto !important;\\n  }\\n  .mb-sm-auto,\\n  .my-sm-auto {\\n    margin-bottom: auto !important;\\n  }\\n  .ml-sm-auto,\\n  .mx-sm-auto {\\n    margin-left: auto !important;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .m-md-0 {\\n    margin: 0 !important;\\n  }\\n  .mt-md-0,\\n  .my-md-0 {\\n    margin-top: 0 !important;\\n  }\\n  .mr-md-0,\\n  .mx-md-0 {\\n    margin-right: 0 !important;\\n  }\\n  .mb-md-0,\\n  .my-md-0 {\\n    margin-bottom: 0 !important;\\n  }\\n  .ml-md-0,\\n  .mx-md-0 {\\n    margin-left: 0 !important;\\n  }\\n  .m-md-1 {\\n    margin: 0.25rem !important;\\n  }\\n  .mt-md-1,\\n  .my-md-1 {\\n    margin-top: 0.25rem !important;\\n  }\\n  .mr-md-1,\\n  .mx-md-1 {\\n    margin-right: 0.25rem !important;\\n  }\\n  .mb-md-1,\\n  .my-md-1 {\\n    margin-bottom: 0.25rem !important;\\n  }\\n  .ml-md-1,\\n  .mx-md-1 {\\n    margin-left: 0.25rem !important;\\n  }\\n  .m-md-2 {\\n    margin: 0.5rem !important;\\n  }\\n  .mt-md-2,\\n  .my-md-2 {\\n    margin-top: 0.5rem !important;\\n  }\\n  .mr-md-2,\\n  .mx-md-2 {\\n    margin-right: 0.5rem !important;\\n  }\\n  .mb-md-2,\\n  .my-md-2 {\\n    margin-bottom: 0.5rem !important;\\n  }\\n  .ml-md-2,\\n  .mx-md-2 {\\n    margin-left: 0.5rem !important;\\n  }\\n  .m-md-3 {\\n    margin: 1rem !important;\\n  }\\n  .mt-md-3,\\n  .my-md-3 {\\n    margin-top: 1rem !important;\\n  }\\n  .mr-md-3,\\n  .mx-md-3 {\\n    margin-right: 1rem !important;\\n  }\\n  .mb-md-3,\\n  .my-md-3 {\\n    margin-bottom: 1rem !important;\\n  }\\n  .ml-md-3,\\n  .mx-md-3 {\\n    margin-left: 1rem !important;\\n  }\\n  .m-md-4 {\\n    margin: 1.5rem !important;\\n  }\\n  .mt-md-4,\\n  .my-md-4 {\\n    margin-top: 1.5rem !important;\\n  }\\n  .mr-md-4,\\n  .mx-md-4 {\\n    margin-right: 1.5rem !important;\\n  }\\n  .mb-md-4,\\n  .my-md-4 {\\n    margin-bottom: 1.5rem !important;\\n  }\\n  .ml-md-4,\\n  .mx-md-4 {\\n    margin-left: 1.5rem !important;\\n  }\\n  .m-md-5 {\\n    margin: 3rem !important;\\n  }\\n  .mt-md-5,\\n  .my-md-5 {\\n    margin-top: 3rem !important;\\n  }\\n  .mr-md-5,\\n  .mx-md-5 {\\n    margin-right: 3rem !important;\\n  }\\n  .mb-md-5,\\n  .my-md-5 {\\n    margin-bottom: 3rem !important;\\n  }\\n  .ml-md-5,\\n  .mx-md-5 {\\n    margin-left: 3rem !important;\\n  }\\n  .p-md-0 {\\n    padding: 0 !important;\\n  }\\n  .pt-md-0,\\n  .py-md-0 {\\n    padding-top: 0 !important;\\n  }\\n  .pr-md-0,\\n  .px-md-0 {\\n    padding-right: 0 !important;\\n  }\\n  .pb-md-0,\\n  .py-md-0 {\\n    padding-bottom: 0 !important;\\n  }\\n  .pl-md-0,\\n  .px-md-0 {\\n    padding-left: 0 !important;\\n  }\\n  .p-md-1 {\\n    padding: 0.25rem !important;\\n  }\\n  .pt-md-1,\\n  .py-md-1 {\\n    padding-top: 0.25rem !important;\\n  }\\n  .pr-md-1,\\n  .px-md-1 {\\n    padding-right: 0.25rem !important;\\n  }\\n  .pb-md-1,\\n  .py-md-1 {\\n    padding-bottom: 0.25rem !important;\\n  }\\n  .pl-md-1,\\n  .px-md-1 {\\n    padding-left: 0.25rem !important;\\n  }\\n  .p-md-2 {\\n    padding: 0.5rem !important;\\n  }\\n  .pt-md-2,\\n  .py-md-2 {\\n    padding-top: 0.5rem !important;\\n  }\\n  .pr-md-2,\\n  .px-md-2 {\\n    padding-right: 0.5rem !important;\\n  }\\n  .pb-md-2,\\n  .py-md-2 {\\n    padding-bottom: 0.5rem !important;\\n  }\\n  .pl-md-2,\\n  .px-md-2 {\\n    padding-left: 0.5rem !important;\\n  }\\n  .p-md-3 {\\n    padding: 1rem !important;\\n  }\\n  .pt-md-3,\\n  .py-md-3 {\\n    padding-top: 1rem !important;\\n  }\\n  .pr-md-3,\\n  .px-md-3 {\\n    padding-right: 1rem !important;\\n  }\\n  .pb-md-3,\\n  .py-md-3 {\\n    padding-bottom: 1rem !important;\\n  }\\n  .pl-md-3,\\n  .px-md-3 {\\n    padding-left: 1rem !important;\\n  }\\n  .p-md-4 {\\n    padding: 1.5rem !important;\\n  }\\n  .pt-md-4,\\n  .py-md-4 {\\n    padding-top: 1.5rem !important;\\n  }\\n  .pr-md-4,\\n  .px-md-4 {\\n    padding-right: 1.5rem !important;\\n  }\\n  .pb-md-4,\\n  .py-md-4 {\\n    padding-bottom: 1.5rem !important;\\n  }\\n  .pl-md-4,\\n  .px-md-4 {\\n    padding-left: 1.5rem !important;\\n  }\\n  .p-md-5 {\\n    padding: 3rem !important;\\n  }\\n  .pt-md-5,\\n  .py-md-5 {\\n    padding-top: 3rem !important;\\n  }\\n  .pr-md-5,\\n  .px-md-5 {\\n    padding-right: 3rem !important;\\n  }\\n  .pb-md-5,\\n  .py-md-5 {\\n    padding-bottom: 3rem !important;\\n  }\\n  .pl-md-5,\\n  .px-md-5 {\\n    padding-left: 3rem !important;\\n  }\\n  .m-md-n1 {\\n    margin: -0.25rem !important;\\n  }\\n  .mt-md-n1,\\n  .my-md-n1 {\\n    margin-top: -0.25rem !important;\\n  }\\n  .mr-md-n1,\\n  .mx-md-n1 {\\n    margin-right: -0.25rem !important;\\n  }\\n  .mb-md-n1,\\n  .my-md-n1 {\\n    margin-bottom: -0.25rem !important;\\n  }\\n  .ml-md-n1,\\n  .mx-md-n1 {\\n    margin-left: -0.25rem !important;\\n  }\\n  .m-md-n2 {\\n    margin: -0.5rem !important;\\n  }\\n  .mt-md-n2,\\n  .my-md-n2 {\\n    margin-top: -0.5rem !important;\\n  }\\n  .mr-md-n2,\\n  .mx-md-n2 {\\n    margin-right: -0.5rem !important;\\n  }\\n  .mb-md-n2,\\n  .my-md-n2 {\\n    margin-bottom: -0.5rem !important;\\n  }\\n  .ml-md-n2,\\n  .mx-md-n2 {\\n    margin-left: -0.5rem !important;\\n  }\\n  .m-md-n3 {\\n    margin: -1rem !important;\\n  }\\n  .mt-md-n3,\\n  .my-md-n3 {\\n    margin-top: -1rem !important;\\n  }\\n  .mr-md-n3,\\n  .mx-md-n3 {\\n    margin-right: -1rem !important;\\n  }\\n  .mb-md-n3,\\n  .my-md-n3 {\\n    margin-bottom: -1rem !important;\\n  }\\n  .ml-md-n3,\\n  .mx-md-n3 {\\n    margin-left: -1rem !important;\\n  }\\n  .m-md-n4 {\\n    margin: -1.5rem !important;\\n  }\\n  .mt-md-n4,\\n  .my-md-n4 {\\n    margin-top: -1.5rem !important;\\n  }\\n  .mr-md-n4,\\n  .mx-md-n4 {\\n    margin-right: -1.5rem !important;\\n  }\\n  .mb-md-n4,\\n  .my-md-n4 {\\n    margin-bottom: -1.5rem !important;\\n  }\\n  .ml-md-n4,\\n  .mx-md-n4 {\\n    margin-left: -1.5rem !important;\\n  }\\n  .m-md-n5 {\\n    margin: -3rem !important;\\n  }\\n  .mt-md-n5,\\n  .my-md-n5 {\\n    margin-top: -3rem !important;\\n  }\\n  .mr-md-n5,\\n  .mx-md-n5 {\\n    margin-right: -3rem !important;\\n  }\\n  .mb-md-n5,\\n  .my-md-n5 {\\n    margin-bottom: -3rem !important;\\n  }\\n  .ml-md-n5,\\n  .mx-md-n5 {\\n    margin-left: -3rem !important;\\n  }\\n  .m-md-auto {\\n    margin: auto !important;\\n  }\\n  .mt-md-auto,\\n  .my-md-auto {\\n    margin-top: auto !important;\\n  }\\n  .mr-md-auto,\\n  .mx-md-auto {\\n    margin-right: auto !important;\\n  }\\n  .mb-md-auto,\\n  .my-md-auto {\\n    margin-bottom: auto !important;\\n  }\\n  .ml-md-auto,\\n  .mx-md-auto {\\n    margin-left: auto !important;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .m-lg-0 {\\n    margin: 0 !important;\\n  }\\n  .mt-lg-0,\\n  .my-lg-0 {\\n    margin-top: 0 !important;\\n  }\\n  .mr-lg-0,\\n  .mx-lg-0 {\\n    margin-right: 0 !important;\\n  }\\n  .mb-lg-0,\\n  .my-lg-0 {\\n    margin-bottom: 0 !important;\\n  }\\n  .ml-lg-0,\\n  .mx-lg-0 {\\n    margin-left: 0 !important;\\n  }\\n  .m-lg-1 {\\n    margin: 0.25rem !important;\\n  }\\n  .mt-lg-1,\\n  .my-lg-1 {\\n    margin-top: 0.25rem !important;\\n  }\\n  .mr-lg-1,\\n  .mx-lg-1 {\\n    margin-right: 0.25rem !important;\\n  }\\n  .mb-lg-1,\\n  .my-lg-1 {\\n    margin-bottom: 0.25rem !important;\\n  }\\n  .ml-lg-1,\\n  .mx-lg-1 {\\n    margin-left: 0.25rem !important;\\n  }\\n  .m-lg-2 {\\n    margin: 0.5rem !important;\\n  }\\n  .mt-lg-2,\\n  .my-lg-2 {\\n    margin-top: 0.5rem !important;\\n  }\\n  .mr-lg-2,\\n  .mx-lg-2 {\\n    margin-right: 0.5rem !important;\\n  }\\n  .mb-lg-2,\\n  .my-lg-2 {\\n    margin-bottom: 0.5rem !important;\\n  }\\n  .ml-lg-2,\\n  .mx-lg-2 {\\n    margin-left: 0.5rem !important;\\n  }\\n  .m-lg-3 {\\n    margin: 1rem !important;\\n  }\\n  .mt-lg-3,\\n  .my-lg-3 {\\n    margin-top: 1rem !important;\\n  }\\n  .mr-lg-3,\\n  .mx-lg-3 {\\n    margin-right: 1rem !important;\\n  }\\n  .mb-lg-3,\\n  .my-lg-3 {\\n    margin-bottom: 1rem !important;\\n  }\\n  .ml-lg-3,\\n  .mx-lg-3 {\\n    margin-left: 1rem !important;\\n  }\\n  .m-lg-4 {\\n    margin: 1.5rem !important;\\n  }\\n  .mt-lg-4,\\n  .my-lg-4 {\\n    margin-top: 1.5rem !important;\\n  }\\n  .mr-lg-4,\\n  .mx-lg-4 {\\n    margin-right: 1.5rem !important;\\n  }\\n  .mb-lg-4,\\n  .my-lg-4 {\\n    margin-bottom: 1.5rem !important;\\n  }\\n  .ml-lg-4,\\n  .mx-lg-4 {\\n    margin-left: 1.5rem !important;\\n  }\\n  .m-lg-5 {\\n    margin: 3rem !important;\\n  }\\n  .mt-lg-5,\\n  .my-lg-5 {\\n    margin-top: 3rem !important;\\n  }\\n  .mr-lg-5,\\n  .mx-lg-5 {\\n    margin-right: 3rem !important;\\n  }\\n  .mb-lg-5,\\n  .my-lg-5 {\\n    margin-bottom: 3rem !important;\\n  }\\n  .ml-lg-5,\\n  .mx-lg-5 {\\n    margin-left: 3rem !important;\\n  }\\n  .p-lg-0 {\\n    padding: 0 !important;\\n  }\\n  .pt-lg-0,\\n  .py-lg-0 {\\n    padding-top: 0 !important;\\n  }\\n  .pr-lg-0,\\n  .px-lg-0 {\\n    padding-right: 0 !important;\\n  }\\n  .pb-lg-0,\\n  .py-lg-0 {\\n    padding-bottom: 0 !important;\\n  }\\n  .pl-lg-0,\\n  .px-lg-0 {\\n    padding-left: 0 !important;\\n  }\\n  .p-lg-1 {\\n    padding: 0.25rem !important;\\n  }\\n  .pt-lg-1,\\n  .py-lg-1 {\\n    padding-top: 0.25rem !important;\\n  }\\n  .pr-lg-1,\\n  .px-lg-1 {\\n    padding-right: 0.25rem !important;\\n  }\\n  .pb-lg-1,\\n  .py-lg-1 {\\n    padding-bottom: 0.25rem !important;\\n  }\\n  .pl-lg-1,\\n  .px-lg-1 {\\n    padding-left: 0.25rem !important;\\n  }\\n  .p-lg-2 {\\n    padding: 0.5rem !important;\\n  }\\n  .pt-lg-2,\\n  .py-lg-2 {\\n    padding-top: 0.5rem !important;\\n  }\\n  .pr-lg-2,\\n  .px-lg-2 {\\n    padding-right: 0.5rem !important;\\n  }\\n  .pb-lg-2,\\n  .py-lg-2 {\\n    padding-bottom: 0.5rem !important;\\n  }\\n  .pl-lg-2,\\n  .px-lg-2 {\\n    padding-left: 0.5rem !important;\\n  }\\n  .p-lg-3 {\\n    padding: 1rem !important;\\n  }\\n  .pt-lg-3,\\n  .py-lg-3 {\\n    padding-top: 1rem !important;\\n  }\\n  .pr-lg-3,\\n  .px-lg-3 {\\n    padding-right: 1rem !important;\\n  }\\n  .pb-lg-3,\\n  .py-lg-3 {\\n    padding-bottom: 1rem !important;\\n  }\\n  .pl-lg-3,\\n  .px-lg-3 {\\n    padding-left: 1rem !important;\\n  }\\n  .p-lg-4 {\\n    padding: 1.5rem !important;\\n  }\\n  .pt-lg-4,\\n  .py-lg-4 {\\n    padding-top: 1.5rem !important;\\n  }\\n  .pr-lg-4,\\n  .px-lg-4 {\\n    padding-right: 1.5rem !important;\\n  }\\n  .pb-lg-4,\\n  .py-lg-4 {\\n    padding-bottom: 1.5rem !important;\\n  }\\n  .pl-lg-4,\\n  .px-lg-4 {\\n    padding-left: 1.5rem !important;\\n  }\\n  .p-lg-5 {\\n    padding: 3rem !important;\\n  }\\n  .pt-lg-5,\\n  .py-lg-5 {\\n    padding-top: 3rem !important;\\n  }\\n  .pr-lg-5,\\n  .px-lg-5 {\\n    padding-right: 3rem !important;\\n  }\\n  .pb-lg-5,\\n  .py-lg-5 {\\n    padding-bottom: 3rem !important;\\n  }\\n  .pl-lg-5,\\n  .px-lg-5 {\\n    padding-left: 3rem !important;\\n  }\\n  .m-lg-n1 {\\n    margin: -0.25rem !important;\\n  }\\n  .mt-lg-n1,\\n  .my-lg-n1 {\\n    margin-top: -0.25rem !important;\\n  }\\n  .mr-lg-n1,\\n  .mx-lg-n1 {\\n    margin-right: -0.25rem !important;\\n  }\\n  .mb-lg-n1,\\n  .my-lg-n1 {\\n    margin-bottom: -0.25rem !important;\\n  }\\n  .ml-lg-n1,\\n  .mx-lg-n1 {\\n    margin-left: -0.25rem !important;\\n  }\\n  .m-lg-n2 {\\n    margin: -0.5rem !important;\\n  }\\n  .mt-lg-n2,\\n  .my-lg-n2 {\\n    margin-top: -0.5rem !important;\\n  }\\n  .mr-lg-n2,\\n  .mx-lg-n2 {\\n    margin-right: -0.5rem !important;\\n  }\\n  .mb-lg-n2,\\n  .my-lg-n2 {\\n    margin-bottom: -0.5rem !important;\\n  }\\n  .ml-lg-n2,\\n  .mx-lg-n2 {\\n    margin-left: -0.5rem !important;\\n  }\\n  .m-lg-n3 {\\n    margin: -1rem !important;\\n  }\\n  .mt-lg-n3,\\n  .my-lg-n3 {\\n    margin-top: -1rem !important;\\n  }\\n  .mr-lg-n3,\\n  .mx-lg-n3 {\\n    margin-right: -1rem !important;\\n  }\\n  .mb-lg-n3,\\n  .my-lg-n3 {\\n    margin-bottom: -1rem !important;\\n  }\\n  .ml-lg-n3,\\n  .mx-lg-n3 {\\n    margin-left: -1rem !important;\\n  }\\n  .m-lg-n4 {\\n    margin: -1.5rem !important;\\n  }\\n  .mt-lg-n4,\\n  .my-lg-n4 {\\n    margin-top: -1.5rem !important;\\n  }\\n  .mr-lg-n4,\\n  .mx-lg-n4 {\\n    margin-right: -1.5rem !important;\\n  }\\n  .mb-lg-n4,\\n  .my-lg-n4 {\\n    margin-bottom: -1.5rem !important;\\n  }\\n  .ml-lg-n4,\\n  .mx-lg-n4 {\\n    margin-left: -1.5rem !important;\\n  }\\n  .m-lg-n5 {\\n    margin: -3rem !important;\\n  }\\n  .mt-lg-n5,\\n  .my-lg-n5 {\\n    margin-top: -3rem !important;\\n  }\\n  .mr-lg-n5,\\n  .mx-lg-n5 {\\n    margin-right: -3rem !important;\\n  }\\n  .mb-lg-n5,\\n  .my-lg-n5 {\\n    margin-bottom: -3rem !important;\\n  }\\n  .ml-lg-n5,\\n  .mx-lg-n5 {\\n    margin-left: -3rem !important;\\n  }\\n  .m-lg-auto {\\n    margin: auto !important;\\n  }\\n  .mt-lg-auto,\\n  .my-lg-auto {\\n    margin-top: auto !important;\\n  }\\n  .mr-lg-auto,\\n  .mx-lg-auto {\\n    margin-right: auto !important;\\n  }\\n  .mb-lg-auto,\\n  .my-lg-auto {\\n    margin-bottom: auto !important;\\n  }\\n  .ml-lg-auto,\\n  .mx-lg-auto {\\n    margin-left: auto !important;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .m-xl-0 {\\n    margin: 0 !important;\\n  }\\n  .mt-xl-0,\\n  .my-xl-0 {\\n    margin-top: 0 !important;\\n  }\\n  .mr-xl-0,\\n  .mx-xl-0 {\\n    margin-right: 0 !important;\\n  }\\n  .mb-xl-0,\\n  .my-xl-0 {\\n    margin-bottom: 0 !important;\\n  }\\n  .ml-xl-0,\\n  .mx-xl-0 {\\n    margin-left: 0 !important;\\n  }\\n  .m-xl-1 {\\n    margin: 0.25rem !important;\\n  }\\n  .mt-xl-1,\\n  .my-xl-1 {\\n    margin-top: 0.25rem !important;\\n  }\\n  .mr-xl-1,\\n  .mx-xl-1 {\\n    margin-right: 0.25rem !important;\\n  }\\n  .mb-xl-1,\\n  .my-xl-1 {\\n    margin-bottom: 0.25rem !important;\\n  }\\n  .ml-xl-1,\\n  .mx-xl-1 {\\n    margin-left: 0.25rem !important;\\n  }\\n  .m-xl-2 {\\n    margin: 0.5rem !important;\\n  }\\n  .mt-xl-2,\\n  .my-xl-2 {\\n    margin-top: 0.5rem !important;\\n  }\\n  .mr-xl-2,\\n  .mx-xl-2 {\\n    margin-right: 0.5rem !important;\\n  }\\n  .mb-xl-2,\\n  .my-xl-2 {\\n    margin-bottom: 0.5rem !important;\\n  }\\n  .ml-xl-2,\\n  .mx-xl-2 {\\n    margin-left: 0.5rem !important;\\n  }\\n  .m-xl-3 {\\n    margin: 1rem !important;\\n  }\\n  .mt-xl-3,\\n  .my-xl-3 {\\n    margin-top: 1rem !important;\\n  }\\n  .mr-xl-3,\\n  .mx-xl-3 {\\n    margin-right: 1rem !important;\\n  }\\n  .mb-xl-3,\\n  .my-xl-3 {\\n    margin-bottom: 1rem !important;\\n  }\\n  .ml-xl-3,\\n  .mx-xl-3 {\\n    margin-left: 1rem !important;\\n  }\\n  .m-xl-4 {\\n    margin: 1.5rem !important;\\n  }\\n  .mt-xl-4,\\n  .my-xl-4 {\\n    margin-top: 1.5rem !important;\\n  }\\n  .mr-xl-4,\\n  .mx-xl-4 {\\n    margin-right: 1.5rem !important;\\n  }\\n  .mb-xl-4,\\n  .my-xl-4 {\\n    margin-bottom: 1.5rem !important;\\n  }\\n  .ml-xl-4,\\n  .mx-xl-4 {\\n    margin-left: 1.5rem !important;\\n  }\\n  .m-xl-5 {\\n    margin: 3rem !important;\\n  }\\n  .mt-xl-5,\\n  .my-xl-5 {\\n    margin-top: 3rem !important;\\n  }\\n  .mr-xl-5,\\n  .mx-xl-5 {\\n    margin-right: 3rem !important;\\n  }\\n  .mb-xl-5,\\n  .my-xl-5 {\\n    margin-bottom: 3rem !important;\\n  }\\n  .ml-xl-5,\\n  .mx-xl-5 {\\n    margin-left: 3rem !important;\\n  }\\n  .p-xl-0 {\\n    padding: 0 !important;\\n  }\\n  .pt-xl-0,\\n  .py-xl-0 {\\n    padding-top: 0 !important;\\n  }\\n  .pr-xl-0,\\n  .px-xl-0 {\\n    padding-right: 0 !important;\\n  }\\n  .pb-xl-0,\\n  .py-xl-0 {\\n    padding-bottom: 0 !important;\\n  }\\n  .pl-xl-0,\\n  .px-xl-0 {\\n    padding-left: 0 !important;\\n  }\\n  .p-xl-1 {\\n    padding: 0.25rem !important;\\n  }\\n  .pt-xl-1,\\n  .py-xl-1 {\\n    padding-top: 0.25rem !important;\\n  }\\n  .pr-xl-1,\\n  .px-xl-1 {\\n    padding-right: 0.25rem !important;\\n  }\\n  .pb-xl-1,\\n  .py-xl-1 {\\n    padding-bottom: 0.25rem !important;\\n  }\\n  .pl-xl-1,\\n  .px-xl-1 {\\n    padding-left: 0.25rem !important;\\n  }\\n  .p-xl-2 {\\n    padding: 0.5rem !important;\\n  }\\n  .pt-xl-2,\\n  .py-xl-2 {\\n    padding-top: 0.5rem !important;\\n  }\\n  .pr-xl-2,\\n  .px-xl-2 {\\n    padding-right: 0.5rem !important;\\n  }\\n  .pb-xl-2,\\n  .py-xl-2 {\\n    padding-bottom: 0.5rem !important;\\n  }\\n  .pl-xl-2,\\n  .px-xl-2 {\\n    padding-left: 0.5rem !important;\\n  }\\n  .p-xl-3 {\\n    padding: 1rem !important;\\n  }\\n  .pt-xl-3,\\n  .py-xl-3 {\\n    padding-top: 1rem !important;\\n  }\\n  .pr-xl-3,\\n  .px-xl-3 {\\n    padding-right: 1rem !important;\\n  }\\n  .pb-xl-3,\\n  .py-xl-3 {\\n    padding-bottom: 1rem !important;\\n  }\\n  .pl-xl-3,\\n  .px-xl-3 {\\n    padding-left: 1rem !important;\\n  }\\n  .p-xl-4 {\\n    padding: 1.5rem !important;\\n  }\\n  .pt-xl-4,\\n  .py-xl-4 {\\n    padding-top: 1.5rem !important;\\n  }\\n  .pr-xl-4,\\n  .px-xl-4 {\\n    padding-right: 1.5rem !important;\\n  }\\n  .pb-xl-4,\\n  .py-xl-4 {\\n    padding-bottom: 1.5rem !important;\\n  }\\n  .pl-xl-4,\\n  .px-xl-4 {\\n    padding-left: 1.5rem !important;\\n  }\\n  .p-xl-5 {\\n    padding: 3rem !important;\\n  }\\n  .pt-xl-5,\\n  .py-xl-5 {\\n    padding-top: 3rem !important;\\n  }\\n  .pr-xl-5,\\n  .px-xl-5 {\\n    padding-right: 3rem !important;\\n  }\\n  .pb-xl-5,\\n  .py-xl-5 {\\n    padding-bottom: 3rem !important;\\n  }\\n  .pl-xl-5,\\n  .px-xl-5 {\\n    padding-left: 3rem !important;\\n  }\\n  .m-xl-n1 {\\n    margin: -0.25rem !important;\\n  }\\n  .mt-xl-n1,\\n  .my-xl-n1 {\\n    margin-top: -0.25rem !important;\\n  }\\n  .mr-xl-n1,\\n  .mx-xl-n1 {\\n    margin-right: -0.25rem !important;\\n  }\\n  .mb-xl-n1,\\n  .my-xl-n1 {\\n    margin-bottom: -0.25rem !important;\\n  }\\n  .ml-xl-n1,\\n  .mx-xl-n1 {\\n    margin-left: -0.25rem !important;\\n  }\\n  .m-xl-n2 {\\n    margin: -0.5rem !important;\\n  }\\n  .mt-xl-n2,\\n  .my-xl-n2 {\\n    margin-top: -0.5rem !important;\\n  }\\n  .mr-xl-n2,\\n  .mx-xl-n2 {\\n    margin-right: -0.5rem !important;\\n  }\\n  .mb-xl-n2,\\n  .my-xl-n2 {\\n    margin-bottom: -0.5rem !important;\\n  }\\n  .ml-xl-n2,\\n  .mx-xl-n2 {\\n    margin-left: -0.5rem !important;\\n  }\\n  .m-xl-n3 {\\n    margin: -1rem !important;\\n  }\\n  .mt-xl-n3,\\n  .my-xl-n3 {\\n    margin-top: -1rem !important;\\n  }\\n  .mr-xl-n3,\\n  .mx-xl-n3 {\\n    margin-right: -1rem !important;\\n  }\\n  .mb-xl-n3,\\n  .my-xl-n3 {\\n    margin-bottom: -1rem !important;\\n  }\\n  .ml-xl-n3,\\n  .mx-xl-n3 {\\n    margin-left: -1rem !important;\\n  }\\n  .m-xl-n4 {\\n    margin: -1.5rem !important;\\n  }\\n  .mt-xl-n4,\\n  .my-xl-n4 {\\n    margin-top: -1.5rem !important;\\n  }\\n  .mr-xl-n4,\\n  .mx-xl-n4 {\\n    margin-right: -1.5rem !important;\\n  }\\n  .mb-xl-n4,\\n  .my-xl-n4 {\\n    margin-bottom: -1.5rem !important;\\n  }\\n  .ml-xl-n4,\\n  .mx-xl-n4 {\\n    margin-left: -1.5rem !important;\\n  }\\n  .m-xl-n5 {\\n    margin: -3rem !important;\\n  }\\n  .mt-xl-n5,\\n  .my-xl-n5 {\\n    margin-top: -3rem !important;\\n  }\\n  .mr-xl-n5,\\n  .mx-xl-n5 {\\n    margin-right: -3rem !important;\\n  }\\n  .mb-xl-n5,\\n  .my-xl-n5 {\\n    margin-bottom: -3rem !important;\\n  }\\n  .ml-xl-n5,\\n  .mx-xl-n5 {\\n    margin-left: -3rem !important;\\n  }\\n  .m-xl-auto {\\n    margin: auto !important;\\n  }\\n  .mt-xl-auto,\\n  .my-xl-auto {\\n    margin-top: auto !important;\\n  }\\n  .mr-xl-auto,\\n  .mx-xl-auto {\\n    margin-right: auto !important;\\n  }\\n  .mb-xl-auto,\\n  .my-xl-auto {\\n    margin-bottom: auto !important;\\n  }\\n  .ml-xl-auto,\\n  .mx-xl-auto {\\n    margin-left: auto !important;\\n  }\\n}\\n/*# sourceMappingURL=bootstrap-grid.css.map */\",\"// Container widths\\n//\\n// Set the container width, and override it for fixed navbars in media queries.\\n\\n@if $enable-grid-classes {\\n  .container {\\n    @include make-container();\\n    @include make-container-max-widths();\\n  }\\n}\\n\\n// Fluid container\\n//\\n// Utilizes the mixin meant for fixed width containers, but with 100% width for\\n// fluid, full width layouts.\\n\\n@if $enable-grid-classes {\\n  .container-fluid {\\n    @include make-container();\\n  }\\n}\\n\\n// Row\\n//\\n// Rows contain and clear the floats of your columns.\\n\\n@if $enable-grid-classes {\\n  .row {\\n    @include make-row();\\n  }\\n\\n  // Remove the negative margin from default .row, then the horizontal padding\\n  // from all immediate children columns (to prevent runaway style inheritance).\\n  .no-gutters {\\n    margin-right: 0;\\n    margin-left: 0;\\n\\n    > .col,\\n    > [class*=\\\"col-\\\"] {\\n      padding-right: 0;\\n      padding-left: 0;\\n    }\\n  }\\n}\\n\\n// Columns\\n//\\n// Common styles for small and large grid columns\\n\\n@if $enable-grid-classes {\\n  @include make-grid-columns();\\n}\\n\",\"/// Grid system\\n//\\n// Generate semantic grid columns with these mixins.\\n\\n@mixin make-container($gutter: $grid-gutter-width) {\\n  width: 100%;\\n  padding-right: $gutter / 2;\\n  padding-left: $gutter / 2;\\n  margin-right: auto;\\n  margin-left: auto;\\n}\\n\\n\\n// For each breakpoint, define the maximum width of the container in a media query\\n@mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) {\\n  @each $breakpoint, $container-max-width in $max-widths {\\n    @include media-breakpoint-up($breakpoint, $breakpoints) {\\n      max-width: $container-max-width;\\n    }\\n  }\\n}\\n\\n@mixin make-row($gutter: $grid-gutter-width) {\\n  display: flex;\\n  flex-wrap: wrap;\\n  margin-right: -$gutter / 2;\\n  margin-left: -$gutter / 2;\\n}\\n\\n@mixin make-col-ready($gutter: $grid-gutter-width) {\\n  position: relative;\\n  // Prevent columns from becoming too narrow when at smaller grid tiers by\\n  // always setting `width: 100%;`. This works because we use `flex` values\\n  // later on to override this initial width.\\n  width: 100%;\\n  padding-right: $gutter / 2;\\n  padding-left: $gutter / 2;\\n}\\n\\n@mixin make-col($size, $columns: $grid-columns) {\\n  flex: 0 0 percentage($size / $columns);\\n  // Add a `max-width` to ensure content within each column does not blow out\\n  // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari\\n  // do not appear to require this.\\n  max-width: percentage($size / $columns);\\n}\\n\\n@mixin make-col-offset($size, $columns: $grid-columns) {\\n  $num: $size / $columns;\\n  margin-left: if($num == 0, 0, percentage($num));\\n}\\n\",\"// Breakpoint viewport sizes and media queries.\\n//\\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\\n//\\n//    (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)\\n//\\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\\n\\n// Name of the next breakpoint, or null for the last breakpoint.\\n//\\n//    >> breakpoint-next(sm)\\n//    md\\n//    >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\\n//    md\\n//    >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))\\n//    md\\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\\n  $n: index($breakpoint-names, $name);\\n  @return if($n != null and $n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\\n}\\n\\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\\n//\\n//    >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\\n//    576px\\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\\n  $min: map-get($breakpoints, $name);\\n  @return if($min != 0, $min, null);\\n}\\n\\n// Maximum breakpoint width. Null for the largest (last) breakpoint.\\n// The maximum value is calculated as the minimum of the next one less 0.02px\\n// to work around the limitations of `min-` and `max-` prefixes and viewports with fractional widths.\\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\\n//\\n//    >> breakpoint-max(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\\n//    767.98px\\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\\n  $next: breakpoint-next($name, $breakpoints);\\n  @return if($next, breakpoint-min($next, $breakpoints) - .02, null);\\n}\\n\\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\\n// Useful for making responsive utilities.\\n//\\n//    >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\\n//    \\\"\\\"  (Returns a blank string)\\n//    >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\\n//    \\\"-sm\\\"\\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\\n  @return if(breakpoint-min($name, $breakpoints) == null, \\\"\\\", \\\"-#{$name}\\\");\\n}\\n\\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\\n// Makes the @content apply to the given breakpoint and wider.\\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\\n  $min: breakpoint-min($name, $breakpoints);\\n  @if $min {\\n    @media (min-width: $min) {\\n      @content;\\n    }\\n  } @else {\\n    @content;\\n  }\\n}\\n\\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\\n// Makes the @content apply to the given breakpoint and narrower.\\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\\n  $max: breakpoint-max($name, $breakpoints);\\n  @if $max {\\n    @media (max-width: $max) {\\n      @content;\\n    }\\n  } @else {\\n    @content;\\n  }\\n}\\n\\n// Media that spans multiple breakpoint widths.\\n// Makes the @content apply between the min and max breakpoints\\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\\n  $min: breakpoint-min($lower, $breakpoints);\\n  $max: breakpoint-max($upper, $breakpoints);\\n\\n  @if $min != null and $max != null {\\n    @media (min-width: $min) and (max-width: $max) {\\n      @content;\\n    }\\n  } @else if $max == null {\\n    @include media-breakpoint-up($lower, $breakpoints) {\\n      @content;\\n    }\\n  } @else if $min == null {\\n    @include media-breakpoint-down($upper, $breakpoints) {\\n      @content;\\n    }\\n  }\\n}\\n\\n// Media between the breakpoint's minimum and maximum widths.\\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\\n  $min: breakpoint-min($name, $breakpoints);\\n  $max: breakpoint-max($name, $breakpoints);\\n\\n  @if $min != null and $max != null {\\n    @media (min-width: $min) and (max-width: $max) {\\n      @content;\\n    }\\n  } @else if $max == null {\\n    @include media-breakpoint-up($name, $breakpoints) {\\n      @content;\\n    }\\n  } @else if $min == null {\\n    @include media-breakpoint-down($name, $breakpoints) {\\n      @content;\\n    }\\n  }\\n}\\n\",\"// Framework grid generation\\n//\\n// Used only by Bootstrap to generate the correct number of grid classes given\\n// any value of `$grid-columns`.\\n\\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\\n  // Common properties for all breakpoints\\n  %grid-column {\\n    position: relative;\\n    width: 100%;\\n    padding-right: $gutter / 2;\\n    padding-left: $gutter / 2;\\n  }\\n\\n  @each $breakpoint in map-keys($breakpoints) {\\n    $infix: breakpoint-infix($breakpoint, $breakpoints);\\n\\n    // Allow columns to stretch full width below their breakpoints\\n    @for $i from 1 through $columns {\\n      .col#{$infix}-#{$i} {\\n        @extend %grid-column;\\n      }\\n    }\\n    .col#{$infix},\\n    .col#{$infix}-auto {\\n      @extend %grid-column;\\n    }\\n\\n    @include media-breakpoint-up($breakpoint, $breakpoints) {\\n      // Provide basic `.col-{bp}` classes for equal-width flexbox columns\\n      .col#{$infix} {\\n        flex-basis: 0;\\n        flex-grow: 1;\\n        max-width: 100%;\\n      }\\n      .col#{$infix}-auto {\\n        flex: 0 0 auto;\\n        width: auto;\\n        max-width: 100%; // Reset earlier grid tiers\\n      }\\n\\n      @for $i from 1 through $columns {\\n        .col#{$infix}-#{$i} {\\n          @include make-col($i, $columns);\\n        }\\n      }\\n\\n      .order#{$infix}-first { order: -1; }\\n\\n      .order#{$infix}-last { order: $columns + 1; }\\n\\n      @for $i from 0 through $columns {\\n        .order#{$infix}-#{$i} { order: $i; }\\n      }\\n\\n      // `$columns - 1` because offsetting by the width of an entire row isn't possible\\n      @for $i from 0 through ($columns - 1) {\\n        @if not ($infix == \\\"\\\" and $i == 0) { // Avoid emitting useless .offset-0\\n          .offset#{$infix}-#{$i} {\\n            @include make-col-offset($i, $columns);\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\n\",\"// stylelint-disable declaration-no-important\\n\\n//\\n// Utilities for common `display` values\\n//\\n\\n@each $breakpoint in map-keys($grid-breakpoints) {\\n  @include media-breakpoint-up($breakpoint) {\\n    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\\n\\n    @each $value in $displays {\\n      .d#{$infix}-#{$value} { display: $value !important; }\\n    }\\n  }\\n}\\n\\n\\n//\\n// Utilities for toggling `display` in print\\n//\\n\\n@media print {\\n  @each $value in $displays {\\n    .d-print-#{$value} { display: $value !important; }\\n  }\\n}\\n\",\"// stylelint-disable declaration-no-important\\n\\n// Flex variation\\n//\\n// Custom styles for additional flex alignment options.\\n\\n@each $breakpoint in map-keys($grid-breakpoints) {\\n  @include media-breakpoint-up($breakpoint) {\\n    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\\n\\n    .flex#{$infix}-row            { flex-direction: row !important; }\\n    .flex#{$infix}-column         { flex-direction: column !important; }\\n    .flex#{$infix}-row-reverse    { flex-direction: row-reverse !important; }\\n    .flex#{$infix}-column-reverse { flex-direction: column-reverse !important; }\\n\\n    .flex#{$infix}-wrap         { flex-wrap: wrap !important; }\\n    .flex#{$infix}-nowrap       { flex-wrap: nowrap !important; }\\n    .flex#{$infix}-wrap-reverse { flex-wrap: wrap-reverse !important; }\\n    .flex#{$infix}-fill         { flex: 1 1 auto !important; }\\n    .flex#{$infix}-grow-0       { flex-grow: 0 !important; }\\n    .flex#{$infix}-grow-1       { flex-grow: 1 !important; }\\n    .flex#{$infix}-shrink-0     { flex-shrink: 0 !important; }\\n    .flex#{$infix}-shrink-1     { flex-shrink: 1 !important; }\\n\\n    .justify-content#{$infix}-start   { justify-content: flex-start !important; }\\n    .justify-content#{$infix}-end     { justify-content: flex-end !important; }\\n    .justify-content#{$infix}-center  { justify-content: center !important; }\\n    .justify-content#{$infix}-between { justify-content: space-between !important; }\\n    .justify-content#{$infix}-around  { justify-content: space-around !important; }\\n\\n    .align-items#{$infix}-start    { align-items: flex-start !important; }\\n    .align-items#{$infix}-end      { align-items: flex-end !important; }\\n    .align-items#{$infix}-center   { align-items: center !important; }\\n    .align-items#{$infix}-baseline { align-items: baseline !important; }\\n    .align-items#{$infix}-stretch  { align-items: stretch !important; }\\n\\n    .align-content#{$infix}-start   { align-content: flex-start !important; }\\n    .align-content#{$infix}-end     { align-content: flex-end !important; }\\n    .align-content#{$infix}-center  { align-content: center !important; }\\n    .align-content#{$infix}-between { align-content: space-between !important; }\\n    .align-content#{$infix}-around  { align-content: space-around !important; }\\n    .align-content#{$infix}-stretch { align-content: stretch !important; }\\n\\n    .align-self#{$infix}-auto     { align-self: auto !important; }\\n    .align-self#{$infix}-start    { align-self: flex-start !important; }\\n    .align-self#{$infix}-end      { align-self: flex-end !important; }\\n    .align-self#{$infix}-center   { align-self: center !important; }\\n    .align-self#{$infix}-baseline { align-self: baseline !important; }\\n    .align-self#{$infix}-stretch  { align-self: stretch !important; }\\n  }\\n}\\n\",\"// stylelint-disable declaration-no-important\\n\\n// Margin and Padding\\n\\n@each $breakpoint in map-keys($grid-breakpoints) {\\n  @include media-breakpoint-up($breakpoint) {\\n    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\\n\\n    @each $prop, $abbrev in (margin: m, padding: p) {\\n      @each $size, $length in $spacers {\\n        .#{$abbrev}#{$infix}-#{$size} { #{$prop}: $length !important; }\\n        .#{$abbrev}t#{$infix}-#{$size},\\n        .#{$abbrev}y#{$infix}-#{$size} {\\n          #{$prop}-top: $length !important;\\n        }\\n        .#{$abbrev}r#{$infix}-#{$size},\\n        .#{$abbrev}x#{$infix}-#{$size} {\\n          #{$prop}-right: $length !important;\\n        }\\n        .#{$abbrev}b#{$infix}-#{$size},\\n        .#{$abbrev}y#{$infix}-#{$size} {\\n          #{$prop}-bottom: $length !important;\\n        }\\n        .#{$abbrev}l#{$infix}-#{$size},\\n        .#{$abbrev}x#{$infix}-#{$size} {\\n          #{$prop}-left: $length !important;\\n        }\\n      }\\n    }\\n\\n    // Negative margins (e.g., where `.mb-n1` is negative version of `.mb-1`)\\n    @each $size, $length in $spacers {\\n      @if $size != 0 {\\n        .m#{$infix}-n#{$size} { margin: -$length !important; }\\n        .mt#{$infix}-n#{$size},\\n        .my#{$infix}-n#{$size} {\\n          margin-top: -$length !important;\\n        }\\n        .mr#{$infix}-n#{$size},\\n        .mx#{$infix}-n#{$size} {\\n          margin-right: -$length !important;\\n        }\\n        .mb#{$infix}-n#{$size},\\n        .my#{$infix}-n#{$size} {\\n          margin-bottom: -$length !important;\\n        }\\n        .ml#{$infix}-n#{$size},\\n        .mx#{$infix}-n#{$size} {\\n          margin-left: -$length !important;\\n        }\\n      }\\n    }\\n\\n    // Some special margin utils\\n    .m#{$infix}-auto { margin: auto !important; }\\n    .mt#{$infix}-auto,\\n    .my#{$infix}-auto {\\n      margin-top: auto !important;\\n    }\\n    .mr#{$infix}-auto,\\n    .mx#{$infix}-auto {\\n      margin-right: auto !important;\\n    }\\n    .mb#{$infix}-auto,\\n    .my#{$infix}-auto {\\n      margin-bottom: auto !important;\\n    }\\n    .ml#{$infix}-auto,\\n    .mx#{$infix}-auto {\\n      margin-left: auto !important;\\n    }\\n  }\\n}\\n\"]}"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bootstrap4/css/bootstrap-reboot.css",
    "content": "/*!\n * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n*,\n*::before,\n*::after {\n  box-sizing: border-box;\n}\n\nhtml {\n  font-family: sans-serif;\n  line-height: 1.15;\n  -webkit-text-size-adjust: 100%;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n  display: block;\n}\n\nbody {\n  margin: 0;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #212529;\n  text-align: left;\n  background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n  outline: 0 !important;\n}\n\nhr {\n  box-sizing: content-box;\n  height: 0;\n  overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n  margin-top: 0;\n  margin-bottom: 0.5rem;\n}\n\np {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n  text-decoration: underline;\n  -webkit-text-decoration: underline dotted;\n  text-decoration: underline dotted;\n  cursor: help;\n  border-bottom: 0;\n  -webkit-text-decoration-skip-ink: none;\n  text-decoration-skip-ink: none;\n}\n\naddress {\n  margin-bottom: 1rem;\n  font-style: normal;\n  line-height: inherit;\n}\n\nol,\nul,\ndl {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n  margin-bottom: 0;\n}\n\ndt {\n  font-weight: 700;\n}\n\ndd {\n  margin-bottom: .5rem;\n  margin-left: 0;\n}\n\nblockquote {\n  margin: 0 0 1rem;\n}\n\nb,\nstrong {\n  font-weight: bolder;\n}\n\nsmall {\n  font-size: 80%;\n}\n\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsub {\n  bottom: -.25em;\n}\n\nsup {\n  top: -.5em;\n}\n\na {\n  color: #007bff;\n  text-decoration: none;\n  background-color: transparent;\n}\n\na:hover {\n  color: #0056b3;\n  text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n  color: inherit;\n  text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n  color: inherit;\n  text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n  outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n  font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n  font-size: 1em;\n}\n\npre {\n  margin-top: 0;\n  margin-bottom: 1rem;\n  overflow: auto;\n}\n\nfigure {\n  margin: 0 0 1rem;\n}\n\nimg {\n  vertical-align: middle;\n  border-style: none;\n}\n\nsvg {\n  overflow: hidden;\n  vertical-align: middle;\n}\n\ntable {\n  border-collapse: collapse;\n}\n\ncaption {\n  padding-top: 0.75rem;\n  padding-bottom: 0.75rem;\n  color: #6c757d;\n  text-align: left;\n  caption-side: bottom;\n}\n\nth {\n  text-align: inherit;\n}\n\nlabel {\n  display: inline-block;\n  margin-bottom: 0.5rem;\n}\n\nbutton {\n  border-radius: 0;\n}\n\nbutton:focus {\n  outline: 1px dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\nbutton,\ninput {\n  overflow: visible;\n}\n\nbutton,\nselect {\n  text-transform: none;\n}\n\nselect {\n  word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n  -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n  cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n  padding: 0;\n  border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  box-sizing: border-box;\n  padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n  -webkit-appearance: listbox;\n}\n\ntextarea {\n  overflow: auto;\n  resize: vertical;\n}\n\nfieldset {\n  min-width: 0;\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  max-width: 100%;\n  padding: 0;\n  margin-bottom: .5rem;\n  font-size: 1.5rem;\n  line-height: inherit;\n  color: inherit;\n  white-space: normal;\n}\n\nprogress {\n  vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n\n[type=\"search\"] {\n  outline-offset: -2px;\n  -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n  font: inherit;\n  -webkit-appearance: button;\n}\n\noutput {\n  display: inline-block;\n}\n\nsummary {\n  display: list-item;\n  cursor: pointer;\n}\n\ntemplate {\n  display: none;\n}\n\n[hidden] {\n  display: none !important;\n}\n/*# sourceMappingURL=bootstrap-reboot.css.map */"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bootstrap4/css/bootstrap-reboot.css.map",
    "content": "{\"version\":3,\"sources\":[\"../../scss/bootstrap-reboot.scss\",\"bootstrap-reboot.css\",\"../../scss/_reboot.scss\",\"../../scss/_variables.scss\",\"../../scss/vendor/_rfs.scss\",\"../../scss/mixins/_hover.scss\"],\"names\":[],\"mappings\":\"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\",\"file\":\"bootstrap-reboot.css\",\"sourcesContent\":[\"/*!\\n * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)\\n * Copyright 2011-2019 The Bootstrap Authors\\n * Copyright 2011-2019 Twitter, Inc.\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\\n */\\n\\n@import \\\"functions\\\";\\n@import \\\"variables\\\";\\n@import \\\"mixins\\\";\\n@import \\\"reboot\\\";\\n\",\"/*!\\n * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)\\n * Copyright 2011-2019 The Bootstrap Authors\\n * Copyright 2011-2019 Twitter, Inc.\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\\n */\\n*,\\n*::before,\\n*::after {\\n  box-sizing: border-box;\\n}\\n\\nhtml {\\n  font-family: sans-serif;\\n  line-height: 1.15;\\n  -webkit-text-size-adjust: 100%;\\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\\n}\\n\\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\\n  display: block;\\n}\\n\\nbody {\\n  margin: 0;\\n  font-family: -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, \\\"Helvetica Neue\\\", Arial, \\\"Noto Sans\\\", sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\";\\n  font-size: 1rem;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  color: #212529;\\n  text-align: left;\\n  background-color: #fff;\\n}\\n\\n[tabindex=\\\"-1\\\"]:focus {\\n  outline: 0 !important;\\n}\\n\\nhr {\\n  box-sizing: content-box;\\n  height: 0;\\n  overflow: visible;\\n}\\n\\nh1, h2, h3, h4, h5, h6 {\\n  margin-top: 0;\\n  margin-bottom: 0.5rem;\\n}\\n\\np {\\n  margin-top: 0;\\n  margin-bottom: 1rem;\\n}\\n\\nabbr[title],\\nabbr[data-original-title] {\\n  text-decoration: underline;\\n  text-decoration: underline dotted;\\n  cursor: help;\\n  border-bottom: 0;\\n  text-decoration-skip-ink: none;\\n}\\n\\naddress {\\n  margin-bottom: 1rem;\\n  font-style: normal;\\n  line-height: inherit;\\n}\\n\\nol,\\nul,\\ndl {\\n  margin-top: 0;\\n  margin-bottom: 1rem;\\n}\\n\\nol ol,\\nul ul,\\nol ul,\\nul ol {\\n  margin-bottom: 0;\\n}\\n\\ndt {\\n  font-weight: 700;\\n}\\n\\ndd {\\n  margin-bottom: .5rem;\\n  margin-left: 0;\\n}\\n\\nblockquote {\\n  margin: 0 0 1rem;\\n}\\n\\nb,\\nstrong {\\n  font-weight: bolder;\\n}\\n\\nsmall {\\n  font-size: 80%;\\n}\\n\\nsub,\\nsup {\\n  position: relative;\\n  font-size: 75%;\\n  line-height: 0;\\n  vertical-align: baseline;\\n}\\n\\nsub {\\n  bottom: -.25em;\\n}\\n\\nsup {\\n  top: -.5em;\\n}\\n\\na {\\n  color: #007bff;\\n  text-decoration: none;\\n  background-color: transparent;\\n}\\n\\na:hover {\\n  color: #0056b3;\\n  text-decoration: underline;\\n}\\n\\na:not([href]):not([tabindex]) {\\n  color: inherit;\\n  text-decoration: none;\\n}\\n\\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\\n  color: inherit;\\n  text-decoration: none;\\n}\\n\\na:not([href]):not([tabindex]):focus {\\n  outline: 0;\\n}\\n\\npre,\\ncode,\\nkbd,\\nsamp {\\n  font-family: SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace;\\n  font-size: 1em;\\n}\\n\\npre {\\n  margin-top: 0;\\n  margin-bottom: 1rem;\\n  overflow: auto;\\n}\\n\\nfigure {\\n  margin: 0 0 1rem;\\n}\\n\\nimg {\\n  vertical-align: middle;\\n  border-style: none;\\n}\\n\\nsvg {\\n  overflow: hidden;\\n  vertical-align: middle;\\n}\\n\\ntable {\\n  border-collapse: collapse;\\n}\\n\\ncaption {\\n  padding-top: 0.75rem;\\n  padding-bottom: 0.75rem;\\n  color: #6c757d;\\n  text-align: left;\\n  caption-side: bottom;\\n}\\n\\nth {\\n  text-align: inherit;\\n}\\n\\nlabel {\\n  display: inline-block;\\n  margin-bottom: 0.5rem;\\n}\\n\\nbutton {\\n  border-radius: 0;\\n}\\n\\nbutton:focus {\\n  outline: 1px dotted;\\n  outline: 5px auto -webkit-focus-ring-color;\\n}\\n\\ninput,\\nbutton,\\nselect,\\noptgroup,\\ntextarea {\\n  margin: 0;\\n  font-family: inherit;\\n  font-size: inherit;\\n  line-height: inherit;\\n}\\n\\nbutton,\\ninput {\\n  overflow: visible;\\n}\\n\\nbutton,\\nselect {\\n  text-transform: none;\\n}\\n\\nselect {\\n  word-wrap: normal;\\n}\\n\\nbutton,\\n[type=\\\"button\\\"],\\n[type=\\\"reset\\\"],\\n[type=\\\"submit\\\"] {\\n  -webkit-appearance: button;\\n}\\n\\nbutton:not(:disabled),\\n[type=\\\"button\\\"]:not(:disabled),\\n[type=\\\"reset\\\"]:not(:disabled),\\n[type=\\\"submit\\\"]:not(:disabled) {\\n  cursor: pointer;\\n}\\n\\nbutton::-moz-focus-inner,\\n[type=\\\"button\\\"]::-moz-focus-inner,\\n[type=\\\"reset\\\"]::-moz-focus-inner,\\n[type=\\\"submit\\\"]::-moz-focus-inner {\\n  padding: 0;\\n  border-style: none;\\n}\\n\\ninput[type=\\\"radio\\\"],\\ninput[type=\\\"checkbox\\\"] {\\n  box-sizing: border-box;\\n  padding: 0;\\n}\\n\\ninput[type=\\\"date\\\"],\\ninput[type=\\\"time\\\"],\\ninput[type=\\\"datetime-local\\\"],\\ninput[type=\\\"month\\\"] {\\n  -webkit-appearance: listbox;\\n}\\n\\ntextarea {\\n  overflow: auto;\\n  resize: vertical;\\n}\\n\\nfieldset {\\n  min-width: 0;\\n  padding: 0;\\n  margin: 0;\\n  border: 0;\\n}\\n\\nlegend {\\n  display: block;\\n  width: 100%;\\n  max-width: 100%;\\n  padding: 0;\\n  margin-bottom: .5rem;\\n  font-size: 1.5rem;\\n  line-height: inherit;\\n  color: inherit;\\n  white-space: normal;\\n}\\n\\nprogress {\\n  vertical-align: baseline;\\n}\\n\\n[type=\\\"number\\\"]::-webkit-inner-spin-button,\\n[type=\\\"number\\\"]::-webkit-outer-spin-button {\\n  height: auto;\\n}\\n\\n[type=\\\"search\\\"] {\\n  outline-offset: -2px;\\n  -webkit-appearance: none;\\n}\\n\\n[type=\\\"search\\\"]::-webkit-search-decoration {\\n  -webkit-appearance: none;\\n}\\n\\n::-webkit-file-upload-button {\\n  font: inherit;\\n  -webkit-appearance: button;\\n}\\n\\noutput {\\n  display: inline-block;\\n}\\n\\nsummary {\\n  display: list-item;\\n  cursor: pointer;\\n}\\n\\ntemplate {\\n  display: none;\\n}\\n\\n[hidden] {\\n  display: none !important;\\n}\\n\\n/*# sourceMappingURL=bootstrap-reboot.css.map */\",\"// stylelint-disable at-rule-no-vendor-prefix, declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\\n\\n// Reboot\\n//\\n// Normalization of HTML elements, manually forked from Normalize.css to remove\\n// styles targeting irrelevant browsers while applying new styles.\\n//\\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\\n\\n\\n// Document\\n//\\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\\n// 2. Change the default font family in all browsers.\\n// 3. Correct the line height in all browsers.\\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\\n// 5. Change the default tap highlight to be completely transparent in iOS.\\n\\n*,\\n*::before,\\n*::after {\\n  box-sizing: border-box; // 1\\n}\\n\\nhtml {\\n  font-family: sans-serif; // 2\\n  line-height: 1.15; // 3\\n  -webkit-text-size-adjust: 100%; // 4\\n  -webkit-tap-highlight-color: rgba($black, 0); // 5\\n}\\n\\n// Shim for \\\"new\\\" HTML5 structural elements to display correctly (IE10, older browsers)\\n// TODO: remove in v5\\n// stylelint-disable-next-line selector-list-comma-newline-after\\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\\n  display: block;\\n}\\n\\n// Body\\n//\\n// 1. Remove the margin in all browsers.\\n// 2. As a best practice, apply a default `background-color`.\\n// 3. Set an explicit initial text-align value so that we can later use\\n//    the `inherit` value on things like `<th>` elements.\\n\\nbody {\\n  margin: 0; // 1\\n  font-family: $font-family-base;\\n  @include font-size($font-size-base);\\n  font-weight: $font-weight-base;\\n  line-height: $line-height-base;\\n  color: $body-color;\\n  text-align: left; // 3\\n  background-color: $body-bg; // 2\\n}\\n\\n// Suppress the focus outline on elements that cannot be accessed via keyboard.\\n// This prevents an unwanted focus outline from appearing around elements that\\n// might still respond to pointer events.\\n//\\n// Credit: https://github.com/suitcss/base\\n[tabindex=\\\"-1\\\"]:focus {\\n  outline: 0 !important;\\n}\\n\\n\\n// Content grouping\\n//\\n// 1. Add the correct box sizing in Firefox.\\n// 2. Show the overflow in Edge and IE.\\n\\nhr {\\n  box-sizing: content-box; // 1\\n  height: 0; // 1\\n  overflow: visible; // 2\\n}\\n\\n\\n//\\n// Typography\\n//\\n\\n// Remove top margins from headings\\n//\\n// By default, `<h1>`-`<h6>` all receive top and bottom margins. We nuke the top\\n// margin for easier control within type scales as it avoids margin collapsing.\\n// stylelint-disable-next-line selector-list-comma-newline-after\\nh1, h2, h3, h4, h5, h6 {\\n  margin-top: 0;\\n  margin-bottom: $headings-margin-bottom;\\n}\\n\\n// Reset margins on paragraphs\\n//\\n// Similarly, the top margin on `<p>`s get reset. However, we also reset the\\n// bottom margin to use `rem` units instead of `em`.\\np {\\n  margin-top: 0;\\n  margin-bottom: $paragraph-margin-bottom;\\n}\\n\\n// Abbreviations\\n//\\n// 1. Duplicate behavior to the data-* attribute for our tooltip plugin\\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\\n// 3. Add explicit cursor to indicate changed behavior.\\n// 4. Remove the bottom border in Firefox 39-.\\n// 5. Prevent the text-decoration to be skipped.\\n\\nabbr[title],\\nabbr[data-original-title] { // 1\\n  text-decoration: underline; // 2\\n  text-decoration: underline dotted; // 2\\n  cursor: help; // 3\\n  border-bottom: 0; // 4\\n  text-decoration-skip-ink: none; // 5\\n}\\n\\naddress {\\n  margin-bottom: 1rem;\\n  font-style: normal;\\n  line-height: inherit;\\n}\\n\\nol,\\nul,\\ndl {\\n  margin-top: 0;\\n  margin-bottom: 1rem;\\n}\\n\\nol ol,\\nul ul,\\nol ul,\\nul ol {\\n  margin-bottom: 0;\\n}\\n\\ndt {\\n  font-weight: $dt-font-weight;\\n}\\n\\ndd {\\n  margin-bottom: .5rem;\\n  margin-left: 0; // Undo browser default\\n}\\n\\nblockquote {\\n  margin: 0 0 1rem;\\n}\\n\\nb,\\nstrong {\\n  font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari\\n}\\n\\nsmall {\\n  @include font-size(80%); // Add the correct font size in all browsers\\n}\\n\\n//\\n// Prevent `sub` and `sup` elements from affecting the line height in\\n// all browsers.\\n//\\n\\nsub,\\nsup {\\n  position: relative;\\n  @include font-size(75%);\\n  line-height: 0;\\n  vertical-align: baseline;\\n}\\n\\nsub { bottom: -.25em; }\\nsup { top: -.5em; }\\n\\n\\n//\\n// Links\\n//\\n\\na {\\n  color: $link-color;\\n  text-decoration: $link-decoration;\\n  background-color: transparent; // Remove the gray background on active links in IE 10.\\n\\n  @include hover {\\n    color: $link-hover-color;\\n    text-decoration: $link-hover-decoration;\\n  }\\n}\\n\\n// And undo these styles for placeholder links/named anchors (without href)\\n// which have not been made explicitly keyboard-focusable (without tabindex).\\n// It would be more straightforward to just use a[href] in previous block, but that\\n// causes specificity issues in many other styles that are too complex to fix.\\n// See https://github.com/twbs/bootstrap/issues/19402\\n\\na:not([href]):not([tabindex]) {\\n  color: inherit;\\n  text-decoration: none;\\n\\n  @include hover-focus {\\n    color: inherit;\\n    text-decoration: none;\\n  }\\n\\n  &:focus {\\n    outline: 0;\\n  }\\n}\\n\\n\\n//\\n// Code\\n//\\n\\npre,\\ncode,\\nkbd,\\nsamp {\\n  font-family: $font-family-monospace;\\n  @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\\n}\\n\\npre {\\n  // Remove browser default top margin\\n  margin-top: 0;\\n  // Reset browser default of `1em` to use `rem`s\\n  margin-bottom: 1rem;\\n  // Don't allow content to break outside\\n  overflow: auto;\\n}\\n\\n\\n//\\n// Figures\\n//\\n\\nfigure {\\n  // Apply a consistent margin strategy (matches our type styles).\\n  margin: 0 0 1rem;\\n}\\n\\n\\n//\\n// Images and content\\n//\\n\\nimg {\\n  vertical-align: middle;\\n  border-style: none; // Remove the border on images inside links in IE 10-.\\n}\\n\\nsvg {\\n  // Workaround for the SVG overflow bug in IE10/11 is still required.\\n  // See https://github.com/twbs/bootstrap/issues/26878\\n  overflow: hidden;\\n  vertical-align: middle;\\n}\\n\\n\\n//\\n// Tables\\n//\\n\\ntable {\\n  border-collapse: collapse; // Prevent double borders\\n}\\n\\ncaption {\\n  padding-top: $table-cell-padding;\\n  padding-bottom: $table-cell-padding;\\n  color: $table-caption-color;\\n  text-align: left;\\n  caption-side: bottom;\\n}\\n\\nth {\\n  // Matches default `<td>` alignment by inheriting from the `<body>`, or the\\n  // closest parent with a set `text-align`.\\n  text-align: inherit;\\n}\\n\\n\\n//\\n// Forms\\n//\\n\\nlabel {\\n  // Allow labels to use `margin` for spacing.\\n  display: inline-block;\\n  margin-bottom: $label-margin-bottom;\\n}\\n\\n// Remove the default `border-radius` that macOS Chrome adds.\\n//\\n// Details at https://github.com/twbs/bootstrap/issues/24093\\nbutton {\\n  // stylelint-disable-next-line property-blacklist\\n  border-radius: 0;\\n}\\n\\n// Work around a Firefox/IE bug where the transparent `button` background\\n// results in a loss of the default `button` focus styles.\\n//\\n// Credit: https://github.com/suitcss/base/\\nbutton:focus {\\n  outline: 1px dotted;\\n  outline: 5px auto -webkit-focus-ring-color;\\n}\\n\\ninput,\\nbutton,\\nselect,\\noptgroup,\\ntextarea {\\n  margin: 0; // Remove the margin in Firefox and Safari\\n  font-family: inherit;\\n  @include font-size(inherit);\\n  line-height: inherit;\\n}\\n\\nbutton,\\ninput {\\n  overflow: visible; // Show the overflow in Edge\\n}\\n\\nbutton,\\nselect {\\n  text-transform: none; // Remove the inheritance of text transform in Firefox\\n}\\n\\n// Remove the inheritance of word-wrap in Safari.\\n//\\n// Details at https://github.com/twbs/bootstrap/issues/24990\\nselect {\\n  word-wrap: normal;\\n}\\n\\n\\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\\n//    controls in Android 4.\\n// 2. Correct the inability to style clickable types in iOS and Safari.\\nbutton,\\n[type=\\\"button\\\"], // 1\\n[type=\\\"reset\\\"],\\n[type=\\\"submit\\\"] {\\n  -webkit-appearance: button; // 2\\n}\\n\\n// Opinionated: add \\\"hand\\\" cursor to non-disabled button elements.\\n@if $enable-pointer-cursor-for-buttons {\\n  button,\\n  [type=\\\"button\\\"],\\n  [type=\\\"reset\\\"],\\n  [type=\\\"submit\\\"] {\\n    &:not(:disabled) {\\n      cursor: pointer;\\n    }\\n  }\\n}\\n\\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\\nbutton::-moz-focus-inner,\\n[type=\\\"button\\\"]::-moz-focus-inner,\\n[type=\\\"reset\\\"]::-moz-focus-inner,\\n[type=\\\"submit\\\"]::-moz-focus-inner {\\n  padding: 0;\\n  border-style: none;\\n}\\n\\ninput[type=\\\"radio\\\"],\\ninput[type=\\\"checkbox\\\"] {\\n  box-sizing: border-box; // 1. Add the correct box sizing in IE 10-\\n  padding: 0; // 2. Remove the padding in IE 10-\\n}\\n\\n\\ninput[type=\\\"date\\\"],\\ninput[type=\\\"time\\\"],\\ninput[type=\\\"datetime-local\\\"],\\ninput[type=\\\"month\\\"] {\\n  // Remove the default appearance of temporal inputs to avoid a Mobile Safari\\n  // bug where setting a custom line-height prevents text from being vertically\\n  // centered within the input.\\n  // See https://bugs.webkit.org/show_bug.cgi?id=139848\\n  // and https://github.com/twbs/bootstrap/issues/11266\\n  -webkit-appearance: listbox;\\n}\\n\\ntextarea {\\n  overflow: auto; // Remove the default vertical scrollbar in IE.\\n  // Textareas should really only resize vertically so they don't break their (horizontal) containers.\\n  resize: vertical;\\n}\\n\\nfieldset {\\n  // Browsers set a default `min-width: min-content;` on fieldsets,\\n  // unlike e.g. `<div>`s, which have `min-width: 0;` by default.\\n  // So we reset that to ensure fieldsets behave more like a standard block element.\\n  // See https://github.com/twbs/bootstrap/issues/12359\\n  // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\\n  min-width: 0;\\n  // Reset the default outline behavior of fieldsets so they don't affect page layout.\\n  padding: 0;\\n  margin: 0;\\n  border: 0;\\n}\\n\\n// 1. Correct the text wrapping in Edge and IE.\\n// 2. Correct the color inheritance from `fieldset` elements in IE.\\nlegend {\\n  display: block;\\n  width: 100%;\\n  max-width: 100%; // 1\\n  padding: 0;\\n  margin-bottom: .5rem;\\n  @include font-size(1.5rem);\\n  line-height: inherit;\\n  color: inherit; // 2\\n  white-space: normal; // 1\\n}\\n\\nprogress {\\n  vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.\\n}\\n\\n// Correct the cursor style of increment and decrement buttons in Chrome.\\n[type=\\\"number\\\"]::-webkit-inner-spin-button,\\n[type=\\\"number\\\"]::-webkit-outer-spin-button {\\n  height: auto;\\n}\\n\\n[type=\\\"search\\\"] {\\n  // This overrides the extra rounded corners on search inputs in iOS so that our\\n  // `.form-control` class can properly style them. Note that this cannot simply\\n  // be added to `.form-control` as it's not specific enough. For details, see\\n  // https://github.com/twbs/bootstrap/issues/11586.\\n  outline-offset: -2px; // 2. Correct the outline style in Safari.\\n  -webkit-appearance: none;\\n}\\n\\n//\\n// Remove the inner padding in Chrome and Safari on macOS.\\n//\\n\\n[type=\\\"search\\\"]::-webkit-search-decoration {\\n  -webkit-appearance: none;\\n}\\n\\n//\\n// 1. Correct the inability to style clickable types in iOS and Safari.\\n// 2. Change font properties to `inherit` in Safari.\\n//\\n\\n::-webkit-file-upload-button {\\n  font: inherit; // 2\\n  -webkit-appearance: button; // 1\\n}\\n\\n//\\n// Correct element displays\\n//\\n\\noutput {\\n  display: inline-block;\\n}\\n\\nsummary {\\n  display: list-item; // Add the correct display in all browsers\\n  cursor: pointer;\\n}\\n\\ntemplate {\\n  display: none; // Add the correct display in IE\\n}\\n\\n// Always hide an element with the `hidden` HTML attribute (from PureCSS).\\n// Needed for proper display in IE 10-.\\n[hidden] {\\n  display: none !important;\\n}\\n\",\"// Variables\\n//\\n// Variables should follow the `$component-state-property-size` formula for\\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\\n\\n// Color system\\n\\n$white:    #fff !default;\\n$gray-100: #f8f9fa !default;\\n$gray-200: #e9ecef !default;\\n$gray-300: #dee2e6 !default;\\n$gray-400: #ced4da !default;\\n$gray-500: #adb5bd !default;\\n$gray-600: #6c757d !default;\\n$gray-700: #495057 !default;\\n$gray-800: #343a40 !default;\\n$gray-900: #212529 !default;\\n$black:    #000 !default;\\n\\n$grays: () !default;\\n// stylelint-disable-next-line scss/dollar-variable-default\\n$grays: map-merge(\\n  (\\n    \\\"100\\\": $gray-100,\\n    \\\"200\\\": $gray-200,\\n    \\\"300\\\": $gray-300,\\n    \\\"400\\\": $gray-400,\\n    \\\"500\\\": $gray-500,\\n    \\\"600\\\": $gray-600,\\n    \\\"700\\\": $gray-700,\\n    \\\"800\\\": $gray-800,\\n    \\\"900\\\": $gray-900\\n  ),\\n  $grays\\n);\\n\\n$blue:    #007bff !default;\\n$indigo:  #6610f2 !default;\\n$purple:  #6f42c1 !default;\\n$pink:    #e83e8c !default;\\n$red:     #dc3545 !default;\\n$orange:  #fd7e14 !default;\\n$yellow:  #ffc107 !default;\\n$green:   #28a745 !default;\\n$teal:    #20c997 !default;\\n$cyan:    #17a2b8 !default;\\n\\n$colors: () !default;\\n// stylelint-disable-next-line scss/dollar-variable-default\\n$colors: map-merge(\\n  (\\n    \\\"blue\\\":       $blue,\\n    \\\"indigo\\\":     $indigo,\\n    \\\"purple\\\":     $purple,\\n    \\\"pink\\\":       $pink,\\n    \\\"red\\\":        $red,\\n    \\\"orange\\\":     $orange,\\n    \\\"yellow\\\":     $yellow,\\n    \\\"green\\\":      $green,\\n    \\\"teal\\\":       $teal,\\n    \\\"cyan\\\":       $cyan,\\n    \\\"white\\\":      $white,\\n    \\\"gray\\\":       $gray-600,\\n    \\\"gray-dark\\\":  $gray-800\\n  ),\\n  $colors\\n);\\n\\n$primary:       $blue !default;\\n$secondary:     $gray-600 !default;\\n$success:       $green !default;\\n$info:          $cyan !default;\\n$warning:       $yellow !default;\\n$danger:        $red !default;\\n$light:         $gray-100 !default;\\n$dark:          $gray-800 !default;\\n\\n$theme-colors: () !default;\\n// stylelint-disable-next-line scss/dollar-variable-default\\n$theme-colors: map-merge(\\n  (\\n    \\\"primary\\\":    $primary,\\n    \\\"secondary\\\":  $secondary,\\n    \\\"success\\\":    $success,\\n    \\\"info\\\":       $info,\\n    \\\"warning\\\":    $warning,\\n    \\\"danger\\\":     $danger,\\n    \\\"light\\\":      $light,\\n    \\\"dark\\\":       $dark\\n  ),\\n  $theme-colors\\n);\\n\\n// Set a specific jump point for requesting color jumps\\n$theme-color-interval:      8% !default;\\n\\n// The yiq lightness value that determines when the lightness of color changes from \\\"dark\\\" to \\\"light\\\". Acceptable values are between 0 and 255.\\n$yiq-contrasted-threshold:  150 !default;\\n\\n// Customize the light and dark text colors for use in our YIQ color contrast function.\\n$yiq-text-dark:             $gray-900 !default;\\n$yiq-text-light:            $white !default;\\n\\n\\n// Options\\n//\\n// Quickly modify global styling by enabling or disabling optional features.\\n\\n$enable-caret:                                true !default;\\n$enable-rounded:                              true !default;\\n$enable-shadows:                              false !default;\\n$enable-gradients:                            false !default;\\n$enable-transitions:                          true !default;\\n$enable-prefers-reduced-motion-media-query:   true !default;\\n$enable-hover-media-query:                    false !default; // Deprecated, no longer affects any compiled CSS\\n$enable-grid-classes:                         true !default;\\n$enable-pointer-cursor-for-buttons:           true !default;\\n$enable-print-styles:                         true !default;\\n$enable-responsive-font-sizes:                false !default;\\n$enable-validation-icons:                     true !default;\\n$enable-deprecation-messages:                 true !default;\\n\\n\\n// Spacing\\n//\\n// Control the default styling of most Bootstrap elements by modifying these\\n// variables. Mostly focused on spacing.\\n// You can add more entries to the $spacers map, should you need more variation.\\n\\n$spacer: 1rem !default;\\n$spacers: () !default;\\n// stylelint-disable-next-line scss/dollar-variable-default\\n$spacers: map-merge(\\n  (\\n    0: 0,\\n    1: ($spacer * .25),\\n    2: ($spacer * .5),\\n    3: $spacer,\\n    4: ($spacer * 1.5),\\n    5: ($spacer * 3)\\n  ),\\n  $spacers\\n);\\n\\n// This variable affects the `.h-*` and `.w-*` classes.\\n$sizes: () !default;\\n// stylelint-disable-next-line scss/dollar-variable-default\\n$sizes: map-merge(\\n  (\\n    25: 25%,\\n    50: 50%,\\n    75: 75%,\\n    100: 100%,\\n    auto: auto\\n  ),\\n  $sizes\\n);\\n\\n\\n// Body\\n//\\n// Settings for the `<body>` element.\\n\\n$body-bg:                   $white !default;\\n$body-color:                $gray-900 !default;\\n\\n\\n// Links\\n//\\n// Style anchor elements.\\n\\n$link-color:                              theme-color(\\\"primary\\\") !default;\\n$link-decoration:                         none !default;\\n$link-hover-color:                        darken($link-color, 15%) !default;\\n$link-hover-decoration:                   underline !default;\\n// Darken percentage for links with `.text-*` class (e.g. `.text-success`)\\n$emphasized-link-hover-darken-percentage: 15% !default;\\n\\n// Paragraphs\\n//\\n// Style p element.\\n\\n$paragraph-margin-bottom:   1rem !default;\\n\\n\\n// Grid breakpoints\\n//\\n// Define the minimum dimensions at which your layout will change,\\n// adapting to different screen sizes, for use in media queries.\\n\\n$grid-breakpoints: (\\n  xs: 0,\\n  sm: 576px,\\n  md: 768px,\\n  lg: 992px,\\n  xl: 1200px\\n) !default;\\n\\n@include _assert-ascending($grid-breakpoints, \\\"$grid-breakpoints\\\");\\n@include _assert-starts-at-zero($grid-breakpoints, \\\"$grid-breakpoints\\\");\\n\\n\\n// Grid containers\\n//\\n// Define the maximum width of `.container` for different screen sizes.\\n\\n$container-max-widths: (\\n  sm: 540px,\\n  md: 720px,\\n  lg: 960px,\\n  xl: 1140px\\n) !default;\\n\\n@include _assert-ascending($container-max-widths, \\\"$container-max-widths\\\");\\n\\n\\n// Grid columns\\n//\\n// Set the number of columns and specify the width of the gutters.\\n\\n$grid-columns:                12 !default;\\n$grid-gutter-width:           30px !default;\\n\\n\\n// Components\\n//\\n// Define common padding and border radius sizes and more.\\n\\n$line-height-lg:              1.5 !default;\\n$line-height-sm:              1.5 !default;\\n\\n$border-width:                1px !default;\\n$border-color:                $gray-300 !default;\\n\\n$border-radius:               .25rem !default;\\n$border-radius-lg:            .3rem !default;\\n$border-radius-sm:            .2rem !default;\\n\\n$rounded-pill:                50rem !default;\\n\\n$box-shadow-sm:               0 .125rem .25rem rgba($black, .075) !default;\\n$box-shadow:                  0 .5rem 1rem rgba($black, .15) !default;\\n$box-shadow-lg:               0 1rem 3rem rgba($black, .175) !default;\\n\\n$component-active-color:      $white !default;\\n$component-active-bg:         theme-color(\\\"primary\\\") !default;\\n\\n$caret-width:                 .3em !default;\\n$caret-vertical-align:        $caret-width * .85 !default;\\n$caret-spacing:               $caret-width * .85 !default;\\n\\n$transition-base:             all .2s ease-in-out !default;\\n$transition-fade:             opacity .15s linear !default;\\n$transition-collapse:         height .35s ease !default;\\n\\n$embed-responsive-aspect-ratios: () !default;\\n// stylelint-disable-next-line scss/dollar-variable-default\\n$embed-responsive-aspect-ratios: join(\\n  (\\n    (21 9),\\n    (16 9),\\n    (4 3),\\n    (1 1),\\n  ),\\n  $embed-responsive-aspect-ratios\\n);\\n\\n// Typography\\n//\\n// Font, line-height, and color for body text, headings, and more.\\n\\n// stylelint-disable value-keyword-case\\n$font-family-sans-serif:      -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, \\\"Helvetica Neue\\\", Arial, \\\"Noto Sans\\\", sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\" !default;\\n$font-family-monospace:       SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace !default;\\n$font-family-base:            $font-family-sans-serif !default;\\n// stylelint-enable value-keyword-case\\n\\n$font-size-base:              1rem !default; // Assumes the browser default, typically `16px`\\n$font-size-lg:                $font-size-base * 1.25 !default;\\n$font-size-sm:                $font-size-base * .875 !default;\\n\\n$font-weight-lighter:         lighter !default;\\n$font-weight-light:           300 !default;\\n$font-weight-normal:          400 !default;\\n$font-weight-bold:            700 !default;\\n$font-weight-bolder:          bolder !default;\\n\\n$font-weight-base:            $font-weight-normal !default;\\n$line-height-base:            1.5 !default;\\n\\n$h1-font-size:                $font-size-base * 2.5 !default;\\n$h2-font-size:                $font-size-base * 2 !default;\\n$h3-font-size:                $font-size-base * 1.75 !default;\\n$h4-font-size:                $font-size-base * 1.5 !default;\\n$h5-font-size:                $font-size-base * 1.25 !default;\\n$h6-font-size:                $font-size-base !default;\\n\\n$headings-margin-bottom:      $spacer / 2 !default;\\n$headings-font-family:        null !default;\\n$headings-font-weight:        500 !default;\\n$headings-line-height:        1.2 !default;\\n$headings-color:              null !default;\\n\\n$display1-size:               6rem !default;\\n$display2-size:               5.5rem !default;\\n$display3-size:               4.5rem !default;\\n$display4-size:               3.5rem !default;\\n\\n$display1-weight:             300 !default;\\n$display2-weight:             300 !default;\\n$display3-weight:             300 !default;\\n$display4-weight:             300 !default;\\n$display-line-height:         $headings-line-height !default;\\n\\n$lead-font-size:              $font-size-base * 1.25 !default;\\n$lead-font-weight:            300 !default;\\n\\n$small-font-size:             80% !default;\\n\\n$text-muted:                  $gray-600 !default;\\n\\n$blockquote-small-color:      $gray-600 !default;\\n$blockquote-small-font-size:  $small-font-size !default;\\n$blockquote-font-size:        $font-size-base * 1.25 !default;\\n\\n$hr-border-color:             rgba($black, .1) !default;\\n$hr-border-width:             $border-width !default;\\n\\n$mark-padding:                .2em !default;\\n\\n$dt-font-weight:              $font-weight-bold !default;\\n\\n$kbd-box-shadow:              inset 0 -.1rem 0 rgba($black, .25) !default;\\n$nested-kbd-font-weight:      $font-weight-bold !default;\\n\\n$list-inline-padding:         .5rem !default;\\n\\n$mark-bg:                     #fcf8e3 !default;\\n\\n$hr-margin-y:                 $spacer !default;\\n\\n\\n// Tables\\n//\\n// Customizes the `.table` component with basic values, each used across all table variations.\\n\\n$table-cell-padding:          .75rem !default;\\n$table-cell-padding-sm:       .3rem !default;\\n\\n$table-color:                 $body-color !default;\\n$table-bg:                    null !default;\\n$table-accent-bg:             rgba($black, .05) !default;\\n$table-hover-color:           $table-color !default;\\n$table-hover-bg:              rgba($black, .075) !default;\\n$table-active-bg:             $table-hover-bg !default;\\n\\n$table-border-width:          $border-width !default;\\n$table-border-color:          $border-color !default;\\n\\n$table-head-bg:               $gray-200 !default;\\n$table-head-color:            $gray-700 !default;\\n\\n$table-dark-color:            $white !default;\\n$table-dark-bg:               $gray-800 !default;\\n$table-dark-accent-bg:        rgba($white, .05) !default;\\n$table-dark-hover-color:      $table-dark-color !default;\\n$table-dark-hover-bg:         rgba($white, .075) !default;\\n$table-dark-border-color:     lighten($table-dark-bg, 7.5%) !default;\\n$table-dark-color:            $white !default;\\n\\n$table-striped-order:         odd !default;\\n\\n$table-caption-color:         $text-muted !default;\\n\\n$table-bg-level:              -9 !default;\\n$table-border-level:          -6 !default;\\n\\n\\n// Buttons + Forms\\n//\\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\\n\\n$input-btn-padding-y:         .375rem !default;\\n$input-btn-padding-x:         .75rem !default;\\n$input-btn-font-family:       null !default;\\n$input-btn-font-size:         $font-size-base !default;\\n$input-btn-line-height:       $line-height-base !default;\\n\\n$input-btn-focus-width:       .2rem !default;\\n$input-btn-focus-color:       rgba($component-active-bg, .25) !default;\\n$input-btn-focus-box-shadow:  0 0 0 $input-btn-focus-width $input-btn-focus-color !default;\\n\\n$input-btn-padding-y-sm:      .25rem !default;\\n$input-btn-padding-x-sm:      .5rem !default;\\n$input-btn-font-size-sm:      $font-size-sm !default;\\n$input-btn-line-height-sm:    $line-height-sm !default;\\n\\n$input-btn-padding-y-lg:      .5rem !default;\\n$input-btn-padding-x-lg:      1rem !default;\\n$input-btn-font-size-lg:      $font-size-lg !default;\\n$input-btn-line-height-lg:    $line-height-lg !default;\\n\\n$input-btn-border-width:      $border-width !default;\\n\\n\\n// Buttons\\n//\\n// For each of Bootstrap's buttons, define text, background, and border color.\\n\\n$btn-padding-y:               $input-btn-padding-y !default;\\n$btn-padding-x:               $input-btn-padding-x !default;\\n$btn-font-family:             $input-btn-font-family !default;\\n$btn-font-size:               $input-btn-font-size !default;\\n$btn-line-height:             $input-btn-line-height !default;\\n\\n$btn-padding-y-sm:            $input-btn-padding-y-sm !default;\\n$btn-padding-x-sm:            $input-btn-padding-x-sm !default;\\n$btn-font-size-sm:            $input-btn-font-size-sm !default;\\n$btn-line-height-sm:          $input-btn-line-height-sm !default;\\n\\n$btn-padding-y-lg:            $input-btn-padding-y-lg !default;\\n$btn-padding-x-lg:            $input-btn-padding-x-lg !default;\\n$btn-font-size-lg:            $input-btn-font-size-lg !default;\\n$btn-line-height-lg:          $input-btn-line-height-lg !default;\\n\\n$btn-border-width:            $input-btn-border-width !default;\\n\\n$btn-font-weight:             $font-weight-normal !default;\\n$btn-box-shadow:              inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\\n$btn-focus-width:             $input-btn-focus-width !default;\\n$btn-focus-box-shadow:        $input-btn-focus-box-shadow !default;\\n$btn-disabled-opacity:        .65 !default;\\n$btn-active-box-shadow:       inset 0 3px 5px rgba($black, .125) !default;\\n\\n$btn-link-disabled-color:     $gray-600 !default;\\n\\n$btn-block-spacing-y:         .5rem !default;\\n\\n// Allows for customizing button radius independently from global border radius\\n$btn-border-radius:           $border-radius !default;\\n$btn-border-radius-lg:        $border-radius-lg !default;\\n$btn-border-radius-sm:        $border-radius-sm !default;\\n\\n$btn-transition:              color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\\n\\n\\n// Forms\\n\\n$label-margin-bottom:                   .5rem !default;\\n\\n$input-padding-y:                       $input-btn-padding-y !default;\\n$input-padding-x:                       $input-btn-padding-x !default;\\n$input-font-family:                     $input-btn-font-family !default;\\n$input-font-size:                       $input-btn-font-size !default;\\n$input-font-weight:                     $font-weight-base !default;\\n$input-line-height:                     $input-btn-line-height !default;\\n\\n$input-padding-y-sm:                    $input-btn-padding-y-sm !default;\\n$input-padding-x-sm:                    $input-btn-padding-x-sm !default;\\n$input-font-size-sm:                    $input-btn-font-size-sm !default;\\n$input-line-height-sm:                  $input-btn-line-height-sm !default;\\n\\n$input-padding-y-lg:                    $input-btn-padding-y-lg !default;\\n$input-padding-x-lg:                    $input-btn-padding-x-lg !default;\\n$input-font-size-lg:                    $input-btn-font-size-lg !default;\\n$input-line-height-lg:                  $input-btn-line-height-lg !default;\\n\\n$input-bg:                              $white !default;\\n$input-disabled-bg:                     $gray-200 !default;\\n\\n$input-color:                           $gray-700 !default;\\n$input-border-color:                    $gray-400 !default;\\n$input-border-width:                    $input-btn-border-width !default;\\n$input-box-shadow:                      inset 0 1px 1px rgba($black, .075) !default;\\n\\n$input-border-radius:                   $border-radius !default;\\n$input-border-radius-lg:                $border-radius-lg !default;\\n$input-border-radius-sm:                $border-radius-sm !default;\\n\\n$input-focus-bg:                        $input-bg !default;\\n$input-focus-border-color:              lighten($component-active-bg, 25%) !default;\\n$input-focus-color:                     $input-color !default;\\n$input-focus-width:                     $input-btn-focus-width !default;\\n$input-focus-box-shadow:                $input-btn-focus-box-shadow !default;\\n\\n$input-placeholder-color:               $gray-600 !default;\\n$input-plaintext-color:                 $body-color !default;\\n\\n$input-height-border:                   $input-border-width * 2 !default;\\n\\n$input-height-inner:                    calc(#{$input-line-height * 1em} + #{$input-padding-y * 2}) !default;\\n$input-height-inner-half:               calc(#{$input-line-height * .5em} + #{$input-padding-y}) !default;\\n$input-height-inner-quarter:            calc(#{$input-line-height * .25em} + #{$input-padding-y / 2}) !default;\\n\\n$input-height:                          calc(#{$input-line-height * 1em} + #{$input-padding-y * 2} + #{$input-height-border}) !default;\\n$input-height-sm:                       calc(#{$input-line-height-sm * 1em} + #{$input-btn-padding-y-sm * 2} + #{$input-height-border}) !default;\\n$input-height-lg:                       calc(#{$input-line-height-lg * 1em} + #{$input-btn-padding-y-lg * 2} + #{$input-height-border}) !default;\\n\\n$input-transition:                      border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\\n\\n$form-text-margin-top:                  .25rem !default;\\n\\n$form-check-input-gutter:               1.25rem !default;\\n$form-check-input-margin-y:             .3rem !default;\\n$form-check-input-margin-x:             .25rem !default;\\n\\n$form-check-inline-margin-x:            .75rem !default;\\n$form-check-inline-input-margin-x:      .3125rem !default;\\n\\n$form-grid-gutter-width:                10px !default;\\n$form-group-margin-bottom:              1rem !default;\\n\\n$input-group-addon-color:               $input-color !default;\\n$input-group-addon-bg:                  $gray-200 !default;\\n$input-group-addon-border-color:        $input-border-color !default;\\n\\n$custom-forms-transition:               background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\\n\\n$custom-control-gutter:                 .5rem !default;\\n$custom-control-spacer-x:               1rem !default;\\n\\n$custom-control-indicator-size:         1rem !default;\\n$custom-control-indicator-bg:           $input-bg !default;\\n\\n$custom-control-indicator-bg-size:      50% 50% !default;\\n$custom-control-indicator-box-shadow:   $input-box-shadow !default;\\n$custom-control-indicator-border-color: $gray-500 !default;\\n$custom-control-indicator-border-width: $input-border-width !default;\\n\\n$custom-control-indicator-disabled-bg:          $input-disabled-bg !default;\\n$custom-control-label-disabled-color:           $gray-600 !default;\\n\\n$custom-control-indicator-checked-color:        $component-active-color !default;\\n$custom-control-indicator-checked-bg:           $component-active-bg !default;\\n$custom-control-indicator-checked-disabled-bg:  rgba(theme-color(\\\"primary\\\"), .5) !default;\\n$custom-control-indicator-checked-box-shadow:   none !default;\\n$custom-control-indicator-checked-border-color: $custom-control-indicator-checked-bg !default;\\n\\n$custom-control-indicator-focus-box-shadow:     $input-focus-box-shadow !default;\\n$custom-control-indicator-focus-border-color:   $input-focus-border-color !default;\\n\\n$custom-control-indicator-active-color:         $component-active-color !default;\\n$custom-control-indicator-active-bg:            lighten($component-active-bg, 35%) !default;\\n$custom-control-indicator-active-box-shadow:    none !default;\\n$custom-control-indicator-active-border-color:  $custom-control-indicator-active-bg !default;\\n\\n$custom-checkbox-indicator-border-radius:       $border-radius !default;\\n$custom-checkbox-indicator-icon-checked:        str-replace(url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='#{$custom-control-indicator-checked-color}' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e\\\"), \\\"#\\\", \\\"%23\\\") !default;\\n\\n$custom-checkbox-indicator-indeterminate-bg:           $component-active-bg !default;\\n$custom-checkbox-indicator-indeterminate-color:        $custom-control-indicator-checked-color !default;\\n$custom-checkbox-indicator-icon-indeterminate:         str-replace(url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='#{$custom-checkbox-indicator-indeterminate-color}' d='M0 2h4'/%3e%3c/svg%3e\\\"), \\\"#\\\", \\\"%23\\\") !default;\\n$custom-checkbox-indicator-indeterminate-box-shadow:   none !default;\\n$custom-checkbox-indicator-indeterminate-border-color: $custom-checkbox-indicator-indeterminate-bg !default;\\n\\n$custom-radio-indicator-border-radius:          50% !default;\\n$custom-radio-indicator-icon-checked:           str-replace(url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='#{$custom-control-indicator-checked-color}'/%3e%3c/svg%3e\\\"), \\\"#\\\", \\\"%23\\\") !default;\\n\\n$custom-switch-width:                           $custom-control-indicator-size * 1.75 !default;\\n$custom-switch-indicator-border-radius:         $custom-control-indicator-size / 2 !default;\\n$custom-switch-indicator-size:                  calc(#{$custom-control-indicator-size} - #{$custom-control-indicator-border-width * 4}) !default;\\n\\n$custom-select-padding-y:           $input-padding-y !default;\\n$custom-select-padding-x:           $input-padding-x !default;\\n$custom-select-font-family:         $input-font-family !default;\\n$custom-select-font-size:           $input-font-size !default;\\n$custom-select-height:              $input-height !default;\\n$custom-select-indicator-padding:   1rem !default; // Extra padding to account for the presence of the background-image based indicator\\n$custom-select-font-weight:         $input-font-weight !default;\\n$custom-select-line-height:         $input-line-height !default;\\n$custom-select-color:               $input-color !default;\\n$custom-select-disabled-color:      $gray-600 !default;\\n$custom-select-bg:                  $input-bg !default;\\n$custom-select-disabled-bg:         $gray-200 !default;\\n$custom-select-bg-size:             8px 10px !default; // In pixels because image dimensions\\n$custom-select-indicator-color:     $gray-800 !default;\\n$custom-select-indicator:           str-replace(url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='#{$custom-select-indicator-color}' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\\\"), \\\"#\\\", \\\"%23\\\") !default;\\n$custom-select-background:          $custom-select-indicator no-repeat right $custom-select-padding-x center / $custom-select-bg-size !default; // Used so we can have multiple background elements (e.g., arrow and feedback icon)\\n\\n$custom-select-feedback-icon-padding-right: calc((1em + #{2 * $custom-select-padding-y}) * 3 / 4 + #{$custom-select-padding-x + $custom-select-indicator-padding}) !default;\\n$custom-select-feedback-icon-position:      center right ($custom-select-padding-x + $custom-select-indicator-padding) !default;\\n$custom-select-feedback-icon-size:          $input-height-inner-half $input-height-inner-half !default;\\n\\n$custom-select-border-width:        $input-border-width !default;\\n$custom-select-border-color:        $input-border-color !default;\\n$custom-select-border-radius:       $border-radius !default;\\n$custom-select-box-shadow:          inset 0 1px 2px rgba($black, .075) !default;\\n\\n$custom-select-focus-border-color:  $input-focus-border-color !default;\\n$custom-select-focus-width:         $input-focus-width !default;\\n$custom-select-focus-box-shadow:    0 0 0 $custom-select-focus-width $input-btn-focus-color !default;\\n\\n$custom-select-padding-y-sm:        $input-padding-y-sm !default;\\n$custom-select-padding-x-sm:        $input-padding-x-sm !default;\\n$custom-select-font-size-sm:        $input-font-size-sm !default;\\n$custom-select-height-sm:           $input-height-sm !default;\\n\\n$custom-select-padding-y-lg:        $input-padding-y-lg !default;\\n$custom-select-padding-x-lg:        $input-padding-x-lg !default;\\n$custom-select-font-size-lg:        $input-font-size-lg !default;\\n$custom-select-height-lg:           $input-height-lg !default;\\n\\n$custom-range-track-width:          100% !default;\\n$custom-range-track-height:         .5rem !default;\\n$custom-range-track-cursor:         pointer !default;\\n$custom-range-track-bg:             $gray-300 !default;\\n$custom-range-track-border-radius:  1rem !default;\\n$custom-range-track-box-shadow:     inset 0 .25rem .25rem rgba($black, .1) !default;\\n\\n$custom-range-thumb-width:                   1rem !default;\\n$custom-range-thumb-height:                  $custom-range-thumb-width !default;\\n$custom-range-thumb-bg:                      $component-active-bg !default;\\n$custom-range-thumb-border:                  0 !default;\\n$custom-range-thumb-border-radius:           1rem !default;\\n$custom-range-thumb-box-shadow:              0 .1rem .25rem rgba($black, .1) !default;\\n$custom-range-thumb-focus-box-shadow:        0 0 0 1px $body-bg, $input-focus-box-shadow !default;\\n$custom-range-thumb-focus-box-shadow-width:  $input-focus-width !default; // For focus box shadow issue in IE/Edge\\n$custom-range-thumb-active-bg:               lighten($component-active-bg, 35%) !default;\\n$custom-range-thumb-disabled-bg:             $gray-500 !default;\\n\\n$custom-file-height:                $input-height !default;\\n$custom-file-height-inner:          $input-height-inner !default;\\n$custom-file-focus-border-color:    $input-focus-border-color !default;\\n$custom-file-focus-box-shadow:      $input-focus-box-shadow !default;\\n$custom-file-disabled-bg:           $input-disabled-bg !default;\\n\\n$custom-file-padding-y:             $input-padding-y !default;\\n$custom-file-padding-x:             $input-padding-x !default;\\n$custom-file-line-height:           $input-line-height !default;\\n$custom-file-font-family:           $input-font-family !default;\\n$custom-file-font-weight:           $input-font-weight !default;\\n$custom-file-color:                 $input-color !default;\\n$custom-file-bg:                    $input-bg !default;\\n$custom-file-border-width:          $input-border-width !default;\\n$custom-file-border-color:          $input-border-color !default;\\n$custom-file-border-radius:         $input-border-radius !default;\\n$custom-file-box-shadow:            $input-box-shadow !default;\\n$custom-file-button-color:          $custom-file-color !default;\\n$custom-file-button-bg:             $input-group-addon-bg !default;\\n$custom-file-text: (\\n  en: \\\"Browse\\\"\\n) !default;\\n\\n\\n// Form validation\\n\\n$form-feedback-margin-top:          $form-text-margin-top !default;\\n$form-feedback-font-size:           $small-font-size !default;\\n$form-feedback-valid-color:         theme-color(\\\"success\\\") !default;\\n$form-feedback-invalid-color:       theme-color(\\\"danger\\\") !default;\\n\\n$form-feedback-icon-valid-color:    $form-feedback-valid-color !default;\\n$form-feedback-icon-valid:          str-replace(url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='#{$form-feedback-icon-valid-color}' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\\\"), \\\"#\\\", \\\"%23\\\") !default;\\n$form-feedback-icon-invalid-color:  $form-feedback-invalid-color !default;\\n$form-feedback-icon-invalid:        str-replace(url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$form-feedback-icon-invalid-color}' viewBox='-2 -2 7 7'%3e%3cpath stroke='#{$form-feedback-icon-invalid-color}' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\\\"), \\\"#\\\", \\\"%23\\\") !default;\\n\\n$form-validation-states: () !default;\\n// stylelint-disable-next-line scss/dollar-variable-default\\n$form-validation-states: map-merge(\\n  (\\n    \\\"valid\\\": (\\n      \\\"color\\\": $form-feedback-valid-color,\\n      \\\"icon\\\": $form-feedback-icon-valid\\n    ),\\n    \\\"invalid\\\": (\\n      \\\"color\\\": $form-feedback-invalid-color,\\n      \\\"icon\\\": $form-feedback-icon-invalid\\n    ),\\n  ),\\n  $form-validation-states\\n);\\n\\n// Z-index master list\\n//\\n// Warning: Avoid customizing these values. They're used for a bird's eye view\\n// of components dependent on the z-axis and are designed to all work together.\\n\\n$zindex-dropdown:                   1000 !default;\\n$zindex-sticky:                     1020 !default;\\n$zindex-fixed:                      1030 !default;\\n$zindex-modal-backdrop:             1040 !default;\\n$zindex-modal:                      1050 !default;\\n$zindex-popover:                    1060 !default;\\n$zindex-tooltip:                    1070 !default;\\n\\n\\n// Navs\\n\\n$nav-link-padding-y:                .5rem !default;\\n$nav-link-padding-x:                1rem !default;\\n$nav-link-disabled-color:           $gray-600 !default;\\n\\n$nav-tabs-border-color:             $gray-300 !default;\\n$nav-tabs-border-width:             $border-width !default;\\n$nav-tabs-border-radius:            $border-radius !default;\\n$nav-tabs-link-hover-border-color:  $gray-200 $gray-200 $nav-tabs-border-color !default;\\n$nav-tabs-link-active-color:        $gray-700 !default;\\n$nav-tabs-link-active-bg:           $body-bg !default;\\n$nav-tabs-link-active-border-color: $gray-300 $gray-300 $nav-tabs-link-active-bg !default;\\n\\n$nav-pills-border-radius:           $border-radius !default;\\n$nav-pills-link-active-color:       $component-active-color !default;\\n$nav-pills-link-active-bg:          $component-active-bg !default;\\n\\n$nav-divider-color:                 $gray-200 !default;\\n$nav-divider-margin-y:              $spacer / 2 !default;\\n\\n\\n// Navbar\\n\\n$navbar-padding-y:                  $spacer / 2 !default;\\n$navbar-padding-x:                  $spacer !default;\\n\\n$navbar-nav-link-padding-x:         .5rem !default;\\n\\n$navbar-brand-font-size:            $font-size-lg !default;\\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\\n$nav-link-height:                   $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\\n$navbar-brand-height:               $navbar-brand-font-size * $line-height-base !default;\\n$navbar-brand-padding-y:            ($nav-link-height - $navbar-brand-height) / 2 !default;\\n\\n$navbar-toggler-padding-y:          .25rem !default;\\n$navbar-toggler-padding-x:          .75rem !default;\\n$navbar-toggler-font-size:          $font-size-lg !default;\\n$navbar-toggler-border-radius:      $btn-border-radius !default;\\n\\n$navbar-dark-color:                 rgba($white, .5) !default;\\n$navbar-dark-hover-color:           rgba($white, .75) !default;\\n$navbar-dark-active-color:          $white !default;\\n$navbar-dark-disabled-color:        rgba($white, .25) !default;\\n$navbar-dark-toggler-icon-bg:       str-replace(url(\\\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='#{$navbar-dark-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\\\"), \\\"#\\\", \\\"%23\\\") !default;\\n$navbar-dark-toggler-border-color:  rgba($white, .1) !default;\\n\\n$navbar-light-color:                rgba($black, .5) !default;\\n$navbar-light-hover-color:          rgba($black, .7) !default;\\n$navbar-light-active-color:         rgba($black, .9) !default;\\n$navbar-light-disabled-color:       rgba($black, .3) !default;\\n$navbar-light-toggler-icon-bg:      str-replace(url(\\\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='#{$navbar-light-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\\\"), \\\"#\\\", \\\"%23\\\") !default;\\n$navbar-light-toggler-border-color: rgba($black, .1) !default;\\n\\n$navbar-light-brand-color:                $navbar-light-active-color !default;\\n$navbar-light-brand-hover-color:          $navbar-light-active-color !default;\\n$navbar-dark-brand-color:                 $navbar-dark-active-color !default;\\n$navbar-dark-brand-hover-color:           $navbar-dark-active-color !default;\\n\\n\\n// Dropdowns\\n//\\n// Dropdown menu container and contents.\\n\\n$dropdown-min-width:                10rem !default;\\n$dropdown-padding-y:                .5rem !default;\\n$dropdown-spacer:                   .125rem !default;\\n$dropdown-font-size:                $font-size-base !default;\\n$dropdown-color:                    $body-color !default;\\n$dropdown-bg:                       $white !default;\\n$dropdown-border-color:             rgba($black, .15) !default;\\n$dropdown-border-radius:            $border-radius !default;\\n$dropdown-border-width:             $border-width !default;\\n$dropdown-inner-border-radius:      calc(#{$dropdown-border-radius} - #{$dropdown-border-width}) !default;\\n$dropdown-divider-bg:               $gray-200 !default;\\n$dropdown-divider-margin-y:         $nav-divider-margin-y !default;\\n$dropdown-box-shadow:               0 .5rem 1rem rgba($black, .175) !default;\\n\\n$dropdown-link-color:               $gray-900 !default;\\n$dropdown-link-hover-color:         darken($gray-900, 5%) !default;\\n$dropdown-link-hover-bg:            $gray-100 !default;\\n\\n$dropdown-link-active-color:        $component-active-color !default;\\n$dropdown-link-active-bg:           $component-active-bg !default;\\n\\n$dropdown-link-disabled-color:      $gray-600 !default;\\n\\n$dropdown-item-padding-y:           .25rem !default;\\n$dropdown-item-padding-x:           1.5rem !default;\\n\\n$dropdown-header-color:             $gray-600 !default;\\n\\n\\n// Pagination\\n\\n$pagination-padding-y:              .5rem !default;\\n$pagination-padding-x:              .75rem !default;\\n$pagination-padding-y-sm:           .25rem !default;\\n$pagination-padding-x-sm:           .5rem !default;\\n$pagination-padding-y-lg:           .75rem !default;\\n$pagination-padding-x-lg:           1.5rem !default;\\n$pagination-line-height:            1.25 !default;\\n\\n$pagination-color:                  $link-color !default;\\n$pagination-bg:                     $white !default;\\n$pagination-border-width:           $border-width !default;\\n$pagination-border-color:           $gray-300 !default;\\n\\n$pagination-focus-box-shadow:       $input-btn-focus-box-shadow !default;\\n$pagination-focus-outline:          0 !default;\\n\\n$pagination-hover-color:            $link-hover-color !default;\\n$pagination-hover-bg:               $gray-200 !default;\\n$pagination-hover-border-color:     $gray-300 !default;\\n\\n$pagination-active-color:           $component-active-color !default;\\n$pagination-active-bg:              $component-active-bg !default;\\n$pagination-active-border-color:    $pagination-active-bg !default;\\n\\n$pagination-disabled-color:         $gray-600 !default;\\n$pagination-disabled-bg:            $white !default;\\n$pagination-disabled-border-color:  $gray-300 !default;\\n\\n\\n// Jumbotron\\n\\n$jumbotron-padding:                 2rem !default;\\n$jumbotron-color:                   null !default;\\n$jumbotron-bg:                      $gray-200 !default;\\n\\n\\n// Cards\\n\\n$card-spacer-y:                     .75rem !default;\\n$card-spacer-x:                     1.25rem !default;\\n$card-border-width:                 $border-width !default;\\n$card-border-radius:                $border-radius !default;\\n$card-border-color:                 rgba($black, .125) !default;\\n$card-inner-border-radius:          calc(#{$card-border-radius} - #{$card-border-width}) !default;\\n$card-cap-bg:                       rgba($black, .03) !default;\\n$card-cap-color:                    null !default;\\n$card-color:                        null !default;\\n$card-bg:                           $white !default;\\n\\n$card-img-overlay-padding:          1.25rem !default;\\n\\n$card-group-margin:                 $grid-gutter-width / 2 !default;\\n$card-deck-margin:                  $card-group-margin !default;\\n\\n$card-columns-count:                3 !default;\\n$card-columns-gap:                  1.25rem !default;\\n$card-columns-margin:               $card-spacer-y !default;\\n\\n\\n// Tooltips\\n\\n$tooltip-font-size:                 $font-size-sm !default;\\n$tooltip-max-width:                 200px !default;\\n$tooltip-color:                     $white !default;\\n$tooltip-bg:                        $black !default;\\n$tooltip-border-radius:             $border-radius !default;\\n$tooltip-opacity:                   .9 !default;\\n$tooltip-padding-y:                 .25rem !default;\\n$tooltip-padding-x:                 .5rem !default;\\n$tooltip-margin:                    0 !default;\\n\\n$tooltip-arrow-width:               .8rem !default;\\n$tooltip-arrow-height:              .4rem !default;\\n$tooltip-arrow-color:               $tooltip-bg !default;\\n\\n// Form tooltips must come after regular tooltips\\n$form-feedback-tooltip-padding-y:     $tooltip-padding-y !default;\\n$form-feedback-tooltip-padding-x:     $tooltip-padding-x !default;\\n$form-feedback-tooltip-font-size:     $tooltip-font-size !default;\\n$form-feedback-tooltip-line-height:   $line-height-base !default;\\n$form-feedback-tooltip-opacity:       $tooltip-opacity !default;\\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\\n\\n\\n// Popovers\\n\\n$popover-font-size:                 $font-size-sm !default;\\n$popover-bg:                        $white !default;\\n$popover-max-width:                 276px !default;\\n$popover-border-width:              $border-width !default;\\n$popover-border-color:              rgba($black, .2) !default;\\n$popover-border-radius:             $border-radius-lg !default;\\n$popover-box-shadow:                0 .25rem .5rem rgba($black, .2) !default;\\n\\n$popover-header-bg:                 darken($popover-bg, 3%) !default;\\n$popover-header-color:              $headings-color !default;\\n$popover-header-padding-y:          .5rem !default;\\n$popover-header-padding-x:          .75rem !default;\\n\\n$popover-body-color:                $body-color !default;\\n$popover-body-padding-y:            $popover-header-padding-y !default;\\n$popover-body-padding-x:            $popover-header-padding-x !default;\\n\\n$popover-arrow-width:               1rem !default;\\n$popover-arrow-height:              .5rem !default;\\n$popover-arrow-color:               $popover-bg !default;\\n\\n$popover-arrow-outer-color:         fade-in($popover-border-color, .05) !default;\\n\\n\\n// Toasts\\n\\n$toast-max-width:                   350px !default;\\n$toast-padding-x:                   .75rem !default;\\n$toast-padding-y:                   .25rem !default;\\n$toast-font-size:                   .875rem !default;\\n$toast-color:                       null !default;\\n$toast-background-color:            rgba($white, .85) !default;\\n$toast-border-width:                1px !default;\\n$toast-border-color:                rgba(0, 0, 0, .1) !default;\\n$toast-border-radius:               .25rem !default;\\n$toast-box-shadow:                  0 .25rem .75rem rgba($black, .1) !default;\\n\\n$toast-header-color:                $gray-600 !default;\\n$toast-header-background-color:     rgba($white, .85) !default;\\n$toast-header-border-color:         rgba(0, 0, 0, .05) !default;\\n\\n\\n// Badges\\n\\n$badge-font-size:                   75% !default;\\n$badge-font-weight:                 $font-weight-bold !default;\\n$badge-padding-y:                   .25em !default;\\n$badge-padding-x:                   .4em !default;\\n$badge-border-radius:               $border-radius !default;\\n\\n$badge-transition:                  $btn-transition !default;\\n$badge-focus-width:                 $input-btn-focus-width !default;\\n\\n$badge-pill-padding-x:              .6em !default;\\n// Use a higher than normal value to ensure completely rounded edges when\\n// customizing padding or font-size on labels.\\n$badge-pill-border-radius:          10rem !default;\\n\\n\\n// Modals\\n\\n// Padding applied to the modal body\\n$modal-inner-padding:               1rem !default;\\n\\n$modal-dialog-margin:               .5rem !default;\\n$modal-dialog-margin-y-sm-up:       1.75rem !default;\\n\\n$modal-title-line-height:           $line-height-base !default;\\n\\n$modal-content-color:               null !default;\\n$modal-content-bg:                  $white !default;\\n$modal-content-border-color:        rgba($black, .2) !default;\\n$modal-content-border-width:        $border-width !default;\\n$modal-content-border-radius:       $border-radius-lg !default;\\n$modal-content-box-shadow-xs:       0 .25rem .5rem rgba($black, .5) !default;\\n$modal-content-box-shadow-sm-up:    0 .5rem 1rem rgba($black, .5) !default;\\n\\n$modal-backdrop-bg:                 $black !default;\\n$modal-backdrop-opacity:            .5 !default;\\n$modal-header-border-color:         $border-color !default;\\n$modal-footer-border-color:         $modal-header-border-color !default;\\n$modal-header-border-width:         $modal-content-border-width !default;\\n$modal-footer-border-width:         $modal-header-border-width !default;\\n$modal-header-padding-y:            1rem !default;\\n$modal-header-padding-x:            1rem !default;\\n$modal-header-padding:              $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\\n\\n$modal-xl:                          1140px !default;\\n$modal-lg:                          800px !default;\\n$modal-md:                          500px !default;\\n$modal-sm:                          300px !default;\\n\\n$modal-fade-transform:              translate(0, -50px) !default;\\n$modal-show-transform:              none !default;\\n$modal-transition:                  transform .3s ease-out !default;\\n\\n\\n// Alerts\\n//\\n// Define alert colors, border radius, and padding.\\n\\n$alert-padding-y:                   .75rem !default;\\n$alert-padding-x:                   1.25rem !default;\\n$alert-margin-bottom:               1rem !default;\\n$alert-border-radius:               $border-radius !default;\\n$alert-link-font-weight:            $font-weight-bold !default;\\n$alert-border-width:                $border-width !default;\\n\\n$alert-bg-level:                    -10 !default;\\n$alert-border-level:                -9 !default;\\n$alert-color-level:                 6 !default;\\n\\n\\n// Progress bars\\n\\n$progress-height:                   1rem !default;\\n$progress-font-size:                $font-size-base * .75 !default;\\n$progress-bg:                       $gray-200 !default;\\n$progress-border-radius:            $border-radius !default;\\n$progress-box-shadow:               inset 0 .1rem .1rem rgba($black, .1) !default;\\n$progress-bar-color:                $white !default;\\n$progress-bar-bg:                   theme-color(\\\"primary\\\") !default;\\n$progress-bar-animation-timing:     1s linear infinite !default;\\n$progress-bar-transition:           width .6s ease !default;\\n\\n\\n// List group\\n\\n$list-group-color:                  null !default;\\n$list-group-bg:                     $white !default;\\n$list-group-border-color:           rgba($black, .125) !default;\\n$list-group-border-width:           $border-width !default;\\n$list-group-border-radius:          $border-radius !default;\\n\\n$list-group-item-padding-y:         .75rem !default;\\n$list-group-item-padding-x:         1.25rem !default;\\n\\n$list-group-hover-bg:               $gray-100 !default;\\n$list-group-active-color:           $component-active-color !default;\\n$list-group-active-bg:              $component-active-bg !default;\\n$list-group-active-border-color:    $list-group-active-bg !default;\\n\\n$list-group-disabled-color:         $gray-600 !default;\\n$list-group-disabled-bg:            $list-group-bg !default;\\n\\n$list-group-action-color:           $gray-700 !default;\\n$list-group-action-hover-color:     $list-group-action-color !default;\\n\\n$list-group-action-active-color:    $body-color !default;\\n$list-group-action-active-bg:       $gray-200 !default;\\n\\n\\n// Image thumbnails\\n\\n$thumbnail-padding:                 .25rem !default;\\n$thumbnail-bg:                      $body-bg !default;\\n$thumbnail-border-width:            $border-width !default;\\n$thumbnail-border-color:            $gray-300 !default;\\n$thumbnail-border-radius:           $border-radius !default;\\n$thumbnail-box-shadow:              0 1px 2px rgba($black, .075) !default;\\n\\n\\n// Figures\\n\\n$figure-caption-font-size:          90% !default;\\n$figure-caption-color:              $gray-600 !default;\\n\\n\\n// Breadcrumbs\\n\\n$breadcrumb-padding-y:              .75rem !default;\\n$breadcrumb-padding-x:              1rem !default;\\n$breadcrumb-item-padding:           .5rem !default;\\n\\n$breadcrumb-margin-bottom:          1rem !default;\\n\\n$breadcrumb-bg:                     $gray-200 !default;\\n$breadcrumb-divider-color:          $gray-600 !default;\\n$breadcrumb-active-color:           $gray-600 !default;\\n$breadcrumb-divider:                quote(\\\"/\\\") !default;\\n\\n$breadcrumb-border-radius:          $border-radius !default;\\n\\n\\n// Carousel\\n\\n$carousel-control-color:             $white !default;\\n$carousel-control-width:             15% !default;\\n$carousel-control-opacity:           .5 !default;\\n$carousel-control-hover-opacity:     .9 !default;\\n$carousel-control-transition:        opacity .15s ease !default;\\n\\n$carousel-indicator-width:           30px !default;\\n$carousel-indicator-height:          3px !default;\\n$carousel-indicator-hit-area-height: 10px !default;\\n$carousel-indicator-spacer:          3px !default;\\n$carousel-indicator-active-bg:       $white !default;\\n$carousel-indicator-transition:      opacity .6s ease !default;\\n\\n$carousel-caption-width:             70% !default;\\n$carousel-caption-color:             $white !default;\\n\\n$carousel-control-icon-width:        20px !default;\\n\\n$carousel-control-prev-icon-bg:      str-replace(url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\\\"), \\\"#\\\", \\\"%23\\\") !default;\\n$carousel-control-next-icon-bg:      str-replace(url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\\\"), \\\"#\\\", \\\"%23\\\") !default;\\n\\n$carousel-transition-duration:       .6s !default;\\n$carousel-transition:                transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\\n\\n\\n// Spinners\\n\\n$spinner-width:         2rem !default;\\n$spinner-height:        $spinner-width !default;\\n$spinner-border-width:  .25em !default;\\n\\n$spinner-width-sm:        1rem !default;\\n$spinner-height-sm:       $spinner-width-sm !default;\\n$spinner-border-width-sm: .2em !default;\\n\\n\\n// Close\\n\\n$close-font-size:                   $font-size-base * 1.5 !default;\\n$close-font-weight:                 $font-weight-bold !default;\\n$close-color:                       $black !default;\\n$close-text-shadow:                 0 1px 0 $white !default;\\n\\n\\n// Code\\n\\n$code-font-size:                    87.5% !default;\\n$code-color:                        $pink !default;\\n\\n$kbd-padding-y:                     .2rem !default;\\n$kbd-padding-x:                     .4rem !default;\\n$kbd-font-size:                     $code-font-size !default;\\n$kbd-color:                         $white !default;\\n$kbd-bg:                            $gray-900 !default;\\n\\n$pre-color:                         $gray-900 !default;\\n$pre-scrollable-max-height:         340px !default;\\n\\n\\n// Utilities\\n\\n$displays: none, inline, inline-block, block, table, table-row, table-cell, flex, inline-flex !default;\\n$overflows: auto, hidden !default;\\n$positions: static, relative, absolute, fixed, sticky !default;\\n\\n\\n// Printing\\n\\n$print-page-size:                   a3 !default;\\n$print-body-min-width:              map-get($grid-breakpoints, \\\"lg\\\") !default;\\n\",\"// stylelint-disable property-blacklist, scss/dollar-variable-default\\n\\n// SCSS RFS mixin\\n//\\n// Automated font-resizing\\n//\\n// See https://github.com/twbs/rfs\\n\\n// Configuration\\n\\n// Base font size\\n$rfs-base-font-size: 1.25rem !default;\\n$rfs-font-size-unit: rem !default;\\n\\n// Breakpoint at where font-size starts decreasing if screen width is smaller\\n$rfs-breakpoint: 1200px !default;\\n$rfs-breakpoint-unit: px !default;\\n\\n// Resize font-size based on screen height and width\\n$rfs-two-dimensional: false !default;\\n\\n// Factor of decrease\\n$rfs-factor: 10 !default;\\n\\n@if type-of($rfs-factor) != \\\"number\\\" or $rfs-factor <= 1 {\\n  @error \\\"`#{$rfs-factor}` is not a valid  $rfs-factor, it must be greater than 1.\\\";\\n}\\n\\n// Generate enable or disable classes. Possibilities: false, \\\"enable\\\" or \\\"disable\\\"\\n$rfs-class: false !default;\\n\\n// 1 rem = $rfs-rem-value px\\n$rfs-rem-value: 16 !default;\\n\\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\\n$rfs-safari-iframe-resize-bug-fix: false !default;\\n\\n// Disable RFS by setting $enable-responsive-font-sizes to false\\n$enable-responsive-font-sizes: true !default;\\n\\n// Cache $rfs-base-font-size unit\\n$rfs-base-font-size-unit: unit($rfs-base-font-size);\\n\\n// Remove px-unit from $rfs-base-font-size for calculations\\n@if $rfs-base-font-size-unit == \\\"px\\\" {\\n  $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1);\\n}\\n@else if $rfs-base-font-size-unit == \\\"rem\\\" {\\n  $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1 / $rfs-rem-value);\\n}\\n\\n// Cache $rfs-breakpoint unit to prevent multiple calls\\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\\n\\n// Remove unit from $rfs-breakpoint for calculations\\n@if $rfs-breakpoint-unit-cache == \\\"px\\\" {\\n  $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1);\\n}\\n@else if $rfs-breakpoint-unit-cache == \\\"rem\\\" or $rfs-breakpoint-unit-cache == \\\"em\\\" {\\n  $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1 / $rfs-rem-value);\\n}\\n\\n// Responsive font-size mixin\\n@mixin rfs($fs, $important: false) {\\n  // Cache $fs unit\\n  $fs-unit: if(type-of($fs) == \\\"number\\\", unit($fs), false);\\n\\n  // Add !important suffix if needed\\n  $rfs-suffix: if($important, \\\" !important\\\", \\\"\\\");\\n\\n  // If $fs isn't a number (like inherit) or $fs has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\\n  @if not $fs-unit or $fs-unit != \\\"\\\" and $fs-unit != \\\"px\\\" and $fs-unit != \\\"rem\\\" or $fs == 0 {\\n    font-size: #{$fs}#{$rfs-suffix};\\n  }\\n  @else {\\n    // Variables for storing static and fluid rescaling\\n    $rfs-static: null;\\n    $rfs-fluid: null;\\n\\n    // Remove px-unit from $fs for calculations\\n    @if $fs-unit == \\\"px\\\" {\\n      $fs: $fs / ($fs * 0 + 1);\\n    }\\n    @else if $fs-unit == \\\"rem\\\" {\\n      $fs: $fs / ($fs * 0 + 1 / $rfs-rem-value);\\n    }\\n\\n    // Set default font-size\\n    @if $rfs-font-size-unit == rem {\\n      $rfs-static: #{$fs / $rfs-rem-value}rem#{$rfs-suffix};\\n    }\\n    @else if $rfs-font-size-unit == px {\\n      $rfs-static: #{$fs}px#{$rfs-suffix};\\n    }\\n    @else {\\n      @error \\\"`#{$rfs-font-size-unit}` is not a valid unit for $rfs-font-size-unit. Use `px` or `rem`.\\\";\\n    }\\n\\n    // Only add media query if font-size is bigger as the minimum font-size\\n    // If $rfs-factor == 1, no rescaling will take place\\n    @if $fs > $rfs-base-font-size and $enable-responsive-font-sizes {\\n      $min-width: null;\\n      $variable-unit: null;\\n\\n      // Calculate minimum font-size for given font-size\\n      $fs-min: $rfs-base-font-size + ($fs - $rfs-base-font-size) / $rfs-factor;\\n\\n      // Calculate difference between given font-size and minimum font-size for given font-size\\n      $fs-diff: $fs - $fs-min;\\n\\n      // Base font-size formatting\\n      // No need to check if the unit is valid, because we did that before\\n      $min-width: if($rfs-font-size-unit == rem, #{$fs-min / $rfs-rem-value}rem, #{$fs-min}px);\\n\\n      // If two-dimensional, use smallest of screen width and height\\n      $variable-unit: if($rfs-two-dimensional, vmin, vw);\\n\\n      // Calculate the variable width between 0 and $rfs-breakpoint\\n      $variable-width: #{$fs-diff * 100 / $rfs-breakpoint}#{$variable-unit};\\n\\n      // Set the calculated font-size.\\n      $rfs-fluid: calc(#{$min-width} + #{$variable-width}) #{$rfs-suffix};\\n    }\\n\\n    // Rendering\\n    @if $rfs-fluid == null {\\n      // Only render static font-size if no fluid font-size is available\\n      font-size: $rfs-static;\\n    }\\n    @else {\\n      $mq-value: null;\\n\\n      // RFS breakpoint formatting\\n      @if $rfs-breakpoint-unit == em or $rfs-breakpoint-unit == rem {\\n        $mq-value: #{$rfs-breakpoint / $rfs-rem-value}#{$rfs-breakpoint-unit};\\n      }\\n      @else if $rfs-breakpoint-unit == px {\\n        $mq-value: #{$rfs-breakpoint}px;\\n      }\\n      @else {\\n        @error \\\"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\\\";\\n      }\\n\\n      @if $rfs-class == \\\"disable\\\" {\\n        // Adding an extra class increases specificity,\\n        // which prevents the media query to override the font size\\n        &,\\n        .disable-responsive-font-size &,\\n        &.disable-responsive-font-size {\\n          font-size: $rfs-static;\\n        }\\n      }\\n      @else {\\n        font-size: $rfs-static;\\n      }\\n\\n      @if $rfs-two-dimensional {\\n        @media (max-width: #{$mq-value}), (max-height: #{$mq-value}) {\\n          @if $rfs-class == \\\"enable\\\" {\\n            .enable-responsive-font-size &,\\n            &.enable-responsive-font-size {\\n              font-size: $rfs-fluid;\\n            }\\n          }\\n          @else {\\n            font-size: $rfs-fluid;\\n          }\\n\\n          @if $rfs-safari-iframe-resize-bug-fix {\\n            // stylelint-disable-next-line length-zero-no-unit\\n            min-width: 0vw;\\n          }\\n        }\\n      }\\n      @else {\\n        @media (max-width: #{$mq-value}) {\\n          @if $rfs-class == \\\"enable\\\" {\\n            .enable-responsive-font-size &,\\n            &.enable-responsive-font-size {\\n              font-size: $rfs-fluid;\\n            }\\n          }\\n          @else {\\n            font-size: $rfs-fluid;\\n          }\\n\\n          @if $rfs-safari-iframe-resize-bug-fix {\\n            // stylelint-disable-next-line length-zero-no-unit\\n            min-width: 0vw;\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\n\\n// The font-size & responsive-font-size mixin uses RFS to rescale font sizes\\n@mixin font-size($fs, $important: false) {\\n  @include rfs($fs, $important);\\n}\\n\\n@mixin responsive-font-size($fs, $important: false) {\\n  @include rfs($fs, $important);\\n}\\n\",\"// Hover mixin and `$enable-hover-media-query` are deprecated.\\n//\\n// Originally added during our alphas and maintained during betas, this mixin was\\n// designed to prevent `:hover` stickiness on iOS-an issue where hover styles\\n// would persist after initial touch.\\n//\\n// For backward compatibility, we've kept these mixins and updated them to\\n// always return their regular pseudo-classes instead of a shimmed media query.\\n//\\n// Issue: https://github.com/twbs/bootstrap/issues/25195\\n\\n@mixin hover {\\n  &:hover { @content; }\\n}\\n\\n@mixin hover-focus {\\n  &:hover,\\n  &:focus {\\n    @content;\\n  }\\n}\\n\\n@mixin plain-hover-focus {\\n  &,\\n  &:hover,\\n  &:focus {\\n    @content;\\n  }\\n}\\n\\n@mixin hover-focus-active {\\n  &:hover,\\n  &:focus,\\n  &:active {\\n    @content;\\n  }\\n}\\n\"]}"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bootstrap4/css/bootstrap-reboot.min.css",
    "content": "/*!\n * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,\"Noto Sans\",sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex=\"-1\"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}\n/*# sourceMappingURL=bootstrap-reboot.min.css.map */"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bootstrap4/css/bootstrap-reboot.min.css.map",
    "content": "{\"version\":3,\"sources\":[\"../../scss/bootstrap-reboot.scss\",\"../../scss/_reboot.scss\",\"dist/css/bootstrap-reboot.css\",\"../../scss/vendor/_rfs.scss\",\"bootstrap-reboot.css\",\"../../scss/mixins/_hover.scss\"],\"names\":[],\"mappings\":\"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\",\"sourcesContent\":[\"/*!\\n * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)\\n * Copyright 2011-2019 The Bootstrap Authors\\n * Copyright 2011-2019 Twitter, Inc.\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\\n */\\n\\n@import \\\"functions\\\";\\n@import \\\"variables\\\";\\n@import \\\"mixins\\\";\\n@import \\\"reboot\\\";\\n\",\"// stylelint-disable at-rule-no-vendor-prefix, declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\\n\\n// Reboot\\n//\\n// Normalization of HTML elements, manually forked from Normalize.css to remove\\n// styles targeting irrelevant browsers while applying new styles.\\n//\\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\\n\\n\\n// Document\\n//\\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\\n// 2. Change the default font family in all browsers.\\n// 3. Correct the line height in all browsers.\\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\\n// 5. Change the default tap highlight to be completely transparent in iOS.\\n\\n*,\\n*::before,\\n*::after {\\n  box-sizing: border-box; // 1\\n}\\n\\nhtml {\\n  font-family: sans-serif; // 2\\n  line-height: 1.15; // 3\\n  -webkit-text-size-adjust: 100%; // 4\\n  -webkit-tap-highlight-color: rgba($black, 0); // 5\\n}\\n\\n// Shim for \\\"new\\\" HTML5 structural elements to display correctly (IE10, older browsers)\\n// TODO: remove in v5\\n// stylelint-disable-next-line selector-list-comma-newline-after\\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\\n  display: block;\\n}\\n\\n// Body\\n//\\n// 1. Remove the margin in all browsers.\\n// 2. As a best practice, apply a default `background-color`.\\n// 3. Set an explicit initial text-align value so that we can later use\\n//    the `inherit` value on things like `<th>` elements.\\n\\nbody {\\n  margin: 0; // 1\\n  font-family: $font-family-base;\\n  @include font-size($font-size-base);\\n  font-weight: $font-weight-base;\\n  line-height: $line-height-base;\\n  color: $body-color;\\n  text-align: left; // 3\\n  background-color: $body-bg; // 2\\n}\\n\\n// Suppress the focus outline on elements that cannot be accessed via keyboard.\\n// This prevents an unwanted focus outline from appearing around elements that\\n// might still respond to pointer events.\\n//\\n// Credit: https://github.com/suitcss/base\\n[tabindex=\\\"-1\\\"]:focus {\\n  outline: 0 !important;\\n}\\n\\n\\n// Content grouping\\n//\\n// 1. Add the correct box sizing in Firefox.\\n// 2. Show the overflow in Edge and IE.\\n\\nhr {\\n  box-sizing: content-box; // 1\\n  height: 0; // 1\\n  overflow: visible; // 2\\n}\\n\\n\\n//\\n// Typography\\n//\\n\\n// Remove top margins from headings\\n//\\n// By default, `<h1>`-`<h6>` all receive top and bottom margins. We nuke the top\\n// margin for easier control within type scales as it avoids margin collapsing.\\n// stylelint-disable-next-line selector-list-comma-newline-after\\nh1, h2, h3, h4, h5, h6 {\\n  margin-top: 0;\\n  margin-bottom: $headings-margin-bottom;\\n}\\n\\n// Reset margins on paragraphs\\n//\\n// Similarly, the top margin on `<p>`s get reset. However, we also reset the\\n// bottom margin to use `rem` units instead of `em`.\\np {\\n  margin-top: 0;\\n  margin-bottom: $paragraph-margin-bottom;\\n}\\n\\n// Abbreviations\\n//\\n// 1. Duplicate behavior to the data-* attribute for our tooltip plugin\\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\\n// 3. Add explicit cursor to indicate changed behavior.\\n// 4. Remove the bottom border in Firefox 39-.\\n// 5. Prevent the text-decoration to be skipped.\\n\\nabbr[title],\\nabbr[data-original-title] { // 1\\n  text-decoration: underline; // 2\\n  text-decoration: underline dotted; // 2\\n  cursor: help; // 3\\n  border-bottom: 0; // 4\\n  text-decoration-skip-ink: none; // 5\\n}\\n\\naddress {\\n  margin-bottom: 1rem;\\n  font-style: normal;\\n  line-height: inherit;\\n}\\n\\nol,\\nul,\\ndl {\\n  margin-top: 0;\\n  margin-bottom: 1rem;\\n}\\n\\nol ol,\\nul ul,\\nol ul,\\nul ol {\\n  margin-bottom: 0;\\n}\\n\\ndt {\\n  font-weight: $dt-font-weight;\\n}\\n\\ndd {\\n  margin-bottom: .5rem;\\n  margin-left: 0; // Undo browser default\\n}\\n\\nblockquote {\\n  margin: 0 0 1rem;\\n}\\n\\nb,\\nstrong {\\n  font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari\\n}\\n\\nsmall {\\n  @include font-size(80%); // Add the correct font size in all browsers\\n}\\n\\n//\\n// Prevent `sub` and `sup` elements from affecting the line height in\\n// all browsers.\\n//\\n\\nsub,\\nsup {\\n  position: relative;\\n  @include font-size(75%);\\n  line-height: 0;\\n  vertical-align: baseline;\\n}\\n\\nsub { bottom: -.25em; }\\nsup { top: -.5em; }\\n\\n\\n//\\n// Links\\n//\\n\\na {\\n  color: $link-color;\\n  text-decoration: $link-decoration;\\n  background-color: transparent; // Remove the gray background on active links in IE 10.\\n\\n  @include hover {\\n    color: $link-hover-color;\\n    text-decoration: $link-hover-decoration;\\n  }\\n}\\n\\n// And undo these styles for placeholder links/named anchors (without href)\\n// which have not been made explicitly keyboard-focusable (without tabindex).\\n// It would be more straightforward to just use a[href] in previous block, but that\\n// causes specificity issues in many other styles that are too complex to fix.\\n// See https://github.com/twbs/bootstrap/issues/19402\\n\\na:not([href]):not([tabindex]) {\\n  color: inherit;\\n  text-decoration: none;\\n\\n  @include hover-focus {\\n    color: inherit;\\n    text-decoration: none;\\n  }\\n\\n  &:focus {\\n    outline: 0;\\n  }\\n}\\n\\n\\n//\\n// Code\\n//\\n\\npre,\\ncode,\\nkbd,\\nsamp {\\n  font-family: $font-family-monospace;\\n  @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\\n}\\n\\npre {\\n  // Remove browser default top margin\\n  margin-top: 0;\\n  // Reset browser default of `1em` to use `rem`s\\n  margin-bottom: 1rem;\\n  // Don't allow content to break outside\\n  overflow: auto;\\n}\\n\\n\\n//\\n// Figures\\n//\\n\\nfigure {\\n  // Apply a consistent margin strategy (matches our type styles).\\n  margin: 0 0 1rem;\\n}\\n\\n\\n//\\n// Images and content\\n//\\n\\nimg {\\n  vertical-align: middle;\\n  border-style: none; // Remove the border on images inside links in IE 10-.\\n}\\n\\nsvg {\\n  // Workaround for the SVG overflow bug in IE10/11 is still required.\\n  // See https://github.com/twbs/bootstrap/issues/26878\\n  overflow: hidden;\\n  vertical-align: middle;\\n}\\n\\n\\n//\\n// Tables\\n//\\n\\ntable {\\n  border-collapse: collapse; // Prevent double borders\\n}\\n\\ncaption {\\n  padding-top: $table-cell-padding;\\n  padding-bottom: $table-cell-padding;\\n  color: $table-caption-color;\\n  text-align: left;\\n  caption-side: bottom;\\n}\\n\\nth {\\n  // Matches default `<td>` alignment by inheriting from the `<body>`, or the\\n  // closest parent with a set `text-align`.\\n  text-align: inherit;\\n}\\n\\n\\n//\\n// Forms\\n//\\n\\nlabel {\\n  // Allow labels to use `margin` for spacing.\\n  display: inline-block;\\n  margin-bottom: $label-margin-bottom;\\n}\\n\\n// Remove the default `border-radius` that macOS Chrome adds.\\n//\\n// Details at https://github.com/twbs/bootstrap/issues/24093\\nbutton {\\n  // stylelint-disable-next-line property-blacklist\\n  border-radius: 0;\\n}\\n\\n// Work around a Firefox/IE bug where the transparent `button` background\\n// results in a loss of the default `button` focus styles.\\n//\\n// Credit: https://github.com/suitcss/base/\\nbutton:focus {\\n  outline: 1px dotted;\\n  outline: 5px auto -webkit-focus-ring-color;\\n}\\n\\ninput,\\nbutton,\\nselect,\\noptgroup,\\ntextarea {\\n  margin: 0; // Remove the margin in Firefox and Safari\\n  font-family: inherit;\\n  @include font-size(inherit);\\n  line-height: inherit;\\n}\\n\\nbutton,\\ninput {\\n  overflow: visible; // Show the overflow in Edge\\n}\\n\\nbutton,\\nselect {\\n  text-transform: none; // Remove the inheritance of text transform in Firefox\\n}\\n\\n// Remove the inheritance of word-wrap in Safari.\\n//\\n// Details at https://github.com/twbs/bootstrap/issues/24990\\nselect {\\n  word-wrap: normal;\\n}\\n\\n\\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\\n//    controls in Android 4.\\n// 2. Correct the inability to style clickable types in iOS and Safari.\\nbutton,\\n[type=\\\"button\\\"], // 1\\n[type=\\\"reset\\\"],\\n[type=\\\"submit\\\"] {\\n  -webkit-appearance: button; // 2\\n}\\n\\n// Opinionated: add \\\"hand\\\" cursor to non-disabled button elements.\\n@if $enable-pointer-cursor-for-buttons {\\n  button,\\n  [type=\\\"button\\\"],\\n  [type=\\\"reset\\\"],\\n  [type=\\\"submit\\\"] {\\n    &:not(:disabled) {\\n      cursor: pointer;\\n    }\\n  }\\n}\\n\\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\\nbutton::-moz-focus-inner,\\n[type=\\\"button\\\"]::-moz-focus-inner,\\n[type=\\\"reset\\\"]::-moz-focus-inner,\\n[type=\\\"submit\\\"]::-moz-focus-inner {\\n  padding: 0;\\n  border-style: none;\\n}\\n\\ninput[type=\\\"radio\\\"],\\ninput[type=\\\"checkbox\\\"] {\\n  box-sizing: border-box; // 1. Add the correct box sizing in IE 10-\\n  padding: 0; // 2. Remove the padding in IE 10-\\n}\\n\\n\\ninput[type=\\\"date\\\"],\\ninput[type=\\\"time\\\"],\\ninput[type=\\\"datetime-local\\\"],\\ninput[type=\\\"month\\\"] {\\n  // Remove the default appearance of temporal inputs to avoid a Mobile Safari\\n  // bug where setting a custom line-height prevents text from being vertically\\n  // centered within the input.\\n  // See https://bugs.webkit.org/show_bug.cgi?id=139848\\n  // and https://github.com/twbs/bootstrap/issues/11266\\n  -webkit-appearance: listbox;\\n}\\n\\ntextarea {\\n  overflow: auto; // Remove the default vertical scrollbar in IE.\\n  // Textareas should really only resize vertically so they don't break their (horizontal) containers.\\n  resize: vertical;\\n}\\n\\nfieldset {\\n  // Browsers set a default `min-width: min-content;` on fieldsets,\\n  // unlike e.g. `<div>`s, which have `min-width: 0;` by default.\\n  // So we reset that to ensure fieldsets behave more like a standard block element.\\n  // See https://github.com/twbs/bootstrap/issues/12359\\n  // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\\n  min-width: 0;\\n  // Reset the default outline behavior of fieldsets so they don't affect page layout.\\n  padding: 0;\\n  margin: 0;\\n  border: 0;\\n}\\n\\n// 1. Correct the text wrapping in Edge and IE.\\n// 2. Correct the color inheritance from `fieldset` elements in IE.\\nlegend {\\n  display: block;\\n  width: 100%;\\n  max-width: 100%; // 1\\n  padding: 0;\\n  margin-bottom: .5rem;\\n  @include font-size(1.5rem);\\n  line-height: inherit;\\n  color: inherit; // 2\\n  white-space: normal; // 1\\n}\\n\\nprogress {\\n  vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.\\n}\\n\\n// Correct the cursor style of increment and decrement buttons in Chrome.\\n[type=\\\"number\\\"]::-webkit-inner-spin-button,\\n[type=\\\"number\\\"]::-webkit-outer-spin-button {\\n  height: auto;\\n}\\n\\n[type=\\\"search\\\"] {\\n  // This overrides the extra rounded corners on search inputs in iOS so that our\\n  // `.form-control` class can properly style them. Note that this cannot simply\\n  // be added to `.form-control` as it's not specific enough. For details, see\\n  // https://github.com/twbs/bootstrap/issues/11586.\\n  outline-offset: -2px; // 2. Correct the outline style in Safari.\\n  -webkit-appearance: none;\\n}\\n\\n//\\n// Remove the inner padding in Chrome and Safari on macOS.\\n//\\n\\n[type=\\\"search\\\"]::-webkit-search-decoration {\\n  -webkit-appearance: none;\\n}\\n\\n//\\n// 1. Correct the inability to style clickable types in iOS and Safari.\\n// 2. Change font properties to `inherit` in Safari.\\n//\\n\\n::-webkit-file-upload-button {\\n  font: inherit; // 2\\n  -webkit-appearance: button; // 1\\n}\\n\\n//\\n// Correct element displays\\n//\\n\\noutput {\\n  display: inline-block;\\n}\\n\\nsummary {\\n  display: list-item; // Add the correct display in all browsers\\n  cursor: pointer;\\n}\\n\\ntemplate {\\n  display: none; // Add the correct display in IE\\n}\\n\\n// Always hide an element with the `hidden` HTML attribute (from PureCSS).\\n// Needed for proper display in IE 10-.\\n[hidden] {\\n  display: none !important;\\n}\\n\",\"/*!\\n * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)\\n * Copyright 2011-2019 The Bootstrap Authors\\n * Copyright 2011-2019 Twitter, Inc.\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\\n */\\n*,\\n*::before,\\n*::after {\\n  box-sizing: border-box;\\n}\\n\\nhtml {\\n  font-family: sans-serif;\\n  line-height: 1.15;\\n  -webkit-text-size-adjust: 100%;\\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\\n}\\n\\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\\n  display: block;\\n}\\n\\nbody {\\n  margin: 0;\\n  font-family: -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, \\\"Helvetica Neue\\\", Arial, \\\"Noto Sans\\\", sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\";\\n  font-size: 1rem;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  color: #212529;\\n  text-align: left;\\n  background-color: #fff;\\n}\\n\\n[tabindex=\\\"-1\\\"]:focus {\\n  outline: 0 !important;\\n}\\n\\nhr {\\n  box-sizing: content-box;\\n  height: 0;\\n  overflow: visible;\\n}\\n\\nh1, h2, h3, h4, h5, h6 {\\n  margin-top: 0;\\n  margin-bottom: 0.5rem;\\n}\\n\\np {\\n  margin-top: 0;\\n  margin-bottom: 1rem;\\n}\\n\\nabbr[title],\\nabbr[data-original-title] {\\n  text-decoration: underline;\\n  -webkit-text-decoration: underline dotted;\\n  text-decoration: underline dotted;\\n  cursor: help;\\n  border-bottom: 0;\\n  -webkit-text-decoration-skip-ink: none;\\n  text-decoration-skip-ink: none;\\n}\\n\\naddress {\\n  margin-bottom: 1rem;\\n  font-style: normal;\\n  line-height: inherit;\\n}\\n\\nol,\\nul,\\ndl {\\n  margin-top: 0;\\n  margin-bottom: 1rem;\\n}\\n\\nol ol,\\nul ul,\\nol ul,\\nul ol {\\n  margin-bottom: 0;\\n}\\n\\ndt {\\n  font-weight: 700;\\n}\\n\\ndd {\\n  margin-bottom: .5rem;\\n  margin-left: 0;\\n}\\n\\nblockquote {\\n  margin: 0 0 1rem;\\n}\\n\\nb,\\nstrong {\\n  font-weight: bolder;\\n}\\n\\nsmall {\\n  font-size: 80%;\\n}\\n\\nsub,\\nsup {\\n  position: relative;\\n  font-size: 75%;\\n  line-height: 0;\\n  vertical-align: baseline;\\n}\\n\\nsub {\\n  bottom: -.25em;\\n}\\n\\nsup {\\n  top: -.5em;\\n}\\n\\na {\\n  color: #007bff;\\n  text-decoration: none;\\n  background-color: transparent;\\n}\\n\\na:hover {\\n  color: #0056b3;\\n  text-decoration: underline;\\n}\\n\\na:not([href]):not([tabindex]) {\\n  color: inherit;\\n  text-decoration: none;\\n}\\n\\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\\n  color: inherit;\\n  text-decoration: none;\\n}\\n\\na:not([href]):not([tabindex]):focus {\\n  outline: 0;\\n}\\n\\npre,\\ncode,\\nkbd,\\nsamp {\\n  font-family: SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace;\\n  font-size: 1em;\\n}\\n\\npre {\\n  margin-top: 0;\\n  margin-bottom: 1rem;\\n  overflow: auto;\\n}\\n\\nfigure {\\n  margin: 0 0 1rem;\\n}\\n\\nimg {\\n  vertical-align: middle;\\n  border-style: none;\\n}\\n\\nsvg {\\n  overflow: hidden;\\n  vertical-align: middle;\\n}\\n\\ntable {\\n  border-collapse: collapse;\\n}\\n\\ncaption {\\n  padding-top: 0.75rem;\\n  padding-bottom: 0.75rem;\\n  color: #6c757d;\\n  text-align: left;\\n  caption-side: bottom;\\n}\\n\\nth {\\n  text-align: inherit;\\n}\\n\\nlabel {\\n  display: inline-block;\\n  margin-bottom: 0.5rem;\\n}\\n\\nbutton {\\n  border-radius: 0;\\n}\\n\\nbutton:focus {\\n  outline: 1px dotted;\\n  outline: 5px auto -webkit-focus-ring-color;\\n}\\n\\ninput,\\nbutton,\\nselect,\\noptgroup,\\ntextarea {\\n  margin: 0;\\n  font-family: inherit;\\n  font-size: inherit;\\n  line-height: inherit;\\n}\\n\\nbutton,\\ninput {\\n  overflow: visible;\\n}\\n\\nbutton,\\nselect {\\n  text-transform: none;\\n}\\n\\nselect {\\n  word-wrap: normal;\\n}\\n\\nbutton,\\n[type=\\\"button\\\"],\\n[type=\\\"reset\\\"],\\n[type=\\\"submit\\\"] {\\n  -webkit-appearance: button;\\n}\\n\\nbutton:not(:disabled),\\n[type=\\\"button\\\"]:not(:disabled),\\n[type=\\\"reset\\\"]:not(:disabled),\\n[type=\\\"submit\\\"]:not(:disabled) {\\n  cursor: pointer;\\n}\\n\\nbutton::-moz-focus-inner,\\n[type=\\\"button\\\"]::-moz-focus-inner,\\n[type=\\\"reset\\\"]::-moz-focus-inner,\\n[type=\\\"submit\\\"]::-moz-focus-inner {\\n  padding: 0;\\n  border-style: none;\\n}\\n\\ninput[type=\\\"radio\\\"],\\ninput[type=\\\"checkbox\\\"] {\\n  box-sizing: border-box;\\n  padding: 0;\\n}\\n\\ninput[type=\\\"date\\\"],\\ninput[type=\\\"time\\\"],\\ninput[type=\\\"datetime-local\\\"],\\ninput[type=\\\"month\\\"] {\\n  -webkit-appearance: listbox;\\n}\\n\\ntextarea {\\n  overflow: auto;\\n  resize: vertical;\\n}\\n\\nfieldset {\\n  min-width: 0;\\n  padding: 0;\\n  margin: 0;\\n  border: 0;\\n}\\n\\nlegend {\\n  display: block;\\n  width: 100%;\\n  max-width: 100%;\\n  padding: 0;\\n  margin-bottom: .5rem;\\n  font-size: 1.5rem;\\n  line-height: inherit;\\n  color: inherit;\\n  white-space: normal;\\n}\\n\\nprogress {\\n  vertical-align: baseline;\\n}\\n\\n[type=\\\"number\\\"]::-webkit-inner-spin-button,\\n[type=\\\"number\\\"]::-webkit-outer-spin-button {\\n  height: auto;\\n}\\n\\n[type=\\\"search\\\"] {\\n  outline-offset: -2px;\\n  -webkit-appearance: none;\\n}\\n\\n[type=\\\"search\\\"]::-webkit-search-decoration {\\n  -webkit-appearance: none;\\n}\\n\\n::-webkit-file-upload-button {\\n  font: inherit;\\n  -webkit-appearance: button;\\n}\\n\\noutput {\\n  display: inline-block;\\n}\\n\\nsummary {\\n  display: list-item;\\n  cursor: pointer;\\n}\\n\\ntemplate {\\n  display: none;\\n}\\n\\n[hidden] {\\n  display: none !important;\\n}\\n/*# sourceMappingURL=bootstrap-reboot.css.map */\",\"// stylelint-disable property-blacklist, scss/dollar-variable-default\\n\\n// SCSS RFS mixin\\n//\\n// Automated font-resizing\\n//\\n// See https://github.com/twbs/rfs\\n\\n// Configuration\\n\\n// Base font size\\n$rfs-base-font-size: 1.25rem !default;\\n$rfs-font-size-unit: rem !default;\\n\\n// Breakpoint at where font-size starts decreasing if screen width is smaller\\n$rfs-breakpoint: 1200px !default;\\n$rfs-breakpoint-unit: px !default;\\n\\n// Resize font-size based on screen height and width\\n$rfs-two-dimensional: false !default;\\n\\n// Factor of decrease\\n$rfs-factor: 10 !default;\\n\\n@if type-of($rfs-factor) != \\\"number\\\" or $rfs-factor <= 1 {\\n  @error \\\"`#{$rfs-factor}` is not a valid  $rfs-factor, it must be greater than 1.\\\";\\n}\\n\\n// Generate enable or disable classes. Possibilities: false, \\\"enable\\\" or \\\"disable\\\"\\n$rfs-class: false !default;\\n\\n// 1 rem = $rfs-rem-value px\\n$rfs-rem-value: 16 !default;\\n\\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\\n$rfs-safari-iframe-resize-bug-fix: false !default;\\n\\n// Disable RFS by setting $enable-responsive-font-sizes to false\\n$enable-responsive-font-sizes: true !default;\\n\\n// Cache $rfs-base-font-size unit\\n$rfs-base-font-size-unit: unit($rfs-base-font-size);\\n\\n// Remove px-unit from $rfs-base-font-size for calculations\\n@if $rfs-base-font-size-unit == \\\"px\\\" {\\n  $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1);\\n}\\n@else if $rfs-base-font-size-unit == \\\"rem\\\" {\\n  $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1 / $rfs-rem-value);\\n}\\n\\n// Cache $rfs-breakpoint unit to prevent multiple calls\\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\\n\\n// Remove unit from $rfs-breakpoint for calculations\\n@if $rfs-breakpoint-unit-cache == \\\"px\\\" {\\n  $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1);\\n}\\n@else if $rfs-breakpoint-unit-cache == \\\"rem\\\" or $rfs-breakpoint-unit-cache == \\\"em\\\" {\\n  $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1 / $rfs-rem-value);\\n}\\n\\n// Responsive font-size mixin\\n@mixin rfs($fs, $important: false) {\\n  // Cache $fs unit\\n  $fs-unit: if(type-of($fs) == \\\"number\\\", unit($fs), false);\\n\\n  // Add !important suffix if needed\\n  $rfs-suffix: if($important, \\\" !important\\\", \\\"\\\");\\n\\n  // If $fs isn't a number (like inherit) or $fs has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\\n  @if not $fs-unit or $fs-unit != \\\"\\\" and $fs-unit != \\\"px\\\" and $fs-unit != \\\"rem\\\" or $fs == 0 {\\n    font-size: #{$fs}#{$rfs-suffix};\\n  }\\n  @else {\\n    // Variables for storing static and fluid rescaling\\n    $rfs-static: null;\\n    $rfs-fluid: null;\\n\\n    // Remove px-unit from $fs for calculations\\n    @if $fs-unit == \\\"px\\\" {\\n      $fs: $fs / ($fs * 0 + 1);\\n    }\\n    @else if $fs-unit == \\\"rem\\\" {\\n      $fs: $fs / ($fs * 0 + 1 / $rfs-rem-value);\\n    }\\n\\n    // Set default font-size\\n    @if $rfs-font-size-unit == rem {\\n      $rfs-static: #{$fs / $rfs-rem-value}rem#{$rfs-suffix};\\n    }\\n    @else if $rfs-font-size-unit == px {\\n      $rfs-static: #{$fs}px#{$rfs-suffix};\\n    }\\n    @else {\\n      @error \\\"`#{$rfs-font-size-unit}` is not a valid unit for $rfs-font-size-unit. Use `px` or `rem`.\\\";\\n    }\\n\\n    // Only add media query if font-size is bigger as the minimum font-size\\n    // If $rfs-factor == 1, no rescaling will take place\\n    @if $fs > $rfs-base-font-size and $enable-responsive-font-sizes {\\n      $min-width: null;\\n      $variable-unit: null;\\n\\n      // Calculate minimum font-size for given font-size\\n      $fs-min: $rfs-base-font-size + ($fs - $rfs-base-font-size) / $rfs-factor;\\n\\n      // Calculate difference between given font-size and minimum font-size for given font-size\\n      $fs-diff: $fs - $fs-min;\\n\\n      // Base font-size formatting\\n      // No need to check if the unit is valid, because we did that before\\n      $min-width: if($rfs-font-size-unit == rem, #{$fs-min / $rfs-rem-value}rem, #{$fs-min}px);\\n\\n      // If two-dimensional, use smallest of screen width and height\\n      $variable-unit: if($rfs-two-dimensional, vmin, vw);\\n\\n      // Calculate the variable width between 0 and $rfs-breakpoint\\n      $variable-width: #{$fs-diff * 100 / $rfs-breakpoint}#{$variable-unit};\\n\\n      // Set the calculated font-size.\\n      $rfs-fluid: calc(#{$min-width} + #{$variable-width}) #{$rfs-suffix};\\n    }\\n\\n    // Rendering\\n    @if $rfs-fluid == null {\\n      // Only render static font-size if no fluid font-size is available\\n      font-size: $rfs-static;\\n    }\\n    @else {\\n      $mq-value: null;\\n\\n      // RFS breakpoint formatting\\n      @if $rfs-breakpoint-unit == em or $rfs-breakpoint-unit == rem {\\n        $mq-value: #{$rfs-breakpoint / $rfs-rem-value}#{$rfs-breakpoint-unit};\\n      }\\n      @else if $rfs-breakpoint-unit == px {\\n        $mq-value: #{$rfs-breakpoint}px;\\n      }\\n      @else {\\n        @error \\\"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\\\";\\n      }\\n\\n      @if $rfs-class == \\\"disable\\\" {\\n        // Adding an extra class increases specificity,\\n        // which prevents the media query to override the font size\\n        &,\\n        .disable-responsive-font-size &,\\n        &.disable-responsive-font-size {\\n          font-size: $rfs-static;\\n        }\\n      }\\n      @else {\\n        font-size: $rfs-static;\\n      }\\n\\n      @if $rfs-two-dimensional {\\n        @media (max-width: #{$mq-value}), (max-height: #{$mq-value}) {\\n          @if $rfs-class == \\\"enable\\\" {\\n            .enable-responsive-font-size &,\\n            &.enable-responsive-font-size {\\n              font-size: $rfs-fluid;\\n            }\\n          }\\n          @else {\\n            font-size: $rfs-fluid;\\n          }\\n\\n          @if $rfs-safari-iframe-resize-bug-fix {\\n            // stylelint-disable-next-line length-zero-no-unit\\n            min-width: 0vw;\\n          }\\n        }\\n      }\\n      @else {\\n        @media (max-width: #{$mq-value}) {\\n          @if $rfs-class == \\\"enable\\\" {\\n            .enable-responsive-font-size &,\\n            &.enable-responsive-font-size {\\n              font-size: $rfs-fluid;\\n            }\\n          }\\n          @else {\\n            font-size: $rfs-fluid;\\n          }\\n\\n          @if $rfs-safari-iframe-resize-bug-fix {\\n            // stylelint-disable-next-line length-zero-no-unit\\n            min-width: 0vw;\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\n\\n// The font-size & responsive-font-size mixin uses RFS to rescale font sizes\\n@mixin font-size($fs, $important: false) {\\n  @include rfs($fs, $important);\\n}\\n\\n@mixin responsive-font-size($fs, $important: false) {\\n  @include rfs($fs, $important);\\n}\\n\",\"/*!\\n * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)\\n * Copyright 2011-2019 The Bootstrap Authors\\n * Copyright 2011-2019 Twitter, Inc.\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\\n */\\n*,\\n*::before,\\n*::after {\\n  box-sizing: border-box;\\n}\\n\\nhtml {\\n  font-family: sans-serif;\\n  line-height: 1.15;\\n  -webkit-text-size-adjust: 100%;\\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\\n}\\n\\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\\n  display: block;\\n}\\n\\nbody {\\n  margin: 0;\\n  font-family: -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, \\\"Helvetica Neue\\\", Arial, \\\"Noto Sans\\\", sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\";\\n  font-size: 1rem;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  color: #212529;\\n  text-align: left;\\n  background-color: #fff;\\n}\\n\\n[tabindex=\\\"-1\\\"]:focus {\\n  outline: 0 !important;\\n}\\n\\nhr {\\n  box-sizing: content-box;\\n  height: 0;\\n  overflow: visible;\\n}\\n\\nh1, h2, h3, h4, h5, h6 {\\n  margin-top: 0;\\n  margin-bottom: 0.5rem;\\n}\\n\\np {\\n  margin-top: 0;\\n  margin-bottom: 1rem;\\n}\\n\\nabbr[title],\\nabbr[data-original-title] {\\n  text-decoration: underline;\\n  text-decoration: underline dotted;\\n  cursor: help;\\n  border-bottom: 0;\\n  text-decoration-skip-ink: none;\\n}\\n\\naddress {\\n  margin-bottom: 1rem;\\n  font-style: normal;\\n  line-height: inherit;\\n}\\n\\nol,\\nul,\\ndl {\\n  margin-top: 0;\\n  margin-bottom: 1rem;\\n}\\n\\nol ol,\\nul ul,\\nol ul,\\nul ol {\\n  margin-bottom: 0;\\n}\\n\\ndt {\\n  font-weight: 700;\\n}\\n\\ndd {\\n  margin-bottom: .5rem;\\n  margin-left: 0;\\n}\\n\\nblockquote {\\n  margin: 0 0 1rem;\\n}\\n\\nb,\\nstrong {\\n  font-weight: bolder;\\n}\\n\\nsmall {\\n  font-size: 80%;\\n}\\n\\nsub,\\nsup {\\n  position: relative;\\n  font-size: 75%;\\n  line-height: 0;\\n  vertical-align: baseline;\\n}\\n\\nsub {\\n  bottom: -.25em;\\n}\\n\\nsup {\\n  top: -.5em;\\n}\\n\\na {\\n  color: #007bff;\\n  text-decoration: none;\\n  background-color: transparent;\\n}\\n\\na:hover {\\n  color: #0056b3;\\n  text-decoration: underline;\\n}\\n\\na:not([href]):not([tabindex]) {\\n  color: inherit;\\n  text-decoration: none;\\n}\\n\\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\\n  color: inherit;\\n  text-decoration: none;\\n}\\n\\na:not([href]):not([tabindex]):focus {\\n  outline: 0;\\n}\\n\\npre,\\ncode,\\nkbd,\\nsamp {\\n  font-family: SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace;\\n  font-size: 1em;\\n}\\n\\npre {\\n  margin-top: 0;\\n  margin-bottom: 1rem;\\n  overflow: auto;\\n}\\n\\nfigure {\\n  margin: 0 0 1rem;\\n}\\n\\nimg {\\n  vertical-align: middle;\\n  border-style: none;\\n}\\n\\nsvg {\\n  overflow: hidden;\\n  vertical-align: middle;\\n}\\n\\ntable {\\n  border-collapse: collapse;\\n}\\n\\ncaption {\\n  padding-top: 0.75rem;\\n  padding-bottom: 0.75rem;\\n  color: #6c757d;\\n  text-align: left;\\n  caption-side: bottom;\\n}\\n\\nth {\\n  text-align: inherit;\\n}\\n\\nlabel {\\n  display: inline-block;\\n  margin-bottom: 0.5rem;\\n}\\n\\nbutton {\\n  border-radius: 0;\\n}\\n\\nbutton:focus {\\n  outline: 1px dotted;\\n  outline: 5px auto -webkit-focus-ring-color;\\n}\\n\\ninput,\\nbutton,\\nselect,\\noptgroup,\\ntextarea {\\n  margin: 0;\\n  font-family: inherit;\\n  font-size: inherit;\\n  line-height: inherit;\\n}\\n\\nbutton,\\ninput {\\n  overflow: visible;\\n}\\n\\nbutton,\\nselect {\\n  text-transform: none;\\n}\\n\\nselect {\\n  word-wrap: normal;\\n}\\n\\nbutton,\\n[type=\\\"button\\\"],\\n[type=\\\"reset\\\"],\\n[type=\\\"submit\\\"] {\\n  -webkit-appearance: button;\\n}\\n\\nbutton:not(:disabled),\\n[type=\\\"button\\\"]:not(:disabled),\\n[type=\\\"reset\\\"]:not(:disabled),\\n[type=\\\"submit\\\"]:not(:disabled) {\\n  cursor: pointer;\\n}\\n\\nbutton::-moz-focus-inner,\\n[type=\\\"button\\\"]::-moz-focus-inner,\\n[type=\\\"reset\\\"]::-moz-focus-inner,\\n[type=\\\"submit\\\"]::-moz-focus-inner {\\n  padding: 0;\\n  border-style: none;\\n}\\n\\ninput[type=\\\"radio\\\"],\\ninput[type=\\\"checkbox\\\"] {\\n  box-sizing: border-box;\\n  padding: 0;\\n}\\n\\ninput[type=\\\"date\\\"],\\ninput[type=\\\"time\\\"],\\ninput[type=\\\"datetime-local\\\"],\\ninput[type=\\\"month\\\"] {\\n  -webkit-appearance: listbox;\\n}\\n\\ntextarea {\\n  overflow: auto;\\n  resize: vertical;\\n}\\n\\nfieldset {\\n  min-width: 0;\\n  padding: 0;\\n  margin: 0;\\n  border: 0;\\n}\\n\\nlegend {\\n  display: block;\\n  width: 100%;\\n  max-width: 100%;\\n  padding: 0;\\n  margin-bottom: .5rem;\\n  font-size: 1.5rem;\\n  line-height: inherit;\\n  color: inherit;\\n  white-space: normal;\\n}\\n\\nprogress {\\n  vertical-align: baseline;\\n}\\n\\n[type=\\\"number\\\"]::-webkit-inner-spin-button,\\n[type=\\\"number\\\"]::-webkit-outer-spin-button {\\n  height: auto;\\n}\\n\\n[type=\\\"search\\\"] {\\n  outline-offset: -2px;\\n  -webkit-appearance: none;\\n}\\n\\n[type=\\\"search\\\"]::-webkit-search-decoration {\\n  -webkit-appearance: none;\\n}\\n\\n::-webkit-file-upload-button {\\n  font: inherit;\\n  -webkit-appearance: button;\\n}\\n\\noutput {\\n  display: inline-block;\\n}\\n\\nsummary {\\n  display: list-item;\\n  cursor: pointer;\\n}\\n\\ntemplate {\\n  display: none;\\n}\\n\\n[hidden] {\\n  display: none !important;\\n}\\n\\n/*# sourceMappingURL=bootstrap-reboot.css.map */\",\"// Hover mixin and `$enable-hover-media-query` are deprecated.\\n//\\n// Originally added during our alphas and maintained during betas, this mixin was\\n// designed to prevent `:hover` stickiness on iOS-an issue where hover styles\\n// would persist after initial touch.\\n//\\n// For backward compatibility, we've kept these mixins and updated them to\\n// always return their regular pseudo-classes instead of a shimmed media query.\\n//\\n// Issue: https://github.com/twbs/bootstrap/issues/25195\\n\\n@mixin hover {\\n  &:hover { @content; }\\n}\\n\\n@mixin hover-focus {\\n  &:hover,\\n  &:focus {\\n    @content;\\n  }\\n}\\n\\n@mixin plain-hover-focus {\\n  &,\\n  &:hover,\\n  &:focus {\\n    @content;\\n  }\\n}\\n\\n@mixin hover-focus-active {\\n  &:hover,\\n  &:focus,\\n  &:active {\\n    @content;\\n  }\\n}\\n\"]}"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bootstrap4/css/bootstrap.css",
    "content": "/*!\n * Bootstrap v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n:root {\n  --blue: #007bff;\n  --indigo: #6610f2;\n  --purple: #6f42c1;\n  --pink: #e83e8c;\n  --red: #dc3545;\n  --orange: #fd7e14;\n  --yellow: #ffc107;\n  --green: #28a745;\n  --teal: #20c997;\n  --cyan: #17a2b8;\n  --white: #fff;\n  --gray: #6c757d;\n  --gray-dark: #343a40;\n  --primary: #007bff;\n  --secondary: #6c757d;\n  --success: #28a745;\n  --info: #17a2b8;\n  --warning: #ffc107;\n  --danger: #dc3545;\n  --light: #f8f9fa;\n  --dark: #343a40;\n  --breakpoint-xs: 0;\n  --breakpoint-sm: 576px;\n  --breakpoint-md: 768px;\n  --breakpoint-lg: 992px;\n  --breakpoint-xl: 1200px;\n  --font-family-sans-serif: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n  --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n*,\n*::before,\n*::after {\n  box-sizing: border-box;\n}\n\nhtml {\n  font-family: sans-serif;\n  line-height: 1.15;\n  -webkit-text-size-adjust: 100%;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n  display: block;\n}\n\nbody {\n  margin: 0;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #212529;\n  text-align: left;\n  background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n  outline: 0 !important;\n}\n\nhr {\n  box-sizing: content-box;\n  height: 0;\n  overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n  margin-top: 0;\n  margin-bottom: 0.5rem;\n}\n\np {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n  text-decoration: underline;\n  -webkit-text-decoration: underline dotted;\n  text-decoration: underline dotted;\n  cursor: help;\n  border-bottom: 0;\n  -webkit-text-decoration-skip-ink: none;\n  text-decoration-skip-ink: none;\n}\n\naddress {\n  margin-bottom: 1rem;\n  font-style: normal;\n  line-height: inherit;\n}\n\nol,\nul,\ndl {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n  margin-bottom: 0;\n}\n\ndt {\n  font-weight: 700;\n}\n\ndd {\n  margin-bottom: .5rem;\n  margin-left: 0;\n}\n\nblockquote {\n  margin: 0 0 1rem;\n}\n\nb,\nstrong {\n  font-weight: bolder;\n}\n\nsmall {\n  font-size: 80%;\n}\n\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsub {\n  bottom: -.25em;\n}\n\nsup {\n  top: -.5em;\n}\n\na {\n  color: #007bff;\n  text-decoration: none;\n  background-color: transparent;\n}\n\na:hover {\n  color: #0056b3;\n  text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n  color: inherit;\n  text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n  color: inherit;\n  text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n  outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n  font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n  font-size: 1em;\n}\n\npre {\n  margin-top: 0;\n  margin-bottom: 1rem;\n  overflow: auto;\n}\n\nfigure {\n  margin: 0 0 1rem;\n}\n\nimg {\n  vertical-align: middle;\n  border-style: none;\n}\n\nsvg {\n  overflow: hidden;\n  vertical-align: middle;\n}\n\ntable {\n  border-collapse: collapse;\n}\n\ncaption {\n  padding-top: 0.75rem;\n  padding-bottom: 0.75rem;\n  color: #6c757d;\n  text-align: left;\n  caption-side: bottom;\n}\n\nth {\n  text-align: inherit;\n}\n\nlabel {\n  display: inline-block;\n  margin-bottom: 0.5rem;\n}\n\nbutton {\n  border-radius: 0;\n}\n\nbutton:focus {\n  outline: 1px dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\nbutton,\ninput {\n  overflow: visible;\n}\n\nbutton,\nselect {\n  text-transform: none;\n}\n\nselect {\n  word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n  -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n  cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n  padding: 0;\n  border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  box-sizing: border-box;\n  padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n  -webkit-appearance: listbox;\n}\n\ntextarea {\n  overflow: auto;\n  resize: vertical;\n}\n\nfieldset {\n  min-width: 0;\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  max-width: 100%;\n  padding: 0;\n  margin-bottom: .5rem;\n  font-size: 1.5rem;\n  line-height: inherit;\n  color: inherit;\n  white-space: normal;\n}\n\nprogress {\n  vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n\n[type=\"search\"] {\n  outline-offset: -2px;\n  -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n  font: inherit;\n  -webkit-appearance: button;\n}\n\noutput {\n  display: inline-block;\n}\n\nsummary {\n  display: list-item;\n  cursor: pointer;\n}\n\ntemplate {\n  display: none;\n}\n\n[hidden] {\n  display: none !important;\n}\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n  margin-bottom: 0.5rem;\n  font-weight: 500;\n  line-height: 1.2;\n}\n\nh1, .h1 {\n  font-size: 2.5rem;\n}\n\nh2, .h2 {\n  font-size: 2rem;\n}\n\nh3, .h3 {\n  font-size: 1.75rem;\n}\n\nh4, .h4 {\n  font-size: 1.5rem;\n}\n\nh5, .h5 {\n  font-size: 1.25rem;\n}\n\nh6, .h6 {\n  font-size: 1rem;\n}\n\n.lead {\n  font-size: 1.25rem;\n  font-weight: 300;\n}\n\n.display-1 {\n  font-size: 6rem;\n  font-weight: 300;\n  line-height: 1.2;\n}\n\n.display-2 {\n  font-size: 5.5rem;\n  font-weight: 300;\n  line-height: 1.2;\n}\n\n.display-3 {\n  font-size: 4.5rem;\n  font-weight: 300;\n  line-height: 1.2;\n}\n\n.display-4 {\n  font-size: 3.5rem;\n  font-weight: 300;\n  line-height: 1.2;\n}\n\nhr {\n  margin-top: 1rem;\n  margin-bottom: 1rem;\n  border: 0;\n  border-top: 1px solid rgba(0, 0, 0, 0.1);\n}\n\nsmall,\n.small {\n  font-size: 80%;\n  font-weight: 400;\n}\n\nmark,\n.mark {\n  padding: 0.2em;\n  background-color: #fcf8e3;\n}\n\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline-item {\n  display: inline-block;\n}\n\n.list-inline-item:not(:last-child) {\n  margin-right: 0.5rem;\n}\n\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\n\n.blockquote {\n  margin-bottom: 1rem;\n  font-size: 1.25rem;\n}\n\n.blockquote-footer {\n  display: block;\n  font-size: 80%;\n  color: #6c757d;\n}\n\n.blockquote-footer::before {\n  content: \"\\2014\\00A0\";\n}\n\n.img-fluid {\n  max-width: 100%;\n  height: auto;\n}\n\n.img-thumbnail {\n  padding: 0.25rem;\n  background-color: #fff;\n  border: 1px solid #dee2e6;\n  border-radius: 0.25rem;\n  max-width: 100%;\n  height: auto;\n}\n\n.figure {\n  display: inline-block;\n}\n\n.figure-img {\n  margin-bottom: 0.5rem;\n  line-height: 1;\n}\n\n.figure-caption {\n  font-size: 90%;\n  color: #6c757d;\n}\n\ncode {\n  font-size: 87.5%;\n  color: #e83e8c;\n  word-break: break-word;\n}\n\na > code {\n  color: inherit;\n}\n\nkbd {\n  padding: 0.2rem 0.4rem;\n  font-size: 87.5%;\n  color: #fff;\n  background-color: #212529;\n  border-radius: 0.2rem;\n}\n\nkbd kbd {\n  padding: 0;\n  font-size: 100%;\n  font-weight: 700;\n}\n\npre {\n  display: block;\n  font-size: 87.5%;\n  color: #212529;\n}\n\npre code {\n  font-size: inherit;\n  color: inherit;\n  word-break: normal;\n}\n\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n\n.container {\n  width: 100%;\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n@media (min-width: 576px) {\n  .container {\n    max-width: 540px;\n  }\n}\n\n@media (min-width: 768px) {\n  .container {\n    max-width: 720px;\n  }\n}\n\n@media (min-width: 992px) {\n  .container {\n    max-width: 960px;\n  }\n}\n\n@media (min-width: 1200px) {\n  .container {\n    max-width: 1140px;\n  }\n}\n\n.container-fluid {\n  width: 100%;\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.row {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.no-gutters {\n  margin-right: 0;\n  margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n  position: relative;\n  width: 100%;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n\n.col {\n  -ms-flex-preferred-size: 0;\n  flex-basis: 0;\n  -ms-flex-positive: 1;\n  flex-grow: 1;\n  max-width: 100%;\n}\n\n.col-auto {\n  -ms-flex: 0 0 auto;\n  flex: 0 0 auto;\n  width: auto;\n  max-width: 100%;\n}\n\n.col-1 {\n  -ms-flex: 0 0 8.333333%;\n  flex: 0 0 8.333333%;\n  max-width: 8.333333%;\n}\n\n.col-2 {\n  -ms-flex: 0 0 16.666667%;\n  flex: 0 0 16.666667%;\n  max-width: 16.666667%;\n}\n\n.col-3 {\n  -ms-flex: 0 0 25%;\n  flex: 0 0 25%;\n  max-width: 25%;\n}\n\n.col-4 {\n  -ms-flex: 0 0 33.333333%;\n  flex: 0 0 33.333333%;\n  max-width: 33.333333%;\n}\n\n.col-5 {\n  -ms-flex: 0 0 41.666667%;\n  flex: 0 0 41.666667%;\n  max-width: 41.666667%;\n}\n\n.col-6 {\n  -ms-flex: 0 0 50%;\n  flex: 0 0 50%;\n  max-width: 50%;\n}\n\n.col-7 {\n  -ms-flex: 0 0 58.333333%;\n  flex: 0 0 58.333333%;\n  max-width: 58.333333%;\n}\n\n.col-8 {\n  -ms-flex: 0 0 66.666667%;\n  flex: 0 0 66.666667%;\n  max-width: 66.666667%;\n}\n\n.col-9 {\n  -ms-flex: 0 0 75%;\n  flex: 0 0 75%;\n  max-width: 75%;\n}\n\n.col-10 {\n  -ms-flex: 0 0 83.333333%;\n  flex: 0 0 83.333333%;\n  max-width: 83.333333%;\n}\n\n.col-11 {\n  -ms-flex: 0 0 91.666667%;\n  flex: 0 0 91.666667%;\n  max-width: 91.666667%;\n}\n\n.col-12 {\n  -ms-flex: 0 0 100%;\n  flex: 0 0 100%;\n  max-width: 100%;\n}\n\n.order-first {\n  -ms-flex-order: -1;\n  order: -1;\n}\n\n.order-last {\n  -ms-flex-order: 13;\n  order: 13;\n}\n\n.order-0 {\n  -ms-flex-order: 0;\n  order: 0;\n}\n\n.order-1 {\n  -ms-flex-order: 1;\n  order: 1;\n}\n\n.order-2 {\n  -ms-flex-order: 2;\n  order: 2;\n}\n\n.order-3 {\n  -ms-flex-order: 3;\n  order: 3;\n}\n\n.order-4 {\n  -ms-flex-order: 4;\n  order: 4;\n}\n\n.order-5 {\n  -ms-flex-order: 5;\n  order: 5;\n}\n\n.order-6 {\n  -ms-flex-order: 6;\n  order: 6;\n}\n\n.order-7 {\n  -ms-flex-order: 7;\n  order: 7;\n}\n\n.order-8 {\n  -ms-flex-order: 8;\n  order: 8;\n}\n\n.order-9 {\n  -ms-flex-order: 9;\n  order: 9;\n}\n\n.order-10 {\n  -ms-flex-order: 10;\n  order: 10;\n}\n\n.order-11 {\n  -ms-flex-order: 11;\n  order: 11;\n}\n\n.order-12 {\n  -ms-flex-order: 12;\n  order: 12;\n}\n\n.offset-1 {\n  margin-left: 8.333333%;\n}\n\n.offset-2 {\n  margin-left: 16.666667%;\n}\n\n.offset-3 {\n  margin-left: 25%;\n}\n\n.offset-4 {\n  margin-left: 33.333333%;\n}\n\n.offset-5 {\n  margin-left: 41.666667%;\n}\n\n.offset-6 {\n  margin-left: 50%;\n}\n\n.offset-7 {\n  margin-left: 58.333333%;\n}\n\n.offset-8 {\n  margin-left: 66.666667%;\n}\n\n.offset-9 {\n  margin-left: 75%;\n}\n\n.offset-10 {\n  margin-left: 83.333333%;\n}\n\n.offset-11 {\n  margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n  .col-sm {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-sm-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: 100%;\n  }\n  .col-sm-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-sm-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-sm-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-sm-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-sm-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-sm-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-sm-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-sm-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-sm-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-sm-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-sm-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-sm-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-sm-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-sm-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-sm-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-sm-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-sm-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-sm-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-sm-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-sm-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-sm-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-sm-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-sm-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-sm-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-sm-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-sm-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-sm-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-sm-0 {\n    margin-left: 0;\n  }\n  .offset-sm-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-sm-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-sm-3 {\n    margin-left: 25%;\n  }\n  .offset-sm-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-sm-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-sm-6 {\n    margin-left: 50%;\n  }\n  .offset-sm-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-sm-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-sm-9 {\n    margin-left: 75%;\n  }\n  .offset-sm-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-sm-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 768px) {\n  .col-md {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-md-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: 100%;\n  }\n  .col-md-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-md-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-md-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-md-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-md-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-md-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-md-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-md-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-md-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-md-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-md-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-md-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-md-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-md-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-md-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-md-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-md-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-md-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-md-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-md-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-md-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-md-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-md-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-md-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-md-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-md-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-md-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-md-0 {\n    margin-left: 0;\n  }\n  .offset-md-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-md-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-md-3 {\n    margin-left: 25%;\n  }\n  .offset-md-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-md-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-md-6 {\n    margin-left: 50%;\n  }\n  .offset-md-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-md-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-md-9 {\n    margin-left: 75%;\n  }\n  .offset-md-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-md-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 992px) {\n  .col-lg {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-lg-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: 100%;\n  }\n  .col-lg-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-lg-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-lg-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-lg-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-lg-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-lg-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-lg-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-lg-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-lg-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-lg-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-lg-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-lg-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-lg-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-lg-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-lg-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-lg-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-lg-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-lg-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-lg-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-lg-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-lg-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-lg-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-lg-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-lg-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-lg-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-lg-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-lg-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-lg-0 {\n    margin-left: 0;\n  }\n  .offset-lg-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-lg-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-lg-3 {\n    margin-left: 25%;\n  }\n  .offset-lg-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-lg-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-lg-6 {\n    margin-left: 50%;\n  }\n  .offset-lg-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-lg-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-lg-9 {\n    margin-left: 75%;\n  }\n  .offset-lg-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-lg-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 1200px) {\n  .col-xl {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-xl-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: 100%;\n  }\n  .col-xl-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-xl-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-xl-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-xl-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-xl-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-xl-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-xl-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-xl-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-xl-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-xl-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-xl-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-xl-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-xl-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-xl-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-xl-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-xl-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-xl-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-xl-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-xl-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-xl-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-xl-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-xl-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-xl-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-xl-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-xl-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-xl-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-xl-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-xl-0 {\n    margin-left: 0;\n  }\n  .offset-xl-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-xl-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-xl-3 {\n    margin-left: 25%;\n  }\n  .offset-xl-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-xl-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-xl-6 {\n    margin-left: 50%;\n  }\n  .offset-xl-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-xl-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-xl-9 {\n    margin-left: 75%;\n  }\n  .offset-xl-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-xl-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n.table {\n  width: 100%;\n  margin-bottom: 1rem;\n  color: #212529;\n}\n\n.table th,\n.table td {\n  padding: 0.75rem;\n  vertical-align: top;\n  border-top: 1px solid #dee2e6;\n}\n\n.table thead th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #dee2e6;\n}\n\n.table tbody + tbody {\n  border-top: 2px solid #dee2e6;\n}\n\n.table-sm th,\n.table-sm td {\n  padding: 0.3rem;\n}\n\n.table-bordered {\n  border: 1px solid #dee2e6;\n}\n\n.table-bordered th,\n.table-bordered td {\n  border: 1px solid #dee2e6;\n}\n\n.table-bordered thead th,\n.table-bordered thead td {\n  border-bottom-width: 2px;\n}\n\n.table-borderless th,\n.table-borderless td,\n.table-borderless thead th,\n.table-borderless tbody + tbody {\n  border: 0;\n}\n\n.table-striped tbody tr:nth-of-type(odd) {\n  background-color: rgba(0, 0, 0, 0.05);\n}\n\n.table-hover tbody tr:hover {\n  color: #212529;\n  background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-primary,\n.table-primary > th,\n.table-primary > td {\n  background-color: #b8daff;\n}\n\n.table-primary th,\n.table-primary td,\n.table-primary thead th,\n.table-primary tbody + tbody {\n  border-color: #7abaff;\n}\n\n.table-hover .table-primary:hover {\n  background-color: #9fcdff;\n}\n\n.table-hover .table-primary:hover > td,\n.table-hover .table-primary:hover > th {\n  background-color: #9fcdff;\n}\n\n.table-secondary,\n.table-secondary > th,\n.table-secondary > td {\n  background-color: #d6d8db;\n}\n\n.table-secondary th,\n.table-secondary td,\n.table-secondary thead th,\n.table-secondary tbody + tbody {\n  border-color: #b3b7bb;\n}\n\n.table-hover .table-secondary:hover {\n  background-color: #c8cbcf;\n}\n\n.table-hover .table-secondary:hover > td,\n.table-hover .table-secondary:hover > th {\n  background-color: #c8cbcf;\n}\n\n.table-success,\n.table-success > th,\n.table-success > td {\n  background-color: #c3e6cb;\n}\n\n.table-success th,\n.table-success td,\n.table-success thead th,\n.table-success tbody + tbody {\n  border-color: #8fd19e;\n}\n\n.table-hover .table-success:hover {\n  background-color: #b1dfbb;\n}\n\n.table-hover .table-success:hover > td,\n.table-hover .table-success:hover > th {\n  background-color: #b1dfbb;\n}\n\n.table-info,\n.table-info > th,\n.table-info > td {\n  background-color: #bee5eb;\n}\n\n.table-info th,\n.table-info td,\n.table-info thead th,\n.table-info tbody + tbody {\n  border-color: #86cfda;\n}\n\n.table-hover .table-info:hover {\n  background-color: #abdde5;\n}\n\n.table-hover .table-info:hover > td,\n.table-hover .table-info:hover > th {\n  background-color: #abdde5;\n}\n\n.table-warning,\n.table-warning > th,\n.table-warning > td {\n  background-color: #ffeeba;\n}\n\n.table-warning th,\n.table-warning td,\n.table-warning thead th,\n.table-warning tbody + tbody {\n  border-color: #ffdf7e;\n}\n\n.table-hover .table-warning:hover {\n  background-color: #ffe8a1;\n}\n\n.table-hover .table-warning:hover > td,\n.table-hover .table-warning:hover > th {\n  background-color: #ffe8a1;\n}\n\n.table-danger,\n.table-danger > th,\n.table-danger > td {\n  background-color: #f5c6cb;\n}\n\n.table-danger th,\n.table-danger td,\n.table-danger thead th,\n.table-danger tbody + tbody {\n  border-color: #ed969e;\n}\n\n.table-hover .table-danger:hover {\n  background-color: #f1b0b7;\n}\n\n.table-hover .table-danger:hover > td,\n.table-hover .table-danger:hover > th {\n  background-color: #f1b0b7;\n}\n\n.table-light,\n.table-light > th,\n.table-light > td {\n  background-color: #fdfdfe;\n}\n\n.table-light th,\n.table-light td,\n.table-light thead th,\n.table-light tbody + tbody {\n  border-color: #fbfcfc;\n}\n\n.table-hover .table-light:hover {\n  background-color: #ececf6;\n}\n\n.table-hover .table-light:hover > td,\n.table-hover .table-light:hover > th {\n  background-color: #ececf6;\n}\n\n.table-dark,\n.table-dark > th,\n.table-dark > td {\n  background-color: #c6c8ca;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th,\n.table-dark tbody + tbody {\n  border-color: #95999c;\n}\n\n.table-hover .table-dark:hover {\n  background-color: #b9bbbe;\n}\n\n.table-hover .table-dark:hover > td,\n.table-hover .table-dark:hover > th {\n  background-color: #b9bbbe;\n}\n\n.table-active,\n.table-active > th,\n.table-active > td {\n  background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover {\n  background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover > td,\n.table-hover .table-active:hover > th {\n  background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table .thead-dark th {\n  color: #fff;\n  background-color: #343a40;\n  border-color: #454d55;\n}\n\n.table .thead-light th {\n  color: #495057;\n  background-color: #e9ecef;\n  border-color: #dee2e6;\n}\n\n.table-dark {\n  color: #fff;\n  background-color: #343a40;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th {\n  border-color: #454d55;\n}\n\n.table-dark.table-bordered {\n  border: 0;\n}\n\n.table-dark.table-striped tbody tr:nth-of-type(odd) {\n  background-color: rgba(255, 255, 255, 0.05);\n}\n\n.table-dark.table-hover tbody tr:hover {\n  color: #fff;\n  background-color: rgba(255, 255, 255, 0.075);\n}\n\n@media (max-width: 575.98px) {\n  .table-responsive-sm {\n    display: block;\n    width: 100%;\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n  .table-responsive-sm > .table-bordered {\n    border: 0;\n  }\n}\n\n@media (max-width: 767.98px) {\n  .table-responsive-md {\n    display: block;\n    width: 100%;\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n  .table-responsive-md > .table-bordered {\n    border: 0;\n  }\n}\n\n@media (max-width: 991.98px) {\n  .table-responsive-lg {\n    display: block;\n    width: 100%;\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n  .table-responsive-lg > .table-bordered {\n    border: 0;\n  }\n}\n\n@media (max-width: 1199.98px) {\n  .table-responsive-xl {\n    display: block;\n    width: 100%;\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n  .table-responsive-xl > .table-bordered {\n    border: 0;\n  }\n}\n\n.table-responsive {\n  display: block;\n  width: 100%;\n  overflow-x: auto;\n  -webkit-overflow-scrolling: touch;\n}\n\n.table-responsive > .table-bordered {\n  border: 0;\n}\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: calc(1.5em + 0.75rem + 2px);\n  padding: 0.375rem 0.75rem;\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #495057;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid #ced4da;\n  border-radius: 0.25rem;\n  transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .form-control {\n    transition: none;\n  }\n}\n\n.form-control::-ms-expand {\n  background-color: transparent;\n  border: 0;\n}\n\n.form-control:focus {\n  color: #495057;\n  background-color: #fff;\n  border-color: #80bdff;\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.form-control::-webkit-input-placeholder {\n  color: #6c757d;\n  opacity: 1;\n}\n\n.form-control::-moz-placeholder {\n  color: #6c757d;\n  opacity: 1;\n}\n\n.form-control:-ms-input-placeholder {\n  color: #6c757d;\n  opacity: 1;\n}\n\n.form-control::-ms-input-placeholder {\n  color: #6c757d;\n  opacity: 1;\n}\n\n.form-control::placeholder {\n  color: #6c757d;\n  opacity: 1;\n}\n\n.form-control:disabled, .form-control[readonly] {\n  background-color: #e9ecef;\n  opacity: 1;\n}\n\nselect.form-control:focus::-ms-value {\n  color: #495057;\n  background-color: #fff;\n}\n\n.form-control-file,\n.form-control-range {\n  display: block;\n  width: 100%;\n}\n\n.col-form-label {\n  padding-top: calc(0.375rem + 1px);\n  padding-bottom: calc(0.375rem + 1px);\n  margin-bottom: 0;\n  font-size: inherit;\n  line-height: 1.5;\n}\n\n.col-form-label-lg {\n  padding-top: calc(0.5rem + 1px);\n  padding-bottom: calc(0.5rem + 1px);\n  font-size: 1.25rem;\n  line-height: 1.5;\n}\n\n.col-form-label-sm {\n  padding-top: calc(0.25rem + 1px);\n  padding-bottom: calc(0.25rem + 1px);\n  font-size: 0.875rem;\n  line-height: 1.5;\n}\n\n.form-control-plaintext {\n  display: block;\n  width: 100%;\n  padding-top: 0.375rem;\n  padding-bottom: 0.375rem;\n  margin-bottom: 0;\n  line-height: 1.5;\n  color: #212529;\n  background-color: transparent;\n  border: solid transparent;\n  border-width: 1px 0;\n}\n\n.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.form-control-sm {\n  height: calc(1.5em + 0.5rem + 2px);\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n  line-height: 1.5;\n  border-radius: 0.2rem;\n}\n\n.form-control-lg {\n  height: calc(1.5em + 1rem + 2px);\n  padding: 0.5rem 1rem;\n  font-size: 1.25rem;\n  line-height: 1.5;\n  border-radius: 0.3rem;\n}\n\nselect.form-control[size], select.form-control[multiple] {\n  height: auto;\n}\n\ntextarea.form-control {\n  height: auto;\n}\n\n.form-group {\n  margin-bottom: 1rem;\n}\n\n.form-text {\n  display: block;\n  margin-top: 0.25rem;\n}\n\n.form-row {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  margin-right: -5px;\n  margin-left: -5px;\n}\n\n.form-row > .col,\n.form-row > [class*=\"col-\"] {\n  padding-right: 5px;\n  padding-left: 5px;\n}\n\n.form-check {\n  position: relative;\n  display: block;\n  padding-left: 1.25rem;\n}\n\n.form-check-input {\n  position: absolute;\n  margin-top: 0.3rem;\n  margin-left: -1.25rem;\n}\n\n.form-check-input:disabled ~ .form-check-label {\n  color: #6c757d;\n}\n\n.form-check-label {\n  margin-bottom: 0;\n}\n\n.form-check-inline {\n  display: -ms-inline-flexbox;\n  display: inline-flex;\n  -ms-flex-align: center;\n  align-items: center;\n  padding-left: 0;\n  margin-right: 0.75rem;\n}\n\n.form-check-inline .form-check-input {\n  position: static;\n  margin-top: 0;\n  margin-right: 0.3125rem;\n  margin-left: 0;\n}\n\n.valid-feedback {\n  display: none;\n  width: 100%;\n  margin-top: 0.25rem;\n  font-size: 80%;\n  color: #28a745;\n}\n\n.valid-tooltip {\n  position: absolute;\n  top: 100%;\n  z-index: 5;\n  display: none;\n  max-width: 100%;\n  padding: 0.25rem 0.5rem;\n  margin-top: .1rem;\n  font-size: 0.875rem;\n  line-height: 1.5;\n  color: #fff;\n  background-color: rgba(40, 167, 69, 0.9);\n  border-radius: 0.25rem;\n}\n\n.was-validated .form-control:valid, .form-control.is-valid {\n  border-color: #28a745;\n  padding-right: calc(1.5em + 0.75rem);\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\");\n  background-repeat: no-repeat;\n  background-position: center right calc(0.375em + 0.1875rem);\n  background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus {\n  border-color: #28a745;\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .form-control:valid ~ .valid-feedback,\n.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback,\n.form-control.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\n  padding-right: calc(1.5em + 0.75rem);\n  background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .custom-select:valid, .custom-select.is-valid {\n  border-color: #28a745;\n  padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);\n  background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {\n  border-color: #28a745;\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .custom-select:valid ~ .valid-feedback,\n.was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback,\n.custom-select.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated .form-control-file:valid ~ .valid-feedback,\n.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback,\n.form-control-file.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n  color: #28a745;\n}\n\n.was-validated .form-check-input:valid ~ .valid-feedback,\n.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,\n.form-check-input.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {\n  color: #28a745;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {\n  border-color: #28a745;\n}\n\n.was-validated .custom-control-input:valid ~ .valid-feedback,\n.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback,\n.custom-control-input.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {\n  border-color: #34ce57;\n  background-color: #34ce57;\n}\n\n.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before {\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before {\n  border-color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {\n  border-color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .valid-feedback,\n.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback,\n.custom-file-input.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {\n  border-color: #28a745;\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.invalid-feedback {\n  display: none;\n  width: 100%;\n  margin-top: 0.25rem;\n  font-size: 80%;\n  color: #dc3545;\n}\n\n.invalid-tooltip {\n  position: absolute;\n  top: 100%;\n  z-index: 5;\n  display: none;\n  max-width: 100%;\n  padding: 0.25rem 0.5rem;\n  margin-top: .1rem;\n  font-size: 0.875rem;\n  line-height: 1.5;\n  color: #fff;\n  background-color: rgba(220, 53, 69, 0.9);\n  border-radius: 0.25rem;\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid {\n  border-color: #dc3545;\n  padding-right: calc(1.5em + 0.75rem);\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\");\n  background-repeat: no-repeat;\n  background-position: center right calc(0.375em + 0.1875rem);\n  background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {\n  border-color: #dc3545;\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback,\n.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback,\n.form-control.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\n  padding-right: calc(1.5em + 0.75rem);\n  background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .custom-select:invalid, .custom-select.is-invalid {\n  border-color: #dc3545;\n  padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);\n  background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {\n  border-color: #dc3545;\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .custom-select:invalid ~ .invalid-feedback,\n.was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback,\n.custom-select.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated .form-control-file:invalid ~ .invalid-feedback,\n.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback,\n.form-control-file.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n  color: #dc3545;\n}\n\n.was-validated .form-check-input:invalid ~ .invalid-feedback,\n.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,\n.form-check-input.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {\n  color: #dc3545;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {\n  border-color: #dc3545;\n}\n\n.was-validated .custom-control-input:invalid ~ .invalid-feedback,\n.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback,\n.custom-control-input.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {\n  border-color: #e4606d;\n  background-color: #e4606d;\n}\n\n.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before {\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before {\n  border-color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {\n  border-color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .invalid-feedback,\n.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback,\n.custom-file-input.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {\n  border-color: #dc3545;\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.form-inline {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-flow: row wrap;\n  flex-flow: row wrap;\n  -ms-flex-align: center;\n  align-items: center;\n}\n\n.form-inline .form-check {\n  width: 100%;\n}\n\n@media (min-width: 576px) {\n  .form-inline label {\n    display: -ms-flexbox;\n    display: flex;\n    -ms-flex-align: center;\n    align-items: center;\n    -ms-flex-pack: center;\n    justify-content: center;\n    margin-bottom: 0;\n  }\n  .form-inline .form-group {\n    display: -ms-flexbox;\n    display: flex;\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    -ms-flex-flow: row wrap;\n    flex-flow: row wrap;\n    -ms-flex-align: center;\n    align-items: center;\n    margin-bottom: 0;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .form-inline .form-control-plaintext {\n    display: inline-block;\n  }\n  .form-inline .input-group,\n  .form-inline .custom-select {\n    width: auto;\n  }\n  .form-inline .form-check {\n    display: -ms-flexbox;\n    display: flex;\n    -ms-flex-align: center;\n    align-items: center;\n    -ms-flex-pack: center;\n    justify-content: center;\n    width: auto;\n    padding-left: 0;\n  }\n  .form-inline .form-check-input {\n    position: relative;\n    -ms-flex-negative: 0;\n    flex-shrink: 0;\n    margin-top: 0;\n    margin-right: 0.25rem;\n    margin-left: 0;\n  }\n  .form-inline .custom-control {\n    -ms-flex-align: center;\n    align-items: center;\n    -ms-flex-pack: center;\n    justify-content: center;\n  }\n  .form-inline .custom-control-label {\n    margin-bottom: 0;\n  }\n}\n\n.btn {\n  display: inline-block;\n  font-weight: 400;\n  color: #212529;\n  text-align: center;\n  vertical-align: middle;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  background-color: transparent;\n  border: 1px solid transparent;\n  padding: 0.375rem 0.75rem;\n  font-size: 1rem;\n  line-height: 1.5;\n  border-radius: 0.25rem;\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .btn {\n    transition: none;\n  }\n}\n\n.btn:hover {\n  color: #212529;\n  text-decoration: none;\n}\n\n.btn:focus, .btn.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.btn.disabled, .btn:disabled {\n  opacity: 0.65;\n}\n\na.btn.disabled,\nfieldset:disabled a.btn {\n  pointer-events: none;\n}\n\n.btn-primary {\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.btn-primary:hover {\n  color: #fff;\n  background-color: #0069d9;\n  border-color: #0062cc;\n}\n\n.btn-primary:focus, .btn-primary.focus {\n  box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);\n}\n\n.btn-primary.disabled, .btn-primary:disabled {\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active,\n.show > .btn-primary.dropdown-toggle {\n  color: #fff;\n  background-color: #0062cc;\n  border-color: #005cbf;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-primary.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);\n}\n\n.btn-secondary {\n  color: #fff;\n  background-color: #6c757d;\n  border-color: #6c757d;\n}\n\n.btn-secondary:hover {\n  color: #fff;\n  background-color: #5a6268;\n  border-color: #545b62;\n}\n\n.btn-secondary:focus, .btn-secondary.focus {\n  box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);\n}\n\n.btn-secondary.disabled, .btn-secondary:disabled {\n  color: #fff;\n  background-color: #6c757d;\n  border-color: #6c757d;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-secondary.dropdown-toggle {\n  color: #fff;\n  background-color: #545b62;\n  border-color: #4e555b;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-secondary.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);\n}\n\n.btn-success {\n  color: #fff;\n  background-color: #28a745;\n  border-color: #28a745;\n}\n\n.btn-success:hover {\n  color: #fff;\n  background-color: #218838;\n  border-color: #1e7e34;\n}\n\n.btn-success:focus, .btn-success.focus {\n  box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);\n}\n\n.btn-success.disabled, .btn-success:disabled {\n  color: #fff;\n  background-color: #28a745;\n  border-color: #28a745;\n}\n\n.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active,\n.show > .btn-success.dropdown-toggle {\n  color: #fff;\n  background-color: #1e7e34;\n  border-color: #1c7430;\n}\n\n.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-success.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);\n}\n\n.btn-info {\n  color: #fff;\n  background-color: #17a2b8;\n  border-color: #17a2b8;\n}\n\n.btn-info:hover {\n  color: #fff;\n  background-color: #138496;\n  border-color: #117a8b;\n}\n\n.btn-info:focus, .btn-info.focus {\n  box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\n}\n\n.btn-info.disabled, .btn-info:disabled {\n  color: #fff;\n  background-color: #17a2b8;\n  border-color: #17a2b8;\n}\n\n.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active,\n.show > .btn-info.dropdown-toggle {\n  color: #fff;\n  background-color: #117a8b;\n  border-color: #10707f;\n}\n\n.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-info.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\n}\n\n.btn-warning {\n  color: #212529;\n  background-color: #ffc107;\n  border-color: #ffc107;\n}\n\n.btn-warning:hover {\n  color: #212529;\n  background-color: #e0a800;\n  border-color: #d39e00;\n}\n\n.btn-warning:focus, .btn-warning.focus {\n  box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);\n}\n\n.btn-warning.disabled, .btn-warning:disabled {\n  color: #212529;\n  background-color: #ffc107;\n  border-color: #ffc107;\n}\n\n.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active,\n.show > .btn-warning.dropdown-toggle {\n  color: #212529;\n  background-color: #d39e00;\n  border-color: #c69500;\n}\n\n.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-warning.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);\n}\n\n.btn-danger {\n  color: #fff;\n  background-color: #dc3545;\n  border-color: #dc3545;\n}\n\n.btn-danger:hover {\n  color: #fff;\n  background-color: #c82333;\n  border-color: #bd2130;\n}\n\n.btn-danger:focus, .btn-danger.focus {\n  box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);\n}\n\n.btn-danger.disabled, .btn-danger:disabled {\n  color: #fff;\n  background-color: #dc3545;\n  border-color: #dc3545;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active,\n.show > .btn-danger.dropdown-toggle {\n  color: #fff;\n  background-color: #bd2130;\n  border-color: #b21f2d;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-danger.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);\n}\n\n.btn-light {\n  color: #212529;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n\n.btn-light:hover {\n  color: #212529;\n  background-color: #e2e6ea;\n  border-color: #dae0e5;\n}\n\n.btn-light:focus, .btn-light.focus {\n  box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\n}\n\n.btn-light.disabled, .btn-light:disabled {\n  color: #212529;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n\n.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active,\n.show > .btn-light.dropdown-toggle {\n  color: #212529;\n  background-color: #dae0e5;\n  border-color: #d3d9df;\n}\n\n.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-light.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\n}\n\n.btn-dark {\n  color: #fff;\n  background-color: #343a40;\n  border-color: #343a40;\n}\n\n.btn-dark:hover {\n  color: #fff;\n  background-color: #23272b;\n  border-color: #1d2124;\n}\n\n.btn-dark:focus, .btn-dark.focus {\n  box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\n}\n\n.btn-dark.disabled, .btn-dark:disabled {\n  color: #fff;\n  background-color: #343a40;\n  border-color: #343a40;\n}\n\n.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active,\n.show > .btn-dark.dropdown-toggle {\n  color: #fff;\n  background-color: #1d2124;\n  border-color: #171a1d;\n}\n\n.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-dark.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\n}\n\n.btn-outline-primary {\n  color: #007bff;\n  border-color: #007bff;\n}\n\n.btn-outline-primary:hover {\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.btn-outline-primary:focus, .btn-outline-primary.focus {\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-primary.disabled, .btn-outline-primary:disabled {\n  color: #007bff;\n  background-color: transparent;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-primary.dropdown-toggle {\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-primary.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-secondary {\n  color: #6c757d;\n  border-color: #6c757d;\n}\n\n.btn-outline-secondary:hover {\n  color: #fff;\n  background-color: #6c757d;\n  border-color: #6c757d;\n}\n\n.btn-outline-secondary:focus, .btn-outline-secondary.focus {\n  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {\n  color: #6c757d;\n  background-color: transparent;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-secondary.dropdown-toggle {\n  color: #fff;\n  background-color: #6c757d;\n  border-color: #6c757d;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-secondary.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-outline-success {\n  color: #28a745;\n  border-color: #28a745;\n}\n\n.btn-outline-success:hover {\n  color: #fff;\n  background-color: #28a745;\n  border-color: #28a745;\n}\n\n.btn-outline-success:focus, .btn-outline-success.focus {\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-success.disabled, .btn-outline-success:disabled {\n  color: #28a745;\n  background-color: transparent;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active,\n.show > .btn-outline-success.dropdown-toggle {\n  color: #fff;\n  background-color: #28a745;\n  border-color: #28a745;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-success.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-info {\n  color: #17a2b8;\n  border-color: #17a2b8;\n}\n\n.btn-outline-info:hover {\n  color: #fff;\n  background-color: #17a2b8;\n  border-color: #17a2b8;\n}\n\n.btn-outline-info:focus, .btn-outline-info.focus {\n  box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-info.disabled, .btn-outline-info:disabled {\n  color: #17a2b8;\n  background-color: transparent;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active,\n.show > .btn-outline-info.dropdown-toggle {\n  color: #fff;\n  background-color: #17a2b8;\n  border-color: #17a2b8;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-info.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-warning {\n  color: #ffc107;\n  border-color: #ffc107;\n}\n\n.btn-outline-warning:hover {\n  color: #212529;\n  background-color: #ffc107;\n  border-color: #ffc107;\n}\n\n.btn-outline-warning:focus, .btn-outline-warning.focus {\n  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-warning.disabled, .btn-outline-warning:disabled {\n  color: #ffc107;\n  background-color: transparent;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active,\n.show > .btn-outline-warning.dropdown-toggle {\n  color: #212529;\n  background-color: #ffc107;\n  border-color: #ffc107;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-warning.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-danger {\n  color: #dc3545;\n  border-color: #dc3545;\n}\n\n.btn-outline-danger:hover {\n  color: #fff;\n  background-color: #dc3545;\n  border-color: #dc3545;\n}\n\n.btn-outline-danger:focus, .btn-outline-danger.focus {\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-danger.disabled, .btn-outline-danger:disabled {\n  color: #dc3545;\n  background-color: transparent;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active,\n.show > .btn-outline-danger.dropdown-toggle {\n  color: #fff;\n  background-color: #dc3545;\n  border-color: #dc3545;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-danger.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-light {\n  color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n\n.btn-outline-light:hover {\n  color: #212529;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n\n.btn-outline-light:focus, .btn-outline-light.focus {\n  box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-light.disabled, .btn-outline-light:disabled {\n  color: #f8f9fa;\n  background-color: transparent;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active,\n.show > .btn-outline-light.dropdown-toggle {\n  color: #212529;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-light.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-dark {\n  color: #343a40;\n  border-color: #343a40;\n}\n\n.btn-outline-dark:hover {\n  color: #fff;\n  background-color: #343a40;\n  border-color: #343a40;\n}\n\n.btn-outline-dark:focus, .btn-outline-dark.focus {\n  box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-outline-dark.disabled, .btn-outline-dark:disabled {\n  color: #343a40;\n  background-color: transparent;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active,\n.show > .btn-outline-dark.dropdown-toggle {\n  color: #fff;\n  background-color: #343a40;\n  border-color: #343a40;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-dark.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-link {\n  font-weight: 400;\n  color: #007bff;\n  text-decoration: none;\n}\n\n.btn-link:hover {\n  color: #0056b3;\n  text-decoration: underline;\n}\n\n.btn-link:focus, .btn-link.focus {\n  text-decoration: underline;\n  box-shadow: none;\n}\n\n.btn-link:disabled, .btn-link.disabled {\n  color: #6c757d;\n  pointer-events: none;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n  padding: 0.5rem 1rem;\n  font-size: 1.25rem;\n  line-height: 1.5;\n  border-radius: 0.3rem;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n  line-height: 1.5;\n  border-radius: 0.2rem;\n}\n\n.btn-block {\n  display: block;\n  width: 100%;\n}\n\n.btn-block + .btn-block {\n  margin-top: 0.5rem;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n\n.fade {\n  transition: opacity 0.15s linear;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .fade {\n    transition: none;\n  }\n}\n\n.fade:not(.show) {\n  opacity: 0;\n}\n\n.collapse:not(.show) {\n  display: none;\n}\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  transition: height 0.35s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .collapsing {\n    transition: none;\n  }\n}\n\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n  position: relative;\n}\n\n.dropdown-toggle {\n  white-space: nowrap;\n}\n\n.dropdown-toggle::after {\n  display: inline-block;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid;\n  border-right: 0.3em solid transparent;\n  border-bottom: 0;\n  border-left: 0.3em solid transparent;\n}\n\n.dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 10rem;\n  padding: 0.5rem 0;\n  margin: 0.125rem 0 0;\n  font-size: 1rem;\n  color: #212529;\n  text-align: left;\n  list-style: none;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 0.25rem;\n}\n\n.dropdown-menu-left {\n  right: auto;\n  left: 0;\n}\n\n.dropdown-menu-right {\n  right: 0;\n  left: auto;\n}\n\n@media (min-width: 576px) {\n  .dropdown-menu-sm-left {\n    right: auto;\n    left: 0;\n  }\n  .dropdown-menu-sm-right {\n    right: 0;\n    left: auto;\n  }\n}\n\n@media (min-width: 768px) {\n  .dropdown-menu-md-left {\n    right: auto;\n    left: 0;\n  }\n  .dropdown-menu-md-right {\n    right: 0;\n    left: auto;\n  }\n}\n\n@media (min-width: 992px) {\n  .dropdown-menu-lg-left {\n    right: auto;\n    left: 0;\n  }\n  .dropdown-menu-lg-right {\n    right: 0;\n    left: auto;\n  }\n}\n\n@media (min-width: 1200px) {\n  .dropdown-menu-xl-left {\n    right: auto;\n    left: 0;\n  }\n  .dropdown-menu-xl-right {\n    right: 0;\n    left: auto;\n  }\n}\n\n.dropup .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-top: 0;\n  margin-bottom: 0.125rem;\n}\n\n.dropup .dropdown-toggle::after {\n  display: inline-block;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0;\n  border-right: 0.3em solid transparent;\n  border-bottom: 0.3em solid;\n  border-left: 0.3em solid transparent;\n}\n\n.dropup .dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n\n.dropright .dropdown-menu {\n  top: 0;\n  right: auto;\n  left: 100%;\n  margin-top: 0;\n  margin-left: 0.125rem;\n}\n\n.dropright .dropdown-toggle::after {\n  display: inline-block;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid transparent;\n  border-right: 0;\n  border-bottom: 0.3em solid transparent;\n  border-left: 0.3em solid;\n}\n\n.dropright .dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n\n.dropright .dropdown-toggle::after {\n  vertical-align: 0;\n}\n\n.dropleft .dropdown-menu {\n  top: 0;\n  right: 100%;\n  left: auto;\n  margin-top: 0;\n  margin-right: 0.125rem;\n}\n\n.dropleft .dropdown-toggle::after {\n  display: inline-block;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n}\n\n.dropleft .dropdown-toggle::after {\n  display: none;\n}\n\n.dropleft .dropdown-toggle::before {\n  display: inline-block;\n  margin-right: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid transparent;\n  border-right: 0.3em solid;\n  border-bottom: 0.3em solid transparent;\n}\n\n.dropleft .dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n\n.dropleft .dropdown-toggle::before {\n  vertical-align: 0;\n}\n\n.dropdown-menu[x-placement^=\"top\"], .dropdown-menu[x-placement^=\"right\"], .dropdown-menu[x-placement^=\"bottom\"], .dropdown-menu[x-placement^=\"left\"] {\n  right: auto;\n  bottom: auto;\n}\n\n.dropdown-divider {\n  height: 0;\n  margin: 0.5rem 0;\n  overflow: hidden;\n  border-top: 1px solid #e9ecef;\n}\n\n.dropdown-item {\n  display: block;\n  width: 100%;\n  padding: 0.25rem 1.5rem;\n  clear: both;\n  font-weight: 400;\n  color: #212529;\n  text-align: inherit;\n  white-space: nowrap;\n  background-color: transparent;\n  border: 0;\n}\n\n.dropdown-item:hover, .dropdown-item:focus {\n  color: #16181b;\n  text-decoration: none;\n  background-color: #f8f9fa;\n}\n\n.dropdown-item.active, .dropdown-item:active {\n  color: #fff;\n  text-decoration: none;\n  background-color: #007bff;\n}\n\n.dropdown-item.disabled, .dropdown-item:disabled {\n  color: #6c757d;\n  pointer-events: none;\n  background-color: transparent;\n}\n\n.dropdown-menu.show {\n  display: block;\n}\n\n.dropdown-header {\n  display: block;\n  padding: 0.5rem 1.5rem;\n  margin-bottom: 0;\n  font-size: 0.875rem;\n  color: #6c757d;\n  white-space: nowrap;\n}\n\n.dropdown-item-text {\n  display: block;\n  padding: 0.25rem 1.5rem;\n  color: #212529;\n}\n\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: -ms-inline-flexbox;\n  display: inline-flex;\n  vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  -ms-flex: 1 1 auto;\n  flex: 1 1 auto;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover {\n  z-index: 1;\n}\n\n.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n  z-index: 1;\n}\n\n.btn-toolbar {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -ms-flex-pack: start;\n  justify-content: flex-start;\n}\n\n.btn-toolbar .input-group {\n  width: auto;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) {\n  margin-left: -1px;\n}\n\n.btn-group > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group > .btn-group:not(:last-child) > .btn {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) > .btn {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.dropdown-toggle-split {\n  padding-right: 0.5625rem;\n  padding-left: 0.5625rem;\n}\n\n.dropdown-toggle-split::after,\n.dropup .dropdown-toggle-split::after,\n.dropright .dropdown-toggle-split::after {\n  margin-left: 0;\n}\n\n.dropleft .dropdown-toggle-split::before {\n  margin-right: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n  padding-right: 0.375rem;\n  padding-left: 0.375rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n  padding-right: 0.75rem;\n  padding-left: 0.75rem;\n}\n\n.btn-group-vertical {\n  -ms-flex-direction: column;\n  flex-direction: column;\n  -ms-flex-align: start;\n  align-items: flex-start;\n  -ms-flex-pack: center;\n  justify-content: center;\n}\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n  width: 100%;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) {\n  margin-top: -1px;\n}\n\n.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group-vertical > .btn-group:not(:last-child) > .btn {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) > .btn {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n\n.btn-group-toggle > .btn,\n.btn-group-toggle > .btn-group > .btn {\n  margin-bottom: 0;\n}\n\n.btn-group-toggle > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn input[type=\"checkbox\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"checkbox\"] {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  pointer-events: none;\n}\n\n.input-group {\n  position: relative;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -ms-flex-align: stretch;\n  align-items: stretch;\n  width: 100%;\n}\n\n.input-group > .form-control,\n.input-group > .form-control-plaintext,\n.input-group > .custom-select,\n.input-group > .custom-file {\n  position: relative;\n  -ms-flex: 1 1 auto;\n  flex: 1 1 auto;\n  width: 1%;\n  margin-bottom: 0;\n}\n\n.input-group > .form-control + .form-control,\n.input-group > .form-control + .custom-select,\n.input-group > .form-control + .custom-file,\n.input-group > .form-control-plaintext + .form-control,\n.input-group > .form-control-plaintext + .custom-select,\n.input-group > .form-control-plaintext + .custom-file,\n.input-group > .custom-select + .form-control,\n.input-group > .custom-select + .custom-select,\n.input-group > .custom-select + .custom-file,\n.input-group > .custom-file + .form-control,\n.input-group > .custom-file + .custom-select,\n.input-group > .custom-file + .custom-file {\n  margin-left: -1px;\n}\n\n.input-group > .form-control:focus,\n.input-group > .custom-select:focus,\n.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label {\n  z-index: 3;\n}\n\n.input-group > .custom-file .custom-file-input:focus {\n  z-index: 4;\n}\n\n.input-group > .form-control:not(:last-child),\n.input-group > .custom-select:not(:last-child) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.input-group > .form-control:not(:first-child),\n.input-group > .custom-select:not(:first-child) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.input-group > .custom-file {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: center;\n  align-items: center;\n}\n\n.input-group > .custom-file:not(:last-child) .custom-file-label,\n.input-group > .custom-file:not(:last-child) .custom-file-label::after {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.input-group > .custom-file:not(:first-child) .custom-file-label {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.input-group-prepend,\n.input-group-append {\n  display: -ms-flexbox;\n  display: flex;\n}\n\n.input-group-prepend .btn,\n.input-group-append .btn {\n  position: relative;\n  z-index: 2;\n}\n\n.input-group-prepend .btn:focus,\n.input-group-append .btn:focus {\n  z-index: 3;\n}\n\n.input-group-prepend .btn + .btn,\n.input-group-prepend .btn + .input-group-text,\n.input-group-prepend .input-group-text + .input-group-text,\n.input-group-prepend .input-group-text + .btn,\n.input-group-append .btn + .btn,\n.input-group-append .btn + .input-group-text,\n.input-group-append .input-group-text + .input-group-text,\n.input-group-append .input-group-text + .btn {\n  margin-left: -1px;\n}\n\n.input-group-prepend {\n  margin-right: -1px;\n}\n\n.input-group-append {\n  margin-left: -1px;\n}\n\n.input-group-text {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: center;\n  align-items: center;\n  padding: 0.375rem 0.75rem;\n  margin-bottom: 0;\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #495057;\n  text-align: center;\n  white-space: nowrap;\n  background-color: #e9ecef;\n  border: 1px solid #ced4da;\n  border-radius: 0.25rem;\n}\n\n.input-group-text input[type=\"radio\"],\n.input-group-text input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n\n.input-group-lg > .form-control:not(textarea),\n.input-group-lg > .custom-select {\n  height: calc(1.5em + 1rem + 2px);\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .custom-select,\n.input-group-lg > .input-group-prepend > .input-group-text,\n.input-group-lg > .input-group-append > .input-group-text,\n.input-group-lg > .input-group-prepend > .btn,\n.input-group-lg > .input-group-append > .btn {\n  padding: 0.5rem 1rem;\n  font-size: 1.25rem;\n  line-height: 1.5;\n  border-radius: 0.3rem;\n}\n\n.input-group-sm > .form-control:not(textarea),\n.input-group-sm > .custom-select {\n  height: calc(1.5em + 0.5rem + 2px);\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .custom-select,\n.input-group-sm > .input-group-prepend > .input-group-text,\n.input-group-sm > .input-group-append > .input-group-text,\n.input-group-sm > .input-group-prepend > .btn,\n.input-group-sm > .input-group-append > .btn {\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n  line-height: 1.5;\n  border-radius: 0.2rem;\n}\n\n.input-group-lg > .custom-select,\n.input-group-sm > .custom-select {\n  padding-right: 1.75rem;\n}\n\n.input-group > .input-group-prepend > .btn,\n.input-group > .input-group-prepend > .input-group-text,\n.input-group > .input-group-append:not(:last-child) > .btn,\n.input-group > .input-group-append:not(:last-child) > .input-group-text,\n.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.input-group > .input-group-append > .btn,\n.input-group > .input-group-append > .input-group-text,\n.input-group > .input-group-prepend:not(:first-child) > .btn,\n.input-group > .input-group-prepend:not(:first-child) > .input-group-text,\n.input-group > .input-group-prepend:first-child > .btn:not(:first-child),\n.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.custom-control {\n  position: relative;\n  display: block;\n  min-height: 1.5rem;\n  padding-left: 1.5rem;\n}\n\n.custom-control-inline {\n  display: -ms-inline-flexbox;\n  display: inline-flex;\n  margin-right: 1rem;\n}\n\n.custom-control-input {\n  position: absolute;\n  z-index: -1;\n  opacity: 0;\n}\n\n.custom-control-input:checked ~ .custom-control-label::before {\n  color: #fff;\n  border-color: #007bff;\n  background-color: #007bff;\n}\n\n.custom-control-input:focus ~ .custom-control-label::before {\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-control-input:focus:not(:checked) ~ .custom-control-label::before {\n  border-color: #80bdff;\n}\n\n.custom-control-input:not(:disabled):active ~ .custom-control-label::before {\n  color: #fff;\n  background-color: #b3d7ff;\n  border-color: #b3d7ff;\n}\n\n.custom-control-input:disabled ~ .custom-control-label {\n  color: #6c757d;\n}\n\n.custom-control-input:disabled ~ .custom-control-label::before {\n  background-color: #e9ecef;\n}\n\n.custom-control-label {\n  position: relative;\n  margin-bottom: 0;\n  vertical-align: top;\n}\n\n.custom-control-label::before {\n  position: absolute;\n  top: 0.25rem;\n  left: -1.5rem;\n  display: block;\n  width: 1rem;\n  height: 1rem;\n  pointer-events: none;\n  content: \"\";\n  background-color: #fff;\n  border: #adb5bd solid 1px;\n}\n\n.custom-control-label::after {\n  position: absolute;\n  top: 0.25rem;\n  left: -1.5rem;\n  display: block;\n  width: 1rem;\n  height: 1rem;\n  content: \"\";\n  background: no-repeat 50% / 50% 50%;\n}\n\n.custom-checkbox .custom-control-label::before {\n  border-radius: 0.25rem;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e\");\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {\n  border-color: #007bff;\n  background-color: #007bff;\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e\");\n}\n\n.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {\n  background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before {\n  background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-radio .custom-control-label::before {\n  border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::after {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {\n  background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-switch {\n  padding-left: 2.25rem;\n}\n\n.custom-switch .custom-control-label::before {\n  left: -2.25rem;\n  width: 1.75rem;\n  pointer-events: all;\n  border-radius: 0.5rem;\n}\n\n.custom-switch .custom-control-label::after {\n  top: calc(0.25rem + 2px);\n  left: calc(-2.25rem + 2px);\n  width: calc(1rem - 4px);\n  height: calc(1rem - 4px);\n  background-color: #adb5bd;\n  border-radius: 0.5rem;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out;\n  transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .custom-switch .custom-control-label::after {\n    transition: none;\n  }\n}\n\n.custom-switch .custom-control-input:checked ~ .custom-control-label::after {\n  background-color: #fff;\n  -webkit-transform: translateX(0.75rem);\n  transform: translateX(0.75rem);\n}\n\n.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before {\n  background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-select {\n  display: inline-block;\n  width: 100%;\n  height: calc(1.5em + 0.75rem + 2px);\n  padding: 0.375rem 1.75rem 0.375rem 0.75rem;\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #495057;\n  vertical-align: middle;\n  background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px;\n  background-color: #fff;\n  border: 1px solid #ced4da;\n  border-radius: 0.25rem;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n}\n\n.custom-select:focus {\n  border-color: #80bdff;\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-select:focus::-ms-value {\n  color: #495057;\n  background-color: #fff;\n}\n\n.custom-select[multiple], .custom-select[size]:not([size=\"1\"]) {\n  height: auto;\n  padding-right: 0.75rem;\n  background-image: none;\n}\n\n.custom-select:disabled {\n  color: #6c757d;\n  background-color: #e9ecef;\n}\n\n.custom-select::-ms-expand {\n  display: none;\n}\n\n.custom-select-sm {\n  height: calc(1.5em + 0.5rem + 2px);\n  padding-top: 0.25rem;\n  padding-bottom: 0.25rem;\n  padding-left: 0.5rem;\n  font-size: 0.875rem;\n}\n\n.custom-select-lg {\n  height: calc(1.5em + 1rem + 2px);\n  padding-top: 0.5rem;\n  padding-bottom: 0.5rem;\n  padding-left: 1rem;\n  font-size: 1.25rem;\n}\n\n.custom-file {\n  position: relative;\n  display: inline-block;\n  width: 100%;\n  height: calc(1.5em + 0.75rem + 2px);\n  margin-bottom: 0;\n}\n\n.custom-file-input {\n  position: relative;\n  z-index: 2;\n  width: 100%;\n  height: calc(1.5em + 0.75rem + 2px);\n  margin: 0;\n  opacity: 0;\n}\n\n.custom-file-input:focus ~ .custom-file-label {\n  border-color: #80bdff;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-file-input:disabled ~ .custom-file-label {\n  background-color: #e9ecef;\n}\n\n.custom-file-input:lang(en) ~ .custom-file-label::after {\n  content: \"Browse\";\n}\n\n.custom-file-input ~ .custom-file-label[data-browse]::after {\n  content: attr(data-browse);\n}\n\n.custom-file-label {\n  position: absolute;\n  top: 0;\n  right: 0;\n  left: 0;\n  z-index: 1;\n  height: calc(1.5em + 0.75rem + 2px);\n  padding: 0.375rem 0.75rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #495057;\n  background-color: #fff;\n  border: 1px solid #ced4da;\n  border-radius: 0.25rem;\n}\n\n.custom-file-label::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  z-index: 3;\n  display: block;\n  height: calc(1.5em + 0.75rem);\n  padding: 0.375rem 0.75rem;\n  line-height: 1.5;\n  color: #495057;\n  content: \"Browse\";\n  background-color: #e9ecef;\n  border-left: inherit;\n  border-radius: 0 0.25rem 0.25rem 0;\n}\n\n.custom-range {\n  width: 100%;\n  height: calc(1rem + 0.4rem);\n  padding: 0;\n  background-color: transparent;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n}\n\n.custom-range:focus {\n  outline: none;\n}\n\n.custom-range:focus::-webkit-slider-thumb {\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range:focus::-moz-range-thumb {\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range:focus::-ms-thumb {\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range::-moz-focus-outer {\n  border: 0;\n}\n\n.custom-range::-webkit-slider-thumb {\n  width: 1rem;\n  height: 1rem;\n  margin-top: -0.25rem;\n  background-color: #007bff;\n  border: 0;\n  border-radius: 1rem;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  -webkit-appearance: none;\n  appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .custom-range::-webkit-slider-thumb {\n    transition: none;\n  }\n}\n\n.custom-range::-webkit-slider-thumb:active {\n  background-color: #b3d7ff;\n}\n\n.custom-range::-webkit-slider-runnable-track {\n  width: 100%;\n  height: 0.5rem;\n  color: transparent;\n  cursor: pointer;\n  background-color: #dee2e6;\n  border-color: transparent;\n  border-radius: 1rem;\n}\n\n.custom-range::-moz-range-thumb {\n  width: 1rem;\n  height: 1rem;\n  background-color: #007bff;\n  border: 0;\n  border-radius: 1rem;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  -moz-appearance: none;\n  appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .custom-range::-moz-range-thumb {\n    transition: none;\n  }\n}\n\n.custom-range::-moz-range-thumb:active {\n  background-color: #b3d7ff;\n}\n\n.custom-range::-moz-range-track {\n  width: 100%;\n  height: 0.5rem;\n  color: transparent;\n  cursor: pointer;\n  background-color: #dee2e6;\n  border-color: transparent;\n  border-radius: 1rem;\n}\n\n.custom-range::-ms-thumb {\n  width: 1rem;\n  height: 1rem;\n  margin-top: 0;\n  margin-right: 0.2rem;\n  margin-left: 0.2rem;\n  background-color: #007bff;\n  border: 0;\n  border-radius: 1rem;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .custom-range::-ms-thumb {\n    transition: none;\n  }\n}\n\n.custom-range::-ms-thumb:active {\n  background-color: #b3d7ff;\n}\n\n.custom-range::-ms-track {\n  width: 100%;\n  height: 0.5rem;\n  color: transparent;\n  cursor: pointer;\n  background-color: transparent;\n  border-color: transparent;\n  border-width: 0.5rem;\n}\n\n.custom-range::-ms-fill-lower {\n  background-color: #dee2e6;\n  border-radius: 1rem;\n}\n\n.custom-range::-ms-fill-upper {\n  margin-right: 15px;\n  background-color: #dee2e6;\n  border-radius: 1rem;\n}\n\n.custom-range:disabled::-webkit-slider-thumb {\n  background-color: #adb5bd;\n}\n\n.custom-range:disabled::-webkit-slider-runnable-track {\n  cursor: default;\n}\n\n.custom-range:disabled::-moz-range-thumb {\n  background-color: #adb5bd;\n}\n\n.custom-range:disabled::-moz-range-track {\n  cursor: default;\n}\n\n.custom-range:disabled::-ms-thumb {\n  background-color: #adb5bd;\n}\n\n.custom-control-label::before,\n.custom-file-label,\n.custom-select {\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .custom-control-label::before,\n  .custom-file-label,\n  .custom-select {\n    transition: none;\n  }\n}\n\n.nav {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n\n.nav-link {\n  display: block;\n  padding: 0.5rem 1rem;\n}\n\n.nav-link:hover, .nav-link:focus {\n  text-decoration: none;\n}\n\n.nav-link.disabled {\n  color: #6c757d;\n  pointer-events: none;\n  cursor: default;\n}\n\n.nav-tabs {\n  border-bottom: 1px solid #dee2e6;\n}\n\n.nav-tabs .nav-item {\n  margin-bottom: -1px;\n}\n\n.nav-tabs .nav-link {\n  border: 1px solid transparent;\n  border-top-left-radius: 0.25rem;\n  border-top-right-radius: 0.25rem;\n}\n\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n  border-color: #e9ecef #e9ecef #dee2e6;\n}\n\n.nav-tabs .nav-link.disabled {\n  color: #6c757d;\n  background-color: transparent;\n  border-color: transparent;\n}\n\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n  color: #495057;\n  background-color: #fff;\n  border-color: #dee2e6 #dee2e6 #fff;\n}\n\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n\n.nav-pills .nav-link {\n  border-radius: 0.25rem;\n}\n\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n  color: #fff;\n  background-color: #007bff;\n}\n\n.nav-fill .nav-item {\n  -ms-flex: 1 1 auto;\n  flex: 1 1 auto;\n  text-align: center;\n}\n\n.nav-justified .nav-item {\n  -ms-flex-preferred-size: 0;\n  flex-basis: 0;\n  -ms-flex-positive: 1;\n  flex-grow: 1;\n  text-align: center;\n}\n\n.tab-content > .tab-pane {\n  display: none;\n}\n\n.tab-content > .active {\n  display: block;\n}\n\n.navbar {\n  position: relative;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -ms-flex-align: center;\n  align-items: center;\n  -ms-flex-pack: justify;\n  justify-content: space-between;\n  padding: 0.5rem 1rem;\n}\n\n.navbar > .container,\n.navbar > .container-fluid {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -ms-flex-align: center;\n  align-items: center;\n  -ms-flex-pack: justify;\n  justify-content: space-between;\n}\n\n.navbar-brand {\n  display: inline-block;\n  padding-top: 0.3125rem;\n  padding-bottom: 0.3125rem;\n  margin-right: 1rem;\n  font-size: 1.25rem;\n  line-height: inherit;\n  white-space: nowrap;\n}\n\n.navbar-brand:hover, .navbar-brand:focus {\n  text-decoration: none;\n}\n\n.navbar-nav {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-direction: column;\n  flex-direction: column;\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n\n.navbar-nav .nav-link {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.navbar-nav .dropdown-menu {\n  position: static;\n  float: none;\n}\n\n.navbar-text {\n  display: inline-block;\n  padding-top: 0.5rem;\n  padding-bottom: 0.5rem;\n}\n\n.navbar-collapse {\n  -ms-flex-preferred-size: 100%;\n  flex-basis: 100%;\n  -ms-flex-positive: 1;\n  flex-grow: 1;\n  -ms-flex-align: center;\n  align-items: center;\n}\n\n.navbar-toggler {\n  padding: 0.25rem 0.75rem;\n  font-size: 1.25rem;\n  line-height: 1;\n  background-color: transparent;\n  border: 1px solid transparent;\n  border-radius: 0.25rem;\n}\n\n.navbar-toggler:hover, .navbar-toggler:focus {\n  text-decoration: none;\n}\n\n.navbar-toggler-icon {\n  display: inline-block;\n  width: 1.5em;\n  height: 1.5em;\n  vertical-align: middle;\n  content: \"\";\n  background: no-repeat center center;\n  background-size: 100% 100%;\n}\n\n@media (max-width: 575.98px) {\n  .navbar-expand-sm > .container,\n  .navbar-expand-sm > .container-fluid {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n\n@media (min-width: 576px) {\n  .navbar-expand-sm {\n    -ms-flex-flow: row nowrap;\n    flex-flow: row nowrap;\n    -ms-flex-pack: start;\n    justify-content: flex-start;\n  }\n  .navbar-expand-sm .navbar-nav {\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .navbar-expand-sm .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-sm .navbar-nav .nav-link {\n    padding-right: 0.5rem;\n    padding-left: 0.5rem;\n  }\n  .navbar-expand-sm > .container,\n  .navbar-expand-sm > .container-fluid {\n    -ms-flex-wrap: nowrap;\n    flex-wrap: nowrap;\n  }\n  .navbar-expand-sm .navbar-collapse {\n    display: -ms-flexbox !important;\n    display: flex !important;\n    -ms-flex-preferred-size: auto;\n    flex-basis: auto;\n  }\n  .navbar-expand-sm .navbar-toggler {\n    display: none;\n  }\n}\n\n@media (max-width: 767.98px) {\n  .navbar-expand-md > .container,\n  .navbar-expand-md > .container-fluid {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-expand-md {\n    -ms-flex-flow: row nowrap;\n    flex-flow: row nowrap;\n    -ms-flex-pack: start;\n    justify-content: flex-start;\n  }\n  .navbar-expand-md .navbar-nav {\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .navbar-expand-md .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-md .navbar-nav .nav-link {\n    padding-right: 0.5rem;\n    padding-left: 0.5rem;\n  }\n  .navbar-expand-md > .container,\n  .navbar-expand-md > .container-fluid {\n    -ms-flex-wrap: nowrap;\n    flex-wrap: nowrap;\n  }\n  .navbar-expand-md .navbar-collapse {\n    display: -ms-flexbox !important;\n    display: flex !important;\n    -ms-flex-preferred-size: auto;\n    flex-basis: auto;\n  }\n  .navbar-expand-md .navbar-toggler {\n    display: none;\n  }\n}\n\n@media (max-width: 991.98px) {\n  .navbar-expand-lg > .container,\n  .navbar-expand-lg > .container-fluid {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n\n@media (min-width: 992px) {\n  .navbar-expand-lg {\n    -ms-flex-flow: row nowrap;\n    flex-flow: row nowrap;\n    -ms-flex-pack: start;\n    justify-content: flex-start;\n  }\n  .navbar-expand-lg .navbar-nav {\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .navbar-expand-lg .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-lg .navbar-nav .nav-link {\n    padding-right: 0.5rem;\n    padding-left: 0.5rem;\n  }\n  .navbar-expand-lg > .container,\n  .navbar-expand-lg > .container-fluid {\n    -ms-flex-wrap: nowrap;\n    flex-wrap: nowrap;\n  }\n  .navbar-expand-lg .navbar-collapse {\n    display: -ms-flexbox !important;\n    display: flex !important;\n    -ms-flex-preferred-size: auto;\n    flex-basis: auto;\n  }\n  .navbar-expand-lg .navbar-toggler {\n    display: none;\n  }\n}\n\n@media (max-width: 1199.98px) {\n  .navbar-expand-xl > .container,\n  .navbar-expand-xl > .container-fluid {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n\n@media (min-width: 1200px) {\n  .navbar-expand-xl {\n    -ms-flex-flow: row nowrap;\n    flex-flow: row nowrap;\n    -ms-flex-pack: start;\n    justify-content: flex-start;\n  }\n  .navbar-expand-xl .navbar-nav {\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .navbar-expand-xl .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-xl .navbar-nav .nav-link {\n    padding-right: 0.5rem;\n    padding-left: 0.5rem;\n  }\n  .navbar-expand-xl > .container,\n  .navbar-expand-xl > .container-fluid {\n    -ms-flex-wrap: nowrap;\n    flex-wrap: nowrap;\n  }\n  .navbar-expand-xl .navbar-collapse {\n    display: -ms-flexbox !important;\n    display: flex !important;\n    -ms-flex-preferred-size: auto;\n    flex-basis: auto;\n  }\n  .navbar-expand-xl .navbar-toggler {\n    display: none;\n  }\n}\n\n.navbar-expand {\n  -ms-flex-flow: row nowrap;\n  flex-flow: row nowrap;\n  -ms-flex-pack: start;\n  justify-content: flex-start;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.navbar-expand .navbar-nav {\n  -ms-flex-direction: row;\n  flex-direction: row;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu {\n  position: absolute;\n}\n\n.navbar-expand .navbar-nav .nav-link {\n  padding-right: 0.5rem;\n  padding-left: 0.5rem;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n  -ms-flex-wrap: nowrap;\n  flex-wrap: nowrap;\n}\n\n.navbar-expand .navbar-collapse {\n  display: -ms-flexbox !important;\n  display: flex !important;\n  -ms-flex-preferred-size: auto;\n  flex-basis: auto;\n}\n\n.navbar-expand .navbar-toggler {\n  display: none;\n}\n\n.navbar-light .navbar-brand {\n  color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {\n  color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-nav .nav-link {\n  color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {\n  color: rgba(0, 0, 0, 0.7);\n}\n\n.navbar-light .navbar-nav .nav-link.disabled {\n  color: rgba(0, 0, 0, 0.3);\n}\n\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .active > .nav-link,\n.navbar-light .navbar-nav .nav-link.show,\n.navbar-light .navbar-nav .nav-link.active {\n  color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-toggler {\n  color: rgba(0, 0, 0, 0.5);\n  border-color: rgba(0, 0, 0, 0.1);\n}\n\n.navbar-light .navbar-toggler-icon {\n  background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n.navbar-light .navbar-text {\n  color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-text a {\n  color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {\n  color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-dark .navbar-brand {\n  color: #fff;\n}\n\n.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {\n  color: #fff;\n}\n\n.navbar-dark .navbar-nav .nav-link {\n  color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {\n  color: rgba(255, 255, 255, 0.75);\n}\n\n.navbar-dark .navbar-nav .nav-link.disabled {\n  color: rgba(255, 255, 255, 0.25);\n}\n\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .active > .nav-link,\n.navbar-dark .navbar-nav .nav-link.show,\n.navbar-dark .navbar-nav .nav-link.active {\n  color: #fff;\n}\n\n.navbar-dark .navbar-toggler {\n  color: rgba(255, 255, 255, 0.5);\n  border-color: rgba(255, 255, 255, 0.1);\n}\n\n.navbar-dark .navbar-toggler-icon {\n  background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n.navbar-dark .navbar-text {\n  color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-text a {\n  color: #fff;\n}\n\n.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {\n  color: #fff;\n}\n\n.card {\n  position: relative;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-direction: column;\n  flex-direction: column;\n  min-width: 0;\n  word-wrap: break-word;\n  background-color: #fff;\n  background-clip: border-box;\n  border: 1px solid rgba(0, 0, 0, 0.125);\n  border-radius: 0.25rem;\n}\n\n.card > hr {\n  margin-right: 0;\n  margin-left: 0;\n}\n\n.card > .list-group:first-child .list-group-item:first-child {\n  border-top-left-radius: 0.25rem;\n  border-top-right-radius: 0.25rem;\n}\n\n.card > .list-group:last-child .list-group-item:last-child {\n  border-bottom-right-radius: 0.25rem;\n  border-bottom-left-radius: 0.25rem;\n}\n\n.card-body {\n  -ms-flex: 1 1 auto;\n  flex: 1 1 auto;\n  padding: 1.25rem;\n}\n\n.card-title {\n  margin-bottom: 0.75rem;\n}\n\n.card-subtitle {\n  margin-top: -0.375rem;\n  margin-bottom: 0;\n}\n\n.card-text:last-child {\n  margin-bottom: 0;\n}\n\n.card-link:hover {\n  text-decoration: none;\n}\n\n.card-link + .card-link {\n  margin-left: 1.25rem;\n}\n\n.card-header {\n  padding: 0.75rem 1.25rem;\n  margin-bottom: 0;\n  background-color: rgba(0, 0, 0, 0.03);\n  border-bottom: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-header:first-child {\n  border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\n}\n\n.card-header + .list-group .list-group-item:first-child {\n  border-top: 0;\n}\n\n.card-footer {\n  padding: 0.75rem 1.25rem;\n  background-color: rgba(0, 0, 0, 0.03);\n  border-top: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-footer:last-child {\n  border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\n}\n\n.card-header-tabs {\n  margin-right: -0.625rem;\n  margin-bottom: -0.75rem;\n  margin-left: -0.625rem;\n  border-bottom: 0;\n}\n\n.card-header-pills {\n  margin-right: -0.625rem;\n  margin-left: -0.625rem;\n}\n\n.card-img-overlay {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  padding: 1.25rem;\n}\n\n.card-img {\n  width: 100%;\n  border-radius: calc(0.25rem - 1px);\n}\n\n.card-img-top {\n  width: 100%;\n  border-top-left-radius: calc(0.25rem - 1px);\n  border-top-right-radius: calc(0.25rem - 1px);\n}\n\n.card-img-bottom {\n  width: 100%;\n  border-bottom-right-radius: calc(0.25rem - 1px);\n  border-bottom-left-radius: calc(0.25rem - 1px);\n}\n\n.card-deck {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-direction: column;\n  flex-direction: column;\n}\n\n.card-deck .card {\n  margin-bottom: 15px;\n}\n\n@media (min-width: 576px) {\n  .card-deck {\n    -ms-flex-flow: row wrap;\n    flex-flow: row wrap;\n    margin-right: -15px;\n    margin-left: -15px;\n  }\n  .card-deck .card {\n    display: -ms-flexbox;\n    display: flex;\n    -ms-flex: 1 0 0%;\n    flex: 1 0 0%;\n    -ms-flex-direction: column;\n    flex-direction: column;\n    margin-right: 15px;\n    margin-bottom: 0;\n    margin-left: 15px;\n  }\n}\n\n.card-group {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-direction: column;\n  flex-direction: column;\n}\n\n.card-group > .card {\n  margin-bottom: 15px;\n}\n\n@media (min-width: 576px) {\n  .card-group {\n    -ms-flex-flow: row wrap;\n    flex-flow: row wrap;\n  }\n  .card-group > .card {\n    -ms-flex: 1 0 0%;\n    flex: 1 0 0%;\n    margin-bottom: 0;\n  }\n  .card-group > .card + .card {\n    margin-left: 0;\n    border-left: 0;\n  }\n  .card-group > .card:not(:last-child) {\n    border-top-right-radius: 0;\n    border-bottom-right-radius: 0;\n  }\n  .card-group > .card:not(:last-child) .card-img-top,\n  .card-group > .card:not(:last-child) .card-header {\n    border-top-right-radius: 0;\n  }\n  .card-group > .card:not(:last-child) .card-img-bottom,\n  .card-group > .card:not(:last-child) .card-footer {\n    border-bottom-right-radius: 0;\n  }\n  .card-group > .card:not(:first-child) {\n    border-top-left-radius: 0;\n    border-bottom-left-radius: 0;\n  }\n  .card-group > .card:not(:first-child) .card-img-top,\n  .card-group > .card:not(:first-child) .card-header {\n    border-top-left-radius: 0;\n  }\n  .card-group > .card:not(:first-child) .card-img-bottom,\n  .card-group > .card:not(:first-child) .card-footer {\n    border-bottom-left-radius: 0;\n  }\n}\n\n.card-columns .card {\n  margin-bottom: 0.75rem;\n}\n\n@media (min-width: 576px) {\n  .card-columns {\n    -webkit-column-count: 3;\n    -moz-column-count: 3;\n    column-count: 3;\n    -webkit-column-gap: 1.25rem;\n    -moz-column-gap: 1.25rem;\n    column-gap: 1.25rem;\n    orphans: 1;\n    widows: 1;\n  }\n  .card-columns .card {\n    display: inline-block;\n    width: 100%;\n  }\n}\n\n.accordion > .card {\n  overflow: hidden;\n}\n\n.accordion > .card:not(:first-of-type) .card-header:first-child {\n  border-radius: 0;\n}\n\n.accordion > .card:not(:first-of-type):not(:last-of-type) {\n  border-bottom: 0;\n  border-radius: 0;\n}\n\n.accordion > .card:first-of-type {\n  border-bottom: 0;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.accordion > .card:last-of-type {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n\n.accordion > .card .card-header {\n  margin-bottom: -1px;\n}\n\n.breadcrumb {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  padding: 0.75rem 1rem;\n  margin-bottom: 1rem;\n  list-style: none;\n  background-color: #e9ecef;\n  border-radius: 0.25rem;\n}\n\n.breadcrumb-item + .breadcrumb-item {\n  padding-left: 0.5rem;\n}\n\n.breadcrumb-item + .breadcrumb-item::before {\n  display: inline-block;\n  padding-right: 0.5rem;\n  color: #6c757d;\n  content: \"/\";\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n  text-decoration: underline;\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n  text-decoration: none;\n}\n\n.breadcrumb-item.active {\n  color: #6c757d;\n}\n\n.pagination {\n  display: -ms-flexbox;\n  display: flex;\n  padding-left: 0;\n  list-style: none;\n  border-radius: 0.25rem;\n}\n\n.page-link {\n  position: relative;\n  display: block;\n  padding: 0.5rem 0.75rem;\n  margin-left: -1px;\n  line-height: 1.25;\n  color: #007bff;\n  background-color: #fff;\n  border: 1px solid #dee2e6;\n}\n\n.page-link:hover {\n  z-index: 2;\n  color: #0056b3;\n  text-decoration: none;\n  background-color: #e9ecef;\n  border-color: #dee2e6;\n}\n\n.page-link:focus {\n  z-index: 2;\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.page-item:first-child .page-link {\n  margin-left: 0;\n  border-top-left-radius: 0.25rem;\n  border-bottom-left-radius: 0.25rem;\n}\n\n.page-item:last-child .page-link {\n  border-top-right-radius: 0.25rem;\n  border-bottom-right-radius: 0.25rem;\n}\n\n.page-item.active .page-link {\n  z-index: 1;\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.page-item.disabled .page-link {\n  color: #6c757d;\n  pointer-events: none;\n  cursor: auto;\n  background-color: #fff;\n  border-color: #dee2e6;\n}\n\n.pagination-lg .page-link {\n  padding: 0.75rem 1.5rem;\n  font-size: 1.25rem;\n  line-height: 1.5;\n}\n\n.pagination-lg .page-item:first-child .page-link {\n  border-top-left-radius: 0.3rem;\n  border-bottom-left-radius: 0.3rem;\n}\n\n.pagination-lg .page-item:last-child .page-link {\n  border-top-right-radius: 0.3rem;\n  border-bottom-right-radius: 0.3rem;\n}\n\n.pagination-sm .page-link {\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n  line-height: 1.5;\n}\n\n.pagination-sm .page-item:first-child .page-link {\n  border-top-left-radius: 0.2rem;\n  border-bottom-left-radius: 0.2rem;\n}\n\n.pagination-sm .page-item:last-child .page-link {\n  border-top-right-radius: 0.2rem;\n  border-bottom-right-radius: 0.2rem;\n}\n\n.badge {\n  display: inline-block;\n  padding: 0.25em 0.4em;\n  font-size: 75%;\n  font-weight: 700;\n  line-height: 1;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: 0.25rem;\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .badge {\n    transition: none;\n  }\n}\n\na.badge:hover, a.badge:focus {\n  text-decoration: none;\n}\n\n.badge:empty {\n  display: none;\n}\n\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n\n.badge-pill {\n  padding-right: 0.6em;\n  padding-left: 0.6em;\n  border-radius: 10rem;\n}\n\n.badge-primary {\n  color: #fff;\n  background-color: #007bff;\n}\n\na.badge-primary:hover, a.badge-primary:focus {\n  color: #fff;\n  background-color: #0062cc;\n}\n\na.badge-primary:focus, a.badge-primary.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.badge-secondary {\n  color: #fff;\n  background-color: #6c757d;\n}\n\na.badge-secondary:hover, a.badge-secondary:focus {\n  color: #fff;\n  background-color: #545b62;\n}\n\na.badge-secondary:focus, a.badge-secondary.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.badge-success {\n  color: #fff;\n  background-color: #28a745;\n}\n\na.badge-success:hover, a.badge-success:focus {\n  color: #fff;\n  background-color: #1e7e34;\n}\n\na.badge-success:focus, a.badge-success.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.badge-info {\n  color: #fff;\n  background-color: #17a2b8;\n}\n\na.badge-info:hover, a.badge-info:focus {\n  color: #fff;\n  background-color: #117a8b;\n}\n\na.badge-info:focus, a.badge-info.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.badge-warning {\n  color: #212529;\n  background-color: #ffc107;\n}\n\na.badge-warning:hover, a.badge-warning:focus {\n  color: #212529;\n  background-color: #d39e00;\n}\n\na.badge-warning:focus, a.badge-warning.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.badge-danger {\n  color: #fff;\n  background-color: #dc3545;\n}\n\na.badge-danger:hover, a.badge-danger:focus {\n  color: #fff;\n  background-color: #bd2130;\n}\n\na.badge-danger:focus, a.badge-danger.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.badge-light {\n  color: #212529;\n  background-color: #f8f9fa;\n}\n\na.badge-light:hover, a.badge-light:focus {\n  color: #212529;\n  background-color: #dae0e5;\n}\n\na.badge-light:focus, a.badge-light.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.badge-dark {\n  color: #fff;\n  background-color: #343a40;\n}\n\na.badge-dark:hover, a.badge-dark:focus {\n  color: #fff;\n  background-color: #1d2124;\n}\n\na.badge-dark:focus, a.badge-dark.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.jumbotron {\n  padding: 2rem 1rem;\n  margin-bottom: 2rem;\n  background-color: #e9ecef;\n  border-radius: 0.3rem;\n}\n\n@media (min-width: 576px) {\n  .jumbotron {\n    padding: 4rem 2rem;\n  }\n}\n\n.jumbotron-fluid {\n  padding-right: 0;\n  padding-left: 0;\n  border-radius: 0;\n}\n\n.alert {\n  position: relative;\n  padding: 0.75rem 1.25rem;\n  margin-bottom: 1rem;\n  border: 1px solid transparent;\n  border-radius: 0.25rem;\n}\n\n.alert-heading {\n  color: inherit;\n}\n\n.alert-link {\n  font-weight: 700;\n}\n\n.alert-dismissible {\n  padding-right: 4rem;\n}\n\n.alert-dismissible .close {\n  position: absolute;\n  top: 0;\n  right: 0;\n  padding: 0.75rem 1.25rem;\n  color: inherit;\n}\n\n.alert-primary {\n  color: #004085;\n  background-color: #cce5ff;\n  border-color: #b8daff;\n}\n\n.alert-primary hr {\n  border-top-color: #9fcdff;\n}\n\n.alert-primary .alert-link {\n  color: #002752;\n}\n\n.alert-secondary {\n  color: #383d41;\n  background-color: #e2e3e5;\n  border-color: #d6d8db;\n}\n\n.alert-secondary hr {\n  border-top-color: #c8cbcf;\n}\n\n.alert-secondary .alert-link {\n  color: #202326;\n}\n\n.alert-success {\n  color: #155724;\n  background-color: #d4edda;\n  border-color: #c3e6cb;\n}\n\n.alert-success hr {\n  border-top-color: #b1dfbb;\n}\n\n.alert-success .alert-link {\n  color: #0b2e13;\n}\n\n.alert-info {\n  color: #0c5460;\n  background-color: #d1ecf1;\n  border-color: #bee5eb;\n}\n\n.alert-info hr {\n  border-top-color: #abdde5;\n}\n\n.alert-info .alert-link {\n  color: #062c33;\n}\n\n.alert-warning {\n  color: #856404;\n  background-color: #fff3cd;\n  border-color: #ffeeba;\n}\n\n.alert-warning hr {\n  border-top-color: #ffe8a1;\n}\n\n.alert-warning .alert-link {\n  color: #533f03;\n}\n\n.alert-danger {\n  color: #721c24;\n  background-color: #f8d7da;\n  border-color: #f5c6cb;\n}\n\n.alert-danger hr {\n  border-top-color: #f1b0b7;\n}\n\n.alert-danger .alert-link {\n  color: #491217;\n}\n\n.alert-light {\n  color: #818182;\n  background-color: #fefefe;\n  border-color: #fdfdfe;\n}\n\n.alert-light hr {\n  border-top-color: #ececf6;\n}\n\n.alert-light .alert-link {\n  color: #686868;\n}\n\n.alert-dark {\n  color: #1b1e21;\n  background-color: #d6d8d9;\n  border-color: #c6c8ca;\n}\n\n.alert-dark hr {\n  border-top-color: #b9bbbe;\n}\n\n.alert-dark .alert-link {\n  color: #040505;\n}\n\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 1rem 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 1rem 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n.progress {\n  display: -ms-flexbox;\n  display: flex;\n  height: 1rem;\n  overflow: hidden;\n  font-size: 0.75rem;\n  background-color: #e9ecef;\n  border-radius: 0.25rem;\n}\n\n.progress-bar {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-direction: column;\n  flex-direction: column;\n  -ms-flex-pack: center;\n  justify-content: center;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  background-color: #007bff;\n  transition: width 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .progress-bar {\n    transition: none;\n  }\n}\n\n.progress-bar-striped {\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-size: 1rem 1rem;\n}\n\n.progress-bar-animated {\n  -webkit-animation: progress-bar-stripes 1s linear infinite;\n  animation: progress-bar-stripes 1s linear infinite;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .progress-bar-animated {\n    -webkit-animation: none;\n    animation: none;\n  }\n}\n\n.media {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: start;\n  align-items: flex-start;\n}\n\n.media-body {\n  -ms-flex: 1;\n  flex: 1;\n}\n\n.list-group {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-direction: column;\n  flex-direction: column;\n  padding-left: 0;\n  margin-bottom: 0;\n}\n\n.list-group-item-action {\n  width: 100%;\n  color: #495057;\n  text-align: inherit;\n}\n\n.list-group-item-action:hover, .list-group-item-action:focus {\n  z-index: 1;\n  color: #495057;\n  text-decoration: none;\n  background-color: #f8f9fa;\n}\n\n.list-group-item-action:active {\n  color: #212529;\n  background-color: #e9ecef;\n}\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 0.75rem 1.25rem;\n  margin-bottom: -1px;\n  background-color: #fff;\n  border: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.list-group-item:first-child {\n  border-top-left-radius: 0.25rem;\n  border-top-right-radius: 0.25rem;\n}\n\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 0.25rem;\n  border-bottom-left-radius: 0.25rem;\n}\n\n.list-group-item.disabled, .list-group-item:disabled {\n  color: #6c757d;\n  pointer-events: none;\n  background-color: #fff;\n}\n\n.list-group-item.active {\n  z-index: 2;\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.list-group-horizontal {\n  -ms-flex-direction: row;\n  flex-direction: row;\n}\n\n.list-group-horizontal .list-group-item {\n  margin-right: -1px;\n  margin-bottom: 0;\n}\n\n.list-group-horizontal .list-group-item:first-child {\n  border-top-left-radius: 0.25rem;\n  border-bottom-left-radius: 0.25rem;\n  border-top-right-radius: 0;\n}\n\n.list-group-horizontal .list-group-item:last-child {\n  margin-right: 0;\n  border-top-right-radius: 0.25rem;\n  border-bottom-right-radius: 0.25rem;\n  border-bottom-left-radius: 0;\n}\n\n@media (min-width: 576px) {\n  .list-group-horizontal-sm {\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .list-group-horizontal-sm .list-group-item {\n    margin-right: -1px;\n    margin-bottom: 0;\n  }\n  .list-group-horizontal-sm .list-group-item:first-child {\n    border-top-left-radius: 0.25rem;\n    border-bottom-left-radius: 0.25rem;\n    border-top-right-radius: 0;\n  }\n  .list-group-horizontal-sm .list-group-item:last-child {\n    margin-right: 0;\n    border-top-right-radius: 0.25rem;\n    border-bottom-right-radius: 0.25rem;\n    border-bottom-left-radius: 0;\n  }\n}\n\n@media (min-width: 768px) {\n  .list-group-horizontal-md {\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .list-group-horizontal-md .list-group-item {\n    margin-right: -1px;\n    margin-bottom: 0;\n  }\n  .list-group-horizontal-md .list-group-item:first-child {\n    border-top-left-radius: 0.25rem;\n    border-bottom-left-radius: 0.25rem;\n    border-top-right-radius: 0;\n  }\n  .list-group-horizontal-md .list-group-item:last-child {\n    margin-right: 0;\n    border-top-right-radius: 0.25rem;\n    border-bottom-right-radius: 0.25rem;\n    border-bottom-left-radius: 0;\n  }\n}\n\n@media (min-width: 992px) {\n  .list-group-horizontal-lg {\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .list-group-horizontal-lg .list-group-item {\n    margin-right: -1px;\n    margin-bottom: 0;\n  }\n  .list-group-horizontal-lg .list-group-item:first-child {\n    border-top-left-radius: 0.25rem;\n    border-bottom-left-radius: 0.25rem;\n    border-top-right-radius: 0;\n  }\n  .list-group-horizontal-lg .list-group-item:last-child {\n    margin-right: 0;\n    border-top-right-radius: 0.25rem;\n    border-bottom-right-radius: 0.25rem;\n    border-bottom-left-radius: 0;\n  }\n}\n\n@media (min-width: 1200px) {\n  .list-group-horizontal-xl {\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .list-group-horizontal-xl .list-group-item {\n    margin-right: -1px;\n    margin-bottom: 0;\n  }\n  .list-group-horizontal-xl .list-group-item:first-child {\n    border-top-left-radius: 0.25rem;\n    border-bottom-left-radius: 0.25rem;\n    border-top-right-radius: 0;\n  }\n  .list-group-horizontal-xl .list-group-item:last-child {\n    margin-right: 0;\n    border-top-right-radius: 0.25rem;\n    border-bottom-right-radius: 0.25rem;\n    border-bottom-left-radius: 0;\n  }\n}\n\n.list-group-flush .list-group-item {\n  border-right: 0;\n  border-left: 0;\n  border-radius: 0;\n}\n\n.list-group-flush .list-group-item:last-child {\n  margin-bottom: -1px;\n}\n\n.list-group-flush:first-child .list-group-item:first-child {\n  border-top: 0;\n}\n\n.list-group-flush:last-child .list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom: 0;\n}\n\n.list-group-item-primary {\n  color: #004085;\n  background-color: #b8daff;\n}\n\n.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {\n  color: #004085;\n  background-color: #9fcdff;\n}\n\n.list-group-item-primary.list-group-item-action.active {\n  color: #fff;\n  background-color: #004085;\n  border-color: #004085;\n}\n\n.list-group-item-secondary {\n  color: #383d41;\n  background-color: #d6d8db;\n}\n\n.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {\n  color: #383d41;\n  background-color: #c8cbcf;\n}\n\n.list-group-item-secondary.list-group-item-action.active {\n  color: #fff;\n  background-color: #383d41;\n  border-color: #383d41;\n}\n\n.list-group-item-success {\n  color: #155724;\n  background-color: #c3e6cb;\n}\n\n.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {\n  color: #155724;\n  background-color: #b1dfbb;\n}\n\n.list-group-item-success.list-group-item-action.active {\n  color: #fff;\n  background-color: #155724;\n  border-color: #155724;\n}\n\n.list-group-item-info {\n  color: #0c5460;\n  background-color: #bee5eb;\n}\n\n.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {\n  color: #0c5460;\n  background-color: #abdde5;\n}\n\n.list-group-item-info.list-group-item-action.active {\n  color: #fff;\n  background-color: #0c5460;\n  border-color: #0c5460;\n}\n\n.list-group-item-warning {\n  color: #856404;\n  background-color: #ffeeba;\n}\n\n.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {\n  color: #856404;\n  background-color: #ffe8a1;\n}\n\n.list-group-item-warning.list-group-item-action.active {\n  color: #fff;\n  background-color: #856404;\n  border-color: #856404;\n}\n\n.list-group-item-danger {\n  color: #721c24;\n  background-color: #f5c6cb;\n}\n\n.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {\n  color: #721c24;\n  background-color: #f1b0b7;\n}\n\n.list-group-item-danger.list-group-item-action.active {\n  color: #fff;\n  background-color: #721c24;\n  border-color: #721c24;\n}\n\n.list-group-item-light {\n  color: #818182;\n  background-color: #fdfdfe;\n}\n\n.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {\n  color: #818182;\n  background-color: #ececf6;\n}\n\n.list-group-item-light.list-group-item-action.active {\n  color: #fff;\n  background-color: #818182;\n  border-color: #818182;\n}\n\n.list-group-item-dark {\n  color: #1b1e21;\n  background-color: #c6c8ca;\n}\n\n.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {\n  color: #1b1e21;\n  background-color: #b9bbbe;\n}\n\n.list-group-item-dark.list-group-item-action.active {\n  color: #fff;\n  background-color: #1b1e21;\n  border-color: #1b1e21;\n}\n\n.close {\n  float: right;\n  font-size: 1.5rem;\n  font-weight: 700;\n  line-height: 1;\n  color: #000;\n  text-shadow: 0 1px 0 #fff;\n  opacity: .5;\n}\n\n.close:hover {\n  color: #000;\n  text-decoration: none;\n}\n\n.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus {\n  opacity: .75;\n}\n\nbutton.close {\n  padding: 0;\n  background-color: transparent;\n  border: 0;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n}\n\na.close.disabled {\n  pointer-events: none;\n}\n\n.toast {\n  max-width: 350px;\n  overflow: hidden;\n  font-size: 0.875rem;\n  background-color: rgba(255, 255, 255, 0.85);\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.1);\n  box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1);\n  -webkit-backdrop-filter: blur(10px);\n  backdrop-filter: blur(10px);\n  opacity: 0;\n  border-radius: 0.25rem;\n}\n\n.toast:not(:last-child) {\n  margin-bottom: 0.75rem;\n}\n\n.toast.showing {\n  opacity: 1;\n}\n\n.toast.show {\n  display: block;\n  opacity: 1;\n}\n\n.toast.hide {\n  display: none;\n}\n\n.toast-header {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: center;\n  align-items: center;\n  padding: 0.25rem 0.75rem;\n  color: #6c757d;\n  background-color: rgba(255, 255, 255, 0.85);\n  background-clip: padding-box;\n  border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n}\n\n.toast-body {\n  padding: 0.75rem;\n}\n\n.modal-open {\n  overflow: hidden;\n}\n\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n\n.modal {\n  position: fixed;\n  top: 0;\n  left: 0;\n  z-index: 1050;\n  display: none;\n  width: 100%;\n  height: 100%;\n  overflow: hidden;\n  outline: 0;\n}\n\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 0.5rem;\n  pointer-events: none;\n}\n\n.modal.fade .modal-dialog {\n  transition: -webkit-transform 0.3s ease-out;\n  transition: transform 0.3s ease-out;\n  transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out;\n  -webkit-transform: translate(0, -50px);\n  transform: translate(0, -50px);\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .modal.fade .modal-dialog {\n    transition: none;\n  }\n}\n\n.modal.show .modal-dialog {\n  -webkit-transform: none;\n  transform: none;\n}\n\n.modal-dialog-scrollable {\n  display: -ms-flexbox;\n  display: flex;\n  max-height: calc(100% - 1rem);\n}\n\n.modal-dialog-scrollable .modal-content {\n  max-height: calc(100vh - 1rem);\n  overflow: hidden;\n}\n\n.modal-dialog-scrollable .modal-header,\n.modal-dialog-scrollable .modal-footer {\n  -ms-flex-negative: 0;\n  flex-shrink: 0;\n}\n\n.modal-dialog-scrollable .modal-body {\n  overflow-y: auto;\n}\n\n.modal-dialog-centered {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: center;\n  align-items: center;\n  min-height: calc(100% - 1rem);\n}\n\n.modal-dialog-centered::before {\n  display: block;\n  height: calc(100vh - 1rem);\n  content: \"\";\n}\n\n.modal-dialog-centered.modal-dialog-scrollable {\n  -ms-flex-direction: column;\n  flex-direction: column;\n  -ms-flex-pack: center;\n  justify-content: center;\n  height: 100%;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable .modal-content {\n  max-height: none;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable::before {\n  content: none;\n}\n\n.modal-content {\n  position: relative;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-direction: column;\n  flex-direction: column;\n  width: 100%;\n  pointer-events: auto;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 0.3rem;\n  outline: 0;\n}\n\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  left: 0;\n  z-index: 1040;\n  width: 100vw;\n  height: 100vh;\n  background-color: #000;\n}\n\n.modal-backdrop.fade {\n  opacity: 0;\n}\n\n.modal-backdrop.show {\n  opacity: 0.5;\n}\n\n.modal-header {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: start;\n  align-items: flex-start;\n  -ms-flex-pack: justify;\n  justify-content: space-between;\n  padding: 1rem 1rem;\n  border-bottom: 1px solid #dee2e6;\n  border-top-left-radius: 0.3rem;\n  border-top-right-radius: 0.3rem;\n}\n\n.modal-header .close {\n  padding: 1rem 1rem;\n  margin: -1rem -1rem -1rem auto;\n}\n\n.modal-title {\n  margin-bottom: 0;\n  line-height: 1.5;\n}\n\n.modal-body {\n  position: relative;\n  -ms-flex: 1 1 auto;\n  flex: 1 1 auto;\n  padding: 1rem;\n}\n\n.modal-footer {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: center;\n  align-items: center;\n  -ms-flex-pack: end;\n  justify-content: flex-end;\n  padding: 1rem;\n  border-top: 1px solid #dee2e6;\n  border-bottom-right-radius: 0.3rem;\n  border-bottom-left-radius: 0.3rem;\n}\n\n.modal-footer > :not(:first-child) {\n  margin-left: .25rem;\n}\n\n.modal-footer > :not(:last-child) {\n  margin-right: .25rem;\n}\n\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n\n@media (min-width: 576px) {\n  .modal-dialog {\n    max-width: 500px;\n    margin: 1.75rem auto;\n  }\n  .modal-dialog-scrollable {\n    max-height: calc(100% - 3.5rem);\n  }\n  .modal-dialog-scrollable .modal-content {\n    max-height: calc(100vh - 3.5rem);\n  }\n  .modal-dialog-centered {\n    min-height: calc(100% - 3.5rem);\n  }\n  .modal-dialog-centered::before {\n    height: calc(100vh - 3.5rem);\n  }\n  .modal-sm {\n    max-width: 300px;\n  }\n}\n\n@media (min-width: 992px) {\n  .modal-lg,\n  .modal-xl {\n    max-width: 800px;\n  }\n}\n\n@media (min-width: 1200px) {\n  .modal-xl {\n    max-width: 1140px;\n  }\n}\n\n.tooltip {\n  position: absolute;\n  z-index: 1070;\n  display: block;\n  margin: 0;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n  font-style: normal;\n  font-weight: 400;\n  line-height: 1.5;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  letter-spacing: normal;\n  word-break: normal;\n  word-spacing: normal;\n  white-space: normal;\n  line-break: auto;\n  font-size: 0.875rem;\n  word-wrap: break-word;\n  opacity: 0;\n}\n\n.tooltip.show {\n  opacity: 0.9;\n}\n\n.tooltip .arrow {\n  position: absolute;\n  display: block;\n  width: 0.8rem;\n  height: 0.4rem;\n}\n\n.tooltip .arrow::before {\n  position: absolute;\n  content: \"\";\n  border-color: transparent;\n  border-style: solid;\n}\n\n.bs-tooltip-top, .bs-tooltip-auto[x-placement^=\"top\"] {\n  padding: 0.4rem 0;\n}\n\n.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=\"top\"] .arrow {\n  bottom: 0;\n}\n\n.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=\"top\"] .arrow::before {\n  top: 0;\n  border-width: 0.4rem 0.4rem 0;\n  border-top-color: #000;\n}\n\n.bs-tooltip-right, .bs-tooltip-auto[x-placement^=\"right\"] {\n  padding: 0 0.4rem;\n}\n\n.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=\"right\"] .arrow {\n  left: 0;\n  width: 0.4rem;\n  height: 0.8rem;\n}\n\n.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=\"right\"] .arrow::before {\n  right: 0;\n  border-width: 0.4rem 0.4rem 0.4rem 0;\n  border-right-color: #000;\n}\n\n.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=\"bottom\"] {\n  padding: 0.4rem 0;\n}\n\n.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow {\n  top: 0;\n}\n\n.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow::before {\n  bottom: 0;\n  border-width: 0 0.4rem 0.4rem;\n  border-bottom-color: #000;\n}\n\n.bs-tooltip-left, .bs-tooltip-auto[x-placement^=\"left\"] {\n  padding: 0 0.4rem;\n}\n\n.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=\"left\"] .arrow {\n  right: 0;\n  width: 0.4rem;\n  height: 0.8rem;\n}\n\n.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=\"left\"] .arrow::before {\n  left: 0;\n  border-width: 0.4rem 0 0.4rem 0.4rem;\n  border-left-color: #000;\n}\n\n.tooltip-inner {\n  max-width: 200px;\n  padding: 0.25rem 0.5rem;\n  color: #fff;\n  text-align: center;\n  background-color: #000;\n  border-radius: 0.25rem;\n}\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1060;\n  display: block;\n  max-width: 276px;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n  font-style: normal;\n  font-weight: 400;\n  line-height: 1.5;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  letter-spacing: normal;\n  word-break: normal;\n  word-spacing: normal;\n  white-space: normal;\n  line-break: auto;\n  font-size: 0.875rem;\n  word-wrap: break-word;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 0.3rem;\n}\n\n.popover .arrow {\n  position: absolute;\n  display: block;\n  width: 1rem;\n  height: 0.5rem;\n  margin: 0 0.3rem;\n}\n\n.popover .arrow::before, .popover .arrow::after {\n  position: absolute;\n  display: block;\n  content: \"\";\n  border-color: transparent;\n  border-style: solid;\n}\n\n.bs-popover-top, .bs-popover-auto[x-placement^=\"top\"] {\n  margin-bottom: 0.5rem;\n}\n\n.bs-popover-top > .arrow, .bs-popover-auto[x-placement^=\"top\"] > .arrow {\n  bottom: calc((0.5rem + 1px) * -1);\n}\n\n.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^=\"top\"] > .arrow::before {\n  bottom: 0;\n  border-width: 0.5rem 0.5rem 0;\n  border-top-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^=\"top\"] > .arrow::after {\n  bottom: 1px;\n  border-width: 0.5rem 0.5rem 0;\n  border-top-color: #fff;\n}\n\n.bs-popover-right, .bs-popover-auto[x-placement^=\"right\"] {\n  margin-left: 0.5rem;\n}\n\n.bs-popover-right > .arrow, .bs-popover-auto[x-placement^=\"right\"] > .arrow {\n  left: calc((0.5rem + 1px) * -1);\n  width: 0.5rem;\n  height: 1rem;\n  margin: 0.3rem 0;\n}\n\n.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^=\"right\"] > .arrow::before {\n  left: 0;\n  border-width: 0.5rem 0.5rem 0.5rem 0;\n  border-right-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^=\"right\"] > .arrow::after {\n  left: 1px;\n  border-width: 0.5rem 0.5rem 0.5rem 0;\n  border-right-color: #fff;\n}\n\n.bs-popover-bottom, .bs-popover-auto[x-placement^=\"bottom\"] {\n  margin-top: 0.5rem;\n}\n\n.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow {\n  top: calc((0.5rem + 1px) * -1);\n}\n\n.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::before {\n  top: 0;\n  border-width: 0 0.5rem 0.5rem 0.5rem;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::after {\n  top: 1px;\n  border-width: 0 0.5rem 0.5rem 0.5rem;\n  border-bottom-color: #fff;\n}\n\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=\"bottom\"] .popover-header::before {\n  position: absolute;\n  top: 0;\n  left: 50%;\n  display: block;\n  width: 1rem;\n  margin-left: -0.5rem;\n  content: \"\";\n  border-bottom: 1px solid #f7f7f7;\n}\n\n.bs-popover-left, .bs-popover-auto[x-placement^=\"left\"] {\n  margin-right: 0.5rem;\n}\n\n.bs-popover-left > .arrow, .bs-popover-auto[x-placement^=\"left\"] > .arrow {\n  right: calc((0.5rem + 1px) * -1);\n  width: 0.5rem;\n  height: 1rem;\n  margin: 0.3rem 0;\n}\n\n.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^=\"left\"] > .arrow::before {\n  right: 0;\n  border-width: 0.5rem 0 0.5rem 0.5rem;\n  border-left-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^=\"left\"] > .arrow::after {\n  right: 1px;\n  border-width: 0.5rem 0 0.5rem 0.5rem;\n  border-left-color: #fff;\n}\n\n.popover-header {\n  padding: 0.5rem 0.75rem;\n  margin-bottom: 0;\n  font-size: 1rem;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-top-left-radius: calc(0.3rem - 1px);\n  border-top-right-radius: calc(0.3rem - 1px);\n}\n\n.popover-header:empty {\n  display: none;\n}\n\n.popover-body {\n  padding: 0.5rem 0.75rem;\n  color: #212529;\n}\n\n.carousel {\n  position: relative;\n}\n\n.carousel.pointer-event {\n  -ms-touch-action: pan-y;\n  touch-action: pan-y;\n}\n\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n\n.carousel-inner::after {\n  display: block;\n  clear: both;\n  content: \"\";\n}\n\n.carousel-item {\n  position: relative;\n  display: none;\n  float: left;\n  width: 100%;\n  margin-right: -100%;\n  -webkit-backface-visibility: hidden;\n  backface-visibility: hidden;\n  transition: -webkit-transform 0.6s ease-in-out;\n  transition: transform 0.6s ease-in-out;\n  transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .carousel-item {\n    transition: none;\n  }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n  display: block;\n}\n\n.carousel-item-next:not(.carousel-item-left),\n.active.carousel-item-right {\n  -webkit-transform: translateX(100%);\n  transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-right),\n.active.carousel-item-left {\n  -webkit-transform: translateX(-100%);\n  transform: translateX(-100%);\n}\n\n.carousel-fade .carousel-item {\n  opacity: 0;\n  transition-property: opacity;\n  -webkit-transform: none;\n  transform: none;\n}\n\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-left,\n.carousel-fade .carousel-item-prev.carousel-item-right {\n  z-index: 1;\n  opacity: 1;\n}\n\n.carousel-fade .active.carousel-item-left,\n.carousel-fade .active.carousel-item-right {\n  z-index: 0;\n  opacity: 0;\n  transition: 0s 0.6s opacity;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .carousel-fade .active.carousel-item-left,\n  .carousel-fade .active.carousel-item-right {\n    transition: none;\n  }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  z-index: 1;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: center;\n  align-items: center;\n  -ms-flex-pack: center;\n  justify-content: center;\n  width: 15%;\n  color: #fff;\n  text-align: center;\n  opacity: 0.5;\n  transition: opacity 0.15s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .carousel-control-prev,\n  .carousel-control-next {\n    transition: none;\n  }\n}\n\n.carousel-control-prev:hover, .carousel-control-prev:focus,\n.carousel-control-next:hover,\n.carousel-control-next:focus {\n  color: #fff;\n  text-decoration: none;\n  outline: 0;\n  opacity: 0.9;\n}\n\n.carousel-control-prev {\n  left: 0;\n}\n\n.carousel-control-next {\n  right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n  display: inline-block;\n  width: 20px;\n  height: 20px;\n  background: no-repeat 50% / 100% 100%;\n}\n\n.carousel-control-prev-icon {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\");\n}\n\n.carousel-control-next-icon {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\");\n}\n\n.carousel-indicators {\n  position: absolute;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 15;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-pack: center;\n  justify-content: center;\n  padding-left: 0;\n  margin-right: 15%;\n  margin-left: 15%;\n  list-style: none;\n}\n\n.carousel-indicators li {\n  box-sizing: content-box;\n  -ms-flex: 0 1 auto;\n  flex: 0 1 auto;\n  width: 30px;\n  height: 3px;\n  margin-right: 3px;\n  margin-left: 3px;\n  text-indent: -999px;\n  cursor: pointer;\n  background-color: #fff;\n  background-clip: padding-box;\n  border-top: 10px solid transparent;\n  border-bottom: 10px solid transparent;\n  opacity: .5;\n  transition: opacity 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .carousel-indicators li {\n    transition: none;\n  }\n}\n\n.carousel-indicators .active {\n  opacity: 1;\n}\n\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 20px;\n  left: 15%;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #fff;\n  text-align: center;\n}\n\n@-webkit-keyframes spinner-border {\n  to {\n    -webkit-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n}\n\n@keyframes spinner-border {\n  to {\n    -webkit-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n}\n\n.spinner-border {\n  display: inline-block;\n  width: 2rem;\n  height: 2rem;\n  vertical-align: text-bottom;\n  border: 0.25em solid currentColor;\n  border-right-color: transparent;\n  border-radius: 50%;\n  -webkit-animation: spinner-border .75s linear infinite;\n  animation: spinner-border .75s linear infinite;\n}\n\n.spinner-border-sm {\n  width: 1rem;\n  height: 1rem;\n  border-width: 0.2em;\n}\n\n@-webkit-keyframes spinner-grow {\n  0% {\n    -webkit-transform: scale(0);\n    transform: scale(0);\n  }\n  50% {\n    opacity: 1;\n  }\n}\n\n@keyframes spinner-grow {\n  0% {\n    -webkit-transform: scale(0);\n    transform: scale(0);\n  }\n  50% {\n    opacity: 1;\n  }\n}\n\n.spinner-grow {\n  display: inline-block;\n  width: 2rem;\n  height: 2rem;\n  vertical-align: text-bottom;\n  background-color: currentColor;\n  border-radius: 50%;\n  opacity: 0;\n  -webkit-animation: spinner-grow .75s linear infinite;\n  animation: spinner-grow .75s linear infinite;\n}\n\n.spinner-grow-sm {\n  width: 1rem;\n  height: 1rem;\n}\n\n.align-baseline {\n  vertical-align: baseline !important;\n}\n\n.align-top {\n  vertical-align: top !important;\n}\n\n.align-middle {\n  vertical-align: middle !important;\n}\n\n.align-bottom {\n  vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n  vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n  vertical-align: text-top !important;\n}\n\n.bg-primary {\n  background-color: #007bff !important;\n}\n\na.bg-primary:hover, a.bg-primary:focus,\nbutton.bg-primary:hover,\nbutton.bg-primary:focus {\n  background-color: #0062cc !important;\n}\n\n.bg-secondary {\n  background-color: #6c757d !important;\n}\n\na.bg-secondary:hover, a.bg-secondary:focus,\nbutton.bg-secondary:hover,\nbutton.bg-secondary:focus {\n  background-color: #545b62 !important;\n}\n\n.bg-success {\n  background-color: #28a745 !important;\n}\n\na.bg-success:hover, a.bg-success:focus,\nbutton.bg-success:hover,\nbutton.bg-success:focus {\n  background-color: #1e7e34 !important;\n}\n\n.bg-info {\n  background-color: #17a2b8 !important;\n}\n\na.bg-info:hover, a.bg-info:focus,\nbutton.bg-info:hover,\nbutton.bg-info:focus {\n  background-color: #117a8b !important;\n}\n\n.bg-warning {\n  background-color: #ffc107 !important;\n}\n\na.bg-warning:hover, a.bg-warning:focus,\nbutton.bg-warning:hover,\nbutton.bg-warning:focus {\n  background-color: #d39e00 !important;\n}\n\n.bg-danger {\n  background-color: #dc3545 !important;\n}\n\na.bg-danger:hover, a.bg-danger:focus,\nbutton.bg-danger:hover,\nbutton.bg-danger:focus {\n  background-color: #bd2130 !important;\n}\n\n.bg-light {\n  background-color: #f8f9fa !important;\n}\n\na.bg-light:hover, a.bg-light:focus,\nbutton.bg-light:hover,\nbutton.bg-light:focus {\n  background-color: #dae0e5 !important;\n}\n\n.bg-dark {\n  background-color: #343a40 !important;\n}\n\na.bg-dark:hover, a.bg-dark:focus,\nbutton.bg-dark:hover,\nbutton.bg-dark:focus {\n  background-color: #1d2124 !important;\n}\n\n.bg-white {\n  background-color: #fff !important;\n}\n\n.bg-transparent {\n  background-color: transparent !important;\n}\n\n.border {\n  border: 1px solid #dee2e6 !important;\n}\n\n.border-top {\n  border-top: 1px solid #dee2e6 !important;\n}\n\n.border-right {\n  border-right: 1px solid #dee2e6 !important;\n}\n\n.border-bottom {\n  border-bottom: 1px solid #dee2e6 !important;\n}\n\n.border-left {\n  border-left: 1px solid #dee2e6 !important;\n}\n\n.border-0 {\n  border: 0 !important;\n}\n\n.border-top-0 {\n  border-top: 0 !important;\n}\n\n.border-right-0 {\n  border-right: 0 !important;\n}\n\n.border-bottom-0 {\n  border-bottom: 0 !important;\n}\n\n.border-left-0 {\n  border-left: 0 !important;\n}\n\n.border-primary {\n  border-color: #007bff !important;\n}\n\n.border-secondary {\n  border-color: #6c757d !important;\n}\n\n.border-success {\n  border-color: #28a745 !important;\n}\n\n.border-info {\n  border-color: #17a2b8 !important;\n}\n\n.border-warning {\n  border-color: #ffc107 !important;\n}\n\n.border-danger {\n  border-color: #dc3545 !important;\n}\n\n.border-light {\n  border-color: #f8f9fa !important;\n}\n\n.border-dark {\n  border-color: #343a40 !important;\n}\n\n.border-white {\n  border-color: #fff !important;\n}\n\n.rounded-sm {\n  border-radius: 0.2rem !important;\n}\n\n.rounded {\n  border-radius: 0.25rem !important;\n}\n\n.rounded-top {\n  border-top-left-radius: 0.25rem !important;\n  border-top-right-radius: 0.25rem !important;\n}\n\n.rounded-right {\n  border-top-right-radius: 0.25rem !important;\n  border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n  border-bottom-right-radius: 0.25rem !important;\n  border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-left {\n  border-top-left-radius: 0.25rem !important;\n  border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-lg {\n  border-radius: 0.3rem !important;\n}\n\n.rounded-circle {\n  border-radius: 50% !important;\n}\n\n.rounded-pill {\n  border-radius: 50rem !important;\n}\n\n.rounded-0 {\n  border-radius: 0 !important;\n}\n\n.clearfix::after {\n  display: block;\n  clear: both;\n  content: \"\";\n}\n\n.d-none {\n  display: none !important;\n}\n\n.d-inline {\n  display: inline !important;\n}\n\n.d-inline-block {\n  display: inline-block !important;\n}\n\n.d-block {\n  display: block !important;\n}\n\n.d-table {\n  display: table !important;\n}\n\n.d-table-row {\n  display: table-row !important;\n}\n\n.d-table-cell {\n  display: table-cell !important;\n}\n\n.d-flex {\n  display: -ms-flexbox !important;\n  display: flex !important;\n}\n\n.d-inline-flex {\n  display: -ms-inline-flexbox !important;\n  display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n  .d-sm-none {\n    display: none !important;\n  }\n  .d-sm-inline {\n    display: inline !important;\n  }\n  .d-sm-inline-block {\n    display: inline-block !important;\n  }\n  .d-sm-block {\n    display: block !important;\n  }\n  .d-sm-table {\n    display: table !important;\n  }\n  .d-sm-table-row {\n    display: table-row !important;\n  }\n  .d-sm-table-cell {\n    display: table-cell !important;\n  }\n  .d-sm-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-sm-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .d-md-none {\n    display: none !important;\n  }\n  .d-md-inline {\n    display: inline !important;\n  }\n  .d-md-inline-block {\n    display: inline-block !important;\n  }\n  .d-md-block {\n    display: block !important;\n  }\n  .d-md-table {\n    display: table !important;\n  }\n  .d-md-table-row {\n    display: table-row !important;\n  }\n  .d-md-table-cell {\n    display: table-cell !important;\n  }\n  .d-md-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-md-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .d-lg-none {\n    display: none !important;\n  }\n  .d-lg-inline {\n    display: inline !important;\n  }\n  .d-lg-inline-block {\n    display: inline-block !important;\n  }\n  .d-lg-block {\n    display: block !important;\n  }\n  .d-lg-table {\n    display: table !important;\n  }\n  .d-lg-table-row {\n    display: table-row !important;\n  }\n  .d-lg-table-cell {\n    display: table-cell !important;\n  }\n  .d-lg-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-lg-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .d-xl-none {\n    display: none !important;\n  }\n  .d-xl-inline {\n    display: inline !important;\n  }\n  .d-xl-inline-block {\n    display: inline-block !important;\n  }\n  .d-xl-block {\n    display: block !important;\n  }\n  .d-xl-table {\n    display: table !important;\n  }\n  .d-xl-table-row {\n    display: table-row !important;\n  }\n  .d-xl-table-cell {\n    display: table-cell !important;\n  }\n  .d-xl-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-xl-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media print {\n  .d-print-none {\n    display: none !important;\n  }\n  .d-print-inline {\n    display: inline !important;\n  }\n  .d-print-inline-block {\n    display: inline-block !important;\n  }\n  .d-print-block {\n    display: block !important;\n  }\n  .d-print-table {\n    display: table !important;\n  }\n  .d-print-table-row {\n    display: table-row !important;\n  }\n  .d-print-table-cell {\n    display: table-cell !important;\n  }\n  .d-print-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-print-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n.embed-responsive {\n  position: relative;\n  display: block;\n  width: 100%;\n  padding: 0;\n  overflow: hidden;\n}\n\n.embed-responsive::before {\n  display: block;\n  content: \"\";\n}\n\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  border: 0;\n}\n\n.embed-responsive-21by9::before {\n  padding-top: 42.857143%;\n}\n\n.embed-responsive-16by9::before {\n  padding-top: 56.25%;\n}\n\n.embed-responsive-4by3::before {\n  padding-top: 75%;\n}\n\n.embed-responsive-1by1::before {\n  padding-top: 100%;\n}\n\n.flex-row {\n  -ms-flex-direction: row !important;\n  flex-direction: row !important;\n}\n\n.flex-column {\n  -ms-flex-direction: column !important;\n  flex-direction: column !important;\n}\n\n.flex-row-reverse {\n  -ms-flex-direction: row-reverse !important;\n  flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n  -ms-flex-direction: column-reverse !important;\n  flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n  -ms-flex-wrap: wrap !important;\n  flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n  -ms-flex-wrap: nowrap !important;\n  flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n  -ms-flex-wrap: wrap-reverse !important;\n  flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n  -ms-flex: 1 1 auto !important;\n  flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n  -ms-flex-positive: 0 !important;\n  flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n  -ms-flex-positive: 1 !important;\n  flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n  -ms-flex-negative: 0 !important;\n  flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n  -ms-flex-negative: 1 !important;\n  flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n  -ms-flex-pack: start !important;\n  justify-content: flex-start !important;\n}\n\n.justify-content-end {\n  -ms-flex-pack: end !important;\n  justify-content: flex-end !important;\n}\n\n.justify-content-center {\n  -ms-flex-pack: center !important;\n  justify-content: center !important;\n}\n\n.justify-content-between {\n  -ms-flex-pack: justify !important;\n  justify-content: space-between !important;\n}\n\n.justify-content-around {\n  -ms-flex-pack: distribute !important;\n  justify-content: space-around !important;\n}\n\n.align-items-start {\n  -ms-flex-align: start !important;\n  align-items: flex-start !important;\n}\n\n.align-items-end {\n  -ms-flex-align: end !important;\n  align-items: flex-end !important;\n}\n\n.align-items-center {\n  -ms-flex-align: center !important;\n  align-items: center !important;\n}\n\n.align-items-baseline {\n  -ms-flex-align: baseline !important;\n  align-items: baseline !important;\n}\n\n.align-items-stretch {\n  -ms-flex-align: stretch !important;\n  align-items: stretch !important;\n}\n\n.align-content-start {\n  -ms-flex-line-pack: start !important;\n  align-content: flex-start !important;\n}\n\n.align-content-end {\n  -ms-flex-line-pack: end !important;\n  align-content: flex-end !important;\n}\n\n.align-content-center {\n  -ms-flex-line-pack: center !important;\n  align-content: center !important;\n}\n\n.align-content-between {\n  -ms-flex-line-pack: justify !important;\n  align-content: space-between !important;\n}\n\n.align-content-around {\n  -ms-flex-line-pack: distribute !important;\n  align-content: space-around !important;\n}\n\n.align-content-stretch {\n  -ms-flex-line-pack: stretch !important;\n  align-content: stretch !important;\n}\n\n.align-self-auto {\n  -ms-flex-item-align: auto !important;\n  align-self: auto !important;\n}\n\n.align-self-start {\n  -ms-flex-item-align: start !important;\n  align-self: flex-start !important;\n}\n\n.align-self-end {\n  -ms-flex-item-align: end !important;\n  align-self: flex-end !important;\n}\n\n.align-self-center {\n  -ms-flex-item-align: center !important;\n  align-self: center !important;\n}\n\n.align-self-baseline {\n  -ms-flex-item-align: baseline !important;\n  align-self: baseline !important;\n}\n\n.align-self-stretch {\n  -ms-flex-item-align: stretch !important;\n  align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n  .flex-sm-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-sm-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-sm-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-sm-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-sm-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-sm-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-sm-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-sm-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-sm-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-sm-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-sm-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-sm-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-sm-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-sm-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-sm-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-sm-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-sm-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-sm-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-sm-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-sm-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-sm-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-sm-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-sm-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-sm-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-sm-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-sm-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-sm-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-sm-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-sm-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-sm-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-sm-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-sm-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-sm-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-sm-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .flex-md-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-md-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-md-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-md-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-md-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-md-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-md-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-md-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-md-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-md-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-md-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-md-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-md-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-md-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-md-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-md-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-md-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-md-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-md-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-md-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-md-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-md-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-md-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-md-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-md-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-md-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-md-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-md-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-md-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-md-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-md-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-md-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-md-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-md-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .flex-lg-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-lg-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-lg-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-lg-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-lg-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-lg-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-lg-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-lg-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-lg-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-lg-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-lg-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-lg-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-lg-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-lg-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-lg-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-lg-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-lg-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-lg-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-lg-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-lg-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-lg-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-lg-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-lg-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-lg-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-lg-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-lg-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-lg-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-lg-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-lg-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-lg-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-lg-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-lg-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-lg-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-lg-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .flex-xl-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-xl-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-xl-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-xl-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-xl-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-xl-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-xl-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-xl-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-xl-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-xl-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-xl-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-xl-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-xl-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-xl-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-xl-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-xl-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-xl-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-xl-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-xl-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-xl-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-xl-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-xl-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-xl-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-xl-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-xl-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-xl-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-xl-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-xl-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-xl-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-xl-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-xl-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-xl-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-xl-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-xl-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n.float-left {\n  float: left !important;\n}\n\n.float-right {\n  float: right !important;\n}\n\n.float-none {\n  float: none !important;\n}\n\n@media (min-width: 576px) {\n  .float-sm-left {\n    float: left !important;\n  }\n  .float-sm-right {\n    float: right !important;\n  }\n  .float-sm-none {\n    float: none !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .float-md-left {\n    float: left !important;\n  }\n  .float-md-right {\n    float: right !important;\n  }\n  .float-md-none {\n    float: none !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .float-lg-left {\n    float: left !important;\n  }\n  .float-lg-right {\n    float: right !important;\n  }\n  .float-lg-none {\n    float: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .float-xl-left {\n    float: left !important;\n  }\n  .float-xl-right {\n    float: right !important;\n  }\n  .float-xl-none {\n    float: none !important;\n  }\n}\n\n.overflow-auto {\n  overflow: auto !important;\n}\n\n.overflow-hidden {\n  overflow: hidden !important;\n}\n\n.position-static {\n  position: static !important;\n}\n\n.position-relative {\n  position: relative !important;\n}\n\n.position-absolute {\n  position: absolute !important;\n}\n\n.position-fixed {\n  position: fixed !important;\n}\n\n.position-sticky {\n  position: -webkit-sticky !important;\n  position: sticky !important;\n}\n\n.fixed-top {\n  position: fixed;\n  top: 0;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n}\n\n.fixed-bottom {\n  position: fixed;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1030;\n}\n\n@supports ((position: -webkit-sticky) or (position: sticky)) {\n  .sticky-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n}\n\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  white-space: nowrap;\n  border: 0;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n  position: static;\n  width: auto;\n  height: auto;\n  overflow: visible;\n  clip: auto;\n  white-space: normal;\n}\n\n.shadow-sm {\n  box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\n}\n\n.shadow {\n  box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\n}\n\n.shadow-lg {\n  box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\n}\n\n.shadow-none {\n  box-shadow: none !important;\n}\n\n.w-25 {\n  width: 25% !important;\n}\n\n.w-50 {\n  width: 50% !important;\n}\n\n.w-75 {\n  width: 75% !important;\n}\n\n.w-100 {\n  width: 100% !important;\n}\n\n.w-auto {\n  width: auto !important;\n}\n\n.h-25 {\n  height: 25% !important;\n}\n\n.h-50 {\n  height: 50% !important;\n}\n\n.h-75 {\n  height: 75% !important;\n}\n\n.h-100 {\n  height: 100% !important;\n}\n\n.h-auto {\n  height: auto !important;\n}\n\n.mw-100 {\n  max-width: 100% !important;\n}\n\n.mh-100 {\n  max-height: 100% !important;\n}\n\n.min-vw-100 {\n  min-width: 100vw !important;\n}\n\n.min-vh-100 {\n  min-height: 100vh !important;\n}\n\n.vw-100 {\n  width: 100vw !important;\n}\n\n.vh-100 {\n  height: 100vh !important;\n}\n\n.stretched-link::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1;\n  pointer-events: auto;\n  content: \"\";\n  background-color: rgba(0, 0, 0, 0);\n}\n\n.m-0 {\n  margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n  margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n  margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n  margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n  margin-left: 0 !important;\n}\n\n.m-1 {\n  margin: 0.25rem !important;\n}\n\n.mt-1,\n.my-1 {\n  margin-top: 0.25rem !important;\n}\n\n.mr-1,\n.mx-1 {\n  margin-right: 0.25rem !important;\n}\n\n.mb-1,\n.my-1 {\n  margin-bottom: 0.25rem !important;\n}\n\n.ml-1,\n.mx-1 {\n  margin-left: 0.25rem !important;\n}\n\n.m-2 {\n  margin: 0.5rem !important;\n}\n\n.mt-2,\n.my-2 {\n  margin-top: 0.5rem !important;\n}\n\n.mr-2,\n.mx-2 {\n  margin-right: 0.5rem !important;\n}\n\n.mb-2,\n.my-2 {\n  margin-bottom: 0.5rem !important;\n}\n\n.ml-2,\n.mx-2 {\n  margin-left: 0.5rem !important;\n}\n\n.m-3 {\n  margin: 1rem !important;\n}\n\n.mt-3,\n.my-3 {\n  margin-top: 1rem !important;\n}\n\n.mr-3,\n.mx-3 {\n  margin-right: 1rem !important;\n}\n\n.mb-3,\n.my-3 {\n  margin-bottom: 1rem !important;\n}\n\n.ml-3,\n.mx-3 {\n  margin-left: 1rem !important;\n}\n\n.m-4 {\n  margin: 1.5rem !important;\n}\n\n.mt-4,\n.my-4 {\n  margin-top: 1.5rem !important;\n}\n\n.mr-4,\n.mx-4 {\n  margin-right: 1.5rem !important;\n}\n\n.mb-4,\n.my-4 {\n  margin-bottom: 1.5rem !important;\n}\n\n.ml-4,\n.mx-4 {\n  margin-left: 1.5rem !important;\n}\n\n.m-5 {\n  margin: 3rem !important;\n}\n\n.mt-5,\n.my-5 {\n  margin-top: 3rem !important;\n}\n\n.mr-5,\n.mx-5 {\n  margin-right: 3rem !important;\n}\n\n.mb-5,\n.my-5 {\n  margin-bottom: 3rem !important;\n}\n\n.ml-5,\n.mx-5 {\n  margin-left: 3rem !important;\n}\n\n.p-0 {\n  padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n  padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n  padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n  padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n  padding-left: 0 !important;\n}\n\n.p-1 {\n  padding: 0.25rem !important;\n}\n\n.pt-1,\n.py-1 {\n  padding-top: 0.25rem !important;\n}\n\n.pr-1,\n.px-1 {\n  padding-right: 0.25rem !important;\n}\n\n.pb-1,\n.py-1 {\n  padding-bottom: 0.25rem !important;\n}\n\n.pl-1,\n.px-1 {\n  padding-left: 0.25rem !important;\n}\n\n.p-2 {\n  padding: 0.5rem !important;\n}\n\n.pt-2,\n.py-2 {\n  padding-top: 0.5rem !important;\n}\n\n.pr-2,\n.px-2 {\n  padding-right: 0.5rem !important;\n}\n\n.pb-2,\n.py-2 {\n  padding-bottom: 0.5rem !important;\n}\n\n.pl-2,\n.px-2 {\n  padding-left: 0.5rem !important;\n}\n\n.p-3 {\n  padding: 1rem !important;\n}\n\n.pt-3,\n.py-3 {\n  padding-top: 1rem !important;\n}\n\n.pr-3,\n.px-3 {\n  padding-right: 1rem !important;\n}\n\n.pb-3,\n.py-3 {\n  padding-bottom: 1rem !important;\n}\n\n.pl-3,\n.px-3 {\n  padding-left: 1rem !important;\n}\n\n.p-4 {\n  padding: 1.5rem !important;\n}\n\n.pt-4,\n.py-4 {\n  padding-top: 1.5rem !important;\n}\n\n.pr-4,\n.px-4 {\n  padding-right: 1.5rem !important;\n}\n\n.pb-4,\n.py-4 {\n  padding-bottom: 1.5rem !important;\n}\n\n.pl-4,\n.px-4 {\n  padding-left: 1.5rem !important;\n}\n\n.p-5 {\n  padding: 3rem !important;\n}\n\n.pt-5,\n.py-5 {\n  padding-top: 3rem !important;\n}\n\n.pr-5,\n.px-5 {\n  padding-right: 3rem !important;\n}\n\n.pb-5,\n.py-5 {\n  padding-bottom: 3rem !important;\n}\n\n.pl-5,\n.px-5 {\n  padding-left: 3rem !important;\n}\n\n.m-n1 {\n  margin: -0.25rem !important;\n}\n\n.mt-n1,\n.my-n1 {\n  margin-top: -0.25rem !important;\n}\n\n.mr-n1,\n.mx-n1 {\n  margin-right: -0.25rem !important;\n}\n\n.mb-n1,\n.my-n1 {\n  margin-bottom: -0.25rem !important;\n}\n\n.ml-n1,\n.mx-n1 {\n  margin-left: -0.25rem !important;\n}\n\n.m-n2 {\n  margin: -0.5rem !important;\n}\n\n.mt-n2,\n.my-n2 {\n  margin-top: -0.5rem !important;\n}\n\n.mr-n2,\n.mx-n2 {\n  margin-right: -0.5rem !important;\n}\n\n.mb-n2,\n.my-n2 {\n  margin-bottom: -0.5rem !important;\n}\n\n.ml-n2,\n.mx-n2 {\n  margin-left: -0.5rem !important;\n}\n\n.m-n3 {\n  margin: -1rem !important;\n}\n\n.mt-n3,\n.my-n3 {\n  margin-top: -1rem !important;\n}\n\n.mr-n3,\n.mx-n3 {\n  margin-right: -1rem !important;\n}\n\n.mb-n3,\n.my-n3 {\n  margin-bottom: -1rem !important;\n}\n\n.ml-n3,\n.mx-n3 {\n  margin-left: -1rem !important;\n}\n\n.m-n4 {\n  margin: -1.5rem !important;\n}\n\n.mt-n4,\n.my-n4 {\n  margin-top: -1.5rem !important;\n}\n\n.mr-n4,\n.mx-n4 {\n  margin-right: -1.5rem !important;\n}\n\n.mb-n4,\n.my-n4 {\n  margin-bottom: -1.5rem !important;\n}\n\n.ml-n4,\n.mx-n4 {\n  margin-left: -1.5rem !important;\n}\n\n.m-n5 {\n  margin: -3rem !important;\n}\n\n.mt-n5,\n.my-n5 {\n  margin-top: -3rem !important;\n}\n\n.mr-n5,\n.mx-n5 {\n  margin-right: -3rem !important;\n}\n\n.mb-n5,\n.my-n5 {\n  margin-bottom: -3rem !important;\n}\n\n.ml-n5,\n.mx-n5 {\n  margin-left: -3rem !important;\n}\n\n.m-auto {\n  margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n  margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n  margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n  margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n  margin-left: auto !important;\n}\n\n@media (min-width: 576px) {\n  .m-sm-0 {\n    margin: 0 !important;\n  }\n  .mt-sm-0,\n  .my-sm-0 {\n    margin-top: 0 !important;\n  }\n  .mr-sm-0,\n  .mx-sm-0 {\n    margin-right: 0 !important;\n  }\n  .mb-sm-0,\n  .my-sm-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-sm-0,\n  .mx-sm-0 {\n    margin-left: 0 !important;\n  }\n  .m-sm-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-sm-1,\n  .my-sm-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-sm-1,\n  .mx-sm-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-sm-1,\n  .my-sm-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-sm-1,\n  .mx-sm-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-sm-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-sm-2,\n  .my-sm-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-sm-2,\n  .mx-sm-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-sm-2,\n  .my-sm-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-sm-2,\n  .mx-sm-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-sm-3 {\n    margin: 1rem !important;\n  }\n  .mt-sm-3,\n  .my-sm-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-sm-3,\n  .mx-sm-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-sm-3,\n  .my-sm-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-sm-3,\n  .mx-sm-3 {\n    margin-left: 1rem !important;\n  }\n  .m-sm-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-sm-4,\n  .my-sm-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-sm-4,\n  .mx-sm-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-sm-4,\n  .my-sm-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-sm-4,\n  .mx-sm-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-sm-5 {\n    margin: 3rem !important;\n  }\n  .mt-sm-5,\n  .my-sm-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-sm-5,\n  .mx-sm-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-sm-5,\n  .my-sm-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-sm-5,\n  .mx-sm-5 {\n    margin-left: 3rem !important;\n  }\n  .p-sm-0 {\n    padding: 0 !important;\n  }\n  .pt-sm-0,\n  .py-sm-0 {\n    padding-top: 0 !important;\n  }\n  .pr-sm-0,\n  .px-sm-0 {\n    padding-right: 0 !important;\n  }\n  .pb-sm-0,\n  .py-sm-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-sm-0,\n  .px-sm-0 {\n    padding-left: 0 !important;\n  }\n  .p-sm-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-sm-1,\n  .py-sm-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-sm-1,\n  .px-sm-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-sm-1,\n  .py-sm-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-sm-1,\n  .px-sm-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-sm-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-sm-2,\n  .py-sm-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-sm-2,\n  .px-sm-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-sm-2,\n  .py-sm-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-sm-2,\n  .px-sm-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-sm-3 {\n    padding: 1rem !important;\n  }\n  .pt-sm-3,\n  .py-sm-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-sm-3,\n  .px-sm-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-sm-3,\n  .py-sm-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-sm-3,\n  .px-sm-3 {\n    padding-left: 1rem !important;\n  }\n  .p-sm-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-sm-4,\n  .py-sm-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-sm-4,\n  .px-sm-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-sm-4,\n  .py-sm-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-sm-4,\n  .px-sm-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-sm-5 {\n    padding: 3rem !important;\n  }\n  .pt-sm-5,\n  .py-sm-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-sm-5,\n  .px-sm-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-sm-5,\n  .py-sm-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-sm-5,\n  .px-sm-5 {\n    padding-left: 3rem !important;\n  }\n  .m-sm-n1 {\n    margin: -0.25rem !important;\n  }\n  .mt-sm-n1,\n  .my-sm-n1 {\n    margin-top: -0.25rem !important;\n  }\n  .mr-sm-n1,\n  .mx-sm-n1 {\n    margin-right: -0.25rem !important;\n  }\n  .mb-sm-n1,\n  .my-sm-n1 {\n    margin-bottom: -0.25rem !important;\n  }\n  .ml-sm-n1,\n  .mx-sm-n1 {\n    margin-left: -0.25rem !important;\n  }\n  .m-sm-n2 {\n    margin: -0.5rem !important;\n  }\n  .mt-sm-n2,\n  .my-sm-n2 {\n    margin-top: -0.5rem !important;\n  }\n  .mr-sm-n2,\n  .mx-sm-n2 {\n    margin-right: -0.5rem !important;\n  }\n  .mb-sm-n2,\n  .my-sm-n2 {\n    margin-bottom: -0.5rem !important;\n  }\n  .ml-sm-n2,\n  .mx-sm-n2 {\n    margin-left: -0.5rem !important;\n  }\n  .m-sm-n3 {\n    margin: -1rem !important;\n  }\n  .mt-sm-n3,\n  .my-sm-n3 {\n    margin-top: -1rem !important;\n  }\n  .mr-sm-n3,\n  .mx-sm-n3 {\n    margin-right: -1rem !important;\n  }\n  .mb-sm-n3,\n  .my-sm-n3 {\n    margin-bottom: -1rem !important;\n  }\n  .ml-sm-n3,\n  .mx-sm-n3 {\n    margin-left: -1rem !important;\n  }\n  .m-sm-n4 {\n    margin: -1.5rem !important;\n  }\n  .mt-sm-n4,\n  .my-sm-n4 {\n    margin-top: -1.5rem !important;\n  }\n  .mr-sm-n4,\n  .mx-sm-n4 {\n    margin-right: -1.5rem !important;\n  }\n  .mb-sm-n4,\n  .my-sm-n4 {\n    margin-bottom: -1.5rem !important;\n  }\n  .ml-sm-n4,\n  .mx-sm-n4 {\n    margin-left: -1.5rem !important;\n  }\n  .m-sm-n5 {\n    margin: -3rem !important;\n  }\n  .mt-sm-n5,\n  .my-sm-n5 {\n    margin-top: -3rem !important;\n  }\n  .mr-sm-n5,\n  .mx-sm-n5 {\n    margin-right: -3rem !important;\n  }\n  .mb-sm-n5,\n  .my-sm-n5 {\n    margin-bottom: -3rem !important;\n  }\n  .ml-sm-n5,\n  .mx-sm-n5 {\n    margin-left: -3rem !important;\n  }\n  .m-sm-auto {\n    margin: auto !important;\n  }\n  .mt-sm-auto,\n  .my-sm-auto {\n    margin-top: auto !important;\n  }\n  .mr-sm-auto,\n  .mx-sm-auto {\n    margin-right: auto !important;\n  }\n  .mb-sm-auto,\n  .my-sm-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-sm-auto,\n  .mx-sm-auto {\n    margin-left: auto !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .m-md-0 {\n    margin: 0 !important;\n  }\n  .mt-md-0,\n  .my-md-0 {\n    margin-top: 0 !important;\n  }\n  .mr-md-0,\n  .mx-md-0 {\n    margin-right: 0 !important;\n  }\n  .mb-md-0,\n  .my-md-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-md-0,\n  .mx-md-0 {\n    margin-left: 0 !important;\n  }\n  .m-md-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-md-1,\n  .my-md-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-md-1,\n  .mx-md-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-md-1,\n  .my-md-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-md-1,\n  .mx-md-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-md-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-md-2,\n  .my-md-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-md-2,\n  .mx-md-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-md-2,\n  .my-md-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-md-2,\n  .mx-md-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-md-3 {\n    margin: 1rem !important;\n  }\n  .mt-md-3,\n  .my-md-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-md-3,\n  .mx-md-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-md-3,\n  .my-md-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-md-3,\n  .mx-md-3 {\n    margin-left: 1rem !important;\n  }\n  .m-md-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-md-4,\n  .my-md-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-md-4,\n  .mx-md-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-md-4,\n  .my-md-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-md-4,\n  .mx-md-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-md-5 {\n    margin: 3rem !important;\n  }\n  .mt-md-5,\n  .my-md-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-md-5,\n  .mx-md-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-md-5,\n  .my-md-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-md-5,\n  .mx-md-5 {\n    margin-left: 3rem !important;\n  }\n  .p-md-0 {\n    padding: 0 !important;\n  }\n  .pt-md-0,\n  .py-md-0 {\n    padding-top: 0 !important;\n  }\n  .pr-md-0,\n  .px-md-0 {\n    padding-right: 0 !important;\n  }\n  .pb-md-0,\n  .py-md-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-md-0,\n  .px-md-0 {\n    padding-left: 0 !important;\n  }\n  .p-md-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-md-1,\n  .py-md-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-md-1,\n  .px-md-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-md-1,\n  .py-md-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-md-1,\n  .px-md-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-md-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-md-2,\n  .py-md-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-md-2,\n  .px-md-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-md-2,\n  .py-md-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-md-2,\n  .px-md-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-md-3 {\n    padding: 1rem !important;\n  }\n  .pt-md-3,\n  .py-md-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-md-3,\n  .px-md-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-md-3,\n  .py-md-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-md-3,\n  .px-md-3 {\n    padding-left: 1rem !important;\n  }\n  .p-md-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-md-4,\n  .py-md-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-md-4,\n  .px-md-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-md-4,\n  .py-md-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-md-4,\n  .px-md-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-md-5 {\n    padding: 3rem !important;\n  }\n  .pt-md-5,\n  .py-md-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-md-5,\n  .px-md-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-md-5,\n  .py-md-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-md-5,\n  .px-md-5 {\n    padding-left: 3rem !important;\n  }\n  .m-md-n1 {\n    margin: -0.25rem !important;\n  }\n  .mt-md-n1,\n  .my-md-n1 {\n    margin-top: -0.25rem !important;\n  }\n  .mr-md-n1,\n  .mx-md-n1 {\n    margin-right: -0.25rem !important;\n  }\n  .mb-md-n1,\n  .my-md-n1 {\n    margin-bottom: -0.25rem !important;\n  }\n  .ml-md-n1,\n  .mx-md-n1 {\n    margin-left: -0.25rem !important;\n  }\n  .m-md-n2 {\n    margin: -0.5rem !important;\n  }\n  .mt-md-n2,\n  .my-md-n2 {\n    margin-top: -0.5rem !important;\n  }\n  .mr-md-n2,\n  .mx-md-n2 {\n    margin-right: -0.5rem !important;\n  }\n  .mb-md-n2,\n  .my-md-n2 {\n    margin-bottom: -0.5rem !important;\n  }\n  .ml-md-n2,\n  .mx-md-n2 {\n    margin-left: -0.5rem !important;\n  }\n  .m-md-n3 {\n    margin: -1rem !important;\n  }\n  .mt-md-n3,\n  .my-md-n3 {\n    margin-top: -1rem !important;\n  }\n  .mr-md-n3,\n  .mx-md-n3 {\n    margin-right: -1rem !important;\n  }\n  .mb-md-n3,\n  .my-md-n3 {\n    margin-bottom: -1rem !important;\n  }\n  .ml-md-n3,\n  .mx-md-n3 {\n    margin-left: -1rem !important;\n  }\n  .m-md-n4 {\n    margin: -1.5rem !important;\n  }\n  .mt-md-n4,\n  .my-md-n4 {\n    margin-top: -1.5rem !important;\n  }\n  .mr-md-n4,\n  .mx-md-n4 {\n    margin-right: -1.5rem !important;\n  }\n  .mb-md-n4,\n  .my-md-n4 {\n    margin-bottom: -1.5rem !important;\n  }\n  .ml-md-n4,\n  .mx-md-n4 {\n    margin-left: -1.5rem !important;\n  }\n  .m-md-n5 {\n    margin: -3rem !important;\n  }\n  .mt-md-n5,\n  .my-md-n5 {\n    margin-top: -3rem !important;\n  }\n  .mr-md-n5,\n  .mx-md-n5 {\n    margin-right: -3rem !important;\n  }\n  .mb-md-n5,\n  .my-md-n5 {\n    margin-bottom: -3rem !important;\n  }\n  .ml-md-n5,\n  .mx-md-n5 {\n    margin-left: -3rem !important;\n  }\n  .m-md-auto {\n    margin: auto !important;\n  }\n  .mt-md-auto,\n  .my-md-auto {\n    margin-top: auto !important;\n  }\n  .mr-md-auto,\n  .mx-md-auto {\n    margin-right: auto !important;\n  }\n  .mb-md-auto,\n  .my-md-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-md-auto,\n  .mx-md-auto {\n    margin-left: auto !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .m-lg-0 {\n    margin: 0 !important;\n  }\n  .mt-lg-0,\n  .my-lg-0 {\n    margin-top: 0 !important;\n  }\n  .mr-lg-0,\n  .mx-lg-0 {\n    margin-right: 0 !important;\n  }\n  .mb-lg-0,\n  .my-lg-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-lg-0,\n  .mx-lg-0 {\n    margin-left: 0 !important;\n  }\n  .m-lg-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-lg-1,\n  .my-lg-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-lg-1,\n  .mx-lg-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-lg-1,\n  .my-lg-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-lg-1,\n  .mx-lg-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-lg-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-lg-2,\n  .my-lg-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-lg-2,\n  .mx-lg-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-lg-2,\n  .my-lg-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-lg-2,\n  .mx-lg-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-lg-3 {\n    margin: 1rem !important;\n  }\n  .mt-lg-3,\n  .my-lg-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-lg-3,\n  .mx-lg-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-lg-3,\n  .my-lg-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-lg-3,\n  .mx-lg-3 {\n    margin-left: 1rem !important;\n  }\n  .m-lg-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-lg-4,\n  .my-lg-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-lg-4,\n  .mx-lg-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-lg-4,\n  .my-lg-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-lg-4,\n  .mx-lg-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-lg-5 {\n    margin: 3rem !important;\n  }\n  .mt-lg-5,\n  .my-lg-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-lg-5,\n  .mx-lg-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-lg-5,\n  .my-lg-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-lg-5,\n  .mx-lg-5 {\n    margin-left: 3rem !important;\n  }\n  .p-lg-0 {\n    padding: 0 !important;\n  }\n  .pt-lg-0,\n  .py-lg-0 {\n    padding-top: 0 !important;\n  }\n  .pr-lg-0,\n  .px-lg-0 {\n    padding-right: 0 !important;\n  }\n  .pb-lg-0,\n  .py-lg-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-lg-0,\n  .px-lg-0 {\n    padding-left: 0 !important;\n  }\n  .p-lg-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-lg-1,\n  .py-lg-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-lg-1,\n  .px-lg-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-lg-1,\n  .py-lg-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-lg-1,\n  .px-lg-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-lg-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-lg-2,\n  .py-lg-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-lg-2,\n  .px-lg-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-lg-2,\n  .py-lg-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-lg-2,\n  .px-lg-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-lg-3 {\n    padding: 1rem !important;\n  }\n  .pt-lg-3,\n  .py-lg-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-lg-3,\n  .px-lg-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-lg-3,\n  .py-lg-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-lg-3,\n  .px-lg-3 {\n    padding-left: 1rem !important;\n  }\n  .p-lg-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-lg-4,\n  .py-lg-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-lg-4,\n  .px-lg-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-lg-4,\n  .py-lg-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-lg-4,\n  .px-lg-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-lg-5 {\n    padding: 3rem !important;\n  }\n  .pt-lg-5,\n  .py-lg-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-lg-5,\n  .px-lg-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-lg-5,\n  .py-lg-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-lg-5,\n  .px-lg-5 {\n    padding-left: 3rem !important;\n  }\n  .m-lg-n1 {\n    margin: -0.25rem !important;\n  }\n  .mt-lg-n1,\n  .my-lg-n1 {\n    margin-top: -0.25rem !important;\n  }\n  .mr-lg-n1,\n  .mx-lg-n1 {\n    margin-right: -0.25rem !important;\n  }\n  .mb-lg-n1,\n  .my-lg-n1 {\n    margin-bottom: -0.25rem !important;\n  }\n  .ml-lg-n1,\n  .mx-lg-n1 {\n    margin-left: -0.25rem !important;\n  }\n  .m-lg-n2 {\n    margin: -0.5rem !important;\n  }\n  .mt-lg-n2,\n  .my-lg-n2 {\n    margin-top: -0.5rem !important;\n  }\n  .mr-lg-n2,\n  .mx-lg-n2 {\n    margin-right: -0.5rem !important;\n  }\n  .mb-lg-n2,\n  .my-lg-n2 {\n    margin-bottom: -0.5rem !important;\n  }\n  .ml-lg-n2,\n  .mx-lg-n2 {\n    margin-left: -0.5rem !important;\n  }\n  .m-lg-n3 {\n    margin: -1rem !important;\n  }\n  .mt-lg-n3,\n  .my-lg-n3 {\n    margin-top: -1rem !important;\n  }\n  .mr-lg-n3,\n  .mx-lg-n3 {\n    margin-right: -1rem !important;\n  }\n  .mb-lg-n3,\n  .my-lg-n3 {\n    margin-bottom: -1rem !important;\n  }\n  .ml-lg-n3,\n  .mx-lg-n3 {\n    margin-left: -1rem !important;\n  }\n  .m-lg-n4 {\n    margin: -1.5rem !important;\n  }\n  .mt-lg-n4,\n  .my-lg-n4 {\n    margin-top: -1.5rem !important;\n  }\n  .mr-lg-n4,\n  .mx-lg-n4 {\n    margin-right: -1.5rem !important;\n  }\n  .mb-lg-n4,\n  .my-lg-n4 {\n    margin-bottom: -1.5rem !important;\n  }\n  .ml-lg-n4,\n  .mx-lg-n4 {\n    margin-left: -1.5rem !important;\n  }\n  .m-lg-n5 {\n    margin: -3rem !important;\n  }\n  .mt-lg-n5,\n  .my-lg-n5 {\n    margin-top: -3rem !important;\n  }\n  .mr-lg-n5,\n  .mx-lg-n5 {\n    margin-right: -3rem !important;\n  }\n  .mb-lg-n5,\n  .my-lg-n5 {\n    margin-bottom: -3rem !important;\n  }\n  .ml-lg-n5,\n  .mx-lg-n5 {\n    margin-left: -3rem !important;\n  }\n  .m-lg-auto {\n    margin: auto !important;\n  }\n  .mt-lg-auto,\n  .my-lg-auto {\n    margin-top: auto !important;\n  }\n  .mr-lg-auto,\n  .mx-lg-auto {\n    margin-right: auto !important;\n  }\n  .mb-lg-auto,\n  .my-lg-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-lg-auto,\n  .mx-lg-auto {\n    margin-left: auto !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .m-xl-0 {\n    margin: 0 !important;\n  }\n  .mt-xl-0,\n  .my-xl-0 {\n    margin-top: 0 !important;\n  }\n  .mr-xl-0,\n  .mx-xl-0 {\n    margin-right: 0 !important;\n  }\n  .mb-xl-0,\n  .my-xl-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-xl-0,\n  .mx-xl-0 {\n    margin-left: 0 !important;\n  }\n  .m-xl-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-xl-1,\n  .my-xl-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-xl-1,\n  .mx-xl-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-xl-1,\n  .my-xl-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-xl-1,\n  .mx-xl-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-xl-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-xl-2,\n  .my-xl-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-xl-2,\n  .mx-xl-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-xl-2,\n  .my-xl-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-xl-2,\n  .mx-xl-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-xl-3 {\n    margin: 1rem !important;\n  }\n  .mt-xl-3,\n  .my-xl-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-xl-3,\n  .mx-xl-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-xl-3,\n  .my-xl-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-xl-3,\n  .mx-xl-3 {\n    margin-left: 1rem !important;\n  }\n  .m-xl-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-xl-4,\n  .my-xl-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-xl-4,\n  .mx-xl-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-xl-4,\n  .my-xl-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-xl-4,\n  .mx-xl-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-xl-5 {\n    margin: 3rem !important;\n  }\n  .mt-xl-5,\n  .my-xl-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-xl-5,\n  .mx-xl-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-xl-5,\n  .my-xl-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-xl-5,\n  .mx-xl-5 {\n    margin-left: 3rem !important;\n  }\n  .p-xl-0 {\n    padding: 0 !important;\n  }\n  .pt-xl-0,\n  .py-xl-0 {\n    padding-top: 0 !important;\n  }\n  .pr-xl-0,\n  .px-xl-0 {\n    padding-right: 0 !important;\n  }\n  .pb-xl-0,\n  .py-xl-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-xl-0,\n  .px-xl-0 {\n    padding-left: 0 !important;\n  }\n  .p-xl-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-xl-1,\n  .py-xl-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-xl-1,\n  .px-xl-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-xl-1,\n  .py-xl-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-xl-1,\n  .px-xl-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-xl-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-xl-2,\n  .py-xl-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-xl-2,\n  .px-xl-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-xl-2,\n  .py-xl-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-xl-2,\n  .px-xl-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-xl-3 {\n    padding: 1rem !important;\n  }\n  .pt-xl-3,\n  .py-xl-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-xl-3,\n  .px-xl-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-xl-3,\n  .py-xl-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-xl-3,\n  .px-xl-3 {\n    padding-left: 1rem !important;\n  }\n  .p-xl-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-xl-4,\n  .py-xl-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-xl-4,\n  .px-xl-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-xl-4,\n  .py-xl-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-xl-4,\n  .px-xl-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-xl-5 {\n    padding: 3rem !important;\n  }\n  .pt-xl-5,\n  .py-xl-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-xl-5,\n  .px-xl-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-xl-5,\n  .py-xl-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-xl-5,\n  .px-xl-5 {\n    padding-left: 3rem !important;\n  }\n  .m-xl-n1 {\n    margin: -0.25rem !important;\n  }\n  .mt-xl-n1,\n  .my-xl-n1 {\n    margin-top: -0.25rem !important;\n  }\n  .mr-xl-n1,\n  .mx-xl-n1 {\n    margin-right: -0.25rem !important;\n  }\n  .mb-xl-n1,\n  .my-xl-n1 {\n    margin-bottom: -0.25rem !important;\n  }\n  .ml-xl-n1,\n  .mx-xl-n1 {\n    margin-left: -0.25rem !important;\n  }\n  .m-xl-n2 {\n    margin: -0.5rem !important;\n  }\n  .mt-xl-n2,\n  .my-xl-n2 {\n    margin-top: -0.5rem !important;\n  }\n  .mr-xl-n2,\n  .mx-xl-n2 {\n    margin-right: -0.5rem !important;\n  }\n  .mb-xl-n2,\n  .my-xl-n2 {\n    margin-bottom: -0.5rem !important;\n  }\n  .ml-xl-n2,\n  .mx-xl-n2 {\n    margin-left: -0.5rem !important;\n  }\n  .m-xl-n3 {\n    margin: -1rem !important;\n  }\n  .mt-xl-n3,\n  .my-xl-n3 {\n    margin-top: -1rem !important;\n  }\n  .mr-xl-n3,\n  .mx-xl-n3 {\n    margin-right: -1rem !important;\n  }\n  .mb-xl-n3,\n  .my-xl-n3 {\n    margin-bottom: -1rem !important;\n  }\n  .ml-xl-n3,\n  .mx-xl-n3 {\n    margin-left: -1rem !important;\n  }\n  .m-xl-n4 {\n    margin: -1.5rem !important;\n  }\n  .mt-xl-n4,\n  .my-xl-n4 {\n    margin-top: -1.5rem !important;\n  }\n  .mr-xl-n4,\n  .mx-xl-n4 {\n    margin-right: -1.5rem !important;\n  }\n  .mb-xl-n4,\n  .my-xl-n4 {\n    margin-bottom: -1.5rem !important;\n  }\n  .ml-xl-n4,\n  .mx-xl-n4 {\n    margin-left: -1.5rem !important;\n  }\n  .m-xl-n5 {\n    margin: -3rem !important;\n  }\n  .mt-xl-n5,\n  .my-xl-n5 {\n    margin-top: -3rem !important;\n  }\n  .mr-xl-n5,\n  .mx-xl-n5 {\n    margin-right: -3rem !important;\n  }\n  .mb-xl-n5,\n  .my-xl-n5 {\n    margin-bottom: -3rem !important;\n  }\n  .ml-xl-n5,\n  .mx-xl-n5 {\n    margin-left: -3rem !important;\n  }\n  .m-xl-auto {\n    margin: auto !important;\n  }\n  .mt-xl-auto,\n  .my-xl-auto {\n    margin-top: auto !important;\n  }\n  .mr-xl-auto,\n  .mx-xl-auto {\n    margin-right: auto !important;\n  }\n  .mb-xl-auto,\n  .my-xl-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-xl-auto,\n  .mx-xl-auto {\n    margin-left: auto !important;\n  }\n}\n\n.text-monospace {\n  font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !important;\n}\n\n.text-justify {\n  text-align: justify !important;\n}\n\n.text-wrap {\n  white-space: normal !important;\n}\n\n.text-nowrap {\n  white-space: nowrap !important;\n}\n\n.text-truncate {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.text-left {\n  text-align: left !important;\n}\n\n.text-right {\n  text-align: right !important;\n}\n\n.text-center {\n  text-align: center !important;\n}\n\n@media (min-width: 576px) {\n  .text-sm-left {\n    text-align: left !important;\n  }\n  .text-sm-right {\n    text-align: right !important;\n  }\n  .text-sm-center {\n    text-align: center !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .text-md-left {\n    text-align: left !important;\n  }\n  .text-md-right {\n    text-align: right !important;\n  }\n  .text-md-center {\n    text-align: center !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .text-lg-left {\n    text-align: left !important;\n  }\n  .text-lg-right {\n    text-align: right !important;\n  }\n  .text-lg-center {\n    text-align: center !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .text-xl-left {\n    text-align: left !important;\n  }\n  .text-xl-right {\n    text-align: right !important;\n  }\n  .text-xl-center {\n    text-align: center !important;\n  }\n}\n\n.text-lowercase {\n  text-transform: lowercase !important;\n}\n\n.text-uppercase {\n  text-transform: uppercase !important;\n}\n\n.text-capitalize {\n  text-transform: capitalize !important;\n}\n\n.font-weight-light {\n  font-weight: 300 !important;\n}\n\n.font-weight-lighter {\n  font-weight: lighter !important;\n}\n\n.font-weight-normal {\n  font-weight: 400 !important;\n}\n\n.font-weight-bold {\n  font-weight: 700 !important;\n}\n\n.font-weight-bolder {\n  font-weight: bolder !important;\n}\n\n.font-italic {\n  font-style: italic !important;\n}\n\n.text-white {\n  color: #fff !important;\n}\n\n.text-primary {\n  color: #007bff !important;\n}\n\na.text-primary:hover, a.text-primary:focus {\n  color: #0056b3 !important;\n}\n\n.text-secondary {\n  color: #6c757d !important;\n}\n\na.text-secondary:hover, a.text-secondary:focus {\n  color: #494f54 !important;\n}\n\n.text-success {\n  color: #28a745 !important;\n}\n\na.text-success:hover, a.text-success:focus {\n  color: #19692c !important;\n}\n\n.text-info {\n  color: #17a2b8 !important;\n}\n\na.text-info:hover, a.text-info:focus {\n  color: #0f6674 !important;\n}\n\n.text-warning {\n  color: #ffc107 !important;\n}\n\na.text-warning:hover, a.text-warning:focus {\n  color: #ba8b00 !important;\n}\n\n.text-danger {\n  color: #dc3545 !important;\n}\n\na.text-danger:hover, a.text-danger:focus {\n  color: #a71d2a !important;\n}\n\n.text-light {\n  color: #f8f9fa !important;\n}\n\na.text-light:hover, a.text-light:focus {\n  color: #cbd3da !important;\n}\n\n.text-dark {\n  color: #343a40 !important;\n}\n\na.text-dark:hover, a.text-dark:focus {\n  color: #121416 !important;\n}\n\n.text-body {\n  color: #212529 !important;\n}\n\n.text-muted {\n  color: #6c757d !important;\n}\n\n.text-black-50 {\n  color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n  color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n\n.text-decoration-none {\n  text-decoration: none !important;\n}\n\n.text-break {\n  word-break: break-word !important;\n  overflow-wrap: break-word !important;\n}\n\n.text-reset {\n  color: inherit !important;\n}\n\n.visible {\n  visibility: visible !important;\n}\n\n.invisible {\n  visibility: hidden !important;\n}\n\n@media print {\n  *,\n  *::before,\n  *::after {\n    text-shadow: none !important;\n    box-shadow: none !important;\n  }\n  a:not(.btn) {\n    text-decoration: underline;\n  }\n  abbr[title]::after {\n    content: \" (\" attr(title) \")\";\n  }\n  pre {\n    white-space: pre-wrap !important;\n  }\n  pre,\n  blockquote {\n    border: 1px solid #adb5bd;\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  @page {\n    size: a3;\n  }\n  body {\n    min-width: 992px !important;\n  }\n  .container {\n    min-width: 992px !important;\n  }\n  .navbar {\n    display: none;\n  }\n  .badge {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #dee2e6 !important;\n  }\n  .table-dark {\n    color: inherit;\n  }\n  .table-dark th,\n  .table-dark td,\n  .table-dark thead th,\n  .table-dark tbody + tbody {\n    border-color: #dee2e6;\n  }\n  .table .thead-dark th {\n    color: inherit;\n    border-color: #dee2e6;\n  }\n}\n/*# sourceMappingURL=bootstrap.css.map */"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bootstrap4/css/bootstrap.css.map",
    "content": "{\"version\":3,\"sources\":[\"../../scss/bootstrap.scss\",\"bootstrap.css\",\"../../scss/_root.scss\",\"../../scss/_reboot.scss\",\"../../scss/_variables.scss\",\"../../scss/vendor/_rfs.scss\",\"../../scss/mixins/_hover.scss\",\"../../scss/_type.scss\",\"../../scss/mixins/_lists.scss\",\"../../scss/_images.scss\",\"../../scss/mixins/_image.scss\",\"../../scss/mixins/_border-radius.scss\",\"../../scss/_code.scss\",\"../../scss/_grid.scss\",\"../../scss/mixins/_grid.scss\",\"../../scss/mixins/_breakpoints.scss\",\"../../scss/mixins/_grid-framework.scss\",\"../../scss/_tables.scss\",\"../../scss/mixins/_table-row.scss\",\"../../scss/_functions.scss\",\"../../scss/_forms.scss\",\"../../scss/mixins/_transition.scss\",\"../../scss/mixins/_forms.scss\",\"../../scss/mixins/_gradients.scss\",\"../../scss/_buttons.scss\",\"../../scss/mixins/_buttons.scss\",\"../../scss/_transitions.scss\",\"../../scss/_dropdown.scss\",\"../../scss/mixins/_caret.scss\",\"../../scss/mixins/_nav-divider.scss\",\"../../scss/_button-group.scss\",\"../../scss/_input-group.scss\",\"../../scss/_custom-forms.scss\",\"../../scss/_nav.scss\",\"../../scss/_navbar.scss\",\"../../scss/_card.scss\",\"../../scss/_breadcrumb.scss\",\"../../scss/_pagination.scss\",\"../../scss/mixins/_pagination.scss\",\"../../scss/_badge.scss\",\"../../scss/mixins/_badge.scss\",\"../../scss/_jumbotron.scss\",\"../../scss/_alert.scss\",\"../../scss/mixins/_alert.scss\",\"../../scss/_progress.scss\",\"../../scss/_media.scss\",\"../../scss/_list-group.scss\",\"../../scss/mixins/_list-group.scss\",\"../../scss/_close.scss\",\"../../scss/_toasts.scss\",\"../../scss/_modal.scss\",\"../../scss/_tooltip.scss\",\"../../scss/mixins/_reset-text.scss\",\"../../scss/_popover.scss\",\"../../scss/_carousel.scss\",\"../../scss/mixins/_clearfix.scss\",\"../../scss/_spinners.scss\",\"../../scss/utilities/_align.scss\",\"../../scss/mixins/_background-variant.scss\",\"../../scss/utilities/_background.scss\",\"../../scss/utilities/_borders.scss\",\"../../scss/utilities/_display.scss\",\"../../scss/utilities/_embed.scss\",\"../../scss/utilities/_flex.scss\",\"../../scss/utilities/_float.scss\",\"../../scss/utilities/_overflow.scss\",\"../../scss/utilities/_position.scss\",\"../../scss/utilities/_screenreaders.scss\",\"../../scss/mixins/_screen-reader.scss\",\"../../scss/utilities/_shadows.scss\",\"../../scss/utilities/_sizing.scss\",\"../../scss/utilities/_stretched-link.scss\",\"../../scss/utilities/_spacing.scss\",\"../../scss/utilities/_text.scss\",\"../../scss/mixins/_text-truncate.scss\",\"../../scss/mixins/_text-emphasis.scss\",\"../../scss/mixins/_text-hide.scss\",\"../../scss/utilities/_visibility.scss\",\"../../scss/_print.scss\"],\"names\":[],\"mappings\":\"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AF7G1B;;AAEA;EEmHE,wBAAwB;AFjH1B;;AEyHA;EACE,aAAa;EACb,0BAA0B;AFtH5B;;AE6HA;EACE,qBAAqB;AF1HvB;;AE6HA;EACE,kBAAkB;EAClB,eAAe;AF1HjB;;AE6HA;EACE,aAAa;AF1Hf;;AAEA;EE8HE,wBAAwB;AF5H1B;;AM/VA;;EAEE,qBHiSuC;EG/RvC,gBHiS+B;EGhS/B,gBHiS+B;AHgEjC;;AM7VA;EFgHM,iBAtCY;AJuRlB;;AMhWA;EF+GM,eAtCY;AJ2RlB;;AMnWA;EF8GM,kBAtCY;AJ+RlB;;AMtWA;EF6GM,iBAtCY;AJmSlB;;AMzWA;EF4GM,kBAtCY;AJuSlB;;AM5WA;EF2GM,eAtCY;AJ2SlB;;AM9WA;EFyGM,kBAtCY;EEjEhB,gBHmS+B;AH8EjC;;AM7WA;EFmGM,eAtCY;EE3DhB,gBHsR+B;EGrR/B,gBH6Q+B;AHmGjC;;AM9WA;EF8FM,iBAtCY;EEtDhB,gBHkR+B;EGjR/B,gBHwQ+B;AHyGjC;;AM/WA;EFyFM,iBAtCY;EEjDhB,gBH8Q+B;EG7Q/B,gBHmQ+B;AH+GjC;;AMhXA;EFoFM,iBAtCY;EE5ChB,gBH0Q+B;EGzQ/B,gBH8P+B;AHqHjC;;AE1VA;EIhBE,gBH0EW;EGzEX,mBHyEW;EGxEX,SAAS;EACT,wCHzCa;AHuZf;;AMtWA;;EFMI,cAAW;EEHb,gBHsN+B;AHmJjC;;AMtWA;;EAEE,cH8PgC;EG7PhC,yBHsQmC;AHmGrC;;AMjWA;EC/EE,eAAe;EACf,gBAAgB;APoblB;;AMjWA;ECpFE,eAAe;EACf,gBAAgB;APyblB;;AMnWA;EACE,qBAAqB;ANsWvB;;AMvWA;EAII,oBHgP+B;AHuHnC;;AM7VA;EFjCI,cAAW;EEmCb,yBAAyB;ANgW3B;;AM5VA;EACE,mBHiBW;ECFP,kBAtCY;AJuXlB;;AM5VA;EACE,cAAc;EF7CZ,cAAW;EE+Cb,cH1GgB;AHyclB;;AMlWA;EAMI,qBAAqB;ANgWzB;;AQndA;ECIE,eAAe;EAGf,YAAY;ATidd;;AQldA;EACE,gBL++BwC;EK9+BxC,sBLRa;EKSb,yBLNgB;EOLd,sBPqOgC;EM/NlC,eAAe;EAGf,YAA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AAwB,iBADZ;IACY,QADZ;EfitClB;EehtCM;IAAwB,iBADZ;IACY,QADZ;EfotClB;EentCM;IAAwB,iBADZ;IACY,QADZ;EfutClB;EettCM;IAAwB,iBADZ;IACY,QADZ;Ef0tClB;EeztCM;IAAwB,iBADZ;IACY,QADZ;Ef6tClB;Ee5tCM;IAAwB,iBADZ;IACY,QADZ;EfguClB;Ee/tCM;IAAwB,iBADZ;IACY,QADZ;EfmuClB;EeluCM;IAAwB,iBADZ;IACY,QADZ;EfsuClB;EeruCM;IAAwB,iBADZ;IACY,QADZ;EfyuClB;EexuCM;IAAwB,iBADZ;IACY,QADZ;Ef4uClB;Ee3uCM;IAAwB,kBADZ;IACY,SADZ;Ef+uClB;Ee9uCM;IAAwB,kBADZ;IACY,SADZ;EfkvClB;EejvCM;IAAwB,kBADZ;IACY,SADZ;EfqvClB;Ee9uCQ;IFTR,cAA4B;Eb0vC5B;EejvCQ;IFTR,sBAA8C;Eb6vC9C;EepvCQ;IFTR,uBAA8C;EbgwC9C;EevvCQ;IFTR,gBAA8C;EbmwC9C;Ee1vCQ;IFTR,uBAA8C;EbswC9C;Ee7vCQ;IFTR,uBAA8C;EbywC9C;EehwCQ;IFTR,gBAA8C;Eb4wC9C;EenwCQ;IFTR,uBAA8C;Eb+wC9C;EetwCQ;IFTR,uBAA8C;EbkxC9C;EezwCQ;IFTR,gBAA8C;EbqxC9C;Ee5wCQ;IFTR,uBAA8C;EbwxC9C;Ee/wCQ;IFTR,uBAA8C;Eb2xC9C;AACF;;AgBz0CA;EACE,WAAW;EACX,mBb2HW;Ea1HX,cbSgB;AHm0ClB;;AgB/0CA;;EAQI,gBb8UgC;Ea7UhC,mBAAmB;EACnB,6BbJc;AHg1ClB;;AgBt1CA;EAcI,sBAAsB;EACtB,gCbTc;AHq1ClB;;AgB31CA;EAmBI,6Bbbc;AHy1ClB;;AgBn0CA;;EAGI,ebwT+B;AH6gCnC;;AgB5zCA;EACE,yBbnCgB;AHk2ClB;;AgBh0CA;;EAKI,yBbvCc;AHu2ClB;;AgBr0CA;;EAWM,wBAA4C;AhB+zClD;;AgB1zCA;;;;EAKI,SAAS;AhB4zCb;;AgBpzCA;EAEI,qCb1DW;AHg3Cf;;AKr3CE;EW2EI,cbvEY;EawEZ,sCbvES;AHq3Cf;;AiBj4CE;;;EAII,yBC2E4D;AlBwzClE;;AiBv4CE;;;;EAYM,qBCmE0D;AlB+zClE;;AKv4CE;EYiBM,yBAJsC;AjB83C9C;;AiB/3CE;;EASQ,yBARoC;AjBm4C9C;;AiBv5CE;;;EAII,yBC2E4D;AlB80ClE;;AiB75CE;;;;EAYM,qBCmE0D;AlBq1ClE;;AK75CE;EYiBM,yBAJsC;AjBo5C9C;;AiBr5CE;;EASQ,yBARoC;AjBy5C9C;;AiB76CE;;;EAII,yBC2E4D;AlBo2ClE;;AiBn7CE;;;;EAYM,qBCmE0D;AlB22ClE;;AKn7CE;EYiBM,yBAJsC;AjB06C9C;;AiB36CE;;EASQ,yBARoC;AjB+6C9C;;AiBn8CE;;;EAII,yBC2E4D;AlB03ClE;;AiBz8CE;;;;EAYM,qBCmE0D;AlBi4ClE;;AKz8CE;EYiBM,yBAJsC;AjBg8C9C;;AiBj8CE;;EASQ,yBARoC;AjBq8C9C;;AiBz9CE;;;EAII,yBC2E4D;AlBg5ClE;;AiB/9CE;;;;EAYM,qBCmE0D;AlBu5ClE;;AK/9CE;EYiBM,yBAJsC;AjBs9C9C;;AiBv9CE;;EASQ,yBARoC;AjB29C9C;;AiB/+CE;;;EAII,yBC2E4D;AlBs6ClE;;AiBr/CE;;;;EAYM,qBCmE0D;AlB66ClE;;AKr/CE;EYiBM,yBAJsC;AjB4+C9C;;AiB7+CE;;EASQ,yBARoC;AjBi/C9C;;AiBrgDE;;;EAII,yBC2E4D;AlB47ClE;;AiB3gDE;;;;EAYM,qBCmE0D;AlBm8ClE;;AK3gDE;EYiBM,yBAJsC;AjBkgD9C;;AiBngDE;;EASQ,yBARoC;AjBugD9C;;AiB3hDE;;;EAII,yBC2E4D;AlBk9ClE;;AiBjiDE;;;;EAYM,qBCmE0D;AlBy9ClE;;AKjiDE;EYiBM,yBAJsC;AjBwhD9C;;AiBzhDE;;EASQ,yBARoC;AjB6hD9C;;AiBjjDE;;;EAII,sCdQS;AH2iDf;;AKhjDE;EYiBM,sCAJsC;AjBuiD9C;;AiBxiDE;;EASQ,sCARoC;AjB4iD9C;;AgBt9CA;EAGM,Wb3GS;Ea4GT,yBbpGY;EaqGZ,qBb2PqD;AH4tC3D;;AgB59CA;EAWM,cb5GY;Ea6GZ,yBblHY;EamHZ,qBblHY;AHukDlB;;AgBh9CA;EACE,Wb3Ha;Ea4Hb,yBbpHgB;AHukDlB;;AgBr9CA;;;EAOI,qBbuOuD;AH6uC3D;;AgB39CA;EAWI,SAAS;AhBo9Cb;;AgB/9CA;EAgBM,2Cb1IS;AH6lDf;;AKxlDE;EW4IM,WbjJO;EakJP,4CblJO;AHkmDf;;AchiDI;EEiGA;IAEI,cAAc;IACd,WAAW;IACX,gBAAgB;IAChB,iCAAiC;EhBk8CvC;EgBv8CG;IASK,SAAS;EhBi8CjB;AACF;;Ac5iDI;EEiGA;IAEI,cAAc;IACd,WAAW;IACX,gBAAgB;IAChB,iCAAiC;EhB88CvC;EgBn9CG;IASK,SAAS;EhB68CjB;AACF;;AcxjDI;EEiGA;IAEI,cAAc;IACd,WAAW;IACX,gBAAgB;IAChB,iCAAiC;EhB09CvC;EgB/9CG;IASK,SAAS;EhBy9CjB;AACF;;AcpkDI;EEiGA;IAEI,cAAc;IACd,WAAW;IACX,gBAAgB;IAChB,iCAAiC;EhBs+CvC;EgB3+CG;IASK,SAAS;EhBq+CjB;AACF;;AgBp/CA;EAOQ,cAAc;EACd,WAAW;EACX,gBAAgB;EAChB,iCAAiC;AhBi/CzC;;AgB3/CA;EAcU,SAAS;AhBi/CnB;;AmB9pDA;EACE,cAAc;EACd,WAAW;EACX,mChBqe2H;EgBpe3H,yBhBqXkC;EChQ9B,eAtCY;Ee5EhB,gBhB8Q+B;EgB7Q/B,gBhBkR+B;EgBjR/B,chBDgB;EgBEhB,sBhBTa;EgBUb,4BAA4B;EAC5B,yBhBPgB;EONd,sBPqOgC;EiBpO9B,wEjB4e4F;AHksClG;;AoBzqDI;EDLJ;ICMM,gBAAgB;EpB6qDpB;AACF;;AmBprDA;EAsBI,6BAA6B;EAC7B,SAAS;AnBkqDb;;AqBlrDE;EACE,clBAc;EkBCd,sBlBRW;EkBSX,qBlBgdsE;EkB/ctE,UAAU;EAKR,gDlBcW;AHmqDjB;;AmBjsDA;EA+BI,chBxBc;EgB0Bd,UAAU;AnBqqDd;;AmBtsDA;EA+BI,chBxBc;EgB0Bd,UAAU;AnBqqDd;;AmBtsDA;EA+BI,chBxBc;EgB0Bd,UAAU;AnBqqDd;;AmBtsDA;EA+BI,chBxBc;EgB0Bd,UAAU;AnBqqDd;;AmBtsDA;EA+BI,chBxBc;EgB0Bd,UAAU;AnBqqDd;;AmBtsDA;EA2CI,yBhBxCc;EgB0Cd,UAAU;AnB8pDd;;AmB1pDA;EAOI,chBhDc;EgBiDd,sBhBxDW;AH+sDf;;AmBlpDA;;EAEE,cAAc;EACd,WAAW;AnBqpDb;;AmB3oDA;EACE,iCAA+D;EAC/D,oCAAkE;EAClE,gBAAgB;EfZd,kBAAW;Eecb,gBhB0M+B;AHo8CjC;;AmB3oDA;EACE,+BAAkE;EAClE,kCAAqE;EfoCjE,kBAtCY;EeIhB,gBhBuI+B;AHugDjC;;AmB3oDA;EACE,gCAAkE;EAClE,mCAAqE;Ef6BjE,mBAtCY;EeWhB,gBhBiI+B;AH6gDjC;;AmBroDA;EACE,cAAc;EACd,WAAW;EACX,qBhB8QmC;EgB7QnC,wBhB6QmC;EgB5QnC,gBAAgB;EAChB,gBhB6K+B;EgB5K/B,chBpGgB;EgBqGhB,6BAA6B;EAC7B,yBAAyB;EACzB,mBAAmC;AnBwoDrC;;AmBlpDA;EAcI,gBAAgB;EAChB,eAAe;AnBwoDnB;;AmB5nDA;EACE,kChBsWqI;EgBrWrI,uBhB+PiC;EC1Q7B,mBAtCY;EemDhB,gBhByF+B;EOhO7B,qBPuO+B;AHgiDnC;;AmB5nDA;EACE,gChB+VqI;EgB9VrI,oBhB4PgC;EC/Q5B,kBAtCY;Ee2DhB,gBhBgF+B;EO/N7B,qBPsO+B;AHyiDnC;;AmB3nDA;EAGI,YAAY;AnB4nDhB;;AmBxnDA;EACE,YAAY;AnB2nDd;;AmBnnDA;EACE,mBhBoV0C;AHkyC5C;;AmBnnDA;EACE,cAAc;EACd,mBhBqU4C;AHizC9C;;AmB9mDA;EACE,oBAAa;EAAb,aAAa;EACb,mBAAe;EAAf,eAAe;EACf,kBAA0C;EAC1C,iBAAyC;AnBinD3C;;AmBrnDA;;EAQI,kBAA0C;EAC1C,iBAAyC;AnBknD7C;;AmBzmDA;EACE,kBAAkB;EAClB,cAAc;EACd,qBhB0S6C;AHk0C/C;;AmBzmDA;EACE,kBAAkB;EAClB,kBhBsS2C;EgBrS3C,qBhBoS6C;AHw0C/C;;AmB/mDA;EAMI,chBxMc;AHqzDlB;;AmBzmDA;EACE,gBAAgB;AnB4mDlB;;AmBzmDA;EACE,2BAAoB;EAApB,oBAAoB;EACpB,sBAAmB;EAAnB,mBAAmB;EACnB,eAAe;EACf,qBhByR4C;AHm1C9C;;AmBhnDA;EAQI,gBAAgB;EAChB,aAAa;EACb,uBhBoR4C;EgBnR5C,cAAc;AnB4mDlB;;AqBvzDE;EACE,aAAa;EACb,WAAW;EACX,mBlBod0C;EC5a1C,cAAW;EiBtCX,clBSa;AHizDjB;;AqBvzDE;EACE,kBAAkB;EAClB,SAAS;EACT,UAAU;EACV,aAAa;EACb,eAAe;EACf,uBlBsyBqC;EkBryBrC,iBAAiB;EjBmFf,mBAtCY;EiB3Cd,gBlBkP6B;EkBjP7B,WlBxCW;EkByCX,wClBLa;EOtCb,sBPqOgC;AHioDpC;;AqBtzDI;EAEE,qBlBZW;EkBeT,oClBgb2F;EkB/a3F,4PHfmI;EGgBnI,4BAA4B;EAC5B,2DlB+a6F;EkB9a7F,gElB6awF;AHy4ChG;;AqB/zDI;EAaI,qBlBvBS;EkBwBT,gDlBxBS;AH80DjB;;AqBp0DI;;;EAmBI,cAAc;ArBuzDtB;;AqBhzDI;EAGI,oClBwZ2F;EkBvZ3F,kFlByZ6F;AHw5CrG;;AqB3yDI;EAEE,qBlBhDW;EkBmDT,sDlBqe0J;EkBpe1J,6gBAAkJ;ArB2yD1J;;AqBjzDI;EAUI,qBlBxDS;EkByDT,gDlBzDS;AHo2DjB;;AqBtzDI;;;EAgBI,cAAc;ArB4yDtB;;AqBryDI;;;EAII,cAAc;ArBuyDtB;;AqBjyDI;EAGI,clBlFS;AHo3DjB;;AqBryDI;;;EAQI,cAAc;ArBmyDtB;;AqB7xDI;EAGI,clBhGS;AH83DjB;;AqBjyDI;EAMM,qBlBnGO;AHk4DjB;;AqBryDI;;;EAYI,cAAc;ArB+xDtB;;AqB3yDI;EAiBM,qBAAkC;ECnJxC,yBDoJ+C;ArB8xDnD;;AqBhzDI;EAwBM,gDlBrHO;AHi5DjB;;AqBpzDI;EA4BM,qBlBzHO;AHq5DjB;;AqBpxDI;EAGI,qBlBpIS;AHy5DjB;;AqBxxDI;;;EAQI,cAAc;ArBsxDtB;;AqB9xDI;EAaM,qBlB9IO;EkB+IP,gDlB/IO;AHo6DjB;;AqBl7DE;EACE,aAAa;EACb,WAAW;EACX,mBlBod0C;EC5a1C,cAAW;EiBtCX,clBMa;AH+6DjB;;AqBl7DE;EACE,kBAAkB;EAClB,SAAS;EACT,UAAU;EACV,aAAa;EACb,eAAe;EACf,uBlBsyBqC;EkBryBrC,iBAAiB;EjBmFf,mBAtCY;EiB3Cd,gBlBkP6B;EkBjP7B,WlBxCW;EkByCX,wClBRa;EOnCb,sBPqOgC;AH4vDpC;;AqBj7DI;EAEE,qBlBfW;EkBkBT,oClBgb2F;EkB/a3F,sSHfmI;EGgBnI,4BAA4B;EAC5B,2DlB+a6F;EkB9a7F,gElB6awF;AHogDhG;;AqB17DI;EAaI,qBlB1BS;EkB2BT,gDlB3BS;AH48DjB;;AqB/7DI;;;EAmBI,cAAc;ArBk7DtB;;AqB36DI;EAGI,oClBwZ2F;EkBvZ3F,kFlByZ6F;AHmhDrG;;AqBt6DI;EAEE,qBlBnDW;EkBsDT,sDlBqe0J;EkBpe1J,ujBAAkJ;ArBs6D1J;;AqB56DI;EAUI,qBlB3DS;EkB4DT,gDlB5DS;AHk+DjB;;AqBj7DI;;;EAgBI,cAAc;ArBu6DtB;;AqBh6DI;;;EAII,cAAc;ArBk6DtB;;AqB55DI;EAGI,clBrFS;AHk/DjB;;AqBh6DI;;;EAQI,cAAc;ArB85DtB;;AqBx5DI;EAGI,clBnGS;AH4/DjB;;AqB55DI;EAMM,qBlBtGO;AHggEjB;;AqBh6DI;;;EAYI,cAAc;ArB05DtB;;AqBt6DI;EAiBM,qBAAkC;ECnJxC,yBDoJ+C;ArBy5DnD;;AqB36DI;EAwBM,gDlBxHO;AH+gEjB;;AqB/6DI;EA4BM,qBlB5HO;AHmhEjB;;AqB/4DI;EAGI,qBlBvIS;AHuhEjB;;AqBn5DI;;;EAQI,cAAc;ArBi5DtB;;AqBz5DI;EAaM,qBlBjJO;EkBkJP,gDlBlJO;AHkiEjB;;AmBz0DA;EACE,oBAAa;EAAb,aAAa;EACb,uBAAmB;EAAnB,mBAAmB;EACnB,sBAAmB;EAAnB,mBAAmB;AnB40DrB;;AmB/0DA;EASI,WAAW;AnB00Df;;AcxhEI;EKqMJ;IAeM,oBAAa;IAAb,aAAa;IACb,sBAAmB;IAAnB,mBAAmB;IACnB,qBAAuB;IAAvB,uBAAuB;IACvB,gBAAgB;EnBy0DpB;EmB31DF;IAuBM,oBAAa;IAAb,aAAa;IACb,kBAAc;IAAd,cAAc;IACd,uBAAmB;IAAnB,mBAAmB;IACnB,sBAAmB;IAAnB,mBAAmB;IACnB,gBAAgB;EnBu0DpB;EmBl2DF;IAgCM,qBAAqB;IACrB,WAAW;IACX,sBAAsB;EnBq0D1B;EmBv2DF;IAuCM,qBAAqB;EnBm0DzB;EmB12DF;;IA4CM,WAAW;EnBk0Df;EmB92DF;IAkDM,oBAAa;IAAb,aAAa;IACb,sBAAmB;IAAnB,mBAAmB;IACnB,qBAAuB;IAAvB,uBAAuB;IACvB,WAAW;IACX,eAAe;EnB+zDnB;EmBr3DF;IAyDM,kBAAkB;IAClB,oBAAc;IAAd,cAAc;IACd,aAAa;IACb,qBhB2LwC;IgB1LxC,cAAc;EnB+zDlB;EmB53DF;IAiEM,sBAAmB;IAAnB,mBAAmB;IACnB,qBAAuB;IAAvB,uBAAuB;EnB8zD3B;EmBh4DF;IAqEM,gBAAgB;EnB8zDpB;AACF;;AuB/nEA;EACE,qBAAqB;EAErB,gBpBkR+B;EoBjR/B,cpBMgB;EoBLhB,kBAAkB;EAClB,sBAAsB;EACtB,yBAAiB;EAAjB,sBAAiB;EAAjB,qBAAiB;EAAjB,iBAAiB;EACjB,6BAA6B;EAC7B,6BAA2C;ECsF3C,yBrB0RkC;EChQ9B,eAtCY;EoBchB,gBrByL+B;EO3R7B,sBPqOgC;EiBpO9B,qIjBqb6I;AH0tDnJ;;AoB1oEI;EGLJ;IHMM,gBAAgB;EpB8oEpB;AACF;;AK/oEE;EkBQE,cpBJc;EoBKd,qBAAqB;AvB2oEzB;;AuB1pEA;EAoBI,UAAU;EACV,gDpBSa;AHioEjB;;AuB/pEA;EA2BI,apB8Y6B;AH0vDjC;;AuBznEA;;EAEE,oBAAoB;AvB4nEtB;;AuBnnEE;ECrDA,WrBCa;EmBDX,yBnB8Ba;EqB5Bf,qBrB4Be;AHgpEjB;;AKxqEE;EmBAE,WrBLW;EmBDX,yBEDoF;EASpF,qBATyH;AxBqrE7H;;AwBzqEE;EAMI,gDAAiF;AxBuqEvF;;AwBlqEE;EAEE,WrBvBW;EqBwBX,yBrBKa;EqBJb,qBrBIa;AHgqEjB;;AwB7pEE;;EAGE,WrBnCW;EqBoCX,yBAtCuK;EA0CvK,qBA1C+M;AxBssEnN;;AwB1pEI;;EAKI,gDAAiF;AxB0pEzF;;AuBrpEE;ECrDA,WrBCa;EmBDX,yBnBOc;EqBLhB,qBrBKgB;AHysElB;;AK1sEE;EmBAE,WrBLW;EmBDX,yBEDoF;EASpF,qBATyH;AxButE7H;;AwB3sEE;EAMI,iDAAiF;AxBysEvF;;AwBpsEE;EAEE,WrBvBW;EqBwBX,yBrBlBc;EqBmBd,qBrBnBc;AHytElB;;AwB/rEE;;EAGE,WrBnCW;EqBoCX,yBAtCuK;EA0CvK,qBA1C+M;AxBwuEnN;;AwB5rEI;;EAKI,iDAAiF;AxB4rEzF;;AuBvrEE;ECrDA,WrBCa;EmBDX,yBnBqCa;EqBnCf,qBrBmCe;AH6sEjB;;AK5uEE;EmBAE,WrBLW;EmBDX,yBEDoF;EASpF,qBATyH;AxByvE7H;;AwB7uEE;EAMI,+CAAiF;AxB2uEvF;;AwBtuEE;EAEE,WrBvBW;EqBwBX,yBrBYa;EqBXb,qBrBWa;AH6tEjB;;AwBjuEE;;EAGE,WrBnCW;EqBoCX,yBAtCuK;EA0CvK,qBA1C+M;AxB0wEnN;;AwB9tEI;;EAKI,+CAAiF;AxB8tEzF;;AuBztEE;ECrDA,WrBCa;EmBDX,yBnBuCa;EqBrCf,qBrBqCe;AH6uEjB;;AK9wEE;EmBAE,WrBLW;EmBDX,yBEDoF;EASpF,qBATyH;AxB2xE7H;;AwB/wEE;EAMI,gDAAiF;AxB6wEvF;;AwBxwEE;EAEE,WrBvBW;EqBwBX,yBrBca;EqBbb,qBrBaa;AH6vEjB;;AwBnwEE;;EAGE,WrBnCW;EqBoCX,yBAtCuK;EA0CvK,qBA1C+M;AxB4yEnN;;AwBhwEI;;EAKI,gDAAiF;AxBgwEzF;;AuB3vEE;ECrDA,crBUgB;EmBVd,yBnBoCa;EqBlCf,qBrBkCe;AHkxEjB;;AKhzEE;EmBAE,crBIc;EmBVd,yBEDoF;EASpF,qBATyH;AxB6zE7H;;AwBjzEE;EAMI,gDAAiF;AxB+yEvF;;AwB1yEE;EAEE,crBdc;EqBed,yBrBWa;EqBVb,qBrBUa;AHkyEjB;;AwBryEE;;EAGE,crB1Bc;EqB2Bd,yBAtCuK;EA0CvK,qBA1C+M;AxB80EnN;;AwBlyEI;;EAKI,gDAAiF;AxBkyEzF;;AuB7xEE;ECrDA,WrBCa;EmBDX,yBnBkCa;EqBhCf,qBrBgCe;AHszEjB;;AKl1EE;EmBAE,WrBLW;EmBDX,yBEDoF;EASpF,qBATyH;AxB+1E7H;;AwBn1EE;EAMI,+CAAiF;AxBi1EvF;;AwB50EE;EAEE,WrBvBW;EqBwBX,yBrBSa;EqBRb,qBrBQa;AHs0EjB;;AwBv0EE;;EAGE,WrBnCW;EqBoCX,yBAtCuK;EA0CvK,qBA1C+M;AxBg3EnN;;AwBp0EI;;EAKI,+CAAiF;AxBo0EzF;;AuB/zEE;ECrDA,crBUgB;EmBVd,yBnBEc;EqBAhB,qBrBAgB;AHw3ElB;;AKp3EE;EmBAE,crBIc;EmBVd,yBEDoF;EASpF,qBATyH;AxBi4E7H;;AwBr3EE;EAMI,iDAAiF;AxBm3EvF;;AwB92EE;EAEE,crBdc;EqBed,yBrBvBc;EqBwBd,qBrBxBc;AHw4ElB;;AwBz2EE;;EAGE,crB1Bc;EqB2Bd,yBAtCuK;EA0CvK,qBA1C+M;AxBk5EnN;;AwBt2EI;;EAKI,iDAAiF;AxBs2EzF;;AuBj2EE;ECrDA,WrBCa;EmBDX,yBnBSc;EqBPhB,qBrBOgB;AHm5ElB;;AKt5EE;EmBAE,WrBLW;EmBDX,yBEDoF;EASpF,qBATyH;AxBm6E7H;;AwBv5EE;EAMI,8CAAiF;AxBq5EvF;;AwBh5EE;EAEE,WrBvBW;EqBwBX,yBrBhBc;EqBiBd,qBrBjBc;AHm6ElB;;AwB34EE;;EAGE,WrBnCW;EqBoCX,yBAtCuK;EA0CvK,qBA1C+M;AxBo7EnN;;AwBx4EI;;EAKI,8CAAiF;AxBw4EzF;;AuB73EE;ECJA,crBzBe;EqB0Bf,qBrB1Be;AH+5EjB;;AKv7EE;EmBqDE,WrB1DW;EqB2DX,yBrB9Ba;EqB+Bb,qBrB/Ba;AHq6EjB;;AwBn4EE;EAEE,+CrBpCa;AHy6EjB;;AwBl4EE;EAEE,crBzCa;EqB0Cb,6BAA6B;AxBo4EjC;;AwBj4EE;;EAGE,WrB7EW;EqB8EX,yBrBjDa;EqBkDb,qBrBlDa;AHq7EjB;;AwBj4EI;;EAKI,+CrBzDS;AH07EjB;;AuB75EE;ECJA,crBhDgB;EqBiDhB,qBrBjDgB;AHs9ElB;;AKv9EE;EmBqDE,WrB1DW;EqB2DX,yBrBrDc;EqBsDd,qBrBtDc;AH49ElB;;AwBn6EE;EAEE,iDrB3Dc;AHg+ElB;;AwBl6EE;EAEE,crBhEc;EqBiEd,6BAA6B;AxBo6EjC;;AwBj6EE;;EAGE,WrB7EW;EqB8EX,yBrBxEc;EqByEd,qBrBzEc;AH4+ElB;;AwBj6EI;;EAKI,iDrBhFU;AHi/ElB;;AuB77EE;ECJA,crBlBe;EqBmBf,qBrBnBe;AHw9EjB;;AKv/EE;EmBqDE,WrB1DW;EqB2DX,yBrBvBa;EqBwBb,qBrBxBa;AH89EjB;;AwBn8EE;EAEE,+CrB7Ba;AHk+EjB;;AwBl8EE;EAEE,crBlCa;EqBmCb,6BAA6B;AxBo8EjC;;AwBj8EE;;EAGE,WrB7EW;EqB8EX,yBrB1Ca;EqB2Cb,qBrB3Ca;AH8+EjB;;AwBj8EI;;EAKI,+CrBlDS;AHm/EjB;;AuB79EE;ECJA,crBhBe;EqBiBf,qBrBjBe;AHs/EjB;;AKvhFE;EmBqDE,WrB1DW;EqB2DX,yBrBrBa;EqBsBb,qBrBtBa;AH4/EjB;;AwBn+EE;EAEE,gDrB3Ba;AHggFjB;;AwBl+EE;EAEE,crBhCa;EqBiCb,6BAA6B;AxBo+EjC;;AwBj+EE;;EAGE,WrB7EW;EqB8EX,yBrBxCa;EqByCb,qBrBzCa;AH4gFjB;;AwBj+EI;;EAKI,gDrBhDS;AHihFjB;;AuB7/EE;ECJA,crBnBe;EqBoBf,qBrBpBe;AHyhFjB;;AKvjFE;EmBqDE,crBjDc;EqBkDd,yBrBxBa;EqByBb,qBrBzBa;AH+hFjB;;AwBngFE;EAEE,+CrB9Ba;AHmiFjB;;AwBlgFE;EAEE,crBnCa;EqBoCb,6BAA6B;AxBogFjC;;AwBjgFE;;EAGE,crBpEc;EqBqEd,yBrB3Ca;EqB4Cb,qBrB5Ca;AH+iFjB;;AwBjgFI;;EAKI,+CrBnDS;AHojFjB;;AuB7hFE;ECJA,crBrBe;EqBsBf,qBrBtBe;AH2jFjB;;AKvlFE;EmBqDE,WrB1DW;EqB2DX,yBrB1Ba;EqB2Bb,qBrB3Ba;AHikFjB;;AwBniFE;EAEE,+CrBhCa;AHqkFjB;;AwBliFE;EAEE,crBrCa;EqBsCb,6BAA6B;AxBoiFjC;;AwBjiFE;;EAGE,WrB7EW;EqB8EX,yBrB7Ca;EqB8Cb,qBrB9Ca;AHilFjB;;AwBjiFI;;EAKI,+CrBrDS;AHslFjB;;AuB7jFE;ECJA,crBrDgB;EqBsDhB,qBrBtDgB;AH2nFlB;;AKvnFE;EmBqDE,crBjDc;EqBkDd,yBrB1Dc;EqB2Dd,qBrB3Dc;AHioFlB;;AwBnkFE;EAEE,iDrBhEc;AHqoFlB;;AwBlkFE;EAEE,crBrEc;EqBsEd,6BAA6B;AxBokFjC;;AwBjkFE;;EAGE,crBpEc;EqBqEd,yBrB7Ec;EqB8Ed,qBrB9Ec;AHipFlB;;AwBjkFI;;EAKI,iDrBrFU;AHspFlB;;AuB7lFE;ECJA,crB9CgB;EqB+ChB,qBrB/CgB;AHopFlB;;AKvpFE;EmBqDE,WrB1DW;EqB2DX,yBrBnDc;EqBoDd,qBrBpDc;AH0pFlB;;AwBnmFE;EAEE,8CrBzDc;AH8pFlB;;AwBlmFE;EAEE,crB9Dc;EqB+Dd,6BAA6B;AxBomFjC;;AwBjmFE;;EAGE,WrB7EW;EqB8EX,yBrBtEc;EqBuEd,qBrBvEc;AH0qFlB;;AwBjmFI;;EAKI,8CrB9EU;AH+qFlB;;AuBlnFA;EACE,gBpB8M+B;EoB7M/B,cpB1Ce;EoB2Cf,qBpB6F4C;AHwhF9C;;AKxrFE;EkBsEE,cpB2F8D;EoB1F9D,0BpB2F+C;AH2hFnD;;AuB7nFA;EAYI,0BpBsF+C;EoBrF/C,gBAAgB;AvBqnFpB;;AuBloFA;EAkBI,cpBjFc;EoBkFd,oBAAoB;AvBonFxB;;AuBzmFA;ECLE,oBrBySgC;EC/Q5B,kBAtCY;EoBchB,gBrB6H+B;EO/N7B,qBPsO+B;AH++EnC;;AuB5mFA;ECTE,uBrBoSiC;EC1Q7B,mBAtCY;EoBchB,gBrB8H+B;EOhO7B,qBPuO+B;AHq/EnC;;AuB1mFA;EACE,cAAc;EACd,WAAW;AvB6mFb;;AuB/mFA;EAMI,kBpBuT+B;AHszEnC;;AuBxmFA;;;EAII,WAAW;AvB0mFf;;AyBhvFA;ELMM,gCjBsP2C;AHw/EjD;;AoBzuFI;EKXJ;ILYM,gBAAgB;EpB6uFpB;AACF;;Ay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CT,gBAAgB;A9B0nGpB;;A8B1oGA;;;;;;;;;;;;EAqBM,iB3B4M2B;AHw7FjC;;A8BzpGA;;;EA6BI,UAAU;A9BkoGd;;A8B/pGA;EAkCI,UAAU;A9BioGd;;A8BnqGA;;EpBeI,0BoBwBmD;EpBvBnD,6BoBuBmD;A9BkoGvD;;A8BzqGA;;EpB6BI,yBoBWmD;EpBVnD,4BoBUmD;A9BuoGvD;;A8B/qGA;EA8CI,oBAAa;EAAb,aAAa;EACb,sBAAmB;EAAnB,mBAAmB;A9BqoGvB;;A8BprGA;;EpBeI,0BoBmC6E;EpBlC7E,6BoBkC6E;A9BwoGjF;;A8B1rGA;EpB6BI,yBoBsBsE;EpBrBtE,4BoBqBsE;A9B4oG1E;;A8BjoGA;;EAEE,oBAAa;EAAb,aAAa;A9BooGf;;A8BtoGA;;EAQI,kBAAkB;EAClB,UAAU;A9BmoGd;;A8B5oGA;;EAYM,UAAU;A9BqoGhB;;A8BjpGA;;;;;;;;EAoBI,iB3B+I6B;AHy/FjC;;A8BpoGA;EAAuB,kB3B2IU;AH6/FjC;;A8BvoGA;EAAsB,iB3B0IW;AHigGjC;;A8BnoGA;EACE,oBAAa;EAAb,aAAa;EACb,sBAAmB;EAAnB,mBAAmB;EACnB,yB3BuRkC;E2BtRlC,gBAAgB;E1BsBZ,eAtCY;E0BkBhB,gB3BgL+B;E2B/K/B,gB3BoL+B;E2BnL/B,c3B/FgB;E2BgGhB,kBAAkB;EAClB,mBAAmB;EACnB,yB3BvGgB;E2BwGhB,yB3BtGgB;EONd,sBPqOgC;AH8gGpC;;A8BnpGA;;EAkBI,aAAa;A9BsoGjB;;A8B5nGA;;EAEE,gC3B6WqI;AHkxFvI;;A8B5nGA;;;;;;EAME,oB3BkQgC;EC/Q5B,kBAtCY;E0BqDhB,gB3BsF+B;EO/N7B,qBPsO+B;AHmiGnC;;A8B5nGA;;EAEE,kC3B2VqI;AHoyFvI;;A8B5nGA;;;;;;EAME,uB3B4OiC;EC1Q7B,mBAtCY;E0BsEhB,gB3BsE+B;EOhO7B,qBPuO+B;AHmjGnC;;A8B5nGA;;EAEE,sBAA0E;A9B+nG5E;;A8BpnGA;;;;;;EpB3JI,0BoBiK4B;EpBhK5B,6BoBgK4B;A9BwnGhC;;A8BrnGA;;;;;;EpBtJI,yBoB4J2B;EpB3J3B,4BoB2J2B;A9BynG/B;;A+B/yGA;EACE,kBAAkB;EAClB,cAAc;EACd,kBAA+C;EAC/C,oBAAqE;A/BkzGvE;;A+B/yGA;EACE,2BAAoB;EAApB,oBAAoB;EACpB,kB5Bqf0C;AH6zF5C;;A+B/yGA;EACE,kBAAkB;EAClB,WAAW;EACX,UAAU;A/BkzGZ;;A+BrzGA;EAMI,W5BpBW;E4BqBX,qB5BQa;EmB9Bb,yBnB8Ba;AH4yGjB;;A+B3zGA;EAiBM,gD5BFW;AHgzGjB;;A+B/zGA;EAsBI,qB5BqbsE;AHw3F1E;;A+Bn0GA;EA0BI,W5BxCW;E4ByCX,yB5B8e8E;E4B7e9E,qB5B6e8E;AHg0FlF;;A+Bz0GA;EAkCM,c5B1CY;AHq1GlB;;A+B70GA;EAqCQ,yB5BjDU;AH61GlB;;A+BlyGA;EACE,kBAAkB;EAClB,gBAAgB;EAChB,mBAAmB;A/BqyGrB;;A+BxyGA;EAOI,kBAAkB;EAClB,YAA+E;EAC/E,aAA+D;EAC/D,cAAc;EACd,W5B0bwC;E4BzbxC,Y5BybwC;E4BxbxC,oBAAoB;EACpB,WAAW;EACX,sB5B5EW;E4B6EX,yB5BmJ6B;AHkpGjC;;A+BrzGA;EAsBI,kBAAkB;EAClB,YAA+E;EAC/E,aAA+D;EAC/D,cAAc;EACd,W5B2awC;E4B1axC,Y5B0awC;E4BzaxC,WAAW;EACX,mCAAgE;A/BmyGpE;;A+B1xGA;ErBrGI,sBPqOgC;AH8pGpC;;A+B9xGA;EAOM,6MbrEqI;AlBg2G3I;;A+BlyGA;EAaM,qB5BnFW;EmB9Bb,yBnB8Ba;AH62GjB;;A+BvyGA;EAkBM,0JbhFqI;AlBy2G3I;;A+B3yGA;EAwBM,wC5B9FW;AHq3GjB;;A+B/yGA;EA2BM,wC5BjGW;AHy3GjB;;A+B/wGA;EAGI,kB5B0Z+C;AHs3FnD;;A+BnxGA;EAQM,uJb1GqI;AlBy3G3I;;A+BvxGA;EAcM,wC5BxHW;AHq4GjB;;A+BnwGA;EACE,qBAA2D;A/BswG7D;;A+BvwGA;EAKM,cAAqD;EACrD,c5BkY+E;E4BjY/E,mBAAmB;EAEnB,qB5BgY4E;AHq4FlF;;A+B9wGA;EAaM,wBAA0I;EAC1I,0BAA+G;EAC/G,uB5B2XiI;E4B1XjI,wB5B0XiI;E4BzXjI,yB5B3KY;E4B6KZ,qB5BsX4E;EiBziB5E,iJjB8f+H;EiB9f/H,yIjB8f+H;EiB9f/H,8KjB8f+H;AH07FrI;;AoBn7GI;EW2JJ;IX1JM,gBAAgB;EpBu7GpB;AACF;;A+B9xGA;EA0BM,sB5BzLS;E4B0LT,sCAA4E;EAA5E,8BAA4E;A/BwwGlF;;A+BnyGA;EAiCM,wC5BnKW;AHy6GjB;;A+B1vGA;EACE,qBAAqB;EACrB,WAAW;EACX,mC5BwR2H;E4BvR3H,0C5BwKkC;EChQ9B,eAtCY;E2BiIhB,gB5BiE+B;E4BhE/B,gB5BqE+B;E4BpE/B,c5B9MgB;E4B+MhB,sBAAsB;EACtB,6M5BmWmI;E4BlWnI,sB5BxNa;E4ByNb,yB5BrNgB;EONd,sBPqOgC;E4BPlC,wBAAgB;EAAhB,qBAAgB;EAAhB,gBAAgB;A/B2vGlB;;A+B3wGA;EAmBI,qB5B0PsE;E4BzPtE,UAAU;EAIR,gD5BvMW;AHg8GjB;;A+BjxGA;EAiCM,c5BtOY;E4BuOZ,sB5B9OS;AHk+Gf;;A+BtxGA;EAwCI,YAAY;EACZ,sB5BmIgC;E4BlIhC,sBAAsB;A/BkvG1B;;A+B5xGA;EA8CI,c5BpPc;E4BqPd,yB5BzPc;AH2+GlB;;A+BjyGA;EAoDI,aAAa;A/BivGjB;;A+B7uGA;EACE,kC5BmOqI;E4BlOrI,oB5B2HkC;E4B1HlC,uB5B0HkC;E4BzHlC,oB5B0HiC;EC1Q7B,mBAtCY;AJu6GlB;;A+B7uGA;EACE,gC5B4NqI;E4B3NrI,mB5BwHiC;E4BvHjC,sB5BuHiC;E4BtHjC,kB5BuHgC;EC/Q5B,kBAtCY;AJ+6GlB;;A+BxuGA;EACE,kBAAkB;EAClB,qBAAqB;EACrB,WAAW;EACX,mC5B0M2H;E4BzM3H,gBAAgB;A/B2uGlB;;A+BxuGA;EACE,kBAAkB;EAClB,UAAU;EACV,WAAW;EACX,mC5BkM2H;E4BjM3H,SAAS;EACT,UAAU;A/B2uGZ;;A+BjvGA;EASI,qB5B+KsE;E4B9KtE,gD5B9Qa;AH0/GjB;;A+BtvGA;EAcI,yB5B7Sc;AHyhHlB;;A+B1vGA;EAmBM,iB5BqUQ;AHs6Fd;;A+B9vGA;EAwBI,0BAA0B;A/B0uG9B;;A+BtuGA;EACE,kBAAkB;EAClB,MAAM;EACN,QAAQ;EACR,OAAO;EACP,UAAU;EACV,mC5BoK2H;E4BnK3H,yB5BoDkC;E4BlDlC,gB5BlD+B;E4BmD/B,gB5B9C+B;E4B+C/B,c5BjUgB;E4BkUhB,sB5BzUa;E4B0Ub,yB5BtUgB;EONd,sBPqOgC;AHg1GpC;;A+BtvGA;EAkBI,kBAAkB;EAClB,MAAM;EACN,QAAQ;EACR,SAAS;EACT,UAAU;EACV,cAAc;EACd,6B5B8I+F;E4B7I/F,yB5BkCgC;E4BjChC,gB5B9D6B;E4B+D7B,c5BjVc;E4BkVd,iBAAiB;ET1VjB,yBnBGc;E4ByVd,oBAAoB;ErB7VpB,kCqB8VgF;A/BwuGpF;;A+B9tGA;EACE,WAAW;EACX,2BAA+F;EAC/F,UAAU;EACV,6BAA6B;EAC7B,wBAAgB;EAAhB,qBAAgB;EAAhB,gBAAgB;A/BiuGlB;;A+BtuGA;EAQI,aAAa;A/BkuGjB;;A+B1uGA;EAY8B,gE5BrVb;AHujHjB;;A+B9uGA;EAa8B,gE5BtVb;AH2jHjB;;A+BlvGA;EAc8B,gE5BvVb;AH+jHjB;;A+BtvGA;EAkBI,SAAS;A/BwuGb;;A+B1vGA;EAsBI,W5B8N6C;E4B7N7C,Y5B6N6C;E4B5N7C,oBAAyE;ET/XzE,yBnB8Ba;E4BmWb,S5B6N0C;EO/lB1C,mBPgmB6C;EiB/lB3C,4GjB8f+H;E4BzHjI,wBAAgB;EAAhB,gBAAgB;A/BuuGpB;;AoBvmHI;EWkWJ;IXjWM,gBAAgB;EpB2mHpB;AACF;;A+B3wGA;ETvWI,yBnBmmB2E;AHmhG/E;;A+B/wGA;EAsCI,W5BuMoC;E4BtMpC,c5BuMqC;E4BtMrC,kBAAkB;EAClB,e5BsMuC;E4BrMvC,yB5B7Yc;E4B8Yd,yBAAyB;ErBnZzB,mBPylBoC;AHwiGxC;;A+BzxGA;EAiDI,W5BmM6C;E4BlM7C,Y5BkM6C;EmB3lB7C,yBnB8Ba;E4B6Xb,S5BmM0C;EO/lB1C,mBPgmB6C;EiB/lB3C,4GjB8f+H;E4B/FjI,qBAAgB;EAAhB,gBAAgB;A/B2uGpB;;AoBroHI;EWkWJ;IXjWM,gBAAgB;EpByoHpB;AACF;;A+BzyGA;ETvWI,yBnBmmB2E;AHijG/E;;A+B7yGA;EAgEI,W5B6KoC;E4B5KpC,c5B6KqC;E4B5KrC,kBAAkB;EAClB,e5B4KuC;E4B3KvC,yB5Bvac;E4Bwad,yBAAyB;ErB7azB,mBPylBoC;AHskGxC;;A+BvzGA;EA2EI,W5ByK6C;E4BxK7C,Y5BwK6C;E4BvK7C,aAAa;EACb,oB5BvD+B;E4BwD/B,mB5BxD+B;EmB9X/B,yBnB8Ba;E4B0Zb,S5BsK0C;EO/lB1C,mBPgmB6C;EiB/lB3C,4GjB8f+H;E4BlEjI,gBAAgB;A/B+uGpB;;AoBtqHI;EWkWJ;IXjWM,gBAAgB;EpB0qHpB;AACF;;A+B10GA;ETvWI,yBnBmmB2E;AHklG/E;;A+B90GA;EA6FI,W5BgJoC;E4B/IpC,c5BgJqC;E4B/IrC,kBAAkB;EAClB,e5B+IuC;E4B9IvC,6BAA6B;EAC7B,yBAAyB;EACzB,oBAA4C;A/BqvGhD;;A+Bx1GA;EAwGI,yB5B3cc;EOLd,mBPylBoC;AH4mGxC;;A+B71GA;EA6GI,kBAAkB;EAClB,yB5Bjdc;EOLd,mBPylBoC;AHknGxC;;A+Bn2GA;EAoHM,yB5BrdY;AHwsHlB;;A+Bv2GA;EAwHM,eAAe;A/BmvGrB;;A+B32GA;EA4HM,yB5B7dY;AHgtHlB;;A+B/2GA;EAgIM,eAAe;A/BmvGrB;;A+Bn3GA;EAoIM,yB5BreY;AHwtHlB;;A+B9uGA;;;EXhfM,4GjB8f+H;AHsuGrI;;AoB/tHI;EW2eJ;;;IX1eM,gBAAgB;EpBquHpB;AACF;;AgC7uHA;EACE,oBAAa;EAAb,aAAa;EACb,mBAAe;EAAf,eAAe;EACf,eAAe;EACf,gBAAgB;EAChB,gBAAgB;AhCgvHlB;;AgC7uHA;EACE,cAAc;EACd,oB7BkqBsC;AH8kGxC;;AK/uHE;E2BEE,qBAAqB;AhCivHzB;;AgCtvHA;EAUI,c7BVc;E6BWd,oBAAoB;EACpB,eAAe;AhCgvHnB;;AgCxuHA;EACE,gC7BxBgB;AHmwHlB;;AgC5uHA;EAII,mB7BkM6B;AH0iHjC;;AgChvHA;EAQI,6BAAgD;EtB3BhD,+BP4NgC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9BzMS;AH+lIf;;AiCh7HA;EA+BI,yB9B9MW;E8B+MX,gC9B/MW;AHomIf;;AiCr7HA;EAoCI,wP9B6fsR;AHw5G1R;;AiCz7HA;EAwCI,yB9BvNW;AH4mIf;;AiC77HA;EA0CM,yB9BzNS;AHgnIf;;AKjnIE;E4B6NM,yB9B5NO;AHonIf;;AiCj5HA;EAEI,W9B/OW;AHkoIf;;AKznIE;E4ByOI,W9BlPS;AHsoIf;;AiCz5HA;EAWM,+B9BxPS;AH0oIf;;AKjoIE;E4BkPM,gC9B3PO;AH8oIf;;AiCj6HA;EAkBQ,gC9B/PO;AHkpIf;;AiCr6HA;;;;EA0BM,W9BvQS;AHypIf;;AiC56HA;EA+BI,+B9B5QW;E8B6QX,sC9B7QW;AH8pIf;;AiCj7HA;EAoCI,8P9BkcqR;AH+8GzR;;AiCr7HA;EAwCI,+B9BrRW;AHsqIf;;AiCz7HA;EA0CM,W9BvRS;AH0qIf;;AKjqIE;E4BiRM,W9B1RO;AH8qIf;;AkCjrIA;EACE,kBAAkB;EAClB,oBAAa;EAAb,aAAa;EACb,0BAAsB;EAAtB,sBAAsB;EACtB,YAAY;EACZ,qBAAqB;EACrB,sB/BHa;E+BIb,2BAA2B;EAC3B,sC/BKa;EOZX,sBPqOgC;AHu9HpC;;AkC7rIA;EAYI,eAAe;EACf,cAAc;AlCqrIlB;;AkClsIA;ExBUI,+BP4NgC;EO3NhC,gCP2NgC;AHi+HpC;;AkCvsIA;ExBwBI,mCP8MgC;EO7MhC,kCP6MgC;AHs+HpC;;AkC/qIA;EAGE,kBAAc;EAAd,cAAc;EACd,gB/B+wByC;AHi6G3C;;AkC5qIA;EACE,sB/BywBwC;AHs6G1C;;AkC5qIA;EACE,qBAA+B;EAC/B,gBAAgB;AlC+qIlB;;AkC5qIA;EACE,gBAAgB;AlC+qIlB;;AKttIE;E6B4CE,qBAAqB;AlC8qIzB;;AkChrIA;EAMI,oB/BwvBuC;AHs7G3C;;AkCtqIA;EACE,wB/B+uByC;E+B9uBzC,gBAAgB;EAEhB,qC/BvDa;E+BwDb,6C/BxDa;AHguIf;;AkC7qIA;ExB/DI,0DwBuE8E;AlCyqIlF;;AkCjrIA;EAaM,aAAa;AlCwqInB;;AkCnqIA;EACE,wB/B6tByC;E+B5tBzC,qC/BvEa;E+BwEb,0C/BxEa;AH8uIf;;AkCzqIA;ExBjFI,0DPmzBoF;AH28GxF;;AkC9pIA;EACE,uBAAiC;EACjC,uB/B4sBwC;E+B3sBxC,sBAAgC;EAChC,gBAAgB;AlCiqIlB;;AkC9pIA;EACE,uBAAiC;EACjC,sBAAgC;AlCiqIlC;;AkC7pIA;EACE,kBAAkB;EAClB,MAAM;EACN,QAAQ;EACR,SAAS;EACT,OAAO;EACP,gB/BssByC;AH09G3C;;AkC7pIA;EACE,WAAW;ExBvHT,kCPmzBoF;AHq+GxF;;AkC5pIA;EACE,WAAW;ExBpHT,2CP0yBoF;EOzyBpF,4CPyyBoF;AH2+GxF;;AkC7pIA;EACE,WAAW;ExB3GT,+CP4xBoF;EO3xBpF,8CP2xBoF;AHi/GxF;;AkC3pIA;EACE,oBAAa;EAAb,aAAa;EACb,0BAAsB;EAAtB,sBAAsB;AlC8pIxB;;AkChqIA;EAKI,mB/B6qBsD;AHk/G1D;;ActvII;EoBkFJ;IASI,uBAAmB;IAAnB,mBAAmB;IACnB,mB/BwqBsD;I+BvqBtD,kB/BuqBsD;EHy/GxD;EkC3qIF;IAcM,oBAAa;IAAb,aAAa;IAEb,gBAAY;IAAZ,YAAY;IACZ,0BAAsB;IAAtB,sBAAsB;IACtB,kB/BgqBoD;I+B/pBpD,gBAAgB;IAChB,iB/B8pBoD;EHigHxD;AACF;;AkCtpIA;EACE,oBAAa;EAAb,aAAa;EACb,0BAAsB;EAAtB,sBAAsB;AlCypIxB;;AkC3pIA;EAOI,mB/B6oBsD;AH2gH1D;;Ac/wII;EoBgHJ;IAWI,uBAAmB;IAAnB,mBAAmB;ElCypIrB;EkCpqIF;IAgBM,gBAAY;IAAZ,YAAY;IACZ,gBAAgB;ElCupIpB;EkCxqIF;IAoBQ,cAAc;IACd,cAAc;ElCupIpB;EkC5qIF;IxBvJI,0BwBkLoC;IxBjLpC,6BwBiLoC;ElCqpItC;EkChrIF;;IAgCY,0BAA0B;ElCopIpC;EkCprIF;;IAqCY,6BAA6B;ElCmpIvC;EkCxrIF;IxBzII,yBwBmLmC;IxBlLnC,4BwBkLmC;ElCkpIrC;EkC5rIF;;IA+CY,yBAAyB;ElCipInC;EkChsIF;;IAoDY,4BAA4B;ElCgpItC;AACF;;AkCpoIA;EAEI,sB/BokBsC;AHkkH1C;;AczzII;EoBiLJ;IAMI,uB/BglBiC;I+BhlBjC,oB/BglBiC;I+BhlBjC,e/BglBiC;I+B/kBjC,2B/BglBuC;I+BhlBvC,wB/BglBuC;I+BhlBvC,mB/BglBuC;I+B/kBvC,UAAU;IACV,SAAS;ElCuoIX;EkChpIF;IAYM,qBAAqB;IACrB,WAAW;ElCuoIf;AACF;;AkC9nIA;EAEI,gBAAgB;AlCgoIpB;;AkCloIA;ExB/PI,gBwBqQ4B;AlCgoIhC;;AkCtoIA;EAUQ,gBAAgB;ExBzQpB,gBwB0Q4B;AlCgoIhC;;AkC3oIA;EAgBM,gBAAgB;ExBxPlB,6BwByPiC;ExBxPjC,4BwBwPiC;AlCgoIrC;;AkCjpIA;ExBtPI,yBwB2Q8B;ExB1Q9B,0BwB0Q8B;AlCioIlC;;AkCtpIA;EAyBM,mB/BtD2B;AHurIjC;;AmC95IA;EACE,oBAAa;EAAb,aAAa;EACb,mBAAe;EAAf,eAAe;EACf,qBhC2gCsC;EgC1gCtC,mBhC6gCsC;EgC5gCtC,gBAAgB;EAChB,yBhCGgB;EOJd,sBPqOgC;AH8rIpC;;AmC95IA;EAGI,oBhCkgCqC;AH65GzC;;AmCl6IA;EAMM,qBAAqB;EACrB,qBhC8/BmC;EgC7/BnC,chCLY;EgCMZ,YhCmgCuC;AH65G7C;;AmCz6IA;EAoBI,0BAA0B;AnCy5I9B;;AmC76IA;EAwBI,qBAAqB;AnCy5IzB;;AmCj7IA;EA4BI,chCzBc;AHk7IlB;;AoC/7IA;EACE,oBAAa;EAAb,aAAa;E7BGb,eAAe;EACf,gBAAgB;EGAd,sBPqOgC;AH4tIpC;;AoCh8IA;EACE,kBAAkB;EAClB,cAAc;EACd,uBjCqwBwC;EiCpwBxC,iBjC6N+B;EiC5N/B,iBjCwwBsC;EiCvwBtC,cjCwBe;EiCvBf,sBjCNa;EiCOb,yBjCJgB;AHu8IlB;;AoC38IA;EAWI,UAAU;EACV,cjC2J8D;EiC1J9D,qBAAqB;EACrB,yBjCXc;EiCYd,qBjCXc;AH+8IlB;;AoCn9IA;EAmBI,UAAU;EACV,UjCiwBiC;EiChwBjC,gDjCSa;AH27IjB;;AoCh8IA;EAGM,cAAc;E1BChB,+BPuMgC;EOtMhC,kCPsMgC;AH2vIpC;;AoCt8IA;E1BVI,gCPqNgC;EOpNhC,mCPoNgC;AHgwIpC;;AoC38IA;EAcI,UAAU;EACV,WjCvCW;EiCwCX,yBjCXa;EiCYb,qBjCZa;AH68IjB;;AoCl9IA;EAqBI,cjCvCc;EiCwCd,oBAAoB;EAEpB,YAAY;EACZ,sBjCjDW;EiCkDX,qBjC/Cc;AH++IlB;;AqCt/IE;EACE,uBlC8wBsC;ECnpBpC,kBAtCY;EiCnFd,gBlC8N6B;AH2xIjC;;AqCp/IM;E3BwBF,8BPwM+B;EOvM/B,iCPuM+B;AHyxInC;;AqCp/IM;E3BKF,+BPsN+B;EOrN/B,kCPqN+B;AH8xInC;;AqCtgJE;EACE,uBlC4wBqC;ECjpBnC,mBAtCY;EiCnFd,gBlC+N6B;AH0yIjC;;AqCpgJM;E3BwBF,8BPyM+B;EOxM/B,iCPwM+B;AHwyInC;;AqCpgJM;E3BKF,+BPuN+B;EOtN/B,kCPsN+B;AH6yInC;;AsCphJA;EACE,qBAAqB;EACrB,qBnC24BsC;EC10BpC,cAAW;EkC/Db,gBnCmR+B;EmClR/B,cAAc;EACd,kBAAkB;EAClB,mBAAmB;EACnB,wBAAwB;E5BRtB,sBPqOgC;EiBpO9B,qIjBqb6I;AH2mInJ;;AoB3hJI;EkBNJ;IlBOM,gBAAgB;EpB+hJpB;AACF;;AK5hJE;EiCGI,qBAAqB;AtC6hJ3B;;AsC3iJA;EAoBI,aAAa;AtC2hJjB;;AsCthJA;EACE,kBAAkB;EAClB,SAAS;AtCyhJX;;AsClhJA;EACE,oBnCg3BsC;EmC/2BtC,mBnC+2BsC;EOn5BpC,oBPs5BqC;AHoqHzC;;AsC7gJE;ECjDA,WpCMa;EoCLb,yBpCkCe;AHgiJjB;;AKpjJE;EkCVI,WpCCS;EoCAT,yBAAkC;AvCkkJxC;;AuCrkJU;EAQJ,UAAU;EACV,+CpCuBW;AH0iJjB;;AsC5hJE;ECjDA,WpCMa;EoCLb,yBpCWgB;AHskJlB;;AKnkJE;EkCVI,WpCCS;EoCAT,yBAAkC;AvCilJxC;;AuCplJU;EAQJ,UAAU;EACV,iDpCAY;AHglJlB;;AsC3iJE;ECjDA,WpCMa;EoCLb,yBpCyCe;AHujJjB;;AKllJE;EkCVI,WpCCS;EoCAT,yBAAkC;AvCgmJxC;;AuCnmJU;EAQJ,UAAU;EACV,+CpC8BW;AHikJjB;;AsC1jJE;ECjDA,WpCMa;EoCLb,yBpC2Ce;AHokJjB;;AKjmJE;EkCVI,WpCCS;EoCAT,yBAAkC;AvC+mJxC;;AuClnJU;EAQJ,UAAU;EACV,gDpCgCW;AH8kJjB;;AsCzkJE;ECjDA,cpCegB;EoCdhB,yBpCwCe;AHslJjB;;AKhnJE;EkCVI,cpCUY;EoCTZ,yBAAkC;AvC8nJxC;;AuCjoJU;EAQJ,UAAU;EACV,+CpC6BW;AHgmJjB;;AsCxlJE;ECjDA,WpCMa;EoCLb,yBpCsCe;AHumJjB;;AK/nJE;EkCVI,WpCCS;EoCAT,yBAAkC;AvC6oJxC;;AuChpJU;EAQJ,UAAU;EACV,+CpC2BW;AHinJjB;;AsCvmJE;ECjDA,cpCegB;EoCdhB,yBpCMgB;AHspJlB;;AK9oJE;EkCVI,cpCUY;EoCTZ,yBAAkC;AvC4pJxC;;AuC/pJU;EAQJ,UAAU;EACV,iDpCLY;AHgqJlB;;AsCtnJE;ECjDA,WpCMa;EoCLb,yBpCagB;AH8pJlB;;AK7pJE;EkCVI,WpCCS;EoCAT,yBAAkC;AvC2qJxC;;AuC9qJU;EAQJ,UAAU;EACV,8CpCEY;AHwqJlB;;AwCvrJA;EACE,kBAAoD;EACpD,mBrC0yBsC;EqCxyBtC,yBrCKgB;EOJd,qBPsO+B;AHm9InC;;AcloJI;E0B5DJ;IAQI,kBrCoyBoC;EHu5HtC;AACF;;AwCxrJA;EACE,gBAAgB;EAChB,eAAe;E9BTb,gB8BUsB;AxC2rJ1B;;AyCtsJA;EACE,kBAAkB;EAClB,wBtCm8ByC;EsCl8BzC,mBtCm8BsC;EsCl8BtC,6BAA6C;E/BH3C,sBPqOgC;AHw+IpC;;AyCrsJA;EAEE,cAAc;AzCusJhB;;AyCnsJA;EACE,gBtCwQ+B;AH87IjC;;AyC9rJA;EACE,mBAAsD;AzCisJxD;;AyClsJA;EAKI,kBAAkB;EAClB,MAAM;EACN,QAAQ;EACR,wBtCq6BuC;EsCp6BvC,cAAc;AzCisJlB;;AyCvrJE;EC9CA,cxBmFgE;EI9E9D,yBJ8E8D;EwBjFhE,qBxBiFgE;AlBwpJlE;;A0CvuJE;EACE,yBAAqC;A1C0uJzC;;A0CvuJE;EACE,cAA0B;A1C0uJ9B;;AyCrsJE;EC9CA,cxBmFgE;EI9E9D,yBJ8E8D;EwBjFhE,qBxBiFgE;AlBsqJlE;;A0CrvJE;EACE,yBAAqC;A1CwvJzC;;A0CrvJE;EACE,cAA0B;A1CwvJ9B;;AyCntJE;EC9CA,cxBmFgE;EI9E9D,yBJ8E8D;EwBjFhE,qBxBiFgE;AlBorJlE;;A0CnwJE;EACE,yBAAqC;A1CswJzC;;A0CnwJE;EACE,cAA0B;A1CswJ9B;;AyCjuJE;EC9CA,cxBmFgE;EI9E9D,yBJ8E8D;EwBjFhE,qBxBiFgE;AlBksJlE;;A0CjxJE;EACE,yBAAqC;A1CoxJzC;;A0CjxJE;EACE,cAA0B;A1CoxJ9B;;AyC/uJE;EC9CA,cxBmFgE;EI9E9D,yBJ8E8D;EwBjFhE,qBxBiFgE;AlBgtJlE;;A0C/xJE;EACE,yBAAqC;A1CkyJzC;;A0C/xJE;EACE,cAA0B;A1CkyJ9B;;AyC7vJE;EC9CA,cxBmFgE;EI9E9D,yBJ8E8D;EwBjFhE,qBxBiFgE;AlB8tJlE;;A0C7yJE;EACE,yBAAqC;A1CgzJzC;;A0C7yJE;EACE,cAA0B;A1CgzJ9B;;AyC3wJE;EC9CA,cxBmFgE;EI9E9D,yBJ8E8D;EwBjFhE,qBxBiFgE;AlB4uJlE;;A0C3zJE;EACE,yBAAqC;A1C8zJzC;;A0C3zJE;EACE,cAA0B;A1C8zJ9B;;AyCzxJE;EC9CA,cxBmFgE;EI9E9D,yBJ8E8D;EwBjFhE,qBxBiFgE;AlB0vJlE;;A0Cz0JE;EACE,yBAAqC;A1C40JzC;;A0Cz0JE;EACE,cAA0B;A1C40J9B;;A2Cp1JE;EACE;IAAO,2BAAuC;E3Cw1JhD;E2Cv1JE;IAAK,wBAAwB;E3C01J/B;AACF;;A2C71JE;EACE;IAAO,2BAAuC;E3Cw1JhD;E2Cv1JE;IAAK,wBAAwB;E3C01J/B;AACF;;A2Cv1JA;EACE,oBAAa;EAAb,aAAa;EACb,YxC48BsC;EwC38BtC,gBAAgB;EvCoHZ,kBAtCY;EuC5EhB,yBxCJgB;EOJd,sBPqOgC;AH8nJpC;;A2Ct1JA;EACE,oBAAa;EAAb,aAAa;EACb,0BAAsB;EAAtB,sBAAsB;EACtB,qBAAuB;EAAvB,uBAAuB;EACvB,WxCfa;EwCgBb,kBAAkB;EAClB,mBAAmB;EACnB,yBxCWe;EiB9BX,2BjBw9B4C;AHq5HlD;;AoBx2JI;EuBOJ;IvBNM,gBAAgB;EpB42JpB;AACF;;A2C51JA;ErBcE,qMAA6I;EqBZ7I,0BxCu7BsC;AHw6HxC;;A2C31JE;EACE,0DxCy7BkD;EwCz7BlD,kDxCy7BkD;AHq6HtD;;A2C51JI;EAHF;IAII,uBAAe;IAAf,eAAe;E3Cg2JnB;AACF;;A4Cx4JA;EACE,oBAAa;EAAb,aAAa;EACb,qBAAuB;EAAvB,uBAAuB;A5C24JzB;;A4Cx4JA;EACE,WAAO;EAAP,OAAO;A5C24JT;;A6C74JA;EACE,oBAAa;EAAb,aAAa;EACb,0BAAsB;EAAtB,sBAAsB;EAGtB,eAAe;EACf,gBAAgB;A7C84JlB;;A6Cr4JA;EACE,WAAW;EACX,c1CPgB;E0CQhB,mBAAmB;A7Cw4JrB;;AK94JE;EwCUE,UAAU;EACV,c1Cbc;E0Ccd,qBAAqB;EACrB,yB1CrBc;AH65JlB;;A6Cl5JA;EAcI,c1CjBc;E0CkBd,yB1CzBc;AHi6JlB;;A6C/3JA;EACE,kBAAkB;EAClB,cAAc;EACd,wB1C47ByC;E0C17BzC,mB1CuL+B;E0CrL/B,sB1C3Ca;E0C4Cb,sC1ClCa;AHk6Jf;;A6Cx4JA;EnC7BI,+BP4NgC;EO3NhC,gCP2NgC;AH8sJpC;;A6C74JA;EAeI,gBAAgB;EnC9BhB,mCP8MgC;EO7MhC,kCP6MgC;AHotJpC;;A6Cn5JA;EAqBI,c1CnDc;E0CoDd,oBAAoB;EACpB,sB1C3DW;AH67Jf;;A6Cz5JA;EA4BI,UAAU;EACV,W1CjEW;E0CkEX,yB1CrCa;E0CsCb,qB1CtCa;AHu6JjB;;A6Cp3JI;EACE,uBAAmB;EAAnB,mBAAmB;A7Cu3JzB;;A6Cx3JI;EAII,kB1C4IyB;E0C3IzB,gBAAgB;A7Cw3JxB;;A6C73JI;EnCpDA,+BPuMgC;EOtMhC,kCPsMgC;EO1LhC,0BmCgDwC;A7C03J5C;;A6Cn4JI;EAaM,eAAe;EnC/ErB,gCPqNgC;EOpNhC,mCPoNgC;EO9KhC,4BmC0C0C;A7C23J9C;;Acr6JI;E+B2BA;IACE,uBAAmB;IAAnB,mBAAmB;E7C84JvB;E6C/4JE;IAII,kB1C4IyB;I0C3IzB,gBAAgB;E7C84JtB;E6Cn5JE;InCpDA,+BPuMgC;IOtMhC,kCPsMgC;IO1LhC,0BmCgDwC;E7C+4J1C;E6Cx5JE;IAaM,eAAe;InC/ErB,gCPqNgC;IOpNhC,mCPoNgC;IO9KhC,4BmC0C0C;E7C+4J5C;AACF;;Ac17JI;E+B2BA;IACE,uBAAmB;IAAnB,mBAAmB;E7Cm6JvB;E6Cp6JE;IAII,kB1C4IyB;I0C3IzB,gBAAgB;E7Cm6JtB;E6Cx6JE;InCpDA,+BPuMgC;IOtMhC,kCPsMgC;IO1LhC,0BmCgDwC;E7Co6J1C;E6C76JE;IAaM,eAAe;InC/ErB,gCPqNgC;IOpNhC,mCPoNgC;IO9KhC,4BmC0C0C;E7Co6J5C;AACF;;Ac/8JI;E+B2BA;IACE,uBAAmB;IAAnB,mBAAmB;E7Cw7JvB;E6Cz7JE;IAII,kB1C4IyB;I0C3IzB,gBAAgB;E7Cw7JtB;E6C77JE;InCpDA,+BPuMgC;IOtMhC,kCPsMgC;IO1LhC,0BmCgDwC;E7Cy7J1C;E6Cl8JE;IAaM,eAAe;InC/ErB,gCPqNgC;IOpNhC,mCPoNgC;IO9KhC,4BmC0C0C;E7Cy7J5C;AACF;;Acp+JI;E+B2BA;IACE,uBAAmB;IAAnB,mBAAmB;E7C68JvB;E6C98JE;IAII,kB1C4IyB;I0C3IzB,gBAAgB;E7C68JtB;E6Cl9JE;InCpDA,+BPuMgC;IOtMhC,kCPsMgC;IO1LhC,0BmCgDwC;E7C88J1C;E6Cv9JE;IAaM,eAAe;InC/ErB,gCPqNgC;IOpNhC,mCPoNgC;IO9KhC,4BmC0C0C;E7C88J5C;AACF;;A6Cl8JA;EAEI,eAAe;EACf,cAAc;EnCjHd,gBmCkHwB;A7Co8J5B;;A6Cx8JA;EAOM,mB1C6G2B;AHw1JjC;;A6C58JA;EAaM,aAAa;A7Cm8JnB;;A6Ch9JA;EAmBM,gBAAgB;EAChB,gBAAgB;A7Ci8JtB;;A8CrkKE;EACE,c5BgF8D;E4B/E9D,yB5B+E8D;AlBy/JlE;;AK7jKE;EyCPM,c5B2E0D;E4B1E1D,yBAAyC;A9CwkKjD;;A8C/kKE;EAWM,W3CPO;E2CQP,yB5BqE0D;E4BpE1D,qB5BoE0D;AlBogKlE;;A8CrlKE;EACE,c5BgF8D;E4B/E9D,yB5B+E8D;AlBygKlE;;AK7kKE;EyCPM,c5B2E0D;E4B1E1D,yBAAyC;A9CwlKjD;;A8C/lKE;EAWM,W3CPO;E2CQP,yB5BqE0D;E4BpE1D,qB5BoE0D;AlBohKlE;;A8CrmKE;EACE,c5BgF8D;E4B/E9D,yB5B+E8D;AlByhKlE;;AK7lKE;EyCPM,c5B2E0D;E4B1E1D,yBAAyC;A9CwmKjD;;A8C/mKE;EAWM,W3CPO;E2CQP,yB5BqE0D;E4BpE1D,qB5BoE0D;AlBoiKlE;;A8CrnKE;EACE,c5BgF8D;E4B/E9D,yB5B+E8D;AlByiKlE;;AK7mKE;EyCPM,c5B2E0D;E4B1E1D,yBAAyC;A9CwnKjD;;A8C/nKE;EAWM,W3CPO;E2CQP,yB5BqE0D;E4BpE1D,qB5BoE0D;AlBojKlE;;A8CroKE;EACE,c5BgF8D;E4B/E9D,yB5B+E8D;AlByjKlE;;AK7nKE;EyCPM,c5B2E0D;E4B1E1D,yBAAyC;A9CwoKjD;;A8C/oKE;EAWM,W3CPO;E2CQP,yB5BqE0D;E4BpE1D,qB5BoE0D;AlBokKlE;;A8CrpKE;EACE,c5BgF8D;E4B/E9D,yB5B+E8D;AlBykKlE;;AK7oKE;EyCPM,c5B2E0D;E4B1E1D,yBAAyC;A9CwpKjD;;A8C/pKE;EAWM,W3CPO;E2CQP,yB5BqE0D;E4BpE1D,qB5BoE0D;AlBolKlE;;A8CrqKE;EACE,c5BgF8D;E4B/E9D,yB5B+E8D;AlBylKlE;;AK7pKE;EyCPM,c5B2E0D;E4B1E1D,yBAAyC;A9CwqKjD;;A8C/qKE;EAWM,W3CPO;E2CQP,yB5BqE0D;E4BpE1D,qB5BoE0D;AlBomKlE;;A8CrrKE;EACE,c5BgF8D;E4B/E9D,yB5B+E8D;AlBymKlE;;AK7qKE;EyCPM,c5B2E0D;E4B1E1D,yBAAyC;A9CwrKjD;;A8C/rKE;EAWM,W3CPO;E2CQP,yB5BqE0D;E4BpE1D,qB5BoE0D;AlBonKlE;;A+CxsKA;EACE,YAAY;E3C8HR,iBAtCY;E2CtFhB,gB5CyR+B;E4CxR/B,cAAc;EACd,W5CYa;E4CXb,yB5CCa;E4CAb,WAAW;A/C2sKb;;AKtsKE;E0CDE,W5CMW;E4CLX,qBAAqB;A/C2sKzB;;AKvsKE;E0CCI,YAAY;A/C0sKlB;;A+C/rKA;EACE,UAAU;EACV,6BAA6B;EAC7B,SAAS;EACT,wBAAgB;EAAhB,qBAAgB;EAAhB,gBAAgB;A/CksKlB;;A+C5rKA;EACE,oBAAoB;A/C+rKtB;;AgDtuKA;EACE,gB7C43BuC;E6C33BvC,gBAAgB;E5C6HZ,mBAtCY;E4CpFhB,2C7CEa;E6CDb,4BAA4B;EAC5B,oC7C63BmD;E6C53BnD,gD7CSa;E6CRb,mCAA2B;EAA3B,2BAA2B;EAC3B,UAAU;EtCLR,sBPg4BsC;AH82I1C;;AgDnvKA;EAcI,sB7Cg3BsC;AHy3I1C;;AgDvvKA;EAkBI,UAAU;AhDyuKd;;AgD3vKA;EAsBI,cAAc;EACd,UAAU;AhDyuKd;;AgDhwKA;EA2BI,aAAa;AhDyuKjB;;AgDruKA;EACE,oBAAa;EAAb,aAAa;EACb,sBAAmB;EAAnB,mBAAmB;EACnB,wB7C41BwC;E6C31BxC,c7CtBgB;E6CuBhB,2C7C7Ba;E6C8Bb,4BAA4B;EAC5B,4C7Co2BoD;AHo4ItD;;AgDruKA;EACE,gB7Co1BwC;AHo5I1C;;AiD5wKA;EAEE,gBAAgB;AjD8wKlB;;AiDhxKA;EAKI,kBAAkB;EAClB,gBAAgB;AjD+wKpB;;AiD1wKA;EACE,eAAe;EACf,MAAM;EACN,OAAO;EACP,a9CopBsC;E8CnpBtC,aAAa;EACb,WAAW;EACX,YAAY;EACZ,gBAAgB;EAGhB,UAAU;AjD2wKZ;;AiDpwKA;EACE,kBAAkB;EAClB,WAAW;EACX,c9C63BuC;E8C33BvC,oBAAoB;AjDswKtB;;AiDnwKE;E7BrCI,2CjB27BoD;EiB37BpD,mCjB27BoD;EiB37BpD,oEjB27BoD;E8Cp5BtD,sC9Ck5BmD;E8Cl5BnD,8B9Ck5BmD;AHo3IvD;;AoBxyKI;E6BgCF;I7B/BI,gBAAgB;EpB4yKpB;AACF;;AiD1wKE;EACE,uB9Cg5BoC;E8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hLf;;AkD3+KA;EACE,iBAAgC;AlD8+KlC;;AkD/+KA;EAII,MAAM;AlD++KV;;AkDn/KA;EAOM,SAAS;EACT,6B/CgxBmC;E+C/wBnC,yB/CrDS;AHqiLf;;AkD3+KA;EACE,iB/CywBuC;AHquJzC;;AkD/+KA;EAII,QAAQ;EACR,a/CqwBqC;E+CpwBrC,c/CmwBqC;AH4uJzC;;AkDr/KA;EASM,OAAO;EACP,oC/CgwBmC;E+C/vBnC,uB/CrES;AHqjLf;;AkD39KA;EACE,gB/C+tBuC;E+C9tBvC,uB/CouBuC;E+CnuBvC,W/CvGa;E+CwGb,kBAAkB;EAClB,sB/C/Fa;EOZX,sBPqOgC;AHq2KpC;;AoD/kLA;EACE,kBAAkB;EAClB,MAAM;EACN,OAAO;EACP,ajDsqBsC;EiDrqBtC,cAAc;EACd,gBjD+1BuC;EgDp2BvC,kMhD+QiN;EgD7QjN,kBAAkB;EAClB,gBhDuR+B;EgDtR/B,gBhD2R+B;EgD1R/B,gBAAgB;EAChB,iBAAiB;EACjB,qBAAqB;EACrB,iBAAiB;EACjB,oBAAoB;EACpB,sBAAsB;EACtB,kBAAkB;EAClB,oBAAoB;EACpB,mBAAmB;EACnB,gBAAgB;E/CgHZ,mBAtCY;EgD7EhB,qBAAqB;EACrB,sBjDNa;EiDOb,4BAA4B;EAC5B,oCjDEa;EOZX,qBPsO+B;AHi4KnC;;AoD5mLA;EAoBI,kBAAkB;EAClB,cAAc;EACd,WjD81BoC;EiD71BpC,cjD81BqC;EiD71BrC,gBjDmN+B;AHy4KnC;;AoDpnLA;EA4BM,kBAAkB;EAClB,cAAc;EACd,WAAW;EACX,yBAAyB;EACzB,mBAAmB;ApD4lLzB;;AoDvlLA;EACE,qBjD+0BuC;AH2wJzC;;AoD3lLA;EAII,iCAAwE;ApD2lL5E;;AoD/lLA;EAOM,SAAS;EACT,6BAAgE;EAChE,qCjD00BiE;AHkxJvE;;AoDrmLA;EAaM,WjDqL2B;EiDpL3B,6BAAgE;EAChE,sBjD7CS;AHyoLf;;AoDvlLA;EACE,mBjD2zBuC;AH+xJzC;;AoD3lLA;EAII,+BAAsE;EACtE,ajDuzBqC;EiDtzBrC,YjDqzBoC;EiDpzBpC,gBAA2B;ApD2lL/B;;AoDlmLA;EAUM,OAAO;EACP,oCAA2F;EAC3F,uCjDmzBiE;AHyyJvE;;AoDxmLA;EAgBM,SjD8J2B;EiD7J3B,oCAA2F;EAC3F,wBjDpES;AHgqLf;;AoDvlLA;EACE,kBjDoyBuC;AHszJzC;;AoD3lLA;EAII,8BAAqE;ApD2lLzE;;AoD/lLA;EAOM,MAAM;EACN,oCAA2F;EAC3F,wCjD+xBiE;AH6zJvE;;AoDrmLA;EAaM,QjD0I2B;EiDzI3B,oCAA2F;EAC3F,yBjDxFS;AHorLf;;AoD3mLA;EAqBI,kBAAkB;EAClB,MAAM;EACN,SAAS;EACT,cAAc;EACd,WjD2wBoC;EiD1wBpC,oBAAsC;EACtC,WAAW;EACX,gCjD+vBuD;AH21J3D;;AoDtlLA;EACE,oBjDowBuC;AHq1JzC;;AoD1lLA;EAII,gCAAuE;EACvE,ajDgwBqC;EiD/vBrC,YjD8vBoC;EiD7vBpC,gBAA2B;ApD0lL/B;;AoDjmLA;EAUM,QAAQ;EACR,oCjD0vBmC;EiDzvBnC,sCjD4vBiE;AH+1JvE;;AoDvmLA;EAgBM,UjDuG2B;EiDtG3B,oCjDovBmC;EiDnvBnC,uBjD3HS;AHstLf;;AoDrkLA;EACE,uBjDqtBwC;EiDptBxC,gBAAgB;EhD3BZ,eAtCY;EgDoEhB,yBjD8sByD;EiD7sBzD,gCAAyE;E1ChJvE,0C0CiJyE;E1ChJzE,2C0CgJyE;ApDwkL7E;;AoD/kLA;EAWI,aAAa;ApDwkLjB;;AoDpkLA;EACE,uBjDssBwC;EiDrsBxC,cjDzJgB;AHguLlB;;AqDnuLA;EACE,kBAAkB;ArDsuLpB;;AqDnuLA;EACE,uBAAmB;EAAnB,mBAAmB;ArDsuLrB;;AqDnuLA;EACE,kBAAkB;EAClB,WAAW;EACX,gBAAgB;ArDsuLlB;;AsD7vLE;EACE,cAAc;EACd,WAAW;EACX,WAAW;AtDgwLf;;AqDxuLA;EACE,kBAAkB;EAClB,aAAa;EACb,WAAW;EACX,WAAW;EACX,mBAAmB;EACnB,mCAA2B;EAA3B,2BAA2B;EjC5BvB,8CjB6iCkF;EiB7iClF,sCjB6iCkF;EiB7iClF,0EjB6iCkF;AH2tJxF;;AoBnwLI;EiCiBJ;IjChBM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E,oCAAmC;AzD4/LvC;;AKl/LE;;;EoDLI,oCAAgD;AzD6/LtD;;AyDngME;EACE,oCAAmC;AzDsgMvC;;AK5/LE;;;EoDLI,oCAAgD;AzDugMtD;;AyD7gME;EACE,oCAAmC;AzDghMvC;;AKtgME;;;EoDLI,oCAAgD;AzDihMtD;;AyDvhME;EACE,oCAAmC;AzD0hMvC;;AKhhME;;;EoDLI,oCAAgD;AzD2hMtD;;AyDjiME;EACE,oCAAmC;AzDoiMvC;;AK1hME;;;EoDLI,oCAAgD;AzDqiMtD;;AyD3iME;EACE,oCAAmC;AzD8iMvC;;AKpiME;;;EoDLI,oCAAgD;AzD+iMtD;;AyDrjME;EACE,oCAAmC;AzDwjMvC;;AK9iME;;;EoDLI,oCAAgD;AzDyjMtD;;A0DxjMA;EACE,iCAAmC;A1D2jMrC;;A0DxjMA;EACE,wCAAwC;A1D2jM1C;;A2DtkMA;EAAkB,oCAAoD;A3D0kMtE;;A2DzkMA;EAAkB,wCAAwD;A3D6kM1E;;A2D5kMA;EAAkB,0CAA0D;A3DglM5E;;A2D/kMA;EAAkB,2CAA2D;A3DmlM7E;;A2DllMA;EAAkB,yCAAyD;A3DslM3E;;A2DplMA;EAAmB,oBAAoB;A3DwlMvC;;A2DvlMA;EAAmB,wBAAwB;A3D2lM3C;;A2D1lMA;EAAmB,0BAA0B;A3D8lM7C;;A2D7lMA;EAAmB,2BAA2B;A3DimM9C;;A2DhmMA;EAAmB,yBAAyB;A3DomM5C;;A2DjmME;EACE,gCAA+B;A3DomMnC;;A2DrmME;EACE,gCAA+B;A3DwmMnC;;A2DzmME;EACE,gCAA+B;A3D4mMnC;;A2D7mME;EACE,gCAA+B;A3DgnMnC;;A2DjnME;EACE,gCAA+B;A3DonMnC;;A2DrnME;EACE,gCAA+B;A3DwnMnC;;A2DznME;EACE,gCAA+B;A3D4nMnC;;A2D7nME;EACE,gCAA+B;A3DgoMnC;;A2D5nMA;EACE,6BAA+B;A3D+nMjC;;A2DxnMA;EACE,gCAA2C;A3D2nM7C;;A2DxnMA;EACE,iCAAwC;A3D2nM1C;;A2DxnMA;EACE,0CAAiD;EACjD,2CAAkD;A3D2nMpD;;A2DxnMA;EACE,2CAAkD;EAClD,8CAAqD;A3D2nMvD;;A2DxnMA;EACE,8CAAqD;EACrD,6CAAoD;A3D2nMtD;;A2DxnMA;EACE,0CAAiD;EACjD,6CAAoD;A3D2nMtD;;A2DxnMA;EACE,gCAA2C;A3D2nM7C;;A2DxnMA;EACE,6BAA6B;A3D2nM/B;;A2DxnMA;EACE,+BAAuC;A3D2nMzC;;A2DxnMA;EACE,2BAA2B;A3D2nM7B;;AsDnsME;EACE,cAAc;EACd,WAAW;EACX,WAAW;AtDssMf;;A4D/rMM;EAAwB,wBAA0B;A5DmsMxD;;A4DnsMM;EAAwB,0BAA0B;A5DusMxD;;A4DvsMM;EAAwB,gCAA0B;A5D2sMxD;;A4D3sMM;EAAwB,yBAA0B;A5D+sMxD;;A4D/sMM;EAAwB,yBAA0B;A5DmtMxD;;A4DntMM;EAAwB,6BAA0B;A5DutMxD;;A4DvtMM;EAAwB,8BAA0B;A5D2tMxD;;A4D3tMM;EAAwB,+BAA0B;EAA1B,wBAA0B;A5D+tMxD;;A4D/tMM;EAAwB,sCAA0B;EAA1B,+BAA0B;A5DmuMxD;;AclrMI;E8CjDE;IAAwB,wBAA0B;E5DwuMtD;E4DxuMI;IAAwB,0BAA0B;E5D2uMtD;E4D3uMI;IAAwB,gCAA0B;E5D8uMtD;E4D9uMI;IAAwB,yBAA0B;E5DivMtD;E4DjvMI;IAAwB,yBAA0B;E5DovMtD;E4DpvMI;IAAwB,6BAA0B;E5DuvMtD;E4DvvMI;IAAwB,8BAA0B;E5D0vMtD;E4D1vMI;IAAwB,+BAA0B;IAA1B,wBAA0B;E5D6vMtD;E4D7vMI;IAAwB,sCAA0B;IAA1B,+BAA0B;E5DgwMtD;AACF;;AchtMI;E8CjDE;IAAwB,wBAA0B;E5DswMtD;E4DtwMI;IAAwB,0BAA0B;E5DywMtD;E4DzwMI;IAAwB,gCAA0B;E5D4wMtD;E4D5wMI;IAAwB,yBAA0B;E5D+wMtD;E4D/wMI;IAAwB,yBAA0B;E5DkxMtD;E4DlxMI;IAAwB,6BAA0B;E5DqxMtD;E4DrxMI;IAAwB,8BAA0B;E5DwxMtD;E4DxxMI;IAAwB,+BAA0B;IAA1B,wBAA0B;E5D2xMtD;E4D3xMI;IAAwB,sCAA0B;IAA1B,+BAA0B;E5D8xMtD;AACF;;Ac9uMI;E8CjDE;IAAwB,wBAA0B;E5DoyMtD;E4DpyMI;IAAwB,0BAA0B;E5DuyMtD;E4DvyMI;IAAwB,gCAA0B;E5D0yMtD;E4D1yMI;IAAwB,yBAA0B;E5D6yMtD;E4D7yMI;IAAwB,yBAA0B;E5DgzMtD;E4DhzMI;IAAwB,6BAA0B;E5DmzMtD;E4DnzMI;IAAwB,8BAA0B;E5DszMtD;E4DtzMI;IAAwB,+BAA0B;IAA1B,wBAA0B;E5DyzMtD;E4DzzMI;IAAwB,sCAA0B;IAA1B,+BAA0B;E5D4zMtD;AACF;;Ac5wMI;E8CjDE;IAAwB,wBAA0B;E5Dk0MtD;E4Dl0MI;IAAwB,0BAA0B;E5Dq0MtD;E4Dr0MI;IAAwB,gCAA0B;E5Dw0MtD;E4Dx0MI;IAAwB,yBAA0B;E5D20MtD;E4D30MI;IAAwB,yBAA0B;E5D80MtD;E4D90MI;IAAwB,6BAA0B;E5Di1MtD;E4Dj1MI;IAAwB,8BAA0B;E5Do1MtD;E4Dp1MI;IAAwB,+BAA0B;IAA1B,wBAA0B;E5Du1MtD;E4Dv1MI;IAAwB,sCAA0B;IAA1B,+BAA0B;E5D01MtD;AACF;;A4Dj1MA;EAEI;IAAqB,wBAA0B;E5Do1MjD;E4Dp1ME;IAAqB,0BAA0B;E5Du1MjD;E4Dv1ME;IAAqB,gCAA0B;E5D01MjD;E4D11ME;IAAqB,yBAA0B;E5D61MjD;E4D71ME;IAAqB,yBAA0B;E5Dg2MjD;E4Dh2ME;IAAqB,6BAA0B;E5Dm2MjD;E4Dn2ME;IAAqB,8BAA0B;E5Ds2MjD;E4Dt2ME;IAAqB,+BAA0B;IAA1B,wBAA0B;E5Dy2MjD;E4Dz2ME;IAAqB,sCAA0B;IAA1B,+BAA0B;E5D42MjD;AACF;;A6Dl4MA;EACE,kBAAkB;EAClB,cAAc;EACd,WAAW;EACX,UAAU;EACV,gBAAgB;A7Dq4MlB;;A6D14MA;EAQI,cAAc;EACd,WAAW;A7Ds4Mf;;A6D/4MA;;;;;EAiBI,kBAAkB;EAClB,MAAM;EACN,SAAS;EACT,OAAO;EACP,WAAW;EACX,YAAY;EACZ,SAAS;A7Ds4Mb;;A6D93ME;EAEI,uBAA4F;A7Dg4MlG;;A6Dl4ME;EAEI,mBAA4F;A7Do4MlG;;A6Dt4ME;EAEI,gBAA4F;A7Dw4MlG;;A6D14ME;EAEI,iBAA4F;A7D44MlG;;A8Dr6MI;EAAgC,kCAA8B;EAA9B,8BAA8B;A9Dy6MlE;;A8Dx6MI;EAAgC,qCAAiC;EAAjC,iCAAiC;A9D46MrE;;A8D36MI;EAAgC,0CAAsC;EAAtC,sCAAsC;A9D+6M1E;;A8D96MI;EAAgC,6CAAyC;EAAzC,yCAAyC;A9Dk7M7E;;A8Dh7MI;EAA8B,8BAA0B;EAA1B,0BAA0B;A9Do7M5D;;A8Dn7MI;EAA8B,gCAA4B;EAA5B,4BAA4B;A9Du7M9D;;A8Dt7MI;EAA8B,sCAAkC;EAAlC,kCAAkC;A9D07MpE;;A8Dz7MI;EAA8B,6BAAyB;EAAzB,yBAAyB;A9D67M3D;;A8D57MI;EAA8B,+BAAuB;EAAvB,uBAAuB;A9Dg8MzD;;A8D/7MI;EAA8B,+BAAuB;EAAvB,uBAAuB;A9Dm8MzD;;A8Dl8MI;EAA8B,+BAAyB;EAAzB,yBAAyB;A9Ds8M3D;;A8Dr8MI;EAA8B,+BAAyB;EAAzB,yBAAyB;A9Dy8M3D;;A8Dv8MI;EAAoC,+BAAsC;EAAtC,sCAAsC;A9D28M9E;;A8D18MI;EAAoC,6BAAoC;EAApC,oCAAoC;A9D88M5E;;A8D78MI;EAAoC,gCAAkC;EAAlC,kCAAkC;A9Di9M1E;;A8Dh9MI;EAAoC,iCAAyC;EAAzC,yCAAyC;A9Do9MjF;;A8Dn9MI;EAAoC,oCAAwC;EAAxC,wCAAwC;A9Du9MhF;;A8Dr9MI;EAAiC,gCAAkC;EAAlC,kCAAkC;A9Dy9MvE;;A8Dx9MI;EAAiC,8BAAgC;EAAhC,gCAAgC;A9D49MrE;;A8D39MI;EAAiC,iCAA8B;EAA9B,8BAA8B;A9D+9MnE;;A8D99MI;EAAiC,mCAAgC;EAAhC,gCAAgC;A9Dk+MrE;;A8Dj+MI;EAAiC,kCAA+B;EAA/B,+BAA+B;A9Dq+MpE;;A8Dn+MI;EAAkC,oCAAoC;EAApC,oCAAoC;A9Du+M1E;;A8Dt+MI;EAAkC,kCAAkC;EAAlC,kCAAkC;A9D0+MxE;;A8Dz+MI;EAAkC,qCAAgC;EAAhC,gCAAgC;A9D6+MtE;;A8D5+MI;EAAkC,sCAAuC;EAAvC,uCAAuC;A9Dg/M7E;;A8D/+MI;EAAkC,yCAAsC;EAAtC,sCAAsC;A9Dm/M5E;;A8Dl/MI;EAAkC,sCAAiC;EAAjC,iCAAiC;A9Ds/MvE;;A8Dp/MI;EAAgC,oCAA2B;EAA3B,2BAA2B;A9Dw/M/D;;A8Dv/MI;EAAgC,qCAAiC;EAAjC,iCAAiC;A9D2/MrE;;A8D1/MI;EAAgC,mCAA+B;EAA/B,+BAA+B;A9D8/MnE;;A8D7/MI;EAAgC,sCAA6B;EAA7B,6BAA6B;A9DigNjE;;A8DhgNI;EAAgC,wCAA+B;EAA/B,+BAA+B;A9DogNnE;;A8DngNI;EAAgC,uCAA8B;EAA9B,8BAA8B;A9DugNlE;;Ac3/MI;EgDlDA;IAAgC,kCAA8B;IAA9B,8BAA8B;E9DkjNhE;E8DjjNE;IAAgC,qCAAiC;IAAjC,iCAAiC;E9DojNnE;E8DnjNE;IAAgC,0CAAsC;IAAtC,sCAAsC;E9DsjNxE;E8DrjNE;IAAgC,6CAAyC;IAAzC,yCAAyC;E9DwjN3E;E8DtjNE;IAA8B,8BAA0B;IAA1B,0BAA0B;E9DyjN1D;E8DxjNE;IAA8B,gCAA4B;IAA5B,4BAA4B;E9D2jN5D;E8D1jNE;IAA8B,sCAAkC;IAAlC,kCAAkC;E9D6jNlE;E8D5jNE;IAA8B,6BAAyB;IAAzB,yBAAyB;E9D+jNzD;E8D9jNE;IAA8B,+BAAuB;IAAvB,uBAAuB;E9DikNvD;E8DhkNE;IAA8B,+BAAuB;IAAvB,uBAAuB;E9DmkNvD;E8DlkNE;IAA8B,+BAAyB;IAAzB,yBAAyB;E9DqkNzD;E8DpkNE;IAA8B,+BAAyB;IAAzB,yBAAyB;E9DukNzD;E8DrkNE;IAAoC,+BAAsC;IAAtC,sCAAsC;E9DwkN5E;E8DvkNE;IAAoC,6BAAoC;IAApC,oCAAoC;E9D0kN1E;E8DzkNE;IAAoC,gCAAkC;IAAlC,kCAAkC;E9D4kNxE;E8D3kNE;IAAoC,iCAAyC;IAAzC,yCAAyC;E9D8kN/E;E8D7kNE;IAAoC,oCAAwC;IAAxC,wCAAwC;E9DglN9E;E8D9kNE;IAAiC,gCAAkC;IAAlC,kCAAkC;E9DilNrE;E8DhlNE;IAAiC,8BAAgC;IAAhC,gCAAgC;E9DmlNnE;E8DllNE;IAAiC,iCAA8B;IAA9B,8BAA8B;E9DqlNjE;E8DplNE;IAAiC,mCAAgC;IAAhC,gCAAgC;E9DulNnE;E8DtlNE;IAAiC,kCAA+B;IAA/B,+BAA+B;E9DylNlE;E8DvlNE;IAAkC,oCAAoC;IAApC,oCAAoC;E9D0lNxE;E8DzlNE;IAAkC,kCAAkC;IAAlC,kCAAkC;E9D4lNtE;E8D3lNE;IAAkC,qCAAgC;IAAhC,gCAAgC;E9D8lNpE;E8D7lNE;IAAkC,sCAAuC;IAAvC,uCAAuC;E9DgmN3E;E8D/lNE;IAAkC,yCAAsC;IAAtC,sCAAsC;E9DkmN1E;E8DjmNE;IAAkC,sCAAiC;IAAjC,iCAAiC;E9DomNrE;E8DlmNE;IAAgC,oCAA2B;IAA3B,2BAA2B;E9DqmN7D;E8DpmNE;IAAgC,qCAAiC;IAAjC,iCAAiC;E9DumNnE;E8DtmNE;IAAgC,mCAA+B;IAA/B,+BAA+B;E9DymNjE;E8DxmNE;IAAgC,sCAA6B;IAA7B,6BAA6B;E9D2mN/D;E8D1mNE;IAAgC,wCAA+B;IAA/B,+BAA+B;E9D6mNjE;E8D5mNE;IAAgC,uCAA8B;IAA9B,8BAA8B;E9D+mNhE;AACF;;AcpmNI;EgDlDA;IAAgC,kCAA8B;IAA9B,8BAA8B;E9D2pNhE;E8D1pNE;IAAgC,qCAAiC;IAAjC,iCAAiC;E9D6pNnE;E8D5pNE;IAAgC,0CAAsC;IAAtC,sCAAsC;E9D+pNxE;E8D9pNE;IAAgC,6CAAyC;IAAzC,yCAAyC;E9DiqN3E;E8D/pNE;IAA8B,8BAA0B;IAA1B,0BAA0B;E9DkqN1D;E8DjqNE;IAA8B,gCAA4B;IAA5B,4BAA4B;E9DoqN5D;E8DnqNE;IAA8B,sCAAkC;IAAlC,kCAAkC;E9DsqNlE;E8DrqNE;IAA8B,6BAAyB;IAAzB,yBAAyB;E9DwqNzD;E8DvqNE;IAA8B,+BAAuB;IAAvB,uBAAuB;E9D0qNvD;E8DzqNE;IAA8B,+BAAuB;IAAvB,uBAAuB;E9D4qNvD;E8D3qNE;IAA8B,+BAAyB;IAAzB,yBAAyB;E9D8qNzD;E8D7qNE;IAA8B,+BAAyB;IAAzB,yBAAyB;E9DgrNzD;E8D9qNE;IAAoC,+BAAsC;IAAtC,sCAAsC;E9DirN5E;E8DhrNE;IAAoC,6BAAoC;IAApC,oCAAoC;E9DmrN1E;E8DlrNE;IAAoC,gCAAkC;IAAlC,kCAAkC;E9DqrNxE;E8DprNE;IAAoC,iCAAyC;IAAzC,yCAAyC;E9DurN/E;E8DtrNE;IAAoC,oCAAwC;IAAxC,wCAAwC;E9DyrN9E;E8DvrNE;IAAiC,gCAAkC;IAAlC,kCAAkC;E9D0rNrE;E8DzrNE;IAAiC,8BAAgC;IAAhC,gCAAgC;E9D4rNnE;E8D3rNE;IAAiC,iCAA8B;IAA9B,8BAA8B;E9D8rNjE;E8D7rNE;IAAiC,mCAAgC;IAAhC,gCAAgC;E9DgsNnE;E8D/rNE;IAAiC,kCAA+B;IAA/B,+BAA+B;E9DksNlE;E8DhsNE;IAAkC,oCAAoC;IAApC,oCAAoC;E9DmsNxE;E8DlsNE;IAAkC,kCAAkC;IAAlC,kCAAkC;E9DqsNtE;E8DpsNE;IAAkC,qCAAgC;IAAhC,gCAAgC;E9DusNpE;E8DtsNE;IAAkC,sCAAuC;IAAvC,uCAAuC;E9DysN3E;E8DxsNE;IAAkC,yCAAsC;IAAtC,sCAAsC;E9D2sN1E;E8D1sNE;IAAkC,sCAAiC;IAAjC,iCAAiC;E9D6sNrE;E8D3sNE;IAAgC,oCAA2B;IAA3B,2BAA2B;E9D8sN7D;E8D7sNE;IAAgC,qCAAiC;IAAjC,iCAAiC;E9DgtNnE;E8D/sNE;IAAgC,mCAA+B;IAA/B,+BAA+B;E9DktNjE;E8DjtNE;IAAgC,sCAA6B;IAA7B,6BAA6B;E9DotN/D;E8DntNE;IAAgC,wCAA+B;IAA/B,+BAA+B;E9DstNjE;E8DrtNE;IAAgC,uCAA8B;IAA9B,8BAA8B;E9DwtNhE;AACF;;Ac7sNI;EgDlDA;IAAgC,kCAA8B;IAA9B,8BAA8B;E9DowNhE;E8DnwNE;IAAgC,qCAAiC;IAAjC,iCAAiC;E9DswNnE;E8DrwNE;IAAgC,0CAAsC;IAAtC,sCAAsC;E9DwwNxE;E8DvwNE;IAAgC,6CAAyC;IAAzC,yCAAyC;E9D0wN3E;E8DxwNE;IAA8B,8BAA0B;IAA1B,0BAA0B;E9D2wN1D;E8D1wNE;IAA8B,gCAA4B;IAA5B,4BAA4B;E9D6wN5D;E8D5wNE;IAA8B,sCAAkC;IAAlC,kCAAkC;E9D+wNlE;E8D9wNE;IAA8B,6BAAyB;IAAzB,yBAAyB;E9DixNzD;E8DhxNE;IAA8B,+BAAuB;IAAvB,uBAAuB;E9DmxNvD;E8DlxNE;IAA8B,+BAAuB;IAAvB,uBAAuB;E9DqxNvD;E8DpxNE;IAA8B,+BAAyB;IAAzB,yBAAyB;E9DuxNzD;E8DtxNE;IAA8B,+BAAyB;IAAzB,yBAAyB;E9DyxNzD;E8DvxNE;IAAoC,+BAAsC;IAAtC,sCAAsC;E9D0xN5E;E8DzxNE;IAAoC,6BAAoC;IAApC,oCAAoC;E9D4xN1E;E8D3xNE;IAAoC,gCAAkC;IAAlC,kCAAkC;E9D8xNxE;E8D7xNE;IAAoC,iCAAyC;IAAzC,yCAAyC;E9DgyN/E;E8D/xNE;IAAoC,oCAAwC;IAAxC,wCAAwC;E9DkyN9E;E8DhyNE;IAAiC,gCAAkC;IAAlC,kCAAkC;E9DmyNrE;E8DlyNE;IAAiC,8BAAgC;IAAhC,gCAAgC;E9DqyNnE;E8DpyNE;IAAiC,iCAA8B;IAA9B,8BAA8B;E9DuyNjE;E8DtyNE;IAAiC,mCAAgC;IAAhC,gCAAgC;E9DyyNnE;E8DxyNE;IAAiC,kCAA+B;IAA/B,+BAA+B;E9D2yNlE;E8DzyNE;IAAkC,oCAAoC;IAApC,oCAAoC;E9D4yNxE;E8D3yNE;IAAkC,kCAAkC;IAAlC,kCAAkC;E9D8yNtE;E8D7yNE;IAAkC,qCAAgC;IAAhC,gCAAgC;E9DgzNpE;E8D/yNE;IAAkC,sCAAuC;IAAvC,uCAAuC;E9DkzN3E;E8DjzNE;IAAkC,yCAAsC;IAAtC,sCAAsC;E9DozN1E;E8DnzNE;IAAkC,sCAAiC;IAAjC,iCAAiC;E9DszNrE;E8DpzNE;IAAgC,oCAA2B;IAA3B,2BAA2B;E9DuzN7D;E8DtzNE;IAAgC,qCAAiC;IAAjC,iCAAiC;E9DyzNnE;E8DxzNE;IAAgC,mCAA+B;IAA/B,+BAA+B;E9D2zNjE;E8D1zNE;IAAgC,sCAA6B;IAA7B,6BAA6B;E9D6zN/D;E8D5zNE;IAAgC,wCAA+B;IAA/B,+BAA+B;E9D+zNjE;E8D9zNE;IAAgC,uCAA8B;IAA9B,8BAA8B;E9Di0NhE;AACF;;ActzNI;EgDlDA;IAAgC,kCAA8B;IAA9B,8BAA8B;E9D62NhE;E8D52NE;IAAgC,qCAAiC;IAAjC,iCAAiC;E9D+2NnE;E8D92NE;IAAgC,0CAAsC;IAAtC,sCAAsC;E9Di3NxE;E8Dh3NE;IAAgC,6CAAyC;IAAzC,yCAAyC;E9Dm3N3E;E8Dj3NE;IAA8B,8BAA0B;IAA1B,0BAA0B;E9Do3N1D;E8Dn3NE;IAA8B,gCAA4B;IAA5B,4BAA4B;E9Ds3N5D;E8Dr3NE;IAA8B,sCAAkC;IAAlC,kCAAkC;E9Dw3NlE;E8Dv3NE;IAA8B,6BAAyB;IAAzB,yBAAyB;E9D03NzD;E8Dz3NE;IAA8B,+BAAuB;IAAvB,uBAAuB;E9D43NvD;E8D33NE;IAA8B,+BAAuB;IAAvB,uBAAuB;E9D83NvD;E8D73NE;IAA8B,+BAAyB;IAAzB,yBAAyB;E9Dg4NzD;E8D/3NE;IAA8B,+BAAyB;IAAzB,yBAAyB;E9Dk4NzD;E8Dh4NE;IAAoC,+BAAsC;IAAtC,sCAAsC;E9Dm4N5E;E8Dl4NE;IAAoC,6BAAoC;IAApC,oCAAoC;E9Dq4N1E;E8Dp4NE;IAAoC,gCAAkC;IAAlC,kCAAkC;E9Du4NxE;E8Dt4NE;IAAoC,iCAAyC;IAAzC,yCAAyC;E9Dy4N/E;E8Dx4NE;IAAoC,oCAAwC;IAAxC,wCAAwC;E9D24N9E;E8Dz4NE;IAAiC,gCAAkC;IAAlC,kCAAkC;E9D44NrE;E8D34NE;IAAiC,8BAAgC;IAAhC,gCAAgC;E9D84NnE;E8D74NE;IAAiC,iCAA8B;IAA9B,8BAA8B;E9Dg5NjE;E8D/4NE;IAAiC,mCAAgC;IAAhC,gCAAgC;E9Dk5NnE;E8Dj5NE;IAAiC,kCAA+B;IAA/B,+BAA+B;E9Do5NlE;E8Dl5NE;IAAkC,oCAAoC;IAApC,oCAAoC;E9Dq5NxE;E8Dp5NE;IAAkC,kCAAkC;IAAlC,kCAAkC;E9Du5NtE;E8Dt5NE;IAAkC,qCAAgC;IAAhC,gCAAgC;E9Dy5NpE;E8Dx5NE;IAAkC,sCAAuC;IAAvC,uCAAuC;E9D25N3E;E8D15NE;IAAkC,yCAAsC;IAAtC,sCAAsC;E9D65N1E;E8D55NE;IAAkC,sCAAiC;IAAjC,iCAAiC;E9D+5NrE;E8D75NE;IAAgC,oCAA2B;IAA3B,2BAA2B;E9Dg6N7D;E8D/5NE;IAAgC,qCAAiC;IAAjC,iCAAiC;E9Dk6NnE;E8Dj6NE;IAAgC,mCAA+B;IAA/B,+BAA+B;E9Do6NjE;E8Dn6NE;IAAgC,sCAA6B;IAA7B,6BAA6B;E9Ds6N/D;E8Dr6NE;IAAgC,wCAA+B;IAA/B,+BAA+B;E9Dw6NjE;E8Dv6NE;IAAgC,uCAA8B;IAA9B,8BAA8B;E9D06NhE;AACF;;A+Dr9NI;EAAwB,sBAAsB;A/Dy9NlD;;A+Dx9NI;EAAwB,uBAAuB;A/D49NnD;;A+D39NI;EAAwB,sBAAsB;A/D+9NlD;;Ac36NI;EiDtDA;IAAwB,sBAAsB;E/Ds+NhD;E+Dr+NE;IAAwB,uBAAuB;E/Dw+NjD;E+Dv+NE;IAAwB,sBAAsB;E/D0+NhD;AACF;;Acv7NI;EiDtDA;IAAwB,sBAAsB;E/Dk/NhD;E+Dj/NE;IAAwB,uBAAuB;E/Do/NjD;E+Dn/NE;IAAwB,sBAAsB;E/Ds/NhD;AACF;;Acn8NI;EiDtDA;IAAwB,sBAAsB;E/D8/NhD;E+D7/NE;IAAwB,uBAAuB;E/DggOjD;E+D//NE;IAAwB,sBAAsB;E/DkgOhD;AACF;;Ac/8NI;EiDtDA;IAAwB,sBAAsB;E/D0gOhD;E+DzgOE;IAAwB,uBAAuB;E/D4gOjD;E+D3gOE;IAAwB,sBAAsB;E/D8gOhD;AACF;;AgEphOE;EAAsB,yBAA2B;AhEwhOnD;;AgExhOE;EAAsB,2BAA2B;AhE4hOnD;;AiE3hOE;EAAyB,2BAA8B;AjE+hOzD;;AiE/hOE;EAAyB,6BAA8B;AjEmiOzD;;AiEniOE;EAAyB,6BAA8B;AjEuiOzD;;AiEviOE;EAAyB,0BAA8B;AjE2iOzD;;AiE3iOE;EAAyB,mCAA8B;EAA9B,2BAA8B;AjE+iOzD;;AiE1iOA;EACE,eAAe;EACf,MAAM;EACN,QAAQ;EACR,OAAO;EACP,a9DypBsC;AHo5MxC;;AiE1iOA;EACE,eAAe;EACf,QAAQ;EACR,SAAS;EACT,OAAO;EACP,a9DipBsC;AH45MxC;;AiEziO8B;EAD9B;IAEI,wBAAgB;IAAhB,gBAAgB;IAChB,MAAM;IACN,a9DyoBoC;EHo6MtC;AACF;;AkEvkOA;ECEE,kBAAkB;EAClB,UAAU;EACV,WAAW;EACX,UAAU;EACV,gBAAgB;EAChB,sBAAsB;EACtB,mBAAmB;EACnB,SAAS;AnEykOX;;AmE/jOE;EAEE,gBAAgB;EAChB,WAAW;EACX,YAAY;EACZ,iBAAiB;EACjB,UAAU;EACV,mBAAmB;AnEikOvB;;AoE7lOA;EAAa,8DAAqC;ApEimOlD;;AoEhmOA;EAAU,wDAAkC;ApEomO5C;;AoEnmOA;EAAa,uDAAqC;ApEumOlD;;AoEtmOA;EAAe,2BAA2B;ApE0mO1C;;AqEzmOI;EAAuB,qBAA4B;ArE6mOvD;;AqE7mOI;EAAuB,qBAA4B;ArEinOvD;;AqEjnOI;EAAuB,qBAA4B;ArEqnOvD;;AqErnOI;EAAuB,sBAA4B;ArEynOvD;;AqEznOI;EAAuB,sBAA4B;ArE6nOvD;;AqE7nOI;EAAuB,sBAA4B;ArEioOvD;;AqEjoOI;EAAuB,sBAA4B;ArEqoOvD;;AqEroOI;EAAuB,sBAA4B;ArEyoOvD;;AqEzoOI;EAAuB,uBAA4B;ArE6oOvD;;AqE7oOI;EAAuB,uBAA4B;ArEipOvD;;AqE7oOA;EAAU,0BAA0B;ArEipOpC;;AqEhpOA;EAAU,2BAA2B;ArEopOrC;;AqEhpOA;EAAc,2BAA2B;ArEopOzC;;AqEnpOA;EAAc,4BAA4B;ArEupO1C;;AqErpOA;EAAU,uBAAuB;ArEypOjC;;AqExpOA;EAAU,wBAAwB;ArE4pOlC;;AsE3qOA;EAEI,kBAAkB;EAClB,MAAM;EACN,QAAQ;EACR,SAAS;EACT,OAAO;EACP,UAAU;EAEV,oBAAoB;EACpB,WAAW;EAEX,kCAAkC;AtE2qOtC;;AuEjrOQ;EAAgC,oBAA4B;AvEqrOpE;;AuEprOQ;;EAEE,wBAAoC;AvEurO9C;;AuErrOQ;;EAEE,0BAAwC;AvEwrOlD;;AuEtrOQ;;EAEE,2BAA0C;AvEyrOpD;;AuEvrOQ;;EAEE,yBAAsC;AvE0rOhD;;AuEzsOQ;EAAgC,0BAA4B;AvE6sOpE;;AuE5sOQ;;EAEE,8BAAoC;AvE+sO9C;;AuE7sOQ;;EAEE,gCAAwC;AvEgtOlD;;AuE9sOQ;;EAEE,iCAA0C;AvEitOpD;;AuE/sOQ;;EAEE,+BAAsC;AvEktOhD;;AuEjuOQ;EAAgC,yBAA4B;AvEquOpE;;AuEpuOQ;;EAEE,6BAAoC;AvEuuO9C;;AuEruOQ;;EAEE,+BAAwC;AvEwuOlD;;AuEtuOQ;;EAEE,gCAA0C;AvEyuOpD;;AuEvuOQ;;EAEE,8BAAsC;AvE0uOhD;;AuEzvOQ;EAAgC,uBAA4B;AvE6vOpE;;AuE5vOQ;;EAEE,2BAAoC;AvE+vO9C;;AuE7vOQ;;EAEE,6BAAwC;AvEgwOlD;;AuE9vOQ;;EAEE,8BAA0C;AvEiwOpD;;AuE/vOQ;;EAEE,4BAAsC;AvEkwOhD;;AuEjxOQ;EAAgC,yBAA4B;AvEqxOpE;;AuEpxOQ;;EAEE,6BAAoC;AvEuxO9C;;AuErxOQ;;EAEE,+BAAwC;AvEwxOlD;;AuEtxOQ;;EAEE,gCAA0C;AvEyxOpD;;AuEvxOQ;;EAEE,8BAAsC;AvE0xOhD;;AuEzyOQ;EAAgC,uBAA4B;AvE6yOpE;;AuE5yOQ;;EAEE,2BAAoC;AvE+yO9C;;AuE7yOQ;;EAEE,6BAAwC;AvEgzOlD;;AuE9yOQ;;EAEE,8BAA0C;AvEizOpD;;AuE/yOQ;;EAEE,4BAAsC;AvEkzOhD;;AuEj0OQ;EAAgC,qBAA4B;AvEq0OpE;;AuEp0OQ;;EAEE,yBAAoC;AvEu0O9C;;AuEr0OQ;;EAEE,2BAAwC;AvEw0OlD;;AuEt0OQ;;EAEE,4BAA0C;AvEy0OpD;;AuEv0OQ;;EAEE,0BAAsC;AvE00OhD;;AuEz1OQ;EAAgC,2BAA4B;AvE61OpE;;AuE51OQ;;EAEE,+BAAoC;AvE+1O9C;;AuE71OQ;;EAEE,iCAAwC;AvEg2OlD;;AuE91OQ;;EAEE,kCAA0C;AvEi2OpD;;AuE/1OQ;;EAEE,gCAAsC;AvEk2OhD;;AuEj3OQ;EAAgC,0BAA4B;AvEq3OpE;;AuEp3OQ;;EAEE,8BAAoC;AvEu3O9C;;AuEr3OQ;;EAEE,gCAAwC;AvEw3OlD;;AuEt3OQ;;EAEE,iCAA0C;AvEy3OpD;;AuEv3OQ;;EAEE,+BAAsC;AvE03OhD;;AuEz4OQ;EAAgC,wBAA4B;AvE64OpE;;AuE54OQ;;EAEE,4BAAoC;AvE+4O9C;;AuE74OQ;;EAEE,8BAAwC;AvEg5OlD;;AuE94OQ;;EAEE,+BAA0C;AvEi5OpD;;AuE/4OQ;;EAEE,6BAAsC;AvEk5OhD;;AuEj6OQ;EAAgC,0BAA4B;AvEq6OpE;;AuEp6OQ;;EAEE,8BAAoC;AvEu6O9C;;AuEr6OQ;;EAEE,gCAAwC;AvEw6OlD;;AuEt6OQ;;EAEE,iCAA0C;AvEy6OpD;;AuEv6OQ;;EAEE,+BAAsC;AvE06OhD;;AuEz7OQ;EAAgC,wBAA4B;AvE67OpE;;AuE57OQ;;EAEE,4BAAoC;AvE+7O9C;;AuE77OQ;;EAEE,8BAAwC;AvEg8OlD;;AuE97OQ;;EAEE,+BAA0C;AvEi8OpD;;AuE/7OQ;;EAEE,6BAAsC;AvEk8OhD;;AuE17OQ;EAAwB,2BAA2B;AvE87O3D;;AuE77OQ;;EAEE,+BAA+B;AvEg8OzC;;AuE97OQ;;EAEE,iCAAiC;AvEi8O3C;;AuE/7OQ;;EAEE,kCAAkC;AvEk8O5C;;AuEh8OQ;;EAEE,gCAAgC;AvEm8O1C;;AuEl9OQ;EAAwB,0BAA2B;AvEs9O3D;;AuEr9OQ;;EAEE,8BAA+B;AvEw9OzC;;AuEt9OQ;;EAEE,gCAAiC;AvEy9O3C;;AuEv9OQ;;EAEE,iCAAkC;AvE09O5C;;AuEx9OQ;;EAEE,+BAAgC;AvE29O1C;;AuE1+OQ;EAAwB,wBAA2B;AvE8+O3D;;AuE7+OQ;;EAEE,4BAA+B;AvEg/OzC;;AuE9+OQ;;EAEE,8BAAiC;AvEi/O3C;;AuE/+OQ;;EAEE,+BAAkC;AvEk/O5C;;AuEh/OQ;;EAEE,6BAAgC;AvEm/O1C;;AuElgPQ;EAAwB,0BAA2B;AvEsgP3D;;AuErgPQ;;EAEE,8BAA+B;AvEwgPzC;;AuEtgPQ;;EAEE,gCAAiC;AvEygP3C;;AuEvgPQ;;EAEE,iCAAkC;AvE0gP5C;;AuExgPQ;;EAEE,+BAAgC;AvE2gP1C;;AuE1hPQ;EAAwB,wBAA2B;AvE8hP3D;;AuE7hPQ;;EAEE,4BAA+B;AvEgiPzC;;AuE9hPQ;;EAEE,8BAAiC;AvEiiP3C;;AuE/hPQ;;EAEE,+BAAkC;AvEkiP5C;;AuEhiPQ;;EAEE,6BAAgC;AvEmiP1C;;AuE7hPI;EAAmB,uBAAuB;AvEiiP9C;;AuEhiPI;;EAEE,2BAA2B;AvEmiPjC;;AuEjiPI;;EAEE,6BAA6B;AvEoiPnC;;AuEliPI;;EAEE,8BAA8B;AvEqiPpC;;AuEniPI;;EAEE,4BAA4B;AvEsiPlC;;Ac/iPI;EyDlDI;IAAgC,oBAA4B;EvEsmPlE;EuErmPM;;IAEE,wBAAoC;EvEumP5C;EuErmPM;;IAEE,0BAAwC;EvEumPhD;EuErmPM;;IAEE,2BAA0C;EvEumPlD;EuErmPM;;IAEE,yBAAsC;EvEumP9C;EuEtnPM;IAAgC,0BAA4B;EvEynPlE;EuExnPM;;IAEE,8BAAoC;EvE0nP5C;EuExnPM;;IAEE,gCAAwC;EvE0nPhD;EuExnPM;;IAEE,iCAA0C;EvE0nPlD;EuExnPM;;IAEE,+BAAsC;EvE0nP9C;EuEzoPM;IAAgC,yBAA4B;EvE4oPlE;EuE3oPM;;IAEE,6BAAoC;EvE6oP5C;EuE3oPM;;IAEE,+BAAwC;EvE6oPhD;EuE3oPM;;IAEE,gCAA0C;EvE6oPlD;EuE3oPM;;IAEE,8BAAsC;EvE6oP9C;EuE5pPM;IAAgC,uBAA4B;EvE+pPlE;EuE9pPM;;IAEE,2BAAoC;EvEgqP5C;EuE9pPM;;IAEE,6BAAwC;EvEgqPhD;EuE9pPM;;IAEE,8BAA0C;EvEgqPlD;EuE9pPM;;IAEE,4BAAsC;EvEgqP9C;EuE/qPM;IAAgC,yBAA4B;EvEkrPlE;EuEjrPM;;IAEE,6BAAoC;EvEmrP5C;EuEjrPM;;IAEE,+BAAwC;EvEmrPhD;EuEjrPM;;IAEE,gCAA0C;EvEmrPlD;EuEjrPM;;IAEE,8BAAsC;EvEmrP9C;EuElsPM;IAAgC,uBAA4B;EvEqsPlE;EuEpsPM;;IAEE,2BAAoC;EvEssP5C;EuEpsPM;;IAEE,6BAAwC;EvEssPhD;EuEpsPM;;IAEE,8BAA0C;EvEssPlD;EuEpsPM;;IAEE,4BAAsC;EvEssP9C;EuErtPM;IAAgC,qBAA4B;EvEwtPlE;EuEvtPM;;IAEE,yBAAoC;EvEytP5C;EuEvtPM;;IAEE,2BAAwC;EvEytPhD;EuEvtPM;;IAEE,4BAA0C;EvEytPlD;EuEvtPM;;IAEE,0BAAsC;EvEytP9C;EuExuPM;IAAgC,2BAA4B;EvE2uPlE;EuE1uPM;;IAEE,+BAAoC;EvE4uP5C;EuE1uPM;;IAEE,iCAAwC;EvE4uPhD;EuE1uPM;;IAEE,kCAA0C;EvE4uPlD;EuE1uPM;;IAEE,gCAAsC;EvE4uP9C;EuE3vPM;IAAgC,0BAA4B;EvE8vPlE;EuE7vPM;;IAEE,8BAAoC;EvE+vP5C;EuE7vPM;;IAEE,gCAAwC;EvE+vPhD;EuE7vPM;;IAEE,iCAA0C;EvE+vPlD;EuE7vPM;;IAEE,+BAAsC;EvE+vP9C;EuE9wPM;IAAgC,wBAA4B;EvEixPlE;EuEhxPM;;IAEE,4BAAoC;EvEkxP5C;EuEhxPM;;IAEE,8BAAwC;EvEkxPhD;EuEhxPM;;IAEE,+BAA0C;EvEkxPlD;EuEhxPM;;IAEE,6BAAsC;EvEkxP9C;EuEjyPM;IAAgC,0BAA4B;EvEoyPlE;EuEnyPM;;IAEE,8BAAoC;EvEqyP5C;EuEnyPM;;IAEE,gCAAwC;EvEqyPhD;EuEnyPM;;IAEE,iCAA0C;EvEqyPlD;EuEnyPM;;IAEE,+BAAsC;EvEqyP9C;EuEpzPM;IAAgC,wBAA4B;EvEuzPlE;EuEtzPM;;IAEE,4BAAoC;EvEwzP5C;EuEtzPM;;IAEE,8BAAwC;EvEwzPhD;EuEtzPM;;IAEE,+BAA0C;EvEwzPlD;EuEtzPM;;IAEE,6BAAsC;EvEwzP9C;EuEhzPM;IAAwB,2BAA2B;EvEmzPzD;EuElzPM;;IAEE,+BAA+B;EvEozPvC;EuElzPM;;IAEE,iCAAiC;EvEozPzC;EuElzPM;;IAEE,kCAAkC;EvEozP1C;EuElzPM;;IAEE,gCAAgC;EvEozPxC;EuEn0PM;IAAwB,0BAA2B;EvEs0PzD;EuEr0PM;;IAEE,8BAA+B;EvEu0PvC;EuEr0PM;;IAEE,gCAAiC;EvEu0PzC;EuEr0PM;;IAEE,iCAAkC;EvEu0P1C;EuEr0PM;;IAEE,+BAAgC;EvEu0PxC;EuEt1PM;IAAwB,wBAA2B;EvEy1PzD;EuEx1PM;;IAEE,4BAA+B;EvE01PvC;EuEx1PM;;IAEE,8BAAiC;EvE01PzC;EuEx1PM;;IAEE,+BAAkC;EvE01P1C;EuEx1PM;;IAEE,6BAAgC;EvE01PxC;EuEz2PM;IAAwB,0BAA2B;EvE42PzD;EuE32PM;;IAEE,8BAA+B;EvE62PvC;EuE32PM;;IAEE,gCAAiC;EvE62PzC;EuE32PM;;IAEE,iCAAkC;EvE62P1C;EuE32PM;;IAEE,+BAAgC;EvE62PxC;EuE53PM;IAAwB,wBAA2B;EvE+3PzD;EuE93PM;;IAEE,4BAA+B;EvEg4PvC;EuE93PM;;IAEE,8BAAiC;EvEg4PzC;EuE93PM;;IAEE,+BAAkC;EvEg4P1C;EuE93PM;;IAEE,6BAAgC;EvEg4PxC;EuE13PE;IAAmB,uBAAuB;EvE63P5C;EuE53PE;;IAEE,2BAA2B;EvE83P/B;EuE53PE;;IAEE,6BAA6B;EvE83PjC;EuE53PE;;IAEE,8BAA8B;EvE83PlC;EuE53PE;;IAEE,4BAA4B;EvE83PhC;AACF;;Acx4PI;EyDlDI;IAAgC,oBAA4B;EvE+7PlE;EuE97PM;;IAEE,wBAAoC;EvEg8P5C;EuE97PM;;IAEE,0BAAwC;EvEg8PhD;EuE97PM;;IAEE,2BAA0C;EvEg8PlD;EuE97PM;;IAEE,yBAAsC;EvEg8P9C;EuE/8PM;IAAgC,0BAA4B;EvEk9PlE;EuEj9PM;;IAEE,8BAAoC;EvEm9P5C;EuEj9PM;;IAEE,gCAAwC;EvEm9PhD;EuEj9PM;;IAEE,iCAA0C;EvEm9PlD;EuEj9PM;;IAEE,+BAAsC;EvEm9P9C;EuEl+PM;IAAgC,yBAA4B;EvEq+PlE;EuEp+PM;;IAEE,6BAAoC;EvEs+P5C;EuEp+PM;;IAEE,+BAAwC;EvEs+PhD;EuEp+PM;;IAEE,gCAA0C;EvEs+PlD;EuEp+PM;;IAEE,8BAAsC;EvEs+P9C;EuEr/PM;IAAgC,uBAA4B;EvEw/PlE;EuEv/PM;;IAEE,2BAAoC;EvEy/P5C;EuEv/PM;;IAEE,6BAAwC;EvEy/PhD;EuEv/PM;;IAEE,8BAA0C;EvEy/PlD;EuEv/PM;;IAEE,4BAAsC;EvEy/P9C;EuExgQM;IAAgC,yBAA4B;EvE2gQlE;EuE1gQM;;IAEE,6BAAoC;EvE4gQ5C;EuE1gQM;;IAEE,+BAAwC;EvE4gQhD;EuE1gQM;;IAEE,gCAA0C;EvE4gQlD;EuE1gQM;;IAEE,8BAAsC;EvE4gQ9C;EuE3hQM;IAAgC,uBAA4B;EvE8hQlE;EuE7hQM;;IAEE,2BAAoC;EvE+hQ5C;EuE7hQM;;IAEE,6BAAwC;EvE+hQhD;EuE7hQM;;IAEE,8BAA0C;EvE+hQlD;EuE7hQM;;IAEE,4BAAsC;EvE+hQ9C;EuE9iQM;IAAgC,qBAA4B;EvEijQlE;EuEhjQM;;IAEE,yBAAoC;EvEkjQ5C;EuEhjQM;;IAEE,2BAAwC;EvEkjQhD;EuEhjQM;;IAEE,4BAA0C;EvEkjQlD;EuEhjQM;;IAEE,0BAAsC;EvEkjQ9C;EuEjkQM;IAAgC,2BAA4B;EvEokQlE;EuEnkQM;;IAEE,+BAAoC;EvEqkQ5C;EuEnkQM;;IAEE,iCAAwC;EvEqkQhD;EuEnkQM;;IAEE,kCAA0C;EvEqkQlD;EuEnkQM;;IAEE,gCAAsC;EvEqkQ9C;EuEplQM;IAAgC,0BAA4B;EvEulQlE;EuEtlQM;;IAEE,8BAAoC;EvEwlQ5C;EuEtlQM;;IAEE,gCAAwC;EvEwlQhD;EuEtlQM;;IAEE,iCAA0C;EvEwlQlD;EuEtlQM;;IAEE,+BAAsC;EvEwlQ9C;EuEvmQM;IAAgC,wBAA4B;EvE0mQlE;EuEzmQM;;IAEE,4BAAoC;EvE2mQ5C;EuEzmQM;;IAEE,8BAAwC;EvE2mQhD;EuEzmQM;;IAEE,+BAA0C;EvE2mQlD;EuEzmQM;;IAEE,6BAAsC;EvE2mQ9C;EuE1nQM;IAAgC,0BAA4B;EvE6nQlE;EuE5nQM;;IAEE,8BAAoC;EvE8nQ5C;EuE5nQM;;IAEE,gCAAwC;EvE8nQhD;EuE5nQM;;IAEE,iCAA0C;EvE8nQlD;EuE5nQM;;IAEE,+BAAsC;EvE8nQ9C;EuE7oQM;IAAgC,wBAA4B;EvEgpQlE;EuE/oQM;;IAEE,4BAAoC;EvEipQ5C;EuE/oQM;;IAEE,8BAAwC;EvEipQhD;EuE/oQM;;IAEE,+BAA0C;EvEipQlD;EuE/oQM;;IAEE,6BAAsC;EvEipQ9C;EuEzoQM;IAAwB,2BAA2B;EvE4oQzD;EuE3oQM;;IAEE,+BAA+B;EvE6oQvC;EuE3oQM;;IAEE,iCAAiC;EvE6oQzC;EuE3oQM;;IAEE,kCAAkC;EvE6oQ1C;EuE3oQM;;IAEE,gCAAgC;EvE6oQxC;EuE5pQM;IAAwB,0BAA2B;EvE+pQzD;EuE9pQM;;IAEE,8BAA+B;EvEgqQvC;EuE9pQM;;IAEE,gCAAiC;EvEgqQzC;EuE9pQM;;IAEE,iCAAkC;EvEgqQ1C;EuE9pQM;;IAEE,+BAAgC;EvEgqQxC;EuE/qQM;IAAwB,wBAA2B;EvEkrQzD;EuEjrQM;;IAEE,4BAA+B;EvEmrQvC;EuEjrQM;;IAEE,8BAAiC;EvEmrQzC;EuEjrQM;;IAEE,+BAAkC;EvEmrQ1C;EuEjrQM;;IAEE,6BAAgC;EvEmrQxC;EuElsQM;IAAwB,0BAA2B;EvEqsQzD;EuEpsQM;;IAEE,8BAA+B;EvEssQvC;EuEpsQM;;IAEE,gCAAiC;EvEssQzC;EuEpsQM;;IAEE,iCAAkC;EvEssQ1C;EuEpsQM;;IAEE,+BAAgC;EvEssQxC;EuErtQM;IAAwB,wBAA2B;EvEwtQzD;EuEvtQM;;IAEE,4BAA+B;EvEytQvC;EuEvtQM;;IAEE,8BAAiC;EvEytQzC;EuEvtQM;;IAEE,+BAAkC;EvEytQ1C;EuEvtQM;;IAEE,6BAAgC;EvEytQxC;EuEntQE;IAAmB,uBAAuB;EvEstQ5C;EuErtQE;;IAEE,2BAA2B;EvEutQ/B;EuErtQE;;IAEE,6BAA6B;EvEutQjC;EuErtQE;;IAEE,8BAA8B;EvEutQlC;EuErtQE;;IAEE,4BAA4B;EvEutQhC;AACF;;AcjuQI;EyDlDI;IAAgC,oBAA4B;EvEwxQlE;EuEvxQM;;IAEE,wBAAoC;EvEyxQ5C;EuEvxQM;;IAEE,0BAAwC;EvEyxQhD;EuEvxQM;;IAEE,2BAA0C;EvEyxQlD;EuEvxQM;;IAEE,yBAAsC;EvEyxQ9C;EuExyQM;IAAgC,0BAA4B;EvE2yQlE;EuE1yQM;;IAEE,8BAAoC;EvE4yQ5C;EuE1yQM;;IAEE,gCAAwC;EvE4yQhD;EuE1yQM;;IAEE,iCAA0C;EvE4yQlD;EuE1yQM;;IAEE,+BAAsC;EvE4yQ9C;EuE3zQM;IAAgC,yBAA4B;EvE8zQlE;EuE7zQM;;IAEE,6BAAoC;EvE+zQ5C;EuE7zQM;;IAEE,+BAAwC;EvE+zQhD;EuE7zQM;;IAEE,gCAA0C;EvE+zQlD;EuE7zQM;;IAEE,8BAAsC;EvE+zQ9C;EuE90QM;IAAgC,uBAA4B;EvEi1QlE;EuEh1QM;;IAEE,2BAAoC;EvEk1Q5C;EuEh1QM;;IAEE,6BAAwC;EvEk1QhD;EuEh1QM;;IAEE,8BAA0C;EvEk1QlD;EuEh1QM;;IAEE,4BAAsC;EvEk1Q9C;EuEj2QM;IAAgC,yBAA4B;EvEo2QlE;EuEn2QM;;IAEE,6BAAoC;EvEq2Q5C;EuEn2QM;;IAEE,+BAAwC;EvEq2QhD;EuEn2QM;;IAEE,gCAA0C;EvEq2QlD;EuEn2QM;;IAEE,8BAAsC;EvEq2Q9C;EuEp3QM;IAAgC,uBAA4B;EvEu3QlE;EuEt3QM;;IAEE,2BAAoC;EvEw3Q5C;EuEt3QM;;IAEE,6BAAwC;EvEw3QhD;EuEt3QM;;IAEE,8BAA0C;EvEw3QlD;EuEt3QM;;IAEE,4BAAsC;EvEw3Q9C;EuEv4QM;IAAgC,qBAA4B;EvE04QlE;EuEz4QM;;IAEE,yBAAoC;EvE24Q5C;EuEz4QM;;IAEE,2BAAwC;EvE24QhD;EuEz4QM;;IAEE,4BAA0C;EvE24QlD;EuEz4QM;;IAEE,0BAAsC;EvE24Q9C;EuE15QM;IAAgC,2BAA4B;EvE65QlE;EuE55QM;;IAEE,+BAAoC;EvE85Q5C;EuE55QM;;IAEE,iCAAwC;EvE85QhD;EuE55QM;;IAEE,kCAA0C;EvE85QlD;EuE55QM;;IAEE,gCAAsC;EvE85Q9C;EuE76QM;IAAgC,0BAA4B;EvEg7QlE;EuE/6QM;;IAEE,8BAAoC;EvEi7Q5C;EuE/6QM;;IAEE,gCAAwC;EvEi7QhD;EuE/6QM;;IAEE,iCAA0C;EvEi7QlD;EuE/6QM;;IAEE,+BAAsC;EvEi7Q9C;EuEh8QM;IAAgC,wBAA4B;EvEm8QlE;EuEl8QM;;IAEE,4BAAoC;EvEo8Q5C;EuEl8QM;;IAEE,8BAAwC;EvEo8QhD;EuEl8QM;;IAEE,+BAA0C;EvEo8QlD;EuEl8QM;;IAEE,6BAAsC;EvEo8Q9C;EuEn9QM;IAAgC,0BAA4B;EvEs9QlE;EuEr9QM;;IAEE,8BAAoC;EvEu9Q5C;EuEr9QM;;IAEE,gCAAwC;EvEu9QhD;EuEr9QM;;IAEE,iCAA0C;EvEu9QlD;EuEr9QM;;IAEE,+BAAsC;EvEu9Q9C;EuEt+QM;IAAgC,wBAA4B;EvEy+QlE;EuEx+QM;;IAEE,4BAAoC;EvE0+Q5C;EuEx+QM;;IAEE,8BAAwC;EvE0+QhD;EuEx+QM;;IAEE,+BAA0C;EvE0+QlD;EuEx+QM;;IAEE,6BAAsC;EvE0+Q9C;EuEl+QM;IAAwB,2BAA2B;EvEq+QzD;EuEp+QM;;IAEE,+BAA+B;EvEs+QvC;EuEp+QM;;IAEE,iCAAiC;EvEs+QzC;EuEp+QM;;IAEE,kCAAkC;EvEs+Q1C;EuEp+QM;;IAEE,gCAAgC;EvEs+QxC;EuEr/QM;IAAwB,0BAA2B;EvEw/QzD;EuEv/QM;;IAEE,8BAA+B;EvEy/QvC;EuEv/QM;;IAEE,gCAAiC;EvEy/QzC;EuEv/QM;;IAEE,iCAAkC;EvEy/Q1C;EuEv/QM;;IAEE,+BAAgC;EvEy/QxC;EuExgRM;IAAwB,wBAA2B;EvE2gRzD;EuE1gRM;;IAEE,4BAA+B;EvE4gRvC;EuE1gRM;;IAEE,8BAAiC;EvE4gRzC;EuE1gRM;;IAEE,+BAAkC;EvE4gR1C;EuE1gRM;;IAEE,6BAAgC;EvE4gRxC;EuE3hRM;IAAwB,0BAA2B;EvE8hRzD;EuE7hRM;;IAEE,8BAA+B;EvE+hRvC;EuE7hRM;;IAEE,gCAAiC;EvE+hRzC;EuE7hRM;;IAEE,iCAAkC;EvE+hR1C;EuE7hRM;;IAEE,+BAAgC;EvE+hRxC;EuE9iRM;IAAwB,wBAA2B;EvEijRzD;EuEhjRM;;IAEE,4BAA+B;EvEkjRvC;EuEhjRM;;IAEE,8BAAiC;EvEkjRzC;EuEhjRM;;IAEE,+BAAkC;EvEkjR1C;EuEhjRM;;IAEE,6BAAgC;EvEkjRxC;EuE5iRE;IAAmB,uBAAuB;EvE+iR5C;EuE9iRE;;IAEE,2BAA2B;EvEgjR/B;EuE9iRE;;IAEE,6BAA6B;EvEgjRjC;EuE9iRE;;IAEE,8BAA8B;EvEgjRlC;EuE9iRE;;IAEE,4BAA4B;EvEgjRhC;AACF;;Ac1jRI;EyDlDI;IAAgC,oBAA4B;EvEinRlE;EuEhnRM;;IAEE,wBAAoC;EvEknR5C;EuEhnRM;;IAEE,0BAAwC;EvEknRhD;EuEhnRM;;IAEE,2BAA0C;EvEknRlD;EuEhnRM;;IAEE,yBAAsC;EvEknR9C;EuEjoRM;IAAgC,0BAA4B;EvEooRlE;EuEnoRM;;IAEE,8BAAoC;EvEqoR5C;EuEnoRM;;IAEE,gCAAwC;EvEqoRhD;EuEnoRM;;IAEE,iCAA0C;EvEqoRlD;EuEnoRM;;IAEE,+BAAsC;EvEqoR9C;EuEppRM;IAAgC,yBAA4B;EvEupRlE;EuEtpRM;;IAEE,6BAAoC;EvEwpR5C;EuEtpRM;;IAEE,+BAAwC;EvEwpRhD;EuEtpRM;;IAEE,gCAA0C;EvEwpRlD;EuEtpRM;;IAEE,8BAAsC;EvEwpR9C;EuEvqRM;IAAgC,uBAA4B;EvE0qRlE;EuEzqRM;;IAEE,2BAAoC;EvE2qR5C;EuEzqRM;;IAEE,6BAAwC;EvE2qRhD;EuEzqRM;;IAEE,8BAA0C;EvE2qRlD;EuEzqRM;;IAEE,4BAAsC;EvE2qR9C;EuE1rRM;IAAgC,yBAA4B;EvE6rRlE;EuE5rRM;;IAEE,6BAAoC;EvE8rR5C;EuE5rRM;;IAEE,+BAAwC;EvE8rRhD;EuE5rRM;;IAEE,gCAA0C;EvE8rRlD;EuE5rRM;;IAEE,8BAAsC;EvE8rR9C;EuE7sRM;IAAgC,uBAA4B;EvEgtRlE;EuE/sRM;;IAEE,2BAAoC;EvEitR5C;EuE/sRM;;IAEE,6BAAwC;EvEitRhD;EuE/sRM;;IAEE,8BAA0C;EvEitRlD;EuE/sRM;;IAEE,4BAAsC;EvEitR9C;EuEhuRM;IAAgC,qBAA4B;EvEmuRlE;EuEluRM;;IAEE,yBAAoC;EvEouR5C;EuEluRM;;IAEE,2BAAwC;EvEouRhD;EuEluRM;;IAEE,4BAA0C;EvEouRlD;EuEluRM;;IAEE,0BAAsC;EvEouR9C;EuEnvRM;IAAgC,2BAA4B;EvEsvRlE;EuErvRM;;IAEE,+BAAoC;EvEuvR5C;EuErvRM;;IAEE,iCAAwC;EvEuvRhD;EuErvRM;;IAEE,kCAA0C;EvEuvRlD;EuErvRM;;IAEE,gCAAsC;EvEuvR9C;EuEtwRM;IAAgC,0BAA4B;EvEywRlE;EuExwRM;;IAEE,8BAAoC;EvE0wR5C;EuExwRM;;IAEE,gCAAwC;EvE0wRhD;EuExwRM;;IAEE,iCAA0C;EvE0wRlD;EuExwRM;;IAEE,+BAAsC;EvE0wR9C;EuEzxRM;IAAgC,wBAA4B;EvE4xRlE;EuE3xRM;;IAEE,4BAAoC;EvE6xR5C;EuE3xRM;;IAEE,8BAAwC;EvE6xRhD;EuE3xRM;;IAEE,+BAA0C;EvE6xRlD;EuE3xRM;;IAEE,6BAAsC;EvE6xR9C;EuE5yRM;IAAgC,0BAA4B;EvE+yRlE;EuE9yRM;;IAEE,8BAAoC;EvEgzR5C;EuE9yRM;;IAEE,gCAAwC;EvEgzRhD;EuE9yRM;;IAEE,iCAA0C;EvEgzRlD;EuE9yRM;;IAEE,+BAAsC;EvEgzR9C;EuE/zRM;IAAgC,wBAA4B;EvEk0RlE;EuEj0RM;;IAEE,4BAAoC;EvEm0R5C;EuEj0RM;;IAEE,8BAAwC;EvEm0RhD;EuEj0RM;;IAEE,+BAA0C;EvEm0RlD;EuEj0RM;;IAEE,6BAAsC;EvEm0R9C;EuE3zRM;IAAwB,2BAA2B;EvE8zRzD;EuE7zRM;;IAEE,+BAA+B;EvE+zRvC;EuE7zRM;;IAEE,iCAAiC;EvE+zRzC;EuE7zRM;;IAEE,kCAAkC;EvE+zR1C;EuE7zRM;;IAEE,gCAAgC;EvE+zRxC;EuE90RM;IAAwB,0BAA2B;EvEi1RzD;EuEh1RM;;IAEE,8BAA+B;EvEk1RvC;EuEh1RM;;IAEE,gCAAiC;EvEk1RzC;EuEh1RM;;IAEE,iCAAkC;EvEk1R1C;EuEh1RM;;IAEE,+BAAgC;EvEk1RxC;EuEj2RM;IAAwB,wBAA2B;EvEo2RzD;EuEn2RM;;IAEE,4BAA+B;EvEq2RvC;EuEn2RM;;IAEE,8BAAiC;EvEq2RzC;EuEn2RM;;IAEE,+BAAkC;EvEq2R1C;EuEn2RM;;IAEE,6BAAgC;EvEq2RxC;EuEp3RM;IAAwB,0BAA2B;EvEu3RzD;EuEt3RM;;IAEE,8BAA+B;EvEw3RvC;EuEt3RM;;IAEE,gCAAiC;EvEw3RzC;EuEt3RM;;IAEE,iCAAkC;EvEw3R1C;EuEt3RM;;IAEE,+BAAgC;EvEw3RxC;EuEv4RM;IAAwB,wBAA2B;EvE04RzD;EuEz4RM;;IAEE,4BAA+B;EvE24RvC;EuEz4RM;;IAEE,8BAAiC;EvE24RzC;EuEz4RM;;IAEE,+BAAkC;EvE24R1C;EuEz4RM;;IAEE,6BAAgC;EvE24RxC;EuEr4RE;IAAmB,uBAAuB;EvEw4R5C;EuEv4RE;;IAEE,2BAA2B;EvEy4R/B;EuEv4RE;;IAEE,6BAA6B;EvEy4RjC;EuEv4RE;;IAEE,8BAA8B;EvEy4RlC;EuEv4RE;;IAEE,4BAA4B;EvEy4RhC;AACF;;AwEz8RA;EAAkB,4GAA8C;AxE68RhE;;AwEz8RA;EAAiB,8BAA8B;AxE68R/C;;AwE58RA;EAAiB,8BAA8B;AxEg9R/C;;AwE/8RA;EAAiB,8BAA8B;AxEm9R/C;;AwEl9RA;ECTE,gBAAgB;EAChB,uBAAuB;EACvB,mBAAmB;AzE+9RrB;;AwEh9RI;EAAwB,2BAA2B;AxEo9RvD;;AwEn9RI;EAAwB,4BAA4B;AxEu9RxD;;AwEt9RI;EAAwB,6BAA6B;AxE09RzD;;Acr7RI;E0DvCA;IAAwB,2BAA2B;ExEi+RrD;EwEh+RE;IAAwB,4BAA4B;ExEm+RtD;EwEl+RE;IAAwB,6BAA6B;ExEq+RvD;AACF;;Acj8RI;E0DvCA;IAAwB,2BAA2B;ExE6+RrD;EwE5+RE;IAAwB,4BAA4B;ExE++RtD;EwE9+RE;IAAwB,6BAA6B;ExEi/RvD;AACF;;Ac78RI;E0DvCA;IAAwB,2BAA2B;ExEy/RrD;EwEx/RE;IAAwB,4BAA4B;ExE2/RtD;EwE1/RE;IAAwB,6BAA6B;ExE6/RvD;AACF;;Acz9RI;E0DvCA;IAAwB,2BAA2B;ExEqgSrD;EwEpgSE;IAAwB,4BAA4B;ExEugStD;EwEtgSE;IAAwB,6BAA6B;ExEygSvD;AACF;;AwEpgSA;EAAmB,oCAAoC;AxEwgSvD;;AwEvgSA;EAAmB,oCAAoC;AxE2gSvD;;AwE1gSA;EAAmB,qCAAqC;AxE8gSxD;;AwE1gSA;EAAuB,2BAA0C;AxE8gSjE;;AwE7gSA;EAAuB,+BAA4C;AxEihSnE;;AwEhhSA;EAAuB,2BAA2C;AxEohSlE;;AwEnhSA;EAAuB,2BAAyC;AxEuhShE;;AwEthSA;EAAuB,8BAA2C;AxE0hSlE;;AwEzhSA;EAAuB,6BAA6B;AxE6hSpD;;AwEzhSA;EAAc,sBAAwB;AxE6hStC;;A0EpkSE;EACE,yBAAwB;A1EukS5B;;AK7jSE;EqELM,yBAA0E;A1EskSlF;;A0E5kSE;EACE,yBAAwB;A1E+kS5B;;AKrkSE;EqELM,yBAA0E;A1E8kSlF;;A0EplSE;EACE,yBAAwB;A1EulS5B;;AK7kSE;EqELM,yBAA0E;A1EslSlF;;A0E5lSE;EACE,yBAAwB;A1E+lS5B;;AKrlSE;EqELM,yBAA0E;A1E8lSlF;;A0EpmSE;EACE,yBAAwB;A1EumS5B;;AK7lSE;EqELM,yBAA0E;A1EsmSlF;;A0E5mSE;EACE,yBAAwB;A1E+mS5B;;AKrmSE;EqELM,yBAA0E;A1E8mSlF;;A0EpnSE;EACE,yBAAwB;A1EunS5B;;AK7mSE;EqELM,yBAA0E;A1EsnSlF;;A0E5nSE;EACE,yBAAwB;A1E+nS5B;;AKrnSE;EqELM,yBAA0E;A1E8nSlF;;AwEvlSA;EAAa,yBAA6B;AxE2lS1C;;AwE1lSA;EAAc,yBAA6B;AxE8lS3C;;AwE5lSA;EAAiB,oCAAkC;AxEgmSnD;;AwE/lSA;EAAiB,0CAAkC;AxEmmSnD;;AwE/lSA;EGvDE,WAAW;EACX,kBAAkB;EAClB,iBAAiB;EACjB,6BAA6B;EAC7B,SAAS;A3E0pSX;;AwEnmSA;EAAwB,gCAAgC;AxEumSxD;;AwErmSA;EACE,iCAAiC;EACjC,oCAAoC;AxEwmStC;;AwEnmSA;EAAc,yBAAyB;AxEumSvC;;A4ExqSA;EACE,8BAA8B;A5E2qShC;;A4ExqSA;EACE,6BAA6B;A5E2qS/B;;A6E3qSE;E3EOF;;;I2EDM,4BAA4B;IAE5B,2BAA2B;E7E2qS/B;E6ExqSE;IAEI,0BAA0B;E7EyqShC;E6EhqSE;IACE,6BAA6B;E7EkqSjC;EEn+RF;I2EhLM,gCAAgC;E7EspSpC;E6EppSE;;IAEE,yB1EzCY;I0E0CZ,wBAAwB;E7EspS5B;E6E9oSE;IACE,2BAA2B;E7EgpS/B;E6E7oSE;;IAEE,wBAAwB;E7E+oS5B;E6E5oSE;;;IAGE,UAAU;IACV,SAAS;E7E8oSb;E6E3oSE;;IAEE,uBAAuB;E7E6oS3B;E6EroSE;IACE,Q1EwgCgC;EH+nQpC;EEnrSF;I2E+CM,2BAA2C;E7EuoS/C;EY9tSA;IiE0FI,2BAA2C;E7EuoS/C;EiCrtSF;I4CmFM,aAAa;E7EqoSjB;EsCpuSF;IuCkGM,sB1EtFS;EH2tSb;EgBxuSF;I6DuGM,oCAAoC;E7EooSxC;E6EroSE;;IAKI,iCAAmC;E7EooSzC;EgBvsSF;;I6D0EQ,oCAAsC;E7EioS5C;EgBtnSF;I6DNM,cAAc;E7E+nSlB;EiBrvSA;;;;I4D4HM,qB1EvHU;EHsvShB;EgBjpSF;I6DuBM,cAAc;IACd,qB1E7HY;EH0vShB;AACF\",\"file\":\"bootstrap.css\",\"sourcesContent\":[\"/*!\\n * Bootstrap v4.3.1 (https://getbootstrap.com/)\\n * Copyright 2011-2019 The Bootstrap Authors\\n * Copyright 2011-2019 Twitter, Inc.\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n */\\n\\n@import \\\"functions\\\";\\n@import \\\"variables\\\";\\n@import \\\"mixins\\\";\\n@import \\\"root\\\";\\n@import \\\"reboot\\\";\\n@import \\\"type\\\";\\n@import \\\"images\\\";\\n@import \\\"code\\\";\\n@import \\\"grid\\\";\\n@import \\\"tables\\\";\\n@import \\\"forms\\\";\\n@import \\\"buttons\\\";\\n@import \\\"transitions\\\";\\n@import \\\"dropdown\\\";\\n@import \\\"button-group\\\";\\n@import \\\"input-group\\\";\\n@import \\\"custom-forms\\\";\\n@import \\\"nav\\\";\\n@import \\\"navbar\\\";\\n@import \\\"card\\\";\\n@import \\\"breadcrumb\\\";\\n@import \\\"pagination\\\";\\n@import \\\"badge\\\";\\n@import \\\"jumbotron\\\";\\n@import \\\"alert\\\";\\n@import \\\"progress\\\";\\n@import \\\"media\\\";\\n@import \\\"list-group\\\";\\n@import \\\"close\\\";\\n@import \\\"toasts\\\";\\n@import \\\"modal\\\";\\n@import \\\"tooltip\\\";\\n@import \\\"popover\\\";\\n@import \\\"carousel\\\";\\n@import \\\"spinners\\\";\\n@import \\\"utilities\\\";\\n@import \\\"print\\\";\\n\",\"/*!\\n * Bootstrap v4.3.1 (https://getbootstrap.com/)\\n * Copyright 2011-2019 The Bootstrap Authors\\n * Copyright 2011-2019 Twitter, Inc.\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n */\\n:root {\\n  --blue: #007bff;\\n  --indigo: #6610f2;\\n  --purple: #6f42c1;\\n  --pink: #e83e8c;\\n  --red: #dc3545;\\n  --orange: #fd7e14;\\n  --yellow: #ffc107;\\n  --green: #28a745;\\n  --teal: #20c997;\\n  --cyan: #17a2b8;\\n  --white: #fff;\\n  --gray: #6c757d;\\n  --gray-dark: #343a40;\\n  --primary: #007bff;\\n  --secondary: #6c757d;\\n  --success: #28a745;\\n  --info: #17a2b8;\\n  --warning: #ffc107;\\n  --danger: #dc3545;\\n  --light: #f8f9fa;\\n  --dark: #343a40;\\n  --breakpoint-xs: 0;\\n  --breakpoint-sm: 576px;\\n  --breakpoint-md: 768px;\\n  --breakpoint-lg: 992px;\\n  --breakpoint-xl: 1200px;\\n  --font-family-sans-serif: -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, \\\"Helvetica Neue\\\", Arial, \\\"Noto Sans\\\", sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\";\\n  --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace;\\n}\\n\\n*,\\n*::before,\\n*::after {\\n  box-sizing: border-box;\\n}\\n\\nhtml {\\n  font-family: sans-serif;\\n  line-height: 1.15;\\n  -webkit-text-size-adjust: 100%;\\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\\n}\\n\\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\\n  display: block;\\n}\\n\\nbody {\\n  margin: 0;\\n  font-family: -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, \\\"Helvetica Neue\\\", Arial, \\\"Noto Sans\\\", sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\";\\n  font-size: 1rem;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  color: #212529;\\n  text-align: left;\\n  background-color: #fff;\\n}\\n\\n[tabindex=\\\"-1\\\"]:focus {\\n  outline: 0 !important;\\n}\\n\\nhr {\\n  box-sizing: content-box;\\n  height: 0;\\n  overflow: visible;\\n}\\n\\nh1, h2, h3, h4, h5, h6 {\\n  margin-top: 0;\\n  margin-bottom: 0.5rem;\\n}\\n\\np {\\n  margin-top: 0;\\n  margin-bottom: 1rem;\\n}\\n\\nabbr[title],\\nabbr[data-original-title] {\\n  text-decoration: underline;\\n  text-decoration: underline dotted;\\n  cursor: help;\\n  border-bottom: 0;\\n  text-decoration-skip-ink: none;\\n}\\n\\naddress {\\n  margin-bottom: 1rem;\\n  font-style: normal;\\n  line-height: inherit;\\n}\\n\\nol,\\nul,\\ndl {\\n  margin-top: 0;\\n  margin-bottom: 1rem;\\n}\\n\\nol ol,\\nul ul,\\nol ul,\\nul ol {\\n  margin-bottom: 0;\\n}\\n\\ndt {\\n  font-weight: 700;\\n}\\n\\ndd {\\n  margin-bottom: .5rem;\\n  margin-left: 0;\\n}\\n\\nblockquote {\\n  margin: 0 0 1rem;\\n}\\n\\nb,\\nstrong {\\n  font-weight: bolder;\\n}\\n\\nsmall {\\n  font-size: 80%;\\n}\\n\\nsub,\\nsup {\\n  position: relative;\\n  font-size: 75%;\\n  line-height: 0;\\n  vertical-align: baseline;\\n}\\n\\nsub {\\n  bottom: -.25em;\\n}\\n\\nsup {\\n  top: -.5em;\\n}\\n\\na {\\n  color: #007bff;\\n  text-decoration: none;\\n  background-color: transparent;\\n}\\n\\na:hover {\\n  color: #0056b3;\\n  text-decoration: underline;\\n}\\n\\na:not([href]):not([tabindex]) {\\n  color: inherit;\\n  text-decoration: none;\\n}\\n\\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\\n  color: inherit;\\n  text-decoration: none;\\n}\\n\\na:not([href]):not([tabindex]):focus {\\n  outline: 0;\\n}\\n\\npre,\\ncode,\\nkbd,\\nsamp {\\n  font-family: SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace;\\n  font-size: 1em;\\n}\\n\\npre {\\n  margin-top: 0;\\n  margin-bottom: 1rem;\\n  overflow: auto;\\n}\\n\\nfigure {\\n  margin: 0 0 1rem;\\n}\\n\\nimg {\\n  vertical-align: middle;\\n  border-style: none;\\n}\\n\\nsvg {\\n  overflow: hidden;\\n  vertical-align: middle;\\n}\\n\\ntable {\\n  border-collapse: collapse;\\n}\\n\\ncaption {\\n  padding-top: 0.75rem;\\n  padding-bottom: 0.75rem;\\n  color: #6c757d;\\n  text-align: left;\\n  caption-side: bottom;\\n}\\n\\nth {\\n  text-align: inherit;\\n}\\n\\nlabel {\\n  display: inline-block;\\n  margin-bottom: 0.5rem;\\n}\\n\\nbutton {\\n  border-radius: 0;\\n}\\n\\nbutton:focus {\\n  outline: 1px dotted;\\n  outline: 5px auto -webkit-focus-ring-color;\\n}\\n\\ninput,\\nbutton,\\nselect,\\noptgroup,\\ntextarea {\\n  margin: 0;\\n  font-family: inherit;\\n  font-size: inherit;\\n  line-height: inherit;\\n}\\n\\nbutton,\\ninput {\\n  overflow: visible;\\n}\\n\\nbutton,\\nselect {\\n  text-transform: none;\\n}\\n\\nselect {\\n  word-wrap: normal;\\n}\\n\\nbutton,\\n[type=\\\"button\\\"],\\n[type=\\\"reset\\\"],\\n[type=\\\"submit\\\"] {\\n  -webkit-appearance: button;\\n}\\n\\nbutton:not(:disabled),\\n[type=\\\"button\\\"]:not(:disabled),\\n[type=\\\"reset\\\"]:not(:disabled),\\n[type=\\\"submit\\\"]:not(:disabled) {\\n  cursor: pointer;\\n}\\n\\nbutton::-moz-focus-inner,\\n[type=\\\"button\\\"]::-moz-focus-inner,\\n[type=\\\"reset\\\"]::-moz-focus-inner,\\n[type=\\\"submit\\\"]::-moz-focus-inner {\\n  padding: 0;\\n  border-style: none;\\n}\\n\\ninput[type=\\\"radio\\\"],\\ninput[type=\\\"checkbox\\\"] {\\n  box-sizing: border-box;\\n  padding: 0;\\n}\\n\\ninput[type=\\\"date\\\"],\\ninput[type=\\\"time\\\"],\\ninput[type=\\\"datetime-local\\\"],\\ninput[type=\\\"month\\\"] {\\n  -webkit-appearance: listbox;\\n}\\n\\ntextarea {\\n  overflow: auto;\\n  resize: vertical;\\n}\\n\\nfieldset {\\n  min-width: 0;\\n  padding: 0;\\n  margin: 0;\\n  border: 0;\\n}\\n\\nlegend {\\n  display: block;\\n  width: 100%;\\n  max-width: 100%;\\n  padding: 0;\\n  margin-bottom: .5rem;\\n  font-size: 1.5rem;\\n  line-height: inherit;\\n  color: inherit;\\n  white-space: normal;\\n}\\n\\nprogress {\\n  vertical-align: baseline;\\n}\\n\\n[type=\\\"number\\\"]::-webkit-inner-spin-button,\\n[type=\\\"number\\\"]::-webkit-outer-spin-button {\\n  height: auto;\\n}\\n\\n[type=\\\"search\\\"] {\\n  outline-offset: -2px;\\n  -webkit-appearance: none;\\n}\\n\\n[type=\\\"search\\\"]::-webkit-search-decoration {\\n  -webkit-appearance: none;\\n}\\n\\n::-webkit-file-upload-button {\\n  font: inherit;\\n  -webkit-appearance: button;\\n}\\n\\noutput {\\n  display: inline-block;\\n}\\n\\nsummary {\\n  display: list-item;\\n  cursor: pointer;\\n}\\n\\ntemplate {\\n  display: none;\\n}\\n\\n[hidden] {\\n  display: none !important;\\n}\\n\\nh1, h2, h3, h4, h5, h6,\\n.h1, .h2, .h3, .h4, .h5, .h6 {\\n  margin-bottom: 0.5rem;\\n  font-weight: 500;\\n  line-height: 1.2;\\n}\\n\\nh1, .h1 {\\n  font-size: 2.5rem;\\n}\\n\\nh2, .h2 {\\n  font-size: 2rem;\\n}\\n\\nh3, .h3 {\\n  font-size: 1.75rem;\\n}\\n\\nh4, .h4 {\\n  font-size: 1.5rem;\\n}\\n\\nh5, .h5 {\\n  font-size: 1.25rem;\\n}\\n\\nh6, .h6 {\\n  font-size: 1rem;\\n}\\n\\n.lead {\\n  font-size: 1.25rem;\\n  font-weight: 300;\\n}\\n\\n.display-1 {\\n  font-size: 6rem;\\n  font-weight: 300;\\n  line-height: 1.2;\\n}\\n\\n.display-2 {\\n  font-size: 5.5rem;\\n  font-weight: 300;\\n  line-height: 1.2;\\n}\\n\\n.display-3 {\\n  font-size: 4.5rem;\\n  font-weight: 300;\\n  line-height: 1.2;\\n}\\n\\n.display-4 {\\n  font-size: 3.5rem;\\n  font-weight: 300;\\n  line-height: 1.2;\\n}\\n\\nhr {\\n  margin-top: 1rem;\\n  margin-bottom: 1rem;\\n  border: 0;\\n  border-top: 1px solid rgba(0, 0, 0, 0.1);\\n}\\n\\nsmall,\\n.small {\\n  font-size: 80%;\\n  font-weight: 400;\\n}\\n\\nmark,\\n.mark {\\n  padding: 0.2em;\\n  background-color: #fcf8e3;\\n}\\n\\n.list-unstyled {\\n  padding-left: 0;\\n  list-style: none;\\n}\\n\\n.list-inline {\\n  padding-left: 0;\\n  list-style: none;\\n}\\n\\n.list-inline-item {\\n  display: inline-block;\\n}\\n\\n.list-inline-item:not(:last-child) {\\n  margin-right: 0.5rem;\\n}\\n\\n.initialism {\\n  font-size: 90%;\\n  text-transform: uppercase;\\n}\\n\\n.blockquote {\\n  margin-bottom: 1rem;\\n  font-size: 1.25rem;\\n}\\n\\n.blockquote-footer {\\n  display: block;\\n  font-size: 80%;\\n  color: #6c757d;\\n}\\n\\n.blockquote-footer::before {\\n  content: \\\"\\\\2014\\\\00A0\\\";\\n}\\n\\n.img-fluid {\\n  max-width: 100%;\\n  height: auto;\\n}\\n\\n.img-thumbnail {\\n  padding: 0.25rem;\\n  background-color: #fff;\\n  border: 1px solid #dee2e6;\\n  border-radius: 0.25rem;\\n  max-width: 100%;\\n  height: auto;\\n}\\n\\n.figure {\\n  display: inline-block;\\n}\\n\\n.figure-img {\\n  margin-bottom: 0.5rem;\\n  line-height: 1;\\n}\\n\\n.figure-caption {\\n  font-size: 90%;\\n  color: #6c757d;\\n}\\n\\ncode {\\n  font-size: 87.5%;\\n  color: #e83e8c;\\n  word-break: break-word;\\n}\\n\\na > code {\\n  color: inherit;\\n}\\n\\nkbd {\\n  padding: 0.2rem 0.4rem;\\n  font-size: 87.5%;\\n  color: #fff;\\n  background-color: #212529;\\n  border-radius: 0.2rem;\\n}\\n\\nkbd kbd {\\n  padding: 0;\\n  font-size: 100%;\\n  font-weight: 700;\\n}\\n\\npre {\\n  display: block;\\n  font-size: 87.5%;\\n  color: #212529;\\n}\\n\\npre code {\\n  font-size: inherit;\\n  color: inherit;\\n  word-break: normal;\\n}\\n\\n.pre-scrollable {\\n  max-height: 340px;\\n  overflow-y: scroll;\\n}\\n\\n.container {\\n  width: 100%;\\n  padding-right: 15px;\\n  padding-left: 15px;\\n  margin-right: auto;\\n  margin-left: auto;\\n}\\n\\n@media (min-width: 576px) {\\n  .container {\\n    max-width: 540px;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .container {\\n    max-width: 720px;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .container {\\n    max-width: 960px;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .container {\\n    max-width: 1140px;\\n  }\\n}\\n\\n.container-fluid {\\n  width: 100%;\\n  padding-right: 15px;\\n  padding-left: 15px;\\n  margin-right: auto;\\n  margin-left: auto;\\n}\\n\\n.row {\\n  display: flex;\\n  flex-wrap: wrap;\\n  margin-right: -15px;\\n  margin-left: -15px;\\n}\\n\\n.no-gutters {\\n  margin-right: 0;\\n  margin-left: 0;\\n}\\n\\n.no-gutters > .col,\\n.no-gutters > [class*=\\\"col-\\\"] {\\n  padding-right: 0;\\n  padding-left: 0;\\n}\\n\\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\\n.col-xl-auto {\\n  position: relative;\\n  width: 100%;\\n  padding-right: 15px;\\n  padding-left: 15px;\\n}\\n\\n.col {\\n  flex-basis: 0;\\n  flex-grow: 1;\\n  max-width: 100%;\\n}\\n\\n.col-auto {\\n  flex: 0 0 auto;\\n  width: auto;\\n  max-width: 100%;\\n}\\n\\n.col-1 {\\n  flex: 0 0 8.333333%;\\n  max-width: 8.333333%;\\n}\\n\\n.col-2 {\\n  flex: 0 0 16.666667%;\\n  max-width: 16.666667%;\\n}\\n\\n.col-3 {\\n  flex: 0 0 25%;\\n  max-width: 25%;\\n}\\n\\n.col-4 {\\n  flex: 0 0 33.333333%;\\n  max-width: 33.333333%;\\n}\\n\\n.col-5 {\\n  flex: 0 0 41.666667%;\\n  max-width: 41.666667%;\\n}\\n\\n.col-6 {\\n  flex: 0 0 50%;\\n  max-width: 50%;\\n}\\n\\n.col-7 {\\n  flex: 0 0 58.333333%;\\n  max-width: 58.333333%;\\n}\\n\\n.col-8 {\\n  flex: 0 0 66.666667%;\\n  max-width: 66.666667%;\\n}\\n\\n.col-9 {\\n  flex: 0 0 75%;\\n  max-width: 75%;\\n}\\n\\n.col-10 {\\n  flex: 0 0 83.333333%;\\n  max-width: 83.333333%;\\n}\\n\\n.col-11 {\\n  flex: 0 0 91.666667%;\\n  max-width: 91.666667%;\\n}\\n\\n.col-12 {\\n  flex: 0 0 100%;\\n  max-width: 100%;\\n}\\n\\n.order-first {\\n  order: -1;\\n}\\n\\n.order-last {\\n  order: 13;\\n}\\n\\n.order-0 {\\n  order: 0;\\n}\\n\\n.order-1 {\\n  order: 1;\\n}\\n\\n.order-2 {\\n  order: 2;\\n}\\n\\n.order-3 {\\n  order: 3;\\n}\\n\\n.order-4 {\\n  order: 4;\\n}\\n\\n.order-5 {\\n  order: 5;\\n}\\n\\n.order-6 {\\n  order: 6;\\n}\\n\\n.order-7 {\\n  order: 7;\\n}\\n\\n.order-8 {\\n  order: 8;\\n}\\n\\n.order-9 {\\n  order: 9;\\n}\\n\\n.order-10 {\\n  order: 10;\\n}\\n\\n.order-11 {\\n  order: 11;\\n}\\n\\n.order-12 {\\n  order: 12;\\n}\\n\\n.offset-1 {\\n  margin-left: 8.333333%;\\n}\\n\\n.offset-2 {\\n  margin-left: 16.666667%;\\n}\\n\\n.offset-3 {\\n  margin-left: 25%;\\n}\\n\\n.offset-4 {\\n  margin-left: 33.333333%;\\n}\\n\\n.offset-5 {\\n  margin-left: 41.666667%;\\n}\\n\\n.offset-6 {\\n  margin-left: 50%;\\n}\\n\\n.offset-7 {\\n  margin-left: 58.333333%;\\n}\\n\\n.offset-8 {\\n  margin-left: 66.666667%;\\n}\\n\\n.offset-9 {\\n  margin-left: 75%;\\n}\\n\\n.offset-10 {\\n  margin-left: 83.333333%;\\n}\\n\\n.offset-11 {\\n  margin-left: 91.666667%;\\n}\\n\\n@media (min-width: 576px) {\\n  .col-sm {\\n    flex-basis: 0;\\n    flex-grow: 1;\\n    max-width: 100%;\\n  }\\n  .col-sm-auto {\\n    flex: 0 0 auto;\\n    width: auto;\\n    max-width: 100%;\\n  }\\n  .col-sm-1 {\\n    flex: 0 0 8.333333%;\\n    max-width: 8.333333%;\\n  }\\n  .col-sm-2 {\\n    flex: 0 0 16.666667%;\\n    max-width: 16.666667%;\\n  }\\n  .col-sm-3 {\\n    flex: 0 0 25%;\\n    max-width: 25%;\\n  }\\n  .col-sm-4 {\\n    flex: 0 0 33.333333%;\\n    max-width: 33.333333%;\\n  }\\n  .col-sm-5 {\\n    flex: 0 0 41.666667%;\\n    max-width: 41.666667%;\\n  }\\n  .col-sm-6 {\\n    flex: 0 0 50%;\\n    max-width: 50%;\\n  }\\n  .col-sm-7 {\\n    flex: 0 0 58.333333%;\\n    max-width: 58.333333%;\\n  }\\n  .col-sm-8 {\\n    flex: 0 0 66.666667%;\\n    max-width: 66.666667%;\\n  }\\n  .col-sm-9 {\\n    flex: 0 0 75%;\\n    max-width: 75%;\\n  }\\n  .col-sm-10 {\\n    flex: 0 0 83.333333%;\\n    max-width: 83.333333%;\\n  }\\n  .col-sm-11 {\\n    flex: 0 0 91.666667%;\\n    max-width: 91.666667%;\\n  }\\n  .col-sm-12 {\\n    flex: 0 0 100%;\\n    max-width: 100%;\\n  }\\n  .order-sm-first {\\n    order: -1;\\n  }\\n  .order-sm-last {\\n    order: 13;\\n  }\\n  .order-sm-0 {\\n    order: 0;\\n  }\\n  .order-sm-1 {\\n    order: 1;\\n  }\\n  .order-sm-2 {\\n    order: 2;\\n  }\\n  .order-sm-3 {\\n    order: 3;\\n  }\\n  .order-sm-4 {\\n    order: 4;\\n  }\\n  .order-sm-5 {\\n    order: 5;\\n  }\\n  .order-sm-6 {\\n    order: 6;\\n  }\\n  .order-sm-7 {\\n    order: 7;\\n  }\\n  .order-sm-8 {\\n    order: 8;\\n  }\\n  .order-sm-9 {\\n    order: 9;\\n  }\\n  .order-sm-10 {\\n    order: 10;\\n  }\\n  .order-sm-11 {\\n    order: 11;\\n  }\\n  .order-sm-12 {\\n    order: 12;\\n  }\\n  .offset-sm-0 {\\n    margin-left: 0;\\n  }\\n  .offset-sm-1 {\\n    margin-left: 8.333333%;\\n  }\\n  .offset-sm-2 {\\n    margin-left: 16.666667%;\\n  }\\n  .offset-sm-3 {\\n    margin-left: 25%;\\n  }\\n  .offset-sm-4 {\\n    margin-left: 33.333333%;\\n  }\\n  .offset-sm-5 {\\n    margin-left: 41.666667%;\\n  }\\n  .offset-sm-6 {\\n    margin-left: 50%;\\n  }\\n  .offset-sm-7 {\\n    margin-left: 58.333333%;\\n  }\\n  .offset-sm-8 {\\n    margin-left: 66.666667%;\\n  }\\n  .offset-sm-9 {\\n    margin-left: 75%;\\n  }\\n  .offset-sm-10 {\\n    margin-left: 83.333333%;\\n  }\\n  .offset-sm-11 {\\n    margin-left: 91.666667%;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .col-md {\\n    flex-basis: 0;\\n    flex-grow: 1;\\n    max-width: 100%;\\n  }\\n  .col-md-auto {\\n    flex: 0 0 auto;\\n    width: auto;\\n    max-width: 100%;\\n  }\\n  .col-md-1 {\\n    flex: 0 0 8.333333%;\\n    max-width: 8.333333%;\\n  }\\n  .col-md-2 {\\n    flex: 0 0 16.666667%;\\n    max-width: 16.666667%;\\n  }\\n  .col-md-3 {\\n    flex: 0 0 25%;\\n    max-width: 25%;\\n  }\\n  .col-md-4 {\\n    flex: 0 0 33.333333%;\\n    max-width: 33.333333%;\\n  }\\n  .col-md-5 {\\n    flex: 0 0 41.666667%;\\n    max-width: 41.666667%;\\n  }\\n  .col-md-6 {\\n    flex: 0 0 50%;\\n    max-width: 50%;\\n  }\\n  .col-md-7 {\\n    flex: 0 0 58.333333%;\\n    max-width: 58.333333%;\\n  }\\n  .col-md-8 {\\n    flex: 0 0 66.666667%;\\n    max-width: 66.666667%;\\n  }\\n  .col-md-9 {\\n    flex: 0 0 75%;\\n    max-width: 75%;\\n  }\\n  .col-md-10 {\\n    flex: 0 0 83.333333%;\\n    max-width: 83.333333%;\\n  }\\n  .col-md-11 {\\n    flex: 0 0 91.666667%;\\n    max-width: 91.666667%;\\n  }\\n  .col-md-12 {\\n    flex: 0 0 100%;\\n    max-width: 100%;\\n  }\\n  .order-md-first {\\n    order: -1;\\n  }\\n  .order-md-last {\\n    order: 13;\\n  }\\n  .order-md-0 {\\n    order: 0;\\n  }\\n  .order-md-1 {\\n    order: 1;\\n  }\\n  .order-md-2 {\\n    order: 2;\\n  }\\n  .order-md-3 {\\n    order: 3;\\n  }\\n  .order-md-4 {\\n    order: 4;\\n  }\\n  .order-md-5 {\\n    order: 5;\\n  }\\n  .order-md-6 {\\n    order: 6;\\n  }\\n  .order-md-7 {\\n    order: 7;\\n  }\\n  .order-md-8 {\\n    order: 8;\\n  }\\n  .order-md-9 {\\n    order: 9;\\n  }\\n  .order-md-10 {\\n    order: 10;\\n  }\\n  .order-md-11 {\\n    order: 11;\\n  }\\n  .order-md-12 {\\n    order: 12;\\n  }\\n  .offset-md-0 {\\n    margin-left: 0;\\n  }\\n  .offset-md-1 {\\n    margin-left: 8.333333%;\\n  }\\n  .offset-md-2 {\\n    margin-left: 16.666667%;\\n  }\\n  .offset-md-3 {\\n    margin-left: 25%;\\n  }\\n  .offset-md-4 {\\n    margin-left: 33.333333%;\\n  }\\n  .offset-md-5 {\\n    margin-left: 41.666667%;\\n  }\\n  .offset-md-6 {\\n    margin-left: 50%;\\n  }\\n  .offset-md-7 {\\n    margin-left: 58.333333%;\\n  }\\n  .offset-md-8 {\\n    margin-left: 66.666667%;\\n  }\\n  .offset-md-9 {\\n    margin-left: 75%;\\n  }\\n  .offset-md-10 {\\n    margin-left: 83.333333%;\\n  }\\n  .offset-md-11 {\\n    margin-left: 91.666667%;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .col-lg {\\n    flex-basis: 0;\\n    flex-grow: 1;\\n    max-width: 100%;\\n  }\\n  .col-lg-auto {\\n    flex: 0 0 auto;\\n    width: auto;\\n    max-width: 100%;\\n  }\\n  .col-lg-1 {\\n    flex: 0 0 8.333333%;\\n    max-width: 8.333333%;\\n  }\\n  .col-lg-2 {\\n    flex: 0 0 16.666667%;\\n    max-width: 16.666667%;\\n  }\\n  .col-lg-3 {\\n    flex: 0 0 25%;\\n    max-width: 25%;\\n  }\\n  .col-lg-4 {\\n    flex: 0 0 33.333333%;\\n    max-width: 33.333333%;\\n  }\\n  .col-lg-5 {\\n    flex: 0 0 41.666667%;\\n    max-width: 41.666667%;\\n  }\\n  .col-lg-6 {\\n    flex: 0 0 50%;\\n    max-width: 50%;\\n  }\\n  .col-lg-7 {\\n    flex: 0 0 58.333333%;\\n    max-width: 58.333333%;\\n  }\\n  .col-lg-8 {\\n    flex: 0 0 66.666667%;\\n    max-width: 66.666667%;\\n  }\\n  .col-lg-9 {\\n    flex: 0 0 75%;\\n    max-width: 75%;\\n  }\\n  .col-lg-10 {\\n    flex: 0 0 83.333333%;\\n    max-width: 83.333333%;\\n  }\\n  .col-lg-11 {\\n    flex: 0 0 91.666667%;\\n    max-width: 91.666667%;\\n  }\\n  .col-lg-12 {\\n    flex: 0 0 100%;\\n    max-width: 100%;\\n  }\\n  .order-lg-first {\\n    order: -1;\\n  }\\n  .order-lg-last {\\n    order: 13;\\n  }\\n  .order-lg-0 {\\n    order: 0;\\n  }\\n  .order-lg-1 {\\n    order: 1;\\n  }\\n  .order-lg-2 {\\n    order: 2;\\n  }\\n  .order-lg-3 {\\n    order: 3;\\n  }\\n  .order-lg-4 {\\n    order: 4;\\n  }\\n  .order-lg-5 {\\n    order: 5;\\n  }\\n  .order-lg-6 {\\n    order: 6;\\n  }\\n  .order-lg-7 {\\n    order: 7;\\n  }\\n  .order-lg-8 {\\n    order: 8;\\n  }\\n  .order-lg-9 {\\n    order: 9;\\n  }\\n  .order-lg-10 {\\n    order: 10;\\n  }\\n  .order-lg-11 {\\n    order: 11;\\n  }\\n  .order-lg-12 {\\n    order: 12;\\n  }\\n  .offset-lg-0 {\\n    margin-left: 0;\\n  }\\n  .offset-lg-1 {\\n    margin-left: 8.333333%;\\n  }\\n  .offset-lg-2 {\\n    margin-left: 16.666667%;\\n  }\\n  .offset-lg-3 {\\n    margin-left: 25%;\\n  }\\n  .offset-lg-4 {\\n    margin-left: 33.333333%;\\n  }\\n  .offset-lg-5 {\\n    margin-left: 41.666667%;\\n  }\\n  .offset-lg-6 {\\n    margin-left: 50%;\\n  }\\n  .offset-lg-7 {\\n    margin-left: 58.333333%;\\n  }\\n  .offset-lg-8 {\\n    margin-left: 66.666667%;\\n  }\\n  .offset-lg-9 {\\n    margin-left: 75%;\\n  }\\n  .offset-lg-10 {\\n    margin-left: 83.333333%;\\n  }\\n  .offset-lg-11 {\\n    margin-left: 91.666667%;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .col-xl {\\n    flex-basis: 0;\\n    flex-grow: 1;\\n    max-width: 100%;\\n  }\\n  .col-xl-auto {\\n    flex: 0 0 auto;\\n    width: auto;\\n    max-width: 100%;\\n  }\\n  .col-xl-1 {\\n    flex: 0 0 8.333333%;\\n    max-width: 8.333333%;\\n  }\\n  .col-xl-2 {\\n    flex: 0 0 16.666667%;\\n    max-width: 16.666667%;\\n  }\\n  .col-xl-3 {\\n    flex: 0 0 25%;\\n    max-width: 25%;\\n  }\\n  .col-xl-4 {\\n    flex: 0 0 33.333333%;\\n    max-width: 33.333333%;\\n  }\\n  .col-xl-5 {\\n    flex: 0 0 41.666667%;\\n    max-width: 41.666667%;\\n  }\\n  .col-xl-6 {\\n    flex: 0 0 50%;\\n    max-width: 50%;\\n  }\\n  .col-xl-7 {\\n    flex: 0 0 58.333333%;\\n    max-width: 58.333333%;\\n  }\\n  .col-xl-8 {\\n    flex: 0 0 66.666667%;\\n    max-width: 66.666667%;\\n  }\\n  .col-xl-9 {\\n    flex: 0 0 75%;\\n    max-width: 75%;\\n  }\\n  .col-xl-10 {\\n    flex: 0 0 83.333333%;\\n    max-width: 83.333333%;\\n  }\\n  .col-xl-11 {\\n    flex: 0 0 91.666667%;\\n    max-width: 91.666667%;\\n  }\\n  .col-xl-12 {\\n    flex: 0 0 100%;\\n    max-width: 100%;\\n  }\\n  .order-xl-first {\\n    order: -1;\\n  }\\n  .order-xl-last {\\n    order: 13;\\n  }\\n  .order-xl-0 {\\n    order: 0;\\n  }\\n  .order-xl-1 {\\n    order: 1;\\n  }\\n  .order-xl-2 {\\n    order: 2;\\n  }\\n  .order-xl-3 {\\n    order: 3;\\n  }\\n  .order-xl-4 {\\n    order: 4;\\n  }\\n  .order-xl-5 {\\n    order: 5;\\n  }\\n  .order-xl-6 {\\n    order: 6;\\n  }\\n  .order-xl-7 {\\n    order: 7;\\n  }\\n  .order-xl-8 {\\n    order: 8;\\n  }\\n  .order-xl-9 {\\n    order: 9;\\n  }\\n  .order-xl-10 {\\n    order: 10;\\n  }\\n  .order-xl-11 {\\n    order: 11;\\n  }\\n  .order-xl-12 {\\n    order: 12;\\n  }\\n  .offset-xl-0 {\\n    margin-left: 0;\\n  }\\n  .offset-xl-1 {\\n    margin-left: 8.333333%;\\n  }\\n  .offset-xl-2 {\\n    margin-left: 16.666667%;\\n  }\\n  .offset-xl-3 {\\n    margin-left: 25%;\\n  }\\n  .offset-xl-4 {\\n    margin-left: 33.333333%;\\n  }\\n  .offset-xl-5 {\\n    margin-left: 41.666667%;\\n  }\\n  .offset-xl-6 {\\n    margin-left: 50%;\\n  }\\n  .offset-xl-7 {\\n    margin-left: 58.333333%;\\n  }\\n  .offset-xl-8 {\\n    margin-left: 66.666667%;\\n  }\\n  .offset-xl-9 {\\n    margin-left: 75%;\\n  }\\n  .offset-xl-10 {\\n    margin-left: 83.333333%;\\n  }\\n  .offset-xl-11 {\\n    margin-left: 91.666667%;\\n  }\\n}\\n\\n.table {\\n  width: 100%;\\n  margin-bottom: 1rem;\\n  color: #212529;\\n}\\n\\n.table th,\\n.table td {\\n  padding: 0.75rem;\\n  vertical-align: top;\\n  border-top: 1px solid #dee2e6;\\n}\\n\\n.table thead th {\\n  vertical-align: bottom;\\n  border-bottom: 2px solid #dee2e6;\\n}\\n\\n.table tbody + tbody {\\n  border-top: 2px solid #dee2e6;\\n}\\n\\n.table-sm th,\\n.table-sm td {\\n  padding: 0.3rem;\\n}\\n\\n.table-bordered {\\n  border: 1px solid #dee2e6;\\n}\\n\\n.table-bordered th,\\n.table-bordered td {\\n  border: 1px solid #dee2e6;\\n}\\n\\n.table-bordered thead th,\\n.table-bordered thead td {\\n  border-bottom-width: 2px;\\n}\\n\\n.table-borderless th,\\n.table-borderless td,\\n.table-borderless thead th,\\n.table-borderless tbody + tbody {\\n  border: 0;\\n}\\n\\n.table-striped tbody tr:nth-of-type(odd) {\\n  background-color: rgba(0, 0, 0, 0.05);\\n}\\n\\n.table-hover tbody tr:hover {\\n  color: #212529;\\n  background-color: rgba(0, 0, 0, 0.075);\\n}\\n\\n.table-primary,\\n.table-primary > th,\\n.table-primary > td {\\n  background-color: #b8daff;\\n}\\n\\n.table-primary th,\\n.table-primary td,\\n.table-primary thead th,\\n.table-primary tbody + tbody {\\n  border-color: #7abaff;\\n}\\n\\n.table-hover .table-primary:hover {\\n  background-color: #9fcdff;\\n}\\n\\n.table-hover .table-primary:hover > td,\\n.table-hover .table-primary:hover > th {\\n  background-color: #9fcdff;\\n}\\n\\n.table-secondary,\\n.table-secondary > th,\\n.table-secondary > td {\\n  background-color: #d6d8db;\\n}\\n\\n.table-secondary th,\\n.table-secondary td,\\n.table-secondary thead th,\\n.table-secondary tbody + tbody {\\n  border-color: #b3b7bb;\\n}\\n\\n.table-hover .table-secondary:hover {\\n  background-color: #c8cbcf;\\n}\\n\\n.table-hover .table-secondary:hover > td,\\n.table-hover .table-secondary:hover > th {\\n  background-color: #c8cbcf;\\n}\\n\\n.table-success,\\n.table-success > th,\\n.table-success > td {\\n  background-color: #c3e6cb;\\n}\\n\\n.table-success th,\\n.table-success td,\\n.table-success thead th,\\n.table-success tbody + tbody {\\n  border-color: #8fd19e;\\n}\\n\\n.table-hover .table-success:hover {\\n  background-color: #b1dfbb;\\n}\\n\\n.table-hover .table-success:hover > td,\\n.table-hover .table-success:hover > th {\\n  background-color: #b1dfbb;\\n}\\n\\n.table-info,\\n.table-info > th,\\n.table-info > td {\\n  background-color: #bee5eb;\\n}\\n\\n.table-info th,\\n.table-info td,\\n.table-info thead th,\\n.table-info tbody + tbody {\\n  border-color: #86cfda;\\n}\\n\\n.table-hover .table-info:hover {\\n  background-color: #abdde5;\\n}\\n\\n.table-hover .table-info:hover > td,\\n.table-hover .table-info:hover > th {\\n  background-color: #abdde5;\\n}\\n\\n.table-warning,\\n.table-warning > th,\\n.table-warning > td {\\n  background-color: #ffeeba;\\n}\\n\\n.table-warning th,\\n.table-warning td,\\n.table-warning thead th,\\n.table-warning tbody + tbody {\\n  border-color: #ffdf7e;\\n}\\n\\n.table-hover .table-warning:hover {\\n  background-color: #ffe8a1;\\n}\\n\\n.table-hover .table-warning:hover > td,\\n.table-hover .table-warning:hover > th {\\n  background-color: #ffe8a1;\\n}\\n\\n.table-danger,\\n.table-danger > th,\\n.table-danger > td {\\n  background-color: #f5c6cb;\\n}\\n\\n.table-danger th,\\n.table-danger td,\\n.table-danger thead th,\\n.table-danger tbody + tbody {\\n  border-color: #ed969e;\\n}\\n\\n.table-hover .table-danger:hover {\\n  background-color: #f1b0b7;\\n}\\n\\n.table-hover .table-danger:hover > td,\\n.table-hover .table-danger:hover > th {\\n  background-color: #f1b0b7;\\n}\\n\\n.table-light,\\n.table-light > th,\\n.table-light > td {\\n  background-color: #fdfdfe;\\n}\\n\\n.table-light th,\\n.table-light td,\\n.table-light thead th,\\n.table-light tbody + tbody {\\n  border-color: #fbfcfc;\\n}\\n\\n.table-hover .table-light:hover {\\n  background-color: #ececf6;\\n}\\n\\n.table-hover .table-light:hover > td,\\n.table-hover .table-light:hover > th {\\n  background-color: #ececf6;\\n}\\n\\n.table-dark,\\n.table-dark > th,\\n.table-dark > td {\\n  background-color: #c6c8ca;\\n}\\n\\n.table-dark th,\\n.table-dark td,\\n.table-dark thead th,\\n.table-dark tbody + tbody {\\n  border-color: #95999c;\\n}\\n\\n.table-hover .table-dark:hover {\\n  background-color: #b9bbbe;\\n}\\n\\n.table-hover .table-dark:hover > td,\\n.table-hover .table-dark:hover > th {\\n  background-color: #b9bbbe;\\n}\\n\\n.table-active,\\n.table-active > th,\\n.table-active > td {\\n  background-color: rgba(0, 0, 0, 0.075);\\n}\\n\\n.table-hover .table-active:hover {\\n  background-color: rgba(0, 0, 0, 0.075);\\n}\\n\\n.table-hover .table-active:hover > td,\\n.table-hover .table-active:hover > th {\\n  background-color: rgba(0, 0, 0, 0.075);\\n}\\n\\n.table .thead-dark th {\\n  color: #fff;\\n  background-color: #343a40;\\n  border-color: #454d55;\\n}\\n\\n.table .thead-light th {\\n  color: #495057;\\n  background-color: #e9ecef;\\n  border-color: #dee2e6;\\n}\\n\\n.table-dark {\\n  color: #fff;\\n  background-color: #343a40;\\n}\\n\\n.table-dark th,\\n.table-dark td,\\n.table-dark thead th {\\n  border-color: #454d55;\\n}\\n\\n.table-dark.table-bordered {\\n  border: 0;\\n}\\n\\n.table-dark.table-striped tbody tr:nth-of-type(odd) {\\n  background-color: rgba(255, 255, 255, 0.05);\\n}\\n\\n.table-dark.table-hover tbody tr:hover {\\n  color: #fff;\\n  background-color: rgba(255, 255, 255, 0.075);\\n}\\n\\n@media (max-width: 575.98px) {\\n  .table-responsive-sm {\\n    display: block;\\n    width: 100%;\\n    overflow-x: auto;\\n    -webkit-overflow-scrolling: touch;\\n  }\\n  .table-responsive-sm > .table-bordered {\\n    border: 0;\\n  }\\n}\\n\\n@media (max-width: 767.98px) {\\n  .table-responsive-md {\\n    display: block;\\n    width: 100%;\\n    overflow-x: auto;\\n    -webkit-overflow-scrolling: touch;\\n  }\\n  .table-responsive-md > .table-bordered {\\n    border: 0;\\n  }\\n}\\n\\n@media (max-width: 991.98px) {\\n  .table-responsive-lg {\\n    display: block;\\n    width: 100%;\\n    overflow-x: auto;\\n    -webkit-overflow-scrolling: touch;\\n  }\\n  .table-responsive-lg > .table-bordered {\\n    border: 0;\\n  }\\n}\\n\\n@media (max-width: 1199.98px) {\\n  .table-responsive-xl {\\n    display: block;\\n    width: 100%;\\n    overflow-x: auto;\\n    -webkit-overflow-scrolling: touch;\\n  }\\n  .table-responsive-xl > .table-bordered {\\n    border: 0;\\n  }\\n}\\n\\n.table-responsive {\\n  display: block;\\n  width: 100%;\\n  overflow-x: auto;\\n  -webkit-overflow-scrolling: touch;\\n}\\n\\n.table-responsive > .table-bordered {\\n  border: 0;\\n}\\n\\n.form-control {\\n  display: block;\\n  width: 100%;\\n  height: calc(1.5em + 0.75rem + 2px);\\n  padding: 0.375rem 0.75rem;\\n  font-size: 1rem;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  color: #495057;\\n  background-color: #fff;\\n  background-clip: padding-box;\\n  border: 1px solid #ced4da;\\n  border-radius: 0.25rem;\\n  transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .form-control {\\n    transition: none;\\n  }\\n}\\n\\n.form-control::-ms-expand {\\n  background-color: transparent;\\n  border: 0;\\n}\\n\\n.form-control:focus {\\n  color: #495057;\\n  background-color: #fff;\\n  border-color: #80bdff;\\n  outline: 0;\\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\\n}\\n\\n.form-control::placeholder {\\n  color: #6c757d;\\n  opacity: 1;\\n}\\n\\n.form-control:disabled, .form-control[readonly] {\\n  background-color: #e9ecef;\\n  opacity: 1;\\n}\\n\\nselect.form-control:focus::-ms-value {\\n  color: #495057;\\n  background-color: #fff;\\n}\\n\\n.form-control-file,\\n.form-control-range {\\n  display: block;\\n  width: 100%;\\n}\\n\\n.col-form-label {\\n  padding-top: calc(0.375rem + 1px);\\n  padding-bottom: calc(0.375rem + 1px);\\n  margin-bottom: 0;\\n  font-size: inherit;\\n  line-height: 1.5;\\n}\\n\\n.col-form-label-lg {\\n  padding-top: calc(0.5rem + 1px);\\n  padding-bottom: calc(0.5rem + 1px);\\n  font-size: 1.25rem;\\n  line-height: 1.5;\\n}\\n\\n.col-form-label-sm {\\n  padding-top: calc(0.25rem + 1px);\\n  padding-bottom: calc(0.25rem + 1px);\\n  font-size: 0.875rem;\\n  line-height: 1.5;\\n}\\n\\n.form-control-plaintext {\\n  display: block;\\n  width: 100%;\\n  padding-top: 0.375rem;\\n  padding-bottom: 0.375rem;\\n  margin-bottom: 0;\\n  line-height: 1.5;\\n  color: #212529;\\n  background-color: transparent;\\n  border: solid transparent;\\n  border-width: 1px 0;\\n}\\n\\n.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {\\n  padding-right: 0;\\n  padding-left: 0;\\n}\\n\\n.form-control-sm {\\n  height: calc(1.5em + 0.5rem + 2px);\\n  padding: 0.25rem 0.5rem;\\n  font-size: 0.875rem;\\n  line-height: 1.5;\\n  border-radius: 0.2rem;\\n}\\n\\n.form-control-lg {\\n  height: calc(1.5em + 1rem + 2px);\\n  padding: 0.5rem 1rem;\\n  font-size: 1.25rem;\\n  line-height: 1.5;\\n  border-radius: 0.3rem;\\n}\\n\\nselect.form-control[size], select.form-control[multiple] {\\n  height: auto;\\n}\\n\\ntextarea.form-control {\\n  height: auto;\\n}\\n\\n.form-group {\\n  margin-bottom: 1rem;\\n}\\n\\n.form-text {\\n  display: block;\\n  margin-top: 0.25rem;\\n}\\n\\n.form-row {\\n  display: flex;\\n  flex-wrap: wrap;\\n  margin-right: -5px;\\n  margin-left: -5px;\\n}\\n\\n.form-row > .col,\\n.form-row > [class*=\\\"col-\\\"] {\\n  padding-right: 5px;\\n  padding-left: 5px;\\n}\\n\\n.form-check {\\n  position: relative;\\n  display: block;\\n  padding-left: 1.25rem;\\n}\\n\\n.form-check-input {\\n  position: absolute;\\n  margin-top: 0.3rem;\\n  margin-left: -1.25rem;\\n}\\n\\n.form-check-input:disabled ~ .form-check-label {\\n  color: #6c757d;\\n}\\n\\n.form-check-label {\\n  margin-bottom: 0;\\n}\\n\\n.form-check-inline {\\n  display: inline-flex;\\n  align-items: center;\\n  padding-left: 0;\\n  margin-right: 0.75rem;\\n}\\n\\n.form-check-inline .form-check-input {\\n  position: static;\\n  margin-top: 0;\\n  margin-right: 0.3125rem;\\n  margin-left: 0;\\n}\\n\\n.valid-feedback {\\n  display: none;\\n  width: 100%;\\n  margin-top: 0.25rem;\\n  font-size: 80%;\\n  color: #28a745;\\n}\\n\\n.valid-tooltip {\\n  position: absolute;\\n  top: 100%;\\n  z-index: 5;\\n  display: none;\\n  max-width: 100%;\\n  padding: 0.25rem 0.5rem;\\n  margin-top: .1rem;\\n  font-size: 0.875rem;\\n  line-height: 1.5;\\n  color: #fff;\\n  background-color: rgba(40, 167, 69, 0.9);\\n  border-radius: 0.25rem;\\n}\\n\\n.was-validated .form-control:valid, .form-control.is-valid {\\n  border-color: #28a745;\\n  padding-right: calc(1.5em + 0.75rem);\\n  background-image: url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\\\");\\n  background-repeat: no-repeat;\\n  background-position: center right calc(0.375em + 0.1875rem);\\n  background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\\n}\\n\\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus {\\n  border-color: #28a745;\\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\\n}\\n\\n.was-validated .form-control:valid ~ .valid-feedback,\\n.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback,\\n.form-control.is-valid ~ .valid-tooltip {\\n  display: block;\\n}\\n\\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\\n  padding-right: calc(1.5em + 0.75rem);\\n  background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\\n}\\n\\n.was-validated .custom-select:valid, .custom-select.is-valid {\\n  border-color: #28a745;\\n  padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);\\n  background: url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\\\") no-repeat right 0.75rem center/8px 10px, url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\\\") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\\n}\\n\\n.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {\\n  border-color: #28a745;\\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\\n}\\n\\n.was-validated .custom-select:valid ~ .valid-feedback,\\n.was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback,\\n.custom-select.is-valid ~ .valid-tooltip {\\n  display: block;\\n}\\n\\n.was-validated .form-control-file:valid ~ .valid-feedback,\\n.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback,\\n.form-control-file.is-valid ~ .valid-tooltip {\\n  display: block;\\n}\\n\\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\\n  color: #28a745;\\n}\\n\\n.was-validated .form-check-input:valid ~ .valid-feedback,\\n.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,\\n.form-check-input.is-valid ~ .valid-tooltip {\\n  display: block;\\n}\\n\\n.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {\\n  color: #28a745;\\n}\\n\\n.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {\\n  border-color: #28a745;\\n}\\n\\n.was-validated .custom-control-input:valid ~ .valid-feedback,\\n.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback,\\n.custom-control-input.is-valid ~ .valid-tooltip {\\n  display: block;\\n}\\n\\n.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {\\n  border-color: #34ce57;\\n  background-color: #34ce57;\\n}\\n\\n.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before {\\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\\n}\\n\\n.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before {\\n  border-color: #28a745;\\n}\\n\\n.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {\\n  border-color: #28a745;\\n}\\n\\n.was-validated .custom-file-input:valid ~ .valid-feedback,\\n.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback,\\n.custom-file-input.is-valid ~ .valid-tooltip {\\n  display: block;\\n}\\n\\n.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {\\n  border-color: #28a745;\\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\\n}\\n\\n.invalid-feedback {\\n  display: none;\\n  width: 100%;\\n  margin-top: 0.25rem;\\n  font-size: 80%;\\n  color: #dc3545;\\n}\\n\\n.invalid-tooltip {\\n  position: absolute;\\n  top: 100%;\\n  z-index: 5;\\n  display: none;\\n  max-width: 100%;\\n  padding: 0.25rem 0.5rem;\\n  margin-top: .1rem;\\n  font-size: 0.875rem;\\n  line-height: 1.5;\\n  color: #fff;\\n  background-color: rgba(220, 53, 69, 0.9);\\n  border-radius: 0.25rem;\\n}\\n\\n.was-validated .form-control:invalid, .form-control.is-invalid {\\n  border-color: #dc3545;\\n  padding-right: calc(1.5em + 0.75rem);\\n  background-image: url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\\\");\\n  background-repeat: no-repeat;\\n  background-position: center right calc(0.375em + 0.1875rem);\\n  background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\\n}\\n\\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {\\n  border-color: #dc3545;\\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\\n}\\n\\n.was-validated .form-control:invalid ~ .invalid-feedback,\\n.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback,\\n.form-control.is-invalid ~ .invalid-tooltip {\\n  display: block;\\n}\\n\\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\\n  padding-right: calc(1.5em + 0.75rem);\\n  background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\\n}\\n\\n.was-validated .custom-select:invalid, .custom-select.is-invalid {\\n  border-color: #dc3545;\\n  padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);\\n  background: url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\\\") no-repeat right 0.75rem center/8px 10px, url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\\\") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\\n}\\n\\n.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {\\n  border-color: #dc3545;\\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\\n}\\n\\n.was-validated .custom-select:invalid ~ .invalid-feedback,\\n.was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback,\\n.custom-select.is-invalid ~ .invalid-tooltip {\\n  display: block;\\n}\\n\\n.was-validated .form-control-file:invalid ~ .invalid-feedback,\\n.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback,\\n.form-control-file.is-invalid ~ .invalid-tooltip {\\n  display: block;\\n}\\n\\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\\n  color: #dc3545;\\n}\\n\\n.was-validated .form-check-input:invalid ~ .invalid-feedback,\\n.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,\\n.form-check-input.is-invalid ~ .invalid-tooltip {\\n  display: block;\\n}\\n\\n.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {\\n  color: #dc3545;\\n}\\n\\n.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {\\n  border-color: #dc3545;\\n}\\n\\n.was-validated .custom-control-input:invalid ~ .invalid-feedback,\\n.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback,\\n.custom-control-input.is-invalid ~ .invalid-tooltip {\\n  display: block;\\n}\\n\\n.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {\\n  border-color: #e4606d;\\n  background-color: #e4606d;\\n}\\n\\n.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before {\\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\\n}\\n\\n.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before {\\n  border-color: #dc3545;\\n}\\n\\n.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {\\n  border-color: #dc3545;\\n}\\n\\n.was-validated .custom-file-input:invalid ~ .invalid-feedback,\\n.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback,\\n.custom-file-input.is-invalid ~ .invalid-tooltip {\\n  display: block;\\n}\\n\\n.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {\\n  border-color: #dc3545;\\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\\n}\\n\\n.form-inline {\\n  display: flex;\\n  flex-flow: row wrap;\\n  align-items: center;\\n}\\n\\n.form-inline .form-check {\\n  width: 100%;\\n}\\n\\n@media (min-width: 576px) {\\n  .form-inline label {\\n    display: flex;\\n    align-items: center;\\n    justify-content: center;\\n    margin-bottom: 0;\\n  }\\n  .form-inline .form-group {\\n    display: flex;\\n    flex: 0 0 auto;\\n    flex-flow: row wrap;\\n    align-items: center;\\n    margin-bottom: 0;\\n  }\\n  .form-inline .form-control {\\n    display: inline-block;\\n    width: auto;\\n    vertical-align: middle;\\n  }\\n  .form-inline .form-control-plaintext {\\n    display: inline-block;\\n  }\\n  .form-inline .input-group,\\n  .form-inline .custom-select {\\n    width: auto;\\n  }\\n  .form-inline .form-check {\\n    display: flex;\\n    align-items: center;\\n    justify-content: center;\\n    width: auto;\\n    padding-left: 0;\\n  }\\n  .form-inline .form-check-input {\\n    position: relative;\\n    flex-shrink: 0;\\n    margin-top: 0;\\n    margin-right: 0.25rem;\\n    margin-left: 0;\\n  }\\n  .form-inline .custom-control {\\n    align-items: center;\\n    justify-content: center;\\n  }\\n  .form-inline .custom-control-label {\\n    margin-bottom: 0;\\n  }\\n}\\n\\n.btn {\\n  display: inline-block;\\n  font-weight: 400;\\n  color: #212529;\\n  text-align: center;\\n  vertical-align: middle;\\n  user-select: none;\\n  background-color: transparent;\\n  border: 1px solid transparent;\\n  padding: 0.375rem 0.75rem;\\n  font-size: 1rem;\\n  line-height: 1.5;\\n  border-radius: 0.25rem;\\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .btn {\\n    transition: none;\\n  }\\n}\\n\\n.btn:hover {\\n  color: #212529;\\n  text-decoration: none;\\n}\\n\\n.btn:focus, .btn.focus {\\n  outline: 0;\\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\\n}\\n\\n.btn.disabled, .btn:disabled {\\n  opacity: 0.65;\\n}\\n\\na.btn.disabled,\\nfieldset:disabled a.btn {\\n  pointer-events: none;\\n}\\n\\n.btn-primary {\\n  color: #fff;\\n  background-color: #007bff;\\n  border-color: #007bff;\\n}\\n\\n.btn-primary:hover {\\n  color: #fff;\\n  background-color: #0069d9;\\n  border-color: #0062cc;\\n}\\n\\n.btn-primary:focus, .btn-primary.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);\\n}\\n\\n.btn-primary.disabled, .btn-primary:disabled {\\n  color: #fff;\\n  background-color: #007bff;\\n  border-color: #007bff;\\n}\\n\\n.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active,\\n.show > .btn-primary.dropdown-toggle {\\n  color: #fff;\\n  background-color: #0062cc;\\n  border-color: #005cbf;\\n}\\n\\n.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-primary.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);\\n}\\n\\n.btn-secondary {\\n  color: #fff;\\n  background-color: #6c757d;\\n  border-color: #6c757d;\\n}\\n\\n.btn-secondary:hover {\\n  color: #fff;\\n  background-color: #5a6268;\\n  border-color: #545b62;\\n}\\n\\n.btn-secondary:focus, .btn-secondary.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);\\n}\\n\\n.btn-secondary.disabled, .btn-secondary:disabled {\\n  color: #fff;\\n  background-color: #6c757d;\\n  border-color: #6c757d;\\n}\\n\\n.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active,\\n.show > .btn-secondary.dropdown-toggle {\\n  color: #fff;\\n  background-color: #545b62;\\n  border-color: #4e555b;\\n}\\n\\n.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-secondary.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);\\n}\\n\\n.btn-success {\\n  color: #fff;\\n  background-color: #28a745;\\n  border-color: #28a745;\\n}\\n\\n.btn-success:hover {\\n  color: #fff;\\n  background-color: #218838;\\n  border-color: #1e7e34;\\n}\\n\\n.btn-success:focus, .btn-success.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);\\n}\\n\\n.btn-success.disabled, .btn-success:disabled {\\n  color: #fff;\\n  background-color: #28a745;\\n  border-color: #28a745;\\n}\\n\\n.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active,\\n.show > .btn-success.dropdown-toggle {\\n  color: #fff;\\n  background-color: #1e7e34;\\n  border-color: #1c7430;\\n}\\n\\n.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-success.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);\\n}\\n\\n.btn-info {\\n  color: #fff;\\n  background-color: #17a2b8;\\n  border-color: #17a2b8;\\n}\\n\\n.btn-info:hover {\\n  color: #fff;\\n  background-color: #138496;\\n  border-color: #117a8b;\\n}\\n\\n.btn-info:focus, .btn-info.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\\n}\\n\\n.btn-info.disabled, .btn-info:disabled {\\n  color: #fff;\\n  background-color: #17a2b8;\\n  border-color: #17a2b8;\\n}\\n\\n.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active,\\n.show > .btn-info.dropdown-toggle {\\n  color: #fff;\\n  background-color: #117a8b;\\n  border-color: #10707f;\\n}\\n\\n.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-info.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\\n}\\n\\n.btn-warning {\\n  color: #212529;\\n  background-color: #ffc107;\\n  border-color: #ffc107;\\n}\\n\\n.btn-warning:hover {\\n  color: #212529;\\n  background-color: #e0a800;\\n  border-color: #d39e00;\\n}\\n\\n.btn-warning:focus, .btn-warning.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);\\n}\\n\\n.btn-warning.disabled, .btn-warning:disabled {\\n  color: #212529;\\n  background-color: #ffc107;\\n  border-color: #ffc107;\\n}\\n\\n.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active,\\n.show > .btn-warning.dropdown-toggle {\\n  color: #212529;\\n  background-color: #d39e00;\\n  border-color: #c69500;\\n}\\n\\n.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-warning.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);\\n}\\n\\n.btn-danger {\\n  color: #fff;\\n  background-color: #dc3545;\\n  border-color: #dc3545;\\n}\\n\\n.btn-danger:hover {\\n  color: #fff;\\n  background-color: #c82333;\\n  border-color: #bd2130;\\n}\\n\\n.btn-danger:focus, .btn-danger.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);\\n}\\n\\n.btn-danger.disabled, .btn-danger:disabled {\\n  color: #fff;\\n  background-color: #dc3545;\\n  border-color: #dc3545;\\n}\\n\\n.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active,\\n.show > .btn-danger.dropdown-toggle {\\n  color: #fff;\\n  background-color: #bd2130;\\n  border-color: #b21f2d;\\n}\\n\\n.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-danger.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);\\n}\\n\\n.btn-light {\\n  color: #212529;\\n  background-color: #f8f9fa;\\n  border-color: #f8f9fa;\\n}\\n\\n.btn-light:hover {\\n  color: #212529;\\n  background-color: #e2e6ea;\\n  border-color: #dae0e5;\\n}\\n\\n.btn-light:focus, .btn-light.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\\n}\\n\\n.btn-light.disabled, .btn-light:disabled {\\n  color: #212529;\\n  background-color: #f8f9fa;\\n  border-color: #f8f9fa;\\n}\\n\\n.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active,\\n.show > .btn-light.dropdown-toggle {\\n  color: #212529;\\n  background-color: #dae0e5;\\n  border-color: #d3d9df;\\n}\\n\\n.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-light.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\\n}\\n\\n.btn-dark {\\n  color: #fff;\\n  background-color: #343a40;\\n  border-color: #343a40;\\n}\\n\\n.btn-dark:hover {\\n  color: #fff;\\n  background-color: #23272b;\\n  border-color: #1d2124;\\n}\\n\\n.btn-dark:focus, .btn-dark.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\\n}\\n\\n.btn-dark.disabled, .btn-dark:disabled {\\n  color: #fff;\\n  background-color: #343a40;\\n  border-color: #343a40;\\n}\\n\\n.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active,\\n.show > .btn-dark.dropdown-toggle {\\n  color: #fff;\\n  background-color: #1d2124;\\n  border-color: #171a1d;\\n}\\n\\n.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-dark.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\\n}\\n\\n.btn-outline-primary {\\n  color: #007bff;\\n  border-color: #007bff;\\n}\\n\\n.btn-outline-primary:hover {\\n  color: #fff;\\n  background-color: #007bff;\\n  border-color: #007bff;\\n}\\n\\n.btn-outline-primary:focus, .btn-outline-primary.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\\n}\\n\\n.btn-outline-primary.disabled, .btn-outline-primary:disabled {\\n  color: #007bff;\\n  background-color: transparent;\\n}\\n\\n.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active,\\n.show > .btn-outline-primary.dropdown-toggle {\\n  color: #fff;\\n  background-color: #007bff;\\n  border-color: #007bff;\\n}\\n\\n.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-outline-primary.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\\n}\\n\\n.btn-outline-secondary {\\n  color: #6c757d;\\n  border-color: #6c757d;\\n}\\n\\n.btn-outline-secondary:hover {\\n  color: #fff;\\n  background-color: #6c757d;\\n  border-color: #6c757d;\\n}\\n\\n.btn-outline-secondary:focus, .btn-outline-secondary.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\\n}\\n\\n.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {\\n  color: #6c757d;\\n  background-color: transparent;\\n}\\n\\n.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active,\\n.show > .btn-outline-secondary.dropdown-toggle {\\n  color: #fff;\\n  background-color: #6c757d;\\n  border-color: #6c757d;\\n}\\n\\n.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-outline-secondary.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\\n}\\n\\n.btn-outline-success {\\n  color: #28a745;\\n  border-color: #28a745;\\n}\\n\\n.btn-outline-success:hover {\\n  color: #fff;\\n  background-color: #28a745;\\n  border-color: #28a745;\\n}\\n\\n.btn-outline-success:focus, .btn-outline-success.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\\n}\\n\\n.btn-outline-success.disabled, .btn-outline-success:disabled {\\n  color: #28a745;\\n  background-color: transparent;\\n}\\n\\n.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active,\\n.show > .btn-outline-success.dropdown-toggle {\\n  color: #fff;\\n  background-color: #28a745;\\n  border-color: #28a745;\\n}\\n\\n.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-outline-success.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\\n}\\n\\n.btn-outline-info {\\n  color: #17a2b8;\\n  border-color: #17a2b8;\\n}\\n\\n.btn-outline-info:hover {\\n  color: #fff;\\n  background-color: #17a2b8;\\n  border-color: #17a2b8;\\n}\\n\\n.btn-outline-info:focus, .btn-outline-info.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\\n}\\n\\n.btn-outline-info.disabled, .btn-outline-info:disabled {\\n  color: #17a2b8;\\n  background-color: transparent;\\n}\\n\\n.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active,\\n.show > .btn-outline-info.dropdown-toggle {\\n  color: #fff;\\n  background-color: #17a2b8;\\n  border-color: #17a2b8;\\n}\\n\\n.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-outline-info.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\\n}\\n\\n.btn-outline-warning {\\n  color: #ffc107;\\n  border-color: #ffc107;\\n}\\n\\n.btn-outline-warning:hover {\\n  color: #212529;\\n  background-color: #ffc107;\\n  border-color: #ffc107;\\n}\\n\\n.btn-outline-warning:focus, .btn-outline-warning.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\\n}\\n\\n.btn-outline-warning.disabled, .btn-outline-warning:disabled {\\n  color: #ffc107;\\n  background-color: transparent;\\n}\\n\\n.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active,\\n.show > .btn-outline-warning.dropdown-toggle {\\n  color: #212529;\\n  background-color: #ffc107;\\n  border-color: #ffc107;\\n}\\n\\n.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-outline-warning.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\\n}\\n\\n.btn-outline-danger {\\n  color: #dc3545;\\n  border-color: #dc3545;\\n}\\n\\n.btn-outline-danger:hover {\\n  color: #fff;\\n  background-color: #dc3545;\\n  border-color: #dc3545;\\n}\\n\\n.btn-outline-danger:focus, .btn-outline-danger.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\\n}\\n\\n.btn-outline-danger.disabled, .btn-outline-danger:disabled {\\n  color: #dc3545;\\n  background-color: transparent;\\n}\\n\\n.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active,\\n.show > .btn-outline-danger.dropdown-toggle {\\n  color: #fff;\\n  background-color: #dc3545;\\n  border-color: #dc3545;\\n}\\n\\n.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-outline-danger.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\\n}\\n\\n.btn-outline-light {\\n  color: #f8f9fa;\\n  border-color: #f8f9fa;\\n}\\n\\n.btn-outline-light:hover {\\n  color: #212529;\\n  background-color: #f8f9fa;\\n  border-color: #f8f9fa;\\n}\\n\\n.btn-outline-light:focus, .btn-outline-light.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\\n}\\n\\n.btn-outline-light.disabled, .btn-outline-light:disabled {\\n  color: #f8f9fa;\\n  background-color: transparent;\\n}\\n\\n.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active,\\n.show > .btn-outline-light.dropdown-toggle {\\n  color: #212529;\\n  background-color: #f8f9fa;\\n  border-color: #f8f9fa;\\n}\\n\\n.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-outline-light.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\\n}\\n\\n.btn-outline-dark {\\n  color: #343a40;\\n  border-color: #343a40;\\n}\\n\\n.btn-outline-dark:hover {\\n  color: #fff;\\n  background-color: #343a40;\\n  border-color: #343a40;\\n}\\n\\n.btn-outline-dark:focus, .btn-outline-dark.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\\n}\\n\\n.btn-outline-dark.disabled, .btn-outline-dark:disabled {\\n  color: #343a40;\\n  background-color: transparent;\\n}\\n\\n.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active,\\n.show > .btn-outline-dark.dropdown-toggle {\\n  color: #fff;\\n  background-color: #343a40;\\n  border-color: #343a40;\\n}\\n\\n.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-outline-dark.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\\n}\\n\\n.btn-link {\\n  font-weight: 400;\\n  color: #007bff;\\n  text-decoration: none;\\n}\\n\\n.btn-link:hover {\\n  color: #0056b3;\\n  text-decoration: underline;\\n}\\n\\n.btn-link:focus, .btn-link.focus {\\n  text-decoration: underline;\\n  box-shadow: none;\\n}\\n\\n.btn-link:disabled, .btn-link.disabled {\\n  color: #6c757d;\\n  pointer-events: none;\\n}\\n\\n.btn-lg, .btn-group-lg > .btn {\\n  padding: 0.5rem 1rem;\\n  font-size: 1.25rem;\\n  line-height: 1.5;\\n  border-radius: 0.3rem;\\n}\\n\\n.btn-sm, .btn-group-sm > .btn {\\n  padding: 0.25rem 0.5rem;\\n  font-size: 0.875rem;\\n  line-height: 1.5;\\n  border-radius: 0.2rem;\\n}\\n\\n.btn-block {\\n  display: block;\\n  width: 100%;\\n}\\n\\n.btn-block + .btn-block {\\n  margin-top: 0.5rem;\\n}\\n\\ninput[type=\\\"submit\\\"].btn-block,\\ninput[type=\\\"reset\\\"].btn-block,\\ninput[type=\\\"button\\\"].btn-block {\\n  width: 100%;\\n}\\n\\n.fade {\\n  transition: opacity 0.15s linear;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .fade {\\n    transition: none;\\n  }\\n}\\n\\n.fade:not(.show) {\\n  opacity: 0;\\n}\\n\\n.collapse:not(.show) {\\n  display: none;\\n}\\n\\n.collapsing {\\n  position: relative;\\n  height: 0;\\n  overflow: hidden;\\n  transition: height 0.35s ease;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .collapsing {\\n    transition: none;\\n  }\\n}\\n\\n.dropup,\\n.dropright,\\n.dropdown,\\n.dropleft {\\n  position: relative;\\n}\\n\\n.dropdown-toggle {\\n  white-space: nowrap;\\n}\\n\\n.dropdown-toggle::after {\\n  display: inline-block;\\n  margin-left: 0.255em;\\n  vertical-align: 0.255em;\\n  content: \\\"\\\";\\n  border-top: 0.3em solid;\\n  border-right: 0.3em solid transparent;\\n  border-bottom: 0;\\n  border-left: 0.3em solid transparent;\\n}\\n\\n.dropdown-toggle:empty::after {\\n  margin-left: 0;\\n}\\n\\n.dropdown-menu {\\n  position: absolute;\\n  top: 100%;\\n  left: 0;\\n  z-index: 1000;\\n  display: none;\\n  float: left;\\n  min-width: 10rem;\\n  padding: 0.5rem 0;\\n  margin: 0.125rem 0 0;\\n  font-size: 1rem;\\n  color: #212529;\\n  text-align: left;\\n  list-style: none;\\n  background-color: #fff;\\n  background-clip: padding-box;\\n  border: 1px solid rgba(0, 0, 0, 0.15);\\n  border-radius: 0.25rem;\\n}\\n\\n.dropdown-menu-left {\\n  right: auto;\\n  left: 0;\\n}\\n\\n.dropdown-menu-right {\\n  right: 0;\\n  left: auto;\\n}\\n\\n@media (min-width: 576px) {\\n  .dropdown-menu-sm-left {\\n    right: auto;\\n    left: 0;\\n  }\\n  .dropdown-menu-sm-right {\\n    right: 0;\\n    left: auto;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .dropdown-menu-md-left {\\n    right: auto;\\n    left: 0;\\n  }\\n  .dropdown-menu-md-right {\\n    right: 0;\\n    left: auto;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .dropdown-menu-lg-left {\\n    right: auto;\\n    left: 0;\\n  }\\n  .dropdown-menu-lg-right {\\n    right: 0;\\n    left: auto;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .dropdown-menu-xl-left {\\n    right: auto;\\n    left: 0;\\n  }\\n  .dropdown-menu-xl-right {\\n    right: 0;\\n    left: auto;\\n  }\\n}\\n\\n.dropup .dropdown-menu {\\n  top: auto;\\n  bottom: 100%;\\n  margin-top: 0;\\n  margin-bottom: 0.125rem;\\n}\\n\\n.dropup .dropdown-toggle::after {\\n  display: inline-block;\\n  margin-left: 0.255em;\\n  vertical-align: 0.255em;\\n  content: \\\"\\\";\\n  border-top: 0;\\n  border-right: 0.3em solid transparent;\\n  border-bottom: 0.3em solid;\\n  border-left: 0.3em solid transparent;\\n}\\n\\n.dropup .dropdown-toggle:empty::after {\\n  margin-left: 0;\\n}\\n\\n.dropright .dropdown-menu {\\n  top: 0;\\n  right: auto;\\n  left: 100%;\\n  margin-top: 0;\\n  margin-left: 0.125rem;\\n}\\n\\n.dropright .dropdown-toggle::after {\\n  display: inline-block;\\n  margin-left: 0.255em;\\n  vertical-align: 0.255em;\\n  content: \\\"\\\";\\n  border-top: 0.3em solid transparent;\\n  border-right: 0;\\n  border-bottom: 0.3em solid transparent;\\n  border-left: 0.3em solid;\\n}\\n\\n.dropright .dropdown-toggle:empty::after {\\n  margin-left: 0;\\n}\\n\\n.dropright .dropdown-toggle::after {\\n  vertical-align: 0;\\n}\\n\\n.dropleft .dropdown-menu {\\n  top: 0;\\n  right: 100%;\\n  left: auto;\\n  margin-top: 0;\\n  margin-right: 0.125rem;\\n}\\n\\n.dropleft .dropdown-toggle::after {\\n  display: inline-block;\\n  margin-left: 0.255em;\\n  vertical-align: 0.255em;\\n  content: \\\"\\\";\\n}\\n\\n.dropleft .dropdown-toggle::after {\\n  display: none;\\n}\\n\\n.dropleft .dropdown-toggle::before {\\n  display: inline-block;\\n  margin-right: 0.255em;\\n  vertical-align: 0.255em;\\n  content: \\\"\\\";\\n  border-top: 0.3em solid transparent;\\n  border-right: 0.3em solid;\\n  border-bottom: 0.3em solid transparent;\\n}\\n\\n.dropleft .dropdown-toggle:empty::after {\\n  margin-left: 0;\\n}\\n\\n.dropleft .dropdown-toggle::before {\\n  vertical-align: 0;\\n}\\n\\n.dropdown-menu[x-placement^=\\\"top\\\"], .dropdown-menu[x-placement^=\\\"right\\\"], .dropdown-menu[x-placement^=\\\"bottom\\\"], .dropdown-menu[x-placement^=\\\"left\\\"] {\\n  right: auto;\\n  bottom: auto;\\n}\\n\\n.dropdown-divider {\\n  height: 0;\\n  margin: 0.5rem 0;\\n  overflow: hidden;\\n  border-top: 1px solid #e9ecef;\\n}\\n\\n.dropdown-item {\\n  display: block;\\n  width: 100%;\\n  padding: 0.25rem 1.5rem;\\n  clear: both;\\n  font-weight: 400;\\n  color: #212529;\\n  text-align: inherit;\\n  white-space: nowrap;\\n  background-color: transparent;\\n  border: 0;\\n}\\n\\n.dropdown-item:hover, .dropdown-item:focus {\\n  color: #16181b;\\n  text-decoration: none;\\n  background-color: #f8f9fa;\\n}\\n\\n.dropdown-item.active, .dropdown-item:active {\\n  color: #fff;\\n  text-decoration: none;\\n  background-color: #007bff;\\n}\\n\\n.dropdown-item.disabled, .dropdown-item:disabled {\\n  color: #6c757d;\\n  pointer-events: none;\\n  background-color: transparent;\\n}\\n\\n.dropdown-menu.show {\\n  display: block;\\n}\\n\\n.dropdown-header {\\n  display: block;\\n  padding: 0.5rem 1.5rem;\\n  margin-bottom: 0;\\n  font-size: 0.875rem;\\n  color: #6c757d;\\n  white-space: nowrap;\\n}\\n\\n.dropdown-item-text {\\n  display: block;\\n  padding: 0.25rem 1.5rem;\\n  color: #212529;\\n}\\n\\n.btn-group,\\n.btn-group-vertical {\\n  position: relative;\\n  display: inline-flex;\\n  vertical-align: middle;\\n}\\n\\n.btn-group > .btn,\\n.btn-group-vertical > .btn {\\n  position: relative;\\n  flex: 1 1 auto;\\n}\\n\\n.btn-group > .btn:hover,\\n.btn-group-vertical > .btn:hover {\\n  z-index: 1;\\n}\\n\\n.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\\n.btn-group-vertical > .btn:focus,\\n.btn-group-vertical > .btn:active,\\n.btn-group-vertical > .btn.active {\\n  z-index: 1;\\n}\\n\\n.btn-toolbar {\\n  display: flex;\\n  flex-wrap: wrap;\\n  justify-content: flex-start;\\n}\\n\\n.btn-toolbar .input-group {\\n  width: auto;\\n}\\n\\n.btn-group > .btn:not(:first-child),\\n.btn-group > .btn-group:not(:first-child) {\\n  margin-left: -1px;\\n}\\n\\n.btn-group > .btn:not(:last-child):not(.dropdown-toggle),\\n.btn-group > .btn-group:not(:last-child) > .btn {\\n  border-top-right-radius: 0;\\n  border-bottom-right-radius: 0;\\n}\\n\\n.btn-group > .btn:not(:first-child),\\n.btn-group > .btn-group:not(:first-child) > .btn {\\n  border-top-left-radius: 0;\\n  border-bottom-left-radius: 0;\\n}\\n\\n.dropdown-toggle-split {\\n  padding-right: 0.5625rem;\\n  padding-left: 0.5625rem;\\n}\\n\\n.dropdown-toggle-split::after,\\n.dropup .dropdown-toggle-split::after,\\n.dropright .dropdown-toggle-split::after {\\n  margin-left: 0;\\n}\\n\\n.dropleft .dropdown-toggle-split::before {\\n  margin-right: 0;\\n}\\n\\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\\n  padding-right: 0.375rem;\\n  padding-left: 0.375rem;\\n}\\n\\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\\n  padding-right: 0.75rem;\\n  padding-left: 0.75rem;\\n}\\n\\n.btn-group-vertical {\\n  flex-direction: column;\\n  align-items: flex-start;\\n  justify-content: center;\\n}\\n\\n.btn-group-vertical > .btn,\\n.btn-group-vertical > .btn-group {\\n  width: 100%;\\n}\\n\\n.btn-group-vertical > .btn:not(:first-child),\\n.btn-group-vertical > .btn-group:not(:first-child) {\\n  margin-top: -1px;\\n}\\n\\n.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),\\n.btn-group-vertical > .btn-group:not(:last-child) > .btn {\\n  border-bottom-right-radius: 0;\\n  border-bottom-left-radius: 0;\\n}\\n\\n.btn-group-vertical > .btn:not(:first-child),\\n.btn-group-vertical > .btn-group:not(:first-child) > .btn {\\n  border-top-left-radius: 0;\\n  border-top-right-radius: 0;\\n}\\n\\n.btn-group-toggle > .btn,\\n.btn-group-toggle > .btn-group > .btn {\\n  margin-bottom: 0;\\n}\\n\\n.btn-group-toggle > .btn input[type=\\\"radio\\\"],\\n.btn-group-toggle > .btn input[type=\\\"checkbox\\\"],\\n.btn-group-toggle > .btn-group > .btn input[type=\\\"radio\\\"],\\n.btn-group-toggle > .btn-group > .btn input[type=\\\"checkbox\\\"] {\\n  position: absolute;\\n  clip: rect(0, 0, 0, 0);\\n  pointer-events: none;\\n}\\n\\n.input-group {\\n  position: relative;\\n  display: flex;\\n  flex-wrap: wrap;\\n  align-items: stretch;\\n  width: 100%;\\n}\\n\\n.input-group > .form-control,\\n.input-group > .form-control-plaintext,\\n.input-group > .custom-select,\\n.input-group > .custom-file {\\n  position: relative;\\n  flex: 1 1 auto;\\n  width: 1%;\\n  margin-bottom: 0;\\n}\\n\\n.input-group > .form-control + .form-control,\\n.input-group > .form-control + .custom-select,\\n.input-group > .form-control + .custom-file,\\n.input-group > .form-control-plaintext + .form-control,\\n.input-group > .form-control-plaintext + .custom-select,\\n.input-group > .form-control-plaintext + .custom-file,\\n.input-group > .custom-select + .form-control,\\n.input-group > .custom-select + .custom-select,\\n.input-group > .custom-select + .custom-file,\\n.input-group > .custom-file + .form-control,\\n.input-group > .custom-file + .custom-select,\\n.input-group > .custom-file + .custom-file {\\n  margin-left: -1px;\\n}\\n\\n.input-group > .form-control:focus,\\n.input-group > .custom-select:focus,\\n.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label {\\n  z-index: 3;\\n}\\n\\n.input-group > .custom-file .custom-file-input:focus {\\n  z-index: 4;\\n}\\n\\n.input-group > .form-control:not(:last-child),\\n.input-group > .custom-select:not(:last-child) {\\n  border-top-right-radius: 0;\\n  border-bottom-right-radius: 0;\\n}\\n\\n.input-group > .form-control:not(:first-child),\\n.input-group > .custom-select:not(:first-child) {\\n  border-top-left-radius: 0;\\n  border-bottom-left-radius: 0;\\n}\\n\\n.input-group > .custom-file {\\n  display: flex;\\n  align-items: center;\\n}\\n\\n.input-group > .custom-file:not(:last-child) .custom-file-label,\\n.input-group > .custom-file:not(:last-child) .custom-file-label::after {\\n  border-top-right-radius: 0;\\n  border-bottom-right-radius: 0;\\n}\\n\\n.input-group > .custom-file:not(:first-child) .custom-file-label {\\n  border-top-left-radius: 0;\\n  border-bottom-left-radius: 0;\\n}\\n\\n.input-group-prepend,\\n.input-group-append {\\n  display: flex;\\n}\\n\\n.input-group-prepend .btn,\\n.input-group-append .btn {\\n  position: relative;\\n  z-index: 2;\\n}\\n\\n.input-group-prepend .btn:focus,\\n.input-group-append .btn:focus {\\n  z-index: 3;\\n}\\n\\n.input-group-prepend .btn + .btn,\\n.input-group-prepend .btn + .input-group-text,\\n.input-group-prepend .input-group-text + .input-group-text,\\n.input-group-prepend .input-group-text + .btn,\\n.input-group-append .btn + .btn,\\n.input-group-append .btn + .input-group-text,\\n.input-group-append .input-group-text + .input-group-text,\\n.input-group-append .input-group-text + .btn {\\n  margin-left: -1px;\\n}\\n\\n.input-group-prepend {\\n  margin-right: -1px;\\n}\\n\\n.input-group-append {\\n  margin-left: -1px;\\n}\\n\\n.input-group-text {\\n  display: flex;\\n  align-items: center;\\n  padding: 0.375rem 0.75rem;\\n  margin-bottom: 0;\\n  font-size: 1rem;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  color: #495057;\\n  text-align: center;\\n  white-space: nowrap;\\n  background-color: #e9ecef;\\n  border: 1px solid #ced4da;\\n  border-radius: 0.25rem;\\n}\\n\\n.input-group-text input[type=\\\"radio\\\"],\\n.input-group-text input[type=\\\"checkbox\\\"] {\\n  margin-top: 0;\\n}\\n\\n.input-group-lg > .form-control:not(textarea),\\n.input-group-lg > .custom-select {\\n  height: calc(1.5em + 1rem + 2px);\\n}\\n\\n.input-group-lg > .form-control,\\n.input-group-lg > .custom-select,\\n.input-group-lg > .input-group-prepend > .input-group-text,\\n.input-group-lg > .input-group-append > .input-group-text,\\n.input-group-lg > .input-group-prepend > .btn,\\n.input-group-lg > .input-group-append > .btn {\\n  padding: 0.5rem 1rem;\\n  font-size: 1.25rem;\\n  line-height: 1.5;\\n  border-radius: 0.3rem;\\n}\\n\\n.input-group-sm > .form-control:not(textarea),\\n.input-group-sm > .custom-select {\\n  height: calc(1.5em + 0.5rem + 2px);\\n}\\n\\n.input-group-sm > .form-control,\\n.input-group-sm > .custom-select,\\n.input-group-sm > .input-group-prepend > .input-group-text,\\n.input-group-sm > .input-group-append > .input-group-text,\\n.input-group-sm > .input-group-prepend > .btn,\\n.input-group-sm > .input-group-append > .btn {\\n  padding: 0.25rem 0.5rem;\\n  font-size: 0.875rem;\\n  line-height: 1.5;\\n  border-radius: 0.2rem;\\n}\\n\\n.input-group-lg > .custom-select,\\n.input-group-sm > .custom-select {\\n  padding-right: 1.75rem;\\n}\\n\\n.input-group > .input-group-prepend > .btn,\\n.input-group > .input-group-prepend > .input-group-text,\\n.input-group > .input-group-append:not(:last-child) > .btn,\\n.input-group > .input-group-append:not(:last-child) > .input-group-text,\\n.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),\\n.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {\\n  border-top-right-radius: 0;\\n  border-bottom-right-radius: 0;\\n}\\n\\n.input-group > .input-group-append > .btn,\\n.input-group > .input-group-append > .input-group-text,\\n.input-group > .input-group-prepend:not(:first-child) > .btn,\\n.input-group > .input-group-prepend:not(:first-child) > .input-group-text,\\n.input-group > .input-group-prepend:first-child > .btn:not(:first-child),\\n.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {\\n  border-top-left-radius: 0;\\n  border-bottom-left-radius: 0;\\n}\\n\\n.custom-control {\\n  position: relative;\\n  display: block;\\n  min-height: 1.5rem;\\n  padding-left: 1.5rem;\\n}\\n\\n.custom-control-inline {\\n  display: inline-flex;\\n  margin-right: 1rem;\\n}\\n\\n.custom-control-input {\\n  position: absolute;\\n  z-index: -1;\\n  opacity: 0;\\n}\\n\\n.custom-control-input:checked ~ .custom-control-label::before {\\n  color: #fff;\\n  border-color: #007bff;\\n  background-color: #007bff;\\n}\\n\\n.custom-control-input:focus ~ .custom-control-label::before {\\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\\n}\\n\\n.custom-control-input:focus:not(:checked) ~ .custom-control-label::before {\\n  border-color: #80bdff;\\n}\\n\\n.custom-control-input:not(:disabled):active ~ .custom-control-label::before {\\n  color: #fff;\\n  background-color: #b3d7ff;\\n  border-color: #b3d7ff;\\n}\\n\\n.custom-control-input:disabled ~ .custom-control-label {\\n  color: #6c757d;\\n}\\n\\n.custom-control-input:disabled ~ .custom-control-label::before {\\n  background-color: #e9ecef;\\n}\\n\\n.custom-control-label {\\n  position: relative;\\n  margin-bottom: 0;\\n  vertical-align: top;\\n}\\n\\n.custom-control-label::before {\\n  position: absolute;\\n  top: 0.25rem;\\n  left: -1.5rem;\\n  display: block;\\n  width: 1rem;\\n  height: 1rem;\\n  pointer-events: none;\\n  content: \\\"\\\";\\n  background-color: #fff;\\n  border: #adb5bd solid 1px;\\n}\\n\\n.custom-control-label::after {\\n  position: absolute;\\n  top: 0.25rem;\\n  left: -1.5rem;\\n  display: block;\\n  width: 1rem;\\n  height: 1rem;\\n  content: \\\"\\\";\\n  background: no-repeat 50% / 50% 50%;\\n}\\n\\n.custom-checkbox .custom-control-label::before {\\n  border-radius: 0.25rem;\\n}\\n\\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {\\n  background-image: url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e\\\");\\n}\\n\\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {\\n  border-color: #007bff;\\n  background-color: #007bff;\\n}\\n\\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {\\n  background-image: url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e\\\");\\n}\\n\\n.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {\\n  background-color: rgba(0, 123, 255, 0.5);\\n}\\n\\n.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before {\\n  background-color: rgba(0, 123, 255, 0.5);\\n}\\n\\n.custom-radio .custom-control-label::before {\\n  border-radius: 50%;\\n}\\n\\n.custom-radio .custom-control-input:checked ~ .custom-control-label::after {\\n  background-image: url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e\\\");\\n}\\n\\n.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {\\n  background-color: rgba(0, 123, 255, 0.5);\\n}\\n\\n.custom-switch {\\n  padding-left: 2.25rem;\\n}\\n\\n.custom-switch .custom-control-label::before {\\n  left: -2.25rem;\\n  width: 1.75rem;\\n  pointer-events: all;\\n  border-radius: 0.5rem;\\n}\\n\\n.custom-switch .custom-control-label::after {\\n  top: calc(0.25rem + 2px);\\n  left: calc(-2.25rem + 2px);\\n  width: calc(1rem - 4px);\\n  height: calc(1rem - 4px);\\n  background-color: #adb5bd;\\n  border-radius: 0.5rem;\\n  transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .custom-switch .custom-control-label::after {\\n    transition: none;\\n  }\\n}\\n\\n.custom-switch .custom-control-input:checked ~ .custom-control-label::after {\\n  background-color: #fff;\\n  transform: translateX(0.75rem);\\n}\\n\\n.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before {\\n  background-color: rgba(0, 123, 255, 0.5);\\n}\\n\\n.custom-select {\\n  display: inline-block;\\n  width: 100%;\\n  height: calc(1.5em + 0.75rem + 2px);\\n  padding: 0.375rem 1.75rem 0.375rem 0.75rem;\\n  font-size: 1rem;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  color: #495057;\\n  vertical-align: middle;\\n  background: url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\\\") no-repeat right 0.75rem center/8px 10px;\\n  background-color: #fff;\\n  border: 1px solid #ced4da;\\n  border-radius: 0.25rem;\\n  appearance: none;\\n}\\n\\n.custom-select:focus {\\n  border-color: #80bdff;\\n  outline: 0;\\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\\n}\\n\\n.custom-select:focus::-ms-value {\\n  color: #495057;\\n  background-color: #fff;\\n}\\n\\n.custom-select[multiple], .custom-select[size]:not([size=\\\"1\\\"]) {\\n  height: auto;\\n  padding-right: 0.75rem;\\n  background-image: none;\\n}\\n\\n.custom-select:disabled {\\n  color: #6c757d;\\n  background-color: #e9ecef;\\n}\\n\\n.custom-select::-ms-expand {\\n  display: none;\\n}\\n\\n.custom-select-sm {\\n  height: calc(1.5em + 0.5rem + 2px);\\n  padding-top: 0.25rem;\\n  padding-bottom: 0.25rem;\\n  padding-left: 0.5rem;\\n  font-size: 0.875rem;\\n}\\n\\n.custom-select-lg {\\n  height: calc(1.5em + 1rem + 2px);\\n  padding-top: 0.5rem;\\n  padding-bottom: 0.5rem;\\n  padding-left: 1rem;\\n  font-size: 1.25rem;\\n}\\n\\n.custom-file {\\n  position: relative;\\n  display: inline-block;\\n  width: 100%;\\n  height: calc(1.5em + 0.75rem + 2px);\\n  margin-bottom: 0;\\n}\\n\\n.custom-file-input {\\n  position: relative;\\n  z-index: 2;\\n  width: 100%;\\n  height: calc(1.5em + 0.75rem + 2px);\\n  margin: 0;\\n  opacity: 0;\\n}\\n\\n.custom-file-input:focus ~ .custom-file-label {\\n  border-color: #80bdff;\\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\\n}\\n\\n.custom-file-input:disabled ~ .custom-file-label {\\n  background-color: #e9ecef;\\n}\\n\\n.custom-file-input:lang(en) ~ .custom-file-label::after {\\n  content: \\\"Browse\\\";\\n}\\n\\n.custom-file-input ~ .custom-file-label[data-browse]::after {\\n  content: attr(data-browse);\\n}\\n\\n.custom-file-label {\\n  position: absolute;\\n  top: 0;\\n  right: 0;\\n  left: 0;\\n  z-index: 1;\\n  height: calc(1.5em + 0.75rem + 2px);\\n  padding: 0.375rem 0.75rem;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  color: #495057;\\n  background-color: #fff;\\n  border: 1px solid #ced4da;\\n  border-radius: 0.25rem;\\n}\\n\\n.custom-file-label::after {\\n  position: absolute;\\n  top: 0;\\n  right: 0;\\n  bottom: 0;\\n  z-index: 3;\\n  display: block;\\n  height: calc(1.5em + 0.75rem);\\n  padding: 0.375rem 0.75rem;\\n  line-height: 1.5;\\n  color: #495057;\\n  content: \\\"Browse\\\";\\n  background-color: #e9ecef;\\n  border-left: inherit;\\n  border-radius: 0 0.25rem 0.25rem 0;\\n}\\n\\n.custom-range {\\n  width: 100%;\\n  height: calc(1rem + 0.4rem);\\n  padding: 0;\\n  background-color: transparent;\\n  appearance: none;\\n}\\n\\n.custom-range:focus {\\n  outline: none;\\n}\\n\\n.custom-range:focus::-webkit-slider-thumb {\\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\\n}\\n\\n.custom-range:focus::-moz-range-thumb {\\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\\n}\\n\\n.custom-range:focus::-ms-thumb {\\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\\n}\\n\\n.custom-range::-moz-focus-outer {\\n  border: 0;\\n}\\n\\n.custom-range::-webkit-slider-thumb {\\n  width: 1rem;\\n  height: 1rem;\\n  margin-top: -0.25rem;\\n  background-color: #007bff;\\n  border: 0;\\n  border-radius: 1rem;\\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\\n  appearance: none;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .custom-range::-webkit-slider-thumb {\\n    transition: none;\\n  }\\n}\\n\\n.custom-range::-webkit-slider-thumb:active {\\n  background-color: #b3d7ff;\\n}\\n\\n.custom-range::-webkit-slider-runnable-track {\\n  width: 100%;\\n  height: 0.5rem;\\n  color: transparent;\\n  cursor: pointer;\\n  background-color: #dee2e6;\\n  border-color: transparent;\\n  border-radius: 1rem;\\n}\\n\\n.custom-range::-moz-range-thumb {\\n  width: 1rem;\\n  height: 1rem;\\n  background-color: #007bff;\\n  border: 0;\\n  border-radius: 1rem;\\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\\n  appearance: none;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .custom-range::-moz-range-thumb {\\n    transition: none;\\n  }\\n}\\n\\n.custom-range::-moz-range-thumb:active {\\n  background-color: #b3d7ff;\\n}\\n\\n.custom-range::-moz-range-track {\\n  width: 100%;\\n  height: 0.5rem;\\n  color: transparent;\\n  cursor: pointer;\\n  background-color: #dee2e6;\\n  border-color: transparent;\\n  border-radius: 1rem;\\n}\\n\\n.custom-range::-ms-thumb {\\n  width: 1rem;\\n  height: 1rem;\\n  margin-top: 0;\\n  margin-right: 0.2rem;\\n  margin-left: 0.2rem;\\n  background-color: #007bff;\\n  border: 0;\\n  border-radius: 1rem;\\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\\n  appearance: none;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .custom-range::-ms-thumb {\\n    transition: none;\\n  }\\n}\\n\\n.custom-range::-ms-thumb:active {\\n  background-color: #b3d7ff;\\n}\\n\\n.custom-range::-ms-track {\\n  width: 100%;\\n  height: 0.5rem;\\n  color: transparent;\\n  cursor: pointer;\\n  background-color: transparent;\\n  border-color: transparent;\\n  border-width: 0.5rem;\\n}\\n\\n.custom-range::-ms-fill-lower {\\n  background-color: #dee2e6;\\n  border-radius: 1rem;\\n}\\n\\n.custom-range::-ms-fill-upper {\\n  margin-right: 15px;\\n  background-color: #dee2e6;\\n  border-radius: 1rem;\\n}\\n\\n.custom-range:disabled::-webkit-slider-thumb {\\n  background-color: #adb5bd;\\n}\\n\\n.custom-range:disabled::-webkit-slider-runnable-track {\\n  cursor: default;\\n}\\n\\n.custom-range:disabled::-moz-range-thumb {\\n  background-color: #adb5bd;\\n}\\n\\n.custom-range:disabled::-moz-range-track {\\n  cursor: default;\\n}\\n\\n.custom-range:disabled::-ms-thumb {\\n  background-color: #adb5bd;\\n}\\n\\n.custom-control-label::before,\\n.custom-file-label,\\n.custom-select {\\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .custom-control-label::before,\\n  .custom-file-label,\\n  .custom-select {\\n    transition: none;\\n  }\\n}\\n\\n.nav {\\n  display: flex;\\n  flex-wrap: wrap;\\n  padding-left: 0;\\n  margin-bottom: 0;\\n  list-style: none;\\n}\\n\\n.nav-link {\\n  display: block;\\n  padding: 0.5rem 1rem;\\n}\\n\\n.nav-link:hover, .nav-link:focus {\\n  text-decoration: none;\\n}\\n\\n.nav-link.disabled {\\n  color: #6c757d;\\n  pointer-events: none;\\n  cursor: default;\\n}\\n\\n.nav-tabs {\\n  border-bottom: 1px solid #dee2e6;\\n}\\n\\n.nav-tabs .nav-item {\\n  margin-bottom: -1px;\\n}\\n\\n.nav-tabs .nav-link {\\n  border: 1px solid transparent;\\n  border-top-left-radius: 0.25rem;\\n  border-top-right-radius: 0.25rem;\\n}\\n\\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\\n  border-color: #e9ecef #e9ecef #dee2e6;\\n}\\n\\n.nav-tabs .nav-link.disabled {\\n  color: #6c757d;\\n  background-color: transparent;\\n  border-color: transparent;\\n}\\n\\n.nav-tabs .nav-link.active,\\n.nav-tabs .nav-item.show .nav-link {\\n  color: #495057;\\n  background-color: #fff;\\n  border-color: #dee2e6 #dee2e6 #fff;\\n}\\n\\n.nav-tabs .dropdown-menu {\\n  margin-top: -1px;\\n  border-top-left-radius: 0;\\n  border-top-right-radius: 0;\\n}\\n\\n.nav-pills .nav-link {\\n  border-radius: 0.25rem;\\n}\\n\\n.nav-pills .nav-link.active,\\n.nav-pills .show > .nav-link {\\n  color: #fff;\\n  background-color: #007bff;\\n}\\n\\n.nav-fill .nav-item {\\n  flex: 1 1 auto;\\n  text-align: center;\\n}\\n\\n.nav-justified .nav-item {\\n  flex-basis: 0;\\n  flex-grow: 1;\\n  text-align: center;\\n}\\n\\n.tab-content > .tab-pane {\\n  display: none;\\n}\\n\\n.tab-content > .active {\\n  display: block;\\n}\\n\\n.navbar {\\n  position: relative;\\n  display: flex;\\n  flex-wrap: wrap;\\n  align-items: center;\\n  justify-content: space-between;\\n  padding: 0.5rem 1rem;\\n}\\n\\n.navbar > .container,\\n.navbar > .container-fluid {\\n  display: flex;\\n  flex-wrap: wrap;\\n  align-items: center;\\n  justify-content: space-between;\\n}\\n\\n.navbar-brand {\\n  display: inline-block;\\n  padding-top: 0.3125rem;\\n  padding-bottom: 0.3125rem;\\n  margin-right: 1rem;\\n  font-size: 1.25rem;\\n  line-height: inherit;\\n  white-space: nowrap;\\n}\\n\\n.navbar-brand:hover, .navbar-brand:focus {\\n  text-decoration: none;\\n}\\n\\n.navbar-nav {\\n  display: flex;\\n  flex-direction: column;\\n  padding-left: 0;\\n  margin-bottom: 0;\\n  list-style: none;\\n}\\n\\n.navbar-nav .nav-link {\\n  padding-right: 0;\\n  padding-left: 0;\\n}\\n\\n.navbar-nav .dropdown-menu {\\n  position: static;\\n  float: none;\\n}\\n\\n.navbar-text {\\n  display: inline-block;\\n  padding-top: 0.5rem;\\n  padding-bottom: 0.5rem;\\n}\\n\\n.navbar-collapse {\\n  flex-basis: 100%;\\n  flex-grow: 1;\\n  align-items: center;\\n}\\n\\n.navbar-toggler {\\n  padding: 0.25rem 0.75rem;\\n  font-size: 1.25rem;\\n  line-height: 1;\\n  background-color: transparent;\\n  border: 1px solid transparent;\\n  border-radius: 0.25rem;\\n}\\n\\n.navbar-toggler:hover, .navbar-toggler:focus {\\n  text-decoration: none;\\n}\\n\\n.navbar-toggler-icon {\\n  display: inline-block;\\n  width: 1.5em;\\n  height: 1.5em;\\n  vertical-align: middle;\\n  content: \\\"\\\";\\n  background: no-repeat center center;\\n  background-size: 100% 100%;\\n}\\n\\n@media (max-width: 575.98px) {\\n  .navbar-expand-sm > .container,\\n  .navbar-expand-sm > .container-fluid {\\n    padding-right: 0;\\n    padding-left: 0;\\n  }\\n}\\n\\n@media (min-width: 576px) {\\n  .navbar-expand-sm {\\n    flex-flow: row nowrap;\\n    justify-content: flex-start;\\n  }\\n  .navbar-expand-sm .navbar-nav {\\n    flex-direction: row;\\n  }\\n  .navbar-expand-sm .navbar-nav .dropdown-menu {\\n    position: absolute;\\n  }\\n  .navbar-expand-sm .navbar-nav .nav-link {\\n    padding-right: 0.5rem;\\n    padding-left: 0.5rem;\\n  }\\n  .navbar-expand-sm > .container,\\n  .navbar-expand-sm > .container-fluid {\\n    flex-wrap: nowrap;\\n  }\\n  .navbar-expand-sm .navbar-collapse {\\n    display: flex !important;\\n    flex-basis: auto;\\n  }\\n  .navbar-expand-sm .navbar-toggler {\\n    display: none;\\n  }\\n}\\n\\n@media (max-width: 767.98px) {\\n  .navbar-expand-md > .container,\\n  .navbar-expand-md > .container-fluid {\\n    padding-right: 0;\\n    padding-left: 0;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .navbar-expand-md {\\n    flex-flow: row nowrap;\\n    justify-content: flex-start;\\n  }\\n  .navbar-expand-md .navbar-nav {\\n    flex-direction: row;\\n  }\\n  .navbar-expand-md .navbar-nav .dropdown-menu {\\n    position: absolute;\\n  }\\n  .navbar-expand-md .navbar-nav .nav-link {\\n    padding-right: 0.5rem;\\n    padding-left: 0.5rem;\\n  }\\n  .navbar-expand-md > .container,\\n  .navbar-expand-md > .container-fluid {\\n    flex-wrap: nowrap;\\n  }\\n  .navbar-expand-md .navbar-collapse {\\n    display: flex !important;\\n    flex-basis: auto;\\n  }\\n  .navbar-expand-md .navbar-toggler {\\n    display: none;\\n  }\\n}\\n\\n@media (max-width: 991.98px) {\\n  .navbar-expand-lg > .container,\\n  .navbar-expand-lg > .container-fluid {\\n    padding-right: 0;\\n    padding-left: 0;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .navbar-expand-lg {\\n    flex-flow: row nowrap;\\n    justify-content: flex-start;\\n  }\\n  .navbar-expand-lg .navbar-nav {\\n    flex-direction: row;\\n  }\\n  .navbar-expand-lg .navbar-nav .dropdown-menu {\\n    position: absolute;\\n  }\\n  .navbar-expand-lg .navbar-nav .nav-link {\\n    padding-right: 0.5rem;\\n    padding-left: 0.5rem;\\n  }\\n  .navbar-expand-lg > .container,\\n  .navbar-expand-lg > .container-fluid {\\n    flex-wrap: nowrap;\\n  }\\n  .navbar-expand-lg .navbar-collapse {\\n    display: flex !important;\\n    flex-basis: auto;\\n  }\\n  .navbar-expand-lg .navbar-toggler {\\n    display: none;\\n  }\\n}\\n\\n@media (max-width: 1199.98px) {\\n  .navbar-expand-xl > .container,\\n  .navbar-expand-xl > .container-fluid {\\n    padding-right: 0;\\n    padding-left: 0;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .navbar-expand-xl {\\n    flex-flow: row nowrap;\\n    justify-content: flex-start;\\n  }\\n  .navbar-expand-xl .navbar-nav {\\n    flex-direction: row;\\n  }\\n  .navbar-expand-xl .navbar-nav .dropdown-menu {\\n    position: absolute;\\n  }\\n  .navbar-expand-xl .navbar-nav .nav-link {\\n    padding-right: 0.5rem;\\n    padding-left: 0.5rem;\\n  }\\n  .navbar-expand-xl > .container,\\n  .navbar-expand-xl > .container-fluid {\\n    flex-wrap: nowrap;\\n  }\\n  .navbar-expand-xl .navbar-collapse {\\n    display: flex !important;\\n    flex-basis: auto;\\n  }\\n  .navbar-expand-xl .navbar-toggler {\\n    display: none;\\n  }\\n}\\n\\n.navbar-expand {\\n  flex-flow: row nowrap;\\n  justify-content: flex-start;\\n}\\n\\n.navbar-expand > .container,\\n.navbar-expand > .container-fluid {\\n  padding-right: 0;\\n  padding-left: 0;\\n}\\n\\n.navbar-expand .navbar-nav {\\n  flex-direction: row;\\n}\\n\\n.navbar-expand .navbar-nav .dropdown-menu {\\n  position: absolute;\\n}\\n\\n.navbar-expand .navbar-nav .nav-link {\\n  padding-right: 0.5rem;\\n  padding-left: 0.5rem;\\n}\\n\\n.navbar-expand > .container,\\n.navbar-expand > .container-fluid {\\n  flex-wrap: nowrap;\\n}\\n\\n.navbar-expand .navbar-collapse {\\n  display: flex !important;\\n  flex-basis: auto;\\n}\\n\\n.navbar-expand .navbar-toggler {\\n  display: none;\\n}\\n\\n.navbar-light .navbar-brand {\\n  color: rgba(0, 0, 0, 0.9);\\n}\\n\\n.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {\\n  color: rgba(0, 0, 0, 0.9);\\n}\\n\\n.navbar-light .navbar-nav .nav-link {\\n  color: rgba(0, 0, 0, 0.5);\\n}\\n\\n.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {\\n  color: rgba(0, 0, 0, 0.7);\\n}\\n\\n.navbar-light .navbar-nav .nav-link.disabled {\\n  color: rgba(0, 0, 0, 0.3);\\n}\\n\\n.navbar-light .navbar-nav .show > .nav-link,\\n.navbar-light .navbar-nav .active > .nav-link,\\n.navbar-light .navbar-nav .nav-link.show,\\n.navbar-light .navbar-nav .nav-link.active {\\n  color: rgba(0, 0, 0, 0.9);\\n}\\n\\n.navbar-light .navbar-toggler {\\n  color: rgba(0, 0, 0, 0.5);\\n  border-color: rgba(0, 0, 0, 0.1);\\n}\\n\\n.navbar-light .navbar-toggler-icon {\\n  background-image: url(\\\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\\\");\\n}\\n\\n.navbar-light .navbar-text {\\n  color: rgba(0, 0, 0, 0.5);\\n}\\n\\n.navbar-light .navbar-text a {\\n  color: rgba(0, 0, 0, 0.9);\\n}\\n\\n.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {\\n  color: rgba(0, 0, 0, 0.9);\\n}\\n\\n.navbar-dark .navbar-brand {\\n  color: #fff;\\n}\\n\\n.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {\\n  color: #fff;\\n}\\n\\n.navbar-dark .navbar-nav .nav-link {\\n  color: rgba(255, 255, 255, 0.5);\\n}\\n\\n.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {\\n  color: rgba(255, 255, 255, 0.75);\\n}\\n\\n.navbar-dark .navbar-nav .nav-link.disabled {\\n  color: rgba(255, 255, 255, 0.25);\\n}\\n\\n.navbar-dark .navbar-nav .show > .nav-link,\\n.navbar-dark .navbar-nav .active > .nav-link,\\n.navbar-dark .navbar-nav .nav-link.show,\\n.navbar-dark .navbar-nav .nav-link.active {\\n  color: #fff;\\n}\\n\\n.navbar-dark .navbar-toggler {\\n  color: rgba(255, 255, 255, 0.5);\\n  border-color: rgba(255, 255, 255, 0.1);\\n}\\n\\n.navbar-dark .navbar-toggler-icon {\\n  background-image: url(\\\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\\\");\\n}\\n\\n.navbar-dark .navbar-text {\\n  color: rgba(255, 255, 255, 0.5);\\n}\\n\\n.navbar-dark .navbar-text a {\\n  color: #fff;\\n}\\n\\n.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {\\n  color: #fff;\\n}\\n\\n.card {\\n  position: relative;\\n  display: flex;\\n  flex-direction: column;\\n  min-width: 0;\\n  word-wrap: break-word;\\n  background-color: #fff;\\n  background-clip: border-box;\\n  border: 1px solid rgba(0, 0, 0, 0.125);\\n  border-radius: 0.25rem;\\n}\\n\\n.card > hr {\\n  margin-right: 0;\\n  margin-left: 0;\\n}\\n\\n.card > .list-group:first-child .list-group-item:first-child {\\n  border-top-left-radius: 0.25rem;\\n  border-top-right-radius: 0.25rem;\\n}\\n\\n.card > .list-group:last-child .list-group-item:last-child {\\n  border-bottom-right-radius: 0.25rem;\\n  border-bottom-left-radius: 0.25rem;\\n}\\n\\n.card-body {\\n  flex: 1 1 auto;\\n  padding: 1.25rem;\\n}\\n\\n.card-title {\\n  margin-bottom: 0.75rem;\\n}\\n\\n.card-subtitle {\\n  margin-top: -0.375rem;\\n  margin-bottom: 0;\\n}\\n\\n.card-text:last-child {\\n  margin-bottom: 0;\\n}\\n\\n.card-link:hover {\\n  text-decoration: none;\\n}\\n\\n.card-link + .card-link {\\n  margin-left: 1.25rem;\\n}\\n\\n.card-header {\\n  padding: 0.75rem 1.25rem;\\n  margin-bottom: 0;\\n  background-color: rgba(0, 0, 0, 0.03);\\n  border-bottom: 1px solid rgba(0, 0, 0, 0.125);\\n}\\n\\n.card-header:first-child {\\n  border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\\n}\\n\\n.card-header + .list-group .list-group-item:first-child {\\n  border-top: 0;\\n}\\n\\n.card-footer {\\n  padding: 0.75rem 1.25rem;\\n  background-color: rgba(0, 0, 0, 0.03);\\n  border-top: 1px solid rgba(0, 0, 0, 0.125);\\n}\\n\\n.card-footer:last-child {\\n  border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\\n}\\n\\n.card-header-tabs {\\n  margin-right: -0.625rem;\\n  margin-bottom: -0.75rem;\\n  margin-left: -0.625rem;\\n  border-bottom: 0;\\n}\\n\\n.card-header-pills {\\n  margin-right: -0.625rem;\\n  margin-left: -0.625rem;\\n}\\n\\n.card-img-overlay {\\n  position: absolute;\\n  top: 0;\\n  right: 0;\\n  bottom: 0;\\n  left: 0;\\n  padding: 1.25rem;\\n}\\n\\n.card-img {\\n  width: 100%;\\n  border-radius: calc(0.25rem - 1px);\\n}\\n\\n.card-img-top {\\n  width: 100%;\\n  border-top-left-radius: calc(0.25rem - 1px);\\n  border-top-right-radius: calc(0.25rem - 1px);\\n}\\n\\n.card-img-bottom {\\n  width: 100%;\\n  border-bottom-right-radius: calc(0.25rem - 1px);\\n  border-bottom-left-radius: calc(0.25rem - 1px);\\n}\\n\\n.card-deck {\\n  display: flex;\\n  flex-direction: column;\\n}\\n\\n.card-deck .card {\\n  margin-bottom: 15px;\\n}\\n\\n@media (min-width: 576px) {\\n  .card-deck {\\n    flex-flow: row wrap;\\n    margin-right: -15px;\\n    margin-left: -15px;\\n  }\\n  .card-deck .card {\\n    display: flex;\\n    flex: 1 0 0%;\\n    flex-direction: column;\\n    margin-right: 15px;\\n    margin-bottom: 0;\\n    margin-left: 15px;\\n  }\\n}\\n\\n.card-group {\\n  display: flex;\\n  flex-direction: column;\\n}\\n\\n.card-group > .card {\\n  margin-bottom: 15px;\\n}\\n\\n@media (min-width: 576px) {\\n  .card-group {\\n    flex-flow: row wrap;\\n  }\\n  .card-group > .card {\\n    flex: 1 0 0%;\\n    margin-bottom: 0;\\n  }\\n  .card-group > .card + .card {\\n    margin-left: 0;\\n    border-left: 0;\\n  }\\n  .card-group > .card:not(:last-child) {\\n    border-top-right-radius: 0;\\n    border-bottom-right-radius: 0;\\n  }\\n  .card-group > .card:not(:last-child) .card-img-top,\\n  .card-group > .card:not(:last-child) .card-header {\\n    border-top-right-radius: 0;\\n  }\\n  .card-group > .card:not(:last-child) .card-img-bottom,\\n  .card-group > .card:not(:last-child) .card-footer {\\n    border-bottom-right-radius: 0;\\n  }\\n  .card-group > .card:not(:first-child) {\\n    border-top-left-radius: 0;\\n    border-bottom-left-radius: 0;\\n  }\\n  .card-group > .card:not(:first-child) .card-img-top,\\n  .card-group > .card:not(:first-child) .card-header {\\n    border-top-left-radius: 0;\\n  }\\n  .card-group > .card:not(:first-child) .card-img-bottom,\\n  .card-group > .card:not(:first-child) .card-footer {\\n    border-bottom-left-radius: 0;\\n  }\\n}\\n\\n.card-columns .card {\\n  margin-bottom: 0.75rem;\\n}\\n\\n@media (min-width: 576px) {\\n  .card-columns {\\n    column-count: 3;\\n    column-gap: 1.25rem;\\n    orphans: 1;\\n    widows: 1;\\n  }\\n  .card-columns .card {\\n    display: inline-block;\\n    width: 100%;\\n  }\\n}\\n\\n.accordion > .card {\\n  overflow: hidden;\\n}\\n\\n.accordion > .card:not(:first-of-type) .card-header:first-child {\\n  border-radius: 0;\\n}\\n\\n.accordion > .card:not(:first-of-type):not(:last-of-type) {\\n  border-bottom: 0;\\n  border-radius: 0;\\n}\\n\\n.accordion > .card:first-of-type {\\n  border-bottom: 0;\\n  border-bottom-right-radius: 0;\\n  border-bottom-left-radius: 0;\\n}\\n\\n.accordion > .card:last-of-type {\\n  border-top-left-radius: 0;\\n  border-top-right-radius: 0;\\n}\\n\\n.accordion > .card .card-header {\\n  margin-bottom: -1px;\\n}\\n\\n.breadcrumb {\\n  display: flex;\\n  flex-wrap: wrap;\\n  padding: 0.75rem 1rem;\\n  margin-bottom: 1rem;\\n  list-style: none;\\n  background-color: #e9ecef;\\n  border-radius: 0.25rem;\\n}\\n\\n.breadcrumb-item + .breadcrumb-item {\\n  padding-left: 0.5rem;\\n}\\n\\n.breadcrumb-item + .breadcrumb-item::before {\\n  display: inline-block;\\n  padding-right: 0.5rem;\\n  color: #6c757d;\\n  content: \\\"/\\\";\\n}\\n\\n.breadcrumb-item + .breadcrumb-item:hover::before {\\n  text-decoration: underline;\\n}\\n\\n.breadcrumb-item + .breadcrumb-item:hover::before {\\n  text-decoration: none;\\n}\\n\\n.breadcrumb-item.active {\\n  color: #6c757d;\\n}\\n\\n.pagination {\\n  display: flex;\\n  padding-left: 0;\\n  list-style: none;\\n  border-radius: 0.25rem;\\n}\\n\\n.page-link {\\n  position: relative;\\n  display: block;\\n  padding: 0.5rem 0.75rem;\\n  margin-left: -1px;\\n  line-height: 1.25;\\n  color: #007bff;\\n  background-color: #fff;\\n  border: 1px solid #dee2e6;\\n}\\n\\n.page-link:hover {\\n  z-index: 2;\\n  color: #0056b3;\\n  text-decoration: none;\\n  background-color: #e9ecef;\\n  border-color: #dee2e6;\\n}\\n\\n.page-link:focus {\\n  z-index: 2;\\n  outline: 0;\\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\\n}\\n\\n.page-item:first-child .page-link {\\n  margin-left: 0;\\n  border-top-left-radius: 0.25rem;\\n  border-bottom-left-radius: 0.25rem;\\n}\\n\\n.page-item:last-child .page-link {\\n  border-top-right-radius: 0.25rem;\\n  border-bottom-right-radius: 0.25rem;\\n}\\n\\n.page-item.active .page-link {\\n  z-index: 1;\\n  color: #fff;\\n  background-color: #007bff;\\n  border-color: #007bff;\\n}\\n\\n.page-item.disabled .page-link {\\n  color: #6c757d;\\n  pointer-events: none;\\n  cursor: auto;\\n  background-color: #fff;\\n  border-color: #dee2e6;\\n}\\n\\n.pagination-lg .page-link {\\n  padding: 0.75rem 1.5rem;\\n  font-size: 1.25rem;\\n  line-height: 1.5;\\n}\\n\\n.pagination-lg .page-item:first-child .page-link {\\n  border-top-left-radius: 0.3rem;\\n  border-bottom-left-radius: 0.3rem;\\n}\\n\\n.pagination-lg .page-item:last-child .page-link {\\n  border-top-right-radius: 0.3rem;\\n  border-bottom-right-radius: 0.3rem;\\n}\\n\\n.pagination-sm .page-link {\\n  padding: 0.25rem 0.5rem;\\n  font-size: 0.875rem;\\n  line-height: 1.5;\\n}\\n\\n.pagination-sm .page-item:first-child .page-link {\\n  border-top-left-radius: 0.2rem;\\n  border-bottom-left-radius: 0.2rem;\\n}\\n\\n.pagination-sm .page-item:last-child .page-link {\\n  border-top-right-radius: 0.2rem;\\n  border-bottom-right-radius: 0.2rem;\\n}\\n\\n.badge {\\n  display: inline-block;\\n  padding: 0.25em 0.4em;\\n  font-size: 75%;\\n  font-weight: 700;\\n  line-height: 1;\\n  text-align: center;\\n  white-space: nowrap;\\n  vertical-align: baseline;\\n  border-radius: 0.25rem;\\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .badge {\\n    transition: none;\\n  }\\n}\\n\\na.badge:hover, a.badge:focus {\\n  text-decoration: none;\\n}\\n\\n.badge:empty {\\n  display: none;\\n}\\n\\n.btn .badge {\\n  position: relative;\\n  top: -1px;\\n}\\n\\n.badge-pill {\\n  padding-right: 0.6em;\\n  padding-left: 0.6em;\\n  border-radius: 10rem;\\n}\\n\\n.badge-primary {\\n  color: #fff;\\n  background-color: #007bff;\\n}\\n\\na.badge-primary:hover, a.badge-primary:focus {\\n  color: #fff;\\n  background-color: #0062cc;\\n}\\n\\na.badge-primary:focus, a.badge-primary.focus {\\n  outline: 0;\\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\\n}\\n\\n.badge-secondary {\\n  color: #fff;\\n  background-color: #6c757d;\\n}\\n\\na.badge-secondary:hover, a.badge-secondary:focus {\\n  color: #fff;\\n  background-color: #545b62;\\n}\\n\\na.badge-secondary:focus, a.badge-secondary.focus {\\n  outline: 0;\\n  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\\n}\\n\\n.badge-success {\\n  color: #fff;\\n  background-color: #28a745;\\n}\\n\\na.badge-success:hover, a.badge-success:focus {\\n  color: #fff;\\n  background-color: #1e7e34;\\n}\\n\\na.badge-success:focus, a.badge-success.focus {\\n  outline: 0;\\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\\n}\\n\\n.badge-info {\\n  color: #fff;\\n  background-color: #17a2b8;\\n}\\n\\na.badge-info:hover, a.badge-info:focus {\\n  color: #fff;\\n  background-color: #117a8b;\\n}\\n\\na.badge-info:focus, a.badge-info.focus {\\n  outline: 0;\\n  box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\\n}\\n\\n.badge-warning {\\n  color: #212529;\\n  background-color: #ffc107;\\n}\\n\\na.badge-warning:hover, a.badge-warning:focus {\\n  color: #212529;\\n  background-color: #d39e00;\\n}\\n\\na.badge-warning:focus, a.badge-warning.focus {\\n  outline: 0;\\n  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\\n}\\n\\n.badge-danger {\\n  color: #fff;\\n  background-color: #dc3545;\\n}\\n\\na.badge-danger:hover, a.badge-danger:focus {\\n  color: #fff;\\n  background-color: #bd2130;\\n}\\n\\na.badge-danger:focus, a.badge-danger.focus {\\n  outline: 0;\\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\\n}\\n\\n.badge-light {\\n  color: #212529;\\n  background-color: #f8f9fa;\\n}\\n\\na.badge-light:hover, a.badge-light:focus {\\n  color: #212529;\\n  background-color: #dae0e5;\\n}\\n\\na.badge-light:focus, a.badge-light.focus {\\n  outline: 0;\\n  box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\\n}\\n\\n.badge-dark {\\n  color: #fff;\\n  background-color: #343a40;\\n}\\n\\na.badge-dark:hover, a.badge-dark:focus {\\n  color: #fff;\\n  background-color: #1d2124;\\n}\\n\\na.badge-dark:focus, a.badge-dark.focus {\\n  outline: 0;\\n  box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\\n}\\n\\n.jumbotron {\\n  padding: 2rem 1rem;\\n  margin-bottom: 2rem;\\n  background-color: #e9ecef;\\n  border-radius: 0.3rem;\\n}\\n\\n@media (min-width: 576px) {\\n  .jumbotron {\\n    padding: 4rem 2rem;\\n  }\\n}\\n\\n.jumbotron-fluid {\\n  padding-right: 0;\\n  padding-left: 0;\\n  border-radius: 0;\\n}\\n\\n.alert {\\n  position: relative;\\n  padding: 0.75rem 1.25rem;\\n  margin-bottom: 1rem;\\n  border: 1px solid transparent;\\n  border-radius: 0.25rem;\\n}\\n\\n.alert-heading {\\n  color: inherit;\\n}\\n\\n.alert-link {\\n  font-weight: 700;\\n}\\n\\n.alert-dismissible {\\n  padding-right: 4rem;\\n}\\n\\n.alert-dismissible .close {\\n  position: absolute;\\n  top: 0;\\n  right: 0;\\n  padding: 0.75rem 1.25rem;\\n  color: inherit;\\n}\\n\\n.alert-primary {\\n  color: #004085;\\n  background-color: #cce5ff;\\n  border-color: #b8daff;\\n}\\n\\n.alert-primary hr {\\n  border-top-color: #9fcdff;\\n}\\n\\n.alert-primary .alert-link {\\n  color: #002752;\\n}\\n\\n.alert-secondary {\\n  color: #383d41;\\n  background-color: #e2e3e5;\\n  border-color: #d6d8db;\\n}\\n\\n.alert-secondary hr {\\n  border-top-color: #c8cbcf;\\n}\\n\\n.alert-secondary .alert-link {\\n  color: #202326;\\n}\\n\\n.alert-success {\\n  color: #155724;\\n  background-color: #d4edda;\\n  border-color: #c3e6cb;\\n}\\n\\n.alert-success hr {\\n  border-top-color: #b1dfbb;\\n}\\n\\n.alert-success .alert-link {\\n  color: #0b2e13;\\n}\\n\\n.alert-info {\\n  color: #0c5460;\\n  background-color: #d1ecf1;\\n  border-color: #bee5eb;\\n}\\n\\n.alert-info hr {\\n  border-top-color: #abdde5;\\n}\\n\\n.alert-info .alert-link {\\n  color: #062c33;\\n}\\n\\n.alert-warning {\\n  color: #856404;\\n  background-color: #fff3cd;\\n  border-color: #ffeeba;\\n}\\n\\n.alert-warning hr {\\n  border-top-color: #ffe8a1;\\n}\\n\\n.alert-warning .alert-link {\\n  color: #533f03;\\n}\\n\\n.alert-danger {\\n  color: #721c24;\\n  background-color: #f8d7da;\\n  border-color: #f5c6cb;\\n}\\n\\n.alert-danger hr {\\n  border-top-color: #f1b0b7;\\n}\\n\\n.alert-danger .alert-link {\\n  color: #491217;\\n}\\n\\n.alert-light {\\n  color: #818182;\\n  background-color: #fefefe;\\n  border-color: #fdfdfe;\\n}\\n\\n.alert-light hr {\\n  border-top-color: #ececf6;\\n}\\n\\n.alert-light .alert-link {\\n  color: #686868;\\n}\\n\\n.alert-dark {\\n  color: #1b1e21;\\n  background-color: #d6d8d9;\\n  border-color: #c6c8ca;\\n}\\n\\n.alert-dark hr {\\n  border-top-color: #b9bbbe;\\n}\\n\\n.alert-dark .alert-link {\\n  color: #040505;\\n}\\n\\n@keyframes progress-bar-stripes {\\n  from {\\n    background-position: 1rem 0;\\n  }\\n  to {\\n    background-position: 0 0;\\n  }\\n}\\n\\n.progress {\\n  display: flex;\\n  height: 1rem;\\n  overflow: hidden;\\n  font-size: 0.75rem;\\n  background-color: #e9ecef;\\n  border-radius: 0.25rem;\\n}\\n\\n.progress-bar {\\n  display: flex;\\n  flex-direction: column;\\n  justify-content: center;\\n  color: #fff;\\n  text-align: center;\\n  white-space: nowrap;\\n  background-color: #007bff;\\n  transition: width 0.6s ease;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .progress-bar {\\n    transition: none;\\n  }\\n}\\n\\n.progress-bar-striped {\\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\\n  background-size: 1rem 1rem;\\n}\\n\\n.progress-bar-animated {\\n  animation: progress-bar-stripes 1s linear infinite;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .progress-bar-animated {\\n    animation: none;\\n  }\\n}\\n\\n.media {\\n  display: flex;\\n  align-items: flex-start;\\n}\\n\\n.media-body {\\n  flex: 1;\\n}\\n\\n.list-group {\\n  display: flex;\\n  flex-direction: column;\\n  padding-left: 0;\\n  margin-bottom: 0;\\n}\\n\\n.list-group-item-action {\\n  width: 100%;\\n  color: #495057;\\n  text-align: inherit;\\n}\\n\\n.list-group-item-action:hover, .list-group-item-action:focus {\\n  z-index: 1;\\n  color: #495057;\\n  text-decoration: none;\\n  background-color: #f8f9fa;\\n}\\n\\n.list-group-item-action:active {\\n  color: #212529;\\n  background-color: #e9ecef;\\n}\\n\\n.list-group-item {\\n  position: relative;\\n  display: block;\\n  padding: 0.75rem 1.25rem;\\n  margin-bottom: -1px;\\n  background-color: #fff;\\n  border: 1px solid rgba(0, 0, 0, 0.125);\\n}\\n\\n.list-group-item:first-child {\\n  border-top-left-radius: 0.25rem;\\n  border-top-right-radius: 0.25rem;\\n}\\n\\n.list-group-item:last-child {\\n  margin-bottom: 0;\\n  border-bottom-right-radius: 0.25rem;\\n  border-bottom-left-radius: 0.25rem;\\n}\\n\\n.list-group-item.disabled, .list-group-item:disabled {\\n  color: #6c757d;\\n  pointer-events: none;\\n  background-color: #fff;\\n}\\n\\n.list-group-item.active {\\n  z-index: 2;\\n  color: #fff;\\n  background-color: #007bff;\\n  border-color: #007bff;\\n}\\n\\n.list-group-horizontal {\\n  flex-direction: row;\\n}\\n\\n.list-group-horizontal .list-group-item {\\n  margin-right: -1px;\\n  margin-bottom: 0;\\n}\\n\\n.list-group-horizontal .list-group-item:first-child {\\n  border-top-left-radius: 0.25rem;\\n  border-bottom-left-radius: 0.25rem;\\n  border-top-right-radius: 0;\\n}\\n\\n.list-group-horizontal .list-group-item:last-child {\\n  margin-right: 0;\\n  border-top-right-radius: 0.25rem;\\n  border-bottom-right-radius: 0.25rem;\\n  border-bottom-left-radius: 0;\\n}\\n\\n@media (min-width: 576px) {\\n  .list-group-horizontal-sm {\\n    flex-direction: row;\\n  }\\n  .list-group-horizontal-sm .list-group-item {\\n    margin-right: -1px;\\n    margin-bottom: 0;\\n  }\\n  .list-group-horizontal-sm .list-group-item:first-child {\\n    border-top-left-radius: 0.25rem;\\n    border-bottom-left-radius: 0.25rem;\\n    border-top-right-radius: 0;\\n  }\\n  .list-group-horizontal-sm .list-group-item:last-child {\\n    margin-right: 0;\\n    border-top-right-radius: 0.25rem;\\n    border-bottom-right-radius: 0.25rem;\\n    border-bottom-left-radius: 0;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .list-group-horizontal-md {\\n    flex-direction: row;\\n  }\\n  .list-group-horizontal-md .list-group-item {\\n    margin-right: -1px;\\n    margin-bottom: 0;\\n  }\\n  .list-group-horizontal-md .list-group-item:first-child {\\n    border-top-left-radius: 0.25rem;\\n    border-bottom-left-radius: 0.25rem;\\n    border-top-right-radius: 0;\\n  }\\n  .list-group-horizontal-md .list-group-item:last-child {\\n    margin-right: 0;\\n    border-top-right-radius: 0.25rem;\\n    border-bottom-right-radius: 0.25rem;\\n    border-bottom-left-radius: 0;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .list-group-horizontal-lg {\\n    flex-direction: row;\\n  }\\n  .list-group-horizontal-lg .list-group-item {\\n    margin-right: -1px;\\n    margin-bottom: 0;\\n  }\\n  .list-group-horizontal-lg .list-group-item:first-child {\\n    border-top-left-radius: 0.25rem;\\n    border-bottom-left-radius: 0.25rem;\\n    border-top-right-radius: 0;\\n  }\\n  .list-group-horizontal-lg .list-group-item:last-child {\\n    margin-right: 0;\\n    border-top-right-radius: 0.25rem;\\n    border-bottom-right-radius: 0.25rem;\\n    border-bottom-left-radius: 0;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .list-group-horizontal-xl {\\n    flex-direction: row;\\n  }\\n  .list-group-horizontal-xl .list-group-item {\\n    margin-right: -1px;\\n    margin-bottom: 0;\\n  }\\n  .list-group-horizontal-xl .list-group-item:first-child {\\n    border-top-left-radius: 0.25rem;\\n    border-bottom-left-radius: 0.25rem;\\n    border-top-right-radius: 0;\\n  }\\n  .list-group-horizontal-xl .list-group-item:last-child {\\n    margin-right: 0;\\n    border-top-right-radius: 0.25rem;\\n    border-bottom-right-radius: 0.25rem;\\n    border-bottom-left-radius: 0;\\n  }\\n}\\n\\n.list-group-flush .list-group-item {\\n  border-right: 0;\\n  border-left: 0;\\n  border-radius: 0;\\n}\\n\\n.list-group-flush .list-group-item:last-child {\\n  margin-bottom: -1px;\\n}\\n\\n.list-group-flush:first-child .list-group-item:first-child {\\n  border-top: 0;\\n}\\n\\n.list-group-flush:last-child .list-group-item:last-child {\\n  margin-bottom: 0;\\n  border-bottom: 0;\\n}\\n\\n.list-group-item-primary {\\n  color: #004085;\\n  background-color: #b8daff;\\n}\\n\\n.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {\\n  color: #004085;\\n  background-color: #9fcdff;\\n}\\n\\n.list-group-item-primary.list-group-item-action.active {\\n  color: #fff;\\n  background-color: #004085;\\n  border-color: #004085;\\n}\\n\\n.list-group-item-secondary {\\n  color: #383d41;\\n  background-color: #d6d8db;\\n}\\n\\n.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {\\n  color: #383d41;\\n  background-color: #c8cbcf;\\n}\\n\\n.list-group-item-secondary.list-group-item-action.active {\\n  color: #fff;\\n  background-color: #383d41;\\n  border-color: #383d41;\\n}\\n\\n.list-group-item-success {\\n  color: #155724;\\n  background-color: #c3e6cb;\\n}\\n\\n.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {\\n  color: #155724;\\n  background-color: #b1dfbb;\\n}\\n\\n.list-group-item-success.list-group-item-action.active {\\n  color: #fff;\\n  background-color: #155724;\\n  border-color: #155724;\\n}\\n\\n.list-group-item-info {\\n  color: #0c5460;\\n  background-color: #bee5eb;\\n}\\n\\n.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {\\n  color: #0c5460;\\n  background-color: #abdde5;\\n}\\n\\n.list-group-item-info.list-group-item-action.active {\\n  color: #fff;\\n  background-color: #0c5460;\\n  border-color: #0c5460;\\n}\\n\\n.list-group-item-warning {\\n  color: #856404;\\n  background-color: #ffeeba;\\n}\\n\\n.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {\\n  color: #856404;\\n  background-color: #ffe8a1;\\n}\\n\\n.list-group-item-warning.list-group-item-action.active {\\n  color: #fff;\\n  background-color: #856404;\\n  border-color: #856404;\\n}\\n\\n.list-group-item-danger {\\n  color: #721c24;\\n  background-color: #f5c6cb;\\n}\\n\\n.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {\\n  color: #721c24;\\n  background-color: #f1b0b7;\\n}\\n\\n.list-group-item-danger.list-group-item-action.active {\\n  color: #fff;\\n  background-color: #721c24;\\n  border-color: #721c24;\\n}\\n\\n.list-group-item-light {\\n  color: #818182;\\n  background-color: #fdfdfe;\\n}\\n\\n.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {\\n  color: #818182;\\n  background-color: #ececf6;\\n}\\n\\n.list-group-item-light.list-group-item-action.active {\\n  color: #fff;\\n  background-color: #818182;\\n  border-color: #818182;\\n}\\n\\n.list-group-item-dark {\\n  color: #1b1e21;\\n  background-color: #c6c8ca;\\n}\\n\\n.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {\\n  color: #1b1e21;\\n  background-color: #b9bbbe;\\n}\\n\\n.list-group-item-dark.list-group-item-action.active {\\n  color: #fff;\\n  background-color: #1b1e21;\\n  border-color: #1b1e21;\\n}\\n\\n.close {\\n  float: right;\\n  font-size: 1.5rem;\\n  font-weight: 700;\\n  line-height: 1;\\n  color: #000;\\n  text-shadow: 0 1px 0 #fff;\\n  opacity: .5;\\n}\\n\\n.close:hover {\\n  color: #000;\\n  text-decoration: none;\\n}\\n\\n.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus {\\n  opacity: .75;\\n}\\n\\nbutton.close {\\n  padding: 0;\\n  background-color: transparent;\\n  border: 0;\\n  appearance: none;\\n}\\n\\na.close.disabled {\\n  pointer-events: none;\\n}\\n\\n.toast {\\n  max-width: 350px;\\n  overflow: hidden;\\n  font-size: 0.875rem;\\n  background-color: rgba(255, 255, 255, 0.85);\\n  background-clip: padding-box;\\n  border: 1px solid rgba(0, 0, 0, 0.1);\\n  box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1);\\n  backdrop-filter: blur(10px);\\n  opacity: 0;\\n  border-radius: 0.25rem;\\n}\\n\\n.toast:not(:last-child) {\\n  margin-bottom: 0.75rem;\\n}\\n\\n.toast.showing {\\n  opacity: 1;\\n}\\n\\n.toast.show {\\n  display: block;\\n  opacity: 1;\\n}\\n\\n.toast.hide {\\n  display: none;\\n}\\n\\n.toast-header {\\n  display: flex;\\n  align-items: center;\\n  padding: 0.25rem 0.75rem;\\n  color: #6c757d;\\n  background-color: rgba(255, 255, 255, 0.85);\\n  background-clip: padding-box;\\n  border-bottom: 1px solid rgba(0, 0, 0, 0.05);\\n}\\n\\n.toast-body {\\n  padding: 0.75rem;\\n}\\n\\n.modal-open {\\n  overflow: hidden;\\n}\\n\\n.modal-open .modal {\\n  overflow-x: hidden;\\n  overflow-y: auto;\\n}\\n\\n.modal {\\n  position: fixed;\\n  top: 0;\\n  left: 0;\\n  z-index: 1050;\\n  display: none;\\n  width: 100%;\\n  height: 100%;\\n  overflow: hidden;\\n  outline: 0;\\n}\\n\\n.modal-dialog {\\n  position: relative;\\n  width: auto;\\n  margin: 0.5rem;\\n  pointer-events: none;\\n}\\n\\n.modal.fade .modal-dialog {\\n  transition: transform 0.3s ease-out;\\n  transform: translate(0, -50px);\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .modal.fade .modal-dialog {\\n    transition: none;\\n  }\\n}\\n\\n.modal.show .modal-dialog {\\n  transform: none;\\n}\\n\\n.modal-dialog-scrollable {\\n  display: flex;\\n  max-height: calc(100% - 1rem);\\n}\\n\\n.modal-dialog-scrollable .modal-content {\\n  max-height: calc(100vh - 1rem);\\n  overflow: hidden;\\n}\\n\\n.modal-dialog-scrollable .modal-header,\\n.modal-dialog-scrollable .modal-footer {\\n  flex-shrink: 0;\\n}\\n\\n.modal-dialog-scrollable .modal-body {\\n  overflow-y: auto;\\n}\\n\\n.modal-dialog-centered {\\n  display: flex;\\n  align-items: center;\\n  min-height: calc(100% - 1rem);\\n}\\n\\n.modal-dialog-centered::before {\\n  display: block;\\n  height: calc(100vh - 1rem);\\n  content: \\\"\\\";\\n}\\n\\n.modal-dialog-centered.modal-dialog-scrollable {\\n  flex-direction: column;\\n  justify-content: center;\\n  height: 100%;\\n}\\n\\n.modal-dialog-centered.modal-dialog-scrollable .modal-content {\\n  max-height: none;\\n}\\n\\n.modal-dialog-centered.modal-dialog-scrollable::before {\\n  content: none;\\n}\\n\\n.modal-content {\\n  position: relative;\\n  display: flex;\\n  flex-direction: column;\\n  width: 100%;\\n  pointer-events: auto;\\n  background-color: #fff;\\n  background-clip: padding-box;\\n  border: 1px solid rgba(0, 0, 0, 0.2);\\n  border-radius: 0.3rem;\\n  outline: 0;\\n}\\n\\n.modal-backdrop {\\n  position: fixed;\\n  top: 0;\\n  left: 0;\\n  z-index: 1040;\\n  width: 100vw;\\n  height: 100vh;\\n  background-color: #000;\\n}\\n\\n.modal-backdrop.fade {\\n  opacity: 0;\\n}\\n\\n.modal-backdrop.show {\\n  opacity: 0.5;\\n}\\n\\n.modal-header {\\n  display: flex;\\n  align-items: flex-start;\\n  justify-content: space-between;\\n  padding: 1rem 1rem;\\n  border-bottom: 1px solid #dee2e6;\\n  border-top-left-radius: 0.3rem;\\n  border-top-right-radius: 0.3rem;\\n}\\n\\n.modal-header .close {\\n  padding: 1rem 1rem;\\n  margin: -1rem -1rem -1rem auto;\\n}\\n\\n.modal-title {\\n  margin-bottom: 0;\\n  line-height: 1.5;\\n}\\n\\n.modal-body {\\n  position: relative;\\n  flex: 1 1 auto;\\n  padding: 1rem;\\n}\\n\\n.modal-footer {\\n  display: flex;\\n  align-items: center;\\n  justify-content: flex-end;\\n  padding: 1rem;\\n  border-top: 1px solid #dee2e6;\\n  border-bottom-right-radius: 0.3rem;\\n  border-bottom-left-radius: 0.3rem;\\n}\\n\\n.modal-footer > :not(:first-child) {\\n  margin-left: .25rem;\\n}\\n\\n.modal-footer > :not(:last-child) {\\n  margin-right: .25rem;\\n}\\n\\n.modal-scrollbar-measure {\\n  position: absolute;\\n  top: -9999px;\\n  width: 50px;\\n  height: 50px;\\n  overflow: scroll;\\n}\\n\\n@media (min-width: 576px) {\\n  .modal-dialog {\\n    max-width: 500px;\\n    margin: 1.75rem auto;\\n  }\\n  .modal-dialog-scrollable {\\n    max-height: calc(100% - 3.5rem);\\n  }\\n  .modal-dialog-scrollable .modal-content {\\n    max-height: calc(100vh - 3.5rem);\\n  }\\n  .modal-dialog-centered {\\n    min-height: calc(100% - 3.5rem);\\n  }\\n  .modal-dialog-centered::before {\\n    height: calc(100vh - 3.5rem);\\n  }\\n  .modal-sm {\\n    max-width: 300px;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .modal-lg,\\n  .modal-xl {\\n    max-width: 800px;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .modal-xl {\\n    max-width: 1140px;\\n  }\\n}\\n\\n.tooltip {\\n  position: absolute;\\n  z-index: 1070;\\n  display: block;\\n  margin: 0;\\n  font-family: -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, \\\"Helvetica Neue\\\", Arial, \\\"Noto Sans\\\", sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\";\\n  font-style: normal;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  text-align: left;\\n  text-align: start;\\n  text-decoration: none;\\n  text-shadow: none;\\n  text-transform: none;\\n  letter-spacing: normal;\\n  word-break: normal;\\n  word-spacing: normal;\\n  white-space: normal;\\n  line-break: auto;\\n  font-size: 0.875rem;\\n  word-wrap: break-word;\\n  opacity: 0;\\n}\\n\\n.tooltip.show {\\n  opacity: 0.9;\\n}\\n\\n.tooltip .arrow {\\n  position: absolute;\\n  display: block;\\n  width: 0.8rem;\\n  height: 0.4rem;\\n}\\n\\n.tooltip .arrow::before {\\n  position: absolute;\\n  content: \\\"\\\";\\n  border-color: transparent;\\n  border-style: solid;\\n}\\n\\n.bs-tooltip-top, .bs-tooltip-auto[x-placement^=\\\"top\\\"] {\\n  padding: 0.4rem 0;\\n}\\n\\n.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=\\\"top\\\"] .arrow {\\n  bottom: 0;\\n}\\n\\n.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=\\\"top\\\"] .arrow::before {\\n  top: 0;\\n  border-width: 0.4rem 0.4rem 0;\\n  border-top-color: #000;\\n}\\n\\n.bs-tooltip-right, .bs-tooltip-auto[x-placement^=\\\"right\\\"] {\\n  padding: 0 0.4rem;\\n}\\n\\n.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=\\\"right\\\"] .arrow {\\n  left: 0;\\n  width: 0.4rem;\\n  height: 0.8rem;\\n}\\n\\n.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=\\\"right\\\"] .arrow::before {\\n  right: 0;\\n  border-width: 0.4rem 0.4rem 0.4rem 0;\\n  border-right-color: #000;\\n}\\n\\n.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=\\\"bottom\\\"] {\\n  padding: 0.4rem 0;\\n}\\n\\n.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=\\\"bottom\\\"] .arrow {\\n  top: 0;\\n}\\n\\n.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=\\\"bottom\\\"] .arrow::before {\\n  bottom: 0;\\n  border-width: 0 0.4rem 0.4rem;\\n  border-bottom-color: #000;\\n}\\n\\n.bs-tooltip-left, .bs-tooltip-auto[x-placement^=\\\"left\\\"] {\\n  padding: 0 0.4rem;\\n}\\n\\n.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=\\\"left\\\"] .arrow {\\n  right: 0;\\n  width: 0.4rem;\\n  height: 0.8rem;\\n}\\n\\n.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=\\\"left\\\"] .arrow::before {\\n  left: 0;\\n  border-width: 0.4rem 0 0.4rem 0.4rem;\\n  border-left-color: #000;\\n}\\n\\n.tooltip-inner {\\n  max-width: 200px;\\n  padding: 0.25rem 0.5rem;\\n  color: #fff;\\n  text-align: center;\\n  background-color: #000;\\n  border-radius: 0.25rem;\\n}\\n\\n.popover {\\n  position: absolute;\\n  top: 0;\\n  left: 0;\\n  z-index: 1060;\\n  display: block;\\n  max-width: 276px;\\n  font-family: -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, \\\"Helvetica Neue\\\", Arial, \\\"Noto Sans\\\", sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\";\\n  font-style: normal;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  text-align: left;\\n  text-align: start;\\n  text-decoration: none;\\n  text-shadow: none;\\n  text-transform: none;\\n  letter-spacing: normal;\\n  word-break: normal;\\n  word-spacing: normal;\\n  white-space: normal;\\n  line-break: auto;\\n  font-size: 0.875rem;\\n  word-wrap: break-word;\\n  background-color: #fff;\\n  background-clip: padding-box;\\n  border: 1px solid rgba(0, 0, 0, 0.2);\\n  border-radius: 0.3rem;\\n}\\n\\n.popover .arrow {\\n  position: absolute;\\n  display: block;\\n  width: 1rem;\\n  height: 0.5rem;\\n  margin: 0 0.3rem;\\n}\\n\\n.popover .arrow::before, .popover .arrow::after {\\n  position: absolute;\\n  display: block;\\n  content: \\\"\\\";\\n  border-color: transparent;\\n  border-style: solid;\\n}\\n\\n.bs-popover-top, .bs-popover-auto[x-placement^=\\\"top\\\"] {\\n  margin-bottom: 0.5rem;\\n}\\n\\n.bs-popover-top > .arrow, .bs-popover-auto[x-placement^=\\\"top\\\"] > .arrow {\\n  bottom: calc((0.5rem + 1px) * -1);\\n}\\n\\n.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^=\\\"top\\\"] > .arrow::before {\\n  bottom: 0;\\n  border-width: 0.5rem 0.5rem 0;\\n  border-top-color: rgba(0, 0, 0, 0.25);\\n}\\n\\n.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^=\\\"top\\\"] > .arrow::after {\\n  bottom: 1px;\\n  border-width: 0.5rem 0.5rem 0;\\n  border-top-color: #fff;\\n}\\n\\n.bs-popover-right, .bs-popover-auto[x-placement^=\\\"right\\\"] {\\n  margin-left: 0.5rem;\\n}\\n\\n.bs-popover-right > .arrow, .bs-popover-auto[x-placement^=\\\"right\\\"] > .arrow {\\n  left: calc((0.5rem + 1px) * -1);\\n  width: 0.5rem;\\n  height: 1rem;\\n  margin: 0.3rem 0;\\n}\\n\\n.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^=\\\"right\\\"] > .arrow::before {\\n  left: 0;\\n  border-width: 0.5rem 0.5rem 0.5rem 0;\\n  border-right-color: rgba(0, 0, 0, 0.25);\\n}\\n\\n.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^=\\\"right\\\"] > .arrow::after {\\n  left: 1px;\\n  border-width: 0.5rem 0.5rem 0.5rem 0;\\n  border-right-color: #fff;\\n}\\n\\n.bs-popover-bottom, .bs-popover-auto[x-placement^=\\\"bottom\\\"] {\\n  margin-top: 0.5rem;\\n}\\n\\n.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^=\\\"bottom\\\"] > .arrow {\\n  top: calc((0.5rem + 1px) * -1);\\n}\\n\\n.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^=\\\"bottom\\\"] > .arrow::before {\\n  top: 0;\\n  border-width: 0 0.5rem 0.5rem 0.5rem;\\n  border-bottom-color: rgba(0, 0, 0, 0.25);\\n}\\n\\n.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^=\\\"bottom\\\"] > .arrow::after {\\n  top: 1px;\\n  border-width: 0 0.5rem 0.5rem 0.5rem;\\n  border-bottom-color: #fff;\\n}\\n\\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=\\\"bottom\\\"] .popover-header::before {\\n  position: absolute;\\n  top: 0;\\n  left: 50%;\\n  display: block;\\n  width: 1rem;\\n  margin-left: -0.5rem;\\n  content: \\\"\\\";\\n  border-bottom: 1px solid #f7f7f7;\\n}\\n\\n.bs-popover-left, .bs-popover-auto[x-placement^=\\\"left\\\"] {\\n  margin-right: 0.5rem;\\n}\\n\\n.bs-popover-left > .arrow, .bs-popover-auto[x-placement^=\\\"left\\\"] > .arrow {\\n  right: calc((0.5rem + 1px) * -1);\\n  width: 0.5rem;\\n  height: 1rem;\\n  margin: 0.3rem 0;\\n}\\n\\n.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^=\\\"left\\\"] > .arrow::before {\\n  right: 0;\\n  border-width: 0.5rem 0 0.5rem 0.5rem;\\n  border-left-color: rgba(0, 0, 0, 0.25);\\n}\\n\\n.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^=\\\"left\\\"] > .arrow::after {\\n  right: 1px;\\n  border-width: 0.5rem 0 0.5rem 0.5rem;\\n  border-left-color: #fff;\\n}\\n\\n.popover-header {\\n  padding: 0.5rem 0.75rem;\\n  margin-bottom: 0;\\n  font-size: 1rem;\\n  background-color: #f7f7f7;\\n  border-bottom: 1px solid #ebebeb;\\n  border-top-left-radius: calc(0.3rem - 1px);\\n  border-top-right-radius: calc(0.3rem - 1px);\\n}\\n\\n.popover-header:empty {\\n  display: none;\\n}\\n\\n.popover-body {\\n  padding: 0.5rem 0.75rem;\\n  color: #212529;\\n}\\n\\n.carousel {\\n  position: relative;\\n}\\n\\n.carousel.pointer-event {\\n  touch-action: pan-y;\\n}\\n\\n.carousel-inner {\\n  position: relative;\\n  width: 100%;\\n  overflow: hidden;\\n}\\n\\n.carousel-inner::after {\\n  display: block;\\n  clear: both;\\n  content: \\\"\\\";\\n}\\n\\n.carousel-item {\\n  position: relative;\\n  display: none;\\n  float: left;\\n  width: 100%;\\n  margin-right: -100%;\\n  backface-visibility: hidden;\\n  transition: transform 0.6s ease-in-out;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .carousel-item {\\n    transition: none;\\n  }\\n}\\n\\n.carousel-item.active,\\n.carousel-item-next,\\n.carousel-item-prev {\\n  display: block;\\n}\\n\\n.carousel-item-next:not(.carousel-item-left),\\n.active.carousel-item-right {\\n  transform: translateX(100%);\\n}\\n\\n.carousel-item-prev:not(.carousel-item-right),\\n.active.carousel-item-left {\\n  transform: translateX(-100%);\\n}\\n\\n.carousel-fade .carousel-item {\\n  opacity: 0;\\n  transition-property: opacity;\\n  transform: none;\\n}\\n\\n.carousel-fade .carousel-item.active,\\n.carousel-fade .carousel-item-next.carousel-item-left,\\n.carousel-fade .carousel-item-prev.carousel-item-right {\\n  z-index: 1;\\n  opacity: 1;\\n}\\n\\n.carousel-fade .active.carousel-item-left,\\n.carousel-fade .active.carousel-item-right {\\n  z-index: 0;\\n  opacity: 0;\\n  transition: 0s 0.6s opacity;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .carousel-fade .active.carousel-item-left,\\n  .carousel-fade .active.carousel-item-right {\\n    transition: none;\\n  }\\n}\\n\\n.carousel-control-prev,\\n.carousel-control-next {\\n  position: absolute;\\n  top: 0;\\n  bottom: 0;\\n  z-index: 1;\\n  display: flex;\\n  align-items: center;\\n  justify-content: center;\\n  width: 15%;\\n  color: #fff;\\n  text-align: center;\\n  opacity: 0.5;\\n  transition: opacity 0.15s ease;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .carousel-control-prev,\\n  .carousel-control-next {\\n    transition: none;\\n  }\\n}\\n\\n.carousel-control-prev:hover, .carousel-control-prev:focus,\\n.carousel-control-next:hover,\\n.carousel-control-next:focus {\\n  color: #fff;\\n  text-decoration: none;\\n  outline: 0;\\n  opacity: 0.9;\\n}\\n\\n.carousel-control-prev {\\n  left: 0;\\n}\\n\\n.carousel-control-next {\\n  right: 0;\\n}\\n\\n.carousel-control-prev-icon,\\n.carousel-control-next-icon {\\n  display: inline-block;\\n  width: 20px;\\n  height: 20px;\\n  background: no-repeat 50% / 100% 100%;\\n}\\n\\n.carousel-control-prev-icon {\\n  background-image: url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\\\");\\n}\\n\\n.carousel-control-next-icon {\\n  background-image: url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\\\");\\n}\\n\\n.carousel-indicators {\\n  position: absolute;\\n  right: 0;\\n  bottom: 0;\\n  left: 0;\\n  z-index: 15;\\n  display: flex;\\n  justify-content: center;\\n  padding-left: 0;\\n  margin-right: 15%;\\n  margin-left: 15%;\\n  list-style: none;\\n}\\n\\n.carousel-indicators li {\\n  box-sizing: content-box;\\n  flex: 0 1 auto;\\n  width: 30px;\\n  height: 3px;\\n  margin-right: 3px;\\n  margin-left: 3px;\\n  text-indent: -999px;\\n  cursor: pointer;\\n  background-color: #fff;\\n  background-clip: padding-box;\\n  border-top: 10px solid transparent;\\n  border-bottom: 10px solid transparent;\\n  opacity: .5;\\n  transition: opacity 0.6s ease;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .carousel-indicators li {\\n    transition: none;\\n  }\\n}\\n\\n.carousel-indicators .active {\\n  opacity: 1;\\n}\\n\\n.carousel-caption {\\n  position: absolute;\\n  right: 15%;\\n  bottom: 20px;\\n  left: 15%;\\n  z-index: 10;\\n  padding-top: 20px;\\n  padding-bottom: 20px;\\n  color: #fff;\\n  text-align: center;\\n}\\n\\n@keyframes spinner-border {\\n  to {\\n    transform: rotate(360deg);\\n  }\\n}\\n\\n.spinner-border {\\n  display: inline-block;\\n  width: 2rem;\\n  height: 2rem;\\n  vertical-align: text-bottom;\\n  border: 0.25em solid currentColor;\\n  border-right-color: transparent;\\n  border-radius: 50%;\\n  animation: spinner-border .75s linear infinite;\\n}\\n\\n.spinner-border-sm {\\n  width: 1rem;\\n  height: 1rem;\\n  border-width: 0.2em;\\n}\\n\\n@keyframes spinner-grow {\\n  0% {\\n    transform: scale(0);\\n  }\\n  50% {\\n    opacity: 1;\\n  }\\n}\\n\\n.spinner-grow {\\n  display: inline-block;\\n  width: 2rem;\\n  height: 2rem;\\n  vertical-align: text-bottom;\\n  background-color: currentColor;\\n  border-radius: 50%;\\n  opacity: 0;\\n  animation: spinner-grow .75s linear infinite;\\n}\\n\\n.spinner-grow-sm {\\n  width: 1rem;\\n  height: 1rem;\\n}\\n\\n.align-baseline {\\n  vertical-align: baseline !important;\\n}\\n\\n.align-top {\\n  vertical-align: top !important;\\n}\\n\\n.align-middle {\\n  vertical-align: middle !important;\\n}\\n\\n.align-bottom {\\n  vertical-align: bottom !important;\\n}\\n\\n.align-text-bottom {\\n  vertical-align: text-bottom !important;\\n}\\n\\n.align-text-top {\\n  vertical-align: text-top !important;\\n}\\n\\n.bg-primary {\\n  background-color: #007bff !important;\\n}\\n\\na.bg-primary:hover, a.bg-primary:focus,\\nbutton.bg-primary:hover,\\nbutton.bg-primary:focus {\\n  background-color: #0062cc !important;\\n}\\n\\n.bg-secondary {\\n  background-color: #6c757d !important;\\n}\\n\\na.bg-secondary:hover, a.bg-secondary:focus,\\nbutton.bg-secondary:hover,\\nbutton.bg-secondary:focus {\\n  background-color: #545b62 !important;\\n}\\n\\n.bg-success {\\n  background-color: #28a745 !important;\\n}\\n\\na.bg-success:hover, a.bg-success:focus,\\nbutton.bg-success:hover,\\nbutton.bg-success:focus {\\n  background-color: #1e7e34 !important;\\n}\\n\\n.bg-info {\\n  background-color: #17a2b8 !important;\\n}\\n\\na.bg-info:hover, a.bg-info:focus,\\nbutton.bg-info:hover,\\nbutton.bg-info:focus {\\n  background-color: #117a8b !important;\\n}\\n\\n.bg-warning {\\n  background-color: #ffc107 !important;\\n}\\n\\na.bg-warning:hover, a.bg-warning:focus,\\nbutton.bg-warning:hover,\\nbutton.bg-warning:focus {\\n  background-color: #d39e00 !important;\\n}\\n\\n.bg-danger {\\n  background-color: #dc3545 !important;\\n}\\n\\na.bg-danger:hover, a.bg-danger:focus,\\nbutton.bg-danger:hover,\\nbutton.bg-danger:focus {\\n  background-color: #bd2130 !important;\\n}\\n\\n.bg-light {\\n  background-color: #f8f9fa !important;\\n}\\n\\na.bg-light:hover, a.bg-light:focus,\\nbutton.bg-light:hover,\\nbutton.bg-light:focus {\\n  background-color: #dae0e5 !important;\\n}\\n\\n.bg-dark {\\n  background-color: #343a40 !important;\\n}\\n\\na.bg-dark:hover, a.bg-dark:focus,\\nbutton.bg-dark:hover,\\nbutton.bg-dark:focus {\\n  background-color: #1d2124 !important;\\n}\\n\\n.bg-white {\\n  background-color: #fff !important;\\n}\\n\\n.bg-transparent {\\n  background-color: transparent !important;\\n}\\n\\n.border {\\n  border: 1px solid #dee2e6 !important;\\n}\\n\\n.border-top {\\n  border-top: 1px solid #dee2e6 !important;\\n}\\n\\n.border-right {\\n  border-right: 1px solid #dee2e6 !important;\\n}\\n\\n.border-bottom {\\n  border-bottom: 1px solid #dee2e6 !important;\\n}\\n\\n.border-left {\\n  border-left: 1px solid #dee2e6 !important;\\n}\\n\\n.border-0 {\\n  border: 0 !important;\\n}\\n\\n.border-top-0 {\\n  border-top: 0 !important;\\n}\\n\\n.border-right-0 {\\n  border-right: 0 !important;\\n}\\n\\n.border-bottom-0 {\\n  border-bottom: 0 !important;\\n}\\n\\n.border-left-0 {\\n  border-left: 0 !important;\\n}\\n\\n.border-primary {\\n  border-color: #007bff !important;\\n}\\n\\n.border-secondary {\\n  border-color: #6c757d !important;\\n}\\n\\n.border-success {\\n  border-color: #28a745 !important;\\n}\\n\\n.border-info {\\n  border-color: #17a2b8 !important;\\n}\\n\\n.border-warning {\\n  border-color: #ffc107 !important;\\n}\\n\\n.border-danger {\\n  border-color: #dc3545 !important;\\n}\\n\\n.border-light {\\n  border-color: #f8f9fa !important;\\n}\\n\\n.border-dark {\\n  border-color: #343a40 !important;\\n}\\n\\n.border-white {\\n  border-color: #fff !important;\\n}\\n\\n.rounded-sm {\\n  border-radius: 0.2rem !important;\\n}\\n\\n.rounded {\\n  border-radius: 0.25rem !important;\\n}\\n\\n.rounded-top {\\n  border-top-left-radius: 0.25rem !important;\\n  border-top-right-radius: 0.25rem !important;\\n}\\n\\n.rounded-right {\\n  border-top-right-radius: 0.25rem !important;\\n  border-bottom-right-radius: 0.25rem !important;\\n}\\n\\n.rounded-bottom {\\n  border-bottom-right-radius: 0.25rem !important;\\n  border-bottom-left-radius: 0.25rem !important;\\n}\\n\\n.rounded-left {\\n  border-top-left-radius: 0.25rem !important;\\n  border-bottom-left-radius: 0.25rem !important;\\n}\\n\\n.rounded-lg {\\n  border-radius: 0.3rem !important;\\n}\\n\\n.rounded-circle {\\n  border-radius: 50% !important;\\n}\\n\\n.rounded-pill {\\n  border-radius: 50rem !important;\\n}\\n\\n.rounded-0 {\\n  border-radius: 0 !important;\\n}\\n\\n.clearfix::after {\\n  display: block;\\n  clear: both;\\n  content: \\\"\\\";\\n}\\n\\n.d-none {\\n  display: none !important;\\n}\\n\\n.d-inline {\\n  display: inline !important;\\n}\\n\\n.d-inline-block {\\n  display: inline-block !important;\\n}\\n\\n.d-block {\\n  display: block !important;\\n}\\n\\n.d-table {\\n  display: table !important;\\n}\\n\\n.d-table-row {\\n  display: table-row !important;\\n}\\n\\n.d-table-cell {\\n  display: table-cell !important;\\n}\\n\\n.d-flex {\\n  display: flex !important;\\n}\\n\\n.d-inline-flex {\\n  display: inline-flex !important;\\n}\\n\\n@media (min-width: 576px) {\\n  .d-sm-none {\\n    display: none !important;\\n  }\\n  .d-sm-inline {\\n    display: inline !important;\\n  }\\n  .d-sm-inline-block {\\n    display: inline-block !important;\\n  }\\n  .d-sm-block {\\n    display: block !important;\\n  }\\n  .d-sm-table {\\n    display: table !important;\\n  }\\n  .d-sm-table-row {\\n    display: table-row !important;\\n  }\\n  .d-sm-table-cell {\\n    display: table-cell !important;\\n  }\\n  .d-sm-flex {\\n    display: flex !important;\\n  }\\n  .d-sm-inline-flex {\\n    display: inline-flex !important;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .d-md-none {\\n    display: none !important;\\n  }\\n  .d-md-inline {\\n    display: inline !important;\\n  }\\n  .d-md-inline-block {\\n    display: inline-block !important;\\n  }\\n  .d-md-block {\\n    display: block !important;\\n  }\\n  .d-md-table {\\n    display: table !important;\\n  }\\n  .d-md-table-row {\\n    display: table-row !important;\\n  }\\n  .d-md-table-cell {\\n    display: table-cell !important;\\n  }\\n  .d-md-flex {\\n    display: flex !important;\\n  }\\n  .d-md-inline-flex {\\n    display: inline-flex !important;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .d-lg-none {\\n    display: none !important;\\n  }\\n  .d-lg-inline {\\n    display: inline !important;\\n  }\\n  .d-lg-inline-block {\\n    display: inline-block !important;\\n  }\\n  .d-lg-block {\\n    display: block !important;\\n  }\\n  .d-lg-table {\\n    display: table !important;\\n  }\\n  .d-lg-table-row {\\n    display: table-row !important;\\n  }\\n  .d-lg-table-cell {\\n    display: table-cell !important;\\n  }\\n  .d-lg-flex {\\n    display: flex !important;\\n  }\\n  .d-lg-inline-flex {\\n    display: inline-flex !important;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .d-xl-none {\\n    display: none !important;\\n  }\\n  .d-xl-inline {\\n    display: inline !important;\\n  }\\n  .d-xl-inline-block {\\n    display: inline-block !important;\\n  }\\n  .d-xl-block {\\n    display: block !important;\\n  }\\n  .d-xl-table {\\n    display: table !important;\\n  }\\n  .d-xl-table-row {\\n    display: table-row !important;\\n  }\\n  .d-xl-table-cell {\\n    display: table-cell !important;\\n  }\\n  .d-xl-flex {\\n    display: flex !important;\\n  }\\n  .d-xl-inline-flex {\\n    display: inline-flex !important;\\n  }\\n}\\n\\n@media print {\\n  .d-print-none {\\n    display: none !important;\\n  }\\n  .d-print-inline {\\n    display: inline !important;\\n  }\\n  .d-print-inline-block {\\n    display: inline-block !important;\\n  }\\n  .d-print-block {\\n    display: block !important;\\n  }\\n  .d-print-table {\\n    display: table !important;\\n  }\\n  .d-print-table-row {\\n    display: table-row !important;\\n  }\\n  .d-print-table-cell {\\n    display: table-cell !important;\\n  }\\n  .d-print-flex {\\n    display: flex !important;\\n  }\\n  .d-print-inline-flex {\\n    display: inline-flex !important;\\n  }\\n}\\n\\n.embed-responsive {\\n  position: relative;\\n  display: block;\\n  width: 100%;\\n  padding: 0;\\n  overflow: hidden;\\n}\\n\\n.embed-responsive::before {\\n  display: block;\\n  content: \\\"\\\";\\n}\\n\\n.embed-responsive .embed-responsive-item,\\n.embed-responsive iframe,\\n.embed-responsive embed,\\n.embed-responsive object,\\n.embed-responsive video {\\n  position: absolute;\\n  top: 0;\\n  bottom: 0;\\n  left: 0;\\n  width: 100%;\\n  height: 100%;\\n  border: 0;\\n}\\n\\n.embed-responsive-21by9::before {\\n  padding-top: 42.857143%;\\n}\\n\\n.embed-responsive-16by9::before {\\n  padding-top: 56.25%;\\n}\\n\\n.embed-responsive-4by3::before {\\n  padding-top: 75%;\\n}\\n\\n.embed-responsive-1by1::before {\\n  padding-top: 100%;\\n}\\n\\n.flex-row {\\n  flex-direction: row !important;\\n}\\n\\n.flex-column {\\n  flex-direction: column !important;\\n}\\n\\n.flex-row-reverse {\\n  flex-direction: row-reverse !important;\\n}\\n\\n.flex-column-reverse {\\n  flex-direction: column-reverse !important;\\n}\\n\\n.flex-wrap {\\n  flex-wrap: wrap !important;\\n}\\n\\n.flex-nowrap {\\n  flex-wrap: nowrap !important;\\n}\\n\\n.flex-wrap-reverse {\\n  flex-wrap: wrap-reverse !important;\\n}\\n\\n.flex-fill {\\n  flex: 1 1 auto !important;\\n}\\n\\n.flex-grow-0 {\\n  flex-grow: 0 !important;\\n}\\n\\n.flex-grow-1 {\\n  flex-grow: 1 !important;\\n}\\n\\n.flex-shrink-0 {\\n  flex-shrink: 0 !important;\\n}\\n\\n.flex-shrink-1 {\\n  flex-shrink: 1 !important;\\n}\\n\\n.justify-content-start {\\n  justify-content: flex-start !important;\\n}\\n\\n.justify-content-end {\\n  justify-content: flex-end !important;\\n}\\n\\n.justify-content-center {\\n  justify-content: center !important;\\n}\\n\\n.justify-content-between {\\n  justify-content: space-between !important;\\n}\\n\\n.justify-content-around {\\n  justify-content: space-around !important;\\n}\\n\\n.align-items-start {\\n  align-items: flex-start !important;\\n}\\n\\n.align-items-end {\\n  align-items: flex-end !important;\\n}\\n\\n.align-items-center {\\n  align-items: center !important;\\n}\\n\\n.align-items-baseline {\\n  align-items: baseline !important;\\n}\\n\\n.align-items-stretch {\\n  align-items: stretch !important;\\n}\\n\\n.align-content-start {\\n  align-content: flex-start !important;\\n}\\n\\n.align-content-end {\\n  align-content: flex-end !important;\\n}\\n\\n.align-content-center {\\n  align-content: center !important;\\n}\\n\\n.align-content-between {\\n  align-content: space-between !important;\\n}\\n\\n.align-content-around {\\n  align-content: space-around !important;\\n}\\n\\n.align-content-stretch {\\n  align-content: stretch !important;\\n}\\n\\n.align-self-auto {\\n  align-self: auto !important;\\n}\\n\\n.align-self-start {\\n  align-self: flex-start !important;\\n}\\n\\n.align-self-end {\\n  align-self: flex-end !important;\\n}\\n\\n.align-self-center {\\n  align-self: center !important;\\n}\\n\\n.align-self-baseline {\\n  align-self: baseline !important;\\n}\\n\\n.align-self-stretch {\\n  align-self: stretch !important;\\n}\\n\\n@media (min-width: 576px) {\\n  .flex-sm-row {\\n    flex-direction: row !important;\\n  }\\n  .flex-sm-column {\\n    flex-direction: column !important;\\n  }\\n  .flex-sm-row-reverse {\\n    flex-direction: row-reverse !important;\\n  }\\n  .flex-sm-column-reverse {\\n    flex-direction: column-reverse !important;\\n  }\\n  .flex-sm-wrap {\\n    flex-wrap: wrap !important;\\n  }\\n  .flex-sm-nowrap {\\n    flex-wrap: nowrap !important;\\n  }\\n  .flex-sm-wrap-reverse {\\n    flex-wrap: wrap-reverse !important;\\n  }\\n  .flex-sm-fill {\\n    flex: 1 1 auto !important;\\n  }\\n  .flex-sm-grow-0 {\\n    flex-grow: 0 !important;\\n  }\\n  .flex-sm-grow-1 {\\n    flex-grow: 1 !important;\\n  }\\n  .flex-sm-shrink-0 {\\n    flex-shrink: 0 !important;\\n  }\\n  .flex-sm-shrink-1 {\\n    flex-shrink: 1 !important;\\n  }\\n  .justify-content-sm-start {\\n    justify-content: flex-start !important;\\n  }\\n  .justify-content-sm-end {\\n    justify-content: flex-end !important;\\n  }\\n  .justify-content-sm-center {\\n    justify-content: center !important;\\n  }\\n  .justify-content-sm-between {\\n    justify-content: space-between !important;\\n  }\\n  .justify-content-sm-around {\\n    justify-content: space-around !important;\\n  }\\n  .align-items-sm-start {\\n    align-items: flex-start !important;\\n  }\\n  .align-items-sm-end {\\n    align-items: flex-end !important;\\n  }\\n  .align-items-sm-center {\\n    align-items: center !important;\\n  }\\n  .align-items-sm-baseline {\\n    align-items: baseline !important;\\n  }\\n  .align-items-sm-stretch {\\n    align-items: stretch !important;\\n  }\\n  .align-content-sm-start {\\n    align-content: flex-start !important;\\n  }\\n  .align-content-sm-end {\\n    align-content: flex-end !important;\\n  }\\n  .align-content-sm-center {\\n    align-content: center !important;\\n  }\\n  .align-content-sm-between {\\n    align-content: space-between !important;\\n  }\\n  .align-content-sm-around {\\n    align-content: space-around !important;\\n  }\\n  .align-content-sm-stretch {\\n    align-content: stretch !important;\\n  }\\n  .align-self-sm-auto {\\n    align-self: auto !important;\\n  }\\n  .align-self-sm-start {\\n    align-self: flex-start !important;\\n  }\\n  .align-self-sm-end {\\n    align-self: flex-end !important;\\n  }\\n  .align-self-sm-center {\\n    align-self: center !important;\\n  }\\n  .align-self-sm-baseline {\\n    align-self: baseline !important;\\n  }\\n  .align-self-sm-stretch {\\n    align-self: stretch !important;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .flex-md-row {\\n    flex-direction: row !important;\\n  }\\n  .flex-md-column {\\n    flex-direction: column !important;\\n  }\\n  .flex-md-row-reverse {\\n    flex-direction: row-reverse !important;\\n  }\\n  .flex-md-column-reverse {\\n    flex-direction: column-reverse !important;\\n  }\\n  .flex-md-wrap {\\n    flex-wrap: wrap !important;\\n  }\\n  .flex-md-nowrap {\\n    flex-wrap: nowrap !important;\\n  }\\n  .flex-md-wrap-reverse {\\n    flex-wrap: wrap-reverse !important;\\n  }\\n  .flex-md-fill {\\n    flex: 1 1 auto !important;\\n  }\\n  .flex-md-grow-0 {\\n    flex-grow: 0 !important;\\n  }\\n  .flex-md-grow-1 {\\n    flex-grow: 1 !important;\\n  }\\n  .flex-md-shrink-0 {\\n    flex-shrink: 0 !important;\\n  }\\n  .flex-md-shrink-1 {\\n    flex-shrink: 1 !important;\\n  }\\n  .justify-content-md-start {\\n    justify-content: flex-start !important;\\n  }\\n  .justify-content-md-end {\\n    justify-content: flex-end !important;\\n  }\\n  .justify-content-md-center {\\n    justify-content: center !important;\\n  }\\n  .justify-content-md-between {\\n    justify-content: space-between !important;\\n  }\\n  .justify-content-md-around {\\n    justify-content: space-around !important;\\n  }\\n  .align-items-md-start {\\n    align-items: flex-start !important;\\n  }\\n  .align-items-md-end {\\n    align-items: flex-end !important;\\n  }\\n  .align-items-md-center {\\n    align-items: center !important;\\n  }\\n  .align-items-md-baseline {\\n    align-items: baseline !important;\\n  }\\n  .align-items-md-stretch {\\n    align-items: stretch !important;\\n  }\\n  .align-content-md-start {\\n    align-content: flex-start !important;\\n  }\\n  .align-content-md-end {\\n    align-content: flex-end !important;\\n  }\\n  .align-content-md-center {\\n    align-content: center !important;\\n  }\\n  .align-content-md-between {\\n    align-content: space-between !important;\\n  }\\n  .align-content-md-around {\\n    align-content: space-around !important;\\n  }\\n  .align-content-md-stretch {\\n    align-content: stretch !important;\\n  }\\n  .align-self-md-auto {\\n    align-self: auto !important;\\n  }\\n  .align-self-md-start {\\n    align-self: flex-start !important;\\n  }\\n  .align-self-md-end {\\n    align-self: flex-end !important;\\n  }\\n  .align-self-md-center {\\n    align-self: center !important;\\n  }\\n  .align-self-md-baseline {\\n    align-self: baseline !important;\\n  }\\n  .align-self-md-stretch {\\n    align-self: stretch !important;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .flex-lg-row {\\n    flex-direction: row !important;\\n  }\\n  .flex-lg-column {\\n    flex-direction: column !important;\\n  }\\n  .flex-lg-row-reverse {\\n    flex-direction: row-reverse !important;\\n  }\\n  .flex-lg-column-reverse {\\n    flex-direction: column-reverse !important;\\n  }\\n  .flex-lg-wrap {\\n    flex-wrap: wrap !important;\\n  }\\n  .flex-lg-nowrap {\\n    flex-wrap: nowrap !important;\\n  }\\n  .flex-lg-wrap-reverse {\\n    flex-wrap: wrap-reverse !important;\\n  }\\n  .flex-lg-fill {\\n    flex: 1 1 auto !important;\\n  }\\n  .flex-lg-grow-0 {\\n    flex-grow: 0 !important;\\n  }\\n  .flex-lg-grow-1 {\\n    flex-grow: 1 !important;\\n  }\\n  .flex-lg-shrink-0 {\\n    flex-shrink: 0 !important;\\n  }\\n  .flex-lg-shrink-1 {\\n    flex-shrink: 1 !important;\\n  }\\n  .justify-content-lg-start {\\n    justify-content: flex-start !important;\\n  }\\n  .justify-content-lg-end {\\n    justify-content: flex-end !important;\\n  }\\n  .justify-content-lg-center {\\n    justify-content: center !important;\\n  }\\n  .justify-content-lg-between {\\n    justify-content: space-between !important;\\n  }\\n  .justify-content-lg-around {\\n    justify-content: space-around !important;\\n  }\\n  .align-items-lg-start {\\n    align-items: flex-start !important;\\n  }\\n  .align-items-lg-end {\\n    align-items: flex-end !important;\\n  }\\n  .align-items-lg-center {\\n    align-items: center !important;\\n  }\\n  .align-items-lg-baseline {\\n    align-items: baseline !important;\\n  }\\n  .align-items-lg-stretch {\\n    align-items: stretch !important;\\n  }\\n  .align-content-lg-start {\\n    align-content: flex-start !important;\\n  }\\n  .align-content-lg-end {\\n    align-content: flex-end !important;\\n  }\\n  .align-content-lg-center {\\n    align-content: center !important;\\n  }\\n  .align-content-lg-between {\\n    align-content: space-between !important;\\n  }\\n  .align-content-lg-around {\\n    align-content: space-around !important;\\n  }\\n  .align-content-lg-stretch {\\n    align-content: stretch !important;\\n  }\\n  .align-self-lg-auto {\\n    align-self: auto !important;\\n  }\\n  .align-self-lg-start {\\n    align-self: flex-start !important;\\n  }\\n  .align-self-lg-end {\\n    align-self: flex-end !important;\\n  }\\n  .align-self-lg-center {\\n    align-self: center !important;\\n  }\\n  .align-self-lg-baseline {\\n    align-self: baseline !important;\\n  }\\n  .align-self-lg-stretch {\\n    align-self: stretch !important;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .flex-xl-row {\\n    flex-direction: row !important;\\n  }\\n  .flex-xl-column {\\n    flex-direction: column !important;\\n  }\\n  .flex-xl-row-reverse {\\n    flex-direction: row-reverse !important;\\n  }\\n  .flex-xl-column-reverse {\\n    flex-direction: column-reverse !important;\\n  }\\n  .flex-xl-wrap {\\n    flex-wrap: wrap !important;\\n  }\\n  .flex-xl-nowrap {\\n    flex-wrap: nowrap !important;\\n  }\\n  .flex-xl-wrap-reverse {\\n    flex-wrap: wrap-reverse !important;\\n  }\\n  .flex-xl-fill {\\n    flex: 1 1 auto !important;\\n  }\\n  .flex-xl-grow-0 {\\n    flex-grow: 0 !important;\\n  }\\n  .flex-xl-grow-1 {\\n    flex-grow: 1 !important;\\n  }\\n  .flex-xl-shrink-0 {\\n    flex-shrink: 0 !important;\\n  }\\n  .flex-xl-shrink-1 {\\n    flex-shrink: 1 !important;\\n  }\\n  .justify-content-xl-start {\\n    justify-content: flex-start !important;\\n  }\\n  .justify-content-xl-end {\\n    justify-content: flex-end !important;\\n  }\\n  .justify-content-xl-center {\\n    justify-content: center !important;\\n  }\\n  .justify-content-xl-between {\\n    justify-content: space-between !important;\\n  }\\n  .justify-content-xl-around {\\n    justify-content: space-around !important;\\n  }\\n  .align-items-xl-start {\\n    align-items: flex-start !important;\\n  }\\n  .align-items-xl-end {\\n    align-items: flex-end !important;\\n  }\\n  .align-items-xl-center {\\n    align-items: center !important;\\n  }\\n  .align-items-xl-baseline {\\n    align-items: baseline !important;\\n  }\\n  .align-items-xl-stretch {\\n    align-items: stretch !important;\\n  }\\n  .align-content-xl-start {\\n    align-content: flex-start !important;\\n  }\\n  .align-content-xl-end {\\n    align-content: flex-end !important;\\n  }\\n  .align-content-xl-center {\\n    align-content: center !important;\\n  }\\n  .align-content-xl-between {\\n    align-content: space-between !important;\\n  }\\n  .align-content-xl-around {\\n    align-content: space-around !important;\\n  }\\n  .align-content-xl-stretch {\\n    align-content: stretch !important;\\n  }\\n  .align-self-xl-auto {\\n    align-self: auto !important;\\n  }\\n  .align-self-xl-start {\\n    align-self: flex-start !important;\\n  }\\n  .align-self-xl-end {\\n    align-self: flex-end !important;\\n  }\\n  .align-self-xl-center {\\n    align-self: center !important;\\n  }\\n  .align-self-xl-baseline {\\n    align-self: baseline !important;\\n  }\\n  .align-self-xl-stretch {\\n    align-self: stretch !important;\\n  }\\n}\\n\\n.float-left {\\n  float: left !important;\\n}\\n\\n.float-right {\\n  float: right !important;\\n}\\n\\n.float-none {\\n  float: none !important;\\n}\\n\\n@media (min-width: 576px) {\\n  .float-sm-left {\\n    float: left !important;\\n  }\\n  .float-sm-right {\\n    float: right !important;\\n  }\\n  .float-sm-none {\\n    float: none !important;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .float-md-left {\\n    float: left !important;\\n  }\\n  .float-md-right {\\n    float: right !important;\\n  }\\n  .float-md-none {\\n    float: none !important;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .float-lg-left {\\n    float: left !important;\\n  }\\n  .float-lg-right {\\n    float: right !important;\\n  }\\n  .float-lg-none {\\n    float: none !important;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .float-xl-left {\\n    float: left !important;\\n  }\\n  .float-xl-right {\\n    float: right !important;\\n  }\\n  .float-xl-none {\\n    float: none !important;\\n  }\\n}\\n\\n.overflow-auto {\\n  overflow: auto !important;\\n}\\n\\n.overflow-hidden {\\n  overflow: hidden !important;\\n}\\n\\n.position-static {\\n  position: static !important;\\n}\\n\\n.position-relative {\\n  position: relative !important;\\n}\\n\\n.position-absolute {\\n  position: absolute !important;\\n}\\n\\n.position-fixed {\\n  position: fixed !important;\\n}\\n\\n.position-sticky {\\n  position: sticky !important;\\n}\\n\\n.fixed-top {\\n  position: fixed;\\n  top: 0;\\n  right: 0;\\n  left: 0;\\n  z-index: 1030;\\n}\\n\\n.fixed-bottom {\\n  position: fixed;\\n  right: 0;\\n  bottom: 0;\\n  left: 0;\\n  z-index: 1030;\\n}\\n\\n@supports (position: sticky) {\\n  .sticky-top {\\n    position: sticky;\\n    top: 0;\\n    z-index: 1020;\\n  }\\n}\\n\\n.sr-only {\\n  position: absolute;\\n  width: 1px;\\n  height: 1px;\\n  padding: 0;\\n  overflow: hidden;\\n  clip: rect(0, 0, 0, 0);\\n  white-space: nowrap;\\n  border: 0;\\n}\\n\\n.sr-only-focusable:active, .sr-only-focusable:focus {\\n  position: static;\\n  width: auto;\\n  height: auto;\\n  overflow: visible;\\n  clip: auto;\\n  white-space: normal;\\n}\\n\\n.shadow-sm {\\n  box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\\n}\\n\\n.shadow {\\n  box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\\n}\\n\\n.shadow-lg {\\n  box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\\n}\\n\\n.shadow-none {\\n  box-shadow: none !important;\\n}\\n\\n.w-25 {\\n  width: 25% !important;\\n}\\n\\n.w-50 {\\n  width: 50% !important;\\n}\\n\\n.w-75 {\\n  width: 75% !important;\\n}\\n\\n.w-100 {\\n  width: 100% !important;\\n}\\n\\n.w-auto {\\n  width: auto !important;\\n}\\n\\n.h-25 {\\n  height: 25% !important;\\n}\\n\\n.h-50 {\\n  height: 50% !important;\\n}\\n\\n.h-75 {\\n  height: 75% !important;\\n}\\n\\n.h-100 {\\n  height: 100% !important;\\n}\\n\\n.h-auto {\\n  height: auto !important;\\n}\\n\\n.mw-100 {\\n  max-width: 100% !important;\\n}\\n\\n.mh-100 {\\n  max-height: 100% !important;\\n}\\n\\n.min-vw-100 {\\n  min-width: 100vw !important;\\n}\\n\\n.min-vh-100 {\\n  min-height: 100vh !important;\\n}\\n\\n.vw-100 {\\n  width: 100vw !important;\\n}\\n\\n.vh-100 {\\n  height: 100vh !important;\\n}\\n\\n.stretched-link::after {\\n  position: absolute;\\n  top: 0;\\n  right: 0;\\n  bottom: 0;\\n  left: 0;\\n  z-index: 1;\\n  pointer-events: auto;\\n  content: \\\"\\\";\\n  background-color: rgba(0, 0, 0, 0);\\n}\\n\\n.m-0 {\\n  margin: 0 !important;\\n}\\n\\n.mt-0,\\n.my-0 {\\n  margin-top: 0 !important;\\n}\\n\\n.mr-0,\\n.mx-0 {\\n  margin-right: 0 !important;\\n}\\n\\n.mb-0,\\n.my-0 {\\n  margin-bottom: 0 !important;\\n}\\n\\n.ml-0,\\n.mx-0 {\\n  margin-left: 0 !important;\\n}\\n\\n.m-1 {\\n  margin: 0.25rem !important;\\n}\\n\\n.mt-1,\\n.my-1 {\\n  margin-top: 0.25rem !important;\\n}\\n\\n.mr-1,\\n.mx-1 {\\n  margin-right: 0.25rem !important;\\n}\\n\\n.mb-1,\\n.my-1 {\\n  margin-bottom: 0.25rem !important;\\n}\\n\\n.ml-1,\\n.mx-1 {\\n  margin-left: 0.25rem !important;\\n}\\n\\n.m-2 {\\n  margin: 0.5rem !important;\\n}\\n\\n.mt-2,\\n.my-2 {\\n  margin-top: 0.5rem !important;\\n}\\n\\n.mr-2,\\n.mx-2 {\\n  margin-right: 0.5rem !important;\\n}\\n\\n.mb-2,\\n.my-2 {\\n  margin-bottom: 0.5rem !important;\\n}\\n\\n.ml-2,\\n.mx-2 {\\n  margin-left: 0.5rem !important;\\n}\\n\\n.m-3 {\\n  margin: 1rem !important;\\n}\\n\\n.mt-3,\\n.my-3 {\\n  margin-top: 1rem !important;\\n}\\n\\n.mr-3,\\n.mx-3 {\\n  margin-right: 1rem !important;\\n}\\n\\n.mb-3,\\n.my-3 {\\n  margin-bottom: 1rem !important;\\n}\\n\\n.ml-3,\\n.mx-3 {\\n  margin-left: 1rem !important;\\n}\\n\\n.m-4 {\\n  margin: 1.5rem !important;\\n}\\n\\n.mt-4,\\n.my-4 {\\n  margin-top: 1.5rem !important;\\n}\\n\\n.mr-4,\\n.mx-4 {\\n  margin-right: 1.5rem !important;\\n}\\n\\n.mb-4,\\n.my-4 {\\n  margin-bottom: 1.5rem !important;\\n}\\n\\n.ml-4,\\n.mx-4 {\\n  margin-left: 1.5rem !important;\\n}\\n\\n.m-5 {\\n  margin: 3rem !important;\\n}\\n\\n.mt-5,\\n.my-5 {\\n  margin-top: 3rem !important;\\n}\\n\\n.mr-5,\\n.mx-5 {\\n  margin-right: 3rem !important;\\n}\\n\\n.mb-5,\\n.my-5 {\\n  margin-bottom: 3rem !important;\\n}\\n\\n.ml-5,\\n.mx-5 {\\n  margin-left: 3rem !important;\\n}\\n\\n.p-0 {\\n  padding: 0 !important;\\n}\\n\\n.pt-0,\\n.py-0 {\\n  padding-top: 0 !important;\\n}\\n\\n.pr-0,\\n.px-0 {\\n  padding-right: 0 !important;\\n}\\n\\n.pb-0,\\n.py-0 {\\n  padding-bottom: 0 !important;\\n}\\n\\n.pl-0,\\n.px-0 {\\n  padding-left: 0 !important;\\n}\\n\\n.p-1 {\\n  padding: 0.25rem !important;\\n}\\n\\n.pt-1,\\n.py-1 {\\n  padding-top: 0.25rem !important;\\n}\\n\\n.pr-1,\\n.px-1 {\\n  padding-right: 0.25rem !important;\\n}\\n\\n.pb-1,\\n.py-1 {\\n  padding-bottom: 0.25rem !important;\\n}\\n\\n.pl-1,\\n.px-1 {\\n  padding-left: 0.25rem !important;\\n}\\n\\n.p-2 {\\n  padding: 0.5rem !important;\\n}\\n\\n.pt-2,\\n.py-2 {\\n  padding-top: 0.5rem !important;\\n}\\n\\n.pr-2,\\n.px-2 {\\n  padding-right: 0.5rem !important;\\n}\\n\\n.pb-2,\\n.py-2 {\\n  padding-bottom: 0.5rem !important;\\n}\\n\\n.pl-2,\\n.px-2 {\\n  padding-left: 0.5rem !important;\\n}\\n\\n.p-3 {\\n  padding: 1rem !important;\\n}\\n\\n.pt-3,\\n.py-3 {\\n  padding-top: 1rem !important;\\n}\\n\\n.pr-3,\\n.px-3 {\\n  padding-right: 1rem !important;\\n}\\n\\n.pb-3,\\n.py-3 {\\n  padding-bottom: 1rem !important;\\n}\\n\\n.pl-3,\\n.px-3 {\\n  padding-left: 1rem !important;\\n}\\n\\n.p-4 {\\n  padding: 1.5rem !important;\\n}\\n\\n.pt-4,\\n.py-4 {\\n  padding-top: 1.5rem !important;\\n}\\n\\n.pr-4,\\n.px-4 {\\n  padding-right: 1.5rem !important;\\n}\\n\\n.pb-4,\\n.py-4 {\\n  padding-bottom: 1.5rem !important;\\n}\\n\\n.pl-4,\\n.px-4 {\\n  padding-left: 1.5rem !important;\\n}\\n\\n.p-5 {\\n  padding: 3rem !important;\\n}\\n\\n.pt-5,\\n.py-5 {\\n  padding-top: 3rem !important;\\n}\\n\\n.pr-5,\\n.px-5 {\\n  padding-right: 3rem !important;\\n}\\n\\n.pb-5,\\n.py-5 {\\n  padding-bottom: 3rem !important;\\n}\\n\\n.pl-5,\\n.px-5 {\\n  padding-left: 3rem !important;\\n}\\n\\n.m-n1 {\\n  margin: -0.25rem !important;\\n}\\n\\n.mt-n1,\\n.my-n1 {\\n  margin-top: -0.25rem !important;\\n}\\n\\n.mr-n1,\\n.mx-n1 {\\n  margin-right: -0.25rem !important;\\n}\\n\\n.mb-n1,\\n.my-n1 {\\n  margin-bottom: -0.25rem !important;\\n}\\n\\n.ml-n1,\\n.mx-n1 {\\n  margin-left: -0.25rem !important;\\n}\\n\\n.m-n2 {\\n  margin: -0.5rem !important;\\n}\\n\\n.mt-n2,\\n.my-n2 {\\n  margin-top: -0.5rem !important;\\n}\\n\\n.mr-n2,\\n.mx-n2 {\\n  margin-right: -0.5rem !important;\\n}\\n\\n.mb-n2,\\n.my-n2 {\\n  margin-bottom: -0.5rem !important;\\n}\\n\\n.ml-n2,\\n.mx-n2 {\\n  margin-left: -0.5rem !important;\\n}\\n\\n.m-n3 {\\n  margin: -1rem !important;\\n}\\n\\n.mt-n3,\\n.my-n3 {\\n  margin-top: -1rem !important;\\n}\\n\\n.mr-n3,\\n.mx-n3 {\\n  margin-right: -1rem !important;\\n}\\n\\n.mb-n3,\\n.my-n3 {\\n  margin-bottom: -1rem !important;\\n}\\n\\n.ml-n3,\\n.mx-n3 {\\n  margin-left: -1rem !important;\\n}\\n\\n.m-n4 {\\n  margin: -1.5rem !important;\\n}\\n\\n.mt-n4,\\n.my-n4 {\\n  margin-top: -1.5rem !important;\\n}\\n\\n.mr-n4,\\n.mx-n4 {\\n  margin-right: -1.5rem !important;\\n}\\n\\n.mb-n4,\\n.my-n4 {\\n  margin-bottom: -1.5rem !important;\\n}\\n\\n.ml-n4,\\n.mx-n4 {\\n  margin-left: -1.5rem !important;\\n}\\n\\n.m-n5 {\\n  margin: -3rem !important;\\n}\\n\\n.mt-n5,\\n.my-n5 {\\n  margin-top: -3rem !important;\\n}\\n\\n.mr-n5,\\n.mx-n5 {\\n  margin-right: -3rem !important;\\n}\\n\\n.mb-n5,\\n.my-n5 {\\n  margin-bottom: -3rem !important;\\n}\\n\\n.ml-n5,\\n.mx-n5 {\\n  margin-left: -3rem !important;\\n}\\n\\n.m-auto {\\n  margin: auto !important;\\n}\\n\\n.mt-auto,\\n.my-auto {\\n  margin-top: auto !important;\\n}\\n\\n.mr-auto,\\n.mx-auto {\\n  margin-right: auto !important;\\n}\\n\\n.mb-auto,\\n.my-auto {\\n  margin-bottom: auto !important;\\n}\\n\\n.ml-auto,\\n.mx-auto {\\n  margin-left: auto !important;\\n}\\n\\n@media (min-width: 576px) {\\n  .m-sm-0 {\\n    margin: 0 !important;\\n  }\\n  .mt-sm-0,\\n  .my-sm-0 {\\n    margin-top: 0 !important;\\n  }\\n  .mr-sm-0,\\n  .mx-sm-0 {\\n    margin-right: 0 !important;\\n  }\\n  .mb-sm-0,\\n  .my-sm-0 {\\n    margin-bottom: 0 !important;\\n  }\\n  .ml-sm-0,\\n  .mx-sm-0 {\\n    margin-left: 0 !important;\\n  }\\n  .m-sm-1 {\\n    margin: 0.25rem !important;\\n  }\\n  .mt-sm-1,\\n  .my-sm-1 {\\n    margin-top: 0.25rem !important;\\n  }\\n  .mr-sm-1,\\n  .mx-sm-1 {\\n    margin-right: 0.25rem !important;\\n  }\\n  .mb-sm-1,\\n  .my-sm-1 {\\n    margin-bottom: 0.25rem !important;\\n  }\\n  .ml-sm-1,\\n  .mx-sm-1 {\\n    margin-left: 0.25rem !important;\\n  }\\n  .m-sm-2 {\\n    margin: 0.5rem !important;\\n  }\\n  .mt-sm-2,\\n  .my-sm-2 {\\n    margin-top: 0.5rem !important;\\n  }\\n  .mr-sm-2,\\n  .mx-sm-2 {\\n    margin-right: 0.5rem !important;\\n  }\\n  .mb-sm-2,\\n  .my-sm-2 {\\n    margin-bottom: 0.5rem !important;\\n  }\\n  .ml-sm-2,\\n  .mx-sm-2 {\\n    margin-left: 0.5rem !important;\\n  }\\n  .m-sm-3 {\\n    margin: 1rem !important;\\n  }\\n  .mt-sm-3,\\n  .my-sm-3 {\\n    margin-top: 1rem !important;\\n  }\\n  .mr-sm-3,\\n  .mx-sm-3 {\\n    margin-right: 1rem !important;\\n  }\\n  .mb-sm-3,\\n  .my-sm-3 {\\n    margin-bottom: 1rem !important;\\n  }\\n  .ml-sm-3,\\n  .mx-sm-3 {\\n    margin-left: 1rem !important;\\n  }\\n  .m-sm-4 {\\n    margin: 1.5rem !important;\\n  }\\n  .mt-sm-4,\\n  .my-sm-4 {\\n    margin-top: 1.5rem !important;\\n  }\\n  .mr-sm-4,\\n  .mx-sm-4 {\\n    margin-right: 1.5rem !important;\\n  }\\n  .mb-sm-4,\\n  .my-sm-4 {\\n    margin-bottom: 1.5rem !important;\\n  }\\n  .ml-sm-4,\\n  .mx-sm-4 {\\n    margin-left: 1.5rem !important;\\n  }\\n  .m-sm-5 {\\n    margin: 3rem !important;\\n  }\\n  .mt-sm-5,\\n  .my-sm-5 {\\n    margin-top: 3rem !important;\\n  }\\n  .mr-sm-5,\\n  .mx-sm-5 {\\n    margin-right: 3rem !important;\\n  }\\n  .mb-sm-5,\\n  .my-sm-5 {\\n    margin-bottom: 3rem !important;\\n  }\\n  .ml-sm-5,\\n  .mx-sm-5 {\\n    margin-left: 3rem !important;\\n  }\\n  .p-sm-0 {\\n    padding: 0 !important;\\n  }\\n  .pt-sm-0,\\n  .py-sm-0 {\\n    padding-top: 0 !important;\\n  }\\n  .pr-sm-0,\\n  .px-sm-0 {\\n    padding-right: 0 !important;\\n  }\\n  .pb-sm-0,\\n  .py-sm-0 {\\n    padding-bottom: 0 !important;\\n  }\\n  .pl-sm-0,\\n  .px-sm-0 {\\n    padding-left: 0 !important;\\n  }\\n  .p-sm-1 {\\n    padding: 0.25rem !important;\\n  }\\n  .pt-sm-1,\\n  .py-sm-1 {\\n    padding-top: 0.25rem !important;\\n  }\\n  .pr-sm-1,\\n  .px-sm-1 {\\n    padding-right: 0.25rem !important;\\n  }\\n  .pb-sm-1,\\n  .py-sm-1 {\\n    padding-bottom: 0.25rem !important;\\n  }\\n  .pl-sm-1,\\n  .px-sm-1 {\\n    padding-left: 0.25rem !important;\\n  }\\n  .p-sm-2 {\\n    padding: 0.5rem !important;\\n  }\\n  .pt-sm-2,\\n  .py-sm-2 {\\n    padding-top: 0.5rem !important;\\n  }\\n  .pr-sm-2,\\n  .px-sm-2 {\\n    padding-right: 0.5rem !important;\\n  }\\n  .pb-sm-2,\\n  .py-sm-2 {\\n    padding-bottom: 0.5rem !important;\\n  }\\n  .pl-sm-2,\\n  .px-sm-2 {\\n    padding-left: 0.5rem !important;\\n  }\\n  .p-sm-3 {\\n    padding: 1rem !important;\\n  }\\n  .pt-sm-3,\\n  .py-sm-3 {\\n    padding-top: 1rem !important;\\n  }\\n  .pr-sm-3,\\n  .px-sm-3 {\\n    padding-right: 1rem !important;\\n  }\\n  .pb-sm-3,\\n  .py-sm-3 {\\n    padding-bottom: 1rem !important;\\n  }\\n  .pl-sm-3,\\n  .px-sm-3 {\\n    padding-left: 1rem !important;\\n  }\\n  .p-sm-4 {\\n    padding: 1.5rem !important;\\n  }\\n  .pt-sm-4,\\n  .py-sm-4 {\\n    padding-top: 1.5rem !important;\\n  }\\n  .pr-sm-4,\\n  .px-sm-4 {\\n    padding-right: 1.5rem !important;\\n  }\\n  .pb-sm-4,\\n  .py-sm-4 {\\n    padding-bottom: 1.5rem !important;\\n  }\\n  .pl-sm-4,\\n  .px-sm-4 {\\n    padding-left: 1.5rem !important;\\n  }\\n  .p-sm-5 {\\n    padding: 3rem !important;\\n  }\\n  .pt-sm-5,\\n  .py-sm-5 {\\n    padding-top: 3rem !important;\\n  }\\n  .pr-sm-5,\\n  .px-sm-5 {\\n    padding-right: 3rem !important;\\n  }\\n  .pb-sm-5,\\n  .py-sm-5 {\\n    padding-bottom: 3rem !important;\\n  }\\n  .pl-sm-5,\\n  .px-sm-5 {\\n    padding-left: 3rem !important;\\n  }\\n  .m-sm-n1 {\\n    margin: -0.25rem !important;\\n  }\\n  .mt-sm-n1,\\n  .my-sm-n1 {\\n    margin-top: -0.25rem !important;\\n  }\\n  .mr-sm-n1,\\n  .mx-sm-n1 {\\n    margin-right: -0.25rem !important;\\n  }\\n  .mb-sm-n1,\\n  .my-sm-n1 {\\n    margin-bottom: -0.25rem !important;\\n  }\\n  .ml-sm-n1,\\n  .mx-sm-n1 {\\n    margin-left: -0.25rem !important;\\n  }\\n  .m-sm-n2 {\\n    margin: -0.5rem !important;\\n  }\\n  .mt-sm-n2,\\n  .my-sm-n2 {\\n    margin-top: -0.5rem !important;\\n  }\\n  .mr-sm-n2,\\n  .mx-sm-n2 {\\n    margin-right: -0.5rem !important;\\n  }\\n  .mb-sm-n2,\\n  .my-sm-n2 {\\n    margin-bottom: -0.5rem !important;\\n  }\\n  .ml-sm-n2,\\n  .mx-sm-n2 {\\n    margin-left: -0.5rem !important;\\n  }\\n  .m-sm-n3 {\\n    margin: -1rem !important;\\n  }\\n  .mt-sm-n3,\\n  .my-sm-n3 {\\n    margin-top: -1rem !important;\\n  }\\n  .mr-sm-n3,\\n  .mx-sm-n3 {\\n    margin-right: -1rem !important;\\n  }\\n  .mb-sm-n3,\\n  .my-sm-n3 {\\n    margin-bottom: -1rem !important;\\n  }\\n  .ml-sm-n3,\\n  .mx-sm-n3 {\\n    margin-left: -1rem !important;\\n  }\\n  .m-sm-n4 {\\n    margin: -1.5rem !important;\\n  }\\n  .mt-sm-n4,\\n  .my-sm-n4 {\\n    margin-top: -1.5rem !important;\\n  }\\n  .mr-sm-n4,\\n  .mx-sm-n4 {\\n    margin-right: -1.5rem !important;\\n  }\\n  .mb-sm-n4,\\n  .my-sm-n4 {\\n    margin-bottom: -1.5rem !important;\\n  }\\n  .ml-sm-n4,\\n  .mx-sm-n4 {\\n    margin-left: -1.5rem !important;\\n  }\\n  .m-sm-n5 {\\n    margin: -3rem !important;\\n  }\\n  .mt-sm-n5,\\n  .my-sm-n5 {\\n    margin-top: -3rem !important;\\n  }\\n  .mr-sm-n5,\\n  .mx-sm-n5 {\\n    margin-right: -3rem !important;\\n  }\\n  .mb-sm-n5,\\n  .my-sm-n5 {\\n    margin-bottom: -3rem !important;\\n  }\\n  .ml-sm-n5,\\n  .mx-sm-n5 {\\n    margin-left: -3rem !important;\\n  }\\n  .m-sm-auto {\\n    margin: auto !important;\\n  }\\n  .mt-sm-auto,\\n  .my-sm-auto {\\n    margin-top: auto !important;\\n  }\\n  .mr-sm-auto,\\n  .mx-sm-auto {\\n    margin-right: auto !important;\\n  }\\n  .mb-sm-auto,\\n  .my-sm-auto {\\n    margin-bottom: auto !important;\\n  }\\n  .ml-sm-auto,\\n  .mx-sm-auto {\\n    margin-left: auto !important;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .m-md-0 {\\n    margin: 0 !important;\\n  }\\n  .mt-md-0,\\n  .my-md-0 {\\n    margin-top: 0 !important;\\n  }\\n  .mr-md-0,\\n  .mx-md-0 {\\n    margin-right: 0 !important;\\n  }\\n  .mb-md-0,\\n  .my-md-0 {\\n    margin-bottom: 0 !important;\\n  }\\n  .ml-md-0,\\n  .mx-md-0 {\\n    margin-left: 0 !important;\\n  }\\n  .m-md-1 {\\n    margin: 0.25rem !important;\\n  }\\n  .mt-md-1,\\n  .my-md-1 {\\n    margin-top: 0.25rem !important;\\n  }\\n  .mr-md-1,\\n  .mx-md-1 {\\n    margin-right: 0.25rem !important;\\n  }\\n  .mb-md-1,\\n  .my-md-1 {\\n    margin-bottom: 0.25rem !important;\\n  }\\n  .ml-md-1,\\n  .mx-md-1 {\\n    margin-left: 0.25rem !important;\\n  }\\n  .m-md-2 {\\n    margin: 0.5rem !important;\\n  }\\n  .mt-md-2,\\n  .my-md-2 {\\n    margin-top: 0.5rem !important;\\n  }\\n  .mr-md-2,\\n  .mx-md-2 {\\n    margin-right: 0.5rem !important;\\n  }\\n  .mb-md-2,\\n  .my-md-2 {\\n    margin-bottom: 0.5rem !important;\\n  }\\n  .ml-md-2,\\n  .mx-md-2 {\\n    margin-left: 0.5rem !important;\\n  }\\n  .m-md-3 {\\n    margin: 1rem !important;\\n  }\\n  .mt-md-3,\\n  .my-md-3 {\\n    margin-top: 1rem !important;\\n  }\\n  .mr-md-3,\\n  .mx-md-3 {\\n    margin-right: 1rem !important;\\n  }\\n  .mb-md-3,\\n  .my-md-3 {\\n    margin-bottom: 1rem !important;\\n  }\\n  .ml-md-3,\\n  .mx-md-3 {\\n    margin-left: 1rem !important;\\n  }\\n  .m-md-4 {\\n    margin: 1.5rem !important;\\n  }\\n  .mt-md-4,\\n  .my-md-4 {\\n    margin-top: 1.5rem !important;\\n  }\\n  .mr-md-4,\\n  .mx-md-4 {\\n    margin-right: 1.5rem !important;\\n  }\\n  .mb-md-4,\\n  .my-md-4 {\\n    margin-bottom: 1.5rem !important;\\n  }\\n  .ml-md-4,\\n  .mx-md-4 {\\n    margin-left: 1.5rem !important;\\n  }\\n  .m-md-5 {\\n    margin: 3rem !important;\\n  }\\n  .mt-md-5,\\n  .my-md-5 {\\n    margin-top: 3rem !important;\\n  }\\n  .mr-md-5,\\n  .mx-md-5 {\\n    margin-right: 3rem !important;\\n  }\\n  .mb-md-5,\\n  .my-md-5 {\\n    margin-bottom: 3rem !important;\\n  }\\n  .ml-md-5,\\n  .mx-md-5 {\\n    margin-left: 3rem !important;\\n  }\\n  .p-md-0 {\\n    padding: 0 !important;\\n  }\\n  .pt-md-0,\\n  .py-md-0 {\\n    padding-top: 0 !important;\\n  }\\n  .pr-md-0,\\n  .px-md-0 {\\n    padding-right: 0 !important;\\n  }\\n  .pb-md-0,\\n  .py-md-0 {\\n    padding-bottom: 0 !important;\\n  }\\n  .pl-md-0,\\n  .px-md-0 {\\n    padding-left: 0 !important;\\n  }\\n  .p-md-1 {\\n    padding: 0.25rem !important;\\n  }\\n  .pt-md-1,\\n  .py-md-1 {\\n    padding-top: 0.25rem !important;\\n  }\\n  .pr-md-1,\\n  .px-md-1 {\\n    padding-right: 0.25rem !important;\\n  }\\n  .pb-md-1,\\n  .py-md-1 {\\n    padding-bottom: 0.25rem !important;\\n  }\\n  .pl-md-1,\\n  .px-md-1 {\\n    padding-left: 0.25rem !important;\\n  }\\n  .p-md-2 {\\n    padding: 0.5rem !important;\\n  }\\n  .pt-md-2,\\n  .py-md-2 {\\n    padding-top: 0.5rem !important;\\n  }\\n  .pr-md-2,\\n  .px-md-2 {\\n    padding-right: 0.5rem !important;\\n  }\\n  .pb-md-2,\\n  .py-md-2 {\\n    padding-bottom: 0.5rem !important;\\n  }\\n  .pl-md-2,\\n  .px-md-2 {\\n    padding-left: 0.5rem !important;\\n  }\\n  .p-md-3 {\\n    padding: 1rem !important;\\n  }\\n  .pt-md-3,\\n  .py-md-3 {\\n    padding-top: 1rem !important;\\n  }\\n  .pr-md-3,\\n  .px-md-3 {\\n    padding-right: 1rem !important;\\n  }\\n  .pb-md-3,\\n  .py-md-3 {\\n    padding-bottom: 1rem !important;\\n  }\\n  .pl-md-3,\\n  .px-md-3 {\\n    padding-left: 1rem !important;\\n  }\\n  .p-md-4 {\\n    padding: 1.5rem !important;\\n  }\\n  .pt-md-4,\\n  .py-md-4 {\\n    padding-top: 1.5rem !important;\\n  }\\n  .pr-md-4,\\n  .px-md-4 {\\n    padding-right: 1.5rem !important;\\n  }\\n  .pb-md-4,\\n  .py-md-4 {\\n    padding-bottom: 1.5rem !important;\\n  }\\n  .pl-md-4,\\n  .px-md-4 {\\n    padding-left: 1.5rem !important;\\n  }\\n  .p-md-5 {\\n    padding: 3rem !important;\\n  }\\n  .pt-md-5,\\n  .py-md-5 {\\n    padding-top: 3rem !important;\\n  }\\n  .pr-md-5,\\n  .px-md-5 {\\n    padding-right: 3rem !important;\\n  }\\n  .pb-md-5,\\n  .py-md-5 {\\n    padding-bottom: 3rem !important;\\n  }\\n  .pl-md-5,\\n  .px-md-5 {\\n    padding-left: 3rem !important;\\n  }\\n  .m-md-n1 {\\n    margin: -0.25rem !important;\\n  }\\n  .mt-md-n1,\\n  .my-md-n1 {\\n    margin-top: -0.25rem !important;\\n  }\\n  .mr-md-n1,\\n  .mx-md-n1 {\\n    margin-right: -0.25rem !important;\\n  }\\n  .mb-md-n1,\\n  .my-md-n1 {\\n    margin-bottom: -0.25rem !important;\\n  }\\n  .ml-md-n1,\\n  .mx-md-n1 {\\n    margin-left: -0.25rem !important;\\n  }\\n  .m-md-n2 {\\n    margin: -0.5rem !important;\\n  }\\n  .mt-md-n2,\\n  .my-md-n2 {\\n    margin-top: -0.5rem !important;\\n  }\\n  .mr-md-n2,\\n  .mx-md-n2 {\\n    margin-right: -0.5rem !important;\\n  }\\n  .mb-md-n2,\\n  .my-md-n2 {\\n    margin-bottom: -0.5rem !important;\\n  }\\n  .ml-md-n2,\\n  .mx-md-n2 {\\n    margin-left: -0.5rem !important;\\n  }\\n  .m-md-n3 {\\n    margin: -1rem !important;\\n  }\\n  .mt-md-n3,\\n  .my-md-n3 {\\n    margin-top: -1rem !important;\\n  }\\n  .mr-md-n3,\\n  .mx-md-n3 {\\n    margin-right: -1rem !important;\\n  }\\n  .mb-md-n3,\\n  .my-md-n3 {\\n    margin-bottom: -1rem !important;\\n  }\\n  .ml-md-n3,\\n  .mx-md-n3 {\\n    margin-left: -1rem !important;\\n  }\\n  .m-md-n4 {\\n    margin: -1.5rem !important;\\n  }\\n  .mt-md-n4,\\n  .my-md-n4 {\\n    margin-top: -1.5rem !important;\\n  }\\n  .mr-md-n4,\\n  .mx-md-n4 {\\n    margin-right: -1.5rem !important;\\n  }\\n  .mb-md-n4,\\n  .my-md-n4 {\\n    margin-bottom: -1.5rem !important;\\n  }\\n  .ml-md-n4,\\n  .mx-md-n4 {\\n    margin-left: -1.5rem !important;\\n  }\\n  .m-md-n5 {\\n    margin: -3rem !important;\\n  }\\n  .mt-md-n5,\\n  .my-md-n5 {\\n    margin-top: -3rem !important;\\n  }\\n  .mr-md-n5,\\n  .mx-md-n5 {\\n    margin-right: -3rem !important;\\n  }\\n  .mb-md-n5,\\n  .my-md-n5 {\\n    margin-bottom: -3rem !important;\\n  }\\n  .ml-md-n5,\\n  .mx-md-n5 {\\n    margin-left: -3rem !important;\\n  }\\n  .m-md-auto {\\n    margin: auto !important;\\n  }\\n  .mt-md-auto,\\n  .my-md-auto {\\n    margin-top: auto !important;\\n  }\\n  .mr-md-auto,\\n  .mx-md-auto {\\n    margin-right: auto !important;\\n  }\\n  .mb-md-auto,\\n  .my-md-auto {\\n    margin-bottom: auto !important;\\n  }\\n  .ml-md-auto,\\n  .mx-md-auto {\\n    margin-left: auto !important;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .m-lg-0 {\\n    margin: 0 !important;\\n  }\\n  .mt-lg-0,\\n  .my-lg-0 {\\n    margin-top: 0 !important;\\n  }\\n  .mr-lg-0,\\n  .mx-lg-0 {\\n    margin-right: 0 !important;\\n  }\\n  .mb-lg-0,\\n  .my-lg-0 {\\n    margin-bottom: 0 !important;\\n  }\\n  .ml-lg-0,\\n  .mx-lg-0 {\\n    margin-left: 0 !important;\\n  }\\n  .m-lg-1 {\\n    margin: 0.25rem !important;\\n  }\\n  .mt-lg-1,\\n  .my-lg-1 {\\n    margin-top: 0.25rem !important;\\n  }\\n  .mr-lg-1,\\n  .mx-lg-1 {\\n    margin-right: 0.25rem !important;\\n  }\\n  .mb-lg-1,\\n  .my-lg-1 {\\n    margin-bottom: 0.25rem !important;\\n  }\\n  .ml-lg-1,\\n  .mx-lg-1 {\\n    margin-left: 0.25rem !important;\\n  }\\n  .m-lg-2 {\\n    margin: 0.5rem !important;\\n  }\\n  .mt-lg-2,\\n  .my-lg-2 {\\n    margin-top: 0.5rem !important;\\n  }\\n  .mr-lg-2,\\n  .mx-lg-2 {\\n    margin-right: 0.5rem !important;\\n  }\\n  .mb-lg-2,\\n  .my-lg-2 {\\n    margin-bottom: 0.5rem !important;\\n  }\\n  .ml-lg-2,\\n  .mx-lg-2 {\\n    margin-left: 0.5rem !important;\\n  }\\n  .m-lg-3 {\\n    margin: 1rem !important;\\n  }\\n  .mt-lg-3,\\n  .my-lg-3 {\\n    margin-top: 1rem !important;\\n  }\\n  .mr-lg-3,\\n  .mx-lg-3 {\\n    margin-right: 1rem !important;\\n  }\\n  .mb-lg-3,\\n  .my-lg-3 {\\n    margin-bottom: 1rem !important;\\n  }\\n  .ml-lg-3,\\n  .mx-lg-3 {\\n    margin-left: 1rem !important;\\n  }\\n  .m-lg-4 {\\n    margin: 1.5rem !important;\\n  }\\n  .mt-lg-4,\\n  .my-lg-4 {\\n    margin-top: 1.5rem !important;\\n  }\\n  .mr-lg-4,\\n  .mx-lg-4 {\\n    margin-right: 1.5rem !important;\\n  }\\n  .mb-lg-4,\\n  .my-lg-4 {\\n    margin-bottom: 1.5rem !important;\\n  }\\n  .ml-lg-4,\\n  .mx-lg-4 {\\n    margin-left: 1.5rem !important;\\n  }\\n  .m-lg-5 {\\n    margin: 3rem !important;\\n  }\\n  .mt-lg-5,\\n  .my-lg-5 {\\n    margin-top: 3rem !important;\\n  }\\n  .mr-lg-5,\\n  .mx-lg-5 {\\n    margin-right: 3rem !important;\\n  }\\n  .mb-lg-5,\\n  .my-lg-5 {\\n    margin-bottom: 3rem !important;\\n  }\\n  .ml-lg-5,\\n  .mx-lg-5 {\\n    margin-left: 3rem !important;\\n  }\\n  .p-lg-0 {\\n    padding: 0 !important;\\n  }\\n  .pt-lg-0,\\n  .py-lg-0 {\\n    padding-top: 0 !important;\\n  }\\n  .pr-lg-0,\\n  .px-lg-0 {\\n    padding-right: 0 !important;\\n  }\\n  .pb-lg-0,\\n  .py-lg-0 {\\n    padding-bottom: 0 !important;\\n  }\\n  .pl-lg-0,\\n  .px-lg-0 {\\n    padding-left: 0 !important;\\n  }\\n  .p-lg-1 {\\n    padding: 0.25rem !important;\\n  }\\n  .pt-lg-1,\\n  .py-lg-1 {\\n    padding-top: 0.25rem !important;\\n  }\\n  .pr-lg-1,\\n  .px-lg-1 {\\n    padding-right: 0.25rem !important;\\n  }\\n  .pb-lg-1,\\n  .py-lg-1 {\\n    padding-bottom: 0.25rem !important;\\n  }\\n  .pl-lg-1,\\n  .px-lg-1 {\\n    padding-left: 0.25rem !important;\\n  }\\n  .p-lg-2 {\\n    padding: 0.5rem !important;\\n  }\\n  .pt-lg-2,\\n  .py-lg-2 {\\n    padding-top: 0.5rem !important;\\n  }\\n  .pr-lg-2,\\n  .px-lg-2 {\\n    padding-right: 0.5rem !important;\\n  }\\n  .pb-lg-2,\\n  .py-lg-2 {\\n    padding-bottom: 0.5rem !important;\\n  }\\n  .pl-lg-2,\\n  .px-lg-2 {\\n    padding-left: 0.5rem !important;\\n  }\\n  .p-lg-3 {\\n    padding: 1rem !important;\\n  }\\n  .pt-lg-3,\\n  .py-lg-3 {\\n    padding-top: 1rem !important;\\n  }\\n  .pr-lg-3,\\n  .px-lg-3 {\\n    padding-right: 1rem !important;\\n  }\\n  .pb-lg-3,\\n  .py-lg-3 {\\n    padding-bottom: 1rem !important;\\n  }\\n  .pl-lg-3,\\n  .px-lg-3 {\\n    padding-left: 1rem !important;\\n  }\\n  .p-lg-4 {\\n    padding: 1.5rem !important;\\n  }\\n  .pt-lg-4,\\n  .py-lg-4 {\\n    padding-top: 1.5rem !important;\\n  }\\n  .pr-lg-4,\\n  .px-lg-4 {\\n    padding-right: 1.5rem !important;\\n  }\\n  .pb-lg-4,\\n  .py-lg-4 {\\n    padding-bottom: 1.5rem !important;\\n  }\\n  .pl-lg-4,\\n  .px-lg-4 {\\n    padding-left: 1.5rem !important;\\n  }\\n  .p-lg-5 {\\n    padding: 3rem !important;\\n  }\\n  .pt-lg-5,\\n  .py-lg-5 {\\n    padding-top: 3rem !important;\\n  }\\n  .pr-lg-5,\\n  .px-lg-5 {\\n    padding-right: 3rem !important;\\n  }\\n  .pb-lg-5,\\n  .py-lg-5 {\\n    padding-bottom: 3rem !important;\\n  }\\n  .pl-lg-5,\\n  .px-lg-5 {\\n    padding-left: 3rem !important;\\n  }\\n  .m-lg-n1 {\\n    margin: -0.25rem !important;\\n  }\\n  .mt-lg-n1,\\n  .my-lg-n1 {\\n    margin-top: -0.25rem !important;\\n  }\\n  .mr-lg-n1,\\n  .mx-lg-n1 {\\n    margin-right: -0.25rem !important;\\n  }\\n  .mb-lg-n1,\\n  .my-lg-n1 {\\n    margin-bottom: -0.25rem !important;\\n  }\\n  .ml-lg-n1,\\n  .mx-lg-n1 {\\n    margin-left: -0.25rem !important;\\n  }\\n  .m-lg-n2 {\\n    margin: -0.5rem !important;\\n  }\\n  .mt-lg-n2,\\n  .my-lg-n2 {\\n    margin-top: -0.5rem !important;\\n  }\\n  .mr-lg-n2,\\n  .mx-lg-n2 {\\n    margin-right: -0.5rem !important;\\n  }\\n  .mb-lg-n2,\\n  .my-lg-n2 {\\n    margin-bottom: -0.5rem !important;\\n  }\\n  .ml-lg-n2,\\n  .mx-lg-n2 {\\n    margin-left: -0.5rem !important;\\n  }\\n  .m-lg-n3 {\\n    margin: -1rem !important;\\n  }\\n  .mt-lg-n3,\\n  .my-lg-n3 {\\n    margin-top: -1rem !important;\\n  }\\n  .mr-lg-n3,\\n  .mx-lg-n3 {\\n    margin-right: -1rem !important;\\n  }\\n  .mb-lg-n3,\\n  .my-lg-n3 {\\n    margin-bottom: -1rem !important;\\n  }\\n  .ml-lg-n3,\\n  .mx-lg-n3 {\\n    margin-left: -1rem !important;\\n  }\\n  .m-lg-n4 {\\n    margin: -1.5rem !important;\\n  }\\n  .mt-lg-n4,\\n  .my-lg-n4 {\\n    margin-top: -1.5rem !important;\\n  }\\n  .mr-lg-n4,\\n  .mx-lg-n4 {\\n    margin-right: -1.5rem !important;\\n  }\\n  .mb-lg-n4,\\n  .my-lg-n4 {\\n    margin-bottom: -1.5rem !important;\\n  }\\n  .ml-lg-n4,\\n  .mx-lg-n4 {\\n    margin-left: -1.5rem !important;\\n  }\\n  .m-lg-n5 {\\n    margin: -3rem !important;\\n  }\\n  .mt-lg-n5,\\n  .my-lg-n5 {\\n    margin-top: -3rem !important;\\n  }\\n  .mr-lg-n5,\\n  .mx-lg-n5 {\\n    margin-right: -3rem !important;\\n  }\\n  .mb-lg-n5,\\n  .my-lg-n5 {\\n    margin-bottom: -3rem !important;\\n  }\\n  .ml-lg-n5,\\n  .mx-lg-n5 {\\n    margin-left: -3rem !important;\\n  }\\n  .m-lg-auto {\\n    margin: auto !important;\\n  }\\n  .mt-lg-auto,\\n  .my-lg-auto {\\n    margin-top: auto !important;\\n  }\\n  .mr-lg-auto,\\n  .mx-lg-auto {\\n    margin-right: auto !important;\\n  }\\n  .mb-lg-auto,\\n  .my-lg-auto {\\n    margin-bottom: auto !important;\\n  }\\n  .ml-lg-auto,\\n  .mx-lg-auto {\\n    margin-left: auto !important;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .m-xl-0 {\\n    margin: 0 !important;\\n  }\\n  .mt-xl-0,\\n  .my-xl-0 {\\n    margin-top: 0 !important;\\n  }\\n  .mr-xl-0,\\n  .mx-xl-0 {\\n    margin-right: 0 !important;\\n  }\\n  .mb-xl-0,\\n  .my-xl-0 {\\n    margin-bottom: 0 !important;\\n  }\\n  .ml-xl-0,\\n  .mx-xl-0 {\\n    margin-left: 0 !important;\\n  }\\n  .m-xl-1 {\\n    margin: 0.25rem !important;\\n  }\\n  .mt-xl-1,\\n  .my-xl-1 {\\n    margin-top: 0.25rem !important;\\n  }\\n  .mr-xl-1,\\n  .mx-xl-1 {\\n    margin-right: 0.25rem !important;\\n  }\\n  .mb-xl-1,\\n  .my-xl-1 {\\n    margin-bottom: 0.25rem !important;\\n  }\\n  .ml-xl-1,\\n  .mx-xl-1 {\\n    margin-left: 0.25rem !important;\\n  }\\n  .m-xl-2 {\\n    margin: 0.5rem !important;\\n  }\\n  .mt-xl-2,\\n  .my-xl-2 {\\n    margin-top: 0.5rem !important;\\n  }\\n  .mr-xl-2,\\n  .mx-xl-2 {\\n    margin-right: 0.5rem !important;\\n  }\\n  .mb-xl-2,\\n  .my-xl-2 {\\n    margin-bottom: 0.5rem !important;\\n  }\\n  .ml-xl-2,\\n  .mx-xl-2 {\\n    margin-left: 0.5rem !important;\\n  }\\n  .m-xl-3 {\\n    margin: 1rem !important;\\n  }\\n  .mt-xl-3,\\n  .my-xl-3 {\\n    margin-top: 1rem !important;\\n  }\\n  .mr-xl-3,\\n  .mx-xl-3 {\\n    margin-right: 1rem !important;\\n  }\\n  .mb-xl-3,\\n  .my-xl-3 {\\n    margin-bottom: 1rem !important;\\n  }\\n  .ml-xl-3,\\n  .mx-xl-3 {\\n    margin-left: 1rem !important;\\n  }\\n  .m-xl-4 {\\n    margin: 1.5rem !important;\\n  }\\n  .mt-xl-4,\\n  .my-xl-4 {\\n    margin-top: 1.5rem !important;\\n  }\\n  .mr-xl-4,\\n  .mx-xl-4 {\\n    margin-right: 1.5rem !important;\\n  }\\n  .mb-xl-4,\\n  .my-xl-4 {\\n    margin-bottom: 1.5rem !important;\\n  }\\n  .ml-xl-4,\\n  .mx-xl-4 {\\n    margin-left: 1.5rem !important;\\n  }\\n  .m-xl-5 {\\n    margin: 3rem !important;\\n  }\\n  .mt-xl-5,\\n  .my-xl-5 {\\n    margin-top: 3rem !important;\\n  }\\n  .mr-xl-5,\\n  .mx-xl-5 {\\n    margin-right: 3rem !important;\\n  }\\n  .mb-xl-5,\\n  .my-xl-5 {\\n    margin-bottom: 3rem !important;\\n  }\\n  .ml-xl-5,\\n  .mx-xl-5 {\\n    margin-left: 3rem !important;\\n  }\\n  .p-xl-0 {\\n    padding: 0 !important;\\n  }\\n  .pt-xl-0,\\n  .py-xl-0 {\\n    padding-top: 0 !important;\\n  }\\n  .pr-xl-0,\\n  .px-xl-0 {\\n    padding-right: 0 !important;\\n  }\\n  .pb-xl-0,\\n  .py-xl-0 {\\n    padding-bottom: 0 !important;\\n  }\\n  .pl-xl-0,\\n  .px-xl-0 {\\n    padding-left: 0 !important;\\n  }\\n  .p-xl-1 {\\n    padding: 0.25rem !important;\\n  }\\n  .pt-xl-1,\\n  .py-xl-1 {\\n    padding-top: 0.25rem !important;\\n  }\\n  .pr-xl-1,\\n  .px-xl-1 {\\n    padding-right: 0.25rem !important;\\n  }\\n  .pb-xl-1,\\n  .py-xl-1 {\\n    padding-bottom: 0.25rem !important;\\n  }\\n  .pl-xl-1,\\n  .px-xl-1 {\\n    padding-left: 0.25rem !important;\\n  }\\n  .p-xl-2 {\\n    padding: 0.5rem !important;\\n  }\\n  .pt-xl-2,\\n  .py-xl-2 {\\n    padding-top: 0.5rem !important;\\n  }\\n  .pr-xl-2,\\n  .px-xl-2 {\\n    padding-right: 0.5rem !important;\\n  }\\n  .pb-xl-2,\\n  .py-xl-2 {\\n    padding-bottom: 0.5rem !important;\\n  }\\n  .pl-xl-2,\\n  .px-xl-2 {\\n    padding-left: 0.5rem !important;\\n  }\\n  .p-xl-3 {\\n    padding: 1rem !important;\\n  }\\n  .pt-xl-3,\\n  .py-xl-3 {\\n    padding-top: 1rem !important;\\n  }\\n  .pr-xl-3,\\n  .px-xl-3 {\\n    padding-right: 1rem !important;\\n  }\\n  .pb-xl-3,\\n  .py-xl-3 {\\n    padding-bottom: 1rem !important;\\n  }\\n  .pl-xl-3,\\n  .px-xl-3 {\\n    padding-left: 1rem !important;\\n  }\\n  .p-xl-4 {\\n    padding: 1.5rem !important;\\n  }\\n  .pt-xl-4,\\n  .py-xl-4 {\\n    padding-top: 1.5rem !important;\\n  }\\n  .pr-xl-4,\\n  .px-xl-4 {\\n    padding-right: 1.5rem !important;\\n  }\\n  .pb-xl-4,\\n  .py-xl-4 {\\n    padding-bottom: 1.5rem !important;\\n  }\\n  .pl-xl-4,\\n  .px-xl-4 {\\n    padding-left: 1.5rem !important;\\n  }\\n  .p-xl-5 {\\n    padding: 3rem !important;\\n  }\\n  .pt-xl-5,\\n  .py-xl-5 {\\n    padding-top: 3rem !important;\\n  }\\n  .pr-xl-5,\\n  .px-xl-5 {\\n    padding-right: 3rem !important;\\n  }\\n  .pb-xl-5,\\n  .py-xl-5 {\\n    padding-bottom: 3rem !important;\\n  }\\n  .pl-xl-5,\\n  .px-xl-5 {\\n    padding-left: 3rem !important;\\n  }\\n  .m-xl-n1 {\\n    margin: -0.25rem !important;\\n  }\\n  .mt-xl-n1,\\n  .my-xl-n1 {\\n    margin-top: -0.25rem !important;\\n  }\\n  .mr-xl-n1,\\n  .mx-xl-n1 {\\n    margin-right: -0.25rem !important;\\n  }\\n  .mb-xl-n1,\\n  .my-xl-n1 {\\n    margin-bottom: -0.25rem !important;\\n  }\\n  .ml-xl-n1,\\n  .mx-xl-n1 {\\n    margin-left: -0.25rem !important;\\n  }\\n  .m-xl-n2 {\\n    margin: -0.5rem !important;\\n  }\\n  .mt-xl-n2,\\n  .my-xl-n2 {\\n    margin-top: -0.5rem !important;\\n  }\\n  .mr-xl-n2,\\n  .mx-xl-n2 {\\n    margin-right: -0.5rem !important;\\n  }\\n  .mb-xl-n2,\\n  .my-xl-n2 {\\n    margin-bottom: -0.5rem !important;\\n  }\\n  .ml-xl-n2,\\n  .mx-xl-n2 {\\n    margin-left: -0.5rem !important;\\n  }\\n  .m-xl-n3 {\\n    margin: -1rem !important;\\n  }\\n  .mt-xl-n3,\\n  .my-xl-n3 {\\n    margin-top: -1rem !important;\\n  }\\n  .mr-xl-n3,\\n  .mx-xl-n3 {\\n    margin-right: -1rem !important;\\n  }\\n  .mb-xl-n3,\\n  .my-xl-n3 {\\n    margin-bottom: -1rem !important;\\n  }\\n  .ml-xl-n3,\\n  .mx-xl-n3 {\\n    margin-left: -1rem !important;\\n  }\\n  .m-xl-n4 {\\n    margin: -1.5rem !important;\\n  }\\n  .mt-xl-n4,\\n  .my-xl-n4 {\\n    margin-top: -1.5rem !important;\\n  }\\n  .mr-xl-n4,\\n  .mx-xl-n4 {\\n    margin-right: -1.5rem !important;\\n  }\\n  .mb-xl-n4,\\n  .my-xl-n4 {\\n    margin-bottom: -1.5rem !important;\\n  }\\n  .ml-xl-n4,\\n  .mx-xl-n4 {\\n    margin-left: -1.5rem !important;\\n  }\\n  .m-xl-n5 {\\n    margin: -3rem !important;\\n  }\\n  .mt-xl-n5,\\n  .my-xl-n5 {\\n    margin-top: -3rem !important;\\n  }\\n  .mr-xl-n5,\\n  .mx-xl-n5 {\\n    margin-right: -3rem !important;\\n  }\\n  .mb-xl-n5,\\n  .my-xl-n5 {\\n    margin-bottom: -3rem !important;\\n  }\\n  .ml-xl-n5,\\n  .mx-xl-n5 {\\n    margin-left: -3rem !important;\\n  }\\n  .m-xl-auto {\\n    margin: auto !important;\\n  }\\n  .mt-xl-auto,\\n  .my-xl-auto {\\n    margin-top: auto !important;\\n  }\\n  .mr-xl-auto,\\n  .mx-xl-auto {\\n    margin-right: auto !important;\\n  }\\n  .mb-xl-auto,\\n  .my-xl-auto {\\n    margin-bottom: auto !important;\\n  }\\n  .ml-xl-auto,\\n  .mx-xl-auto {\\n    margin-left: auto !important;\\n  }\\n}\\n\\n.text-monospace {\\n  font-family: SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace !important;\\n}\\n\\n.text-justify {\\n  text-align: justify !important;\\n}\\n\\n.text-wrap {\\n  white-space: normal !important;\\n}\\n\\n.text-nowrap {\\n  white-space: nowrap !important;\\n}\\n\\n.text-truncate {\\n  overflow: hidden;\\n  text-overflow: ellipsis;\\n  white-space: nowrap;\\n}\\n\\n.text-left {\\n  text-align: left !important;\\n}\\n\\n.text-right {\\n  text-align: right !important;\\n}\\n\\n.text-center {\\n  text-align: center !important;\\n}\\n\\n@media (min-width: 576px) {\\n  .text-sm-left {\\n    text-align: left !important;\\n  }\\n  .text-sm-right {\\n    text-align: right !important;\\n  }\\n  .text-sm-center {\\n    text-align: center !important;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .text-md-left {\\n    text-align: left !important;\\n  }\\n  .text-md-right {\\n    text-align: right !important;\\n  }\\n  .text-md-center {\\n    text-align: center !important;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .text-lg-left {\\n    text-align: left !important;\\n  }\\n  .text-lg-right {\\n    text-align: right !important;\\n  }\\n  .text-lg-center {\\n    text-align: center !important;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .text-xl-left {\\n    text-align: left !important;\\n  }\\n  .text-xl-right {\\n    text-align: right !important;\\n  }\\n  .text-xl-center {\\n    text-align: center !important;\\n  }\\n}\\n\\n.text-lowercase {\\n  text-transform: lowercase !important;\\n}\\n\\n.text-uppercase {\\n  text-transform: uppercase !important;\\n}\\n\\n.text-capitalize {\\n  text-transform: capitalize !important;\\n}\\n\\n.font-weight-light {\\n  font-weight: 300 !important;\\n}\\n\\n.font-weight-lighter {\\n  font-weight: lighter !important;\\n}\\n\\n.font-weight-normal {\\n  font-weight: 400 !important;\\n}\\n\\n.font-weight-bold {\\n  font-weight: 700 !important;\\n}\\n\\n.font-weight-bolder {\\n  font-weight: bolder !important;\\n}\\n\\n.font-italic {\\n  font-style: italic !important;\\n}\\n\\n.text-white {\\n  color: #fff !important;\\n}\\n\\n.text-primary {\\n  color: #007bff !important;\\n}\\n\\na.text-primary:hover, a.text-primary:focus {\\n  color: #0056b3 !important;\\n}\\n\\n.text-secondary {\\n  color: #6c757d !important;\\n}\\n\\na.text-secondary:hover, a.text-secondary:focus {\\n  color: #494f54 !important;\\n}\\n\\n.text-success {\\n  color: #28a745 !important;\\n}\\n\\na.text-success:hover, a.text-success:focus {\\n  color: #19692c !important;\\n}\\n\\n.text-info {\\n  color: #17a2b8 !important;\\n}\\n\\na.text-info:hover, a.text-info:focus {\\n  color: #0f6674 !important;\\n}\\n\\n.text-warning {\\n  color: #ffc107 !important;\\n}\\n\\na.text-warning:hover, a.text-warning:focus {\\n  color: #ba8b00 !important;\\n}\\n\\n.text-danger {\\n  color: #dc3545 !important;\\n}\\n\\na.text-danger:hover, a.text-danger:focus {\\n  color: #a71d2a !important;\\n}\\n\\n.text-light {\\n  color: #f8f9fa !important;\\n}\\n\\na.text-light:hover, a.text-light:focus {\\n  color: #cbd3da !important;\\n}\\n\\n.text-dark {\\n  color: #343a40 !important;\\n}\\n\\na.text-dark:hover, a.text-dark:focus {\\n  color: #121416 !important;\\n}\\n\\n.text-body {\\n  color: #212529 !important;\\n}\\n\\n.text-muted {\\n  color: #6c757d !important;\\n}\\n\\n.text-black-50 {\\n  color: rgba(0, 0, 0, 0.5) !important;\\n}\\n\\n.text-white-50 {\\n  color: rgba(255, 255, 255, 0.5) !important;\\n}\\n\\n.text-hide {\\n  font: 0/0 a;\\n  color: transparent;\\n  text-shadow: none;\\n  background-color: transparent;\\n  border: 0;\\n}\\n\\n.text-decoration-none {\\n  text-decoration: none !important;\\n}\\n\\n.text-break {\\n  word-break: break-word !important;\\n  overflow-wrap: break-word !important;\\n}\\n\\n.text-reset {\\n  color: inherit !important;\\n}\\n\\n.visible {\\n  visibility: visible !important;\\n}\\n\\n.invisible {\\n  visibility: hidden !important;\\n}\\n\\n@media print {\\n  *,\\n  *::before,\\n  *::after {\\n    text-shadow: none !important;\\n    box-shadow: none !important;\\n  }\\n  a:not(.btn) {\\n    text-decoration: underline;\\n  }\\n  abbr[title]::after {\\n    content: \\\" (\\\" attr(title) \\\")\\\";\\n  }\\n  pre {\\n    white-space: pre-wrap !important;\\n  }\\n  pre,\\n  blockquote {\\n    border: 1px solid #adb5bd;\\n    page-break-inside: avoid;\\n  }\\n  thead {\\n    display: table-header-group;\\n  }\\n  tr,\\n  img {\\n    page-break-inside: avoid;\\n  }\\n  p,\\n  h2,\\n  h3 {\\n    orphans: 3;\\n    widows: 3;\\n  }\\n  h2,\\n  h3 {\\n    page-break-after: avoid;\\n  }\\n  @page {\\n    size: a3;\\n  }\\n  body {\\n    min-width: 992px !important;\\n  }\\n  .container {\\n    min-width: 992px !important;\\n  }\\n  .navbar {\\n    display: none;\\n  }\\n  .badge {\\n    border: 1px solid #000;\\n  }\\n  .table {\\n    border-collapse: collapse !important;\\n  }\\n  .table td,\\n  .table th {\\n    background-color: #fff !important;\\n  }\\n  .table-bordered th,\\n  .table-bordered td {\\n    border: 1px solid #dee2e6 !important;\\n  }\\n  .table-dark {\\n    color: inherit;\\n  }\\n  .table-dark th,\\n  .table-dark td,\\n  .table-dark thead th,\\n  .table-dark tbody + tbody {\\n    border-color: #dee2e6;\\n  }\\n  .table .thead-dark th {\\n    color: inherit;\\n    border-color: #dee2e6;\\n  }\\n}\\n\\n/*# sourceMappingURL=bootstrap.css.map */\",\":root {\\n  // Custom variable values only support SassScript inside `#{}`.\\n  @each $color, $value in $colors {\\n    --#{$color}: #{$value};\\n  }\\n\\n  @each $color, $value in $theme-colors {\\n    --#{$color}: #{$value};\\n  }\\n\\n  @each $bp, $value in $grid-breakpoints {\\n    --breakpoint-#{$bp}: #{$value};\\n  }\\n\\n  // Use `inspect` for lists so that quoted items keep the quotes.\\n  // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\\n  --font-family-sans-serif: #{inspect($font-family-sans-serif)};\\n  --font-family-monospace: #{inspect($font-family-monospace)};\\n}\\n\",\"// stylelint-disable at-rule-no-vendor-prefix, declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\\n\\n// Reboot\\n//\\n// Normalization of HTML elements, manually forked from Normalize.css to remove\\n// styles targeting irrelevant browsers while applying new styles.\\n//\\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\\n\\n\\n// Document\\n//\\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\\n// 2. Change the default font family in all browsers.\\n// 3. Correct the line height in all browsers.\\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\\n// 5. Change the default tap highlight to be completely transparent in iOS.\\n\\n*,\\n*::before,\\n*::after {\\n  box-sizing: border-box; // 1\\n}\\n\\nhtml {\\n  font-family: sans-serif; // 2\\n  line-height: 1.15; // 3\\n  -webkit-text-size-adjust: 100%; // 4\\n  -webkit-tap-highlight-color: rgba($black, 0); // 5\\n}\\n\\n// Shim for \\\"new\\\" HTML5 structural elements to display correctly (IE10, older browsers)\\n// TODO: remove in v5\\n// stylelint-disable-next-line selector-list-comma-newline-after\\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\\n  display: block;\\n}\\n\\n// Body\\n//\\n// 1. Remove the margin in all browsers.\\n// 2. As a best practice, apply a default `background-color`.\\n// 3. Set an explicit initial text-align value so that we can later use\\n//    the `inherit` value on things like `<th>` elements.\\n\\nbody {\\n  margin: 0; // 1\\n  font-family: $font-family-base;\\n  @include font-size($font-size-base);\\n  font-weight: $font-weight-base;\\n  line-height: $line-height-base;\\n  color: $body-color;\\n  text-align: left; // 3\\n  background-color: $body-bg; // 2\\n}\\n\\n// Suppress the focus outline on elements that cannot be accessed via keyboard.\\n// This prevents an unwanted focus outline from appearing around elements that\\n// might still respond to pointer events.\\n//\\n// Credit: https://github.com/suitcss/base\\n[tabindex=\\\"-1\\\"]:focus {\\n  outline: 0 !important;\\n}\\n\\n\\n// Content grouping\\n//\\n// 1. Add the correct box sizing in Firefox.\\n// 2. Show the overflow in Edge and IE.\\n\\nhr {\\n  box-sizing: content-box; // 1\\n  height: 0; // 1\\n  overflow: visible; // 2\\n}\\n\\n\\n//\\n// Typography\\n//\\n\\n// Remove top margins from headings\\n//\\n// By default, `<h1>`-`<h6>` all receive top and bottom margins. We nuke the top\\n// margin for easier control within type scales as it avoids margin collapsing.\\n// stylelint-disable-next-line selector-list-comma-newline-after\\nh1, h2, h3, h4, h5, h6 {\\n  margin-top: 0;\\n  margin-bottom: $headings-margin-bottom;\\n}\\n\\n// Reset margins on paragraphs\\n//\\n// Similarly, the top margin on `<p>`s get reset. However, we also reset the\\n// bottom margin to use `rem` units instead of `em`.\\np {\\n  margin-top: 0;\\n  margin-bottom: $paragraph-margin-bottom;\\n}\\n\\n// Abbreviations\\n//\\n// 1. Duplicate behavior to the data-* attribute for our tooltip plugin\\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\\n// 3. Add explicit cursor to indicate changed behavior.\\n// 4. Remove the bottom border in Firefox 39-.\\n// 5. Prevent the text-decoration to be skipped.\\n\\nabbr[title],\\nabbr[data-original-title] { // 1\\n  text-decoration: underline; // 2\\n  text-decoration: underline dotted; // 2\\n  cursor: help; // 3\\n  border-bottom: 0; // 4\\n  text-decoration-skip-ink: none; // 5\\n}\\n\\naddress {\\n  margin-bottom: 1rem;\\n  font-style: normal;\\n  line-height: inherit;\\n}\\n\\nol,\\nul,\\ndl {\\n  margin-top: 0;\\n  margin-bottom: 1rem;\\n}\\n\\nol ol,\\nul ul,\\nol ul,\\nul ol {\\n  margin-bottom: 0;\\n}\\n\\ndt {\\n  font-weight: $dt-font-weight;\\n}\\n\\ndd {\\n  margin-bottom: .5rem;\\n  margin-left: 0; // Undo browser default\\n}\\n\\nblockquote {\\n  margin: 0 0 1rem;\\n}\\n\\nb,\\nstrong {\\n  font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari\\n}\\n\\nsmall {\\n  @include font-size(80%); // Add the correct font size in all browsers\\n}\\n\\n//\\n// Prevent `sub` and `sup` elements from affecting the line height in\\n// all browsers.\\n//\\n\\nsub,\\nsup {\\n  position: relative;\\n  @include font-size(75%);\\n  line-height: 0;\\n  vertical-align: baseline;\\n}\\n\\nsub { bottom: -.25em; }\\nsup { top: -.5em; }\\n\\n\\n//\\n// Links\\n//\\n\\na {\\n  color: $link-color;\\n  text-decoration: $link-decoration;\\n  background-color: transparent; // Remove the gray background on active links in IE 10.\\n\\n  @include hover {\\n    color: $link-hover-color;\\n    text-decoration: $link-hover-decoration;\\n  }\\n}\\n\\n// And undo these styles for placeholder links/named anchors (without href)\\n// which have not been made explicitly keyboard-focusable (without tabindex).\\n// It would be more straightforward to just use a[href] in previous block, but that\\n// causes specificity issues in many other styles that are too complex to fix.\\n// See https://github.com/twbs/bootstrap/issues/19402\\n\\na:not([href]):not([tabindex]) {\\n  color: inherit;\\n  text-decoration: none;\\n\\n  @include hover-focus {\\n    color: inherit;\\n    text-decoration: none;\\n  }\\n\\n  &:focus {\\n    outline: 0;\\n  }\\n}\\n\\n\\n//\\n// Code\\n//\\n\\npre,\\ncode,\\nkbd,\\nsamp {\\n  font-family: $font-family-monospace;\\n  @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\\n}\\n\\npre {\\n  // Remove browser default top margin\\n  margin-top: 0;\\n  // Reset browser default of `1em` to use `rem`s\\n  margin-bottom: 1rem;\\n  // Don't allow content to break outside\\n  overflow: auto;\\n}\\n\\n\\n//\\n// Figures\\n//\\n\\nfigure {\\n  // Apply a consistent margin strategy (matches our type styles).\\n  margin: 0 0 1rem;\\n}\\n\\n\\n//\\n// Images and content\\n//\\n\\nimg {\\n  vertical-align: middle;\\n  border-style: none; // Remove the border on images inside links in IE 10-.\\n}\\n\\nsvg {\\n  // Workaround for the SVG overflow bug in IE10/11 is still required.\\n  // See https://github.com/twbs/bootstrap/issues/26878\\n  overflow: hidden;\\n  vertical-align: middle;\\n}\\n\\n\\n//\\n// Tables\\n//\\n\\ntable {\\n  border-collapse: collapse; // Prevent double borders\\n}\\n\\ncaption {\\n  padding-top: $table-cell-padding;\\n  padding-bottom: $table-cell-padding;\\n  color: $table-caption-color;\\n  text-align: left;\\n  caption-side: bottom;\\n}\\n\\nth {\\n  // Matches default `<td>` alignment by inheriting from the `<body>`, or the\\n  // closest parent with a set `text-align`.\\n  text-align: inherit;\\n}\\n\\n\\n//\\n// Forms\\n//\\n\\nlabel {\\n  // Allow labels to use `margin` for spacing.\\n  display: inline-block;\\n  margin-bottom: $label-margin-bottom;\\n}\\n\\n// Remove the default `border-radius` that macOS Chrome adds.\\n//\\n// Details at https://github.com/twbs/bootstrap/issues/24093\\nbutton {\\n  // stylelint-disable-next-line property-blacklist\\n  border-radius: 0;\\n}\\n\\n// Work around a Firefox/IE bug where the transparent `button` background\\n// results in a loss of the default `button` focus styles.\\n//\\n// Credit: https://github.com/suitcss/base/\\nbutton:focus {\\n  outline: 1px dotted;\\n  outline: 5px auto -webkit-focus-ring-color;\\n}\\n\\ninput,\\nbutton,\\nselect,\\noptgroup,\\ntextarea {\\n  margin: 0; // Remove the margin in Firefox and Safari\\n  font-family: inherit;\\n  @include font-size(inherit);\\n  line-height: inherit;\\n}\\n\\nbutton,\\ninput {\\n  overflow: visible; // Show the overflow in Edge\\n}\\n\\nbutton,\\nselect {\\n  text-transform: none; // Remove the inheritance of text transform in Firefox\\n}\\n\\n// Remove the inheritance of word-wrap in Safari.\\n//\\n// Details at https://github.com/twbs/bootstrap/issues/24990\\nselect {\\n  word-wrap: normal;\\n}\\n\\n\\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\\n//    controls in Android 4.\\n// 2. Correct the inability to style clickable types in iOS and Safari.\\nbutton,\\n[type=\\\"button\\\"], // 1\\n[type=\\\"reset\\\"],\\n[type=\\\"submit\\\"] {\\n  -webkit-appearance: button; // 2\\n}\\n\\n// Opinionated: add \\\"hand\\\" cursor to non-disabled button elements.\\n@if $enable-pointer-cursor-for-buttons {\\n  button,\\n  [type=\\\"button\\\"],\\n  [type=\\\"reset\\\"],\\n  [type=\\\"submit\\\"] {\\n    &:not(:disabled) {\\n      cursor: pointer;\\n    }\\n  }\\n}\\n\\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\\nbutton::-moz-focus-inner,\\n[type=\\\"button\\\"]::-moz-focus-inner,\\n[type=\\\"reset\\\"]::-moz-focus-inner,\\n[type=\\\"submit\\\"]::-moz-focus-inner {\\n  padding: 0;\\n  border-style: none;\\n}\\n\\ninput[type=\\\"radio\\\"],\\ninput[type=\\\"checkbox\\\"] {\\n  box-sizing: border-box; // 1. Add the correct box sizing in IE 10-\\n  padding: 0; // 2. Remove the padding in IE 10-\\n}\\n\\n\\ninput[type=\\\"date\\\"],\\ninput[type=\\\"time\\\"],\\ninput[type=\\\"datetime-local\\\"],\\ninput[type=\\\"month\\\"] {\\n  // Remove the default appearance of temporal inputs to avoid a Mobile Safari\\n  // bug where setting a custom line-height prevents text from being vertically\\n  // centered within the input.\\n  // See https://bugs.webkit.org/show_bug.cgi?id=139848\\n  // and https://github.com/twbs/bootstrap/issues/11266\\n  -webkit-appearance: listbox;\\n}\\n\\ntextarea {\\n  overflow: auto; // Remove the default vertical scrollbar in IE.\\n  // Textareas should really only resize vertically so they don't break their (horizontal) containers.\\n  resize: vertical;\\n}\\n\\nfieldset {\\n  // Browsers set a default `min-width: min-content;` on fieldsets,\\n  // unlike e.g. `<div>`s, which have `min-width: 0;` by default.\\n  // So we reset that to ensure fieldsets behave more like a standard block element.\\n  // See https://github.com/twbs/bootstrap/issues/12359\\n  // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\\n  min-width: 0;\\n  // Reset the default outline behavior of fieldsets so they don't affect page layout.\\n  padding: 0;\\n  margin: 0;\\n  border: 0;\\n}\\n\\n// 1. Correct the text wrapping in Edge and IE.\\n// 2. Correct the color inheritance from `fieldset` elements in IE.\\nlegend {\\n  display: block;\\n  width: 100%;\\n  max-width: 100%; // 1\\n  padding: 0;\\n  margin-bottom: .5rem;\\n  @include font-size(1.5rem);\\n  line-height: inherit;\\n  color: inherit; // 2\\n  white-space: normal; // 1\\n}\\n\\nprogress {\\n  vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.\\n}\\n\\n// Correct the cursor style of increment and decrement buttons in Chrome.\\n[type=\\\"number\\\"]::-webkit-inner-spin-button,\\n[type=\\\"number\\\"]::-webkit-outer-spin-button {\\n  height: auto;\\n}\\n\\n[type=\\\"search\\\"] {\\n  // This overrides the extra rounded corners on search inputs in iOS so that our\\n  // `.form-control` class can properly style them. Note that this cannot simply\\n  // be added to `.form-control` as it's not specific enough. For details, see\\n  // https://github.com/twbs/bootstrap/issues/11586.\\n  outline-offset: -2px; // 2. Correct the outline style in Safari.\\n  -webkit-appearance: none;\\n}\\n\\n//\\n// Remove the inner padding in Chrome and Safari on macOS.\\n//\\n\\n[type=\\\"search\\\"]::-webkit-search-decoration {\\n  -webkit-appearance: none;\\n}\\n\\n//\\n// 1. Correct the inability to style clickable types in iOS and Safari.\\n// 2. Change font properties to `inherit` in Safari.\\n//\\n\\n::-webkit-file-upload-button {\\n  font: inherit; // 2\\n  -webkit-appearance: button; // 1\\n}\\n\\n//\\n// Correct element displays\\n//\\n\\noutput {\\n  display: inline-block;\\n}\\n\\nsummary {\\n  display: list-item; // Add the correct display in all browsers\\n  cursor: pointer;\\n}\\n\\ntemplate {\\n  display: none; // Add the correct display in IE\\n}\\n\\n// Always hide an element with the `hidden` HTML attribute (from PureCSS).\\n// Needed for proper display in IE 10-.\\n[hidden] {\\n  display: none !important;\\n}\\n\",\"// Variables\\n//\\n// Variables should follow the `$component-state-property-size` formula for\\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\\n\\n// Color system\\n\\n$white:    #fff !default;\\n$gray-100: #f8f9fa !default;\\n$gray-200: #e9ecef !default;\\n$gray-300: #dee2e6 !default;\\n$gray-400: #ced4da !default;\\n$gray-500: #adb5bd !default;\\n$gray-600: #6c757d !default;\\n$gray-700: #495057 !default;\\n$gray-800: #343a40 !default;\\n$gray-900: #212529 !default;\\n$black:    #000 !default;\\n\\n$grays: () !default;\\n// stylelint-disable-next-line scss/dollar-variable-default\\n$grays: map-merge(\\n  (\\n    \\\"100\\\": $gray-100,\\n    \\\"200\\\": $gray-200,\\n    \\\"300\\\": $gray-300,\\n    \\\"400\\\": $gray-400,\\n    \\\"500\\\": $gray-500,\\n    \\\"600\\\": $gray-600,\\n    \\\"700\\\": $gray-700,\\n    \\\"800\\\": $gray-800,\\n    \\\"900\\\": $gray-900\\n  ),\\n  $grays\\n);\\n\\n$blue:    #007bff !default;\\n$indigo:  #6610f2 !default;\\n$purple:  #6f42c1 !default;\\n$pink:    #e83e8c !default;\\n$red:     #dc3545 !default;\\n$orange:  #fd7e14 !default;\\n$yellow:  #ffc107 !default;\\n$green:   #28a745 !default;\\n$teal:    #20c997 !default;\\n$cyan:    #17a2b8 !default;\\n\\n$colors: () !default;\\n// stylelint-disable-next-line scss/dollar-variable-default\\n$colors: map-merge(\\n  (\\n    \\\"blue\\\":       $blue,\\n    \\\"indigo\\\":     $indigo,\\n    \\\"purple\\\":     $purple,\\n    \\\"pink\\\":       $pink,\\n    \\\"red\\\":        $red,\\n    \\\"orange\\\":     $orange,\\n    \\\"yellow\\\":     $yellow,\\n    \\\"green\\\":      $green,\\n    \\\"teal\\\":       $teal,\\n    \\\"cyan\\\":       $cyan,\\n    \\\"white\\\":      $white,\\n    \\\"gray\\\":       $gray-600,\\n    \\\"gray-dark\\\":  $gray-800\\n  ),\\n  $colors\\n);\\n\\n$primary:       $blue !default;\\n$secondary:     $gray-600 !default;\\n$success:       $green !default;\\n$info:          $cyan !default;\\n$warning:       $yellow !default;\\n$danger:        $red !default;\\n$light:         $gray-100 !default;\\n$dark:          $gray-800 !default;\\n\\n$theme-colors: () !default;\\n// stylelint-disable-next-line scss/dollar-variable-default\\n$theme-colors: map-merge(\\n  (\\n    \\\"primary\\\":    $primary,\\n    \\\"secondary\\\":  $secondary,\\n    \\\"success\\\":    $success,\\n    \\\"info\\\":       $info,\\n    \\\"warning\\\":    $warning,\\n    \\\"danger\\\":     $danger,\\n    \\\"light\\\":      $light,\\n    \\\"dark\\\":       $dark\\n  ),\\n  $theme-colors\\n);\\n\\n// Set a specific jump point for requesting color jumps\\n$theme-color-interval:      8% !default;\\n\\n// The yiq lightness value that determines when the lightness of color changes from \\\"dark\\\" to \\\"light\\\". Acceptable values are between 0 and 255.\\n$yiq-contrasted-threshold:  150 !default;\\n\\n// Customize the light and dark text colors for use in our YIQ color contrast function.\\n$yiq-text-dark:             $gray-900 !default;\\n$yiq-text-light:            $white !default;\\n\\n\\n// Options\\n//\\n// Quickly modify global styling by enabling or disabling optional features.\\n\\n$enable-caret:                                true !default;\\n$enable-rounded:                              true !default;\\n$enable-shadows:                              false !default;\\n$enable-gradients:                            false !default;\\n$enable-transitions:                          true !default;\\n$enable-prefers-reduced-motion-media-query:   true !default;\\n$enable-hover-media-query:                    false !default; // Deprecated, no longer affects any compiled CSS\\n$enable-grid-classes:                         true !default;\\n$enable-pointer-cursor-for-buttons:           true !default;\\n$enable-print-styles:                         true !default;\\n$enable-responsive-font-sizes:                false !default;\\n$enable-validation-icons:                     true !default;\\n$enable-deprecation-messages:                 true !default;\\n\\n\\n// Spacing\\n//\\n// Control the default styling of most Bootstrap elements by modifying these\\n// variables. Mostly focused on spacing.\\n// You can add more entries to the $spacers map, should you need more variation.\\n\\n$spacer: 1rem !default;\\n$spacers: () !default;\\n// stylelint-disable-next-line scss/dollar-variable-default\\n$spacers: map-merge(\\n  (\\n    0: 0,\\n    1: ($spacer * .25),\\n    2: ($spacer * .5),\\n    3: $spacer,\\n    4: ($spacer * 1.5),\\n    5: ($spacer * 3)\\n  ),\\n  $spacers\\n);\\n\\n// This variable affects the `.h-*` and `.w-*` classes.\\n$sizes: () !default;\\n// stylelint-disable-next-line scss/dollar-variable-default\\n$sizes: map-merge(\\n  (\\n    25: 25%,\\n    50: 50%,\\n    75: 75%,\\n    100: 100%,\\n    auto: auto\\n  ),\\n  $sizes\\n);\\n\\n\\n// Body\\n//\\n// Settings for the `<body>` element.\\n\\n$body-bg:                   $white !default;\\n$body-color:                $gray-900 !default;\\n\\n\\n// Links\\n//\\n// Style anchor elements.\\n\\n$link-color:                              theme-color(\\\"primary\\\") !default;\\n$link-decoration:                         none !default;\\n$link-hover-color:                        darken($link-color, 15%) !default;\\n$link-hover-decoration:                   underline !default;\\n// Darken percentage for links with `.text-*` class (e.g. `.text-success`)\\n$emphasized-link-hover-darken-percentage: 15% !default;\\n\\n// Paragraphs\\n//\\n// Style p element.\\n\\n$paragraph-margin-bottom:   1rem !default;\\n\\n\\n// Grid breakpoints\\n//\\n// Define the minimum dimensions at which your layout will change,\\n// adapting to different screen sizes, for use in media queries.\\n\\n$grid-breakpoints: (\\n  xs: 0,\\n  sm: 576px,\\n  md: 768px,\\n  lg: 992px,\\n  xl: 1200px\\n) !default;\\n\\n@include _assert-ascending($grid-breakpoints, \\\"$grid-breakpoints\\\");\\n@include _assert-starts-at-zero($grid-breakpoints, \\\"$grid-breakpoints\\\");\\n\\n\\n// Grid containers\\n//\\n// Define the maximum width of `.container` for different screen sizes.\\n\\n$container-max-widths: (\\n  sm: 540px,\\n  md: 720px,\\n  lg: 960px,\\n  xl: 1140px\\n) !default;\\n\\n@include _assert-ascending($container-max-widths, \\\"$container-max-widths\\\");\\n\\n\\n// Grid columns\\n//\\n// Set the number of columns and specify the width of the gutters.\\n\\n$grid-columns:                12 !default;\\n$grid-gutter-width:           30px !default;\\n\\n\\n// Components\\n//\\n// Define common padding and border radius sizes and more.\\n\\n$line-height-lg:              1.5 !default;\\n$line-height-sm:              1.5 !default;\\n\\n$border-width:                1px !default;\\n$border-color:                $gray-300 !default;\\n\\n$border-radius:               .25rem !default;\\n$border-radius-lg:            .3rem !default;\\n$border-radius-sm:            .2rem !default;\\n\\n$rounded-pill:                50rem !default;\\n\\n$box-shadow-sm:               0 .125rem .25rem rgba($black, .075) !default;\\n$box-shadow:                  0 .5rem 1rem rgba($black, .15) !default;\\n$box-shadow-lg:               0 1rem 3rem rgba($black, .175) !default;\\n\\n$component-active-color:      $white !default;\\n$component-active-bg:         theme-color(\\\"primary\\\") !default;\\n\\n$caret-width:                 .3em !default;\\n$caret-vertical-align:        $caret-width * .85 !default;\\n$caret-spacing:               $caret-width * .85 !default;\\n\\n$transition-base:             all .2s ease-in-out !default;\\n$transition-fade:             opacity .15s linear !default;\\n$transition-collapse:         height .35s ease !default;\\n\\n$embed-responsive-aspect-ratios: () !default;\\n// stylelint-disable-next-line scss/dollar-variable-default\\n$embed-responsive-aspect-ratios: join(\\n  (\\n    (21 9),\\n    (16 9),\\n    (4 3),\\n    (1 1),\\n  ),\\n  $embed-responsive-aspect-ratios\\n);\\n\\n// Typography\\n//\\n// Font, line-height, and color for body text, headings, and more.\\n\\n// stylelint-disable value-keyword-case\\n$font-family-sans-serif:      -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, \\\"Helvetica Neue\\\", Arial, \\\"Noto Sans\\\", sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\" !default;\\n$font-family-monospace:       SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace !default;\\n$font-family-base:            $font-family-sans-serif !default;\\n// stylelint-enable value-keyword-case\\n\\n$font-size-base:              1rem !default; // Assumes the browser default, typically `16px`\\n$font-size-lg:                $font-size-base * 1.25 !default;\\n$font-size-sm:                $font-size-base * .875 !default;\\n\\n$font-weight-lighter:         lighter !default;\\n$font-weight-light:           300 !default;\\n$font-weight-normal:          400 !default;\\n$font-weight-bold:            700 !default;\\n$font-weight-bolder:          bolder !default;\\n\\n$font-weight-base:            $font-weight-normal !default;\\n$line-height-base:            1.5 !default;\\n\\n$h1-font-size:                $font-size-base * 2.5 !default;\\n$h2-font-size:                $font-size-base * 2 !default;\\n$h3-font-size:                $font-size-base * 1.75 !default;\\n$h4-font-size:                $font-size-base * 1.5 !default;\\n$h5-font-size:                $font-size-base * 1.25 !default;\\n$h6-font-size:                $font-size-base !default;\\n\\n$headings-margin-bottom:      $spacer / 2 !default;\\n$headings-font-family:        null !default;\\n$headings-font-weight:        500 !default;\\n$headings-line-height:        1.2 !default;\\n$headings-color:              null !default;\\n\\n$display1-size:               6rem !default;\\n$display2-size:               5.5rem !default;\\n$display3-size:               4.5rem !default;\\n$display4-size:               3.5rem !default;\\n\\n$display1-weight:             300 !default;\\n$display2-weight:             300 !default;\\n$display3-weight:             300 !default;\\n$display4-weight:             300 !default;\\n$display-line-height:         $headings-line-height !default;\\n\\n$lead-font-size:              $font-size-base * 1.25 !default;\\n$lead-font-weight:            300 !default;\\n\\n$small-font-size:             80% !default;\\n\\n$text-muted:                  $gray-600 !default;\\n\\n$blockquote-small-color:      $gray-600 !default;\\n$blockquote-small-font-size:  $small-font-size !default;\\n$blockquote-font-size:        $font-size-base * 1.25 !default;\\n\\n$hr-border-color:             rgba($black, .1) !default;\\n$hr-border-width:             $border-width !default;\\n\\n$mark-padding:                .2em !default;\\n\\n$dt-font-weight:              $font-weight-bold !default;\\n\\n$kbd-box-shadow:              inset 0 -.1rem 0 rgba($black, .25) !default;\\n$nested-kbd-font-weight:      $font-weight-bold !default;\\n\\n$list-inline-padding:         .5rem !default;\\n\\n$mark-bg:                     #fcf8e3 !default;\\n\\n$hr-margin-y:                 $spacer !default;\\n\\n\\n// Tables\\n//\\n// Customizes the `.table` component with basic values, each used across all table variations.\\n\\n$table-cell-padding:          .75rem !default;\\n$table-cell-padding-sm:       .3rem !default;\\n\\n$table-color:                 $body-color !default;\\n$table-bg:                    null !default;\\n$table-accent-bg:             rgba($black, .05) !default;\\n$table-hover-color:           $table-color !default;\\n$table-hover-bg:              rgba($black, .075) !default;\\n$table-active-bg:             $table-hover-bg !default;\\n\\n$table-border-width:          $border-width !default;\\n$table-border-color:          $border-color !default;\\n\\n$table-head-bg:               $gray-200 !default;\\n$table-head-color:            $gray-700 !default;\\n\\n$table-dark-color:            $white !default;\\n$table-dark-bg:               $gray-800 !default;\\n$table-dark-accent-bg:        rgba($white, .05) !default;\\n$table-dark-hover-color:      $table-dark-color !default;\\n$table-dark-hover-bg:         rgba($white, .075) !default;\\n$table-dark-border-color:     lighten($table-dark-bg, 7.5%) !default;\\n$table-dark-color:            $white !default;\\n\\n$table-striped-order:         odd !default;\\n\\n$table-caption-color:         $text-muted !default;\\n\\n$table-bg-level:              -9 !default;\\n$table-border-level:          -6 !default;\\n\\n\\n// Buttons + Forms\\n//\\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\\n\\n$input-btn-padding-y:         .375rem !default;\\n$input-btn-padding-x:         .75rem !default;\\n$input-btn-font-family:       null !default;\\n$input-btn-font-size:         $font-size-base !default;\\n$input-btn-line-height:       $line-height-base !default;\\n\\n$input-btn-focus-width:       .2rem !default;\\n$input-btn-focus-color:       rgba($component-active-bg, .25) !default;\\n$input-btn-focus-box-shadow:  0 0 0 $input-btn-focus-width $input-btn-focus-color !default;\\n\\n$input-btn-padding-y-sm:      .25rem !default;\\n$input-btn-padding-x-sm:      .5rem !default;\\n$input-btn-font-size-sm:      $font-size-sm !default;\\n$input-btn-line-height-sm:    $line-height-sm !default;\\n\\n$input-btn-padding-y-lg:      .5rem !default;\\n$input-btn-padding-x-lg:      1rem !default;\\n$input-btn-font-size-lg:      $font-size-lg !default;\\n$input-btn-line-height-lg:    $line-height-lg !default;\\n\\n$input-btn-border-width:      $border-width !default;\\n\\n\\n// Buttons\\n//\\n// For each of Bootstrap's buttons, define text, background, and border color.\\n\\n$btn-padding-y:               $input-btn-padding-y !default;\\n$btn-padding-x:               $input-btn-padding-x !default;\\n$btn-font-family:             $input-btn-font-family !default;\\n$btn-font-size:               $input-btn-font-size !default;\\n$btn-line-height:             $input-btn-line-height !default;\\n\\n$btn-padding-y-sm:            $input-btn-padding-y-sm !default;\\n$btn-padding-x-sm:            $input-btn-padding-x-sm !default;\\n$btn-font-size-sm:            $input-btn-font-size-sm !default;\\n$btn-line-height-sm:          $input-btn-line-height-sm !default;\\n\\n$btn-padding-y-lg:            $input-btn-padding-y-lg !default;\\n$btn-padding-x-lg:            $input-btn-padding-x-lg !default;\\n$btn-font-size-lg:            $input-btn-font-size-lg !default;\\n$btn-line-height-lg:          $input-btn-line-height-lg !default;\\n\\n$btn-border-width:            $input-btn-border-width !default;\\n\\n$btn-font-weight:             $font-weight-normal !default;\\n$btn-box-shadow:              inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\\n$btn-focus-width:             $input-btn-focus-width !default;\\n$btn-focus-box-shadow:        $input-btn-focus-box-shadow !default;\\n$btn-disabled-opacity:        .65 !default;\\n$btn-active-box-shadow:       inset 0 3px 5px rgba($black, .125) !default;\\n\\n$btn-link-disabled-color:     $gray-600 !default;\\n\\n$btn-block-spacing-y:         .5rem !default;\\n\\n// Allows for customizing button radius independently from global border radius\\n$btn-border-radius:           $border-radius !default;\\n$btn-border-radius-lg:        $border-radius-lg !default;\\n$btn-border-radius-sm:        $border-radius-sm !default;\\n\\n$btn-transition:              color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\\n\\n\\n// Forms\\n\\n$label-margin-bottom:                   .5rem !default;\\n\\n$input-padding-y:                       $input-btn-padding-y !default;\\n$input-padding-x:                       $input-btn-padding-x !default;\\n$input-font-family:                     $input-btn-font-family !default;\\n$input-font-size:                       $input-btn-font-size !default;\\n$input-font-weight:                     $font-weight-base !default;\\n$input-line-height:                     $input-btn-line-height !default;\\n\\n$input-padding-y-sm:                    $input-btn-padding-y-sm !default;\\n$input-padding-x-sm:                    $input-btn-padding-x-sm !default;\\n$input-font-size-sm:                    $input-btn-font-size-sm !default;\\n$input-line-height-sm:                  $input-btn-line-height-sm !default;\\n\\n$input-padding-y-lg:                    $input-btn-padding-y-lg !default;\\n$input-padding-x-lg:                    $input-btn-padding-x-lg !default;\\n$input-font-size-lg:                    $input-btn-font-size-lg !default;\\n$input-line-height-lg:                  $input-btn-line-height-lg !default;\\n\\n$input-bg:                              $white !default;\\n$input-disabled-bg:                     $gray-200 !default;\\n\\n$input-color:                           $gray-700 !default;\\n$input-border-color:                    $gray-400 !default;\\n$input-border-width:                    $input-btn-border-width !default;\\n$input-box-shadow:                      inset 0 1px 1px rgba($black, .075) !default;\\n\\n$input-border-radius:                   $border-radius !default;\\n$input-border-radius-lg:                $border-radius-lg !default;\\n$input-border-radius-sm:                $border-radius-sm !default;\\n\\n$input-focus-bg:                        $input-bg !default;\\n$input-focus-border-color:              lighten($component-active-bg, 25%) !default;\\n$input-focus-color:                     $input-color !default;\\n$input-focus-width:                     $input-btn-focus-width !default;\\n$input-focus-box-shadow:                $input-btn-focus-box-shadow !default;\\n\\n$input-placeholder-color:               $gray-600 !default;\\n$input-plaintext-color:                 $body-color !default;\\n\\n$input-height-border:                   $input-border-width * 2 !default;\\n\\n$input-height-inner:                    calc(#{$input-line-height * 1em} + #{$input-padding-y * 2}) !default;\\n$input-height-inner-half:               calc(#{$input-line-height * .5em} + #{$input-padding-y}) !default;\\n$input-height-inner-quarter:            calc(#{$input-line-height * .25em} + #{$input-padding-y / 2}) !default;\\n\\n$input-height:                          calc(#{$input-line-height * 1em} + #{$input-padding-y * 2} + #{$input-height-border}) !default;\\n$input-height-sm:                       calc(#{$input-line-height-sm * 1em} + #{$input-btn-padding-y-sm * 2} + #{$input-height-border}) !default;\\n$input-height-lg:                       calc(#{$input-line-height-lg * 1em} + #{$input-btn-padding-y-lg * 2} + #{$input-height-border}) !default;\\n\\n$input-transition:                      border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\\n\\n$form-text-margin-top:                  .25rem !default;\\n\\n$form-check-input-gutter:               1.25rem !default;\\n$form-check-input-margin-y:             .3rem !default;\\n$form-check-input-margin-x:             .25rem !default;\\n\\n$form-check-inline-margin-x:            .75rem !default;\\n$form-check-inline-input-margin-x:      .3125rem !default;\\n\\n$form-grid-gutter-width:                10px !default;\\n$form-group-margin-bottom:              1rem !default;\\n\\n$input-group-addon-color:               $input-color !default;\\n$input-group-addon-bg:                  $gray-200 !default;\\n$input-group-addon-border-color:        $input-border-color !default;\\n\\n$custom-forms-transition:               background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\\n\\n$custom-control-gutter:                 .5rem !default;\\n$custom-control-spacer-x:               1rem !default;\\n\\n$custom-control-indicator-size:         1rem !default;\\n$custom-control-indicator-bg:           $input-bg !default;\\n\\n$custom-control-indicator-bg-size:      50% 50% !default;\\n$custom-control-indicator-box-shadow:   $input-box-shadow !default;\\n$custom-control-indicator-border-color: $gray-500 !default;\\n$custom-control-indicator-border-width: $input-border-width !default;\\n\\n$custom-control-indicator-disabled-bg:          $input-disabled-bg !default;\\n$custom-control-label-disabled-color:           $gray-600 !default;\\n\\n$custom-control-indicator-checked-color:        $component-active-color !default;\\n$custom-control-indicator-checked-bg:           $component-active-bg !default;\\n$custom-control-indicator-checked-disabled-bg:  rgba(theme-color(\\\"primary\\\"), .5) !default;\\n$custom-control-indicator-checked-box-shadow:   none !default;\\n$custom-control-indicator-checked-border-color: $custom-control-indicator-checked-bg !default;\\n\\n$custom-control-indicator-focus-box-shadow:     $input-focus-box-shadow !default;\\n$custom-control-indicator-focus-border-color:   $input-focus-border-color !default;\\n\\n$custom-control-indicator-active-color:         $component-active-color !default;\\n$custom-control-indicator-active-bg:            lighten($component-active-bg, 35%) !default;\\n$custom-control-indicator-active-box-shadow:    none !default;\\n$custom-control-indicator-active-border-color:  $custom-control-indicator-active-bg !default;\\n\\n$custom-checkbox-indicator-border-radius:       $border-radius !default;\\n$custom-checkbox-indicator-icon-checked:        str-replace(url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='#{$custom-control-indicator-checked-color}' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e\\\"), \\\"#\\\", \\\"%23\\\") !default;\\n\\n$custom-checkbox-indicator-indeterminate-bg:           $component-active-bg !default;\\n$custom-checkbox-indicator-indeterminate-color:        $custom-control-indicator-checked-color !default;\\n$custom-checkbox-indicator-icon-indeterminate:         str-replace(url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='#{$custom-checkbox-indicator-indeterminate-color}' d='M0 2h4'/%3e%3c/svg%3e\\\"), \\\"#\\\", \\\"%23\\\") !default;\\n$custom-checkbox-indicator-indeterminate-box-shadow:   none !default;\\n$custom-checkbox-indicator-indeterminate-border-color: $custom-checkbox-indicator-indeterminate-bg !default;\\n\\n$custom-radio-indicator-border-radius:          50% !default;\\n$custom-radio-indicator-icon-checked:           str-replace(url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='#{$custom-control-indicator-checked-color}'/%3e%3c/svg%3e\\\"), \\\"#\\\", \\\"%23\\\") !default;\\n\\n$custom-switch-width:                           $custom-control-indicator-size * 1.75 !default;\\n$custom-switch-indicator-border-radius:         $custom-control-indicator-size / 2 !default;\\n$custom-switch-indicator-size:                  calc(#{$custom-control-indicator-size} - #{$custom-control-indicator-border-width * 4}) !default;\\n\\n$custom-select-padding-y:           $input-padding-y !default;\\n$custom-select-padding-x:           $input-padding-x !default;\\n$custom-select-font-family:         $input-font-family !default;\\n$custom-select-font-size:           $input-font-size !default;\\n$custom-select-height:              $input-height !default;\\n$custom-select-indicator-padding:   1rem !default; // Extra padding to account for the presence of the background-image based indicator\\n$custom-select-font-weight:         $input-font-weight !default;\\n$custom-select-line-height:         $input-line-height !default;\\n$custom-select-color:               $input-color !default;\\n$custom-select-disabled-color:      $gray-600 !default;\\n$custom-select-bg:                  $input-bg !default;\\n$custom-select-disabled-bg:         $gray-200 !default;\\n$custom-select-bg-size:             8px 10px !default; // In pixels because image dimensions\\n$custom-select-indicator-color:     $gray-800 !default;\\n$custom-select-indicator:           str-replace(url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='#{$custom-select-indicator-color}' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\\\"), \\\"#\\\", \\\"%23\\\") !default;\\n$custom-select-background:          $custom-select-indicator no-repeat right $custom-select-padding-x center / $custom-select-bg-size !default; // Used so we can have multiple background elements (e.g., arrow and feedback icon)\\n\\n$custom-select-feedback-icon-padding-right: calc((1em + #{2 * $custom-select-padding-y}) * 3 / 4 + #{$custom-select-padding-x + $custom-select-indicator-padding}) !default;\\n$custom-select-feedback-icon-position:      center right ($custom-select-padding-x + $custom-select-indicator-padding) !default;\\n$custom-select-feedback-icon-size:          $input-height-inner-half $input-height-inner-half !default;\\n\\n$custom-select-border-width:        $input-border-width !default;\\n$custom-select-border-color:        $input-border-color !default;\\n$custom-select-border-radius:       $border-radius !default;\\n$custom-select-box-shadow:          inset 0 1px 2px rgba($black, .075) !default;\\n\\n$custom-select-focus-border-color:  $input-focus-border-color !default;\\n$custom-select-focus-width:         $input-focus-width !default;\\n$custom-select-focus-box-shadow:    0 0 0 $custom-select-focus-width $input-btn-focus-color !default;\\n\\n$custom-select-padding-y-sm:        $input-padding-y-sm !default;\\n$custom-select-padding-x-sm:        $input-padding-x-sm !default;\\n$custom-select-font-size-sm:        $input-font-size-sm !default;\\n$custom-select-height-sm:           $input-height-sm !default;\\n\\n$custom-select-padding-y-lg:        $input-padding-y-lg !default;\\n$custom-select-padding-x-lg:        $input-padding-x-lg !default;\\n$custom-select-font-size-lg:        $input-font-size-lg !default;\\n$custom-select-height-lg:           $input-height-lg !default;\\n\\n$custom-range-track-width:          100% !default;\\n$custom-range-track-height:         .5rem !default;\\n$custom-range-track-cursor:         pointer !default;\\n$custom-range-track-bg:             $gray-300 !default;\\n$custom-range-track-border-radius:  1rem !default;\\n$custom-range-track-box-shadow:     inset 0 .25rem .25rem rgba($black, .1) !default;\\n\\n$custom-range-thumb-width:                   1rem !default;\\n$custom-range-thumb-height:                  $custom-range-thumb-width !default;\\n$custom-range-thumb-bg:                      $component-active-bg !default;\\n$custom-range-thumb-border:                  0 !default;\\n$custom-range-thumb-border-radius:           1rem !default;\\n$custom-range-thumb-box-shadow:              0 .1rem .25rem rgba($black, .1) !default;\\n$custom-range-thumb-focus-box-shadow:        0 0 0 1px $body-bg, $input-focus-box-shadow !default;\\n$custom-range-thumb-focus-box-shadow-width:  $input-focus-width !default; // For focus box shadow issue in IE/Edge\\n$custom-range-thumb-active-bg:               lighten($component-active-bg, 35%) !default;\\n$custom-range-thumb-disabled-bg:             $gray-500 !default;\\n\\n$custom-file-height:                $input-height !default;\\n$custom-file-height-inner:          $input-height-inner !default;\\n$custom-file-focus-border-color:    $input-focus-border-color !default;\\n$custom-file-focus-box-shadow:      $input-focus-box-shadow !default;\\n$custom-file-disabled-bg:           $input-disabled-bg !default;\\n\\n$custom-file-padding-y:             $input-padding-y !default;\\n$custom-file-padding-x:             $input-padding-x !default;\\n$custom-file-line-height:           $input-line-height !default;\\n$custom-file-font-family:           $input-font-family !default;\\n$custom-file-font-weight:           $input-font-weight !default;\\n$custom-file-color:                 $input-color !default;\\n$custom-file-bg:                    $input-bg !default;\\n$custom-file-border-width:          $input-border-width !default;\\n$custom-file-border-color:          $input-border-color !default;\\n$custom-file-border-radius:         $input-border-radius !default;\\n$custom-file-box-shadow:            $input-box-shadow !default;\\n$custom-file-button-color:          $custom-file-color !default;\\n$custom-file-button-bg:             $input-group-addon-bg !default;\\n$custom-file-text: (\\n  en: \\\"Browse\\\"\\n) !default;\\n\\n\\n// Form validation\\n\\n$form-feedback-margin-top:          $form-text-margin-top !default;\\n$form-feedback-font-size:           $small-font-size !default;\\n$form-feedback-valid-color:         theme-color(\\\"success\\\") !default;\\n$form-feedback-invalid-color:       theme-color(\\\"danger\\\") !default;\\n\\n$form-feedback-icon-valid-color:    $form-feedback-valid-color !default;\\n$form-feedback-icon-valid:          str-replace(url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='#{$form-feedback-icon-valid-color}' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\\\"), \\\"#\\\", \\\"%23\\\") !default;\\n$form-feedback-icon-invalid-color:  $form-feedback-invalid-color !default;\\n$form-feedback-icon-invalid:        str-replace(url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$form-feedback-icon-invalid-color}' viewBox='-2 -2 7 7'%3e%3cpath stroke='#{$form-feedback-icon-invalid-color}' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\\\"), \\\"#\\\", \\\"%23\\\") !default;\\n\\n$form-validation-states: () !default;\\n// stylelint-disable-next-line scss/dollar-variable-default\\n$form-validation-states: map-merge(\\n  (\\n    \\\"valid\\\": (\\n      \\\"color\\\": $form-feedback-valid-color,\\n      \\\"icon\\\": $form-feedback-icon-valid\\n    ),\\n    \\\"invalid\\\": (\\n      \\\"color\\\": $form-feedback-invalid-color,\\n      \\\"icon\\\": $form-feedback-icon-invalid\\n    ),\\n  ),\\n  $form-validation-states\\n);\\n\\n// Z-index master list\\n//\\n// Warning: Avoid customizing these values. They're used for a bird's eye view\\n// of components dependent on the z-axis and are designed to all work together.\\n\\n$zindex-dropdown:                   1000 !default;\\n$zindex-sticky:                     1020 !default;\\n$zindex-fixed:                      1030 !default;\\n$zindex-modal-backdrop:             1040 !default;\\n$zindex-modal:                      1050 !default;\\n$zindex-popover:                    1060 !default;\\n$zindex-tooltip:                    1070 !default;\\n\\n\\n// Navs\\n\\n$nav-link-padding-y:                .5rem !default;\\n$nav-link-padding-x:                1rem !default;\\n$nav-link-disabled-color:           $gray-600 !default;\\n\\n$nav-tabs-border-color:             $gray-300 !default;\\n$nav-tabs-border-width:             $border-width !default;\\n$nav-tabs-border-radius:            $border-radius !default;\\n$nav-tabs-link-hover-border-color:  $gray-200 $gray-200 $nav-tabs-border-color !default;\\n$nav-tabs-link-active-color:        $gray-700 !default;\\n$nav-tabs-link-active-bg:           $body-bg !default;\\n$nav-tabs-link-active-border-color: $gray-300 $gray-300 $nav-tabs-link-active-bg !default;\\n\\n$nav-pills-border-radius:           $border-radius !default;\\n$nav-pills-link-active-color:       $component-active-color !default;\\n$nav-pills-link-active-bg:          $component-active-bg !default;\\n\\n$nav-divider-color:                 $gray-200 !default;\\n$nav-divider-margin-y:              $spacer / 2 !default;\\n\\n\\n// Navbar\\n\\n$navbar-padding-y:                  $spacer / 2 !default;\\n$navbar-padding-x:                  $spacer !default;\\n\\n$navbar-nav-link-padding-x:         .5rem !default;\\n\\n$navbar-brand-font-size:            $font-size-lg !default;\\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\\n$nav-link-height:                   $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\\n$navbar-brand-height:               $navbar-brand-font-size * $line-height-base !default;\\n$navbar-brand-padding-y:            ($nav-link-height - $navbar-brand-height) / 2 !default;\\n\\n$navbar-toggler-padding-y:          .25rem !default;\\n$navbar-toggler-padding-x:          .75rem !default;\\n$navbar-toggler-font-size:          $font-size-lg !default;\\n$navbar-toggler-border-radius:      $btn-border-radius !default;\\n\\n$navbar-dark-color:                 rgba($white, .5) !default;\\n$navbar-dark-hover-color:           rgba($white, .75) !default;\\n$navbar-dark-active-color:          $white !default;\\n$navbar-dark-disabled-color:        rgba($white, .25) !default;\\n$navbar-dark-toggler-icon-bg:       str-replace(url(\\\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='#{$navbar-dark-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\\\"), \\\"#\\\", \\\"%23\\\") !default;\\n$navbar-dark-toggler-border-color:  rgba($white, .1) !default;\\n\\n$navbar-light-color:                rgba($black, .5) !default;\\n$navbar-light-hover-color:          rgba($black, .7) !default;\\n$navbar-light-active-color:         rgba($black, .9) !default;\\n$navbar-light-disabled-color:       rgba($black, .3) !default;\\n$navbar-light-toggler-icon-bg:      str-replace(url(\\\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='#{$navbar-light-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\\\"), \\\"#\\\", \\\"%23\\\") !default;\\n$navbar-light-toggler-border-color: rgba($black, .1) !default;\\n\\n$navbar-light-brand-color:                $navbar-light-active-color !default;\\n$navbar-light-brand-hover-color:          $navbar-light-active-color !default;\\n$navbar-dark-brand-color:                 $navbar-dark-active-color !default;\\n$navbar-dark-brand-hover-color:           $navbar-dark-active-color !default;\\n\\n\\n// Dropdowns\\n//\\n// Dropdown menu container and contents.\\n\\n$dropdown-min-width:                10rem !default;\\n$dropdown-padding-y:                .5rem !default;\\n$dropdown-spacer:                   .125rem !default;\\n$dropdown-font-size:                $font-size-base !default;\\n$dropdown-color:                    $body-color !default;\\n$dropdown-bg:                       $white !default;\\n$dropdown-border-color:             rgba($black, .15) !default;\\n$dropdown-border-radius:            $border-radius !default;\\n$dropdown-border-width:             $border-width !default;\\n$dropdown-inner-border-radius:      calc(#{$dropdown-border-radius} - #{$dropdown-border-width}) !default;\\n$dropdown-divider-bg:               $gray-200 !default;\\n$dropdown-divider-margin-y:         $nav-divider-margin-y !default;\\n$dropdown-box-shadow:               0 .5rem 1rem rgba($black, .175) !default;\\n\\n$dropdown-link-color:               $gray-900 !default;\\n$dropdown-link-hover-color:         darken($gray-900, 5%) !default;\\n$dropdown-link-hover-bg:            $gray-100 !default;\\n\\n$dropdown-link-active-color:        $component-active-color !default;\\n$dropdown-link-active-bg:           $component-active-bg !default;\\n\\n$dropdown-link-disabled-color:      $gray-600 !default;\\n\\n$dropdown-item-padding-y:           .25rem !default;\\n$dropdown-item-padding-x:           1.5rem !default;\\n\\n$dropdown-header-color:             $gray-600 !default;\\n\\n\\n// Pagination\\n\\n$pagination-padding-y:              .5rem !default;\\n$pagination-padding-x:              .75rem !default;\\n$pagination-padding-y-sm:           .25rem !default;\\n$pagination-padding-x-sm:           .5rem !default;\\n$pagination-padding-y-lg:           .75rem !default;\\n$pagination-padding-x-lg:           1.5rem !default;\\n$pagination-line-height:            1.25 !default;\\n\\n$pagination-color:                  $link-color !default;\\n$pagination-bg:                     $white !default;\\n$pagination-border-width:           $border-width !default;\\n$pagination-border-color:           $gray-300 !default;\\n\\n$pagination-focus-box-shadow:       $input-btn-focus-box-shadow !default;\\n$pagination-focus-outline:          0 !default;\\n\\n$pagination-hover-color:            $link-hover-color !default;\\n$pagination-hover-bg:               $gray-200 !default;\\n$pagination-hover-border-color:     $gray-300 !default;\\n\\n$pagination-active-color:           $component-active-color !default;\\n$pagination-active-bg:              $component-active-bg !default;\\n$pagination-active-border-color:    $pagination-active-bg !default;\\n\\n$pagination-disabled-color:         $gray-600 !default;\\n$pagination-disabled-bg:            $white !default;\\n$pagination-disabled-border-color:  $gray-300 !default;\\n\\n\\n// Jumbotron\\n\\n$jumbotron-padding:                 2rem !default;\\n$jumbotron-color:                   null !default;\\n$jumbotron-bg:                      $gray-200 !default;\\n\\n\\n// Cards\\n\\n$card-spacer-y:                     .75rem !default;\\n$card-spacer-x:                     1.25rem !default;\\n$card-border-width:                 $border-width !default;\\n$card-border-radius:                $border-radius !default;\\n$card-border-color:                 rgba($black, .125) !default;\\n$card-inner-border-radius:          calc(#{$card-border-radius} - #{$card-border-width}) !default;\\n$card-cap-bg:                       rgba($black, .03) !default;\\n$card-cap-color:                    null !default;\\n$card-color:                        null !default;\\n$card-bg:                           $white !default;\\n\\n$card-img-overlay-padding:          1.25rem !default;\\n\\n$card-group-margin:                 $grid-gutter-width / 2 !default;\\n$card-deck-margin:                  $card-group-margin !default;\\n\\n$card-columns-count:                3 !default;\\n$card-columns-gap:                  1.25rem !default;\\n$card-columns-margin:               $card-spacer-y !default;\\n\\n\\n// Tooltips\\n\\n$tooltip-font-size:                 $font-size-sm !default;\\n$tooltip-max-width:                 200px !default;\\n$tooltip-color:                     $white !default;\\n$tooltip-bg:                        $black !default;\\n$tooltip-border-radius:             $border-radius !default;\\n$tooltip-opacity:                   .9 !default;\\n$tooltip-padding-y:                 .25rem !default;\\n$tooltip-padding-x:                 .5rem !default;\\n$tooltip-margin:                    0 !default;\\n\\n$tooltip-arrow-width:               .8rem !default;\\n$tooltip-arrow-height:              .4rem !default;\\n$tooltip-arrow-color:               $tooltip-bg !default;\\n\\n// Form tooltips must come after regular tooltips\\n$form-feedback-tooltip-padding-y:     $tooltip-padding-y !default;\\n$form-feedback-tooltip-padding-x:     $tooltip-padding-x !default;\\n$form-feedback-tooltip-font-size:     $tooltip-font-size !default;\\n$form-feedback-tooltip-line-height:   $line-height-base !default;\\n$form-feedback-tooltip-opacity:       $tooltip-opacity !default;\\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\\n\\n\\n// Popovers\\n\\n$popover-font-size:                 $font-size-sm !default;\\n$popover-bg:                        $white !default;\\n$popover-max-width:                 276px !default;\\n$popover-border-width:              $border-width !default;\\n$popover-border-color:              rgba($black, .2) !default;\\n$popover-border-radius:             $border-radius-lg !default;\\n$popover-box-shadow:                0 .25rem .5rem rgba($black, .2) !default;\\n\\n$popover-header-bg:                 darken($popover-bg, 3%) !default;\\n$popover-header-color:              $headings-color !default;\\n$popover-header-padding-y:          .5rem !default;\\n$popover-header-padding-x:          .75rem !default;\\n\\n$popover-body-color:                $body-color !default;\\n$popover-body-padding-y:            $popover-header-padding-y !default;\\n$popover-body-padding-x:            $popover-header-padding-x !default;\\n\\n$popover-arrow-width:               1rem !default;\\n$popover-arrow-height:              .5rem !default;\\n$popover-arrow-color:               $popover-bg !default;\\n\\n$popover-arrow-outer-color:         fade-in($popover-border-color, .05) !default;\\n\\n\\n// Toasts\\n\\n$toast-max-width:                   350px !default;\\n$toast-padding-x:                   .75rem !default;\\n$toast-padding-y:                   .25rem !default;\\n$toast-font-size:                   .875rem !default;\\n$toast-color:                       null !default;\\n$toast-background-color:            rgba($white, .85) !default;\\n$toast-border-width:                1px !default;\\n$toast-border-color:                rgba(0, 0, 0, .1) !default;\\n$toast-border-radius:               .25rem !default;\\n$toast-box-shadow:                  0 .25rem .75rem rgba($black, .1) !default;\\n\\n$toast-header-color:                $gray-600 !default;\\n$toast-header-background-color:     rgba($white, .85) !default;\\n$toast-header-border-color:         rgba(0, 0, 0, .05) !default;\\n\\n\\n// Badges\\n\\n$badge-font-size:                   75% !default;\\n$badge-font-weight:                 $font-weight-bold !default;\\n$badge-padding-y:                   .25em !default;\\n$badge-padding-x:                   .4em !default;\\n$badge-border-radius:               $border-radius !default;\\n\\n$badge-transition:                  $btn-transition !default;\\n$badge-focus-width:                 $input-btn-focus-width !default;\\n\\n$badge-pill-padding-x:              .6em !default;\\n// Use a higher than normal value to ensure completely rounded edges when\\n// customizing padding or font-size on labels.\\n$badge-pill-border-radius:          10rem !default;\\n\\n\\n// Modals\\n\\n// Padding applied to the modal body\\n$modal-inner-padding:               1rem !default;\\n\\n$modal-dialog-margin:               .5rem !default;\\n$modal-dialog-margin-y-sm-up:       1.75rem !default;\\n\\n$modal-title-line-height:           $line-height-base !default;\\n\\n$modal-content-color:               null !default;\\n$modal-content-bg:                  $white !default;\\n$modal-content-border-color:        rgba($black, .2) !default;\\n$modal-content-border-width:        $border-width !default;\\n$modal-content-border-radius:       $border-radius-lg !default;\\n$modal-content-box-shadow-xs:       0 .25rem .5rem rgba($black, .5) !default;\\n$modal-content-box-shadow-sm-up:    0 .5rem 1rem rgba($black, .5) !default;\\n\\n$modal-backdrop-bg:                 $black !default;\\n$modal-backdrop-opacity:            .5 !default;\\n$modal-header-border-color:         $border-color !default;\\n$modal-footer-border-color:         $modal-header-border-color !default;\\n$modal-header-border-width:         $modal-content-border-width !default;\\n$modal-footer-border-width:         $modal-header-border-width !default;\\n$modal-header-padding-y:            1rem !default;\\n$modal-header-padding-x:            1rem !default;\\n$modal-header-padding:              $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\\n\\n$modal-xl:                          1140px !default;\\n$modal-lg:                          800px !default;\\n$modal-md:                          500px !default;\\n$modal-sm:                          300px !default;\\n\\n$modal-fade-transform:              translate(0, -50px) !default;\\n$modal-show-transform:              none !default;\\n$modal-transition:                  transform .3s ease-out !default;\\n\\n\\n// Alerts\\n//\\n// Define alert colors, border radius, and padding.\\n\\n$alert-padding-y:                   .75rem !default;\\n$alert-padding-x:                   1.25rem !default;\\n$alert-margin-bottom:               1rem !default;\\n$alert-border-radius:               $border-radius !default;\\n$alert-link-font-weight:            $font-weight-bold !default;\\n$alert-border-width:                $border-width !default;\\n\\n$alert-bg-level:                    -10 !default;\\n$alert-border-level:                -9 !default;\\n$alert-color-level:                 6 !default;\\n\\n\\n// Progress bars\\n\\n$progress-height:                   1rem !default;\\n$progress-font-size:                $font-size-base * .75 !default;\\n$progress-bg:                       $gray-200 !default;\\n$progress-border-radius:            $border-radius !default;\\n$progress-box-shadow:               inset 0 .1rem .1rem rgba($black, .1) !default;\\n$progress-bar-color:                $white !default;\\n$progress-bar-bg:                   theme-color(\\\"primary\\\") !default;\\n$progress-bar-animation-timing:     1s linear infinite !default;\\n$progress-bar-transition:           width .6s ease !default;\\n\\n\\n// List group\\n\\n$list-group-color:                  null !default;\\n$list-group-bg:                     $white !default;\\n$list-group-border-color:           rgba($black, .125) !default;\\n$list-group-border-width:           $border-width !default;\\n$list-group-border-radius:          $border-radius !default;\\n\\n$list-group-item-padding-y:         .75rem !default;\\n$list-group-item-padding-x:         1.25rem !default;\\n\\n$list-group-hover-bg:               $gray-100 !default;\\n$list-group-active-color:           $component-active-color !default;\\n$list-group-active-bg:              $component-active-bg !default;\\n$list-group-active-border-color:    $list-group-active-bg !default;\\n\\n$list-group-disabled-color:         $gray-600 !default;\\n$list-group-disabled-bg:            $list-group-bg !default;\\n\\n$list-group-action-color:           $gray-700 !default;\\n$list-group-action-hover-color:     $list-group-action-color !default;\\n\\n$list-group-action-active-color:    $body-color !default;\\n$list-group-action-active-bg:       $gray-200 !default;\\n\\n\\n// Image thumbnails\\n\\n$thumbnail-padding:                 .25rem !default;\\n$thumbnail-bg:                      $body-bg !default;\\n$thumbnail-border-width:            $border-width !default;\\n$thumbnail-border-color:            $gray-300 !default;\\n$thumbnail-border-radius:           $border-radius !default;\\n$thumbnail-box-shadow:              0 1px 2px rgba($black, .075) !default;\\n\\n\\n// Figures\\n\\n$figure-caption-font-size:          90% !default;\\n$figure-caption-color:              $gray-600 !default;\\n\\n\\n// Breadcrumbs\\n\\n$breadcrumb-padding-y:              .75rem !default;\\n$breadcrumb-padding-x:              1rem !default;\\n$breadcrumb-item-padding:           .5rem !default;\\n\\n$breadcrumb-margin-bottom:          1rem !default;\\n\\n$breadcrumb-bg:                     $gray-200 !default;\\n$breadcrumb-divider-color:          $gray-600 !default;\\n$breadcrumb-active-color:           $gray-600 !default;\\n$breadcrumb-divider:                quote(\\\"/\\\") !default;\\n\\n$breadcrumb-border-radius:          $border-radius !default;\\n\\n\\n// Carousel\\n\\n$carousel-control-color:             $white !default;\\n$carousel-control-width:             15% !default;\\n$carousel-control-opacity:           .5 !default;\\n$carousel-control-hover-opacity:     .9 !default;\\n$carousel-control-transition:        opacity .15s ease !default;\\n\\n$carousel-indicator-width:           30px !default;\\n$carousel-indicator-height:          3px !default;\\n$carousel-indicator-hit-area-height: 10px !default;\\n$carousel-indicator-spacer:          3px !default;\\n$carousel-indicator-active-bg:       $white !default;\\n$carousel-indicator-transition:      opacity .6s ease !default;\\n\\n$carousel-caption-width:             70% !default;\\n$carousel-caption-color:             $white !default;\\n\\n$carousel-control-icon-width:        20px !default;\\n\\n$carousel-control-prev-icon-bg:      str-replace(url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\\\"), \\\"#\\\", \\\"%23\\\") !default;\\n$carousel-control-next-icon-bg:      str-replace(url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\\\"), \\\"#\\\", \\\"%23\\\") !default;\\n\\n$carousel-transition-duration:       .6s !default;\\n$carousel-transition:                transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\\n\\n\\n// Spinners\\n\\n$spinner-width:         2rem !default;\\n$spinner-height:        $spinner-width !default;\\n$spinner-border-width:  .25em !default;\\n\\n$spinner-width-sm:        1rem !default;\\n$spinner-height-sm:       $spinner-width-sm !default;\\n$spinner-border-width-sm: .2em !default;\\n\\n\\n// Close\\n\\n$close-font-size:                   $font-size-base * 1.5 !default;\\n$close-font-weight:                 $font-weight-bold !default;\\n$close-color:                       $black !default;\\n$close-text-shadow:                 0 1px 0 $white !default;\\n\\n\\n// Code\\n\\n$code-font-size:                    87.5% !default;\\n$code-color:                        $pink !default;\\n\\n$kbd-padding-y:                     .2rem !default;\\n$kbd-padding-x:                     .4rem !default;\\n$kbd-font-size:                     $code-font-size !default;\\n$kbd-color:                         $white !default;\\n$kbd-bg:                            $gray-900 !default;\\n\\n$pre-color:                         $gray-900 !default;\\n$pre-scrollable-max-height:         340px !default;\\n\\n\\n// Utilities\\n\\n$displays: none, inline, inline-block, block, table, table-row, table-cell, flex, inline-flex !default;\\n$overflows: auto, hidden !default;\\n$positions: static, relative, absolute, fixed, sticky !default;\\n\\n\\n// Printing\\n\\n$print-page-size:                   a3 !default;\\n$print-body-min-width:              map-get($grid-breakpoints, \\\"lg\\\") !default;\\n\",\"// stylelint-disable property-blacklist, scss/dollar-variable-default\\n\\n// SCSS RFS mixin\\n//\\n// Automated font-resizing\\n//\\n// See https://github.com/twbs/rfs\\n\\n// Configuration\\n\\n// Base font size\\n$rfs-base-font-size: 1.25rem !default;\\n$rfs-font-size-unit: rem !default;\\n\\n// Breakpoint at where font-size starts decreasing if screen width is smaller\\n$rfs-breakpoint: 1200px !default;\\n$rfs-breakpoint-unit: px !default;\\n\\n// Resize font-size based on screen height and width\\n$rfs-two-dimensional: false !default;\\n\\n// Factor of decrease\\n$rfs-factor: 10 !default;\\n\\n@if type-of($rfs-factor) != \\\"number\\\" or $rfs-factor <= 1 {\\n  @error \\\"`#{$rfs-factor}` is not a valid  $rfs-factor, it must be greater than 1.\\\";\\n}\\n\\n// Generate enable or disable classes. Possibilities: false, \\\"enable\\\" or \\\"disable\\\"\\n$rfs-class: false !default;\\n\\n// 1 rem = $rfs-rem-value px\\n$rfs-rem-value: 16 !default;\\n\\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\\n$rfs-safari-iframe-resize-bug-fix: false !default;\\n\\n// Disable RFS by setting $enable-responsive-font-sizes to false\\n$enable-responsive-font-sizes: true !default;\\n\\n// Cache $rfs-base-font-size unit\\n$rfs-base-font-size-unit: unit($rfs-base-font-size);\\n\\n// Remove px-unit from $rfs-base-font-size for calculations\\n@if $rfs-base-font-size-unit == \\\"px\\\" {\\n  $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1);\\n}\\n@else if $rfs-base-font-size-unit == \\\"rem\\\" {\\n  $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1 / $rfs-rem-value);\\n}\\n\\n// Cache $rfs-breakpoint unit to prevent multiple calls\\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\\n\\n// Remove unit from $rfs-breakpoint for calculations\\n@if $rfs-breakpoint-unit-cache == \\\"px\\\" {\\n  $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1);\\n}\\n@else if $rfs-breakpoint-unit-cache == \\\"rem\\\" or $rfs-breakpoint-unit-cache == \\\"em\\\" {\\n  $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1 / $rfs-rem-value);\\n}\\n\\n// Responsive font-size mixin\\n@mixin rfs($fs, $important: false) {\\n  // Cache $fs unit\\n  $fs-unit: if(type-of($fs) == \\\"number\\\", unit($fs), false);\\n\\n  // Add !important suffix if needed\\n  $rfs-suffix: if($important, \\\" !important\\\", \\\"\\\");\\n\\n  // If $fs isn't a number (like inherit) or $fs has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\\n  @if not $fs-unit or $fs-unit != \\\"\\\" and $fs-unit != \\\"px\\\" and $fs-unit != \\\"rem\\\" or $fs == 0 {\\n    font-size: #{$fs}#{$rfs-suffix};\\n  }\\n  @else {\\n    // Variables for storing static and fluid rescaling\\n    $rfs-static: null;\\n    $rfs-fluid: null;\\n\\n    // Remove px-unit from $fs for calculations\\n    @if $fs-unit == \\\"px\\\" {\\n      $fs: $fs / ($fs * 0 + 1);\\n    }\\n    @else if $fs-unit == \\\"rem\\\" {\\n      $fs: $fs / ($fs * 0 + 1 / $rfs-rem-value);\\n    }\\n\\n    // Set default font-size\\n    @if $rfs-font-size-unit == rem {\\n      $rfs-static: #{$fs / $rfs-rem-value}rem#{$rfs-suffix};\\n    }\\n    @else if $rfs-font-size-unit == px {\\n      $rfs-static: #{$fs}px#{$rfs-suffix};\\n    }\\n    @else {\\n      @error \\\"`#{$rfs-font-size-unit}` is not a valid unit for $rfs-font-size-unit. Use `px` or `rem`.\\\";\\n    }\\n\\n    // Only add media query if font-size is bigger as the minimum font-size\\n    // If $rfs-factor == 1, no rescaling will take place\\n    @if $fs > $rfs-base-font-size and $enable-responsive-font-sizes {\\n      $min-width: null;\\n      $variable-unit: null;\\n\\n      // Calculate minimum font-size for given font-size\\n      $fs-min: $rfs-base-font-size + ($fs - $rfs-base-font-size) / $rfs-factor;\\n\\n      // Calculate difference between given font-size and minimum font-size for given font-size\\n      $fs-diff: $fs - $fs-min;\\n\\n      // Base font-size formatting\\n      // No need to check if the unit is valid, because we did that before\\n      $min-width: if($rfs-font-size-unit == rem, #{$fs-min / $rfs-rem-value}rem, #{$fs-min}px);\\n\\n      // If two-dimensional, use smallest of screen width and height\\n      $variable-unit: if($rfs-two-dimensional, vmin, vw);\\n\\n      // Calculate the variable width between 0 and $rfs-breakpoint\\n      $variable-width: #{$fs-diff * 100 / $rfs-breakpoint}#{$variable-unit};\\n\\n      // Set the calculated font-size.\\n      $rfs-fluid: calc(#{$min-width} + #{$variable-width}) #{$rfs-suffix};\\n    }\\n\\n    // Rendering\\n    @if $rfs-fluid == null {\\n      // Only render static font-size if no fluid font-size is available\\n      font-size: $rfs-static;\\n    }\\n    @else {\\n      $mq-value: null;\\n\\n      // RFS breakpoint formatting\\n      @if $rfs-breakpoint-unit == em or $rfs-breakpoint-unit == rem {\\n        $mq-value: #{$rfs-breakpoint / $rfs-rem-value}#{$rfs-breakpoint-unit};\\n      }\\n      @else if $rfs-breakpoint-unit == px {\\n        $mq-value: #{$rfs-breakpoint}px;\\n      }\\n      @else {\\n        @error \\\"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\\\";\\n      }\\n\\n      @if $rfs-class == \\\"disable\\\" {\\n        // Adding an extra class increases specificity,\\n        // which prevents the media query to override the font size\\n        &,\\n        .disable-responsive-font-size &,\\n        &.disable-responsive-font-size {\\n          font-size: $rfs-static;\\n        }\\n      }\\n      @else {\\n        font-size: $rfs-static;\\n      }\\n\\n      @if $rfs-two-dimensional {\\n        @media (max-width: #{$mq-value}), (max-height: #{$mq-value}) {\\n          @if $rfs-class == \\\"enable\\\" {\\n            .enable-responsive-font-size &,\\n            &.enable-responsive-font-size {\\n              font-size: $rfs-fluid;\\n            }\\n          }\\n          @else {\\n            font-size: $rfs-fluid;\\n          }\\n\\n          @if $rfs-safari-iframe-resize-bug-fix {\\n            // stylelint-disable-next-line length-zero-no-unit\\n            min-width: 0vw;\\n          }\\n        }\\n      }\\n      @else {\\n        @media (max-width: #{$mq-value}) {\\n          @if $rfs-class == \\\"enable\\\" {\\n            .enable-responsive-font-size &,\\n            &.enable-responsive-font-size {\\n              font-size: $rfs-fluid;\\n            }\\n          }\\n          @else {\\n            font-size: $rfs-fluid;\\n          }\\n\\n          @if $rfs-safari-iframe-resize-bug-fix {\\n            // stylelint-disable-next-line length-zero-no-unit\\n            min-width: 0vw;\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\n\\n// The font-size & responsive-font-size mixin uses RFS to rescale font sizes\\n@mixin font-size($fs, $important: false) {\\n  @include rfs($fs, $important);\\n}\\n\\n@mixin responsive-font-size($fs, $important: false) {\\n  @include rfs($fs, $important);\\n}\\n\",\"// Hover mixin and `$enable-hover-media-query` are deprecated.\\n//\\n// Originally added during our alphas and maintained during betas, this mixin was\\n// designed to prevent `:hover` stickiness on iOS-an issue where hover styles\\n// would persist after initial touch.\\n//\\n// For backward compatibility, we've kept these mixins and updated them to\\n// always return their regular pseudo-classes instead of a shimmed media query.\\n//\\n// Issue: https://github.com/twbs/bootstrap/issues/25195\\n\\n@mixin hover {\\n  &:hover { @content; }\\n}\\n\\n@mixin hover-focus {\\n  &:hover,\\n  &:focus {\\n    @content;\\n  }\\n}\\n\\n@mixin plain-hover-focus {\\n  &,\\n  &:hover,\\n  &:focus {\\n    @content;\\n  }\\n}\\n\\n@mixin hover-focus-active {\\n  &:hover,\\n  &:focus,\\n  &:active {\\n    @content;\\n  }\\n}\\n\",\"// stylelint-disable declaration-no-important, selector-list-comma-newline-after\\n\\n//\\n// Headings\\n//\\n\\nh1, h2, h3, h4, h5, h6,\\n.h1, .h2, .h3, .h4, .h5, .h6 {\\n  margin-bottom: $headings-margin-bottom;\\n  font-family: $headings-font-family;\\n  font-weight: $headings-font-weight;\\n  line-height: $headings-line-height;\\n  color: $headings-color;\\n}\\n\\nh1, .h1 { @include font-size($h1-font-size); }\\nh2, .h2 { @include font-size($h2-font-size); }\\nh3, .h3 { @include font-size($h3-font-size); }\\nh4, .h4 { @include font-size($h4-font-size); }\\nh5, .h5 { @include font-size($h5-font-size); }\\nh6, .h6 { @include font-size($h6-font-size); }\\n\\n.lead {\\n  @include font-size($lead-font-size);\\n  font-weight: $lead-font-weight;\\n}\\n\\n// Type display classes\\n.display-1 {\\n  @include font-size($display1-size);\\n  font-weight: $display1-weight;\\n  line-height: $display-line-height;\\n}\\n.display-2 {\\n  @include font-size($display2-size);\\n  font-weight: $display2-weight;\\n  line-height: $display-line-height;\\n}\\n.display-3 {\\n  @include font-size($display3-size);\\n  font-weight: $display3-weight;\\n  line-height: $display-line-height;\\n}\\n.display-4 {\\n  @include font-size($display4-size);\\n  font-weight: $display4-weight;\\n  line-height: $display-line-height;\\n}\\n\\n\\n//\\n// Horizontal rules\\n//\\n\\nhr {\\n  margin-top: $hr-margin-y;\\n  margin-bottom: $hr-margin-y;\\n  border: 0;\\n  border-top: $hr-border-width solid $hr-border-color;\\n}\\n\\n\\n//\\n// Emphasis\\n//\\n\\nsmall,\\n.small {\\n  @include font-size($small-font-size);\\n  font-weight: $font-weight-normal;\\n}\\n\\nmark,\\n.mark {\\n  padding: $mark-padding;\\n  background-color: $mark-bg;\\n}\\n\\n\\n//\\n// Lists\\n//\\n\\n.list-unstyled {\\n  @include list-unstyled;\\n}\\n\\n// Inline turns list items into inline-block\\n.list-inline {\\n  @include list-unstyled;\\n}\\n.list-inline-item {\\n  display: inline-block;\\n\\n  &:not(:last-child) {\\n    margin-right: $list-inline-padding;\\n  }\\n}\\n\\n\\n//\\n// Misc\\n//\\n\\n// Builds on `abbr`\\n.initialism {\\n  @include font-size(90%);\\n  text-transform: uppercase;\\n}\\n\\n// Blockquotes\\n.blockquote {\\n  margin-bottom: $spacer;\\n  @include font-size($blockquote-font-size);\\n}\\n\\n.blockquote-footer {\\n  display: block;\\n  @include font-size($blockquote-small-font-size);\\n  color: $blockquote-small-color;\\n\\n  &::before {\\n    content: \\\"\\\\2014\\\\00A0\\\"; // em dash, nbsp\\n  }\\n}\\n\",\"// Lists\\n\\n// Unstyled keeps list items block level, just removes default browser padding and list-style\\n@mixin list-unstyled {\\n  padding-left: 0;\\n  list-style: none;\\n}\\n\",\"// Responsive images (ensure images don't scale beyond their parents)\\n//\\n// This is purposefully opt-in via an explicit class rather than being the default for all `<img>`s.\\n// We previously tried the \\\"images are responsive by default\\\" approach in Bootstrap v2,\\n// and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps)\\n// which weren't expecting the images within themselves to be involuntarily resized.\\n// See also https://github.com/twbs/bootstrap/issues/18178\\n.img-fluid {\\n  @include img-fluid;\\n}\\n\\n\\n// Image thumbnails\\n.img-thumbnail {\\n  padding: $thumbnail-padding;\\n  background-color: $thumbnail-bg;\\n  border: $thumbnail-border-width solid $thumbnail-border-color;\\n  @include border-radius($thumbnail-border-radius);\\n  @include box-shadow($thumbnail-box-shadow);\\n\\n  // Keep them at most 100% wide\\n  @include img-fluid;\\n}\\n\\n//\\n// Figures\\n//\\n\\n.figure {\\n  // Ensures the caption's text aligns with the image.\\n  display: inline-block;\\n}\\n\\n.figure-img {\\n  margin-bottom: $spacer / 2;\\n  line-height: 1;\\n}\\n\\n.figure-caption {\\n  @include font-size($figure-caption-font-size);\\n  color: $figure-caption-color;\\n}\\n\",\"// Image Mixins\\n// - Responsive image\\n// - Retina image\\n\\n\\n// Responsive image\\n//\\n// Keep images from scaling beyond the width of their parents.\\n\\n@mixin img-fluid {\\n  // Part 1: Set a maximum relative to the parent\\n  max-width: 100%;\\n  // Part 2: Override the height to auto, otherwise images will be stretched\\n  // when setting a width and height attribute on the img element.\\n  height: auto;\\n}\\n\\n\\n// Retina image\\n//\\n// Short retina mixin for setting background-image and -size.\\n\\n@mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) {\\n  background-image: url($file-1x);\\n\\n  // Autoprefixer takes care of adding -webkit-min-device-pixel-ratio and -o-min-device-pixel-ratio,\\n  // but doesn't convert dppx=>dpi.\\n  // There's no such thing as unprefixed min-device-pixel-ratio since it's nonstandard.\\n  // Compatibility info: https://caniuse.com/#feat=css-media-resolution\\n  @media only screen and (min-resolution: 192dpi), // IE9-11 don't support dppx\\n    only screen and (min-resolution: 2dppx) { // Standardized\\n    background-image: url($file-2x);\\n    background-size: $width-1x $height-1x;\\n  }\\n  @include deprecate(\\\"`img-retina()`\\\", \\\"v4.3.0\\\", \\\"v5\\\");\\n}\\n\",\"// stylelint-disable property-blacklist\\n// Single side border-radius\\n\\n@mixin border-radius($radius: $border-radius, $fallback-border-radius: false) {\\n  @if $enable-rounded {\\n    border-radius: $radius;\\n  }\\n  @else if $fallback-border-radius != false {\\n    border-radius: $fallback-border-radius;\\n  }\\n}\\n\\n@mixin border-top-radius($radius) {\\n  @if $enable-rounded {\\n    border-top-left-radius: $radius;\\n    border-top-right-radius: $radius;\\n  }\\n}\\n\\n@mixin border-right-radius($radius) {\\n  @if $enable-rounded {\\n    border-top-right-radius: $radius;\\n    border-bottom-right-radius: $radius;\\n  }\\n}\\n\\n@mixin border-bottom-radius($radius) {\\n  @if $enable-rounded {\\n    border-bottom-right-radius: $radius;\\n    border-bottom-left-radius: $radius;\\n  }\\n}\\n\\n@mixin border-left-radius($radius) {\\n  @if $enable-rounded {\\n    border-top-left-radius: $radius;\\n    border-bottom-left-radius: $radius;\\n  }\\n}\\n\\n@mixin border-top-left-radius($radius) {\\n  @if $enable-rounded {\\n    border-top-left-radius: $radius;\\n  }\\n}\\n\\n@mixin border-top-right-radius($radius) {\\n  @if $enable-rounded {\\n    border-top-right-radius: $radius;\\n  }\\n}\\n\\n@mixin border-bottom-right-radius($radius) {\\n  @if $enable-rounded {\\n    border-bottom-right-radius: $radius;\\n  }\\n}\\n\\n@mixin border-bottom-left-radius($radius) {\\n  @if $enable-rounded {\\n    border-bottom-left-radius: $radius;\\n  }\\n}\\n\",\"// Inline code\\ncode {\\n  @include font-size($code-font-size);\\n  color: $code-color;\\n  word-break: break-word;\\n\\n  // Streamline the style when inside anchors to avoid broken underline and more\\n  a > & {\\n    color: inherit;\\n  }\\n}\\n\\n// User input typically entered via keyboard\\nkbd {\\n  padding: $kbd-padding-y $kbd-padding-x;\\n  @include font-size($kbd-font-size);\\n  color: $kbd-color;\\n  background-color: $kbd-bg;\\n  @include border-radius($border-radius-sm);\\n  @include box-shadow($kbd-box-shadow);\\n\\n  kbd {\\n    padding: 0;\\n    @include font-size(100%);\\n    font-weight: $nested-kbd-font-weight;\\n    @include box-shadow(none);\\n  }\\n}\\n\\n// Blocks of code\\npre {\\n  display: block;\\n  @include font-size($code-font-size);\\n  color: $pre-color;\\n\\n  // Account for some code outputs that place code tags in pre tags\\n  code {\\n    @include font-size(inherit);\\n    color: inherit;\\n    word-break: normal;\\n  }\\n}\\n\\n// Enable scrollable blocks of code\\n.pre-scrollable {\\n  max-height: $pre-scrollable-max-height;\\n  overflow-y: scroll;\\n}\\n\",\"// Container widths\\n//\\n// Set the container width, and override it for fixed navbars in media queries.\\n\\n@if $enable-grid-classes {\\n  .container {\\n    @include make-container();\\n    @include make-container-max-widths();\\n  }\\n}\\n\\n// Fluid container\\n//\\n// Utilizes the mixin meant for fixed width containers, but with 100% width for\\n// fluid, full width layouts.\\n\\n@if $enable-grid-classes {\\n  .container-fluid {\\n    @include make-container();\\n  }\\n}\\n\\n// Row\\n//\\n// Rows contain and clear the floats of your columns.\\n\\n@if $enable-grid-classes {\\n  .row {\\n    @include make-row();\\n  }\\n\\n  // Remove the negative margin from default .row, then the horizontal padding\\n  // from all immediate children columns (to prevent runaway style inheritance).\\n  .no-gutters {\\n    margin-right: 0;\\n    margin-left: 0;\\n\\n    > .col,\\n    > [class*=\\\"col-\\\"] {\\n      padding-right: 0;\\n      padding-left: 0;\\n    }\\n  }\\n}\\n\\n// Columns\\n//\\n// Common styles for small and large grid columns\\n\\n@if $enable-grid-classes {\\n  @include make-grid-columns();\\n}\\n\",\"/// Grid system\\n//\\n// Generate semantic grid columns with these mixins.\\n\\n@mixin make-container($gutter: $grid-gutter-width) {\\n  width: 100%;\\n  padding-right: $gutter / 2;\\n  padding-left: $gutter / 2;\\n  margin-right: auto;\\n  margin-left: auto;\\n}\\n\\n\\n// For each breakpoint, define the maximum width of the container in a media query\\n@mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) {\\n  @each $breakpoint, $container-max-width in $max-widths {\\n    @include media-breakpoint-up($breakpoint, $breakpoints) {\\n      max-width: $container-max-width;\\n    }\\n  }\\n}\\n\\n@mixin make-row($gutter: $grid-gutter-width) {\\n  display: flex;\\n  flex-wrap: wrap;\\n  margin-right: -$gutter / 2;\\n  margin-left: -$gutter / 2;\\n}\\n\\n@mixin make-col-ready($gutter: $grid-gutter-width) {\\n  position: relative;\\n  // Prevent columns from becoming too narrow when at smaller grid tiers by\\n  // always setting `width: 100%;`. This works because we use `flex` values\\n  // later on to override this initial width.\\n  width: 100%;\\n  padding-right: $gutter / 2;\\n  padding-left: $gutter / 2;\\n}\\n\\n@mixin make-col($size, $columns: $grid-columns) {\\n  flex: 0 0 percentage($size / $columns);\\n  // Add a `max-width` to ensure content within each column does not blow out\\n  // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari\\n  // do not appear to require this.\\n  max-width: percentage($size / $columns);\\n}\\n\\n@mixin make-col-offset($size, $columns: $grid-columns) {\\n  $num: $size / $columns;\\n  margin-left: if($num == 0, 0, percentage($num));\\n}\\n\",\"// Breakpoint viewport sizes and media queries.\\n//\\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\\n//\\n//    (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)\\n//\\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\\n\\n// Name of the next breakpoint, or null for the last breakpoint.\\n//\\n//    >> breakpoint-next(sm)\\n//    md\\n//    >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\\n//    md\\n//    >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))\\n//    md\\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\\n  $n: index($breakpoint-names, $name);\\n  @return if($n != null and $n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\\n}\\n\\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\\n//\\n//    >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\\n//    576px\\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\\n  $min: map-get($breakpoints, $name);\\n  @return if($min != 0, $min, null);\\n}\\n\\n// Maximum breakpoint width. Null for the largest (last) breakpoint.\\n// The maximum value is calculated as the minimum of the next one less 0.02px\\n// to work around the limitations of `min-` and `max-` prefixes and viewports with fractional widths.\\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\\n//\\n//    >> breakpoint-max(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\\n//    767.98px\\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\\n  $next: breakpoint-next($name, $breakpoints);\\n  @return if($next, breakpoint-min($next, $breakpoints) - .02, null);\\n}\\n\\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\\n// Useful for making responsive utilities.\\n//\\n//    >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\\n//    \\\"\\\"  (Returns a blank string)\\n//    >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\\n//    \\\"-sm\\\"\\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\\n  @return if(breakpoint-min($name, $breakpoints) == null, \\\"\\\", \\\"-#{$name}\\\");\\n}\\n\\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\\n// Makes the @content apply to the given breakpoint and wider.\\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\\n  $min: breakpoint-min($name, $breakpoints);\\n  @if $min {\\n    @media (min-width: $min) {\\n      @content;\\n    }\\n  } @else {\\n    @content;\\n  }\\n}\\n\\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\\n// Makes the @content apply to the given breakpoint and narrower.\\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\\n  $max: breakpoint-max($name, $breakpoints);\\n  @if $max {\\n    @media (max-width: $max) {\\n      @content;\\n    }\\n  } @else {\\n    @content;\\n  }\\n}\\n\\n// Media that spans multiple breakpoint widths.\\n// Makes the @content apply between the min and max breakpoints\\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\\n  $min: breakpoint-min($lower, $breakpoints);\\n  $max: breakpoint-max($upper, $breakpoints);\\n\\n  @if $min != null and $max != null {\\n    @media (min-width: $min) and (max-width: $max) {\\n      @content;\\n    }\\n  } @else if $max == null {\\n    @include media-breakpoint-up($lower, $breakpoints) {\\n      @content;\\n    }\\n  } @else if $min == null {\\n    @include media-breakpoint-down($upper, $breakpoints) {\\n      @content;\\n    }\\n  }\\n}\\n\\n// Media between the breakpoint's minimum and maximum widths.\\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\\n  $min: breakpoint-min($name, $breakpoints);\\n  $max: breakpoint-max($name, $breakpoints);\\n\\n  @if $min != null and $max != null {\\n    @media (min-width: $min) and (max-width: $max) {\\n      @content;\\n    }\\n  } @else if $max == null {\\n    @include media-breakpoint-up($name, $breakpoints) {\\n      @content;\\n    }\\n  } @else if $min == null {\\n    @include media-breakpoint-down($name, $breakpoints) {\\n      @content;\\n    }\\n  }\\n}\\n\",\"// Framework grid generation\\n//\\n// Used only by Bootstrap to generate the correct number of grid classes given\\n// any value of `$grid-columns`.\\n\\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\\n  // Common properties for all breakpoints\\n  %grid-column {\\n    position: relative;\\n    width: 100%;\\n    padding-right: $gutter / 2;\\n    padding-left: $gutter / 2;\\n  }\\n\\n  @each $breakpoint in map-keys($breakpoints) {\\n    $infix: breakpoint-infix($breakpoint, $breakpoints);\\n\\n    // Allow columns to stretch full width below their breakpoints\\n    @for $i from 1 through $columns {\\n      .col#{$infix}-#{$i} {\\n        @extend %grid-column;\\n      }\\n    }\\n    .col#{$infix},\\n    .col#{$infix}-auto {\\n      @extend %grid-column;\\n    }\\n\\n    @include media-breakpoint-up($breakpoint, $breakpoints) {\\n      // Provide basic `.col-{bp}` classes for equal-width flexbox columns\\n      .col#{$infix} {\\n        flex-basis: 0;\\n        flex-grow: 1;\\n        max-width: 100%;\\n      }\\n      .col#{$infix}-auto {\\n        flex: 0 0 auto;\\n        width: auto;\\n        max-width: 100%; // Reset earlier grid tiers\\n      }\\n\\n      @for $i from 1 through $columns {\\n        .col#{$infix}-#{$i} {\\n          @include make-col($i, $columns);\\n        }\\n      }\\n\\n      .order#{$infix}-first { order: -1; }\\n\\n      .order#{$infix}-last { order: $columns + 1; }\\n\\n      @for $i from 0 through $columns {\\n        .order#{$infix}-#{$i} { order: $i; }\\n      }\\n\\n      // `$columns - 1` because offsetting by the width of an entire row isn't possible\\n      @for $i from 0 through ($columns - 1) {\\n        @if not ($infix == \\\"\\\" and $i == 0) { // Avoid emitting useless .offset-0\\n          .offset#{$infix}-#{$i} {\\n            @include make-col-offset($i, $columns);\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\n\",\"//\\n// Basic Bootstrap table\\n//\\n\\n.table {\\n  width: 100%;\\n  margin-bottom: $spacer;\\n  color: $table-color;\\n  background-color: $table-bg; // Reset for nesting within parents with `background-color`.\\n\\n  th,\\n  td {\\n    padding: $table-cell-padding;\\n    vertical-align: top;\\n    border-top: $table-border-width solid $table-border-color;\\n  }\\n\\n  thead th {\\n    vertical-align: bottom;\\n    border-bottom: (2 * $table-border-width) solid $table-border-color;\\n  }\\n\\n  tbody + tbody {\\n    border-top: (2 * $table-border-width) solid $table-border-color;\\n  }\\n}\\n\\n\\n//\\n// Condensed table w/ half padding\\n//\\n\\n.table-sm {\\n  th,\\n  td {\\n    padding: $table-cell-padding-sm;\\n  }\\n}\\n\\n\\n// Border versions\\n//\\n// Add or remove borders all around the table and between all the columns.\\n\\n.table-bordered {\\n  border: $table-border-width solid $table-border-color;\\n\\n  th,\\n  td {\\n    border: $table-border-width solid $table-border-color;\\n  }\\n\\n  thead {\\n    th,\\n    td {\\n      border-bottom-width: 2 * $table-border-width;\\n    }\\n  }\\n}\\n\\n.table-borderless {\\n  th,\\n  td,\\n  thead th,\\n  tbody + tbody {\\n    border: 0;\\n  }\\n}\\n\\n// Zebra-striping\\n//\\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\\n\\n.table-striped {\\n  tbody tr:nth-of-type(#{$table-striped-order}) {\\n    background-color: $table-accent-bg;\\n  }\\n}\\n\\n\\n// Hover effect\\n//\\n// Placed here since it has to come after the potential zebra striping\\n\\n.table-hover {\\n  tbody tr {\\n    @include hover {\\n      color: $table-hover-color;\\n      background-color: $table-hover-bg;\\n    }\\n  }\\n}\\n\\n\\n// Table backgrounds\\n//\\n// Exact selectors below required to override `.table-striped` and prevent\\n// inheritance to nested tables.\\n\\n@each $color, $value in $theme-colors {\\n  @include table-row-variant($color, theme-color-level($color, $table-bg-level), theme-color-level($color, $table-border-level));\\n}\\n\\n@include table-row-variant(active, $table-active-bg);\\n\\n\\n// Dark styles\\n//\\n// Same table markup, but inverted color scheme: dark background and light text.\\n\\n// stylelint-disable-next-line no-duplicate-selectors\\n.table {\\n  .thead-dark {\\n    th {\\n      color: $table-dark-color;\\n      background-color: $table-dark-bg;\\n      border-color: $table-dark-border-color;\\n    }\\n  }\\n\\n  .thead-light {\\n    th {\\n      color: $table-head-color;\\n      background-color: $table-head-bg;\\n      border-color: $table-border-color;\\n    }\\n  }\\n}\\n\\n.table-dark {\\n  color: $table-dark-color;\\n  background-color: $table-dark-bg;\\n\\n  th,\\n  td,\\n  thead th {\\n    border-color: $table-dark-border-color;\\n  }\\n\\n  &.table-bordered {\\n    border: 0;\\n  }\\n\\n  &.table-striped {\\n    tbody tr:nth-of-type(odd) {\\n      background-color: $table-dark-accent-bg;\\n    }\\n  }\\n\\n  &.table-hover {\\n    tbody tr {\\n      @include hover {\\n        color: $table-dark-hover-color;\\n        background-color: $table-dark-hover-bg;\\n      }\\n    }\\n  }\\n}\\n\\n\\n// Responsive tables\\n//\\n// Generate series of `.table-responsive-*` classes for configuring the screen\\n// size of where your table will overflow.\\n\\n.table-responsive {\\n  @each $breakpoint in map-keys($grid-breakpoints) {\\n    $next: breakpoint-next($breakpoint, $grid-breakpoints);\\n    $infix: breakpoint-infix($next, $grid-breakpoints);\\n\\n    &#{$infix} {\\n      @include media-breakpoint-down($breakpoint) {\\n        display: block;\\n        width: 100%;\\n        overflow-x: auto;\\n        -webkit-overflow-scrolling: touch;\\n\\n        // Prevent double border on horizontal scroll due to use of `display: block;`\\n        > .table-bordered {\\n          border: 0;\\n        }\\n      }\\n    }\\n  }\\n}\\n\",\"// Tables\\n\\n@mixin table-row-variant($state, $background, $border: null) {\\n  // Exact selectors below required to override `.table-striped` and prevent\\n  // inheritance to nested tables.\\n  .table-#{$state} {\\n    &,\\n    > th,\\n    > td {\\n      background-color: $background;\\n    }\\n\\n    @if $border != null {\\n      th,\\n      td,\\n      thead th,\\n      tbody + tbody {\\n        border-color: $border;\\n      }\\n    }\\n  }\\n\\n  // Hover states for `.table-hover`\\n  // Note: this is not available for cells or rows within `thead` or `tfoot`.\\n  .table-hover {\\n    $hover-background: darken($background, 5%);\\n\\n    .table-#{$state} {\\n      @include hover {\\n        background-color: $hover-background;\\n\\n        > td,\\n        > th {\\n          background-color: $hover-background;\\n        }\\n      }\\n    }\\n  }\\n}\\n\",\"// Bootstrap functions\\n//\\n// Utility mixins and functions for evaluating source code across our variables, maps, and mixins.\\n\\n// Ascending\\n// Used to evaluate Sass maps like our grid breakpoints.\\n@mixin _assert-ascending($map, $map-name) {\\n  $prev-key: null;\\n  $prev-num: null;\\n  @each $key, $num in $map {\\n    @if $prev-num == null or unit($num) == \\\"%\\\" {\\n      // Do nothing\\n    } @else if not comparable($prev-num, $num) {\\n      @warn \\\"Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !\\\";\\n    } @else if $prev-num >= $num {\\n      @warn \\\"Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !\\\";\\n    }\\n    $prev-key: $key;\\n    $prev-num: $num;\\n  }\\n}\\n\\n// Starts at zero\\n// Used to ensure the min-width of the lowest breakpoint starts at 0.\\n@mixin _assert-starts-at-zero($map, $map-name: \\\"$grid-breakpoints\\\") {\\n  $values: map-values($map);\\n  $first-value: nth($values, 1);\\n  @if $first-value != 0 {\\n    @warn \\\"First breakpoint in #{$map-name} must start at 0, but starts at #{$first-value}.\\\";\\n  }\\n}\\n\\n// Replace `$search` with `$replace` in `$string`\\n// Used on our SVG icon backgrounds for custom forms.\\n//\\n// @author Hugo Giraudel\\n// @param {String} $string - Initial string\\n// @param {String} $search - Substring to replace\\n// @param {String} $replace ('') - New value\\n// @return {String} - Updated string\\n@function str-replace($string, $search, $replace: \\\"\\\") {\\n  $index: str-index($string, $search);\\n\\n  @if $index {\\n    @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);\\n  }\\n\\n  @return $string;\\n}\\n\\n// Color contrast\\n@function color-yiq($color, $dark: $yiq-text-dark, $light: $yiq-text-light) {\\n  $r: red($color);\\n  $g: green($color);\\n  $b: blue($color);\\n\\n  $yiq: (($r * 299) + ($g * 587) + ($b * 114)) / 1000;\\n\\n  @if ($yiq >= $yiq-contrasted-threshold) {\\n    @return $dark;\\n  } @else {\\n    @return $light;\\n  }\\n}\\n\\n// Retrieve color Sass maps\\n@function color($key: \\\"blue\\\") {\\n  @return map-get($colors, $key);\\n}\\n\\n@function theme-color($key: \\\"primary\\\") {\\n  @return map-get($theme-colors, $key);\\n}\\n\\n@function gray($key: \\\"100\\\") {\\n  @return map-get($grays, $key);\\n}\\n\\n// Request a theme color level\\n@function theme-color-level($color-name: \\\"primary\\\", $level: 0) {\\n  $color: theme-color($color-name);\\n  $color-base: if($level > 0, $black, $white);\\n  $level: abs($level);\\n\\n  @return mix($color-base, $color, $level * $theme-color-interval);\\n}\\n\",\"// stylelint-disable selector-no-qualifying-type\\n\\n//\\n// Textual form controls\\n//\\n\\n.form-control {\\n  display: block;\\n  width: 100%;\\n  height: $input-height;\\n  padding: $input-padding-y $input-padding-x;\\n  font-family: $input-font-family;\\n  @include font-size($input-font-size);\\n  font-weight: $input-font-weight;\\n  line-height: $input-line-height;\\n  color: $input-color;\\n  background-color: $input-bg;\\n  background-clip: padding-box;\\n  border: $input-border-width solid $input-border-color;\\n\\n  // Note: This has no effect on <select>s in some browsers, due to the limited stylability of `<select>`s in CSS.\\n  @include border-radius($input-border-radius, 0);\\n\\n  @include box-shadow($input-box-shadow);\\n  @include transition($input-transition);\\n\\n  // Unstyle the caret on `<select>`s in IE10+.\\n  &::-ms-expand {\\n    background-color: transparent;\\n    border: 0;\\n  }\\n\\n  // Customize the `:focus` state to imitate native WebKit styles.\\n  @include form-control-focus();\\n\\n  // Placeholder\\n  &::placeholder {\\n    color: $input-placeholder-color;\\n    // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526.\\n    opacity: 1;\\n  }\\n\\n  // Disabled and read-only inputs\\n  //\\n  // HTML5 says that controls under a fieldset > legend:first-child won't be\\n  // disabled if the fieldset is disabled. Due to implementation difficulty, we\\n  // don't honor that edge case; we style them as disabled anyway.\\n  &:disabled,\\n  &[readonly] {\\n    background-color: $input-disabled-bg;\\n    // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655.\\n    opacity: 1;\\n  }\\n}\\n\\nselect.form-control {\\n  &:focus::-ms-value {\\n    // Suppress the nested default white text on blue background highlight given to\\n    // the selected option text when the (still closed) <select> receives focus\\n    // in IE and (under certain conditions) Edge, as it looks bad and cannot be made to\\n    // match the appearance of the native widget.\\n    // See https://github.com/twbs/bootstrap/issues/19398.\\n    color: $input-color;\\n    background-color: $input-bg;\\n  }\\n}\\n\\n// Make file inputs better match text inputs by forcing them to new lines.\\n.form-control-file,\\n.form-control-range {\\n  display: block;\\n  width: 100%;\\n}\\n\\n\\n//\\n// Labels\\n//\\n\\n// For use with horizontal and inline forms, when you need the label (or legend)\\n// text to align with the form controls.\\n.col-form-label {\\n  padding-top: calc(#{$input-padding-y} + #{$input-border-width});\\n  padding-bottom: calc(#{$input-padding-y} + #{$input-border-width});\\n  margin-bottom: 0; // Override the `<label>/<legend>` default\\n  @include font-size(inherit); // Override the `<legend>` default\\n  line-height: $input-line-height;\\n}\\n\\n.col-form-label-lg {\\n  padding-top: calc(#{$input-padding-y-lg} + #{$input-border-width});\\n  padding-bottom: calc(#{$input-padding-y-lg} + #{$input-border-width});\\n  @include font-size($input-font-size-lg);\\n  line-height: $input-line-height-lg;\\n}\\n\\n.col-form-label-sm {\\n  padding-top: calc(#{$input-padding-y-sm} + #{$input-border-width});\\n  padding-bottom: calc(#{$input-padding-y-sm} + #{$input-border-width});\\n  @include font-size($input-font-size-sm);\\n  line-height: $input-line-height-sm;\\n}\\n\\n\\n// Readonly controls as plain text\\n//\\n// Apply class to a readonly input to make it appear like regular plain\\n// text (without any border, background color, focus indicator)\\n\\n.form-control-plaintext {\\n  display: block;\\n  width: 100%;\\n  padding-top: $input-padding-y;\\n  padding-bottom: $input-padding-y;\\n  margin-bottom: 0; // match inputs if this class comes on inputs with default margins\\n  line-height: $input-line-height;\\n  color: $input-plaintext-color;\\n  background-color: transparent;\\n  border: solid transparent;\\n  border-width: $input-border-width 0;\\n\\n  &.form-control-sm,\\n  &.form-control-lg {\\n    padding-right: 0;\\n    padding-left: 0;\\n  }\\n}\\n\\n\\n// Form control sizing\\n//\\n// Build on `.form-control` with modifier classes to decrease or increase the\\n// height and font-size of form controls.\\n//\\n// Repeated in `_input_group.scss` to avoid Sass extend issues.\\n\\n.form-control-sm {\\n  height: $input-height-sm;\\n  padding: $input-padding-y-sm $input-padding-x-sm;\\n  @include font-size($input-font-size-sm);\\n  line-height: $input-line-height-sm;\\n  @include border-radius($input-border-radius-sm);\\n}\\n\\n.form-control-lg {\\n  height: $input-height-lg;\\n  padding: $input-padding-y-lg $input-padding-x-lg;\\n  @include font-size($input-font-size-lg);\\n  line-height: $input-line-height-lg;\\n  @include border-radius($input-border-radius-lg);\\n}\\n\\n// stylelint-disable-next-line no-duplicate-selectors\\nselect.form-control {\\n  &[size],\\n  &[multiple] {\\n    height: auto;\\n  }\\n}\\n\\ntextarea.form-control {\\n  height: auto;\\n}\\n\\n// Form groups\\n//\\n// Designed to help with the organization and spacing of vertical forms. For\\n// horizontal forms, use the predefined grid classes.\\n\\n.form-group {\\n  margin-bottom: $form-group-margin-bottom;\\n}\\n\\n.form-text {\\n  display: block;\\n  margin-top: $form-text-margin-top;\\n}\\n\\n\\n// Form grid\\n//\\n// Special replacement for our grid system's `.row` for tighter form layouts.\\n\\n.form-row {\\n  display: flex;\\n  flex-wrap: wrap;\\n  margin-right: -$form-grid-gutter-width / 2;\\n  margin-left: -$form-grid-gutter-width / 2;\\n\\n  > .col,\\n  > [class*=\\\"col-\\\"] {\\n    padding-right: $form-grid-gutter-width / 2;\\n    padding-left: $form-grid-gutter-width / 2;\\n  }\\n}\\n\\n\\n// Checkboxes and radios\\n//\\n// Indent the labels to position radios/checkboxes as hanging controls.\\n\\n.form-check {\\n  position: relative;\\n  display: block;\\n  padding-left: $form-check-input-gutter;\\n}\\n\\n.form-check-input {\\n  position: absolute;\\n  margin-top: $form-check-input-margin-y;\\n  margin-left: -$form-check-input-gutter;\\n\\n  &:disabled ~ .form-check-label {\\n    color: $text-muted;\\n  }\\n}\\n\\n.form-check-label {\\n  margin-bottom: 0; // Override default `<label>` bottom margin\\n}\\n\\n.form-check-inline {\\n  display: inline-flex;\\n  align-items: center;\\n  padding-left: 0; // Override base .form-check\\n  margin-right: $form-check-inline-margin-x;\\n\\n  // Undo .form-check-input defaults and add some `margin-right`.\\n  .form-check-input {\\n    position: static;\\n    margin-top: 0;\\n    margin-right: $form-check-inline-input-margin-x;\\n    margin-left: 0;\\n  }\\n}\\n\\n\\n// Form validation\\n//\\n// Provide feedback to users when form field values are valid or invalid. Works\\n// primarily for client-side validation via scoped `:invalid` and `:valid`\\n// pseudo-classes but also includes `.is-invalid` and `.is-valid` classes for\\n// server side validation.\\n\\n@each $state, $data in $form-validation-states {\\n  @include form-validation-state($state, map-get($data, color), map-get($data, icon));\\n}\\n\\n// Inline forms\\n//\\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\\n// forms begin stacked on extra small (mobile) devices and then go inline when\\n// viewports reach <768px.\\n//\\n// Requires wrapping inputs and labels with `.form-group` for proper display of\\n// default HTML form controls and our custom form controls (e.g., input groups).\\n\\n.form-inline {\\n  display: flex;\\n  flex-flow: row wrap;\\n  align-items: center; // Prevent shorter elements from growing to same height as others (e.g., small buttons growing to normal sized button height)\\n\\n  // Because we use flex, the initial sizing of checkboxes is collapsed and\\n  // doesn't occupy the full-width (which is what we want for xs grid tier),\\n  // so we force that here.\\n  .form-check {\\n    width: 100%;\\n  }\\n\\n  // Kick in the inline\\n  @include media-breakpoint-up(sm) {\\n    label {\\n      display: flex;\\n      align-items: center;\\n      justify-content: center;\\n      margin-bottom: 0;\\n    }\\n\\n    // Inline-block all the things for \\\"inline\\\"\\n    .form-group {\\n      display: flex;\\n      flex: 0 0 auto;\\n      flex-flow: row wrap;\\n      align-items: center;\\n      margin-bottom: 0;\\n    }\\n\\n    // Allow folks to *not* use `.form-group`\\n    .form-control {\\n      display: inline-block;\\n      width: auto; // Prevent labels from stacking above inputs in `.form-group`\\n      vertical-align: middle;\\n    }\\n\\n    // Make static controls behave like regular ones\\n    .form-control-plaintext {\\n      display: inline-block;\\n    }\\n\\n    .input-group,\\n    .custom-select {\\n      width: auto;\\n    }\\n\\n    // Remove default margin on radios/checkboxes that were used for stacking, and\\n    // then undo the floating of radios and checkboxes to match.\\n    .form-check {\\n      display: flex;\\n      align-items: center;\\n      justify-content: center;\\n      width: auto;\\n      padding-left: 0;\\n    }\\n    .form-check-input {\\n      position: relative;\\n      flex-shrink: 0;\\n      margin-top: 0;\\n      margin-right: $form-check-input-margin-x;\\n      margin-left: 0;\\n    }\\n\\n    .custom-control {\\n      align-items: center;\\n      justify-content: center;\\n    }\\n    .custom-control-label {\\n      margin-bottom: 0;\\n    }\\n  }\\n}\\n\",\"// stylelint-disable property-blacklist\\n@mixin transition($transition...) {\\n  @if $enable-transitions {\\n    @if length($transition) == 0 {\\n      transition: $transition-base;\\n    } @else {\\n      transition: $transition;\\n    }\\n  }\\n\\n  @if $enable-prefers-reduced-motion-media-query {\\n    @media (prefers-reduced-motion: reduce) {\\n      transition: none;\\n    }\\n  }\\n}\\n\",\"// Form control focus state\\n//\\n// Generate a customized focus state and for any input with the specified color,\\n// which defaults to the `$input-focus-border-color` variable.\\n//\\n// We highly encourage you to not customize the default value, but instead use\\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\\n// WebKit's default styles, but applicable to a wider range of browsers. Its\\n// usability and accessibility should be taken into account with any change.\\n//\\n// Example usage: change the default blue border and shadow to white for better\\n// contrast against a dark gray background.\\n@mixin form-control-focus() {\\n  &:focus {\\n    color: $input-focus-color;\\n    background-color: $input-focus-bg;\\n    border-color: $input-focus-border-color;\\n    outline: 0;\\n    // Avoid using mixin so we can pass custom focus shadow properly\\n    @if $enable-shadows {\\n      box-shadow: $input-box-shadow, $input-focus-box-shadow;\\n    } @else {\\n      box-shadow: $input-focus-box-shadow;\\n    }\\n  }\\n}\\n\\n\\n@mixin form-validation-state($state, $color, $icon) {\\n  .#{$state}-feedback {\\n    display: none;\\n    width: 100%;\\n    margin-top: $form-feedback-margin-top;\\n    @include font-size($form-feedback-font-size);\\n    color: $color;\\n  }\\n\\n  .#{$state}-tooltip {\\n    position: absolute;\\n    top: 100%;\\n    z-index: 5;\\n    display: none;\\n    max-width: 100%; // Contain to parent when possible\\n    padding: $form-feedback-tooltip-padding-y $form-feedback-tooltip-padding-x;\\n    margin-top: .1rem;\\n    @include font-size($form-feedback-tooltip-font-size);\\n    line-height: $form-feedback-tooltip-line-height;\\n    color: color-yiq($color);\\n    background-color: rgba($color, $form-feedback-tooltip-opacity);\\n    @include border-radius($form-feedback-tooltip-border-radius);\\n  }\\n\\n  .form-control {\\n    .was-validated &:#{$state},\\n    &.is-#{$state} {\\n      border-color: $color;\\n\\n      @if $enable-validation-icons {\\n        padding-right: $input-height-inner;\\n        background-image: $icon;\\n        background-repeat: no-repeat;\\n        background-position: center right $input-height-inner-quarter;\\n        background-size: $input-height-inner-half $input-height-inner-half;\\n      }\\n\\n      &:focus {\\n        border-color: $color;\\n        box-shadow: 0 0 0 $input-focus-width rgba($color, .25);\\n      }\\n\\n      ~ .#{$state}-feedback,\\n      ~ .#{$state}-tooltip {\\n        display: block;\\n      }\\n    }\\n  }\\n\\n  // stylelint-disable-next-line selector-no-qualifying-type\\n  textarea.form-control {\\n    .was-validated &:#{$state},\\n    &.is-#{$state} {\\n      @if $enable-validation-icons {\\n        padding-right: $input-height-inner;\\n        background-position: top $input-height-inner-quarter right $input-height-inner-quarter;\\n      }\\n    }\\n  }\\n\\n  .custom-select {\\n    .was-validated &:#{$state},\\n    &.is-#{$state} {\\n      border-color: $color;\\n\\n      @if $enable-validation-icons {\\n        padding-right: $custom-select-feedback-icon-padding-right;\\n        background: $custom-select-background, $icon $custom-select-bg no-repeat $custom-select-feedback-icon-position / $custom-select-feedback-icon-size;\\n      }\\n\\n      &:focus {\\n        border-color: $color;\\n        box-shadow: 0 0 0 $input-focus-width rgba($color, .25);\\n      }\\n\\n      ~ .#{$state}-feedback,\\n      ~ .#{$state}-tooltip {\\n        display: block;\\n      }\\n    }\\n  }\\n\\n\\n  .form-control-file {\\n    .was-validated &:#{$state},\\n    &.is-#{$state} {\\n      ~ .#{$state}-feedback,\\n      ~ .#{$state}-tooltip {\\n        display: block;\\n      }\\n    }\\n  }\\n\\n  .form-check-input {\\n    .was-validated &:#{$state},\\n    &.is-#{$state} {\\n      ~ .form-check-label {\\n        color: $color;\\n      }\\n\\n      ~ .#{$state}-feedback,\\n      ~ .#{$state}-tooltip {\\n        display: block;\\n      }\\n    }\\n  }\\n\\n  .custom-control-input {\\n    .was-validated &:#{$state},\\n    &.is-#{$state} {\\n      ~ .custom-control-label {\\n        color: $color;\\n\\n        &::before {\\n          border-color: $color;\\n        }\\n      }\\n\\n      ~ .#{$state}-feedback,\\n      ~ .#{$state}-tooltip {\\n        display: block;\\n      }\\n\\n      &:checked {\\n        ~ .custom-control-label::before {\\n          border-color: lighten($color, 10%);\\n          @include gradient-bg(lighten($color, 10%));\\n        }\\n      }\\n\\n      &:focus {\\n        ~ .custom-control-label::before {\\n          box-shadow: 0 0 0 $input-focus-width rgba($color, .25);\\n        }\\n\\n        &:not(:checked) ~ .custom-control-label::before {\\n          border-color: $color;\\n        }\\n      }\\n    }\\n  }\\n\\n  // custom file\\n  .custom-file-input {\\n    .was-validated &:#{$state},\\n    &.is-#{$state} {\\n      ~ .custom-file-label {\\n        border-color: $color;\\n      }\\n\\n      ~ .#{$state}-feedback,\\n      ~ .#{$state}-tooltip {\\n        display: block;\\n      }\\n\\n      &:focus {\\n        ~ .custom-file-label {\\n          border-color: $color;\\n          box-shadow: 0 0 0 $input-focus-width rgba($color, .25);\\n        }\\n      }\\n    }\\n  }\\n}\\n\",\"// Gradients\\n\\n@mixin gradient-bg($color) {\\n  @if $enable-gradients {\\n    background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x;\\n  } @else {\\n    background-color: $color;\\n  }\\n}\\n\\n// Horizontal gradient, from left to right\\n//\\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\\n@mixin gradient-x($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {\\n  background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent);\\n  background-repeat: repeat-x;\\n}\\n\\n// Vertical gradient, from top to bottom\\n//\\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\\n@mixin gradient-y($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {\\n  background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent);\\n  background-repeat: repeat-x;\\n}\\n\\n@mixin gradient-directional($start-color: $gray-700, $end-color: $gray-800, $deg: 45deg) {\\n  background-image: linear-gradient($deg, $start-color, $end-color);\\n  background-repeat: repeat-x;\\n}\\n@mixin gradient-x-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\\n  background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);\\n  background-repeat: no-repeat;\\n}\\n@mixin gradient-y-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\\n  background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);\\n  background-repeat: no-repeat;\\n}\\n@mixin gradient-radial($inner-color: $gray-700, $outer-color: $gray-800) {\\n  background-image: radial-gradient(circle, $inner-color, $outer-color);\\n  background-repeat: no-repeat;\\n}\\n@mixin gradient-striped($color: rgba($white, .15), $angle: 45deg) {\\n  background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\\n}\\n\",\"// stylelint-disable selector-no-qualifying-type\\n\\n//\\n// Base styles\\n//\\n\\n.btn {\\n  display: inline-block;\\n  font-family: $btn-font-family;\\n  font-weight: $btn-font-weight;\\n  color: $body-color;\\n  text-align: center;\\n  vertical-align: middle;\\n  user-select: none;\\n  background-color: transparent;\\n  border: $btn-border-width solid transparent;\\n  @include button-size($btn-padding-y, $btn-padding-x, $btn-font-size, $btn-line-height, $btn-border-radius);\\n  @include transition($btn-transition);\\n\\n  @include hover {\\n    color: $body-color;\\n    text-decoration: none;\\n  }\\n\\n  &:focus,\\n  &.focus {\\n    outline: 0;\\n    box-shadow: $btn-focus-box-shadow;\\n  }\\n\\n  // Disabled comes first so active can properly restyle\\n  &.disabled,\\n  &:disabled {\\n    opacity: $btn-disabled-opacity;\\n    @include box-shadow(none);\\n  }\\n\\n  &:not(:disabled):not(.disabled):active,\\n  &:not(:disabled):not(.disabled).active {\\n    @include box-shadow($btn-active-box-shadow);\\n\\n    &:focus {\\n      @include box-shadow($btn-focus-box-shadow, $btn-active-box-shadow);\\n    }\\n  }\\n}\\n\\n// Future-proof disabling of clicks on `<a>` elements\\na.btn.disabled,\\nfieldset:disabled a.btn {\\n  pointer-events: none;\\n}\\n\\n\\n//\\n// Alternate buttons\\n//\\n\\n@each $color, $value in $theme-colors {\\n  .btn-#{$color} {\\n    @include button-variant($value, $value);\\n  }\\n}\\n\\n@each $color, $value in $theme-colors {\\n  .btn-outline-#{$color} {\\n    @include button-outline-variant($value);\\n  }\\n}\\n\\n\\n//\\n// Link buttons\\n//\\n\\n// Make a button look and behave like a link\\n.btn-link {\\n  font-weight: $font-weight-normal;\\n  color: $link-color;\\n  text-decoration: $link-decoration;\\n\\n  @include hover {\\n    color: $link-hover-color;\\n    text-decoration: $link-hover-decoration;\\n  }\\n\\n  &:focus,\\n  &.focus {\\n    text-decoration: $link-hover-decoration;\\n    box-shadow: none;\\n  }\\n\\n  &:disabled,\\n  &.disabled {\\n    color: $btn-link-disabled-color;\\n    pointer-events: none;\\n  }\\n\\n  // No need for an active state here\\n}\\n\\n\\n//\\n// Button Sizes\\n//\\n\\n.btn-lg {\\n  @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-line-height-lg, $btn-border-radius-lg);\\n}\\n\\n.btn-sm {\\n  @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-line-height-sm, $btn-border-radius-sm);\\n}\\n\\n\\n//\\n// Block button\\n//\\n\\n.btn-block {\\n  display: block;\\n  width: 100%;\\n\\n  // Vertically space out multiple block buttons\\n  + .btn-block {\\n    margin-top: $btn-block-spacing-y;\\n  }\\n}\\n\\n// Specificity overrides\\ninput[type=\\\"submit\\\"],\\ninput[type=\\\"reset\\\"],\\ninput[type=\\\"button\\\"] {\\n  &.btn-block {\\n    width: 100%;\\n  }\\n}\\n\",\"// Button variants\\n//\\n// Easily pump out default styles, as well as :hover, :focus, :active,\\n// and disabled options for all buttons\\n\\n@mixin button-variant($background, $border, $hover-background: darken($background, 7.5%), $hover-border: darken($border, 10%), $active-background: darken($background, 10%), $active-border: darken($border, 12.5%)) {\\n  color: color-yiq($background);\\n  @include gradient-bg($background);\\n  border-color: $border;\\n  @include box-shadow($btn-box-shadow);\\n\\n  @include hover {\\n    color: color-yiq($hover-background);\\n    @include gradient-bg($hover-background);\\n    border-color: $hover-border;\\n  }\\n\\n  &:focus,\\n  &.focus {\\n    // Avoid using mixin so we can pass custom focus shadow properly\\n    @if $enable-shadows {\\n      box-shadow: $btn-box-shadow, 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5);\\n    } @else {\\n      box-shadow: 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5);\\n    }\\n  }\\n\\n  // Disabled comes first so active can properly restyle\\n  &.disabled,\\n  &:disabled {\\n    color: color-yiq($background);\\n    background-color: $background;\\n    border-color: $border;\\n    // Remove CSS gradients if they're enabled\\n    @if $enable-gradients {\\n      background-image: none;\\n    }\\n  }\\n\\n  &:not(:disabled):not(.disabled):active,\\n  &:not(:disabled):not(.disabled).active,\\n  .show > &.dropdown-toggle {\\n    color: color-yiq($active-background);\\n    background-color: $active-background;\\n    @if $enable-gradients {\\n      background-image: none; // Remove the gradient for the pressed/active state\\n    }\\n    border-color: $active-border;\\n\\n    &:focus {\\n      // Avoid using mixin so we can pass custom focus shadow properly\\n      @if $enable-shadows and $btn-active-box-shadow != none {\\n        box-shadow: $btn-active-box-shadow, 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5);\\n      } @else {\\n        box-shadow: 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5);\\n      }\\n    }\\n  }\\n}\\n\\n@mixin button-outline-variant($color, $color-hover: color-yiq($color), $active-background: $color, $active-border: $color) {\\n  color: $color;\\n  border-color: $color;\\n\\n  @include hover {\\n    color: $color-hover;\\n    background-color: $active-background;\\n    border-color: $active-border;\\n  }\\n\\n  &:focus,\\n  &.focus {\\n    box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);\\n  }\\n\\n  &.disabled,\\n  &:disabled {\\n    color: $color;\\n    background-color: transparent;\\n  }\\n\\n  &:not(:disabled):not(.disabled):active,\\n  &:not(:disabled):not(.disabled).active,\\n  .show > &.dropdown-toggle {\\n    color: color-yiq($active-background);\\n    background-color: $active-background;\\n    border-color: $active-border;\\n\\n    &:focus {\\n      // Avoid using mixin so we can pass custom focus shadow properly\\n      @if $enable-shadows and $btn-active-box-shadow != none {\\n        box-shadow: $btn-active-box-shadow, 0 0 0 $btn-focus-width rgba($color, .5);\\n      } @else {\\n        box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);\\n      }\\n    }\\n  }\\n}\\n\\n// Button sizes\\n@mixin button-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) {\\n  padding: $padding-y $padding-x;\\n  @include font-size($font-size);\\n  line-height: $line-height;\\n  // Manually declare to provide an override to the browser default\\n  @include border-radius($border-radius, 0);\\n}\\n\",\".fade {\\n  @include transition($transition-fade);\\n\\n  &:not(.show) {\\n    opacity: 0;\\n  }\\n}\\n\\n.collapse {\\n  &:not(.show) {\\n    display: none;\\n  }\\n}\\n\\n.collapsing {\\n  position: relative;\\n  height: 0;\\n  overflow: hidden;\\n  @include transition($transition-collapse);\\n}\\n\",\"// The dropdown wrapper (`<div>`)\\n.dropup,\\n.dropright,\\n.dropdown,\\n.dropleft {\\n  position: relative;\\n}\\n\\n.dropdown-toggle {\\n  white-space: nowrap;\\n\\n  // Generate the caret automatically\\n  @include caret;\\n}\\n\\n// The dropdown menu\\n.dropdown-menu {\\n  position: absolute;\\n  top: 100%;\\n  left: 0;\\n  z-index: $zindex-dropdown;\\n  display: none; // none by default, but block on \\\"open\\\" of the menu\\n  float: left;\\n  min-width: $dropdown-min-width;\\n  padding: $dropdown-padding-y 0;\\n  margin: $dropdown-spacer 0 0; // override default ul\\n  @include font-size($dropdown-font-size);\\n  color: $dropdown-color;\\n  text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\\n  list-style: none;\\n  background-color: $dropdown-bg;\\n  background-clip: padding-box;\\n  border: $dropdown-border-width solid $dropdown-border-color;\\n  @include border-radius($dropdown-border-radius);\\n  @include box-shadow($dropdown-box-shadow);\\n}\\n\\n@each $breakpoint in map-keys($grid-breakpoints) {\\n  @include media-breakpoint-up($breakpoint) {\\n    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\\n\\n    .dropdown-menu#{$infix}-left {\\n      right: auto;\\n      left: 0;\\n    }\\n\\n    .dropdown-menu#{$infix}-right {\\n      right: 0;\\n      left: auto;\\n    }\\n  }\\n}\\n\\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\\n// Just add .dropup after the standard .dropdown class and you're set.\\n.dropup {\\n  .dropdown-menu {\\n    top: auto;\\n    bottom: 100%;\\n    margin-top: 0;\\n    margin-bottom: $dropdown-spacer;\\n  }\\n\\n  .dropdown-toggle {\\n    @include caret(up);\\n  }\\n}\\n\\n.dropright {\\n  .dropdown-menu {\\n    top: 0;\\n    right: auto;\\n    left: 100%;\\n    margin-top: 0;\\n    margin-left: $dropdown-spacer;\\n  }\\n\\n  .dropdown-toggle {\\n    @include caret(right);\\n    &::after {\\n      vertical-align: 0;\\n    }\\n  }\\n}\\n\\n.dropleft {\\n  .dropdown-menu {\\n    top: 0;\\n    right: 100%;\\n    left: auto;\\n    margin-top: 0;\\n    margin-right: $dropdown-spacer;\\n  }\\n\\n  .dropdown-toggle {\\n    @include caret(left);\\n    &::before {\\n      vertical-align: 0;\\n    }\\n  }\\n}\\n\\n// When enabled Popper.js, reset basic dropdown position\\n// stylelint-disable-next-line no-duplicate-selectors\\n.dropdown-menu {\\n  &[x-placement^=\\\"top\\\"],\\n  &[x-placement^=\\\"right\\\"],\\n  &[x-placement^=\\\"bottom\\\"],\\n  &[x-placement^=\\\"left\\\"] {\\n    right: auto;\\n    bottom: auto;\\n  }\\n}\\n\\n// Dividers (basically an `<hr>`) within the dropdown\\n.dropdown-divider {\\n  @include nav-divider($dropdown-divider-bg, $dropdown-divider-margin-y);\\n}\\n\\n// Links, buttons, and more within the dropdown menu\\n//\\n// `<button>`-specific styles are denoted with `// For <button>s`\\n.dropdown-item {\\n  display: block;\\n  width: 100%; // For `<button>`s\\n  padding: $dropdown-item-padding-y $dropdown-item-padding-x;\\n  clear: both;\\n  font-weight: $font-weight-normal;\\n  color: $dropdown-link-color;\\n  text-align: inherit; // For `<button>`s\\n  white-space: nowrap; // prevent links from randomly breaking onto new lines\\n  background-color: transparent; // For `<button>`s\\n  border: 0; // For `<button>`s\\n\\n  // Prevent dropdown overflow if there's no padding\\n  // See https://github.com/twbs/bootstrap/pull/27703\\n  @if $dropdown-padding-y == 0 {\\n    &:first-child {\\n      @include border-top-radius($dropdown-inner-border-radius);\\n    }\\n\\n    &:last-child {\\n      @include border-bottom-radius($dropdown-inner-border-radius);\\n    }\\n  }\\n\\n  @include hover-focus {\\n    color: $dropdown-link-hover-color;\\n    text-decoration: none;\\n    @include gradient-bg($dropdown-link-hover-bg);\\n  }\\n\\n  &.active,\\n  &:active {\\n    color: $dropdown-link-active-color;\\n    text-decoration: none;\\n    @include gradient-bg($dropdown-link-active-bg);\\n  }\\n\\n  &.disabled,\\n  &:disabled {\\n    color: $dropdown-link-disabled-color;\\n    pointer-events: none;\\n    background-color: transparent;\\n    // Remove CSS gradients if they're enabled\\n    @if $enable-gradients {\\n      background-image: none;\\n    }\\n  }\\n}\\n\\n.dropdown-menu.show {\\n  display: block;\\n}\\n\\n// Dropdown section headers\\n.dropdown-header {\\n  display: block;\\n  padding: $dropdown-padding-y $dropdown-item-padding-x;\\n  margin-bottom: 0; // for use with heading elements\\n  @include font-size($font-size-sm);\\n  color: $dropdown-header-color;\\n  white-space: nowrap; // as with > li > a\\n}\\n\\n// Dropdown text\\n.dropdown-item-text {\\n  display: block;\\n  padding: $dropdown-item-padding-y $dropdown-item-padding-x;\\n  color: $dropdown-link-color;\\n}\\n\",\"@mixin caret-down {\\n  border-top: $caret-width solid;\\n  border-right: $caret-width solid transparent;\\n  border-bottom: 0;\\n  border-left: $caret-width solid transparent;\\n}\\n\\n@mixin caret-up {\\n  border-top: 0;\\n  border-right: $caret-width solid transparent;\\n  border-bottom: $caret-width solid;\\n  border-left: $caret-width solid transparent;\\n}\\n\\n@mixin caret-right {\\n  border-top: $caret-width solid transparent;\\n  border-right: 0;\\n  border-bottom: $caret-width solid transparent;\\n  border-left: $caret-width solid;\\n}\\n\\n@mixin caret-left {\\n  border-top: $caret-width solid transparent;\\n  border-right: $caret-width solid;\\n  border-bottom: $caret-width solid transparent;\\n}\\n\\n@mixin caret($direction: down) {\\n  @if $enable-caret {\\n    &::after {\\n      display: inline-block;\\n      margin-left: $caret-spacing;\\n      vertical-align: $caret-vertical-align;\\n      content: \\\"\\\";\\n      @if $direction == down {\\n        @include caret-down;\\n      } @else if $direction == up {\\n        @include caret-up;\\n      } @else if $direction == right {\\n        @include caret-right;\\n      }\\n    }\\n\\n    @if $direction == left {\\n      &::after {\\n        display: none;\\n      }\\n\\n      &::before {\\n        display: inline-block;\\n        margin-right: $caret-spacing;\\n        vertical-align: $caret-vertical-align;\\n        content: \\\"\\\";\\n        @include caret-left;\\n      }\\n    }\\n\\n    &:empty::after {\\n      margin-left: 0;\\n    }\\n  }\\n}\\n\",\"// Horizontal dividers\\n//\\n// Dividers (basically an hr) within dropdowns and nav lists\\n\\n@mixin nav-divider($color: $nav-divider-color, $margin-y: $nav-divider-margin-y) {\\n  height: 0;\\n  margin: $margin-y 0;\\n  overflow: hidden;\\n  border-top: 1px solid $color;\\n}\\n\",\"// stylelint-disable selector-no-qualifying-type\\n\\n// Make the div behave like a button\\n.btn-group,\\n.btn-group-vertical {\\n  position: relative;\\n  display: inline-flex;\\n  vertical-align: middle; // match .btn alignment given font-size hack above\\n\\n  > .btn {\\n    position: relative;\\n    flex: 1 1 auto;\\n\\n    // Bring the hover, focused, and \\\"active\\\" buttons to the front to overlay\\n    // the borders properly\\n    @include hover {\\n      z-index: 1;\\n    }\\n    &:focus,\\n    &:active,\\n    &.active {\\n      z-index: 1;\\n    }\\n  }\\n}\\n\\n// Optional: Group multiple button groups together for a toolbar\\n.btn-toolbar {\\n  display: flex;\\n  flex-wrap: wrap;\\n  justify-content: flex-start;\\n\\n  .input-group {\\n    width: auto;\\n  }\\n}\\n\\n.btn-group {\\n  // Prevent double borders when buttons are next to each other\\n  > .btn:not(:first-child),\\n  > .btn-group:not(:first-child) {\\n    margin-left: -$btn-border-width;\\n  }\\n\\n  // Reset rounded corners\\n  > .btn:not(:last-child):not(.dropdown-toggle),\\n  > .btn-group:not(:last-child) > .btn {\\n    @include border-right-radius(0);\\n  }\\n\\n  > .btn:not(:first-child),\\n  > .btn-group:not(:first-child) > .btn {\\n    @include border-left-radius(0);\\n  }\\n}\\n\\n// Sizing\\n//\\n// Remix the default button sizing classes into new ones for easier manipulation.\\n\\n.btn-group-sm > .btn { @extend .btn-sm; }\\n.btn-group-lg > .btn { @extend .btn-lg; }\\n\\n\\n//\\n// Split button dropdowns\\n//\\n\\n.dropdown-toggle-split {\\n  padding-right: $btn-padding-x * .75;\\n  padding-left: $btn-padding-x * .75;\\n\\n  &::after,\\n  .dropup &::after,\\n  .dropright &::after {\\n    margin-left: 0;\\n  }\\n\\n  .dropleft &::before {\\n    margin-right: 0;\\n  }\\n}\\n\\n.btn-sm + .dropdown-toggle-split {\\n  padding-right: $btn-padding-x-sm * .75;\\n  padding-left: $btn-padding-x-sm * .75;\\n}\\n\\n.btn-lg + .dropdown-toggle-split {\\n  padding-right: $btn-padding-x-lg * .75;\\n  padding-left: $btn-padding-x-lg * .75;\\n}\\n\\n\\n// The clickable button for toggling the menu\\n// Set the same inset shadow as the :active state\\n.btn-group.show .dropdown-toggle {\\n  @include box-shadow($btn-active-box-shadow);\\n\\n  // Show no shadow for `.btn-link` since it has no other button styles.\\n  &.btn-link {\\n    @include box-shadow(none);\\n  }\\n}\\n\\n\\n//\\n// Vertical button groups\\n//\\n\\n.btn-group-vertical {\\n  flex-direction: column;\\n  align-items: flex-start;\\n  justify-content: center;\\n\\n  > .btn,\\n  > .btn-group {\\n    width: 100%;\\n  }\\n\\n  > .btn:not(:first-child),\\n  > .btn-group:not(:first-child) {\\n    margin-top: -$btn-border-width;\\n  }\\n\\n  // Reset rounded corners\\n  > .btn:not(:last-child):not(.dropdown-toggle),\\n  > .btn-group:not(:last-child) > .btn {\\n    @include border-bottom-radius(0);\\n  }\\n\\n  > .btn:not(:first-child),\\n  > .btn-group:not(:first-child) > .btn {\\n    @include border-top-radius(0);\\n  }\\n}\\n\\n\\n// Checkbox and radio options\\n//\\n// In order to support the browser's form validation feedback, powered by the\\n// `required` attribute, we have to \\\"hide\\\" the inputs via `clip`. We cannot use\\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\\n// certain cases which is prevented by using `clip` and `pointer-events`.\\n// This way, we ensure a DOM element is visible to position the popover from.\\n//\\n// See https://github.com/twbs/bootstrap/pull/12794 and\\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\\n\\n.btn-group-toggle {\\n  > .btn,\\n  > .btn-group > .btn {\\n    margin-bottom: 0; // Override default `<label>` value\\n\\n    input[type=\\\"radio\\\"],\\n    input[type=\\\"checkbox\\\"] {\\n      position: absolute;\\n      clip: rect(0, 0, 0, 0);\\n      pointer-events: none;\\n    }\\n  }\\n}\\n\",\"// stylelint-disable selector-no-qualifying-type\\n\\n//\\n// Base styles\\n//\\n\\n.input-group {\\n  position: relative;\\n  display: flex;\\n  flex-wrap: wrap; // For form validation feedback\\n  align-items: stretch;\\n  width: 100%;\\n\\n  > .form-control,\\n  > .form-control-plaintext,\\n  > .custom-select,\\n  > .custom-file {\\n    position: relative; // For focus state's z-index\\n    flex: 1 1 auto;\\n    // Add width 1% and flex-basis auto to ensure that button will not wrap out\\n    // the column. Applies to IE Edge+ and Firefox. Chrome does not require this.\\n    width: 1%;\\n    margin-bottom: 0;\\n\\n    + .form-control,\\n    + .custom-select,\\n    + .custom-file {\\n      margin-left: -$input-border-width;\\n    }\\n  }\\n\\n  // Bring the \\\"active\\\" form control to the top of surrounding elements\\n  > .form-control:focus,\\n  > .custom-select:focus,\\n  > .custom-file .custom-file-input:focus ~ .custom-file-label {\\n    z-index: 3;\\n  }\\n\\n  // Bring the custom file input above the label\\n  > .custom-file .custom-file-input:focus {\\n    z-index: 4;\\n  }\\n\\n  > .form-control,\\n  > .custom-select {\\n    &:not(:last-child) { @include border-right-radius(0); }\\n    &:not(:first-child) { @include border-left-radius(0); }\\n  }\\n\\n  // Custom file inputs have more complex markup, thus requiring different\\n  // border-radius overrides.\\n  > .custom-file {\\n    display: flex;\\n    align-items: center;\\n\\n    &:not(:last-child) .custom-file-label,\\n    &:not(:last-child) .custom-file-label::after { @include border-right-radius(0); }\\n    &:not(:first-child) .custom-file-label { @include border-left-radius(0); }\\n  }\\n}\\n\\n\\n// Prepend and append\\n//\\n// While it requires one extra layer of HTML for each, dedicated prepend and\\n// append elements allow us to 1) be less clever, 2) simplify our selectors, and\\n// 3) support HTML5 form validation.\\n\\n.input-group-prepend,\\n.input-group-append {\\n  display: flex;\\n\\n  // Ensure buttons are always above inputs for more visually pleasing borders.\\n  // This isn't needed for `.input-group-text` since it shares the same border-color\\n  // as our inputs.\\n  .btn {\\n    position: relative;\\n    z-index: 2;\\n\\n    &:focus {\\n      z-index: 3;\\n    }\\n  }\\n\\n  .btn + .btn,\\n  .btn + .input-group-text,\\n  .input-group-text + .input-group-text,\\n  .input-group-text + .btn {\\n    margin-left: -$input-border-width;\\n  }\\n}\\n\\n.input-group-prepend { margin-right: -$input-border-width; }\\n.input-group-append { margin-left: -$input-border-width; }\\n\\n\\n// Textual addons\\n//\\n// Serves as a catch-all element for any text or radio/checkbox input you wish\\n// to prepend or append to an input.\\n\\n.input-group-text {\\n  display: flex;\\n  align-items: center;\\n  padding: $input-padding-y $input-padding-x;\\n  margin-bottom: 0; // Allow use of <label> elements by overriding our default margin-bottom\\n  @include font-size($input-font-size); // Match inputs\\n  font-weight: $font-weight-normal;\\n  line-height: $input-line-height;\\n  color: $input-group-addon-color;\\n  text-align: center;\\n  white-space: nowrap;\\n  background-color: $input-group-addon-bg;\\n  border: $input-border-width solid $input-group-addon-border-color;\\n  @include border-radius($input-border-radius);\\n\\n  // Nuke default margins from checkboxes and radios to vertically center within.\\n  input[type=\\\"radio\\\"],\\n  input[type=\\\"checkbox\\\"] {\\n    margin-top: 0;\\n  }\\n}\\n\\n\\n// Sizing\\n//\\n// Remix the default form control sizing classes into new ones for easier\\n// manipulation.\\n\\n.input-group-lg > .form-control:not(textarea),\\n.input-group-lg > .custom-select {\\n  height: $input-height-lg;\\n}\\n\\n.input-group-lg > .form-control,\\n.input-group-lg > .custom-select,\\n.input-group-lg > .input-group-prepend > .input-group-text,\\n.input-group-lg > .input-group-append > .input-group-text,\\n.input-group-lg > .input-group-prepend > .btn,\\n.input-group-lg > .input-group-append > .btn {\\n  padding: $input-padding-y-lg $input-padding-x-lg;\\n  @include font-size($input-font-size-lg);\\n  line-height: $input-line-height-lg;\\n  @include border-radius($input-border-radius-lg);\\n}\\n\\n.input-group-sm > .form-control:not(textarea),\\n.input-group-sm > .custom-select {\\n  height: $input-height-sm;\\n}\\n\\n.input-group-sm > .form-control,\\n.input-group-sm > .custom-select,\\n.input-group-sm > .input-group-prepend > .input-group-text,\\n.input-group-sm > .input-group-append > .input-group-text,\\n.input-group-sm > .input-group-prepend > .btn,\\n.input-group-sm > .input-group-append > .btn {\\n  padding: $input-padding-y-sm $input-padding-x-sm;\\n  @include font-size($input-font-size-sm);\\n  line-height: $input-line-height-sm;\\n  @include border-radius($input-border-radius-sm);\\n}\\n\\n.input-group-lg > .custom-select,\\n.input-group-sm > .custom-select {\\n  padding-right: $custom-select-padding-x + $custom-select-indicator-padding;\\n}\\n\\n\\n// Prepend and append rounded corners\\n//\\n// These rulesets must come after the sizing ones to properly override sm and lg\\n// border-radius values when extending. They're more specific than we'd like\\n// with the `.input-group >` part, but without it, we cannot override the sizing.\\n\\n\\n.input-group > .input-group-prepend > .btn,\\n.input-group > .input-group-prepend > .input-group-text,\\n.input-group > .input-group-append:not(:last-child) > .btn,\\n.input-group > .input-group-append:not(:last-child) > .input-group-text,\\n.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),\\n.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {\\n  @include border-right-radius(0);\\n}\\n\\n.input-group > .input-group-append > .btn,\\n.input-group > .input-group-append > .input-group-text,\\n.input-group > .input-group-prepend:not(:first-child) > .btn,\\n.input-group > .input-group-prepend:not(:first-child) > .input-group-text,\\n.input-group > .input-group-prepend:first-child > .btn:not(:first-child),\\n.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {\\n  @include border-left-radius(0);\\n}\\n\",\"// Embedded icons from Open Iconic.\\n// Released under MIT and copyright 2014 Waybury.\\n// https://useiconic.com/open\\n\\n\\n// Checkboxes and radios\\n//\\n// Base class takes care of all the key behavioral aspects.\\n\\n.custom-control {\\n  position: relative;\\n  display: block;\\n  min-height: $font-size-base * $line-height-base;\\n  padding-left: $custom-control-gutter + $custom-control-indicator-size;\\n}\\n\\n.custom-control-inline {\\n  display: inline-flex;\\n  margin-right: $custom-control-spacer-x;\\n}\\n\\n.custom-control-input {\\n  position: absolute;\\n  z-index: -1; // Put the input behind the label so it doesn't overlay text\\n  opacity: 0;\\n\\n  &:checked ~ .custom-control-label::before {\\n    color: $custom-control-indicator-checked-color;\\n    border-color: $custom-control-indicator-checked-border-color;\\n    @include gradient-bg($custom-control-indicator-checked-bg);\\n    @include box-shadow($custom-control-indicator-checked-box-shadow);\\n  }\\n\\n  &:focus ~ .custom-control-label::before {\\n    // the mixin is not used here to make sure there is feedback\\n    @if $enable-shadows {\\n      box-shadow: $input-box-shadow, $input-focus-box-shadow;\\n    } @else {\\n      box-shadow: $custom-control-indicator-focus-box-shadow;\\n    }\\n  }\\n\\n  &:focus:not(:checked) ~ .custom-control-label::before {\\n    border-color: $custom-control-indicator-focus-border-color;\\n  }\\n\\n  &:not(:disabled):active ~ .custom-control-label::before {\\n    color: $custom-control-indicator-active-color;\\n    background-color: $custom-control-indicator-active-bg;\\n    border-color: $custom-control-indicator-active-border-color;\\n    @include box-shadow($custom-control-indicator-active-box-shadow);\\n  }\\n\\n  &:disabled {\\n    ~ .custom-control-label {\\n      color: $custom-control-label-disabled-color;\\n\\n      &::before {\\n        background-color: $custom-control-indicator-disabled-bg;\\n      }\\n    }\\n  }\\n}\\n\\n// Custom control indicators\\n//\\n// Build the custom controls out of pseudo-elements.\\n\\n.custom-control-label {\\n  position: relative;\\n  margin-bottom: 0;\\n  vertical-align: top;\\n\\n  // Background-color and (when enabled) gradient\\n  &::before {\\n    position: absolute;\\n    top: ($font-size-base * $line-height-base - $custom-control-indicator-size) / 2;\\n    left: -($custom-control-gutter + $custom-control-indicator-size);\\n    display: block;\\n    width: $custom-control-indicator-size;\\n    height: $custom-control-indicator-size;\\n    pointer-events: none;\\n    content: \\\"\\\";\\n    background-color: $custom-control-indicator-bg;\\n    border: $custom-control-indicator-border-color solid $custom-control-indicator-border-width;\\n    @include box-shadow($custom-control-indicator-box-shadow);\\n  }\\n\\n  // Foreground (icon)\\n  &::after {\\n    position: absolute;\\n    top: ($font-size-base * $line-height-base - $custom-control-indicator-size) / 2;\\n    left: -($custom-control-gutter + $custom-control-indicator-size);\\n    display: block;\\n    width: $custom-control-indicator-size;\\n    height: $custom-control-indicator-size;\\n    content: \\\"\\\";\\n    background: no-repeat 50% / #{$custom-control-indicator-bg-size};\\n  }\\n}\\n\\n\\n// Checkboxes\\n//\\n// Tweak just a few things for checkboxes.\\n\\n.custom-checkbox {\\n  .custom-control-label::before {\\n    @include border-radius($custom-checkbox-indicator-border-radius);\\n  }\\n\\n  .custom-control-input:checked ~ .custom-control-label {\\n    &::after {\\n      background-image: $custom-checkbox-indicator-icon-checked;\\n    }\\n  }\\n\\n  .custom-control-input:indeterminate ~ .custom-control-label {\\n    &::before {\\n      border-color: $custom-checkbox-indicator-indeterminate-border-color;\\n      @include gradient-bg($custom-checkbox-indicator-indeterminate-bg);\\n      @include box-shadow($custom-checkbox-indicator-indeterminate-box-shadow);\\n    }\\n    &::after {\\n      background-image: $custom-checkbox-indicator-icon-indeterminate;\\n    }\\n  }\\n\\n  .custom-control-input:disabled {\\n    &:checked ~ .custom-control-label::before {\\n      background-color: $custom-control-indicator-checked-disabled-bg;\\n    }\\n    &:indeterminate ~ .custom-control-label::before {\\n      background-color: $custom-control-indicator-checked-disabled-bg;\\n    }\\n  }\\n}\\n\\n// Radios\\n//\\n// Tweak just a few things for radios.\\n\\n.custom-radio {\\n  .custom-control-label::before {\\n    // stylelint-disable-next-line property-blacklist\\n    border-radius: $custom-radio-indicator-border-radius;\\n  }\\n\\n  .custom-control-input:checked ~ .custom-control-label {\\n    &::after {\\n      background-image: $custom-radio-indicator-icon-checked;\\n    }\\n  }\\n\\n  .custom-control-input:disabled {\\n    &:checked ~ .custom-control-label::before {\\n      background-color: $custom-control-indicator-checked-disabled-bg;\\n    }\\n  }\\n}\\n\\n\\n// switches\\n//\\n// Tweak a few things for switches\\n\\n.custom-switch {\\n  padding-left: $custom-switch-width + $custom-control-gutter;\\n\\n  .custom-control-label {\\n    &::before {\\n      left: -($custom-switch-width + $custom-control-gutter);\\n      width: $custom-switch-width;\\n      pointer-events: all;\\n      // stylelint-disable-next-line property-blacklist\\n      border-radius: $custom-switch-indicator-border-radius;\\n    }\\n\\n    &::after {\\n      top: calc(#{(($font-size-base * $line-height-base - $custom-control-indicator-size) / 2)} + #{$custom-control-indicator-border-width * 2});\\n      left: calc(#{-($custom-switch-width + $custom-control-gutter)} + #{$custom-control-indicator-border-width * 2});\\n      width: $custom-switch-indicator-size;\\n      height: $custom-switch-indicator-size;\\n      background-color: $custom-control-indicator-border-color;\\n      // stylelint-disable-next-line property-blacklist\\n      border-radius: $custom-switch-indicator-border-radius;\\n      @include transition(transform .15s ease-in-out, $custom-forms-transition);\\n    }\\n  }\\n\\n  .custom-control-input:checked ~ .custom-control-label {\\n    &::after {\\n      background-color: $custom-control-indicator-bg;\\n      transform: translateX($custom-switch-width - $custom-control-indicator-size);\\n    }\\n  }\\n\\n  .custom-control-input:disabled {\\n    &:checked ~ .custom-control-label::before {\\n      background-color: $custom-control-indicator-checked-disabled-bg;\\n    }\\n  }\\n}\\n\\n\\n// Select\\n//\\n// Replaces the browser default select with a custom one, mostly pulled from\\n// https://primer.github.io/.\\n//\\n\\n.custom-select {\\n  display: inline-block;\\n  width: 100%;\\n  height: $custom-select-height;\\n  padding: $custom-select-padding-y ($custom-select-padding-x + $custom-select-indicator-padding) $custom-select-padding-y $custom-select-padding-x;\\n  font-family: $custom-select-font-family;\\n  @include font-size($custom-select-font-size);\\n  font-weight: $custom-select-font-weight;\\n  line-height: $custom-select-line-height;\\n  color: $custom-select-color;\\n  vertical-align: middle;\\n  background: $custom-select-background;\\n  background-color: $custom-select-bg;\\n  border: $custom-select-border-width solid $custom-select-border-color;\\n  @include border-radius($custom-select-border-radius, 0);\\n  @include box-shadow($custom-select-box-shadow);\\n  appearance: none;\\n\\n  &:focus {\\n    border-color: $custom-select-focus-border-color;\\n    outline: 0;\\n    @if $enable-shadows {\\n      box-shadow: $custom-select-box-shadow, $custom-select-focus-box-shadow;\\n    } @else {\\n      box-shadow: $custom-select-focus-box-shadow;\\n    }\\n\\n    &::-ms-value {\\n      // For visual consistency with other platforms/browsers,\\n      // suppress the default white text on blue background highlight given to\\n      // the selected option text when the (still closed) <select> receives focus\\n      // in IE and (under certain conditions) Edge.\\n      // See https://github.com/twbs/bootstrap/issues/19398.\\n      color: $input-color;\\n      background-color: $input-bg;\\n    }\\n  }\\n\\n  &[multiple],\\n  &[size]:not([size=\\\"1\\\"]) {\\n    height: auto;\\n    padding-right: $custom-select-padding-x;\\n    background-image: none;\\n  }\\n\\n  &:disabled {\\n    color: $custom-select-disabled-color;\\n    background-color: $custom-select-disabled-bg;\\n  }\\n\\n  // Hides the default caret in IE11\\n  &::-ms-expand {\\n    display: none;\\n  }\\n}\\n\\n.custom-select-sm {\\n  height: $custom-select-height-sm;\\n  padding-top: $custom-select-padding-y-sm;\\n  padding-bottom: $custom-select-padding-y-sm;\\n  padding-left: $custom-select-padding-x-sm;\\n  @include font-size($custom-select-font-size-sm);\\n}\\n\\n.custom-select-lg {\\n  height: $custom-select-height-lg;\\n  padding-top: $custom-select-padding-y-lg;\\n  padding-bottom: $custom-select-padding-y-lg;\\n  padding-left: $custom-select-padding-x-lg;\\n  @include font-size($custom-select-font-size-lg);\\n}\\n\\n\\n// File\\n//\\n// Custom file input.\\n\\n.custom-file {\\n  position: relative;\\n  display: inline-block;\\n  width: 100%;\\n  height: $custom-file-height;\\n  margin-bottom: 0;\\n}\\n\\n.custom-file-input {\\n  position: relative;\\n  z-index: 2;\\n  width: 100%;\\n  height: $custom-file-height;\\n  margin: 0;\\n  opacity: 0;\\n\\n  &:focus ~ .custom-file-label {\\n    border-color: $custom-file-focus-border-color;\\n    box-shadow: $custom-file-focus-box-shadow;\\n  }\\n\\n  &:disabled ~ .custom-file-label {\\n    background-color: $custom-file-disabled-bg;\\n  }\\n\\n  @each $lang, $value in $custom-file-text {\\n    &:lang(#{$lang}) ~ .custom-file-label::after {\\n      content: $value;\\n    }\\n  }\\n\\n  ~ .custom-file-label[data-browse]::after {\\n    content: attr(data-browse);\\n  }\\n}\\n\\n.custom-file-label {\\n  position: absolute;\\n  top: 0;\\n  right: 0;\\n  left: 0;\\n  z-index: 1;\\n  height: $custom-file-height;\\n  padding: $custom-file-padding-y $custom-file-padding-x;\\n  font-family: $custom-file-font-family;\\n  font-weight: $custom-file-font-weight;\\n  line-height: $custom-file-line-height;\\n  color: $custom-file-color;\\n  background-color: $custom-file-bg;\\n  border: $custom-file-border-width solid $custom-file-border-color;\\n  @include border-radius($custom-file-border-radius);\\n  @include box-shadow($custom-file-box-shadow);\\n\\n  &::after {\\n    position: absolute;\\n    top: 0;\\n    right: 0;\\n    bottom: 0;\\n    z-index: 3;\\n    display: block;\\n    height: $custom-file-height-inner;\\n    padding: $custom-file-padding-y $custom-file-padding-x;\\n    line-height: $custom-file-line-height;\\n    color: $custom-file-button-color;\\n    content: \\\"Browse\\\";\\n    @include gradient-bg($custom-file-button-bg);\\n    border-left: inherit;\\n    @include border-radius(0 $custom-file-border-radius $custom-file-border-radius 0);\\n  }\\n}\\n\\n// Range\\n//\\n// Style range inputs the same across browsers. Vendor-specific rules for pseudo\\n// elements cannot be mixed. As such, there are no shared styles for focus or\\n// active states on prefixed selectors.\\n\\n.custom-range {\\n  width: 100%;\\n  height: calc(#{$custom-range-thumb-height} + #{$custom-range-thumb-focus-box-shadow-width * 2});\\n  padding: 0; // Need to reset padding\\n  background-color: transparent;\\n  appearance: none;\\n\\n  &:focus {\\n    outline: none;\\n\\n    // Pseudo-elements must be split across multiple rulesets to have an effect.\\n    // No box-shadow() mixin for focus accessibility.\\n    &::-webkit-slider-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }\\n    &::-moz-range-thumb     { box-shadow: $custom-range-thumb-focus-box-shadow; }\\n    &::-ms-thumb            { box-shadow: $custom-range-thumb-focus-box-shadow; }\\n  }\\n\\n  &::-moz-focus-outer {\\n    border: 0;\\n  }\\n\\n  &::-webkit-slider-thumb {\\n    width: $custom-range-thumb-width;\\n    height: $custom-range-thumb-height;\\n    margin-top: ($custom-range-track-height - $custom-range-thumb-height) / 2; // Webkit specific\\n    @include gradient-bg($custom-range-thumb-bg);\\n    border: $custom-range-thumb-border;\\n    @include border-radius($custom-range-thumb-border-radius);\\n    @include box-shadow($custom-range-thumb-box-shadow);\\n    @include transition($custom-forms-transition);\\n    appearance: none;\\n\\n    &:active {\\n      @include gradient-bg($custom-range-thumb-active-bg);\\n    }\\n  }\\n\\n  &::-webkit-slider-runnable-track {\\n    width: $custom-range-track-width;\\n    height: $custom-range-track-height;\\n    color: transparent; // Why?\\n    cursor: $custom-range-track-cursor;\\n    background-color: $custom-range-track-bg;\\n    border-color: transparent;\\n    @include border-radius($custom-range-track-border-radius);\\n    @include box-shadow($custom-range-track-box-shadow);\\n  }\\n\\n  &::-moz-range-thumb {\\n    width: $custom-range-thumb-width;\\n    height: $custom-range-thumb-height;\\n    @include gradient-bg($custom-range-thumb-bg);\\n    border: $custom-range-thumb-border;\\n    @include border-radius($custom-range-thumb-border-radius);\\n    @include box-shadow($custom-range-thumb-box-shadow);\\n    @include transition($custom-forms-transition);\\n    appearance: none;\\n\\n    &:active {\\n      @include gradient-bg($custom-range-thumb-active-bg);\\n    }\\n  }\\n\\n  &::-moz-range-track {\\n    width: $custom-range-track-width;\\n    height: $custom-range-track-height;\\n    color: transparent;\\n    cursor: $custom-range-track-cursor;\\n    background-color: $custom-range-track-bg;\\n    border-color: transparent; // Firefox specific?\\n    @include border-radius($custom-range-track-border-radius);\\n    @include box-shadow($custom-range-track-box-shadow);\\n  }\\n\\n  &::-ms-thumb {\\n    width: $custom-range-thumb-width;\\n    height: $custom-range-thumb-height;\\n    margin-top: 0; // Edge specific\\n    margin-right: $custom-range-thumb-focus-box-shadow-width; // Workaround that overflowed box-shadow is hidden.\\n    margin-left: $custom-range-thumb-focus-box-shadow-width;  // Workaround that overflowed box-shadow is hidden.\\n    @include gradient-bg($custom-range-thumb-bg);\\n    border: $custom-range-thumb-border;\\n    @include border-radius($custom-range-thumb-border-radius);\\n    @include box-shadow($custom-range-thumb-box-shadow);\\n    @include transition($custom-forms-transition);\\n    appearance: none;\\n\\n    &:active {\\n      @include gradient-bg($custom-range-thumb-active-bg);\\n    }\\n  }\\n\\n  &::-ms-track {\\n    width: $custom-range-track-width;\\n    height: $custom-range-track-height;\\n    color: transparent;\\n    cursor: $custom-range-track-cursor;\\n    background-color: transparent;\\n    border-color: transparent;\\n    border-width: $custom-range-thumb-height / 2;\\n    @include box-shadow($custom-range-track-box-shadow);\\n  }\\n\\n  &::-ms-fill-lower {\\n    background-color: $custom-range-track-bg;\\n    @include border-radius($custom-range-track-border-radius);\\n  }\\n\\n  &::-ms-fill-upper {\\n    margin-right: 15px; // arbitrary?\\n    background-color: $custom-range-track-bg;\\n    @include border-radius($custom-range-track-border-radius);\\n  }\\n\\n  &:disabled {\\n    &::-webkit-slider-thumb {\\n      background-color: $custom-range-thumb-disabled-bg;\\n    }\\n\\n    &::-webkit-slider-runnable-track {\\n      cursor: default;\\n    }\\n\\n    &::-moz-range-thumb {\\n      background-color: $custom-range-thumb-disabled-bg;\\n    }\\n\\n    &::-moz-range-track {\\n      cursor: default;\\n    }\\n\\n    &::-ms-thumb {\\n      background-color: $custom-range-thumb-disabled-bg;\\n    }\\n  }\\n}\\n\\n.custom-control-label::before,\\n.custom-file-label,\\n.custom-select {\\n  @include transition($custom-forms-transition);\\n}\\n\",\"// Base class\\n//\\n// Kickstart any navigation component with a set of style resets. Works with\\n// `<nav>`s or `<ul>`s.\\n\\n.nav {\\n  display: flex;\\n  flex-wrap: wrap;\\n  padding-left: 0;\\n  margin-bottom: 0;\\n  list-style: none;\\n}\\n\\n.nav-link {\\n  display: block;\\n  padding: $nav-link-padding-y $nav-link-padding-x;\\n\\n  @include hover-focus {\\n    text-decoration: none;\\n  }\\n\\n  // Disabled state lightens text\\n  &.disabled {\\n    color: $nav-link-disabled-color;\\n    pointer-events: none;\\n    cursor: default;\\n  }\\n}\\n\\n//\\n// Tabs\\n//\\n\\n.nav-tabs {\\n  border-bottom: $nav-tabs-border-width solid $nav-tabs-border-color;\\n\\n  .nav-item {\\n    margin-bottom: -$nav-tabs-border-width;\\n  }\\n\\n  .nav-link {\\n    border: $nav-tabs-border-width solid transparent;\\n    @include border-top-radius($nav-tabs-border-radius);\\n\\n    @include hover-focus {\\n      border-color: $nav-tabs-link-hover-border-color;\\n    }\\n\\n    &.disabled {\\n      color: $nav-link-disabled-color;\\n      background-color: transparent;\\n      border-color: transparent;\\n    }\\n  }\\n\\n  .nav-link.active,\\n  .nav-item.show .nav-link {\\n    color: $nav-tabs-link-active-color;\\n    background-color: $nav-tabs-link-active-bg;\\n    border-color: $nav-tabs-link-active-border-color;\\n  }\\n\\n  .dropdown-menu {\\n    // Make dropdown border overlap tab border\\n    margin-top: -$nav-tabs-border-width;\\n    // Remove the top rounded corners here since there is a hard edge above the menu\\n    @include border-top-radius(0);\\n  }\\n}\\n\\n\\n//\\n// Pills\\n//\\n\\n.nav-pills {\\n  .nav-link {\\n    @include border-radius($nav-pills-border-radius);\\n  }\\n\\n  .nav-link.active,\\n  .show > .nav-link {\\n    color: $nav-pills-link-active-color;\\n    background-color: $nav-pills-link-active-bg;\\n  }\\n}\\n\\n\\n//\\n// Justified variants\\n//\\n\\n.nav-fill {\\n  .nav-item {\\n    flex: 1 1 auto;\\n    text-align: center;\\n  }\\n}\\n\\n.nav-justified {\\n  .nav-item {\\n    flex-basis: 0;\\n    flex-grow: 1;\\n    text-align: center;\\n  }\\n}\\n\\n\\n// Tabbable tabs\\n//\\n// Hide tabbable panes to start, show them when `.active`\\n\\n.tab-content {\\n  > .tab-pane {\\n    display: none;\\n  }\\n  > .active {\\n    display: block;\\n  }\\n}\\n\",\"// Contents\\n//\\n// Navbar\\n// Navbar brand\\n// Navbar nav\\n// Navbar text\\n// Navbar divider\\n// Responsive navbar\\n// Navbar position\\n// Navbar themes\\n\\n\\n// Navbar\\n//\\n// Provide a static navbar from which we expand to create full-width, fixed, and\\n// other navbar variations.\\n\\n.navbar {\\n  position: relative;\\n  display: flex;\\n  flex-wrap: wrap; // allow us to do the line break for collapsing content\\n  align-items: center;\\n  justify-content: space-between; // space out brand from logo\\n  padding: $navbar-padding-y $navbar-padding-x;\\n\\n  // Because flex properties aren't inherited, we need to redeclare these first\\n  // few properties so that content nested within behave properly.\\n  > .container,\\n  > .container-fluid {\\n    display: flex;\\n    flex-wrap: wrap;\\n    align-items: center;\\n    justify-content: space-between;\\n  }\\n}\\n\\n\\n// Navbar brand\\n//\\n// Used for brand, project, or site names.\\n\\n.navbar-brand {\\n  display: inline-block;\\n  padding-top: $navbar-brand-padding-y;\\n  padding-bottom: $navbar-brand-padding-y;\\n  margin-right: $navbar-padding-x;\\n  @include font-size($navbar-brand-font-size);\\n  line-height: inherit;\\n  white-space: nowrap;\\n\\n  @include hover-focus {\\n    text-decoration: none;\\n  }\\n}\\n\\n\\n// Navbar nav\\n//\\n// Custom navbar navigation (doesn't require `.nav`, but does make use of `.nav-link`).\\n\\n.navbar-nav {\\n  display: flex;\\n  flex-direction: column; // cannot use `inherit` to get the `.navbar`s value\\n  padding-left: 0;\\n  margin-bottom: 0;\\n  list-style: none;\\n\\n  .nav-link {\\n    padding-right: 0;\\n    padding-left: 0;\\n  }\\n\\n  .dropdown-menu {\\n    position: static;\\n    float: none;\\n  }\\n}\\n\\n\\n// Navbar text\\n//\\n//\\n\\n.navbar-text {\\n  display: inline-block;\\n  padding-top: $nav-link-padding-y;\\n  padding-bottom: $nav-link-padding-y;\\n}\\n\\n\\n// Responsive navbar\\n//\\n// Custom styles for responsive collapsing and toggling of navbar contents.\\n// Powered by the collapse Bootstrap JavaScript plugin.\\n\\n// When collapsed, prevent the toggleable navbar contents from appearing in\\n// the default flexbox row orientation. Requires the use of `flex-wrap: wrap`\\n// on the `.navbar` parent.\\n.navbar-collapse {\\n  flex-basis: 100%;\\n  flex-grow: 1;\\n  // For always expanded or extra full navbars, ensure content aligns itself\\n  // properly vertically. Can be easily overridden with flex utilities.\\n  align-items: center;\\n}\\n\\n// Button for toggling the navbar when in its collapsed state\\n.navbar-toggler {\\n  padding: $navbar-toggler-padding-y $navbar-toggler-padding-x;\\n  @include font-size($navbar-toggler-font-size);\\n  line-height: 1;\\n  background-color: transparent; // remove default button style\\n  border: $border-width solid transparent; // remove default button style\\n  @include border-radius($navbar-toggler-border-radius);\\n\\n  @include hover-focus {\\n    text-decoration: none;\\n  }\\n}\\n\\n// Keep as a separate element so folks can easily override it with another icon\\n// or image file as needed.\\n.navbar-toggler-icon {\\n  display: inline-block;\\n  width: 1.5em;\\n  height: 1.5em;\\n  vertical-align: middle;\\n  content: \\\"\\\";\\n  background: no-repeat center center;\\n  background-size: 100% 100%;\\n}\\n\\n// Generate series of `.navbar-expand-*` responsive classes for configuring\\n// where your navbar collapses.\\n.navbar-expand {\\n  @each $breakpoint in map-keys($grid-breakpoints) {\\n    $next: breakpoint-next($breakpoint, $grid-breakpoints);\\n    $infix: breakpoint-infix($next, $grid-breakpoints);\\n\\n    &#{$infix} {\\n      @include media-breakpoint-down($breakpoint) {\\n        > .container,\\n        > .container-fluid {\\n          padding-right: 0;\\n          padding-left: 0;\\n        }\\n      }\\n\\n      @include media-breakpoint-up($next) {\\n        flex-flow: row nowrap;\\n        justify-content: flex-start;\\n\\n        .navbar-nav {\\n          flex-direction: row;\\n\\n          .dropdown-menu {\\n            position: absolute;\\n          }\\n\\n          .nav-link {\\n            padding-right: $navbar-nav-link-padding-x;\\n            padding-left: $navbar-nav-link-padding-x;\\n          }\\n        }\\n\\n        // For nesting containers, have to redeclare for alignment purposes\\n        > .container,\\n        > .container-fluid {\\n          flex-wrap: nowrap;\\n        }\\n\\n        .navbar-collapse {\\n          display: flex !important; // stylelint-disable-line declaration-no-important\\n\\n          // Changes flex-bases to auto because of an IE10 bug\\n          flex-basis: auto;\\n        }\\n\\n        .navbar-toggler {\\n          display: none;\\n        }\\n      }\\n    }\\n  }\\n}\\n\\n\\n// Navbar themes\\n//\\n// Styles for switching between navbars with light or dark background.\\n\\n// Dark links against a light background\\n.navbar-light {\\n  .navbar-brand {\\n    color: $navbar-light-brand-color;\\n\\n    @include hover-focus {\\n      color: $navbar-light-brand-hover-color;\\n    }\\n  }\\n\\n  .navbar-nav {\\n    .nav-link {\\n      color: $navbar-light-color;\\n\\n      @include hover-focus {\\n        color: $navbar-light-hover-color;\\n      }\\n\\n      &.disabled {\\n        color: $navbar-light-disabled-color;\\n      }\\n    }\\n\\n    .show > .nav-link,\\n    .active > .nav-link,\\n    .nav-link.show,\\n    .nav-link.active {\\n      color: $navbar-light-active-color;\\n    }\\n  }\\n\\n  .navbar-toggler {\\n    color: $navbar-light-color;\\n    border-color: $navbar-light-toggler-border-color;\\n  }\\n\\n  .navbar-toggler-icon {\\n    background-image: $navbar-light-toggler-icon-bg;\\n  }\\n\\n  .navbar-text {\\n    color: $navbar-light-color;\\n    a {\\n      color: $navbar-light-active-color;\\n\\n      @include hover-focus {\\n        color: $navbar-light-active-color;\\n      }\\n    }\\n  }\\n}\\n\\n// White links against a dark background\\n.navbar-dark {\\n  .navbar-brand {\\n    color: $navbar-dark-brand-color;\\n\\n    @include hover-focus {\\n      color: $navbar-dark-brand-hover-color;\\n    }\\n  }\\n\\n  .navbar-nav {\\n    .nav-link {\\n      color: $navbar-dark-color;\\n\\n      @include hover-focus {\\n        color: $navbar-dark-hover-color;\\n      }\\n\\n      &.disabled {\\n        color: $navbar-dark-disabled-color;\\n      }\\n    }\\n\\n    .show > .nav-link,\\n    .active > .nav-link,\\n    .nav-link.show,\\n    .nav-link.active {\\n      color: $navbar-dark-active-color;\\n    }\\n  }\\n\\n  .navbar-toggler {\\n    color: $navbar-dark-color;\\n    border-color: $navbar-dark-toggler-border-color;\\n  }\\n\\n  .navbar-toggler-icon {\\n    background-image: $navbar-dark-toggler-icon-bg;\\n  }\\n\\n  .navbar-text {\\n    color: $navbar-dark-color;\\n    a {\\n      color: $navbar-dark-active-color;\\n\\n      @include hover-focus {\\n        color: $navbar-dark-active-color;\\n      }\\n    }\\n  }\\n}\\n\",\"//\\n// Base styles\\n//\\n\\n.card {\\n  position: relative;\\n  display: flex;\\n  flex-direction: column;\\n  min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106\\n  word-wrap: break-word;\\n  background-color: $card-bg;\\n  background-clip: border-box;\\n  border: $card-border-width solid $card-border-color;\\n  @include border-radius($card-border-radius);\\n\\n  > hr {\\n    margin-right: 0;\\n    margin-left: 0;\\n  }\\n\\n  > .list-group:first-child {\\n    .list-group-item:first-child {\\n      @include border-top-radius($card-border-radius);\\n    }\\n  }\\n\\n  > .list-group:last-child {\\n    .list-group-item:last-child {\\n      @include border-bottom-radius($card-border-radius);\\n    }\\n  }\\n}\\n\\n.card-body {\\n  // Enable `flex-grow: 1` for decks and groups so that card blocks take up\\n  // as much space as possible, ensuring footers are aligned to the bottom.\\n  flex: 1 1 auto;\\n  padding: $card-spacer-x;\\n  color: $card-color;\\n}\\n\\n.card-title {\\n  margin-bottom: $card-spacer-y;\\n}\\n\\n.card-subtitle {\\n  margin-top: -$card-spacer-y / 2;\\n  margin-bottom: 0;\\n}\\n\\n.card-text:last-child {\\n  margin-bottom: 0;\\n}\\n\\n.card-link {\\n  @include hover {\\n    text-decoration: none;\\n  }\\n\\n  + .card-link {\\n    margin-left: $card-spacer-x;\\n  }\\n}\\n\\n//\\n// Optional textual caps\\n//\\n\\n.card-header {\\n  padding: $card-spacer-y $card-spacer-x;\\n  margin-bottom: 0; // Removes the default margin-bottom of <hN>\\n  color: $card-cap-color;\\n  background-color: $card-cap-bg;\\n  border-bottom: $card-border-width solid $card-border-color;\\n\\n  &:first-child {\\n    @include border-radius($card-inner-border-radius $card-inner-border-radius 0 0);\\n  }\\n\\n  + .list-group {\\n    .list-group-item:first-child {\\n      border-top: 0;\\n    }\\n  }\\n}\\n\\n.card-footer {\\n  padding: $card-spacer-y $card-spacer-x;\\n  background-color: $card-cap-bg;\\n  border-top: $card-border-width solid $card-border-color;\\n\\n  &:last-child {\\n    @include border-radius(0 0 $card-inner-border-radius $card-inner-border-radius);\\n  }\\n}\\n\\n\\n//\\n// Header navs\\n//\\n\\n.card-header-tabs {\\n  margin-right: -$card-spacer-x / 2;\\n  margin-bottom: -$card-spacer-y;\\n  margin-left: -$card-spacer-x / 2;\\n  border-bottom: 0;\\n}\\n\\n.card-header-pills {\\n  margin-right: -$card-spacer-x / 2;\\n  margin-left: -$card-spacer-x / 2;\\n}\\n\\n// Card image\\n.card-img-overlay {\\n  position: absolute;\\n  top: 0;\\n  right: 0;\\n  bottom: 0;\\n  left: 0;\\n  padding: $card-img-overlay-padding;\\n}\\n\\n.card-img {\\n  width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\\n  @include border-radius($card-inner-border-radius);\\n}\\n\\n// Card image caps\\n.card-img-top {\\n  width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\\n  @include border-top-radius($card-inner-border-radius);\\n}\\n\\n.card-img-bottom {\\n  width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\\n  @include border-bottom-radius($card-inner-border-radius);\\n}\\n\\n\\n// Card deck\\n\\n.card-deck {\\n  display: flex;\\n  flex-direction: column;\\n\\n  .card {\\n    margin-bottom: $card-deck-margin;\\n  }\\n\\n  @include media-breakpoint-up(sm) {\\n    flex-flow: row wrap;\\n    margin-right: -$card-deck-margin;\\n    margin-left: -$card-deck-margin;\\n\\n    .card {\\n      display: flex;\\n      // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\\n      flex: 1 0 0%;\\n      flex-direction: column;\\n      margin-right: $card-deck-margin;\\n      margin-bottom: 0; // Override the default\\n      margin-left: $card-deck-margin;\\n    }\\n  }\\n}\\n\\n\\n//\\n// Card groups\\n//\\n\\n.card-group {\\n  display: flex;\\n  flex-direction: column;\\n\\n  // The child selector allows nested `.card` within `.card-group`\\n  // to display properly.\\n  > .card {\\n    margin-bottom: $card-group-margin;\\n  }\\n\\n  @include media-breakpoint-up(sm) {\\n    flex-flow: row wrap;\\n    // The child selector allows nested `.card` within `.card-group`\\n    // to display properly.\\n    > .card {\\n      // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\\n      flex: 1 0 0%;\\n      margin-bottom: 0;\\n\\n      + .card {\\n        margin-left: 0;\\n        border-left: 0;\\n      }\\n\\n      // Handle rounded corners\\n      @if $enable-rounded {\\n        &:not(:last-child) {\\n          @include border-right-radius(0);\\n\\n          .card-img-top,\\n          .card-header {\\n            // stylelint-disable-next-line property-blacklist\\n            border-top-right-radius: 0;\\n          }\\n          .card-img-bottom,\\n          .card-footer {\\n            // stylelint-disable-next-line property-blacklist\\n            border-bottom-right-radius: 0;\\n          }\\n        }\\n\\n        &:not(:first-child) {\\n          @include border-left-radius(0);\\n\\n          .card-img-top,\\n          .card-header {\\n            // stylelint-disable-next-line property-blacklist\\n            border-top-left-radius: 0;\\n          }\\n          .card-img-bottom,\\n          .card-footer {\\n            // stylelint-disable-next-line property-blacklist\\n            border-bottom-left-radius: 0;\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\n\\n\\n//\\n// Columns\\n//\\n\\n.card-columns {\\n  .card {\\n    margin-bottom: $card-columns-margin;\\n  }\\n\\n  @include media-breakpoint-up(sm) {\\n    column-count: $card-columns-count;\\n    column-gap: $card-columns-gap;\\n    orphans: 1;\\n    widows: 1;\\n\\n    .card {\\n      display: inline-block; // Don't let them vertically span multiple columns\\n      width: 100%; // Don't let their width change\\n    }\\n  }\\n}\\n\\n\\n//\\n// Accordion\\n//\\n\\n.accordion {\\n  > .card {\\n    overflow: hidden;\\n\\n    &:not(:first-of-type) {\\n      .card-header:first-child {\\n        @include border-radius(0);\\n      }\\n\\n      &:not(:last-of-type) {\\n        border-bottom: 0;\\n        @include border-radius(0);\\n      }\\n    }\\n\\n    &:first-of-type {\\n      border-bottom: 0;\\n      @include border-bottom-radius(0);\\n    }\\n\\n    &:last-of-type {\\n      @include border-top-radius(0);\\n    }\\n\\n    .card-header {\\n      margin-bottom: -$card-border-width;\\n    }\\n  }\\n}\\n\",\".breadcrumb {\\n  display: flex;\\n  flex-wrap: wrap;\\n  padding: $breadcrumb-padding-y $breadcrumb-padding-x;\\n  margin-bottom: $breadcrumb-margin-bottom;\\n  list-style: none;\\n  background-color: $breadcrumb-bg;\\n  @include border-radius($breadcrumb-border-radius);\\n}\\n\\n.breadcrumb-item {\\n  // The separator between breadcrumbs (by default, a forward-slash: \\\"/\\\")\\n  + .breadcrumb-item {\\n    padding-left: $breadcrumb-item-padding;\\n\\n    &::before {\\n      display: inline-block; // Suppress underlining of the separator in modern browsers\\n      padding-right: $breadcrumb-item-padding;\\n      color: $breadcrumb-divider-color;\\n      content: $breadcrumb-divider;\\n    }\\n  }\\n\\n  // IE9-11 hack to properly handle hyperlink underlines for breadcrumbs built\\n  // without `<ul>`s. The `::before` pseudo-element generates an element\\n  // *within* the .breadcrumb-item and thereby inherits the `text-decoration`.\\n  //\\n  // To trick IE into suppressing the underline, we give the pseudo-element an\\n  // underline and then immediately remove it.\\n  + .breadcrumb-item:hover::before {\\n    text-decoration: underline;\\n  }\\n  // stylelint-disable-next-line no-duplicate-selectors\\n  + .breadcrumb-item:hover::before {\\n    text-decoration: none;\\n  }\\n\\n  &.active {\\n    color: $breadcrumb-active-color;\\n  }\\n}\\n\",\".pagination {\\n  display: flex;\\n  @include list-unstyled();\\n  @include border-radius();\\n}\\n\\n.page-link {\\n  position: relative;\\n  display: block;\\n  padding: $pagination-padding-y $pagination-padding-x;\\n  margin-left: -$pagination-border-width;\\n  line-height: $pagination-line-height;\\n  color: $pagination-color;\\n  background-color: $pagination-bg;\\n  border: $pagination-border-width solid $pagination-border-color;\\n\\n  &:hover {\\n    z-index: 2;\\n    color: $pagination-hover-color;\\n    text-decoration: none;\\n    background-color: $pagination-hover-bg;\\n    border-color: $pagination-hover-border-color;\\n  }\\n\\n  &:focus {\\n    z-index: 2;\\n    outline: $pagination-focus-outline;\\n    box-shadow: $pagination-focus-box-shadow;\\n  }\\n}\\n\\n.page-item {\\n  &:first-child {\\n    .page-link {\\n      margin-left: 0;\\n      @include border-left-radius($border-radius);\\n    }\\n  }\\n  &:last-child {\\n    .page-link {\\n      @include border-right-radius($border-radius);\\n    }\\n  }\\n\\n  &.active .page-link {\\n    z-index: 1;\\n    color: $pagination-active-color;\\n    background-color: $pagination-active-bg;\\n    border-color: $pagination-active-border-color;\\n  }\\n\\n  &.disabled .page-link {\\n    color: $pagination-disabled-color;\\n    pointer-events: none;\\n    // Opinionated: remove the \\\"hand\\\" cursor set previously for .page-link\\n    cursor: auto;\\n    background-color: $pagination-disabled-bg;\\n    border-color: $pagination-disabled-border-color;\\n  }\\n}\\n\\n\\n//\\n// Sizing\\n//\\n\\n.pagination-lg {\\n  @include pagination-size($pagination-padding-y-lg, $pagination-padding-x-lg, $font-size-lg, $line-height-lg, $border-radius-lg);\\n}\\n\\n.pagination-sm {\\n  @include pagination-size($pagination-padding-y-sm, $pagination-padding-x-sm, $font-size-sm, $line-height-sm, $border-radius-sm);\\n}\\n\",\"// Pagination\\n\\n@mixin pagination-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) {\\n  .page-link {\\n    padding: $padding-y $padding-x;\\n    @include font-size($font-size);\\n    line-height: $line-height;\\n  }\\n\\n  .page-item {\\n    &:first-child {\\n      .page-link {\\n        @include border-left-radius($border-radius);\\n      }\\n    }\\n    &:last-child {\\n      .page-link {\\n        @include border-right-radius($border-radius);\\n      }\\n    }\\n  }\\n}\\n\",\"// Base class\\n//\\n// Requires one of the contextual, color modifier classes for `color` and\\n// `background-color`.\\n\\n.badge {\\n  display: inline-block;\\n  padding: $badge-padding-y $badge-padding-x;\\n  @include font-size($badge-font-size);\\n  font-weight: $badge-font-weight;\\n  line-height: 1;\\n  text-align: center;\\n  white-space: nowrap;\\n  vertical-align: baseline;\\n  @include border-radius($badge-border-radius);\\n  @include transition($badge-transition);\\n\\n  @at-root a#{&} {\\n    @include hover-focus {\\n      text-decoration: none;\\n    }\\n  }\\n\\n  // Empty badges collapse automatically\\n  &:empty {\\n    display: none;\\n  }\\n}\\n\\n// Quick fix for badges in buttons\\n.btn .badge {\\n  position: relative;\\n  top: -1px;\\n}\\n\\n// Pill badges\\n//\\n// Make them extra rounded with a modifier to replace v3's badges.\\n\\n.badge-pill {\\n  padding-right: $badge-pill-padding-x;\\n  padding-left: $badge-pill-padding-x;\\n  @include border-radius($badge-pill-border-radius);\\n}\\n\\n// Colors\\n//\\n// Contextual variations (linked badges get darker on :hover).\\n\\n@each $color, $value in $theme-colors {\\n  .badge-#{$color} {\\n    @include badge-variant($value);\\n  }\\n}\\n\",\"@mixin badge-variant($bg) {\\n  color: color-yiq($bg);\\n  background-color: $bg;\\n\\n  @at-root a#{&} {\\n    @include hover-focus {\\n      color: color-yiq($bg);\\n      background-color: darken($bg, 10%);\\n    }\\n\\n    &:focus,\\n    &.focus {\\n      outline: 0;\\n      box-shadow: 0 0 0 $badge-focus-width rgba($bg, .5);\\n    }\\n  }\\n}\\n\",\".jumbotron {\\n  padding: $jumbotron-padding ($jumbotron-padding / 2);\\n  margin-bottom: $jumbotron-padding;\\n  color: $jumbotron-color;\\n  background-color: $jumbotron-bg;\\n  @include border-radius($border-radius-lg);\\n\\n  @include media-breakpoint-up(sm) {\\n    padding: ($jumbotron-padding * 2) $jumbotron-padding;\\n  }\\n}\\n\\n.jumbotron-fluid {\\n  padding-right: 0;\\n  padding-left: 0;\\n  @include border-radius(0);\\n}\\n\",\"//\\n// Base styles\\n//\\n\\n.alert {\\n  position: relative;\\n  padding: $alert-padding-y $alert-padding-x;\\n  margin-bottom: $alert-margin-bottom;\\n  border: $alert-border-width solid transparent;\\n  @include border-radius($alert-border-radius);\\n}\\n\\n// Headings for larger alerts\\n.alert-heading {\\n  // Specified to prevent conflicts of changing $headings-color\\n  color: inherit;\\n}\\n\\n// Provide class for links that match alerts\\n.alert-link {\\n  font-weight: $alert-link-font-weight;\\n}\\n\\n\\n// Dismissible alerts\\n//\\n// Expand the right padding and account for the close button's positioning.\\n\\n.alert-dismissible {\\n  padding-right: $close-font-size + $alert-padding-x * 2;\\n\\n  // Adjust close link position\\n  .close {\\n    position: absolute;\\n    top: 0;\\n    right: 0;\\n    padding: $alert-padding-y $alert-padding-x;\\n    color: inherit;\\n  }\\n}\\n\\n\\n// Alternate styles\\n//\\n// Generate contextual modifier classes for colorizing the alert.\\n\\n@each $color, $value in $theme-colors {\\n  .alert-#{$color} {\\n    @include alert-variant(theme-color-level($color, $alert-bg-level), theme-color-level($color, $alert-border-level), theme-color-level($color, $alert-color-level));\\n  }\\n}\\n\",\"@mixin alert-variant($background, $border, $color) {\\n  color: $color;\\n  @include gradient-bg($background);\\n  border-color: $border;\\n\\n  hr {\\n    border-top-color: darken($border, 5%);\\n  }\\n\\n  .alert-link {\\n    color: darken($color, 10%);\\n  }\\n}\\n\",\"// Disable animation if transitions are disabled\\n@if $enable-transitions {\\n  @keyframes progress-bar-stripes {\\n    from { background-position: $progress-height 0; }\\n    to { background-position: 0 0; }\\n  }\\n}\\n\\n.progress {\\n  display: flex;\\n  height: $progress-height;\\n  overflow: hidden; // force rounded corners by cropping it\\n  @include font-size($progress-font-size);\\n  background-color: $progress-bg;\\n  @include border-radius($progress-border-radius);\\n  @include box-shadow($progress-box-shadow);\\n}\\n\\n.progress-bar {\\n  display: flex;\\n  flex-direction: column;\\n  justify-content: center;\\n  color: $progress-bar-color;\\n  text-align: center;\\n  white-space: nowrap;\\n  background-color: $progress-bar-bg;\\n  @include transition($progress-bar-transition);\\n}\\n\\n.progress-bar-striped {\\n  @include gradient-striped();\\n  background-size: $progress-height $progress-height;\\n}\\n\\n@if $enable-transitions {\\n  .progress-bar-animated {\\n    animation: progress-bar-stripes $progress-bar-animation-timing;\\n\\n    @media (prefers-reduced-motion: reduce) {\\n      animation: none;\\n    }\\n  }\\n}\\n\",\".media {\\n  display: flex;\\n  align-items: flex-start;\\n}\\n\\n.media-body {\\n  flex: 1;\\n}\\n\",\"// Base class\\n//\\n// Easily usable on <ul>, <ol>, or <div>.\\n\\n.list-group {\\n  display: flex;\\n  flex-direction: column;\\n\\n  // No need to set list-style: none; since .list-group-item is block level\\n  padding-left: 0; // reset padding because ul and ol\\n  margin-bottom: 0;\\n}\\n\\n\\n// Interactive list items\\n//\\n// Use anchor or button elements instead of `li`s or `div`s to create interactive\\n// list items. Includes an extra `.active` modifier class for selected items.\\n\\n.list-group-item-action {\\n  width: 100%; // For `<button>`s (anchors become 100% by default though)\\n  color: $list-group-action-color;\\n  text-align: inherit; // For `<button>`s (anchors inherit)\\n\\n  // Hover state\\n  @include hover-focus {\\n    z-index: 1; // Place hover/focus items above their siblings for proper border styling\\n    color: $list-group-action-hover-color;\\n    text-decoration: none;\\n    background-color: $list-group-hover-bg;\\n  }\\n\\n  &:active {\\n    color: $list-group-action-active-color;\\n    background-color: $list-group-action-active-bg;\\n  }\\n}\\n\\n\\n// Individual list items\\n//\\n// Use on `li`s or `div`s within the `.list-group` parent.\\n\\n.list-group-item {\\n  position: relative;\\n  display: block;\\n  padding: $list-group-item-padding-y $list-group-item-padding-x;\\n  // Place the border on the list items and negative margin up for better styling\\n  margin-bottom: -$list-group-border-width;\\n  color: $list-group-color;\\n  background-color: $list-group-bg;\\n  border: $list-group-border-width solid $list-group-border-color;\\n\\n  &:first-child {\\n    @include border-top-radius($list-group-border-radius);\\n  }\\n\\n  &:last-child {\\n    margin-bottom: 0;\\n    @include border-bottom-radius($list-group-border-radius);\\n  }\\n\\n  &.disabled,\\n  &:disabled {\\n    color: $list-group-disabled-color;\\n    pointer-events: none;\\n    background-color: $list-group-disabled-bg;\\n  }\\n\\n  // Include both here for `<a>`s and `<button>`s\\n  &.active {\\n    z-index: 2; // Place active items above their siblings for proper border styling\\n    color: $list-group-active-color;\\n    background-color: $list-group-active-bg;\\n    border-color: $list-group-active-border-color;\\n  }\\n}\\n\\n\\n// Horizontal\\n//\\n// Change the layout of list group items from vertical (default) to horizontal.\\n\\n@each $breakpoint in map-keys($grid-breakpoints) {\\n  @include media-breakpoint-up($breakpoint) {\\n    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\\n\\n    .list-group-horizontal#{$infix} {\\n      flex-direction: row;\\n\\n      .list-group-item {\\n        margin-right: -$list-group-border-width;\\n        margin-bottom: 0;\\n\\n        &:first-child {\\n          @include border-left-radius($list-group-border-radius);\\n          @include border-top-right-radius(0);\\n        }\\n\\n        &:last-child {\\n          margin-right: 0;\\n          @include border-right-radius($list-group-border-radius);\\n          @include border-bottom-left-radius(0);\\n        }\\n      }\\n    }\\n  }\\n}\\n\\n\\n// Flush list items\\n//\\n// Remove borders and border-radius to keep list group items edge-to-edge. Most\\n// useful within other components (e.g., cards).\\n\\n.list-group-flush {\\n  .list-group-item {\\n    border-right: 0;\\n    border-left: 0;\\n    @include border-radius(0);\\n\\n    &:last-child {\\n      margin-bottom: -$list-group-border-width;\\n    }\\n  }\\n\\n  &:first-child {\\n    .list-group-item:first-child {\\n      border-top: 0;\\n    }\\n  }\\n\\n  &:last-child {\\n    .list-group-item:last-child {\\n      margin-bottom: 0;\\n      border-bottom: 0;\\n    }\\n  }\\n}\\n\\n\\n// Contextual variants\\n//\\n// Add modifier classes to change text and background color on individual items.\\n// Organizationally, this must come after the `:hover` states.\\n\\n@each $color, $value in $theme-colors {\\n  @include list-group-item-variant($color, theme-color-level($color, -9), theme-color-level($color, 6));\\n}\\n\",\"// List Groups\\n\\n@mixin list-group-item-variant($state, $background, $color) {\\n  .list-group-item-#{$state} {\\n    color: $color;\\n    background-color: $background;\\n\\n    &.list-group-item-action {\\n      @include hover-focus {\\n        color: $color;\\n        background-color: darken($background, 5%);\\n      }\\n\\n      &.active {\\n        color: $white;\\n        background-color: $color;\\n        border-color: $color;\\n      }\\n    }\\n  }\\n}\\n\",\".close {\\n  float: right;\\n  @include font-size($close-font-size);\\n  font-weight: $close-font-weight;\\n  line-height: 1;\\n  color: $close-color;\\n  text-shadow: $close-text-shadow;\\n  opacity: .5;\\n\\n  // Override <a>'s hover style\\n  @include hover {\\n    color: $close-color;\\n    text-decoration: none;\\n  }\\n\\n  &:not(:disabled):not(.disabled) {\\n    @include hover-focus {\\n      opacity: .75;\\n    }\\n  }\\n}\\n\\n// Additional properties for button version\\n// iOS requires the button element instead of an anchor tag.\\n// If you want the anchor version, it requires `href=\\\"#\\\"`.\\n// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\\n\\n// stylelint-disable-next-line selector-no-qualifying-type\\nbutton.close {\\n  padding: 0;\\n  background-color: transparent;\\n  border: 0;\\n  appearance: none;\\n}\\n\\n// Future-proof disabling of clicks on `<a>` elements\\n\\n// stylelint-disable-next-line selector-no-qualifying-type\\na.close.disabled {\\n  pointer-events: none;\\n}\\n\",\".toast {\\n  max-width: $toast-max-width;\\n  overflow: hidden; // cheap rounded corners on nested items\\n  @include font-size($toast-font-size);\\n  color: $toast-color;\\n  background-color: $toast-background-color;\\n  background-clip: padding-box;\\n  border: $toast-border-width solid $toast-border-color;\\n  box-shadow: $toast-box-shadow;\\n  backdrop-filter: blur(10px);\\n  opacity: 0;\\n  @include border-radius($toast-border-radius);\\n\\n  &:not(:last-child) {\\n    margin-bottom: $toast-padding-x;\\n  }\\n\\n  &.showing {\\n    opacity: 1;\\n  }\\n\\n  &.show {\\n    display: block;\\n    opacity: 1;\\n  }\\n\\n  &.hide {\\n    display: none;\\n  }\\n}\\n\\n.toast-header {\\n  display: flex;\\n  align-items: center;\\n  padding: $toast-padding-y $toast-padding-x;\\n  color: $toast-header-color;\\n  background-color: $toast-header-background-color;\\n  background-clip: padding-box;\\n  border-bottom: $toast-border-width solid $toast-header-border-color;\\n}\\n\\n.toast-body {\\n  padding: $toast-padding-x; // apply to both vertical and horizontal\\n}\\n\",\"// .modal-open      - body class for killing the scroll\\n// .modal           - container to scroll within\\n// .modal-dialog    - positioning shell for the actual modal\\n// .modal-content   - actual modal w/ bg and corners and stuff\\n\\n\\n.modal-open {\\n  // Kill the scroll on the body\\n  overflow: hidden;\\n\\n  .modal {\\n    overflow-x: hidden;\\n    overflow-y: auto;\\n  }\\n}\\n\\n// Container that the modal scrolls within\\n.modal {\\n  position: fixed;\\n  top: 0;\\n  left: 0;\\n  z-index: $zindex-modal;\\n  display: none;\\n  width: 100%;\\n  height: 100%;\\n  overflow: hidden;\\n  // Prevent Chrome on Windows from adding a focus outline. For details, see\\n  // https://github.com/twbs/bootstrap/pull/10951.\\n  outline: 0;\\n  // We deliberately don't use `-webkit-overflow-scrolling: touch;` due to a\\n  // gnarly iOS Safari bug: https://bugs.webkit.org/show_bug.cgi?id=158342\\n  // See also https://github.com/twbs/bootstrap/issues/17695\\n}\\n\\n// Shell div to position the modal with bottom padding\\n.modal-dialog {\\n  position: relative;\\n  width: auto;\\n  margin: $modal-dialog-margin;\\n  // allow clicks to pass through for custom click handling to close modal\\n  pointer-events: none;\\n\\n  // When fading in the modal, animate it to slide down\\n  .modal.fade & {\\n    @include transition($modal-transition);\\n    transform: $modal-fade-transform;\\n  }\\n  .modal.show & {\\n    transform: $modal-show-transform;\\n  }\\n}\\n\\n.modal-dialog-scrollable {\\n  display: flex; // IE10/11\\n  max-height: calc(100% - #{$modal-dialog-margin * 2});\\n\\n  .modal-content {\\n    max-height: calc(100vh - #{$modal-dialog-margin * 2}); // IE10/11\\n    overflow: hidden;\\n  }\\n\\n  .modal-header,\\n  .modal-footer {\\n    flex-shrink: 0;\\n  }\\n\\n  .modal-body {\\n    overflow-y: auto;\\n  }\\n}\\n\\n.modal-dialog-centered {\\n  display: flex;\\n  align-items: center;\\n  min-height: calc(100% - #{$modal-dialog-margin * 2});\\n\\n  // Ensure `modal-dialog-centered` extends the full height of the view (IE10/11)\\n  &::before {\\n    display: block; // IE10\\n    height: calc(100vh - #{$modal-dialog-margin * 2});\\n    content: \\\"\\\";\\n  }\\n\\n  // Ensure `.modal-body` shows scrollbar (IE10/11)\\n  &.modal-dialog-scrollable {\\n    flex-direction: column;\\n    justify-content: center;\\n    height: 100%;\\n\\n    .modal-content {\\n      max-height: none;\\n    }\\n\\n    &::before {\\n      content: none;\\n    }\\n  }\\n}\\n\\n// Actual modal\\n.modal-content {\\n  position: relative;\\n  display: flex;\\n  flex-direction: column;\\n  width: 100%; // Ensure `.modal-content` extends the full width of the parent `.modal-dialog`\\n  // counteract the pointer-events: none; in the .modal-dialog\\n  color: $modal-content-color;\\n  pointer-events: auto;\\n  background-color: $modal-content-bg;\\n  background-clip: padding-box;\\n  border: $modal-content-border-width solid $modal-content-border-color;\\n  @include border-radius($modal-content-border-radius);\\n  @include box-shadow($modal-content-box-shadow-xs);\\n  // Remove focus outline from opened modal\\n  outline: 0;\\n}\\n\\n// Modal background\\n.modal-backdrop {\\n  position: fixed;\\n  top: 0;\\n  left: 0;\\n  z-index: $zindex-modal-backdrop;\\n  width: 100vw;\\n  height: 100vh;\\n  background-color: $modal-backdrop-bg;\\n\\n  // Fade for backdrop\\n  &.fade { opacity: 0; }\\n  &.show { opacity: $modal-backdrop-opacity; }\\n}\\n\\n// Modal header\\n// Top section of the modal w/ title and dismiss\\n.modal-header {\\n  display: flex;\\n  align-items: flex-start; // so the close btn always stays on the upper right corner\\n  justify-content: space-between; // Put modal header elements (title and dismiss) on opposite ends\\n  padding: $modal-header-padding;\\n  border-bottom: $modal-header-border-width solid $modal-header-border-color;\\n  @include border-top-radius($modal-content-border-radius);\\n\\n  .close {\\n    padding: $modal-header-padding;\\n    // auto on the left force icon to the right even when there is no .modal-title\\n    margin: (-$modal-header-padding-y) (-$modal-header-padding-x) (-$modal-header-padding-y) auto;\\n  }\\n}\\n\\n// Title text within header\\n.modal-title {\\n  margin-bottom: 0;\\n  line-height: $modal-title-line-height;\\n}\\n\\n// Modal body\\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\\n.modal-body {\\n  position: relative;\\n  // Enable `flex-grow: 1` so that the body take up as much space as possible\\n  // when should there be a fixed height on `.modal-dialog`.\\n  flex: 1 1 auto;\\n  padding: $modal-inner-padding;\\n}\\n\\n// Footer (for actions)\\n.modal-footer {\\n  display: flex;\\n  align-items: center; // vertically center\\n  justify-content: flex-end; // Right align buttons with flex property because text-align doesn't work on flex items\\n  padding: $modal-inner-padding;\\n  border-top: $modal-footer-border-width solid $modal-footer-border-color;\\n  @include border-bottom-radius($modal-content-border-radius);\\n\\n  // Easily place margin between footer elements\\n  > :not(:first-child) { margin-left: .25rem; }\\n  > :not(:last-child) { margin-right: .25rem; }\\n}\\n\\n// Measure scrollbar width for padding body during modal show/hide\\n.modal-scrollbar-measure {\\n  position: absolute;\\n  top: -9999px;\\n  width: 50px;\\n  height: 50px;\\n  overflow: scroll;\\n}\\n\\n// Scale up the modal\\n@include media-breakpoint-up(sm) {\\n  // Automatically set modal's width for larger viewports\\n  .modal-dialog {\\n    max-width: $modal-md;\\n    margin: $modal-dialog-margin-y-sm-up auto;\\n  }\\n\\n  .modal-dialog-scrollable {\\n    max-height: calc(100% - #{$modal-dialog-margin-y-sm-up * 2});\\n\\n    .modal-content {\\n      max-height: calc(100vh - #{$modal-dialog-margin-y-sm-up * 2});\\n    }\\n  }\\n\\n  .modal-dialog-centered {\\n    min-height: calc(100% - #{$modal-dialog-margin-y-sm-up * 2});\\n\\n    &::before {\\n      height: calc(100vh - #{$modal-dialog-margin-y-sm-up * 2});\\n    }\\n  }\\n\\n  .modal-content {\\n    @include box-shadow($modal-content-box-shadow-sm-up);\\n  }\\n\\n  .modal-sm { max-width: $modal-sm; }\\n}\\n\\n@include media-breakpoint-up(lg) {\\n  .modal-lg,\\n  .modal-xl {\\n    max-width: $modal-lg;\\n  }\\n}\\n\\n@include media-breakpoint-up(xl) {\\n  .modal-xl { max-width: $modal-xl; }\\n}\\n\",\"// Base class\\n.tooltip {\\n  position: absolute;\\n  z-index: $zindex-tooltip;\\n  display: block;\\n  margin: $tooltip-margin;\\n  // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\\n  // So reset our font and text properties to avoid inheriting weird values.\\n  @include reset-text();\\n  @include font-size($tooltip-font-size);\\n  // Allow breaking very long words so they don't overflow the tooltip's bounds\\n  word-wrap: break-word;\\n  opacity: 0;\\n\\n  &.show { opacity: $tooltip-opacity; }\\n\\n  .arrow {\\n    position: absolute;\\n    display: block;\\n    width: $tooltip-arrow-width;\\n    height: $tooltip-arrow-height;\\n\\n    &::before {\\n      position: absolute;\\n      content: \\\"\\\";\\n      border-color: transparent;\\n      border-style: solid;\\n    }\\n  }\\n}\\n\\n.bs-tooltip-top {\\n  padding: $tooltip-arrow-height 0;\\n\\n  .arrow {\\n    bottom: 0;\\n\\n    &::before {\\n      top: 0;\\n      border-width: $tooltip-arrow-height ($tooltip-arrow-width / 2) 0;\\n      border-top-color: $tooltip-arrow-color;\\n    }\\n  }\\n}\\n\\n.bs-tooltip-right {\\n  padding: 0 $tooltip-arrow-height;\\n\\n  .arrow {\\n    left: 0;\\n    width: $tooltip-arrow-height;\\n    height: $tooltip-arrow-width;\\n\\n    &::before {\\n      right: 0;\\n      border-width: ($tooltip-arrow-width / 2) $tooltip-arrow-height ($tooltip-arrow-width / 2) 0;\\n      border-right-color: $tooltip-arrow-color;\\n    }\\n  }\\n}\\n\\n.bs-tooltip-bottom {\\n  padding: $tooltip-arrow-height 0;\\n\\n  .arrow {\\n    top: 0;\\n\\n    &::before {\\n      bottom: 0;\\n      border-width: 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height;\\n      border-bottom-color: $tooltip-arrow-color;\\n    }\\n  }\\n}\\n\\n.bs-tooltip-left {\\n  padding: 0 $tooltip-arrow-height;\\n\\n  .arrow {\\n    right: 0;\\n    width: $tooltip-arrow-height;\\n    height: $tooltip-arrow-width;\\n\\n    &::before {\\n      left: 0;\\n      border-width: ($tooltip-arrow-width / 2) 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height;\\n      border-left-color: $tooltip-arrow-color;\\n    }\\n  }\\n}\\n\\n.bs-tooltip-auto {\\n  &[x-placement^=\\\"top\\\"] {\\n    @extend .bs-tooltip-top;\\n  }\\n  &[x-placement^=\\\"right\\\"] {\\n    @extend .bs-tooltip-right;\\n  }\\n  &[x-placement^=\\\"bottom\\\"] {\\n    @extend .bs-tooltip-bottom;\\n  }\\n  &[x-placement^=\\\"left\\\"] {\\n    @extend .bs-tooltip-left;\\n  }\\n}\\n\\n// Wrapper for the tooltip content\\n.tooltip-inner {\\n  max-width: $tooltip-max-width;\\n  padding: $tooltip-padding-y $tooltip-padding-x;\\n  color: $tooltip-color;\\n  text-align: center;\\n  background-color: $tooltip-bg;\\n  @include border-radius($tooltip-border-radius);\\n}\\n\",\"@mixin reset-text {\\n  font-family: $font-family-base;\\n  // We deliberately do NOT reset font-size or word-wrap.\\n  font-style: normal;\\n  font-weight: $font-weight-normal;\\n  line-height: $line-height-base;\\n  text-align: left; // Fallback for where `start` is not supported\\n  text-align: start;\\n  text-decoration: none;\\n  text-shadow: none;\\n  text-transform: none;\\n  letter-spacing: normal;\\n  word-break: normal;\\n  word-spacing: normal;\\n  white-space: normal;\\n  line-break: auto;\\n}\\n\",\".popover {\\n  position: absolute;\\n  top: 0;\\n  left: 0;\\n  z-index: $zindex-popover;\\n  display: block;\\n  max-width: $popover-max-width;\\n  // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\\n  // So reset our font and text properties to avoid inheriting weird values.\\n  @include reset-text();\\n  @include font-size($popover-font-size);\\n  // Allow breaking very long words so they don't overflow the popover's bounds\\n  word-wrap: break-word;\\n  background-color: $popover-bg;\\n  background-clip: padding-box;\\n  border: $popover-border-width solid $popover-border-color;\\n  @include border-radius($popover-border-radius);\\n  @include box-shadow($popover-box-shadow);\\n\\n  .arrow {\\n    position: absolute;\\n    display: block;\\n    width: $popover-arrow-width;\\n    height: $popover-arrow-height;\\n    margin: 0 $border-radius-lg;\\n\\n    &::before,\\n    &::after {\\n      position: absolute;\\n      display: block;\\n      content: \\\"\\\";\\n      border-color: transparent;\\n      border-style: solid;\\n    }\\n  }\\n}\\n\\n.bs-popover-top {\\n  margin-bottom: $popover-arrow-height;\\n\\n  > .arrow {\\n    bottom: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);\\n\\n    &::before {\\n      bottom: 0;\\n      border-width: $popover-arrow-height ($popover-arrow-width / 2) 0;\\n      border-top-color: $popover-arrow-outer-color;\\n    }\\n\\n    &::after {\\n      bottom: $popover-border-width;\\n      border-width: $popover-arrow-height ($popover-arrow-width / 2) 0;\\n      border-top-color: $popover-arrow-color;\\n    }\\n  }\\n}\\n\\n.bs-popover-right {\\n  margin-left: $popover-arrow-height;\\n\\n  > .arrow {\\n    left: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);\\n    width: $popover-arrow-height;\\n    height: $popover-arrow-width;\\n    margin: $border-radius-lg 0; // make sure the arrow does not touch the popover's rounded corners\\n\\n    &::before {\\n      left: 0;\\n      border-width: ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2) 0;\\n      border-right-color: $popover-arrow-outer-color;\\n    }\\n\\n    &::after {\\n      left: $popover-border-width;\\n      border-width: ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2) 0;\\n      border-right-color: $popover-arrow-color;\\n    }\\n  }\\n}\\n\\n.bs-popover-bottom {\\n  margin-top: $popover-arrow-height;\\n\\n  > .arrow {\\n    top: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);\\n\\n    &::before {\\n      top: 0;\\n      border-width: 0 ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2);\\n      border-bottom-color: $popover-arrow-outer-color;\\n    }\\n\\n    &::after {\\n      top: $popover-border-width;\\n      border-width: 0 ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2);\\n      border-bottom-color: $popover-arrow-color;\\n    }\\n  }\\n\\n  // This will remove the popover-header's border just below the arrow\\n  .popover-header::before {\\n    position: absolute;\\n    top: 0;\\n    left: 50%;\\n    display: block;\\n    width: $popover-arrow-width;\\n    margin-left: -$popover-arrow-width / 2;\\n    content: \\\"\\\";\\n    border-bottom: $popover-border-width solid $popover-header-bg;\\n  }\\n}\\n\\n.bs-popover-left {\\n  margin-right: $popover-arrow-height;\\n\\n  > .arrow {\\n    right: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);\\n    width: $popover-arrow-height;\\n    height: $popover-arrow-width;\\n    margin: $border-radius-lg 0; // make sure the arrow does not touch the popover's rounded corners\\n\\n    &::before {\\n      right: 0;\\n      border-width: ($popover-arrow-width / 2) 0 ($popover-arrow-width / 2) $popover-arrow-height;\\n      border-left-color: $popover-arrow-outer-color;\\n    }\\n\\n    &::after {\\n      right: $popover-border-width;\\n      border-width: ($popover-arrow-width / 2) 0 ($popover-arrow-width / 2) $popover-arrow-height;\\n      border-left-color: $popover-arrow-color;\\n    }\\n  }\\n}\\n\\n.bs-popover-auto {\\n  &[x-placement^=\\\"top\\\"] {\\n    @extend .bs-popover-top;\\n  }\\n  &[x-placement^=\\\"right\\\"] {\\n    @extend .bs-popover-right;\\n  }\\n  &[x-placement^=\\\"bottom\\\"] {\\n    @extend .bs-popover-bottom;\\n  }\\n  &[x-placement^=\\\"left\\\"] {\\n    @extend .bs-popover-left;\\n  }\\n}\\n\\n\\n// Offset the popover to account for the popover arrow\\n.popover-header {\\n  padding: $popover-header-padding-y $popover-header-padding-x;\\n  margin-bottom: 0; // Reset the default from Reboot\\n  @include font-size($font-size-base);\\n  color: $popover-header-color;\\n  background-color: $popover-header-bg;\\n  border-bottom: $popover-border-width solid darken($popover-header-bg, 5%);\\n  $offset-border-width: calc(#{$border-radius-lg} - #{$popover-border-width});\\n  @include border-top-radius($offset-border-width);\\n\\n  &:empty {\\n    display: none;\\n  }\\n}\\n\\n.popover-body {\\n  padding: $popover-body-padding-y $popover-body-padding-x;\\n  color: $popover-body-color;\\n}\\n\",\"// Notes on the classes:\\n//\\n// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically)\\n//    even when their scroll action started on a carousel, but for compatibility (with Firefox)\\n//    we're preventing all actions instead\\n// 2. The .carousel-item-left and .carousel-item-right is used to indicate where\\n//    the active slide is heading.\\n// 3. .active.carousel-item is the current slide.\\n// 4. .active.carousel-item-left and .active.carousel-item-right is the current\\n//    slide in its in-transition state. Only one of these occurs at a time.\\n// 5. .carousel-item-next.carousel-item-left and .carousel-item-prev.carousel-item-right\\n//    is the upcoming slide in transition.\\n\\n.carousel {\\n  position: relative;\\n}\\n\\n.carousel.pointer-event {\\n  touch-action: pan-y;\\n}\\n\\n.carousel-inner {\\n  position: relative;\\n  width: 100%;\\n  overflow: hidden;\\n  @include clearfix();\\n}\\n\\n.carousel-item {\\n  position: relative;\\n  display: none;\\n  float: left;\\n  width: 100%;\\n  margin-right: -100%;\\n  backface-visibility: hidden;\\n  @include transition($carousel-transition);\\n}\\n\\n.carousel-item.active,\\n.carousel-item-next,\\n.carousel-item-prev {\\n  display: block;\\n}\\n\\n.carousel-item-next:not(.carousel-item-left),\\n.active.carousel-item-right {\\n  transform: translateX(100%);\\n}\\n\\n.carousel-item-prev:not(.carousel-item-right),\\n.active.carousel-item-left {\\n  transform: translateX(-100%);\\n}\\n\\n\\n//\\n// Alternate transitions\\n//\\n\\n.carousel-fade {\\n  .carousel-item {\\n    opacity: 0;\\n    transition-property: opacity;\\n    transform: none;\\n  }\\n\\n  .carousel-item.active,\\n  .carousel-item-next.carousel-item-left,\\n  .carousel-item-prev.carousel-item-right {\\n    z-index: 1;\\n    opacity: 1;\\n  }\\n\\n  .active.carousel-item-left,\\n  .active.carousel-item-right {\\n    z-index: 0;\\n    opacity: 0;\\n    @include transition(0s $carousel-transition-duration opacity);\\n  }\\n}\\n\\n\\n//\\n// Left/right controls for nav\\n//\\n\\n.carousel-control-prev,\\n.carousel-control-next {\\n  position: absolute;\\n  top: 0;\\n  bottom: 0;\\n  z-index: 1;\\n  // Use flex for alignment (1-3)\\n  display: flex; // 1. allow flex styles\\n  align-items: center; // 2. vertically center contents\\n  justify-content: center; // 3. horizontally center contents\\n  width: $carousel-control-width;\\n  color: $carousel-control-color;\\n  text-align: center;\\n  opacity: $carousel-control-opacity;\\n  @include transition($carousel-control-transition);\\n\\n  // Hover/focus state\\n  @include hover-focus {\\n    color: $carousel-control-color;\\n    text-decoration: none;\\n    outline: 0;\\n    opacity: $carousel-control-hover-opacity;\\n  }\\n}\\n.carousel-control-prev {\\n  left: 0;\\n  @if $enable-gradients {\\n    background: linear-gradient(90deg, rgba($black, .25), rgba($black, .001));\\n  }\\n}\\n.carousel-control-next {\\n  right: 0;\\n  @if $enable-gradients {\\n    background: linear-gradient(270deg, rgba($black, .25), rgba($black, .001));\\n  }\\n}\\n\\n// Icons for within\\n.carousel-control-prev-icon,\\n.carousel-control-next-icon {\\n  display: inline-block;\\n  width: $carousel-control-icon-width;\\n  height: $carousel-control-icon-width;\\n  background: no-repeat 50% / 100% 100%;\\n}\\n.carousel-control-prev-icon {\\n  background-image: $carousel-control-prev-icon-bg;\\n}\\n.carousel-control-next-icon {\\n  background-image: $carousel-control-next-icon-bg;\\n}\\n\\n\\n// Optional indicator pips\\n//\\n// Add an ordered list with the following class and add a list item for each\\n// slide your carousel holds.\\n\\n.carousel-indicators {\\n  position: absolute;\\n  right: 0;\\n  bottom: 0;\\n  left: 0;\\n  z-index: 15;\\n  display: flex;\\n  justify-content: center;\\n  padding-left: 0; // override <ol> default\\n  // Use the .carousel-control's width as margin so we don't overlay those\\n  margin-right: $carousel-control-width;\\n  margin-left: $carousel-control-width;\\n  list-style: none;\\n\\n  li {\\n    box-sizing: content-box;\\n    flex: 0 1 auto;\\n    width: $carousel-indicator-width;\\n    height: $carousel-indicator-height;\\n    margin-right: $carousel-indicator-spacer;\\n    margin-left: $carousel-indicator-spacer;\\n    text-indent: -999px;\\n    cursor: pointer;\\n    background-color: $carousel-indicator-active-bg;\\n    background-clip: padding-box;\\n    // Use transparent borders to increase the hit area by 10px on top and bottom.\\n    border-top: $carousel-indicator-hit-area-height solid transparent;\\n    border-bottom: $carousel-indicator-hit-area-height solid transparent;\\n    opacity: .5;\\n    @include transition($carousel-indicator-transition);\\n  }\\n\\n  .active {\\n    opacity: 1;\\n  }\\n}\\n\\n\\n// Optional captions\\n//\\n//\\n\\n.carousel-caption {\\n  position: absolute;\\n  right: (100% - $carousel-caption-width) / 2;\\n  bottom: 20px;\\n  left: (100% - $carousel-caption-width) / 2;\\n  z-index: 10;\\n  padding-top: 20px;\\n  padding-bottom: 20px;\\n  color: $carousel-caption-color;\\n  text-align: center;\\n}\\n\",\"@mixin clearfix() {\\n  &::after {\\n    display: block;\\n    clear: both;\\n    content: \\\"\\\";\\n  }\\n}\\n\",\"//\\n// Rotating border\\n//\\n\\n@keyframes spinner-border {\\n  to { transform: rotate(360deg); }\\n}\\n\\n.spinner-border {\\n  display: inline-block;\\n  width: $spinner-width;\\n  height: $spinner-height;\\n  vertical-align: text-bottom;\\n  border: $spinner-border-width solid currentColor;\\n  border-right-color: transparent;\\n  // stylelint-disable-next-line property-blacklist\\n  border-radius: 50%;\\n  animation: spinner-border .75s linear infinite;\\n}\\n\\n.spinner-border-sm {\\n  width: $spinner-width-sm;\\n  height: $spinner-height-sm;\\n  border-width: $spinner-border-width-sm;\\n}\\n\\n//\\n// Growing circle\\n//\\n\\n@keyframes spinner-grow {\\n  0% {\\n    transform: scale(0);\\n  }\\n  50% {\\n    opacity: 1;\\n  }\\n}\\n\\n.spinner-grow {\\n  display: inline-block;\\n  width: $spinner-width;\\n  height: $spinner-height;\\n  vertical-align: text-bottom;\\n  background-color: currentColor;\\n  // stylelint-disable-next-line property-blacklist\\n  border-radius: 50%;\\n  opacity: 0;\\n  animation: spinner-grow .75s linear infinite;\\n}\\n\\n.spinner-grow-sm {\\n  width: $spinner-width-sm;\\n  height: $spinner-height-sm;\\n}\\n\",\"// stylelint-disable declaration-no-important\\n\\n.align-baseline    { vertical-align: baseline !important; } // Browser default\\n.align-top         { vertical-align: top !important; }\\n.align-middle      { vertical-align: middle !important; }\\n.align-bottom      { vertical-align: bottom !important; }\\n.align-text-bottom { vertical-align: text-bottom !important; }\\n.align-text-top    { vertical-align: text-top !important; }\\n\",\"// stylelint-disable declaration-no-important\\n\\n// Contextual backgrounds\\n\\n@mixin bg-variant($parent, $color) {\\n  #{$parent} {\\n    background-color: $color !important;\\n  }\\n  a#{$parent},\\n  button#{$parent} {\\n    @include hover-focus {\\n      background-color: darken($color, 10%) !important;\\n    }\\n  }\\n}\\n\\n@mixin bg-gradient-variant($parent, $color) {\\n  #{$parent} {\\n    background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x !important;\\n  }\\n}\\n\",\"// stylelint-disable declaration-no-important\\n\\n@each $color, $value in $theme-colors {\\n  @include bg-variant(\\\".bg-#{$color}\\\", $value);\\n}\\n\\n@if $enable-gradients {\\n  @each $color, $value in $theme-colors {\\n    @include bg-gradient-variant(\\\".bg-gradient-#{$color}\\\", $value);\\n  }\\n}\\n\\n.bg-white {\\n  background-color: $white !important;\\n}\\n\\n.bg-transparent {\\n  background-color: transparent !important;\\n}\\n\",\"// stylelint-disable property-blacklist, declaration-no-important\\n\\n//\\n// Border\\n//\\n\\n.border         { border: $border-width solid $border-color !important; }\\n.border-top     { border-top: $border-width solid $border-color !important; }\\n.border-right   { border-right: $border-width solid $border-color !important; }\\n.border-bottom  { border-bottom: $border-width solid $border-color !important; }\\n.border-left    { border-left: $border-width solid $border-color !important; }\\n\\n.border-0        { border: 0 !important; }\\n.border-top-0    { border-top: 0 !important; }\\n.border-right-0  { border-right: 0 !important; }\\n.border-bottom-0 { border-bottom: 0 !important; }\\n.border-left-0   { border-left: 0 !important; }\\n\\n@each $color, $value in $theme-colors {\\n  .border-#{$color} {\\n    border-color: $value !important;\\n  }\\n}\\n\\n.border-white {\\n  border-color: $white !important;\\n}\\n\\n//\\n// Border-radius\\n//\\n\\n.rounded-sm {\\n  border-radius: $border-radius-sm !important;\\n}\\n\\n.rounded {\\n  border-radius: $border-radius !important;\\n}\\n\\n.rounded-top {\\n  border-top-left-radius: $border-radius !important;\\n  border-top-right-radius: $border-radius !important;\\n}\\n\\n.rounded-right {\\n  border-top-right-radius: $border-radius !important;\\n  border-bottom-right-radius: $border-radius !important;\\n}\\n\\n.rounded-bottom {\\n  border-bottom-right-radius: $border-radius !important;\\n  border-bottom-left-radius: $border-radius !important;\\n}\\n\\n.rounded-left {\\n  border-top-left-radius: $border-radius !important;\\n  border-bottom-left-radius: $border-radius !important;\\n}\\n\\n.rounded-lg {\\n  border-radius: $border-radius-lg !important;\\n}\\n\\n.rounded-circle {\\n  border-radius: 50% !important;\\n}\\n\\n.rounded-pill {\\n  border-radius: $rounded-pill !important;\\n}\\n\\n.rounded-0 {\\n  border-radius: 0 !important;\\n}\\n\",\"// stylelint-disable declaration-no-important\\n\\n//\\n// Utilities for common `display` values\\n//\\n\\n@each $breakpoint in map-keys($grid-breakpoints) {\\n  @include media-breakpoint-up($breakpoint) {\\n    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\\n\\n    @each $value in $displays {\\n      .d#{$infix}-#{$value} { display: $value !important; }\\n    }\\n  }\\n}\\n\\n\\n//\\n// Utilities for toggling `display` in print\\n//\\n\\n@media print {\\n  @each $value in $displays {\\n    .d-print-#{$value} { display: $value !important; }\\n  }\\n}\\n\",\"// Credit: Nicolas Gallagher and SUIT CSS.\\n\\n.embed-responsive {\\n  position: relative;\\n  display: block;\\n  width: 100%;\\n  padding: 0;\\n  overflow: hidden;\\n\\n  &::before {\\n    display: block;\\n    content: \\\"\\\";\\n  }\\n\\n  .embed-responsive-item,\\n  iframe,\\n  embed,\\n  object,\\n  video {\\n    position: absolute;\\n    top: 0;\\n    bottom: 0;\\n    left: 0;\\n    width: 100%;\\n    height: 100%;\\n    border: 0;\\n  }\\n}\\n\\n@each $embed-responsive-aspect-ratio in $embed-responsive-aspect-ratios {\\n  $embed-responsive-aspect-ratio-x: nth($embed-responsive-aspect-ratio, 1);\\n  $embed-responsive-aspect-ratio-y: nth($embed-responsive-aspect-ratio, 2);\\n\\n  .embed-responsive-#{$embed-responsive-aspect-ratio-x}by#{$embed-responsive-aspect-ratio-y} {\\n    &::before {\\n      padding-top: percentage($embed-responsive-aspect-ratio-y / $embed-responsive-aspect-ratio-x);\\n    }\\n  }\\n}\\n\",\"// stylelint-disable declaration-no-important\\n\\n// Flex variation\\n//\\n// Custom styles for additional flex alignment options.\\n\\n@each $breakpoint in map-keys($grid-breakpoints) {\\n  @include media-breakpoint-up($breakpoint) {\\n    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\\n\\n    .flex#{$infix}-row            { flex-direction: row !important; }\\n    .flex#{$infix}-column         { flex-direction: column !important; }\\n    .flex#{$infix}-row-reverse    { flex-direction: row-reverse !important; }\\n    .flex#{$infix}-column-reverse { flex-direction: column-reverse !important; }\\n\\n    .flex#{$infix}-wrap         { flex-wrap: wrap !important; }\\n    .flex#{$infix}-nowrap       { flex-wrap: nowrap !important; }\\n    .flex#{$infix}-wrap-reverse { flex-wrap: wrap-reverse !important; }\\n    .flex#{$infix}-fill         { flex: 1 1 auto !important; }\\n    .flex#{$infix}-grow-0       { flex-grow: 0 !important; }\\n    .flex#{$infix}-grow-1       { flex-grow: 1 !important; }\\n    .flex#{$infix}-shrink-0     { flex-shrink: 0 !important; }\\n    .flex#{$infix}-shrink-1     { flex-shrink: 1 !important; }\\n\\n    .justify-content#{$infix}-start   { justify-content: flex-start !important; }\\n    .justify-content#{$infix}-end     { justify-content: flex-end !important; }\\n    .justify-content#{$infix}-center  { justify-content: center !important; }\\n    .justify-content#{$infix}-between { justify-content: space-between !important; }\\n    .justify-content#{$infix}-around  { justify-content: space-around !important; }\\n\\n    .align-items#{$infix}-start    { align-items: flex-start !important; }\\n    .align-items#{$infix}-end      { align-items: flex-end !important; }\\n    .align-items#{$infix}-center   { align-items: center !important; }\\n    .align-items#{$infix}-baseline { align-items: baseline !important; }\\n    .align-items#{$infix}-stretch  { align-items: stretch !important; }\\n\\n    .align-content#{$infix}-start   { align-content: flex-start !important; }\\n    .align-content#{$infix}-end     { align-content: flex-end !important; }\\n    .align-content#{$infix}-center  { align-content: center !important; }\\n    .align-content#{$infix}-between { align-content: space-between !important; }\\n    .align-content#{$infix}-around  { align-content: space-around !important; }\\n    .align-content#{$infix}-stretch { align-content: stretch !important; }\\n\\n    .align-self#{$infix}-auto     { align-self: auto !important; }\\n    .align-self#{$infix}-start    { align-self: flex-start !important; }\\n    .align-self#{$infix}-end      { align-self: flex-end !important; }\\n    .align-self#{$infix}-center   { align-self: center !important; }\\n    .align-self#{$infix}-baseline { align-self: baseline !important; }\\n    .align-self#{$infix}-stretch  { align-self: stretch !important; }\\n  }\\n}\\n\",\"// stylelint-disable declaration-no-important\\n\\n@each $breakpoint in map-keys($grid-breakpoints) {\\n  @include media-breakpoint-up($breakpoint) {\\n    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\\n\\n    .float#{$infix}-left  { float: left !important; }\\n    .float#{$infix}-right { float: right !important; }\\n    .float#{$infix}-none  { float: none !important; }\\n  }\\n}\\n\",\"// stylelint-disable declaration-no-important\\n\\n@each $value in $overflows {\\n  .overflow-#{$value} { overflow: $value !important; }\\n}\\n\",\"// stylelint-disable declaration-no-important\\n\\n// Common values\\n@each $position in $positions {\\n  .position-#{$position} { position: $position !important; }\\n}\\n\\n// Shorthand\\n\\n.fixed-top {\\n  position: fixed;\\n  top: 0;\\n  right: 0;\\n  left: 0;\\n  z-index: $zindex-fixed;\\n}\\n\\n.fixed-bottom {\\n  position: fixed;\\n  right: 0;\\n  bottom: 0;\\n  left: 0;\\n  z-index: $zindex-fixed;\\n}\\n\\n.sticky-top {\\n  @supports (position: sticky) {\\n    position: sticky;\\n    top: 0;\\n    z-index: $zindex-sticky;\\n  }\\n}\\n\",\"//\\n// Screenreaders\\n//\\n\\n.sr-only {\\n  @include sr-only();\\n}\\n\\n.sr-only-focusable {\\n  @include sr-only-focusable();\\n}\\n\",\"// Only display content to screen readers\\n//\\n// See: https://a11yproject.com/posts/how-to-hide-content/\\n// See: https://hugogiraudel.com/2016/10/13/css-hide-and-seek/\\n\\n@mixin sr-only {\\n  position: absolute;\\n  width: 1px;\\n  height: 1px;\\n  padding: 0;\\n  overflow: hidden;\\n  clip: rect(0, 0, 0, 0);\\n  white-space: nowrap;\\n  border: 0;\\n}\\n\\n// Use in conjunction with .sr-only to only display content when it's focused.\\n//\\n// Useful for \\\"Skip to main content\\\" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\\n//\\n// Credit: HTML5 Boilerplate\\n\\n@mixin sr-only-focusable {\\n  &:active,\\n  &:focus {\\n    position: static;\\n    width: auto;\\n    height: auto;\\n    overflow: visible;\\n    clip: auto;\\n    white-space: normal;\\n  }\\n}\\n\",\"// stylelint-disable declaration-no-important\\n\\n.shadow-sm { box-shadow: $box-shadow-sm !important; }\\n.shadow { box-shadow: $box-shadow !important; }\\n.shadow-lg { box-shadow: $box-shadow-lg !important; }\\n.shadow-none { box-shadow: none !important; }\\n\",\"// stylelint-disable declaration-no-important\\n\\n// Width and height\\n\\n@each $prop, $abbrev in (width: w, height: h) {\\n  @each $size, $length in $sizes {\\n    .#{$abbrev}-#{$size} { #{$prop}: $length !important; }\\n  }\\n}\\n\\n.mw-100 { max-width: 100% !important; }\\n.mh-100 { max-height: 100% !important; }\\n\\n// Viewport additional helpers\\n\\n.min-vw-100 { min-width: 100vw !important; }\\n.min-vh-100 { min-height: 100vh !important; }\\n\\n.vw-100 { width: 100vw !important; }\\n.vh-100 { height: 100vh !important; }\\n\",\"//\\n// Stretched link\\n//\\n\\n.stretched-link {\\n  &::after {\\n    position: absolute;\\n    top: 0;\\n    right: 0;\\n    bottom: 0;\\n    left: 0;\\n    z-index: 1;\\n    // Just in case `pointer-events: none` is set on a parent\\n    pointer-events: auto;\\n    content: \\\"\\\";\\n    // IE10 bugfix, see https://stackoverflow.com/questions/16947967/ie10-hover-pseudo-class-doesnt-work-without-background-color\\n    background-color: rgba(0, 0, 0, 0);\\n  }\\n}\\n\",\"// stylelint-disable declaration-no-important\\n\\n// Margin and Padding\\n\\n@each $breakpoint in map-keys($grid-breakpoints) {\\n  @include media-breakpoint-up($breakpoint) {\\n    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\\n\\n    @each $prop, $abbrev in (margin: m, padding: p) {\\n      @each $size, $length in $spacers {\\n        .#{$abbrev}#{$infix}-#{$size} { #{$prop}: $length !important; }\\n        .#{$abbrev}t#{$infix}-#{$size},\\n        .#{$abbrev}y#{$infix}-#{$size} {\\n          #{$prop}-top: $length !important;\\n        }\\n        .#{$abbrev}r#{$infix}-#{$size},\\n        .#{$abbrev}x#{$infix}-#{$size} {\\n          #{$prop}-right: $length !important;\\n        }\\n        .#{$abbrev}b#{$infix}-#{$size},\\n        .#{$abbrev}y#{$infix}-#{$size} {\\n          #{$prop}-bottom: $length !important;\\n        }\\n        .#{$abbrev}l#{$infix}-#{$size},\\n        .#{$abbrev}x#{$infix}-#{$size} {\\n          #{$prop}-left: $length !important;\\n        }\\n      }\\n    }\\n\\n    // Negative margins (e.g., where `.mb-n1` is negative version of `.mb-1`)\\n    @each $size, $length in $spacers {\\n      @if $size != 0 {\\n        .m#{$infix}-n#{$size} { margin: -$length !important; }\\n        .mt#{$infix}-n#{$size},\\n        .my#{$infix}-n#{$size} {\\n          margin-top: -$length !important;\\n        }\\n        .mr#{$infix}-n#{$size},\\n        .mx#{$infix}-n#{$size} {\\n          margin-right: -$length !important;\\n        }\\n        .mb#{$infix}-n#{$size},\\n        .my#{$infix}-n#{$size} {\\n          margin-bottom: -$length !important;\\n        }\\n        .ml#{$infix}-n#{$size},\\n        .mx#{$infix}-n#{$size} {\\n          margin-left: -$length !important;\\n        }\\n      }\\n    }\\n\\n    // Some special margin utils\\n    .m#{$infix}-auto { margin: auto !important; }\\n    .mt#{$infix}-auto,\\n    .my#{$infix}-auto {\\n      margin-top: auto !important;\\n    }\\n    .mr#{$infix}-auto,\\n    .mx#{$infix}-auto {\\n      margin-right: auto !important;\\n    }\\n    .mb#{$infix}-auto,\\n    .my#{$infix}-auto {\\n      margin-bottom: auto !important;\\n    }\\n    .ml#{$infix}-auto,\\n    .mx#{$infix}-auto {\\n      margin-left: auto !important;\\n    }\\n  }\\n}\\n\",\"// stylelint-disable declaration-no-important\\n\\n//\\n// Text\\n//\\n\\n.text-monospace { font-family: $font-family-monospace !important; }\\n\\n// Alignment\\n\\n.text-justify  { text-align: justify !important; }\\n.text-wrap     { white-space: normal !important; }\\n.text-nowrap   { white-space: nowrap !important; }\\n.text-truncate { @include text-truncate; }\\n\\n// Responsive alignment\\n\\n@each $breakpoint in map-keys($grid-breakpoints) {\\n  @include media-breakpoint-up($breakpoint) {\\n    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\\n\\n    .text#{$infix}-left   { text-align: left !important; }\\n    .text#{$infix}-right  { text-align: right !important; }\\n    .text#{$infix}-center { text-align: center !important; }\\n  }\\n}\\n\\n// Transformation\\n\\n.text-lowercase  { text-transform: lowercase !important; }\\n.text-uppercase  { text-transform: uppercase !important; }\\n.text-capitalize { text-transform: capitalize !important; }\\n\\n// Weight and italics\\n\\n.font-weight-light   { font-weight: $font-weight-light !important; }\\n.font-weight-lighter { font-weight: $font-weight-lighter !important; }\\n.font-weight-normal  { font-weight: $font-weight-normal !important; }\\n.font-weight-bold    { font-weight: $font-weight-bold !important; }\\n.font-weight-bolder  { font-weight: $font-weight-bolder !important; }\\n.font-italic         { font-style: italic !important; }\\n\\n// Contextual colors\\n\\n.text-white { color: $white !important; }\\n\\n@each $color, $value in $theme-colors {\\n  @include text-emphasis-variant(\\\".text-#{$color}\\\", $value);\\n}\\n\\n.text-body { color: $body-color !important; }\\n.text-muted { color: $text-muted !important; }\\n\\n.text-black-50 { color: rgba($black, .5) !important; }\\n.text-white-50 { color: rgba($white, .5) !important; }\\n\\n// Misc\\n\\n.text-hide {\\n  @include text-hide($ignore-warning: true);\\n}\\n\\n.text-decoration-none { text-decoration: none !important; }\\n\\n.text-break {\\n  word-break: break-word !important; // IE & < Edge 18\\n  overflow-wrap: break-word !important;\\n}\\n\\n// Reset\\n\\n.text-reset { color: inherit !important; }\\n\",\"// Text truncate\\n// Requires inline-block or block for proper styling\\n\\n@mixin text-truncate() {\\n  overflow: hidden;\\n  text-overflow: ellipsis;\\n  white-space: nowrap;\\n}\\n\",\"// stylelint-disable declaration-no-important\\n\\n// Typography\\n\\n@mixin text-emphasis-variant($parent, $color) {\\n  #{$parent} {\\n    color: $color !important;\\n  }\\n  @if $emphasized-link-hover-darken-percentage != 0 {\\n    a#{$parent} {\\n      @include hover-focus {\\n        color: darken($color, $emphasized-link-hover-darken-percentage) !important;\\n      }\\n    }\\n  }\\n}\\n\",\"// CSS image replacement\\n@mixin text-hide($ignore-warning: false) {\\n  // stylelint-disable-next-line font-family-no-missing-generic-family-keyword\\n  font: 0/0 a;\\n  color: transparent;\\n  text-shadow: none;\\n  background-color: transparent;\\n  border: 0;\\n\\n  @include deprecate(\\\"`text-hide()`\\\", \\\"v4.1.0\\\", \\\"v5\\\", $ignore-warning);\\n}\\n\",\"// stylelint-disable declaration-no-important\\n\\n//\\n// Visibility utilities\\n//\\n\\n.visible {\\n  visibility: visible !important;\\n}\\n\\n.invisible {\\n  visibility: hidden !important;\\n}\\n\",\"// stylelint-disable declaration-no-important, selector-no-qualifying-type\\n\\n// Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css\\n\\n// ==========================================================================\\n// Print styles.\\n// Inlined to avoid the additional HTTP request:\\n// https://www.phpied.com/delay-loading-your-print-css/\\n// ==========================================================================\\n\\n@if $enable-print-styles {\\n  @media print {\\n    *,\\n    *::before,\\n    *::after {\\n      // Bootstrap specific; comment out `color` and `background`\\n      //color: $black !important; // Black prints faster\\n      text-shadow: none !important;\\n      //background: transparent !important;\\n      box-shadow: none !important;\\n    }\\n\\n    a {\\n      &:not(.btn) {\\n        text-decoration: underline;\\n      }\\n    }\\n\\n    // Bootstrap specific; comment the following selector out\\n    //a[href]::after {\\n    //  content: \\\" (\\\" attr(href) \\\")\\\";\\n    //}\\n\\n    abbr[title]::after {\\n      content: \\\" (\\\" attr(title) \\\")\\\";\\n    }\\n\\n    // Bootstrap specific; comment the following selector out\\n    //\\n    // Don't show links that are fragment identifiers,\\n    // or use the `javascript:` pseudo protocol\\n    //\\n\\n    //a[href^=\\\"#\\\"]::after,\\n    //a[href^=\\\"javascript:\\\"]::after {\\n    // content: \\\"\\\";\\n    //}\\n\\n    pre {\\n      white-space: pre-wrap !important;\\n    }\\n    pre,\\n    blockquote {\\n      border: $border-width solid $gray-500; // Bootstrap custom code; using `$border-width` instead of 1px\\n      page-break-inside: avoid;\\n    }\\n\\n    //\\n    // Printing Tables:\\n    // http://css-discuss.incutio.com/wiki/Printing_Tables\\n    //\\n\\n    thead {\\n      display: table-header-group;\\n    }\\n\\n    tr,\\n    img {\\n      page-break-inside: avoid;\\n    }\\n\\n    p,\\n    h2,\\n    h3 {\\n      orphans: 3;\\n      widows: 3;\\n    }\\n\\n    h2,\\n    h3 {\\n      page-break-after: avoid;\\n    }\\n\\n    // Bootstrap specific changes start\\n\\n    // Specify a size and min-width to make printing closer across browsers.\\n    // We don't set margin here because it breaks `size` in Chrome. We also\\n    // don't use `!important` on `size` as it breaks in Chrome.\\n    @page {\\n      size: $print-page-size;\\n    }\\n    body {\\n      min-width: $print-body-min-width !important;\\n    }\\n    .container {\\n      min-width: $print-body-min-width !important;\\n    }\\n\\n    // Bootstrap components\\n    .navbar {\\n      display: none;\\n    }\\n    .badge {\\n      border: $border-width solid $black;\\n    }\\n\\n    .table {\\n      border-collapse: collapse !important;\\n\\n      td,\\n      th {\\n        background-color: $white !important;\\n      }\\n    }\\n\\n    .table-bordered {\\n      th,\\n      td {\\n        border: 1px solid $gray-300 !important;\\n      }\\n    }\\n\\n    .table-dark {\\n      color: inherit;\\n\\n      th,\\n      td,\\n      thead th,\\n      tbody + tbody {\\n        border-color: $table-border-color;\\n      }\\n    }\\n\\n    .table .thead-dark th {\\n      color: inherit;\\n      border-color: $table-border-color;\\n    }\\n\\n    // Bootstrap specific changes end\\n  }\\n}\\n\"]}"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bootstrap4/css/bootstrap.min.css",
    "content": "/*!\n * Bootstrap v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,\"Noto Sans\",sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,\"Noto Sans\",sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex=\"-1\"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:\"\\2014\\00A0\"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem);background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\");background-repeat:no-repeat;background-position:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right .75rem center/8px 10px,url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip{display:block}.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\");background-repeat:no-repeat;background-position:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right .75rem center/8px 10px,url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip{display:block}.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:\"\";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:\"\";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:\"\";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:\"\"}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:\"\";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:\"\";background-color:#fff;border:#adb5bd solid 1px}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:\"\";background:no-repeat 50%/50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e\")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e\")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e\")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right .75rem center/8px 10px;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size=\"1\"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:\"Browse\"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:\"Browse\";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:calc(1rem + .4rem);padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:\"\";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0%;flex:1 0 0%;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion>.card{overflow:hidden}.accordion>.card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion>.card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion>.card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.accordion>.card .card-header{margin-bottom:-1px}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:\"/\"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}@media (min-width:576px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-sm .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-md .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:992px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-lg .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:1200px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-xl .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush .list-group-item:last-child{margin-bottom:-1px}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{margin-bottom:0;border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal-dialog-scrollable{display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);content:\"\"}.modal-dialog-centered.modal-dialog-scrollable{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #dee2e6;border-bottom-right-radius:.3rem;border-bottom-left-radius:.3rem}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,\"Noto Sans\",sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:\"\";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,\"Noto Sans\",sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:\"\";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:\"\";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:\"\"}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:0s .6s opacity}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50%/100% 100%}.carousel-control-prev-icon{background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\")}.carousel-control-next-icon{background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:\"\"}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:\"\"}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:\"\";background-color:rgba(0,0,0,0)}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;overflow-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:\" (\" attr(title) \")\"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}}\n/*# sourceMappingURL=bootstrap.min.css.map */"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bootstrap4/css/bootstrap.min.css.map",
    "content": "{\"version\":3,\"sources\":[\"../../scss/bootstrap.scss\",\"../../scss/_root.scss\",\"../../scss/_reboot.scss\",\"dist/css/bootstrap.css\",\"../../scss/vendor/_rfs.scss\",\"bootstrap.css\",\"../../scss/mixins/_hover.scss\",\"../../scss/_type.scss\",\"../../scss/mixins/_lists.scss\",\"../../scss/_images.scss\",\"../../scss/mixins/_image.scss\",\"../../scss/mixins/_border-radius.scss\",\"../../scss/_code.scss\",\"../../scss/_grid.scss\",\"../../scss/mixins/_grid.scss\",\"../../scss/mixins/_breakpoints.scss\",\"../../scss/mixins/_grid-framework.scss\",\"../../scss/_tables.scss\",\"../../scss/mixins/_table-row.scss\",\"../../scss/_forms.scss\",\"../../scss/mixins/_transition.scss\",\"../../scss/mixins/_forms.scss\",\"../../scss/mixins/_gradients.scss\",\"../../scss/_buttons.scss\",\"../../scss/mixins/_buttons.scss\",\"../../scss/_transitions.scss\",\"../../scss/_dropdown.scss\",\"../../scss/mixins/_caret.scss\",\"../../scss/mixins/_nav-divider.scss\",\"../../scss/_button-group.scss\",\"../../scss/_input-group.scss\",\"../../scss/_custom-forms.scss\",\"../../scss/_nav.scss\",\"../../scss/_navbar.scss\",\"../../scss/_card.scss\",\"../../scss/_breadcrumb.scss\",\"../../scss/_pagination.scss\",\"../../scss/mixins/_pagination.scss\",\"../../scss/_badge.scss\",\"../../scss/mixins/_badge.scss\",\"../../scss/_jumbotron.scss\",\"../../scss/_alert.scss\",\"../../scss/mixins/_alert.scss\",\"../../scss/_progress.scss\",\"../../scss/_media.scss\",\"../../scss/_list-group.scss\",\"../../scss/mixins/_list-group.scss\",\"../../scss/_close.scss\",\"../../scss/_toasts.scss\",\"../../scss/_modal.scss\",\"../../scss/_tooltip.scss\",\"../../scss/mixins/_reset-text.scss\",\"../../scss/_popover.scss\",\"../../scss/_carousel.scss\",\"../../scss/mixins/_clearfix.scss\",\"../../scss/_spinners.scss\",\"../../scss/utilities/_align.scss\",\"../../scss/mixins/_background-variant.scss\",\"../../scss/utilities/_background.scss\",\"../../scss/utilities/_borders.scss\",\"../../scss/utilities/_display.scss\",\"../../scss/utilities/_embed.scss\",\"../../scss/utilities/_flex.scss\",\"../../scss/utilities/_float.scss\",\"../../scss/utilities/_overflow.scss\",\"../../scss/utilities/_position.scss\",\"../../scss/utilities/_screenreaders.scss\",\"../../scss/mixins/_screen-reader.scss\",\"../../scss/utilities/_shadows.scss\",\"../../scss/utilities/_sizing.scss\",\"../../scss/utilities/_stretched-link.scss\",\"../../scss/utilities/_spacing.scss\",\"../../scss/utilities/_text.scss\",\"../../scss/mixins/_text-truncate.scss\",\"../../scss/mixins/_text-emphasis.scss\",\"../../scss/mixins/_text-hide.scss\",\"../../scss/utilities/_visibility.scss\",\"../../scss/_print.scss\"],\"names\":[],\"mappings\":\"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\",\"sourcesContent\":[\"/*!\\n * Bootstrap v4.3.1 (https://getbootstrap.com/)\\n * Copyright 2011-2019 The Bootstrap Authors\\n * Copyright 2011-2019 Twitter, Inc.\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n */\\n\\n@import \\\"functions\\\";\\n@import \\\"variables\\\";\\n@import \\\"mixins\\\";\\n@import \\\"root\\\";\\n@import \\\"reboot\\\";\\n@import \\\"type\\\";\\n@import \\\"images\\\";\\n@import \\\"code\\\";\\n@import \\\"grid\\\";\\n@import \\\"tables\\\";\\n@import \\\"forms\\\";\\n@import \\\"buttons\\\";\\n@import \\\"transitions\\\";\\n@import \\\"dropdown\\\";\\n@import \\\"button-group\\\";\\n@import \\\"input-group\\\";\\n@import \\\"custom-forms\\\";\\n@import \\\"nav\\\";\\n@import \\\"navbar\\\";\\n@import \\\"card\\\";\\n@import \\\"breadcrumb\\\";\\n@import \\\"pagination\\\";\\n@import \\\"badge\\\";\\n@import \\\"jumbotron\\\";\\n@import \\\"alert\\\";\\n@import \\\"progress\\\";\\n@import \\\"media\\\";\\n@import \\\"list-group\\\";\\n@import \\\"close\\\";\\n@import \\\"toasts\\\";\\n@import \\\"modal\\\";\\n@import \\\"tooltip\\\";\\n@import \\\"popover\\\";\\n@import \\\"carousel\\\";\\n@import \\\"spinners\\\";\\n@import \\\"utilities\\\";\\n@import \\\"print\\\";\\n\",\":root {\\n  // Custom variable values only support SassScript inside `#{}`.\\n  @each $color, $value in $colors {\\n    --#{$color}: #{$value};\\n  }\\n\\n  @each $color, $value in $theme-colors {\\n    --#{$color}: #{$value};\\n  }\\n\\n  @each $bp, $value in $grid-breakpoints {\\n    --breakpoint-#{$bp}: #{$value};\\n  }\\n\\n  // Use `inspect` for lists so that quoted items keep the quotes.\\n  // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\\n  --font-family-sans-serif: #{inspect($font-family-sans-serif)};\\n  --font-family-monospace: #{inspect($font-family-monospace)};\\n}\\n\",\"// stylelint-disable at-rule-no-vendor-prefix, declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\\n\\n// Reboot\\n//\\n// Normalization of HTML elements, manually forked from Normalize.css to remove\\n// styles targeting irrelevant browsers while applying new styles.\\n//\\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\\n\\n\\n// Document\\n//\\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\\n// 2. Change the default font family in all browsers.\\n// 3. Correct the line height in all browsers.\\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\\n// 5. Change the default tap highlight to be completely transparent in iOS.\\n\\n*,\\n*::before,\\n*::after {\\n  box-sizing: border-box; // 1\\n}\\n\\nhtml {\\n  font-family: sans-serif; // 2\\n  line-height: 1.15; // 3\\n  -webkit-text-size-adjust: 100%; // 4\\n  -webkit-tap-highlight-color: rgba($black, 0); // 5\\n}\\n\\n// Shim for \\\"new\\\" HTML5 structural elements to display correctly (IE10, older browsers)\\n// TODO: remove in v5\\n// stylelint-disable-next-line selector-list-comma-newline-after\\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\\n  display: block;\\n}\\n\\n// Body\\n//\\n// 1. Remove the margin in all browsers.\\n// 2. As a best practice, apply a default `background-color`.\\n// 3. Set an explicit initial text-align value so that we can later use\\n//    the `inherit` value on things like `<th>` elements.\\n\\nbody {\\n  margin: 0; // 1\\n  font-family: $font-family-base;\\n  @include font-size($font-size-base);\\n  font-weight: $font-weight-base;\\n  line-height: $line-height-base;\\n  color: $body-color;\\n  text-align: left; // 3\\n  background-color: $body-bg; // 2\\n}\\n\\n// Suppress the focus outline on elements that cannot be accessed via keyboard.\\n// This prevents an unwanted focus outline from appearing around elements that\\n// might still respond to pointer events.\\n//\\n// Credit: https://github.com/suitcss/base\\n[tabindex=\\\"-1\\\"]:focus {\\n  outline: 0 !important;\\n}\\n\\n\\n// Content grouping\\n//\\n// 1. Add the correct box sizing in Firefox.\\n// 2. Show the overflow in Edge and IE.\\n\\nhr {\\n  box-sizing: content-box; // 1\\n  height: 0; // 1\\n  overflow: visible; // 2\\n}\\n\\n\\n//\\n// Typography\\n//\\n\\n// Remove top margins from headings\\n//\\n// By default, `<h1>`-`<h6>` all receive top and bottom margins. We nuke the top\\n// margin for easier control within type scales as it avoids margin collapsing.\\n// stylelint-disable-next-line selector-list-comma-newline-after\\nh1, h2, h3, h4, h5, h6 {\\n  margin-top: 0;\\n  margin-bottom: $headings-margin-bottom;\\n}\\n\\n// Reset margins on paragraphs\\n//\\n// Similarly, the top margin on `<p>`s get reset. However, we also reset the\\n// bottom margin to use `rem` units instead of `em`.\\np {\\n  margin-top: 0;\\n  margin-bottom: $paragraph-margin-bottom;\\n}\\n\\n// Abbreviations\\n//\\n// 1. Duplicate behavior to the data-* attribute for our tooltip plugin\\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\\n// 3. Add explicit cursor to indicate changed behavior.\\n// 4. Remove the bottom border in Firefox 39-.\\n// 5. Prevent the text-decoration to be skipped.\\n\\nabbr[title],\\nabbr[data-original-title] { // 1\\n  text-decoration: underline; // 2\\n  text-decoration: underline dotted; // 2\\n  cursor: help; // 3\\n  border-bottom: 0; // 4\\n  text-decoration-skip-ink: none; // 5\\n}\\n\\naddress {\\n  margin-bottom: 1rem;\\n  font-style: normal;\\n  line-height: inherit;\\n}\\n\\nol,\\nul,\\ndl {\\n  margin-top: 0;\\n  margin-bottom: 1rem;\\n}\\n\\nol ol,\\nul ul,\\nol ul,\\nul ol {\\n  margin-bottom: 0;\\n}\\n\\ndt {\\n  font-weight: $dt-font-weight;\\n}\\n\\ndd {\\n  margin-bottom: .5rem;\\n  margin-left: 0; // Undo browser default\\n}\\n\\nblockquote {\\n  margin: 0 0 1rem;\\n}\\n\\nb,\\nstrong {\\n  font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari\\n}\\n\\nsmall {\\n  @include font-size(80%); // Add the correct font size in all browsers\\n}\\n\\n//\\n// Prevent `sub` and `sup` elements from affecting the line height in\\n// all browsers.\\n//\\n\\nsub,\\nsup {\\n  position: relative;\\n  @include font-size(75%);\\n  line-height: 0;\\n  vertical-align: baseline;\\n}\\n\\nsub { bottom: -.25em; }\\nsup { top: -.5em; }\\n\\n\\n//\\n// Links\\n//\\n\\na {\\n  color: $link-color;\\n  text-decoration: $link-decoration;\\n  background-color: transparent; // Remove the gray background on active links in IE 10.\\n\\n  @include hover {\\n    color: $link-hover-color;\\n    text-decoration: $link-hover-decoration;\\n  }\\n}\\n\\n// And undo these styles for placeholder links/named anchors (without href)\\n// which have not been made explicitly keyboard-focusable (without tabindex).\\n// It would be more straightforward to just use a[href] in previous block, but that\\n// causes specificity issues in many other styles that are too complex to fix.\\n// See https://github.com/twbs/bootstrap/issues/19402\\n\\na:not([href]):not([tabindex]) {\\n  color: inherit;\\n  text-decoration: none;\\n\\n  @include hover-focus {\\n    color: inherit;\\n    text-decoration: none;\\n  }\\n\\n  &:focus {\\n    outline: 0;\\n  }\\n}\\n\\n\\n//\\n// Code\\n//\\n\\npre,\\ncode,\\nkbd,\\nsamp {\\n  font-family: $font-family-monospace;\\n  @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\\n}\\n\\npre {\\n  // Remove browser default top margin\\n  margin-top: 0;\\n  // Reset browser default of `1em` to use `rem`s\\n  margin-bottom: 1rem;\\n  // Don't allow content to break outside\\n  overflow: auto;\\n}\\n\\n\\n//\\n// Figures\\n//\\n\\nfigure {\\n  // Apply a consistent margin strategy (matches our type styles).\\n  margin: 0 0 1rem;\\n}\\n\\n\\n//\\n// Images and content\\n//\\n\\nimg {\\n  vertical-align: middle;\\n  border-style: none; // Remove the border on images inside links in IE 10-.\\n}\\n\\nsvg {\\n  // Workaround for the SVG overflow bug in IE10/11 is still required.\\n  // See https://github.com/twbs/bootstrap/issues/26878\\n  overflow: hidden;\\n  vertical-align: middle;\\n}\\n\\n\\n//\\n// Tables\\n//\\n\\ntable {\\n  border-collapse: collapse; // Prevent double borders\\n}\\n\\ncaption {\\n  padding-top: $table-cell-padding;\\n  padding-bottom: $table-cell-padding;\\n  color: $table-caption-color;\\n  text-align: left;\\n  caption-side: bottom;\\n}\\n\\nth {\\n  // Matches default `<td>` alignment by inheriting from the `<body>`, or the\\n  // closest parent with a set `text-align`.\\n  text-align: inherit;\\n}\\n\\n\\n//\\n// Forms\\n//\\n\\nlabel {\\n  // Allow labels to use `margin` for spacing.\\n  display: inline-block;\\n  margin-bottom: $label-margin-bottom;\\n}\\n\\n// Remove the default `border-radius` that macOS Chrome adds.\\n//\\n// Details at https://github.com/twbs/bootstrap/issues/24093\\nbutton {\\n  // stylelint-disable-next-line property-blacklist\\n  border-radius: 0;\\n}\\n\\n// Work around a Firefox/IE bug where the transparent `button` background\\n// results in a loss of the default `button` focus styles.\\n//\\n// Credit: https://github.com/suitcss/base/\\nbutton:focus {\\n  outline: 1px dotted;\\n  outline: 5px auto -webkit-focus-ring-color;\\n}\\n\\ninput,\\nbutton,\\nselect,\\noptgroup,\\ntextarea {\\n  margin: 0; // Remove the margin in Firefox and Safari\\n  font-family: inherit;\\n  @include font-size(inherit);\\n  line-height: inherit;\\n}\\n\\nbutton,\\ninput {\\n  overflow: visible; // Show the overflow in Edge\\n}\\n\\nbutton,\\nselect {\\n  text-transform: none; // Remove the inheritance of text transform in Firefox\\n}\\n\\n// Remove the inheritance of word-wrap in Safari.\\n//\\n// Details at https://github.com/twbs/bootstrap/issues/24990\\nselect {\\n  word-wrap: normal;\\n}\\n\\n\\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\\n//    controls in Android 4.\\n// 2. Correct the inability to style clickable types in iOS and Safari.\\nbutton,\\n[type=\\\"button\\\"], // 1\\n[type=\\\"reset\\\"],\\n[type=\\\"submit\\\"] {\\n  -webkit-appearance: button; // 2\\n}\\n\\n// Opinionated: add \\\"hand\\\" cursor to non-disabled button elements.\\n@if $enable-pointer-cursor-for-buttons {\\n  button,\\n  [type=\\\"button\\\"],\\n  [type=\\\"reset\\\"],\\n  [type=\\\"submit\\\"] {\\n    &:not(:disabled) {\\n      cursor: pointer;\\n    }\\n  }\\n}\\n\\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\\nbutton::-moz-focus-inner,\\n[type=\\\"button\\\"]::-moz-focus-inner,\\n[type=\\\"reset\\\"]::-moz-focus-inner,\\n[type=\\\"submit\\\"]::-moz-focus-inner {\\n  padding: 0;\\n  border-style: none;\\n}\\n\\ninput[type=\\\"radio\\\"],\\ninput[type=\\\"checkbox\\\"] {\\n  box-sizing: border-box; // 1. Add the correct box sizing in IE 10-\\n  padding: 0; // 2. Remove the padding in IE 10-\\n}\\n\\n\\ninput[type=\\\"date\\\"],\\ninput[type=\\\"time\\\"],\\ninput[type=\\\"datetime-local\\\"],\\ninput[type=\\\"month\\\"] {\\n  // Remove the default appearance of temporal inputs to avoid a Mobile Safari\\n  // bug where setting a custom line-height prevents text from being vertically\\n  // centered within the input.\\n  // See https://bugs.webkit.org/show_bug.cgi?id=139848\\n  // and https://github.com/twbs/bootstrap/issues/11266\\n  -webkit-appearance: listbox;\\n}\\n\\ntextarea {\\n  overflow: auto; // Remove the default vertical scrollbar in IE.\\n  // Textareas should really only resize vertically so they don't break their (horizontal) containers.\\n  resize: vertical;\\n}\\n\\nfieldset {\\n  // Browsers set a default `min-width: min-content;` on fieldsets,\\n  // unlike e.g. `<div>`s, which have `min-width: 0;` by default.\\n  // So we reset that to ensure fieldsets behave more like a standard block element.\\n  // See https://github.com/twbs/bootstrap/issues/12359\\n  // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\\n  min-width: 0;\\n  // Reset the default outline behavior of fieldsets so they don't affect page layout.\\n  padding: 0;\\n  margin: 0;\\n  border: 0;\\n}\\n\\n// 1. Correct the text wrapping in Edge and IE.\\n// 2. Correct the color inheritance from `fieldset` elements in IE.\\nlegend {\\n  display: block;\\n  width: 100%;\\n  max-width: 100%; // 1\\n  padding: 0;\\n  margin-bottom: .5rem;\\n  @include font-size(1.5rem);\\n  line-height: inherit;\\n  color: inherit; // 2\\n  white-space: normal; // 1\\n}\\n\\nprogress {\\n  vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.\\n}\\n\\n// Correct the cursor style of increment and decrement buttons in Chrome.\\n[type=\\\"number\\\"]::-webkit-inner-spin-button,\\n[type=\\\"number\\\"]::-webkit-outer-spin-button {\\n  height: auto;\\n}\\n\\n[type=\\\"search\\\"] {\\n  // This overrides the extra rounded corners on search inputs in iOS so that our\\n  // `.form-control` class can properly style them. Note that this cannot simply\\n  // be added to `.form-control` as it's not specific enough. For details, see\\n  // https://github.com/twbs/bootstrap/issues/11586.\\n  outline-offset: -2px; // 2. Correct the outline style in Safari.\\n  -webkit-appearance: none;\\n}\\n\\n//\\n// Remove the inner padding in Chrome and Safari on macOS.\\n//\\n\\n[type=\\\"search\\\"]::-webkit-search-decoration {\\n  -webkit-appearance: none;\\n}\\n\\n//\\n// 1. Correct the inability to style clickable types in iOS and Safari.\\n// 2. Change font properties to `inherit` in Safari.\\n//\\n\\n::-webkit-file-upload-button {\\n  font: inherit; // 2\\n  -webkit-appearance: button; // 1\\n}\\n\\n//\\n// Correct element displays\\n//\\n\\noutput {\\n  display: inline-block;\\n}\\n\\nsummary {\\n  display: list-item; // Add the correct display in all browsers\\n  cursor: pointer;\\n}\\n\\ntemplate {\\n  display: none; // Add the correct display in IE\\n}\\n\\n// Always hide an element with the `hidden` HTML attribute (from PureCSS).\\n// Needed for proper display in IE 10-.\\n[hidden] {\\n  display: none !important;\\n}\\n\",\"/*!\\n * Bootstrap v4.3.1 (https://getbootstrap.com/)\\n * Copyright 2011-2019 The Bootstrap Authors\\n * Copyright 2011-2019 Twitter, Inc.\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n */\\n:root {\\n  --blue: #007bff;\\n  --indigo: #6610f2;\\n  --purple: #6f42c1;\\n  --pink: #e83e8c;\\n  --red: #dc3545;\\n  --orange: #fd7e14;\\n  --yellow: #ffc107;\\n  --green: #28a745;\\n  --teal: #20c997;\\n  --cyan: #17a2b8;\\n  --white: #fff;\\n  --gray: #6c757d;\\n  --gray-dark: #343a40;\\n  --primary: #007bff;\\n  --secondary: #6c757d;\\n  --success: #28a745;\\n  --info: #17a2b8;\\n  --warning: #ffc107;\\n  --danger: #dc3545;\\n  --light: #f8f9fa;\\n  --dark: #343a40;\\n  --breakpoint-xs: 0;\\n  --breakpoint-sm: 576px;\\n  --breakpoint-md: 768px;\\n  --breakpoint-lg: 992px;\\n  --breakpoint-xl: 1200px;\\n  --font-family-sans-serif: -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, \\\"Helvetica Neue\\\", Arial, \\\"Noto Sans\\\", sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\";\\n  --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace;\\n}\\n\\n*,\\n*::before,\\n*::after {\\n  box-sizing: border-box;\\n}\\n\\nhtml {\\n  font-family: sans-serif;\\n  line-height: 1.15;\\n  -webkit-text-size-adjust: 100%;\\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\\n}\\n\\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\\n  display: block;\\n}\\n\\nbody {\\n  margin: 0;\\n  font-family: -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, \\\"Helvetica Neue\\\", Arial, \\\"Noto Sans\\\", sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\";\\n  font-size: 1rem;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  color: #212529;\\n  text-align: left;\\n  background-color: #fff;\\n}\\n\\n[tabindex=\\\"-1\\\"]:focus {\\n  outline: 0 !important;\\n}\\n\\nhr {\\n  box-sizing: content-box;\\n  height: 0;\\n  overflow: visible;\\n}\\n\\nh1, h2, h3, h4, h5, h6 {\\n  margin-top: 0;\\n  margin-bottom: 0.5rem;\\n}\\n\\np {\\n  margin-top: 0;\\n  margin-bottom: 1rem;\\n}\\n\\nabbr[title],\\nabbr[data-original-title] {\\n  text-decoration: underline;\\n  -webkit-text-decoration: underline dotted;\\n  text-decoration: underline dotted;\\n  cursor: help;\\n  border-bottom: 0;\\n  -webkit-text-decoration-skip-ink: none;\\n  text-decoration-skip-ink: none;\\n}\\n\\naddress {\\n  margin-bottom: 1rem;\\n  font-style: normal;\\n  line-height: inherit;\\n}\\n\\nol,\\nul,\\ndl {\\n  margin-top: 0;\\n  margin-bottom: 1rem;\\n}\\n\\nol ol,\\nul ul,\\nol ul,\\nul ol {\\n  margin-bottom: 0;\\n}\\n\\ndt {\\n  font-weight: 700;\\n}\\n\\ndd {\\n  margin-bottom: .5rem;\\n  margin-left: 0;\\n}\\n\\nblockquote {\\n  margin: 0 0 1rem;\\n}\\n\\nb,\\nstrong {\\n  font-weight: bolder;\\n}\\n\\nsmall {\\n  font-size: 80%;\\n}\\n\\nsub,\\nsup {\\n  position: relative;\\n  font-size: 75%;\\n  line-height: 0;\\n  vertical-align: baseline;\\n}\\n\\nsub {\\n  bottom: -.25em;\\n}\\n\\nsup {\\n  top: -.5em;\\n}\\n\\na {\\n  color: #007bff;\\n  text-decoration: none;\\n  background-color: transparent;\\n}\\n\\na:hover {\\n  color: #0056b3;\\n  text-decoration: underline;\\n}\\n\\na:not([href]):not([tabindex]) {\\n  color: inherit;\\n  text-decoration: none;\\n}\\n\\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\\n  color: inherit;\\n  text-decoration: none;\\n}\\n\\na:not([href]):not([tabindex]):focus {\\n  outline: 0;\\n}\\n\\npre,\\ncode,\\nkbd,\\nsamp {\\n  font-family: SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace;\\n  font-size: 1em;\\n}\\n\\npre {\\n  margin-top: 0;\\n  margin-bottom: 1rem;\\n  overflow: auto;\\n}\\n\\nfigure {\\n  margin: 0 0 1rem;\\n}\\n\\nimg {\\n  vertical-align: middle;\\n  border-style: none;\\n}\\n\\nsvg {\\n  overflow: hidden;\\n  vertical-align: middle;\\n}\\n\\ntable {\\n  border-collapse: collapse;\\n}\\n\\ncaption {\\n  padding-top: 0.75rem;\\n  padding-bottom: 0.75rem;\\n  color: #6c757d;\\n  text-align: left;\\n  caption-side: bottom;\\n}\\n\\nth {\\n  text-align: inherit;\\n}\\n\\nlabel {\\n  display: inline-block;\\n  margin-bottom: 0.5rem;\\n}\\n\\nbutton {\\n  border-radius: 0;\\n}\\n\\nbutton:focus {\\n  outline: 1px dotted;\\n  outline: 5px auto -webkit-focus-ring-color;\\n}\\n\\ninput,\\nbutton,\\nselect,\\noptgroup,\\ntextarea {\\n  margin: 0;\\n  font-family: inherit;\\n  font-size: inherit;\\n  line-height: inherit;\\n}\\n\\nbutton,\\ninput {\\n  overflow: visible;\\n}\\n\\nbutton,\\nselect {\\n  text-transform: none;\\n}\\n\\nselect {\\n  word-wrap: normal;\\n}\\n\\nbutton,\\n[type=\\\"button\\\"],\\n[type=\\\"reset\\\"],\\n[type=\\\"submit\\\"] {\\n  -webkit-appearance: button;\\n}\\n\\nbutton:not(:disabled),\\n[type=\\\"button\\\"]:not(:disabled),\\n[type=\\\"reset\\\"]:not(:disabled),\\n[type=\\\"submit\\\"]:not(:disabled) {\\n  cursor: pointer;\\n}\\n\\nbutton::-moz-focus-inner,\\n[type=\\\"button\\\"]::-moz-focus-inner,\\n[type=\\\"reset\\\"]::-moz-focus-inner,\\n[type=\\\"submit\\\"]::-moz-focus-inner {\\n  padding: 0;\\n  border-style: none;\\n}\\n\\ninput[type=\\\"radio\\\"],\\ninput[type=\\\"checkbox\\\"] {\\n  box-sizing: border-box;\\n  padding: 0;\\n}\\n\\ninput[type=\\\"date\\\"],\\ninput[type=\\\"time\\\"],\\ninput[type=\\\"datetime-local\\\"],\\ninput[type=\\\"month\\\"] {\\n  -webkit-appearance: listbox;\\n}\\n\\ntextarea {\\n  overflow: auto;\\n  resize: vertical;\\n}\\n\\nfieldset {\\n  min-width: 0;\\n  padding: 0;\\n  margin: 0;\\n  border: 0;\\n}\\n\\nlegend {\\n  display: block;\\n  width: 100%;\\n  max-width: 100%;\\n  padding: 0;\\n  margin-bottom: .5rem;\\n  font-size: 1.5rem;\\n  line-height: inherit;\\n  color: inherit;\\n  white-space: normal;\\n}\\n\\nprogress {\\n  vertical-align: baseline;\\n}\\n\\n[type=\\\"number\\\"]::-webkit-inner-spin-button,\\n[type=\\\"number\\\"]::-webkit-outer-spin-button {\\n  height: auto;\\n}\\n\\n[type=\\\"search\\\"] {\\n  outline-offset: -2px;\\n  -webkit-appearance: none;\\n}\\n\\n[type=\\\"search\\\"]::-webkit-search-decoration {\\n  -webkit-appearance: none;\\n}\\n\\n::-webkit-file-upload-button {\\n  font: inherit;\\n  -webkit-appearance: button;\\n}\\n\\noutput {\\n  display: inline-block;\\n}\\n\\nsummary {\\n  display: list-item;\\n  cursor: pointer;\\n}\\n\\ntemplate {\\n  display: none;\\n}\\n\\n[hidden] {\\n  display: none !important;\\n}\\n\\nh1, h2, h3, h4, h5, h6,\\n.h1, .h2, .h3, .h4, .h5, .h6 {\\n  margin-bottom: 0.5rem;\\n  font-weight: 500;\\n  line-height: 1.2;\\n}\\n\\nh1, .h1 {\\n  font-size: 2.5rem;\\n}\\n\\nh2, .h2 {\\n  font-size: 2rem;\\n}\\n\\nh3, .h3 {\\n  font-size: 1.75rem;\\n}\\n\\nh4, .h4 {\\n  font-size: 1.5rem;\\n}\\n\\nh5, .h5 {\\n  font-size: 1.25rem;\\n}\\n\\nh6, .h6 {\\n  font-size: 1rem;\\n}\\n\\n.lead {\\n  font-size: 1.25rem;\\n  font-weight: 300;\\n}\\n\\n.display-1 {\\n  font-size: 6rem;\\n  font-weight: 300;\\n  line-height: 1.2;\\n}\\n\\n.display-2 {\\n  font-size: 5.5rem;\\n  font-weight: 300;\\n  line-height: 1.2;\\n}\\n\\n.display-3 {\\n  font-size: 4.5rem;\\n  font-weight: 300;\\n  line-height: 1.2;\\n}\\n\\n.display-4 {\\n  font-size: 3.5rem;\\n  font-weight: 300;\\n  line-height: 1.2;\\n}\\n\\nhr {\\n  margin-top: 1rem;\\n  margin-bottom: 1rem;\\n  border: 0;\\n  border-top: 1px solid rgba(0, 0, 0, 0.1);\\n}\\n\\nsmall,\\n.small {\\n  font-size: 80%;\\n  font-weight: 400;\\n}\\n\\nmark,\\n.mark {\\n  padding: 0.2em;\\n  background-color: #fcf8e3;\\n}\\n\\n.list-unstyled {\\n  padding-left: 0;\\n  list-style: none;\\n}\\n\\n.list-inline {\\n  padding-left: 0;\\n  list-style: none;\\n}\\n\\n.list-inline-item {\\n  display: inline-block;\\n}\\n\\n.list-inline-item:not(:last-child) {\\n  margin-right: 0.5rem;\\n}\\n\\n.initialism {\\n  font-size: 90%;\\n  text-transform: uppercase;\\n}\\n\\n.blockquote {\\n  margin-bottom: 1rem;\\n  font-size: 1.25rem;\\n}\\n\\n.blockquote-footer {\\n  display: block;\\n  font-size: 80%;\\n  color: #6c757d;\\n}\\n\\n.blockquote-footer::before {\\n  content: \\\"\\\\2014\\\\00A0\\\";\\n}\\n\\n.img-fluid {\\n  max-width: 100%;\\n  height: auto;\\n}\\n\\n.img-thumbnail {\\n  padding: 0.25rem;\\n  background-color: #fff;\\n  border: 1px solid #dee2e6;\\n  border-radius: 0.25rem;\\n  max-width: 100%;\\n  height: auto;\\n}\\n\\n.figure {\\n  display: inline-block;\\n}\\n\\n.figure-img {\\n  margin-bottom: 0.5rem;\\n  line-height: 1;\\n}\\n\\n.figure-caption {\\n  font-size: 90%;\\n  color: #6c757d;\\n}\\n\\ncode {\\n  font-size: 87.5%;\\n  color: #e83e8c;\\n  word-break: break-word;\\n}\\n\\na > code {\\n  color: inherit;\\n}\\n\\nkbd {\\n  padding: 0.2rem 0.4rem;\\n  font-size: 87.5%;\\n  color: #fff;\\n  background-color: #212529;\\n  border-radius: 0.2rem;\\n}\\n\\nkbd kbd {\\n  padding: 0;\\n  font-size: 100%;\\n  font-weight: 700;\\n}\\n\\npre {\\n  display: block;\\n  font-size: 87.5%;\\n  color: #212529;\\n}\\n\\npre code {\\n  font-size: inherit;\\n  color: inherit;\\n  word-break: normal;\\n}\\n\\n.pre-scrollable {\\n  max-height: 340px;\\n  overflow-y: scroll;\\n}\\n\\n.container {\\n  width: 100%;\\n  padding-right: 15px;\\n  padding-left: 15px;\\n  margin-right: auto;\\n  margin-left: auto;\\n}\\n\\n@media (min-width: 576px) {\\n  .container {\\n    max-width: 540px;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .container {\\n    max-width: 720px;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .container {\\n    max-width: 960px;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .container {\\n    max-width: 1140px;\\n  }\\n}\\n\\n.container-fluid {\\n  width: 100%;\\n  padding-right: 15px;\\n  padding-left: 15px;\\n  margin-right: auto;\\n  margin-left: auto;\\n}\\n\\n.row {\\n  display: -ms-flexbox;\\n  display: flex;\\n  -ms-flex-wrap: wrap;\\n  flex-wrap: wrap;\\n  margin-right: -15px;\\n  margin-left: -15px;\\n}\\n\\n.no-gutters {\\n  margin-right: 0;\\n  margin-left: 0;\\n}\\n\\n.no-gutters > .col,\\n.no-gutters > [class*=\\\"col-\\\"] {\\n  padding-right: 0;\\n  padding-left: 0;\\n}\\n\\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\\n.col-xl-auto {\\n  position: relative;\\n  width: 100%;\\n  padding-right: 15px;\\n  padding-left: 15px;\\n}\\n\\n.col {\\n  -ms-flex-preferred-size: 0;\\n  flex-basis: 0;\\n  -ms-flex-positive: 1;\\n  flex-grow: 1;\\n  max-width: 100%;\\n}\\n\\n.col-auto {\\n  -ms-flex: 0 0 auto;\\n  flex: 0 0 auto;\\n  width: auto;\\n  max-width: 100%;\\n}\\n\\n.col-1 {\\n  -ms-flex: 0 0 8.333333%;\\n  flex: 0 0 8.333333%;\\n  max-width: 8.333333%;\\n}\\n\\n.col-2 {\\n  -ms-flex: 0 0 16.666667%;\\n  flex: 0 0 16.666667%;\\n  max-width: 16.666667%;\\n}\\n\\n.col-3 {\\n  -ms-flex: 0 0 25%;\\n  flex: 0 0 25%;\\n  max-width: 25%;\\n}\\n\\n.col-4 {\\n  -ms-flex: 0 0 33.333333%;\\n  flex: 0 0 33.333333%;\\n  max-width: 33.333333%;\\n}\\n\\n.col-5 {\\n  -ms-flex: 0 0 41.666667%;\\n  flex: 0 0 41.666667%;\\n  max-width: 41.666667%;\\n}\\n\\n.col-6 {\\n  -ms-flex: 0 0 50%;\\n  flex: 0 0 50%;\\n  max-width: 50%;\\n}\\n\\n.col-7 {\\n  -ms-flex: 0 0 58.333333%;\\n  flex: 0 0 58.333333%;\\n  max-width: 58.333333%;\\n}\\n\\n.col-8 {\\n  -ms-flex: 0 0 66.666667%;\\n  flex: 0 0 66.666667%;\\n  max-width: 66.666667%;\\n}\\n\\n.col-9 {\\n  -ms-flex: 0 0 75%;\\n  flex: 0 0 75%;\\n  max-width: 75%;\\n}\\n\\n.col-10 {\\n  -ms-flex: 0 0 83.333333%;\\n  flex: 0 0 83.333333%;\\n  max-width: 83.333333%;\\n}\\n\\n.col-11 {\\n  -ms-flex: 0 0 91.666667%;\\n  flex: 0 0 91.666667%;\\n  max-width: 91.666667%;\\n}\\n\\n.col-12 {\\n  -ms-flex: 0 0 100%;\\n  flex: 0 0 100%;\\n  max-width: 100%;\\n}\\n\\n.order-first {\\n  -ms-flex-order: -1;\\n  order: -1;\\n}\\n\\n.order-last {\\n  -ms-flex-order: 13;\\n  order: 13;\\n}\\n\\n.order-0 {\\n  -ms-flex-order: 0;\\n  order: 0;\\n}\\n\\n.order-1 {\\n  -ms-flex-order: 1;\\n  order: 1;\\n}\\n\\n.order-2 {\\n  -ms-flex-order: 2;\\n  order: 2;\\n}\\n\\n.order-3 {\\n  -ms-flex-order: 3;\\n  order: 3;\\n}\\n\\n.order-4 {\\n  -ms-flex-order: 4;\\n  order: 4;\\n}\\n\\n.order-5 {\\n  -ms-flex-order: 5;\\n  order: 5;\\n}\\n\\n.order-6 {\\n  -ms-flex-order: 6;\\n  order: 6;\\n}\\n\\n.order-7 {\\n  -ms-flex-order: 7;\\n  order: 7;\\n}\\n\\n.order-8 {\\n  -ms-flex-order: 8;\\n  order: 8;\\n}\\n\\n.order-9 {\\n  -ms-flex-order: 9;\\n  order: 9;\\n}\\n\\n.order-10 {\\n  -ms-flex-order: 10;\\n  order: 10;\\n}\\n\\n.order-11 {\\n  -ms-flex-order: 11;\\n  order: 11;\\n}\\n\\n.order-12 {\\n  -ms-flex-order: 12;\\n  order: 12;\\n}\\n\\n.offset-1 {\\n  margin-left: 8.333333%;\\n}\\n\\n.offset-2 {\\n  margin-left: 16.666667%;\\n}\\n\\n.offset-3 {\\n  margin-left: 25%;\\n}\\n\\n.offset-4 {\\n  margin-left: 33.333333%;\\n}\\n\\n.offset-5 {\\n  margin-left: 41.666667%;\\n}\\n\\n.offset-6 {\\n  margin-left: 50%;\\n}\\n\\n.offset-7 {\\n  margin-left: 58.333333%;\\n}\\n\\n.offset-8 {\\n  margin-left: 66.666667%;\\n}\\n\\n.offset-9 {\\n  margin-left: 75%;\\n}\\n\\n.offset-10 {\\n  margin-left: 83.333333%;\\n}\\n\\n.offset-11 {\\n  margin-left: 91.666667%;\\n}\\n\\n@media (min-width: 576px) {\\n  .col-sm {\\n    -ms-flex-preferred-size: 0;\\n    flex-basis: 0;\\n    -ms-flex-positive: 1;\\n    flex-grow: 1;\\n    max-width: 100%;\\n  }\\n  .col-sm-auto {\\n    -ms-flex: 0 0 auto;\\n    flex: 0 0 auto;\\n    width: auto;\\n    max-width: 100%;\\n  }\\n  .col-sm-1 {\\n    -ms-flex: 0 0 8.333333%;\\n    flex: 0 0 8.333333%;\\n    max-width: 8.333333%;\\n  }\\n  .col-sm-2 {\\n    -ms-flex: 0 0 16.666667%;\\n    flex: 0 0 16.666667%;\\n    max-width: 16.666667%;\\n  }\\n  .col-sm-3 {\\n    -ms-flex: 0 0 25%;\\n    flex: 0 0 25%;\\n    max-width: 25%;\\n  }\\n  .col-sm-4 {\\n    -ms-flex: 0 0 33.333333%;\\n    flex: 0 0 33.333333%;\\n    max-width: 33.333333%;\\n  }\\n  .col-sm-5 {\\n    -ms-flex: 0 0 41.666667%;\\n    flex: 0 0 41.666667%;\\n    max-width: 41.666667%;\\n  }\\n  .col-sm-6 {\\n    -ms-flex: 0 0 50%;\\n    flex: 0 0 50%;\\n    max-width: 50%;\\n  }\\n  .col-sm-7 {\\n    -ms-flex: 0 0 58.333333%;\\n    flex: 0 0 58.333333%;\\n    max-width: 58.333333%;\\n  }\\n  .col-sm-8 {\\n    -ms-flex: 0 0 66.666667%;\\n    flex: 0 0 66.666667%;\\n    max-width: 66.666667%;\\n  }\\n  .col-sm-9 {\\n    -ms-flex: 0 0 75%;\\n    flex: 0 0 75%;\\n    max-width: 75%;\\n  }\\n  .col-sm-10 {\\n    -ms-flex: 0 0 83.333333%;\\n    flex: 0 0 83.333333%;\\n    max-width: 83.333333%;\\n  }\\n  .col-sm-11 {\\n    -ms-flex: 0 0 91.666667%;\\n    flex: 0 0 91.666667%;\\n    max-width: 91.666667%;\\n  }\\n  .col-sm-12 {\\n    -ms-flex: 0 0 100%;\\n    flex: 0 0 100%;\\n    max-width: 100%;\\n  }\\n  .order-sm-first {\\n    -ms-flex-order: -1;\\n    order: -1;\\n  }\\n  .order-sm-last {\\n    -ms-flex-order: 13;\\n    order: 13;\\n  }\\n  .order-sm-0 {\\n    -ms-flex-order: 0;\\n    order: 0;\\n  }\\n  .order-sm-1 {\\n    -ms-flex-order: 1;\\n    order: 1;\\n  }\\n  .order-sm-2 {\\n    -ms-flex-order: 2;\\n    order: 2;\\n  }\\n  .order-sm-3 {\\n    -ms-flex-order: 3;\\n    order: 3;\\n  }\\n  .order-sm-4 {\\n    -ms-flex-order: 4;\\n    order: 4;\\n  }\\n  .order-sm-5 {\\n    -ms-flex-order: 5;\\n    order: 5;\\n  }\\n  .order-sm-6 {\\n    -ms-flex-order: 6;\\n    order: 6;\\n  }\\n  .order-sm-7 {\\n    -ms-flex-order: 7;\\n    order: 7;\\n  }\\n  .order-sm-8 {\\n    -ms-flex-order: 8;\\n    order: 8;\\n  }\\n  .order-sm-9 {\\n    -ms-flex-order: 9;\\n    order: 9;\\n  }\\n  .order-sm-10 {\\n    -ms-flex-order: 10;\\n    order: 10;\\n  }\\n  .order-sm-11 {\\n    -ms-flex-order: 11;\\n    order: 11;\\n  }\\n  .order-sm-12 {\\n    -ms-flex-order: 12;\\n    order: 12;\\n  }\\n  .offset-sm-0 {\\n    margin-left: 0;\\n  }\\n  .offset-sm-1 {\\n    margin-left: 8.333333%;\\n  }\\n  .offset-sm-2 {\\n    margin-left: 16.666667%;\\n  }\\n  .offset-sm-3 {\\n    margin-left: 25%;\\n  }\\n  .offset-sm-4 {\\n    margin-left: 33.333333%;\\n  }\\n  .offset-sm-5 {\\n    margin-left: 41.666667%;\\n  }\\n  .offset-sm-6 {\\n    margin-left: 50%;\\n  }\\n  .offset-sm-7 {\\n    margin-left: 58.333333%;\\n  }\\n  .offset-sm-8 {\\n    margin-left: 66.666667%;\\n  }\\n  .offset-sm-9 {\\n    margin-left: 75%;\\n  }\\n  .offset-sm-10 {\\n    margin-left: 83.333333%;\\n  }\\n  .offset-sm-11 {\\n    margin-left: 91.666667%;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .col-md {\\n    -ms-flex-preferred-size: 0;\\n    flex-basis: 0;\\n    -ms-flex-positive: 1;\\n    flex-grow: 1;\\n    max-width: 100%;\\n  }\\n  .col-md-auto {\\n    -ms-flex: 0 0 auto;\\n    flex: 0 0 auto;\\n    width: auto;\\n    max-width: 100%;\\n  }\\n  .col-md-1 {\\n    -ms-flex: 0 0 8.333333%;\\n    flex: 0 0 8.333333%;\\n    max-width: 8.333333%;\\n  }\\n  .col-md-2 {\\n    -ms-flex: 0 0 16.666667%;\\n    flex: 0 0 16.666667%;\\n    max-width: 16.666667%;\\n  }\\n  .col-md-3 {\\n    -ms-flex: 0 0 25%;\\n    flex: 0 0 25%;\\n    max-width: 25%;\\n  }\\n  .col-md-4 {\\n    -ms-flex: 0 0 33.333333%;\\n    flex: 0 0 33.333333%;\\n    max-width: 33.333333%;\\n  }\\n  .col-md-5 {\\n    -ms-flex: 0 0 41.666667%;\\n    flex: 0 0 41.666667%;\\n    max-width: 41.666667%;\\n  }\\n  .col-md-6 {\\n    -ms-flex: 0 0 50%;\\n    flex: 0 0 50%;\\n    max-width: 50%;\\n  }\\n  .col-md-7 {\\n    -ms-flex: 0 0 58.333333%;\\n    flex: 0 0 58.333333%;\\n    max-width: 58.333333%;\\n  }\\n  .col-md-8 {\\n    -ms-flex: 0 0 66.666667%;\\n    flex: 0 0 66.666667%;\\n    max-width: 66.666667%;\\n  }\\n  .col-md-9 {\\n    -ms-flex: 0 0 75%;\\n    flex: 0 0 75%;\\n    max-width: 75%;\\n  }\\n  .col-md-10 {\\n    -ms-flex: 0 0 83.333333%;\\n    flex: 0 0 83.333333%;\\n    max-width: 83.333333%;\\n  }\\n  .col-md-11 {\\n    -ms-flex: 0 0 91.666667%;\\n    flex: 0 0 91.666667%;\\n    max-width: 91.666667%;\\n  }\\n  .col-md-12 {\\n    -ms-flex: 0 0 100%;\\n    flex: 0 0 100%;\\n    max-width: 100%;\\n  }\\n  .order-md-first {\\n    -ms-flex-order: -1;\\n    order: -1;\\n  }\\n  .order-md-last {\\n    -ms-flex-order: 13;\\n    order: 13;\\n  }\\n  .order-md-0 {\\n    -ms-flex-order: 0;\\n    order: 0;\\n  }\\n  .order-md-1 {\\n    -ms-flex-order: 1;\\n    order: 1;\\n  }\\n  .order-md-2 {\\n    -ms-flex-order: 2;\\n    order: 2;\\n  }\\n  .order-md-3 {\\n    -ms-flex-order: 3;\\n    order: 3;\\n  }\\n  .order-md-4 {\\n    -ms-flex-order: 4;\\n    order: 4;\\n  }\\n  .order-md-5 {\\n    -ms-flex-order: 5;\\n    order: 5;\\n  }\\n  .order-md-6 {\\n    -ms-flex-order: 6;\\n    order: 6;\\n  }\\n  .order-md-7 {\\n    -ms-flex-order: 7;\\n    order: 7;\\n  }\\n  .order-md-8 {\\n    -ms-flex-order: 8;\\n    order: 8;\\n  }\\n  .order-md-9 {\\n    -ms-flex-order: 9;\\n    order: 9;\\n  }\\n  .order-md-10 {\\n    -ms-flex-order: 10;\\n    order: 10;\\n  }\\n  .order-md-11 {\\n    -ms-flex-order: 11;\\n    order: 11;\\n  }\\n  .order-md-12 {\\n    -ms-flex-order: 12;\\n    order: 12;\\n  }\\n  .offset-md-0 {\\n    margin-left: 0;\\n  }\\n  .offset-md-1 {\\n    margin-left: 8.333333%;\\n  }\\n  .offset-md-2 {\\n    margin-left: 16.666667%;\\n  }\\n  .offset-md-3 {\\n    margin-left: 25%;\\n  }\\n  .offset-md-4 {\\n    margin-left: 33.333333%;\\n  }\\n  .offset-md-5 {\\n    margin-left: 41.666667%;\\n  }\\n  .offset-md-6 {\\n    margin-left: 50%;\\n  }\\n  .offset-md-7 {\\n    margin-left: 58.333333%;\\n  }\\n  .offset-md-8 {\\n    margin-left: 66.666667%;\\n  }\\n  .offset-md-9 {\\n    margin-left: 75%;\\n  }\\n  .offset-md-10 {\\n    margin-left: 83.333333%;\\n  }\\n  .offset-md-11 {\\n    margin-left: 91.666667%;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .col-lg {\\n    -ms-flex-preferred-size: 0;\\n    flex-basis: 0;\\n    -ms-flex-positive: 1;\\n    flex-grow: 1;\\n    max-width: 100%;\\n  }\\n  .col-lg-auto {\\n    -ms-flex: 0 0 auto;\\n    flex: 0 0 auto;\\n    width: auto;\\n    max-width: 100%;\\n  }\\n  .col-lg-1 {\\n    -ms-flex: 0 0 8.333333%;\\n    flex: 0 0 8.333333%;\\n    max-width: 8.333333%;\\n  }\\n  .col-lg-2 {\\n    -ms-flex: 0 0 16.666667%;\\n    flex: 0 0 16.666667%;\\n    max-width: 16.666667%;\\n  }\\n  .col-lg-3 {\\n    -ms-flex: 0 0 25%;\\n    flex: 0 0 25%;\\n    max-width: 25%;\\n  }\\n  .col-lg-4 {\\n    -ms-flex: 0 0 33.333333%;\\n    flex: 0 0 33.333333%;\\n    max-width: 33.333333%;\\n  }\\n  .col-lg-5 {\\n    -ms-flex: 0 0 41.666667%;\\n    flex: 0 0 41.666667%;\\n    max-width: 41.666667%;\\n  }\\n  .col-lg-6 {\\n    -ms-flex: 0 0 50%;\\n    flex: 0 0 50%;\\n    max-width: 50%;\\n  }\\n  .col-lg-7 {\\n    -ms-flex: 0 0 58.333333%;\\n    flex: 0 0 58.333333%;\\n    max-width: 58.333333%;\\n  }\\n  .col-lg-8 {\\n    -ms-flex: 0 0 66.666667%;\\n    flex: 0 0 66.666667%;\\n    max-width: 66.666667%;\\n  }\\n  .col-lg-9 {\\n    -ms-flex: 0 0 75%;\\n    flex: 0 0 75%;\\n    max-width: 75%;\\n  }\\n  .col-lg-10 {\\n    -ms-flex: 0 0 83.333333%;\\n    flex: 0 0 83.333333%;\\n    max-width: 83.333333%;\\n  }\\n  .col-lg-11 {\\n    -ms-flex: 0 0 91.666667%;\\n    flex: 0 0 91.666667%;\\n    max-width: 91.666667%;\\n  }\\n  .col-lg-12 {\\n    -ms-flex: 0 0 100%;\\n    flex: 0 0 100%;\\n    max-width: 100%;\\n  }\\n  .order-lg-first {\\n    -ms-flex-order: -1;\\n    order: -1;\\n  }\\n  .order-lg-last {\\n    -ms-flex-order: 13;\\n    order: 13;\\n  }\\n  .order-lg-0 {\\n    -ms-flex-order: 0;\\n    order: 0;\\n  }\\n  .order-lg-1 {\\n    -ms-flex-order: 1;\\n    order: 1;\\n  }\\n  .order-lg-2 {\\n    -ms-flex-order: 2;\\n    order: 2;\\n  }\\n  .order-lg-3 {\\n    -ms-flex-order: 3;\\n    order: 3;\\n  }\\n  .order-lg-4 {\\n    -ms-flex-order: 4;\\n    order: 4;\\n  }\\n  .order-lg-5 {\\n    -ms-flex-order: 5;\\n    order: 5;\\n  }\\n  .order-lg-6 {\\n    -ms-flex-order: 6;\\n    order: 6;\\n  }\\n  .order-lg-7 {\\n    -ms-flex-order: 7;\\n    order: 7;\\n  }\\n  .order-lg-8 {\\n    -ms-flex-order: 8;\\n    order: 8;\\n  }\\n  .order-lg-9 {\\n    -ms-flex-order: 9;\\n    order: 9;\\n  }\\n  .order-lg-10 {\\n    -ms-flex-order: 10;\\n    order: 10;\\n  }\\n  .order-lg-11 {\\n    -ms-flex-order: 11;\\n    order: 11;\\n  }\\n  .order-lg-12 {\\n    -ms-flex-order: 12;\\n    order: 12;\\n  }\\n  .offset-lg-0 {\\n    margin-left: 0;\\n  }\\n  .offset-lg-1 {\\n    margin-left: 8.333333%;\\n  }\\n  .offset-lg-2 {\\n    margin-left: 16.666667%;\\n  }\\n  .offset-lg-3 {\\n    margin-left: 25%;\\n  }\\n  .offset-lg-4 {\\n    margin-left: 33.333333%;\\n  }\\n  .offset-lg-5 {\\n    margin-left: 41.666667%;\\n  }\\n  .offset-lg-6 {\\n    margin-left: 50%;\\n  }\\n  .offset-lg-7 {\\n    margin-left: 58.333333%;\\n  }\\n  .offset-lg-8 {\\n    margin-left: 66.666667%;\\n  }\\n  .offset-lg-9 {\\n    margin-left: 75%;\\n  }\\n  .offset-lg-10 {\\n    margin-left: 83.333333%;\\n  }\\n  .offset-lg-11 {\\n    margin-left: 91.666667%;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .col-xl {\\n    -ms-flex-preferred-size: 0;\\n    flex-basis: 0;\\n    -ms-flex-positive: 1;\\n    flex-grow: 1;\\n    max-width: 100%;\\n  }\\n  .col-xl-auto {\\n    -ms-flex: 0 0 auto;\\n    flex: 0 0 auto;\\n    width: auto;\\n    max-width: 100%;\\n  }\\n  .col-xl-1 {\\n    -ms-flex: 0 0 8.333333%;\\n    flex: 0 0 8.333333%;\\n    max-width: 8.333333%;\\n  }\\n  .col-xl-2 {\\n    -ms-flex: 0 0 16.666667%;\\n    flex: 0 0 16.666667%;\\n    max-width: 16.666667%;\\n  }\\n  .col-xl-3 {\\n    -ms-flex: 0 0 25%;\\n    flex: 0 0 25%;\\n    max-width: 25%;\\n  }\\n  .col-xl-4 {\\n    -ms-flex: 0 0 33.333333%;\\n    flex: 0 0 33.333333%;\\n    max-width: 33.333333%;\\n  }\\n  .col-xl-5 {\\n    -ms-flex: 0 0 41.666667%;\\n    flex: 0 0 41.666667%;\\n    max-width: 41.666667%;\\n  }\\n  .col-xl-6 {\\n    -ms-flex: 0 0 50%;\\n    flex: 0 0 50%;\\n    max-width: 50%;\\n  }\\n  .col-xl-7 {\\n    -ms-flex: 0 0 58.333333%;\\n    flex: 0 0 58.333333%;\\n    max-width: 58.333333%;\\n  }\\n  .col-xl-8 {\\n    -ms-flex: 0 0 66.666667%;\\n    flex: 0 0 66.666667%;\\n    max-width: 66.666667%;\\n  }\\n  .col-xl-9 {\\n    -ms-flex: 0 0 75%;\\n    flex: 0 0 75%;\\n    max-width: 75%;\\n  }\\n  .col-xl-10 {\\n    -ms-flex: 0 0 83.333333%;\\n    flex: 0 0 83.333333%;\\n    max-width: 83.333333%;\\n  }\\n  .col-xl-11 {\\n    -ms-flex: 0 0 91.666667%;\\n    flex: 0 0 91.666667%;\\n    max-width: 91.666667%;\\n  }\\n  .col-xl-12 {\\n    -ms-flex: 0 0 100%;\\n    flex: 0 0 100%;\\n    max-width: 100%;\\n  }\\n  .order-xl-first {\\n    -ms-flex-order: -1;\\n    order: -1;\\n  }\\n  .order-xl-last {\\n    -ms-flex-order: 13;\\n    order: 13;\\n  }\\n  .order-xl-0 {\\n    -ms-flex-order: 0;\\n    order: 0;\\n  }\\n  .order-xl-1 {\\n    -ms-flex-order: 1;\\n    order: 1;\\n  }\\n  .order-xl-2 {\\n    -ms-flex-order: 2;\\n    order: 2;\\n  }\\n  .order-xl-3 {\\n    -ms-flex-order: 3;\\n    order: 3;\\n  }\\n  .order-xl-4 {\\n    -ms-flex-order: 4;\\n    order: 4;\\n  }\\n  .order-xl-5 {\\n    -ms-flex-order: 5;\\n    order: 5;\\n  }\\n  .order-xl-6 {\\n    -ms-flex-order: 6;\\n    order: 6;\\n  }\\n  .order-xl-7 {\\n    -ms-flex-order: 7;\\n    order: 7;\\n  }\\n  .order-xl-8 {\\n    -ms-flex-order: 8;\\n    order: 8;\\n  }\\n  .order-xl-9 {\\n    -ms-flex-order: 9;\\n    order: 9;\\n  }\\n  .order-xl-10 {\\n    -ms-flex-order: 10;\\n    order: 10;\\n  }\\n  .order-xl-11 {\\n    -ms-flex-order: 11;\\n    order: 11;\\n  }\\n  .order-xl-12 {\\n    -ms-flex-order: 12;\\n    order: 12;\\n  }\\n  .offset-xl-0 {\\n    margin-left: 0;\\n  }\\n  .offset-xl-1 {\\n    margin-left: 8.333333%;\\n  }\\n  .offset-xl-2 {\\n    margin-left: 16.666667%;\\n  }\\n  .offset-xl-3 {\\n    margin-left: 25%;\\n  }\\n  .offset-xl-4 {\\n    margin-left: 33.333333%;\\n  }\\n  .offset-xl-5 {\\n    margin-left: 41.666667%;\\n  }\\n  .offset-xl-6 {\\n    margin-left: 50%;\\n  }\\n  .offset-xl-7 {\\n    margin-left: 58.333333%;\\n  }\\n  .offset-xl-8 {\\n    margin-left: 66.666667%;\\n  }\\n  .offset-xl-9 {\\n    margin-left: 75%;\\n  }\\n  .offset-xl-10 {\\n    margin-left: 83.333333%;\\n  }\\n  .offset-xl-11 {\\n    margin-left: 91.666667%;\\n  }\\n}\\n\\n.table {\\n  width: 100%;\\n  margin-bottom: 1rem;\\n  color: #212529;\\n}\\n\\n.table th,\\n.table td {\\n  padding: 0.75rem;\\n  vertical-align: top;\\n  border-top: 1px solid #dee2e6;\\n}\\n\\n.table thead th {\\n  vertical-align: bottom;\\n  border-bottom: 2px solid #dee2e6;\\n}\\n\\n.table tbody + tbody {\\n  border-top: 2px solid #dee2e6;\\n}\\n\\n.table-sm th,\\n.table-sm td {\\n  padding: 0.3rem;\\n}\\n\\n.table-bordered {\\n  border: 1px solid #dee2e6;\\n}\\n\\n.table-bordered th,\\n.table-bordered td {\\n  border: 1px solid #dee2e6;\\n}\\n\\n.table-bordered thead th,\\n.table-bordered thead td {\\n  border-bottom-width: 2px;\\n}\\n\\n.table-borderless th,\\n.table-borderless td,\\n.table-borderless thead th,\\n.table-borderless tbody + tbody {\\n  border: 0;\\n}\\n\\n.table-striped tbody tr:nth-of-type(odd) {\\n  background-color: rgba(0, 0, 0, 0.05);\\n}\\n\\n.table-hover tbody tr:hover {\\n  color: #212529;\\n  background-color: rgba(0, 0, 0, 0.075);\\n}\\n\\n.table-primary,\\n.table-primary > th,\\n.table-primary > td {\\n  background-color: #b8daff;\\n}\\n\\n.table-primary th,\\n.table-primary td,\\n.table-primary thead th,\\n.table-primary tbody + tbody {\\n  border-color: #7abaff;\\n}\\n\\n.table-hover .table-primary:hover {\\n  background-color: #9fcdff;\\n}\\n\\n.table-hover .table-primary:hover > td,\\n.table-hover .table-primary:hover > th {\\n  background-color: #9fcdff;\\n}\\n\\n.table-secondary,\\n.table-secondary > th,\\n.table-secondary > td {\\n  background-color: #d6d8db;\\n}\\n\\n.table-secondary th,\\n.table-secondary td,\\n.table-secondary thead th,\\n.table-secondary tbody + tbody {\\n  border-color: #b3b7bb;\\n}\\n\\n.table-hover .table-secondary:hover {\\n  background-color: #c8cbcf;\\n}\\n\\n.table-hover .table-secondary:hover > td,\\n.table-hover .table-secondary:hover > th {\\n  background-color: #c8cbcf;\\n}\\n\\n.table-success,\\n.table-success > th,\\n.table-success > td {\\n  background-color: #c3e6cb;\\n}\\n\\n.table-success th,\\n.table-success td,\\n.table-success thead th,\\n.table-success tbody + tbody {\\n  border-color: #8fd19e;\\n}\\n\\n.table-hover .table-success:hover {\\n  background-color: #b1dfbb;\\n}\\n\\n.table-hover .table-success:hover > td,\\n.table-hover .table-success:hover > th {\\n  background-color: #b1dfbb;\\n}\\n\\n.table-info,\\n.table-info > th,\\n.table-info > td {\\n  background-color: #bee5eb;\\n}\\n\\n.table-info th,\\n.table-info td,\\n.table-info thead th,\\n.table-info tbody + tbody {\\n  border-color: #86cfda;\\n}\\n\\n.table-hover .table-info:hover {\\n  background-color: #abdde5;\\n}\\n\\n.table-hover .table-info:hover > td,\\n.table-hover .table-info:hover > th {\\n  background-color: #abdde5;\\n}\\n\\n.table-warning,\\n.table-warning > th,\\n.table-warning > td {\\n  background-color: #ffeeba;\\n}\\n\\n.table-warning th,\\n.table-warning td,\\n.table-warning thead th,\\n.table-warning tbody + tbody {\\n  border-color: #ffdf7e;\\n}\\n\\n.table-hover .table-warning:hover {\\n  background-color: #ffe8a1;\\n}\\n\\n.table-hover .table-warning:hover > td,\\n.table-hover .table-warning:hover > th {\\n  background-color: #ffe8a1;\\n}\\n\\n.table-danger,\\n.table-danger > th,\\n.table-danger > td {\\n  background-color: #f5c6cb;\\n}\\n\\n.table-danger th,\\n.table-danger td,\\n.table-danger thead th,\\n.table-danger tbody + tbody {\\n  border-color: #ed969e;\\n}\\n\\n.table-hover .table-danger:hover {\\n  background-color: #f1b0b7;\\n}\\n\\n.table-hover .table-danger:hover > td,\\n.table-hover .table-danger:hover > th {\\n  background-color: #f1b0b7;\\n}\\n\\n.table-light,\\n.table-light > th,\\n.table-light > td {\\n  background-color: #fdfdfe;\\n}\\n\\n.table-light th,\\n.table-light td,\\n.table-light thead th,\\n.table-light tbody + tbody {\\n  border-color: #fbfcfc;\\n}\\n\\n.table-hover .table-light:hover {\\n  background-color: #ececf6;\\n}\\n\\n.table-hover .table-light:hover > td,\\n.table-hover .table-light:hover > th {\\n  background-color: #ececf6;\\n}\\n\\n.table-dark,\\n.table-dark > th,\\n.table-dark > td {\\n  background-color: #c6c8ca;\\n}\\n\\n.table-dark th,\\n.table-dark td,\\n.table-dark thead th,\\n.table-dark tbody + tbody {\\n  border-color: #95999c;\\n}\\n\\n.table-hover .table-dark:hover {\\n  background-color: #b9bbbe;\\n}\\n\\n.table-hover .table-dark:hover > td,\\n.table-hover .table-dark:hover > th {\\n  background-color: #b9bbbe;\\n}\\n\\n.table-active,\\n.table-active > th,\\n.table-active > td {\\n  background-color: rgba(0, 0, 0, 0.075);\\n}\\n\\n.table-hover .table-active:hover {\\n  background-color: rgba(0, 0, 0, 0.075);\\n}\\n\\n.table-hover .table-active:hover > td,\\n.table-hover .table-active:hover > th {\\n  background-color: rgba(0, 0, 0, 0.075);\\n}\\n\\n.table .thead-dark th {\\n  color: #fff;\\n  background-color: #343a40;\\n  border-color: #454d55;\\n}\\n\\n.table .thead-light th {\\n  color: #495057;\\n  background-color: #e9ecef;\\n  border-color: #dee2e6;\\n}\\n\\n.table-dark {\\n  color: #fff;\\n  background-color: #343a40;\\n}\\n\\n.table-dark th,\\n.table-dark td,\\n.table-dark thead th {\\n  border-color: #454d55;\\n}\\n\\n.table-dark.table-bordered {\\n  border: 0;\\n}\\n\\n.table-dark.table-striped tbody tr:nth-of-type(odd) {\\n  background-color: rgba(255, 255, 255, 0.05);\\n}\\n\\n.table-dark.table-hover tbody tr:hover {\\n  color: #fff;\\n  background-color: rgba(255, 255, 255, 0.075);\\n}\\n\\n@media (max-width: 575.98px) {\\n  .table-responsive-sm {\\n    display: block;\\n    width: 100%;\\n    overflow-x: auto;\\n    -webkit-overflow-scrolling: touch;\\n  }\\n  .table-responsive-sm > .table-bordered {\\n    border: 0;\\n  }\\n}\\n\\n@media (max-width: 767.98px) {\\n  .table-responsive-md {\\n    display: block;\\n    width: 100%;\\n    overflow-x: auto;\\n    -webkit-overflow-scrolling: touch;\\n  }\\n  .table-responsive-md > .table-bordered {\\n    border: 0;\\n  }\\n}\\n\\n@media (max-width: 991.98px) {\\n  .table-responsive-lg {\\n    display: block;\\n    width: 100%;\\n    overflow-x: auto;\\n    -webkit-overflow-scrolling: touch;\\n  }\\n  .table-responsive-lg > .table-bordered {\\n    border: 0;\\n  }\\n}\\n\\n@media (max-width: 1199.98px) {\\n  .table-responsive-xl {\\n    display: block;\\n    width: 100%;\\n    overflow-x: auto;\\n    -webkit-overflow-scrolling: touch;\\n  }\\n  .table-responsive-xl > .table-bordered {\\n    border: 0;\\n  }\\n}\\n\\n.table-responsive {\\n  display: block;\\n  width: 100%;\\n  overflow-x: auto;\\n  -webkit-overflow-scrolling: touch;\\n}\\n\\n.table-responsive > .table-bordered {\\n  border: 0;\\n}\\n\\n.form-control {\\n  display: block;\\n  width: 100%;\\n  height: calc(1.5em + 0.75rem + 2px);\\n  padding: 0.375rem 0.75rem;\\n  font-size: 1rem;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  color: #495057;\\n  background-color: #fff;\\n  background-clip: padding-box;\\n  border: 1px solid #ced4da;\\n  border-radius: 0.25rem;\\n  transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .form-control {\\n    transition: none;\\n  }\\n}\\n\\n.form-control::-ms-expand {\\n  background-color: transparent;\\n  border: 0;\\n}\\n\\n.form-control:focus {\\n  color: #495057;\\n  background-color: #fff;\\n  border-color: #80bdff;\\n  outline: 0;\\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\\n}\\n\\n.form-control::-webkit-input-placeholder {\\n  color: #6c757d;\\n  opacity: 1;\\n}\\n\\n.form-control::-moz-placeholder {\\n  color: #6c757d;\\n  opacity: 1;\\n}\\n\\n.form-control:-ms-input-placeholder {\\n  color: #6c757d;\\n  opacity: 1;\\n}\\n\\n.form-control::-ms-input-placeholder {\\n  color: #6c757d;\\n  opacity: 1;\\n}\\n\\n.form-control::placeholder {\\n  color: #6c757d;\\n  opacity: 1;\\n}\\n\\n.form-control:disabled, .form-control[readonly] {\\n  background-color: #e9ecef;\\n  opacity: 1;\\n}\\n\\nselect.form-control:focus::-ms-value {\\n  color: #495057;\\n  background-color: #fff;\\n}\\n\\n.form-control-file,\\n.form-control-range {\\n  display: block;\\n  width: 100%;\\n}\\n\\n.col-form-label {\\n  padding-top: calc(0.375rem + 1px);\\n  padding-bottom: calc(0.375rem + 1px);\\n  margin-bottom: 0;\\n  font-size: inherit;\\n  line-height: 1.5;\\n}\\n\\n.col-form-label-lg {\\n  padding-top: calc(0.5rem + 1px);\\n  padding-bottom: calc(0.5rem + 1px);\\n  font-size: 1.25rem;\\n  line-height: 1.5;\\n}\\n\\n.col-form-label-sm {\\n  padding-top: calc(0.25rem + 1px);\\n  padding-bottom: calc(0.25rem + 1px);\\n  font-size: 0.875rem;\\n  line-height: 1.5;\\n}\\n\\n.form-control-plaintext {\\n  display: block;\\n  width: 100%;\\n  padding-top: 0.375rem;\\n  padding-bottom: 0.375rem;\\n  margin-bottom: 0;\\n  line-height: 1.5;\\n  color: #212529;\\n  background-color: transparent;\\n  border: solid transparent;\\n  border-width: 1px 0;\\n}\\n\\n.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {\\n  padding-right: 0;\\n  padding-left: 0;\\n}\\n\\n.form-control-sm {\\n  height: calc(1.5em + 0.5rem + 2px);\\n  padding: 0.25rem 0.5rem;\\n  font-size: 0.875rem;\\n  line-height: 1.5;\\n  border-radius: 0.2rem;\\n}\\n\\n.form-control-lg {\\n  height: calc(1.5em + 1rem + 2px);\\n  padding: 0.5rem 1rem;\\n  font-size: 1.25rem;\\n  line-height: 1.5;\\n  border-radius: 0.3rem;\\n}\\n\\nselect.form-control[size], select.form-control[multiple] {\\n  height: auto;\\n}\\n\\ntextarea.form-control {\\n  height: auto;\\n}\\n\\n.form-group {\\n  margin-bottom: 1rem;\\n}\\n\\n.form-text {\\n  display: block;\\n  margin-top: 0.25rem;\\n}\\n\\n.form-row {\\n  display: -ms-flexbox;\\n  display: flex;\\n  -ms-flex-wrap: wrap;\\n  flex-wrap: wrap;\\n  margin-right: -5px;\\n  margin-left: -5px;\\n}\\n\\n.form-row > .col,\\n.form-row > [class*=\\\"col-\\\"] {\\n  padding-right: 5px;\\n  padding-left: 5px;\\n}\\n\\n.form-check {\\n  position: relative;\\n  display: block;\\n  padding-left: 1.25rem;\\n}\\n\\n.form-check-input {\\n  position: absolute;\\n  margin-top: 0.3rem;\\n  margin-left: -1.25rem;\\n}\\n\\n.form-check-input:disabled ~ .form-check-label {\\n  color: #6c757d;\\n}\\n\\n.form-check-label {\\n  margin-bottom: 0;\\n}\\n\\n.form-check-inline {\\n  display: -ms-inline-flexbox;\\n  display: inline-flex;\\n  -ms-flex-align: center;\\n  align-items: center;\\n  padding-left: 0;\\n  margin-right: 0.75rem;\\n}\\n\\n.form-check-inline .form-check-input {\\n  position: static;\\n  margin-top: 0;\\n  margin-right: 0.3125rem;\\n  margin-left: 0;\\n}\\n\\n.valid-feedback {\\n  display: none;\\n  width: 100%;\\n  margin-top: 0.25rem;\\n  font-size: 80%;\\n  color: #28a745;\\n}\\n\\n.valid-tooltip {\\n  position: absolute;\\n  top: 100%;\\n  z-index: 5;\\n  display: none;\\n  max-width: 100%;\\n  padding: 0.25rem 0.5rem;\\n  margin-top: .1rem;\\n  font-size: 0.875rem;\\n  line-height: 1.5;\\n  color: #fff;\\n  background-color: rgba(40, 167, 69, 0.9);\\n  border-radius: 0.25rem;\\n}\\n\\n.was-validated .form-control:valid, .form-control.is-valid {\\n  border-color: #28a745;\\n  padding-right: calc(1.5em + 0.75rem);\\n  background-image: url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\\\");\\n  background-repeat: no-repeat;\\n  background-position: center right calc(0.375em + 0.1875rem);\\n  background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\\n}\\n\\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus {\\n  border-color: #28a745;\\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\\n}\\n\\n.was-validated .form-control:valid ~ .valid-feedback,\\n.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback,\\n.form-control.is-valid ~ .valid-tooltip {\\n  display: block;\\n}\\n\\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\\n  padding-right: calc(1.5em + 0.75rem);\\n  background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\\n}\\n\\n.was-validated .custom-select:valid, .custom-select.is-valid {\\n  border-color: #28a745;\\n  padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);\\n  background: url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\\\") no-repeat right 0.75rem center/8px 10px, url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\\\") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\\n}\\n\\n.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {\\n  border-color: #28a745;\\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\\n}\\n\\n.was-validated .custom-select:valid ~ .valid-feedback,\\n.was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback,\\n.custom-select.is-valid ~ .valid-tooltip {\\n  display: block;\\n}\\n\\n.was-validated .form-control-file:valid ~ .valid-feedback,\\n.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback,\\n.form-control-file.is-valid ~ .valid-tooltip {\\n  display: block;\\n}\\n\\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\\n  color: #28a745;\\n}\\n\\n.was-validated .form-check-input:valid ~ .valid-feedback,\\n.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,\\n.form-check-input.is-valid ~ .valid-tooltip {\\n  display: block;\\n}\\n\\n.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {\\n  color: #28a745;\\n}\\n\\n.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {\\n  border-color: #28a745;\\n}\\n\\n.was-validated .custom-control-input:valid ~ .valid-feedback,\\n.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback,\\n.custom-control-input.is-valid ~ .valid-tooltip {\\n  display: block;\\n}\\n\\n.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {\\n  border-color: #34ce57;\\n  background-color: #34ce57;\\n}\\n\\n.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before {\\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\\n}\\n\\n.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before {\\n  border-color: #28a745;\\n}\\n\\n.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {\\n  border-color: #28a745;\\n}\\n\\n.was-validated .custom-file-input:valid ~ .valid-feedback,\\n.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback,\\n.custom-file-input.is-valid ~ .valid-tooltip {\\n  display: block;\\n}\\n\\n.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {\\n  border-color: #28a745;\\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\\n}\\n\\n.invalid-feedback {\\n  display: none;\\n  width: 100%;\\n  margin-top: 0.25rem;\\n  font-size: 80%;\\n  color: #dc3545;\\n}\\n\\n.invalid-tooltip {\\n  position: absolute;\\n  top: 100%;\\n  z-index: 5;\\n  display: none;\\n  max-width: 100%;\\n  padding: 0.25rem 0.5rem;\\n  margin-top: .1rem;\\n  font-size: 0.875rem;\\n  line-height: 1.5;\\n  color: #fff;\\n  background-color: rgba(220, 53, 69, 0.9);\\n  border-radius: 0.25rem;\\n}\\n\\n.was-validated .form-control:invalid, .form-control.is-invalid {\\n  border-color: #dc3545;\\n  padding-right: calc(1.5em + 0.75rem);\\n  background-image: url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\\\");\\n  background-repeat: no-repeat;\\n  background-position: center right calc(0.375em + 0.1875rem);\\n  background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\\n}\\n\\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {\\n  border-color: #dc3545;\\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\\n}\\n\\n.was-validated .form-control:invalid ~ .invalid-feedback,\\n.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback,\\n.form-control.is-invalid ~ .invalid-tooltip {\\n  display: block;\\n}\\n\\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\\n  padding-right: calc(1.5em + 0.75rem);\\n  background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\\n}\\n\\n.was-validated .custom-select:invalid, .custom-select.is-invalid {\\n  border-color: #dc3545;\\n  padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);\\n  background: url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\\\") no-repeat right 0.75rem center/8px 10px, url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\\\") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\\n}\\n\\n.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {\\n  border-color: #dc3545;\\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\\n}\\n\\n.was-validated .custom-select:invalid ~ .invalid-feedback,\\n.was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback,\\n.custom-select.is-invalid ~ .invalid-tooltip {\\n  display: block;\\n}\\n\\n.was-validated .form-control-file:invalid ~ .invalid-feedback,\\n.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback,\\n.form-control-file.is-invalid ~ .invalid-tooltip {\\n  display: block;\\n}\\n\\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\\n  color: #dc3545;\\n}\\n\\n.was-validated .form-check-input:invalid ~ .invalid-feedback,\\n.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,\\n.form-check-input.is-invalid ~ .invalid-tooltip {\\n  display: block;\\n}\\n\\n.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {\\n  color: #dc3545;\\n}\\n\\n.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {\\n  border-color: #dc3545;\\n}\\n\\n.was-validated .custom-control-input:invalid ~ .invalid-feedback,\\n.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback,\\n.custom-control-input.is-invalid ~ .invalid-tooltip {\\n  display: block;\\n}\\n\\n.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {\\n  border-color: #e4606d;\\n  background-color: #e4606d;\\n}\\n\\n.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before {\\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\\n}\\n\\n.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before {\\n  border-color: #dc3545;\\n}\\n\\n.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {\\n  border-color: #dc3545;\\n}\\n\\n.was-validated .custom-file-input:invalid ~ .invalid-feedback,\\n.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback,\\n.custom-file-input.is-invalid ~ .invalid-tooltip {\\n  display: block;\\n}\\n\\n.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {\\n  border-color: #dc3545;\\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\\n}\\n\\n.form-inline {\\n  display: -ms-flexbox;\\n  display: flex;\\n  -ms-flex-flow: row wrap;\\n  flex-flow: row wrap;\\n  -ms-flex-align: center;\\n  align-items: center;\\n}\\n\\n.form-inline .form-check {\\n  width: 100%;\\n}\\n\\n@media (min-width: 576px) {\\n  .form-inline label {\\n    display: -ms-flexbox;\\n    display: flex;\\n    -ms-flex-align: center;\\n    align-items: center;\\n    -ms-flex-pack: center;\\n    justify-content: center;\\n    margin-bottom: 0;\\n  }\\n  .form-inline .form-group {\\n    display: -ms-flexbox;\\n    display: flex;\\n    -ms-flex: 0 0 auto;\\n    flex: 0 0 auto;\\n    -ms-flex-flow: row wrap;\\n    flex-flow: row wrap;\\n    -ms-flex-align: center;\\n    align-items: center;\\n    margin-bottom: 0;\\n  }\\n  .form-inline .form-control {\\n    display: inline-block;\\n    width: auto;\\n    vertical-align: middle;\\n  }\\n  .form-inline .form-control-plaintext {\\n    display: inline-block;\\n  }\\n  .form-inline .input-group,\\n  .form-inline .custom-select {\\n    width: auto;\\n  }\\n  .form-inline .form-check {\\n    display: -ms-flexbox;\\n    display: flex;\\n    -ms-flex-align: center;\\n    align-items: center;\\n    -ms-flex-pack: center;\\n    justify-content: center;\\n    width: auto;\\n    padding-left: 0;\\n  }\\n  .form-inline .form-check-input {\\n    position: relative;\\n    -ms-flex-negative: 0;\\n    flex-shrink: 0;\\n    margin-top: 0;\\n    margin-right: 0.25rem;\\n    margin-left: 0;\\n  }\\n  .form-inline .custom-control {\\n    -ms-flex-align: center;\\n    align-items: center;\\n    -ms-flex-pack: center;\\n    justify-content: center;\\n  }\\n  .form-inline .custom-control-label {\\n    margin-bottom: 0;\\n  }\\n}\\n\\n.btn {\\n  display: inline-block;\\n  font-weight: 400;\\n  color: #212529;\\n  text-align: center;\\n  vertical-align: middle;\\n  -webkit-user-select: none;\\n  -moz-user-select: none;\\n  -ms-user-select: none;\\n  user-select: none;\\n  background-color: transparent;\\n  border: 1px solid transparent;\\n  padding: 0.375rem 0.75rem;\\n  font-size: 1rem;\\n  line-height: 1.5;\\n  border-radius: 0.25rem;\\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .btn {\\n    transition: none;\\n  }\\n}\\n\\n.btn:hover {\\n  color: #212529;\\n  text-decoration: none;\\n}\\n\\n.btn:focus, .btn.focus {\\n  outline: 0;\\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\\n}\\n\\n.btn.disabled, .btn:disabled {\\n  opacity: 0.65;\\n}\\n\\na.btn.disabled,\\nfieldset:disabled a.btn {\\n  pointer-events: none;\\n}\\n\\n.btn-primary {\\n  color: #fff;\\n  background-color: #007bff;\\n  border-color: #007bff;\\n}\\n\\n.btn-primary:hover {\\n  color: #fff;\\n  background-color: #0069d9;\\n  border-color: #0062cc;\\n}\\n\\n.btn-primary:focus, .btn-primary.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);\\n}\\n\\n.btn-primary.disabled, .btn-primary:disabled {\\n  color: #fff;\\n  background-color: #007bff;\\n  border-color: #007bff;\\n}\\n\\n.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active,\\n.show > .btn-primary.dropdown-toggle {\\n  color: #fff;\\n  background-color: #0062cc;\\n  border-color: #005cbf;\\n}\\n\\n.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-primary.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);\\n}\\n\\n.btn-secondary {\\n  color: #fff;\\n  background-color: #6c757d;\\n  border-color: #6c757d;\\n}\\n\\n.btn-secondary:hover {\\n  color: #fff;\\n  background-color: #5a6268;\\n  border-color: #545b62;\\n}\\n\\n.btn-secondary:focus, .btn-secondary.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);\\n}\\n\\n.btn-secondary.disabled, .btn-secondary:disabled {\\n  color: #fff;\\n  background-color: #6c757d;\\n  border-color: #6c757d;\\n}\\n\\n.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active,\\n.show > .btn-secondary.dropdown-toggle {\\n  color: #fff;\\n  background-color: #545b62;\\n  border-color: #4e555b;\\n}\\n\\n.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-secondary.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);\\n}\\n\\n.btn-success {\\n  color: #fff;\\n  background-color: #28a745;\\n  border-color: #28a745;\\n}\\n\\n.btn-success:hover {\\n  color: #fff;\\n  background-color: #218838;\\n  border-color: #1e7e34;\\n}\\n\\n.btn-success:focus, .btn-success.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);\\n}\\n\\n.btn-success.disabled, .btn-success:disabled {\\n  color: #fff;\\n  background-color: #28a745;\\n  border-color: #28a745;\\n}\\n\\n.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active,\\n.show > .btn-success.dropdown-toggle {\\n  color: #fff;\\n  background-color: #1e7e34;\\n  border-color: #1c7430;\\n}\\n\\n.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-success.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);\\n}\\n\\n.btn-info {\\n  color: #fff;\\n  background-color: #17a2b8;\\n  border-color: #17a2b8;\\n}\\n\\n.btn-info:hover {\\n  color: #fff;\\n  background-color: #138496;\\n  border-color: #117a8b;\\n}\\n\\n.btn-info:focus, .btn-info.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\\n}\\n\\n.btn-info.disabled, .btn-info:disabled {\\n  color: #fff;\\n  background-color: #17a2b8;\\n  border-color: #17a2b8;\\n}\\n\\n.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active,\\n.show > .btn-info.dropdown-toggle {\\n  color: #fff;\\n  background-color: #117a8b;\\n  border-color: #10707f;\\n}\\n\\n.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-info.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\\n}\\n\\n.btn-warning {\\n  color: #212529;\\n  background-color: #ffc107;\\n  border-color: #ffc107;\\n}\\n\\n.btn-warning:hover {\\n  color: #212529;\\n  background-color: #e0a800;\\n  border-color: #d39e00;\\n}\\n\\n.btn-warning:focus, .btn-warning.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);\\n}\\n\\n.btn-warning.disabled, .btn-warning:disabled {\\n  color: #212529;\\n  background-color: #ffc107;\\n  border-color: #ffc107;\\n}\\n\\n.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active,\\n.show > .btn-warning.dropdown-toggle {\\n  color: #212529;\\n  background-color: #d39e00;\\n  border-color: #c69500;\\n}\\n\\n.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-warning.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);\\n}\\n\\n.btn-danger {\\n  color: #fff;\\n  background-color: #dc3545;\\n  border-color: #dc3545;\\n}\\n\\n.btn-danger:hover {\\n  color: #fff;\\n  background-color: #c82333;\\n  border-color: #bd2130;\\n}\\n\\n.btn-danger:focus, .btn-danger.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);\\n}\\n\\n.btn-danger.disabled, .btn-danger:disabled {\\n  color: #fff;\\n  background-color: #dc3545;\\n  border-color: #dc3545;\\n}\\n\\n.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active,\\n.show > .btn-danger.dropdown-toggle {\\n  color: #fff;\\n  background-color: #bd2130;\\n  border-color: #b21f2d;\\n}\\n\\n.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-danger.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);\\n}\\n\\n.btn-light {\\n  color: #212529;\\n  background-color: #f8f9fa;\\n  border-color: #f8f9fa;\\n}\\n\\n.btn-light:hover {\\n  color: #212529;\\n  background-color: #e2e6ea;\\n  border-color: #dae0e5;\\n}\\n\\n.btn-light:focus, .btn-light.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\\n}\\n\\n.btn-light.disabled, .btn-light:disabled {\\n  color: #212529;\\n  background-color: #f8f9fa;\\n  border-color: #f8f9fa;\\n}\\n\\n.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active,\\n.show > .btn-light.dropdown-toggle {\\n  color: #212529;\\n  background-color: #dae0e5;\\n  border-color: #d3d9df;\\n}\\n\\n.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-light.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\\n}\\n\\n.btn-dark {\\n  color: #fff;\\n  background-color: #343a40;\\n  border-color: #343a40;\\n}\\n\\n.btn-dark:hover {\\n  color: #fff;\\n  background-color: #23272b;\\n  border-color: #1d2124;\\n}\\n\\n.btn-dark:focus, .btn-dark.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\\n}\\n\\n.btn-dark.disabled, .btn-dark:disabled {\\n  color: #fff;\\n  background-color: #343a40;\\n  border-color: #343a40;\\n}\\n\\n.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active,\\n.show > .btn-dark.dropdown-toggle {\\n  color: #fff;\\n  background-color: #1d2124;\\n  border-color: #171a1d;\\n}\\n\\n.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-dark.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\\n}\\n\\n.btn-outline-primary {\\n  color: #007bff;\\n  border-color: #007bff;\\n}\\n\\n.btn-outline-primary:hover {\\n  color: #fff;\\n  background-color: #007bff;\\n  border-color: #007bff;\\n}\\n\\n.btn-outline-primary:focus, .btn-outline-primary.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\\n}\\n\\n.btn-outline-primary.disabled, .btn-outline-primary:disabled {\\n  color: #007bff;\\n  background-color: transparent;\\n}\\n\\n.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active,\\n.show > .btn-outline-primary.dropdown-toggle {\\n  color: #fff;\\n  background-color: #007bff;\\n  border-color: #007bff;\\n}\\n\\n.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-outline-primary.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\\n}\\n\\n.btn-outline-secondary {\\n  color: #6c757d;\\n  border-color: #6c757d;\\n}\\n\\n.btn-outline-secondary:hover {\\n  color: #fff;\\n  background-color: #6c757d;\\n  border-color: #6c757d;\\n}\\n\\n.btn-outline-secondary:focus, .btn-outline-secondary.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\\n}\\n\\n.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {\\n  color: #6c757d;\\n  background-color: transparent;\\n}\\n\\n.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active,\\n.show > .btn-outline-secondary.dropdown-toggle {\\n  color: #fff;\\n  background-color: #6c757d;\\n  border-color: #6c757d;\\n}\\n\\n.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-outline-secondary.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\\n}\\n\\n.btn-outline-success {\\n  color: #28a745;\\n  border-color: #28a745;\\n}\\n\\n.btn-outline-success:hover {\\n  color: #fff;\\n  background-color: #28a745;\\n  border-color: #28a745;\\n}\\n\\n.btn-outline-success:focus, .btn-outline-success.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\\n}\\n\\n.btn-outline-success.disabled, .btn-outline-success:disabled {\\n  color: #28a745;\\n  background-color: transparent;\\n}\\n\\n.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active,\\n.show > .btn-outline-success.dropdown-toggle {\\n  color: #fff;\\n  background-color: #28a745;\\n  border-color: #28a745;\\n}\\n\\n.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-outline-success.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\\n}\\n\\n.btn-outline-info {\\n  color: #17a2b8;\\n  border-color: #17a2b8;\\n}\\n\\n.btn-outline-info:hover {\\n  color: #fff;\\n  background-color: #17a2b8;\\n  border-color: #17a2b8;\\n}\\n\\n.btn-outline-info:focus, .btn-outline-info.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\\n}\\n\\n.btn-outline-info.disabled, .btn-outline-info:disabled {\\n  color: #17a2b8;\\n  background-color: transparent;\\n}\\n\\n.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active,\\n.show > .btn-outline-info.dropdown-toggle {\\n  color: #fff;\\n  background-color: #17a2b8;\\n  border-color: #17a2b8;\\n}\\n\\n.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-outline-info.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\\n}\\n\\n.btn-outline-warning {\\n  color: #ffc107;\\n  border-color: #ffc107;\\n}\\n\\n.btn-outline-warning:hover {\\n  color: #212529;\\n  background-color: #ffc107;\\n  border-color: #ffc107;\\n}\\n\\n.btn-outline-warning:focus, .btn-outline-warning.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\\n}\\n\\n.btn-outline-warning.disabled, .btn-outline-warning:disabled {\\n  color: #ffc107;\\n  background-color: transparent;\\n}\\n\\n.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active,\\n.show > .btn-outline-warning.dropdown-toggle {\\n  color: #212529;\\n  background-color: #ffc107;\\n  border-color: #ffc107;\\n}\\n\\n.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-outline-warning.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\\n}\\n\\n.btn-outline-danger {\\n  color: #dc3545;\\n  border-color: #dc3545;\\n}\\n\\n.btn-outline-danger:hover {\\n  color: #fff;\\n  background-color: #dc3545;\\n  border-color: #dc3545;\\n}\\n\\n.btn-outline-danger:focus, .btn-outline-danger.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\\n}\\n\\n.btn-outline-danger.disabled, .btn-outline-danger:disabled {\\n  color: #dc3545;\\n  background-color: transparent;\\n}\\n\\n.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active,\\n.show > .btn-outline-danger.dropdown-toggle {\\n  color: #fff;\\n  background-color: #dc3545;\\n  border-color: #dc3545;\\n}\\n\\n.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-outline-danger.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\\n}\\n\\n.btn-outline-light {\\n  color: #f8f9fa;\\n  border-color: #f8f9fa;\\n}\\n\\n.btn-outline-light:hover {\\n  color: #212529;\\n  background-color: #f8f9fa;\\n  border-color: #f8f9fa;\\n}\\n\\n.btn-outline-light:focus, .btn-outline-light.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\\n}\\n\\n.btn-outline-light.disabled, .btn-outline-light:disabled {\\n  color: #f8f9fa;\\n  background-color: transparent;\\n}\\n\\n.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active,\\n.show > .btn-outline-light.dropdown-toggle {\\n  color: #212529;\\n  background-color: #f8f9fa;\\n  border-color: #f8f9fa;\\n}\\n\\n.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-outline-light.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\\n}\\n\\n.btn-outline-dark {\\n  color: #343a40;\\n  border-color: #343a40;\\n}\\n\\n.btn-outline-dark:hover {\\n  color: #fff;\\n  background-color: #343a40;\\n  border-color: #343a40;\\n}\\n\\n.btn-outline-dark:focus, .btn-outline-dark.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\\n}\\n\\n.btn-outline-dark.disabled, .btn-outline-dark:disabled {\\n  color: #343a40;\\n  background-color: transparent;\\n}\\n\\n.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active,\\n.show > .btn-outline-dark.dropdown-toggle {\\n  color: #fff;\\n  background-color: #343a40;\\n  border-color: #343a40;\\n}\\n\\n.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-outline-dark.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\\n}\\n\\n.btn-link {\\n  font-weight: 400;\\n  color: #007bff;\\n  text-decoration: none;\\n}\\n\\n.btn-link:hover {\\n  color: #0056b3;\\n  text-decoration: underline;\\n}\\n\\n.btn-link:focus, .btn-link.focus {\\n  text-decoration: underline;\\n  box-shadow: none;\\n}\\n\\n.btn-link:disabled, .btn-link.disabled {\\n  color: #6c757d;\\n  pointer-events: none;\\n}\\n\\n.btn-lg, .btn-group-lg > .btn {\\n  padding: 0.5rem 1rem;\\n  font-size: 1.25rem;\\n  line-height: 1.5;\\n  border-radius: 0.3rem;\\n}\\n\\n.btn-sm, .btn-group-sm > .btn {\\n  padding: 0.25rem 0.5rem;\\n  font-size: 0.875rem;\\n  line-height: 1.5;\\n  border-radius: 0.2rem;\\n}\\n\\n.btn-block {\\n  display: block;\\n  width: 100%;\\n}\\n\\n.btn-block + .btn-block {\\n  margin-top: 0.5rem;\\n}\\n\\ninput[type=\\\"submit\\\"].btn-block,\\ninput[type=\\\"reset\\\"].btn-block,\\ninput[type=\\\"button\\\"].btn-block {\\n  width: 100%;\\n}\\n\\n.fade {\\n  transition: opacity 0.15s linear;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .fade {\\n    transition: none;\\n  }\\n}\\n\\n.fade:not(.show) {\\n  opacity: 0;\\n}\\n\\n.collapse:not(.show) {\\n  display: none;\\n}\\n\\n.collapsing {\\n  position: relative;\\n  height: 0;\\n  overflow: hidden;\\n  transition: height 0.35s ease;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .collapsing {\\n    transition: none;\\n  }\\n}\\n\\n.dropup,\\n.dropright,\\n.dropdown,\\n.dropleft {\\n  position: relative;\\n}\\n\\n.dropdown-toggle {\\n  white-space: nowrap;\\n}\\n\\n.dropdown-toggle::after {\\n  display: inline-block;\\n  margin-left: 0.255em;\\n  vertical-align: 0.255em;\\n  content: \\\"\\\";\\n  border-top: 0.3em solid;\\n  border-right: 0.3em solid transparent;\\n  border-bottom: 0;\\n  border-left: 0.3em solid transparent;\\n}\\n\\n.dropdown-toggle:empty::after {\\n  margin-left: 0;\\n}\\n\\n.dropdown-menu {\\n  position: absolute;\\n  top: 100%;\\n  left: 0;\\n  z-index: 1000;\\n  display: none;\\n  float: left;\\n  min-width: 10rem;\\n  padding: 0.5rem 0;\\n  margin: 0.125rem 0 0;\\n  font-size: 1rem;\\n  color: #212529;\\n  text-align: left;\\n  list-style: none;\\n  background-color: #fff;\\n  background-clip: padding-box;\\n  border: 1px solid rgba(0, 0, 0, 0.15);\\n  border-radius: 0.25rem;\\n}\\n\\n.dropdown-menu-left {\\n  right: auto;\\n  left: 0;\\n}\\n\\n.dropdown-menu-right {\\n  right: 0;\\n  left: auto;\\n}\\n\\n@media (min-width: 576px) {\\n  .dropdown-menu-sm-left {\\n    right: auto;\\n    left: 0;\\n  }\\n  .dropdown-menu-sm-right {\\n    right: 0;\\n    left: auto;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .dropdown-menu-md-left {\\n    right: auto;\\n    left: 0;\\n  }\\n  .dropdown-menu-md-right {\\n    right: 0;\\n    left: auto;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .dropdown-menu-lg-left {\\n    right: auto;\\n    left: 0;\\n  }\\n  .dropdown-menu-lg-right {\\n    right: 0;\\n    left: auto;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .dropdown-menu-xl-left {\\n    right: auto;\\n    left: 0;\\n  }\\n  .dropdown-menu-xl-right {\\n    right: 0;\\n    left: auto;\\n  }\\n}\\n\\n.dropup .dropdown-menu {\\n  top: auto;\\n  bottom: 100%;\\n  margin-top: 0;\\n  margin-bottom: 0.125rem;\\n}\\n\\n.dropup .dropdown-toggle::after {\\n  display: inline-block;\\n  margin-left: 0.255em;\\n  vertical-align: 0.255em;\\n  content: \\\"\\\";\\n  border-top: 0;\\n  border-right: 0.3em solid transparent;\\n  border-bottom: 0.3em solid;\\n  border-left: 0.3em solid transparent;\\n}\\n\\n.dropup .dropdown-toggle:empty::after {\\n  margin-left: 0;\\n}\\n\\n.dropright .dropdown-menu {\\n  top: 0;\\n  right: auto;\\n  left: 100%;\\n  margin-top: 0;\\n  margin-left: 0.125rem;\\n}\\n\\n.dropright .dropdown-toggle::after {\\n  display: inline-block;\\n  margin-left: 0.255em;\\n  vertical-align: 0.255em;\\n  content: \\\"\\\";\\n  border-top: 0.3em solid transparent;\\n  border-right: 0;\\n  border-bottom: 0.3em solid transparent;\\n  border-left: 0.3em solid;\\n}\\n\\n.dropright .dropdown-toggle:empty::after {\\n  margin-left: 0;\\n}\\n\\n.dropright .dropdown-toggle::after {\\n  vertical-align: 0;\\n}\\n\\n.dropleft .dropdown-menu {\\n  top: 0;\\n  right: 100%;\\n  left: auto;\\n  margin-top: 0;\\n  margin-right: 0.125rem;\\n}\\n\\n.dropleft .dropdown-toggle::after {\\n  display: inline-block;\\n  margin-left: 0.255em;\\n  vertical-align: 0.255em;\\n  content: \\\"\\\";\\n}\\n\\n.dropleft .dropdown-toggle::after {\\n  display: none;\\n}\\n\\n.dropleft .dropdown-toggle::before {\\n  display: inline-block;\\n  margin-right: 0.255em;\\n  vertical-align: 0.255em;\\n  content: \\\"\\\";\\n  border-top: 0.3em solid transparent;\\n  border-right: 0.3em solid;\\n  border-bottom: 0.3em solid transparent;\\n}\\n\\n.dropleft .dropdown-toggle:empty::after {\\n  margin-left: 0;\\n}\\n\\n.dropleft .dropdown-toggle::before {\\n  vertical-align: 0;\\n}\\n\\n.dropdown-menu[x-placement^=\\\"top\\\"], .dropdown-menu[x-placement^=\\\"right\\\"], .dropdown-menu[x-placement^=\\\"bottom\\\"], .dropdown-menu[x-placement^=\\\"left\\\"] {\\n  right: auto;\\n  bottom: auto;\\n}\\n\\n.dropdown-divider {\\n  height: 0;\\n  margin: 0.5rem 0;\\n  overflow: hidden;\\n  border-top: 1px solid #e9ecef;\\n}\\n\\n.dropdown-item {\\n  display: block;\\n  width: 100%;\\n  padding: 0.25rem 1.5rem;\\n  clear: both;\\n  font-weight: 400;\\n  color: #212529;\\n  text-align: inherit;\\n  white-space: nowrap;\\n  background-color: transparent;\\n  border: 0;\\n}\\n\\n.dropdown-item:hover, .dropdown-item:focus {\\n  color: #16181b;\\n  text-decoration: none;\\n  background-color: #f8f9fa;\\n}\\n\\n.dropdown-item.active, .dropdown-item:active {\\n  color: #fff;\\n  text-decoration: none;\\n  background-color: #007bff;\\n}\\n\\n.dropdown-item.disabled, .dropdown-item:disabled {\\n  color: #6c757d;\\n  pointer-events: none;\\n  background-color: transparent;\\n}\\n\\n.dropdown-menu.show {\\n  display: block;\\n}\\n\\n.dropdown-header {\\n  display: block;\\n  padding: 0.5rem 1.5rem;\\n  margin-bottom: 0;\\n  font-size: 0.875rem;\\n  color: #6c757d;\\n  white-space: nowrap;\\n}\\n\\n.dropdown-item-text {\\n  display: block;\\n  padding: 0.25rem 1.5rem;\\n  color: #212529;\\n}\\n\\n.btn-group,\\n.btn-group-vertical {\\n  position: relative;\\n  display: -ms-inline-flexbox;\\n  display: inline-flex;\\n  vertical-align: middle;\\n}\\n\\n.btn-group > .btn,\\n.btn-group-vertical > .btn {\\n  position: relative;\\n  -ms-flex: 1 1 auto;\\n  flex: 1 1 auto;\\n}\\n\\n.btn-group > .btn:hover,\\n.btn-group-vertical > .btn:hover {\\n  z-index: 1;\\n}\\n\\n.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\\n.btn-group-vertical > .btn:focus,\\n.btn-group-vertical > .btn:active,\\n.btn-group-vertical > .btn.active {\\n  z-index: 1;\\n}\\n\\n.btn-toolbar {\\n  display: -ms-flexbox;\\n  display: flex;\\n  -ms-flex-wrap: wrap;\\n  flex-wrap: wrap;\\n  -ms-flex-pack: start;\\n  justify-content: flex-start;\\n}\\n\\n.btn-toolbar .input-group {\\n  width: auto;\\n}\\n\\n.btn-group > .btn:not(:first-child),\\n.btn-group > .btn-group:not(:first-child) {\\n  margin-left: -1px;\\n}\\n\\n.btn-group > .btn:not(:last-child):not(.dropdown-toggle),\\n.btn-group > .btn-group:not(:last-child) > .btn {\\n  border-top-right-radius: 0;\\n  border-bottom-right-radius: 0;\\n}\\n\\n.btn-group > .btn:not(:first-child),\\n.btn-group > .btn-group:not(:first-child) > .btn {\\n  border-top-left-radius: 0;\\n  border-bottom-left-radius: 0;\\n}\\n\\n.dropdown-toggle-split {\\n  padding-right: 0.5625rem;\\n  padding-left: 0.5625rem;\\n}\\n\\n.dropdown-toggle-split::after,\\n.dropup .dropdown-toggle-split::after,\\n.dropright .dropdown-toggle-split::after {\\n  margin-left: 0;\\n}\\n\\n.dropleft .dropdown-toggle-split::before {\\n  margin-right: 0;\\n}\\n\\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\\n  padding-right: 0.375rem;\\n  padding-left: 0.375rem;\\n}\\n\\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\\n  padding-right: 0.75rem;\\n  padding-left: 0.75rem;\\n}\\n\\n.btn-group-vertical {\\n  -ms-flex-direction: column;\\n  flex-direction: column;\\n  -ms-flex-align: start;\\n  align-items: flex-start;\\n  -ms-flex-pack: center;\\n  justify-content: center;\\n}\\n\\n.btn-group-vertical > .btn,\\n.btn-group-vertical > .btn-group {\\n  width: 100%;\\n}\\n\\n.btn-group-vertical > .btn:not(:first-child),\\n.btn-group-vertical > .btn-group:not(:first-child) {\\n  margin-top: -1px;\\n}\\n\\n.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),\\n.btn-group-vertical > .btn-group:not(:last-child) > .btn {\\n  border-bottom-right-radius: 0;\\n  border-bottom-left-radius: 0;\\n}\\n\\n.btn-group-vertical > .btn:not(:first-child),\\n.btn-group-vertical > .btn-group:not(:first-child) > .btn {\\n  border-top-left-radius: 0;\\n  border-top-right-radius: 0;\\n}\\n\\n.btn-group-toggle > .btn,\\n.btn-group-toggle > .btn-group > .btn {\\n  margin-bottom: 0;\\n}\\n\\n.btn-group-toggle > .btn input[type=\\\"radio\\\"],\\n.btn-group-toggle > .btn input[type=\\\"checkbox\\\"],\\n.btn-group-toggle > .btn-group > .btn input[type=\\\"radio\\\"],\\n.btn-group-toggle > .btn-group > .btn input[type=\\\"checkbox\\\"] {\\n  position: absolute;\\n  clip: rect(0, 0, 0, 0);\\n  pointer-events: none;\\n}\\n\\n.input-group {\\n  position: relative;\\n  display: -ms-flexbox;\\n  display: flex;\\n  -ms-flex-wrap: wrap;\\n  flex-wrap: wrap;\\n  -ms-flex-align: stretch;\\n  align-items: stretch;\\n  width: 100%;\\n}\\n\\n.input-group > .form-control,\\n.input-group > .form-control-plaintext,\\n.input-group > .custom-select,\\n.input-group > .custom-file {\\n  position: relative;\\n  -ms-flex: 1 1 auto;\\n  flex: 1 1 auto;\\n  width: 1%;\\n  margin-bottom: 0;\\n}\\n\\n.input-group > .form-control + .form-control,\\n.input-group > .form-control + .custom-select,\\n.input-group > .form-control + .custom-file,\\n.input-group > .form-control-plaintext + .form-control,\\n.input-group > .form-control-plaintext + .custom-select,\\n.input-group > .form-control-plaintext + .custom-file,\\n.input-group > .custom-select + .form-control,\\n.input-group > .custom-select + .custom-select,\\n.input-group > .custom-select + .custom-file,\\n.input-group > .custom-file + .form-control,\\n.input-group > .custom-file + .custom-select,\\n.input-group > .custom-file + .custom-file {\\n  margin-left: -1px;\\n}\\n\\n.input-group > .form-control:focus,\\n.input-group > .custom-select:focus,\\n.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label {\\n  z-index: 3;\\n}\\n\\n.input-group > .custom-file .custom-file-input:focus {\\n  z-index: 4;\\n}\\n\\n.input-group > .form-control:not(:last-child),\\n.input-group > .custom-select:not(:last-child) {\\n  border-top-right-radius: 0;\\n  border-bottom-right-radius: 0;\\n}\\n\\n.input-group > .form-control:not(:first-child),\\n.input-group > .custom-select:not(:first-child) {\\n  border-top-left-radius: 0;\\n  border-bottom-left-radius: 0;\\n}\\n\\n.input-group > .custom-file {\\n  display: -ms-flexbox;\\n  display: flex;\\n  -ms-flex-align: center;\\n  align-items: center;\\n}\\n\\n.input-group > .custom-file:not(:last-child) .custom-file-label,\\n.input-group > .custom-file:not(:last-child) .custom-file-label::after {\\n  border-top-right-radius: 0;\\n  border-bottom-right-radius: 0;\\n}\\n\\n.input-group > .custom-file:not(:first-child) .custom-file-label {\\n  border-top-left-radius: 0;\\n  border-bottom-left-radius: 0;\\n}\\n\\n.input-group-prepend,\\n.input-group-append {\\n  display: -ms-flexbox;\\n  display: flex;\\n}\\n\\n.input-group-prepend .btn,\\n.input-group-append .btn {\\n  position: relative;\\n  z-index: 2;\\n}\\n\\n.input-group-prepend .btn:focus,\\n.input-group-append .btn:focus {\\n  z-index: 3;\\n}\\n\\n.input-group-prepend .btn + .btn,\\n.input-group-prepend .btn + .input-group-text,\\n.input-group-prepend .input-group-text + .input-group-text,\\n.input-group-prepend .input-group-text + .btn,\\n.input-group-append .btn + .btn,\\n.input-group-append .btn + .input-group-text,\\n.input-group-append .input-group-text + .input-group-text,\\n.input-group-append .input-group-text + .btn {\\n  margin-left: -1px;\\n}\\n\\n.input-group-prepend {\\n  margin-right: -1px;\\n}\\n\\n.input-group-append {\\n  margin-left: -1px;\\n}\\n\\n.input-group-text {\\n  display: -ms-flexbox;\\n  display: flex;\\n  -ms-flex-align: center;\\n  align-items: center;\\n  padding: 0.375rem 0.75rem;\\n  margin-bottom: 0;\\n  font-size: 1rem;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  color: #495057;\\n  text-align: center;\\n  white-space: nowrap;\\n  background-color: #e9ecef;\\n  border: 1px solid #ced4da;\\n  border-radius: 0.25rem;\\n}\\n\\n.input-group-text input[type=\\\"radio\\\"],\\n.input-group-text input[type=\\\"checkbox\\\"] {\\n  margin-top: 0;\\n}\\n\\n.input-group-lg > .form-control:not(textarea),\\n.input-group-lg > .custom-select {\\n  height: calc(1.5em + 1rem + 2px);\\n}\\n\\n.input-group-lg > .form-control,\\n.input-group-lg > .custom-select,\\n.input-group-lg > .input-group-prepend > .input-group-text,\\n.input-group-lg > .input-group-append > .input-group-text,\\n.input-group-lg > .input-group-prepend > .btn,\\n.input-group-lg > .input-group-append > .btn {\\n  padding: 0.5rem 1rem;\\n  font-size: 1.25rem;\\n  line-height: 1.5;\\n  border-radius: 0.3rem;\\n}\\n\\n.input-group-sm > .form-control:not(textarea),\\n.input-group-sm > .custom-select {\\n  height: calc(1.5em + 0.5rem + 2px);\\n}\\n\\n.input-group-sm > .form-control,\\n.input-group-sm > .custom-select,\\n.input-group-sm > .input-group-prepend > .input-group-text,\\n.input-group-sm > .input-group-append > .input-group-text,\\n.input-group-sm > .input-group-prepend > .btn,\\n.input-group-sm > .input-group-append > .btn {\\n  padding: 0.25rem 0.5rem;\\n  font-size: 0.875rem;\\n  line-height: 1.5;\\n  border-radius: 0.2rem;\\n}\\n\\n.input-group-lg > .custom-select,\\n.input-group-sm > .custom-select {\\n  padding-right: 1.75rem;\\n}\\n\\n.input-group > .input-group-prepend > .btn,\\n.input-group > .input-group-prepend > .input-group-text,\\n.input-group > .input-group-append:not(:last-child) > .btn,\\n.input-group > .input-group-append:not(:last-child) > .input-group-text,\\n.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),\\n.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {\\n  border-top-right-radius: 0;\\n  border-bottom-right-radius: 0;\\n}\\n\\n.input-group > .input-group-append > .btn,\\n.input-group > .input-group-append > .input-group-text,\\n.input-group > .input-group-prepend:not(:first-child) > .btn,\\n.input-group > .input-group-prepend:not(:first-child) > .input-group-text,\\n.input-group > .input-group-prepend:first-child > .btn:not(:first-child),\\n.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {\\n  border-top-left-radius: 0;\\n  border-bottom-left-radius: 0;\\n}\\n\\n.custom-control {\\n  position: relative;\\n  display: block;\\n  min-height: 1.5rem;\\n  padding-left: 1.5rem;\\n}\\n\\n.custom-control-inline {\\n  display: -ms-inline-flexbox;\\n  display: inline-flex;\\n  margin-right: 1rem;\\n}\\n\\n.custom-control-input {\\n  position: absolute;\\n  z-index: -1;\\n  opacity: 0;\\n}\\n\\n.custom-control-input:checked ~ .custom-control-label::before {\\n  color: #fff;\\n  border-color: #007bff;\\n  background-color: #007bff;\\n}\\n\\n.custom-control-input:focus ~ .custom-control-label::before {\\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\\n}\\n\\n.custom-control-input:focus:not(:checked) ~ .custom-control-label::before {\\n  border-color: #80bdff;\\n}\\n\\n.custom-control-input:not(:disabled):active ~ .custom-control-label::before {\\n  color: #fff;\\n  background-color: #b3d7ff;\\n  border-color: #b3d7ff;\\n}\\n\\n.custom-control-input:disabled ~ .custom-control-label {\\n  color: #6c757d;\\n}\\n\\n.custom-control-input:disabled ~ .custom-control-label::before {\\n  background-color: #e9ecef;\\n}\\n\\n.custom-control-label {\\n  position: relative;\\n  margin-bottom: 0;\\n  vertical-align: top;\\n}\\n\\n.custom-control-label::before {\\n  position: absolute;\\n  top: 0.25rem;\\n  left: -1.5rem;\\n  display: block;\\n  width: 1rem;\\n  height: 1rem;\\n  pointer-events: none;\\n  content: \\\"\\\";\\n  background-color: #fff;\\n  border: #adb5bd solid 1px;\\n}\\n\\n.custom-control-label::after {\\n  position: absolute;\\n  top: 0.25rem;\\n  left: -1.5rem;\\n  display: block;\\n  width: 1rem;\\n  height: 1rem;\\n  content: \\\"\\\";\\n  background: no-repeat 50% / 50% 50%;\\n}\\n\\n.custom-checkbox .custom-control-label::before {\\n  border-radius: 0.25rem;\\n}\\n\\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {\\n  background-image: url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e\\\");\\n}\\n\\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {\\n  border-color: #007bff;\\n  background-color: #007bff;\\n}\\n\\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {\\n  background-image: url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e\\\");\\n}\\n\\n.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {\\n  background-color: rgba(0, 123, 255, 0.5);\\n}\\n\\n.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before {\\n  background-color: rgba(0, 123, 255, 0.5);\\n}\\n\\n.custom-radio .custom-control-label::before {\\n  border-radius: 50%;\\n}\\n\\n.custom-radio .custom-control-input:checked ~ .custom-control-label::after {\\n  background-image: url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e\\\");\\n}\\n\\n.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {\\n  background-color: rgba(0, 123, 255, 0.5);\\n}\\n\\n.custom-switch {\\n  padding-left: 2.25rem;\\n}\\n\\n.custom-switch .custom-control-label::before {\\n  left: -2.25rem;\\n  width: 1.75rem;\\n  pointer-events: all;\\n  border-radius: 0.5rem;\\n}\\n\\n.custom-switch .custom-control-label::after {\\n  top: calc(0.25rem + 2px);\\n  left: calc(-2.25rem + 2px);\\n  width: calc(1rem - 4px);\\n  height: calc(1rem - 4px);\\n  background-color: #adb5bd;\\n  border-radius: 0.5rem;\\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out;\\n  transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\\n  transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .custom-switch .custom-control-label::after {\\n    transition: none;\\n  }\\n}\\n\\n.custom-switch .custom-control-input:checked ~ .custom-control-label::after {\\n  background-color: #fff;\\n  -webkit-transform: translateX(0.75rem);\\n  transform: translateX(0.75rem);\\n}\\n\\n.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before {\\n  background-color: rgba(0, 123, 255, 0.5);\\n}\\n\\n.custom-select {\\n  display: inline-block;\\n  width: 100%;\\n  height: calc(1.5em + 0.75rem + 2px);\\n  padding: 0.375rem 1.75rem 0.375rem 0.75rem;\\n  font-size: 1rem;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  color: #495057;\\n  vertical-align: middle;\\n  background: url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\\\") no-repeat right 0.75rem center/8px 10px;\\n  background-color: #fff;\\n  border: 1px solid #ced4da;\\n  border-radius: 0.25rem;\\n  -webkit-appearance: none;\\n  -moz-appearance: none;\\n  appearance: none;\\n}\\n\\n.custom-select:focus {\\n  border-color: #80bdff;\\n  outline: 0;\\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\\n}\\n\\n.custom-select:focus::-ms-value {\\n  color: #495057;\\n  background-color: #fff;\\n}\\n\\n.custom-select[multiple], .custom-select[size]:not([size=\\\"1\\\"]) {\\n  height: auto;\\n  padding-right: 0.75rem;\\n  background-image: none;\\n}\\n\\n.custom-select:disabled {\\n  color: #6c757d;\\n  background-color: #e9ecef;\\n}\\n\\n.custom-select::-ms-expand {\\n  display: none;\\n}\\n\\n.custom-select-sm {\\n  height: calc(1.5em + 0.5rem + 2px);\\n  padding-top: 0.25rem;\\n  padding-bottom: 0.25rem;\\n  padding-left: 0.5rem;\\n  font-size: 0.875rem;\\n}\\n\\n.custom-select-lg {\\n  height: calc(1.5em + 1rem + 2px);\\n  padding-top: 0.5rem;\\n  padding-bottom: 0.5rem;\\n  padding-left: 1rem;\\n  font-size: 1.25rem;\\n}\\n\\n.custom-file {\\n  position: relative;\\n  display: inline-block;\\n  width: 100%;\\n  height: calc(1.5em + 0.75rem + 2px);\\n  margin-bottom: 0;\\n}\\n\\n.custom-file-input {\\n  position: relative;\\n  z-index: 2;\\n  width: 100%;\\n  height: calc(1.5em + 0.75rem + 2px);\\n  margin: 0;\\n  opacity: 0;\\n}\\n\\n.custom-file-input:focus ~ .custom-file-label {\\n  border-color: #80bdff;\\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\\n}\\n\\n.custom-file-input:disabled ~ .custom-file-label {\\n  background-color: #e9ecef;\\n}\\n\\n.custom-file-input:lang(en) ~ .custom-file-label::after {\\n  content: \\\"Browse\\\";\\n}\\n\\n.custom-file-input ~ .custom-file-label[data-browse]::after {\\n  content: attr(data-browse);\\n}\\n\\n.custom-file-label {\\n  position: absolute;\\n  top: 0;\\n  right: 0;\\n  left: 0;\\n  z-index: 1;\\n  height: calc(1.5em + 0.75rem + 2px);\\n  padding: 0.375rem 0.75rem;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  color: #495057;\\n  background-color: #fff;\\n  border: 1px solid #ced4da;\\n  border-radius: 0.25rem;\\n}\\n\\n.custom-file-label::after {\\n  position: absolute;\\n  top: 0;\\n  right: 0;\\n  bottom: 0;\\n  z-index: 3;\\n  display: block;\\n  height: calc(1.5em + 0.75rem);\\n  padding: 0.375rem 0.75rem;\\n  line-height: 1.5;\\n  color: #495057;\\n  content: \\\"Browse\\\";\\n  background-color: #e9ecef;\\n  border-left: inherit;\\n  border-radius: 0 0.25rem 0.25rem 0;\\n}\\n\\n.custom-range {\\n  width: 100%;\\n  height: calc(1rem + 0.4rem);\\n  padding: 0;\\n  background-color: transparent;\\n  -webkit-appearance: none;\\n  -moz-appearance: none;\\n  appearance: none;\\n}\\n\\n.custom-range:focus {\\n  outline: none;\\n}\\n\\n.custom-range:focus::-webkit-slider-thumb {\\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\\n}\\n\\n.custom-range:focus::-moz-range-thumb {\\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\\n}\\n\\n.custom-range:focus::-ms-thumb {\\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\\n}\\n\\n.custom-range::-moz-focus-outer {\\n  border: 0;\\n}\\n\\n.custom-range::-webkit-slider-thumb {\\n  width: 1rem;\\n  height: 1rem;\\n  margin-top: -0.25rem;\\n  background-color: #007bff;\\n  border: 0;\\n  border-radius: 1rem;\\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\\n  -webkit-appearance: none;\\n  appearance: none;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .custom-range::-webkit-slider-thumb {\\n    transition: none;\\n  }\\n}\\n\\n.custom-range::-webkit-slider-thumb:active {\\n  background-color: #b3d7ff;\\n}\\n\\n.custom-range::-webkit-slider-runnable-track {\\n  width: 100%;\\n  height: 0.5rem;\\n  color: transparent;\\n  cursor: pointer;\\n  background-color: #dee2e6;\\n  border-color: transparent;\\n  border-radius: 1rem;\\n}\\n\\n.custom-range::-moz-range-thumb {\\n  width: 1rem;\\n  height: 1rem;\\n  background-color: #007bff;\\n  border: 0;\\n  border-radius: 1rem;\\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\\n  -moz-appearance: none;\\n  appearance: none;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .custom-range::-moz-range-thumb {\\n    transition: none;\\n  }\\n}\\n\\n.custom-range::-moz-range-thumb:active {\\n  background-color: #b3d7ff;\\n}\\n\\n.custom-range::-moz-range-track {\\n  width: 100%;\\n  height: 0.5rem;\\n  color: transparent;\\n  cursor: pointer;\\n  background-color: #dee2e6;\\n  border-color: transparent;\\n  border-radius: 1rem;\\n}\\n\\n.custom-range::-ms-thumb {\\n  width: 1rem;\\n  height: 1rem;\\n  margin-top: 0;\\n  margin-right: 0.2rem;\\n  margin-left: 0.2rem;\\n  background-color: #007bff;\\n  border: 0;\\n  border-radius: 1rem;\\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\\n  appearance: none;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .custom-range::-ms-thumb {\\n    transition: none;\\n  }\\n}\\n\\n.custom-range::-ms-thumb:active {\\n  background-color: #b3d7ff;\\n}\\n\\n.custom-range::-ms-track {\\n  width: 100%;\\n  height: 0.5rem;\\n  color: transparent;\\n  cursor: pointer;\\n  background-color: transparent;\\n  border-color: transparent;\\n  border-width: 0.5rem;\\n}\\n\\n.custom-range::-ms-fill-lower {\\n  background-color: #dee2e6;\\n  border-radius: 1rem;\\n}\\n\\n.custom-range::-ms-fill-upper {\\n  margin-right: 15px;\\n  background-color: #dee2e6;\\n  border-radius: 1rem;\\n}\\n\\n.custom-range:disabled::-webkit-slider-thumb {\\n  background-color: #adb5bd;\\n}\\n\\n.custom-range:disabled::-webkit-slider-runnable-track {\\n  cursor: default;\\n}\\n\\n.custom-range:disabled::-moz-range-thumb {\\n  background-color: #adb5bd;\\n}\\n\\n.custom-range:disabled::-moz-range-track {\\n  cursor: default;\\n}\\n\\n.custom-range:disabled::-ms-thumb {\\n  background-color: #adb5bd;\\n}\\n\\n.custom-control-label::before,\\n.custom-file-label,\\n.custom-select {\\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .custom-control-label::before,\\n  .custom-file-label,\\n  .custom-select {\\n    transition: none;\\n  }\\n}\\n\\n.nav {\\n  display: -ms-flexbox;\\n  display: flex;\\n  -ms-flex-wrap: wrap;\\n  flex-wrap: wrap;\\n  padding-left: 0;\\n  margin-bottom: 0;\\n  list-style: none;\\n}\\n\\n.nav-link {\\n  display: block;\\n  padding: 0.5rem 1rem;\\n}\\n\\n.nav-link:hover, .nav-link:focus {\\n  text-decoration: none;\\n}\\n\\n.nav-link.disabled {\\n  color: #6c757d;\\n  pointer-events: none;\\n  cursor: default;\\n}\\n\\n.nav-tabs {\\n  border-bottom: 1px solid #dee2e6;\\n}\\n\\n.nav-tabs .nav-item {\\n  margin-bottom: -1px;\\n}\\n\\n.nav-tabs .nav-link {\\n  border: 1px solid transparent;\\n  border-top-left-radius: 0.25rem;\\n  border-top-right-radius: 0.25rem;\\n}\\n\\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\\n  border-color: #e9ecef #e9ecef #dee2e6;\\n}\\n\\n.nav-tabs .nav-link.disabled {\\n  color: #6c757d;\\n  background-color: transparent;\\n  border-color: transparent;\\n}\\n\\n.nav-tabs .nav-link.active,\\n.nav-tabs .nav-item.show .nav-link {\\n  color: #495057;\\n  background-color: #fff;\\n  border-color: #dee2e6 #dee2e6 #fff;\\n}\\n\\n.nav-tabs .dropdown-menu {\\n  margin-top: -1px;\\n  border-top-left-radius: 0;\\n  border-top-right-radius: 0;\\n}\\n\\n.nav-pills .nav-link {\\n  border-radius: 0.25rem;\\n}\\n\\n.nav-pills .nav-link.active,\\n.nav-pills .show > .nav-link {\\n  color: #fff;\\n  background-color: #007bff;\\n}\\n\\n.nav-fill .nav-item {\\n  -ms-flex: 1 1 auto;\\n  flex: 1 1 auto;\\n  text-align: center;\\n}\\n\\n.nav-justified .nav-item {\\n  -ms-flex-preferred-size: 0;\\n  flex-basis: 0;\\n  -ms-flex-positive: 1;\\n  flex-grow: 1;\\n  text-align: center;\\n}\\n\\n.tab-content > .tab-pane {\\n  display: none;\\n}\\n\\n.tab-content > .active {\\n  display: block;\\n}\\n\\n.navbar {\\n  position: relative;\\n  display: -ms-flexbox;\\n  display: flex;\\n  -ms-flex-wrap: wrap;\\n  flex-wrap: wrap;\\n  -ms-flex-align: center;\\n  align-items: center;\\n  -ms-flex-pack: justify;\\n  justify-content: space-between;\\n  padding: 0.5rem 1rem;\\n}\\n\\n.navbar > .container,\\n.navbar > .container-fluid {\\n  display: -ms-flexbox;\\n  display: flex;\\n  -ms-flex-wrap: wrap;\\n  flex-wrap: wrap;\\n  -ms-flex-align: center;\\n  align-items: center;\\n  -ms-flex-pack: justify;\\n  justify-content: space-between;\\n}\\n\\n.navbar-brand {\\n  display: inline-block;\\n  padding-top: 0.3125rem;\\n  padding-bottom: 0.3125rem;\\n  margin-right: 1rem;\\n  font-size: 1.25rem;\\n  line-height: inherit;\\n  white-space: nowrap;\\n}\\n\\n.navbar-brand:hover, .navbar-brand:focus {\\n  text-decoration: none;\\n}\\n\\n.navbar-nav {\\n  display: -ms-flexbox;\\n  display: flex;\\n  -ms-flex-direction: column;\\n  flex-direction: column;\\n  padding-left: 0;\\n  margin-bottom: 0;\\n  list-style: none;\\n}\\n\\n.navbar-nav .nav-link {\\n  padding-right: 0;\\n  padding-left: 0;\\n}\\n\\n.navbar-nav .dropdown-menu {\\n  position: static;\\n  float: none;\\n}\\n\\n.navbar-text {\\n  display: inline-block;\\n  padding-top: 0.5rem;\\n  padding-bottom: 0.5rem;\\n}\\n\\n.navbar-collapse {\\n  -ms-flex-preferred-size: 100%;\\n  flex-basis: 100%;\\n  -ms-flex-positive: 1;\\n  flex-grow: 1;\\n  -ms-flex-align: center;\\n  align-items: center;\\n}\\n\\n.navbar-toggler {\\n  padding: 0.25rem 0.75rem;\\n  font-size: 1.25rem;\\n  line-height: 1;\\n  background-color: transparent;\\n  border: 1px solid transparent;\\n  border-radius: 0.25rem;\\n}\\n\\n.navbar-toggler:hover, .navbar-toggler:focus {\\n  text-decoration: none;\\n}\\n\\n.navbar-toggler-icon {\\n  display: inline-block;\\n  width: 1.5em;\\n  height: 1.5em;\\n  vertical-align: middle;\\n  content: \\\"\\\";\\n  background: no-repeat center center;\\n  background-size: 100% 100%;\\n}\\n\\n@media (max-width: 575.98px) {\\n  .navbar-expand-sm > .container,\\n  .navbar-expand-sm > .container-fluid {\\n    padding-right: 0;\\n    padding-left: 0;\\n  }\\n}\\n\\n@media (min-width: 576px) {\\n  .navbar-expand-sm {\\n    -ms-flex-flow: row nowrap;\\n    flex-flow: row nowrap;\\n    -ms-flex-pack: start;\\n    justify-content: flex-start;\\n  }\\n  .navbar-expand-sm .navbar-nav {\\n    -ms-flex-direction: row;\\n    flex-direction: row;\\n  }\\n  .navbar-expand-sm .navbar-nav .dropdown-menu {\\n    position: absolute;\\n  }\\n  .navbar-expand-sm .navbar-nav .nav-link {\\n    padding-right: 0.5rem;\\n    padding-left: 0.5rem;\\n  }\\n  .navbar-expand-sm > .container,\\n  .navbar-expand-sm > .container-fluid {\\n    -ms-flex-wrap: nowrap;\\n    flex-wrap: nowrap;\\n  }\\n  .navbar-expand-sm .navbar-collapse {\\n    display: -ms-flexbox !important;\\n    display: flex !important;\\n    -ms-flex-preferred-size: auto;\\n    flex-basis: auto;\\n  }\\n  .navbar-expand-sm .navbar-toggler {\\n    display: none;\\n  }\\n}\\n\\n@media (max-width: 767.98px) {\\n  .navbar-expand-md > .container,\\n  .navbar-expand-md > .container-fluid {\\n    padding-right: 0;\\n    padding-left: 0;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .navbar-expand-md {\\n    -ms-flex-flow: row nowrap;\\n    flex-flow: row nowrap;\\n    -ms-flex-pack: start;\\n    justify-content: flex-start;\\n  }\\n  .navbar-expand-md .navbar-nav {\\n    -ms-flex-direction: row;\\n    flex-direction: row;\\n  }\\n  .navbar-expand-md .navbar-nav .dropdown-menu {\\n    position: absolute;\\n  }\\n  .navbar-expand-md .navbar-nav .nav-link {\\n    padding-right: 0.5rem;\\n    padding-left: 0.5rem;\\n  }\\n  .navbar-expand-md > .container,\\n  .navbar-expand-md > .container-fluid {\\n    -ms-flex-wrap: nowrap;\\n    flex-wrap: nowrap;\\n  }\\n  .navbar-expand-md .navbar-collapse {\\n    display: -ms-flexbox !important;\\n    display: flex !important;\\n    -ms-flex-preferred-size: auto;\\n    flex-basis: auto;\\n  }\\n  .navbar-expand-md .navbar-toggler {\\n    display: none;\\n  }\\n}\\n\\n@media (max-width: 991.98px) {\\n  .navbar-expand-lg > .container,\\n  .navbar-expand-lg > .container-fluid {\\n    padding-right: 0;\\n    padding-left: 0;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .navbar-expand-lg {\\n    -ms-flex-flow: row nowrap;\\n    flex-flow: row nowrap;\\n    -ms-flex-pack: start;\\n    justify-content: flex-start;\\n  }\\n  .navbar-expand-lg .navbar-nav {\\n    -ms-flex-direction: row;\\n    flex-direction: row;\\n  }\\n  .navbar-expand-lg .navbar-nav .dropdown-menu {\\n    position: absolute;\\n  }\\n  .navbar-expand-lg .navbar-nav .nav-link {\\n    padding-right: 0.5rem;\\n    padding-left: 0.5rem;\\n  }\\n  .navbar-expand-lg > .container,\\n  .navbar-expand-lg > .container-fluid {\\n    -ms-flex-wrap: nowrap;\\n    flex-wrap: nowrap;\\n  }\\n  .navbar-expand-lg .navbar-collapse {\\n    display: -ms-flexbox !important;\\n    display: flex !important;\\n    -ms-flex-preferred-size: auto;\\n    flex-basis: auto;\\n  }\\n  .navbar-expand-lg .navbar-toggler {\\n    display: none;\\n  }\\n}\\n\\n@media (max-width: 1199.98px) {\\n  .navbar-expand-xl > .container,\\n  .navbar-expand-xl > .container-fluid {\\n    padding-right: 0;\\n    padding-left: 0;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .navbar-expand-xl {\\n    -ms-flex-flow: row nowrap;\\n    flex-flow: row nowrap;\\n    -ms-flex-pack: start;\\n    justify-content: flex-start;\\n  }\\n  .navbar-expand-xl .navbar-nav {\\n    -ms-flex-direction: row;\\n    flex-direction: row;\\n  }\\n  .navbar-expand-xl .navbar-nav .dropdown-menu {\\n    position: absolute;\\n  }\\n  .navbar-expand-xl .navbar-nav .nav-link {\\n    padding-right: 0.5rem;\\n    padding-left: 0.5rem;\\n  }\\n  .navbar-expand-xl > .container,\\n  .navbar-expand-xl > .container-fluid {\\n    -ms-flex-wrap: nowrap;\\n    flex-wrap: nowrap;\\n  }\\n  .navbar-expand-xl .navbar-collapse {\\n    display: -ms-flexbox !important;\\n    display: flex !important;\\n    -ms-flex-preferred-size: auto;\\n    flex-basis: auto;\\n  }\\n  .navbar-expand-xl .navbar-toggler {\\n    display: none;\\n  }\\n}\\n\\n.navbar-expand {\\n  -ms-flex-flow: row nowrap;\\n  flex-flow: row nowrap;\\n  -ms-flex-pack: start;\\n  justify-content: flex-start;\\n}\\n\\n.navbar-expand > .container,\\n.navbar-expand > .container-fluid {\\n  padding-right: 0;\\n  padding-left: 0;\\n}\\n\\n.navbar-expand .navbar-nav {\\n  -ms-flex-direction: row;\\n  flex-direction: row;\\n}\\n\\n.navbar-expand .navbar-nav .dropdown-menu {\\n  position: absolute;\\n}\\n\\n.navbar-expand .navbar-nav .nav-link {\\n  padding-right: 0.5rem;\\n  padding-left: 0.5rem;\\n}\\n\\n.navbar-expand > .container,\\n.navbar-expand > .container-fluid {\\n  -ms-flex-wrap: nowrap;\\n  flex-wrap: nowrap;\\n}\\n\\n.navbar-expand .navbar-collapse {\\n  display: -ms-flexbox !important;\\n  display: flex !important;\\n  -ms-flex-preferred-size: auto;\\n  flex-basis: auto;\\n}\\n\\n.navbar-expand .navbar-toggler {\\n  display: none;\\n}\\n\\n.navbar-light .navbar-brand {\\n  color: rgba(0, 0, 0, 0.9);\\n}\\n\\n.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {\\n  color: rgba(0, 0, 0, 0.9);\\n}\\n\\n.navbar-light .navbar-nav .nav-link {\\n  color: rgba(0, 0, 0, 0.5);\\n}\\n\\n.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {\\n  color: rgba(0, 0, 0, 0.7);\\n}\\n\\n.navbar-light .navbar-nav .nav-link.disabled {\\n  color: rgba(0, 0, 0, 0.3);\\n}\\n\\n.navbar-light .navbar-nav .show > .nav-link,\\n.navbar-light .navbar-nav .active > .nav-link,\\n.navbar-light .navbar-nav .nav-link.show,\\n.navbar-light .navbar-nav .nav-link.active {\\n  color: rgba(0, 0, 0, 0.9);\\n}\\n\\n.navbar-light .navbar-toggler {\\n  color: rgba(0, 0, 0, 0.5);\\n  border-color: rgba(0, 0, 0, 0.1);\\n}\\n\\n.navbar-light .navbar-toggler-icon {\\n  background-image: url(\\\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\\\");\\n}\\n\\n.navbar-light .navbar-text {\\n  color: rgba(0, 0, 0, 0.5);\\n}\\n\\n.navbar-light .navbar-text a {\\n  color: rgba(0, 0, 0, 0.9);\\n}\\n\\n.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {\\n  color: rgba(0, 0, 0, 0.9);\\n}\\n\\n.navbar-dark .navbar-brand {\\n  color: #fff;\\n}\\n\\n.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {\\n  color: #fff;\\n}\\n\\n.navbar-dark .navbar-nav .nav-link {\\n  color: rgba(255, 255, 255, 0.5);\\n}\\n\\n.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {\\n  color: rgba(255, 255, 255, 0.75);\\n}\\n\\n.navbar-dark .navbar-nav .nav-link.disabled {\\n  color: rgba(255, 255, 255, 0.25);\\n}\\n\\n.navbar-dark .navbar-nav .show > .nav-link,\\n.navbar-dark .navbar-nav .active > .nav-link,\\n.navbar-dark .navbar-nav .nav-link.show,\\n.navbar-dark .navbar-nav .nav-link.active {\\n  color: #fff;\\n}\\n\\n.navbar-dark .navbar-toggler {\\n  color: rgba(255, 255, 255, 0.5);\\n  border-color: rgba(255, 255, 255, 0.1);\\n}\\n\\n.navbar-dark .navbar-toggler-icon {\\n  background-image: url(\\\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\\\");\\n}\\n\\n.navbar-dark .navbar-text {\\n  color: rgba(255, 255, 255, 0.5);\\n}\\n\\n.navbar-dark .navbar-text a {\\n  color: #fff;\\n}\\n\\n.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {\\n  color: #fff;\\n}\\n\\n.card {\\n  position: relative;\\n  display: -ms-flexbox;\\n  display: flex;\\n  -ms-flex-direction: column;\\n  flex-direction: column;\\n  min-width: 0;\\n  word-wrap: break-word;\\n  background-color: #fff;\\n  background-clip: border-box;\\n  border: 1px solid rgba(0, 0, 0, 0.125);\\n  border-radius: 0.25rem;\\n}\\n\\n.card > hr {\\n  margin-right: 0;\\n  margin-left: 0;\\n}\\n\\n.card > .list-group:first-child .list-group-item:first-child {\\n  border-top-left-radius: 0.25rem;\\n  border-top-right-radius: 0.25rem;\\n}\\n\\n.card > .list-group:last-child .list-group-item:last-child {\\n  border-bottom-right-radius: 0.25rem;\\n  border-bottom-left-radius: 0.25rem;\\n}\\n\\n.card-body {\\n  -ms-flex: 1 1 auto;\\n  flex: 1 1 auto;\\n  padding: 1.25rem;\\n}\\n\\n.card-title {\\n  margin-bottom: 0.75rem;\\n}\\n\\n.card-subtitle {\\n  margin-top: -0.375rem;\\n  margin-bottom: 0;\\n}\\n\\n.card-text:last-child {\\n  margin-bottom: 0;\\n}\\n\\n.card-link:hover {\\n  text-decoration: none;\\n}\\n\\n.card-link + .card-link {\\n  margin-left: 1.25rem;\\n}\\n\\n.card-header {\\n  padding: 0.75rem 1.25rem;\\n  margin-bottom: 0;\\n  background-color: rgba(0, 0, 0, 0.03);\\n  border-bottom: 1px solid rgba(0, 0, 0, 0.125);\\n}\\n\\n.card-header:first-child {\\n  border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\\n}\\n\\n.card-header + .list-group .list-group-item:first-child {\\n  border-top: 0;\\n}\\n\\n.card-footer {\\n  padding: 0.75rem 1.25rem;\\n  background-color: rgba(0, 0, 0, 0.03);\\n  border-top: 1px solid rgba(0, 0, 0, 0.125);\\n}\\n\\n.card-footer:last-child {\\n  border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\\n}\\n\\n.card-header-tabs {\\n  margin-right: -0.625rem;\\n  margin-bottom: -0.75rem;\\n  margin-left: -0.625rem;\\n  border-bottom: 0;\\n}\\n\\n.card-header-pills {\\n  margin-right: -0.625rem;\\n  margin-left: -0.625rem;\\n}\\n\\n.card-img-overlay {\\n  position: absolute;\\n  top: 0;\\n  right: 0;\\n  bottom: 0;\\n  left: 0;\\n  padding: 1.25rem;\\n}\\n\\n.card-img {\\n  width: 100%;\\n  border-radius: calc(0.25rem - 1px);\\n}\\n\\n.card-img-top {\\n  width: 100%;\\n  border-top-left-radius: calc(0.25rem - 1px);\\n  border-top-right-radius: calc(0.25rem - 1px);\\n}\\n\\n.card-img-bottom {\\n  width: 100%;\\n  border-bottom-right-radius: calc(0.25rem - 1px);\\n  border-bottom-left-radius: calc(0.25rem - 1px);\\n}\\n\\n.card-deck {\\n  display: -ms-flexbox;\\n  display: flex;\\n  -ms-flex-direction: column;\\n  flex-direction: column;\\n}\\n\\n.card-deck .card {\\n  margin-bottom: 15px;\\n}\\n\\n@media (min-width: 576px) {\\n  .card-deck {\\n    -ms-flex-flow: row wrap;\\n    flex-flow: row wrap;\\n    margin-right: -15px;\\n    margin-left: -15px;\\n  }\\n  .card-deck .card {\\n    display: -ms-flexbox;\\n    display: flex;\\n    -ms-flex: 1 0 0%;\\n    flex: 1 0 0%;\\n    -ms-flex-direction: column;\\n    flex-direction: column;\\n    margin-right: 15px;\\n    margin-bottom: 0;\\n    margin-left: 15px;\\n  }\\n}\\n\\n.card-group {\\n  display: -ms-flexbox;\\n  display: flex;\\n  -ms-flex-direction: column;\\n  flex-direction: column;\\n}\\n\\n.card-group > .card {\\n  margin-bottom: 15px;\\n}\\n\\n@media (min-width: 576px) {\\n  .card-group {\\n    -ms-flex-flow: row wrap;\\n    flex-flow: row wrap;\\n  }\\n  .card-group > .card {\\n    -ms-flex: 1 0 0%;\\n    flex: 1 0 0%;\\n    margin-bottom: 0;\\n  }\\n  .card-group > .card + .card {\\n    margin-left: 0;\\n    border-left: 0;\\n  }\\n  .card-group > .card:not(:last-child) {\\n    border-top-right-radius: 0;\\n    border-bottom-right-radius: 0;\\n  }\\n  .card-group > .card:not(:last-child) .card-img-top,\\n  .card-group > .card:not(:last-child) .card-header {\\n    border-top-right-radius: 0;\\n  }\\n  .card-group > .card:not(:last-child) .card-img-bottom,\\n  .card-group > .card:not(:last-child) .card-footer {\\n    border-bottom-right-radius: 0;\\n  }\\n  .card-group > .card:not(:first-child) {\\n    border-top-left-radius: 0;\\n    border-bottom-left-radius: 0;\\n  }\\n  .card-group > .card:not(:first-child) .card-img-top,\\n  .card-group > .card:not(:first-child) .card-header {\\n    border-top-left-radius: 0;\\n  }\\n  .card-group > .card:not(:first-child) .card-img-bottom,\\n  .card-group > .card:not(:first-child) .card-footer {\\n    border-bottom-left-radius: 0;\\n  }\\n}\\n\\n.card-columns .card {\\n  margin-bottom: 0.75rem;\\n}\\n\\n@media (min-width: 576px) {\\n  .card-columns {\\n    -webkit-column-count: 3;\\n    -moz-column-count: 3;\\n    column-count: 3;\\n    -webkit-column-gap: 1.25rem;\\n    -moz-column-gap: 1.25rem;\\n    column-gap: 1.25rem;\\n    orphans: 1;\\n    widows: 1;\\n  }\\n  .card-columns .card {\\n    display: inline-block;\\n    width: 100%;\\n  }\\n}\\n\\n.accordion > .card {\\n  overflow: hidden;\\n}\\n\\n.accordion > .card:not(:first-of-type) .card-header:first-child {\\n  border-radius: 0;\\n}\\n\\n.accordion > .card:not(:first-of-type):not(:last-of-type) {\\n  border-bottom: 0;\\n  border-radius: 0;\\n}\\n\\n.accordion > .card:first-of-type {\\n  border-bottom: 0;\\n  border-bottom-right-radius: 0;\\n  border-bottom-left-radius: 0;\\n}\\n\\n.accordion > .card:last-of-type {\\n  border-top-left-radius: 0;\\n  border-top-right-radius: 0;\\n}\\n\\n.accordion > .card .card-header {\\n  margin-bottom: -1px;\\n}\\n\\n.breadcrumb {\\n  display: -ms-flexbox;\\n  display: flex;\\n  -ms-flex-wrap: wrap;\\n  flex-wrap: wrap;\\n  padding: 0.75rem 1rem;\\n  margin-bottom: 1rem;\\n  list-style: none;\\n  background-color: #e9ecef;\\n  border-radius: 0.25rem;\\n}\\n\\n.breadcrumb-item + .breadcrumb-item {\\n  padding-left: 0.5rem;\\n}\\n\\n.breadcrumb-item + .breadcrumb-item::before {\\n  display: inline-block;\\n  padding-right: 0.5rem;\\n  color: #6c757d;\\n  content: \\\"/\\\";\\n}\\n\\n.breadcrumb-item + .breadcrumb-item:hover::before {\\n  text-decoration: underline;\\n}\\n\\n.breadcrumb-item + .breadcrumb-item:hover::before {\\n  text-decoration: none;\\n}\\n\\n.breadcrumb-item.active {\\n  color: #6c757d;\\n}\\n\\n.pagination {\\n  display: -ms-flexbox;\\n  display: flex;\\n  padding-left: 0;\\n  list-style: none;\\n  border-radius: 0.25rem;\\n}\\n\\n.page-link {\\n  position: relative;\\n  display: block;\\n  padding: 0.5rem 0.75rem;\\n  margin-left: -1px;\\n  line-height: 1.25;\\n  color: #007bff;\\n  background-color: #fff;\\n  border: 1px solid #dee2e6;\\n}\\n\\n.page-link:hover {\\n  z-index: 2;\\n  color: #0056b3;\\n  text-decoration: none;\\n  background-color: #e9ecef;\\n  border-color: #dee2e6;\\n}\\n\\n.page-link:focus {\\n  z-index: 2;\\n  outline: 0;\\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\\n}\\n\\n.page-item:first-child .page-link {\\n  margin-left: 0;\\n  border-top-left-radius: 0.25rem;\\n  border-bottom-left-radius: 0.25rem;\\n}\\n\\n.page-item:last-child .page-link {\\n  border-top-right-radius: 0.25rem;\\n  border-bottom-right-radius: 0.25rem;\\n}\\n\\n.page-item.active .page-link {\\n  z-index: 1;\\n  color: #fff;\\n  background-color: #007bff;\\n  border-color: #007bff;\\n}\\n\\n.page-item.disabled .page-link {\\n  color: #6c757d;\\n  pointer-events: none;\\n  cursor: auto;\\n  background-color: #fff;\\n  border-color: #dee2e6;\\n}\\n\\n.pagination-lg .page-link {\\n  padding: 0.75rem 1.5rem;\\n  font-size: 1.25rem;\\n  line-height: 1.5;\\n}\\n\\n.pagination-lg .page-item:first-child .page-link {\\n  border-top-left-radius: 0.3rem;\\n  border-bottom-left-radius: 0.3rem;\\n}\\n\\n.pagination-lg .page-item:last-child .page-link {\\n  border-top-right-radius: 0.3rem;\\n  border-bottom-right-radius: 0.3rem;\\n}\\n\\n.pagination-sm .page-link {\\n  padding: 0.25rem 0.5rem;\\n  font-size: 0.875rem;\\n  line-height: 1.5;\\n}\\n\\n.pagination-sm .page-item:first-child .page-link {\\n  border-top-left-radius: 0.2rem;\\n  border-bottom-left-radius: 0.2rem;\\n}\\n\\n.pagination-sm .page-item:last-child .page-link {\\n  border-top-right-radius: 0.2rem;\\n  border-bottom-right-radius: 0.2rem;\\n}\\n\\n.badge {\\n  display: inline-block;\\n  padding: 0.25em 0.4em;\\n  font-size: 75%;\\n  font-weight: 700;\\n  line-height: 1;\\n  text-align: center;\\n  white-space: nowrap;\\n  vertical-align: baseline;\\n  border-radius: 0.25rem;\\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .badge {\\n    transition: none;\\n  }\\n}\\n\\na.badge:hover, a.badge:focus {\\n  text-decoration: none;\\n}\\n\\n.badge:empty {\\n  display: none;\\n}\\n\\n.btn .badge {\\n  position: relative;\\n  top: -1px;\\n}\\n\\n.badge-pill {\\n  padding-right: 0.6em;\\n  padding-left: 0.6em;\\n  border-radius: 10rem;\\n}\\n\\n.badge-primary {\\n  color: #fff;\\n  background-color: #007bff;\\n}\\n\\na.badge-primary:hover, a.badge-primary:focus {\\n  color: #fff;\\n  background-color: #0062cc;\\n}\\n\\na.badge-primary:focus, a.badge-primary.focus {\\n  outline: 0;\\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\\n}\\n\\n.badge-secondary {\\n  color: #fff;\\n  background-color: #6c757d;\\n}\\n\\na.badge-secondary:hover, a.badge-secondary:focus {\\n  color: #fff;\\n  background-color: #545b62;\\n}\\n\\na.badge-secondary:focus, a.badge-secondary.focus {\\n  outline: 0;\\n  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\\n}\\n\\n.badge-success {\\n  color: #fff;\\n  background-color: #28a745;\\n}\\n\\na.badge-success:hover, a.badge-success:focus {\\n  color: #fff;\\n  background-color: #1e7e34;\\n}\\n\\na.badge-success:focus, a.badge-success.focus {\\n  outline: 0;\\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\\n}\\n\\n.badge-info {\\n  color: #fff;\\n  background-color: #17a2b8;\\n}\\n\\na.badge-info:hover, a.badge-info:focus {\\n  color: #fff;\\n  background-color: #117a8b;\\n}\\n\\na.badge-info:focus, a.badge-info.focus {\\n  outline: 0;\\n  box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\\n}\\n\\n.badge-warning {\\n  color: #212529;\\n  background-color: #ffc107;\\n}\\n\\na.badge-warning:hover, a.badge-warning:focus {\\n  color: #212529;\\n  background-color: #d39e00;\\n}\\n\\na.badge-warning:focus, a.badge-warning.focus {\\n  outline: 0;\\n  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\\n}\\n\\n.badge-danger {\\n  color: #fff;\\n  background-color: #dc3545;\\n}\\n\\na.badge-danger:hover, a.badge-danger:focus {\\n  color: #fff;\\n  background-color: #bd2130;\\n}\\n\\na.badge-danger:focus, a.badge-danger.focus {\\n  outline: 0;\\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\\n}\\n\\n.badge-light {\\n  color: #212529;\\n  background-color: #f8f9fa;\\n}\\n\\na.badge-light:hover, a.badge-light:focus {\\n  color: #212529;\\n  background-color: #dae0e5;\\n}\\n\\na.badge-light:focus, a.badge-light.focus {\\n  outline: 0;\\n  box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\\n}\\n\\n.badge-dark {\\n  color: #fff;\\n  background-color: #343a40;\\n}\\n\\na.badge-dark:hover, a.badge-dark:focus {\\n  color: #fff;\\n  background-color: #1d2124;\\n}\\n\\na.badge-dark:focus, a.badge-dark.focus {\\n  outline: 0;\\n  box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\\n}\\n\\n.jumbotron {\\n  padding: 2rem 1rem;\\n  margin-bottom: 2rem;\\n  background-color: #e9ecef;\\n  border-radius: 0.3rem;\\n}\\n\\n@media (min-width: 576px) {\\n  .jumbotron {\\n    padding: 4rem 2rem;\\n  }\\n}\\n\\n.jumbotron-fluid {\\n  padding-right: 0;\\n  padding-left: 0;\\n  border-radius: 0;\\n}\\n\\n.alert {\\n  position: relative;\\n  padding: 0.75rem 1.25rem;\\n  margin-bottom: 1rem;\\n  border: 1px solid transparent;\\n  border-radius: 0.25rem;\\n}\\n\\n.alert-heading {\\n  color: inherit;\\n}\\n\\n.alert-link {\\n  font-weight: 700;\\n}\\n\\n.alert-dismissible {\\n  padding-right: 4rem;\\n}\\n\\n.alert-dismissible .close {\\n  position: absolute;\\n  top: 0;\\n  right: 0;\\n  padding: 0.75rem 1.25rem;\\n  color: inherit;\\n}\\n\\n.alert-primary {\\n  color: #004085;\\n  background-color: #cce5ff;\\n  border-color: #b8daff;\\n}\\n\\n.alert-primary hr {\\n  border-top-color: #9fcdff;\\n}\\n\\n.alert-primary .alert-link {\\n  color: #002752;\\n}\\n\\n.alert-secondary {\\n  color: #383d41;\\n  background-color: #e2e3e5;\\n  border-color: #d6d8db;\\n}\\n\\n.alert-secondary hr {\\n  border-top-color: #c8cbcf;\\n}\\n\\n.alert-secondary .alert-link {\\n  color: #202326;\\n}\\n\\n.alert-success {\\n  color: #155724;\\n  background-color: #d4edda;\\n  border-color: #c3e6cb;\\n}\\n\\n.alert-success hr {\\n  border-top-color: #b1dfbb;\\n}\\n\\n.alert-success .alert-link {\\n  color: #0b2e13;\\n}\\n\\n.alert-info {\\n  color: #0c5460;\\n  background-color: #d1ecf1;\\n  border-color: #bee5eb;\\n}\\n\\n.alert-info hr {\\n  border-top-color: #abdde5;\\n}\\n\\n.alert-info .alert-link {\\n  color: #062c33;\\n}\\n\\n.alert-warning {\\n  color: #856404;\\n  background-color: #fff3cd;\\n  border-color: #ffeeba;\\n}\\n\\n.alert-warning hr {\\n  border-top-color: #ffe8a1;\\n}\\n\\n.alert-warning .alert-link {\\n  color: #533f03;\\n}\\n\\n.alert-danger {\\n  color: #721c24;\\n  background-color: #f8d7da;\\n  border-color: #f5c6cb;\\n}\\n\\n.alert-danger hr {\\n  border-top-color: #f1b0b7;\\n}\\n\\n.alert-danger .alert-link {\\n  color: #491217;\\n}\\n\\n.alert-light {\\n  color: #818182;\\n  background-color: #fefefe;\\n  border-color: #fdfdfe;\\n}\\n\\n.alert-light hr {\\n  border-top-color: #ececf6;\\n}\\n\\n.alert-light .alert-link {\\n  color: #686868;\\n}\\n\\n.alert-dark {\\n  color: #1b1e21;\\n  background-color: #d6d8d9;\\n  border-color: #c6c8ca;\\n}\\n\\n.alert-dark hr {\\n  border-top-color: #b9bbbe;\\n}\\n\\n.alert-dark .alert-link {\\n  color: #040505;\\n}\\n\\n@-webkit-keyframes progress-bar-stripes {\\n  from {\\n    background-position: 1rem 0;\\n  }\\n  to {\\n    background-position: 0 0;\\n  }\\n}\\n\\n@keyframes progress-bar-stripes {\\n  from {\\n    background-position: 1rem 0;\\n  }\\n  to {\\n    background-position: 0 0;\\n  }\\n}\\n\\n.progress {\\n  display: -ms-flexbox;\\n  display: flex;\\n  height: 1rem;\\n  overflow: hidden;\\n  font-size: 0.75rem;\\n  background-color: #e9ecef;\\n  border-radius: 0.25rem;\\n}\\n\\n.progress-bar {\\n  display: -ms-flexbox;\\n  display: flex;\\n  -ms-flex-direction: column;\\n  flex-direction: column;\\n  -ms-flex-pack: center;\\n  justify-content: center;\\n  color: #fff;\\n  text-align: center;\\n  white-space: nowrap;\\n  background-color: #007bff;\\n  transition: width 0.6s ease;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .progress-bar {\\n    transition: none;\\n  }\\n}\\n\\n.progress-bar-striped {\\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\\n  background-size: 1rem 1rem;\\n}\\n\\n.progress-bar-animated {\\n  -webkit-animation: progress-bar-stripes 1s linear infinite;\\n  animation: progress-bar-stripes 1s linear infinite;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .progress-bar-animated {\\n    -webkit-animation: none;\\n    animation: none;\\n  }\\n}\\n\\n.media {\\n  display: -ms-flexbox;\\n  display: flex;\\n  -ms-flex-align: start;\\n  align-items: flex-start;\\n}\\n\\n.media-body {\\n  -ms-flex: 1;\\n  flex: 1;\\n}\\n\\n.list-group {\\n  display: -ms-flexbox;\\n  display: flex;\\n  -ms-flex-direction: column;\\n  flex-direction: column;\\n  padding-left: 0;\\n  margin-bottom: 0;\\n}\\n\\n.list-group-item-action {\\n  width: 100%;\\n  color: #495057;\\n  text-align: inherit;\\n}\\n\\n.list-group-item-action:hover, .list-group-item-action:focus {\\n  z-index: 1;\\n  color: #495057;\\n  text-decoration: none;\\n  background-color: #f8f9fa;\\n}\\n\\n.list-group-item-action:active {\\n  color: #212529;\\n  background-color: #e9ecef;\\n}\\n\\n.list-group-item {\\n  position: relative;\\n  display: block;\\n  padding: 0.75rem 1.25rem;\\n  margin-bottom: -1px;\\n  background-color: #fff;\\n  border: 1px solid rgba(0, 0, 0, 0.125);\\n}\\n\\n.list-group-item:first-child {\\n  border-top-left-radius: 0.25rem;\\n  border-top-right-radius: 0.25rem;\\n}\\n\\n.list-group-item:last-child {\\n  margin-bottom: 0;\\n  border-bottom-right-radius: 0.25rem;\\n  border-bottom-left-radius: 0.25rem;\\n}\\n\\n.list-group-item.disabled, .list-group-item:disabled {\\n  color: #6c757d;\\n  pointer-events: none;\\n  background-color: #fff;\\n}\\n\\n.list-group-item.active {\\n  z-index: 2;\\n  color: #fff;\\n  background-color: #007bff;\\n  border-color: #007bff;\\n}\\n\\n.list-group-horizontal {\\n  -ms-flex-direction: row;\\n  flex-direction: row;\\n}\\n\\n.list-group-horizontal .list-group-item {\\n  margin-right: -1px;\\n  margin-bottom: 0;\\n}\\n\\n.list-group-horizontal .list-group-item:first-child {\\n  border-top-left-radius: 0.25rem;\\n  border-bottom-left-radius: 0.25rem;\\n  border-top-right-radius: 0;\\n}\\n\\n.list-group-horizontal .list-group-item:last-child {\\n  margin-right: 0;\\n  border-top-right-radius: 0.25rem;\\n  border-bottom-right-radius: 0.25rem;\\n  border-bottom-left-radius: 0;\\n}\\n\\n@media (min-width: 576px) {\\n  .list-group-horizontal-sm {\\n    -ms-flex-direction: row;\\n    flex-direction: row;\\n  }\\n  .list-group-horizontal-sm .list-group-item {\\n    margin-right: -1px;\\n    margin-bottom: 0;\\n  }\\n  .list-group-horizontal-sm .list-group-item:first-child {\\n    border-top-left-radius: 0.25rem;\\n    border-bottom-left-radius: 0.25rem;\\n    border-top-right-radius: 0;\\n  }\\n  .list-group-horizontal-sm .list-group-item:last-child {\\n    margin-right: 0;\\n    border-top-right-radius: 0.25rem;\\n    border-bottom-right-radius: 0.25rem;\\n    border-bottom-left-radius: 0;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .list-group-horizontal-md {\\n    -ms-flex-direction: row;\\n    flex-direction: row;\\n  }\\n  .list-group-horizontal-md .list-group-item {\\n    margin-right: -1px;\\n    margin-bottom: 0;\\n  }\\n  .list-group-horizontal-md .list-group-item:first-child {\\n    border-top-left-radius: 0.25rem;\\n    border-bottom-left-radius: 0.25rem;\\n    border-top-right-radius: 0;\\n  }\\n  .list-group-horizontal-md .list-group-item:last-child {\\n    margin-right: 0;\\n    border-top-right-radius: 0.25rem;\\n    border-bottom-right-radius: 0.25rem;\\n    border-bottom-left-radius: 0;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .list-group-horizontal-lg {\\n    -ms-flex-direction: row;\\n    flex-direction: row;\\n  }\\n  .list-group-horizontal-lg .list-group-item {\\n    margin-right: -1px;\\n    margin-bottom: 0;\\n  }\\n  .list-group-horizontal-lg .list-group-item:first-child {\\n    border-top-left-radius: 0.25rem;\\n    border-bottom-left-radius: 0.25rem;\\n    border-top-right-radius: 0;\\n  }\\n  .list-group-horizontal-lg .list-group-item:last-child {\\n    margin-right: 0;\\n    border-top-right-radius: 0.25rem;\\n    border-bottom-right-radius: 0.25rem;\\n    border-bottom-left-radius: 0;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .list-group-horizontal-xl {\\n    -ms-flex-direction: row;\\n    flex-direction: row;\\n  }\\n  .list-group-horizontal-xl .list-group-item {\\n    margin-right: -1px;\\n    margin-bottom: 0;\\n  }\\n  .list-group-horizontal-xl .list-group-item:first-child {\\n    border-top-left-radius: 0.25rem;\\n    border-bottom-left-radius: 0.25rem;\\n    border-top-right-radius: 0;\\n  }\\n  .list-group-horizontal-xl .list-group-item:last-child {\\n    margin-right: 0;\\n    border-top-right-radius: 0.25rem;\\n    border-bottom-right-radius: 0.25rem;\\n    border-bottom-left-radius: 0;\\n  }\\n}\\n\\n.list-group-flush .list-group-item {\\n  border-right: 0;\\n  border-left: 0;\\n  border-radius: 0;\\n}\\n\\n.list-group-flush .list-group-item:last-child {\\n  margin-bottom: -1px;\\n}\\n\\n.list-group-flush:first-child .list-group-item:first-child {\\n  border-top: 0;\\n}\\n\\n.list-group-flush:last-child .list-group-item:last-child {\\n  margin-bottom: 0;\\n  border-bottom: 0;\\n}\\n\\n.list-group-item-primary {\\n  color: #004085;\\n  background-color: #b8daff;\\n}\\n\\n.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {\\n  color: #004085;\\n  background-color: #9fcdff;\\n}\\n\\n.list-group-item-primary.list-group-item-action.active {\\n  color: #fff;\\n  background-color: #004085;\\n  border-color: #004085;\\n}\\n\\n.list-group-item-secondary {\\n  color: #383d41;\\n  background-color: #d6d8db;\\n}\\n\\n.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {\\n  color: #383d41;\\n  background-color: #c8cbcf;\\n}\\n\\n.list-group-item-secondary.list-group-item-action.active {\\n  color: #fff;\\n  background-color: #383d41;\\n  border-color: #383d41;\\n}\\n\\n.list-group-item-success {\\n  color: #155724;\\n  background-color: #c3e6cb;\\n}\\n\\n.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {\\n  color: #155724;\\n  background-color: #b1dfbb;\\n}\\n\\n.list-group-item-success.list-group-item-action.active {\\n  color: #fff;\\n  background-color: #155724;\\n  border-color: #155724;\\n}\\n\\n.list-group-item-info {\\n  color: #0c5460;\\n  background-color: #bee5eb;\\n}\\n\\n.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {\\n  color: #0c5460;\\n  background-color: #abdde5;\\n}\\n\\n.list-group-item-info.list-group-item-action.active {\\n  color: #fff;\\n  background-color: #0c5460;\\n  border-color: #0c5460;\\n}\\n\\n.list-group-item-warning {\\n  color: #856404;\\n  background-color: #ffeeba;\\n}\\n\\n.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {\\n  color: #856404;\\n  background-color: #ffe8a1;\\n}\\n\\n.list-group-item-warning.list-group-item-action.active {\\n  color: #fff;\\n  background-color: #856404;\\n  border-color: #856404;\\n}\\n\\n.list-group-item-danger {\\n  color: #721c24;\\n  background-color: #f5c6cb;\\n}\\n\\n.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {\\n  color: #721c24;\\n  background-color: #f1b0b7;\\n}\\n\\n.list-group-item-danger.list-group-item-action.active {\\n  color: #fff;\\n  background-color: #721c24;\\n  border-color: #721c24;\\n}\\n\\n.list-group-item-light {\\n  color: #818182;\\n  background-color: #fdfdfe;\\n}\\n\\n.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {\\n  color: #818182;\\n  background-color: #ececf6;\\n}\\n\\n.list-group-item-light.list-group-item-action.active {\\n  color: #fff;\\n  background-color: #818182;\\n  border-color: #818182;\\n}\\n\\n.list-group-item-dark {\\n  color: #1b1e21;\\n  background-color: #c6c8ca;\\n}\\n\\n.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {\\n  color: #1b1e21;\\n  background-color: #b9bbbe;\\n}\\n\\n.list-group-item-dark.list-group-item-action.active {\\n  color: #fff;\\n  background-color: #1b1e21;\\n  border-color: #1b1e21;\\n}\\n\\n.close {\\n  float: right;\\n  font-size: 1.5rem;\\n  font-weight: 700;\\n  line-height: 1;\\n  color: #000;\\n  text-shadow: 0 1px 0 #fff;\\n  opacity: .5;\\n}\\n\\n.close:hover {\\n  color: #000;\\n  text-decoration: none;\\n}\\n\\n.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus {\\n  opacity: .75;\\n}\\n\\nbutton.close {\\n  padding: 0;\\n  background-color: transparent;\\n  border: 0;\\n  -webkit-appearance: none;\\n  -moz-appearance: none;\\n  appearance: none;\\n}\\n\\na.close.disabled {\\n  pointer-events: none;\\n}\\n\\n.toast {\\n  max-width: 350px;\\n  overflow: hidden;\\n  font-size: 0.875rem;\\n  background-color: rgba(255, 255, 255, 0.85);\\n  background-clip: padding-box;\\n  border: 1px solid rgba(0, 0, 0, 0.1);\\n  box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1);\\n  -webkit-backdrop-filter: blur(10px);\\n  backdrop-filter: blur(10px);\\n  opacity: 0;\\n  border-radius: 0.25rem;\\n}\\n\\n.toast:not(:last-child) {\\n  margin-bottom: 0.75rem;\\n}\\n\\n.toast.showing {\\n  opacity: 1;\\n}\\n\\n.toast.show {\\n  display: block;\\n  opacity: 1;\\n}\\n\\n.toast.hide {\\n  display: none;\\n}\\n\\n.toast-header {\\n  display: -ms-flexbox;\\n  display: flex;\\n  -ms-flex-align: center;\\n  align-items: center;\\n  padding: 0.25rem 0.75rem;\\n  color: #6c757d;\\n  background-color: rgba(255, 255, 255, 0.85);\\n  background-clip: padding-box;\\n  border-bottom: 1px solid rgba(0, 0, 0, 0.05);\\n}\\n\\n.toast-body {\\n  padding: 0.75rem;\\n}\\n\\n.modal-open {\\n  overflow: hidden;\\n}\\n\\n.modal-open .modal {\\n  overflow-x: hidden;\\n  overflow-y: auto;\\n}\\n\\n.modal {\\n  position: fixed;\\n  top: 0;\\n  left: 0;\\n  z-index: 1050;\\n  display: none;\\n  width: 100%;\\n  height: 100%;\\n  overflow: hidden;\\n  outline: 0;\\n}\\n\\n.modal-dialog {\\n  position: relative;\\n  width: auto;\\n  margin: 0.5rem;\\n  pointer-events: none;\\n}\\n\\n.modal.fade .modal-dialog {\\n  transition: -webkit-transform 0.3s ease-out;\\n  transition: transform 0.3s ease-out;\\n  transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out;\\n  -webkit-transform: translate(0, -50px);\\n  transform: translate(0, -50px);\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .modal.fade .modal-dialog {\\n    transition: none;\\n  }\\n}\\n\\n.modal.show .modal-dialog {\\n  -webkit-transform: none;\\n  transform: none;\\n}\\n\\n.modal-dialog-scrollable {\\n  display: -ms-flexbox;\\n  display: flex;\\n  max-height: calc(100% - 1rem);\\n}\\n\\n.modal-dialog-scrollable .modal-content {\\n  max-height: calc(100vh - 1rem);\\n  overflow: hidden;\\n}\\n\\n.modal-dialog-scrollable .modal-header,\\n.modal-dialog-scrollable .modal-footer {\\n  -ms-flex-negative: 0;\\n  flex-shrink: 0;\\n}\\n\\n.modal-dialog-scrollable .modal-body {\\n  overflow-y: auto;\\n}\\n\\n.modal-dialog-centered {\\n  display: -ms-flexbox;\\n  display: flex;\\n  -ms-flex-align: center;\\n  align-items: center;\\n  min-height: calc(100% - 1rem);\\n}\\n\\n.modal-dialog-centered::before {\\n  display: block;\\n  height: calc(100vh - 1rem);\\n  content: \\\"\\\";\\n}\\n\\n.modal-dialog-centered.modal-dialog-scrollable {\\n  -ms-flex-direction: column;\\n  flex-direction: column;\\n  -ms-flex-pack: center;\\n  justify-content: center;\\n  height: 100%;\\n}\\n\\n.modal-dialog-centered.modal-dialog-scrollable .modal-content {\\n  max-height: none;\\n}\\n\\n.modal-dialog-centered.modal-dialog-scrollable::before {\\n  content: none;\\n}\\n\\n.modal-content {\\n  position: relative;\\n  display: -ms-flexbox;\\n  display: flex;\\n  -ms-flex-direction: column;\\n  flex-direction: column;\\n  width: 100%;\\n  pointer-events: auto;\\n  background-color: #fff;\\n  background-clip: padding-box;\\n  border: 1px solid rgba(0, 0, 0, 0.2);\\n  border-radius: 0.3rem;\\n  outline: 0;\\n}\\n\\n.modal-backdrop {\\n  position: fixed;\\n  top: 0;\\n  left: 0;\\n  z-index: 1040;\\n  width: 100vw;\\n  height: 100vh;\\n  background-color: #000;\\n}\\n\\n.modal-backdrop.fade {\\n  opacity: 0;\\n}\\n\\n.modal-backdrop.show {\\n  opacity: 0.5;\\n}\\n\\n.modal-header {\\n  display: -ms-flexbox;\\n  display: flex;\\n  -ms-flex-align: start;\\n  align-items: flex-start;\\n  -ms-flex-pack: justify;\\n  justify-content: space-between;\\n  padding: 1rem 1rem;\\n  border-bottom: 1px solid #dee2e6;\\n  border-top-left-radius: 0.3rem;\\n  border-top-right-radius: 0.3rem;\\n}\\n\\n.modal-header .close {\\n  padding: 1rem 1rem;\\n  margin: -1rem -1rem -1rem auto;\\n}\\n\\n.modal-title {\\n  margin-bottom: 0;\\n  line-height: 1.5;\\n}\\n\\n.modal-body {\\n  position: relative;\\n  -ms-flex: 1 1 auto;\\n  flex: 1 1 auto;\\n  padding: 1rem;\\n}\\n\\n.modal-footer {\\n  display: -ms-flexbox;\\n  display: flex;\\n  -ms-flex-align: center;\\n  align-items: center;\\n  -ms-flex-pack: end;\\n  justify-content: flex-end;\\n  padding: 1rem;\\n  border-top: 1px solid #dee2e6;\\n  border-bottom-right-radius: 0.3rem;\\n  border-bottom-left-radius: 0.3rem;\\n}\\n\\n.modal-footer > :not(:first-child) {\\n  margin-left: .25rem;\\n}\\n\\n.modal-footer > :not(:last-child) {\\n  margin-right: .25rem;\\n}\\n\\n.modal-scrollbar-measure {\\n  position: absolute;\\n  top: -9999px;\\n  width: 50px;\\n  height: 50px;\\n  overflow: scroll;\\n}\\n\\n@media (min-width: 576px) {\\n  .modal-dialog {\\n    max-width: 500px;\\n    margin: 1.75rem auto;\\n  }\\n  .modal-dialog-scrollable {\\n    max-height: calc(100% - 3.5rem);\\n  }\\n  .modal-dialog-scrollable .modal-content {\\n    max-height: calc(100vh - 3.5rem);\\n  }\\n  .modal-dialog-centered {\\n    min-height: calc(100% - 3.5rem);\\n  }\\n  .modal-dialog-centered::before {\\n    height: calc(100vh - 3.5rem);\\n  }\\n  .modal-sm {\\n    max-width: 300px;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .modal-lg,\\n  .modal-xl {\\n    max-width: 800px;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .modal-xl {\\n    max-width: 1140px;\\n  }\\n}\\n\\n.tooltip {\\n  position: absolute;\\n  z-index: 1070;\\n  display: block;\\n  margin: 0;\\n  font-family: -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, \\\"Helvetica Neue\\\", Arial, \\\"Noto Sans\\\", sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\";\\n  font-style: normal;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  text-align: left;\\n  text-align: start;\\n  text-decoration: none;\\n  text-shadow: none;\\n  text-transform: none;\\n  letter-spacing: normal;\\n  word-break: normal;\\n  word-spacing: normal;\\n  white-space: normal;\\n  line-break: auto;\\n  font-size: 0.875rem;\\n  word-wrap: break-word;\\n  opacity: 0;\\n}\\n\\n.tooltip.show {\\n  opacity: 0.9;\\n}\\n\\n.tooltip .arrow {\\n  position: absolute;\\n  display: block;\\n  width: 0.8rem;\\n  height: 0.4rem;\\n}\\n\\n.tooltip .arrow::before {\\n  position: absolute;\\n  content: \\\"\\\";\\n  border-color: transparent;\\n  border-style: solid;\\n}\\n\\n.bs-tooltip-top, .bs-tooltip-auto[x-placement^=\\\"top\\\"] {\\n  padding: 0.4rem 0;\\n}\\n\\n.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=\\\"top\\\"] .arrow {\\n  bottom: 0;\\n}\\n\\n.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=\\\"top\\\"] .arrow::before {\\n  top: 0;\\n  border-width: 0.4rem 0.4rem 0;\\n  border-top-color: #000;\\n}\\n\\n.bs-tooltip-right, .bs-tooltip-auto[x-placement^=\\\"right\\\"] {\\n  padding: 0 0.4rem;\\n}\\n\\n.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=\\\"right\\\"] .arrow {\\n  left: 0;\\n  width: 0.4rem;\\n  height: 0.8rem;\\n}\\n\\n.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=\\\"right\\\"] .arrow::before {\\n  right: 0;\\n  border-width: 0.4rem 0.4rem 0.4rem 0;\\n  border-right-color: #000;\\n}\\n\\n.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=\\\"bottom\\\"] {\\n  padding: 0.4rem 0;\\n}\\n\\n.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=\\\"bottom\\\"] .arrow {\\n  top: 0;\\n}\\n\\n.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=\\\"bottom\\\"] .arrow::before {\\n  bottom: 0;\\n  border-width: 0 0.4rem 0.4rem;\\n  border-bottom-color: #000;\\n}\\n\\n.bs-tooltip-left, .bs-tooltip-auto[x-placement^=\\\"left\\\"] {\\n  padding: 0 0.4rem;\\n}\\n\\n.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=\\\"left\\\"] .arrow {\\n  right: 0;\\n  width: 0.4rem;\\n  height: 0.8rem;\\n}\\n\\n.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=\\\"left\\\"] .arrow::before {\\n  left: 0;\\n  border-width: 0.4rem 0 0.4rem 0.4rem;\\n  border-left-color: #000;\\n}\\n\\n.tooltip-inner {\\n  max-width: 200px;\\n  padding: 0.25rem 0.5rem;\\n  color: #fff;\\n  text-align: center;\\n  background-color: #000;\\n  border-radius: 0.25rem;\\n}\\n\\n.popover {\\n  position: absolute;\\n  top: 0;\\n  left: 0;\\n  z-index: 1060;\\n  display: block;\\n  max-width: 276px;\\n  font-family: -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, \\\"Helvetica Neue\\\", Arial, \\\"Noto Sans\\\", sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\";\\n  font-style: normal;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  text-align: left;\\n  text-align: start;\\n  text-decoration: none;\\n  text-shadow: none;\\n  text-transform: none;\\n  letter-spacing: normal;\\n  word-break: normal;\\n  word-spacing: normal;\\n  white-space: normal;\\n  line-break: auto;\\n  font-size: 0.875rem;\\n  word-wrap: break-word;\\n  background-color: #fff;\\n  background-clip: padding-box;\\n  border: 1px solid rgba(0, 0, 0, 0.2);\\n  border-radius: 0.3rem;\\n}\\n\\n.popover .arrow {\\n  position: absolute;\\n  display: block;\\n  width: 1rem;\\n  height: 0.5rem;\\n  margin: 0 0.3rem;\\n}\\n\\n.popover .arrow::before, .popover .arrow::after {\\n  position: absolute;\\n  display: block;\\n  content: \\\"\\\";\\n  border-color: transparent;\\n  border-style: solid;\\n}\\n\\n.bs-popover-top, .bs-popover-auto[x-placement^=\\\"top\\\"] {\\n  margin-bottom: 0.5rem;\\n}\\n\\n.bs-popover-top > .arrow, .bs-popover-auto[x-placement^=\\\"top\\\"] > .arrow {\\n  bottom: calc((0.5rem + 1px) * -1);\\n}\\n\\n.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^=\\\"top\\\"] > .arrow::before {\\n  bottom: 0;\\n  border-width: 0.5rem 0.5rem 0;\\n  border-top-color: rgba(0, 0, 0, 0.25);\\n}\\n\\n.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^=\\\"top\\\"] > .arrow::after {\\n  bottom: 1px;\\n  border-width: 0.5rem 0.5rem 0;\\n  border-top-color: #fff;\\n}\\n\\n.bs-popover-right, .bs-popover-auto[x-placement^=\\\"right\\\"] {\\n  margin-left: 0.5rem;\\n}\\n\\n.bs-popover-right > .arrow, .bs-popover-auto[x-placement^=\\\"right\\\"] > .arrow {\\n  left: calc((0.5rem + 1px) * -1);\\n  width: 0.5rem;\\n  height: 1rem;\\n  margin: 0.3rem 0;\\n}\\n\\n.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^=\\\"right\\\"] > .arrow::before {\\n  left: 0;\\n  border-width: 0.5rem 0.5rem 0.5rem 0;\\n  border-right-color: rgba(0, 0, 0, 0.25);\\n}\\n\\n.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^=\\\"right\\\"] > .arrow::after {\\n  left: 1px;\\n  border-width: 0.5rem 0.5rem 0.5rem 0;\\n  border-right-color: #fff;\\n}\\n\\n.bs-popover-bottom, .bs-popover-auto[x-placement^=\\\"bottom\\\"] {\\n  margin-top: 0.5rem;\\n}\\n\\n.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^=\\\"bottom\\\"] > .arrow {\\n  top: calc((0.5rem + 1px) * -1);\\n}\\n\\n.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^=\\\"bottom\\\"] > .arrow::before {\\n  top: 0;\\n  border-width: 0 0.5rem 0.5rem 0.5rem;\\n  border-bottom-color: rgba(0, 0, 0, 0.25);\\n}\\n\\n.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^=\\\"bottom\\\"] > .arrow::after {\\n  top: 1px;\\n  border-width: 0 0.5rem 0.5rem 0.5rem;\\n  border-bottom-color: #fff;\\n}\\n\\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=\\\"bottom\\\"] .popover-header::before {\\n  position: absolute;\\n  top: 0;\\n  left: 50%;\\n  display: block;\\n  width: 1rem;\\n  margin-left: -0.5rem;\\n  content: \\\"\\\";\\n  border-bottom: 1px solid #f7f7f7;\\n}\\n\\n.bs-popover-left, .bs-popover-auto[x-placement^=\\\"left\\\"] {\\n  margin-right: 0.5rem;\\n}\\n\\n.bs-popover-left > .arrow, .bs-popover-auto[x-placement^=\\\"left\\\"] > .arrow {\\n  right: calc((0.5rem + 1px) * -1);\\n  width: 0.5rem;\\n  height: 1rem;\\n  margin: 0.3rem 0;\\n}\\n\\n.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^=\\\"left\\\"] > .arrow::before {\\n  right: 0;\\n  border-width: 0.5rem 0 0.5rem 0.5rem;\\n  border-left-color: rgba(0, 0, 0, 0.25);\\n}\\n\\n.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^=\\\"left\\\"] > .arrow::after {\\n  right: 1px;\\n  border-width: 0.5rem 0 0.5rem 0.5rem;\\n  border-left-color: #fff;\\n}\\n\\n.popover-header {\\n  padding: 0.5rem 0.75rem;\\n  margin-bottom: 0;\\n  font-size: 1rem;\\n  background-color: #f7f7f7;\\n  border-bottom: 1px solid #ebebeb;\\n  border-top-left-radius: calc(0.3rem - 1px);\\n  border-top-right-radius: calc(0.3rem - 1px);\\n}\\n\\n.popover-header:empty {\\n  display: none;\\n}\\n\\n.popover-body {\\n  padding: 0.5rem 0.75rem;\\n  color: #212529;\\n}\\n\\n.carousel {\\n  position: relative;\\n}\\n\\n.carousel.pointer-event {\\n  -ms-touch-action: pan-y;\\n  touch-action: pan-y;\\n}\\n\\n.carousel-inner {\\n  position: relative;\\n  width: 100%;\\n  overflow: hidden;\\n}\\n\\n.carousel-inner::after {\\n  display: block;\\n  clear: both;\\n  content: \\\"\\\";\\n}\\n\\n.carousel-item {\\n  position: relative;\\n  display: none;\\n  float: left;\\n  width: 100%;\\n  margin-right: -100%;\\n  -webkit-backface-visibility: hidden;\\n  backface-visibility: hidden;\\n  transition: -webkit-transform 0.6s ease-in-out;\\n  transition: transform 0.6s ease-in-out;\\n  transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .carousel-item {\\n    transition: none;\\n  }\\n}\\n\\n.carousel-item.active,\\n.carousel-item-next,\\n.carousel-item-prev {\\n  display: block;\\n}\\n\\n.carousel-item-next:not(.carousel-item-left),\\n.active.carousel-item-right {\\n  -webkit-transform: translateX(100%);\\n  transform: translateX(100%);\\n}\\n\\n.carousel-item-prev:not(.carousel-item-right),\\n.active.carousel-item-left {\\n  -webkit-transform: translateX(-100%);\\n  transform: translateX(-100%);\\n}\\n\\n.carousel-fade .carousel-item {\\n  opacity: 0;\\n  transition-property: opacity;\\n  -webkit-transform: none;\\n  transform: none;\\n}\\n\\n.carousel-fade .carousel-item.active,\\n.carousel-fade .carousel-item-next.carousel-item-left,\\n.carousel-fade .carousel-item-prev.carousel-item-right {\\n  z-index: 1;\\n  opacity: 1;\\n}\\n\\n.carousel-fade .active.carousel-item-left,\\n.carousel-fade .active.carousel-item-right {\\n  z-index: 0;\\n  opacity: 0;\\n  transition: 0s 0.6s opacity;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .carousel-fade .active.carousel-item-left,\\n  .carousel-fade .active.carousel-item-right {\\n    transition: none;\\n  }\\n}\\n\\n.carousel-control-prev,\\n.carousel-control-next {\\n  position: absolute;\\n  top: 0;\\n  bottom: 0;\\n  z-index: 1;\\n  display: -ms-flexbox;\\n  display: flex;\\n  -ms-flex-align: center;\\n  align-items: center;\\n  -ms-flex-pack: center;\\n  justify-content: center;\\n  width: 15%;\\n  color: #fff;\\n  text-align: center;\\n  opacity: 0.5;\\n  transition: opacity 0.15s ease;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .carousel-control-prev,\\n  .carousel-control-next {\\n    transition: none;\\n  }\\n}\\n\\n.carousel-control-prev:hover, .carousel-control-prev:focus,\\n.carousel-control-next:hover,\\n.carousel-control-next:focus {\\n  color: #fff;\\n  text-decoration: none;\\n  outline: 0;\\n  opacity: 0.9;\\n}\\n\\n.carousel-control-prev {\\n  left: 0;\\n}\\n\\n.carousel-control-next {\\n  right: 0;\\n}\\n\\n.carousel-control-prev-icon,\\n.carousel-control-next-icon {\\n  display: inline-block;\\n  width: 20px;\\n  height: 20px;\\n  background: no-repeat 50% / 100% 100%;\\n}\\n\\n.carousel-control-prev-icon {\\n  background-image: url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\\\");\\n}\\n\\n.carousel-control-next-icon {\\n  background-image: url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\\\");\\n}\\n\\n.carousel-indicators {\\n  position: absolute;\\n  right: 0;\\n  bottom: 0;\\n  left: 0;\\n  z-index: 15;\\n  display: -ms-flexbox;\\n  display: flex;\\n  -ms-flex-pack: center;\\n  justify-content: center;\\n  padding-left: 0;\\n  margin-right: 15%;\\n  margin-left: 15%;\\n  list-style: none;\\n}\\n\\n.carousel-indicators li {\\n  box-sizing: content-box;\\n  -ms-flex: 0 1 auto;\\n  flex: 0 1 auto;\\n  width: 30px;\\n  height: 3px;\\n  margin-right: 3px;\\n  margin-left: 3px;\\n  text-indent: -999px;\\n  cursor: pointer;\\n  background-color: #fff;\\n  background-clip: padding-box;\\n  border-top: 10px solid transparent;\\n  border-bottom: 10px solid transparent;\\n  opacity: .5;\\n  transition: opacity 0.6s ease;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .carousel-indicators li {\\n    transition: none;\\n  }\\n}\\n\\n.carousel-indicators .active {\\n  opacity: 1;\\n}\\n\\n.carousel-caption {\\n  position: absolute;\\n  right: 15%;\\n  bottom: 20px;\\n  left: 15%;\\n  z-index: 10;\\n  padding-top: 20px;\\n  padding-bottom: 20px;\\n  color: #fff;\\n  text-align: center;\\n}\\n\\n@-webkit-keyframes spinner-border {\\n  to {\\n    -webkit-transform: rotate(360deg);\\n    transform: rotate(360deg);\\n  }\\n}\\n\\n@keyframes spinner-border {\\n  to {\\n    -webkit-transform: rotate(360deg);\\n    transform: rotate(360deg);\\n  }\\n}\\n\\n.spinner-border {\\n  display: inline-block;\\n  width: 2rem;\\n  height: 2rem;\\n  vertical-align: text-bottom;\\n  border: 0.25em solid currentColor;\\n  border-right-color: transparent;\\n  border-radius: 50%;\\n  -webkit-animation: spinner-border .75s linear infinite;\\n  animation: spinner-border .75s linear infinite;\\n}\\n\\n.spinner-border-sm {\\n  width: 1rem;\\n  height: 1rem;\\n  border-width: 0.2em;\\n}\\n\\n@-webkit-keyframes spinner-grow {\\n  0% {\\n    -webkit-transform: scale(0);\\n    transform: scale(0);\\n  }\\n  50% {\\n    opacity: 1;\\n  }\\n}\\n\\n@keyframes spinner-grow {\\n  0% {\\n    -webkit-transform: scale(0);\\n    transform: scale(0);\\n  }\\n  50% {\\n    opacity: 1;\\n  }\\n}\\n\\n.spinner-grow {\\n  display: inline-block;\\n  width: 2rem;\\n  height: 2rem;\\n  vertical-align: text-bottom;\\n  background-color: currentColor;\\n  border-radius: 50%;\\n  opacity: 0;\\n  -webkit-animation: spinner-grow .75s linear infinite;\\n  animation: spinner-grow .75s linear infinite;\\n}\\n\\n.spinner-grow-sm {\\n  width: 1rem;\\n  height: 1rem;\\n}\\n\\n.align-baseline {\\n  vertical-align: baseline !important;\\n}\\n\\n.align-top {\\n  vertical-align: top !important;\\n}\\n\\n.align-middle {\\n  vertical-align: middle !important;\\n}\\n\\n.align-bottom {\\n  vertical-align: bottom !important;\\n}\\n\\n.align-text-bottom {\\n  vertical-align: text-bottom !important;\\n}\\n\\n.align-text-top {\\n  vertical-align: text-top !important;\\n}\\n\\n.bg-primary {\\n  background-color: #007bff !important;\\n}\\n\\na.bg-primary:hover, a.bg-primary:focus,\\nbutton.bg-primary:hover,\\nbutton.bg-primary:focus {\\n  background-color: #0062cc !important;\\n}\\n\\n.bg-secondary {\\n  background-color: #6c757d !important;\\n}\\n\\na.bg-secondary:hover, a.bg-secondary:focus,\\nbutton.bg-secondary:hover,\\nbutton.bg-secondary:focus {\\n  background-color: #545b62 !important;\\n}\\n\\n.bg-success {\\n  background-color: #28a745 !important;\\n}\\n\\na.bg-success:hover, a.bg-success:focus,\\nbutton.bg-success:hover,\\nbutton.bg-success:focus {\\n  background-color: #1e7e34 !important;\\n}\\n\\n.bg-info {\\n  background-color: #17a2b8 !important;\\n}\\n\\na.bg-info:hover, a.bg-info:focus,\\nbutton.bg-info:hover,\\nbutton.bg-info:focus {\\n  background-color: #117a8b !important;\\n}\\n\\n.bg-warning {\\n  background-color: #ffc107 !important;\\n}\\n\\na.bg-warning:hover, a.bg-warning:focus,\\nbutton.bg-warning:hover,\\nbutton.bg-warning:focus {\\n  background-color: #d39e00 !important;\\n}\\n\\n.bg-danger {\\n  background-color: #dc3545 !important;\\n}\\n\\na.bg-danger:hover, a.bg-danger:focus,\\nbutton.bg-danger:hover,\\nbutton.bg-danger:focus {\\n  background-color: #bd2130 !important;\\n}\\n\\n.bg-light {\\n  background-color: #f8f9fa !important;\\n}\\n\\na.bg-light:hover, a.bg-light:focus,\\nbutton.bg-light:hover,\\nbutton.bg-light:focus {\\n  background-color: #dae0e5 !important;\\n}\\n\\n.bg-dark {\\n  background-color: #343a40 !important;\\n}\\n\\na.bg-dark:hover, a.bg-dark:focus,\\nbutton.bg-dark:hover,\\nbutton.bg-dark:focus {\\n  background-color: #1d2124 !important;\\n}\\n\\n.bg-white {\\n  background-color: #fff !important;\\n}\\n\\n.bg-transparent {\\n  background-color: transparent !important;\\n}\\n\\n.border {\\n  border: 1px solid #dee2e6 !important;\\n}\\n\\n.border-top {\\n  border-top: 1px solid #dee2e6 !important;\\n}\\n\\n.border-right {\\n  border-right: 1px solid #dee2e6 !important;\\n}\\n\\n.border-bottom {\\n  border-bottom: 1px solid #dee2e6 !important;\\n}\\n\\n.border-left {\\n  border-left: 1px solid #dee2e6 !important;\\n}\\n\\n.border-0 {\\n  border: 0 !important;\\n}\\n\\n.border-top-0 {\\n  border-top: 0 !important;\\n}\\n\\n.border-right-0 {\\n  border-right: 0 !important;\\n}\\n\\n.border-bottom-0 {\\n  border-bottom: 0 !important;\\n}\\n\\n.border-left-0 {\\n  border-left: 0 !important;\\n}\\n\\n.border-primary {\\n  border-color: #007bff !important;\\n}\\n\\n.border-secondary {\\n  border-color: #6c757d !important;\\n}\\n\\n.border-success {\\n  border-color: #28a745 !important;\\n}\\n\\n.border-info {\\n  border-color: #17a2b8 !important;\\n}\\n\\n.border-warning {\\n  border-color: #ffc107 !important;\\n}\\n\\n.border-danger {\\n  border-color: #dc3545 !important;\\n}\\n\\n.border-light {\\n  border-color: #f8f9fa !important;\\n}\\n\\n.border-dark {\\n  border-color: #343a40 !important;\\n}\\n\\n.border-white {\\n  border-color: #fff !important;\\n}\\n\\n.rounded-sm {\\n  border-radius: 0.2rem !important;\\n}\\n\\n.rounded {\\n  border-radius: 0.25rem !important;\\n}\\n\\n.rounded-top {\\n  border-top-left-radius: 0.25rem !important;\\n  border-top-right-radius: 0.25rem !important;\\n}\\n\\n.rounded-right {\\n  border-top-right-radius: 0.25rem !important;\\n  border-bottom-right-radius: 0.25rem !important;\\n}\\n\\n.rounded-bottom {\\n  border-bottom-right-radius: 0.25rem !important;\\n  border-bottom-left-radius: 0.25rem !important;\\n}\\n\\n.rounded-left {\\n  border-top-left-radius: 0.25rem !important;\\n  border-bottom-left-radius: 0.25rem !important;\\n}\\n\\n.rounded-lg {\\n  border-radius: 0.3rem !important;\\n}\\n\\n.rounded-circle {\\n  border-radius: 50% !important;\\n}\\n\\n.rounded-pill {\\n  border-radius: 50rem !important;\\n}\\n\\n.rounded-0 {\\n  border-radius: 0 !important;\\n}\\n\\n.clearfix::after {\\n  display: block;\\n  clear: both;\\n  content: \\\"\\\";\\n}\\n\\n.d-none {\\n  display: none !important;\\n}\\n\\n.d-inline {\\n  display: inline !important;\\n}\\n\\n.d-inline-block {\\n  display: inline-block !important;\\n}\\n\\n.d-block {\\n  display: block !important;\\n}\\n\\n.d-table {\\n  display: table !important;\\n}\\n\\n.d-table-row {\\n  display: table-row !important;\\n}\\n\\n.d-table-cell {\\n  display: table-cell !important;\\n}\\n\\n.d-flex {\\n  display: -ms-flexbox !important;\\n  display: flex !important;\\n}\\n\\n.d-inline-flex {\\n  display: -ms-inline-flexbox !important;\\n  display: inline-flex !important;\\n}\\n\\n@media (min-width: 576px) {\\n  .d-sm-none {\\n    display: none !important;\\n  }\\n  .d-sm-inline {\\n    display: inline !important;\\n  }\\n  .d-sm-inline-block {\\n    display: inline-block !important;\\n  }\\n  .d-sm-block {\\n    display: block !important;\\n  }\\n  .d-sm-table {\\n    display: table !important;\\n  }\\n  .d-sm-table-row {\\n    display: table-row !important;\\n  }\\n  .d-sm-table-cell {\\n    display: table-cell !important;\\n  }\\n  .d-sm-flex {\\n    display: -ms-flexbox !important;\\n    display: flex !important;\\n  }\\n  .d-sm-inline-flex {\\n    display: -ms-inline-flexbox !important;\\n    display: inline-flex !important;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .d-md-none {\\n    display: none !important;\\n  }\\n  .d-md-inline {\\n    display: inline !important;\\n  }\\n  .d-md-inline-block {\\n    display: inline-block !important;\\n  }\\n  .d-md-block {\\n    display: block !important;\\n  }\\n  .d-md-table {\\n    display: table !important;\\n  }\\n  .d-md-table-row {\\n    display: table-row !important;\\n  }\\n  .d-md-table-cell {\\n    display: table-cell !important;\\n  }\\n  .d-md-flex {\\n    display: -ms-flexbox !important;\\n    display: flex !important;\\n  }\\n  .d-md-inline-flex {\\n    display: -ms-inline-flexbox !important;\\n    display: inline-flex !important;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .d-lg-none {\\n    display: none !important;\\n  }\\n  .d-lg-inline {\\n    display: inline !important;\\n  }\\n  .d-lg-inline-block {\\n    display: inline-block !important;\\n  }\\n  .d-lg-block {\\n    display: block !important;\\n  }\\n  .d-lg-table {\\n    display: table !important;\\n  }\\n  .d-lg-table-row {\\n    display: table-row !important;\\n  }\\n  .d-lg-table-cell {\\n    display: table-cell !important;\\n  }\\n  .d-lg-flex {\\n    display: -ms-flexbox !important;\\n    display: flex !important;\\n  }\\n  .d-lg-inline-flex {\\n    display: -ms-inline-flexbox !important;\\n    display: inline-flex !important;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .d-xl-none {\\n    display: none !important;\\n  }\\n  .d-xl-inline {\\n    display: inline !important;\\n  }\\n  .d-xl-inline-block {\\n    display: inline-block !important;\\n  }\\n  .d-xl-block {\\n    display: block !important;\\n  }\\n  .d-xl-table {\\n    display: table !important;\\n  }\\n  .d-xl-table-row {\\n    display: table-row !important;\\n  }\\n  .d-xl-table-cell {\\n    display: table-cell !important;\\n  }\\n  .d-xl-flex {\\n    display: -ms-flexbox !important;\\n    display: flex !important;\\n  }\\n  .d-xl-inline-flex {\\n    display: -ms-inline-flexbox !important;\\n    display: inline-flex !important;\\n  }\\n}\\n\\n@media print {\\n  .d-print-none {\\n    display: none !important;\\n  }\\n  .d-print-inline {\\n    display: inline !important;\\n  }\\n  .d-print-inline-block {\\n    display: inline-block !important;\\n  }\\n  .d-print-block {\\n    display: block !important;\\n  }\\n  .d-print-table {\\n    display: table !important;\\n  }\\n  .d-print-table-row {\\n    display: table-row !important;\\n  }\\n  .d-print-table-cell {\\n    display: table-cell !important;\\n  }\\n  .d-print-flex {\\n    display: -ms-flexbox !important;\\n    display: flex !important;\\n  }\\n  .d-print-inline-flex {\\n    display: -ms-inline-flexbox !important;\\n    display: inline-flex !important;\\n  }\\n}\\n\\n.embed-responsive {\\n  position: relative;\\n  display: block;\\n  width: 100%;\\n  padding: 0;\\n  overflow: hidden;\\n}\\n\\n.embed-responsive::before {\\n  display: block;\\n  content: \\\"\\\";\\n}\\n\\n.embed-responsive .embed-responsive-item,\\n.embed-responsive iframe,\\n.embed-responsive embed,\\n.embed-responsive object,\\n.embed-responsive video {\\n  position: absolute;\\n  top: 0;\\n  bottom: 0;\\n  left: 0;\\n  width: 100%;\\n  height: 100%;\\n  border: 0;\\n}\\n\\n.embed-responsive-21by9::before {\\n  padding-top: 42.857143%;\\n}\\n\\n.embed-responsive-16by9::before {\\n  padding-top: 56.25%;\\n}\\n\\n.embed-responsive-4by3::before {\\n  padding-top: 75%;\\n}\\n\\n.embed-responsive-1by1::before {\\n  padding-top: 100%;\\n}\\n\\n.flex-row {\\n  -ms-flex-direction: row !important;\\n  flex-direction: row !important;\\n}\\n\\n.flex-column {\\n  -ms-flex-direction: column !important;\\n  flex-direction: column !important;\\n}\\n\\n.flex-row-reverse {\\n  -ms-flex-direction: row-reverse !important;\\n  flex-direction: row-reverse !important;\\n}\\n\\n.flex-column-reverse {\\n  -ms-flex-direction: column-reverse !important;\\n  flex-direction: column-reverse !important;\\n}\\n\\n.flex-wrap {\\n  -ms-flex-wrap: wrap !important;\\n  flex-wrap: wrap !important;\\n}\\n\\n.flex-nowrap {\\n  -ms-flex-wrap: nowrap !important;\\n  flex-wrap: nowrap !important;\\n}\\n\\n.flex-wrap-reverse {\\n  -ms-flex-wrap: wrap-reverse !important;\\n  flex-wrap: wrap-reverse !important;\\n}\\n\\n.flex-fill {\\n  -ms-flex: 1 1 auto !important;\\n  flex: 1 1 auto !important;\\n}\\n\\n.flex-grow-0 {\\n  -ms-flex-positive: 0 !important;\\n  flex-grow: 0 !important;\\n}\\n\\n.flex-grow-1 {\\n  -ms-flex-positive: 1 !important;\\n  flex-grow: 1 !important;\\n}\\n\\n.flex-shrink-0 {\\n  -ms-flex-negative: 0 !important;\\n  flex-shrink: 0 !important;\\n}\\n\\n.flex-shrink-1 {\\n  -ms-flex-negative: 1 !important;\\n  flex-shrink: 1 !important;\\n}\\n\\n.justify-content-start {\\n  -ms-flex-pack: start !important;\\n  justify-content: flex-start !important;\\n}\\n\\n.justify-content-end {\\n  -ms-flex-pack: end !important;\\n  justify-content: flex-end !important;\\n}\\n\\n.justify-content-center {\\n  -ms-flex-pack: center !important;\\n  justify-content: center !important;\\n}\\n\\n.justify-content-between {\\n  -ms-flex-pack: justify !important;\\n  justify-content: space-between !important;\\n}\\n\\n.justify-content-around {\\n  -ms-flex-pack: distribute !important;\\n  justify-content: space-around !important;\\n}\\n\\n.align-items-start {\\n  -ms-flex-align: start !important;\\n  align-items: flex-start !important;\\n}\\n\\n.align-items-end {\\n  -ms-flex-align: end !important;\\n  align-items: flex-end !important;\\n}\\n\\n.align-items-center {\\n  -ms-flex-align: center !important;\\n  align-items: center !important;\\n}\\n\\n.align-items-baseline {\\n  -ms-flex-align: baseline !important;\\n  align-items: baseline !important;\\n}\\n\\n.align-items-stretch {\\n  -ms-flex-align: stretch !important;\\n  align-items: stretch !important;\\n}\\n\\n.align-content-start {\\n  -ms-flex-line-pack: start !important;\\n  align-content: flex-start !important;\\n}\\n\\n.align-content-end {\\n  -ms-flex-line-pack: end !important;\\n  align-content: flex-end !important;\\n}\\n\\n.align-content-center {\\n  -ms-flex-line-pack: center !important;\\n  align-content: center !important;\\n}\\n\\n.align-content-between {\\n  -ms-flex-line-pack: justify !important;\\n  align-content: space-between !important;\\n}\\n\\n.align-content-around {\\n  -ms-flex-line-pack: distribute !important;\\n  align-content: space-around !important;\\n}\\n\\n.align-content-stretch {\\n  -ms-flex-line-pack: stretch !important;\\n  align-content: stretch !important;\\n}\\n\\n.align-self-auto {\\n  -ms-flex-item-align: auto !important;\\n  align-self: auto !important;\\n}\\n\\n.align-self-start {\\n  -ms-flex-item-align: start !important;\\n  align-self: flex-start !important;\\n}\\n\\n.align-self-end {\\n  -ms-flex-item-align: end !important;\\n  align-self: flex-end !important;\\n}\\n\\n.align-self-center {\\n  -ms-flex-item-align: center !important;\\n  align-self: center !important;\\n}\\n\\n.align-self-baseline {\\n  -ms-flex-item-align: baseline !important;\\n  align-self: baseline !important;\\n}\\n\\n.align-self-stretch {\\n  -ms-flex-item-align: stretch !important;\\n  align-self: stretch !important;\\n}\\n\\n@media (min-width: 576px) {\\n  .flex-sm-row {\\n    -ms-flex-direction: row !important;\\n    flex-direction: row !important;\\n  }\\n  .flex-sm-column {\\n    -ms-flex-direction: column !important;\\n    flex-direction: column !important;\\n  }\\n  .flex-sm-row-reverse {\\n    -ms-flex-direction: row-reverse !important;\\n    flex-direction: row-reverse !important;\\n  }\\n  .flex-sm-column-reverse {\\n    -ms-flex-direction: column-reverse !important;\\n    flex-direction: column-reverse !important;\\n  }\\n  .flex-sm-wrap {\\n    -ms-flex-wrap: wrap !important;\\n    flex-wrap: wrap !important;\\n  }\\n  .flex-sm-nowrap {\\n    -ms-flex-wrap: nowrap !important;\\n    flex-wrap: nowrap !important;\\n  }\\n  .flex-sm-wrap-reverse {\\n    -ms-flex-wrap: wrap-reverse !important;\\n    flex-wrap: wrap-reverse !important;\\n  }\\n  .flex-sm-fill {\\n    -ms-flex: 1 1 auto !important;\\n    flex: 1 1 auto !important;\\n  }\\n  .flex-sm-grow-0 {\\n    -ms-flex-positive: 0 !important;\\n    flex-grow: 0 !important;\\n  }\\n  .flex-sm-grow-1 {\\n    -ms-flex-positive: 1 !important;\\n    flex-grow: 1 !important;\\n  }\\n  .flex-sm-shrink-0 {\\n    -ms-flex-negative: 0 !important;\\n    flex-shrink: 0 !important;\\n  }\\n  .flex-sm-shrink-1 {\\n    -ms-flex-negative: 1 !important;\\n    flex-shrink: 1 !important;\\n  }\\n  .justify-content-sm-start {\\n    -ms-flex-pack: start !important;\\n    justify-content: flex-start !important;\\n  }\\n  .justify-content-sm-end {\\n    -ms-flex-pack: end !important;\\n    justify-content: flex-end !important;\\n  }\\n  .justify-content-sm-center {\\n    -ms-flex-pack: center !important;\\n    justify-content: center !important;\\n  }\\n  .justify-content-sm-between {\\n    -ms-flex-pack: justify !important;\\n    justify-content: space-between !important;\\n  }\\n  .justify-content-sm-around {\\n    -ms-flex-pack: distribute !important;\\n    justify-content: space-around !important;\\n  }\\n  .align-items-sm-start {\\n    -ms-flex-align: start !important;\\n    align-items: flex-start !important;\\n  }\\n  .align-items-sm-end {\\n    -ms-flex-align: end !important;\\n    align-items: flex-end !important;\\n  }\\n  .align-items-sm-center {\\n    -ms-flex-align: center !important;\\n    align-items: center !important;\\n  }\\n  .align-items-sm-baseline {\\n    -ms-flex-align: baseline !important;\\n    align-items: baseline !important;\\n  }\\n  .align-items-sm-stretch {\\n    -ms-flex-align: stretch !important;\\n    align-items: stretch !important;\\n  }\\n  .align-content-sm-start {\\n    -ms-flex-line-pack: start !important;\\n    align-content: flex-start !important;\\n  }\\n  .align-content-sm-end {\\n    -ms-flex-line-pack: end !important;\\n    align-content: flex-end !important;\\n  }\\n  .align-content-sm-center {\\n    -ms-flex-line-pack: center !important;\\n    align-content: center !important;\\n  }\\n  .align-content-sm-between {\\n    -ms-flex-line-pack: justify !important;\\n    align-content: space-between !important;\\n  }\\n  .align-content-sm-around {\\n    -ms-flex-line-pack: distribute !important;\\n    align-content: space-around !important;\\n  }\\n  .align-content-sm-stretch {\\n    -ms-flex-line-pack: stretch !important;\\n    align-content: stretch !important;\\n  }\\n  .align-self-sm-auto {\\n    -ms-flex-item-align: auto !important;\\n    align-self: auto !important;\\n  }\\n  .align-self-sm-start {\\n    -ms-flex-item-align: start !important;\\n    align-self: flex-start !important;\\n  }\\n  .align-self-sm-end {\\n    -ms-flex-item-align: end !important;\\n    align-self: flex-end !important;\\n  }\\n  .align-self-sm-center {\\n    -ms-flex-item-align: center !important;\\n    align-self: center !important;\\n  }\\n  .align-self-sm-baseline {\\n    -ms-flex-item-align: baseline !important;\\n    align-self: baseline !important;\\n  }\\n  .align-self-sm-stretch {\\n    -ms-flex-item-align: stretch !important;\\n    align-self: stretch !important;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .flex-md-row {\\n    -ms-flex-direction: row !important;\\n    flex-direction: row !important;\\n  }\\n  .flex-md-column {\\n    -ms-flex-direction: column !important;\\n    flex-direction: column !important;\\n  }\\n  .flex-md-row-reverse {\\n    -ms-flex-direction: row-reverse !important;\\n    flex-direction: row-reverse !important;\\n  }\\n  .flex-md-column-reverse {\\n    -ms-flex-direction: column-reverse !important;\\n    flex-direction: column-reverse !important;\\n  }\\n  .flex-md-wrap {\\n    -ms-flex-wrap: wrap !important;\\n    flex-wrap: wrap !important;\\n  }\\n  .flex-md-nowrap {\\n    -ms-flex-wrap: nowrap !important;\\n    flex-wrap: nowrap !important;\\n  }\\n  .flex-md-wrap-reverse {\\n    -ms-flex-wrap: wrap-reverse !important;\\n    flex-wrap: wrap-reverse !important;\\n  }\\n  .flex-md-fill {\\n    -ms-flex: 1 1 auto !important;\\n    flex: 1 1 auto !important;\\n  }\\n  .flex-md-grow-0 {\\n    -ms-flex-positive: 0 !important;\\n    flex-grow: 0 !important;\\n  }\\n  .flex-md-grow-1 {\\n    -ms-flex-positive: 1 !important;\\n    flex-grow: 1 !important;\\n  }\\n  .flex-md-shrink-0 {\\n    -ms-flex-negative: 0 !important;\\n    flex-shrink: 0 !important;\\n  }\\n  .flex-md-shrink-1 {\\n    -ms-flex-negative: 1 !important;\\n    flex-shrink: 1 !important;\\n  }\\n  .justify-content-md-start {\\n    -ms-flex-pack: start !important;\\n    justify-content: flex-start !important;\\n  }\\n  .justify-content-md-end {\\n    -ms-flex-pack: end !important;\\n    justify-content: flex-end !important;\\n  }\\n  .justify-content-md-center {\\n    -ms-flex-pack: center !important;\\n    justify-content: center !important;\\n  }\\n  .justify-content-md-between {\\n    -ms-flex-pack: justify !important;\\n    justify-content: space-between !important;\\n  }\\n  .justify-content-md-around {\\n    -ms-flex-pack: distribute !important;\\n    justify-content: space-around !important;\\n  }\\n  .align-items-md-start {\\n    -ms-flex-align: start !important;\\n    align-items: flex-start !important;\\n  }\\n  .align-items-md-end {\\n    -ms-flex-align: end !important;\\n    align-items: flex-end !important;\\n  }\\n  .align-items-md-center {\\n    -ms-flex-align: center !important;\\n    align-items: center !important;\\n  }\\n  .align-items-md-baseline {\\n    -ms-flex-align: baseline !important;\\n    align-items: baseline !important;\\n  }\\n  .align-items-md-stretch {\\n    -ms-flex-align: stretch !important;\\n    align-items: stretch !important;\\n  }\\n  .align-content-md-start {\\n    -ms-flex-line-pack: start !important;\\n    align-content: flex-start !important;\\n  }\\n  .align-content-md-end {\\n    -ms-flex-line-pack: end !important;\\n    align-content: flex-end !important;\\n  }\\n  .align-content-md-center {\\n    -ms-flex-line-pack: center !important;\\n    align-content: center !important;\\n  }\\n  .align-content-md-between {\\n    -ms-flex-line-pack: justify !important;\\n    align-content: space-between !important;\\n  }\\n  .align-content-md-around {\\n    -ms-flex-line-pack: distribute !important;\\n    align-content: space-around !important;\\n  }\\n  .align-content-md-stretch {\\n    -ms-flex-line-pack: stretch !important;\\n    align-content: stretch !important;\\n  }\\n  .align-self-md-auto {\\n    -ms-flex-item-align: auto !important;\\n    align-self: auto !important;\\n  }\\n  .align-self-md-start {\\n    -ms-flex-item-align: start !important;\\n    align-self: flex-start !important;\\n  }\\n  .align-self-md-end {\\n    -ms-flex-item-align: end !important;\\n    align-self: flex-end !important;\\n  }\\n  .align-self-md-center {\\n    -ms-flex-item-align: center !important;\\n    align-self: center !important;\\n  }\\n  .align-self-md-baseline {\\n    -ms-flex-item-align: baseline !important;\\n    align-self: baseline !important;\\n  }\\n  .align-self-md-stretch {\\n    -ms-flex-item-align: stretch !important;\\n    align-self: stretch !important;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .flex-lg-row {\\n    -ms-flex-direction: row !important;\\n    flex-direction: row !important;\\n  }\\n  .flex-lg-column {\\n    -ms-flex-direction: column !important;\\n    flex-direction: column !important;\\n  }\\n  .flex-lg-row-reverse {\\n    -ms-flex-direction: row-reverse !important;\\n    flex-direction: row-reverse !important;\\n  }\\n  .flex-lg-column-reverse {\\n    -ms-flex-direction: column-reverse !important;\\n    flex-direction: column-reverse !important;\\n  }\\n  .flex-lg-wrap {\\n    -ms-flex-wrap: wrap !important;\\n    flex-wrap: wrap !important;\\n  }\\n  .flex-lg-nowrap {\\n    -ms-flex-wrap: nowrap !important;\\n    flex-wrap: nowrap !important;\\n  }\\n  .flex-lg-wrap-reverse {\\n    -ms-flex-wrap: wrap-reverse !important;\\n    flex-wrap: wrap-reverse !important;\\n  }\\n  .flex-lg-fill {\\n    -ms-flex: 1 1 auto !important;\\n    flex: 1 1 auto !important;\\n  }\\n  .flex-lg-grow-0 {\\n    -ms-flex-positive: 0 !important;\\n    flex-grow: 0 !important;\\n  }\\n  .flex-lg-grow-1 {\\n    -ms-flex-positive: 1 !important;\\n    flex-grow: 1 !important;\\n  }\\n  .flex-lg-shrink-0 {\\n    -ms-flex-negative: 0 !important;\\n    flex-shrink: 0 !important;\\n  }\\n  .flex-lg-shrink-1 {\\n    -ms-flex-negative: 1 !important;\\n    flex-shrink: 1 !important;\\n  }\\n  .justify-content-lg-start {\\n    -ms-flex-pack: start !important;\\n    justify-content: flex-start !important;\\n  }\\n  .justify-content-lg-end {\\n    -ms-flex-pack: end !important;\\n    justify-content: flex-end !important;\\n  }\\n  .justify-content-lg-center {\\n    -ms-flex-pack: center !important;\\n    justify-content: center !important;\\n  }\\n  .justify-content-lg-between {\\n    -ms-flex-pack: justify !important;\\n    justify-content: space-between !important;\\n  }\\n  .justify-content-lg-around {\\n    -ms-flex-pack: distribute !important;\\n    justify-content: space-around !important;\\n  }\\n  .align-items-lg-start {\\n    -ms-flex-align: start !important;\\n    align-items: flex-start !important;\\n  }\\n  .align-items-lg-end {\\n    -ms-flex-align: end !important;\\n    align-items: flex-end !important;\\n  }\\n  .align-items-lg-center {\\n    -ms-flex-align: center !important;\\n    align-items: center !important;\\n  }\\n  .align-items-lg-baseline {\\n    -ms-flex-align: baseline !important;\\n    align-items: baseline !important;\\n  }\\n  .align-items-lg-stretch {\\n    -ms-flex-align: stretch !important;\\n    align-items: stretch !important;\\n  }\\n  .align-content-lg-start {\\n    -ms-flex-line-pack: start !important;\\n    align-content: flex-start !important;\\n  }\\n  .align-content-lg-end {\\n    -ms-flex-line-pack: end !important;\\n    align-content: flex-end !important;\\n  }\\n  .align-content-lg-center {\\n    -ms-flex-line-pack: center !important;\\n    align-content: center !important;\\n  }\\n  .align-content-lg-between {\\n    -ms-flex-line-pack: justify !important;\\n    align-content: space-between !important;\\n  }\\n  .align-content-lg-around {\\n    -ms-flex-line-pack: distribute !important;\\n    align-content: space-around !important;\\n  }\\n  .align-content-lg-stretch {\\n    -ms-flex-line-pack: stretch !important;\\n    align-content: stretch !important;\\n  }\\n  .align-self-lg-auto {\\n    -ms-flex-item-align: auto !important;\\n    align-self: auto !important;\\n  }\\n  .align-self-lg-start {\\n    -ms-flex-item-align: start !important;\\n    align-self: flex-start !important;\\n  }\\n  .align-self-lg-end {\\n    -ms-flex-item-align: end !important;\\n    align-self: flex-end !important;\\n  }\\n  .align-self-lg-center {\\n    -ms-flex-item-align: center !important;\\n    align-self: center !important;\\n  }\\n  .align-self-lg-baseline {\\n    -ms-flex-item-align: baseline !important;\\n    align-self: baseline !important;\\n  }\\n  .align-self-lg-stretch {\\n    -ms-flex-item-align: stretch !important;\\n    align-self: stretch !important;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .flex-xl-row {\\n    -ms-flex-direction: row !important;\\n    flex-direction: row !important;\\n  }\\n  .flex-xl-column {\\n    -ms-flex-direction: column !important;\\n    flex-direction: column !important;\\n  }\\n  .flex-xl-row-reverse {\\n    -ms-flex-direction: row-reverse !important;\\n    flex-direction: row-reverse !important;\\n  }\\n  .flex-xl-column-reverse {\\n    -ms-flex-direction: column-reverse !important;\\n    flex-direction: column-reverse !important;\\n  }\\n  .flex-xl-wrap {\\n    -ms-flex-wrap: wrap !important;\\n    flex-wrap: wrap !important;\\n  }\\n  .flex-xl-nowrap {\\n    -ms-flex-wrap: nowrap !important;\\n    flex-wrap: nowrap !important;\\n  }\\n  .flex-xl-wrap-reverse {\\n    -ms-flex-wrap: wrap-reverse !important;\\n    flex-wrap: wrap-reverse !important;\\n  }\\n  .flex-xl-fill {\\n    -ms-flex: 1 1 auto !important;\\n    flex: 1 1 auto !important;\\n  }\\n  .flex-xl-grow-0 {\\n    -ms-flex-positive: 0 !important;\\n    flex-grow: 0 !important;\\n  }\\n  .flex-xl-grow-1 {\\n    -ms-flex-positive: 1 !important;\\n    flex-grow: 1 !important;\\n  }\\n  .flex-xl-shrink-0 {\\n    -ms-flex-negative: 0 !important;\\n    flex-shrink: 0 !important;\\n  }\\n  .flex-xl-shrink-1 {\\n    -ms-flex-negative: 1 !important;\\n    flex-shrink: 1 !important;\\n  }\\n  .justify-content-xl-start {\\n    -ms-flex-pack: start !important;\\n    justify-content: flex-start !important;\\n  }\\n  .justify-content-xl-end {\\n    -ms-flex-pack: end !important;\\n    justify-content: flex-end !important;\\n  }\\n  .justify-content-xl-center {\\n    -ms-flex-pack: center !important;\\n    justify-content: center !important;\\n  }\\n  .justify-content-xl-between {\\n    -ms-flex-pack: justify !important;\\n    justify-content: space-between !important;\\n  }\\n  .justify-content-xl-around {\\n    -ms-flex-pack: distribute !important;\\n    justify-content: space-around !important;\\n  }\\n  .align-items-xl-start {\\n    -ms-flex-align: start !important;\\n    align-items: flex-start !important;\\n  }\\n  .align-items-xl-end {\\n    -ms-flex-align: end !important;\\n    align-items: flex-end !important;\\n  }\\n  .align-items-xl-center {\\n    -ms-flex-align: center !important;\\n    align-items: center !important;\\n  }\\n  .align-items-xl-baseline {\\n    -ms-flex-align: baseline !important;\\n    align-items: baseline !important;\\n  }\\n  .align-items-xl-stretch {\\n    -ms-flex-align: stretch !important;\\n    align-items: stretch !important;\\n  }\\n  .align-content-xl-start {\\n    -ms-flex-line-pack: start !important;\\n    align-content: flex-start !important;\\n  }\\n  .align-content-xl-end {\\n    -ms-flex-line-pack: end !important;\\n    align-content: flex-end !important;\\n  }\\n  .align-content-xl-center {\\n    -ms-flex-line-pack: center !important;\\n    align-content: center !important;\\n  }\\n  .align-content-xl-between {\\n    -ms-flex-line-pack: justify !important;\\n    align-content: space-between !important;\\n  }\\n  .align-content-xl-around {\\n    -ms-flex-line-pack: distribute !important;\\n    align-content: space-around !important;\\n  }\\n  .align-content-xl-stretch {\\n    -ms-flex-line-pack: stretch !important;\\n    align-content: stretch !important;\\n  }\\n  .align-self-xl-auto {\\n    -ms-flex-item-align: auto !important;\\n    align-self: auto !important;\\n  }\\n  .align-self-xl-start {\\n    -ms-flex-item-align: start !important;\\n    align-self: flex-start !important;\\n  }\\n  .align-self-xl-end {\\n    -ms-flex-item-align: end !important;\\n    align-self: flex-end !important;\\n  }\\n  .align-self-xl-center {\\n    -ms-flex-item-align: center !important;\\n    align-self: center !important;\\n  }\\n  .align-self-xl-baseline {\\n    -ms-flex-item-align: baseline !important;\\n    align-self: baseline !important;\\n  }\\n  .align-self-xl-stretch {\\n    -ms-flex-item-align: stretch !important;\\n    align-self: stretch !important;\\n  }\\n}\\n\\n.float-left {\\n  float: left !important;\\n}\\n\\n.float-right {\\n  float: right !important;\\n}\\n\\n.float-none {\\n  float: none !important;\\n}\\n\\n@media (min-width: 576px) {\\n  .float-sm-left {\\n    float: left !important;\\n  }\\n  .float-sm-right {\\n    float: right !important;\\n  }\\n  .float-sm-none {\\n    float: none !important;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .float-md-left {\\n    float: left !important;\\n  }\\n  .float-md-right {\\n    float: right !important;\\n  }\\n  .float-md-none {\\n    float: none !important;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .float-lg-left {\\n    float: left !important;\\n  }\\n  .float-lg-right {\\n    float: right !important;\\n  }\\n  .float-lg-none {\\n    float: none !important;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .float-xl-left {\\n    float: left !important;\\n  }\\n  .float-xl-right {\\n    float: right !important;\\n  }\\n  .float-xl-none {\\n    float: none !important;\\n  }\\n}\\n\\n.overflow-auto {\\n  overflow: auto !important;\\n}\\n\\n.overflow-hidden {\\n  overflow: hidden !important;\\n}\\n\\n.position-static {\\n  position: static !important;\\n}\\n\\n.position-relative {\\n  position: relative !important;\\n}\\n\\n.position-absolute {\\n  position: absolute !important;\\n}\\n\\n.position-fixed {\\n  position: fixed !important;\\n}\\n\\n.position-sticky {\\n  position: -webkit-sticky !important;\\n  position: sticky !important;\\n}\\n\\n.fixed-top {\\n  position: fixed;\\n  top: 0;\\n  right: 0;\\n  left: 0;\\n  z-index: 1030;\\n}\\n\\n.fixed-bottom {\\n  position: fixed;\\n  right: 0;\\n  bottom: 0;\\n  left: 0;\\n  z-index: 1030;\\n}\\n\\n@supports ((position: -webkit-sticky) or (position: sticky)) {\\n  .sticky-top {\\n    position: -webkit-sticky;\\n    position: sticky;\\n    top: 0;\\n    z-index: 1020;\\n  }\\n}\\n\\n.sr-only {\\n  position: absolute;\\n  width: 1px;\\n  height: 1px;\\n  padding: 0;\\n  overflow: hidden;\\n  clip: rect(0, 0, 0, 0);\\n  white-space: nowrap;\\n  border: 0;\\n}\\n\\n.sr-only-focusable:active, .sr-only-focusable:focus {\\n  position: static;\\n  width: auto;\\n  height: auto;\\n  overflow: visible;\\n  clip: auto;\\n  white-space: normal;\\n}\\n\\n.shadow-sm {\\n  box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\\n}\\n\\n.shadow {\\n  box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\\n}\\n\\n.shadow-lg {\\n  box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\\n}\\n\\n.shadow-none {\\n  box-shadow: none !important;\\n}\\n\\n.w-25 {\\n  width: 25% !important;\\n}\\n\\n.w-50 {\\n  width: 50% !important;\\n}\\n\\n.w-75 {\\n  width: 75% !important;\\n}\\n\\n.w-100 {\\n  width: 100% !important;\\n}\\n\\n.w-auto {\\n  width: auto !important;\\n}\\n\\n.h-25 {\\n  height: 25% !important;\\n}\\n\\n.h-50 {\\n  height: 50% !important;\\n}\\n\\n.h-75 {\\n  height: 75% !important;\\n}\\n\\n.h-100 {\\n  height: 100% !important;\\n}\\n\\n.h-auto {\\n  height: auto !important;\\n}\\n\\n.mw-100 {\\n  max-width: 100% !important;\\n}\\n\\n.mh-100 {\\n  max-height: 100% !important;\\n}\\n\\n.min-vw-100 {\\n  min-width: 100vw !important;\\n}\\n\\n.min-vh-100 {\\n  min-height: 100vh !important;\\n}\\n\\n.vw-100 {\\n  width: 100vw !important;\\n}\\n\\n.vh-100 {\\n  height: 100vh !important;\\n}\\n\\n.stretched-link::after {\\n  position: absolute;\\n  top: 0;\\n  right: 0;\\n  bottom: 0;\\n  left: 0;\\n  z-index: 1;\\n  pointer-events: auto;\\n  content: \\\"\\\";\\n  background-color: rgba(0, 0, 0, 0);\\n}\\n\\n.m-0 {\\n  margin: 0 !important;\\n}\\n\\n.mt-0,\\n.my-0 {\\n  margin-top: 0 !important;\\n}\\n\\n.mr-0,\\n.mx-0 {\\n  margin-right: 0 !important;\\n}\\n\\n.mb-0,\\n.my-0 {\\n  margin-bottom: 0 !important;\\n}\\n\\n.ml-0,\\n.mx-0 {\\n  margin-left: 0 !important;\\n}\\n\\n.m-1 {\\n  margin: 0.25rem !important;\\n}\\n\\n.mt-1,\\n.my-1 {\\n  margin-top: 0.25rem !important;\\n}\\n\\n.mr-1,\\n.mx-1 {\\n  margin-right: 0.25rem !important;\\n}\\n\\n.mb-1,\\n.my-1 {\\n  margin-bottom: 0.25rem !important;\\n}\\n\\n.ml-1,\\n.mx-1 {\\n  margin-left: 0.25rem !important;\\n}\\n\\n.m-2 {\\n  margin: 0.5rem !important;\\n}\\n\\n.mt-2,\\n.my-2 {\\n  margin-top: 0.5rem !important;\\n}\\n\\n.mr-2,\\n.mx-2 {\\n  margin-right: 0.5rem !important;\\n}\\n\\n.mb-2,\\n.my-2 {\\n  margin-bottom: 0.5rem !important;\\n}\\n\\n.ml-2,\\n.mx-2 {\\n  margin-left: 0.5rem !important;\\n}\\n\\n.m-3 {\\n  margin: 1rem !important;\\n}\\n\\n.mt-3,\\n.my-3 {\\n  margin-top: 1rem !important;\\n}\\n\\n.mr-3,\\n.mx-3 {\\n  margin-right: 1rem !important;\\n}\\n\\n.mb-3,\\n.my-3 {\\n  margin-bottom: 1rem !important;\\n}\\n\\n.ml-3,\\n.mx-3 {\\n  margin-left: 1rem !important;\\n}\\n\\n.m-4 {\\n  margin: 1.5rem !important;\\n}\\n\\n.mt-4,\\n.my-4 {\\n  margin-top: 1.5rem !important;\\n}\\n\\n.mr-4,\\n.mx-4 {\\n  margin-right: 1.5rem !important;\\n}\\n\\n.mb-4,\\n.my-4 {\\n  margin-bottom: 1.5rem !important;\\n}\\n\\n.ml-4,\\n.mx-4 {\\n  margin-left: 1.5rem !important;\\n}\\n\\n.m-5 {\\n  margin: 3rem !important;\\n}\\n\\n.mt-5,\\n.my-5 {\\n  margin-top: 3rem !important;\\n}\\n\\n.mr-5,\\n.mx-5 {\\n  margin-right: 3rem !important;\\n}\\n\\n.mb-5,\\n.my-5 {\\n  margin-bottom: 3rem !important;\\n}\\n\\n.ml-5,\\n.mx-5 {\\n  margin-left: 3rem !important;\\n}\\n\\n.p-0 {\\n  padding: 0 !important;\\n}\\n\\n.pt-0,\\n.py-0 {\\n  padding-top: 0 !important;\\n}\\n\\n.pr-0,\\n.px-0 {\\n  padding-right: 0 !important;\\n}\\n\\n.pb-0,\\n.py-0 {\\n  padding-bottom: 0 !important;\\n}\\n\\n.pl-0,\\n.px-0 {\\n  padding-left: 0 !important;\\n}\\n\\n.p-1 {\\n  padding: 0.25rem !important;\\n}\\n\\n.pt-1,\\n.py-1 {\\n  padding-top: 0.25rem !important;\\n}\\n\\n.pr-1,\\n.px-1 {\\n  padding-right: 0.25rem !important;\\n}\\n\\n.pb-1,\\n.py-1 {\\n  padding-bottom: 0.25rem !important;\\n}\\n\\n.pl-1,\\n.px-1 {\\n  padding-left: 0.25rem !important;\\n}\\n\\n.p-2 {\\n  padding: 0.5rem !important;\\n}\\n\\n.pt-2,\\n.py-2 {\\n  padding-top: 0.5rem !important;\\n}\\n\\n.pr-2,\\n.px-2 {\\n  padding-right: 0.5rem !important;\\n}\\n\\n.pb-2,\\n.py-2 {\\n  padding-bottom: 0.5rem !important;\\n}\\n\\n.pl-2,\\n.px-2 {\\n  padding-left: 0.5rem !important;\\n}\\n\\n.p-3 {\\n  padding: 1rem !important;\\n}\\n\\n.pt-3,\\n.py-3 {\\n  padding-top: 1rem !important;\\n}\\n\\n.pr-3,\\n.px-3 {\\n  padding-right: 1rem !important;\\n}\\n\\n.pb-3,\\n.py-3 {\\n  padding-bottom: 1rem !important;\\n}\\n\\n.pl-3,\\n.px-3 {\\n  padding-left: 1rem !important;\\n}\\n\\n.p-4 {\\n  padding: 1.5rem !important;\\n}\\n\\n.pt-4,\\n.py-4 {\\n  padding-top: 1.5rem !important;\\n}\\n\\n.pr-4,\\n.px-4 {\\n  padding-right: 1.5rem !important;\\n}\\n\\n.pb-4,\\n.py-4 {\\n  padding-bottom: 1.5rem !important;\\n}\\n\\n.pl-4,\\n.px-4 {\\n  padding-left: 1.5rem !important;\\n}\\n\\n.p-5 {\\n  padding: 3rem !important;\\n}\\n\\n.pt-5,\\n.py-5 {\\n  padding-top: 3rem !important;\\n}\\n\\n.pr-5,\\n.px-5 {\\n  padding-right: 3rem !important;\\n}\\n\\n.pb-5,\\n.py-5 {\\n  padding-bottom: 3rem !important;\\n}\\n\\n.pl-5,\\n.px-5 {\\n  padding-left: 3rem !important;\\n}\\n\\n.m-n1 {\\n  margin: -0.25rem !important;\\n}\\n\\n.mt-n1,\\n.my-n1 {\\n  margin-top: -0.25rem !important;\\n}\\n\\n.mr-n1,\\n.mx-n1 {\\n  margin-right: -0.25rem !important;\\n}\\n\\n.mb-n1,\\n.my-n1 {\\n  margin-bottom: -0.25rem !important;\\n}\\n\\n.ml-n1,\\n.mx-n1 {\\n  margin-left: -0.25rem !important;\\n}\\n\\n.m-n2 {\\n  margin: -0.5rem !important;\\n}\\n\\n.mt-n2,\\n.my-n2 {\\n  margin-top: -0.5rem !important;\\n}\\n\\n.mr-n2,\\n.mx-n2 {\\n  margin-right: -0.5rem !important;\\n}\\n\\n.mb-n2,\\n.my-n2 {\\n  margin-bottom: -0.5rem !important;\\n}\\n\\n.ml-n2,\\n.mx-n2 {\\n  margin-left: -0.5rem !important;\\n}\\n\\n.m-n3 {\\n  margin: -1rem !important;\\n}\\n\\n.mt-n3,\\n.my-n3 {\\n  margin-top: -1rem !important;\\n}\\n\\n.mr-n3,\\n.mx-n3 {\\n  margin-right: -1rem !important;\\n}\\n\\n.mb-n3,\\n.my-n3 {\\n  margin-bottom: -1rem !important;\\n}\\n\\n.ml-n3,\\n.mx-n3 {\\n  margin-left: -1rem !important;\\n}\\n\\n.m-n4 {\\n  margin: -1.5rem !important;\\n}\\n\\n.mt-n4,\\n.my-n4 {\\n  margin-top: -1.5rem !important;\\n}\\n\\n.mr-n4,\\n.mx-n4 {\\n  margin-right: -1.5rem !important;\\n}\\n\\n.mb-n4,\\n.my-n4 {\\n  margin-bottom: -1.5rem !important;\\n}\\n\\n.ml-n4,\\n.mx-n4 {\\n  margin-left: -1.5rem !important;\\n}\\n\\n.m-n5 {\\n  margin: -3rem !important;\\n}\\n\\n.mt-n5,\\n.my-n5 {\\n  margin-top: -3rem !important;\\n}\\n\\n.mr-n5,\\n.mx-n5 {\\n  margin-right: -3rem !important;\\n}\\n\\n.mb-n5,\\n.my-n5 {\\n  margin-bottom: -3rem !important;\\n}\\n\\n.ml-n5,\\n.mx-n5 {\\n  margin-left: -3rem !important;\\n}\\n\\n.m-auto {\\n  margin: auto !important;\\n}\\n\\n.mt-auto,\\n.my-auto {\\n  margin-top: auto !important;\\n}\\n\\n.mr-auto,\\n.mx-auto {\\n  margin-right: auto !important;\\n}\\n\\n.mb-auto,\\n.my-auto {\\n  margin-bottom: auto !important;\\n}\\n\\n.ml-auto,\\n.mx-auto {\\n  margin-left: auto !important;\\n}\\n\\n@media (min-width: 576px) {\\n  .m-sm-0 {\\n    margin: 0 !important;\\n  }\\n  .mt-sm-0,\\n  .my-sm-0 {\\n    margin-top: 0 !important;\\n  }\\n  .mr-sm-0,\\n  .mx-sm-0 {\\n    margin-right: 0 !important;\\n  }\\n  .mb-sm-0,\\n  .my-sm-0 {\\n    margin-bottom: 0 !important;\\n  }\\n  .ml-sm-0,\\n  .mx-sm-0 {\\n    margin-left: 0 !important;\\n  }\\n  .m-sm-1 {\\n    margin: 0.25rem !important;\\n  }\\n  .mt-sm-1,\\n  .my-sm-1 {\\n    margin-top: 0.25rem !important;\\n  }\\n  .mr-sm-1,\\n  .mx-sm-1 {\\n    margin-right: 0.25rem !important;\\n  }\\n  .mb-sm-1,\\n  .my-sm-1 {\\n    margin-bottom: 0.25rem !important;\\n  }\\n  .ml-sm-1,\\n  .mx-sm-1 {\\n    margin-left: 0.25rem !important;\\n  }\\n  .m-sm-2 {\\n    margin: 0.5rem !important;\\n  }\\n  .mt-sm-2,\\n  .my-sm-2 {\\n    margin-top: 0.5rem !important;\\n  }\\n  .mr-sm-2,\\n  .mx-sm-2 {\\n    margin-right: 0.5rem !important;\\n  }\\n  .mb-sm-2,\\n  .my-sm-2 {\\n    margin-bottom: 0.5rem !important;\\n  }\\n  .ml-sm-2,\\n  .mx-sm-2 {\\n    margin-left: 0.5rem !important;\\n  }\\n  .m-sm-3 {\\n    margin: 1rem !important;\\n  }\\n  .mt-sm-3,\\n  .my-sm-3 {\\n    margin-top: 1rem !important;\\n  }\\n  .mr-sm-3,\\n  .mx-sm-3 {\\n    margin-right: 1rem !important;\\n  }\\n  .mb-sm-3,\\n  .my-sm-3 {\\n    margin-bottom: 1rem !important;\\n  }\\n  .ml-sm-3,\\n  .mx-sm-3 {\\n    margin-left: 1rem !important;\\n  }\\n  .m-sm-4 {\\n    margin: 1.5rem !important;\\n  }\\n  .mt-sm-4,\\n  .my-sm-4 {\\n    margin-top: 1.5rem !important;\\n  }\\n  .mr-sm-4,\\n  .mx-sm-4 {\\n    margin-right: 1.5rem !important;\\n  }\\n  .mb-sm-4,\\n  .my-sm-4 {\\n    margin-bottom: 1.5rem !important;\\n  }\\n  .ml-sm-4,\\n  .mx-sm-4 {\\n    margin-left: 1.5rem !important;\\n  }\\n  .m-sm-5 {\\n    margin: 3rem !important;\\n  }\\n  .mt-sm-5,\\n  .my-sm-5 {\\n    margin-top: 3rem !important;\\n  }\\n  .mr-sm-5,\\n  .mx-sm-5 {\\n    margin-right: 3rem !important;\\n  }\\n  .mb-sm-5,\\n  .my-sm-5 {\\n    margin-bottom: 3rem !important;\\n  }\\n  .ml-sm-5,\\n  .mx-sm-5 {\\n    margin-left: 3rem !important;\\n  }\\n  .p-sm-0 {\\n    padding: 0 !important;\\n  }\\n  .pt-sm-0,\\n  .py-sm-0 {\\n    padding-top: 0 !important;\\n  }\\n  .pr-sm-0,\\n  .px-sm-0 {\\n    padding-right: 0 !important;\\n  }\\n  .pb-sm-0,\\n  .py-sm-0 {\\n    padding-bottom: 0 !important;\\n  }\\n  .pl-sm-0,\\n  .px-sm-0 {\\n    padding-left: 0 !important;\\n  }\\n  .p-sm-1 {\\n    padding: 0.25rem !important;\\n  }\\n  .pt-sm-1,\\n  .py-sm-1 {\\n    padding-top: 0.25rem !important;\\n  }\\n  .pr-sm-1,\\n  .px-sm-1 {\\n    padding-right: 0.25rem !important;\\n  }\\n  .pb-sm-1,\\n  .py-sm-1 {\\n    padding-bottom: 0.25rem !important;\\n  }\\n  .pl-sm-1,\\n  .px-sm-1 {\\n    padding-left: 0.25rem !important;\\n  }\\n  .p-sm-2 {\\n    padding: 0.5rem !important;\\n  }\\n  .pt-sm-2,\\n  .py-sm-2 {\\n    padding-top: 0.5rem !important;\\n  }\\n  .pr-sm-2,\\n  .px-sm-2 {\\n    padding-right: 0.5rem !important;\\n  }\\n  .pb-sm-2,\\n  .py-sm-2 {\\n    padding-bottom: 0.5rem !important;\\n  }\\n  .pl-sm-2,\\n  .px-sm-2 {\\n    padding-left: 0.5rem !important;\\n  }\\n  .p-sm-3 {\\n    padding: 1rem !important;\\n  }\\n  .pt-sm-3,\\n  .py-sm-3 {\\n    padding-top: 1rem !important;\\n  }\\n  .pr-sm-3,\\n  .px-sm-3 {\\n    padding-right: 1rem !important;\\n  }\\n  .pb-sm-3,\\n  .py-sm-3 {\\n    padding-bottom: 1rem !important;\\n  }\\n  .pl-sm-3,\\n  .px-sm-3 {\\n    padding-left: 1rem !important;\\n  }\\n  .p-sm-4 {\\n    padding: 1.5rem !important;\\n  }\\n  .pt-sm-4,\\n  .py-sm-4 {\\n    padding-top: 1.5rem !important;\\n  }\\n  .pr-sm-4,\\n  .px-sm-4 {\\n    padding-right: 1.5rem !important;\\n  }\\n  .pb-sm-4,\\n  .py-sm-4 {\\n    padding-bottom: 1.5rem !important;\\n  }\\n  .pl-sm-4,\\n  .px-sm-4 {\\n    padding-left: 1.5rem !important;\\n  }\\n  .p-sm-5 {\\n    padding: 3rem !important;\\n  }\\n  .pt-sm-5,\\n  .py-sm-5 {\\n    padding-top: 3rem !important;\\n  }\\n  .pr-sm-5,\\n  .px-sm-5 {\\n    padding-right: 3rem !important;\\n  }\\n  .pb-sm-5,\\n  .py-sm-5 {\\n    padding-bottom: 3rem !important;\\n  }\\n  .pl-sm-5,\\n  .px-sm-5 {\\n    padding-left: 3rem !important;\\n  }\\n  .m-sm-n1 {\\n    margin: -0.25rem !important;\\n  }\\n  .mt-sm-n1,\\n  .my-sm-n1 {\\n    margin-top: -0.25rem !important;\\n  }\\n  .mr-sm-n1,\\n  .mx-sm-n1 {\\n    margin-right: -0.25rem !important;\\n  }\\n  .mb-sm-n1,\\n  .my-sm-n1 {\\n    margin-bottom: -0.25rem !important;\\n  }\\n  .ml-sm-n1,\\n  .mx-sm-n1 {\\n    margin-left: -0.25rem !important;\\n  }\\n  .m-sm-n2 {\\n    margin: -0.5rem !important;\\n  }\\n  .mt-sm-n2,\\n  .my-sm-n2 {\\n    margin-top: -0.5rem !important;\\n  }\\n  .mr-sm-n2,\\n  .mx-sm-n2 {\\n    margin-right: -0.5rem !important;\\n  }\\n  .mb-sm-n2,\\n  .my-sm-n2 {\\n    margin-bottom: -0.5rem !important;\\n  }\\n  .ml-sm-n2,\\n  .mx-sm-n2 {\\n    margin-left: -0.5rem !important;\\n  }\\n  .m-sm-n3 {\\n    margin: -1rem !important;\\n  }\\n  .mt-sm-n3,\\n  .my-sm-n3 {\\n    margin-top: -1rem !important;\\n  }\\n  .mr-sm-n3,\\n  .mx-sm-n3 {\\n    margin-right: -1rem !important;\\n  }\\n  .mb-sm-n3,\\n  .my-sm-n3 {\\n    margin-bottom: -1rem !important;\\n  }\\n  .ml-sm-n3,\\n  .mx-sm-n3 {\\n    margin-left: -1rem !important;\\n  }\\n  .m-sm-n4 {\\n    margin: -1.5rem !important;\\n  }\\n  .mt-sm-n4,\\n  .my-sm-n4 {\\n    margin-top: -1.5rem !important;\\n  }\\n  .mr-sm-n4,\\n  .mx-sm-n4 {\\n    margin-right: -1.5rem !important;\\n  }\\n  .mb-sm-n4,\\n  .my-sm-n4 {\\n    margin-bottom: -1.5rem !important;\\n  }\\n  .ml-sm-n4,\\n  .mx-sm-n4 {\\n    margin-left: -1.5rem !important;\\n  }\\n  .m-sm-n5 {\\n    margin: -3rem !important;\\n  }\\n  .mt-sm-n5,\\n  .my-sm-n5 {\\n    margin-top: -3rem !important;\\n  }\\n  .mr-sm-n5,\\n  .mx-sm-n5 {\\n    margin-right: -3rem !important;\\n  }\\n  .mb-sm-n5,\\n  .my-sm-n5 {\\n    margin-bottom: -3rem !important;\\n  }\\n  .ml-sm-n5,\\n  .mx-sm-n5 {\\n    margin-left: -3rem !important;\\n  }\\n  .m-sm-auto {\\n    margin: auto !important;\\n  }\\n  .mt-sm-auto,\\n  .my-sm-auto {\\n    margin-top: auto !important;\\n  }\\n  .mr-sm-auto,\\n  .mx-sm-auto {\\n    margin-right: auto !important;\\n  }\\n  .mb-sm-auto,\\n  .my-sm-auto {\\n    margin-bottom: auto !important;\\n  }\\n  .ml-sm-auto,\\n  .mx-sm-auto {\\n    margin-left: auto !important;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .m-md-0 {\\n    margin: 0 !important;\\n  }\\n  .mt-md-0,\\n  .my-md-0 {\\n    margin-top: 0 !important;\\n  }\\n  .mr-md-0,\\n  .mx-md-0 {\\n    margin-right: 0 !important;\\n  }\\n  .mb-md-0,\\n  .my-md-0 {\\n    margin-bottom: 0 !important;\\n  }\\n  .ml-md-0,\\n  .mx-md-0 {\\n    margin-left: 0 !important;\\n  }\\n  .m-md-1 {\\n    margin: 0.25rem !important;\\n  }\\n  .mt-md-1,\\n  .my-md-1 {\\n    margin-top: 0.25rem !important;\\n  }\\n  .mr-md-1,\\n  .mx-md-1 {\\n    margin-right: 0.25rem !important;\\n  }\\n  .mb-md-1,\\n  .my-md-1 {\\n    margin-bottom: 0.25rem !important;\\n  }\\n  .ml-md-1,\\n  .mx-md-1 {\\n    margin-left: 0.25rem !important;\\n  }\\n  .m-md-2 {\\n    margin: 0.5rem !important;\\n  }\\n  .mt-md-2,\\n  .my-md-2 {\\n    margin-top: 0.5rem !important;\\n  }\\n  .mr-md-2,\\n  .mx-md-2 {\\n    margin-right: 0.5rem !important;\\n  }\\n  .mb-md-2,\\n  .my-md-2 {\\n    margin-bottom: 0.5rem !important;\\n  }\\n  .ml-md-2,\\n  .mx-md-2 {\\n    margin-left: 0.5rem !important;\\n  }\\n  .m-md-3 {\\n    margin: 1rem !important;\\n  }\\n  .mt-md-3,\\n  .my-md-3 {\\n    margin-top: 1rem !important;\\n  }\\n  .mr-md-3,\\n  .mx-md-3 {\\n    margin-right: 1rem !important;\\n  }\\n  .mb-md-3,\\n  .my-md-3 {\\n    margin-bottom: 1rem !important;\\n  }\\n  .ml-md-3,\\n  .mx-md-3 {\\n    margin-left: 1rem !important;\\n  }\\n  .m-md-4 {\\n    margin: 1.5rem !important;\\n  }\\n  .mt-md-4,\\n  .my-md-4 {\\n    margin-top: 1.5rem !important;\\n  }\\n  .mr-md-4,\\n  .mx-md-4 {\\n    margin-right: 1.5rem !important;\\n  }\\n  .mb-md-4,\\n  .my-md-4 {\\n    margin-bottom: 1.5rem !important;\\n  }\\n  .ml-md-4,\\n  .mx-md-4 {\\n    margin-left: 1.5rem !important;\\n  }\\n  .m-md-5 {\\n    margin: 3rem !important;\\n  }\\n  .mt-md-5,\\n  .my-md-5 {\\n    margin-top: 3rem !important;\\n  }\\n  .mr-md-5,\\n  .mx-md-5 {\\n    margin-right: 3rem !important;\\n  }\\n  .mb-md-5,\\n  .my-md-5 {\\n    margin-bottom: 3rem !important;\\n  }\\n  .ml-md-5,\\n  .mx-md-5 {\\n    margin-left: 3rem !important;\\n  }\\n  .p-md-0 {\\n    padding: 0 !important;\\n  }\\n  .pt-md-0,\\n  .py-md-0 {\\n    padding-top: 0 !important;\\n  }\\n  .pr-md-0,\\n  .px-md-0 {\\n    padding-right: 0 !important;\\n  }\\n  .pb-md-0,\\n  .py-md-0 {\\n    padding-bottom: 0 !important;\\n  }\\n  .pl-md-0,\\n  .px-md-0 {\\n    padding-left: 0 !important;\\n  }\\n  .p-md-1 {\\n    padding: 0.25rem !important;\\n  }\\n  .pt-md-1,\\n  .py-md-1 {\\n    padding-top: 0.25rem !important;\\n  }\\n  .pr-md-1,\\n  .px-md-1 {\\n    padding-right: 0.25rem !important;\\n  }\\n  .pb-md-1,\\n  .py-md-1 {\\n    padding-bottom: 0.25rem !important;\\n  }\\n  .pl-md-1,\\n  .px-md-1 {\\n    padding-left: 0.25rem !important;\\n  }\\n  .p-md-2 {\\n    padding: 0.5rem !important;\\n  }\\n  .pt-md-2,\\n  .py-md-2 {\\n    padding-top: 0.5rem !important;\\n  }\\n  .pr-md-2,\\n  .px-md-2 {\\n    padding-right: 0.5rem !important;\\n  }\\n  .pb-md-2,\\n  .py-md-2 {\\n    padding-bottom: 0.5rem !important;\\n  }\\n  .pl-md-2,\\n  .px-md-2 {\\n    padding-left: 0.5rem !important;\\n  }\\n  .p-md-3 {\\n    padding: 1rem !important;\\n  }\\n  .pt-md-3,\\n  .py-md-3 {\\n    padding-top: 1rem !important;\\n  }\\n  .pr-md-3,\\n  .px-md-3 {\\n    padding-right: 1rem !important;\\n  }\\n  .pb-md-3,\\n  .py-md-3 {\\n    padding-bottom: 1rem !important;\\n  }\\n  .pl-md-3,\\n  .px-md-3 {\\n    padding-left: 1rem !important;\\n  }\\n  .p-md-4 {\\n    padding: 1.5rem !important;\\n  }\\n  .pt-md-4,\\n  .py-md-4 {\\n    padding-top: 1.5rem !important;\\n  }\\n  .pr-md-4,\\n  .px-md-4 {\\n    padding-right: 1.5rem !important;\\n  }\\n  .pb-md-4,\\n  .py-md-4 {\\n    padding-bottom: 1.5rem !important;\\n  }\\n  .pl-md-4,\\n  .px-md-4 {\\n    padding-left: 1.5rem !important;\\n  }\\n  .p-md-5 {\\n    padding: 3rem !important;\\n  }\\n  .pt-md-5,\\n  .py-md-5 {\\n    padding-top: 3rem !important;\\n  }\\n  .pr-md-5,\\n  .px-md-5 {\\n    padding-right: 3rem !important;\\n  }\\n  .pb-md-5,\\n  .py-md-5 {\\n    padding-bottom: 3rem !important;\\n  }\\n  .pl-md-5,\\n  .px-md-5 {\\n    padding-left: 3rem !important;\\n  }\\n  .m-md-n1 {\\n    margin: -0.25rem !important;\\n  }\\n  .mt-md-n1,\\n  .my-md-n1 {\\n    margin-top: -0.25rem !important;\\n  }\\n  .mr-md-n1,\\n  .mx-md-n1 {\\n    margin-right: -0.25rem !important;\\n  }\\n  .mb-md-n1,\\n  .my-md-n1 {\\n    margin-bottom: -0.25rem !important;\\n  }\\n  .ml-md-n1,\\n  .mx-md-n1 {\\n    margin-left: -0.25rem !important;\\n  }\\n  .m-md-n2 {\\n    margin: -0.5rem !important;\\n  }\\n  .mt-md-n2,\\n  .my-md-n2 {\\n    margin-top: -0.5rem !important;\\n  }\\n  .mr-md-n2,\\n  .mx-md-n2 {\\n    margin-right: -0.5rem !important;\\n  }\\n  .mb-md-n2,\\n  .my-md-n2 {\\n    margin-bottom: -0.5rem !important;\\n  }\\n  .ml-md-n2,\\n  .mx-md-n2 {\\n    margin-left: -0.5rem !important;\\n  }\\n  .m-md-n3 {\\n    margin: -1rem !important;\\n  }\\n  .mt-md-n3,\\n  .my-md-n3 {\\n    margin-top: -1rem !important;\\n  }\\n  .mr-md-n3,\\n  .mx-md-n3 {\\n    margin-right: -1rem !important;\\n  }\\n  .mb-md-n3,\\n  .my-md-n3 {\\n    margin-bottom: -1rem !important;\\n  }\\n  .ml-md-n3,\\n  .mx-md-n3 {\\n    margin-left: -1rem !important;\\n  }\\n  .m-md-n4 {\\n    margin: -1.5rem !important;\\n  }\\n  .mt-md-n4,\\n  .my-md-n4 {\\n    margin-top: -1.5rem !important;\\n  }\\n  .mr-md-n4,\\n  .mx-md-n4 {\\n    margin-right: -1.5rem !important;\\n  }\\n  .mb-md-n4,\\n  .my-md-n4 {\\n    margin-bottom: -1.5rem !important;\\n  }\\n  .ml-md-n4,\\n  .mx-md-n4 {\\n    margin-left: -1.5rem !important;\\n  }\\n  .m-md-n5 {\\n    margin: -3rem !important;\\n  }\\n  .mt-md-n5,\\n  .my-md-n5 {\\n    margin-top: -3rem !important;\\n  }\\n  .mr-md-n5,\\n  .mx-md-n5 {\\n    margin-right: -3rem !important;\\n  }\\n  .mb-md-n5,\\n  .my-md-n5 {\\n    margin-bottom: -3rem !important;\\n  }\\n  .ml-md-n5,\\n  .mx-md-n5 {\\n    margin-left: -3rem !important;\\n  }\\n  .m-md-auto {\\n    margin: auto !important;\\n  }\\n  .mt-md-auto,\\n  .my-md-auto {\\n    margin-top: auto !important;\\n  }\\n  .mr-md-auto,\\n  .mx-md-auto {\\n    margin-right: auto !important;\\n  }\\n  .mb-md-auto,\\n  .my-md-auto {\\n    margin-bottom: auto !important;\\n  }\\n  .ml-md-auto,\\n  .mx-md-auto {\\n    margin-left: auto !important;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .m-lg-0 {\\n    margin: 0 !important;\\n  }\\n  .mt-lg-0,\\n  .my-lg-0 {\\n    margin-top: 0 !important;\\n  }\\n  .mr-lg-0,\\n  .mx-lg-0 {\\n    margin-right: 0 !important;\\n  }\\n  .mb-lg-0,\\n  .my-lg-0 {\\n    margin-bottom: 0 !important;\\n  }\\n  .ml-lg-0,\\n  .mx-lg-0 {\\n    margin-left: 0 !important;\\n  }\\n  .m-lg-1 {\\n    margin: 0.25rem !important;\\n  }\\n  .mt-lg-1,\\n  .my-lg-1 {\\n    margin-top: 0.25rem !important;\\n  }\\n  .mr-lg-1,\\n  .mx-lg-1 {\\n    margin-right: 0.25rem !important;\\n  }\\n  .mb-lg-1,\\n  .my-lg-1 {\\n    margin-bottom: 0.25rem !important;\\n  }\\n  .ml-lg-1,\\n  .mx-lg-1 {\\n    margin-left: 0.25rem !important;\\n  }\\n  .m-lg-2 {\\n    margin: 0.5rem !important;\\n  }\\n  .mt-lg-2,\\n  .my-lg-2 {\\n    margin-top: 0.5rem !important;\\n  }\\n  .mr-lg-2,\\n  .mx-lg-2 {\\n    margin-right: 0.5rem !important;\\n  }\\n  .mb-lg-2,\\n  .my-lg-2 {\\n    margin-bottom: 0.5rem !important;\\n  }\\n  .ml-lg-2,\\n  .mx-lg-2 {\\n    margin-left: 0.5rem !important;\\n  }\\n  .m-lg-3 {\\n    margin: 1rem !important;\\n  }\\n  .mt-lg-3,\\n  .my-lg-3 {\\n    margin-top: 1rem !important;\\n  }\\n  .mr-lg-3,\\n  .mx-lg-3 {\\n    margin-right: 1rem !important;\\n  }\\n  .mb-lg-3,\\n  .my-lg-3 {\\n    margin-bottom: 1rem !important;\\n  }\\n  .ml-lg-3,\\n  .mx-lg-3 {\\n    margin-left: 1rem !important;\\n  }\\n  .m-lg-4 {\\n    margin: 1.5rem !important;\\n  }\\n  .mt-lg-4,\\n  .my-lg-4 {\\n    margin-top: 1.5rem !important;\\n  }\\n  .mr-lg-4,\\n  .mx-lg-4 {\\n    margin-right: 1.5rem !important;\\n  }\\n  .mb-lg-4,\\n  .my-lg-4 {\\n    margin-bottom: 1.5rem !important;\\n  }\\n  .ml-lg-4,\\n  .mx-lg-4 {\\n    margin-left: 1.5rem !important;\\n  }\\n  .m-lg-5 {\\n    margin: 3rem !important;\\n  }\\n  .mt-lg-5,\\n  .my-lg-5 {\\n    margin-top: 3rem !important;\\n  }\\n  .mr-lg-5,\\n  .mx-lg-5 {\\n    margin-right: 3rem !important;\\n  }\\n  .mb-lg-5,\\n  .my-lg-5 {\\n    margin-bottom: 3rem !important;\\n  }\\n  .ml-lg-5,\\n  .mx-lg-5 {\\n    margin-left: 3rem !important;\\n  }\\n  .p-lg-0 {\\n    padding: 0 !important;\\n  }\\n  .pt-lg-0,\\n  .py-lg-0 {\\n    padding-top: 0 !important;\\n  }\\n  .pr-lg-0,\\n  .px-lg-0 {\\n    padding-right: 0 !important;\\n  }\\n  .pb-lg-0,\\n  .py-lg-0 {\\n    padding-bottom: 0 !important;\\n  }\\n  .pl-lg-0,\\n  .px-lg-0 {\\n    padding-left: 0 !important;\\n  }\\n  .p-lg-1 {\\n    padding: 0.25rem !important;\\n  }\\n  .pt-lg-1,\\n  .py-lg-1 {\\n    padding-top: 0.25rem !important;\\n  }\\n  .pr-lg-1,\\n  .px-lg-1 {\\n    padding-right: 0.25rem !important;\\n  }\\n  .pb-lg-1,\\n  .py-lg-1 {\\n    padding-bottom: 0.25rem !important;\\n  }\\n  .pl-lg-1,\\n  .px-lg-1 {\\n    padding-left: 0.25rem !important;\\n  }\\n  .p-lg-2 {\\n    padding: 0.5rem !important;\\n  }\\n  .pt-lg-2,\\n  .py-lg-2 {\\n    padding-top: 0.5rem !important;\\n  }\\n  .pr-lg-2,\\n  .px-lg-2 {\\n    padding-right: 0.5rem !important;\\n  }\\n  .pb-lg-2,\\n  .py-lg-2 {\\n    padding-bottom: 0.5rem !important;\\n  }\\n  .pl-lg-2,\\n  .px-lg-2 {\\n    padding-left: 0.5rem !important;\\n  }\\n  .p-lg-3 {\\n    padding: 1rem !important;\\n  }\\n  .pt-lg-3,\\n  .py-lg-3 {\\n    padding-top: 1rem !important;\\n  }\\n  .pr-lg-3,\\n  .px-lg-3 {\\n    padding-right: 1rem !important;\\n  }\\n  .pb-lg-3,\\n  .py-lg-3 {\\n    padding-bottom: 1rem !important;\\n  }\\n  .pl-lg-3,\\n  .px-lg-3 {\\n    padding-left: 1rem !important;\\n  }\\n  .p-lg-4 {\\n    padding: 1.5rem !important;\\n  }\\n  .pt-lg-4,\\n  .py-lg-4 {\\n    padding-top: 1.5rem !important;\\n  }\\n  .pr-lg-4,\\n  .px-lg-4 {\\n    padding-right: 1.5rem !important;\\n  }\\n  .pb-lg-4,\\n  .py-lg-4 {\\n    padding-bottom: 1.5rem !important;\\n  }\\n  .pl-lg-4,\\n  .px-lg-4 {\\n    padding-left: 1.5rem !important;\\n  }\\n  .p-lg-5 {\\n    padding: 3rem !important;\\n  }\\n  .pt-lg-5,\\n  .py-lg-5 {\\n    padding-top: 3rem !important;\\n  }\\n  .pr-lg-5,\\n  .px-lg-5 {\\n    padding-right: 3rem !important;\\n  }\\n  .pb-lg-5,\\n  .py-lg-5 {\\n    padding-bottom: 3rem !important;\\n  }\\n  .pl-lg-5,\\n  .px-lg-5 {\\n    padding-left: 3rem !important;\\n  }\\n  .m-lg-n1 {\\n    margin: -0.25rem !important;\\n  }\\n  .mt-lg-n1,\\n  .my-lg-n1 {\\n    margin-top: -0.25rem !important;\\n  }\\n  .mr-lg-n1,\\n  .mx-lg-n1 {\\n    margin-right: -0.25rem !important;\\n  }\\n  .mb-lg-n1,\\n  .my-lg-n1 {\\n    margin-bottom: -0.25rem !important;\\n  }\\n  .ml-lg-n1,\\n  .mx-lg-n1 {\\n    margin-left: -0.25rem !important;\\n  }\\n  .m-lg-n2 {\\n    margin: -0.5rem !important;\\n  }\\n  .mt-lg-n2,\\n  .my-lg-n2 {\\n    margin-top: -0.5rem !important;\\n  }\\n  .mr-lg-n2,\\n  .mx-lg-n2 {\\n    margin-right: -0.5rem !important;\\n  }\\n  .mb-lg-n2,\\n  .my-lg-n2 {\\n    margin-bottom: -0.5rem !important;\\n  }\\n  .ml-lg-n2,\\n  .mx-lg-n2 {\\n    margin-left: -0.5rem !important;\\n  }\\n  .m-lg-n3 {\\n    margin: -1rem !important;\\n  }\\n  .mt-lg-n3,\\n  .my-lg-n3 {\\n    margin-top: -1rem !important;\\n  }\\n  .mr-lg-n3,\\n  .mx-lg-n3 {\\n    margin-right: -1rem !important;\\n  }\\n  .mb-lg-n3,\\n  .my-lg-n3 {\\n    margin-bottom: -1rem !important;\\n  }\\n  .ml-lg-n3,\\n  .mx-lg-n3 {\\n    margin-left: -1rem !important;\\n  }\\n  .m-lg-n4 {\\n    margin: -1.5rem !important;\\n  }\\n  .mt-lg-n4,\\n  .my-lg-n4 {\\n    margin-top: -1.5rem !important;\\n  }\\n  .mr-lg-n4,\\n  .mx-lg-n4 {\\n    margin-right: -1.5rem !important;\\n  }\\n  .mb-lg-n4,\\n  .my-lg-n4 {\\n    margin-bottom: -1.5rem !important;\\n  }\\n  .ml-lg-n4,\\n  .mx-lg-n4 {\\n    margin-left: -1.5rem !important;\\n  }\\n  .m-lg-n5 {\\n    margin: -3rem !important;\\n  }\\n  .mt-lg-n5,\\n  .my-lg-n5 {\\n    margin-top: -3rem !important;\\n  }\\n  .mr-lg-n5,\\n  .mx-lg-n5 {\\n    margin-right: -3rem !important;\\n  }\\n  .mb-lg-n5,\\n  .my-lg-n5 {\\n    margin-bottom: -3rem !important;\\n  }\\n  .ml-lg-n5,\\n  .mx-lg-n5 {\\n    margin-left: -3rem !important;\\n  }\\n  .m-lg-auto {\\n    margin: auto !important;\\n  }\\n  .mt-lg-auto,\\n  .my-lg-auto {\\n    margin-top: auto !important;\\n  }\\n  .mr-lg-auto,\\n  .mx-lg-auto {\\n    margin-right: auto !important;\\n  }\\n  .mb-lg-auto,\\n  .my-lg-auto {\\n    margin-bottom: auto !important;\\n  }\\n  .ml-lg-auto,\\n  .mx-lg-auto {\\n    margin-left: auto !important;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .m-xl-0 {\\n    margin: 0 !important;\\n  }\\n  .mt-xl-0,\\n  .my-xl-0 {\\n    margin-top: 0 !important;\\n  }\\n  .mr-xl-0,\\n  .mx-xl-0 {\\n    margin-right: 0 !important;\\n  }\\n  .mb-xl-0,\\n  .my-xl-0 {\\n    margin-bottom: 0 !important;\\n  }\\n  .ml-xl-0,\\n  .mx-xl-0 {\\n    margin-left: 0 !important;\\n  }\\n  .m-xl-1 {\\n    margin: 0.25rem !important;\\n  }\\n  .mt-xl-1,\\n  .my-xl-1 {\\n    margin-top: 0.25rem !important;\\n  }\\n  .mr-xl-1,\\n  .mx-xl-1 {\\n    margin-right: 0.25rem !important;\\n  }\\n  .mb-xl-1,\\n  .my-xl-1 {\\n    margin-bottom: 0.25rem !important;\\n  }\\n  .ml-xl-1,\\n  .mx-xl-1 {\\n    margin-left: 0.25rem !important;\\n  }\\n  .m-xl-2 {\\n    margin: 0.5rem !important;\\n  }\\n  .mt-xl-2,\\n  .my-xl-2 {\\n    margin-top: 0.5rem !important;\\n  }\\n  .mr-xl-2,\\n  .mx-xl-2 {\\n    margin-right: 0.5rem !important;\\n  }\\n  .mb-xl-2,\\n  .my-xl-2 {\\n    margin-bottom: 0.5rem !important;\\n  }\\n  .ml-xl-2,\\n  .mx-xl-2 {\\n    margin-left: 0.5rem !important;\\n  }\\n  .m-xl-3 {\\n    margin: 1rem !important;\\n  }\\n  .mt-xl-3,\\n  .my-xl-3 {\\n    margin-top: 1rem !important;\\n  }\\n  .mr-xl-3,\\n  .mx-xl-3 {\\n    margin-right: 1rem !important;\\n  }\\n  .mb-xl-3,\\n  .my-xl-3 {\\n    margin-bottom: 1rem !important;\\n  }\\n  .ml-xl-3,\\n  .mx-xl-3 {\\n    margin-left: 1rem !important;\\n  }\\n  .m-xl-4 {\\n    margin: 1.5rem !important;\\n  }\\n  .mt-xl-4,\\n  .my-xl-4 {\\n    margin-top: 1.5rem !important;\\n  }\\n  .mr-xl-4,\\n  .mx-xl-4 {\\n    margin-right: 1.5rem !important;\\n  }\\n  .mb-xl-4,\\n  .my-xl-4 {\\n    margin-bottom: 1.5rem !important;\\n  }\\n  .ml-xl-4,\\n  .mx-xl-4 {\\n    margin-left: 1.5rem !important;\\n  }\\n  .m-xl-5 {\\n    margin: 3rem !important;\\n  }\\n  .mt-xl-5,\\n  .my-xl-5 {\\n    margin-top: 3rem !important;\\n  }\\n  .mr-xl-5,\\n  .mx-xl-5 {\\n    margin-right: 3rem !important;\\n  }\\n  .mb-xl-5,\\n  .my-xl-5 {\\n    margin-bottom: 3rem !important;\\n  }\\n  .ml-xl-5,\\n  .mx-xl-5 {\\n    margin-left: 3rem !important;\\n  }\\n  .p-xl-0 {\\n    padding: 0 !important;\\n  }\\n  .pt-xl-0,\\n  .py-xl-0 {\\n    padding-top: 0 !important;\\n  }\\n  .pr-xl-0,\\n  .px-xl-0 {\\n    padding-right: 0 !important;\\n  }\\n  .pb-xl-0,\\n  .py-xl-0 {\\n    padding-bottom: 0 !important;\\n  }\\n  .pl-xl-0,\\n  .px-xl-0 {\\n    padding-left: 0 !important;\\n  }\\n  .p-xl-1 {\\n    padding: 0.25rem !important;\\n  }\\n  .pt-xl-1,\\n  .py-xl-1 {\\n    padding-top: 0.25rem !important;\\n  }\\n  .pr-xl-1,\\n  .px-xl-1 {\\n    padding-right: 0.25rem !important;\\n  }\\n  .pb-xl-1,\\n  .py-xl-1 {\\n    padding-bottom: 0.25rem !important;\\n  }\\n  .pl-xl-1,\\n  .px-xl-1 {\\n    padding-left: 0.25rem !important;\\n  }\\n  .p-xl-2 {\\n    padding: 0.5rem !important;\\n  }\\n  .pt-xl-2,\\n  .py-xl-2 {\\n    padding-top: 0.5rem !important;\\n  }\\n  .pr-xl-2,\\n  .px-xl-2 {\\n    padding-right: 0.5rem !important;\\n  }\\n  .pb-xl-2,\\n  .py-xl-2 {\\n    padding-bottom: 0.5rem !important;\\n  }\\n  .pl-xl-2,\\n  .px-xl-2 {\\n    padding-left: 0.5rem !important;\\n  }\\n  .p-xl-3 {\\n    padding: 1rem !important;\\n  }\\n  .pt-xl-3,\\n  .py-xl-3 {\\n    padding-top: 1rem !important;\\n  }\\n  .pr-xl-3,\\n  .px-xl-3 {\\n    padding-right: 1rem !important;\\n  }\\n  .pb-xl-3,\\n  .py-xl-3 {\\n    padding-bottom: 1rem !important;\\n  }\\n  .pl-xl-3,\\n  .px-xl-3 {\\n    padding-left: 1rem !important;\\n  }\\n  .p-xl-4 {\\n    padding: 1.5rem !important;\\n  }\\n  .pt-xl-4,\\n  .py-xl-4 {\\n    padding-top: 1.5rem !important;\\n  }\\n  .pr-xl-4,\\n  .px-xl-4 {\\n    padding-right: 1.5rem !important;\\n  }\\n  .pb-xl-4,\\n  .py-xl-4 {\\n    padding-bottom: 1.5rem !important;\\n  }\\n  .pl-xl-4,\\n  .px-xl-4 {\\n    padding-left: 1.5rem !important;\\n  }\\n  .p-xl-5 {\\n    padding: 3rem !important;\\n  }\\n  .pt-xl-5,\\n  .py-xl-5 {\\n    padding-top: 3rem !important;\\n  }\\n  .pr-xl-5,\\n  .px-xl-5 {\\n    padding-right: 3rem !important;\\n  }\\n  .pb-xl-5,\\n  .py-xl-5 {\\n    padding-bottom: 3rem !important;\\n  }\\n  .pl-xl-5,\\n  .px-xl-5 {\\n    padding-left: 3rem !important;\\n  }\\n  .m-xl-n1 {\\n    margin: -0.25rem !important;\\n  }\\n  .mt-xl-n1,\\n  .my-xl-n1 {\\n    margin-top: -0.25rem !important;\\n  }\\n  .mr-xl-n1,\\n  .mx-xl-n1 {\\n    margin-right: -0.25rem !important;\\n  }\\n  .mb-xl-n1,\\n  .my-xl-n1 {\\n    margin-bottom: -0.25rem !important;\\n  }\\n  .ml-xl-n1,\\n  .mx-xl-n1 {\\n    margin-left: -0.25rem !important;\\n  }\\n  .m-xl-n2 {\\n    margin: -0.5rem !important;\\n  }\\n  .mt-xl-n2,\\n  .my-xl-n2 {\\n    margin-top: -0.5rem !important;\\n  }\\n  .mr-xl-n2,\\n  .mx-xl-n2 {\\n    margin-right: -0.5rem !important;\\n  }\\n  .mb-xl-n2,\\n  .my-xl-n2 {\\n    margin-bottom: -0.5rem !important;\\n  }\\n  .ml-xl-n2,\\n  .mx-xl-n2 {\\n    margin-left: -0.5rem !important;\\n  }\\n  .m-xl-n3 {\\n    margin: -1rem !important;\\n  }\\n  .mt-xl-n3,\\n  .my-xl-n3 {\\n    margin-top: -1rem !important;\\n  }\\n  .mr-xl-n3,\\n  .mx-xl-n3 {\\n    margin-right: -1rem !important;\\n  }\\n  .mb-xl-n3,\\n  .my-xl-n3 {\\n    margin-bottom: -1rem !important;\\n  }\\n  .ml-xl-n3,\\n  .mx-xl-n3 {\\n    margin-left: -1rem !important;\\n  }\\n  .m-xl-n4 {\\n    margin: -1.5rem !important;\\n  }\\n  .mt-xl-n4,\\n  .my-xl-n4 {\\n    margin-top: -1.5rem !important;\\n  }\\n  .mr-xl-n4,\\n  .mx-xl-n4 {\\n    margin-right: -1.5rem !important;\\n  }\\n  .mb-xl-n4,\\n  .my-xl-n4 {\\n    margin-bottom: -1.5rem !important;\\n  }\\n  .ml-xl-n4,\\n  .mx-xl-n4 {\\n    margin-left: -1.5rem !important;\\n  }\\n  .m-xl-n5 {\\n    margin: -3rem !important;\\n  }\\n  .mt-xl-n5,\\n  .my-xl-n5 {\\n    margin-top: -3rem !important;\\n  }\\n  .mr-xl-n5,\\n  .mx-xl-n5 {\\n    margin-right: -3rem !important;\\n  }\\n  .mb-xl-n5,\\n  .my-xl-n5 {\\n    margin-bottom: -3rem !important;\\n  }\\n  .ml-xl-n5,\\n  .mx-xl-n5 {\\n    margin-left: -3rem !important;\\n  }\\n  .m-xl-auto {\\n    margin: auto !important;\\n  }\\n  .mt-xl-auto,\\n  .my-xl-auto {\\n    margin-top: auto !important;\\n  }\\n  .mr-xl-auto,\\n  .mx-xl-auto {\\n    margin-right: auto !important;\\n  }\\n  .mb-xl-auto,\\n  .my-xl-auto {\\n    margin-bottom: auto !important;\\n  }\\n  .ml-xl-auto,\\n  .mx-xl-auto {\\n    margin-left: auto !important;\\n  }\\n}\\n\\n.text-monospace {\\n  font-family: SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace !important;\\n}\\n\\n.text-justify {\\n  text-align: justify !important;\\n}\\n\\n.text-wrap {\\n  white-space: normal !important;\\n}\\n\\n.text-nowrap {\\n  white-space: nowrap !important;\\n}\\n\\n.text-truncate {\\n  overflow: hidden;\\n  text-overflow: ellipsis;\\n  white-space: nowrap;\\n}\\n\\n.text-left {\\n  text-align: left !important;\\n}\\n\\n.text-right {\\n  text-align: right !important;\\n}\\n\\n.text-center {\\n  text-align: center !important;\\n}\\n\\n@media (min-width: 576px) {\\n  .text-sm-left {\\n    text-align: left !important;\\n  }\\n  .text-sm-right {\\n    text-align: right !important;\\n  }\\n  .text-sm-center {\\n    text-align: center !important;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .text-md-left {\\n    text-align: left !important;\\n  }\\n  .text-md-right {\\n    text-align: right !important;\\n  }\\n  .text-md-center {\\n    text-align: center !important;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .text-lg-left {\\n    text-align: left !important;\\n  }\\n  .text-lg-right {\\n    text-align: right !important;\\n  }\\n  .text-lg-center {\\n    text-align: center !important;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .text-xl-left {\\n    text-align: left !important;\\n  }\\n  .text-xl-right {\\n    text-align: right !important;\\n  }\\n  .text-xl-center {\\n    text-align: center !important;\\n  }\\n}\\n\\n.text-lowercase {\\n  text-transform: lowercase !important;\\n}\\n\\n.text-uppercase {\\n  text-transform: uppercase !important;\\n}\\n\\n.text-capitalize {\\n  text-transform: capitalize !important;\\n}\\n\\n.font-weight-light {\\n  font-weight: 300 !important;\\n}\\n\\n.font-weight-lighter {\\n  font-weight: lighter !important;\\n}\\n\\n.font-weight-normal {\\n  font-weight: 400 !important;\\n}\\n\\n.font-weight-bold {\\n  font-weight: 700 !important;\\n}\\n\\n.font-weight-bolder {\\n  font-weight: bolder !important;\\n}\\n\\n.font-italic {\\n  font-style: italic !important;\\n}\\n\\n.text-white {\\n  color: #fff !important;\\n}\\n\\n.text-primary {\\n  color: #007bff !important;\\n}\\n\\na.text-primary:hover, a.text-primary:focus {\\n  color: #0056b3 !important;\\n}\\n\\n.text-secondary {\\n  color: #6c757d !important;\\n}\\n\\na.text-secondary:hover, a.text-secondary:focus {\\n  color: #494f54 !important;\\n}\\n\\n.text-success {\\n  color: #28a745 !important;\\n}\\n\\na.text-success:hover, a.text-success:focus {\\n  color: #19692c !important;\\n}\\n\\n.text-info {\\n  color: #17a2b8 !important;\\n}\\n\\na.text-info:hover, a.text-info:focus {\\n  color: #0f6674 !important;\\n}\\n\\n.text-warning {\\n  color: #ffc107 !important;\\n}\\n\\na.text-warning:hover, a.text-warning:focus {\\n  color: #ba8b00 !important;\\n}\\n\\n.text-danger {\\n  color: #dc3545 !important;\\n}\\n\\na.text-danger:hover, a.text-danger:focus {\\n  color: #a71d2a !important;\\n}\\n\\n.text-light {\\n  color: #f8f9fa !important;\\n}\\n\\na.text-light:hover, a.text-light:focus {\\n  color: #cbd3da !important;\\n}\\n\\n.text-dark {\\n  color: #343a40 !important;\\n}\\n\\na.text-dark:hover, a.text-dark:focus {\\n  color: #121416 !important;\\n}\\n\\n.text-body {\\n  color: #212529 !important;\\n}\\n\\n.text-muted {\\n  color: #6c757d !important;\\n}\\n\\n.text-black-50 {\\n  color: rgba(0, 0, 0, 0.5) !important;\\n}\\n\\n.text-white-50 {\\n  color: rgba(255, 255, 255, 0.5) !important;\\n}\\n\\n.text-hide {\\n  font: 0/0 a;\\n  color: transparent;\\n  text-shadow: none;\\n  background-color: transparent;\\n  border: 0;\\n}\\n\\n.text-decoration-none {\\n  text-decoration: none !important;\\n}\\n\\n.text-break {\\n  word-break: break-word !important;\\n  overflow-wrap: break-word !important;\\n}\\n\\n.text-reset {\\n  color: inherit !important;\\n}\\n\\n.visible {\\n  visibility: visible !important;\\n}\\n\\n.invisible {\\n  visibility: hidden !important;\\n}\\n\\n@media print {\\n  *,\\n  *::before,\\n  *::after {\\n    text-shadow: none !important;\\n    box-shadow: none !important;\\n  }\\n  a:not(.btn) {\\n    text-decoration: underline;\\n  }\\n  abbr[title]::after {\\n    content: \\\" (\\\" attr(title) \\\")\\\";\\n  }\\n  pre {\\n    white-space: pre-wrap !important;\\n  }\\n  pre,\\n  blockquote {\\n    border: 1px solid #adb5bd;\\n    page-break-inside: avoid;\\n  }\\n  thead {\\n    display: table-header-group;\\n  }\\n  tr,\\n  img {\\n    page-break-inside: avoid;\\n  }\\n  p,\\n  h2,\\n  h3 {\\n    orphans: 3;\\n    widows: 3;\\n  }\\n  h2,\\n  h3 {\\n    page-break-after: avoid;\\n  }\\n  @page {\\n    size: a3;\\n  }\\n  body {\\n    min-width: 992px !important;\\n  }\\n  .container {\\n    min-width: 992px !important;\\n  }\\n  .navbar {\\n    display: none;\\n  }\\n  .badge {\\n    border: 1px solid #000;\\n  }\\n  .table {\\n    border-collapse: collapse !important;\\n  }\\n  .table td,\\n  .table th {\\n    background-color: #fff !important;\\n  }\\n  .table-bordered th,\\n  .table-bordered td {\\n    border: 1px solid #dee2e6 !important;\\n  }\\n  .table-dark {\\n    color: inherit;\\n  }\\n  .table-dark th,\\n  .table-dark td,\\n  .table-dark thead th,\\n  .table-dark tbody + tbody {\\n    border-color: #dee2e6;\\n  }\\n  .table .thead-dark th {\\n    color: inherit;\\n    border-color: #dee2e6;\\n  }\\n}\\n/*# sourceMappingURL=bootstrap.css.map */\",\"// stylelint-disable property-blacklist, scss/dollar-variable-default\\n\\n// SCSS RFS mixin\\n//\\n// Automated font-resizing\\n//\\n// See https://github.com/twbs/rfs\\n\\n// Configuration\\n\\n// Base font size\\n$rfs-base-font-size: 1.25rem !default;\\n$rfs-font-size-unit: rem !default;\\n\\n// Breakpoint at where font-size starts decreasing if screen width is smaller\\n$rfs-breakpoint: 1200px !default;\\n$rfs-breakpoint-unit: px !default;\\n\\n// Resize font-size based on screen height and width\\n$rfs-two-dimensional: false !default;\\n\\n// Factor of decrease\\n$rfs-factor: 10 !default;\\n\\n@if type-of($rfs-factor) != \\\"number\\\" or $rfs-factor <= 1 {\\n  @error \\\"`#{$rfs-factor}` is not a valid  $rfs-factor, it must be greater than 1.\\\";\\n}\\n\\n// Generate enable or disable classes. Possibilities: false, \\\"enable\\\" or \\\"disable\\\"\\n$rfs-class: false !default;\\n\\n// 1 rem = $rfs-rem-value px\\n$rfs-rem-value: 16 !default;\\n\\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\\n$rfs-safari-iframe-resize-bug-fix: false !default;\\n\\n// Disable RFS by setting $enable-responsive-font-sizes to false\\n$enable-responsive-font-sizes: true !default;\\n\\n// Cache $rfs-base-font-size unit\\n$rfs-base-font-size-unit: unit($rfs-base-font-size);\\n\\n// Remove px-unit from $rfs-base-font-size for calculations\\n@if $rfs-base-font-size-unit == \\\"px\\\" {\\n  $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1);\\n}\\n@else if $rfs-base-font-size-unit == \\\"rem\\\" {\\n  $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1 / $rfs-rem-value);\\n}\\n\\n// Cache $rfs-breakpoint unit to prevent multiple calls\\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\\n\\n// Remove unit from $rfs-breakpoint for calculations\\n@if $rfs-breakpoint-unit-cache == \\\"px\\\" {\\n  $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1);\\n}\\n@else if $rfs-breakpoint-unit-cache == \\\"rem\\\" or $rfs-breakpoint-unit-cache == \\\"em\\\" {\\n  $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1 / $rfs-rem-value);\\n}\\n\\n// Responsive font-size mixin\\n@mixin rfs($fs, $important: false) {\\n  // Cache $fs unit\\n  $fs-unit: if(type-of($fs) == \\\"number\\\", unit($fs), false);\\n\\n  // Add !important suffix if needed\\n  $rfs-suffix: if($important, \\\" !important\\\", \\\"\\\");\\n\\n  // If $fs isn't a number (like inherit) or $fs has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\\n  @if not $fs-unit or $fs-unit != \\\"\\\" and $fs-unit != \\\"px\\\" and $fs-unit != \\\"rem\\\" or $fs == 0 {\\n    font-size: #{$fs}#{$rfs-suffix};\\n  }\\n  @else {\\n    // Variables for storing static and fluid rescaling\\n    $rfs-static: null;\\n    $rfs-fluid: null;\\n\\n    // Remove px-unit from $fs for calculations\\n    @if $fs-unit == \\\"px\\\" {\\n      $fs: $fs / ($fs * 0 + 1);\\n    }\\n    @else if $fs-unit == \\\"rem\\\" {\\n      $fs: $fs / ($fs * 0 + 1 / $rfs-rem-value);\\n    }\\n\\n    // Set default font-size\\n    @if $rfs-font-size-unit == rem {\\n      $rfs-static: #{$fs / $rfs-rem-value}rem#{$rfs-suffix};\\n    }\\n    @else if $rfs-font-size-unit == px {\\n      $rfs-static: #{$fs}px#{$rfs-suffix};\\n    }\\n    @else {\\n      @error \\\"`#{$rfs-font-size-unit}` is not a valid unit for $rfs-font-size-unit. Use `px` or `rem`.\\\";\\n    }\\n\\n    // Only add media query if font-size is bigger as the minimum font-size\\n    // If $rfs-factor == 1, no rescaling will take place\\n    @if $fs > $rfs-base-font-size and $enable-responsive-font-sizes {\\n      $min-width: null;\\n      $variable-unit: null;\\n\\n      // Calculate minimum font-size for given font-size\\n      $fs-min: $rfs-base-font-size + ($fs - $rfs-base-font-size) / $rfs-factor;\\n\\n      // Calculate difference between given font-size and minimum font-size for given font-size\\n      $fs-diff: $fs - $fs-min;\\n\\n      // Base font-size formatting\\n      // No need to check if the unit is valid, because we did that before\\n      $min-width: if($rfs-font-size-unit == rem, #{$fs-min / $rfs-rem-value}rem, #{$fs-min}px);\\n\\n      // If two-dimensional, use smallest of screen width and height\\n      $variable-unit: if($rfs-two-dimensional, vmin, vw);\\n\\n      // Calculate the variable width between 0 and $rfs-breakpoint\\n      $variable-width: #{$fs-diff * 100 / $rfs-breakpoint}#{$variable-unit};\\n\\n      // Set the calculated font-size.\\n      $rfs-fluid: calc(#{$min-width} + #{$variable-width}) #{$rfs-suffix};\\n    }\\n\\n    // Rendering\\n    @if $rfs-fluid == null {\\n      // Only render static font-size if no fluid font-size is available\\n      font-size: $rfs-static;\\n    }\\n    @else {\\n      $mq-value: null;\\n\\n      // RFS breakpoint formatting\\n      @if $rfs-breakpoint-unit == em or $rfs-breakpoint-unit == rem {\\n        $mq-value: #{$rfs-breakpoint / $rfs-rem-value}#{$rfs-breakpoint-unit};\\n      }\\n      @else if $rfs-breakpoint-unit == px {\\n        $mq-value: #{$rfs-breakpoint}px;\\n      }\\n      @else {\\n        @error \\\"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\\\";\\n      }\\n\\n      @if $rfs-class == \\\"disable\\\" {\\n        // Adding an extra class increases specificity,\\n        // which prevents the media query to override the font size\\n        &,\\n        .disable-responsive-font-size &,\\n        &.disable-responsive-font-size {\\n          font-size: $rfs-static;\\n        }\\n      }\\n      @else {\\n        font-size: $rfs-static;\\n      }\\n\\n      @if $rfs-two-dimensional {\\n        @media (max-width: #{$mq-value}), (max-height: #{$mq-value}) {\\n          @if $rfs-class == \\\"enable\\\" {\\n            .enable-responsive-font-size &,\\n            &.enable-responsive-font-size {\\n              font-size: $rfs-fluid;\\n            }\\n          }\\n          @else {\\n            font-size: $rfs-fluid;\\n          }\\n\\n          @if $rfs-safari-iframe-resize-bug-fix {\\n            // stylelint-disable-next-line length-zero-no-unit\\n            min-width: 0vw;\\n          }\\n        }\\n      }\\n      @else {\\n        @media (max-width: #{$mq-value}) {\\n          @if $rfs-class == \\\"enable\\\" {\\n            .enable-responsive-font-size &,\\n            &.enable-responsive-font-size {\\n              font-size: $rfs-fluid;\\n            }\\n          }\\n          @else {\\n            font-size: $rfs-fluid;\\n          }\\n\\n          @if $rfs-safari-iframe-resize-bug-fix {\\n            // stylelint-disable-next-line length-zero-no-unit\\n            min-width: 0vw;\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\n\\n// The font-size & responsive-font-size mixin uses RFS to rescale font sizes\\n@mixin font-size($fs, $important: false) {\\n  @include rfs($fs, $important);\\n}\\n\\n@mixin responsive-font-size($fs, $important: false) {\\n  @include rfs($fs, $important);\\n}\\n\",\"/*!\\n * Bootstrap v4.3.1 (https://getbootstrap.com/)\\n * Copyright 2011-2019 The Bootstrap Authors\\n * Copyright 2011-2019 Twitter, Inc.\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n */\\n:root {\\n  --blue: #007bff;\\n  --indigo: #6610f2;\\n  --purple: #6f42c1;\\n  --pink: #e83e8c;\\n  --red: #dc3545;\\n  --orange: #fd7e14;\\n  --yellow: #ffc107;\\n  --green: #28a745;\\n  --teal: #20c997;\\n  --cyan: #17a2b8;\\n  --white: #fff;\\n  --gray: #6c757d;\\n  --gray-dark: #343a40;\\n  --primary: #007bff;\\n  --secondary: #6c757d;\\n  --success: #28a745;\\n  --info: #17a2b8;\\n  --warning: #ffc107;\\n  --danger: #dc3545;\\n  --light: #f8f9fa;\\n  --dark: #343a40;\\n  --breakpoint-xs: 0;\\n  --breakpoint-sm: 576px;\\n  --breakpoint-md: 768px;\\n  --breakpoint-lg: 992px;\\n  --breakpoint-xl: 1200px;\\n  --font-family-sans-serif: -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, \\\"Helvetica Neue\\\", Arial, \\\"Noto Sans\\\", sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\";\\n  --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace;\\n}\\n\\n*,\\n*::before,\\n*::after {\\n  box-sizing: border-box;\\n}\\n\\nhtml {\\n  font-family: sans-serif;\\n  line-height: 1.15;\\n  -webkit-text-size-adjust: 100%;\\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\\n}\\n\\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\\n  display: block;\\n}\\n\\nbody {\\n  margin: 0;\\n  font-family: -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, \\\"Helvetica Neue\\\", Arial, \\\"Noto Sans\\\", sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\";\\n  font-size: 1rem;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  color: #212529;\\n  text-align: left;\\n  background-color: #fff;\\n}\\n\\n[tabindex=\\\"-1\\\"]:focus {\\n  outline: 0 !important;\\n}\\n\\nhr {\\n  box-sizing: content-box;\\n  height: 0;\\n  overflow: visible;\\n}\\n\\nh1, h2, h3, h4, h5, h6 {\\n  margin-top: 0;\\n  margin-bottom: 0.5rem;\\n}\\n\\np {\\n  margin-top: 0;\\n  margin-bottom: 1rem;\\n}\\n\\nabbr[title],\\nabbr[data-original-title] {\\n  text-decoration: underline;\\n  text-decoration: underline dotted;\\n  cursor: help;\\n  border-bottom: 0;\\n  text-decoration-skip-ink: none;\\n}\\n\\naddress {\\n  margin-bottom: 1rem;\\n  font-style: normal;\\n  line-height: inherit;\\n}\\n\\nol,\\nul,\\ndl {\\n  margin-top: 0;\\n  margin-bottom: 1rem;\\n}\\n\\nol ol,\\nul ul,\\nol ul,\\nul ol {\\n  margin-bottom: 0;\\n}\\n\\ndt {\\n  font-weight: 700;\\n}\\n\\ndd {\\n  margin-bottom: .5rem;\\n  margin-left: 0;\\n}\\n\\nblockquote {\\n  margin: 0 0 1rem;\\n}\\n\\nb,\\nstrong {\\n  font-weight: bolder;\\n}\\n\\nsmall {\\n  font-size: 80%;\\n}\\n\\nsub,\\nsup {\\n  position: relative;\\n  font-size: 75%;\\n  line-height: 0;\\n  vertical-align: baseline;\\n}\\n\\nsub {\\n  bottom: -.25em;\\n}\\n\\nsup {\\n  top: -.5em;\\n}\\n\\na {\\n  color: #007bff;\\n  text-decoration: none;\\n  background-color: transparent;\\n}\\n\\na:hover {\\n  color: #0056b3;\\n  text-decoration: underline;\\n}\\n\\na:not([href]):not([tabindex]) {\\n  color: inherit;\\n  text-decoration: none;\\n}\\n\\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\\n  color: inherit;\\n  text-decoration: none;\\n}\\n\\na:not([href]):not([tabindex]):focus {\\n  outline: 0;\\n}\\n\\npre,\\ncode,\\nkbd,\\nsamp {\\n  font-family: SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace;\\n  font-size: 1em;\\n}\\n\\npre {\\n  margin-top: 0;\\n  margin-bottom: 1rem;\\n  overflow: auto;\\n}\\n\\nfigure {\\n  margin: 0 0 1rem;\\n}\\n\\nimg {\\n  vertical-align: middle;\\n  border-style: none;\\n}\\n\\nsvg {\\n  overflow: hidden;\\n  vertical-align: middle;\\n}\\n\\ntable {\\n  border-collapse: collapse;\\n}\\n\\ncaption {\\n  padding-top: 0.75rem;\\n  padding-bottom: 0.75rem;\\n  color: #6c757d;\\n  text-align: left;\\n  caption-side: bottom;\\n}\\n\\nth {\\n  text-align: inherit;\\n}\\n\\nlabel {\\n  display: inline-block;\\n  margin-bottom: 0.5rem;\\n}\\n\\nbutton {\\n  border-radius: 0;\\n}\\n\\nbutton:focus {\\n  outline: 1px dotted;\\n  outline: 5px auto -webkit-focus-ring-color;\\n}\\n\\ninput,\\nbutton,\\nselect,\\noptgroup,\\ntextarea {\\n  margin: 0;\\n  font-family: inherit;\\n  font-size: inherit;\\n  line-height: inherit;\\n}\\n\\nbutton,\\ninput {\\n  overflow: visible;\\n}\\n\\nbutton,\\nselect {\\n  text-transform: none;\\n}\\n\\nselect {\\n  word-wrap: normal;\\n}\\n\\nbutton,\\n[type=\\\"button\\\"],\\n[type=\\\"reset\\\"],\\n[type=\\\"submit\\\"] {\\n  -webkit-appearance: button;\\n}\\n\\nbutton:not(:disabled),\\n[type=\\\"button\\\"]:not(:disabled),\\n[type=\\\"reset\\\"]:not(:disabled),\\n[type=\\\"submit\\\"]:not(:disabled) {\\n  cursor: pointer;\\n}\\n\\nbutton::-moz-focus-inner,\\n[type=\\\"button\\\"]::-moz-focus-inner,\\n[type=\\\"reset\\\"]::-moz-focus-inner,\\n[type=\\\"submit\\\"]::-moz-focus-inner {\\n  padding: 0;\\n  border-style: none;\\n}\\n\\ninput[type=\\\"radio\\\"],\\ninput[type=\\\"checkbox\\\"] {\\n  box-sizing: border-box;\\n  padding: 0;\\n}\\n\\ninput[type=\\\"date\\\"],\\ninput[type=\\\"time\\\"],\\ninput[type=\\\"datetime-local\\\"],\\ninput[type=\\\"month\\\"] {\\n  -webkit-appearance: listbox;\\n}\\n\\ntextarea {\\n  overflow: auto;\\n  resize: vertical;\\n}\\n\\nfieldset {\\n  min-width: 0;\\n  padding: 0;\\n  margin: 0;\\n  border: 0;\\n}\\n\\nlegend {\\n  display: block;\\n  width: 100%;\\n  max-width: 100%;\\n  padding: 0;\\n  margin-bottom: .5rem;\\n  font-size: 1.5rem;\\n  line-height: inherit;\\n  color: inherit;\\n  white-space: normal;\\n}\\n\\nprogress {\\n  vertical-align: baseline;\\n}\\n\\n[type=\\\"number\\\"]::-webkit-inner-spin-button,\\n[type=\\\"number\\\"]::-webkit-outer-spin-button {\\n  height: auto;\\n}\\n\\n[type=\\\"search\\\"] {\\n  outline-offset: -2px;\\n  -webkit-appearance: none;\\n}\\n\\n[type=\\\"search\\\"]::-webkit-search-decoration {\\n  -webkit-appearance: none;\\n}\\n\\n::-webkit-file-upload-button {\\n  font: inherit;\\n  -webkit-appearance: button;\\n}\\n\\noutput {\\n  display: inline-block;\\n}\\n\\nsummary {\\n  display: list-item;\\n  cursor: pointer;\\n}\\n\\ntemplate {\\n  display: none;\\n}\\n\\n[hidden] {\\n  display: none !important;\\n}\\n\\nh1, h2, h3, h4, h5, h6,\\n.h1, .h2, .h3, .h4, .h5, .h6 {\\n  margin-bottom: 0.5rem;\\n  font-weight: 500;\\n  line-height: 1.2;\\n}\\n\\nh1, .h1 {\\n  font-size: 2.5rem;\\n}\\n\\nh2, .h2 {\\n  font-size: 2rem;\\n}\\n\\nh3, .h3 {\\n  font-size: 1.75rem;\\n}\\n\\nh4, .h4 {\\n  font-size: 1.5rem;\\n}\\n\\nh5, .h5 {\\n  font-size: 1.25rem;\\n}\\n\\nh6, .h6 {\\n  font-size: 1rem;\\n}\\n\\n.lead {\\n  font-size: 1.25rem;\\n  font-weight: 300;\\n}\\n\\n.display-1 {\\n  font-size: 6rem;\\n  font-weight: 300;\\n  line-height: 1.2;\\n}\\n\\n.display-2 {\\n  font-size: 5.5rem;\\n  font-weight: 300;\\n  line-height: 1.2;\\n}\\n\\n.display-3 {\\n  font-size: 4.5rem;\\n  font-weight: 300;\\n  line-height: 1.2;\\n}\\n\\n.display-4 {\\n  font-size: 3.5rem;\\n  font-weight: 300;\\n  line-height: 1.2;\\n}\\n\\nhr {\\n  margin-top: 1rem;\\n  margin-bottom: 1rem;\\n  border: 0;\\n  border-top: 1px solid rgba(0, 0, 0, 0.1);\\n}\\n\\nsmall,\\n.small {\\n  font-size: 80%;\\n  font-weight: 400;\\n}\\n\\nmark,\\n.mark {\\n  padding: 0.2em;\\n  background-color: #fcf8e3;\\n}\\n\\n.list-unstyled {\\n  padding-left: 0;\\n  list-style: none;\\n}\\n\\n.list-inline {\\n  padding-left: 0;\\n  list-style: none;\\n}\\n\\n.list-inline-item {\\n  display: inline-block;\\n}\\n\\n.list-inline-item:not(:last-child) {\\n  margin-right: 0.5rem;\\n}\\n\\n.initialism {\\n  font-size: 90%;\\n  text-transform: uppercase;\\n}\\n\\n.blockquote {\\n  margin-bottom: 1rem;\\n  font-size: 1.25rem;\\n}\\n\\n.blockquote-footer {\\n  display: block;\\n  font-size: 80%;\\n  color: #6c757d;\\n}\\n\\n.blockquote-footer::before {\\n  content: \\\"\\\\2014\\\\00A0\\\";\\n}\\n\\n.img-fluid {\\n  max-width: 100%;\\n  height: auto;\\n}\\n\\n.img-thumbnail {\\n  padding: 0.25rem;\\n  background-color: #fff;\\n  border: 1px solid #dee2e6;\\n  border-radius: 0.25rem;\\n  max-width: 100%;\\n  height: auto;\\n}\\n\\n.figure {\\n  display: inline-block;\\n}\\n\\n.figure-img {\\n  margin-bottom: 0.5rem;\\n  line-height: 1;\\n}\\n\\n.figure-caption {\\n  font-size: 90%;\\n  color: #6c757d;\\n}\\n\\ncode {\\n  font-size: 87.5%;\\n  color: #e83e8c;\\n  word-break: break-word;\\n}\\n\\na > code {\\n  color: inherit;\\n}\\n\\nkbd {\\n  padding: 0.2rem 0.4rem;\\n  font-size: 87.5%;\\n  color: #fff;\\n  background-color: #212529;\\n  border-radius: 0.2rem;\\n}\\n\\nkbd kbd {\\n  padding: 0;\\n  font-size: 100%;\\n  font-weight: 700;\\n}\\n\\npre {\\n  display: block;\\n  font-size: 87.5%;\\n  color: #212529;\\n}\\n\\npre code {\\n  font-size: inherit;\\n  color: inherit;\\n  word-break: normal;\\n}\\n\\n.pre-scrollable {\\n  max-height: 340px;\\n  overflow-y: scroll;\\n}\\n\\n.container {\\n  width: 100%;\\n  padding-right: 15px;\\n  padding-left: 15px;\\n  margin-right: auto;\\n  margin-left: auto;\\n}\\n\\n@media (min-width: 576px) {\\n  .container {\\n    max-width: 540px;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .container {\\n    max-width: 720px;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .container {\\n    max-width: 960px;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .container {\\n    max-width: 1140px;\\n  }\\n}\\n\\n.container-fluid {\\n  width: 100%;\\n  padding-right: 15px;\\n  padding-left: 15px;\\n  margin-right: auto;\\n  margin-left: auto;\\n}\\n\\n.row {\\n  display: flex;\\n  flex-wrap: wrap;\\n  margin-right: -15px;\\n  margin-left: -15px;\\n}\\n\\n.no-gutters {\\n  margin-right: 0;\\n  margin-left: 0;\\n}\\n\\n.no-gutters > .col,\\n.no-gutters > [class*=\\\"col-\\\"] {\\n  padding-right: 0;\\n  padding-left: 0;\\n}\\n\\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\\n.col-xl-auto {\\n  position: relative;\\n  width: 100%;\\n  padding-right: 15px;\\n  padding-left: 15px;\\n}\\n\\n.col {\\n  flex-basis: 0;\\n  flex-grow: 1;\\n  max-width: 100%;\\n}\\n\\n.col-auto {\\n  flex: 0 0 auto;\\n  width: auto;\\n  max-width: 100%;\\n}\\n\\n.col-1 {\\n  flex: 0 0 8.333333%;\\n  max-width: 8.333333%;\\n}\\n\\n.col-2 {\\n  flex: 0 0 16.666667%;\\n  max-width: 16.666667%;\\n}\\n\\n.col-3 {\\n  flex: 0 0 25%;\\n  max-width: 25%;\\n}\\n\\n.col-4 {\\n  flex: 0 0 33.333333%;\\n  max-width: 33.333333%;\\n}\\n\\n.col-5 {\\n  flex: 0 0 41.666667%;\\n  max-width: 41.666667%;\\n}\\n\\n.col-6 {\\n  flex: 0 0 50%;\\n  max-width: 50%;\\n}\\n\\n.col-7 {\\n  flex: 0 0 58.333333%;\\n  max-width: 58.333333%;\\n}\\n\\n.col-8 {\\n  flex: 0 0 66.666667%;\\n  max-width: 66.666667%;\\n}\\n\\n.col-9 {\\n  flex: 0 0 75%;\\n  max-width: 75%;\\n}\\n\\n.col-10 {\\n  flex: 0 0 83.333333%;\\n  max-width: 83.333333%;\\n}\\n\\n.col-11 {\\n  flex: 0 0 91.666667%;\\n  max-width: 91.666667%;\\n}\\n\\n.col-12 {\\n  flex: 0 0 100%;\\n  max-width: 100%;\\n}\\n\\n.order-first {\\n  order: -1;\\n}\\n\\n.order-last {\\n  order: 13;\\n}\\n\\n.order-0 {\\n  order: 0;\\n}\\n\\n.order-1 {\\n  order: 1;\\n}\\n\\n.order-2 {\\n  order: 2;\\n}\\n\\n.order-3 {\\n  order: 3;\\n}\\n\\n.order-4 {\\n  order: 4;\\n}\\n\\n.order-5 {\\n  order: 5;\\n}\\n\\n.order-6 {\\n  order: 6;\\n}\\n\\n.order-7 {\\n  order: 7;\\n}\\n\\n.order-8 {\\n  order: 8;\\n}\\n\\n.order-9 {\\n  order: 9;\\n}\\n\\n.order-10 {\\n  order: 10;\\n}\\n\\n.order-11 {\\n  order: 11;\\n}\\n\\n.order-12 {\\n  order: 12;\\n}\\n\\n.offset-1 {\\n  margin-left: 8.333333%;\\n}\\n\\n.offset-2 {\\n  margin-left: 16.666667%;\\n}\\n\\n.offset-3 {\\n  margin-left: 25%;\\n}\\n\\n.offset-4 {\\n  margin-left: 33.333333%;\\n}\\n\\n.offset-5 {\\n  margin-left: 41.666667%;\\n}\\n\\n.offset-6 {\\n  margin-left: 50%;\\n}\\n\\n.offset-7 {\\n  margin-left: 58.333333%;\\n}\\n\\n.offset-8 {\\n  margin-left: 66.666667%;\\n}\\n\\n.offset-9 {\\n  margin-left: 75%;\\n}\\n\\n.offset-10 {\\n  margin-left: 83.333333%;\\n}\\n\\n.offset-11 {\\n  margin-left: 91.666667%;\\n}\\n\\n@media (min-width: 576px) {\\n  .col-sm {\\n    flex-basis: 0;\\n    flex-grow: 1;\\n    max-width: 100%;\\n  }\\n  .col-sm-auto {\\n    flex: 0 0 auto;\\n    width: auto;\\n    max-width: 100%;\\n  }\\n  .col-sm-1 {\\n    flex: 0 0 8.333333%;\\n    max-width: 8.333333%;\\n  }\\n  .col-sm-2 {\\n    flex: 0 0 16.666667%;\\n    max-width: 16.666667%;\\n  }\\n  .col-sm-3 {\\n    flex: 0 0 25%;\\n    max-width: 25%;\\n  }\\n  .col-sm-4 {\\n    flex: 0 0 33.333333%;\\n    max-width: 33.333333%;\\n  }\\n  .col-sm-5 {\\n    flex: 0 0 41.666667%;\\n    max-width: 41.666667%;\\n  }\\n  .col-sm-6 {\\n    flex: 0 0 50%;\\n    max-width: 50%;\\n  }\\n  .col-sm-7 {\\n    flex: 0 0 58.333333%;\\n    max-width: 58.333333%;\\n  }\\n  .col-sm-8 {\\n    flex: 0 0 66.666667%;\\n    max-width: 66.666667%;\\n  }\\n  .col-sm-9 {\\n    flex: 0 0 75%;\\n    max-width: 75%;\\n  }\\n  .col-sm-10 {\\n    flex: 0 0 83.333333%;\\n    max-width: 83.333333%;\\n  }\\n  .col-sm-11 {\\n    flex: 0 0 91.666667%;\\n    max-width: 91.666667%;\\n  }\\n  .col-sm-12 {\\n    flex: 0 0 100%;\\n    max-width: 100%;\\n  }\\n  .order-sm-first {\\n    order: -1;\\n  }\\n  .order-sm-last {\\n    order: 13;\\n  }\\n  .order-sm-0 {\\n    order: 0;\\n  }\\n  .order-sm-1 {\\n    order: 1;\\n  }\\n  .order-sm-2 {\\n    order: 2;\\n  }\\n  .order-sm-3 {\\n    order: 3;\\n  }\\n  .order-sm-4 {\\n    order: 4;\\n  }\\n  .order-sm-5 {\\n    order: 5;\\n  }\\n  .order-sm-6 {\\n    order: 6;\\n  }\\n  .order-sm-7 {\\n    order: 7;\\n  }\\n  .order-sm-8 {\\n    order: 8;\\n  }\\n  .order-sm-9 {\\n    order: 9;\\n  }\\n  .order-sm-10 {\\n    order: 10;\\n  }\\n  .order-sm-11 {\\n    order: 11;\\n  }\\n  .order-sm-12 {\\n    order: 12;\\n  }\\n  .offset-sm-0 {\\n    margin-left: 0;\\n  }\\n  .offset-sm-1 {\\n    margin-left: 8.333333%;\\n  }\\n  .offset-sm-2 {\\n    margin-left: 16.666667%;\\n  }\\n  .offset-sm-3 {\\n    margin-left: 25%;\\n  }\\n  .offset-sm-4 {\\n    margin-left: 33.333333%;\\n  }\\n  .offset-sm-5 {\\n    margin-left: 41.666667%;\\n  }\\n  .offset-sm-6 {\\n    margin-left: 50%;\\n  }\\n  .offset-sm-7 {\\n    margin-left: 58.333333%;\\n  }\\n  .offset-sm-8 {\\n    margin-left: 66.666667%;\\n  }\\n  .offset-sm-9 {\\n    margin-left: 75%;\\n  }\\n  .offset-sm-10 {\\n    margin-left: 83.333333%;\\n  }\\n  .offset-sm-11 {\\n    margin-left: 91.666667%;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .col-md {\\n    flex-basis: 0;\\n    flex-grow: 1;\\n    max-width: 100%;\\n  }\\n  .col-md-auto {\\n    flex: 0 0 auto;\\n    width: auto;\\n    max-width: 100%;\\n  }\\n  .col-md-1 {\\n    flex: 0 0 8.333333%;\\n    max-width: 8.333333%;\\n  }\\n  .col-md-2 {\\n    flex: 0 0 16.666667%;\\n    max-width: 16.666667%;\\n  }\\n  .col-md-3 {\\n    flex: 0 0 25%;\\n    max-width: 25%;\\n  }\\n  .col-md-4 {\\n    flex: 0 0 33.333333%;\\n    max-width: 33.333333%;\\n  }\\n  .col-md-5 {\\n    flex: 0 0 41.666667%;\\n    max-width: 41.666667%;\\n  }\\n  .col-md-6 {\\n    flex: 0 0 50%;\\n    max-width: 50%;\\n  }\\n  .col-md-7 {\\n    flex: 0 0 58.333333%;\\n    max-width: 58.333333%;\\n  }\\n  .col-md-8 {\\n    flex: 0 0 66.666667%;\\n    max-width: 66.666667%;\\n  }\\n  .col-md-9 {\\n    flex: 0 0 75%;\\n    max-width: 75%;\\n  }\\n  .col-md-10 {\\n    flex: 0 0 83.333333%;\\n    max-width: 83.333333%;\\n  }\\n  .col-md-11 {\\n    flex: 0 0 91.666667%;\\n    max-width: 91.666667%;\\n  }\\n  .col-md-12 {\\n    flex: 0 0 100%;\\n    max-width: 100%;\\n  }\\n  .order-md-first {\\n    order: -1;\\n  }\\n  .order-md-last {\\n    order: 13;\\n  }\\n  .order-md-0 {\\n    order: 0;\\n  }\\n  .order-md-1 {\\n    order: 1;\\n  }\\n  .order-md-2 {\\n    order: 2;\\n  }\\n  .order-md-3 {\\n    order: 3;\\n  }\\n  .order-md-4 {\\n    order: 4;\\n  }\\n  .order-md-5 {\\n    order: 5;\\n  }\\n  .order-md-6 {\\n    order: 6;\\n  }\\n  .order-md-7 {\\n    order: 7;\\n  }\\n  .order-md-8 {\\n    order: 8;\\n  }\\n  .order-md-9 {\\n    order: 9;\\n  }\\n  .order-md-10 {\\n    order: 10;\\n  }\\n  .order-md-11 {\\n    order: 11;\\n  }\\n  .order-md-12 {\\n    order: 12;\\n  }\\n  .offset-md-0 {\\n    margin-left: 0;\\n  }\\n  .offset-md-1 {\\n    margin-left: 8.333333%;\\n  }\\n  .offset-md-2 {\\n    margin-left: 16.666667%;\\n  }\\n  .offset-md-3 {\\n    margin-left: 25%;\\n  }\\n  .offset-md-4 {\\n    margin-left: 33.333333%;\\n  }\\n  .offset-md-5 {\\n    margin-left: 41.666667%;\\n  }\\n  .offset-md-6 {\\n    margin-left: 50%;\\n  }\\n  .offset-md-7 {\\n    margin-left: 58.333333%;\\n  }\\n  .offset-md-8 {\\n    margin-left: 66.666667%;\\n  }\\n  .offset-md-9 {\\n    margin-left: 75%;\\n  }\\n  .offset-md-10 {\\n    margin-left: 83.333333%;\\n  }\\n  .offset-md-11 {\\n    margin-left: 91.666667%;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .col-lg {\\n    flex-basis: 0;\\n    flex-grow: 1;\\n    max-width: 100%;\\n  }\\n  .col-lg-auto {\\n    flex: 0 0 auto;\\n    width: auto;\\n    max-width: 100%;\\n  }\\n  .col-lg-1 {\\n    flex: 0 0 8.333333%;\\n    max-width: 8.333333%;\\n  }\\n  .col-lg-2 {\\n    flex: 0 0 16.666667%;\\n    max-width: 16.666667%;\\n  }\\n  .col-lg-3 {\\n    flex: 0 0 25%;\\n    max-width: 25%;\\n  }\\n  .col-lg-4 {\\n    flex: 0 0 33.333333%;\\n    max-width: 33.333333%;\\n  }\\n  .col-lg-5 {\\n    flex: 0 0 41.666667%;\\n    max-width: 41.666667%;\\n  }\\n  .col-lg-6 {\\n    flex: 0 0 50%;\\n    max-width: 50%;\\n  }\\n  .col-lg-7 {\\n    flex: 0 0 58.333333%;\\n    max-width: 58.333333%;\\n  }\\n  .col-lg-8 {\\n    flex: 0 0 66.666667%;\\n    max-width: 66.666667%;\\n  }\\n  .col-lg-9 {\\n    flex: 0 0 75%;\\n    max-width: 75%;\\n  }\\n  .col-lg-10 {\\n    flex: 0 0 83.333333%;\\n    max-width: 83.333333%;\\n  }\\n  .col-lg-11 {\\n    flex: 0 0 91.666667%;\\n    max-width: 91.666667%;\\n  }\\n  .col-lg-12 {\\n    flex: 0 0 100%;\\n    max-width: 100%;\\n  }\\n  .order-lg-first {\\n    order: -1;\\n  }\\n  .order-lg-last {\\n    order: 13;\\n  }\\n  .order-lg-0 {\\n    order: 0;\\n  }\\n  .order-lg-1 {\\n    order: 1;\\n  }\\n  .order-lg-2 {\\n    order: 2;\\n  }\\n  .order-lg-3 {\\n    order: 3;\\n  }\\n  .order-lg-4 {\\n    order: 4;\\n  }\\n  .order-lg-5 {\\n    order: 5;\\n  }\\n  .order-lg-6 {\\n    order: 6;\\n  }\\n  .order-lg-7 {\\n    order: 7;\\n  }\\n  .order-lg-8 {\\n    order: 8;\\n  }\\n  .order-lg-9 {\\n    order: 9;\\n  }\\n  .order-lg-10 {\\n    order: 10;\\n  }\\n  .order-lg-11 {\\n    order: 11;\\n  }\\n  .order-lg-12 {\\n    order: 12;\\n  }\\n  .offset-lg-0 {\\n    margin-left: 0;\\n  }\\n  .offset-lg-1 {\\n    margin-left: 8.333333%;\\n  }\\n  .offset-lg-2 {\\n    margin-left: 16.666667%;\\n  }\\n  .offset-lg-3 {\\n    margin-left: 25%;\\n  }\\n  .offset-lg-4 {\\n    margin-left: 33.333333%;\\n  }\\n  .offset-lg-5 {\\n    margin-left: 41.666667%;\\n  }\\n  .offset-lg-6 {\\n    margin-left: 50%;\\n  }\\n  .offset-lg-7 {\\n    margin-left: 58.333333%;\\n  }\\n  .offset-lg-8 {\\n    margin-left: 66.666667%;\\n  }\\n  .offset-lg-9 {\\n    margin-left: 75%;\\n  }\\n  .offset-lg-10 {\\n    margin-left: 83.333333%;\\n  }\\n  .offset-lg-11 {\\n    margin-left: 91.666667%;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .col-xl {\\n    flex-basis: 0;\\n    flex-grow: 1;\\n    max-width: 100%;\\n  }\\n  .col-xl-auto {\\n    flex: 0 0 auto;\\n    width: auto;\\n    max-width: 100%;\\n  }\\n  .col-xl-1 {\\n    flex: 0 0 8.333333%;\\n    max-width: 8.333333%;\\n  }\\n  .col-xl-2 {\\n    flex: 0 0 16.666667%;\\n    max-width: 16.666667%;\\n  }\\n  .col-xl-3 {\\n    flex: 0 0 25%;\\n    max-width: 25%;\\n  }\\n  .col-xl-4 {\\n    flex: 0 0 33.333333%;\\n    max-width: 33.333333%;\\n  }\\n  .col-xl-5 {\\n    flex: 0 0 41.666667%;\\n    max-width: 41.666667%;\\n  }\\n  .col-xl-6 {\\n    flex: 0 0 50%;\\n    max-width: 50%;\\n  }\\n  .col-xl-7 {\\n    flex: 0 0 58.333333%;\\n    max-width: 58.333333%;\\n  }\\n  .col-xl-8 {\\n    flex: 0 0 66.666667%;\\n    max-width: 66.666667%;\\n  }\\n  .col-xl-9 {\\n    flex: 0 0 75%;\\n    max-width: 75%;\\n  }\\n  .col-xl-10 {\\n    flex: 0 0 83.333333%;\\n    max-width: 83.333333%;\\n  }\\n  .col-xl-11 {\\n    flex: 0 0 91.666667%;\\n    max-width: 91.666667%;\\n  }\\n  .col-xl-12 {\\n    flex: 0 0 100%;\\n    max-width: 100%;\\n  }\\n  .order-xl-first {\\n    order: -1;\\n  }\\n  .order-xl-last {\\n    order: 13;\\n  }\\n  .order-xl-0 {\\n    order: 0;\\n  }\\n  .order-xl-1 {\\n    order: 1;\\n  }\\n  .order-xl-2 {\\n    order: 2;\\n  }\\n  .order-xl-3 {\\n    order: 3;\\n  }\\n  .order-xl-4 {\\n    order: 4;\\n  }\\n  .order-xl-5 {\\n    order: 5;\\n  }\\n  .order-xl-6 {\\n    order: 6;\\n  }\\n  .order-xl-7 {\\n    order: 7;\\n  }\\n  .order-xl-8 {\\n    order: 8;\\n  }\\n  .order-xl-9 {\\n    order: 9;\\n  }\\n  .order-xl-10 {\\n    order: 10;\\n  }\\n  .order-xl-11 {\\n    order: 11;\\n  }\\n  .order-xl-12 {\\n    order: 12;\\n  }\\n  .offset-xl-0 {\\n    margin-left: 0;\\n  }\\n  .offset-xl-1 {\\n    margin-left: 8.333333%;\\n  }\\n  .offset-xl-2 {\\n    margin-left: 16.666667%;\\n  }\\n  .offset-xl-3 {\\n    margin-left: 25%;\\n  }\\n  .offset-xl-4 {\\n    margin-left: 33.333333%;\\n  }\\n  .offset-xl-5 {\\n    margin-left: 41.666667%;\\n  }\\n  .offset-xl-6 {\\n    margin-left: 50%;\\n  }\\n  .offset-xl-7 {\\n    margin-left: 58.333333%;\\n  }\\n  .offset-xl-8 {\\n    margin-left: 66.666667%;\\n  }\\n  .offset-xl-9 {\\n    margin-left: 75%;\\n  }\\n  .offset-xl-10 {\\n    margin-left: 83.333333%;\\n  }\\n  .offset-xl-11 {\\n    margin-left: 91.666667%;\\n  }\\n}\\n\\n.table {\\n  width: 100%;\\n  margin-bottom: 1rem;\\n  color: #212529;\\n}\\n\\n.table th,\\n.table td {\\n  padding: 0.75rem;\\n  vertical-align: top;\\n  border-top: 1px solid #dee2e6;\\n}\\n\\n.table thead th {\\n  vertical-align: bottom;\\n  border-bottom: 2px solid #dee2e6;\\n}\\n\\n.table tbody + tbody {\\n  border-top: 2px solid #dee2e6;\\n}\\n\\n.table-sm th,\\n.table-sm td {\\n  padding: 0.3rem;\\n}\\n\\n.table-bordered {\\n  border: 1px solid #dee2e6;\\n}\\n\\n.table-bordered th,\\n.table-bordered td {\\n  border: 1px solid #dee2e6;\\n}\\n\\n.table-bordered thead th,\\n.table-bordered thead td {\\n  border-bottom-width: 2px;\\n}\\n\\n.table-borderless th,\\n.table-borderless td,\\n.table-borderless thead th,\\n.table-borderless tbody + tbody {\\n  border: 0;\\n}\\n\\n.table-striped tbody tr:nth-of-type(odd) {\\n  background-color: rgba(0, 0, 0, 0.05);\\n}\\n\\n.table-hover tbody tr:hover {\\n  color: #212529;\\n  background-color: rgba(0, 0, 0, 0.075);\\n}\\n\\n.table-primary,\\n.table-primary > th,\\n.table-primary > td {\\n  background-color: #b8daff;\\n}\\n\\n.table-primary th,\\n.table-primary td,\\n.table-primary thead th,\\n.table-primary tbody + tbody {\\n  border-color: #7abaff;\\n}\\n\\n.table-hover .table-primary:hover {\\n  background-color: #9fcdff;\\n}\\n\\n.table-hover .table-primary:hover > td,\\n.table-hover .table-primary:hover > th {\\n  background-color: #9fcdff;\\n}\\n\\n.table-secondary,\\n.table-secondary > th,\\n.table-secondary > td {\\n  background-color: #d6d8db;\\n}\\n\\n.table-secondary th,\\n.table-secondary td,\\n.table-secondary thead th,\\n.table-secondary tbody + tbody {\\n  border-color: #b3b7bb;\\n}\\n\\n.table-hover .table-secondary:hover {\\n  background-color: #c8cbcf;\\n}\\n\\n.table-hover .table-secondary:hover > td,\\n.table-hover .table-secondary:hover > th {\\n  background-color: #c8cbcf;\\n}\\n\\n.table-success,\\n.table-success > th,\\n.table-success > td {\\n  background-color: #c3e6cb;\\n}\\n\\n.table-success th,\\n.table-success td,\\n.table-success thead th,\\n.table-success tbody + tbody {\\n  border-color: #8fd19e;\\n}\\n\\n.table-hover .table-success:hover {\\n  background-color: #b1dfbb;\\n}\\n\\n.table-hover .table-success:hover > td,\\n.table-hover .table-success:hover > th {\\n  background-color: #b1dfbb;\\n}\\n\\n.table-info,\\n.table-info > th,\\n.table-info > td {\\n  background-color: #bee5eb;\\n}\\n\\n.table-info th,\\n.table-info td,\\n.table-info thead th,\\n.table-info tbody + tbody {\\n  border-color: #86cfda;\\n}\\n\\n.table-hover .table-info:hover {\\n  background-color: #abdde5;\\n}\\n\\n.table-hover .table-info:hover > td,\\n.table-hover .table-info:hover > th {\\n  background-color: #abdde5;\\n}\\n\\n.table-warning,\\n.table-warning > th,\\n.table-warning > td {\\n  background-color: #ffeeba;\\n}\\n\\n.table-warning th,\\n.table-warning td,\\n.table-warning thead th,\\n.table-warning tbody + tbody {\\n  border-color: #ffdf7e;\\n}\\n\\n.table-hover .table-warning:hover {\\n  background-color: #ffe8a1;\\n}\\n\\n.table-hover .table-warning:hover > td,\\n.table-hover .table-warning:hover > th {\\n  background-color: #ffe8a1;\\n}\\n\\n.table-danger,\\n.table-danger > th,\\n.table-danger > td {\\n  background-color: #f5c6cb;\\n}\\n\\n.table-danger th,\\n.table-danger td,\\n.table-danger thead th,\\n.table-danger tbody + tbody {\\n  border-color: #ed969e;\\n}\\n\\n.table-hover .table-danger:hover {\\n  background-color: #f1b0b7;\\n}\\n\\n.table-hover .table-danger:hover > td,\\n.table-hover .table-danger:hover > th {\\n  background-color: #f1b0b7;\\n}\\n\\n.table-light,\\n.table-light > th,\\n.table-light > td {\\n  background-color: #fdfdfe;\\n}\\n\\n.table-light th,\\n.table-light td,\\n.table-light thead th,\\n.table-light tbody + tbody {\\n  border-color: #fbfcfc;\\n}\\n\\n.table-hover .table-light:hover {\\n  background-color: #ececf6;\\n}\\n\\n.table-hover .table-light:hover > td,\\n.table-hover .table-light:hover > th {\\n  background-color: #ececf6;\\n}\\n\\n.table-dark,\\n.table-dark > th,\\n.table-dark > td {\\n  background-color: #c6c8ca;\\n}\\n\\n.table-dark th,\\n.table-dark td,\\n.table-dark thead th,\\n.table-dark tbody + tbody {\\n  border-color: #95999c;\\n}\\n\\n.table-hover .table-dark:hover {\\n  background-color: #b9bbbe;\\n}\\n\\n.table-hover .table-dark:hover > td,\\n.table-hover .table-dark:hover > th {\\n  background-color: #b9bbbe;\\n}\\n\\n.table-active,\\n.table-active > th,\\n.table-active > td {\\n  background-color: rgba(0, 0, 0, 0.075);\\n}\\n\\n.table-hover .table-active:hover {\\n  background-color: rgba(0, 0, 0, 0.075);\\n}\\n\\n.table-hover .table-active:hover > td,\\n.table-hover .table-active:hover > th {\\n  background-color: rgba(0, 0, 0, 0.075);\\n}\\n\\n.table .thead-dark th {\\n  color: #fff;\\n  background-color: #343a40;\\n  border-color: #454d55;\\n}\\n\\n.table .thead-light th {\\n  color: #495057;\\n  background-color: #e9ecef;\\n  border-color: #dee2e6;\\n}\\n\\n.table-dark {\\n  color: #fff;\\n  background-color: #343a40;\\n}\\n\\n.table-dark th,\\n.table-dark td,\\n.table-dark thead th {\\n  border-color: #454d55;\\n}\\n\\n.table-dark.table-bordered {\\n  border: 0;\\n}\\n\\n.table-dark.table-striped tbody tr:nth-of-type(odd) {\\n  background-color: rgba(255, 255, 255, 0.05);\\n}\\n\\n.table-dark.table-hover tbody tr:hover {\\n  color: #fff;\\n  background-color: rgba(255, 255, 255, 0.075);\\n}\\n\\n@media (max-width: 575.98px) {\\n  .table-responsive-sm {\\n    display: block;\\n    width: 100%;\\n    overflow-x: auto;\\n    -webkit-overflow-scrolling: touch;\\n  }\\n  .table-responsive-sm > .table-bordered {\\n    border: 0;\\n  }\\n}\\n\\n@media (max-width: 767.98px) {\\n  .table-responsive-md {\\n    display: block;\\n    width: 100%;\\n    overflow-x: auto;\\n    -webkit-overflow-scrolling: touch;\\n  }\\n  .table-responsive-md > .table-bordered {\\n    border: 0;\\n  }\\n}\\n\\n@media (max-width: 991.98px) {\\n  .table-responsive-lg {\\n    display: block;\\n    width: 100%;\\n    overflow-x: auto;\\n    -webkit-overflow-scrolling: touch;\\n  }\\n  .table-responsive-lg > .table-bordered {\\n    border: 0;\\n  }\\n}\\n\\n@media (max-width: 1199.98px) {\\n  .table-responsive-xl {\\n    display: block;\\n    width: 100%;\\n    overflow-x: auto;\\n    -webkit-overflow-scrolling: touch;\\n  }\\n  .table-responsive-xl > .table-bordered {\\n    border: 0;\\n  }\\n}\\n\\n.table-responsive {\\n  display: block;\\n  width: 100%;\\n  overflow-x: auto;\\n  -webkit-overflow-scrolling: touch;\\n}\\n\\n.table-responsive > .table-bordered {\\n  border: 0;\\n}\\n\\n.form-control {\\n  display: block;\\n  width: 100%;\\n  height: calc(1.5em + 0.75rem + 2px);\\n  padding: 0.375rem 0.75rem;\\n  font-size: 1rem;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  color: #495057;\\n  background-color: #fff;\\n  background-clip: padding-box;\\n  border: 1px solid #ced4da;\\n  border-radius: 0.25rem;\\n  transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .form-control {\\n    transition: none;\\n  }\\n}\\n\\n.form-control::-ms-expand {\\n  background-color: transparent;\\n  border: 0;\\n}\\n\\n.form-control:focus {\\n  color: #495057;\\n  background-color: #fff;\\n  border-color: #80bdff;\\n  outline: 0;\\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\\n}\\n\\n.form-control::placeholder {\\n  color: #6c757d;\\n  opacity: 1;\\n}\\n\\n.form-control:disabled, .form-control[readonly] {\\n  background-color: #e9ecef;\\n  opacity: 1;\\n}\\n\\nselect.form-control:focus::-ms-value {\\n  color: #495057;\\n  background-color: #fff;\\n}\\n\\n.form-control-file,\\n.form-control-range {\\n  display: block;\\n  width: 100%;\\n}\\n\\n.col-form-label {\\n  padding-top: calc(0.375rem + 1px);\\n  padding-bottom: calc(0.375rem + 1px);\\n  margin-bottom: 0;\\n  font-size: inherit;\\n  line-height: 1.5;\\n}\\n\\n.col-form-label-lg {\\n  padding-top: calc(0.5rem + 1px);\\n  padding-bottom: calc(0.5rem + 1px);\\n  font-size: 1.25rem;\\n  line-height: 1.5;\\n}\\n\\n.col-form-label-sm {\\n  padding-top: calc(0.25rem + 1px);\\n  padding-bottom: calc(0.25rem + 1px);\\n  font-size: 0.875rem;\\n  line-height: 1.5;\\n}\\n\\n.form-control-plaintext {\\n  display: block;\\n  width: 100%;\\n  padding-top: 0.375rem;\\n  padding-bottom: 0.375rem;\\n  margin-bottom: 0;\\n  line-height: 1.5;\\n  color: #212529;\\n  background-color: transparent;\\n  border: solid transparent;\\n  border-width: 1px 0;\\n}\\n\\n.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {\\n  padding-right: 0;\\n  padding-left: 0;\\n}\\n\\n.form-control-sm {\\n  height: calc(1.5em + 0.5rem + 2px);\\n  padding: 0.25rem 0.5rem;\\n  font-size: 0.875rem;\\n  line-height: 1.5;\\n  border-radius: 0.2rem;\\n}\\n\\n.form-control-lg {\\n  height: calc(1.5em + 1rem + 2px);\\n  padding: 0.5rem 1rem;\\n  font-size: 1.25rem;\\n  line-height: 1.5;\\n  border-radius: 0.3rem;\\n}\\n\\nselect.form-control[size], select.form-control[multiple] {\\n  height: auto;\\n}\\n\\ntextarea.form-control {\\n  height: auto;\\n}\\n\\n.form-group {\\n  margin-bottom: 1rem;\\n}\\n\\n.form-text {\\n  display: block;\\n  margin-top: 0.25rem;\\n}\\n\\n.form-row {\\n  display: flex;\\n  flex-wrap: wrap;\\n  margin-right: -5px;\\n  margin-left: -5px;\\n}\\n\\n.form-row > .col,\\n.form-row > [class*=\\\"col-\\\"] {\\n  padding-right: 5px;\\n  padding-left: 5px;\\n}\\n\\n.form-check {\\n  position: relative;\\n  display: block;\\n  padding-left: 1.25rem;\\n}\\n\\n.form-check-input {\\n  position: absolute;\\n  margin-top: 0.3rem;\\n  margin-left: -1.25rem;\\n}\\n\\n.form-check-input:disabled ~ .form-check-label {\\n  color: #6c757d;\\n}\\n\\n.form-check-label {\\n  margin-bottom: 0;\\n}\\n\\n.form-check-inline {\\n  display: inline-flex;\\n  align-items: center;\\n  padding-left: 0;\\n  margin-right: 0.75rem;\\n}\\n\\n.form-check-inline .form-check-input {\\n  position: static;\\n  margin-top: 0;\\n  margin-right: 0.3125rem;\\n  margin-left: 0;\\n}\\n\\n.valid-feedback {\\n  display: none;\\n  width: 100%;\\n  margin-top: 0.25rem;\\n  font-size: 80%;\\n  color: #28a745;\\n}\\n\\n.valid-tooltip {\\n  position: absolute;\\n  top: 100%;\\n  z-index: 5;\\n  display: none;\\n  max-width: 100%;\\n  padding: 0.25rem 0.5rem;\\n  margin-top: .1rem;\\n  font-size: 0.875rem;\\n  line-height: 1.5;\\n  color: #fff;\\n  background-color: rgba(40, 167, 69, 0.9);\\n  border-radius: 0.25rem;\\n}\\n\\n.was-validated .form-control:valid, .form-control.is-valid {\\n  border-color: #28a745;\\n  padding-right: calc(1.5em + 0.75rem);\\n  background-image: url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\\\");\\n  background-repeat: no-repeat;\\n  background-position: center right calc(0.375em + 0.1875rem);\\n  background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\\n}\\n\\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus {\\n  border-color: #28a745;\\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\\n}\\n\\n.was-validated .form-control:valid ~ .valid-feedback,\\n.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback,\\n.form-control.is-valid ~ .valid-tooltip {\\n  display: block;\\n}\\n\\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\\n  padding-right: calc(1.5em + 0.75rem);\\n  background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\\n}\\n\\n.was-validated .custom-select:valid, .custom-select.is-valid {\\n  border-color: #28a745;\\n  padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);\\n  background: url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\\\") no-repeat right 0.75rem center/8px 10px, url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\\\") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\\n}\\n\\n.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {\\n  border-color: #28a745;\\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\\n}\\n\\n.was-validated .custom-select:valid ~ .valid-feedback,\\n.was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback,\\n.custom-select.is-valid ~ .valid-tooltip {\\n  display: block;\\n}\\n\\n.was-validated .form-control-file:valid ~ .valid-feedback,\\n.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback,\\n.form-control-file.is-valid ~ .valid-tooltip {\\n  display: block;\\n}\\n\\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\\n  color: #28a745;\\n}\\n\\n.was-validated .form-check-input:valid ~ .valid-feedback,\\n.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,\\n.form-check-input.is-valid ~ .valid-tooltip {\\n  display: block;\\n}\\n\\n.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {\\n  color: #28a745;\\n}\\n\\n.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {\\n  border-color: #28a745;\\n}\\n\\n.was-validated .custom-control-input:valid ~ .valid-feedback,\\n.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback,\\n.custom-control-input.is-valid ~ .valid-tooltip {\\n  display: block;\\n}\\n\\n.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {\\n  border-color: #34ce57;\\n  background-color: #34ce57;\\n}\\n\\n.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before {\\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\\n}\\n\\n.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before {\\n  border-color: #28a745;\\n}\\n\\n.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {\\n  border-color: #28a745;\\n}\\n\\n.was-validated .custom-file-input:valid ~ .valid-feedback,\\n.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback,\\n.custom-file-input.is-valid ~ .valid-tooltip {\\n  display: block;\\n}\\n\\n.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {\\n  border-color: #28a745;\\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\\n}\\n\\n.invalid-feedback {\\n  display: none;\\n  width: 100%;\\n  margin-top: 0.25rem;\\n  font-size: 80%;\\n  color: #dc3545;\\n}\\n\\n.invalid-tooltip {\\n  position: absolute;\\n  top: 100%;\\n  z-index: 5;\\n  display: none;\\n  max-width: 100%;\\n  padding: 0.25rem 0.5rem;\\n  margin-top: .1rem;\\n  font-size: 0.875rem;\\n  line-height: 1.5;\\n  color: #fff;\\n  background-color: rgba(220, 53, 69, 0.9);\\n  border-radius: 0.25rem;\\n}\\n\\n.was-validated .form-control:invalid, .form-control.is-invalid {\\n  border-color: #dc3545;\\n  padding-right: calc(1.5em + 0.75rem);\\n  background-image: url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\\\");\\n  background-repeat: no-repeat;\\n  background-position: center right calc(0.375em + 0.1875rem);\\n  background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\\n}\\n\\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {\\n  border-color: #dc3545;\\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\\n}\\n\\n.was-validated .form-control:invalid ~ .invalid-feedback,\\n.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback,\\n.form-control.is-invalid ~ .invalid-tooltip {\\n  display: block;\\n}\\n\\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\\n  padding-right: calc(1.5em + 0.75rem);\\n  background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\\n}\\n\\n.was-validated .custom-select:invalid, .custom-select.is-invalid {\\n  border-color: #dc3545;\\n  padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);\\n  background: url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\\\") no-repeat right 0.75rem center/8px 10px, url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\\\") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\\n}\\n\\n.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {\\n  border-color: #dc3545;\\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\\n}\\n\\n.was-validated .custom-select:invalid ~ .invalid-feedback,\\n.was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback,\\n.custom-select.is-invalid ~ .invalid-tooltip {\\n  display: block;\\n}\\n\\n.was-validated .form-control-file:invalid ~ .invalid-feedback,\\n.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback,\\n.form-control-file.is-invalid ~ .invalid-tooltip {\\n  display: block;\\n}\\n\\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\\n  color: #dc3545;\\n}\\n\\n.was-validated .form-check-input:invalid ~ .invalid-feedback,\\n.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,\\n.form-check-input.is-invalid ~ .invalid-tooltip {\\n  display: block;\\n}\\n\\n.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {\\n  color: #dc3545;\\n}\\n\\n.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {\\n  border-color: #dc3545;\\n}\\n\\n.was-validated .custom-control-input:invalid ~ .invalid-feedback,\\n.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback,\\n.custom-control-input.is-invalid ~ .invalid-tooltip {\\n  display: block;\\n}\\n\\n.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {\\n  border-color: #e4606d;\\n  background-color: #e4606d;\\n}\\n\\n.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before {\\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\\n}\\n\\n.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before {\\n  border-color: #dc3545;\\n}\\n\\n.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {\\n  border-color: #dc3545;\\n}\\n\\n.was-validated .custom-file-input:invalid ~ .invalid-feedback,\\n.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback,\\n.custom-file-input.is-invalid ~ .invalid-tooltip {\\n  display: block;\\n}\\n\\n.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {\\n  border-color: #dc3545;\\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\\n}\\n\\n.form-inline {\\n  display: flex;\\n  flex-flow: row wrap;\\n  align-items: center;\\n}\\n\\n.form-inline .form-check {\\n  width: 100%;\\n}\\n\\n@media (min-width: 576px) {\\n  .form-inline label {\\n    display: flex;\\n    align-items: center;\\n    justify-content: center;\\n    margin-bottom: 0;\\n  }\\n  .form-inline .form-group {\\n    display: flex;\\n    flex: 0 0 auto;\\n    flex-flow: row wrap;\\n    align-items: center;\\n    margin-bottom: 0;\\n  }\\n  .form-inline .form-control {\\n    display: inline-block;\\n    width: auto;\\n    vertical-align: middle;\\n  }\\n  .form-inline .form-control-plaintext {\\n    display: inline-block;\\n  }\\n  .form-inline .input-group,\\n  .form-inline .custom-select {\\n    width: auto;\\n  }\\n  .form-inline .form-check {\\n    display: flex;\\n    align-items: center;\\n    justify-content: center;\\n    width: auto;\\n    padding-left: 0;\\n  }\\n  .form-inline .form-check-input {\\n    position: relative;\\n    flex-shrink: 0;\\n    margin-top: 0;\\n    margin-right: 0.25rem;\\n    margin-left: 0;\\n  }\\n  .form-inline .custom-control {\\n    align-items: center;\\n    justify-content: center;\\n  }\\n  .form-inline .custom-control-label {\\n    margin-bottom: 0;\\n  }\\n}\\n\\n.btn {\\n  display: inline-block;\\n  font-weight: 400;\\n  color: #212529;\\n  text-align: center;\\n  vertical-align: middle;\\n  user-select: none;\\n  background-color: transparent;\\n  border: 1px solid transparent;\\n  padding: 0.375rem 0.75rem;\\n  font-size: 1rem;\\n  line-height: 1.5;\\n  border-radius: 0.25rem;\\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .btn {\\n    transition: none;\\n  }\\n}\\n\\n.btn:hover {\\n  color: #212529;\\n  text-decoration: none;\\n}\\n\\n.btn:focus, .btn.focus {\\n  outline: 0;\\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\\n}\\n\\n.btn.disabled, .btn:disabled {\\n  opacity: 0.65;\\n}\\n\\na.btn.disabled,\\nfieldset:disabled a.btn {\\n  pointer-events: none;\\n}\\n\\n.btn-primary {\\n  color: #fff;\\n  background-color: #007bff;\\n  border-color: #007bff;\\n}\\n\\n.btn-primary:hover {\\n  color: #fff;\\n  background-color: #0069d9;\\n  border-color: #0062cc;\\n}\\n\\n.btn-primary:focus, .btn-primary.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);\\n}\\n\\n.btn-primary.disabled, .btn-primary:disabled {\\n  color: #fff;\\n  background-color: #007bff;\\n  border-color: #007bff;\\n}\\n\\n.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active,\\n.show > .btn-primary.dropdown-toggle {\\n  color: #fff;\\n  background-color: #0062cc;\\n  border-color: #005cbf;\\n}\\n\\n.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-primary.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);\\n}\\n\\n.btn-secondary {\\n  color: #fff;\\n  background-color: #6c757d;\\n  border-color: #6c757d;\\n}\\n\\n.btn-secondary:hover {\\n  color: #fff;\\n  background-color: #5a6268;\\n  border-color: #545b62;\\n}\\n\\n.btn-secondary:focus, .btn-secondary.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);\\n}\\n\\n.btn-secondary.disabled, .btn-secondary:disabled {\\n  color: #fff;\\n  background-color: #6c757d;\\n  border-color: #6c757d;\\n}\\n\\n.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active,\\n.show > .btn-secondary.dropdown-toggle {\\n  color: #fff;\\n  background-color: #545b62;\\n  border-color: #4e555b;\\n}\\n\\n.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-secondary.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);\\n}\\n\\n.btn-success {\\n  color: #fff;\\n  background-color: #28a745;\\n  border-color: #28a745;\\n}\\n\\n.btn-success:hover {\\n  color: #fff;\\n  background-color: #218838;\\n  border-color: #1e7e34;\\n}\\n\\n.btn-success:focus, .btn-success.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);\\n}\\n\\n.btn-success.disabled, .btn-success:disabled {\\n  color: #fff;\\n  background-color: #28a745;\\n  border-color: #28a745;\\n}\\n\\n.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active,\\n.show > .btn-success.dropdown-toggle {\\n  color: #fff;\\n  background-color: #1e7e34;\\n  border-color: #1c7430;\\n}\\n\\n.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-success.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);\\n}\\n\\n.btn-info {\\n  color: #fff;\\n  background-color: #17a2b8;\\n  border-color: #17a2b8;\\n}\\n\\n.btn-info:hover {\\n  color: #fff;\\n  background-color: #138496;\\n  border-color: #117a8b;\\n}\\n\\n.btn-info:focus, .btn-info.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\\n}\\n\\n.btn-info.disabled, .btn-info:disabled {\\n  color: #fff;\\n  background-color: #17a2b8;\\n  border-color: #17a2b8;\\n}\\n\\n.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active,\\n.show > .btn-info.dropdown-toggle {\\n  color: #fff;\\n  background-color: #117a8b;\\n  border-color: #10707f;\\n}\\n\\n.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-info.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\\n}\\n\\n.btn-warning {\\n  color: #212529;\\n  background-color: #ffc107;\\n  border-color: #ffc107;\\n}\\n\\n.btn-warning:hover {\\n  color: #212529;\\n  background-color: #e0a800;\\n  border-color: #d39e00;\\n}\\n\\n.btn-warning:focus, .btn-warning.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);\\n}\\n\\n.btn-warning.disabled, .btn-warning:disabled {\\n  color: #212529;\\n  background-color: #ffc107;\\n  border-color: #ffc107;\\n}\\n\\n.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active,\\n.show > .btn-warning.dropdown-toggle {\\n  color: #212529;\\n  background-color: #d39e00;\\n  border-color: #c69500;\\n}\\n\\n.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-warning.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);\\n}\\n\\n.btn-danger {\\n  color: #fff;\\n  background-color: #dc3545;\\n  border-color: #dc3545;\\n}\\n\\n.btn-danger:hover {\\n  color: #fff;\\n  background-color: #c82333;\\n  border-color: #bd2130;\\n}\\n\\n.btn-danger:focus, .btn-danger.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);\\n}\\n\\n.btn-danger.disabled, .btn-danger:disabled {\\n  color: #fff;\\n  background-color: #dc3545;\\n  border-color: #dc3545;\\n}\\n\\n.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active,\\n.show > .btn-danger.dropdown-toggle {\\n  color: #fff;\\n  background-color: #bd2130;\\n  border-color: #b21f2d;\\n}\\n\\n.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-danger.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);\\n}\\n\\n.btn-light {\\n  color: #212529;\\n  background-color: #f8f9fa;\\n  border-color: #f8f9fa;\\n}\\n\\n.btn-light:hover {\\n  color: #212529;\\n  background-color: #e2e6ea;\\n  border-color: #dae0e5;\\n}\\n\\n.btn-light:focus, .btn-light.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\\n}\\n\\n.btn-light.disabled, .btn-light:disabled {\\n  color: #212529;\\n  background-color: #f8f9fa;\\n  border-color: #f8f9fa;\\n}\\n\\n.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active,\\n.show > .btn-light.dropdown-toggle {\\n  color: #212529;\\n  background-color: #dae0e5;\\n  border-color: #d3d9df;\\n}\\n\\n.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-light.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\\n}\\n\\n.btn-dark {\\n  color: #fff;\\n  background-color: #343a40;\\n  border-color: #343a40;\\n}\\n\\n.btn-dark:hover {\\n  color: #fff;\\n  background-color: #23272b;\\n  border-color: #1d2124;\\n}\\n\\n.btn-dark:focus, .btn-dark.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\\n}\\n\\n.btn-dark.disabled, .btn-dark:disabled {\\n  color: #fff;\\n  background-color: #343a40;\\n  border-color: #343a40;\\n}\\n\\n.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active,\\n.show > .btn-dark.dropdown-toggle {\\n  color: #fff;\\n  background-color: #1d2124;\\n  border-color: #171a1d;\\n}\\n\\n.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-dark.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\\n}\\n\\n.btn-outline-primary {\\n  color: #007bff;\\n  border-color: #007bff;\\n}\\n\\n.btn-outline-primary:hover {\\n  color: #fff;\\n  background-color: #007bff;\\n  border-color: #007bff;\\n}\\n\\n.btn-outline-primary:focus, .btn-outline-primary.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\\n}\\n\\n.btn-outline-primary.disabled, .btn-outline-primary:disabled {\\n  color: #007bff;\\n  background-color: transparent;\\n}\\n\\n.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active,\\n.show > .btn-outline-primary.dropdown-toggle {\\n  color: #fff;\\n  background-color: #007bff;\\n  border-color: #007bff;\\n}\\n\\n.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-outline-primary.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\\n}\\n\\n.btn-outline-secondary {\\n  color: #6c757d;\\n  border-color: #6c757d;\\n}\\n\\n.btn-outline-secondary:hover {\\n  color: #fff;\\n  background-color: #6c757d;\\n  border-color: #6c757d;\\n}\\n\\n.btn-outline-secondary:focus, .btn-outline-secondary.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\\n}\\n\\n.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {\\n  color: #6c757d;\\n  background-color: transparent;\\n}\\n\\n.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active,\\n.show > .btn-outline-secondary.dropdown-toggle {\\n  color: #fff;\\n  background-color: #6c757d;\\n  border-color: #6c757d;\\n}\\n\\n.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-outline-secondary.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\\n}\\n\\n.btn-outline-success {\\n  color: #28a745;\\n  border-color: #28a745;\\n}\\n\\n.btn-outline-success:hover {\\n  color: #fff;\\n  background-color: #28a745;\\n  border-color: #28a745;\\n}\\n\\n.btn-outline-success:focus, .btn-outline-success.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\\n}\\n\\n.btn-outline-success.disabled, .btn-outline-success:disabled {\\n  color: #28a745;\\n  background-color: transparent;\\n}\\n\\n.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active,\\n.show > .btn-outline-success.dropdown-toggle {\\n  color: #fff;\\n  background-color: #28a745;\\n  border-color: #28a745;\\n}\\n\\n.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-outline-success.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\\n}\\n\\n.btn-outline-info {\\n  color: #17a2b8;\\n  border-color: #17a2b8;\\n}\\n\\n.btn-outline-info:hover {\\n  color: #fff;\\n  background-color: #17a2b8;\\n  border-color: #17a2b8;\\n}\\n\\n.btn-outline-info:focus, .btn-outline-info.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\\n}\\n\\n.btn-outline-info.disabled, .btn-outline-info:disabled {\\n  color: #17a2b8;\\n  background-color: transparent;\\n}\\n\\n.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active,\\n.show > .btn-outline-info.dropdown-toggle {\\n  color: #fff;\\n  background-color: #17a2b8;\\n  border-color: #17a2b8;\\n}\\n\\n.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-outline-info.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\\n}\\n\\n.btn-outline-warning {\\n  color: #ffc107;\\n  border-color: #ffc107;\\n}\\n\\n.btn-outline-warning:hover {\\n  color: #212529;\\n  background-color: #ffc107;\\n  border-color: #ffc107;\\n}\\n\\n.btn-outline-warning:focus, .btn-outline-warning.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\\n}\\n\\n.btn-outline-warning.disabled, .btn-outline-warning:disabled {\\n  color: #ffc107;\\n  background-color: transparent;\\n}\\n\\n.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active,\\n.show > .btn-outline-warning.dropdown-toggle {\\n  color: #212529;\\n  background-color: #ffc107;\\n  border-color: #ffc107;\\n}\\n\\n.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-outline-warning.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\\n}\\n\\n.btn-outline-danger {\\n  color: #dc3545;\\n  border-color: #dc3545;\\n}\\n\\n.btn-outline-danger:hover {\\n  color: #fff;\\n  background-color: #dc3545;\\n  border-color: #dc3545;\\n}\\n\\n.btn-outline-danger:focus, .btn-outline-danger.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\\n}\\n\\n.btn-outline-danger.disabled, .btn-outline-danger:disabled {\\n  color: #dc3545;\\n  background-color: transparent;\\n}\\n\\n.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active,\\n.show > .btn-outline-danger.dropdown-toggle {\\n  color: #fff;\\n  background-color: #dc3545;\\n  border-color: #dc3545;\\n}\\n\\n.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-outline-danger.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\\n}\\n\\n.btn-outline-light {\\n  color: #f8f9fa;\\n  border-color: #f8f9fa;\\n}\\n\\n.btn-outline-light:hover {\\n  color: #212529;\\n  background-color: #f8f9fa;\\n  border-color: #f8f9fa;\\n}\\n\\n.btn-outline-light:focus, .btn-outline-light.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\\n}\\n\\n.btn-outline-light.disabled, .btn-outline-light:disabled {\\n  color: #f8f9fa;\\n  background-color: transparent;\\n}\\n\\n.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active,\\n.show > .btn-outline-light.dropdown-toggle {\\n  color: #212529;\\n  background-color: #f8f9fa;\\n  border-color: #f8f9fa;\\n}\\n\\n.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-outline-light.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\\n}\\n\\n.btn-outline-dark {\\n  color: #343a40;\\n  border-color: #343a40;\\n}\\n\\n.btn-outline-dark:hover {\\n  color: #fff;\\n  background-color: #343a40;\\n  border-color: #343a40;\\n}\\n\\n.btn-outline-dark:focus, .btn-outline-dark.focus {\\n  box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\\n}\\n\\n.btn-outline-dark.disabled, .btn-outline-dark:disabled {\\n  color: #343a40;\\n  background-color: transparent;\\n}\\n\\n.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active,\\n.show > .btn-outline-dark.dropdown-toggle {\\n  color: #fff;\\n  background-color: #343a40;\\n  border-color: #343a40;\\n}\\n\\n.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus,\\n.show > .btn-outline-dark.dropdown-toggle:focus {\\n  box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\\n}\\n\\n.btn-link {\\n  font-weight: 400;\\n  color: #007bff;\\n  text-decoration: none;\\n}\\n\\n.btn-link:hover {\\n  color: #0056b3;\\n  text-decoration: underline;\\n}\\n\\n.btn-link:focus, .btn-link.focus {\\n  text-decoration: underline;\\n  box-shadow: none;\\n}\\n\\n.btn-link:disabled, .btn-link.disabled {\\n  color: #6c757d;\\n  pointer-events: none;\\n}\\n\\n.btn-lg, .btn-group-lg > .btn {\\n  padding: 0.5rem 1rem;\\n  font-size: 1.25rem;\\n  line-height: 1.5;\\n  border-radius: 0.3rem;\\n}\\n\\n.btn-sm, .btn-group-sm > .btn {\\n  padding: 0.25rem 0.5rem;\\n  font-size: 0.875rem;\\n  line-height: 1.5;\\n  border-radius: 0.2rem;\\n}\\n\\n.btn-block {\\n  display: block;\\n  width: 100%;\\n}\\n\\n.btn-block + .btn-block {\\n  margin-top: 0.5rem;\\n}\\n\\ninput[type=\\\"submit\\\"].btn-block,\\ninput[type=\\\"reset\\\"].btn-block,\\ninput[type=\\\"button\\\"].btn-block {\\n  width: 100%;\\n}\\n\\n.fade {\\n  transition: opacity 0.15s linear;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .fade {\\n    transition: none;\\n  }\\n}\\n\\n.fade:not(.show) {\\n  opacity: 0;\\n}\\n\\n.collapse:not(.show) {\\n  display: none;\\n}\\n\\n.collapsing {\\n  position: relative;\\n  height: 0;\\n  overflow: hidden;\\n  transition: height 0.35s ease;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .collapsing {\\n    transition: none;\\n  }\\n}\\n\\n.dropup,\\n.dropright,\\n.dropdown,\\n.dropleft {\\n  position: relative;\\n}\\n\\n.dropdown-toggle {\\n  white-space: nowrap;\\n}\\n\\n.dropdown-toggle::after {\\n  display: inline-block;\\n  margin-left: 0.255em;\\n  vertical-align: 0.255em;\\n  content: \\\"\\\";\\n  border-top: 0.3em solid;\\n  border-right: 0.3em solid transparent;\\n  border-bottom: 0;\\n  border-left: 0.3em solid transparent;\\n}\\n\\n.dropdown-toggle:empty::after {\\n  margin-left: 0;\\n}\\n\\n.dropdown-menu {\\n  position: absolute;\\n  top: 100%;\\n  left: 0;\\n  z-index: 1000;\\n  display: none;\\n  float: left;\\n  min-width: 10rem;\\n  padding: 0.5rem 0;\\n  margin: 0.125rem 0 0;\\n  font-size: 1rem;\\n  color: #212529;\\n  text-align: left;\\n  list-style: none;\\n  background-color: #fff;\\n  background-clip: padding-box;\\n  border: 1px solid rgba(0, 0, 0, 0.15);\\n  border-radius: 0.25rem;\\n}\\n\\n.dropdown-menu-left {\\n  right: auto;\\n  left: 0;\\n}\\n\\n.dropdown-menu-right {\\n  right: 0;\\n  left: auto;\\n}\\n\\n@media (min-width: 576px) {\\n  .dropdown-menu-sm-left {\\n    right: auto;\\n    left: 0;\\n  }\\n  .dropdown-menu-sm-right {\\n    right: 0;\\n    left: auto;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .dropdown-menu-md-left {\\n    right: auto;\\n    left: 0;\\n  }\\n  .dropdown-menu-md-right {\\n    right: 0;\\n    left: auto;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .dropdown-menu-lg-left {\\n    right: auto;\\n    left: 0;\\n  }\\n  .dropdown-menu-lg-right {\\n    right: 0;\\n    left: auto;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .dropdown-menu-xl-left {\\n    right: auto;\\n    left: 0;\\n  }\\n  .dropdown-menu-xl-right {\\n    right: 0;\\n    left: auto;\\n  }\\n}\\n\\n.dropup .dropdown-menu {\\n  top: auto;\\n  bottom: 100%;\\n  margin-top: 0;\\n  margin-bottom: 0.125rem;\\n}\\n\\n.dropup .dropdown-toggle::after {\\n  display: inline-block;\\n  margin-left: 0.255em;\\n  vertical-align: 0.255em;\\n  content: \\\"\\\";\\n  border-top: 0;\\n  border-right: 0.3em solid transparent;\\n  border-bottom: 0.3em solid;\\n  border-left: 0.3em solid transparent;\\n}\\n\\n.dropup .dropdown-toggle:empty::after {\\n  margin-left: 0;\\n}\\n\\n.dropright .dropdown-menu {\\n  top: 0;\\n  right: auto;\\n  left: 100%;\\n  margin-top: 0;\\n  margin-left: 0.125rem;\\n}\\n\\n.dropright .dropdown-toggle::after {\\n  display: inline-block;\\n  margin-left: 0.255em;\\n  vertical-align: 0.255em;\\n  content: \\\"\\\";\\n  border-top: 0.3em solid transparent;\\n  border-right: 0;\\n  border-bottom: 0.3em solid transparent;\\n  border-left: 0.3em solid;\\n}\\n\\n.dropright .dropdown-toggle:empty::after {\\n  margin-left: 0;\\n}\\n\\n.dropright .dropdown-toggle::after {\\n  vertical-align: 0;\\n}\\n\\n.dropleft .dropdown-menu {\\n  top: 0;\\n  right: 100%;\\n  left: auto;\\n  margin-top: 0;\\n  margin-right: 0.125rem;\\n}\\n\\n.dropleft .dropdown-toggle::after {\\n  display: inline-block;\\n  margin-left: 0.255em;\\n  vertical-align: 0.255em;\\n  content: \\\"\\\";\\n}\\n\\n.dropleft .dropdown-toggle::after {\\n  display: none;\\n}\\n\\n.dropleft .dropdown-toggle::before {\\n  display: inline-block;\\n  margin-right: 0.255em;\\n  vertical-align: 0.255em;\\n  content: \\\"\\\";\\n  border-top: 0.3em solid transparent;\\n  border-right: 0.3em solid;\\n  border-bottom: 0.3em solid transparent;\\n}\\n\\n.dropleft .dropdown-toggle:empty::after {\\n  margin-left: 0;\\n}\\n\\n.dropleft .dropdown-toggle::before {\\n  vertical-align: 0;\\n}\\n\\n.dropdown-menu[x-placement^=\\\"top\\\"], .dropdown-menu[x-placement^=\\\"right\\\"], .dropdown-menu[x-placement^=\\\"bottom\\\"], .dropdown-menu[x-placement^=\\\"left\\\"] {\\n  right: auto;\\n  bottom: auto;\\n}\\n\\n.dropdown-divider {\\n  height: 0;\\n  margin: 0.5rem 0;\\n  overflow: hidden;\\n  border-top: 1px solid #e9ecef;\\n}\\n\\n.dropdown-item {\\n  display: block;\\n  width: 100%;\\n  padding: 0.25rem 1.5rem;\\n  clear: both;\\n  font-weight: 400;\\n  color: #212529;\\n  text-align: inherit;\\n  white-space: nowrap;\\n  background-color: transparent;\\n  border: 0;\\n}\\n\\n.dropdown-item:hover, .dropdown-item:focus {\\n  color: #16181b;\\n  text-decoration: none;\\n  background-color: #f8f9fa;\\n}\\n\\n.dropdown-item.active, .dropdown-item:active {\\n  color: #fff;\\n  text-decoration: none;\\n  background-color: #007bff;\\n}\\n\\n.dropdown-item.disabled, .dropdown-item:disabled {\\n  color: #6c757d;\\n  pointer-events: none;\\n  background-color: transparent;\\n}\\n\\n.dropdown-menu.show {\\n  display: block;\\n}\\n\\n.dropdown-header {\\n  display: block;\\n  padding: 0.5rem 1.5rem;\\n  margin-bottom: 0;\\n  font-size: 0.875rem;\\n  color: #6c757d;\\n  white-space: nowrap;\\n}\\n\\n.dropdown-item-text {\\n  display: block;\\n  padding: 0.25rem 1.5rem;\\n  color: #212529;\\n}\\n\\n.btn-group,\\n.btn-group-vertical {\\n  position: relative;\\n  display: inline-flex;\\n  vertical-align: middle;\\n}\\n\\n.btn-group > .btn,\\n.btn-group-vertical > .btn {\\n  position: relative;\\n  flex: 1 1 auto;\\n}\\n\\n.btn-group > .btn:hover,\\n.btn-group-vertical > .btn:hover {\\n  z-index: 1;\\n}\\n\\n.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\\n.btn-group-vertical > .btn:focus,\\n.btn-group-vertical > .btn:active,\\n.btn-group-vertical > .btn.active {\\n  z-index: 1;\\n}\\n\\n.btn-toolbar {\\n  display: flex;\\n  flex-wrap: wrap;\\n  justify-content: flex-start;\\n}\\n\\n.btn-toolbar .input-group {\\n  width: auto;\\n}\\n\\n.btn-group > .btn:not(:first-child),\\n.btn-group > .btn-group:not(:first-child) {\\n  margin-left: -1px;\\n}\\n\\n.btn-group > .btn:not(:last-child):not(.dropdown-toggle),\\n.btn-group > .btn-group:not(:last-child) > .btn {\\n  border-top-right-radius: 0;\\n  border-bottom-right-radius: 0;\\n}\\n\\n.btn-group > .btn:not(:first-child),\\n.btn-group > .btn-group:not(:first-child) > .btn {\\n  border-top-left-radius: 0;\\n  border-bottom-left-radius: 0;\\n}\\n\\n.dropdown-toggle-split {\\n  padding-right: 0.5625rem;\\n  padding-left: 0.5625rem;\\n}\\n\\n.dropdown-toggle-split::after,\\n.dropup .dropdown-toggle-split::after,\\n.dropright .dropdown-toggle-split::after {\\n  margin-left: 0;\\n}\\n\\n.dropleft .dropdown-toggle-split::before {\\n  margin-right: 0;\\n}\\n\\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\\n  padding-right: 0.375rem;\\n  padding-left: 0.375rem;\\n}\\n\\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\\n  padding-right: 0.75rem;\\n  padding-left: 0.75rem;\\n}\\n\\n.btn-group-vertical {\\n  flex-direction: column;\\n  align-items: flex-start;\\n  justify-content: center;\\n}\\n\\n.btn-group-vertical > .btn,\\n.btn-group-vertical > .btn-group {\\n  width: 100%;\\n}\\n\\n.btn-group-vertical > .btn:not(:first-child),\\n.btn-group-vertical > .btn-group:not(:first-child) {\\n  margin-top: -1px;\\n}\\n\\n.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),\\n.btn-group-vertical > .btn-group:not(:last-child) > .btn {\\n  border-bottom-right-radius: 0;\\n  border-bottom-left-radius: 0;\\n}\\n\\n.btn-group-vertical > .btn:not(:first-child),\\n.btn-group-vertical > .btn-group:not(:first-child) > .btn {\\n  border-top-left-radius: 0;\\n  border-top-right-radius: 0;\\n}\\n\\n.btn-group-toggle > .btn,\\n.btn-group-toggle > .btn-group > .btn {\\n  margin-bottom: 0;\\n}\\n\\n.btn-group-toggle > .btn input[type=\\\"radio\\\"],\\n.btn-group-toggle > .btn input[type=\\\"checkbox\\\"],\\n.btn-group-toggle > .btn-group > .btn input[type=\\\"radio\\\"],\\n.btn-group-toggle > .btn-group > .btn input[type=\\\"checkbox\\\"] {\\n  position: absolute;\\n  clip: rect(0, 0, 0, 0);\\n  pointer-events: none;\\n}\\n\\n.input-group {\\n  position: relative;\\n  display: flex;\\n  flex-wrap: wrap;\\n  align-items: stretch;\\n  width: 100%;\\n}\\n\\n.input-group > .form-control,\\n.input-group > .form-control-plaintext,\\n.input-group > .custom-select,\\n.input-group > .custom-file {\\n  position: relative;\\n  flex: 1 1 auto;\\n  width: 1%;\\n  margin-bottom: 0;\\n}\\n\\n.input-group > .form-control + .form-control,\\n.input-group > .form-control + .custom-select,\\n.input-group > .form-control + .custom-file,\\n.input-group > .form-control-plaintext + .form-control,\\n.input-group > .form-control-plaintext + .custom-select,\\n.input-group > .form-control-plaintext + .custom-file,\\n.input-group > .custom-select + .form-control,\\n.input-group > .custom-select + .custom-select,\\n.input-group > .custom-select + .custom-file,\\n.input-group > .custom-file + .form-control,\\n.input-group > .custom-file + .custom-select,\\n.input-group > .custom-file + .custom-file {\\n  margin-left: -1px;\\n}\\n\\n.input-group > .form-control:focus,\\n.input-group > .custom-select:focus,\\n.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label {\\n  z-index: 3;\\n}\\n\\n.input-group > .custom-file .custom-file-input:focus {\\n  z-index: 4;\\n}\\n\\n.input-group > .form-control:not(:last-child),\\n.input-group > .custom-select:not(:last-child) {\\n  border-top-right-radius: 0;\\n  border-bottom-right-radius: 0;\\n}\\n\\n.input-group > .form-control:not(:first-child),\\n.input-group > .custom-select:not(:first-child) {\\n  border-top-left-radius: 0;\\n  border-bottom-left-radius: 0;\\n}\\n\\n.input-group > .custom-file {\\n  display: flex;\\n  align-items: center;\\n}\\n\\n.input-group > .custom-file:not(:last-child) .custom-file-label,\\n.input-group > .custom-file:not(:last-child) .custom-file-label::after {\\n  border-top-right-radius: 0;\\n  border-bottom-right-radius: 0;\\n}\\n\\n.input-group > .custom-file:not(:first-child) .custom-file-label {\\n  border-top-left-radius: 0;\\n  border-bottom-left-radius: 0;\\n}\\n\\n.input-group-prepend,\\n.input-group-append {\\n  display: flex;\\n}\\n\\n.input-group-prepend .btn,\\n.input-group-append .btn {\\n  position: relative;\\n  z-index: 2;\\n}\\n\\n.input-group-prepend .btn:focus,\\n.input-group-append .btn:focus {\\n  z-index: 3;\\n}\\n\\n.input-group-prepend .btn + .btn,\\n.input-group-prepend .btn + .input-group-text,\\n.input-group-prepend .input-group-text + .input-group-text,\\n.input-group-prepend .input-group-text + .btn,\\n.input-group-append .btn + .btn,\\n.input-group-append .btn + .input-group-text,\\n.input-group-append .input-group-text + .input-group-text,\\n.input-group-append .input-group-text + .btn {\\n  margin-left: -1px;\\n}\\n\\n.input-group-prepend {\\n  margin-right: -1px;\\n}\\n\\n.input-group-append {\\n  margin-left: -1px;\\n}\\n\\n.input-group-text {\\n  display: flex;\\n  align-items: center;\\n  padding: 0.375rem 0.75rem;\\n  margin-bottom: 0;\\n  font-size: 1rem;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  color: #495057;\\n  text-align: center;\\n  white-space: nowrap;\\n  background-color: #e9ecef;\\n  border: 1px solid #ced4da;\\n  border-radius: 0.25rem;\\n}\\n\\n.input-group-text input[type=\\\"radio\\\"],\\n.input-group-text input[type=\\\"checkbox\\\"] {\\n  margin-top: 0;\\n}\\n\\n.input-group-lg > .form-control:not(textarea),\\n.input-group-lg > .custom-select {\\n  height: calc(1.5em + 1rem + 2px);\\n}\\n\\n.input-group-lg > .form-control,\\n.input-group-lg > .custom-select,\\n.input-group-lg > .input-group-prepend > .input-group-text,\\n.input-group-lg > .input-group-append > .input-group-text,\\n.input-group-lg > .input-group-prepend > .btn,\\n.input-group-lg > .input-group-append > .btn {\\n  padding: 0.5rem 1rem;\\n  font-size: 1.25rem;\\n  line-height: 1.5;\\n  border-radius: 0.3rem;\\n}\\n\\n.input-group-sm > .form-control:not(textarea),\\n.input-group-sm > .custom-select {\\n  height: calc(1.5em + 0.5rem + 2px);\\n}\\n\\n.input-group-sm > .form-control,\\n.input-group-sm > .custom-select,\\n.input-group-sm > .input-group-prepend > .input-group-text,\\n.input-group-sm > .input-group-append > .input-group-text,\\n.input-group-sm > .input-group-prepend > .btn,\\n.input-group-sm > .input-group-append > .btn {\\n  padding: 0.25rem 0.5rem;\\n  font-size: 0.875rem;\\n  line-height: 1.5;\\n  border-radius: 0.2rem;\\n}\\n\\n.input-group-lg > .custom-select,\\n.input-group-sm > .custom-select {\\n  padding-right: 1.75rem;\\n}\\n\\n.input-group > .input-group-prepend > .btn,\\n.input-group > .input-group-prepend > .input-group-text,\\n.input-group > .input-group-append:not(:last-child) > .btn,\\n.input-group > .input-group-append:not(:last-child) > .input-group-text,\\n.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),\\n.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {\\n  border-top-right-radius: 0;\\n  border-bottom-right-radius: 0;\\n}\\n\\n.input-group > .input-group-append > .btn,\\n.input-group > .input-group-append > .input-group-text,\\n.input-group > .input-group-prepend:not(:first-child) > .btn,\\n.input-group > .input-group-prepend:not(:first-child) > .input-group-text,\\n.input-group > .input-group-prepend:first-child > .btn:not(:first-child),\\n.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {\\n  border-top-left-radius: 0;\\n  border-bottom-left-radius: 0;\\n}\\n\\n.custom-control {\\n  position: relative;\\n  display: block;\\n  min-height: 1.5rem;\\n  padding-left: 1.5rem;\\n}\\n\\n.custom-control-inline {\\n  display: inline-flex;\\n  margin-right: 1rem;\\n}\\n\\n.custom-control-input {\\n  position: absolute;\\n  z-index: -1;\\n  opacity: 0;\\n}\\n\\n.custom-control-input:checked ~ .custom-control-label::before {\\n  color: #fff;\\n  border-color: #007bff;\\n  background-color: #007bff;\\n}\\n\\n.custom-control-input:focus ~ .custom-control-label::before {\\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\\n}\\n\\n.custom-control-input:focus:not(:checked) ~ .custom-control-label::before {\\n  border-color: #80bdff;\\n}\\n\\n.custom-control-input:not(:disabled):active ~ .custom-control-label::before {\\n  color: #fff;\\n  background-color: #b3d7ff;\\n  border-color: #b3d7ff;\\n}\\n\\n.custom-control-input:disabled ~ .custom-control-label {\\n  color: #6c757d;\\n}\\n\\n.custom-control-input:disabled ~ .custom-control-label::before {\\n  background-color: #e9ecef;\\n}\\n\\n.custom-control-label {\\n  position: relative;\\n  margin-bottom: 0;\\n  vertical-align: top;\\n}\\n\\n.custom-control-label::before {\\n  position: absolute;\\n  top: 0.25rem;\\n  left: -1.5rem;\\n  display: block;\\n  width: 1rem;\\n  height: 1rem;\\n  pointer-events: none;\\n  content: \\\"\\\";\\n  background-color: #fff;\\n  border: #adb5bd solid 1px;\\n}\\n\\n.custom-control-label::after {\\n  position: absolute;\\n  top: 0.25rem;\\n  left: -1.5rem;\\n  display: block;\\n  width: 1rem;\\n  height: 1rem;\\n  content: \\\"\\\";\\n  background: no-repeat 50% / 50% 50%;\\n}\\n\\n.custom-checkbox .custom-control-label::before {\\n  border-radius: 0.25rem;\\n}\\n\\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {\\n  background-image: url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e\\\");\\n}\\n\\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {\\n  border-color: #007bff;\\n  background-color: #007bff;\\n}\\n\\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {\\n  background-image: url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e\\\");\\n}\\n\\n.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {\\n  background-color: rgba(0, 123, 255, 0.5);\\n}\\n\\n.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before {\\n  background-color: rgba(0, 123, 255, 0.5);\\n}\\n\\n.custom-radio .custom-control-label::before {\\n  border-radius: 50%;\\n}\\n\\n.custom-radio .custom-control-input:checked ~ .custom-control-label::after {\\n  background-image: url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e\\\");\\n}\\n\\n.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {\\n  background-color: rgba(0, 123, 255, 0.5);\\n}\\n\\n.custom-switch {\\n  padding-left: 2.25rem;\\n}\\n\\n.custom-switch .custom-control-label::before {\\n  left: -2.25rem;\\n  width: 1.75rem;\\n  pointer-events: all;\\n  border-radius: 0.5rem;\\n}\\n\\n.custom-switch .custom-control-label::after {\\n  top: calc(0.25rem + 2px);\\n  left: calc(-2.25rem + 2px);\\n  width: calc(1rem - 4px);\\n  height: calc(1rem - 4px);\\n  background-color: #adb5bd;\\n  border-radius: 0.5rem;\\n  transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .custom-switch .custom-control-label::after {\\n    transition: none;\\n  }\\n}\\n\\n.custom-switch .custom-control-input:checked ~ .custom-control-label::after {\\n  background-color: #fff;\\n  transform: translateX(0.75rem);\\n}\\n\\n.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before {\\n  background-color: rgba(0, 123, 255, 0.5);\\n}\\n\\n.custom-select {\\n  display: inline-block;\\n  width: 100%;\\n  height: calc(1.5em + 0.75rem + 2px);\\n  padding: 0.375rem 1.75rem 0.375rem 0.75rem;\\n  font-size: 1rem;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  color: #495057;\\n  vertical-align: middle;\\n  background: url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\\\") no-repeat right 0.75rem center/8px 10px;\\n  background-color: #fff;\\n  border: 1px solid #ced4da;\\n  border-radius: 0.25rem;\\n  appearance: none;\\n}\\n\\n.custom-select:focus {\\n  border-color: #80bdff;\\n  outline: 0;\\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\\n}\\n\\n.custom-select:focus::-ms-value {\\n  color: #495057;\\n  background-color: #fff;\\n}\\n\\n.custom-select[multiple], .custom-select[size]:not([size=\\\"1\\\"]) {\\n  height: auto;\\n  padding-right: 0.75rem;\\n  background-image: none;\\n}\\n\\n.custom-select:disabled {\\n  color: #6c757d;\\n  background-color: #e9ecef;\\n}\\n\\n.custom-select::-ms-expand {\\n  display: none;\\n}\\n\\n.custom-select-sm {\\n  height: calc(1.5em + 0.5rem + 2px);\\n  padding-top: 0.25rem;\\n  padding-bottom: 0.25rem;\\n  padding-left: 0.5rem;\\n  font-size: 0.875rem;\\n}\\n\\n.custom-select-lg {\\n  height: calc(1.5em + 1rem + 2px);\\n  padding-top: 0.5rem;\\n  padding-bottom: 0.5rem;\\n  padding-left: 1rem;\\n  font-size: 1.25rem;\\n}\\n\\n.custom-file {\\n  position: relative;\\n  display: inline-block;\\n  width: 100%;\\n  height: calc(1.5em + 0.75rem + 2px);\\n  margin-bottom: 0;\\n}\\n\\n.custom-file-input {\\n  position: relative;\\n  z-index: 2;\\n  width: 100%;\\n  height: calc(1.5em + 0.75rem + 2px);\\n  margin: 0;\\n  opacity: 0;\\n}\\n\\n.custom-file-input:focus ~ .custom-file-label {\\n  border-color: #80bdff;\\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\\n}\\n\\n.custom-file-input:disabled ~ .custom-file-label {\\n  background-color: #e9ecef;\\n}\\n\\n.custom-file-input:lang(en) ~ .custom-file-label::after {\\n  content: \\\"Browse\\\";\\n}\\n\\n.custom-file-input ~ .custom-file-label[data-browse]::after {\\n  content: attr(data-browse);\\n}\\n\\n.custom-file-label {\\n  position: absolute;\\n  top: 0;\\n  right: 0;\\n  left: 0;\\n  z-index: 1;\\n  height: calc(1.5em + 0.75rem + 2px);\\n  padding: 0.375rem 0.75rem;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  color: #495057;\\n  background-color: #fff;\\n  border: 1px solid #ced4da;\\n  border-radius: 0.25rem;\\n}\\n\\n.custom-file-label::after {\\n  position: absolute;\\n  top: 0;\\n  right: 0;\\n  bottom: 0;\\n  z-index: 3;\\n  display: block;\\n  height: calc(1.5em + 0.75rem);\\n  padding: 0.375rem 0.75rem;\\n  line-height: 1.5;\\n  color: #495057;\\n  content: \\\"Browse\\\";\\n  background-color: #e9ecef;\\n  border-left: inherit;\\n  border-radius: 0 0.25rem 0.25rem 0;\\n}\\n\\n.custom-range {\\n  width: 100%;\\n  height: calc(1rem + 0.4rem);\\n  padding: 0;\\n  background-color: transparent;\\n  appearance: none;\\n}\\n\\n.custom-range:focus {\\n  outline: none;\\n}\\n\\n.custom-range:focus::-webkit-slider-thumb {\\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\\n}\\n\\n.custom-range:focus::-moz-range-thumb {\\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\\n}\\n\\n.custom-range:focus::-ms-thumb {\\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\\n}\\n\\n.custom-range::-moz-focus-outer {\\n  border: 0;\\n}\\n\\n.custom-range::-webkit-slider-thumb {\\n  width: 1rem;\\n  height: 1rem;\\n  margin-top: -0.25rem;\\n  background-color: #007bff;\\n  border: 0;\\n  border-radius: 1rem;\\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\\n  appearance: none;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .custom-range::-webkit-slider-thumb {\\n    transition: none;\\n  }\\n}\\n\\n.custom-range::-webkit-slider-thumb:active {\\n  background-color: #b3d7ff;\\n}\\n\\n.custom-range::-webkit-slider-runnable-track {\\n  width: 100%;\\n  height: 0.5rem;\\n  color: transparent;\\n  cursor: pointer;\\n  background-color: #dee2e6;\\n  border-color: transparent;\\n  border-radius: 1rem;\\n}\\n\\n.custom-range::-moz-range-thumb {\\n  width: 1rem;\\n  height: 1rem;\\n  background-color: #007bff;\\n  border: 0;\\n  border-radius: 1rem;\\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\\n  appearance: none;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .custom-range::-moz-range-thumb {\\n    transition: none;\\n  }\\n}\\n\\n.custom-range::-moz-range-thumb:active {\\n  background-color: #b3d7ff;\\n}\\n\\n.custom-range::-moz-range-track {\\n  width: 100%;\\n  height: 0.5rem;\\n  color: transparent;\\n  cursor: pointer;\\n  background-color: #dee2e6;\\n  border-color: transparent;\\n  border-radius: 1rem;\\n}\\n\\n.custom-range::-ms-thumb {\\n  width: 1rem;\\n  height: 1rem;\\n  margin-top: 0;\\n  margin-right: 0.2rem;\\n  margin-left: 0.2rem;\\n  background-color: #007bff;\\n  border: 0;\\n  border-radius: 1rem;\\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\\n  appearance: none;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .custom-range::-ms-thumb {\\n    transition: none;\\n  }\\n}\\n\\n.custom-range::-ms-thumb:active {\\n  background-color: #b3d7ff;\\n}\\n\\n.custom-range::-ms-track {\\n  width: 100%;\\n  height: 0.5rem;\\n  color: transparent;\\n  cursor: pointer;\\n  background-color: transparent;\\n  border-color: transparent;\\n  border-width: 0.5rem;\\n}\\n\\n.custom-range::-ms-fill-lower {\\n  background-color: #dee2e6;\\n  border-radius: 1rem;\\n}\\n\\n.custom-range::-ms-fill-upper {\\n  margin-right: 15px;\\n  background-color: #dee2e6;\\n  border-radius: 1rem;\\n}\\n\\n.custom-range:disabled::-webkit-slider-thumb {\\n  background-color: #adb5bd;\\n}\\n\\n.custom-range:disabled::-webkit-slider-runnable-track {\\n  cursor: default;\\n}\\n\\n.custom-range:disabled::-moz-range-thumb {\\n  background-color: #adb5bd;\\n}\\n\\n.custom-range:disabled::-moz-range-track {\\n  cursor: default;\\n}\\n\\n.custom-range:disabled::-ms-thumb {\\n  background-color: #adb5bd;\\n}\\n\\n.custom-control-label::before,\\n.custom-file-label,\\n.custom-select {\\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .custom-control-label::before,\\n  .custom-file-label,\\n  .custom-select {\\n    transition: none;\\n  }\\n}\\n\\n.nav {\\n  display: flex;\\n  flex-wrap: wrap;\\n  padding-left: 0;\\n  margin-bottom: 0;\\n  list-style: none;\\n}\\n\\n.nav-link {\\n  display: block;\\n  padding: 0.5rem 1rem;\\n}\\n\\n.nav-link:hover, .nav-link:focus {\\n  text-decoration: none;\\n}\\n\\n.nav-link.disabled {\\n  color: #6c757d;\\n  pointer-events: none;\\n  cursor: default;\\n}\\n\\n.nav-tabs {\\n  border-bottom: 1px solid #dee2e6;\\n}\\n\\n.nav-tabs .nav-item {\\n  margin-bottom: -1px;\\n}\\n\\n.nav-tabs .nav-link {\\n  border: 1px solid transparent;\\n  border-top-left-radius: 0.25rem;\\n  border-top-right-radius: 0.25rem;\\n}\\n\\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\\n  border-color: #e9ecef #e9ecef #dee2e6;\\n}\\n\\n.nav-tabs .nav-link.disabled {\\n  color: #6c757d;\\n  background-color: transparent;\\n  border-color: transparent;\\n}\\n\\n.nav-tabs .nav-link.active,\\n.nav-tabs .nav-item.show .nav-link {\\n  color: #495057;\\n  background-color: #fff;\\n  border-color: #dee2e6 #dee2e6 #fff;\\n}\\n\\n.nav-tabs .dropdown-menu {\\n  margin-top: -1px;\\n  border-top-left-radius: 0;\\n  border-top-right-radius: 0;\\n}\\n\\n.nav-pills .nav-link {\\n  border-radius: 0.25rem;\\n}\\n\\n.nav-pills .nav-link.active,\\n.nav-pills .show > .nav-link {\\n  color: #fff;\\n  background-color: #007bff;\\n}\\n\\n.nav-fill .nav-item {\\n  flex: 1 1 auto;\\n  text-align: center;\\n}\\n\\n.nav-justified .nav-item {\\n  flex-basis: 0;\\n  flex-grow: 1;\\n  text-align: center;\\n}\\n\\n.tab-content > .tab-pane {\\n  display: none;\\n}\\n\\n.tab-content > .active {\\n  display: block;\\n}\\n\\n.navbar {\\n  position: relative;\\n  display: flex;\\n  flex-wrap: wrap;\\n  align-items: center;\\n  justify-content: space-between;\\n  padding: 0.5rem 1rem;\\n}\\n\\n.navbar > .container,\\n.navbar > .container-fluid {\\n  display: flex;\\n  flex-wrap: wrap;\\n  align-items: center;\\n  justify-content: space-between;\\n}\\n\\n.navbar-brand {\\n  display: inline-block;\\n  padding-top: 0.3125rem;\\n  padding-bottom: 0.3125rem;\\n  margin-right: 1rem;\\n  font-size: 1.25rem;\\n  line-height: inherit;\\n  white-space: nowrap;\\n}\\n\\n.navbar-brand:hover, .navbar-brand:focus {\\n  text-decoration: none;\\n}\\n\\n.navbar-nav {\\n  display: flex;\\n  flex-direction: column;\\n  padding-left: 0;\\n  margin-bottom: 0;\\n  list-style: none;\\n}\\n\\n.navbar-nav .nav-link {\\n  padding-right: 0;\\n  padding-left: 0;\\n}\\n\\n.navbar-nav .dropdown-menu {\\n  position: static;\\n  float: none;\\n}\\n\\n.navbar-text {\\n  display: inline-block;\\n  padding-top: 0.5rem;\\n  padding-bottom: 0.5rem;\\n}\\n\\n.navbar-collapse {\\n  flex-basis: 100%;\\n  flex-grow: 1;\\n  align-items: center;\\n}\\n\\n.navbar-toggler {\\n  padding: 0.25rem 0.75rem;\\n  font-size: 1.25rem;\\n  line-height: 1;\\n  background-color: transparent;\\n  border: 1px solid transparent;\\n  border-radius: 0.25rem;\\n}\\n\\n.navbar-toggler:hover, .navbar-toggler:focus {\\n  text-decoration: none;\\n}\\n\\n.navbar-toggler-icon {\\n  display: inline-block;\\n  width: 1.5em;\\n  height: 1.5em;\\n  vertical-align: middle;\\n  content: \\\"\\\";\\n  background: no-repeat center center;\\n  background-size: 100% 100%;\\n}\\n\\n@media (max-width: 575.98px) {\\n  .navbar-expand-sm > .container,\\n  .navbar-expand-sm > .container-fluid {\\n    padding-right: 0;\\n    padding-left: 0;\\n  }\\n}\\n\\n@media (min-width: 576px) {\\n  .navbar-expand-sm {\\n    flex-flow: row nowrap;\\n    justify-content: flex-start;\\n  }\\n  .navbar-expand-sm .navbar-nav {\\n    flex-direction: row;\\n  }\\n  .navbar-expand-sm .navbar-nav .dropdown-menu {\\n    position: absolute;\\n  }\\n  .navbar-expand-sm .navbar-nav .nav-link {\\n    padding-right: 0.5rem;\\n    padding-left: 0.5rem;\\n  }\\n  .navbar-expand-sm > .container,\\n  .navbar-expand-sm > .container-fluid {\\n    flex-wrap: nowrap;\\n  }\\n  .navbar-expand-sm .navbar-collapse {\\n    display: flex !important;\\n    flex-basis: auto;\\n  }\\n  .navbar-expand-sm .navbar-toggler {\\n    display: none;\\n  }\\n}\\n\\n@media (max-width: 767.98px) {\\n  .navbar-expand-md > .container,\\n  .navbar-expand-md > .container-fluid {\\n    padding-right: 0;\\n    padding-left: 0;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .navbar-expand-md {\\n    flex-flow: row nowrap;\\n    justify-content: flex-start;\\n  }\\n  .navbar-expand-md .navbar-nav {\\n    flex-direction: row;\\n  }\\n  .navbar-expand-md .navbar-nav .dropdown-menu {\\n    position: absolute;\\n  }\\n  .navbar-expand-md .navbar-nav .nav-link {\\n    padding-right: 0.5rem;\\n    padding-left: 0.5rem;\\n  }\\n  .navbar-expand-md > .container,\\n  .navbar-expand-md > .container-fluid {\\n    flex-wrap: nowrap;\\n  }\\n  .navbar-expand-md .navbar-collapse {\\n    display: flex !important;\\n    flex-basis: auto;\\n  }\\n  .navbar-expand-md .navbar-toggler {\\n    display: none;\\n  }\\n}\\n\\n@media (max-width: 991.98px) {\\n  .navbar-expand-lg > .container,\\n  .navbar-expand-lg > .container-fluid {\\n    padding-right: 0;\\n    padding-left: 0;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .navbar-expand-lg {\\n    flex-flow: row nowrap;\\n    justify-content: flex-start;\\n  }\\n  .navbar-expand-lg .navbar-nav {\\n    flex-direction: row;\\n  }\\n  .navbar-expand-lg .navbar-nav .dropdown-menu {\\n    position: absolute;\\n  }\\n  .navbar-expand-lg .navbar-nav .nav-link {\\n    padding-right: 0.5rem;\\n    padding-left: 0.5rem;\\n  }\\n  .navbar-expand-lg > .container,\\n  .navbar-expand-lg > .container-fluid {\\n    flex-wrap: nowrap;\\n  }\\n  .navbar-expand-lg .navbar-collapse {\\n    display: flex !important;\\n    flex-basis: auto;\\n  }\\n  .navbar-expand-lg .navbar-toggler {\\n    display: none;\\n  }\\n}\\n\\n@media (max-width: 1199.98px) {\\n  .navbar-expand-xl > .container,\\n  .navbar-expand-xl > .container-fluid {\\n    padding-right: 0;\\n    padding-left: 0;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .navbar-expand-xl {\\n    flex-flow: row nowrap;\\n    justify-content: flex-start;\\n  }\\n  .navbar-expand-xl .navbar-nav {\\n    flex-direction: row;\\n  }\\n  .navbar-expand-xl .navbar-nav .dropdown-menu {\\n    position: absolute;\\n  }\\n  .navbar-expand-xl .navbar-nav .nav-link {\\n    padding-right: 0.5rem;\\n    padding-left: 0.5rem;\\n  }\\n  .navbar-expand-xl > .container,\\n  .navbar-expand-xl > .container-fluid {\\n    flex-wrap: nowrap;\\n  }\\n  .navbar-expand-xl .navbar-collapse {\\n    display: flex !important;\\n    flex-basis: auto;\\n  }\\n  .navbar-expand-xl .navbar-toggler {\\n    display: none;\\n  }\\n}\\n\\n.navbar-expand {\\n  flex-flow: row nowrap;\\n  justify-content: flex-start;\\n}\\n\\n.navbar-expand > .container,\\n.navbar-expand > .container-fluid {\\n  padding-right: 0;\\n  padding-left: 0;\\n}\\n\\n.navbar-expand .navbar-nav {\\n  flex-direction: row;\\n}\\n\\n.navbar-expand .navbar-nav .dropdown-menu {\\n  position: absolute;\\n}\\n\\n.navbar-expand .navbar-nav .nav-link {\\n  padding-right: 0.5rem;\\n  padding-left: 0.5rem;\\n}\\n\\n.navbar-expand > .container,\\n.navbar-expand > .container-fluid {\\n  flex-wrap: nowrap;\\n}\\n\\n.navbar-expand .navbar-collapse {\\n  display: flex !important;\\n  flex-basis: auto;\\n}\\n\\n.navbar-expand .navbar-toggler {\\n  display: none;\\n}\\n\\n.navbar-light .navbar-brand {\\n  color: rgba(0, 0, 0, 0.9);\\n}\\n\\n.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {\\n  color: rgba(0, 0, 0, 0.9);\\n}\\n\\n.navbar-light .navbar-nav .nav-link {\\n  color: rgba(0, 0, 0, 0.5);\\n}\\n\\n.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {\\n  color: rgba(0, 0, 0, 0.7);\\n}\\n\\n.navbar-light .navbar-nav .nav-link.disabled {\\n  color: rgba(0, 0, 0, 0.3);\\n}\\n\\n.navbar-light .navbar-nav .show > .nav-link,\\n.navbar-light .navbar-nav .active > .nav-link,\\n.navbar-light .navbar-nav .nav-link.show,\\n.navbar-light .navbar-nav .nav-link.active {\\n  color: rgba(0, 0, 0, 0.9);\\n}\\n\\n.navbar-light .navbar-toggler {\\n  color: rgba(0, 0, 0, 0.5);\\n  border-color: rgba(0, 0, 0, 0.1);\\n}\\n\\n.navbar-light .navbar-toggler-icon {\\n  background-image: url(\\\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\\\");\\n}\\n\\n.navbar-light .navbar-text {\\n  color: rgba(0, 0, 0, 0.5);\\n}\\n\\n.navbar-light .navbar-text a {\\n  color: rgba(0, 0, 0, 0.9);\\n}\\n\\n.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {\\n  color: rgba(0, 0, 0, 0.9);\\n}\\n\\n.navbar-dark .navbar-brand {\\n  color: #fff;\\n}\\n\\n.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {\\n  color: #fff;\\n}\\n\\n.navbar-dark .navbar-nav .nav-link {\\n  color: rgba(255, 255, 255, 0.5);\\n}\\n\\n.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {\\n  color: rgba(255, 255, 255, 0.75);\\n}\\n\\n.navbar-dark .navbar-nav .nav-link.disabled {\\n  color: rgba(255, 255, 255, 0.25);\\n}\\n\\n.navbar-dark .navbar-nav .show > .nav-link,\\n.navbar-dark .navbar-nav .active > .nav-link,\\n.navbar-dark .navbar-nav .nav-link.show,\\n.navbar-dark .navbar-nav .nav-link.active {\\n  color: #fff;\\n}\\n\\n.navbar-dark .navbar-toggler {\\n  color: rgba(255, 255, 255, 0.5);\\n  border-color: rgba(255, 255, 255, 0.1);\\n}\\n\\n.navbar-dark .navbar-toggler-icon {\\n  background-image: url(\\\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\\\");\\n}\\n\\n.navbar-dark .navbar-text {\\n  color: rgba(255, 255, 255, 0.5);\\n}\\n\\n.navbar-dark .navbar-text a {\\n  color: #fff;\\n}\\n\\n.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {\\n  color: #fff;\\n}\\n\\n.card {\\n  position: relative;\\n  display: flex;\\n  flex-direction: column;\\n  min-width: 0;\\n  word-wrap: break-word;\\n  background-color: #fff;\\n  background-clip: border-box;\\n  border: 1px solid rgba(0, 0, 0, 0.125);\\n  border-radius: 0.25rem;\\n}\\n\\n.card > hr {\\n  margin-right: 0;\\n  margin-left: 0;\\n}\\n\\n.card > .list-group:first-child .list-group-item:first-child {\\n  border-top-left-radius: 0.25rem;\\n  border-top-right-radius: 0.25rem;\\n}\\n\\n.card > .list-group:last-child .list-group-item:last-child {\\n  border-bottom-right-radius: 0.25rem;\\n  border-bottom-left-radius: 0.25rem;\\n}\\n\\n.card-body {\\n  flex: 1 1 auto;\\n  padding: 1.25rem;\\n}\\n\\n.card-title {\\n  margin-bottom: 0.75rem;\\n}\\n\\n.card-subtitle {\\n  margin-top: -0.375rem;\\n  margin-bottom: 0;\\n}\\n\\n.card-text:last-child {\\n  margin-bottom: 0;\\n}\\n\\n.card-link:hover {\\n  text-decoration: none;\\n}\\n\\n.card-link + .card-link {\\n  margin-left: 1.25rem;\\n}\\n\\n.card-header {\\n  padding: 0.75rem 1.25rem;\\n  margin-bottom: 0;\\n  background-color: rgba(0, 0, 0, 0.03);\\n  border-bottom: 1px solid rgba(0, 0, 0, 0.125);\\n}\\n\\n.card-header:first-child {\\n  border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\\n}\\n\\n.card-header + .list-group .list-group-item:first-child {\\n  border-top: 0;\\n}\\n\\n.card-footer {\\n  padding: 0.75rem 1.25rem;\\n  background-color: rgba(0, 0, 0, 0.03);\\n  border-top: 1px solid rgba(0, 0, 0, 0.125);\\n}\\n\\n.card-footer:last-child {\\n  border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\\n}\\n\\n.card-header-tabs {\\n  margin-right: -0.625rem;\\n  margin-bottom: -0.75rem;\\n  margin-left: -0.625rem;\\n  border-bottom: 0;\\n}\\n\\n.card-header-pills {\\n  margin-right: -0.625rem;\\n  margin-left: -0.625rem;\\n}\\n\\n.card-img-overlay {\\n  position: absolute;\\n  top: 0;\\n  right: 0;\\n  bottom: 0;\\n  left: 0;\\n  padding: 1.25rem;\\n}\\n\\n.card-img {\\n  width: 100%;\\n  border-radius: calc(0.25rem - 1px);\\n}\\n\\n.card-img-top {\\n  width: 100%;\\n  border-top-left-radius: calc(0.25rem - 1px);\\n  border-top-right-radius: calc(0.25rem - 1px);\\n}\\n\\n.card-img-bottom {\\n  width: 100%;\\n  border-bottom-right-radius: calc(0.25rem - 1px);\\n  border-bottom-left-radius: calc(0.25rem - 1px);\\n}\\n\\n.card-deck {\\n  display: flex;\\n  flex-direction: column;\\n}\\n\\n.card-deck .card {\\n  margin-bottom: 15px;\\n}\\n\\n@media (min-width: 576px) {\\n  .card-deck {\\n    flex-flow: row wrap;\\n    margin-right: -15px;\\n    margin-left: -15px;\\n  }\\n  .card-deck .card {\\n    display: flex;\\n    flex: 1 0 0%;\\n    flex-direction: column;\\n    margin-right: 15px;\\n    margin-bottom: 0;\\n    margin-left: 15px;\\n  }\\n}\\n\\n.card-group {\\n  display: flex;\\n  flex-direction: column;\\n}\\n\\n.card-group > .card {\\n  margin-bottom: 15px;\\n}\\n\\n@media (min-width: 576px) {\\n  .card-group {\\n    flex-flow: row wrap;\\n  }\\n  .card-group > .card {\\n    flex: 1 0 0%;\\n    margin-bottom: 0;\\n  }\\n  .card-group > .card + .card {\\n    margin-left: 0;\\n    border-left: 0;\\n  }\\n  .card-group > .card:not(:last-child) {\\n    border-top-right-radius: 0;\\n    border-bottom-right-radius: 0;\\n  }\\n  .card-group > .card:not(:last-child) .card-img-top,\\n  .card-group > .card:not(:last-child) .card-header {\\n    border-top-right-radius: 0;\\n  }\\n  .card-group > .card:not(:last-child) .card-img-bottom,\\n  .card-group > .card:not(:last-child) .card-footer {\\n    border-bottom-right-radius: 0;\\n  }\\n  .card-group > .card:not(:first-child) {\\n    border-top-left-radius: 0;\\n    border-bottom-left-radius: 0;\\n  }\\n  .card-group > .card:not(:first-child) .card-img-top,\\n  .card-group > .card:not(:first-child) .card-header {\\n    border-top-left-radius: 0;\\n  }\\n  .card-group > .card:not(:first-child) .card-img-bottom,\\n  .card-group > .card:not(:first-child) .card-footer {\\n    border-bottom-left-radius: 0;\\n  }\\n}\\n\\n.card-columns .card {\\n  margin-bottom: 0.75rem;\\n}\\n\\n@media (min-width: 576px) {\\n  .card-columns {\\n    column-count: 3;\\n    column-gap: 1.25rem;\\n    orphans: 1;\\n    widows: 1;\\n  }\\n  .card-columns .card {\\n    display: inline-block;\\n    width: 100%;\\n  }\\n}\\n\\n.accordion > .card {\\n  overflow: hidden;\\n}\\n\\n.accordion > .card:not(:first-of-type) .card-header:first-child {\\n  border-radius: 0;\\n}\\n\\n.accordion > .card:not(:first-of-type):not(:last-of-type) {\\n  border-bottom: 0;\\n  border-radius: 0;\\n}\\n\\n.accordion > .card:first-of-type {\\n  border-bottom: 0;\\n  border-bottom-right-radius: 0;\\n  border-bottom-left-radius: 0;\\n}\\n\\n.accordion > .card:last-of-type {\\n  border-top-left-radius: 0;\\n  border-top-right-radius: 0;\\n}\\n\\n.accordion > .card .card-header {\\n  margin-bottom: -1px;\\n}\\n\\n.breadcrumb {\\n  display: flex;\\n  flex-wrap: wrap;\\n  padding: 0.75rem 1rem;\\n  margin-bottom: 1rem;\\n  list-style: none;\\n  background-color: #e9ecef;\\n  border-radius: 0.25rem;\\n}\\n\\n.breadcrumb-item + .breadcrumb-item {\\n  padding-left: 0.5rem;\\n}\\n\\n.breadcrumb-item + .breadcrumb-item::before {\\n  display: inline-block;\\n  padding-right: 0.5rem;\\n  color: #6c757d;\\n  content: \\\"/\\\";\\n}\\n\\n.breadcrumb-item + .breadcrumb-item:hover::before {\\n  text-decoration: underline;\\n}\\n\\n.breadcrumb-item + .breadcrumb-item:hover::before {\\n  text-decoration: none;\\n}\\n\\n.breadcrumb-item.active {\\n  color: #6c757d;\\n}\\n\\n.pagination {\\n  display: flex;\\n  padding-left: 0;\\n  list-style: none;\\n  border-radius: 0.25rem;\\n}\\n\\n.page-link {\\n  position: relative;\\n  display: block;\\n  padding: 0.5rem 0.75rem;\\n  margin-left: -1px;\\n  line-height: 1.25;\\n  color: #007bff;\\n  background-color: #fff;\\n  border: 1px solid #dee2e6;\\n}\\n\\n.page-link:hover {\\n  z-index: 2;\\n  color: #0056b3;\\n  text-decoration: none;\\n  background-color: #e9ecef;\\n  border-color: #dee2e6;\\n}\\n\\n.page-link:focus {\\n  z-index: 2;\\n  outline: 0;\\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\\n}\\n\\n.page-item:first-child .page-link {\\n  margin-left: 0;\\n  border-top-left-radius: 0.25rem;\\n  border-bottom-left-radius: 0.25rem;\\n}\\n\\n.page-item:last-child .page-link {\\n  border-top-right-radius: 0.25rem;\\n  border-bottom-right-radius: 0.25rem;\\n}\\n\\n.page-item.active .page-link {\\n  z-index: 1;\\n  color: #fff;\\n  background-color: #007bff;\\n  border-color: #007bff;\\n}\\n\\n.page-item.disabled .page-link {\\n  color: #6c757d;\\n  pointer-events: none;\\n  cursor: auto;\\n  background-color: #fff;\\n  border-color: #dee2e6;\\n}\\n\\n.pagination-lg .page-link {\\n  padding: 0.75rem 1.5rem;\\n  font-size: 1.25rem;\\n  line-height: 1.5;\\n}\\n\\n.pagination-lg .page-item:first-child .page-link {\\n  border-top-left-radius: 0.3rem;\\n  border-bottom-left-radius: 0.3rem;\\n}\\n\\n.pagination-lg .page-item:last-child .page-link {\\n  border-top-right-radius: 0.3rem;\\n  border-bottom-right-radius: 0.3rem;\\n}\\n\\n.pagination-sm .page-link {\\n  padding: 0.25rem 0.5rem;\\n  font-size: 0.875rem;\\n  line-height: 1.5;\\n}\\n\\n.pagination-sm .page-item:first-child .page-link {\\n  border-top-left-radius: 0.2rem;\\n  border-bottom-left-radius: 0.2rem;\\n}\\n\\n.pagination-sm .page-item:last-child .page-link {\\n  border-top-right-radius: 0.2rem;\\n  border-bottom-right-radius: 0.2rem;\\n}\\n\\n.badge {\\n  display: inline-block;\\n  padding: 0.25em 0.4em;\\n  font-size: 75%;\\n  font-weight: 700;\\n  line-height: 1;\\n  text-align: center;\\n  white-space: nowrap;\\n  vertical-align: baseline;\\n  border-radius: 0.25rem;\\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .badge {\\n    transition: none;\\n  }\\n}\\n\\na.badge:hover, a.badge:focus {\\n  text-decoration: none;\\n}\\n\\n.badge:empty {\\n  display: none;\\n}\\n\\n.btn .badge {\\n  position: relative;\\n  top: -1px;\\n}\\n\\n.badge-pill {\\n  padding-right: 0.6em;\\n  padding-left: 0.6em;\\n  border-radius: 10rem;\\n}\\n\\n.badge-primary {\\n  color: #fff;\\n  background-color: #007bff;\\n}\\n\\na.badge-primary:hover, a.badge-primary:focus {\\n  color: #fff;\\n  background-color: #0062cc;\\n}\\n\\na.badge-primary:focus, a.badge-primary.focus {\\n  outline: 0;\\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\\n}\\n\\n.badge-secondary {\\n  color: #fff;\\n  background-color: #6c757d;\\n}\\n\\na.badge-secondary:hover, a.badge-secondary:focus {\\n  color: #fff;\\n  background-color: #545b62;\\n}\\n\\na.badge-secondary:focus, a.badge-secondary.focus {\\n  outline: 0;\\n  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\\n}\\n\\n.badge-success {\\n  color: #fff;\\n  background-color: #28a745;\\n}\\n\\na.badge-success:hover, a.badge-success:focus {\\n  color: #fff;\\n  background-color: #1e7e34;\\n}\\n\\na.badge-success:focus, a.badge-success.focus {\\n  outline: 0;\\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\\n}\\n\\n.badge-info {\\n  color: #fff;\\n  background-color: #17a2b8;\\n}\\n\\na.badge-info:hover, a.badge-info:focus {\\n  color: #fff;\\n  background-color: #117a8b;\\n}\\n\\na.badge-info:focus, a.badge-info.focus {\\n  outline: 0;\\n  box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\\n}\\n\\n.badge-warning {\\n  color: #212529;\\n  background-color: #ffc107;\\n}\\n\\na.badge-warning:hover, a.badge-warning:focus {\\n  color: #212529;\\n  background-color: #d39e00;\\n}\\n\\na.badge-warning:focus, a.badge-warning.focus {\\n  outline: 0;\\n  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\\n}\\n\\n.badge-danger {\\n  color: #fff;\\n  background-color: #dc3545;\\n}\\n\\na.badge-danger:hover, a.badge-danger:focus {\\n  color: #fff;\\n  background-color: #bd2130;\\n}\\n\\na.badge-danger:focus, a.badge-danger.focus {\\n  outline: 0;\\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\\n}\\n\\n.badge-light {\\n  color: #212529;\\n  background-color: #f8f9fa;\\n}\\n\\na.badge-light:hover, a.badge-light:focus {\\n  color: #212529;\\n  background-color: #dae0e5;\\n}\\n\\na.badge-light:focus, a.badge-light.focus {\\n  outline: 0;\\n  box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\\n}\\n\\n.badge-dark {\\n  color: #fff;\\n  background-color: #343a40;\\n}\\n\\na.badge-dark:hover, a.badge-dark:focus {\\n  color: #fff;\\n  background-color: #1d2124;\\n}\\n\\na.badge-dark:focus, a.badge-dark.focus {\\n  outline: 0;\\n  box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\\n}\\n\\n.jumbotron {\\n  padding: 2rem 1rem;\\n  margin-bottom: 2rem;\\n  background-color: #e9ecef;\\n  border-radius: 0.3rem;\\n}\\n\\n@media (min-width: 576px) {\\n  .jumbotron {\\n    padding: 4rem 2rem;\\n  }\\n}\\n\\n.jumbotron-fluid {\\n  padding-right: 0;\\n  padding-left: 0;\\n  border-radius: 0;\\n}\\n\\n.alert {\\n  position: relative;\\n  padding: 0.75rem 1.25rem;\\n  margin-bottom: 1rem;\\n  border: 1px solid transparent;\\n  border-radius: 0.25rem;\\n}\\n\\n.alert-heading {\\n  color: inherit;\\n}\\n\\n.alert-link {\\n  font-weight: 700;\\n}\\n\\n.alert-dismissible {\\n  padding-right: 4rem;\\n}\\n\\n.alert-dismissible .close {\\n  position: absolute;\\n  top: 0;\\n  right: 0;\\n  padding: 0.75rem 1.25rem;\\n  color: inherit;\\n}\\n\\n.alert-primary {\\n  color: #004085;\\n  background-color: #cce5ff;\\n  border-color: #b8daff;\\n}\\n\\n.alert-primary hr {\\n  border-top-color: #9fcdff;\\n}\\n\\n.alert-primary .alert-link {\\n  color: #002752;\\n}\\n\\n.alert-secondary {\\n  color: #383d41;\\n  background-color: #e2e3e5;\\n  border-color: #d6d8db;\\n}\\n\\n.alert-secondary hr {\\n  border-top-color: #c8cbcf;\\n}\\n\\n.alert-secondary .alert-link {\\n  color: #202326;\\n}\\n\\n.alert-success {\\n  color: #155724;\\n  background-color: #d4edda;\\n  border-color: #c3e6cb;\\n}\\n\\n.alert-success hr {\\n  border-top-color: #b1dfbb;\\n}\\n\\n.alert-success .alert-link {\\n  color: #0b2e13;\\n}\\n\\n.alert-info {\\n  color: #0c5460;\\n  background-color: #d1ecf1;\\n  border-color: #bee5eb;\\n}\\n\\n.alert-info hr {\\n  border-top-color: #abdde5;\\n}\\n\\n.alert-info .alert-link {\\n  color: #062c33;\\n}\\n\\n.alert-warning {\\n  color: #856404;\\n  background-color: #fff3cd;\\n  border-color: #ffeeba;\\n}\\n\\n.alert-warning hr {\\n  border-top-color: #ffe8a1;\\n}\\n\\n.alert-warning .alert-link {\\n  color: #533f03;\\n}\\n\\n.alert-danger {\\n  color: #721c24;\\n  background-color: #f8d7da;\\n  border-color: #f5c6cb;\\n}\\n\\n.alert-danger hr {\\n  border-top-color: #f1b0b7;\\n}\\n\\n.alert-danger .alert-link {\\n  color: #491217;\\n}\\n\\n.alert-light {\\n  color: #818182;\\n  background-color: #fefefe;\\n  border-color: #fdfdfe;\\n}\\n\\n.alert-light hr {\\n  border-top-color: #ececf6;\\n}\\n\\n.alert-light .alert-link {\\n  color: #686868;\\n}\\n\\n.alert-dark {\\n  color: #1b1e21;\\n  background-color: #d6d8d9;\\n  border-color: #c6c8ca;\\n}\\n\\n.alert-dark hr {\\n  border-top-color: #b9bbbe;\\n}\\n\\n.alert-dark .alert-link {\\n  color: #040505;\\n}\\n\\n@keyframes progress-bar-stripes {\\n  from {\\n    background-position: 1rem 0;\\n  }\\n  to {\\n    background-position: 0 0;\\n  }\\n}\\n\\n.progress {\\n  display: flex;\\n  height: 1rem;\\n  overflow: hidden;\\n  font-size: 0.75rem;\\n  background-color: #e9ecef;\\n  border-radius: 0.25rem;\\n}\\n\\n.progress-bar {\\n  display: flex;\\n  flex-direction: column;\\n  justify-content: center;\\n  color: #fff;\\n  text-align: center;\\n  white-space: nowrap;\\n  background-color: #007bff;\\n  transition: width 0.6s ease;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .progress-bar {\\n    transition: none;\\n  }\\n}\\n\\n.progress-bar-striped {\\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\\n  background-size: 1rem 1rem;\\n}\\n\\n.progress-bar-animated {\\n  animation: progress-bar-stripes 1s linear infinite;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .progress-bar-animated {\\n    animation: none;\\n  }\\n}\\n\\n.media {\\n  display: flex;\\n  align-items: flex-start;\\n}\\n\\n.media-body {\\n  flex: 1;\\n}\\n\\n.list-group {\\n  display: flex;\\n  flex-direction: column;\\n  padding-left: 0;\\n  margin-bottom: 0;\\n}\\n\\n.list-group-item-action {\\n  width: 100%;\\n  color: #495057;\\n  text-align: inherit;\\n}\\n\\n.list-group-item-action:hover, .list-group-item-action:focus {\\n  z-index: 1;\\n  color: #495057;\\n  text-decoration: none;\\n  background-color: #f8f9fa;\\n}\\n\\n.list-group-item-action:active {\\n  color: #212529;\\n  background-color: #e9ecef;\\n}\\n\\n.list-group-item {\\n  position: relative;\\n  display: block;\\n  padding: 0.75rem 1.25rem;\\n  margin-bottom: -1px;\\n  background-color: #fff;\\n  border: 1px solid rgba(0, 0, 0, 0.125);\\n}\\n\\n.list-group-item:first-child {\\n  border-top-left-radius: 0.25rem;\\n  border-top-right-radius: 0.25rem;\\n}\\n\\n.list-group-item:last-child {\\n  margin-bottom: 0;\\n  border-bottom-right-radius: 0.25rem;\\n  border-bottom-left-radius: 0.25rem;\\n}\\n\\n.list-group-item.disabled, .list-group-item:disabled {\\n  color: #6c757d;\\n  pointer-events: none;\\n  background-color: #fff;\\n}\\n\\n.list-group-item.active {\\n  z-index: 2;\\n  color: #fff;\\n  background-color: #007bff;\\n  border-color: #007bff;\\n}\\n\\n.list-group-horizontal {\\n  flex-direction: row;\\n}\\n\\n.list-group-horizontal .list-group-item {\\n  margin-right: -1px;\\n  margin-bottom: 0;\\n}\\n\\n.list-group-horizontal .list-group-item:first-child {\\n  border-top-left-radius: 0.25rem;\\n  border-bottom-left-radius: 0.25rem;\\n  border-top-right-radius: 0;\\n}\\n\\n.list-group-horizontal .list-group-item:last-child {\\n  margin-right: 0;\\n  border-top-right-radius: 0.25rem;\\n  border-bottom-right-radius: 0.25rem;\\n  border-bottom-left-radius: 0;\\n}\\n\\n@media (min-width: 576px) {\\n  .list-group-horizontal-sm {\\n    flex-direction: row;\\n  }\\n  .list-group-horizontal-sm .list-group-item {\\n    margin-right: -1px;\\n    margin-bottom: 0;\\n  }\\n  .list-group-horizontal-sm .list-group-item:first-child {\\n    border-top-left-radius: 0.25rem;\\n    border-bottom-left-radius: 0.25rem;\\n    border-top-right-radius: 0;\\n  }\\n  .list-group-horizontal-sm .list-group-item:last-child {\\n    margin-right: 0;\\n    border-top-right-radius: 0.25rem;\\n    border-bottom-right-radius: 0.25rem;\\n    border-bottom-left-radius: 0;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .list-group-horizontal-md {\\n    flex-direction: row;\\n  }\\n  .list-group-horizontal-md .list-group-item {\\n    margin-right: -1px;\\n    margin-bottom: 0;\\n  }\\n  .list-group-horizontal-md .list-group-item:first-child {\\n    border-top-left-radius: 0.25rem;\\n    border-bottom-left-radius: 0.25rem;\\n    border-top-right-radius: 0;\\n  }\\n  .list-group-horizontal-md .list-group-item:last-child {\\n    margin-right: 0;\\n    border-top-right-radius: 0.25rem;\\n    border-bottom-right-radius: 0.25rem;\\n    border-bottom-left-radius: 0;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .list-group-horizontal-lg {\\n    flex-direction: row;\\n  }\\n  .list-group-horizontal-lg .list-group-item {\\n    margin-right: -1px;\\n    margin-bottom: 0;\\n  }\\n  .list-group-horizontal-lg .list-group-item:first-child {\\n    border-top-left-radius: 0.25rem;\\n    border-bottom-left-radius: 0.25rem;\\n    border-top-right-radius: 0;\\n  }\\n  .list-group-horizontal-lg .list-group-item:last-child {\\n    margin-right: 0;\\n    border-top-right-radius: 0.25rem;\\n    border-bottom-right-radius: 0.25rem;\\n    border-bottom-left-radius: 0;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .list-group-horizontal-xl {\\n    flex-direction: row;\\n  }\\n  .list-group-horizontal-xl .list-group-item {\\n    margin-right: -1px;\\n    margin-bottom: 0;\\n  }\\n  .list-group-horizontal-xl .list-group-item:first-child {\\n    border-top-left-radius: 0.25rem;\\n    border-bottom-left-radius: 0.25rem;\\n    border-top-right-radius: 0;\\n  }\\n  .list-group-horizontal-xl .list-group-item:last-child {\\n    margin-right: 0;\\n    border-top-right-radius: 0.25rem;\\n    border-bottom-right-radius: 0.25rem;\\n    border-bottom-left-radius: 0;\\n  }\\n}\\n\\n.list-group-flush .list-group-item {\\n  border-right: 0;\\n  border-left: 0;\\n  border-radius: 0;\\n}\\n\\n.list-group-flush .list-group-item:last-child {\\n  margin-bottom: -1px;\\n}\\n\\n.list-group-flush:first-child .list-group-item:first-child {\\n  border-top: 0;\\n}\\n\\n.list-group-flush:last-child .list-group-item:last-child {\\n  margin-bottom: 0;\\n  border-bottom: 0;\\n}\\n\\n.list-group-item-primary {\\n  color: #004085;\\n  background-color: #b8daff;\\n}\\n\\n.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {\\n  color: #004085;\\n  background-color: #9fcdff;\\n}\\n\\n.list-group-item-primary.list-group-item-action.active {\\n  color: #fff;\\n  background-color: #004085;\\n  border-color: #004085;\\n}\\n\\n.list-group-item-secondary {\\n  color: #383d41;\\n  background-color: #d6d8db;\\n}\\n\\n.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {\\n  color: #383d41;\\n  background-color: #c8cbcf;\\n}\\n\\n.list-group-item-secondary.list-group-item-action.active {\\n  color: #fff;\\n  background-color: #383d41;\\n  border-color: #383d41;\\n}\\n\\n.list-group-item-success {\\n  color: #155724;\\n  background-color: #c3e6cb;\\n}\\n\\n.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {\\n  color: #155724;\\n  background-color: #b1dfbb;\\n}\\n\\n.list-group-item-success.list-group-item-action.active {\\n  color: #fff;\\n  background-color: #155724;\\n  border-color: #155724;\\n}\\n\\n.list-group-item-info {\\n  color: #0c5460;\\n  background-color: #bee5eb;\\n}\\n\\n.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {\\n  color: #0c5460;\\n  background-color: #abdde5;\\n}\\n\\n.list-group-item-info.list-group-item-action.active {\\n  color: #fff;\\n  background-color: #0c5460;\\n  border-color: #0c5460;\\n}\\n\\n.list-group-item-warning {\\n  color: #856404;\\n  background-color: #ffeeba;\\n}\\n\\n.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {\\n  color: #856404;\\n  background-color: #ffe8a1;\\n}\\n\\n.list-group-item-warning.list-group-item-action.active {\\n  color: #fff;\\n  background-color: #856404;\\n  border-color: #856404;\\n}\\n\\n.list-group-item-danger {\\n  color: #721c24;\\n  background-color: #f5c6cb;\\n}\\n\\n.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {\\n  color: #721c24;\\n  background-color: #f1b0b7;\\n}\\n\\n.list-group-item-danger.list-group-item-action.active {\\n  color: #fff;\\n  background-color: #721c24;\\n  border-color: #721c24;\\n}\\n\\n.list-group-item-light {\\n  color: #818182;\\n  background-color: #fdfdfe;\\n}\\n\\n.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {\\n  color: #818182;\\n  background-color: #ececf6;\\n}\\n\\n.list-group-item-light.list-group-item-action.active {\\n  color: #fff;\\n  background-color: #818182;\\n  border-color: #818182;\\n}\\n\\n.list-group-item-dark {\\n  color: #1b1e21;\\n  background-color: #c6c8ca;\\n}\\n\\n.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {\\n  color: #1b1e21;\\n  background-color: #b9bbbe;\\n}\\n\\n.list-group-item-dark.list-group-item-action.active {\\n  color: #fff;\\n  background-color: #1b1e21;\\n  border-color: #1b1e21;\\n}\\n\\n.close {\\n  float: right;\\n  font-size: 1.5rem;\\n  font-weight: 700;\\n  line-height: 1;\\n  color: #000;\\n  text-shadow: 0 1px 0 #fff;\\n  opacity: .5;\\n}\\n\\n.close:hover {\\n  color: #000;\\n  text-decoration: none;\\n}\\n\\n.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus {\\n  opacity: .75;\\n}\\n\\nbutton.close {\\n  padding: 0;\\n  background-color: transparent;\\n  border: 0;\\n  appearance: none;\\n}\\n\\na.close.disabled {\\n  pointer-events: none;\\n}\\n\\n.toast {\\n  max-width: 350px;\\n  overflow: hidden;\\n  font-size: 0.875rem;\\n  background-color: rgba(255, 255, 255, 0.85);\\n  background-clip: padding-box;\\n  border: 1px solid rgba(0, 0, 0, 0.1);\\n  box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1);\\n  backdrop-filter: blur(10px);\\n  opacity: 0;\\n  border-radius: 0.25rem;\\n}\\n\\n.toast:not(:last-child) {\\n  margin-bottom: 0.75rem;\\n}\\n\\n.toast.showing {\\n  opacity: 1;\\n}\\n\\n.toast.show {\\n  display: block;\\n  opacity: 1;\\n}\\n\\n.toast.hide {\\n  display: none;\\n}\\n\\n.toast-header {\\n  display: flex;\\n  align-items: center;\\n  padding: 0.25rem 0.75rem;\\n  color: #6c757d;\\n  background-color: rgba(255, 255, 255, 0.85);\\n  background-clip: padding-box;\\n  border-bottom: 1px solid rgba(0, 0, 0, 0.05);\\n}\\n\\n.toast-body {\\n  padding: 0.75rem;\\n}\\n\\n.modal-open {\\n  overflow: hidden;\\n}\\n\\n.modal-open .modal {\\n  overflow-x: hidden;\\n  overflow-y: auto;\\n}\\n\\n.modal {\\n  position: fixed;\\n  top: 0;\\n  left: 0;\\n  z-index: 1050;\\n  display: none;\\n  width: 100%;\\n  height: 100%;\\n  overflow: hidden;\\n  outline: 0;\\n}\\n\\n.modal-dialog {\\n  position: relative;\\n  width: auto;\\n  margin: 0.5rem;\\n  pointer-events: none;\\n}\\n\\n.modal.fade .modal-dialog {\\n  transition: transform 0.3s ease-out;\\n  transform: translate(0, -50px);\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .modal.fade .modal-dialog {\\n    transition: none;\\n  }\\n}\\n\\n.modal.show .modal-dialog {\\n  transform: none;\\n}\\n\\n.modal-dialog-scrollable {\\n  display: flex;\\n  max-height: calc(100% - 1rem);\\n}\\n\\n.modal-dialog-scrollable .modal-content {\\n  max-height: calc(100vh - 1rem);\\n  overflow: hidden;\\n}\\n\\n.modal-dialog-scrollable .modal-header,\\n.modal-dialog-scrollable .modal-footer {\\n  flex-shrink: 0;\\n}\\n\\n.modal-dialog-scrollable .modal-body {\\n  overflow-y: auto;\\n}\\n\\n.modal-dialog-centered {\\n  display: flex;\\n  align-items: center;\\n  min-height: calc(100% - 1rem);\\n}\\n\\n.modal-dialog-centered::before {\\n  display: block;\\n  height: calc(100vh - 1rem);\\n  content: \\\"\\\";\\n}\\n\\n.modal-dialog-centered.modal-dialog-scrollable {\\n  flex-direction: column;\\n  justify-content: center;\\n  height: 100%;\\n}\\n\\n.modal-dialog-centered.modal-dialog-scrollable .modal-content {\\n  max-height: none;\\n}\\n\\n.modal-dialog-centered.modal-dialog-scrollable::before {\\n  content: none;\\n}\\n\\n.modal-content {\\n  position: relative;\\n  display: flex;\\n  flex-direction: column;\\n  width: 100%;\\n  pointer-events: auto;\\n  background-color: #fff;\\n  background-clip: padding-box;\\n  border: 1px solid rgba(0, 0, 0, 0.2);\\n  border-radius: 0.3rem;\\n  outline: 0;\\n}\\n\\n.modal-backdrop {\\n  position: fixed;\\n  top: 0;\\n  left: 0;\\n  z-index: 1040;\\n  width: 100vw;\\n  height: 100vh;\\n  background-color: #000;\\n}\\n\\n.modal-backdrop.fade {\\n  opacity: 0;\\n}\\n\\n.modal-backdrop.show {\\n  opacity: 0.5;\\n}\\n\\n.modal-header {\\n  display: flex;\\n  align-items: flex-start;\\n  justify-content: space-between;\\n  padding: 1rem 1rem;\\n  border-bottom: 1px solid #dee2e6;\\n  border-top-left-radius: 0.3rem;\\n  border-top-right-radius: 0.3rem;\\n}\\n\\n.modal-header .close {\\n  padding: 1rem 1rem;\\n  margin: -1rem -1rem -1rem auto;\\n}\\n\\n.modal-title {\\n  margin-bottom: 0;\\n  line-height: 1.5;\\n}\\n\\n.modal-body {\\n  position: relative;\\n  flex: 1 1 auto;\\n  padding: 1rem;\\n}\\n\\n.modal-footer {\\n  display: flex;\\n  align-items: center;\\n  justify-content: flex-end;\\n  padding: 1rem;\\n  border-top: 1px solid #dee2e6;\\n  border-bottom-right-radius: 0.3rem;\\n  border-bottom-left-radius: 0.3rem;\\n}\\n\\n.modal-footer > :not(:first-child) {\\n  margin-left: .25rem;\\n}\\n\\n.modal-footer > :not(:last-child) {\\n  margin-right: .25rem;\\n}\\n\\n.modal-scrollbar-measure {\\n  position: absolute;\\n  top: -9999px;\\n  width: 50px;\\n  height: 50px;\\n  overflow: scroll;\\n}\\n\\n@media (min-width: 576px) {\\n  .modal-dialog {\\n    max-width: 500px;\\n    margin: 1.75rem auto;\\n  }\\n  .modal-dialog-scrollable {\\n    max-height: calc(100% - 3.5rem);\\n  }\\n  .modal-dialog-scrollable .modal-content {\\n    max-height: calc(100vh - 3.5rem);\\n  }\\n  .modal-dialog-centered {\\n    min-height: calc(100% - 3.5rem);\\n  }\\n  .modal-dialog-centered::before {\\n    height: calc(100vh - 3.5rem);\\n  }\\n  .modal-sm {\\n    max-width: 300px;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .modal-lg,\\n  .modal-xl {\\n    max-width: 800px;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .modal-xl {\\n    max-width: 1140px;\\n  }\\n}\\n\\n.tooltip {\\n  position: absolute;\\n  z-index: 1070;\\n  display: block;\\n  margin: 0;\\n  font-family: -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, \\\"Helvetica Neue\\\", Arial, \\\"Noto Sans\\\", sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\";\\n  font-style: normal;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  text-align: left;\\n  text-align: start;\\n  text-decoration: none;\\n  text-shadow: none;\\n  text-transform: none;\\n  letter-spacing: normal;\\n  word-break: normal;\\n  word-spacing: normal;\\n  white-space: normal;\\n  line-break: auto;\\n  font-size: 0.875rem;\\n  word-wrap: break-word;\\n  opacity: 0;\\n}\\n\\n.tooltip.show {\\n  opacity: 0.9;\\n}\\n\\n.tooltip .arrow {\\n  position: absolute;\\n  display: block;\\n  width: 0.8rem;\\n  height: 0.4rem;\\n}\\n\\n.tooltip .arrow::before {\\n  position: absolute;\\n  content: \\\"\\\";\\n  border-color: transparent;\\n  border-style: solid;\\n}\\n\\n.bs-tooltip-top, .bs-tooltip-auto[x-placement^=\\\"top\\\"] {\\n  padding: 0.4rem 0;\\n}\\n\\n.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=\\\"top\\\"] .arrow {\\n  bottom: 0;\\n}\\n\\n.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=\\\"top\\\"] .arrow::before {\\n  top: 0;\\n  border-width: 0.4rem 0.4rem 0;\\n  border-top-color: #000;\\n}\\n\\n.bs-tooltip-right, .bs-tooltip-auto[x-placement^=\\\"right\\\"] {\\n  padding: 0 0.4rem;\\n}\\n\\n.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=\\\"right\\\"] .arrow {\\n  left: 0;\\n  width: 0.4rem;\\n  height: 0.8rem;\\n}\\n\\n.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=\\\"right\\\"] .arrow::before {\\n  right: 0;\\n  border-width: 0.4rem 0.4rem 0.4rem 0;\\n  border-right-color: #000;\\n}\\n\\n.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=\\\"bottom\\\"] {\\n  padding: 0.4rem 0;\\n}\\n\\n.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=\\\"bottom\\\"] .arrow {\\n  top: 0;\\n}\\n\\n.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=\\\"bottom\\\"] .arrow::before {\\n  bottom: 0;\\n  border-width: 0 0.4rem 0.4rem;\\n  border-bottom-color: #000;\\n}\\n\\n.bs-tooltip-left, .bs-tooltip-auto[x-placement^=\\\"left\\\"] {\\n  padding: 0 0.4rem;\\n}\\n\\n.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=\\\"left\\\"] .arrow {\\n  right: 0;\\n  width: 0.4rem;\\n  height: 0.8rem;\\n}\\n\\n.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=\\\"left\\\"] .arrow::before {\\n  left: 0;\\n  border-width: 0.4rem 0 0.4rem 0.4rem;\\n  border-left-color: #000;\\n}\\n\\n.tooltip-inner {\\n  max-width: 200px;\\n  padding: 0.25rem 0.5rem;\\n  color: #fff;\\n  text-align: center;\\n  background-color: #000;\\n  border-radius: 0.25rem;\\n}\\n\\n.popover {\\n  position: absolute;\\n  top: 0;\\n  left: 0;\\n  z-index: 1060;\\n  display: block;\\n  max-width: 276px;\\n  font-family: -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, \\\"Helvetica Neue\\\", Arial, \\\"Noto Sans\\\", sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\";\\n  font-style: normal;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  text-align: left;\\n  text-align: start;\\n  text-decoration: none;\\n  text-shadow: none;\\n  text-transform: none;\\n  letter-spacing: normal;\\n  word-break: normal;\\n  word-spacing: normal;\\n  white-space: normal;\\n  line-break: auto;\\n  font-size: 0.875rem;\\n  word-wrap: break-word;\\n  background-color: #fff;\\n  background-clip: padding-box;\\n  border: 1px solid rgba(0, 0, 0, 0.2);\\n  border-radius: 0.3rem;\\n}\\n\\n.popover .arrow {\\n  position: absolute;\\n  display: block;\\n  width: 1rem;\\n  height: 0.5rem;\\n  margin: 0 0.3rem;\\n}\\n\\n.popover .arrow::before, .popover .arrow::after {\\n  position: absolute;\\n  display: block;\\n  content: \\\"\\\";\\n  border-color: transparent;\\n  border-style: solid;\\n}\\n\\n.bs-popover-top, .bs-popover-auto[x-placement^=\\\"top\\\"] {\\n  margin-bottom: 0.5rem;\\n}\\n\\n.bs-popover-top > .arrow, .bs-popover-auto[x-placement^=\\\"top\\\"] > .arrow {\\n  bottom: calc((0.5rem + 1px) * -1);\\n}\\n\\n.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^=\\\"top\\\"] > .arrow::before {\\n  bottom: 0;\\n  border-width: 0.5rem 0.5rem 0;\\n  border-top-color: rgba(0, 0, 0, 0.25);\\n}\\n\\n.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^=\\\"top\\\"] > .arrow::after {\\n  bottom: 1px;\\n  border-width: 0.5rem 0.5rem 0;\\n  border-top-color: #fff;\\n}\\n\\n.bs-popover-right, .bs-popover-auto[x-placement^=\\\"right\\\"] {\\n  margin-left: 0.5rem;\\n}\\n\\n.bs-popover-right > .arrow, .bs-popover-auto[x-placement^=\\\"right\\\"] > .arrow {\\n  left: calc((0.5rem + 1px) * -1);\\n  width: 0.5rem;\\n  height: 1rem;\\n  margin: 0.3rem 0;\\n}\\n\\n.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^=\\\"right\\\"] > .arrow::before {\\n  left: 0;\\n  border-width: 0.5rem 0.5rem 0.5rem 0;\\n  border-right-color: rgba(0, 0, 0, 0.25);\\n}\\n\\n.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^=\\\"right\\\"] > .arrow::after {\\n  left: 1px;\\n  border-width: 0.5rem 0.5rem 0.5rem 0;\\n  border-right-color: #fff;\\n}\\n\\n.bs-popover-bottom, .bs-popover-auto[x-placement^=\\\"bottom\\\"] {\\n  margin-top: 0.5rem;\\n}\\n\\n.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^=\\\"bottom\\\"] > .arrow {\\n  top: calc((0.5rem + 1px) * -1);\\n}\\n\\n.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^=\\\"bottom\\\"] > .arrow::before {\\n  top: 0;\\n  border-width: 0 0.5rem 0.5rem 0.5rem;\\n  border-bottom-color: rgba(0, 0, 0, 0.25);\\n}\\n\\n.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^=\\\"bottom\\\"] > .arrow::after {\\n  top: 1px;\\n  border-width: 0 0.5rem 0.5rem 0.5rem;\\n  border-bottom-color: #fff;\\n}\\n\\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=\\\"bottom\\\"] .popover-header::before {\\n  position: absolute;\\n  top: 0;\\n  left: 50%;\\n  display: block;\\n  width: 1rem;\\n  margin-left: -0.5rem;\\n  content: \\\"\\\";\\n  border-bottom: 1px solid #f7f7f7;\\n}\\n\\n.bs-popover-left, .bs-popover-auto[x-placement^=\\\"left\\\"] {\\n  margin-right: 0.5rem;\\n}\\n\\n.bs-popover-left > .arrow, .bs-popover-auto[x-placement^=\\\"left\\\"] > .arrow {\\n  right: calc((0.5rem + 1px) * -1);\\n  width: 0.5rem;\\n  height: 1rem;\\n  margin: 0.3rem 0;\\n}\\n\\n.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^=\\\"left\\\"] > .arrow::before {\\n  right: 0;\\n  border-width: 0.5rem 0 0.5rem 0.5rem;\\n  border-left-color: rgba(0, 0, 0, 0.25);\\n}\\n\\n.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^=\\\"left\\\"] > .arrow::after {\\n  right: 1px;\\n  border-width: 0.5rem 0 0.5rem 0.5rem;\\n  border-left-color: #fff;\\n}\\n\\n.popover-header {\\n  padding: 0.5rem 0.75rem;\\n  margin-bottom: 0;\\n  font-size: 1rem;\\n  background-color: #f7f7f7;\\n  border-bottom: 1px solid #ebebeb;\\n  border-top-left-radius: calc(0.3rem - 1px);\\n  border-top-right-radius: calc(0.3rem - 1px);\\n}\\n\\n.popover-header:empty {\\n  display: none;\\n}\\n\\n.popover-body {\\n  padding: 0.5rem 0.75rem;\\n  color: #212529;\\n}\\n\\n.carousel {\\n  position: relative;\\n}\\n\\n.carousel.pointer-event {\\n  touch-action: pan-y;\\n}\\n\\n.carousel-inner {\\n  position: relative;\\n  width: 100%;\\n  overflow: hidden;\\n}\\n\\n.carousel-inner::after {\\n  display: block;\\n  clear: both;\\n  content: \\\"\\\";\\n}\\n\\n.carousel-item {\\n  position: relative;\\n  display: none;\\n  float: left;\\n  width: 100%;\\n  margin-right: -100%;\\n  backface-visibility: hidden;\\n  transition: transform 0.6s ease-in-out;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .carousel-item {\\n    transition: none;\\n  }\\n}\\n\\n.carousel-item.active,\\n.carousel-item-next,\\n.carousel-item-prev {\\n  display: block;\\n}\\n\\n.carousel-item-next:not(.carousel-item-left),\\n.active.carousel-item-right {\\n  transform: translateX(100%);\\n}\\n\\n.carousel-item-prev:not(.carousel-item-right),\\n.active.carousel-item-left {\\n  transform: translateX(-100%);\\n}\\n\\n.carousel-fade .carousel-item {\\n  opacity: 0;\\n  transition-property: opacity;\\n  transform: none;\\n}\\n\\n.carousel-fade .carousel-item.active,\\n.carousel-fade .carousel-item-next.carousel-item-left,\\n.carousel-fade .carousel-item-prev.carousel-item-right {\\n  z-index: 1;\\n  opacity: 1;\\n}\\n\\n.carousel-fade .active.carousel-item-left,\\n.carousel-fade .active.carousel-item-right {\\n  z-index: 0;\\n  opacity: 0;\\n  transition: 0s 0.6s opacity;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .carousel-fade .active.carousel-item-left,\\n  .carousel-fade .active.carousel-item-right {\\n    transition: none;\\n  }\\n}\\n\\n.carousel-control-prev,\\n.carousel-control-next {\\n  position: absolute;\\n  top: 0;\\n  bottom: 0;\\n  z-index: 1;\\n  display: flex;\\n  align-items: center;\\n  justify-content: center;\\n  width: 15%;\\n  color: #fff;\\n  text-align: center;\\n  opacity: 0.5;\\n  transition: opacity 0.15s ease;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .carousel-control-prev,\\n  .carousel-control-next {\\n    transition: none;\\n  }\\n}\\n\\n.carousel-control-prev:hover, .carousel-control-prev:focus,\\n.carousel-control-next:hover,\\n.carousel-control-next:focus {\\n  color: #fff;\\n  text-decoration: none;\\n  outline: 0;\\n  opacity: 0.9;\\n}\\n\\n.carousel-control-prev {\\n  left: 0;\\n}\\n\\n.carousel-control-next {\\n  right: 0;\\n}\\n\\n.carousel-control-prev-icon,\\n.carousel-control-next-icon {\\n  display: inline-block;\\n  width: 20px;\\n  height: 20px;\\n  background: no-repeat 50% / 100% 100%;\\n}\\n\\n.carousel-control-prev-icon {\\n  background-image: url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\\\");\\n}\\n\\n.carousel-control-next-icon {\\n  background-image: url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\\\");\\n}\\n\\n.carousel-indicators {\\n  position: absolute;\\n  right: 0;\\n  bottom: 0;\\n  left: 0;\\n  z-index: 15;\\n  display: flex;\\n  justify-content: center;\\n  padding-left: 0;\\n  margin-right: 15%;\\n  margin-left: 15%;\\n  list-style: none;\\n}\\n\\n.carousel-indicators li {\\n  box-sizing: content-box;\\n  flex: 0 1 auto;\\n  width: 30px;\\n  height: 3px;\\n  margin-right: 3px;\\n  margin-left: 3px;\\n  text-indent: -999px;\\n  cursor: pointer;\\n  background-color: #fff;\\n  background-clip: padding-box;\\n  border-top: 10px solid transparent;\\n  border-bottom: 10px solid transparent;\\n  opacity: .5;\\n  transition: opacity 0.6s ease;\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .carousel-indicators li {\\n    transition: none;\\n  }\\n}\\n\\n.carousel-indicators .active {\\n  opacity: 1;\\n}\\n\\n.carousel-caption {\\n  position: absolute;\\n  right: 15%;\\n  bottom: 20px;\\n  left: 15%;\\n  z-index: 10;\\n  padding-top: 20px;\\n  padding-bottom: 20px;\\n  color: #fff;\\n  text-align: center;\\n}\\n\\n@keyframes spinner-border {\\n  to {\\n    transform: rotate(360deg);\\n  }\\n}\\n\\n.spinner-border {\\n  display: inline-block;\\n  width: 2rem;\\n  height: 2rem;\\n  vertical-align: text-bottom;\\n  border: 0.25em solid currentColor;\\n  border-right-color: transparent;\\n  border-radius: 50%;\\n  animation: spinner-border .75s linear infinite;\\n}\\n\\n.spinner-border-sm {\\n  width: 1rem;\\n  height: 1rem;\\n  border-width: 0.2em;\\n}\\n\\n@keyframes spinner-grow {\\n  0% {\\n    transform: scale(0);\\n  }\\n  50% {\\n    opacity: 1;\\n  }\\n}\\n\\n.spinner-grow {\\n  display: inline-block;\\n  width: 2rem;\\n  height: 2rem;\\n  vertical-align: text-bottom;\\n  background-color: currentColor;\\n  border-radius: 50%;\\n  opacity: 0;\\n  animation: spinner-grow .75s linear infinite;\\n}\\n\\n.spinner-grow-sm {\\n  width: 1rem;\\n  height: 1rem;\\n}\\n\\n.align-baseline {\\n  vertical-align: baseline !important;\\n}\\n\\n.align-top {\\n  vertical-align: top !important;\\n}\\n\\n.align-middle {\\n  vertical-align: middle !important;\\n}\\n\\n.align-bottom {\\n  vertical-align: bottom !important;\\n}\\n\\n.align-text-bottom {\\n  vertical-align: text-bottom !important;\\n}\\n\\n.align-text-top {\\n  vertical-align: text-top !important;\\n}\\n\\n.bg-primary {\\n  background-color: #007bff !important;\\n}\\n\\na.bg-primary:hover, a.bg-primary:focus,\\nbutton.bg-primary:hover,\\nbutton.bg-primary:focus {\\n  background-color: #0062cc !important;\\n}\\n\\n.bg-secondary {\\n  background-color: #6c757d !important;\\n}\\n\\na.bg-secondary:hover, a.bg-secondary:focus,\\nbutton.bg-secondary:hover,\\nbutton.bg-secondary:focus {\\n  background-color: #545b62 !important;\\n}\\n\\n.bg-success {\\n  background-color: #28a745 !important;\\n}\\n\\na.bg-success:hover, a.bg-success:focus,\\nbutton.bg-success:hover,\\nbutton.bg-success:focus {\\n  background-color: #1e7e34 !important;\\n}\\n\\n.bg-info {\\n  background-color: #17a2b8 !important;\\n}\\n\\na.bg-info:hover, a.bg-info:focus,\\nbutton.bg-info:hover,\\nbutton.bg-info:focus {\\n  background-color: #117a8b !important;\\n}\\n\\n.bg-warning {\\n  background-color: #ffc107 !important;\\n}\\n\\na.bg-warning:hover, a.bg-warning:focus,\\nbutton.bg-warning:hover,\\nbutton.bg-warning:focus {\\n  background-color: #d39e00 !important;\\n}\\n\\n.bg-danger {\\n  background-color: #dc3545 !important;\\n}\\n\\na.bg-danger:hover, a.bg-danger:focus,\\nbutton.bg-danger:hover,\\nbutton.bg-danger:focus {\\n  background-color: #bd2130 !important;\\n}\\n\\n.bg-light {\\n  background-color: #f8f9fa !important;\\n}\\n\\na.bg-light:hover, a.bg-light:focus,\\nbutton.bg-light:hover,\\nbutton.bg-light:focus {\\n  background-color: #dae0e5 !important;\\n}\\n\\n.bg-dark {\\n  background-color: #343a40 !important;\\n}\\n\\na.bg-dark:hover, a.bg-dark:focus,\\nbutton.bg-dark:hover,\\nbutton.bg-dark:focus {\\n  background-color: #1d2124 !important;\\n}\\n\\n.bg-white {\\n  background-color: #fff !important;\\n}\\n\\n.bg-transparent {\\n  background-color: transparent !important;\\n}\\n\\n.border {\\n  border: 1px solid #dee2e6 !important;\\n}\\n\\n.border-top {\\n  border-top: 1px solid #dee2e6 !important;\\n}\\n\\n.border-right {\\n  border-right: 1px solid #dee2e6 !important;\\n}\\n\\n.border-bottom {\\n  border-bottom: 1px solid #dee2e6 !important;\\n}\\n\\n.border-left {\\n  border-left: 1px solid #dee2e6 !important;\\n}\\n\\n.border-0 {\\n  border: 0 !important;\\n}\\n\\n.border-top-0 {\\n  border-top: 0 !important;\\n}\\n\\n.border-right-0 {\\n  border-right: 0 !important;\\n}\\n\\n.border-bottom-0 {\\n  border-bottom: 0 !important;\\n}\\n\\n.border-left-0 {\\n  border-left: 0 !important;\\n}\\n\\n.border-primary {\\n  border-color: #007bff !important;\\n}\\n\\n.border-secondary {\\n  border-color: #6c757d !important;\\n}\\n\\n.border-success {\\n  border-color: #28a745 !important;\\n}\\n\\n.border-info {\\n  border-color: #17a2b8 !important;\\n}\\n\\n.border-warning {\\n  border-color: #ffc107 !important;\\n}\\n\\n.border-danger {\\n  border-color: #dc3545 !important;\\n}\\n\\n.border-light {\\n  border-color: #f8f9fa !important;\\n}\\n\\n.border-dark {\\n  border-color: #343a40 !important;\\n}\\n\\n.border-white {\\n  border-color: #fff !important;\\n}\\n\\n.rounded-sm {\\n  border-radius: 0.2rem !important;\\n}\\n\\n.rounded {\\n  border-radius: 0.25rem !important;\\n}\\n\\n.rounded-top {\\n  border-top-left-radius: 0.25rem !important;\\n  border-top-right-radius: 0.25rem !important;\\n}\\n\\n.rounded-right {\\n  border-top-right-radius: 0.25rem !important;\\n  border-bottom-right-radius: 0.25rem !important;\\n}\\n\\n.rounded-bottom {\\n  border-bottom-right-radius: 0.25rem !important;\\n  border-bottom-left-radius: 0.25rem !important;\\n}\\n\\n.rounded-left {\\n  border-top-left-radius: 0.25rem !important;\\n  border-bottom-left-radius: 0.25rem !important;\\n}\\n\\n.rounded-lg {\\n  border-radius: 0.3rem !important;\\n}\\n\\n.rounded-circle {\\n  border-radius: 50% !important;\\n}\\n\\n.rounded-pill {\\n  border-radius: 50rem !important;\\n}\\n\\n.rounded-0 {\\n  border-radius: 0 !important;\\n}\\n\\n.clearfix::after {\\n  display: block;\\n  clear: both;\\n  content: \\\"\\\";\\n}\\n\\n.d-none {\\n  display: none !important;\\n}\\n\\n.d-inline {\\n  display: inline !important;\\n}\\n\\n.d-inline-block {\\n  display: inline-block !important;\\n}\\n\\n.d-block {\\n  display: block !important;\\n}\\n\\n.d-table {\\n  display: table !important;\\n}\\n\\n.d-table-row {\\n  display: table-row !important;\\n}\\n\\n.d-table-cell {\\n  display: table-cell !important;\\n}\\n\\n.d-flex {\\n  display: flex !important;\\n}\\n\\n.d-inline-flex {\\n  display: inline-flex !important;\\n}\\n\\n@media (min-width: 576px) {\\n  .d-sm-none {\\n    display: none !important;\\n  }\\n  .d-sm-inline {\\n    display: inline !important;\\n  }\\n  .d-sm-inline-block {\\n    display: inline-block !important;\\n  }\\n  .d-sm-block {\\n    display: block !important;\\n  }\\n  .d-sm-table {\\n    display: table !important;\\n  }\\n  .d-sm-table-row {\\n    display: table-row !important;\\n  }\\n  .d-sm-table-cell {\\n    display: table-cell !important;\\n  }\\n  .d-sm-flex {\\n    display: flex !important;\\n  }\\n  .d-sm-inline-flex {\\n    display: inline-flex !important;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .d-md-none {\\n    display: none !important;\\n  }\\n  .d-md-inline {\\n    display: inline !important;\\n  }\\n  .d-md-inline-block {\\n    display: inline-block !important;\\n  }\\n  .d-md-block {\\n    display: block !important;\\n  }\\n  .d-md-table {\\n    display: table !important;\\n  }\\n  .d-md-table-row {\\n    display: table-row !important;\\n  }\\n  .d-md-table-cell {\\n    display: table-cell !important;\\n  }\\n  .d-md-flex {\\n    display: flex !important;\\n  }\\n  .d-md-inline-flex {\\n    display: inline-flex !important;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .d-lg-none {\\n    display: none !important;\\n  }\\n  .d-lg-inline {\\n    display: inline !important;\\n  }\\n  .d-lg-inline-block {\\n    display: inline-block !important;\\n  }\\n  .d-lg-block {\\n    display: block !important;\\n  }\\n  .d-lg-table {\\n    display: table !important;\\n  }\\n  .d-lg-table-row {\\n    display: table-row !important;\\n  }\\n  .d-lg-table-cell {\\n    display: table-cell !important;\\n  }\\n  .d-lg-flex {\\n    display: flex !important;\\n  }\\n  .d-lg-inline-flex {\\n    display: inline-flex !important;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .d-xl-none {\\n    display: none !important;\\n  }\\n  .d-xl-inline {\\n    display: inline !important;\\n  }\\n  .d-xl-inline-block {\\n    display: inline-block !important;\\n  }\\n  .d-xl-block {\\n    display: block !important;\\n  }\\n  .d-xl-table {\\n    display: table !important;\\n  }\\n  .d-xl-table-row {\\n    display: table-row !important;\\n  }\\n  .d-xl-table-cell {\\n    display: table-cell !important;\\n  }\\n  .d-xl-flex {\\n    display: flex !important;\\n  }\\n  .d-xl-inline-flex {\\n    display: inline-flex !important;\\n  }\\n}\\n\\n@media print {\\n  .d-print-none {\\n    display: none !important;\\n  }\\n  .d-print-inline {\\n    display: inline !important;\\n  }\\n  .d-print-inline-block {\\n    display: inline-block !important;\\n  }\\n  .d-print-block {\\n    display: block !important;\\n  }\\n  .d-print-table {\\n    display: table !important;\\n  }\\n  .d-print-table-row {\\n    display: table-row !important;\\n  }\\n  .d-print-table-cell {\\n    display: table-cell !important;\\n  }\\n  .d-print-flex {\\n    display: flex !important;\\n  }\\n  .d-print-inline-flex {\\n    display: inline-flex !important;\\n  }\\n}\\n\\n.embed-responsive {\\n  position: relative;\\n  display: block;\\n  width: 100%;\\n  padding: 0;\\n  overflow: hidden;\\n}\\n\\n.embed-responsive::before {\\n  display: block;\\n  content: \\\"\\\";\\n}\\n\\n.embed-responsive .embed-responsive-item,\\n.embed-responsive iframe,\\n.embed-responsive embed,\\n.embed-responsive object,\\n.embed-responsive video {\\n  position: absolute;\\n  top: 0;\\n  bottom: 0;\\n  left: 0;\\n  width: 100%;\\n  height: 100%;\\n  border: 0;\\n}\\n\\n.embed-responsive-21by9::before {\\n  padding-top: 42.857143%;\\n}\\n\\n.embed-responsive-16by9::before {\\n  padding-top: 56.25%;\\n}\\n\\n.embed-responsive-4by3::before {\\n  padding-top: 75%;\\n}\\n\\n.embed-responsive-1by1::before {\\n  padding-top: 100%;\\n}\\n\\n.flex-row {\\n  flex-direction: row !important;\\n}\\n\\n.flex-column {\\n  flex-direction: column !important;\\n}\\n\\n.flex-row-reverse {\\n  flex-direction: row-reverse !important;\\n}\\n\\n.flex-column-reverse {\\n  flex-direction: column-reverse !important;\\n}\\n\\n.flex-wrap {\\n  flex-wrap: wrap !important;\\n}\\n\\n.flex-nowrap {\\n  flex-wrap: nowrap !important;\\n}\\n\\n.flex-wrap-reverse {\\n  flex-wrap: wrap-reverse !important;\\n}\\n\\n.flex-fill {\\n  flex: 1 1 auto !important;\\n}\\n\\n.flex-grow-0 {\\n  flex-grow: 0 !important;\\n}\\n\\n.flex-grow-1 {\\n  flex-grow: 1 !important;\\n}\\n\\n.flex-shrink-0 {\\n  flex-shrink: 0 !important;\\n}\\n\\n.flex-shrink-1 {\\n  flex-shrink: 1 !important;\\n}\\n\\n.justify-content-start {\\n  justify-content: flex-start !important;\\n}\\n\\n.justify-content-end {\\n  justify-content: flex-end !important;\\n}\\n\\n.justify-content-center {\\n  justify-content: center !important;\\n}\\n\\n.justify-content-between {\\n  justify-content: space-between !important;\\n}\\n\\n.justify-content-around {\\n  justify-content: space-around !important;\\n}\\n\\n.align-items-start {\\n  align-items: flex-start !important;\\n}\\n\\n.align-items-end {\\n  align-items: flex-end !important;\\n}\\n\\n.align-items-center {\\n  align-items: center !important;\\n}\\n\\n.align-items-baseline {\\n  align-items: baseline !important;\\n}\\n\\n.align-items-stretch {\\n  align-items: stretch !important;\\n}\\n\\n.align-content-start {\\n  align-content: flex-start !important;\\n}\\n\\n.align-content-end {\\n  align-content: flex-end !important;\\n}\\n\\n.align-content-center {\\n  align-content: center !important;\\n}\\n\\n.align-content-between {\\n  align-content: space-between !important;\\n}\\n\\n.align-content-around {\\n  align-content: space-around !important;\\n}\\n\\n.align-content-stretch {\\n  align-content: stretch !important;\\n}\\n\\n.align-self-auto {\\n  align-self: auto !important;\\n}\\n\\n.align-self-start {\\n  align-self: flex-start !important;\\n}\\n\\n.align-self-end {\\n  align-self: flex-end !important;\\n}\\n\\n.align-self-center {\\n  align-self: center !important;\\n}\\n\\n.align-self-baseline {\\n  align-self: baseline !important;\\n}\\n\\n.align-self-stretch {\\n  align-self: stretch !important;\\n}\\n\\n@media (min-width: 576px) {\\n  .flex-sm-row {\\n    flex-direction: row !important;\\n  }\\n  .flex-sm-column {\\n    flex-direction: column !important;\\n  }\\n  .flex-sm-row-reverse {\\n    flex-direction: row-reverse !important;\\n  }\\n  .flex-sm-column-reverse {\\n    flex-direction: column-reverse !important;\\n  }\\n  .flex-sm-wrap {\\n    flex-wrap: wrap !important;\\n  }\\n  .flex-sm-nowrap {\\n    flex-wrap: nowrap !important;\\n  }\\n  .flex-sm-wrap-reverse {\\n    flex-wrap: wrap-reverse !important;\\n  }\\n  .flex-sm-fill {\\n    flex: 1 1 auto !important;\\n  }\\n  .flex-sm-grow-0 {\\n    flex-grow: 0 !important;\\n  }\\n  .flex-sm-grow-1 {\\n    flex-grow: 1 !important;\\n  }\\n  .flex-sm-shrink-0 {\\n    flex-shrink: 0 !important;\\n  }\\n  .flex-sm-shrink-1 {\\n    flex-shrink: 1 !important;\\n  }\\n  .justify-content-sm-start {\\n    justify-content: flex-start !important;\\n  }\\n  .justify-content-sm-end {\\n    justify-content: flex-end !important;\\n  }\\n  .justify-content-sm-center {\\n    justify-content: center !important;\\n  }\\n  .justify-content-sm-between {\\n    justify-content: space-between !important;\\n  }\\n  .justify-content-sm-around {\\n    justify-content: space-around !important;\\n  }\\n  .align-items-sm-start {\\n    align-items: flex-start !important;\\n  }\\n  .align-items-sm-end {\\n    align-items: flex-end !important;\\n  }\\n  .align-items-sm-center {\\n    align-items: center !important;\\n  }\\n  .align-items-sm-baseline {\\n    align-items: baseline !important;\\n  }\\n  .align-items-sm-stretch {\\n    align-items: stretch !important;\\n  }\\n  .align-content-sm-start {\\n    align-content: flex-start !important;\\n  }\\n  .align-content-sm-end {\\n    align-content: flex-end !important;\\n  }\\n  .align-content-sm-center {\\n    align-content: center !important;\\n  }\\n  .align-content-sm-between {\\n    align-content: space-between !important;\\n  }\\n  .align-content-sm-around {\\n    align-content: space-around !important;\\n  }\\n  .align-content-sm-stretch {\\n    align-content: stretch !important;\\n  }\\n  .align-self-sm-auto {\\n    align-self: auto !important;\\n  }\\n  .align-self-sm-start {\\n    align-self: flex-start !important;\\n  }\\n  .align-self-sm-end {\\n    align-self: flex-end !important;\\n  }\\n  .align-self-sm-center {\\n    align-self: center !important;\\n  }\\n  .align-self-sm-baseline {\\n    align-self: baseline !important;\\n  }\\n  .align-self-sm-stretch {\\n    align-self: stretch !important;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .flex-md-row {\\n    flex-direction: row !important;\\n  }\\n  .flex-md-column {\\n    flex-direction: column !important;\\n  }\\n  .flex-md-row-reverse {\\n    flex-direction: row-reverse !important;\\n  }\\n  .flex-md-column-reverse {\\n    flex-direction: column-reverse !important;\\n  }\\n  .flex-md-wrap {\\n    flex-wrap: wrap !important;\\n  }\\n  .flex-md-nowrap {\\n    flex-wrap: nowrap !important;\\n  }\\n  .flex-md-wrap-reverse {\\n    flex-wrap: wrap-reverse !important;\\n  }\\n  .flex-md-fill {\\n    flex: 1 1 auto !important;\\n  }\\n  .flex-md-grow-0 {\\n    flex-grow: 0 !important;\\n  }\\n  .flex-md-grow-1 {\\n    flex-grow: 1 !important;\\n  }\\n  .flex-md-shrink-0 {\\n    flex-shrink: 0 !important;\\n  }\\n  .flex-md-shrink-1 {\\n    flex-shrink: 1 !important;\\n  }\\n  .justify-content-md-start {\\n    justify-content: flex-start !important;\\n  }\\n  .justify-content-md-end {\\n    justify-content: flex-end !important;\\n  }\\n  .justify-content-md-center {\\n    justify-content: center !important;\\n  }\\n  .justify-content-md-between {\\n    justify-content: space-between !important;\\n  }\\n  .justify-content-md-around {\\n    justify-content: space-around !important;\\n  }\\n  .align-items-md-start {\\n    align-items: flex-start !important;\\n  }\\n  .align-items-md-end {\\n    align-items: flex-end !important;\\n  }\\n  .align-items-md-center {\\n    align-items: center !important;\\n  }\\n  .align-items-md-baseline {\\n    align-items: baseline !important;\\n  }\\n  .align-items-md-stretch {\\n    align-items: stretch !important;\\n  }\\n  .align-content-md-start {\\n    align-content: flex-start !important;\\n  }\\n  .align-content-md-end {\\n    align-content: flex-end !important;\\n  }\\n  .align-content-md-center {\\n    align-content: center !important;\\n  }\\n  .align-content-md-between {\\n    align-content: space-between !important;\\n  }\\n  .align-content-md-around {\\n    align-content: space-around !important;\\n  }\\n  .align-content-md-stretch {\\n    align-content: stretch !important;\\n  }\\n  .align-self-md-auto {\\n    align-self: auto !important;\\n  }\\n  .align-self-md-start {\\n    align-self: flex-start !important;\\n  }\\n  .align-self-md-end {\\n    align-self: flex-end !important;\\n  }\\n  .align-self-md-center {\\n    align-self: center !important;\\n  }\\n  .align-self-md-baseline {\\n    align-self: baseline !important;\\n  }\\n  .align-self-md-stretch {\\n    align-self: stretch !important;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .flex-lg-row {\\n    flex-direction: row !important;\\n  }\\n  .flex-lg-column {\\n    flex-direction: column !important;\\n  }\\n  .flex-lg-row-reverse {\\n    flex-direction: row-reverse !important;\\n  }\\n  .flex-lg-column-reverse {\\n    flex-direction: column-reverse !important;\\n  }\\n  .flex-lg-wrap {\\n    flex-wrap: wrap !important;\\n  }\\n  .flex-lg-nowrap {\\n    flex-wrap: nowrap !important;\\n  }\\n  .flex-lg-wrap-reverse {\\n    flex-wrap: wrap-reverse !important;\\n  }\\n  .flex-lg-fill {\\n    flex: 1 1 auto !important;\\n  }\\n  .flex-lg-grow-0 {\\n    flex-grow: 0 !important;\\n  }\\n  .flex-lg-grow-1 {\\n    flex-grow: 1 !important;\\n  }\\n  .flex-lg-shrink-0 {\\n    flex-shrink: 0 !important;\\n  }\\n  .flex-lg-shrink-1 {\\n    flex-shrink: 1 !important;\\n  }\\n  .justify-content-lg-start {\\n    justify-content: flex-start !important;\\n  }\\n  .justify-content-lg-end {\\n    justify-content: flex-end !important;\\n  }\\n  .justify-content-lg-center {\\n    justify-content: center !important;\\n  }\\n  .justify-content-lg-between {\\n    justify-content: space-between !important;\\n  }\\n  .justify-content-lg-around {\\n    justify-content: space-around !important;\\n  }\\n  .align-items-lg-start {\\n    align-items: flex-start !important;\\n  }\\n  .align-items-lg-end {\\n    align-items: flex-end !important;\\n  }\\n  .align-items-lg-center {\\n    align-items: center !important;\\n  }\\n  .align-items-lg-baseline {\\n    align-items: baseline !important;\\n  }\\n  .align-items-lg-stretch {\\n    align-items: stretch !important;\\n  }\\n  .align-content-lg-start {\\n    align-content: flex-start !important;\\n  }\\n  .align-content-lg-end {\\n    align-content: flex-end !important;\\n  }\\n  .align-content-lg-center {\\n    align-content: center !important;\\n  }\\n  .align-content-lg-between {\\n    align-content: space-between !important;\\n  }\\n  .align-content-lg-around {\\n    align-content: space-around !important;\\n  }\\n  .align-content-lg-stretch {\\n    align-content: stretch !important;\\n  }\\n  .align-self-lg-auto {\\n    align-self: auto !important;\\n  }\\n  .align-self-lg-start {\\n    align-self: flex-start !important;\\n  }\\n  .align-self-lg-end {\\n    align-self: flex-end !important;\\n  }\\n  .align-self-lg-center {\\n    align-self: center !important;\\n  }\\n  .align-self-lg-baseline {\\n    align-self: baseline !important;\\n  }\\n  .align-self-lg-stretch {\\n    align-self: stretch !important;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .flex-xl-row {\\n    flex-direction: row !important;\\n  }\\n  .flex-xl-column {\\n    flex-direction: column !important;\\n  }\\n  .flex-xl-row-reverse {\\n    flex-direction: row-reverse !important;\\n  }\\n  .flex-xl-column-reverse {\\n    flex-direction: column-reverse !important;\\n  }\\n  .flex-xl-wrap {\\n    flex-wrap: wrap !important;\\n  }\\n  .flex-xl-nowrap {\\n    flex-wrap: nowrap !important;\\n  }\\n  .flex-xl-wrap-reverse {\\n    flex-wrap: wrap-reverse !important;\\n  }\\n  .flex-xl-fill {\\n    flex: 1 1 auto !important;\\n  }\\n  .flex-xl-grow-0 {\\n    flex-grow: 0 !important;\\n  }\\n  .flex-xl-grow-1 {\\n    flex-grow: 1 !important;\\n  }\\n  .flex-xl-shrink-0 {\\n    flex-shrink: 0 !important;\\n  }\\n  .flex-xl-shrink-1 {\\n    flex-shrink: 1 !important;\\n  }\\n  .justify-content-xl-start {\\n    justify-content: flex-start !important;\\n  }\\n  .justify-content-xl-end {\\n    justify-content: flex-end !important;\\n  }\\n  .justify-content-xl-center {\\n    justify-content: center !important;\\n  }\\n  .justify-content-xl-between {\\n    justify-content: space-between !important;\\n  }\\n  .justify-content-xl-around {\\n    justify-content: space-around !important;\\n  }\\n  .align-items-xl-start {\\n    align-items: flex-start !important;\\n  }\\n  .align-items-xl-end {\\n    align-items: flex-end !important;\\n  }\\n  .align-items-xl-center {\\n    align-items: center !important;\\n  }\\n  .align-items-xl-baseline {\\n    align-items: baseline !important;\\n  }\\n  .align-items-xl-stretch {\\n    align-items: stretch !important;\\n  }\\n  .align-content-xl-start {\\n    align-content: flex-start !important;\\n  }\\n  .align-content-xl-end {\\n    align-content: flex-end !important;\\n  }\\n  .align-content-xl-center {\\n    align-content: center !important;\\n  }\\n  .align-content-xl-between {\\n    align-content: space-between !important;\\n  }\\n  .align-content-xl-around {\\n    align-content: space-around !important;\\n  }\\n  .align-content-xl-stretch {\\n    align-content: stretch !important;\\n  }\\n  .align-self-xl-auto {\\n    align-self: auto !important;\\n  }\\n  .align-self-xl-start {\\n    align-self: flex-start !important;\\n  }\\n  .align-self-xl-end {\\n    align-self: flex-end !important;\\n  }\\n  .align-self-xl-center {\\n    align-self: center !important;\\n  }\\n  .align-self-xl-baseline {\\n    align-self: baseline !important;\\n  }\\n  .align-self-xl-stretch {\\n    align-self: stretch !important;\\n  }\\n}\\n\\n.float-left {\\n  float: left !important;\\n}\\n\\n.float-right {\\n  float: right !important;\\n}\\n\\n.float-none {\\n  float: none !important;\\n}\\n\\n@media (min-width: 576px) {\\n  .float-sm-left {\\n    float: left !important;\\n  }\\n  .float-sm-right {\\n    float: right !important;\\n  }\\n  .float-sm-none {\\n    float: none !important;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .float-md-left {\\n    float: left !important;\\n  }\\n  .float-md-right {\\n    float: right !important;\\n  }\\n  .float-md-none {\\n    float: none !important;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .float-lg-left {\\n    float: left !important;\\n  }\\n  .float-lg-right {\\n    float: right !important;\\n  }\\n  .float-lg-none {\\n    float: none !important;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .float-xl-left {\\n    float: left !important;\\n  }\\n  .float-xl-right {\\n    float: right !important;\\n  }\\n  .float-xl-none {\\n    float: none !important;\\n  }\\n}\\n\\n.overflow-auto {\\n  overflow: auto !important;\\n}\\n\\n.overflow-hidden {\\n  overflow: hidden !important;\\n}\\n\\n.position-static {\\n  position: static !important;\\n}\\n\\n.position-relative {\\n  position: relative !important;\\n}\\n\\n.position-absolute {\\n  position: absolute !important;\\n}\\n\\n.position-fixed {\\n  position: fixed !important;\\n}\\n\\n.position-sticky {\\n  position: sticky !important;\\n}\\n\\n.fixed-top {\\n  position: fixed;\\n  top: 0;\\n  right: 0;\\n  left: 0;\\n  z-index: 1030;\\n}\\n\\n.fixed-bottom {\\n  position: fixed;\\n  right: 0;\\n  bottom: 0;\\n  left: 0;\\n  z-index: 1030;\\n}\\n\\n@supports (position: sticky) {\\n  .sticky-top {\\n    position: sticky;\\n    top: 0;\\n    z-index: 1020;\\n  }\\n}\\n\\n.sr-only {\\n  position: absolute;\\n  width: 1px;\\n  height: 1px;\\n  padding: 0;\\n  overflow: hidden;\\n  clip: rect(0, 0, 0, 0);\\n  white-space: nowrap;\\n  border: 0;\\n}\\n\\n.sr-only-focusable:active, .sr-only-focusable:focus {\\n  position: static;\\n  width: auto;\\n  height: auto;\\n  overflow: visible;\\n  clip: auto;\\n  white-space: normal;\\n}\\n\\n.shadow-sm {\\n  box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\\n}\\n\\n.shadow {\\n  box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\\n}\\n\\n.shadow-lg {\\n  box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\\n}\\n\\n.shadow-none {\\n  box-shadow: none !important;\\n}\\n\\n.w-25 {\\n  width: 25% !important;\\n}\\n\\n.w-50 {\\n  width: 50% !important;\\n}\\n\\n.w-75 {\\n  width: 75% !important;\\n}\\n\\n.w-100 {\\n  width: 100% !important;\\n}\\n\\n.w-auto {\\n  width: auto !important;\\n}\\n\\n.h-25 {\\n  height: 25% !important;\\n}\\n\\n.h-50 {\\n  height: 50% !important;\\n}\\n\\n.h-75 {\\n  height: 75% !important;\\n}\\n\\n.h-100 {\\n  height: 100% !important;\\n}\\n\\n.h-auto {\\n  height: auto !important;\\n}\\n\\n.mw-100 {\\n  max-width: 100% !important;\\n}\\n\\n.mh-100 {\\n  max-height: 100% !important;\\n}\\n\\n.min-vw-100 {\\n  min-width: 100vw !important;\\n}\\n\\n.min-vh-100 {\\n  min-height: 100vh !important;\\n}\\n\\n.vw-100 {\\n  width: 100vw !important;\\n}\\n\\n.vh-100 {\\n  height: 100vh !important;\\n}\\n\\n.stretched-link::after {\\n  position: absolute;\\n  top: 0;\\n  right: 0;\\n  bottom: 0;\\n  left: 0;\\n  z-index: 1;\\n  pointer-events: auto;\\n  content: \\\"\\\";\\n  background-color: rgba(0, 0, 0, 0);\\n}\\n\\n.m-0 {\\n  margin: 0 !important;\\n}\\n\\n.mt-0,\\n.my-0 {\\n  margin-top: 0 !important;\\n}\\n\\n.mr-0,\\n.mx-0 {\\n  margin-right: 0 !important;\\n}\\n\\n.mb-0,\\n.my-0 {\\n  margin-bottom: 0 !important;\\n}\\n\\n.ml-0,\\n.mx-0 {\\n  margin-left: 0 !important;\\n}\\n\\n.m-1 {\\n  margin: 0.25rem !important;\\n}\\n\\n.mt-1,\\n.my-1 {\\n  margin-top: 0.25rem !important;\\n}\\n\\n.mr-1,\\n.mx-1 {\\n  margin-right: 0.25rem !important;\\n}\\n\\n.mb-1,\\n.my-1 {\\n  margin-bottom: 0.25rem !important;\\n}\\n\\n.ml-1,\\n.mx-1 {\\n  margin-left: 0.25rem !important;\\n}\\n\\n.m-2 {\\n  margin: 0.5rem !important;\\n}\\n\\n.mt-2,\\n.my-2 {\\n  margin-top: 0.5rem !important;\\n}\\n\\n.mr-2,\\n.mx-2 {\\n  margin-right: 0.5rem !important;\\n}\\n\\n.mb-2,\\n.my-2 {\\n  margin-bottom: 0.5rem !important;\\n}\\n\\n.ml-2,\\n.mx-2 {\\n  margin-left: 0.5rem !important;\\n}\\n\\n.m-3 {\\n  margin: 1rem !important;\\n}\\n\\n.mt-3,\\n.my-3 {\\n  margin-top: 1rem !important;\\n}\\n\\n.mr-3,\\n.mx-3 {\\n  margin-right: 1rem !important;\\n}\\n\\n.mb-3,\\n.my-3 {\\n  margin-bottom: 1rem !important;\\n}\\n\\n.ml-3,\\n.mx-3 {\\n  margin-left: 1rem !important;\\n}\\n\\n.m-4 {\\n  margin: 1.5rem !important;\\n}\\n\\n.mt-4,\\n.my-4 {\\n  margin-top: 1.5rem !important;\\n}\\n\\n.mr-4,\\n.mx-4 {\\n  margin-right: 1.5rem !important;\\n}\\n\\n.mb-4,\\n.my-4 {\\n  margin-bottom: 1.5rem !important;\\n}\\n\\n.ml-4,\\n.mx-4 {\\n  margin-left: 1.5rem !important;\\n}\\n\\n.m-5 {\\n  margin: 3rem !important;\\n}\\n\\n.mt-5,\\n.my-5 {\\n  margin-top: 3rem !important;\\n}\\n\\n.mr-5,\\n.mx-5 {\\n  margin-right: 3rem !important;\\n}\\n\\n.mb-5,\\n.my-5 {\\n  margin-bottom: 3rem !important;\\n}\\n\\n.ml-5,\\n.mx-5 {\\n  margin-left: 3rem !important;\\n}\\n\\n.p-0 {\\n  padding: 0 !important;\\n}\\n\\n.pt-0,\\n.py-0 {\\n  padding-top: 0 !important;\\n}\\n\\n.pr-0,\\n.px-0 {\\n  padding-right: 0 !important;\\n}\\n\\n.pb-0,\\n.py-0 {\\n  padding-bottom: 0 !important;\\n}\\n\\n.pl-0,\\n.px-0 {\\n  padding-left: 0 !important;\\n}\\n\\n.p-1 {\\n  padding: 0.25rem !important;\\n}\\n\\n.pt-1,\\n.py-1 {\\n  padding-top: 0.25rem !important;\\n}\\n\\n.pr-1,\\n.px-1 {\\n  padding-right: 0.25rem !important;\\n}\\n\\n.pb-1,\\n.py-1 {\\n  padding-bottom: 0.25rem !important;\\n}\\n\\n.pl-1,\\n.px-1 {\\n  padding-left: 0.25rem !important;\\n}\\n\\n.p-2 {\\n  padding: 0.5rem !important;\\n}\\n\\n.pt-2,\\n.py-2 {\\n  padding-top: 0.5rem !important;\\n}\\n\\n.pr-2,\\n.px-2 {\\n  padding-right: 0.5rem !important;\\n}\\n\\n.pb-2,\\n.py-2 {\\n  padding-bottom: 0.5rem !important;\\n}\\n\\n.pl-2,\\n.px-2 {\\n  padding-left: 0.5rem !important;\\n}\\n\\n.p-3 {\\n  padding: 1rem !important;\\n}\\n\\n.pt-3,\\n.py-3 {\\n  padding-top: 1rem !important;\\n}\\n\\n.pr-3,\\n.px-3 {\\n  padding-right: 1rem !important;\\n}\\n\\n.pb-3,\\n.py-3 {\\n  padding-bottom: 1rem !important;\\n}\\n\\n.pl-3,\\n.px-3 {\\n  padding-left: 1rem !important;\\n}\\n\\n.p-4 {\\n  padding: 1.5rem !important;\\n}\\n\\n.pt-4,\\n.py-4 {\\n  padding-top: 1.5rem !important;\\n}\\n\\n.pr-4,\\n.px-4 {\\n  padding-right: 1.5rem !important;\\n}\\n\\n.pb-4,\\n.py-4 {\\n  padding-bottom: 1.5rem !important;\\n}\\n\\n.pl-4,\\n.px-4 {\\n  padding-left: 1.5rem !important;\\n}\\n\\n.p-5 {\\n  padding: 3rem !important;\\n}\\n\\n.pt-5,\\n.py-5 {\\n  padding-top: 3rem !important;\\n}\\n\\n.pr-5,\\n.px-5 {\\n  padding-right: 3rem !important;\\n}\\n\\n.pb-5,\\n.py-5 {\\n  padding-bottom: 3rem !important;\\n}\\n\\n.pl-5,\\n.px-5 {\\n  padding-left: 3rem !important;\\n}\\n\\n.m-n1 {\\n  margin: -0.25rem !important;\\n}\\n\\n.mt-n1,\\n.my-n1 {\\n  margin-top: -0.25rem !important;\\n}\\n\\n.mr-n1,\\n.mx-n1 {\\n  margin-right: -0.25rem !important;\\n}\\n\\n.mb-n1,\\n.my-n1 {\\n  margin-bottom: -0.25rem !important;\\n}\\n\\n.ml-n1,\\n.mx-n1 {\\n  margin-left: -0.25rem !important;\\n}\\n\\n.m-n2 {\\n  margin: -0.5rem !important;\\n}\\n\\n.mt-n2,\\n.my-n2 {\\n  margin-top: -0.5rem !important;\\n}\\n\\n.mr-n2,\\n.mx-n2 {\\n  margin-right: -0.5rem !important;\\n}\\n\\n.mb-n2,\\n.my-n2 {\\n  margin-bottom: -0.5rem !important;\\n}\\n\\n.ml-n2,\\n.mx-n2 {\\n  margin-left: -0.5rem !important;\\n}\\n\\n.m-n3 {\\n  margin: -1rem !important;\\n}\\n\\n.mt-n3,\\n.my-n3 {\\n  margin-top: -1rem !important;\\n}\\n\\n.mr-n3,\\n.mx-n3 {\\n  margin-right: -1rem !important;\\n}\\n\\n.mb-n3,\\n.my-n3 {\\n  margin-bottom: -1rem !important;\\n}\\n\\n.ml-n3,\\n.mx-n3 {\\n  margin-left: -1rem !important;\\n}\\n\\n.m-n4 {\\n  margin: -1.5rem !important;\\n}\\n\\n.mt-n4,\\n.my-n4 {\\n  margin-top: -1.5rem !important;\\n}\\n\\n.mr-n4,\\n.mx-n4 {\\n  margin-right: -1.5rem !important;\\n}\\n\\n.mb-n4,\\n.my-n4 {\\n  margin-bottom: -1.5rem !important;\\n}\\n\\n.ml-n4,\\n.mx-n4 {\\n  margin-left: -1.5rem !important;\\n}\\n\\n.m-n5 {\\n  margin: -3rem !important;\\n}\\n\\n.mt-n5,\\n.my-n5 {\\n  margin-top: -3rem !important;\\n}\\n\\n.mr-n5,\\n.mx-n5 {\\n  margin-right: -3rem !important;\\n}\\n\\n.mb-n5,\\n.my-n5 {\\n  margin-bottom: -3rem !important;\\n}\\n\\n.ml-n5,\\n.mx-n5 {\\n  margin-left: -3rem !important;\\n}\\n\\n.m-auto {\\n  margin: auto !important;\\n}\\n\\n.mt-auto,\\n.my-auto {\\n  margin-top: auto !important;\\n}\\n\\n.mr-auto,\\n.mx-auto {\\n  margin-right: auto !important;\\n}\\n\\n.mb-auto,\\n.my-auto {\\n  margin-bottom: auto !important;\\n}\\n\\n.ml-auto,\\n.mx-auto {\\n  margin-left: auto !important;\\n}\\n\\n@media (min-width: 576px) {\\n  .m-sm-0 {\\n    margin: 0 !important;\\n  }\\n  .mt-sm-0,\\n  .my-sm-0 {\\n    margin-top: 0 !important;\\n  }\\n  .mr-sm-0,\\n  .mx-sm-0 {\\n    margin-right: 0 !important;\\n  }\\n  .mb-sm-0,\\n  .my-sm-0 {\\n    margin-bottom: 0 !important;\\n  }\\n  .ml-sm-0,\\n  .mx-sm-0 {\\n    margin-left: 0 !important;\\n  }\\n  .m-sm-1 {\\n    margin: 0.25rem !important;\\n  }\\n  .mt-sm-1,\\n  .my-sm-1 {\\n    margin-top: 0.25rem !important;\\n  }\\n  .mr-sm-1,\\n  .mx-sm-1 {\\n    margin-right: 0.25rem !important;\\n  }\\n  .mb-sm-1,\\n  .my-sm-1 {\\n    margin-bottom: 0.25rem !important;\\n  }\\n  .ml-sm-1,\\n  .mx-sm-1 {\\n    margin-left: 0.25rem !important;\\n  }\\n  .m-sm-2 {\\n    margin: 0.5rem !important;\\n  }\\n  .mt-sm-2,\\n  .my-sm-2 {\\n    margin-top: 0.5rem !important;\\n  }\\n  .mr-sm-2,\\n  .mx-sm-2 {\\n    margin-right: 0.5rem !important;\\n  }\\n  .mb-sm-2,\\n  .my-sm-2 {\\n    margin-bottom: 0.5rem !important;\\n  }\\n  .ml-sm-2,\\n  .mx-sm-2 {\\n    margin-left: 0.5rem !important;\\n  }\\n  .m-sm-3 {\\n    margin: 1rem !important;\\n  }\\n  .mt-sm-3,\\n  .my-sm-3 {\\n    margin-top: 1rem !important;\\n  }\\n  .mr-sm-3,\\n  .mx-sm-3 {\\n    margin-right: 1rem !important;\\n  }\\n  .mb-sm-3,\\n  .my-sm-3 {\\n    margin-bottom: 1rem !important;\\n  }\\n  .ml-sm-3,\\n  .mx-sm-3 {\\n    margin-left: 1rem !important;\\n  }\\n  .m-sm-4 {\\n    margin: 1.5rem !important;\\n  }\\n  .mt-sm-4,\\n  .my-sm-4 {\\n    margin-top: 1.5rem !important;\\n  }\\n  .mr-sm-4,\\n  .mx-sm-4 {\\n    margin-right: 1.5rem !important;\\n  }\\n  .mb-sm-4,\\n  .my-sm-4 {\\n    margin-bottom: 1.5rem !important;\\n  }\\n  .ml-sm-4,\\n  .mx-sm-4 {\\n    margin-left: 1.5rem !important;\\n  }\\n  .m-sm-5 {\\n    margin: 3rem !important;\\n  }\\n  .mt-sm-5,\\n  .my-sm-5 {\\n    margin-top: 3rem !important;\\n  }\\n  .mr-sm-5,\\n  .mx-sm-5 {\\n    margin-right: 3rem !important;\\n  }\\n  .mb-sm-5,\\n  .my-sm-5 {\\n    margin-bottom: 3rem !important;\\n  }\\n  .ml-sm-5,\\n  .mx-sm-5 {\\n    margin-left: 3rem !important;\\n  }\\n  .p-sm-0 {\\n    padding: 0 !important;\\n  }\\n  .pt-sm-0,\\n  .py-sm-0 {\\n    padding-top: 0 !important;\\n  }\\n  .pr-sm-0,\\n  .px-sm-0 {\\n    padding-right: 0 !important;\\n  }\\n  .pb-sm-0,\\n  .py-sm-0 {\\n    padding-bottom: 0 !important;\\n  }\\n  .pl-sm-0,\\n  .px-sm-0 {\\n    padding-left: 0 !important;\\n  }\\n  .p-sm-1 {\\n    padding: 0.25rem !important;\\n  }\\n  .pt-sm-1,\\n  .py-sm-1 {\\n    padding-top: 0.25rem !important;\\n  }\\n  .pr-sm-1,\\n  .px-sm-1 {\\n    padding-right: 0.25rem !important;\\n  }\\n  .pb-sm-1,\\n  .py-sm-1 {\\n    padding-bottom: 0.25rem !important;\\n  }\\n  .pl-sm-1,\\n  .px-sm-1 {\\n    padding-left: 0.25rem !important;\\n  }\\n  .p-sm-2 {\\n    padding: 0.5rem !important;\\n  }\\n  .pt-sm-2,\\n  .py-sm-2 {\\n    padding-top: 0.5rem !important;\\n  }\\n  .pr-sm-2,\\n  .px-sm-2 {\\n    padding-right: 0.5rem !important;\\n  }\\n  .pb-sm-2,\\n  .py-sm-2 {\\n    padding-bottom: 0.5rem !important;\\n  }\\n  .pl-sm-2,\\n  .px-sm-2 {\\n    padding-left: 0.5rem !important;\\n  }\\n  .p-sm-3 {\\n    padding: 1rem !important;\\n  }\\n  .pt-sm-3,\\n  .py-sm-3 {\\n    padding-top: 1rem !important;\\n  }\\n  .pr-sm-3,\\n  .px-sm-3 {\\n    padding-right: 1rem !important;\\n  }\\n  .pb-sm-3,\\n  .py-sm-3 {\\n    padding-bottom: 1rem !important;\\n  }\\n  .pl-sm-3,\\n  .px-sm-3 {\\n    padding-left: 1rem !important;\\n  }\\n  .p-sm-4 {\\n    padding: 1.5rem !important;\\n  }\\n  .pt-sm-4,\\n  .py-sm-4 {\\n    padding-top: 1.5rem !important;\\n  }\\n  .pr-sm-4,\\n  .px-sm-4 {\\n    padding-right: 1.5rem !important;\\n  }\\n  .pb-sm-4,\\n  .py-sm-4 {\\n    padding-bottom: 1.5rem !important;\\n  }\\n  .pl-sm-4,\\n  .px-sm-4 {\\n    padding-left: 1.5rem !important;\\n  }\\n  .p-sm-5 {\\n    padding: 3rem !important;\\n  }\\n  .pt-sm-5,\\n  .py-sm-5 {\\n    padding-top: 3rem !important;\\n  }\\n  .pr-sm-5,\\n  .px-sm-5 {\\n    padding-right: 3rem !important;\\n  }\\n  .pb-sm-5,\\n  .py-sm-5 {\\n    padding-bottom: 3rem !important;\\n  }\\n  .pl-sm-5,\\n  .px-sm-5 {\\n    padding-left: 3rem !important;\\n  }\\n  .m-sm-n1 {\\n    margin: -0.25rem !important;\\n  }\\n  .mt-sm-n1,\\n  .my-sm-n1 {\\n    margin-top: -0.25rem !important;\\n  }\\n  .mr-sm-n1,\\n  .mx-sm-n1 {\\n    margin-right: -0.25rem !important;\\n  }\\n  .mb-sm-n1,\\n  .my-sm-n1 {\\n    margin-bottom: -0.25rem !important;\\n  }\\n  .ml-sm-n1,\\n  .mx-sm-n1 {\\n    margin-left: -0.25rem !important;\\n  }\\n  .m-sm-n2 {\\n    margin: -0.5rem !important;\\n  }\\n  .mt-sm-n2,\\n  .my-sm-n2 {\\n    margin-top: -0.5rem !important;\\n  }\\n  .mr-sm-n2,\\n  .mx-sm-n2 {\\n    margin-right: -0.5rem !important;\\n  }\\n  .mb-sm-n2,\\n  .my-sm-n2 {\\n    margin-bottom: -0.5rem !important;\\n  }\\n  .ml-sm-n2,\\n  .mx-sm-n2 {\\n    margin-left: -0.5rem !important;\\n  }\\n  .m-sm-n3 {\\n    margin: -1rem !important;\\n  }\\n  .mt-sm-n3,\\n  .my-sm-n3 {\\n    margin-top: -1rem !important;\\n  }\\n  .mr-sm-n3,\\n  .mx-sm-n3 {\\n    margin-right: -1rem !important;\\n  }\\n  .mb-sm-n3,\\n  .my-sm-n3 {\\n    margin-bottom: -1rem !important;\\n  }\\n  .ml-sm-n3,\\n  .mx-sm-n3 {\\n    margin-left: -1rem !important;\\n  }\\n  .m-sm-n4 {\\n    margin: -1.5rem !important;\\n  }\\n  .mt-sm-n4,\\n  .my-sm-n4 {\\n    margin-top: -1.5rem !important;\\n  }\\n  .mr-sm-n4,\\n  .mx-sm-n4 {\\n    margin-right: -1.5rem !important;\\n  }\\n  .mb-sm-n4,\\n  .my-sm-n4 {\\n    margin-bottom: -1.5rem !important;\\n  }\\n  .ml-sm-n4,\\n  .mx-sm-n4 {\\n    margin-left: -1.5rem !important;\\n  }\\n  .m-sm-n5 {\\n    margin: -3rem !important;\\n  }\\n  .mt-sm-n5,\\n  .my-sm-n5 {\\n    margin-top: -3rem !important;\\n  }\\n  .mr-sm-n5,\\n  .mx-sm-n5 {\\n    margin-right: -3rem !important;\\n  }\\n  .mb-sm-n5,\\n  .my-sm-n5 {\\n    margin-bottom: -3rem !important;\\n  }\\n  .ml-sm-n5,\\n  .mx-sm-n5 {\\n    margin-left: -3rem !important;\\n  }\\n  .m-sm-auto {\\n    margin: auto !important;\\n  }\\n  .mt-sm-auto,\\n  .my-sm-auto {\\n    margin-top: auto !important;\\n  }\\n  .mr-sm-auto,\\n  .mx-sm-auto {\\n    margin-right: auto !important;\\n  }\\n  .mb-sm-auto,\\n  .my-sm-auto {\\n    margin-bottom: auto !important;\\n  }\\n  .ml-sm-auto,\\n  .mx-sm-auto {\\n    margin-left: auto !important;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .m-md-0 {\\n    margin: 0 !important;\\n  }\\n  .mt-md-0,\\n  .my-md-0 {\\n    margin-top: 0 !important;\\n  }\\n  .mr-md-0,\\n  .mx-md-0 {\\n    margin-right: 0 !important;\\n  }\\n  .mb-md-0,\\n  .my-md-0 {\\n    margin-bottom: 0 !important;\\n  }\\n  .ml-md-0,\\n  .mx-md-0 {\\n    margin-left: 0 !important;\\n  }\\n  .m-md-1 {\\n    margin: 0.25rem !important;\\n  }\\n  .mt-md-1,\\n  .my-md-1 {\\n    margin-top: 0.25rem !important;\\n  }\\n  .mr-md-1,\\n  .mx-md-1 {\\n    margin-right: 0.25rem !important;\\n  }\\n  .mb-md-1,\\n  .my-md-1 {\\n    margin-bottom: 0.25rem !important;\\n  }\\n  .ml-md-1,\\n  .mx-md-1 {\\n    margin-left: 0.25rem !important;\\n  }\\n  .m-md-2 {\\n    margin: 0.5rem !important;\\n  }\\n  .mt-md-2,\\n  .my-md-2 {\\n    margin-top: 0.5rem !important;\\n  }\\n  .mr-md-2,\\n  .mx-md-2 {\\n    margin-right: 0.5rem !important;\\n  }\\n  .mb-md-2,\\n  .my-md-2 {\\n    margin-bottom: 0.5rem !important;\\n  }\\n  .ml-md-2,\\n  .mx-md-2 {\\n    margin-left: 0.5rem !important;\\n  }\\n  .m-md-3 {\\n    margin: 1rem !important;\\n  }\\n  .mt-md-3,\\n  .my-md-3 {\\n    margin-top: 1rem !important;\\n  }\\n  .mr-md-3,\\n  .mx-md-3 {\\n    margin-right: 1rem !important;\\n  }\\n  .mb-md-3,\\n  .my-md-3 {\\n    margin-bottom: 1rem !important;\\n  }\\n  .ml-md-3,\\n  .mx-md-3 {\\n    margin-left: 1rem !important;\\n  }\\n  .m-md-4 {\\n    margin: 1.5rem !important;\\n  }\\n  .mt-md-4,\\n  .my-md-4 {\\n    margin-top: 1.5rem !important;\\n  }\\n  .mr-md-4,\\n  .mx-md-4 {\\n    margin-right: 1.5rem !important;\\n  }\\n  .mb-md-4,\\n  .my-md-4 {\\n    margin-bottom: 1.5rem !important;\\n  }\\n  .ml-md-4,\\n  .mx-md-4 {\\n    margin-left: 1.5rem !important;\\n  }\\n  .m-md-5 {\\n    margin: 3rem !important;\\n  }\\n  .mt-md-5,\\n  .my-md-5 {\\n    margin-top: 3rem !important;\\n  }\\n  .mr-md-5,\\n  .mx-md-5 {\\n    margin-right: 3rem !important;\\n  }\\n  .mb-md-5,\\n  .my-md-5 {\\n    margin-bottom: 3rem !important;\\n  }\\n  .ml-md-5,\\n  .mx-md-5 {\\n    margin-left: 3rem !important;\\n  }\\n  .p-md-0 {\\n    padding: 0 !important;\\n  }\\n  .pt-md-0,\\n  .py-md-0 {\\n    padding-top: 0 !important;\\n  }\\n  .pr-md-0,\\n  .px-md-0 {\\n    padding-right: 0 !important;\\n  }\\n  .pb-md-0,\\n  .py-md-0 {\\n    padding-bottom: 0 !important;\\n  }\\n  .pl-md-0,\\n  .px-md-0 {\\n    padding-left: 0 !important;\\n  }\\n  .p-md-1 {\\n    padding: 0.25rem !important;\\n  }\\n  .pt-md-1,\\n  .py-md-1 {\\n    padding-top: 0.25rem !important;\\n  }\\n  .pr-md-1,\\n  .px-md-1 {\\n    padding-right: 0.25rem !important;\\n  }\\n  .pb-md-1,\\n  .py-md-1 {\\n    padding-bottom: 0.25rem !important;\\n  }\\n  .pl-md-1,\\n  .px-md-1 {\\n    padding-left: 0.25rem !important;\\n  }\\n  .p-md-2 {\\n    padding: 0.5rem !important;\\n  }\\n  .pt-md-2,\\n  .py-md-2 {\\n    padding-top: 0.5rem !important;\\n  }\\n  .pr-md-2,\\n  .px-md-2 {\\n    padding-right: 0.5rem !important;\\n  }\\n  .pb-md-2,\\n  .py-md-2 {\\n    padding-bottom: 0.5rem !important;\\n  }\\n  .pl-md-2,\\n  .px-md-2 {\\n    padding-left: 0.5rem !important;\\n  }\\n  .p-md-3 {\\n    padding: 1rem !important;\\n  }\\n  .pt-md-3,\\n  .py-md-3 {\\n    padding-top: 1rem !important;\\n  }\\n  .pr-md-3,\\n  .px-md-3 {\\n    padding-right: 1rem !important;\\n  }\\n  .pb-md-3,\\n  .py-md-3 {\\n    padding-bottom: 1rem !important;\\n  }\\n  .pl-md-3,\\n  .px-md-3 {\\n    padding-left: 1rem !important;\\n  }\\n  .p-md-4 {\\n    padding: 1.5rem !important;\\n  }\\n  .pt-md-4,\\n  .py-md-4 {\\n    padding-top: 1.5rem !important;\\n  }\\n  .pr-md-4,\\n  .px-md-4 {\\n    padding-right: 1.5rem !important;\\n  }\\n  .pb-md-4,\\n  .py-md-4 {\\n    padding-bottom: 1.5rem !important;\\n  }\\n  .pl-md-4,\\n  .px-md-4 {\\n    padding-left: 1.5rem !important;\\n  }\\n  .p-md-5 {\\n    padding: 3rem !important;\\n  }\\n  .pt-md-5,\\n  .py-md-5 {\\n    padding-top: 3rem !important;\\n  }\\n  .pr-md-5,\\n  .px-md-5 {\\n    padding-right: 3rem !important;\\n  }\\n  .pb-md-5,\\n  .py-md-5 {\\n    padding-bottom: 3rem !important;\\n  }\\n  .pl-md-5,\\n  .px-md-5 {\\n    padding-left: 3rem !important;\\n  }\\n  .m-md-n1 {\\n    margin: -0.25rem !important;\\n  }\\n  .mt-md-n1,\\n  .my-md-n1 {\\n    margin-top: -0.25rem !important;\\n  }\\n  .mr-md-n1,\\n  .mx-md-n1 {\\n    margin-right: -0.25rem !important;\\n  }\\n  .mb-md-n1,\\n  .my-md-n1 {\\n    margin-bottom: -0.25rem !important;\\n  }\\n  .ml-md-n1,\\n  .mx-md-n1 {\\n    margin-left: -0.25rem !important;\\n  }\\n  .m-md-n2 {\\n    margin: -0.5rem !important;\\n  }\\n  .mt-md-n2,\\n  .my-md-n2 {\\n    margin-top: -0.5rem !important;\\n  }\\n  .mr-md-n2,\\n  .mx-md-n2 {\\n    margin-right: -0.5rem !important;\\n  }\\n  .mb-md-n2,\\n  .my-md-n2 {\\n    margin-bottom: -0.5rem !important;\\n  }\\n  .ml-md-n2,\\n  .mx-md-n2 {\\n    margin-left: -0.5rem !important;\\n  }\\n  .m-md-n3 {\\n    margin: -1rem !important;\\n  }\\n  .mt-md-n3,\\n  .my-md-n3 {\\n    margin-top: -1rem !important;\\n  }\\n  .mr-md-n3,\\n  .mx-md-n3 {\\n    margin-right: -1rem !important;\\n  }\\n  .mb-md-n3,\\n  .my-md-n3 {\\n    margin-bottom: -1rem !important;\\n  }\\n  .ml-md-n3,\\n  .mx-md-n3 {\\n    margin-left: -1rem !important;\\n  }\\n  .m-md-n4 {\\n    margin: -1.5rem !important;\\n  }\\n  .mt-md-n4,\\n  .my-md-n4 {\\n    margin-top: -1.5rem !important;\\n  }\\n  .mr-md-n4,\\n  .mx-md-n4 {\\n    margin-right: -1.5rem !important;\\n  }\\n  .mb-md-n4,\\n  .my-md-n4 {\\n    margin-bottom: -1.5rem !important;\\n  }\\n  .ml-md-n4,\\n  .mx-md-n4 {\\n    margin-left: -1.5rem !important;\\n  }\\n  .m-md-n5 {\\n    margin: -3rem !important;\\n  }\\n  .mt-md-n5,\\n  .my-md-n5 {\\n    margin-top: -3rem !important;\\n  }\\n  .mr-md-n5,\\n  .mx-md-n5 {\\n    margin-right: -3rem !important;\\n  }\\n  .mb-md-n5,\\n  .my-md-n5 {\\n    margin-bottom: -3rem !important;\\n  }\\n  .ml-md-n5,\\n  .mx-md-n5 {\\n    margin-left: -3rem !important;\\n  }\\n  .m-md-auto {\\n    margin: auto !important;\\n  }\\n  .mt-md-auto,\\n  .my-md-auto {\\n    margin-top: auto !important;\\n  }\\n  .mr-md-auto,\\n  .mx-md-auto {\\n    margin-right: auto !important;\\n  }\\n  .mb-md-auto,\\n  .my-md-auto {\\n    margin-bottom: auto !important;\\n  }\\n  .ml-md-auto,\\n  .mx-md-auto {\\n    margin-left: auto !important;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .m-lg-0 {\\n    margin: 0 !important;\\n  }\\n  .mt-lg-0,\\n  .my-lg-0 {\\n    margin-top: 0 !important;\\n  }\\n  .mr-lg-0,\\n  .mx-lg-0 {\\n    margin-right: 0 !important;\\n  }\\n  .mb-lg-0,\\n  .my-lg-0 {\\n    margin-bottom: 0 !important;\\n  }\\n  .ml-lg-0,\\n  .mx-lg-0 {\\n    margin-left: 0 !important;\\n  }\\n  .m-lg-1 {\\n    margin: 0.25rem !important;\\n  }\\n  .mt-lg-1,\\n  .my-lg-1 {\\n    margin-top: 0.25rem !important;\\n  }\\n  .mr-lg-1,\\n  .mx-lg-1 {\\n    margin-right: 0.25rem !important;\\n  }\\n  .mb-lg-1,\\n  .my-lg-1 {\\n    margin-bottom: 0.25rem !important;\\n  }\\n  .ml-lg-1,\\n  .mx-lg-1 {\\n    margin-left: 0.25rem !important;\\n  }\\n  .m-lg-2 {\\n    margin: 0.5rem !important;\\n  }\\n  .mt-lg-2,\\n  .my-lg-2 {\\n    margin-top: 0.5rem !important;\\n  }\\n  .mr-lg-2,\\n  .mx-lg-2 {\\n    margin-right: 0.5rem !important;\\n  }\\n  .mb-lg-2,\\n  .my-lg-2 {\\n    margin-bottom: 0.5rem !important;\\n  }\\n  .ml-lg-2,\\n  .mx-lg-2 {\\n    margin-left: 0.5rem !important;\\n  }\\n  .m-lg-3 {\\n    margin: 1rem !important;\\n  }\\n  .mt-lg-3,\\n  .my-lg-3 {\\n    margin-top: 1rem !important;\\n  }\\n  .mr-lg-3,\\n  .mx-lg-3 {\\n    margin-right: 1rem !important;\\n  }\\n  .mb-lg-3,\\n  .my-lg-3 {\\n    margin-bottom: 1rem !important;\\n  }\\n  .ml-lg-3,\\n  .mx-lg-3 {\\n    margin-left: 1rem !important;\\n  }\\n  .m-lg-4 {\\n    margin: 1.5rem !important;\\n  }\\n  .mt-lg-4,\\n  .my-lg-4 {\\n    margin-top: 1.5rem !important;\\n  }\\n  .mr-lg-4,\\n  .mx-lg-4 {\\n    margin-right: 1.5rem !important;\\n  }\\n  .mb-lg-4,\\n  .my-lg-4 {\\n    margin-bottom: 1.5rem !important;\\n  }\\n  .ml-lg-4,\\n  .mx-lg-4 {\\n    margin-left: 1.5rem !important;\\n  }\\n  .m-lg-5 {\\n    margin: 3rem !important;\\n  }\\n  .mt-lg-5,\\n  .my-lg-5 {\\n    margin-top: 3rem !important;\\n  }\\n  .mr-lg-5,\\n  .mx-lg-5 {\\n    margin-right: 3rem !important;\\n  }\\n  .mb-lg-5,\\n  .my-lg-5 {\\n    margin-bottom: 3rem !important;\\n  }\\n  .ml-lg-5,\\n  .mx-lg-5 {\\n    margin-left: 3rem !important;\\n  }\\n  .p-lg-0 {\\n    padding: 0 !important;\\n  }\\n  .pt-lg-0,\\n  .py-lg-0 {\\n    padding-top: 0 !important;\\n  }\\n  .pr-lg-0,\\n  .px-lg-0 {\\n    padding-right: 0 !important;\\n  }\\n  .pb-lg-0,\\n  .py-lg-0 {\\n    padding-bottom: 0 !important;\\n  }\\n  .pl-lg-0,\\n  .px-lg-0 {\\n    padding-left: 0 !important;\\n  }\\n  .p-lg-1 {\\n    padding: 0.25rem !important;\\n  }\\n  .pt-lg-1,\\n  .py-lg-1 {\\n    padding-top: 0.25rem !important;\\n  }\\n  .pr-lg-1,\\n  .px-lg-1 {\\n    padding-right: 0.25rem !important;\\n  }\\n  .pb-lg-1,\\n  .py-lg-1 {\\n    padding-bottom: 0.25rem !important;\\n  }\\n  .pl-lg-1,\\n  .px-lg-1 {\\n    padding-left: 0.25rem !important;\\n  }\\n  .p-lg-2 {\\n    padding: 0.5rem !important;\\n  }\\n  .pt-lg-2,\\n  .py-lg-2 {\\n    padding-top: 0.5rem !important;\\n  }\\n  .pr-lg-2,\\n  .px-lg-2 {\\n    padding-right: 0.5rem !important;\\n  }\\n  .pb-lg-2,\\n  .py-lg-2 {\\n    padding-bottom: 0.5rem !important;\\n  }\\n  .pl-lg-2,\\n  .px-lg-2 {\\n    padding-left: 0.5rem !important;\\n  }\\n  .p-lg-3 {\\n    padding: 1rem !important;\\n  }\\n  .pt-lg-3,\\n  .py-lg-3 {\\n    padding-top: 1rem !important;\\n  }\\n  .pr-lg-3,\\n  .px-lg-3 {\\n    padding-right: 1rem !important;\\n  }\\n  .pb-lg-3,\\n  .py-lg-3 {\\n    padding-bottom: 1rem !important;\\n  }\\n  .pl-lg-3,\\n  .px-lg-3 {\\n    padding-left: 1rem !important;\\n  }\\n  .p-lg-4 {\\n    padding: 1.5rem !important;\\n  }\\n  .pt-lg-4,\\n  .py-lg-4 {\\n    padding-top: 1.5rem !important;\\n  }\\n  .pr-lg-4,\\n  .px-lg-4 {\\n    padding-right: 1.5rem !important;\\n  }\\n  .pb-lg-4,\\n  .py-lg-4 {\\n    padding-bottom: 1.5rem !important;\\n  }\\n  .pl-lg-4,\\n  .px-lg-4 {\\n    padding-left: 1.5rem !important;\\n  }\\n  .p-lg-5 {\\n    padding: 3rem !important;\\n  }\\n  .pt-lg-5,\\n  .py-lg-5 {\\n    padding-top: 3rem !important;\\n  }\\n  .pr-lg-5,\\n  .px-lg-5 {\\n    padding-right: 3rem !important;\\n  }\\n  .pb-lg-5,\\n  .py-lg-5 {\\n    padding-bottom: 3rem !important;\\n  }\\n  .pl-lg-5,\\n  .px-lg-5 {\\n    padding-left: 3rem !important;\\n  }\\n  .m-lg-n1 {\\n    margin: -0.25rem !important;\\n  }\\n  .mt-lg-n1,\\n  .my-lg-n1 {\\n    margin-top: -0.25rem !important;\\n  }\\n  .mr-lg-n1,\\n  .mx-lg-n1 {\\n    margin-right: -0.25rem !important;\\n  }\\n  .mb-lg-n1,\\n  .my-lg-n1 {\\n    margin-bottom: -0.25rem !important;\\n  }\\n  .ml-lg-n1,\\n  .mx-lg-n1 {\\n    margin-left: -0.25rem !important;\\n  }\\n  .m-lg-n2 {\\n    margin: -0.5rem !important;\\n  }\\n  .mt-lg-n2,\\n  .my-lg-n2 {\\n    margin-top: -0.5rem !important;\\n  }\\n  .mr-lg-n2,\\n  .mx-lg-n2 {\\n    margin-right: -0.5rem !important;\\n  }\\n  .mb-lg-n2,\\n  .my-lg-n2 {\\n    margin-bottom: -0.5rem !important;\\n  }\\n  .ml-lg-n2,\\n  .mx-lg-n2 {\\n    margin-left: -0.5rem !important;\\n  }\\n  .m-lg-n3 {\\n    margin: -1rem !important;\\n  }\\n  .mt-lg-n3,\\n  .my-lg-n3 {\\n    margin-top: -1rem !important;\\n  }\\n  .mr-lg-n3,\\n  .mx-lg-n3 {\\n    margin-right: -1rem !important;\\n  }\\n  .mb-lg-n3,\\n  .my-lg-n3 {\\n    margin-bottom: -1rem !important;\\n  }\\n  .ml-lg-n3,\\n  .mx-lg-n3 {\\n    margin-left: -1rem !important;\\n  }\\n  .m-lg-n4 {\\n    margin: -1.5rem !important;\\n  }\\n  .mt-lg-n4,\\n  .my-lg-n4 {\\n    margin-top: -1.5rem !important;\\n  }\\n  .mr-lg-n4,\\n  .mx-lg-n4 {\\n    margin-right: -1.5rem !important;\\n  }\\n  .mb-lg-n4,\\n  .my-lg-n4 {\\n    margin-bottom: -1.5rem !important;\\n  }\\n  .ml-lg-n4,\\n  .mx-lg-n4 {\\n    margin-left: -1.5rem !important;\\n  }\\n  .m-lg-n5 {\\n    margin: -3rem !important;\\n  }\\n  .mt-lg-n5,\\n  .my-lg-n5 {\\n    margin-top: -3rem !important;\\n  }\\n  .mr-lg-n5,\\n  .mx-lg-n5 {\\n    margin-right: -3rem !important;\\n  }\\n  .mb-lg-n5,\\n  .my-lg-n5 {\\n    margin-bottom: -3rem !important;\\n  }\\n  .ml-lg-n5,\\n  .mx-lg-n5 {\\n    margin-left: -3rem !important;\\n  }\\n  .m-lg-auto {\\n    margin: auto !important;\\n  }\\n  .mt-lg-auto,\\n  .my-lg-auto {\\n    margin-top: auto !important;\\n  }\\n  .mr-lg-auto,\\n  .mx-lg-auto {\\n    margin-right: auto !important;\\n  }\\n  .mb-lg-auto,\\n  .my-lg-auto {\\n    margin-bottom: auto !important;\\n  }\\n  .ml-lg-auto,\\n  .mx-lg-auto {\\n    margin-left: auto !important;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .m-xl-0 {\\n    margin: 0 !important;\\n  }\\n  .mt-xl-0,\\n  .my-xl-0 {\\n    margin-top: 0 !important;\\n  }\\n  .mr-xl-0,\\n  .mx-xl-0 {\\n    margin-right: 0 !important;\\n  }\\n  .mb-xl-0,\\n  .my-xl-0 {\\n    margin-bottom: 0 !important;\\n  }\\n  .ml-xl-0,\\n  .mx-xl-0 {\\n    margin-left: 0 !important;\\n  }\\n  .m-xl-1 {\\n    margin: 0.25rem !important;\\n  }\\n  .mt-xl-1,\\n  .my-xl-1 {\\n    margin-top: 0.25rem !important;\\n  }\\n  .mr-xl-1,\\n  .mx-xl-1 {\\n    margin-right: 0.25rem !important;\\n  }\\n  .mb-xl-1,\\n  .my-xl-1 {\\n    margin-bottom: 0.25rem !important;\\n  }\\n  .ml-xl-1,\\n  .mx-xl-1 {\\n    margin-left: 0.25rem !important;\\n  }\\n  .m-xl-2 {\\n    margin: 0.5rem !important;\\n  }\\n  .mt-xl-2,\\n  .my-xl-2 {\\n    margin-top: 0.5rem !important;\\n  }\\n  .mr-xl-2,\\n  .mx-xl-2 {\\n    margin-right: 0.5rem !important;\\n  }\\n  .mb-xl-2,\\n  .my-xl-2 {\\n    margin-bottom: 0.5rem !important;\\n  }\\n  .ml-xl-2,\\n  .mx-xl-2 {\\n    margin-left: 0.5rem !important;\\n  }\\n  .m-xl-3 {\\n    margin: 1rem !important;\\n  }\\n  .mt-xl-3,\\n  .my-xl-3 {\\n    margin-top: 1rem !important;\\n  }\\n  .mr-xl-3,\\n  .mx-xl-3 {\\n    margin-right: 1rem !important;\\n  }\\n  .mb-xl-3,\\n  .my-xl-3 {\\n    margin-bottom: 1rem !important;\\n  }\\n  .ml-xl-3,\\n  .mx-xl-3 {\\n    margin-left: 1rem !important;\\n  }\\n  .m-xl-4 {\\n    margin: 1.5rem !important;\\n  }\\n  .mt-xl-4,\\n  .my-xl-4 {\\n    margin-top: 1.5rem !important;\\n  }\\n  .mr-xl-4,\\n  .mx-xl-4 {\\n    margin-right: 1.5rem !important;\\n  }\\n  .mb-xl-4,\\n  .my-xl-4 {\\n    margin-bottom: 1.5rem !important;\\n  }\\n  .ml-xl-4,\\n  .mx-xl-4 {\\n    margin-left: 1.5rem !important;\\n  }\\n  .m-xl-5 {\\n    margin: 3rem !important;\\n  }\\n  .mt-xl-5,\\n  .my-xl-5 {\\n    margin-top: 3rem !important;\\n  }\\n  .mr-xl-5,\\n  .mx-xl-5 {\\n    margin-right: 3rem !important;\\n  }\\n  .mb-xl-5,\\n  .my-xl-5 {\\n    margin-bottom: 3rem !important;\\n  }\\n  .ml-xl-5,\\n  .mx-xl-5 {\\n    margin-left: 3rem !important;\\n  }\\n  .p-xl-0 {\\n    padding: 0 !important;\\n  }\\n  .pt-xl-0,\\n  .py-xl-0 {\\n    padding-top: 0 !important;\\n  }\\n  .pr-xl-0,\\n  .px-xl-0 {\\n    padding-right: 0 !important;\\n  }\\n  .pb-xl-0,\\n  .py-xl-0 {\\n    padding-bottom: 0 !important;\\n  }\\n  .pl-xl-0,\\n  .px-xl-0 {\\n    padding-left: 0 !important;\\n  }\\n  .p-xl-1 {\\n    padding: 0.25rem !important;\\n  }\\n  .pt-xl-1,\\n  .py-xl-1 {\\n    padding-top: 0.25rem !important;\\n  }\\n  .pr-xl-1,\\n  .px-xl-1 {\\n    padding-right: 0.25rem !important;\\n  }\\n  .pb-xl-1,\\n  .py-xl-1 {\\n    padding-bottom: 0.25rem !important;\\n  }\\n  .pl-xl-1,\\n  .px-xl-1 {\\n    padding-left: 0.25rem !important;\\n  }\\n  .p-xl-2 {\\n    padding: 0.5rem !important;\\n  }\\n  .pt-xl-2,\\n  .py-xl-2 {\\n    padding-top: 0.5rem !important;\\n  }\\n  .pr-xl-2,\\n  .px-xl-2 {\\n    padding-right: 0.5rem !important;\\n  }\\n  .pb-xl-2,\\n  .py-xl-2 {\\n    padding-bottom: 0.5rem !important;\\n  }\\n  .pl-xl-2,\\n  .px-xl-2 {\\n    padding-left: 0.5rem !important;\\n  }\\n  .p-xl-3 {\\n    padding: 1rem !important;\\n  }\\n  .pt-xl-3,\\n  .py-xl-3 {\\n    padding-top: 1rem !important;\\n  }\\n  .pr-xl-3,\\n  .px-xl-3 {\\n    padding-right: 1rem !important;\\n  }\\n  .pb-xl-3,\\n  .py-xl-3 {\\n    padding-bottom: 1rem !important;\\n  }\\n  .pl-xl-3,\\n  .px-xl-3 {\\n    padding-left: 1rem !important;\\n  }\\n  .p-xl-4 {\\n    padding: 1.5rem !important;\\n  }\\n  .pt-xl-4,\\n  .py-xl-4 {\\n    padding-top: 1.5rem !important;\\n  }\\n  .pr-xl-4,\\n  .px-xl-4 {\\n    padding-right: 1.5rem !important;\\n  }\\n  .pb-xl-4,\\n  .py-xl-4 {\\n    padding-bottom: 1.5rem !important;\\n  }\\n  .pl-xl-4,\\n  .px-xl-4 {\\n    padding-left: 1.5rem !important;\\n  }\\n  .p-xl-5 {\\n    padding: 3rem !important;\\n  }\\n  .pt-xl-5,\\n  .py-xl-5 {\\n    padding-top: 3rem !important;\\n  }\\n  .pr-xl-5,\\n  .px-xl-5 {\\n    padding-right: 3rem !important;\\n  }\\n  .pb-xl-5,\\n  .py-xl-5 {\\n    padding-bottom: 3rem !important;\\n  }\\n  .pl-xl-5,\\n  .px-xl-5 {\\n    padding-left: 3rem !important;\\n  }\\n  .m-xl-n1 {\\n    margin: -0.25rem !important;\\n  }\\n  .mt-xl-n1,\\n  .my-xl-n1 {\\n    margin-top: -0.25rem !important;\\n  }\\n  .mr-xl-n1,\\n  .mx-xl-n1 {\\n    margin-right: -0.25rem !important;\\n  }\\n  .mb-xl-n1,\\n  .my-xl-n1 {\\n    margin-bottom: -0.25rem !important;\\n  }\\n  .ml-xl-n1,\\n  .mx-xl-n1 {\\n    margin-left: -0.25rem !important;\\n  }\\n  .m-xl-n2 {\\n    margin: -0.5rem !important;\\n  }\\n  .mt-xl-n2,\\n  .my-xl-n2 {\\n    margin-top: -0.5rem !important;\\n  }\\n  .mr-xl-n2,\\n  .mx-xl-n2 {\\n    margin-right: -0.5rem !important;\\n  }\\n  .mb-xl-n2,\\n  .my-xl-n2 {\\n    margin-bottom: -0.5rem !important;\\n  }\\n  .ml-xl-n2,\\n  .mx-xl-n2 {\\n    margin-left: -0.5rem !important;\\n  }\\n  .m-xl-n3 {\\n    margin: -1rem !important;\\n  }\\n  .mt-xl-n3,\\n  .my-xl-n3 {\\n    margin-top: -1rem !important;\\n  }\\n  .mr-xl-n3,\\n  .mx-xl-n3 {\\n    margin-right: -1rem !important;\\n  }\\n  .mb-xl-n3,\\n  .my-xl-n3 {\\n    margin-bottom: -1rem !important;\\n  }\\n  .ml-xl-n3,\\n  .mx-xl-n3 {\\n    margin-left: -1rem !important;\\n  }\\n  .m-xl-n4 {\\n    margin: -1.5rem !important;\\n  }\\n  .mt-xl-n4,\\n  .my-xl-n4 {\\n    margin-top: -1.5rem !important;\\n  }\\n  .mr-xl-n4,\\n  .mx-xl-n4 {\\n    margin-right: -1.5rem !important;\\n  }\\n  .mb-xl-n4,\\n  .my-xl-n4 {\\n    margin-bottom: -1.5rem !important;\\n  }\\n  .ml-xl-n4,\\n  .mx-xl-n4 {\\n    margin-left: -1.5rem !important;\\n  }\\n  .m-xl-n5 {\\n    margin: -3rem !important;\\n  }\\n  .mt-xl-n5,\\n  .my-xl-n5 {\\n    margin-top: -3rem !important;\\n  }\\n  .mr-xl-n5,\\n  .mx-xl-n5 {\\n    margin-right: -3rem !important;\\n  }\\n  .mb-xl-n5,\\n  .my-xl-n5 {\\n    margin-bottom: -3rem !important;\\n  }\\n  .ml-xl-n5,\\n  .mx-xl-n5 {\\n    margin-left: -3rem !important;\\n  }\\n  .m-xl-auto {\\n    margin: auto !important;\\n  }\\n  .mt-xl-auto,\\n  .my-xl-auto {\\n    margin-top: auto !important;\\n  }\\n  .mr-xl-auto,\\n  .mx-xl-auto {\\n    margin-right: auto !important;\\n  }\\n  .mb-xl-auto,\\n  .my-xl-auto {\\n    margin-bottom: auto !important;\\n  }\\n  .ml-xl-auto,\\n  .mx-xl-auto {\\n    margin-left: auto !important;\\n  }\\n}\\n\\n.text-monospace {\\n  font-family: SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace !important;\\n}\\n\\n.text-justify {\\n  text-align: justify !important;\\n}\\n\\n.text-wrap {\\n  white-space: normal !important;\\n}\\n\\n.text-nowrap {\\n  white-space: nowrap !important;\\n}\\n\\n.text-truncate {\\n  overflow: hidden;\\n  text-overflow: ellipsis;\\n  white-space: nowrap;\\n}\\n\\n.text-left {\\n  text-align: left !important;\\n}\\n\\n.text-right {\\n  text-align: right !important;\\n}\\n\\n.text-center {\\n  text-align: center !important;\\n}\\n\\n@media (min-width: 576px) {\\n  .text-sm-left {\\n    text-align: left !important;\\n  }\\n  .text-sm-right {\\n    text-align: right !important;\\n  }\\n  .text-sm-center {\\n    text-align: center !important;\\n  }\\n}\\n\\n@media (min-width: 768px) {\\n  .text-md-left {\\n    text-align: left !important;\\n  }\\n  .text-md-right {\\n    text-align: right !important;\\n  }\\n  .text-md-center {\\n    text-align: center !important;\\n  }\\n}\\n\\n@media (min-width: 992px) {\\n  .text-lg-left {\\n    text-align: left !important;\\n  }\\n  .text-lg-right {\\n    text-align: right !important;\\n  }\\n  .text-lg-center {\\n    text-align: center !important;\\n  }\\n}\\n\\n@media (min-width: 1200px) {\\n  .text-xl-left {\\n    text-align: left !important;\\n  }\\n  .text-xl-right {\\n    text-align: right !important;\\n  }\\n  .text-xl-center {\\n    text-align: center !important;\\n  }\\n}\\n\\n.text-lowercase {\\n  text-transform: lowercase !important;\\n}\\n\\n.text-uppercase {\\n  text-transform: uppercase !important;\\n}\\n\\n.text-capitalize {\\n  text-transform: capitalize !important;\\n}\\n\\n.font-weight-light {\\n  font-weight: 300 !important;\\n}\\n\\n.font-weight-lighter {\\n  font-weight: lighter !important;\\n}\\n\\n.font-weight-normal {\\n  font-weight: 400 !important;\\n}\\n\\n.font-weight-bold {\\n  font-weight: 700 !important;\\n}\\n\\n.font-weight-bolder {\\n  font-weight: bolder !important;\\n}\\n\\n.font-italic {\\n  font-style: italic !important;\\n}\\n\\n.text-white {\\n  color: #fff !important;\\n}\\n\\n.text-primary {\\n  color: #007bff !important;\\n}\\n\\na.text-primary:hover, a.text-primary:focus {\\n  color: #0056b3 !important;\\n}\\n\\n.text-secondary {\\n  color: #6c757d !important;\\n}\\n\\na.text-secondary:hover, a.text-secondary:focus {\\n  color: #494f54 !important;\\n}\\n\\n.text-success {\\n  color: #28a745 !important;\\n}\\n\\na.text-success:hover, a.text-success:focus {\\n  color: #19692c !important;\\n}\\n\\n.text-info {\\n  color: #17a2b8 !important;\\n}\\n\\na.text-info:hover, a.text-info:focus {\\n  color: #0f6674 !important;\\n}\\n\\n.text-warning {\\n  color: #ffc107 !important;\\n}\\n\\na.text-warning:hover, a.text-warning:focus {\\n  color: #ba8b00 !important;\\n}\\n\\n.text-danger {\\n  color: #dc3545 !important;\\n}\\n\\na.text-danger:hover, a.text-danger:focus {\\n  color: #a71d2a !important;\\n}\\n\\n.text-light {\\n  color: #f8f9fa !important;\\n}\\n\\na.text-light:hover, a.text-light:focus {\\n  color: #cbd3da !important;\\n}\\n\\n.text-dark {\\n  color: #343a40 !important;\\n}\\n\\na.text-dark:hover, a.text-dark:focus {\\n  color: #121416 !important;\\n}\\n\\n.text-body {\\n  color: #212529 !important;\\n}\\n\\n.text-muted {\\n  color: #6c757d !important;\\n}\\n\\n.text-black-50 {\\n  color: rgba(0, 0, 0, 0.5) !important;\\n}\\n\\n.text-white-50 {\\n  color: rgba(255, 255, 255, 0.5) !important;\\n}\\n\\n.text-hide {\\n  font: 0/0 a;\\n  color: transparent;\\n  text-shadow: none;\\n  background-color: transparent;\\n  border: 0;\\n}\\n\\n.text-decoration-none {\\n  text-decoration: none !important;\\n}\\n\\n.text-break {\\n  word-break: break-word !important;\\n  overflow-wrap: break-word !important;\\n}\\n\\n.text-reset {\\n  color: inherit !important;\\n}\\n\\n.visible {\\n  visibility: visible !important;\\n}\\n\\n.invisible {\\n  visibility: hidden !important;\\n}\\n\\n@media print {\\n  *,\\n  *::before,\\n  *::after {\\n    text-shadow: none !important;\\n    box-shadow: none !important;\\n  }\\n  a:not(.btn) {\\n    text-decoration: underline;\\n  }\\n  abbr[title]::after {\\n    content: \\\" (\\\" attr(title) \\\")\\\";\\n  }\\n  pre {\\n    white-space: pre-wrap !important;\\n  }\\n  pre,\\n  blockquote {\\n    border: 1px solid #adb5bd;\\n    page-break-inside: avoid;\\n  }\\n  thead {\\n    display: table-header-group;\\n  }\\n  tr,\\n  img {\\n    page-break-inside: avoid;\\n  }\\n  p,\\n  h2,\\n  h3 {\\n    orphans: 3;\\n    widows: 3;\\n  }\\n  h2,\\n  h3 {\\n    page-break-after: avoid;\\n  }\\n  @page {\\n    size: a3;\\n  }\\n  body {\\n    min-width: 992px !important;\\n  }\\n  .container {\\n    min-width: 992px !important;\\n  }\\n  .navbar {\\n    display: none;\\n  }\\n  .badge {\\n    border: 1px solid #000;\\n  }\\n  .table {\\n    border-collapse: collapse !important;\\n  }\\n  .table td,\\n  .table th {\\n    background-color: #fff !important;\\n  }\\n  .table-bordered th,\\n  .table-bordered td {\\n    border: 1px solid #dee2e6 !important;\\n  }\\n  .table-dark {\\n    color: inherit;\\n  }\\n  .table-dark th,\\n  .table-dark td,\\n  .table-dark thead th,\\n  .table-dark tbody + tbody {\\n    border-color: #dee2e6;\\n  }\\n  .table .thead-dark th {\\n    color: inherit;\\n    border-color: #dee2e6;\\n  }\\n}\\n\\n/*# sourceMappingURL=bootstrap.css.map */\",\"// Hover mixin and `$enable-hover-media-query` are deprecated.\\n//\\n// Originally added during our alphas and maintained during betas, this mixin was\\n// designed to prevent `:hover` stickiness on iOS-an issue where hover styles\\n// would persist after initial touch.\\n//\\n// For backward compatibility, we've kept these mixins and updated them to\\n// always return their regular pseudo-classes instead of a shimmed media query.\\n//\\n// Issue: https://github.com/twbs/bootstrap/issues/25195\\n\\n@mixin hover {\\n  &:hover { @content; }\\n}\\n\\n@mixin hover-focus {\\n  &:hover,\\n  &:focus {\\n    @content;\\n  }\\n}\\n\\n@mixin plain-hover-focus {\\n  &,\\n  &:hover,\\n  &:focus {\\n    @content;\\n  }\\n}\\n\\n@mixin hover-focus-active {\\n  &:hover,\\n  &:focus,\\n  &:active {\\n    @content;\\n  }\\n}\\n\",\"// stylelint-disable declaration-no-important, selector-list-comma-newline-after\\n\\n//\\n// Headings\\n//\\n\\nh1, h2, h3, h4, h5, h6,\\n.h1, .h2, .h3, .h4, .h5, .h6 {\\n  margin-bottom: $headings-margin-bottom;\\n  font-family: $headings-font-family;\\n  font-weight: $headings-font-weight;\\n  line-height: $headings-line-height;\\n  color: $headings-color;\\n}\\n\\nh1, .h1 { @include font-size($h1-font-size); }\\nh2, .h2 { @include font-size($h2-font-size); }\\nh3, .h3 { @include font-size($h3-font-size); }\\nh4, .h4 { @include font-size($h4-font-size); }\\nh5, .h5 { @include font-size($h5-font-size); }\\nh6, .h6 { @include font-size($h6-font-size); }\\n\\n.lead {\\n  @include font-size($lead-font-size);\\n  font-weight: $lead-font-weight;\\n}\\n\\n// Type display classes\\n.display-1 {\\n  @include font-size($display1-size);\\n  font-weight: $display1-weight;\\n  line-height: $display-line-height;\\n}\\n.display-2 {\\n  @include font-size($display2-size);\\n  font-weight: $display2-weight;\\n  line-height: $display-line-height;\\n}\\n.display-3 {\\n  @include font-size($display3-size);\\n  font-weight: $display3-weight;\\n  line-height: $display-line-height;\\n}\\n.display-4 {\\n  @include font-size($display4-size);\\n  font-weight: $display4-weight;\\n  line-height: $display-line-height;\\n}\\n\\n\\n//\\n// Horizontal rules\\n//\\n\\nhr {\\n  margin-top: $hr-margin-y;\\n  margin-bottom: $hr-margin-y;\\n  border: 0;\\n  border-top: $hr-border-width solid $hr-border-color;\\n}\\n\\n\\n//\\n// Emphasis\\n//\\n\\nsmall,\\n.small {\\n  @include font-size($small-font-size);\\n  font-weight: $font-weight-normal;\\n}\\n\\nmark,\\n.mark {\\n  padding: $mark-padding;\\n  background-color: $mark-bg;\\n}\\n\\n\\n//\\n// Lists\\n//\\n\\n.list-unstyled {\\n  @include list-unstyled;\\n}\\n\\n// Inline turns list items into inline-block\\n.list-inline {\\n  @include list-unstyled;\\n}\\n.list-inline-item {\\n  display: inline-block;\\n\\n  &:not(:last-child) {\\n    margin-right: $list-inline-padding;\\n  }\\n}\\n\\n\\n//\\n// Misc\\n//\\n\\n// Builds on `abbr`\\n.initialism {\\n  @include font-size(90%);\\n  text-transform: uppercase;\\n}\\n\\n// Blockquotes\\n.blockquote {\\n  margin-bottom: $spacer;\\n  @include font-size($blockquote-font-size);\\n}\\n\\n.blockquote-footer {\\n  display: block;\\n  @include font-size($blockquote-small-font-size);\\n  color: $blockquote-small-color;\\n\\n  &::before {\\n    content: \\\"\\\\2014\\\\00A0\\\"; // em dash, nbsp\\n  }\\n}\\n\",\"// Lists\\n\\n// Unstyled keeps list items block level, just removes default browser padding and list-style\\n@mixin list-unstyled {\\n  padding-left: 0;\\n  list-style: none;\\n}\\n\",\"// Responsive images (ensure images don't scale beyond their parents)\\n//\\n// This is purposefully opt-in via an explicit class rather than being the default for all `<img>`s.\\n// We previously tried the \\\"images are responsive by default\\\" approach in Bootstrap v2,\\n// and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps)\\n// which weren't expecting the images within themselves to be involuntarily resized.\\n// See also https://github.com/twbs/bootstrap/issues/18178\\n.img-fluid {\\n  @include img-fluid;\\n}\\n\\n\\n// Image thumbnails\\n.img-thumbnail {\\n  padding: $thumbnail-padding;\\n  background-color: $thumbnail-bg;\\n  border: $thumbnail-border-width solid $thumbnail-border-color;\\n  @include border-radius($thumbnail-border-radius);\\n  @include box-shadow($thumbnail-box-shadow);\\n\\n  // Keep them at most 100% wide\\n  @include img-fluid;\\n}\\n\\n//\\n// Figures\\n//\\n\\n.figure {\\n  // Ensures the caption's text aligns with the image.\\n  display: inline-block;\\n}\\n\\n.figure-img {\\n  margin-bottom: $spacer / 2;\\n  line-height: 1;\\n}\\n\\n.figure-caption {\\n  @include font-size($figure-caption-font-size);\\n  color: $figure-caption-color;\\n}\\n\",\"// Image Mixins\\n// - Responsive image\\n// - Retina image\\n\\n\\n// Responsive image\\n//\\n// Keep images from scaling beyond the width of their parents.\\n\\n@mixin img-fluid {\\n  // Part 1: Set a maximum relative to the parent\\n  max-width: 100%;\\n  // Part 2: Override the height to auto, otherwise images will be stretched\\n  // when setting a width and height attribute on the img element.\\n  height: auto;\\n}\\n\\n\\n// Retina image\\n//\\n// Short retina mixin for setting background-image and -size.\\n\\n@mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) {\\n  background-image: url($file-1x);\\n\\n  // Autoprefixer takes care of adding -webkit-min-device-pixel-ratio and -o-min-device-pixel-ratio,\\n  // but doesn't convert dppx=>dpi.\\n  // There's no such thing as unprefixed min-device-pixel-ratio since it's nonstandard.\\n  // Compatibility info: https://caniuse.com/#feat=css-media-resolution\\n  @media only screen and (min-resolution: 192dpi), // IE9-11 don't support dppx\\n    only screen and (min-resolution: 2dppx) { // Standardized\\n    background-image: url($file-2x);\\n    background-size: $width-1x $height-1x;\\n  }\\n  @include deprecate(\\\"`img-retina()`\\\", \\\"v4.3.0\\\", \\\"v5\\\");\\n}\\n\",\"// stylelint-disable property-blacklist\\n// Single side border-radius\\n\\n@mixin border-radius($radius: $border-radius, $fallback-border-radius: false) {\\n  @if $enable-rounded {\\n    border-radius: $radius;\\n  }\\n  @else if $fallback-border-radius != false {\\n    border-radius: $fallback-border-radius;\\n  }\\n}\\n\\n@mixin border-top-radius($radius) {\\n  @if $enable-rounded {\\n    border-top-left-radius: $radius;\\n    border-top-right-radius: $radius;\\n  }\\n}\\n\\n@mixin border-right-radius($radius) {\\n  @if $enable-rounded {\\n    border-top-right-radius: $radius;\\n    border-bottom-right-radius: $radius;\\n  }\\n}\\n\\n@mixin border-bottom-radius($radius) {\\n  @if $enable-rounded {\\n    border-bottom-right-radius: $radius;\\n    border-bottom-left-radius: $radius;\\n  }\\n}\\n\\n@mixin border-left-radius($radius) {\\n  @if $enable-rounded {\\n    border-top-left-radius: $radius;\\n    border-bottom-left-radius: $radius;\\n  }\\n}\\n\\n@mixin border-top-left-radius($radius) {\\n  @if $enable-rounded {\\n    border-top-left-radius: $radius;\\n  }\\n}\\n\\n@mixin border-top-right-radius($radius) {\\n  @if $enable-rounded {\\n    border-top-right-radius: $radius;\\n  }\\n}\\n\\n@mixin border-bottom-right-radius($radius) {\\n  @if $enable-rounded {\\n    border-bottom-right-radius: $radius;\\n  }\\n}\\n\\n@mixin border-bottom-left-radius($radius) {\\n  @if $enable-rounded {\\n    border-bottom-left-radius: $radius;\\n  }\\n}\\n\",\"// Inline code\\ncode {\\n  @include font-size($code-font-size);\\n  color: $code-color;\\n  word-break: break-word;\\n\\n  // Streamline the style when inside anchors to avoid broken underline and more\\n  a > & {\\n    color: inherit;\\n  }\\n}\\n\\n// User input typically entered via keyboard\\nkbd {\\n  padding: $kbd-padding-y $kbd-padding-x;\\n  @include font-size($kbd-font-size);\\n  color: $kbd-color;\\n  background-color: $kbd-bg;\\n  @include border-radius($border-radius-sm);\\n  @include box-shadow($kbd-box-shadow);\\n\\n  kbd {\\n    padding: 0;\\n    @include font-size(100%);\\n    font-weight: $nested-kbd-font-weight;\\n    @include box-shadow(none);\\n  }\\n}\\n\\n// Blocks of code\\npre {\\n  display: block;\\n  @include font-size($code-font-size);\\n  color: $pre-color;\\n\\n  // Account for some code outputs that place code tags in pre tags\\n  code {\\n    @include font-size(inherit);\\n    color: inherit;\\n    word-break: normal;\\n  }\\n}\\n\\n// Enable scrollable blocks of code\\n.pre-scrollable {\\n  max-height: $pre-scrollable-max-height;\\n  overflow-y: scroll;\\n}\\n\",\"// Container widths\\n//\\n// Set the container width, and override it for fixed navbars in media queries.\\n\\n@if $enable-grid-classes {\\n  .container {\\n    @include make-container();\\n    @include make-container-max-widths();\\n  }\\n}\\n\\n// Fluid container\\n//\\n// Utilizes the mixin meant for fixed width containers, but with 100% width for\\n// fluid, full width layouts.\\n\\n@if $enable-grid-classes {\\n  .container-fluid {\\n    @include make-container();\\n  }\\n}\\n\\n// Row\\n//\\n// Rows contain and clear the floats of your columns.\\n\\n@if $enable-grid-classes {\\n  .row {\\n    @include make-row();\\n  }\\n\\n  // Remove the negative margin from default .row, then the horizontal padding\\n  // from all immediate children columns (to prevent runaway style inheritance).\\n  .no-gutters {\\n    margin-right: 0;\\n    margin-left: 0;\\n\\n    > .col,\\n    > [class*=\\\"col-\\\"] {\\n      padding-right: 0;\\n      padding-left: 0;\\n    }\\n  }\\n}\\n\\n// Columns\\n//\\n// Common styles for small and large grid columns\\n\\n@if $enable-grid-classes {\\n  @include make-grid-columns();\\n}\\n\",\"/// Grid system\\n//\\n// Generate semantic grid columns with these mixins.\\n\\n@mixin make-container($gutter: $grid-gutter-width) {\\n  width: 100%;\\n  padding-right: $gutter / 2;\\n  padding-left: $gutter / 2;\\n  margin-right: auto;\\n  margin-left: auto;\\n}\\n\\n\\n// For each breakpoint, define the maximum width of the container in a media query\\n@mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) {\\n  @each $breakpoint, $container-max-width in $max-widths {\\n    @include media-breakpoint-up($breakpoint, $breakpoints) {\\n      max-width: $container-max-width;\\n    }\\n  }\\n}\\n\\n@mixin make-row($gutter: $grid-gutter-width) {\\n  display: flex;\\n  flex-wrap: wrap;\\n  margin-right: -$gutter / 2;\\n  margin-left: -$gutter / 2;\\n}\\n\\n@mixin make-col-ready($gutter: $grid-gutter-width) {\\n  position: relative;\\n  // Prevent columns from becoming too narrow when at smaller grid tiers by\\n  // always setting `width: 100%;`. This works because we use `flex` values\\n  // later on to override this initial width.\\n  width: 100%;\\n  padding-right: $gutter / 2;\\n  padding-left: $gutter / 2;\\n}\\n\\n@mixin make-col($size, $columns: $grid-columns) {\\n  flex: 0 0 percentage($size / $columns);\\n  // Add a `max-width` to ensure content within each column does not blow out\\n  // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari\\n  // do not appear to require this.\\n  max-width: percentage($size / $columns);\\n}\\n\\n@mixin make-col-offset($size, $columns: $grid-columns) {\\n  $num: $size / $columns;\\n  margin-left: if($num == 0, 0, percentage($num));\\n}\\n\",\"// Breakpoint viewport sizes and media queries.\\n//\\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\\n//\\n//    (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)\\n//\\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\\n\\n// Name of the next breakpoint, or null for the last breakpoint.\\n//\\n//    >> breakpoint-next(sm)\\n//    md\\n//    >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\\n//    md\\n//    >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))\\n//    md\\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\\n  $n: index($breakpoint-names, $name);\\n  @return if($n != null and $n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\\n}\\n\\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\\n//\\n//    >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\\n//    576px\\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\\n  $min: map-get($breakpoints, $name);\\n  @return if($min != 0, $min, null);\\n}\\n\\n// Maximum breakpoint width. Null for the largest (last) breakpoint.\\n// The maximum value is calculated as the minimum of the next one less 0.02px\\n// to work around the limitations of `min-` and `max-` prefixes and viewports with fractional widths.\\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\\n//\\n//    >> breakpoint-max(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\\n//    767.98px\\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\\n  $next: breakpoint-next($name, $breakpoints);\\n  @return if($next, breakpoint-min($next, $breakpoints) - .02, null);\\n}\\n\\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\\n// Useful for making responsive utilities.\\n//\\n//    >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\\n//    \\\"\\\"  (Returns a blank string)\\n//    >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\\n//    \\\"-sm\\\"\\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\\n  @return if(breakpoint-min($name, $breakpoints) == null, \\\"\\\", \\\"-#{$name}\\\");\\n}\\n\\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\\n// Makes the @content apply to the given breakpoint and wider.\\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\\n  $min: breakpoint-min($name, $breakpoints);\\n  @if $min {\\n    @media (min-width: $min) {\\n      @content;\\n    }\\n  } @else {\\n    @content;\\n  }\\n}\\n\\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\\n// Makes the @content apply to the given breakpoint and narrower.\\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\\n  $max: breakpoint-max($name, $breakpoints);\\n  @if $max {\\n    @media (max-width: $max) {\\n      @content;\\n    }\\n  } @else {\\n    @content;\\n  }\\n}\\n\\n// Media that spans multiple breakpoint widths.\\n// Makes the @content apply between the min and max breakpoints\\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\\n  $min: breakpoint-min($lower, $breakpoints);\\n  $max: breakpoint-max($upper, $breakpoints);\\n\\n  @if $min != null and $max != null {\\n    @media (min-width: $min) and (max-width: $max) {\\n      @content;\\n    }\\n  } @else if $max == null {\\n    @include media-breakpoint-up($lower, $breakpoints) {\\n      @content;\\n    }\\n  } @else if $min == null {\\n    @include media-breakpoint-down($upper, $breakpoints) {\\n      @content;\\n    }\\n  }\\n}\\n\\n// Media between the breakpoint's minimum and maximum widths.\\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\\n  $min: breakpoint-min($name, $breakpoints);\\n  $max: breakpoint-max($name, $breakpoints);\\n\\n  @if $min != null and $max != null {\\n    @media (min-width: $min) and (max-width: $max) {\\n      @content;\\n    }\\n  } @else if $max == null {\\n    @include media-breakpoint-up($name, $breakpoints) {\\n      @content;\\n    }\\n  } @else if $min == null {\\n    @include media-breakpoint-down($name, $breakpoints) {\\n      @content;\\n    }\\n  }\\n}\\n\",\"// Framework grid generation\\n//\\n// Used only by Bootstrap to generate the correct number of grid classes given\\n// any value of `$grid-columns`.\\n\\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\\n  // Common properties for all breakpoints\\n  %grid-column {\\n    position: relative;\\n    width: 100%;\\n    padding-right: $gutter / 2;\\n    padding-left: $gutter / 2;\\n  }\\n\\n  @each $breakpoint in map-keys($breakpoints) {\\n    $infix: breakpoint-infix($breakpoint, $breakpoints);\\n\\n    // Allow columns to stretch full width below their breakpoints\\n    @for $i from 1 through $columns {\\n      .col#{$infix}-#{$i} {\\n        @extend %grid-column;\\n      }\\n    }\\n    .col#{$infix},\\n    .col#{$infix}-auto {\\n      @extend %grid-column;\\n    }\\n\\n    @include media-breakpoint-up($breakpoint, $breakpoints) {\\n      // Provide basic `.col-{bp}` classes for equal-width flexbox columns\\n      .col#{$infix} {\\n        flex-basis: 0;\\n        flex-grow: 1;\\n        max-width: 100%;\\n      }\\n      .col#{$infix}-auto {\\n        flex: 0 0 auto;\\n        width: auto;\\n        max-width: 100%; // Reset earlier grid tiers\\n      }\\n\\n      @for $i from 1 through $columns {\\n        .col#{$infix}-#{$i} {\\n          @include make-col($i, $columns);\\n        }\\n      }\\n\\n      .order#{$infix}-first { order: -1; }\\n\\n      .order#{$infix}-last { order: $columns + 1; }\\n\\n      @for $i from 0 through $columns {\\n        .order#{$infix}-#{$i} { order: $i; }\\n      }\\n\\n      // `$columns - 1` because offsetting by the width of an entire row isn't possible\\n      @for $i from 0 through ($columns - 1) {\\n        @if not ($infix == \\\"\\\" and $i == 0) { // Avoid emitting useless .offset-0\\n          .offset#{$infix}-#{$i} {\\n            @include make-col-offset($i, $columns);\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\n\",\"//\\n// Basic Bootstrap table\\n//\\n\\n.table {\\n  width: 100%;\\n  margin-bottom: $spacer;\\n  color: $table-color;\\n  background-color: $table-bg; // Reset for nesting within parents with `background-color`.\\n\\n  th,\\n  td {\\n    padding: $table-cell-padding;\\n    vertical-align: top;\\n    border-top: $table-border-width solid $table-border-color;\\n  }\\n\\n  thead th {\\n    vertical-align: bottom;\\n    border-bottom: (2 * $table-border-width) solid $table-border-color;\\n  }\\n\\n  tbody + tbody {\\n    border-top: (2 * $table-border-width) solid $table-border-color;\\n  }\\n}\\n\\n\\n//\\n// Condensed table w/ half padding\\n//\\n\\n.table-sm {\\n  th,\\n  td {\\n    padding: $table-cell-padding-sm;\\n  }\\n}\\n\\n\\n// Border versions\\n//\\n// Add or remove borders all around the table and between all the columns.\\n\\n.table-bordered {\\n  border: $table-border-width solid $table-border-color;\\n\\n  th,\\n  td {\\n    border: $table-border-width solid $table-border-color;\\n  }\\n\\n  thead {\\n    th,\\n    td {\\n      border-bottom-width: 2 * $table-border-width;\\n    }\\n  }\\n}\\n\\n.table-borderless {\\n  th,\\n  td,\\n  thead th,\\n  tbody + tbody {\\n    border: 0;\\n  }\\n}\\n\\n// Zebra-striping\\n//\\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\\n\\n.table-striped {\\n  tbody tr:nth-of-type(#{$table-striped-order}) {\\n    background-color: $table-accent-bg;\\n  }\\n}\\n\\n\\n// Hover effect\\n//\\n// Placed here since it has to come after the potential zebra striping\\n\\n.table-hover {\\n  tbody tr {\\n    @include hover {\\n      color: $table-hover-color;\\n      background-color: $table-hover-bg;\\n    }\\n  }\\n}\\n\\n\\n// Table backgrounds\\n//\\n// Exact selectors below required to override `.table-striped` and prevent\\n// inheritance to nested tables.\\n\\n@each $color, $value in $theme-colors {\\n  @include table-row-variant($color, theme-color-level($color, $table-bg-level), theme-color-level($color, $table-border-level));\\n}\\n\\n@include table-row-variant(active, $table-active-bg);\\n\\n\\n// Dark styles\\n//\\n// Same table markup, but inverted color scheme: dark background and light text.\\n\\n// stylelint-disable-next-line no-duplicate-selectors\\n.table {\\n  .thead-dark {\\n    th {\\n      color: $table-dark-color;\\n      background-color: $table-dark-bg;\\n      border-color: $table-dark-border-color;\\n    }\\n  }\\n\\n  .thead-light {\\n    th {\\n      color: $table-head-color;\\n      background-color: $table-head-bg;\\n      border-color: $table-border-color;\\n    }\\n  }\\n}\\n\\n.table-dark {\\n  color: $table-dark-color;\\n  background-color: $table-dark-bg;\\n\\n  th,\\n  td,\\n  thead th {\\n    border-color: $table-dark-border-color;\\n  }\\n\\n  &.table-bordered {\\n    border: 0;\\n  }\\n\\n  &.table-striped {\\n    tbody tr:nth-of-type(odd) {\\n      background-color: $table-dark-accent-bg;\\n    }\\n  }\\n\\n  &.table-hover {\\n    tbody tr {\\n      @include hover {\\n        color: $table-dark-hover-color;\\n        background-color: $table-dark-hover-bg;\\n      }\\n    }\\n  }\\n}\\n\\n\\n// Responsive tables\\n//\\n// Generate series of `.table-responsive-*` classes for configuring the screen\\n// size of where your table will overflow.\\n\\n.table-responsive {\\n  @each $breakpoint in map-keys($grid-breakpoints) {\\n    $next: breakpoint-next($breakpoint, $grid-breakpoints);\\n    $infix: breakpoint-infix($next, $grid-breakpoints);\\n\\n    &#{$infix} {\\n      @include media-breakpoint-down($breakpoint) {\\n        display: block;\\n        width: 100%;\\n        overflow-x: auto;\\n        -webkit-overflow-scrolling: touch;\\n\\n        // Prevent double border on horizontal scroll due to use of `display: block;`\\n        > .table-bordered {\\n          border: 0;\\n        }\\n      }\\n    }\\n  }\\n}\\n\",\"// Tables\\n\\n@mixin table-row-variant($state, $background, $border: null) {\\n  // Exact selectors below required to override `.table-striped` and prevent\\n  // inheritance to nested tables.\\n  .table-#{$state} {\\n    &,\\n    > th,\\n    > td {\\n      background-color: $background;\\n    }\\n\\n    @if $border != null {\\n      th,\\n      td,\\n      thead th,\\n      tbody + tbody {\\n        border-color: $border;\\n      }\\n    }\\n  }\\n\\n  // Hover states for `.table-hover`\\n  // Note: this is not available for cells or rows within `thead` or `tfoot`.\\n  .table-hover {\\n    $hover-background: darken($background, 5%);\\n\\n    .table-#{$state} {\\n      @include hover {\\n        background-color: $hover-background;\\n\\n        > td,\\n        > th {\\n          background-color: $hover-background;\\n        }\\n      }\\n    }\\n  }\\n}\\n\",\"// stylelint-disable selector-no-qualifying-type\\n\\n//\\n// Textual form controls\\n//\\n\\n.form-control {\\n  display: block;\\n  width: 100%;\\n  height: $input-height;\\n  padding: $input-padding-y $input-padding-x;\\n  font-family: $input-font-family;\\n  @include font-size($input-font-size);\\n  font-weight: $input-font-weight;\\n  line-height: $input-line-height;\\n  color: $input-color;\\n  background-color: $input-bg;\\n  background-clip: padding-box;\\n  border: $input-border-width solid $input-border-color;\\n\\n  // Note: This has no effect on <select>s in some browsers, due to the limited stylability of `<select>`s in CSS.\\n  @include border-radius($input-border-radius, 0);\\n\\n  @include box-shadow($input-box-shadow);\\n  @include transition($input-transition);\\n\\n  // Unstyle the caret on `<select>`s in IE10+.\\n  &::-ms-expand {\\n    background-color: transparent;\\n    border: 0;\\n  }\\n\\n  // Customize the `:focus` state to imitate native WebKit styles.\\n  @include form-control-focus();\\n\\n  // Placeholder\\n  &::placeholder {\\n    color: $input-placeholder-color;\\n    // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526.\\n    opacity: 1;\\n  }\\n\\n  // Disabled and read-only inputs\\n  //\\n  // HTML5 says that controls under a fieldset > legend:first-child won't be\\n  // disabled if the fieldset is disabled. Due to implementation difficulty, we\\n  // don't honor that edge case; we style them as disabled anyway.\\n  &:disabled,\\n  &[readonly] {\\n    background-color: $input-disabled-bg;\\n    // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655.\\n    opacity: 1;\\n  }\\n}\\n\\nselect.form-control {\\n  &:focus::-ms-value {\\n    // Suppress the nested default white text on blue background highlight given to\\n    // the selected option text when the (still closed) <select> receives focus\\n    // in IE and (under certain conditions) Edge, as it looks bad and cannot be made to\\n    // match the appearance of the native widget.\\n    // See https://github.com/twbs/bootstrap/issues/19398.\\n    color: $input-color;\\n    background-color: $input-bg;\\n  }\\n}\\n\\n// Make file inputs better match text inputs by forcing them to new lines.\\n.form-control-file,\\n.form-control-range {\\n  display: block;\\n  width: 100%;\\n}\\n\\n\\n//\\n// Labels\\n//\\n\\n// For use with horizontal and inline forms, when you need the label (or legend)\\n// text to align with the form controls.\\n.col-form-label {\\n  padding-top: calc(#{$input-padding-y} + #{$input-border-width});\\n  padding-bottom: calc(#{$input-padding-y} + #{$input-border-width});\\n  margin-bottom: 0; // Override the `<label>/<legend>` default\\n  @include font-size(inherit); // Override the `<legend>` default\\n  line-height: $input-line-height;\\n}\\n\\n.col-form-label-lg {\\n  padding-top: calc(#{$input-padding-y-lg} + #{$input-border-width});\\n  padding-bottom: calc(#{$input-padding-y-lg} + #{$input-border-width});\\n  @include font-size($input-font-size-lg);\\n  line-height: $input-line-height-lg;\\n}\\n\\n.col-form-label-sm {\\n  padding-top: calc(#{$input-padding-y-sm} + #{$input-border-width});\\n  padding-bottom: calc(#{$input-padding-y-sm} + #{$input-border-width});\\n  @include font-size($input-font-size-sm);\\n  line-height: $input-line-height-sm;\\n}\\n\\n\\n// Readonly controls as plain text\\n//\\n// Apply class to a readonly input to make it appear like regular plain\\n// text (without any border, background color, focus indicator)\\n\\n.form-control-plaintext {\\n  display: block;\\n  width: 100%;\\n  padding-top: $input-padding-y;\\n  padding-bottom: $input-padding-y;\\n  margin-bottom: 0; // match inputs if this class comes on inputs with default margins\\n  line-height: $input-line-height;\\n  color: $input-plaintext-color;\\n  background-color: transparent;\\n  border: solid transparent;\\n  border-width: $input-border-width 0;\\n\\n  &.form-control-sm,\\n  &.form-control-lg {\\n    padding-right: 0;\\n    padding-left: 0;\\n  }\\n}\\n\\n\\n// Form control sizing\\n//\\n// Build on `.form-control` with modifier classes to decrease or increase the\\n// height and font-size of form controls.\\n//\\n// Repeated in `_input_group.scss` to avoid Sass extend issues.\\n\\n.form-control-sm {\\n  height: $input-height-sm;\\n  padding: $input-padding-y-sm $input-padding-x-sm;\\n  @include font-size($input-font-size-sm);\\n  line-height: $input-line-height-sm;\\n  @include border-radius($input-border-radius-sm);\\n}\\n\\n.form-control-lg {\\n  height: $input-height-lg;\\n  padding: $input-padding-y-lg $input-padding-x-lg;\\n  @include font-size($input-font-size-lg);\\n  line-height: $input-line-height-lg;\\n  @include border-radius($input-border-radius-lg);\\n}\\n\\n// stylelint-disable-next-line no-duplicate-selectors\\nselect.form-control {\\n  &[size],\\n  &[multiple] {\\n    height: auto;\\n  }\\n}\\n\\ntextarea.form-control {\\n  height: auto;\\n}\\n\\n// Form groups\\n//\\n// Designed to help with the organization and spacing of vertical forms. For\\n// horizontal forms, use the predefined grid classes.\\n\\n.form-group {\\n  margin-bottom: $form-group-margin-bottom;\\n}\\n\\n.form-text {\\n  display: block;\\n  margin-top: $form-text-margin-top;\\n}\\n\\n\\n// Form grid\\n//\\n// Special replacement for our grid system's `.row` for tighter form layouts.\\n\\n.form-row {\\n  display: flex;\\n  flex-wrap: wrap;\\n  margin-right: -$form-grid-gutter-width / 2;\\n  margin-left: -$form-grid-gutter-width / 2;\\n\\n  > .col,\\n  > [class*=\\\"col-\\\"] {\\n    padding-right: $form-grid-gutter-width / 2;\\n    padding-left: $form-grid-gutter-width / 2;\\n  }\\n}\\n\\n\\n// Checkboxes and radios\\n//\\n// Indent the labels to position radios/checkboxes as hanging controls.\\n\\n.form-check {\\n  position: relative;\\n  display: block;\\n  padding-left: $form-check-input-gutter;\\n}\\n\\n.form-check-input {\\n  position: absolute;\\n  margin-top: $form-check-input-margin-y;\\n  margin-left: -$form-check-input-gutter;\\n\\n  &:disabled ~ .form-check-label {\\n    color: $text-muted;\\n  }\\n}\\n\\n.form-check-label {\\n  margin-bottom: 0; // Override default `<label>` bottom margin\\n}\\n\\n.form-check-inline {\\n  display: inline-flex;\\n  align-items: center;\\n  padding-left: 0; // Override base .form-check\\n  margin-right: $form-check-inline-margin-x;\\n\\n  // Undo .form-check-input defaults and add some `margin-right`.\\n  .form-check-input {\\n    position: static;\\n    margin-top: 0;\\n    margin-right: $form-check-inline-input-margin-x;\\n    margin-left: 0;\\n  }\\n}\\n\\n\\n// Form validation\\n//\\n// Provide feedback to users when form field values are valid or invalid. Works\\n// primarily for client-side validation via scoped `:invalid` and `:valid`\\n// pseudo-classes but also includes `.is-invalid` and `.is-valid` classes for\\n// server side validation.\\n\\n@each $state, $data in $form-validation-states {\\n  @include form-validation-state($state, map-get($data, color), map-get($data, icon));\\n}\\n\\n// Inline forms\\n//\\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\\n// forms begin stacked on extra small (mobile) devices and then go inline when\\n// viewports reach <768px.\\n//\\n// Requires wrapping inputs and labels with `.form-group` for proper display of\\n// default HTML form controls and our custom form controls (e.g., input groups).\\n\\n.form-inline {\\n  display: flex;\\n  flex-flow: row wrap;\\n  align-items: center; // Prevent shorter elements from growing to same height as others (e.g., small buttons growing to normal sized button height)\\n\\n  // Because we use flex, the initial sizing of checkboxes is collapsed and\\n  // doesn't occupy the full-width (which is what we want for xs grid tier),\\n  // so we force that here.\\n  .form-check {\\n    width: 100%;\\n  }\\n\\n  // Kick in the inline\\n  @include media-breakpoint-up(sm) {\\n    label {\\n      display: flex;\\n      align-items: center;\\n      justify-content: center;\\n      margin-bottom: 0;\\n    }\\n\\n    // Inline-block all the things for \\\"inline\\\"\\n    .form-group {\\n      display: flex;\\n      flex: 0 0 auto;\\n      flex-flow: row wrap;\\n      align-items: center;\\n      margin-bottom: 0;\\n    }\\n\\n    // Allow folks to *not* use `.form-group`\\n    .form-control {\\n      display: inline-block;\\n      width: auto; // Prevent labels from stacking above inputs in `.form-group`\\n      vertical-align: middle;\\n    }\\n\\n    // Make static controls behave like regular ones\\n    .form-control-plaintext {\\n      display: inline-block;\\n    }\\n\\n    .input-group,\\n    .custom-select {\\n      width: auto;\\n    }\\n\\n    // Remove default margin on radios/checkboxes that were used for stacking, and\\n    // then undo the floating of radios and checkboxes to match.\\n    .form-check {\\n      display: flex;\\n      align-items: center;\\n      justify-content: center;\\n      width: auto;\\n      padding-left: 0;\\n    }\\n    .form-check-input {\\n      position: relative;\\n      flex-shrink: 0;\\n      margin-top: 0;\\n      margin-right: $form-check-input-margin-x;\\n      margin-left: 0;\\n    }\\n\\n    .custom-control {\\n      align-items: center;\\n      justify-content: center;\\n    }\\n    .custom-control-label {\\n      margin-bottom: 0;\\n    }\\n  }\\n}\\n\",\"// stylelint-disable property-blacklist\\n@mixin transition($transition...) {\\n  @if $enable-transitions {\\n    @if length($transition) == 0 {\\n      transition: $transition-base;\\n    } @else {\\n      transition: $transition;\\n    }\\n  }\\n\\n  @if $enable-prefers-reduced-motion-media-query {\\n    @media (prefers-reduced-motion: reduce) {\\n      transition: none;\\n    }\\n  }\\n}\\n\",\"// Form control focus state\\n//\\n// Generate a customized focus state and for any input with the specified color,\\n// which defaults to the `$input-focus-border-color` variable.\\n//\\n// We highly encourage you to not customize the default value, but instead use\\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\\n// WebKit's default styles, but applicable to a wider range of browsers. Its\\n// usability and accessibility should be taken into account with any change.\\n//\\n// Example usage: change the default blue border and shadow to white for better\\n// contrast against a dark gray background.\\n@mixin form-control-focus() {\\n  &:focus {\\n    color: $input-focus-color;\\n    background-color: $input-focus-bg;\\n    border-color: $input-focus-border-color;\\n    outline: 0;\\n    // Avoid using mixin so we can pass custom focus shadow properly\\n    @if $enable-shadows {\\n      box-shadow: $input-box-shadow, $input-focus-box-shadow;\\n    } @else {\\n      box-shadow: $input-focus-box-shadow;\\n    }\\n  }\\n}\\n\\n\\n@mixin form-validation-state($state, $color, $icon) {\\n  .#{$state}-feedback {\\n    display: none;\\n    width: 100%;\\n    margin-top: $form-feedback-margin-top;\\n    @include font-size($form-feedback-font-size);\\n    color: $color;\\n  }\\n\\n  .#{$state}-tooltip {\\n    position: absolute;\\n    top: 100%;\\n    z-index: 5;\\n    display: none;\\n    max-width: 100%; // Contain to parent when possible\\n    padding: $form-feedback-tooltip-padding-y $form-feedback-tooltip-padding-x;\\n    margin-top: .1rem;\\n    @include font-size($form-feedback-tooltip-font-size);\\n    line-height: $form-feedback-tooltip-line-height;\\n    color: color-yiq($color);\\n    background-color: rgba($color, $form-feedback-tooltip-opacity);\\n    @include border-radius($form-feedback-tooltip-border-radius);\\n  }\\n\\n  .form-control {\\n    .was-validated &:#{$state},\\n    &.is-#{$state} {\\n      border-color: $color;\\n\\n      @if $enable-validation-icons {\\n        padding-right: $input-height-inner;\\n        background-image: $icon;\\n        background-repeat: no-repeat;\\n        background-position: center right $input-height-inner-quarter;\\n        background-size: $input-height-inner-half $input-height-inner-half;\\n      }\\n\\n      &:focus {\\n        border-color: $color;\\n        box-shadow: 0 0 0 $input-focus-width rgba($color, .25);\\n      }\\n\\n      ~ .#{$state}-feedback,\\n      ~ .#{$state}-tooltip {\\n        display: block;\\n      }\\n    }\\n  }\\n\\n  // stylelint-disable-next-line selector-no-qualifying-type\\n  textarea.form-control {\\n    .was-validated &:#{$state},\\n    &.is-#{$state} {\\n      @if $enable-validation-icons {\\n        padding-right: $input-height-inner;\\n        background-position: top $input-height-inner-quarter right $input-height-inner-quarter;\\n      }\\n    }\\n  }\\n\\n  .custom-select {\\n    .was-validated &:#{$state},\\n    &.is-#{$state} {\\n      border-color: $color;\\n\\n      @if $enable-validation-icons {\\n        padding-right: $custom-select-feedback-icon-padding-right;\\n        background: $custom-select-background, $icon $custom-select-bg no-repeat $custom-select-feedback-icon-position / $custom-select-feedback-icon-size;\\n      }\\n\\n      &:focus {\\n        border-color: $color;\\n        box-shadow: 0 0 0 $input-focus-width rgba($color, .25);\\n      }\\n\\n      ~ .#{$state}-feedback,\\n      ~ .#{$state}-tooltip {\\n        display: block;\\n      }\\n    }\\n  }\\n\\n\\n  .form-control-file {\\n    .was-validated &:#{$state},\\n    &.is-#{$state} {\\n      ~ .#{$state}-feedback,\\n      ~ .#{$state}-tooltip {\\n        display: block;\\n      }\\n    }\\n  }\\n\\n  .form-check-input {\\n    .was-validated &:#{$state},\\n    &.is-#{$state} {\\n      ~ .form-check-label {\\n        color: $color;\\n      }\\n\\n      ~ .#{$state}-feedback,\\n      ~ .#{$state}-tooltip {\\n        display: block;\\n      }\\n    }\\n  }\\n\\n  .custom-control-input {\\n    .was-validated &:#{$state},\\n    &.is-#{$state} {\\n      ~ .custom-control-label {\\n        color: $color;\\n\\n        &::before {\\n          border-color: $color;\\n        }\\n      }\\n\\n      ~ .#{$state}-feedback,\\n      ~ .#{$state}-tooltip {\\n        display: block;\\n      }\\n\\n      &:checked {\\n        ~ .custom-control-label::before {\\n          border-color: lighten($color, 10%);\\n          @include gradient-bg(lighten($color, 10%));\\n        }\\n      }\\n\\n      &:focus {\\n        ~ .custom-control-label::before {\\n          box-shadow: 0 0 0 $input-focus-width rgba($color, .25);\\n        }\\n\\n        &:not(:checked) ~ .custom-control-label::before {\\n          border-color: $color;\\n        }\\n      }\\n    }\\n  }\\n\\n  // custom file\\n  .custom-file-input {\\n    .was-validated &:#{$state},\\n    &.is-#{$state} {\\n      ~ .custom-file-label {\\n        border-color: $color;\\n      }\\n\\n      ~ .#{$state}-feedback,\\n      ~ .#{$state}-tooltip {\\n        display: block;\\n      }\\n\\n      &:focus {\\n        ~ .custom-file-label {\\n          border-color: $color;\\n          box-shadow: 0 0 0 $input-focus-width rgba($color, .25);\\n        }\\n      }\\n    }\\n  }\\n}\\n\",\"// Gradients\\n\\n@mixin gradient-bg($color) {\\n  @if $enable-gradients {\\n    background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x;\\n  } @else {\\n    background-color: $color;\\n  }\\n}\\n\\n// Horizontal gradient, from left to right\\n//\\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\\n@mixin gradient-x($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {\\n  background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent);\\n  background-repeat: repeat-x;\\n}\\n\\n// Vertical gradient, from top to bottom\\n//\\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\\n@mixin gradient-y($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {\\n  background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent);\\n  background-repeat: repeat-x;\\n}\\n\\n@mixin gradient-directional($start-color: $gray-700, $end-color: $gray-800, $deg: 45deg) {\\n  background-image: linear-gradient($deg, $start-color, $end-color);\\n  background-repeat: repeat-x;\\n}\\n@mixin gradient-x-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\\n  background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);\\n  background-repeat: no-repeat;\\n}\\n@mixin gradient-y-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\\n  background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);\\n  background-repeat: no-repeat;\\n}\\n@mixin gradient-radial($inner-color: $gray-700, $outer-color: $gray-800) {\\n  background-image: radial-gradient(circle, $inner-color, $outer-color);\\n  background-repeat: no-repeat;\\n}\\n@mixin gradient-striped($color: rgba($white, .15), $angle: 45deg) {\\n  background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\\n}\\n\",\"// stylelint-disable selector-no-qualifying-type\\n\\n//\\n// Base styles\\n//\\n\\n.btn {\\n  display: inline-block;\\n  font-family: $btn-font-family;\\n  font-weight: $btn-font-weight;\\n  color: $body-color;\\n  text-align: center;\\n  vertical-align: middle;\\n  user-select: none;\\n  background-color: transparent;\\n  border: $btn-border-width solid transparent;\\n  @include button-size($btn-padding-y, $btn-padding-x, $btn-font-size, $btn-line-height, $btn-border-radius);\\n  @include transition($btn-transition);\\n\\n  @include hover {\\n    color: $body-color;\\n    text-decoration: none;\\n  }\\n\\n  &:focus,\\n  &.focus {\\n    outline: 0;\\n    box-shadow: $btn-focus-box-shadow;\\n  }\\n\\n  // Disabled comes first so active can properly restyle\\n  &.disabled,\\n  &:disabled {\\n    opacity: $btn-disabled-opacity;\\n    @include box-shadow(none);\\n  }\\n\\n  &:not(:disabled):not(.disabled):active,\\n  &:not(:disabled):not(.disabled).active {\\n    @include box-shadow($btn-active-box-shadow);\\n\\n    &:focus {\\n      @include box-shadow($btn-focus-box-shadow, $btn-active-box-shadow);\\n    }\\n  }\\n}\\n\\n// Future-proof disabling of clicks on `<a>` elements\\na.btn.disabled,\\nfieldset:disabled a.btn {\\n  pointer-events: none;\\n}\\n\\n\\n//\\n// Alternate buttons\\n//\\n\\n@each $color, $value in $theme-colors {\\n  .btn-#{$color} {\\n    @include button-variant($value, $value);\\n  }\\n}\\n\\n@each $color, $value in $theme-colors {\\n  .btn-outline-#{$color} {\\n    @include button-outline-variant($value);\\n  }\\n}\\n\\n\\n//\\n// Link buttons\\n//\\n\\n// Make a button look and behave like a link\\n.btn-link {\\n  font-weight: $font-weight-normal;\\n  color: $link-color;\\n  text-decoration: $link-decoration;\\n\\n  @include hover {\\n    color: $link-hover-color;\\n    text-decoration: $link-hover-decoration;\\n  }\\n\\n  &:focus,\\n  &.focus {\\n    text-decoration: $link-hover-decoration;\\n    box-shadow: none;\\n  }\\n\\n  &:disabled,\\n  &.disabled {\\n    color: $btn-link-disabled-color;\\n    pointer-events: none;\\n  }\\n\\n  // No need for an active state here\\n}\\n\\n\\n//\\n// Button Sizes\\n//\\n\\n.btn-lg {\\n  @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-line-height-lg, $btn-border-radius-lg);\\n}\\n\\n.btn-sm {\\n  @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-line-height-sm, $btn-border-radius-sm);\\n}\\n\\n\\n//\\n// Block button\\n//\\n\\n.btn-block {\\n  display: block;\\n  width: 100%;\\n\\n  // Vertically space out multiple block buttons\\n  + .btn-block {\\n    margin-top: $btn-block-spacing-y;\\n  }\\n}\\n\\n// Specificity overrides\\ninput[type=\\\"submit\\\"],\\ninput[type=\\\"reset\\\"],\\ninput[type=\\\"button\\\"] {\\n  &.btn-block {\\n    width: 100%;\\n  }\\n}\\n\",\"// Button variants\\n//\\n// Easily pump out default styles, as well as :hover, :focus, :active,\\n// and disabled options for all buttons\\n\\n@mixin button-variant($background, $border, $hover-background: darken($background, 7.5%), $hover-border: darken($border, 10%), $active-background: darken($background, 10%), $active-border: darken($border, 12.5%)) {\\n  color: color-yiq($background);\\n  @include gradient-bg($background);\\n  border-color: $border;\\n  @include box-shadow($btn-box-shadow);\\n\\n  @include hover {\\n    color: color-yiq($hover-background);\\n    @include gradient-bg($hover-background);\\n    border-color: $hover-border;\\n  }\\n\\n  &:focus,\\n  &.focus {\\n    // Avoid using mixin so we can pass custom focus shadow properly\\n    @if $enable-shadows {\\n      box-shadow: $btn-box-shadow, 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5);\\n    } @else {\\n      box-shadow: 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5);\\n    }\\n  }\\n\\n  // Disabled comes first so active can properly restyle\\n  &.disabled,\\n  &:disabled {\\n    color: color-yiq($background);\\n    background-color: $background;\\n    border-color: $border;\\n    // Remove CSS gradients if they're enabled\\n    @if $enable-gradients {\\n      background-image: none;\\n    }\\n  }\\n\\n  &:not(:disabled):not(.disabled):active,\\n  &:not(:disabled):not(.disabled).active,\\n  .show > &.dropdown-toggle {\\n    color: color-yiq($active-background);\\n    background-color: $active-background;\\n    @if $enable-gradients {\\n      background-image: none; // Remove the gradient for the pressed/active state\\n    }\\n    border-color: $active-border;\\n\\n    &:focus {\\n      // Avoid using mixin so we can pass custom focus shadow properly\\n      @if $enable-shadows and $btn-active-box-shadow != none {\\n        box-shadow: $btn-active-box-shadow, 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5);\\n      } @else {\\n        box-shadow: 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5);\\n      }\\n    }\\n  }\\n}\\n\\n@mixin button-outline-variant($color, $color-hover: color-yiq($color), $active-background: $color, $active-border: $color) {\\n  color: $color;\\n  border-color: $color;\\n\\n  @include hover {\\n    color: $color-hover;\\n    background-color: $active-background;\\n    border-color: $active-border;\\n  }\\n\\n  &:focus,\\n  &.focus {\\n    box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);\\n  }\\n\\n  &.disabled,\\n  &:disabled {\\n    color: $color;\\n    background-color: transparent;\\n  }\\n\\n  &:not(:disabled):not(.disabled):active,\\n  &:not(:disabled):not(.disabled).active,\\n  .show > &.dropdown-toggle {\\n    color: color-yiq($active-background);\\n    background-color: $active-background;\\n    border-color: $active-border;\\n\\n    &:focus {\\n      // Avoid using mixin so we can pass custom focus shadow properly\\n      @if $enable-shadows and $btn-active-box-shadow != none {\\n        box-shadow: $btn-active-box-shadow, 0 0 0 $btn-focus-width rgba($color, .5);\\n      } @else {\\n        box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);\\n      }\\n    }\\n  }\\n}\\n\\n// Button sizes\\n@mixin button-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) {\\n  padding: $padding-y $padding-x;\\n  @include font-size($font-size);\\n  line-height: $line-height;\\n  // Manually declare to provide an override to the browser default\\n  @include border-radius($border-radius, 0);\\n}\\n\",\".fade {\\n  @include transition($transition-fade);\\n\\n  &:not(.show) {\\n    opacity: 0;\\n  }\\n}\\n\\n.collapse {\\n  &:not(.show) {\\n    display: none;\\n  }\\n}\\n\\n.collapsing {\\n  position: relative;\\n  height: 0;\\n  overflow: hidden;\\n  @include transition($transition-collapse);\\n}\\n\",\"// The dropdown wrapper (`<div>`)\\n.dropup,\\n.dropright,\\n.dropdown,\\n.dropleft {\\n  position: relative;\\n}\\n\\n.dropdown-toggle {\\n  white-space: nowrap;\\n\\n  // Generate the caret automatically\\n  @include caret;\\n}\\n\\n// The dropdown menu\\n.dropdown-menu {\\n  position: absolute;\\n  top: 100%;\\n  left: 0;\\n  z-index: $zindex-dropdown;\\n  display: none; // none by default, but block on \\\"open\\\" of the menu\\n  float: left;\\n  min-width: $dropdown-min-width;\\n  padding: $dropdown-padding-y 0;\\n  margin: $dropdown-spacer 0 0; // override default ul\\n  @include font-size($dropdown-font-size);\\n  color: $dropdown-color;\\n  text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\\n  list-style: none;\\n  background-color: $dropdown-bg;\\n  background-clip: padding-box;\\n  border: $dropdown-border-width solid $dropdown-border-color;\\n  @include border-radius($dropdown-border-radius);\\n  @include box-shadow($dropdown-box-shadow);\\n}\\n\\n@each $breakpoint in map-keys($grid-breakpoints) {\\n  @include media-breakpoint-up($breakpoint) {\\n    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\\n\\n    .dropdown-menu#{$infix}-left {\\n      right: auto;\\n      left: 0;\\n    }\\n\\n    .dropdown-menu#{$infix}-right {\\n      right: 0;\\n      left: auto;\\n    }\\n  }\\n}\\n\\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\\n// Just add .dropup after the standard .dropdown class and you're set.\\n.dropup {\\n  .dropdown-menu {\\n    top: auto;\\n    bottom: 100%;\\n    margin-top: 0;\\n    margin-bottom: $dropdown-spacer;\\n  }\\n\\n  .dropdown-toggle {\\n    @include caret(up);\\n  }\\n}\\n\\n.dropright {\\n  .dropdown-menu {\\n    top: 0;\\n    right: auto;\\n    left: 100%;\\n    margin-top: 0;\\n    margin-left: $dropdown-spacer;\\n  }\\n\\n  .dropdown-toggle {\\n    @include caret(right);\\n    &::after {\\n      vertical-align: 0;\\n    }\\n  }\\n}\\n\\n.dropleft {\\n  .dropdown-menu {\\n    top: 0;\\n    right: 100%;\\n    left: auto;\\n    margin-top: 0;\\n    margin-right: $dropdown-spacer;\\n  }\\n\\n  .dropdown-toggle {\\n    @include caret(left);\\n    &::before {\\n      vertical-align: 0;\\n    }\\n  }\\n}\\n\\n// When enabled Popper.js, reset basic dropdown position\\n// stylelint-disable-next-line no-duplicate-selectors\\n.dropdown-menu {\\n  &[x-placement^=\\\"top\\\"],\\n  &[x-placement^=\\\"right\\\"],\\n  &[x-placement^=\\\"bottom\\\"],\\n  &[x-placement^=\\\"left\\\"] {\\n    right: auto;\\n    bottom: auto;\\n  }\\n}\\n\\n// Dividers (basically an `<hr>`) within the dropdown\\n.dropdown-divider {\\n  @include nav-divider($dropdown-divider-bg, $dropdown-divider-margin-y);\\n}\\n\\n// Links, buttons, and more within the dropdown menu\\n//\\n// `<button>`-specific styles are denoted with `// For <button>s`\\n.dropdown-item {\\n  display: block;\\n  width: 100%; // For `<button>`s\\n  padding: $dropdown-item-padding-y $dropdown-item-padding-x;\\n  clear: both;\\n  font-weight: $font-weight-normal;\\n  color: $dropdown-link-color;\\n  text-align: inherit; // For `<button>`s\\n  white-space: nowrap; // prevent links from randomly breaking onto new lines\\n  background-color: transparent; // For `<button>`s\\n  border: 0; // For `<button>`s\\n\\n  // Prevent dropdown overflow if there's no padding\\n  // See https://github.com/twbs/bootstrap/pull/27703\\n  @if $dropdown-padding-y == 0 {\\n    &:first-child {\\n      @include border-top-radius($dropdown-inner-border-radius);\\n    }\\n\\n    &:last-child {\\n      @include border-bottom-radius($dropdown-inner-border-radius);\\n    }\\n  }\\n\\n  @include hover-focus {\\n    color: $dropdown-link-hover-color;\\n    text-decoration: none;\\n    @include gradient-bg($dropdown-link-hover-bg);\\n  }\\n\\n  &.active,\\n  &:active {\\n    color: $dropdown-link-active-color;\\n    text-decoration: none;\\n    @include gradient-bg($dropdown-link-active-bg);\\n  }\\n\\n  &.disabled,\\n  &:disabled {\\n    color: $dropdown-link-disabled-color;\\n    pointer-events: none;\\n    background-color: transparent;\\n    // Remove CSS gradients if they're enabled\\n    @if $enable-gradients {\\n      background-image: none;\\n    }\\n  }\\n}\\n\\n.dropdown-menu.show {\\n  display: block;\\n}\\n\\n// Dropdown section headers\\n.dropdown-header {\\n  display: block;\\n  padding: $dropdown-padding-y $dropdown-item-padding-x;\\n  margin-bottom: 0; // for use with heading elements\\n  @include font-size($font-size-sm);\\n  color: $dropdown-header-color;\\n  white-space: nowrap; // as with > li > a\\n}\\n\\n// Dropdown text\\n.dropdown-item-text {\\n  display: block;\\n  padding: $dropdown-item-padding-y $dropdown-item-padding-x;\\n  color: $dropdown-link-color;\\n}\\n\",\"@mixin caret-down {\\n  border-top: $caret-width solid;\\n  border-right: $caret-width solid transparent;\\n  border-bottom: 0;\\n  border-left: $caret-width solid transparent;\\n}\\n\\n@mixin caret-up {\\n  border-top: 0;\\n  border-right: $caret-width solid transparent;\\n  border-bottom: $caret-width solid;\\n  border-left: $caret-width solid transparent;\\n}\\n\\n@mixin caret-right {\\n  border-top: $caret-width solid transparent;\\n  border-right: 0;\\n  border-bottom: $caret-width solid transparent;\\n  border-left: $caret-width solid;\\n}\\n\\n@mixin caret-left {\\n  border-top: $caret-width solid transparent;\\n  border-right: $caret-width solid;\\n  border-bottom: $caret-width solid transparent;\\n}\\n\\n@mixin caret($direction: down) {\\n  @if $enable-caret {\\n    &::after {\\n      display: inline-block;\\n      margin-left: $caret-spacing;\\n      vertical-align: $caret-vertical-align;\\n      content: \\\"\\\";\\n      @if $direction == down {\\n        @include caret-down;\\n      } @else if $direction == up {\\n        @include caret-up;\\n      } @else if $direction == right {\\n        @include caret-right;\\n      }\\n    }\\n\\n    @if $direction == left {\\n      &::after {\\n        display: none;\\n      }\\n\\n      &::before {\\n        display: inline-block;\\n        margin-right: $caret-spacing;\\n        vertical-align: $caret-vertical-align;\\n        content: \\\"\\\";\\n        @include caret-left;\\n      }\\n    }\\n\\n    &:empty::after {\\n      margin-left: 0;\\n    }\\n  }\\n}\\n\",\"// Horizontal dividers\\n//\\n// Dividers (basically an hr) within dropdowns and nav lists\\n\\n@mixin nav-divider($color: $nav-divider-color, $margin-y: $nav-divider-margin-y) {\\n  height: 0;\\n  margin: $margin-y 0;\\n  overflow: hidden;\\n  border-top: 1px solid $color;\\n}\\n\",\"// stylelint-disable selector-no-qualifying-type\\n\\n// Make the div behave like a button\\n.btn-group,\\n.btn-group-vertical {\\n  position: relative;\\n  display: inline-flex;\\n  vertical-align: middle; // match .btn alignment given font-size hack above\\n\\n  > .btn {\\n    position: relative;\\n    flex: 1 1 auto;\\n\\n    // Bring the hover, focused, and \\\"active\\\" buttons to the front to overlay\\n    // the borders properly\\n    @include hover {\\n      z-index: 1;\\n    }\\n    &:focus,\\n    &:active,\\n    &.active {\\n      z-index: 1;\\n    }\\n  }\\n}\\n\\n// Optional: Group multiple button groups together for a toolbar\\n.btn-toolbar {\\n  display: flex;\\n  flex-wrap: wrap;\\n  justify-content: flex-start;\\n\\n  .input-group {\\n    width: auto;\\n  }\\n}\\n\\n.btn-group {\\n  // Prevent double borders when buttons are next to each other\\n  > .btn:not(:first-child),\\n  > .btn-group:not(:first-child) {\\n    margin-left: -$btn-border-width;\\n  }\\n\\n  // Reset rounded corners\\n  > .btn:not(:last-child):not(.dropdown-toggle),\\n  > .btn-group:not(:last-child) > .btn {\\n    @include border-right-radius(0);\\n  }\\n\\n  > .btn:not(:first-child),\\n  > .btn-group:not(:first-child) > .btn {\\n    @include border-left-radius(0);\\n  }\\n}\\n\\n// Sizing\\n//\\n// Remix the default button sizing classes into new ones for easier manipulation.\\n\\n.btn-group-sm > .btn { @extend .btn-sm; }\\n.btn-group-lg > .btn { @extend .btn-lg; }\\n\\n\\n//\\n// Split button dropdowns\\n//\\n\\n.dropdown-toggle-split {\\n  padding-right: $btn-padding-x * .75;\\n  padding-left: $btn-padding-x * .75;\\n\\n  &::after,\\n  .dropup &::after,\\n  .dropright &::after {\\n    margin-left: 0;\\n  }\\n\\n  .dropleft &::before {\\n    margin-right: 0;\\n  }\\n}\\n\\n.btn-sm + .dropdown-toggle-split {\\n  padding-right: $btn-padding-x-sm * .75;\\n  padding-left: $btn-padding-x-sm * .75;\\n}\\n\\n.btn-lg + .dropdown-toggle-split {\\n  padding-right: $btn-padding-x-lg * .75;\\n  padding-left: $btn-padding-x-lg * .75;\\n}\\n\\n\\n// The clickable button for toggling the menu\\n// Set the same inset shadow as the :active state\\n.btn-group.show .dropdown-toggle {\\n  @include box-shadow($btn-active-box-shadow);\\n\\n  // Show no shadow for `.btn-link` since it has no other button styles.\\n  &.btn-link {\\n    @include box-shadow(none);\\n  }\\n}\\n\\n\\n//\\n// Vertical button groups\\n//\\n\\n.btn-group-vertical {\\n  flex-direction: column;\\n  align-items: flex-start;\\n  justify-content: center;\\n\\n  > .btn,\\n  > .btn-group {\\n    width: 100%;\\n  }\\n\\n  > .btn:not(:first-child),\\n  > .btn-group:not(:first-child) {\\n    margin-top: -$btn-border-width;\\n  }\\n\\n  // Reset rounded corners\\n  > .btn:not(:last-child):not(.dropdown-toggle),\\n  > .btn-group:not(:last-child) > .btn {\\n    @include border-bottom-radius(0);\\n  }\\n\\n  > .btn:not(:first-child),\\n  > .btn-group:not(:first-child) > .btn {\\n    @include border-top-radius(0);\\n  }\\n}\\n\\n\\n// Checkbox and radio options\\n//\\n// In order to support the browser's form validation feedback, powered by the\\n// `required` attribute, we have to \\\"hide\\\" the inputs via `clip`. We cannot use\\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\\n// certain cases which is prevented by using `clip` and `pointer-events`.\\n// This way, we ensure a DOM element is visible to position the popover from.\\n//\\n// See https://github.com/twbs/bootstrap/pull/12794 and\\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\\n\\n.btn-group-toggle {\\n  > .btn,\\n  > .btn-group > .btn {\\n    margin-bottom: 0; // Override default `<label>` value\\n\\n    input[type=\\\"radio\\\"],\\n    input[type=\\\"checkbox\\\"] {\\n      position: absolute;\\n      clip: rect(0, 0, 0, 0);\\n      pointer-events: none;\\n    }\\n  }\\n}\\n\",\"// stylelint-disable selector-no-qualifying-type\\n\\n//\\n// Base styles\\n//\\n\\n.input-group {\\n  position: relative;\\n  display: flex;\\n  flex-wrap: wrap; // For form validation feedback\\n  align-items: stretch;\\n  width: 100%;\\n\\n  > .form-control,\\n  > .form-control-plaintext,\\n  > .custom-select,\\n  > .custom-file {\\n    position: relative; // For focus state's z-index\\n    flex: 1 1 auto;\\n    // Add width 1% and flex-basis auto to ensure that button will not wrap out\\n    // the column. Applies to IE Edge+ and Firefox. Chrome does not require this.\\n    width: 1%;\\n    margin-bottom: 0;\\n\\n    + .form-control,\\n    + .custom-select,\\n    + .custom-file {\\n      margin-left: -$input-border-width;\\n    }\\n  }\\n\\n  // Bring the \\\"active\\\" form control to the top of surrounding elements\\n  > .form-control:focus,\\n  > .custom-select:focus,\\n  > .custom-file .custom-file-input:focus ~ .custom-file-label {\\n    z-index: 3;\\n  }\\n\\n  // Bring the custom file input above the label\\n  > .custom-file .custom-file-input:focus {\\n    z-index: 4;\\n  }\\n\\n  > .form-control,\\n  > .custom-select {\\n    &:not(:last-child) { @include border-right-radius(0); }\\n    &:not(:first-child) { @include border-left-radius(0); }\\n  }\\n\\n  // Custom file inputs have more complex markup, thus requiring different\\n  // border-radius overrides.\\n  > .custom-file {\\n    display: flex;\\n    align-items: center;\\n\\n    &:not(:last-child) .custom-file-label,\\n    &:not(:last-child) .custom-file-label::after { @include border-right-radius(0); }\\n    &:not(:first-child) .custom-file-label { @include border-left-radius(0); }\\n  }\\n}\\n\\n\\n// Prepend and append\\n//\\n// While it requires one extra layer of HTML for each, dedicated prepend and\\n// append elements allow us to 1) be less clever, 2) simplify our selectors, and\\n// 3) support HTML5 form validation.\\n\\n.input-group-prepend,\\n.input-group-append {\\n  display: flex;\\n\\n  // Ensure buttons are always above inputs for more visually pleasing borders.\\n  // This isn't needed for `.input-group-text` since it shares the same border-color\\n  // as our inputs.\\n  .btn {\\n    position: relative;\\n    z-index: 2;\\n\\n    &:focus {\\n      z-index: 3;\\n    }\\n  }\\n\\n  .btn + .btn,\\n  .btn + .input-group-text,\\n  .input-group-text + .input-group-text,\\n  .input-group-text + .btn {\\n    margin-left: -$input-border-width;\\n  }\\n}\\n\\n.input-group-prepend { margin-right: -$input-border-width; }\\n.input-group-append { margin-left: -$input-border-width; }\\n\\n\\n// Textual addons\\n//\\n// Serves as a catch-all element for any text or radio/checkbox input you wish\\n// to prepend or append to an input.\\n\\n.input-group-text {\\n  display: flex;\\n  align-items: center;\\n  padding: $input-padding-y $input-padding-x;\\n  margin-bottom: 0; // Allow use of <label> elements by overriding our default margin-bottom\\n  @include font-size($input-font-size); // Match inputs\\n  font-weight: $font-weight-normal;\\n  line-height: $input-line-height;\\n  color: $input-group-addon-color;\\n  text-align: center;\\n  white-space: nowrap;\\n  background-color: $input-group-addon-bg;\\n  border: $input-border-width solid $input-group-addon-border-color;\\n  @include border-radius($input-border-radius);\\n\\n  // Nuke default margins from checkboxes and radios to vertically center within.\\n  input[type=\\\"radio\\\"],\\n  input[type=\\\"checkbox\\\"] {\\n    margin-top: 0;\\n  }\\n}\\n\\n\\n// Sizing\\n//\\n// Remix the default form control sizing classes into new ones for easier\\n// manipulation.\\n\\n.input-group-lg > .form-control:not(textarea),\\n.input-group-lg > .custom-select {\\n  height: $input-height-lg;\\n}\\n\\n.input-group-lg > .form-control,\\n.input-group-lg > .custom-select,\\n.input-group-lg > .input-group-prepend > .input-group-text,\\n.input-group-lg > .input-group-append > .input-group-text,\\n.input-group-lg > .input-group-prepend > .btn,\\n.input-group-lg > .input-group-append > .btn {\\n  padding: $input-padding-y-lg $input-padding-x-lg;\\n  @include font-size($input-font-size-lg);\\n  line-height: $input-line-height-lg;\\n  @include border-radius($input-border-radius-lg);\\n}\\n\\n.input-group-sm > .form-control:not(textarea),\\n.input-group-sm > .custom-select {\\n  height: $input-height-sm;\\n}\\n\\n.input-group-sm > .form-control,\\n.input-group-sm > .custom-select,\\n.input-group-sm > .input-group-prepend > .input-group-text,\\n.input-group-sm > .input-group-append > .input-group-text,\\n.input-group-sm > .input-group-prepend > .btn,\\n.input-group-sm > .input-group-append > .btn {\\n  padding: $input-padding-y-sm $input-padding-x-sm;\\n  @include font-size($input-font-size-sm);\\n  line-height: $input-line-height-sm;\\n  @include border-radius($input-border-radius-sm);\\n}\\n\\n.input-group-lg > .custom-select,\\n.input-group-sm > .custom-select {\\n  padding-right: $custom-select-padding-x + $custom-select-indicator-padding;\\n}\\n\\n\\n// Prepend and append rounded corners\\n//\\n// These rulesets must come after the sizing ones to properly override sm and lg\\n// border-radius values when extending. They're more specific than we'd like\\n// with the `.input-group >` part, but without it, we cannot override the sizing.\\n\\n\\n.input-group > .input-group-prepend > .btn,\\n.input-group > .input-group-prepend > .input-group-text,\\n.input-group > .input-group-append:not(:last-child) > .btn,\\n.input-group > .input-group-append:not(:last-child) > .input-group-text,\\n.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),\\n.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {\\n  @include border-right-radius(0);\\n}\\n\\n.input-group > .input-group-append > .btn,\\n.input-group > .input-group-append > .input-group-text,\\n.input-group > .input-group-prepend:not(:first-child) > .btn,\\n.input-group > .input-group-prepend:not(:first-child) > .input-group-text,\\n.input-group > .input-group-prepend:first-child > .btn:not(:first-child),\\n.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {\\n  @include border-left-radius(0);\\n}\\n\",\"// Embedded icons from Open Iconic.\\n// Released under MIT and copyright 2014 Waybury.\\n// https://useiconic.com/open\\n\\n\\n// Checkboxes and radios\\n//\\n// Base class takes care of all the key behavioral aspects.\\n\\n.custom-control {\\n  position: relative;\\n  display: block;\\n  min-height: $font-size-base * $line-height-base;\\n  padding-left: $custom-control-gutter + $custom-control-indicator-size;\\n}\\n\\n.custom-control-inline {\\n  display: inline-flex;\\n  margin-right: $custom-control-spacer-x;\\n}\\n\\n.custom-control-input {\\n  position: absolute;\\n  z-index: -1; // Put the input behind the label so it doesn't overlay text\\n  opacity: 0;\\n\\n  &:checked ~ .custom-control-label::before {\\n    color: $custom-control-indicator-checked-color;\\n    border-color: $custom-control-indicator-checked-border-color;\\n    @include gradient-bg($custom-control-indicator-checked-bg);\\n    @include box-shadow($custom-control-indicator-checked-box-shadow);\\n  }\\n\\n  &:focus ~ .custom-control-label::before {\\n    // the mixin is not used here to make sure there is feedback\\n    @if $enable-shadows {\\n      box-shadow: $input-box-shadow, $input-focus-box-shadow;\\n    } @else {\\n      box-shadow: $custom-control-indicator-focus-box-shadow;\\n    }\\n  }\\n\\n  &:focus:not(:checked) ~ .custom-control-label::before {\\n    border-color: $custom-control-indicator-focus-border-color;\\n  }\\n\\n  &:not(:disabled):active ~ .custom-control-label::before {\\n    color: $custom-control-indicator-active-color;\\n    background-color: $custom-control-indicator-active-bg;\\n    border-color: $custom-control-indicator-active-border-color;\\n    @include box-shadow($custom-control-indicator-active-box-shadow);\\n  }\\n\\n  &:disabled {\\n    ~ .custom-control-label {\\n      color: $custom-control-label-disabled-color;\\n\\n      &::before {\\n        background-color: $custom-control-indicator-disabled-bg;\\n      }\\n    }\\n  }\\n}\\n\\n// Custom control indicators\\n//\\n// Build the custom controls out of pseudo-elements.\\n\\n.custom-control-label {\\n  position: relative;\\n  margin-bottom: 0;\\n  vertical-align: top;\\n\\n  // Background-color and (when enabled) gradient\\n  &::before {\\n    position: absolute;\\n    top: ($font-size-base * $line-height-base - $custom-control-indicator-size) / 2;\\n    left: -($custom-control-gutter + $custom-control-indicator-size);\\n    display: block;\\n    width: $custom-control-indicator-size;\\n    height: $custom-control-indicator-size;\\n    pointer-events: none;\\n    content: \\\"\\\";\\n    background-color: $custom-control-indicator-bg;\\n    border: $custom-control-indicator-border-color solid $custom-control-indicator-border-width;\\n    @include box-shadow($custom-control-indicator-box-shadow);\\n  }\\n\\n  // Foreground (icon)\\n  &::after {\\n    position: absolute;\\n    top: ($font-size-base * $line-height-base - $custom-control-indicator-size) / 2;\\n    left: -($custom-control-gutter + $custom-control-indicator-size);\\n    display: block;\\n    width: $custom-control-indicator-size;\\n    height: $custom-control-indicator-size;\\n    content: \\\"\\\";\\n    background: no-repeat 50% / #{$custom-control-indicator-bg-size};\\n  }\\n}\\n\\n\\n// Checkboxes\\n//\\n// Tweak just a few things for checkboxes.\\n\\n.custom-checkbox {\\n  .custom-control-label::before {\\n    @include border-radius($custom-checkbox-indicator-border-radius);\\n  }\\n\\n  .custom-control-input:checked ~ .custom-control-label {\\n    &::after {\\n      background-image: $custom-checkbox-indicator-icon-checked;\\n    }\\n  }\\n\\n  .custom-control-input:indeterminate ~ .custom-control-label {\\n    &::before {\\n      border-color: $custom-checkbox-indicator-indeterminate-border-color;\\n      @include gradient-bg($custom-checkbox-indicator-indeterminate-bg);\\n      @include box-shadow($custom-checkbox-indicator-indeterminate-box-shadow);\\n    }\\n    &::after {\\n      background-image: $custom-checkbox-indicator-icon-indeterminate;\\n    }\\n  }\\n\\n  .custom-control-input:disabled {\\n    &:checked ~ .custom-control-label::before {\\n      background-color: $custom-control-indicator-checked-disabled-bg;\\n    }\\n    &:indeterminate ~ .custom-control-label::before {\\n      background-color: $custom-control-indicator-checked-disabled-bg;\\n    }\\n  }\\n}\\n\\n// Radios\\n//\\n// Tweak just a few things for radios.\\n\\n.custom-radio {\\n  .custom-control-label::before {\\n    // stylelint-disable-next-line property-blacklist\\n    border-radius: $custom-radio-indicator-border-radius;\\n  }\\n\\n  .custom-control-input:checked ~ .custom-control-label {\\n    &::after {\\n      background-image: $custom-radio-indicator-icon-checked;\\n    }\\n  }\\n\\n  .custom-control-input:disabled {\\n    &:checked ~ .custom-control-label::before {\\n      background-color: $custom-control-indicator-checked-disabled-bg;\\n    }\\n  }\\n}\\n\\n\\n// switches\\n//\\n// Tweak a few things for switches\\n\\n.custom-switch {\\n  padding-left: $custom-switch-width + $custom-control-gutter;\\n\\n  .custom-control-label {\\n    &::before {\\n      left: -($custom-switch-width + $custom-control-gutter);\\n      width: $custom-switch-width;\\n      pointer-events: all;\\n      // stylelint-disable-next-line property-blacklist\\n      border-radius: $custom-switch-indicator-border-radius;\\n    }\\n\\n    &::after {\\n      top: calc(#{(($font-size-base * $line-height-base - $custom-control-indicator-size) / 2)} + #{$custom-control-indicator-border-width * 2});\\n      left: calc(#{-($custom-switch-width + $custom-control-gutter)} + #{$custom-control-indicator-border-width * 2});\\n      width: $custom-switch-indicator-size;\\n      height: $custom-switch-indicator-size;\\n      background-color: $custom-control-indicator-border-color;\\n      // stylelint-disable-next-line property-blacklist\\n      border-radius: $custom-switch-indicator-border-radius;\\n      @include transition(transform .15s ease-in-out, $custom-forms-transition);\\n    }\\n  }\\n\\n  .custom-control-input:checked ~ .custom-control-label {\\n    &::after {\\n      background-color: $custom-control-indicator-bg;\\n      transform: translateX($custom-switch-width - $custom-control-indicator-size);\\n    }\\n  }\\n\\n  .custom-control-input:disabled {\\n    &:checked ~ .custom-control-label::before {\\n      background-color: $custom-control-indicator-checked-disabled-bg;\\n    }\\n  }\\n}\\n\\n\\n// Select\\n//\\n// Replaces the browser default select with a custom one, mostly pulled from\\n// https://primer.github.io/.\\n//\\n\\n.custom-select {\\n  display: inline-block;\\n  width: 100%;\\n  height: $custom-select-height;\\n  padding: $custom-select-padding-y ($custom-select-padding-x + $custom-select-indicator-padding) $custom-select-padding-y $custom-select-padding-x;\\n  font-family: $custom-select-font-family;\\n  @include font-size($custom-select-font-size);\\n  font-weight: $custom-select-font-weight;\\n  line-height: $custom-select-line-height;\\n  color: $custom-select-color;\\n  vertical-align: middle;\\n  background: $custom-select-background;\\n  background-color: $custom-select-bg;\\n  border: $custom-select-border-width solid $custom-select-border-color;\\n  @include border-radius($custom-select-border-radius, 0);\\n  @include box-shadow($custom-select-box-shadow);\\n  appearance: none;\\n\\n  &:focus {\\n    border-color: $custom-select-focus-border-color;\\n    outline: 0;\\n    @if $enable-shadows {\\n      box-shadow: $custom-select-box-shadow, $custom-select-focus-box-shadow;\\n    } @else {\\n      box-shadow: $custom-select-focus-box-shadow;\\n    }\\n\\n    &::-ms-value {\\n      // For visual consistency with other platforms/browsers,\\n      // suppress the default white text on blue background highlight given to\\n      // the selected option text when the (still closed) <select> receives focus\\n      // in IE and (under certain conditions) Edge.\\n      // See https://github.com/twbs/bootstrap/issues/19398.\\n      color: $input-color;\\n      background-color: $input-bg;\\n    }\\n  }\\n\\n  &[multiple],\\n  &[size]:not([size=\\\"1\\\"]) {\\n    height: auto;\\n    padding-right: $custom-select-padding-x;\\n    background-image: none;\\n  }\\n\\n  &:disabled {\\n    color: $custom-select-disabled-color;\\n    background-color: $custom-select-disabled-bg;\\n  }\\n\\n  // Hides the default caret in IE11\\n  &::-ms-expand {\\n    display: none;\\n  }\\n}\\n\\n.custom-select-sm {\\n  height: $custom-select-height-sm;\\n  padding-top: $custom-select-padding-y-sm;\\n  padding-bottom: $custom-select-padding-y-sm;\\n  padding-left: $custom-select-padding-x-sm;\\n  @include font-size($custom-select-font-size-sm);\\n}\\n\\n.custom-select-lg {\\n  height: $custom-select-height-lg;\\n  padding-top: $custom-select-padding-y-lg;\\n  padding-bottom: $custom-select-padding-y-lg;\\n  padding-left: $custom-select-padding-x-lg;\\n  @include font-size($custom-select-font-size-lg);\\n}\\n\\n\\n// File\\n//\\n// Custom file input.\\n\\n.custom-file {\\n  position: relative;\\n  display: inline-block;\\n  width: 100%;\\n  height: $custom-file-height;\\n  margin-bottom: 0;\\n}\\n\\n.custom-file-input {\\n  position: relative;\\n  z-index: 2;\\n  width: 100%;\\n  height: $custom-file-height;\\n  margin: 0;\\n  opacity: 0;\\n\\n  &:focus ~ .custom-file-label {\\n    border-color: $custom-file-focus-border-color;\\n    box-shadow: $custom-file-focus-box-shadow;\\n  }\\n\\n  &:disabled ~ .custom-file-label {\\n    background-color: $custom-file-disabled-bg;\\n  }\\n\\n  @each $lang, $value in $custom-file-text {\\n    &:lang(#{$lang}) ~ .custom-file-label::after {\\n      content: $value;\\n    }\\n  }\\n\\n  ~ .custom-file-label[data-browse]::after {\\n    content: attr(data-browse);\\n  }\\n}\\n\\n.custom-file-label {\\n  position: absolute;\\n  top: 0;\\n  right: 0;\\n  left: 0;\\n  z-index: 1;\\n  height: $custom-file-height;\\n  padding: $custom-file-padding-y $custom-file-padding-x;\\n  font-family: $custom-file-font-family;\\n  font-weight: $custom-file-font-weight;\\n  line-height: $custom-file-line-height;\\n  color: $custom-file-color;\\n  background-color: $custom-file-bg;\\n  border: $custom-file-border-width solid $custom-file-border-color;\\n  @include border-radius($custom-file-border-radius);\\n  @include box-shadow($custom-file-box-shadow);\\n\\n  &::after {\\n    position: absolute;\\n    top: 0;\\n    right: 0;\\n    bottom: 0;\\n    z-index: 3;\\n    display: block;\\n    height: $custom-file-height-inner;\\n    padding: $custom-file-padding-y $custom-file-padding-x;\\n    line-height: $custom-file-line-height;\\n    color: $custom-file-button-color;\\n    content: \\\"Browse\\\";\\n    @include gradient-bg($custom-file-button-bg);\\n    border-left: inherit;\\n    @include border-radius(0 $custom-file-border-radius $custom-file-border-radius 0);\\n  }\\n}\\n\\n// Range\\n//\\n// Style range inputs the same across browsers. Vendor-specific rules for pseudo\\n// elements cannot be mixed. As such, there are no shared styles for focus or\\n// active states on prefixed selectors.\\n\\n.custom-range {\\n  width: 100%;\\n  height: calc(#{$custom-range-thumb-height} + #{$custom-range-thumb-focus-box-shadow-width * 2});\\n  padding: 0; // Need to reset padding\\n  background-color: transparent;\\n  appearance: none;\\n\\n  &:focus {\\n    outline: none;\\n\\n    // Pseudo-elements must be split across multiple rulesets to have an effect.\\n    // No box-shadow() mixin for focus accessibility.\\n    &::-webkit-slider-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }\\n    &::-moz-range-thumb     { box-shadow: $custom-range-thumb-focus-box-shadow; }\\n    &::-ms-thumb            { box-shadow: $custom-range-thumb-focus-box-shadow; }\\n  }\\n\\n  &::-moz-focus-outer {\\n    border: 0;\\n  }\\n\\n  &::-webkit-slider-thumb {\\n    width: $custom-range-thumb-width;\\n    height: $custom-range-thumb-height;\\n    margin-top: ($custom-range-track-height - $custom-range-thumb-height) / 2; // Webkit specific\\n    @include gradient-bg($custom-range-thumb-bg);\\n    border: $custom-range-thumb-border;\\n    @include border-radius($custom-range-thumb-border-radius);\\n    @include box-shadow($custom-range-thumb-box-shadow);\\n    @include transition($custom-forms-transition);\\n    appearance: none;\\n\\n    &:active {\\n      @include gradient-bg($custom-range-thumb-active-bg);\\n    }\\n  }\\n\\n  &::-webkit-slider-runnable-track {\\n    width: $custom-range-track-width;\\n    height: $custom-range-track-height;\\n    color: transparent; // Why?\\n    cursor: $custom-range-track-cursor;\\n    background-color: $custom-range-track-bg;\\n    border-color: transparent;\\n    @include border-radius($custom-range-track-border-radius);\\n    @include box-shadow($custom-range-track-box-shadow);\\n  }\\n\\n  &::-moz-range-thumb {\\n    width: $custom-range-thumb-width;\\n    height: $custom-range-thumb-height;\\n    @include gradient-bg($custom-range-thumb-bg);\\n    border: $custom-range-thumb-border;\\n    @include border-radius($custom-range-thumb-border-radius);\\n    @include box-shadow($custom-range-thumb-box-shadow);\\n    @include transition($custom-forms-transition);\\n    appearance: none;\\n\\n    &:active {\\n      @include gradient-bg($custom-range-thumb-active-bg);\\n    }\\n  }\\n\\n  &::-moz-range-track {\\n    width: $custom-range-track-width;\\n    height: $custom-range-track-height;\\n    color: transparent;\\n    cursor: $custom-range-track-cursor;\\n    background-color: $custom-range-track-bg;\\n    border-color: transparent; // Firefox specific?\\n    @include border-radius($custom-range-track-border-radius);\\n    @include box-shadow($custom-range-track-box-shadow);\\n  }\\n\\n  &::-ms-thumb {\\n    width: $custom-range-thumb-width;\\n    height: $custom-range-thumb-height;\\n    margin-top: 0; // Edge specific\\n    margin-right: $custom-range-thumb-focus-box-shadow-width; // Workaround that overflowed box-shadow is hidden.\\n    margin-left: $custom-range-thumb-focus-box-shadow-width;  // Workaround that overflowed box-shadow is hidden.\\n    @include gradient-bg($custom-range-thumb-bg);\\n    border: $custom-range-thumb-border;\\n    @include border-radius($custom-range-thumb-border-radius);\\n    @include box-shadow($custom-range-thumb-box-shadow);\\n    @include transition($custom-forms-transition);\\n    appearance: none;\\n\\n    &:active {\\n      @include gradient-bg($custom-range-thumb-active-bg);\\n    }\\n  }\\n\\n  &::-ms-track {\\n    width: $custom-range-track-width;\\n    height: $custom-range-track-height;\\n    color: transparent;\\n    cursor: $custom-range-track-cursor;\\n    background-color: transparent;\\n    border-color: transparent;\\n    border-width: $custom-range-thumb-height / 2;\\n    @include box-shadow($custom-range-track-box-shadow);\\n  }\\n\\n  &::-ms-fill-lower {\\n    background-color: $custom-range-track-bg;\\n    @include border-radius($custom-range-track-border-radius);\\n  }\\n\\n  &::-ms-fill-upper {\\n    margin-right: 15px; // arbitrary?\\n    background-color: $custom-range-track-bg;\\n    @include border-radius($custom-range-track-border-radius);\\n  }\\n\\n  &:disabled {\\n    &::-webkit-slider-thumb {\\n      background-color: $custom-range-thumb-disabled-bg;\\n    }\\n\\n    &::-webkit-slider-runnable-track {\\n      cursor: default;\\n    }\\n\\n    &::-moz-range-thumb {\\n      background-color: $custom-range-thumb-disabled-bg;\\n    }\\n\\n    &::-moz-range-track {\\n      cursor: default;\\n    }\\n\\n    &::-ms-thumb {\\n      background-color: $custom-range-thumb-disabled-bg;\\n    }\\n  }\\n}\\n\\n.custom-control-label::before,\\n.custom-file-label,\\n.custom-select {\\n  @include transition($custom-forms-transition);\\n}\\n\",\"// Base class\\n//\\n// Kickstart any navigation component with a set of style resets. Works with\\n// `<nav>`s or `<ul>`s.\\n\\n.nav {\\n  display: flex;\\n  flex-wrap: wrap;\\n  padding-left: 0;\\n  margin-bottom: 0;\\n  list-style: none;\\n}\\n\\n.nav-link {\\n  display: block;\\n  padding: $nav-link-padding-y $nav-link-padding-x;\\n\\n  @include hover-focus {\\n    text-decoration: none;\\n  }\\n\\n  // Disabled state lightens text\\n  &.disabled {\\n    color: $nav-link-disabled-color;\\n    pointer-events: none;\\n    cursor: default;\\n  }\\n}\\n\\n//\\n// Tabs\\n//\\n\\n.nav-tabs {\\n  border-bottom: $nav-tabs-border-width solid $nav-tabs-border-color;\\n\\n  .nav-item {\\n    margin-bottom: -$nav-tabs-border-width;\\n  }\\n\\n  .nav-link {\\n    border: $nav-tabs-border-width solid transparent;\\n    @include border-top-radius($nav-tabs-border-radius);\\n\\n    @include hover-focus {\\n      border-color: $nav-tabs-link-hover-border-color;\\n    }\\n\\n    &.disabled {\\n      color: $nav-link-disabled-color;\\n      background-color: transparent;\\n      border-color: transparent;\\n    }\\n  }\\n\\n  .nav-link.active,\\n  .nav-item.show .nav-link {\\n    color: $nav-tabs-link-active-color;\\n    background-color: $nav-tabs-link-active-bg;\\n    border-color: $nav-tabs-link-active-border-color;\\n  }\\n\\n  .dropdown-menu {\\n    // Make dropdown border overlap tab border\\n    margin-top: -$nav-tabs-border-width;\\n    // Remove the top rounded corners here since there is a hard edge above the menu\\n    @include border-top-radius(0);\\n  }\\n}\\n\\n\\n//\\n// Pills\\n//\\n\\n.nav-pills {\\n  .nav-link {\\n    @include border-radius($nav-pills-border-radius);\\n  }\\n\\n  .nav-link.active,\\n  .show > .nav-link {\\n    color: $nav-pills-link-active-color;\\n    background-color: $nav-pills-link-active-bg;\\n  }\\n}\\n\\n\\n//\\n// Justified variants\\n//\\n\\n.nav-fill {\\n  .nav-item {\\n    flex: 1 1 auto;\\n    text-align: center;\\n  }\\n}\\n\\n.nav-justified {\\n  .nav-item {\\n    flex-basis: 0;\\n    flex-grow: 1;\\n    text-align: center;\\n  }\\n}\\n\\n\\n// Tabbable tabs\\n//\\n// Hide tabbable panes to start, show them when `.active`\\n\\n.tab-content {\\n  > .tab-pane {\\n    display: none;\\n  }\\n  > .active {\\n    display: block;\\n  }\\n}\\n\",\"// Contents\\n//\\n// Navbar\\n// Navbar brand\\n// Navbar nav\\n// Navbar text\\n// Navbar divider\\n// Responsive navbar\\n// Navbar position\\n// Navbar themes\\n\\n\\n// Navbar\\n//\\n// Provide a static navbar from which we expand to create full-width, fixed, and\\n// other navbar variations.\\n\\n.navbar {\\n  position: relative;\\n  display: flex;\\n  flex-wrap: wrap; // allow us to do the line break for collapsing content\\n  align-items: center;\\n  justify-content: space-between; // space out brand from logo\\n  padding: $navbar-padding-y $navbar-padding-x;\\n\\n  // Because flex properties aren't inherited, we need to redeclare these first\\n  // few properties so that content nested within behave properly.\\n  > .container,\\n  > .container-fluid {\\n    display: flex;\\n    flex-wrap: wrap;\\n    align-items: center;\\n    justify-content: space-between;\\n  }\\n}\\n\\n\\n// Navbar brand\\n//\\n// Used for brand, project, or site names.\\n\\n.navbar-brand {\\n  display: inline-block;\\n  padding-top: $navbar-brand-padding-y;\\n  padding-bottom: $navbar-brand-padding-y;\\n  margin-right: $navbar-padding-x;\\n  @include font-size($navbar-brand-font-size);\\n  line-height: inherit;\\n  white-space: nowrap;\\n\\n  @include hover-focus {\\n    text-decoration: none;\\n  }\\n}\\n\\n\\n// Navbar nav\\n//\\n// Custom navbar navigation (doesn't require `.nav`, but does make use of `.nav-link`).\\n\\n.navbar-nav {\\n  display: flex;\\n  flex-direction: column; // cannot use `inherit` to get the `.navbar`s value\\n  padding-left: 0;\\n  margin-bottom: 0;\\n  list-style: none;\\n\\n  .nav-link {\\n    padding-right: 0;\\n    padding-left: 0;\\n  }\\n\\n  .dropdown-menu {\\n    position: static;\\n    float: none;\\n  }\\n}\\n\\n\\n// Navbar text\\n//\\n//\\n\\n.navbar-text {\\n  display: inline-block;\\n  padding-top: $nav-link-padding-y;\\n  padding-bottom: $nav-link-padding-y;\\n}\\n\\n\\n// Responsive navbar\\n//\\n// Custom styles for responsive collapsing and toggling of navbar contents.\\n// Powered by the collapse Bootstrap JavaScript plugin.\\n\\n// When collapsed, prevent the toggleable navbar contents from appearing in\\n// the default flexbox row orientation. Requires the use of `flex-wrap: wrap`\\n// on the `.navbar` parent.\\n.navbar-collapse {\\n  flex-basis: 100%;\\n  flex-grow: 1;\\n  // For always expanded or extra full navbars, ensure content aligns itself\\n  // properly vertically. Can be easily overridden with flex utilities.\\n  align-items: center;\\n}\\n\\n// Button for toggling the navbar when in its collapsed state\\n.navbar-toggler {\\n  padding: $navbar-toggler-padding-y $navbar-toggler-padding-x;\\n  @include font-size($navbar-toggler-font-size);\\n  line-height: 1;\\n  background-color: transparent; // remove default button style\\n  border: $border-width solid transparent; // remove default button style\\n  @include border-radius($navbar-toggler-border-radius);\\n\\n  @include hover-focus {\\n    text-decoration: none;\\n  }\\n}\\n\\n// Keep as a separate element so folks can easily override it with another icon\\n// or image file as needed.\\n.navbar-toggler-icon {\\n  display: inline-block;\\n  width: 1.5em;\\n  height: 1.5em;\\n  vertical-align: middle;\\n  content: \\\"\\\";\\n  background: no-repeat center center;\\n  background-size: 100% 100%;\\n}\\n\\n// Generate series of `.navbar-expand-*` responsive classes for configuring\\n// where your navbar collapses.\\n.navbar-expand {\\n  @each $breakpoint in map-keys($grid-breakpoints) {\\n    $next: breakpoint-next($breakpoint, $grid-breakpoints);\\n    $infix: breakpoint-infix($next, $grid-breakpoints);\\n\\n    &#{$infix} {\\n      @include media-breakpoint-down($breakpoint) {\\n        > .container,\\n        > .container-fluid {\\n          padding-right: 0;\\n          padding-left: 0;\\n        }\\n      }\\n\\n      @include media-breakpoint-up($next) {\\n        flex-flow: row nowrap;\\n        justify-content: flex-start;\\n\\n        .navbar-nav {\\n          flex-direction: row;\\n\\n          .dropdown-menu {\\n            position: absolute;\\n          }\\n\\n          .nav-link {\\n            padding-right: $navbar-nav-link-padding-x;\\n            padding-left: $navbar-nav-link-padding-x;\\n          }\\n        }\\n\\n        // For nesting containers, have to redeclare for alignment purposes\\n        > .container,\\n        > .container-fluid {\\n          flex-wrap: nowrap;\\n        }\\n\\n        .navbar-collapse {\\n          display: flex !important; // stylelint-disable-line declaration-no-important\\n\\n          // Changes flex-bases to auto because of an IE10 bug\\n          flex-basis: auto;\\n        }\\n\\n        .navbar-toggler {\\n          display: none;\\n        }\\n      }\\n    }\\n  }\\n}\\n\\n\\n// Navbar themes\\n//\\n// Styles for switching between navbars with light or dark background.\\n\\n// Dark links against a light background\\n.navbar-light {\\n  .navbar-brand {\\n    color: $navbar-light-brand-color;\\n\\n    @include hover-focus {\\n      color: $navbar-light-brand-hover-color;\\n    }\\n  }\\n\\n  .navbar-nav {\\n    .nav-link {\\n      color: $navbar-light-color;\\n\\n      @include hover-focus {\\n        color: $navbar-light-hover-color;\\n      }\\n\\n      &.disabled {\\n        color: $navbar-light-disabled-color;\\n      }\\n    }\\n\\n    .show > .nav-link,\\n    .active > .nav-link,\\n    .nav-link.show,\\n    .nav-link.active {\\n      color: $navbar-light-active-color;\\n    }\\n  }\\n\\n  .navbar-toggler {\\n    color: $navbar-light-color;\\n    border-color: $navbar-light-toggler-border-color;\\n  }\\n\\n  .navbar-toggler-icon {\\n    background-image: $navbar-light-toggler-icon-bg;\\n  }\\n\\n  .navbar-text {\\n    color: $navbar-light-color;\\n    a {\\n      color: $navbar-light-active-color;\\n\\n      @include hover-focus {\\n        color: $navbar-light-active-color;\\n      }\\n    }\\n  }\\n}\\n\\n// White links against a dark background\\n.navbar-dark {\\n  .navbar-brand {\\n    color: $navbar-dark-brand-color;\\n\\n    @include hover-focus {\\n      color: $navbar-dark-brand-hover-color;\\n    }\\n  }\\n\\n  .navbar-nav {\\n    .nav-link {\\n      color: $navbar-dark-color;\\n\\n      @include hover-focus {\\n        color: $navbar-dark-hover-color;\\n      }\\n\\n      &.disabled {\\n        color: $navbar-dark-disabled-color;\\n      }\\n    }\\n\\n    .show > .nav-link,\\n    .active > .nav-link,\\n    .nav-link.show,\\n    .nav-link.active {\\n      color: $navbar-dark-active-color;\\n    }\\n  }\\n\\n  .navbar-toggler {\\n    color: $navbar-dark-color;\\n    border-color: $navbar-dark-toggler-border-color;\\n  }\\n\\n  .navbar-toggler-icon {\\n    background-image: $navbar-dark-toggler-icon-bg;\\n  }\\n\\n  .navbar-text {\\n    color: $navbar-dark-color;\\n    a {\\n      color: $navbar-dark-active-color;\\n\\n      @include hover-focus {\\n        color: $navbar-dark-active-color;\\n      }\\n    }\\n  }\\n}\\n\",\"//\\n// Base styles\\n//\\n\\n.card {\\n  position: relative;\\n  display: flex;\\n  flex-direction: column;\\n  min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106\\n  word-wrap: break-word;\\n  background-color: $card-bg;\\n  background-clip: border-box;\\n  border: $card-border-width solid $card-border-color;\\n  @include border-radius($card-border-radius);\\n\\n  > hr {\\n    margin-right: 0;\\n    margin-left: 0;\\n  }\\n\\n  > .list-group:first-child {\\n    .list-group-item:first-child {\\n      @include border-top-radius($card-border-radius);\\n    }\\n  }\\n\\n  > .list-group:last-child {\\n    .list-group-item:last-child {\\n      @include border-bottom-radius($card-border-radius);\\n    }\\n  }\\n}\\n\\n.card-body {\\n  // Enable `flex-grow: 1` for decks and groups so that card blocks take up\\n  // as much space as possible, ensuring footers are aligned to the bottom.\\n  flex: 1 1 auto;\\n  padding: $card-spacer-x;\\n  color: $card-color;\\n}\\n\\n.card-title {\\n  margin-bottom: $card-spacer-y;\\n}\\n\\n.card-subtitle {\\n  margin-top: -$card-spacer-y / 2;\\n  margin-bottom: 0;\\n}\\n\\n.card-text:last-child {\\n  margin-bottom: 0;\\n}\\n\\n.card-link {\\n  @include hover {\\n    text-decoration: none;\\n  }\\n\\n  + .card-link {\\n    margin-left: $card-spacer-x;\\n  }\\n}\\n\\n//\\n// Optional textual caps\\n//\\n\\n.card-header {\\n  padding: $card-spacer-y $card-spacer-x;\\n  margin-bottom: 0; // Removes the default margin-bottom of <hN>\\n  color: $card-cap-color;\\n  background-color: $card-cap-bg;\\n  border-bottom: $card-border-width solid $card-border-color;\\n\\n  &:first-child {\\n    @include border-radius($card-inner-border-radius $card-inner-border-radius 0 0);\\n  }\\n\\n  + .list-group {\\n    .list-group-item:first-child {\\n      border-top: 0;\\n    }\\n  }\\n}\\n\\n.card-footer {\\n  padding: $card-spacer-y $card-spacer-x;\\n  background-color: $card-cap-bg;\\n  border-top: $card-border-width solid $card-border-color;\\n\\n  &:last-child {\\n    @include border-radius(0 0 $card-inner-border-radius $card-inner-border-radius);\\n  }\\n}\\n\\n\\n//\\n// Header navs\\n//\\n\\n.card-header-tabs {\\n  margin-right: -$card-spacer-x / 2;\\n  margin-bottom: -$card-spacer-y;\\n  margin-left: -$card-spacer-x / 2;\\n  border-bottom: 0;\\n}\\n\\n.card-header-pills {\\n  margin-right: -$card-spacer-x / 2;\\n  margin-left: -$card-spacer-x / 2;\\n}\\n\\n// Card image\\n.card-img-overlay {\\n  position: absolute;\\n  top: 0;\\n  right: 0;\\n  bottom: 0;\\n  left: 0;\\n  padding: $card-img-overlay-padding;\\n}\\n\\n.card-img {\\n  width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\\n  @include border-radius($card-inner-border-radius);\\n}\\n\\n// Card image caps\\n.card-img-top {\\n  width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\\n  @include border-top-radius($card-inner-border-radius);\\n}\\n\\n.card-img-bottom {\\n  width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\\n  @include border-bottom-radius($card-inner-border-radius);\\n}\\n\\n\\n// Card deck\\n\\n.card-deck {\\n  display: flex;\\n  flex-direction: column;\\n\\n  .card {\\n    margin-bottom: $card-deck-margin;\\n  }\\n\\n  @include media-breakpoint-up(sm) {\\n    flex-flow: row wrap;\\n    margin-right: -$card-deck-margin;\\n    margin-left: -$card-deck-margin;\\n\\n    .card {\\n      display: flex;\\n      // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\\n      flex: 1 0 0%;\\n      flex-direction: column;\\n      margin-right: $card-deck-margin;\\n      margin-bottom: 0; // Override the default\\n      margin-left: $card-deck-margin;\\n    }\\n  }\\n}\\n\\n\\n//\\n// Card groups\\n//\\n\\n.card-group {\\n  display: flex;\\n  flex-direction: column;\\n\\n  // The child selector allows nested `.card` within `.card-group`\\n  // to display properly.\\n  > .card {\\n    margin-bottom: $card-group-margin;\\n  }\\n\\n  @include media-breakpoint-up(sm) {\\n    flex-flow: row wrap;\\n    // The child selector allows nested `.card` within `.card-group`\\n    // to display properly.\\n    > .card {\\n      // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\\n      flex: 1 0 0%;\\n      margin-bottom: 0;\\n\\n      + .card {\\n        margin-left: 0;\\n        border-left: 0;\\n      }\\n\\n      // Handle rounded corners\\n      @if $enable-rounded {\\n        &:not(:last-child) {\\n          @include border-right-radius(0);\\n\\n          .card-img-top,\\n          .card-header {\\n            // stylelint-disable-next-line property-blacklist\\n            border-top-right-radius: 0;\\n          }\\n          .card-img-bottom,\\n          .card-footer {\\n            // stylelint-disable-next-line property-blacklist\\n            border-bottom-right-radius: 0;\\n          }\\n        }\\n\\n        &:not(:first-child) {\\n          @include border-left-radius(0);\\n\\n          .card-img-top,\\n          .card-header {\\n            // stylelint-disable-next-line property-blacklist\\n            border-top-left-radius: 0;\\n          }\\n          .card-img-bottom,\\n          .card-footer {\\n            // stylelint-disable-next-line property-blacklist\\n            border-bottom-left-radius: 0;\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\n\\n\\n//\\n// Columns\\n//\\n\\n.card-columns {\\n  .card {\\n    margin-bottom: $card-columns-margin;\\n  }\\n\\n  @include media-breakpoint-up(sm) {\\n    column-count: $card-columns-count;\\n    column-gap: $card-columns-gap;\\n    orphans: 1;\\n    widows: 1;\\n\\n    .card {\\n      display: inline-block; // Don't let them vertically span multiple columns\\n      width: 100%; // Don't let their width change\\n    }\\n  }\\n}\\n\\n\\n//\\n// Accordion\\n//\\n\\n.accordion {\\n  > .card {\\n    overflow: hidden;\\n\\n    &:not(:first-of-type) {\\n      .card-header:first-child {\\n        @include border-radius(0);\\n      }\\n\\n      &:not(:last-of-type) {\\n        border-bottom: 0;\\n        @include border-radius(0);\\n      }\\n    }\\n\\n    &:first-of-type {\\n      border-bottom: 0;\\n      @include border-bottom-radius(0);\\n    }\\n\\n    &:last-of-type {\\n      @include border-top-radius(0);\\n    }\\n\\n    .card-header {\\n      margin-bottom: -$card-border-width;\\n    }\\n  }\\n}\\n\",\".breadcrumb {\\n  display: flex;\\n  flex-wrap: wrap;\\n  padding: $breadcrumb-padding-y $breadcrumb-padding-x;\\n  margin-bottom: $breadcrumb-margin-bottom;\\n  list-style: none;\\n  background-color: $breadcrumb-bg;\\n  @include border-radius($breadcrumb-border-radius);\\n}\\n\\n.breadcrumb-item {\\n  // The separator between breadcrumbs (by default, a forward-slash: \\\"/\\\")\\n  + .breadcrumb-item {\\n    padding-left: $breadcrumb-item-padding;\\n\\n    &::before {\\n      display: inline-block; // Suppress underlining of the separator in modern browsers\\n      padding-right: $breadcrumb-item-padding;\\n      color: $breadcrumb-divider-color;\\n      content: $breadcrumb-divider;\\n    }\\n  }\\n\\n  // IE9-11 hack to properly handle hyperlink underlines for breadcrumbs built\\n  // without `<ul>`s. The `::before` pseudo-element generates an element\\n  // *within* the .breadcrumb-item and thereby inherits the `text-decoration`.\\n  //\\n  // To trick IE into suppressing the underline, we give the pseudo-element an\\n  // underline and then immediately remove it.\\n  + .breadcrumb-item:hover::before {\\n    text-decoration: underline;\\n  }\\n  // stylelint-disable-next-line no-duplicate-selectors\\n  + .breadcrumb-item:hover::before {\\n    text-decoration: none;\\n  }\\n\\n  &.active {\\n    color: $breadcrumb-active-color;\\n  }\\n}\\n\",\".pagination {\\n  display: flex;\\n  @include list-unstyled();\\n  @include border-radius();\\n}\\n\\n.page-link {\\n  position: relative;\\n  display: block;\\n  padding: $pagination-padding-y $pagination-padding-x;\\n  margin-left: -$pagination-border-width;\\n  line-height: $pagination-line-height;\\n  color: $pagination-color;\\n  background-color: $pagination-bg;\\n  border: $pagination-border-width solid $pagination-border-color;\\n\\n  &:hover {\\n    z-index: 2;\\n    color: $pagination-hover-color;\\n    text-decoration: none;\\n    background-color: $pagination-hover-bg;\\n    border-color: $pagination-hover-border-color;\\n  }\\n\\n  &:focus {\\n    z-index: 2;\\n    outline: $pagination-focus-outline;\\n    box-shadow: $pagination-focus-box-shadow;\\n  }\\n}\\n\\n.page-item {\\n  &:first-child {\\n    .page-link {\\n      margin-left: 0;\\n      @include border-left-radius($border-radius);\\n    }\\n  }\\n  &:last-child {\\n    .page-link {\\n      @include border-right-radius($border-radius);\\n    }\\n  }\\n\\n  &.active .page-link {\\n    z-index: 1;\\n    color: $pagination-active-color;\\n    background-color: $pagination-active-bg;\\n    border-color: $pagination-active-border-color;\\n  }\\n\\n  &.disabled .page-link {\\n    color: $pagination-disabled-color;\\n    pointer-events: none;\\n    // Opinionated: remove the \\\"hand\\\" cursor set previously for .page-link\\n    cursor: auto;\\n    background-color: $pagination-disabled-bg;\\n    border-color: $pagination-disabled-border-color;\\n  }\\n}\\n\\n\\n//\\n// Sizing\\n//\\n\\n.pagination-lg {\\n  @include pagination-size($pagination-padding-y-lg, $pagination-padding-x-lg, $font-size-lg, $line-height-lg, $border-radius-lg);\\n}\\n\\n.pagination-sm {\\n  @include pagination-size($pagination-padding-y-sm, $pagination-padding-x-sm, $font-size-sm, $line-height-sm, $border-radius-sm);\\n}\\n\",\"// Pagination\\n\\n@mixin pagination-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) {\\n  .page-link {\\n    padding: $padding-y $padding-x;\\n    @include font-size($font-size);\\n    line-height: $line-height;\\n  }\\n\\n  .page-item {\\n    &:first-child {\\n      .page-link {\\n        @include border-left-radius($border-radius);\\n      }\\n    }\\n    &:last-child {\\n      .page-link {\\n        @include border-right-radius($border-radius);\\n      }\\n    }\\n  }\\n}\\n\",\"// Base class\\n//\\n// Requires one of the contextual, color modifier classes for `color` and\\n// `background-color`.\\n\\n.badge {\\n  display: inline-block;\\n  padding: $badge-padding-y $badge-padding-x;\\n  @include font-size($badge-font-size);\\n  font-weight: $badge-font-weight;\\n  line-height: 1;\\n  text-align: center;\\n  white-space: nowrap;\\n  vertical-align: baseline;\\n  @include border-radius($badge-border-radius);\\n  @include transition($badge-transition);\\n\\n  @at-root a#{&} {\\n    @include hover-focus {\\n      text-decoration: none;\\n    }\\n  }\\n\\n  // Empty badges collapse automatically\\n  &:empty {\\n    display: none;\\n  }\\n}\\n\\n// Quick fix for badges in buttons\\n.btn .badge {\\n  position: relative;\\n  top: -1px;\\n}\\n\\n// Pill badges\\n//\\n// Make them extra rounded with a modifier to replace v3's badges.\\n\\n.badge-pill {\\n  padding-right: $badge-pill-padding-x;\\n  padding-left: $badge-pill-padding-x;\\n  @include border-radius($badge-pill-border-radius);\\n}\\n\\n// Colors\\n//\\n// Contextual variations (linked badges get darker on :hover).\\n\\n@each $color, $value in $theme-colors {\\n  .badge-#{$color} {\\n    @include badge-variant($value);\\n  }\\n}\\n\",\"@mixin badge-variant($bg) {\\n  color: color-yiq($bg);\\n  background-color: $bg;\\n\\n  @at-root a#{&} {\\n    @include hover-focus {\\n      color: color-yiq($bg);\\n      background-color: darken($bg, 10%);\\n    }\\n\\n    &:focus,\\n    &.focus {\\n      outline: 0;\\n      box-shadow: 0 0 0 $badge-focus-width rgba($bg, .5);\\n    }\\n  }\\n}\\n\",\".jumbotron {\\n  padding: $jumbotron-padding ($jumbotron-padding / 2);\\n  margin-bottom: $jumbotron-padding;\\n  color: $jumbotron-color;\\n  background-color: $jumbotron-bg;\\n  @include border-radius($border-radius-lg);\\n\\n  @include media-breakpoint-up(sm) {\\n    padding: ($jumbotron-padding * 2) $jumbotron-padding;\\n  }\\n}\\n\\n.jumbotron-fluid {\\n  padding-right: 0;\\n  padding-left: 0;\\n  @include border-radius(0);\\n}\\n\",\"//\\n// Base styles\\n//\\n\\n.alert {\\n  position: relative;\\n  padding: $alert-padding-y $alert-padding-x;\\n  margin-bottom: $alert-margin-bottom;\\n  border: $alert-border-width solid transparent;\\n  @include border-radius($alert-border-radius);\\n}\\n\\n// Headings for larger alerts\\n.alert-heading {\\n  // Specified to prevent conflicts of changing $headings-color\\n  color: inherit;\\n}\\n\\n// Provide class for links that match alerts\\n.alert-link {\\n  font-weight: $alert-link-font-weight;\\n}\\n\\n\\n// Dismissible alerts\\n//\\n// Expand the right padding and account for the close button's positioning.\\n\\n.alert-dismissible {\\n  padding-right: $close-font-size + $alert-padding-x * 2;\\n\\n  // Adjust close link position\\n  .close {\\n    position: absolute;\\n    top: 0;\\n    right: 0;\\n    padding: $alert-padding-y $alert-padding-x;\\n    color: inherit;\\n  }\\n}\\n\\n\\n// Alternate styles\\n//\\n// Generate contextual modifier classes for colorizing the alert.\\n\\n@each $color, $value in $theme-colors {\\n  .alert-#{$color} {\\n    @include alert-variant(theme-color-level($color, $alert-bg-level), theme-color-level($color, $alert-border-level), theme-color-level($color, $alert-color-level));\\n  }\\n}\\n\",\"@mixin alert-variant($background, $border, $color) {\\n  color: $color;\\n  @include gradient-bg($background);\\n  border-color: $border;\\n\\n  hr {\\n    border-top-color: darken($border, 5%);\\n  }\\n\\n  .alert-link {\\n    color: darken($color, 10%);\\n  }\\n}\\n\",\"// Disable animation if transitions are disabled\\n@if $enable-transitions {\\n  @keyframes progress-bar-stripes {\\n    from { background-position: $progress-height 0; }\\n    to { background-position: 0 0; }\\n  }\\n}\\n\\n.progress {\\n  display: flex;\\n  height: $progress-height;\\n  overflow: hidden; // force rounded corners by cropping it\\n  @include font-size($progress-font-size);\\n  background-color: $progress-bg;\\n  @include border-radius($progress-border-radius);\\n  @include box-shadow($progress-box-shadow);\\n}\\n\\n.progress-bar {\\n  display: flex;\\n  flex-direction: column;\\n  justify-content: center;\\n  color: $progress-bar-color;\\n  text-align: center;\\n  white-space: nowrap;\\n  background-color: $progress-bar-bg;\\n  @include transition($progress-bar-transition);\\n}\\n\\n.progress-bar-striped {\\n  @include gradient-striped();\\n  background-size: $progress-height $progress-height;\\n}\\n\\n@if $enable-transitions {\\n  .progress-bar-animated {\\n    animation: progress-bar-stripes $progress-bar-animation-timing;\\n\\n    @media (prefers-reduced-motion: reduce) {\\n      animation: none;\\n    }\\n  }\\n}\\n\",\".media {\\n  display: flex;\\n  align-items: flex-start;\\n}\\n\\n.media-body {\\n  flex: 1;\\n}\\n\",\"// Base class\\n//\\n// Easily usable on <ul>, <ol>, or <div>.\\n\\n.list-group {\\n  display: flex;\\n  flex-direction: column;\\n\\n  // No need to set list-style: none; since .list-group-item is block level\\n  padding-left: 0; // reset padding because ul and ol\\n  margin-bottom: 0;\\n}\\n\\n\\n// Interactive list items\\n//\\n// Use anchor or button elements instead of `li`s or `div`s to create interactive\\n// list items. Includes an extra `.active` modifier class for selected items.\\n\\n.list-group-item-action {\\n  width: 100%; // For `<button>`s (anchors become 100% by default though)\\n  color: $list-group-action-color;\\n  text-align: inherit; // For `<button>`s (anchors inherit)\\n\\n  // Hover state\\n  @include hover-focus {\\n    z-index: 1; // Place hover/focus items above their siblings for proper border styling\\n    color: $list-group-action-hover-color;\\n    text-decoration: none;\\n    background-color: $list-group-hover-bg;\\n  }\\n\\n  &:active {\\n    color: $list-group-action-active-color;\\n    background-color: $list-group-action-active-bg;\\n  }\\n}\\n\\n\\n// Individual list items\\n//\\n// Use on `li`s or `div`s within the `.list-group` parent.\\n\\n.list-group-item {\\n  position: relative;\\n  display: block;\\n  padding: $list-group-item-padding-y $list-group-item-padding-x;\\n  // Place the border on the list items and negative margin up for better styling\\n  margin-bottom: -$list-group-border-width;\\n  color: $list-group-color;\\n  background-color: $list-group-bg;\\n  border: $list-group-border-width solid $list-group-border-color;\\n\\n  &:first-child {\\n    @include border-top-radius($list-group-border-radius);\\n  }\\n\\n  &:last-child {\\n    margin-bottom: 0;\\n    @include border-bottom-radius($list-group-border-radius);\\n  }\\n\\n  &.disabled,\\n  &:disabled {\\n    color: $list-group-disabled-color;\\n    pointer-events: none;\\n    background-color: $list-group-disabled-bg;\\n  }\\n\\n  // Include both here for `<a>`s and `<button>`s\\n  &.active {\\n    z-index: 2; // Place active items above their siblings for proper border styling\\n    color: $list-group-active-color;\\n    background-color: $list-group-active-bg;\\n    border-color: $list-group-active-border-color;\\n  }\\n}\\n\\n\\n// Horizontal\\n//\\n// Change the layout of list group items from vertical (default) to horizontal.\\n\\n@each $breakpoint in map-keys($grid-breakpoints) {\\n  @include media-breakpoint-up($breakpoint) {\\n    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\\n\\n    .list-group-horizontal#{$infix} {\\n      flex-direction: row;\\n\\n      .list-group-item {\\n        margin-right: -$list-group-border-width;\\n        margin-bottom: 0;\\n\\n        &:first-child {\\n          @include border-left-radius($list-group-border-radius);\\n          @include border-top-right-radius(0);\\n        }\\n\\n        &:last-child {\\n          margin-right: 0;\\n          @include border-right-radius($list-group-border-radius);\\n          @include border-bottom-left-radius(0);\\n        }\\n      }\\n    }\\n  }\\n}\\n\\n\\n// Flush list items\\n//\\n// Remove borders and border-radius to keep list group items edge-to-edge. Most\\n// useful within other components (e.g., cards).\\n\\n.list-group-flush {\\n  .list-group-item {\\n    border-right: 0;\\n    border-left: 0;\\n    @include border-radius(0);\\n\\n    &:last-child {\\n      margin-bottom: -$list-group-border-width;\\n    }\\n  }\\n\\n  &:first-child {\\n    .list-group-item:first-child {\\n      border-top: 0;\\n    }\\n  }\\n\\n  &:last-child {\\n    .list-group-item:last-child {\\n      margin-bottom: 0;\\n      border-bottom: 0;\\n    }\\n  }\\n}\\n\\n\\n// Contextual variants\\n//\\n// Add modifier classes to change text and background color on individual items.\\n// Organizationally, this must come after the `:hover` states.\\n\\n@each $color, $value in $theme-colors {\\n  @include list-group-item-variant($color, theme-color-level($color, -9), theme-color-level($color, 6));\\n}\\n\",\"// List Groups\\n\\n@mixin list-group-item-variant($state, $background, $color) {\\n  .list-group-item-#{$state} {\\n    color: $color;\\n    background-color: $background;\\n\\n    &.list-group-item-action {\\n      @include hover-focus {\\n        color: $color;\\n        background-color: darken($background, 5%);\\n      }\\n\\n      &.active {\\n        color: $white;\\n        background-color: $color;\\n        border-color: $color;\\n      }\\n    }\\n  }\\n}\\n\",\".close {\\n  float: right;\\n  @include font-size($close-font-size);\\n  font-weight: $close-font-weight;\\n  line-height: 1;\\n  color: $close-color;\\n  text-shadow: $close-text-shadow;\\n  opacity: .5;\\n\\n  // Override <a>'s hover style\\n  @include hover {\\n    color: $close-color;\\n    text-decoration: none;\\n  }\\n\\n  &:not(:disabled):not(.disabled) {\\n    @include hover-focus {\\n      opacity: .75;\\n    }\\n  }\\n}\\n\\n// Additional properties for button version\\n// iOS requires the button element instead of an anchor tag.\\n// If you want the anchor version, it requires `href=\\\"#\\\"`.\\n// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\\n\\n// stylelint-disable-next-line selector-no-qualifying-type\\nbutton.close {\\n  padding: 0;\\n  background-color: transparent;\\n  border: 0;\\n  appearance: none;\\n}\\n\\n// Future-proof disabling of clicks on `<a>` elements\\n\\n// stylelint-disable-next-line selector-no-qualifying-type\\na.close.disabled {\\n  pointer-events: none;\\n}\\n\",\".toast {\\n  max-width: $toast-max-width;\\n  overflow: hidden; // cheap rounded corners on nested items\\n  @include font-size($toast-font-size);\\n  color: $toast-color;\\n  background-color: $toast-background-color;\\n  background-clip: padding-box;\\n  border: $toast-border-width solid $toast-border-color;\\n  box-shadow: $toast-box-shadow;\\n  backdrop-filter: blur(10px);\\n  opacity: 0;\\n  @include border-radius($toast-border-radius);\\n\\n  &:not(:last-child) {\\n    margin-bottom: $toast-padding-x;\\n  }\\n\\n  &.showing {\\n    opacity: 1;\\n  }\\n\\n  &.show {\\n    display: block;\\n    opacity: 1;\\n  }\\n\\n  &.hide {\\n    display: none;\\n  }\\n}\\n\\n.toast-header {\\n  display: flex;\\n  align-items: center;\\n  padding: $toast-padding-y $toast-padding-x;\\n  color: $toast-header-color;\\n  background-color: $toast-header-background-color;\\n  background-clip: padding-box;\\n  border-bottom: $toast-border-width solid $toast-header-border-color;\\n}\\n\\n.toast-body {\\n  padding: $toast-padding-x; // apply to both vertical and horizontal\\n}\\n\",\"// .modal-open      - body class for killing the scroll\\n// .modal           - container to scroll within\\n// .modal-dialog    - positioning shell for the actual modal\\n// .modal-content   - actual modal w/ bg and corners and stuff\\n\\n\\n.modal-open {\\n  // Kill the scroll on the body\\n  overflow: hidden;\\n\\n  .modal {\\n    overflow-x: hidden;\\n    overflow-y: auto;\\n  }\\n}\\n\\n// Container that the modal scrolls within\\n.modal {\\n  position: fixed;\\n  top: 0;\\n  left: 0;\\n  z-index: $zindex-modal;\\n  display: none;\\n  width: 100%;\\n  height: 100%;\\n  overflow: hidden;\\n  // Prevent Chrome on Windows from adding a focus outline. For details, see\\n  // https://github.com/twbs/bootstrap/pull/10951.\\n  outline: 0;\\n  // We deliberately don't use `-webkit-overflow-scrolling: touch;` due to a\\n  // gnarly iOS Safari bug: https://bugs.webkit.org/show_bug.cgi?id=158342\\n  // See also https://github.com/twbs/bootstrap/issues/17695\\n}\\n\\n// Shell div to position the modal with bottom padding\\n.modal-dialog {\\n  position: relative;\\n  width: auto;\\n  margin: $modal-dialog-margin;\\n  // allow clicks to pass through for custom click handling to close modal\\n  pointer-events: none;\\n\\n  // When fading in the modal, animate it to slide down\\n  .modal.fade & {\\n    @include transition($modal-transition);\\n    transform: $modal-fade-transform;\\n  }\\n  .modal.show & {\\n    transform: $modal-show-transform;\\n  }\\n}\\n\\n.modal-dialog-scrollable {\\n  display: flex; // IE10/11\\n  max-height: calc(100% - #{$modal-dialog-margin * 2});\\n\\n  .modal-content {\\n    max-height: calc(100vh - #{$modal-dialog-margin * 2}); // IE10/11\\n    overflow: hidden;\\n  }\\n\\n  .modal-header,\\n  .modal-footer {\\n    flex-shrink: 0;\\n  }\\n\\n  .modal-body {\\n    overflow-y: auto;\\n  }\\n}\\n\\n.modal-dialog-centered {\\n  display: flex;\\n  align-items: center;\\n  min-height: calc(100% - #{$modal-dialog-margin * 2});\\n\\n  // Ensure `modal-dialog-centered` extends the full height of the view (IE10/11)\\n  &::before {\\n    display: block; // IE10\\n    height: calc(100vh - #{$modal-dialog-margin * 2});\\n    content: \\\"\\\";\\n  }\\n\\n  // Ensure `.modal-body` shows scrollbar (IE10/11)\\n  &.modal-dialog-scrollable {\\n    flex-direction: column;\\n    justify-content: center;\\n    height: 100%;\\n\\n    .modal-content {\\n      max-height: none;\\n    }\\n\\n    &::before {\\n      content: none;\\n    }\\n  }\\n}\\n\\n// Actual modal\\n.modal-content {\\n  position: relative;\\n  display: flex;\\n  flex-direction: column;\\n  width: 100%; // Ensure `.modal-content` extends the full width of the parent `.modal-dialog`\\n  // counteract the pointer-events: none; in the .modal-dialog\\n  color: $modal-content-color;\\n  pointer-events: auto;\\n  background-color: $modal-content-bg;\\n  background-clip: padding-box;\\n  border: $modal-content-border-width solid $modal-content-border-color;\\n  @include border-radius($modal-content-border-radius);\\n  @include box-shadow($modal-content-box-shadow-xs);\\n  // Remove focus outline from opened modal\\n  outline: 0;\\n}\\n\\n// Modal background\\n.modal-backdrop {\\n  position: fixed;\\n  top: 0;\\n  left: 0;\\n  z-index: $zindex-modal-backdrop;\\n  width: 100vw;\\n  height: 100vh;\\n  background-color: $modal-backdrop-bg;\\n\\n  // Fade for backdrop\\n  &.fade { opacity: 0; }\\n  &.show { opacity: $modal-backdrop-opacity; }\\n}\\n\\n// Modal header\\n// Top section of the modal w/ title and dismiss\\n.modal-header {\\n  display: flex;\\n  align-items: flex-start; // so the close btn always stays on the upper right corner\\n  justify-content: space-between; // Put modal header elements (title and dismiss) on opposite ends\\n  padding: $modal-header-padding;\\n  border-bottom: $modal-header-border-width solid $modal-header-border-color;\\n  @include border-top-radius($modal-content-border-radius);\\n\\n  .close {\\n    padding: $modal-header-padding;\\n    // auto on the left force icon to the right even when there is no .modal-title\\n    margin: (-$modal-header-padding-y) (-$modal-header-padding-x) (-$modal-header-padding-y) auto;\\n  }\\n}\\n\\n// Title text within header\\n.modal-title {\\n  margin-bottom: 0;\\n  line-height: $modal-title-line-height;\\n}\\n\\n// Modal body\\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\\n.modal-body {\\n  position: relative;\\n  // Enable `flex-grow: 1` so that the body take up as much space as possible\\n  // when should there be a fixed height on `.modal-dialog`.\\n  flex: 1 1 auto;\\n  padding: $modal-inner-padding;\\n}\\n\\n// Footer (for actions)\\n.modal-footer {\\n  display: flex;\\n  align-items: center; // vertically center\\n  justify-content: flex-end; // Right align buttons with flex property because text-align doesn't work on flex items\\n  padding: $modal-inner-padding;\\n  border-top: $modal-footer-border-width solid $modal-footer-border-color;\\n  @include border-bottom-radius($modal-content-border-radius);\\n\\n  // Easily place margin between footer elements\\n  > :not(:first-child) { margin-left: .25rem; }\\n  > :not(:last-child) { margin-right: .25rem; }\\n}\\n\\n// Measure scrollbar width for padding body during modal show/hide\\n.modal-scrollbar-measure {\\n  position: absolute;\\n  top: -9999px;\\n  width: 50px;\\n  height: 50px;\\n  overflow: scroll;\\n}\\n\\n// Scale up the modal\\n@include media-breakpoint-up(sm) {\\n  // Automatically set modal's width for larger viewports\\n  .modal-dialog {\\n    max-width: $modal-md;\\n    margin: $modal-dialog-margin-y-sm-up auto;\\n  }\\n\\n  .modal-dialog-scrollable {\\n    max-height: calc(100% - #{$modal-dialog-margin-y-sm-up * 2});\\n\\n    .modal-content {\\n      max-height: calc(100vh - #{$modal-dialog-margin-y-sm-up * 2});\\n    }\\n  }\\n\\n  .modal-dialog-centered {\\n    min-height: calc(100% - #{$modal-dialog-margin-y-sm-up * 2});\\n\\n    &::before {\\n      height: calc(100vh - #{$modal-dialog-margin-y-sm-up * 2});\\n    }\\n  }\\n\\n  .modal-content {\\n    @include box-shadow($modal-content-box-shadow-sm-up);\\n  }\\n\\n  .modal-sm { max-width: $modal-sm; }\\n}\\n\\n@include media-breakpoint-up(lg) {\\n  .modal-lg,\\n  .modal-xl {\\n    max-width: $modal-lg;\\n  }\\n}\\n\\n@include media-breakpoint-up(xl) {\\n  .modal-xl { max-width: $modal-xl; }\\n}\\n\",\"// Base class\\n.tooltip {\\n  position: absolute;\\n  z-index: $zindex-tooltip;\\n  display: block;\\n  margin: $tooltip-margin;\\n  // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\\n  // So reset our font and text properties to avoid inheriting weird values.\\n  @include reset-text();\\n  @include font-size($tooltip-font-size);\\n  // Allow breaking very long words so they don't overflow the tooltip's bounds\\n  word-wrap: break-word;\\n  opacity: 0;\\n\\n  &.show { opacity: $tooltip-opacity; }\\n\\n  .arrow {\\n    position: absolute;\\n    display: block;\\n    width: $tooltip-arrow-width;\\n    height: $tooltip-arrow-height;\\n\\n    &::before {\\n      position: absolute;\\n      content: \\\"\\\";\\n      border-color: transparent;\\n      border-style: solid;\\n    }\\n  }\\n}\\n\\n.bs-tooltip-top {\\n  padding: $tooltip-arrow-height 0;\\n\\n  .arrow {\\n    bottom: 0;\\n\\n    &::before {\\n      top: 0;\\n      border-width: $tooltip-arrow-height ($tooltip-arrow-width / 2) 0;\\n      border-top-color: $tooltip-arrow-color;\\n    }\\n  }\\n}\\n\\n.bs-tooltip-right {\\n  padding: 0 $tooltip-arrow-height;\\n\\n  .arrow {\\n    left: 0;\\n    width: $tooltip-arrow-height;\\n    height: $tooltip-arrow-width;\\n\\n    &::before {\\n      right: 0;\\n      border-width: ($tooltip-arrow-width / 2) $tooltip-arrow-height ($tooltip-arrow-width / 2) 0;\\n      border-right-color: $tooltip-arrow-color;\\n    }\\n  }\\n}\\n\\n.bs-tooltip-bottom {\\n  padding: $tooltip-arrow-height 0;\\n\\n  .arrow {\\n    top: 0;\\n\\n    &::before {\\n      bottom: 0;\\n      border-width: 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height;\\n      border-bottom-color: $tooltip-arrow-color;\\n    }\\n  }\\n}\\n\\n.bs-tooltip-left {\\n  padding: 0 $tooltip-arrow-height;\\n\\n  .arrow {\\n    right: 0;\\n    width: $tooltip-arrow-height;\\n    height: $tooltip-arrow-width;\\n\\n    &::before {\\n      left: 0;\\n      border-width: ($tooltip-arrow-width / 2) 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height;\\n      border-left-color: $tooltip-arrow-color;\\n    }\\n  }\\n}\\n\\n.bs-tooltip-auto {\\n  &[x-placement^=\\\"top\\\"] {\\n    @extend .bs-tooltip-top;\\n  }\\n  &[x-placement^=\\\"right\\\"] {\\n    @extend .bs-tooltip-right;\\n  }\\n  &[x-placement^=\\\"bottom\\\"] {\\n    @extend .bs-tooltip-bottom;\\n  }\\n  &[x-placement^=\\\"left\\\"] {\\n    @extend .bs-tooltip-left;\\n  }\\n}\\n\\n// Wrapper for the tooltip content\\n.tooltip-inner {\\n  max-width: $tooltip-max-width;\\n  padding: $tooltip-padding-y $tooltip-padding-x;\\n  color: $tooltip-color;\\n  text-align: center;\\n  background-color: $tooltip-bg;\\n  @include border-radius($tooltip-border-radius);\\n}\\n\",\"@mixin reset-text {\\n  font-family: $font-family-base;\\n  // We deliberately do NOT reset font-size or word-wrap.\\n  font-style: normal;\\n  font-weight: $font-weight-normal;\\n  line-height: $line-height-base;\\n  text-align: left; // Fallback for where `start` is not supported\\n  text-align: start;\\n  text-decoration: none;\\n  text-shadow: none;\\n  text-transform: none;\\n  letter-spacing: normal;\\n  word-break: normal;\\n  word-spacing: normal;\\n  white-space: normal;\\n  line-break: auto;\\n}\\n\",\".popover {\\n  position: absolute;\\n  top: 0;\\n  left: 0;\\n  z-index: $zindex-popover;\\n  display: block;\\n  max-width: $popover-max-width;\\n  // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\\n  // So reset our font and text properties to avoid inheriting weird values.\\n  @include reset-text();\\n  @include font-size($popover-font-size);\\n  // Allow breaking very long words so they don't overflow the popover's bounds\\n  word-wrap: break-word;\\n  background-color: $popover-bg;\\n  background-clip: padding-box;\\n  border: $popover-border-width solid $popover-border-color;\\n  @include border-radius($popover-border-radius);\\n  @include box-shadow($popover-box-shadow);\\n\\n  .arrow {\\n    position: absolute;\\n    display: block;\\n    width: $popover-arrow-width;\\n    height: $popover-arrow-height;\\n    margin: 0 $border-radius-lg;\\n\\n    &::before,\\n    &::after {\\n      position: absolute;\\n      display: block;\\n      content: \\\"\\\";\\n      border-color: transparent;\\n      border-style: solid;\\n    }\\n  }\\n}\\n\\n.bs-popover-top {\\n  margin-bottom: $popover-arrow-height;\\n\\n  > .arrow {\\n    bottom: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);\\n\\n    &::before {\\n      bottom: 0;\\n      border-width: $popover-arrow-height ($popover-arrow-width / 2) 0;\\n      border-top-color: $popover-arrow-outer-color;\\n    }\\n\\n    &::after {\\n      bottom: $popover-border-width;\\n      border-width: $popover-arrow-height ($popover-arrow-width / 2) 0;\\n      border-top-color: $popover-arrow-color;\\n    }\\n  }\\n}\\n\\n.bs-popover-right {\\n  margin-left: $popover-arrow-height;\\n\\n  > .arrow {\\n    left: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);\\n    width: $popover-arrow-height;\\n    height: $popover-arrow-width;\\n    margin: $border-radius-lg 0; // make sure the arrow does not touch the popover's rounded corners\\n\\n    &::before {\\n      left: 0;\\n      border-width: ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2) 0;\\n      border-right-color: $popover-arrow-outer-color;\\n    }\\n\\n    &::after {\\n      left: $popover-border-width;\\n      border-width: ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2) 0;\\n      border-right-color: $popover-arrow-color;\\n    }\\n  }\\n}\\n\\n.bs-popover-bottom {\\n  margin-top: $popover-arrow-height;\\n\\n  > .arrow {\\n    top: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);\\n\\n    &::before {\\n      top: 0;\\n      border-width: 0 ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2);\\n      border-bottom-color: $popover-arrow-outer-color;\\n    }\\n\\n    &::after {\\n      top: $popover-border-width;\\n      border-width: 0 ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2);\\n      border-bottom-color: $popover-arrow-color;\\n    }\\n  }\\n\\n  // This will remove the popover-header's border just below the arrow\\n  .popover-header::before {\\n    position: absolute;\\n    top: 0;\\n    left: 50%;\\n    display: block;\\n    width: $popover-arrow-width;\\n    margin-left: -$popover-arrow-width / 2;\\n    content: \\\"\\\";\\n    border-bottom: $popover-border-width solid $popover-header-bg;\\n  }\\n}\\n\\n.bs-popover-left {\\n  margin-right: $popover-arrow-height;\\n\\n  > .arrow {\\n    right: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);\\n    width: $popover-arrow-height;\\n    height: $popover-arrow-width;\\n    margin: $border-radius-lg 0; // make sure the arrow does not touch the popover's rounded corners\\n\\n    &::before {\\n      right: 0;\\n      border-width: ($popover-arrow-width / 2) 0 ($popover-arrow-width / 2) $popover-arrow-height;\\n      border-left-color: $popover-arrow-outer-color;\\n    }\\n\\n    &::after {\\n      right: $popover-border-width;\\n      border-width: ($popover-arrow-width / 2) 0 ($popover-arrow-width / 2) $popover-arrow-height;\\n      border-left-color: $popover-arrow-color;\\n    }\\n  }\\n}\\n\\n.bs-popover-auto {\\n  &[x-placement^=\\\"top\\\"] {\\n    @extend .bs-popover-top;\\n  }\\n  &[x-placement^=\\\"right\\\"] {\\n    @extend .bs-popover-right;\\n  }\\n  &[x-placement^=\\\"bottom\\\"] {\\n    @extend .bs-popover-bottom;\\n  }\\n  &[x-placement^=\\\"left\\\"] {\\n    @extend .bs-popover-left;\\n  }\\n}\\n\\n\\n// Offset the popover to account for the popover arrow\\n.popover-header {\\n  padding: $popover-header-padding-y $popover-header-padding-x;\\n  margin-bottom: 0; // Reset the default from Reboot\\n  @include font-size($font-size-base);\\n  color: $popover-header-color;\\n  background-color: $popover-header-bg;\\n  border-bottom: $popover-border-width solid darken($popover-header-bg, 5%);\\n  $offset-border-width: calc(#{$border-radius-lg} - #{$popover-border-width});\\n  @include border-top-radius($offset-border-width);\\n\\n  &:empty {\\n    display: none;\\n  }\\n}\\n\\n.popover-body {\\n  padding: $popover-body-padding-y $popover-body-padding-x;\\n  color: $popover-body-color;\\n}\\n\",\"// Notes on the classes:\\n//\\n// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically)\\n//    even when their scroll action started on a carousel, but for compatibility (with Firefox)\\n//    we're preventing all actions instead\\n// 2. The .carousel-item-left and .carousel-item-right is used to indicate where\\n//    the active slide is heading.\\n// 3. .active.carousel-item is the current slide.\\n// 4. .active.carousel-item-left and .active.carousel-item-right is the current\\n//    slide in its in-transition state. Only one of these occurs at a time.\\n// 5. .carousel-item-next.carousel-item-left and .carousel-item-prev.carousel-item-right\\n//    is the upcoming slide in transition.\\n\\n.carousel {\\n  position: relative;\\n}\\n\\n.carousel.pointer-event {\\n  touch-action: pan-y;\\n}\\n\\n.carousel-inner {\\n  position: relative;\\n  width: 100%;\\n  overflow: hidden;\\n  @include clearfix();\\n}\\n\\n.carousel-item {\\n  position: relative;\\n  display: none;\\n  float: left;\\n  width: 100%;\\n  margin-right: -100%;\\n  backface-visibility: hidden;\\n  @include transition($carousel-transition);\\n}\\n\\n.carousel-item.active,\\n.carousel-item-next,\\n.carousel-item-prev {\\n  display: block;\\n}\\n\\n.carousel-item-next:not(.carousel-item-left),\\n.active.carousel-item-right {\\n  transform: translateX(100%);\\n}\\n\\n.carousel-item-prev:not(.carousel-item-right),\\n.active.carousel-item-left {\\n  transform: translateX(-100%);\\n}\\n\\n\\n//\\n// Alternate transitions\\n//\\n\\n.carousel-fade {\\n  .carousel-item {\\n    opacity: 0;\\n    transition-property: opacity;\\n    transform: none;\\n  }\\n\\n  .carousel-item.active,\\n  .carousel-item-next.carousel-item-left,\\n  .carousel-item-prev.carousel-item-right {\\n    z-index: 1;\\n    opacity: 1;\\n  }\\n\\n  .active.carousel-item-left,\\n  .active.carousel-item-right {\\n    z-index: 0;\\n    opacity: 0;\\n    @include transition(0s $carousel-transition-duration opacity);\\n  }\\n}\\n\\n\\n//\\n// Left/right controls for nav\\n//\\n\\n.carousel-control-prev,\\n.carousel-control-next {\\n  position: absolute;\\n  top: 0;\\n  bottom: 0;\\n  z-index: 1;\\n  // Use flex for alignment (1-3)\\n  display: flex; // 1. allow flex styles\\n  align-items: center; // 2. vertically center contents\\n  justify-content: center; // 3. horizontally center contents\\n  width: $carousel-control-width;\\n  color: $carousel-control-color;\\n  text-align: center;\\n  opacity: $carousel-control-opacity;\\n  @include transition($carousel-control-transition);\\n\\n  // Hover/focus state\\n  @include hover-focus {\\n    color: $carousel-control-color;\\n    text-decoration: none;\\n    outline: 0;\\n    opacity: $carousel-control-hover-opacity;\\n  }\\n}\\n.carousel-control-prev {\\n  left: 0;\\n  @if $enable-gradients {\\n    background: linear-gradient(90deg, rgba($black, .25), rgba($black, .001));\\n  }\\n}\\n.carousel-control-next {\\n  right: 0;\\n  @if $enable-gradients {\\n    background: linear-gradient(270deg, rgba($black, .25), rgba($black, .001));\\n  }\\n}\\n\\n// Icons for within\\n.carousel-control-prev-icon,\\n.carousel-control-next-icon {\\n  display: inline-block;\\n  width: $carousel-control-icon-width;\\n  height: $carousel-control-icon-width;\\n  background: no-repeat 50% / 100% 100%;\\n}\\n.carousel-control-prev-icon {\\n  background-image: $carousel-control-prev-icon-bg;\\n}\\n.carousel-control-next-icon {\\n  background-image: $carousel-control-next-icon-bg;\\n}\\n\\n\\n// Optional indicator pips\\n//\\n// Add an ordered list with the following class and add a list item for each\\n// slide your carousel holds.\\n\\n.carousel-indicators {\\n  position: absolute;\\n  right: 0;\\n  bottom: 0;\\n  left: 0;\\n  z-index: 15;\\n  display: flex;\\n  justify-content: center;\\n  padding-left: 0; // override <ol> default\\n  // Use the .carousel-control's width as margin so we don't overlay those\\n  margin-right: $carousel-control-width;\\n  margin-left: $carousel-control-width;\\n  list-style: none;\\n\\n  li {\\n    box-sizing: content-box;\\n    flex: 0 1 auto;\\n    width: $carousel-indicator-width;\\n    height: $carousel-indicator-height;\\n    margin-right: $carousel-indicator-spacer;\\n    margin-left: $carousel-indicator-spacer;\\n    text-indent: -999px;\\n    cursor: pointer;\\n    background-color: $carousel-indicator-active-bg;\\n    background-clip: padding-box;\\n    // Use transparent borders to increase the hit area by 10px on top and bottom.\\n    border-top: $carousel-indicator-hit-area-height solid transparent;\\n    border-bottom: $carousel-indicator-hit-area-height solid transparent;\\n    opacity: .5;\\n    @include transition($carousel-indicator-transition);\\n  }\\n\\n  .active {\\n    opacity: 1;\\n  }\\n}\\n\\n\\n// Optional captions\\n//\\n//\\n\\n.carousel-caption {\\n  position: absolute;\\n  right: (100% - $carousel-caption-width) / 2;\\n  bottom: 20px;\\n  left: (100% - $carousel-caption-width) / 2;\\n  z-index: 10;\\n  padding-top: 20px;\\n  padding-bottom: 20px;\\n  color: $carousel-caption-color;\\n  text-align: center;\\n}\\n\",\"@mixin clearfix() {\\n  &::after {\\n    display: block;\\n    clear: both;\\n    content: \\\"\\\";\\n  }\\n}\\n\",\"//\\n// Rotating border\\n//\\n\\n@keyframes spinner-border {\\n  to { transform: rotate(360deg); }\\n}\\n\\n.spinner-border {\\n  display: inline-block;\\n  width: $spinner-width;\\n  height: $spinner-height;\\n  vertical-align: text-bottom;\\n  border: $spinner-border-width solid currentColor;\\n  border-right-color: transparent;\\n  // stylelint-disable-next-line property-blacklist\\n  border-radius: 50%;\\n  animation: spinner-border .75s linear infinite;\\n}\\n\\n.spinner-border-sm {\\n  width: $spinner-width-sm;\\n  height: $spinner-height-sm;\\n  border-width: $spinner-border-width-sm;\\n}\\n\\n//\\n// Growing circle\\n//\\n\\n@keyframes spinner-grow {\\n  0% {\\n    transform: scale(0);\\n  }\\n  50% {\\n    opacity: 1;\\n  }\\n}\\n\\n.spinner-grow {\\n  display: inline-block;\\n  width: $spinner-width;\\n  height: $spinner-height;\\n  vertical-align: text-bottom;\\n  background-color: currentColor;\\n  // stylelint-disable-next-line property-blacklist\\n  border-radius: 50%;\\n  opacity: 0;\\n  animation: spinner-grow .75s linear infinite;\\n}\\n\\n.spinner-grow-sm {\\n  width: $spinner-width-sm;\\n  height: $spinner-height-sm;\\n}\\n\",\"// stylelint-disable declaration-no-important\\n\\n.align-baseline    { vertical-align: baseline !important; } // Browser default\\n.align-top         { vertical-align: top !important; }\\n.align-middle      { vertical-align: middle !important; }\\n.align-bottom      { vertical-align: bottom !important; }\\n.align-text-bottom { vertical-align: text-bottom !important; }\\n.align-text-top    { vertical-align: text-top !important; }\\n\",\"// stylelint-disable declaration-no-important\\n\\n// Contextual backgrounds\\n\\n@mixin bg-variant($parent, $color) {\\n  #{$parent} {\\n    background-color: $color !important;\\n  }\\n  a#{$parent},\\n  button#{$parent} {\\n    @include hover-focus {\\n      background-color: darken($color, 10%) !important;\\n    }\\n  }\\n}\\n\\n@mixin bg-gradient-variant($parent, $color) {\\n  #{$parent} {\\n    background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x !important;\\n  }\\n}\\n\",\"// stylelint-disable declaration-no-important\\n\\n@each $color, $value in $theme-colors {\\n  @include bg-variant(\\\".bg-#{$color}\\\", $value);\\n}\\n\\n@if $enable-gradients {\\n  @each $color, $value in $theme-colors {\\n    @include bg-gradient-variant(\\\".bg-gradient-#{$color}\\\", $value);\\n  }\\n}\\n\\n.bg-white {\\n  background-color: $white !important;\\n}\\n\\n.bg-transparent {\\n  background-color: transparent !important;\\n}\\n\",\"// stylelint-disable property-blacklist, declaration-no-important\\n\\n//\\n// Border\\n//\\n\\n.border         { border: $border-width solid $border-color !important; }\\n.border-top     { border-top: $border-width solid $border-color !important; }\\n.border-right   { border-right: $border-width solid $border-color !important; }\\n.border-bottom  { border-bottom: $border-width solid $border-color !important; }\\n.border-left    { border-left: $border-width solid $border-color !important; }\\n\\n.border-0        { border: 0 !important; }\\n.border-top-0    { border-top: 0 !important; }\\n.border-right-0  { border-right: 0 !important; }\\n.border-bottom-0 { border-bottom: 0 !important; }\\n.border-left-0   { border-left: 0 !important; }\\n\\n@each $color, $value in $theme-colors {\\n  .border-#{$color} {\\n    border-color: $value !important;\\n  }\\n}\\n\\n.border-white {\\n  border-color: $white !important;\\n}\\n\\n//\\n// Border-radius\\n//\\n\\n.rounded-sm {\\n  border-radius: $border-radius-sm !important;\\n}\\n\\n.rounded {\\n  border-radius: $border-radius !important;\\n}\\n\\n.rounded-top {\\n  border-top-left-radius: $border-radius !important;\\n  border-top-right-radius: $border-radius !important;\\n}\\n\\n.rounded-right {\\n  border-top-right-radius: $border-radius !important;\\n  border-bottom-right-radius: $border-radius !important;\\n}\\n\\n.rounded-bottom {\\n  border-bottom-right-radius: $border-radius !important;\\n  border-bottom-left-radius: $border-radius !important;\\n}\\n\\n.rounded-left {\\n  border-top-left-radius: $border-radius !important;\\n  border-bottom-left-radius: $border-radius !important;\\n}\\n\\n.rounded-lg {\\n  border-radius: $border-radius-lg !important;\\n}\\n\\n.rounded-circle {\\n  border-radius: 50% !important;\\n}\\n\\n.rounded-pill {\\n  border-radius: $rounded-pill !important;\\n}\\n\\n.rounded-0 {\\n  border-radius: 0 !important;\\n}\\n\",\"// stylelint-disable declaration-no-important\\n\\n//\\n// Utilities for common `display` values\\n//\\n\\n@each $breakpoint in map-keys($grid-breakpoints) {\\n  @include media-breakpoint-up($breakpoint) {\\n    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\\n\\n    @each $value in $displays {\\n      .d#{$infix}-#{$value} { display: $value !important; }\\n    }\\n  }\\n}\\n\\n\\n//\\n// Utilities for toggling `display` in print\\n//\\n\\n@media print {\\n  @each $value in $displays {\\n    .d-print-#{$value} { display: $value !important; }\\n  }\\n}\\n\",\"// Credit: Nicolas Gallagher and SUIT CSS.\\n\\n.embed-responsive {\\n  position: relative;\\n  display: block;\\n  width: 100%;\\n  padding: 0;\\n  overflow: hidden;\\n\\n  &::before {\\n    display: block;\\n    content: \\\"\\\";\\n  }\\n\\n  .embed-responsive-item,\\n  iframe,\\n  embed,\\n  object,\\n  video {\\n    position: absolute;\\n    top: 0;\\n    bottom: 0;\\n    left: 0;\\n    width: 100%;\\n    height: 100%;\\n    border: 0;\\n  }\\n}\\n\\n@each $embed-responsive-aspect-ratio in $embed-responsive-aspect-ratios {\\n  $embed-responsive-aspect-ratio-x: nth($embed-responsive-aspect-ratio, 1);\\n  $embed-responsive-aspect-ratio-y: nth($embed-responsive-aspect-ratio, 2);\\n\\n  .embed-responsive-#{$embed-responsive-aspect-ratio-x}by#{$embed-responsive-aspect-ratio-y} {\\n    &::before {\\n      padding-top: percentage($embed-responsive-aspect-ratio-y / $embed-responsive-aspect-ratio-x);\\n    }\\n  }\\n}\\n\",\"// stylelint-disable declaration-no-important\\n\\n// Flex variation\\n//\\n// Custom styles for additional flex alignment options.\\n\\n@each $breakpoint in map-keys($grid-breakpoints) {\\n  @include media-breakpoint-up($breakpoint) {\\n    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\\n\\n    .flex#{$infix}-row            { flex-direction: row !important; }\\n    .flex#{$infix}-column         { flex-direction: column !important; }\\n    .flex#{$infix}-row-reverse    { flex-direction: row-reverse !important; }\\n    .flex#{$infix}-column-reverse { flex-direction: column-reverse !important; }\\n\\n    .flex#{$infix}-wrap         { flex-wrap: wrap !important; }\\n    .flex#{$infix}-nowrap       { flex-wrap: nowrap !important; }\\n    .flex#{$infix}-wrap-reverse { flex-wrap: wrap-reverse !important; }\\n    .flex#{$infix}-fill         { flex: 1 1 auto !important; }\\n    .flex#{$infix}-grow-0       { flex-grow: 0 !important; }\\n    .flex#{$infix}-grow-1       { flex-grow: 1 !important; }\\n    .flex#{$infix}-shrink-0     { flex-shrink: 0 !important; }\\n    .flex#{$infix}-shrink-1     { flex-shrink: 1 !important; }\\n\\n    .justify-content#{$infix}-start   { justify-content: flex-start !important; }\\n    .justify-content#{$infix}-end     { justify-content: flex-end !important; }\\n    .justify-content#{$infix}-center  { justify-content: center !important; }\\n    .justify-content#{$infix}-between { justify-content: space-between !important; }\\n    .justify-content#{$infix}-around  { justify-content: space-around !important; }\\n\\n    .align-items#{$infix}-start    { align-items: flex-start !important; }\\n    .align-items#{$infix}-end      { align-items: flex-end !important; }\\n    .align-items#{$infix}-center   { align-items: center !important; }\\n    .align-items#{$infix}-baseline { align-items: baseline !important; }\\n    .align-items#{$infix}-stretch  { align-items: stretch !important; }\\n\\n    .align-content#{$infix}-start   { align-content: flex-start !important; }\\n    .align-content#{$infix}-end     { align-content: flex-end !important; }\\n    .align-content#{$infix}-center  { align-content: center !important; }\\n    .align-content#{$infix}-between { align-content: space-between !important; }\\n    .align-content#{$infix}-around  { align-content: space-around !important; }\\n    .align-content#{$infix}-stretch { align-content: stretch !important; }\\n\\n    .align-self#{$infix}-auto     { align-self: auto !important; }\\n    .align-self#{$infix}-start    { align-self: flex-start !important; }\\n    .align-self#{$infix}-end      { align-self: flex-end !important; }\\n    .align-self#{$infix}-center   { align-self: center !important; }\\n    .align-self#{$infix}-baseline { align-self: baseline !important; }\\n    .align-self#{$infix}-stretch  { align-self: stretch !important; }\\n  }\\n}\\n\",\"// stylelint-disable declaration-no-important\\n\\n@each $breakpoint in map-keys($grid-breakpoints) {\\n  @include media-breakpoint-up($breakpoint) {\\n    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\\n\\n    .float#{$infix}-left  { float: left !important; }\\n    .float#{$infix}-right { float: right !important; }\\n    .float#{$infix}-none  { float: none !important; }\\n  }\\n}\\n\",\"// stylelint-disable declaration-no-important\\n\\n@each $value in $overflows {\\n  .overflow-#{$value} { overflow: $value !important; }\\n}\\n\",\"// stylelint-disable declaration-no-important\\n\\n// Common values\\n@each $position in $positions {\\n  .position-#{$position} { position: $position !important; }\\n}\\n\\n// Shorthand\\n\\n.fixed-top {\\n  position: fixed;\\n  top: 0;\\n  right: 0;\\n  left: 0;\\n  z-index: $zindex-fixed;\\n}\\n\\n.fixed-bottom {\\n  position: fixed;\\n  right: 0;\\n  bottom: 0;\\n  left: 0;\\n  z-index: $zindex-fixed;\\n}\\n\\n.sticky-top {\\n  @supports (position: sticky) {\\n    position: sticky;\\n    top: 0;\\n    z-index: $zindex-sticky;\\n  }\\n}\\n\",\"//\\n// Screenreaders\\n//\\n\\n.sr-only {\\n  @include sr-only();\\n}\\n\\n.sr-only-focusable {\\n  @include sr-only-focusable();\\n}\\n\",\"// Only display content to screen readers\\n//\\n// See: https://a11yproject.com/posts/how-to-hide-content/\\n// See: https://hugogiraudel.com/2016/10/13/css-hide-and-seek/\\n\\n@mixin sr-only {\\n  position: absolute;\\n  width: 1px;\\n  height: 1px;\\n  padding: 0;\\n  overflow: hidden;\\n  clip: rect(0, 0, 0, 0);\\n  white-space: nowrap;\\n  border: 0;\\n}\\n\\n// Use in conjunction with .sr-only to only display content when it's focused.\\n//\\n// Useful for \\\"Skip to main content\\\" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\\n//\\n// Credit: HTML5 Boilerplate\\n\\n@mixin sr-only-focusable {\\n  &:active,\\n  &:focus {\\n    position: static;\\n    width: auto;\\n    height: auto;\\n    overflow: visible;\\n    clip: auto;\\n    white-space: normal;\\n  }\\n}\\n\",\"// stylelint-disable declaration-no-important\\n\\n.shadow-sm { box-shadow: $box-shadow-sm !important; }\\n.shadow { box-shadow: $box-shadow !important; }\\n.shadow-lg { box-shadow: $box-shadow-lg !important; }\\n.shadow-none { box-shadow: none !important; }\\n\",\"// stylelint-disable declaration-no-important\\n\\n// Width and height\\n\\n@each $prop, $abbrev in (width: w, height: h) {\\n  @each $size, $length in $sizes {\\n    .#{$abbrev}-#{$size} { #{$prop}: $length !important; }\\n  }\\n}\\n\\n.mw-100 { max-width: 100% !important; }\\n.mh-100 { max-height: 100% !important; }\\n\\n// Viewport additional helpers\\n\\n.min-vw-100 { min-width: 100vw !important; }\\n.min-vh-100 { min-height: 100vh !important; }\\n\\n.vw-100 { width: 100vw !important; }\\n.vh-100 { height: 100vh !important; }\\n\",\"//\\n// Stretched link\\n//\\n\\n.stretched-link {\\n  &::after {\\n    position: absolute;\\n    top: 0;\\n    right: 0;\\n    bottom: 0;\\n    left: 0;\\n    z-index: 1;\\n    // Just in case `pointer-events: none` is set on a parent\\n    pointer-events: auto;\\n    content: \\\"\\\";\\n    // IE10 bugfix, see https://stackoverflow.com/questions/16947967/ie10-hover-pseudo-class-doesnt-work-without-background-color\\n    background-color: rgba(0, 0, 0, 0);\\n  }\\n}\\n\",\"// stylelint-disable declaration-no-important\\n\\n// Margin and Padding\\n\\n@each $breakpoint in map-keys($grid-breakpoints) {\\n  @include media-breakpoint-up($breakpoint) {\\n    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\\n\\n    @each $prop, $abbrev in (margin: m, padding: p) {\\n      @each $size, $length in $spacers {\\n        .#{$abbrev}#{$infix}-#{$size} { #{$prop}: $length !important; }\\n        .#{$abbrev}t#{$infix}-#{$size},\\n        .#{$abbrev}y#{$infix}-#{$size} {\\n          #{$prop}-top: $length !important;\\n        }\\n        .#{$abbrev}r#{$infix}-#{$size},\\n        .#{$abbrev}x#{$infix}-#{$size} {\\n          #{$prop}-right: $length !important;\\n        }\\n        .#{$abbrev}b#{$infix}-#{$size},\\n        .#{$abbrev}y#{$infix}-#{$size} {\\n          #{$prop}-bottom: $length !important;\\n        }\\n        .#{$abbrev}l#{$infix}-#{$size},\\n        .#{$abbrev}x#{$infix}-#{$size} {\\n          #{$prop}-left: $length !important;\\n        }\\n      }\\n    }\\n\\n    // Negative margins (e.g., where `.mb-n1` is negative version of `.mb-1`)\\n    @each $size, $length in $spacers {\\n      @if $size != 0 {\\n        .m#{$infix}-n#{$size} { margin: -$length !important; }\\n        .mt#{$infix}-n#{$size},\\n        .my#{$infix}-n#{$size} {\\n          margin-top: -$length !important;\\n        }\\n        .mr#{$infix}-n#{$size},\\n        .mx#{$infix}-n#{$size} {\\n          margin-right: -$length !important;\\n        }\\n        .mb#{$infix}-n#{$size},\\n        .my#{$infix}-n#{$size} {\\n          margin-bottom: -$length !important;\\n        }\\n        .ml#{$infix}-n#{$size},\\n        .mx#{$infix}-n#{$size} {\\n          margin-left: -$length !important;\\n        }\\n      }\\n    }\\n\\n    // Some special margin utils\\n    .m#{$infix}-auto { margin: auto !important; }\\n    .mt#{$infix}-auto,\\n    .my#{$infix}-auto {\\n      margin-top: auto !important;\\n    }\\n    .mr#{$infix}-auto,\\n    .mx#{$infix}-auto {\\n      margin-right: auto !important;\\n    }\\n    .mb#{$infix}-auto,\\n    .my#{$infix}-auto {\\n      margin-bottom: auto !important;\\n    }\\n    .ml#{$infix}-auto,\\n    .mx#{$infix}-auto {\\n      margin-left: auto !important;\\n    }\\n  }\\n}\\n\",\"// stylelint-disable declaration-no-important\\n\\n//\\n// Text\\n//\\n\\n.text-monospace { font-family: $font-family-monospace !important; }\\n\\n// Alignment\\n\\n.text-justify  { text-align: justify !important; }\\n.text-wrap     { white-space: normal !important; }\\n.text-nowrap   { white-space: nowrap !important; }\\n.text-truncate { @include text-truncate; }\\n\\n// Responsive alignment\\n\\n@each $breakpoint in map-keys($grid-breakpoints) {\\n  @include media-breakpoint-up($breakpoint) {\\n    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\\n\\n    .text#{$infix}-left   { text-align: left !important; }\\n    .text#{$infix}-right  { text-align: right !important; }\\n    .text#{$infix}-center { text-align: center !important; }\\n  }\\n}\\n\\n// Transformation\\n\\n.text-lowercase  { text-transform: lowercase !important; }\\n.text-uppercase  { text-transform: uppercase !important; }\\n.text-capitalize { text-transform: capitalize !important; }\\n\\n// Weight and italics\\n\\n.font-weight-light   { font-weight: $font-weight-light !important; }\\n.font-weight-lighter { font-weight: $font-weight-lighter !important; }\\n.font-weight-normal  { font-weight: $font-weight-normal !important; }\\n.font-weight-bold    { font-weight: $font-weight-bold !important; }\\n.font-weight-bolder  { font-weight: $font-weight-bolder !important; }\\n.font-italic         { font-style: italic !important; }\\n\\n// Contextual colors\\n\\n.text-white { color: $white !important; }\\n\\n@each $color, $value in $theme-colors {\\n  @include text-emphasis-variant(\\\".text-#{$color}\\\", $value);\\n}\\n\\n.text-body { color: $body-color !important; }\\n.text-muted { color: $text-muted !important; }\\n\\n.text-black-50 { color: rgba($black, .5) !important; }\\n.text-white-50 { color: rgba($white, .5) !important; }\\n\\n// Misc\\n\\n.text-hide {\\n  @include text-hide($ignore-warning: true);\\n}\\n\\n.text-decoration-none { text-decoration: none !important; }\\n\\n.text-break {\\n  word-break: break-word !important; // IE & < Edge 18\\n  overflow-wrap: break-word !important;\\n}\\n\\n// Reset\\n\\n.text-reset { color: inherit !important; }\\n\",\"// Text truncate\\n// Requires inline-block or block for proper styling\\n\\n@mixin text-truncate() {\\n  overflow: hidden;\\n  text-overflow: ellipsis;\\n  white-space: nowrap;\\n}\\n\",\"// stylelint-disable declaration-no-important\\n\\n// Typography\\n\\n@mixin text-emphasis-variant($parent, $color) {\\n  #{$parent} {\\n    color: $color !important;\\n  }\\n  @if $emphasized-link-hover-darken-percentage != 0 {\\n    a#{$parent} {\\n      @include hover-focus {\\n        color: darken($color, $emphasized-link-hover-darken-percentage) !important;\\n      }\\n    }\\n  }\\n}\\n\",\"// CSS image replacement\\n@mixin text-hide($ignore-warning: false) {\\n  // stylelint-disable-next-line font-family-no-missing-generic-family-keyword\\n  font: 0/0 a;\\n  color: transparent;\\n  text-shadow: none;\\n  background-color: transparent;\\n  border: 0;\\n\\n  @include deprecate(\\\"`text-hide()`\\\", \\\"v4.1.0\\\", \\\"v5\\\", $ignore-warning);\\n}\\n\",\"// stylelint-disable declaration-no-important\\n\\n//\\n// Visibility utilities\\n//\\n\\n.visible {\\n  visibility: visible !important;\\n}\\n\\n.invisible {\\n  visibility: hidden !important;\\n}\\n\",\"// stylelint-disable declaration-no-important, selector-no-qualifying-type\\n\\n// Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css\\n\\n// ==========================================================================\\n// Print styles.\\n// Inlined to avoid the additional HTTP request:\\n// https://www.phpied.com/delay-loading-your-print-css/\\n// ==========================================================================\\n\\n@if $enable-print-styles {\\n  @media print {\\n    *,\\n    *::before,\\n    *::after {\\n      // Bootstrap specific; comment out `color` and `background`\\n      //color: $black !important; // Black prints faster\\n      text-shadow: none !important;\\n      //background: transparent !important;\\n      box-shadow: none !important;\\n    }\\n\\n    a {\\n      &:not(.btn) {\\n        text-decoration: underline;\\n      }\\n    }\\n\\n    // Bootstrap specific; comment the following selector out\\n    //a[href]::after {\\n    //  content: \\\" (\\\" attr(href) \\\")\\\";\\n    //}\\n\\n    abbr[title]::after {\\n      content: \\\" (\\\" attr(title) \\\")\\\";\\n    }\\n\\n    // Bootstrap specific; comment the following selector out\\n    //\\n    // Don't show links that are fragment identifiers,\\n    // or use the `javascript:` pseudo protocol\\n    //\\n\\n    //a[href^=\\\"#\\\"]::after,\\n    //a[href^=\\\"javascript:\\\"]::after {\\n    // content: \\\"\\\";\\n    //}\\n\\n    pre {\\n      white-space: pre-wrap !important;\\n    }\\n    pre,\\n    blockquote {\\n      border: $border-width solid $gray-500; // Bootstrap custom code; using `$border-width` instead of 1px\\n      page-break-inside: avoid;\\n    }\\n\\n    //\\n    // Printing Tables:\\n    // http://css-discuss.incutio.com/wiki/Printing_Tables\\n    //\\n\\n    thead {\\n      display: table-header-group;\\n    }\\n\\n    tr,\\n    img {\\n      page-break-inside: avoid;\\n    }\\n\\n    p,\\n    h2,\\n    h3 {\\n      orphans: 3;\\n      widows: 3;\\n    }\\n\\n    h2,\\n    h3 {\\n      page-break-after: avoid;\\n    }\\n\\n    // Bootstrap specific changes start\\n\\n    // Specify a size and min-width to make printing closer across browsers.\\n    // We don't set margin here because it breaks `size` in Chrome. We also\\n    // don't use `!important` on `size` as it breaks in Chrome.\\n    @page {\\n      size: $print-page-size;\\n    }\\n    body {\\n      min-width: $print-body-min-width !important;\\n    }\\n    .container {\\n      min-width: $print-body-min-width !important;\\n    }\\n\\n    // Bootstrap components\\n    .navbar {\\n      display: none;\\n    }\\n    .badge {\\n      border: $border-width solid $black;\\n    }\\n\\n    .table {\\n      border-collapse: collapse !important;\\n\\n      td,\\n      th {\\n        background-color: $white !important;\\n      }\\n    }\\n\\n    .table-bordered {\\n      th,\\n      td {\\n        border: 1px solid $gray-300 !important;\\n      }\\n    }\\n\\n    .table-dark {\\n      color: inherit;\\n\\n      th,\\n      td,\\n      thead th,\\n      tbody + tbody {\\n        border-color: $table-border-color;\\n      }\\n    }\\n\\n    .table .thead-dark th {\\n      color: inherit;\\n      border-color: $table-border-color;\\n    }\\n\\n    // Bootstrap specific changes end\\n  }\\n}\\n\"]}"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bootstrap4/js/bootstrap.bundle.js",
    "content": "/*!\n  * Bootstrap v4.3.1 (https://getbootstrap.com/)\n  * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jquery')) :\n  typeof define === 'function' && define.amd ? define(['exports', 'jquery'], factory) :\n  (global = global || self, factory(global.bootstrap = {}, global.jQuery));\n}(this, function (exports, $) { 'use strict';\n\n  $ = $ && $.hasOwnProperty('default') ? $['default'] : $;\n\n  function _defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  function _createClass(Constructor, protoProps, staticProps) {\n    if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) _defineProperties(Constructor, staticProps);\n    return Constructor;\n  }\n\n  function _defineProperty(obj, key, value) {\n    if (key in obj) {\n      Object.defineProperty(obj, key, {\n        value: value,\n        enumerable: true,\n        configurable: true,\n        writable: true\n      });\n    } else {\n      obj[key] = value;\n    }\n\n    return obj;\n  }\n\n  function _objectSpread(target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i] != null ? arguments[i] : {};\n      var ownKeys = Object.keys(source);\n\n      if (typeof Object.getOwnPropertySymbols === 'function') {\n        ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {\n          return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n        }));\n      }\n\n      ownKeys.forEach(function (key) {\n        _defineProperty(target, key, source[key]);\n      });\n    }\n\n    return target;\n  }\n\n  function _inheritsLoose(subClass, superClass) {\n    subClass.prototype = Object.create(superClass.prototype);\n    subClass.prototype.constructor = subClass;\n    subClass.__proto__ = superClass;\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.3.1): util.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Private TransitionEnd Helpers\n   * ------------------------------------------------------------------------\n   */\n\n  var TRANSITION_END = 'transitionend';\n  var MAX_UID = 1000000;\n  var MILLISECONDS_MULTIPLIER = 1000; // Shoutout AngusCroll (https://goo.gl/pxwQGp)\n\n  function toType(obj) {\n    return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase();\n  }\n\n  function getSpecialTransitionEndEvent() {\n    return {\n      bindType: TRANSITION_END,\n      delegateType: TRANSITION_END,\n      handle: function handle(event) {\n        if ($(event.target).is(this)) {\n          return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params\n        }\n\n        return undefined; // eslint-disable-line no-undefined\n      }\n    };\n  }\n\n  function transitionEndEmulator(duration) {\n    var _this = this;\n\n    var called = false;\n    $(this).one(Util.TRANSITION_END, function () {\n      called = true;\n    });\n    setTimeout(function () {\n      if (!called) {\n        Util.triggerTransitionEnd(_this);\n      }\n    }, duration);\n    return this;\n  }\n\n  function setTransitionEndSupport() {\n    $.fn.emulateTransitionEnd = transitionEndEmulator;\n    $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();\n  }\n  /**\n   * --------------------------------------------------------------------------\n   * Public Util Api\n   * --------------------------------------------------------------------------\n   */\n\n\n  var Util = {\n    TRANSITION_END: 'bsTransitionEnd',\n    getUID: function getUID(prefix) {\n      do {\n        // eslint-disable-next-line no-bitwise\n        prefix += ~~(Math.random() * MAX_UID); // \"~~\" acts like a faster Math.floor() here\n      } while (document.getElementById(prefix));\n\n      return prefix;\n    },\n    getSelectorFromElement: function getSelectorFromElement(element) {\n      var selector = element.getAttribute('data-target');\n\n      if (!selector || selector === '#') {\n        var hrefAttr = element.getAttribute('href');\n        selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : '';\n      }\n\n      try {\n        return document.querySelector(selector) ? selector : null;\n      } catch (err) {\n        return null;\n      }\n    },\n    getTransitionDurationFromElement: function getTransitionDurationFromElement(element) {\n      if (!element) {\n        return 0;\n      } // Get transition-duration of the element\n\n\n      var transitionDuration = $(element).css('transition-duration');\n      var transitionDelay = $(element).css('transition-delay');\n      var floatTransitionDuration = parseFloat(transitionDuration);\n      var floatTransitionDelay = parseFloat(transitionDelay); // Return 0 if element or transition duration is not found\n\n      if (!floatTransitionDuration && !floatTransitionDelay) {\n        return 0;\n      } // If multiple durations are defined, take the first\n\n\n      transitionDuration = transitionDuration.split(',')[0];\n      transitionDelay = transitionDelay.split(',')[0];\n      return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;\n    },\n    reflow: function reflow(element) {\n      return element.offsetHeight;\n    },\n    triggerTransitionEnd: function triggerTransitionEnd(element) {\n      $(element).trigger(TRANSITION_END);\n    },\n    // TODO: Remove in v5\n    supportsTransitionEnd: function supportsTransitionEnd() {\n      return Boolean(TRANSITION_END);\n    },\n    isElement: function isElement(obj) {\n      return (obj[0] || obj).nodeType;\n    },\n    typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {\n      for (var property in configTypes) {\n        if (Object.prototype.hasOwnProperty.call(configTypes, property)) {\n          var expectedTypes = configTypes[property];\n          var value = config[property];\n          var valueType = value && Util.isElement(value) ? 'element' : toType(value);\n\n          if (!new RegExp(expectedTypes).test(valueType)) {\n            throw new Error(componentName.toUpperCase() + \": \" + (\"Option \\\"\" + property + \"\\\" provided type \\\"\" + valueType + \"\\\" \") + (\"but expected type \\\"\" + expectedTypes + \"\\\".\"));\n          }\n        }\n      }\n    },\n    findShadowRoot: function findShadowRoot(element) {\n      if (!document.documentElement.attachShadow) {\n        return null;\n      } // Can find the shadow root otherwise it'll return the document\n\n\n      if (typeof element.getRootNode === 'function') {\n        var root = element.getRootNode();\n        return root instanceof ShadowRoot ? root : null;\n      }\n\n      if (element instanceof ShadowRoot) {\n        return element;\n      } // when we don't find a shadow root\n\n\n      if (!element.parentNode) {\n        return null;\n      }\n\n      return Util.findShadowRoot(element.parentNode);\n    }\n  };\n  setTransitionEndSupport();\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME = 'alert';\n  var VERSION = '4.3.1';\n  var DATA_KEY = 'bs.alert';\n  var EVENT_KEY = \".\" + DATA_KEY;\n  var DATA_API_KEY = '.data-api';\n  var JQUERY_NO_CONFLICT = $.fn[NAME];\n  var Selector = {\n    DISMISS: '[data-dismiss=\"alert\"]'\n  };\n  var Event = {\n    CLOSE: \"close\" + EVENT_KEY,\n    CLOSED: \"closed\" + EVENT_KEY,\n    CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY\n  };\n  var ClassName = {\n    ALERT: 'alert',\n    FADE: 'fade',\n    SHOW: 'show'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Alert =\n  /*#__PURE__*/\n  function () {\n    function Alert(element) {\n      this._element = element;\n    } // Getters\n\n\n    var _proto = Alert.prototype;\n\n    // Public\n    _proto.close = function close(element) {\n      var rootElement = this._element;\n\n      if (element) {\n        rootElement = this._getRootElement(element);\n      }\n\n      var customEvent = this._triggerCloseEvent(rootElement);\n\n      if (customEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      this._removeElement(rootElement);\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY);\n      this._element = null;\n    } // Private\n    ;\n\n    _proto._getRootElement = function _getRootElement(element) {\n      var selector = Util.getSelectorFromElement(element);\n      var parent = false;\n\n      if (selector) {\n        parent = document.querySelector(selector);\n      }\n\n      if (!parent) {\n        parent = $(element).closest(\".\" + ClassName.ALERT)[0];\n      }\n\n      return parent;\n    };\n\n    _proto._triggerCloseEvent = function _triggerCloseEvent(element) {\n      var closeEvent = $.Event(Event.CLOSE);\n      $(element).trigger(closeEvent);\n      return closeEvent;\n    };\n\n    _proto._removeElement = function _removeElement(element) {\n      var _this = this;\n\n      $(element).removeClass(ClassName.SHOW);\n\n      if (!$(element).hasClass(ClassName.FADE)) {\n        this._destroyElement(element);\n\n        return;\n      }\n\n      var transitionDuration = Util.getTransitionDurationFromElement(element);\n      $(element).one(Util.TRANSITION_END, function (event) {\n        return _this._destroyElement(element, event);\n      }).emulateTransitionEnd(transitionDuration);\n    };\n\n    _proto._destroyElement = function _destroyElement(element) {\n      $(element).detach().trigger(Event.CLOSED).remove();\n    } // Static\n    ;\n\n    Alert._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $element = $(this);\n        var data = $element.data(DATA_KEY);\n\n        if (!data) {\n          data = new Alert(this);\n          $element.data(DATA_KEY, data);\n        }\n\n        if (config === 'close') {\n          data[config](this);\n        }\n      });\n    };\n\n    Alert._handleDismiss = function _handleDismiss(alertInstance) {\n      return function (event) {\n        if (event) {\n          event.preventDefault();\n        }\n\n        alertInstance.close(this);\n      };\n    };\n\n    _createClass(Alert, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION;\n      }\n    }]);\n\n    return Alert;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert()));\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME] = Alert._jQueryInterface;\n  $.fn[NAME].Constructor = Alert;\n\n  $.fn[NAME].noConflict = function () {\n    $.fn[NAME] = JQUERY_NO_CONFLICT;\n    return Alert._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$1 = 'button';\n  var VERSION$1 = '4.3.1';\n  var DATA_KEY$1 = 'bs.button';\n  var EVENT_KEY$1 = \".\" + DATA_KEY$1;\n  var DATA_API_KEY$1 = '.data-api';\n  var JQUERY_NO_CONFLICT$1 = $.fn[NAME$1];\n  var ClassName$1 = {\n    ACTIVE: 'active',\n    BUTTON: 'btn',\n    FOCUS: 'focus'\n  };\n  var Selector$1 = {\n    DATA_TOGGLE_CARROT: '[data-toggle^=\"button\"]',\n    DATA_TOGGLE: '[data-toggle=\"buttons\"]',\n    INPUT: 'input:not([type=\"hidden\"])',\n    ACTIVE: '.active',\n    BUTTON: '.btn'\n  };\n  var Event$1 = {\n    CLICK_DATA_API: \"click\" + EVENT_KEY$1 + DATA_API_KEY$1,\n    FOCUS_BLUR_DATA_API: \"focus\" + EVENT_KEY$1 + DATA_API_KEY$1 + \" \" + (\"blur\" + EVENT_KEY$1 + DATA_API_KEY$1)\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Button =\n  /*#__PURE__*/\n  function () {\n    function Button(element) {\n      this._element = element;\n    } // Getters\n\n\n    var _proto = Button.prototype;\n\n    // Public\n    _proto.toggle = function toggle() {\n      var triggerChangeEvent = true;\n      var addAriaPressed = true;\n      var rootElement = $(this._element).closest(Selector$1.DATA_TOGGLE)[0];\n\n      if (rootElement) {\n        var input = this._element.querySelector(Selector$1.INPUT);\n\n        if (input) {\n          if (input.type === 'radio') {\n            if (input.checked && this._element.classList.contains(ClassName$1.ACTIVE)) {\n              triggerChangeEvent = false;\n            } else {\n              var activeElement = rootElement.querySelector(Selector$1.ACTIVE);\n\n              if (activeElement) {\n                $(activeElement).removeClass(ClassName$1.ACTIVE);\n              }\n            }\n          }\n\n          if (triggerChangeEvent) {\n            if (input.hasAttribute('disabled') || rootElement.hasAttribute('disabled') || input.classList.contains('disabled') || rootElement.classList.contains('disabled')) {\n              return;\n            }\n\n            input.checked = !this._element.classList.contains(ClassName$1.ACTIVE);\n            $(input).trigger('change');\n          }\n\n          input.focus();\n          addAriaPressed = false;\n        }\n      }\n\n      if (addAriaPressed) {\n        this._element.setAttribute('aria-pressed', !this._element.classList.contains(ClassName$1.ACTIVE));\n      }\n\n      if (triggerChangeEvent) {\n        $(this._element).toggleClass(ClassName$1.ACTIVE);\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$1);\n      this._element = null;\n    } // Static\n    ;\n\n    Button._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$1);\n\n        if (!data) {\n          data = new Button(this);\n          $(this).data(DATA_KEY$1, data);\n        }\n\n        if (config === 'toggle') {\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Button, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$1;\n      }\n    }]);\n\n    return Button;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$1.CLICK_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {\n    event.preventDefault();\n    var button = event.target;\n\n    if (!$(button).hasClass(ClassName$1.BUTTON)) {\n      button = $(button).closest(Selector$1.BUTTON);\n    }\n\n    Button._jQueryInterface.call($(button), 'toggle');\n  }).on(Event$1.FOCUS_BLUR_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {\n    var button = $(event.target).closest(Selector$1.BUTTON)[0];\n    $(button).toggleClass(ClassName$1.FOCUS, /^focus(in)?$/.test(event.type));\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$1] = Button._jQueryInterface;\n  $.fn[NAME$1].Constructor = Button;\n\n  $.fn[NAME$1].noConflict = function () {\n    $.fn[NAME$1] = JQUERY_NO_CONFLICT$1;\n    return Button._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$2 = 'carousel';\n  var VERSION$2 = '4.3.1';\n  var DATA_KEY$2 = 'bs.carousel';\n  var EVENT_KEY$2 = \".\" + DATA_KEY$2;\n  var DATA_API_KEY$2 = '.data-api';\n  var JQUERY_NO_CONFLICT$2 = $.fn[NAME$2];\n  var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key\n\n  var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key\n\n  var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\n\n  var SWIPE_THRESHOLD = 40;\n  var Default = {\n    interval: 5000,\n    keyboard: true,\n    slide: false,\n    pause: 'hover',\n    wrap: true,\n    touch: true\n  };\n  var DefaultType = {\n    interval: '(number|boolean)',\n    keyboard: 'boolean',\n    slide: '(boolean|string)',\n    pause: '(string|boolean)',\n    wrap: 'boolean',\n    touch: 'boolean'\n  };\n  var Direction = {\n    NEXT: 'next',\n    PREV: 'prev',\n    LEFT: 'left',\n    RIGHT: 'right'\n  };\n  var Event$2 = {\n    SLIDE: \"slide\" + EVENT_KEY$2,\n    SLID: \"slid\" + EVENT_KEY$2,\n    KEYDOWN: \"keydown\" + EVENT_KEY$2,\n    MOUSEENTER: \"mouseenter\" + EVENT_KEY$2,\n    MOUSELEAVE: \"mouseleave\" + EVENT_KEY$2,\n    TOUCHSTART: \"touchstart\" + EVENT_KEY$2,\n    TOUCHMOVE: \"touchmove\" + EVENT_KEY$2,\n    TOUCHEND: \"touchend\" + EVENT_KEY$2,\n    POINTERDOWN: \"pointerdown\" + EVENT_KEY$2,\n    POINTERUP: \"pointerup\" + EVENT_KEY$2,\n    DRAG_START: \"dragstart\" + EVENT_KEY$2,\n    LOAD_DATA_API: \"load\" + EVENT_KEY$2 + DATA_API_KEY$2,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$2 + DATA_API_KEY$2\n  };\n  var ClassName$2 = {\n    CAROUSEL: 'carousel',\n    ACTIVE: 'active',\n    SLIDE: 'slide',\n    RIGHT: 'carousel-item-right',\n    LEFT: 'carousel-item-left',\n    NEXT: 'carousel-item-next',\n    PREV: 'carousel-item-prev',\n    ITEM: 'carousel-item',\n    POINTER_EVENT: 'pointer-event'\n  };\n  var Selector$2 = {\n    ACTIVE: '.active',\n    ACTIVE_ITEM: '.active.carousel-item',\n    ITEM: '.carousel-item',\n    ITEM_IMG: '.carousel-item img',\n    NEXT_PREV: '.carousel-item-next, .carousel-item-prev',\n    INDICATORS: '.carousel-indicators',\n    DATA_SLIDE: '[data-slide], [data-slide-to]',\n    DATA_RIDE: '[data-ride=\"carousel\"]'\n  };\n  var PointerType = {\n    TOUCH: 'touch',\n    PEN: 'pen'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Carousel =\n  /*#__PURE__*/\n  function () {\n    function Carousel(element, config) {\n      this._items = null;\n      this._interval = null;\n      this._activeElement = null;\n      this._isPaused = false;\n      this._isSliding = false;\n      this.touchTimeout = null;\n      this.touchStartX = 0;\n      this.touchDeltaX = 0;\n      this._config = this._getConfig(config);\n      this._element = element;\n      this._indicatorsElement = this._element.querySelector(Selector$2.INDICATORS);\n      this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;\n      this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent);\n\n      this._addEventListeners();\n    } // Getters\n\n\n    var _proto = Carousel.prototype;\n\n    // Public\n    _proto.next = function next() {\n      if (!this._isSliding) {\n        this._slide(Direction.NEXT);\n      }\n    };\n\n    _proto.nextWhenVisible = function nextWhenVisible() {\n      // Don't call next when the page isn't visible\n      // or the carousel or its parent isn't visible\n      if (!document.hidden && $(this._element).is(':visible') && $(this._element).css('visibility') !== 'hidden') {\n        this.next();\n      }\n    };\n\n    _proto.prev = function prev() {\n      if (!this._isSliding) {\n        this._slide(Direction.PREV);\n      }\n    };\n\n    _proto.pause = function pause(event) {\n      if (!event) {\n        this._isPaused = true;\n      }\n\n      if (this._element.querySelector(Selector$2.NEXT_PREV)) {\n        Util.triggerTransitionEnd(this._element);\n        this.cycle(true);\n      }\n\n      clearInterval(this._interval);\n      this._interval = null;\n    };\n\n    _proto.cycle = function cycle(event) {\n      if (!event) {\n        this._isPaused = false;\n      }\n\n      if (this._interval) {\n        clearInterval(this._interval);\n        this._interval = null;\n      }\n\n      if (this._config.interval && !this._isPaused) {\n        this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);\n      }\n    };\n\n    _proto.to = function to(index) {\n      var _this = this;\n\n      this._activeElement = this._element.querySelector(Selector$2.ACTIVE_ITEM);\n\n      var activeIndex = this._getItemIndex(this._activeElement);\n\n      if (index > this._items.length - 1 || index < 0) {\n        return;\n      }\n\n      if (this._isSliding) {\n        $(this._element).one(Event$2.SLID, function () {\n          return _this.to(index);\n        });\n        return;\n      }\n\n      if (activeIndex === index) {\n        this.pause();\n        this.cycle();\n        return;\n      }\n\n      var direction = index > activeIndex ? Direction.NEXT : Direction.PREV;\n\n      this._slide(direction, this._items[index]);\n    };\n\n    _proto.dispose = function dispose() {\n      $(this._element).off(EVENT_KEY$2);\n      $.removeData(this._element, DATA_KEY$2);\n      this._items = null;\n      this._config = null;\n      this._element = null;\n      this._interval = null;\n      this._isPaused = null;\n      this._isSliding = null;\n      this._activeElement = null;\n      this._indicatorsElement = null;\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default, config);\n      Util.typeCheckConfig(NAME$2, config, DefaultType);\n      return config;\n    };\n\n    _proto._handleSwipe = function _handleSwipe() {\n      var absDeltax = Math.abs(this.touchDeltaX);\n\n      if (absDeltax <= SWIPE_THRESHOLD) {\n        return;\n      }\n\n      var direction = absDeltax / this.touchDeltaX; // swipe left\n\n      if (direction > 0) {\n        this.prev();\n      } // swipe right\n\n\n      if (direction < 0) {\n        this.next();\n      }\n    };\n\n    _proto._addEventListeners = function _addEventListeners() {\n      var _this2 = this;\n\n      if (this._config.keyboard) {\n        $(this._element).on(Event$2.KEYDOWN, function (event) {\n          return _this2._keydown(event);\n        });\n      }\n\n      if (this._config.pause === 'hover') {\n        $(this._element).on(Event$2.MOUSEENTER, function (event) {\n          return _this2.pause(event);\n        }).on(Event$2.MOUSELEAVE, function (event) {\n          return _this2.cycle(event);\n        });\n      }\n\n      if (this._config.touch) {\n        this._addTouchEventListeners();\n      }\n    };\n\n    _proto._addTouchEventListeners = function _addTouchEventListeners() {\n      var _this3 = this;\n\n      if (!this._touchSupported) {\n        return;\n      }\n\n      var start = function start(event) {\n        if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n          _this3.touchStartX = event.originalEvent.clientX;\n        } else if (!_this3._pointerEvent) {\n          _this3.touchStartX = event.originalEvent.touches[0].clientX;\n        }\n      };\n\n      var move = function move(event) {\n        // ensure swiping with one touch and not pinching\n        if (event.originalEvent.touches && event.originalEvent.touches.length > 1) {\n          _this3.touchDeltaX = 0;\n        } else {\n          _this3.touchDeltaX = event.originalEvent.touches[0].clientX - _this3.touchStartX;\n        }\n      };\n\n      var end = function end(event) {\n        if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n          _this3.touchDeltaX = event.originalEvent.clientX - _this3.touchStartX;\n        }\n\n        _this3._handleSwipe();\n\n        if (_this3._config.pause === 'hover') {\n          // If it's a touch-enabled device, mouseenter/leave are fired as\n          // part of the mouse compatibility events on first tap - the carousel\n          // would stop cycling until user tapped out of it;\n          // here, we listen for touchend, explicitly pause the carousel\n          // (as if it's the second time we tap on it, mouseenter compat event\n          // is NOT fired) and after a timeout (to allow for mouse compatibility\n          // events to fire) we explicitly restart cycling\n          _this3.pause();\n\n          if (_this3.touchTimeout) {\n            clearTimeout(_this3.touchTimeout);\n          }\n\n          _this3.touchTimeout = setTimeout(function (event) {\n            return _this3.cycle(event);\n          }, TOUCHEVENT_COMPAT_WAIT + _this3._config.interval);\n        }\n      };\n\n      $(this._element.querySelectorAll(Selector$2.ITEM_IMG)).on(Event$2.DRAG_START, function (e) {\n        return e.preventDefault();\n      });\n\n      if (this._pointerEvent) {\n        $(this._element).on(Event$2.POINTERDOWN, function (event) {\n          return start(event);\n        });\n        $(this._element).on(Event$2.POINTERUP, function (event) {\n          return end(event);\n        });\n\n        this._element.classList.add(ClassName$2.POINTER_EVENT);\n      } else {\n        $(this._element).on(Event$2.TOUCHSTART, function (event) {\n          return start(event);\n        });\n        $(this._element).on(Event$2.TOUCHMOVE, function (event) {\n          return move(event);\n        });\n        $(this._element).on(Event$2.TOUCHEND, function (event) {\n          return end(event);\n        });\n      }\n    };\n\n    _proto._keydown = function _keydown(event) {\n      if (/input|textarea/i.test(event.target.tagName)) {\n        return;\n      }\n\n      switch (event.which) {\n        case ARROW_LEFT_KEYCODE:\n          event.preventDefault();\n          this.prev();\n          break;\n\n        case ARROW_RIGHT_KEYCODE:\n          event.preventDefault();\n          this.next();\n          break;\n\n        default:\n      }\n    };\n\n    _proto._getItemIndex = function _getItemIndex(element) {\n      this._items = element && element.parentNode ? [].slice.call(element.parentNode.querySelectorAll(Selector$2.ITEM)) : [];\n      return this._items.indexOf(element);\n    };\n\n    _proto._getItemByDirection = function _getItemByDirection(direction, activeElement) {\n      var isNextDirection = direction === Direction.NEXT;\n      var isPrevDirection = direction === Direction.PREV;\n\n      var activeIndex = this._getItemIndex(activeElement);\n\n      var lastItemIndex = this._items.length - 1;\n      var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex;\n\n      if (isGoingToWrap && !this._config.wrap) {\n        return activeElement;\n      }\n\n      var delta = direction === Direction.PREV ? -1 : 1;\n      var itemIndex = (activeIndex + delta) % this._items.length;\n      return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];\n    };\n\n    _proto._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) {\n      var targetIndex = this._getItemIndex(relatedTarget);\n\n      var fromIndex = this._getItemIndex(this._element.querySelector(Selector$2.ACTIVE_ITEM));\n\n      var slideEvent = $.Event(Event$2.SLIDE, {\n        relatedTarget: relatedTarget,\n        direction: eventDirectionName,\n        from: fromIndex,\n        to: targetIndex\n      });\n      $(this._element).trigger(slideEvent);\n      return slideEvent;\n    };\n\n    _proto._setActiveIndicatorElement = function _setActiveIndicatorElement(element) {\n      if (this._indicatorsElement) {\n        var indicators = [].slice.call(this._indicatorsElement.querySelectorAll(Selector$2.ACTIVE));\n        $(indicators).removeClass(ClassName$2.ACTIVE);\n\n        var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)];\n\n        if (nextIndicator) {\n          $(nextIndicator).addClass(ClassName$2.ACTIVE);\n        }\n      }\n    };\n\n    _proto._slide = function _slide(direction, element) {\n      var _this4 = this;\n\n      var activeElement = this._element.querySelector(Selector$2.ACTIVE_ITEM);\n\n      var activeElementIndex = this._getItemIndex(activeElement);\n\n      var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement);\n\n      var nextElementIndex = this._getItemIndex(nextElement);\n\n      var isCycling = Boolean(this._interval);\n      var directionalClassName;\n      var orderClassName;\n      var eventDirectionName;\n\n      if (direction === Direction.NEXT) {\n        directionalClassName = ClassName$2.LEFT;\n        orderClassName = ClassName$2.NEXT;\n        eventDirectionName = Direction.LEFT;\n      } else {\n        directionalClassName = ClassName$2.RIGHT;\n        orderClassName = ClassName$2.PREV;\n        eventDirectionName = Direction.RIGHT;\n      }\n\n      if (nextElement && $(nextElement).hasClass(ClassName$2.ACTIVE)) {\n        this._isSliding = false;\n        return;\n      }\n\n      var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);\n\n      if (slideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      if (!activeElement || !nextElement) {\n        // Some weirdness is happening, so we bail\n        return;\n      }\n\n      this._isSliding = true;\n\n      if (isCycling) {\n        this.pause();\n      }\n\n      this._setActiveIndicatorElement(nextElement);\n\n      var slidEvent = $.Event(Event$2.SLID, {\n        relatedTarget: nextElement,\n        direction: eventDirectionName,\n        from: activeElementIndex,\n        to: nextElementIndex\n      });\n\n      if ($(this._element).hasClass(ClassName$2.SLIDE)) {\n        $(nextElement).addClass(orderClassName);\n        Util.reflow(nextElement);\n        $(activeElement).addClass(directionalClassName);\n        $(nextElement).addClass(directionalClassName);\n        var nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10);\n\n        if (nextElementInterval) {\n          this._config.defaultInterval = this._config.defaultInterval || this._config.interval;\n          this._config.interval = nextElementInterval;\n        } else {\n          this._config.interval = this._config.defaultInterval || this._config.interval;\n        }\n\n        var transitionDuration = Util.getTransitionDurationFromElement(activeElement);\n        $(activeElement).one(Util.TRANSITION_END, function () {\n          $(nextElement).removeClass(directionalClassName + \" \" + orderClassName).addClass(ClassName$2.ACTIVE);\n          $(activeElement).removeClass(ClassName$2.ACTIVE + \" \" + orderClassName + \" \" + directionalClassName);\n          _this4._isSliding = false;\n          setTimeout(function () {\n            return $(_this4._element).trigger(slidEvent);\n          }, 0);\n        }).emulateTransitionEnd(transitionDuration);\n      } else {\n        $(activeElement).removeClass(ClassName$2.ACTIVE);\n        $(nextElement).addClass(ClassName$2.ACTIVE);\n        this._isSliding = false;\n        $(this._element).trigger(slidEvent);\n      }\n\n      if (isCycling) {\n        this.cycle();\n      }\n    } // Static\n    ;\n\n    Carousel._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$2);\n\n        var _config = _objectSpread({}, Default, $(this).data());\n\n        if (typeof config === 'object') {\n          _config = _objectSpread({}, _config, config);\n        }\n\n        var action = typeof config === 'string' ? config : _config.slide;\n\n        if (!data) {\n          data = new Carousel(this, _config);\n          $(this).data(DATA_KEY$2, data);\n        }\n\n        if (typeof config === 'number') {\n          data.to(config);\n        } else if (typeof action === 'string') {\n          if (typeof data[action] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + action + \"\\\"\");\n          }\n\n          data[action]();\n        } else if (_config.interval && _config.ride) {\n          data.pause();\n          data.cycle();\n        }\n      });\n    };\n\n    Carousel._dataApiClickHandler = function _dataApiClickHandler(event) {\n      var selector = Util.getSelectorFromElement(this);\n\n      if (!selector) {\n        return;\n      }\n\n      var target = $(selector)[0];\n\n      if (!target || !$(target).hasClass(ClassName$2.CAROUSEL)) {\n        return;\n      }\n\n      var config = _objectSpread({}, $(target).data(), $(this).data());\n\n      var slideIndex = this.getAttribute('data-slide-to');\n\n      if (slideIndex) {\n        config.interval = false;\n      }\n\n      Carousel._jQueryInterface.call($(target), config);\n\n      if (slideIndex) {\n        $(target).data(DATA_KEY$2).to(slideIndex);\n      }\n\n      event.preventDefault();\n    };\n\n    _createClass(Carousel, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$2;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default;\n      }\n    }]);\n\n    return Carousel;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$2.CLICK_DATA_API, Selector$2.DATA_SLIDE, Carousel._dataApiClickHandler);\n  $(window).on(Event$2.LOAD_DATA_API, function () {\n    var carousels = [].slice.call(document.querySelectorAll(Selector$2.DATA_RIDE));\n\n    for (var i = 0, len = carousels.length; i < len; i++) {\n      var $carousel = $(carousels[i]);\n\n      Carousel._jQueryInterface.call($carousel, $carousel.data());\n    }\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$2] = Carousel._jQueryInterface;\n  $.fn[NAME$2].Constructor = Carousel;\n\n  $.fn[NAME$2].noConflict = function () {\n    $.fn[NAME$2] = JQUERY_NO_CONFLICT$2;\n    return Carousel._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$3 = 'collapse';\n  var VERSION$3 = '4.3.1';\n  var DATA_KEY$3 = 'bs.collapse';\n  var EVENT_KEY$3 = \".\" + DATA_KEY$3;\n  var DATA_API_KEY$3 = '.data-api';\n  var JQUERY_NO_CONFLICT$3 = $.fn[NAME$3];\n  var Default$1 = {\n    toggle: true,\n    parent: ''\n  };\n  var DefaultType$1 = {\n    toggle: 'boolean',\n    parent: '(string|element)'\n  };\n  var Event$3 = {\n    SHOW: \"show\" + EVENT_KEY$3,\n    SHOWN: \"shown\" + EVENT_KEY$3,\n    HIDE: \"hide\" + EVENT_KEY$3,\n    HIDDEN: \"hidden\" + EVENT_KEY$3,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$3 + DATA_API_KEY$3\n  };\n  var ClassName$3 = {\n    SHOW: 'show',\n    COLLAPSE: 'collapse',\n    COLLAPSING: 'collapsing',\n    COLLAPSED: 'collapsed'\n  };\n  var Dimension = {\n    WIDTH: 'width',\n    HEIGHT: 'height'\n  };\n  var Selector$3 = {\n    ACTIVES: '.show, .collapsing',\n    DATA_TOGGLE: '[data-toggle=\"collapse\"]'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Collapse =\n  /*#__PURE__*/\n  function () {\n    function Collapse(element, config) {\n      this._isTransitioning = false;\n      this._element = element;\n      this._config = this._getConfig(config);\n      this._triggerArray = [].slice.call(document.querySelectorAll(\"[data-toggle=\\\"collapse\\\"][href=\\\"#\" + element.id + \"\\\"],\" + (\"[data-toggle=\\\"collapse\\\"][data-target=\\\"#\" + element.id + \"\\\"]\")));\n      var toggleList = [].slice.call(document.querySelectorAll(Selector$3.DATA_TOGGLE));\n\n      for (var i = 0, len = toggleList.length; i < len; i++) {\n        var elem = toggleList[i];\n        var selector = Util.getSelectorFromElement(elem);\n        var filterElement = [].slice.call(document.querySelectorAll(selector)).filter(function (foundElem) {\n          return foundElem === element;\n        });\n\n        if (selector !== null && filterElement.length > 0) {\n          this._selector = selector;\n\n          this._triggerArray.push(elem);\n        }\n      }\n\n      this._parent = this._config.parent ? this._getParent() : null;\n\n      if (!this._config.parent) {\n        this._addAriaAndCollapsedClass(this._element, this._triggerArray);\n      }\n\n      if (this._config.toggle) {\n        this.toggle();\n      }\n    } // Getters\n\n\n    var _proto = Collapse.prototype;\n\n    // Public\n    _proto.toggle = function toggle() {\n      if ($(this._element).hasClass(ClassName$3.SHOW)) {\n        this.hide();\n      } else {\n        this.show();\n      }\n    };\n\n    _proto.show = function show() {\n      var _this = this;\n\n      if (this._isTransitioning || $(this._element).hasClass(ClassName$3.SHOW)) {\n        return;\n      }\n\n      var actives;\n      var activesData;\n\n      if (this._parent) {\n        actives = [].slice.call(this._parent.querySelectorAll(Selector$3.ACTIVES)).filter(function (elem) {\n          if (typeof _this._config.parent === 'string') {\n            return elem.getAttribute('data-parent') === _this._config.parent;\n          }\n\n          return elem.classList.contains(ClassName$3.COLLAPSE);\n        });\n\n        if (actives.length === 0) {\n          actives = null;\n        }\n      }\n\n      if (actives) {\n        activesData = $(actives).not(this._selector).data(DATA_KEY$3);\n\n        if (activesData && activesData._isTransitioning) {\n          return;\n        }\n      }\n\n      var startEvent = $.Event(Event$3.SHOW);\n      $(this._element).trigger(startEvent);\n\n      if (startEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      if (actives) {\n        Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide');\n\n        if (!activesData) {\n          $(actives).data(DATA_KEY$3, null);\n        }\n      }\n\n      var dimension = this._getDimension();\n\n      $(this._element).removeClass(ClassName$3.COLLAPSE).addClass(ClassName$3.COLLAPSING);\n      this._element.style[dimension] = 0;\n\n      if (this._triggerArray.length) {\n        $(this._triggerArray).removeClass(ClassName$3.COLLAPSED).attr('aria-expanded', true);\n      }\n\n      this.setTransitioning(true);\n\n      var complete = function complete() {\n        $(_this._element).removeClass(ClassName$3.COLLAPSING).addClass(ClassName$3.COLLAPSE).addClass(ClassName$3.SHOW);\n        _this._element.style[dimension] = '';\n\n        _this.setTransitioning(false);\n\n        $(_this._element).trigger(Event$3.SHOWN);\n      };\n\n      var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\n      var scrollSize = \"scroll\" + capitalizedDimension;\n      var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n      $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      this._element.style[dimension] = this._element[scrollSize] + \"px\";\n    };\n\n    _proto.hide = function hide() {\n      var _this2 = this;\n\n      if (this._isTransitioning || !$(this._element).hasClass(ClassName$3.SHOW)) {\n        return;\n      }\n\n      var startEvent = $.Event(Event$3.HIDE);\n      $(this._element).trigger(startEvent);\n\n      if (startEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      var dimension = this._getDimension();\n\n      this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + \"px\";\n      Util.reflow(this._element);\n      $(this._element).addClass(ClassName$3.COLLAPSING).removeClass(ClassName$3.COLLAPSE).removeClass(ClassName$3.SHOW);\n      var triggerArrayLength = this._triggerArray.length;\n\n      if (triggerArrayLength > 0) {\n        for (var i = 0; i < triggerArrayLength; i++) {\n          var trigger = this._triggerArray[i];\n          var selector = Util.getSelectorFromElement(trigger);\n\n          if (selector !== null) {\n            var $elem = $([].slice.call(document.querySelectorAll(selector)));\n\n            if (!$elem.hasClass(ClassName$3.SHOW)) {\n              $(trigger).addClass(ClassName$3.COLLAPSED).attr('aria-expanded', false);\n            }\n          }\n        }\n      }\n\n      this.setTransitioning(true);\n\n      var complete = function complete() {\n        _this2.setTransitioning(false);\n\n        $(_this2._element).removeClass(ClassName$3.COLLAPSING).addClass(ClassName$3.COLLAPSE).trigger(Event$3.HIDDEN);\n      };\n\n      this._element.style[dimension] = '';\n      var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n      $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n    };\n\n    _proto.setTransitioning = function setTransitioning(isTransitioning) {\n      this._isTransitioning = isTransitioning;\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$3);\n      this._config = null;\n      this._parent = null;\n      this._element = null;\n      this._triggerArray = null;\n      this._isTransitioning = null;\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default$1, config);\n      config.toggle = Boolean(config.toggle); // Coerce string values\n\n      Util.typeCheckConfig(NAME$3, config, DefaultType$1);\n      return config;\n    };\n\n    _proto._getDimension = function _getDimension() {\n      var hasWidth = $(this._element).hasClass(Dimension.WIDTH);\n      return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;\n    };\n\n    _proto._getParent = function _getParent() {\n      var _this3 = this;\n\n      var parent;\n\n      if (Util.isElement(this._config.parent)) {\n        parent = this._config.parent; // It's a jQuery object\n\n        if (typeof this._config.parent.jquery !== 'undefined') {\n          parent = this._config.parent[0];\n        }\n      } else {\n        parent = document.querySelector(this._config.parent);\n      }\n\n      var selector = \"[data-toggle=\\\"collapse\\\"][data-parent=\\\"\" + this._config.parent + \"\\\"]\";\n      var children = [].slice.call(parent.querySelectorAll(selector));\n      $(children).each(function (i, element) {\n        _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);\n      });\n      return parent;\n    };\n\n    _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {\n      var isOpen = $(element).hasClass(ClassName$3.SHOW);\n\n      if (triggerArray.length) {\n        $(triggerArray).toggleClass(ClassName$3.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);\n      }\n    } // Static\n    ;\n\n    Collapse._getTargetFromElement = function _getTargetFromElement(element) {\n      var selector = Util.getSelectorFromElement(element);\n      return selector ? document.querySelector(selector) : null;\n    };\n\n    Collapse._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $this = $(this);\n        var data = $this.data(DATA_KEY$3);\n\n        var _config = _objectSpread({}, Default$1, $this.data(), typeof config === 'object' && config ? config : {});\n\n        if (!data && _config.toggle && /show|hide/.test(config)) {\n          _config.toggle = false;\n        }\n\n        if (!data) {\n          data = new Collapse(this, _config);\n          $this.data(DATA_KEY$3, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Collapse, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$3;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$1;\n      }\n    }]);\n\n    return Collapse;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$3.CLICK_DATA_API, Selector$3.DATA_TOGGLE, function (event) {\n    // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n    if (event.currentTarget.tagName === 'A') {\n      event.preventDefault();\n    }\n\n    var $trigger = $(this);\n    var selector = Util.getSelectorFromElement(this);\n    var selectors = [].slice.call(document.querySelectorAll(selector));\n    $(selectors).each(function () {\n      var $target = $(this);\n      var data = $target.data(DATA_KEY$3);\n      var config = data ? 'toggle' : $trigger.data();\n\n      Collapse._jQueryInterface.call($target, config);\n    });\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$3] = Collapse._jQueryInterface;\n  $.fn[NAME$3].Constructor = Collapse;\n\n  $.fn[NAME$3].noConflict = function () {\n    $.fn[NAME$3] = JQUERY_NO_CONFLICT$3;\n    return Collapse._jQueryInterface;\n  };\n\n  /**!\n   * @fileOverview Kickass library to create and place poppers near their reference elements.\n   * @version 1.14.7\n   * @license\n   * Copyright (c) 2016 Federico Zivolo and contributors\n   *\n   * Permission is hereby granted, free of charge, to any person obtaining a copy\n   * of this software and associated documentation files (the \"Software\"), to deal\n   * in the Software without restriction, including without limitation the rights\n   * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n   * copies of the Software, and to permit persons to whom the Software is\n   * furnished to do so, subject to the following conditions:\n   *\n   * The above copyright notice and this permission notice shall be included in all\n   * copies or substantial portions of the Software.\n   *\n   * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n   * SOFTWARE.\n   */\n  var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';\n\n  var longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];\n  var timeoutDuration = 0;\n  for (var i = 0; i < longerTimeoutBrowsers.length; i += 1) {\n    if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {\n      timeoutDuration = 1;\n      break;\n    }\n  }\n\n  function microtaskDebounce(fn) {\n    var called = false;\n    return function () {\n      if (called) {\n        return;\n      }\n      called = true;\n      window.Promise.resolve().then(function () {\n        called = false;\n        fn();\n      });\n    };\n  }\n\n  function taskDebounce(fn) {\n    var scheduled = false;\n    return function () {\n      if (!scheduled) {\n        scheduled = true;\n        setTimeout(function () {\n          scheduled = false;\n          fn();\n        }, timeoutDuration);\n      }\n    };\n  }\n\n  var supportsMicroTasks = isBrowser && window.Promise;\n\n  /**\n  * Create a debounced version of a method, that's asynchronously deferred\n  * but called in the minimum time possible.\n  *\n  * @method\n  * @memberof Popper.Utils\n  * @argument {Function} fn\n  * @returns {Function}\n  */\n  var debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce;\n\n  /**\n   * Check if the given variable is a function\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Any} functionToCheck - variable to check\n   * @returns {Boolean} answer to: is a function?\n   */\n  function isFunction(functionToCheck) {\n    var getType = {};\n    return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';\n  }\n\n  /**\n   * Get CSS computed property of the given element\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Eement} element\n   * @argument {String} property\n   */\n  function getStyleComputedProperty(element, property) {\n    if (element.nodeType !== 1) {\n      return [];\n    }\n    // NOTE: 1 DOM access here\n    var window = element.ownerDocument.defaultView;\n    var css = window.getComputedStyle(element, null);\n    return property ? css[property] : css;\n  }\n\n  /**\n   * Returns the parentNode or the host of the element\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element\n   * @returns {Element} parent\n   */\n  function getParentNode(element) {\n    if (element.nodeName === 'HTML') {\n      return element;\n    }\n    return element.parentNode || element.host;\n  }\n\n  /**\n   * Returns the scrolling parent of the given element\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element\n   * @returns {Element} scroll parent\n   */\n  function getScrollParent(element) {\n    // Return body, `getScroll` will take care to get the correct `scrollTop` from it\n    if (!element) {\n      return document.body;\n    }\n\n    switch (element.nodeName) {\n      case 'HTML':\n      case 'BODY':\n        return element.ownerDocument.body;\n      case '#document':\n        return element.body;\n    }\n\n    // Firefox want us to check `-x` and `-y` variations as well\n\n    var _getStyleComputedProp = getStyleComputedProperty(element),\n        overflow = _getStyleComputedProp.overflow,\n        overflowX = _getStyleComputedProp.overflowX,\n        overflowY = _getStyleComputedProp.overflowY;\n\n    if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {\n      return element;\n    }\n\n    return getScrollParent(getParentNode(element));\n  }\n\n  var isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode);\n  var isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent);\n\n  /**\n   * Determines if the browser is Internet Explorer\n   * @method\n   * @memberof Popper.Utils\n   * @param {Number} version to check\n   * @returns {Boolean} isIE\n   */\n  function isIE(version) {\n    if (version === 11) {\n      return isIE11;\n    }\n    if (version === 10) {\n      return isIE10;\n    }\n    return isIE11 || isIE10;\n  }\n\n  /**\n   * Returns the offset parent of the given element\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element\n   * @returns {Element} offset parent\n   */\n  function getOffsetParent(element) {\n    if (!element) {\n      return document.documentElement;\n    }\n\n    var noOffsetParent = isIE(10) ? document.body : null;\n\n    // NOTE: 1 DOM access here\n    var offsetParent = element.offsetParent || null;\n    // Skip hidden elements which don't have an offsetParent\n    while (offsetParent === noOffsetParent && element.nextElementSibling) {\n      offsetParent = (element = element.nextElementSibling).offsetParent;\n    }\n\n    var nodeName = offsetParent && offsetParent.nodeName;\n\n    if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {\n      return element ? element.ownerDocument.documentElement : document.documentElement;\n    }\n\n    // .offsetParent will return the closest TH, TD or TABLE in case\n    // no offsetParent is present, I hate this job...\n    if (['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') {\n      return getOffsetParent(offsetParent);\n    }\n\n    return offsetParent;\n  }\n\n  function isOffsetContainer(element) {\n    var nodeName = element.nodeName;\n\n    if (nodeName === 'BODY') {\n      return false;\n    }\n    return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element;\n  }\n\n  /**\n   * Finds the root node (document, shadowDOM root) of the given element\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} node\n   * @returns {Element} root node\n   */\n  function getRoot(node) {\n    if (node.parentNode !== null) {\n      return getRoot(node.parentNode);\n    }\n\n    return node;\n  }\n\n  /**\n   * Finds the offset parent common to the two provided nodes\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element1\n   * @argument {Element} element2\n   * @returns {Element} common offset parent\n   */\n  function findCommonOffsetParent(element1, element2) {\n    // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n    if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) {\n      return document.documentElement;\n    }\n\n    // Here we make sure to give as \"start\" the element that comes first in the DOM\n    var order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING;\n    var start = order ? element1 : element2;\n    var end = order ? element2 : element1;\n\n    // Get common ancestor container\n    var range = document.createRange();\n    range.setStart(start, 0);\n    range.setEnd(end, 0);\n    var commonAncestorContainer = range.commonAncestorContainer;\n\n    // Both nodes are inside #document\n\n    if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) {\n      if (isOffsetContainer(commonAncestorContainer)) {\n        return commonAncestorContainer;\n      }\n\n      return getOffsetParent(commonAncestorContainer);\n    }\n\n    // one of the nodes is inside shadowDOM, find which one\n    var element1root = getRoot(element1);\n    if (element1root.host) {\n      return findCommonOffsetParent(element1root.host, element2);\n    } else {\n      return findCommonOffsetParent(element1, getRoot(element2).host);\n    }\n  }\n\n  /**\n   * Gets the scroll value of the given element in the given side (top and left)\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element\n   * @argument {String} side `top` or `left`\n   * @returns {number} amount of scrolled pixels\n   */\n  function getScroll(element) {\n    var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top';\n\n    var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';\n    var nodeName = element.nodeName;\n\n    if (nodeName === 'BODY' || nodeName === 'HTML') {\n      var html = element.ownerDocument.documentElement;\n      var scrollingElement = element.ownerDocument.scrollingElement || html;\n      return scrollingElement[upperSide];\n    }\n\n    return element[upperSide];\n  }\n\n  /*\n   * Sum or subtract the element scroll values (left and top) from a given rect object\n   * @method\n   * @memberof Popper.Utils\n   * @param {Object} rect - Rect object you want to change\n   * @param {HTMLElement} element - The element from the function reads the scroll values\n   * @param {Boolean} subtract - set to true if you want to subtract the scroll values\n   * @return {Object} rect - The modifier rect object\n   */\n  function includeScroll(rect, element) {\n    var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n    var scrollTop = getScroll(element, 'top');\n    var scrollLeft = getScroll(element, 'left');\n    var modifier = subtract ? -1 : 1;\n    rect.top += scrollTop * modifier;\n    rect.bottom += scrollTop * modifier;\n    rect.left += scrollLeft * modifier;\n    rect.right += scrollLeft * modifier;\n    return rect;\n  }\n\n  /*\n   * Helper to detect borders of a given element\n   * @method\n   * @memberof Popper.Utils\n   * @param {CSSStyleDeclaration} styles\n   * Result of `getStyleComputedProperty` on the given element\n   * @param {String} axis - `x` or `y`\n   * @return {number} borders - The borders size of the given axis\n   */\n\n  function getBordersSize(styles, axis) {\n    var sideA = axis === 'x' ? 'Left' : 'Top';\n    var sideB = sideA === 'Left' ? 'Right' : 'Bottom';\n\n    return parseFloat(styles['border' + sideA + 'Width'], 10) + parseFloat(styles['border' + sideB + 'Width'], 10);\n  }\n\n  function getSize(axis, body, html, computedStyle) {\n    return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE(10) ? parseInt(html['offset' + axis]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')]) : 0);\n  }\n\n  function getWindowSizes(document) {\n    var body = document.body;\n    var html = document.documentElement;\n    var computedStyle = isIE(10) && getComputedStyle(html);\n\n    return {\n      height: getSize('Height', body, html, computedStyle),\n      width: getSize('Width', body, html, computedStyle)\n    };\n  }\n\n  var classCallCheck = function (instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  };\n\n  var createClass = function () {\n    function defineProperties(target, props) {\n      for (var i = 0; i < props.length; i++) {\n        var descriptor = props[i];\n        descriptor.enumerable = descriptor.enumerable || false;\n        descriptor.configurable = true;\n        if (\"value\" in descriptor) descriptor.writable = true;\n        Object.defineProperty(target, descriptor.key, descriptor);\n      }\n    }\n\n    return function (Constructor, protoProps, staticProps) {\n      if (protoProps) defineProperties(Constructor.prototype, protoProps);\n      if (staticProps) defineProperties(Constructor, staticProps);\n      return Constructor;\n    };\n  }();\n\n\n\n\n\n  var defineProperty = function (obj, key, value) {\n    if (key in obj) {\n      Object.defineProperty(obj, key, {\n        value: value,\n        enumerable: true,\n        configurable: true,\n        writable: true\n      });\n    } else {\n      obj[key] = value;\n    }\n\n    return obj;\n  };\n\n  var _extends = Object.assign || function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n\n    return target;\n  };\n\n  /**\n   * Given element offsets, generate an output similar to getBoundingClientRect\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Object} offsets\n   * @returns {Object} ClientRect like output\n   */\n  function getClientRect(offsets) {\n    return _extends({}, offsets, {\n      right: offsets.left + offsets.width,\n      bottom: offsets.top + offsets.height\n    });\n  }\n\n  /**\n   * Get bounding client rect of given element\n   * @method\n   * @memberof Popper.Utils\n   * @param {HTMLElement} element\n   * @return {Object} client rect\n   */\n  function getBoundingClientRect(element) {\n    var rect = {};\n\n    // IE10 10 FIX: Please, don't ask, the element isn't\n    // considered in DOM in some circumstances...\n    // This isn't reproducible in IE10 compatibility mode of IE11\n    try {\n      if (isIE(10)) {\n        rect = element.getBoundingClientRect();\n        var scrollTop = getScroll(element, 'top');\n        var scrollLeft = getScroll(element, 'left');\n        rect.top += scrollTop;\n        rect.left += scrollLeft;\n        rect.bottom += scrollTop;\n        rect.right += scrollLeft;\n      } else {\n        rect = element.getBoundingClientRect();\n      }\n    } catch (e) {}\n\n    var result = {\n      left: rect.left,\n      top: rect.top,\n      width: rect.right - rect.left,\n      height: rect.bottom - rect.top\n    };\n\n    // subtract scrollbar size from sizes\n    var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};\n    var width = sizes.width || element.clientWidth || result.right - result.left;\n    var height = sizes.height || element.clientHeight || result.bottom - result.top;\n\n    var horizScrollbar = element.offsetWidth - width;\n    var vertScrollbar = element.offsetHeight - height;\n\n    // if an hypothetical scrollbar is detected, we must be sure it's not a `border`\n    // we make this check conditional for performance reasons\n    if (horizScrollbar || vertScrollbar) {\n      var styles = getStyleComputedProperty(element);\n      horizScrollbar -= getBordersSize(styles, 'x');\n      vertScrollbar -= getBordersSize(styles, 'y');\n\n      result.width -= horizScrollbar;\n      result.height -= vertScrollbar;\n    }\n\n    return getClientRect(result);\n  }\n\n  function getOffsetRectRelativeToArbitraryNode(children, parent) {\n    var fixedPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n    var isIE10 = isIE(10);\n    var isHTML = parent.nodeName === 'HTML';\n    var childrenRect = getBoundingClientRect(children);\n    var parentRect = getBoundingClientRect(parent);\n    var scrollParent = getScrollParent(children);\n\n    var styles = getStyleComputedProperty(parent);\n    var borderTopWidth = parseFloat(styles.borderTopWidth, 10);\n    var borderLeftWidth = parseFloat(styles.borderLeftWidth, 10);\n\n    // In cases where the parent is fixed, we must ignore negative scroll in offset calc\n    if (fixedPosition && isHTML) {\n      parentRect.top = Math.max(parentRect.top, 0);\n      parentRect.left = Math.max(parentRect.left, 0);\n    }\n    var offsets = getClientRect({\n      top: childrenRect.top - parentRect.top - borderTopWidth,\n      left: childrenRect.left - parentRect.left - borderLeftWidth,\n      width: childrenRect.width,\n      height: childrenRect.height\n    });\n    offsets.marginTop = 0;\n    offsets.marginLeft = 0;\n\n    // Subtract margins of documentElement in case it's being used as parent\n    // we do this only on HTML because it's the only element that behaves\n    // differently when margins are applied to it. The margins are included in\n    // the box of the documentElement, in the other cases not.\n    if (!isIE10 && isHTML) {\n      var marginTop = parseFloat(styles.marginTop, 10);\n      var marginLeft = parseFloat(styles.marginLeft, 10);\n\n      offsets.top -= borderTopWidth - marginTop;\n      offsets.bottom -= borderTopWidth - marginTop;\n      offsets.left -= borderLeftWidth - marginLeft;\n      offsets.right -= borderLeftWidth - marginLeft;\n\n      // Attach marginTop and marginLeft because in some circumstances we may need them\n      offsets.marginTop = marginTop;\n      offsets.marginLeft = marginLeft;\n    }\n\n    if (isIE10 && !fixedPosition ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') {\n      offsets = includeScroll(offsets, parent);\n    }\n\n    return offsets;\n  }\n\n  function getViewportOffsetRectRelativeToArtbitraryNode(element) {\n    var excludeScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n    var html = element.ownerDocument.documentElement;\n    var relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html);\n    var width = Math.max(html.clientWidth, window.innerWidth || 0);\n    var height = Math.max(html.clientHeight, window.innerHeight || 0);\n\n    var scrollTop = !excludeScroll ? getScroll(html) : 0;\n    var scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0;\n\n    var offset = {\n      top: scrollTop - relativeOffset.top + relativeOffset.marginTop,\n      left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft,\n      width: width,\n      height: height\n    };\n\n    return getClientRect(offset);\n  }\n\n  /**\n   * Check if the given element is fixed or is inside a fixed parent\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element\n   * @argument {Element} customContainer\n   * @returns {Boolean} answer to \"isFixed?\"\n   */\n  function isFixed(element) {\n    var nodeName = element.nodeName;\n    if (nodeName === 'BODY' || nodeName === 'HTML') {\n      return false;\n    }\n    if (getStyleComputedProperty(element, 'position') === 'fixed') {\n      return true;\n    }\n    var parentNode = getParentNode(element);\n    if (!parentNode) {\n      return false;\n    }\n    return isFixed(parentNode);\n  }\n\n  /**\n   * Finds the first parent of an element that has a transformed property defined\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element\n   * @returns {Element} first transformed parent or documentElement\n   */\n\n  function getFixedPositionOffsetParent(element) {\n    // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n    if (!element || !element.parentElement || isIE()) {\n      return document.documentElement;\n    }\n    var el = element.parentElement;\n    while (el && getStyleComputedProperty(el, 'transform') === 'none') {\n      el = el.parentElement;\n    }\n    return el || document.documentElement;\n  }\n\n  /**\n   * Computed the boundaries limits and return them\n   * @method\n   * @memberof Popper.Utils\n   * @param {HTMLElement} popper\n   * @param {HTMLElement} reference\n   * @param {number} padding\n   * @param {HTMLElement} boundariesElement - Element used to define the boundaries\n   * @param {Boolean} fixedPosition - Is in fixed position mode\n   * @returns {Object} Coordinates of the boundaries\n   */\n  function getBoundaries(popper, reference, padding, boundariesElement) {\n    var fixedPosition = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n    // NOTE: 1 DOM access here\n\n    var boundaries = { top: 0, left: 0 };\n    var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);\n\n    // Handle viewport case\n    if (boundariesElement === 'viewport') {\n      boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition);\n    } else {\n      // Handle other cases based on DOM element used as boundaries\n      var boundariesNode = void 0;\n      if (boundariesElement === 'scrollParent') {\n        boundariesNode = getScrollParent(getParentNode(reference));\n        if (boundariesNode.nodeName === 'BODY') {\n          boundariesNode = popper.ownerDocument.documentElement;\n        }\n      } else if (boundariesElement === 'window') {\n        boundariesNode = popper.ownerDocument.documentElement;\n      } else {\n        boundariesNode = boundariesElement;\n      }\n\n      var offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition);\n\n      // In case of HTML, we need a different computation\n      if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {\n        var _getWindowSizes = getWindowSizes(popper.ownerDocument),\n            height = _getWindowSizes.height,\n            width = _getWindowSizes.width;\n\n        boundaries.top += offsets.top - offsets.marginTop;\n        boundaries.bottom = height + offsets.top;\n        boundaries.left += offsets.left - offsets.marginLeft;\n        boundaries.right = width + offsets.left;\n      } else {\n        // for all the other DOM elements, this one is good\n        boundaries = offsets;\n      }\n    }\n\n    // Add paddings\n    padding = padding || 0;\n    var isPaddingNumber = typeof padding === 'number';\n    boundaries.left += isPaddingNumber ? padding : padding.left || 0;\n    boundaries.top += isPaddingNumber ? padding : padding.top || 0;\n    boundaries.right -= isPaddingNumber ? padding : padding.right || 0;\n    boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0;\n\n    return boundaries;\n  }\n\n  function getArea(_ref) {\n    var width = _ref.width,\n        height = _ref.height;\n\n    return width * height;\n  }\n\n  /**\n   * Utility used to transform the `auto` placement to the placement with more\n   * available space.\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Object} data - The data object generated by update method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function computeAutoPlacement(placement, refRect, popper, reference, boundariesElement) {\n    var padding = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;\n\n    if (placement.indexOf('auto') === -1) {\n      return placement;\n    }\n\n    var boundaries = getBoundaries(popper, reference, padding, boundariesElement);\n\n    var rects = {\n      top: {\n        width: boundaries.width,\n        height: refRect.top - boundaries.top\n      },\n      right: {\n        width: boundaries.right - refRect.right,\n        height: boundaries.height\n      },\n      bottom: {\n        width: boundaries.width,\n        height: boundaries.bottom - refRect.bottom\n      },\n      left: {\n        width: refRect.left - boundaries.left,\n        height: boundaries.height\n      }\n    };\n\n    var sortedAreas = Object.keys(rects).map(function (key) {\n      return _extends({\n        key: key\n      }, rects[key], {\n        area: getArea(rects[key])\n      });\n    }).sort(function (a, b) {\n      return b.area - a.area;\n    });\n\n    var filteredAreas = sortedAreas.filter(function (_ref2) {\n      var width = _ref2.width,\n          height = _ref2.height;\n      return width >= popper.clientWidth && height >= popper.clientHeight;\n    });\n\n    var computedPlacement = filteredAreas.length > 0 ? filteredAreas[0].key : sortedAreas[0].key;\n\n    var variation = placement.split('-')[1];\n\n    return computedPlacement + (variation ? '-' + variation : '');\n  }\n\n  /**\n   * Get offsets to the reference element\n   * @method\n   * @memberof Popper.Utils\n   * @param {Object} state\n   * @param {Element} popper - the popper element\n   * @param {Element} reference - the reference element (the popper will be relative to this)\n   * @param {Element} fixedPosition - is in fixed position mode\n   * @returns {Object} An object containing the offsets which will be applied to the popper\n   */\n  function getReferenceOffsets(state, popper, reference) {\n    var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n\n    var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);\n    return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);\n  }\n\n  /**\n   * Get the outer sizes of the given element (offset size + margins)\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element\n   * @returns {Object} object containing width and height properties\n   */\n  function getOuterSizes(element) {\n    var window = element.ownerDocument.defaultView;\n    var styles = window.getComputedStyle(element);\n    var x = parseFloat(styles.marginTop || 0) + parseFloat(styles.marginBottom || 0);\n    var y = parseFloat(styles.marginLeft || 0) + parseFloat(styles.marginRight || 0);\n    var result = {\n      width: element.offsetWidth + y,\n      height: element.offsetHeight + x\n    };\n    return result;\n  }\n\n  /**\n   * Get the opposite placement of the given one\n   * @method\n   * @memberof Popper.Utils\n   * @argument {String} placement\n   * @returns {String} flipped placement\n   */\n  function getOppositePlacement(placement) {\n    var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' };\n    return placement.replace(/left|right|bottom|top/g, function (matched) {\n      return hash[matched];\n    });\n  }\n\n  /**\n   * Get offsets to the popper\n   * @method\n   * @memberof Popper.Utils\n   * @param {Object} position - CSS position the Popper will get applied\n   * @param {HTMLElement} popper - the popper element\n   * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this)\n   * @param {String} placement - one of the valid placement options\n   * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper\n   */\n  function getPopperOffsets(popper, referenceOffsets, placement) {\n    placement = placement.split('-')[0];\n\n    // Get popper node sizes\n    var popperRect = getOuterSizes(popper);\n\n    // Add position, width and height to our offsets object\n    var popperOffsets = {\n      width: popperRect.width,\n      height: popperRect.height\n    };\n\n    // depending by the popper placement we have to compute its offsets slightly differently\n    var isHoriz = ['right', 'left'].indexOf(placement) !== -1;\n    var mainSide = isHoriz ? 'top' : 'left';\n    var secondarySide = isHoriz ? 'left' : 'top';\n    var measurement = isHoriz ? 'height' : 'width';\n    var secondaryMeasurement = !isHoriz ? 'height' : 'width';\n\n    popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2;\n    if (placement === secondarySide) {\n      popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement];\n    } else {\n      popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)];\n    }\n\n    return popperOffsets;\n  }\n\n  /**\n   * Mimics the `find` method of Array\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Array} arr\n   * @argument prop\n   * @argument value\n   * @returns index or -1\n   */\n  function find(arr, check) {\n    // use native find if supported\n    if (Array.prototype.find) {\n      return arr.find(check);\n    }\n\n    // use `filter` to obtain the same behavior of `find`\n    return arr.filter(check)[0];\n  }\n\n  /**\n   * Return the index of the matching object\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Array} arr\n   * @argument prop\n   * @argument value\n   * @returns index or -1\n   */\n  function findIndex(arr, prop, value) {\n    // use native findIndex if supported\n    if (Array.prototype.findIndex) {\n      return arr.findIndex(function (cur) {\n        return cur[prop] === value;\n      });\n    }\n\n    // use `find` + `indexOf` if `findIndex` isn't supported\n    var match = find(arr, function (obj) {\n      return obj[prop] === value;\n    });\n    return arr.indexOf(match);\n  }\n\n  /**\n   * Loop trough the list of modifiers and run them in order,\n   * each of them will then edit the data object.\n   * @method\n   * @memberof Popper.Utils\n   * @param {dataObject} data\n   * @param {Array} modifiers\n   * @param {String} ends - Optional modifier name used as stopper\n   * @returns {dataObject}\n   */\n  function runModifiers(modifiers, data, ends) {\n    var modifiersToRun = ends === undefined ? modifiers : modifiers.slice(0, findIndex(modifiers, 'name', ends));\n\n    modifiersToRun.forEach(function (modifier) {\n      if (modifier['function']) {\n        // eslint-disable-line dot-notation\n        console.warn('`modifier.function` is deprecated, use `modifier.fn`!');\n      }\n      var fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation\n      if (modifier.enabled && isFunction(fn)) {\n        // Add properties to offsets to make them a complete clientRect object\n        // we do this before each modifier to make sure the previous one doesn't\n        // mess with these values\n        data.offsets.popper = getClientRect(data.offsets.popper);\n        data.offsets.reference = getClientRect(data.offsets.reference);\n\n        data = fn(data, modifier);\n      }\n    });\n\n    return data;\n  }\n\n  /**\n   * Updates the position of the popper, computing the new offsets and applying\n   * the new style.<br />\n   * Prefer `scheduleUpdate` over `update` because of performance reasons.\n   * @method\n   * @memberof Popper\n   */\n  function update() {\n    // if popper is destroyed, don't perform any further update\n    if (this.state.isDestroyed) {\n      return;\n    }\n\n    var data = {\n      instance: this,\n      styles: {},\n      arrowStyles: {},\n      attributes: {},\n      flipped: false,\n      offsets: {}\n    };\n\n    // compute reference element offsets\n    data.offsets.reference = getReferenceOffsets(this.state, this.popper, this.reference, this.options.positionFixed);\n\n    // compute auto placement, store placement inside the data object,\n    // modifiers will be able to edit `placement` if needed\n    // and refer to originalPlacement to know the original value\n    data.placement = computeAutoPlacement(this.options.placement, data.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding);\n\n    // store the computed placement inside `originalPlacement`\n    data.originalPlacement = data.placement;\n\n    data.positionFixed = this.options.positionFixed;\n\n    // compute the popper offsets\n    data.offsets.popper = getPopperOffsets(this.popper, data.offsets.reference, data.placement);\n\n    data.offsets.popper.position = this.options.positionFixed ? 'fixed' : 'absolute';\n\n    // run the modifiers\n    data = runModifiers(this.modifiers, data);\n\n    // the first `update` will call `onCreate` callback\n    // the other ones will call `onUpdate` callback\n    if (!this.state.isCreated) {\n      this.state.isCreated = true;\n      this.options.onCreate(data);\n    } else {\n      this.options.onUpdate(data);\n    }\n  }\n\n  /**\n   * Helper used to know if the given modifier is enabled.\n   * @method\n   * @memberof Popper.Utils\n   * @returns {Boolean}\n   */\n  function isModifierEnabled(modifiers, modifierName) {\n    return modifiers.some(function (_ref) {\n      var name = _ref.name,\n          enabled = _ref.enabled;\n      return enabled && name === modifierName;\n    });\n  }\n\n  /**\n   * Get the prefixed supported property name\n   * @method\n   * @memberof Popper.Utils\n   * @argument {String} property (camelCase)\n   * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix)\n   */\n  function getSupportedPropertyName(property) {\n    var prefixes = [false, 'ms', 'Webkit', 'Moz', 'O'];\n    var upperProp = property.charAt(0).toUpperCase() + property.slice(1);\n\n    for (var i = 0; i < prefixes.length; i++) {\n      var prefix = prefixes[i];\n      var toCheck = prefix ? '' + prefix + upperProp : property;\n      if (typeof document.body.style[toCheck] !== 'undefined') {\n        return toCheck;\n      }\n    }\n    return null;\n  }\n\n  /**\n   * Destroys the popper.\n   * @method\n   * @memberof Popper\n   */\n  function destroy() {\n    this.state.isDestroyed = true;\n\n    // touch DOM only if `applyStyle` modifier is enabled\n    if (isModifierEnabled(this.modifiers, 'applyStyle')) {\n      this.popper.removeAttribute('x-placement');\n      this.popper.style.position = '';\n      this.popper.style.top = '';\n      this.popper.style.left = '';\n      this.popper.style.right = '';\n      this.popper.style.bottom = '';\n      this.popper.style.willChange = '';\n      this.popper.style[getSupportedPropertyName('transform')] = '';\n    }\n\n    this.disableEventListeners();\n\n    // remove the popper if user explicity asked for the deletion on destroy\n    // do not use `remove` because IE11 doesn't support it\n    if (this.options.removeOnDestroy) {\n      this.popper.parentNode.removeChild(this.popper);\n    }\n    return this;\n  }\n\n  /**\n   * Get the window associated with the element\n   * @argument {Element} element\n   * @returns {Window}\n   */\n  function getWindow(element) {\n    var ownerDocument = element.ownerDocument;\n    return ownerDocument ? ownerDocument.defaultView : window;\n  }\n\n  function attachToScrollParents(scrollParent, event, callback, scrollParents) {\n    var isBody = scrollParent.nodeName === 'BODY';\n    var target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent;\n    target.addEventListener(event, callback, { passive: true });\n\n    if (!isBody) {\n      attachToScrollParents(getScrollParent(target.parentNode), event, callback, scrollParents);\n    }\n    scrollParents.push(target);\n  }\n\n  /**\n   * Setup needed event listeners used to update the popper position\n   * @method\n   * @memberof Popper.Utils\n   * @private\n   */\n  function setupEventListeners(reference, options, state, updateBound) {\n    // Resize event listener on window\n    state.updateBound = updateBound;\n    getWindow(reference).addEventListener('resize', state.updateBound, { passive: true });\n\n    // Scroll event listener on scroll parents\n    var scrollElement = getScrollParent(reference);\n    attachToScrollParents(scrollElement, 'scroll', state.updateBound, state.scrollParents);\n    state.scrollElement = scrollElement;\n    state.eventsEnabled = true;\n\n    return state;\n  }\n\n  /**\n   * It will add resize/scroll events and start recalculating\n   * position of the popper element when they are triggered.\n   * @method\n   * @memberof Popper\n   */\n  function enableEventListeners() {\n    if (!this.state.eventsEnabled) {\n      this.state = setupEventListeners(this.reference, this.options, this.state, this.scheduleUpdate);\n    }\n  }\n\n  /**\n   * Remove event listeners used to update the popper position\n   * @method\n   * @memberof Popper.Utils\n   * @private\n   */\n  function removeEventListeners(reference, state) {\n    // Remove resize event listener on window\n    getWindow(reference).removeEventListener('resize', state.updateBound);\n\n    // Remove scroll event listener on scroll parents\n    state.scrollParents.forEach(function (target) {\n      target.removeEventListener('scroll', state.updateBound);\n    });\n\n    // Reset state\n    state.updateBound = null;\n    state.scrollParents = [];\n    state.scrollElement = null;\n    state.eventsEnabled = false;\n    return state;\n  }\n\n  /**\n   * It will remove resize/scroll events and won't recalculate popper position\n   * when they are triggered. It also won't trigger `onUpdate` callback anymore,\n   * unless you call `update` method manually.\n   * @method\n   * @memberof Popper\n   */\n  function disableEventListeners() {\n    if (this.state.eventsEnabled) {\n      cancelAnimationFrame(this.scheduleUpdate);\n      this.state = removeEventListeners(this.reference, this.state);\n    }\n  }\n\n  /**\n   * Tells if a given input is a number\n   * @method\n   * @memberof Popper.Utils\n   * @param {*} input to check\n   * @return {Boolean}\n   */\n  function isNumeric(n) {\n    return n !== '' && !isNaN(parseFloat(n)) && isFinite(n);\n  }\n\n  /**\n   * Set the style to the given popper\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element - Element to apply the style to\n   * @argument {Object} styles\n   * Object with a list of properties and values which will be applied to the element\n   */\n  function setStyles(element, styles) {\n    Object.keys(styles).forEach(function (prop) {\n      var unit = '';\n      // add unit if the value is numeric and is one of the following\n      if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && isNumeric(styles[prop])) {\n        unit = 'px';\n      }\n      element.style[prop] = styles[prop] + unit;\n    });\n  }\n\n  /**\n   * Set the attributes to the given popper\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element - Element to apply the attributes to\n   * @argument {Object} styles\n   * Object with a list of properties and values which will be applied to the element\n   */\n  function setAttributes(element, attributes) {\n    Object.keys(attributes).forEach(function (prop) {\n      var value = attributes[prop];\n      if (value !== false) {\n        element.setAttribute(prop, attributes[prop]);\n      } else {\n        element.removeAttribute(prop);\n      }\n    });\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by `update` method\n   * @argument {Object} data.styles - List of style properties - values to apply to popper element\n   * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The same data object\n   */\n  function applyStyle(data) {\n    // any property present in `data.styles` will be applied to the popper,\n    // in this way we can make the 3rd party modifiers add custom styles to it\n    // Be aware, modifiers could override the properties defined in the previous\n    // lines of this modifier!\n    setStyles(data.instance.popper, data.styles);\n\n    // any property present in `data.attributes` will be applied to the popper,\n    // they will be set as HTML attributes of the element\n    setAttributes(data.instance.popper, data.attributes);\n\n    // if arrowElement is defined and arrowStyles has some properties\n    if (data.arrowElement && Object.keys(data.arrowStyles).length) {\n      setStyles(data.arrowElement, data.arrowStyles);\n    }\n\n    return data;\n  }\n\n  /**\n   * Set the x-placement attribute before everything else because it could be used\n   * to add margins to the popper margins needs to be calculated to get the\n   * correct popper offsets.\n   * @method\n   * @memberof Popper.modifiers\n   * @param {HTMLElement} reference - The reference element used to position the popper\n   * @param {HTMLElement} popper - The HTML element used as popper\n   * @param {Object} options - Popper.js options\n   */\n  function applyStyleOnLoad(reference, popper, options, modifierOptions, state) {\n    // compute reference element offsets\n    var referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed);\n\n    // compute auto placement, store placement inside the data object,\n    // modifiers will be able to edit `placement` if needed\n    // and refer to originalPlacement to know the original value\n    var placement = computeAutoPlacement(options.placement, referenceOffsets, popper, reference, options.modifiers.flip.boundariesElement, options.modifiers.flip.padding);\n\n    popper.setAttribute('x-placement', placement);\n\n    // Apply `position` to popper before anything else because\n    // without the position applied we can't guarantee correct computations\n    setStyles(popper, { position: options.positionFixed ? 'fixed' : 'absolute' });\n\n    return options;\n  }\n\n  /**\n   * @function\n   * @memberof Popper.Utils\n   * @argument {Object} data - The data object generated by `update` method\n   * @argument {Boolean} shouldRound - If the offsets should be rounded at all\n   * @returns {Object} The popper's position offsets rounded\n   *\n   * The tale of pixel-perfect positioning. It's still not 100% perfect, but as\n   * good as it can be within reason.\n   * Discussion here: https://github.com/FezVrasta/popper.js/pull/715\n   *\n   * Low DPI screens cause a popper to be blurry if not using full pixels (Safari\n   * as well on High DPI screens).\n   *\n   * Firefox prefers no rounding for positioning and does not have blurriness on\n   * high DPI screens.\n   *\n   * Only horizontal placement and left/right values need to be considered.\n   */\n  function getRoundedOffsets(data, shouldRound) {\n    var _data$offsets = data.offsets,\n        popper = _data$offsets.popper,\n        reference = _data$offsets.reference;\n    var round = Math.round,\n        floor = Math.floor;\n\n    var noRound = function noRound(v) {\n      return v;\n    };\n\n    var referenceWidth = round(reference.width);\n    var popperWidth = round(popper.width);\n\n    var isVertical = ['left', 'right'].indexOf(data.placement) !== -1;\n    var isVariation = data.placement.indexOf('-') !== -1;\n    var sameWidthParity = referenceWidth % 2 === popperWidth % 2;\n    var bothOddWidth = referenceWidth % 2 === 1 && popperWidth % 2 === 1;\n\n    var horizontalToInteger = !shouldRound ? noRound : isVertical || isVariation || sameWidthParity ? round : floor;\n    var verticalToInteger = !shouldRound ? noRound : round;\n\n    return {\n      left: horizontalToInteger(bothOddWidth && !isVariation && shouldRound ? popper.left - 1 : popper.left),\n      top: verticalToInteger(popper.top),\n      bottom: verticalToInteger(popper.bottom),\n      right: horizontalToInteger(popper.right)\n    };\n  }\n\n  var isFirefox = isBrowser && /Firefox/i.test(navigator.userAgent);\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by `update` method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function computeStyle(data, options) {\n    var x = options.x,\n        y = options.y;\n    var popper = data.offsets.popper;\n\n    // Remove this legacy support in Popper.js v2\n\n    var legacyGpuAccelerationOption = find(data.instance.modifiers, function (modifier) {\n      return modifier.name === 'applyStyle';\n    }).gpuAcceleration;\n    if (legacyGpuAccelerationOption !== undefined) {\n      console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');\n    }\n    var gpuAcceleration = legacyGpuAccelerationOption !== undefined ? legacyGpuAccelerationOption : options.gpuAcceleration;\n\n    var offsetParent = getOffsetParent(data.instance.popper);\n    var offsetParentRect = getBoundingClientRect(offsetParent);\n\n    // Styles\n    var styles = {\n      position: popper.position\n    };\n\n    var offsets = getRoundedOffsets(data, window.devicePixelRatio < 2 || !isFirefox);\n\n    var sideA = x === 'bottom' ? 'top' : 'bottom';\n    var sideB = y === 'right' ? 'left' : 'right';\n\n    // if gpuAcceleration is set to `true` and transform is supported,\n    //  we use `translate3d` to apply the position to the popper we\n    // automatically use the supported prefixed version if needed\n    var prefixedProperty = getSupportedPropertyName('transform');\n\n    // now, let's make a step back and look at this code closely (wtf?)\n    // If the content of the popper grows once it's been positioned, it\n    // may happen that the popper gets misplaced because of the new content\n    // overflowing its reference element\n    // To avoid this problem, we provide two options (x and y), which allow\n    // the consumer to define the offset origin.\n    // If we position a popper on top of a reference element, we can set\n    // `x` to `top` to make the popper grow towards its top instead of\n    // its bottom.\n    var left = void 0,\n        top = void 0;\n    if (sideA === 'bottom') {\n      // when offsetParent is <html> the positioning is relative to the bottom of the screen (excluding the scrollbar)\n      // and not the bottom of the html element\n      if (offsetParent.nodeName === 'HTML') {\n        top = -offsetParent.clientHeight + offsets.bottom;\n      } else {\n        top = -offsetParentRect.height + offsets.bottom;\n      }\n    } else {\n      top = offsets.top;\n    }\n    if (sideB === 'right') {\n      if (offsetParent.nodeName === 'HTML') {\n        left = -offsetParent.clientWidth + offsets.right;\n      } else {\n        left = -offsetParentRect.width + offsets.right;\n      }\n    } else {\n      left = offsets.left;\n    }\n    if (gpuAcceleration && prefixedProperty) {\n      styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)';\n      styles[sideA] = 0;\n      styles[sideB] = 0;\n      styles.willChange = 'transform';\n    } else {\n      // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties\n      var invertTop = sideA === 'bottom' ? -1 : 1;\n      var invertLeft = sideB === 'right' ? -1 : 1;\n      styles[sideA] = top * invertTop;\n      styles[sideB] = left * invertLeft;\n      styles.willChange = sideA + ', ' + sideB;\n    }\n\n    // Attributes\n    var attributes = {\n      'x-placement': data.placement\n    };\n\n    // Update `data` attributes, styles and arrowStyles\n    data.attributes = _extends({}, attributes, data.attributes);\n    data.styles = _extends({}, styles, data.styles);\n    data.arrowStyles = _extends({}, data.offsets.arrow, data.arrowStyles);\n\n    return data;\n  }\n\n  /**\n   * Helper used to know if the given modifier depends from another one.<br />\n   * It checks if the needed modifier is listed and enabled.\n   * @method\n   * @memberof Popper.Utils\n   * @param {Array} modifiers - list of modifiers\n   * @param {String} requestingName - name of requesting modifier\n   * @param {String} requestedName - name of requested modifier\n   * @returns {Boolean}\n   */\n  function isModifierRequired(modifiers, requestingName, requestedName) {\n    var requesting = find(modifiers, function (_ref) {\n      var name = _ref.name;\n      return name === requestingName;\n    });\n\n    var isRequired = !!requesting && modifiers.some(function (modifier) {\n      return modifier.name === requestedName && modifier.enabled && modifier.order < requesting.order;\n    });\n\n    if (!isRequired) {\n      var _requesting = '`' + requestingName + '`';\n      var requested = '`' + requestedName + '`';\n      console.warn(requested + ' modifier is required by ' + _requesting + ' modifier in order to work, be sure to include it before ' + _requesting + '!');\n    }\n    return isRequired;\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by update method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function arrow(data, options) {\n    var _data$offsets$arrow;\n\n    // arrow depends on keepTogether in order to work\n    if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) {\n      return data;\n    }\n\n    var arrowElement = options.element;\n\n    // if arrowElement is a string, suppose it's a CSS selector\n    if (typeof arrowElement === 'string') {\n      arrowElement = data.instance.popper.querySelector(arrowElement);\n\n      // if arrowElement is not found, don't run the modifier\n      if (!arrowElement) {\n        return data;\n      }\n    } else {\n      // if the arrowElement isn't a query selector we must check that the\n      // provided DOM node is child of its popper node\n      if (!data.instance.popper.contains(arrowElement)) {\n        console.warn('WARNING: `arrow.element` must be child of its popper element!');\n        return data;\n      }\n    }\n\n    var placement = data.placement.split('-')[0];\n    var _data$offsets = data.offsets,\n        popper = _data$offsets.popper,\n        reference = _data$offsets.reference;\n\n    var isVertical = ['left', 'right'].indexOf(placement) !== -1;\n\n    var len = isVertical ? 'height' : 'width';\n    var sideCapitalized = isVertical ? 'Top' : 'Left';\n    var side = sideCapitalized.toLowerCase();\n    var altSide = isVertical ? 'left' : 'top';\n    var opSide = isVertical ? 'bottom' : 'right';\n    var arrowElementSize = getOuterSizes(arrowElement)[len];\n\n    //\n    // extends keepTogether behavior making sure the popper and its\n    // reference have enough pixels in conjunction\n    //\n\n    // top/left side\n    if (reference[opSide] - arrowElementSize < popper[side]) {\n      data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize);\n    }\n    // bottom/right side\n    if (reference[side] + arrowElementSize > popper[opSide]) {\n      data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide];\n    }\n    data.offsets.popper = getClientRect(data.offsets.popper);\n\n    // compute center of the popper\n    var center = reference[side] + reference[len] / 2 - arrowElementSize / 2;\n\n    // Compute the sideValue using the updated popper offsets\n    // take popper margin in account because we don't have this info available\n    var css = getStyleComputedProperty(data.instance.popper);\n    var popperMarginSide = parseFloat(css['margin' + sideCapitalized], 10);\n    var popperBorderSide = parseFloat(css['border' + sideCapitalized + 'Width'], 10);\n    var sideValue = center - data.offsets.popper[side] - popperMarginSide - popperBorderSide;\n\n    // prevent arrowElement from being placed not contiguously to its popper\n    sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0);\n\n    data.arrowElement = arrowElement;\n    data.offsets.arrow = (_data$offsets$arrow = {}, defineProperty(_data$offsets$arrow, side, Math.round(sideValue)), defineProperty(_data$offsets$arrow, altSide, ''), _data$offsets$arrow);\n\n    return data;\n  }\n\n  /**\n   * Get the opposite placement variation of the given one\n   * @method\n   * @memberof Popper.Utils\n   * @argument {String} placement variation\n   * @returns {String} flipped placement variation\n   */\n  function getOppositeVariation(variation) {\n    if (variation === 'end') {\n      return 'start';\n    } else if (variation === 'start') {\n      return 'end';\n    }\n    return variation;\n  }\n\n  /**\n   * List of accepted placements to use as values of the `placement` option.<br />\n   * Valid placements are:\n   * - `auto`\n   * - `top`\n   * - `right`\n   * - `bottom`\n   * - `left`\n   *\n   * Each placement can have a variation from this list:\n   * - `-start`\n   * - `-end`\n   *\n   * Variations are interpreted easily if you think of them as the left to right\n   * written languages. Horizontally (`top` and `bottom`), `start` is left and `end`\n   * is right.<br />\n   * Vertically (`left` and `right`), `start` is top and `end` is bottom.\n   *\n   * Some valid examples are:\n   * - `top-end` (on top of reference, right aligned)\n   * - `right-start` (on right of reference, top aligned)\n   * - `bottom` (on bottom, centered)\n   * - `auto-end` (on the side with more space available, alignment depends by placement)\n   *\n   * @static\n   * @type {Array}\n   * @enum {String}\n   * @readonly\n   * @method placements\n   * @memberof Popper\n   */\n  var placements = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start'];\n\n  // Get rid of `auto` `auto-start` and `auto-end`\n  var validPlacements = placements.slice(3);\n\n  /**\n   * Given an initial placement, returns all the subsequent placements\n   * clockwise (or counter-clockwise).\n   *\n   * @method\n   * @memberof Popper.Utils\n   * @argument {String} placement - A valid placement (it accepts variations)\n   * @argument {Boolean} counter - Set to true to walk the placements counterclockwise\n   * @returns {Array} placements including their variations\n   */\n  function clockwise(placement) {\n    var counter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n    var index = validPlacements.indexOf(placement);\n    var arr = validPlacements.slice(index + 1).concat(validPlacements.slice(0, index));\n    return counter ? arr.reverse() : arr;\n  }\n\n  var BEHAVIORS = {\n    FLIP: 'flip',\n    CLOCKWISE: 'clockwise',\n    COUNTERCLOCKWISE: 'counterclockwise'\n  };\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by update method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function flip(data, options) {\n    // if `inner` modifier is enabled, we can't use the `flip` modifier\n    if (isModifierEnabled(data.instance.modifiers, 'inner')) {\n      return data;\n    }\n\n    if (data.flipped && data.placement === data.originalPlacement) {\n      // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides\n      return data;\n    }\n\n    var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, options.boundariesElement, data.positionFixed);\n\n    var placement = data.placement.split('-')[0];\n    var placementOpposite = getOppositePlacement(placement);\n    var variation = data.placement.split('-')[1] || '';\n\n    var flipOrder = [];\n\n    switch (options.behavior) {\n      case BEHAVIORS.FLIP:\n        flipOrder = [placement, placementOpposite];\n        break;\n      case BEHAVIORS.CLOCKWISE:\n        flipOrder = clockwise(placement);\n        break;\n      case BEHAVIORS.COUNTERCLOCKWISE:\n        flipOrder = clockwise(placement, true);\n        break;\n      default:\n        flipOrder = options.behavior;\n    }\n\n    flipOrder.forEach(function (step, index) {\n      if (placement !== step || flipOrder.length === index + 1) {\n        return data;\n      }\n\n      placement = data.placement.split('-')[0];\n      placementOpposite = getOppositePlacement(placement);\n\n      var popperOffsets = data.offsets.popper;\n      var refOffsets = data.offsets.reference;\n\n      // using floor because the reference offsets may contain decimals we are not going to consider here\n      var floor = Math.floor;\n      var overlapsRef = placement === 'left' && floor(popperOffsets.right) > floor(refOffsets.left) || placement === 'right' && floor(popperOffsets.left) < floor(refOffsets.right) || placement === 'top' && floor(popperOffsets.bottom) > floor(refOffsets.top) || placement === 'bottom' && floor(popperOffsets.top) < floor(refOffsets.bottom);\n\n      var overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left);\n      var overflowsRight = floor(popperOffsets.right) > floor(boundaries.right);\n      var overflowsTop = floor(popperOffsets.top) < floor(boundaries.top);\n      var overflowsBottom = floor(popperOffsets.bottom) > floor(boundaries.bottom);\n\n      var overflowsBoundaries = placement === 'left' && overflowsLeft || placement === 'right' && overflowsRight || placement === 'top' && overflowsTop || placement === 'bottom' && overflowsBottom;\n\n      // flip the variation if required\n      var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n      var flippedVariation = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom);\n\n      if (overlapsRef || overflowsBoundaries || flippedVariation) {\n        // this boolean to detect any flip loop\n        data.flipped = true;\n\n        if (overlapsRef || overflowsBoundaries) {\n          placement = flipOrder[index + 1];\n        }\n\n        if (flippedVariation) {\n          variation = getOppositeVariation(variation);\n        }\n\n        data.placement = placement + (variation ? '-' + variation : '');\n\n        // this object contains `position`, we want to preserve it along with\n        // any additional property we may add in the future\n        data.offsets.popper = _extends({}, data.offsets.popper, getPopperOffsets(data.instance.popper, data.offsets.reference, data.placement));\n\n        data = runModifiers(data.instance.modifiers, data, 'flip');\n      }\n    });\n    return data;\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by update method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function keepTogether(data) {\n    var _data$offsets = data.offsets,\n        popper = _data$offsets.popper,\n        reference = _data$offsets.reference;\n\n    var placement = data.placement.split('-')[0];\n    var floor = Math.floor;\n    var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n    var side = isVertical ? 'right' : 'bottom';\n    var opSide = isVertical ? 'left' : 'top';\n    var measurement = isVertical ? 'width' : 'height';\n\n    if (popper[side] < floor(reference[opSide])) {\n      data.offsets.popper[opSide] = floor(reference[opSide]) - popper[measurement];\n    }\n    if (popper[opSide] > floor(reference[side])) {\n      data.offsets.popper[opSide] = floor(reference[side]);\n    }\n\n    return data;\n  }\n\n  /**\n   * Converts a string containing value + unit into a px value number\n   * @function\n   * @memberof {modifiers~offset}\n   * @private\n   * @argument {String} str - Value + unit string\n   * @argument {String} measurement - `height` or `width`\n   * @argument {Object} popperOffsets\n   * @argument {Object} referenceOffsets\n   * @returns {Number|String}\n   * Value in pixels, or original string if no values were extracted\n   */\n  function toValue(str, measurement, popperOffsets, referenceOffsets) {\n    // separate value from unit\n    var split = str.match(/((?:\\-|\\+)?\\d*\\.?\\d*)(.*)/);\n    var value = +split[1];\n    var unit = split[2];\n\n    // If it's not a number it's an operator, I guess\n    if (!value) {\n      return str;\n    }\n\n    if (unit.indexOf('%') === 0) {\n      var element = void 0;\n      switch (unit) {\n        case '%p':\n          element = popperOffsets;\n          break;\n        case '%':\n        case '%r':\n        default:\n          element = referenceOffsets;\n      }\n\n      var rect = getClientRect(element);\n      return rect[measurement] / 100 * value;\n    } else if (unit === 'vh' || unit === 'vw') {\n      // if is a vh or vw, we calculate the size based on the viewport\n      var size = void 0;\n      if (unit === 'vh') {\n        size = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);\n      } else {\n        size = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n      }\n      return size / 100 * value;\n    } else {\n      // if is an explicit pixel unit, we get rid of the unit and keep the value\n      // if is an implicit unit, it's px, and we return just the value\n      return value;\n    }\n  }\n\n  /**\n   * Parse an `offset` string to extrapolate `x` and `y` numeric offsets.\n   * @function\n   * @memberof {modifiers~offset}\n   * @private\n   * @argument {String} offset\n   * @argument {Object} popperOffsets\n   * @argument {Object} referenceOffsets\n   * @argument {String} basePlacement\n   * @returns {Array} a two cells array with x and y offsets in numbers\n   */\n  function parseOffset(offset, popperOffsets, referenceOffsets, basePlacement) {\n    var offsets = [0, 0];\n\n    // Use height if placement is left or right and index is 0 otherwise use width\n    // in this way the first offset will use an axis and the second one\n    // will use the other one\n    var useHeight = ['right', 'left'].indexOf(basePlacement) !== -1;\n\n    // Split the offset string to obtain a list of values and operands\n    // The regex addresses values with the plus or minus sign in front (+10, -20, etc)\n    var fragments = offset.split(/(\\+|\\-)/).map(function (frag) {\n      return frag.trim();\n    });\n\n    // Detect if the offset string contains a pair of values or a single one\n    // they could be separated by comma or space\n    var divider = fragments.indexOf(find(fragments, function (frag) {\n      return frag.search(/,|\\s/) !== -1;\n    }));\n\n    if (fragments[divider] && fragments[divider].indexOf(',') === -1) {\n      console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');\n    }\n\n    // If divider is found, we divide the list of values and operands to divide\n    // them by ofset X and Y.\n    var splitRegex = /\\s*,\\s*|\\s+/;\n    var ops = divider !== -1 ? [fragments.slice(0, divider).concat([fragments[divider].split(splitRegex)[0]]), [fragments[divider].split(splitRegex)[1]].concat(fragments.slice(divider + 1))] : [fragments];\n\n    // Convert the values with units to absolute pixels to allow our computations\n    ops = ops.map(function (op, index) {\n      // Most of the units rely on the orientation of the popper\n      var measurement = (index === 1 ? !useHeight : useHeight) ? 'height' : 'width';\n      var mergeWithPrevious = false;\n      return op\n      // This aggregates any `+` or `-` sign that aren't considered operators\n      // e.g.: 10 + +5 => [10, +, +5]\n      .reduce(function (a, b) {\n        if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) {\n          a[a.length - 1] = b;\n          mergeWithPrevious = true;\n          return a;\n        } else if (mergeWithPrevious) {\n          a[a.length - 1] += b;\n          mergeWithPrevious = false;\n          return a;\n        } else {\n          return a.concat(b);\n        }\n      }, [])\n      // Here we convert the string values into number values (in px)\n      .map(function (str) {\n        return toValue(str, measurement, popperOffsets, referenceOffsets);\n      });\n    });\n\n    // Loop trough the offsets arrays and execute the operations\n    ops.forEach(function (op, index) {\n      op.forEach(function (frag, index2) {\n        if (isNumeric(frag)) {\n          offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1);\n        }\n      });\n    });\n    return offsets;\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by update method\n   * @argument {Object} options - Modifiers configuration and options\n   * @argument {Number|String} options.offset=0\n   * The offset value as described in the modifier description\n   * @returns {Object} The data object, properly modified\n   */\n  function offset(data, _ref) {\n    var offset = _ref.offset;\n    var placement = data.placement,\n        _data$offsets = data.offsets,\n        popper = _data$offsets.popper,\n        reference = _data$offsets.reference;\n\n    var basePlacement = placement.split('-')[0];\n\n    var offsets = void 0;\n    if (isNumeric(+offset)) {\n      offsets = [+offset, 0];\n    } else {\n      offsets = parseOffset(offset, popper, reference, basePlacement);\n    }\n\n    if (basePlacement === 'left') {\n      popper.top += offsets[0];\n      popper.left -= offsets[1];\n    } else if (basePlacement === 'right') {\n      popper.top += offsets[0];\n      popper.left += offsets[1];\n    } else if (basePlacement === 'top') {\n      popper.left += offsets[0];\n      popper.top -= offsets[1];\n    } else if (basePlacement === 'bottom') {\n      popper.left += offsets[0];\n      popper.top += offsets[1];\n    }\n\n    data.popper = popper;\n    return data;\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by `update` method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function preventOverflow(data, options) {\n    var boundariesElement = options.boundariesElement || getOffsetParent(data.instance.popper);\n\n    // If offsetParent is the reference element, we really want to\n    // go one step up and use the next offsetParent as reference to\n    // avoid to make this modifier completely useless and look like broken\n    if (data.instance.reference === boundariesElement) {\n      boundariesElement = getOffsetParent(boundariesElement);\n    }\n\n    // NOTE: DOM access here\n    // resets the popper's position so that the document size can be calculated excluding\n    // the size of the popper element itself\n    var transformProp = getSupportedPropertyName('transform');\n    var popperStyles = data.instance.popper.style; // assignment to help minification\n    var top = popperStyles.top,\n        left = popperStyles.left,\n        transform = popperStyles[transformProp];\n\n    popperStyles.top = '';\n    popperStyles.left = '';\n    popperStyles[transformProp] = '';\n\n    var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement, data.positionFixed);\n\n    // NOTE: DOM access here\n    // restores the original style properties after the offsets have been computed\n    popperStyles.top = top;\n    popperStyles.left = left;\n    popperStyles[transformProp] = transform;\n\n    options.boundaries = boundaries;\n\n    var order = options.priority;\n    var popper = data.offsets.popper;\n\n    var check = {\n      primary: function primary(placement) {\n        var value = popper[placement];\n        if (popper[placement] < boundaries[placement] && !options.escapeWithReference) {\n          value = Math.max(popper[placement], boundaries[placement]);\n        }\n        return defineProperty({}, placement, value);\n      },\n      secondary: function secondary(placement) {\n        var mainSide = placement === 'right' ? 'left' : 'top';\n        var value = popper[mainSide];\n        if (popper[placement] > boundaries[placement] && !options.escapeWithReference) {\n          value = Math.min(popper[mainSide], boundaries[placement] - (placement === 'right' ? popper.width : popper.height));\n        }\n        return defineProperty({}, mainSide, value);\n      }\n    };\n\n    order.forEach(function (placement) {\n      var side = ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary';\n      popper = _extends({}, popper, check[side](placement));\n    });\n\n    data.offsets.popper = popper;\n\n    return data;\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by `update` method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function shift(data) {\n    var placement = data.placement;\n    var basePlacement = placement.split('-')[0];\n    var shiftvariation = placement.split('-')[1];\n\n    // if shift shiftvariation is specified, run the modifier\n    if (shiftvariation) {\n      var _data$offsets = data.offsets,\n          reference = _data$offsets.reference,\n          popper = _data$offsets.popper;\n\n      var isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1;\n      var side = isVertical ? 'left' : 'top';\n      var measurement = isVertical ? 'width' : 'height';\n\n      var shiftOffsets = {\n        start: defineProperty({}, side, reference[side]),\n        end: defineProperty({}, side, reference[side] + reference[measurement] - popper[measurement])\n      };\n\n      data.offsets.popper = _extends({}, popper, shiftOffsets[shiftvariation]);\n    }\n\n    return data;\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by update method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function hide(data) {\n    if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) {\n      return data;\n    }\n\n    var refRect = data.offsets.reference;\n    var bound = find(data.instance.modifiers, function (modifier) {\n      return modifier.name === 'preventOverflow';\n    }).boundaries;\n\n    if (refRect.bottom < bound.top || refRect.left > bound.right || refRect.top > bound.bottom || refRect.right < bound.left) {\n      // Avoid unnecessary DOM access if visibility hasn't changed\n      if (data.hide === true) {\n        return data;\n      }\n\n      data.hide = true;\n      data.attributes['x-out-of-boundaries'] = '';\n    } else {\n      // Avoid unnecessary DOM access if visibility hasn't changed\n      if (data.hide === false) {\n        return data;\n      }\n\n      data.hide = false;\n      data.attributes['x-out-of-boundaries'] = false;\n    }\n\n    return data;\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by `update` method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function inner(data) {\n    var placement = data.placement;\n    var basePlacement = placement.split('-')[0];\n    var _data$offsets = data.offsets,\n        popper = _data$offsets.popper,\n        reference = _data$offsets.reference;\n\n    var isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1;\n\n    var subtractLength = ['top', 'left'].indexOf(basePlacement) === -1;\n\n    popper[isHoriz ? 'left' : 'top'] = reference[basePlacement] - (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0);\n\n    data.placement = getOppositePlacement(placement);\n    data.offsets.popper = getClientRect(popper);\n\n    return data;\n  }\n\n  /**\n   * Modifier function, each modifier can have a function of this type assigned\n   * to its `fn` property.<br />\n   * These functions will be called on each update, this means that you must\n   * make sure they are performant enough to avoid performance bottlenecks.\n   *\n   * @function ModifierFn\n   * @argument {dataObject} data - The data object generated by `update` method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {dataObject} The data object, properly modified\n   */\n\n  /**\n   * Modifiers are plugins used to alter the behavior of your poppers.<br />\n   * Popper.js uses a set of 9 modifiers to provide all the basic functionalities\n   * needed by the library.\n   *\n   * Usually you don't want to override the `order`, `fn` and `onLoad` props.\n   * All the other properties are configurations that could be tweaked.\n   * @namespace modifiers\n   */\n  var modifiers = {\n    /**\n     * Modifier used to shift the popper on the start or end of its reference\n     * element.<br />\n     * It will read the variation of the `placement` property.<br />\n     * It can be one either `-end` or `-start`.\n     * @memberof modifiers\n     * @inner\n     */\n    shift: {\n      /** @prop {number} order=100 - Index used to define the order of execution */\n      order: 100,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: shift\n    },\n\n    /**\n     * The `offset` modifier can shift your popper on both its axis.\n     *\n     * It accepts the following units:\n     * - `px` or unit-less, interpreted as pixels\n     * - `%` or `%r`, percentage relative to the length of the reference element\n     * - `%p`, percentage relative to the length of the popper element\n     * - `vw`, CSS viewport width unit\n     * - `vh`, CSS viewport height unit\n     *\n     * For length is intended the main axis relative to the placement of the popper.<br />\n     * This means that if the placement is `top` or `bottom`, the length will be the\n     * `width`. In case of `left` or `right`, it will be the `height`.\n     *\n     * You can provide a single value (as `Number` or `String`), or a pair of values\n     * as `String` divided by a comma or one (or more) white spaces.<br />\n     * The latter is a deprecated method because it leads to confusion and will be\n     * removed in v2.<br />\n     * Additionally, it accepts additions and subtractions between different units.\n     * Note that multiplications and divisions aren't supported.\n     *\n     * Valid examples are:\n     * ```\n     * 10\n     * '10%'\n     * '10, 10'\n     * '10%, 10'\n     * '10 + 10%'\n     * '10 - 5vh + 3%'\n     * '-10px + 5vh, 5px - 6%'\n     * ```\n     * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap\n     * > with their reference element, unfortunately, you will have to disable the `flip` modifier.\n     * > You can read more on this at this [issue](https://github.com/FezVrasta/popper.js/issues/373).\n     *\n     * @memberof modifiers\n     * @inner\n     */\n    offset: {\n      /** @prop {number} order=200 - Index used to define the order of execution */\n      order: 200,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: offset,\n      /** @prop {Number|String} offset=0\n       * The offset value as described in the modifier description\n       */\n      offset: 0\n    },\n\n    /**\n     * Modifier used to prevent the popper from being positioned outside the boundary.\n     *\n     * A scenario exists where the reference itself is not within the boundaries.<br />\n     * We can say it has \"escaped the boundaries\" — or just \"escaped\".<br />\n     * In this case we need to decide whether the popper should either:\n     *\n     * - detach from the reference and remain \"trapped\" in the boundaries, or\n     * - if it should ignore the boundary and \"escape with its reference\"\n     *\n     * When `escapeWithReference` is set to`true` and reference is completely\n     * outside its boundaries, the popper will overflow (or completely leave)\n     * the boundaries in order to remain attached to the edge of the reference.\n     *\n     * @memberof modifiers\n     * @inner\n     */\n    preventOverflow: {\n      /** @prop {number} order=300 - Index used to define the order of execution */\n      order: 300,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: preventOverflow,\n      /**\n       * @prop {Array} [priority=['left','right','top','bottom']]\n       * Popper will try to prevent overflow following these priorities by default,\n       * then, it could overflow on the left and on top of the `boundariesElement`\n       */\n      priority: ['left', 'right', 'top', 'bottom'],\n      /**\n       * @prop {number} padding=5\n       * Amount of pixel used to define a minimum distance between the boundaries\n       * and the popper. This makes sure the popper always has a little padding\n       * between the edges of its container\n       */\n      padding: 5,\n      /**\n       * @prop {String|HTMLElement} boundariesElement='scrollParent'\n       * Boundaries used by the modifier. Can be `scrollParent`, `window`,\n       * `viewport` or any DOM element.\n       */\n      boundariesElement: 'scrollParent'\n    },\n\n    /**\n     * Modifier used to make sure the reference and its popper stay near each other\n     * without leaving any gap between the two. Especially useful when the arrow is\n     * enabled and you want to ensure that it points to its reference element.\n     * It cares only about the first axis. You can still have poppers with margin\n     * between the popper and its reference element.\n     * @memberof modifiers\n     * @inner\n     */\n    keepTogether: {\n      /** @prop {number} order=400 - Index used to define the order of execution */\n      order: 400,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: keepTogether\n    },\n\n    /**\n     * This modifier is used to move the `arrowElement` of the popper to make\n     * sure it is positioned between the reference element and its popper element.\n     * It will read the outer size of the `arrowElement` node to detect how many\n     * pixels of conjunction are needed.\n     *\n     * It has no effect if no `arrowElement` is provided.\n     * @memberof modifiers\n     * @inner\n     */\n    arrow: {\n      /** @prop {number} order=500 - Index used to define the order of execution */\n      order: 500,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: arrow,\n      /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */\n      element: '[x-arrow]'\n    },\n\n    /**\n     * Modifier used to flip the popper's placement when it starts to overlap its\n     * reference element.\n     *\n     * Requires the `preventOverflow` modifier before it in order to work.\n     *\n     * **NOTE:** this modifier will interrupt the current update cycle and will\n     * restart it if it detects the need to flip the placement.\n     * @memberof modifiers\n     * @inner\n     */\n    flip: {\n      /** @prop {number} order=600 - Index used to define the order of execution */\n      order: 600,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: flip,\n      /**\n       * @prop {String|Array} behavior='flip'\n       * The behavior used to change the popper's placement. It can be one of\n       * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid\n       * placements (with optional variations)\n       */\n      behavior: 'flip',\n      /**\n       * @prop {number} padding=5\n       * The popper will flip if it hits the edges of the `boundariesElement`\n       */\n      padding: 5,\n      /**\n       * @prop {String|HTMLElement} boundariesElement='viewport'\n       * The element which will define the boundaries of the popper position.\n       * The popper will never be placed outside of the defined boundaries\n       * (except if `keepTogether` is enabled)\n       */\n      boundariesElement: 'viewport'\n    },\n\n    /**\n     * Modifier used to make the popper flow toward the inner of the reference element.\n     * By default, when this modifier is disabled, the popper will be placed outside\n     * the reference element.\n     * @memberof modifiers\n     * @inner\n     */\n    inner: {\n      /** @prop {number} order=700 - Index used to define the order of execution */\n      order: 700,\n      /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */\n      enabled: false,\n      /** @prop {ModifierFn} */\n      fn: inner\n    },\n\n    /**\n     * Modifier used to hide the popper when its reference element is outside of the\n     * popper boundaries. It will set a `x-out-of-boundaries` attribute which can\n     * be used to hide with a CSS selector the popper when its reference is\n     * out of boundaries.\n     *\n     * Requires the `preventOverflow` modifier before it in order to work.\n     * @memberof modifiers\n     * @inner\n     */\n    hide: {\n      /** @prop {number} order=800 - Index used to define the order of execution */\n      order: 800,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: hide\n    },\n\n    /**\n     * Computes the style that will be applied to the popper element to gets\n     * properly positioned.\n     *\n     * Note that this modifier will not touch the DOM, it just prepares the styles\n     * so that `applyStyle` modifier can apply it. This separation is useful\n     * in case you need to replace `applyStyle` with a custom implementation.\n     *\n     * This modifier has `850` as `order` value to maintain backward compatibility\n     * with previous versions of Popper.js. Expect the modifiers ordering method\n     * to change in future major versions of the library.\n     *\n     * @memberof modifiers\n     * @inner\n     */\n    computeStyle: {\n      /** @prop {number} order=850 - Index used to define the order of execution */\n      order: 850,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: computeStyle,\n      /**\n       * @prop {Boolean} gpuAcceleration=true\n       * If true, it uses the CSS 3D transformation to position the popper.\n       * Otherwise, it will use the `top` and `left` properties\n       */\n      gpuAcceleration: true,\n      /**\n       * @prop {string} [x='bottom']\n       * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin.\n       * Change this if your popper should grow in a direction different from `bottom`\n       */\n      x: 'bottom',\n      /**\n       * @prop {string} [x='left']\n       * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin.\n       * Change this if your popper should grow in a direction different from `right`\n       */\n      y: 'right'\n    },\n\n    /**\n     * Applies the computed styles to the popper element.\n     *\n     * All the DOM manipulations are limited to this modifier. This is useful in case\n     * you want to integrate Popper.js inside a framework or view library and you\n     * want to delegate all the DOM manipulations to it.\n     *\n     * Note that if you disable this modifier, you must make sure the popper element\n     * has its position set to `absolute` before Popper.js can do its work!\n     *\n     * Just disable this modifier and define your own to achieve the desired effect.\n     *\n     * @memberof modifiers\n     * @inner\n     */\n    applyStyle: {\n      /** @prop {number} order=900 - Index used to define the order of execution */\n      order: 900,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: applyStyle,\n      /** @prop {Function} */\n      onLoad: applyStyleOnLoad,\n      /**\n       * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier\n       * @prop {Boolean} gpuAcceleration=true\n       * If true, it uses the CSS 3D transformation to position the popper.\n       * Otherwise, it will use the `top` and `left` properties\n       */\n      gpuAcceleration: undefined\n    }\n  };\n\n  /**\n   * The `dataObject` is an object containing all the information used by Popper.js.\n   * This object is passed to modifiers and to the `onCreate` and `onUpdate` callbacks.\n   * @name dataObject\n   * @property {Object} data.instance The Popper.js instance\n   * @property {String} data.placement Placement applied to popper\n   * @property {String} data.originalPlacement Placement originally defined on init\n   * @property {Boolean} data.flipped True if popper has been flipped by flip modifier\n   * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper\n   * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier\n   * @property {Object} data.styles Any CSS property defined here will be applied to the popper. It expects the JavaScript nomenclature (eg. `marginBottom`)\n   * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow. It expects the JavaScript nomenclature (eg. `marginBottom`)\n   * @property {Object} data.boundaries Offsets of the popper boundaries\n   * @property {Object} data.offsets The measurements of popper, reference and arrow elements\n   * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values\n   * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values\n   * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0\n   */\n\n  /**\n   * Default options provided to Popper.js constructor.<br />\n   * These can be overridden using the `options` argument of Popper.js.<br />\n   * To override an option, simply pass an object with the same\n   * structure of the `options` object, as the 3rd argument. For example:\n   * ```\n   * new Popper(ref, pop, {\n   *   modifiers: {\n   *     preventOverflow: { enabled: false }\n   *   }\n   * })\n   * ```\n   * @type {Object}\n   * @static\n   * @memberof Popper\n   */\n  var Defaults = {\n    /**\n     * Popper's placement.\n     * @prop {Popper.placements} placement='bottom'\n     */\n    placement: 'bottom',\n\n    /**\n     * Set this to true if you want popper to position it self in 'fixed' mode\n     * @prop {Boolean} positionFixed=false\n     */\n    positionFixed: false,\n\n    /**\n     * Whether events (resize, scroll) are initially enabled.\n     * @prop {Boolean} eventsEnabled=true\n     */\n    eventsEnabled: true,\n\n    /**\n     * Set to true if you want to automatically remove the popper when\n     * you call the `destroy` method.\n     * @prop {Boolean} removeOnDestroy=false\n     */\n    removeOnDestroy: false,\n\n    /**\n     * Callback called when the popper is created.<br />\n     * By default, it is set to no-op.<br />\n     * Access Popper.js instance with `data.instance`.\n     * @prop {onCreate}\n     */\n    onCreate: function onCreate() {},\n\n    /**\n     * Callback called when the popper is updated. This callback is not called\n     * on the initialization/creation of the popper, but only on subsequent\n     * updates.<br />\n     * By default, it is set to no-op.<br />\n     * Access Popper.js instance with `data.instance`.\n     * @prop {onUpdate}\n     */\n    onUpdate: function onUpdate() {},\n\n    /**\n     * List of modifiers used to modify the offsets before they are applied to the popper.\n     * They provide most of the functionalities of Popper.js.\n     * @prop {modifiers}\n     */\n    modifiers: modifiers\n  };\n\n  /**\n   * @callback onCreate\n   * @param {dataObject} data\n   */\n\n  /**\n   * @callback onUpdate\n   * @param {dataObject} data\n   */\n\n  // Utils\n  // Methods\n  var Popper = function () {\n    /**\n     * Creates a new Popper.js instance.\n     * @class Popper\n     * @param {HTMLElement|referenceObject} reference - The reference element used to position the popper\n     * @param {HTMLElement} popper - The HTML element used as the popper\n     * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)\n     * @return {Object} instance - The generated Popper.js instance\n     */\n    function Popper(reference, popper) {\n      var _this = this;\n\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      classCallCheck(this, Popper);\n\n      this.scheduleUpdate = function () {\n        return requestAnimationFrame(_this.update);\n      };\n\n      // make update() debounced, so that it only runs at most once-per-tick\n      this.update = debounce(this.update.bind(this));\n\n      // with {} we create a new object with the options inside it\n      this.options = _extends({}, Popper.Defaults, options);\n\n      // init state\n      this.state = {\n        isDestroyed: false,\n        isCreated: false,\n        scrollParents: []\n      };\n\n      // get reference and popper elements (allow jQuery wrappers)\n      this.reference = reference && reference.jquery ? reference[0] : reference;\n      this.popper = popper && popper.jquery ? popper[0] : popper;\n\n      // Deep merge modifiers options\n      this.options.modifiers = {};\n      Object.keys(_extends({}, Popper.Defaults.modifiers, options.modifiers)).forEach(function (name) {\n        _this.options.modifiers[name] = _extends({}, Popper.Defaults.modifiers[name] || {}, options.modifiers ? options.modifiers[name] : {});\n      });\n\n      // Refactoring modifiers' list (Object => Array)\n      this.modifiers = Object.keys(this.options.modifiers).map(function (name) {\n        return _extends({\n          name: name\n        }, _this.options.modifiers[name]);\n      })\n      // sort the modifiers by order\n      .sort(function (a, b) {\n        return a.order - b.order;\n      });\n\n      // modifiers have the ability to execute arbitrary code when Popper.js get inited\n      // such code is executed in the same order of its modifier\n      // they could add new properties to their options configuration\n      // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`!\n      this.modifiers.forEach(function (modifierOptions) {\n        if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) {\n          modifierOptions.onLoad(_this.reference, _this.popper, _this.options, modifierOptions, _this.state);\n        }\n      });\n\n      // fire the first update to position the popper in the right place\n      this.update();\n\n      var eventsEnabled = this.options.eventsEnabled;\n      if (eventsEnabled) {\n        // setup event listeners, they will take care of update the position in specific situations\n        this.enableEventListeners();\n      }\n\n      this.state.eventsEnabled = eventsEnabled;\n    }\n\n    // We can't use class properties because they don't get listed in the\n    // class prototype and break stuff like Sinon stubs\n\n\n    createClass(Popper, [{\n      key: 'update',\n      value: function update$$1() {\n        return update.call(this);\n      }\n    }, {\n      key: 'destroy',\n      value: function destroy$$1() {\n        return destroy.call(this);\n      }\n    }, {\n      key: 'enableEventListeners',\n      value: function enableEventListeners$$1() {\n        return enableEventListeners.call(this);\n      }\n    }, {\n      key: 'disableEventListeners',\n      value: function disableEventListeners$$1() {\n        return disableEventListeners.call(this);\n      }\n\n      /**\n       * Schedules an update. It will run on the next UI update available.\n       * @method scheduleUpdate\n       * @memberof Popper\n       */\n\n\n      /**\n       * Collection of utilities useful when writing custom modifiers.\n       * Starting from version 1.7, this method is available only if you\n       * include `popper-utils.js` before `popper.js`.\n       *\n       * **DEPRECATION**: This way to access PopperUtils is deprecated\n       * and will be removed in v2! Use the PopperUtils module directly instead.\n       * Due to the high instability of the methods contained in Utils, we can't\n       * guarantee them to follow semver. Use them at your own risk!\n       * @static\n       * @private\n       * @type {Object}\n       * @deprecated since version 1.8\n       * @member Utils\n       * @memberof Popper\n       */\n\n    }]);\n    return Popper;\n  }();\n\n  /**\n   * The `referenceObject` is an object that provides an interface compatible with Popper.js\n   * and lets you use it as replacement of a real DOM node.<br />\n   * You can use this method to position a popper relatively to a set of coordinates\n   * in case you don't have a DOM node to use as reference.\n   *\n   * ```\n   * new Popper(referenceObject, popperNode);\n   * ```\n   *\n   * NB: This feature isn't supported in Internet Explorer 10.\n   * @name referenceObject\n   * @property {Function} data.getBoundingClientRect\n   * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method.\n   * @property {number} data.clientWidth\n   * An ES6 getter that will return the width of the virtual reference element.\n   * @property {number} data.clientHeight\n   * An ES6 getter that will return the height of the virtual reference element.\n   */\n\n\n  Popper.Utils = (typeof window !== 'undefined' ? window : global).PopperUtils;\n  Popper.placements = placements;\n  Popper.Defaults = Defaults;\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$4 = 'dropdown';\n  var VERSION$4 = '4.3.1';\n  var DATA_KEY$4 = 'bs.dropdown';\n  var EVENT_KEY$4 = \".\" + DATA_KEY$4;\n  var DATA_API_KEY$4 = '.data-api';\n  var JQUERY_NO_CONFLICT$4 = $.fn[NAME$4];\n  var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key\n\n  var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key\n\n  var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key\n\n  var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key\n\n  var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key\n\n  var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)\n\n  var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + \"|\" + ARROW_DOWN_KEYCODE + \"|\" + ESCAPE_KEYCODE);\n  var Event$4 = {\n    HIDE: \"hide\" + EVENT_KEY$4,\n    HIDDEN: \"hidden\" + EVENT_KEY$4,\n    SHOW: \"show\" + EVENT_KEY$4,\n    SHOWN: \"shown\" + EVENT_KEY$4,\n    CLICK: \"click\" + EVENT_KEY$4,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$4 + DATA_API_KEY$4,\n    KEYDOWN_DATA_API: \"keydown\" + EVENT_KEY$4 + DATA_API_KEY$4,\n    KEYUP_DATA_API: \"keyup\" + EVENT_KEY$4 + DATA_API_KEY$4\n  };\n  var ClassName$4 = {\n    DISABLED: 'disabled',\n    SHOW: 'show',\n    DROPUP: 'dropup',\n    DROPRIGHT: 'dropright',\n    DROPLEFT: 'dropleft',\n    MENURIGHT: 'dropdown-menu-right',\n    MENULEFT: 'dropdown-menu-left',\n    POSITION_STATIC: 'position-static'\n  };\n  var Selector$4 = {\n    DATA_TOGGLE: '[data-toggle=\"dropdown\"]',\n    FORM_CHILD: '.dropdown form',\n    MENU: '.dropdown-menu',\n    NAVBAR_NAV: '.navbar-nav',\n    VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n  };\n  var AttachmentMap = {\n    TOP: 'top-start',\n    TOPEND: 'top-end',\n    BOTTOM: 'bottom-start',\n    BOTTOMEND: 'bottom-end',\n    RIGHT: 'right-start',\n    RIGHTEND: 'right-end',\n    LEFT: 'left-start',\n    LEFTEND: 'left-end'\n  };\n  var Default$2 = {\n    offset: 0,\n    flip: true,\n    boundary: 'scrollParent',\n    reference: 'toggle',\n    display: 'dynamic'\n  };\n  var DefaultType$2 = {\n    offset: '(number|string|function)',\n    flip: 'boolean',\n    boundary: '(string|element)',\n    reference: '(string|element)',\n    display: 'string'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Dropdown =\n  /*#__PURE__*/\n  function () {\n    function Dropdown(element, config) {\n      this._element = element;\n      this._popper = null;\n      this._config = this._getConfig(config);\n      this._menu = this._getMenuElement();\n      this._inNavbar = this._detectNavbar();\n\n      this._addEventListeners();\n    } // Getters\n\n\n    var _proto = Dropdown.prototype;\n\n    // Public\n    _proto.toggle = function toggle() {\n      if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED)) {\n        return;\n      }\n\n      var parent = Dropdown._getParentFromElement(this._element);\n\n      var isActive = $(this._menu).hasClass(ClassName$4.SHOW);\n\n      Dropdown._clearMenus();\n\n      if (isActive) {\n        return;\n      }\n\n      var relatedTarget = {\n        relatedTarget: this._element\n      };\n      var showEvent = $.Event(Event$4.SHOW, relatedTarget);\n      $(parent).trigger(showEvent);\n\n      if (showEvent.isDefaultPrevented()) {\n        return;\n      } // Disable totally Popper.js for Dropdown in Navbar\n\n\n      if (!this._inNavbar) {\n        /**\n         * Check for Popper dependency\n         * Popper - https://popper.js.org\n         */\n        if (typeof Popper === 'undefined') {\n          throw new TypeError('Bootstrap\\'s dropdowns require Popper.js (https://popper.js.org/)');\n        }\n\n        var referenceElement = this._element;\n\n        if (this._config.reference === 'parent') {\n          referenceElement = parent;\n        } else if (Util.isElement(this._config.reference)) {\n          referenceElement = this._config.reference; // Check if it's jQuery element\n\n          if (typeof this._config.reference.jquery !== 'undefined') {\n            referenceElement = this._config.reference[0];\n          }\n        } // If boundary is not `scrollParent`, then set position to `static`\n        // to allow the menu to \"escape\" the scroll parent's boundaries\n        // https://github.com/twbs/bootstrap/issues/24251\n\n\n        if (this._config.boundary !== 'scrollParent') {\n          $(parent).addClass(ClassName$4.POSITION_STATIC);\n        }\n\n        this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig());\n      } // If this is a touch-enabled device we add extra\n      // empty mouseover listeners to the body's immediate children;\n      // only needed because of broken event delegation on iOS\n      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n\n      if ('ontouchstart' in document.documentElement && $(parent).closest(Selector$4.NAVBAR_NAV).length === 0) {\n        $(document.body).children().on('mouseover', null, $.noop);\n      }\n\n      this._element.focus();\n\n      this._element.setAttribute('aria-expanded', true);\n\n      $(this._menu).toggleClass(ClassName$4.SHOW);\n      $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget));\n    };\n\n    _proto.show = function show() {\n      if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || $(this._menu).hasClass(ClassName$4.SHOW)) {\n        return;\n      }\n\n      var relatedTarget = {\n        relatedTarget: this._element\n      };\n      var showEvent = $.Event(Event$4.SHOW, relatedTarget);\n\n      var parent = Dropdown._getParentFromElement(this._element);\n\n      $(parent).trigger(showEvent);\n\n      if (showEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      $(this._menu).toggleClass(ClassName$4.SHOW);\n      $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget));\n    };\n\n    _proto.hide = function hide() {\n      if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || !$(this._menu).hasClass(ClassName$4.SHOW)) {\n        return;\n      }\n\n      var relatedTarget = {\n        relatedTarget: this._element\n      };\n      var hideEvent = $.Event(Event$4.HIDE, relatedTarget);\n\n      var parent = Dropdown._getParentFromElement(this._element);\n\n      $(parent).trigger(hideEvent);\n\n      if (hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      $(this._menu).toggleClass(ClassName$4.SHOW);\n      $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$4);\n      $(this._element).off(EVENT_KEY$4);\n      this._element = null;\n      this._menu = null;\n\n      if (this._popper !== null) {\n        this._popper.destroy();\n\n        this._popper = null;\n      }\n    };\n\n    _proto.update = function update() {\n      this._inNavbar = this._detectNavbar();\n\n      if (this._popper !== null) {\n        this._popper.scheduleUpdate();\n      }\n    } // Private\n    ;\n\n    _proto._addEventListeners = function _addEventListeners() {\n      var _this = this;\n\n      $(this._element).on(Event$4.CLICK, function (event) {\n        event.preventDefault();\n        event.stopPropagation();\n\n        _this.toggle();\n      });\n    };\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, this.constructor.Default, $(this._element).data(), config);\n      Util.typeCheckConfig(NAME$4, config, this.constructor.DefaultType);\n      return config;\n    };\n\n    _proto._getMenuElement = function _getMenuElement() {\n      if (!this._menu) {\n        var parent = Dropdown._getParentFromElement(this._element);\n\n        if (parent) {\n          this._menu = parent.querySelector(Selector$4.MENU);\n        }\n      }\n\n      return this._menu;\n    };\n\n    _proto._getPlacement = function _getPlacement() {\n      var $parentDropdown = $(this._element.parentNode);\n      var placement = AttachmentMap.BOTTOM; // Handle dropup\n\n      if ($parentDropdown.hasClass(ClassName$4.DROPUP)) {\n        placement = AttachmentMap.TOP;\n\n        if ($(this._menu).hasClass(ClassName$4.MENURIGHT)) {\n          placement = AttachmentMap.TOPEND;\n        }\n      } else if ($parentDropdown.hasClass(ClassName$4.DROPRIGHT)) {\n        placement = AttachmentMap.RIGHT;\n      } else if ($parentDropdown.hasClass(ClassName$4.DROPLEFT)) {\n        placement = AttachmentMap.LEFT;\n      } else if ($(this._menu).hasClass(ClassName$4.MENURIGHT)) {\n        placement = AttachmentMap.BOTTOMEND;\n      }\n\n      return placement;\n    };\n\n    _proto._detectNavbar = function _detectNavbar() {\n      return $(this._element).closest('.navbar').length > 0;\n    };\n\n    _proto._getOffset = function _getOffset() {\n      var _this2 = this;\n\n      var offset = {};\n\n      if (typeof this._config.offset === 'function') {\n        offset.fn = function (data) {\n          data.offsets = _objectSpread({}, data.offsets, _this2._config.offset(data.offsets, _this2._element) || {});\n          return data;\n        };\n      } else {\n        offset.offset = this._config.offset;\n      }\n\n      return offset;\n    };\n\n    _proto._getPopperConfig = function _getPopperConfig() {\n      var popperConfig = {\n        placement: this._getPlacement(),\n        modifiers: {\n          offset: this._getOffset(),\n          flip: {\n            enabled: this._config.flip\n          },\n          preventOverflow: {\n            boundariesElement: this._config.boundary\n          }\n        } // Disable Popper.js if we have a static display\n\n      };\n\n      if (this._config.display === 'static') {\n        popperConfig.modifiers.applyStyle = {\n          enabled: false\n        };\n      }\n\n      return popperConfig;\n    } // Static\n    ;\n\n    Dropdown._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$4);\n\n        var _config = typeof config === 'object' ? config : null;\n\n        if (!data) {\n          data = new Dropdown(this, _config);\n          $(this).data(DATA_KEY$4, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    Dropdown._clearMenus = function _clearMenus(event) {\n      if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) {\n        return;\n      }\n\n      var toggles = [].slice.call(document.querySelectorAll(Selector$4.DATA_TOGGLE));\n\n      for (var i = 0, len = toggles.length; i < len; i++) {\n        var parent = Dropdown._getParentFromElement(toggles[i]);\n\n        var context = $(toggles[i]).data(DATA_KEY$4);\n        var relatedTarget = {\n          relatedTarget: toggles[i]\n        };\n\n        if (event && event.type === 'click') {\n          relatedTarget.clickEvent = event;\n        }\n\n        if (!context) {\n          continue;\n        }\n\n        var dropdownMenu = context._menu;\n\n        if (!$(parent).hasClass(ClassName$4.SHOW)) {\n          continue;\n        }\n\n        if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $.contains(parent, event.target)) {\n          continue;\n        }\n\n        var hideEvent = $.Event(Event$4.HIDE, relatedTarget);\n        $(parent).trigger(hideEvent);\n\n        if (hideEvent.isDefaultPrevented()) {\n          continue;\n        } // If this is a touch-enabled device we remove the extra\n        // empty mouseover listeners we added for iOS support\n\n\n        if ('ontouchstart' in document.documentElement) {\n          $(document.body).children().off('mouseover', null, $.noop);\n        }\n\n        toggles[i].setAttribute('aria-expanded', 'false');\n        $(dropdownMenu).removeClass(ClassName$4.SHOW);\n        $(parent).removeClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));\n      }\n    };\n\n    Dropdown._getParentFromElement = function _getParentFromElement(element) {\n      var parent;\n      var selector = Util.getSelectorFromElement(element);\n\n      if (selector) {\n        parent = document.querySelector(selector);\n      }\n\n      return parent || element.parentNode;\n    } // eslint-disable-next-line complexity\n    ;\n\n    Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {\n      // If not input/textarea:\n      //  - And not a key in REGEXP_KEYDOWN => not a dropdown command\n      // If input/textarea:\n      //  - If space key => not a dropdown command\n      //  - If key is other than escape\n      //    - If key is not up or down => not a dropdown command\n      //    - If trigger inside the menu => not a dropdown command\n      if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $(event.target).closest(Selector$4.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {\n        return;\n      }\n\n      event.preventDefault();\n      event.stopPropagation();\n\n      if (this.disabled || $(this).hasClass(ClassName$4.DISABLED)) {\n        return;\n      }\n\n      var parent = Dropdown._getParentFromElement(this);\n\n      var isActive = $(parent).hasClass(ClassName$4.SHOW);\n\n      if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {\n        if (event.which === ESCAPE_KEYCODE) {\n          var toggle = parent.querySelector(Selector$4.DATA_TOGGLE);\n          $(toggle).trigger('focus');\n        }\n\n        $(this).trigger('click');\n        return;\n      }\n\n      var items = [].slice.call(parent.querySelectorAll(Selector$4.VISIBLE_ITEMS));\n\n      if (items.length === 0) {\n        return;\n      }\n\n      var index = items.indexOf(event.target);\n\n      if (event.which === ARROW_UP_KEYCODE && index > 0) {\n        // Up\n        index--;\n      }\n\n      if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {\n        // Down\n        index++;\n      }\n\n      if (index < 0) {\n        index = 0;\n      }\n\n      items[index].focus();\n    };\n\n    _createClass(Dropdown, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$4;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$2;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType$2;\n      }\n    }]);\n\n    return Dropdown;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$4.KEYDOWN_DATA_API, Selector$4.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event$4.KEYDOWN_DATA_API, Selector$4.MENU, Dropdown._dataApiKeydownHandler).on(Event$4.CLICK_DATA_API + \" \" + Event$4.KEYUP_DATA_API, Dropdown._clearMenus).on(Event$4.CLICK_DATA_API, Selector$4.DATA_TOGGLE, function (event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    Dropdown._jQueryInterface.call($(this), 'toggle');\n  }).on(Event$4.CLICK_DATA_API, Selector$4.FORM_CHILD, function (e) {\n    e.stopPropagation();\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$4] = Dropdown._jQueryInterface;\n  $.fn[NAME$4].Constructor = Dropdown;\n\n  $.fn[NAME$4].noConflict = function () {\n    $.fn[NAME$4] = JQUERY_NO_CONFLICT$4;\n    return Dropdown._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$5 = 'modal';\n  var VERSION$5 = '4.3.1';\n  var DATA_KEY$5 = 'bs.modal';\n  var EVENT_KEY$5 = \".\" + DATA_KEY$5;\n  var DATA_API_KEY$5 = '.data-api';\n  var JQUERY_NO_CONFLICT$5 = $.fn[NAME$5];\n  var ESCAPE_KEYCODE$1 = 27; // KeyboardEvent.which value for Escape (Esc) key\n\n  var Default$3 = {\n    backdrop: true,\n    keyboard: true,\n    focus: true,\n    show: true\n  };\n  var DefaultType$3 = {\n    backdrop: '(boolean|string)',\n    keyboard: 'boolean',\n    focus: 'boolean',\n    show: 'boolean'\n  };\n  var Event$5 = {\n    HIDE: \"hide\" + EVENT_KEY$5,\n    HIDDEN: \"hidden\" + EVENT_KEY$5,\n    SHOW: \"show\" + EVENT_KEY$5,\n    SHOWN: \"shown\" + EVENT_KEY$5,\n    FOCUSIN: \"focusin\" + EVENT_KEY$5,\n    RESIZE: \"resize\" + EVENT_KEY$5,\n    CLICK_DISMISS: \"click.dismiss\" + EVENT_KEY$5,\n    KEYDOWN_DISMISS: \"keydown.dismiss\" + EVENT_KEY$5,\n    MOUSEUP_DISMISS: \"mouseup.dismiss\" + EVENT_KEY$5,\n    MOUSEDOWN_DISMISS: \"mousedown.dismiss\" + EVENT_KEY$5,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$5 + DATA_API_KEY$5\n  };\n  var ClassName$5 = {\n    SCROLLABLE: 'modal-dialog-scrollable',\n    SCROLLBAR_MEASURER: 'modal-scrollbar-measure',\n    BACKDROP: 'modal-backdrop',\n    OPEN: 'modal-open',\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector$5 = {\n    DIALOG: '.modal-dialog',\n    MODAL_BODY: '.modal-body',\n    DATA_TOGGLE: '[data-toggle=\"modal\"]',\n    DATA_DISMISS: '[data-dismiss=\"modal\"]',\n    FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',\n    STICKY_CONTENT: '.sticky-top'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Modal =\n  /*#__PURE__*/\n  function () {\n    function Modal(element, config) {\n      this._config = this._getConfig(config);\n      this._element = element;\n      this._dialog = element.querySelector(Selector$5.DIALOG);\n      this._backdrop = null;\n      this._isShown = false;\n      this._isBodyOverflowing = false;\n      this._ignoreBackdropClick = false;\n      this._isTransitioning = false;\n      this._scrollbarWidth = 0;\n    } // Getters\n\n\n    var _proto = Modal.prototype;\n\n    // Public\n    _proto.toggle = function toggle(relatedTarget) {\n      return this._isShown ? this.hide() : this.show(relatedTarget);\n    };\n\n    _proto.show = function show(relatedTarget) {\n      var _this = this;\n\n      if (this._isShown || this._isTransitioning) {\n        return;\n      }\n\n      if ($(this._element).hasClass(ClassName$5.FADE)) {\n        this._isTransitioning = true;\n      }\n\n      var showEvent = $.Event(Event$5.SHOW, {\n        relatedTarget: relatedTarget\n      });\n      $(this._element).trigger(showEvent);\n\n      if (this._isShown || showEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      this._isShown = true;\n\n      this._checkScrollbar();\n\n      this._setScrollbar();\n\n      this._adjustDialog();\n\n      this._setEscapeEvent();\n\n      this._setResizeEvent();\n\n      $(this._element).on(Event$5.CLICK_DISMISS, Selector$5.DATA_DISMISS, function (event) {\n        return _this.hide(event);\n      });\n      $(this._dialog).on(Event$5.MOUSEDOWN_DISMISS, function () {\n        $(_this._element).one(Event$5.MOUSEUP_DISMISS, function (event) {\n          if ($(event.target).is(_this._element)) {\n            _this._ignoreBackdropClick = true;\n          }\n        });\n      });\n\n      this._showBackdrop(function () {\n        return _this._showElement(relatedTarget);\n      });\n    };\n\n    _proto.hide = function hide(event) {\n      var _this2 = this;\n\n      if (event) {\n        event.preventDefault();\n      }\n\n      if (!this._isShown || this._isTransitioning) {\n        return;\n      }\n\n      var hideEvent = $.Event(Event$5.HIDE);\n      $(this._element).trigger(hideEvent);\n\n      if (!this._isShown || hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      this._isShown = false;\n      var transition = $(this._element).hasClass(ClassName$5.FADE);\n\n      if (transition) {\n        this._isTransitioning = true;\n      }\n\n      this._setEscapeEvent();\n\n      this._setResizeEvent();\n\n      $(document).off(Event$5.FOCUSIN);\n      $(this._element).removeClass(ClassName$5.SHOW);\n      $(this._element).off(Event$5.CLICK_DISMISS);\n      $(this._dialog).off(Event$5.MOUSEDOWN_DISMISS);\n\n      if (transition) {\n        var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n        $(this._element).one(Util.TRANSITION_END, function (event) {\n          return _this2._hideModal(event);\n        }).emulateTransitionEnd(transitionDuration);\n      } else {\n        this._hideModal();\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      [window, this._element, this._dialog].forEach(function (htmlElement) {\n        return $(htmlElement).off(EVENT_KEY$5);\n      });\n      /**\n       * `document` has 2 events `Event.FOCUSIN` and `Event.CLICK_DATA_API`\n       * Do not move `document` in `htmlElements` array\n       * It will remove `Event.CLICK_DATA_API` event that should remain\n       */\n\n      $(document).off(Event$5.FOCUSIN);\n      $.removeData(this._element, DATA_KEY$5);\n      this._config = null;\n      this._element = null;\n      this._dialog = null;\n      this._backdrop = null;\n      this._isShown = null;\n      this._isBodyOverflowing = null;\n      this._ignoreBackdropClick = null;\n      this._isTransitioning = null;\n      this._scrollbarWidth = null;\n    };\n\n    _proto.handleUpdate = function handleUpdate() {\n      this._adjustDialog();\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default$3, config);\n      Util.typeCheckConfig(NAME$5, config, DefaultType$3);\n      return config;\n    };\n\n    _proto._showElement = function _showElement(relatedTarget) {\n      var _this3 = this;\n\n      var transition = $(this._element).hasClass(ClassName$5.FADE);\n\n      if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n        // Don't move modal's DOM position\n        document.body.appendChild(this._element);\n      }\n\n      this._element.style.display = 'block';\n\n      this._element.removeAttribute('aria-hidden');\n\n      this._element.setAttribute('aria-modal', true);\n\n      if ($(this._dialog).hasClass(ClassName$5.SCROLLABLE)) {\n        this._dialog.querySelector(Selector$5.MODAL_BODY).scrollTop = 0;\n      } else {\n        this._element.scrollTop = 0;\n      }\n\n      if (transition) {\n        Util.reflow(this._element);\n      }\n\n      $(this._element).addClass(ClassName$5.SHOW);\n\n      if (this._config.focus) {\n        this._enforceFocus();\n      }\n\n      var shownEvent = $.Event(Event$5.SHOWN, {\n        relatedTarget: relatedTarget\n      });\n\n      var transitionComplete = function transitionComplete() {\n        if (_this3._config.focus) {\n          _this3._element.focus();\n        }\n\n        _this3._isTransitioning = false;\n        $(_this3._element).trigger(shownEvent);\n      };\n\n      if (transition) {\n        var transitionDuration = Util.getTransitionDurationFromElement(this._dialog);\n        $(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(transitionDuration);\n      } else {\n        transitionComplete();\n      }\n    };\n\n    _proto._enforceFocus = function _enforceFocus() {\n      var _this4 = this;\n\n      $(document).off(Event$5.FOCUSIN) // Guard against infinite focus loop\n      .on(Event$5.FOCUSIN, function (event) {\n        if (document !== event.target && _this4._element !== event.target && $(_this4._element).has(event.target).length === 0) {\n          _this4._element.focus();\n        }\n      });\n    };\n\n    _proto._setEscapeEvent = function _setEscapeEvent() {\n      var _this5 = this;\n\n      if (this._isShown && this._config.keyboard) {\n        $(this._element).on(Event$5.KEYDOWN_DISMISS, function (event) {\n          if (event.which === ESCAPE_KEYCODE$1) {\n            event.preventDefault();\n\n            _this5.hide();\n          }\n        });\n      } else if (!this._isShown) {\n        $(this._element).off(Event$5.KEYDOWN_DISMISS);\n      }\n    };\n\n    _proto._setResizeEvent = function _setResizeEvent() {\n      var _this6 = this;\n\n      if (this._isShown) {\n        $(window).on(Event$5.RESIZE, function (event) {\n          return _this6.handleUpdate(event);\n        });\n      } else {\n        $(window).off(Event$5.RESIZE);\n      }\n    };\n\n    _proto._hideModal = function _hideModal() {\n      var _this7 = this;\n\n      this._element.style.display = 'none';\n\n      this._element.setAttribute('aria-hidden', true);\n\n      this._element.removeAttribute('aria-modal');\n\n      this._isTransitioning = false;\n\n      this._showBackdrop(function () {\n        $(document.body).removeClass(ClassName$5.OPEN);\n\n        _this7._resetAdjustments();\n\n        _this7._resetScrollbar();\n\n        $(_this7._element).trigger(Event$5.HIDDEN);\n      });\n    };\n\n    _proto._removeBackdrop = function _removeBackdrop() {\n      if (this._backdrop) {\n        $(this._backdrop).remove();\n        this._backdrop = null;\n      }\n    };\n\n    _proto._showBackdrop = function _showBackdrop(callback) {\n      var _this8 = this;\n\n      var animate = $(this._element).hasClass(ClassName$5.FADE) ? ClassName$5.FADE : '';\n\n      if (this._isShown && this._config.backdrop) {\n        this._backdrop = document.createElement('div');\n        this._backdrop.className = ClassName$5.BACKDROP;\n\n        if (animate) {\n          this._backdrop.classList.add(animate);\n        }\n\n        $(this._backdrop).appendTo(document.body);\n        $(this._element).on(Event$5.CLICK_DISMISS, function (event) {\n          if (_this8._ignoreBackdropClick) {\n            _this8._ignoreBackdropClick = false;\n            return;\n          }\n\n          if (event.target !== event.currentTarget) {\n            return;\n          }\n\n          if (_this8._config.backdrop === 'static') {\n            _this8._element.focus();\n          } else {\n            _this8.hide();\n          }\n        });\n\n        if (animate) {\n          Util.reflow(this._backdrop);\n        }\n\n        $(this._backdrop).addClass(ClassName$5.SHOW);\n\n        if (!callback) {\n          return;\n        }\n\n        if (!animate) {\n          callback();\n          return;\n        }\n\n        var backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);\n        $(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(backdropTransitionDuration);\n      } else if (!this._isShown && this._backdrop) {\n        $(this._backdrop).removeClass(ClassName$5.SHOW);\n\n        var callbackRemove = function callbackRemove() {\n          _this8._removeBackdrop();\n\n          if (callback) {\n            callback();\n          }\n        };\n\n        if ($(this._element).hasClass(ClassName$5.FADE)) {\n          var _backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);\n\n          $(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(_backdropTransitionDuration);\n        } else {\n          callbackRemove();\n        }\n      } else if (callback) {\n        callback();\n      }\n    } // ----------------------------------------------------------------------\n    // the following methods are used to handle overflowing modals\n    // todo (fat): these should probably be refactored out of modal.js\n    // ----------------------------------------------------------------------\n    ;\n\n    _proto._adjustDialog = function _adjustDialog() {\n      var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n\n      if (!this._isBodyOverflowing && isModalOverflowing) {\n        this._element.style.paddingLeft = this._scrollbarWidth + \"px\";\n      }\n\n      if (this._isBodyOverflowing && !isModalOverflowing) {\n        this._element.style.paddingRight = this._scrollbarWidth + \"px\";\n      }\n    };\n\n    _proto._resetAdjustments = function _resetAdjustments() {\n      this._element.style.paddingLeft = '';\n      this._element.style.paddingRight = '';\n    };\n\n    _proto._checkScrollbar = function _checkScrollbar() {\n      var rect = document.body.getBoundingClientRect();\n      this._isBodyOverflowing = rect.left + rect.right < window.innerWidth;\n      this._scrollbarWidth = this._getScrollbarWidth();\n    };\n\n    _proto._setScrollbar = function _setScrollbar() {\n      var _this9 = this;\n\n      if (this._isBodyOverflowing) {\n        // Note: DOMNode.style.paddingRight returns the actual value or '' if not set\n        //   while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set\n        var fixedContent = [].slice.call(document.querySelectorAll(Selector$5.FIXED_CONTENT));\n        var stickyContent = [].slice.call(document.querySelectorAll(Selector$5.STICKY_CONTENT)); // Adjust fixed content padding\n\n        $(fixedContent).each(function (index, element) {\n          var actualPadding = element.style.paddingRight;\n          var calculatedPadding = $(element).css('padding-right');\n          $(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this9._scrollbarWidth + \"px\");\n        }); // Adjust sticky content margin\n\n        $(stickyContent).each(function (index, element) {\n          var actualMargin = element.style.marginRight;\n          var calculatedMargin = $(element).css('margin-right');\n          $(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this9._scrollbarWidth + \"px\");\n        }); // Adjust body padding\n\n        var actualPadding = document.body.style.paddingRight;\n        var calculatedPadding = $(document.body).css('padding-right');\n        $(document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + \"px\");\n      }\n\n      $(document.body).addClass(ClassName$5.OPEN);\n    };\n\n    _proto._resetScrollbar = function _resetScrollbar() {\n      // Restore fixed content padding\n      var fixedContent = [].slice.call(document.querySelectorAll(Selector$5.FIXED_CONTENT));\n      $(fixedContent).each(function (index, element) {\n        var padding = $(element).data('padding-right');\n        $(element).removeData('padding-right');\n        element.style.paddingRight = padding ? padding : '';\n      }); // Restore sticky content\n\n      var elements = [].slice.call(document.querySelectorAll(\"\" + Selector$5.STICKY_CONTENT));\n      $(elements).each(function (index, element) {\n        var margin = $(element).data('margin-right');\n\n        if (typeof margin !== 'undefined') {\n          $(element).css('margin-right', margin).removeData('margin-right');\n        }\n      }); // Restore body padding\n\n      var padding = $(document.body).data('padding-right');\n      $(document.body).removeData('padding-right');\n      document.body.style.paddingRight = padding ? padding : '';\n    };\n\n    _proto._getScrollbarWidth = function _getScrollbarWidth() {\n      // thx d.walsh\n      var scrollDiv = document.createElement('div');\n      scrollDiv.className = ClassName$5.SCROLLBAR_MEASURER;\n      document.body.appendChild(scrollDiv);\n      var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;\n      document.body.removeChild(scrollDiv);\n      return scrollbarWidth;\n    } // Static\n    ;\n\n    Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$5);\n\n        var _config = _objectSpread({}, Default$3, $(this).data(), typeof config === 'object' && config ? config : {});\n\n        if (!data) {\n          data = new Modal(this, _config);\n          $(this).data(DATA_KEY$5, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config](relatedTarget);\n        } else if (_config.show) {\n          data.show(relatedTarget);\n        }\n      });\n    };\n\n    _createClass(Modal, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$5;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$3;\n      }\n    }]);\n\n    return Modal;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$5.CLICK_DATA_API, Selector$5.DATA_TOGGLE, function (event) {\n    var _this10 = this;\n\n    var target;\n    var selector = Util.getSelectorFromElement(this);\n\n    if (selector) {\n      target = document.querySelector(selector);\n    }\n\n    var config = $(target).data(DATA_KEY$5) ? 'toggle' : _objectSpread({}, $(target).data(), $(this).data());\n\n    if (this.tagName === 'A' || this.tagName === 'AREA') {\n      event.preventDefault();\n    }\n\n    var $target = $(target).one(Event$5.SHOW, function (showEvent) {\n      if (showEvent.isDefaultPrevented()) {\n        // Only register focus restorer if modal will actually get shown\n        return;\n      }\n\n      $target.one(Event$5.HIDDEN, function () {\n        if ($(_this10).is(':visible')) {\n          _this10.focus();\n        }\n      });\n    });\n\n    Modal._jQueryInterface.call($(target), config, this);\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$5] = Modal._jQueryInterface;\n  $.fn[NAME$5].Constructor = Modal;\n\n  $.fn[NAME$5].noConflict = function () {\n    $.fn[NAME$5] = JQUERY_NO_CONFLICT$5;\n    return Modal._jQueryInterface;\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.3.1): tools/sanitizer.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  var uriAttrs = ['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href'];\n  var ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i;\n  var DefaultWhitelist = {\n    // Global attributes allowed on any supplied element below.\n    '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n    a: ['target', 'href', 'title', 'rel'],\n    area: [],\n    b: [],\n    br: [],\n    col: [],\n    code: [],\n    div: [],\n    em: [],\n    hr: [],\n    h1: [],\n    h2: [],\n    h3: [],\n    h4: [],\n    h5: [],\n    h6: [],\n    i: [],\n    img: ['src', 'alt', 'title', 'width', 'height'],\n    li: [],\n    ol: [],\n    p: [],\n    pre: [],\n    s: [],\n    small: [],\n    span: [],\n    sub: [],\n    sup: [],\n    strong: [],\n    u: [],\n    ul: []\n    /**\n     * A pattern that recognizes a commonly useful subset of URLs that are safe.\n     *\n     * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n     */\n\n  };\n  var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi;\n  /**\n   * A pattern that matches safe data URLs. Only matches image, video and audio types.\n   *\n   * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n   */\n\n  var DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i;\n\n  function allowedAttribute(attr, allowedAttributeList) {\n    var attrName = attr.nodeName.toLowerCase();\n\n    if (allowedAttributeList.indexOf(attrName) !== -1) {\n      if (uriAttrs.indexOf(attrName) !== -1) {\n        return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN));\n      }\n\n      return true;\n    }\n\n    var regExp = allowedAttributeList.filter(function (attrRegex) {\n      return attrRegex instanceof RegExp;\n    }); // Check if a regular expression validates the attribute.\n\n    for (var i = 0, l = regExp.length; i < l; i++) {\n      if (attrName.match(regExp[i])) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {\n    if (unsafeHtml.length === 0) {\n      return unsafeHtml;\n    }\n\n    if (sanitizeFn && typeof sanitizeFn === 'function') {\n      return sanitizeFn(unsafeHtml);\n    }\n\n    var domParser = new window.DOMParser();\n    var createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');\n    var whitelistKeys = Object.keys(whiteList);\n    var elements = [].slice.call(createdDocument.body.querySelectorAll('*'));\n\n    var _loop = function _loop(i, len) {\n      var el = elements[i];\n      var elName = el.nodeName.toLowerCase();\n\n      if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) {\n        el.parentNode.removeChild(el);\n        return \"continue\";\n      }\n\n      var attributeList = [].slice.call(el.attributes);\n      var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || []);\n      attributeList.forEach(function (attr) {\n        if (!allowedAttribute(attr, whitelistedAttributes)) {\n          el.removeAttribute(attr.nodeName);\n        }\n      });\n    };\n\n    for (var i = 0, len = elements.length; i < len; i++) {\n      var _ret = _loop(i, len);\n\n      if (_ret === \"continue\") continue;\n    }\n\n    return createdDocument.body.innerHTML;\n  }\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$6 = 'tooltip';\n  var VERSION$6 = '4.3.1';\n  var DATA_KEY$6 = 'bs.tooltip';\n  var EVENT_KEY$6 = \".\" + DATA_KEY$6;\n  var JQUERY_NO_CONFLICT$6 = $.fn[NAME$6];\n  var CLASS_PREFIX = 'bs-tooltip';\n  var BSCLS_PREFIX_REGEX = new RegExp(\"(^|\\\\s)\" + CLASS_PREFIX + \"\\\\S+\", 'g');\n  var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn'];\n  var DefaultType$4 = {\n    animation: 'boolean',\n    template: 'string',\n    title: '(string|element|function)',\n    trigger: 'string',\n    delay: '(number|object)',\n    html: 'boolean',\n    selector: '(string|boolean)',\n    placement: '(string|function)',\n    offset: '(number|string|function)',\n    container: '(string|element|boolean)',\n    fallbackPlacement: '(string|array)',\n    boundary: '(string|element)',\n    sanitize: 'boolean',\n    sanitizeFn: '(null|function)',\n    whiteList: 'object'\n  };\n  var AttachmentMap$1 = {\n    AUTO: 'auto',\n    TOP: 'top',\n    RIGHT: 'right',\n    BOTTOM: 'bottom',\n    LEFT: 'left'\n  };\n  var Default$4 = {\n    animation: true,\n    template: '<div class=\"tooltip\" role=\"tooltip\">' + '<div class=\"arrow\"></div>' + '<div class=\"tooltip-inner\"></div></div>',\n    trigger: 'hover focus',\n    title: '',\n    delay: 0,\n    html: false,\n    selector: false,\n    placement: 'top',\n    offset: 0,\n    container: false,\n    fallbackPlacement: 'flip',\n    boundary: 'scrollParent',\n    sanitize: true,\n    sanitizeFn: null,\n    whiteList: DefaultWhitelist\n  };\n  var HoverState = {\n    SHOW: 'show',\n    OUT: 'out'\n  };\n  var Event$6 = {\n    HIDE: \"hide\" + EVENT_KEY$6,\n    HIDDEN: \"hidden\" + EVENT_KEY$6,\n    SHOW: \"show\" + EVENT_KEY$6,\n    SHOWN: \"shown\" + EVENT_KEY$6,\n    INSERTED: \"inserted\" + EVENT_KEY$6,\n    CLICK: \"click\" + EVENT_KEY$6,\n    FOCUSIN: \"focusin\" + EVENT_KEY$6,\n    FOCUSOUT: \"focusout\" + EVENT_KEY$6,\n    MOUSEENTER: \"mouseenter\" + EVENT_KEY$6,\n    MOUSELEAVE: \"mouseleave\" + EVENT_KEY$6\n  };\n  var ClassName$6 = {\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector$6 = {\n    TOOLTIP: '.tooltip',\n    TOOLTIP_INNER: '.tooltip-inner',\n    ARROW: '.arrow'\n  };\n  var Trigger = {\n    HOVER: 'hover',\n    FOCUS: 'focus',\n    CLICK: 'click',\n    MANUAL: 'manual'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Tooltip =\n  /*#__PURE__*/\n  function () {\n    function Tooltip(element, config) {\n      /**\n       * Check for Popper dependency\n       * Popper - https://popper.js.org\n       */\n      if (typeof Popper === 'undefined') {\n        throw new TypeError('Bootstrap\\'s tooltips require Popper.js (https://popper.js.org/)');\n      } // private\n\n\n      this._isEnabled = true;\n      this._timeout = 0;\n      this._hoverState = '';\n      this._activeTrigger = {};\n      this._popper = null; // Protected\n\n      this.element = element;\n      this.config = this._getConfig(config);\n      this.tip = null;\n\n      this._setListeners();\n    } // Getters\n\n\n    var _proto = Tooltip.prototype;\n\n    // Public\n    _proto.enable = function enable() {\n      this._isEnabled = true;\n    };\n\n    _proto.disable = function disable() {\n      this._isEnabled = false;\n    };\n\n    _proto.toggleEnabled = function toggleEnabled() {\n      this._isEnabled = !this._isEnabled;\n    };\n\n    _proto.toggle = function toggle(event) {\n      if (!this._isEnabled) {\n        return;\n      }\n\n      if (event) {\n        var dataKey = this.constructor.DATA_KEY;\n        var context = $(event.currentTarget).data(dataKey);\n\n        if (!context) {\n          context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n          $(event.currentTarget).data(dataKey, context);\n        }\n\n        context._activeTrigger.click = !context._activeTrigger.click;\n\n        if (context._isWithActiveTrigger()) {\n          context._enter(null, context);\n        } else {\n          context._leave(null, context);\n        }\n      } else {\n        if ($(this.getTipElement()).hasClass(ClassName$6.SHOW)) {\n          this._leave(null, this);\n\n          return;\n        }\n\n        this._enter(null, this);\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      clearTimeout(this._timeout);\n      $.removeData(this.element, this.constructor.DATA_KEY);\n      $(this.element).off(this.constructor.EVENT_KEY);\n      $(this.element).closest('.modal').off('hide.bs.modal');\n\n      if (this.tip) {\n        $(this.tip).remove();\n      }\n\n      this._isEnabled = null;\n      this._timeout = null;\n      this._hoverState = null;\n      this._activeTrigger = null;\n\n      if (this._popper !== null) {\n        this._popper.destroy();\n      }\n\n      this._popper = null;\n      this.element = null;\n      this.config = null;\n      this.tip = null;\n    };\n\n    _proto.show = function show() {\n      var _this = this;\n\n      if ($(this.element).css('display') === 'none') {\n        throw new Error('Please use show on visible elements');\n      }\n\n      var showEvent = $.Event(this.constructor.Event.SHOW);\n\n      if (this.isWithContent() && this._isEnabled) {\n        $(this.element).trigger(showEvent);\n        var shadowRoot = Util.findShadowRoot(this.element);\n        var isInTheDom = $.contains(shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement, this.element);\n\n        if (showEvent.isDefaultPrevented() || !isInTheDom) {\n          return;\n        }\n\n        var tip = this.getTipElement();\n        var tipId = Util.getUID(this.constructor.NAME);\n        tip.setAttribute('id', tipId);\n        this.element.setAttribute('aria-describedby', tipId);\n        this.setContent();\n\n        if (this.config.animation) {\n          $(tip).addClass(ClassName$6.FADE);\n        }\n\n        var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement;\n\n        var attachment = this._getAttachment(placement);\n\n        this.addAttachmentClass(attachment);\n\n        var container = this._getContainer();\n\n        $(tip).data(this.constructor.DATA_KEY, this);\n\n        if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) {\n          $(tip).appendTo(container);\n        }\n\n        $(this.element).trigger(this.constructor.Event.INSERTED);\n        this._popper = new Popper(this.element, tip, {\n          placement: attachment,\n          modifiers: {\n            offset: this._getOffset(),\n            flip: {\n              behavior: this.config.fallbackPlacement\n            },\n            arrow: {\n              element: Selector$6.ARROW\n            },\n            preventOverflow: {\n              boundariesElement: this.config.boundary\n            }\n          },\n          onCreate: function onCreate(data) {\n            if (data.originalPlacement !== data.placement) {\n              _this._handlePopperPlacementChange(data);\n            }\n          },\n          onUpdate: function onUpdate(data) {\n            return _this._handlePopperPlacementChange(data);\n          }\n        });\n        $(tip).addClass(ClassName$6.SHOW); // If this is a touch-enabled device we add extra\n        // empty mouseover listeners to the body's immediate children;\n        // only needed because of broken event delegation on iOS\n        // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n        if ('ontouchstart' in document.documentElement) {\n          $(document.body).children().on('mouseover', null, $.noop);\n        }\n\n        var complete = function complete() {\n          if (_this.config.animation) {\n            _this._fixTransition();\n          }\n\n          var prevHoverState = _this._hoverState;\n          _this._hoverState = null;\n          $(_this.element).trigger(_this.constructor.Event.SHOWN);\n\n          if (prevHoverState === HoverState.OUT) {\n            _this._leave(null, _this);\n          }\n        };\n\n        if ($(this.tip).hasClass(ClassName$6.FADE)) {\n          var transitionDuration = Util.getTransitionDurationFromElement(this.tip);\n          $(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n        } else {\n          complete();\n        }\n      }\n    };\n\n    _proto.hide = function hide(callback) {\n      var _this2 = this;\n\n      var tip = this.getTipElement();\n      var hideEvent = $.Event(this.constructor.Event.HIDE);\n\n      var complete = function complete() {\n        if (_this2._hoverState !== HoverState.SHOW && tip.parentNode) {\n          tip.parentNode.removeChild(tip);\n        }\n\n        _this2._cleanTipClass();\n\n        _this2.element.removeAttribute('aria-describedby');\n\n        $(_this2.element).trigger(_this2.constructor.Event.HIDDEN);\n\n        if (_this2._popper !== null) {\n          _this2._popper.destroy();\n        }\n\n        if (callback) {\n          callback();\n        }\n      };\n\n      $(this.element).trigger(hideEvent);\n\n      if (hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      $(tip).removeClass(ClassName$6.SHOW); // If this is a touch-enabled device we remove the extra\n      // empty mouseover listeners we added for iOS support\n\n      if ('ontouchstart' in document.documentElement) {\n        $(document.body).children().off('mouseover', null, $.noop);\n      }\n\n      this._activeTrigger[Trigger.CLICK] = false;\n      this._activeTrigger[Trigger.FOCUS] = false;\n      this._activeTrigger[Trigger.HOVER] = false;\n\n      if ($(this.tip).hasClass(ClassName$6.FADE)) {\n        var transitionDuration = Util.getTransitionDurationFromElement(tip);\n        $(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      } else {\n        complete();\n      }\n\n      this._hoverState = '';\n    };\n\n    _proto.update = function update() {\n      if (this._popper !== null) {\n        this._popper.scheduleUpdate();\n      }\n    } // Protected\n    ;\n\n    _proto.isWithContent = function isWithContent() {\n      return Boolean(this.getTitle());\n    };\n\n    _proto.addAttachmentClass = function addAttachmentClass(attachment) {\n      $(this.getTipElement()).addClass(CLASS_PREFIX + \"-\" + attachment);\n    };\n\n    _proto.getTipElement = function getTipElement() {\n      this.tip = this.tip || $(this.config.template)[0];\n      return this.tip;\n    };\n\n    _proto.setContent = function setContent() {\n      var tip = this.getTipElement();\n      this.setElementContent($(tip.querySelectorAll(Selector$6.TOOLTIP_INNER)), this.getTitle());\n      $(tip).removeClass(ClassName$6.FADE + \" \" + ClassName$6.SHOW);\n    };\n\n    _proto.setElementContent = function setElementContent($element, content) {\n      if (typeof content === 'object' && (content.nodeType || content.jquery)) {\n        // Content is a DOM node or a jQuery\n        if (this.config.html) {\n          if (!$(content).parent().is($element)) {\n            $element.empty().append(content);\n          }\n        } else {\n          $element.text($(content).text());\n        }\n\n        return;\n      }\n\n      if (this.config.html) {\n        if (this.config.sanitize) {\n          content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn);\n        }\n\n        $element.html(content);\n      } else {\n        $element.text(content);\n      }\n    };\n\n    _proto.getTitle = function getTitle() {\n      var title = this.element.getAttribute('data-original-title');\n\n      if (!title) {\n        title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title;\n      }\n\n      return title;\n    } // Private\n    ;\n\n    _proto._getOffset = function _getOffset() {\n      var _this3 = this;\n\n      var offset = {};\n\n      if (typeof this.config.offset === 'function') {\n        offset.fn = function (data) {\n          data.offsets = _objectSpread({}, data.offsets, _this3.config.offset(data.offsets, _this3.element) || {});\n          return data;\n        };\n      } else {\n        offset.offset = this.config.offset;\n      }\n\n      return offset;\n    };\n\n    _proto._getContainer = function _getContainer() {\n      if (this.config.container === false) {\n        return document.body;\n      }\n\n      if (Util.isElement(this.config.container)) {\n        return $(this.config.container);\n      }\n\n      return $(document).find(this.config.container);\n    };\n\n    _proto._getAttachment = function _getAttachment(placement) {\n      return AttachmentMap$1[placement.toUpperCase()];\n    };\n\n    _proto._setListeners = function _setListeners() {\n      var _this4 = this;\n\n      var triggers = this.config.trigger.split(' ');\n      triggers.forEach(function (trigger) {\n        if (trigger === 'click') {\n          $(_this4.element).on(_this4.constructor.Event.CLICK, _this4.config.selector, function (event) {\n            return _this4.toggle(event);\n          });\n        } else if (trigger !== Trigger.MANUAL) {\n          var eventIn = trigger === Trigger.HOVER ? _this4.constructor.Event.MOUSEENTER : _this4.constructor.Event.FOCUSIN;\n          var eventOut = trigger === Trigger.HOVER ? _this4.constructor.Event.MOUSELEAVE : _this4.constructor.Event.FOCUSOUT;\n          $(_this4.element).on(eventIn, _this4.config.selector, function (event) {\n            return _this4._enter(event);\n          }).on(eventOut, _this4.config.selector, function (event) {\n            return _this4._leave(event);\n          });\n        }\n      });\n      $(this.element).closest('.modal').on('hide.bs.modal', function () {\n        if (_this4.element) {\n          _this4.hide();\n        }\n      });\n\n      if (this.config.selector) {\n        this.config = _objectSpread({}, this.config, {\n          trigger: 'manual',\n          selector: ''\n        });\n      } else {\n        this._fixTitle();\n      }\n    };\n\n    _proto._fixTitle = function _fixTitle() {\n      var titleType = typeof this.element.getAttribute('data-original-title');\n\n      if (this.element.getAttribute('title') || titleType !== 'string') {\n        this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');\n        this.element.setAttribute('title', '');\n      }\n    };\n\n    _proto._enter = function _enter(event, context) {\n      var dataKey = this.constructor.DATA_KEY;\n      context = context || $(event.currentTarget).data(dataKey);\n\n      if (!context) {\n        context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n        $(event.currentTarget).data(dataKey, context);\n      }\n\n      if (event) {\n        context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true;\n      }\n\n      if ($(context.getTipElement()).hasClass(ClassName$6.SHOW) || context._hoverState === HoverState.SHOW) {\n        context._hoverState = HoverState.SHOW;\n        return;\n      }\n\n      clearTimeout(context._timeout);\n      context._hoverState = HoverState.SHOW;\n\n      if (!context.config.delay || !context.config.delay.show) {\n        context.show();\n        return;\n      }\n\n      context._timeout = setTimeout(function () {\n        if (context._hoverState === HoverState.SHOW) {\n          context.show();\n        }\n      }, context.config.delay.show);\n    };\n\n    _proto._leave = function _leave(event, context) {\n      var dataKey = this.constructor.DATA_KEY;\n      context = context || $(event.currentTarget).data(dataKey);\n\n      if (!context) {\n        context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n        $(event.currentTarget).data(dataKey, context);\n      }\n\n      if (event) {\n        context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false;\n      }\n\n      if (context._isWithActiveTrigger()) {\n        return;\n      }\n\n      clearTimeout(context._timeout);\n      context._hoverState = HoverState.OUT;\n\n      if (!context.config.delay || !context.config.delay.hide) {\n        context.hide();\n        return;\n      }\n\n      context._timeout = setTimeout(function () {\n        if (context._hoverState === HoverState.OUT) {\n          context.hide();\n        }\n      }, context.config.delay.hide);\n    };\n\n    _proto._isWithActiveTrigger = function _isWithActiveTrigger() {\n      for (var trigger in this._activeTrigger) {\n        if (this._activeTrigger[trigger]) {\n          return true;\n        }\n      }\n\n      return false;\n    };\n\n    _proto._getConfig = function _getConfig(config) {\n      var dataAttributes = $(this.element).data();\n      Object.keys(dataAttributes).forEach(function (dataAttr) {\n        if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {\n          delete dataAttributes[dataAttr];\n        }\n      });\n      config = _objectSpread({}, this.constructor.Default, dataAttributes, typeof config === 'object' && config ? config : {});\n\n      if (typeof config.delay === 'number') {\n        config.delay = {\n          show: config.delay,\n          hide: config.delay\n        };\n      }\n\n      if (typeof config.title === 'number') {\n        config.title = config.title.toString();\n      }\n\n      if (typeof config.content === 'number') {\n        config.content = config.content.toString();\n      }\n\n      Util.typeCheckConfig(NAME$6, config, this.constructor.DefaultType);\n\n      if (config.sanitize) {\n        config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn);\n      }\n\n      return config;\n    };\n\n    _proto._getDelegateConfig = function _getDelegateConfig() {\n      var config = {};\n\n      if (this.config) {\n        for (var key in this.config) {\n          if (this.constructor.Default[key] !== this.config[key]) {\n            config[key] = this.config[key];\n          }\n        }\n      }\n\n      return config;\n    };\n\n    _proto._cleanTipClass = function _cleanTipClass() {\n      var $tip = $(this.getTipElement());\n      var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);\n\n      if (tabClass !== null && tabClass.length) {\n        $tip.removeClass(tabClass.join(''));\n      }\n    };\n\n    _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(popperData) {\n      var popperInstance = popperData.instance;\n      this.tip = popperInstance.popper;\n\n      this._cleanTipClass();\n\n      this.addAttachmentClass(this._getAttachment(popperData.placement));\n    };\n\n    _proto._fixTransition = function _fixTransition() {\n      var tip = this.getTipElement();\n      var initConfigAnimation = this.config.animation;\n\n      if (tip.getAttribute('x-placement') !== null) {\n        return;\n      }\n\n      $(tip).removeClass(ClassName$6.FADE);\n      this.config.animation = false;\n      this.hide();\n      this.show();\n      this.config.animation = initConfigAnimation;\n    } // Static\n    ;\n\n    Tooltip._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$6);\n\n        var _config = typeof config === 'object' && config;\n\n        if (!data && /dispose|hide/.test(config)) {\n          return;\n        }\n\n        if (!data) {\n          data = new Tooltip(this, _config);\n          $(this).data(DATA_KEY$6, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Tooltip, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$6;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$4;\n      }\n    }, {\n      key: \"NAME\",\n      get: function get() {\n        return NAME$6;\n      }\n    }, {\n      key: \"DATA_KEY\",\n      get: function get() {\n        return DATA_KEY$6;\n      }\n    }, {\n      key: \"Event\",\n      get: function get() {\n        return Event$6;\n      }\n    }, {\n      key: \"EVENT_KEY\",\n      get: function get() {\n        return EVENT_KEY$6;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType$4;\n      }\n    }]);\n\n    return Tooltip;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n\n  $.fn[NAME$6] = Tooltip._jQueryInterface;\n  $.fn[NAME$6].Constructor = Tooltip;\n\n  $.fn[NAME$6].noConflict = function () {\n    $.fn[NAME$6] = JQUERY_NO_CONFLICT$6;\n    return Tooltip._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$7 = 'popover';\n  var VERSION$7 = '4.3.1';\n  var DATA_KEY$7 = 'bs.popover';\n  var EVENT_KEY$7 = \".\" + DATA_KEY$7;\n  var JQUERY_NO_CONFLICT$7 = $.fn[NAME$7];\n  var CLASS_PREFIX$1 = 'bs-popover';\n  var BSCLS_PREFIX_REGEX$1 = new RegExp(\"(^|\\\\s)\" + CLASS_PREFIX$1 + \"\\\\S+\", 'g');\n\n  var Default$5 = _objectSpread({}, Tooltip.Default, {\n    placement: 'right',\n    trigger: 'click',\n    content: '',\n    template: '<div class=\"popover\" role=\"tooltip\">' + '<div class=\"arrow\"></div>' + '<h3 class=\"popover-header\"></h3>' + '<div class=\"popover-body\"></div></div>'\n  });\n\n  var DefaultType$5 = _objectSpread({}, Tooltip.DefaultType, {\n    content: '(string|element|function)'\n  });\n\n  var ClassName$7 = {\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector$7 = {\n    TITLE: '.popover-header',\n    CONTENT: '.popover-body'\n  };\n  var Event$7 = {\n    HIDE: \"hide\" + EVENT_KEY$7,\n    HIDDEN: \"hidden\" + EVENT_KEY$7,\n    SHOW: \"show\" + EVENT_KEY$7,\n    SHOWN: \"shown\" + EVENT_KEY$7,\n    INSERTED: \"inserted\" + EVENT_KEY$7,\n    CLICK: \"click\" + EVENT_KEY$7,\n    FOCUSIN: \"focusin\" + EVENT_KEY$7,\n    FOCUSOUT: \"focusout\" + EVENT_KEY$7,\n    MOUSEENTER: \"mouseenter\" + EVENT_KEY$7,\n    MOUSELEAVE: \"mouseleave\" + EVENT_KEY$7\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Popover =\n  /*#__PURE__*/\n  function (_Tooltip) {\n    _inheritsLoose(Popover, _Tooltip);\n\n    function Popover() {\n      return _Tooltip.apply(this, arguments) || this;\n    }\n\n    var _proto = Popover.prototype;\n\n    // Overrides\n    _proto.isWithContent = function isWithContent() {\n      return this.getTitle() || this._getContent();\n    };\n\n    _proto.addAttachmentClass = function addAttachmentClass(attachment) {\n      $(this.getTipElement()).addClass(CLASS_PREFIX$1 + \"-\" + attachment);\n    };\n\n    _proto.getTipElement = function getTipElement() {\n      this.tip = this.tip || $(this.config.template)[0];\n      return this.tip;\n    };\n\n    _proto.setContent = function setContent() {\n      var $tip = $(this.getTipElement()); // We use append for html objects to maintain js events\n\n      this.setElementContent($tip.find(Selector$7.TITLE), this.getTitle());\n\n      var content = this._getContent();\n\n      if (typeof content === 'function') {\n        content = content.call(this.element);\n      }\n\n      this.setElementContent($tip.find(Selector$7.CONTENT), content);\n      $tip.removeClass(ClassName$7.FADE + \" \" + ClassName$7.SHOW);\n    } // Private\n    ;\n\n    _proto._getContent = function _getContent() {\n      return this.element.getAttribute('data-content') || this.config.content;\n    };\n\n    _proto._cleanTipClass = function _cleanTipClass() {\n      var $tip = $(this.getTipElement());\n      var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX$1);\n\n      if (tabClass !== null && tabClass.length > 0) {\n        $tip.removeClass(tabClass.join(''));\n      }\n    } // Static\n    ;\n\n    Popover._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$7);\n\n        var _config = typeof config === 'object' ? config : null;\n\n        if (!data && /dispose|hide/.test(config)) {\n          return;\n        }\n\n        if (!data) {\n          data = new Popover(this, _config);\n          $(this).data(DATA_KEY$7, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Popover, null, [{\n      key: \"VERSION\",\n      // Getters\n      get: function get() {\n        return VERSION$7;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$5;\n      }\n    }, {\n      key: \"NAME\",\n      get: function get() {\n        return NAME$7;\n      }\n    }, {\n      key: \"DATA_KEY\",\n      get: function get() {\n        return DATA_KEY$7;\n      }\n    }, {\n      key: \"Event\",\n      get: function get() {\n        return Event$7;\n      }\n    }, {\n      key: \"EVENT_KEY\",\n      get: function get() {\n        return EVENT_KEY$7;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType$5;\n      }\n    }]);\n\n    return Popover;\n  }(Tooltip);\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n\n  $.fn[NAME$7] = Popover._jQueryInterface;\n  $.fn[NAME$7].Constructor = Popover;\n\n  $.fn[NAME$7].noConflict = function () {\n    $.fn[NAME$7] = JQUERY_NO_CONFLICT$7;\n    return Popover._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$8 = 'scrollspy';\n  var VERSION$8 = '4.3.1';\n  var DATA_KEY$8 = 'bs.scrollspy';\n  var EVENT_KEY$8 = \".\" + DATA_KEY$8;\n  var DATA_API_KEY$6 = '.data-api';\n  var JQUERY_NO_CONFLICT$8 = $.fn[NAME$8];\n  var Default$6 = {\n    offset: 10,\n    method: 'auto',\n    target: ''\n  };\n  var DefaultType$6 = {\n    offset: 'number',\n    method: 'string',\n    target: '(string|element)'\n  };\n  var Event$8 = {\n    ACTIVATE: \"activate\" + EVENT_KEY$8,\n    SCROLL: \"scroll\" + EVENT_KEY$8,\n    LOAD_DATA_API: \"load\" + EVENT_KEY$8 + DATA_API_KEY$6\n  };\n  var ClassName$8 = {\n    DROPDOWN_ITEM: 'dropdown-item',\n    DROPDOWN_MENU: 'dropdown-menu',\n    ACTIVE: 'active'\n  };\n  var Selector$8 = {\n    DATA_SPY: '[data-spy=\"scroll\"]',\n    ACTIVE: '.active',\n    NAV_LIST_GROUP: '.nav, .list-group',\n    NAV_LINKS: '.nav-link',\n    NAV_ITEMS: '.nav-item',\n    LIST_ITEMS: '.list-group-item',\n    DROPDOWN: '.dropdown',\n    DROPDOWN_ITEMS: '.dropdown-item',\n    DROPDOWN_TOGGLE: '.dropdown-toggle'\n  };\n  var OffsetMethod = {\n    OFFSET: 'offset',\n    POSITION: 'position'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var ScrollSpy =\n  /*#__PURE__*/\n  function () {\n    function ScrollSpy(element, config) {\n      var _this = this;\n\n      this._element = element;\n      this._scrollElement = element.tagName === 'BODY' ? window : element;\n      this._config = this._getConfig(config);\n      this._selector = this._config.target + \" \" + Selector$8.NAV_LINKS + \",\" + (this._config.target + \" \" + Selector$8.LIST_ITEMS + \",\") + (this._config.target + \" \" + Selector$8.DROPDOWN_ITEMS);\n      this._offsets = [];\n      this._targets = [];\n      this._activeTarget = null;\n      this._scrollHeight = 0;\n      $(this._scrollElement).on(Event$8.SCROLL, function (event) {\n        return _this._process(event);\n      });\n      this.refresh();\n\n      this._process();\n    } // Getters\n\n\n    var _proto = ScrollSpy.prototype;\n\n    // Public\n    _proto.refresh = function refresh() {\n      var _this2 = this;\n\n      var autoMethod = this._scrollElement === this._scrollElement.window ? OffsetMethod.OFFSET : OffsetMethod.POSITION;\n      var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;\n      var offsetBase = offsetMethod === OffsetMethod.POSITION ? this._getScrollTop() : 0;\n      this._offsets = [];\n      this._targets = [];\n      this._scrollHeight = this._getScrollHeight();\n      var targets = [].slice.call(document.querySelectorAll(this._selector));\n      targets.map(function (element) {\n        var target;\n        var targetSelector = Util.getSelectorFromElement(element);\n\n        if (targetSelector) {\n          target = document.querySelector(targetSelector);\n        }\n\n        if (target) {\n          var targetBCR = target.getBoundingClientRect();\n\n          if (targetBCR.width || targetBCR.height) {\n            // TODO (fat): remove sketch reliance on jQuery position/offset\n            return [$(target)[offsetMethod]().top + offsetBase, targetSelector];\n          }\n        }\n\n        return null;\n      }).filter(function (item) {\n        return item;\n      }).sort(function (a, b) {\n        return a[0] - b[0];\n      }).forEach(function (item) {\n        _this2._offsets.push(item[0]);\n\n        _this2._targets.push(item[1]);\n      });\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$8);\n      $(this._scrollElement).off(EVENT_KEY$8);\n      this._element = null;\n      this._scrollElement = null;\n      this._config = null;\n      this._selector = null;\n      this._offsets = null;\n      this._targets = null;\n      this._activeTarget = null;\n      this._scrollHeight = null;\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default$6, typeof config === 'object' && config ? config : {});\n\n      if (typeof config.target !== 'string') {\n        var id = $(config.target).attr('id');\n\n        if (!id) {\n          id = Util.getUID(NAME$8);\n          $(config.target).attr('id', id);\n        }\n\n        config.target = \"#\" + id;\n      }\n\n      Util.typeCheckConfig(NAME$8, config, DefaultType$6);\n      return config;\n    };\n\n    _proto._getScrollTop = function _getScrollTop() {\n      return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;\n    };\n\n    _proto._getScrollHeight = function _getScrollHeight() {\n      return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);\n    };\n\n    _proto._getOffsetHeight = function _getOffsetHeight() {\n      return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;\n    };\n\n    _proto._process = function _process() {\n      var scrollTop = this._getScrollTop() + this._config.offset;\n\n      var scrollHeight = this._getScrollHeight();\n\n      var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();\n\n      if (this._scrollHeight !== scrollHeight) {\n        this.refresh();\n      }\n\n      if (scrollTop >= maxScroll) {\n        var target = this._targets[this._targets.length - 1];\n\n        if (this._activeTarget !== target) {\n          this._activate(target);\n        }\n\n        return;\n      }\n\n      if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n        this._activeTarget = null;\n\n        this._clear();\n\n        return;\n      }\n\n      var offsetLength = this._offsets.length;\n\n      for (var i = offsetLength; i--;) {\n        var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);\n\n        if (isActiveTarget) {\n          this._activate(this._targets[i]);\n        }\n      }\n    };\n\n    _proto._activate = function _activate(target) {\n      this._activeTarget = target;\n\n      this._clear();\n\n      var queries = this._selector.split(',').map(function (selector) {\n        return selector + \"[data-target=\\\"\" + target + \"\\\"],\" + selector + \"[href=\\\"\" + target + \"\\\"]\";\n      });\n\n      var $link = $([].slice.call(document.querySelectorAll(queries.join(','))));\n\n      if ($link.hasClass(ClassName$8.DROPDOWN_ITEM)) {\n        $link.closest(Selector$8.DROPDOWN).find(Selector$8.DROPDOWN_TOGGLE).addClass(ClassName$8.ACTIVE);\n        $link.addClass(ClassName$8.ACTIVE);\n      } else {\n        // Set triggered link as active\n        $link.addClass(ClassName$8.ACTIVE); // Set triggered links parents as active\n        // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n\n        $link.parents(Selector$8.NAV_LIST_GROUP).prev(Selector$8.NAV_LINKS + \", \" + Selector$8.LIST_ITEMS).addClass(ClassName$8.ACTIVE); // Handle special case when .nav-link is inside .nav-item\n\n        $link.parents(Selector$8.NAV_LIST_GROUP).prev(Selector$8.NAV_ITEMS).children(Selector$8.NAV_LINKS).addClass(ClassName$8.ACTIVE);\n      }\n\n      $(this._scrollElement).trigger(Event$8.ACTIVATE, {\n        relatedTarget: target\n      });\n    };\n\n    _proto._clear = function _clear() {\n      [].slice.call(document.querySelectorAll(this._selector)).filter(function (node) {\n        return node.classList.contains(ClassName$8.ACTIVE);\n      }).forEach(function (node) {\n        return node.classList.remove(ClassName$8.ACTIVE);\n      });\n    } // Static\n    ;\n\n    ScrollSpy._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$8);\n\n        var _config = typeof config === 'object' && config;\n\n        if (!data) {\n          data = new ScrollSpy(this, _config);\n          $(this).data(DATA_KEY$8, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(ScrollSpy, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$8;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$6;\n      }\n    }]);\n\n    return ScrollSpy;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(window).on(Event$8.LOAD_DATA_API, function () {\n    var scrollSpys = [].slice.call(document.querySelectorAll(Selector$8.DATA_SPY));\n    var scrollSpysLength = scrollSpys.length;\n\n    for (var i = scrollSpysLength; i--;) {\n      var $spy = $(scrollSpys[i]);\n\n      ScrollSpy._jQueryInterface.call($spy, $spy.data());\n    }\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$8] = ScrollSpy._jQueryInterface;\n  $.fn[NAME$8].Constructor = ScrollSpy;\n\n  $.fn[NAME$8].noConflict = function () {\n    $.fn[NAME$8] = JQUERY_NO_CONFLICT$8;\n    return ScrollSpy._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$9 = 'tab';\n  var VERSION$9 = '4.3.1';\n  var DATA_KEY$9 = 'bs.tab';\n  var EVENT_KEY$9 = \".\" + DATA_KEY$9;\n  var DATA_API_KEY$7 = '.data-api';\n  var JQUERY_NO_CONFLICT$9 = $.fn[NAME$9];\n  var Event$9 = {\n    HIDE: \"hide\" + EVENT_KEY$9,\n    HIDDEN: \"hidden\" + EVENT_KEY$9,\n    SHOW: \"show\" + EVENT_KEY$9,\n    SHOWN: \"shown\" + EVENT_KEY$9,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$9 + DATA_API_KEY$7\n  };\n  var ClassName$9 = {\n    DROPDOWN_MENU: 'dropdown-menu',\n    ACTIVE: 'active',\n    DISABLED: 'disabled',\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector$9 = {\n    DROPDOWN: '.dropdown',\n    NAV_LIST_GROUP: '.nav, .list-group',\n    ACTIVE: '.active',\n    ACTIVE_UL: '> li > .active',\n    DATA_TOGGLE: '[data-toggle=\"tab\"], [data-toggle=\"pill\"], [data-toggle=\"list\"]',\n    DROPDOWN_TOGGLE: '.dropdown-toggle',\n    DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Tab =\n  /*#__PURE__*/\n  function () {\n    function Tab(element) {\n      this._element = element;\n    } // Getters\n\n\n    var _proto = Tab.prototype;\n\n    // Public\n    _proto.show = function show() {\n      var _this = this;\n\n      if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $(this._element).hasClass(ClassName$9.ACTIVE) || $(this._element).hasClass(ClassName$9.DISABLED)) {\n        return;\n      }\n\n      var target;\n      var previous;\n      var listElement = $(this._element).closest(Selector$9.NAV_LIST_GROUP)[0];\n      var selector = Util.getSelectorFromElement(this._element);\n\n      if (listElement) {\n        var itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? Selector$9.ACTIVE_UL : Selector$9.ACTIVE;\n        previous = $.makeArray($(listElement).find(itemSelector));\n        previous = previous[previous.length - 1];\n      }\n\n      var hideEvent = $.Event(Event$9.HIDE, {\n        relatedTarget: this._element\n      });\n      var showEvent = $.Event(Event$9.SHOW, {\n        relatedTarget: previous\n      });\n\n      if (previous) {\n        $(previous).trigger(hideEvent);\n      }\n\n      $(this._element).trigger(showEvent);\n\n      if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      if (selector) {\n        target = document.querySelector(selector);\n      }\n\n      this._activate(this._element, listElement);\n\n      var complete = function complete() {\n        var hiddenEvent = $.Event(Event$9.HIDDEN, {\n          relatedTarget: _this._element\n        });\n        var shownEvent = $.Event(Event$9.SHOWN, {\n          relatedTarget: previous\n        });\n        $(previous).trigger(hiddenEvent);\n        $(_this._element).trigger(shownEvent);\n      };\n\n      if (target) {\n        this._activate(target, target.parentNode, complete);\n      } else {\n        complete();\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$9);\n      this._element = null;\n    } // Private\n    ;\n\n    _proto._activate = function _activate(element, container, callback) {\n      var _this2 = this;\n\n      var activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ? $(container).find(Selector$9.ACTIVE_UL) : $(container).children(Selector$9.ACTIVE);\n      var active = activeElements[0];\n      var isTransitioning = callback && active && $(active).hasClass(ClassName$9.FADE);\n\n      var complete = function complete() {\n        return _this2._transitionComplete(element, active, callback);\n      };\n\n      if (active && isTransitioning) {\n        var transitionDuration = Util.getTransitionDurationFromElement(active);\n        $(active).removeClass(ClassName$9.SHOW).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      } else {\n        complete();\n      }\n    };\n\n    _proto._transitionComplete = function _transitionComplete(element, active, callback) {\n      if (active) {\n        $(active).removeClass(ClassName$9.ACTIVE);\n        var dropdownChild = $(active.parentNode).find(Selector$9.DROPDOWN_ACTIVE_CHILD)[0];\n\n        if (dropdownChild) {\n          $(dropdownChild).removeClass(ClassName$9.ACTIVE);\n        }\n\n        if (active.getAttribute('role') === 'tab') {\n          active.setAttribute('aria-selected', false);\n        }\n      }\n\n      $(element).addClass(ClassName$9.ACTIVE);\n\n      if (element.getAttribute('role') === 'tab') {\n        element.setAttribute('aria-selected', true);\n      }\n\n      Util.reflow(element);\n\n      if (element.classList.contains(ClassName$9.FADE)) {\n        element.classList.add(ClassName$9.SHOW);\n      }\n\n      if (element.parentNode && $(element.parentNode).hasClass(ClassName$9.DROPDOWN_MENU)) {\n        var dropdownElement = $(element).closest(Selector$9.DROPDOWN)[0];\n\n        if (dropdownElement) {\n          var dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(Selector$9.DROPDOWN_TOGGLE));\n          $(dropdownToggleList).addClass(ClassName$9.ACTIVE);\n        }\n\n        element.setAttribute('aria-expanded', true);\n      }\n\n      if (callback) {\n        callback();\n      }\n    } // Static\n    ;\n\n    Tab._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $this = $(this);\n        var data = $this.data(DATA_KEY$9);\n\n        if (!data) {\n          data = new Tab(this);\n          $this.data(DATA_KEY$9, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Tab, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$9;\n      }\n    }]);\n\n    return Tab;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$9.CLICK_DATA_API, Selector$9.DATA_TOGGLE, function (event) {\n    event.preventDefault();\n\n    Tab._jQueryInterface.call($(this), 'show');\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$9] = Tab._jQueryInterface;\n  $.fn[NAME$9].Constructor = Tab;\n\n  $.fn[NAME$9].noConflict = function () {\n    $.fn[NAME$9] = JQUERY_NO_CONFLICT$9;\n    return Tab._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$a = 'toast';\n  var VERSION$a = '4.3.1';\n  var DATA_KEY$a = 'bs.toast';\n  var EVENT_KEY$a = \".\" + DATA_KEY$a;\n  var JQUERY_NO_CONFLICT$a = $.fn[NAME$a];\n  var Event$a = {\n    CLICK_DISMISS: \"click.dismiss\" + EVENT_KEY$a,\n    HIDE: \"hide\" + EVENT_KEY$a,\n    HIDDEN: \"hidden\" + EVENT_KEY$a,\n    SHOW: \"show\" + EVENT_KEY$a,\n    SHOWN: \"shown\" + EVENT_KEY$a\n  };\n  var ClassName$a = {\n    FADE: 'fade',\n    HIDE: 'hide',\n    SHOW: 'show',\n    SHOWING: 'showing'\n  };\n  var DefaultType$7 = {\n    animation: 'boolean',\n    autohide: 'boolean',\n    delay: 'number'\n  };\n  var Default$7 = {\n    animation: true,\n    autohide: true,\n    delay: 500\n  };\n  var Selector$a = {\n    DATA_DISMISS: '[data-dismiss=\"toast\"]'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Toast =\n  /*#__PURE__*/\n  function () {\n    function Toast(element, config) {\n      this._element = element;\n      this._config = this._getConfig(config);\n      this._timeout = null;\n\n      this._setListeners();\n    } // Getters\n\n\n    var _proto = Toast.prototype;\n\n    // Public\n    _proto.show = function show() {\n      var _this = this;\n\n      $(this._element).trigger(Event$a.SHOW);\n\n      if (this._config.animation) {\n        this._element.classList.add(ClassName$a.FADE);\n      }\n\n      var complete = function complete() {\n        _this._element.classList.remove(ClassName$a.SHOWING);\n\n        _this._element.classList.add(ClassName$a.SHOW);\n\n        $(_this._element).trigger(Event$a.SHOWN);\n\n        if (_this._config.autohide) {\n          _this.hide();\n        }\n      };\n\n      this._element.classList.remove(ClassName$a.HIDE);\n\n      this._element.classList.add(ClassName$a.SHOWING);\n\n      if (this._config.animation) {\n        var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n        $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      } else {\n        complete();\n      }\n    };\n\n    _proto.hide = function hide(withoutTimeout) {\n      var _this2 = this;\n\n      if (!this._element.classList.contains(ClassName$a.SHOW)) {\n        return;\n      }\n\n      $(this._element).trigger(Event$a.HIDE);\n\n      if (withoutTimeout) {\n        this._close();\n      } else {\n        this._timeout = setTimeout(function () {\n          _this2._close();\n        }, this._config.delay);\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      clearTimeout(this._timeout);\n      this._timeout = null;\n\n      if (this._element.classList.contains(ClassName$a.SHOW)) {\n        this._element.classList.remove(ClassName$a.SHOW);\n      }\n\n      $(this._element).off(Event$a.CLICK_DISMISS);\n      $.removeData(this._element, DATA_KEY$a);\n      this._element = null;\n      this._config = null;\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default$7, $(this._element).data(), typeof config === 'object' && config ? config : {});\n      Util.typeCheckConfig(NAME$a, config, this.constructor.DefaultType);\n      return config;\n    };\n\n    _proto._setListeners = function _setListeners() {\n      var _this3 = this;\n\n      $(this._element).on(Event$a.CLICK_DISMISS, Selector$a.DATA_DISMISS, function () {\n        return _this3.hide(true);\n      });\n    };\n\n    _proto._close = function _close() {\n      var _this4 = this;\n\n      var complete = function complete() {\n        _this4._element.classList.add(ClassName$a.HIDE);\n\n        $(_this4._element).trigger(Event$a.HIDDEN);\n      };\n\n      this._element.classList.remove(ClassName$a.SHOW);\n\n      if (this._config.animation) {\n        var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n        $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      } else {\n        complete();\n      }\n    } // Static\n    ;\n\n    Toast._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $element = $(this);\n        var data = $element.data(DATA_KEY$a);\n\n        var _config = typeof config === 'object' && config;\n\n        if (!data) {\n          data = new Toast(this, _config);\n          $element.data(DATA_KEY$a, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config](this);\n        }\n      });\n    };\n\n    _createClass(Toast, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$a;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType$7;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$7;\n      }\n    }]);\n\n    return Toast;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n\n  $.fn[NAME$a] = Toast._jQueryInterface;\n  $.fn[NAME$a].Constructor = Toast;\n\n  $.fn[NAME$a].noConflict = function () {\n    $.fn[NAME$a] = JQUERY_NO_CONFLICT$a;\n    return Toast._jQueryInterface;\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.3.1): index.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  (function () {\n    if (typeof $ === 'undefined') {\n      throw new TypeError('Bootstrap\\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\\'s JavaScript.');\n    }\n\n    var version = $.fn.jquery.split(' ')[0].split('.');\n    var minMajor = 1;\n    var ltMajor = 2;\n    var minMinor = 9;\n    var minPatch = 1;\n    var maxMajor = 4;\n\n    if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {\n      throw new Error('Bootstrap\\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0');\n    }\n  })();\n\n  exports.Util = Util;\n  exports.Alert = Alert;\n  exports.Button = Button;\n  exports.Carousel = Carousel;\n  exports.Collapse = Collapse;\n  exports.Dropdown = Dropdown;\n  exports.Modal = Modal;\n  exports.Popover = Popover;\n  exports.Scrollspy = ScrollSpy;\n  exports.Tab = Tab;\n  exports.Toast = Toast;\n  exports.Tooltip = Tooltip;\n\n  Object.defineProperty(exports, '__esModule', { value: true });\n\n}));\n//# sourceMappingURL=bootstrap.bundle.js.map\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bootstrap4/js/bootstrap.bundle.js.map",
    "content": "{\"version\":3,\"file\":\"bootstrap.bundle.js\",\"sources\":[\"../../js/src/util.js\",\"../../js/src/alert.js\",\"../../js/src/button.js\",\"../../js/src/carousel.js\",\"../../js/src/collapse.js\",\"../../node_modules/popper.js/dist/esm/popper.js\",\"../../js/src/dropdown.js\",\"../../js/src/modal.js\",\"../../js/src/tools/sanitizer.js\",\"../../js/src/tooltip.js\",\"../../js/src/popover.js\",\"../../js/src/scrollspy.js\",\"../../js/src/tab.js\",\"../../js/src/toast.js\",\"../../js/src/index.js\"],\"sourcesContent\":[\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): util.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Private TransitionEnd Helpers\\n * ------------------------------------------------------------------------\\n */\\n\\nconst TRANSITION_END = 'transitionend'\\nconst MAX_UID = 1000000\\nconst MILLISECONDS_MULTIPLIER = 1000\\n\\n// Shoutout AngusCroll (https://goo.gl/pxwQGp)\\nfunction toType(obj) {\\n  return {}.toString.call(obj).match(/\\\\s([a-z]+)/i)[1].toLowerCase()\\n}\\n\\nfunction getSpecialTransitionEndEvent() {\\n  return {\\n    bindType: TRANSITION_END,\\n    delegateType: TRANSITION_END,\\n    handle(event) {\\n      if ($(event.target).is(this)) {\\n        return event.handleObj.handler.apply(this, arguments) // eslint-disable-line prefer-rest-params\\n      }\\n      return undefined // eslint-disable-line no-undefined\\n    }\\n  }\\n}\\n\\nfunction transitionEndEmulator(duration) {\\n  let called = false\\n\\n  $(this).one(Util.TRANSITION_END, () => {\\n    called = true\\n  })\\n\\n  setTimeout(() => {\\n    if (!called) {\\n      Util.triggerTransitionEnd(this)\\n    }\\n  }, duration)\\n\\n  return this\\n}\\n\\nfunction setTransitionEndSupport() {\\n  $.fn.emulateTransitionEnd = transitionEndEmulator\\n  $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent()\\n}\\n\\n/**\\n * --------------------------------------------------------------------------\\n * Public Util Api\\n * --------------------------------------------------------------------------\\n */\\n\\nconst Util = {\\n\\n  TRANSITION_END: 'bsTransitionEnd',\\n\\n  getUID(prefix) {\\n    do {\\n      // eslint-disable-next-line no-bitwise\\n      prefix += ~~(Math.random() * MAX_UID) // \\\"~~\\\" acts like a faster Math.floor() here\\n    } while (document.getElementById(prefix))\\n    return prefix\\n  },\\n\\n  getSelectorFromElement(element) {\\n    let selector = element.getAttribute('data-target')\\n\\n    if (!selector || selector === '#') {\\n      const hrefAttr = element.getAttribute('href')\\n      selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : ''\\n    }\\n\\n    try {\\n      return document.querySelector(selector) ? selector : null\\n    } catch (err) {\\n      return null\\n    }\\n  },\\n\\n  getTransitionDurationFromElement(element) {\\n    if (!element) {\\n      return 0\\n    }\\n\\n    // Get transition-duration of the element\\n    let transitionDuration = $(element).css('transition-duration')\\n    let transitionDelay = $(element).css('transition-delay')\\n\\n    const floatTransitionDuration = parseFloat(transitionDuration)\\n    const floatTransitionDelay = parseFloat(transitionDelay)\\n\\n    // Return 0 if element or transition duration is not found\\n    if (!floatTransitionDuration && !floatTransitionDelay) {\\n      return 0\\n    }\\n\\n    // If multiple durations are defined, take the first\\n    transitionDuration = transitionDuration.split(',')[0]\\n    transitionDelay = transitionDelay.split(',')[0]\\n\\n    return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\\n  },\\n\\n  reflow(element) {\\n    return element.offsetHeight\\n  },\\n\\n  triggerTransitionEnd(element) {\\n    $(element).trigger(TRANSITION_END)\\n  },\\n\\n  // TODO: Remove in v5\\n  supportsTransitionEnd() {\\n    return Boolean(TRANSITION_END)\\n  },\\n\\n  isElement(obj) {\\n    return (obj[0] || obj).nodeType\\n  },\\n\\n  typeCheckConfig(componentName, config, configTypes) {\\n    for (const property in configTypes) {\\n      if (Object.prototype.hasOwnProperty.call(configTypes, property)) {\\n        const expectedTypes = configTypes[property]\\n        const value         = config[property]\\n        const valueType     = value && Util.isElement(value)\\n          ? 'element' : toType(value)\\n\\n        if (!new RegExp(expectedTypes).test(valueType)) {\\n          throw new Error(\\n            `${componentName.toUpperCase()}: ` +\\n            `Option \\\"${property}\\\" provided type \\\"${valueType}\\\" ` +\\n            `but expected type \\\"${expectedTypes}\\\".`)\\n        }\\n      }\\n    }\\n  },\\n\\n  findShadowRoot(element) {\\n    if (!document.documentElement.attachShadow) {\\n      return null\\n    }\\n\\n    // Can find the shadow root otherwise it'll return the document\\n    if (typeof element.getRootNode === 'function') {\\n      const root = element.getRootNode()\\n      return root instanceof ShadowRoot ? root : null\\n    }\\n\\n    if (element instanceof ShadowRoot) {\\n      return element\\n    }\\n\\n    // when we don't find a shadow root\\n    if (!element.parentNode) {\\n      return null\\n    }\\n\\n    return Util.findShadowRoot(element.parentNode)\\n  }\\n}\\n\\nsetTransitionEndSupport()\\n\\nexport default Util\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): alert.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\nimport Util from './util'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME                = 'alert'\\nconst VERSION             = '4.3.1'\\nconst DATA_KEY            = 'bs.alert'\\nconst EVENT_KEY           = `.${DATA_KEY}`\\nconst DATA_API_KEY        = '.data-api'\\nconst JQUERY_NO_CONFLICT  = $.fn[NAME]\\n\\nconst Selector = {\\n  DISMISS : '[data-dismiss=\\\"alert\\\"]'\\n}\\n\\nconst Event = {\\n  CLOSE          : `close${EVENT_KEY}`,\\n  CLOSED         : `closed${EVENT_KEY}`,\\n  CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\\n}\\n\\nconst ClassName = {\\n  ALERT : 'alert',\\n  FADE  : 'fade',\\n  SHOW  : 'show'\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass Alert {\\n  constructor(element) {\\n    this._element = element\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  // Public\\n\\n  close(element) {\\n    let rootElement = this._element\\n    if (element) {\\n      rootElement = this._getRootElement(element)\\n    }\\n\\n    const customEvent = this._triggerCloseEvent(rootElement)\\n\\n    if (customEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    this._removeElement(rootElement)\\n  }\\n\\n  dispose() {\\n    $.removeData(this._element, DATA_KEY)\\n    this._element = null\\n  }\\n\\n  // Private\\n\\n  _getRootElement(element) {\\n    const selector = Util.getSelectorFromElement(element)\\n    let parent     = false\\n\\n    if (selector) {\\n      parent = document.querySelector(selector)\\n    }\\n\\n    if (!parent) {\\n      parent = $(element).closest(`.${ClassName.ALERT}`)[0]\\n    }\\n\\n    return parent\\n  }\\n\\n  _triggerCloseEvent(element) {\\n    const closeEvent = $.Event(Event.CLOSE)\\n\\n    $(element).trigger(closeEvent)\\n    return closeEvent\\n  }\\n\\n  _removeElement(element) {\\n    $(element).removeClass(ClassName.SHOW)\\n\\n    if (!$(element).hasClass(ClassName.FADE)) {\\n      this._destroyElement(element)\\n      return\\n    }\\n\\n    const transitionDuration = Util.getTransitionDurationFromElement(element)\\n\\n    $(element)\\n      .one(Util.TRANSITION_END, (event) => this._destroyElement(element, event))\\n      .emulateTransitionEnd(transitionDuration)\\n  }\\n\\n  _destroyElement(element) {\\n    $(element)\\n      .detach()\\n      .trigger(Event.CLOSED)\\n      .remove()\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      const $element = $(this)\\n      let data       = $element.data(DATA_KEY)\\n\\n      if (!data) {\\n        data = new Alert(this)\\n        $element.data(DATA_KEY, data)\\n      }\\n\\n      if (config === 'close') {\\n        data[config](this)\\n      }\\n    })\\n  }\\n\\n  static _handleDismiss(alertInstance) {\\n    return function (event) {\\n      if (event) {\\n        event.preventDefault()\\n      }\\n\\n      alertInstance.close(this)\\n    }\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Data Api implementation\\n * ------------------------------------------------------------------------\\n */\\n\\n$(document).on(\\n  Event.CLICK_DATA_API,\\n  Selector.DISMISS,\\n  Alert._handleDismiss(new Alert())\\n)\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME]             = Alert._jQueryInterface\\n$.fn[NAME].Constructor = Alert\\n$.fn[NAME].noConflict  = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Alert._jQueryInterface\\n}\\n\\nexport default Alert\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): button.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME                = 'button'\\nconst VERSION             = '4.3.1'\\nconst DATA_KEY            = 'bs.button'\\nconst EVENT_KEY           = `.${DATA_KEY}`\\nconst DATA_API_KEY        = '.data-api'\\nconst JQUERY_NO_CONFLICT  = $.fn[NAME]\\n\\nconst ClassName = {\\n  ACTIVE : 'active',\\n  BUTTON : 'btn',\\n  FOCUS  : 'focus'\\n}\\n\\nconst Selector = {\\n  DATA_TOGGLE_CARROT : '[data-toggle^=\\\"button\\\"]',\\n  DATA_TOGGLE        : '[data-toggle=\\\"buttons\\\"]',\\n  INPUT              : 'input:not([type=\\\"hidden\\\"])',\\n  ACTIVE             : '.active',\\n  BUTTON             : '.btn'\\n}\\n\\nconst Event = {\\n  CLICK_DATA_API      : `click${EVENT_KEY}${DATA_API_KEY}`,\\n  FOCUS_BLUR_DATA_API : `focus${EVENT_KEY}${DATA_API_KEY} ` +\\n                          `blur${EVENT_KEY}${DATA_API_KEY}`\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass Button {\\n  constructor(element) {\\n    this._element = element\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  // Public\\n\\n  toggle() {\\n    let triggerChangeEvent = true\\n    let addAriaPressed = true\\n    const rootElement = $(this._element).closest(\\n      Selector.DATA_TOGGLE\\n    )[0]\\n\\n    if (rootElement) {\\n      const input = this._element.querySelector(Selector.INPUT)\\n\\n      if (input) {\\n        if (input.type === 'radio') {\\n          if (input.checked &&\\n            this._element.classList.contains(ClassName.ACTIVE)) {\\n            triggerChangeEvent = false\\n          } else {\\n            const activeElement = rootElement.querySelector(Selector.ACTIVE)\\n\\n            if (activeElement) {\\n              $(activeElement).removeClass(ClassName.ACTIVE)\\n            }\\n          }\\n        }\\n\\n        if (triggerChangeEvent) {\\n          if (input.hasAttribute('disabled') ||\\n            rootElement.hasAttribute('disabled') ||\\n            input.classList.contains('disabled') ||\\n            rootElement.classList.contains('disabled')) {\\n            return\\n          }\\n          input.checked = !this._element.classList.contains(ClassName.ACTIVE)\\n          $(input).trigger('change')\\n        }\\n\\n        input.focus()\\n        addAriaPressed = false\\n      }\\n    }\\n\\n    if (addAriaPressed) {\\n      this._element.setAttribute('aria-pressed',\\n        !this._element.classList.contains(ClassName.ACTIVE))\\n    }\\n\\n    if (triggerChangeEvent) {\\n      $(this._element).toggleClass(ClassName.ACTIVE)\\n    }\\n  }\\n\\n  dispose() {\\n    $.removeData(this._element, DATA_KEY)\\n    this._element = null\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      let data = $(this).data(DATA_KEY)\\n\\n      if (!data) {\\n        data = new Button(this)\\n        $(this).data(DATA_KEY, data)\\n      }\\n\\n      if (config === 'toggle') {\\n        data[config]()\\n      }\\n    })\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Data Api implementation\\n * ------------------------------------------------------------------------\\n */\\n\\n$(document)\\n  .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {\\n    event.preventDefault()\\n\\n    let button = event.target\\n\\n    if (!$(button).hasClass(ClassName.BUTTON)) {\\n      button = $(button).closest(Selector.BUTTON)\\n    }\\n\\n    Button._jQueryInterface.call($(button), 'toggle')\\n  })\\n  .on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {\\n    const button = $(event.target).closest(Selector.BUTTON)[0]\\n    $(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type))\\n  })\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME] = Button._jQueryInterface\\n$.fn[NAME].Constructor = Button\\n$.fn[NAME].noConflict = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Button._jQueryInterface\\n}\\n\\nexport default Button\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): carousel.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\nimport Util from './util'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME                   = 'carousel'\\nconst VERSION                = '4.3.1'\\nconst DATA_KEY               = 'bs.carousel'\\nconst EVENT_KEY              = `.${DATA_KEY}`\\nconst DATA_API_KEY           = '.data-api'\\nconst JQUERY_NO_CONFLICT     = $.fn[NAME]\\nconst ARROW_LEFT_KEYCODE     = 37 // KeyboardEvent.which value for left arrow key\\nconst ARROW_RIGHT_KEYCODE    = 39 // KeyboardEvent.which value for right arrow key\\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\\nconst SWIPE_THRESHOLD        = 40\\n\\nconst Default = {\\n  interval : 5000,\\n  keyboard : true,\\n  slide    : false,\\n  pause    : 'hover',\\n  wrap     : true,\\n  touch    : true\\n}\\n\\nconst DefaultType = {\\n  interval : '(number|boolean)',\\n  keyboard : 'boolean',\\n  slide    : '(boolean|string)',\\n  pause    : '(string|boolean)',\\n  wrap     : 'boolean',\\n  touch    : 'boolean'\\n}\\n\\nconst Direction = {\\n  NEXT     : 'next',\\n  PREV     : 'prev',\\n  LEFT     : 'left',\\n  RIGHT    : 'right'\\n}\\n\\nconst Event = {\\n  SLIDE          : `slide${EVENT_KEY}`,\\n  SLID           : `slid${EVENT_KEY}`,\\n  KEYDOWN        : `keydown${EVENT_KEY}`,\\n  MOUSEENTER     : `mouseenter${EVENT_KEY}`,\\n  MOUSELEAVE     : `mouseleave${EVENT_KEY}`,\\n  TOUCHSTART     : `touchstart${EVENT_KEY}`,\\n  TOUCHMOVE      : `touchmove${EVENT_KEY}`,\\n  TOUCHEND       : `touchend${EVENT_KEY}`,\\n  POINTERDOWN    : `pointerdown${EVENT_KEY}`,\\n  POINTERUP      : `pointerup${EVENT_KEY}`,\\n  DRAG_START     : `dragstart${EVENT_KEY}`,\\n  LOAD_DATA_API  : `load${EVENT_KEY}${DATA_API_KEY}`,\\n  CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\\n}\\n\\nconst ClassName = {\\n  CAROUSEL      : 'carousel',\\n  ACTIVE        : 'active',\\n  SLIDE         : 'slide',\\n  RIGHT         : 'carousel-item-right',\\n  LEFT          : 'carousel-item-left',\\n  NEXT          : 'carousel-item-next',\\n  PREV          : 'carousel-item-prev',\\n  ITEM          : 'carousel-item',\\n  POINTER_EVENT : 'pointer-event'\\n}\\n\\nconst Selector = {\\n  ACTIVE      : '.active',\\n  ACTIVE_ITEM : '.active.carousel-item',\\n  ITEM        : '.carousel-item',\\n  ITEM_IMG    : '.carousel-item img',\\n  NEXT_PREV   : '.carousel-item-next, .carousel-item-prev',\\n  INDICATORS  : '.carousel-indicators',\\n  DATA_SLIDE  : '[data-slide], [data-slide-to]',\\n  DATA_RIDE   : '[data-ride=\\\"carousel\\\"]'\\n}\\n\\nconst PointerType = {\\n  TOUCH : 'touch',\\n  PEN   : 'pen'\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\nclass Carousel {\\n  constructor(element, config) {\\n    this._items         = null\\n    this._interval      = null\\n    this._activeElement = null\\n    this._isPaused      = false\\n    this._isSliding     = false\\n    this.touchTimeout   = null\\n    this.touchStartX    = 0\\n    this.touchDeltaX    = 0\\n\\n    this._config            = this._getConfig(config)\\n    this._element           = element\\n    this._indicatorsElement = this._element.querySelector(Selector.INDICATORS)\\n    this._touchSupported    = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\\n    this._pointerEvent      = Boolean(window.PointerEvent || window.MSPointerEvent)\\n\\n    this._addEventListeners()\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  static get Default() {\\n    return Default\\n  }\\n\\n  // Public\\n\\n  next() {\\n    if (!this._isSliding) {\\n      this._slide(Direction.NEXT)\\n    }\\n  }\\n\\n  nextWhenVisible() {\\n    // Don't call next when the page isn't visible\\n    // or the carousel or its parent isn't visible\\n    if (!document.hidden &&\\n      ($(this._element).is(':visible') && $(this._element).css('visibility') !== 'hidden')) {\\n      this.next()\\n    }\\n  }\\n\\n  prev() {\\n    if (!this._isSliding) {\\n      this._slide(Direction.PREV)\\n    }\\n  }\\n\\n  pause(event) {\\n    if (!event) {\\n      this._isPaused = true\\n    }\\n\\n    if (this._element.querySelector(Selector.NEXT_PREV)) {\\n      Util.triggerTransitionEnd(this._element)\\n      this.cycle(true)\\n    }\\n\\n    clearInterval(this._interval)\\n    this._interval = null\\n  }\\n\\n  cycle(event) {\\n    if (!event) {\\n      this._isPaused = false\\n    }\\n\\n    if (this._interval) {\\n      clearInterval(this._interval)\\n      this._interval = null\\n    }\\n\\n    if (this._config.interval && !this._isPaused) {\\n      this._interval = setInterval(\\n        (document.visibilityState ? this.nextWhenVisible : this.next).bind(this),\\n        this._config.interval\\n      )\\n    }\\n  }\\n\\n  to(index) {\\n    this._activeElement = this._element.querySelector(Selector.ACTIVE_ITEM)\\n\\n    const activeIndex = this._getItemIndex(this._activeElement)\\n\\n    if (index > this._items.length - 1 || index < 0) {\\n      return\\n    }\\n\\n    if (this._isSliding) {\\n      $(this._element).one(Event.SLID, () => this.to(index))\\n      return\\n    }\\n\\n    if (activeIndex === index) {\\n      this.pause()\\n      this.cycle()\\n      return\\n    }\\n\\n    const direction = index > activeIndex\\n      ? Direction.NEXT\\n      : Direction.PREV\\n\\n    this._slide(direction, this._items[index])\\n  }\\n\\n  dispose() {\\n    $(this._element).off(EVENT_KEY)\\n    $.removeData(this._element, DATA_KEY)\\n\\n    this._items             = null\\n    this._config            = null\\n    this._element           = null\\n    this._interval          = null\\n    this._isPaused          = null\\n    this._isSliding         = null\\n    this._activeElement     = null\\n    this._indicatorsElement = null\\n  }\\n\\n  // Private\\n\\n  _getConfig(config) {\\n    config = {\\n      ...Default,\\n      ...config\\n    }\\n    Util.typeCheckConfig(NAME, config, DefaultType)\\n    return config\\n  }\\n\\n  _handleSwipe() {\\n    const absDeltax = Math.abs(this.touchDeltaX)\\n\\n    if (absDeltax <= SWIPE_THRESHOLD) {\\n      return\\n    }\\n\\n    const direction = absDeltax / this.touchDeltaX\\n\\n    // swipe left\\n    if (direction > 0) {\\n      this.prev()\\n    }\\n\\n    // swipe right\\n    if (direction < 0) {\\n      this.next()\\n    }\\n  }\\n\\n  _addEventListeners() {\\n    if (this._config.keyboard) {\\n      $(this._element)\\n        .on(Event.KEYDOWN, (event) => this._keydown(event))\\n    }\\n\\n    if (this._config.pause === 'hover') {\\n      $(this._element)\\n        .on(Event.MOUSEENTER, (event) => this.pause(event))\\n        .on(Event.MOUSELEAVE, (event) => this.cycle(event))\\n    }\\n\\n    if (this._config.touch) {\\n      this._addTouchEventListeners()\\n    }\\n  }\\n\\n  _addTouchEventListeners() {\\n    if (!this._touchSupported) {\\n      return\\n    }\\n\\n    const start = (event) => {\\n      if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\\n        this.touchStartX = event.originalEvent.clientX\\n      } else if (!this._pointerEvent) {\\n        this.touchStartX = event.originalEvent.touches[0].clientX\\n      }\\n    }\\n\\n    const move = (event) => {\\n      // ensure swiping with one touch and not pinching\\n      if (event.originalEvent.touches && event.originalEvent.touches.length > 1) {\\n        this.touchDeltaX = 0\\n      } else {\\n        this.touchDeltaX = event.originalEvent.touches[0].clientX - this.touchStartX\\n      }\\n    }\\n\\n    const end = (event) => {\\n      if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\\n        this.touchDeltaX = event.originalEvent.clientX - this.touchStartX\\n      }\\n\\n      this._handleSwipe()\\n      if (this._config.pause === 'hover') {\\n        // If it's a touch-enabled device, mouseenter/leave are fired as\\n        // part of the mouse compatibility events on first tap - the carousel\\n        // would stop cycling until user tapped out of it;\\n        // here, we listen for touchend, explicitly pause the carousel\\n        // (as if it's the second time we tap on it, mouseenter compat event\\n        // is NOT fired) and after a timeout (to allow for mouse compatibility\\n        // events to fire) we explicitly restart cycling\\n\\n        this.pause()\\n        if (this.touchTimeout) {\\n          clearTimeout(this.touchTimeout)\\n        }\\n        this.touchTimeout = setTimeout((event) => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\\n      }\\n    }\\n\\n    $(this._element.querySelectorAll(Selector.ITEM_IMG)).on(Event.DRAG_START, (e) => e.preventDefault())\\n    if (this._pointerEvent) {\\n      $(this._element).on(Event.POINTERDOWN, (event) => start(event))\\n      $(this._element).on(Event.POINTERUP, (event) => end(event))\\n\\n      this._element.classList.add(ClassName.POINTER_EVENT)\\n    } else {\\n      $(this._element).on(Event.TOUCHSTART, (event) => start(event))\\n      $(this._element).on(Event.TOUCHMOVE, (event) => move(event))\\n      $(this._element).on(Event.TOUCHEND, (event) => end(event))\\n    }\\n  }\\n\\n  _keydown(event) {\\n    if (/input|textarea/i.test(event.target.tagName)) {\\n      return\\n    }\\n\\n    switch (event.which) {\\n      case ARROW_LEFT_KEYCODE:\\n        event.preventDefault()\\n        this.prev()\\n        break\\n      case ARROW_RIGHT_KEYCODE:\\n        event.preventDefault()\\n        this.next()\\n        break\\n      default:\\n    }\\n  }\\n\\n  _getItemIndex(element) {\\n    this._items = element && element.parentNode\\n      ? [].slice.call(element.parentNode.querySelectorAll(Selector.ITEM))\\n      : []\\n    return this._items.indexOf(element)\\n  }\\n\\n  _getItemByDirection(direction, activeElement) {\\n    const isNextDirection = direction === Direction.NEXT\\n    const isPrevDirection = direction === Direction.PREV\\n    const activeIndex     = this._getItemIndex(activeElement)\\n    const lastItemIndex   = this._items.length - 1\\n    const isGoingToWrap   = isPrevDirection && activeIndex === 0 ||\\n                            isNextDirection && activeIndex === lastItemIndex\\n\\n    if (isGoingToWrap && !this._config.wrap) {\\n      return activeElement\\n    }\\n\\n    const delta     = direction === Direction.PREV ? -1 : 1\\n    const itemIndex = (activeIndex + delta) % this._items.length\\n\\n    return itemIndex === -1\\n      ? this._items[this._items.length - 1] : this._items[itemIndex]\\n  }\\n\\n  _triggerSlideEvent(relatedTarget, eventDirectionName) {\\n    const targetIndex = this._getItemIndex(relatedTarget)\\n    const fromIndex = this._getItemIndex(this._element.querySelector(Selector.ACTIVE_ITEM))\\n    const slideEvent = $.Event(Event.SLIDE, {\\n      relatedTarget,\\n      direction: eventDirectionName,\\n      from: fromIndex,\\n      to: targetIndex\\n    })\\n\\n    $(this._element).trigger(slideEvent)\\n\\n    return slideEvent\\n  }\\n\\n  _setActiveIndicatorElement(element) {\\n    if (this._indicatorsElement) {\\n      const indicators = [].slice.call(this._indicatorsElement.querySelectorAll(Selector.ACTIVE))\\n      $(indicators)\\n        .removeClass(ClassName.ACTIVE)\\n\\n      const nextIndicator = this._indicatorsElement.children[\\n        this._getItemIndex(element)\\n      ]\\n\\n      if (nextIndicator) {\\n        $(nextIndicator).addClass(ClassName.ACTIVE)\\n      }\\n    }\\n  }\\n\\n  _slide(direction, element) {\\n    const activeElement = this._element.querySelector(Selector.ACTIVE_ITEM)\\n    const activeElementIndex = this._getItemIndex(activeElement)\\n    const nextElement   = element || activeElement &&\\n      this._getItemByDirection(direction, activeElement)\\n    const nextElementIndex = this._getItemIndex(nextElement)\\n    const isCycling = Boolean(this._interval)\\n\\n    let directionalClassName\\n    let orderClassName\\n    let eventDirectionName\\n\\n    if (direction === Direction.NEXT) {\\n      directionalClassName = ClassName.LEFT\\n      orderClassName = ClassName.NEXT\\n      eventDirectionName = Direction.LEFT\\n    } else {\\n      directionalClassName = ClassName.RIGHT\\n      orderClassName = ClassName.PREV\\n      eventDirectionName = Direction.RIGHT\\n    }\\n\\n    if (nextElement && $(nextElement).hasClass(ClassName.ACTIVE)) {\\n      this._isSliding = false\\n      return\\n    }\\n\\n    const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName)\\n    if (slideEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    if (!activeElement || !nextElement) {\\n      // Some weirdness is happening, so we bail\\n      return\\n    }\\n\\n    this._isSliding = true\\n\\n    if (isCycling) {\\n      this.pause()\\n    }\\n\\n    this._setActiveIndicatorElement(nextElement)\\n\\n    const slidEvent = $.Event(Event.SLID, {\\n      relatedTarget: nextElement,\\n      direction: eventDirectionName,\\n      from: activeElementIndex,\\n      to: nextElementIndex\\n    })\\n\\n    if ($(this._element).hasClass(ClassName.SLIDE)) {\\n      $(nextElement).addClass(orderClassName)\\n\\n      Util.reflow(nextElement)\\n\\n      $(activeElement).addClass(directionalClassName)\\n      $(nextElement).addClass(directionalClassName)\\n\\n      const nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10)\\n      if (nextElementInterval) {\\n        this._config.defaultInterval = this._config.defaultInterval || this._config.interval\\n        this._config.interval = nextElementInterval\\n      } else {\\n        this._config.interval = this._config.defaultInterval || this._config.interval\\n      }\\n\\n      const transitionDuration = Util.getTransitionDurationFromElement(activeElement)\\n\\n      $(activeElement)\\n        .one(Util.TRANSITION_END, () => {\\n          $(nextElement)\\n            .removeClass(`${directionalClassName} ${orderClassName}`)\\n            .addClass(ClassName.ACTIVE)\\n\\n          $(activeElement).removeClass(`${ClassName.ACTIVE} ${orderClassName} ${directionalClassName}`)\\n\\n          this._isSliding = false\\n\\n          setTimeout(() => $(this._element).trigger(slidEvent), 0)\\n        })\\n        .emulateTransitionEnd(transitionDuration)\\n    } else {\\n      $(activeElement).removeClass(ClassName.ACTIVE)\\n      $(nextElement).addClass(ClassName.ACTIVE)\\n\\n      this._isSliding = false\\n      $(this._element).trigger(slidEvent)\\n    }\\n\\n    if (isCycling) {\\n      this.cycle()\\n    }\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      let data = $(this).data(DATA_KEY)\\n      let _config = {\\n        ...Default,\\n        ...$(this).data()\\n      }\\n\\n      if (typeof config === 'object') {\\n        _config = {\\n          ..._config,\\n          ...config\\n        }\\n      }\\n\\n      const action = typeof config === 'string' ? config : _config.slide\\n\\n      if (!data) {\\n        data = new Carousel(this, _config)\\n        $(this).data(DATA_KEY, data)\\n      }\\n\\n      if (typeof config === 'number') {\\n        data.to(config)\\n      } else if (typeof action === 'string') {\\n        if (typeof data[action] === 'undefined') {\\n          throw new TypeError(`No method named \\\"${action}\\\"`)\\n        }\\n        data[action]()\\n      } else if (_config.interval && _config.ride) {\\n        data.pause()\\n        data.cycle()\\n      }\\n    })\\n  }\\n\\n  static _dataApiClickHandler(event) {\\n    const selector = Util.getSelectorFromElement(this)\\n\\n    if (!selector) {\\n      return\\n    }\\n\\n    const target = $(selector)[0]\\n\\n    if (!target || !$(target).hasClass(ClassName.CAROUSEL)) {\\n      return\\n    }\\n\\n    const config = {\\n      ...$(target).data(),\\n      ...$(this).data()\\n    }\\n    const slideIndex = this.getAttribute('data-slide-to')\\n\\n    if (slideIndex) {\\n      config.interval = false\\n    }\\n\\n    Carousel._jQueryInterface.call($(target), config)\\n\\n    if (slideIndex) {\\n      $(target).data(DATA_KEY).to(slideIndex)\\n    }\\n\\n    event.preventDefault()\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Data Api implementation\\n * ------------------------------------------------------------------------\\n */\\n\\n$(document)\\n  .on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler)\\n\\n$(window).on(Event.LOAD_DATA_API, () => {\\n  const carousels = [].slice.call(document.querySelectorAll(Selector.DATA_RIDE))\\n  for (let i = 0, len = carousels.length; i < len; i++) {\\n    const $carousel = $(carousels[i])\\n    Carousel._jQueryInterface.call($carousel, $carousel.data())\\n  }\\n})\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME] = Carousel._jQueryInterface\\n$.fn[NAME].Constructor = Carousel\\n$.fn[NAME].noConflict = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Carousel._jQueryInterface\\n}\\n\\nexport default Carousel\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): collapse.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\nimport Util from './util'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME                = 'collapse'\\nconst VERSION             = '4.3.1'\\nconst DATA_KEY            = 'bs.collapse'\\nconst EVENT_KEY           = `.${DATA_KEY}`\\nconst DATA_API_KEY        = '.data-api'\\nconst JQUERY_NO_CONFLICT  = $.fn[NAME]\\n\\nconst Default = {\\n  toggle : true,\\n  parent : ''\\n}\\n\\nconst DefaultType = {\\n  toggle : 'boolean',\\n  parent : '(string|element)'\\n}\\n\\nconst Event = {\\n  SHOW           : `show${EVENT_KEY}`,\\n  SHOWN          : `shown${EVENT_KEY}`,\\n  HIDE           : `hide${EVENT_KEY}`,\\n  HIDDEN         : `hidden${EVENT_KEY}`,\\n  CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\\n}\\n\\nconst ClassName = {\\n  SHOW       : 'show',\\n  COLLAPSE   : 'collapse',\\n  COLLAPSING : 'collapsing',\\n  COLLAPSED  : 'collapsed'\\n}\\n\\nconst Dimension = {\\n  WIDTH  : 'width',\\n  HEIGHT : 'height'\\n}\\n\\nconst Selector = {\\n  ACTIVES     : '.show, .collapsing',\\n  DATA_TOGGLE : '[data-toggle=\\\"collapse\\\"]'\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass Collapse {\\n  constructor(element, config) {\\n    this._isTransitioning = false\\n    this._element         = element\\n    this._config          = this._getConfig(config)\\n    this._triggerArray    = [].slice.call(document.querySelectorAll(\\n      `[data-toggle=\\\"collapse\\\"][href=\\\"#${element.id}\\\"],` +\\n      `[data-toggle=\\\"collapse\\\"][data-target=\\\"#${element.id}\\\"]`\\n    ))\\n\\n    const toggleList = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE))\\n    for (let i = 0, len = toggleList.length; i < len; i++) {\\n      const elem = toggleList[i]\\n      const selector = Util.getSelectorFromElement(elem)\\n      const filterElement = [].slice.call(document.querySelectorAll(selector))\\n        .filter((foundElem) => foundElem === element)\\n\\n      if (selector !== null && filterElement.length > 0) {\\n        this._selector = selector\\n        this._triggerArray.push(elem)\\n      }\\n    }\\n\\n    this._parent = this._config.parent ? this._getParent() : null\\n\\n    if (!this._config.parent) {\\n      this._addAriaAndCollapsedClass(this._element, this._triggerArray)\\n    }\\n\\n    if (this._config.toggle) {\\n      this.toggle()\\n    }\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  static get Default() {\\n    return Default\\n  }\\n\\n  // Public\\n\\n  toggle() {\\n    if ($(this._element).hasClass(ClassName.SHOW)) {\\n      this.hide()\\n    } else {\\n      this.show()\\n    }\\n  }\\n\\n  show() {\\n    if (this._isTransitioning ||\\n      $(this._element).hasClass(ClassName.SHOW)) {\\n      return\\n    }\\n\\n    let actives\\n    let activesData\\n\\n    if (this._parent) {\\n      actives = [].slice.call(this._parent.querySelectorAll(Selector.ACTIVES))\\n        .filter((elem) => {\\n          if (typeof this._config.parent === 'string') {\\n            return elem.getAttribute('data-parent') === this._config.parent\\n          }\\n\\n          return elem.classList.contains(ClassName.COLLAPSE)\\n        })\\n\\n      if (actives.length === 0) {\\n        actives = null\\n      }\\n    }\\n\\n    if (actives) {\\n      activesData = $(actives).not(this._selector).data(DATA_KEY)\\n      if (activesData && activesData._isTransitioning) {\\n        return\\n      }\\n    }\\n\\n    const startEvent = $.Event(Event.SHOW)\\n    $(this._element).trigger(startEvent)\\n    if (startEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    if (actives) {\\n      Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide')\\n      if (!activesData) {\\n        $(actives).data(DATA_KEY, null)\\n      }\\n    }\\n\\n    const dimension = this._getDimension()\\n\\n    $(this._element)\\n      .removeClass(ClassName.COLLAPSE)\\n      .addClass(ClassName.COLLAPSING)\\n\\n    this._element.style[dimension] = 0\\n\\n    if (this._triggerArray.length) {\\n      $(this._triggerArray)\\n        .removeClass(ClassName.COLLAPSED)\\n        .attr('aria-expanded', true)\\n    }\\n\\n    this.setTransitioning(true)\\n\\n    const complete = () => {\\n      $(this._element)\\n        .removeClass(ClassName.COLLAPSING)\\n        .addClass(ClassName.COLLAPSE)\\n        .addClass(ClassName.SHOW)\\n\\n      this._element.style[dimension] = ''\\n\\n      this.setTransitioning(false)\\n\\n      $(this._element).trigger(Event.SHOWN)\\n    }\\n\\n    const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\\n    const scrollSize = `scroll${capitalizedDimension}`\\n    const transitionDuration = Util.getTransitionDurationFromElement(this._element)\\n\\n    $(this._element)\\n      .one(Util.TRANSITION_END, complete)\\n      .emulateTransitionEnd(transitionDuration)\\n\\n    this._element.style[dimension] = `${this._element[scrollSize]}px`\\n  }\\n\\n  hide() {\\n    if (this._isTransitioning ||\\n      !$(this._element).hasClass(ClassName.SHOW)) {\\n      return\\n    }\\n\\n    const startEvent = $.Event(Event.HIDE)\\n    $(this._element).trigger(startEvent)\\n    if (startEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    const dimension = this._getDimension()\\n\\n    this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\\n\\n    Util.reflow(this._element)\\n\\n    $(this._element)\\n      .addClass(ClassName.COLLAPSING)\\n      .removeClass(ClassName.COLLAPSE)\\n      .removeClass(ClassName.SHOW)\\n\\n    const triggerArrayLength = this._triggerArray.length\\n    if (triggerArrayLength > 0) {\\n      for (let i = 0; i < triggerArrayLength; i++) {\\n        const trigger = this._triggerArray[i]\\n        const selector = Util.getSelectorFromElement(trigger)\\n\\n        if (selector !== null) {\\n          const $elem = $([].slice.call(document.querySelectorAll(selector)))\\n          if (!$elem.hasClass(ClassName.SHOW)) {\\n            $(trigger).addClass(ClassName.COLLAPSED)\\n              .attr('aria-expanded', false)\\n          }\\n        }\\n      }\\n    }\\n\\n    this.setTransitioning(true)\\n\\n    const complete = () => {\\n      this.setTransitioning(false)\\n      $(this._element)\\n        .removeClass(ClassName.COLLAPSING)\\n        .addClass(ClassName.COLLAPSE)\\n        .trigger(Event.HIDDEN)\\n    }\\n\\n    this._element.style[dimension] = ''\\n    const transitionDuration = Util.getTransitionDurationFromElement(this._element)\\n\\n    $(this._element)\\n      .one(Util.TRANSITION_END, complete)\\n      .emulateTransitionEnd(transitionDuration)\\n  }\\n\\n  setTransitioning(isTransitioning) {\\n    this._isTransitioning = isTransitioning\\n  }\\n\\n  dispose() {\\n    $.removeData(this._element, DATA_KEY)\\n\\n    this._config          = null\\n    this._parent          = null\\n    this._element         = null\\n    this._triggerArray    = null\\n    this._isTransitioning = null\\n  }\\n\\n  // Private\\n\\n  _getConfig(config) {\\n    config = {\\n      ...Default,\\n      ...config\\n    }\\n    config.toggle = Boolean(config.toggle) // Coerce string values\\n    Util.typeCheckConfig(NAME, config, DefaultType)\\n    return config\\n  }\\n\\n  _getDimension() {\\n    const hasWidth = $(this._element).hasClass(Dimension.WIDTH)\\n    return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT\\n  }\\n\\n  _getParent() {\\n    let parent\\n\\n    if (Util.isElement(this._config.parent)) {\\n      parent = this._config.parent\\n\\n      // It's a jQuery object\\n      if (typeof this._config.parent.jquery !== 'undefined') {\\n        parent = this._config.parent[0]\\n      }\\n    } else {\\n      parent = document.querySelector(this._config.parent)\\n    }\\n\\n    const selector =\\n      `[data-toggle=\\\"collapse\\\"][data-parent=\\\"${this._config.parent}\\\"]`\\n\\n    const children = [].slice.call(parent.querySelectorAll(selector))\\n    $(children).each((i, element) => {\\n      this._addAriaAndCollapsedClass(\\n        Collapse._getTargetFromElement(element),\\n        [element]\\n      )\\n    })\\n\\n    return parent\\n  }\\n\\n  _addAriaAndCollapsedClass(element, triggerArray) {\\n    const isOpen = $(element).hasClass(ClassName.SHOW)\\n\\n    if (triggerArray.length) {\\n      $(triggerArray)\\n        .toggleClass(ClassName.COLLAPSED, !isOpen)\\n        .attr('aria-expanded', isOpen)\\n    }\\n  }\\n\\n  // Static\\n\\n  static _getTargetFromElement(element) {\\n    const selector = Util.getSelectorFromElement(element)\\n    return selector ? document.querySelector(selector) : null\\n  }\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      const $this   = $(this)\\n      let data      = $this.data(DATA_KEY)\\n      const _config = {\\n        ...Default,\\n        ...$this.data(),\\n        ...typeof config === 'object' && config ? config : {}\\n      }\\n\\n      if (!data && _config.toggle && /show|hide/.test(config)) {\\n        _config.toggle = false\\n      }\\n\\n      if (!data) {\\n        data = new Collapse(this, _config)\\n        $this.data(DATA_KEY, data)\\n      }\\n\\n      if (typeof config === 'string') {\\n        if (typeof data[config] === 'undefined') {\\n          throw new TypeError(`No method named \\\"${config}\\\"`)\\n        }\\n        data[config]()\\n      }\\n    })\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Data Api implementation\\n * ------------------------------------------------------------------------\\n */\\n\\n$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\\n  // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\\n  if (event.currentTarget.tagName === 'A') {\\n    event.preventDefault()\\n  }\\n\\n  const $trigger = $(this)\\n  const selector = Util.getSelectorFromElement(this)\\n  const selectors = [].slice.call(document.querySelectorAll(selector))\\n\\n  $(selectors).each(function () {\\n    const $target = $(this)\\n    const data    = $target.data(DATA_KEY)\\n    const config  = data ? 'toggle' : $trigger.data()\\n    Collapse._jQueryInterface.call($target, config)\\n  })\\n})\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME] = Collapse._jQueryInterface\\n$.fn[NAME].Constructor = Collapse\\n$.fn[NAME].noConflict = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Collapse._jQueryInterface\\n}\\n\\nexport default Collapse\\n\",\"/**!\\n * @fileOverview Kickass library to create and place poppers near their reference elements.\\n * @version 1.14.7\\n * @license\\n * Copyright (c) 2016 Federico Zivolo and contributors\\n *\\n * Permission is hereby granted, free of charge, to any person obtaining a copy\\n * of this software and associated documentation files (the \\\"Software\\\"), to deal\\n * in the Software without restriction, including without limitation the rights\\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\\n * copies of the Software, and to permit persons to whom the Software is\\n * furnished to do so, subject to the following conditions:\\n *\\n * The above copyright notice and this permission notice shall be included in all\\n * copies or substantial portions of the Software.\\n *\\n * THE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\\n * SOFTWARE.\\n */\\nvar isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';\\n\\nvar longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];\\nvar timeoutDuration = 0;\\nfor (var i = 0; i < longerTimeoutBrowsers.length; i += 1) {\\n  if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {\\n    timeoutDuration = 1;\\n    break;\\n  }\\n}\\n\\nfunction microtaskDebounce(fn) {\\n  var called = false;\\n  return function () {\\n    if (called) {\\n      return;\\n    }\\n    called = true;\\n    window.Promise.resolve().then(function () {\\n      called = false;\\n      fn();\\n    });\\n  };\\n}\\n\\nfunction taskDebounce(fn) {\\n  var scheduled = false;\\n  return function () {\\n    if (!scheduled) {\\n      scheduled = true;\\n      setTimeout(function () {\\n        scheduled = false;\\n        fn();\\n      }, timeoutDuration);\\n    }\\n  };\\n}\\n\\nvar supportsMicroTasks = isBrowser && window.Promise;\\n\\n/**\\n* Create a debounced version of a method, that's asynchronously deferred\\n* but called in the minimum time possible.\\n*\\n* @method\\n* @memberof Popper.Utils\\n* @argument {Function} fn\\n* @returns {Function}\\n*/\\nvar debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce;\\n\\n/**\\n * Check if the given variable is a function\\n * @method\\n * @memberof Popper.Utils\\n * @argument {Any} functionToCheck - variable to check\\n * @returns {Boolean} answer to: is a function?\\n */\\nfunction isFunction(functionToCheck) {\\n  var getType = {};\\n  return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';\\n}\\n\\n/**\\n * Get CSS computed property of the given element\\n * @method\\n * @memberof Popper.Utils\\n * @argument {Eement} element\\n * @argument {String} property\\n */\\nfunction getStyleComputedProperty(element, property) {\\n  if (element.nodeType !== 1) {\\n    return [];\\n  }\\n  // NOTE: 1 DOM access here\\n  var window = element.ownerDocument.defaultView;\\n  var css = window.getComputedStyle(element, null);\\n  return property ? css[property] : css;\\n}\\n\\n/**\\n * Returns the parentNode or the host of the element\\n * @method\\n * @memberof Popper.Utils\\n * @argument {Element} element\\n * @returns {Element} parent\\n */\\nfunction getParentNode(element) {\\n  if (element.nodeName === 'HTML') {\\n    return element;\\n  }\\n  return element.parentNode || element.host;\\n}\\n\\n/**\\n * Returns the scrolling parent of the given element\\n * @method\\n * @memberof Popper.Utils\\n * @argument {Element} element\\n * @returns {Element} scroll parent\\n */\\nfunction getScrollParent(element) {\\n  // Return body, `getScroll` will take care to get the correct `scrollTop` from it\\n  if (!element) {\\n    return document.body;\\n  }\\n\\n  switch (element.nodeName) {\\n    case 'HTML':\\n    case 'BODY':\\n      return element.ownerDocument.body;\\n    case '#document':\\n      return element.body;\\n  }\\n\\n  // Firefox want us to check `-x` and `-y` variations as well\\n\\n  var _getStyleComputedProp = getStyleComputedProperty(element),\\n      overflow = _getStyleComputedProp.overflow,\\n      overflowX = _getStyleComputedProp.overflowX,\\n      overflowY = _getStyleComputedProp.overflowY;\\n\\n  if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {\\n    return element;\\n  }\\n\\n  return getScrollParent(getParentNode(element));\\n}\\n\\nvar isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode);\\nvar isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent);\\n\\n/**\\n * Determines if the browser is Internet Explorer\\n * @method\\n * @memberof Popper.Utils\\n * @param {Number} version to check\\n * @returns {Boolean} isIE\\n */\\nfunction isIE(version) {\\n  if (version === 11) {\\n    return isIE11;\\n  }\\n  if (version === 10) {\\n    return isIE10;\\n  }\\n  return isIE11 || isIE10;\\n}\\n\\n/**\\n * Returns the offset parent of the given element\\n * @method\\n * @memberof Popper.Utils\\n * @argument {Element} element\\n * @returns {Element} offset parent\\n */\\nfunction getOffsetParent(element) {\\n  if (!element) {\\n    return document.documentElement;\\n  }\\n\\n  var noOffsetParent = isIE(10) ? document.body : null;\\n\\n  // NOTE: 1 DOM access here\\n  var offsetParent = element.offsetParent || null;\\n  // Skip hidden elements which don't have an offsetParent\\n  while (offsetParent === noOffsetParent && element.nextElementSibling) {\\n    offsetParent = (element = element.nextElementSibling).offsetParent;\\n  }\\n\\n  var nodeName = offsetParent && offsetParent.nodeName;\\n\\n  if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {\\n    return element ? element.ownerDocument.documentElement : document.documentElement;\\n  }\\n\\n  // .offsetParent will return the closest TH, TD or TABLE in case\\n  // no offsetParent is present, I hate this job...\\n  if (['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') {\\n    return getOffsetParent(offsetParent);\\n  }\\n\\n  return offsetParent;\\n}\\n\\nfunction isOffsetContainer(element) {\\n  var nodeName = element.nodeName;\\n\\n  if (nodeName === 'BODY') {\\n    return false;\\n  }\\n  return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element;\\n}\\n\\n/**\\n * Finds the root node (document, shadowDOM root) of the given element\\n * @method\\n * @memberof Popper.Utils\\n * @argument {Element} node\\n * @returns {Element} root node\\n */\\nfunction getRoot(node) {\\n  if (node.parentNode !== null) {\\n    return getRoot(node.parentNode);\\n  }\\n\\n  return node;\\n}\\n\\n/**\\n * Finds the offset parent common to the two provided nodes\\n * @method\\n * @memberof Popper.Utils\\n * @argument {Element} element1\\n * @argument {Element} element2\\n * @returns {Element} common offset parent\\n */\\nfunction findCommonOffsetParent(element1, element2) {\\n  // This check is needed to avoid errors in case one of the elements isn't defined for any reason\\n  if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) {\\n    return document.documentElement;\\n  }\\n\\n  // Here we make sure to give as \\\"start\\\" the element that comes first in the DOM\\n  var order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING;\\n  var start = order ? element1 : element2;\\n  var end = order ? element2 : element1;\\n\\n  // Get common ancestor container\\n  var range = document.createRange();\\n  range.setStart(start, 0);\\n  range.setEnd(end, 0);\\n  var commonAncestorContainer = range.commonAncestorContainer;\\n\\n  // Both nodes are inside #document\\n\\n  if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) {\\n    if (isOffsetContainer(commonAncestorContainer)) {\\n      return commonAncestorContainer;\\n    }\\n\\n    return getOffsetParent(commonAncestorContainer);\\n  }\\n\\n  // one of the nodes is inside shadowDOM, find which one\\n  var element1root = getRoot(element1);\\n  if (element1root.host) {\\n    return findCommonOffsetParent(element1root.host, element2);\\n  } else {\\n    return findCommonOffsetParent(element1, getRoot(element2).host);\\n  }\\n}\\n\\n/**\\n * Gets the scroll value of the given element in the given side (top and left)\\n * @method\\n * @memberof Popper.Utils\\n * @argument {Element} element\\n * @argument {String} side `top` or `left`\\n * @returns {number} amount of scrolled pixels\\n */\\nfunction getScroll(element) {\\n  var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top';\\n\\n  var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';\\n  var nodeName = element.nodeName;\\n\\n  if (nodeName === 'BODY' || nodeName === 'HTML') {\\n    var html = element.ownerDocument.documentElement;\\n    var scrollingElement = element.ownerDocument.scrollingElement || html;\\n    return scrollingElement[upperSide];\\n  }\\n\\n  return element[upperSide];\\n}\\n\\n/*\\n * Sum or subtract the element scroll values (left and top) from a given rect object\\n * @method\\n * @memberof Popper.Utils\\n * @param {Object} rect - Rect object you want to change\\n * @param {HTMLElement} element - The element from the function reads the scroll values\\n * @param {Boolean} subtract - set to true if you want to subtract the scroll values\\n * @return {Object} rect - The modifier rect object\\n */\\nfunction includeScroll(rect, element) {\\n  var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\\n\\n  var scrollTop = getScroll(element, 'top');\\n  var scrollLeft = getScroll(element, 'left');\\n  var modifier = subtract ? -1 : 1;\\n  rect.top += scrollTop * modifier;\\n  rect.bottom += scrollTop * modifier;\\n  rect.left += scrollLeft * modifier;\\n  rect.right += scrollLeft * modifier;\\n  return rect;\\n}\\n\\n/*\\n * Helper to detect borders of a given element\\n * @method\\n * @memberof Popper.Utils\\n * @param {CSSStyleDeclaration} styles\\n * Result of `getStyleComputedProperty` on the given element\\n * @param {String} axis - `x` or `y`\\n * @return {number} borders - The borders size of the given axis\\n */\\n\\nfunction getBordersSize(styles, axis) {\\n  var sideA = axis === 'x' ? 'Left' : 'Top';\\n  var sideB = sideA === 'Left' ? 'Right' : 'Bottom';\\n\\n  return parseFloat(styles['border' + sideA + 'Width'], 10) + parseFloat(styles['border' + sideB + 'Width'], 10);\\n}\\n\\nfunction getSize(axis, body, html, computedStyle) {\\n  return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE(10) ? parseInt(html['offset' + axis]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')]) : 0);\\n}\\n\\nfunction getWindowSizes(document) {\\n  var body = document.body;\\n  var html = document.documentElement;\\n  var computedStyle = isIE(10) && getComputedStyle(html);\\n\\n  return {\\n    height: getSize('Height', body, html, computedStyle),\\n    width: getSize('Width', body, html, computedStyle)\\n  };\\n}\\n\\nvar classCallCheck = function (instance, Constructor) {\\n  if (!(instance instanceof Constructor)) {\\n    throw new TypeError(\\\"Cannot call a class as a function\\\");\\n  }\\n};\\n\\nvar createClass = function () {\\n  function defineProperties(target, props) {\\n    for (var i = 0; i < props.length; i++) {\\n      var descriptor = props[i];\\n      descriptor.enumerable = descriptor.enumerable || false;\\n      descriptor.configurable = true;\\n      if (\\\"value\\\" in descriptor) descriptor.writable = true;\\n      Object.defineProperty(target, descriptor.key, descriptor);\\n    }\\n  }\\n\\n  return function (Constructor, protoProps, staticProps) {\\n    if (protoProps) defineProperties(Constructor.prototype, protoProps);\\n    if (staticProps) defineProperties(Constructor, staticProps);\\n    return Constructor;\\n  };\\n}();\\n\\n\\n\\n\\n\\nvar defineProperty = function (obj, key, value) {\\n  if (key in obj) {\\n    Object.defineProperty(obj, key, {\\n      value: value,\\n      enumerable: true,\\n      configurable: true,\\n      writable: true\\n    });\\n  } else {\\n    obj[key] = value;\\n  }\\n\\n  return obj;\\n};\\n\\nvar _extends = Object.assign || function (target) {\\n  for (var i = 1; i < arguments.length; i++) {\\n    var source = arguments[i];\\n\\n    for (var key in source) {\\n      if (Object.prototype.hasOwnProperty.call(source, key)) {\\n        target[key] = source[key];\\n      }\\n    }\\n  }\\n\\n  return target;\\n};\\n\\n/**\\n * Given element offsets, generate an output similar to getBoundingClientRect\\n * @method\\n * @memberof Popper.Utils\\n * @argument {Object} offsets\\n * @returns {Object} ClientRect like output\\n */\\nfunction getClientRect(offsets) {\\n  return _extends({}, offsets, {\\n    right: offsets.left + offsets.width,\\n    bottom: offsets.top + offsets.height\\n  });\\n}\\n\\n/**\\n * Get bounding client rect of given element\\n * @method\\n * @memberof Popper.Utils\\n * @param {HTMLElement} element\\n * @return {Object} client rect\\n */\\nfunction getBoundingClientRect(element) {\\n  var rect = {};\\n\\n  // IE10 10 FIX: Please, don't ask, the element isn't\\n  // considered in DOM in some circumstances...\\n  // This isn't reproducible in IE10 compatibility mode of IE11\\n  try {\\n    if (isIE(10)) {\\n      rect = element.getBoundingClientRect();\\n      var scrollTop = getScroll(element, 'top');\\n      var scrollLeft = getScroll(element, 'left');\\n      rect.top += scrollTop;\\n      rect.left += scrollLeft;\\n      rect.bottom += scrollTop;\\n      rect.right += scrollLeft;\\n    } else {\\n      rect = element.getBoundingClientRect();\\n    }\\n  } catch (e) {}\\n\\n  var result = {\\n    left: rect.left,\\n    top: rect.top,\\n    width: rect.right - rect.left,\\n    height: rect.bottom - rect.top\\n  };\\n\\n  // subtract scrollbar size from sizes\\n  var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};\\n  var width = sizes.width || element.clientWidth || result.right - result.left;\\n  var height = sizes.height || element.clientHeight || result.bottom - result.top;\\n\\n  var horizScrollbar = element.offsetWidth - width;\\n  var vertScrollbar = element.offsetHeight - height;\\n\\n  // if an hypothetical scrollbar is detected, we must be sure it's not a `border`\\n  // we make this check conditional for performance reasons\\n  if (horizScrollbar || vertScrollbar) {\\n    var styles = getStyleComputedProperty(element);\\n    horizScrollbar -= getBordersSize(styles, 'x');\\n    vertScrollbar -= getBordersSize(styles, 'y');\\n\\n    result.width -= horizScrollbar;\\n    result.height -= vertScrollbar;\\n  }\\n\\n  return getClientRect(result);\\n}\\n\\nfunction getOffsetRectRelativeToArbitraryNode(children, parent) {\\n  var fixedPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\\n\\n  var isIE10 = isIE(10);\\n  var isHTML = parent.nodeName === 'HTML';\\n  var childrenRect = getBoundingClientRect(children);\\n  var parentRect = getBoundingClientRect(parent);\\n  var scrollParent = getScrollParent(children);\\n\\n  var styles = getStyleComputedProperty(parent);\\n  var borderTopWidth = parseFloat(styles.borderTopWidth, 10);\\n  var borderLeftWidth = parseFloat(styles.borderLeftWidth, 10);\\n\\n  // In cases where the parent is fixed, we must ignore negative scroll in offset calc\\n  if (fixedPosition && isHTML) {\\n    parentRect.top = Math.max(parentRect.top, 0);\\n    parentRect.left = Math.max(parentRect.left, 0);\\n  }\\n  var offsets = getClientRect({\\n    top: childrenRect.top - parentRect.top - borderTopWidth,\\n    left: childrenRect.left - parentRect.left - borderLeftWidth,\\n    width: childrenRect.width,\\n    height: childrenRect.height\\n  });\\n  offsets.marginTop = 0;\\n  offsets.marginLeft = 0;\\n\\n  // Subtract margins of documentElement in case it's being used as parent\\n  // we do this only on HTML because it's the only element that behaves\\n  // differently when margins are applied to it. The margins are included in\\n  // the box of the documentElement, in the other cases not.\\n  if (!isIE10 && isHTML) {\\n    var marginTop = parseFloat(styles.marginTop, 10);\\n    var marginLeft = parseFloat(styles.marginLeft, 10);\\n\\n    offsets.top -= borderTopWidth - marginTop;\\n    offsets.bottom -= borderTopWidth - marginTop;\\n    offsets.left -= borderLeftWidth - marginLeft;\\n    offsets.right -= borderLeftWidth - marginLeft;\\n\\n    // Attach marginTop and marginLeft because in some circumstances we may need them\\n    offsets.marginTop = marginTop;\\n    offsets.marginLeft = marginLeft;\\n  }\\n\\n  if (isIE10 && !fixedPosition ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') {\\n    offsets = includeScroll(offsets, parent);\\n  }\\n\\n  return offsets;\\n}\\n\\nfunction getViewportOffsetRectRelativeToArtbitraryNode(element) {\\n  var excludeScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\\n\\n  var html = element.ownerDocument.documentElement;\\n  var relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html);\\n  var width = Math.max(html.clientWidth, window.innerWidth || 0);\\n  var height = Math.max(html.clientHeight, window.innerHeight || 0);\\n\\n  var scrollTop = !excludeScroll ? getScroll(html) : 0;\\n  var scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0;\\n\\n  var offset = {\\n    top: scrollTop - relativeOffset.top + relativeOffset.marginTop,\\n    left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft,\\n    width: width,\\n    height: height\\n  };\\n\\n  return getClientRect(offset);\\n}\\n\\n/**\\n * Check if the given element is fixed or is inside a fixed parent\\n * @method\\n * @memberof Popper.Utils\\n * @argument {Element} element\\n * @argument {Element} customContainer\\n * @returns {Boolean} answer to \\\"isFixed?\\\"\\n */\\nfunction isFixed(element) {\\n  var nodeName = element.nodeName;\\n  if (nodeName === 'BODY' || nodeName === 'HTML') {\\n    return false;\\n  }\\n  if (getStyleComputedProperty(element, 'position') === 'fixed') {\\n    return true;\\n  }\\n  var parentNode = getParentNode(element);\\n  if (!parentNode) {\\n    return false;\\n  }\\n  return isFixed(parentNode);\\n}\\n\\n/**\\n * Finds the first parent of an element that has a transformed property defined\\n * @method\\n * @memberof Popper.Utils\\n * @argument {Element} element\\n * @returns {Element} first transformed parent or documentElement\\n */\\n\\nfunction getFixedPositionOffsetParent(element) {\\n  // This check is needed to avoid errors in case one of the elements isn't defined for any reason\\n  if (!element || !element.parentElement || isIE()) {\\n    return document.documentElement;\\n  }\\n  var el = element.parentElement;\\n  while (el && getStyleComputedProperty(el, 'transform') === 'none') {\\n    el = el.parentElement;\\n  }\\n  return el || document.documentElement;\\n}\\n\\n/**\\n * Computed the boundaries limits and return them\\n * @method\\n * @memberof Popper.Utils\\n * @param {HTMLElement} popper\\n * @param {HTMLElement} reference\\n * @param {number} padding\\n * @param {HTMLElement} boundariesElement - Element used to define the boundaries\\n * @param {Boolean} fixedPosition - Is in fixed position mode\\n * @returns {Object} Coordinates of the boundaries\\n */\\nfunction getBoundaries(popper, reference, padding, boundariesElement) {\\n  var fixedPosition = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\\n\\n  // NOTE: 1 DOM access here\\n\\n  var boundaries = { top: 0, left: 0 };\\n  var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);\\n\\n  // Handle viewport case\\n  if (boundariesElement === 'viewport') {\\n    boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition);\\n  } else {\\n    // Handle other cases based on DOM element used as boundaries\\n    var boundariesNode = void 0;\\n    if (boundariesElement === 'scrollParent') {\\n      boundariesNode = getScrollParent(getParentNode(reference));\\n      if (boundariesNode.nodeName === 'BODY') {\\n        boundariesNode = popper.ownerDocument.documentElement;\\n      }\\n    } else if (boundariesElement === 'window') {\\n      boundariesNode = popper.ownerDocument.documentElement;\\n    } else {\\n      boundariesNode = boundariesElement;\\n    }\\n\\n    var offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition);\\n\\n    // In case of HTML, we need a different computation\\n    if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {\\n      var _getWindowSizes = getWindowSizes(popper.ownerDocument),\\n          height = _getWindowSizes.height,\\n          width = _getWindowSizes.width;\\n\\n      boundaries.top += offsets.top - offsets.marginTop;\\n      boundaries.bottom = height + offsets.top;\\n      boundaries.left += offsets.left - offsets.marginLeft;\\n      boundaries.right = width + offsets.left;\\n    } else {\\n      // for all the other DOM elements, this one is good\\n      boundaries = offsets;\\n    }\\n  }\\n\\n  // Add paddings\\n  padding = padding || 0;\\n  var isPaddingNumber = typeof padding === 'number';\\n  boundaries.left += isPaddingNumber ? padding : padding.left || 0;\\n  boundaries.top += isPaddingNumber ? padding : padding.top || 0;\\n  boundaries.right -= isPaddingNumber ? padding : padding.right || 0;\\n  boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0;\\n\\n  return boundaries;\\n}\\n\\nfunction getArea(_ref) {\\n  var width = _ref.width,\\n      height = _ref.height;\\n\\n  return width * height;\\n}\\n\\n/**\\n * Utility used to transform the `auto` placement to the placement with more\\n * available space.\\n * @method\\n * @memberof Popper.Utils\\n * @argument {Object} data - The data object generated by update method\\n * @argument {Object} options - Modifiers configuration and options\\n * @returns {Object} The data object, properly modified\\n */\\nfunction computeAutoPlacement(placement, refRect, popper, reference, boundariesElement) {\\n  var padding = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;\\n\\n  if (placement.indexOf('auto') === -1) {\\n    return placement;\\n  }\\n\\n  var boundaries = getBoundaries(popper, reference, padding, boundariesElement);\\n\\n  var rects = {\\n    top: {\\n      width: boundaries.width,\\n      height: refRect.top - boundaries.top\\n    },\\n    right: {\\n      width: boundaries.right - refRect.right,\\n      height: boundaries.height\\n    },\\n    bottom: {\\n      width: boundaries.width,\\n      height: boundaries.bottom - refRect.bottom\\n    },\\n    left: {\\n      width: refRect.left - boundaries.left,\\n      height: boundaries.height\\n    }\\n  };\\n\\n  var sortedAreas = Object.keys(rects).map(function (key) {\\n    return _extends({\\n      key: key\\n    }, rects[key], {\\n      area: getArea(rects[key])\\n    });\\n  }).sort(function (a, b) {\\n    return b.area - a.area;\\n  });\\n\\n  var filteredAreas = sortedAreas.filter(function (_ref2) {\\n    var width = _ref2.width,\\n        height = _ref2.height;\\n    return width >= popper.clientWidth && height >= popper.clientHeight;\\n  });\\n\\n  var computedPlacement = filteredAreas.length > 0 ? filteredAreas[0].key : sortedAreas[0].key;\\n\\n  var variation = placement.split('-')[1];\\n\\n  return computedPlacement + (variation ? '-' + variation : '');\\n}\\n\\n/**\\n * Get offsets to the reference element\\n * @method\\n * @memberof Popper.Utils\\n * @param {Object} state\\n * @param {Element} popper - the popper element\\n * @param {Element} reference - the reference element (the popper will be relative to this)\\n * @param {Element} fixedPosition - is in fixed position mode\\n * @returns {Object} An object containing the offsets which will be applied to the popper\\n */\\nfunction getReferenceOffsets(state, popper, reference) {\\n  var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\\n\\n  var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);\\n  return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);\\n}\\n\\n/**\\n * Get the outer sizes of the given element (offset size + margins)\\n * @method\\n * @memberof Popper.Utils\\n * @argument {Element} element\\n * @returns {Object} object containing width and height properties\\n */\\nfunction getOuterSizes(element) {\\n  var window = element.ownerDocument.defaultView;\\n  var styles = window.getComputedStyle(element);\\n  var x = parseFloat(styles.marginTop || 0) + parseFloat(styles.marginBottom || 0);\\n  var y = parseFloat(styles.marginLeft || 0) + parseFloat(styles.marginRight || 0);\\n  var result = {\\n    width: element.offsetWidth + y,\\n    height: element.offsetHeight + x\\n  };\\n  return result;\\n}\\n\\n/**\\n * Get the opposite placement of the given one\\n * @method\\n * @memberof Popper.Utils\\n * @argument {String} placement\\n * @returns {String} flipped placement\\n */\\nfunction getOppositePlacement(placement) {\\n  var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' };\\n  return placement.replace(/left|right|bottom|top/g, function (matched) {\\n    return hash[matched];\\n  });\\n}\\n\\n/**\\n * Get offsets to the popper\\n * @method\\n * @memberof Popper.Utils\\n * @param {Object} position - CSS position the Popper will get applied\\n * @param {HTMLElement} popper - the popper element\\n * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this)\\n * @param {String} placement - one of the valid placement options\\n * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper\\n */\\nfunction getPopperOffsets(popper, referenceOffsets, placement) {\\n  placement = placement.split('-')[0];\\n\\n  // Get popper node sizes\\n  var popperRect = getOuterSizes(popper);\\n\\n  // Add position, width and height to our offsets object\\n  var popperOffsets = {\\n    width: popperRect.width,\\n    height: popperRect.height\\n  };\\n\\n  // depending by the popper placement we have to compute its offsets slightly differently\\n  var isHoriz = ['right', 'left'].indexOf(placement) !== -1;\\n  var mainSide = isHoriz ? 'top' : 'left';\\n  var secondarySide = isHoriz ? 'left' : 'top';\\n  var measurement = isHoriz ? 'height' : 'width';\\n  var secondaryMeasurement = !isHoriz ? 'height' : 'width';\\n\\n  popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2;\\n  if (placement === secondarySide) {\\n    popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement];\\n  } else {\\n    popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)];\\n  }\\n\\n  return popperOffsets;\\n}\\n\\n/**\\n * Mimics the `find` method of Array\\n * @method\\n * @memberof Popper.Utils\\n * @argument {Array} arr\\n * @argument prop\\n * @argument value\\n * @returns index or -1\\n */\\nfunction find(arr, check) {\\n  // use native find if supported\\n  if (Array.prototype.find) {\\n    return arr.find(check);\\n  }\\n\\n  // use `filter` to obtain the same behavior of `find`\\n  return arr.filter(check)[0];\\n}\\n\\n/**\\n * Return the index of the matching object\\n * @method\\n * @memberof Popper.Utils\\n * @argument {Array} arr\\n * @argument prop\\n * @argument value\\n * @returns index or -1\\n */\\nfunction findIndex(arr, prop, value) {\\n  // use native findIndex if supported\\n  if (Array.prototype.findIndex) {\\n    return arr.findIndex(function (cur) {\\n      return cur[prop] === value;\\n    });\\n  }\\n\\n  // use `find` + `indexOf` if `findIndex` isn't supported\\n  var match = find(arr, function (obj) {\\n    return obj[prop] === value;\\n  });\\n  return arr.indexOf(match);\\n}\\n\\n/**\\n * Loop trough the list of modifiers and run them in order,\\n * each of them will then edit the data object.\\n * @method\\n * @memberof Popper.Utils\\n * @param {dataObject} data\\n * @param {Array} modifiers\\n * @param {String} ends - Optional modifier name used as stopper\\n * @returns {dataObject}\\n */\\nfunction runModifiers(modifiers, data, ends) {\\n  var modifiersToRun = ends === undefined ? modifiers : modifiers.slice(0, findIndex(modifiers, 'name', ends));\\n\\n  modifiersToRun.forEach(function (modifier) {\\n    if (modifier['function']) {\\n      // eslint-disable-line dot-notation\\n      console.warn('`modifier.function` is deprecated, use `modifier.fn`!');\\n    }\\n    var fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation\\n    if (modifier.enabled && isFunction(fn)) {\\n      // Add properties to offsets to make them a complete clientRect object\\n      // we do this before each modifier to make sure the previous one doesn't\\n      // mess with these values\\n      data.offsets.popper = getClientRect(data.offsets.popper);\\n      data.offsets.reference = getClientRect(data.offsets.reference);\\n\\n      data = fn(data, modifier);\\n    }\\n  });\\n\\n  return data;\\n}\\n\\n/**\\n * Updates the position of the popper, computing the new offsets and applying\\n * the new style.<br />\\n * Prefer `scheduleUpdate` over `update` because of performance reasons.\\n * @method\\n * @memberof Popper\\n */\\nfunction update() {\\n  // if popper is destroyed, don't perform any further update\\n  if (this.state.isDestroyed) {\\n    return;\\n  }\\n\\n  var data = {\\n    instance: this,\\n    styles: {},\\n    arrowStyles: {},\\n    attributes: {},\\n    flipped: false,\\n    offsets: {}\\n  };\\n\\n  // compute reference element offsets\\n  data.offsets.reference = getReferenceOffsets(this.state, this.popper, this.reference, this.options.positionFixed);\\n\\n  // compute auto placement, store placement inside the data object,\\n  // modifiers will be able to edit `placement` if needed\\n  // and refer to originalPlacement to know the original value\\n  data.placement = computeAutoPlacement(this.options.placement, data.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding);\\n\\n  // store the computed placement inside `originalPlacement`\\n  data.originalPlacement = data.placement;\\n\\n  data.positionFixed = this.options.positionFixed;\\n\\n  // compute the popper offsets\\n  data.offsets.popper = getPopperOffsets(this.popper, data.offsets.reference, data.placement);\\n\\n  data.offsets.popper.position = this.options.positionFixed ? 'fixed' : 'absolute';\\n\\n  // run the modifiers\\n  data = runModifiers(this.modifiers, data);\\n\\n  // the first `update` will call `onCreate` callback\\n  // the other ones will call `onUpdate` callback\\n  if (!this.state.isCreated) {\\n    this.state.isCreated = true;\\n    this.options.onCreate(data);\\n  } else {\\n    this.options.onUpdate(data);\\n  }\\n}\\n\\n/**\\n * Helper used to know if the given modifier is enabled.\\n * @method\\n * @memberof Popper.Utils\\n * @returns {Boolean}\\n */\\nfunction isModifierEnabled(modifiers, modifierName) {\\n  return modifiers.some(function (_ref) {\\n    var name = _ref.name,\\n        enabled = _ref.enabled;\\n    return enabled && name === modifierName;\\n  });\\n}\\n\\n/**\\n * Get the prefixed supported property name\\n * @method\\n * @memberof Popper.Utils\\n * @argument {String} property (camelCase)\\n * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix)\\n */\\nfunction getSupportedPropertyName(property) {\\n  var prefixes = [false, 'ms', 'Webkit', 'Moz', 'O'];\\n  var upperProp = property.charAt(0).toUpperCase() + property.slice(1);\\n\\n  for (var i = 0; i < prefixes.length; i++) {\\n    var prefix = prefixes[i];\\n    var toCheck = prefix ? '' + prefix + upperProp : property;\\n    if (typeof document.body.style[toCheck] !== 'undefined') {\\n      return toCheck;\\n    }\\n  }\\n  return null;\\n}\\n\\n/**\\n * Destroys the popper.\\n * @method\\n * @memberof Popper\\n */\\nfunction destroy() {\\n  this.state.isDestroyed = true;\\n\\n  // touch DOM only if `applyStyle` modifier is enabled\\n  if (isModifierEnabled(this.modifiers, 'applyStyle')) {\\n    this.popper.removeAttribute('x-placement');\\n    this.popper.style.position = '';\\n    this.popper.style.top = '';\\n    this.popper.style.left = '';\\n    this.popper.style.right = '';\\n    this.popper.style.bottom = '';\\n    this.popper.style.willChange = '';\\n    this.popper.style[getSupportedPropertyName('transform')] = '';\\n  }\\n\\n  this.disableEventListeners();\\n\\n  // remove the popper if user explicity asked for the deletion on destroy\\n  // do not use `remove` because IE11 doesn't support it\\n  if (this.options.removeOnDestroy) {\\n    this.popper.parentNode.removeChild(this.popper);\\n  }\\n  return this;\\n}\\n\\n/**\\n * Get the window associated with the element\\n * @argument {Element} element\\n * @returns {Window}\\n */\\nfunction getWindow(element) {\\n  var ownerDocument = element.ownerDocument;\\n  return ownerDocument ? ownerDocument.defaultView : window;\\n}\\n\\nfunction attachToScrollParents(scrollParent, event, callback, scrollParents) {\\n  var isBody = scrollParent.nodeName === 'BODY';\\n  var target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent;\\n  target.addEventListener(event, callback, { passive: true });\\n\\n  if (!isBody) {\\n    attachToScrollParents(getScrollParent(target.parentNode), event, callback, scrollParents);\\n  }\\n  scrollParents.push(target);\\n}\\n\\n/**\\n * Setup needed event listeners used to update the popper position\\n * @method\\n * @memberof Popper.Utils\\n * @private\\n */\\nfunction setupEventListeners(reference, options, state, updateBound) {\\n  // Resize event listener on window\\n  state.updateBound = updateBound;\\n  getWindow(reference).addEventListener('resize', state.updateBound, { passive: true });\\n\\n  // Scroll event listener on scroll parents\\n  var scrollElement = getScrollParent(reference);\\n  attachToScrollParents(scrollElement, 'scroll', state.updateBound, state.scrollParents);\\n  state.scrollElement = scrollElement;\\n  state.eventsEnabled = true;\\n\\n  return state;\\n}\\n\\n/**\\n * It will add resize/scroll events and start recalculating\\n * position of the popper element when they are triggered.\\n * @method\\n * @memberof Popper\\n */\\nfunction enableEventListeners() {\\n  if (!this.state.eventsEnabled) {\\n    this.state = setupEventListeners(this.reference, this.options, this.state, this.scheduleUpdate);\\n  }\\n}\\n\\n/**\\n * Remove event listeners used to update the popper position\\n * @method\\n * @memberof Popper.Utils\\n * @private\\n */\\nfunction removeEventListeners(reference, state) {\\n  // Remove resize event listener on window\\n  getWindow(reference).removeEventListener('resize', state.updateBound);\\n\\n  // Remove scroll event listener on scroll parents\\n  state.scrollParents.forEach(function (target) {\\n    target.removeEventListener('scroll', state.updateBound);\\n  });\\n\\n  // Reset state\\n  state.updateBound = null;\\n  state.scrollParents = [];\\n  state.scrollElement = null;\\n  state.eventsEnabled = false;\\n  return state;\\n}\\n\\n/**\\n * It will remove resize/scroll events and won't recalculate popper position\\n * when they are triggered. It also won't trigger `onUpdate` callback anymore,\\n * unless you call `update` method manually.\\n * @method\\n * @memberof Popper\\n */\\nfunction disableEventListeners() {\\n  if (this.state.eventsEnabled) {\\n    cancelAnimationFrame(this.scheduleUpdate);\\n    this.state = removeEventListeners(this.reference, this.state);\\n  }\\n}\\n\\n/**\\n * Tells if a given input is a number\\n * @method\\n * @memberof Popper.Utils\\n * @param {*} input to check\\n * @return {Boolean}\\n */\\nfunction isNumeric(n) {\\n  return n !== '' && !isNaN(parseFloat(n)) && isFinite(n);\\n}\\n\\n/**\\n * Set the style to the given popper\\n * @method\\n * @memberof Popper.Utils\\n * @argument {Element} element - Element to apply the style to\\n * @argument {Object} styles\\n * Object with a list of properties and values which will be applied to the element\\n */\\nfunction setStyles(element, styles) {\\n  Object.keys(styles).forEach(function (prop) {\\n    var unit = '';\\n    // add unit if the value is numeric and is one of the following\\n    if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && isNumeric(styles[prop])) {\\n      unit = 'px';\\n    }\\n    element.style[prop] = styles[prop] + unit;\\n  });\\n}\\n\\n/**\\n * Set the attributes to the given popper\\n * @method\\n * @memberof Popper.Utils\\n * @argument {Element} element - Element to apply the attributes to\\n * @argument {Object} styles\\n * Object with a list of properties and values which will be applied to the element\\n */\\nfunction setAttributes(element, attributes) {\\n  Object.keys(attributes).forEach(function (prop) {\\n    var value = attributes[prop];\\n    if (value !== false) {\\n      element.setAttribute(prop, attributes[prop]);\\n    } else {\\n      element.removeAttribute(prop);\\n    }\\n  });\\n}\\n\\n/**\\n * @function\\n * @memberof Modifiers\\n * @argument {Object} data - The data object generated by `update` method\\n * @argument {Object} data.styles - List of style properties - values to apply to popper element\\n * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element\\n * @argument {Object} options - Modifiers configuration and options\\n * @returns {Object} The same data object\\n */\\nfunction applyStyle(data) {\\n  // any property present in `data.styles` will be applied to the popper,\\n  // in this way we can make the 3rd party modifiers add custom styles to it\\n  // Be aware, modifiers could override the properties defined in the previous\\n  // lines of this modifier!\\n  setStyles(data.instance.popper, data.styles);\\n\\n  // any property present in `data.attributes` will be applied to the popper,\\n  // they will be set as HTML attributes of the element\\n  setAttributes(data.instance.popper, data.attributes);\\n\\n  // if arrowElement is defined and arrowStyles has some properties\\n  if (data.arrowElement && Object.keys(data.arrowStyles).length) {\\n    setStyles(data.arrowElement, data.arrowStyles);\\n  }\\n\\n  return data;\\n}\\n\\n/**\\n * Set the x-placement attribute before everything else because it could be used\\n * to add margins to the popper margins needs to be calculated to get the\\n * correct popper offsets.\\n * @method\\n * @memberof Popper.modifiers\\n * @param {HTMLElement} reference - The reference element used to position the popper\\n * @param {HTMLElement} popper - The HTML element used as popper\\n * @param {Object} options - Popper.js options\\n */\\nfunction applyStyleOnLoad(reference, popper, options, modifierOptions, state) {\\n  // compute reference element offsets\\n  var referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed);\\n\\n  // compute auto placement, store placement inside the data object,\\n  // modifiers will be able to edit `placement` if needed\\n  // and refer to originalPlacement to know the original value\\n  var placement = computeAutoPlacement(options.placement, referenceOffsets, popper, reference, options.modifiers.flip.boundariesElement, options.modifiers.flip.padding);\\n\\n  popper.setAttribute('x-placement', placement);\\n\\n  // Apply `position` to popper before anything else because\\n  // without the position applied we can't guarantee correct computations\\n  setStyles(popper, { position: options.positionFixed ? 'fixed' : 'absolute' });\\n\\n  return options;\\n}\\n\\n/**\\n * @function\\n * @memberof Popper.Utils\\n * @argument {Object} data - The data object generated by `update` method\\n * @argument {Boolean} shouldRound - If the offsets should be rounded at all\\n * @returns {Object} The popper's position offsets rounded\\n *\\n * The tale of pixel-perfect positioning. It's still not 100% perfect, but as\\n * good as it can be within reason.\\n * Discussion here: https://github.com/FezVrasta/popper.js/pull/715\\n *\\n * Low DPI screens cause a popper to be blurry if not using full pixels (Safari\\n * as well on High DPI screens).\\n *\\n * Firefox prefers no rounding for positioning and does not have blurriness on\\n * high DPI screens.\\n *\\n * Only horizontal placement and left/right values need to be considered.\\n */\\nfunction getRoundedOffsets(data, shouldRound) {\\n  var _data$offsets = data.offsets,\\n      popper = _data$offsets.popper,\\n      reference = _data$offsets.reference;\\n  var round = Math.round,\\n      floor = Math.floor;\\n\\n  var noRound = function noRound(v) {\\n    return v;\\n  };\\n\\n  var referenceWidth = round(reference.width);\\n  var popperWidth = round(popper.width);\\n\\n  var isVertical = ['left', 'right'].indexOf(data.placement) !== -1;\\n  var isVariation = data.placement.indexOf('-') !== -1;\\n  var sameWidthParity = referenceWidth % 2 === popperWidth % 2;\\n  var bothOddWidth = referenceWidth % 2 === 1 && popperWidth % 2 === 1;\\n\\n  var horizontalToInteger = !shouldRound ? noRound : isVertical || isVariation || sameWidthParity ? round : floor;\\n  var verticalToInteger = !shouldRound ? noRound : round;\\n\\n  return {\\n    left: horizontalToInteger(bothOddWidth && !isVariation && shouldRound ? popper.left - 1 : popper.left),\\n    top: verticalToInteger(popper.top),\\n    bottom: verticalToInteger(popper.bottom),\\n    right: horizontalToInteger(popper.right)\\n  };\\n}\\n\\nvar isFirefox = isBrowser && /Firefox/i.test(navigator.userAgent);\\n\\n/**\\n * @function\\n * @memberof Modifiers\\n * @argument {Object} data - The data object generated by `update` method\\n * @argument {Object} options - Modifiers configuration and options\\n * @returns {Object} The data object, properly modified\\n */\\nfunction computeStyle(data, options) {\\n  var x = options.x,\\n      y = options.y;\\n  var popper = data.offsets.popper;\\n\\n  // Remove this legacy support in Popper.js v2\\n\\n  var legacyGpuAccelerationOption = find(data.instance.modifiers, function (modifier) {\\n    return modifier.name === 'applyStyle';\\n  }).gpuAcceleration;\\n  if (legacyGpuAccelerationOption !== undefined) {\\n    console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');\\n  }\\n  var gpuAcceleration = legacyGpuAccelerationOption !== undefined ? legacyGpuAccelerationOption : options.gpuAcceleration;\\n\\n  var offsetParent = getOffsetParent(data.instance.popper);\\n  var offsetParentRect = getBoundingClientRect(offsetParent);\\n\\n  // Styles\\n  var styles = {\\n    position: popper.position\\n  };\\n\\n  var offsets = getRoundedOffsets(data, window.devicePixelRatio < 2 || !isFirefox);\\n\\n  var sideA = x === 'bottom' ? 'top' : 'bottom';\\n  var sideB = y === 'right' ? 'left' : 'right';\\n\\n  // if gpuAcceleration is set to `true` and transform is supported,\\n  //  we use `translate3d` to apply the position to the popper we\\n  // automatically use the supported prefixed version if needed\\n  var prefixedProperty = getSupportedPropertyName('transform');\\n\\n  // now, let's make a step back and look at this code closely (wtf?)\\n  // If the content of the popper grows once it's been positioned, it\\n  // may happen that the popper gets misplaced because of the new content\\n  // overflowing its reference element\\n  // To avoid this problem, we provide two options (x and y), which allow\\n  // the consumer to define the offset origin.\\n  // If we position a popper on top of a reference element, we can set\\n  // `x` to `top` to make the popper grow towards its top instead of\\n  // its bottom.\\n  var left = void 0,\\n      top = void 0;\\n  if (sideA === 'bottom') {\\n    // when offsetParent is <html> the positioning is relative to the bottom of the screen (excluding the scrollbar)\\n    // and not the bottom of the html element\\n    if (offsetParent.nodeName === 'HTML') {\\n      top = -offsetParent.clientHeight + offsets.bottom;\\n    } else {\\n      top = -offsetParentRect.height + offsets.bottom;\\n    }\\n  } else {\\n    top = offsets.top;\\n  }\\n  if (sideB === 'right') {\\n    if (offsetParent.nodeName === 'HTML') {\\n      left = -offsetParent.clientWidth + offsets.right;\\n    } else {\\n      left = -offsetParentRect.width + offsets.right;\\n    }\\n  } else {\\n    left = offsets.left;\\n  }\\n  if (gpuAcceleration && prefixedProperty) {\\n    styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)';\\n    styles[sideA] = 0;\\n    styles[sideB] = 0;\\n    styles.willChange = 'transform';\\n  } else {\\n    // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties\\n    var invertTop = sideA === 'bottom' ? -1 : 1;\\n    var invertLeft = sideB === 'right' ? -1 : 1;\\n    styles[sideA] = top * invertTop;\\n    styles[sideB] = left * invertLeft;\\n    styles.willChange = sideA + ', ' + sideB;\\n  }\\n\\n  // Attributes\\n  var attributes = {\\n    'x-placement': data.placement\\n  };\\n\\n  // Update `data` attributes, styles and arrowStyles\\n  data.attributes = _extends({}, attributes, data.attributes);\\n  data.styles = _extends({}, styles, data.styles);\\n  data.arrowStyles = _extends({}, data.offsets.arrow, data.arrowStyles);\\n\\n  return data;\\n}\\n\\n/**\\n * Helper used to know if the given modifier depends from another one.<br />\\n * It checks if the needed modifier is listed and enabled.\\n * @method\\n * @memberof Popper.Utils\\n * @param {Array} modifiers - list of modifiers\\n * @param {String} requestingName - name of requesting modifier\\n * @param {String} requestedName - name of requested modifier\\n * @returns {Boolean}\\n */\\nfunction isModifierRequired(modifiers, requestingName, requestedName) {\\n  var requesting = find(modifiers, function (_ref) {\\n    var name = _ref.name;\\n    return name === requestingName;\\n  });\\n\\n  var isRequired = !!requesting && modifiers.some(function (modifier) {\\n    return modifier.name === requestedName && modifier.enabled && modifier.order < requesting.order;\\n  });\\n\\n  if (!isRequired) {\\n    var _requesting = '`' + requestingName + '`';\\n    var requested = '`' + requestedName + '`';\\n    console.warn(requested + ' modifier is required by ' + _requesting + ' modifier in order to work, be sure to include it before ' + _requesting + '!');\\n  }\\n  return isRequired;\\n}\\n\\n/**\\n * @function\\n * @memberof Modifiers\\n * @argument {Object} data - The data object generated by update method\\n * @argument {Object} options - Modifiers configuration and options\\n * @returns {Object} The data object, properly modified\\n */\\nfunction arrow(data, options) {\\n  var _data$offsets$arrow;\\n\\n  // arrow depends on keepTogether in order to work\\n  if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) {\\n    return data;\\n  }\\n\\n  var arrowElement = options.element;\\n\\n  // if arrowElement is a string, suppose it's a CSS selector\\n  if (typeof arrowElement === 'string') {\\n    arrowElement = data.instance.popper.querySelector(arrowElement);\\n\\n    // if arrowElement is not found, don't run the modifier\\n    if (!arrowElement) {\\n      return data;\\n    }\\n  } else {\\n    // if the arrowElement isn't a query selector we must check that the\\n    // provided DOM node is child of its popper node\\n    if (!data.instance.popper.contains(arrowElement)) {\\n      console.warn('WARNING: `arrow.element` must be child of its popper element!');\\n      return data;\\n    }\\n  }\\n\\n  var placement = data.placement.split('-')[0];\\n  var _data$offsets = data.offsets,\\n      popper = _data$offsets.popper,\\n      reference = _data$offsets.reference;\\n\\n  var isVertical = ['left', 'right'].indexOf(placement) !== -1;\\n\\n  var len = isVertical ? 'height' : 'width';\\n  var sideCapitalized = isVertical ? 'Top' : 'Left';\\n  var side = sideCapitalized.toLowerCase();\\n  var altSide = isVertical ? 'left' : 'top';\\n  var opSide = isVertical ? 'bottom' : 'right';\\n  var arrowElementSize = getOuterSizes(arrowElement)[len];\\n\\n  //\\n  // extends keepTogether behavior making sure the popper and its\\n  // reference have enough pixels in conjunction\\n  //\\n\\n  // top/left side\\n  if (reference[opSide] - arrowElementSize < popper[side]) {\\n    data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize);\\n  }\\n  // bottom/right side\\n  if (reference[side] + arrowElementSize > popper[opSide]) {\\n    data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide];\\n  }\\n  data.offsets.popper = getClientRect(data.offsets.popper);\\n\\n  // compute center of the popper\\n  var center = reference[side] + reference[len] / 2 - arrowElementSize / 2;\\n\\n  // Compute the sideValue using the updated popper offsets\\n  // take popper margin in account because we don't have this info available\\n  var css = getStyleComputedProperty(data.instance.popper);\\n  var popperMarginSide = parseFloat(css['margin' + sideCapitalized], 10);\\n  var popperBorderSide = parseFloat(css['border' + sideCapitalized + 'Width'], 10);\\n  var sideValue = center - data.offsets.popper[side] - popperMarginSide - popperBorderSide;\\n\\n  // prevent arrowElement from being placed not contiguously to its popper\\n  sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0);\\n\\n  data.arrowElement = arrowElement;\\n  data.offsets.arrow = (_data$offsets$arrow = {}, defineProperty(_data$offsets$arrow, side, Math.round(sideValue)), defineProperty(_data$offsets$arrow, altSide, ''), _data$offsets$arrow);\\n\\n  return data;\\n}\\n\\n/**\\n * Get the opposite placement variation of the given one\\n * @method\\n * @memberof Popper.Utils\\n * @argument {String} placement variation\\n * @returns {String} flipped placement variation\\n */\\nfunction getOppositeVariation(variation) {\\n  if (variation === 'end') {\\n    return 'start';\\n  } else if (variation === 'start') {\\n    return 'end';\\n  }\\n  return variation;\\n}\\n\\n/**\\n * List of accepted placements to use as values of the `placement` option.<br />\\n * Valid placements are:\\n * - `auto`\\n * - `top`\\n * - `right`\\n * - `bottom`\\n * - `left`\\n *\\n * Each placement can have a variation from this list:\\n * - `-start`\\n * - `-end`\\n *\\n * Variations are interpreted easily if you think of them as the left to right\\n * written languages. Horizontally (`top` and `bottom`), `start` is left and `end`\\n * is right.<br />\\n * Vertically (`left` and `right`), `start` is top and `end` is bottom.\\n *\\n * Some valid examples are:\\n * - `top-end` (on top of reference, right aligned)\\n * - `right-start` (on right of reference, top aligned)\\n * - `bottom` (on bottom, centered)\\n * - `auto-end` (on the side with more space available, alignment depends by placement)\\n *\\n * @static\\n * @type {Array}\\n * @enum {String}\\n * @readonly\\n * @method placements\\n * @memberof Popper\\n */\\nvar placements = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start'];\\n\\n// Get rid of `auto` `auto-start` and `auto-end`\\nvar validPlacements = placements.slice(3);\\n\\n/**\\n * Given an initial placement, returns all the subsequent placements\\n * clockwise (or counter-clockwise).\\n *\\n * @method\\n * @memberof Popper.Utils\\n * @argument {String} placement - A valid placement (it accepts variations)\\n * @argument {Boolean} counter - Set to true to walk the placements counterclockwise\\n * @returns {Array} placements including their variations\\n */\\nfunction clockwise(placement) {\\n  var counter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\\n\\n  var index = validPlacements.indexOf(placement);\\n  var arr = validPlacements.slice(index + 1).concat(validPlacements.slice(0, index));\\n  return counter ? arr.reverse() : arr;\\n}\\n\\nvar BEHAVIORS = {\\n  FLIP: 'flip',\\n  CLOCKWISE: 'clockwise',\\n  COUNTERCLOCKWISE: 'counterclockwise'\\n};\\n\\n/**\\n * @function\\n * @memberof Modifiers\\n * @argument {Object} data - The data object generated by update method\\n * @argument {Object} options - Modifiers configuration and options\\n * @returns {Object} The data object, properly modified\\n */\\nfunction flip(data, options) {\\n  // if `inner` modifier is enabled, we can't use the `flip` modifier\\n  if (isModifierEnabled(data.instance.modifiers, 'inner')) {\\n    return data;\\n  }\\n\\n  if (data.flipped && data.placement === data.originalPlacement) {\\n    // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides\\n    return data;\\n  }\\n\\n  var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, options.boundariesElement, data.positionFixed);\\n\\n  var placement = data.placement.split('-')[0];\\n  var placementOpposite = getOppositePlacement(placement);\\n  var variation = data.placement.split('-')[1] || '';\\n\\n  var flipOrder = [];\\n\\n  switch (options.behavior) {\\n    case BEHAVIORS.FLIP:\\n      flipOrder = [placement, placementOpposite];\\n      break;\\n    case BEHAVIORS.CLOCKWISE:\\n      flipOrder = clockwise(placement);\\n      break;\\n    case BEHAVIORS.COUNTERCLOCKWISE:\\n      flipOrder = clockwise(placement, true);\\n      break;\\n    default:\\n      flipOrder = options.behavior;\\n  }\\n\\n  flipOrder.forEach(function (step, index) {\\n    if (placement !== step || flipOrder.length === index + 1) {\\n      return data;\\n    }\\n\\n    placement = data.placement.split('-')[0];\\n    placementOpposite = getOppositePlacement(placement);\\n\\n    var popperOffsets = data.offsets.popper;\\n    var refOffsets = data.offsets.reference;\\n\\n    // using floor because the reference offsets may contain decimals we are not going to consider here\\n    var floor = Math.floor;\\n    var overlapsRef = placement === 'left' && floor(popperOffsets.right) > floor(refOffsets.left) || placement === 'right' && floor(popperOffsets.left) < floor(refOffsets.right) || placement === 'top' && floor(popperOffsets.bottom) > floor(refOffsets.top) || placement === 'bottom' && floor(popperOffsets.top) < floor(refOffsets.bottom);\\n\\n    var overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left);\\n    var overflowsRight = floor(popperOffsets.right) > floor(boundaries.right);\\n    var overflowsTop = floor(popperOffsets.top) < floor(boundaries.top);\\n    var overflowsBottom = floor(popperOffsets.bottom) > floor(boundaries.bottom);\\n\\n    var overflowsBoundaries = placement === 'left' && overflowsLeft || placement === 'right' && overflowsRight || placement === 'top' && overflowsTop || placement === 'bottom' && overflowsBottom;\\n\\n    // flip the variation if required\\n    var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\\n    var flippedVariation = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom);\\n\\n    if (overlapsRef || overflowsBoundaries || flippedVariation) {\\n      // this boolean to detect any flip loop\\n      data.flipped = true;\\n\\n      if (overlapsRef || overflowsBoundaries) {\\n        placement = flipOrder[index + 1];\\n      }\\n\\n      if (flippedVariation) {\\n        variation = getOppositeVariation(variation);\\n      }\\n\\n      data.placement = placement + (variation ? '-' + variation : '');\\n\\n      // this object contains `position`, we want to preserve it along with\\n      // any additional property we may add in the future\\n      data.offsets.popper = _extends({}, data.offsets.popper, getPopperOffsets(data.instance.popper, data.offsets.reference, data.placement));\\n\\n      data = runModifiers(data.instance.modifiers, data, 'flip');\\n    }\\n  });\\n  return data;\\n}\\n\\n/**\\n * @function\\n * @memberof Modifiers\\n * @argument {Object} data - The data object generated by update method\\n * @argument {Object} options - Modifiers configuration and options\\n * @returns {Object} The data object, properly modified\\n */\\nfunction keepTogether(data) {\\n  var _data$offsets = data.offsets,\\n      popper = _data$offsets.popper,\\n      reference = _data$offsets.reference;\\n\\n  var placement = data.placement.split('-')[0];\\n  var floor = Math.floor;\\n  var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\\n  var side = isVertical ? 'right' : 'bottom';\\n  var opSide = isVertical ? 'left' : 'top';\\n  var measurement = isVertical ? 'width' : 'height';\\n\\n  if (popper[side] < floor(reference[opSide])) {\\n    data.offsets.popper[opSide] = floor(reference[opSide]) - popper[measurement];\\n  }\\n  if (popper[opSide] > floor(reference[side])) {\\n    data.offsets.popper[opSide] = floor(reference[side]);\\n  }\\n\\n  return data;\\n}\\n\\n/**\\n * Converts a string containing value + unit into a px value number\\n * @function\\n * @memberof {modifiers~offset}\\n * @private\\n * @argument {String} str - Value + unit string\\n * @argument {String} measurement - `height` or `width`\\n * @argument {Object} popperOffsets\\n * @argument {Object} referenceOffsets\\n * @returns {Number|String}\\n * Value in pixels, or original string if no values were extracted\\n */\\nfunction toValue(str, measurement, popperOffsets, referenceOffsets) {\\n  // separate value from unit\\n  var split = str.match(/((?:\\\\-|\\\\+)?\\\\d*\\\\.?\\\\d*)(.*)/);\\n  var value = +split[1];\\n  var unit = split[2];\\n\\n  // If it's not a number it's an operator, I guess\\n  if (!value) {\\n    return str;\\n  }\\n\\n  if (unit.indexOf('%') === 0) {\\n    var element = void 0;\\n    switch (unit) {\\n      case '%p':\\n        element = popperOffsets;\\n        break;\\n      case '%':\\n      case '%r':\\n      default:\\n        element = referenceOffsets;\\n    }\\n\\n    var rect = getClientRect(element);\\n    return rect[measurement] / 100 * value;\\n  } else if (unit === 'vh' || unit === 'vw') {\\n    // if is a vh or vw, we calculate the size based on the viewport\\n    var size = void 0;\\n    if (unit === 'vh') {\\n      size = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);\\n    } else {\\n      size = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\\n    }\\n    return size / 100 * value;\\n  } else {\\n    // if is an explicit pixel unit, we get rid of the unit and keep the value\\n    // if is an implicit unit, it's px, and we return just the value\\n    return value;\\n  }\\n}\\n\\n/**\\n * Parse an `offset` string to extrapolate `x` and `y` numeric offsets.\\n * @function\\n * @memberof {modifiers~offset}\\n * @private\\n * @argument {String} offset\\n * @argument {Object} popperOffsets\\n * @argument {Object} referenceOffsets\\n * @argument {String} basePlacement\\n * @returns {Array} a two cells array with x and y offsets in numbers\\n */\\nfunction parseOffset(offset, popperOffsets, referenceOffsets, basePlacement) {\\n  var offsets = [0, 0];\\n\\n  // Use height if placement is left or right and index is 0 otherwise use width\\n  // in this way the first offset will use an axis and the second one\\n  // will use the other one\\n  var useHeight = ['right', 'left'].indexOf(basePlacement) !== -1;\\n\\n  // Split the offset string to obtain a list of values and operands\\n  // The regex addresses values with the plus or minus sign in front (+10, -20, etc)\\n  var fragments = offset.split(/(\\\\+|\\\\-)/).map(function (frag) {\\n    return frag.trim();\\n  });\\n\\n  // Detect if the offset string contains a pair of values or a single one\\n  // they could be separated by comma or space\\n  var divider = fragments.indexOf(find(fragments, function (frag) {\\n    return frag.search(/,|\\\\s/) !== -1;\\n  }));\\n\\n  if (fragments[divider] && fragments[divider].indexOf(',') === -1) {\\n    console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');\\n  }\\n\\n  // If divider is found, we divide the list of values and operands to divide\\n  // them by ofset X and Y.\\n  var splitRegex = /\\\\s*,\\\\s*|\\\\s+/;\\n  var ops = divider !== -1 ? [fragments.slice(0, divider).concat([fragments[divider].split(splitRegex)[0]]), [fragments[divider].split(splitRegex)[1]].concat(fragments.slice(divider + 1))] : [fragments];\\n\\n  // Convert the values with units to absolute pixels to allow our computations\\n  ops = ops.map(function (op, index) {\\n    // Most of the units rely on the orientation of the popper\\n    var measurement = (index === 1 ? !useHeight : useHeight) ? 'height' : 'width';\\n    var mergeWithPrevious = false;\\n    return op\\n    // This aggregates any `+` or `-` sign that aren't considered operators\\n    // e.g.: 10 + +5 => [10, +, +5]\\n    .reduce(function (a, b) {\\n      if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) {\\n        a[a.length - 1] = b;\\n        mergeWithPrevious = true;\\n        return a;\\n      } else if (mergeWithPrevious) {\\n        a[a.length - 1] += b;\\n        mergeWithPrevious = false;\\n        return a;\\n      } else {\\n        return a.concat(b);\\n      }\\n    }, [])\\n    // Here we convert the string values into number values (in px)\\n    .map(function (str) {\\n      return toValue(str, measurement, popperOffsets, referenceOffsets);\\n    });\\n  });\\n\\n  // Loop trough the offsets arrays and execute the operations\\n  ops.forEach(function (op, index) {\\n    op.forEach(function (frag, index2) {\\n      if (isNumeric(frag)) {\\n        offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1);\\n      }\\n    });\\n  });\\n  return offsets;\\n}\\n\\n/**\\n * @function\\n * @memberof Modifiers\\n * @argument {Object} data - The data object generated by update method\\n * @argument {Object} options - Modifiers configuration and options\\n * @argument {Number|String} options.offset=0\\n * The offset value as described in the modifier description\\n * @returns {Object} The data object, properly modified\\n */\\nfunction offset(data, _ref) {\\n  var offset = _ref.offset;\\n  var placement = data.placement,\\n      _data$offsets = data.offsets,\\n      popper = _data$offsets.popper,\\n      reference = _data$offsets.reference;\\n\\n  var basePlacement = placement.split('-')[0];\\n\\n  var offsets = void 0;\\n  if (isNumeric(+offset)) {\\n    offsets = [+offset, 0];\\n  } else {\\n    offsets = parseOffset(offset, popper, reference, basePlacement);\\n  }\\n\\n  if (basePlacement === 'left') {\\n    popper.top += offsets[0];\\n    popper.left -= offsets[1];\\n  } else if (basePlacement === 'right') {\\n    popper.top += offsets[0];\\n    popper.left += offsets[1];\\n  } else if (basePlacement === 'top') {\\n    popper.left += offsets[0];\\n    popper.top -= offsets[1];\\n  } else if (basePlacement === 'bottom') {\\n    popper.left += offsets[0];\\n    popper.top += offsets[1];\\n  }\\n\\n  data.popper = popper;\\n  return data;\\n}\\n\\n/**\\n * @function\\n * @memberof Modifiers\\n * @argument {Object} data - The data object generated by `update` method\\n * @argument {Object} options - Modifiers configuration and options\\n * @returns {Object} The data object, properly modified\\n */\\nfunction preventOverflow(data, options) {\\n  var boundariesElement = options.boundariesElement || getOffsetParent(data.instance.popper);\\n\\n  // If offsetParent is the reference element, we really want to\\n  // go one step up and use the next offsetParent as reference to\\n  // avoid to make this modifier completely useless and look like broken\\n  if (data.instance.reference === boundariesElement) {\\n    boundariesElement = getOffsetParent(boundariesElement);\\n  }\\n\\n  // NOTE: DOM access here\\n  // resets the popper's position so that the document size can be calculated excluding\\n  // the size of the popper element itself\\n  var transformProp = getSupportedPropertyName('transform');\\n  var popperStyles = data.instance.popper.style; // assignment to help minification\\n  var top = popperStyles.top,\\n      left = popperStyles.left,\\n      transform = popperStyles[transformProp];\\n\\n  popperStyles.top = '';\\n  popperStyles.left = '';\\n  popperStyles[transformProp] = '';\\n\\n  var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement, data.positionFixed);\\n\\n  // NOTE: DOM access here\\n  // restores the original style properties after the offsets have been computed\\n  popperStyles.top = top;\\n  popperStyles.left = left;\\n  popperStyles[transformProp] = transform;\\n\\n  options.boundaries = boundaries;\\n\\n  var order = options.priority;\\n  var popper = data.offsets.popper;\\n\\n  var check = {\\n    primary: function primary(placement) {\\n      var value = popper[placement];\\n      if (popper[placement] < boundaries[placement] && !options.escapeWithReference) {\\n        value = Math.max(popper[placement], boundaries[placement]);\\n      }\\n      return defineProperty({}, placement, value);\\n    },\\n    secondary: function secondary(placement) {\\n      var mainSide = placement === 'right' ? 'left' : 'top';\\n      var value = popper[mainSide];\\n      if (popper[placement] > boundaries[placement] && !options.escapeWithReference) {\\n        value = Math.min(popper[mainSide], boundaries[placement] - (placement === 'right' ? popper.width : popper.height));\\n      }\\n      return defineProperty({}, mainSide, value);\\n    }\\n  };\\n\\n  order.forEach(function (placement) {\\n    var side = ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary';\\n    popper = _extends({}, popper, check[side](placement));\\n  });\\n\\n  data.offsets.popper = popper;\\n\\n  return data;\\n}\\n\\n/**\\n * @function\\n * @memberof Modifiers\\n * @argument {Object} data - The data object generated by `update` method\\n * @argument {Object} options - Modifiers configuration and options\\n * @returns {Object} The data object, properly modified\\n */\\nfunction shift(data) {\\n  var placement = data.placement;\\n  var basePlacement = placement.split('-')[0];\\n  var shiftvariation = placement.split('-')[1];\\n\\n  // if shift shiftvariation is specified, run the modifier\\n  if (shiftvariation) {\\n    var _data$offsets = data.offsets,\\n        reference = _data$offsets.reference,\\n        popper = _data$offsets.popper;\\n\\n    var isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1;\\n    var side = isVertical ? 'left' : 'top';\\n    var measurement = isVertical ? 'width' : 'height';\\n\\n    var shiftOffsets = {\\n      start: defineProperty({}, side, reference[side]),\\n      end: defineProperty({}, side, reference[side] + reference[measurement] - popper[measurement])\\n    };\\n\\n    data.offsets.popper = _extends({}, popper, shiftOffsets[shiftvariation]);\\n  }\\n\\n  return data;\\n}\\n\\n/**\\n * @function\\n * @memberof Modifiers\\n * @argument {Object} data - The data object generated by update method\\n * @argument {Object} options - Modifiers configuration and options\\n * @returns {Object} The data object, properly modified\\n */\\nfunction hide(data) {\\n  if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) {\\n    return data;\\n  }\\n\\n  var refRect = data.offsets.reference;\\n  var bound = find(data.instance.modifiers, function (modifier) {\\n    return modifier.name === 'preventOverflow';\\n  }).boundaries;\\n\\n  if (refRect.bottom < bound.top || refRect.left > bound.right || refRect.top > bound.bottom || refRect.right < bound.left) {\\n    // Avoid unnecessary DOM access if visibility hasn't changed\\n    if (data.hide === true) {\\n      return data;\\n    }\\n\\n    data.hide = true;\\n    data.attributes['x-out-of-boundaries'] = '';\\n  } else {\\n    // Avoid unnecessary DOM access if visibility hasn't changed\\n    if (data.hide === false) {\\n      return data;\\n    }\\n\\n    data.hide = false;\\n    data.attributes['x-out-of-boundaries'] = false;\\n  }\\n\\n  return data;\\n}\\n\\n/**\\n * @function\\n * @memberof Modifiers\\n * @argument {Object} data - The data object generated by `update` method\\n * @argument {Object} options - Modifiers configuration and options\\n * @returns {Object} The data object, properly modified\\n */\\nfunction inner(data) {\\n  var placement = data.placement;\\n  var basePlacement = placement.split('-')[0];\\n  var _data$offsets = data.offsets,\\n      popper = _data$offsets.popper,\\n      reference = _data$offsets.reference;\\n\\n  var isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1;\\n\\n  var subtractLength = ['top', 'left'].indexOf(basePlacement) === -1;\\n\\n  popper[isHoriz ? 'left' : 'top'] = reference[basePlacement] - (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0);\\n\\n  data.placement = getOppositePlacement(placement);\\n  data.offsets.popper = getClientRect(popper);\\n\\n  return data;\\n}\\n\\n/**\\n * Modifier function, each modifier can have a function of this type assigned\\n * to its `fn` property.<br />\\n * These functions will be called on each update, this means that you must\\n * make sure they are performant enough to avoid performance bottlenecks.\\n *\\n * @function ModifierFn\\n * @argument {dataObject} data - The data object generated by `update` method\\n * @argument {Object} options - Modifiers configuration and options\\n * @returns {dataObject} The data object, properly modified\\n */\\n\\n/**\\n * Modifiers are plugins used to alter the behavior of your poppers.<br />\\n * Popper.js uses a set of 9 modifiers to provide all the basic functionalities\\n * needed by the library.\\n *\\n * Usually you don't want to override the `order`, `fn` and `onLoad` props.\\n * All the other properties are configurations that could be tweaked.\\n * @namespace modifiers\\n */\\nvar modifiers = {\\n  /**\\n   * Modifier used to shift the popper on the start or end of its reference\\n   * element.<br />\\n   * It will read the variation of the `placement` property.<br />\\n   * It can be one either `-end` or `-start`.\\n   * @memberof modifiers\\n   * @inner\\n   */\\n  shift: {\\n    /** @prop {number} order=100 - Index used to define the order of execution */\\n    order: 100,\\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\\n    enabled: true,\\n    /** @prop {ModifierFn} */\\n    fn: shift\\n  },\\n\\n  /**\\n   * The `offset` modifier can shift your popper on both its axis.\\n   *\\n   * It accepts the following units:\\n   * - `px` or unit-less, interpreted as pixels\\n   * - `%` or `%r`, percentage relative to the length of the reference element\\n   * - `%p`, percentage relative to the length of the popper element\\n   * - `vw`, CSS viewport width unit\\n   * - `vh`, CSS viewport height unit\\n   *\\n   * For length is intended the main axis relative to the placement of the popper.<br />\\n   * This means that if the placement is `top` or `bottom`, the length will be the\\n   * `width`. In case of `left` or `right`, it will be the `height`.\\n   *\\n   * You can provide a single value (as `Number` or `String`), or a pair of values\\n   * as `String` divided by a comma or one (or more) white spaces.<br />\\n   * The latter is a deprecated method because it leads to confusion and will be\\n   * removed in v2.<br />\\n   * Additionally, it accepts additions and subtractions between different units.\\n   * Note that multiplications and divisions aren't supported.\\n   *\\n   * Valid examples are:\\n   * ```\\n   * 10\\n   * '10%'\\n   * '10, 10'\\n   * '10%, 10'\\n   * '10 + 10%'\\n   * '10 - 5vh + 3%'\\n   * '-10px + 5vh, 5px - 6%'\\n   * ```\\n   * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap\\n   * > with their reference element, unfortunately, you will have to disable the `flip` modifier.\\n   * > You can read more on this at this [issue](https://github.com/FezVrasta/popper.js/issues/373).\\n   *\\n   * @memberof modifiers\\n   * @inner\\n   */\\n  offset: {\\n    /** @prop {number} order=200 - Index used to define the order of execution */\\n    order: 200,\\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\\n    enabled: true,\\n    /** @prop {ModifierFn} */\\n    fn: offset,\\n    /** @prop {Number|String} offset=0\\n     * The offset value as described in the modifier description\\n     */\\n    offset: 0\\n  },\\n\\n  /**\\n   * Modifier used to prevent the popper from being positioned outside the boundary.\\n   *\\n   * A scenario exists where the reference itself is not within the boundaries.<br />\\n   * We can say it has \\\"escaped the boundaries\\\" — or just \\\"escaped\\\".<br />\\n   * In this case we need to decide whether the popper should either:\\n   *\\n   * - detach from the reference and remain \\\"trapped\\\" in the boundaries, or\\n   * - if it should ignore the boundary and \\\"escape with its reference\\\"\\n   *\\n   * When `escapeWithReference` is set to`true` and reference is completely\\n   * outside its boundaries, the popper will overflow (or completely leave)\\n   * the boundaries in order to remain attached to the edge of the reference.\\n   *\\n   * @memberof modifiers\\n   * @inner\\n   */\\n  preventOverflow: {\\n    /** @prop {number} order=300 - Index used to define the order of execution */\\n    order: 300,\\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\\n    enabled: true,\\n    /** @prop {ModifierFn} */\\n    fn: preventOverflow,\\n    /**\\n     * @prop {Array} [priority=['left','right','top','bottom']]\\n     * Popper will try to prevent overflow following these priorities by default,\\n     * then, it could overflow on the left and on top of the `boundariesElement`\\n     */\\n    priority: ['left', 'right', 'top', 'bottom'],\\n    /**\\n     * @prop {number} padding=5\\n     * Amount of pixel used to define a minimum distance between the boundaries\\n     * and the popper. This makes sure the popper always has a little padding\\n     * between the edges of its container\\n     */\\n    padding: 5,\\n    /**\\n     * @prop {String|HTMLElement} boundariesElement='scrollParent'\\n     * Boundaries used by the modifier. Can be `scrollParent`, `window`,\\n     * `viewport` or any DOM element.\\n     */\\n    boundariesElement: 'scrollParent'\\n  },\\n\\n  /**\\n   * Modifier used to make sure the reference and its popper stay near each other\\n   * without leaving any gap between the two. Especially useful when the arrow is\\n   * enabled and you want to ensure that it points to its reference element.\\n   * It cares only about the first axis. You can still have poppers with margin\\n   * between the popper and its reference element.\\n   * @memberof modifiers\\n   * @inner\\n   */\\n  keepTogether: {\\n    /** @prop {number} order=400 - Index used to define the order of execution */\\n    order: 400,\\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\\n    enabled: true,\\n    /** @prop {ModifierFn} */\\n    fn: keepTogether\\n  },\\n\\n  /**\\n   * This modifier is used to move the `arrowElement` of the popper to make\\n   * sure it is positioned between the reference element and its popper element.\\n   * It will read the outer size of the `arrowElement` node to detect how many\\n   * pixels of conjunction are needed.\\n   *\\n   * It has no effect if no `arrowElement` is provided.\\n   * @memberof modifiers\\n   * @inner\\n   */\\n  arrow: {\\n    /** @prop {number} order=500 - Index used to define the order of execution */\\n    order: 500,\\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\\n    enabled: true,\\n    /** @prop {ModifierFn} */\\n    fn: arrow,\\n    /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */\\n    element: '[x-arrow]'\\n  },\\n\\n  /**\\n   * Modifier used to flip the popper's placement when it starts to overlap its\\n   * reference element.\\n   *\\n   * Requires the `preventOverflow` modifier before it in order to work.\\n   *\\n   * **NOTE:** this modifier will interrupt the current update cycle and will\\n   * restart it if it detects the need to flip the placement.\\n   * @memberof modifiers\\n   * @inner\\n   */\\n  flip: {\\n    /** @prop {number} order=600 - Index used to define the order of execution */\\n    order: 600,\\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\\n    enabled: true,\\n    /** @prop {ModifierFn} */\\n    fn: flip,\\n    /**\\n     * @prop {String|Array} behavior='flip'\\n     * The behavior used to change the popper's placement. It can be one of\\n     * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid\\n     * placements (with optional variations)\\n     */\\n    behavior: 'flip',\\n    /**\\n     * @prop {number} padding=5\\n     * The popper will flip if it hits the edges of the `boundariesElement`\\n     */\\n    padding: 5,\\n    /**\\n     * @prop {String|HTMLElement} boundariesElement='viewport'\\n     * The element which will define the boundaries of the popper position.\\n     * The popper will never be placed outside of the defined boundaries\\n     * (except if `keepTogether` is enabled)\\n     */\\n    boundariesElement: 'viewport'\\n  },\\n\\n  /**\\n   * Modifier used to make the popper flow toward the inner of the reference element.\\n   * By default, when this modifier is disabled, the popper will be placed outside\\n   * the reference element.\\n   * @memberof modifiers\\n   * @inner\\n   */\\n  inner: {\\n    /** @prop {number} order=700 - Index used to define the order of execution */\\n    order: 700,\\n    /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */\\n    enabled: false,\\n    /** @prop {ModifierFn} */\\n    fn: inner\\n  },\\n\\n  /**\\n   * Modifier used to hide the popper when its reference element is outside of the\\n   * popper boundaries. It will set a `x-out-of-boundaries` attribute which can\\n   * be used to hide with a CSS selector the popper when its reference is\\n   * out of boundaries.\\n   *\\n   * Requires the `preventOverflow` modifier before it in order to work.\\n   * @memberof modifiers\\n   * @inner\\n   */\\n  hide: {\\n    /** @prop {number} order=800 - Index used to define the order of execution */\\n    order: 800,\\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\\n    enabled: true,\\n    /** @prop {ModifierFn} */\\n    fn: hide\\n  },\\n\\n  /**\\n   * Computes the style that will be applied to the popper element to gets\\n   * properly positioned.\\n   *\\n   * Note that this modifier will not touch the DOM, it just prepares the styles\\n   * so that `applyStyle` modifier can apply it. This separation is useful\\n   * in case you need to replace `applyStyle` with a custom implementation.\\n   *\\n   * This modifier has `850` as `order` value to maintain backward compatibility\\n   * with previous versions of Popper.js. Expect the modifiers ordering method\\n   * to change in future major versions of the library.\\n   *\\n   * @memberof modifiers\\n   * @inner\\n   */\\n  computeStyle: {\\n    /** @prop {number} order=850 - Index used to define the order of execution */\\n    order: 850,\\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\\n    enabled: true,\\n    /** @prop {ModifierFn} */\\n    fn: computeStyle,\\n    /**\\n     * @prop {Boolean} gpuAcceleration=true\\n     * If true, it uses the CSS 3D transformation to position the popper.\\n     * Otherwise, it will use the `top` and `left` properties\\n     */\\n    gpuAcceleration: true,\\n    /**\\n     * @prop {string} [x='bottom']\\n     * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin.\\n     * Change this if your popper should grow in a direction different from `bottom`\\n     */\\n    x: 'bottom',\\n    /**\\n     * @prop {string} [x='left']\\n     * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin.\\n     * Change this if your popper should grow in a direction different from `right`\\n     */\\n    y: 'right'\\n  },\\n\\n  /**\\n   * Applies the computed styles to the popper element.\\n   *\\n   * All the DOM manipulations are limited to this modifier. This is useful in case\\n   * you want to integrate Popper.js inside a framework or view library and you\\n   * want to delegate all the DOM manipulations to it.\\n   *\\n   * Note that if you disable this modifier, you must make sure the popper element\\n   * has its position set to `absolute` before Popper.js can do its work!\\n   *\\n   * Just disable this modifier and define your own to achieve the desired effect.\\n   *\\n   * @memberof modifiers\\n   * @inner\\n   */\\n  applyStyle: {\\n    /** @prop {number} order=900 - Index used to define the order of execution */\\n    order: 900,\\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\\n    enabled: true,\\n    /** @prop {ModifierFn} */\\n    fn: applyStyle,\\n    /** @prop {Function} */\\n    onLoad: applyStyleOnLoad,\\n    /**\\n     * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier\\n     * @prop {Boolean} gpuAcceleration=true\\n     * If true, it uses the CSS 3D transformation to position the popper.\\n     * Otherwise, it will use the `top` and `left` properties\\n     */\\n    gpuAcceleration: undefined\\n  }\\n};\\n\\n/**\\n * The `dataObject` is an object containing all the information used by Popper.js.\\n * This object is passed to modifiers and to the `onCreate` and `onUpdate` callbacks.\\n * @name dataObject\\n * @property {Object} data.instance The Popper.js instance\\n * @property {String} data.placement Placement applied to popper\\n * @property {String} data.originalPlacement Placement originally defined on init\\n * @property {Boolean} data.flipped True if popper has been flipped by flip modifier\\n * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper\\n * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier\\n * @property {Object} data.styles Any CSS property defined here will be applied to the popper. It expects the JavaScript nomenclature (eg. `marginBottom`)\\n * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow. It expects the JavaScript nomenclature (eg. `marginBottom`)\\n * @property {Object} data.boundaries Offsets of the popper boundaries\\n * @property {Object} data.offsets The measurements of popper, reference and arrow elements\\n * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values\\n * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values\\n * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0\\n */\\n\\n/**\\n * Default options provided to Popper.js constructor.<br />\\n * These can be overridden using the `options` argument of Popper.js.<br />\\n * To override an option, simply pass an object with the same\\n * structure of the `options` object, as the 3rd argument. For example:\\n * ```\\n * new Popper(ref, pop, {\\n *   modifiers: {\\n *     preventOverflow: { enabled: false }\\n *   }\\n * })\\n * ```\\n * @type {Object}\\n * @static\\n * @memberof Popper\\n */\\nvar Defaults = {\\n  /**\\n   * Popper's placement.\\n   * @prop {Popper.placements} placement='bottom'\\n   */\\n  placement: 'bottom',\\n\\n  /**\\n   * Set this to true if you want popper to position it self in 'fixed' mode\\n   * @prop {Boolean} positionFixed=false\\n   */\\n  positionFixed: false,\\n\\n  /**\\n   * Whether events (resize, scroll) are initially enabled.\\n   * @prop {Boolean} eventsEnabled=true\\n   */\\n  eventsEnabled: true,\\n\\n  /**\\n   * Set to true if you want to automatically remove the popper when\\n   * you call the `destroy` method.\\n   * @prop {Boolean} removeOnDestroy=false\\n   */\\n  removeOnDestroy: false,\\n\\n  /**\\n   * Callback called when the popper is created.<br />\\n   * By default, it is set to no-op.<br />\\n   * Access Popper.js instance with `data.instance`.\\n   * @prop {onCreate}\\n   */\\n  onCreate: function onCreate() {},\\n\\n  /**\\n   * Callback called when the popper is updated. This callback is not called\\n   * on the initialization/creation of the popper, but only on subsequent\\n   * updates.<br />\\n   * By default, it is set to no-op.<br />\\n   * Access Popper.js instance with `data.instance`.\\n   * @prop {onUpdate}\\n   */\\n  onUpdate: function onUpdate() {},\\n\\n  /**\\n   * List of modifiers used to modify the offsets before they are applied to the popper.\\n   * They provide most of the functionalities of Popper.js.\\n   * @prop {modifiers}\\n   */\\n  modifiers: modifiers\\n};\\n\\n/**\\n * @callback onCreate\\n * @param {dataObject} data\\n */\\n\\n/**\\n * @callback onUpdate\\n * @param {dataObject} data\\n */\\n\\n// Utils\\n// Methods\\nvar Popper = function () {\\n  /**\\n   * Creates a new Popper.js instance.\\n   * @class Popper\\n   * @param {HTMLElement|referenceObject} reference - The reference element used to position the popper\\n   * @param {HTMLElement} popper - The HTML element used as the popper\\n   * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)\\n   * @return {Object} instance - The generated Popper.js instance\\n   */\\n  function Popper(reference, popper) {\\n    var _this = this;\\n\\n    var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\\n    classCallCheck(this, Popper);\\n\\n    this.scheduleUpdate = function () {\\n      return requestAnimationFrame(_this.update);\\n    };\\n\\n    // make update() debounced, so that it only runs at most once-per-tick\\n    this.update = debounce(this.update.bind(this));\\n\\n    // with {} we create a new object with the options inside it\\n    this.options = _extends({}, Popper.Defaults, options);\\n\\n    // init state\\n    this.state = {\\n      isDestroyed: false,\\n      isCreated: false,\\n      scrollParents: []\\n    };\\n\\n    // get reference and popper elements (allow jQuery wrappers)\\n    this.reference = reference && reference.jquery ? reference[0] : reference;\\n    this.popper = popper && popper.jquery ? popper[0] : popper;\\n\\n    // Deep merge modifiers options\\n    this.options.modifiers = {};\\n    Object.keys(_extends({}, Popper.Defaults.modifiers, options.modifiers)).forEach(function (name) {\\n      _this.options.modifiers[name] = _extends({}, Popper.Defaults.modifiers[name] || {}, options.modifiers ? options.modifiers[name] : {});\\n    });\\n\\n    // Refactoring modifiers' list (Object => Array)\\n    this.modifiers = Object.keys(this.options.modifiers).map(function (name) {\\n      return _extends({\\n        name: name\\n      }, _this.options.modifiers[name]);\\n    })\\n    // sort the modifiers by order\\n    .sort(function (a, b) {\\n      return a.order - b.order;\\n    });\\n\\n    // modifiers have the ability to execute arbitrary code when Popper.js get inited\\n    // such code is executed in the same order of its modifier\\n    // they could add new properties to their options configuration\\n    // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`!\\n    this.modifiers.forEach(function (modifierOptions) {\\n      if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) {\\n        modifierOptions.onLoad(_this.reference, _this.popper, _this.options, modifierOptions, _this.state);\\n      }\\n    });\\n\\n    // fire the first update to position the popper in the right place\\n    this.update();\\n\\n    var eventsEnabled = this.options.eventsEnabled;\\n    if (eventsEnabled) {\\n      // setup event listeners, they will take care of update the position in specific situations\\n      this.enableEventListeners();\\n    }\\n\\n    this.state.eventsEnabled = eventsEnabled;\\n  }\\n\\n  // We can't use class properties because they don't get listed in the\\n  // class prototype and break stuff like Sinon stubs\\n\\n\\n  createClass(Popper, [{\\n    key: 'update',\\n    value: function update$$1() {\\n      return update.call(this);\\n    }\\n  }, {\\n    key: 'destroy',\\n    value: function destroy$$1() {\\n      return destroy.call(this);\\n    }\\n  }, {\\n    key: 'enableEventListeners',\\n    value: function enableEventListeners$$1() {\\n      return enableEventListeners.call(this);\\n    }\\n  }, {\\n    key: 'disableEventListeners',\\n    value: function disableEventListeners$$1() {\\n      return disableEventListeners.call(this);\\n    }\\n\\n    /**\\n     * Schedules an update. It will run on the next UI update available.\\n     * @method scheduleUpdate\\n     * @memberof Popper\\n     */\\n\\n\\n    /**\\n     * Collection of utilities useful when writing custom modifiers.\\n     * Starting from version 1.7, this method is available only if you\\n     * include `popper-utils.js` before `popper.js`.\\n     *\\n     * **DEPRECATION**: This way to access PopperUtils is deprecated\\n     * and will be removed in v2! Use the PopperUtils module directly instead.\\n     * Due to the high instability of the methods contained in Utils, we can't\\n     * guarantee them to follow semver. Use them at your own risk!\\n     * @static\\n     * @private\\n     * @type {Object}\\n     * @deprecated since version 1.8\\n     * @member Utils\\n     * @memberof Popper\\n     */\\n\\n  }]);\\n  return Popper;\\n}();\\n\\n/**\\n * The `referenceObject` is an object that provides an interface compatible with Popper.js\\n * and lets you use it as replacement of a real DOM node.<br />\\n * You can use this method to position a popper relatively to a set of coordinates\\n * in case you don't have a DOM node to use as reference.\\n *\\n * ```\\n * new Popper(referenceObject, popperNode);\\n * ```\\n *\\n * NB: This feature isn't supported in Internet Explorer 10.\\n * @name referenceObject\\n * @property {Function} data.getBoundingClientRect\\n * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method.\\n * @property {number} data.clientWidth\\n * An ES6 getter that will return the width of the virtual reference element.\\n * @property {number} data.clientHeight\\n * An ES6 getter that will return the height of the virtual reference element.\\n */\\n\\n\\nPopper.Utils = (typeof window !== 'undefined' ? window : global).PopperUtils;\\nPopper.placements = placements;\\nPopper.Defaults = Defaults;\\n\\nexport default Popper;\\n//# sourceMappingURL=popper.js.map\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): dropdown.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\nimport Popper from 'popper.js'\\nimport Util from './util'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME                     = 'dropdown'\\nconst VERSION                  = '4.3.1'\\nconst DATA_KEY                 = 'bs.dropdown'\\nconst EVENT_KEY                = `.${DATA_KEY}`\\nconst DATA_API_KEY             = '.data-api'\\nconst JQUERY_NO_CONFLICT       = $.fn[NAME]\\nconst ESCAPE_KEYCODE           = 27 // KeyboardEvent.which value for Escape (Esc) key\\nconst SPACE_KEYCODE            = 32 // KeyboardEvent.which value for space key\\nconst TAB_KEYCODE              = 9 // KeyboardEvent.which value for tab key\\nconst ARROW_UP_KEYCODE         = 38 // KeyboardEvent.which value for up arrow key\\nconst ARROW_DOWN_KEYCODE       = 40 // KeyboardEvent.which value for down arrow key\\nconst RIGHT_MOUSE_BUTTON_WHICH = 3 // MouseEvent.which value for the right button (assuming a right-handed mouse)\\nconst REGEXP_KEYDOWN           = new RegExp(`${ARROW_UP_KEYCODE}|${ARROW_DOWN_KEYCODE}|${ESCAPE_KEYCODE}`)\\n\\nconst Event = {\\n  HIDE             : `hide${EVENT_KEY}`,\\n  HIDDEN           : `hidden${EVENT_KEY}`,\\n  SHOW             : `show${EVENT_KEY}`,\\n  SHOWN            : `shown${EVENT_KEY}`,\\n  CLICK            : `click${EVENT_KEY}`,\\n  CLICK_DATA_API   : `click${EVENT_KEY}${DATA_API_KEY}`,\\n  KEYDOWN_DATA_API : `keydown${EVENT_KEY}${DATA_API_KEY}`,\\n  KEYUP_DATA_API   : `keyup${EVENT_KEY}${DATA_API_KEY}`\\n}\\n\\nconst ClassName = {\\n  DISABLED        : 'disabled',\\n  SHOW            : 'show',\\n  DROPUP          : 'dropup',\\n  DROPRIGHT       : 'dropright',\\n  DROPLEFT        : 'dropleft',\\n  MENURIGHT       : 'dropdown-menu-right',\\n  MENULEFT        : 'dropdown-menu-left',\\n  POSITION_STATIC : 'position-static'\\n}\\n\\nconst Selector = {\\n  DATA_TOGGLE   : '[data-toggle=\\\"dropdown\\\"]',\\n  FORM_CHILD    : '.dropdown form',\\n  MENU          : '.dropdown-menu',\\n  NAVBAR_NAV    : '.navbar-nav',\\n  VISIBLE_ITEMS : '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\\n}\\n\\nconst AttachmentMap = {\\n  TOP       : 'top-start',\\n  TOPEND    : 'top-end',\\n  BOTTOM    : 'bottom-start',\\n  BOTTOMEND : 'bottom-end',\\n  RIGHT     : 'right-start',\\n  RIGHTEND  : 'right-end',\\n  LEFT      : 'left-start',\\n  LEFTEND   : 'left-end'\\n}\\n\\nconst Default = {\\n  offset    : 0,\\n  flip      : true,\\n  boundary  : 'scrollParent',\\n  reference : 'toggle',\\n  display   : 'dynamic'\\n}\\n\\nconst DefaultType = {\\n  offset    : '(number|string|function)',\\n  flip      : 'boolean',\\n  boundary  : '(string|element)',\\n  reference : '(string|element)',\\n  display   : 'string'\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass Dropdown {\\n  constructor(element, config) {\\n    this._element  = element\\n    this._popper   = null\\n    this._config   = this._getConfig(config)\\n    this._menu     = this._getMenuElement()\\n    this._inNavbar = this._detectNavbar()\\n\\n    this._addEventListeners()\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  static get Default() {\\n    return Default\\n  }\\n\\n  static get DefaultType() {\\n    return DefaultType\\n  }\\n\\n  // Public\\n\\n  toggle() {\\n    if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED)) {\\n      return\\n    }\\n\\n    const parent   = Dropdown._getParentFromElement(this._element)\\n    const isActive = $(this._menu).hasClass(ClassName.SHOW)\\n\\n    Dropdown._clearMenus()\\n\\n    if (isActive) {\\n      return\\n    }\\n\\n    const relatedTarget = {\\n      relatedTarget: this._element\\n    }\\n    const showEvent = $.Event(Event.SHOW, relatedTarget)\\n\\n    $(parent).trigger(showEvent)\\n\\n    if (showEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    // Disable totally Popper.js for Dropdown in Navbar\\n    if (!this._inNavbar) {\\n      /**\\n       * Check for Popper dependency\\n       * Popper - https://popper.js.org\\n       */\\n      if (typeof Popper === 'undefined') {\\n        throw new TypeError('Bootstrap\\\\'s dropdowns require Popper.js (https://popper.js.org/)')\\n      }\\n\\n      let referenceElement = this._element\\n\\n      if (this._config.reference === 'parent') {\\n        referenceElement = parent\\n      } else if (Util.isElement(this._config.reference)) {\\n        referenceElement = this._config.reference\\n\\n        // Check if it's jQuery element\\n        if (typeof this._config.reference.jquery !== 'undefined') {\\n          referenceElement = this._config.reference[0]\\n        }\\n      }\\n\\n      // If boundary is not `scrollParent`, then set position to `static`\\n      // to allow the menu to \\\"escape\\\" the scroll parent's boundaries\\n      // https://github.com/twbs/bootstrap/issues/24251\\n      if (this._config.boundary !== 'scrollParent') {\\n        $(parent).addClass(ClassName.POSITION_STATIC)\\n      }\\n      this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig())\\n    }\\n\\n    // If this is a touch-enabled device we add extra\\n    // empty mouseover listeners to the body's immediate children;\\n    // only needed because of broken event delegation on iOS\\n    // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\\n    if ('ontouchstart' in document.documentElement &&\\n        $(parent).closest(Selector.NAVBAR_NAV).length === 0) {\\n      $(document.body).children().on('mouseover', null, $.noop)\\n    }\\n\\n    this._element.focus()\\n    this._element.setAttribute('aria-expanded', true)\\n\\n    $(this._menu).toggleClass(ClassName.SHOW)\\n    $(parent)\\n      .toggleClass(ClassName.SHOW)\\n      .trigger($.Event(Event.SHOWN, relatedTarget))\\n  }\\n\\n  show() {\\n    if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || $(this._menu).hasClass(ClassName.SHOW)) {\\n      return\\n    }\\n\\n    const relatedTarget = {\\n      relatedTarget: this._element\\n    }\\n    const showEvent = $.Event(Event.SHOW, relatedTarget)\\n    const parent = Dropdown._getParentFromElement(this._element)\\n\\n    $(parent).trigger(showEvent)\\n\\n    if (showEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    $(this._menu).toggleClass(ClassName.SHOW)\\n    $(parent)\\n      .toggleClass(ClassName.SHOW)\\n      .trigger($.Event(Event.SHOWN, relatedTarget))\\n  }\\n\\n  hide() {\\n    if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || !$(this._menu).hasClass(ClassName.SHOW)) {\\n      return\\n    }\\n\\n    const relatedTarget = {\\n      relatedTarget: this._element\\n    }\\n    const hideEvent = $.Event(Event.HIDE, relatedTarget)\\n    const parent = Dropdown._getParentFromElement(this._element)\\n\\n    $(parent).trigger(hideEvent)\\n\\n    if (hideEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    $(this._menu).toggleClass(ClassName.SHOW)\\n    $(parent)\\n      .toggleClass(ClassName.SHOW)\\n      .trigger($.Event(Event.HIDDEN, relatedTarget))\\n  }\\n\\n  dispose() {\\n    $.removeData(this._element, DATA_KEY)\\n    $(this._element).off(EVENT_KEY)\\n    this._element = null\\n    this._menu = null\\n    if (this._popper !== null) {\\n      this._popper.destroy()\\n      this._popper = null\\n    }\\n  }\\n\\n  update() {\\n    this._inNavbar = this._detectNavbar()\\n    if (this._popper !== null) {\\n      this._popper.scheduleUpdate()\\n    }\\n  }\\n\\n  // Private\\n\\n  _addEventListeners() {\\n    $(this._element).on(Event.CLICK, (event) => {\\n      event.preventDefault()\\n      event.stopPropagation()\\n      this.toggle()\\n    })\\n  }\\n\\n  _getConfig(config) {\\n    config = {\\n      ...this.constructor.Default,\\n      ...$(this._element).data(),\\n      ...config\\n    }\\n\\n    Util.typeCheckConfig(\\n      NAME,\\n      config,\\n      this.constructor.DefaultType\\n    )\\n\\n    return config\\n  }\\n\\n  _getMenuElement() {\\n    if (!this._menu) {\\n      const parent = Dropdown._getParentFromElement(this._element)\\n\\n      if (parent) {\\n        this._menu = parent.querySelector(Selector.MENU)\\n      }\\n    }\\n    return this._menu\\n  }\\n\\n  _getPlacement() {\\n    const $parentDropdown = $(this._element.parentNode)\\n    let placement = AttachmentMap.BOTTOM\\n\\n    // Handle dropup\\n    if ($parentDropdown.hasClass(ClassName.DROPUP)) {\\n      placement = AttachmentMap.TOP\\n      if ($(this._menu).hasClass(ClassName.MENURIGHT)) {\\n        placement = AttachmentMap.TOPEND\\n      }\\n    } else if ($parentDropdown.hasClass(ClassName.DROPRIGHT)) {\\n      placement = AttachmentMap.RIGHT\\n    } else if ($parentDropdown.hasClass(ClassName.DROPLEFT)) {\\n      placement = AttachmentMap.LEFT\\n    } else if ($(this._menu).hasClass(ClassName.MENURIGHT)) {\\n      placement = AttachmentMap.BOTTOMEND\\n    }\\n    return placement\\n  }\\n\\n  _detectNavbar() {\\n    return $(this._element).closest('.navbar').length > 0\\n  }\\n\\n  _getOffset() {\\n    const offset = {}\\n\\n    if (typeof this._config.offset === 'function') {\\n      offset.fn = (data) => {\\n        data.offsets = {\\n          ...data.offsets,\\n          ...this._config.offset(data.offsets, this._element) || {}\\n        }\\n\\n        return data\\n      }\\n    } else {\\n      offset.offset = this._config.offset\\n    }\\n\\n    return offset\\n  }\\n\\n  _getPopperConfig() {\\n    const popperConfig = {\\n      placement: this._getPlacement(),\\n      modifiers: {\\n        offset: this._getOffset(),\\n        flip: {\\n          enabled: this._config.flip\\n        },\\n        preventOverflow: {\\n          boundariesElement: this._config.boundary\\n        }\\n      }\\n    }\\n\\n    // Disable Popper.js if we have a static display\\n    if (this._config.display === 'static') {\\n      popperConfig.modifiers.applyStyle = {\\n        enabled: false\\n      }\\n    }\\n\\n    return popperConfig\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      let data = $(this).data(DATA_KEY)\\n      const _config = typeof config === 'object' ? config : null\\n\\n      if (!data) {\\n        data = new Dropdown(this, _config)\\n        $(this).data(DATA_KEY, data)\\n      }\\n\\n      if (typeof config === 'string') {\\n        if (typeof data[config] === 'undefined') {\\n          throw new TypeError(`No method named \\\"${config}\\\"`)\\n        }\\n        data[config]()\\n      }\\n    })\\n  }\\n\\n  static _clearMenus(event) {\\n    if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH ||\\n      event.type === 'keyup' && event.which !== TAB_KEYCODE)) {\\n      return\\n    }\\n\\n    const toggles = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE))\\n\\n    for (let i = 0, len = toggles.length; i < len; i++) {\\n      const parent = Dropdown._getParentFromElement(toggles[i])\\n      const context = $(toggles[i]).data(DATA_KEY)\\n      const relatedTarget = {\\n        relatedTarget: toggles[i]\\n      }\\n\\n      if (event && event.type === 'click') {\\n        relatedTarget.clickEvent = event\\n      }\\n\\n      if (!context) {\\n        continue\\n      }\\n\\n      const dropdownMenu = context._menu\\n      if (!$(parent).hasClass(ClassName.SHOW)) {\\n        continue\\n      }\\n\\n      if (event && (event.type === 'click' &&\\n          /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) &&\\n          $.contains(parent, event.target)) {\\n        continue\\n      }\\n\\n      const hideEvent = $.Event(Event.HIDE, relatedTarget)\\n      $(parent).trigger(hideEvent)\\n      if (hideEvent.isDefaultPrevented()) {\\n        continue\\n      }\\n\\n      // If this is a touch-enabled device we remove the extra\\n      // empty mouseover listeners we added for iOS support\\n      if ('ontouchstart' in document.documentElement) {\\n        $(document.body).children().off('mouseover', null, $.noop)\\n      }\\n\\n      toggles[i].setAttribute('aria-expanded', 'false')\\n\\n      $(dropdownMenu).removeClass(ClassName.SHOW)\\n      $(parent)\\n        .removeClass(ClassName.SHOW)\\n        .trigger($.Event(Event.HIDDEN, relatedTarget))\\n    }\\n  }\\n\\n  static _getParentFromElement(element) {\\n    let parent\\n    const selector = Util.getSelectorFromElement(element)\\n\\n    if (selector) {\\n      parent = document.querySelector(selector)\\n    }\\n\\n    return parent || element.parentNode\\n  }\\n\\n  // eslint-disable-next-line complexity\\n  static _dataApiKeydownHandler(event) {\\n    // If not input/textarea:\\n    //  - And not a key in REGEXP_KEYDOWN => not a dropdown command\\n    // If input/textarea:\\n    //  - If space key => not a dropdown command\\n    //  - If key is other than escape\\n    //    - If key is not up or down => not a dropdown command\\n    //    - If trigger inside the menu => not a dropdown command\\n    if (/input|textarea/i.test(event.target.tagName)\\n      ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE &&\\n      (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE ||\\n        $(event.target).closest(Selector.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {\\n      return\\n    }\\n\\n    event.preventDefault()\\n    event.stopPropagation()\\n\\n    if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {\\n      return\\n    }\\n\\n    const parent   = Dropdown._getParentFromElement(this)\\n    const isActive = $(parent).hasClass(ClassName.SHOW)\\n\\n    if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {\\n      if (event.which === ESCAPE_KEYCODE) {\\n        const toggle = parent.querySelector(Selector.DATA_TOGGLE)\\n        $(toggle).trigger('focus')\\n      }\\n\\n      $(this).trigger('click')\\n      return\\n    }\\n\\n    const items = [].slice.call(parent.querySelectorAll(Selector.VISIBLE_ITEMS))\\n\\n    if (items.length === 0) {\\n      return\\n    }\\n\\n    let index = items.indexOf(event.target)\\n\\n    if (event.which === ARROW_UP_KEYCODE && index > 0) { // Up\\n      index--\\n    }\\n\\n    if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) { // Down\\n      index++\\n    }\\n\\n    if (index < 0) {\\n      index = 0\\n    }\\n\\n    items[index].focus()\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Data Api implementation\\n * ------------------------------------------------------------------------\\n */\\n\\n$(document)\\n  .on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler)\\n  .on(Event.KEYDOWN_DATA_API, Selector.MENU, Dropdown._dataApiKeydownHandler)\\n  .on(`${Event.CLICK_DATA_API} ${Event.KEYUP_DATA_API}`, Dropdown._clearMenus)\\n  .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\\n    event.preventDefault()\\n    event.stopPropagation()\\n    Dropdown._jQueryInterface.call($(this), 'toggle')\\n  })\\n  .on(Event.CLICK_DATA_API, Selector.FORM_CHILD, (e) => {\\n    e.stopPropagation()\\n  })\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME] = Dropdown._jQueryInterface\\n$.fn[NAME].Constructor = Dropdown\\n$.fn[NAME].noConflict = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Dropdown._jQueryInterface\\n}\\n\\n\\nexport default Dropdown\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): modal.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\nimport Util from './util'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME               = 'modal'\\nconst VERSION            = '4.3.1'\\nconst DATA_KEY           = 'bs.modal'\\nconst EVENT_KEY          = `.${DATA_KEY}`\\nconst DATA_API_KEY       = '.data-api'\\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\\nconst ESCAPE_KEYCODE     = 27 // KeyboardEvent.which value for Escape (Esc) key\\n\\nconst Default = {\\n  backdrop : true,\\n  keyboard : true,\\n  focus    : true,\\n  show     : true\\n}\\n\\nconst DefaultType = {\\n  backdrop : '(boolean|string)',\\n  keyboard : 'boolean',\\n  focus    : 'boolean',\\n  show     : 'boolean'\\n}\\n\\nconst Event = {\\n  HIDE              : `hide${EVENT_KEY}`,\\n  HIDDEN            : `hidden${EVENT_KEY}`,\\n  SHOW              : `show${EVENT_KEY}`,\\n  SHOWN             : `shown${EVENT_KEY}`,\\n  FOCUSIN           : `focusin${EVENT_KEY}`,\\n  RESIZE            : `resize${EVENT_KEY}`,\\n  CLICK_DISMISS     : `click.dismiss${EVENT_KEY}`,\\n  KEYDOWN_DISMISS   : `keydown.dismiss${EVENT_KEY}`,\\n  MOUSEUP_DISMISS   : `mouseup.dismiss${EVENT_KEY}`,\\n  MOUSEDOWN_DISMISS : `mousedown.dismiss${EVENT_KEY}`,\\n  CLICK_DATA_API    : `click${EVENT_KEY}${DATA_API_KEY}`\\n}\\n\\nconst ClassName = {\\n  SCROLLABLE         : 'modal-dialog-scrollable',\\n  SCROLLBAR_MEASURER : 'modal-scrollbar-measure',\\n  BACKDROP           : 'modal-backdrop',\\n  OPEN               : 'modal-open',\\n  FADE               : 'fade',\\n  SHOW               : 'show'\\n}\\n\\nconst Selector = {\\n  DIALOG         : '.modal-dialog',\\n  MODAL_BODY     : '.modal-body',\\n  DATA_TOGGLE    : '[data-toggle=\\\"modal\\\"]',\\n  DATA_DISMISS   : '[data-dismiss=\\\"modal\\\"]',\\n  FIXED_CONTENT  : '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',\\n  STICKY_CONTENT : '.sticky-top'\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass Modal {\\n  constructor(element, config) {\\n    this._config              = this._getConfig(config)\\n    this._element             = element\\n    this._dialog              = element.querySelector(Selector.DIALOG)\\n    this._backdrop            = null\\n    this._isShown             = false\\n    this._isBodyOverflowing   = false\\n    this._ignoreBackdropClick = false\\n    this._isTransitioning     = false\\n    this._scrollbarWidth      = 0\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  static get Default() {\\n    return Default\\n  }\\n\\n  // Public\\n\\n  toggle(relatedTarget) {\\n    return this._isShown ? this.hide() : this.show(relatedTarget)\\n  }\\n\\n  show(relatedTarget) {\\n    if (this._isShown || this._isTransitioning) {\\n      return\\n    }\\n\\n    if ($(this._element).hasClass(ClassName.FADE)) {\\n      this._isTransitioning = true\\n    }\\n\\n    const showEvent = $.Event(Event.SHOW, {\\n      relatedTarget\\n    })\\n\\n    $(this._element).trigger(showEvent)\\n\\n    if (this._isShown || showEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    this._isShown = true\\n\\n    this._checkScrollbar()\\n    this._setScrollbar()\\n\\n    this._adjustDialog()\\n\\n    this._setEscapeEvent()\\n    this._setResizeEvent()\\n\\n    $(this._element).on(\\n      Event.CLICK_DISMISS,\\n      Selector.DATA_DISMISS,\\n      (event) => this.hide(event)\\n    )\\n\\n    $(this._dialog).on(Event.MOUSEDOWN_DISMISS, () => {\\n      $(this._element).one(Event.MOUSEUP_DISMISS, (event) => {\\n        if ($(event.target).is(this._element)) {\\n          this._ignoreBackdropClick = true\\n        }\\n      })\\n    })\\n\\n    this._showBackdrop(() => this._showElement(relatedTarget))\\n  }\\n\\n  hide(event) {\\n    if (event) {\\n      event.preventDefault()\\n    }\\n\\n    if (!this._isShown || this._isTransitioning) {\\n      return\\n    }\\n\\n    const hideEvent = $.Event(Event.HIDE)\\n\\n    $(this._element).trigger(hideEvent)\\n\\n    if (!this._isShown || hideEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    this._isShown = false\\n    const transition = $(this._element).hasClass(ClassName.FADE)\\n\\n    if (transition) {\\n      this._isTransitioning = true\\n    }\\n\\n    this._setEscapeEvent()\\n    this._setResizeEvent()\\n\\n    $(document).off(Event.FOCUSIN)\\n\\n    $(this._element).removeClass(ClassName.SHOW)\\n\\n    $(this._element).off(Event.CLICK_DISMISS)\\n    $(this._dialog).off(Event.MOUSEDOWN_DISMISS)\\n\\n\\n    if (transition) {\\n      const transitionDuration  = Util.getTransitionDurationFromElement(this._element)\\n\\n      $(this._element)\\n        .one(Util.TRANSITION_END, (event) => this._hideModal(event))\\n        .emulateTransitionEnd(transitionDuration)\\n    } else {\\n      this._hideModal()\\n    }\\n  }\\n\\n  dispose() {\\n    [window, this._element, this._dialog]\\n      .forEach((htmlElement) => $(htmlElement).off(EVENT_KEY))\\n\\n    /**\\n     * `document` has 2 events `Event.FOCUSIN` and `Event.CLICK_DATA_API`\\n     * Do not move `document` in `htmlElements` array\\n     * It will remove `Event.CLICK_DATA_API` event that should remain\\n     */\\n    $(document).off(Event.FOCUSIN)\\n\\n    $.removeData(this._element, DATA_KEY)\\n\\n    this._config              = null\\n    this._element             = null\\n    this._dialog              = null\\n    this._backdrop            = null\\n    this._isShown             = null\\n    this._isBodyOverflowing   = null\\n    this._ignoreBackdropClick = null\\n    this._isTransitioning     = null\\n    this._scrollbarWidth      = null\\n  }\\n\\n  handleUpdate() {\\n    this._adjustDialog()\\n  }\\n\\n  // Private\\n\\n  _getConfig(config) {\\n    config = {\\n      ...Default,\\n      ...config\\n    }\\n    Util.typeCheckConfig(NAME, config, DefaultType)\\n    return config\\n  }\\n\\n  _showElement(relatedTarget) {\\n    const transition = $(this._element).hasClass(ClassName.FADE)\\n\\n    if (!this._element.parentNode ||\\n        this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\\n      // Don't move modal's DOM position\\n      document.body.appendChild(this._element)\\n    }\\n\\n    this._element.style.display = 'block'\\n    this._element.removeAttribute('aria-hidden')\\n    this._element.setAttribute('aria-modal', true)\\n\\n    if ($(this._dialog).hasClass(ClassName.SCROLLABLE)) {\\n      this._dialog.querySelector(Selector.MODAL_BODY).scrollTop = 0\\n    } else {\\n      this._element.scrollTop = 0\\n    }\\n\\n    if (transition) {\\n      Util.reflow(this._element)\\n    }\\n\\n    $(this._element).addClass(ClassName.SHOW)\\n\\n    if (this._config.focus) {\\n      this._enforceFocus()\\n    }\\n\\n    const shownEvent = $.Event(Event.SHOWN, {\\n      relatedTarget\\n    })\\n\\n    const transitionComplete = () => {\\n      if (this._config.focus) {\\n        this._element.focus()\\n      }\\n      this._isTransitioning = false\\n      $(this._element).trigger(shownEvent)\\n    }\\n\\n    if (transition) {\\n      const transitionDuration  = Util.getTransitionDurationFromElement(this._dialog)\\n\\n      $(this._dialog)\\n        .one(Util.TRANSITION_END, transitionComplete)\\n        .emulateTransitionEnd(transitionDuration)\\n    } else {\\n      transitionComplete()\\n    }\\n  }\\n\\n  _enforceFocus() {\\n    $(document)\\n      .off(Event.FOCUSIN) // Guard against infinite focus loop\\n      .on(Event.FOCUSIN, (event) => {\\n        if (document !== event.target &&\\n            this._element !== event.target &&\\n            $(this._element).has(event.target).length === 0) {\\n          this._element.focus()\\n        }\\n      })\\n  }\\n\\n  _setEscapeEvent() {\\n    if (this._isShown && this._config.keyboard) {\\n      $(this._element).on(Event.KEYDOWN_DISMISS, (event) => {\\n        if (event.which === ESCAPE_KEYCODE) {\\n          event.preventDefault()\\n          this.hide()\\n        }\\n      })\\n    } else if (!this._isShown) {\\n      $(this._element).off(Event.KEYDOWN_DISMISS)\\n    }\\n  }\\n\\n  _setResizeEvent() {\\n    if (this._isShown) {\\n      $(window).on(Event.RESIZE, (event) => this.handleUpdate(event))\\n    } else {\\n      $(window).off(Event.RESIZE)\\n    }\\n  }\\n\\n  _hideModal() {\\n    this._element.style.display = 'none'\\n    this._element.setAttribute('aria-hidden', true)\\n    this._element.removeAttribute('aria-modal')\\n    this._isTransitioning = false\\n    this._showBackdrop(() => {\\n      $(document.body).removeClass(ClassName.OPEN)\\n      this._resetAdjustments()\\n      this._resetScrollbar()\\n      $(this._element).trigger(Event.HIDDEN)\\n    })\\n  }\\n\\n  _removeBackdrop() {\\n    if (this._backdrop) {\\n      $(this._backdrop).remove()\\n      this._backdrop = null\\n    }\\n  }\\n\\n  _showBackdrop(callback) {\\n    const animate = $(this._element).hasClass(ClassName.FADE)\\n      ? ClassName.FADE : ''\\n\\n    if (this._isShown && this._config.backdrop) {\\n      this._backdrop = document.createElement('div')\\n      this._backdrop.className = ClassName.BACKDROP\\n\\n      if (animate) {\\n        this._backdrop.classList.add(animate)\\n      }\\n\\n      $(this._backdrop).appendTo(document.body)\\n\\n      $(this._element).on(Event.CLICK_DISMISS, (event) => {\\n        if (this._ignoreBackdropClick) {\\n          this._ignoreBackdropClick = false\\n          return\\n        }\\n        if (event.target !== event.currentTarget) {\\n          return\\n        }\\n        if (this._config.backdrop === 'static') {\\n          this._element.focus()\\n        } else {\\n          this.hide()\\n        }\\n      })\\n\\n      if (animate) {\\n        Util.reflow(this._backdrop)\\n      }\\n\\n      $(this._backdrop).addClass(ClassName.SHOW)\\n\\n      if (!callback) {\\n        return\\n      }\\n\\n      if (!animate) {\\n        callback()\\n        return\\n      }\\n\\n      const backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop)\\n\\n      $(this._backdrop)\\n        .one(Util.TRANSITION_END, callback)\\n        .emulateTransitionEnd(backdropTransitionDuration)\\n    } else if (!this._isShown && this._backdrop) {\\n      $(this._backdrop).removeClass(ClassName.SHOW)\\n\\n      const callbackRemove = () => {\\n        this._removeBackdrop()\\n        if (callback) {\\n          callback()\\n        }\\n      }\\n\\n      if ($(this._element).hasClass(ClassName.FADE)) {\\n        const backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop)\\n\\n        $(this._backdrop)\\n          .one(Util.TRANSITION_END, callbackRemove)\\n          .emulateTransitionEnd(backdropTransitionDuration)\\n      } else {\\n        callbackRemove()\\n      }\\n    } else if (callback) {\\n      callback()\\n    }\\n  }\\n\\n  // ----------------------------------------------------------------------\\n  // the following methods are used to handle overflowing modals\\n  // todo (fat): these should probably be refactored out of modal.js\\n  // ----------------------------------------------------------------------\\n\\n  _adjustDialog() {\\n    const isModalOverflowing =\\n      this._element.scrollHeight > document.documentElement.clientHeight\\n\\n    if (!this._isBodyOverflowing && isModalOverflowing) {\\n      this._element.style.paddingLeft = `${this._scrollbarWidth}px`\\n    }\\n\\n    if (this._isBodyOverflowing && !isModalOverflowing) {\\n      this._element.style.paddingRight = `${this._scrollbarWidth}px`\\n    }\\n  }\\n\\n  _resetAdjustments() {\\n    this._element.style.paddingLeft = ''\\n    this._element.style.paddingRight = ''\\n  }\\n\\n  _checkScrollbar() {\\n    const rect = document.body.getBoundingClientRect()\\n    this._isBodyOverflowing = rect.left + rect.right < window.innerWidth\\n    this._scrollbarWidth = this._getScrollbarWidth()\\n  }\\n\\n  _setScrollbar() {\\n    if (this._isBodyOverflowing) {\\n      // Note: DOMNode.style.paddingRight returns the actual value or '' if not set\\n      //   while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set\\n      const fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT))\\n      const stickyContent = [].slice.call(document.querySelectorAll(Selector.STICKY_CONTENT))\\n\\n      // Adjust fixed content padding\\n      $(fixedContent).each((index, element) => {\\n        const actualPadding = element.style.paddingRight\\n        const calculatedPadding = $(element).css('padding-right')\\n        $(element)\\n          .data('padding-right', actualPadding)\\n          .css('padding-right', `${parseFloat(calculatedPadding) + this._scrollbarWidth}px`)\\n      })\\n\\n      // Adjust sticky content margin\\n      $(stickyContent).each((index, element) => {\\n        const actualMargin = element.style.marginRight\\n        const calculatedMargin = $(element).css('margin-right')\\n        $(element)\\n          .data('margin-right', actualMargin)\\n          .css('margin-right', `${parseFloat(calculatedMargin) - this._scrollbarWidth}px`)\\n      })\\n\\n      // Adjust body padding\\n      const actualPadding = document.body.style.paddingRight\\n      const calculatedPadding = $(document.body).css('padding-right')\\n      $(document.body)\\n        .data('padding-right', actualPadding)\\n        .css('padding-right', `${parseFloat(calculatedPadding) + this._scrollbarWidth}px`)\\n    }\\n\\n    $(document.body).addClass(ClassName.OPEN)\\n  }\\n\\n  _resetScrollbar() {\\n    // Restore fixed content padding\\n    const fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT))\\n    $(fixedContent).each((index, element) => {\\n      const padding = $(element).data('padding-right')\\n      $(element).removeData('padding-right')\\n      element.style.paddingRight = padding ? padding : ''\\n    })\\n\\n    // Restore sticky content\\n    const elements = [].slice.call(document.querySelectorAll(`${Selector.STICKY_CONTENT}`))\\n    $(elements).each((index, element) => {\\n      const margin = $(element).data('margin-right')\\n      if (typeof margin !== 'undefined') {\\n        $(element).css('margin-right', margin).removeData('margin-right')\\n      }\\n    })\\n\\n    // Restore body padding\\n    const padding = $(document.body).data('padding-right')\\n    $(document.body).removeData('padding-right')\\n    document.body.style.paddingRight = padding ? padding : ''\\n  }\\n\\n  _getScrollbarWidth() { // thx d.walsh\\n    const scrollDiv = document.createElement('div')\\n    scrollDiv.className = ClassName.SCROLLBAR_MEASURER\\n    document.body.appendChild(scrollDiv)\\n    const scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth\\n    document.body.removeChild(scrollDiv)\\n    return scrollbarWidth\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config, relatedTarget) {\\n    return this.each(function () {\\n      let data = $(this).data(DATA_KEY)\\n      const _config = {\\n        ...Default,\\n        ...$(this).data(),\\n        ...typeof config === 'object' && config ? config : {}\\n      }\\n\\n      if (!data) {\\n        data = new Modal(this, _config)\\n        $(this).data(DATA_KEY, data)\\n      }\\n\\n      if (typeof config === 'string') {\\n        if (typeof data[config] === 'undefined') {\\n          throw new TypeError(`No method named \\\"${config}\\\"`)\\n        }\\n        data[config](relatedTarget)\\n      } else if (_config.show) {\\n        data.show(relatedTarget)\\n      }\\n    })\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Data Api implementation\\n * ------------------------------------------------------------------------\\n */\\n\\n$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\\n  let target\\n  const selector = Util.getSelectorFromElement(this)\\n\\n  if (selector) {\\n    target = document.querySelector(selector)\\n  }\\n\\n  const config = $(target).data(DATA_KEY)\\n    ? 'toggle' : {\\n      ...$(target).data(),\\n      ...$(this).data()\\n    }\\n\\n  if (this.tagName === 'A' || this.tagName === 'AREA') {\\n    event.preventDefault()\\n  }\\n\\n  const $target = $(target).one(Event.SHOW, (showEvent) => {\\n    if (showEvent.isDefaultPrevented()) {\\n      // Only register focus restorer if modal will actually get shown\\n      return\\n    }\\n\\n    $target.one(Event.HIDDEN, () => {\\n      if ($(this).is(':visible')) {\\n        this.focus()\\n      }\\n    })\\n  })\\n\\n  Modal._jQueryInterface.call($(target), config, this)\\n})\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME] = Modal._jQueryInterface\\n$.fn[NAME].Constructor = Modal\\n$.fn[NAME].noConflict = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Modal._jQueryInterface\\n}\\n\\nexport default Modal\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): tools/sanitizer.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nconst uriAttrs = [\\n  'background',\\n  'cite',\\n  'href',\\n  'itemtype',\\n  'longdesc',\\n  'poster',\\n  'src',\\n  'xlink:href'\\n]\\n\\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\\\w-]*$/i\\n\\nexport const DefaultWhitelist = {\\n  // Global attributes allowed on any supplied element below.\\n  '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\\n  a: ['target', 'href', 'title', 'rel'],\\n  area: [],\\n  b: [],\\n  br: [],\\n  col: [],\\n  code: [],\\n  div: [],\\n  em: [],\\n  hr: [],\\n  h1: [],\\n  h2: [],\\n  h3: [],\\n  h4: [],\\n  h5: [],\\n  h6: [],\\n  i: [],\\n  img: ['src', 'alt', 'title', 'width', 'height'],\\n  li: [],\\n  ol: [],\\n  p: [],\\n  pre: [],\\n  s: [],\\n  small: [],\\n  span: [],\\n  sub: [],\\n  sup: [],\\n  strong: [],\\n  u: [],\\n  ul: []\\n}\\n\\n/**\\n * A pattern that recognizes a commonly useful subset of URLs that are safe.\\n *\\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\\n */\\nconst SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi\\n\\n/**\\n * A pattern that matches safe data URLs. Only matches image, video and audio types.\\n *\\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\\n */\\nconst DATA_URL_PATTERN = /^data:(?:image\\\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\\\/(?:mpeg|mp4|ogg|webm)|audio\\\\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i\\n\\nfunction allowedAttribute(attr, allowedAttributeList) {\\n  const attrName = attr.nodeName.toLowerCase()\\n\\n  if (allowedAttributeList.indexOf(attrName) !== -1) {\\n    if (uriAttrs.indexOf(attrName) !== -1) {\\n      return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN))\\n    }\\n\\n    return true\\n  }\\n\\n  const regExp = allowedAttributeList.filter((attrRegex) => attrRegex instanceof RegExp)\\n\\n  // Check if a regular expression validates the attribute.\\n  for (let i = 0, l = regExp.length; i < l; i++) {\\n    if (attrName.match(regExp[i])) {\\n      return true\\n    }\\n  }\\n\\n  return false\\n}\\n\\nexport function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {\\n  if (unsafeHtml.length === 0) {\\n    return unsafeHtml\\n  }\\n\\n  if (sanitizeFn && typeof sanitizeFn === 'function') {\\n    return sanitizeFn(unsafeHtml)\\n  }\\n\\n  const domParser = new window.DOMParser()\\n  const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\\n  const whitelistKeys = Object.keys(whiteList)\\n  const elements = [].slice.call(createdDocument.body.querySelectorAll('*'))\\n\\n  for (let i = 0, len = elements.length; i < len; i++) {\\n    const el = elements[i]\\n    const elName = el.nodeName.toLowerCase()\\n\\n    if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) {\\n      el.parentNode.removeChild(el)\\n\\n      continue\\n    }\\n\\n    const attributeList = [].slice.call(el.attributes)\\n    const whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || [])\\n\\n    attributeList.forEach((attr) => {\\n      if (!allowedAttribute(attr, whitelistedAttributes)) {\\n        el.removeAttribute(attr.nodeName)\\n      }\\n    })\\n  }\\n\\n  return createdDocument.body.innerHTML\\n}\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): tooltip.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport {\\n  DefaultWhitelist,\\n  sanitizeHtml\\n} from './tools/sanitizer'\\nimport $ from 'jquery'\\nimport Popper from 'popper.js'\\nimport Util from './util'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME                  = 'tooltip'\\nconst VERSION               = '4.3.1'\\nconst DATA_KEY              = 'bs.tooltip'\\nconst EVENT_KEY             = `.${DATA_KEY}`\\nconst JQUERY_NO_CONFLICT    = $.fn[NAME]\\nconst CLASS_PREFIX          = 'bs-tooltip'\\nconst BSCLS_PREFIX_REGEX    = new RegExp(`(^|\\\\\\\\s)${CLASS_PREFIX}\\\\\\\\S+`, 'g')\\nconst DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']\\n\\nconst DefaultType = {\\n  animation         : 'boolean',\\n  template          : 'string',\\n  title             : '(string|element|function)',\\n  trigger           : 'string',\\n  delay             : '(number|object)',\\n  html              : 'boolean',\\n  selector          : '(string|boolean)',\\n  placement         : '(string|function)',\\n  offset            : '(number|string|function)',\\n  container         : '(string|element|boolean)',\\n  fallbackPlacement : '(string|array)',\\n  boundary          : '(string|element)',\\n  sanitize          : 'boolean',\\n  sanitizeFn        : '(null|function)',\\n  whiteList         : 'object'\\n}\\n\\nconst AttachmentMap = {\\n  AUTO   : 'auto',\\n  TOP    : 'top',\\n  RIGHT  : 'right',\\n  BOTTOM : 'bottom',\\n  LEFT   : 'left'\\n}\\n\\nconst Default = {\\n  animation         : true,\\n  template          : '<div class=\\\"tooltip\\\" role=\\\"tooltip\\\">' +\\n                    '<div class=\\\"arrow\\\"></div>' +\\n                    '<div class=\\\"tooltip-inner\\\"></div></div>',\\n  trigger           : 'hover focus',\\n  title             : '',\\n  delay             : 0,\\n  html              : false,\\n  selector          : false,\\n  placement         : 'top',\\n  offset            : 0,\\n  container         : false,\\n  fallbackPlacement : 'flip',\\n  boundary          : 'scrollParent',\\n  sanitize          : true,\\n  sanitizeFn        : null,\\n  whiteList         : DefaultWhitelist\\n}\\n\\nconst HoverState = {\\n  SHOW : 'show',\\n  OUT  : 'out'\\n}\\n\\nconst Event = {\\n  HIDE       : `hide${EVENT_KEY}`,\\n  HIDDEN     : `hidden${EVENT_KEY}`,\\n  SHOW       : `show${EVENT_KEY}`,\\n  SHOWN      : `shown${EVENT_KEY}`,\\n  INSERTED   : `inserted${EVENT_KEY}`,\\n  CLICK      : `click${EVENT_KEY}`,\\n  FOCUSIN    : `focusin${EVENT_KEY}`,\\n  FOCUSOUT   : `focusout${EVENT_KEY}`,\\n  MOUSEENTER : `mouseenter${EVENT_KEY}`,\\n  MOUSELEAVE : `mouseleave${EVENT_KEY}`\\n}\\n\\nconst ClassName = {\\n  FADE : 'fade',\\n  SHOW : 'show'\\n}\\n\\nconst Selector = {\\n  TOOLTIP       : '.tooltip',\\n  TOOLTIP_INNER : '.tooltip-inner',\\n  ARROW         : '.arrow'\\n}\\n\\nconst Trigger = {\\n  HOVER  : 'hover',\\n  FOCUS  : 'focus',\\n  CLICK  : 'click',\\n  MANUAL : 'manual'\\n}\\n\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass Tooltip {\\n  constructor(element, config) {\\n    /**\\n     * Check for Popper dependency\\n     * Popper - https://popper.js.org\\n     */\\n    if (typeof Popper === 'undefined') {\\n      throw new TypeError('Bootstrap\\\\'s tooltips require Popper.js (https://popper.js.org/)')\\n    }\\n\\n    // private\\n    this._isEnabled     = true\\n    this._timeout       = 0\\n    this._hoverState    = ''\\n    this._activeTrigger = {}\\n    this._popper        = null\\n\\n    // Protected\\n    this.element = element\\n    this.config  = this._getConfig(config)\\n    this.tip     = null\\n\\n    this._setListeners()\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  static get Default() {\\n    return Default\\n  }\\n\\n  static get NAME() {\\n    return NAME\\n  }\\n\\n  static get DATA_KEY() {\\n    return DATA_KEY\\n  }\\n\\n  static get Event() {\\n    return Event\\n  }\\n\\n  static get EVENT_KEY() {\\n    return EVENT_KEY\\n  }\\n\\n  static get DefaultType() {\\n    return DefaultType\\n  }\\n\\n  // Public\\n\\n  enable() {\\n    this._isEnabled = true\\n  }\\n\\n  disable() {\\n    this._isEnabled = false\\n  }\\n\\n  toggleEnabled() {\\n    this._isEnabled = !this._isEnabled\\n  }\\n\\n  toggle(event) {\\n    if (!this._isEnabled) {\\n      return\\n    }\\n\\n    if (event) {\\n      const dataKey = this.constructor.DATA_KEY\\n      let context = $(event.currentTarget).data(dataKey)\\n\\n      if (!context) {\\n        context = new this.constructor(\\n          event.currentTarget,\\n          this._getDelegateConfig()\\n        )\\n        $(event.currentTarget).data(dataKey, context)\\n      }\\n\\n      context._activeTrigger.click = !context._activeTrigger.click\\n\\n      if (context._isWithActiveTrigger()) {\\n        context._enter(null, context)\\n      } else {\\n        context._leave(null, context)\\n      }\\n    } else {\\n      if ($(this.getTipElement()).hasClass(ClassName.SHOW)) {\\n        this._leave(null, this)\\n        return\\n      }\\n\\n      this._enter(null, this)\\n    }\\n  }\\n\\n  dispose() {\\n    clearTimeout(this._timeout)\\n\\n    $.removeData(this.element, this.constructor.DATA_KEY)\\n\\n    $(this.element).off(this.constructor.EVENT_KEY)\\n    $(this.element).closest('.modal').off('hide.bs.modal')\\n\\n    if (this.tip) {\\n      $(this.tip).remove()\\n    }\\n\\n    this._isEnabled     = null\\n    this._timeout       = null\\n    this._hoverState    = null\\n    this._activeTrigger = null\\n    if (this._popper !== null) {\\n      this._popper.destroy()\\n    }\\n\\n    this._popper = null\\n    this.element = null\\n    this.config  = null\\n    this.tip     = null\\n  }\\n\\n  show() {\\n    if ($(this.element).css('display') === 'none') {\\n      throw new Error('Please use show on visible elements')\\n    }\\n\\n    const showEvent = $.Event(this.constructor.Event.SHOW)\\n    if (this.isWithContent() && this._isEnabled) {\\n      $(this.element).trigger(showEvent)\\n\\n      const shadowRoot = Util.findShadowRoot(this.element)\\n      const isInTheDom = $.contains(\\n        shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement,\\n        this.element\\n      )\\n\\n      if (showEvent.isDefaultPrevented() || !isInTheDom) {\\n        return\\n      }\\n\\n      const tip   = this.getTipElement()\\n      const tipId = Util.getUID(this.constructor.NAME)\\n\\n      tip.setAttribute('id', tipId)\\n      this.element.setAttribute('aria-describedby', tipId)\\n\\n      this.setContent()\\n\\n      if (this.config.animation) {\\n        $(tip).addClass(ClassName.FADE)\\n      }\\n\\n      const placement  = typeof this.config.placement === 'function'\\n        ? this.config.placement.call(this, tip, this.element)\\n        : this.config.placement\\n\\n      const attachment = this._getAttachment(placement)\\n      this.addAttachmentClass(attachment)\\n\\n      const container = this._getContainer()\\n      $(tip).data(this.constructor.DATA_KEY, this)\\n\\n      if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) {\\n        $(tip).appendTo(container)\\n      }\\n\\n      $(this.element).trigger(this.constructor.Event.INSERTED)\\n\\n      this._popper = new Popper(this.element, tip, {\\n        placement: attachment,\\n        modifiers: {\\n          offset: this._getOffset(),\\n          flip: {\\n            behavior: this.config.fallbackPlacement\\n          },\\n          arrow: {\\n            element: Selector.ARROW\\n          },\\n          preventOverflow: {\\n            boundariesElement: this.config.boundary\\n          }\\n        },\\n        onCreate: (data) => {\\n          if (data.originalPlacement !== data.placement) {\\n            this._handlePopperPlacementChange(data)\\n          }\\n        },\\n        onUpdate: (data) => this._handlePopperPlacementChange(data)\\n      })\\n\\n      $(tip).addClass(ClassName.SHOW)\\n\\n      // If this is a touch-enabled device we add extra\\n      // empty mouseover listeners to the body's immediate children;\\n      // only needed because of broken event delegation on iOS\\n      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\\n      if ('ontouchstart' in document.documentElement) {\\n        $(document.body).children().on('mouseover', null, $.noop)\\n      }\\n\\n      const complete = () => {\\n        if (this.config.animation) {\\n          this._fixTransition()\\n        }\\n        const prevHoverState = this._hoverState\\n        this._hoverState     = null\\n\\n        $(this.element).trigger(this.constructor.Event.SHOWN)\\n\\n        if (prevHoverState === HoverState.OUT) {\\n          this._leave(null, this)\\n        }\\n      }\\n\\n      if ($(this.tip).hasClass(ClassName.FADE)) {\\n        const transitionDuration = Util.getTransitionDurationFromElement(this.tip)\\n\\n        $(this.tip)\\n          .one(Util.TRANSITION_END, complete)\\n          .emulateTransitionEnd(transitionDuration)\\n      } else {\\n        complete()\\n      }\\n    }\\n  }\\n\\n  hide(callback) {\\n    const tip       = this.getTipElement()\\n    const hideEvent = $.Event(this.constructor.Event.HIDE)\\n    const complete = () => {\\n      if (this._hoverState !== HoverState.SHOW && tip.parentNode) {\\n        tip.parentNode.removeChild(tip)\\n      }\\n\\n      this._cleanTipClass()\\n      this.element.removeAttribute('aria-describedby')\\n      $(this.element).trigger(this.constructor.Event.HIDDEN)\\n      if (this._popper !== null) {\\n        this._popper.destroy()\\n      }\\n\\n      if (callback) {\\n        callback()\\n      }\\n    }\\n\\n    $(this.element).trigger(hideEvent)\\n\\n    if (hideEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    $(tip).removeClass(ClassName.SHOW)\\n\\n    // If this is a touch-enabled device we remove the extra\\n    // empty mouseover listeners we added for iOS support\\n    if ('ontouchstart' in document.documentElement) {\\n      $(document.body).children().off('mouseover', null, $.noop)\\n    }\\n\\n    this._activeTrigger[Trigger.CLICK] = false\\n    this._activeTrigger[Trigger.FOCUS] = false\\n    this._activeTrigger[Trigger.HOVER] = false\\n\\n    if ($(this.tip).hasClass(ClassName.FADE)) {\\n      const transitionDuration = Util.getTransitionDurationFromElement(tip)\\n\\n      $(tip)\\n        .one(Util.TRANSITION_END, complete)\\n        .emulateTransitionEnd(transitionDuration)\\n    } else {\\n      complete()\\n    }\\n\\n    this._hoverState = ''\\n  }\\n\\n  update() {\\n    if (this._popper !== null) {\\n      this._popper.scheduleUpdate()\\n    }\\n  }\\n\\n  // Protected\\n\\n  isWithContent() {\\n    return Boolean(this.getTitle())\\n  }\\n\\n  addAttachmentClass(attachment) {\\n    $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)\\n  }\\n\\n  getTipElement() {\\n    this.tip = this.tip || $(this.config.template)[0]\\n    return this.tip\\n  }\\n\\n  setContent() {\\n    const tip = this.getTipElement()\\n    this.setElementContent($(tip.querySelectorAll(Selector.TOOLTIP_INNER)), this.getTitle())\\n    $(tip).removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)\\n  }\\n\\n  setElementContent($element, content) {\\n    if (typeof content === 'object' && (content.nodeType || content.jquery)) {\\n      // Content is a DOM node or a jQuery\\n      if (this.config.html) {\\n        if (!$(content).parent().is($element)) {\\n          $element.empty().append(content)\\n        }\\n      } else {\\n        $element.text($(content).text())\\n      }\\n\\n      return\\n    }\\n\\n    if (this.config.html) {\\n      if (this.config.sanitize) {\\n        content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn)\\n      }\\n\\n      $element.html(content)\\n    } else {\\n      $element.text(content)\\n    }\\n  }\\n\\n  getTitle() {\\n    let title = this.element.getAttribute('data-original-title')\\n\\n    if (!title) {\\n      title = typeof this.config.title === 'function'\\n        ? this.config.title.call(this.element)\\n        : this.config.title\\n    }\\n\\n    return title\\n  }\\n\\n  // Private\\n\\n  _getOffset() {\\n    const offset = {}\\n\\n    if (typeof this.config.offset === 'function') {\\n      offset.fn = (data) => {\\n        data.offsets = {\\n          ...data.offsets,\\n          ...this.config.offset(data.offsets, this.element) || {}\\n        }\\n\\n        return data\\n      }\\n    } else {\\n      offset.offset = this.config.offset\\n    }\\n\\n    return offset\\n  }\\n\\n  _getContainer() {\\n    if (this.config.container === false) {\\n      return document.body\\n    }\\n\\n    if (Util.isElement(this.config.container)) {\\n      return $(this.config.container)\\n    }\\n\\n    return $(document).find(this.config.container)\\n  }\\n\\n  _getAttachment(placement) {\\n    return AttachmentMap[placement.toUpperCase()]\\n  }\\n\\n  _setListeners() {\\n    const triggers = this.config.trigger.split(' ')\\n\\n    triggers.forEach((trigger) => {\\n      if (trigger === 'click') {\\n        $(this.element).on(\\n          this.constructor.Event.CLICK,\\n          this.config.selector,\\n          (event) => this.toggle(event)\\n        )\\n      } else if (trigger !== Trigger.MANUAL) {\\n        const eventIn = trigger === Trigger.HOVER\\n          ? this.constructor.Event.MOUSEENTER\\n          : this.constructor.Event.FOCUSIN\\n        const eventOut = trigger === Trigger.HOVER\\n          ? this.constructor.Event.MOUSELEAVE\\n          : this.constructor.Event.FOCUSOUT\\n\\n        $(this.element)\\n          .on(\\n            eventIn,\\n            this.config.selector,\\n            (event) => this._enter(event)\\n          )\\n          .on(\\n            eventOut,\\n            this.config.selector,\\n            (event) => this._leave(event)\\n          )\\n      }\\n    })\\n\\n    $(this.element).closest('.modal').on(\\n      'hide.bs.modal',\\n      () => {\\n        if (this.element) {\\n          this.hide()\\n        }\\n      }\\n    )\\n\\n    if (this.config.selector) {\\n      this.config = {\\n        ...this.config,\\n        trigger: 'manual',\\n        selector: ''\\n      }\\n    } else {\\n      this._fixTitle()\\n    }\\n  }\\n\\n  _fixTitle() {\\n    const titleType = typeof this.element.getAttribute('data-original-title')\\n\\n    if (this.element.getAttribute('title') || titleType !== 'string') {\\n      this.element.setAttribute(\\n        'data-original-title',\\n        this.element.getAttribute('title') || ''\\n      )\\n\\n      this.element.setAttribute('title', '')\\n    }\\n  }\\n\\n  _enter(event, context) {\\n    const dataKey = this.constructor.DATA_KEY\\n    context = context || $(event.currentTarget).data(dataKey)\\n\\n    if (!context) {\\n      context = new this.constructor(\\n        event.currentTarget,\\n        this._getDelegateConfig()\\n      )\\n      $(event.currentTarget).data(dataKey, context)\\n    }\\n\\n    if (event) {\\n      context._activeTrigger[\\n        event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER\\n      ] = true\\n    }\\n\\n    if ($(context.getTipElement()).hasClass(ClassName.SHOW) || context._hoverState === HoverState.SHOW) {\\n      context._hoverState = HoverState.SHOW\\n      return\\n    }\\n\\n    clearTimeout(context._timeout)\\n\\n    context._hoverState = HoverState.SHOW\\n\\n    if (!context.config.delay || !context.config.delay.show) {\\n      context.show()\\n      return\\n    }\\n\\n    context._timeout = setTimeout(() => {\\n      if (context._hoverState === HoverState.SHOW) {\\n        context.show()\\n      }\\n    }, context.config.delay.show)\\n  }\\n\\n  _leave(event, context) {\\n    const dataKey = this.constructor.DATA_KEY\\n    context = context || $(event.currentTarget).data(dataKey)\\n\\n    if (!context) {\\n      context = new this.constructor(\\n        event.currentTarget,\\n        this._getDelegateConfig()\\n      )\\n      $(event.currentTarget).data(dataKey, context)\\n    }\\n\\n    if (event) {\\n      context._activeTrigger[\\n        event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER\\n      ] = false\\n    }\\n\\n    if (context._isWithActiveTrigger()) {\\n      return\\n    }\\n\\n    clearTimeout(context._timeout)\\n\\n    context._hoverState = HoverState.OUT\\n\\n    if (!context.config.delay || !context.config.delay.hide) {\\n      context.hide()\\n      return\\n    }\\n\\n    context._timeout = setTimeout(() => {\\n      if (context._hoverState === HoverState.OUT) {\\n        context.hide()\\n      }\\n    }, context.config.delay.hide)\\n  }\\n\\n  _isWithActiveTrigger() {\\n    for (const trigger in this._activeTrigger) {\\n      if (this._activeTrigger[trigger]) {\\n        return true\\n      }\\n    }\\n\\n    return false\\n  }\\n\\n  _getConfig(config) {\\n    const dataAttributes = $(this.element).data()\\n\\n    Object.keys(dataAttributes)\\n      .forEach((dataAttr) => {\\n        if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {\\n          delete dataAttributes[dataAttr]\\n        }\\n      })\\n\\n    config = {\\n      ...this.constructor.Default,\\n      ...dataAttributes,\\n      ...typeof config === 'object' && config ? config : {}\\n    }\\n\\n    if (typeof config.delay === 'number') {\\n      config.delay = {\\n        show: config.delay,\\n        hide: config.delay\\n      }\\n    }\\n\\n    if (typeof config.title === 'number') {\\n      config.title = config.title.toString()\\n    }\\n\\n    if (typeof config.content === 'number') {\\n      config.content = config.content.toString()\\n    }\\n\\n    Util.typeCheckConfig(\\n      NAME,\\n      config,\\n      this.constructor.DefaultType\\n    )\\n\\n    if (config.sanitize) {\\n      config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn)\\n    }\\n\\n    return config\\n  }\\n\\n  _getDelegateConfig() {\\n    const config = {}\\n\\n    if (this.config) {\\n      for (const key in this.config) {\\n        if (this.constructor.Default[key] !== this.config[key]) {\\n          config[key] = this.config[key]\\n        }\\n      }\\n    }\\n\\n    return config\\n  }\\n\\n  _cleanTipClass() {\\n    const $tip = $(this.getTipElement())\\n    const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)\\n    if (tabClass !== null && tabClass.length) {\\n      $tip.removeClass(tabClass.join(''))\\n    }\\n  }\\n\\n  _handlePopperPlacementChange(popperData) {\\n    const popperInstance = popperData.instance\\n    this.tip = popperInstance.popper\\n    this._cleanTipClass()\\n    this.addAttachmentClass(this._getAttachment(popperData.placement))\\n  }\\n\\n  _fixTransition() {\\n    const tip = this.getTipElement()\\n    const initConfigAnimation = this.config.animation\\n\\n    if (tip.getAttribute('x-placement') !== null) {\\n      return\\n    }\\n\\n    $(tip).removeClass(ClassName.FADE)\\n    this.config.animation = false\\n    this.hide()\\n    this.show()\\n    this.config.animation = initConfigAnimation\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      let data = $(this).data(DATA_KEY)\\n      const _config = typeof config === 'object' && config\\n\\n      if (!data && /dispose|hide/.test(config)) {\\n        return\\n      }\\n\\n      if (!data) {\\n        data = new Tooltip(this, _config)\\n        $(this).data(DATA_KEY, data)\\n      }\\n\\n      if (typeof config === 'string') {\\n        if (typeof data[config] === 'undefined') {\\n          throw new TypeError(`No method named \\\"${config}\\\"`)\\n        }\\n        data[config]()\\n      }\\n    })\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME] = Tooltip._jQueryInterface\\n$.fn[NAME].Constructor = Tooltip\\n$.fn[NAME].noConflict = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Tooltip._jQueryInterface\\n}\\n\\nexport default Tooltip\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): popover.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\nimport Tooltip from './tooltip'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME                = 'popover'\\nconst VERSION             = '4.3.1'\\nconst DATA_KEY            = 'bs.popover'\\nconst EVENT_KEY           = `.${DATA_KEY}`\\nconst JQUERY_NO_CONFLICT  = $.fn[NAME]\\nconst CLASS_PREFIX        = 'bs-popover'\\nconst BSCLS_PREFIX_REGEX  = new RegExp(`(^|\\\\\\\\s)${CLASS_PREFIX}\\\\\\\\S+`, 'g')\\n\\nconst Default = {\\n  ...Tooltip.Default,\\n  placement : 'right',\\n  trigger   : 'click',\\n  content   : '',\\n  template  : '<div class=\\\"popover\\\" role=\\\"tooltip\\\">' +\\n              '<div class=\\\"arrow\\\"></div>' +\\n              '<h3 class=\\\"popover-header\\\"></h3>' +\\n              '<div class=\\\"popover-body\\\"></div></div>'\\n}\\n\\nconst DefaultType = {\\n  ...Tooltip.DefaultType,\\n  content : '(string|element|function)'\\n}\\n\\nconst ClassName = {\\n  FADE : 'fade',\\n  SHOW : 'show'\\n}\\n\\nconst Selector = {\\n  TITLE   : '.popover-header',\\n  CONTENT : '.popover-body'\\n}\\n\\nconst Event = {\\n  HIDE       : `hide${EVENT_KEY}`,\\n  HIDDEN     : `hidden${EVENT_KEY}`,\\n  SHOW       : `show${EVENT_KEY}`,\\n  SHOWN      : `shown${EVENT_KEY}`,\\n  INSERTED   : `inserted${EVENT_KEY}`,\\n  CLICK      : `click${EVENT_KEY}`,\\n  FOCUSIN    : `focusin${EVENT_KEY}`,\\n  FOCUSOUT   : `focusout${EVENT_KEY}`,\\n  MOUSEENTER : `mouseenter${EVENT_KEY}`,\\n  MOUSELEAVE : `mouseleave${EVENT_KEY}`\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass Popover extends Tooltip {\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  static get Default() {\\n    return Default\\n  }\\n\\n  static get NAME() {\\n    return NAME\\n  }\\n\\n  static get DATA_KEY() {\\n    return DATA_KEY\\n  }\\n\\n  static get Event() {\\n    return Event\\n  }\\n\\n  static get EVENT_KEY() {\\n    return EVENT_KEY\\n  }\\n\\n  static get DefaultType() {\\n    return DefaultType\\n  }\\n\\n  // Overrides\\n\\n  isWithContent() {\\n    return this.getTitle() || this._getContent()\\n  }\\n\\n  addAttachmentClass(attachment) {\\n    $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)\\n  }\\n\\n  getTipElement() {\\n    this.tip = this.tip || $(this.config.template)[0]\\n    return this.tip\\n  }\\n\\n  setContent() {\\n    const $tip = $(this.getTipElement())\\n\\n    // We use append for html objects to maintain js events\\n    this.setElementContent($tip.find(Selector.TITLE), this.getTitle())\\n    let content = this._getContent()\\n    if (typeof content === 'function') {\\n      content = content.call(this.element)\\n    }\\n    this.setElementContent($tip.find(Selector.CONTENT), content)\\n\\n    $tip.removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)\\n  }\\n\\n  // Private\\n\\n  _getContent() {\\n    return this.element.getAttribute('data-content') ||\\n      this.config.content\\n  }\\n\\n  _cleanTipClass() {\\n    const $tip = $(this.getTipElement())\\n    const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)\\n    if (tabClass !== null && tabClass.length > 0) {\\n      $tip.removeClass(tabClass.join(''))\\n    }\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      let data = $(this).data(DATA_KEY)\\n      const _config = typeof config === 'object' ? config : null\\n\\n      if (!data && /dispose|hide/.test(config)) {\\n        return\\n      }\\n\\n      if (!data) {\\n        data = new Popover(this, _config)\\n        $(this).data(DATA_KEY, data)\\n      }\\n\\n      if (typeof config === 'string') {\\n        if (typeof data[config] === 'undefined') {\\n          throw new TypeError(`No method named \\\"${config}\\\"`)\\n        }\\n        data[config]()\\n      }\\n    })\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME] = Popover._jQueryInterface\\n$.fn[NAME].Constructor = Popover\\n$.fn[NAME].noConflict = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Popover._jQueryInterface\\n}\\n\\nexport default Popover\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): scrollspy.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\nimport Util from './util'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME               = 'scrollspy'\\nconst VERSION            = '4.3.1'\\nconst DATA_KEY           = 'bs.scrollspy'\\nconst EVENT_KEY          = `.${DATA_KEY}`\\nconst DATA_API_KEY       = '.data-api'\\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\\n\\nconst Default = {\\n  offset : 10,\\n  method : 'auto',\\n  target : ''\\n}\\n\\nconst DefaultType = {\\n  offset : 'number',\\n  method : 'string',\\n  target : '(string|element)'\\n}\\n\\nconst Event = {\\n  ACTIVATE      : `activate${EVENT_KEY}`,\\n  SCROLL        : `scroll${EVENT_KEY}`,\\n  LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`\\n}\\n\\nconst ClassName = {\\n  DROPDOWN_ITEM : 'dropdown-item',\\n  DROPDOWN_MENU : 'dropdown-menu',\\n  ACTIVE        : 'active'\\n}\\n\\nconst Selector = {\\n  DATA_SPY        : '[data-spy=\\\"scroll\\\"]',\\n  ACTIVE          : '.active',\\n  NAV_LIST_GROUP  : '.nav, .list-group',\\n  NAV_LINKS       : '.nav-link',\\n  NAV_ITEMS       : '.nav-item',\\n  LIST_ITEMS      : '.list-group-item',\\n  DROPDOWN        : '.dropdown',\\n  DROPDOWN_ITEMS  : '.dropdown-item',\\n  DROPDOWN_TOGGLE : '.dropdown-toggle'\\n}\\n\\nconst OffsetMethod = {\\n  OFFSET   : 'offset',\\n  POSITION : 'position'\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass ScrollSpy {\\n  constructor(element, config) {\\n    this._element       = element\\n    this._scrollElement = element.tagName === 'BODY' ? window : element\\n    this._config        = this._getConfig(config)\\n    this._selector      = `${this._config.target} ${Selector.NAV_LINKS},` +\\n                          `${this._config.target} ${Selector.LIST_ITEMS},` +\\n                          `${this._config.target} ${Selector.DROPDOWN_ITEMS}`\\n    this._offsets       = []\\n    this._targets       = []\\n    this._activeTarget  = null\\n    this._scrollHeight  = 0\\n\\n    $(this._scrollElement).on(Event.SCROLL, (event) => this._process(event))\\n\\n    this.refresh()\\n    this._process()\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  static get Default() {\\n    return Default\\n  }\\n\\n  // Public\\n\\n  refresh() {\\n    const autoMethod = this._scrollElement === this._scrollElement.window\\n      ? OffsetMethod.OFFSET : OffsetMethod.POSITION\\n\\n    const offsetMethod = this._config.method === 'auto'\\n      ? autoMethod : this._config.method\\n\\n    const offsetBase = offsetMethod === OffsetMethod.POSITION\\n      ? this._getScrollTop() : 0\\n\\n    this._offsets = []\\n    this._targets = []\\n\\n    this._scrollHeight = this._getScrollHeight()\\n\\n    const targets = [].slice.call(document.querySelectorAll(this._selector))\\n\\n    targets\\n      .map((element) => {\\n        let target\\n        const targetSelector = Util.getSelectorFromElement(element)\\n\\n        if (targetSelector) {\\n          target = document.querySelector(targetSelector)\\n        }\\n\\n        if (target) {\\n          const targetBCR = target.getBoundingClientRect()\\n          if (targetBCR.width || targetBCR.height) {\\n            // TODO (fat): remove sketch reliance on jQuery position/offset\\n            return [\\n              $(target)[offsetMethod]().top + offsetBase,\\n              targetSelector\\n            ]\\n          }\\n        }\\n        return null\\n      })\\n      .filter((item) => item)\\n      .sort((a, b) => a[0] - b[0])\\n      .forEach((item) => {\\n        this._offsets.push(item[0])\\n        this._targets.push(item[1])\\n      })\\n  }\\n\\n  dispose() {\\n    $.removeData(this._element, DATA_KEY)\\n    $(this._scrollElement).off(EVENT_KEY)\\n\\n    this._element       = null\\n    this._scrollElement = null\\n    this._config        = null\\n    this._selector      = null\\n    this._offsets       = null\\n    this._targets       = null\\n    this._activeTarget  = null\\n    this._scrollHeight  = null\\n  }\\n\\n  // Private\\n\\n  _getConfig(config) {\\n    config = {\\n      ...Default,\\n      ...typeof config === 'object' && config ? config : {}\\n    }\\n\\n    if (typeof config.target !== 'string') {\\n      let id = $(config.target).attr('id')\\n      if (!id) {\\n        id = Util.getUID(NAME)\\n        $(config.target).attr('id', id)\\n      }\\n      config.target = `#${id}`\\n    }\\n\\n    Util.typeCheckConfig(NAME, config, DefaultType)\\n\\n    return config\\n  }\\n\\n  _getScrollTop() {\\n    return this._scrollElement === window\\n      ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop\\n  }\\n\\n  _getScrollHeight() {\\n    return this._scrollElement.scrollHeight || Math.max(\\n      document.body.scrollHeight,\\n      document.documentElement.scrollHeight\\n    )\\n  }\\n\\n  _getOffsetHeight() {\\n    return this._scrollElement === window\\n      ? window.innerHeight : this._scrollElement.getBoundingClientRect().height\\n  }\\n\\n  _process() {\\n    const scrollTop    = this._getScrollTop() + this._config.offset\\n    const scrollHeight = this._getScrollHeight()\\n    const maxScroll    = this._config.offset +\\n      scrollHeight -\\n      this._getOffsetHeight()\\n\\n    if (this._scrollHeight !== scrollHeight) {\\n      this.refresh()\\n    }\\n\\n    if (scrollTop >= maxScroll) {\\n      const target = this._targets[this._targets.length - 1]\\n\\n      if (this._activeTarget !== target) {\\n        this._activate(target)\\n      }\\n      return\\n    }\\n\\n    if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\\n      this._activeTarget = null\\n      this._clear()\\n      return\\n    }\\n\\n    const offsetLength = this._offsets.length\\n    for (let i = offsetLength; i--;) {\\n      const isActiveTarget = this._activeTarget !== this._targets[i] &&\\n          scrollTop >= this._offsets[i] &&\\n          (typeof this._offsets[i + 1] === 'undefined' ||\\n              scrollTop < this._offsets[i + 1])\\n\\n      if (isActiveTarget) {\\n        this._activate(this._targets[i])\\n      }\\n    }\\n  }\\n\\n  _activate(target) {\\n    this._activeTarget = target\\n\\n    this._clear()\\n\\n    const queries = this._selector\\n      .split(',')\\n      .map((selector) => `${selector}[data-target=\\\"${target}\\\"],${selector}[href=\\\"${target}\\\"]`)\\n\\n    const $link = $([].slice.call(document.querySelectorAll(queries.join(','))))\\n\\n    if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {\\n      $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE)\\n      $link.addClass(ClassName.ACTIVE)\\n    } else {\\n      // Set triggered link as active\\n      $link.addClass(ClassName.ACTIVE)\\n      // Set triggered links parents as active\\n      // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\\n      $link.parents(Selector.NAV_LIST_GROUP).prev(`${Selector.NAV_LINKS}, ${Selector.LIST_ITEMS}`).addClass(ClassName.ACTIVE)\\n      // Handle special case when .nav-link is inside .nav-item\\n      $link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_ITEMS).children(Selector.NAV_LINKS).addClass(ClassName.ACTIVE)\\n    }\\n\\n    $(this._scrollElement).trigger(Event.ACTIVATE, {\\n      relatedTarget: target\\n    })\\n  }\\n\\n  _clear() {\\n    [].slice.call(document.querySelectorAll(this._selector))\\n      .filter((node) => node.classList.contains(ClassName.ACTIVE))\\n      .forEach((node) => node.classList.remove(ClassName.ACTIVE))\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      let data = $(this).data(DATA_KEY)\\n      const _config = typeof config === 'object' && config\\n\\n      if (!data) {\\n        data = new ScrollSpy(this, _config)\\n        $(this).data(DATA_KEY, data)\\n      }\\n\\n      if (typeof config === 'string') {\\n        if (typeof data[config] === 'undefined') {\\n          throw new TypeError(`No method named \\\"${config}\\\"`)\\n        }\\n        data[config]()\\n      }\\n    })\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Data Api implementation\\n * ------------------------------------------------------------------------\\n */\\n\\n$(window).on(Event.LOAD_DATA_API, () => {\\n  const scrollSpys = [].slice.call(document.querySelectorAll(Selector.DATA_SPY))\\n  const scrollSpysLength = scrollSpys.length\\n\\n  for (let i = scrollSpysLength; i--;) {\\n    const $spy = $(scrollSpys[i])\\n    ScrollSpy._jQueryInterface.call($spy, $spy.data())\\n  }\\n})\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME] = ScrollSpy._jQueryInterface\\n$.fn[NAME].Constructor = ScrollSpy\\n$.fn[NAME].noConflict = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return ScrollSpy._jQueryInterface\\n}\\n\\nexport default ScrollSpy\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): tab.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\nimport Util from './util'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME               = 'tab'\\nconst VERSION            = '4.3.1'\\nconst DATA_KEY           = 'bs.tab'\\nconst EVENT_KEY          = `.${DATA_KEY}`\\nconst DATA_API_KEY       = '.data-api'\\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\\n\\nconst Event = {\\n  HIDE           : `hide${EVENT_KEY}`,\\n  HIDDEN         : `hidden${EVENT_KEY}`,\\n  SHOW           : `show${EVENT_KEY}`,\\n  SHOWN          : `shown${EVENT_KEY}`,\\n  CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\\n}\\n\\nconst ClassName = {\\n  DROPDOWN_MENU : 'dropdown-menu',\\n  ACTIVE        : 'active',\\n  DISABLED      : 'disabled',\\n  FADE          : 'fade',\\n  SHOW          : 'show'\\n}\\n\\nconst Selector = {\\n  DROPDOWN              : '.dropdown',\\n  NAV_LIST_GROUP        : '.nav, .list-group',\\n  ACTIVE                : '.active',\\n  ACTIVE_UL             : '> li > .active',\\n  DATA_TOGGLE           : '[data-toggle=\\\"tab\\\"], [data-toggle=\\\"pill\\\"], [data-toggle=\\\"list\\\"]',\\n  DROPDOWN_TOGGLE       : '.dropdown-toggle',\\n  DROPDOWN_ACTIVE_CHILD : '> .dropdown-menu .active'\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass Tab {\\n  constructor(element) {\\n    this._element = element\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  // Public\\n\\n  show() {\\n    if (this._element.parentNode &&\\n        this._element.parentNode.nodeType === Node.ELEMENT_NODE &&\\n        $(this._element).hasClass(ClassName.ACTIVE) ||\\n        $(this._element).hasClass(ClassName.DISABLED)) {\\n      return\\n    }\\n\\n    let target\\n    let previous\\n    const listElement = $(this._element).closest(Selector.NAV_LIST_GROUP)[0]\\n    const selector = Util.getSelectorFromElement(this._element)\\n\\n    if (listElement) {\\n      const itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? Selector.ACTIVE_UL : Selector.ACTIVE\\n      previous = $.makeArray($(listElement).find(itemSelector))\\n      previous = previous[previous.length - 1]\\n    }\\n\\n    const hideEvent = $.Event(Event.HIDE, {\\n      relatedTarget: this._element\\n    })\\n\\n    const showEvent = $.Event(Event.SHOW, {\\n      relatedTarget: previous\\n    })\\n\\n    if (previous) {\\n      $(previous).trigger(hideEvent)\\n    }\\n\\n    $(this._element).trigger(showEvent)\\n\\n    if (showEvent.isDefaultPrevented() ||\\n        hideEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    if (selector) {\\n      target = document.querySelector(selector)\\n    }\\n\\n    this._activate(\\n      this._element,\\n      listElement\\n    )\\n\\n    const complete = () => {\\n      const hiddenEvent = $.Event(Event.HIDDEN, {\\n        relatedTarget: this._element\\n      })\\n\\n      const shownEvent = $.Event(Event.SHOWN, {\\n        relatedTarget: previous\\n      })\\n\\n      $(previous).trigger(hiddenEvent)\\n      $(this._element).trigger(shownEvent)\\n    }\\n\\n    if (target) {\\n      this._activate(target, target.parentNode, complete)\\n    } else {\\n      complete()\\n    }\\n  }\\n\\n  dispose() {\\n    $.removeData(this._element, DATA_KEY)\\n    this._element = null\\n  }\\n\\n  // Private\\n\\n  _activate(element, container, callback) {\\n    const activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL')\\n      ? $(container).find(Selector.ACTIVE_UL)\\n      : $(container).children(Selector.ACTIVE)\\n\\n    const active = activeElements[0]\\n    const isTransitioning = callback && (active && $(active).hasClass(ClassName.FADE))\\n    const complete = () => this._transitionComplete(\\n      element,\\n      active,\\n      callback\\n    )\\n\\n    if (active && isTransitioning) {\\n      const transitionDuration = Util.getTransitionDurationFromElement(active)\\n\\n      $(active)\\n        .removeClass(ClassName.SHOW)\\n        .one(Util.TRANSITION_END, complete)\\n        .emulateTransitionEnd(transitionDuration)\\n    } else {\\n      complete()\\n    }\\n  }\\n\\n  _transitionComplete(element, active, callback) {\\n    if (active) {\\n      $(active).removeClass(ClassName.ACTIVE)\\n\\n      const dropdownChild = $(active.parentNode).find(\\n        Selector.DROPDOWN_ACTIVE_CHILD\\n      )[0]\\n\\n      if (dropdownChild) {\\n        $(dropdownChild).removeClass(ClassName.ACTIVE)\\n      }\\n\\n      if (active.getAttribute('role') === 'tab') {\\n        active.setAttribute('aria-selected', false)\\n      }\\n    }\\n\\n    $(element).addClass(ClassName.ACTIVE)\\n    if (element.getAttribute('role') === 'tab') {\\n      element.setAttribute('aria-selected', true)\\n    }\\n\\n    Util.reflow(element)\\n\\n    if (element.classList.contains(ClassName.FADE)) {\\n      element.classList.add(ClassName.SHOW)\\n    }\\n\\n    if (element.parentNode && $(element.parentNode).hasClass(ClassName.DROPDOWN_MENU)) {\\n      const dropdownElement = $(element).closest(Selector.DROPDOWN)[0]\\n\\n      if (dropdownElement) {\\n        const dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(Selector.DROPDOWN_TOGGLE))\\n\\n        $(dropdownToggleList).addClass(ClassName.ACTIVE)\\n      }\\n\\n      element.setAttribute('aria-expanded', true)\\n    }\\n\\n    if (callback) {\\n      callback()\\n    }\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      const $this = $(this)\\n      let data = $this.data(DATA_KEY)\\n\\n      if (!data) {\\n        data = new Tab(this)\\n        $this.data(DATA_KEY, data)\\n      }\\n\\n      if (typeof config === 'string') {\\n        if (typeof data[config] === 'undefined') {\\n          throw new TypeError(`No method named \\\"${config}\\\"`)\\n        }\\n        data[config]()\\n      }\\n    })\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Data Api implementation\\n * ------------------------------------------------------------------------\\n */\\n\\n$(document)\\n  .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\\n    event.preventDefault()\\n    Tab._jQueryInterface.call($(this), 'show')\\n  })\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME] = Tab._jQueryInterface\\n$.fn[NAME].Constructor = Tab\\n$.fn[NAME].noConflict = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Tab._jQueryInterface\\n}\\n\\nexport default Tab\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): toast.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\nimport Util from './util'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME               = 'toast'\\nconst VERSION            = '4.3.1'\\nconst DATA_KEY           = 'bs.toast'\\nconst EVENT_KEY          = `.${DATA_KEY}`\\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\\n\\nconst Event = {\\n  CLICK_DISMISS : `click.dismiss${EVENT_KEY}`,\\n  HIDE          : `hide${EVENT_KEY}`,\\n  HIDDEN        : `hidden${EVENT_KEY}`,\\n  SHOW          : `show${EVENT_KEY}`,\\n  SHOWN         : `shown${EVENT_KEY}`\\n}\\n\\nconst ClassName = {\\n  FADE    : 'fade',\\n  HIDE    : 'hide',\\n  SHOW    : 'show',\\n  SHOWING : 'showing'\\n}\\n\\nconst DefaultType = {\\n  animation : 'boolean',\\n  autohide  : 'boolean',\\n  delay     : 'number'\\n}\\n\\nconst Default = {\\n  animation : true,\\n  autohide  : true,\\n  delay     : 500\\n}\\n\\nconst Selector = {\\n  DATA_DISMISS : '[data-dismiss=\\\"toast\\\"]'\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass Toast {\\n  constructor(element, config) {\\n    this._element = element\\n    this._config  = this._getConfig(config)\\n    this._timeout = null\\n    this._setListeners()\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  static get DefaultType() {\\n    return DefaultType\\n  }\\n\\n  static get Default() {\\n    return Default\\n  }\\n\\n  // Public\\n\\n  show() {\\n    $(this._element).trigger(Event.SHOW)\\n\\n    if (this._config.animation) {\\n      this._element.classList.add(ClassName.FADE)\\n    }\\n\\n    const complete = () => {\\n      this._element.classList.remove(ClassName.SHOWING)\\n      this._element.classList.add(ClassName.SHOW)\\n\\n      $(this._element).trigger(Event.SHOWN)\\n\\n      if (this._config.autohide) {\\n        this.hide()\\n      }\\n    }\\n\\n    this._element.classList.remove(ClassName.HIDE)\\n    this._element.classList.add(ClassName.SHOWING)\\n    if (this._config.animation) {\\n      const transitionDuration = Util.getTransitionDurationFromElement(this._element)\\n\\n      $(this._element)\\n        .one(Util.TRANSITION_END, complete)\\n        .emulateTransitionEnd(transitionDuration)\\n    } else {\\n      complete()\\n    }\\n  }\\n\\n  hide(withoutTimeout) {\\n    if (!this._element.classList.contains(ClassName.SHOW)) {\\n      return\\n    }\\n\\n    $(this._element).trigger(Event.HIDE)\\n\\n    if (withoutTimeout) {\\n      this._close()\\n    } else {\\n      this._timeout = setTimeout(() => {\\n        this._close()\\n      }, this._config.delay)\\n    }\\n  }\\n\\n  dispose() {\\n    clearTimeout(this._timeout)\\n    this._timeout = null\\n\\n    if (this._element.classList.contains(ClassName.SHOW)) {\\n      this._element.classList.remove(ClassName.SHOW)\\n    }\\n\\n    $(this._element).off(Event.CLICK_DISMISS)\\n\\n    $.removeData(this._element, DATA_KEY)\\n    this._element = null\\n    this._config  = null\\n  }\\n\\n  // Private\\n\\n  _getConfig(config) {\\n    config = {\\n      ...Default,\\n      ...$(this._element).data(),\\n      ...typeof config === 'object' && config ? config : {}\\n    }\\n\\n    Util.typeCheckConfig(\\n      NAME,\\n      config,\\n      this.constructor.DefaultType\\n    )\\n\\n    return config\\n  }\\n\\n  _setListeners() {\\n    $(this._element).on(\\n      Event.CLICK_DISMISS,\\n      Selector.DATA_DISMISS,\\n      () => this.hide(true)\\n    )\\n  }\\n\\n  _close() {\\n    const complete = () => {\\n      this._element.classList.add(ClassName.HIDE)\\n      $(this._element).trigger(Event.HIDDEN)\\n    }\\n\\n    this._element.classList.remove(ClassName.SHOW)\\n    if (this._config.animation) {\\n      const transitionDuration = Util.getTransitionDurationFromElement(this._element)\\n\\n      $(this._element)\\n        .one(Util.TRANSITION_END, complete)\\n        .emulateTransitionEnd(transitionDuration)\\n    } else {\\n      complete()\\n    }\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      const $element = $(this)\\n      let data       = $element.data(DATA_KEY)\\n      const _config  = typeof config === 'object' && config\\n\\n      if (!data) {\\n        data = new Toast(this, _config)\\n        $element.data(DATA_KEY, data)\\n      }\\n\\n      if (typeof config === 'string') {\\n        if (typeof data[config] === 'undefined') {\\n          throw new TypeError(`No method named \\\"${config}\\\"`)\\n        }\\n\\n        data[config](this)\\n      }\\n    })\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME]             = Toast._jQueryInterface\\n$.fn[NAME].Constructor = Toast\\n$.fn[NAME].noConflict  = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Toast._jQueryInterface\\n}\\n\\nexport default Toast\\n\",\"import $ from 'jquery'\\nimport Alert from './alert'\\nimport Button from './button'\\nimport Carousel from './carousel'\\nimport Collapse from './collapse'\\nimport Dropdown from './dropdown'\\nimport Modal from './modal'\\nimport Popover from './popover'\\nimport Scrollspy from './scrollspy'\\nimport Tab from './tab'\\nimport Toast from './toast'\\nimport Tooltip from './tooltip'\\nimport Util from './util'\\n\\n/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): index.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\n(() => {\\n  if (typeof $ === 'undefined') {\\n    throw new TypeError('Bootstrap\\\\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\\\\'s JavaScript.')\\n  }\\n\\n  const version = $.fn.jquery.split(' ')[0].split('.')\\n  const minMajor = 1\\n  const ltMajor = 2\\n  const minMinor = 9\\n  const minPatch = 1\\n  const maxMajor = 4\\n\\n  if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {\\n    throw new Error('Bootstrap\\\\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0')\\n  }\\n})()\\n\\nexport {\\n  Util,\\n  Alert,\\n  Button,\\n  Carousel,\\n  Collapse,\\n  Dropdown,\\n  Modal,\\n  Popover,\\n  Scrollspy,\\n  Tab,\\n  Toast,\\n  Tooltip\\n}\\n\"],\"names\":[\"TRANSITION_END\",\"MAX_UID\",\"MILLISECONDS_MULTIPLIER\",\"toType\",\"obj\",\"toString\",\"call\",\"match\",\"toLowerCase\",\"getSpecialTransitionEndEvent\",\"bindType\",\"delegateType\",\"handle\",\"event\",\"$\",\"target\",\"is\",\"handleObj\",\"handler\",\"apply\",\"arguments\",\"undefined\",\"transitionEndEmulator\",\"duration\",\"called\",\"one\",\"Util\",\"setTimeout\",\"triggerTransitionEnd\",\"setTransitionEndSupport\",\"fn\",\"emulateTransitionEnd\",\"special\",\"getUID\",\"prefix\",\"Math\",\"random\",\"document\",\"getElementById\",\"getSelectorFromElement\",\"element\",\"selector\",\"getAttribute\",\"hrefAttr\",\"trim\",\"querySelector\",\"err\",\"getTransitionDurationFromElement\",\"transitionDuration\",\"css\",\"transitionDelay\",\"floatTransitionDuration\",\"parseFloat\",\"floatTransitionDelay\",\"split\",\"reflow\",\"offsetHeight\",\"trigger\",\"supportsTransitionEnd\",\"Boolean\",\"isElement\",\"nodeType\",\"typeCheckConfig\",\"componentName\",\"config\",\"configTypes\",\"property\",\"Object\",\"prototype\",\"hasOwnProperty\",\"expectedTypes\",\"value\",\"valueType\",\"RegExp\",\"test\",\"Error\",\"toUpperCase\",\"findShadowRoot\",\"documentElement\",\"attachShadow\",\"getRootNode\",\"root\",\"ShadowRoot\",\"parentNode\",\"NAME\",\"VERSION\",\"DATA_KEY\",\"EVENT_KEY\",\"DATA_API_KEY\",\"JQUERY_NO_CONFLICT\",\"Selector\",\"DISMISS\",\"Event\",\"CLOSE\",\"CLOSED\",\"CLICK_DATA_API\",\"ClassName\",\"ALERT\",\"FADE\",\"SHOW\",\"Alert\",\"_element\",\"close\",\"rootElement\",\"_getRootElement\",\"customEvent\",\"_triggerCloseEvent\",\"isDefaultPrevented\",\"_removeElement\",\"dispose\",\"removeData\",\"parent\",\"closest\",\"closeEvent\",\"removeClass\",\"hasClass\",\"_destroyElement\",\"detach\",\"remove\",\"_jQueryInterface\",\"each\",\"$element\",\"data\",\"_handleDismiss\",\"alertInstance\",\"preventDefault\",\"on\",\"Constructor\",\"noConflict\",\"ACTIVE\",\"BUTTON\",\"FOCUS\",\"DATA_TOGGLE_CARROT\",\"DATA_TOGGLE\",\"INPUT\",\"FOCUS_BLUR_DATA_API\",\"Button\",\"toggle\",\"triggerChangeEvent\",\"addAriaPressed\",\"input\",\"type\",\"checked\",\"classList\",\"contains\",\"activeElement\",\"hasAttribute\",\"focus\",\"setAttribute\",\"toggleClass\",\"button\",\"ARROW_LEFT_KEYCODE\",\"ARROW_RIGHT_KEYCODE\",\"TOUCHEVENT_COMPAT_WAIT\",\"SWIPE_THRESHOLD\",\"Default\",\"interval\",\"keyboard\",\"slide\",\"pause\",\"wrap\",\"touch\",\"DefaultType\",\"Direction\",\"NEXT\",\"PREV\",\"LEFT\",\"RIGHT\",\"SLIDE\",\"SLID\",\"KEYDOWN\",\"MOUSEENTER\",\"MOUSELEAVE\",\"TOUCHSTART\",\"TOUCHMOVE\",\"TOUCHEND\",\"POINTERDOWN\",\"POINTERUP\",\"DRAG_START\",\"LOAD_DATA_API\",\"CAROUSEL\",\"ITEM\",\"POINTER_EVENT\",\"ACTIVE_ITEM\",\"ITEM_IMG\",\"NEXT_PREV\",\"INDICATORS\",\"DATA_SLIDE\",\"DATA_RIDE\",\"PointerType\",\"TOUCH\",\"PEN\",\"Carousel\",\"_items\",\"_interval\",\"_activeElement\",\"_isPaused\",\"_isSliding\",\"touchTimeout\",\"touchStartX\",\"touchDeltaX\",\"_config\",\"_getConfig\",\"_indicatorsElement\",\"_touchSupported\",\"navigator\",\"maxTouchPoints\",\"_pointerEvent\",\"window\",\"PointerEvent\",\"MSPointerEvent\",\"_addEventListeners\",\"next\",\"_slide\",\"nextWhenVisible\",\"hidden\",\"prev\",\"cycle\",\"clearInterval\",\"setInterval\",\"visibilityState\",\"bind\",\"to\",\"index\",\"activeIndex\",\"_getItemIndex\",\"length\",\"direction\",\"off\",\"_handleSwipe\",\"absDeltax\",\"abs\",\"_keydown\",\"_addTouchEventListeners\",\"start\",\"originalEvent\",\"pointerType\",\"clientX\",\"touches\",\"move\",\"end\",\"clearTimeout\",\"querySelectorAll\",\"e\",\"add\",\"tagName\",\"which\",\"slice\",\"indexOf\",\"_getItemByDirection\",\"isNextDirection\",\"isPrevDirection\",\"lastItemIndex\",\"isGoingToWrap\",\"delta\",\"itemIndex\",\"_triggerSlideEvent\",\"relatedTarget\",\"eventDirectionName\",\"targetIndex\",\"fromIndex\",\"slideEvent\",\"from\",\"_setActiveIndicatorElement\",\"indicators\",\"nextIndicator\",\"children\",\"addClass\",\"activeElementIndex\",\"nextElement\",\"nextElementIndex\",\"isCycling\",\"directionalClassName\",\"orderClassName\",\"slidEvent\",\"nextElementInterval\",\"parseInt\",\"defaultInterval\",\"action\",\"TypeError\",\"ride\",\"_dataApiClickHandler\",\"slideIndex\",\"carousels\",\"i\",\"len\",\"$carousel\",\"SHOWN\",\"HIDE\",\"HIDDEN\",\"COLLAPSE\",\"COLLAPSING\",\"COLLAPSED\",\"Dimension\",\"WIDTH\",\"HEIGHT\",\"ACTIVES\",\"Collapse\",\"_isTransitioning\",\"_triggerArray\",\"id\",\"toggleList\",\"elem\",\"filterElement\",\"filter\",\"foundElem\",\"_selector\",\"push\",\"_parent\",\"_getParent\",\"_addAriaAndCollapsedClass\",\"hide\",\"show\",\"actives\",\"activesData\",\"not\",\"startEvent\",\"dimension\",\"_getDimension\",\"style\",\"attr\",\"setTransitioning\",\"complete\",\"capitalizedDimension\",\"scrollSize\",\"getBoundingClientRect\",\"triggerArrayLength\",\"$elem\",\"isTransitioning\",\"hasWidth\",\"jquery\",\"_getTargetFromElement\",\"triggerArray\",\"isOpen\",\"$this\",\"currentTarget\",\"$trigger\",\"selectors\",\"$target\",\"ESCAPE_KEYCODE\",\"SPACE_KEYCODE\",\"TAB_KEYCODE\",\"ARROW_UP_KEYCODE\",\"ARROW_DOWN_KEYCODE\",\"RIGHT_MOUSE_BUTTON_WHICH\",\"REGEXP_KEYDOWN\",\"CLICK\",\"KEYDOWN_DATA_API\",\"KEYUP_DATA_API\",\"DISABLED\",\"DROPUP\",\"DROPRIGHT\",\"DROPLEFT\",\"MENURIGHT\",\"MENULEFT\",\"POSITION_STATIC\",\"FORM_CHILD\",\"MENU\",\"NAVBAR_NAV\",\"VISIBLE_ITEMS\",\"AttachmentMap\",\"TOP\",\"TOPEND\",\"BOTTOM\",\"BOTTOMEND\",\"RIGHTEND\",\"LEFTEND\",\"offset\",\"flip\",\"boundary\",\"reference\",\"display\",\"Dropdown\",\"_popper\",\"_menu\",\"_getMenuElement\",\"_inNavbar\",\"_detectNavbar\",\"disabled\",\"_getParentFromElement\",\"isActive\",\"_clearMenus\",\"showEvent\",\"Popper\",\"referenceElement\",\"_getPopperConfig\",\"body\",\"noop\",\"hideEvent\",\"destroy\",\"update\",\"scheduleUpdate\",\"stopPropagation\",\"constructor\",\"_getPlacement\",\"$parentDropdown\",\"placement\",\"_getOffset\",\"offsets\",\"popperConfig\",\"modifiers\",\"enabled\",\"preventOverflow\",\"boundariesElement\",\"applyStyle\",\"toggles\",\"context\",\"clickEvent\",\"dropdownMenu\",\"_dataApiKeydownHandler\",\"items\",\"backdrop\",\"FOCUSIN\",\"RESIZE\",\"CLICK_DISMISS\",\"KEYDOWN_DISMISS\",\"MOUSEUP_DISMISS\",\"MOUSEDOWN_DISMISS\",\"SCROLLABLE\",\"SCROLLBAR_MEASURER\",\"BACKDROP\",\"OPEN\",\"DIALOG\",\"MODAL_BODY\",\"DATA_DISMISS\",\"FIXED_CONTENT\",\"STICKY_CONTENT\",\"Modal\",\"_dialog\",\"_backdrop\",\"_isShown\",\"_isBodyOverflowing\",\"_ignoreBackdropClick\",\"_scrollbarWidth\",\"_checkScrollbar\",\"_setScrollbar\",\"_adjustDialog\",\"_setEscapeEvent\",\"_setResizeEvent\",\"_showBackdrop\",\"_showElement\",\"transition\",\"_hideModal\",\"forEach\",\"htmlElement\",\"handleUpdate\",\"Node\",\"ELEMENT_NODE\",\"appendChild\",\"removeAttribute\",\"scrollTop\",\"_enforceFocus\",\"shownEvent\",\"transitionComplete\",\"has\",\"_resetAdjustments\",\"_resetScrollbar\",\"_removeBackdrop\",\"callback\",\"animate\",\"createElement\",\"className\",\"appendTo\",\"backdropTransitionDuration\",\"callbackRemove\",\"isModalOverflowing\",\"scrollHeight\",\"clientHeight\",\"paddingLeft\",\"paddingRight\",\"rect\",\"left\",\"right\",\"innerWidth\",\"_getScrollbarWidth\",\"fixedContent\",\"stickyContent\",\"actualPadding\",\"calculatedPadding\",\"actualMargin\",\"marginRight\",\"calculatedMargin\",\"padding\",\"elements\",\"margin\",\"scrollDiv\",\"scrollbarWidth\",\"width\",\"clientWidth\",\"removeChild\",\"uriAttrs\",\"ARIA_ATTRIBUTE_PATTERN\",\"DefaultWhitelist\",\"a\",\"area\",\"b\",\"br\",\"col\",\"code\",\"div\",\"em\",\"hr\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"img\",\"li\",\"ol\",\"p\",\"pre\",\"s\",\"small\",\"span\",\"sub\",\"sup\",\"strong\",\"u\",\"ul\",\"SAFE_URL_PATTERN\",\"DATA_URL_PATTERN\",\"allowedAttribute\",\"allowedAttributeList\",\"attrName\",\"nodeName\",\"nodeValue\",\"regExp\",\"attrRegex\",\"l\",\"sanitizeHtml\",\"unsafeHtml\",\"whiteList\",\"sanitizeFn\",\"domParser\",\"DOMParser\",\"createdDocument\",\"parseFromString\",\"whitelistKeys\",\"keys\",\"el\",\"elName\",\"attributeList\",\"attributes\",\"whitelistedAttributes\",\"concat\",\"innerHTML\",\"CLASS_PREFIX\",\"BSCLS_PREFIX_REGEX\",\"DISALLOWED_ATTRIBUTES\",\"animation\",\"template\",\"title\",\"delay\",\"html\",\"container\",\"fallbackPlacement\",\"sanitize\",\"AUTO\",\"HoverState\",\"OUT\",\"INSERTED\",\"FOCUSOUT\",\"TOOLTIP\",\"TOOLTIP_INNER\",\"ARROW\",\"Trigger\",\"HOVER\",\"MANUAL\",\"Tooltip\",\"_isEnabled\",\"_timeout\",\"_hoverState\",\"_activeTrigger\",\"tip\",\"_setListeners\",\"enable\",\"disable\",\"toggleEnabled\",\"dataKey\",\"_getDelegateConfig\",\"click\",\"_isWithActiveTrigger\",\"_enter\",\"_leave\",\"getTipElement\",\"isWithContent\",\"shadowRoot\",\"isInTheDom\",\"ownerDocument\",\"tipId\",\"setContent\",\"attachment\",\"_getAttachment\",\"addAttachmentClass\",\"_getContainer\",\"behavior\",\"arrow\",\"onCreate\",\"originalPlacement\",\"_handlePopperPlacementChange\",\"onUpdate\",\"_fixTransition\",\"prevHoverState\",\"_cleanTipClass\",\"getTitle\",\"setElementContent\",\"content\",\"empty\",\"append\",\"text\",\"find\",\"triggers\",\"eventIn\",\"eventOut\",\"_fixTitle\",\"titleType\",\"dataAttributes\",\"dataAttr\",\"key\",\"$tip\",\"tabClass\",\"join\",\"popperData\",\"popperInstance\",\"instance\",\"popper\",\"initConfigAnimation\",\"TITLE\",\"CONTENT\",\"Popover\",\"_getContent\",\"method\",\"ACTIVATE\",\"SCROLL\",\"DROPDOWN_ITEM\",\"DROPDOWN_MENU\",\"DATA_SPY\",\"NAV_LIST_GROUP\",\"NAV_LINKS\",\"NAV_ITEMS\",\"LIST_ITEMS\",\"DROPDOWN\",\"DROPDOWN_ITEMS\",\"DROPDOWN_TOGGLE\",\"OffsetMethod\",\"OFFSET\",\"POSITION\",\"ScrollSpy\",\"_scrollElement\",\"_offsets\",\"_targets\",\"_activeTarget\",\"_scrollHeight\",\"_process\",\"refresh\",\"autoMethod\",\"offsetMethod\",\"offsetBase\",\"_getScrollTop\",\"_getScrollHeight\",\"targets\",\"map\",\"targetSelector\",\"targetBCR\",\"height\",\"top\",\"item\",\"sort\",\"pageYOffset\",\"max\",\"_getOffsetHeight\",\"innerHeight\",\"maxScroll\",\"_activate\",\"_clear\",\"offsetLength\",\"isActiveTarget\",\"queries\",\"$link\",\"parents\",\"node\",\"scrollSpys\",\"scrollSpysLength\",\"$spy\",\"ACTIVE_UL\",\"DROPDOWN_ACTIVE_CHILD\",\"Tab\",\"previous\",\"listElement\",\"itemSelector\",\"makeArray\",\"hiddenEvent\",\"activeElements\",\"active\",\"_transitionComplete\",\"dropdownChild\",\"dropdownElement\",\"dropdownToggleList\",\"SHOWING\",\"autohide\",\"Toast\",\"withoutTimeout\",\"_close\",\"version\",\"minMajor\",\"ltMajor\",\"minMinor\",\"minPatch\",\"maxMajor\"],\"mappings\":\"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CA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,MAAM,EAAE;EACV;EACA,IAAI,KAAK,EAAE,GAAG;EACd;EACA,IAAI,OAAO,EAAE,IAAI;EACjB;EACA,IAAI,EAAE,EAAE,MAAM;EACd;EACA;EACA;EACA,IAAI,MAAM,EAAE,CAAC;EACb,GAAG;;EAEH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,eAAe,EAAE;EACnB;EACA,IAAI,KAAK,EAAE,GAAG;EACd;EACA,IAAI,OAAO,EAAE,IAAI;EACjB;EACA,IAAI,EAAE,EAAE,eAAe;EACvB;EACA;EACA;EACA;EACA;EACA,IAAI,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC;EAChD;EACA;EACA;EACA;EACA;EACA;EACA,IAAI,OAAO,EAAE,CAAC;EACd;EACA;EACA;EACA;EACA;EACA,IAAI,iBAAiB,EAAE,cAAc;EACrC,GAAG;;EAEH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,YAAY,EAAE;EAChB;EACA,IAAI,KAAK,EAAE,GAAG;EACd;EACA,IAAI,OAAO,EAAE,IAAI;EACjB;EACA,IAAI,EAAE,EAAE,YAAY;EACpB,GAAG;;EAEH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,KAAK,EAAE;EACT;EACA,IAAI,KAAK,EAAE,GAAG;EACd;EACA,IAAI,OAAO,EAAE,IAAI;EACjB;EACA,IAAI,EAAE,EAAE,KAAK;EACb;EACA,IAAI,OAAO,EAAE,WAAW;EACxB,GAAG;;EAEH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,IAAI,EAAE;EACR;EACA,IAAI,KAAK,EAAE,GAAG;EACd;EACA,IAAI,OAAO,EAAE,IAAI;EACjB;EACA,IAAI,EAAE,EAAE,IAAI;EACZ;EACA;EACA;EACA;EACA;EACA;EACA,IAAI,QAAQ,EAAE,MAAM;EACpB;EACA;EACA;EACA;EACA,IAAI,OAAO,EAAE,CAAC;EACd;EACA;EACA;EACA;EACA;EACA;EACA,IAAI,iBAAiB,EAAE,UAAU;EACjC,GAAG;;EAEH;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,KAAK,EAAE;EACT;EACA,IAAI,KAAK,EAAE,GAAG;EACd;EACA,IAAI,OAAO,EAAE,KAAK;EAClB;EACA,IAAI,EAAE,EAAE,KAAK;EACb,GAAG;;EAEH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,IAAI,EAAE;EACR;EACA,IAAI,KAAK,EAAE,GAAG;EACd;EACA,IAAI,OAAO,EAAE,IAAI;EACjB;EACA,IAAI,EAAE,EAAE,IAAI;EACZ,GAAG;;EAEH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,YAAY,EAAE;EAChB;EACA,IAAI,KAAK,EAAE,GAAG;EACd;EACA,IAAI,OAAO,EAAE,IAAI;EACjB;EACA,IAAI,EAAE,EAAE,YAAY;EACpB;EACA;EACA;EACA;EACA;EACA,IAAI,eAAe,EAAE,IAAI;EACzB;EACA;EACA;EACA;EACA;EACA,IAAI,CAAC,EAAE,QAAQ;EACf;EACA;EACA;EACA;EACA;EACA,IAAI,CAAC,EAAE,OAAO;EACd,GAAG;;EAEH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,UAAU,EAAE;EACd;EACA,IAAI,KAAK,EAAE,GAAG;EACd;EACA,IAAI,OAAO,EAAE,IAAI;EACjB;EACA,IAAI,EAAE,EAAE,UAAU;EAClB;EACA,IAAI,MAAM,EAAE,gBAAgB;EAC5B;EACA;EACA;EACA;EACA;EACA;EACA,IAAI,eAAe,EAAE,SAAS;EAC9B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\"}"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bootstrap4/js/bootstrap.bundle.min.js",
    "content": "/*!\n  * Bootstrap v4.3.1 (https://getbootstrap.com/)\n  * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n  */\n!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?e(exports,require(\"jquery\")):\"function\"==typeof define&&define.amd?define([\"exports\",\"jquery\"],e):e((t=t||self).bootstrap={},t.jQuery)}(this,function(t,p){\"use strict\";function i(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,\"value\"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function s(t,e,n){return e&&i(t.prototype,e),n&&i(t,n),t}function l(o){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},e=Object.keys(r);\"function\"==typeof Object.getOwnPropertySymbols&&(e=e.concat(Object.getOwnPropertySymbols(r).filter(function(t){return Object.getOwnPropertyDescriptor(r,t).enumerable}))),e.forEach(function(t){var e,n,i;e=o,i=r[n=t],n in e?Object.defineProperty(e,n,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[n]=i})}return o}p=p&&p.hasOwnProperty(\"default\")?p.default:p;var e=\"transitionend\";function n(t){var e=this,n=!1;return p(this).one(m.TRANSITION_END,function(){n=!0}),setTimeout(function(){n||m.triggerTransitionEnd(e)},t),this}var m={TRANSITION_END:\"bsTransitionEnd\",getUID:function(t){for(;t+=~~(1e6*Math.random()),document.getElementById(t););return t},getSelectorFromElement:function(t){var e=t.getAttribute(\"data-target\");if(!e||\"#\"===e){var n=t.getAttribute(\"href\");e=n&&\"#\"!==n?n.trim():\"\"}try{return document.querySelector(e)?e:null}catch(t){return null}},getTransitionDurationFromElement:function(t){if(!t)return 0;var e=p(t).css(\"transition-duration\"),n=p(t).css(\"transition-delay\"),i=parseFloat(e),o=parseFloat(n);return i||o?(e=e.split(\",\")[0],n=n.split(\",\")[0],1e3*(parseFloat(e)+parseFloat(n))):0},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(t){p(t).trigger(e)},supportsTransitionEnd:function(){return Boolean(e)},isElement:function(t){return(t[0]||t).nodeType},typeCheckConfig:function(t,e,n){for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i)){var o=n[i],r=e[i],s=r&&m.isElement(r)?\"element\":(a=r,{}.toString.call(a).match(/\\s([a-z]+)/i)[1].toLowerCase());if(!new RegExp(o).test(s))throw new Error(t.toUpperCase()+': Option \"'+i+'\" provided type \"'+s+'\" but expected type \"'+o+'\".')}var a},findShadowRoot:function(t){if(!document.documentElement.attachShadow)return null;if(\"function\"!=typeof t.getRootNode)return t instanceof ShadowRoot?t:t.parentNode?m.findShadowRoot(t.parentNode):null;var e=t.getRootNode();return e instanceof ShadowRoot?e:null}};p.fn.emulateTransitionEnd=n,p.event.special[m.TRANSITION_END]={bindType:e,delegateType:e,handle:function(t){if(p(t.target).is(this))return t.handleObj.handler.apply(this,arguments)}};var o=\"alert\",r=\"bs.alert\",a=\".\"+r,c=p.fn[o],h={CLOSE:\"close\"+a,CLOSED:\"closed\"+a,CLICK_DATA_API:\"click\"+a+\".data-api\"},u=\"alert\",f=\"fade\",d=\"show\",g=function(){function i(t){this._element=t}var t=i.prototype;return t.close=function(t){var e=this._element;t&&(e=this._getRootElement(t)),this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},t.dispose=function(){p.removeData(this._element,r),this._element=null},t._getRootElement=function(t){var e=m.getSelectorFromElement(t),n=!1;return e&&(n=document.querySelector(e)),n||(n=p(t).closest(\".\"+u)[0]),n},t._triggerCloseEvent=function(t){var e=p.Event(h.CLOSE);return p(t).trigger(e),e},t._removeElement=function(e){var n=this;if(p(e).removeClass(d),p(e).hasClass(f)){var t=m.getTransitionDurationFromElement(e);p(e).one(m.TRANSITION_END,function(t){return n._destroyElement(e,t)}).emulateTransitionEnd(t)}else this._destroyElement(e)},t._destroyElement=function(t){p(t).detach().trigger(h.CLOSED).remove()},i._jQueryInterface=function(n){return this.each(function(){var t=p(this),e=t.data(r);e||(e=new i(this),t.data(r,e)),\"close\"===n&&e[n](this)})},i._handleDismiss=function(e){return function(t){t&&t.preventDefault(),e.close(this)}},s(i,null,[{key:\"VERSION\",get:function(){return\"4.3.1\"}}]),i}();p(document).on(h.CLICK_DATA_API,'[data-dismiss=\"alert\"]',g._handleDismiss(new g)),p.fn[o]=g._jQueryInterface,p.fn[o].Constructor=g,p.fn[o].noConflict=function(){return p.fn[o]=c,g._jQueryInterface};var _=\"button\",v=\"bs.button\",y=\".\"+v,E=\".data-api\",b=p.fn[_],w=\"active\",C=\"btn\",T=\"focus\",S='[data-toggle^=\"button\"]',D='[data-toggle=\"buttons\"]',I='input:not([type=\"hidden\"])',A=\".active\",O=\".btn\",N={CLICK_DATA_API:\"click\"+y+E,FOCUS_BLUR_DATA_API:\"focus\"+y+E+\" blur\"+y+E},k=function(){function n(t){this._element=t}var t=n.prototype;return t.toggle=function(){var t=!0,e=!0,n=p(this._element).closest(D)[0];if(n){var i=this._element.querySelector(I);if(i){if(\"radio\"===i.type)if(i.checked&&this._element.classList.contains(w))t=!1;else{var o=n.querySelector(A);o&&p(o).removeClass(w)}if(t){if(i.hasAttribute(\"disabled\")||n.hasAttribute(\"disabled\")||i.classList.contains(\"disabled\")||n.classList.contains(\"disabled\"))return;i.checked=!this._element.classList.contains(w),p(i).trigger(\"change\")}i.focus(),e=!1}}e&&this._element.setAttribute(\"aria-pressed\",!this._element.classList.contains(w)),t&&p(this._element).toggleClass(w)},t.dispose=function(){p.removeData(this._element,v),this._element=null},n._jQueryInterface=function(e){return this.each(function(){var t=p(this).data(v);t||(t=new n(this),p(this).data(v,t)),\"toggle\"===e&&t[e]()})},s(n,null,[{key:\"VERSION\",get:function(){return\"4.3.1\"}}]),n}();p(document).on(N.CLICK_DATA_API,S,function(t){t.preventDefault();var e=t.target;p(e).hasClass(C)||(e=p(e).closest(O)),k._jQueryInterface.call(p(e),\"toggle\")}).on(N.FOCUS_BLUR_DATA_API,S,function(t){var e=p(t.target).closest(O)[0];p(e).toggleClass(T,/^focus(in)?$/.test(t.type))}),p.fn[_]=k._jQueryInterface,p.fn[_].Constructor=k,p.fn[_].noConflict=function(){return p.fn[_]=b,k._jQueryInterface};var L=\"carousel\",x=\"bs.carousel\",P=\".\"+x,H=\".data-api\",j=p.fn[L],R={interval:5e3,keyboard:!0,slide:!1,pause:\"hover\",wrap:!0,touch:!0},F={interval:\"(number|boolean)\",keyboard:\"boolean\",slide:\"(boolean|string)\",pause:\"(string|boolean)\",wrap:\"boolean\",touch:\"boolean\"},M=\"next\",W=\"prev\",U=\"left\",B=\"right\",q={SLIDE:\"slide\"+P,SLID:\"slid\"+P,KEYDOWN:\"keydown\"+P,MOUSEENTER:\"mouseenter\"+P,MOUSELEAVE:\"mouseleave\"+P,TOUCHSTART:\"touchstart\"+P,TOUCHMOVE:\"touchmove\"+P,TOUCHEND:\"touchend\"+P,POINTERDOWN:\"pointerdown\"+P,POINTERUP:\"pointerup\"+P,DRAG_START:\"dragstart\"+P,LOAD_DATA_API:\"load\"+P+H,CLICK_DATA_API:\"click\"+P+H},K=\"carousel\",Q=\"active\",V=\"slide\",Y=\"carousel-item-right\",z=\"carousel-item-left\",X=\"carousel-item-next\",G=\"carousel-item-prev\",$=\"pointer-event\",J=\".active\",Z=\".active.carousel-item\",tt=\".carousel-item\",et=\".carousel-item img\",nt=\".carousel-item-next, .carousel-item-prev\",it=\".carousel-indicators\",ot=\"[data-slide], [data-slide-to]\",rt='[data-ride=\"carousel\"]',st={TOUCH:\"touch\",PEN:\"pen\"},at=function(){function r(t,e){this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this.touchStartX=0,this.touchDeltaX=0,this._config=this._getConfig(e),this._element=t,this._indicatorsElement=this._element.querySelector(it),this._touchSupported=\"ontouchstart\"in document.documentElement||0<navigator.maxTouchPoints,this._pointerEvent=Boolean(window.PointerEvent||window.MSPointerEvent),this._addEventListeners()}var t=r.prototype;return t.next=function(){this._isSliding||this._slide(M)},t.nextWhenVisible=function(){!document.hidden&&p(this._element).is(\":visible\")&&\"hidden\"!==p(this._element).css(\"visibility\")&&this.next()},t.prev=function(){this._isSliding||this._slide(W)},t.pause=function(t){t||(this._isPaused=!0),this._element.querySelector(nt)&&(m.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},t.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},t.to=function(t){var e=this;this._activeElement=this._element.querySelector(Z);var n=this._getItemIndex(this._activeElement);if(!(t>this._items.length-1||t<0))if(this._isSliding)p(this._element).one(q.SLID,function(){return e.to(t)});else{if(n===t)return this.pause(),void this.cycle();var i=n<t?M:W;this._slide(i,this._items[t])}},t.dispose=function(){p(this._element).off(P),p.removeData(this._element,x),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},t._getConfig=function(t){return t=l({},R,t),m.typeCheckConfig(L,t,F),t},t._handleSwipe=function(){var t=Math.abs(this.touchDeltaX);if(!(t<=40)){var e=t/this.touchDeltaX;0<e&&this.prev(),e<0&&this.next()}},t._addEventListeners=function(){var e=this;this._config.keyboard&&p(this._element).on(q.KEYDOWN,function(t){return e._keydown(t)}),\"hover\"===this._config.pause&&p(this._element).on(q.MOUSEENTER,function(t){return e.pause(t)}).on(q.MOUSELEAVE,function(t){return e.cycle(t)}),this._config.touch&&this._addTouchEventListeners()},t._addTouchEventListeners=function(){var n=this;if(this._touchSupported){var e=function(t){n._pointerEvent&&st[t.originalEvent.pointerType.toUpperCase()]?n.touchStartX=t.originalEvent.clientX:n._pointerEvent||(n.touchStartX=t.originalEvent.touches[0].clientX)},i=function(t){n._pointerEvent&&st[t.originalEvent.pointerType.toUpperCase()]&&(n.touchDeltaX=t.originalEvent.clientX-n.touchStartX),n._handleSwipe(),\"hover\"===n._config.pause&&(n.pause(),n.touchTimeout&&clearTimeout(n.touchTimeout),n.touchTimeout=setTimeout(function(t){return n.cycle(t)},500+n._config.interval))};p(this._element.querySelectorAll(et)).on(q.DRAG_START,function(t){return t.preventDefault()}),this._pointerEvent?(p(this._element).on(q.POINTERDOWN,function(t){return e(t)}),p(this._element).on(q.POINTERUP,function(t){return i(t)}),this._element.classList.add($)):(p(this._element).on(q.TOUCHSTART,function(t){return e(t)}),p(this._element).on(q.TOUCHMOVE,function(t){var e;(e=t).originalEvent.touches&&1<e.originalEvent.touches.length?n.touchDeltaX=0:n.touchDeltaX=e.originalEvent.touches[0].clientX-n.touchStartX}),p(this._element).on(q.TOUCHEND,function(t){return i(t)}))}},t._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next()}},t._getItemIndex=function(t){return this._items=t&&t.parentNode?[].slice.call(t.parentNode.querySelectorAll(tt)):[],this._items.indexOf(t)},t._getItemByDirection=function(t,e){var n=t===M,i=t===W,o=this._getItemIndex(e),r=this._items.length-1;if((i&&0===o||n&&o===r)&&!this._config.wrap)return e;var s=(o+(t===W?-1:1))%this._items.length;return-1===s?this._items[this._items.length-1]:this._items[s]},t._triggerSlideEvent=function(t,e){var n=this._getItemIndex(t),i=this._getItemIndex(this._element.querySelector(Z)),o=p.Event(q.SLIDE,{relatedTarget:t,direction:e,from:i,to:n});return p(this._element).trigger(o),o},t._setActiveIndicatorElement=function(t){if(this._indicatorsElement){var e=[].slice.call(this._indicatorsElement.querySelectorAll(J));p(e).removeClass(Q);var n=this._indicatorsElement.children[this._getItemIndex(t)];n&&p(n).addClass(Q)}},t._slide=function(t,e){var n,i,o,r=this,s=this._element.querySelector(Z),a=this._getItemIndex(s),l=e||s&&this._getItemByDirection(t,s),c=this._getItemIndex(l),h=Boolean(this._interval);if(o=t===M?(n=z,i=X,U):(n=Y,i=G,B),l&&p(l).hasClass(Q))this._isSliding=!1;else if(!this._triggerSlideEvent(l,o).isDefaultPrevented()&&s&&l){this._isSliding=!0,h&&this.pause(),this._setActiveIndicatorElement(l);var u=p.Event(q.SLID,{relatedTarget:l,direction:o,from:a,to:c});if(p(this._element).hasClass(V)){p(l).addClass(i),m.reflow(l),p(s).addClass(n),p(l).addClass(n);var f=parseInt(l.getAttribute(\"data-interval\"),10);this._config.interval=f?(this._config.defaultInterval=this._config.defaultInterval||this._config.interval,f):this._config.defaultInterval||this._config.interval;var d=m.getTransitionDurationFromElement(s);p(s).one(m.TRANSITION_END,function(){p(l).removeClass(n+\" \"+i).addClass(Q),p(s).removeClass(Q+\" \"+i+\" \"+n),r._isSliding=!1,setTimeout(function(){return p(r._element).trigger(u)},0)}).emulateTransitionEnd(d)}else p(s).removeClass(Q),p(l).addClass(Q),this._isSliding=!1,p(this._element).trigger(u);h&&this.cycle()}},r._jQueryInterface=function(i){return this.each(function(){var t=p(this).data(x),e=l({},R,p(this).data());\"object\"==typeof i&&(e=l({},e,i));var n=\"string\"==typeof i?i:e.slide;if(t||(t=new r(this,e),p(this).data(x,t)),\"number\"==typeof i)t.to(i);else if(\"string\"==typeof n){if(\"undefined\"==typeof t[n])throw new TypeError('No method named \"'+n+'\"');t[n]()}else e.interval&&e.ride&&(t.pause(),t.cycle())})},r._dataApiClickHandler=function(t){var e=m.getSelectorFromElement(this);if(e){var n=p(e)[0];if(n&&p(n).hasClass(K)){var i=l({},p(n).data(),p(this).data()),o=this.getAttribute(\"data-slide-to\");o&&(i.interval=!1),r._jQueryInterface.call(p(n),i),o&&p(n).data(x).to(o),t.preventDefault()}}},s(r,null,[{key:\"VERSION\",get:function(){return\"4.3.1\"}},{key:\"Default\",get:function(){return R}}]),r}();p(document).on(q.CLICK_DATA_API,ot,at._dataApiClickHandler),p(window).on(q.LOAD_DATA_API,function(){for(var t=[].slice.call(document.querySelectorAll(rt)),e=0,n=t.length;e<n;e++){var i=p(t[e]);at._jQueryInterface.call(i,i.data())}}),p.fn[L]=at._jQueryInterface,p.fn[L].Constructor=at,p.fn[L].noConflict=function(){return p.fn[L]=j,at._jQueryInterface};var lt=\"collapse\",ct=\"bs.collapse\",ht=\".\"+ct,ut=p.fn[lt],ft={toggle:!0,parent:\"\"},dt={toggle:\"boolean\",parent:\"(string|element)\"},pt={SHOW:\"show\"+ht,SHOWN:\"shown\"+ht,HIDE:\"hide\"+ht,HIDDEN:\"hidden\"+ht,CLICK_DATA_API:\"click\"+ht+\".data-api\"},mt=\"show\",gt=\"collapse\",_t=\"collapsing\",vt=\"collapsed\",yt=\"width\",Et=\"height\",bt=\".show, .collapsing\",wt='[data-toggle=\"collapse\"]',Ct=function(){function a(e,t){this._isTransitioning=!1,this._element=e,this._config=this._getConfig(t),this._triggerArray=[].slice.call(document.querySelectorAll('[data-toggle=\"collapse\"][href=\"#'+e.id+'\"],[data-toggle=\"collapse\"][data-target=\"#'+e.id+'\"]'));for(var n=[].slice.call(document.querySelectorAll(wt)),i=0,o=n.length;i<o;i++){var r=n[i],s=m.getSelectorFromElement(r),a=[].slice.call(document.querySelectorAll(s)).filter(function(t){return t===e});null!==s&&0<a.length&&(this._selector=s,this._triggerArray.push(r))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var t=a.prototype;return t.toggle=function(){p(this._element).hasClass(mt)?this.hide():this.show()},t.show=function(){var t,e,n=this;if(!this._isTransitioning&&!p(this._element).hasClass(mt)&&(this._parent&&0===(t=[].slice.call(this._parent.querySelectorAll(bt)).filter(function(t){return\"string\"==typeof n._config.parent?t.getAttribute(\"data-parent\")===n._config.parent:t.classList.contains(gt)})).length&&(t=null),!(t&&(e=p(t).not(this._selector).data(ct))&&e._isTransitioning))){var i=p.Event(pt.SHOW);if(p(this._element).trigger(i),!i.isDefaultPrevented()){t&&(a._jQueryInterface.call(p(t).not(this._selector),\"hide\"),e||p(t).data(ct,null));var o=this._getDimension();p(this._element).removeClass(gt).addClass(_t),this._element.style[o]=0,this._triggerArray.length&&p(this._triggerArray).removeClass(vt).attr(\"aria-expanded\",!0),this.setTransitioning(!0);var r=\"scroll\"+(o[0].toUpperCase()+o.slice(1)),s=m.getTransitionDurationFromElement(this._element);p(this._element).one(m.TRANSITION_END,function(){p(n._element).removeClass(_t).addClass(gt).addClass(mt),n._element.style[o]=\"\",n.setTransitioning(!1),p(n._element).trigger(pt.SHOWN)}).emulateTransitionEnd(s),this._element.style[o]=this._element[r]+\"px\"}}},t.hide=function(){var t=this;if(!this._isTransitioning&&p(this._element).hasClass(mt)){var e=p.Event(pt.HIDE);if(p(this._element).trigger(e),!e.isDefaultPrevented()){var n=this._getDimension();this._element.style[n]=this._element.getBoundingClientRect()[n]+\"px\",m.reflow(this._element),p(this._element).addClass(_t).removeClass(gt).removeClass(mt);var i=this._triggerArray.length;if(0<i)for(var o=0;o<i;o++){var r=this._triggerArray[o],s=m.getSelectorFromElement(r);if(null!==s)p([].slice.call(document.querySelectorAll(s))).hasClass(mt)||p(r).addClass(vt).attr(\"aria-expanded\",!1)}this.setTransitioning(!0);this._element.style[n]=\"\";var a=m.getTransitionDurationFromElement(this._element);p(this._element).one(m.TRANSITION_END,function(){t.setTransitioning(!1),p(t._element).removeClass(_t).addClass(gt).trigger(pt.HIDDEN)}).emulateTransitionEnd(a)}}},t.setTransitioning=function(t){this._isTransitioning=t},t.dispose=function(){p.removeData(this._element,ct),this._config=null,this._parent=null,this._element=null,this._triggerArray=null,this._isTransitioning=null},t._getConfig=function(t){return(t=l({},ft,t)).toggle=Boolean(t.toggle),m.typeCheckConfig(lt,t,dt),t},t._getDimension=function(){return p(this._element).hasClass(yt)?yt:Et},t._getParent=function(){var t,n=this;m.isElement(this._config.parent)?(t=this._config.parent,\"undefined\"!=typeof this._config.parent.jquery&&(t=this._config.parent[0])):t=document.querySelector(this._config.parent);var e='[data-toggle=\"collapse\"][data-parent=\"'+this._config.parent+'\"]',i=[].slice.call(t.querySelectorAll(e));return p(i).each(function(t,e){n._addAriaAndCollapsedClass(a._getTargetFromElement(e),[e])}),t},t._addAriaAndCollapsedClass=function(t,e){var n=p(t).hasClass(mt);e.length&&p(e).toggleClass(vt,!n).attr(\"aria-expanded\",n)},a._getTargetFromElement=function(t){var e=m.getSelectorFromElement(t);return e?document.querySelector(e):null},a._jQueryInterface=function(i){return this.each(function(){var t=p(this),e=t.data(ct),n=l({},ft,t.data(),\"object\"==typeof i&&i?i:{});if(!e&&n.toggle&&/show|hide/.test(i)&&(n.toggle=!1),e||(e=new a(this,n),t.data(ct,e)),\"string\"==typeof i){if(\"undefined\"==typeof e[i])throw new TypeError('No method named \"'+i+'\"');e[i]()}})},s(a,null,[{key:\"VERSION\",get:function(){return\"4.3.1\"}},{key:\"Default\",get:function(){return ft}}]),a}();p(document).on(pt.CLICK_DATA_API,wt,function(t){\"A\"===t.currentTarget.tagName&&t.preventDefault();var n=p(this),e=m.getSelectorFromElement(this),i=[].slice.call(document.querySelectorAll(e));p(i).each(function(){var t=p(this),e=t.data(ct)?\"toggle\":n.data();Ct._jQueryInterface.call(t,e)})}),p.fn[lt]=Ct._jQueryInterface,p.fn[lt].Constructor=Ct,p.fn[lt].noConflict=function(){return p.fn[lt]=ut,Ct._jQueryInterface};for(var Tt=\"undefined\"!=typeof window&&\"undefined\"!=typeof document,St=[\"Edge\",\"Trident\",\"Firefox\"],Dt=0,It=0;It<St.length;It+=1)if(Tt&&0<=navigator.userAgent.indexOf(St[It])){Dt=1;break}var At=Tt&&window.Promise?function(t){var e=!1;return function(){e||(e=!0,window.Promise.resolve().then(function(){e=!1,t()}))}}:function(t){var e=!1;return function(){e||(e=!0,setTimeout(function(){e=!1,t()},Dt))}};function Ot(t){return t&&\"[object Function]\"==={}.toString.call(t)}function Nt(t,e){if(1!==t.nodeType)return[];var n=t.ownerDocument.defaultView.getComputedStyle(t,null);return e?n[e]:n}function kt(t){return\"HTML\"===t.nodeName?t:t.parentNode||t.host}function Lt(t){if(!t)return document.body;switch(t.nodeName){case\"HTML\":case\"BODY\":return t.ownerDocument.body;case\"#document\":return t.body}var e=Nt(t),n=e.overflow,i=e.overflowX,o=e.overflowY;return/(auto|scroll|overlay)/.test(n+o+i)?t:Lt(kt(t))}var xt=Tt&&!(!window.MSInputMethodContext||!document.documentMode),Pt=Tt&&/MSIE 10/.test(navigator.userAgent);function Ht(t){return 11===t?xt:10===t?Pt:xt||Pt}function jt(t){if(!t)return document.documentElement;for(var e=Ht(10)?document.body:null,n=t.offsetParent||null;n===e&&t.nextElementSibling;)n=(t=t.nextElementSibling).offsetParent;var i=n&&n.nodeName;return i&&\"BODY\"!==i&&\"HTML\"!==i?-1!==[\"TH\",\"TD\",\"TABLE\"].indexOf(n.nodeName)&&\"static\"===Nt(n,\"position\")?jt(n):n:t?t.ownerDocument.documentElement:document.documentElement}function Rt(t){return null!==t.parentNode?Rt(t.parentNode):t}function Ft(t,e){if(!(t&&t.nodeType&&e&&e.nodeType))return document.documentElement;var n=t.compareDocumentPosition(e)&Node.DOCUMENT_POSITION_FOLLOWING,i=n?t:e,o=n?e:t,r=document.createRange();r.setStart(i,0),r.setEnd(o,0);var s,a,l=r.commonAncestorContainer;if(t!==l&&e!==l||i.contains(o))return\"BODY\"===(a=(s=l).nodeName)||\"HTML\"!==a&&jt(s.firstElementChild)!==s?jt(l):l;var c=Rt(t);return c.host?Ft(c.host,e):Ft(t,Rt(e).host)}function Mt(t){var e=\"top\"===(1<arguments.length&&void 0!==arguments[1]?arguments[1]:\"top\")?\"scrollTop\":\"scrollLeft\",n=t.nodeName;if(\"BODY\"!==n&&\"HTML\"!==n)return t[e];var i=t.ownerDocument.documentElement;return(t.ownerDocument.scrollingElement||i)[e]}function Wt(t,e){var n=\"x\"===e?\"Left\":\"Top\",i=\"Left\"===n?\"Right\":\"Bottom\";return parseFloat(t[\"border\"+n+\"Width\"],10)+parseFloat(t[\"border\"+i+\"Width\"],10)}function Ut(t,e,n,i){return Math.max(e[\"offset\"+t],e[\"scroll\"+t],n[\"client\"+t],n[\"offset\"+t],n[\"scroll\"+t],Ht(10)?parseInt(n[\"offset\"+t])+parseInt(i[\"margin\"+(\"Height\"===t?\"Top\":\"Left\")])+parseInt(i[\"margin\"+(\"Height\"===t?\"Bottom\":\"Right\")]):0)}function Bt(t){var e=t.body,n=t.documentElement,i=Ht(10)&&getComputedStyle(n);return{height:Ut(\"Height\",e,n,i),width:Ut(\"Width\",e,n,i)}}var qt=function(){function i(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,\"value\"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}return function(t,e,n){return e&&i(t.prototype,e),n&&i(t,n),t}}(),Kt=function(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t},Qt=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(t[i]=n[i])}return t};function Vt(t){return Qt({},t,{right:t.left+t.width,bottom:t.top+t.height})}function Yt(t){var e={};try{if(Ht(10)){e=t.getBoundingClientRect();var n=Mt(t,\"top\"),i=Mt(t,\"left\");e.top+=n,e.left+=i,e.bottom+=n,e.right+=i}else e=t.getBoundingClientRect()}catch(t){}var o={left:e.left,top:e.top,width:e.right-e.left,height:e.bottom-e.top},r=\"HTML\"===t.nodeName?Bt(t.ownerDocument):{},s=r.width||t.clientWidth||o.right-o.left,a=r.height||t.clientHeight||o.bottom-o.top,l=t.offsetWidth-s,c=t.offsetHeight-a;if(l||c){var h=Nt(t);l-=Wt(h,\"x\"),c-=Wt(h,\"y\"),o.width-=l,o.height-=c}return Vt(o)}function zt(t,e){var n=2<arguments.length&&void 0!==arguments[2]&&arguments[2],i=Ht(10),o=\"HTML\"===e.nodeName,r=Yt(t),s=Yt(e),a=Lt(t),l=Nt(e),c=parseFloat(l.borderTopWidth,10),h=parseFloat(l.borderLeftWidth,10);n&&o&&(s.top=Math.max(s.top,0),s.left=Math.max(s.left,0));var u=Vt({top:r.top-s.top-c,left:r.left-s.left-h,width:r.width,height:r.height});if(u.marginTop=0,u.marginLeft=0,!i&&o){var f=parseFloat(l.marginTop,10),d=parseFloat(l.marginLeft,10);u.top-=c-f,u.bottom-=c-f,u.left-=h-d,u.right-=h-d,u.marginTop=f,u.marginLeft=d}return(i&&!n?e.contains(a):e===a&&\"BODY\"!==a.nodeName)&&(u=function(t,e){var n=2<arguments.length&&void 0!==arguments[2]&&arguments[2],i=Mt(e,\"top\"),o=Mt(e,\"left\"),r=n?-1:1;return t.top+=i*r,t.bottom+=i*r,t.left+=o*r,t.right+=o*r,t}(u,e)),u}function Xt(t){if(!t||!t.parentElement||Ht())return document.documentElement;for(var e=t.parentElement;e&&\"none\"===Nt(e,\"transform\");)e=e.parentElement;return e||document.documentElement}function Gt(t,e,n,i){var o=4<arguments.length&&void 0!==arguments[4]&&arguments[4],r={top:0,left:0},s=o?Xt(t):Ft(t,e);if(\"viewport\"===i)r=function(t){var e=1<arguments.length&&void 0!==arguments[1]&&arguments[1],n=t.ownerDocument.documentElement,i=zt(t,n),o=Math.max(n.clientWidth,window.innerWidth||0),r=Math.max(n.clientHeight,window.innerHeight||0),s=e?0:Mt(n),a=e?0:Mt(n,\"left\");return Vt({top:s-i.top+i.marginTop,left:a-i.left+i.marginLeft,width:o,height:r})}(s,o);else{var a=void 0;\"scrollParent\"===i?\"BODY\"===(a=Lt(kt(e))).nodeName&&(a=t.ownerDocument.documentElement):a=\"window\"===i?t.ownerDocument.documentElement:i;var l=zt(a,s,o);if(\"HTML\"!==a.nodeName||function t(e){var n=e.nodeName;if(\"BODY\"===n||\"HTML\"===n)return!1;if(\"fixed\"===Nt(e,\"position\"))return!0;var i=kt(e);return!!i&&t(i)}(s))r=l;else{var c=Bt(t.ownerDocument),h=c.height,u=c.width;r.top+=l.top-l.marginTop,r.bottom=h+l.top,r.left+=l.left-l.marginLeft,r.right=u+l.left}}var f=\"number\"==typeof(n=n||0);return r.left+=f?n:n.left||0,r.top+=f?n:n.top||0,r.right-=f?n:n.right||0,r.bottom-=f?n:n.bottom||0,r}function $t(t,e,i,n,o){var r=5<arguments.length&&void 0!==arguments[5]?arguments[5]:0;if(-1===t.indexOf(\"auto\"))return t;var s=Gt(i,n,r,o),a={top:{width:s.width,height:e.top-s.top},right:{width:s.right-e.right,height:s.height},bottom:{width:s.width,height:s.bottom-e.bottom},left:{width:e.left-s.left,height:s.height}},l=Object.keys(a).map(function(t){return Qt({key:t},a[t],{area:(e=a[t],e.width*e.height)});var e}).sort(function(t,e){return e.area-t.area}),c=l.filter(function(t){var e=t.width,n=t.height;return e>=i.clientWidth&&n>=i.clientHeight}),h=0<c.length?c[0].key:l[0].key,u=t.split(\"-\")[1];return h+(u?\"-\"+u:\"\")}function Jt(t,e,n){var i=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return zt(n,i?Xt(e):Ft(e,n),i)}function Zt(t){var e=t.ownerDocument.defaultView.getComputedStyle(t),n=parseFloat(e.marginTop||0)+parseFloat(e.marginBottom||0),i=parseFloat(e.marginLeft||0)+parseFloat(e.marginRight||0);return{width:t.offsetWidth+i,height:t.offsetHeight+n}}function te(t){var e={left:\"right\",right:\"left\",bottom:\"top\",top:\"bottom\"};return t.replace(/left|right|bottom|top/g,function(t){return e[t]})}function ee(t,e,n){n=n.split(\"-\")[0];var i=Zt(t),o={width:i.width,height:i.height},r=-1!==[\"right\",\"left\"].indexOf(n),s=r?\"top\":\"left\",a=r?\"left\":\"top\",l=r?\"height\":\"width\",c=r?\"width\":\"height\";return o[s]=e[s]+e[l]/2-i[l]/2,o[a]=n===a?e[a]-i[c]:e[te(a)],o}function ne(t,e){return Array.prototype.find?t.find(e):t.filter(e)[0]}function ie(t,n,e){return(void 0===e?t:t.slice(0,function(t,e,n){if(Array.prototype.findIndex)return t.findIndex(function(t){return t[e]===n});var i=ne(t,function(t){return t[e]===n});return t.indexOf(i)}(t,\"name\",e))).forEach(function(t){t.function&&console.warn(\"`modifier.function` is deprecated, use `modifier.fn`!\");var e=t.function||t.fn;t.enabled&&Ot(e)&&(n.offsets.popper=Vt(n.offsets.popper),n.offsets.reference=Vt(n.offsets.reference),n=e(n,t))}),n}function oe(t,n){return t.some(function(t){var e=t.name;return t.enabled&&e===n})}function re(t){for(var e=[!1,\"ms\",\"Webkit\",\"Moz\",\"O\"],n=t.charAt(0).toUpperCase()+t.slice(1),i=0;i<e.length;i++){var o=e[i],r=o?\"\"+o+n:t;if(\"undefined\"!=typeof document.body.style[r])return r}return null}function se(t){var e=t.ownerDocument;return e?e.defaultView:window}function ae(t,e,n,i){n.updateBound=i,se(t).addEventListener(\"resize\",n.updateBound,{passive:!0});var o=Lt(t);return function t(e,n,i,o){var r=\"BODY\"===e.nodeName,s=r?e.ownerDocument.defaultView:e;s.addEventListener(n,i,{passive:!0}),r||t(Lt(s.parentNode),n,i,o),o.push(s)}(o,\"scroll\",n.updateBound,n.scrollParents),n.scrollElement=o,n.eventsEnabled=!0,n}function le(){var t,e;this.state.eventsEnabled&&(cancelAnimationFrame(this.scheduleUpdate),this.state=(t=this.reference,e=this.state,se(t).removeEventListener(\"resize\",e.updateBound),e.scrollParents.forEach(function(t){t.removeEventListener(\"scroll\",e.updateBound)}),e.updateBound=null,e.scrollParents=[],e.scrollElement=null,e.eventsEnabled=!1,e))}function ce(t){return\"\"!==t&&!isNaN(parseFloat(t))&&isFinite(t)}function he(n,i){Object.keys(i).forEach(function(t){var e=\"\";-1!==[\"width\",\"height\",\"top\",\"right\",\"bottom\",\"left\"].indexOf(t)&&ce(i[t])&&(e=\"px\"),n.style[t]=i[t]+e})}var ue=Tt&&/Firefox/i.test(navigator.userAgent);function fe(t,e,n){var i=ne(t,function(t){return t.name===e}),o=!!i&&t.some(function(t){return t.name===n&&t.enabled&&t.order<i.order});if(!o){var r=\"`\"+e+\"`\",s=\"`\"+n+\"`\";console.warn(s+\" modifier is required by \"+r+\" modifier in order to work, be sure to include it before \"+r+\"!\")}return o}var de=[\"auto-start\",\"auto\",\"auto-end\",\"top-start\",\"top\",\"top-end\",\"right-start\",\"right\",\"right-end\",\"bottom-end\",\"bottom\",\"bottom-start\",\"left-end\",\"left\",\"left-start\"],pe=de.slice(3);function me(t){var e=1<arguments.length&&void 0!==arguments[1]&&arguments[1],n=pe.indexOf(t),i=pe.slice(n+1).concat(pe.slice(0,n));return e?i.reverse():i}var ge=\"flip\",_e=\"clockwise\",ve=\"counterclockwise\";function ye(t,o,r,e){var s=[0,0],a=-1!==[\"right\",\"left\"].indexOf(e),n=t.split(/(\\+|\\-)/).map(function(t){return t.trim()}),i=n.indexOf(ne(n,function(t){return-1!==t.search(/,|\\s/)}));n[i]&&-1===n[i].indexOf(\",\")&&console.warn(\"Offsets separated by white space(s) are deprecated, use a comma (,) instead.\");var l=/\\s*,\\s*|\\s+/,c=-1!==i?[n.slice(0,i).concat([n[i].split(l)[0]]),[n[i].split(l)[1]].concat(n.slice(i+1))]:[n];return(c=c.map(function(t,e){var n=(1===e?!a:a)?\"height\":\"width\",i=!1;return t.reduce(function(t,e){return\"\"===t[t.length-1]&&-1!==[\"+\",\"-\"].indexOf(e)?(t[t.length-1]=e,i=!0,t):i?(t[t.length-1]+=e,i=!1,t):t.concat(e)},[]).map(function(t){return function(t,e,n,i){var o=t.match(/((?:\\-|\\+)?\\d*\\.?\\d*)(.*)/),r=+o[1],s=o[2];if(!r)return t;if(0!==s.indexOf(\"%\"))return\"vh\"!==s&&\"vw\"!==s?r:(\"vh\"===s?Math.max(document.documentElement.clientHeight,window.innerHeight||0):Math.max(document.documentElement.clientWidth,window.innerWidth||0))/100*r;var a=void 0;switch(s){case\"%p\":a=n;break;case\"%\":case\"%r\":default:a=i}return Vt(a)[e]/100*r}(t,n,o,r)})})).forEach(function(n,i){n.forEach(function(t,e){ce(t)&&(s[i]+=t*(\"-\"===n[e-1]?-1:1))})}),s}var Ee={placement:\"bottom\",positionFixed:!1,eventsEnabled:!0,removeOnDestroy:!1,onCreate:function(){},onUpdate:function(){},modifiers:{shift:{order:100,enabled:!0,fn:function(t){var e=t.placement,n=e.split(\"-\")[0],i=e.split(\"-\")[1];if(i){var o=t.offsets,r=o.reference,s=o.popper,a=-1!==[\"bottom\",\"top\"].indexOf(n),l=a?\"left\":\"top\",c=a?\"width\":\"height\",h={start:Kt({},l,r[l]),end:Kt({},l,r[l]+r[c]-s[c])};t.offsets.popper=Qt({},s,h[i])}return t}},offset:{order:200,enabled:!0,fn:function(t,e){var n=e.offset,i=t.placement,o=t.offsets,r=o.popper,s=o.reference,a=i.split(\"-\")[0],l=void 0;return l=ce(+n)?[+n,0]:ye(n,r,s,a),\"left\"===a?(r.top+=l[0],r.left-=l[1]):\"right\"===a?(r.top+=l[0],r.left+=l[1]):\"top\"===a?(r.left+=l[0],r.top-=l[1]):\"bottom\"===a&&(r.left+=l[0],r.top+=l[1]),t.popper=r,t},offset:0},preventOverflow:{order:300,enabled:!0,fn:function(t,i){var e=i.boundariesElement||jt(t.instance.popper);t.instance.reference===e&&(e=jt(e));var n=re(\"transform\"),o=t.instance.popper.style,r=o.top,s=o.left,a=o[n];o.top=\"\",o.left=\"\",o[n]=\"\";var l=Gt(t.instance.popper,t.instance.reference,i.padding,e,t.positionFixed);o.top=r,o.left=s,o[n]=a,i.boundaries=l;var c=i.priority,h=t.offsets.popper,u={primary:function(t){var e=h[t];return h[t]<l[t]&&!i.escapeWithReference&&(e=Math.max(h[t],l[t])),Kt({},t,e)},secondary:function(t){var e=\"right\"===t?\"left\":\"top\",n=h[e];return h[t]>l[t]&&!i.escapeWithReference&&(n=Math.min(h[e],l[t]-(\"right\"===t?h.width:h.height))),Kt({},e,n)}};return c.forEach(function(t){var e=-1!==[\"left\",\"top\"].indexOf(t)?\"primary\":\"secondary\";h=Qt({},h,u[e](t))}),t.offsets.popper=h,t},priority:[\"left\",\"right\",\"top\",\"bottom\"],padding:5,boundariesElement:\"scrollParent\"},keepTogether:{order:400,enabled:!0,fn:function(t){var e=t.offsets,n=e.popper,i=e.reference,o=t.placement.split(\"-\")[0],r=Math.floor,s=-1!==[\"top\",\"bottom\"].indexOf(o),a=s?\"right\":\"bottom\",l=s?\"left\":\"top\",c=s?\"width\":\"height\";return n[a]<r(i[l])&&(t.offsets.popper[l]=r(i[l])-n[c]),n[l]>r(i[a])&&(t.offsets.popper[l]=r(i[a])),t}},arrow:{order:500,enabled:!0,fn:function(t,e){var n;if(!fe(t.instance.modifiers,\"arrow\",\"keepTogether\"))return t;var i=e.element;if(\"string\"==typeof i){if(!(i=t.instance.popper.querySelector(i)))return t}else if(!t.instance.popper.contains(i))return console.warn(\"WARNING: `arrow.element` must be child of its popper element!\"),t;var o=t.placement.split(\"-\")[0],r=t.offsets,s=r.popper,a=r.reference,l=-1!==[\"left\",\"right\"].indexOf(o),c=l?\"height\":\"width\",h=l?\"Top\":\"Left\",u=h.toLowerCase(),f=l?\"left\":\"top\",d=l?\"bottom\":\"right\",p=Zt(i)[c];a[d]-p<s[u]&&(t.offsets.popper[u]-=s[u]-(a[d]-p)),a[u]+p>s[d]&&(t.offsets.popper[u]+=a[u]+p-s[d]),t.offsets.popper=Vt(t.offsets.popper);var m=a[u]+a[c]/2-p/2,g=Nt(t.instance.popper),_=parseFloat(g[\"margin\"+h],10),v=parseFloat(g[\"border\"+h+\"Width\"],10),y=m-t.offsets.popper[u]-_-v;return y=Math.max(Math.min(s[c]-p,y),0),t.arrowElement=i,t.offsets.arrow=(Kt(n={},u,Math.round(y)),Kt(n,f,\"\"),n),t},element:\"[x-arrow]\"},flip:{order:600,enabled:!0,fn:function(p,m){if(oe(p.instance.modifiers,\"inner\"))return p;if(p.flipped&&p.placement===p.originalPlacement)return p;var g=Gt(p.instance.popper,p.instance.reference,m.padding,m.boundariesElement,p.positionFixed),_=p.placement.split(\"-\")[0],v=te(_),y=p.placement.split(\"-\")[1]||\"\",E=[];switch(m.behavior){case ge:E=[_,v];break;case _e:E=me(_);break;case ve:E=me(_,!0);break;default:E=m.behavior}return E.forEach(function(t,e){if(_!==t||E.length===e+1)return p;_=p.placement.split(\"-\")[0],v=te(_);var n,i=p.offsets.popper,o=p.offsets.reference,r=Math.floor,s=\"left\"===_&&r(i.right)>r(o.left)||\"right\"===_&&r(i.left)<r(o.right)||\"top\"===_&&r(i.bottom)>r(o.top)||\"bottom\"===_&&r(i.top)<r(o.bottom),a=r(i.left)<r(g.left),l=r(i.right)>r(g.right),c=r(i.top)<r(g.top),h=r(i.bottom)>r(g.bottom),u=\"left\"===_&&a||\"right\"===_&&l||\"top\"===_&&c||\"bottom\"===_&&h,f=-1!==[\"top\",\"bottom\"].indexOf(_),d=!!m.flipVariations&&(f&&\"start\"===y&&a||f&&\"end\"===y&&l||!f&&\"start\"===y&&c||!f&&\"end\"===y&&h);(s||u||d)&&(p.flipped=!0,(s||u)&&(_=E[e+1]),d&&(y=\"end\"===(n=y)?\"start\":\"start\"===n?\"end\":n),p.placement=_+(y?\"-\"+y:\"\"),p.offsets.popper=Qt({},p.offsets.popper,ee(p.instance.popper,p.offsets.reference,p.placement)),p=ie(p.instance.modifiers,p,\"flip\"))}),p},behavior:\"flip\",padding:5,boundariesElement:\"viewport\"},inner:{order:700,enabled:!1,fn:function(t){var e=t.placement,n=e.split(\"-\")[0],i=t.offsets,o=i.popper,r=i.reference,s=-1!==[\"left\",\"right\"].indexOf(n),a=-1===[\"top\",\"left\"].indexOf(n);return o[s?\"left\":\"top\"]=r[n]-(a?o[s?\"width\":\"height\"]:0),t.placement=te(e),t.offsets.popper=Vt(o),t}},hide:{order:800,enabled:!0,fn:function(t){if(!fe(t.instance.modifiers,\"hide\",\"preventOverflow\"))return t;var e=t.offsets.reference,n=ne(t.instance.modifiers,function(t){return\"preventOverflow\"===t.name}).boundaries;if(e.bottom<n.top||e.left>n.right||e.top>n.bottom||e.right<n.left){if(!0===t.hide)return t;t.hide=!0,t.attributes[\"x-out-of-boundaries\"]=\"\"}else{if(!1===t.hide)return t;t.hide=!1,t.attributes[\"x-out-of-boundaries\"]=!1}return t}},computeStyle:{order:850,enabled:!0,fn:function(t,e){var n=e.x,i=e.y,o=t.offsets.popper,r=ne(t.instance.modifiers,function(t){return\"applyStyle\"===t.name}).gpuAcceleration;void 0!==r&&console.warn(\"WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!\");var s,a,l,c,h,u,f,d,p,m,g,_,v,y,E=void 0!==r?r:e.gpuAcceleration,b=jt(t.instance.popper),w=Yt(b),C={position:o.position},T=(s=t,a=window.devicePixelRatio<2||!ue,l=s.offsets,c=l.popper,h=l.reference,u=Math.round,f=Math.floor,d=function(t){return t},p=u(h.width),m=u(c.width),g=-1!==[\"left\",\"right\"].indexOf(s.placement),_=-1!==s.placement.indexOf(\"-\"),y=a?u:d,{left:(v=a?g||_||p%2==m%2?u:f:d)(p%2==1&&m%2==1&&!_&&a?c.left-1:c.left),top:y(c.top),bottom:y(c.bottom),right:v(c.right)}),S=\"bottom\"===n?\"top\":\"bottom\",D=\"right\"===i?\"left\":\"right\",I=re(\"transform\"),A=void 0,O=void 0;if(O=\"bottom\"===S?\"HTML\"===b.nodeName?-b.clientHeight+T.bottom:-w.height+T.bottom:T.top,A=\"right\"===D?\"HTML\"===b.nodeName?-b.clientWidth+T.right:-w.width+T.right:T.left,E&&I)C[I]=\"translate3d(\"+A+\"px, \"+O+\"px, 0)\",C[S]=0,C[D]=0,C.willChange=\"transform\";else{var N=\"bottom\"===S?-1:1,k=\"right\"===D?-1:1;C[S]=O*N,C[D]=A*k,C.willChange=S+\", \"+D}var L={\"x-placement\":t.placement};return t.attributes=Qt({},L,t.attributes),t.styles=Qt({},C,t.styles),t.arrowStyles=Qt({},t.offsets.arrow,t.arrowStyles),t},gpuAcceleration:!0,x:\"bottom\",y:\"right\"},applyStyle:{order:900,enabled:!0,fn:function(t){var e,n;return he(t.instance.popper,t.styles),e=t.instance.popper,n=t.attributes,Object.keys(n).forEach(function(t){!1!==n[t]?e.setAttribute(t,n[t]):e.removeAttribute(t)}),t.arrowElement&&Object.keys(t.arrowStyles).length&&he(t.arrowElement,t.arrowStyles),t},onLoad:function(t,e,n,i,o){var r=Jt(o,e,t,n.positionFixed),s=$t(n.placement,r,e,t,n.modifiers.flip.boundariesElement,n.modifiers.flip.padding);return e.setAttribute(\"x-placement\",s),he(e,{position:n.positionFixed?\"fixed\":\"absolute\"}),n},gpuAcceleration:void 0}}},be=function(){function r(t,e){var n=this,i=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{};!function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}(this,r),this.scheduleUpdate=function(){return requestAnimationFrame(n.update)},this.update=At(this.update.bind(this)),this.options=Qt({},r.Defaults,i),this.state={isDestroyed:!1,isCreated:!1,scrollParents:[]},this.reference=t&&t.jquery?t[0]:t,this.popper=e&&e.jquery?e[0]:e,this.options.modifiers={},Object.keys(Qt({},r.Defaults.modifiers,i.modifiers)).forEach(function(t){n.options.modifiers[t]=Qt({},r.Defaults.modifiers[t]||{},i.modifiers?i.modifiers[t]:{})}),this.modifiers=Object.keys(this.options.modifiers).map(function(t){return Qt({name:t},n.options.modifiers[t])}).sort(function(t,e){return t.order-e.order}),this.modifiers.forEach(function(t){t.enabled&&Ot(t.onLoad)&&t.onLoad(n.reference,n.popper,n.options,t,n.state)}),this.update();var o=this.options.eventsEnabled;o&&this.enableEventListeners(),this.state.eventsEnabled=o}return qt(r,[{key:\"update\",value:function(){return function(){if(!this.state.isDestroyed){var t={instance:this,styles:{},arrowStyles:{},attributes:{},flipped:!1,offsets:{}};t.offsets.reference=Jt(this.state,this.popper,this.reference,this.options.positionFixed),t.placement=$t(this.options.placement,t.offsets.reference,this.popper,this.reference,this.options.modifiers.flip.boundariesElement,this.options.modifiers.flip.padding),t.originalPlacement=t.placement,t.positionFixed=this.options.positionFixed,t.offsets.popper=ee(this.popper,t.offsets.reference,t.placement),t.offsets.popper.position=this.options.positionFixed?\"fixed\":\"absolute\",t=ie(this.modifiers,t),this.state.isCreated?this.options.onUpdate(t):(this.state.isCreated=!0,this.options.onCreate(t))}}.call(this)}},{key:\"destroy\",value:function(){return function(){return this.state.isDestroyed=!0,oe(this.modifiers,\"applyStyle\")&&(this.popper.removeAttribute(\"x-placement\"),this.popper.style.position=\"\",this.popper.style.top=\"\",this.popper.style.left=\"\",this.popper.style.right=\"\",this.popper.style.bottom=\"\",this.popper.style.willChange=\"\",this.popper.style[re(\"transform\")]=\"\"),this.disableEventListeners(),this.options.removeOnDestroy&&this.popper.parentNode.removeChild(this.popper),this}.call(this)}},{key:\"enableEventListeners\",value:function(){return function(){this.state.eventsEnabled||(this.state=ae(this.reference,this.options,this.state,this.scheduleUpdate))}.call(this)}},{key:\"disableEventListeners\",value:function(){return le.call(this)}}]),r}();be.Utils=(\"undefined\"!=typeof window?window:global).PopperUtils,be.placements=de,be.Defaults=Ee;var we=\"dropdown\",Ce=\"bs.dropdown\",Te=\".\"+Ce,Se=\".data-api\",De=p.fn[we],Ie=new RegExp(\"38|40|27\"),Ae={HIDE:\"hide\"+Te,HIDDEN:\"hidden\"+Te,SHOW:\"show\"+Te,SHOWN:\"shown\"+Te,CLICK:\"click\"+Te,CLICK_DATA_API:\"click\"+Te+Se,KEYDOWN_DATA_API:\"keydown\"+Te+Se,KEYUP_DATA_API:\"keyup\"+Te+Se},Oe=\"disabled\",Ne=\"show\",ke=\"dropup\",Le=\"dropright\",xe=\"dropleft\",Pe=\"dropdown-menu-right\",He=\"position-static\",je='[data-toggle=\"dropdown\"]',Re=\".dropdown form\",Fe=\".dropdown-menu\",Me=\".navbar-nav\",We=\".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)\",Ue=\"top-start\",Be=\"top-end\",qe=\"bottom-start\",Ke=\"bottom-end\",Qe=\"right-start\",Ve=\"left-start\",Ye={offset:0,flip:!0,boundary:\"scrollParent\",reference:\"toggle\",display:\"dynamic\"},ze={offset:\"(number|string|function)\",flip:\"boolean\",boundary:\"(string|element)\",reference:\"(string|element)\",display:\"string\"},Xe=function(){function c(t,e){this._element=t,this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}var t=c.prototype;return t.toggle=function(){if(!this._element.disabled&&!p(this._element).hasClass(Oe)){var t=c._getParentFromElement(this._element),e=p(this._menu).hasClass(Ne);if(c._clearMenus(),!e){var n={relatedTarget:this._element},i=p.Event(Ae.SHOW,n);if(p(t).trigger(i),!i.isDefaultPrevented()){if(!this._inNavbar){if(\"undefined\"==typeof be)throw new TypeError(\"Bootstrap's dropdowns require Popper.js (https://popper.js.org/)\");var o=this._element;\"parent\"===this._config.reference?o=t:m.isElement(this._config.reference)&&(o=this._config.reference,\"undefined\"!=typeof this._config.reference.jquery&&(o=this._config.reference[0])),\"scrollParent\"!==this._config.boundary&&p(t).addClass(He),this._popper=new be(o,this._menu,this._getPopperConfig())}\"ontouchstart\"in document.documentElement&&0===p(t).closest(Me).length&&p(document.body).children().on(\"mouseover\",null,p.noop),this._element.focus(),this._element.setAttribute(\"aria-expanded\",!0),p(this._menu).toggleClass(Ne),p(t).toggleClass(Ne).trigger(p.Event(Ae.SHOWN,n))}}}},t.show=function(){if(!(this._element.disabled||p(this._element).hasClass(Oe)||p(this._menu).hasClass(Ne))){var t={relatedTarget:this._element},e=p.Event(Ae.SHOW,t),n=c._getParentFromElement(this._element);p(n).trigger(e),e.isDefaultPrevented()||(p(this._menu).toggleClass(Ne),p(n).toggleClass(Ne).trigger(p.Event(Ae.SHOWN,t)))}},t.hide=function(){if(!this._element.disabled&&!p(this._element).hasClass(Oe)&&p(this._menu).hasClass(Ne)){var t={relatedTarget:this._element},e=p.Event(Ae.HIDE,t),n=c._getParentFromElement(this._element);p(n).trigger(e),e.isDefaultPrevented()||(p(this._menu).toggleClass(Ne),p(n).toggleClass(Ne).trigger(p.Event(Ae.HIDDEN,t)))}},t.dispose=function(){p.removeData(this._element,Ce),p(this._element).off(Te),this._element=null,(this._menu=null)!==this._popper&&(this._popper.destroy(),this._popper=null)},t.update=function(){this._inNavbar=this._detectNavbar(),null!==this._popper&&this._popper.scheduleUpdate()},t._addEventListeners=function(){var e=this;p(this._element).on(Ae.CLICK,function(t){t.preventDefault(),t.stopPropagation(),e.toggle()})},t._getConfig=function(t){return t=l({},this.constructor.Default,p(this._element).data(),t),m.typeCheckConfig(we,t,this.constructor.DefaultType),t},t._getMenuElement=function(){if(!this._menu){var t=c._getParentFromElement(this._element);t&&(this._menu=t.querySelector(Fe))}return this._menu},t._getPlacement=function(){var t=p(this._element.parentNode),e=qe;return t.hasClass(ke)?(e=Ue,p(this._menu).hasClass(Pe)&&(e=Be)):t.hasClass(Le)?e=Qe:t.hasClass(xe)?e=Ve:p(this._menu).hasClass(Pe)&&(e=Ke),e},t._detectNavbar=function(){return 0<p(this._element).closest(\".navbar\").length},t._getOffset=function(){var e=this,t={};return\"function\"==typeof this._config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,e._config.offset(t.offsets,e._element)||{}),t}:t.offset=this._config.offset,t},t._getPopperConfig=function(){var t={placement:this._getPlacement(),modifiers:{offset:this._getOffset(),flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}};return\"static\"===this._config.display&&(t.modifiers.applyStyle={enabled:!1}),t},c._jQueryInterface=function(e){return this.each(function(){var t=p(this).data(Ce);if(t||(t=new c(this,\"object\"==typeof e?e:null),p(this).data(Ce,t)),\"string\"==typeof e){if(\"undefined\"==typeof t[e])throw new TypeError('No method named \"'+e+'\"');t[e]()}})},c._clearMenus=function(t){if(!t||3!==t.which&&(\"keyup\"!==t.type||9===t.which))for(var e=[].slice.call(document.querySelectorAll(je)),n=0,i=e.length;n<i;n++){var o=c._getParentFromElement(e[n]),r=p(e[n]).data(Ce),s={relatedTarget:e[n]};if(t&&\"click\"===t.type&&(s.clickEvent=t),r){var a=r._menu;if(p(o).hasClass(Ne)&&!(t&&(\"click\"===t.type&&/input|textarea/i.test(t.target.tagName)||\"keyup\"===t.type&&9===t.which)&&p.contains(o,t.target))){var l=p.Event(Ae.HIDE,s);p(o).trigger(l),l.isDefaultPrevented()||(\"ontouchstart\"in document.documentElement&&p(document.body).children().off(\"mouseover\",null,p.noop),e[n].setAttribute(\"aria-expanded\",\"false\"),p(a).removeClass(Ne),p(o).removeClass(Ne).trigger(p.Event(Ae.HIDDEN,s)))}}}},c._getParentFromElement=function(t){var e,n=m.getSelectorFromElement(t);return n&&(e=document.querySelector(n)),e||t.parentNode},c._dataApiKeydownHandler=function(t){if((/input|textarea/i.test(t.target.tagName)?!(32===t.which||27!==t.which&&(40!==t.which&&38!==t.which||p(t.target).closest(Fe).length)):Ie.test(t.which))&&(t.preventDefault(),t.stopPropagation(),!this.disabled&&!p(this).hasClass(Oe))){var e=c._getParentFromElement(this),n=p(e).hasClass(Ne);if(n&&(!n||27!==t.which&&32!==t.which)){var i=[].slice.call(e.querySelectorAll(We));if(0!==i.length){var o=i.indexOf(t.target);38===t.which&&0<o&&o--,40===t.which&&o<i.length-1&&o++,o<0&&(o=0),i[o].focus()}}else{if(27===t.which){var r=e.querySelector(je);p(r).trigger(\"focus\")}p(this).trigger(\"click\")}}},s(c,null,[{key:\"VERSION\",get:function(){return\"4.3.1\"}},{key:\"Default\",get:function(){return Ye}},{key:\"DefaultType\",get:function(){return ze}}]),c}();p(document).on(Ae.KEYDOWN_DATA_API,je,Xe._dataApiKeydownHandler).on(Ae.KEYDOWN_DATA_API,Fe,Xe._dataApiKeydownHandler).on(Ae.CLICK_DATA_API+\" \"+Ae.KEYUP_DATA_API,Xe._clearMenus).on(Ae.CLICK_DATA_API,je,function(t){t.preventDefault(),t.stopPropagation(),Xe._jQueryInterface.call(p(this),\"toggle\")}).on(Ae.CLICK_DATA_API,Re,function(t){t.stopPropagation()}),p.fn[we]=Xe._jQueryInterface,p.fn[we].Constructor=Xe,p.fn[we].noConflict=function(){return p.fn[we]=De,Xe._jQueryInterface};var Ge=\"modal\",$e=\"bs.modal\",Je=\".\"+$e,Ze=p.fn[Ge],tn={backdrop:!0,keyboard:!0,focus:!0,show:!0},en={backdrop:\"(boolean|string)\",keyboard:\"boolean\",focus:\"boolean\",show:\"boolean\"},nn={HIDE:\"hide\"+Je,HIDDEN:\"hidden\"+Je,SHOW:\"show\"+Je,SHOWN:\"shown\"+Je,FOCUSIN:\"focusin\"+Je,RESIZE:\"resize\"+Je,CLICK_DISMISS:\"click.dismiss\"+Je,KEYDOWN_DISMISS:\"keydown.dismiss\"+Je,MOUSEUP_DISMISS:\"mouseup.dismiss\"+Je,MOUSEDOWN_DISMISS:\"mousedown.dismiss\"+Je,CLICK_DATA_API:\"click\"+Je+\".data-api\"},on=\"modal-dialog-scrollable\",rn=\"modal-scrollbar-measure\",sn=\"modal-backdrop\",an=\"modal-open\",ln=\"fade\",cn=\"show\",hn=\".modal-dialog\",un=\".modal-body\",fn='[data-toggle=\"modal\"]',dn='[data-dismiss=\"modal\"]',pn=\".fixed-top, .fixed-bottom, .is-fixed, .sticky-top\",mn=\".sticky-top\",gn=function(){function o(t,e){this._config=this._getConfig(e),this._element=t,this._dialog=t.querySelector(hn),this._backdrop=null,this._isShown=!1,this._isBodyOverflowing=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._scrollbarWidth=0}var t=o.prototype;return t.toggle=function(t){return this._isShown?this.hide():this.show(t)},t.show=function(t){var e=this;if(!this._isShown&&!this._isTransitioning){p(this._element).hasClass(ln)&&(this._isTransitioning=!0);var n=p.Event(nn.SHOW,{relatedTarget:t});p(this._element).trigger(n),this._isShown||n.isDefaultPrevented()||(this._isShown=!0,this._checkScrollbar(),this._setScrollbar(),this._adjustDialog(),this._setEscapeEvent(),this._setResizeEvent(),p(this._element).on(nn.CLICK_DISMISS,dn,function(t){return e.hide(t)}),p(this._dialog).on(nn.MOUSEDOWN_DISMISS,function(){p(e._element).one(nn.MOUSEUP_DISMISS,function(t){p(t.target).is(e._element)&&(e._ignoreBackdropClick=!0)})}),this._showBackdrop(function(){return e._showElement(t)}))}},t.hide=function(t){var e=this;if(t&&t.preventDefault(),this._isShown&&!this._isTransitioning){var n=p.Event(nn.HIDE);if(p(this._element).trigger(n),this._isShown&&!n.isDefaultPrevented()){this._isShown=!1;var i=p(this._element).hasClass(ln);if(i&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),p(document).off(nn.FOCUSIN),p(this._element).removeClass(cn),p(this._element).off(nn.CLICK_DISMISS),p(this._dialog).off(nn.MOUSEDOWN_DISMISS),i){var o=m.getTransitionDurationFromElement(this._element);p(this._element).one(m.TRANSITION_END,function(t){return e._hideModal(t)}).emulateTransitionEnd(o)}else this._hideModal()}}},t.dispose=function(){[window,this._element,this._dialog].forEach(function(t){return p(t).off(Je)}),p(document).off(nn.FOCUSIN),p.removeData(this._element,$e),this._config=null,this._element=null,this._dialog=null,this._backdrop=null,this._isShown=null,this._isBodyOverflowing=null,this._ignoreBackdropClick=null,this._isTransitioning=null,this._scrollbarWidth=null},t.handleUpdate=function(){this._adjustDialog()},t._getConfig=function(t){return t=l({},tn,t),m.typeCheckConfig(Ge,t,en),t},t._showElement=function(t){var e=this,n=p(this._element).hasClass(ln);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display=\"block\",this._element.removeAttribute(\"aria-hidden\"),this._element.setAttribute(\"aria-modal\",!0),p(this._dialog).hasClass(on)?this._dialog.querySelector(un).scrollTop=0:this._element.scrollTop=0,n&&m.reflow(this._element),p(this._element).addClass(cn),this._config.focus&&this._enforceFocus();var i=p.Event(nn.SHOWN,{relatedTarget:t}),o=function(){e._config.focus&&e._element.focus(),e._isTransitioning=!1,p(e._element).trigger(i)};if(n){var r=m.getTransitionDurationFromElement(this._dialog);p(this._dialog).one(m.TRANSITION_END,o).emulateTransitionEnd(r)}else o()},t._enforceFocus=function(){var e=this;p(document).off(nn.FOCUSIN).on(nn.FOCUSIN,function(t){document!==t.target&&e._element!==t.target&&0===p(e._element).has(t.target).length&&e._element.focus()})},t._setEscapeEvent=function(){var e=this;this._isShown&&this._config.keyboard?p(this._element).on(nn.KEYDOWN_DISMISS,function(t){27===t.which&&(t.preventDefault(),e.hide())}):this._isShown||p(this._element).off(nn.KEYDOWN_DISMISS)},t._setResizeEvent=function(){var e=this;this._isShown?p(window).on(nn.RESIZE,function(t){return e.handleUpdate(t)}):p(window).off(nn.RESIZE)},t._hideModal=function(){var t=this;this._element.style.display=\"none\",this._element.setAttribute(\"aria-hidden\",!0),this._element.removeAttribute(\"aria-modal\"),this._isTransitioning=!1,this._showBackdrop(function(){p(document.body).removeClass(an),t._resetAdjustments(),t._resetScrollbar(),p(t._element).trigger(nn.HIDDEN)})},t._removeBackdrop=function(){this._backdrop&&(p(this._backdrop).remove(),this._backdrop=null)},t._showBackdrop=function(t){var e=this,n=p(this._element).hasClass(ln)?ln:\"\";if(this._isShown&&this._config.backdrop){if(this._backdrop=document.createElement(\"div\"),this._backdrop.className=sn,n&&this._backdrop.classList.add(n),p(this._backdrop).appendTo(document.body),p(this._element).on(nn.CLICK_DISMISS,function(t){e._ignoreBackdropClick?e._ignoreBackdropClick=!1:t.target===t.currentTarget&&(\"static\"===e._config.backdrop?e._element.focus():e.hide())}),n&&m.reflow(this._backdrop),p(this._backdrop).addClass(cn),!t)return;if(!n)return void t();var i=m.getTransitionDurationFromElement(this._backdrop);p(this._backdrop).one(m.TRANSITION_END,t).emulateTransitionEnd(i)}else if(!this._isShown&&this._backdrop){p(this._backdrop).removeClass(cn);var o=function(){e._removeBackdrop(),t&&t()};if(p(this._element).hasClass(ln)){var r=m.getTransitionDurationFromElement(this._backdrop);p(this._backdrop).one(m.TRANSITION_END,o).emulateTransitionEnd(r)}else o()}else t&&t()},t._adjustDialog=function(){var t=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+\"px\"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+\"px\")},t._resetAdjustments=function(){this._element.style.paddingLeft=\"\",this._element.style.paddingRight=\"\"},t._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right<window.innerWidth,this._scrollbarWidth=this._getScrollbarWidth()},t._setScrollbar=function(){var o=this;if(this._isBodyOverflowing){var t=[].slice.call(document.querySelectorAll(pn)),e=[].slice.call(document.querySelectorAll(mn));p(t).each(function(t,e){var n=e.style.paddingRight,i=p(e).css(\"padding-right\");p(e).data(\"padding-right\",n).css(\"padding-right\",parseFloat(i)+o._scrollbarWidth+\"px\")}),p(e).each(function(t,e){var n=e.style.marginRight,i=p(e).css(\"margin-right\");p(e).data(\"margin-right\",n).css(\"margin-right\",parseFloat(i)-o._scrollbarWidth+\"px\")});var n=document.body.style.paddingRight,i=p(document.body).css(\"padding-right\");p(document.body).data(\"padding-right\",n).css(\"padding-right\",parseFloat(i)+this._scrollbarWidth+\"px\")}p(document.body).addClass(an)},t._resetScrollbar=function(){var t=[].slice.call(document.querySelectorAll(pn));p(t).each(function(t,e){var n=p(e).data(\"padding-right\");p(e).removeData(\"padding-right\"),e.style.paddingRight=n||\"\"});var e=[].slice.call(document.querySelectorAll(\"\"+mn));p(e).each(function(t,e){var n=p(e).data(\"margin-right\");\"undefined\"!=typeof n&&p(e).css(\"margin-right\",n).removeData(\"margin-right\")});var n=p(document.body).data(\"padding-right\");p(document.body).removeData(\"padding-right\"),document.body.style.paddingRight=n||\"\"},t._getScrollbarWidth=function(){var t=document.createElement(\"div\");t.className=rn,document.body.appendChild(t);var e=t.getBoundingClientRect().width-t.clientWidth;return document.body.removeChild(t),e},o._jQueryInterface=function(n,i){return this.each(function(){var t=p(this).data($e),e=l({},tn,p(this).data(),\"object\"==typeof n&&n?n:{});if(t||(t=new o(this,e),p(this).data($e,t)),\"string\"==typeof n){if(\"undefined\"==typeof t[n])throw new TypeError('No method named \"'+n+'\"');t[n](i)}else e.show&&t.show(i)})},s(o,null,[{key:\"VERSION\",get:function(){return\"4.3.1\"}},{key:\"Default\",get:function(){return tn}}]),o}();p(document).on(nn.CLICK_DATA_API,fn,function(t){var e,n=this,i=m.getSelectorFromElement(this);i&&(e=document.querySelector(i));var o=p(e).data($e)?\"toggle\":l({},p(e).data(),p(this).data());\"A\"!==this.tagName&&\"AREA\"!==this.tagName||t.preventDefault();var r=p(e).one(nn.SHOW,function(t){t.isDefaultPrevented()||r.one(nn.HIDDEN,function(){p(n).is(\":visible\")&&n.focus()})});gn._jQueryInterface.call(p(e),o,this)}),p.fn[Ge]=gn._jQueryInterface,p.fn[Ge].Constructor=gn,p.fn[Ge].noConflict=function(){return p.fn[Ge]=Ze,gn._jQueryInterface};var _n=[\"background\",\"cite\",\"href\",\"itemtype\",\"longdesc\",\"poster\",\"src\",\"xlink:href\"],vn={\"*\":[\"class\",\"dir\",\"id\",\"lang\",\"role\",/^aria-[\\w-]*$/i],a:[\"target\",\"href\",\"title\",\"rel\"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:[\"src\",\"alt\",\"title\",\"width\",\"height\"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},yn=/^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi,En=/^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i;function bn(t,s,e){if(0===t.length)return t;if(e&&\"function\"==typeof e)return e(t);for(var n=(new window.DOMParser).parseFromString(t,\"text/html\"),a=Object.keys(s),l=[].slice.call(n.body.querySelectorAll(\"*\")),i=function(t,e){var n=l[t],i=n.nodeName.toLowerCase();if(-1===a.indexOf(n.nodeName.toLowerCase()))return n.parentNode.removeChild(n),\"continue\";var o=[].slice.call(n.attributes),r=[].concat(s[\"*\"]||[],s[i]||[]);o.forEach(function(t){(function(t,e){var n=t.nodeName.toLowerCase();if(-1!==e.indexOf(n))return-1===_n.indexOf(n)||Boolean(t.nodeValue.match(yn)||t.nodeValue.match(En));for(var i=e.filter(function(t){return t instanceof RegExp}),o=0,r=i.length;o<r;o++)if(n.match(i[o]))return!0;return!1})(t,r)||n.removeAttribute(t.nodeName)})},o=0,r=l.length;o<r;o++)i(o);return n.body.innerHTML}var wn=\"tooltip\",Cn=\"bs.tooltip\",Tn=\".\"+Cn,Sn=p.fn[wn],Dn=\"bs-tooltip\",In=new RegExp(\"(^|\\\\s)\"+Dn+\"\\\\S+\",\"g\"),An=[\"sanitize\",\"whiteList\",\"sanitizeFn\"],On={animation:\"boolean\",template:\"string\",title:\"(string|element|function)\",trigger:\"string\",delay:\"(number|object)\",html:\"boolean\",selector:\"(string|boolean)\",placement:\"(string|function)\",offset:\"(number|string|function)\",container:\"(string|element|boolean)\",fallbackPlacement:\"(string|array)\",boundary:\"(string|element)\",sanitize:\"boolean\",sanitizeFn:\"(null|function)\",whiteList:\"object\"},Nn={AUTO:\"auto\",TOP:\"top\",RIGHT:\"right\",BOTTOM:\"bottom\",LEFT:\"left\"},kn={animation:!0,template:'<div class=\"tooltip\" role=\"tooltip\"><div class=\"arrow\"></div><div class=\"tooltip-inner\"></div></div>',trigger:\"hover focus\",title:\"\",delay:0,html:!1,selector:!1,placement:\"top\",offset:0,container:!1,fallbackPlacement:\"flip\",boundary:\"scrollParent\",sanitize:!0,sanitizeFn:null,whiteList:vn},Ln=\"show\",xn=\"out\",Pn={HIDE:\"hide\"+Tn,HIDDEN:\"hidden\"+Tn,SHOW:\"show\"+Tn,SHOWN:\"shown\"+Tn,INSERTED:\"inserted\"+Tn,CLICK:\"click\"+Tn,FOCUSIN:\"focusin\"+Tn,FOCUSOUT:\"focusout\"+Tn,MOUSEENTER:\"mouseenter\"+Tn,MOUSELEAVE:\"mouseleave\"+Tn},Hn=\"fade\",jn=\"show\",Rn=\".tooltip-inner\",Fn=\".arrow\",Mn=\"hover\",Wn=\"focus\",Un=\"click\",Bn=\"manual\",qn=function(){function i(t,e){if(\"undefined\"==typeof be)throw new TypeError(\"Bootstrap's tooltips require Popper.js (https://popper.js.org/)\");this._isEnabled=!0,this._timeout=0,this._hoverState=\"\",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var t=i.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=p(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),p(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(p(this.getTipElement()).hasClass(jn))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),p.removeData(this.element,this.constructor.DATA_KEY),p(this.element).off(this.constructor.EVENT_KEY),p(this.element).closest(\".modal\").off(\"hide.bs.modal\"),this.tip&&p(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if(\"none\"===p(this.element).css(\"display\"))throw new Error(\"Please use show on visible elements\");var t=p.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){p(this.element).trigger(t);var n=m.findShadowRoot(this.element),i=p.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!i)return;var o=this.getTipElement(),r=m.getUID(this.constructor.NAME);o.setAttribute(\"id\",r),this.element.setAttribute(\"aria-describedby\",r),this.setContent(),this.config.animation&&p(o).addClass(Hn);var s=\"function\"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();p(o).data(this.constructor.DATA_KEY,this),p.contains(this.element.ownerDocument.documentElement,this.tip)||p(o).appendTo(l),p(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new be(this.element,o,{placement:a,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:Fn},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}}),p(o).addClass(jn),\"ontouchstart\"in document.documentElement&&p(document.body).children().on(\"mouseover\",null,p.noop);var c=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,p(e.element).trigger(e.constructor.Event.SHOWN),t===xn&&e._leave(null,e)};if(p(this.tip).hasClass(Hn)){var h=m.getTransitionDurationFromElement(this.tip);p(this.tip).one(m.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},t.hide=function(t){var e=this,n=this.getTipElement(),i=p.Event(this.constructor.Event.HIDE),o=function(){e._hoverState!==Ln&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute(\"aria-describedby\"),p(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(p(this.element).trigger(i),!i.isDefaultPrevented()){if(p(n).removeClass(jn),\"ontouchstart\"in document.documentElement&&p(document.body).children().off(\"mouseover\",null,p.noop),this._activeTrigger[Un]=!1,this._activeTrigger[Wn]=!1,this._activeTrigger[Mn]=!1,p(this.tip).hasClass(Hn)){var r=m.getTransitionDurationFromElement(n);p(n).one(m.TRANSITION_END,o).emulateTransitionEnd(r)}else o();this._hoverState=\"\"}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(t){p(this.getTipElement()).addClass(Dn+\"-\"+t)},t.getTipElement=function(){return this.tip=this.tip||p(this.config.template)[0],this.tip},t.setContent=function(){var t=this.getTipElement();this.setElementContent(p(t.querySelectorAll(Rn)),this.getTitle()),p(t).removeClass(Hn+\" \"+jn)},t.setElementContent=function(t,e){\"object\"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=bn(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?p(e).parent().is(t)||t.empty().append(e):t.text(p(e).text())},t.getTitle=function(){var t=this.element.getAttribute(\"data-original-title\");return t||(t=\"function\"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},t._getOffset=function(){var e=this,t={};return\"function\"==typeof this.config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,e.config.offset(t.offsets,e.element)||{}),t}:t.offset=this.config.offset,t},t._getContainer=function(){return!1===this.config.container?document.body:m.isElement(this.config.container)?p(this.config.container):p(document).find(this.config.container)},t._getAttachment=function(t){return Nn[t.toUpperCase()]},t._setListeners=function(){var i=this;this.config.trigger.split(\" \").forEach(function(t){if(\"click\"===t)p(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(t){return i.toggle(t)});else if(t!==Bn){var e=t===Mn?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=t===Mn?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;p(i.element).on(e,i.config.selector,function(t){return i._enter(t)}).on(n,i.config.selector,function(t){return i._leave(t)})}}),p(this.element).closest(\".modal\").on(\"hide.bs.modal\",function(){i.element&&i.hide()}),this.config.selector?this.config=l({},this.config,{trigger:\"manual\",selector:\"\"}):this._fixTitle()},t._fixTitle=function(){var t=typeof this.element.getAttribute(\"data-original-title\");(this.element.getAttribute(\"title\")||\"string\"!==t)&&(this.element.setAttribute(\"data-original-title\",this.element.getAttribute(\"title\")||\"\"),this.element.setAttribute(\"title\",\"\"))},t._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||p(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),p(t.currentTarget).data(n,e)),t&&(e._activeTrigger[\"focusin\"===t.type?Wn:Mn]=!0),p(e.getTipElement()).hasClass(jn)||e._hoverState===Ln?e._hoverState=Ln:(clearTimeout(e._timeout),e._hoverState=Ln,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(function(){e._hoverState===Ln&&e.show()},e.config.delay.show):e.show())},t._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||p(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),p(t.currentTarget).data(n,e)),t&&(e._activeTrigger[\"focusout\"===t.type?Wn:Mn]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=xn,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(function(){e._hoverState===xn&&e.hide()},e.config.delay.hide):e.hide())},t._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},t._getConfig=function(t){var e=p(this.element).data();return Object.keys(e).forEach(function(t){-1!==An.indexOf(t)&&delete e[t]}),\"number\"==typeof(t=l({},this.constructor.Default,e,\"object\"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),\"number\"==typeof t.title&&(t.title=t.title.toString()),\"number\"==typeof t.content&&(t.content=t.content.toString()),m.typeCheckConfig(wn,t,this.constructor.DefaultType),t.sanitize&&(t.template=bn(t.template,t.whiteList,t.sanitizeFn)),t},t._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},t._cleanTipClass=function(){var t=p(this.getTipElement()),e=t.attr(\"class\").match(In);null!==e&&e.length&&t.removeClass(e.join(\"\"))},t._handlePopperPlacementChange=function(t){var e=t.instance;this.tip=e.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},t._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute(\"x-placement\")&&(p(t).removeClass(Hn),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},i._jQueryInterface=function(n){return this.each(function(){var t=p(this).data(Cn),e=\"object\"==typeof n&&n;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),p(this).data(Cn,t)),\"string\"==typeof n)){if(\"undefined\"==typeof t[n])throw new TypeError('No method named \"'+n+'\"');t[n]()}})},s(i,null,[{key:\"VERSION\",get:function(){return\"4.3.1\"}},{key:\"Default\",get:function(){return kn}},{key:\"NAME\",get:function(){return wn}},{key:\"DATA_KEY\",get:function(){return Cn}},{key:\"Event\",get:function(){return Pn}},{key:\"EVENT_KEY\",get:function(){return Tn}},{key:\"DefaultType\",get:function(){return On}}]),i}();p.fn[wn]=qn._jQueryInterface,p.fn[wn].Constructor=qn,p.fn[wn].noConflict=function(){return p.fn[wn]=Sn,qn._jQueryInterface};var Kn=\"popover\",Qn=\"bs.popover\",Vn=\".\"+Qn,Yn=p.fn[Kn],zn=\"bs-popover\",Xn=new RegExp(\"(^|\\\\s)\"+zn+\"\\\\S+\",\"g\"),Gn=l({},qn.Default,{placement:\"right\",trigger:\"click\",content:\"\",template:'<div class=\"popover\" role=\"tooltip\"><div class=\"arrow\"></div><h3 class=\"popover-header\"></h3><div class=\"popover-body\"></div></div>'}),$n=l({},qn.DefaultType,{content:\"(string|element|function)\"}),Jn=\"fade\",Zn=\"show\",ti=\".popover-header\",ei=\".popover-body\",ni={HIDE:\"hide\"+Vn,HIDDEN:\"hidden\"+Vn,SHOW:\"show\"+Vn,SHOWN:\"shown\"+Vn,INSERTED:\"inserted\"+Vn,CLICK:\"click\"+Vn,FOCUSIN:\"focusin\"+Vn,FOCUSOUT:\"focusout\"+Vn,MOUSEENTER:\"mouseenter\"+Vn,MOUSELEAVE:\"mouseleave\"+Vn},ii=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),(e.prototype.constructor=e).__proto__=n;var o=i.prototype;return o.isWithContent=function(){return this.getTitle()||this._getContent()},o.addAttachmentClass=function(t){p(this.getTipElement()).addClass(zn+\"-\"+t)},o.getTipElement=function(){return this.tip=this.tip||p(this.config.template)[0],this.tip},o.setContent=function(){var t=p(this.getTipElement());this.setElementContent(t.find(ti),this.getTitle());var e=this._getContent();\"function\"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(ei),e),t.removeClass(Jn+\" \"+Zn)},o._getContent=function(){return this.element.getAttribute(\"data-content\")||this.config.content},o._cleanTipClass=function(){var t=p(this.getTipElement()),e=t.attr(\"class\").match(Xn);null!==e&&0<e.length&&t.removeClass(e.join(\"\"))},i._jQueryInterface=function(n){return this.each(function(){var t=p(this).data(Qn),e=\"object\"==typeof n?n:null;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),p(this).data(Qn,t)),\"string\"==typeof n)){if(\"undefined\"==typeof t[n])throw new TypeError('No method named \"'+n+'\"');t[n]()}})},s(i,null,[{key:\"VERSION\",get:function(){return\"4.3.1\"}},{key:\"Default\",get:function(){return Gn}},{key:\"NAME\",get:function(){return Kn}},{key:\"DATA_KEY\",get:function(){return Qn}},{key:\"Event\",get:function(){return ni}},{key:\"EVENT_KEY\",get:function(){return Vn}},{key:\"DefaultType\",get:function(){return $n}}]),i}(qn);p.fn[Kn]=ii._jQueryInterface,p.fn[Kn].Constructor=ii,p.fn[Kn].noConflict=function(){return p.fn[Kn]=Yn,ii._jQueryInterface};var oi=\"scrollspy\",ri=\"bs.scrollspy\",si=\".\"+ri,ai=p.fn[oi],li={offset:10,method:\"auto\",target:\"\"},ci={offset:\"number\",method:\"string\",target:\"(string|element)\"},hi={ACTIVATE:\"activate\"+si,SCROLL:\"scroll\"+si,LOAD_DATA_API:\"load\"+si+\".data-api\"},ui=\"dropdown-item\",fi=\"active\",di='[data-spy=\"scroll\"]',pi=\".nav, .list-group\",mi=\".nav-link\",gi=\".nav-item\",_i=\".list-group-item\",vi=\".dropdown\",yi=\".dropdown-item\",Ei=\".dropdown-toggle\",bi=\"offset\",wi=\"position\",Ci=function(){function n(t,e){var n=this;this._element=t,this._scrollElement=\"BODY\"===t.tagName?window:t,this._config=this._getConfig(e),this._selector=this._config.target+\" \"+mi+\",\"+this._config.target+\" \"+_i+\",\"+this._config.target+\" \"+yi,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,p(this._scrollElement).on(hi.SCROLL,function(t){return n._process(t)}),this.refresh(),this._process()}var t=n.prototype;return t.refresh=function(){var e=this,t=this._scrollElement===this._scrollElement.window?bi:wi,o=\"auto\"===this._config.method?t:this._config.method,r=o===wi?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),[].slice.call(document.querySelectorAll(this._selector)).map(function(t){var e,n=m.getSelectorFromElement(t);if(n&&(e=document.querySelector(n)),e){var i=e.getBoundingClientRect();if(i.width||i.height)return[p(e)[o]().top+r,n]}return null}).filter(function(t){return t}).sort(function(t,e){return t[0]-e[0]}).forEach(function(t){e._offsets.push(t[0]),e._targets.push(t[1])})},t.dispose=function(){p.removeData(this._element,ri),p(this._scrollElement).off(si),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},t._getConfig=function(t){if(\"string\"!=typeof(t=l({},li,\"object\"==typeof t&&t?t:{})).target){var e=p(t.target).attr(\"id\");e||(e=m.getUID(oi),p(t.target).attr(\"id\",e)),t.target=\"#\"+e}return m.typeCheckConfig(oi,t,ci),t},t._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},t._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},t._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},t._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),n<=t){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t<this._offsets[0]&&0<this._offsets[0])return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;){this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&(\"undefined\"==typeof this._offsets[o+1]||t<this._offsets[o+1])&&this._activate(this._targets[o])}}},t._activate=function(e){this._activeTarget=e,this._clear();var t=this._selector.split(\",\").map(function(t){return t+'[data-target=\"'+e+'\"],'+t+'[href=\"'+e+'\"]'}),n=p([].slice.call(document.querySelectorAll(t.join(\",\"))));n.hasClass(ui)?(n.closest(vi).find(Ei).addClass(fi),n.addClass(fi)):(n.addClass(fi),n.parents(pi).prev(mi+\", \"+_i).addClass(fi),n.parents(pi).prev(gi).children(mi).addClass(fi)),p(this._scrollElement).trigger(hi.ACTIVATE,{relatedTarget:e})},t._clear=function(){[].slice.call(document.querySelectorAll(this._selector)).filter(function(t){return t.classList.contains(fi)}).forEach(function(t){return t.classList.remove(fi)})},n._jQueryInterface=function(e){return this.each(function(){var t=p(this).data(ri);if(t||(t=new n(this,\"object\"==typeof e&&e),p(this).data(ri,t)),\"string\"==typeof e){if(\"undefined\"==typeof t[e])throw new TypeError('No method named \"'+e+'\"');t[e]()}})},s(n,null,[{key:\"VERSION\",get:function(){return\"4.3.1\"}},{key:\"Default\",get:function(){return li}}]),n}();p(window).on(hi.LOAD_DATA_API,function(){for(var t=[].slice.call(document.querySelectorAll(di)),e=t.length;e--;){var n=p(t[e]);Ci._jQueryInterface.call(n,n.data())}}),p.fn[oi]=Ci._jQueryInterface,p.fn[oi].Constructor=Ci,p.fn[oi].noConflict=function(){return p.fn[oi]=ai,Ci._jQueryInterface};var Ti=\"bs.tab\",Si=\".\"+Ti,Di=p.fn.tab,Ii={HIDE:\"hide\"+Si,HIDDEN:\"hidden\"+Si,SHOW:\"show\"+Si,SHOWN:\"shown\"+Si,CLICK_DATA_API:\"click\"+Si+\".data-api\"},Ai=\"dropdown-menu\",Oi=\"active\",Ni=\"disabled\",ki=\"fade\",Li=\"show\",xi=\".dropdown\",Pi=\".nav, .list-group\",Hi=\".active\",ji=\"> li > .active\",Ri='[data-toggle=\"tab\"], [data-toggle=\"pill\"], [data-toggle=\"list\"]',Fi=\".dropdown-toggle\",Mi=\"> .dropdown-menu .active\",Wi=function(){function i(t){this._element=t}var t=i.prototype;return t.show=function(){var n=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&p(this._element).hasClass(Oi)||p(this._element).hasClass(Ni))){var t,i,e=p(this._element).closest(Pi)[0],o=m.getSelectorFromElement(this._element);if(e){var r=\"UL\"===e.nodeName||\"OL\"===e.nodeName?ji:Hi;i=(i=p.makeArray(p(e).find(r)))[i.length-1]}var s=p.Event(Ii.HIDE,{relatedTarget:this._element}),a=p.Event(Ii.SHOW,{relatedTarget:i});if(i&&p(i).trigger(s),p(this._element).trigger(a),!a.isDefaultPrevented()&&!s.isDefaultPrevented()){o&&(t=document.querySelector(o)),this._activate(this._element,e);var l=function(){var t=p.Event(Ii.HIDDEN,{relatedTarget:n._element}),e=p.Event(Ii.SHOWN,{relatedTarget:i});p(i).trigger(t),p(n._element).trigger(e)};t?this._activate(t,t.parentNode,l):l()}}},t.dispose=function(){p.removeData(this._element,Ti),this._element=null},t._activate=function(t,e,n){var i=this,o=(!e||\"UL\"!==e.nodeName&&\"OL\"!==e.nodeName?p(e).children(Hi):p(e).find(ji))[0],r=n&&o&&p(o).hasClass(ki),s=function(){return i._transitionComplete(t,o,n)};if(o&&r){var a=m.getTransitionDurationFromElement(o);p(o).removeClass(Li).one(m.TRANSITION_END,s).emulateTransitionEnd(a)}else s()},t._transitionComplete=function(t,e,n){if(e){p(e).removeClass(Oi);var i=p(e.parentNode).find(Mi)[0];i&&p(i).removeClass(Oi),\"tab\"===e.getAttribute(\"role\")&&e.setAttribute(\"aria-selected\",!1)}if(p(t).addClass(Oi),\"tab\"===t.getAttribute(\"role\")&&t.setAttribute(\"aria-selected\",!0),m.reflow(t),t.classList.contains(ki)&&t.classList.add(Li),t.parentNode&&p(t.parentNode).hasClass(Ai)){var o=p(t).closest(xi)[0];if(o){var r=[].slice.call(o.querySelectorAll(Fi));p(r).addClass(Oi)}t.setAttribute(\"aria-expanded\",!0)}n&&n()},i._jQueryInterface=function(n){return this.each(function(){var t=p(this),e=t.data(Ti);if(e||(e=new i(this),t.data(Ti,e)),\"string\"==typeof n){if(\"undefined\"==typeof e[n])throw new TypeError('No method named \"'+n+'\"');e[n]()}})},s(i,null,[{key:\"VERSION\",get:function(){return\"4.3.1\"}}]),i}();p(document).on(Ii.CLICK_DATA_API,Ri,function(t){t.preventDefault(),Wi._jQueryInterface.call(p(this),\"show\")}),p.fn.tab=Wi._jQueryInterface,p.fn.tab.Constructor=Wi,p.fn.tab.noConflict=function(){return p.fn.tab=Di,Wi._jQueryInterface};var Ui=\"toast\",Bi=\"bs.toast\",qi=\".\"+Bi,Ki=p.fn[Ui],Qi={CLICK_DISMISS:\"click.dismiss\"+qi,HIDE:\"hide\"+qi,HIDDEN:\"hidden\"+qi,SHOW:\"show\"+qi,SHOWN:\"shown\"+qi},Vi=\"fade\",Yi=\"hide\",zi=\"show\",Xi=\"showing\",Gi={animation:\"boolean\",autohide:\"boolean\",delay:\"number\"},$i={animation:!0,autohide:!0,delay:500},Ji='[data-dismiss=\"toast\"]',Zi=function(){function i(t,e){this._element=t,this._config=this._getConfig(e),this._timeout=null,this._setListeners()}var t=i.prototype;return t.show=function(){var t=this;p(this._element).trigger(Qi.SHOW),this._config.animation&&this._element.classList.add(Vi);var e=function(){t._element.classList.remove(Xi),t._element.classList.add(zi),p(t._element).trigger(Qi.SHOWN),t._config.autohide&&t.hide()};if(this._element.classList.remove(Yi),this._element.classList.add(Xi),this._config.animation){var n=m.getTransitionDurationFromElement(this._element);p(this._element).one(m.TRANSITION_END,e).emulateTransitionEnd(n)}else e()},t.hide=function(t){var e=this;this._element.classList.contains(zi)&&(p(this._element).trigger(Qi.HIDE),t?this._close():this._timeout=setTimeout(function(){e._close()},this._config.delay))},t.dispose=function(){clearTimeout(this._timeout),this._timeout=null,this._element.classList.contains(zi)&&this._element.classList.remove(zi),p(this._element).off(Qi.CLICK_DISMISS),p.removeData(this._element,Bi),this._element=null,this._config=null},t._getConfig=function(t){return t=l({},$i,p(this._element).data(),\"object\"==typeof t&&t?t:{}),m.typeCheckConfig(Ui,t,this.constructor.DefaultType),t},t._setListeners=function(){var t=this;p(this._element).on(Qi.CLICK_DISMISS,Ji,function(){return t.hide(!0)})},t._close=function(){var t=this,e=function(){t._element.classList.add(Yi),p(t._element).trigger(Qi.HIDDEN)};if(this._element.classList.remove(zi),this._config.animation){var n=m.getTransitionDurationFromElement(this._element);p(this._element).one(m.TRANSITION_END,e).emulateTransitionEnd(n)}else e()},i._jQueryInterface=function(n){return this.each(function(){var t=p(this),e=t.data(Bi);if(e||(e=new i(this,\"object\"==typeof n&&n),t.data(Bi,e)),\"string\"==typeof n){if(\"undefined\"==typeof e[n])throw new TypeError('No method named \"'+n+'\"');e[n](this)}})},s(i,null,[{key:\"VERSION\",get:function(){return\"4.3.1\"}},{key:\"DefaultType\",get:function(){return Gi}},{key:\"Default\",get:function(){return $i}}]),i}();p.fn[Ui]=Zi._jQueryInterface,p.fn[Ui].Constructor=Zi,p.fn[Ui].noConflict=function(){return p.fn[Ui]=Ki,Zi._jQueryInterface},function(){if(\"undefined\"==typeof p)throw new TypeError(\"Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.\");var t=p.fn.jquery.split(\" \")[0].split(\".\");if(t[0]<2&&t[1]<9||1===t[0]&&9===t[1]&&t[2]<1||4<=t[0])throw new Error(\"Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0\")}(),t.Util=m,t.Alert=g,t.Button=k,t.Carousel=at,t.Collapse=Ct,t.Dropdown=Xe,t.Modal=gn,t.Popover=ii,t.Scrollspy=Ci,t.Tab=Wi,t.Toast=Zi,t.Tooltip=qn,Object.defineProperty(t,\"__esModule\",{value:!0})});\n//# sourceMappingURL=bootstrap.bundle.min.js.map"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bootstrap4/js/bootstrap.bundle.min.js.map",
    "content": "{\"version\":3,\"sources\":[\"../../js/src/util.js\",\"../../js/src/alert.js\",\"../../js/src/button.js\",\"../../js/src/carousel.js\",\"../../js/src/collapse.js\",\"../../node_modules/popper.js/dist/esm/popper.js\",\"../../js/src/dropdown.js\",\"../../js/src/modal.js\",\"../../js/src/tools/sanitizer.js\",\"../../js/src/tooltip.js\",\"../../js/src/popover.js\",\"../../js/src/scrollspy.js\",\"../../js/src/tab.js\",\"../../js/src/toast.js\",\"../../js/src/index.js\"],\"names\":[\"TRANSITION_END\",\"transitionEndEmulator\",\"duration\",\"_this\",\"this\",\"called\",\"$\",\"one\",\"Util\",\"setTimeout\",\"triggerTransitionEnd\",\"getUID\",\"prefix\",\"Math\",\"random\",\"document\",\"getElementById\",\"getSelectorFromElement\",\"element\",\"selector\",\"getAttribute\",\"hrefAttr\",\"trim\",\"querySelector\",\"err\",\"getTransitionDurationFromElement\",\"transitionDuration\",\"css\",\"transitionDelay\",\"floatTransitionDuration\",\"parseFloat\",\"floatTransitionDelay\",\"split\",\"reflow\",\"offsetHeight\",\"trigger\",\"supportsTransitionEnd\",\"Boolean\",\"isElement\",\"obj\",\"nodeType\",\"typeCheckConfig\",\"componentName\",\"config\",\"configTypes\",\"property\",\"Object\",\"prototype\",\"hasOwnProperty\",\"call\",\"expectedTypes\",\"value\",\"valueType\",\"toString\",\"match\",\"toLowerCase\",\"RegExp\",\"test\",\"Error\",\"toUpperCase\",\"findShadowRoot\",\"documentElement\",\"attachShadow\",\"getRootNode\",\"ShadowRoot\",\"parentNode\",\"root\",\"fn\",\"emulateTransitionEnd\",\"event\",\"special\",\"bindType\",\"delegateType\",\"handle\",\"target\",\"is\",\"handleObj\",\"handler\",\"apply\",\"arguments\",\"NAME\",\"DATA_KEY\",\"EVENT_KEY\",\"JQUERY_NO_CONFLICT\",\"Event\",\"CLOSE\",\"CLOSED\",\"CLICK_DATA_API\",\"ClassName\",\"Alert\",\"_element\",\"close\",\"rootElement\",\"_getRootElement\",\"_triggerCloseEvent\",\"isDefaultPrevented\",\"_removeElement\",\"dispose\",\"removeData\",\"parent\",\"closest\",\"closeEvent\",\"removeClass\",\"hasClass\",\"_destroyElement\",\"detach\",\"remove\",\"_jQueryInterface\",\"each\",\"$element\",\"data\",\"_handleDismiss\",\"alertInstance\",\"preventDefault\",\"on\",\"Constructor\",\"noConflict\",\"DATA_API_KEY\",\"Selector\",\"FOCUS_BLUR_DATA_API\",\"Button\",\"toggle\",\"triggerChangeEvent\",\"addAriaPressed\",\"input\",\"type\",\"checked\",\"classList\",\"contains\",\"activeElement\",\"hasAttribute\",\"focus\",\"setAttribute\",\"toggleClass\",\"button\",\"Default\",\"interval\",\"keyboard\",\"slide\",\"pause\",\"wrap\",\"touch\",\"DefaultType\",\"Direction\",\"SLIDE\",\"SLID\",\"KEYDOWN\",\"MOUSEENTER\",\"MOUSELEAVE\",\"TOUCHSTART\",\"TOUCHMOVE\",\"TOUCHEND\",\"POINTERDOWN\",\"POINTERUP\",\"DRAG_START\",\"LOAD_DATA_API\",\"PointerType\",\"TOUCH\",\"PEN\",\"Carousel\",\"_items\",\"_interval\",\"_activeElement\",\"_isPaused\",\"_isSliding\",\"touchTimeout\",\"touchStartX\",\"touchDeltaX\",\"_config\",\"_getConfig\",\"_indicatorsElement\",\"_touchSupported\",\"navigator\",\"maxTouchPoints\",\"_pointerEvent\",\"window\",\"PointerEvent\",\"MSPointerEvent\",\"_addEventListeners\",\"next\",\"_slide\",\"nextWhenVisible\",\"hidden\",\"prev\",\"cycle\",\"clearInterval\",\"setInterval\",\"visibilityState\",\"bind\",\"to\",\"index\",\"activeIndex\",\"_getItemIndex\",\"length\",\"direction\",\"off\",\"_objectSpread\",\"_handleSwipe\",\"absDeltax\",\"abs\",\"_this2\",\"_keydown\",\"_addTouchEventListeners\",\"_this3\",\"start\",\"originalEvent\",\"pointerType\",\"clientX\",\"touches\",\"end\",\"clearTimeout\",\"querySelectorAll\",\"e\",\"add\",\"tagName\",\"which\",\"slice\",\"indexOf\",\"_getItemByDirection\",\"isNextDirection\",\"isPrevDirection\",\"lastItemIndex\",\"itemIndex\",\"_triggerSlideEvent\",\"relatedTarget\",\"eventDirectionName\",\"targetIndex\",\"fromIndex\",\"slideEvent\",\"from\",\"_setActiveIndicatorElement\",\"indicators\",\"nextIndicator\",\"children\",\"addClass\",\"directionalClassName\",\"orderClassName\",\"_this4\",\"activeElementIndex\",\"nextElement\",\"nextElementIndex\",\"isCycling\",\"slidEvent\",\"nextElementInterval\",\"parseInt\",\"defaultInterval\",\"action\",\"TypeError\",\"ride\",\"_dataApiClickHandler\",\"slideIndex\",\"carousels\",\"i\",\"len\",\"$carousel\",\"SHOW\",\"SHOWN\",\"HIDE\",\"HIDDEN\",\"Dimension\",\"Collapse\",\"_isTransitioning\",\"_triggerArray\",\"id\",\"toggleList\",\"elem\",\"filterElement\",\"filter\",\"foundElem\",\"_selector\",\"push\",\"_parent\",\"_getParent\",\"_addAriaAndCollapsedClass\",\"hide\",\"show\",\"actives\",\"activesData\",\"not\",\"startEvent\",\"dimension\",\"_getDimension\",\"style\",\"attr\",\"setTransitioning\",\"scrollSize\",\"getBoundingClientRect\",\"triggerArrayLength\",\"isTransitioning\",\"jquery\",\"_getTargetFromElement\",\"triggerArray\",\"isOpen\",\"$this\",\"currentTarget\",\"$trigger\",\"selectors\",\"$target\",\"isBrowser\",\"longerTimeoutBrowsers\",\"timeoutDuration\",\"userAgent\",\"debounce\",\"Promise\",\"resolve\",\"then\",\"scheduled\",\"isFunction\",\"functionToCheck\",\"getStyleComputedProperty\",\"ownerDocument\",\"defaultView\",\"getComputedStyle\",\"getParentNode\",\"nodeName\",\"host\",\"getScrollParent\",\"body\",\"_getStyleComputedProp\",\"overflow\",\"overflowX\",\"overflowY\",\"isIE11\",\"MSInputMethodContext\",\"documentMode\",\"isIE10\",\"isIE\",\"version\",\"getOffsetParent\",\"noOffsetParent\",\"offsetParent\",\"nextElementSibling\",\"getRoot\",\"node\",\"findCommonOffsetParent\",\"element1\",\"element2\",\"order\",\"compareDocumentPosition\",\"Node\",\"DOCUMENT_POSITION_FOLLOWING\",\"range\",\"createRange\",\"setStart\",\"setEnd\",\"commonAncestorContainer\",\"firstElementChild\",\"element1root\",\"getScroll\",\"upperSide\",\"undefined\",\"html\",\"scrollingElement\",\"getBordersSize\",\"styles\",\"axis\",\"sideA\",\"sideB\",\"getSize\",\"computedStyle\",\"max\",\"getWindowSizes\",\"height\",\"width\",\"createClass\",\"defineProperties\",\"props\",\"descriptor\",\"enumerable\",\"configurable\",\"writable\",\"defineProperty\",\"key\",\"protoProps\",\"staticProps\",\"_extends\",\"assign\",\"source\",\"getClientRect\",\"offsets\",\"right\",\"left\",\"bottom\",\"top\",\"rect\",\"scrollTop\",\"scrollLeft\",\"result\",\"sizes\",\"clientWidth\",\"clientHeight\",\"horizScrollbar\",\"offsetWidth\",\"vertScrollbar\",\"getOffsetRectRelativeToArbitraryNode\",\"fixedPosition\",\"isHTML\",\"childrenRect\",\"parentRect\",\"scrollParent\",\"borderTopWidth\",\"borderLeftWidth\",\"marginTop\",\"marginLeft\",\"subtract\",\"modifier\",\"includeScroll\",\"getFixedPositionOffsetParent\",\"parentElement\",\"el\",\"getBoundaries\",\"popper\",\"reference\",\"padding\",\"boundariesElement\",\"boundaries\",\"excludeScroll\",\"relativeOffset\",\"innerWidth\",\"innerHeight\",\"getViewportOffsetRectRelativeToArtbitraryNode\",\"boundariesNode\",\"isFixed\",\"_getWindowSizes\",\"isPaddingNumber\",\"computeAutoPlacement\",\"placement\",\"refRect\",\"rects\",\"sortedAreas\",\"keys\",\"map\",\"area\",\"_ref\",\"sort\",\"a\",\"b\",\"filteredAreas\",\"_ref2\",\"computedPlacement\",\"variation\",\"getReferenceOffsets\",\"state\",\"getOuterSizes\",\"x\",\"marginBottom\",\"y\",\"marginRight\",\"getOppositePlacement\",\"hash\",\"replace\",\"matched\",\"getPopperOffsets\",\"referenceOffsets\",\"popperRect\",\"popperOffsets\",\"isHoriz\",\"mainSide\",\"secondarySide\",\"measurement\",\"secondaryMeasurement\",\"find\",\"arr\",\"check\",\"Array\",\"runModifiers\",\"modifiers\",\"ends\",\"prop\",\"findIndex\",\"cur\",\"forEach\",\"console\",\"warn\",\"enabled\",\"isModifierEnabled\",\"modifierName\",\"some\",\"name\",\"getSupportedPropertyName\",\"prefixes\",\"upperProp\",\"charAt\",\"toCheck\",\"getWindow\",\"setupEventListeners\",\"options\",\"updateBound\",\"addEventListener\",\"passive\",\"scrollElement\",\"attachToScrollParents\",\"callback\",\"scrollParents\",\"isBody\",\"eventsEnabled\",\"disableEventListeners\",\"cancelAnimationFrame\",\"scheduleUpdate\",\"removeEventListener\",\"isNumeric\",\"n\",\"isNaN\",\"isFinite\",\"setStyles\",\"unit\",\"isFirefox\",\"isModifierRequired\",\"requestingName\",\"requestedName\",\"requesting\",\"isRequired\",\"_requesting\",\"requested\",\"placements\",\"validPlacements\",\"clockwise\",\"counter\",\"concat\",\"reverse\",\"BEHAVIORS\",\"parseOffset\",\"offset\",\"basePlacement\",\"useHeight\",\"fragments\",\"frag\",\"divider\",\"search\",\"splitRegex\",\"ops\",\"op\",\"mergeWithPrevious\",\"reduce\",\"str\",\"toValue\",\"index2\",\"Defaults\",\"positionFixed\",\"removeOnDestroy\",\"onCreate\",\"onUpdate\",\"shift\",\"shiftvariation\",\"_data$offsets\",\"isVertical\",\"side\",\"shiftOffsets\",\"preventOverflow\",\"instance\",\"transformProp\",\"popperStyles\",\"transform\",\"priority\",\"primary\",\"escapeWithReference\",\"secondary\",\"min\",\"keepTogether\",\"floor\",\"opSide\",\"arrow\",\"_data$offsets$arrow\",\"arrowElement\",\"sideCapitalized\",\"altSide\",\"arrowElementSize\",\"center\",\"popperMarginSide\",\"popperBorderSide\",\"sideValue\",\"round\",\"flip\",\"flipped\",\"originalPlacement\",\"placementOpposite\",\"flipOrder\",\"behavior\",\"step\",\"refOffsets\",\"overlapsRef\",\"overflowsLeft\",\"overflowsRight\",\"overflowsTop\",\"overflowsBottom\",\"overflowsBoundaries\",\"flippedVariation\",\"flipVariations\",\"inner\",\"subtractLength\",\"bound\",\"attributes\",\"computeStyle\",\"legacyGpuAccelerationOption\",\"gpuAcceleration\",\"shouldRound\",\"noRound\",\"referenceWidth\",\"popperWidth\",\"isVariation\",\"horizontalToInteger\",\"verticalToInteger\",\"offsetParentRect\",\"position\",\"devicePixelRatio\",\"v\",\"prefixedProperty\",\"willChange\",\"invertTop\",\"invertLeft\",\"x-placement\",\"arrowStyles\",\"applyStyle\",\"removeAttribute\",\"onLoad\",\"modifierOptions\",\"Popper\",\"classCallCheck\",\"requestAnimationFrame\",\"update\",\"isDestroyed\",\"isCreated\",\"enableEventListeners\",\"removeChild\",\"Utils\",\"global\",\"PopperUtils\",\"REGEXP_KEYDOWN\",\"ARROW_UP_KEYCODE\",\"CLICK\",\"KEYDOWN_DATA_API\",\"KEYUP_DATA_API\",\"AttachmentMap\",\"boundary\",\"display\",\"Dropdown\",\"_popper\",\"_menu\",\"_getMenuElement\",\"_inNavbar\",\"_detectNavbar\",\"disabled\",\"_getParentFromElement\",\"isActive\",\"_clearMenus\",\"showEvent\",\"referenceElement\",\"_getPopperConfig\",\"noop\",\"hideEvent\",\"destroy\",\"stopPropagation\",\"constructor\",\"_getPlacement\",\"$parentDropdown\",\"_getOffset\",\"popperConfig\",\"toggles\",\"context\",\"clickEvent\",\"dropdownMenu\",\"_dataApiKeydownHandler\",\"items\",\"backdrop\",\"FOCUSIN\",\"RESIZE\",\"CLICK_DISMISS\",\"KEYDOWN_DISMISS\",\"MOUSEUP_DISMISS\",\"MOUSEDOWN_DISMISS\",\"Modal\",\"_dialog\",\"_backdrop\",\"_isShown\",\"_isBodyOverflowing\",\"_ignoreBackdropClick\",\"_scrollbarWidth\",\"_checkScrollbar\",\"_setScrollbar\",\"_adjustDialog\",\"_setEscapeEvent\",\"_setResizeEvent\",\"_showBackdrop\",\"_showElement\",\"transition\",\"_hideModal\",\"htmlElement\",\"handleUpdate\",\"ELEMENT_NODE\",\"appendChild\",\"_enforceFocus\",\"shownEvent\",\"transitionComplete\",\"has\",\"_this5\",\"_this6\",\"_this7\",\"_resetAdjustments\",\"_resetScrollbar\",\"_removeBackdrop\",\"_this8\",\"animate\",\"createElement\",\"className\",\"appendTo\",\"backdropTransitionDuration\",\"callbackRemove\",\"isModalOverflowing\",\"scrollHeight\",\"paddingLeft\",\"paddingRight\",\"_getScrollbarWidth\",\"_this9\",\"fixedContent\",\"stickyContent\",\"actualPadding\",\"calculatedPadding\",\"actualMargin\",\"calculatedMargin\",\"elements\",\"margin\",\"scrollDiv\",\"scrollbarWidth\",\"_this10\",\"uriAttrs\",\"DefaultWhitelist\",\"*\",\"br\",\"col\",\"code\",\"div\",\"em\",\"hr\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"img\",\"li\",\"ol\",\"p\",\"pre\",\"s\",\"small\",\"span\",\"sub\",\"sup\",\"strong\",\"u\",\"ul\",\"SAFE_URL_PATTERN\",\"DATA_URL_PATTERN\",\"sanitizeHtml\",\"unsafeHtml\",\"whiteList\",\"sanitizeFn\",\"createdDocument\",\"DOMParser\",\"parseFromString\",\"whitelistKeys\",\"_loop\",\"elName\",\"attributeList\",\"whitelistedAttributes\",\"allowedAttributeList\",\"attrName\",\"nodeValue\",\"regExp\",\"attrRegex\",\"l\",\"allowedAttribute\",\"innerHTML\",\"CLASS_PREFIX\",\"BSCLS_PREFIX_REGEX\",\"DISALLOWED_ATTRIBUTES\",\"animation\",\"template\",\"title\",\"delay\",\"container\",\"fallbackPlacement\",\"sanitize\",\"AUTO\",\"TOP\",\"RIGHT\",\"BOTTOM\",\"LEFT\",\"HoverState\",\"INSERTED\",\"FOCUSOUT\",\"Trigger\",\"Tooltip\",\"_isEnabled\",\"_timeout\",\"_hoverState\",\"_activeTrigger\",\"tip\",\"_setListeners\",\"enable\",\"disable\",\"toggleEnabled\",\"dataKey\",\"_getDelegateConfig\",\"click\",\"_isWithActiveTrigger\",\"_enter\",\"_leave\",\"getTipElement\",\"isWithContent\",\"shadowRoot\",\"isInTheDom\",\"tipId\",\"setContent\",\"attachment\",\"_getAttachment\",\"addAttachmentClass\",\"_getContainer\",\"_handlePopperPlacementChange\",\"complete\",\"_fixTransition\",\"prevHoverState\",\"_cleanTipClass\",\"getTitle\",\"setElementContent\",\"content\",\"text\",\"empty\",\"append\",\"eventIn\",\"eventOut\",\"_fixTitle\",\"titleType\",\"dataAttributes\",\"dataAttr\",\"$tip\",\"tabClass\",\"join\",\"popperData\",\"popperInstance\",\"initConfigAnimation\",\"Popover\",\"_getContent\",\"method\",\"ACTIVATE\",\"SCROLL\",\"OffsetMethod\",\"ScrollSpy\",\"_scrollElement\",\"_offsets\",\"_targets\",\"_activeTarget\",\"_scrollHeight\",\"_process\",\"refresh\",\"autoMethod\",\"offsetMethod\",\"offsetBase\",\"_getScrollTop\",\"_getScrollHeight\",\"targetSelector\",\"targetBCR\",\"item\",\"pageYOffset\",\"_getOffsetHeight\",\"maxScroll\",\"_activate\",\"_clear\",\"queries\",\"$link\",\"parents\",\"scrollSpys\",\"$spy\",\"Tab\",\"previous\",\"listElement\",\"itemSelector\",\"makeArray\",\"hiddenEvent\",\"active\",\"_transitionComplete\",\"dropdownChild\",\"dropdownElement\",\"dropdownToggleList\",\"autohide\",\"Toast\",\"withoutTimeout\",\"_close\"],\"mappings\":\"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\",\"sourcesContent\":[\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): util.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Private TransitionEnd Helpers\\n * ------------------------------------------------------------------------\\n */\\n\\nconst TRANSITION_END = 'transitionend'\\nconst MAX_UID = 1000000\\nconst MILLISECONDS_MULTIPLIER = 1000\\n\\n// Shoutout AngusCroll (https://goo.gl/pxwQGp)\\nfunction toType(obj) {\\n  return {}.toString.call(obj).match(/\\\\s([a-z]+)/i)[1].toLowerCase()\\n}\\n\\nfunction getSpecialTransitionEndEvent() {\\n  return {\\n    bindType: TRANSITION_END,\\n    delegateType: TRANSITION_END,\\n    handle(event) {\\n      if ($(event.target).is(this)) {\\n        return event.handleObj.handler.apply(this, arguments) // eslint-disable-line prefer-rest-params\\n      }\\n      return undefined // eslint-disable-line no-undefined\\n    }\\n  }\\n}\\n\\nfunction transitionEndEmulator(duration) {\\n  let called = false\\n\\n  $(this).one(Util.TRANSITION_END, () => {\\n    called = true\\n  })\\n\\n  setTimeout(() => {\\n    if (!called) {\\n      Util.triggerTransitionEnd(this)\\n    }\\n  }, duration)\\n\\n  return this\\n}\\n\\nfunction setTransitionEndSupport() {\\n  $.fn.emulateTransitionEnd = transitionEndEmulator\\n  $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent()\\n}\\n\\n/**\\n * --------------------------------------------------------------------------\\n * Public Util Api\\n * --------------------------------------------------------------------------\\n */\\n\\nconst Util = {\\n\\n  TRANSITION_END: 'bsTransitionEnd',\\n\\n  getUID(prefix) {\\n    do {\\n      // eslint-disable-next-line no-bitwise\\n      prefix += ~~(Math.random() * MAX_UID) // \\\"~~\\\" acts like a faster Math.floor() here\\n    } while (document.getElementById(prefix))\\n    return prefix\\n  },\\n\\n  getSelectorFromElement(element) {\\n    let selector = element.getAttribute('data-target')\\n\\n    if (!selector || selector === '#') {\\n      const hrefAttr = element.getAttribute('href')\\n      selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : ''\\n    }\\n\\n    try {\\n      return document.querySelector(selector) ? selector : null\\n    } catch (err) {\\n      return null\\n    }\\n  },\\n\\n  getTransitionDurationFromElement(element) {\\n    if (!element) {\\n      return 0\\n    }\\n\\n    // Get transition-duration of the element\\n    let transitionDuration = $(element).css('transition-duration')\\n    let transitionDelay = $(element).css('transition-delay')\\n\\n    const floatTransitionDuration = parseFloat(transitionDuration)\\n    const floatTransitionDelay = parseFloat(transitionDelay)\\n\\n    // Return 0 if element or transition duration is not found\\n    if (!floatTransitionDuration && !floatTransitionDelay) {\\n      return 0\\n    }\\n\\n    // If multiple durations are defined, take the first\\n    transitionDuration = transitionDuration.split(',')[0]\\n    transitionDelay = transitionDelay.split(',')[0]\\n\\n    return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\\n  },\\n\\n  reflow(element) {\\n    return element.offsetHeight\\n  },\\n\\n  triggerTransitionEnd(element) {\\n    $(element).trigger(TRANSITION_END)\\n  },\\n\\n  // TODO: Remove in v5\\n  supportsTransitionEnd() {\\n    return Boolean(TRANSITION_END)\\n  },\\n\\n  isElement(obj) {\\n    return (obj[0] || obj).nodeType\\n  },\\n\\n  typeCheckConfig(componentName, config, configTypes) {\\n    for (const property in configTypes) {\\n      if (Object.prototype.hasOwnProperty.call(configTypes, property)) {\\n        const expectedTypes = configTypes[property]\\n        const value         = config[property]\\n        const valueType     = value && Util.isElement(value)\\n          ? 'element' : toType(value)\\n\\n        if (!new RegExp(expectedTypes).test(valueType)) {\\n          throw new Error(\\n            `${componentName.toUpperCase()}: ` +\\n            `Option \\\"${property}\\\" provided type \\\"${valueType}\\\" ` +\\n            `but expected type \\\"${expectedTypes}\\\".`)\\n        }\\n      }\\n    }\\n  },\\n\\n  findShadowRoot(element) {\\n    if (!document.documentElement.attachShadow) {\\n      return null\\n    }\\n\\n    // Can find the shadow root otherwise it'll return the document\\n    if (typeof element.getRootNode === 'function') {\\n      const root = element.getRootNode()\\n      return root instanceof ShadowRoot ? root : null\\n    }\\n\\n    if (element instanceof ShadowRoot) {\\n      return element\\n    }\\n\\n    // when we don't find a shadow root\\n    if (!element.parentNode) {\\n      return null\\n    }\\n\\n    return Util.findShadowRoot(element.parentNode)\\n  }\\n}\\n\\nsetTransitionEndSupport()\\n\\nexport default Util\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): alert.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\nimport Util from './util'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME                = 'alert'\\nconst VERSION             = '4.3.1'\\nconst DATA_KEY            = 'bs.alert'\\nconst EVENT_KEY           = `.${DATA_KEY}`\\nconst DATA_API_KEY        = '.data-api'\\nconst JQUERY_NO_CONFLICT  = $.fn[NAME]\\n\\nconst Selector = {\\n  DISMISS : '[data-dismiss=\\\"alert\\\"]'\\n}\\n\\nconst Event = {\\n  CLOSE          : `close${EVENT_KEY}`,\\n  CLOSED         : `closed${EVENT_KEY}`,\\n  CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\\n}\\n\\nconst ClassName = {\\n  ALERT : 'alert',\\n  FADE  : 'fade',\\n  SHOW  : 'show'\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass Alert {\\n  constructor(element) {\\n    this._element = element\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  // Public\\n\\n  close(element) {\\n    let rootElement = this._element\\n    if (element) {\\n      rootElement = this._getRootElement(element)\\n    }\\n\\n    const customEvent = this._triggerCloseEvent(rootElement)\\n\\n    if (customEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    this._removeElement(rootElement)\\n  }\\n\\n  dispose() {\\n    $.removeData(this._element, DATA_KEY)\\n    this._element = null\\n  }\\n\\n  // Private\\n\\n  _getRootElement(element) {\\n    const selector = Util.getSelectorFromElement(element)\\n    let parent     = false\\n\\n    if (selector) {\\n      parent = document.querySelector(selector)\\n    }\\n\\n    if (!parent) {\\n      parent = $(element).closest(`.${ClassName.ALERT}`)[0]\\n    }\\n\\n    return parent\\n  }\\n\\n  _triggerCloseEvent(element) {\\n    const closeEvent = $.Event(Event.CLOSE)\\n\\n    $(element).trigger(closeEvent)\\n    return closeEvent\\n  }\\n\\n  _removeElement(element) {\\n    $(element).removeClass(ClassName.SHOW)\\n\\n    if (!$(element).hasClass(ClassName.FADE)) {\\n      this._destroyElement(element)\\n      return\\n    }\\n\\n    const transitionDuration = Util.getTransitionDurationFromElement(element)\\n\\n    $(element)\\n      .one(Util.TRANSITION_END, (event) => this._destroyElement(element, event))\\n      .emulateTransitionEnd(transitionDuration)\\n  }\\n\\n  _destroyElement(element) {\\n    $(element)\\n      .detach()\\n      .trigger(Event.CLOSED)\\n      .remove()\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      const $element = $(this)\\n      let data       = $element.data(DATA_KEY)\\n\\n      if (!data) {\\n        data = new Alert(this)\\n        $element.data(DATA_KEY, data)\\n      }\\n\\n      if (config === 'close') {\\n        data[config](this)\\n      }\\n    })\\n  }\\n\\n  static _handleDismiss(alertInstance) {\\n    return function (event) {\\n      if (event) {\\n        event.preventDefault()\\n      }\\n\\n      alertInstance.close(this)\\n    }\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Data Api implementation\\n * ------------------------------------------------------------------------\\n */\\n\\n$(document).on(\\n  Event.CLICK_DATA_API,\\n  Selector.DISMISS,\\n  Alert._handleDismiss(new Alert())\\n)\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME]             = Alert._jQueryInterface\\n$.fn[NAME].Constructor = Alert\\n$.fn[NAME].noConflict  = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Alert._jQueryInterface\\n}\\n\\nexport default Alert\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): button.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME                = 'button'\\nconst VERSION             = '4.3.1'\\nconst DATA_KEY            = 'bs.button'\\nconst EVENT_KEY           = `.${DATA_KEY}`\\nconst DATA_API_KEY        = '.data-api'\\nconst JQUERY_NO_CONFLICT  = $.fn[NAME]\\n\\nconst ClassName = {\\n  ACTIVE : 'active',\\n  BUTTON : 'btn',\\n  FOCUS  : 'focus'\\n}\\n\\nconst Selector = {\\n  DATA_TOGGLE_CARROT : '[data-toggle^=\\\"button\\\"]',\\n  DATA_TOGGLE        : '[data-toggle=\\\"buttons\\\"]',\\n  INPUT              : 'input:not([type=\\\"hidden\\\"])',\\n  ACTIVE             : '.active',\\n  BUTTON             : '.btn'\\n}\\n\\nconst Event = {\\n  CLICK_DATA_API      : `click${EVENT_KEY}${DATA_API_KEY}`,\\n  FOCUS_BLUR_DATA_API : `focus${EVENT_KEY}${DATA_API_KEY} ` +\\n                          `blur${EVENT_KEY}${DATA_API_KEY}`\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass Button {\\n  constructor(element) {\\n    this._element = element\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  // Public\\n\\n  toggle() {\\n    let triggerChangeEvent = true\\n    let addAriaPressed = true\\n    const rootElement = $(this._element).closest(\\n      Selector.DATA_TOGGLE\\n    )[0]\\n\\n    if (rootElement) {\\n      const input = this._element.querySelector(Selector.INPUT)\\n\\n      if (input) {\\n        if (input.type === 'radio') {\\n          if (input.checked &&\\n            this._element.classList.contains(ClassName.ACTIVE)) {\\n            triggerChangeEvent = false\\n          } else {\\n            const activeElement = rootElement.querySelector(Selector.ACTIVE)\\n\\n            if (activeElement) {\\n              $(activeElement).removeClass(ClassName.ACTIVE)\\n            }\\n          }\\n        }\\n\\n        if (triggerChangeEvent) {\\n          if (input.hasAttribute('disabled') ||\\n            rootElement.hasAttribute('disabled') ||\\n            input.classList.contains('disabled') ||\\n            rootElement.classList.contains('disabled')) {\\n            return\\n          }\\n          input.checked = !this._element.classList.contains(ClassName.ACTIVE)\\n          $(input).trigger('change')\\n        }\\n\\n        input.focus()\\n        addAriaPressed = false\\n      }\\n    }\\n\\n    if (addAriaPressed) {\\n      this._element.setAttribute('aria-pressed',\\n        !this._element.classList.contains(ClassName.ACTIVE))\\n    }\\n\\n    if (triggerChangeEvent) {\\n      $(this._element).toggleClass(ClassName.ACTIVE)\\n    }\\n  }\\n\\n  dispose() {\\n    $.removeData(this._element, DATA_KEY)\\n    this._element = null\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      let data = $(this).data(DATA_KEY)\\n\\n      if (!data) {\\n        data = new Button(this)\\n        $(this).data(DATA_KEY, data)\\n      }\\n\\n      if (config === 'toggle') {\\n        data[config]()\\n      }\\n    })\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Data Api implementation\\n * ------------------------------------------------------------------------\\n */\\n\\n$(document)\\n  .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {\\n    event.preventDefault()\\n\\n    let button = event.target\\n\\n    if (!$(button).hasClass(ClassName.BUTTON)) {\\n      button = $(button).closest(Selector.BUTTON)\\n    }\\n\\n    Button._jQueryInterface.call($(button), 'toggle')\\n  })\\n  .on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {\\n    const button = $(event.target).closest(Selector.BUTTON)[0]\\n    $(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type))\\n  })\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME] = Button._jQueryInterface\\n$.fn[NAME].Constructor = Button\\n$.fn[NAME].noConflict = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Button._jQueryInterface\\n}\\n\\nexport default Button\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): carousel.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\nimport Util from './util'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME                   = 'carousel'\\nconst VERSION                = '4.3.1'\\nconst DATA_KEY               = 'bs.carousel'\\nconst EVENT_KEY              = `.${DATA_KEY}`\\nconst DATA_API_KEY           = '.data-api'\\nconst JQUERY_NO_CONFLICT     = $.fn[NAME]\\nconst ARROW_LEFT_KEYCODE     = 37 // KeyboardEvent.which value for left arrow key\\nconst ARROW_RIGHT_KEYCODE    = 39 // KeyboardEvent.which value for right arrow key\\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\\nconst SWIPE_THRESHOLD        = 40\\n\\nconst Default = {\\n  interval : 5000,\\n  keyboard : true,\\n  slide    : false,\\n  pause    : 'hover',\\n  wrap     : true,\\n  touch    : true\\n}\\n\\nconst DefaultType = {\\n  interval : '(number|boolean)',\\n  keyboard : 'boolean',\\n  slide    : '(boolean|string)',\\n  pause    : '(string|boolean)',\\n  wrap     : 'boolean',\\n  touch    : 'boolean'\\n}\\n\\nconst Direction = {\\n  NEXT     : 'next',\\n  PREV     : 'prev',\\n  LEFT     : 'left',\\n  RIGHT    : 'right'\\n}\\n\\nconst Event = {\\n  SLIDE          : `slide${EVENT_KEY}`,\\n  SLID           : `slid${EVENT_KEY}`,\\n  KEYDOWN        : `keydown${EVENT_KEY}`,\\n  MOUSEENTER     : `mouseenter${EVENT_KEY}`,\\n  MOUSELEAVE     : `mouseleave${EVENT_KEY}`,\\n  TOUCHSTART     : `touchstart${EVENT_KEY}`,\\n  TOUCHMOVE      : `touchmove${EVENT_KEY}`,\\n  TOUCHEND       : `touchend${EVENT_KEY}`,\\n  POINTERDOWN    : `pointerdown${EVENT_KEY}`,\\n  POINTERUP      : `pointerup${EVENT_KEY}`,\\n  DRAG_START     : `dragstart${EVENT_KEY}`,\\n  LOAD_DATA_API  : `load${EVENT_KEY}${DATA_API_KEY}`,\\n  CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\\n}\\n\\nconst ClassName = {\\n  CAROUSEL      : 'carousel',\\n  ACTIVE        : 'active',\\n  SLIDE         : 'slide',\\n  RIGHT         : 'carousel-item-right',\\n  LEFT          : 'carousel-item-left',\\n  NEXT          : 'carousel-item-next',\\n  PREV          : 'carousel-item-prev',\\n  ITEM          : 'carousel-item',\\n  POINTER_EVENT : 'pointer-event'\\n}\\n\\nconst Selector = {\\n  ACTIVE      : '.active',\\n  ACTIVE_ITEM : '.active.carousel-item',\\n  ITEM        : '.carousel-item',\\n  ITEM_IMG    : '.carousel-item img',\\n  NEXT_PREV   : '.carousel-item-next, .carousel-item-prev',\\n  INDICATORS  : '.carousel-indicators',\\n  DATA_SLIDE  : '[data-slide], [data-slide-to]',\\n  DATA_RIDE   : '[data-ride=\\\"carousel\\\"]'\\n}\\n\\nconst PointerType = {\\n  TOUCH : 'touch',\\n  PEN   : 'pen'\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\nclass Carousel {\\n  constructor(element, config) {\\n    this._items         = null\\n    this._interval      = null\\n    this._activeElement = null\\n    this._isPaused      = false\\n    this._isSliding     = false\\n    this.touchTimeout   = null\\n    this.touchStartX    = 0\\n    this.touchDeltaX    = 0\\n\\n    this._config            = this._getConfig(config)\\n    this._element           = element\\n    this._indicatorsElement = this._element.querySelector(Selector.INDICATORS)\\n    this._touchSupported    = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\\n    this._pointerEvent      = Boolean(window.PointerEvent || window.MSPointerEvent)\\n\\n    this._addEventListeners()\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  static get Default() {\\n    return Default\\n  }\\n\\n  // Public\\n\\n  next() {\\n    if (!this._isSliding) {\\n      this._slide(Direction.NEXT)\\n    }\\n  }\\n\\n  nextWhenVisible() {\\n    // Don't call next when the page isn't visible\\n    // or the carousel or its parent isn't visible\\n    if (!document.hidden &&\\n      ($(this._element).is(':visible') && $(this._element).css('visibility') !== 'hidden')) {\\n      this.next()\\n    }\\n  }\\n\\n  prev() {\\n    if (!this._isSliding) {\\n      this._slide(Direction.PREV)\\n    }\\n  }\\n\\n  pause(event) {\\n    if (!event) {\\n      this._isPaused = true\\n    }\\n\\n    if (this._element.querySelector(Selector.NEXT_PREV)) {\\n      Util.triggerTransitionEnd(this._element)\\n      this.cycle(true)\\n    }\\n\\n    clearInterval(this._interval)\\n    this._interval = null\\n  }\\n\\n  cycle(event) {\\n    if (!event) {\\n      this._isPaused = false\\n    }\\n\\n    if (this._interval) {\\n      clearInterval(this._interval)\\n      this._interval = null\\n    }\\n\\n    if (this._config.interval && !this._isPaused) {\\n      this._interval = setInterval(\\n        (document.visibilityState ? this.nextWhenVisible : this.next).bind(this),\\n        this._config.interval\\n      )\\n    }\\n  }\\n\\n  to(index) {\\n    this._activeElement = this._element.querySelector(Selector.ACTIVE_ITEM)\\n\\n    const activeIndex = this._getItemIndex(this._activeElement)\\n\\n    if (index > this._items.length - 1 || index < 0) {\\n      return\\n    }\\n\\n    if (this._isSliding) {\\n      $(this._element).one(Event.SLID, () => this.to(index))\\n      return\\n    }\\n\\n    if (activeIndex === index) {\\n      this.pause()\\n      this.cycle()\\n      return\\n    }\\n\\n    const direction = index > activeIndex\\n      ? Direction.NEXT\\n      : Direction.PREV\\n\\n    this._slide(direction, this._items[index])\\n  }\\n\\n  dispose() {\\n    $(this._element).off(EVENT_KEY)\\n    $.removeData(this._element, DATA_KEY)\\n\\n    this._items             = null\\n    this._config            = null\\n    this._element           = null\\n    this._interval          = null\\n    this._isPaused          = null\\n    this._isSliding         = null\\n    this._activeElement     = null\\n    this._indicatorsElement = null\\n  }\\n\\n  // Private\\n\\n  _getConfig(config) {\\n    config = {\\n      ...Default,\\n      ...config\\n    }\\n    Util.typeCheckConfig(NAME, config, DefaultType)\\n    return config\\n  }\\n\\n  _handleSwipe() {\\n    const absDeltax = Math.abs(this.touchDeltaX)\\n\\n    if (absDeltax <= SWIPE_THRESHOLD) {\\n      return\\n    }\\n\\n    const direction = absDeltax / this.touchDeltaX\\n\\n    // swipe left\\n    if (direction > 0) {\\n      this.prev()\\n    }\\n\\n    // swipe right\\n    if (direction < 0) {\\n      this.next()\\n    }\\n  }\\n\\n  _addEventListeners() {\\n    if (this._config.keyboard) {\\n      $(this._element)\\n        .on(Event.KEYDOWN, (event) => this._keydown(event))\\n    }\\n\\n    if (this._config.pause === 'hover') {\\n      $(this._element)\\n        .on(Event.MOUSEENTER, (event) => this.pause(event))\\n        .on(Event.MOUSELEAVE, (event) => this.cycle(event))\\n    }\\n\\n    if (this._config.touch) {\\n      this._addTouchEventListeners()\\n    }\\n  }\\n\\n  _addTouchEventListeners() {\\n    if (!this._touchSupported) {\\n      return\\n    }\\n\\n    const start = (event) => {\\n      if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\\n        this.touchStartX = event.originalEvent.clientX\\n      } else if (!this._pointerEvent) {\\n        this.touchStartX = event.originalEvent.touches[0].clientX\\n      }\\n    }\\n\\n    const move = (event) => {\\n      // ensure swiping with one touch and not pinching\\n      if (event.originalEvent.touches && event.originalEvent.touches.length > 1) {\\n        this.touchDeltaX = 0\\n      } else {\\n        this.touchDeltaX = event.originalEvent.touches[0].clientX - this.touchStartX\\n      }\\n    }\\n\\n    const end = (event) => {\\n      if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\\n        this.touchDeltaX = event.originalEvent.clientX - this.touchStartX\\n      }\\n\\n      this._handleSwipe()\\n      if (this._config.pause === 'hover') {\\n        // If it's a touch-enabled device, mouseenter/leave are fired as\\n        // part of the mouse compatibility events on first tap - the carousel\\n        // would stop cycling until user tapped out of it;\\n        // here, we listen for touchend, explicitly pause the carousel\\n        // (as if it's the second time we tap on it, mouseenter compat event\\n        // is NOT fired) and after a timeout (to allow for mouse compatibility\\n        // events to fire) we explicitly restart cycling\\n\\n        this.pause()\\n        if (this.touchTimeout) {\\n          clearTimeout(this.touchTimeout)\\n        }\\n        this.touchTimeout = setTimeout((event) => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\\n      }\\n    }\\n\\n    $(this._element.querySelectorAll(Selector.ITEM_IMG)).on(Event.DRAG_START, (e) => e.preventDefault())\\n    if (this._pointerEvent) {\\n      $(this._element).on(Event.POINTERDOWN, (event) => start(event))\\n      $(this._element).on(Event.POINTERUP, (event) => end(event))\\n\\n      this._element.classList.add(ClassName.POINTER_EVENT)\\n    } else {\\n      $(this._element).on(Event.TOUCHSTART, (event) => start(event))\\n      $(this._element).on(Event.TOUCHMOVE, (event) => move(event))\\n      $(this._element).on(Event.TOUCHEND, (event) => end(event))\\n    }\\n  }\\n\\n  _keydown(event) {\\n    if (/input|textarea/i.test(event.target.tagName)) {\\n      return\\n    }\\n\\n    switch (event.which) {\\n      case ARROW_LEFT_KEYCODE:\\n        event.preventDefault()\\n        this.prev()\\n        break\\n      case ARROW_RIGHT_KEYCODE:\\n        event.preventDefault()\\n        this.next()\\n        break\\n      default:\\n    }\\n  }\\n\\n  _getItemIndex(element) {\\n    this._items = element && element.parentNode\\n      ? [].slice.call(element.parentNode.querySelectorAll(Selector.ITEM))\\n      : []\\n    return this._items.indexOf(element)\\n  }\\n\\n  _getItemByDirection(direction, activeElement) {\\n    const isNextDirection = direction === Direction.NEXT\\n    const isPrevDirection = direction === Direction.PREV\\n    const activeIndex     = this._getItemIndex(activeElement)\\n    const lastItemIndex   = this._items.length - 1\\n    const isGoingToWrap   = isPrevDirection && activeIndex === 0 ||\\n                            isNextDirection && activeIndex === lastItemIndex\\n\\n    if (isGoingToWrap && !this._config.wrap) {\\n      return activeElement\\n    }\\n\\n    const delta     = direction === Direction.PREV ? -1 : 1\\n    const itemIndex = (activeIndex + delta) % this._items.length\\n\\n    return itemIndex === -1\\n      ? this._items[this._items.length - 1] : this._items[itemIndex]\\n  }\\n\\n  _triggerSlideEvent(relatedTarget, eventDirectionName) {\\n    const targetIndex = this._getItemIndex(relatedTarget)\\n    const fromIndex = this._getItemIndex(this._element.querySelector(Selector.ACTIVE_ITEM))\\n    const slideEvent = $.Event(Event.SLIDE, {\\n      relatedTarget,\\n      direction: eventDirectionName,\\n      from: fromIndex,\\n      to: targetIndex\\n    })\\n\\n    $(this._element).trigger(slideEvent)\\n\\n    return slideEvent\\n  }\\n\\n  _setActiveIndicatorElement(element) {\\n    if (this._indicatorsElement) {\\n      const indicators = [].slice.call(this._indicatorsElement.querySelectorAll(Selector.ACTIVE))\\n      $(indicators)\\n        .removeClass(ClassName.ACTIVE)\\n\\n      const nextIndicator = this._indicatorsElement.children[\\n        this._getItemIndex(element)\\n      ]\\n\\n      if (nextIndicator) {\\n        $(nextIndicator).addClass(ClassName.ACTIVE)\\n      }\\n    }\\n  }\\n\\n  _slide(direction, element) {\\n    const activeElement = this._element.querySelector(Selector.ACTIVE_ITEM)\\n    const activeElementIndex = this._getItemIndex(activeElement)\\n    const nextElement   = element || activeElement &&\\n      this._getItemByDirection(direction, activeElement)\\n    const nextElementIndex = this._getItemIndex(nextElement)\\n    const isCycling = Boolean(this._interval)\\n\\n    let directionalClassName\\n    let orderClassName\\n    let eventDirectionName\\n\\n    if (direction === Direction.NEXT) {\\n      directionalClassName = ClassName.LEFT\\n      orderClassName = ClassName.NEXT\\n      eventDirectionName = Direction.LEFT\\n    } else {\\n      directionalClassName = ClassName.RIGHT\\n      orderClassName = ClassName.PREV\\n      eventDirectionName = Direction.RIGHT\\n    }\\n\\n    if (nextElement && $(nextElement).hasClass(ClassName.ACTIVE)) {\\n      this._isSliding = false\\n      return\\n    }\\n\\n    const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName)\\n    if (slideEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    if (!activeElement || !nextElement) {\\n      // Some weirdness is happening, so we bail\\n      return\\n    }\\n\\n    this._isSliding = true\\n\\n    if (isCycling) {\\n      this.pause()\\n    }\\n\\n    this._setActiveIndicatorElement(nextElement)\\n\\n    const slidEvent = $.Event(Event.SLID, {\\n      relatedTarget: nextElement,\\n      direction: eventDirectionName,\\n      from: activeElementIndex,\\n      to: nextElementIndex\\n    })\\n\\n    if ($(this._element).hasClass(ClassName.SLIDE)) {\\n      $(nextElement).addClass(orderClassName)\\n\\n      Util.reflow(nextElement)\\n\\n      $(activeElement).addClass(directionalClassName)\\n      $(nextElement).addClass(directionalClassName)\\n\\n      const nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10)\\n      if (nextElementInterval) {\\n        this._config.defaultInterval = this._config.defaultInterval || this._config.interval\\n        this._config.interval = nextElementInterval\\n      } else {\\n        this._config.interval = this._config.defaultInterval || this._config.interval\\n      }\\n\\n      const transitionDuration = Util.getTransitionDurationFromElement(activeElement)\\n\\n      $(activeElement)\\n        .one(Util.TRANSITION_END, () => {\\n          $(nextElement)\\n            .removeClass(`${directionalClassName} ${orderClassName}`)\\n            .addClass(ClassName.ACTIVE)\\n\\n          $(activeElement).removeClass(`${ClassName.ACTIVE} ${orderClassName} ${directionalClassName}`)\\n\\n          this._isSliding = false\\n\\n          setTimeout(() => $(this._element).trigger(slidEvent), 0)\\n        })\\n        .emulateTransitionEnd(transitionDuration)\\n    } else {\\n      $(activeElement).removeClass(ClassName.ACTIVE)\\n      $(nextElement).addClass(ClassName.ACTIVE)\\n\\n      this._isSliding = false\\n      $(this._element).trigger(slidEvent)\\n    }\\n\\n    if (isCycling) {\\n      this.cycle()\\n    }\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      let data = $(this).data(DATA_KEY)\\n      let _config = {\\n        ...Default,\\n        ...$(this).data()\\n      }\\n\\n      if (typeof config === 'object') {\\n        _config = {\\n          ..._config,\\n          ...config\\n        }\\n      }\\n\\n      const action = typeof config === 'string' ? config : _config.slide\\n\\n      if (!data) {\\n        data = new Carousel(this, _config)\\n        $(this).data(DATA_KEY, data)\\n      }\\n\\n      if (typeof config === 'number') {\\n        data.to(config)\\n      } else if (typeof action === 'string') {\\n        if (typeof data[action] === 'undefined') {\\n          throw new TypeError(`No method named \\\"${action}\\\"`)\\n        }\\n        data[action]()\\n      } else if (_config.interval && _config.ride) {\\n        data.pause()\\n        data.cycle()\\n      }\\n    })\\n  }\\n\\n  static _dataApiClickHandler(event) {\\n    const selector = Util.getSelectorFromElement(this)\\n\\n    if (!selector) {\\n      return\\n    }\\n\\n    const target = $(selector)[0]\\n\\n    if (!target || !$(target).hasClass(ClassName.CAROUSEL)) {\\n      return\\n    }\\n\\n    const config = {\\n      ...$(target).data(),\\n      ...$(this).data()\\n    }\\n    const slideIndex = this.getAttribute('data-slide-to')\\n\\n    if (slideIndex) {\\n      config.interval = false\\n    }\\n\\n    Carousel._jQueryInterface.call($(target), config)\\n\\n    if (slideIndex) {\\n      $(target).data(DATA_KEY).to(slideIndex)\\n    }\\n\\n    event.preventDefault()\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Data Api implementation\\n * ------------------------------------------------------------------------\\n */\\n\\n$(document)\\n  .on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler)\\n\\n$(window).on(Event.LOAD_DATA_API, () => {\\n  const carousels = [].slice.call(document.querySelectorAll(Selector.DATA_RIDE))\\n  for (let i = 0, len = carousels.length; i < len; i++) {\\n    const $carousel = $(carousels[i])\\n    Carousel._jQueryInterface.call($carousel, $carousel.data())\\n  }\\n})\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME] = Carousel._jQueryInterface\\n$.fn[NAME].Constructor = Carousel\\n$.fn[NAME].noConflict = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Carousel._jQueryInterface\\n}\\n\\nexport default Carousel\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): collapse.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\nimport Util from './util'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME                = 'collapse'\\nconst VERSION             = '4.3.1'\\nconst DATA_KEY            = 'bs.collapse'\\nconst EVENT_KEY           = `.${DATA_KEY}`\\nconst DATA_API_KEY        = '.data-api'\\nconst JQUERY_NO_CONFLICT  = $.fn[NAME]\\n\\nconst Default = {\\n  toggle : true,\\n  parent : ''\\n}\\n\\nconst DefaultType = {\\n  toggle : 'boolean',\\n  parent : '(string|element)'\\n}\\n\\nconst Event = {\\n  SHOW           : `show${EVENT_KEY}`,\\n  SHOWN          : `shown${EVENT_KEY}`,\\n  HIDE           : `hide${EVENT_KEY}`,\\n  HIDDEN         : `hidden${EVENT_KEY}`,\\n  CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\\n}\\n\\nconst ClassName = {\\n  SHOW       : 'show',\\n  COLLAPSE   : 'collapse',\\n  COLLAPSING : 'collapsing',\\n  COLLAPSED  : 'collapsed'\\n}\\n\\nconst Dimension = {\\n  WIDTH  : 'width',\\n  HEIGHT : 'height'\\n}\\n\\nconst Selector = {\\n  ACTIVES     : '.show, .collapsing',\\n  DATA_TOGGLE : '[data-toggle=\\\"collapse\\\"]'\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass Collapse {\\n  constructor(element, config) {\\n    this._isTransitioning = false\\n    this._element         = element\\n    this._config          = this._getConfig(config)\\n    this._triggerArray    = [].slice.call(document.querySelectorAll(\\n      `[data-toggle=\\\"collapse\\\"][href=\\\"#${element.id}\\\"],` +\\n      `[data-toggle=\\\"collapse\\\"][data-target=\\\"#${element.id}\\\"]`\\n    ))\\n\\n    const toggleList = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE))\\n    for (let i = 0, len = toggleList.length; i < len; i++) {\\n      const elem = toggleList[i]\\n      const selector = Util.getSelectorFromElement(elem)\\n      const filterElement = [].slice.call(document.querySelectorAll(selector))\\n        .filter((foundElem) => foundElem === element)\\n\\n      if (selector !== null && filterElement.length > 0) {\\n        this._selector = selector\\n        this._triggerArray.push(elem)\\n      }\\n    }\\n\\n    this._parent = this._config.parent ? this._getParent() : null\\n\\n    if (!this._config.parent) {\\n      this._addAriaAndCollapsedClass(this._element, this._triggerArray)\\n    }\\n\\n    if (this._config.toggle) {\\n      this.toggle()\\n    }\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  static get Default() {\\n    return Default\\n  }\\n\\n  // Public\\n\\n  toggle() {\\n    if ($(this._element).hasClass(ClassName.SHOW)) {\\n      this.hide()\\n    } else {\\n      this.show()\\n    }\\n  }\\n\\n  show() {\\n    if (this._isTransitioning ||\\n      $(this._element).hasClass(ClassName.SHOW)) {\\n      return\\n    }\\n\\n    let actives\\n    let activesData\\n\\n    if (this._parent) {\\n      actives = [].slice.call(this._parent.querySelectorAll(Selector.ACTIVES))\\n        .filter((elem) => {\\n          if (typeof this._config.parent === 'string') {\\n            return elem.getAttribute('data-parent') === this._config.parent\\n          }\\n\\n          return elem.classList.contains(ClassName.COLLAPSE)\\n        })\\n\\n      if (actives.length === 0) {\\n        actives = null\\n      }\\n    }\\n\\n    if (actives) {\\n      activesData = $(actives).not(this._selector).data(DATA_KEY)\\n      if (activesData && activesData._isTransitioning) {\\n        return\\n      }\\n    }\\n\\n    const startEvent = $.Event(Event.SHOW)\\n    $(this._element).trigger(startEvent)\\n    if (startEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    if (actives) {\\n      Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide')\\n      if (!activesData) {\\n        $(actives).data(DATA_KEY, null)\\n      }\\n    }\\n\\n    const dimension = this._getDimension()\\n\\n    $(this._element)\\n      .removeClass(ClassName.COLLAPSE)\\n      .addClass(ClassName.COLLAPSING)\\n\\n    this._element.style[dimension] = 0\\n\\n    if (this._triggerArray.length) {\\n      $(this._triggerArray)\\n        .removeClass(ClassName.COLLAPSED)\\n        .attr('aria-expanded', true)\\n    }\\n\\n    this.setTransitioning(true)\\n\\n    const complete = () => {\\n      $(this._element)\\n        .removeClass(ClassName.COLLAPSING)\\n        .addClass(ClassName.COLLAPSE)\\n        .addClass(ClassName.SHOW)\\n\\n      this._element.style[dimension] = ''\\n\\n      this.setTransitioning(false)\\n\\n      $(this._element).trigger(Event.SHOWN)\\n    }\\n\\n    const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\\n    const scrollSize = `scroll${capitalizedDimension}`\\n    const transitionDuration = Util.getTransitionDurationFromElement(this._element)\\n\\n    $(this._element)\\n      .one(Util.TRANSITION_END, complete)\\n      .emulateTransitionEnd(transitionDuration)\\n\\n    this._element.style[dimension] = `${this._element[scrollSize]}px`\\n  }\\n\\n  hide() {\\n    if (this._isTransitioning ||\\n      !$(this._element).hasClass(ClassName.SHOW)) {\\n      return\\n    }\\n\\n    const startEvent = $.Event(Event.HIDE)\\n    $(this._element).trigger(startEvent)\\n    if (startEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    const dimension = this._getDimension()\\n\\n    this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\\n\\n    Util.reflow(this._element)\\n\\n    $(this._element)\\n      .addClass(ClassName.COLLAPSING)\\n      .removeClass(ClassName.COLLAPSE)\\n      .removeClass(ClassName.SHOW)\\n\\n    const triggerArrayLength = this._triggerArray.length\\n    if (triggerArrayLength > 0) {\\n      for (let i = 0; i < triggerArrayLength; i++) {\\n        const trigger = this._triggerArray[i]\\n        const selector = Util.getSelectorFromElement(trigger)\\n\\n        if (selector !== null) {\\n          const $elem = $([].slice.call(document.querySelectorAll(selector)))\\n          if (!$elem.hasClass(ClassName.SHOW)) {\\n            $(trigger).addClass(ClassName.COLLAPSED)\\n              .attr('aria-expanded', false)\\n          }\\n        }\\n      }\\n    }\\n\\n    this.setTransitioning(true)\\n\\n    const complete = () => {\\n      this.setTransitioning(false)\\n      $(this._element)\\n        .removeClass(ClassName.COLLAPSING)\\n        .addClass(ClassName.COLLAPSE)\\n        .trigger(Event.HIDDEN)\\n    }\\n\\n    this._element.style[dimension] = ''\\n    const transitionDuration = Util.getTransitionDurationFromElement(this._element)\\n\\n    $(this._element)\\n      .one(Util.TRANSITION_END, complete)\\n      .emulateTransitionEnd(transitionDuration)\\n  }\\n\\n  setTransitioning(isTransitioning) {\\n    this._isTransitioning = isTransitioning\\n  }\\n\\n  dispose() {\\n    $.removeData(this._element, DATA_KEY)\\n\\n    this._config          = null\\n    this._parent          = null\\n    this._element         = null\\n    this._triggerArray    = null\\n    this._isTransitioning = null\\n  }\\n\\n  // Private\\n\\n  _getConfig(config) {\\n    config = {\\n      ...Default,\\n      ...config\\n    }\\n    config.toggle = Boolean(config.toggle) // Coerce string values\\n    Util.typeCheckConfig(NAME, config, DefaultType)\\n    return config\\n  }\\n\\n  _getDimension() {\\n    const hasWidth = $(this._element).hasClass(Dimension.WIDTH)\\n    return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT\\n  }\\n\\n  _getParent() {\\n    let parent\\n\\n    if (Util.isElement(this._config.parent)) {\\n      parent = this._config.parent\\n\\n      // It's a jQuery object\\n      if (typeof this._config.parent.jquery !== 'undefined') {\\n        parent = this._config.parent[0]\\n      }\\n    } else {\\n      parent = document.querySelector(this._config.parent)\\n    }\\n\\n    const selector =\\n      `[data-toggle=\\\"collapse\\\"][data-parent=\\\"${this._config.parent}\\\"]`\\n\\n    const children = [].slice.call(parent.querySelectorAll(selector))\\n    $(children).each((i, element) => {\\n      this._addAriaAndCollapsedClass(\\n        Collapse._getTargetFromElement(element),\\n        [element]\\n      )\\n    })\\n\\n    return parent\\n  }\\n\\n  _addAriaAndCollapsedClass(element, triggerArray) {\\n    const isOpen = $(element).hasClass(ClassName.SHOW)\\n\\n    if (triggerArray.length) {\\n      $(triggerArray)\\n        .toggleClass(ClassName.COLLAPSED, !isOpen)\\n        .attr('aria-expanded', isOpen)\\n    }\\n  }\\n\\n  // Static\\n\\n  static _getTargetFromElement(element) {\\n    const selector = Util.getSelectorFromElement(element)\\n    return selector ? document.querySelector(selector) : null\\n  }\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      const $this   = $(this)\\n      let data      = $this.data(DATA_KEY)\\n      const _config = {\\n        ...Default,\\n        ...$this.data(),\\n        ...typeof config === 'object' && config ? config : {}\\n      }\\n\\n      if (!data && _config.toggle && /show|hide/.test(config)) {\\n        _config.toggle = false\\n      }\\n\\n      if (!data) {\\n        data = new Collapse(this, _config)\\n        $this.data(DATA_KEY, data)\\n      }\\n\\n      if (typeof config === 'string') {\\n        if (typeof data[config] === 'undefined') {\\n          throw new TypeError(`No method named \\\"${config}\\\"`)\\n        }\\n        data[config]()\\n      }\\n    })\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Data Api implementation\\n * ------------------------------------------------------------------------\\n */\\n\\n$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\\n  // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\\n  if (event.currentTarget.tagName === 'A') {\\n    event.preventDefault()\\n  }\\n\\n  const $trigger = $(this)\\n  const selector = Util.getSelectorFromElement(this)\\n  const selectors = [].slice.call(document.querySelectorAll(selector))\\n\\n  $(selectors).each(function () {\\n    const $target = $(this)\\n    const data    = $target.data(DATA_KEY)\\n    const config  = data ? 'toggle' : $trigger.data()\\n    Collapse._jQueryInterface.call($target, config)\\n  })\\n})\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME] = Collapse._jQueryInterface\\n$.fn[NAME].Constructor = Collapse\\n$.fn[NAME].noConflict = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Collapse._jQueryInterface\\n}\\n\\nexport default Collapse\\n\",\"/**!\\n * @fileOverview Kickass library to create and place poppers near their reference elements.\\n * @version 1.14.7\\n * @license\\n * Copyright (c) 2016 Federico Zivolo and contributors\\n *\\n * Permission is hereby granted, free of charge, to any person obtaining a copy\\n * of this software and associated documentation files (the \\\"Software\\\"), to deal\\n * in the Software without restriction, including without limitation the rights\\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\\n * copies of the Software, and to permit persons to whom the Software is\\n * furnished to do so, subject to the following conditions:\\n *\\n * The above copyright notice and this permission notice shall be included in all\\n * copies or substantial portions of the Software.\\n *\\n * THE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\\n * SOFTWARE.\\n */\\nvar isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';\\n\\nvar longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];\\nvar timeoutDuration = 0;\\nfor (var i = 0; i < longerTimeoutBrowsers.length; i += 1) {\\n  if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {\\n    timeoutDuration = 1;\\n    break;\\n  }\\n}\\n\\nfunction microtaskDebounce(fn) {\\n  var called = false;\\n  return function () {\\n    if (called) {\\n      return;\\n    }\\n    called = true;\\n    window.Promise.resolve().then(function () {\\n      called = false;\\n      fn();\\n    });\\n  };\\n}\\n\\nfunction taskDebounce(fn) {\\n  var scheduled = false;\\n  return function () {\\n    if (!scheduled) {\\n      scheduled = true;\\n      setTimeout(function () {\\n        scheduled = false;\\n        fn();\\n      }, timeoutDuration);\\n    }\\n  };\\n}\\n\\nvar supportsMicroTasks = isBrowser && window.Promise;\\n\\n/**\\n* Create a debounced version of a method, that's asynchronously deferred\\n* but called in the minimum time possible.\\n*\\n* @method\\n* @memberof Popper.Utils\\n* @argument {Function} fn\\n* @returns {Function}\\n*/\\nvar debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce;\\n\\n/**\\n * Check if the given variable is a function\\n * @method\\n * @memberof Popper.Utils\\n * @argument {Any} functionToCheck - variable to check\\n * @returns {Boolean} answer to: is a function?\\n */\\nfunction isFunction(functionToCheck) {\\n  var getType = {};\\n  return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';\\n}\\n\\n/**\\n * Get CSS computed property of the given element\\n * @method\\n * @memberof Popper.Utils\\n * @argument {Eement} element\\n * @argument {String} property\\n */\\nfunction getStyleComputedProperty(element, property) {\\n  if (element.nodeType !== 1) {\\n    return [];\\n  }\\n  // NOTE: 1 DOM access here\\n  var window = element.ownerDocument.defaultView;\\n  var css = window.getComputedStyle(element, null);\\n  return property ? css[property] : css;\\n}\\n\\n/**\\n * Returns the parentNode or the host of the element\\n * @method\\n * @memberof Popper.Utils\\n * @argument {Element} element\\n * @returns {Element} parent\\n */\\nfunction getParentNode(element) {\\n  if (element.nodeName === 'HTML') {\\n    return element;\\n  }\\n  return element.parentNode || element.host;\\n}\\n\\n/**\\n * Returns the scrolling parent of the given element\\n * @method\\n * @memberof Popper.Utils\\n * @argument {Element} element\\n * @returns {Element} scroll parent\\n */\\nfunction getScrollParent(element) {\\n  // Return body, `getScroll` will take care to get the correct `scrollTop` from it\\n  if (!element) {\\n    return document.body;\\n  }\\n\\n  switch (element.nodeName) {\\n    case 'HTML':\\n    case 'BODY':\\n      return element.ownerDocument.body;\\n    case '#document':\\n      return element.body;\\n  }\\n\\n  // Firefox want us to check `-x` and `-y` variations as well\\n\\n  var _getStyleComputedProp = getStyleComputedProperty(element),\\n      overflow = _getStyleComputedProp.overflow,\\n      overflowX = _getStyleComputedProp.overflowX,\\n      overflowY = _getStyleComputedProp.overflowY;\\n\\n  if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {\\n    return element;\\n  }\\n\\n  return getScrollParent(getParentNode(element));\\n}\\n\\nvar isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode);\\nvar isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent);\\n\\n/**\\n * Determines if the browser is Internet Explorer\\n * @method\\n * @memberof Popper.Utils\\n * @param {Number} version to check\\n * @returns {Boolean} isIE\\n */\\nfunction isIE(version) {\\n  if (version === 11) {\\n    return isIE11;\\n  }\\n  if (version === 10) {\\n    return isIE10;\\n  }\\n  return isIE11 || isIE10;\\n}\\n\\n/**\\n * Returns the offset parent of the given element\\n * @method\\n * @memberof Popper.Utils\\n * @argument {Element} element\\n * @returns {Element} offset parent\\n */\\nfunction getOffsetParent(element) {\\n  if (!element) {\\n    return document.documentElement;\\n  }\\n\\n  var noOffsetParent = isIE(10) ? document.body : null;\\n\\n  // NOTE: 1 DOM access here\\n  var offsetParent = element.offsetParent || null;\\n  // Skip hidden elements which don't have an offsetParent\\n  while (offsetParent === noOffsetParent && element.nextElementSibling) {\\n    offsetParent = (element = element.nextElementSibling).offsetParent;\\n  }\\n\\n  var nodeName = offsetParent && offsetParent.nodeName;\\n\\n  if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {\\n    return element ? element.ownerDocument.documentElement : document.documentElement;\\n  }\\n\\n  // .offsetParent will return the closest TH, TD or TABLE in case\\n  // no offsetParent is present, I hate this job...\\n  if (['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') {\\n    return getOffsetParent(offsetParent);\\n  }\\n\\n  return offsetParent;\\n}\\n\\nfunction isOffsetContainer(element) {\\n  var nodeName = element.nodeName;\\n\\n  if (nodeName === 'BODY') {\\n    return false;\\n  }\\n  return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element;\\n}\\n\\n/**\\n * Finds the root node (document, shadowDOM root) of the given element\\n * @method\\n * @memberof Popper.Utils\\n * @argument {Element} node\\n * @returns {Element} root node\\n */\\nfunction getRoot(node) {\\n  if (node.parentNode !== null) {\\n    return getRoot(node.parentNode);\\n  }\\n\\n  return node;\\n}\\n\\n/**\\n * Finds the offset parent common to the two provided nodes\\n * @method\\n * @memberof Popper.Utils\\n * @argument {Element} element1\\n * @argument {Element} element2\\n * @returns {Element} common offset parent\\n */\\nfunction findCommonOffsetParent(element1, element2) {\\n  // This check is needed to avoid errors in case one of the elements isn't defined for any reason\\n  if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) {\\n    return document.documentElement;\\n  }\\n\\n  // Here we make sure to give as \\\"start\\\" the element that comes first in the DOM\\n  var order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING;\\n  var start = order ? element1 : element2;\\n  var end = order ? element2 : element1;\\n\\n  // Get common ancestor container\\n  var range = document.createRange();\\n  range.setStart(start, 0);\\n  range.setEnd(end, 0);\\n  var commonAncestorContainer = range.commonAncestorContainer;\\n\\n  // Both nodes are inside #document\\n\\n  if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) {\\n    if (isOffsetContainer(commonAncestorContainer)) {\\n      return commonAncestorContainer;\\n    }\\n\\n    return getOffsetParent(commonAncestorContainer);\\n  }\\n\\n  // one of the nodes is inside shadowDOM, find which one\\n  var element1root = getRoot(element1);\\n  if (element1root.host) {\\n    return findCommonOffsetParent(element1root.host, element2);\\n  } else {\\n    return findCommonOffsetParent(element1, getRoot(element2).host);\\n  }\\n}\\n\\n/**\\n * Gets the scroll value of the given element in the given side (top and left)\\n * @method\\n * @memberof Popper.Utils\\n * @argument {Element} element\\n * @argument {String} side `top` or `left`\\n * @returns {number} amount of scrolled pixels\\n */\\nfunction getScroll(element) {\\n  var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top';\\n\\n  var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';\\n  var nodeName = element.nodeName;\\n\\n  if (nodeName === 'BODY' || nodeName === 'HTML') {\\n    var html = element.ownerDocument.documentElement;\\n    var scrollingElement = element.ownerDocument.scrollingElement || html;\\n    return scrollingElement[upperSide];\\n  }\\n\\n  return element[upperSide];\\n}\\n\\n/*\\n * Sum or subtract the element scroll values (left and top) from a given rect object\\n * @method\\n * @memberof Popper.Utils\\n * @param {Object} rect - Rect object you want to change\\n * @param {HTMLElement} element - The element from the function reads the scroll values\\n * @param {Boolean} subtract - set to true if you want to subtract the scroll values\\n * @return {Object} rect - The modifier rect object\\n */\\nfunction includeScroll(rect, element) {\\n  var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\\n\\n  var scrollTop = getScroll(element, 'top');\\n  var scrollLeft = getScroll(element, 'left');\\n  var modifier = subtract ? -1 : 1;\\n  rect.top += scrollTop * modifier;\\n  rect.bottom += scrollTop * modifier;\\n  rect.left += scrollLeft * modifier;\\n  rect.right += scrollLeft * modifier;\\n  return rect;\\n}\\n\\n/*\\n * Helper to detect borders of a given element\\n * @method\\n * @memberof Popper.Utils\\n * @param {CSSStyleDeclaration} styles\\n * Result of `getStyleComputedProperty` on the given element\\n * @param {String} axis - `x` or `y`\\n * @return {number} borders - The borders size of the given axis\\n */\\n\\nfunction getBordersSize(styles, axis) {\\n  var sideA = axis === 'x' ? 'Left' : 'Top';\\n  var sideB = sideA === 'Left' ? 'Right' : 'Bottom';\\n\\n  return parseFloat(styles['border' + sideA + 'Width'], 10) + parseFloat(styles['border' + sideB + 'Width'], 10);\\n}\\n\\nfunction getSize(axis, body, html, computedStyle) {\\n  return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE(10) ? parseInt(html['offset' + axis]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')]) : 0);\\n}\\n\\nfunction getWindowSizes(document) {\\n  var body = document.body;\\n  var html = document.documentElement;\\n  var computedStyle = isIE(10) && getComputedStyle(html);\\n\\n  return {\\n    height: getSize('Height', body, html, computedStyle),\\n    width: getSize('Width', body, html, computedStyle)\\n  };\\n}\\n\\nvar classCallCheck = function (instance, Constructor) {\\n  if (!(instance instanceof Constructor)) {\\n    throw new TypeError(\\\"Cannot call a class as a function\\\");\\n  }\\n};\\n\\nvar createClass = function () {\\n  function defineProperties(target, props) {\\n    for (var i = 0; i < props.length; i++) {\\n      var descriptor = props[i];\\n      descriptor.enumerable = descriptor.enumerable || false;\\n      descriptor.configurable = true;\\n      if (\\\"value\\\" in descriptor) descriptor.writable = true;\\n      Object.defineProperty(target, descriptor.key, descriptor);\\n    }\\n  }\\n\\n  return function (Constructor, protoProps, staticProps) {\\n    if (protoProps) defineProperties(Constructor.prototype, protoProps);\\n    if (staticProps) defineProperties(Constructor, staticProps);\\n    return Constructor;\\n  };\\n}();\\n\\n\\n\\n\\n\\nvar defineProperty = function (obj, key, value) {\\n  if (key in obj) {\\n    Object.defineProperty(obj, key, {\\n      value: value,\\n      enumerable: true,\\n      configurable: true,\\n      writable: true\\n    });\\n  } else {\\n    obj[key] = value;\\n  }\\n\\n  return obj;\\n};\\n\\nvar _extends = Object.assign || function (target) {\\n  for (var i = 1; i < arguments.length; i++) {\\n    var source = arguments[i];\\n\\n    for (var key in source) {\\n      if (Object.prototype.hasOwnProperty.call(source, key)) {\\n        target[key] = source[key];\\n      }\\n    }\\n  }\\n\\n  return target;\\n};\\n\\n/**\\n * Given element offsets, generate an output similar to getBoundingClientRect\\n * @method\\n * @memberof Popper.Utils\\n * @argument {Object} offsets\\n * @returns {Object} ClientRect like output\\n */\\nfunction getClientRect(offsets) {\\n  return _extends({}, offsets, {\\n    right: offsets.left + offsets.width,\\n    bottom: offsets.top + offsets.height\\n  });\\n}\\n\\n/**\\n * Get bounding client rect of given element\\n * @method\\n * @memberof Popper.Utils\\n * @param {HTMLElement} element\\n * @return {Object} client rect\\n */\\nfunction getBoundingClientRect(element) {\\n  var rect = {};\\n\\n  // IE10 10 FIX: Please, don't ask, the element isn't\\n  // considered in DOM in some circumstances...\\n  // This isn't reproducible in IE10 compatibility mode of IE11\\n  try {\\n    if (isIE(10)) {\\n      rect = element.getBoundingClientRect();\\n      var scrollTop = getScroll(element, 'top');\\n      var scrollLeft = getScroll(element, 'left');\\n      rect.top += scrollTop;\\n      rect.left += scrollLeft;\\n      rect.bottom += scrollTop;\\n      rect.right += scrollLeft;\\n    } else {\\n      rect = element.getBoundingClientRect();\\n    }\\n  } catch (e) {}\\n\\n  var result = {\\n    left: rect.left,\\n    top: rect.top,\\n    width: rect.right - rect.left,\\n    height: rect.bottom - rect.top\\n  };\\n\\n  // subtract scrollbar size from sizes\\n  var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};\\n  var width = sizes.width || element.clientWidth || result.right - result.left;\\n  var height = sizes.height || element.clientHeight || result.bottom - result.top;\\n\\n  var horizScrollbar = element.offsetWidth - width;\\n  var vertScrollbar = element.offsetHeight - height;\\n\\n  // if an hypothetical scrollbar is detected, we must be sure it's not a `border`\\n  // we make this check conditional for performance reasons\\n  if (horizScrollbar || vertScrollbar) {\\n    var styles = getStyleComputedProperty(element);\\n    horizScrollbar -= getBordersSize(styles, 'x');\\n    vertScrollbar -= getBordersSize(styles, 'y');\\n\\n    result.width -= horizScrollbar;\\n    result.height -= vertScrollbar;\\n  }\\n\\n  return getClientRect(result);\\n}\\n\\nfunction getOffsetRectRelativeToArbitraryNode(children, parent) {\\n  var fixedPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\\n\\n  var isIE10 = isIE(10);\\n  var isHTML = parent.nodeName === 'HTML';\\n  var childrenRect = getBoundingClientRect(children);\\n  var parentRect = getBoundingClientRect(parent);\\n  var scrollParent = getScrollParent(children);\\n\\n  var styles = getStyleComputedProperty(parent);\\n  var borderTopWidth = parseFloat(styles.borderTopWidth, 10);\\n  var borderLeftWidth = parseFloat(styles.borderLeftWidth, 10);\\n\\n  // In cases where the parent is fixed, we must ignore negative scroll in offset calc\\n  if (fixedPosition && isHTML) {\\n    parentRect.top = Math.max(parentRect.top, 0);\\n    parentRect.left = Math.max(parentRect.left, 0);\\n  }\\n  var offsets = getClientRect({\\n    top: childrenRect.top - parentRect.top - borderTopWidth,\\n    left: childrenRect.left - parentRect.left - borderLeftWidth,\\n    width: childrenRect.width,\\n    height: childrenRect.height\\n  });\\n  offsets.marginTop = 0;\\n  offsets.marginLeft = 0;\\n\\n  // Subtract margins of documentElement in case it's being used as parent\\n  // we do this only on HTML because it's the only element that behaves\\n  // differently when margins are applied to it. The margins are included in\\n  // the box of the documentElement, in the other cases not.\\n  if (!isIE10 && isHTML) {\\n    var marginTop = parseFloat(styles.marginTop, 10);\\n    var marginLeft = parseFloat(styles.marginLeft, 10);\\n\\n    offsets.top -= borderTopWidth - marginTop;\\n    offsets.bottom -= borderTopWidth - marginTop;\\n    offsets.left -= borderLeftWidth - marginLeft;\\n    offsets.right -= borderLeftWidth - marginLeft;\\n\\n    // Attach marginTop and marginLeft because in some circumstances we may need them\\n    offsets.marginTop = marginTop;\\n    offsets.marginLeft = marginLeft;\\n  }\\n\\n  if (isIE10 && !fixedPosition ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') {\\n    offsets = includeScroll(offsets, parent);\\n  }\\n\\n  return offsets;\\n}\\n\\nfunction getViewportOffsetRectRelativeToArtbitraryNode(element) {\\n  var excludeScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\\n\\n  var html = element.ownerDocument.documentElement;\\n  var relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html);\\n  var width = Math.max(html.clientWidth, window.innerWidth || 0);\\n  var height = Math.max(html.clientHeight, window.innerHeight || 0);\\n\\n  var scrollTop = !excludeScroll ? getScroll(html) : 0;\\n  var scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0;\\n\\n  var offset = {\\n    top: scrollTop - relativeOffset.top + relativeOffset.marginTop,\\n    left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft,\\n    width: width,\\n    height: height\\n  };\\n\\n  return getClientRect(offset);\\n}\\n\\n/**\\n * Check if the given element is fixed or is inside a fixed parent\\n * @method\\n * @memberof Popper.Utils\\n * @argument {Element} element\\n * @argument {Element} customContainer\\n * @returns {Boolean} answer to \\\"isFixed?\\\"\\n */\\nfunction isFixed(element) {\\n  var nodeName = element.nodeName;\\n  if (nodeName === 'BODY' || nodeName === 'HTML') {\\n    return false;\\n  }\\n  if (getStyleComputedProperty(element, 'position') === 'fixed') {\\n    return true;\\n  }\\n  var parentNode = getParentNode(element);\\n  if (!parentNode) {\\n    return false;\\n  }\\n  return isFixed(parentNode);\\n}\\n\\n/**\\n * Finds the first parent of an element that has a transformed property defined\\n * @method\\n * @memberof Popper.Utils\\n * @argument {Element} element\\n * @returns {Element} first transformed parent or documentElement\\n */\\n\\nfunction getFixedPositionOffsetParent(element) {\\n  // This check is needed to avoid errors in case one of the elements isn't defined for any reason\\n  if (!element || !element.parentElement || isIE()) {\\n    return document.documentElement;\\n  }\\n  var el = element.parentElement;\\n  while (el && getStyleComputedProperty(el, 'transform') === 'none') {\\n    el = el.parentElement;\\n  }\\n  return el || document.documentElement;\\n}\\n\\n/**\\n * Computed the boundaries limits and return them\\n * @method\\n * @memberof Popper.Utils\\n * @param {HTMLElement} popper\\n * @param {HTMLElement} reference\\n * @param {number} padding\\n * @param {HTMLElement} boundariesElement - Element used to define the boundaries\\n * @param {Boolean} fixedPosition - Is in fixed position mode\\n * @returns {Object} Coordinates of the boundaries\\n */\\nfunction getBoundaries(popper, reference, padding, boundariesElement) {\\n  var fixedPosition = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\\n\\n  // NOTE: 1 DOM access here\\n\\n  var boundaries = { top: 0, left: 0 };\\n  var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);\\n\\n  // Handle viewport case\\n  if (boundariesElement === 'viewport') {\\n    boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition);\\n  } else {\\n    // Handle other cases based on DOM element used as boundaries\\n    var boundariesNode = void 0;\\n    if (boundariesElement === 'scrollParent') {\\n      boundariesNode = getScrollParent(getParentNode(reference));\\n      if (boundariesNode.nodeName === 'BODY') {\\n        boundariesNode = popper.ownerDocument.documentElement;\\n      }\\n    } else if (boundariesElement === 'window') {\\n      boundariesNode = popper.ownerDocument.documentElement;\\n    } else {\\n      boundariesNode = boundariesElement;\\n    }\\n\\n    var offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition);\\n\\n    // In case of HTML, we need a different computation\\n    if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {\\n      var _getWindowSizes = getWindowSizes(popper.ownerDocument),\\n          height = _getWindowSizes.height,\\n          width = _getWindowSizes.width;\\n\\n      boundaries.top += offsets.top - offsets.marginTop;\\n      boundaries.bottom = height + offsets.top;\\n      boundaries.left += offsets.left - offsets.marginLeft;\\n      boundaries.right = width + offsets.left;\\n    } else {\\n      // for all the other DOM elements, this one is good\\n      boundaries = offsets;\\n    }\\n  }\\n\\n  // Add paddings\\n  padding = padding || 0;\\n  var isPaddingNumber = typeof padding === 'number';\\n  boundaries.left += isPaddingNumber ? padding : padding.left || 0;\\n  boundaries.top += isPaddingNumber ? padding : padding.top || 0;\\n  boundaries.right -= isPaddingNumber ? padding : padding.right || 0;\\n  boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0;\\n\\n  return boundaries;\\n}\\n\\nfunction getArea(_ref) {\\n  var width = _ref.width,\\n      height = _ref.height;\\n\\n  return width * height;\\n}\\n\\n/**\\n * Utility used to transform the `auto` placement to the placement with more\\n * available space.\\n * @method\\n * @memberof Popper.Utils\\n * @argument {Object} data - The data object generated by update method\\n * @argument {Object} options - Modifiers configuration and options\\n * @returns {Object} The data object, properly modified\\n */\\nfunction computeAutoPlacement(placement, refRect, popper, reference, boundariesElement) {\\n  var padding = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;\\n\\n  if (placement.indexOf('auto') === -1) {\\n    return placement;\\n  }\\n\\n  var boundaries = getBoundaries(popper, reference, padding, boundariesElement);\\n\\n  var rects = {\\n    top: {\\n      width: boundaries.width,\\n      height: refRect.top - boundaries.top\\n    },\\n    right: {\\n      width: boundaries.right - refRect.right,\\n      height: boundaries.height\\n    },\\n    bottom: {\\n      width: boundaries.width,\\n      height: boundaries.bottom - refRect.bottom\\n    },\\n    left: {\\n      width: refRect.left - boundaries.left,\\n      height: boundaries.height\\n    }\\n  };\\n\\n  var sortedAreas = Object.keys(rects).map(function (key) {\\n    return _extends({\\n      key: key\\n    }, rects[key], {\\n      area: getArea(rects[key])\\n    });\\n  }).sort(function (a, b) {\\n    return b.area - a.area;\\n  });\\n\\n  var filteredAreas = sortedAreas.filter(function (_ref2) {\\n    var width = _ref2.width,\\n        height = _ref2.height;\\n    return width >= popper.clientWidth && height >= popper.clientHeight;\\n  });\\n\\n  var computedPlacement = filteredAreas.length > 0 ? filteredAreas[0].key : sortedAreas[0].key;\\n\\n  var variation = placement.split('-')[1];\\n\\n  return computedPlacement + (variation ? '-' + variation : '');\\n}\\n\\n/**\\n * Get offsets to the reference element\\n * @method\\n * @memberof Popper.Utils\\n * @param {Object} state\\n * @param {Element} popper - the popper element\\n * @param {Element} reference - the reference element (the popper will be relative to this)\\n * @param {Element} fixedPosition - is in fixed position mode\\n * @returns {Object} An object containing the offsets which will be applied to the popper\\n */\\nfunction getReferenceOffsets(state, popper, reference) {\\n  var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\\n\\n  var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);\\n  return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);\\n}\\n\\n/**\\n * Get the outer sizes of the given element (offset size + margins)\\n * @method\\n * @memberof Popper.Utils\\n * @argument {Element} element\\n * @returns {Object} object containing width and height properties\\n */\\nfunction getOuterSizes(element) {\\n  var window = element.ownerDocument.defaultView;\\n  var styles = window.getComputedStyle(element);\\n  var x = parseFloat(styles.marginTop || 0) + parseFloat(styles.marginBottom || 0);\\n  var y = parseFloat(styles.marginLeft || 0) + parseFloat(styles.marginRight || 0);\\n  var result = {\\n    width: element.offsetWidth + y,\\n    height: element.offsetHeight + x\\n  };\\n  return result;\\n}\\n\\n/**\\n * Get the opposite placement of the given one\\n * @method\\n * @memberof Popper.Utils\\n * @argument {String} placement\\n * @returns {String} flipped placement\\n */\\nfunction getOppositePlacement(placement) {\\n  var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' };\\n  return placement.replace(/left|right|bottom|top/g, function (matched) {\\n    return hash[matched];\\n  });\\n}\\n\\n/**\\n * Get offsets to the popper\\n * @method\\n * @memberof Popper.Utils\\n * @param {Object} position - CSS position the Popper will get applied\\n * @param {HTMLElement} popper - the popper element\\n * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this)\\n * @param {String} placement - one of the valid placement options\\n * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper\\n */\\nfunction getPopperOffsets(popper, referenceOffsets, placement) {\\n  placement = placement.split('-')[0];\\n\\n  // Get popper node sizes\\n  var popperRect = getOuterSizes(popper);\\n\\n  // Add position, width and height to our offsets object\\n  var popperOffsets = {\\n    width: popperRect.width,\\n    height: popperRect.height\\n  };\\n\\n  // depending by the popper placement we have to compute its offsets slightly differently\\n  var isHoriz = ['right', 'left'].indexOf(placement) !== -1;\\n  var mainSide = isHoriz ? 'top' : 'left';\\n  var secondarySide = isHoriz ? 'left' : 'top';\\n  var measurement = isHoriz ? 'height' : 'width';\\n  var secondaryMeasurement = !isHoriz ? 'height' : 'width';\\n\\n  popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2;\\n  if (placement === secondarySide) {\\n    popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement];\\n  } else {\\n    popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)];\\n  }\\n\\n  return popperOffsets;\\n}\\n\\n/**\\n * Mimics the `find` method of Array\\n * @method\\n * @memberof Popper.Utils\\n * @argument {Array} arr\\n * @argument prop\\n * @argument value\\n * @returns index or -1\\n */\\nfunction find(arr, check) {\\n  // use native find if supported\\n  if (Array.prototype.find) {\\n    return arr.find(check);\\n  }\\n\\n  // use `filter` to obtain the same behavior of `find`\\n  return arr.filter(check)[0];\\n}\\n\\n/**\\n * Return the index of the matching object\\n * @method\\n * @memberof Popper.Utils\\n * @argument {Array} arr\\n * @argument prop\\n * @argument value\\n * @returns index or -1\\n */\\nfunction findIndex(arr, prop, value) {\\n  // use native findIndex if supported\\n  if (Array.prototype.findIndex) {\\n    return arr.findIndex(function (cur) {\\n      return cur[prop] === value;\\n    });\\n  }\\n\\n  // use `find` + `indexOf` if `findIndex` isn't supported\\n  var match = find(arr, function (obj) {\\n    return obj[prop] === value;\\n  });\\n  return arr.indexOf(match);\\n}\\n\\n/**\\n * Loop trough the list of modifiers and run them in order,\\n * each of them will then edit the data object.\\n * @method\\n * @memberof Popper.Utils\\n * @param {dataObject} data\\n * @param {Array} modifiers\\n * @param {String} ends - Optional modifier name used as stopper\\n * @returns {dataObject}\\n */\\nfunction runModifiers(modifiers, data, ends) {\\n  var modifiersToRun = ends === undefined ? modifiers : modifiers.slice(0, findIndex(modifiers, 'name', ends));\\n\\n  modifiersToRun.forEach(function (modifier) {\\n    if (modifier['function']) {\\n      // eslint-disable-line dot-notation\\n      console.warn('`modifier.function` is deprecated, use `modifier.fn`!');\\n    }\\n    var fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation\\n    if (modifier.enabled && isFunction(fn)) {\\n      // Add properties to offsets to make them a complete clientRect object\\n      // we do this before each modifier to make sure the previous one doesn't\\n      // mess with these values\\n      data.offsets.popper = getClientRect(data.offsets.popper);\\n      data.offsets.reference = getClientRect(data.offsets.reference);\\n\\n      data = fn(data, modifier);\\n    }\\n  });\\n\\n  return data;\\n}\\n\\n/**\\n * Updates the position of the popper, computing the new offsets and applying\\n * the new style.<br />\\n * Prefer `scheduleUpdate` over `update` because of performance reasons.\\n * @method\\n * @memberof Popper\\n */\\nfunction update() {\\n  // if popper is destroyed, don't perform any further update\\n  if (this.state.isDestroyed) {\\n    return;\\n  }\\n\\n  var data = {\\n    instance: this,\\n    styles: {},\\n    arrowStyles: {},\\n    attributes: {},\\n    flipped: false,\\n    offsets: {}\\n  };\\n\\n  // compute reference element offsets\\n  data.offsets.reference = getReferenceOffsets(this.state, this.popper, this.reference, this.options.positionFixed);\\n\\n  // compute auto placement, store placement inside the data object,\\n  // modifiers will be able to edit `placement` if needed\\n  // and refer to originalPlacement to know the original value\\n  data.placement = computeAutoPlacement(this.options.placement, data.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding);\\n\\n  // store the computed placement inside `originalPlacement`\\n  data.originalPlacement = data.placement;\\n\\n  data.positionFixed = this.options.positionFixed;\\n\\n  // compute the popper offsets\\n  data.offsets.popper = getPopperOffsets(this.popper, data.offsets.reference, data.placement);\\n\\n  data.offsets.popper.position = this.options.positionFixed ? 'fixed' : 'absolute';\\n\\n  // run the modifiers\\n  data = runModifiers(this.modifiers, data);\\n\\n  // the first `update` will call `onCreate` callback\\n  // the other ones will call `onUpdate` callback\\n  if (!this.state.isCreated) {\\n    this.state.isCreated = true;\\n    this.options.onCreate(data);\\n  } else {\\n    this.options.onUpdate(data);\\n  }\\n}\\n\\n/**\\n * Helper used to know if the given modifier is enabled.\\n * @method\\n * @memberof Popper.Utils\\n * @returns {Boolean}\\n */\\nfunction isModifierEnabled(modifiers, modifierName) {\\n  return modifiers.some(function (_ref) {\\n    var name = _ref.name,\\n        enabled = _ref.enabled;\\n    return enabled && name === modifierName;\\n  });\\n}\\n\\n/**\\n * Get the prefixed supported property name\\n * @method\\n * @memberof Popper.Utils\\n * @argument {String} property (camelCase)\\n * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix)\\n */\\nfunction getSupportedPropertyName(property) {\\n  var prefixes = [false, 'ms', 'Webkit', 'Moz', 'O'];\\n  var upperProp = property.charAt(0).toUpperCase() + property.slice(1);\\n\\n  for (var i = 0; i < prefixes.length; i++) {\\n    var prefix = prefixes[i];\\n    var toCheck = prefix ? '' + prefix + upperProp : property;\\n    if (typeof document.body.style[toCheck] !== 'undefined') {\\n      return toCheck;\\n    }\\n  }\\n  return null;\\n}\\n\\n/**\\n * Destroys the popper.\\n * @method\\n * @memberof Popper\\n */\\nfunction destroy() {\\n  this.state.isDestroyed = true;\\n\\n  // touch DOM only if `applyStyle` modifier is enabled\\n  if (isModifierEnabled(this.modifiers, 'applyStyle')) {\\n    this.popper.removeAttribute('x-placement');\\n    this.popper.style.position = '';\\n    this.popper.style.top = '';\\n    this.popper.style.left = '';\\n    this.popper.style.right = '';\\n    this.popper.style.bottom = '';\\n    this.popper.style.willChange = '';\\n    this.popper.style[getSupportedPropertyName('transform')] = '';\\n  }\\n\\n  this.disableEventListeners();\\n\\n  // remove the popper if user explicity asked for the deletion on destroy\\n  // do not use `remove` because IE11 doesn't support it\\n  if (this.options.removeOnDestroy) {\\n    this.popper.parentNode.removeChild(this.popper);\\n  }\\n  return this;\\n}\\n\\n/**\\n * Get the window associated with the element\\n * @argument {Element} element\\n * @returns {Window}\\n */\\nfunction getWindow(element) {\\n  var ownerDocument = element.ownerDocument;\\n  return ownerDocument ? ownerDocument.defaultView : window;\\n}\\n\\nfunction attachToScrollParents(scrollParent, event, callback, scrollParents) {\\n  var isBody = scrollParent.nodeName === 'BODY';\\n  var target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent;\\n  target.addEventListener(event, callback, { passive: true });\\n\\n  if (!isBody) {\\n    attachToScrollParents(getScrollParent(target.parentNode), event, callback, scrollParents);\\n  }\\n  scrollParents.push(target);\\n}\\n\\n/**\\n * Setup needed event listeners used to update the popper position\\n * @method\\n * @memberof Popper.Utils\\n * @private\\n */\\nfunction setupEventListeners(reference, options, state, updateBound) {\\n  // Resize event listener on window\\n  state.updateBound = updateBound;\\n  getWindow(reference).addEventListener('resize', state.updateBound, { passive: true });\\n\\n  // Scroll event listener on scroll parents\\n  var scrollElement = getScrollParent(reference);\\n  attachToScrollParents(scrollElement, 'scroll', state.updateBound, state.scrollParents);\\n  state.scrollElement = scrollElement;\\n  state.eventsEnabled = true;\\n\\n  return state;\\n}\\n\\n/**\\n * It will add resize/scroll events and start recalculating\\n * position of the popper element when they are triggered.\\n * @method\\n * @memberof Popper\\n */\\nfunction enableEventListeners() {\\n  if (!this.state.eventsEnabled) {\\n    this.state = setupEventListeners(this.reference, this.options, this.state, this.scheduleUpdate);\\n  }\\n}\\n\\n/**\\n * Remove event listeners used to update the popper position\\n * @method\\n * @memberof Popper.Utils\\n * @private\\n */\\nfunction removeEventListeners(reference, state) {\\n  // Remove resize event listener on window\\n  getWindow(reference).removeEventListener('resize', state.updateBound);\\n\\n  // Remove scroll event listener on scroll parents\\n  state.scrollParents.forEach(function (target) {\\n    target.removeEventListener('scroll', state.updateBound);\\n  });\\n\\n  // Reset state\\n  state.updateBound = null;\\n  state.scrollParents = [];\\n  state.scrollElement = null;\\n  state.eventsEnabled = false;\\n  return state;\\n}\\n\\n/**\\n * It will remove resize/scroll events and won't recalculate popper position\\n * when they are triggered. It also won't trigger `onUpdate` callback anymore,\\n * unless you call `update` method manually.\\n * @method\\n * @memberof Popper\\n */\\nfunction disableEventListeners() {\\n  if (this.state.eventsEnabled) {\\n    cancelAnimationFrame(this.scheduleUpdate);\\n    this.state = removeEventListeners(this.reference, this.state);\\n  }\\n}\\n\\n/**\\n * Tells if a given input is a number\\n * @method\\n * @memberof Popper.Utils\\n * @param {*} input to check\\n * @return {Boolean}\\n */\\nfunction isNumeric(n) {\\n  return n !== '' && !isNaN(parseFloat(n)) && isFinite(n);\\n}\\n\\n/**\\n * Set the style to the given popper\\n * @method\\n * @memberof Popper.Utils\\n * @argument {Element} element - Element to apply the style to\\n * @argument {Object} styles\\n * Object with a list of properties and values which will be applied to the element\\n */\\nfunction setStyles(element, styles) {\\n  Object.keys(styles).forEach(function (prop) {\\n    var unit = '';\\n    // add unit if the value is numeric and is one of the following\\n    if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && isNumeric(styles[prop])) {\\n      unit = 'px';\\n    }\\n    element.style[prop] = styles[prop] + unit;\\n  });\\n}\\n\\n/**\\n * Set the attributes to the given popper\\n * @method\\n * @memberof Popper.Utils\\n * @argument {Element} element - Element to apply the attributes to\\n * @argument {Object} styles\\n * Object with a list of properties and values which will be applied to the element\\n */\\nfunction setAttributes(element, attributes) {\\n  Object.keys(attributes).forEach(function (prop) {\\n    var value = attributes[prop];\\n    if (value !== false) {\\n      element.setAttribute(prop, attributes[prop]);\\n    } else {\\n      element.removeAttribute(prop);\\n    }\\n  });\\n}\\n\\n/**\\n * @function\\n * @memberof Modifiers\\n * @argument {Object} data - The data object generated by `update` method\\n * @argument {Object} data.styles - List of style properties - values to apply to popper element\\n * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element\\n * @argument {Object} options - Modifiers configuration and options\\n * @returns {Object} The same data object\\n */\\nfunction applyStyle(data) {\\n  // any property present in `data.styles` will be applied to the popper,\\n  // in this way we can make the 3rd party modifiers add custom styles to it\\n  // Be aware, modifiers could override the properties defined in the previous\\n  // lines of this modifier!\\n  setStyles(data.instance.popper, data.styles);\\n\\n  // any property present in `data.attributes` will be applied to the popper,\\n  // they will be set as HTML attributes of the element\\n  setAttributes(data.instance.popper, data.attributes);\\n\\n  // if arrowElement is defined and arrowStyles has some properties\\n  if (data.arrowElement && Object.keys(data.arrowStyles).length) {\\n    setStyles(data.arrowElement, data.arrowStyles);\\n  }\\n\\n  return data;\\n}\\n\\n/**\\n * Set the x-placement attribute before everything else because it could be used\\n * to add margins to the popper margins needs to be calculated to get the\\n * correct popper offsets.\\n * @method\\n * @memberof Popper.modifiers\\n * @param {HTMLElement} reference - The reference element used to position the popper\\n * @param {HTMLElement} popper - The HTML element used as popper\\n * @param {Object} options - Popper.js options\\n */\\nfunction applyStyleOnLoad(reference, popper, options, modifierOptions, state) {\\n  // compute reference element offsets\\n  var referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed);\\n\\n  // compute auto placement, store placement inside the data object,\\n  // modifiers will be able to edit `placement` if needed\\n  // and refer to originalPlacement to know the original value\\n  var placement = computeAutoPlacement(options.placement, referenceOffsets, popper, reference, options.modifiers.flip.boundariesElement, options.modifiers.flip.padding);\\n\\n  popper.setAttribute('x-placement', placement);\\n\\n  // Apply `position` to popper before anything else because\\n  // without the position applied we can't guarantee correct computations\\n  setStyles(popper, { position: options.positionFixed ? 'fixed' : 'absolute' });\\n\\n  return options;\\n}\\n\\n/**\\n * @function\\n * @memberof Popper.Utils\\n * @argument {Object} data - The data object generated by `update` method\\n * @argument {Boolean} shouldRound - If the offsets should be rounded at all\\n * @returns {Object} The popper's position offsets rounded\\n *\\n * The tale of pixel-perfect positioning. It's still not 100% perfect, but as\\n * good as it can be within reason.\\n * Discussion here: https://github.com/FezVrasta/popper.js/pull/715\\n *\\n * Low DPI screens cause a popper to be blurry if not using full pixels (Safari\\n * as well on High DPI screens).\\n *\\n * Firefox prefers no rounding for positioning and does not have blurriness on\\n * high DPI screens.\\n *\\n * Only horizontal placement and left/right values need to be considered.\\n */\\nfunction getRoundedOffsets(data, shouldRound) {\\n  var _data$offsets = data.offsets,\\n      popper = _data$offsets.popper,\\n      reference = _data$offsets.reference;\\n  var round = Math.round,\\n      floor = Math.floor;\\n\\n  var noRound = function noRound(v) {\\n    return v;\\n  };\\n\\n  var referenceWidth = round(reference.width);\\n  var popperWidth = round(popper.width);\\n\\n  var isVertical = ['left', 'right'].indexOf(data.placement) !== -1;\\n  var isVariation = data.placement.indexOf('-') !== -1;\\n  var sameWidthParity = referenceWidth % 2 === popperWidth % 2;\\n  var bothOddWidth = referenceWidth % 2 === 1 && popperWidth % 2 === 1;\\n\\n  var horizontalToInteger = !shouldRound ? noRound : isVertical || isVariation || sameWidthParity ? round : floor;\\n  var verticalToInteger = !shouldRound ? noRound : round;\\n\\n  return {\\n    left: horizontalToInteger(bothOddWidth && !isVariation && shouldRound ? popper.left - 1 : popper.left),\\n    top: verticalToInteger(popper.top),\\n    bottom: verticalToInteger(popper.bottom),\\n    right: horizontalToInteger(popper.right)\\n  };\\n}\\n\\nvar isFirefox = isBrowser && /Firefox/i.test(navigator.userAgent);\\n\\n/**\\n * @function\\n * @memberof Modifiers\\n * @argument {Object} data - The data object generated by `update` method\\n * @argument {Object} options - Modifiers configuration and options\\n * @returns {Object} The data object, properly modified\\n */\\nfunction computeStyle(data, options) {\\n  var x = options.x,\\n      y = options.y;\\n  var popper = data.offsets.popper;\\n\\n  // Remove this legacy support in Popper.js v2\\n\\n  var legacyGpuAccelerationOption = find(data.instance.modifiers, function (modifier) {\\n    return modifier.name === 'applyStyle';\\n  }).gpuAcceleration;\\n  if (legacyGpuAccelerationOption !== undefined) {\\n    console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');\\n  }\\n  var gpuAcceleration = legacyGpuAccelerationOption !== undefined ? legacyGpuAccelerationOption : options.gpuAcceleration;\\n\\n  var offsetParent = getOffsetParent(data.instance.popper);\\n  var offsetParentRect = getBoundingClientRect(offsetParent);\\n\\n  // Styles\\n  var styles = {\\n    position: popper.position\\n  };\\n\\n  var offsets = getRoundedOffsets(data, window.devicePixelRatio < 2 || !isFirefox);\\n\\n  var sideA = x === 'bottom' ? 'top' : 'bottom';\\n  var sideB = y === 'right' ? 'left' : 'right';\\n\\n  // if gpuAcceleration is set to `true` and transform is supported,\\n  //  we use `translate3d` to apply the position to the popper we\\n  // automatically use the supported prefixed version if needed\\n  var prefixedProperty = getSupportedPropertyName('transform');\\n\\n  // now, let's make a step back and look at this code closely (wtf?)\\n  // If the content of the popper grows once it's been positioned, it\\n  // may happen that the popper gets misplaced because of the new content\\n  // overflowing its reference element\\n  // To avoid this problem, we provide two options (x and y), which allow\\n  // the consumer to define the offset origin.\\n  // If we position a popper on top of a reference element, we can set\\n  // `x` to `top` to make the popper grow towards its top instead of\\n  // its bottom.\\n  var left = void 0,\\n      top = void 0;\\n  if (sideA === 'bottom') {\\n    // when offsetParent is <html> the positioning is relative to the bottom of the screen (excluding the scrollbar)\\n    // and not the bottom of the html element\\n    if (offsetParent.nodeName === 'HTML') {\\n      top = -offsetParent.clientHeight + offsets.bottom;\\n    } else {\\n      top = -offsetParentRect.height + offsets.bottom;\\n    }\\n  } else {\\n    top = offsets.top;\\n  }\\n  if (sideB === 'right') {\\n    if (offsetParent.nodeName === 'HTML') {\\n      left = -offsetParent.clientWidth + offsets.right;\\n    } else {\\n      left = -offsetParentRect.width + offsets.right;\\n    }\\n  } else {\\n    left = offsets.left;\\n  }\\n  if (gpuAcceleration && prefixedProperty) {\\n    styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)';\\n    styles[sideA] = 0;\\n    styles[sideB] = 0;\\n    styles.willChange = 'transform';\\n  } else {\\n    // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties\\n    var invertTop = sideA === 'bottom' ? -1 : 1;\\n    var invertLeft = sideB === 'right' ? -1 : 1;\\n    styles[sideA] = top * invertTop;\\n    styles[sideB] = left * invertLeft;\\n    styles.willChange = sideA + ', ' + sideB;\\n  }\\n\\n  // Attributes\\n  var attributes = {\\n    'x-placement': data.placement\\n  };\\n\\n  // Update `data` attributes, styles and arrowStyles\\n  data.attributes = _extends({}, attributes, data.attributes);\\n  data.styles = _extends({}, styles, data.styles);\\n  data.arrowStyles = _extends({}, data.offsets.arrow, data.arrowStyles);\\n\\n  return data;\\n}\\n\\n/**\\n * Helper used to know if the given modifier depends from another one.<br />\\n * It checks if the needed modifier is listed and enabled.\\n * @method\\n * @memberof Popper.Utils\\n * @param {Array} modifiers - list of modifiers\\n * @param {String} requestingName - name of requesting modifier\\n * @param {String} requestedName - name of requested modifier\\n * @returns {Boolean}\\n */\\nfunction isModifierRequired(modifiers, requestingName, requestedName) {\\n  var requesting = find(modifiers, function (_ref) {\\n    var name = _ref.name;\\n    return name === requestingName;\\n  });\\n\\n  var isRequired = !!requesting && modifiers.some(function (modifier) {\\n    return modifier.name === requestedName && modifier.enabled && modifier.order < requesting.order;\\n  });\\n\\n  if (!isRequired) {\\n    var _requesting = '`' + requestingName + '`';\\n    var requested = '`' + requestedName + '`';\\n    console.warn(requested + ' modifier is required by ' + _requesting + ' modifier in order to work, be sure to include it before ' + _requesting + '!');\\n  }\\n  return isRequired;\\n}\\n\\n/**\\n * @function\\n * @memberof Modifiers\\n * @argument {Object} data - The data object generated by update method\\n * @argument {Object} options - Modifiers configuration and options\\n * @returns {Object} The data object, properly modified\\n */\\nfunction arrow(data, options) {\\n  var _data$offsets$arrow;\\n\\n  // arrow depends on keepTogether in order to work\\n  if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) {\\n    return data;\\n  }\\n\\n  var arrowElement = options.element;\\n\\n  // if arrowElement is a string, suppose it's a CSS selector\\n  if (typeof arrowElement === 'string') {\\n    arrowElement = data.instance.popper.querySelector(arrowElement);\\n\\n    // if arrowElement is not found, don't run the modifier\\n    if (!arrowElement) {\\n      return data;\\n    }\\n  } else {\\n    // if the arrowElement isn't a query selector we must check that the\\n    // provided DOM node is child of its popper node\\n    if (!data.instance.popper.contains(arrowElement)) {\\n      console.warn('WARNING: `arrow.element` must be child of its popper element!');\\n      return data;\\n    }\\n  }\\n\\n  var placement = data.placement.split('-')[0];\\n  var _data$offsets = data.offsets,\\n      popper = _data$offsets.popper,\\n      reference = _data$offsets.reference;\\n\\n  var isVertical = ['left', 'right'].indexOf(placement) !== -1;\\n\\n  var len = isVertical ? 'height' : 'width';\\n  var sideCapitalized = isVertical ? 'Top' : 'Left';\\n  var side = sideCapitalized.toLowerCase();\\n  var altSide = isVertical ? 'left' : 'top';\\n  var opSide = isVertical ? 'bottom' : 'right';\\n  var arrowElementSize = getOuterSizes(arrowElement)[len];\\n\\n  //\\n  // extends keepTogether behavior making sure the popper and its\\n  // reference have enough pixels in conjunction\\n  //\\n\\n  // top/left side\\n  if (reference[opSide] - arrowElementSize < popper[side]) {\\n    data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize);\\n  }\\n  // bottom/right side\\n  if (reference[side] + arrowElementSize > popper[opSide]) {\\n    data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide];\\n  }\\n  data.offsets.popper = getClientRect(data.offsets.popper);\\n\\n  // compute center of the popper\\n  var center = reference[side] + reference[len] / 2 - arrowElementSize / 2;\\n\\n  // Compute the sideValue using the updated popper offsets\\n  // take popper margin in account because we don't have this info available\\n  var css = getStyleComputedProperty(data.instance.popper);\\n  var popperMarginSide = parseFloat(css['margin' + sideCapitalized], 10);\\n  var popperBorderSide = parseFloat(css['border' + sideCapitalized + 'Width'], 10);\\n  var sideValue = center - data.offsets.popper[side] - popperMarginSide - popperBorderSide;\\n\\n  // prevent arrowElement from being placed not contiguously to its popper\\n  sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0);\\n\\n  data.arrowElement = arrowElement;\\n  data.offsets.arrow = (_data$offsets$arrow = {}, defineProperty(_data$offsets$arrow, side, Math.round(sideValue)), defineProperty(_data$offsets$arrow, altSide, ''), _data$offsets$arrow);\\n\\n  return data;\\n}\\n\\n/**\\n * Get the opposite placement variation of the given one\\n * @method\\n * @memberof Popper.Utils\\n * @argument {String} placement variation\\n * @returns {String} flipped placement variation\\n */\\nfunction getOppositeVariation(variation) {\\n  if (variation === 'end') {\\n    return 'start';\\n  } else if (variation === 'start') {\\n    return 'end';\\n  }\\n  return variation;\\n}\\n\\n/**\\n * List of accepted placements to use as values of the `placement` option.<br />\\n * Valid placements are:\\n * - `auto`\\n * - `top`\\n * - `right`\\n * - `bottom`\\n * - `left`\\n *\\n * Each placement can have a variation from this list:\\n * - `-start`\\n * - `-end`\\n *\\n * Variations are interpreted easily if you think of them as the left to right\\n * written languages. Horizontally (`top` and `bottom`), `start` is left and `end`\\n * is right.<br />\\n * Vertically (`left` and `right`), `start` is top and `end` is bottom.\\n *\\n * Some valid examples are:\\n * - `top-end` (on top of reference, right aligned)\\n * - `right-start` (on right of reference, top aligned)\\n * - `bottom` (on bottom, centered)\\n * - `auto-end` (on the side with more space available, alignment depends by placement)\\n *\\n * @static\\n * @type {Array}\\n * @enum {String}\\n * @readonly\\n * @method placements\\n * @memberof Popper\\n */\\nvar placements = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start'];\\n\\n// Get rid of `auto` `auto-start` and `auto-end`\\nvar validPlacements = placements.slice(3);\\n\\n/**\\n * Given an initial placement, returns all the subsequent placements\\n * clockwise (or counter-clockwise).\\n *\\n * @method\\n * @memberof Popper.Utils\\n * @argument {String} placement - A valid placement (it accepts variations)\\n * @argument {Boolean} counter - Set to true to walk the placements counterclockwise\\n * @returns {Array} placements including their variations\\n */\\nfunction clockwise(placement) {\\n  var counter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\\n\\n  var index = validPlacements.indexOf(placement);\\n  var arr = validPlacements.slice(index + 1).concat(validPlacements.slice(0, index));\\n  return counter ? arr.reverse() : arr;\\n}\\n\\nvar BEHAVIORS = {\\n  FLIP: 'flip',\\n  CLOCKWISE: 'clockwise',\\n  COUNTERCLOCKWISE: 'counterclockwise'\\n};\\n\\n/**\\n * @function\\n * @memberof Modifiers\\n * @argument {Object} data - The data object generated by update method\\n * @argument {Object} options - Modifiers configuration and options\\n * @returns {Object} The data object, properly modified\\n */\\nfunction flip(data, options) {\\n  // if `inner` modifier is enabled, we can't use the `flip` modifier\\n  if (isModifierEnabled(data.instance.modifiers, 'inner')) {\\n    return data;\\n  }\\n\\n  if (data.flipped && data.placement === data.originalPlacement) {\\n    // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides\\n    return data;\\n  }\\n\\n  var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, options.boundariesElement, data.positionFixed);\\n\\n  var placement = data.placement.split('-')[0];\\n  var placementOpposite = getOppositePlacement(placement);\\n  var variation = data.placement.split('-')[1] || '';\\n\\n  var flipOrder = [];\\n\\n  switch (options.behavior) {\\n    case BEHAVIORS.FLIP:\\n      flipOrder = [placement, placementOpposite];\\n      break;\\n    case BEHAVIORS.CLOCKWISE:\\n      flipOrder = clockwise(placement);\\n      break;\\n    case BEHAVIORS.COUNTERCLOCKWISE:\\n      flipOrder = clockwise(placement, true);\\n      break;\\n    default:\\n      flipOrder = options.behavior;\\n  }\\n\\n  flipOrder.forEach(function (step, index) {\\n    if (placement !== step || flipOrder.length === index + 1) {\\n      return data;\\n    }\\n\\n    placement = data.placement.split('-')[0];\\n    placementOpposite = getOppositePlacement(placement);\\n\\n    var popperOffsets = data.offsets.popper;\\n    var refOffsets = data.offsets.reference;\\n\\n    // using floor because the reference offsets may contain decimals we are not going to consider here\\n    var floor = Math.floor;\\n    var overlapsRef = placement === 'left' && floor(popperOffsets.right) > floor(refOffsets.left) || placement === 'right' && floor(popperOffsets.left) < floor(refOffsets.right) || placement === 'top' && floor(popperOffsets.bottom) > floor(refOffsets.top) || placement === 'bottom' && floor(popperOffsets.top) < floor(refOffsets.bottom);\\n\\n    var overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left);\\n    var overflowsRight = floor(popperOffsets.right) > floor(boundaries.right);\\n    var overflowsTop = floor(popperOffsets.top) < floor(boundaries.top);\\n    var overflowsBottom = floor(popperOffsets.bottom) > floor(boundaries.bottom);\\n\\n    var overflowsBoundaries = placement === 'left' && overflowsLeft || placement === 'right' && overflowsRight || placement === 'top' && overflowsTop || placement === 'bottom' && overflowsBottom;\\n\\n    // flip the variation if required\\n    var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\\n    var flippedVariation = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom);\\n\\n    if (overlapsRef || overflowsBoundaries || flippedVariation) {\\n      // this boolean to detect any flip loop\\n      data.flipped = true;\\n\\n      if (overlapsRef || overflowsBoundaries) {\\n        placement = flipOrder[index + 1];\\n      }\\n\\n      if (flippedVariation) {\\n        variation = getOppositeVariation(variation);\\n      }\\n\\n      data.placement = placement + (variation ? '-' + variation : '');\\n\\n      // this object contains `position`, we want to preserve it along with\\n      // any additional property we may add in the future\\n      data.offsets.popper = _extends({}, data.offsets.popper, getPopperOffsets(data.instance.popper, data.offsets.reference, data.placement));\\n\\n      data = runModifiers(data.instance.modifiers, data, 'flip');\\n    }\\n  });\\n  return data;\\n}\\n\\n/**\\n * @function\\n * @memberof Modifiers\\n * @argument {Object} data - The data object generated by update method\\n * @argument {Object} options - Modifiers configuration and options\\n * @returns {Object} The data object, properly modified\\n */\\nfunction keepTogether(data) {\\n  var _data$offsets = data.offsets,\\n      popper = _data$offsets.popper,\\n      reference = _data$offsets.reference;\\n\\n  var placement = data.placement.split('-')[0];\\n  var floor = Math.floor;\\n  var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\\n  var side = isVertical ? 'right' : 'bottom';\\n  var opSide = isVertical ? 'left' : 'top';\\n  var measurement = isVertical ? 'width' : 'height';\\n\\n  if (popper[side] < floor(reference[opSide])) {\\n    data.offsets.popper[opSide] = floor(reference[opSide]) - popper[measurement];\\n  }\\n  if (popper[opSide] > floor(reference[side])) {\\n    data.offsets.popper[opSide] = floor(reference[side]);\\n  }\\n\\n  return data;\\n}\\n\\n/**\\n * Converts a string containing value + unit into a px value number\\n * @function\\n * @memberof {modifiers~offset}\\n * @private\\n * @argument {String} str - Value + unit string\\n * @argument {String} measurement - `height` or `width`\\n * @argument {Object} popperOffsets\\n * @argument {Object} referenceOffsets\\n * @returns {Number|String}\\n * Value in pixels, or original string if no values were extracted\\n */\\nfunction toValue(str, measurement, popperOffsets, referenceOffsets) {\\n  // separate value from unit\\n  var split = str.match(/((?:\\\\-|\\\\+)?\\\\d*\\\\.?\\\\d*)(.*)/);\\n  var value = +split[1];\\n  var unit = split[2];\\n\\n  // If it's not a number it's an operator, I guess\\n  if (!value) {\\n    return str;\\n  }\\n\\n  if (unit.indexOf('%') === 0) {\\n    var element = void 0;\\n    switch (unit) {\\n      case '%p':\\n        element = popperOffsets;\\n        break;\\n      case '%':\\n      case '%r':\\n      default:\\n        element = referenceOffsets;\\n    }\\n\\n    var rect = getClientRect(element);\\n    return rect[measurement] / 100 * value;\\n  } else if (unit === 'vh' || unit === 'vw') {\\n    // if is a vh or vw, we calculate the size based on the viewport\\n    var size = void 0;\\n    if (unit === 'vh') {\\n      size = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);\\n    } else {\\n      size = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\\n    }\\n    return size / 100 * value;\\n  } else {\\n    // if is an explicit pixel unit, we get rid of the unit and keep the value\\n    // if is an implicit unit, it's px, and we return just the value\\n    return value;\\n  }\\n}\\n\\n/**\\n * Parse an `offset` string to extrapolate `x` and `y` numeric offsets.\\n * @function\\n * @memberof {modifiers~offset}\\n * @private\\n * @argument {String} offset\\n * @argument {Object} popperOffsets\\n * @argument {Object} referenceOffsets\\n * @argument {String} basePlacement\\n * @returns {Array} a two cells array with x and y offsets in numbers\\n */\\nfunction parseOffset(offset, popperOffsets, referenceOffsets, basePlacement) {\\n  var offsets = [0, 0];\\n\\n  // Use height if placement is left or right and index is 0 otherwise use width\\n  // in this way the first offset will use an axis and the second one\\n  // will use the other one\\n  var useHeight = ['right', 'left'].indexOf(basePlacement) !== -1;\\n\\n  // Split the offset string to obtain a list of values and operands\\n  // The regex addresses values with the plus or minus sign in front (+10, -20, etc)\\n  var fragments = offset.split(/(\\\\+|\\\\-)/).map(function (frag) {\\n    return frag.trim();\\n  });\\n\\n  // Detect if the offset string contains a pair of values or a single one\\n  // they could be separated by comma or space\\n  var divider = fragments.indexOf(find(fragments, function (frag) {\\n    return frag.search(/,|\\\\s/) !== -1;\\n  }));\\n\\n  if (fragments[divider] && fragments[divider].indexOf(',') === -1) {\\n    console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');\\n  }\\n\\n  // If divider is found, we divide the list of values and operands to divide\\n  // them by ofset X and Y.\\n  var splitRegex = /\\\\s*,\\\\s*|\\\\s+/;\\n  var ops = divider !== -1 ? [fragments.slice(0, divider).concat([fragments[divider].split(splitRegex)[0]]), [fragments[divider].split(splitRegex)[1]].concat(fragments.slice(divider + 1))] : [fragments];\\n\\n  // Convert the values with units to absolute pixels to allow our computations\\n  ops = ops.map(function (op, index) {\\n    // Most of the units rely on the orientation of the popper\\n    var measurement = (index === 1 ? !useHeight : useHeight) ? 'height' : 'width';\\n    var mergeWithPrevious = false;\\n    return op\\n    // This aggregates any `+` or `-` sign that aren't considered operators\\n    // e.g.: 10 + +5 => [10, +, +5]\\n    .reduce(function (a, b) {\\n      if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) {\\n        a[a.length - 1] = b;\\n        mergeWithPrevious = true;\\n        return a;\\n      } else if (mergeWithPrevious) {\\n        a[a.length - 1] += b;\\n        mergeWithPrevious = false;\\n        return a;\\n      } else {\\n        return a.concat(b);\\n      }\\n    }, [])\\n    // Here we convert the string values into number values (in px)\\n    .map(function (str) {\\n      return toValue(str, measurement, popperOffsets, referenceOffsets);\\n    });\\n  });\\n\\n  // Loop trough the offsets arrays and execute the operations\\n  ops.forEach(function (op, index) {\\n    op.forEach(function (frag, index2) {\\n      if (isNumeric(frag)) {\\n        offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1);\\n      }\\n    });\\n  });\\n  return offsets;\\n}\\n\\n/**\\n * @function\\n * @memberof Modifiers\\n * @argument {Object} data - The data object generated by update method\\n * @argument {Object} options - Modifiers configuration and options\\n * @argument {Number|String} options.offset=0\\n * The offset value as described in the modifier description\\n * @returns {Object} The data object, properly modified\\n */\\nfunction offset(data, _ref) {\\n  var offset = _ref.offset;\\n  var placement = data.placement,\\n      _data$offsets = data.offsets,\\n      popper = _data$offsets.popper,\\n      reference = _data$offsets.reference;\\n\\n  var basePlacement = placement.split('-')[0];\\n\\n  var offsets = void 0;\\n  if (isNumeric(+offset)) {\\n    offsets = [+offset, 0];\\n  } else {\\n    offsets = parseOffset(offset, popper, reference, basePlacement);\\n  }\\n\\n  if (basePlacement === 'left') {\\n    popper.top += offsets[0];\\n    popper.left -= offsets[1];\\n  } else if (basePlacement === 'right') {\\n    popper.top += offsets[0];\\n    popper.left += offsets[1];\\n  } else if (basePlacement === 'top') {\\n    popper.left += offsets[0];\\n    popper.top -= offsets[1];\\n  } else if (basePlacement === 'bottom') {\\n    popper.left += offsets[0];\\n    popper.top += offsets[1];\\n  }\\n\\n  data.popper = popper;\\n  return data;\\n}\\n\\n/**\\n * @function\\n * @memberof Modifiers\\n * @argument {Object} data - The data object generated by `update` method\\n * @argument {Object} options - Modifiers configuration and options\\n * @returns {Object} The data object, properly modified\\n */\\nfunction preventOverflow(data, options) {\\n  var boundariesElement = options.boundariesElement || getOffsetParent(data.instance.popper);\\n\\n  // If offsetParent is the reference element, we really want to\\n  // go one step up and use the next offsetParent as reference to\\n  // avoid to make this modifier completely useless and look like broken\\n  if (data.instance.reference === boundariesElement) {\\n    boundariesElement = getOffsetParent(boundariesElement);\\n  }\\n\\n  // NOTE: DOM access here\\n  // resets the popper's position so that the document size can be calculated excluding\\n  // the size of the popper element itself\\n  var transformProp = getSupportedPropertyName('transform');\\n  var popperStyles = data.instance.popper.style; // assignment to help minification\\n  var top = popperStyles.top,\\n      left = popperStyles.left,\\n      transform = popperStyles[transformProp];\\n\\n  popperStyles.top = '';\\n  popperStyles.left = '';\\n  popperStyles[transformProp] = '';\\n\\n  var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement, data.positionFixed);\\n\\n  // NOTE: DOM access here\\n  // restores the original style properties after the offsets have been computed\\n  popperStyles.top = top;\\n  popperStyles.left = left;\\n  popperStyles[transformProp] = transform;\\n\\n  options.boundaries = boundaries;\\n\\n  var order = options.priority;\\n  var popper = data.offsets.popper;\\n\\n  var check = {\\n    primary: function primary(placement) {\\n      var value = popper[placement];\\n      if (popper[placement] < boundaries[placement] && !options.escapeWithReference) {\\n        value = Math.max(popper[placement], boundaries[placement]);\\n      }\\n      return defineProperty({}, placement, value);\\n    },\\n    secondary: function secondary(placement) {\\n      var mainSide = placement === 'right' ? 'left' : 'top';\\n      var value = popper[mainSide];\\n      if (popper[placement] > boundaries[placement] && !options.escapeWithReference) {\\n        value = Math.min(popper[mainSide], boundaries[placement] - (placement === 'right' ? popper.width : popper.height));\\n      }\\n      return defineProperty({}, mainSide, value);\\n    }\\n  };\\n\\n  order.forEach(function (placement) {\\n    var side = ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary';\\n    popper = _extends({}, popper, check[side](placement));\\n  });\\n\\n  data.offsets.popper = popper;\\n\\n  return data;\\n}\\n\\n/**\\n * @function\\n * @memberof Modifiers\\n * @argument {Object} data - The data object generated by `update` method\\n * @argument {Object} options - Modifiers configuration and options\\n * @returns {Object} The data object, properly modified\\n */\\nfunction shift(data) {\\n  var placement = data.placement;\\n  var basePlacement = placement.split('-')[0];\\n  var shiftvariation = placement.split('-')[1];\\n\\n  // if shift shiftvariation is specified, run the modifier\\n  if (shiftvariation) {\\n    var _data$offsets = data.offsets,\\n        reference = _data$offsets.reference,\\n        popper = _data$offsets.popper;\\n\\n    var isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1;\\n    var side = isVertical ? 'left' : 'top';\\n    var measurement = isVertical ? 'width' : 'height';\\n\\n    var shiftOffsets = {\\n      start: defineProperty({}, side, reference[side]),\\n      end: defineProperty({}, side, reference[side] + reference[measurement] - popper[measurement])\\n    };\\n\\n    data.offsets.popper = _extends({}, popper, shiftOffsets[shiftvariation]);\\n  }\\n\\n  return data;\\n}\\n\\n/**\\n * @function\\n * @memberof Modifiers\\n * @argument {Object} data - The data object generated by update method\\n * @argument {Object} options - Modifiers configuration and options\\n * @returns {Object} The data object, properly modified\\n */\\nfunction hide(data) {\\n  if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) {\\n    return data;\\n  }\\n\\n  var refRect = data.offsets.reference;\\n  var bound = find(data.instance.modifiers, function (modifier) {\\n    return modifier.name === 'preventOverflow';\\n  }).boundaries;\\n\\n  if (refRect.bottom < bound.top || refRect.left > bound.right || refRect.top > bound.bottom || refRect.right < bound.left) {\\n    // Avoid unnecessary DOM access if visibility hasn't changed\\n    if (data.hide === true) {\\n      return data;\\n    }\\n\\n    data.hide = true;\\n    data.attributes['x-out-of-boundaries'] = '';\\n  } else {\\n    // Avoid unnecessary DOM access if visibility hasn't changed\\n    if (data.hide === false) {\\n      return data;\\n    }\\n\\n    data.hide = false;\\n    data.attributes['x-out-of-boundaries'] = false;\\n  }\\n\\n  return data;\\n}\\n\\n/**\\n * @function\\n * @memberof Modifiers\\n * @argument {Object} data - The data object generated by `update` method\\n * @argument {Object} options - Modifiers configuration and options\\n * @returns {Object} The data object, properly modified\\n */\\nfunction inner(data) {\\n  var placement = data.placement;\\n  var basePlacement = placement.split('-')[0];\\n  var _data$offsets = data.offsets,\\n      popper = _data$offsets.popper,\\n      reference = _data$offsets.reference;\\n\\n  var isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1;\\n\\n  var subtractLength = ['top', 'left'].indexOf(basePlacement) === -1;\\n\\n  popper[isHoriz ? 'left' : 'top'] = reference[basePlacement] - (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0);\\n\\n  data.placement = getOppositePlacement(placement);\\n  data.offsets.popper = getClientRect(popper);\\n\\n  return data;\\n}\\n\\n/**\\n * Modifier function, each modifier can have a function of this type assigned\\n * to its `fn` property.<br />\\n * These functions will be called on each update, this means that you must\\n * make sure they are performant enough to avoid performance bottlenecks.\\n *\\n * @function ModifierFn\\n * @argument {dataObject} data - The data object generated by `update` method\\n * @argument {Object} options - Modifiers configuration and options\\n * @returns {dataObject} The data object, properly modified\\n */\\n\\n/**\\n * Modifiers are plugins used to alter the behavior of your poppers.<br />\\n * Popper.js uses a set of 9 modifiers to provide all the basic functionalities\\n * needed by the library.\\n *\\n * Usually you don't want to override the `order`, `fn` and `onLoad` props.\\n * All the other properties are configurations that could be tweaked.\\n * @namespace modifiers\\n */\\nvar modifiers = {\\n  /**\\n   * Modifier used to shift the popper on the start or end of its reference\\n   * element.<br />\\n   * It will read the variation of the `placement` property.<br />\\n   * It can be one either `-end` or `-start`.\\n   * @memberof modifiers\\n   * @inner\\n   */\\n  shift: {\\n    /** @prop {number} order=100 - Index used to define the order of execution */\\n    order: 100,\\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\\n    enabled: true,\\n    /** @prop {ModifierFn} */\\n    fn: shift\\n  },\\n\\n  /**\\n   * The `offset` modifier can shift your popper on both its axis.\\n   *\\n   * It accepts the following units:\\n   * - `px` or unit-less, interpreted as pixels\\n   * - `%` or `%r`, percentage relative to the length of the reference element\\n   * - `%p`, percentage relative to the length of the popper element\\n   * - `vw`, CSS viewport width unit\\n   * - `vh`, CSS viewport height unit\\n   *\\n   * For length is intended the main axis relative to the placement of the popper.<br />\\n   * This means that if the placement is `top` or `bottom`, the length will be the\\n   * `width`. In case of `left` or `right`, it will be the `height`.\\n   *\\n   * You can provide a single value (as `Number` or `String`), or a pair of values\\n   * as `String` divided by a comma or one (or more) white spaces.<br />\\n   * The latter is a deprecated method because it leads to confusion and will be\\n   * removed in v2.<br />\\n   * Additionally, it accepts additions and subtractions between different units.\\n   * Note that multiplications and divisions aren't supported.\\n   *\\n   * Valid examples are:\\n   * ```\\n   * 10\\n   * '10%'\\n   * '10, 10'\\n   * '10%, 10'\\n   * '10 + 10%'\\n   * '10 - 5vh + 3%'\\n   * '-10px + 5vh, 5px - 6%'\\n   * ```\\n   * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap\\n   * > with their reference element, unfortunately, you will have to disable the `flip` modifier.\\n   * > You can read more on this at this [issue](https://github.com/FezVrasta/popper.js/issues/373).\\n   *\\n   * @memberof modifiers\\n   * @inner\\n   */\\n  offset: {\\n    /** @prop {number} order=200 - Index used to define the order of execution */\\n    order: 200,\\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\\n    enabled: true,\\n    /** @prop {ModifierFn} */\\n    fn: offset,\\n    /** @prop {Number|String} offset=0\\n     * The offset value as described in the modifier description\\n     */\\n    offset: 0\\n  },\\n\\n  /**\\n   * Modifier used to prevent the popper from being positioned outside the boundary.\\n   *\\n   * A scenario exists where the reference itself is not within the boundaries.<br />\\n   * We can say it has \\\"escaped the boundaries\\\" — or just \\\"escaped\\\".<br />\\n   * In this case we need to decide whether the popper should either:\\n   *\\n   * - detach from the reference and remain \\\"trapped\\\" in the boundaries, or\\n   * - if it should ignore the boundary and \\\"escape with its reference\\\"\\n   *\\n   * When `escapeWithReference` is set to`true` and reference is completely\\n   * outside its boundaries, the popper will overflow (or completely leave)\\n   * the boundaries in order to remain attached to the edge of the reference.\\n   *\\n   * @memberof modifiers\\n   * @inner\\n   */\\n  preventOverflow: {\\n    /** @prop {number} order=300 - Index used to define the order of execution */\\n    order: 300,\\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\\n    enabled: true,\\n    /** @prop {ModifierFn} */\\n    fn: preventOverflow,\\n    /**\\n     * @prop {Array} [priority=['left','right','top','bottom']]\\n     * Popper will try to prevent overflow following these priorities by default,\\n     * then, it could overflow on the left and on top of the `boundariesElement`\\n     */\\n    priority: ['left', 'right', 'top', 'bottom'],\\n    /**\\n     * @prop {number} padding=5\\n     * Amount of pixel used to define a minimum distance between the boundaries\\n     * and the popper. This makes sure the popper always has a little padding\\n     * between the edges of its container\\n     */\\n    padding: 5,\\n    /**\\n     * @prop {String|HTMLElement} boundariesElement='scrollParent'\\n     * Boundaries used by the modifier. Can be `scrollParent`, `window`,\\n     * `viewport` or any DOM element.\\n     */\\n    boundariesElement: 'scrollParent'\\n  },\\n\\n  /**\\n   * Modifier used to make sure the reference and its popper stay near each other\\n   * without leaving any gap between the two. Especially useful when the arrow is\\n   * enabled and you want to ensure that it points to its reference element.\\n   * It cares only about the first axis. You can still have poppers with margin\\n   * between the popper and its reference element.\\n   * @memberof modifiers\\n   * @inner\\n   */\\n  keepTogether: {\\n    /** @prop {number} order=400 - Index used to define the order of execution */\\n    order: 400,\\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\\n    enabled: true,\\n    /** @prop {ModifierFn} */\\n    fn: keepTogether\\n  },\\n\\n  /**\\n   * This modifier is used to move the `arrowElement` of the popper to make\\n   * sure it is positioned between the reference element and its popper element.\\n   * It will read the outer size of the `arrowElement` node to detect how many\\n   * pixels of conjunction are needed.\\n   *\\n   * It has no effect if no `arrowElement` is provided.\\n   * @memberof modifiers\\n   * @inner\\n   */\\n  arrow: {\\n    /** @prop {number} order=500 - Index used to define the order of execution */\\n    order: 500,\\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\\n    enabled: true,\\n    /** @prop {ModifierFn} */\\n    fn: arrow,\\n    /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */\\n    element: '[x-arrow]'\\n  },\\n\\n  /**\\n   * Modifier used to flip the popper's placement when it starts to overlap its\\n   * reference element.\\n   *\\n   * Requires the `preventOverflow` modifier before it in order to work.\\n   *\\n   * **NOTE:** this modifier will interrupt the current update cycle and will\\n   * restart it if it detects the need to flip the placement.\\n   * @memberof modifiers\\n   * @inner\\n   */\\n  flip: {\\n    /** @prop {number} order=600 - Index used to define the order of execution */\\n    order: 600,\\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\\n    enabled: true,\\n    /** @prop {ModifierFn} */\\n    fn: flip,\\n    /**\\n     * @prop {String|Array} behavior='flip'\\n     * The behavior used to change the popper's placement. It can be one of\\n     * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid\\n     * placements (with optional variations)\\n     */\\n    behavior: 'flip',\\n    /**\\n     * @prop {number} padding=5\\n     * The popper will flip if it hits the edges of the `boundariesElement`\\n     */\\n    padding: 5,\\n    /**\\n     * @prop {String|HTMLElement} boundariesElement='viewport'\\n     * The element which will define the boundaries of the popper position.\\n     * The popper will never be placed outside of the defined boundaries\\n     * (except if `keepTogether` is enabled)\\n     */\\n    boundariesElement: 'viewport'\\n  },\\n\\n  /**\\n   * Modifier used to make the popper flow toward the inner of the reference element.\\n   * By default, when this modifier is disabled, the popper will be placed outside\\n   * the reference element.\\n   * @memberof modifiers\\n   * @inner\\n   */\\n  inner: {\\n    /** @prop {number} order=700 - Index used to define the order of execution */\\n    order: 700,\\n    /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */\\n    enabled: false,\\n    /** @prop {ModifierFn} */\\n    fn: inner\\n  },\\n\\n  /**\\n   * Modifier used to hide the popper when its reference element is outside of the\\n   * popper boundaries. It will set a `x-out-of-boundaries` attribute which can\\n   * be used to hide with a CSS selector the popper when its reference is\\n   * out of boundaries.\\n   *\\n   * Requires the `preventOverflow` modifier before it in order to work.\\n   * @memberof modifiers\\n   * @inner\\n   */\\n  hide: {\\n    /** @prop {number} order=800 - Index used to define the order of execution */\\n    order: 800,\\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\\n    enabled: true,\\n    /** @prop {ModifierFn} */\\n    fn: hide\\n  },\\n\\n  /**\\n   * Computes the style that will be applied to the popper element to gets\\n   * properly positioned.\\n   *\\n   * Note that this modifier will not touch the DOM, it just prepares the styles\\n   * so that `applyStyle` modifier can apply it. This separation is useful\\n   * in case you need to replace `applyStyle` with a custom implementation.\\n   *\\n   * This modifier has `850` as `order` value to maintain backward compatibility\\n   * with previous versions of Popper.js. Expect the modifiers ordering method\\n   * to change in future major versions of the library.\\n   *\\n   * @memberof modifiers\\n   * @inner\\n   */\\n  computeStyle: {\\n    /** @prop {number} order=850 - Index used to define the order of execution */\\n    order: 850,\\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\\n    enabled: true,\\n    /** @prop {ModifierFn} */\\n    fn: computeStyle,\\n    /**\\n     * @prop {Boolean} gpuAcceleration=true\\n     * If true, it uses the CSS 3D transformation to position the popper.\\n     * Otherwise, it will use the `top` and `left` properties\\n     */\\n    gpuAcceleration: true,\\n    /**\\n     * @prop {string} [x='bottom']\\n     * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin.\\n     * Change this if your popper should grow in a direction different from `bottom`\\n     */\\n    x: 'bottom',\\n    /**\\n     * @prop {string} [x='left']\\n     * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin.\\n     * Change this if your popper should grow in a direction different from `right`\\n     */\\n    y: 'right'\\n  },\\n\\n  /**\\n   * Applies the computed styles to the popper element.\\n   *\\n   * All the DOM manipulations are limited to this modifier. This is useful in case\\n   * you want to integrate Popper.js inside a framework or view library and you\\n   * want to delegate all the DOM manipulations to it.\\n   *\\n   * Note that if you disable this modifier, you must make sure the popper element\\n   * has its position set to `absolute` before Popper.js can do its work!\\n   *\\n   * Just disable this modifier and define your own to achieve the desired effect.\\n   *\\n   * @memberof modifiers\\n   * @inner\\n   */\\n  applyStyle: {\\n    /** @prop {number} order=900 - Index used to define the order of execution */\\n    order: 900,\\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\\n    enabled: true,\\n    /** @prop {ModifierFn} */\\n    fn: applyStyle,\\n    /** @prop {Function} */\\n    onLoad: applyStyleOnLoad,\\n    /**\\n     * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier\\n     * @prop {Boolean} gpuAcceleration=true\\n     * If true, it uses the CSS 3D transformation to position the popper.\\n     * Otherwise, it will use the `top` and `left` properties\\n     */\\n    gpuAcceleration: undefined\\n  }\\n};\\n\\n/**\\n * The `dataObject` is an object containing all the information used by Popper.js.\\n * This object is passed to modifiers and to the `onCreate` and `onUpdate` callbacks.\\n * @name dataObject\\n * @property {Object} data.instance The Popper.js instance\\n * @property {String} data.placement Placement applied to popper\\n * @property {String} data.originalPlacement Placement originally defined on init\\n * @property {Boolean} data.flipped True if popper has been flipped by flip modifier\\n * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper\\n * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier\\n * @property {Object} data.styles Any CSS property defined here will be applied to the popper. It expects the JavaScript nomenclature (eg. `marginBottom`)\\n * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow. It expects the JavaScript nomenclature (eg. `marginBottom`)\\n * @property {Object} data.boundaries Offsets of the popper boundaries\\n * @property {Object} data.offsets The measurements of popper, reference and arrow elements\\n * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values\\n * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values\\n * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0\\n */\\n\\n/**\\n * Default options provided to Popper.js constructor.<br />\\n * These can be overridden using the `options` argument of Popper.js.<br />\\n * To override an option, simply pass an object with the same\\n * structure of the `options` object, as the 3rd argument. For example:\\n * ```\\n * new Popper(ref, pop, {\\n *   modifiers: {\\n *     preventOverflow: { enabled: false }\\n *   }\\n * })\\n * ```\\n * @type {Object}\\n * @static\\n * @memberof Popper\\n */\\nvar Defaults = {\\n  /**\\n   * Popper's placement.\\n   * @prop {Popper.placements} placement='bottom'\\n   */\\n  placement: 'bottom',\\n\\n  /**\\n   * Set this to true if you want popper to position it self in 'fixed' mode\\n   * @prop {Boolean} positionFixed=false\\n   */\\n  positionFixed: false,\\n\\n  /**\\n   * Whether events (resize, scroll) are initially enabled.\\n   * @prop {Boolean} eventsEnabled=true\\n   */\\n  eventsEnabled: true,\\n\\n  /**\\n   * Set to true if you want to automatically remove the popper when\\n   * you call the `destroy` method.\\n   * @prop {Boolean} removeOnDestroy=false\\n   */\\n  removeOnDestroy: false,\\n\\n  /**\\n   * Callback called when the popper is created.<br />\\n   * By default, it is set to no-op.<br />\\n   * Access Popper.js instance with `data.instance`.\\n   * @prop {onCreate}\\n   */\\n  onCreate: function onCreate() {},\\n\\n  /**\\n   * Callback called when the popper is updated. This callback is not called\\n   * on the initialization/creation of the popper, but only on subsequent\\n   * updates.<br />\\n   * By default, it is set to no-op.<br />\\n   * Access Popper.js instance with `data.instance`.\\n   * @prop {onUpdate}\\n   */\\n  onUpdate: function onUpdate() {},\\n\\n  /**\\n   * List of modifiers used to modify the offsets before they are applied to the popper.\\n   * They provide most of the functionalities of Popper.js.\\n   * @prop {modifiers}\\n   */\\n  modifiers: modifiers\\n};\\n\\n/**\\n * @callback onCreate\\n * @param {dataObject} data\\n */\\n\\n/**\\n * @callback onUpdate\\n * @param {dataObject} data\\n */\\n\\n// Utils\\n// Methods\\nvar Popper = function () {\\n  /**\\n   * Creates a new Popper.js instance.\\n   * @class Popper\\n   * @param {HTMLElement|referenceObject} reference - The reference element used to position the popper\\n   * @param {HTMLElement} popper - The HTML element used as the popper\\n   * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)\\n   * @return {Object} instance - The generated Popper.js instance\\n   */\\n  function Popper(reference, popper) {\\n    var _this = this;\\n\\n    var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\\n    classCallCheck(this, Popper);\\n\\n    this.scheduleUpdate = function () {\\n      return requestAnimationFrame(_this.update);\\n    };\\n\\n    // make update() debounced, so that it only runs at most once-per-tick\\n    this.update = debounce(this.update.bind(this));\\n\\n    // with {} we create a new object with the options inside it\\n    this.options = _extends({}, Popper.Defaults, options);\\n\\n    // init state\\n    this.state = {\\n      isDestroyed: false,\\n      isCreated: false,\\n      scrollParents: []\\n    };\\n\\n    // get reference and popper elements (allow jQuery wrappers)\\n    this.reference = reference && reference.jquery ? reference[0] : reference;\\n    this.popper = popper && popper.jquery ? popper[0] : popper;\\n\\n    // Deep merge modifiers options\\n    this.options.modifiers = {};\\n    Object.keys(_extends({}, Popper.Defaults.modifiers, options.modifiers)).forEach(function (name) {\\n      _this.options.modifiers[name] = _extends({}, Popper.Defaults.modifiers[name] || {}, options.modifiers ? options.modifiers[name] : {});\\n    });\\n\\n    // Refactoring modifiers' list (Object => Array)\\n    this.modifiers = Object.keys(this.options.modifiers).map(function (name) {\\n      return _extends({\\n        name: name\\n      }, _this.options.modifiers[name]);\\n    })\\n    // sort the modifiers by order\\n    .sort(function (a, b) {\\n      return a.order - b.order;\\n    });\\n\\n    // modifiers have the ability to execute arbitrary code when Popper.js get inited\\n    // such code is executed in the same order of its modifier\\n    // they could add new properties to their options configuration\\n    // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`!\\n    this.modifiers.forEach(function (modifierOptions) {\\n      if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) {\\n        modifierOptions.onLoad(_this.reference, _this.popper, _this.options, modifierOptions, _this.state);\\n      }\\n    });\\n\\n    // fire the first update to position the popper in the right place\\n    this.update();\\n\\n    var eventsEnabled = this.options.eventsEnabled;\\n    if (eventsEnabled) {\\n      // setup event listeners, they will take care of update the position in specific situations\\n      this.enableEventListeners();\\n    }\\n\\n    this.state.eventsEnabled = eventsEnabled;\\n  }\\n\\n  // We can't use class properties because they don't get listed in the\\n  // class prototype and break stuff like Sinon stubs\\n\\n\\n  createClass(Popper, [{\\n    key: 'update',\\n    value: function update$$1() {\\n      return update.call(this);\\n    }\\n  }, {\\n    key: 'destroy',\\n    value: function destroy$$1() {\\n      return destroy.call(this);\\n    }\\n  }, {\\n    key: 'enableEventListeners',\\n    value: function enableEventListeners$$1() {\\n      return enableEventListeners.call(this);\\n    }\\n  }, {\\n    key: 'disableEventListeners',\\n    value: function disableEventListeners$$1() {\\n      return disableEventListeners.call(this);\\n    }\\n\\n    /**\\n     * Schedules an update. It will run on the next UI update available.\\n     * @method scheduleUpdate\\n     * @memberof Popper\\n     */\\n\\n\\n    /**\\n     * Collection of utilities useful when writing custom modifiers.\\n     * Starting from version 1.7, this method is available only if you\\n     * include `popper-utils.js` before `popper.js`.\\n     *\\n     * **DEPRECATION**: This way to access PopperUtils is deprecated\\n     * and will be removed in v2! Use the PopperUtils module directly instead.\\n     * Due to the high instability of the methods contained in Utils, we can't\\n     * guarantee them to follow semver. Use them at your own risk!\\n     * @static\\n     * @private\\n     * @type {Object}\\n     * @deprecated since version 1.8\\n     * @member Utils\\n     * @memberof Popper\\n     */\\n\\n  }]);\\n  return Popper;\\n}();\\n\\n/**\\n * The `referenceObject` is an object that provides an interface compatible with Popper.js\\n * and lets you use it as replacement of a real DOM node.<br />\\n * You can use this method to position a popper relatively to a set of coordinates\\n * in case you don't have a DOM node to use as reference.\\n *\\n * ```\\n * new Popper(referenceObject, popperNode);\\n * ```\\n *\\n * NB: This feature isn't supported in Internet Explorer 10.\\n * @name referenceObject\\n * @property {Function} data.getBoundingClientRect\\n * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method.\\n * @property {number} data.clientWidth\\n * An ES6 getter that will return the width of the virtual reference element.\\n * @property {number} data.clientHeight\\n * An ES6 getter that will return the height of the virtual reference element.\\n */\\n\\n\\nPopper.Utils = (typeof window !== 'undefined' ? window : global).PopperUtils;\\nPopper.placements = placements;\\nPopper.Defaults = Defaults;\\n\\nexport default Popper;\\n//# sourceMappingURL=popper.js.map\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): dropdown.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\nimport Popper from 'popper.js'\\nimport Util from './util'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME                     = 'dropdown'\\nconst VERSION                  = '4.3.1'\\nconst DATA_KEY                 = 'bs.dropdown'\\nconst EVENT_KEY                = `.${DATA_KEY}`\\nconst DATA_API_KEY             = '.data-api'\\nconst JQUERY_NO_CONFLICT       = $.fn[NAME]\\nconst ESCAPE_KEYCODE           = 27 // KeyboardEvent.which value for Escape (Esc) key\\nconst SPACE_KEYCODE            = 32 // KeyboardEvent.which value for space key\\nconst TAB_KEYCODE              = 9 // KeyboardEvent.which value for tab key\\nconst ARROW_UP_KEYCODE         = 38 // KeyboardEvent.which value for up arrow key\\nconst ARROW_DOWN_KEYCODE       = 40 // KeyboardEvent.which value for down arrow key\\nconst RIGHT_MOUSE_BUTTON_WHICH = 3 // MouseEvent.which value for the right button (assuming a right-handed mouse)\\nconst REGEXP_KEYDOWN           = new RegExp(`${ARROW_UP_KEYCODE}|${ARROW_DOWN_KEYCODE}|${ESCAPE_KEYCODE}`)\\n\\nconst Event = {\\n  HIDE             : `hide${EVENT_KEY}`,\\n  HIDDEN           : `hidden${EVENT_KEY}`,\\n  SHOW             : `show${EVENT_KEY}`,\\n  SHOWN            : `shown${EVENT_KEY}`,\\n  CLICK            : `click${EVENT_KEY}`,\\n  CLICK_DATA_API   : `click${EVENT_KEY}${DATA_API_KEY}`,\\n  KEYDOWN_DATA_API : `keydown${EVENT_KEY}${DATA_API_KEY}`,\\n  KEYUP_DATA_API   : `keyup${EVENT_KEY}${DATA_API_KEY}`\\n}\\n\\nconst ClassName = {\\n  DISABLED        : 'disabled',\\n  SHOW            : 'show',\\n  DROPUP          : 'dropup',\\n  DROPRIGHT       : 'dropright',\\n  DROPLEFT        : 'dropleft',\\n  MENURIGHT       : 'dropdown-menu-right',\\n  MENULEFT        : 'dropdown-menu-left',\\n  POSITION_STATIC : 'position-static'\\n}\\n\\nconst Selector = {\\n  DATA_TOGGLE   : '[data-toggle=\\\"dropdown\\\"]',\\n  FORM_CHILD    : '.dropdown form',\\n  MENU          : '.dropdown-menu',\\n  NAVBAR_NAV    : '.navbar-nav',\\n  VISIBLE_ITEMS : '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\\n}\\n\\nconst AttachmentMap = {\\n  TOP       : 'top-start',\\n  TOPEND    : 'top-end',\\n  BOTTOM    : 'bottom-start',\\n  BOTTOMEND : 'bottom-end',\\n  RIGHT     : 'right-start',\\n  RIGHTEND  : 'right-end',\\n  LEFT      : 'left-start',\\n  LEFTEND   : 'left-end'\\n}\\n\\nconst Default = {\\n  offset    : 0,\\n  flip      : true,\\n  boundary  : 'scrollParent',\\n  reference : 'toggle',\\n  display   : 'dynamic'\\n}\\n\\nconst DefaultType = {\\n  offset    : '(number|string|function)',\\n  flip      : 'boolean',\\n  boundary  : '(string|element)',\\n  reference : '(string|element)',\\n  display   : 'string'\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass Dropdown {\\n  constructor(element, config) {\\n    this._element  = element\\n    this._popper   = null\\n    this._config   = this._getConfig(config)\\n    this._menu     = this._getMenuElement()\\n    this._inNavbar = this._detectNavbar()\\n\\n    this._addEventListeners()\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  static get Default() {\\n    return Default\\n  }\\n\\n  static get DefaultType() {\\n    return DefaultType\\n  }\\n\\n  // Public\\n\\n  toggle() {\\n    if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED)) {\\n      return\\n    }\\n\\n    const parent   = Dropdown._getParentFromElement(this._element)\\n    const isActive = $(this._menu).hasClass(ClassName.SHOW)\\n\\n    Dropdown._clearMenus()\\n\\n    if (isActive) {\\n      return\\n    }\\n\\n    const relatedTarget = {\\n      relatedTarget: this._element\\n    }\\n    const showEvent = $.Event(Event.SHOW, relatedTarget)\\n\\n    $(parent).trigger(showEvent)\\n\\n    if (showEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    // Disable totally Popper.js for Dropdown in Navbar\\n    if (!this._inNavbar) {\\n      /**\\n       * Check for Popper dependency\\n       * Popper - https://popper.js.org\\n       */\\n      if (typeof Popper === 'undefined') {\\n        throw new TypeError('Bootstrap\\\\'s dropdowns require Popper.js (https://popper.js.org/)')\\n      }\\n\\n      let referenceElement = this._element\\n\\n      if (this._config.reference === 'parent') {\\n        referenceElement = parent\\n      } else if (Util.isElement(this._config.reference)) {\\n        referenceElement = this._config.reference\\n\\n        // Check if it's jQuery element\\n        if (typeof this._config.reference.jquery !== 'undefined') {\\n          referenceElement = this._config.reference[0]\\n        }\\n      }\\n\\n      // If boundary is not `scrollParent`, then set position to `static`\\n      // to allow the menu to \\\"escape\\\" the scroll parent's boundaries\\n      // https://github.com/twbs/bootstrap/issues/24251\\n      if (this._config.boundary !== 'scrollParent') {\\n        $(parent).addClass(ClassName.POSITION_STATIC)\\n      }\\n      this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig())\\n    }\\n\\n    // If this is a touch-enabled device we add extra\\n    // empty mouseover listeners to the body's immediate children;\\n    // only needed because of broken event delegation on iOS\\n    // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\\n    if ('ontouchstart' in document.documentElement &&\\n        $(parent).closest(Selector.NAVBAR_NAV).length === 0) {\\n      $(document.body).children().on('mouseover', null, $.noop)\\n    }\\n\\n    this._element.focus()\\n    this._element.setAttribute('aria-expanded', true)\\n\\n    $(this._menu).toggleClass(ClassName.SHOW)\\n    $(parent)\\n      .toggleClass(ClassName.SHOW)\\n      .trigger($.Event(Event.SHOWN, relatedTarget))\\n  }\\n\\n  show() {\\n    if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || $(this._menu).hasClass(ClassName.SHOW)) {\\n      return\\n    }\\n\\n    const relatedTarget = {\\n      relatedTarget: this._element\\n    }\\n    const showEvent = $.Event(Event.SHOW, relatedTarget)\\n    const parent = Dropdown._getParentFromElement(this._element)\\n\\n    $(parent).trigger(showEvent)\\n\\n    if (showEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    $(this._menu).toggleClass(ClassName.SHOW)\\n    $(parent)\\n      .toggleClass(ClassName.SHOW)\\n      .trigger($.Event(Event.SHOWN, relatedTarget))\\n  }\\n\\n  hide() {\\n    if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || !$(this._menu).hasClass(ClassName.SHOW)) {\\n      return\\n    }\\n\\n    const relatedTarget = {\\n      relatedTarget: this._element\\n    }\\n    const hideEvent = $.Event(Event.HIDE, relatedTarget)\\n    const parent = Dropdown._getParentFromElement(this._element)\\n\\n    $(parent).trigger(hideEvent)\\n\\n    if (hideEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    $(this._menu).toggleClass(ClassName.SHOW)\\n    $(parent)\\n      .toggleClass(ClassName.SHOW)\\n      .trigger($.Event(Event.HIDDEN, relatedTarget))\\n  }\\n\\n  dispose() {\\n    $.removeData(this._element, DATA_KEY)\\n    $(this._element).off(EVENT_KEY)\\n    this._element = null\\n    this._menu = null\\n    if (this._popper !== null) {\\n      this._popper.destroy()\\n      this._popper = null\\n    }\\n  }\\n\\n  update() {\\n    this._inNavbar = this._detectNavbar()\\n    if (this._popper !== null) {\\n      this._popper.scheduleUpdate()\\n    }\\n  }\\n\\n  // Private\\n\\n  _addEventListeners() {\\n    $(this._element).on(Event.CLICK, (event) => {\\n      event.preventDefault()\\n      event.stopPropagation()\\n      this.toggle()\\n    })\\n  }\\n\\n  _getConfig(config) {\\n    config = {\\n      ...this.constructor.Default,\\n      ...$(this._element).data(),\\n      ...config\\n    }\\n\\n    Util.typeCheckConfig(\\n      NAME,\\n      config,\\n      this.constructor.DefaultType\\n    )\\n\\n    return config\\n  }\\n\\n  _getMenuElement() {\\n    if (!this._menu) {\\n      const parent = Dropdown._getParentFromElement(this._element)\\n\\n      if (parent) {\\n        this._menu = parent.querySelector(Selector.MENU)\\n      }\\n    }\\n    return this._menu\\n  }\\n\\n  _getPlacement() {\\n    const $parentDropdown = $(this._element.parentNode)\\n    let placement = AttachmentMap.BOTTOM\\n\\n    // Handle dropup\\n    if ($parentDropdown.hasClass(ClassName.DROPUP)) {\\n      placement = AttachmentMap.TOP\\n      if ($(this._menu).hasClass(ClassName.MENURIGHT)) {\\n        placement = AttachmentMap.TOPEND\\n      }\\n    } else if ($parentDropdown.hasClass(ClassName.DROPRIGHT)) {\\n      placement = AttachmentMap.RIGHT\\n    } else if ($parentDropdown.hasClass(ClassName.DROPLEFT)) {\\n      placement = AttachmentMap.LEFT\\n    } else if ($(this._menu).hasClass(ClassName.MENURIGHT)) {\\n      placement = AttachmentMap.BOTTOMEND\\n    }\\n    return placement\\n  }\\n\\n  _detectNavbar() {\\n    return $(this._element).closest('.navbar').length > 0\\n  }\\n\\n  _getOffset() {\\n    const offset = {}\\n\\n    if (typeof this._config.offset === 'function') {\\n      offset.fn = (data) => {\\n        data.offsets = {\\n          ...data.offsets,\\n          ...this._config.offset(data.offsets, this._element) || {}\\n        }\\n\\n        return data\\n      }\\n    } else {\\n      offset.offset = this._config.offset\\n    }\\n\\n    return offset\\n  }\\n\\n  _getPopperConfig() {\\n    const popperConfig = {\\n      placement: this._getPlacement(),\\n      modifiers: {\\n        offset: this._getOffset(),\\n        flip: {\\n          enabled: this._config.flip\\n        },\\n        preventOverflow: {\\n          boundariesElement: this._config.boundary\\n        }\\n      }\\n    }\\n\\n    // Disable Popper.js if we have a static display\\n    if (this._config.display === 'static') {\\n      popperConfig.modifiers.applyStyle = {\\n        enabled: false\\n      }\\n    }\\n\\n    return popperConfig\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      let data = $(this).data(DATA_KEY)\\n      const _config = typeof config === 'object' ? config : null\\n\\n      if (!data) {\\n        data = new Dropdown(this, _config)\\n        $(this).data(DATA_KEY, data)\\n      }\\n\\n      if (typeof config === 'string') {\\n        if (typeof data[config] === 'undefined') {\\n          throw new TypeError(`No method named \\\"${config}\\\"`)\\n        }\\n        data[config]()\\n      }\\n    })\\n  }\\n\\n  static _clearMenus(event) {\\n    if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH ||\\n      event.type === 'keyup' && event.which !== TAB_KEYCODE)) {\\n      return\\n    }\\n\\n    const toggles = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE))\\n\\n    for (let i = 0, len = toggles.length; i < len; i++) {\\n      const parent = Dropdown._getParentFromElement(toggles[i])\\n      const context = $(toggles[i]).data(DATA_KEY)\\n      const relatedTarget = {\\n        relatedTarget: toggles[i]\\n      }\\n\\n      if (event && event.type === 'click') {\\n        relatedTarget.clickEvent = event\\n      }\\n\\n      if (!context) {\\n        continue\\n      }\\n\\n      const dropdownMenu = context._menu\\n      if (!$(parent).hasClass(ClassName.SHOW)) {\\n        continue\\n      }\\n\\n      if (event && (event.type === 'click' &&\\n          /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) &&\\n          $.contains(parent, event.target)) {\\n        continue\\n      }\\n\\n      const hideEvent = $.Event(Event.HIDE, relatedTarget)\\n      $(parent).trigger(hideEvent)\\n      if (hideEvent.isDefaultPrevented()) {\\n        continue\\n      }\\n\\n      // If this is a touch-enabled device we remove the extra\\n      // empty mouseover listeners we added for iOS support\\n      if ('ontouchstart' in document.documentElement) {\\n        $(document.body).children().off('mouseover', null, $.noop)\\n      }\\n\\n      toggles[i].setAttribute('aria-expanded', 'false')\\n\\n      $(dropdownMenu).removeClass(ClassName.SHOW)\\n      $(parent)\\n        .removeClass(ClassName.SHOW)\\n        .trigger($.Event(Event.HIDDEN, relatedTarget))\\n    }\\n  }\\n\\n  static _getParentFromElement(element) {\\n    let parent\\n    const selector = Util.getSelectorFromElement(element)\\n\\n    if (selector) {\\n      parent = document.querySelector(selector)\\n    }\\n\\n    return parent || element.parentNode\\n  }\\n\\n  // eslint-disable-next-line complexity\\n  static _dataApiKeydownHandler(event) {\\n    // If not input/textarea:\\n    //  - And not a key in REGEXP_KEYDOWN => not a dropdown command\\n    // If input/textarea:\\n    //  - If space key => not a dropdown command\\n    //  - If key is other than escape\\n    //    - If key is not up or down => not a dropdown command\\n    //    - If trigger inside the menu => not a dropdown command\\n    if (/input|textarea/i.test(event.target.tagName)\\n      ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE &&\\n      (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE ||\\n        $(event.target).closest(Selector.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {\\n      return\\n    }\\n\\n    event.preventDefault()\\n    event.stopPropagation()\\n\\n    if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {\\n      return\\n    }\\n\\n    const parent   = Dropdown._getParentFromElement(this)\\n    const isActive = $(parent).hasClass(ClassName.SHOW)\\n\\n    if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {\\n      if (event.which === ESCAPE_KEYCODE) {\\n        const toggle = parent.querySelector(Selector.DATA_TOGGLE)\\n        $(toggle).trigger('focus')\\n      }\\n\\n      $(this).trigger('click')\\n      return\\n    }\\n\\n    const items = [].slice.call(parent.querySelectorAll(Selector.VISIBLE_ITEMS))\\n\\n    if (items.length === 0) {\\n      return\\n    }\\n\\n    let index = items.indexOf(event.target)\\n\\n    if (event.which === ARROW_UP_KEYCODE && index > 0) { // Up\\n      index--\\n    }\\n\\n    if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) { // Down\\n      index++\\n    }\\n\\n    if (index < 0) {\\n      index = 0\\n    }\\n\\n    items[index].focus()\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Data Api implementation\\n * ------------------------------------------------------------------------\\n */\\n\\n$(document)\\n  .on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler)\\n  .on(Event.KEYDOWN_DATA_API, Selector.MENU, Dropdown._dataApiKeydownHandler)\\n  .on(`${Event.CLICK_DATA_API} ${Event.KEYUP_DATA_API}`, Dropdown._clearMenus)\\n  .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\\n    event.preventDefault()\\n    event.stopPropagation()\\n    Dropdown._jQueryInterface.call($(this), 'toggle')\\n  })\\n  .on(Event.CLICK_DATA_API, Selector.FORM_CHILD, (e) => {\\n    e.stopPropagation()\\n  })\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME] = Dropdown._jQueryInterface\\n$.fn[NAME].Constructor = Dropdown\\n$.fn[NAME].noConflict = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Dropdown._jQueryInterface\\n}\\n\\n\\nexport default Dropdown\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): modal.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\nimport Util from './util'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME               = 'modal'\\nconst VERSION            = '4.3.1'\\nconst DATA_KEY           = 'bs.modal'\\nconst EVENT_KEY          = `.${DATA_KEY}`\\nconst DATA_API_KEY       = '.data-api'\\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\\nconst ESCAPE_KEYCODE     = 27 // KeyboardEvent.which value for Escape (Esc) key\\n\\nconst Default = {\\n  backdrop : true,\\n  keyboard : true,\\n  focus    : true,\\n  show     : true\\n}\\n\\nconst DefaultType = {\\n  backdrop : '(boolean|string)',\\n  keyboard : 'boolean',\\n  focus    : 'boolean',\\n  show     : 'boolean'\\n}\\n\\nconst Event = {\\n  HIDE              : `hide${EVENT_KEY}`,\\n  HIDDEN            : `hidden${EVENT_KEY}`,\\n  SHOW              : `show${EVENT_KEY}`,\\n  SHOWN             : `shown${EVENT_KEY}`,\\n  FOCUSIN           : `focusin${EVENT_KEY}`,\\n  RESIZE            : `resize${EVENT_KEY}`,\\n  CLICK_DISMISS     : `click.dismiss${EVENT_KEY}`,\\n  KEYDOWN_DISMISS   : `keydown.dismiss${EVENT_KEY}`,\\n  MOUSEUP_DISMISS   : `mouseup.dismiss${EVENT_KEY}`,\\n  MOUSEDOWN_DISMISS : `mousedown.dismiss${EVENT_KEY}`,\\n  CLICK_DATA_API    : `click${EVENT_KEY}${DATA_API_KEY}`\\n}\\n\\nconst ClassName = {\\n  SCROLLABLE         : 'modal-dialog-scrollable',\\n  SCROLLBAR_MEASURER : 'modal-scrollbar-measure',\\n  BACKDROP           : 'modal-backdrop',\\n  OPEN               : 'modal-open',\\n  FADE               : 'fade',\\n  SHOW               : 'show'\\n}\\n\\nconst Selector = {\\n  DIALOG         : '.modal-dialog',\\n  MODAL_BODY     : '.modal-body',\\n  DATA_TOGGLE    : '[data-toggle=\\\"modal\\\"]',\\n  DATA_DISMISS   : '[data-dismiss=\\\"modal\\\"]',\\n  FIXED_CONTENT  : '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',\\n  STICKY_CONTENT : '.sticky-top'\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass Modal {\\n  constructor(element, config) {\\n    this._config              = this._getConfig(config)\\n    this._element             = element\\n    this._dialog              = element.querySelector(Selector.DIALOG)\\n    this._backdrop            = null\\n    this._isShown             = false\\n    this._isBodyOverflowing   = false\\n    this._ignoreBackdropClick = false\\n    this._isTransitioning     = false\\n    this._scrollbarWidth      = 0\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  static get Default() {\\n    return Default\\n  }\\n\\n  // Public\\n\\n  toggle(relatedTarget) {\\n    return this._isShown ? this.hide() : this.show(relatedTarget)\\n  }\\n\\n  show(relatedTarget) {\\n    if (this._isShown || this._isTransitioning) {\\n      return\\n    }\\n\\n    if ($(this._element).hasClass(ClassName.FADE)) {\\n      this._isTransitioning = true\\n    }\\n\\n    const showEvent = $.Event(Event.SHOW, {\\n      relatedTarget\\n    })\\n\\n    $(this._element).trigger(showEvent)\\n\\n    if (this._isShown || showEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    this._isShown = true\\n\\n    this._checkScrollbar()\\n    this._setScrollbar()\\n\\n    this._adjustDialog()\\n\\n    this._setEscapeEvent()\\n    this._setResizeEvent()\\n\\n    $(this._element).on(\\n      Event.CLICK_DISMISS,\\n      Selector.DATA_DISMISS,\\n      (event) => this.hide(event)\\n    )\\n\\n    $(this._dialog).on(Event.MOUSEDOWN_DISMISS, () => {\\n      $(this._element).one(Event.MOUSEUP_DISMISS, (event) => {\\n        if ($(event.target).is(this._element)) {\\n          this._ignoreBackdropClick = true\\n        }\\n      })\\n    })\\n\\n    this._showBackdrop(() => this._showElement(relatedTarget))\\n  }\\n\\n  hide(event) {\\n    if (event) {\\n      event.preventDefault()\\n    }\\n\\n    if (!this._isShown || this._isTransitioning) {\\n      return\\n    }\\n\\n    const hideEvent = $.Event(Event.HIDE)\\n\\n    $(this._element).trigger(hideEvent)\\n\\n    if (!this._isShown || hideEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    this._isShown = false\\n    const transition = $(this._element).hasClass(ClassName.FADE)\\n\\n    if (transition) {\\n      this._isTransitioning = true\\n    }\\n\\n    this._setEscapeEvent()\\n    this._setResizeEvent()\\n\\n    $(document).off(Event.FOCUSIN)\\n\\n    $(this._element).removeClass(ClassName.SHOW)\\n\\n    $(this._element).off(Event.CLICK_DISMISS)\\n    $(this._dialog).off(Event.MOUSEDOWN_DISMISS)\\n\\n\\n    if (transition) {\\n      const transitionDuration  = Util.getTransitionDurationFromElement(this._element)\\n\\n      $(this._element)\\n        .one(Util.TRANSITION_END, (event) => this._hideModal(event))\\n        .emulateTransitionEnd(transitionDuration)\\n    } else {\\n      this._hideModal()\\n    }\\n  }\\n\\n  dispose() {\\n    [window, this._element, this._dialog]\\n      .forEach((htmlElement) => $(htmlElement).off(EVENT_KEY))\\n\\n    /**\\n     * `document` has 2 events `Event.FOCUSIN` and `Event.CLICK_DATA_API`\\n     * Do not move `document` in `htmlElements` array\\n     * It will remove `Event.CLICK_DATA_API` event that should remain\\n     */\\n    $(document).off(Event.FOCUSIN)\\n\\n    $.removeData(this._element, DATA_KEY)\\n\\n    this._config              = null\\n    this._element             = null\\n    this._dialog              = null\\n    this._backdrop            = null\\n    this._isShown             = null\\n    this._isBodyOverflowing   = null\\n    this._ignoreBackdropClick = null\\n    this._isTransitioning     = null\\n    this._scrollbarWidth      = null\\n  }\\n\\n  handleUpdate() {\\n    this._adjustDialog()\\n  }\\n\\n  // Private\\n\\n  _getConfig(config) {\\n    config = {\\n      ...Default,\\n      ...config\\n    }\\n    Util.typeCheckConfig(NAME, config, DefaultType)\\n    return config\\n  }\\n\\n  _showElement(relatedTarget) {\\n    const transition = $(this._element).hasClass(ClassName.FADE)\\n\\n    if (!this._element.parentNode ||\\n        this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\\n      // Don't move modal's DOM position\\n      document.body.appendChild(this._element)\\n    }\\n\\n    this._element.style.display = 'block'\\n    this._element.removeAttribute('aria-hidden')\\n    this._element.setAttribute('aria-modal', true)\\n\\n    if ($(this._dialog).hasClass(ClassName.SCROLLABLE)) {\\n      this._dialog.querySelector(Selector.MODAL_BODY).scrollTop = 0\\n    } else {\\n      this._element.scrollTop = 0\\n    }\\n\\n    if (transition) {\\n      Util.reflow(this._element)\\n    }\\n\\n    $(this._element).addClass(ClassName.SHOW)\\n\\n    if (this._config.focus) {\\n      this._enforceFocus()\\n    }\\n\\n    const shownEvent = $.Event(Event.SHOWN, {\\n      relatedTarget\\n    })\\n\\n    const transitionComplete = () => {\\n      if (this._config.focus) {\\n        this._element.focus()\\n      }\\n      this._isTransitioning = false\\n      $(this._element).trigger(shownEvent)\\n    }\\n\\n    if (transition) {\\n      const transitionDuration  = Util.getTransitionDurationFromElement(this._dialog)\\n\\n      $(this._dialog)\\n        .one(Util.TRANSITION_END, transitionComplete)\\n        .emulateTransitionEnd(transitionDuration)\\n    } else {\\n      transitionComplete()\\n    }\\n  }\\n\\n  _enforceFocus() {\\n    $(document)\\n      .off(Event.FOCUSIN) // Guard against infinite focus loop\\n      .on(Event.FOCUSIN, (event) => {\\n        if (document !== event.target &&\\n            this._element !== event.target &&\\n            $(this._element).has(event.target).length === 0) {\\n          this._element.focus()\\n        }\\n      })\\n  }\\n\\n  _setEscapeEvent() {\\n    if (this._isShown && this._config.keyboard) {\\n      $(this._element).on(Event.KEYDOWN_DISMISS, (event) => {\\n        if (event.which === ESCAPE_KEYCODE) {\\n          event.preventDefault()\\n          this.hide()\\n        }\\n      })\\n    } else if (!this._isShown) {\\n      $(this._element).off(Event.KEYDOWN_DISMISS)\\n    }\\n  }\\n\\n  _setResizeEvent() {\\n    if (this._isShown) {\\n      $(window).on(Event.RESIZE, (event) => this.handleUpdate(event))\\n    } else {\\n      $(window).off(Event.RESIZE)\\n    }\\n  }\\n\\n  _hideModal() {\\n    this._element.style.display = 'none'\\n    this._element.setAttribute('aria-hidden', true)\\n    this._element.removeAttribute('aria-modal')\\n    this._isTransitioning = false\\n    this._showBackdrop(() => {\\n      $(document.body).removeClass(ClassName.OPEN)\\n      this._resetAdjustments()\\n      this._resetScrollbar()\\n      $(this._element).trigger(Event.HIDDEN)\\n    })\\n  }\\n\\n  _removeBackdrop() {\\n    if (this._backdrop) {\\n      $(this._backdrop).remove()\\n      this._backdrop = null\\n    }\\n  }\\n\\n  _showBackdrop(callback) {\\n    const animate = $(this._element).hasClass(ClassName.FADE)\\n      ? ClassName.FADE : ''\\n\\n    if (this._isShown && this._config.backdrop) {\\n      this._backdrop = document.createElement('div')\\n      this._backdrop.className = ClassName.BACKDROP\\n\\n      if (animate) {\\n        this._backdrop.classList.add(animate)\\n      }\\n\\n      $(this._backdrop).appendTo(document.body)\\n\\n      $(this._element).on(Event.CLICK_DISMISS, (event) => {\\n        if (this._ignoreBackdropClick) {\\n          this._ignoreBackdropClick = false\\n          return\\n        }\\n        if (event.target !== event.currentTarget) {\\n          return\\n        }\\n        if (this._config.backdrop === 'static') {\\n          this._element.focus()\\n        } else {\\n          this.hide()\\n        }\\n      })\\n\\n      if (animate) {\\n        Util.reflow(this._backdrop)\\n      }\\n\\n      $(this._backdrop).addClass(ClassName.SHOW)\\n\\n      if (!callback) {\\n        return\\n      }\\n\\n      if (!animate) {\\n        callback()\\n        return\\n      }\\n\\n      const backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop)\\n\\n      $(this._backdrop)\\n        .one(Util.TRANSITION_END, callback)\\n        .emulateTransitionEnd(backdropTransitionDuration)\\n    } else if (!this._isShown && this._backdrop) {\\n      $(this._backdrop).removeClass(ClassName.SHOW)\\n\\n      const callbackRemove = () => {\\n        this._removeBackdrop()\\n        if (callback) {\\n          callback()\\n        }\\n      }\\n\\n      if ($(this._element).hasClass(ClassName.FADE)) {\\n        const backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop)\\n\\n        $(this._backdrop)\\n          .one(Util.TRANSITION_END, callbackRemove)\\n          .emulateTransitionEnd(backdropTransitionDuration)\\n      } else {\\n        callbackRemove()\\n      }\\n    } else if (callback) {\\n      callback()\\n    }\\n  }\\n\\n  // ----------------------------------------------------------------------\\n  // the following methods are used to handle overflowing modals\\n  // todo (fat): these should probably be refactored out of modal.js\\n  // ----------------------------------------------------------------------\\n\\n  _adjustDialog() {\\n    const isModalOverflowing =\\n      this._element.scrollHeight > document.documentElement.clientHeight\\n\\n    if (!this._isBodyOverflowing && isModalOverflowing) {\\n      this._element.style.paddingLeft = `${this._scrollbarWidth}px`\\n    }\\n\\n    if (this._isBodyOverflowing && !isModalOverflowing) {\\n      this._element.style.paddingRight = `${this._scrollbarWidth}px`\\n    }\\n  }\\n\\n  _resetAdjustments() {\\n    this._element.style.paddingLeft = ''\\n    this._element.style.paddingRight = ''\\n  }\\n\\n  _checkScrollbar() {\\n    const rect = document.body.getBoundingClientRect()\\n    this._isBodyOverflowing = rect.left + rect.right < window.innerWidth\\n    this._scrollbarWidth = this._getScrollbarWidth()\\n  }\\n\\n  _setScrollbar() {\\n    if (this._isBodyOverflowing) {\\n      // Note: DOMNode.style.paddingRight returns the actual value or '' if not set\\n      //   while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set\\n      const fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT))\\n      const stickyContent = [].slice.call(document.querySelectorAll(Selector.STICKY_CONTENT))\\n\\n      // Adjust fixed content padding\\n      $(fixedContent).each((index, element) => {\\n        const actualPadding = element.style.paddingRight\\n        const calculatedPadding = $(element).css('padding-right')\\n        $(element)\\n          .data('padding-right', actualPadding)\\n          .css('padding-right', `${parseFloat(calculatedPadding) + this._scrollbarWidth}px`)\\n      })\\n\\n      // Adjust sticky content margin\\n      $(stickyContent).each((index, element) => {\\n        const actualMargin = element.style.marginRight\\n        const calculatedMargin = $(element).css('margin-right')\\n        $(element)\\n          .data('margin-right', actualMargin)\\n          .css('margin-right', `${parseFloat(calculatedMargin) - this._scrollbarWidth}px`)\\n      })\\n\\n      // Adjust body padding\\n      const actualPadding = document.body.style.paddingRight\\n      const calculatedPadding = $(document.body).css('padding-right')\\n      $(document.body)\\n        .data('padding-right', actualPadding)\\n        .css('padding-right', `${parseFloat(calculatedPadding) + this._scrollbarWidth}px`)\\n    }\\n\\n    $(document.body).addClass(ClassName.OPEN)\\n  }\\n\\n  _resetScrollbar() {\\n    // Restore fixed content padding\\n    const fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT))\\n    $(fixedContent).each((index, element) => {\\n      const padding = $(element).data('padding-right')\\n      $(element).removeData('padding-right')\\n      element.style.paddingRight = padding ? padding : ''\\n    })\\n\\n    // Restore sticky content\\n    const elements = [].slice.call(document.querySelectorAll(`${Selector.STICKY_CONTENT}`))\\n    $(elements).each((index, element) => {\\n      const margin = $(element).data('margin-right')\\n      if (typeof margin !== 'undefined') {\\n        $(element).css('margin-right', margin).removeData('margin-right')\\n      }\\n    })\\n\\n    // Restore body padding\\n    const padding = $(document.body).data('padding-right')\\n    $(document.body).removeData('padding-right')\\n    document.body.style.paddingRight = padding ? padding : ''\\n  }\\n\\n  _getScrollbarWidth() { // thx d.walsh\\n    const scrollDiv = document.createElement('div')\\n    scrollDiv.className = ClassName.SCROLLBAR_MEASURER\\n    document.body.appendChild(scrollDiv)\\n    const scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth\\n    document.body.removeChild(scrollDiv)\\n    return scrollbarWidth\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config, relatedTarget) {\\n    return this.each(function () {\\n      let data = $(this).data(DATA_KEY)\\n      const _config = {\\n        ...Default,\\n        ...$(this).data(),\\n        ...typeof config === 'object' && config ? config : {}\\n      }\\n\\n      if (!data) {\\n        data = new Modal(this, _config)\\n        $(this).data(DATA_KEY, data)\\n      }\\n\\n      if (typeof config === 'string') {\\n        if (typeof data[config] === 'undefined') {\\n          throw new TypeError(`No method named \\\"${config}\\\"`)\\n        }\\n        data[config](relatedTarget)\\n      } else if (_config.show) {\\n        data.show(relatedTarget)\\n      }\\n    })\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Data Api implementation\\n * ------------------------------------------------------------------------\\n */\\n\\n$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\\n  let target\\n  const selector = Util.getSelectorFromElement(this)\\n\\n  if (selector) {\\n    target = document.querySelector(selector)\\n  }\\n\\n  const config = $(target).data(DATA_KEY)\\n    ? 'toggle' : {\\n      ...$(target).data(),\\n      ...$(this).data()\\n    }\\n\\n  if (this.tagName === 'A' || this.tagName === 'AREA') {\\n    event.preventDefault()\\n  }\\n\\n  const $target = $(target).one(Event.SHOW, (showEvent) => {\\n    if (showEvent.isDefaultPrevented()) {\\n      // Only register focus restorer if modal will actually get shown\\n      return\\n    }\\n\\n    $target.one(Event.HIDDEN, () => {\\n      if ($(this).is(':visible')) {\\n        this.focus()\\n      }\\n    })\\n  })\\n\\n  Modal._jQueryInterface.call($(target), config, this)\\n})\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME] = Modal._jQueryInterface\\n$.fn[NAME].Constructor = Modal\\n$.fn[NAME].noConflict = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Modal._jQueryInterface\\n}\\n\\nexport default Modal\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): tools/sanitizer.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nconst uriAttrs = [\\n  'background',\\n  'cite',\\n  'href',\\n  'itemtype',\\n  'longdesc',\\n  'poster',\\n  'src',\\n  'xlink:href'\\n]\\n\\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\\\w-]*$/i\\n\\nexport const DefaultWhitelist = {\\n  // Global attributes allowed on any supplied element below.\\n  '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\\n  a: ['target', 'href', 'title', 'rel'],\\n  area: [],\\n  b: [],\\n  br: [],\\n  col: [],\\n  code: [],\\n  div: [],\\n  em: [],\\n  hr: [],\\n  h1: [],\\n  h2: [],\\n  h3: [],\\n  h4: [],\\n  h5: [],\\n  h6: [],\\n  i: [],\\n  img: ['src', 'alt', 'title', 'width', 'height'],\\n  li: [],\\n  ol: [],\\n  p: [],\\n  pre: [],\\n  s: [],\\n  small: [],\\n  span: [],\\n  sub: [],\\n  sup: [],\\n  strong: [],\\n  u: [],\\n  ul: []\\n}\\n\\n/**\\n * A pattern that recognizes a commonly useful subset of URLs that are safe.\\n *\\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\\n */\\nconst SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi\\n\\n/**\\n * A pattern that matches safe data URLs. Only matches image, video and audio types.\\n *\\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\\n */\\nconst DATA_URL_PATTERN = /^data:(?:image\\\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\\\/(?:mpeg|mp4|ogg|webm)|audio\\\\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i\\n\\nfunction allowedAttribute(attr, allowedAttributeList) {\\n  const attrName = attr.nodeName.toLowerCase()\\n\\n  if (allowedAttributeList.indexOf(attrName) !== -1) {\\n    if (uriAttrs.indexOf(attrName) !== -1) {\\n      return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN))\\n    }\\n\\n    return true\\n  }\\n\\n  const regExp = allowedAttributeList.filter((attrRegex) => attrRegex instanceof RegExp)\\n\\n  // Check if a regular expression validates the attribute.\\n  for (let i = 0, l = regExp.length; i < l; i++) {\\n    if (attrName.match(regExp[i])) {\\n      return true\\n    }\\n  }\\n\\n  return false\\n}\\n\\nexport function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {\\n  if (unsafeHtml.length === 0) {\\n    return unsafeHtml\\n  }\\n\\n  if (sanitizeFn && typeof sanitizeFn === 'function') {\\n    return sanitizeFn(unsafeHtml)\\n  }\\n\\n  const domParser = new window.DOMParser()\\n  const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\\n  const whitelistKeys = Object.keys(whiteList)\\n  const elements = [].slice.call(createdDocument.body.querySelectorAll('*'))\\n\\n  for (let i = 0, len = elements.length; i < len; i++) {\\n    const el = elements[i]\\n    const elName = el.nodeName.toLowerCase()\\n\\n    if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) {\\n      el.parentNode.removeChild(el)\\n\\n      continue\\n    }\\n\\n    const attributeList = [].slice.call(el.attributes)\\n    const whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || [])\\n\\n    attributeList.forEach((attr) => {\\n      if (!allowedAttribute(attr, whitelistedAttributes)) {\\n        el.removeAttribute(attr.nodeName)\\n      }\\n    })\\n  }\\n\\n  return createdDocument.body.innerHTML\\n}\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): tooltip.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport {\\n  DefaultWhitelist,\\n  sanitizeHtml\\n} from './tools/sanitizer'\\nimport $ from 'jquery'\\nimport Popper from 'popper.js'\\nimport Util from './util'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME                  = 'tooltip'\\nconst VERSION               = '4.3.1'\\nconst DATA_KEY              = 'bs.tooltip'\\nconst EVENT_KEY             = `.${DATA_KEY}`\\nconst JQUERY_NO_CONFLICT    = $.fn[NAME]\\nconst CLASS_PREFIX          = 'bs-tooltip'\\nconst BSCLS_PREFIX_REGEX    = new RegExp(`(^|\\\\\\\\s)${CLASS_PREFIX}\\\\\\\\S+`, 'g')\\nconst DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']\\n\\nconst DefaultType = {\\n  animation         : 'boolean',\\n  template          : 'string',\\n  title             : '(string|element|function)',\\n  trigger           : 'string',\\n  delay             : '(number|object)',\\n  html              : 'boolean',\\n  selector          : '(string|boolean)',\\n  placement         : '(string|function)',\\n  offset            : '(number|string|function)',\\n  container         : '(string|element|boolean)',\\n  fallbackPlacement : '(string|array)',\\n  boundary          : '(string|element)',\\n  sanitize          : 'boolean',\\n  sanitizeFn        : '(null|function)',\\n  whiteList         : 'object'\\n}\\n\\nconst AttachmentMap = {\\n  AUTO   : 'auto',\\n  TOP    : 'top',\\n  RIGHT  : 'right',\\n  BOTTOM : 'bottom',\\n  LEFT   : 'left'\\n}\\n\\nconst Default = {\\n  animation         : true,\\n  template          : '<div class=\\\"tooltip\\\" role=\\\"tooltip\\\">' +\\n                    '<div class=\\\"arrow\\\"></div>' +\\n                    '<div class=\\\"tooltip-inner\\\"></div></div>',\\n  trigger           : 'hover focus',\\n  title             : '',\\n  delay             : 0,\\n  html              : false,\\n  selector          : false,\\n  placement         : 'top',\\n  offset            : 0,\\n  container         : false,\\n  fallbackPlacement : 'flip',\\n  boundary          : 'scrollParent',\\n  sanitize          : true,\\n  sanitizeFn        : null,\\n  whiteList         : DefaultWhitelist\\n}\\n\\nconst HoverState = {\\n  SHOW : 'show',\\n  OUT  : 'out'\\n}\\n\\nconst Event = {\\n  HIDE       : `hide${EVENT_KEY}`,\\n  HIDDEN     : `hidden${EVENT_KEY}`,\\n  SHOW       : `show${EVENT_KEY}`,\\n  SHOWN      : `shown${EVENT_KEY}`,\\n  INSERTED   : `inserted${EVENT_KEY}`,\\n  CLICK      : `click${EVENT_KEY}`,\\n  FOCUSIN    : `focusin${EVENT_KEY}`,\\n  FOCUSOUT   : `focusout${EVENT_KEY}`,\\n  MOUSEENTER : `mouseenter${EVENT_KEY}`,\\n  MOUSELEAVE : `mouseleave${EVENT_KEY}`\\n}\\n\\nconst ClassName = {\\n  FADE : 'fade',\\n  SHOW : 'show'\\n}\\n\\nconst Selector = {\\n  TOOLTIP       : '.tooltip',\\n  TOOLTIP_INNER : '.tooltip-inner',\\n  ARROW         : '.arrow'\\n}\\n\\nconst Trigger = {\\n  HOVER  : 'hover',\\n  FOCUS  : 'focus',\\n  CLICK  : 'click',\\n  MANUAL : 'manual'\\n}\\n\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass Tooltip {\\n  constructor(element, config) {\\n    /**\\n     * Check for Popper dependency\\n     * Popper - https://popper.js.org\\n     */\\n    if (typeof Popper === 'undefined') {\\n      throw new TypeError('Bootstrap\\\\'s tooltips require Popper.js (https://popper.js.org/)')\\n    }\\n\\n    // private\\n    this._isEnabled     = true\\n    this._timeout       = 0\\n    this._hoverState    = ''\\n    this._activeTrigger = {}\\n    this._popper        = null\\n\\n    // Protected\\n    this.element = element\\n    this.config  = this._getConfig(config)\\n    this.tip     = null\\n\\n    this._setListeners()\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  static get Default() {\\n    return Default\\n  }\\n\\n  static get NAME() {\\n    return NAME\\n  }\\n\\n  static get DATA_KEY() {\\n    return DATA_KEY\\n  }\\n\\n  static get Event() {\\n    return Event\\n  }\\n\\n  static get EVENT_KEY() {\\n    return EVENT_KEY\\n  }\\n\\n  static get DefaultType() {\\n    return DefaultType\\n  }\\n\\n  // Public\\n\\n  enable() {\\n    this._isEnabled = true\\n  }\\n\\n  disable() {\\n    this._isEnabled = false\\n  }\\n\\n  toggleEnabled() {\\n    this._isEnabled = !this._isEnabled\\n  }\\n\\n  toggle(event) {\\n    if (!this._isEnabled) {\\n      return\\n    }\\n\\n    if (event) {\\n      const dataKey = this.constructor.DATA_KEY\\n      let context = $(event.currentTarget).data(dataKey)\\n\\n      if (!context) {\\n        context = new this.constructor(\\n          event.currentTarget,\\n          this._getDelegateConfig()\\n        )\\n        $(event.currentTarget).data(dataKey, context)\\n      }\\n\\n      context._activeTrigger.click = !context._activeTrigger.click\\n\\n      if (context._isWithActiveTrigger()) {\\n        context._enter(null, context)\\n      } else {\\n        context._leave(null, context)\\n      }\\n    } else {\\n      if ($(this.getTipElement()).hasClass(ClassName.SHOW)) {\\n        this._leave(null, this)\\n        return\\n      }\\n\\n      this._enter(null, this)\\n    }\\n  }\\n\\n  dispose() {\\n    clearTimeout(this._timeout)\\n\\n    $.removeData(this.element, this.constructor.DATA_KEY)\\n\\n    $(this.element).off(this.constructor.EVENT_KEY)\\n    $(this.element).closest('.modal').off('hide.bs.modal')\\n\\n    if (this.tip) {\\n      $(this.tip).remove()\\n    }\\n\\n    this._isEnabled     = null\\n    this._timeout       = null\\n    this._hoverState    = null\\n    this._activeTrigger = null\\n    if (this._popper !== null) {\\n      this._popper.destroy()\\n    }\\n\\n    this._popper = null\\n    this.element = null\\n    this.config  = null\\n    this.tip     = null\\n  }\\n\\n  show() {\\n    if ($(this.element).css('display') === 'none') {\\n      throw new Error('Please use show on visible elements')\\n    }\\n\\n    const showEvent = $.Event(this.constructor.Event.SHOW)\\n    if (this.isWithContent() && this._isEnabled) {\\n      $(this.element).trigger(showEvent)\\n\\n      const shadowRoot = Util.findShadowRoot(this.element)\\n      const isInTheDom = $.contains(\\n        shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement,\\n        this.element\\n      )\\n\\n      if (showEvent.isDefaultPrevented() || !isInTheDom) {\\n        return\\n      }\\n\\n      const tip   = this.getTipElement()\\n      const tipId = Util.getUID(this.constructor.NAME)\\n\\n      tip.setAttribute('id', tipId)\\n      this.element.setAttribute('aria-describedby', tipId)\\n\\n      this.setContent()\\n\\n      if (this.config.animation) {\\n        $(tip).addClass(ClassName.FADE)\\n      }\\n\\n      const placement  = typeof this.config.placement === 'function'\\n        ? this.config.placement.call(this, tip, this.element)\\n        : this.config.placement\\n\\n      const attachment = this._getAttachment(placement)\\n      this.addAttachmentClass(attachment)\\n\\n      const container = this._getContainer()\\n      $(tip).data(this.constructor.DATA_KEY, this)\\n\\n      if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) {\\n        $(tip).appendTo(container)\\n      }\\n\\n      $(this.element).trigger(this.constructor.Event.INSERTED)\\n\\n      this._popper = new Popper(this.element, tip, {\\n        placement: attachment,\\n        modifiers: {\\n          offset: this._getOffset(),\\n          flip: {\\n            behavior: this.config.fallbackPlacement\\n          },\\n          arrow: {\\n            element: Selector.ARROW\\n          },\\n          preventOverflow: {\\n            boundariesElement: this.config.boundary\\n          }\\n        },\\n        onCreate: (data) => {\\n          if (data.originalPlacement !== data.placement) {\\n            this._handlePopperPlacementChange(data)\\n          }\\n        },\\n        onUpdate: (data) => this._handlePopperPlacementChange(data)\\n      })\\n\\n      $(tip).addClass(ClassName.SHOW)\\n\\n      // If this is a touch-enabled device we add extra\\n      // empty mouseover listeners to the body's immediate children;\\n      // only needed because of broken event delegation on iOS\\n      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\\n      if ('ontouchstart' in document.documentElement) {\\n        $(document.body).children().on('mouseover', null, $.noop)\\n      }\\n\\n      const complete = () => {\\n        if (this.config.animation) {\\n          this._fixTransition()\\n        }\\n        const prevHoverState = this._hoverState\\n        this._hoverState     = null\\n\\n        $(this.element).trigger(this.constructor.Event.SHOWN)\\n\\n        if (prevHoverState === HoverState.OUT) {\\n          this._leave(null, this)\\n        }\\n      }\\n\\n      if ($(this.tip).hasClass(ClassName.FADE)) {\\n        const transitionDuration = Util.getTransitionDurationFromElement(this.tip)\\n\\n        $(this.tip)\\n          .one(Util.TRANSITION_END, complete)\\n          .emulateTransitionEnd(transitionDuration)\\n      } else {\\n        complete()\\n      }\\n    }\\n  }\\n\\n  hide(callback) {\\n    const tip       = this.getTipElement()\\n    const hideEvent = $.Event(this.constructor.Event.HIDE)\\n    const complete = () => {\\n      if (this._hoverState !== HoverState.SHOW && tip.parentNode) {\\n        tip.parentNode.removeChild(tip)\\n      }\\n\\n      this._cleanTipClass()\\n      this.element.removeAttribute('aria-describedby')\\n      $(this.element).trigger(this.constructor.Event.HIDDEN)\\n      if (this._popper !== null) {\\n        this._popper.destroy()\\n      }\\n\\n      if (callback) {\\n        callback()\\n      }\\n    }\\n\\n    $(this.element).trigger(hideEvent)\\n\\n    if (hideEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    $(tip).removeClass(ClassName.SHOW)\\n\\n    // If this is a touch-enabled device we remove the extra\\n    // empty mouseover listeners we added for iOS support\\n    if ('ontouchstart' in document.documentElement) {\\n      $(document.body).children().off('mouseover', null, $.noop)\\n    }\\n\\n    this._activeTrigger[Trigger.CLICK] = false\\n    this._activeTrigger[Trigger.FOCUS] = false\\n    this._activeTrigger[Trigger.HOVER] = false\\n\\n    if ($(this.tip).hasClass(ClassName.FADE)) {\\n      const transitionDuration = Util.getTransitionDurationFromElement(tip)\\n\\n      $(tip)\\n        .one(Util.TRANSITION_END, complete)\\n        .emulateTransitionEnd(transitionDuration)\\n    } else {\\n      complete()\\n    }\\n\\n    this._hoverState = ''\\n  }\\n\\n  update() {\\n    if (this._popper !== null) {\\n      this._popper.scheduleUpdate()\\n    }\\n  }\\n\\n  // Protected\\n\\n  isWithContent() {\\n    return Boolean(this.getTitle())\\n  }\\n\\n  addAttachmentClass(attachment) {\\n    $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)\\n  }\\n\\n  getTipElement() {\\n    this.tip = this.tip || $(this.config.template)[0]\\n    return this.tip\\n  }\\n\\n  setContent() {\\n    const tip = this.getTipElement()\\n    this.setElementContent($(tip.querySelectorAll(Selector.TOOLTIP_INNER)), this.getTitle())\\n    $(tip).removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)\\n  }\\n\\n  setElementContent($element, content) {\\n    if (typeof content === 'object' && (content.nodeType || content.jquery)) {\\n      // Content is a DOM node or a jQuery\\n      if (this.config.html) {\\n        if (!$(content).parent().is($element)) {\\n          $element.empty().append(content)\\n        }\\n      } else {\\n        $element.text($(content).text())\\n      }\\n\\n      return\\n    }\\n\\n    if (this.config.html) {\\n      if (this.config.sanitize) {\\n        content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn)\\n      }\\n\\n      $element.html(content)\\n    } else {\\n      $element.text(content)\\n    }\\n  }\\n\\n  getTitle() {\\n    let title = this.element.getAttribute('data-original-title')\\n\\n    if (!title) {\\n      title = typeof this.config.title === 'function'\\n        ? this.config.title.call(this.element)\\n        : this.config.title\\n    }\\n\\n    return title\\n  }\\n\\n  // Private\\n\\n  _getOffset() {\\n    const offset = {}\\n\\n    if (typeof this.config.offset === 'function') {\\n      offset.fn = (data) => {\\n        data.offsets = {\\n          ...data.offsets,\\n          ...this.config.offset(data.offsets, this.element) || {}\\n        }\\n\\n        return data\\n      }\\n    } else {\\n      offset.offset = this.config.offset\\n    }\\n\\n    return offset\\n  }\\n\\n  _getContainer() {\\n    if (this.config.container === false) {\\n      return document.body\\n    }\\n\\n    if (Util.isElement(this.config.container)) {\\n      return $(this.config.container)\\n    }\\n\\n    return $(document).find(this.config.container)\\n  }\\n\\n  _getAttachment(placement) {\\n    return AttachmentMap[placement.toUpperCase()]\\n  }\\n\\n  _setListeners() {\\n    const triggers = this.config.trigger.split(' ')\\n\\n    triggers.forEach((trigger) => {\\n      if (trigger === 'click') {\\n        $(this.element).on(\\n          this.constructor.Event.CLICK,\\n          this.config.selector,\\n          (event) => this.toggle(event)\\n        )\\n      } else if (trigger !== Trigger.MANUAL) {\\n        const eventIn = trigger === Trigger.HOVER\\n          ? this.constructor.Event.MOUSEENTER\\n          : this.constructor.Event.FOCUSIN\\n        const eventOut = trigger === Trigger.HOVER\\n          ? this.constructor.Event.MOUSELEAVE\\n          : this.constructor.Event.FOCUSOUT\\n\\n        $(this.element)\\n          .on(\\n            eventIn,\\n            this.config.selector,\\n            (event) => this._enter(event)\\n          )\\n          .on(\\n            eventOut,\\n            this.config.selector,\\n            (event) => this._leave(event)\\n          )\\n      }\\n    })\\n\\n    $(this.element).closest('.modal').on(\\n      'hide.bs.modal',\\n      () => {\\n        if (this.element) {\\n          this.hide()\\n        }\\n      }\\n    )\\n\\n    if (this.config.selector) {\\n      this.config = {\\n        ...this.config,\\n        trigger: 'manual',\\n        selector: ''\\n      }\\n    } else {\\n      this._fixTitle()\\n    }\\n  }\\n\\n  _fixTitle() {\\n    const titleType = typeof this.element.getAttribute('data-original-title')\\n\\n    if (this.element.getAttribute('title') || titleType !== 'string') {\\n      this.element.setAttribute(\\n        'data-original-title',\\n        this.element.getAttribute('title') || ''\\n      )\\n\\n      this.element.setAttribute('title', '')\\n    }\\n  }\\n\\n  _enter(event, context) {\\n    const dataKey = this.constructor.DATA_KEY\\n    context = context || $(event.currentTarget).data(dataKey)\\n\\n    if (!context) {\\n      context = new this.constructor(\\n        event.currentTarget,\\n        this._getDelegateConfig()\\n      )\\n      $(event.currentTarget).data(dataKey, context)\\n    }\\n\\n    if (event) {\\n      context._activeTrigger[\\n        event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER\\n      ] = true\\n    }\\n\\n    if ($(context.getTipElement()).hasClass(ClassName.SHOW) || context._hoverState === HoverState.SHOW) {\\n      context._hoverState = HoverState.SHOW\\n      return\\n    }\\n\\n    clearTimeout(context._timeout)\\n\\n    context._hoverState = HoverState.SHOW\\n\\n    if (!context.config.delay || !context.config.delay.show) {\\n      context.show()\\n      return\\n    }\\n\\n    context._timeout = setTimeout(() => {\\n      if (context._hoverState === HoverState.SHOW) {\\n        context.show()\\n      }\\n    }, context.config.delay.show)\\n  }\\n\\n  _leave(event, context) {\\n    const dataKey = this.constructor.DATA_KEY\\n    context = context || $(event.currentTarget).data(dataKey)\\n\\n    if (!context) {\\n      context = new this.constructor(\\n        event.currentTarget,\\n        this._getDelegateConfig()\\n      )\\n      $(event.currentTarget).data(dataKey, context)\\n    }\\n\\n    if (event) {\\n      context._activeTrigger[\\n        event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER\\n      ] = false\\n    }\\n\\n    if (context._isWithActiveTrigger()) {\\n      return\\n    }\\n\\n    clearTimeout(context._timeout)\\n\\n    context._hoverState = HoverState.OUT\\n\\n    if (!context.config.delay || !context.config.delay.hide) {\\n      context.hide()\\n      return\\n    }\\n\\n    context._timeout = setTimeout(() => {\\n      if (context._hoverState === HoverState.OUT) {\\n        context.hide()\\n      }\\n    }, context.config.delay.hide)\\n  }\\n\\n  _isWithActiveTrigger() {\\n    for (const trigger in this._activeTrigger) {\\n      if (this._activeTrigger[trigger]) {\\n        return true\\n      }\\n    }\\n\\n    return false\\n  }\\n\\n  _getConfig(config) {\\n    const dataAttributes = $(this.element).data()\\n\\n    Object.keys(dataAttributes)\\n      .forEach((dataAttr) => {\\n        if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {\\n          delete dataAttributes[dataAttr]\\n        }\\n      })\\n\\n    config = {\\n      ...this.constructor.Default,\\n      ...dataAttributes,\\n      ...typeof config === 'object' && config ? config : {}\\n    }\\n\\n    if (typeof config.delay === 'number') {\\n      config.delay = {\\n        show: config.delay,\\n        hide: config.delay\\n      }\\n    }\\n\\n    if (typeof config.title === 'number') {\\n      config.title = config.title.toString()\\n    }\\n\\n    if (typeof config.content === 'number') {\\n      config.content = config.content.toString()\\n    }\\n\\n    Util.typeCheckConfig(\\n      NAME,\\n      config,\\n      this.constructor.DefaultType\\n    )\\n\\n    if (config.sanitize) {\\n      config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn)\\n    }\\n\\n    return config\\n  }\\n\\n  _getDelegateConfig() {\\n    const config = {}\\n\\n    if (this.config) {\\n      for (const key in this.config) {\\n        if (this.constructor.Default[key] !== this.config[key]) {\\n          config[key] = this.config[key]\\n        }\\n      }\\n    }\\n\\n    return config\\n  }\\n\\n  _cleanTipClass() {\\n    const $tip = $(this.getTipElement())\\n    const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)\\n    if (tabClass !== null && tabClass.length) {\\n      $tip.removeClass(tabClass.join(''))\\n    }\\n  }\\n\\n  _handlePopperPlacementChange(popperData) {\\n    const popperInstance = popperData.instance\\n    this.tip = popperInstance.popper\\n    this._cleanTipClass()\\n    this.addAttachmentClass(this._getAttachment(popperData.placement))\\n  }\\n\\n  _fixTransition() {\\n    const tip = this.getTipElement()\\n    const initConfigAnimation = this.config.animation\\n\\n    if (tip.getAttribute('x-placement') !== null) {\\n      return\\n    }\\n\\n    $(tip).removeClass(ClassName.FADE)\\n    this.config.animation = false\\n    this.hide()\\n    this.show()\\n    this.config.animation = initConfigAnimation\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      let data = $(this).data(DATA_KEY)\\n      const _config = typeof config === 'object' && config\\n\\n      if (!data && /dispose|hide/.test(config)) {\\n        return\\n      }\\n\\n      if (!data) {\\n        data = new Tooltip(this, _config)\\n        $(this).data(DATA_KEY, data)\\n      }\\n\\n      if (typeof config === 'string') {\\n        if (typeof data[config] === 'undefined') {\\n          throw new TypeError(`No method named \\\"${config}\\\"`)\\n        }\\n        data[config]()\\n      }\\n    })\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME] = Tooltip._jQueryInterface\\n$.fn[NAME].Constructor = Tooltip\\n$.fn[NAME].noConflict = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Tooltip._jQueryInterface\\n}\\n\\nexport default Tooltip\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): popover.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\nimport Tooltip from './tooltip'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME                = 'popover'\\nconst VERSION             = '4.3.1'\\nconst DATA_KEY            = 'bs.popover'\\nconst EVENT_KEY           = `.${DATA_KEY}`\\nconst JQUERY_NO_CONFLICT  = $.fn[NAME]\\nconst CLASS_PREFIX        = 'bs-popover'\\nconst BSCLS_PREFIX_REGEX  = new RegExp(`(^|\\\\\\\\s)${CLASS_PREFIX}\\\\\\\\S+`, 'g')\\n\\nconst Default = {\\n  ...Tooltip.Default,\\n  placement : 'right',\\n  trigger   : 'click',\\n  content   : '',\\n  template  : '<div class=\\\"popover\\\" role=\\\"tooltip\\\">' +\\n              '<div class=\\\"arrow\\\"></div>' +\\n              '<h3 class=\\\"popover-header\\\"></h3>' +\\n              '<div class=\\\"popover-body\\\"></div></div>'\\n}\\n\\nconst DefaultType = {\\n  ...Tooltip.DefaultType,\\n  content : '(string|element|function)'\\n}\\n\\nconst ClassName = {\\n  FADE : 'fade',\\n  SHOW : 'show'\\n}\\n\\nconst Selector = {\\n  TITLE   : '.popover-header',\\n  CONTENT : '.popover-body'\\n}\\n\\nconst Event = {\\n  HIDE       : `hide${EVENT_KEY}`,\\n  HIDDEN     : `hidden${EVENT_KEY}`,\\n  SHOW       : `show${EVENT_KEY}`,\\n  SHOWN      : `shown${EVENT_KEY}`,\\n  INSERTED   : `inserted${EVENT_KEY}`,\\n  CLICK      : `click${EVENT_KEY}`,\\n  FOCUSIN    : `focusin${EVENT_KEY}`,\\n  FOCUSOUT   : `focusout${EVENT_KEY}`,\\n  MOUSEENTER : `mouseenter${EVENT_KEY}`,\\n  MOUSELEAVE : `mouseleave${EVENT_KEY}`\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass Popover extends Tooltip {\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  static get Default() {\\n    return Default\\n  }\\n\\n  static get NAME() {\\n    return NAME\\n  }\\n\\n  static get DATA_KEY() {\\n    return DATA_KEY\\n  }\\n\\n  static get Event() {\\n    return Event\\n  }\\n\\n  static get EVENT_KEY() {\\n    return EVENT_KEY\\n  }\\n\\n  static get DefaultType() {\\n    return DefaultType\\n  }\\n\\n  // Overrides\\n\\n  isWithContent() {\\n    return this.getTitle() || this._getContent()\\n  }\\n\\n  addAttachmentClass(attachment) {\\n    $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)\\n  }\\n\\n  getTipElement() {\\n    this.tip = this.tip || $(this.config.template)[0]\\n    return this.tip\\n  }\\n\\n  setContent() {\\n    const $tip = $(this.getTipElement())\\n\\n    // We use append for html objects to maintain js events\\n    this.setElementContent($tip.find(Selector.TITLE), this.getTitle())\\n    let content = this._getContent()\\n    if (typeof content === 'function') {\\n      content = content.call(this.element)\\n    }\\n    this.setElementContent($tip.find(Selector.CONTENT), content)\\n\\n    $tip.removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)\\n  }\\n\\n  // Private\\n\\n  _getContent() {\\n    return this.element.getAttribute('data-content') ||\\n      this.config.content\\n  }\\n\\n  _cleanTipClass() {\\n    const $tip = $(this.getTipElement())\\n    const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)\\n    if (tabClass !== null && tabClass.length > 0) {\\n      $tip.removeClass(tabClass.join(''))\\n    }\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      let data = $(this).data(DATA_KEY)\\n      const _config = typeof config === 'object' ? config : null\\n\\n      if (!data && /dispose|hide/.test(config)) {\\n        return\\n      }\\n\\n      if (!data) {\\n        data = new Popover(this, _config)\\n        $(this).data(DATA_KEY, data)\\n      }\\n\\n      if (typeof config === 'string') {\\n        if (typeof data[config] === 'undefined') {\\n          throw new TypeError(`No method named \\\"${config}\\\"`)\\n        }\\n        data[config]()\\n      }\\n    })\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME] = Popover._jQueryInterface\\n$.fn[NAME].Constructor = Popover\\n$.fn[NAME].noConflict = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Popover._jQueryInterface\\n}\\n\\nexport default Popover\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): scrollspy.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\nimport Util from './util'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME               = 'scrollspy'\\nconst VERSION            = '4.3.1'\\nconst DATA_KEY           = 'bs.scrollspy'\\nconst EVENT_KEY          = `.${DATA_KEY}`\\nconst DATA_API_KEY       = '.data-api'\\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\\n\\nconst Default = {\\n  offset : 10,\\n  method : 'auto',\\n  target : ''\\n}\\n\\nconst DefaultType = {\\n  offset : 'number',\\n  method : 'string',\\n  target : '(string|element)'\\n}\\n\\nconst Event = {\\n  ACTIVATE      : `activate${EVENT_KEY}`,\\n  SCROLL        : `scroll${EVENT_KEY}`,\\n  LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`\\n}\\n\\nconst ClassName = {\\n  DROPDOWN_ITEM : 'dropdown-item',\\n  DROPDOWN_MENU : 'dropdown-menu',\\n  ACTIVE        : 'active'\\n}\\n\\nconst Selector = {\\n  DATA_SPY        : '[data-spy=\\\"scroll\\\"]',\\n  ACTIVE          : '.active',\\n  NAV_LIST_GROUP  : '.nav, .list-group',\\n  NAV_LINKS       : '.nav-link',\\n  NAV_ITEMS       : '.nav-item',\\n  LIST_ITEMS      : '.list-group-item',\\n  DROPDOWN        : '.dropdown',\\n  DROPDOWN_ITEMS  : '.dropdown-item',\\n  DROPDOWN_TOGGLE : '.dropdown-toggle'\\n}\\n\\nconst OffsetMethod = {\\n  OFFSET   : 'offset',\\n  POSITION : 'position'\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass ScrollSpy {\\n  constructor(element, config) {\\n    this._element       = element\\n    this._scrollElement = element.tagName === 'BODY' ? window : element\\n    this._config        = this._getConfig(config)\\n    this._selector      = `${this._config.target} ${Selector.NAV_LINKS},` +\\n                          `${this._config.target} ${Selector.LIST_ITEMS},` +\\n                          `${this._config.target} ${Selector.DROPDOWN_ITEMS}`\\n    this._offsets       = []\\n    this._targets       = []\\n    this._activeTarget  = null\\n    this._scrollHeight  = 0\\n\\n    $(this._scrollElement).on(Event.SCROLL, (event) => this._process(event))\\n\\n    this.refresh()\\n    this._process()\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  static get Default() {\\n    return Default\\n  }\\n\\n  // Public\\n\\n  refresh() {\\n    const autoMethod = this._scrollElement === this._scrollElement.window\\n      ? OffsetMethod.OFFSET : OffsetMethod.POSITION\\n\\n    const offsetMethod = this._config.method === 'auto'\\n      ? autoMethod : this._config.method\\n\\n    const offsetBase = offsetMethod === OffsetMethod.POSITION\\n      ? this._getScrollTop() : 0\\n\\n    this._offsets = []\\n    this._targets = []\\n\\n    this._scrollHeight = this._getScrollHeight()\\n\\n    const targets = [].slice.call(document.querySelectorAll(this._selector))\\n\\n    targets\\n      .map((element) => {\\n        let target\\n        const targetSelector = Util.getSelectorFromElement(element)\\n\\n        if (targetSelector) {\\n          target = document.querySelector(targetSelector)\\n        }\\n\\n        if (target) {\\n          const targetBCR = target.getBoundingClientRect()\\n          if (targetBCR.width || targetBCR.height) {\\n            // TODO (fat): remove sketch reliance on jQuery position/offset\\n            return [\\n              $(target)[offsetMethod]().top + offsetBase,\\n              targetSelector\\n            ]\\n          }\\n        }\\n        return null\\n      })\\n      .filter((item) => item)\\n      .sort((a, b) => a[0] - b[0])\\n      .forEach((item) => {\\n        this._offsets.push(item[0])\\n        this._targets.push(item[1])\\n      })\\n  }\\n\\n  dispose() {\\n    $.removeData(this._element, DATA_KEY)\\n    $(this._scrollElement).off(EVENT_KEY)\\n\\n    this._element       = null\\n    this._scrollElement = null\\n    this._config        = null\\n    this._selector      = null\\n    this._offsets       = null\\n    this._targets       = null\\n    this._activeTarget  = null\\n    this._scrollHeight  = null\\n  }\\n\\n  // Private\\n\\n  _getConfig(config) {\\n    config = {\\n      ...Default,\\n      ...typeof config === 'object' && config ? config : {}\\n    }\\n\\n    if (typeof config.target !== 'string') {\\n      let id = $(config.target).attr('id')\\n      if (!id) {\\n        id = Util.getUID(NAME)\\n        $(config.target).attr('id', id)\\n      }\\n      config.target = `#${id}`\\n    }\\n\\n    Util.typeCheckConfig(NAME, config, DefaultType)\\n\\n    return config\\n  }\\n\\n  _getScrollTop() {\\n    return this._scrollElement === window\\n      ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop\\n  }\\n\\n  _getScrollHeight() {\\n    return this._scrollElement.scrollHeight || Math.max(\\n      document.body.scrollHeight,\\n      document.documentElement.scrollHeight\\n    )\\n  }\\n\\n  _getOffsetHeight() {\\n    return this._scrollElement === window\\n      ? window.innerHeight : this._scrollElement.getBoundingClientRect().height\\n  }\\n\\n  _process() {\\n    const scrollTop    = this._getScrollTop() + this._config.offset\\n    const scrollHeight = this._getScrollHeight()\\n    const maxScroll    = this._config.offset +\\n      scrollHeight -\\n      this._getOffsetHeight()\\n\\n    if (this._scrollHeight !== scrollHeight) {\\n      this.refresh()\\n    }\\n\\n    if (scrollTop >= maxScroll) {\\n      const target = this._targets[this._targets.length - 1]\\n\\n      if (this._activeTarget !== target) {\\n        this._activate(target)\\n      }\\n      return\\n    }\\n\\n    if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\\n      this._activeTarget = null\\n      this._clear()\\n      return\\n    }\\n\\n    const offsetLength = this._offsets.length\\n    for (let i = offsetLength; i--;) {\\n      const isActiveTarget = this._activeTarget !== this._targets[i] &&\\n          scrollTop >= this._offsets[i] &&\\n          (typeof this._offsets[i + 1] === 'undefined' ||\\n              scrollTop < this._offsets[i + 1])\\n\\n      if (isActiveTarget) {\\n        this._activate(this._targets[i])\\n      }\\n    }\\n  }\\n\\n  _activate(target) {\\n    this._activeTarget = target\\n\\n    this._clear()\\n\\n    const queries = this._selector\\n      .split(',')\\n      .map((selector) => `${selector}[data-target=\\\"${target}\\\"],${selector}[href=\\\"${target}\\\"]`)\\n\\n    const $link = $([].slice.call(document.querySelectorAll(queries.join(','))))\\n\\n    if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {\\n      $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE)\\n      $link.addClass(ClassName.ACTIVE)\\n    } else {\\n      // Set triggered link as active\\n      $link.addClass(ClassName.ACTIVE)\\n      // Set triggered links parents as active\\n      // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\\n      $link.parents(Selector.NAV_LIST_GROUP).prev(`${Selector.NAV_LINKS}, ${Selector.LIST_ITEMS}`).addClass(ClassName.ACTIVE)\\n      // Handle special case when .nav-link is inside .nav-item\\n      $link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_ITEMS).children(Selector.NAV_LINKS).addClass(ClassName.ACTIVE)\\n    }\\n\\n    $(this._scrollElement).trigger(Event.ACTIVATE, {\\n      relatedTarget: target\\n    })\\n  }\\n\\n  _clear() {\\n    [].slice.call(document.querySelectorAll(this._selector))\\n      .filter((node) => node.classList.contains(ClassName.ACTIVE))\\n      .forEach((node) => node.classList.remove(ClassName.ACTIVE))\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      let data = $(this).data(DATA_KEY)\\n      const _config = typeof config === 'object' && config\\n\\n      if (!data) {\\n        data = new ScrollSpy(this, _config)\\n        $(this).data(DATA_KEY, data)\\n      }\\n\\n      if (typeof config === 'string') {\\n        if (typeof data[config] === 'undefined') {\\n          throw new TypeError(`No method named \\\"${config}\\\"`)\\n        }\\n        data[config]()\\n      }\\n    })\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Data Api implementation\\n * ------------------------------------------------------------------------\\n */\\n\\n$(window).on(Event.LOAD_DATA_API, () => {\\n  const scrollSpys = [].slice.call(document.querySelectorAll(Selector.DATA_SPY))\\n  const scrollSpysLength = scrollSpys.length\\n\\n  for (let i = scrollSpysLength; i--;) {\\n    const $spy = $(scrollSpys[i])\\n    ScrollSpy._jQueryInterface.call($spy, $spy.data())\\n  }\\n})\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME] = ScrollSpy._jQueryInterface\\n$.fn[NAME].Constructor = ScrollSpy\\n$.fn[NAME].noConflict = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return ScrollSpy._jQueryInterface\\n}\\n\\nexport default ScrollSpy\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): tab.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\nimport Util from './util'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME               = 'tab'\\nconst VERSION            = '4.3.1'\\nconst DATA_KEY           = 'bs.tab'\\nconst EVENT_KEY          = `.${DATA_KEY}`\\nconst DATA_API_KEY       = '.data-api'\\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\\n\\nconst Event = {\\n  HIDE           : `hide${EVENT_KEY}`,\\n  HIDDEN         : `hidden${EVENT_KEY}`,\\n  SHOW           : `show${EVENT_KEY}`,\\n  SHOWN          : `shown${EVENT_KEY}`,\\n  CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\\n}\\n\\nconst ClassName = {\\n  DROPDOWN_MENU : 'dropdown-menu',\\n  ACTIVE        : 'active',\\n  DISABLED      : 'disabled',\\n  FADE          : 'fade',\\n  SHOW          : 'show'\\n}\\n\\nconst Selector = {\\n  DROPDOWN              : '.dropdown',\\n  NAV_LIST_GROUP        : '.nav, .list-group',\\n  ACTIVE                : '.active',\\n  ACTIVE_UL             : '> li > .active',\\n  DATA_TOGGLE           : '[data-toggle=\\\"tab\\\"], [data-toggle=\\\"pill\\\"], [data-toggle=\\\"list\\\"]',\\n  DROPDOWN_TOGGLE       : '.dropdown-toggle',\\n  DROPDOWN_ACTIVE_CHILD : '> .dropdown-menu .active'\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass Tab {\\n  constructor(element) {\\n    this._element = element\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  // Public\\n\\n  show() {\\n    if (this._element.parentNode &&\\n        this._element.parentNode.nodeType === Node.ELEMENT_NODE &&\\n        $(this._element).hasClass(ClassName.ACTIVE) ||\\n        $(this._element).hasClass(ClassName.DISABLED)) {\\n      return\\n    }\\n\\n    let target\\n    let previous\\n    const listElement = $(this._element).closest(Selector.NAV_LIST_GROUP)[0]\\n    const selector = Util.getSelectorFromElement(this._element)\\n\\n    if (listElement) {\\n      const itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? Selector.ACTIVE_UL : Selector.ACTIVE\\n      previous = $.makeArray($(listElement).find(itemSelector))\\n      previous = previous[previous.length - 1]\\n    }\\n\\n    const hideEvent = $.Event(Event.HIDE, {\\n      relatedTarget: this._element\\n    })\\n\\n    const showEvent = $.Event(Event.SHOW, {\\n      relatedTarget: previous\\n    })\\n\\n    if (previous) {\\n      $(previous).trigger(hideEvent)\\n    }\\n\\n    $(this._element).trigger(showEvent)\\n\\n    if (showEvent.isDefaultPrevented() ||\\n        hideEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    if (selector) {\\n      target = document.querySelector(selector)\\n    }\\n\\n    this._activate(\\n      this._element,\\n      listElement\\n    )\\n\\n    const complete = () => {\\n      const hiddenEvent = $.Event(Event.HIDDEN, {\\n        relatedTarget: this._element\\n      })\\n\\n      const shownEvent = $.Event(Event.SHOWN, {\\n        relatedTarget: previous\\n      })\\n\\n      $(previous).trigger(hiddenEvent)\\n      $(this._element).trigger(shownEvent)\\n    }\\n\\n    if (target) {\\n      this._activate(target, target.parentNode, complete)\\n    } else {\\n      complete()\\n    }\\n  }\\n\\n  dispose() {\\n    $.removeData(this._element, DATA_KEY)\\n    this._element = null\\n  }\\n\\n  // Private\\n\\n  _activate(element, container, callback) {\\n    const activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL')\\n      ? $(container).find(Selector.ACTIVE_UL)\\n      : $(container).children(Selector.ACTIVE)\\n\\n    const active = activeElements[0]\\n    const isTransitioning = callback && (active && $(active).hasClass(ClassName.FADE))\\n    const complete = () => this._transitionComplete(\\n      element,\\n      active,\\n      callback\\n    )\\n\\n    if (active && isTransitioning) {\\n      const transitionDuration = Util.getTransitionDurationFromElement(active)\\n\\n      $(active)\\n        .removeClass(ClassName.SHOW)\\n        .one(Util.TRANSITION_END, complete)\\n        .emulateTransitionEnd(transitionDuration)\\n    } else {\\n      complete()\\n    }\\n  }\\n\\n  _transitionComplete(element, active, callback) {\\n    if (active) {\\n      $(active).removeClass(ClassName.ACTIVE)\\n\\n      const dropdownChild = $(active.parentNode).find(\\n        Selector.DROPDOWN_ACTIVE_CHILD\\n      )[0]\\n\\n      if (dropdownChild) {\\n        $(dropdownChild).removeClass(ClassName.ACTIVE)\\n      }\\n\\n      if (active.getAttribute('role') === 'tab') {\\n        active.setAttribute('aria-selected', false)\\n      }\\n    }\\n\\n    $(element).addClass(ClassName.ACTIVE)\\n    if (element.getAttribute('role') === 'tab') {\\n      element.setAttribute('aria-selected', true)\\n    }\\n\\n    Util.reflow(element)\\n\\n    if (element.classList.contains(ClassName.FADE)) {\\n      element.classList.add(ClassName.SHOW)\\n    }\\n\\n    if (element.parentNode && $(element.parentNode).hasClass(ClassName.DROPDOWN_MENU)) {\\n      const dropdownElement = $(element).closest(Selector.DROPDOWN)[0]\\n\\n      if (dropdownElement) {\\n        const dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(Selector.DROPDOWN_TOGGLE))\\n\\n        $(dropdownToggleList).addClass(ClassName.ACTIVE)\\n      }\\n\\n      element.setAttribute('aria-expanded', true)\\n    }\\n\\n    if (callback) {\\n      callback()\\n    }\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      const $this = $(this)\\n      let data = $this.data(DATA_KEY)\\n\\n      if (!data) {\\n        data = new Tab(this)\\n        $this.data(DATA_KEY, data)\\n      }\\n\\n      if (typeof config === 'string') {\\n        if (typeof data[config] === 'undefined') {\\n          throw new TypeError(`No method named \\\"${config}\\\"`)\\n        }\\n        data[config]()\\n      }\\n    })\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Data Api implementation\\n * ------------------------------------------------------------------------\\n */\\n\\n$(document)\\n  .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\\n    event.preventDefault()\\n    Tab._jQueryInterface.call($(this), 'show')\\n  })\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME] = Tab._jQueryInterface\\n$.fn[NAME].Constructor = Tab\\n$.fn[NAME].noConflict = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Tab._jQueryInterface\\n}\\n\\nexport default Tab\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): toast.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\nimport Util from './util'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME               = 'toast'\\nconst VERSION            = '4.3.1'\\nconst DATA_KEY           = 'bs.toast'\\nconst EVENT_KEY          = `.${DATA_KEY}`\\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\\n\\nconst Event = {\\n  CLICK_DISMISS : `click.dismiss${EVENT_KEY}`,\\n  HIDE          : `hide${EVENT_KEY}`,\\n  HIDDEN        : `hidden${EVENT_KEY}`,\\n  SHOW          : `show${EVENT_KEY}`,\\n  SHOWN         : `shown${EVENT_KEY}`\\n}\\n\\nconst ClassName = {\\n  FADE    : 'fade',\\n  HIDE    : 'hide',\\n  SHOW    : 'show',\\n  SHOWING : 'showing'\\n}\\n\\nconst DefaultType = {\\n  animation : 'boolean',\\n  autohide  : 'boolean',\\n  delay     : 'number'\\n}\\n\\nconst Default = {\\n  animation : true,\\n  autohide  : true,\\n  delay     : 500\\n}\\n\\nconst Selector = {\\n  DATA_DISMISS : '[data-dismiss=\\\"toast\\\"]'\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass Toast {\\n  constructor(element, config) {\\n    this._element = element\\n    this._config  = this._getConfig(config)\\n    this._timeout = null\\n    this._setListeners()\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  static get DefaultType() {\\n    return DefaultType\\n  }\\n\\n  static get Default() {\\n    return Default\\n  }\\n\\n  // Public\\n\\n  show() {\\n    $(this._element).trigger(Event.SHOW)\\n\\n    if (this._config.animation) {\\n      this._element.classList.add(ClassName.FADE)\\n    }\\n\\n    const complete = () => {\\n      this._element.classList.remove(ClassName.SHOWING)\\n      this._element.classList.add(ClassName.SHOW)\\n\\n      $(this._element).trigger(Event.SHOWN)\\n\\n      if (this._config.autohide) {\\n        this.hide()\\n      }\\n    }\\n\\n    this._element.classList.remove(ClassName.HIDE)\\n    this._element.classList.add(ClassName.SHOWING)\\n    if (this._config.animation) {\\n      const transitionDuration = Util.getTransitionDurationFromElement(this._element)\\n\\n      $(this._element)\\n        .one(Util.TRANSITION_END, complete)\\n        .emulateTransitionEnd(transitionDuration)\\n    } else {\\n      complete()\\n    }\\n  }\\n\\n  hide(withoutTimeout) {\\n    if (!this._element.classList.contains(ClassName.SHOW)) {\\n      return\\n    }\\n\\n    $(this._element).trigger(Event.HIDE)\\n\\n    if (withoutTimeout) {\\n      this._close()\\n    } else {\\n      this._timeout = setTimeout(() => {\\n        this._close()\\n      }, this._config.delay)\\n    }\\n  }\\n\\n  dispose() {\\n    clearTimeout(this._timeout)\\n    this._timeout = null\\n\\n    if (this._element.classList.contains(ClassName.SHOW)) {\\n      this._element.classList.remove(ClassName.SHOW)\\n    }\\n\\n    $(this._element).off(Event.CLICK_DISMISS)\\n\\n    $.removeData(this._element, DATA_KEY)\\n    this._element = null\\n    this._config  = null\\n  }\\n\\n  // Private\\n\\n  _getConfig(config) {\\n    config = {\\n      ...Default,\\n      ...$(this._element).data(),\\n      ...typeof config === 'object' && config ? config : {}\\n    }\\n\\n    Util.typeCheckConfig(\\n      NAME,\\n      config,\\n      this.constructor.DefaultType\\n    )\\n\\n    return config\\n  }\\n\\n  _setListeners() {\\n    $(this._element).on(\\n      Event.CLICK_DISMISS,\\n      Selector.DATA_DISMISS,\\n      () => this.hide(true)\\n    )\\n  }\\n\\n  _close() {\\n    const complete = () => {\\n      this._element.classList.add(ClassName.HIDE)\\n      $(this._element).trigger(Event.HIDDEN)\\n    }\\n\\n    this._element.classList.remove(ClassName.SHOW)\\n    if (this._config.animation) {\\n      const transitionDuration = Util.getTransitionDurationFromElement(this._element)\\n\\n      $(this._element)\\n        .one(Util.TRANSITION_END, complete)\\n        .emulateTransitionEnd(transitionDuration)\\n    } else {\\n      complete()\\n    }\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      const $element = $(this)\\n      let data       = $element.data(DATA_KEY)\\n      const _config  = typeof config === 'object' && config\\n\\n      if (!data) {\\n        data = new Toast(this, _config)\\n        $element.data(DATA_KEY, data)\\n      }\\n\\n      if (typeof config === 'string') {\\n        if (typeof data[config] === 'undefined') {\\n          throw new TypeError(`No method named \\\"${config}\\\"`)\\n        }\\n\\n        data[config](this)\\n      }\\n    })\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME]             = Toast._jQueryInterface\\n$.fn[NAME].Constructor = Toast\\n$.fn[NAME].noConflict  = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Toast._jQueryInterface\\n}\\n\\nexport default Toast\\n\",\"import $ from 'jquery'\\nimport Alert from './alert'\\nimport Button from './button'\\nimport Carousel from './carousel'\\nimport Collapse from './collapse'\\nimport Dropdown from './dropdown'\\nimport Modal from './modal'\\nimport Popover from './popover'\\nimport Scrollspy from './scrollspy'\\nimport Tab from './tab'\\nimport Toast from './toast'\\nimport Tooltip from './tooltip'\\nimport Util from './util'\\n\\n/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): index.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\n(() => {\\n  if (typeof $ === 'undefined') {\\n    throw new TypeError('Bootstrap\\\\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\\\\'s JavaScript.')\\n  }\\n\\n  const version = $.fn.jquery.split(' ')[0].split('.')\\n  const minMajor = 1\\n  const ltMajor = 2\\n  const minMinor = 9\\n  const minPatch = 1\\n  const maxMajor = 4\\n\\n  if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {\\n    throw new Error('Bootstrap\\\\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0')\\n  }\\n})()\\n\\nexport {\\n  Util,\\n  Alert,\\n  Button,\\n  Carousel,\\n  Collapse,\\n  Dropdown,\\n  Modal,\\n  Popover,\\n  Scrollspy,\\n  Tab,\\n  Toast,\\n  Tooltip\\n}\\n\"]}"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bootstrap4/js/bootstrap.js",
    "content": "/*!\n  * Bootstrap v4.3.1 (https://getbootstrap.com/)\n  * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jquery'), require('popper.js')) :\n  typeof define === 'function' && define.amd ? define(['exports', 'jquery', 'popper.js'], factory) :\n  (global = global || self, factory(global.bootstrap = {}, global.jQuery, global.Popper));\n}(this, function (exports, $, Popper) { 'use strict';\n\n  $ = $ && $.hasOwnProperty('default') ? $['default'] : $;\n  Popper = Popper && Popper.hasOwnProperty('default') ? Popper['default'] : Popper;\n\n  function _defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  function _createClass(Constructor, protoProps, staticProps) {\n    if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) _defineProperties(Constructor, staticProps);\n    return Constructor;\n  }\n\n  function _defineProperty(obj, key, value) {\n    if (key in obj) {\n      Object.defineProperty(obj, key, {\n        value: value,\n        enumerable: true,\n        configurable: true,\n        writable: true\n      });\n    } else {\n      obj[key] = value;\n    }\n\n    return obj;\n  }\n\n  function _objectSpread(target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i] != null ? arguments[i] : {};\n      var ownKeys = Object.keys(source);\n\n      if (typeof Object.getOwnPropertySymbols === 'function') {\n        ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {\n          return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n        }));\n      }\n\n      ownKeys.forEach(function (key) {\n        _defineProperty(target, key, source[key]);\n      });\n    }\n\n    return target;\n  }\n\n  function _inheritsLoose(subClass, superClass) {\n    subClass.prototype = Object.create(superClass.prototype);\n    subClass.prototype.constructor = subClass;\n    subClass.__proto__ = superClass;\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.3.1): util.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Private TransitionEnd Helpers\n   * ------------------------------------------------------------------------\n   */\n\n  var TRANSITION_END = 'transitionend';\n  var MAX_UID = 1000000;\n  var MILLISECONDS_MULTIPLIER = 1000; // Shoutout AngusCroll (https://goo.gl/pxwQGp)\n\n  function toType(obj) {\n    return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase();\n  }\n\n  function getSpecialTransitionEndEvent() {\n    return {\n      bindType: TRANSITION_END,\n      delegateType: TRANSITION_END,\n      handle: function handle(event) {\n        if ($(event.target).is(this)) {\n          return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params\n        }\n\n        return undefined; // eslint-disable-line no-undefined\n      }\n    };\n  }\n\n  function transitionEndEmulator(duration) {\n    var _this = this;\n\n    var called = false;\n    $(this).one(Util.TRANSITION_END, function () {\n      called = true;\n    });\n    setTimeout(function () {\n      if (!called) {\n        Util.triggerTransitionEnd(_this);\n      }\n    }, duration);\n    return this;\n  }\n\n  function setTransitionEndSupport() {\n    $.fn.emulateTransitionEnd = transitionEndEmulator;\n    $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();\n  }\n  /**\n   * --------------------------------------------------------------------------\n   * Public Util Api\n   * --------------------------------------------------------------------------\n   */\n\n\n  var Util = {\n    TRANSITION_END: 'bsTransitionEnd',\n    getUID: function getUID(prefix) {\n      do {\n        // eslint-disable-next-line no-bitwise\n        prefix += ~~(Math.random() * MAX_UID); // \"~~\" acts like a faster Math.floor() here\n      } while (document.getElementById(prefix));\n\n      return prefix;\n    },\n    getSelectorFromElement: function getSelectorFromElement(element) {\n      var selector = element.getAttribute('data-target');\n\n      if (!selector || selector === '#') {\n        var hrefAttr = element.getAttribute('href');\n        selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : '';\n      }\n\n      try {\n        return document.querySelector(selector) ? selector : null;\n      } catch (err) {\n        return null;\n      }\n    },\n    getTransitionDurationFromElement: function getTransitionDurationFromElement(element) {\n      if (!element) {\n        return 0;\n      } // Get transition-duration of the element\n\n\n      var transitionDuration = $(element).css('transition-duration');\n      var transitionDelay = $(element).css('transition-delay');\n      var floatTransitionDuration = parseFloat(transitionDuration);\n      var floatTransitionDelay = parseFloat(transitionDelay); // Return 0 if element or transition duration is not found\n\n      if (!floatTransitionDuration && !floatTransitionDelay) {\n        return 0;\n      } // If multiple durations are defined, take the first\n\n\n      transitionDuration = transitionDuration.split(',')[0];\n      transitionDelay = transitionDelay.split(',')[0];\n      return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;\n    },\n    reflow: function reflow(element) {\n      return element.offsetHeight;\n    },\n    triggerTransitionEnd: function triggerTransitionEnd(element) {\n      $(element).trigger(TRANSITION_END);\n    },\n    // TODO: Remove in v5\n    supportsTransitionEnd: function supportsTransitionEnd() {\n      return Boolean(TRANSITION_END);\n    },\n    isElement: function isElement(obj) {\n      return (obj[0] || obj).nodeType;\n    },\n    typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {\n      for (var property in configTypes) {\n        if (Object.prototype.hasOwnProperty.call(configTypes, property)) {\n          var expectedTypes = configTypes[property];\n          var value = config[property];\n          var valueType = value && Util.isElement(value) ? 'element' : toType(value);\n\n          if (!new RegExp(expectedTypes).test(valueType)) {\n            throw new Error(componentName.toUpperCase() + \": \" + (\"Option \\\"\" + property + \"\\\" provided type \\\"\" + valueType + \"\\\" \") + (\"but expected type \\\"\" + expectedTypes + \"\\\".\"));\n          }\n        }\n      }\n    },\n    findShadowRoot: function findShadowRoot(element) {\n      if (!document.documentElement.attachShadow) {\n        return null;\n      } // Can find the shadow root otherwise it'll return the document\n\n\n      if (typeof element.getRootNode === 'function') {\n        var root = element.getRootNode();\n        return root instanceof ShadowRoot ? root : null;\n      }\n\n      if (element instanceof ShadowRoot) {\n        return element;\n      } // when we don't find a shadow root\n\n\n      if (!element.parentNode) {\n        return null;\n      }\n\n      return Util.findShadowRoot(element.parentNode);\n    }\n  };\n  setTransitionEndSupport();\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME = 'alert';\n  var VERSION = '4.3.1';\n  var DATA_KEY = 'bs.alert';\n  var EVENT_KEY = \".\" + DATA_KEY;\n  var DATA_API_KEY = '.data-api';\n  var JQUERY_NO_CONFLICT = $.fn[NAME];\n  var Selector = {\n    DISMISS: '[data-dismiss=\"alert\"]'\n  };\n  var Event = {\n    CLOSE: \"close\" + EVENT_KEY,\n    CLOSED: \"closed\" + EVENT_KEY,\n    CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY\n  };\n  var ClassName = {\n    ALERT: 'alert',\n    FADE: 'fade',\n    SHOW: 'show'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Alert =\n  /*#__PURE__*/\n  function () {\n    function Alert(element) {\n      this._element = element;\n    } // Getters\n\n\n    var _proto = Alert.prototype;\n\n    // Public\n    _proto.close = function close(element) {\n      var rootElement = this._element;\n\n      if (element) {\n        rootElement = this._getRootElement(element);\n      }\n\n      var customEvent = this._triggerCloseEvent(rootElement);\n\n      if (customEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      this._removeElement(rootElement);\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY);\n      this._element = null;\n    } // Private\n    ;\n\n    _proto._getRootElement = function _getRootElement(element) {\n      var selector = Util.getSelectorFromElement(element);\n      var parent = false;\n\n      if (selector) {\n        parent = document.querySelector(selector);\n      }\n\n      if (!parent) {\n        parent = $(element).closest(\".\" + ClassName.ALERT)[0];\n      }\n\n      return parent;\n    };\n\n    _proto._triggerCloseEvent = function _triggerCloseEvent(element) {\n      var closeEvent = $.Event(Event.CLOSE);\n      $(element).trigger(closeEvent);\n      return closeEvent;\n    };\n\n    _proto._removeElement = function _removeElement(element) {\n      var _this = this;\n\n      $(element).removeClass(ClassName.SHOW);\n\n      if (!$(element).hasClass(ClassName.FADE)) {\n        this._destroyElement(element);\n\n        return;\n      }\n\n      var transitionDuration = Util.getTransitionDurationFromElement(element);\n      $(element).one(Util.TRANSITION_END, function (event) {\n        return _this._destroyElement(element, event);\n      }).emulateTransitionEnd(transitionDuration);\n    };\n\n    _proto._destroyElement = function _destroyElement(element) {\n      $(element).detach().trigger(Event.CLOSED).remove();\n    } // Static\n    ;\n\n    Alert._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $element = $(this);\n        var data = $element.data(DATA_KEY);\n\n        if (!data) {\n          data = new Alert(this);\n          $element.data(DATA_KEY, data);\n        }\n\n        if (config === 'close') {\n          data[config](this);\n        }\n      });\n    };\n\n    Alert._handleDismiss = function _handleDismiss(alertInstance) {\n      return function (event) {\n        if (event) {\n          event.preventDefault();\n        }\n\n        alertInstance.close(this);\n      };\n    };\n\n    _createClass(Alert, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION;\n      }\n    }]);\n\n    return Alert;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert()));\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME] = Alert._jQueryInterface;\n  $.fn[NAME].Constructor = Alert;\n\n  $.fn[NAME].noConflict = function () {\n    $.fn[NAME] = JQUERY_NO_CONFLICT;\n    return Alert._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$1 = 'button';\n  var VERSION$1 = '4.3.1';\n  var DATA_KEY$1 = 'bs.button';\n  var EVENT_KEY$1 = \".\" + DATA_KEY$1;\n  var DATA_API_KEY$1 = '.data-api';\n  var JQUERY_NO_CONFLICT$1 = $.fn[NAME$1];\n  var ClassName$1 = {\n    ACTIVE: 'active',\n    BUTTON: 'btn',\n    FOCUS: 'focus'\n  };\n  var Selector$1 = {\n    DATA_TOGGLE_CARROT: '[data-toggle^=\"button\"]',\n    DATA_TOGGLE: '[data-toggle=\"buttons\"]',\n    INPUT: 'input:not([type=\"hidden\"])',\n    ACTIVE: '.active',\n    BUTTON: '.btn'\n  };\n  var Event$1 = {\n    CLICK_DATA_API: \"click\" + EVENT_KEY$1 + DATA_API_KEY$1,\n    FOCUS_BLUR_DATA_API: \"focus\" + EVENT_KEY$1 + DATA_API_KEY$1 + \" \" + (\"blur\" + EVENT_KEY$1 + DATA_API_KEY$1)\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Button =\n  /*#__PURE__*/\n  function () {\n    function Button(element) {\n      this._element = element;\n    } // Getters\n\n\n    var _proto = Button.prototype;\n\n    // Public\n    _proto.toggle = function toggle() {\n      var triggerChangeEvent = true;\n      var addAriaPressed = true;\n      var rootElement = $(this._element).closest(Selector$1.DATA_TOGGLE)[0];\n\n      if (rootElement) {\n        var input = this._element.querySelector(Selector$1.INPUT);\n\n        if (input) {\n          if (input.type === 'radio') {\n            if (input.checked && this._element.classList.contains(ClassName$1.ACTIVE)) {\n              triggerChangeEvent = false;\n            } else {\n              var activeElement = rootElement.querySelector(Selector$1.ACTIVE);\n\n              if (activeElement) {\n                $(activeElement).removeClass(ClassName$1.ACTIVE);\n              }\n            }\n          }\n\n          if (triggerChangeEvent) {\n            if (input.hasAttribute('disabled') || rootElement.hasAttribute('disabled') || input.classList.contains('disabled') || rootElement.classList.contains('disabled')) {\n              return;\n            }\n\n            input.checked = !this._element.classList.contains(ClassName$1.ACTIVE);\n            $(input).trigger('change');\n          }\n\n          input.focus();\n          addAriaPressed = false;\n        }\n      }\n\n      if (addAriaPressed) {\n        this._element.setAttribute('aria-pressed', !this._element.classList.contains(ClassName$1.ACTIVE));\n      }\n\n      if (triggerChangeEvent) {\n        $(this._element).toggleClass(ClassName$1.ACTIVE);\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$1);\n      this._element = null;\n    } // Static\n    ;\n\n    Button._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$1);\n\n        if (!data) {\n          data = new Button(this);\n          $(this).data(DATA_KEY$1, data);\n        }\n\n        if (config === 'toggle') {\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Button, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$1;\n      }\n    }]);\n\n    return Button;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$1.CLICK_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {\n    event.preventDefault();\n    var button = event.target;\n\n    if (!$(button).hasClass(ClassName$1.BUTTON)) {\n      button = $(button).closest(Selector$1.BUTTON);\n    }\n\n    Button._jQueryInterface.call($(button), 'toggle');\n  }).on(Event$1.FOCUS_BLUR_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {\n    var button = $(event.target).closest(Selector$1.BUTTON)[0];\n    $(button).toggleClass(ClassName$1.FOCUS, /^focus(in)?$/.test(event.type));\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$1] = Button._jQueryInterface;\n  $.fn[NAME$1].Constructor = Button;\n\n  $.fn[NAME$1].noConflict = function () {\n    $.fn[NAME$1] = JQUERY_NO_CONFLICT$1;\n    return Button._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$2 = 'carousel';\n  var VERSION$2 = '4.3.1';\n  var DATA_KEY$2 = 'bs.carousel';\n  var EVENT_KEY$2 = \".\" + DATA_KEY$2;\n  var DATA_API_KEY$2 = '.data-api';\n  var JQUERY_NO_CONFLICT$2 = $.fn[NAME$2];\n  var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key\n\n  var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key\n\n  var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\n\n  var SWIPE_THRESHOLD = 40;\n  var Default = {\n    interval: 5000,\n    keyboard: true,\n    slide: false,\n    pause: 'hover',\n    wrap: true,\n    touch: true\n  };\n  var DefaultType = {\n    interval: '(number|boolean)',\n    keyboard: 'boolean',\n    slide: '(boolean|string)',\n    pause: '(string|boolean)',\n    wrap: 'boolean',\n    touch: 'boolean'\n  };\n  var Direction = {\n    NEXT: 'next',\n    PREV: 'prev',\n    LEFT: 'left',\n    RIGHT: 'right'\n  };\n  var Event$2 = {\n    SLIDE: \"slide\" + EVENT_KEY$2,\n    SLID: \"slid\" + EVENT_KEY$2,\n    KEYDOWN: \"keydown\" + EVENT_KEY$2,\n    MOUSEENTER: \"mouseenter\" + EVENT_KEY$2,\n    MOUSELEAVE: \"mouseleave\" + EVENT_KEY$2,\n    TOUCHSTART: \"touchstart\" + EVENT_KEY$2,\n    TOUCHMOVE: \"touchmove\" + EVENT_KEY$2,\n    TOUCHEND: \"touchend\" + EVENT_KEY$2,\n    POINTERDOWN: \"pointerdown\" + EVENT_KEY$2,\n    POINTERUP: \"pointerup\" + EVENT_KEY$2,\n    DRAG_START: \"dragstart\" + EVENT_KEY$2,\n    LOAD_DATA_API: \"load\" + EVENT_KEY$2 + DATA_API_KEY$2,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$2 + DATA_API_KEY$2\n  };\n  var ClassName$2 = {\n    CAROUSEL: 'carousel',\n    ACTIVE: 'active',\n    SLIDE: 'slide',\n    RIGHT: 'carousel-item-right',\n    LEFT: 'carousel-item-left',\n    NEXT: 'carousel-item-next',\n    PREV: 'carousel-item-prev',\n    ITEM: 'carousel-item',\n    POINTER_EVENT: 'pointer-event'\n  };\n  var Selector$2 = {\n    ACTIVE: '.active',\n    ACTIVE_ITEM: '.active.carousel-item',\n    ITEM: '.carousel-item',\n    ITEM_IMG: '.carousel-item img',\n    NEXT_PREV: '.carousel-item-next, .carousel-item-prev',\n    INDICATORS: '.carousel-indicators',\n    DATA_SLIDE: '[data-slide], [data-slide-to]',\n    DATA_RIDE: '[data-ride=\"carousel\"]'\n  };\n  var PointerType = {\n    TOUCH: 'touch',\n    PEN: 'pen'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Carousel =\n  /*#__PURE__*/\n  function () {\n    function Carousel(element, config) {\n      this._items = null;\n      this._interval = null;\n      this._activeElement = null;\n      this._isPaused = false;\n      this._isSliding = false;\n      this.touchTimeout = null;\n      this.touchStartX = 0;\n      this.touchDeltaX = 0;\n      this._config = this._getConfig(config);\n      this._element = element;\n      this._indicatorsElement = this._element.querySelector(Selector$2.INDICATORS);\n      this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;\n      this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent);\n\n      this._addEventListeners();\n    } // Getters\n\n\n    var _proto = Carousel.prototype;\n\n    // Public\n    _proto.next = function next() {\n      if (!this._isSliding) {\n        this._slide(Direction.NEXT);\n      }\n    };\n\n    _proto.nextWhenVisible = function nextWhenVisible() {\n      // Don't call next when the page isn't visible\n      // or the carousel or its parent isn't visible\n      if (!document.hidden && $(this._element).is(':visible') && $(this._element).css('visibility') !== 'hidden') {\n        this.next();\n      }\n    };\n\n    _proto.prev = function prev() {\n      if (!this._isSliding) {\n        this._slide(Direction.PREV);\n      }\n    };\n\n    _proto.pause = function pause(event) {\n      if (!event) {\n        this._isPaused = true;\n      }\n\n      if (this._element.querySelector(Selector$2.NEXT_PREV)) {\n        Util.triggerTransitionEnd(this._element);\n        this.cycle(true);\n      }\n\n      clearInterval(this._interval);\n      this._interval = null;\n    };\n\n    _proto.cycle = function cycle(event) {\n      if (!event) {\n        this._isPaused = false;\n      }\n\n      if (this._interval) {\n        clearInterval(this._interval);\n        this._interval = null;\n      }\n\n      if (this._config.interval && !this._isPaused) {\n        this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);\n      }\n    };\n\n    _proto.to = function to(index) {\n      var _this = this;\n\n      this._activeElement = this._element.querySelector(Selector$2.ACTIVE_ITEM);\n\n      var activeIndex = this._getItemIndex(this._activeElement);\n\n      if (index > this._items.length - 1 || index < 0) {\n        return;\n      }\n\n      if (this._isSliding) {\n        $(this._element).one(Event$2.SLID, function () {\n          return _this.to(index);\n        });\n        return;\n      }\n\n      if (activeIndex === index) {\n        this.pause();\n        this.cycle();\n        return;\n      }\n\n      var direction = index > activeIndex ? Direction.NEXT : Direction.PREV;\n\n      this._slide(direction, this._items[index]);\n    };\n\n    _proto.dispose = function dispose() {\n      $(this._element).off(EVENT_KEY$2);\n      $.removeData(this._element, DATA_KEY$2);\n      this._items = null;\n      this._config = null;\n      this._element = null;\n      this._interval = null;\n      this._isPaused = null;\n      this._isSliding = null;\n      this._activeElement = null;\n      this._indicatorsElement = null;\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default, config);\n      Util.typeCheckConfig(NAME$2, config, DefaultType);\n      return config;\n    };\n\n    _proto._handleSwipe = function _handleSwipe() {\n      var absDeltax = Math.abs(this.touchDeltaX);\n\n      if (absDeltax <= SWIPE_THRESHOLD) {\n        return;\n      }\n\n      var direction = absDeltax / this.touchDeltaX; // swipe left\n\n      if (direction > 0) {\n        this.prev();\n      } // swipe right\n\n\n      if (direction < 0) {\n        this.next();\n      }\n    };\n\n    _proto._addEventListeners = function _addEventListeners() {\n      var _this2 = this;\n\n      if (this._config.keyboard) {\n        $(this._element).on(Event$2.KEYDOWN, function (event) {\n          return _this2._keydown(event);\n        });\n      }\n\n      if (this._config.pause === 'hover') {\n        $(this._element).on(Event$2.MOUSEENTER, function (event) {\n          return _this2.pause(event);\n        }).on(Event$2.MOUSELEAVE, function (event) {\n          return _this2.cycle(event);\n        });\n      }\n\n      if (this._config.touch) {\n        this._addTouchEventListeners();\n      }\n    };\n\n    _proto._addTouchEventListeners = function _addTouchEventListeners() {\n      var _this3 = this;\n\n      if (!this._touchSupported) {\n        return;\n      }\n\n      var start = function start(event) {\n        if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n          _this3.touchStartX = event.originalEvent.clientX;\n        } else if (!_this3._pointerEvent) {\n          _this3.touchStartX = event.originalEvent.touches[0].clientX;\n        }\n      };\n\n      var move = function move(event) {\n        // ensure swiping with one touch and not pinching\n        if (event.originalEvent.touches && event.originalEvent.touches.length > 1) {\n          _this3.touchDeltaX = 0;\n        } else {\n          _this3.touchDeltaX = event.originalEvent.touches[0].clientX - _this3.touchStartX;\n        }\n      };\n\n      var end = function end(event) {\n        if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n          _this3.touchDeltaX = event.originalEvent.clientX - _this3.touchStartX;\n        }\n\n        _this3._handleSwipe();\n\n        if (_this3._config.pause === 'hover') {\n          // If it's a touch-enabled device, mouseenter/leave are fired as\n          // part of the mouse compatibility events on first tap - the carousel\n          // would stop cycling until user tapped out of it;\n          // here, we listen for touchend, explicitly pause the carousel\n          // (as if it's the second time we tap on it, mouseenter compat event\n          // is NOT fired) and after a timeout (to allow for mouse compatibility\n          // events to fire) we explicitly restart cycling\n          _this3.pause();\n\n          if (_this3.touchTimeout) {\n            clearTimeout(_this3.touchTimeout);\n          }\n\n          _this3.touchTimeout = setTimeout(function (event) {\n            return _this3.cycle(event);\n          }, TOUCHEVENT_COMPAT_WAIT + _this3._config.interval);\n        }\n      };\n\n      $(this._element.querySelectorAll(Selector$2.ITEM_IMG)).on(Event$2.DRAG_START, function (e) {\n        return e.preventDefault();\n      });\n\n      if (this._pointerEvent) {\n        $(this._element).on(Event$2.POINTERDOWN, function (event) {\n          return start(event);\n        });\n        $(this._element).on(Event$2.POINTERUP, function (event) {\n          return end(event);\n        });\n\n        this._element.classList.add(ClassName$2.POINTER_EVENT);\n      } else {\n        $(this._element).on(Event$2.TOUCHSTART, function (event) {\n          return start(event);\n        });\n        $(this._element).on(Event$2.TOUCHMOVE, function (event) {\n          return move(event);\n        });\n        $(this._element).on(Event$2.TOUCHEND, function (event) {\n          return end(event);\n        });\n      }\n    };\n\n    _proto._keydown = function _keydown(event) {\n      if (/input|textarea/i.test(event.target.tagName)) {\n        return;\n      }\n\n      switch (event.which) {\n        case ARROW_LEFT_KEYCODE:\n          event.preventDefault();\n          this.prev();\n          break;\n\n        case ARROW_RIGHT_KEYCODE:\n          event.preventDefault();\n          this.next();\n          break;\n\n        default:\n      }\n    };\n\n    _proto._getItemIndex = function _getItemIndex(element) {\n      this._items = element && element.parentNode ? [].slice.call(element.parentNode.querySelectorAll(Selector$2.ITEM)) : [];\n      return this._items.indexOf(element);\n    };\n\n    _proto._getItemByDirection = function _getItemByDirection(direction, activeElement) {\n      var isNextDirection = direction === Direction.NEXT;\n      var isPrevDirection = direction === Direction.PREV;\n\n      var activeIndex = this._getItemIndex(activeElement);\n\n      var lastItemIndex = this._items.length - 1;\n      var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex;\n\n      if (isGoingToWrap && !this._config.wrap) {\n        return activeElement;\n      }\n\n      var delta = direction === Direction.PREV ? -1 : 1;\n      var itemIndex = (activeIndex + delta) % this._items.length;\n      return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];\n    };\n\n    _proto._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) {\n      var targetIndex = this._getItemIndex(relatedTarget);\n\n      var fromIndex = this._getItemIndex(this._element.querySelector(Selector$2.ACTIVE_ITEM));\n\n      var slideEvent = $.Event(Event$2.SLIDE, {\n        relatedTarget: relatedTarget,\n        direction: eventDirectionName,\n        from: fromIndex,\n        to: targetIndex\n      });\n      $(this._element).trigger(slideEvent);\n      return slideEvent;\n    };\n\n    _proto._setActiveIndicatorElement = function _setActiveIndicatorElement(element) {\n      if (this._indicatorsElement) {\n        var indicators = [].slice.call(this._indicatorsElement.querySelectorAll(Selector$2.ACTIVE));\n        $(indicators).removeClass(ClassName$2.ACTIVE);\n\n        var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)];\n\n        if (nextIndicator) {\n          $(nextIndicator).addClass(ClassName$2.ACTIVE);\n        }\n      }\n    };\n\n    _proto._slide = function _slide(direction, element) {\n      var _this4 = this;\n\n      var activeElement = this._element.querySelector(Selector$2.ACTIVE_ITEM);\n\n      var activeElementIndex = this._getItemIndex(activeElement);\n\n      var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement);\n\n      var nextElementIndex = this._getItemIndex(nextElement);\n\n      var isCycling = Boolean(this._interval);\n      var directionalClassName;\n      var orderClassName;\n      var eventDirectionName;\n\n      if (direction === Direction.NEXT) {\n        directionalClassName = ClassName$2.LEFT;\n        orderClassName = ClassName$2.NEXT;\n        eventDirectionName = Direction.LEFT;\n      } else {\n        directionalClassName = ClassName$2.RIGHT;\n        orderClassName = ClassName$2.PREV;\n        eventDirectionName = Direction.RIGHT;\n      }\n\n      if (nextElement && $(nextElement).hasClass(ClassName$2.ACTIVE)) {\n        this._isSliding = false;\n        return;\n      }\n\n      var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);\n\n      if (slideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      if (!activeElement || !nextElement) {\n        // Some weirdness is happening, so we bail\n        return;\n      }\n\n      this._isSliding = true;\n\n      if (isCycling) {\n        this.pause();\n      }\n\n      this._setActiveIndicatorElement(nextElement);\n\n      var slidEvent = $.Event(Event$2.SLID, {\n        relatedTarget: nextElement,\n        direction: eventDirectionName,\n        from: activeElementIndex,\n        to: nextElementIndex\n      });\n\n      if ($(this._element).hasClass(ClassName$2.SLIDE)) {\n        $(nextElement).addClass(orderClassName);\n        Util.reflow(nextElement);\n        $(activeElement).addClass(directionalClassName);\n        $(nextElement).addClass(directionalClassName);\n        var nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10);\n\n        if (nextElementInterval) {\n          this._config.defaultInterval = this._config.defaultInterval || this._config.interval;\n          this._config.interval = nextElementInterval;\n        } else {\n          this._config.interval = this._config.defaultInterval || this._config.interval;\n        }\n\n        var transitionDuration = Util.getTransitionDurationFromElement(activeElement);\n        $(activeElement).one(Util.TRANSITION_END, function () {\n          $(nextElement).removeClass(directionalClassName + \" \" + orderClassName).addClass(ClassName$2.ACTIVE);\n          $(activeElement).removeClass(ClassName$2.ACTIVE + \" \" + orderClassName + \" \" + directionalClassName);\n          _this4._isSliding = false;\n          setTimeout(function () {\n            return $(_this4._element).trigger(slidEvent);\n          }, 0);\n        }).emulateTransitionEnd(transitionDuration);\n      } else {\n        $(activeElement).removeClass(ClassName$2.ACTIVE);\n        $(nextElement).addClass(ClassName$2.ACTIVE);\n        this._isSliding = false;\n        $(this._element).trigger(slidEvent);\n      }\n\n      if (isCycling) {\n        this.cycle();\n      }\n    } // Static\n    ;\n\n    Carousel._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$2);\n\n        var _config = _objectSpread({}, Default, $(this).data());\n\n        if (typeof config === 'object') {\n          _config = _objectSpread({}, _config, config);\n        }\n\n        var action = typeof config === 'string' ? config : _config.slide;\n\n        if (!data) {\n          data = new Carousel(this, _config);\n          $(this).data(DATA_KEY$2, data);\n        }\n\n        if (typeof config === 'number') {\n          data.to(config);\n        } else if (typeof action === 'string') {\n          if (typeof data[action] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + action + \"\\\"\");\n          }\n\n          data[action]();\n        } else if (_config.interval && _config.ride) {\n          data.pause();\n          data.cycle();\n        }\n      });\n    };\n\n    Carousel._dataApiClickHandler = function _dataApiClickHandler(event) {\n      var selector = Util.getSelectorFromElement(this);\n\n      if (!selector) {\n        return;\n      }\n\n      var target = $(selector)[0];\n\n      if (!target || !$(target).hasClass(ClassName$2.CAROUSEL)) {\n        return;\n      }\n\n      var config = _objectSpread({}, $(target).data(), $(this).data());\n\n      var slideIndex = this.getAttribute('data-slide-to');\n\n      if (slideIndex) {\n        config.interval = false;\n      }\n\n      Carousel._jQueryInterface.call($(target), config);\n\n      if (slideIndex) {\n        $(target).data(DATA_KEY$2).to(slideIndex);\n      }\n\n      event.preventDefault();\n    };\n\n    _createClass(Carousel, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$2;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default;\n      }\n    }]);\n\n    return Carousel;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$2.CLICK_DATA_API, Selector$2.DATA_SLIDE, Carousel._dataApiClickHandler);\n  $(window).on(Event$2.LOAD_DATA_API, function () {\n    var carousels = [].slice.call(document.querySelectorAll(Selector$2.DATA_RIDE));\n\n    for (var i = 0, len = carousels.length; i < len; i++) {\n      var $carousel = $(carousels[i]);\n\n      Carousel._jQueryInterface.call($carousel, $carousel.data());\n    }\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$2] = Carousel._jQueryInterface;\n  $.fn[NAME$2].Constructor = Carousel;\n\n  $.fn[NAME$2].noConflict = function () {\n    $.fn[NAME$2] = JQUERY_NO_CONFLICT$2;\n    return Carousel._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$3 = 'collapse';\n  var VERSION$3 = '4.3.1';\n  var DATA_KEY$3 = 'bs.collapse';\n  var EVENT_KEY$3 = \".\" + DATA_KEY$3;\n  var DATA_API_KEY$3 = '.data-api';\n  var JQUERY_NO_CONFLICT$3 = $.fn[NAME$3];\n  var Default$1 = {\n    toggle: true,\n    parent: ''\n  };\n  var DefaultType$1 = {\n    toggle: 'boolean',\n    parent: '(string|element)'\n  };\n  var Event$3 = {\n    SHOW: \"show\" + EVENT_KEY$3,\n    SHOWN: \"shown\" + EVENT_KEY$3,\n    HIDE: \"hide\" + EVENT_KEY$3,\n    HIDDEN: \"hidden\" + EVENT_KEY$3,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$3 + DATA_API_KEY$3\n  };\n  var ClassName$3 = {\n    SHOW: 'show',\n    COLLAPSE: 'collapse',\n    COLLAPSING: 'collapsing',\n    COLLAPSED: 'collapsed'\n  };\n  var Dimension = {\n    WIDTH: 'width',\n    HEIGHT: 'height'\n  };\n  var Selector$3 = {\n    ACTIVES: '.show, .collapsing',\n    DATA_TOGGLE: '[data-toggle=\"collapse\"]'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Collapse =\n  /*#__PURE__*/\n  function () {\n    function Collapse(element, config) {\n      this._isTransitioning = false;\n      this._element = element;\n      this._config = this._getConfig(config);\n      this._triggerArray = [].slice.call(document.querySelectorAll(\"[data-toggle=\\\"collapse\\\"][href=\\\"#\" + element.id + \"\\\"],\" + (\"[data-toggle=\\\"collapse\\\"][data-target=\\\"#\" + element.id + \"\\\"]\")));\n      var toggleList = [].slice.call(document.querySelectorAll(Selector$3.DATA_TOGGLE));\n\n      for (var i = 0, len = toggleList.length; i < len; i++) {\n        var elem = toggleList[i];\n        var selector = Util.getSelectorFromElement(elem);\n        var filterElement = [].slice.call(document.querySelectorAll(selector)).filter(function (foundElem) {\n          return foundElem === element;\n        });\n\n        if (selector !== null && filterElement.length > 0) {\n          this._selector = selector;\n\n          this._triggerArray.push(elem);\n        }\n      }\n\n      this._parent = this._config.parent ? this._getParent() : null;\n\n      if (!this._config.parent) {\n        this._addAriaAndCollapsedClass(this._element, this._triggerArray);\n      }\n\n      if (this._config.toggle) {\n        this.toggle();\n      }\n    } // Getters\n\n\n    var _proto = Collapse.prototype;\n\n    // Public\n    _proto.toggle = function toggle() {\n      if ($(this._element).hasClass(ClassName$3.SHOW)) {\n        this.hide();\n      } else {\n        this.show();\n      }\n    };\n\n    _proto.show = function show() {\n      var _this = this;\n\n      if (this._isTransitioning || $(this._element).hasClass(ClassName$3.SHOW)) {\n        return;\n      }\n\n      var actives;\n      var activesData;\n\n      if (this._parent) {\n        actives = [].slice.call(this._parent.querySelectorAll(Selector$3.ACTIVES)).filter(function (elem) {\n          if (typeof _this._config.parent === 'string') {\n            return elem.getAttribute('data-parent') === _this._config.parent;\n          }\n\n          return elem.classList.contains(ClassName$3.COLLAPSE);\n        });\n\n        if (actives.length === 0) {\n          actives = null;\n        }\n      }\n\n      if (actives) {\n        activesData = $(actives).not(this._selector).data(DATA_KEY$3);\n\n        if (activesData && activesData._isTransitioning) {\n          return;\n        }\n      }\n\n      var startEvent = $.Event(Event$3.SHOW);\n      $(this._element).trigger(startEvent);\n\n      if (startEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      if (actives) {\n        Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide');\n\n        if (!activesData) {\n          $(actives).data(DATA_KEY$3, null);\n        }\n      }\n\n      var dimension = this._getDimension();\n\n      $(this._element).removeClass(ClassName$3.COLLAPSE).addClass(ClassName$3.COLLAPSING);\n      this._element.style[dimension] = 0;\n\n      if (this._triggerArray.length) {\n        $(this._triggerArray).removeClass(ClassName$3.COLLAPSED).attr('aria-expanded', true);\n      }\n\n      this.setTransitioning(true);\n\n      var complete = function complete() {\n        $(_this._element).removeClass(ClassName$3.COLLAPSING).addClass(ClassName$3.COLLAPSE).addClass(ClassName$3.SHOW);\n        _this._element.style[dimension] = '';\n\n        _this.setTransitioning(false);\n\n        $(_this._element).trigger(Event$3.SHOWN);\n      };\n\n      var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\n      var scrollSize = \"scroll\" + capitalizedDimension;\n      var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n      $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      this._element.style[dimension] = this._element[scrollSize] + \"px\";\n    };\n\n    _proto.hide = function hide() {\n      var _this2 = this;\n\n      if (this._isTransitioning || !$(this._element).hasClass(ClassName$3.SHOW)) {\n        return;\n      }\n\n      var startEvent = $.Event(Event$3.HIDE);\n      $(this._element).trigger(startEvent);\n\n      if (startEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      var dimension = this._getDimension();\n\n      this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + \"px\";\n      Util.reflow(this._element);\n      $(this._element).addClass(ClassName$3.COLLAPSING).removeClass(ClassName$3.COLLAPSE).removeClass(ClassName$3.SHOW);\n      var triggerArrayLength = this._triggerArray.length;\n\n      if (triggerArrayLength > 0) {\n        for (var i = 0; i < triggerArrayLength; i++) {\n          var trigger = this._triggerArray[i];\n          var selector = Util.getSelectorFromElement(trigger);\n\n          if (selector !== null) {\n            var $elem = $([].slice.call(document.querySelectorAll(selector)));\n\n            if (!$elem.hasClass(ClassName$3.SHOW)) {\n              $(trigger).addClass(ClassName$3.COLLAPSED).attr('aria-expanded', false);\n            }\n          }\n        }\n      }\n\n      this.setTransitioning(true);\n\n      var complete = function complete() {\n        _this2.setTransitioning(false);\n\n        $(_this2._element).removeClass(ClassName$3.COLLAPSING).addClass(ClassName$3.COLLAPSE).trigger(Event$3.HIDDEN);\n      };\n\n      this._element.style[dimension] = '';\n      var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n      $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n    };\n\n    _proto.setTransitioning = function setTransitioning(isTransitioning) {\n      this._isTransitioning = isTransitioning;\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$3);\n      this._config = null;\n      this._parent = null;\n      this._element = null;\n      this._triggerArray = null;\n      this._isTransitioning = null;\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default$1, config);\n      config.toggle = Boolean(config.toggle); // Coerce string values\n\n      Util.typeCheckConfig(NAME$3, config, DefaultType$1);\n      return config;\n    };\n\n    _proto._getDimension = function _getDimension() {\n      var hasWidth = $(this._element).hasClass(Dimension.WIDTH);\n      return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;\n    };\n\n    _proto._getParent = function _getParent() {\n      var _this3 = this;\n\n      var parent;\n\n      if (Util.isElement(this._config.parent)) {\n        parent = this._config.parent; // It's a jQuery object\n\n        if (typeof this._config.parent.jquery !== 'undefined') {\n          parent = this._config.parent[0];\n        }\n      } else {\n        parent = document.querySelector(this._config.parent);\n      }\n\n      var selector = \"[data-toggle=\\\"collapse\\\"][data-parent=\\\"\" + this._config.parent + \"\\\"]\";\n      var children = [].slice.call(parent.querySelectorAll(selector));\n      $(children).each(function (i, element) {\n        _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);\n      });\n      return parent;\n    };\n\n    _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {\n      var isOpen = $(element).hasClass(ClassName$3.SHOW);\n\n      if (triggerArray.length) {\n        $(triggerArray).toggleClass(ClassName$3.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);\n      }\n    } // Static\n    ;\n\n    Collapse._getTargetFromElement = function _getTargetFromElement(element) {\n      var selector = Util.getSelectorFromElement(element);\n      return selector ? document.querySelector(selector) : null;\n    };\n\n    Collapse._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $this = $(this);\n        var data = $this.data(DATA_KEY$3);\n\n        var _config = _objectSpread({}, Default$1, $this.data(), typeof config === 'object' && config ? config : {});\n\n        if (!data && _config.toggle && /show|hide/.test(config)) {\n          _config.toggle = false;\n        }\n\n        if (!data) {\n          data = new Collapse(this, _config);\n          $this.data(DATA_KEY$3, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Collapse, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$3;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$1;\n      }\n    }]);\n\n    return Collapse;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$3.CLICK_DATA_API, Selector$3.DATA_TOGGLE, function (event) {\n    // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n    if (event.currentTarget.tagName === 'A') {\n      event.preventDefault();\n    }\n\n    var $trigger = $(this);\n    var selector = Util.getSelectorFromElement(this);\n    var selectors = [].slice.call(document.querySelectorAll(selector));\n    $(selectors).each(function () {\n      var $target = $(this);\n      var data = $target.data(DATA_KEY$3);\n      var config = data ? 'toggle' : $trigger.data();\n\n      Collapse._jQueryInterface.call($target, config);\n    });\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$3] = Collapse._jQueryInterface;\n  $.fn[NAME$3].Constructor = Collapse;\n\n  $.fn[NAME$3].noConflict = function () {\n    $.fn[NAME$3] = JQUERY_NO_CONFLICT$3;\n    return Collapse._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$4 = 'dropdown';\n  var VERSION$4 = '4.3.1';\n  var DATA_KEY$4 = 'bs.dropdown';\n  var EVENT_KEY$4 = \".\" + DATA_KEY$4;\n  var DATA_API_KEY$4 = '.data-api';\n  var JQUERY_NO_CONFLICT$4 = $.fn[NAME$4];\n  var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key\n\n  var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key\n\n  var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key\n\n  var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key\n\n  var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key\n\n  var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)\n\n  var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + \"|\" + ARROW_DOWN_KEYCODE + \"|\" + ESCAPE_KEYCODE);\n  var Event$4 = {\n    HIDE: \"hide\" + EVENT_KEY$4,\n    HIDDEN: \"hidden\" + EVENT_KEY$4,\n    SHOW: \"show\" + EVENT_KEY$4,\n    SHOWN: \"shown\" + EVENT_KEY$4,\n    CLICK: \"click\" + EVENT_KEY$4,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$4 + DATA_API_KEY$4,\n    KEYDOWN_DATA_API: \"keydown\" + EVENT_KEY$4 + DATA_API_KEY$4,\n    KEYUP_DATA_API: \"keyup\" + EVENT_KEY$4 + DATA_API_KEY$4\n  };\n  var ClassName$4 = {\n    DISABLED: 'disabled',\n    SHOW: 'show',\n    DROPUP: 'dropup',\n    DROPRIGHT: 'dropright',\n    DROPLEFT: 'dropleft',\n    MENURIGHT: 'dropdown-menu-right',\n    MENULEFT: 'dropdown-menu-left',\n    POSITION_STATIC: 'position-static'\n  };\n  var Selector$4 = {\n    DATA_TOGGLE: '[data-toggle=\"dropdown\"]',\n    FORM_CHILD: '.dropdown form',\n    MENU: '.dropdown-menu',\n    NAVBAR_NAV: '.navbar-nav',\n    VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n  };\n  var AttachmentMap = {\n    TOP: 'top-start',\n    TOPEND: 'top-end',\n    BOTTOM: 'bottom-start',\n    BOTTOMEND: 'bottom-end',\n    RIGHT: 'right-start',\n    RIGHTEND: 'right-end',\n    LEFT: 'left-start',\n    LEFTEND: 'left-end'\n  };\n  var Default$2 = {\n    offset: 0,\n    flip: true,\n    boundary: 'scrollParent',\n    reference: 'toggle',\n    display: 'dynamic'\n  };\n  var DefaultType$2 = {\n    offset: '(number|string|function)',\n    flip: 'boolean',\n    boundary: '(string|element)',\n    reference: '(string|element)',\n    display: 'string'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Dropdown =\n  /*#__PURE__*/\n  function () {\n    function Dropdown(element, config) {\n      this._element = element;\n      this._popper = null;\n      this._config = this._getConfig(config);\n      this._menu = this._getMenuElement();\n      this._inNavbar = this._detectNavbar();\n\n      this._addEventListeners();\n    } // Getters\n\n\n    var _proto = Dropdown.prototype;\n\n    // Public\n    _proto.toggle = function toggle() {\n      if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED)) {\n        return;\n      }\n\n      var parent = Dropdown._getParentFromElement(this._element);\n\n      var isActive = $(this._menu).hasClass(ClassName$4.SHOW);\n\n      Dropdown._clearMenus();\n\n      if (isActive) {\n        return;\n      }\n\n      var relatedTarget = {\n        relatedTarget: this._element\n      };\n      var showEvent = $.Event(Event$4.SHOW, relatedTarget);\n      $(parent).trigger(showEvent);\n\n      if (showEvent.isDefaultPrevented()) {\n        return;\n      } // Disable totally Popper.js for Dropdown in Navbar\n\n\n      if (!this._inNavbar) {\n        /**\n         * Check for Popper dependency\n         * Popper - https://popper.js.org\n         */\n        if (typeof Popper === 'undefined') {\n          throw new TypeError('Bootstrap\\'s dropdowns require Popper.js (https://popper.js.org/)');\n        }\n\n        var referenceElement = this._element;\n\n        if (this._config.reference === 'parent') {\n          referenceElement = parent;\n        } else if (Util.isElement(this._config.reference)) {\n          referenceElement = this._config.reference; // Check if it's jQuery element\n\n          if (typeof this._config.reference.jquery !== 'undefined') {\n            referenceElement = this._config.reference[0];\n          }\n        } // If boundary is not `scrollParent`, then set position to `static`\n        // to allow the menu to \"escape\" the scroll parent's boundaries\n        // https://github.com/twbs/bootstrap/issues/24251\n\n\n        if (this._config.boundary !== 'scrollParent') {\n          $(parent).addClass(ClassName$4.POSITION_STATIC);\n        }\n\n        this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig());\n      } // If this is a touch-enabled device we add extra\n      // empty mouseover listeners to the body's immediate children;\n      // only needed because of broken event delegation on iOS\n      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n\n      if ('ontouchstart' in document.documentElement && $(parent).closest(Selector$4.NAVBAR_NAV).length === 0) {\n        $(document.body).children().on('mouseover', null, $.noop);\n      }\n\n      this._element.focus();\n\n      this._element.setAttribute('aria-expanded', true);\n\n      $(this._menu).toggleClass(ClassName$4.SHOW);\n      $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget));\n    };\n\n    _proto.show = function show() {\n      if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || $(this._menu).hasClass(ClassName$4.SHOW)) {\n        return;\n      }\n\n      var relatedTarget = {\n        relatedTarget: this._element\n      };\n      var showEvent = $.Event(Event$4.SHOW, relatedTarget);\n\n      var parent = Dropdown._getParentFromElement(this._element);\n\n      $(parent).trigger(showEvent);\n\n      if (showEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      $(this._menu).toggleClass(ClassName$4.SHOW);\n      $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget));\n    };\n\n    _proto.hide = function hide() {\n      if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || !$(this._menu).hasClass(ClassName$4.SHOW)) {\n        return;\n      }\n\n      var relatedTarget = {\n        relatedTarget: this._element\n      };\n      var hideEvent = $.Event(Event$4.HIDE, relatedTarget);\n\n      var parent = Dropdown._getParentFromElement(this._element);\n\n      $(parent).trigger(hideEvent);\n\n      if (hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      $(this._menu).toggleClass(ClassName$4.SHOW);\n      $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$4);\n      $(this._element).off(EVENT_KEY$4);\n      this._element = null;\n      this._menu = null;\n\n      if (this._popper !== null) {\n        this._popper.destroy();\n\n        this._popper = null;\n      }\n    };\n\n    _proto.update = function update() {\n      this._inNavbar = this._detectNavbar();\n\n      if (this._popper !== null) {\n        this._popper.scheduleUpdate();\n      }\n    } // Private\n    ;\n\n    _proto._addEventListeners = function _addEventListeners() {\n      var _this = this;\n\n      $(this._element).on(Event$4.CLICK, function (event) {\n        event.preventDefault();\n        event.stopPropagation();\n\n        _this.toggle();\n      });\n    };\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, this.constructor.Default, $(this._element).data(), config);\n      Util.typeCheckConfig(NAME$4, config, this.constructor.DefaultType);\n      return config;\n    };\n\n    _proto._getMenuElement = function _getMenuElement() {\n      if (!this._menu) {\n        var parent = Dropdown._getParentFromElement(this._element);\n\n        if (parent) {\n          this._menu = parent.querySelector(Selector$4.MENU);\n        }\n      }\n\n      return this._menu;\n    };\n\n    _proto._getPlacement = function _getPlacement() {\n      var $parentDropdown = $(this._element.parentNode);\n      var placement = AttachmentMap.BOTTOM; // Handle dropup\n\n      if ($parentDropdown.hasClass(ClassName$4.DROPUP)) {\n        placement = AttachmentMap.TOP;\n\n        if ($(this._menu).hasClass(ClassName$4.MENURIGHT)) {\n          placement = AttachmentMap.TOPEND;\n        }\n      } else if ($parentDropdown.hasClass(ClassName$4.DROPRIGHT)) {\n        placement = AttachmentMap.RIGHT;\n      } else if ($parentDropdown.hasClass(ClassName$4.DROPLEFT)) {\n        placement = AttachmentMap.LEFT;\n      } else if ($(this._menu).hasClass(ClassName$4.MENURIGHT)) {\n        placement = AttachmentMap.BOTTOMEND;\n      }\n\n      return placement;\n    };\n\n    _proto._detectNavbar = function _detectNavbar() {\n      return $(this._element).closest('.navbar').length > 0;\n    };\n\n    _proto._getOffset = function _getOffset() {\n      var _this2 = this;\n\n      var offset = {};\n\n      if (typeof this._config.offset === 'function') {\n        offset.fn = function (data) {\n          data.offsets = _objectSpread({}, data.offsets, _this2._config.offset(data.offsets, _this2._element) || {});\n          return data;\n        };\n      } else {\n        offset.offset = this._config.offset;\n      }\n\n      return offset;\n    };\n\n    _proto._getPopperConfig = function _getPopperConfig() {\n      var popperConfig = {\n        placement: this._getPlacement(),\n        modifiers: {\n          offset: this._getOffset(),\n          flip: {\n            enabled: this._config.flip\n          },\n          preventOverflow: {\n            boundariesElement: this._config.boundary\n          }\n        } // Disable Popper.js if we have a static display\n\n      };\n\n      if (this._config.display === 'static') {\n        popperConfig.modifiers.applyStyle = {\n          enabled: false\n        };\n      }\n\n      return popperConfig;\n    } // Static\n    ;\n\n    Dropdown._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$4);\n\n        var _config = typeof config === 'object' ? config : null;\n\n        if (!data) {\n          data = new Dropdown(this, _config);\n          $(this).data(DATA_KEY$4, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    Dropdown._clearMenus = function _clearMenus(event) {\n      if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) {\n        return;\n      }\n\n      var toggles = [].slice.call(document.querySelectorAll(Selector$4.DATA_TOGGLE));\n\n      for (var i = 0, len = toggles.length; i < len; i++) {\n        var parent = Dropdown._getParentFromElement(toggles[i]);\n\n        var context = $(toggles[i]).data(DATA_KEY$4);\n        var relatedTarget = {\n          relatedTarget: toggles[i]\n        };\n\n        if (event && event.type === 'click') {\n          relatedTarget.clickEvent = event;\n        }\n\n        if (!context) {\n          continue;\n        }\n\n        var dropdownMenu = context._menu;\n\n        if (!$(parent).hasClass(ClassName$4.SHOW)) {\n          continue;\n        }\n\n        if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $.contains(parent, event.target)) {\n          continue;\n        }\n\n        var hideEvent = $.Event(Event$4.HIDE, relatedTarget);\n        $(parent).trigger(hideEvent);\n\n        if (hideEvent.isDefaultPrevented()) {\n          continue;\n        } // If this is a touch-enabled device we remove the extra\n        // empty mouseover listeners we added for iOS support\n\n\n        if ('ontouchstart' in document.documentElement) {\n          $(document.body).children().off('mouseover', null, $.noop);\n        }\n\n        toggles[i].setAttribute('aria-expanded', 'false');\n        $(dropdownMenu).removeClass(ClassName$4.SHOW);\n        $(parent).removeClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));\n      }\n    };\n\n    Dropdown._getParentFromElement = function _getParentFromElement(element) {\n      var parent;\n      var selector = Util.getSelectorFromElement(element);\n\n      if (selector) {\n        parent = document.querySelector(selector);\n      }\n\n      return parent || element.parentNode;\n    } // eslint-disable-next-line complexity\n    ;\n\n    Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {\n      // If not input/textarea:\n      //  - And not a key in REGEXP_KEYDOWN => not a dropdown command\n      // If input/textarea:\n      //  - If space key => not a dropdown command\n      //  - If key is other than escape\n      //    - If key is not up or down => not a dropdown command\n      //    - If trigger inside the menu => not a dropdown command\n      if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $(event.target).closest(Selector$4.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {\n        return;\n      }\n\n      event.preventDefault();\n      event.stopPropagation();\n\n      if (this.disabled || $(this).hasClass(ClassName$4.DISABLED)) {\n        return;\n      }\n\n      var parent = Dropdown._getParentFromElement(this);\n\n      var isActive = $(parent).hasClass(ClassName$4.SHOW);\n\n      if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {\n        if (event.which === ESCAPE_KEYCODE) {\n          var toggle = parent.querySelector(Selector$4.DATA_TOGGLE);\n          $(toggle).trigger('focus');\n        }\n\n        $(this).trigger('click');\n        return;\n      }\n\n      var items = [].slice.call(parent.querySelectorAll(Selector$4.VISIBLE_ITEMS));\n\n      if (items.length === 0) {\n        return;\n      }\n\n      var index = items.indexOf(event.target);\n\n      if (event.which === ARROW_UP_KEYCODE && index > 0) {\n        // Up\n        index--;\n      }\n\n      if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {\n        // Down\n        index++;\n      }\n\n      if (index < 0) {\n        index = 0;\n      }\n\n      items[index].focus();\n    };\n\n    _createClass(Dropdown, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$4;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$2;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType$2;\n      }\n    }]);\n\n    return Dropdown;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$4.KEYDOWN_DATA_API, Selector$4.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event$4.KEYDOWN_DATA_API, Selector$4.MENU, Dropdown._dataApiKeydownHandler).on(Event$4.CLICK_DATA_API + \" \" + Event$4.KEYUP_DATA_API, Dropdown._clearMenus).on(Event$4.CLICK_DATA_API, Selector$4.DATA_TOGGLE, function (event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    Dropdown._jQueryInterface.call($(this), 'toggle');\n  }).on(Event$4.CLICK_DATA_API, Selector$4.FORM_CHILD, function (e) {\n    e.stopPropagation();\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$4] = Dropdown._jQueryInterface;\n  $.fn[NAME$4].Constructor = Dropdown;\n\n  $.fn[NAME$4].noConflict = function () {\n    $.fn[NAME$4] = JQUERY_NO_CONFLICT$4;\n    return Dropdown._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$5 = 'modal';\n  var VERSION$5 = '4.3.1';\n  var DATA_KEY$5 = 'bs.modal';\n  var EVENT_KEY$5 = \".\" + DATA_KEY$5;\n  var DATA_API_KEY$5 = '.data-api';\n  var JQUERY_NO_CONFLICT$5 = $.fn[NAME$5];\n  var ESCAPE_KEYCODE$1 = 27; // KeyboardEvent.which value for Escape (Esc) key\n\n  var Default$3 = {\n    backdrop: true,\n    keyboard: true,\n    focus: true,\n    show: true\n  };\n  var DefaultType$3 = {\n    backdrop: '(boolean|string)',\n    keyboard: 'boolean',\n    focus: 'boolean',\n    show: 'boolean'\n  };\n  var Event$5 = {\n    HIDE: \"hide\" + EVENT_KEY$5,\n    HIDDEN: \"hidden\" + EVENT_KEY$5,\n    SHOW: \"show\" + EVENT_KEY$5,\n    SHOWN: \"shown\" + EVENT_KEY$5,\n    FOCUSIN: \"focusin\" + EVENT_KEY$5,\n    RESIZE: \"resize\" + EVENT_KEY$5,\n    CLICK_DISMISS: \"click.dismiss\" + EVENT_KEY$5,\n    KEYDOWN_DISMISS: \"keydown.dismiss\" + EVENT_KEY$5,\n    MOUSEUP_DISMISS: \"mouseup.dismiss\" + EVENT_KEY$5,\n    MOUSEDOWN_DISMISS: \"mousedown.dismiss\" + EVENT_KEY$5,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$5 + DATA_API_KEY$5\n  };\n  var ClassName$5 = {\n    SCROLLABLE: 'modal-dialog-scrollable',\n    SCROLLBAR_MEASURER: 'modal-scrollbar-measure',\n    BACKDROP: 'modal-backdrop',\n    OPEN: 'modal-open',\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector$5 = {\n    DIALOG: '.modal-dialog',\n    MODAL_BODY: '.modal-body',\n    DATA_TOGGLE: '[data-toggle=\"modal\"]',\n    DATA_DISMISS: '[data-dismiss=\"modal\"]',\n    FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',\n    STICKY_CONTENT: '.sticky-top'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Modal =\n  /*#__PURE__*/\n  function () {\n    function Modal(element, config) {\n      this._config = this._getConfig(config);\n      this._element = element;\n      this._dialog = element.querySelector(Selector$5.DIALOG);\n      this._backdrop = null;\n      this._isShown = false;\n      this._isBodyOverflowing = false;\n      this._ignoreBackdropClick = false;\n      this._isTransitioning = false;\n      this._scrollbarWidth = 0;\n    } // Getters\n\n\n    var _proto = Modal.prototype;\n\n    // Public\n    _proto.toggle = function toggle(relatedTarget) {\n      return this._isShown ? this.hide() : this.show(relatedTarget);\n    };\n\n    _proto.show = function show(relatedTarget) {\n      var _this = this;\n\n      if (this._isShown || this._isTransitioning) {\n        return;\n      }\n\n      if ($(this._element).hasClass(ClassName$5.FADE)) {\n        this._isTransitioning = true;\n      }\n\n      var showEvent = $.Event(Event$5.SHOW, {\n        relatedTarget: relatedTarget\n      });\n      $(this._element).trigger(showEvent);\n\n      if (this._isShown || showEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      this._isShown = true;\n\n      this._checkScrollbar();\n\n      this._setScrollbar();\n\n      this._adjustDialog();\n\n      this._setEscapeEvent();\n\n      this._setResizeEvent();\n\n      $(this._element).on(Event$5.CLICK_DISMISS, Selector$5.DATA_DISMISS, function (event) {\n        return _this.hide(event);\n      });\n      $(this._dialog).on(Event$5.MOUSEDOWN_DISMISS, function () {\n        $(_this._element).one(Event$5.MOUSEUP_DISMISS, function (event) {\n          if ($(event.target).is(_this._element)) {\n            _this._ignoreBackdropClick = true;\n          }\n        });\n      });\n\n      this._showBackdrop(function () {\n        return _this._showElement(relatedTarget);\n      });\n    };\n\n    _proto.hide = function hide(event) {\n      var _this2 = this;\n\n      if (event) {\n        event.preventDefault();\n      }\n\n      if (!this._isShown || this._isTransitioning) {\n        return;\n      }\n\n      var hideEvent = $.Event(Event$5.HIDE);\n      $(this._element).trigger(hideEvent);\n\n      if (!this._isShown || hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      this._isShown = false;\n      var transition = $(this._element).hasClass(ClassName$5.FADE);\n\n      if (transition) {\n        this._isTransitioning = true;\n      }\n\n      this._setEscapeEvent();\n\n      this._setResizeEvent();\n\n      $(document).off(Event$5.FOCUSIN);\n      $(this._element).removeClass(ClassName$5.SHOW);\n      $(this._element).off(Event$5.CLICK_DISMISS);\n      $(this._dialog).off(Event$5.MOUSEDOWN_DISMISS);\n\n      if (transition) {\n        var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n        $(this._element).one(Util.TRANSITION_END, function (event) {\n          return _this2._hideModal(event);\n        }).emulateTransitionEnd(transitionDuration);\n      } else {\n        this._hideModal();\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      [window, this._element, this._dialog].forEach(function (htmlElement) {\n        return $(htmlElement).off(EVENT_KEY$5);\n      });\n      /**\n       * `document` has 2 events `Event.FOCUSIN` and `Event.CLICK_DATA_API`\n       * Do not move `document` in `htmlElements` array\n       * It will remove `Event.CLICK_DATA_API` event that should remain\n       */\n\n      $(document).off(Event$5.FOCUSIN);\n      $.removeData(this._element, DATA_KEY$5);\n      this._config = null;\n      this._element = null;\n      this._dialog = null;\n      this._backdrop = null;\n      this._isShown = null;\n      this._isBodyOverflowing = null;\n      this._ignoreBackdropClick = null;\n      this._isTransitioning = null;\n      this._scrollbarWidth = null;\n    };\n\n    _proto.handleUpdate = function handleUpdate() {\n      this._adjustDialog();\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default$3, config);\n      Util.typeCheckConfig(NAME$5, config, DefaultType$3);\n      return config;\n    };\n\n    _proto._showElement = function _showElement(relatedTarget) {\n      var _this3 = this;\n\n      var transition = $(this._element).hasClass(ClassName$5.FADE);\n\n      if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n        // Don't move modal's DOM position\n        document.body.appendChild(this._element);\n      }\n\n      this._element.style.display = 'block';\n\n      this._element.removeAttribute('aria-hidden');\n\n      this._element.setAttribute('aria-modal', true);\n\n      if ($(this._dialog).hasClass(ClassName$5.SCROLLABLE)) {\n        this._dialog.querySelector(Selector$5.MODAL_BODY).scrollTop = 0;\n      } else {\n        this._element.scrollTop = 0;\n      }\n\n      if (transition) {\n        Util.reflow(this._element);\n      }\n\n      $(this._element).addClass(ClassName$5.SHOW);\n\n      if (this._config.focus) {\n        this._enforceFocus();\n      }\n\n      var shownEvent = $.Event(Event$5.SHOWN, {\n        relatedTarget: relatedTarget\n      });\n\n      var transitionComplete = function transitionComplete() {\n        if (_this3._config.focus) {\n          _this3._element.focus();\n        }\n\n        _this3._isTransitioning = false;\n        $(_this3._element).trigger(shownEvent);\n      };\n\n      if (transition) {\n        var transitionDuration = Util.getTransitionDurationFromElement(this._dialog);\n        $(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(transitionDuration);\n      } else {\n        transitionComplete();\n      }\n    };\n\n    _proto._enforceFocus = function _enforceFocus() {\n      var _this4 = this;\n\n      $(document).off(Event$5.FOCUSIN) // Guard against infinite focus loop\n      .on(Event$5.FOCUSIN, function (event) {\n        if (document !== event.target && _this4._element !== event.target && $(_this4._element).has(event.target).length === 0) {\n          _this4._element.focus();\n        }\n      });\n    };\n\n    _proto._setEscapeEvent = function _setEscapeEvent() {\n      var _this5 = this;\n\n      if (this._isShown && this._config.keyboard) {\n        $(this._element).on(Event$5.KEYDOWN_DISMISS, function (event) {\n          if (event.which === ESCAPE_KEYCODE$1) {\n            event.preventDefault();\n\n            _this5.hide();\n          }\n        });\n      } else if (!this._isShown) {\n        $(this._element).off(Event$5.KEYDOWN_DISMISS);\n      }\n    };\n\n    _proto._setResizeEvent = function _setResizeEvent() {\n      var _this6 = this;\n\n      if (this._isShown) {\n        $(window).on(Event$5.RESIZE, function (event) {\n          return _this6.handleUpdate(event);\n        });\n      } else {\n        $(window).off(Event$5.RESIZE);\n      }\n    };\n\n    _proto._hideModal = function _hideModal() {\n      var _this7 = this;\n\n      this._element.style.display = 'none';\n\n      this._element.setAttribute('aria-hidden', true);\n\n      this._element.removeAttribute('aria-modal');\n\n      this._isTransitioning = false;\n\n      this._showBackdrop(function () {\n        $(document.body).removeClass(ClassName$5.OPEN);\n\n        _this7._resetAdjustments();\n\n        _this7._resetScrollbar();\n\n        $(_this7._element).trigger(Event$5.HIDDEN);\n      });\n    };\n\n    _proto._removeBackdrop = function _removeBackdrop() {\n      if (this._backdrop) {\n        $(this._backdrop).remove();\n        this._backdrop = null;\n      }\n    };\n\n    _proto._showBackdrop = function _showBackdrop(callback) {\n      var _this8 = this;\n\n      var animate = $(this._element).hasClass(ClassName$5.FADE) ? ClassName$5.FADE : '';\n\n      if (this._isShown && this._config.backdrop) {\n        this._backdrop = document.createElement('div');\n        this._backdrop.className = ClassName$5.BACKDROP;\n\n        if (animate) {\n          this._backdrop.classList.add(animate);\n        }\n\n        $(this._backdrop).appendTo(document.body);\n        $(this._element).on(Event$5.CLICK_DISMISS, function (event) {\n          if (_this8._ignoreBackdropClick) {\n            _this8._ignoreBackdropClick = false;\n            return;\n          }\n\n          if (event.target !== event.currentTarget) {\n            return;\n          }\n\n          if (_this8._config.backdrop === 'static') {\n            _this8._element.focus();\n          } else {\n            _this8.hide();\n          }\n        });\n\n        if (animate) {\n          Util.reflow(this._backdrop);\n        }\n\n        $(this._backdrop).addClass(ClassName$5.SHOW);\n\n        if (!callback) {\n          return;\n        }\n\n        if (!animate) {\n          callback();\n          return;\n        }\n\n        var backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);\n        $(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(backdropTransitionDuration);\n      } else if (!this._isShown && this._backdrop) {\n        $(this._backdrop).removeClass(ClassName$5.SHOW);\n\n        var callbackRemove = function callbackRemove() {\n          _this8._removeBackdrop();\n\n          if (callback) {\n            callback();\n          }\n        };\n\n        if ($(this._element).hasClass(ClassName$5.FADE)) {\n          var _backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);\n\n          $(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(_backdropTransitionDuration);\n        } else {\n          callbackRemove();\n        }\n      } else if (callback) {\n        callback();\n      }\n    } // ----------------------------------------------------------------------\n    // the following methods are used to handle overflowing modals\n    // todo (fat): these should probably be refactored out of modal.js\n    // ----------------------------------------------------------------------\n    ;\n\n    _proto._adjustDialog = function _adjustDialog() {\n      var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n\n      if (!this._isBodyOverflowing && isModalOverflowing) {\n        this._element.style.paddingLeft = this._scrollbarWidth + \"px\";\n      }\n\n      if (this._isBodyOverflowing && !isModalOverflowing) {\n        this._element.style.paddingRight = this._scrollbarWidth + \"px\";\n      }\n    };\n\n    _proto._resetAdjustments = function _resetAdjustments() {\n      this._element.style.paddingLeft = '';\n      this._element.style.paddingRight = '';\n    };\n\n    _proto._checkScrollbar = function _checkScrollbar() {\n      var rect = document.body.getBoundingClientRect();\n      this._isBodyOverflowing = rect.left + rect.right < window.innerWidth;\n      this._scrollbarWidth = this._getScrollbarWidth();\n    };\n\n    _proto._setScrollbar = function _setScrollbar() {\n      var _this9 = this;\n\n      if (this._isBodyOverflowing) {\n        // Note: DOMNode.style.paddingRight returns the actual value or '' if not set\n        //   while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set\n        var fixedContent = [].slice.call(document.querySelectorAll(Selector$5.FIXED_CONTENT));\n        var stickyContent = [].slice.call(document.querySelectorAll(Selector$5.STICKY_CONTENT)); // Adjust fixed content padding\n\n        $(fixedContent).each(function (index, element) {\n          var actualPadding = element.style.paddingRight;\n          var calculatedPadding = $(element).css('padding-right');\n          $(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this9._scrollbarWidth + \"px\");\n        }); // Adjust sticky content margin\n\n        $(stickyContent).each(function (index, element) {\n          var actualMargin = element.style.marginRight;\n          var calculatedMargin = $(element).css('margin-right');\n          $(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this9._scrollbarWidth + \"px\");\n        }); // Adjust body padding\n\n        var actualPadding = document.body.style.paddingRight;\n        var calculatedPadding = $(document.body).css('padding-right');\n        $(document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + \"px\");\n      }\n\n      $(document.body).addClass(ClassName$5.OPEN);\n    };\n\n    _proto._resetScrollbar = function _resetScrollbar() {\n      // Restore fixed content padding\n      var fixedContent = [].slice.call(document.querySelectorAll(Selector$5.FIXED_CONTENT));\n      $(fixedContent).each(function (index, element) {\n        var padding = $(element).data('padding-right');\n        $(element).removeData('padding-right');\n        element.style.paddingRight = padding ? padding : '';\n      }); // Restore sticky content\n\n      var elements = [].slice.call(document.querySelectorAll(\"\" + Selector$5.STICKY_CONTENT));\n      $(elements).each(function (index, element) {\n        var margin = $(element).data('margin-right');\n\n        if (typeof margin !== 'undefined') {\n          $(element).css('margin-right', margin).removeData('margin-right');\n        }\n      }); // Restore body padding\n\n      var padding = $(document.body).data('padding-right');\n      $(document.body).removeData('padding-right');\n      document.body.style.paddingRight = padding ? padding : '';\n    };\n\n    _proto._getScrollbarWidth = function _getScrollbarWidth() {\n      // thx d.walsh\n      var scrollDiv = document.createElement('div');\n      scrollDiv.className = ClassName$5.SCROLLBAR_MEASURER;\n      document.body.appendChild(scrollDiv);\n      var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;\n      document.body.removeChild(scrollDiv);\n      return scrollbarWidth;\n    } // Static\n    ;\n\n    Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$5);\n\n        var _config = _objectSpread({}, Default$3, $(this).data(), typeof config === 'object' && config ? config : {});\n\n        if (!data) {\n          data = new Modal(this, _config);\n          $(this).data(DATA_KEY$5, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config](relatedTarget);\n        } else if (_config.show) {\n          data.show(relatedTarget);\n        }\n      });\n    };\n\n    _createClass(Modal, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$5;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$3;\n      }\n    }]);\n\n    return Modal;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$5.CLICK_DATA_API, Selector$5.DATA_TOGGLE, function (event) {\n    var _this10 = this;\n\n    var target;\n    var selector = Util.getSelectorFromElement(this);\n\n    if (selector) {\n      target = document.querySelector(selector);\n    }\n\n    var config = $(target).data(DATA_KEY$5) ? 'toggle' : _objectSpread({}, $(target).data(), $(this).data());\n\n    if (this.tagName === 'A' || this.tagName === 'AREA') {\n      event.preventDefault();\n    }\n\n    var $target = $(target).one(Event$5.SHOW, function (showEvent) {\n      if (showEvent.isDefaultPrevented()) {\n        // Only register focus restorer if modal will actually get shown\n        return;\n      }\n\n      $target.one(Event$5.HIDDEN, function () {\n        if ($(_this10).is(':visible')) {\n          _this10.focus();\n        }\n      });\n    });\n\n    Modal._jQueryInterface.call($(target), config, this);\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$5] = Modal._jQueryInterface;\n  $.fn[NAME$5].Constructor = Modal;\n\n  $.fn[NAME$5].noConflict = function () {\n    $.fn[NAME$5] = JQUERY_NO_CONFLICT$5;\n    return Modal._jQueryInterface;\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.3.1): tools/sanitizer.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  var uriAttrs = ['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href'];\n  var ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i;\n  var DefaultWhitelist = {\n    // Global attributes allowed on any supplied element below.\n    '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n    a: ['target', 'href', 'title', 'rel'],\n    area: [],\n    b: [],\n    br: [],\n    col: [],\n    code: [],\n    div: [],\n    em: [],\n    hr: [],\n    h1: [],\n    h2: [],\n    h3: [],\n    h4: [],\n    h5: [],\n    h6: [],\n    i: [],\n    img: ['src', 'alt', 'title', 'width', 'height'],\n    li: [],\n    ol: [],\n    p: [],\n    pre: [],\n    s: [],\n    small: [],\n    span: [],\n    sub: [],\n    sup: [],\n    strong: [],\n    u: [],\n    ul: []\n    /**\n     * A pattern that recognizes a commonly useful subset of URLs that are safe.\n     *\n     * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n     */\n\n  };\n  var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi;\n  /**\n   * A pattern that matches safe data URLs. Only matches image, video and audio types.\n   *\n   * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n   */\n\n  var DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i;\n\n  function allowedAttribute(attr, allowedAttributeList) {\n    var attrName = attr.nodeName.toLowerCase();\n\n    if (allowedAttributeList.indexOf(attrName) !== -1) {\n      if (uriAttrs.indexOf(attrName) !== -1) {\n        return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN));\n      }\n\n      return true;\n    }\n\n    var regExp = allowedAttributeList.filter(function (attrRegex) {\n      return attrRegex instanceof RegExp;\n    }); // Check if a regular expression validates the attribute.\n\n    for (var i = 0, l = regExp.length; i < l; i++) {\n      if (attrName.match(regExp[i])) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {\n    if (unsafeHtml.length === 0) {\n      return unsafeHtml;\n    }\n\n    if (sanitizeFn && typeof sanitizeFn === 'function') {\n      return sanitizeFn(unsafeHtml);\n    }\n\n    var domParser = new window.DOMParser();\n    var createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');\n    var whitelistKeys = Object.keys(whiteList);\n    var elements = [].slice.call(createdDocument.body.querySelectorAll('*'));\n\n    var _loop = function _loop(i, len) {\n      var el = elements[i];\n      var elName = el.nodeName.toLowerCase();\n\n      if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) {\n        el.parentNode.removeChild(el);\n        return \"continue\";\n      }\n\n      var attributeList = [].slice.call(el.attributes);\n      var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || []);\n      attributeList.forEach(function (attr) {\n        if (!allowedAttribute(attr, whitelistedAttributes)) {\n          el.removeAttribute(attr.nodeName);\n        }\n      });\n    };\n\n    for (var i = 0, len = elements.length; i < len; i++) {\n      var _ret = _loop(i, len);\n\n      if (_ret === \"continue\") continue;\n    }\n\n    return createdDocument.body.innerHTML;\n  }\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$6 = 'tooltip';\n  var VERSION$6 = '4.3.1';\n  var DATA_KEY$6 = 'bs.tooltip';\n  var EVENT_KEY$6 = \".\" + DATA_KEY$6;\n  var JQUERY_NO_CONFLICT$6 = $.fn[NAME$6];\n  var CLASS_PREFIX = 'bs-tooltip';\n  var BSCLS_PREFIX_REGEX = new RegExp(\"(^|\\\\s)\" + CLASS_PREFIX + \"\\\\S+\", 'g');\n  var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn'];\n  var DefaultType$4 = {\n    animation: 'boolean',\n    template: 'string',\n    title: '(string|element|function)',\n    trigger: 'string',\n    delay: '(number|object)',\n    html: 'boolean',\n    selector: '(string|boolean)',\n    placement: '(string|function)',\n    offset: '(number|string|function)',\n    container: '(string|element|boolean)',\n    fallbackPlacement: '(string|array)',\n    boundary: '(string|element)',\n    sanitize: 'boolean',\n    sanitizeFn: '(null|function)',\n    whiteList: 'object'\n  };\n  var AttachmentMap$1 = {\n    AUTO: 'auto',\n    TOP: 'top',\n    RIGHT: 'right',\n    BOTTOM: 'bottom',\n    LEFT: 'left'\n  };\n  var Default$4 = {\n    animation: true,\n    template: '<div class=\"tooltip\" role=\"tooltip\">' + '<div class=\"arrow\"></div>' + '<div class=\"tooltip-inner\"></div></div>',\n    trigger: 'hover focus',\n    title: '',\n    delay: 0,\n    html: false,\n    selector: false,\n    placement: 'top',\n    offset: 0,\n    container: false,\n    fallbackPlacement: 'flip',\n    boundary: 'scrollParent',\n    sanitize: true,\n    sanitizeFn: null,\n    whiteList: DefaultWhitelist\n  };\n  var HoverState = {\n    SHOW: 'show',\n    OUT: 'out'\n  };\n  var Event$6 = {\n    HIDE: \"hide\" + EVENT_KEY$6,\n    HIDDEN: \"hidden\" + EVENT_KEY$6,\n    SHOW: \"show\" + EVENT_KEY$6,\n    SHOWN: \"shown\" + EVENT_KEY$6,\n    INSERTED: \"inserted\" + EVENT_KEY$6,\n    CLICK: \"click\" + EVENT_KEY$6,\n    FOCUSIN: \"focusin\" + EVENT_KEY$6,\n    FOCUSOUT: \"focusout\" + EVENT_KEY$6,\n    MOUSEENTER: \"mouseenter\" + EVENT_KEY$6,\n    MOUSELEAVE: \"mouseleave\" + EVENT_KEY$6\n  };\n  var ClassName$6 = {\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector$6 = {\n    TOOLTIP: '.tooltip',\n    TOOLTIP_INNER: '.tooltip-inner',\n    ARROW: '.arrow'\n  };\n  var Trigger = {\n    HOVER: 'hover',\n    FOCUS: 'focus',\n    CLICK: 'click',\n    MANUAL: 'manual'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Tooltip =\n  /*#__PURE__*/\n  function () {\n    function Tooltip(element, config) {\n      /**\n       * Check for Popper dependency\n       * Popper - https://popper.js.org\n       */\n      if (typeof Popper === 'undefined') {\n        throw new TypeError('Bootstrap\\'s tooltips require Popper.js (https://popper.js.org/)');\n      } // private\n\n\n      this._isEnabled = true;\n      this._timeout = 0;\n      this._hoverState = '';\n      this._activeTrigger = {};\n      this._popper = null; // Protected\n\n      this.element = element;\n      this.config = this._getConfig(config);\n      this.tip = null;\n\n      this._setListeners();\n    } // Getters\n\n\n    var _proto = Tooltip.prototype;\n\n    // Public\n    _proto.enable = function enable() {\n      this._isEnabled = true;\n    };\n\n    _proto.disable = function disable() {\n      this._isEnabled = false;\n    };\n\n    _proto.toggleEnabled = function toggleEnabled() {\n      this._isEnabled = !this._isEnabled;\n    };\n\n    _proto.toggle = function toggle(event) {\n      if (!this._isEnabled) {\n        return;\n      }\n\n      if (event) {\n        var dataKey = this.constructor.DATA_KEY;\n        var context = $(event.currentTarget).data(dataKey);\n\n        if (!context) {\n          context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n          $(event.currentTarget).data(dataKey, context);\n        }\n\n        context._activeTrigger.click = !context._activeTrigger.click;\n\n        if (context._isWithActiveTrigger()) {\n          context._enter(null, context);\n        } else {\n          context._leave(null, context);\n        }\n      } else {\n        if ($(this.getTipElement()).hasClass(ClassName$6.SHOW)) {\n          this._leave(null, this);\n\n          return;\n        }\n\n        this._enter(null, this);\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      clearTimeout(this._timeout);\n      $.removeData(this.element, this.constructor.DATA_KEY);\n      $(this.element).off(this.constructor.EVENT_KEY);\n      $(this.element).closest('.modal').off('hide.bs.modal');\n\n      if (this.tip) {\n        $(this.tip).remove();\n      }\n\n      this._isEnabled = null;\n      this._timeout = null;\n      this._hoverState = null;\n      this._activeTrigger = null;\n\n      if (this._popper !== null) {\n        this._popper.destroy();\n      }\n\n      this._popper = null;\n      this.element = null;\n      this.config = null;\n      this.tip = null;\n    };\n\n    _proto.show = function show() {\n      var _this = this;\n\n      if ($(this.element).css('display') === 'none') {\n        throw new Error('Please use show on visible elements');\n      }\n\n      var showEvent = $.Event(this.constructor.Event.SHOW);\n\n      if (this.isWithContent() && this._isEnabled) {\n        $(this.element).trigger(showEvent);\n        var shadowRoot = Util.findShadowRoot(this.element);\n        var isInTheDom = $.contains(shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement, this.element);\n\n        if (showEvent.isDefaultPrevented() || !isInTheDom) {\n          return;\n        }\n\n        var tip = this.getTipElement();\n        var tipId = Util.getUID(this.constructor.NAME);\n        tip.setAttribute('id', tipId);\n        this.element.setAttribute('aria-describedby', tipId);\n        this.setContent();\n\n        if (this.config.animation) {\n          $(tip).addClass(ClassName$6.FADE);\n        }\n\n        var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement;\n\n        var attachment = this._getAttachment(placement);\n\n        this.addAttachmentClass(attachment);\n\n        var container = this._getContainer();\n\n        $(tip).data(this.constructor.DATA_KEY, this);\n\n        if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) {\n          $(tip).appendTo(container);\n        }\n\n        $(this.element).trigger(this.constructor.Event.INSERTED);\n        this._popper = new Popper(this.element, tip, {\n          placement: attachment,\n          modifiers: {\n            offset: this._getOffset(),\n            flip: {\n              behavior: this.config.fallbackPlacement\n            },\n            arrow: {\n              element: Selector$6.ARROW\n            },\n            preventOverflow: {\n              boundariesElement: this.config.boundary\n            }\n          },\n          onCreate: function onCreate(data) {\n            if (data.originalPlacement !== data.placement) {\n              _this._handlePopperPlacementChange(data);\n            }\n          },\n          onUpdate: function onUpdate(data) {\n            return _this._handlePopperPlacementChange(data);\n          }\n        });\n        $(tip).addClass(ClassName$6.SHOW); // If this is a touch-enabled device we add extra\n        // empty mouseover listeners to the body's immediate children;\n        // only needed because of broken event delegation on iOS\n        // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n        if ('ontouchstart' in document.documentElement) {\n          $(document.body).children().on('mouseover', null, $.noop);\n        }\n\n        var complete = function complete() {\n          if (_this.config.animation) {\n            _this._fixTransition();\n          }\n\n          var prevHoverState = _this._hoverState;\n          _this._hoverState = null;\n          $(_this.element).trigger(_this.constructor.Event.SHOWN);\n\n          if (prevHoverState === HoverState.OUT) {\n            _this._leave(null, _this);\n          }\n        };\n\n        if ($(this.tip).hasClass(ClassName$6.FADE)) {\n          var transitionDuration = Util.getTransitionDurationFromElement(this.tip);\n          $(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n        } else {\n          complete();\n        }\n      }\n    };\n\n    _proto.hide = function hide(callback) {\n      var _this2 = this;\n\n      var tip = this.getTipElement();\n      var hideEvent = $.Event(this.constructor.Event.HIDE);\n\n      var complete = function complete() {\n        if (_this2._hoverState !== HoverState.SHOW && tip.parentNode) {\n          tip.parentNode.removeChild(tip);\n        }\n\n        _this2._cleanTipClass();\n\n        _this2.element.removeAttribute('aria-describedby');\n\n        $(_this2.element).trigger(_this2.constructor.Event.HIDDEN);\n\n        if (_this2._popper !== null) {\n          _this2._popper.destroy();\n        }\n\n        if (callback) {\n          callback();\n        }\n      };\n\n      $(this.element).trigger(hideEvent);\n\n      if (hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      $(tip).removeClass(ClassName$6.SHOW); // If this is a touch-enabled device we remove the extra\n      // empty mouseover listeners we added for iOS support\n\n      if ('ontouchstart' in document.documentElement) {\n        $(document.body).children().off('mouseover', null, $.noop);\n      }\n\n      this._activeTrigger[Trigger.CLICK] = false;\n      this._activeTrigger[Trigger.FOCUS] = false;\n      this._activeTrigger[Trigger.HOVER] = false;\n\n      if ($(this.tip).hasClass(ClassName$6.FADE)) {\n        var transitionDuration = Util.getTransitionDurationFromElement(tip);\n        $(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      } else {\n        complete();\n      }\n\n      this._hoverState = '';\n    };\n\n    _proto.update = function update() {\n      if (this._popper !== null) {\n        this._popper.scheduleUpdate();\n      }\n    } // Protected\n    ;\n\n    _proto.isWithContent = function isWithContent() {\n      return Boolean(this.getTitle());\n    };\n\n    _proto.addAttachmentClass = function addAttachmentClass(attachment) {\n      $(this.getTipElement()).addClass(CLASS_PREFIX + \"-\" + attachment);\n    };\n\n    _proto.getTipElement = function getTipElement() {\n      this.tip = this.tip || $(this.config.template)[0];\n      return this.tip;\n    };\n\n    _proto.setContent = function setContent() {\n      var tip = this.getTipElement();\n      this.setElementContent($(tip.querySelectorAll(Selector$6.TOOLTIP_INNER)), this.getTitle());\n      $(tip).removeClass(ClassName$6.FADE + \" \" + ClassName$6.SHOW);\n    };\n\n    _proto.setElementContent = function setElementContent($element, content) {\n      if (typeof content === 'object' && (content.nodeType || content.jquery)) {\n        // Content is a DOM node or a jQuery\n        if (this.config.html) {\n          if (!$(content).parent().is($element)) {\n            $element.empty().append(content);\n          }\n        } else {\n          $element.text($(content).text());\n        }\n\n        return;\n      }\n\n      if (this.config.html) {\n        if (this.config.sanitize) {\n          content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn);\n        }\n\n        $element.html(content);\n      } else {\n        $element.text(content);\n      }\n    };\n\n    _proto.getTitle = function getTitle() {\n      var title = this.element.getAttribute('data-original-title');\n\n      if (!title) {\n        title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title;\n      }\n\n      return title;\n    } // Private\n    ;\n\n    _proto._getOffset = function _getOffset() {\n      var _this3 = this;\n\n      var offset = {};\n\n      if (typeof this.config.offset === 'function') {\n        offset.fn = function (data) {\n          data.offsets = _objectSpread({}, data.offsets, _this3.config.offset(data.offsets, _this3.element) || {});\n          return data;\n        };\n      } else {\n        offset.offset = this.config.offset;\n      }\n\n      return offset;\n    };\n\n    _proto._getContainer = function _getContainer() {\n      if (this.config.container === false) {\n        return document.body;\n      }\n\n      if (Util.isElement(this.config.container)) {\n        return $(this.config.container);\n      }\n\n      return $(document).find(this.config.container);\n    };\n\n    _proto._getAttachment = function _getAttachment(placement) {\n      return AttachmentMap$1[placement.toUpperCase()];\n    };\n\n    _proto._setListeners = function _setListeners() {\n      var _this4 = this;\n\n      var triggers = this.config.trigger.split(' ');\n      triggers.forEach(function (trigger) {\n        if (trigger === 'click') {\n          $(_this4.element).on(_this4.constructor.Event.CLICK, _this4.config.selector, function (event) {\n            return _this4.toggle(event);\n          });\n        } else if (trigger !== Trigger.MANUAL) {\n          var eventIn = trigger === Trigger.HOVER ? _this4.constructor.Event.MOUSEENTER : _this4.constructor.Event.FOCUSIN;\n          var eventOut = trigger === Trigger.HOVER ? _this4.constructor.Event.MOUSELEAVE : _this4.constructor.Event.FOCUSOUT;\n          $(_this4.element).on(eventIn, _this4.config.selector, function (event) {\n            return _this4._enter(event);\n          }).on(eventOut, _this4.config.selector, function (event) {\n            return _this4._leave(event);\n          });\n        }\n      });\n      $(this.element).closest('.modal').on('hide.bs.modal', function () {\n        if (_this4.element) {\n          _this4.hide();\n        }\n      });\n\n      if (this.config.selector) {\n        this.config = _objectSpread({}, this.config, {\n          trigger: 'manual',\n          selector: ''\n        });\n      } else {\n        this._fixTitle();\n      }\n    };\n\n    _proto._fixTitle = function _fixTitle() {\n      var titleType = typeof this.element.getAttribute('data-original-title');\n\n      if (this.element.getAttribute('title') || titleType !== 'string') {\n        this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');\n        this.element.setAttribute('title', '');\n      }\n    };\n\n    _proto._enter = function _enter(event, context) {\n      var dataKey = this.constructor.DATA_KEY;\n      context = context || $(event.currentTarget).data(dataKey);\n\n      if (!context) {\n        context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n        $(event.currentTarget).data(dataKey, context);\n      }\n\n      if (event) {\n        context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true;\n      }\n\n      if ($(context.getTipElement()).hasClass(ClassName$6.SHOW) || context._hoverState === HoverState.SHOW) {\n        context._hoverState = HoverState.SHOW;\n        return;\n      }\n\n      clearTimeout(context._timeout);\n      context._hoverState = HoverState.SHOW;\n\n      if (!context.config.delay || !context.config.delay.show) {\n        context.show();\n        return;\n      }\n\n      context._timeout = setTimeout(function () {\n        if (context._hoverState === HoverState.SHOW) {\n          context.show();\n        }\n      }, context.config.delay.show);\n    };\n\n    _proto._leave = function _leave(event, context) {\n      var dataKey = this.constructor.DATA_KEY;\n      context = context || $(event.currentTarget).data(dataKey);\n\n      if (!context) {\n        context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n        $(event.currentTarget).data(dataKey, context);\n      }\n\n      if (event) {\n        context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false;\n      }\n\n      if (context._isWithActiveTrigger()) {\n        return;\n      }\n\n      clearTimeout(context._timeout);\n      context._hoverState = HoverState.OUT;\n\n      if (!context.config.delay || !context.config.delay.hide) {\n        context.hide();\n        return;\n      }\n\n      context._timeout = setTimeout(function () {\n        if (context._hoverState === HoverState.OUT) {\n          context.hide();\n        }\n      }, context.config.delay.hide);\n    };\n\n    _proto._isWithActiveTrigger = function _isWithActiveTrigger() {\n      for (var trigger in this._activeTrigger) {\n        if (this._activeTrigger[trigger]) {\n          return true;\n        }\n      }\n\n      return false;\n    };\n\n    _proto._getConfig = function _getConfig(config) {\n      var dataAttributes = $(this.element).data();\n      Object.keys(dataAttributes).forEach(function (dataAttr) {\n        if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {\n          delete dataAttributes[dataAttr];\n        }\n      });\n      config = _objectSpread({}, this.constructor.Default, dataAttributes, typeof config === 'object' && config ? config : {});\n\n      if (typeof config.delay === 'number') {\n        config.delay = {\n          show: config.delay,\n          hide: config.delay\n        };\n      }\n\n      if (typeof config.title === 'number') {\n        config.title = config.title.toString();\n      }\n\n      if (typeof config.content === 'number') {\n        config.content = config.content.toString();\n      }\n\n      Util.typeCheckConfig(NAME$6, config, this.constructor.DefaultType);\n\n      if (config.sanitize) {\n        config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn);\n      }\n\n      return config;\n    };\n\n    _proto._getDelegateConfig = function _getDelegateConfig() {\n      var config = {};\n\n      if (this.config) {\n        for (var key in this.config) {\n          if (this.constructor.Default[key] !== this.config[key]) {\n            config[key] = this.config[key];\n          }\n        }\n      }\n\n      return config;\n    };\n\n    _proto._cleanTipClass = function _cleanTipClass() {\n      var $tip = $(this.getTipElement());\n      var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);\n\n      if (tabClass !== null && tabClass.length) {\n        $tip.removeClass(tabClass.join(''));\n      }\n    };\n\n    _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(popperData) {\n      var popperInstance = popperData.instance;\n      this.tip = popperInstance.popper;\n\n      this._cleanTipClass();\n\n      this.addAttachmentClass(this._getAttachment(popperData.placement));\n    };\n\n    _proto._fixTransition = function _fixTransition() {\n      var tip = this.getTipElement();\n      var initConfigAnimation = this.config.animation;\n\n      if (tip.getAttribute('x-placement') !== null) {\n        return;\n      }\n\n      $(tip).removeClass(ClassName$6.FADE);\n      this.config.animation = false;\n      this.hide();\n      this.show();\n      this.config.animation = initConfigAnimation;\n    } // Static\n    ;\n\n    Tooltip._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$6);\n\n        var _config = typeof config === 'object' && config;\n\n        if (!data && /dispose|hide/.test(config)) {\n          return;\n        }\n\n        if (!data) {\n          data = new Tooltip(this, _config);\n          $(this).data(DATA_KEY$6, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Tooltip, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$6;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$4;\n      }\n    }, {\n      key: \"NAME\",\n      get: function get() {\n        return NAME$6;\n      }\n    }, {\n      key: \"DATA_KEY\",\n      get: function get() {\n        return DATA_KEY$6;\n      }\n    }, {\n      key: \"Event\",\n      get: function get() {\n        return Event$6;\n      }\n    }, {\n      key: \"EVENT_KEY\",\n      get: function get() {\n        return EVENT_KEY$6;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType$4;\n      }\n    }]);\n\n    return Tooltip;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n\n  $.fn[NAME$6] = Tooltip._jQueryInterface;\n  $.fn[NAME$6].Constructor = Tooltip;\n\n  $.fn[NAME$6].noConflict = function () {\n    $.fn[NAME$6] = JQUERY_NO_CONFLICT$6;\n    return Tooltip._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$7 = 'popover';\n  var VERSION$7 = '4.3.1';\n  var DATA_KEY$7 = 'bs.popover';\n  var EVENT_KEY$7 = \".\" + DATA_KEY$7;\n  var JQUERY_NO_CONFLICT$7 = $.fn[NAME$7];\n  var CLASS_PREFIX$1 = 'bs-popover';\n  var BSCLS_PREFIX_REGEX$1 = new RegExp(\"(^|\\\\s)\" + CLASS_PREFIX$1 + \"\\\\S+\", 'g');\n\n  var Default$5 = _objectSpread({}, Tooltip.Default, {\n    placement: 'right',\n    trigger: 'click',\n    content: '',\n    template: '<div class=\"popover\" role=\"tooltip\">' + '<div class=\"arrow\"></div>' + '<h3 class=\"popover-header\"></h3>' + '<div class=\"popover-body\"></div></div>'\n  });\n\n  var DefaultType$5 = _objectSpread({}, Tooltip.DefaultType, {\n    content: '(string|element|function)'\n  });\n\n  var ClassName$7 = {\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector$7 = {\n    TITLE: '.popover-header',\n    CONTENT: '.popover-body'\n  };\n  var Event$7 = {\n    HIDE: \"hide\" + EVENT_KEY$7,\n    HIDDEN: \"hidden\" + EVENT_KEY$7,\n    SHOW: \"show\" + EVENT_KEY$7,\n    SHOWN: \"shown\" + EVENT_KEY$7,\n    INSERTED: \"inserted\" + EVENT_KEY$7,\n    CLICK: \"click\" + EVENT_KEY$7,\n    FOCUSIN: \"focusin\" + EVENT_KEY$7,\n    FOCUSOUT: \"focusout\" + EVENT_KEY$7,\n    MOUSEENTER: \"mouseenter\" + EVENT_KEY$7,\n    MOUSELEAVE: \"mouseleave\" + EVENT_KEY$7\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Popover =\n  /*#__PURE__*/\n  function (_Tooltip) {\n    _inheritsLoose(Popover, _Tooltip);\n\n    function Popover() {\n      return _Tooltip.apply(this, arguments) || this;\n    }\n\n    var _proto = Popover.prototype;\n\n    // Overrides\n    _proto.isWithContent = function isWithContent() {\n      return this.getTitle() || this._getContent();\n    };\n\n    _proto.addAttachmentClass = function addAttachmentClass(attachment) {\n      $(this.getTipElement()).addClass(CLASS_PREFIX$1 + \"-\" + attachment);\n    };\n\n    _proto.getTipElement = function getTipElement() {\n      this.tip = this.tip || $(this.config.template)[0];\n      return this.tip;\n    };\n\n    _proto.setContent = function setContent() {\n      var $tip = $(this.getTipElement()); // We use append for html objects to maintain js events\n\n      this.setElementContent($tip.find(Selector$7.TITLE), this.getTitle());\n\n      var content = this._getContent();\n\n      if (typeof content === 'function') {\n        content = content.call(this.element);\n      }\n\n      this.setElementContent($tip.find(Selector$7.CONTENT), content);\n      $tip.removeClass(ClassName$7.FADE + \" \" + ClassName$7.SHOW);\n    } // Private\n    ;\n\n    _proto._getContent = function _getContent() {\n      return this.element.getAttribute('data-content') || this.config.content;\n    };\n\n    _proto._cleanTipClass = function _cleanTipClass() {\n      var $tip = $(this.getTipElement());\n      var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX$1);\n\n      if (tabClass !== null && tabClass.length > 0) {\n        $tip.removeClass(tabClass.join(''));\n      }\n    } // Static\n    ;\n\n    Popover._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$7);\n\n        var _config = typeof config === 'object' ? config : null;\n\n        if (!data && /dispose|hide/.test(config)) {\n          return;\n        }\n\n        if (!data) {\n          data = new Popover(this, _config);\n          $(this).data(DATA_KEY$7, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Popover, null, [{\n      key: \"VERSION\",\n      // Getters\n      get: function get() {\n        return VERSION$7;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$5;\n      }\n    }, {\n      key: \"NAME\",\n      get: function get() {\n        return NAME$7;\n      }\n    }, {\n      key: \"DATA_KEY\",\n      get: function get() {\n        return DATA_KEY$7;\n      }\n    }, {\n      key: \"Event\",\n      get: function get() {\n        return Event$7;\n      }\n    }, {\n      key: \"EVENT_KEY\",\n      get: function get() {\n        return EVENT_KEY$7;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType$5;\n      }\n    }]);\n\n    return Popover;\n  }(Tooltip);\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n\n  $.fn[NAME$7] = Popover._jQueryInterface;\n  $.fn[NAME$7].Constructor = Popover;\n\n  $.fn[NAME$7].noConflict = function () {\n    $.fn[NAME$7] = JQUERY_NO_CONFLICT$7;\n    return Popover._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$8 = 'scrollspy';\n  var VERSION$8 = '4.3.1';\n  var DATA_KEY$8 = 'bs.scrollspy';\n  var EVENT_KEY$8 = \".\" + DATA_KEY$8;\n  var DATA_API_KEY$6 = '.data-api';\n  var JQUERY_NO_CONFLICT$8 = $.fn[NAME$8];\n  var Default$6 = {\n    offset: 10,\n    method: 'auto',\n    target: ''\n  };\n  var DefaultType$6 = {\n    offset: 'number',\n    method: 'string',\n    target: '(string|element)'\n  };\n  var Event$8 = {\n    ACTIVATE: \"activate\" + EVENT_KEY$8,\n    SCROLL: \"scroll\" + EVENT_KEY$8,\n    LOAD_DATA_API: \"load\" + EVENT_KEY$8 + DATA_API_KEY$6\n  };\n  var ClassName$8 = {\n    DROPDOWN_ITEM: 'dropdown-item',\n    DROPDOWN_MENU: 'dropdown-menu',\n    ACTIVE: 'active'\n  };\n  var Selector$8 = {\n    DATA_SPY: '[data-spy=\"scroll\"]',\n    ACTIVE: '.active',\n    NAV_LIST_GROUP: '.nav, .list-group',\n    NAV_LINKS: '.nav-link',\n    NAV_ITEMS: '.nav-item',\n    LIST_ITEMS: '.list-group-item',\n    DROPDOWN: '.dropdown',\n    DROPDOWN_ITEMS: '.dropdown-item',\n    DROPDOWN_TOGGLE: '.dropdown-toggle'\n  };\n  var OffsetMethod = {\n    OFFSET: 'offset',\n    POSITION: 'position'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var ScrollSpy =\n  /*#__PURE__*/\n  function () {\n    function ScrollSpy(element, config) {\n      var _this = this;\n\n      this._element = element;\n      this._scrollElement = element.tagName === 'BODY' ? window : element;\n      this._config = this._getConfig(config);\n      this._selector = this._config.target + \" \" + Selector$8.NAV_LINKS + \",\" + (this._config.target + \" \" + Selector$8.LIST_ITEMS + \",\") + (this._config.target + \" \" + Selector$8.DROPDOWN_ITEMS);\n      this._offsets = [];\n      this._targets = [];\n      this._activeTarget = null;\n      this._scrollHeight = 0;\n      $(this._scrollElement).on(Event$8.SCROLL, function (event) {\n        return _this._process(event);\n      });\n      this.refresh();\n\n      this._process();\n    } // Getters\n\n\n    var _proto = ScrollSpy.prototype;\n\n    // Public\n    _proto.refresh = function refresh() {\n      var _this2 = this;\n\n      var autoMethod = this._scrollElement === this._scrollElement.window ? OffsetMethod.OFFSET : OffsetMethod.POSITION;\n      var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;\n      var offsetBase = offsetMethod === OffsetMethod.POSITION ? this._getScrollTop() : 0;\n      this._offsets = [];\n      this._targets = [];\n      this._scrollHeight = this._getScrollHeight();\n      var targets = [].slice.call(document.querySelectorAll(this._selector));\n      targets.map(function (element) {\n        var target;\n        var targetSelector = Util.getSelectorFromElement(element);\n\n        if (targetSelector) {\n          target = document.querySelector(targetSelector);\n        }\n\n        if (target) {\n          var targetBCR = target.getBoundingClientRect();\n\n          if (targetBCR.width || targetBCR.height) {\n            // TODO (fat): remove sketch reliance on jQuery position/offset\n            return [$(target)[offsetMethod]().top + offsetBase, targetSelector];\n          }\n        }\n\n        return null;\n      }).filter(function (item) {\n        return item;\n      }).sort(function (a, b) {\n        return a[0] - b[0];\n      }).forEach(function (item) {\n        _this2._offsets.push(item[0]);\n\n        _this2._targets.push(item[1]);\n      });\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$8);\n      $(this._scrollElement).off(EVENT_KEY$8);\n      this._element = null;\n      this._scrollElement = null;\n      this._config = null;\n      this._selector = null;\n      this._offsets = null;\n      this._targets = null;\n      this._activeTarget = null;\n      this._scrollHeight = null;\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default$6, typeof config === 'object' && config ? config : {});\n\n      if (typeof config.target !== 'string') {\n        var id = $(config.target).attr('id');\n\n        if (!id) {\n          id = Util.getUID(NAME$8);\n          $(config.target).attr('id', id);\n        }\n\n        config.target = \"#\" + id;\n      }\n\n      Util.typeCheckConfig(NAME$8, config, DefaultType$6);\n      return config;\n    };\n\n    _proto._getScrollTop = function _getScrollTop() {\n      return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;\n    };\n\n    _proto._getScrollHeight = function _getScrollHeight() {\n      return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);\n    };\n\n    _proto._getOffsetHeight = function _getOffsetHeight() {\n      return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;\n    };\n\n    _proto._process = function _process() {\n      var scrollTop = this._getScrollTop() + this._config.offset;\n\n      var scrollHeight = this._getScrollHeight();\n\n      var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();\n\n      if (this._scrollHeight !== scrollHeight) {\n        this.refresh();\n      }\n\n      if (scrollTop >= maxScroll) {\n        var target = this._targets[this._targets.length - 1];\n\n        if (this._activeTarget !== target) {\n          this._activate(target);\n        }\n\n        return;\n      }\n\n      if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n        this._activeTarget = null;\n\n        this._clear();\n\n        return;\n      }\n\n      var offsetLength = this._offsets.length;\n\n      for (var i = offsetLength; i--;) {\n        var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);\n\n        if (isActiveTarget) {\n          this._activate(this._targets[i]);\n        }\n      }\n    };\n\n    _proto._activate = function _activate(target) {\n      this._activeTarget = target;\n\n      this._clear();\n\n      var queries = this._selector.split(',').map(function (selector) {\n        return selector + \"[data-target=\\\"\" + target + \"\\\"],\" + selector + \"[href=\\\"\" + target + \"\\\"]\";\n      });\n\n      var $link = $([].slice.call(document.querySelectorAll(queries.join(','))));\n\n      if ($link.hasClass(ClassName$8.DROPDOWN_ITEM)) {\n        $link.closest(Selector$8.DROPDOWN).find(Selector$8.DROPDOWN_TOGGLE).addClass(ClassName$8.ACTIVE);\n        $link.addClass(ClassName$8.ACTIVE);\n      } else {\n        // Set triggered link as active\n        $link.addClass(ClassName$8.ACTIVE); // Set triggered links parents as active\n        // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n\n        $link.parents(Selector$8.NAV_LIST_GROUP).prev(Selector$8.NAV_LINKS + \", \" + Selector$8.LIST_ITEMS).addClass(ClassName$8.ACTIVE); // Handle special case when .nav-link is inside .nav-item\n\n        $link.parents(Selector$8.NAV_LIST_GROUP).prev(Selector$8.NAV_ITEMS).children(Selector$8.NAV_LINKS).addClass(ClassName$8.ACTIVE);\n      }\n\n      $(this._scrollElement).trigger(Event$8.ACTIVATE, {\n        relatedTarget: target\n      });\n    };\n\n    _proto._clear = function _clear() {\n      [].slice.call(document.querySelectorAll(this._selector)).filter(function (node) {\n        return node.classList.contains(ClassName$8.ACTIVE);\n      }).forEach(function (node) {\n        return node.classList.remove(ClassName$8.ACTIVE);\n      });\n    } // Static\n    ;\n\n    ScrollSpy._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$8);\n\n        var _config = typeof config === 'object' && config;\n\n        if (!data) {\n          data = new ScrollSpy(this, _config);\n          $(this).data(DATA_KEY$8, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(ScrollSpy, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$8;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$6;\n      }\n    }]);\n\n    return ScrollSpy;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(window).on(Event$8.LOAD_DATA_API, function () {\n    var scrollSpys = [].slice.call(document.querySelectorAll(Selector$8.DATA_SPY));\n    var scrollSpysLength = scrollSpys.length;\n\n    for (var i = scrollSpysLength; i--;) {\n      var $spy = $(scrollSpys[i]);\n\n      ScrollSpy._jQueryInterface.call($spy, $spy.data());\n    }\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$8] = ScrollSpy._jQueryInterface;\n  $.fn[NAME$8].Constructor = ScrollSpy;\n\n  $.fn[NAME$8].noConflict = function () {\n    $.fn[NAME$8] = JQUERY_NO_CONFLICT$8;\n    return ScrollSpy._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$9 = 'tab';\n  var VERSION$9 = '4.3.1';\n  var DATA_KEY$9 = 'bs.tab';\n  var EVENT_KEY$9 = \".\" + DATA_KEY$9;\n  var DATA_API_KEY$7 = '.data-api';\n  var JQUERY_NO_CONFLICT$9 = $.fn[NAME$9];\n  var Event$9 = {\n    HIDE: \"hide\" + EVENT_KEY$9,\n    HIDDEN: \"hidden\" + EVENT_KEY$9,\n    SHOW: \"show\" + EVENT_KEY$9,\n    SHOWN: \"shown\" + EVENT_KEY$9,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$9 + DATA_API_KEY$7\n  };\n  var ClassName$9 = {\n    DROPDOWN_MENU: 'dropdown-menu',\n    ACTIVE: 'active',\n    DISABLED: 'disabled',\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector$9 = {\n    DROPDOWN: '.dropdown',\n    NAV_LIST_GROUP: '.nav, .list-group',\n    ACTIVE: '.active',\n    ACTIVE_UL: '> li > .active',\n    DATA_TOGGLE: '[data-toggle=\"tab\"], [data-toggle=\"pill\"], [data-toggle=\"list\"]',\n    DROPDOWN_TOGGLE: '.dropdown-toggle',\n    DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Tab =\n  /*#__PURE__*/\n  function () {\n    function Tab(element) {\n      this._element = element;\n    } // Getters\n\n\n    var _proto = Tab.prototype;\n\n    // Public\n    _proto.show = function show() {\n      var _this = this;\n\n      if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $(this._element).hasClass(ClassName$9.ACTIVE) || $(this._element).hasClass(ClassName$9.DISABLED)) {\n        return;\n      }\n\n      var target;\n      var previous;\n      var listElement = $(this._element).closest(Selector$9.NAV_LIST_GROUP)[0];\n      var selector = Util.getSelectorFromElement(this._element);\n\n      if (listElement) {\n        var itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? Selector$9.ACTIVE_UL : Selector$9.ACTIVE;\n        previous = $.makeArray($(listElement).find(itemSelector));\n        previous = previous[previous.length - 1];\n      }\n\n      var hideEvent = $.Event(Event$9.HIDE, {\n        relatedTarget: this._element\n      });\n      var showEvent = $.Event(Event$9.SHOW, {\n        relatedTarget: previous\n      });\n\n      if (previous) {\n        $(previous).trigger(hideEvent);\n      }\n\n      $(this._element).trigger(showEvent);\n\n      if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      if (selector) {\n        target = document.querySelector(selector);\n      }\n\n      this._activate(this._element, listElement);\n\n      var complete = function complete() {\n        var hiddenEvent = $.Event(Event$9.HIDDEN, {\n          relatedTarget: _this._element\n        });\n        var shownEvent = $.Event(Event$9.SHOWN, {\n          relatedTarget: previous\n        });\n        $(previous).trigger(hiddenEvent);\n        $(_this._element).trigger(shownEvent);\n      };\n\n      if (target) {\n        this._activate(target, target.parentNode, complete);\n      } else {\n        complete();\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$9);\n      this._element = null;\n    } // Private\n    ;\n\n    _proto._activate = function _activate(element, container, callback) {\n      var _this2 = this;\n\n      var activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ? $(container).find(Selector$9.ACTIVE_UL) : $(container).children(Selector$9.ACTIVE);\n      var active = activeElements[0];\n      var isTransitioning = callback && active && $(active).hasClass(ClassName$9.FADE);\n\n      var complete = function complete() {\n        return _this2._transitionComplete(element, active, callback);\n      };\n\n      if (active && isTransitioning) {\n        var transitionDuration = Util.getTransitionDurationFromElement(active);\n        $(active).removeClass(ClassName$9.SHOW).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      } else {\n        complete();\n      }\n    };\n\n    _proto._transitionComplete = function _transitionComplete(element, active, callback) {\n      if (active) {\n        $(active).removeClass(ClassName$9.ACTIVE);\n        var dropdownChild = $(active.parentNode).find(Selector$9.DROPDOWN_ACTIVE_CHILD)[0];\n\n        if (dropdownChild) {\n          $(dropdownChild).removeClass(ClassName$9.ACTIVE);\n        }\n\n        if (active.getAttribute('role') === 'tab') {\n          active.setAttribute('aria-selected', false);\n        }\n      }\n\n      $(element).addClass(ClassName$9.ACTIVE);\n\n      if (element.getAttribute('role') === 'tab') {\n        element.setAttribute('aria-selected', true);\n      }\n\n      Util.reflow(element);\n\n      if (element.classList.contains(ClassName$9.FADE)) {\n        element.classList.add(ClassName$9.SHOW);\n      }\n\n      if (element.parentNode && $(element.parentNode).hasClass(ClassName$9.DROPDOWN_MENU)) {\n        var dropdownElement = $(element).closest(Selector$9.DROPDOWN)[0];\n\n        if (dropdownElement) {\n          var dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(Selector$9.DROPDOWN_TOGGLE));\n          $(dropdownToggleList).addClass(ClassName$9.ACTIVE);\n        }\n\n        element.setAttribute('aria-expanded', true);\n      }\n\n      if (callback) {\n        callback();\n      }\n    } // Static\n    ;\n\n    Tab._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $this = $(this);\n        var data = $this.data(DATA_KEY$9);\n\n        if (!data) {\n          data = new Tab(this);\n          $this.data(DATA_KEY$9, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Tab, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$9;\n      }\n    }]);\n\n    return Tab;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$9.CLICK_DATA_API, Selector$9.DATA_TOGGLE, function (event) {\n    event.preventDefault();\n\n    Tab._jQueryInterface.call($(this), 'show');\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$9] = Tab._jQueryInterface;\n  $.fn[NAME$9].Constructor = Tab;\n\n  $.fn[NAME$9].noConflict = function () {\n    $.fn[NAME$9] = JQUERY_NO_CONFLICT$9;\n    return Tab._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$a = 'toast';\n  var VERSION$a = '4.3.1';\n  var DATA_KEY$a = 'bs.toast';\n  var EVENT_KEY$a = \".\" + DATA_KEY$a;\n  var JQUERY_NO_CONFLICT$a = $.fn[NAME$a];\n  var Event$a = {\n    CLICK_DISMISS: \"click.dismiss\" + EVENT_KEY$a,\n    HIDE: \"hide\" + EVENT_KEY$a,\n    HIDDEN: \"hidden\" + EVENT_KEY$a,\n    SHOW: \"show\" + EVENT_KEY$a,\n    SHOWN: \"shown\" + EVENT_KEY$a\n  };\n  var ClassName$a = {\n    FADE: 'fade',\n    HIDE: 'hide',\n    SHOW: 'show',\n    SHOWING: 'showing'\n  };\n  var DefaultType$7 = {\n    animation: 'boolean',\n    autohide: 'boolean',\n    delay: 'number'\n  };\n  var Default$7 = {\n    animation: true,\n    autohide: true,\n    delay: 500\n  };\n  var Selector$a = {\n    DATA_DISMISS: '[data-dismiss=\"toast\"]'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Toast =\n  /*#__PURE__*/\n  function () {\n    function Toast(element, config) {\n      this._element = element;\n      this._config = this._getConfig(config);\n      this._timeout = null;\n\n      this._setListeners();\n    } // Getters\n\n\n    var _proto = Toast.prototype;\n\n    // Public\n    _proto.show = function show() {\n      var _this = this;\n\n      $(this._element).trigger(Event$a.SHOW);\n\n      if (this._config.animation) {\n        this._element.classList.add(ClassName$a.FADE);\n      }\n\n      var complete = function complete() {\n        _this._element.classList.remove(ClassName$a.SHOWING);\n\n        _this._element.classList.add(ClassName$a.SHOW);\n\n        $(_this._element).trigger(Event$a.SHOWN);\n\n        if (_this._config.autohide) {\n          _this.hide();\n        }\n      };\n\n      this._element.classList.remove(ClassName$a.HIDE);\n\n      this._element.classList.add(ClassName$a.SHOWING);\n\n      if (this._config.animation) {\n        var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n        $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      } else {\n        complete();\n      }\n    };\n\n    _proto.hide = function hide(withoutTimeout) {\n      var _this2 = this;\n\n      if (!this._element.classList.contains(ClassName$a.SHOW)) {\n        return;\n      }\n\n      $(this._element).trigger(Event$a.HIDE);\n\n      if (withoutTimeout) {\n        this._close();\n      } else {\n        this._timeout = setTimeout(function () {\n          _this2._close();\n        }, this._config.delay);\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      clearTimeout(this._timeout);\n      this._timeout = null;\n\n      if (this._element.classList.contains(ClassName$a.SHOW)) {\n        this._element.classList.remove(ClassName$a.SHOW);\n      }\n\n      $(this._element).off(Event$a.CLICK_DISMISS);\n      $.removeData(this._element, DATA_KEY$a);\n      this._element = null;\n      this._config = null;\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default$7, $(this._element).data(), typeof config === 'object' && config ? config : {});\n      Util.typeCheckConfig(NAME$a, config, this.constructor.DefaultType);\n      return config;\n    };\n\n    _proto._setListeners = function _setListeners() {\n      var _this3 = this;\n\n      $(this._element).on(Event$a.CLICK_DISMISS, Selector$a.DATA_DISMISS, function () {\n        return _this3.hide(true);\n      });\n    };\n\n    _proto._close = function _close() {\n      var _this4 = this;\n\n      var complete = function complete() {\n        _this4._element.classList.add(ClassName$a.HIDE);\n\n        $(_this4._element).trigger(Event$a.HIDDEN);\n      };\n\n      this._element.classList.remove(ClassName$a.SHOW);\n\n      if (this._config.animation) {\n        var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n        $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      } else {\n        complete();\n      }\n    } // Static\n    ;\n\n    Toast._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $element = $(this);\n        var data = $element.data(DATA_KEY$a);\n\n        var _config = typeof config === 'object' && config;\n\n        if (!data) {\n          data = new Toast(this, _config);\n          $element.data(DATA_KEY$a, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config](this);\n        }\n      });\n    };\n\n    _createClass(Toast, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$a;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType$7;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$7;\n      }\n    }]);\n\n    return Toast;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n\n  $.fn[NAME$a] = Toast._jQueryInterface;\n  $.fn[NAME$a].Constructor = Toast;\n\n  $.fn[NAME$a].noConflict = function () {\n    $.fn[NAME$a] = JQUERY_NO_CONFLICT$a;\n    return Toast._jQueryInterface;\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.3.1): index.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  (function () {\n    if (typeof $ === 'undefined') {\n      throw new TypeError('Bootstrap\\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\\'s JavaScript.');\n    }\n\n    var version = $.fn.jquery.split(' ')[0].split('.');\n    var minMajor = 1;\n    var ltMajor = 2;\n    var minMinor = 9;\n    var minPatch = 1;\n    var maxMajor = 4;\n\n    if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {\n      throw new Error('Bootstrap\\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0');\n    }\n  })();\n\n  exports.Util = Util;\n  exports.Alert = Alert;\n  exports.Button = Button;\n  exports.Carousel = Carousel;\n  exports.Collapse = Collapse;\n  exports.Dropdown = Dropdown;\n  exports.Modal = Modal;\n  exports.Popover = Popover;\n  exports.Scrollspy = ScrollSpy;\n  exports.Tab = Tab;\n  exports.Toast = Toast;\n  exports.Tooltip = Tooltip;\n\n  Object.defineProperty(exports, '__esModule', { value: true });\n\n}));\n//# sourceMappingURL=bootstrap.js.map\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bootstrap4/js/bootstrap.js.map",
    "content": "{\"version\":3,\"file\":\"bootstrap.js\",\"sources\":[\"../../js/src/util.js\",\"../../js/src/alert.js\",\"../../js/src/button.js\",\"../../js/src/carousel.js\",\"../../js/src/collapse.js\",\"../../js/src/dropdown.js\",\"../../js/src/modal.js\",\"../../js/src/tools/sanitizer.js\",\"../../js/src/tooltip.js\",\"../../js/src/popover.js\",\"../../js/src/scrollspy.js\",\"../../js/src/tab.js\",\"../../js/src/toast.js\",\"../../js/src/index.js\"],\"sourcesContent\":[\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): util.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Private TransitionEnd Helpers\\n * ------------------------------------------------------------------------\\n */\\n\\nconst TRANSITION_END = 'transitionend'\\nconst MAX_UID = 1000000\\nconst MILLISECONDS_MULTIPLIER = 1000\\n\\n// Shoutout AngusCroll (https://goo.gl/pxwQGp)\\nfunction toType(obj) {\\n  return {}.toString.call(obj).match(/\\\\s([a-z]+)/i)[1].toLowerCase()\\n}\\n\\nfunction getSpecialTransitionEndEvent() {\\n  return {\\n    bindType: TRANSITION_END,\\n    delegateType: TRANSITION_END,\\n    handle(event) {\\n      if ($(event.target).is(this)) {\\n        return event.handleObj.handler.apply(this, arguments) // eslint-disable-line prefer-rest-params\\n      }\\n      return undefined // eslint-disable-line no-undefined\\n    }\\n  }\\n}\\n\\nfunction transitionEndEmulator(duration) {\\n  let called = false\\n\\n  $(this).one(Util.TRANSITION_END, () => {\\n    called = true\\n  })\\n\\n  setTimeout(() => {\\n    if (!called) {\\n      Util.triggerTransitionEnd(this)\\n    }\\n  }, duration)\\n\\n  return this\\n}\\n\\nfunction setTransitionEndSupport() {\\n  $.fn.emulateTransitionEnd = transitionEndEmulator\\n  $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent()\\n}\\n\\n/**\\n * --------------------------------------------------------------------------\\n * Public Util Api\\n * --------------------------------------------------------------------------\\n */\\n\\nconst Util = {\\n\\n  TRANSITION_END: 'bsTransitionEnd',\\n\\n  getUID(prefix) {\\n    do {\\n      // eslint-disable-next-line no-bitwise\\n      prefix += ~~(Math.random() * MAX_UID) // \\\"~~\\\" acts like a faster Math.floor() here\\n    } while (document.getElementById(prefix))\\n    return prefix\\n  },\\n\\n  getSelectorFromElement(element) {\\n    let selector = element.getAttribute('data-target')\\n\\n    if (!selector || selector === '#') {\\n      const hrefAttr = element.getAttribute('href')\\n      selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : ''\\n    }\\n\\n    try {\\n      return document.querySelector(selector) ? selector : null\\n    } catch (err) {\\n      return null\\n    }\\n  },\\n\\n  getTransitionDurationFromElement(element) {\\n    if (!element) {\\n      return 0\\n    }\\n\\n    // Get transition-duration of the element\\n    let transitionDuration = $(element).css('transition-duration')\\n    let transitionDelay = $(element).css('transition-delay')\\n\\n    const floatTransitionDuration = parseFloat(transitionDuration)\\n    const floatTransitionDelay = parseFloat(transitionDelay)\\n\\n    // Return 0 if element or transition duration is not found\\n    if (!floatTransitionDuration && !floatTransitionDelay) {\\n      return 0\\n    }\\n\\n    // If multiple durations are defined, take the first\\n    transitionDuration = transitionDuration.split(',')[0]\\n    transitionDelay = transitionDelay.split(',')[0]\\n\\n    return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\\n  },\\n\\n  reflow(element) {\\n    return element.offsetHeight\\n  },\\n\\n  triggerTransitionEnd(element) {\\n    $(element).trigger(TRANSITION_END)\\n  },\\n\\n  // TODO: Remove in v5\\n  supportsTransitionEnd() {\\n    return Boolean(TRANSITION_END)\\n  },\\n\\n  isElement(obj) {\\n    return (obj[0] || obj).nodeType\\n  },\\n\\n  typeCheckConfig(componentName, config, configTypes) {\\n    for (const property in configTypes) {\\n      if (Object.prototype.hasOwnProperty.call(configTypes, property)) {\\n        const expectedTypes = configTypes[property]\\n        const value         = config[property]\\n        const valueType     = value && Util.isElement(value)\\n          ? 'element' : toType(value)\\n\\n        if (!new RegExp(expectedTypes).test(valueType)) {\\n          throw new Error(\\n            `${componentName.toUpperCase()}: ` +\\n            `Option \\\"${property}\\\" provided type \\\"${valueType}\\\" ` +\\n            `but expected type \\\"${expectedTypes}\\\".`)\\n        }\\n      }\\n    }\\n  },\\n\\n  findShadowRoot(element) {\\n    if (!document.documentElement.attachShadow) {\\n      return null\\n    }\\n\\n    // Can find the shadow root otherwise it'll return the document\\n    if (typeof element.getRootNode === 'function') {\\n      const root = element.getRootNode()\\n      return root instanceof ShadowRoot ? root : null\\n    }\\n\\n    if (element instanceof ShadowRoot) {\\n      return element\\n    }\\n\\n    // when we don't find a shadow root\\n    if (!element.parentNode) {\\n      return null\\n    }\\n\\n    return Util.findShadowRoot(element.parentNode)\\n  }\\n}\\n\\nsetTransitionEndSupport()\\n\\nexport default Util\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): alert.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\nimport Util from './util'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME                = 'alert'\\nconst VERSION             = '4.3.1'\\nconst DATA_KEY            = 'bs.alert'\\nconst EVENT_KEY           = `.${DATA_KEY}`\\nconst DATA_API_KEY        = '.data-api'\\nconst JQUERY_NO_CONFLICT  = $.fn[NAME]\\n\\nconst Selector = {\\n  DISMISS : '[data-dismiss=\\\"alert\\\"]'\\n}\\n\\nconst Event = {\\n  CLOSE          : `close${EVENT_KEY}`,\\n  CLOSED         : `closed${EVENT_KEY}`,\\n  CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\\n}\\n\\nconst ClassName = {\\n  ALERT : 'alert',\\n  FADE  : 'fade',\\n  SHOW  : 'show'\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass Alert {\\n  constructor(element) {\\n    this._element = element\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  // Public\\n\\n  close(element) {\\n    let rootElement = this._element\\n    if (element) {\\n      rootElement = this._getRootElement(element)\\n    }\\n\\n    const customEvent = this._triggerCloseEvent(rootElement)\\n\\n    if (customEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    this._removeElement(rootElement)\\n  }\\n\\n  dispose() {\\n    $.removeData(this._element, DATA_KEY)\\n    this._element = null\\n  }\\n\\n  // Private\\n\\n  _getRootElement(element) {\\n    const selector = Util.getSelectorFromElement(element)\\n    let parent     = false\\n\\n    if (selector) {\\n      parent = document.querySelector(selector)\\n    }\\n\\n    if (!parent) {\\n      parent = $(element).closest(`.${ClassName.ALERT}`)[0]\\n    }\\n\\n    return parent\\n  }\\n\\n  _triggerCloseEvent(element) {\\n    const closeEvent = $.Event(Event.CLOSE)\\n\\n    $(element).trigger(closeEvent)\\n    return closeEvent\\n  }\\n\\n  _removeElement(element) {\\n    $(element).removeClass(ClassName.SHOW)\\n\\n    if (!$(element).hasClass(ClassName.FADE)) {\\n      this._destroyElement(element)\\n      return\\n    }\\n\\n    const transitionDuration = Util.getTransitionDurationFromElement(element)\\n\\n    $(element)\\n      .one(Util.TRANSITION_END, (event) => this._destroyElement(element, event))\\n      .emulateTransitionEnd(transitionDuration)\\n  }\\n\\n  _destroyElement(element) {\\n    $(element)\\n      .detach()\\n      .trigger(Event.CLOSED)\\n      .remove()\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      const $element = $(this)\\n      let data       = $element.data(DATA_KEY)\\n\\n      if (!data) {\\n        data = new Alert(this)\\n        $element.data(DATA_KEY, data)\\n      }\\n\\n      if (config === 'close') {\\n        data[config](this)\\n      }\\n    })\\n  }\\n\\n  static _handleDismiss(alertInstance) {\\n    return function (event) {\\n      if (event) {\\n        event.preventDefault()\\n      }\\n\\n      alertInstance.close(this)\\n    }\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Data Api implementation\\n * ------------------------------------------------------------------------\\n */\\n\\n$(document).on(\\n  Event.CLICK_DATA_API,\\n  Selector.DISMISS,\\n  Alert._handleDismiss(new Alert())\\n)\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME]             = Alert._jQueryInterface\\n$.fn[NAME].Constructor = Alert\\n$.fn[NAME].noConflict  = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Alert._jQueryInterface\\n}\\n\\nexport default Alert\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): button.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME                = 'button'\\nconst VERSION             = '4.3.1'\\nconst DATA_KEY            = 'bs.button'\\nconst EVENT_KEY           = `.${DATA_KEY}`\\nconst DATA_API_KEY        = '.data-api'\\nconst JQUERY_NO_CONFLICT  = $.fn[NAME]\\n\\nconst ClassName = {\\n  ACTIVE : 'active',\\n  BUTTON : 'btn',\\n  FOCUS  : 'focus'\\n}\\n\\nconst Selector = {\\n  DATA_TOGGLE_CARROT : '[data-toggle^=\\\"button\\\"]',\\n  DATA_TOGGLE        : '[data-toggle=\\\"buttons\\\"]',\\n  INPUT              : 'input:not([type=\\\"hidden\\\"])',\\n  ACTIVE             : '.active',\\n  BUTTON             : '.btn'\\n}\\n\\nconst Event = {\\n  CLICK_DATA_API      : `click${EVENT_KEY}${DATA_API_KEY}`,\\n  FOCUS_BLUR_DATA_API : `focus${EVENT_KEY}${DATA_API_KEY} ` +\\n                          `blur${EVENT_KEY}${DATA_API_KEY}`\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass Button {\\n  constructor(element) {\\n    this._element = element\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  // Public\\n\\n  toggle() {\\n    let triggerChangeEvent = true\\n    let addAriaPressed = true\\n    const rootElement = $(this._element).closest(\\n      Selector.DATA_TOGGLE\\n    )[0]\\n\\n    if (rootElement) {\\n      const input = this._element.querySelector(Selector.INPUT)\\n\\n      if (input) {\\n        if (input.type === 'radio') {\\n          if (input.checked &&\\n            this._element.classList.contains(ClassName.ACTIVE)) {\\n            triggerChangeEvent = false\\n          } else {\\n            const activeElement = rootElement.querySelector(Selector.ACTIVE)\\n\\n            if (activeElement) {\\n              $(activeElement).removeClass(ClassName.ACTIVE)\\n            }\\n          }\\n        }\\n\\n        if (triggerChangeEvent) {\\n          if (input.hasAttribute('disabled') ||\\n            rootElement.hasAttribute('disabled') ||\\n            input.classList.contains('disabled') ||\\n            rootElement.classList.contains('disabled')) {\\n            return\\n          }\\n          input.checked = !this._element.classList.contains(ClassName.ACTIVE)\\n          $(input).trigger('change')\\n        }\\n\\n        input.focus()\\n        addAriaPressed = false\\n      }\\n    }\\n\\n    if (addAriaPressed) {\\n      this._element.setAttribute('aria-pressed',\\n        !this._element.classList.contains(ClassName.ACTIVE))\\n    }\\n\\n    if (triggerChangeEvent) {\\n      $(this._element).toggleClass(ClassName.ACTIVE)\\n    }\\n  }\\n\\n  dispose() {\\n    $.removeData(this._element, DATA_KEY)\\n    this._element = null\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      let data = $(this).data(DATA_KEY)\\n\\n      if (!data) {\\n        data = new Button(this)\\n        $(this).data(DATA_KEY, data)\\n      }\\n\\n      if (config === 'toggle') {\\n        data[config]()\\n      }\\n    })\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Data Api implementation\\n * ------------------------------------------------------------------------\\n */\\n\\n$(document)\\n  .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {\\n    event.preventDefault()\\n\\n    let button = event.target\\n\\n    if (!$(button).hasClass(ClassName.BUTTON)) {\\n      button = $(button).closest(Selector.BUTTON)\\n    }\\n\\n    Button._jQueryInterface.call($(button), 'toggle')\\n  })\\n  .on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {\\n    const button = $(event.target).closest(Selector.BUTTON)[0]\\n    $(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type))\\n  })\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME] = Button._jQueryInterface\\n$.fn[NAME].Constructor = Button\\n$.fn[NAME].noConflict = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Button._jQueryInterface\\n}\\n\\nexport default Button\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): carousel.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\nimport Util from './util'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME                   = 'carousel'\\nconst VERSION                = '4.3.1'\\nconst DATA_KEY               = 'bs.carousel'\\nconst EVENT_KEY              = `.${DATA_KEY}`\\nconst DATA_API_KEY           = '.data-api'\\nconst JQUERY_NO_CONFLICT     = $.fn[NAME]\\nconst ARROW_LEFT_KEYCODE     = 37 // KeyboardEvent.which value for left arrow key\\nconst ARROW_RIGHT_KEYCODE    = 39 // KeyboardEvent.which value for right arrow key\\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\\nconst SWIPE_THRESHOLD        = 40\\n\\nconst Default = {\\n  interval : 5000,\\n  keyboard : true,\\n  slide    : false,\\n  pause    : 'hover',\\n  wrap     : true,\\n  touch    : true\\n}\\n\\nconst DefaultType = {\\n  interval : '(number|boolean)',\\n  keyboard : 'boolean',\\n  slide    : '(boolean|string)',\\n  pause    : '(string|boolean)',\\n  wrap     : 'boolean',\\n  touch    : 'boolean'\\n}\\n\\nconst Direction = {\\n  NEXT     : 'next',\\n  PREV     : 'prev',\\n  LEFT     : 'left',\\n  RIGHT    : 'right'\\n}\\n\\nconst Event = {\\n  SLIDE          : `slide${EVENT_KEY}`,\\n  SLID           : `slid${EVENT_KEY}`,\\n  KEYDOWN        : `keydown${EVENT_KEY}`,\\n  MOUSEENTER     : `mouseenter${EVENT_KEY}`,\\n  MOUSELEAVE     : `mouseleave${EVENT_KEY}`,\\n  TOUCHSTART     : `touchstart${EVENT_KEY}`,\\n  TOUCHMOVE      : `touchmove${EVENT_KEY}`,\\n  TOUCHEND       : `touchend${EVENT_KEY}`,\\n  POINTERDOWN    : `pointerdown${EVENT_KEY}`,\\n  POINTERUP      : `pointerup${EVENT_KEY}`,\\n  DRAG_START     : `dragstart${EVENT_KEY}`,\\n  LOAD_DATA_API  : `load${EVENT_KEY}${DATA_API_KEY}`,\\n  CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\\n}\\n\\nconst ClassName = {\\n  CAROUSEL      : 'carousel',\\n  ACTIVE        : 'active',\\n  SLIDE         : 'slide',\\n  RIGHT         : 'carousel-item-right',\\n  LEFT          : 'carousel-item-left',\\n  NEXT          : 'carousel-item-next',\\n  PREV          : 'carousel-item-prev',\\n  ITEM          : 'carousel-item',\\n  POINTER_EVENT : 'pointer-event'\\n}\\n\\nconst Selector = {\\n  ACTIVE      : '.active',\\n  ACTIVE_ITEM : '.active.carousel-item',\\n  ITEM        : '.carousel-item',\\n  ITEM_IMG    : '.carousel-item img',\\n  NEXT_PREV   : '.carousel-item-next, .carousel-item-prev',\\n  INDICATORS  : '.carousel-indicators',\\n  DATA_SLIDE  : '[data-slide], [data-slide-to]',\\n  DATA_RIDE   : '[data-ride=\\\"carousel\\\"]'\\n}\\n\\nconst PointerType = {\\n  TOUCH : 'touch',\\n  PEN   : 'pen'\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\nclass Carousel {\\n  constructor(element, config) {\\n    this._items         = null\\n    this._interval      = null\\n    this._activeElement = null\\n    this._isPaused      = false\\n    this._isSliding     = false\\n    this.touchTimeout   = null\\n    this.touchStartX    = 0\\n    this.touchDeltaX    = 0\\n\\n    this._config            = this._getConfig(config)\\n    this._element           = element\\n    this._indicatorsElement = this._element.querySelector(Selector.INDICATORS)\\n    this._touchSupported    = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\\n    this._pointerEvent      = Boolean(window.PointerEvent || window.MSPointerEvent)\\n\\n    this._addEventListeners()\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  static get Default() {\\n    return Default\\n  }\\n\\n  // Public\\n\\n  next() {\\n    if (!this._isSliding) {\\n      this._slide(Direction.NEXT)\\n    }\\n  }\\n\\n  nextWhenVisible() {\\n    // Don't call next when the page isn't visible\\n    // or the carousel or its parent isn't visible\\n    if (!document.hidden &&\\n      ($(this._element).is(':visible') && $(this._element).css('visibility') !== 'hidden')) {\\n      this.next()\\n    }\\n  }\\n\\n  prev() {\\n    if (!this._isSliding) {\\n      this._slide(Direction.PREV)\\n    }\\n  }\\n\\n  pause(event) {\\n    if (!event) {\\n      this._isPaused = true\\n    }\\n\\n    if (this._element.querySelector(Selector.NEXT_PREV)) {\\n      Util.triggerTransitionEnd(this._element)\\n      this.cycle(true)\\n    }\\n\\n    clearInterval(this._interval)\\n    this._interval = null\\n  }\\n\\n  cycle(event) {\\n    if (!event) {\\n      this._isPaused = false\\n    }\\n\\n    if (this._interval) {\\n      clearInterval(this._interval)\\n      this._interval = null\\n    }\\n\\n    if (this._config.interval && !this._isPaused) {\\n      this._interval = setInterval(\\n        (document.visibilityState ? this.nextWhenVisible : this.next).bind(this),\\n        this._config.interval\\n      )\\n    }\\n  }\\n\\n  to(index) {\\n    this._activeElement = this._element.querySelector(Selector.ACTIVE_ITEM)\\n\\n    const activeIndex = this._getItemIndex(this._activeElement)\\n\\n    if (index > this._items.length - 1 || index < 0) {\\n      return\\n    }\\n\\n    if (this._isSliding) {\\n      $(this._element).one(Event.SLID, () => this.to(index))\\n      return\\n    }\\n\\n    if (activeIndex === index) {\\n      this.pause()\\n      this.cycle()\\n      return\\n    }\\n\\n    const direction = index > activeIndex\\n      ? Direction.NEXT\\n      : Direction.PREV\\n\\n    this._slide(direction, this._items[index])\\n  }\\n\\n  dispose() {\\n    $(this._element).off(EVENT_KEY)\\n    $.removeData(this._element, DATA_KEY)\\n\\n    this._items             = null\\n    this._config            = null\\n    this._element           = null\\n    this._interval          = null\\n    this._isPaused          = null\\n    this._isSliding         = null\\n    this._activeElement     = null\\n    this._indicatorsElement = null\\n  }\\n\\n  // Private\\n\\n  _getConfig(config) {\\n    config = {\\n      ...Default,\\n      ...config\\n    }\\n    Util.typeCheckConfig(NAME, config, DefaultType)\\n    return config\\n  }\\n\\n  _handleSwipe() {\\n    const absDeltax = Math.abs(this.touchDeltaX)\\n\\n    if (absDeltax <= SWIPE_THRESHOLD) {\\n      return\\n    }\\n\\n    const direction = absDeltax / this.touchDeltaX\\n\\n    // swipe left\\n    if (direction > 0) {\\n      this.prev()\\n    }\\n\\n    // swipe right\\n    if (direction < 0) {\\n      this.next()\\n    }\\n  }\\n\\n  _addEventListeners() {\\n    if (this._config.keyboard) {\\n      $(this._element)\\n        .on(Event.KEYDOWN, (event) => this._keydown(event))\\n    }\\n\\n    if (this._config.pause === 'hover') {\\n      $(this._element)\\n        .on(Event.MOUSEENTER, (event) => this.pause(event))\\n        .on(Event.MOUSELEAVE, (event) => this.cycle(event))\\n    }\\n\\n    if (this._config.touch) {\\n      this._addTouchEventListeners()\\n    }\\n  }\\n\\n  _addTouchEventListeners() {\\n    if (!this._touchSupported) {\\n      return\\n    }\\n\\n    const start = (event) => {\\n      if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\\n        this.touchStartX = event.originalEvent.clientX\\n      } else if (!this._pointerEvent) {\\n        this.touchStartX = event.originalEvent.touches[0].clientX\\n      }\\n    }\\n\\n    const move = (event) => {\\n      // ensure swiping with one touch and not pinching\\n      if (event.originalEvent.touches && event.originalEvent.touches.length > 1) {\\n        this.touchDeltaX = 0\\n      } else {\\n        this.touchDeltaX = event.originalEvent.touches[0].clientX - this.touchStartX\\n      }\\n    }\\n\\n    const end = (event) => {\\n      if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\\n        this.touchDeltaX = event.originalEvent.clientX - this.touchStartX\\n      }\\n\\n      this._handleSwipe()\\n      if (this._config.pause === 'hover') {\\n        // If it's a touch-enabled device, mouseenter/leave are fired as\\n        // part of the mouse compatibility events on first tap - the carousel\\n        // would stop cycling until user tapped out of it;\\n        // here, we listen for touchend, explicitly pause the carousel\\n        // (as if it's the second time we tap on it, mouseenter compat event\\n        // is NOT fired) and after a timeout (to allow for mouse compatibility\\n        // events to fire) we explicitly restart cycling\\n\\n        this.pause()\\n        if (this.touchTimeout) {\\n          clearTimeout(this.touchTimeout)\\n        }\\n        this.touchTimeout = setTimeout((event) => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\\n      }\\n    }\\n\\n    $(this._element.querySelectorAll(Selector.ITEM_IMG)).on(Event.DRAG_START, (e) => e.preventDefault())\\n    if (this._pointerEvent) {\\n      $(this._element).on(Event.POINTERDOWN, (event) => start(event))\\n      $(this._element).on(Event.POINTERUP, (event) => end(event))\\n\\n      this._element.classList.add(ClassName.POINTER_EVENT)\\n    } else {\\n      $(this._element).on(Event.TOUCHSTART, (event) => start(event))\\n      $(this._element).on(Event.TOUCHMOVE, (event) => move(event))\\n      $(this._element).on(Event.TOUCHEND, (event) => end(event))\\n    }\\n  }\\n\\n  _keydown(event) {\\n    if (/input|textarea/i.test(event.target.tagName)) {\\n      return\\n    }\\n\\n    switch (event.which) {\\n      case ARROW_LEFT_KEYCODE:\\n        event.preventDefault()\\n        this.prev()\\n        break\\n      case ARROW_RIGHT_KEYCODE:\\n        event.preventDefault()\\n        this.next()\\n        break\\n      default:\\n    }\\n  }\\n\\n  _getItemIndex(element) {\\n    this._items = element && element.parentNode\\n      ? [].slice.call(element.parentNode.querySelectorAll(Selector.ITEM))\\n      : []\\n    return this._items.indexOf(element)\\n  }\\n\\n  _getItemByDirection(direction, activeElement) {\\n    const isNextDirection = direction === Direction.NEXT\\n    const isPrevDirection = direction === Direction.PREV\\n    const activeIndex     = this._getItemIndex(activeElement)\\n    const lastItemIndex   = this._items.length - 1\\n    const isGoingToWrap   = isPrevDirection && activeIndex === 0 ||\\n                            isNextDirection && activeIndex === lastItemIndex\\n\\n    if (isGoingToWrap && !this._config.wrap) {\\n      return activeElement\\n    }\\n\\n    const delta     = direction === Direction.PREV ? -1 : 1\\n    const itemIndex = (activeIndex + delta) % this._items.length\\n\\n    return itemIndex === -1\\n      ? this._items[this._items.length - 1] : this._items[itemIndex]\\n  }\\n\\n  _triggerSlideEvent(relatedTarget, eventDirectionName) {\\n    const targetIndex = this._getItemIndex(relatedTarget)\\n    const fromIndex = this._getItemIndex(this._element.querySelector(Selector.ACTIVE_ITEM))\\n    const slideEvent = $.Event(Event.SLIDE, {\\n      relatedTarget,\\n      direction: eventDirectionName,\\n      from: fromIndex,\\n      to: targetIndex\\n    })\\n\\n    $(this._element).trigger(slideEvent)\\n\\n    return slideEvent\\n  }\\n\\n  _setActiveIndicatorElement(element) {\\n    if (this._indicatorsElement) {\\n      const indicators = [].slice.call(this._indicatorsElement.querySelectorAll(Selector.ACTIVE))\\n      $(indicators)\\n        .removeClass(ClassName.ACTIVE)\\n\\n      const nextIndicator = this._indicatorsElement.children[\\n        this._getItemIndex(element)\\n      ]\\n\\n      if (nextIndicator) {\\n        $(nextIndicator).addClass(ClassName.ACTIVE)\\n      }\\n    }\\n  }\\n\\n  _slide(direction, element) {\\n    const activeElement = this._element.querySelector(Selector.ACTIVE_ITEM)\\n    const activeElementIndex = this._getItemIndex(activeElement)\\n    const nextElement   = element || activeElement &&\\n      this._getItemByDirection(direction, activeElement)\\n    const nextElementIndex = this._getItemIndex(nextElement)\\n    const isCycling = Boolean(this._interval)\\n\\n    let directionalClassName\\n    let orderClassName\\n    let eventDirectionName\\n\\n    if (direction === Direction.NEXT) {\\n      directionalClassName = ClassName.LEFT\\n      orderClassName = ClassName.NEXT\\n      eventDirectionName = Direction.LEFT\\n    } else {\\n      directionalClassName = ClassName.RIGHT\\n      orderClassName = ClassName.PREV\\n      eventDirectionName = Direction.RIGHT\\n    }\\n\\n    if (nextElement && $(nextElement).hasClass(ClassName.ACTIVE)) {\\n      this._isSliding = false\\n      return\\n    }\\n\\n    const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName)\\n    if (slideEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    if (!activeElement || !nextElement) {\\n      // Some weirdness is happening, so we bail\\n      return\\n    }\\n\\n    this._isSliding = true\\n\\n    if (isCycling) {\\n      this.pause()\\n    }\\n\\n    this._setActiveIndicatorElement(nextElement)\\n\\n    const slidEvent = $.Event(Event.SLID, {\\n      relatedTarget: nextElement,\\n      direction: eventDirectionName,\\n      from: activeElementIndex,\\n      to: nextElementIndex\\n    })\\n\\n    if ($(this._element).hasClass(ClassName.SLIDE)) {\\n      $(nextElement).addClass(orderClassName)\\n\\n      Util.reflow(nextElement)\\n\\n      $(activeElement).addClass(directionalClassName)\\n      $(nextElement).addClass(directionalClassName)\\n\\n      const nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10)\\n      if (nextElementInterval) {\\n        this._config.defaultInterval = this._config.defaultInterval || this._config.interval\\n        this._config.interval = nextElementInterval\\n      } else {\\n        this._config.interval = this._config.defaultInterval || this._config.interval\\n      }\\n\\n      const transitionDuration = Util.getTransitionDurationFromElement(activeElement)\\n\\n      $(activeElement)\\n        .one(Util.TRANSITION_END, () => {\\n          $(nextElement)\\n            .removeClass(`${directionalClassName} ${orderClassName}`)\\n            .addClass(ClassName.ACTIVE)\\n\\n          $(activeElement).removeClass(`${ClassName.ACTIVE} ${orderClassName} ${directionalClassName}`)\\n\\n          this._isSliding = false\\n\\n          setTimeout(() => $(this._element).trigger(slidEvent), 0)\\n        })\\n        .emulateTransitionEnd(transitionDuration)\\n    } else {\\n      $(activeElement).removeClass(ClassName.ACTIVE)\\n      $(nextElement).addClass(ClassName.ACTIVE)\\n\\n      this._isSliding = false\\n      $(this._element).trigger(slidEvent)\\n    }\\n\\n    if (isCycling) {\\n      this.cycle()\\n    }\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      let data = $(this).data(DATA_KEY)\\n      let _config = {\\n        ...Default,\\n        ...$(this).data()\\n      }\\n\\n      if (typeof config === 'object') {\\n        _config = {\\n          ..._config,\\n          ...config\\n        }\\n      }\\n\\n      const action = typeof config === 'string' ? config : _config.slide\\n\\n      if (!data) {\\n        data = new Carousel(this, _config)\\n        $(this).data(DATA_KEY, data)\\n      }\\n\\n      if (typeof config === 'number') {\\n        data.to(config)\\n      } else if (typeof action === 'string') {\\n        if (typeof data[action] === 'undefined') {\\n          throw new TypeError(`No method named \\\"${action}\\\"`)\\n        }\\n        data[action]()\\n      } else if (_config.interval && _config.ride) {\\n        data.pause()\\n        data.cycle()\\n      }\\n    })\\n  }\\n\\n  static _dataApiClickHandler(event) {\\n    const selector = Util.getSelectorFromElement(this)\\n\\n    if (!selector) {\\n      return\\n    }\\n\\n    const target = $(selector)[0]\\n\\n    if (!target || !$(target).hasClass(ClassName.CAROUSEL)) {\\n      return\\n    }\\n\\n    const config = {\\n      ...$(target).data(),\\n      ...$(this).data()\\n    }\\n    const slideIndex = this.getAttribute('data-slide-to')\\n\\n    if (slideIndex) {\\n      config.interval = false\\n    }\\n\\n    Carousel._jQueryInterface.call($(target), config)\\n\\n    if (slideIndex) {\\n      $(target).data(DATA_KEY).to(slideIndex)\\n    }\\n\\n    event.preventDefault()\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Data Api implementation\\n * ------------------------------------------------------------------------\\n */\\n\\n$(document)\\n  .on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler)\\n\\n$(window).on(Event.LOAD_DATA_API, () => {\\n  const carousels = [].slice.call(document.querySelectorAll(Selector.DATA_RIDE))\\n  for (let i = 0, len = carousels.length; i < len; i++) {\\n    const $carousel = $(carousels[i])\\n    Carousel._jQueryInterface.call($carousel, $carousel.data())\\n  }\\n})\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME] = Carousel._jQueryInterface\\n$.fn[NAME].Constructor = Carousel\\n$.fn[NAME].noConflict = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Carousel._jQueryInterface\\n}\\n\\nexport default Carousel\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): collapse.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\nimport Util from './util'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME                = 'collapse'\\nconst VERSION             = '4.3.1'\\nconst DATA_KEY            = 'bs.collapse'\\nconst EVENT_KEY           = `.${DATA_KEY}`\\nconst DATA_API_KEY        = '.data-api'\\nconst JQUERY_NO_CONFLICT  = $.fn[NAME]\\n\\nconst Default = {\\n  toggle : true,\\n  parent : ''\\n}\\n\\nconst DefaultType = {\\n  toggle : 'boolean',\\n  parent : '(string|element)'\\n}\\n\\nconst Event = {\\n  SHOW           : `show${EVENT_KEY}`,\\n  SHOWN          : `shown${EVENT_KEY}`,\\n  HIDE           : `hide${EVENT_KEY}`,\\n  HIDDEN         : `hidden${EVENT_KEY}`,\\n  CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\\n}\\n\\nconst ClassName = {\\n  SHOW       : 'show',\\n  COLLAPSE   : 'collapse',\\n  COLLAPSING : 'collapsing',\\n  COLLAPSED  : 'collapsed'\\n}\\n\\nconst Dimension = {\\n  WIDTH  : 'width',\\n  HEIGHT : 'height'\\n}\\n\\nconst Selector = {\\n  ACTIVES     : '.show, .collapsing',\\n  DATA_TOGGLE : '[data-toggle=\\\"collapse\\\"]'\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass Collapse {\\n  constructor(element, config) {\\n    this._isTransitioning = false\\n    this._element         = element\\n    this._config          = this._getConfig(config)\\n    this._triggerArray    = [].slice.call(document.querySelectorAll(\\n      `[data-toggle=\\\"collapse\\\"][href=\\\"#${element.id}\\\"],` +\\n      `[data-toggle=\\\"collapse\\\"][data-target=\\\"#${element.id}\\\"]`\\n    ))\\n\\n    const toggleList = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE))\\n    for (let i = 0, len = toggleList.length; i < len; i++) {\\n      const elem = toggleList[i]\\n      const selector = Util.getSelectorFromElement(elem)\\n      const filterElement = [].slice.call(document.querySelectorAll(selector))\\n        .filter((foundElem) => foundElem === element)\\n\\n      if (selector !== null && filterElement.length > 0) {\\n        this._selector = selector\\n        this._triggerArray.push(elem)\\n      }\\n    }\\n\\n    this._parent = this._config.parent ? this._getParent() : null\\n\\n    if (!this._config.parent) {\\n      this._addAriaAndCollapsedClass(this._element, this._triggerArray)\\n    }\\n\\n    if (this._config.toggle) {\\n      this.toggle()\\n    }\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  static get Default() {\\n    return Default\\n  }\\n\\n  // Public\\n\\n  toggle() {\\n    if ($(this._element).hasClass(ClassName.SHOW)) {\\n      this.hide()\\n    } else {\\n      this.show()\\n    }\\n  }\\n\\n  show() {\\n    if (this._isTransitioning ||\\n      $(this._element).hasClass(ClassName.SHOW)) {\\n      return\\n    }\\n\\n    let actives\\n    let activesData\\n\\n    if (this._parent) {\\n      actives = [].slice.call(this._parent.querySelectorAll(Selector.ACTIVES))\\n        .filter((elem) => {\\n          if (typeof this._config.parent === 'string') {\\n            return elem.getAttribute('data-parent') === this._config.parent\\n          }\\n\\n          return elem.classList.contains(ClassName.COLLAPSE)\\n        })\\n\\n      if (actives.length === 0) {\\n        actives = null\\n      }\\n    }\\n\\n    if (actives) {\\n      activesData = $(actives).not(this._selector).data(DATA_KEY)\\n      if (activesData && activesData._isTransitioning) {\\n        return\\n      }\\n    }\\n\\n    const startEvent = $.Event(Event.SHOW)\\n    $(this._element).trigger(startEvent)\\n    if (startEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    if (actives) {\\n      Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide')\\n      if (!activesData) {\\n        $(actives).data(DATA_KEY, null)\\n      }\\n    }\\n\\n    const dimension = this._getDimension()\\n\\n    $(this._element)\\n      .removeClass(ClassName.COLLAPSE)\\n      .addClass(ClassName.COLLAPSING)\\n\\n    this._element.style[dimension] = 0\\n\\n    if (this._triggerArray.length) {\\n      $(this._triggerArray)\\n        .removeClass(ClassName.COLLAPSED)\\n        .attr('aria-expanded', true)\\n    }\\n\\n    this.setTransitioning(true)\\n\\n    const complete = () => {\\n      $(this._element)\\n        .removeClass(ClassName.COLLAPSING)\\n        .addClass(ClassName.COLLAPSE)\\n        .addClass(ClassName.SHOW)\\n\\n      this._element.style[dimension] = ''\\n\\n      this.setTransitioning(false)\\n\\n      $(this._element).trigger(Event.SHOWN)\\n    }\\n\\n    const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\\n    const scrollSize = `scroll${capitalizedDimension}`\\n    const transitionDuration = Util.getTransitionDurationFromElement(this._element)\\n\\n    $(this._element)\\n      .one(Util.TRANSITION_END, complete)\\n      .emulateTransitionEnd(transitionDuration)\\n\\n    this._element.style[dimension] = `${this._element[scrollSize]}px`\\n  }\\n\\n  hide() {\\n    if (this._isTransitioning ||\\n      !$(this._element).hasClass(ClassName.SHOW)) {\\n      return\\n    }\\n\\n    const startEvent = $.Event(Event.HIDE)\\n    $(this._element).trigger(startEvent)\\n    if (startEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    const dimension = this._getDimension()\\n\\n    this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\\n\\n    Util.reflow(this._element)\\n\\n    $(this._element)\\n      .addClass(ClassName.COLLAPSING)\\n      .removeClass(ClassName.COLLAPSE)\\n      .removeClass(ClassName.SHOW)\\n\\n    const triggerArrayLength = this._triggerArray.length\\n    if (triggerArrayLength > 0) {\\n      for (let i = 0; i < triggerArrayLength; i++) {\\n        const trigger = this._triggerArray[i]\\n        const selector = Util.getSelectorFromElement(trigger)\\n\\n        if (selector !== null) {\\n          const $elem = $([].slice.call(document.querySelectorAll(selector)))\\n          if (!$elem.hasClass(ClassName.SHOW)) {\\n            $(trigger).addClass(ClassName.COLLAPSED)\\n              .attr('aria-expanded', false)\\n          }\\n        }\\n      }\\n    }\\n\\n    this.setTransitioning(true)\\n\\n    const complete = () => {\\n      this.setTransitioning(false)\\n      $(this._element)\\n        .removeClass(ClassName.COLLAPSING)\\n        .addClass(ClassName.COLLAPSE)\\n        .trigger(Event.HIDDEN)\\n    }\\n\\n    this._element.style[dimension] = ''\\n    const transitionDuration = Util.getTransitionDurationFromElement(this._element)\\n\\n    $(this._element)\\n      .one(Util.TRANSITION_END, complete)\\n      .emulateTransitionEnd(transitionDuration)\\n  }\\n\\n  setTransitioning(isTransitioning) {\\n    this._isTransitioning = isTransitioning\\n  }\\n\\n  dispose() {\\n    $.removeData(this._element, DATA_KEY)\\n\\n    this._config          = null\\n    this._parent          = null\\n    this._element         = null\\n    this._triggerArray    = null\\n    this._isTransitioning = null\\n  }\\n\\n  // Private\\n\\n  _getConfig(config) {\\n    config = {\\n      ...Default,\\n      ...config\\n    }\\n    config.toggle = Boolean(config.toggle) // Coerce string values\\n    Util.typeCheckConfig(NAME, config, DefaultType)\\n    return config\\n  }\\n\\n  _getDimension() {\\n    const hasWidth = $(this._element).hasClass(Dimension.WIDTH)\\n    return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT\\n  }\\n\\n  _getParent() {\\n    let parent\\n\\n    if (Util.isElement(this._config.parent)) {\\n      parent = this._config.parent\\n\\n      // It's a jQuery object\\n      if (typeof this._config.parent.jquery !== 'undefined') {\\n        parent = this._config.parent[0]\\n      }\\n    } else {\\n      parent = document.querySelector(this._config.parent)\\n    }\\n\\n    const selector =\\n      `[data-toggle=\\\"collapse\\\"][data-parent=\\\"${this._config.parent}\\\"]`\\n\\n    const children = [].slice.call(parent.querySelectorAll(selector))\\n    $(children).each((i, element) => {\\n      this._addAriaAndCollapsedClass(\\n        Collapse._getTargetFromElement(element),\\n        [element]\\n      )\\n    })\\n\\n    return parent\\n  }\\n\\n  _addAriaAndCollapsedClass(element, triggerArray) {\\n    const isOpen = $(element).hasClass(ClassName.SHOW)\\n\\n    if (triggerArray.length) {\\n      $(triggerArray)\\n        .toggleClass(ClassName.COLLAPSED, !isOpen)\\n        .attr('aria-expanded', isOpen)\\n    }\\n  }\\n\\n  // Static\\n\\n  static _getTargetFromElement(element) {\\n    const selector = Util.getSelectorFromElement(element)\\n    return selector ? document.querySelector(selector) : null\\n  }\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      const $this   = $(this)\\n      let data      = $this.data(DATA_KEY)\\n      const _config = {\\n        ...Default,\\n        ...$this.data(),\\n        ...typeof config === 'object' && config ? config : {}\\n      }\\n\\n      if (!data && _config.toggle && /show|hide/.test(config)) {\\n        _config.toggle = false\\n      }\\n\\n      if (!data) {\\n        data = new Collapse(this, _config)\\n        $this.data(DATA_KEY, data)\\n      }\\n\\n      if (typeof config === 'string') {\\n        if (typeof data[config] === 'undefined') {\\n          throw new TypeError(`No method named \\\"${config}\\\"`)\\n        }\\n        data[config]()\\n      }\\n    })\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Data Api implementation\\n * ------------------------------------------------------------------------\\n */\\n\\n$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\\n  // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\\n  if (event.currentTarget.tagName === 'A') {\\n    event.preventDefault()\\n  }\\n\\n  const $trigger = $(this)\\n  const selector = Util.getSelectorFromElement(this)\\n  const selectors = [].slice.call(document.querySelectorAll(selector))\\n\\n  $(selectors).each(function () {\\n    const $target = $(this)\\n    const data    = $target.data(DATA_KEY)\\n    const config  = data ? 'toggle' : $trigger.data()\\n    Collapse._jQueryInterface.call($target, config)\\n  })\\n})\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME] = Collapse._jQueryInterface\\n$.fn[NAME].Constructor = Collapse\\n$.fn[NAME].noConflict = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Collapse._jQueryInterface\\n}\\n\\nexport default Collapse\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): dropdown.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\nimport Popper from 'popper.js'\\nimport Util from './util'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME                     = 'dropdown'\\nconst VERSION                  = '4.3.1'\\nconst DATA_KEY                 = 'bs.dropdown'\\nconst EVENT_KEY                = `.${DATA_KEY}`\\nconst DATA_API_KEY             = '.data-api'\\nconst JQUERY_NO_CONFLICT       = $.fn[NAME]\\nconst ESCAPE_KEYCODE           = 27 // KeyboardEvent.which value for Escape (Esc) key\\nconst SPACE_KEYCODE            = 32 // KeyboardEvent.which value for space key\\nconst TAB_KEYCODE              = 9 // KeyboardEvent.which value for tab key\\nconst ARROW_UP_KEYCODE         = 38 // KeyboardEvent.which value for up arrow key\\nconst ARROW_DOWN_KEYCODE       = 40 // KeyboardEvent.which value for down arrow key\\nconst RIGHT_MOUSE_BUTTON_WHICH = 3 // MouseEvent.which value for the right button (assuming a right-handed mouse)\\nconst REGEXP_KEYDOWN           = new RegExp(`${ARROW_UP_KEYCODE}|${ARROW_DOWN_KEYCODE}|${ESCAPE_KEYCODE}`)\\n\\nconst Event = {\\n  HIDE             : `hide${EVENT_KEY}`,\\n  HIDDEN           : `hidden${EVENT_KEY}`,\\n  SHOW             : `show${EVENT_KEY}`,\\n  SHOWN            : `shown${EVENT_KEY}`,\\n  CLICK            : `click${EVENT_KEY}`,\\n  CLICK_DATA_API   : `click${EVENT_KEY}${DATA_API_KEY}`,\\n  KEYDOWN_DATA_API : `keydown${EVENT_KEY}${DATA_API_KEY}`,\\n  KEYUP_DATA_API   : `keyup${EVENT_KEY}${DATA_API_KEY}`\\n}\\n\\nconst ClassName = {\\n  DISABLED        : 'disabled',\\n  SHOW            : 'show',\\n  DROPUP          : 'dropup',\\n  DROPRIGHT       : 'dropright',\\n  DROPLEFT        : 'dropleft',\\n  MENURIGHT       : 'dropdown-menu-right',\\n  MENULEFT        : 'dropdown-menu-left',\\n  POSITION_STATIC : 'position-static'\\n}\\n\\nconst Selector = {\\n  DATA_TOGGLE   : '[data-toggle=\\\"dropdown\\\"]',\\n  FORM_CHILD    : '.dropdown form',\\n  MENU          : '.dropdown-menu',\\n  NAVBAR_NAV    : '.navbar-nav',\\n  VISIBLE_ITEMS : '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\\n}\\n\\nconst AttachmentMap = {\\n  TOP       : 'top-start',\\n  TOPEND    : 'top-end',\\n  BOTTOM    : 'bottom-start',\\n  BOTTOMEND : 'bottom-end',\\n  RIGHT     : 'right-start',\\n  RIGHTEND  : 'right-end',\\n  LEFT      : 'left-start',\\n  LEFTEND   : 'left-end'\\n}\\n\\nconst Default = {\\n  offset    : 0,\\n  flip      : true,\\n  boundary  : 'scrollParent',\\n  reference : 'toggle',\\n  display   : 'dynamic'\\n}\\n\\nconst DefaultType = {\\n  offset    : '(number|string|function)',\\n  flip      : 'boolean',\\n  boundary  : '(string|element)',\\n  reference : '(string|element)',\\n  display   : 'string'\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass Dropdown {\\n  constructor(element, config) {\\n    this._element  = element\\n    this._popper   = null\\n    this._config   = this._getConfig(config)\\n    this._menu     = this._getMenuElement()\\n    this._inNavbar = this._detectNavbar()\\n\\n    this._addEventListeners()\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  static get Default() {\\n    return Default\\n  }\\n\\n  static get DefaultType() {\\n    return DefaultType\\n  }\\n\\n  // Public\\n\\n  toggle() {\\n    if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED)) {\\n      return\\n    }\\n\\n    const parent   = Dropdown._getParentFromElement(this._element)\\n    const isActive = $(this._menu).hasClass(ClassName.SHOW)\\n\\n    Dropdown._clearMenus()\\n\\n    if (isActive) {\\n      return\\n    }\\n\\n    const relatedTarget = {\\n      relatedTarget: this._element\\n    }\\n    const showEvent = $.Event(Event.SHOW, relatedTarget)\\n\\n    $(parent).trigger(showEvent)\\n\\n    if (showEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    // Disable totally Popper.js for Dropdown in Navbar\\n    if (!this._inNavbar) {\\n      /**\\n       * Check for Popper dependency\\n       * Popper - https://popper.js.org\\n       */\\n      if (typeof Popper === 'undefined') {\\n        throw new TypeError('Bootstrap\\\\'s dropdowns require Popper.js (https://popper.js.org/)')\\n      }\\n\\n      let referenceElement = this._element\\n\\n      if (this._config.reference === 'parent') {\\n        referenceElement = parent\\n      } else if (Util.isElement(this._config.reference)) {\\n        referenceElement = this._config.reference\\n\\n        // Check if it's jQuery element\\n        if (typeof this._config.reference.jquery !== 'undefined') {\\n          referenceElement = this._config.reference[0]\\n        }\\n      }\\n\\n      // If boundary is not `scrollParent`, then set position to `static`\\n      // to allow the menu to \\\"escape\\\" the scroll parent's boundaries\\n      // https://github.com/twbs/bootstrap/issues/24251\\n      if (this._config.boundary !== 'scrollParent') {\\n        $(parent).addClass(ClassName.POSITION_STATIC)\\n      }\\n      this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig())\\n    }\\n\\n    // If this is a touch-enabled device we add extra\\n    // empty mouseover listeners to the body's immediate children;\\n    // only needed because of broken event delegation on iOS\\n    // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\\n    if ('ontouchstart' in document.documentElement &&\\n        $(parent).closest(Selector.NAVBAR_NAV).length === 0) {\\n      $(document.body).children().on('mouseover', null, $.noop)\\n    }\\n\\n    this._element.focus()\\n    this._element.setAttribute('aria-expanded', true)\\n\\n    $(this._menu).toggleClass(ClassName.SHOW)\\n    $(parent)\\n      .toggleClass(ClassName.SHOW)\\n      .trigger($.Event(Event.SHOWN, relatedTarget))\\n  }\\n\\n  show() {\\n    if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || $(this._menu).hasClass(ClassName.SHOW)) {\\n      return\\n    }\\n\\n    const relatedTarget = {\\n      relatedTarget: this._element\\n    }\\n    const showEvent = $.Event(Event.SHOW, relatedTarget)\\n    const parent = Dropdown._getParentFromElement(this._element)\\n\\n    $(parent).trigger(showEvent)\\n\\n    if (showEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    $(this._menu).toggleClass(ClassName.SHOW)\\n    $(parent)\\n      .toggleClass(ClassName.SHOW)\\n      .trigger($.Event(Event.SHOWN, relatedTarget))\\n  }\\n\\n  hide() {\\n    if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || !$(this._menu).hasClass(ClassName.SHOW)) {\\n      return\\n    }\\n\\n    const relatedTarget = {\\n      relatedTarget: this._element\\n    }\\n    const hideEvent = $.Event(Event.HIDE, relatedTarget)\\n    const parent = Dropdown._getParentFromElement(this._element)\\n\\n    $(parent).trigger(hideEvent)\\n\\n    if (hideEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    $(this._menu).toggleClass(ClassName.SHOW)\\n    $(parent)\\n      .toggleClass(ClassName.SHOW)\\n      .trigger($.Event(Event.HIDDEN, relatedTarget))\\n  }\\n\\n  dispose() {\\n    $.removeData(this._element, DATA_KEY)\\n    $(this._element).off(EVENT_KEY)\\n    this._element = null\\n    this._menu = null\\n    if (this._popper !== null) {\\n      this._popper.destroy()\\n      this._popper = null\\n    }\\n  }\\n\\n  update() {\\n    this._inNavbar = this._detectNavbar()\\n    if (this._popper !== null) {\\n      this._popper.scheduleUpdate()\\n    }\\n  }\\n\\n  // Private\\n\\n  _addEventListeners() {\\n    $(this._element).on(Event.CLICK, (event) => {\\n      event.preventDefault()\\n      event.stopPropagation()\\n      this.toggle()\\n    })\\n  }\\n\\n  _getConfig(config) {\\n    config = {\\n      ...this.constructor.Default,\\n      ...$(this._element).data(),\\n      ...config\\n    }\\n\\n    Util.typeCheckConfig(\\n      NAME,\\n      config,\\n      this.constructor.DefaultType\\n    )\\n\\n    return config\\n  }\\n\\n  _getMenuElement() {\\n    if (!this._menu) {\\n      const parent = Dropdown._getParentFromElement(this._element)\\n\\n      if (parent) {\\n        this._menu = parent.querySelector(Selector.MENU)\\n      }\\n    }\\n    return this._menu\\n  }\\n\\n  _getPlacement() {\\n    const $parentDropdown = $(this._element.parentNode)\\n    let placement = AttachmentMap.BOTTOM\\n\\n    // Handle dropup\\n    if ($parentDropdown.hasClass(ClassName.DROPUP)) {\\n      placement = AttachmentMap.TOP\\n      if ($(this._menu).hasClass(ClassName.MENURIGHT)) {\\n        placement = AttachmentMap.TOPEND\\n      }\\n    } else if ($parentDropdown.hasClass(ClassName.DROPRIGHT)) {\\n      placement = AttachmentMap.RIGHT\\n    } else if ($parentDropdown.hasClass(ClassName.DROPLEFT)) {\\n      placement = AttachmentMap.LEFT\\n    } else if ($(this._menu).hasClass(ClassName.MENURIGHT)) {\\n      placement = AttachmentMap.BOTTOMEND\\n    }\\n    return placement\\n  }\\n\\n  _detectNavbar() {\\n    return $(this._element).closest('.navbar').length > 0\\n  }\\n\\n  _getOffset() {\\n    const offset = {}\\n\\n    if (typeof this._config.offset === 'function') {\\n      offset.fn = (data) => {\\n        data.offsets = {\\n          ...data.offsets,\\n          ...this._config.offset(data.offsets, this._element) || {}\\n        }\\n\\n        return data\\n      }\\n    } else {\\n      offset.offset = this._config.offset\\n    }\\n\\n    return offset\\n  }\\n\\n  _getPopperConfig() {\\n    const popperConfig = {\\n      placement: this._getPlacement(),\\n      modifiers: {\\n        offset: this._getOffset(),\\n        flip: {\\n          enabled: this._config.flip\\n        },\\n        preventOverflow: {\\n          boundariesElement: this._config.boundary\\n        }\\n      }\\n    }\\n\\n    // Disable Popper.js if we have a static display\\n    if (this._config.display === 'static') {\\n      popperConfig.modifiers.applyStyle = {\\n        enabled: false\\n      }\\n    }\\n\\n    return popperConfig\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      let data = $(this).data(DATA_KEY)\\n      const _config = typeof config === 'object' ? config : null\\n\\n      if (!data) {\\n        data = new Dropdown(this, _config)\\n        $(this).data(DATA_KEY, data)\\n      }\\n\\n      if (typeof config === 'string') {\\n        if (typeof data[config] === 'undefined') {\\n          throw new TypeError(`No method named \\\"${config}\\\"`)\\n        }\\n        data[config]()\\n      }\\n    })\\n  }\\n\\n  static _clearMenus(event) {\\n    if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH ||\\n      event.type === 'keyup' && event.which !== TAB_KEYCODE)) {\\n      return\\n    }\\n\\n    const toggles = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE))\\n\\n    for (let i = 0, len = toggles.length; i < len; i++) {\\n      const parent = Dropdown._getParentFromElement(toggles[i])\\n      const context = $(toggles[i]).data(DATA_KEY)\\n      const relatedTarget = {\\n        relatedTarget: toggles[i]\\n      }\\n\\n      if (event && event.type === 'click') {\\n        relatedTarget.clickEvent = event\\n      }\\n\\n      if (!context) {\\n        continue\\n      }\\n\\n      const dropdownMenu = context._menu\\n      if (!$(parent).hasClass(ClassName.SHOW)) {\\n        continue\\n      }\\n\\n      if (event && (event.type === 'click' &&\\n          /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) &&\\n          $.contains(parent, event.target)) {\\n        continue\\n      }\\n\\n      const hideEvent = $.Event(Event.HIDE, relatedTarget)\\n      $(parent).trigger(hideEvent)\\n      if (hideEvent.isDefaultPrevented()) {\\n        continue\\n      }\\n\\n      // If this is a touch-enabled device we remove the extra\\n      // empty mouseover listeners we added for iOS support\\n      if ('ontouchstart' in document.documentElement) {\\n        $(document.body).children().off('mouseover', null, $.noop)\\n      }\\n\\n      toggles[i].setAttribute('aria-expanded', 'false')\\n\\n      $(dropdownMenu).removeClass(ClassName.SHOW)\\n      $(parent)\\n        .removeClass(ClassName.SHOW)\\n        .trigger($.Event(Event.HIDDEN, relatedTarget))\\n    }\\n  }\\n\\n  static _getParentFromElement(element) {\\n    let parent\\n    const selector = Util.getSelectorFromElement(element)\\n\\n    if (selector) {\\n      parent = document.querySelector(selector)\\n    }\\n\\n    return parent || element.parentNode\\n  }\\n\\n  // eslint-disable-next-line complexity\\n  static _dataApiKeydownHandler(event) {\\n    // If not input/textarea:\\n    //  - And not a key in REGEXP_KEYDOWN => not a dropdown command\\n    // If input/textarea:\\n    //  - If space key => not a dropdown command\\n    //  - If key is other than escape\\n    //    - If key is not up or down => not a dropdown command\\n    //    - If trigger inside the menu => not a dropdown command\\n    if (/input|textarea/i.test(event.target.tagName)\\n      ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE &&\\n      (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE ||\\n        $(event.target).closest(Selector.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {\\n      return\\n    }\\n\\n    event.preventDefault()\\n    event.stopPropagation()\\n\\n    if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {\\n      return\\n    }\\n\\n    const parent   = Dropdown._getParentFromElement(this)\\n    const isActive = $(parent).hasClass(ClassName.SHOW)\\n\\n    if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {\\n      if (event.which === ESCAPE_KEYCODE) {\\n        const toggle = parent.querySelector(Selector.DATA_TOGGLE)\\n        $(toggle).trigger('focus')\\n      }\\n\\n      $(this).trigger('click')\\n      return\\n    }\\n\\n    const items = [].slice.call(parent.querySelectorAll(Selector.VISIBLE_ITEMS))\\n\\n    if (items.length === 0) {\\n      return\\n    }\\n\\n    let index = items.indexOf(event.target)\\n\\n    if (event.which === ARROW_UP_KEYCODE && index > 0) { // Up\\n      index--\\n    }\\n\\n    if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) { // Down\\n      index++\\n    }\\n\\n    if (index < 0) {\\n      index = 0\\n    }\\n\\n    items[index].focus()\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Data Api implementation\\n * ------------------------------------------------------------------------\\n */\\n\\n$(document)\\n  .on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler)\\n  .on(Event.KEYDOWN_DATA_API, Selector.MENU, Dropdown._dataApiKeydownHandler)\\n  .on(`${Event.CLICK_DATA_API} ${Event.KEYUP_DATA_API}`, Dropdown._clearMenus)\\n  .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\\n    event.preventDefault()\\n    event.stopPropagation()\\n    Dropdown._jQueryInterface.call($(this), 'toggle')\\n  })\\n  .on(Event.CLICK_DATA_API, Selector.FORM_CHILD, (e) => {\\n    e.stopPropagation()\\n  })\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME] = Dropdown._jQueryInterface\\n$.fn[NAME].Constructor = Dropdown\\n$.fn[NAME].noConflict = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Dropdown._jQueryInterface\\n}\\n\\n\\nexport default Dropdown\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): modal.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\nimport Util from './util'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME               = 'modal'\\nconst VERSION            = '4.3.1'\\nconst DATA_KEY           = 'bs.modal'\\nconst EVENT_KEY          = `.${DATA_KEY}`\\nconst DATA_API_KEY       = '.data-api'\\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\\nconst ESCAPE_KEYCODE     = 27 // KeyboardEvent.which value for Escape (Esc) key\\n\\nconst Default = {\\n  backdrop : true,\\n  keyboard : true,\\n  focus    : true,\\n  show     : true\\n}\\n\\nconst DefaultType = {\\n  backdrop : '(boolean|string)',\\n  keyboard : 'boolean',\\n  focus    : 'boolean',\\n  show     : 'boolean'\\n}\\n\\nconst Event = {\\n  HIDE              : `hide${EVENT_KEY}`,\\n  HIDDEN            : `hidden${EVENT_KEY}`,\\n  SHOW              : `show${EVENT_KEY}`,\\n  SHOWN             : `shown${EVENT_KEY}`,\\n  FOCUSIN           : `focusin${EVENT_KEY}`,\\n  RESIZE            : `resize${EVENT_KEY}`,\\n  CLICK_DISMISS     : `click.dismiss${EVENT_KEY}`,\\n  KEYDOWN_DISMISS   : `keydown.dismiss${EVENT_KEY}`,\\n  MOUSEUP_DISMISS   : `mouseup.dismiss${EVENT_KEY}`,\\n  MOUSEDOWN_DISMISS : `mousedown.dismiss${EVENT_KEY}`,\\n  CLICK_DATA_API    : `click${EVENT_KEY}${DATA_API_KEY}`\\n}\\n\\nconst ClassName = {\\n  SCROLLABLE         : 'modal-dialog-scrollable',\\n  SCROLLBAR_MEASURER : 'modal-scrollbar-measure',\\n  BACKDROP           : 'modal-backdrop',\\n  OPEN               : 'modal-open',\\n  FADE               : 'fade',\\n  SHOW               : 'show'\\n}\\n\\nconst Selector = {\\n  DIALOG         : '.modal-dialog',\\n  MODAL_BODY     : '.modal-body',\\n  DATA_TOGGLE    : '[data-toggle=\\\"modal\\\"]',\\n  DATA_DISMISS   : '[data-dismiss=\\\"modal\\\"]',\\n  FIXED_CONTENT  : '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',\\n  STICKY_CONTENT : '.sticky-top'\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass Modal {\\n  constructor(element, config) {\\n    this._config              = this._getConfig(config)\\n    this._element             = element\\n    this._dialog              = element.querySelector(Selector.DIALOG)\\n    this._backdrop            = null\\n    this._isShown             = false\\n    this._isBodyOverflowing   = false\\n    this._ignoreBackdropClick = false\\n    this._isTransitioning     = false\\n    this._scrollbarWidth      = 0\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  static get Default() {\\n    return Default\\n  }\\n\\n  // Public\\n\\n  toggle(relatedTarget) {\\n    return this._isShown ? this.hide() : this.show(relatedTarget)\\n  }\\n\\n  show(relatedTarget) {\\n    if (this._isShown || this._isTransitioning) {\\n      return\\n    }\\n\\n    if ($(this._element).hasClass(ClassName.FADE)) {\\n      this._isTransitioning = true\\n    }\\n\\n    const showEvent = $.Event(Event.SHOW, {\\n      relatedTarget\\n    })\\n\\n    $(this._element).trigger(showEvent)\\n\\n    if (this._isShown || showEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    this._isShown = true\\n\\n    this._checkScrollbar()\\n    this._setScrollbar()\\n\\n    this._adjustDialog()\\n\\n    this._setEscapeEvent()\\n    this._setResizeEvent()\\n\\n    $(this._element).on(\\n      Event.CLICK_DISMISS,\\n      Selector.DATA_DISMISS,\\n      (event) => this.hide(event)\\n    )\\n\\n    $(this._dialog).on(Event.MOUSEDOWN_DISMISS, () => {\\n      $(this._element).one(Event.MOUSEUP_DISMISS, (event) => {\\n        if ($(event.target).is(this._element)) {\\n          this._ignoreBackdropClick = true\\n        }\\n      })\\n    })\\n\\n    this._showBackdrop(() => this._showElement(relatedTarget))\\n  }\\n\\n  hide(event) {\\n    if (event) {\\n      event.preventDefault()\\n    }\\n\\n    if (!this._isShown || this._isTransitioning) {\\n      return\\n    }\\n\\n    const hideEvent = $.Event(Event.HIDE)\\n\\n    $(this._element).trigger(hideEvent)\\n\\n    if (!this._isShown || hideEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    this._isShown = false\\n    const transition = $(this._element).hasClass(ClassName.FADE)\\n\\n    if (transition) {\\n      this._isTransitioning = true\\n    }\\n\\n    this._setEscapeEvent()\\n    this._setResizeEvent()\\n\\n    $(document).off(Event.FOCUSIN)\\n\\n    $(this._element).removeClass(ClassName.SHOW)\\n\\n    $(this._element).off(Event.CLICK_DISMISS)\\n    $(this._dialog).off(Event.MOUSEDOWN_DISMISS)\\n\\n\\n    if (transition) {\\n      const transitionDuration  = Util.getTransitionDurationFromElement(this._element)\\n\\n      $(this._element)\\n        .one(Util.TRANSITION_END, (event) => this._hideModal(event))\\n        .emulateTransitionEnd(transitionDuration)\\n    } else {\\n      this._hideModal()\\n    }\\n  }\\n\\n  dispose() {\\n    [window, this._element, this._dialog]\\n      .forEach((htmlElement) => $(htmlElement).off(EVENT_KEY))\\n\\n    /**\\n     * `document` has 2 events `Event.FOCUSIN` and `Event.CLICK_DATA_API`\\n     * Do not move `document` in `htmlElements` array\\n     * It will remove `Event.CLICK_DATA_API` event that should remain\\n     */\\n    $(document).off(Event.FOCUSIN)\\n\\n    $.removeData(this._element, DATA_KEY)\\n\\n    this._config              = null\\n    this._element             = null\\n    this._dialog              = null\\n    this._backdrop            = null\\n    this._isShown             = null\\n    this._isBodyOverflowing   = null\\n    this._ignoreBackdropClick = null\\n    this._isTransitioning     = null\\n    this._scrollbarWidth      = null\\n  }\\n\\n  handleUpdate() {\\n    this._adjustDialog()\\n  }\\n\\n  // Private\\n\\n  _getConfig(config) {\\n    config = {\\n      ...Default,\\n      ...config\\n    }\\n    Util.typeCheckConfig(NAME, config, DefaultType)\\n    return config\\n  }\\n\\n  _showElement(relatedTarget) {\\n    const transition = $(this._element).hasClass(ClassName.FADE)\\n\\n    if (!this._element.parentNode ||\\n        this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\\n      // Don't move modal's DOM position\\n      document.body.appendChild(this._element)\\n    }\\n\\n    this._element.style.display = 'block'\\n    this._element.removeAttribute('aria-hidden')\\n    this._element.setAttribute('aria-modal', true)\\n\\n    if ($(this._dialog).hasClass(ClassName.SCROLLABLE)) {\\n      this._dialog.querySelector(Selector.MODAL_BODY).scrollTop = 0\\n    } else {\\n      this._element.scrollTop = 0\\n    }\\n\\n    if (transition) {\\n      Util.reflow(this._element)\\n    }\\n\\n    $(this._element).addClass(ClassName.SHOW)\\n\\n    if (this._config.focus) {\\n      this._enforceFocus()\\n    }\\n\\n    const shownEvent = $.Event(Event.SHOWN, {\\n      relatedTarget\\n    })\\n\\n    const transitionComplete = () => {\\n      if (this._config.focus) {\\n        this._element.focus()\\n      }\\n      this._isTransitioning = false\\n      $(this._element).trigger(shownEvent)\\n    }\\n\\n    if (transition) {\\n      const transitionDuration  = Util.getTransitionDurationFromElement(this._dialog)\\n\\n      $(this._dialog)\\n        .one(Util.TRANSITION_END, transitionComplete)\\n        .emulateTransitionEnd(transitionDuration)\\n    } else {\\n      transitionComplete()\\n    }\\n  }\\n\\n  _enforceFocus() {\\n    $(document)\\n      .off(Event.FOCUSIN) // Guard against infinite focus loop\\n      .on(Event.FOCUSIN, (event) => {\\n        if (document !== event.target &&\\n            this._element !== event.target &&\\n            $(this._element).has(event.target).length === 0) {\\n          this._element.focus()\\n        }\\n      })\\n  }\\n\\n  _setEscapeEvent() {\\n    if (this._isShown && this._config.keyboard) {\\n      $(this._element).on(Event.KEYDOWN_DISMISS, (event) => {\\n        if (event.which === ESCAPE_KEYCODE) {\\n          event.preventDefault()\\n          this.hide()\\n        }\\n      })\\n    } else if (!this._isShown) {\\n      $(this._element).off(Event.KEYDOWN_DISMISS)\\n    }\\n  }\\n\\n  _setResizeEvent() {\\n    if (this._isShown) {\\n      $(window).on(Event.RESIZE, (event) => this.handleUpdate(event))\\n    } else {\\n      $(window).off(Event.RESIZE)\\n    }\\n  }\\n\\n  _hideModal() {\\n    this._element.style.display = 'none'\\n    this._element.setAttribute('aria-hidden', true)\\n    this._element.removeAttribute('aria-modal')\\n    this._isTransitioning = false\\n    this._showBackdrop(() => {\\n      $(document.body).removeClass(ClassName.OPEN)\\n      this._resetAdjustments()\\n      this._resetScrollbar()\\n      $(this._element).trigger(Event.HIDDEN)\\n    })\\n  }\\n\\n  _removeBackdrop() {\\n    if (this._backdrop) {\\n      $(this._backdrop).remove()\\n      this._backdrop = null\\n    }\\n  }\\n\\n  _showBackdrop(callback) {\\n    const animate = $(this._element).hasClass(ClassName.FADE)\\n      ? ClassName.FADE : ''\\n\\n    if (this._isShown && this._config.backdrop) {\\n      this._backdrop = document.createElement('div')\\n      this._backdrop.className = ClassName.BACKDROP\\n\\n      if (animate) {\\n        this._backdrop.classList.add(animate)\\n      }\\n\\n      $(this._backdrop).appendTo(document.body)\\n\\n      $(this._element).on(Event.CLICK_DISMISS, (event) => {\\n        if (this._ignoreBackdropClick) {\\n          this._ignoreBackdropClick = false\\n          return\\n        }\\n        if (event.target !== event.currentTarget) {\\n          return\\n        }\\n        if (this._config.backdrop === 'static') {\\n          this._element.focus()\\n        } else {\\n          this.hide()\\n        }\\n      })\\n\\n      if (animate) {\\n        Util.reflow(this._backdrop)\\n      }\\n\\n      $(this._backdrop).addClass(ClassName.SHOW)\\n\\n      if (!callback) {\\n        return\\n      }\\n\\n      if (!animate) {\\n        callback()\\n        return\\n      }\\n\\n      const backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop)\\n\\n      $(this._backdrop)\\n        .one(Util.TRANSITION_END, callback)\\n        .emulateTransitionEnd(backdropTransitionDuration)\\n    } else if (!this._isShown && this._backdrop) {\\n      $(this._backdrop).removeClass(ClassName.SHOW)\\n\\n      const callbackRemove = () => {\\n        this._removeBackdrop()\\n        if (callback) {\\n          callback()\\n        }\\n      }\\n\\n      if ($(this._element).hasClass(ClassName.FADE)) {\\n        const backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop)\\n\\n        $(this._backdrop)\\n          .one(Util.TRANSITION_END, callbackRemove)\\n          .emulateTransitionEnd(backdropTransitionDuration)\\n      } else {\\n        callbackRemove()\\n      }\\n    } else if (callback) {\\n      callback()\\n    }\\n  }\\n\\n  // ----------------------------------------------------------------------\\n  // the following methods are used to handle overflowing modals\\n  // todo (fat): these should probably be refactored out of modal.js\\n  // ----------------------------------------------------------------------\\n\\n  _adjustDialog() {\\n    const isModalOverflowing =\\n      this._element.scrollHeight > document.documentElement.clientHeight\\n\\n    if (!this._isBodyOverflowing && isModalOverflowing) {\\n      this._element.style.paddingLeft = `${this._scrollbarWidth}px`\\n    }\\n\\n    if (this._isBodyOverflowing && !isModalOverflowing) {\\n      this._element.style.paddingRight = `${this._scrollbarWidth}px`\\n    }\\n  }\\n\\n  _resetAdjustments() {\\n    this._element.style.paddingLeft = ''\\n    this._element.style.paddingRight = ''\\n  }\\n\\n  _checkScrollbar() {\\n    const rect = document.body.getBoundingClientRect()\\n    this._isBodyOverflowing = rect.left + rect.right < window.innerWidth\\n    this._scrollbarWidth = this._getScrollbarWidth()\\n  }\\n\\n  _setScrollbar() {\\n    if (this._isBodyOverflowing) {\\n      // Note: DOMNode.style.paddingRight returns the actual value or '' if not set\\n      //   while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set\\n      const fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT))\\n      const stickyContent = [].slice.call(document.querySelectorAll(Selector.STICKY_CONTENT))\\n\\n      // Adjust fixed content padding\\n      $(fixedContent).each((index, element) => {\\n        const actualPadding = element.style.paddingRight\\n        const calculatedPadding = $(element).css('padding-right')\\n        $(element)\\n          .data('padding-right', actualPadding)\\n          .css('padding-right', `${parseFloat(calculatedPadding) + this._scrollbarWidth}px`)\\n      })\\n\\n      // Adjust sticky content margin\\n      $(stickyContent).each((index, element) => {\\n        const actualMargin = element.style.marginRight\\n        const calculatedMargin = $(element).css('margin-right')\\n        $(element)\\n          .data('margin-right', actualMargin)\\n          .css('margin-right', `${parseFloat(calculatedMargin) - this._scrollbarWidth}px`)\\n      })\\n\\n      // Adjust body padding\\n      const actualPadding = document.body.style.paddingRight\\n      const calculatedPadding = $(document.body).css('padding-right')\\n      $(document.body)\\n        .data('padding-right', actualPadding)\\n        .css('padding-right', `${parseFloat(calculatedPadding) + this._scrollbarWidth}px`)\\n    }\\n\\n    $(document.body).addClass(ClassName.OPEN)\\n  }\\n\\n  _resetScrollbar() {\\n    // Restore fixed content padding\\n    const fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT))\\n    $(fixedContent).each((index, element) => {\\n      const padding = $(element).data('padding-right')\\n      $(element).removeData('padding-right')\\n      element.style.paddingRight = padding ? padding : ''\\n    })\\n\\n    // Restore sticky content\\n    const elements = [].slice.call(document.querySelectorAll(`${Selector.STICKY_CONTENT}`))\\n    $(elements).each((index, element) => {\\n      const margin = $(element).data('margin-right')\\n      if (typeof margin !== 'undefined') {\\n        $(element).css('margin-right', margin).removeData('margin-right')\\n      }\\n    })\\n\\n    // Restore body padding\\n    const padding = $(document.body).data('padding-right')\\n    $(document.body).removeData('padding-right')\\n    document.body.style.paddingRight = padding ? padding : ''\\n  }\\n\\n  _getScrollbarWidth() { // thx d.walsh\\n    const scrollDiv = document.createElement('div')\\n    scrollDiv.className = ClassName.SCROLLBAR_MEASURER\\n    document.body.appendChild(scrollDiv)\\n    const scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth\\n    document.body.removeChild(scrollDiv)\\n    return scrollbarWidth\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config, relatedTarget) {\\n    return this.each(function () {\\n      let data = $(this).data(DATA_KEY)\\n      const _config = {\\n        ...Default,\\n        ...$(this).data(),\\n        ...typeof config === 'object' && config ? config : {}\\n      }\\n\\n      if (!data) {\\n        data = new Modal(this, _config)\\n        $(this).data(DATA_KEY, data)\\n      }\\n\\n      if (typeof config === 'string') {\\n        if (typeof data[config] === 'undefined') {\\n          throw new TypeError(`No method named \\\"${config}\\\"`)\\n        }\\n        data[config](relatedTarget)\\n      } else if (_config.show) {\\n        data.show(relatedTarget)\\n      }\\n    })\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Data Api implementation\\n * ------------------------------------------------------------------------\\n */\\n\\n$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\\n  let target\\n  const selector = Util.getSelectorFromElement(this)\\n\\n  if (selector) {\\n    target = document.querySelector(selector)\\n  }\\n\\n  const config = $(target).data(DATA_KEY)\\n    ? 'toggle' : {\\n      ...$(target).data(),\\n      ...$(this).data()\\n    }\\n\\n  if (this.tagName === 'A' || this.tagName === 'AREA') {\\n    event.preventDefault()\\n  }\\n\\n  const $target = $(target).one(Event.SHOW, (showEvent) => {\\n    if (showEvent.isDefaultPrevented()) {\\n      // Only register focus restorer if modal will actually get shown\\n      return\\n    }\\n\\n    $target.one(Event.HIDDEN, () => {\\n      if ($(this).is(':visible')) {\\n        this.focus()\\n      }\\n    })\\n  })\\n\\n  Modal._jQueryInterface.call($(target), config, this)\\n})\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME] = Modal._jQueryInterface\\n$.fn[NAME].Constructor = Modal\\n$.fn[NAME].noConflict = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Modal._jQueryInterface\\n}\\n\\nexport default Modal\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): tools/sanitizer.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nconst uriAttrs = [\\n  'background',\\n  'cite',\\n  'href',\\n  'itemtype',\\n  'longdesc',\\n  'poster',\\n  'src',\\n  'xlink:href'\\n]\\n\\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\\\w-]*$/i\\n\\nexport const DefaultWhitelist = {\\n  // Global attributes allowed on any supplied element below.\\n  '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\\n  a: ['target', 'href', 'title', 'rel'],\\n  area: [],\\n  b: [],\\n  br: [],\\n  col: [],\\n  code: [],\\n  div: [],\\n  em: [],\\n  hr: [],\\n  h1: [],\\n  h2: [],\\n  h3: [],\\n  h4: [],\\n  h5: [],\\n  h6: [],\\n  i: [],\\n  img: ['src', 'alt', 'title', 'width', 'height'],\\n  li: [],\\n  ol: [],\\n  p: [],\\n  pre: [],\\n  s: [],\\n  small: [],\\n  span: [],\\n  sub: [],\\n  sup: [],\\n  strong: [],\\n  u: [],\\n  ul: []\\n}\\n\\n/**\\n * A pattern that recognizes a commonly useful subset of URLs that are safe.\\n *\\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\\n */\\nconst SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi\\n\\n/**\\n * A pattern that matches safe data URLs. Only matches image, video and audio types.\\n *\\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\\n */\\nconst DATA_URL_PATTERN = /^data:(?:image\\\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\\\/(?:mpeg|mp4|ogg|webm)|audio\\\\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i\\n\\nfunction allowedAttribute(attr, allowedAttributeList) {\\n  const attrName = attr.nodeName.toLowerCase()\\n\\n  if (allowedAttributeList.indexOf(attrName) !== -1) {\\n    if (uriAttrs.indexOf(attrName) !== -1) {\\n      return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN))\\n    }\\n\\n    return true\\n  }\\n\\n  const regExp = allowedAttributeList.filter((attrRegex) => attrRegex instanceof RegExp)\\n\\n  // Check if a regular expression validates the attribute.\\n  for (let i = 0, l = regExp.length; i < l; i++) {\\n    if (attrName.match(regExp[i])) {\\n      return true\\n    }\\n  }\\n\\n  return false\\n}\\n\\nexport function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {\\n  if (unsafeHtml.length === 0) {\\n    return unsafeHtml\\n  }\\n\\n  if (sanitizeFn && typeof sanitizeFn === 'function') {\\n    return sanitizeFn(unsafeHtml)\\n  }\\n\\n  const domParser = new window.DOMParser()\\n  const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\\n  const whitelistKeys = Object.keys(whiteList)\\n  const elements = [].slice.call(createdDocument.body.querySelectorAll('*'))\\n\\n  for (let i = 0, len = elements.length; i < len; i++) {\\n    const el = elements[i]\\n    const elName = el.nodeName.toLowerCase()\\n\\n    if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) {\\n      el.parentNode.removeChild(el)\\n\\n      continue\\n    }\\n\\n    const attributeList = [].slice.call(el.attributes)\\n    const whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || [])\\n\\n    attributeList.forEach((attr) => {\\n      if (!allowedAttribute(attr, whitelistedAttributes)) {\\n        el.removeAttribute(attr.nodeName)\\n      }\\n    })\\n  }\\n\\n  return createdDocument.body.innerHTML\\n}\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): tooltip.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport {\\n  DefaultWhitelist,\\n  sanitizeHtml\\n} from './tools/sanitizer'\\nimport $ from 'jquery'\\nimport Popper from 'popper.js'\\nimport Util from './util'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME                  = 'tooltip'\\nconst VERSION               = '4.3.1'\\nconst DATA_KEY              = 'bs.tooltip'\\nconst EVENT_KEY             = `.${DATA_KEY}`\\nconst JQUERY_NO_CONFLICT    = $.fn[NAME]\\nconst CLASS_PREFIX          = 'bs-tooltip'\\nconst BSCLS_PREFIX_REGEX    = new RegExp(`(^|\\\\\\\\s)${CLASS_PREFIX}\\\\\\\\S+`, 'g')\\nconst DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']\\n\\nconst DefaultType = {\\n  animation         : 'boolean',\\n  template          : 'string',\\n  title             : '(string|element|function)',\\n  trigger           : 'string',\\n  delay             : '(number|object)',\\n  html              : 'boolean',\\n  selector          : '(string|boolean)',\\n  placement         : '(string|function)',\\n  offset            : '(number|string|function)',\\n  container         : '(string|element|boolean)',\\n  fallbackPlacement : '(string|array)',\\n  boundary          : '(string|element)',\\n  sanitize          : 'boolean',\\n  sanitizeFn        : '(null|function)',\\n  whiteList         : 'object'\\n}\\n\\nconst AttachmentMap = {\\n  AUTO   : 'auto',\\n  TOP    : 'top',\\n  RIGHT  : 'right',\\n  BOTTOM : 'bottom',\\n  LEFT   : 'left'\\n}\\n\\nconst Default = {\\n  animation         : true,\\n  template          : '<div class=\\\"tooltip\\\" role=\\\"tooltip\\\">' +\\n                    '<div class=\\\"arrow\\\"></div>' +\\n                    '<div class=\\\"tooltip-inner\\\"></div></div>',\\n  trigger           : 'hover focus',\\n  title             : '',\\n  delay             : 0,\\n  html              : false,\\n  selector          : false,\\n  placement         : 'top',\\n  offset            : 0,\\n  container         : false,\\n  fallbackPlacement : 'flip',\\n  boundary          : 'scrollParent',\\n  sanitize          : true,\\n  sanitizeFn        : null,\\n  whiteList         : DefaultWhitelist\\n}\\n\\nconst HoverState = {\\n  SHOW : 'show',\\n  OUT  : 'out'\\n}\\n\\nconst Event = {\\n  HIDE       : `hide${EVENT_KEY}`,\\n  HIDDEN     : `hidden${EVENT_KEY}`,\\n  SHOW       : `show${EVENT_KEY}`,\\n  SHOWN      : `shown${EVENT_KEY}`,\\n  INSERTED   : `inserted${EVENT_KEY}`,\\n  CLICK      : `click${EVENT_KEY}`,\\n  FOCUSIN    : `focusin${EVENT_KEY}`,\\n  FOCUSOUT   : `focusout${EVENT_KEY}`,\\n  MOUSEENTER : `mouseenter${EVENT_KEY}`,\\n  MOUSELEAVE : `mouseleave${EVENT_KEY}`\\n}\\n\\nconst ClassName = {\\n  FADE : 'fade',\\n  SHOW : 'show'\\n}\\n\\nconst Selector = {\\n  TOOLTIP       : '.tooltip',\\n  TOOLTIP_INNER : '.tooltip-inner',\\n  ARROW         : '.arrow'\\n}\\n\\nconst Trigger = {\\n  HOVER  : 'hover',\\n  FOCUS  : 'focus',\\n  CLICK  : 'click',\\n  MANUAL : 'manual'\\n}\\n\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass Tooltip {\\n  constructor(element, config) {\\n    /**\\n     * Check for Popper dependency\\n     * Popper - https://popper.js.org\\n     */\\n    if (typeof Popper === 'undefined') {\\n      throw new TypeError('Bootstrap\\\\'s tooltips require Popper.js (https://popper.js.org/)')\\n    }\\n\\n    // private\\n    this._isEnabled     = true\\n    this._timeout       = 0\\n    this._hoverState    = ''\\n    this._activeTrigger = {}\\n    this._popper        = null\\n\\n    // Protected\\n    this.element = element\\n    this.config  = this._getConfig(config)\\n    this.tip     = null\\n\\n    this._setListeners()\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  static get Default() {\\n    return Default\\n  }\\n\\n  static get NAME() {\\n    return NAME\\n  }\\n\\n  static get DATA_KEY() {\\n    return DATA_KEY\\n  }\\n\\n  static get Event() {\\n    return Event\\n  }\\n\\n  static get EVENT_KEY() {\\n    return EVENT_KEY\\n  }\\n\\n  static get DefaultType() {\\n    return DefaultType\\n  }\\n\\n  // Public\\n\\n  enable() {\\n    this._isEnabled = true\\n  }\\n\\n  disable() {\\n    this._isEnabled = false\\n  }\\n\\n  toggleEnabled() {\\n    this._isEnabled = !this._isEnabled\\n  }\\n\\n  toggle(event) {\\n    if (!this._isEnabled) {\\n      return\\n    }\\n\\n    if (event) {\\n      const dataKey = this.constructor.DATA_KEY\\n      let context = $(event.currentTarget).data(dataKey)\\n\\n      if (!context) {\\n        context = new this.constructor(\\n          event.currentTarget,\\n          this._getDelegateConfig()\\n        )\\n        $(event.currentTarget).data(dataKey, context)\\n      }\\n\\n      context._activeTrigger.click = !context._activeTrigger.click\\n\\n      if (context._isWithActiveTrigger()) {\\n        context._enter(null, context)\\n      } else {\\n        context._leave(null, context)\\n      }\\n    } else {\\n      if ($(this.getTipElement()).hasClass(ClassName.SHOW)) {\\n        this._leave(null, this)\\n        return\\n      }\\n\\n      this._enter(null, this)\\n    }\\n  }\\n\\n  dispose() {\\n    clearTimeout(this._timeout)\\n\\n    $.removeData(this.element, this.constructor.DATA_KEY)\\n\\n    $(this.element).off(this.constructor.EVENT_KEY)\\n    $(this.element).closest('.modal').off('hide.bs.modal')\\n\\n    if (this.tip) {\\n      $(this.tip).remove()\\n    }\\n\\n    this._isEnabled     = null\\n    this._timeout       = null\\n    this._hoverState    = null\\n    this._activeTrigger = null\\n    if (this._popper !== null) {\\n      this._popper.destroy()\\n    }\\n\\n    this._popper = null\\n    this.element = null\\n    this.config  = null\\n    this.tip     = null\\n  }\\n\\n  show() {\\n    if ($(this.element).css('display') === 'none') {\\n      throw new Error('Please use show on visible elements')\\n    }\\n\\n    const showEvent = $.Event(this.constructor.Event.SHOW)\\n    if (this.isWithContent() && this._isEnabled) {\\n      $(this.element).trigger(showEvent)\\n\\n      const shadowRoot = Util.findShadowRoot(this.element)\\n      const isInTheDom = $.contains(\\n        shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement,\\n        this.element\\n      )\\n\\n      if (showEvent.isDefaultPrevented() || !isInTheDom) {\\n        return\\n      }\\n\\n      const tip   = this.getTipElement()\\n      const tipId = Util.getUID(this.constructor.NAME)\\n\\n      tip.setAttribute('id', tipId)\\n      this.element.setAttribute('aria-describedby', tipId)\\n\\n      this.setContent()\\n\\n      if (this.config.animation) {\\n        $(tip).addClass(ClassName.FADE)\\n      }\\n\\n      const placement  = typeof this.config.placement === 'function'\\n        ? this.config.placement.call(this, tip, this.element)\\n        : this.config.placement\\n\\n      const attachment = this._getAttachment(placement)\\n      this.addAttachmentClass(attachment)\\n\\n      const container = this._getContainer()\\n      $(tip).data(this.constructor.DATA_KEY, this)\\n\\n      if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) {\\n        $(tip).appendTo(container)\\n      }\\n\\n      $(this.element).trigger(this.constructor.Event.INSERTED)\\n\\n      this._popper = new Popper(this.element, tip, {\\n        placement: attachment,\\n        modifiers: {\\n          offset: this._getOffset(),\\n          flip: {\\n            behavior: this.config.fallbackPlacement\\n          },\\n          arrow: {\\n            element: Selector.ARROW\\n          },\\n          preventOverflow: {\\n            boundariesElement: this.config.boundary\\n          }\\n        },\\n        onCreate: (data) => {\\n          if (data.originalPlacement !== data.placement) {\\n            this._handlePopperPlacementChange(data)\\n          }\\n        },\\n        onUpdate: (data) => this._handlePopperPlacementChange(data)\\n      })\\n\\n      $(tip).addClass(ClassName.SHOW)\\n\\n      // If this is a touch-enabled device we add extra\\n      // empty mouseover listeners to the body's immediate children;\\n      // only needed because of broken event delegation on iOS\\n      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\\n      if ('ontouchstart' in document.documentElement) {\\n        $(document.body).children().on('mouseover', null, $.noop)\\n      }\\n\\n      const complete = () => {\\n        if (this.config.animation) {\\n          this._fixTransition()\\n        }\\n        const prevHoverState = this._hoverState\\n        this._hoverState     = null\\n\\n        $(this.element).trigger(this.constructor.Event.SHOWN)\\n\\n        if (prevHoverState === HoverState.OUT) {\\n          this._leave(null, this)\\n        }\\n      }\\n\\n      if ($(this.tip).hasClass(ClassName.FADE)) {\\n        const transitionDuration = Util.getTransitionDurationFromElement(this.tip)\\n\\n        $(this.tip)\\n          .one(Util.TRANSITION_END, complete)\\n          .emulateTransitionEnd(transitionDuration)\\n      } else {\\n        complete()\\n      }\\n    }\\n  }\\n\\n  hide(callback) {\\n    const tip       = this.getTipElement()\\n    const hideEvent = $.Event(this.constructor.Event.HIDE)\\n    const complete = () => {\\n      if (this._hoverState !== HoverState.SHOW && tip.parentNode) {\\n        tip.parentNode.removeChild(tip)\\n      }\\n\\n      this._cleanTipClass()\\n      this.element.removeAttribute('aria-describedby')\\n      $(this.element).trigger(this.constructor.Event.HIDDEN)\\n      if (this._popper !== null) {\\n        this._popper.destroy()\\n      }\\n\\n      if (callback) {\\n        callback()\\n      }\\n    }\\n\\n    $(this.element).trigger(hideEvent)\\n\\n    if (hideEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    $(tip).removeClass(ClassName.SHOW)\\n\\n    // If this is a touch-enabled device we remove the extra\\n    // empty mouseover listeners we added for iOS support\\n    if ('ontouchstart' in document.documentElement) {\\n      $(document.body).children().off('mouseover', null, $.noop)\\n    }\\n\\n    this._activeTrigger[Trigger.CLICK] = false\\n    this._activeTrigger[Trigger.FOCUS] = false\\n    this._activeTrigger[Trigger.HOVER] = false\\n\\n    if ($(this.tip).hasClass(ClassName.FADE)) {\\n      const transitionDuration = Util.getTransitionDurationFromElement(tip)\\n\\n      $(tip)\\n        .one(Util.TRANSITION_END, complete)\\n        .emulateTransitionEnd(transitionDuration)\\n    } else {\\n      complete()\\n    }\\n\\n    this._hoverState = ''\\n  }\\n\\n  update() {\\n    if (this._popper !== null) {\\n      this._popper.scheduleUpdate()\\n    }\\n  }\\n\\n  // Protected\\n\\n  isWithContent() {\\n    return Boolean(this.getTitle())\\n  }\\n\\n  addAttachmentClass(attachment) {\\n    $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)\\n  }\\n\\n  getTipElement() {\\n    this.tip = this.tip || $(this.config.template)[0]\\n    return this.tip\\n  }\\n\\n  setContent() {\\n    const tip = this.getTipElement()\\n    this.setElementContent($(tip.querySelectorAll(Selector.TOOLTIP_INNER)), this.getTitle())\\n    $(tip).removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)\\n  }\\n\\n  setElementContent($element, content) {\\n    if (typeof content === 'object' && (content.nodeType || content.jquery)) {\\n      // Content is a DOM node or a jQuery\\n      if (this.config.html) {\\n        if (!$(content).parent().is($element)) {\\n          $element.empty().append(content)\\n        }\\n      } else {\\n        $element.text($(content).text())\\n      }\\n\\n      return\\n    }\\n\\n    if (this.config.html) {\\n      if (this.config.sanitize) {\\n        content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn)\\n      }\\n\\n      $element.html(content)\\n    } else {\\n      $element.text(content)\\n    }\\n  }\\n\\n  getTitle() {\\n    let title = this.element.getAttribute('data-original-title')\\n\\n    if (!title) {\\n      title = typeof this.config.title === 'function'\\n        ? this.config.title.call(this.element)\\n        : this.config.title\\n    }\\n\\n    return title\\n  }\\n\\n  // Private\\n\\n  _getOffset() {\\n    const offset = {}\\n\\n    if (typeof this.config.offset === 'function') {\\n      offset.fn = (data) => {\\n        data.offsets = {\\n          ...data.offsets,\\n          ...this.config.offset(data.offsets, this.element) || {}\\n        }\\n\\n        return data\\n      }\\n    } else {\\n      offset.offset = this.config.offset\\n    }\\n\\n    return offset\\n  }\\n\\n  _getContainer() {\\n    if (this.config.container === false) {\\n      return document.body\\n    }\\n\\n    if (Util.isElement(this.config.container)) {\\n      return $(this.config.container)\\n    }\\n\\n    return $(document).find(this.config.container)\\n  }\\n\\n  _getAttachment(placement) {\\n    return AttachmentMap[placement.toUpperCase()]\\n  }\\n\\n  _setListeners() {\\n    const triggers = this.config.trigger.split(' ')\\n\\n    triggers.forEach((trigger) => {\\n      if (trigger === 'click') {\\n        $(this.element).on(\\n          this.constructor.Event.CLICK,\\n          this.config.selector,\\n          (event) => this.toggle(event)\\n        )\\n      } else if (trigger !== Trigger.MANUAL) {\\n        const eventIn = trigger === Trigger.HOVER\\n          ? this.constructor.Event.MOUSEENTER\\n          : this.constructor.Event.FOCUSIN\\n        const eventOut = trigger === Trigger.HOVER\\n          ? this.constructor.Event.MOUSELEAVE\\n          : this.constructor.Event.FOCUSOUT\\n\\n        $(this.element)\\n          .on(\\n            eventIn,\\n            this.config.selector,\\n            (event) => this._enter(event)\\n          )\\n          .on(\\n            eventOut,\\n            this.config.selector,\\n            (event) => this._leave(event)\\n          )\\n      }\\n    })\\n\\n    $(this.element).closest('.modal').on(\\n      'hide.bs.modal',\\n      () => {\\n        if (this.element) {\\n          this.hide()\\n        }\\n      }\\n    )\\n\\n    if (this.config.selector) {\\n      this.config = {\\n        ...this.config,\\n        trigger: 'manual',\\n        selector: ''\\n      }\\n    } else {\\n      this._fixTitle()\\n    }\\n  }\\n\\n  _fixTitle() {\\n    const titleType = typeof this.element.getAttribute('data-original-title')\\n\\n    if (this.element.getAttribute('title') || titleType !== 'string') {\\n      this.element.setAttribute(\\n        'data-original-title',\\n        this.element.getAttribute('title') || ''\\n      )\\n\\n      this.element.setAttribute('title', '')\\n    }\\n  }\\n\\n  _enter(event, context) {\\n    const dataKey = this.constructor.DATA_KEY\\n    context = context || $(event.currentTarget).data(dataKey)\\n\\n    if (!context) {\\n      context = new this.constructor(\\n        event.currentTarget,\\n        this._getDelegateConfig()\\n      )\\n      $(event.currentTarget).data(dataKey, context)\\n    }\\n\\n    if (event) {\\n      context._activeTrigger[\\n        event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER\\n      ] = true\\n    }\\n\\n    if ($(context.getTipElement()).hasClass(ClassName.SHOW) || context._hoverState === HoverState.SHOW) {\\n      context._hoverState = HoverState.SHOW\\n      return\\n    }\\n\\n    clearTimeout(context._timeout)\\n\\n    context._hoverState = HoverState.SHOW\\n\\n    if (!context.config.delay || !context.config.delay.show) {\\n      context.show()\\n      return\\n    }\\n\\n    context._timeout = setTimeout(() => {\\n      if (context._hoverState === HoverState.SHOW) {\\n        context.show()\\n      }\\n    }, context.config.delay.show)\\n  }\\n\\n  _leave(event, context) {\\n    const dataKey = this.constructor.DATA_KEY\\n    context = context || $(event.currentTarget).data(dataKey)\\n\\n    if (!context) {\\n      context = new this.constructor(\\n        event.currentTarget,\\n        this._getDelegateConfig()\\n      )\\n      $(event.currentTarget).data(dataKey, context)\\n    }\\n\\n    if (event) {\\n      context._activeTrigger[\\n        event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER\\n      ] = false\\n    }\\n\\n    if (context._isWithActiveTrigger()) {\\n      return\\n    }\\n\\n    clearTimeout(context._timeout)\\n\\n    context._hoverState = HoverState.OUT\\n\\n    if (!context.config.delay || !context.config.delay.hide) {\\n      context.hide()\\n      return\\n    }\\n\\n    context._timeout = setTimeout(() => {\\n      if (context._hoverState === HoverState.OUT) {\\n        context.hide()\\n      }\\n    }, context.config.delay.hide)\\n  }\\n\\n  _isWithActiveTrigger() {\\n    for (const trigger in this._activeTrigger) {\\n      if (this._activeTrigger[trigger]) {\\n        return true\\n      }\\n    }\\n\\n    return false\\n  }\\n\\n  _getConfig(config) {\\n    const dataAttributes = $(this.element).data()\\n\\n    Object.keys(dataAttributes)\\n      .forEach((dataAttr) => {\\n        if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {\\n          delete dataAttributes[dataAttr]\\n        }\\n      })\\n\\n    config = {\\n      ...this.constructor.Default,\\n      ...dataAttributes,\\n      ...typeof config === 'object' && config ? config : {}\\n    }\\n\\n    if (typeof config.delay === 'number') {\\n      config.delay = {\\n        show: config.delay,\\n        hide: config.delay\\n      }\\n    }\\n\\n    if (typeof config.title === 'number') {\\n      config.title = config.title.toString()\\n    }\\n\\n    if (typeof config.content === 'number') {\\n      config.content = config.content.toString()\\n    }\\n\\n    Util.typeCheckConfig(\\n      NAME,\\n      config,\\n      this.constructor.DefaultType\\n    )\\n\\n    if (config.sanitize) {\\n      config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn)\\n    }\\n\\n    return config\\n  }\\n\\n  _getDelegateConfig() {\\n    const config = {}\\n\\n    if (this.config) {\\n      for (const key in this.config) {\\n        if (this.constructor.Default[key] !== this.config[key]) {\\n          config[key] = this.config[key]\\n        }\\n      }\\n    }\\n\\n    return config\\n  }\\n\\n  _cleanTipClass() {\\n    const $tip = $(this.getTipElement())\\n    const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)\\n    if (tabClass !== null && tabClass.length) {\\n      $tip.removeClass(tabClass.join(''))\\n    }\\n  }\\n\\n  _handlePopperPlacementChange(popperData) {\\n    const popperInstance = popperData.instance\\n    this.tip = popperInstance.popper\\n    this._cleanTipClass()\\n    this.addAttachmentClass(this._getAttachment(popperData.placement))\\n  }\\n\\n  _fixTransition() {\\n    const tip = this.getTipElement()\\n    const initConfigAnimation = this.config.animation\\n\\n    if (tip.getAttribute('x-placement') !== null) {\\n      return\\n    }\\n\\n    $(tip).removeClass(ClassName.FADE)\\n    this.config.animation = false\\n    this.hide()\\n    this.show()\\n    this.config.animation = initConfigAnimation\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      let data = $(this).data(DATA_KEY)\\n      const _config = typeof config === 'object' && config\\n\\n      if (!data && /dispose|hide/.test(config)) {\\n        return\\n      }\\n\\n      if (!data) {\\n        data = new Tooltip(this, _config)\\n        $(this).data(DATA_KEY, data)\\n      }\\n\\n      if (typeof config === 'string') {\\n        if (typeof data[config] === 'undefined') {\\n          throw new TypeError(`No method named \\\"${config}\\\"`)\\n        }\\n        data[config]()\\n      }\\n    })\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME] = Tooltip._jQueryInterface\\n$.fn[NAME].Constructor = Tooltip\\n$.fn[NAME].noConflict = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Tooltip._jQueryInterface\\n}\\n\\nexport default Tooltip\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): popover.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\nimport Tooltip from './tooltip'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME                = 'popover'\\nconst VERSION             = '4.3.1'\\nconst DATA_KEY            = 'bs.popover'\\nconst EVENT_KEY           = `.${DATA_KEY}`\\nconst JQUERY_NO_CONFLICT  = $.fn[NAME]\\nconst CLASS_PREFIX        = 'bs-popover'\\nconst BSCLS_PREFIX_REGEX  = new RegExp(`(^|\\\\\\\\s)${CLASS_PREFIX}\\\\\\\\S+`, 'g')\\n\\nconst Default = {\\n  ...Tooltip.Default,\\n  placement : 'right',\\n  trigger   : 'click',\\n  content   : '',\\n  template  : '<div class=\\\"popover\\\" role=\\\"tooltip\\\">' +\\n              '<div class=\\\"arrow\\\"></div>' +\\n              '<h3 class=\\\"popover-header\\\"></h3>' +\\n              '<div class=\\\"popover-body\\\"></div></div>'\\n}\\n\\nconst DefaultType = {\\n  ...Tooltip.DefaultType,\\n  content : '(string|element|function)'\\n}\\n\\nconst ClassName = {\\n  FADE : 'fade',\\n  SHOW : 'show'\\n}\\n\\nconst Selector = {\\n  TITLE   : '.popover-header',\\n  CONTENT : '.popover-body'\\n}\\n\\nconst Event = {\\n  HIDE       : `hide${EVENT_KEY}`,\\n  HIDDEN     : `hidden${EVENT_KEY}`,\\n  SHOW       : `show${EVENT_KEY}`,\\n  SHOWN      : `shown${EVENT_KEY}`,\\n  INSERTED   : `inserted${EVENT_KEY}`,\\n  CLICK      : `click${EVENT_KEY}`,\\n  FOCUSIN    : `focusin${EVENT_KEY}`,\\n  FOCUSOUT   : `focusout${EVENT_KEY}`,\\n  MOUSEENTER : `mouseenter${EVENT_KEY}`,\\n  MOUSELEAVE : `mouseleave${EVENT_KEY}`\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass Popover extends Tooltip {\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  static get Default() {\\n    return Default\\n  }\\n\\n  static get NAME() {\\n    return NAME\\n  }\\n\\n  static get DATA_KEY() {\\n    return DATA_KEY\\n  }\\n\\n  static get Event() {\\n    return Event\\n  }\\n\\n  static get EVENT_KEY() {\\n    return EVENT_KEY\\n  }\\n\\n  static get DefaultType() {\\n    return DefaultType\\n  }\\n\\n  // Overrides\\n\\n  isWithContent() {\\n    return this.getTitle() || this._getContent()\\n  }\\n\\n  addAttachmentClass(attachment) {\\n    $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)\\n  }\\n\\n  getTipElement() {\\n    this.tip = this.tip || $(this.config.template)[0]\\n    return this.tip\\n  }\\n\\n  setContent() {\\n    const $tip = $(this.getTipElement())\\n\\n    // We use append for html objects to maintain js events\\n    this.setElementContent($tip.find(Selector.TITLE), this.getTitle())\\n    let content = this._getContent()\\n    if (typeof content === 'function') {\\n      content = content.call(this.element)\\n    }\\n    this.setElementContent($tip.find(Selector.CONTENT), content)\\n\\n    $tip.removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)\\n  }\\n\\n  // Private\\n\\n  _getContent() {\\n    return this.element.getAttribute('data-content') ||\\n      this.config.content\\n  }\\n\\n  _cleanTipClass() {\\n    const $tip = $(this.getTipElement())\\n    const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)\\n    if (tabClass !== null && tabClass.length > 0) {\\n      $tip.removeClass(tabClass.join(''))\\n    }\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      let data = $(this).data(DATA_KEY)\\n      const _config = typeof config === 'object' ? config : null\\n\\n      if (!data && /dispose|hide/.test(config)) {\\n        return\\n      }\\n\\n      if (!data) {\\n        data = new Popover(this, _config)\\n        $(this).data(DATA_KEY, data)\\n      }\\n\\n      if (typeof config === 'string') {\\n        if (typeof data[config] === 'undefined') {\\n          throw new TypeError(`No method named \\\"${config}\\\"`)\\n        }\\n        data[config]()\\n      }\\n    })\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME] = Popover._jQueryInterface\\n$.fn[NAME].Constructor = Popover\\n$.fn[NAME].noConflict = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Popover._jQueryInterface\\n}\\n\\nexport default Popover\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): scrollspy.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\nimport Util from './util'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME               = 'scrollspy'\\nconst VERSION            = '4.3.1'\\nconst DATA_KEY           = 'bs.scrollspy'\\nconst EVENT_KEY          = `.${DATA_KEY}`\\nconst DATA_API_KEY       = '.data-api'\\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\\n\\nconst Default = {\\n  offset : 10,\\n  method : 'auto',\\n  target : ''\\n}\\n\\nconst DefaultType = {\\n  offset : 'number',\\n  method : 'string',\\n  target : '(string|element)'\\n}\\n\\nconst Event = {\\n  ACTIVATE      : `activate${EVENT_KEY}`,\\n  SCROLL        : `scroll${EVENT_KEY}`,\\n  LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`\\n}\\n\\nconst ClassName = {\\n  DROPDOWN_ITEM : 'dropdown-item',\\n  DROPDOWN_MENU : 'dropdown-menu',\\n  ACTIVE        : 'active'\\n}\\n\\nconst Selector = {\\n  DATA_SPY        : '[data-spy=\\\"scroll\\\"]',\\n  ACTIVE          : '.active',\\n  NAV_LIST_GROUP  : '.nav, .list-group',\\n  NAV_LINKS       : '.nav-link',\\n  NAV_ITEMS       : '.nav-item',\\n  LIST_ITEMS      : '.list-group-item',\\n  DROPDOWN        : '.dropdown',\\n  DROPDOWN_ITEMS  : '.dropdown-item',\\n  DROPDOWN_TOGGLE : '.dropdown-toggle'\\n}\\n\\nconst OffsetMethod = {\\n  OFFSET   : 'offset',\\n  POSITION : 'position'\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass ScrollSpy {\\n  constructor(element, config) {\\n    this._element       = element\\n    this._scrollElement = element.tagName === 'BODY' ? window : element\\n    this._config        = this._getConfig(config)\\n    this._selector      = `${this._config.target} ${Selector.NAV_LINKS},` +\\n                          `${this._config.target} ${Selector.LIST_ITEMS},` +\\n                          `${this._config.target} ${Selector.DROPDOWN_ITEMS}`\\n    this._offsets       = []\\n    this._targets       = []\\n    this._activeTarget  = null\\n    this._scrollHeight  = 0\\n\\n    $(this._scrollElement).on(Event.SCROLL, (event) => this._process(event))\\n\\n    this.refresh()\\n    this._process()\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  static get Default() {\\n    return Default\\n  }\\n\\n  // Public\\n\\n  refresh() {\\n    const autoMethod = this._scrollElement === this._scrollElement.window\\n      ? OffsetMethod.OFFSET : OffsetMethod.POSITION\\n\\n    const offsetMethod = this._config.method === 'auto'\\n      ? autoMethod : this._config.method\\n\\n    const offsetBase = offsetMethod === OffsetMethod.POSITION\\n      ? this._getScrollTop() : 0\\n\\n    this._offsets = []\\n    this._targets = []\\n\\n    this._scrollHeight = this._getScrollHeight()\\n\\n    const targets = [].slice.call(document.querySelectorAll(this._selector))\\n\\n    targets\\n      .map((element) => {\\n        let target\\n        const targetSelector = Util.getSelectorFromElement(element)\\n\\n        if (targetSelector) {\\n          target = document.querySelector(targetSelector)\\n        }\\n\\n        if (target) {\\n          const targetBCR = target.getBoundingClientRect()\\n          if (targetBCR.width || targetBCR.height) {\\n            // TODO (fat): remove sketch reliance on jQuery position/offset\\n            return [\\n              $(target)[offsetMethod]().top + offsetBase,\\n              targetSelector\\n            ]\\n          }\\n        }\\n        return null\\n      })\\n      .filter((item) => item)\\n      .sort((a, b) => a[0] - b[0])\\n      .forEach((item) => {\\n        this._offsets.push(item[0])\\n        this._targets.push(item[1])\\n      })\\n  }\\n\\n  dispose() {\\n    $.removeData(this._element, DATA_KEY)\\n    $(this._scrollElement).off(EVENT_KEY)\\n\\n    this._element       = null\\n    this._scrollElement = null\\n    this._config        = null\\n    this._selector      = null\\n    this._offsets       = null\\n    this._targets       = null\\n    this._activeTarget  = null\\n    this._scrollHeight  = null\\n  }\\n\\n  // Private\\n\\n  _getConfig(config) {\\n    config = {\\n      ...Default,\\n      ...typeof config === 'object' && config ? config : {}\\n    }\\n\\n    if (typeof config.target !== 'string') {\\n      let id = $(config.target).attr('id')\\n      if (!id) {\\n        id = Util.getUID(NAME)\\n        $(config.target).attr('id', id)\\n      }\\n      config.target = `#${id}`\\n    }\\n\\n    Util.typeCheckConfig(NAME, config, DefaultType)\\n\\n    return config\\n  }\\n\\n  _getScrollTop() {\\n    return this._scrollElement === window\\n      ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop\\n  }\\n\\n  _getScrollHeight() {\\n    return this._scrollElement.scrollHeight || Math.max(\\n      document.body.scrollHeight,\\n      document.documentElement.scrollHeight\\n    )\\n  }\\n\\n  _getOffsetHeight() {\\n    return this._scrollElement === window\\n      ? window.innerHeight : this._scrollElement.getBoundingClientRect().height\\n  }\\n\\n  _process() {\\n    const scrollTop    = this._getScrollTop() + this._config.offset\\n    const scrollHeight = this._getScrollHeight()\\n    const maxScroll    = this._config.offset +\\n      scrollHeight -\\n      this._getOffsetHeight()\\n\\n    if (this._scrollHeight !== scrollHeight) {\\n      this.refresh()\\n    }\\n\\n    if (scrollTop >= maxScroll) {\\n      const target = this._targets[this._targets.length - 1]\\n\\n      if (this._activeTarget !== target) {\\n        this._activate(target)\\n      }\\n      return\\n    }\\n\\n    if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\\n      this._activeTarget = null\\n      this._clear()\\n      return\\n    }\\n\\n    const offsetLength = this._offsets.length\\n    for (let i = offsetLength; i--;) {\\n      const isActiveTarget = this._activeTarget !== this._targets[i] &&\\n          scrollTop >= this._offsets[i] &&\\n          (typeof this._offsets[i + 1] === 'undefined' ||\\n              scrollTop < this._offsets[i + 1])\\n\\n      if (isActiveTarget) {\\n        this._activate(this._targets[i])\\n      }\\n    }\\n  }\\n\\n  _activate(target) {\\n    this._activeTarget = target\\n\\n    this._clear()\\n\\n    const queries = this._selector\\n      .split(',')\\n      .map((selector) => `${selector}[data-target=\\\"${target}\\\"],${selector}[href=\\\"${target}\\\"]`)\\n\\n    const $link = $([].slice.call(document.querySelectorAll(queries.join(','))))\\n\\n    if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {\\n      $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE)\\n      $link.addClass(ClassName.ACTIVE)\\n    } else {\\n      // Set triggered link as active\\n      $link.addClass(ClassName.ACTIVE)\\n      // Set triggered links parents as active\\n      // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\\n      $link.parents(Selector.NAV_LIST_GROUP).prev(`${Selector.NAV_LINKS}, ${Selector.LIST_ITEMS}`).addClass(ClassName.ACTIVE)\\n      // Handle special case when .nav-link is inside .nav-item\\n      $link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_ITEMS).children(Selector.NAV_LINKS).addClass(ClassName.ACTIVE)\\n    }\\n\\n    $(this._scrollElement).trigger(Event.ACTIVATE, {\\n      relatedTarget: target\\n    })\\n  }\\n\\n  _clear() {\\n    [].slice.call(document.querySelectorAll(this._selector))\\n      .filter((node) => node.classList.contains(ClassName.ACTIVE))\\n      .forEach((node) => node.classList.remove(ClassName.ACTIVE))\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      let data = $(this).data(DATA_KEY)\\n      const _config = typeof config === 'object' && config\\n\\n      if (!data) {\\n        data = new ScrollSpy(this, _config)\\n        $(this).data(DATA_KEY, data)\\n      }\\n\\n      if (typeof config === 'string') {\\n        if (typeof data[config] === 'undefined') {\\n          throw new TypeError(`No method named \\\"${config}\\\"`)\\n        }\\n        data[config]()\\n      }\\n    })\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Data Api implementation\\n * ------------------------------------------------------------------------\\n */\\n\\n$(window).on(Event.LOAD_DATA_API, () => {\\n  const scrollSpys = [].slice.call(document.querySelectorAll(Selector.DATA_SPY))\\n  const scrollSpysLength = scrollSpys.length\\n\\n  for (let i = scrollSpysLength; i--;) {\\n    const $spy = $(scrollSpys[i])\\n    ScrollSpy._jQueryInterface.call($spy, $spy.data())\\n  }\\n})\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME] = ScrollSpy._jQueryInterface\\n$.fn[NAME].Constructor = ScrollSpy\\n$.fn[NAME].noConflict = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return ScrollSpy._jQueryInterface\\n}\\n\\nexport default ScrollSpy\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): tab.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\nimport Util from './util'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME               = 'tab'\\nconst VERSION            = '4.3.1'\\nconst DATA_KEY           = 'bs.tab'\\nconst EVENT_KEY          = `.${DATA_KEY}`\\nconst DATA_API_KEY       = '.data-api'\\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\\n\\nconst Event = {\\n  HIDE           : `hide${EVENT_KEY}`,\\n  HIDDEN         : `hidden${EVENT_KEY}`,\\n  SHOW           : `show${EVENT_KEY}`,\\n  SHOWN          : `shown${EVENT_KEY}`,\\n  CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\\n}\\n\\nconst ClassName = {\\n  DROPDOWN_MENU : 'dropdown-menu',\\n  ACTIVE        : 'active',\\n  DISABLED      : 'disabled',\\n  FADE          : 'fade',\\n  SHOW          : 'show'\\n}\\n\\nconst Selector = {\\n  DROPDOWN              : '.dropdown',\\n  NAV_LIST_GROUP        : '.nav, .list-group',\\n  ACTIVE                : '.active',\\n  ACTIVE_UL             : '> li > .active',\\n  DATA_TOGGLE           : '[data-toggle=\\\"tab\\\"], [data-toggle=\\\"pill\\\"], [data-toggle=\\\"list\\\"]',\\n  DROPDOWN_TOGGLE       : '.dropdown-toggle',\\n  DROPDOWN_ACTIVE_CHILD : '> .dropdown-menu .active'\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass Tab {\\n  constructor(element) {\\n    this._element = element\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  // Public\\n\\n  show() {\\n    if (this._element.parentNode &&\\n        this._element.parentNode.nodeType === Node.ELEMENT_NODE &&\\n        $(this._element).hasClass(ClassName.ACTIVE) ||\\n        $(this._element).hasClass(ClassName.DISABLED)) {\\n      return\\n    }\\n\\n    let target\\n    let previous\\n    const listElement = $(this._element).closest(Selector.NAV_LIST_GROUP)[0]\\n    const selector = Util.getSelectorFromElement(this._element)\\n\\n    if (listElement) {\\n      const itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? Selector.ACTIVE_UL : Selector.ACTIVE\\n      previous = $.makeArray($(listElement).find(itemSelector))\\n      previous = previous[previous.length - 1]\\n    }\\n\\n    const hideEvent = $.Event(Event.HIDE, {\\n      relatedTarget: this._element\\n    })\\n\\n    const showEvent = $.Event(Event.SHOW, {\\n      relatedTarget: previous\\n    })\\n\\n    if (previous) {\\n      $(previous).trigger(hideEvent)\\n    }\\n\\n    $(this._element).trigger(showEvent)\\n\\n    if (showEvent.isDefaultPrevented() ||\\n        hideEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    if (selector) {\\n      target = document.querySelector(selector)\\n    }\\n\\n    this._activate(\\n      this._element,\\n      listElement\\n    )\\n\\n    const complete = () => {\\n      const hiddenEvent = $.Event(Event.HIDDEN, {\\n        relatedTarget: this._element\\n      })\\n\\n      const shownEvent = $.Event(Event.SHOWN, {\\n        relatedTarget: previous\\n      })\\n\\n      $(previous).trigger(hiddenEvent)\\n      $(this._element).trigger(shownEvent)\\n    }\\n\\n    if (target) {\\n      this._activate(target, target.parentNode, complete)\\n    } else {\\n      complete()\\n    }\\n  }\\n\\n  dispose() {\\n    $.removeData(this._element, DATA_KEY)\\n    this._element = null\\n  }\\n\\n  // Private\\n\\n  _activate(element, container, callback) {\\n    const activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL')\\n      ? $(container).find(Selector.ACTIVE_UL)\\n      : $(container).children(Selector.ACTIVE)\\n\\n    const active = activeElements[0]\\n    const isTransitioning = callback && (active && $(active).hasClass(ClassName.FADE))\\n    const complete = () => this._transitionComplete(\\n      element,\\n      active,\\n      callback\\n    )\\n\\n    if (active && isTransitioning) {\\n      const transitionDuration = Util.getTransitionDurationFromElement(active)\\n\\n      $(active)\\n        .removeClass(ClassName.SHOW)\\n        .one(Util.TRANSITION_END, complete)\\n        .emulateTransitionEnd(transitionDuration)\\n    } else {\\n      complete()\\n    }\\n  }\\n\\n  _transitionComplete(element, active, callback) {\\n    if (active) {\\n      $(active).removeClass(ClassName.ACTIVE)\\n\\n      const dropdownChild = $(active.parentNode).find(\\n        Selector.DROPDOWN_ACTIVE_CHILD\\n      )[0]\\n\\n      if (dropdownChild) {\\n        $(dropdownChild).removeClass(ClassName.ACTIVE)\\n      }\\n\\n      if (active.getAttribute('role') === 'tab') {\\n        active.setAttribute('aria-selected', false)\\n      }\\n    }\\n\\n    $(element).addClass(ClassName.ACTIVE)\\n    if (element.getAttribute('role') === 'tab') {\\n      element.setAttribute('aria-selected', true)\\n    }\\n\\n    Util.reflow(element)\\n\\n    if (element.classList.contains(ClassName.FADE)) {\\n      element.classList.add(ClassName.SHOW)\\n    }\\n\\n    if (element.parentNode && $(element.parentNode).hasClass(ClassName.DROPDOWN_MENU)) {\\n      const dropdownElement = $(element).closest(Selector.DROPDOWN)[0]\\n\\n      if (dropdownElement) {\\n        const dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(Selector.DROPDOWN_TOGGLE))\\n\\n        $(dropdownToggleList).addClass(ClassName.ACTIVE)\\n      }\\n\\n      element.setAttribute('aria-expanded', true)\\n    }\\n\\n    if (callback) {\\n      callback()\\n    }\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      const $this = $(this)\\n      let data = $this.data(DATA_KEY)\\n\\n      if (!data) {\\n        data = new Tab(this)\\n        $this.data(DATA_KEY, data)\\n      }\\n\\n      if (typeof config === 'string') {\\n        if (typeof data[config] === 'undefined') {\\n          throw new TypeError(`No method named \\\"${config}\\\"`)\\n        }\\n        data[config]()\\n      }\\n    })\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Data Api implementation\\n * ------------------------------------------------------------------------\\n */\\n\\n$(document)\\n  .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\\n    event.preventDefault()\\n    Tab._jQueryInterface.call($(this), 'show')\\n  })\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME] = Tab._jQueryInterface\\n$.fn[NAME].Constructor = Tab\\n$.fn[NAME].noConflict = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Tab._jQueryInterface\\n}\\n\\nexport default Tab\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): toast.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\nimport Util from './util'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME               = 'toast'\\nconst VERSION            = '4.3.1'\\nconst DATA_KEY           = 'bs.toast'\\nconst EVENT_KEY          = `.${DATA_KEY}`\\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\\n\\nconst Event = {\\n  CLICK_DISMISS : `click.dismiss${EVENT_KEY}`,\\n  HIDE          : `hide${EVENT_KEY}`,\\n  HIDDEN        : `hidden${EVENT_KEY}`,\\n  SHOW          : `show${EVENT_KEY}`,\\n  SHOWN         : `shown${EVENT_KEY}`\\n}\\n\\nconst ClassName = {\\n  FADE    : 'fade',\\n  HIDE    : 'hide',\\n  SHOW    : 'show',\\n  SHOWING : 'showing'\\n}\\n\\nconst DefaultType = {\\n  animation : 'boolean',\\n  autohide  : 'boolean',\\n  delay     : 'number'\\n}\\n\\nconst Default = {\\n  animation : true,\\n  autohide  : true,\\n  delay     : 500\\n}\\n\\nconst Selector = {\\n  DATA_DISMISS : '[data-dismiss=\\\"toast\\\"]'\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass Toast {\\n  constructor(element, config) {\\n    this._element = element\\n    this._config  = this._getConfig(config)\\n    this._timeout = null\\n    this._setListeners()\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  static get DefaultType() {\\n    return DefaultType\\n  }\\n\\n  static get Default() {\\n    return Default\\n  }\\n\\n  // Public\\n\\n  show() {\\n    $(this._element).trigger(Event.SHOW)\\n\\n    if (this._config.animation) {\\n      this._element.classList.add(ClassName.FADE)\\n    }\\n\\n    const complete = () => {\\n      this._element.classList.remove(ClassName.SHOWING)\\n      this._element.classList.add(ClassName.SHOW)\\n\\n      $(this._element).trigger(Event.SHOWN)\\n\\n      if (this._config.autohide) {\\n        this.hide()\\n      }\\n    }\\n\\n    this._element.classList.remove(ClassName.HIDE)\\n    this._element.classList.add(ClassName.SHOWING)\\n    if (this._config.animation) {\\n      const transitionDuration = Util.getTransitionDurationFromElement(this._element)\\n\\n      $(this._element)\\n        .one(Util.TRANSITION_END, complete)\\n        .emulateTransitionEnd(transitionDuration)\\n    } else {\\n      complete()\\n    }\\n  }\\n\\n  hide(withoutTimeout) {\\n    if (!this._element.classList.contains(ClassName.SHOW)) {\\n      return\\n    }\\n\\n    $(this._element).trigger(Event.HIDE)\\n\\n    if (withoutTimeout) {\\n      this._close()\\n    } else {\\n      this._timeout = setTimeout(() => {\\n        this._close()\\n      }, this._config.delay)\\n    }\\n  }\\n\\n  dispose() {\\n    clearTimeout(this._timeout)\\n    this._timeout = null\\n\\n    if (this._element.classList.contains(ClassName.SHOW)) {\\n      this._element.classList.remove(ClassName.SHOW)\\n    }\\n\\n    $(this._element).off(Event.CLICK_DISMISS)\\n\\n    $.removeData(this._element, DATA_KEY)\\n    this._element = null\\n    this._config  = null\\n  }\\n\\n  // Private\\n\\n  _getConfig(config) {\\n    config = {\\n      ...Default,\\n      ...$(this._element).data(),\\n      ...typeof config === 'object' && config ? config : {}\\n    }\\n\\n    Util.typeCheckConfig(\\n      NAME,\\n      config,\\n      this.constructor.DefaultType\\n    )\\n\\n    return config\\n  }\\n\\n  _setListeners() {\\n    $(this._element).on(\\n      Event.CLICK_DISMISS,\\n      Selector.DATA_DISMISS,\\n      () => this.hide(true)\\n    )\\n  }\\n\\n  _close() {\\n    const complete = () => {\\n      this._element.classList.add(ClassName.HIDE)\\n      $(this._element).trigger(Event.HIDDEN)\\n    }\\n\\n    this._element.classList.remove(ClassName.SHOW)\\n    if (this._config.animation) {\\n      const transitionDuration = Util.getTransitionDurationFromElement(this._element)\\n\\n      $(this._element)\\n        .one(Util.TRANSITION_END, complete)\\n        .emulateTransitionEnd(transitionDuration)\\n    } else {\\n      complete()\\n    }\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      const $element = $(this)\\n      let data       = $element.data(DATA_KEY)\\n      const _config  = typeof config === 'object' && config\\n\\n      if (!data) {\\n        data = new Toast(this, _config)\\n        $element.data(DATA_KEY, data)\\n      }\\n\\n      if (typeof config === 'string') {\\n        if (typeof data[config] === 'undefined') {\\n          throw new TypeError(`No method named \\\"${config}\\\"`)\\n        }\\n\\n        data[config](this)\\n      }\\n    })\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME]             = Toast._jQueryInterface\\n$.fn[NAME].Constructor = Toast\\n$.fn[NAME].noConflict  = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Toast._jQueryInterface\\n}\\n\\nexport default Toast\\n\",\"import $ from 'jquery'\\nimport Alert from './alert'\\nimport Button from './button'\\nimport Carousel from './carousel'\\nimport Collapse from './collapse'\\nimport Dropdown from './dropdown'\\nimport Modal from './modal'\\nimport Popover from './popover'\\nimport Scrollspy from './scrollspy'\\nimport Tab from './tab'\\nimport Toast from './toast'\\nimport Tooltip from './tooltip'\\nimport Util from './util'\\n\\n/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): index.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\n(() => {\\n  if (typeof $ === 'undefined') {\\n    throw new TypeError('Bootstrap\\\\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\\\\'s JavaScript.')\\n  }\\n\\n  const version = $.fn.jquery.split(' ')[0].split('.')\\n  const minMajor = 1\\n  const ltMajor = 2\\n  const minMinor = 9\\n  const minPatch = 1\\n  const maxMajor = 4\\n\\n  if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {\\n    throw new Error('Bootstrap\\\\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0')\\n  }\\n})()\\n\\nexport {\\n  Util,\\n  Alert,\\n  Button,\\n  Carousel,\\n  Collapse,\\n  Dropdown,\\n  Modal,\\n  Popover,\\n  Scrollspy,\\n  Tab,\\n  Toast,\\n  Tooltip\\n}\\n\"],\"names\":[\"TRANSITION_END\",\"MAX_UID\",\"MILLISECONDS_MULTIPLIER\",\"toType\",\"obj\",\"toString\",\"call\",\"match\",\"toLowerCase\",\"getSpecialTransitionEndEvent\",\"bindType\",\"delegateType\",\"handle\",\"event\",\"$\",\"target\",\"is\",\"handleObj\",\"handler\",\"apply\",\"arguments\",\"undefined\",\"transitionEndEmulator\",\"duration\",\"called\",\"one\",\"Util\",\"setTimeout\",\"triggerTransitionEnd\",\"setTransitionEndSupport\",\"fn\",\"emulateTransitionEnd\",\"special\",\"getUID\",\"prefix\",\"Math\",\"random\",\"document\",\"getElementById\",\"getSelectorFromElement\",\"element\",\"selector\",\"getAttribute\",\"hrefAttr\",\"trim\",\"querySelector\",\"err\",\"getTransitionDurationFromElement\",\"transitionDuration\",\"css\",\"transitionDelay\",\"floatTransitionDuration\",\"parseFloat\",\"floatTransitionDelay\",\"split\",\"reflow\",\"offsetHeight\",\"trigger\",\"supportsTransitionEnd\",\"Boolean\",\"isElement\",\"nodeType\",\"typeCheckConfig\",\"componentName\",\"config\",\"configTypes\",\"property\",\"Object\",\"prototype\",\"hasOwnProperty\",\"expectedTypes\",\"value\",\"valueType\",\"RegExp\",\"test\",\"Error\",\"toUpperCase\",\"findShadowRoot\",\"documentElement\",\"attachShadow\",\"getRootNode\",\"root\",\"ShadowRoot\",\"parentNode\",\"NAME\",\"VERSION\",\"DATA_KEY\",\"EVENT_KEY\",\"DATA_API_KEY\",\"JQUERY_NO_CONFLICT\",\"Selector\",\"DISMISS\",\"Event\",\"CLOSE\",\"CLOSED\",\"CLICK_DATA_API\",\"ClassName\",\"ALERT\",\"FADE\",\"SHOW\",\"Alert\",\"_element\",\"close\",\"rootElement\",\"_getRootElement\",\"customEvent\",\"_triggerCloseEvent\",\"isDefaultPrevented\",\"_removeElement\",\"dispose\",\"removeData\",\"parent\",\"closest\",\"closeEvent\",\"removeClass\",\"hasClass\",\"_destroyElement\",\"detach\",\"remove\",\"_jQueryInterface\",\"each\",\"$element\",\"data\",\"_handleDismiss\",\"alertInstance\",\"preventDefault\",\"on\",\"Constructor\",\"noConflict\",\"ACTIVE\",\"BUTTON\",\"FOCUS\",\"DATA_TOGGLE_CARROT\",\"DATA_TOGGLE\",\"INPUT\",\"FOCUS_BLUR_DATA_API\",\"Button\",\"toggle\",\"triggerChangeEvent\",\"addAriaPressed\",\"input\",\"type\",\"checked\",\"classList\",\"contains\",\"activeElement\",\"hasAttribute\",\"focus\",\"setAttribute\",\"toggleClass\",\"button\",\"ARROW_LEFT_KEYCODE\",\"ARROW_RIGHT_KEYCODE\",\"TOUCHEVENT_COMPAT_WAIT\",\"SWIPE_THRESHOLD\",\"Default\",\"interval\",\"keyboard\",\"slide\",\"pause\",\"wrap\",\"touch\",\"DefaultType\",\"Direction\",\"NEXT\",\"PREV\",\"LEFT\",\"RIGHT\",\"SLIDE\",\"SLID\",\"KEYDOWN\",\"MOUSEENTER\",\"MOUSELEAVE\",\"TOUCHSTART\",\"TOUCHMOVE\",\"TOUCHEND\",\"POINTERDOWN\",\"POINTERUP\",\"DRAG_START\",\"LOAD_DATA_API\",\"CAROUSEL\",\"ITEM\",\"POINTER_EVENT\",\"ACTIVE_ITEM\",\"ITEM_IMG\",\"NEXT_PREV\",\"INDICATORS\",\"DATA_SLIDE\",\"DATA_RIDE\",\"PointerType\",\"TOUCH\",\"PEN\",\"Carousel\",\"_items\",\"_interval\",\"_activeElement\",\"_isPaused\",\"_isSliding\",\"touchTimeout\",\"touchStartX\",\"touchDeltaX\",\"_config\",\"_getConfig\",\"_indicatorsElement\",\"_touchSupported\",\"navigator\",\"maxTouchPoints\",\"_pointerEvent\",\"window\",\"PointerEvent\",\"MSPointerEvent\",\"_addEventListeners\",\"next\",\"_slide\",\"nextWhenVisible\",\"hidden\",\"prev\",\"cycle\",\"clearInterval\",\"setInterval\",\"visibilityState\",\"bind\",\"to\",\"index\",\"activeIndex\",\"_getItemIndex\",\"length\",\"direction\",\"off\",\"_handleSwipe\",\"absDeltax\",\"abs\",\"_keydown\",\"_addTouchEventListeners\",\"start\",\"originalEvent\",\"pointerType\",\"clientX\",\"touches\",\"move\",\"end\",\"clearTimeout\",\"querySelectorAll\",\"e\",\"add\",\"tagName\",\"which\",\"slice\",\"indexOf\",\"_getItemByDirection\",\"isNextDirection\",\"isPrevDirection\",\"lastItemIndex\",\"isGoingToWrap\",\"delta\",\"itemIndex\",\"_triggerSlideEvent\",\"relatedTarget\",\"eventDirectionName\",\"targetIndex\",\"fromIndex\",\"slideEvent\",\"from\",\"_setActiveIndicatorElement\",\"indicators\",\"nextIndicator\",\"children\",\"addClass\",\"activeElementIndex\",\"nextElement\",\"nextElementIndex\",\"isCycling\",\"directionalClassName\",\"orderClassName\",\"slidEvent\",\"nextElementInterval\",\"parseInt\",\"defaultInterval\",\"action\",\"TypeError\",\"ride\",\"_dataApiClickHandler\",\"slideIndex\",\"carousels\",\"i\",\"len\",\"$carousel\",\"SHOWN\",\"HIDE\",\"HIDDEN\",\"COLLAPSE\",\"COLLAPSING\",\"COLLAPSED\",\"Dimension\",\"WIDTH\",\"HEIGHT\",\"ACTIVES\",\"Collapse\",\"_isTransitioning\",\"_triggerArray\",\"id\",\"toggleList\",\"elem\",\"filterElement\",\"filter\",\"foundElem\",\"_selector\",\"push\",\"_parent\",\"_getParent\",\"_addAriaAndCollapsedClass\",\"hide\",\"show\",\"actives\",\"activesData\",\"not\",\"startEvent\",\"dimension\",\"_getDimension\",\"style\",\"attr\",\"setTransitioning\",\"complete\",\"capitalizedDimension\",\"scrollSize\",\"getBoundingClientRect\",\"triggerArrayLength\",\"$elem\",\"isTransitioning\",\"hasWidth\",\"jquery\",\"_getTargetFromElement\",\"triggerArray\",\"isOpen\",\"$this\",\"currentTarget\",\"$trigger\",\"selectors\",\"$target\",\"ESCAPE_KEYCODE\",\"SPACE_KEYCODE\",\"TAB_KEYCODE\",\"ARROW_UP_KEYCODE\",\"ARROW_DOWN_KEYCODE\",\"RIGHT_MOUSE_BUTTON_WHICH\",\"REGEXP_KEYDOWN\",\"CLICK\",\"KEYDOWN_DATA_API\",\"KEYUP_DATA_API\",\"DISABLED\",\"DROPUP\",\"DROPRIGHT\",\"DROPLEFT\",\"MENURIGHT\",\"MENULEFT\",\"POSITION_STATIC\",\"FORM_CHILD\",\"MENU\",\"NAVBAR_NAV\",\"VISIBLE_ITEMS\",\"AttachmentMap\",\"TOP\",\"TOPEND\",\"BOTTOM\",\"BOTTOMEND\",\"RIGHTEND\",\"LEFTEND\",\"offset\",\"flip\",\"boundary\",\"reference\",\"display\",\"Dropdown\",\"_popper\",\"_menu\",\"_getMenuElement\",\"_inNavbar\",\"_detectNavbar\",\"disabled\",\"_getParentFromElement\",\"isActive\",\"_clearMenus\",\"showEvent\",\"Popper\",\"referenceElement\",\"_getPopperConfig\",\"body\",\"noop\",\"hideEvent\",\"destroy\",\"update\",\"scheduleUpdate\",\"stopPropagation\",\"constructor\",\"_getPlacement\",\"$parentDropdown\",\"placement\",\"_getOffset\",\"offsets\",\"popperConfig\",\"modifiers\",\"enabled\",\"preventOverflow\",\"boundariesElement\",\"applyStyle\",\"toggles\",\"context\",\"clickEvent\",\"dropdownMenu\",\"_dataApiKeydownHandler\",\"items\",\"backdrop\",\"FOCUSIN\",\"RESIZE\",\"CLICK_DISMISS\",\"KEYDOWN_DISMISS\",\"MOUSEUP_DISMISS\",\"MOUSEDOWN_DISMISS\",\"SCROLLABLE\",\"SCROLLBAR_MEASURER\",\"BACKDROP\",\"OPEN\",\"DIALOG\",\"MODAL_BODY\",\"DATA_DISMISS\",\"FIXED_CONTENT\",\"STICKY_CONTENT\",\"Modal\",\"_dialog\",\"_backdrop\",\"_isShown\",\"_isBodyOverflowing\",\"_ignoreBackdropClick\",\"_scrollbarWidth\",\"_checkScrollbar\",\"_setScrollbar\",\"_adjustDialog\",\"_setEscapeEvent\",\"_setResizeEvent\",\"_showBackdrop\",\"_showElement\",\"transition\",\"_hideModal\",\"forEach\",\"htmlElement\",\"handleUpdate\",\"Node\",\"ELEMENT_NODE\",\"appendChild\",\"removeAttribute\",\"scrollTop\",\"_enforceFocus\",\"shownEvent\",\"transitionComplete\",\"has\",\"_resetAdjustments\",\"_resetScrollbar\",\"_removeBackdrop\",\"callback\",\"animate\",\"createElement\",\"className\",\"appendTo\",\"backdropTransitionDuration\",\"callbackRemove\",\"isModalOverflowing\",\"scrollHeight\",\"clientHeight\",\"paddingLeft\",\"paddingRight\",\"rect\",\"left\",\"right\",\"innerWidth\",\"_getScrollbarWidth\",\"fixedContent\",\"stickyContent\",\"actualPadding\",\"calculatedPadding\",\"actualMargin\",\"marginRight\",\"calculatedMargin\",\"padding\",\"elements\",\"margin\",\"scrollDiv\",\"scrollbarWidth\",\"width\",\"clientWidth\",\"removeChild\",\"uriAttrs\",\"ARIA_ATTRIBUTE_PATTERN\",\"DefaultWhitelist\",\"a\",\"area\",\"b\",\"br\",\"col\",\"code\",\"div\",\"em\",\"hr\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"img\",\"li\",\"ol\",\"p\",\"pre\",\"s\",\"small\",\"span\",\"sub\",\"sup\",\"strong\",\"u\",\"ul\",\"SAFE_URL_PATTERN\",\"DATA_URL_PATTERN\",\"allowedAttribute\",\"allowedAttributeList\",\"attrName\",\"nodeName\",\"nodeValue\",\"regExp\",\"attrRegex\",\"l\",\"sanitizeHtml\",\"unsafeHtml\",\"whiteList\",\"sanitizeFn\",\"domParser\",\"DOMParser\",\"createdDocument\",\"parseFromString\",\"whitelistKeys\",\"keys\",\"el\",\"elName\",\"attributeList\",\"attributes\",\"whitelistedAttributes\",\"concat\",\"innerHTML\",\"CLASS_PREFIX\",\"BSCLS_PREFIX_REGEX\",\"DISALLOWED_ATTRIBUTES\",\"animation\",\"template\",\"title\",\"delay\",\"html\",\"container\",\"fallbackPlacement\",\"sanitize\",\"AUTO\",\"HoverState\",\"OUT\",\"INSERTED\",\"FOCUSOUT\",\"TOOLTIP\",\"TOOLTIP_INNER\",\"ARROW\",\"Trigger\",\"HOVER\",\"MANUAL\",\"Tooltip\",\"_isEnabled\",\"_timeout\",\"_hoverState\",\"_activeTrigger\",\"tip\",\"_setListeners\",\"enable\",\"disable\",\"toggleEnabled\",\"dataKey\",\"_getDelegateConfig\",\"click\",\"_isWithActiveTrigger\",\"_enter\",\"_leave\",\"getTipElement\",\"isWithContent\",\"shadowRoot\",\"isInTheDom\",\"ownerDocument\",\"tipId\",\"setContent\",\"attachment\",\"_getAttachment\",\"addAttachmentClass\",\"_getContainer\",\"behavior\",\"arrow\",\"onCreate\",\"originalPlacement\",\"_handlePopperPlacementChange\",\"onUpdate\",\"_fixTransition\",\"prevHoverState\",\"_cleanTipClass\",\"getTitle\",\"setElementContent\",\"content\",\"empty\",\"append\",\"text\",\"find\",\"triggers\",\"eventIn\",\"eventOut\",\"_fixTitle\",\"titleType\",\"dataAttributes\",\"dataAttr\",\"key\",\"$tip\",\"tabClass\",\"join\",\"popperData\",\"popperInstance\",\"instance\",\"popper\",\"initConfigAnimation\",\"TITLE\",\"CONTENT\",\"Popover\",\"_getContent\",\"method\",\"ACTIVATE\",\"SCROLL\",\"DROPDOWN_ITEM\",\"DROPDOWN_MENU\",\"DATA_SPY\",\"NAV_LIST_GROUP\",\"NAV_LINKS\",\"NAV_ITEMS\",\"LIST_ITEMS\",\"DROPDOWN\",\"DROPDOWN_ITEMS\",\"DROPDOWN_TOGGLE\",\"OffsetMethod\",\"OFFSET\",\"POSITION\",\"ScrollSpy\",\"_scrollElement\",\"_offsets\",\"_targets\",\"_activeTarget\",\"_scrollHeight\",\"_process\",\"refresh\",\"autoMethod\",\"offsetMethod\",\"offsetBase\",\"_getScrollTop\",\"_getScrollHeight\",\"targets\",\"map\",\"targetSelector\",\"targetBCR\",\"height\",\"top\",\"item\",\"sort\",\"pageYOffset\",\"max\",\"_getOffsetHeight\",\"innerHeight\",\"maxScroll\",\"_activate\",\"_clear\",\"offsetLength\",\"isActiveTarget\",\"queries\",\"$link\",\"parents\",\"node\",\"scrollSpys\",\"scrollSpysLength\",\"$spy\",\"ACTIVE_UL\",\"DROPDOWN_ACTIVE_CHILD\",\"Tab\",\"previous\",\"listElement\",\"itemSelector\",\"makeArray\",\"hiddenEvent\",\"activeElements\",\"active\",\"_transitionComplete\",\"dropdownChild\",\"dropdownElement\",\"dropdownToggleList\",\"SHOWING\",\"autohide\",\"Toast\",\"withoutTimeout\",\"_close\",\"version\",\"minMajor\",\"ltMajor\",\"minMinor\",\"minPatch\",\"maxMajor\"],\"mappings\":\"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\"}"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bootstrap4/js/bootstrap.min.js",
    "content": "/*!\n  * Bootstrap v4.3.1 (https://getbootstrap.com/)\n  * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n  */\n!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?e(exports,require(\"jquery\"),require(\"popper.js\")):\"function\"==typeof define&&define.amd?define([\"exports\",\"jquery\",\"popper.js\"],e):e((t=t||self).bootstrap={},t.jQuery,t.Popper)}(this,function(t,g,u){\"use strict\";function i(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,\"value\"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function s(t,e,n){return e&&i(t.prototype,e),n&&i(t,n),t}function l(o){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},e=Object.keys(r);\"function\"==typeof Object.getOwnPropertySymbols&&(e=e.concat(Object.getOwnPropertySymbols(r).filter(function(t){return Object.getOwnPropertyDescriptor(r,t).enumerable}))),e.forEach(function(t){var e,n,i;e=o,i=r[n=t],n in e?Object.defineProperty(e,n,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[n]=i})}return o}g=g&&g.hasOwnProperty(\"default\")?g.default:g,u=u&&u.hasOwnProperty(\"default\")?u.default:u;var e=\"transitionend\";function n(t){var e=this,n=!1;return g(this).one(_.TRANSITION_END,function(){n=!0}),setTimeout(function(){n||_.triggerTransitionEnd(e)},t),this}var _={TRANSITION_END:\"bsTransitionEnd\",getUID:function(t){for(;t+=~~(1e6*Math.random()),document.getElementById(t););return t},getSelectorFromElement:function(t){var e=t.getAttribute(\"data-target\");if(!e||\"#\"===e){var n=t.getAttribute(\"href\");e=n&&\"#\"!==n?n.trim():\"\"}try{return document.querySelector(e)?e:null}catch(t){return null}},getTransitionDurationFromElement:function(t){if(!t)return 0;var e=g(t).css(\"transition-duration\"),n=g(t).css(\"transition-delay\"),i=parseFloat(e),o=parseFloat(n);return i||o?(e=e.split(\",\")[0],n=n.split(\",\")[0],1e3*(parseFloat(e)+parseFloat(n))):0},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(t){g(t).trigger(e)},supportsTransitionEnd:function(){return Boolean(e)},isElement:function(t){return(t[0]||t).nodeType},typeCheckConfig:function(t,e,n){for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i)){var o=n[i],r=e[i],s=r&&_.isElement(r)?\"element\":(a=r,{}.toString.call(a).match(/\\s([a-z]+)/i)[1].toLowerCase());if(!new RegExp(o).test(s))throw new Error(t.toUpperCase()+': Option \"'+i+'\" provided type \"'+s+'\" but expected type \"'+o+'\".')}var a},findShadowRoot:function(t){if(!document.documentElement.attachShadow)return null;if(\"function\"!=typeof t.getRootNode)return t instanceof ShadowRoot?t:t.parentNode?_.findShadowRoot(t.parentNode):null;var e=t.getRootNode();return e instanceof ShadowRoot?e:null}};g.fn.emulateTransitionEnd=n,g.event.special[_.TRANSITION_END]={bindType:e,delegateType:e,handle:function(t){if(g(t.target).is(this))return t.handleObj.handler.apply(this,arguments)}};var o=\"alert\",r=\"bs.alert\",a=\".\"+r,c=g.fn[o],h={CLOSE:\"close\"+a,CLOSED:\"closed\"+a,CLICK_DATA_API:\"click\"+a+\".data-api\"},f=\"alert\",d=\"fade\",m=\"show\",p=function(){function i(t){this._element=t}var t=i.prototype;return t.close=function(t){var e=this._element;t&&(e=this._getRootElement(t)),this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},t.dispose=function(){g.removeData(this._element,r),this._element=null},t._getRootElement=function(t){var e=_.getSelectorFromElement(t),n=!1;return e&&(n=document.querySelector(e)),n||(n=g(t).closest(\".\"+f)[0]),n},t._triggerCloseEvent=function(t){var e=g.Event(h.CLOSE);return g(t).trigger(e),e},t._removeElement=function(e){var n=this;if(g(e).removeClass(m),g(e).hasClass(d)){var t=_.getTransitionDurationFromElement(e);g(e).one(_.TRANSITION_END,function(t){return n._destroyElement(e,t)}).emulateTransitionEnd(t)}else this._destroyElement(e)},t._destroyElement=function(t){g(t).detach().trigger(h.CLOSED).remove()},i._jQueryInterface=function(n){return this.each(function(){var t=g(this),e=t.data(r);e||(e=new i(this),t.data(r,e)),\"close\"===n&&e[n](this)})},i._handleDismiss=function(e){return function(t){t&&t.preventDefault(),e.close(this)}},s(i,null,[{key:\"VERSION\",get:function(){return\"4.3.1\"}}]),i}();g(document).on(h.CLICK_DATA_API,'[data-dismiss=\"alert\"]',p._handleDismiss(new p)),g.fn[o]=p._jQueryInterface,g.fn[o].Constructor=p,g.fn[o].noConflict=function(){return g.fn[o]=c,p._jQueryInterface};var v=\"button\",y=\"bs.button\",E=\".\"+y,C=\".data-api\",T=g.fn[v],S=\"active\",b=\"btn\",I=\"focus\",D='[data-toggle^=\"button\"]',w='[data-toggle=\"buttons\"]',A='input:not([type=\"hidden\"])',N=\".active\",O=\".btn\",k={CLICK_DATA_API:\"click\"+E+C,FOCUS_BLUR_DATA_API:\"focus\"+E+C+\" blur\"+E+C},P=function(){function n(t){this._element=t}var t=n.prototype;return t.toggle=function(){var t=!0,e=!0,n=g(this._element).closest(w)[0];if(n){var i=this._element.querySelector(A);if(i){if(\"radio\"===i.type)if(i.checked&&this._element.classList.contains(S))t=!1;else{var o=n.querySelector(N);o&&g(o).removeClass(S)}if(t){if(i.hasAttribute(\"disabled\")||n.hasAttribute(\"disabled\")||i.classList.contains(\"disabled\")||n.classList.contains(\"disabled\"))return;i.checked=!this._element.classList.contains(S),g(i).trigger(\"change\")}i.focus(),e=!1}}e&&this._element.setAttribute(\"aria-pressed\",!this._element.classList.contains(S)),t&&g(this._element).toggleClass(S)},t.dispose=function(){g.removeData(this._element,y),this._element=null},n._jQueryInterface=function(e){return this.each(function(){var t=g(this).data(y);t||(t=new n(this),g(this).data(y,t)),\"toggle\"===e&&t[e]()})},s(n,null,[{key:\"VERSION\",get:function(){return\"4.3.1\"}}]),n}();g(document).on(k.CLICK_DATA_API,D,function(t){t.preventDefault();var e=t.target;g(e).hasClass(b)||(e=g(e).closest(O)),P._jQueryInterface.call(g(e),\"toggle\")}).on(k.FOCUS_BLUR_DATA_API,D,function(t){var e=g(t.target).closest(O)[0];g(e).toggleClass(I,/^focus(in)?$/.test(t.type))}),g.fn[v]=P._jQueryInterface,g.fn[v].Constructor=P,g.fn[v].noConflict=function(){return g.fn[v]=T,P._jQueryInterface};var L=\"carousel\",j=\"bs.carousel\",H=\".\"+j,R=\".data-api\",x=g.fn[L],F={interval:5e3,keyboard:!0,slide:!1,pause:\"hover\",wrap:!0,touch:!0},U={interval:\"(number|boolean)\",keyboard:\"boolean\",slide:\"(boolean|string)\",pause:\"(string|boolean)\",wrap:\"boolean\",touch:\"boolean\"},W=\"next\",q=\"prev\",M=\"left\",K=\"right\",Q={SLIDE:\"slide\"+H,SLID:\"slid\"+H,KEYDOWN:\"keydown\"+H,MOUSEENTER:\"mouseenter\"+H,MOUSELEAVE:\"mouseleave\"+H,TOUCHSTART:\"touchstart\"+H,TOUCHMOVE:\"touchmove\"+H,TOUCHEND:\"touchend\"+H,POINTERDOWN:\"pointerdown\"+H,POINTERUP:\"pointerup\"+H,DRAG_START:\"dragstart\"+H,LOAD_DATA_API:\"load\"+H+R,CLICK_DATA_API:\"click\"+H+R},B=\"carousel\",V=\"active\",Y=\"slide\",z=\"carousel-item-right\",X=\"carousel-item-left\",$=\"carousel-item-next\",G=\"carousel-item-prev\",J=\"pointer-event\",Z=\".active\",tt=\".active.carousel-item\",et=\".carousel-item\",nt=\".carousel-item img\",it=\".carousel-item-next, .carousel-item-prev\",ot=\".carousel-indicators\",rt=\"[data-slide], [data-slide-to]\",st='[data-ride=\"carousel\"]',at={TOUCH:\"touch\",PEN:\"pen\"},lt=function(){function r(t,e){this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this.touchStartX=0,this.touchDeltaX=0,this._config=this._getConfig(e),this._element=t,this._indicatorsElement=this._element.querySelector(ot),this._touchSupported=\"ontouchstart\"in document.documentElement||0<navigator.maxTouchPoints,this._pointerEvent=Boolean(window.PointerEvent||window.MSPointerEvent),this._addEventListeners()}var t=r.prototype;return t.next=function(){this._isSliding||this._slide(W)},t.nextWhenVisible=function(){!document.hidden&&g(this._element).is(\":visible\")&&\"hidden\"!==g(this._element).css(\"visibility\")&&this.next()},t.prev=function(){this._isSliding||this._slide(q)},t.pause=function(t){t||(this._isPaused=!0),this._element.querySelector(it)&&(_.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},t.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},t.to=function(t){var e=this;this._activeElement=this._element.querySelector(tt);var n=this._getItemIndex(this._activeElement);if(!(t>this._items.length-1||t<0))if(this._isSliding)g(this._element).one(Q.SLID,function(){return e.to(t)});else{if(n===t)return this.pause(),void this.cycle();var i=n<t?W:q;this._slide(i,this._items[t])}},t.dispose=function(){g(this._element).off(H),g.removeData(this._element,j),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},t._getConfig=function(t){return t=l({},F,t),_.typeCheckConfig(L,t,U),t},t._handleSwipe=function(){var t=Math.abs(this.touchDeltaX);if(!(t<=40)){var e=t/this.touchDeltaX;0<e&&this.prev(),e<0&&this.next()}},t._addEventListeners=function(){var e=this;this._config.keyboard&&g(this._element).on(Q.KEYDOWN,function(t){return e._keydown(t)}),\"hover\"===this._config.pause&&g(this._element).on(Q.MOUSEENTER,function(t){return e.pause(t)}).on(Q.MOUSELEAVE,function(t){return e.cycle(t)}),this._config.touch&&this._addTouchEventListeners()},t._addTouchEventListeners=function(){var n=this;if(this._touchSupported){var e=function(t){n._pointerEvent&&at[t.originalEvent.pointerType.toUpperCase()]?n.touchStartX=t.originalEvent.clientX:n._pointerEvent||(n.touchStartX=t.originalEvent.touches[0].clientX)},i=function(t){n._pointerEvent&&at[t.originalEvent.pointerType.toUpperCase()]&&(n.touchDeltaX=t.originalEvent.clientX-n.touchStartX),n._handleSwipe(),\"hover\"===n._config.pause&&(n.pause(),n.touchTimeout&&clearTimeout(n.touchTimeout),n.touchTimeout=setTimeout(function(t){return n.cycle(t)},500+n._config.interval))};g(this._element.querySelectorAll(nt)).on(Q.DRAG_START,function(t){return t.preventDefault()}),this._pointerEvent?(g(this._element).on(Q.POINTERDOWN,function(t){return e(t)}),g(this._element).on(Q.POINTERUP,function(t){return i(t)}),this._element.classList.add(J)):(g(this._element).on(Q.TOUCHSTART,function(t){return e(t)}),g(this._element).on(Q.TOUCHMOVE,function(t){var e;(e=t).originalEvent.touches&&1<e.originalEvent.touches.length?n.touchDeltaX=0:n.touchDeltaX=e.originalEvent.touches[0].clientX-n.touchStartX}),g(this._element).on(Q.TOUCHEND,function(t){return i(t)}))}},t._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next()}},t._getItemIndex=function(t){return this._items=t&&t.parentNode?[].slice.call(t.parentNode.querySelectorAll(et)):[],this._items.indexOf(t)},t._getItemByDirection=function(t,e){var n=t===W,i=t===q,o=this._getItemIndex(e),r=this._items.length-1;if((i&&0===o||n&&o===r)&&!this._config.wrap)return e;var s=(o+(t===q?-1:1))%this._items.length;return-1===s?this._items[this._items.length-1]:this._items[s]},t._triggerSlideEvent=function(t,e){var n=this._getItemIndex(t),i=this._getItemIndex(this._element.querySelector(tt)),o=g.Event(Q.SLIDE,{relatedTarget:t,direction:e,from:i,to:n});return g(this._element).trigger(o),o},t._setActiveIndicatorElement=function(t){if(this._indicatorsElement){var e=[].slice.call(this._indicatorsElement.querySelectorAll(Z));g(e).removeClass(V);var n=this._indicatorsElement.children[this._getItemIndex(t)];n&&g(n).addClass(V)}},t._slide=function(t,e){var n,i,o,r=this,s=this._element.querySelector(tt),a=this._getItemIndex(s),l=e||s&&this._getItemByDirection(t,s),c=this._getItemIndex(l),h=Boolean(this._interval);if(o=t===W?(n=X,i=$,M):(n=z,i=G,K),l&&g(l).hasClass(V))this._isSliding=!1;else if(!this._triggerSlideEvent(l,o).isDefaultPrevented()&&s&&l){this._isSliding=!0,h&&this.pause(),this._setActiveIndicatorElement(l);var u=g.Event(Q.SLID,{relatedTarget:l,direction:o,from:a,to:c});if(g(this._element).hasClass(Y)){g(l).addClass(i),_.reflow(l),g(s).addClass(n),g(l).addClass(n);var f=parseInt(l.getAttribute(\"data-interval\"),10);this._config.interval=f?(this._config.defaultInterval=this._config.defaultInterval||this._config.interval,f):this._config.defaultInterval||this._config.interval;var d=_.getTransitionDurationFromElement(s);g(s).one(_.TRANSITION_END,function(){g(l).removeClass(n+\" \"+i).addClass(V),g(s).removeClass(V+\" \"+i+\" \"+n),r._isSliding=!1,setTimeout(function(){return g(r._element).trigger(u)},0)}).emulateTransitionEnd(d)}else g(s).removeClass(V),g(l).addClass(V),this._isSliding=!1,g(this._element).trigger(u);h&&this.cycle()}},r._jQueryInterface=function(i){return this.each(function(){var t=g(this).data(j),e=l({},F,g(this).data());\"object\"==typeof i&&(e=l({},e,i));var n=\"string\"==typeof i?i:e.slide;if(t||(t=new r(this,e),g(this).data(j,t)),\"number\"==typeof i)t.to(i);else if(\"string\"==typeof n){if(\"undefined\"==typeof t[n])throw new TypeError('No method named \"'+n+'\"');t[n]()}else e.interval&&e.ride&&(t.pause(),t.cycle())})},r._dataApiClickHandler=function(t){var e=_.getSelectorFromElement(this);if(e){var n=g(e)[0];if(n&&g(n).hasClass(B)){var i=l({},g(n).data(),g(this).data()),o=this.getAttribute(\"data-slide-to\");o&&(i.interval=!1),r._jQueryInterface.call(g(n),i),o&&g(n).data(j).to(o),t.preventDefault()}}},s(r,null,[{key:\"VERSION\",get:function(){return\"4.3.1\"}},{key:\"Default\",get:function(){return F}}]),r}();g(document).on(Q.CLICK_DATA_API,rt,lt._dataApiClickHandler),g(window).on(Q.LOAD_DATA_API,function(){for(var t=[].slice.call(document.querySelectorAll(st)),e=0,n=t.length;e<n;e++){var i=g(t[e]);lt._jQueryInterface.call(i,i.data())}}),g.fn[L]=lt._jQueryInterface,g.fn[L].Constructor=lt,g.fn[L].noConflict=function(){return g.fn[L]=x,lt._jQueryInterface};var ct=\"collapse\",ht=\"bs.collapse\",ut=\".\"+ht,ft=g.fn[ct],dt={toggle:!0,parent:\"\"},gt={toggle:\"boolean\",parent:\"(string|element)\"},_t={SHOW:\"show\"+ut,SHOWN:\"shown\"+ut,HIDE:\"hide\"+ut,HIDDEN:\"hidden\"+ut,CLICK_DATA_API:\"click\"+ut+\".data-api\"},mt=\"show\",pt=\"collapse\",vt=\"collapsing\",yt=\"collapsed\",Et=\"width\",Ct=\"height\",Tt=\".show, .collapsing\",St='[data-toggle=\"collapse\"]',bt=function(){function a(e,t){this._isTransitioning=!1,this._element=e,this._config=this._getConfig(t),this._triggerArray=[].slice.call(document.querySelectorAll('[data-toggle=\"collapse\"][href=\"#'+e.id+'\"],[data-toggle=\"collapse\"][data-target=\"#'+e.id+'\"]'));for(var n=[].slice.call(document.querySelectorAll(St)),i=0,o=n.length;i<o;i++){var r=n[i],s=_.getSelectorFromElement(r),a=[].slice.call(document.querySelectorAll(s)).filter(function(t){return t===e});null!==s&&0<a.length&&(this._selector=s,this._triggerArray.push(r))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var t=a.prototype;return t.toggle=function(){g(this._element).hasClass(mt)?this.hide():this.show()},t.show=function(){var t,e,n=this;if(!this._isTransitioning&&!g(this._element).hasClass(mt)&&(this._parent&&0===(t=[].slice.call(this._parent.querySelectorAll(Tt)).filter(function(t){return\"string\"==typeof n._config.parent?t.getAttribute(\"data-parent\")===n._config.parent:t.classList.contains(pt)})).length&&(t=null),!(t&&(e=g(t).not(this._selector).data(ht))&&e._isTransitioning))){var i=g.Event(_t.SHOW);if(g(this._element).trigger(i),!i.isDefaultPrevented()){t&&(a._jQueryInterface.call(g(t).not(this._selector),\"hide\"),e||g(t).data(ht,null));var o=this._getDimension();g(this._element).removeClass(pt).addClass(vt),this._element.style[o]=0,this._triggerArray.length&&g(this._triggerArray).removeClass(yt).attr(\"aria-expanded\",!0),this.setTransitioning(!0);var r=\"scroll\"+(o[0].toUpperCase()+o.slice(1)),s=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,function(){g(n._element).removeClass(vt).addClass(pt).addClass(mt),n._element.style[o]=\"\",n.setTransitioning(!1),g(n._element).trigger(_t.SHOWN)}).emulateTransitionEnd(s),this._element.style[o]=this._element[r]+\"px\"}}},t.hide=function(){var t=this;if(!this._isTransitioning&&g(this._element).hasClass(mt)){var e=g.Event(_t.HIDE);if(g(this._element).trigger(e),!e.isDefaultPrevented()){var n=this._getDimension();this._element.style[n]=this._element.getBoundingClientRect()[n]+\"px\",_.reflow(this._element),g(this._element).addClass(vt).removeClass(pt).removeClass(mt);var i=this._triggerArray.length;if(0<i)for(var o=0;o<i;o++){var r=this._triggerArray[o],s=_.getSelectorFromElement(r);if(null!==s)g([].slice.call(document.querySelectorAll(s))).hasClass(mt)||g(r).addClass(yt).attr(\"aria-expanded\",!1)}this.setTransitioning(!0);this._element.style[n]=\"\";var a=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,function(){t.setTransitioning(!1),g(t._element).removeClass(vt).addClass(pt).trigger(_t.HIDDEN)}).emulateTransitionEnd(a)}}},t.setTransitioning=function(t){this._isTransitioning=t},t.dispose=function(){g.removeData(this._element,ht),this._config=null,this._parent=null,this._element=null,this._triggerArray=null,this._isTransitioning=null},t._getConfig=function(t){return(t=l({},dt,t)).toggle=Boolean(t.toggle),_.typeCheckConfig(ct,t,gt),t},t._getDimension=function(){return g(this._element).hasClass(Et)?Et:Ct},t._getParent=function(){var t,n=this;_.isElement(this._config.parent)?(t=this._config.parent,\"undefined\"!=typeof this._config.parent.jquery&&(t=this._config.parent[0])):t=document.querySelector(this._config.parent);var e='[data-toggle=\"collapse\"][data-parent=\"'+this._config.parent+'\"]',i=[].slice.call(t.querySelectorAll(e));return g(i).each(function(t,e){n._addAriaAndCollapsedClass(a._getTargetFromElement(e),[e])}),t},t._addAriaAndCollapsedClass=function(t,e){var n=g(t).hasClass(mt);e.length&&g(e).toggleClass(yt,!n).attr(\"aria-expanded\",n)},a._getTargetFromElement=function(t){var e=_.getSelectorFromElement(t);return e?document.querySelector(e):null},a._jQueryInterface=function(i){return this.each(function(){var t=g(this),e=t.data(ht),n=l({},dt,t.data(),\"object\"==typeof i&&i?i:{});if(!e&&n.toggle&&/show|hide/.test(i)&&(n.toggle=!1),e||(e=new a(this,n),t.data(ht,e)),\"string\"==typeof i){if(\"undefined\"==typeof e[i])throw new TypeError('No method named \"'+i+'\"');e[i]()}})},s(a,null,[{key:\"VERSION\",get:function(){return\"4.3.1\"}},{key:\"Default\",get:function(){return dt}}]),a}();g(document).on(_t.CLICK_DATA_API,St,function(t){\"A\"===t.currentTarget.tagName&&t.preventDefault();var n=g(this),e=_.getSelectorFromElement(this),i=[].slice.call(document.querySelectorAll(e));g(i).each(function(){var t=g(this),e=t.data(ht)?\"toggle\":n.data();bt._jQueryInterface.call(t,e)})}),g.fn[ct]=bt._jQueryInterface,g.fn[ct].Constructor=bt,g.fn[ct].noConflict=function(){return g.fn[ct]=ft,bt._jQueryInterface};var It=\"dropdown\",Dt=\"bs.dropdown\",wt=\".\"+Dt,At=\".data-api\",Nt=g.fn[It],Ot=new RegExp(\"38|40|27\"),kt={HIDE:\"hide\"+wt,HIDDEN:\"hidden\"+wt,SHOW:\"show\"+wt,SHOWN:\"shown\"+wt,CLICK:\"click\"+wt,CLICK_DATA_API:\"click\"+wt+At,KEYDOWN_DATA_API:\"keydown\"+wt+At,KEYUP_DATA_API:\"keyup\"+wt+At},Pt=\"disabled\",Lt=\"show\",jt=\"dropup\",Ht=\"dropright\",Rt=\"dropleft\",xt=\"dropdown-menu-right\",Ft=\"position-static\",Ut='[data-toggle=\"dropdown\"]',Wt=\".dropdown form\",qt=\".dropdown-menu\",Mt=\".navbar-nav\",Kt=\".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)\",Qt=\"top-start\",Bt=\"top-end\",Vt=\"bottom-start\",Yt=\"bottom-end\",zt=\"right-start\",Xt=\"left-start\",$t={offset:0,flip:!0,boundary:\"scrollParent\",reference:\"toggle\",display:\"dynamic\"},Gt={offset:\"(number|string|function)\",flip:\"boolean\",boundary:\"(string|element)\",reference:\"(string|element)\",display:\"string\"},Jt=function(){function c(t,e){this._element=t,this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}var t=c.prototype;return t.toggle=function(){if(!this._element.disabled&&!g(this._element).hasClass(Pt)){var t=c._getParentFromElement(this._element),e=g(this._menu).hasClass(Lt);if(c._clearMenus(),!e){var n={relatedTarget:this._element},i=g.Event(kt.SHOW,n);if(g(t).trigger(i),!i.isDefaultPrevented()){if(!this._inNavbar){if(\"undefined\"==typeof u)throw new TypeError(\"Bootstrap's dropdowns require Popper.js (https://popper.js.org/)\");var o=this._element;\"parent\"===this._config.reference?o=t:_.isElement(this._config.reference)&&(o=this._config.reference,\"undefined\"!=typeof this._config.reference.jquery&&(o=this._config.reference[0])),\"scrollParent\"!==this._config.boundary&&g(t).addClass(Ft),this._popper=new u(o,this._menu,this._getPopperConfig())}\"ontouchstart\"in document.documentElement&&0===g(t).closest(Mt).length&&g(document.body).children().on(\"mouseover\",null,g.noop),this._element.focus(),this._element.setAttribute(\"aria-expanded\",!0),g(this._menu).toggleClass(Lt),g(t).toggleClass(Lt).trigger(g.Event(kt.SHOWN,n))}}}},t.show=function(){if(!(this._element.disabled||g(this._element).hasClass(Pt)||g(this._menu).hasClass(Lt))){var t={relatedTarget:this._element},e=g.Event(kt.SHOW,t),n=c._getParentFromElement(this._element);g(n).trigger(e),e.isDefaultPrevented()||(g(this._menu).toggleClass(Lt),g(n).toggleClass(Lt).trigger(g.Event(kt.SHOWN,t)))}},t.hide=function(){if(!this._element.disabled&&!g(this._element).hasClass(Pt)&&g(this._menu).hasClass(Lt)){var t={relatedTarget:this._element},e=g.Event(kt.HIDE,t),n=c._getParentFromElement(this._element);g(n).trigger(e),e.isDefaultPrevented()||(g(this._menu).toggleClass(Lt),g(n).toggleClass(Lt).trigger(g.Event(kt.HIDDEN,t)))}},t.dispose=function(){g.removeData(this._element,Dt),g(this._element).off(wt),this._element=null,(this._menu=null)!==this._popper&&(this._popper.destroy(),this._popper=null)},t.update=function(){this._inNavbar=this._detectNavbar(),null!==this._popper&&this._popper.scheduleUpdate()},t._addEventListeners=function(){var e=this;g(this._element).on(kt.CLICK,function(t){t.preventDefault(),t.stopPropagation(),e.toggle()})},t._getConfig=function(t){return t=l({},this.constructor.Default,g(this._element).data(),t),_.typeCheckConfig(It,t,this.constructor.DefaultType),t},t._getMenuElement=function(){if(!this._menu){var t=c._getParentFromElement(this._element);t&&(this._menu=t.querySelector(qt))}return this._menu},t._getPlacement=function(){var t=g(this._element.parentNode),e=Vt;return t.hasClass(jt)?(e=Qt,g(this._menu).hasClass(xt)&&(e=Bt)):t.hasClass(Ht)?e=zt:t.hasClass(Rt)?e=Xt:g(this._menu).hasClass(xt)&&(e=Yt),e},t._detectNavbar=function(){return 0<g(this._element).closest(\".navbar\").length},t._getOffset=function(){var e=this,t={};return\"function\"==typeof this._config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,e._config.offset(t.offsets,e._element)||{}),t}:t.offset=this._config.offset,t},t._getPopperConfig=function(){var t={placement:this._getPlacement(),modifiers:{offset:this._getOffset(),flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}};return\"static\"===this._config.display&&(t.modifiers.applyStyle={enabled:!1}),t},c._jQueryInterface=function(e){return this.each(function(){var t=g(this).data(Dt);if(t||(t=new c(this,\"object\"==typeof e?e:null),g(this).data(Dt,t)),\"string\"==typeof e){if(\"undefined\"==typeof t[e])throw new TypeError('No method named \"'+e+'\"');t[e]()}})},c._clearMenus=function(t){if(!t||3!==t.which&&(\"keyup\"!==t.type||9===t.which))for(var e=[].slice.call(document.querySelectorAll(Ut)),n=0,i=e.length;n<i;n++){var o=c._getParentFromElement(e[n]),r=g(e[n]).data(Dt),s={relatedTarget:e[n]};if(t&&\"click\"===t.type&&(s.clickEvent=t),r){var a=r._menu;if(g(o).hasClass(Lt)&&!(t&&(\"click\"===t.type&&/input|textarea/i.test(t.target.tagName)||\"keyup\"===t.type&&9===t.which)&&g.contains(o,t.target))){var l=g.Event(kt.HIDE,s);g(o).trigger(l),l.isDefaultPrevented()||(\"ontouchstart\"in document.documentElement&&g(document.body).children().off(\"mouseover\",null,g.noop),e[n].setAttribute(\"aria-expanded\",\"false\"),g(a).removeClass(Lt),g(o).removeClass(Lt).trigger(g.Event(kt.HIDDEN,s)))}}}},c._getParentFromElement=function(t){var e,n=_.getSelectorFromElement(t);return n&&(e=document.querySelector(n)),e||t.parentNode},c._dataApiKeydownHandler=function(t){if((/input|textarea/i.test(t.target.tagName)?!(32===t.which||27!==t.which&&(40!==t.which&&38!==t.which||g(t.target).closest(qt).length)):Ot.test(t.which))&&(t.preventDefault(),t.stopPropagation(),!this.disabled&&!g(this).hasClass(Pt))){var e=c._getParentFromElement(this),n=g(e).hasClass(Lt);if(n&&(!n||27!==t.which&&32!==t.which)){var i=[].slice.call(e.querySelectorAll(Kt));if(0!==i.length){var o=i.indexOf(t.target);38===t.which&&0<o&&o--,40===t.which&&o<i.length-1&&o++,o<0&&(o=0),i[o].focus()}}else{if(27===t.which){var r=e.querySelector(Ut);g(r).trigger(\"focus\")}g(this).trigger(\"click\")}}},s(c,null,[{key:\"VERSION\",get:function(){return\"4.3.1\"}},{key:\"Default\",get:function(){return $t}},{key:\"DefaultType\",get:function(){return Gt}}]),c}();g(document).on(kt.KEYDOWN_DATA_API,Ut,Jt._dataApiKeydownHandler).on(kt.KEYDOWN_DATA_API,qt,Jt._dataApiKeydownHandler).on(kt.CLICK_DATA_API+\" \"+kt.KEYUP_DATA_API,Jt._clearMenus).on(kt.CLICK_DATA_API,Ut,function(t){t.preventDefault(),t.stopPropagation(),Jt._jQueryInterface.call(g(this),\"toggle\")}).on(kt.CLICK_DATA_API,Wt,function(t){t.stopPropagation()}),g.fn[It]=Jt._jQueryInterface,g.fn[It].Constructor=Jt,g.fn[It].noConflict=function(){return g.fn[It]=Nt,Jt._jQueryInterface};var Zt=\"modal\",te=\"bs.modal\",ee=\".\"+te,ne=g.fn[Zt],ie={backdrop:!0,keyboard:!0,focus:!0,show:!0},oe={backdrop:\"(boolean|string)\",keyboard:\"boolean\",focus:\"boolean\",show:\"boolean\"},re={HIDE:\"hide\"+ee,HIDDEN:\"hidden\"+ee,SHOW:\"show\"+ee,SHOWN:\"shown\"+ee,FOCUSIN:\"focusin\"+ee,RESIZE:\"resize\"+ee,CLICK_DISMISS:\"click.dismiss\"+ee,KEYDOWN_DISMISS:\"keydown.dismiss\"+ee,MOUSEUP_DISMISS:\"mouseup.dismiss\"+ee,MOUSEDOWN_DISMISS:\"mousedown.dismiss\"+ee,CLICK_DATA_API:\"click\"+ee+\".data-api\"},se=\"modal-dialog-scrollable\",ae=\"modal-scrollbar-measure\",le=\"modal-backdrop\",ce=\"modal-open\",he=\"fade\",ue=\"show\",fe=\".modal-dialog\",de=\".modal-body\",ge='[data-toggle=\"modal\"]',_e='[data-dismiss=\"modal\"]',me=\".fixed-top, .fixed-bottom, .is-fixed, .sticky-top\",pe=\".sticky-top\",ve=function(){function o(t,e){this._config=this._getConfig(e),this._element=t,this._dialog=t.querySelector(fe),this._backdrop=null,this._isShown=!1,this._isBodyOverflowing=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._scrollbarWidth=0}var t=o.prototype;return t.toggle=function(t){return this._isShown?this.hide():this.show(t)},t.show=function(t){var e=this;if(!this._isShown&&!this._isTransitioning){g(this._element).hasClass(he)&&(this._isTransitioning=!0);var n=g.Event(re.SHOW,{relatedTarget:t});g(this._element).trigger(n),this._isShown||n.isDefaultPrevented()||(this._isShown=!0,this._checkScrollbar(),this._setScrollbar(),this._adjustDialog(),this._setEscapeEvent(),this._setResizeEvent(),g(this._element).on(re.CLICK_DISMISS,_e,function(t){return e.hide(t)}),g(this._dialog).on(re.MOUSEDOWN_DISMISS,function(){g(e._element).one(re.MOUSEUP_DISMISS,function(t){g(t.target).is(e._element)&&(e._ignoreBackdropClick=!0)})}),this._showBackdrop(function(){return e._showElement(t)}))}},t.hide=function(t){var e=this;if(t&&t.preventDefault(),this._isShown&&!this._isTransitioning){var n=g.Event(re.HIDE);if(g(this._element).trigger(n),this._isShown&&!n.isDefaultPrevented()){this._isShown=!1;var i=g(this._element).hasClass(he);if(i&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),g(document).off(re.FOCUSIN),g(this._element).removeClass(ue),g(this._element).off(re.CLICK_DISMISS),g(this._dialog).off(re.MOUSEDOWN_DISMISS),i){var o=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,function(t){return e._hideModal(t)}).emulateTransitionEnd(o)}else this._hideModal()}}},t.dispose=function(){[window,this._element,this._dialog].forEach(function(t){return g(t).off(ee)}),g(document).off(re.FOCUSIN),g.removeData(this._element,te),this._config=null,this._element=null,this._dialog=null,this._backdrop=null,this._isShown=null,this._isBodyOverflowing=null,this._ignoreBackdropClick=null,this._isTransitioning=null,this._scrollbarWidth=null},t.handleUpdate=function(){this._adjustDialog()},t._getConfig=function(t){return t=l({},ie,t),_.typeCheckConfig(Zt,t,oe),t},t._showElement=function(t){var e=this,n=g(this._element).hasClass(he);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display=\"block\",this._element.removeAttribute(\"aria-hidden\"),this._element.setAttribute(\"aria-modal\",!0),g(this._dialog).hasClass(se)?this._dialog.querySelector(de).scrollTop=0:this._element.scrollTop=0,n&&_.reflow(this._element),g(this._element).addClass(ue),this._config.focus&&this._enforceFocus();var i=g.Event(re.SHOWN,{relatedTarget:t}),o=function(){e._config.focus&&e._element.focus(),e._isTransitioning=!1,g(e._element).trigger(i)};if(n){var r=_.getTransitionDurationFromElement(this._dialog);g(this._dialog).one(_.TRANSITION_END,o).emulateTransitionEnd(r)}else o()},t._enforceFocus=function(){var e=this;g(document).off(re.FOCUSIN).on(re.FOCUSIN,function(t){document!==t.target&&e._element!==t.target&&0===g(e._element).has(t.target).length&&e._element.focus()})},t._setEscapeEvent=function(){var e=this;this._isShown&&this._config.keyboard?g(this._element).on(re.KEYDOWN_DISMISS,function(t){27===t.which&&(t.preventDefault(),e.hide())}):this._isShown||g(this._element).off(re.KEYDOWN_DISMISS)},t._setResizeEvent=function(){var e=this;this._isShown?g(window).on(re.RESIZE,function(t){return e.handleUpdate(t)}):g(window).off(re.RESIZE)},t._hideModal=function(){var t=this;this._element.style.display=\"none\",this._element.setAttribute(\"aria-hidden\",!0),this._element.removeAttribute(\"aria-modal\"),this._isTransitioning=!1,this._showBackdrop(function(){g(document.body).removeClass(ce),t._resetAdjustments(),t._resetScrollbar(),g(t._element).trigger(re.HIDDEN)})},t._removeBackdrop=function(){this._backdrop&&(g(this._backdrop).remove(),this._backdrop=null)},t._showBackdrop=function(t){var e=this,n=g(this._element).hasClass(he)?he:\"\";if(this._isShown&&this._config.backdrop){if(this._backdrop=document.createElement(\"div\"),this._backdrop.className=le,n&&this._backdrop.classList.add(n),g(this._backdrop).appendTo(document.body),g(this._element).on(re.CLICK_DISMISS,function(t){e._ignoreBackdropClick?e._ignoreBackdropClick=!1:t.target===t.currentTarget&&(\"static\"===e._config.backdrop?e._element.focus():e.hide())}),n&&_.reflow(this._backdrop),g(this._backdrop).addClass(ue),!t)return;if(!n)return void t();var i=_.getTransitionDurationFromElement(this._backdrop);g(this._backdrop).one(_.TRANSITION_END,t).emulateTransitionEnd(i)}else if(!this._isShown&&this._backdrop){g(this._backdrop).removeClass(ue);var o=function(){e._removeBackdrop(),t&&t()};if(g(this._element).hasClass(he)){var r=_.getTransitionDurationFromElement(this._backdrop);g(this._backdrop).one(_.TRANSITION_END,o).emulateTransitionEnd(r)}else o()}else t&&t()},t._adjustDialog=function(){var t=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+\"px\"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+\"px\")},t._resetAdjustments=function(){this._element.style.paddingLeft=\"\",this._element.style.paddingRight=\"\"},t._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right<window.innerWidth,this._scrollbarWidth=this._getScrollbarWidth()},t._setScrollbar=function(){var o=this;if(this._isBodyOverflowing){var t=[].slice.call(document.querySelectorAll(me)),e=[].slice.call(document.querySelectorAll(pe));g(t).each(function(t,e){var n=e.style.paddingRight,i=g(e).css(\"padding-right\");g(e).data(\"padding-right\",n).css(\"padding-right\",parseFloat(i)+o._scrollbarWidth+\"px\")}),g(e).each(function(t,e){var n=e.style.marginRight,i=g(e).css(\"margin-right\");g(e).data(\"margin-right\",n).css(\"margin-right\",parseFloat(i)-o._scrollbarWidth+\"px\")});var n=document.body.style.paddingRight,i=g(document.body).css(\"padding-right\");g(document.body).data(\"padding-right\",n).css(\"padding-right\",parseFloat(i)+this._scrollbarWidth+\"px\")}g(document.body).addClass(ce)},t._resetScrollbar=function(){var t=[].slice.call(document.querySelectorAll(me));g(t).each(function(t,e){var n=g(e).data(\"padding-right\");g(e).removeData(\"padding-right\"),e.style.paddingRight=n||\"\"});var e=[].slice.call(document.querySelectorAll(\"\"+pe));g(e).each(function(t,e){var n=g(e).data(\"margin-right\");\"undefined\"!=typeof n&&g(e).css(\"margin-right\",n).removeData(\"margin-right\")});var n=g(document.body).data(\"padding-right\");g(document.body).removeData(\"padding-right\"),document.body.style.paddingRight=n||\"\"},t._getScrollbarWidth=function(){var t=document.createElement(\"div\");t.className=ae,document.body.appendChild(t);var e=t.getBoundingClientRect().width-t.clientWidth;return document.body.removeChild(t),e},o._jQueryInterface=function(n,i){return this.each(function(){var t=g(this).data(te),e=l({},ie,g(this).data(),\"object\"==typeof n&&n?n:{});if(t||(t=new o(this,e),g(this).data(te,t)),\"string\"==typeof n){if(\"undefined\"==typeof t[n])throw new TypeError('No method named \"'+n+'\"');t[n](i)}else e.show&&t.show(i)})},s(o,null,[{key:\"VERSION\",get:function(){return\"4.3.1\"}},{key:\"Default\",get:function(){return ie}}]),o}();g(document).on(re.CLICK_DATA_API,ge,function(t){var e,n=this,i=_.getSelectorFromElement(this);i&&(e=document.querySelector(i));var o=g(e).data(te)?\"toggle\":l({},g(e).data(),g(this).data());\"A\"!==this.tagName&&\"AREA\"!==this.tagName||t.preventDefault();var r=g(e).one(re.SHOW,function(t){t.isDefaultPrevented()||r.one(re.HIDDEN,function(){g(n).is(\":visible\")&&n.focus()})});ve._jQueryInterface.call(g(e),o,this)}),g.fn[Zt]=ve._jQueryInterface,g.fn[Zt].Constructor=ve,g.fn[Zt].noConflict=function(){return g.fn[Zt]=ne,ve._jQueryInterface};var ye=[\"background\",\"cite\",\"href\",\"itemtype\",\"longdesc\",\"poster\",\"src\",\"xlink:href\"],Ee={\"*\":[\"class\",\"dir\",\"id\",\"lang\",\"role\",/^aria-[\\w-]*$/i],a:[\"target\",\"href\",\"title\",\"rel\"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:[\"src\",\"alt\",\"title\",\"width\",\"height\"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Ce=/^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi,Te=/^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i;function Se(t,s,e){if(0===t.length)return t;if(e&&\"function\"==typeof e)return e(t);for(var n=(new window.DOMParser).parseFromString(t,\"text/html\"),a=Object.keys(s),l=[].slice.call(n.body.querySelectorAll(\"*\")),i=function(t,e){var n=l[t],i=n.nodeName.toLowerCase();if(-1===a.indexOf(n.nodeName.toLowerCase()))return n.parentNode.removeChild(n),\"continue\";var o=[].slice.call(n.attributes),r=[].concat(s[\"*\"]||[],s[i]||[]);o.forEach(function(t){(function(t,e){var n=t.nodeName.toLowerCase();if(-1!==e.indexOf(n))return-1===ye.indexOf(n)||Boolean(t.nodeValue.match(Ce)||t.nodeValue.match(Te));for(var i=e.filter(function(t){return t instanceof RegExp}),o=0,r=i.length;o<r;o++)if(n.match(i[o]))return!0;return!1})(t,r)||n.removeAttribute(t.nodeName)})},o=0,r=l.length;o<r;o++)i(o);return n.body.innerHTML}var be=\"tooltip\",Ie=\"bs.tooltip\",De=\".\"+Ie,we=g.fn[be],Ae=\"bs-tooltip\",Ne=new RegExp(\"(^|\\\\s)\"+Ae+\"\\\\S+\",\"g\"),Oe=[\"sanitize\",\"whiteList\",\"sanitizeFn\"],ke={animation:\"boolean\",template:\"string\",title:\"(string|element|function)\",trigger:\"string\",delay:\"(number|object)\",html:\"boolean\",selector:\"(string|boolean)\",placement:\"(string|function)\",offset:\"(number|string|function)\",container:\"(string|element|boolean)\",fallbackPlacement:\"(string|array)\",boundary:\"(string|element)\",sanitize:\"boolean\",sanitizeFn:\"(null|function)\",whiteList:\"object\"},Pe={AUTO:\"auto\",TOP:\"top\",RIGHT:\"right\",BOTTOM:\"bottom\",LEFT:\"left\"},Le={animation:!0,template:'<div class=\"tooltip\" role=\"tooltip\"><div class=\"arrow\"></div><div class=\"tooltip-inner\"></div></div>',trigger:\"hover focus\",title:\"\",delay:0,html:!1,selector:!1,placement:\"top\",offset:0,container:!1,fallbackPlacement:\"flip\",boundary:\"scrollParent\",sanitize:!0,sanitizeFn:null,whiteList:Ee},je=\"show\",He=\"out\",Re={HIDE:\"hide\"+De,HIDDEN:\"hidden\"+De,SHOW:\"show\"+De,SHOWN:\"shown\"+De,INSERTED:\"inserted\"+De,CLICK:\"click\"+De,FOCUSIN:\"focusin\"+De,FOCUSOUT:\"focusout\"+De,MOUSEENTER:\"mouseenter\"+De,MOUSELEAVE:\"mouseleave\"+De},xe=\"fade\",Fe=\"show\",Ue=\".tooltip-inner\",We=\".arrow\",qe=\"hover\",Me=\"focus\",Ke=\"click\",Qe=\"manual\",Be=function(){function i(t,e){if(\"undefined\"==typeof u)throw new TypeError(\"Bootstrap's tooltips require Popper.js (https://popper.js.org/)\");this._isEnabled=!0,this._timeout=0,this._hoverState=\"\",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var t=i.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=g(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(g(this.getTipElement()).hasClass(Fe))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),g.removeData(this.element,this.constructor.DATA_KEY),g(this.element).off(this.constructor.EVENT_KEY),g(this.element).closest(\".modal\").off(\"hide.bs.modal\"),this.tip&&g(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if(\"none\"===g(this.element).css(\"display\"))throw new Error(\"Please use show on visible elements\");var t=g.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){g(this.element).trigger(t);var n=_.findShadowRoot(this.element),i=g.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!i)return;var o=this.getTipElement(),r=_.getUID(this.constructor.NAME);o.setAttribute(\"id\",r),this.element.setAttribute(\"aria-describedby\",r),this.setContent(),this.config.animation&&g(o).addClass(xe);var s=\"function\"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();g(o).data(this.constructor.DATA_KEY,this),g.contains(this.element.ownerDocument.documentElement,this.tip)||g(o).appendTo(l),g(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new u(this.element,o,{placement:a,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:We},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}}),g(o).addClass(Fe),\"ontouchstart\"in document.documentElement&&g(document.body).children().on(\"mouseover\",null,g.noop);var c=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,g(e.element).trigger(e.constructor.Event.SHOWN),t===He&&e._leave(null,e)};if(g(this.tip).hasClass(xe)){var h=_.getTransitionDurationFromElement(this.tip);g(this.tip).one(_.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},t.hide=function(t){var e=this,n=this.getTipElement(),i=g.Event(this.constructor.Event.HIDE),o=function(){e._hoverState!==je&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute(\"aria-describedby\"),g(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(g(this.element).trigger(i),!i.isDefaultPrevented()){if(g(n).removeClass(Fe),\"ontouchstart\"in document.documentElement&&g(document.body).children().off(\"mouseover\",null,g.noop),this._activeTrigger[Ke]=!1,this._activeTrigger[Me]=!1,this._activeTrigger[qe]=!1,g(this.tip).hasClass(xe)){var r=_.getTransitionDurationFromElement(n);g(n).one(_.TRANSITION_END,o).emulateTransitionEnd(r)}else o();this._hoverState=\"\"}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(t){g(this.getTipElement()).addClass(Ae+\"-\"+t)},t.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},t.setContent=function(){var t=this.getTipElement();this.setElementContent(g(t.querySelectorAll(Ue)),this.getTitle()),g(t).removeClass(xe+\" \"+Fe)},t.setElementContent=function(t,e){\"object\"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=Se(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?g(e).parent().is(t)||t.empty().append(e):t.text(g(e).text())},t.getTitle=function(){var t=this.element.getAttribute(\"data-original-title\");return t||(t=\"function\"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},t._getOffset=function(){var e=this,t={};return\"function\"==typeof this.config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,e.config.offset(t.offsets,e.element)||{}),t}:t.offset=this.config.offset,t},t._getContainer=function(){return!1===this.config.container?document.body:_.isElement(this.config.container)?g(this.config.container):g(document).find(this.config.container)},t._getAttachment=function(t){return Pe[t.toUpperCase()]},t._setListeners=function(){var i=this;this.config.trigger.split(\" \").forEach(function(t){if(\"click\"===t)g(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(t){return i.toggle(t)});else if(t!==Qe){var e=t===qe?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=t===qe?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;g(i.element).on(e,i.config.selector,function(t){return i._enter(t)}).on(n,i.config.selector,function(t){return i._leave(t)})}}),g(this.element).closest(\".modal\").on(\"hide.bs.modal\",function(){i.element&&i.hide()}),this.config.selector?this.config=l({},this.config,{trigger:\"manual\",selector:\"\"}):this._fixTitle()},t._fixTitle=function(){var t=typeof this.element.getAttribute(\"data-original-title\");(this.element.getAttribute(\"title\")||\"string\"!==t)&&(this.element.setAttribute(\"data-original-title\",this.element.getAttribute(\"title\")||\"\"),this.element.setAttribute(\"title\",\"\"))},t._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger[\"focusin\"===t.type?Me:qe]=!0),g(e.getTipElement()).hasClass(Fe)||e._hoverState===je?e._hoverState=je:(clearTimeout(e._timeout),e._hoverState=je,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(function(){e._hoverState===je&&e.show()},e.config.delay.show):e.show())},t._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger[\"focusout\"===t.type?Me:qe]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=He,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(function(){e._hoverState===He&&e.hide()},e.config.delay.hide):e.hide())},t._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},t._getConfig=function(t){var e=g(this.element).data();return Object.keys(e).forEach(function(t){-1!==Oe.indexOf(t)&&delete e[t]}),\"number\"==typeof(t=l({},this.constructor.Default,e,\"object\"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),\"number\"==typeof t.title&&(t.title=t.title.toString()),\"number\"==typeof t.content&&(t.content=t.content.toString()),_.typeCheckConfig(be,t,this.constructor.DefaultType),t.sanitize&&(t.template=Se(t.template,t.whiteList,t.sanitizeFn)),t},t._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},t._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr(\"class\").match(Ne);null!==e&&e.length&&t.removeClass(e.join(\"\"))},t._handlePopperPlacementChange=function(t){var e=t.instance;this.tip=e.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},t._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute(\"x-placement\")&&(g(t).removeClass(xe),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},i._jQueryInterface=function(n){return this.each(function(){var t=g(this).data(Ie),e=\"object\"==typeof n&&n;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),g(this).data(Ie,t)),\"string\"==typeof n)){if(\"undefined\"==typeof t[n])throw new TypeError('No method named \"'+n+'\"');t[n]()}})},s(i,null,[{key:\"VERSION\",get:function(){return\"4.3.1\"}},{key:\"Default\",get:function(){return Le}},{key:\"NAME\",get:function(){return be}},{key:\"DATA_KEY\",get:function(){return Ie}},{key:\"Event\",get:function(){return Re}},{key:\"EVENT_KEY\",get:function(){return De}},{key:\"DefaultType\",get:function(){return ke}}]),i}();g.fn[be]=Be._jQueryInterface,g.fn[be].Constructor=Be,g.fn[be].noConflict=function(){return g.fn[be]=we,Be._jQueryInterface};var Ve=\"popover\",Ye=\"bs.popover\",ze=\".\"+Ye,Xe=g.fn[Ve],$e=\"bs-popover\",Ge=new RegExp(\"(^|\\\\s)\"+$e+\"\\\\S+\",\"g\"),Je=l({},Be.Default,{placement:\"right\",trigger:\"click\",content:\"\",template:'<div class=\"popover\" role=\"tooltip\"><div class=\"arrow\"></div><h3 class=\"popover-header\"></h3><div class=\"popover-body\"></div></div>'}),Ze=l({},Be.DefaultType,{content:\"(string|element|function)\"}),tn=\"fade\",en=\"show\",nn=\".popover-header\",on=\".popover-body\",rn={HIDE:\"hide\"+ze,HIDDEN:\"hidden\"+ze,SHOW:\"show\"+ze,SHOWN:\"shown\"+ze,INSERTED:\"inserted\"+ze,CLICK:\"click\"+ze,FOCUSIN:\"focusin\"+ze,FOCUSOUT:\"focusout\"+ze,MOUSEENTER:\"mouseenter\"+ze,MOUSELEAVE:\"mouseleave\"+ze},sn=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),(e.prototype.constructor=e).__proto__=n;var o=i.prototype;return o.isWithContent=function(){return this.getTitle()||this._getContent()},o.addAttachmentClass=function(t){g(this.getTipElement()).addClass($e+\"-\"+t)},o.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},o.setContent=function(){var t=g(this.getTipElement());this.setElementContent(t.find(nn),this.getTitle());var e=this._getContent();\"function\"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(on),e),t.removeClass(tn+\" \"+en)},o._getContent=function(){return this.element.getAttribute(\"data-content\")||this.config.content},o._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr(\"class\").match(Ge);null!==e&&0<e.length&&t.removeClass(e.join(\"\"))},i._jQueryInterface=function(n){return this.each(function(){var t=g(this).data(Ye),e=\"object\"==typeof n?n:null;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),g(this).data(Ye,t)),\"string\"==typeof n)){if(\"undefined\"==typeof t[n])throw new TypeError('No method named \"'+n+'\"');t[n]()}})},s(i,null,[{key:\"VERSION\",get:function(){return\"4.3.1\"}},{key:\"Default\",get:function(){return Je}},{key:\"NAME\",get:function(){return Ve}},{key:\"DATA_KEY\",get:function(){return Ye}},{key:\"Event\",get:function(){return rn}},{key:\"EVENT_KEY\",get:function(){return ze}},{key:\"DefaultType\",get:function(){return Ze}}]),i}(Be);g.fn[Ve]=sn._jQueryInterface,g.fn[Ve].Constructor=sn,g.fn[Ve].noConflict=function(){return g.fn[Ve]=Xe,sn._jQueryInterface};var an=\"scrollspy\",ln=\"bs.scrollspy\",cn=\".\"+ln,hn=g.fn[an],un={offset:10,method:\"auto\",target:\"\"},fn={offset:\"number\",method:\"string\",target:\"(string|element)\"},dn={ACTIVATE:\"activate\"+cn,SCROLL:\"scroll\"+cn,LOAD_DATA_API:\"load\"+cn+\".data-api\"},gn=\"dropdown-item\",_n=\"active\",mn='[data-spy=\"scroll\"]',pn=\".nav, .list-group\",vn=\".nav-link\",yn=\".nav-item\",En=\".list-group-item\",Cn=\".dropdown\",Tn=\".dropdown-item\",Sn=\".dropdown-toggle\",bn=\"offset\",In=\"position\",Dn=function(){function n(t,e){var n=this;this._element=t,this._scrollElement=\"BODY\"===t.tagName?window:t,this._config=this._getConfig(e),this._selector=this._config.target+\" \"+vn+\",\"+this._config.target+\" \"+En+\",\"+this._config.target+\" \"+Tn,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,g(this._scrollElement).on(dn.SCROLL,function(t){return n._process(t)}),this.refresh(),this._process()}var t=n.prototype;return t.refresh=function(){var e=this,t=this._scrollElement===this._scrollElement.window?bn:In,o=\"auto\"===this._config.method?t:this._config.method,r=o===In?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),[].slice.call(document.querySelectorAll(this._selector)).map(function(t){var e,n=_.getSelectorFromElement(t);if(n&&(e=document.querySelector(n)),e){var i=e.getBoundingClientRect();if(i.width||i.height)return[g(e)[o]().top+r,n]}return null}).filter(function(t){return t}).sort(function(t,e){return t[0]-e[0]}).forEach(function(t){e._offsets.push(t[0]),e._targets.push(t[1])})},t.dispose=function(){g.removeData(this._element,ln),g(this._scrollElement).off(cn),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},t._getConfig=function(t){if(\"string\"!=typeof(t=l({},un,\"object\"==typeof t&&t?t:{})).target){var e=g(t.target).attr(\"id\");e||(e=_.getUID(an),g(t.target).attr(\"id\",e)),t.target=\"#\"+e}return _.typeCheckConfig(an,t,fn),t},t._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},t._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},t._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},t._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),n<=t){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t<this._offsets[0]&&0<this._offsets[0])return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;){this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&(\"undefined\"==typeof this._offsets[o+1]||t<this._offsets[o+1])&&this._activate(this._targets[o])}}},t._activate=function(e){this._activeTarget=e,this._clear();var t=this._selector.split(\",\").map(function(t){return t+'[data-target=\"'+e+'\"],'+t+'[href=\"'+e+'\"]'}),n=g([].slice.call(document.querySelectorAll(t.join(\",\"))));n.hasClass(gn)?(n.closest(Cn).find(Sn).addClass(_n),n.addClass(_n)):(n.addClass(_n),n.parents(pn).prev(vn+\", \"+En).addClass(_n),n.parents(pn).prev(yn).children(vn).addClass(_n)),g(this._scrollElement).trigger(dn.ACTIVATE,{relatedTarget:e})},t._clear=function(){[].slice.call(document.querySelectorAll(this._selector)).filter(function(t){return t.classList.contains(_n)}).forEach(function(t){return t.classList.remove(_n)})},n._jQueryInterface=function(e){return this.each(function(){var t=g(this).data(ln);if(t||(t=new n(this,\"object\"==typeof e&&e),g(this).data(ln,t)),\"string\"==typeof e){if(\"undefined\"==typeof t[e])throw new TypeError('No method named \"'+e+'\"');t[e]()}})},s(n,null,[{key:\"VERSION\",get:function(){return\"4.3.1\"}},{key:\"Default\",get:function(){return un}}]),n}();g(window).on(dn.LOAD_DATA_API,function(){for(var t=[].slice.call(document.querySelectorAll(mn)),e=t.length;e--;){var n=g(t[e]);Dn._jQueryInterface.call(n,n.data())}}),g.fn[an]=Dn._jQueryInterface,g.fn[an].Constructor=Dn,g.fn[an].noConflict=function(){return g.fn[an]=hn,Dn._jQueryInterface};var wn=\"bs.tab\",An=\".\"+wn,Nn=g.fn.tab,On={HIDE:\"hide\"+An,HIDDEN:\"hidden\"+An,SHOW:\"show\"+An,SHOWN:\"shown\"+An,CLICK_DATA_API:\"click\"+An+\".data-api\"},kn=\"dropdown-menu\",Pn=\"active\",Ln=\"disabled\",jn=\"fade\",Hn=\"show\",Rn=\".dropdown\",xn=\".nav, .list-group\",Fn=\".active\",Un=\"> li > .active\",Wn='[data-toggle=\"tab\"], [data-toggle=\"pill\"], [data-toggle=\"list\"]',qn=\".dropdown-toggle\",Mn=\"> .dropdown-menu .active\",Kn=function(){function i(t){this._element=t}var t=i.prototype;return t.show=function(){var n=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&g(this._element).hasClass(Pn)||g(this._element).hasClass(Ln))){var t,i,e=g(this._element).closest(xn)[0],o=_.getSelectorFromElement(this._element);if(e){var r=\"UL\"===e.nodeName||\"OL\"===e.nodeName?Un:Fn;i=(i=g.makeArray(g(e).find(r)))[i.length-1]}var s=g.Event(On.HIDE,{relatedTarget:this._element}),a=g.Event(On.SHOW,{relatedTarget:i});if(i&&g(i).trigger(s),g(this._element).trigger(a),!a.isDefaultPrevented()&&!s.isDefaultPrevented()){o&&(t=document.querySelector(o)),this._activate(this._element,e);var l=function(){var t=g.Event(On.HIDDEN,{relatedTarget:n._element}),e=g.Event(On.SHOWN,{relatedTarget:i});g(i).trigger(t),g(n._element).trigger(e)};t?this._activate(t,t.parentNode,l):l()}}},t.dispose=function(){g.removeData(this._element,wn),this._element=null},t._activate=function(t,e,n){var i=this,o=(!e||\"UL\"!==e.nodeName&&\"OL\"!==e.nodeName?g(e).children(Fn):g(e).find(Un))[0],r=n&&o&&g(o).hasClass(jn),s=function(){return i._transitionComplete(t,o,n)};if(o&&r){var a=_.getTransitionDurationFromElement(o);g(o).removeClass(Hn).one(_.TRANSITION_END,s).emulateTransitionEnd(a)}else s()},t._transitionComplete=function(t,e,n){if(e){g(e).removeClass(Pn);var i=g(e.parentNode).find(Mn)[0];i&&g(i).removeClass(Pn),\"tab\"===e.getAttribute(\"role\")&&e.setAttribute(\"aria-selected\",!1)}if(g(t).addClass(Pn),\"tab\"===t.getAttribute(\"role\")&&t.setAttribute(\"aria-selected\",!0),_.reflow(t),t.classList.contains(jn)&&t.classList.add(Hn),t.parentNode&&g(t.parentNode).hasClass(kn)){var o=g(t).closest(Rn)[0];if(o){var r=[].slice.call(o.querySelectorAll(qn));g(r).addClass(Pn)}t.setAttribute(\"aria-expanded\",!0)}n&&n()},i._jQueryInterface=function(n){return this.each(function(){var t=g(this),e=t.data(wn);if(e||(e=new i(this),t.data(wn,e)),\"string\"==typeof n){if(\"undefined\"==typeof e[n])throw new TypeError('No method named \"'+n+'\"');e[n]()}})},s(i,null,[{key:\"VERSION\",get:function(){return\"4.3.1\"}}]),i}();g(document).on(On.CLICK_DATA_API,Wn,function(t){t.preventDefault(),Kn._jQueryInterface.call(g(this),\"show\")}),g.fn.tab=Kn._jQueryInterface,g.fn.tab.Constructor=Kn,g.fn.tab.noConflict=function(){return g.fn.tab=Nn,Kn._jQueryInterface};var Qn=\"toast\",Bn=\"bs.toast\",Vn=\".\"+Bn,Yn=g.fn[Qn],zn={CLICK_DISMISS:\"click.dismiss\"+Vn,HIDE:\"hide\"+Vn,HIDDEN:\"hidden\"+Vn,SHOW:\"show\"+Vn,SHOWN:\"shown\"+Vn},Xn=\"fade\",$n=\"hide\",Gn=\"show\",Jn=\"showing\",Zn={animation:\"boolean\",autohide:\"boolean\",delay:\"number\"},ti={animation:!0,autohide:!0,delay:500},ei='[data-dismiss=\"toast\"]',ni=function(){function i(t,e){this._element=t,this._config=this._getConfig(e),this._timeout=null,this._setListeners()}var t=i.prototype;return t.show=function(){var t=this;g(this._element).trigger(zn.SHOW),this._config.animation&&this._element.classList.add(Xn);var e=function(){t._element.classList.remove(Jn),t._element.classList.add(Gn),g(t._element).trigger(zn.SHOWN),t._config.autohide&&t.hide()};if(this._element.classList.remove($n),this._element.classList.add(Jn),this._config.animation){var n=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,e).emulateTransitionEnd(n)}else e()},t.hide=function(t){var e=this;this._element.classList.contains(Gn)&&(g(this._element).trigger(zn.HIDE),t?this._close():this._timeout=setTimeout(function(){e._close()},this._config.delay))},t.dispose=function(){clearTimeout(this._timeout),this._timeout=null,this._element.classList.contains(Gn)&&this._element.classList.remove(Gn),g(this._element).off(zn.CLICK_DISMISS),g.removeData(this._element,Bn),this._element=null,this._config=null},t._getConfig=function(t){return t=l({},ti,g(this._element).data(),\"object\"==typeof t&&t?t:{}),_.typeCheckConfig(Qn,t,this.constructor.DefaultType),t},t._setListeners=function(){var t=this;g(this._element).on(zn.CLICK_DISMISS,ei,function(){return t.hide(!0)})},t._close=function(){var t=this,e=function(){t._element.classList.add($n),g(t._element).trigger(zn.HIDDEN)};if(this._element.classList.remove(Gn),this._config.animation){var n=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,e).emulateTransitionEnd(n)}else e()},i._jQueryInterface=function(n){return this.each(function(){var t=g(this),e=t.data(Bn);if(e||(e=new i(this,\"object\"==typeof n&&n),t.data(Bn,e)),\"string\"==typeof n){if(\"undefined\"==typeof e[n])throw new TypeError('No method named \"'+n+'\"');e[n](this)}})},s(i,null,[{key:\"VERSION\",get:function(){return\"4.3.1\"}},{key:\"DefaultType\",get:function(){return Zn}},{key:\"Default\",get:function(){return ti}}]),i}();g.fn[Qn]=ni._jQueryInterface,g.fn[Qn].Constructor=ni,g.fn[Qn].noConflict=function(){return g.fn[Qn]=Yn,ni._jQueryInterface},function(){if(\"undefined\"==typeof g)throw new TypeError(\"Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.\");var t=g.fn.jquery.split(\" \")[0].split(\".\");if(t[0]<2&&t[1]<9||1===t[0]&&9===t[1]&&t[2]<1||4<=t[0])throw new Error(\"Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0\")}(),t.Util=_,t.Alert=p,t.Button=P,t.Carousel=lt,t.Collapse=bt,t.Dropdown=Jt,t.Modal=ve,t.Popover=sn,t.Scrollspy=Dn,t.Tab=Kn,t.Toast=ni,t.Tooltip=Be,Object.defineProperty(t,\"__esModule\",{value:!0})});\n//# sourceMappingURL=bootstrap.min.js.map"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bootstrap4/js/bootstrap.min.js.map",
    "content": "{\"version\":3,\"sources\":[\"../../js/src/util.js\",\"../../js/src/alert.js\",\"../../js/src/button.js\",\"../../js/src/carousel.js\",\"../../js/src/collapse.js\",\"../../js/src/dropdown.js\",\"../../js/src/modal.js\",\"../../js/src/tools/sanitizer.js\",\"../../js/src/tooltip.js\",\"../../js/src/popover.js\",\"../../js/src/scrollspy.js\",\"../../js/src/tab.js\",\"../../js/src/toast.js\",\"../../js/src/index.js\"],\"names\":[\"TRANSITION_END\",\"transitionEndEmulator\",\"duration\",\"_this\",\"this\",\"called\",\"$\",\"one\",\"Util\",\"setTimeout\",\"triggerTransitionEnd\",\"getUID\",\"prefix\",\"Math\",\"random\",\"document\",\"getElementById\",\"getSelectorFromElement\",\"element\",\"selector\",\"getAttribute\",\"hrefAttr\",\"trim\",\"querySelector\",\"err\",\"getTransitionDurationFromElement\",\"transitionDuration\",\"css\",\"transitionDelay\",\"floatTransitionDuration\",\"parseFloat\",\"floatTransitionDelay\",\"split\",\"reflow\",\"offsetHeight\",\"trigger\",\"supportsTransitionEnd\",\"Boolean\",\"isElement\",\"obj\",\"nodeType\",\"typeCheckConfig\",\"componentName\",\"config\",\"configTypes\",\"property\",\"Object\",\"prototype\",\"hasOwnProperty\",\"call\",\"expectedTypes\",\"value\",\"valueType\",\"toString\",\"match\",\"toLowerCase\",\"RegExp\",\"test\",\"Error\",\"toUpperCase\",\"findShadowRoot\",\"documentElement\",\"attachShadow\",\"getRootNode\",\"ShadowRoot\",\"parentNode\",\"root\",\"fn\",\"emulateTransitionEnd\",\"event\",\"special\",\"bindType\",\"delegateType\",\"handle\",\"target\",\"is\",\"handleObj\",\"handler\",\"apply\",\"arguments\",\"NAME\",\"DATA_KEY\",\"EVENT_KEY\",\"JQUERY_NO_CONFLICT\",\"Event\",\"CLOSE\",\"CLOSED\",\"CLICK_DATA_API\",\"ClassName\",\"Alert\",\"_element\",\"close\",\"rootElement\",\"_getRootElement\",\"_triggerCloseEvent\",\"isDefaultPrevented\",\"_removeElement\",\"dispose\",\"removeData\",\"parent\",\"closest\",\"closeEvent\",\"removeClass\",\"hasClass\",\"_destroyElement\",\"detach\",\"remove\",\"_jQueryInterface\",\"each\",\"$element\",\"data\",\"_handleDismiss\",\"alertInstance\",\"preventDefault\",\"on\",\"Constructor\",\"noConflict\",\"DATA_API_KEY\",\"Selector\",\"FOCUS_BLUR_DATA_API\",\"Button\",\"toggle\",\"triggerChangeEvent\",\"addAriaPressed\",\"input\",\"type\",\"checked\",\"classList\",\"contains\",\"activeElement\",\"hasAttribute\",\"focus\",\"setAttribute\",\"toggleClass\",\"button\",\"Default\",\"interval\",\"keyboard\",\"slide\",\"pause\",\"wrap\",\"touch\",\"DefaultType\",\"Direction\",\"SLIDE\",\"SLID\",\"KEYDOWN\",\"MOUSEENTER\",\"MOUSELEAVE\",\"TOUCHSTART\",\"TOUCHMOVE\",\"TOUCHEND\",\"POINTERDOWN\",\"POINTERUP\",\"DRAG_START\",\"LOAD_DATA_API\",\"PointerType\",\"TOUCH\",\"PEN\",\"Carousel\",\"_items\",\"_interval\",\"_activeElement\",\"_isPaused\",\"_isSliding\",\"touchTimeout\",\"touchStartX\",\"touchDeltaX\",\"_config\",\"_getConfig\",\"_indicatorsElement\",\"_touchSupported\",\"navigator\",\"maxTouchPoints\",\"_pointerEvent\",\"window\",\"PointerEvent\",\"MSPointerEvent\",\"_addEventListeners\",\"next\",\"_slide\",\"nextWhenVisible\",\"hidden\",\"prev\",\"cycle\",\"clearInterval\",\"setInterval\",\"visibilityState\",\"bind\",\"to\",\"index\",\"activeIndex\",\"_getItemIndex\",\"length\",\"direction\",\"off\",\"_objectSpread\",\"_handleSwipe\",\"absDeltax\",\"abs\",\"_this2\",\"_keydown\",\"_addTouchEventListeners\",\"_this3\",\"start\",\"originalEvent\",\"pointerType\",\"clientX\",\"touches\",\"end\",\"clearTimeout\",\"querySelectorAll\",\"e\",\"add\",\"tagName\",\"which\",\"slice\",\"indexOf\",\"_getItemByDirection\",\"isNextDirection\",\"isPrevDirection\",\"lastItemIndex\",\"itemIndex\",\"_triggerSlideEvent\",\"relatedTarget\",\"eventDirectionName\",\"targetIndex\",\"fromIndex\",\"slideEvent\",\"from\",\"_setActiveIndicatorElement\",\"indicators\",\"nextIndicator\",\"children\",\"addClass\",\"directionalClassName\",\"orderClassName\",\"_this4\",\"activeElementIndex\",\"nextElement\",\"nextElementIndex\",\"isCycling\",\"slidEvent\",\"nextElementInterval\",\"parseInt\",\"defaultInterval\",\"action\",\"TypeError\",\"ride\",\"_dataApiClickHandler\",\"slideIndex\",\"carousels\",\"i\",\"len\",\"$carousel\",\"SHOW\",\"SHOWN\",\"HIDE\",\"HIDDEN\",\"Dimension\",\"Collapse\",\"_isTransitioning\",\"_triggerArray\",\"id\",\"toggleList\",\"elem\",\"filterElement\",\"filter\",\"foundElem\",\"_selector\",\"push\",\"_parent\",\"_getParent\",\"_addAriaAndCollapsedClass\",\"hide\",\"show\",\"actives\",\"activesData\",\"not\",\"startEvent\",\"dimension\",\"_getDimension\",\"style\",\"attr\",\"setTransitioning\",\"scrollSize\",\"getBoundingClientRect\",\"triggerArrayLength\",\"isTransitioning\",\"jquery\",\"_getTargetFromElement\",\"triggerArray\",\"isOpen\",\"$this\",\"currentTarget\",\"$trigger\",\"selectors\",\"$target\",\"REGEXP_KEYDOWN\",\"ARROW_UP_KEYCODE\",\"CLICK\",\"KEYDOWN_DATA_API\",\"KEYUP_DATA_API\",\"AttachmentMap\",\"offset\",\"flip\",\"boundary\",\"reference\",\"display\",\"Dropdown\",\"_popper\",\"_menu\",\"_getMenuElement\",\"_inNavbar\",\"_detectNavbar\",\"disabled\",\"_getParentFromElement\",\"isActive\",\"_clearMenus\",\"showEvent\",\"Popper\",\"referenceElement\",\"_getPopperConfig\",\"body\",\"noop\",\"hideEvent\",\"destroy\",\"update\",\"scheduleUpdate\",\"stopPropagation\",\"constructor\",\"_getPlacement\",\"$parentDropdown\",\"placement\",\"_getOffset\",\"offsets\",\"popperConfig\",\"modifiers\",\"enabled\",\"preventOverflow\",\"boundariesElement\",\"applyStyle\",\"toggles\",\"context\",\"clickEvent\",\"dropdownMenu\",\"_dataApiKeydownHandler\",\"items\",\"backdrop\",\"FOCUSIN\",\"RESIZE\",\"CLICK_DISMISS\",\"KEYDOWN_DISMISS\",\"MOUSEUP_DISMISS\",\"MOUSEDOWN_DISMISS\",\"Modal\",\"_dialog\",\"_backdrop\",\"_isShown\",\"_isBodyOverflowing\",\"_ignoreBackdropClick\",\"_scrollbarWidth\",\"_checkScrollbar\",\"_setScrollbar\",\"_adjustDialog\",\"_setEscapeEvent\",\"_setResizeEvent\",\"_showBackdrop\",\"_showElement\",\"transition\",\"_hideModal\",\"forEach\",\"htmlElement\",\"handleUpdate\",\"Node\",\"ELEMENT_NODE\",\"appendChild\",\"removeAttribute\",\"scrollTop\",\"_enforceFocus\",\"shownEvent\",\"transitionComplete\",\"has\",\"_this5\",\"_this6\",\"_this7\",\"_resetAdjustments\",\"_resetScrollbar\",\"_removeBackdrop\",\"callback\",\"_this8\",\"animate\",\"createElement\",\"className\",\"appendTo\",\"backdropTransitionDuration\",\"callbackRemove\",\"isModalOverflowing\",\"scrollHeight\",\"clientHeight\",\"paddingLeft\",\"paddingRight\",\"rect\",\"left\",\"right\",\"innerWidth\",\"_getScrollbarWidth\",\"_this9\",\"fixedContent\",\"stickyContent\",\"actualPadding\",\"calculatedPadding\",\"actualMargin\",\"marginRight\",\"calculatedMargin\",\"padding\",\"elements\",\"margin\",\"scrollDiv\",\"scrollbarWidth\",\"width\",\"clientWidth\",\"removeChild\",\"_this10\",\"uriAttrs\",\"DefaultWhitelist\",\"*\",\"a\",\"area\",\"b\",\"br\",\"col\",\"code\",\"div\",\"em\",\"hr\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"img\",\"li\",\"ol\",\"p\",\"pre\",\"s\",\"small\",\"span\",\"sub\",\"sup\",\"strong\",\"u\",\"ul\",\"SAFE_URL_PATTERN\",\"DATA_URL_PATTERN\",\"sanitizeHtml\",\"unsafeHtml\",\"whiteList\",\"sanitizeFn\",\"createdDocument\",\"DOMParser\",\"parseFromString\",\"whitelistKeys\",\"keys\",\"_loop\",\"el\",\"elName\",\"nodeName\",\"attributeList\",\"attributes\",\"whitelistedAttributes\",\"concat\",\"allowedAttributeList\",\"attrName\",\"nodeValue\",\"regExp\",\"attrRegex\",\"l\",\"allowedAttribute\",\"innerHTML\",\"CLASS_PREFIX\",\"BSCLS_PREFIX_REGEX\",\"DISALLOWED_ATTRIBUTES\",\"animation\",\"template\",\"title\",\"delay\",\"html\",\"container\",\"fallbackPlacement\",\"sanitize\",\"AUTO\",\"TOP\",\"RIGHT\",\"BOTTOM\",\"LEFT\",\"HoverState\",\"INSERTED\",\"FOCUSOUT\",\"Trigger\",\"Tooltip\",\"_isEnabled\",\"_timeout\",\"_hoverState\",\"_activeTrigger\",\"tip\",\"_setListeners\",\"enable\",\"disable\",\"toggleEnabled\",\"dataKey\",\"_getDelegateConfig\",\"click\",\"_isWithActiveTrigger\",\"_enter\",\"_leave\",\"getTipElement\",\"isWithContent\",\"shadowRoot\",\"isInTheDom\",\"ownerDocument\",\"tipId\",\"setContent\",\"attachment\",\"_getAttachment\",\"addAttachmentClass\",\"_getContainer\",\"behavior\",\"arrow\",\"onCreate\",\"originalPlacement\",\"_handlePopperPlacementChange\",\"onUpdate\",\"complete\",\"_fixTransition\",\"prevHoverState\",\"_cleanTipClass\",\"getTitle\",\"setElementContent\",\"content\",\"text\",\"empty\",\"append\",\"find\",\"eventIn\",\"eventOut\",\"_fixTitle\",\"titleType\",\"dataAttributes\",\"dataAttr\",\"key\",\"$tip\",\"tabClass\",\"join\",\"popperData\",\"popperInstance\",\"instance\",\"popper\",\"initConfigAnimation\",\"Popover\",\"_getContent\",\"method\",\"ACTIVATE\",\"SCROLL\",\"OffsetMethod\",\"ScrollSpy\",\"_scrollElement\",\"_offsets\",\"_targets\",\"_activeTarget\",\"_scrollHeight\",\"_process\",\"refresh\",\"autoMethod\",\"offsetMethod\",\"offsetBase\",\"_getScrollTop\",\"_getScrollHeight\",\"map\",\"targetSelector\",\"targetBCR\",\"height\",\"top\",\"item\",\"sort\",\"pageYOffset\",\"max\",\"_getOffsetHeight\",\"innerHeight\",\"maxScroll\",\"_activate\",\"_clear\",\"queries\",\"$link\",\"parents\",\"node\",\"scrollSpys\",\"$spy\",\"Tab\",\"previous\",\"listElement\",\"itemSelector\",\"makeArray\",\"hiddenEvent\",\"active\",\"_transitionComplete\",\"dropdownChild\",\"dropdownElement\",\"dropdownToggleList\",\"autohide\",\"Toast\",\"withoutTimeout\",\"_close\",\"version\"],\"mappings\":\"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\",\"sourcesContent\":[\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): util.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Private TransitionEnd Helpers\\n * ------------------------------------------------------------------------\\n */\\n\\nconst TRANSITION_END = 'transitionend'\\nconst MAX_UID = 1000000\\nconst MILLISECONDS_MULTIPLIER = 1000\\n\\n// Shoutout AngusCroll (https://goo.gl/pxwQGp)\\nfunction toType(obj) {\\n  return {}.toString.call(obj).match(/\\\\s([a-z]+)/i)[1].toLowerCase()\\n}\\n\\nfunction getSpecialTransitionEndEvent() {\\n  return {\\n    bindType: TRANSITION_END,\\n    delegateType: TRANSITION_END,\\n    handle(event) {\\n      if ($(event.target).is(this)) {\\n        return event.handleObj.handler.apply(this, arguments) // eslint-disable-line prefer-rest-params\\n      }\\n      return undefined // eslint-disable-line no-undefined\\n    }\\n  }\\n}\\n\\nfunction transitionEndEmulator(duration) {\\n  let called = false\\n\\n  $(this).one(Util.TRANSITION_END, () => {\\n    called = true\\n  })\\n\\n  setTimeout(() => {\\n    if (!called) {\\n      Util.triggerTransitionEnd(this)\\n    }\\n  }, duration)\\n\\n  return this\\n}\\n\\nfunction setTransitionEndSupport() {\\n  $.fn.emulateTransitionEnd = transitionEndEmulator\\n  $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent()\\n}\\n\\n/**\\n * --------------------------------------------------------------------------\\n * Public Util Api\\n * --------------------------------------------------------------------------\\n */\\n\\nconst Util = {\\n\\n  TRANSITION_END: 'bsTransitionEnd',\\n\\n  getUID(prefix) {\\n    do {\\n      // eslint-disable-next-line no-bitwise\\n      prefix += ~~(Math.random() * MAX_UID) // \\\"~~\\\" acts like a faster Math.floor() here\\n    } while (document.getElementById(prefix))\\n    return prefix\\n  },\\n\\n  getSelectorFromElement(element) {\\n    let selector = element.getAttribute('data-target')\\n\\n    if (!selector || selector === '#') {\\n      const hrefAttr = element.getAttribute('href')\\n      selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : ''\\n    }\\n\\n    try {\\n      return document.querySelector(selector) ? selector : null\\n    } catch (err) {\\n      return null\\n    }\\n  },\\n\\n  getTransitionDurationFromElement(element) {\\n    if (!element) {\\n      return 0\\n    }\\n\\n    // Get transition-duration of the element\\n    let transitionDuration = $(element).css('transition-duration')\\n    let transitionDelay = $(element).css('transition-delay')\\n\\n    const floatTransitionDuration = parseFloat(transitionDuration)\\n    const floatTransitionDelay = parseFloat(transitionDelay)\\n\\n    // Return 0 if element or transition duration is not found\\n    if (!floatTransitionDuration && !floatTransitionDelay) {\\n      return 0\\n    }\\n\\n    // If multiple durations are defined, take the first\\n    transitionDuration = transitionDuration.split(',')[0]\\n    transitionDelay = transitionDelay.split(',')[0]\\n\\n    return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\\n  },\\n\\n  reflow(element) {\\n    return element.offsetHeight\\n  },\\n\\n  triggerTransitionEnd(element) {\\n    $(element).trigger(TRANSITION_END)\\n  },\\n\\n  // TODO: Remove in v5\\n  supportsTransitionEnd() {\\n    return Boolean(TRANSITION_END)\\n  },\\n\\n  isElement(obj) {\\n    return (obj[0] || obj).nodeType\\n  },\\n\\n  typeCheckConfig(componentName, config, configTypes) {\\n    for (const property in configTypes) {\\n      if (Object.prototype.hasOwnProperty.call(configTypes, property)) {\\n        const expectedTypes = configTypes[property]\\n        const value         = config[property]\\n        const valueType     = value && Util.isElement(value)\\n          ? 'element' : toType(value)\\n\\n        if (!new RegExp(expectedTypes).test(valueType)) {\\n          throw new Error(\\n            `${componentName.toUpperCase()}: ` +\\n            `Option \\\"${property}\\\" provided type \\\"${valueType}\\\" ` +\\n            `but expected type \\\"${expectedTypes}\\\".`)\\n        }\\n      }\\n    }\\n  },\\n\\n  findShadowRoot(element) {\\n    if (!document.documentElement.attachShadow) {\\n      return null\\n    }\\n\\n    // Can find the shadow root otherwise it'll return the document\\n    if (typeof element.getRootNode === 'function') {\\n      const root = element.getRootNode()\\n      return root instanceof ShadowRoot ? root : null\\n    }\\n\\n    if (element instanceof ShadowRoot) {\\n      return element\\n    }\\n\\n    // when we don't find a shadow root\\n    if (!element.parentNode) {\\n      return null\\n    }\\n\\n    return Util.findShadowRoot(element.parentNode)\\n  }\\n}\\n\\nsetTransitionEndSupport()\\n\\nexport default Util\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): alert.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\nimport Util from './util'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME                = 'alert'\\nconst VERSION             = '4.3.1'\\nconst DATA_KEY            = 'bs.alert'\\nconst EVENT_KEY           = `.${DATA_KEY}`\\nconst DATA_API_KEY        = '.data-api'\\nconst JQUERY_NO_CONFLICT  = $.fn[NAME]\\n\\nconst Selector = {\\n  DISMISS : '[data-dismiss=\\\"alert\\\"]'\\n}\\n\\nconst Event = {\\n  CLOSE          : `close${EVENT_KEY}`,\\n  CLOSED         : `closed${EVENT_KEY}`,\\n  CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\\n}\\n\\nconst ClassName = {\\n  ALERT : 'alert',\\n  FADE  : 'fade',\\n  SHOW  : 'show'\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass Alert {\\n  constructor(element) {\\n    this._element = element\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  // Public\\n\\n  close(element) {\\n    let rootElement = this._element\\n    if (element) {\\n      rootElement = this._getRootElement(element)\\n    }\\n\\n    const customEvent = this._triggerCloseEvent(rootElement)\\n\\n    if (customEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    this._removeElement(rootElement)\\n  }\\n\\n  dispose() {\\n    $.removeData(this._element, DATA_KEY)\\n    this._element = null\\n  }\\n\\n  // Private\\n\\n  _getRootElement(element) {\\n    const selector = Util.getSelectorFromElement(element)\\n    let parent     = false\\n\\n    if (selector) {\\n      parent = document.querySelector(selector)\\n    }\\n\\n    if (!parent) {\\n      parent = $(element).closest(`.${ClassName.ALERT}`)[0]\\n    }\\n\\n    return parent\\n  }\\n\\n  _triggerCloseEvent(element) {\\n    const closeEvent = $.Event(Event.CLOSE)\\n\\n    $(element).trigger(closeEvent)\\n    return closeEvent\\n  }\\n\\n  _removeElement(element) {\\n    $(element).removeClass(ClassName.SHOW)\\n\\n    if (!$(element).hasClass(ClassName.FADE)) {\\n      this._destroyElement(element)\\n      return\\n    }\\n\\n    const transitionDuration = Util.getTransitionDurationFromElement(element)\\n\\n    $(element)\\n      .one(Util.TRANSITION_END, (event) => this._destroyElement(element, event))\\n      .emulateTransitionEnd(transitionDuration)\\n  }\\n\\n  _destroyElement(element) {\\n    $(element)\\n      .detach()\\n      .trigger(Event.CLOSED)\\n      .remove()\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      const $element = $(this)\\n      let data       = $element.data(DATA_KEY)\\n\\n      if (!data) {\\n        data = new Alert(this)\\n        $element.data(DATA_KEY, data)\\n      }\\n\\n      if (config === 'close') {\\n        data[config](this)\\n      }\\n    })\\n  }\\n\\n  static _handleDismiss(alertInstance) {\\n    return function (event) {\\n      if (event) {\\n        event.preventDefault()\\n      }\\n\\n      alertInstance.close(this)\\n    }\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Data Api implementation\\n * ------------------------------------------------------------------------\\n */\\n\\n$(document).on(\\n  Event.CLICK_DATA_API,\\n  Selector.DISMISS,\\n  Alert._handleDismiss(new Alert())\\n)\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME]             = Alert._jQueryInterface\\n$.fn[NAME].Constructor = Alert\\n$.fn[NAME].noConflict  = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Alert._jQueryInterface\\n}\\n\\nexport default Alert\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): button.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME                = 'button'\\nconst VERSION             = '4.3.1'\\nconst DATA_KEY            = 'bs.button'\\nconst EVENT_KEY           = `.${DATA_KEY}`\\nconst DATA_API_KEY        = '.data-api'\\nconst JQUERY_NO_CONFLICT  = $.fn[NAME]\\n\\nconst ClassName = {\\n  ACTIVE : 'active',\\n  BUTTON : 'btn',\\n  FOCUS  : 'focus'\\n}\\n\\nconst Selector = {\\n  DATA_TOGGLE_CARROT : '[data-toggle^=\\\"button\\\"]',\\n  DATA_TOGGLE        : '[data-toggle=\\\"buttons\\\"]',\\n  INPUT              : 'input:not([type=\\\"hidden\\\"])',\\n  ACTIVE             : '.active',\\n  BUTTON             : '.btn'\\n}\\n\\nconst Event = {\\n  CLICK_DATA_API      : `click${EVENT_KEY}${DATA_API_KEY}`,\\n  FOCUS_BLUR_DATA_API : `focus${EVENT_KEY}${DATA_API_KEY} ` +\\n                          `blur${EVENT_KEY}${DATA_API_KEY}`\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass Button {\\n  constructor(element) {\\n    this._element = element\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  // Public\\n\\n  toggle() {\\n    let triggerChangeEvent = true\\n    let addAriaPressed = true\\n    const rootElement = $(this._element).closest(\\n      Selector.DATA_TOGGLE\\n    )[0]\\n\\n    if (rootElement) {\\n      const input = this._element.querySelector(Selector.INPUT)\\n\\n      if (input) {\\n        if (input.type === 'radio') {\\n          if (input.checked &&\\n            this._element.classList.contains(ClassName.ACTIVE)) {\\n            triggerChangeEvent = false\\n          } else {\\n            const activeElement = rootElement.querySelector(Selector.ACTIVE)\\n\\n            if (activeElement) {\\n              $(activeElement).removeClass(ClassName.ACTIVE)\\n            }\\n          }\\n        }\\n\\n        if (triggerChangeEvent) {\\n          if (input.hasAttribute('disabled') ||\\n            rootElement.hasAttribute('disabled') ||\\n            input.classList.contains('disabled') ||\\n            rootElement.classList.contains('disabled')) {\\n            return\\n          }\\n          input.checked = !this._element.classList.contains(ClassName.ACTIVE)\\n          $(input).trigger('change')\\n        }\\n\\n        input.focus()\\n        addAriaPressed = false\\n      }\\n    }\\n\\n    if (addAriaPressed) {\\n      this._element.setAttribute('aria-pressed',\\n        !this._element.classList.contains(ClassName.ACTIVE))\\n    }\\n\\n    if (triggerChangeEvent) {\\n      $(this._element).toggleClass(ClassName.ACTIVE)\\n    }\\n  }\\n\\n  dispose() {\\n    $.removeData(this._element, DATA_KEY)\\n    this._element = null\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      let data = $(this).data(DATA_KEY)\\n\\n      if (!data) {\\n        data = new Button(this)\\n        $(this).data(DATA_KEY, data)\\n      }\\n\\n      if (config === 'toggle') {\\n        data[config]()\\n      }\\n    })\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Data Api implementation\\n * ------------------------------------------------------------------------\\n */\\n\\n$(document)\\n  .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {\\n    event.preventDefault()\\n\\n    let button = event.target\\n\\n    if (!$(button).hasClass(ClassName.BUTTON)) {\\n      button = $(button).closest(Selector.BUTTON)\\n    }\\n\\n    Button._jQueryInterface.call($(button), 'toggle')\\n  })\\n  .on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {\\n    const button = $(event.target).closest(Selector.BUTTON)[0]\\n    $(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type))\\n  })\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME] = Button._jQueryInterface\\n$.fn[NAME].Constructor = Button\\n$.fn[NAME].noConflict = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Button._jQueryInterface\\n}\\n\\nexport default Button\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): carousel.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\nimport Util from './util'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME                   = 'carousel'\\nconst VERSION                = '4.3.1'\\nconst DATA_KEY               = 'bs.carousel'\\nconst EVENT_KEY              = `.${DATA_KEY}`\\nconst DATA_API_KEY           = '.data-api'\\nconst JQUERY_NO_CONFLICT     = $.fn[NAME]\\nconst ARROW_LEFT_KEYCODE     = 37 // KeyboardEvent.which value for left arrow key\\nconst ARROW_RIGHT_KEYCODE    = 39 // KeyboardEvent.which value for right arrow key\\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\\nconst SWIPE_THRESHOLD        = 40\\n\\nconst Default = {\\n  interval : 5000,\\n  keyboard : true,\\n  slide    : false,\\n  pause    : 'hover',\\n  wrap     : true,\\n  touch    : true\\n}\\n\\nconst DefaultType = {\\n  interval : '(number|boolean)',\\n  keyboard : 'boolean',\\n  slide    : '(boolean|string)',\\n  pause    : '(string|boolean)',\\n  wrap     : 'boolean',\\n  touch    : 'boolean'\\n}\\n\\nconst Direction = {\\n  NEXT     : 'next',\\n  PREV     : 'prev',\\n  LEFT     : 'left',\\n  RIGHT    : 'right'\\n}\\n\\nconst Event = {\\n  SLIDE          : `slide${EVENT_KEY}`,\\n  SLID           : `slid${EVENT_KEY}`,\\n  KEYDOWN        : `keydown${EVENT_KEY}`,\\n  MOUSEENTER     : `mouseenter${EVENT_KEY}`,\\n  MOUSELEAVE     : `mouseleave${EVENT_KEY}`,\\n  TOUCHSTART     : `touchstart${EVENT_KEY}`,\\n  TOUCHMOVE      : `touchmove${EVENT_KEY}`,\\n  TOUCHEND       : `touchend${EVENT_KEY}`,\\n  POINTERDOWN    : `pointerdown${EVENT_KEY}`,\\n  POINTERUP      : `pointerup${EVENT_KEY}`,\\n  DRAG_START     : `dragstart${EVENT_KEY}`,\\n  LOAD_DATA_API  : `load${EVENT_KEY}${DATA_API_KEY}`,\\n  CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\\n}\\n\\nconst ClassName = {\\n  CAROUSEL      : 'carousel',\\n  ACTIVE        : 'active',\\n  SLIDE         : 'slide',\\n  RIGHT         : 'carousel-item-right',\\n  LEFT          : 'carousel-item-left',\\n  NEXT          : 'carousel-item-next',\\n  PREV          : 'carousel-item-prev',\\n  ITEM          : 'carousel-item',\\n  POINTER_EVENT : 'pointer-event'\\n}\\n\\nconst Selector = {\\n  ACTIVE      : '.active',\\n  ACTIVE_ITEM : '.active.carousel-item',\\n  ITEM        : '.carousel-item',\\n  ITEM_IMG    : '.carousel-item img',\\n  NEXT_PREV   : '.carousel-item-next, .carousel-item-prev',\\n  INDICATORS  : '.carousel-indicators',\\n  DATA_SLIDE  : '[data-slide], [data-slide-to]',\\n  DATA_RIDE   : '[data-ride=\\\"carousel\\\"]'\\n}\\n\\nconst PointerType = {\\n  TOUCH : 'touch',\\n  PEN   : 'pen'\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\nclass Carousel {\\n  constructor(element, config) {\\n    this._items         = null\\n    this._interval      = null\\n    this._activeElement = null\\n    this._isPaused      = false\\n    this._isSliding     = false\\n    this.touchTimeout   = null\\n    this.touchStartX    = 0\\n    this.touchDeltaX    = 0\\n\\n    this._config            = this._getConfig(config)\\n    this._element           = element\\n    this._indicatorsElement = this._element.querySelector(Selector.INDICATORS)\\n    this._touchSupported    = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\\n    this._pointerEvent      = Boolean(window.PointerEvent || window.MSPointerEvent)\\n\\n    this._addEventListeners()\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  static get Default() {\\n    return Default\\n  }\\n\\n  // Public\\n\\n  next() {\\n    if (!this._isSliding) {\\n      this._slide(Direction.NEXT)\\n    }\\n  }\\n\\n  nextWhenVisible() {\\n    // Don't call next when the page isn't visible\\n    // or the carousel or its parent isn't visible\\n    if (!document.hidden &&\\n      ($(this._element).is(':visible') && $(this._element).css('visibility') !== 'hidden')) {\\n      this.next()\\n    }\\n  }\\n\\n  prev() {\\n    if (!this._isSliding) {\\n      this._slide(Direction.PREV)\\n    }\\n  }\\n\\n  pause(event) {\\n    if (!event) {\\n      this._isPaused = true\\n    }\\n\\n    if (this._element.querySelector(Selector.NEXT_PREV)) {\\n      Util.triggerTransitionEnd(this._element)\\n      this.cycle(true)\\n    }\\n\\n    clearInterval(this._interval)\\n    this._interval = null\\n  }\\n\\n  cycle(event) {\\n    if (!event) {\\n      this._isPaused = false\\n    }\\n\\n    if (this._interval) {\\n      clearInterval(this._interval)\\n      this._interval = null\\n    }\\n\\n    if (this._config.interval && !this._isPaused) {\\n      this._interval = setInterval(\\n        (document.visibilityState ? this.nextWhenVisible : this.next).bind(this),\\n        this._config.interval\\n      )\\n    }\\n  }\\n\\n  to(index) {\\n    this._activeElement = this._element.querySelector(Selector.ACTIVE_ITEM)\\n\\n    const activeIndex = this._getItemIndex(this._activeElement)\\n\\n    if (index > this._items.length - 1 || index < 0) {\\n      return\\n    }\\n\\n    if (this._isSliding) {\\n      $(this._element).one(Event.SLID, () => this.to(index))\\n      return\\n    }\\n\\n    if (activeIndex === index) {\\n      this.pause()\\n      this.cycle()\\n      return\\n    }\\n\\n    const direction = index > activeIndex\\n      ? Direction.NEXT\\n      : Direction.PREV\\n\\n    this._slide(direction, this._items[index])\\n  }\\n\\n  dispose() {\\n    $(this._element).off(EVENT_KEY)\\n    $.removeData(this._element, DATA_KEY)\\n\\n    this._items             = null\\n    this._config            = null\\n    this._element           = null\\n    this._interval          = null\\n    this._isPaused          = null\\n    this._isSliding         = null\\n    this._activeElement     = null\\n    this._indicatorsElement = null\\n  }\\n\\n  // Private\\n\\n  _getConfig(config) {\\n    config = {\\n      ...Default,\\n      ...config\\n    }\\n    Util.typeCheckConfig(NAME, config, DefaultType)\\n    return config\\n  }\\n\\n  _handleSwipe() {\\n    const absDeltax = Math.abs(this.touchDeltaX)\\n\\n    if (absDeltax <= SWIPE_THRESHOLD) {\\n      return\\n    }\\n\\n    const direction = absDeltax / this.touchDeltaX\\n\\n    // swipe left\\n    if (direction > 0) {\\n      this.prev()\\n    }\\n\\n    // swipe right\\n    if (direction < 0) {\\n      this.next()\\n    }\\n  }\\n\\n  _addEventListeners() {\\n    if (this._config.keyboard) {\\n      $(this._element)\\n        .on(Event.KEYDOWN, (event) => this._keydown(event))\\n    }\\n\\n    if (this._config.pause === 'hover') {\\n      $(this._element)\\n        .on(Event.MOUSEENTER, (event) => this.pause(event))\\n        .on(Event.MOUSELEAVE, (event) => this.cycle(event))\\n    }\\n\\n    if (this._config.touch) {\\n      this._addTouchEventListeners()\\n    }\\n  }\\n\\n  _addTouchEventListeners() {\\n    if (!this._touchSupported) {\\n      return\\n    }\\n\\n    const start = (event) => {\\n      if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\\n        this.touchStartX = event.originalEvent.clientX\\n      } else if (!this._pointerEvent) {\\n        this.touchStartX = event.originalEvent.touches[0].clientX\\n      }\\n    }\\n\\n    const move = (event) => {\\n      // ensure swiping with one touch and not pinching\\n      if (event.originalEvent.touches && event.originalEvent.touches.length > 1) {\\n        this.touchDeltaX = 0\\n      } else {\\n        this.touchDeltaX = event.originalEvent.touches[0].clientX - this.touchStartX\\n      }\\n    }\\n\\n    const end = (event) => {\\n      if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\\n        this.touchDeltaX = event.originalEvent.clientX - this.touchStartX\\n      }\\n\\n      this._handleSwipe()\\n      if (this._config.pause === 'hover') {\\n        // If it's a touch-enabled device, mouseenter/leave are fired as\\n        // part of the mouse compatibility events on first tap - the carousel\\n        // would stop cycling until user tapped out of it;\\n        // here, we listen for touchend, explicitly pause the carousel\\n        // (as if it's the second time we tap on it, mouseenter compat event\\n        // is NOT fired) and after a timeout (to allow for mouse compatibility\\n        // events to fire) we explicitly restart cycling\\n\\n        this.pause()\\n        if (this.touchTimeout) {\\n          clearTimeout(this.touchTimeout)\\n        }\\n        this.touchTimeout = setTimeout((event) => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\\n      }\\n    }\\n\\n    $(this._element.querySelectorAll(Selector.ITEM_IMG)).on(Event.DRAG_START, (e) => e.preventDefault())\\n    if (this._pointerEvent) {\\n      $(this._element).on(Event.POINTERDOWN, (event) => start(event))\\n      $(this._element).on(Event.POINTERUP, (event) => end(event))\\n\\n      this._element.classList.add(ClassName.POINTER_EVENT)\\n    } else {\\n      $(this._element).on(Event.TOUCHSTART, (event) => start(event))\\n      $(this._element).on(Event.TOUCHMOVE, (event) => move(event))\\n      $(this._element).on(Event.TOUCHEND, (event) => end(event))\\n    }\\n  }\\n\\n  _keydown(event) {\\n    if (/input|textarea/i.test(event.target.tagName)) {\\n      return\\n    }\\n\\n    switch (event.which) {\\n      case ARROW_LEFT_KEYCODE:\\n        event.preventDefault()\\n        this.prev()\\n        break\\n      case ARROW_RIGHT_KEYCODE:\\n        event.preventDefault()\\n        this.next()\\n        break\\n      default:\\n    }\\n  }\\n\\n  _getItemIndex(element) {\\n    this._items = element && element.parentNode\\n      ? [].slice.call(element.parentNode.querySelectorAll(Selector.ITEM))\\n      : []\\n    return this._items.indexOf(element)\\n  }\\n\\n  _getItemByDirection(direction, activeElement) {\\n    const isNextDirection = direction === Direction.NEXT\\n    const isPrevDirection = direction === Direction.PREV\\n    const activeIndex     = this._getItemIndex(activeElement)\\n    const lastItemIndex   = this._items.length - 1\\n    const isGoingToWrap   = isPrevDirection && activeIndex === 0 ||\\n                            isNextDirection && activeIndex === lastItemIndex\\n\\n    if (isGoingToWrap && !this._config.wrap) {\\n      return activeElement\\n    }\\n\\n    const delta     = direction === Direction.PREV ? -1 : 1\\n    const itemIndex = (activeIndex + delta) % this._items.length\\n\\n    return itemIndex === -1\\n      ? this._items[this._items.length - 1] : this._items[itemIndex]\\n  }\\n\\n  _triggerSlideEvent(relatedTarget, eventDirectionName) {\\n    const targetIndex = this._getItemIndex(relatedTarget)\\n    const fromIndex = this._getItemIndex(this._element.querySelector(Selector.ACTIVE_ITEM))\\n    const slideEvent = $.Event(Event.SLIDE, {\\n      relatedTarget,\\n      direction: eventDirectionName,\\n      from: fromIndex,\\n      to: targetIndex\\n    })\\n\\n    $(this._element).trigger(slideEvent)\\n\\n    return slideEvent\\n  }\\n\\n  _setActiveIndicatorElement(element) {\\n    if (this._indicatorsElement) {\\n      const indicators = [].slice.call(this._indicatorsElement.querySelectorAll(Selector.ACTIVE))\\n      $(indicators)\\n        .removeClass(ClassName.ACTIVE)\\n\\n      const nextIndicator = this._indicatorsElement.children[\\n        this._getItemIndex(element)\\n      ]\\n\\n      if (nextIndicator) {\\n        $(nextIndicator).addClass(ClassName.ACTIVE)\\n      }\\n    }\\n  }\\n\\n  _slide(direction, element) {\\n    const activeElement = this._element.querySelector(Selector.ACTIVE_ITEM)\\n    const activeElementIndex = this._getItemIndex(activeElement)\\n    const nextElement   = element || activeElement &&\\n      this._getItemByDirection(direction, activeElement)\\n    const nextElementIndex = this._getItemIndex(nextElement)\\n    const isCycling = Boolean(this._interval)\\n\\n    let directionalClassName\\n    let orderClassName\\n    let eventDirectionName\\n\\n    if (direction === Direction.NEXT) {\\n      directionalClassName = ClassName.LEFT\\n      orderClassName = ClassName.NEXT\\n      eventDirectionName = Direction.LEFT\\n    } else {\\n      directionalClassName = ClassName.RIGHT\\n      orderClassName = ClassName.PREV\\n      eventDirectionName = Direction.RIGHT\\n    }\\n\\n    if (nextElement && $(nextElement).hasClass(ClassName.ACTIVE)) {\\n      this._isSliding = false\\n      return\\n    }\\n\\n    const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName)\\n    if (slideEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    if (!activeElement || !nextElement) {\\n      // Some weirdness is happening, so we bail\\n      return\\n    }\\n\\n    this._isSliding = true\\n\\n    if (isCycling) {\\n      this.pause()\\n    }\\n\\n    this._setActiveIndicatorElement(nextElement)\\n\\n    const slidEvent = $.Event(Event.SLID, {\\n      relatedTarget: nextElement,\\n      direction: eventDirectionName,\\n      from: activeElementIndex,\\n      to: nextElementIndex\\n    })\\n\\n    if ($(this._element).hasClass(ClassName.SLIDE)) {\\n      $(nextElement).addClass(orderClassName)\\n\\n      Util.reflow(nextElement)\\n\\n      $(activeElement).addClass(directionalClassName)\\n      $(nextElement).addClass(directionalClassName)\\n\\n      const nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10)\\n      if (nextElementInterval) {\\n        this._config.defaultInterval = this._config.defaultInterval || this._config.interval\\n        this._config.interval = nextElementInterval\\n      } else {\\n        this._config.interval = this._config.defaultInterval || this._config.interval\\n      }\\n\\n      const transitionDuration = Util.getTransitionDurationFromElement(activeElement)\\n\\n      $(activeElement)\\n        .one(Util.TRANSITION_END, () => {\\n          $(nextElement)\\n            .removeClass(`${directionalClassName} ${orderClassName}`)\\n            .addClass(ClassName.ACTIVE)\\n\\n          $(activeElement).removeClass(`${ClassName.ACTIVE} ${orderClassName} ${directionalClassName}`)\\n\\n          this._isSliding = false\\n\\n          setTimeout(() => $(this._element).trigger(slidEvent), 0)\\n        })\\n        .emulateTransitionEnd(transitionDuration)\\n    } else {\\n      $(activeElement).removeClass(ClassName.ACTIVE)\\n      $(nextElement).addClass(ClassName.ACTIVE)\\n\\n      this._isSliding = false\\n      $(this._element).trigger(slidEvent)\\n    }\\n\\n    if (isCycling) {\\n      this.cycle()\\n    }\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      let data = $(this).data(DATA_KEY)\\n      let _config = {\\n        ...Default,\\n        ...$(this).data()\\n      }\\n\\n      if (typeof config === 'object') {\\n        _config = {\\n          ..._config,\\n          ...config\\n        }\\n      }\\n\\n      const action = typeof config === 'string' ? config : _config.slide\\n\\n      if (!data) {\\n        data = new Carousel(this, _config)\\n        $(this).data(DATA_KEY, data)\\n      }\\n\\n      if (typeof config === 'number') {\\n        data.to(config)\\n      } else if (typeof action === 'string') {\\n        if (typeof data[action] === 'undefined') {\\n          throw new TypeError(`No method named \\\"${action}\\\"`)\\n        }\\n        data[action]()\\n      } else if (_config.interval && _config.ride) {\\n        data.pause()\\n        data.cycle()\\n      }\\n    })\\n  }\\n\\n  static _dataApiClickHandler(event) {\\n    const selector = Util.getSelectorFromElement(this)\\n\\n    if (!selector) {\\n      return\\n    }\\n\\n    const target = $(selector)[0]\\n\\n    if (!target || !$(target).hasClass(ClassName.CAROUSEL)) {\\n      return\\n    }\\n\\n    const config = {\\n      ...$(target).data(),\\n      ...$(this).data()\\n    }\\n    const slideIndex = this.getAttribute('data-slide-to')\\n\\n    if (slideIndex) {\\n      config.interval = false\\n    }\\n\\n    Carousel._jQueryInterface.call($(target), config)\\n\\n    if (slideIndex) {\\n      $(target).data(DATA_KEY).to(slideIndex)\\n    }\\n\\n    event.preventDefault()\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Data Api implementation\\n * ------------------------------------------------------------------------\\n */\\n\\n$(document)\\n  .on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler)\\n\\n$(window).on(Event.LOAD_DATA_API, () => {\\n  const carousels = [].slice.call(document.querySelectorAll(Selector.DATA_RIDE))\\n  for (let i = 0, len = carousels.length; i < len; i++) {\\n    const $carousel = $(carousels[i])\\n    Carousel._jQueryInterface.call($carousel, $carousel.data())\\n  }\\n})\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME] = Carousel._jQueryInterface\\n$.fn[NAME].Constructor = Carousel\\n$.fn[NAME].noConflict = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Carousel._jQueryInterface\\n}\\n\\nexport default Carousel\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): collapse.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\nimport Util from './util'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME                = 'collapse'\\nconst VERSION             = '4.3.1'\\nconst DATA_KEY            = 'bs.collapse'\\nconst EVENT_KEY           = `.${DATA_KEY}`\\nconst DATA_API_KEY        = '.data-api'\\nconst JQUERY_NO_CONFLICT  = $.fn[NAME]\\n\\nconst Default = {\\n  toggle : true,\\n  parent : ''\\n}\\n\\nconst DefaultType = {\\n  toggle : 'boolean',\\n  parent : '(string|element)'\\n}\\n\\nconst Event = {\\n  SHOW           : `show${EVENT_KEY}`,\\n  SHOWN          : `shown${EVENT_KEY}`,\\n  HIDE           : `hide${EVENT_KEY}`,\\n  HIDDEN         : `hidden${EVENT_KEY}`,\\n  CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\\n}\\n\\nconst ClassName = {\\n  SHOW       : 'show',\\n  COLLAPSE   : 'collapse',\\n  COLLAPSING : 'collapsing',\\n  COLLAPSED  : 'collapsed'\\n}\\n\\nconst Dimension = {\\n  WIDTH  : 'width',\\n  HEIGHT : 'height'\\n}\\n\\nconst Selector = {\\n  ACTIVES     : '.show, .collapsing',\\n  DATA_TOGGLE : '[data-toggle=\\\"collapse\\\"]'\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass Collapse {\\n  constructor(element, config) {\\n    this._isTransitioning = false\\n    this._element         = element\\n    this._config          = this._getConfig(config)\\n    this._triggerArray    = [].slice.call(document.querySelectorAll(\\n      `[data-toggle=\\\"collapse\\\"][href=\\\"#${element.id}\\\"],` +\\n      `[data-toggle=\\\"collapse\\\"][data-target=\\\"#${element.id}\\\"]`\\n    ))\\n\\n    const toggleList = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE))\\n    for (let i = 0, len = toggleList.length; i < len; i++) {\\n      const elem = toggleList[i]\\n      const selector = Util.getSelectorFromElement(elem)\\n      const filterElement = [].slice.call(document.querySelectorAll(selector))\\n        .filter((foundElem) => foundElem === element)\\n\\n      if (selector !== null && filterElement.length > 0) {\\n        this._selector = selector\\n        this._triggerArray.push(elem)\\n      }\\n    }\\n\\n    this._parent = this._config.parent ? this._getParent() : null\\n\\n    if (!this._config.parent) {\\n      this._addAriaAndCollapsedClass(this._element, this._triggerArray)\\n    }\\n\\n    if (this._config.toggle) {\\n      this.toggle()\\n    }\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  static get Default() {\\n    return Default\\n  }\\n\\n  // Public\\n\\n  toggle() {\\n    if ($(this._element).hasClass(ClassName.SHOW)) {\\n      this.hide()\\n    } else {\\n      this.show()\\n    }\\n  }\\n\\n  show() {\\n    if (this._isTransitioning ||\\n      $(this._element).hasClass(ClassName.SHOW)) {\\n      return\\n    }\\n\\n    let actives\\n    let activesData\\n\\n    if (this._parent) {\\n      actives = [].slice.call(this._parent.querySelectorAll(Selector.ACTIVES))\\n        .filter((elem) => {\\n          if (typeof this._config.parent === 'string') {\\n            return elem.getAttribute('data-parent') === this._config.parent\\n          }\\n\\n          return elem.classList.contains(ClassName.COLLAPSE)\\n        })\\n\\n      if (actives.length === 0) {\\n        actives = null\\n      }\\n    }\\n\\n    if (actives) {\\n      activesData = $(actives).not(this._selector).data(DATA_KEY)\\n      if (activesData && activesData._isTransitioning) {\\n        return\\n      }\\n    }\\n\\n    const startEvent = $.Event(Event.SHOW)\\n    $(this._element).trigger(startEvent)\\n    if (startEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    if (actives) {\\n      Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide')\\n      if (!activesData) {\\n        $(actives).data(DATA_KEY, null)\\n      }\\n    }\\n\\n    const dimension = this._getDimension()\\n\\n    $(this._element)\\n      .removeClass(ClassName.COLLAPSE)\\n      .addClass(ClassName.COLLAPSING)\\n\\n    this._element.style[dimension] = 0\\n\\n    if (this._triggerArray.length) {\\n      $(this._triggerArray)\\n        .removeClass(ClassName.COLLAPSED)\\n        .attr('aria-expanded', true)\\n    }\\n\\n    this.setTransitioning(true)\\n\\n    const complete = () => {\\n      $(this._element)\\n        .removeClass(ClassName.COLLAPSING)\\n        .addClass(ClassName.COLLAPSE)\\n        .addClass(ClassName.SHOW)\\n\\n      this._element.style[dimension] = ''\\n\\n      this.setTransitioning(false)\\n\\n      $(this._element).trigger(Event.SHOWN)\\n    }\\n\\n    const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\\n    const scrollSize = `scroll${capitalizedDimension}`\\n    const transitionDuration = Util.getTransitionDurationFromElement(this._element)\\n\\n    $(this._element)\\n      .one(Util.TRANSITION_END, complete)\\n      .emulateTransitionEnd(transitionDuration)\\n\\n    this._element.style[dimension] = `${this._element[scrollSize]}px`\\n  }\\n\\n  hide() {\\n    if (this._isTransitioning ||\\n      !$(this._element).hasClass(ClassName.SHOW)) {\\n      return\\n    }\\n\\n    const startEvent = $.Event(Event.HIDE)\\n    $(this._element).trigger(startEvent)\\n    if (startEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    const dimension = this._getDimension()\\n\\n    this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\\n\\n    Util.reflow(this._element)\\n\\n    $(this._element)\\n      .addClass(ClassName.COLLAPSING)\\n      .removeClass(ClassName.COLLAPSE)\\n      .removeClass(ClassName.SHOW)\\n\\n    const triggerArrayLength = this._triggerArray.length\\n    if (triggerArrayLength > 0) {\\n      for (let i = 0; i < triggerArrayLength; i++) {\\n        const trigger = this._triggerArray[i]\\n        const selector = Util.getSelectorFromElement(trigger)\\n\\n        if (selector !== null) {\\n          const $elem = $([].slice.call(document.querySelectorAll(selector)))\\n          if (!$elem.hasClass(ClassName.SHOW)) {\\n            $(trigger).addClass(ClassName.COLLAPSED)\\n              .attr('aria-expanded', false)\\n          }\\n        }\\n      }\\n    }\\n\\n    this.setTransitioning(true)\\n\\n    const complete = () => {\\n      this.setTransitioning(false)\\n      $(this._element)\\n        .removeClass(ClassName.COLLAPSING)\\n        .addClass(ClassName.COLLAPSE)\\n        .trigger(Event.HIDDEN)\\n    }\\n\\n    this._element.style[dimension] = ''\\n    const transitionDuration = Util.getTransitionDurationFromElement(this._element)\\n\\n    $(this._element)\\n      .one(Util.TRANSITION_END, complete)\\n      .emulateTransitionEnd(transitionDuration)\\n  }\\n\\n  setTransitioning(isTransitioning) {\\n    this._isTransitioning = isTransitioning\\n  }\\n\\n  dispose() {\\n    $.removeData(this._element, DATA_KEY)\\n\\n    this._config          = null\\n    this._parent          = null\\n    this._element         = null\\n    this._triggerArray    = null\\n    this._isTransitioning = null\\n  }\\n\\n  // Private\\n\\n  _getConfig(config) {\\n    config = {\\n      ...Default,\\n      ...config\\n    }\\n    config.toggle = Boolean(config.toggle) // Coerce string values\\n    Util.typeCheckConfig(NAME, config, DefaultType)\\n    return config\\n  }\\n\\n  _getDimension() {\\n    const hasWidth = $(this._element).hasClass(Dimension.WIDTH)\\n    return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT\\n  }\\n\\n  _getParent() {\\n    let parent\\n\\n    if (Util.isElement(this._config.parent)) {\\n      parent = this._config.parent\\n\\n      // It's a jQuery object\\n      if (typeof this._config.parent.jquery !== 'undefined') {\\n        parent = this._config.parent[0]\\n      }\\n    } else {\\n      parent = document.querySelector(this._config.parent)\\n    }\\n\\n    const selector =\\n      `[data-toggle=\\\"collapse\\\"][data-parent=\\\"${this._config.parent}\\\"]`\\n\\n    const children = [].slice.call(parent.querySelectorAll(selector))\\n    $(children).each((i, element) => {\\n      this._addAriaAndCollapsedClass(\\n        Collapse._getTargetFromElement(element),\\n        [element]\\n      )\\n    })\\n\\n    return parent\\n  }\\n\\n  _addAriaAndCollapsedClass(element, triggerArray) {\\n    const isOpen = $(element).hasClass(ClassName.SHOW)\\n\\n    if (triggerArray.length) {\\n      $(triggerArray)\\n        .toggleClass(ClassName.COLLAPSED, !isOpen)\\n        .attr('aria-expanded', isOpen)\\n    }\\n  }\\n\\n  // Static\\n\\n  static _getTargetFromElement(element) {\\n    const selector = Util.getSelectorFromElement(element)\\n    return selector ? document.querySelector(selector) : null\\n  }\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      const $this   = $(this)\\n      let data      = $this.data(DATA_KEY)\\n      const _config = {\\n        ...Default,\\n        ...$this.data(),\\n        ...typeof config === 'object' && config ? config : {}\\n      }\\n\\n      if (!data && _config.toggle && /show|hide/.test(config)) {\\n        _config.toggle = false\\n      }\\n\\n      if (!data) {\\n        data = new Collapse(this, _config)\\n        $this.data(DATA_KEY, data)\\n      }\\n\\n      if (typeof config === 'string') {\\n        if (typeof data[config] === 'undefined') {\\n          throw new TypeError(`No method named \\\"${config}\\\"`)\\n        }\\n        data[config]()\\n      }\\n    })\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Data Api implementation\\n * ------------------------------------------------------------------------\\n */\\n\\n$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\\n  // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\\n  if (event.currentTarget.tagName === 'A') {\\n    event.preventDefault()\\n  }\\n\\n  const $trigger = $(this)\\n  const selector = Util.getSelectorFromElement(this)\\n  const selectors = [].slice.call(document.querySelectorAll(selector))\\n\\n  $(selectors).each(function () {\\n    const $target = $(this)\\n    const data    = $target.data(DATA_KEY)\\n    const config  = data ? 'toggle' : $trigger.data()\\n    Collapse._jQueryInterface.call($target, config)\\n  })\\n})\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME] = Collapse._jQueryInterface\\n$.fn[NAME].Constructor = Collapse\\n$.fn[NAME].noConflict = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Collapse._jQueryInterface\\n}\\n\\nexport default Collapse\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): dropdown.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\nimport Popper from 'popper.js'\\nimport Util from './util'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME                     = 'dropdown'\\nconst VERSION                  = '4.3.1'\\nconst DATA_KEY                 = 'bs.dropdown'\\nconst EVENT_KEY                = `.${DATA_KEY}`\\nconst DATA_API_KEY             = '.data-api'\\nconst JQUERY_NO_CONFLICT       = $.fn[NAME]\\nconst ESCAPE_KEYCODE           = 27 // KeyboardEvent.which value for Escape (Esc) key\\nconst SPACE_KEYCODE            = 32 // KeyboardEvent.which value for space key\\nconst TAB_KEYCODE              = 9 // KeyboardEvent.which value for tab key\\nconst ARROW_UP_KEYCODE         = 38 // KeyboardEvent.which value for up arrow key\\nconst ARROW_DOWN_KEYCODE       = 40 // KeyboardEvent.which value for down arrow key\\nconst RIGHT_MOUSE_BUTTON_WHICH = 3 // MouseEvent.which value for the right button (assuming a right-handed mouse)\\nconst REGEXP_KEYDOWN           = new RegExp(`${ARROW_UP_KEYCODE}|${ARROW_DOWN_KEYCODE}|${ESCAPE_KEYCODE}`)\\n\\nconst Event = {\\n  HIDE             : `hide${EVENT_KEY}`,\\n  HIDDEN           : `hidden${EVENT_KEY}`,\\n  SHOW             : `show${EVENT_KEY}`,\\n  SHOWN            : `shown${EVENT_KEY}`,\\n  CLICK            : `click${EVENT_KEY}`,\\n  CLICK_DATA_API   : `click${EVENT_KEY}${DATA_API_KEY}`,\\n  KEYDOWN_DATA_API : `keydown${EVENT_KEY}${DATA_API_KEY}`,\\n  KEYUP_DATA_API   : `keyup${EVENT_KEY}${DATA_API_KEY}`\\n}\\n\\nconst ClassName = {\\n  DISABLED        : 'disabled',\\n  SHOW            : 'show',\\n  DROPUP          : 'dropup',\\n  DROPRIGHT       : 'dropright',\\n  DROPLEFT        : 'dropleft',\\n  MENURIGHT       : 'dropdown-menu-right',\\n  MENULEFT        : 'dropdown-menu-left',\\n  POSITION_STATIC : 'position-static'\\n}\\n\\nconst Selector = {\\n  DATA_TOGGLE   : '[data-toggle=\\\"dropdown\\\"]',\\n  FORM_CHILD    : '.dropdown form',\\n  MENU          : '.dropdown-menu',\\n  NAVBAR_NAV    : '.navbar-nav',\\n  VISIBLE_ITEMS : '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\\n}\\n\\nconst AttachmentMap = {\\n  TOP       : 'top-start',\\n  TOPEND    : 'top-end',\\n  BOTTOM    : 'bottom-start',\\n  BOTTOMEND : 'bottom-end',\\n  RIGHT     : 'right-start',\\n  RIGHTEND  : 'right-end',\\n  LEFT      : 'left-start',\\n  LEFTEND   : 'left-end'\\n}\\n\\nconst Default = {\\n  offset    : 0,\\n  flip      : true,\\n  boundary  : 'scrollParent',\\n  reference : 'toggle',\\n  display   : 'dynamic'\\n}\\n\\nconst DefaultType = {\\n  offset    : '(number|string|function)',\\n  flip      : 'boolean',\\n  boundary  : '(string|element)',\\n  reference : '(string|element)',\\n  display   : 'string'\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass Dropdown {\\n  constructor(element, config) {\\n    this._element  = element\\n    this._popper   = null\\n    this._config   = this._getConfig(config)\\n    this._menu     = this._getMenuElement()\\n    this._inNavbar = this._detectNavbar()\\n\\n    this._addEventListeners()\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  static get Default() {\\n    return Default\\n  }\\n\\n  static get DefaultType() {\\n    return DefaultType\\n  }\\n\\n  // Public\\n\\n  toggle() {\\n    if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED)) {\\n      return\\n    }\\n\\n    const parent   = Dropdown._getParentFromElement(this._element)\\n    const isActive = $(this._menu).hasClass(ClassName.SHOW)\\n\\n    Dropdown._clearMenus()\\n\\n    if (isActive) {\\n      return\\n    }\\n\\n    const relatedTarget = {\\n      relatedTarget: this._element\\n    }\\n    const showEvent = $.Event(Event.SHOW, relatedTarget)\\n\\n    $(parent).trigger(showEvent)\\n\\n    if (showEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    // Disable totally Popper.js for Dropdown in Navbar\\n    if (!this._inNavbar) {\\n      /**\\n       * Check for Popper dependency\\n       * Popper - https://popper.js.org\\n       */\\n      if (typeof Popper === 'undefined') {\\n        throw new TypeError('Bootstrap\\\\'s dropdowns require Popper.js (https://popper.js.org/)')\\n      }\\n\\n      let referenceElement = this._element\\n\\n      if (this._config.reference === 'parent') {\\n        referenceElement = parent\\n      } else if (Util.isElement(this._config.reference)) {\\n        referenceElement = this._config.reference\\n\\n        // Check if it's jQuery element\\n        if (typeof this._config.reference.jquery !== 'undefined') {\\n          referenceElement = this._config.reference[0]\\n        }\\n      }\\n\\n      // If boundary is not `scrollParent`, then set position to `static`\\n      // to allow the menu to \\\"escape\\\" the scroll parent's boundaries\\n      // https://github.com/twbs/bootstrap/issues/24251\\n      if (this._config.boundary !== 'scrollParent') {\\n        $(parent).addClass(ClassName.POSITION_STATIC)\\n      }\\n      this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig())\\n    }\\n\\n    // If this is a touch-enabled device we add extra\\n    // empty mouseover listeners to the body's immediate children;\\n    // only needed because of broken event delegation on iOS\\n    // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\\n    if ('ontouchstart' in document.documentElement &&\\n        $(parent).closest(Selector.NAVBAR_NAV).length === 0) {\\n      $(document.body).children().on('mouseover', null, $.noop)\\n    }\\n\\n    this._element.focus()\\n    this._element.setAttribute('aria-expanded', true)\\n\\n    $(this._menu).toggleClass(ClassName.SHOW)\\n    $(parent)\\n      .toggleClass(ClassName.SHOW)\\n      .trigger($.Event(Event.SHOWN, relatedTarget))\\n  }\\n\\n  show() {\\n    if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || $(this._menu).hasClass(ClassName.SHOW)) {\\n      return\\n    }\\n\\n    const relatedTarget = {\\n      relatedTarget: this._element\\n    }\\n    const showEvent = $.Event(Event.SHOW, relatedTarget)\\n    const parent = Dropdown._getParentFromElement(this._element)\\n\\n    $(parent).trigger(showEvent)\\n\\n    if (showEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    $(this._menu).toggleClass(ClassName.SHOW)\\n    $(parent)\\n      .toggleClass(ClassName.SHOW)\\n      .trigger($.Event(Event.SHOWN, relatedTarget))\\n  }\\n\\n  hide() {\\n    if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || !$(this._menu).hasClass(ClassName.SHOW)) {\\n      return\\n    }\\n\\n    const relatedTarget = {\\n      relatedTarget: this._element\\n    }\\n    const hideEvent = $.Event(Event.HIDE, relatedTarget)\\n    const parent = Dropdown._getParentFromElement(this._element)\\n\\n    $(parent).trigger(hideEvent)\\n\\n    if (hideEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    $(this._menu).toggleClass(ClassName.SHOW)\\n    $(parent)\\n      .toggleClass(ClassName.SHOW)\\n      .trigger($.Event(Event.HIDDEN, relatedTarget))\\n  }\\n\\n  dispose() {\\n    $.removeData(this._element, DATA_KEY)\\n    $(this._element).off(EVENT_KEY)\\n    this._element = null\\n    this._menu = null\\n    if (this._popper !== null) {\\n      this._popper.destroy()\\n      this._popper = null\\n    }\\n  }\\n\\n  update() {\\n    this._inNavbar = this._detectNavbar()\\n    if (this._popper !== null) {\\n      this._popper.scheduleUpdate()\\n    }\\n  }\\n\\n  // Private\\n\\n  _addEventListeners() {\\n    $(this._element).on(Event.CLICK, (event) => {\\n      event.preventDefault()\\n      event.stopPropagation()\\n      this.toggle()\\n    })\\n  }\\n\\n  _getConfig(config) {\\n    config = {\\n      ...this.constructor.Default,\\n      ...$(this._element).data(),\\n      ...config\\n    }\\n\\n    Util.typeCheckConfig(\\n      NAME,\\n      config,\\n      this.constructor.DefaultType\\n    )\\n\\n    return config\\n  }\\n\\n  _getMenuElement() {\\n    if (!this._menu) {\\n      const parent = Dropdown._getParentFromElement(this._element)\\n\\n      if (parent) {\\n        this._menu = parent.querySelector(Selector.MENU)\\n      }\\n    }\\n    return this._menu\\n  }\\n\\n  _getPlacement() {\\n    const $parentDropdown = $(this._element.parentNode)\\n    let placement = AttachmentMap.BOTTOM\\n\\n    // Handle dropup\\n    if ($parentDropdown.hasClass(ClassName.DROPUP)) {\\n      placement = AttachmentMap.TOP\\n      if ($(this._menu).hasClass(ClassName.MENURIGHT)) {\\n        placement = AttachmentMap.TOPEND\\n      }\\n    } else if ($parentDropdown.hasClass(ClassName.DROPRIGHT)) {\\n      placement = AttachmentMap.RIGHT\\n    } else if ($parentDropdown.hasClass(ClassName.DROPLEFT)) {\\n      placement = AttachmentMap.LEFT\\n    } else if ($(this._menu).hasClass(ClassName.MENURIGHT)) {\\n      placement = AttachmentMap.BOTTOMEND\\n    }\\n    return placement\\n  }\\n\\n  _detectNavbar() {\\n    return $(this._element).closest('.navbar').length > 0\\n  }\\n\\n  _getOffset() {\\n    const offset = {}\\n\\n    if (typeof this._config.offset === 'function') {\\n      offset.fn = (data) => {\\n        data.offsets = {\\n          ...data.offsets,\\n          ...this._config.offset(data.offsets, this._element) || {}\\n        }\\n\\n        return data\\n      }\\n    } else {\\n      offset.offset = this._config.offset\\n    }\\n\\n    return offset\\n  }\\n\\n  _getPopperConfig() {\\n    const popperConfig = {\\n      placement: this._getPlacement(),\\n      modifiers: {\\n        offset: this._getOffset(),\\n        flip: {\\n          enabled: this._config.flip\\n        },\\n        preventOverflow: {\\n          boundariesElement: this._config.boundary\\n        }\\n      }\\n    }\\n\\n    // Disable Popper.js if we have a static display\\n    if (this._config.display === 'static') {\\n      popperConfig.modifiers.applyStyle = {\\n        enabled: false\\n      }\\n    }\\n\\n    return popperConfig\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      let data = $(this).data(DATA_KEY)\\n      const _config = typeof config === 'object' ? config : null\\n\\n      if (!data) {\\n        data = new Dropdown(this, _config)\\n        $(this).data(DATA_KEY, data)\\n      }\\n\\n      if (typeof config === 'string') {\\n        if (typeof data[config] === 'undefined') {\\n          throw new TypeError(`No method named \\\"${config}\\\"`)\\n        }\\n        data[config]()\\n      }\\n    })\\n  }\\n\\n  static _clearMenus(event) {\\n    if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH ||\\n      event.type === 'keyup' && event.which !== TAB_KEYCODE)) {\\n      return\\n    }\\n\\n    const toggles = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE))\\n\\n    for (let i = 0, len = toggles.length; i < len; i++) {\\n      const parent = Dropdown._getParentFromElement(toggles[i])\\n      const context = $(toggles[i]).data(DATA_KEY)\\n      const relatedTarget = {\\n        relatedTarget: toggles[i]\\n      }\\n\\n      if (event && event.type === 'click') {\\n        relatedTarget.clickEvent = event\\n      }\\n\\n      if (!context) {\\n        continue\\n      }\\n\\n      const dropdownMenu = context._menu\\n      if (!$(parent).hasClass(ClassName.SHOW)) {\\n        continue\\n      }\\n\\n      if (event && (event.type === 'click' &&\\n          /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) &&\\n          $.contains(parent, event.target)) {\\n        continue\\n      }\\n\\n      const hideEvent = $.Event(Event.HIDE, relatedTarget)\\n      $(parent).trigger(hideEvent)\\n      if (hideEvent.isDefaultPrevented()) {\\n        continue\\n      }\\n\\n      // If this is a touch-enabled device we remove the extra\\n      // empty mouseover listeners we added for iOS support\\n      if ('ontouchstart' in document.documentElement) {\\n        $(document.body).children().off('mouseover', null, $.noop)\\n      }\\n\\n      toggles[i].setAttribute('aria-expanded', 'false')\\n\\n      $(dropdownMenu).removeClass(ClassName.SHOW)\\n      $(parent)\\n        .removeClass(ClassName.SHOW)\\n        .trigger($.Event(Event.HIDDEN, relatedTarget))\\n    }\\n  }\\n\\n  static _getParentFromElement(element) {\\n    let parent\\n    const selector = Util.getSelectorFromElement(element)\\n\\n    if (selector) {\\n      parent = document.querySelector(selector)\\n    }\\n\\n    return parent || element.parentNode\\n  }\\n\\n  // eslint-disable-next-line complexity\\n  static _dataApiKeydownHandler(event) {\\n    // If not input/textarea:\\n    //  - And not a key in REGEXP_KEYDOWN => not a dropdown command\\n    // If input/textarea:\\n    //  - If space key => not a dropdown command\\n    //  - If key is other than escape\\n    //    - If key is not up or down => not a dropdown command\\n    //    - If trigger inside the menu => not a dropdown command\\n    if (/input|textarea/i.test(event.target.tagName)\\n      ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE &&\\n      (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE ||\\n        $(event.target).closest(Selector.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {\\n      return\\n    }\\n\\n    event.preventDefault()\\n    event.stopPropagation()\\n\\n    if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {\\n      return\\n    }\\n\\n    const parent   = Dropdown._getParentFromElement(this)\\n    const isActive = $(parent).hasClass(ClassName.SHOW)\\n\\n    if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {\\n      if (event.which === ESCAPE_KEYCODE) {\\n        const toggle = parent.querySelector(Selector.DATA_TOGGLE)\\n        $(toggle).trigger('focus')\\n      }\\n\\n      $(this).trigger('click')\\n      return\\n    }\\n\\n    const items = [].slice.call(parent.querySelectorAll(Selector.VISIBLE_ITEMS))\\n\\n    if (items.length === 0) {\\n      return\\n    }\\n\\n    let index = items.indexOf(event.target)\\n\\n    if (event.which === ARROW_UP_KEYCODE && index > 0) { // Up\\n      index--\\n    }\\n\\n    if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) { // Down\\n      index++\\n    }\\n\\n    if (index < 0) {\\n      index = 0\\n    }\\n\\n    items[index].focus()\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Data Api implementation\\n * ------------------------------------------------------------------------\\n */\\n\\n$(document)\\n  .on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler)\\n  .on(Event.KEYDOWN_DATA_API, Selector.MENU, Dropdown._dataApiKeydownHandler)\\n  .on(`${Event.CLICK_DATA_API} ${Event.KEYUP_DATA_API}`, Dropdown._clearMenus)\\n  .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\\n    event.preventDefault()\\n    event.stopPropagation()\\n    Dropdown._jQueryInterface.call($(this), 'toggle')\\n  })\\n  .on(Event.CLICK_DATA_API, Selector.FORM_CHILD, (e) => {\\n    e.stopPropagation()\\n  })\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME] = Dropdown._jQueryInterface\\n$.fn[NAME].Constructor = Dropdown\\n$.fn[NAME].noConflict = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Dropdown._jQueryInterface\\n}\\n\\n\\nexport default Dropdown\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): modal.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\nimport Util from './util'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME               = 'modal'\\nconst VERSION            = '4.3.1'\\nconst DATA_KEY           = 'bs.modal'\\nconst EVENT_KEY          = `.${DATA_KEY}`\\nconst DATA_API_KEY       = '.data-api'\\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\\nconst ESCAPE_KEYCODE     = 27 // KeyboardEvent.which value for Escape (Esc) key\\n\\nconst Default = {\\n  backdrop : true,\\n  keyboard : true,\\n  focus    : true,\\n  show     : true\\n}\\n\\nconst DefaultType = {\\n  backdrop : '(boolean|string)',\\n  keyboard : 'boolean',\\n  focus    : 'boolean',\\n  show     : 'boolean'\\n}\\n\\nconst Event = {\\n  HIDE              : `hide${EVENT_KEY}`,\\n  HIDDEN            : `hidden${EVENT_KEY}`,\\n  SHOW              : `show${EVENT_KEY}`,\\n  SHOWN             : `shown${EVENT_KEY}`,\\n  FOCUSIN           : `focusin${EVENT_KEY}`,\\n  RESIZE            : `resize${EVENT_KEY}`,\\n  CLICK_DISMISS     : `click.dismiss${EVENT_KEY}`,\\n  KEYDOWN_DISMISS   : `keydown.dismiss${EVENT_KEY}`,\\n  MOUSEUP_DISMISS   : `mouseup.dismiss${EVENT_KEY}`,\\n  MOUSEDOWN_DISMISS : `mousedown.dismiss${EVENT_KEY}`,\\n  CLICK_DATA_API    : `click${EVENT_KEY}${DATA_API_KEY}`\\n}\\n\\nconst ClassName = {\\n  SCROLLABLE         : 'modal-dialog-scrollable',\\n  SCROLLBAR_MEASURER : 'modal-scrollbar-measure',\\n  BACKDROP           : 'modal-backdrop',\\n  OPEN               : 'modal-open',\\n  FADE               : 'fade',\\n  SHOW               : 'show'\\n}\\n\\nconst Selector = {\\n  DIALOG         : '.modal-dialog',\\n  MODAL_BODY     : '.modal-body',\\n  DATA_TOGGLE    : '[data-toggle=\\\"modal\\\"]',\\n  DATA_DISMISS   : '[data-dismiss=\\\"modal\\\"]',\\n  FIXED_CONTENT  : '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',\\n  STICKY_CONTENT : '.sticky-top'\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass Modal {\\n  constructor(element, config) {\\n    this._config              = this._getConfig(config)\\n    this._element             = element\\n    this._dialog              = element.querySelector(Selector.DIALOG)\\n    this._backdrop            = null\\n    this._isShown             = false\\n    this._isBodyOverflowing   = false\\n    this._ignoreBackdropClick = false\\n    this._isTransitioning     = false\\n    this._scrollbarWidth      = 0\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  static get Default() {\\n    return Default\\n  }\\n\\n  // Public\\n\\n  toggle(relatedTarget) {\\n    return this._isShown ? this.hide() : this.show(relatedTarget)\\n  }\\n\\n  show(relatedTarget) {\\n    if (this._isShown || this._isTransitioning) {\\n      return\\n    }\\n\\n    if ($(this._element).hasClass(ClassName.FADE)) {\\n      this._isTransitioning = true\\n    }\\n\\n    const showEvent = $.Event(Event.SHOW, {\\n      relatedTarget\\n    })\\n\\n    $(this._element).trigger(showEvent)\\n\\n    if (this._isShown || showEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    this._isShown = true\\n\\n    this._checkScrollbar()\\n    this._setScrollbar()\\n\\n    this._adjustDialog()\\n\\n    this._setEscapeEvent()\\n    this._setResizeEvent()\\n\\n    $(this._element).on(\\n      Event.CLICK_DISMISS,\\n      Selector.DATA_DISMISS,\\n      (event) => this.hide(event)\\n    )\\n\\n    $(this._dialog).on(Event.MOUSEDOWN_DISMISS, () => {\\n      $(this._element).one(Event.MOUSEUP_DISMISS, (event) => {\\n        if ($(event.target).is(this._element)) {\\n          this._ignoreBackdropClick = true\\n        }\\n      })\\n    })\\n\\n    this._showBackdrop(() => this._showElement(relatedTarget))\\n  }\\n\\n  hide(event) {\\n    if (event) {\\n      event.preventDefault()\\n    }\\n\\n    if (!this._isShown || this._isTransitioning) {\\n      return\\n    }\\n\\n    const hideEvent = $.Event(Event.HIDE)\\n\\n    $(this._element).trigger(hideEvent)\\n\\n    if (!this._isShown || hideEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    this._isShown = false\\n    const transition = $(this._element).hasClass(ClassName.FADE)\\n\\n    if (transition) {\\n      this._isTransitioning = true\\n    }\\n\\n    this._setEscapeEvent()\\n    this._setResizeEvent()\\n\\n    $(document).off(Event.FOCUSIN)\\n\\n    $(this._element).removeClass(ClassName.SHOW)\\n\\n    $(this._element).off(Event.CLICK_DISMISS)\\n    $(this._dialog).off(Event.MOUSEDOWN_DISMISS)\\n\\n\\n    if (transition) {\\n      const transitionDuration  = Util.getTransitionDurationFromElement(this._element)\\n\\n      $(this._element)\\n        .one(Util.TRANSITION_END, (event) => this._hideModal(event))\\n        .emulateTransitionEnd(transitionDuration)\\n    } else {\\n      this._hideModal()\\n    }\\n  }\\n\\n  dispose() {\\n    [window, this._element, this._dialog]\\n      .forEach((htmlElement) => $(htmlElement).off(EVENT_KEY))\\n\\n    /**\\n     * `document` has 2 events `Event.FOCUSIN` and `Event.CLICK_DATA_API`\\n     * Do not move `document` in `htmlElements` array\\n     * It will remove `Event.CLICK_DATA_API` event that should remain\\n     */\\n    $(document).off(Event.FOCUSIN)\\n\\n    $.removeData(this._element, DATA_KEY)\\n\\n    this._config              = null\\n    this._element             = null\\n    this._dialog              = null\\n    this._backdrop            = null\\n    this._isShown             = null\\n    this._isBodyOverflowing   = null\\n    this._ignoreBackdropClick = null\\n    this._isTransitioning     = null\\n    this._scrollbarWidth      = null\\n  }\\n\\n  handleUpdate() {\\n    this._adjustDialog()\\n  }\\n\\n  // Private\\n\\n  _getConfig(config) {\\n    config = {\\n      ...Default,\\n      ...config\\n    }\\n    Util.typeCheckConfig(NAME, config, DefaultType)\\n    return config\\n  }\\n\\n  _showElement(relatedTarget) {\\n    const transition = $(this._element).hasClass(ClassName.FADE)\\n\\n    if (!this._element.parentNode ||\\n        this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\\n      // Don't move modal's DOM position\\n      document.body.appendChild(this._element)\\n    }\\n\\n    this._element.style.display = 'block'\\n    this._element.removeAttribute('aria-hidden')\\n    this._element.setAttribute('aria-modal', true)\\n\\n    if ($(this._dialog).hasClass(ClassName.SCROLLABLE)) {\\n      this._dialog.querySelector(Selector.MODAL_BODY).scrollTop = 0\\n    } else {\\n      this._element.scrollTop = 0\\n    }\\n\\n    if (transition) {\\n      Util.reflow(this._element)\\n    }\\n\\n    $(this._element).addClass(ClassName.SHOW)\\n\\n    if (this._config.focus) {\\n      this._enforceFocus()\\n    }\\n\\n    const shownEvent = $.Event(Event.SHOWN, {\\n      relatedTarget\\n    })\\n\\n    const transitionComplete = () => {\\n      if (this._config.focus) {\\n        this._element.focus()\\n      }\\n      this._isTransitioning = false\\n      $(this._element).trigger(shownEvent)\\n    }\\n\\n    if (transition) {\\n      const transitionDuration  = Util.getTransitionDurationFromElement(this._dialog)\\n\\n      $(this._dialog)\\n        .one(Util.TRANSITION_END, transitionComplete)\\n        .emulateTransitionEnd(transitionDuration)\\n    } else {\\n      transitionComplete()\\n    }\\n  }\\n\\n  _enforceFocus() {\\n    $(document)\\n      .off(Event.FOCUSIN) // Guard against infinite focus loop\\n      .on(Event.FOCUSIN, (event) => {\\n        if (document !== event.target &&\\n            this._element !== event.target &&\\n            $(this._element).has(event.target).length === 0) {\\n          this._element.focus()\\n        }\\n      })\\n  }\\n\\n  _setEscapeEvent() {\\n    if (this._isShown && this._config.keyboard) {\\n      $(this._element).on(Event.KEYDOWN_DISMISS, (event) => {\\n        if (event.which === ESCAPE_KEYCODE) {\\n          event.preventDefault()\\n          this.hide()\\n        }\\n      })\\n    } else if (!this._isShown) {\\n      $(this._element).off(Event.KEYDOWN_DISMISS)\\n    }\\n  }\\n\\n  _setResizeEvent() {\\n    if (this._isShown) {\\n      $(window).on(Event.RESIZE, (event) => this.handleUpdate(event))\\n    } else {\\n      $(window).off(Event.RESIZE)\\n    }\\n  }\\n\\n  _hideModal() {\\n    this._element.style.display = 'none'\\n    this._element.setAttribute('aria-hidden', true)\\n    this._element.removeAttribute('aria-modal')\\n    this._isTransitioning = false\\n    this._showBackdrop(() => {\\n      $(document.body).removeClass(ClassName.OPEN)\\n      this._resetAdjustments()\\n      this._resetScrollbar()\\n      $(this._element).trigger(Event.HIDDEN)\\n    })\\n  }\\n\\n  _removeBackdrop() {\\n    if (this._backdrop) {\\n      $(this._backdrop).remove()\\n      this._backdrop = null\\n    }\\n  }\\n\\n  _showBackdrop(callback) {\\n    const animate = $(this._element).hasClass(ClassName.FADE)\\n      ? ClassName.FADE : ''\\n\\n    if (this._isShown && this._config.backdrop) {\\n      this._backdrop = document.createElement('div')\\n      this._backdrop.className = ClassName.BACKDROP\\n\\n      if (animate) {\\n        this._backdrop.classList.add(animate)\\n      }\\n\\n      $(this._backdrop).appendTo(document.body)\\n\\n      $(this._element).on(Event.CLICK_DISMISS, (event) => {\\n        if (this._ignoreBackdropClick) {\\n          this._ignoreBackdropClick = false\\n          return\\n        }\\n        if (event.target !== event.currentTarget) {\\n          return\\n        }\\n        if (this._config.backdrop === 'static') {\\n          this._element.focus()\\n        } else {\\n          this.hide()\\n        }\\n      })\\n\\n      if (animate) {\\n        Util.reflow(this._backdrop)\\n      }\\n\\n      $(this._backdrop).addClass(ClassName.SHOW)\\n\\n      if (!callback) {\\n        return\\n      }\\n\\n      if (!animate) {\\n        callback()\\n        return\\n      }\\n\\n      const backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop)\\n\\n      $(this._backdrop)\\n        .one(Util.TRANSITION_END, callback)\\n        .emulateTransitionEnd(backdropTransitionDuration)\\n    } else if (!this._isShown && this._backdrop) {\\n      $(this._backdrop).removeClass(ClassName.SHOW)\\n\\n      const callbackRemove = () => {\\n        this._removeBackdrop()\\n        if (callback) {\\n          callback()\\n        }\\n      }\\n\\n      if ($(this._element).hasClass(ClassName.FADE)) {\\n        const backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop)\\n\\n        $(this._backdrop)\\n          .one(Util.TRANSITION_END, callbackRemove)\\n          .emulateTransitionEnd(backdropTransitionDuration)\\n      } else {\\n        callbackRemove()\\n      }\\n    } else if (callback) {\\n      callback()\\n    }\\n  }\\n\\n  // ----------------------------------------------------------------------\\n  // the following methods are used to handle overflowing modals\\n  // todo (fat): these should probably be refactored out of modal.js\\n  // ----------------------------------------------------------------------\\n\\n  _adjustDialog() {\\n    const isModalOverflowing =\\n      this._element.scrollHeight > document.documentElement.clientHeight\\n\\n    if (!this._isBodyOverflowing && isModalOverflowing) {\\n      this._element.style.paddingLeft = `${this._scrollbarWidth}px`\\n    }\\n\\n    if (this._isBodyOverflowing && !isModalOverflowing) {\\n      this._element.style.paddingRight = `${this._scrollbarWidth}px`\\n    }\\n  }\\n\\n  _resetAdjustments() {\\n    this._element.style.paddingLeft = ''\\n    this._element.style.paddingRight = ''\\n  }\\n\\n  _checkScrollbar() {\\n    const rect = document.body.getBoundingClientRect()\\n    this._isBodyOverflowing = rect.left + rect.right < window.innerWidth\\n    this._scrollbarWidth = this._getScrollbarWidth()\\n  }\\n\\n  _setScrollbar() {\\n    if (this._isBodyOverflowing) {\\n      // Note: DOMNode.style.paddingRight returns the actual value or '' if not set\\n      //   while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set\\n      const fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT))\\n      const stickyContent = [].slice.call(document.querySelectorAll(Selector.STICKY_CONTENT))\\n\\n      // Adjust fixed content padding\\n      $(fixedContent).each((index, element) => {\\n        const actualPadding = element.style.paddingRight\\n        const calculatedPadding = $(element).css('padding-right')\\n        $(element)\\n          .data('padding-right', actualPadding)\\n          .css('padding-right', `${parseFloat(calculatedPadding) + this._scrollbarWidth}px`)\\n      })\\n\\n      // Adjust sticky content margin\\n      $(stickyContent).each((index, element) => {\\n        const actualMargin = element.style.marginRight\\n        const calculatedMargin = $(element).css('margin-right')\\n        $(element)\\n          .data('margin-right', actualMargin)\\n          .css('margin-right', `${parseFloat(calculatedMargin) - this._scrollbarWidth}px`)\\n      })\\n\\n      // Adjust body padding\\n      const actualPadding = document.body.style.paddingRight\\n      const calculatedPadding = $(document.body).css('padding-right')\\n      $(document.body)\\n        .data('padding-right', actualPadding)\\n        .css('padding-right', `${parseFloat(calculatedPadding) + this._scrollbarWidth}px`)\\n    }\\n\\n    $(document.body).addClass(ClassName.OPEN)\\n  }\\n\\n  _resetScrollbar() {\\n    // Restore fixed content padding\\n    const fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT))\\n    $(fixedContent).each((index, element) => {\\n      const padding = $(element).data('padding-right')\\n      $(element).removeData('padding-right')\\n      element.style.paddingRight = padding ? padding : ''\\n    })\\n\\n    // Restore sticky content\\n    const elements = [].slice.call(document.querySelectorAll(`${Selector.STICKY_CONTENT}`))\\n    $(elements).each((index, element) => {\\n      const margin = $(element).data('margin-right')\\n      if (typeof margin !== 'undefined') {\\n        $(element).css('margin-right', margin).removeData('margin-right')\\n      }\\n    })\\n\\n    // Restore body padding\\n    const padding = $(document.body).data('padding-right')\\n    $(document.body).removeData('padding-right')\\n    document.body.style.paddingRight = padding ? padding : ''\\n  }\\n\\n  _getScrollbarWidth() { // thx d.walsh\\n    const scrollDiv = document.createElement('div')\\n    scrollDiv.className = ClassName.SCROLLBAR_MEASURER\\n    document.body.appendChild(scrollDiv)\\n    const scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth\\n    document.body.removeChild(scrollDiv)\\n    return scrollbarWidth\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config, relatedTarget) {\\n    return this.each(function () {\\n      let data = $(this).data(DATA_KEY)\\n      const _config = {\\n        ...Default,\\n        ...$(this).data(),\\n        ...typeof config === 'object' && config ? config : {}\\n      }\\n\\n      if (!data) {\\n        data = new Modal(this, _config)\\n        $(this).data(DATA_KEY, data)\\n      }\\n\\n      if (typeof config === 'string') {\\n        if (typeof data[config] === 'undefined') {\\n          throw new TypeError(`No method named \\\"${config}\\\"`)\\n        }\\n        data[config](relatedTarget)\\n      } else if (_config.show) {\\n        data.show(relatedTarget)\\n      }\\n    })\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Data Api implementation\\n * ------------------------------------------------------------------------\\n */\\n\\n$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\\n  let target\\n  const selector = Util.getSelectorFromElement(this)\\n\\n  if (selector) {\\n    target = document.querySelector(selector)\\n  }\\n\\n  const config = $(target).data(DATA_KEY)\\n    ? 'toggle' : {\\n      ...$(target).data(),\\n      ...$(this).data()\\n    }\\n\\n  if (this.tagName === 'A' || this.tagName === 'AREA') {\\n    event.preventDefault()\\n  }\\n\\n  const $target = $(target).one(Event.SHOW, (showEvent) => {\\n    if (showEvent.isDefaultPrevented()) {\\n      // Only register focus restorer if modal will actually get shown\\n      return\\n    }\\n\\n    $target.one(Event.HIDDEN, () => {\\n      if ($(this).is(':visible')) {\\n        this.focus()\\n      }\\n    })\\n  })\\n\\n  Modal._jQueryInterface.call($(target), config, this)\\n})\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME] = Modal._jQueryInterface\\n$.fn[NAME].Constructor = Modal\\n$.fn[NAME].noConflict = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Modal._jQueryInterface\\n}\\n\\nexport default Modal\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): tools/sanitizer.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nconst uriAttrs = [\\n  'background',\\n  'cite',\\n  'href',\\n  'itemtype',\\n  'longdesc',\\n  'poster',\\n  'src',\\n  'xlink:href'\\n]\\n\\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\\\w-]*$/i\\n\\nexport const DefaultWhitelist = {\\n  // Global attributes allowed on any supplied element below.\\n  '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\\n  a: ['target', 'href', 'title', 'rel'],\\n  area: [],\\n  b: [],\\n  br: [],\\n  col: [],\\n  code: [],\\n  div: [],\\n  em: [],\\n  hr: [],\\n  h1: [],\\n  h2: [],\\n  h3: [],\\n  h4: [],\\n  h5: [],\\n  h6: [],\\n  i: [],\\n  img: ['src', 'alt', 'title', 'width', 'height'],\\n  li: [],\\n  ol: [],\\n  p: [],\\n  pre: [],\\n  s: [],\\n  small: [],\\n  span: [],\\n  sub: [],\\n  sup: [],\\n  strong: [],\\n  u: [],\\n  ul: []\\n}\\n\\n/**\\n * A pattern that recognizes a commonly useful subset of URLs that are safe.\\n *\\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\\n */\\nconst SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi\\n\\n/**\\n * A pattern that matches safe data URLs. Only matches image, video and audio types.\\n *\\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\\n */\\nconst DATA_URL_PATTERN = /^data:(?:image\\\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\\\/(?:mpeg|mp4|ogg|webm)|audio\\\\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i\\n\\nfunction allowedAttribute(attr, allowedAttributeList) {\\n  const attrName = attr.nodeName.toLowerCase()\\n\\n  if (allowedAttributeList.indexOf(attrName) !== -1) {\\n    if (uriAttrs.indexOf(attrName) !== -1) {\\n      return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN))\\n    }\\n\\n    return true\\n  }\\n\\n  const regExp = allowedAttributeList.filter((attrRegex) => attrRegex instanceof RegExp)\\n\\n  // Check if a regular expression validates the attribute.\\n  for (let i = 0, l = regExp.length; i < l; i++) {\\n    if (attrName.match(regExp[i])) {\\n      return true\\n    }\\n  }\\n\\n  return false\\n}\\n\\nexport function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {\\n  if (unsafeHtml.length === 0) {\\n    return unsafeHtml\\n  }\\n\\n  if (sanitizeFn && typeof sanitizeFn === 'function') {\\n    return sanitizeFn(unsafeHtml)\\n  }\\n\\n  const domParser = new window.DOMParser()\\n  const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\\n  const whitelistKeys = Object.keys(whiteList)\\n  const elements = [].slice.call(createdDocument.body.querySelectorAll('*'))\\n\\n  for (let i = 0, len = elements.length; i < len; i++) {\\n    const el = elements[i]\\n    const elName = el.nodeName.toLowerCase()\\n\\n    if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) {\\n      el.parentNode.removeChild(el)\\n\\n      continue\\n    }\\n\\n    const attributeList = [].slice.call(el.attributes)\\n    const whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || [])\\n\\n    attributeList.forEach((attr) => {\\n      if (!allowedAttribute(attr, whitelistedAttributes)) {\\n        el.removeAttribute(attr.nodeName)\\n      }\\n    })\\n  }\\n\\n  return createdDocument.body.innerHTML\\n}\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): tooltip.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport {\\n  DefaultWhitelist,\\n  sanitizeHtml\\n} from './tools/sanitizer'\\nimport $ from 'jquery'\\nimport Popper from 'popper.js'\\nimport Util from './util'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME                  = 'tooltip'\\nconst VERSION               = '4.3.1'\\nconst DATA_KEY              = 'bs.tooltip'\\nconst EVENT_KEY             = `.${DATA_KEY}`\\nconst JQUERY_NO_CONFLICT    = $.fn[NAME]\\nconst CLASS_PREFIX          = 'bs-tooltip'\\nconst BSCLS_PREFIX_REGEX    = new RegExp(`(^|\\\\\\\\s)${CLASS_PREFIX}\\\\\\\\S+`, 'g')\\nconst DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']\\n\\nconst DefaultType = {\\n  animation         : 'boolean',\\n  template          : 'string',\\n  title             : '(string|element|function)',\\n  trigger           : 'string',\\n  delay             : '(number|object)',\\n  html              : 'boolean',\\n  selector          : '(string|boolean)',\\n  placement         : '(string|function)',\\n  offset            : '(number|string|function)',\\n  container         : '(string|element|boolean)',\\n  fallbackPlacement : '(string|array)',\\n  boundary          : '(string|element)',\\n  sanitize          : 'boolean',\\n  sanitizeFn        : '(null|function)',\\n  whiteList         : 'object'\\n}\\n\\nconst AttachmentMap = {\\n  AUTO   : 'auto',\\n  TOP    : 'top',\\n  RIGHT  : 'right',\\n  BOTTOM : 'bottom',\\n  LEFT   : 'left'\\n}\\n\\nconst Default = {\\n  animation         : true,\\n  template          : '<div class=\\\"tooltip\\\" role=\\\"tooltip\\\">' +\\n                    '<div class=\\\"arrow\\\"></div>' +\\n                    '<div class=\\\"tooltip-inner\\\"></div></div>',\\n  trigger           : 'hover focus',\\n  title             : '',\\n  delay             : 0,\\n  html              : false,\\n  selector          : false,\\n  placement         : 'top',\\n  offset            : 0,\\n  container         : false,\\n  fallbackPlacement : 'flip',\\n  boundary          : 'scrollParent',\\n  sanitize          : true,\\n  sanitizeFn        : null,\\n  whiteList         : DefaultWhitelist\\n}\\n\\nconst HoverState = {\\n  SHOW : 'show',\\n  OUT  : 'out'\\n}\\n\\nconst Event = {\\n  HIDE       : `hide${EVENT_KEY}`,\\n  HIDDEN     : `hidden${EVENT_KEY}`,\\n  SHOW       : `show${EVENT_KEY}`,\\n  SHOWN      : `shown${EVENT_KEY}`,\\n  INSERTED   : `inserted${EVENT_KEY}`,\\n  CLICK      : `click${EVENT_KEY}`,\\n  FOCUSIN    : `focusin${EVENT_KEY}`,\\n  FOCUSOUT   : `focusout${EVENT_KEY}`,\\n  MOUSEENTER : `mouseenter${EVENT_KEY}`,\\n  MOUSELEAVE : `mouseleave${EVENT_KEY}`\\n}\\n\\nconst ClassName = {\\n  FADE : 'fade',\\n  SHOW : 'show'\\n}\\n\\nconst Selector = {\\n  TOOLTIP       : '.tooltip',\\n  TOOLTIP_INNER : '.tooltip-inner',\\n  ARROW         : '.arrow'\\n}\\n\\nconst Trigger = {\\n  HOVER  : 'hover',\\n  FOCUS  : 'focus',\\n  CLICK  : 'click',\\n  MANUAL : 'manual'\\n}\\n\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass Tooltip {\\n  constructor(element, config) {\\n    /**\\n     * Check for Popper dependency\\n     * Popper - https://popper.js.org\\n     */\\n    if (typeof Popper === 'undefined') {\\n      throw new TypeError('Bootstrap\\\\'s tooltips require Popper.js (https://popper.js.org/)')\\n    }\\n\\n    // private\\n    this._isEnabled     = true\\n    this._timeout       = 0\\n    this._hoverState    = ''\\n    this._activeTrigger = {}\\n    this._popper        = null\\n\\n    // Protected\\n    this.element = element\\n    this.config  = this._getConfig(config)\\n    this.tip     = null\\n\\n    this._setListeners()\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  static get Default() {\\n    return Default\\n  }\\n\\n  static get NAME() {\\n    return NAME\\n  }\\n\\n  static get DATA_KEY() {\\n    return DATA_KEY\\n  }\\n\\n  static get Event() {\\n    return Event\\n  }\\n\\n  static get EVENT_KEY() {\\n    return EVENT_KEY\\n  }\\n\\n  static get DefaultType() {\\n    return DefaultType\\n  }\\n\\n  // Public\\n\\n  enable() {\\n    this._isEnabled = true\\n  }\\n\\n  disable() {\\n    this._isEnabled = false\\n  }\\n\\n  toggleEnabled() {\\n    this._isEnabled = !this._isEnabled\\n  }\\n\\n  toggle(event) {\\n    if (!this._isEnabled) {\\n      return\\n    }\\n\\n    if (event) {\\n      const dataKey = this.constructor.DATA_KEY\\n      let context = $(event.currentTarget).data(dataKey)\\n\\n      if (!context) {\\n        context = new this.constructor(\\n          event.currentTarget,\\n          this._getDelegateConfig()\\n        )\\n        $(event.currentTarget).data(dataKey, context)\\n      }\\n\\n      context._activeTrigger.click = !context._activeTrigger.click\\n\\n      if (context._isWithActiveTrigger()) {\\n        context._enter(null, context)\\n      } else {\\n        context._leave(null, context)\\n      }\\n    } else {\\n      if ($(this.getTipElement()).hasClass(ClassName.SHOW)) {\\n        this._leave(null, this)\\n        return\\n      }\\n\\n      this._enter(null, this)\\n    }\\n  }\\n\\n  dispose() {\\n    clearTimeout(this._timeout)\\n\\n    $.removeData(this.element, this.constructor.DATA_KEY)\\n\\n    $(this.element).off(this.constructor.EVENT_KEY)\\n    $(this.element).closest('.modal').off('hide.bs.modal')\\n\\n    if (this.tip) {\\n      $(this.tip).remove()\\n    }\\n\\n    this._isEnabled     = null\\n    this._timeout       = null\\n    this._hoverState    = null\\n    this._activeTrigger = null\\n    if (this._popper !== null) {\\n      this._popper.destroy()\\n    }\\n\\n    this._popper = null\\n    this.element = null\\n    this.config  = null\\n    this.tip     = null\\n  }\\n\\n  show() {\\n    if ($(this.element).css('display') === 'none') {\\n      throw new Error('Please use show on visible elements')\\n    }\\n\\n    const showEvent = $.Event(this.constructor.Event.SHOW)\\n    if (this.isWithContent() && this._isEnabled) {\\n      $(this.element).trigger(showEvent)\\n\\n      const shadowRoot = Util.findShadowRoot(this.element)\\n      const isInTheDom = $.contains(\\n        shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement,\\n        this.element\\n      )\\n\\n      if (showEvent.isDefaultPrevented() || !isInTheDom) {\\n        return\\n      }\\n\\n      const tip   = this.getTipElement()\\n      const tipId = Util.getUID(this.constructor.NAME)\\n\\n      tip.setAttribute('id', tipId)\\n      this.element.setAttribute('aria-describedby', tipId)\\n\\n      this.setContent()\\n\\n      if (this.config.animation) {\\n        $(tip).addClass(ClassName.FADE)\\n      }\\n\\n      const placement  = typeof this.config.placement === 'function'\\n        ? this.config.placement.call(this, tip, this.element)\\n        : this.config.placement\\n\\n      const attachment = this._getAttachment(placement)\\n      this.addAttachmentClass(attachment)\\n\\n      const container = this._getContainer()\\n      $(tip).data(this.constructor.DATA_KEY, this)\\n\\n      if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) {\\n        $(tip).appendTo(container)\\n      }\\n\\n      $(this.element).trigger(this.constructor.Event.INSERTED)\\n\\n      this._popper = new Popper(this.element, tip, {\\n        placement: attachment,\\n        modifiers: {\\n          offset: this._getOffset(),\\n          flip: {\\n            behavior: this.config.fallbackPlacement\\n          },\\n          arrow: {\\n            element: Selector.ARROW\\n          },\\n          preventOverflow: {\\n            boundariesElement: this.config.boundary\\n          }\\n        },\\n        onCreate: (data) => {\\n          if (data.originalPlacement !== data.placement) {\\n            this._handlePopperPlacementChange(data)\\n          }\\n        },\\n        onUpdate: (data) => this._handlePopperPlacementChange(data)\\n      })\\n\\n      $(tip).addClass(ClassName.SHOW)\\n\\n      // If this is a touch-enabled device we add extra\\n      // empty mouseover listeners to the body's immediate children;\\n      // only needed because of broken event delegation on iOS\\n      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\\n      if ('ontouchstart' in document.documentElement) {\\n        $(document.body).children().on('mouseover', null, $.noop)\\n      }\\n\\n      const complete = () => {\\n        if (this.config.animation) {\\n          this._fixTransition()\\n        }\\n        const prevHoverState = this._hoverState\\n        this._hoverState     = null\\n\\n        $(this.element).trigger(this.constructor.Event.SHOWN)\\n\\n        if (prevHoverState === HoverState.OUT) {\\n          this._leave(null, this)\\n        }\\n      }\\n\\n      if ($(this.tip).hasClass(ClassName.FADE)) {\\n        const transitionDuration = Util.getTransitionDurationFromElement(this.tip)\\n\\n        $(this.tip)\\n          .one(Util.TRANSITION_END, complete)\\n          .emulateTransitionEnd(transitionDuration)\\n      } else {\\n        complete()\\n      }\\n    }\\n  }\\n\\n  hide(callback) {\\n    const tip       = this.getTipElement()\\n    const hideEvent = $.Event(this.constructor.Event.HIDE)\\n    const complete = () => {\\n      if (this._hoverState !== HoverState.SHOW && tip.parentNode) {\\n        tip.parentNode.removeChild(tip)\\n      }\\n\\n      this._cleanTipClass()\\n      this.element.removeAttribute('aria-describedby')\\n      $(this.element).trigger(this.constructor.Event.HIDDEN)\\n      if (this._popper !== null) {\\n        this._popper.destroy()\\n      }\\n\\n      if (callback) {\\n        callback()\\n      }\\n    }\\n\\n    $(this.element).trigger(hideEvent)\\n\\n    if (hideEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    $(tip).removeClass(ClassName.SHOW)\\n\\n    // If this is a touch-enabled device we remove the extra\\n    // empty mouseover listeners we added for iOS support\\n    if ('ontouchstart' in document.documentElement) {\\n      $(document.body).children().off('mouseover', null, $.noop)\\n    }\\n\\n    this._activeTrigger[Trigger.CLICK] = false\\n    this._activeTrigger[Trigger.FOCUS] = false\\n    this._activeTrigger[Trigger.HOVER] = false\\n\\n    if ($(this.tip).hasClass(ClassName.FADE)) {\\n      const transitionDuration = Util.getTransitionDurationFromElement(tip)\\n\\n      $(tip)\\n        .one(Util.TRANSITION_END, complete)\\n        .emulateTransitionEnd(transitionDuration)\\n    } else {\\n      complete()\\n    }\\n\\n    this._hoverState = ''\\n  }\\n\\n  update() {\\n    if (this._popper !== null) {\\n      this._popper.scheduleUpdate()\\n    }\\n  }\\n\\n  // Protected\\n\\n  isWithContent() {\\n    return Boolean(this.getTitle())\\n  }\\n\\n  addAttachmentClass(attachment) {\\n    $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)\\n  }\\n\\n  getTipElement() {\\n    this.tip = this.tip || $(this.config.template)[0]\\n    return this.tip\\n  }\\n\\n  setContent() {\\n    const tip = this.getTipElement()\\n    this.setElementContent($(tip.querySelectorAll(Selector.TOOLTIP_INNER)), this.getTitle())\\n    $(tip).removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)\\n  }\\n\\n  setElementContent($element, content) {\\n    if (typeof content === 'object' && (content.nodeType || content.jquery)) {\\n      // Content is a DOM node or a jQuery\\n      if (this.config.html) {\\n        if (!$(content).parent().is($element)) {\\n          $element.empty().append(content)\\n        }\\n      } else {\\n        $element.text($(content).text())\\n      }\\n\\n      return\\n    }\\n\\n    if (this.config.html) {\\n      if (this.config.sanitize) {\\n        content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn)\\n      }\\n\\n      $element.html(content)\\n    } else {\\n      $element.text(content)\\n    }\\n  }\\n\\n  getTitle() {\\n    let title = this.element.getAttribute('data-original-title')\\n\\n    if (!title) {\\n      title = typeof this.config.title === 'function'\\n        ? this.config.title.call(this.element)\\n        : this.config.title\\n    }\\n\\n    return title\\n  }\\n\\n  // Private\\n\\n  _getOffset() {\\n    const offset = {}\\n\\n    if (typeof this.config.offset === 'function') {\\n      offset.fn = (data) => {\\n        data.offsets = {\\n          ...data.offsets,\\n          ...this.config.offset(data.offsets, this.element) || {}\\n        }\\n\\n        return data\\n      }\\n    } else {\\n      offset.offset = this.config.offset\\n    }\\n\\n    return offset\\n  }\\n\\n  _getContainer() {\\n    if (this.config.container === false) {\\n      return document.body\\n    }\\n\\n    if (Util.isElement(this.config.container)) {\\n      return $(this.config.container)\\n    }\\n\\n    return $(document).find(this.config.container)\\n  }\\n\\n  _getAttachment(placement) {\\n    return AttachmentMap[placement.toUpperCase()]\\n  }\\n\\n  _setListeners() {\\n    const triggers = this.config.trigger.split(' ')\\n\\n    triggers.forEach((trigger) => {\\n      if (trigger === 'click') {\\n        $(this.element).on(\\n          this.constructor.Event.CLICK,\\n          this.config.selector,\\n          (event) => this.toggle(event)\\n        )\\n      } else if (trigger !== Trigger.MANUAL) {\\n        const eventIn = trigger === Trigger.HOVER\\n          ? this.constructor.Event.MOUSEENTER\\n          : this.constructor.Event.FOCUSIN\\n        const eventOut = trigger === Trigger.HOVER\\n          ? this.constructor.Event.MOUSELEAVE\\n          : this.constructor.Event.FOCUSOUT\\n\\n        $(this.element)\\n          .on(\\n            eventIn,\\n            this.config.selector,\\n            (event) => this._enter(event)\\n          )\\n          .on(\\n            eventOut,\\n            this.config.selector,\\n            (event) => this._leave(event)\\n          )\\n      }\\n    })\\n\\n    $(this.element).closest('.modal').on(\\n      'hide.bs.modal',\\n      () => {\\n        if (this.element) {\\n          this.hide()\\n        }\\n      }\\n    )\\n\\n    if (this.config.selector) {\\n      this.config = {\\n        ...this.config,\\n        trigger: 'manual',\\n        selector: ''\\n      }\\n    } else {\\n      this._fixTitle()\\n    }\\n  }\\n\\n  _fixTitle() {\\n    const titleType = typeof this.element.getAttribute('data-original-title')\\n\\n    if (this.element.getAttribute('title') || titleType !== 'string') {\\n      this.element.setAttribute(\\n        'data-original-title',\\n        this.element.getAttribute('title') || ''\\n      )\\n\\n      this.element.setAttribute('title', '')\\n    }\\n  }\\n\\n  _enter(event, context) {\\n    const dataKey = this.constructor.DATA_KEY\\n    context = context || $(event.currentTarget).data(dataKey)\\n\\n    if (!context) {\\n      context = new this.constructor(\\n        event.currentTarget,\\n        this._getDelegateConfig()\\n      )\\n      $(event.currentTarget).data(dataKey, context)\\n    }\\n\\n    if (event) {\\n      context._activeTrigger[\\n        event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER\\n      ] = true\\n    }\\n\\n    if ($(context.getTipElement()).hasClass(ClassName.SHOW) || context._hoverState === HoverState.SHOW) {\\n      context._hoverState = HoverState.SHOW\\n      return\\n    }\\n\\n    clearTimeout(context._timeout)\\n\\n    context._hoverState = HoverState.SHOW\\n\\n    if (!context.config.delay || !context.config.delay.show) {\\n      context.show()\\n      return\\n    }\\n\\n    context._timeout = setTimeout(() => {\\n      if (context._hoverState === HoverState.SHOW) {\\n        context.show()\\n      }\\n    }, context.config.delay.show)\\n  }\\n\\n  _leave(event, context) {\\n    const dataKey = this.constructor.DATA_KEY\\n    context = context || $(event.currentTarget).data(dataKey)\\n\\n    if (!context) {\\n      context = new this.constructor(\\n        event.currentTarget,\\n        this._getDelegateConfig()\\n      )\\n      $(event.currentTarget).data(dataKey, context)\\n    }\\n\\n    if (event) {\\n      context._activeTrigger[\\n        event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER\\n      ] = false\\n    }\\n\\n    if (context._isWithActiveTrigger()) {\\n      return\\n    }\\n\\n    clearTimeout(context._timeout)\\n\\n    context._hoverState = HoverState.OUT\\n\\n    if (!context.config.delay || !context.config.delay.hide) {\\n      context.hide()\\n      return\\n    }\\n\\n    context._timeout = setTimeout(() => {\\n      if (context._hoverState === HoverState.OUT) {\\n        context.hide()\\n      }\\n    }, context.config.delay.hide)\\n  }\\n\\n  _isWithActiveTrigger() {\\n    for (const trigger in this._activeTrigger) {\\n      if (this._activeTrigger[trigger]) {\\n        return true\\n      }\\n    }\\n\\n    return false\\n  }\\n\\n  _getConfig(config) {\\n    const dataAttributes = $(this.element).data()\\n\\n    Object.keys(dataAttributes)\\n      .forEach((dataAttr) => {\\n        if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {\\n          delete dataAttributes[dataAttr]\\n        }\\n      })\\n\\n    config = {\\n      ...this.constructor.Default,\\n      ...dataAttributes,\\n      ...typeof config === 'object' && config ? config : {}\\n    }\\n\\n    if (typeof config.delay === 'number') {\\n      config.delay = {\\n        show: config.delay,\\n        hide: config.delay\\n      }\\n    }\\n\\n    if (typeof config.title === 'number') {\\n      config.title = config.title.toString()\\n    }\\n\\n    if (typeof config.content === 'number') {\\n      config.content = config.content.toString()\\n    }\\n\\n    Util.typeCheckConfig(\\n      NAME,\\n      config,\\n      this.constructor.DefaultType\\n    )\\n\\n    if (config.sanitize) {\\n      config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn)\\n    }\\n\\n    return config\\n  }\\n\\n  _getDelegateConfig() {\\n    const config = {}\\n\\n    if (this.config) {\\n      for (const key in this.config) {\\n        if (this.constructor.Default[key] !== this.config[key]) {\\n          config[key] = this.config[key]\\n        }\\n      }\\n    }\\n\\n    return config\\n  }\\n\\n  _cleanTipClass() {\\n    const $tip = $(this.getTipElement())\\n    const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)\\n    if (tabClass !== null && tabClass.length) {\\n      $tip.removeClass(tabClass.join(''))\\n    }\\n  }\\n\\n  _handlePopperPlacementChange(popperData) {\\n    const popperInstance = popperData.instance\\n    this.tip = popperInstance.popper\\n    this._cleanTipClass()\\n    this.addAttachmentClass(this._getAttachment(popperData.placement))\\n  }\\n\\n  _fixTransition() {\\n    const tip = this.getTipElement()\\n    const initConfigAnimation = this.config.animation\\n\\n    if (tip.getAttribute('x-placement') !== null) {\\n      return\\n    }\\n\\n    $(tip).removeClass(ClassName.FADE)\\n    this.config.animation = false\\n    this.hide()\\n    this.show()\\n    this.config.animation = initConfigAnimation\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      let data = $(this).data(DATA_KEY)\\n      const _config = typeof config === 'object' && config\\n\\n      if (!data && /dispose|hide/.test(config)) {\\n        return\\n      }\\n\\n      if (!data) {\\n        data = new Tooltip(this, _config)\\n        $(this).data(DATA_KEY, data)\\n      }\\n\\n      if (typeof config === 'string') {\\n        if (typeof data[config] === 'undefined') {\\n          throw new TypeError(`No method named \\\"${config}\\\"`)\\n        }\\n        data[config]()\\n      }\\n    })\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME] = Tooltip._jQueryInterface\\n$.fn[NAME].Constructor = Tooltip\\n$.fn[NAME].noConflict = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Tooltip._jQueryInterface\\n}\\n\\nexport default Tooltip\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): popover.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\nimport Tooltip from './tooltip'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME                = 'popover'\\nconst VERSION             = '4.3.1'\\nconst DATA_KEY            = 'bs.popover'\\nconst EVENT_KEY           = `.${DATA_KEY}`\\nconst JQUERY_NO_CONFLICT  = $.fn[NAME]\\nconst CLASS_PREFIX        = 'bs-popover'\\nconst BSCLS_PREFIX_REGEX  = new RegExp(`(^|\\\\\\\\s)${CLASS_PREFIX}\\\\\\\\S+`, 'g')\\n\\nconst Default = {\\n  ...Tooltip.Default,\\n  placement : 'right',\\n  trigger   : 'click',\\n  content   : '',\\n  template  : '<div class=\\\"popover\\\" role=\\\"tooltip\\\">' +\\n              '<div class=\\\"arrow\\\"></div>' +\\n              '<h3 class=\\\"popover-header\\\"></h3>' +\\n              '<div class=\\\"popover-body\\\"></div></div>'\\n}\\n\\nconst DefaultType = {\\n  ...Tooltip.DefaultType,\\n  content : '(string|element|function)'\\n}\\n\\nconst ClassName = {\\n  FADE : 'fade',\\n  SHOW : 'show'\\n}\\n\\nconst Selector = {\\n  TITLE   : '.popover-header',\\n  CONTENT : '.popover-body'\\n}\\n\\nconst Event = {\\n  HIDE       : `hide${EVENT_KEY}`,\\n  HIDDEN     : `hidden${EVENT_KEY}`,\\n  SHOW       : `show${EVENT_KEY}`,\\n  SHOWN      : `shown${EVENT_KEY}`,\\n  INSERTED   : `inserted${EVENT_KEY}`,\\n  CLICK      : `click${EVENT_KEY}`,\\n  FOCUSIN    : `focusin${EVENT_KEY}`,\\n  FOCUSOUT   : `focusout${EVENT_KEY}`,\\n  MOUSEENTER : `mouseenter${EVENT_KEY}`,\\n  MOUSELEAVE : `mouseleave${EVENT_KEY}`\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass Popover extends Tooltip {\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  static get Default() {\\n    return Default\\n  }\\n\\n  static get NAME() {\\n    return NAME\\n  }\\n\\n  static get DATA_KEY() {\\n    return DATA_KEY\\n  }\\n\\n  static get Event() {\\n    return Event\\n  }\\n\\n  static get EVENT_KEY() {\\n    return EVENT_KEY\\n  }\\n\\n  static get DefaultType() {\\n    return DefaultType\\n  }\\n\\n  // Overrides\\n\\n  isWithContent() {\\n    return this.getTitle() || this._getContent()\\n  }\\n\\n  addAttachmentClass(attachment) {\\n    $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)\\n  }\\n\\n  getTipElement() {\\n    this.tip = this.tip || $(this.config.template)[0]\\n    return this.tip\\n  }\\n\\n  setContent() {\\n    const $tip = $(this.getTipElement())\\n\\n    // We use append for html objects to maintain js events\\n    this.setElementContent($tip.find(Selector.TITLE), this.getTitle())\\n    let content = this._getContent()\\n    if (typeof content === 'function') {\\n      content = content.call(this.element)\\n    }\\n    this.setElementContent($tip.find(Selector.CONTENT), content)\\n\\n    $tip.removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)\\n  }\\n\\n  // Private\\n\\n  _getContent() {\\n    return this.element.getAttribute('data-content') ||\\n      this.config.content\\n  }\\n\\n  _cleanTipClass() {\\n    const $tip = $(this.getTipElement())\\n    const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)\\n    if (tabClass !== null && tabClass.length > 0) {\\n      $tip.removeClass(tabClass.join(''))\\n    }\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      let data = $(this).data(DATA_KEY)\\n      const _config = typeof config === 'object' ? config : null\\n\\n      if (!data && /dispose|hide/.test(config)) {\\n        return\\n      }\\n\\n      if (!data) {\\n        data = new Popover(this, _config)\\n        $(this).data(DATA_KEY, data)\\n      }\\n\\n      if (typeof config === 'string') {\\n        if (typeof data[config] === 'undefined') {\\n          throw new TypeError(`No method named \\\"${config}\\\"`)\\n        }\\n        data[config]()\\n      }\\n    })\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME] = Popover._jQueryInterface\\n$.fn[NAME].Constructor = Popover\\n$.fn[NAME].noConflict = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Popover._jQueryInterface\\n}\\n\\nexport default Popover\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): scrollspy.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\nimport Util from './util'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME               = 'scrollspy'\\nconst VERSION            = '4.3.1'\\nconst DATA_KEY           = 'bs.scrollspy'\\nconst EVENT_KEY          = `.${DATA_KEY}`\\nconst DATA_API_KEY       = '.data-api'\\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\\n\\nconst Default = {\\n  offset : 10,\\n  method : 'auto',\\n  target : ''\\n}\\n\\nconst DefaultType = {\\n  offset : 'number',\\n  method : 'string',\\n  target : '(string|element)'\\n}\\n\\nconst Event = {\\n  ACTIVATE      : `activate${EVENT_KEY}`,\\n  SCROLL        : `scroll${EVENT_KEY}`,\\n  LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`\\n}\\n\\nconst ClassName = {\\n  DROPDOWN_ITEM : 'dropdown-item',\\n  DROPDOWN_MENU : 'dropdown-menu',\\n  ACTIVE        : 'active'\\n}\\n\\nconst Selector = {\\n  DATA_SPY        : '[data-spy=\\\"scroll\\\"]',\\n  ACTIVE          : '.active',\\n  NAV_LIST_GROUP  : '.nav, .list-group',\\n  NAV_LINKS       : '.nav-link',\\n  NAV_ITEMS       : '.nav-item',\\n  LIST_ITEMS      : '.list-group-item',\\n  DROPDOWN        : '.dropdown',\\n  DROPDOWN_ITEMS  : '.dropdown-item',\\n  DROPDOWN_TOGGLE : '.dropdown-toggle'\\n}\\n\\nconst OffsetMethod = {\\n  OFFSET   : 'offset',\\n  POSITION : 'position'\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass ScrollSpy {\\n  constructor(element, config) {\\n    this._element       = element\\n    this._scrollElement = element.tagName === 'BODY' ? window : element\\n    this._config        = this._getConfig(config)\\n    this._selector      = `${this._config.target} ${Selector.NAV_LINKS},` +\\n                          `${this._config.target} ${Selector.LIST_ITEMS},` +\\n                          `${this._config.target} ${Selector.DROPDOWN_ITEMS}`\\n    this._offsets       = []\\n    this._targets       = []\\n    this._activeTarget  = null\\n    this._scrollHeight  = 0\\n\\n    $(this._scrollElement).on(Event.SCROLL, (event) => this._process(event))\\n\\n    this.refresh()\\n    this._process()\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  static get Default() {\\n    return Default\\n  }\\n\\n  // Public\\n\\n  refresh() {\\n    const autoMethod = this._scrollElement === this._scrollElement.window\\n      ? OffsetMethod.OFFSET : OffsetMethod.POSITION\\n\\n    const offsetMethod = this._config.method === 'auto'\\n      ? autoMethod : this._config.method\\n\\n    const offsetBase = offsetMethod === OffsetMethod.POSITION\\n      ? this._getScrollTop() : 0\\n\\n    this._offsets = []\\n    this._targets = []\\n\\n    this._scrollHeight = this._getScrollHeight()\\n\\n    const targets = [].slice.call(document.querySelectorAll(this._selector))\\n\\n    targets\\n      .map((element) => {\\n        let target\\n        const targetSelector = Util.getSelectorFromElement(element)\\n\\n        if (targetSelector) {\\n          target = document.querySelector(targetSelector)\\n        }\\n\\n        if (target) {\\n          const targetBCR = target.getBoundingClientRect()\\n          if (targetBCR.width || targetBCR.height) {\\n            // TODO (fat): remove sketch reliance on jQuery position/offset\\n            return [\\n              $(target)[offsetMethod]().top + offsetBase,\\n              targetSelector\\n            ]\\n          }\\n        }\\n        return null\\n      })\\n      .filter((item) => item)\\n      .sort((a, b) => a[0] - b[0])\\n      .forEach((item) => {\\n        this._offsets.push(item[0])\\n        this._targets.push(item[1])\\n      })\\n  }\\n\\n  dispose() {\\n    $.removeData(this._element, DATA_KEY)\\n    $(this._scrollElement).off(EVENT_KEY)\\n\\n    this._element       = null\\n    this._scrollElement = null\\n    this._config        = null\\n    this._selector      = null\\n    this._offsets       = null\\n    this._targets       = null\\n    this._activeTarget  = null\\n    this._scrollHeight  = null\\n  }\\n\\n  // Private\\n\\n  _getConfig(config) {\\n    config = {\\n      ...Default,\\n      ...typeof config === 'object' && config ? config : {}\\n    }\\n\\n    if (typeof config.target !== 'string') {\\n      let id = $(config.target).attr('id')\\n      if (!id) {\\n        id = Util.getUID(NAME)\\n        $(config.target).attr('id', id)\\n      }\\n      config.target = `#${id}`\\n    }\\n\\n    Util.typeCheckConfig(NAME, config, DefaultType)\\n\\n    return config\\n  }\\n\\n  _getScrollTop() {\\n    return this._scrollElement === window\\n      ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop\\n  }\\n\\n  _getScrollHeight() {\\n    return this._scrollElement.scrollHeight || Math.max(\\n      document.body.scrollHeight,\\n      document.documentElement.scrollHeight\\n    )\\n  }\\n\\n  _getOffsetHeight() {\\n    return this._scrollElement === window\\n      ? window.innerHeight : this._scrollElement.getBoundingClientRect().height\\n  }\\n\\n  _process() {\\n    const scrollTop    = this._getScrollTop() + this._config.offset\\n    const scrollHeight = this._getScrollHeight()\\n    const maxScroll    = this._config.offset +\\n      scrollHeight -\\n      this._getOffsetHeight()\\n\\n    if (this._scrollHeight !== scrollHeight) {\\n      this.refresh()\\n    }\\n\\n    if (scrollTop >= maxScroll) {\\n      const target = this._targets[this._targets.length - 1]\\n\\n      if (this._activeTarget !== target) {\\n        this._activate(target)\\n      }\\n      return\\n    }\\n\\n    if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\\n      this._activeTarget = null\\n      this._clear()\\n      return\\n    }\\n\\n    const offsetLength = this._offsets.length\\n    for (let i = offsetLength; i--;) {\\n      const isActiveTarget = this._activeTarget !== this._targets[i] &&\\n          scrollTop >= this._offsets[i] &&\\n          (typeof this._offsets[i + 1] === 'undefined' ||\\n              scrollTop < this._offsets[i + 1])\\n\\n      if (isActiveTarget) {\\n        this._activate(this._targets[i])\\n      }\\n    }\\n  }\\n\\n  _activate(target) {\\n    this._activeTarget = target\\n\\n    this._clear()\\n\\n    const queries = this._selector\\n      .split(',')\\n      .map((selector) => `${selector}[data-target=\\\"${target}\\\"],${selector}[href=\\\"${target}\\\"]`)\\n\\n    const $link = $([].slice.call(document.querySelectorAll(queries.join(','))))\\n\\n    if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {\\n      $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE)\\n      $link.addClass(ClassName.ACTIVE)\\n    } else {\\n      // Set triggered link as active\\n      $link.addClass(ClassName.ACTIVE)\\n      // Set triggered links parents as active\\n      // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\\n      $link.parents(Selector.NAV_LIST_GROUP).prev(`${Selector.NAV_LINKS}, ${Selector.LIST_ITEMS}`).addClass(ClassName.ACTIVE)\\n      // Handle special case when .nav-link is inside .nav-item\\n      $link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_ITEMS).children(Selector.NAV_LINKS).addClass(ClassName.ACTIVE)\\n    }\\n\\n    $(this._scrollElement).trigger(Event.ACTIVATE, {\\n      relatedTarget: target\\n    })\\n  }\\n\\n  _clear() {\\n    [].slice.call(document.querySelectorAll(this._selector))\\n      .filter((node) => node.classList.contains(ClassName.ACTIVE))\\n      .forEach((node) => node.classList.remove(ClassName.ACTIVE))\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      let data = $(this).data(DATA_KEY)\\n      const _config = typeof config === 'object' && config\\n\\n      if (!data) {\\n        data = new ScrollSpy(this, _config)\\n        $(this).data(DATA_KEY, data)\\n      }\\n\\n      if (typeof config === 'string') {\\n        if (typeof data[config] === 'undefined') {\\n          throw new TypeError(`No method named \\\"${config}\\\"`)\\n        }\\n        data[config]()\\n      }\\n    })\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Data Api implementation\\n * ------------------------------------------------------------------------\\n */\\n\\n$(window).on(Event.LOAD_DATA_API, () => {\\n  const scrollSpys = [].slice.call(document.querySelectorAll(Selector.DATA_SPY))\\n  const scrollSpysLength = scrollSpys.length\\n\\n  for (let i = scrollSpysLength; i--;) {\\n    const $spy = $(scrollSpys[i])\\n    ScrollSpy._jQueryInterface.call($spy, $spy.data())\\n  }\\n})\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME] = ScrollSpy._jQueryInterface\\n$.fn[NAME].Constructor = ScrollSpy\\n$.fn[NAME].noConflict = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return ScrollSpy._jQueryInterface\\n}\\n\\nexport default ScrollSpy\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): tab.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\nimport Util from './util'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME               = 'tab'\\nconst VERSION            = '4.3.1'\\nconst DATA_KEY           = 'bs.tab'\\nconst EVENT_KEY          = `.${DATA_KEY}`\\nconst DATA_API_KEY       = '.data-api'\\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\\n\\nconst Event = {\\n  HIDE           : `hide${EVENT_KEY}`,\\n  HIDDEN         : `hidden${EVENT_KEY}`,\\n  SHOW           : `show${EVENT_KEY}`,\\n  SHOWN          : `shown${EVENT_KEY}`,\\n  CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\\n}\\n\\nconst ClassName = {\\n  DROPDOWN_MENU : 'dropdown-menu',\\n  ACTIVE        : 'active',\\n  DISABLED      : 'disabled',\\n  FADE          : 'fade',\\n  SHOW          : 'show'\\n}\\n\\nconst Selector = {\\n  DROPDOWN              : '.dropdown',\\n  NAV_LIST_GROUP        : '.nav, .list-group',\\n  ACTIVE                : '.active',\\n  ACTIVE_UL             : '> li > .active',\\n  DATA_TOGGLE           : '[data-toggle=\\\"tab\\\"], [data-toggle=\\\"pill\\\"], [data-toggle=\\\"list\\\"]',\\n  DROPDOWN_TOGGLE       : '.dropdown-toggle',\\n  DROPDOWN_ACTIVE_CHILD : '> .dropdown-menu .active'\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass Tab {\\n  constructor(element) {\\n    this._element = element\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  // Public\\n\\n  show() {\\n    if (this._element.parentNode &&\\n        this._element.parentNode.nodeType === Node.ELEMENT_NODE &&\\n        $(this._element).hasClass(ClassName.ACTIVE) ||\\n        $(this._element).hasClass(ClassName.DISABLED)) {\\n      return\\n    }\\n\\n    let target\\n    let previous\\n    const listElement = $(this._element).closest(Selector.NAV_LIST_GROUP)[0]\\n    const selector = Util.getSelectorFromElement(this._element)\\n\\n    if (listElement) {\\n      const itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? Selector.ACTIVE_UL : Selector.ACTIVE\\n      previous = $.makeArray($(listElement).find(itemSelector))\\n      previous = previous[previous.length - 1]\\n    }\\n\\n    const hideEvent = $.Event(Event.HIDE, {\\n      relatedTarget: this._element\\n    })\\n\\n    const showEvent = $.Event(Event.SHOW, {\\n      relatedTarget: previous\\n    })\\n\\n    if (previous) {\\n      $(previous).trigger(hideEvent)\\n    }\\n\\n    $(this._element).trigger(showEvent)\\n\\n    if (showEvent.isDefaultPrevented() ||\\n        hideEvent.isDefaultPrevented()) {\\n      return\\n    }\\n\\n    if (selector) {\\n      target = document.querySelector(selector)\\n    }\\n\\n    this._activate(\\n      this._element,\\n      listElement\\n    )\\n\\n    const complete = () => {\\n      const hiddenEvent = $.Event(Event.HIDDEN, {\\n        relatedTarget: this._element\\n      })\\n\\n      const shownEvent = $.Event(Event.SHOWN, {\\n        relatedTarget: previous\\n      })\\n\\n      $(previous).trigger(hiddenEvent)\\n      $(this._element).trigger(shownEvent)\\n    }\\n\\n    if (target) {\\n      this._activate(target, target.parentNode, complete)\\n    } else {\\n      complete()\\n    }\\n  }\\n\\n  dispose() {\\n    $.removeData(this._element, DATA_KEY)\\n    this._element = null\\n  }\\n\\n  // Private\\n\\n  _activate(element, container, callback) {\\n    const activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL')\\n      ? $(container).find(Selector.ACTIVE_UL)\\n      : $(container).children(Selector.ACTIVE)\\n\\n    const active = activeElements[0]\\n    const isTransitioning = callback && (active && $(active).hasClass(ClassName.FADE))\\n    const complete = () => this._transitionComplete(\\n      element,\\n      active,\\n      callback\\n    )\\n\\n    if (active && isTransitioning) {\\n      const transitionDuration = Util.getTransitionDurationFromElement(active)\\n\\n      $(active)\\n        .removeClass(ClassName.SHOW)\\n        .one(Util.TRANSITION_END, complete)\\n        .emulateTransitionEnd(transitionDuration)\\n    } else {\\n      complete()\\n    }\\n  }\\n\\n  _transitionComplete(element, active, callback) {\\n    if (active) {\\n      $(active).removeClass(ClassName.ACTIVE)\\n\\n      const dropdownChild = $(active.parentNode).find(\\n        Selector.DROPDOWN_ACTIVE_CHILD\\n      )[0]\\n\\n      if (dropdownChild) {\\n        $(dropdownChild).removeClass(ClassName.ACTIVE)\\n      }\\n\\n      if (active.getAttribute('role') === 'tab') {\\n        active.setAttribute('aria-selected', false)\\n      }\\n    }\\n\\n    $(element).addClass(ClassName.ACTIVE)\\n    if (element.getAttribute('role') === 'tab') {\\n      element.setAttribute('aria-selected', true)\\n    }\\n\\n    Util.reflow(element)\\n\\n    if (element.classList.contains(ClassName.FADE)) {\\n      element.classList.add(ClassName.SHOW)\\n    }\\n\\n    if (element.parentNode && $(element.parentNode).hasClass(ClassName.DROPDOWN_MENU)) {\\n      const dropdownElement = $(element).closest(Selector.DROPDOWN)[0]\\n\\n      if (dropdownElement) {\\n        const dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(Selector.DROPDOWN_TOGGLE))\\n\\n        $(dropdownToggleList).addClass(ClassName.ACTIVE)\\n      }\\n\\n      element.setAttribute('aria-expanded', true)\\n    }\\n\\n    if (callback) {\\n      callback()\\n    }\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      const $this = $(this)\\n      let data = $this.data(DATA_KEY)\\n\\n      if (!data) {\\n        data = new Tab(this)\\n        $this.data(DATA_KEY, data)\\n      }\\n\\n      if (typeof config === 'string') {\\n        if (typeof data[config] === 'undefined') {\\n          throw new TypeError(`No method named \\\"${config}\\\"`)\\n        }\\n        data[config]()\\n      }\\n    })\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Data Api implementation\\n * ------------------------------------------------------------------------\\n */\\n\\n$(document)\\n  .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\\n    event.preventDefault()\\n    Tab._jQueryInterface.call($(this), 'show')\\n  })\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME] = Tab._jQueryInterface\\n$.fn[NAME].Constructor = Tab\\n$.fn[NAME].noConflict = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Tab._jQueryInterface\\n}\\n\\nexport default Tab\\n\",\"/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): toast.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\nimport $ from 'jquery'\\nimport Util from './util'\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Constants\\n * ------------------------------------------------------------------------\\n */\\n\\nconst NAME               = 'toast'\\nconst VERSION            = '4.3.1'\\nconst DATA_KEY           = 'bs.toast'\\nconst EVENT_KEY          = `.${DATA_KEY}`\\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\\n\\nconst Event = {\\n  CLICK_DISMISS : `click.dismiss${EVENT_KEY}`,\\n  HIDE          : `hide${EVENT_KEY}`,\\n  HIDDEN        : `hidden${EVENT_KEY}`,\\n  SHOW          : `show${EVENT_KEY}`,\\n  SHOWN         : `shown${EVENT_KEY}`\\n}\\n\\nconst ClassName = {\\n  FADE    : 'fade',\\n  HIDE    : 'hide',\\n  SHOW    : 'show',\\n  SHOWING : 'showing'\\n}\\n\\nconst DefaultType = {\\n  animation : 'boolean',\\n  autohide  : 'boolean',\\n  delay     : 'number'\\n}\\n\\nconst Default = {\\n  animation : true,\\n  autohide  : true,\\n  delay     : 500\\n}\\n\\nconst Selector = {\\n  DATA_DISMISS : '[data-dismiss=\\\"toast\\\"]'\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * Class Definition\\n * ------------------------------------------------------------------------\\n */\\n\\nclass Toast {\\n  constructor(element, config) {\\n    this._element = element\\n    this._config  = this._getConfig(config)\\n    this._timeout = null\\n    this._setListeners()\\n  }\\n\\n  // Getters\\n\\n  static get VERSION() {\\n    return VERSION\\n  }\\n\\n  static get DefaultType() {\\n    return DefaultType\\n  }\\n\\n  static get Default() {\\n    return Default\\n  }\\n\\n  // Public\\n\\n  show() {\\n    $(this._element).trigger(Event.SHOW)\\n\\n    if (this._config.animation) {\\n      this._element.classList.add(ClassName.FADE)\\n    }\\n\\n    const complete = () => {\\n      this._element.classList.remove(ClassName.SHOWING)\\n      this._element.classList.add(ClassName.SHOW)\\n\\n      $(this._element).trigger(Event.SHOWN)\\n\\n      if (this._config.autohide) {\\n        this.hide()\\n      }\\n    }\\n\\n    this._element.classList.remove(ClassName.HIDE)\\n    this._element.classList.add(ClassName.SHOWING)\\n    if (this._config.animation) {\\n      const transitionDuration = Util.getTransitionDurationFromElement(this._element)\\n\\n      $(this._element)\\n        .one(Util.TRANSITION_END, complete)\\n        .emulateTransitionEnd(transitionDuration)\\n    } else {\\n      complete()\\n    }\\n  }\\n\\n  hide(withoutTimeout) {\\n    if (!this._element.classList.contains(ClassName.SHOW)) {\\n      return\\n    }\\n\\n    $(this._element).trigger(Event.HIDE)\\n\\n    if (withoutTimeout) {\\n      this._close()\\n    } else {\\n      this._timeout = setTimeout(() => {\\n        this._close()\\n      }, this._config.delay)\\n    }\\n  }\\n\\n  dispose() {\\n    clearTimeout(this._timeout)\\n    this._timeout = null\\n\\n    if (this._element.classList.contains(ClassName.SHOW)) {\\n      this._element.classList.remove(ClassName.SHOW)\\n    }\\n\\n    $(this._element).off(Event.CLICK_DISMISS)\\n\\n    $.removeData(this._element, DATA_KEY)\\n    this._element = null\\n    this._config  = null\\n  }\\n\\n  // Private\\n\\n  _getConfig(config) {\\n    config = {\\n      ...Default,\\n      ...$(this._element).data(),\\n      ...typeof config === 'object' && config ? config : {}\\n    }\\n\\n    Util.typeCheckConfig(\\n      NAME,\\n      config,\\n      this.constructor.DefaultType\\n    )\\n\\n    return config\\n  }\\n\\n  _setListeners() {\\n    $(this._element).on(\\n      Event.CLICK_DISMISS,\\n      Selector.DATA_DISMISS,\\n      () => this.hide(true)\\n    )\\n  }\\n\\n  _close() {\\n    const complete = () => {\\n      this._element.classList.add(ClassName.HIDE)\\n      $(this._element).trigger(Event.HIDDEN)\\n    }\\n\\n    this._element.classList.remove(ClassName.SHOW)\\n    if (this._config.animation) {\\n      const transitionDuration = Util.getTransitionDurationFromElement(this._element)\\n\\n      $(this._element)\\n        .one(Util.TRANSITION_END, complete)\\n        .emulateTransitionEnd(transitionDuration)\\n    } else {\\n      complete()\\n    }\\n  }\\n\\n  // Static\\n\\n  static _jQueryInterface(config) {\\n    return this.each(function () {\\n      const $element = $(this)\\n      let data       = $element.data(DATA_KEY)\\n      const _config  = typeof config === 'object' && config\\n\\n      if (!data) {\\n        data = new Toast(this, _config)\\n        $element.data(DATA_KEY, data)\\n      }\\n\\n      if (typeof config === 'string') {\\n        if (typeof data[config] === 'undefined') {\\n          throw new TypeError(`No method named \\\"${config}\\\"`)\\n        }\\n\\n        data[config](this)\\n      }\\n    })\\n  }\\n}\\n\\n/**\\n * ------------------------------------------------------------------------\\n * jQuery\\n * ------------------------------------------------------------------------\\n */\\n\\n$.fn[NAME]             = Toast._jQueryInterface\\n$.fn[NAME].Constructor = Toast\\n$.fn[NAME].noConflict  = () => {\\n  $.fn[NAME] = JQUERY_NO_CONFLICT\\n  return Toast._jQueryInterface\\n}\\n\\nexport default Toast\\n\",\"import $ from 'jquery'\\nimport Alert from './alert'\\nimport Button from './button'\\nimport Carousel from './carousel'\\nimport Collapse from './collapse'\\nimport Dropdown from './dropdown'\\nimport Modal from './modal'\\nimport Popover from './popover'\\nimport Scrollspy from './scrollspy'\\nimport Tab from './tab'\\nimport Toast from './toast'\\nimport Tooltip from './tooltip'\\nimport Util from './util'\\n\\n/**\\n * --------------------------------------------------------------------------\\n * Bootstrap (v4.3.1): index.js\\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\\n * --------------------------------------------------------------------------\\n */\\n\\n(() => {\\n  if (typeof $ === 'undefined') {\\n    throw new TypeError('Bootstrap\\\\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\\\\'s JavaScript.')\\n  }\\n\\n  const version = $.fn.jquery.split(' ')[0].split('.')\\n  const minMajor = 1\\n  const ltMajor = 2\\n  const minMinor = 9\\n  const minPatch = 1\\n  const maxMajor = 4\\n\\n  if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {\\n    throw new Error('Bootstrap\\\\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0')\\n  }\\n})()\\n\\nexport {\\n  Util,\\n  Alert,\\n  Button,\\n  Carousel,\\n  Collapse,\\n  Dropdown,\\n  Modal,\\n  Popover,\\n  Scrollspy,\\n  Tab,\\n  Toast,\\n  Tooltip\\n}\\n\"]}"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bpmnjs/assets/bpmn-font/css/bpmn-codes.css",
    "content": "\n.bpmn-icon-trash:before { content: '\\e801'; } /* '' */\n.bpmn-icon-gateway-parallel:before { content: '\\e804'; } /* '' */\n.bpmn-icon-intermediate-event-catch-cancel:before { content: '\\e805'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-message:before { content: '\\e806'; } /* '' */\n.bpmn-icon-start-event-compensation:before { content: '\\e807'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-parallel-multiple:before { content: '\\e808'; } /* '' */\n.bpmn-icon-loop-marker:before { content: '\\e809'; } /* '' */\n.bpmn-icon-parallel-mi-marker:before { content: '\\e80a'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-signal:before { content: '\\e80b'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-timer:before { content: '\\e80c'; } /* '' */\n.bpmn-icon-intermediate-event-catch-parallel-multiple:before { content: '\\e80d'; } /* '' */\n.bpmn-icon-intermediate-event-catch-compensation:before { content: '\\e80e'; } /* '' */\n.bpmn-icon-gateway-xor:before { content: '\\e80f'; } /* '' */\n.bpmn-icon-end-event-cancel:before { content: '\\e811'; } /* '' */\n.bpmn-icon-intermediate-event-catch-condition:before { content: '\\e812'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-parallel-multiple:before { content: '\\e813'; } /* '' */\n.bpmn-icon-start-event-condition:before { content: '\\e814'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-timer:before { content: '\\e815'; } /* '' */\n.bpmn-icon-sequential-mi-marker:before { content: '\\e816'; } /* '' */\n.bpmn-icon-user-task:before { content: '\\e817'; } /* '' */\n.bpmn-icon-business-rule:before { content: '\\e818'; } /* '' */\n.bpmn-icon-sub-process-marker:before { content: '\\e819'; } /* '' */\n.bpmn-icon-start-event-parallel-multiple:before { content: '\\e81a'; } /* '' */\n.bpmn-icon-start-event-error:before { content: '\\e81b'; } /* '' */\n.bpmn-icon-intermediate-event-catch-signal:before { content: '\\e81c'; } /* '' */\n.bpmn-icon-intermediate-event-catch-error:before { content: '\\e81d'; } /* '' */\n.bpmn-icon-end-event-compensation:before { content: '\\e81e'; } /* '' */\n.bpmn-icon-subprocess-collapsed:before { content: '\\e81f'; } /* '' */\n.bpmn-icon-subprocess-expanded:before { content: '\\e820'; } /* '' */\n.bpmn-icon-task:before { content: '\\e821'; } /* '' */\n.bpmn-icon-end-event-error:before { content: '\\e822'; } /* '' */\n.bpmn-icon-intermediate-event-catch-escalation:before { content: '\\e823'; } /* '' */\n.bpmn-icon-intermediate-event-catch-timer:before { content: '\\e824'; } /* '' */\n.bpmn-icon-start-event-escalation:before { content: '\\e825'; } /* '' */\n.bpmn-icon-start-event-signal:before { content: '\\e826'; } /* '' */\n.bpmn-icon-business-rule-task:before { content: '\\e827'; } /* '' */\n.bpmn-icon-manual:before { content: '\\e828'; } /* '' */\n.bpmn-icon-receive:before { content: '\\e829'; } /* '' */\n.bpmn-icon-call-activity:before { content: '\\e82a'; } /* '' */\n.bpmn-icon-start-event-timer:before { content: '\\e82b'; } /* '' */\n.bpmn-icon-start-event-message:before { content: '\\e82c'; } /* '' */\n.bpmn-icon-intermediate-event-none:before { content: '\\e82d'; } /* '' */\n.bpmn-icon-intermediate-event-catch-link:before { content: '\\e82e'; } /* '' */\n.bpmn-icon-end-event-escalation:before { content: '\\e82f'; } /* '' */\n.bpmn-icon-bpmn-io:before { content: '\\e831'; } /* '' */\n.bpmn-icon-gateway-complex:before { content: '\\e832'; } /* '' */\n.bpmn-icon-gateway-eventbased:before { content: '\\e833'; } /* '' */\n.bpmn-icon-gateway-none:before { content: '\\e834'; } /* '' */\n.bpmn-icon-gateway-or:before { content: '\\e835'; } /* '' */\n.bpmn-icon-end-event-terminate:before { content: '\\e836'; } /* '' */\n.bpmn-icon-end-event-signal:before { content: '\\e837'; } /* '' */\n.bpmn-icon-end-event-none:before { content: '\\e838'; } /* '' */\n.bpmn-icon-end-event-multiple:before { content: '\\e839'; } /* '' */\n.bpmn-icon-end-event-message:before { content: '\\e83a'; } /* '' */\n.bpmn-icon-end-event-link:before { content: '\\e83b'; } /* '' */\n.bpmn-icon-intermediate-event-catch-message:before { content: '\\e83c'; } /* '' */\n.bpmn-icon-intermediate-event-throw-compensation:before { content: '\\e83d'; } /* '' */\n.bpmn-icon-start-event-multiple:before { content: '\\e83e'; } /* '' */\n.bpmn-icon-script:before { content: '\\e83f'; } /* '' */\n.bpmn-icon-manual-task:before { content: '\\e840'; } /* '' */\n.bpmn-icon-send:before { content: '\\e841'; } /* '' */\n.bpmn-icon-service:before { content: '\\e842'; } /* '' */\n.bpmn-icon-receive-task:before { content: '\\e843'; } /* '' */\n.bpmn-icon-user:before { content: '\\e844'; } /* '' */\n.bpmn-icon-start-event-none:before { content: '\\e845'; } /* '' */\n.bpmn-icon-intermediate-event-throw-escalation:before { content: '\\e846'; } /* '' */\n.bpmn-icon-intermediate-event-catch-multiple:before { content: '\\e847'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-escalation:before { content: '\\e848'; } /* '' */\n.bpmn-icon-intermediate-event-throw-link:before { content: '\\e849'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-condition:before { content: '\\e84a'; } /* '' */\n.bpmn-icon-data-object:before { content: '\\e84b'; } /* '' */\n.bpmn-icon-script-task:before { content: '\\e84c'; } /* '' */\n.bpmn-icon-send-task:before { content: '\\e84d'; } /* '' */\n.bpmn-icon-data-store:before { content: '\\e84e'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-escalation:before { content: '\\e84f'; } /* '' */\n.bpmn-icon-intermediate-event-throw-message:before { content: '\\e850'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-multiple:before { content: '\\e851'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-signal:before { content: '\\e852'; } /* '' */\n.bpmn-icon-intermediate-event-throw-multiple:before { content: '\\e853'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-message:before { content: '\\e854'; } /* '' */\n.bpmn-icon-ad-hoc-marker:before { content: '\\e855'; } /* '' */\n.bpmn-icon-service-task:before { content: '\\e856'; } /* '' */\n.bpmn-icon-task-none:before { content: '\\e857'; } /* '' */\n.bpmn-icon-compensation-marker:before { content: '\\e858'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-multiple:before { content: '\\e859'; } /* '' */\n.bpmn-icon-intermediate-event-throw-signal:before { content: '\\e85a'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-condition:before { content: '\\e85b'; } /* '' */\n.bpmn-icon-participant:before { content: '\\e85c'; } /* '' */\n.bpmn-icon-event-subprocess-expanded:before { content: '\\e85d'; } /* '' */\n.bpmn-icon-lane-insert-below:before { content: '\\e85e'; } /* '' */\n.bpmn-icon-space-tool:before { content: '\\e85f'; } /* '' */\n.bpmn-icon-connection-multi:before { content: '\\e860'; } /* '' */\n.bpmn-icon-lane:before { content: '\\e861'; } /* '' */\n.bpmn-icon-lasso-tool:before { content: '\\e862'; } /* '' */\n.bpmn-icon-lane-insert-above:before { content: '\\e863'; } /* '' */\n.bpmn-icon-lane-divide-three:before { content: '\\e864'; } /* '' */\n.bpmn-icon-lane-divide-two:before { content: '\\e865'; } /* '' */\n.bpmn-icon-data-input:before { content: '\\e866'; } /* '' */\n.bpmn-icon-data-output:before { content: '\\e867'; } /* '' */\n.bpmn-icon-hand-tool:before { content: '\\e868'; } /* '' */\n.bpmn-icon-group:before { content: '\\e869'; } /* '' */\n.bpmn-icon-text-annotation:before { content: '\\e86b'; } /* '' */\n.bpmn-icon-transaction:before { content: '\\e8c4'; } /* '' */\n.bpmn-icon-screw-wrench:before { content: '\\e8db'; } /* '' */\n.bpmn-icon-connection:before { content: '\\e8dc'; } /* '' */\n.bpmn-icon-conditional-flow:before { content: '\\e8e0'; } /* '' */\n.bpmn-icon-default-flow:before { content: '\\e8e1'; } /* '' */\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bpmnjs/assets/bpmn-font/css/bpmn-embedded.css",
    "content": "@font-face {\n  font-family: 'bpmn';\n  src: url('../font/bpmn.eot?16406289');\n  src: url('../font/bpmn.eot?16406289#iefix') format('embedded-opentype'),\n       url('../font/bpmn.svg?16406289#bpmn') format('svg');\n  font-weight: normal;\n  font-style: normal;\n}\n@font-face {\n  font-family: 'bpmn';\n  src: url('data:application/octet-stream;base64,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') format('woff'),\n       url('data:application/octet-stream;base64,AAEAAAALAIAAAwAwR1NVQiCLJXoAAAE4AAAAVE9TLzI+JEs0AAABjAAAAGBjbWFwU3WX+AAAA5wAAAd0Z2x5Zrkw+hQAAAvsAACh7GhlYWQjByJvAAAA4AAAADZoaGVhBzwDvwAAALwAAAAkaG10eKXgAAAAAAHsAAABsGxvY2HvU9ESAAALEAAAANptYXhwAZYEdgAAARgAAAAgbmFtZXo4dZUAAK3YAAACPXBvc3QQ+Ny7AACwGAAACigAAQAAA1L/agAAA+gAAAAAA+gAAQAAAAAAAAAAAAAAAAAAAGwAAQAAAAEAAO8WNzRfDzz1AAsD6AAAAADf/+9nAAAAAN//72cAAP9qA+gDUgAAAAgAAgAAAAAAAAABAAAAbARqACAAAAAAAAIAAAAKAAoAAAD/AAAAAAAAAAEAAAAKADAAPgACREZMVAAObGF0bgAaAAQAAAAAAAAAAQAAAAQAAAAAAAAAAQAAAAFsaWdhAAgAAAABAAAAAQAEAAQAAAABAAgAAQAGAAAAAQAAAAQD6AGQAAUAAAJ6ArwAAACMAnoCvAAAAeAAMQECAAACAAUDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBmRWQAwOgB6OEDUv9qAFoDrACWAAAAAQAAAAAAAAAAAAAAAAACA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAAAAABQAAAAMAAAAsAAAABAAAAmAAAQAAAAABWgADAAEAAAAsAAMACgAAAmAABAEuAAAAEgAQAAMAAugB6A/oL+hp6GvoxOjc6OH//wAA6AHoBOgR6DHoa+jE6Nvo4P//AAAAAAAAAAAAAAAAAAAAAAABABIAEgAoAGQA1ADUANQA1gAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0APgA/AEAAQQBCAEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgBXAFgAWQBaAFsAXABdAF4AXwBgAGEAYgBjAGQAZQBmAGcAaABpAGoAawAAAQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAFFAAAAAAAAABrAADoAQAA6AEAAAABAADoBAAA6AQAAAACAADoBQAA6AUAAAADAADoBgAA6AYAAAAEAADoBwAA6AcAAAAFAADoCAAA6AgAAAAGAADoCQAA6AkAAAAHAADoCgAA6AoAAAAIAADoCwAA6AsAAAAJAADoDAAA6AwAAAAKAADoDQAA6A0AAAALAADoDgAA6A4AAAAMAADoDwAA6A8AAAANAADoEQAA6BEAAAAOAADoEgAA6BIAAAAPAADoEwAA6BMAAAAQAADoFAAA6BQAAAARAADoFQAA6BUAAAASAADoFgAA6BYAAAATAADoFwAA6BcAAAAUAADoGAAA6BgAAAAVAADoGQAA6BkAAAAWAADoGgAA6BoAAAAXAADoGwAA6BsAAAAYAADoHAAA6BwAAAAZAADoHQAA6B0AAAAaAADoHgAA6B4AAAAbAADoHwAA6B8AAAAcAADoIAAA6CAAAAAdAADoIQAA6CEAAAAeAADoIgAA6CIAAAAfAADoIwAA6CMAAAAgAADoJAAA6CQAAAAhAADoJQAA6CUAAAAiAADoJgAA6CYAAAAjAADoJwAA6CcAAAAkAADoKAAA6CgAAAAlAADoKQAA6CkAAAAmAADoKgAA6CoAAAAnAADoKwAA6CsAAAAoAADoLAAA6CwAAAApAADoLQAA6C0AAAAqAADoLgAA6C4AAAArAADoLwAA6C8AAAAsAADoMQAA6DEAAAAtAADoMgAA6DIAAAAuAADoMwAA6DMAAAAvAADoNAAA6DQAAAAwAADoNQAA6DUAAAAxAADoNgAA6DYAAAAyAADoNwAA6DcAAAAzAADoOAAA6DgAAAA0AADoOQAA6DkAAAA1AADoOgAA6DoAAAA2AADoOwAA6DsAAAA3AADoPAAA6DwAAAA4AADoPQAA6D0AAAA5AADoPgAA6D4AAAA6AADoPwAA6D8AAAA7AADoQAAA6EAAAAA8AADoQQAA6EEAAAA9AADoQgAA6EIAAAA+AADoQwAA6EMAAAA/AADoRAAA6EQAAABAAADoRQAA6EUAAABBAADoRgAA6EYAAABCAADoRwAA6EcAAABDAADoSAAA6EgAAABEAADoSQAA6EkAAABFAADoSgAA6EoAAABGAADoSwAA6EsAAABHAADoTAAA6EwAAABIAADoTQAA6E0AAABJAADoTgAA6E4AAABKAADoTwAA6E8AAABLAADoUAAA6FAAAABMAADoUQAA6FEAAABNAADoUgAA6FIAAABOAADoUwAA6FMAAABPAADoVAAA6FQAAABQAADoVQAA6FUAAABRAADoVgAA6FYAAABSAADoVwAA6FcAAABTAADoWAAA6FgAAABUAADoWQAA6FkAAABVAADoWgAA6FoAAABWAADoWwAA6FsAAABXAADoXAAA6FwAAABYAADoXQAA6F0AAABZAADoXgAA6F4AAABaAADoXwAA6F8AAABbAADoYAAA6GAAAABcAADoYQAA6GEAAABdAADoYgAA6GIAAABeAADoYwAA6GMAAABfAADoZAAA6GQAAABg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EAgEAwICAQQEAwQFDAUNBAUEBQgFJgQJBAQEBAQEAQQDAQMBAwQECAQJBAICAQIGAwQF/kQEBQQGAgIBAgMDBQQBBA0JAQ0BBAUFBAEEBQUKBRkBBAEUBgUFBQsKCQUEBAMEAQIDAwQHEwUEBQUEBQUEJR4IBAQJDAMNAhIFBAUDARQEBAkIFiwFBQQFBQUEBRsEBgQBAQIDAwQEBAkDBgULBQUFBhQBHgUKBQUEAQQBBAUcDQQBBAUDAgECAgMECAH6/sgBODFaPrq6fQHyAQEBAQcCAgQDBAQECQQFBgMCCQIBAQEBAQECBQECAwMIBAUECQMDAwcBAQEBUwECAgQHCQkKAQkHBgcDBAMEAwQHCAcUBA0EBCADAwICAgIDAwgJBQYFBQQBBAEEBRwNBAEIBAEEBAQIAQMBAwEDBAgDAQMEAwEGBAcIAQQEAQMEAwEDDAMBAwEDAQgEBAQBBAQEAQQNFwUFBAEEAQkFCgUMBAUEBAMEAQIFBwweCAQJBBQHCAcEAwQDBAMHBgQDBwUEBAkEBAMEAQICBQwFCQQDBgIBAQEBAQICBwICAwICAgECAwMIBQkIAwUCAQIBAgECAgIJAgEBAScCAwUCBAECDwMCAQIJDAkBCQQDAwEDAwEDCwcHCQkEAwQEAQEEAwwDBAYDAwIDAwMDAwMCAwMCAwIDAgMCAwQDFgMDCAkJBwMEOwECAwMEDQULAgMDAwMDAwIDAwojAwcDBwQOCwMHAwgDAwIBAQMCBAgJBAIECQQEBAQEBQMBAwEDBAEDEAQDAQMIAwEKAQMDAQMDAQMDAQYECQEDAgMDqQEEBAMECAQECQUECQ0EGwUNCQQECQQBBCIEBQEEBAMDAgECAgMECAkFBBIECwQHBAQHBAgEHgQIBAcEBAcEBAkEBAQDBC0BBAgEBAQEHgUKBQUFBQkFJwUEBQkKBDIEBQQIBAYCAgYICgUZAQQBFAYFBQULBiYFBgULBgsGFgYJCAMDBBACBggICQYRBQYFBgsFIQYLBQUKBg8BBAEZBQoBBAYCAQEDAgQICQgBKQQFBQQFBQkFIgUJBQUFBQoFFwUEBwICOQECAwMIBwQHBBoDCwsHBgQDBxQPAwcBCAUEBQgDAwICAgIHAQMVAQMLAQcQBAQMBAQEBAQECQQmBQUIBAQDBKABBAMDBAkJCQYBDAEGDAYFAwMCAQQBBAECBQQCAgEBAQQBAQEGAQEBAgEBAgMHBQQFBAgDAwkCAQYDEAMGAwIDAgMCAwIDBgIDAwMDAwdKAQIBAwYMAwMFAwIBAQEEAwMECQUECAMDAgEBAQECCQICAgECAQIBAQECAgIBAQEEAQEBBQQDBQQFCAgDAgEnAQEDBgQJBQQEBAIFAwQJAQYJAwIBAgMCAQIDBAMKAggBAgECAgMBAgMDCAUECQQDAwMEAgECAQIBAgEQEAYCAwUJAwoBAgICDwIDBQYMFAECAQIBAgECBgIGCQQFBAQEAwMCAQEBAgICAQIBCAwDBAMCAQIDAgECEgEJBAMFBAQEBQkEAwMEAAAABQAA/5YDvQMjABYAMQA6AD4ARAAAASYOAxYXHgI3PgE3Njc2Jy4BJyYHNhcWFxYXFgYHBgcGBwYnJicmJyYnJjc+AhMGDwEXNRcRBycUFSclFBUnJicB9FimgUQBQD07obBRVIYnKQMGHh52Tl5rVlJQOjsXFxcrLERGWlhWWENDJyYDAyMecpQ/Nmwv0crKGI8BWSpDIgMiAUZ+obOmPj9JCR4delFTWFdVU4cmLzEBJiVDRFRPp0hKLzQQDxYWOTZQT1daTklwPv8AJk0hlI+PASiPYGRlZGVlZR4wFwAJAAD/ogO4AyAACwAXAFIAuwFEAaEB6AIyAp4AAAEVIxUzFTM1MzUjNQczFTMVIxUjNSM1MxMrAQcjByMHFQ8FFR8FMz8DMzczNzM3MxczFzMXMx8BMz8DNS8EIzUjJyMnFw8GFR8KMx8GFR8CMx8NMz8ENS8BNScjLwYjLwE1Iy8LIy8BIy8HIzUnNS8EIwUPASMPBBUPBBUHIwcVDwMjFQcVByMVDwQVByMPARUPAhUPAiMPAxUPAxUHFQ8KFQcVHwQ/BDM/BDU/JjUvAwEPBRUXFQcVBxUHFQcVBxUHFQcVBxUHFQcVBxUPBxUfBD8FMz8BMz8BNT8BMzczNzU3NTM1NzU3NTc1NzU3NTc1NzU3NSc1LwQFDwUVFxUXFRczHwUzHwEVFxUXFRcVMxcVFxUfBD8ENS8NNSc1JzUnNS8DAQ8XHwQ/BDM/AzM3MzczNzM3Mzc1NzM3NTczPwIzNzM1PwM1LwQFDwUVHwMVHwEzHwIzHwIVHwEzHwEVHwEzFzMXMxczHwIzFzMXFTMfBzMXFRczFTMXMz8ENS8EIycjJyMnIy8KIy8EIy8FIwGufX2MfX11Xn19Xn19MwcNBg0NBycNDgQDAwQBAgMDCQQFBgwGFwYLBgYGBikGBgYGBgUfBAUMAwMCAgYDCicGBwYNB+kFBAQDAwECAgIGAgIDBgUEAwgBDgIIAgYCBAECAgECAwIDBQQDBAMKBQYDCQQJBAQDBAIEBgEEAwIDAgMCAQIIAQUDBAIEAgIFAgcCAgECCQECAgMHAwIDAgECAwIGAgoF/fMFBwECAwIDAgMCAwIDBAECAgMCBAEEBAECAgICAgIBAgICBAICBAEBAQIDAgIKAQICAgEEAQIBAgECAQICAQQEAw4ECAQDAQECAwECAgIBAgECAQIBAgIDAgECCAIBAgICAQQCBAEGAgoCBgMKAwYDBQMCAQQGCAUCsgQFAwYCAQEBAQEBAQECAQMFAwUDBAMCBgMBAgMGBAkJBAQDAgEBAwIBAgMDAgEFAQwDAQIBAQEBAQEBAQQDBAQI/KYEBQMEBAEBAwIBAwIBBAEKAQQDAgMCAQIDAQIEBwkJBAQDBAIEAgMCBwQBBgECAQIIAQEBAQUICAKxBAQJBAUKBA8FBQsPBgULBSEGCxAIBAUCAgQDBA0JBgYUBQESBgcFAQUBBQEFARwBCwUBBQUBBQsPAQQBAwMCAQQDBAQI/d4EBAQDAgIBAgMEDQIBAgMCAQIDAwsCAQgDAwUBAgECAQIBAgMDAQIBAgECBAMGAw0DHQIDDQQDDQkFCAUCAQQDBAQDBAgDFAIRAwkFEQIGBQMFBQUCAQ8CBQICAQQDBBEEBAUCIX2MfX2MfRd9Xn1+XQGTAQIGAQIEAgMECAkFBAQDBAECAgIEAgEBAQEBBQEGBAMJBQgIAgQGAQEBTwEBAwMEBAQFCQQGAQIBBgMEAggOAwgDBgMEAQICAwQDBAMHBwMIAxIKCAIEAgIDAwgKBwcBDAgEBAQEBAQECwEHAwYCBgIDBQMHAwIDCQMCAgcCAgICAQEBAgIEAgUMAQQCAgICAgECAgICAgEEAgECAgMEAQQBBAECAwIDAgECAwIBAgYCAQIGAwMCBQIBAg8DAgECAQIDBgMDAwMDAwMDAQQJBQgDAwMBBAMDBAYFAwIFAQIDAgMCAwIDAwIFAgMCDAIDAgMCAwQDBAMGAwoDBgIKAQYCBQQEBAkJBgQB/sYBAgIIBAQEBDMDCQMG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BAQDBAEEAwcBAwUEBAQEBAkEJgQJBQQEBQ2xBQMGBwEDCAMBFQMBAwMBCQEMAQkJAwMCAQIDAwgEAQQCAgIDAwgEBQQJAwgDAgQDAgMCAwIDAgMDAwIDAwMDAwMDAwYDIwIDBAQCAgUECAUBhAQEBAMDAwEGAwMCAwIDAgMCAwcWAQQBBAEGAwICBAQDBAUJBAQEAwQBAgICAQIBAgECAgIBAQEIAQEBAgIEAQIHAwIBAgMCAQIGAwkDAwMECf3HBAgDAwICAQIBAQEBAQECAQgCAQEBAwMEBAQFCQQDAwQBAgUDAgEBAQEBAQIBAQIDAwkEAo0FBAQDBAICBwIDBQIEAQIDDAoDBAIEAQEEAwQECQgFBwMPAgEGBQgBAQEGAQIBAgECAgIJAQICAwQIBf2uBAQEAwICAgUGDAYBDAEGBwMBAwMBBwcDAQcHAQMBAwQIBAQMBAQEBAkEBAQFAgEBBAQDFQMECgcZAwoCAwMDAwMDAwIGAwIDAgMCCA4BpQQEAQcKHAsHEgQLBAcEBAcECAQQCAQDAgIBBAQDBAURDQQFBAUIBSYECQQEBAQEBAEEAwEDAQMEBAgECQQCAgECBgMEBQSnBQYGCwUMBQUGJgYKCAQCAwEBAgYECQQrBQkFBQUFCgUeBQoFBQUFCgQYCQUEAwQEAQEEAwQHJgUGBQsGCwbvBAUDBAQCAggCDAcIBwQDBAMEAwcGBw8CCQIDEQQDBAkJBAQDBAECAwIBAgMCAQISAQkEBgEDBAMBAwgEAwEDAQMBCAQEBAEECAEECgj99AQIBQQBBAQEDAQEBAgDAQMEAwQDBAkBDwIBAgMDBQIBBAMDAQIDAwgECQUHBQUQBgIGAg8HBgcDBAMEAwQHCAQEBwIBAgIDBAgEAq8ECAYCAQEBAQECCAIBAgIEARYBAQQDDAUJBAYFBAMKAggBAgECAgIHAQEBAQEEAwQIBPymBAQIBAIBAQECBgICAgEEAQYCCgMEAQMGBAUJBAQEAwQCARIBAgECAQICAgcCAQEBAQIHAwUElAUEBgICAQIDAwUEAQQNCQENAQQFBQQBBAUFCgUZAQQBFAYFBQULCgkFBAQDBAECAwMEBxMFBAUFBAUFBCUeCAQECQwDDQ0CGgQFAwEUBAQJCBYsBQUEBQUFBAUbBAYEAQECAwMEBAQJAwYFCwUFBQYUAR4FCgUFBAEEAQQFHA0EAQQFAwIBAgIDBAgEAjQBSzs5gFkeFRVtQD5xGhUnASI9SUw/KAcaOE1RISUsMhIjNgEPEQMDAQYZIkQI7QECAgUMBQkEAwYCAQEBAQECAgcCAgMCAgIBAgMDCAUJCAMFAgECAQIBAgICCQIBAQEnAQEDBQIEAQIPAwIBAgkMCQEJBAMDAQMDAQMLBwcJCQQDBAQBAQQDDAMEBgMDAgMDAwMDAwIDAwIDAgMCAwIDBAMWAwMICQkHAwQ8AQEDAwQNBQsCAwMDAwMDAgMDCiMDBwMHBA4LAwcDCAMDAgEBAwIECAkEAgQJBAQEBAQFAwEDAQMEAQMQBAMBAwgDAQoBAwMBAwMBAwMBBgQJAQMCAwMCqwEEBAMECAQECQUECQ0EGwUNCQQECQQBBCIEBQEEBAMDAgECAgMECAkFBBIECwQHBAQHBAgEHgQIBAcEBAcEBAkEBAQDBAF3AQIDAwgHBAcEGgMLCwcGBAMHFA8DBwEIBQQFCAMDAgICAgcBAxUBAwsBBxAEBAwEBAQEBAQJBCYFBQgEBAMEoQICAwMECQkJBgEMAQYMBgUDAwIBBAEEAQIFBAICAQEBBAEBAQYBAQECAQECAwcFBAUECAMDCQIBBgMQAwYDAgMCAwIDAgMGAgMDAwMDBwNNAQIBAwYMAwMFAwIBAQEEAwMECQUECAMDAgEBAQECCQICAgECAQIBAQECAgIBAQEEAQEBBQQDBQQFCAgDAgECzgEBAQEHAgIEAwQEBAkEBQYDAgkCAQEBAQEBAgUBAgMDCAQFBAkDAwMHAQEBAVMBAgIEBwkJCgEJBwYHAwQDBAMEBwgHFAQNBAQgAwMCAgICAwMICQUGBQUEAQQBBAUcDQQBCAQBBAQECAEDAQMBAwQIAwEDBAMBBgQHAgoBBAQBAwQDAQMMAwEDAQMBCAQEBAEEBAQBBA0XBQUEAQQBCQUKBQwEBQQEAwQBAgUHDB4IBAkEFAcIBwQDBAMEAwcGBAMHBQQECQQEAwT+xQEECAQEBAQeBQoFBQUFCQUnBQQFCQoEMgQFBAgEBgICBggKBRkBBAEUBgUFBQsGJgUGBQsGCwYWBgkIAwMEEAEBBggICQYRBQYFBgsFIQYLBQUKBg8BBAEZBQoBBAYCAQEDAgQICQgBKQQFBQQFBQkFIgUJBQUFBQoFFwUEBwIC/rIBAwYE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AQQDBwEDBQQEBAQECQQmBAkFBAQFDa0ECAYHAQMIAwEVAwEDAwEJAQwBCQkDAwIBAgMDCAQBBAICAgMDCAQFBAkDCAMCBAMCAwIDAgMCAwMDAgMDAwMDAwMDBgMjAgMEBAICBQQIAYQFCAQDAwMBBgMDAgMCAwIDAgMHFgEEAQQBBgMCAgQEAwQFCQQEBAMEAQICAgECAQIBAgICAQEBCAEBAQICBAECBwMCAQIDAgECBgMJAwMDBP3DBQQIAwMCAgECAQEBAQEBAgEIAgEBAQMDBAQEBQkEAwMEAQIFAwIBAQEBAQECAQECAwMJAu4FBAgGAgEBAQEBAggCAQICBAEWAQEEAwwFCQQGBQQDCgIIAQIBAgICBwEBAQEBBAMECPynBQgIBAIBAQECBgICAgEEAQYCCgMEAQMGBAUJBAQEAwQCARIBAgECAQICAgcCAQEBAQIHAwUC8AQFBAQDBAICBwIDBQIEAQIDDAoDBAIEAQEEAwQECQgFBwMPAgEGBQgBAQEGAQIBAgECAgIJAQICAwQI/a0ECAQDAgICBQYMBgEMAQYHAwEDAwEHBwMBBwcBAwEDBAgEBAwEBAQECQQEBAUCAQEEBAMVAwQKBxkDCgIDAwMDAwMDAgYDAgMCAwIIAZwFBAQBBwocCwcSBAsEBwQEBwQIBBAIBAMCAgEEBAMEBQwFDQQFBAUIBSYECQQEBAQEBAEEAwEDAQMEBAgECQQCAgECBgMEBf5EBAUEBgICAQIDAwUEAQQNCQENAQQFBQQBBAUFCgUZAQQBFAYFBQULCgkFBAQDBAECAwMEBxMFBAUFBAUFBCUeCAQECQwDDQISBQQFAwEUBAQJCBYsBQUEBQUFBAUbBAYEAQECAwMEBAQJAwYFCwUFBQYUAR4FCgUFBAEEAQQFHA0EAQQFAwIBAgIDBAgCIX2MfX2MfRd9Xn1+XQGVAQEBAQcCAgQDBAQECQQFBgMCCQIBAQEBAQECBQECAwMIBAUECQMDAwcBAQEBUwECAgQHCQkKAQkHBgcDBAMEAwQHCAcUBA0EBCADAwICAgIDAwgJBQYFBQQBBAEEBRwNBAEIBAEEBAQIAQMBAwEDBAgDAQMEAwEGBAcIAQQEAQMEAwEDDAMBAwEDAQgEBAQBBAQEAQQNFwUFBAEEAQkFCgUMBAUEBAMEAQIFBwweCAQJBBQHCAcEAwQD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AwIBAgMDAgEFAQwDAQIBAQEBAQEBAQQDBAQI/KYEBQMEBAEBAwIBAwIBBAEKAQQDAgMCAQIDAQIEBwkJBAQDBAIEAgMCBwQBBgECAQIIAQEBAQUICAKxBAQJBAUKBA8FBQsPBgULBSEGCxAIBAUCAgQDBA0JBgYUBQESBgcFAQUBBQEFARwBCwUBBQUBBQsPAQQBAwMCAQQDBAQI/d4EBAQDAgIBAgMEDQIBAgMCAQIDAwsCAQgDAwUBAgECAQIBAgMDAQIBAgECBAMGAw0DHQIDDQQDDQkFCAUCAQQDBAQDBAgDFAIRAwkFEQIGBQMFBQUCAQ8CBQICAQQDBBEEBAUCNAFLOzmAWR4VFW1APnEaFScBIj1JTD8oBxo4TVEhJSwyEiM2AQ8RAwMBBhkiRAgBSAECBgECBAIDBAgJBQQEAwQBAgICBAIBAQEBAQUBBgQDCQUICAIEBgEBAU8BAQMDBAQEBQkEBgECAQYDBAIIDgMIAwYDBAECAgMEAwQDBwcDCAMSCggCBAICAwMICgcHAQwIBAQEBAQEBAsBBwMGAgYCAwUDBwMCAwkDAgIHAgICAgEBAQICBAIFDAEEAgICAgIBAgICAgIBBAIBAgIDBAEEAQQBAgMCAwIBAgMCAQIGAgECBgMDAgUCAQIPAwIBAgECAwYDAwMDAwMDAwEECQUIAwMDAQQDAwQGBQMCBQECAwIDAgMCAwMCBQIDAgwCAwIDAgMEAwQDBgMKAwYCCgEGAgUEBAQJCQYEAf7GAQICCAQEBAQzAwkDBgIGAwMDAwMDBgIDAwkCDgMIAQ0FCwUGCgcEBQkEBgICAgIDAwMDBgYGBQEFBw8mAwoDAwcDAwQDAwQDAwQDBwMOAywFCQgEAgMCEwECAwMIBBsGBxMHDRMGBw0GHw0FAQUBBQEFAQUBBQEBBAQEAgICAwMJCQgGBgUGEAsGEQUGBgUvBgUGBgwGBwUHBgL+sgECBgQEBgQJBAMFCQIDBAMMAQQDBAMHCQkIAwMDAgIBBgIGAwIDAgMDDwYBAwMBAwQHDAQBAwQEBAkIBAMCAgIBAwIEBAkEBQQEAwEKAgICAgICAQEHAgUBAQEDAgIBAgECAQEBAQECAgIEAgkBAQQBBAEEBwUECQgEAgMBAwcGAwMGAgIDAQMCAwIJAgMCAQQBBA0BAgAAAwAAAAADIAJYAAMABwAL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BAMIAQ4CCAIGAgQBAgIBAgMCAwUEAwQDCgUGAwkECQQEAwQCBAYBBAMCAwIDAgECCAEFAwQCBAICBQIHAgIBAgkBAgIDBwMCAwIBAgMCBgIKBf3zBQcBAgMCAwIDAgMCAwQBAgIDAgQBBAQBAgICAgICAQICAgQCAgQBAQECAwICCgECAgIBBAECAQIBAgECAgEEBAMOBAgEAwEBAgMBAgICAQIBAgECAQICAwIBAggCAQICAgEEAgQBBgIKAgYDCgMGAwUDAgEEBggFArIEBQMGAgEBAQEBAQEBAgEDBQMFAwQDAgYDAQIDBgQJCQQEAwIBAQMCAQIDAwIBBQEMAwECAQEBAQEBAQEEAwQECPymBAUDBAQBAQMCAQMCAQQBCgEEAwIDAgECAwECBAcJCQQEAwQCBAIDAgcEAQYBAgECCAEBAQEFCAgCsQQECQQFCgQPBQULDwYFCwUhBgsQCAQFAgIEAwQNCQYGFAUBEgYHBQEFAQUBBQEcAQsFAQUFAQULDwEEAQMDAgEEAwQECP3eBAQEAwICAQIDBA0CAQIDAgECAwMLAgEIAwMFAQIBAgECAQIDAwECAQIBAgQDBgMNAx0CAw0EAw0JBQgFAgEEAwQEAwQIAxQCEQMJBRECBgUDBQUFAgEPAgUCAgEEAwQRBAQFAhwM/pABfBj+tAEnGRlKGBhVGBhNGBgCLQECBgECBAIDBAgJBQQEAwQBAgICBAIBAQEBAQUBBgQDCQUICAIEBgEBAU8BAQMDBAQEBQkEBgECAQYDBAIIDgMIAwYDBAECAgMEAwQDBwcDCAMSCggCBAICAwMICgcHAQwIBAQEBAQEBAsBBwMGAgYCAwUDBwMCAwkDAgIHAgICAgEBAQICBAIFDAEEAgICAgIBAgICAgIBBAIBAgIDBAEEAQQBAgMCAwIBAgMCAQIGAgECBgMDAgUCAQIPAwIBAgECAwYDAwMDAwMDAwEECQUIAwMDAQQDAwQGBQMCBQECAwIDAgMCAwMCBQIDAgwCAwIDAgMEAwQDBgMKAwYCCgEGAgUEBAQJCQYEAf7GAQICCAQEBAQzAwkDBgIGAwMDAwMDBgIDAwkCDgMIAQ0FCwUGCgcEBQkEBgICAgIDAwMDBgYGBQEFBw8mAwoDAwcDAwQDAwQDAwQDBwMOAywFCQgEAgMCEwECAwMIBBsGBxMHDRMGBw0G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BAECBwMCAQIDAgECBgMJAwMDBP3DBQQIAwMCAgECAQEBAQEBAgEIAgEBAQMDBAQEBQkEAwMEAQIFAwIBAQEBAQECAQECAwMJAu4FBAgGAgEBAQEBAggCAQICBAEWAQEEAwwFCQQGBQQDCgIIAQIBAgICBwEBAQEBBAMECPynBQgIBAIBAQECBgICAgEEAQYCCgMEAQMGBAUJBAQEAwQCARIBAgECAQICAgcCAQEBAQIHAwUC8AQFBAQDBAICBwIDBQIEAQIDDAoDBAIEAQEEAwQECQgFBwMPAgEGBQgBAQEGAQIBAgECAgIJAQICAwQI/a0ECAQDAgICBQYMBgEMAQYHAwEDAwEHBwMBBwcBAwEDBAgEBAwEBAQECQQEBAUCAQEEBAMVAwQKBxkDCgIDAwMDAwMDAgYDAgMCAwIIAZwFBAQBBwocCwcSBAsEBwQEBwQIBBAIBAMCAgEEBAMEBQwFDQQFBAUIBSYECQQEBAQEBAEEAwEDAQMEBAgECQQCAgECBgMEBf5EBAUEBgICAQIDAwUEAQQNCQENAQQFBQQBBAUFCgUZAQQBFAYFBQULCgkFBAQDBAECAwMEBxMFBAUFBAUFBCUeCAQECQwDDQISBQQFAwEUBAQJCBYsBQUEBQUFBAUbBAYEAQECAwMEBAQJAwYFCwUFBQYUAR4FCgUFBAEEAQQFHA0EAQQFAwIBAgIDBAgCHAz+kAF8GP60AScZGUoYGFUYGE0YGAIvAQEBAQcCAgQDBAQECQQFBgMCCQIBAQEBAQECBQECAwMIBAUECQMDAwcBAQEBUwECAgQHCQkKAQkHBgcDBAMEAwQHCAcUBA0EBCADAwICAgIDAwgJBQYFBQQBBAEEBRwNBAEIBAEEBAQIAQMBAwEDBAgDAQMEAwEGBAcIAQQEAQMEAwEDDAMBAwEDAQgEBAQBBAQEAQQNFwUFBAEEAQkFCgUMBAUEBAMEAQIFBwweCAQJBBQHCAcEAwQDBAMHBgQDBwUEBAkEBAMEAQICBQwFCQQDBgIBAQEBAQICBwICAwICAgECAwMIBQkIAwUCAQIBAgECAgIJAgEBAScCAwUCBAECDwMCAQIJDAkBCQQDAwEDAwEDCwcHCQkEAwQEAQEEAwwDBAYDAwIDAwMDAwMCAwMCAwIDAgMCAwQDFgMDCAkJBwMEOwECAwMEDQULAgMDAwMDAwID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bwBtACAARgBvAG4AdABlAGwAbABvACAAcAByAG8AagBlAGMAdAAuAGgAdAB0AHAAOgAvAC8AZgBvAG4AdABlAGwAbABvAC4AYwBvAG0AAAAAAgAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsAQIBAwEEAQUBBgEHAQgBCQEKAQsBDAENAQ4BDwEQAREBEgETARQBFQEWARcBGAEZARoBGwEcAR0BHgEfASABIQEiASMBJAElASYBJwEoASkBKgErASwBLQEuAS8BMAExATIBMwE0ATUBNgE3ATgBOQE6ATsBPAE9AT4BPwFAAUEBQgFDAUQBRQFGAUcBSAFJAUoBSwFMAU0BTgFPAVABUQFSAVMBVAFVAVYBVwFYAVkBWgFbAVwBXQFeAV8BYAFhAWIBYwFkAWUBZgFnAWgBaQFqAWsBbAFtAAV0cmFzaBBnYXRld2F5LXBhcmFsbGVsH2ludGVybWVkaWF0ZS1ldmVudC1jYXRjaC1jYW5jZWwxaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLW5vbi1pbnRlcnJ1cHRpbmctbWVzc2FnZRhzdGFydC1ldmVudC1jb21wZW5zYXRpb24uc3RhcnQtZXZlbnQtbm9uLWludGVycnVwdGluZy1wYXJhbGxlbC1tdWx0aXBsZQtsb29wLW1hcmtlchJwYXJhbGxlbC1taS1tYXJrZXIjc3RhcnQtZXZlbnQtbm9uLWludGVycnVwdGluZy1zaWduYWwvaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLW5vbi1pbnRlcnJ1cHRpbmctdGltZXIqaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLXBhcmFsbGVsLW11bHRpcGxlJWludGVybWVkaWF0ZS1ldmVudC1jYXRjaC1jb21wZW5zYXRpb24LZ2F0ZXdheS14b3IQZW5kLWV2ZW50LWNhbmNlbCJpbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtY29uZGl0aW9uO2ludGVybWVkaWF0ZS1ldmVudC1jYXRjaC1ub24taW50ZXJydXB0aW5nLXBhcmFsbGVsLW11bHRpcGxlFXN0YXJ0LWV2ZW50LWNvbmRpdGlvbiJzdGFydC1ldmVudC1ub24taW50ZXJydXB0aW5nLXRpbWVyFHNlcXVlbnRpYWwtbWktbWFya2VyCXVzZXItdGFzaw1idXNpbmVzcy1ydWxlEnN1Yi1wcm9jZXNzLW1hcmtlch1zdGFydC1ldmVudC1wYXJhbGxlbC1tdWx0aXBsZRFzdGFydC1ldmVudC1lcnJvch9pbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtc2lnbmFsHmludGVybWVkaWF0ZS1ldmVudC1jYXRjaC1lcnJvchZlbmQtZXZlbnQtY29tcGVuc2F0aW9uFHN1YnByb2Nlc3MtY29sbGFwc2VkE3N1YnByb2Nlc3MtZXhwYW5kZWQEdGFzaw9lbmQtZXZlbnQtZXJyb3IjaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLWVzY2FsYXRpb24eaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLXRpbWVyFnN0YXJ0LWV2ZW50LWVzY2FsYXRpb24Sc3RhcnQtZXZlbnQtc2lnbmFsEmJ1c2luZXNzLXJ1bGUtdGFzawZtYW51YWwHcmVjZWl2ZQ1jYWxsLWFjdGl2aXR5EXN0YXJ0LWV2ZW50LXRpbWVyE3N0YXJ0LWV2ZW50LW1lc3NhZ2UXaW50ZXJtZWRpYXRlLWV2ZW50LW5vbmUdaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLWxpbmsUZW5kLWV2ZW50LWVzY2FsYXRpb24HYnBtbi1pbw9nYXRld2F5LWNvbXBsZXgSZ2F0ZXdheS1ldmVudGJhc2VkDGdhdGV3YXktbm9uZQpnYXRld2F5LW9yE2VuZC1ldmVudC10ZXJtaW5hdGUQZW5kLWV2ZW50LXNpZ25hbA5lbmQtZXZlbnQtbm9uZRJlbmQtZXZlbnQtbXVsdGlwbGURZW5kLWV2ZW50LW1lc3NhZ2UOZW5kLWV2ZW50LWxpbmsgaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLW1lc3NhZ2UlaW50ZXJtZWRpYXRlLWV2ZW50LXRocm93LWNvbXBlbnNhdGlvbhRzdGFydC1ldmVudC1tdWx0aXBsZQZzY3JpcHQLbWFudWFsLXRhc2sEc2VuZAdzZXJ2aWNlDHJlY2VpdmUtdGFzawR1c2VyEHN0YXJ0LWV2ZW50LW5vbmUjaW50ZXJtZWRpYXRlLWV2ZW50LXRocm93LWVzY2FsYXRpb24haW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLW11bHRpcGxlNGludGVybWVkaWF0ZS1ldmVudC1jYXRjaC1ub24taW50ZXJydXB0aW5nLWVzY2FsYXRpb24daW50ZXJtZWRpYXRlLWV2ZW50LXRocm93LWxpbmsmc3RhcnQtZXZlbnQtbm9uLWludGVycnVwdGluZy1jb25kaXRpb24LZGF0YS1vYmplY3QLc2NyaXB0LXRhc2sJc2VuZC10YXNrCmRhdGEtc3RvcmUnc3RhcnQtZXZlbnQtbm9uLWludGVycnVwdGluZy1lc2NhbGF0aW9uIGludGVybWVkaWF0ZS1ldmVudC10aHJvdy1tZXNzYWdlMmludGVybWVkaWF0ZS1ldmVudC1jYXRjaC1ub24taW50ZXJydXB0aW5nLW11bHRpcGxlMGludGVybWVkaWF0ZS1ldmVudC1jYXRjaC1ub24taW50ZXJydXB0aW5nLXNpZ25hbCFpbnRlcm1lZGlhdGUtZXZlbnQtdGhyb3ctbXVsdGlwbGUkc3RhcnQtZXZlbnQtbm9uLWludGVycnVwdGluZy1tZXNzYWdlDWFkLWhvYy1tYXJrZXIMc2VydmljZS10YXNrCXRhc2stbm9uZRNjb21wZW5zYXRpb24tbWFya2VyJXN0YXJ0LWV2ZW50LW5vbi1pbnRlcnJ1cHRpbmctbXVsdGlwbGUfaW50ZXJtZWRpYXRlLWV2ZW50LXRocm93LXNpZ25hbDNpbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtbm9uLWludGVycnVwdGluZy1jb25kaXRpb24LcGFydGljaXBhbnQZZXZlbnQtc3VicHJvY2Vzcy1leHBhbmRlZBFsYW5lLWluc2VydC1iZWxvdwpzcGFjZS10b29sEGNvbm5lY3Rpb24tbXVsdGkEbGFuZQpsYXNzby10b29sEWxhbmUtaW5zZXJ0LWFib3ZlEWxhbmUtZGl2aWRlLXRocmVlD2xhbmUtZGl2aWRlLXR3bwpkYXRhLWlucHV0C2RhdGEtb3V0cHV0CWhhbmQtdG9vbAVncm91cA90ZXh0LWFubm90YXRpb24LdHJhbnNhY3Rpb24Mc2NyZXctd3JlbmNoCmNvbm5lY3Rpb24QY29uZGl0aW9uYWwtZmxvdwxkZWZhdWx0LWZsb3cAAA==') format('truetype');\n}\n/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */\n/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */\n/*\n@media screen and (-webkit-min-device-pixel-ratio:0) {\n  @font-face {\n    font-family: 'bpmn';\n    src: url('../font/bpmn.svg?16406289#bpmn') format('svg');\n  }\n}\n*/\n\n[class^=\"bpmn-icon-\"]:before, [class*=\" bpmn-icon-\"]:before {\n  font-family: \"bpmn\";\n  font-style: normal;\n  font-weight: normal;\n  speak: never;\n\n  display: inline-block;\n  text-decoration: inherit;\n  width: 1em;\n  /* margin-right: .2em; */\n  text-align: center;\n  /* opacity: .8; */\n\n  /* For safety - reset parent styles, that can break glyph codes*/\n  font-variant: normal;\n  text-transform: none;\n\n  /* fix buttons height, for twitter bootstrap */\n  line-height: 1em;\n\n  /* Animation center compensation - margins should be symmetric */\n  /* remove if not needed */\n  /* margin-left: .2em; */\n\n  /* you can be more comfortable with increased icons size */\n  /* font-size: 120%; */\n  \n  /* Font smoothing. That was taken from TWBS */\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n\n  /* Uncomment for 3D effect */\n  /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */\n}\n\n.bpmn-icon-trash:before { content: '\\e801'; } /* '' */\n.bpmn-icon-gateway-parallel:before { content: '\\e804'; } /* '' */\n.bpmn-icon-intermediate-event-catch-cancel:before { content: '\\e805'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-message:before { content: '\\e806'; } /* '' */\n.bpmn-icon-start-event-compensation:before { content: '\\e807'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-parallel-multiple:before { content: '\\e808'; } /* '' */\n.bpmn-icon-loop-marker:before { content: '\\e809'; } /* '' */\n.bpmn-icon-parallel-mi-marker:before { content: '\\e80a'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-signal:before { content: '\\e80b'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-timer:before { content: '\\e80c'; } /* '' */\n.bpmn-icon-intermediate-event-catch-parallel-multiple:before { content: '\\e80d'; } /* '' */\n.bpmn-icon-intermediate-event-catch-compensation:before { content: '\\e80e'; } /* '' */\n.bpmn-icon-gateway-xor:before { content: '\\e80f'; } /* '' */\n.bpmn-icon-end-event-cancel:before { content: '\\e811'; } /* '' */\n.bpmn-icon-intermediate-event-catch-condition:before { content: '\\e812'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-parallel-multiple:before { content: '\\e813'; } /* '' */\n.bpmn-icon-start-event-condition:before { content: '\\e814'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-timer:before { content: '\\e815'; } /* '' */\n.bpmn-icon-sequential-mi-marker:before { content: '\\e816'; } /* '' */\n.bpmn-icon-user-task:before { content: '\\e817'; } /* '' */\n.bpmn-icon-business-rule:before { content: '\\e818'; } /* '' */\n.bpmn-icon-sub-process-marker:before { content: '\\e819'; } /* '' */\n.bpmn-icon-start-event-parallel-multiple:before { content: '\\e81a'; } /* '' */\n.bpmn-icon-start-event-error:before { content: '\\e81b'; } /* '' */\n.bpmn-icon-intermediate-event-catch-signal:before { content: '\\e81c'; } /* '' */\n.bpmn-icon-intermediate-event-catch-error:before { content: '\\e81d'; } /* '' */\n.bpmn-icon-end-event-compensation:before { content: '\\e81e'; } /* '' */\n.bpmn-icon-subprocess-collapsed:before { content: '\\e81f'; } /* '' */\n.bpmn-icon-subprocess-expanded:before { content: '\\e820'; } /* '' */\n.bpmn-icon-task:before { content: '\\e821'; } /* '' */\n.bpmn-icon-end-event-error:before { content: '\\e822'; } /* '' */\n.bpmn-icon-intermediate-event-catch-escalation:before { content: '\\e823'; } /* '' */\n.bpmn-icon-intermediate-event-catch-timer:before { content: '\\e824'; } /* '' */\n.bpmn-icon-start-event-escalation:before { content: '\\e825'; } /* '' */\n.bpmn-icon-start-event-signal:before { content: '\\e826'; } /* '' */\n.bpmn-icon-business-rule-task:before { content: '\\e827'; } /* '' */\n.bpmn-icon-manual:before { content: '\\e828'; } /* '' */\n.bpmn-icon-receive:before { content: '\\e829'; } /* '' */\n.bpmn-icon-call-activity:before { content: '\\e82a'; } /* '' */\n.bpmn-icon-start-event-timer:before { content: '\\e82b'; } /* '' */\n.bpmn-icon-start-event-message:before { content: '\\e82c'; } /* '' */\n.bpmn-icon-intermediate-event-none:before { content: '\\e82d'; } /* '' */\n.bpmn-icon-intermediate-event-catch-link:before { content: '\\e82e'; } /* '' */\n.bpmn-icon-end-event-escalation:before { content: '\\e82f'; } /* '' */\n.bpmn-icon-bpmn-io:before { content: '\\e831'; } /* '' */\n.bpmn-icon-gateway-complex:before { content: '\\e832'; } /* '' */\n.bpmn-icon-gateway-eventbased:before { content: '\\e833'; } /* '' */\n.bpmn-icon-gateway-none:before { content: '\\e834'; } /* '' */\n.bpmn-icon-gateway-or:before { content: '\\e835'; } /* '' */\n.bpmn-icon-end-event-terminate:before { content: '\\e836'; } /* '' */\n.bpmn-icon-end-event-signal:before { content: '\\e837'; } /* '' */\n.bpmn-icon-end-event-none:before { content: '\\e838'; } /* '' */\n.bpmn-icon-end-event-multiple:before { content: '\\e839'; } /* '' */\n.bpmn-icon-end-event-message:before { content: '\\e83a'; } /* '' */\n.bpmn-icon-end-event-link:before { content: '\\e83b'; } /* '' */\n.bpmn-icon-intermediate-event-catch-message:before { content: '\\e83c'; } /* '' */\n.bpmn-icon-intermediate-event-throw-compensation:before { content: '\\e83d'; } /* '' */\n.bpmn-icon-start-event-multiple:before { content: '\\e83e'; } /* '' */\n.bpmn-icon-script:before { content: '\\e83f'; } /* '' */\n.bpmn-icon-manual-task:before { content: '\\e840'; } /* '' */\n.bpmn-icon-send:before { content: '\\e841'; } /* '' */\n.bpmn-icon-service:before { content: '\\e842'; } /* '' */\n.bpmn-icon-receive-task:before { content: '\\e843'; } /* '' */\n.bpmn-icon-user:before { content: '\\e844'; } /* '' */\n.bpmn-icon-start-event-none:before { content: '\\e845'; } /* '' */\n.bpmn-icon-intermediate-event-throw-escalation:before { content: '\\e846'; } /* '' */\n.bpmn-icon-intermediate-event-catch-multiple:before { content: '\\e847'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-escalation:before { content: '\\e848'; } /* '' */\n.bpmn-icon-intermediate-event-throw-link:before { content: '\\e849'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-condition:before { content: '\\e84a'; } /* '' */\n.bpmn-icon-data-object:before { content: '\\e84b'; } /* '' */\n.bpmn-icon-script-task:before { content: '\\e84c'; } /* '' */\n.bpmn-icon-send-task:before { content: '\\e84d'; } /* '' */\n.bpmn-icon-data-store:before { content: '\\e84e'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-escalation:before { content: '\\e84f'; } /* '' */\n.bpmn-icon-intermediate-event-throw-message:before { content: '\\e850'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-multiple:before { content: '\\e851'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-signal:before { content: '\\e852'; } /* '' */\n.bpmn-icon-intermediate-event-throw-multiple:before { content: '\\e853'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-message:before { content: '\\e854'; } /* '' */\n.bpmn-icon-ad-hoc-marker:before { content: '\\e855'; } /* '' */\n.bpmn-icon-service-task:before { content: '\\e856'; } /* '' */\n.bpmn-icon-task-none:before { content: '\\e857'; } /* '' */\n.bpmn-icon-compensation-marker:before { content: '\\e858'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-multiple:before { content: '\\e859'; } /* '' */\n.bpmn-icon-intermediate-event-throw-signal:before { content: '\\e85a'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-condition:before { content: '\\e85b'; } /* '' */\n.bpmn-icon-participant:before { content: '\\e85c'; } /* '' */\n.bpmn-icon-event-subprocess-expanded:before { content: '\\e85d'; } /* '' */\n.bpmn-icon-lane-insert-below:before { content: '\\e85e'; } /* '' */\n.bpmn-icon-space-tool:before { content: '\\e85f'; } /* '' */\n.bpmn-icon-connection-multi:before { content: '\\e860'; } /* '' */\n.bpmn-icon-lane:before { content: '\\e861'; } /* '' */\n.bpmn-icon-lasso-tool:before { content: '\\e862'; } /* '' */\n.bpmn-icon-lane-insert-above:before { content: '\\e863'; } /* '' */\n.bpmn-icon-lane-divide-three:before { content: '\\e864'; } /* '' */\n.bpmn-icon-lane-divide-two:before { content: '\\e865'; } /* '' */\n.bpmn-icon-data-input:before { content: '\\e866'; } /* '' */\n.bpmn-icon-data-output:before { content: '\\e867'; } /* '' */\n.bpmn-icon-hand-tool:before { content: '\\e868'; } /* '' */\n.bpmn-icon-group:before { content: '\\e869'; } /* '' */\n.bpmn-icon-text-annotation:before { content: '\\e86b'; } /* '' */\n.bpmn-icon-transaction:before { content: '\\e8c4'; } /* '' */\n.bpmn-icon-screw-wrench:before { content: '\\e8db'; } /* '' */\n.bpmn-icon-connection:before { content: '\\e8dc'; } /* '' */\n.bpmn-icon-conditional-flow:before { content: '\\e8e0'; } /* '' */\n.bpmn-icon-default-flow:before { content: '\\e8e1'; } /* '' */\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bpmnjs/assets/bpmn-font/css/bpmn.css",
    "content": "@font-face {\n  font-family: 'bpmn';\n  src: url('../font/bpmn.eot?21877404');\n  src: url('../font/bpmn.eot?21877404#iefix') format('embedded-opentype'),\n       url('../font/bpmn.woff2?21877404') format('woff2'),\n       url('../font/bpmn.woff?21877404') format('woff'),\n       url('../font/bpmn.ttf?21877404') format('truetype'),\n       url('../font/bpmn.svg?21877404#bpmn') format('svg');\n  font-weight: normal;\n  font-style: normal;\n}\n/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */\n/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */\n/*\n@media screen and (-webkit-min-device-pixel-ratio:0) {\n  @font-face {\n    font-family: 'bpmn';\n    src: url('../font/bpmn.svg?21877404#bpmn') format('svg');\n  }\n}\n*/\n[class^=\"bpmn-icon-\"]:before, [class*=\" bpmn-icon-\"]:before {\n  font-family: \"bpmn\";\n  font-style: normal;\n  font-weight: normal;\n  speak: never;\n\n  display: inline-block;\n  text-decoration: inherit;\n  width: 1em;\n  /* margin-right: .2em; */\n  text-align: center;\n  /* opacity: .8; */\n\n  /* For safety - reset parent styles, that can break glyph codes*/\n  font-variant: normal;\n  text-transform: none;\n\n  /* fix buttons height, for twitter bootstrap */\n  line-height: 1em;\n\n  /* Animation center compensation - margins should be symmetric */\n  /* remove if not needed */\n  /* margin-left: .2em; */\n\n  /* you can be more comfortable with increased icons size */\n  /* font-size: 120%; */\n\n  /* Font smoothing. That was taken from TWBS */\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n\n  /* Uncomment for 3D effect */\n  /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */\n}\n\n.bpmn-icon-trash:before { content: '\\e801'; } /* '' */\n.bpmn-icon-gateway-parallel:before { content: '\\e804'; } /* '' */\n.bpmn-icon-intermediate-event-catch-cancel:before { content: '\\e805'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-message:before { content: '\\e806'; } /* '' */\n.bpmn-icon-start-event-compensation:before { content: '\\e807'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-parallel-multiple:before { content: '\\e808'; } /* '' */\n.bpmn-icon-loop-marker:before { content: '\\e809'; } /* '' */\n.bpmn-icon-parallel-mi-marker:before { content: '\\e80a'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-signal:before { content: '\\e80b'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-timer:before { content: '\\e80c'; } /* '' */\n.bpmn-icon-intermediate-event-catch-parallel-multiple:before { content: '\\e80d'; } /* '' */\n.bpmn-icon-intermediate-event-catch-compensation:before { content: '\\e80e'; } /* '' */\n.bpmn-icon-gateway-xor:before { content: '\\e80f'; } /* '' */\n.bpmn-icon-end-event-cancel:before { content: '\\e811'; } /* '' */\n.bpmn-icon-intermediate-event-catch-condition:before { content: '\\e812'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-parallel-multiple:before { content: '\\e813'; } /* '' */\n.bpmn-icon-start-event-condition:before { content: '\\e814'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-timer:before { content: '\\e815'; } /* '' */\n.bpmn-icon-sequential-mi-marker:before { content: '\\e816'; } /* '' */\n.bpmn-icon-user-task:before { content: '\\e817'; } /* '' */\n.bpmn-icon-business-rule:before { content: '\\e818'; } /* '' */\n.bpmn-icon-sub-process-marker:before { content: '\\e819'; } /* '' */\n.bpmn-icon-start-event-parallel-multiple:before { content: '\\e81a'; } /* '' */\n.bpmn-icon-start-event-error:before { content: '\\e81b'; } /* '' */\n.bpmn-icon-intermediate-event-catch-signal:before { content: '\\e81c'; } /* '' */\n.bpmn-icon-intermediate-event-catch-error:before { content: '\\e81d'; } /* '' */\n.bpmn-icon-end-event-compensation:before { content: '\\e81e'; } /* '' */\n.bpmn-icon-subprocess-collapsed:before { content: '\\e81f'; } /* '' */\n.bpmn-icon-subprocess-expanded:before { content: '\\e820'; } /* '' */\n.bpmn-icon-task:before { content: '\\e821'; } /* '' */\n.bpmn-icon-end-event-error:before { content: '\\e822'; } /* '' */\n.bpmn-icon-intermediate-event-catch-escalation:before { content: '\\e823'; } /* '' */\n.bpmn-icon-intermediate-event-catch-timer:before { content: '\\e824'; } /* '' */\n.bpmn-icon-start-event-escalation:before { content: '\\e825'; } /* '' */\n.bpmn-icon-start-event-signal:before { content: '\\e826'; } /* '' */\n.bpmn-icon-business-rule-task:before { content: '\\e827'; } /* '' */\n.bpmn-icon-manual:before { content: '\\e828'; } /* '' */\n.bpmn-icon-receive:before { content: '\\e829'; } /* '' */\n.bpmn-icon-call-activity:before { content: '\\e82a'; } /* '' */\n.bpmn-icon-start-event-timer:before { content: '\\e82b'; } /* '' */\n.bpmn-icon-start-event-message:before { content: '\\e82c'; } /* '' */\n.bpmn-icon-intermediate-event-none:before { content: '\\e82d'; } /* '' */\n.bpmn-icon-intermediate-event-catch-link:before { content: '\\e82e'; } /* '' */\n.bpmn-icon-end-event-escalation:before { content: '\\e82f'; } /* '' */\n.bpmn-icon-bpmn-io:before { content: '\\e831'; } /* '' */\n.bpmn-icon-gateway-complex:before { content: '\\e832'; } /* '' */\n.bpmn-icon-gateway-eventbased:before { content: '\\e833'; } /* '' */\n.bpmn-icon-gateway-none:before { content: '\\e834'; } /* '' */\n.bpmn-icon-gateway-or:before { content: '\\e835'; } /* '' */\n.bpmn-icon-end-event-terminate:before { content: '\\e836'; } /* '' */\n.bpmn-icon-end-event-signal:before { content: '\\e837'; } /* '' */\n.bpmn-icon-end-event-none:before { content: '\\e838'; } /* '' */\n.bpmn-icon-end-event-multiple:before { content: '\\e839'; } /* '' */\n.bpmn-icon-end-event-message:before { content: '\\e83a'; } /* '' */\n.bpmn-icon-end-event-link:before { content: '\\e83b'; } /* '' */\n.bpmn-icon-intermediate-event-catch-message:before { content: '\\e83c'; } /* '' */\n.bpmn-icon-intermediate-event-throw-compensation:before { content: '\\e83d'; } /* '' */\n.bpmn-icon-start-event-multiple:before { content: '\\e83e'; } /* '' */\n.bpmn-icon-script:before { content: '\\e83f'; } /* '' */\n.bpmn-icon-manual-task:before { content: '\\e840'; } /* '' */\n.bpmn-icon-send:before { content: '\\e841'; } /* '' */\n.bpmn-icon-service:before { content: '\\e842'; } /* '' */\n.bpmn-icon-receive-task:before { content: '\\e843'; } /* '' */\n.bpmn-icon-user:before { content: '\\e844'; } /* '' */\n.bpmn-icon-start-event-none:before { content: '\\e845'; } /* '' */\n.bpmn-icon-intermediate-event-throw-escalation:before { content: '\\e846'; } /* '' */\n.bpmn-icon-intermediate-event-catch-multiple:before { content: '\\e847'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-escalation:before { content: '\\e848'; } /* '' */\n.bpmn-icon-intermediate-event-throw-link:before { content: '\\e849'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-condition:before { content: '\\e84a'; } /* '' */\n.bpmn-icon-data-object:before { content: '\\e84b'; } /* '' */\n.bpmn-icon-script-task:before { content: '\\e84c'; } /* '' */\n.bpmn-icon-send-task:before { content: '\\e84d'; } /* '' */\n.bpmn-icon-data-store:before { content: '\\e84e'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-escalation:before { content: '\\e84f'; } /* '' */\n.bpmn-icon-intermediate-event-throw-message:before { content: '\\e850'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-multiple:before { content: '\\e851'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-signal:before { content: '\\e852'; } /* '' */\n.bpmn-icon-intermediate-event-throw-multiple:before { content: '\\e853'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-message:before { content: '\\e854'; } /* '' */\n.bpmn-icon-ad-hoc-marker:before { content: '\\e855'; } /* '' */\n.bpmn-icon-service-task:before { content: '\\e856'; } /* '' */\n.bpmn-icon-task-none:before { content: '\\e857'; } /* '' */\n.bpmn-icon-compensation-marker:before { content: '\\e858'; } /* '' */\n.bpmn-icon-start-event-non-interrupting-multiple:before { content: '\\e859'; } /* '' */\n.bpmn-icon-intermediate-event-throw-signal:before { content: '\\e85a'; } /* '' */\n.bpmn-icon-intermediate-event-catch-non-interrupting-condition:before { content: '\\e85b'; } /* '' */\n.bpmn-icon-participant:before { content: '\\e85c'; } /* '' */\n.bpmn-icon-event-subprocess-expanded:before { content: '\\e85d'; } /* '' */\n.bpmn-icon-lane-insert-below:before { content: '\\e85e'; } /* '' */\n.bpmn-icon-space-tool:before { content: '\\e85f'; } /* '' */\n.bpmn-icon-connection-multi:before { content: '\\e860'; } /* '' */\n.bpmn-icon-lane:before { content: '\\e861'; } /* '' */\n.bpmn-icon-lasso-tool:before { content: '\\e862'; } /* '' */\n.bpmn-icon-lane-insert-above:before { content: '\\e863'; } /* '' */\n.bpmn-icon-lane-divide-three:before { content: '\\e864'; } /* '' */\n.bpmn-icon-lane-divide-two:before { content: '\\e865'; } /* '' */\n.bpmn-icon-data-input:before { content: '\\e866'; } /* '' */\n.bpmn-icon-data-output:before { content: '\\e867'; } /* '' */\n.bpmn-icon-hand-tool:before { content: '\\e868'; } /* '' */\n.bpmn-icon-group:before { content: '\\e869'; } /* '' */\n.bpmn-icon-text-annotation:before { content: '\\e86b'; } /* '' */\n.bpmn-icon-transaction:before { content: '\\e8c4'; } /* '' */\n.bpmn-icon-screw-wrench:before { content: '\\e8db'; } /* '' */\n.bpmn-icon-connection:before { content: '\\e8dc'; } /* '' */\n.bpmn-icon-conditional-flow:before { content: '\\e8e0'; } /* '' */\n.bpmn-icon-default-flow:before { content: '\\e8e1'; } /* '' */\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bpmnjs/assets/bpmn-js.css",
    "content": ".bjs-container {\n  --bjs-font-family: Arial, sans-serif;\n\n  --color-grey-225-10-15: hsl(225, 10%, 15%);\n  --color-grey-225-10-35: hsl(225, 10%, 35%);\n  --color-grey-225-10-55: hsl(225, 10%, 55%);\n  --color-grey-225-10-75: hsl(225, 10%, 75%);\n  --color-grey-225-10-80: hsl(225, 10%, 80%);\n  --color-grey-225-10-85: hsl(225, 10%, 85%);\n  --color-grey-225-10-90: hsl(225, 10%, 90%);\n  --color-grey-225-10-95: hsl(225, 10%, 95%);\n  --color-grey-225-10-97: hsl(225, 10%, 97%);\n\n  --color-blue-205-100-45: hsl(205, 100%, 45%);\n  --color-blue-205-100-45-opacity-30: hsla(205, 100%, 45%, 30%);\n  --color-blue-205-100-50: hsl(205, 100%, 50%);\n  --color-blue-205-100-95: hsl(205, 100%, 95%);\n\n  --color-green-150-86-44: hsl(150, 86%, 44%);\n\n  --color-red-360-100-40: hsl(360, 100%, 40%);\n  --color-red-360-100-45: hsl(360, 100%, 45%);\n  --color-red-360-100-92: hsl(360, 100%, 92%);\n  --color-red-360-100-97: hsl(360, 100%, 97%);\n\n  --color-white: hsl(0, 0%, 100%);\n  --color-black: hsl(0, 0%, 0%);\n  --color-black-opacity-05: hsla(0, 0%, 0%, 5%);\n  --color-black-opacity-10: hsla(0, 0%, 0%, 10%);\n\n  --breadcrumbs-font-family: var(--bjs-font-family);\n  --breadcrumbs-item-color: var(--color-blue-205-100-50);\n  --breadcrumbs-arrow-color: var(--color-black);\n  --drilldown-fill-color: var(--color-white);\n  --drilldown-background-color: var(--color-blue-205-100-50);\n}\n\n.bjs-breadcrumbs {\n  position: absolute;\n  display: none;\n  flex-wrap: wrap;\n  align-items: center;\n  top: 30px;\n  left: 30px;\n  padding: 0px;\n  margin: 0px;\n  font-family: var(--breadcrumbs-font-family);\n  font-size: 16px;\n  line-height: normal;\n}\n\n.bjs-breadcrumbs-shown .bjs-breadcrumbs {\n  display: flex;\n}\n\n.djs-palette-shown .bjs-breadcrumbs {\n  left: 90px;\n}\n\n.djs-palette-shown.djs-palette-two-column .bjs-breadcrumbs {\n  left: 140px;\n}\n\n.bjs-breadcrumbs li {\n  display: inline-flex;\n  padding-bottom: 5px;\n}\n\n.bjs-breadcrumbs li a {\n  cursor: pointer;\n  color: var(--breadcrumbs-item-color);\n}\n\n.bjs-breadcrumbs li:last-of-type a {\n  color: inherit;\n  cursor: default;\n}\n\n.bjs-breadcrumbs li:not(:first-child)::before {\n  content: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"17\" height=\"17\" viewBox=\"0 0 24 24\"><path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\" /><path d=\"M0 0h24v24H0z\" fill=\"none\" /></svg>');\n  padding: 0 8px;\n  color: var(--breadcrumbs-arrow-color);\n  height: 1em;\n}\n\n.bjs-breadcrumbs .bjs-crumb {\n  display: inline-block;\n  max-width: 200px;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.bjs-drilldown {\n  width: 20px;\n  height: 20px;\n\n  padding: 0px;\n  margin-left: -20px;\n\n  cursor: pointer;\n  border: none;\n  border-radius: 2px;\n  outline: none;\n\n  fill: var(--drilldown-fill-color);\n  background-color: var(--drilldown-background-color);\n}\n\n.bjs-drilldown-empty {\n  display: none;\n}\n\n.selected .bjs-drilldown-empty {\n  display: inherit;\n}\n\n[data-popup=\"align-elements\"] .djs-popup-results {\n  display: flex;\n}\n\n[data-popup=\"align-elements\"] .djs-popup-body [data-group] + [data-group] {\n  border-left: 1px solid var(--popup-border-color);\n}\n\n[data-popup=\"align-elements\"] [data-group=\"align\"] {\n  display: grid;\n  grid-template-columns: repeat(3, 1fr);\n}\n\n[data-popup=\"align-elements\"] .djs-popup-body .entry {\n  padding: 6px 8px;\n}\n\n[data-popup=\"align-elements\"] .djs-popup-body .entry:not(:first-child) {\n  margin-top: 0;\n}\n\n[data-popup=\"align-elements\"] .djs-popup-entry-icon {\n  display: block;\n  margin: 0;\n  height: 20px;\n  width: 20px;\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bpmnjs/assets/diagram-js.css",
    "content": "/**\n * color definitions\n */\n.djs-parent {\n  --color-grey-225-10-15: hsl(225, 10%, 15%);\n  --color-grey-225-10-35: hsl(225, 10%, 35%);\n  --color-grey-225-10-55: hsl(225, 10%, 55%);\n  --color-grey-225-10-75: hsl(225, 10%, 75%);\n  --color-grey-225-10-80: hsl(225, 10%, 80%);\n  --color-grey-225-10-85: hsl(225, 10%, 85%);\n  --color-grey-225-10-90: hsl(225, 10%, 90%);\n  --color-grey-225-10-95: hsl(225, 10%, 95%);\n  --color-grey-225-10-97: hsl(225, 10%, 97%);\n\n  --color-blue-205-100-45: hsl(205, 100%, 45%);\n  --color-blue-205-100-45-opacity-30: hsla(205, 100%, 45%, 30%);\n  --color-blue-205-100-50: hsl(205, 100%, 50%);\n  --color-blue-205-100-50-opacity-15: hsla(205, 100%, 50%, 15%);\n  --color-blue-205-100-70: hsl(205, 100%, 75%);\n  --color-blue-205-100-95: hsl(205, 100%, 95%);\n\n  --color-green-150-86-44: hsl(150, 86%, 44%);\n\n  --color-red-360-100-40: hsl(360, 100%, 40%);\n  --color-red-360-100-45: hsl(360, 100%, 45%);\n  --color-red-360-100-92: hsl(360, 100%, 92%);\n  --color-red-360-100-97: hsl(360, 100%, 97%);\n\n  --color-white: hsl(0, 0%, 100%);\n  --color-black: hsl(0, 0%, 0%);\n  --color-black-opacity-10: hsla(0, 0%, 0%, 10%);\n  --color-black-opacity-30: hsla(0, 0%, 0%, 30%);\n\n  --canvas-fill-color: var(--color-white);\n\n  --bendpoint-fill-color: var(--color-blue-205-100-45);\n  --bendpoint-stroke-color: var(--canvas-fill-color);\n\n  --context-pad-entry-background-color: var(--color-white);\n  --context-pad-entry-hover-background-color: var(--color-grey-225-10-95);\n\n  --element-dragger-color: var(--color-blue-205-100-50);\n  --element-hover-outline-fill-color: var(--color-blue-205-100-45);\n  --element-selected-outline-stroke-color: var(--color-blue-205-100-50);\n  --element-selected-outline-secondary-stroke-color: var(--color-blue-205-100-70);\n\n  --lasso-fill-color: var(--color-blue-205-100-50-opacity-15);\n  --lasso-stroke-color: var(--element-selected-outline-stroke-color);\n\n  --palette-entry-color: var(--color-grey-225-10-15);\n  --palette-entry-hover-color: var(--color-blue-205-100-45);\n  --palette-entry-selected-color: var(--color-blue-205-100-50);\n  --palette-separator-color: var(--color-grey-225-10-75);\n  --palette-toggle-hover-background-color: var(--color-grey-225-10-55);\n  --palette-background-color: var(--color-grey-225-10-97);\n  --palette-border-color: var(--color-grey-225-10-75);\n\n  --popup-font-size: 14px;\n  --popup-header-entry-selected-color: var(--color-blue-205-100-50);\n  --popup-header-font-weight: bolder;\n  --popup-background-color: var(--color-white);\n  --popup-border-color: transparent;\n  --popup-shadow-color: var(--color-black-opacity-30);\n  --popup-description-color: var(--color-grey-225-10-55);\n  --popup-no-results-color: var(--color-grey-225-10-55);\n  --popup-entry-title-color: var(--color-grey-225-10-55);\n  --popup-entry-hover-color:  var(--color-grey-225-10-95);\n  --popup-search-border-color: var(--color-grey-225-10-75);\n  --popup-search-focus-border-color: var(--color-blue-205-100-50);\n  --popup-search-focus-background-color: var(--color-blue-205-100-95);\n\n  --resizer-fill-color: var(--color-blue-205-100-45);\n  --resizer-stroke-color: var(--canvas-fill-color);\n\n  --search-container-background-color: var(--color-grey-225-10-97);\n  --search-container-border-color: var(--color-blue-205-100-50);\n  --search-container-box-shadow-color: var(--color-blue-205-100-95);\n  --search-container-box-shadow-inset-color: var(--color-grey-225-10-80);\n  --search-input-border-color: var(--color-grey-225-10-75);\n  --search-result-border-color: var(--color-grey-225-10-75);\n  --search-result-highlight-color: var(--color-black);\n  --search-result-selected-color: var(--color-blue-205-100-45-opacity-30);\n\n  --shape-attach-allowed-stroke-color: var(--color-blue-205-100-50);\n  --shape-connect-allowed-fill-color: var(--color-grey-225-10-97);\n  --shape-drop-allowed-fill-color: var(--color-grey-225-10-97);\n  --shape-drop-not-allowed-fill-color: var(--color-red-360-100-97);\n  --shape-resize-preview-stroke-color: var(--color-blue-205-100-50);\n\n  --snap-line-stroke-color: var(--color-blue-205-100-45-opacity-30);\n\n  --space-tool-crosshair-stroke-color: var(--color-black);\n\n  --tooltip-error-background-color: var(--color-red-360-100-97);\n  --tooltip-error-border-color: var(--color-red-360-100-45);\n  --tooltip-error-color: var(--color-red-360-100-45);\n}\n\n/**\n * outline styles\n */\n\n.djs-outline,\n.djs-selection-outline {\n  fill: none;\n  shape-rendering: geometricPrecision;\n  stroke-width: 2px;\n}\n\n.djs-outline {\n  visibility: hidden;\n}\n\n.djs-selection-outline {\n  stroke: var(--element-selected-outline-stroke-color);\n}\n\n.djs-element.selected .djs-outline {\n  visibility: visible;\n\n  stroke: var(--element-selected-outline-stroke-color);\n}\n\n.djs-multi-select .djs-element.selected .djs-outline {\n  stroke: var(--element-selected-outline-secondary-stroke-color);\n}\n\n.djs-shape.connect-ok .djs-visual > :nth-child(1) {\n  fill: var(--shape-connect-allowed-fill-color) !important;\n}\n\n.djs-shape.connect-not-ok .djs-visual > :nth-child(1),\n.djs-shape.drop-not-ok .djs-visual > :nth-child(1) {\n  fill: var(--shape-drop-not-allowed-fill-color) !important;\n}\n\n.djs-shape.new-parent .djs-visual > :nth-child(1) {\n  fill: var(--shape-drop-allowed-fill-color) !important;\n}\n\nsvg.drop-not-ok {\n  background: var(--shape-drop-not-allowed-fill-color) !important;\n}\n\nsvg.new-parent {\n  background: var(--shape-drop-allowed-fill-color) !important;\n}\n\n\n/* Override move cursor during drop and connect */\n.drop-not-ok,\n.connect-not-ok,\n.drop-not-ok *,\n.connect-not-ok * {\n  cursor: not-allowed !important;\n}\n\n.drop-ok,\n.connect-ok,\n.drop-ok *,\n.connect-ok * {\n  cursor: default !important;\n}\n\n.djs-element.attach-ok .djs-visual > :nth-child(1) {\n  stroke-width: 5px !important;\n  stroke: var(--shape-attach-allowed-stroke-color) !important;\n}\n\n.djs-frame.connect-not-ok .djs-visual > :nth-child(1),\n.djs-frame.drop-not-ok .djs-visual > :nth-child(1) {\n  stroke-width: 3px !important;\n  stroke: var(--shape-drop-not-allowed-fill-color) !important;\n  fill: none !important;\n}\n\n/**\n* Selection box style\n*\n*/\n.djs-lasso-overlay {\n  fill: var(--lasso-fill-color);\n  stroke: var(--lasso-stroke-color);\n  stroke-width: 2px;\n  shape-rendering: geometricPrecision;\n  pointer-events: none;\n}\n\n/**\n * Resize styles\n */\n.djs-resize-overlay {\n  fill: none;\n\n  stroke-dasharray: 5 1 3 1;\n  stroke: var(--shape-resize-preview-stroke-color);\n\n  pointer-events: none;\n}\n\n.djs-resizer-hit {\n  fill: none;\n  pointer-events: all;\n}\n\n.djs-resizer-visual {\n  fill: var(--resizer-fill-color);\n  stroke-width: 1px;\n  stroke: var(--resizer-stroke-color);\n  shape-rendering: geometricPrecision;\n}\n\n.djs-resizer:hover .djs-resizer-visual {\n  stroke: var(--resizer-stroke-color);\n  stroke-opacity: 1;\n}\n\n.djs-cursor-resize-ns,\n.djs-resizer-n,\n.djs-resizer-s {\n  cursor: ns-resize;\n}\n\n.djs-cursor-resize-ew,\n.djs-resizer-e,\n.djs-resizer-w {\n  cursor: ew-resize;\n}\n\n.djs-cursor-resize-nwse,\n.djs-resizer-nw,\n.djs-resizer-se {\n  cursor: nwse-resize;\n}\n\n.djs-cursor-resize-nesw,\n.djs-resizer-ne,\n.djs-resizer-sw {\n  cursor: nesw-resize;\n}\n\n.djs-shape.djs-resizing > .djs-outline {\n  visibility: hidden !important;\n}\n\n.djs-shape.djs-resizing > .djs-resizer {\n  visibility: hidden;\n}\n\n.djs-dragger > .djs-resizer {\n  visibility: hidden;\n}\n\n/**\n * drag styles\n */\n.djs-dragger * {\n  fill: none !important;\n  stroke: var(--element-dragger-color) !important;\n}\n\n.djs-dragger tspan,\n.djs-dragger text {\n  fill: var(--element-dragger-color) !important;\n  stroke: none !important;\n}\n\nmarker.djs-dragger circle,\nmarker.djs-dragger path,\nmarker.djs-dragger polygon,\nmarker.djs-dragger polyline,\nmarker.djs-dragger rect {\n  fill: var(--element-dragger-color) !important;\n  stroke: none !important;\n}\n\nmarker.djs-dragger text,\nmarker.djs-dragger tspan {\n  fill: none !important;\n  stroke: var(--element-dragger-color) !important;\n}\n\n.djs-dragging {\n  opacity: 0.3;\n}\n\n.djs-dragging,\n.djs-dragging > * {\n  pointer-events: none !important;\n}\n\n.djs-dragging .djs-context-pad,\n.djs-dragging .djs-outline {\n  display: none !important;\n}\n\n/**\n * no pointer events for visual\n */\n.djs-visual,\n.djs-outline {\n  pointer-events: none;\n}\n\n.djs-element.attach-ok .djs-hit {\n  stroke-width: 60px !important;\n}\n\n/**\n * all pointer events for hit shape\n */\n.djs-element > .djs-hit-all,\n.djs-element > .djs-hit-no-move {\n  pointer-events: all;\n}\n\n.djs-element > .djs-hit-stroke,\n.djs-element > .djs-hit-click-stroke {\n  pointer-events: stroke;\n}\n\n/**\n * shape / connection basic styles\n */\n.djs-connection .djs-visual {\n  stroke-width: 2px;\n  fill: none;\n}\n\n.djs-cursor-grab {\n  cursor: -webkit-grab;\n  cursor: -moz-grab;\n  cursor: grab;\n}\n\n.djs-cursor-grabbing {\n  cursor: -webkit-grabbing;\n  cursor: -moz-grabbing;\n  cursor: grabbing;\n}\n\n.djs-cursor-crosshair {\n  cursor: crosshair;\n}\n\n.djs-cursor-move {\n  cursor: move;\n}\n\n.djs-cursor-resize-ns {\n  cursor: ns-resize;\n}\n\n.djs-cursor-resize-ew {\n  cursor: ew-resize;\n}\n\n\n/**\n * snapping\n */\n.djs-snap-line {\n  stroke: var(--snap-line-stroke-color);\n  stroke-linecap: round;\n  stroke-width: 2px;\n  pointer-events: none;\n}\n\n/**\n * snapping\n */\n.djs-crosshair {\n  stroke: var(--space-tool-crosshair-stroke-color);\n  stroke-linecap: round;\n  stroke-width: 1px;\n  pointer-events: none;\n  shape-rendering: geometricPrecision;\n  stroke-dasharray: 5, 5;\n}\n\n/**\n * palette\n */\n\n.djs-palette {\n  position: absolute;\n  left: 20px;\n  top: 20px;\n\n  box-sizing: border-box;\n  width: 48px;\n}\n\n.djs-palette .separator {\n  margin: 5px;\n  padding-top: 5px;\n\n  border: none;\n  border-bottom: solid 1px var(--palette-separator-color);\n\n  clear: both;\n}\n\n.djs-palette .entry:before {\n  vertical-align: initial;\n}\n\n.djs-palette .djs-palette-toggle {\n  cursor: pointer;\n}\n\n.djs-palette .entry,\n.djs-palette .djs-palette-toggle {\n  color: var(--palette-entry-color);\n  font-size: 30px;\n\n  text-align: center;\n}\n\n.djs-palette .entry {\n  float: left;\n}\n\n.djs-palette .entry img {\n  max-width: 100%;\n}\n\n.djs-palette .djs-palette-entries:after {\n  content: '';\n  display: table;\n  clear: both;\n}\n\n.djs-palette .djs-palette-toggle:hover {\n  background: var(--palette-toggle-hover-background-color);\n}\n\n.djs-palette .entry:hover {\n  color: var(--palette-entry-hover-color);\n}\n\n.djs-palette .highlighted-entry {\n  color: var(--palette-entry-selected-color) !important;\n}\n\n.djs-palette .entry,\n.djs-palette .djs-palette-toggle {\n  width: 46px;\n  height: 46px;\n  line-height: 46px;\n  cursor: default;\n}\n\n/**\n * Palette open / two-column layout is controlled via\n * classes on the palette. Events to hook into palette\n * changed life-cycle are available in addition.\n */\n.djs-palette.two-column.open {\n  width: 94px;\n}\n\n.djs-palette:not(.open) .djs-palette-entries {\n  display: none;\n}\n\n.djs-palette:not(.open) {\n  overflow: hidden;\n}\n\n.djs-palette.open .djs-palette-toggle {\n  display: none;\n}\n\n/**\n * context-pad\n */\n.djs-overlay-context-pad {\n  width: 72px;\n  z-index: 100;\n}\n\n.djs-context-pad {\n  position: absolute;\n  display: none;\n  pointer-events: none;\n  line-height: 1;\n}\n\n.djs-context-pad .entry {\n  width: 22px;\n  height: 22px;\n  text-align: center;\n  display: inline-block;\n  font-size: 22px;\n  margin: 0 2px 2px 0;\n\n  border-radius: 3px;\n\n  cursor: default;\n\n  background-color: var(--context-pad-entry-background-color);\n  box-shadow: 0 0 2px 1px var(--context-pad-entry-background-color);\n  pointer-events: all;\n  vertical-align: middle;\n}\n\n.djs-context-pad .entry:hover {\n  background: var(--context-pad-entry-hover-background-color);\n}\n\n.djs-context-pad.open {\n  display: block;\n}\n\n/**\n * popup styles\n */\n.djs-popup-backdrop {\n  position: fixed;\n  width: 100vw;\n  height: 100vh;\n  top: 0;\n  left: 0;\n  z-index: 200;\n  line-height: 1;\n  font-family: \"IBM Plex Sans\", sans-serif;\n}\n\n.djs-popup {\n  box-sizing: border-box;\n  width: min-content;\n  background: var(--popup-background-color);\n  overflow: hidden;\n  position: absolute;\n\n  box-shadow: 0px 2px 6px var(--popup-shadow-color);\n  border: solid 1px var(--popup-border-color);\n  min-width: 120px;\n  outline: none;\n  font-size: var(--popup-font-size);\n}\n\n.djs-popup-search input {\n  width: 100%;\n  box-sizing: border-box;\n  font-size: var(--popup-font-size);\n  padding: 3px 6px;\n  border-radius: 2px;\n  border: solid 1px var(--popup-search-border-color);\n  line-height: 21px;\n}\n\n.djs-popup-search input:focus {\n  background-color: var(--popup-search-focus-background-color);\n  border: solid 1px var(--popup-search-focus-border-color);\n  outline: none;\n}\n\n.djs-popup-header {\n  display: flex;\n  align-items: stretch;\n  line-height: 20px;\n  margin: 10px 12px 10px 12px;\n}\n\n.djs-popup-header .entry {\n  border-radius: 2px;\n}\n\n.djs-popup-header .entry.active {\n  color: var(--popup-header-entry-selected-color);\n}\n\n.djs-popup-header .entry.disabled {\n  color: inherit;\n}\n\n.djs-popup-search {\n  margin: 10px 12px;\n}\n\n.djs-popup-title {\n  font-size: var(--popup-font-size);\n  font-weight: var(--popup-header-font-weight);\n  flex: 1;\n  margin: 0;\n}\n\n.djs-popup-search {\n  position: relative;\n  width: auto;\n}\n\n.djs-popup-search-icon {\n  position: absolute;\n  left: 8px;\n  top: 7px;\n}\n\n.djs-popup-search input {\n  padding-left: 25px;\n}\n\n.djs-popup-results {\n  margin: 7px 3px 7px 12px;\n  list-style: none;\n  max-height: 280px;\n  overflow: auto;\n  padding-right: 9px;\n}\n\n.djs-popup-group {\n  margin: 0;\n  padding: 0;\n  width: 100%;\n}\n\n.djs-popup-body .entry,\n.djs-popup-body .entry-header {\n  padding: 5px 7px;\n  cursor: default;\n  border-radius: 4px;\n}\n\n.djs-popup-body .entry-header {\n  font-weight: var(--popup-header-font-weight);\n  color: var(--popup-entry-title-color);\n  padding-left: 0;\n}\n\n.djs-popup [class*=\"icon\"] .djs-popup-label,\n.djs-popup-label:not(:first-child) {\n  margin-left: .5em;\n}\n\n.djs-popup [class*=\"icon\"]:before,\n.djs-popup-entry-icon {\n  width: 1em;\n  height: 1em;\n  display: inline-block;\n  font-size: 1.4em;\n  vertical-align: middle;\n}\n\n.djs-popup-body .entry-header:not(:first-child) {\n  margin-top: 8px;\n  margin-bottom: 2px;\n}\n\n.djs-popup-body .entry {\n  display: flex;\n  flex-direction: row;\n  align-items: stretch;\n  height: min-content;\n}\n\n.djs-popup .entry.selected {\n  background-color: var(--popup-entry-hover-color);\n}\n\n.djs-popup-body .entry:not(:first-child) {\n  margin-top: 2px;\n}\n\n.djs-popup-entry-content {\n  display: flex;\n  flex-direction: column;\n  flex: 1;\n  overflow: hidden;\n}\n\n.djs-popup-entry-description {\n  color: var(--popup-description-color);\n}\n\n.djs-popup-label,\n.djs-popup-entry-description {\n  line-height: 1.4em;\n}\n\n.djs-popup-title,\n.djs-popup-label,\n.djs-popup-entry-description,\n.djs-popup .entry-header {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.djs-popup-entry-name {\n  display: flex;\n}\n\n.entry-content {\n  display: flex;\n  flex-direction: column;\n  flex: 1;\n  overflow: hidden;\n}\n\n.djs-popup-body {\n  flex-direction: column;\n  width: auto;\n}\n\n.djs-popup *::-webkit-scrollbar {\n  width: 6px;\n}\n\n.djs-popup *::-webkit-scrollbar-thumb {\n  border-radius: 3px;\n  background-color: rgba(0, 0, 0, 0.2);\n}\n\n.djs-popup *::-webkit-scrollbar-track {\n  box-shadow: none;\n  background: transparent;\n  margin: 0;\n  padding: 5px;\n}\n\n.djs-popup-no-results {\n  padding: 0 12px 12px 12px;\n  color: var(--popup-no-results-color);\n}\n\n.djs-popup-entry-docs {\n  flex: 0;\n  flex-direction: row;\n  align-items: center;\n  padding-left: 5px;\n  display: none;\n}\n\n.djs-popup-body .entry:hover .djs-popup-entry-docs {\n  display: flex;\n}\n\n.djs-popup-entry-docs svg {\n  vertical-align: middle;\n  margin: auto 2px auto 5px;\n}\n\n/**\n *  palette styles\n */\n.djs-palette {\n  background: var(--palette-background-color);\n  border: solid 1px var(--palette-border-color);\n  border-radius: 2px;\n}\n\n/**\n * touch\n */\n\n.djs-shape,\n.djs-connection {\n  touch-action: none;\n}\n\n.djs-segment-dragger,\n.djs-bendpoint {\n  display: none;\n}\n\n/**\n * bendpoints\n */\n.djs-segment-dragger .djs-visual {\n  display: none;\n\n  fill: var(--bendpoint-fill-color);\n  stroke: var(--bendpoint-stroke-color);\n  stroke-width: 1px;\n  stroke-opacity: 1;\n}\n\n.djs-segment-dragger:hover .djs-visual {\n  display: block;\n}\n\n.djs-bendpoint .djs-visual {\n  fill: var(--bendpoint-fill-color);\n  stroke: var(--bendpoint-stroke-color);\n  stroke-width: 1px;\n}\n\n.djs-segment-dragger:hover,\n.djs-bendpoints.hover .djs-segment-dragger,\n.djs-bendpoints.selected .djs-segment-dragger,\n.djs-bendpoint:hover,\n.djs-bendpoints.hover .djs-bendpoint,\n.djs-bendpoints.selected .djs-bendpoint {\n  display: block;\n}\n\n.djs-drag-active .djs-bendpoints * {\n  display: none;\n}\n\n.djs-bendpoints:not(.hover) .floating {\n  display: none;\n}\n\n.djs-segment-dragger:hover .djs-visual,\n.djs-segment-dragger.djs-dragging .djs-visual,\n.djs-bendpoint:hover .djs-visual,\n.djs-bendpoint.floating .djs-visual {\n  fill: var(--bendpoint-fill-color);\n  stroke: var(--bendpoint-stroke-color);\n  stroke-opacity: 1;\n}\n\n.djs-bendpoint.floating .djs-hit {\n  pointer-events: none;\n}\n\n.djs-segment-dragger .djs-hit,\n.djs-bendpoint .djs-hit {\n  fill: none;\n  pointer-events: all;\n}\n\n.djs-segment-dragger.horizontal .djs-hit {\n  cursor: ns-resize;\n}\n\n.djs-segment-dragger.vertical .djs-hit {\n  cursor: ew-resize;\n}\n\n.djs-segment-dragger.djs-dragging .djs-hit {\n  pointer-events: none;\n}\n\n.djs-updating,\n.djs-updating > * {\n  pointer-events: none !important;\n}\n\n.djs-updating .djs-context-pad,\n.djs-updating .djs-outline,\n.djs-updating .djs-bendpoint,\n.djs-multi-select .djs-bendpoint,\n.djs-multi-select .djs-segment-dragger,\n.connect-ok .djs-bendpoint,\n.connect-not-ok .djs-bendpoint,\n.drop-ok .djs-bendpoint,\n.drop-not-ok .djs-bendpoint {\n  display: none !important;\n}\n\n.djs-segment-dragger.djs-dragging,\n.djs-bendpoint.djs-dragging {\n  display: block;\n  opacity: 1.0;\n}\n\n\n/**\n * tooltips\n */\n.djs-tooltip-error {\n  width: 160px;\n  padding: 6px;\n\n  background: var(--tooltip-error-background-color);\n  border: solid 1px var(--tooltip-error-border-color);\n  border-radius: 2px;\n  color: var(--tooltip-error-color);\n  font-size: 12px;\n  line-height: 16px;\n\n  opacity: 0.75;\n}\n\n.djs-tooltip-error:hover {\n  opacity: 1;\n}\n\n\n/**\n * search pad\n */\n.djs-search-container {\n  position: absolute;\n  top: 20px;\n  left: 0;\n  right: 0;\n  margin-left: auto;\n  margin-right: auto;\n\n  width: 25%;\n  min-width: 300px;\n  max-width: 400px;\n  z-index: 10;\n\n  font-size: 1.05em;\n  opacity: 0.9;\n  background: var(--search-container-background-color);\n  border: solid 1px var(--search-container-border-color);\n  border-radius: 2px;\n  box-shadow: 0 0 0 2px var(--search-container-box-shadow-color), 0 0 0 1px var(--search-container-box-shadow-inset-color) inset;\n}\n\n.djs-search-container:not(.open) {\n  display: none;\n}\n\n.djs-search-input input {\n  font-size: 1.05em;\n  width: 100%;\n  padding: 6px 10px;\n  border: 1px solid var(--search-input-border-color);\n  box-sizing: border-box;\n}\n\n.djs-search-input input:focus {\n  outline: none;\n  border-color: var(--search-input-border-color);\n}\n\n.djs-search-results {\n  position: relative;\n  overflow-y: auto;\n  max-height: 200px;\n}\n\n.djs-search-results:hover {\n  cursor: pointer;\n}\n\n.djs-search-result {\n  width: 100%;\n  padding: 6px 10px;\n  background: white;\n  border-bottom: solid 1px var(--search-result-border-color);\n  border-radius: 1px;\n}\n\n.djs-search-highlight {\n  color: var(--search-result-highlight-color);\n}\n\n.djs-search-result-primary {\n  margin: 0 0 10px;\n}\n\n.djs-search-result-secondary {\n  font-family: monospace;\n  margin: 0;\n}\n\n.djs-search-result:hover {\n  background: var(--search-result-selected-color);\n}\n\n.djs-search-result-selected {\n  background: var(--search-result-selected-color);\n}\n\n.djs-search-result-selected:hover {\n  background: var(--search-result-selected-color);\n}\n\n.djs-search-overlay {\n  background: var(--search-result-selected-color);\n}\n\n/**\n * hidden styles\n */\n.djs-element-hidden,\n.djs-element-hidden .djs-hit,\n.djs-element-hidden .djs-outline,\n.djs-label-hidden .djs-label {\n  display: none !important;\n}\n\n.djs-element .djs-hit-stroke,\n.djs-element .djs-hit-click-stroke,\n.djs-element .djs-hit-all {\n  cursor: move;\n}"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bpmnjs/bpmn-modeler.development.js",
    "content": "/*!\n * bpmn-js - bpmn-modeler v13.2.1\n *\n * Copyright (c) 2014-present, camunda Services GmbH\n *\n * Released under the bpmn.io license\n * http://bpmn.io/license\n *\n * Source Code: https://github.com/bpmn-io/bpmn-js\n *\n * Date: 2023-08-05\n */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n  typeof define === 'function' && define.amd ? define(factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.BpmnModeler = factory());\n})(this, (function () { 'use strict';\n\n  function e$3(e,t){t&&(e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}));}\n\n  function createCommonjsModule(fn, module) {\n  \treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n  }\n\n  var hat_1 = createCommonjsModule(function (module) {\n  var hat = module.exports = function (bits, base) {\n      if (!base) base = 16;\n      if (bits === undefined) bits = 128;\n      if (bits <= 0) return '0';\n      \n      var digits = Math.log(Math.pow(2, bits)) / Math.log(base);\n      for (var i = 2; digits === Infinity; i *= 2) {\n          digits = Math.log(Math.pow(2, bits / i)) / Math.log(base) * i;\n      }\n      \n      var rem = digits - Math.floor(digits);\n      \n      var res = '';\n      \n      for (var i = 0; i < Math.floor(digits); i++) {\n          var x = Math.floor(Math.random() * base).toString(base);\n          res = x + res;\n      }\n      \n      if (rem) {\n          var b = Math.pow(base, rem);\n          var x = Math.floor(Math.random() * b).toString(base);\n          res = x + res;\n      }\n      \n      var parsed = parseInt(res, base);\n      if (parsed !== Infinity && parsed >= Math.pow(2, bits)) {\n          return hat(bits, base)\n      }\n      else return res;\n  };\n\n  hat.rack = function (bits, base, expandBy) {\n      var fn = function (data) {\n          var iters = 0;\n          do {\n              if (iters ++ > 10) {\n                  if (expandBy) bits += expandBy;\n                  else throw new Error('too many ID collisions, use more bits')\n              }\n              \n              var id = hat(bits, base);\n          } while (Object.hasOwnProperty.call(hats, id));\n          \n          hats[id] = data;\n          return id;\n      };\n      var hats = fn.hats = {};\n      \n      fn.get = function (id) {\n          return fn.hats[id];\n      };\n      \n      fn.set = function (id, value) {\n          fn.hats[id] = value;\n          return fn;\n      };\n      \n      fn.bits = bits || 128;\n      fn.base = base || 16;\n      return fn;\n  };\n  });\n\n  /**\n   * Create a new id generator / cache instance.\n   *\n   * You may optionally provide a seed that is used internally.\n   *\n   * @param {Seed} seed\n   */\n\n  function Ids(seed) {\n    if (!(this instanceof Ids)) {\n      return new Ids(seed);\n    }\n\n    seed = seed || [128, 36, 1];\n    this._seed = seed.length ? hat_1.rack(seed[0], seed[1], seed[2]) : seed;\n  }\n  /**\n   * Generate a next id.\n   *\n   * @param {Object} [element] element to bind the id to\n   *\n   * @return {String} id\n   */\n\n  Ids.prototype.next = function (element) {\n    return this._seed(element || true);\n  };\n  /**\n   * Generate a next id with a given prefix.\n   *\n   * @param {Object} [element] element to bind the id to\n   *\n   * @return {String} id\n   */\n\n\n  Ids.prototype.nextPrefixed = function (prefix, element) {\n    var id;\n\n    do {\n      id = prefix + this.next(true);\n    } while (this.assigned(id)); // claim {prefix}{random}\n\n\n    this.claim(id, element); // return\n\n    return id;\n  };\n  /**\n   * Manually claim an existing id.\n   *\n   * @param {String} id\n   * @param {String} [element] element the id is claimed by\n   */\n\n\n  Ids.prototype.claim = function (id, element) {\n    this._seed.set(id, element || true);\n  };\n  /**\n   * Returns true if the given id has already been assigned.\n   *\n   * @param  {String} id\n   * @return {Boolean}\n   */\n\n\n  Ids.prototype.assigned = function (id) {\n    return this._seed.get(id) || false;\n  };\n  /**\n   * Unclaim an id.\n   *\n   * @param  {String} id the id to unclaim\n   */\n\n\n  Ids.prototype.unclaim = function (id) {\n    delete this._seed.hats[id];\n  };\n  /**\n   * Clear all claimed ids.\n   */\n\n\n  Ids.prototype.clear = function () {\n    var hats = this._seed.hats,\n        id;\n\n    for (id in hats) {\n      this.unclaim(id);\n    }\n  };\n\n  /**\n   * Flatten array, one level deep.\n   *\n   * @template T\n   *\n   * @param {T[][]} arr\n   *\n   * @return {T[]}\n   */\n  function flatten(arr) {\n    return Array.prototype.concat.apply([], arr);\n  }\n\n  const nativeToString$1 = Object.prototype.toString;\n  const nativeHasOwnProperty$1 = Object.prototype.hasOwnProperty;\n\n  function isUndefined$2(obj) {\n    return obj === undefined;\n  }\n\n  function isDefined(obj) {\n    return obj !== undefined;\n  }\n\n  function isNil(obj) {\n    return obj == null;\n  }\n\n  function isArray$3(obj) {\n    return nativeToString$1.call(obj) === '[object Array]';\n  }\n\n  function isObject(obj) {\n    return nativeToString$1.call(obj) === '[object Object]';\n  }\n\n  function isNumber(obj) {\n    return nativeToString$1.call(obj) === '[object Number]';\n  }\n\n  /**\n   * @param {any} obj\n   *\n   * @return {boolean}\n   */\n  function isFunction(obj) {\n    const tag = nativeToString$1.call(obj);\n\n    return (\n      tag === '[object Function]' ||\n      tag === '[object AsyncFunction]' ||\n      tag === '[object GeneratorFunction]' ||\n      tag === '[object AsyncGeneratorFunction]' ||\n      tag === '[object Proxy]'\n    );\n  }\n\n  function isString(obj) {\n    return nativeToString$1.call(obj) === '[object String]';\n  }\n\n\n  /**\n   * Ensure collection is an array.\n   *\n   * @param {Object} obj\n   */\n  function ensureArray(obj) {\n\n    if (isArray$3(obj)) {\n      return;\n    }\n\n    throw new Error('must supply array');\n  }\n\n  /**\n   * Return true, if target owns a property with the given key.\n   *\n   * @param {Object} target\n   * @param {String} key\n   *\n   * @return {Boolean}\n   */\n  function has$1(target, key) {\n    return nativeHasOwnProperty$1.call(target, key);\n  }\n\n  /**\n   * @template T\n   * @typedef { (\n   *   ((e: T) => boolean) |\n   *   ((e: T, idx: number) => boolean) |\n   *   ((e: T, key: string) => boolean) |\n   *   string |\n   *   number\n   * ) } Matcher\n   */\n\n  /**\n   * @template T\n   * @template U\n   *\n   * @typedef { (\n   *   ((e: T) => U) | string | number\n   * ) } Extractor\n   */\n\n\n  /**\n   * @template T\n   * @typedef { (val: T, key: any) => boolean } MatchFn\n   */\n\n  /**\n   * @template T\n   * @typedef { T[] } ArrayCollection\n   */\n\n  /**\n   * @template T\n   * @typedef { { [key: string]: T } } StringKeyValueCollection\n   */\n\n  /**\n   * @template T\n   * @typedef { { [key: number]: T } } NumberKeyValueCollection\n   */\n\n  /**\n   * @template T\n   * @typedef { StringKeyValueCollection<T> | NumberKeyValueCollection<T> } KeyValueCollection\n   */\n\n  /**\n   * @template T\n   * @typedef { KeyValueCollection<T> | ArrayCollection<T> } Collection\n   */\n\n  /**\n   * Find element in collection.\n   *\n   * @template T\n   * @param {Collection<T>} collection\n   * @param {Matcher<T>} matcher\n   *\n   * @return {Object}\n   */\n  function find(collection, matcher) {\n\n    const matchFn = toMatcher(matcher);\n\n    let match;\n\n    forEach$1(collection, function(val, key) {\n      if (matchFn(val, key)) {\n        match = val;\n\n        return false;\n      }\n    });\n\n    return match;\n\n  }\n\n\n  /**\n   * Find element index in collection.\n   *\n   * @template T\n   * @param {Collection<T>} collection\n   * @param {Matcher<T>} matcher\n   *\n   * @return {number}\n   */\n  function findIndex(collection, matcher) {\n\n    const matchFn = toMatcher(matcher);\n\n    let idx = isArray$3(collection) ? -1 : undefined;\n\n    forEach$1(collection, function(val, key) {\n      if (matchFn(val, key)) {\n        idx = key;\n\n        return false;\n      }\n    });\n\n    return idx;\n  }\n\n\n  /**\n   * Filter elements in collection.\n   *\n   * @template T\n   * @param {Collection<T>} collection\n   * @param {Matcher<T>} matcher\n   *\n   * @return {T[]} result\n   */\n  function filter(collection, matcher) {\n\n    const matchFn = toMatcher(matcher);\n\n    let result = [];\n\n    forEach$1(collection, function(val, key) {\n      if (matchFn(val, key)) {\n        result.push(val);\n      }\n    });\n\n    return result;\n  }\n\n\n  /**\n   * Iterate over collection; returning something\n   * (non-undefined) will stop iteration.\n   *\n   * @template T\n   * @param {Collection<T>} collection\n   * @param { ((item: T, idx: number) => (boolean|void)) | ((item: T, key: string) => (boolean|void)) } iterator\n   *\n   * @return {T} return result that stopped the iteration\n   */\n  function forEach$1(collection, iterator) {\n\n    let val,\n        result;\n\n    if (isUndefined$2(collection)) {\n      return;\n    }\n\n    const convertKey = isArray$3(collection) ? toNum$1 : identity$1;\n\n    for (let key in collection) {\n\n      if (has$1(collection, key)) {\n        val = collection[key];\n\n        result = iterator(val, convertKey(key));\n\n        if (result === false) {\n          return val;\n        }\n      }\n    }\n  }\n\n  /**\n   * Return collection without element.\n   *\n   * @template T\n   * @param {ArrayCollection<T>} arr\n   * @param {Matcher<T>} matcher\n   *\n   * @return {T[]}\n   */\n  function without(arr, matcher) {\n\n    if (isUndefined$2(arr)) {\n      return [];\n    }\n\n    ensureArray(arr);\n\n    const matchFn = toMatcher(matcher);\n\n    return arr.filter(function(el, idx) {\n      return !matchFn(el, idx);\n    });\n\n  }\n\n\n  /**\n   * Reduce collection, returning a single result.\n   *\n   * @template T\n   * @template V\n   *\n   * @param {Collection<T>} collection\n   * @param {(result: V, entry: T, index: any) => V} iterator\n   * @param {V} result\n   *\n   * @return {V} result returned from last iterator\n   */\n  function reduce(collection, iterator, result) {\n\n    forEach$1(collection, function(value, idx) {\n      result = iterator(result, value, idx);\n    });\n\n    return result;\n  }\n\n\n  /**\n   * Return true if every element in the collection\n   * matches the criteria.\n   *\n   * @param  {Object|Array} collection\n   * @param  {Function} matcher\n   *\n   * @return {Boolean}\n   */\n  function every(collection, matcher) {\n\n    return !!reduce(collection, function(matches, val, key) {\n      return matches && matcher(val, key);\n    }, true);\n  }\n\n\n  /**\n   * Return true if some elements in the collection\n   * match the criteria.\n   *\n   * @param  {Object|Array} collection\n   * @param  {Function} matcher\n   *\n   * @return {Boolean}\n   */\n  function some(collection, matcher) {\n\n    return !!find(collection, matcher);\n  }\n\n\n  /**\n   * Transform a collection into another collection\n   * by piping each member through the given fn.\n   *\n   * @param  {Object|Array}   collection\n   * @param  {Function} fn\n   *\n   * @return {Array} transformed collection\n   */\n  function map$1(collection, fn) {\n\n    let result = [];\n\n    forEach$1(collection, function(val, key) {\n      result.push(fn(val, key));\n    });\n\n    return result;\n  }\n\n\n  /**\n   * Get the collections keys.\n   *\n   * @param  {Object|Array} collection\n   *\n   * @return {Array}\n   */\n  function keys(collection) {\n    return collection && Object.keys(collection) || [];\n  }\n\n\n  /**\n   * Shorthand for `keys(o).length`.\n   *\n   * @param  {Object|Array} collection\n   *\n   * @return {Number}\n   */\n  function size(collection) {\n    return keys(collection).length;\n  }\n\n\n  /**\n   * Get the values in the collection.\n   *\n   * @param  {Object|Array} collection\n   *\n   * @return {Array}\n   */\n  function values(collection) {\n    return map$1(collection, (val) => val);\n  }\n\n\n  /**\n   * Group collection members by attribute.\n   *\n   * @param {Object|Array} collection\n   * @param {Extractor} extractor\n   *\n   * @return {Object} map with { attrValue => [ a, b, c ] }\n   */\n  function groupBy(collection, extractor, grouped = {}) {\n\n    extractor = toExtractor(extractor);\n\n    forEach$1(collection, function(val) {\n      let discriminator = extractor(val) || '_';\n\n      let group = grouped[discriminator];\n\n      if (!group) {\n        group = grouped[discriminator] = [];\n      }\n\n      group.push(val);\n    });\n\n    return grouped;\n  }\n\n\n  function uniqueBy(extractor, ...collections) {\n\n    extractor = toExtractor(extractor);\n\n    let grouped = {};\n\n    forEach$1(collections, (c) => groupBy(c, extractor, grouped));\n\n    let result = map$1(grouped, function(val, key) {\n      return val[0];\n    });\n\n    return result;\n  }\n\n\n  const unionBy = uniqueBy;\n\n\n\n  /**\n   * Sort collection by criteria.\n   *\n   * @template T\n   *\n   * @param {Collection<T>} collection\n   * @param {Extractor<T, number | string>} extractor\n   *\n   * @return {Array}\n   */\n  function sortBy(collection, extractor) {\n\n    extractor = toExtractor(extractor);\n\n    let sorted = [];\n\n    forEach$1(collection, function(value, key) {\n      let disc = extractor(value, key);\n\n      let entry = {\n        d: disc,\n        v: value\n      };\n\n      for (var idx = 0; idx < sorted.length; idx++) {\n        let { d } = sorted[idx];\n\n        if (disc < d) {\n          sorted.splice(idx, 0, entry);\n          return;\n        }\n      }\n\n      // not inserted, append (!)\n      sorted.push(entry);\n    });\n\n    return map$1(sorted, (e) => e.v);\n  }\n\n\n  /**\n   * Create an object pattern matcher.\n   *\n   * @example\n   *\n   * ```javascript\n   * const matcher = matchPattern({ id: 1 });\n   *\n   * let element = find(elements, matcher);\n   * ```\n   *\n   * @template T\n   *\n   * @param {T} pattern\n   *\n   * @return { (el: any) =>  boolean } matcherFn\n   */\n  function matchPattern(pattern) {\n\n    return function(el) {\n\n      return every(pattern, function(val, key) {\n        return el[key] === val;\n      });\n\n    };\n  }\n\n\n  /**\n   * @param {string | ((e: any) => any) } extractor\n   *\n   * @return { (e: any) => any }\n   */\n  function toExtractor(extractor) {\n\n    /**\n     * @satisfies { (e: any) => any }\n     */\n    return isFunction(extractor) ? extractor : (e) => {\n\n      // @ts-ignore: just works\n      return e[extractor];\n    };\n  }\n\n\n  /**\n   * @template T\n   * @param {Matcher<T>} matcher\n   *\n   * @return {MatchFn<T>}\n   */\n  function toMatcher(matcher) {\n    return isFunction(matcher) ? matcher : (e) => {\n      return e === matcher;\n    };\n  }\n\n\n  function identity$1(arg) {\n    return arg;\n  }\n\n  function toNum$1(arg) {\n    return Number(arg);\n  }\n\n  /* global setTimeout clearTimeout */\n\n  /**\n   * @typedef { {\n   *   (...args: any[]): any;\n   *   flush: () => void;\n   *   cancel: () => void;\n   * } } DebouncedFunction\n   */\n\n  /**\n   * Debounce fn, calling it only once if the given time\n   * elapsed between calls.\n   *\n   * Lodash-style the function exposes methods to `#clear`\n   * and `#flush` to control internal behavior.\n   *\n   * @param  {Function} fn\n   * @param  {Number} timeout\n   *\n   * @return {DebouncedFunction} debounced function\n   */\n  function debounce(fn, timeout) {\n\n    let timer;\n\n    let lastArgs;\n    let lastThis;\n\n    let lastNow;\n\n    function fire(force) {\n\n      let now = Date.now();\n\n      let scheduledDiff = force ? 0 : (lastNow + timeout) - now;\n\n      if (scheduledDiff > 0) {\n        return schedule(scheduledDiff);\n      }\n\n      fn.apply(lastThis, lastArgs);\n\n      clear();\n    }\n\n    function schedule(timeout) {\n      timer = setTimeout(fire, timeout);\n    }\n\n    function clear() {\n      if (timer) {\n        clearTimeout(timer);\n      }\n\n      timer = lastNow = lastArgs = lastThis = undefined;\n    }\n\n    function flush() {\n      if (timer) {\n        fire(true);\n      }\n\n      clear();\n    }\n\n    /**\n     * @type { DebouncedFunction }\n     */\n    function callback(...args) {\n      lastNow = Date.now();\n\n      lastArgs = args;\n      lastThis = this;\n\n      // ensure an execution is scheduled\n      if (!timer) {\n        schedule(timeout);\n      }\n    }\n\n    callback.flush = flush;\n    callback.cancel = clear;\n\n    return callback;\n  }\n\n  /**\n   * Bind function against target <this>.\n   *\n   * @param  {Function} fn\n   * @param  {Object}   target\n   *\n   * @return {Function} bound function\n   */\n  function bind$2(fn, target) {\n    return fn.bind(target);\n  }\n\n  /**\n   * Convenience wrapper for `Object.assign`.\n   *\n   * @param {Object} target\n   * @param {...Object} others\n   *\n   * @return {Object} the target\n   */\n  function assign$1(target, ...others) {\n    return Object.assign(target, ...others);\n  }\n\n  /**\n   * Pick properties from the given target.\n   *\n   * @template T\n   * @template {any[]} V\n   *\n   * @param {T} target\n   * @param {V} properties\n   *\n   * @return Pick<T, V>\n   */\n  function pick(target, properties) {\n\n    let result = {};\n\n    let obj = Object(target);\n\n    forEach$1(properties, function(prop) {\n\n      if (prop in obj) {\n        result[prop] = target[prop];\n      }\n    });\n\n    return result;\n  }\n\n  /**\n   * Pick all target properties, excluding the given ones.\n   *\n   * @template T\n   * @template {any[]} V\n   *\n   * @param {T} target\n   * @param {V} properties\n   *\n   * @return {Omit<T, V>} target\n   */\n  function omit(target, properties) {\n\n    let result = {};\n\n    let obj = Object(target);\n\n    forEach$1(obj, function(prop, key) {\n\n      if (properties.indexOf(key) === -1) {\n        result[key] = prop;\n      }\n    });\n\n    return result;\n  }\n\n  function _mergeNamespaces$1(n, m) {\n    m.forEach(function (e) {\n      e && typeof e !== 'string' && !Array.isArray(e) && Object.keys(e).forEach(function (k) {\n        if (k !== 'default' && !(k in n)) {\n          var d = Object.getOwnPropertyDescriptor(e, k);\n          Object.defineProperty(n, k, d.get ? d : {\n            enumerable: true,\n            get: function () { return e[k]; }\n          });\n        }\n      });\n    });\n    return Object.freeze(n);\n  }\n\n  /**\n   * Flatten array, one level deep.\n   *\n   * @param {Array<?>} arr\n   *\n   * @return {Array<?>}\n   */\n\n  const nativeToString = Object.prototype.toString;\n  const nativeHasOwnProperty = Object.prototype.hasOwnProperty;\n\n  function isUndefined$1(obj) {\n    return obj === undefined;\n  }\n\n  function isArray$2(obj) {\n    return nativeToString.call(obj) === '[object Array]';\n  }\n\n  /**\n   * Return true, if target owns a property with the given key.\n   *\n   * @param {Object} target\n   * @param {String} key\n   *\n   * @return {Boolean}\n   */\n  function has(target, key) {\n    return nativeHasOwnProperty.call(target, key);\n  }\n\n\n  /**\n   * Iterate over collection; returning something\n   * (non-undefined) will stop iteration.\n   *\n   * @param  {Array|Object} collection\n   * @param  {Function} iterator\n   *\n   * @return {Object} return result that stopped the iteration\n   */\n  function forEach(collection, iterator) {\n\n    let val,\n        result;\n\n    if (isUndefined$1(collection)) {\n      return;\n    }\n\n    const convertKey = isArray$2(collection) ? toNum : identity;\n\n    for (let key in collection) {\n\n      if (has(collection, key)) {\n        val = collection[key];\n\n        result = iterator(val, convertKey(key));\n\n        if (result === false) {\n          return val;\n        }\n      }\n    }\n  }\n\n\n  function identity(arg) {\n    return arg;\n  }\n\n  function toNum(arg) {\n    return Number(arg);\n  }\n\n  /**\n   * Assigns style attributes in a style-src compliant way.\n   *\n   * @param {Element} element\n   * @param {...Object} styleSources\n   *\n   * @return {Element} the element\n   */\n  function assign(element, ...styleSources) {\n    const target = element.style;\n\n    forEach(styleSources, function(style) {\n      if (!style) {\n        return;\n      }\n\n      forEach(style, function(value, key) {\n        target[key] = value;\n      });\n    });\n\n    return element;\n  }\n\n  /**\n   * Set attribute `name` to `val`, or get attr `name`.\n   *\n   * @param {Element} el\n   * @param {String} name\n   * @param {String} [val]\n   * @api public\n   */\n  function attr$1(el, name, val) {\n\n    // get\n    if (arguments.length == 2) {\n      return el.getAttribute(name);\n    }\n\n    // remove\n    if (val === null) {\n      return el.removeAttribute(name);\n    }\n\n    // set\n    el.setAttribute(name, val);\n\n    return el;\n  }\n\n  /**\n   * Taken from https://github.com/component/classes\n   *\n   * Without the component bits.\n   */\n\n  /**\n   * toString reference.\n   */\n\n  const toString$1 = Object.prototype.toString;\n\n  /**\n   * Wrap `el` in a `ClassList`.\n   *\n   * @param {Element} el\n   * @return {ClassList}\n   * @api public\n   */\n\n  function classes$1(el) {\n    return new ClassList$1(el);\n  }\n\n  /**\n   * Initialize a new ClassList for `el`.\n   *\n   * @param {Element} el\n   * @api private\n   */\n\n  function ClassList$1(el) {\n    if (!el || !el.nodeType) {\n      throw new Error('A DOM element reference is required');\n    }\n    this.el = el;\n    this.list = el.classList;\n  }\n\n  /**\n   * Add class `name` if not already present.\n   *\n   * @param {String} name\n   * @return {ClassList}\n   * @api public\n   */\n\n  ClassList$1.prototype.add = function(name) {\n    this.list.add(name);\n    return this;\n  };\n\n  /**\n   * Remove class `name` when present, or\n   * pass a regular expression to remove\n   * any which match.\n   *\n   * @param {String|RegExp} name\n   * @return {ClassList}\n   * @api public\n   */\n\n  ClassList$1.prototype.remove = function(name) {\n    if ('[object RegExp]' == toString$1.call(name)) {\n      return this.removeMatching(name);\n    }\n\n    this.list.remove(name);\n    return this;\n  };\n\n  /**\n   * Remove all classes matching `re`.\n   *\n   * @param {RegExp} re\n   * @return {ClassList}\n   * @api private\n   */\n\n  ClassList$1.prototype.removeMatching = function(re) {\n    const arr = this.array();\n    for (let i = 0; i < arr.length; i++) {\n      if (re.test(arr[i])) {\n        this.remove(arr[i]);\n      }\n    }\n    return this;\n  };\n\n  /**\n   * Toggle class `name`, can force state via `force`.\n   *\n   * For browsers that support classList, but do not support `force` yet,\n   * the mistake will be detected and corrected.\n   *\n   * @param {String} name\n   * @param {Boolean} force\n   * @return {ClassList}\n   * @api public\n   */\n\n  ClassList$1.prototype.toggle = function(name, force) {\n    if ('undefined' !== typeof force) {\n      if (force !== this.list.toggle(name, force)) {\n        this.list.toggle(name); // toggle again to correct\n      }\n    } else {\n      this.list.toggle(name);\n    }\n    return this;\n  };\n\n  /**\n   * Return an array of classes.\n   *\n   * @return {Array}\n   * @api public\n   */\n\n  ClassList$1.prototype.array = function() {\n    return Array.from(this.list);\n  };\n\n  /**\n   * Check if class `name` is present.\n   *\n   * @param {String} name\n   * @return {ClassList}\n   * @api public\n   */\n\n  ClassList$1.prototype.has =\n  ClassList$1.prototype.contains = function(name) {\n    return this.list.contains(name);\n  };\n\n  /**\n   * Remove all children from the given element.\n   */\n  function clear$1(el) {\n\n    var c;\n\n    while (el.childNodes.length) {\n      c = el.childNodes[0];\n      el.removeChild(c);\n    }\n\n    return el;\n  }\n\n  /**\n   * @param { HTMLElement } element\n   * @param { String } selector\n   *\n   * @return { boolean }\n   */\n  function matches(element, selector) {\n    return element && typeof element.matches === 'function' && element.matches(selector);\n  }\n\n  /**\n   * Closest\n   *\n   * @param {Element} el\n   * @param {String} selector\n   * @param {Boolean} checkYourSelf (optional)\n   */\n  function closest(element, selector, checkYourSelf) {\n    var currentElem = checkYourSelf ? element : element.parentNode;\n\n    while (currentElem && currentElem.nodeType !== document.DOCUMENT_NODE &&\n        currentElem.nodeType !== document.DOCUMENT_FRAGMENT_NODE) {\n\n      if (matches(currentElem, selector)) {\n        return currentElem;\n      }\n\n      currentElem = currentElem.parentNode;\n    }\n\n    return matches(currentElem, selector) ? currentElem : null;\n  }\n\n  var componentEvent = {};\n\n  var bind$1, unbind$1, prefix$6;\n\n  function detect () {\n    bind$1 = window.addEventListener ? 'addEventListener' : 'attachEvent';\n    unbind$1 = window.removeEventListener ? 'removeEventListener' : 'detachEvent';\n    prefix$6 = bind$1 !== 'addEventListener' ? 'on' : '';\n  }\n\n  /**\n   * Bind `el` event `type` to `fn`.\n   *\n   * @param {Element} el\n   * @param {String} type\n   * @param {Function} fn\n   * @param {Boolean} capture\n   * @return {Function}\n   * @api public\n   */\n\n  var bind_1 = componentEvent.bind = function(el, type, fn, capture){\n    if (!bind$1) detect();\n    el[bind$1](prefix$6 + type, fn, capture || false);\n    return fn;\n  };\n\n  /**\n   * Unbind `el` event `type`'s callback `fn`.\n   *\n   * @param {Element} el\n   * @param {String} type\n   * @param {Function} fn\n   * @param {Boolean} capture\n   * @return {Function}\n   * @api public\n   */\n\n  var unbind_1 = componentEvent.unbind = function(el, type, fn, capture){\n    if (!unbind$1) detect();\n    el[unbind$1](prefix$6 + type, fn, capture || false);\n    return fn;\n  };\n\n  var event = /*#__PURE__*/_mergeNamespaces$1({\n    __proto__: null,\n    bind: bind_1,\n    unbind: unbind_1,\n    'default': componentEvent\n  }, [componentEvent]);\n\n  /**\n   * Module dependencies.\n   */\n\n  /**\n   * Delegate event `type` to `selector`\n   * and invoke `fn(e)`. A callback function\n   * is returned which may be passed to `.unbind()`.\n   *\n   * @param {Element} el\n   * @param {String} selector\n   * @param {String} type\n   * @param {Function} fn\n   * @param {Boolean} capture\n   * @return {Function}\n   * @api public\n   */\n\n  // Some events don't bubble, so we want to bind to the capture phase instead\n  // when delegating.\n  var forceCaptureEvents = [ 'focus', 'blur' ];\n\n  function bind(el, selector, type, fn, capture) {\n    if (forceCaptureEvents.indexOf(type) !== -1) {\n      capture = true;\n    }\n\n    return event.bind(el, type, function(e) {\n      var target = e.target || e.srcElement;\n      e.delegateTarget = closest(target, selector, true);\n      if (e.delegateTarget) {\n        fn.call(el, e);\n      }\n    }, capture);\n  }\n\n  /**\n   * Unbind event `type`'s callback `fn`.\n   *\n   * @param {Element} el\n   * @param {String} type\n   * @param {Function} fn\n   * @param {Boolean} capture\n   * @api public\n   */\n  function unbind(el, type, fn, capture) {\n    if (forceCaptureEvents.indexOf(type) !== -1) {\n      capture = true;\n    }\n\n    return event.unbind(el, type, fn, capture);\n  }\n\n  var delegate = {\n    bind,\n    unbind\n  };\n\n  /**\n   * Expose `parse`.\n   */\n\n  var domify = parse$1;\n\n  /**\n   * Tests for browser support.\n   */\n\n  var innerHTMLBug = false;\n  var bugTestDiv;\n  if (typeof document !== 'undefined') {\n    bugTestDiv = document.createElement('div');\n    // Setup\n    bugTestDiv.innerHTML = '  <link/><table></table><a href=\"/a\">a</a><input type=\"checkbox\"/>';\n    // Make sure that link elements get serialized correctly by innerHTML\n    // This requires a wrapper element in IE\n    innerHTMLBug = !bugTestDiv.getElementsByTagName('link').length;\n    bugTestDiv = undefined;\n  }\n\n  /**\n   * Wrap map from jquery.\n   */\n\n  var map = {\n    legend: [1, '<fieldset>', '</fieldset>'],\n    tr: [2, '<table><tbody>', '</tbody></table>'],\n    col: [2, '<table><tbody></tbody><colgroup>', '</colgroup></table>'],\n    // for script/link/style tags to work in IE6-8, you have to wrap\n    // in a div with a non-whitespace character in front, ha!\n    _default: innerHTMLBug ? [1, 'X<div>', '</div>'] : [0, '', '']\n  };\n\n  map.td =\n  map.th = [3, '<table><tbody><tr>', '</tr></tbody></table>'];\n\n  map.option =\n  map.optgroup = [1, '<select multiple=\"multiple\">', '</select>'];\n\n  map.thead =\n  map.tbody =\n  map.colgroup =\n  map.caption =\n  map.tfoot = [1, '<table>', '</table>'];\n\n  map.polyline =\n  map.ellipse =\n  map.polygon =\n  map.circle =\n  map.text =\n  map.line =\n  map.path =\n  map.rect =\n  map.g = [1, '<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\">','</svg>'];\n\n  /**\n   * Parse `html` and return a DOM Node instance, which could be a TextNode,\n   * HTML DOM Node of some kind (<div> for example), or a DocumentFragment\n   * instance, depending on the contents of the `html` string.\n   *\n   * @param {String} html - HTML string to \"domify\"\n   * @param {Document} doc - The `document` instance to create the Node for\n   * @return {DOMNode} the TextNode, DOM Node, or DocumentFragment instance\n   * @api private\n   */\n\n  function parse$1(html, doc) {\n    if ('string' != typeof html) throw new TypeError('String expected');\n\n    // default to the global `document` object\n    if (!doc) doc = document;\n\n    // tag name\n    var m = /<([\\w:]+)/.exec(html);\n    if (!m) return doc.createTextNode(html);\n\n    html = html.replace(/^\\s+|\\s+$/g, ''); // Remove leading/trailing whitespace\n\n    var tag = m[1];\n\n    // body support\n    if (tag == 'body') {\n      var el = doc.createElement('html');\n      el.innerHTML = html;\n      return el.removeChild(el.lastChild);\n    }\n\n    // wrap map\n    var wrap = Object.prototype.hasOwnProperty.call(map, tag) ? map[tag] : map._default;\n    var depth = wrap[0];\n    var prefix = wrap[1];\n    var suffix = wrap[2];\n    var el = doc.createElement('div');\n    el.innerHTML = prefix + html + suffix;\n    while (depth--) el = el.lastChild;\n\n    // one element\n    if (el.firstChild == el.lastChild) {\n      return el.removeChild(el.firstChild);\n    }\n\n    // several elements\n    var fragment = doc.createDocumentFragment();\n    while (el.firstChild) {\n      fragment.appendChild(el.removeChild(el.firstChild));\n    }\n\n    return fragment;\n  }\n\n  var domify$1 = domify;\n\n  function query(selector, el) {\n    el = el || document;\n\n    return el.querySelector(selector);\n  }\n\n  function all(selector, el) {\n    el = el || document;\n\n    return el.querySelectorAll(selector);\n  }\n\n  function remove$2(el) {\n    el.parentNode && el.parentNode.removeChild(el);\n  }\n\n  function ensureImported(element, target) {\n\n    if (element.ownerDocument !== target.ownerDocument) {\n      try {\n\n        // may fail on webkit\n        return target.ownerDocument.importNode(element, true);\n      } catch (e) {\n\n        // ignore\n      }\n    }\n\n    return element;\n  }\n\n  /**\n   * appendTo utility\n   */\n\n  /**\n   * Append a node to a target element and return the appended node.\n   *\n   * @param  {SVGElement} element\n   * @param  {SVGElement} target\n   *\n   * @return {SVGElement} the appended node\n   */\n  function appendTo(element, target) {\n    return target.appendChild(ensureImported(element, target));\n  }\n\n  /**\n   * append utility\n   */\n\n  /**\n   * Append a node to an element\n   *\n   * @param  {SVGElement} element\n   * @param  {SVGElement} node\n   *\n   * @return {SVGElement} the element\n   */\n  function append(target, node) {\n    appendTo(node, target);\n    return target;\n  }\n\n  /**\n   * attribute accessor utility\n   */\n\n  var LENGTH_ATTR = 2;\n\n  var CSS_PROPERTIES = {\n    'alignment-baseline': 1,\n    'baseline-shift': 1,\n    'clip': 1,\n    'clip-path': 1,\n    'clip-rule': 1,\n    'color': 1,\n    'color-interpolation': 1,\n    'color-interpolation-filters': 1,\n    'color-profile': 1,\n    'color-rendering': 1,\n    'cursor': 1,\n    'direction': 1,\n    'display': 1,\n    'dominant-baseline': 1,\n    'enable-background': 1,\n    'fill': 1,\n    'fill-opacity': 1,\n    'fill-rule': 1,\n    'filter': 1,\n    'flood-color': 1,\n    'flood-opacity': 1,\n    'font': 1,\n    'font-family': 1,\n    'font-size': LENGTH_ATTR,\n    'font-size-adjust': 1,\n    'font-stretch': 1,\n    'font-style': 1,\n    'font-variant': 1,\n    'font-weight': 1,\n    'glyph-orientation-horizontal': 1,\n    'glyph-orientation-vertical': 1,\n    'image-rendering': 1,\n    'kerning': 1,\n    'letter-spacing': 1,\n    'lighting-color': 1,\n    'marker': 1,\n    'marker-end': 1,\n    'marker-mid': 1,\n    'marker-start': 1,\n    'mask': 1,\n    'opacity': 1,\n    'overflow': 1,\n    'pointer-events': 1,\n    'shape-rendering': 1,\n    'stop-color': 1,\n    'stop-opacity': 1,\n    'stroke': 1,\n    'stroke-dasharray': 1,\n    'stroke-dashoffset': 1,\n    'stroke-linecap': 1,\n    'stroke-linejoin': 1,\n    'stroke-miterlimit': 1,\n    'stroke-opacity': 1,\n    'stroke-width': LENGTH_ATTR,\n    'text-anchor': 1,\n    'text-decoration': 1,\n    'text-rendering': 1,\n    'unicode-bidi': 1,\n    'visibility': 1,\n    'word-spacing': 1,\n    'writing-mode': 1\n  };\n\n\n  function getAttribute(node, name) {\n    if (CSS_PROPERTIES[name]) {\n      return node.style[name];\n    } else {\n      return node.getAttributeNS(null, name);\n    }\n  }\n\n  function setAttribute(node, name, value) {\n    var hyphenated = name.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n\n    var type = CSS_PROPERTIES[hyphenated];\n\n    if (type) {\n\n      // append pixel unit, unless present\n      if (type === LENGTH_ATTR && typeof value === 'number') {\n        value = String(value) + 'px';\n      }\n\n      node.style[hyphenated] = value;\n    } else {\n      node.setAttributeNS(null, name, value);\n    }\n  }\n\n  function setAttributes(node, attrs) {\n\n    var names = Object.keys(attrs), i, name;\n\n    for (i = 0, name; (name = names[i]); i++) {\n      setAttribute(node, name, attrs[name]);\n    }\n  }\n\n  /**\n   * Gets or sets raw attributes on a node.\n   *\n   * @param  {SVGElement} node\n   * @param  {Object} [attrs]\n   * @param  {String} [name]\n   * @param  {String} [value]\n   *\n   * @return {String}\n   */\n  function attr(node, name, value) {\n    if (typeof name === 'string') {\n      if (value !== undefined) {\n        setAttribute(node, name, value);\n      } else {\n        return getAttribute(node, name);\n      }\n    } else {\n      setAttributes(node, name);\n    }\n\n    return node;\n  }\n\n  /**\r\n   * Taken from https://github.com/component/classes\r\n   *\r\n   * Without the component bits.\r\n   */\r\n\r\n  /**\r\n   * toString reference.\r\n   */\r\n\r\n  const toString = Object.prototype.toString;\r\n\r\n  /**\r\n    * Wrap `el` in a `ClassList`.\r\n    *\r\n    * @param {Element} el\r\n    * @return {ClassList}\r\n    * @api public\r\n    */\r\n\r\n  function classes(el) {\r\n    return new ClassList(el);\r\n  }\r\n\r\n  function ClassList(el) {\r\n    if (!el || !el.nodeType) {\r\n      throw new Error('A DOM element reference is required');\r\n    }\r\n    this.el = el;\r\n    this.list = el.classList;\r\n  }\r\n\r\n  /**\r\n    * Add class `name` if not already present.\r\n    *\r\n    * @param {String} name\r\n    * @return {ClassList}\r\n    * @api public\r\n    */\r\n\r\n  ClassList.prototype.add = function(name) {\r\n    this.list.add(name);\r\n    return this;\r\n  };\r\n\r\n  /**\r\n    * Remove class `name` when present, or\r\n    * pass a regular expression to remove\r\n    * any which match.\r\n    *\r\n    * @param {String|RegExp} name\r\n    * @return {ClassList}\r\n    * @api public\r\n    */\r\n\r\n  ClassList.prototype.remove = function(name) {\r\n    if ('[object RegExp]' == toString.call(name)) {\r\n      return this.removeMatching(name);\r\n    }\r\n\r\n    this.list.remove(name);\r\n    return this;\r\n  };\r\n\r\n  /**\r\n    * Remove all classes matching `re`.\r\n    *\r\n    * @param {RegExp} re\r\n    * @return {ClassList}\r\n    * @api private\r\n    */\r\n\r\n  ClassList.prototype.removeMatching = function(re) {\r\n    const arr = this.array();\r\n    for (let i = 0; i < arr.length; i++) {\r\n      if (re.test(arr[i])) {\r\n        this.remove(arr[i]);\r\n      }\r\n    }\r\n    return this;\r\n  };\r\n\r\n  /**\r\n    * Toggle class `name`, can force state via `force`.\r\n    *\r\n    * For browsers that support classList, but do not support `force` yet,\r\n    * the mistake will be detected and corrected.\r\n    *\r\n    * @param {String} name\r\n    * @param {Boolean} force\r\n    * @return {ClassList}\r\n    * @api public\r\n    */\r\n\r\n  ClassList.prototype.toggle = function(name, force) {\r\n    if ('undefined' !== typeof force) {\r\n      if (force !== this.list.toggle(name, force)) {\r\n        this.list.toggle(name); // toggle again to correct\r\n      }\r\n    } else {\r\n      this.list.toggle(name);\r\n    }\r\n    return this;\r\n  };\r\n\r\n  /**\r\n    * Return an array of classes.\r\n    *\r\n    * @return {Array}\r\n    * @api public\r\n    */\r\n\r\n  ClassList.prototype.array = function() {\r\n    return Array.from(this.list);\r\n  };\r\n\r\n  /**\r\n    * Check if class `name` is present.\r\n    *\r\n    * @param {String} name\r\n    * @return {ClassList}\r\n    * @api public\r\n    */\r\n\r\n  ClassList.prototype.has =\r\n   ClassList.prototype.contains = function(name) {\r\n     return this.list.contains(name);\r\n   };\n\n  function remove$1(element) {\n    var parent = element.parentNode;\n\n    if (parent) {\n      parent.removeChild(element);\n    }\n\n    return element;\n  }\n\n  /**\n   * Clear utility\n   */\n\n  /**\n   * Removes all children from the given element\n   *\n   * @param  {DOMElement} element\n   * @return {DOMElement} the element (for chaining)\n   */\n  function clear(element) {\n    var child;\n\n    while ((child = element.firstChild)) {\n      remove$1(child);\n    }\n\n    return element;\n  }\n\n  function clone$1(element) {\n    return element.cloneNode(true);\n  }\n\n  var ns = {\n    svg: 'http://www.w3.org/2000/svg'\n  };\n\n  /**\n   * DOM parsing utility\n   */\n\n  var SVG_START = '<svg xmlns=\"' + ns.svg + '\"';\n\n  function parse(svg) {\n\n    var unwrap = false;\n\n    // ensure we import a valid svg document\n    if (svg.substring(0, 4) === '<svg') {\n      if (svg.indexOf(ns.svg) === -1) {\n        svg = SVG_START + svg.substring(4);\n      }\n    } else {\n\n      // namespace svg\n      svg = SVG_START + '>' + svg + '</svg>';\n      unwrap = true;\n    }\n\n    var parsed = parseDocument(svg);\n\n    if (!unwrap) {\n      return parsed;\n    }\n\n    var fragment = document.createDocumentFragment();\n\n    var parent = parsed.firstChild;\n\n    while (parent.firstChild) {\n      fragment.appendChild(parent.firstChild);\n    }\n\n    return fragment;\n  }\n\n  function parseDocument(svg) {\n\n    var parser;\n\n    // parse\n    parser = new DOMParser();\n    parser.async = false;\n\n    return parser.parseFromString(svg, 'text/xml');\n  }\n\n  /**\n   * Create utility for SVG elements\n   */\n\n\n  /**\n   * Create a specific type from name or SVG markup.\n   *\n   * @param {String} name the name or markup of the element\n   * @param {Object} [attrs] attributes to set on the element\n   *\n   * @returns {SVGElement}\n   */\n  function create$1(name, attrs) {\n    var element;\n\n    if (name.charAt(0) === '<') {\n      element = parse(name).firstChild;\n      element = document.importNode(element, true);\n    } else {\n      element = document.createElementNS(ns.svg, name);\n    }\n\n    if (attrs) {\n      attr(element, attrs);\n    }\n\n    return element;\n  }\n\n  /**\n   * Geometry helpers\n   */\n\n  // fake node used to instantiate svg geometry elements\n  var node = null;\n\n  function getNode() {\n    if (node === null) {\n      node = create$1('svg');\n    }\n\n    return node;\n  }\n\n  function extend$1(object, props) {\n    var i, k, keys = Object.keys(props);\n\n    for (i = 0; (k = keys[i]); i++) {\n      object[k] = props[k];\n    }\n\n    return object;\n  }\n\n  /**\n   * Create matrix via args.\n   *\n   * @example\n   *\n   * createMatrix({ a: 1, b: 1 });\n   * createMatrix();\n   * createMatrix(1, 2, 0, 0, 30, 20);\n   *\n   * @return {SVGMatrix}\n   */\n  function createMatrix(a, b, c, d, e, f) {\n    var matrix = getNode().createSVGMatrix();\n\n    switch (arguments.length) {\n    case 0:\n      return matrix;\n    case 1:\n      return extend$1(matrix, a);\n    case 6:\n      return extend$1(matrix, {\n        a: a,\n        b: b,\n        c: c,\n        d: d,\n        e: e,\n        f: f\n      });\n    }\n  }\n\n  function createTransform(matrix) {\n    if (matrix) {\n      return getNode().createSVGTransformFromMatrix(matrix);\n    } else {\n      return getNode().createSVGTransform();\n    }\n  }\n\n  /**\n   * Serialization util\n   */\n\n  var TEXT_ENTITIES = /([&<>]{1})/g;\n  var ATTR_ENTITIES = /([\\n\\r\"]{1})/g;\n\n  var ENTITY_REPLACEMENT = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '\\''\n  };\n\n  function escape$1(str, pattern) {\n\n    function replaceFn(match, entity) {\n      return ENTITY_REPLACEMENT[entity] || entity;\n    }\n\n    return str.replace(pattern, replaceFn);\n  }\n\n  function serialize(node, output) {\n\n    var i, len, attrMap, attrNode, childNodes;\n\n    switch (node.nodeType) {\n\n    // TEXT\n    case 3:\n\n      // replace special XML characters\n      output.push(escape$1(node.textContent, TEXT_ENTITIES));\n      break;\n\n    // ELEMENT\n    case 1:\n      output.push('<', node.tagName);\n\n      if (node.hasAttributes()) {\n        attrMap = node.attributes;\n        for (i = 0, len = attrMap.length; i < len; ++i) {\n          attrNode = attrMap.item(i);\n          output.push(' ', attrNode.name, '=\"', escape$1(attrNode.value, ATTR_ENTITIES), '\"');\n        }\n      }\n\n      if (node.hasChildNodes()) {\n        output.push('>');\n        childNodes = node.childNodes;\n        for (i = 0, len = childNodes.length; i < len; ++i) {\n          serialize(childNodes.item(i), output);\n        }\n        output.push('</', node.tagName, '>');\n      } else {\n        output.push('/>');\n      }\n      break;\n\n    // COMMENT\n    case 8:\n      output.push('<!--', escape$1(node.nodeValue, TEXT_ENTITIES), '-->');\n      break;\n\n    // CDATA\n    case 4:\n      output.push('<![CDATA[', node.nodeValue, ']]>');\n      break;\n\n    default:\n      throw new Error('unable to handle node ' + node.nodeType);\n    }\n\n    return output;\n  }\n\n  /**\n   * innerHTML like functionality for SVG elements.\n   * based on innerSVG (https://code.google.com/p/innersvg)\n   */\n\n\n  function set$1(element, svg) {\n\n    var parsed = parse(svg);\n\n    // clear element contents\n    clear(element);\n\n    if (!svg) {\n      return;\n    }\n\n    if (!isFragment(parsed)) {\n\n      // extract <svg> from parsed document\n      parsed = parsed.documentElement;\n    }\n\n    var nodes = slice$1(parsed.childNodes);\n\n    // import + append each node\n    for (var i = 0; i < nodes.length; i++) {\n      appendTo(nodes[i], element);\n    }\n\n  }\n\n  function get$1(element) {\n    var child = element.firstChild,\n        output = [];\n\n    while (child) {\n      serialize(child, output);\n      child = child.nextSibling;\n    }\n\n    return output.join('');\n  }\n\n  function isFragment(node) {\n    return node.nodeName === '#document-fragment';\n  }\n\n  function innerSVG(element, svg) {\n\n    if (svg !== undefined) {\n\n      try {\n        set$1(element, svg);\n      } catch (e) {\n        throw new Error('error parsing SVG: ' + e.message);\n      }\n\n      return element;\n    } else {\n      return get$1(element);\n    }\n  }\n\n\n  function slice$1(arr) {\n    return Array.prototype.slice.call(arr);\n  }\n\n  /**\n   * transform accessor utility\n   */\n\n  function wrapMatrix(transformList, transform) {\n    if (transform instanceof SVGMatrix) {\n      return transformList.createSVGTransformFromMatrix(transform);\n    }\n\n    return transform;\n  }\n\n\n  function setTransforms(transformList, transforms) {\n    var i, t;\n\n    transformList.clear();\n\n    for (i = 0; (t = transforms[i]); i++) {\n      transformList.appendItem(wrapMatrix(transformList, t));\n    }\n  }\n\n  /**\n   * Get or set the transforms on the given node.\n   *\n   * @param {SVGElement} node\n   * @param  {SVGTransform|SVGMatrix|Array<SVGTransform|SVGMatrix>} [transforms]\n   *\n   * @return {SVGTransform} the consolidated transform\n   */\n  function transform$1(node, transforms) {\n    var transformList = node.transform.baseVal;\n\n    if (transforms) {\n\n      if (!Array.isArray(transforms)) {\n        transforms = [ transforms ];\n      }\n\n      setTransforms(transformList, transforms);\n    }\n\n    return transformList.consolidate();\n  }\n\n  const CLASS_PATTERN = /^class[ {]/;\n\n\n  /**\n   * @param {function} fn\n   *\n   * @return {boolean}\n   */\n  function isClass(fn) {\n    return CLASS_PATTERN.test(fn.toString());\n  }\n\n  /**\n   * @param {any} obj\n   *\n   * @return {boolean}\n   */\n  function isArray$1(obj) {\n    return Array.isArray(obj);\n  }\n\n  /**\n   * @param {any} obj\n   * @param {string} prop\n   *\n   * @return {boolean}\n   */\n  function hasOwnProp(obj, prop) {\n    return Object.prototype.hasOwnProperty.call(obj, prop);\n  }\n\n  /**\n   * @typedef {import('./index').InjectAnnotated } InjectAnnotated\n   */\n\n  /**\n   * @template T\n   *\n   * @params {[...string[], T] | ...string[], T} args\n   *\n   * @return {T & InjectAnnotated}\n   */\n  function annotate(...args) {\n\n    if (args.length === 1 && isArray$1(args[0])) {\n      args = args[0];\n    }\n\n    args = [ ...args ];\n\n    const fn = args.pop();\n\n    fn.$inject = args;\n\n    return fn;\n  }\n\n\n  // Current limitations:\n  // - can't put into \"function arg\" comments\n  // function /* (no parenthesis like this) */ (){}\n  // function abc( /* xx (no parenthesis like this) */ a, b) {}\n  //\n  // Just put the comment before function or inside:\n  // /* (((this is fine))) */ function(a, b) {}\n  // function abc(a) { /* (((this is fine))) */}\n  //\n  // - can't reliably auto-annotate constructor; we'll match the\n  // first constructor(...) pattern found which may be the one\n  // of a nested class, too.\n\n  const CONSTRUCTOR_ARGS = /constructor\\s*[^(]*\\(\\s*([^)]*)\\)/m;\n  const FN_ARGS = /^(?:async\\s+)?(?:function\\s*[^(]*)?(?:\\(\\s*([^)]*)\\)|(\\w+))/m;\n  const FN_ARG = /\\/\\*([^*]*)\\*\\//m;\n\n  /**\n   * @param {unknown} fn\n   *\n   * @return {string[]}\n   */\n  function parseAnnotations(fn) {\n\n    if (typeof fn !== 'function') {\n      throw new Error(`Cannot annotate \"${fn}\". Expected a function!`);\n    }\n\n    const match = fn.toString().match(isClass(fn) ? CONSTRUCTOR_ARGS : FN_ARGS);\n\n    // may parse class without constructor\n    if (!match) {\n      return [];\n    }\n\n    const args = match[1] || match[2];\n\n    return args && args.split(',').map(arg => {\n      const argMatch = arg.match(FN_ARG);\n      return (argMatch && argMatch[1] || arg).trim();\n    }) || [];\n  }\n\n  /**\n   * @typedef { import('./index').ModuleDeclaration } ModuleDeclaration\n   * @typedef { import('./index').ModuleDefinition } ModuleDefinition\n   * @typedef { import('./index').InjectorContext } InjectorContext\n   */\n\n  /**\n   * Create a new injector with the given modules.\n   *\n   * @param {ModuleDefinition[]} modules\n   * @param {InjectorContext} [parent]\n   */\n  function Injector(modules, parent) {\n    parent = parent || {\n      get: function(name, strict) {\n        currentlyResolving.push(name);\n\n        if (strict === false) {\n          return null;\n        } else {\n          throw error(`No provider for \"${ name }\"!`);\n        }\n      }\n    };\n\n    const currentlyResolving = [];\n    const providers = this._providers = Object.create(parent._providers || null);\n    const instances = this._instances = Object.create(null);\n\n    const self = instances.injector = this;\n\n    const error = function(msg) {\n      const stack = currentlyResolving.join(' -> ');\n      currentlyResolving.length = 0;\n      return new Error(stack ? `${ msg } (Resolving: ${ stack })` : msg);\n    };\n\n    /**\n     * Return a named service.\n     *\n     * @param {string} name\n     * @param {boolean} [strict=true] if false, resolve missing services to null\n     *\n     * @return {any}\n     */\n    function get(name, strict) {\n      if (!providers[name] && name.indexOf('.') !== -1) {\n        const parts = name.split('.');\n        let pivot = get(parts.shift());\n\n        while (parts.length) {\n          pivot = pivot[parts.shift()];\n        }\n\n        return pivot;\n      }\n\n      if (hasOwnProp(instances, name)) {\n        return instances[name];\n      }\n\n      if (hasOwnProp(providers, name)) {\n        if (currentlyResolving.indexOf(name) !== -1) {\n          currentlyResolving.push(name);\n          throw error('Cannot resolve circular dependency!');\n        }\n\n        currentlyResolving.push(name);\n        instances[name] = providers[name][0](providers[name][1]);\n        currentlyResolving.pop();\n\n        return instances[name];\n      }\n\n      return parent.get(name, strict);\n    }\n\n    function fnDef(fn, locals) {\n\n      if (typeof locals === 'undefined') {\n        locals = {};\n      }\n\n      if (typeof fn !== 'function') {\n        if (isArray$1(fn)) {\n          fn = annotate(fn.slice());\n        } else {\n          throw error(`Cannot invoke \"${ fn }\". Expected a function!`);\n        }\n      }\n\n      const inject = fn.$inject || parseAnnotations(fn);\n      const dependencies = inject.map(dep => {\n        if (hasOwnProp(locals, dep)) {\n          return locals[dep];\n        } else {\n          return get(dep);\n        }\n      });\n\n      return {\n        fn: fn,\n        dependencies: dependencies\n      };\n    }\n\n    function instantiate(Type) {\n      const {\n        fn,\n        dependencies\n      } = fnDef(Type);\n\n      // instantiate var args constructor\n      const Constructor = Function.prototype.bind.apply(fn, [ null ].concat(dependencies));\n\n      return new Constructor();\n    }\n\n    function invoke(func, context, locals) {\n      const {\n        fn,\n        dependencies\n      } = fnDef(func, locals);\n\n      return fn.apply(context, dependencies);\n    }\n\n    /**\n     * @param {Injector} childInjector\n     *\n     * @return {Function}\n     */\n    function createPrivateInjectorFactory(childInjector) {\n      return annotate(key => childInjector.get(key));\n    }\n\n    /**\n     * @param {ModuleDefinition[]} modules\n     * @param {string[]} [forceNewInstances]\n     *\n     * @return {Injector}\n     */\n    function createChild(modules, forceNewInstances) {\n      if (forceNewInstances && forceNewInstances.length) {\n        const fromParentModule = Object.create(null);\n        const matchedScopes = Object.create(null);\n\n        const privateInjectorsCache = [];\n        const privateChildInjectors = [];\n        const privateChildFactories = [];\n\n        let provider;\n        let cacheIdx;\n        let privateChildInjector;\n        let privateChildInjectorFactory;\n\n        for (let name in providers) {\n          provider = providers[name];\n\n          if (forceNewInstances.indexOf(name) !== -1) {\n            if (provider[2] === 'private') {\n              cacheIdx = privateInjectorsCache.indexOf(provider[3]);\n              if (cacheIdx === -1) {\n                privateChildInjector = provider[3].createChild([], forceNewInstances);\n                privateChildInjectorFactory = createPrivateInjectorFactory(privateChildInjector);\n                privateInjectorsCache.push(provider[3]);\n                privateChildInjectors.push(privateChildInjector);\n                privateChildFactories.push(privateChildInjectorFactory);\n                fromParentModule[name] = [ privateChildInjectorFactory, name, 'private', privateChildInjector ];\n              } else {\n                fromParentModule[name] = [ privateChildFactories[cacheIdx], name, 'private', privateChildInjectors[cacheIdx] ];\n              }\n            } else {\n              fromParentModule[name] = [ provider[2], provider[1] ];\n            }\n            matchedScopes[name] = true;\n          }\n\n          if ((provider[2] === 'factory' || provider[2] === 'type') && provider[1].$scope) {\n            /* jshint -W083 */\n            forceNewInstances.forEach(scope => {\n              if (provider[1].$scope.indexOf(scope) !== -1) {\n                fromParentModule[name] = [ provider[2], provider[1] ];\n                matchedScopes[scope] = true;\n              }\n            });\n          }\n        }\n\n        forceNewInstances.forEach(scope => {\n          if (!matchedScopes[scope]) {\n            throw new Error('No provider for \"' + scope + '\". Cannot use provider from the parent!');\n          }\n        });\n\n        modules.unshift(fromParentModule);\n      }\n\n      return new Injector(modules, self);\n    }\n\n    const factoryMap = {\n      factory: invoke,\n      type: instantiate,\n      value: function(value) {\n        return value;\n      }\n    };\n\n    /**\n     * @param {ModuleDefinition} moduleDefinition\n     * @param {Injector} injector\n     */\n    function createInitializer(moduleDefinition, injector) {\n\n      const initializers = moduleDefinition.__init__ || [];\n\n      return function() {\n        initializers.forEach(initializer => {\n\n          // eagerly resolve component (fn or string)\n          if (typeof initializer === 'string') {\n            injector.get(initializer);\n          } else {\n            injector.invoke(initializer);\n          }\n        });\n      };\n    }\n\n    /**\n     * @param {ModuleDefinition} moduleDefinition\n     */\n    function loadModule(moduleDefinition) {\n\n      const moduleExports = moduleDefinition.__exports__;\n\n      // private module\n      if (moduleExports) {\n        const nestedModules = moduleDefinition.__modules__;\n\n        const clonedModule = Object.keys(moduleDefinition).reduce((clonedModule, key) => {\n\n          if (key !== '__exports__' && key !== '__modules__' && key !== '__init__' && key !== '__depends__') {\n            clonedModule[key] = moduleDefinition[key];\n          }\n\n          return clonedModule;\n        }, Object.create(null));\n\n        const childModules = (nestedModules || []).concat(clonedModule);\n\n        const privateInjector = createChild(childModules);\n        const getFromPrivateInjector = annotate(function(key) {\n          return privateInjector.get(key);\n        });\n\n        moduleExports.forEach(function(key) {\n          providers[key] = [ getFromPrivateInjector, key, 'private', privateInjector ];\n        });\n\n        // ensure child injector initializes\n        const initializers = (moduleDefinition.__init__ || []).slice();\n\n        initializers.unshift(function() {\n          privateInjector.init();\n        });\n\n        moduleDefinition = Object.assign({}, moduleDefinition, {\n          __init__: initializers\n        });\n\n        return createInitializer(moduleDefinition, privateInjector);\n      }\n\n      // normal module\n      Object.keys(moduleDefinition).forEach(function(key) {\n\n        if (key === '__init__' || key === '__depends__') {\n          return;\n        }\n\n        if (moduleDefinition[key][2] === 'private') {\n          providers[key] = moduleDefinition[key];\n          return;\n        }\n\n        const type = moduleDefinition[key][0];\n        const value = moduleDefinition[key][1];\n\n        providers[key] = [ factoryMap[type], arrayUnwrap(type, value), type ];\n      });\n\n      return createInitializer(moduleDefinition, self);\n    }\n\n    /**\n     * @param {ModuleDefinition[]} moduleDefinitions\n     * @param {ModuleDefinition} moduleDefinition\n     *\n     * @return {ModuleDefinition[]}\n     */\n    function resolveDependencies(moduleDefinitions, moduleDefinition) {\n\n      if (moduleDefinitions.indexOf(moduleDefinition) !== -1) {\n        return moduleDefinitions;\n      }\n\n      moduleDefinitions = (moduleDefinition.__depends__ || []).reduce(resolveDependencies, moduleDefinitions);\n\n      if (moduleDefinitions.indexOf(moduleDefinition) !== -1) {\n        return moduleDefinitions;\n      }\n\n      return moduleDefinitions.concat(moduleDefinition);\n    }\n\n    /**\n     * @param {ModuleDefinition[]} moduleDefinitions\n     *\n     * @return { () => void } initializerFn\n     */\n    function bootstrap(moduleDefinitions) {\n\n      const initializers = moduleDefinitions\n        .reduce(resolveDependencies, [])\n        .map(loadModule);\n\n      let initialized = false;\n\n      return function() {\n\n        if (initialized) {\n          return;\n        }\n\n        initialized = true;\n\n        initializers.forEach(initializer => initializer());\n      };\n    }\n\n    // public API\n    this.get = get;\n    this.invoke = invoke;\n    this.instantiate = instantiate;\n    this.createChild = createChild;\n\n    // setup\n    this.init = bootstrap(modules);\n  }\n\n\n  // helpers ///////////////\n\n  function arrayUnwrap(type, value) {\n    if (type !== 'value' && isArray$1(value)) {\n      value = annotate(value.slice());\n    }\n\n    return value;\n  }\n\n  var DEFAULT_RENDER_PRIORITY$1 = 1000;\n\n  /**\n   * @typedef {import('../core/Types').ElementLike} Element\n   * @typedef {import('../core/Types').ConnectionLike} Connection\n   * @typedef {import('../core/Types').ShapeLike} Shape\n   *\n   * @typedef {import('../core/EventBus').default} EventBus\n   */\n\n  /**\n   * The base implementation of shape and connection renderers.\n   *\n   * @param {EventBus} eventBus\n   * @param {number} [renderPriority=1000]\n   */\n  function BaseRenderer(eventBus, renderPriority) {\n    var self = this;\n\n    renderPriority = renderPriority || DEFAULT_RENDER_PRIORITY$1;\n\n    eventBus.on([ 'render.shape', 'render.connection' ], renderPriority, function(evt, context) {\n      var type = evt.type,\n          element = context.element,\n          visuals = context.gfx,\n          attrs = context.attrs;\n\n      if (self.canRender(element)) {\n        if (type === 'render.shape') {\n          return self.drawShape(visuals, element, attrs);\n        } else {\n          return self.drawConnection(visuals, element, attrs);\n        }\n      }\n    });\n\n    eventBus.on([ 'render.getShapePath', 'render.getConnectionPath' ], renderPriority, function(evt, element) {\n      if (self.canRender(element)) {\n        if (evt.type === 'render.getShapePath') {\n          return self.getShapePath(element);\n        } else {\n          return self.getConnectionPath(element);\n        }\n      }\n    });\n  }\n\n  /**\n   * Checks whether an element can be rendered.\n   *\n   * @param {Element} element The element to be rendered.\n   *\n   * @return {boolean} Whether the element can be rendered.\n   */\n  BaseRenderer.prototype.canRender = function(element) {};\n\n  /**\n   * Draws a shape.\n   *\n   * @param {SVGElement} visuals The SVG element to draw the shape into.\n   * @param {Shape} shape The shape to be drawn.\n   *\n   * @return {SVGElement} The SVG element of the shape drawn.\n   */\n  BaseRenderer.prototype.drawShape = function(visuals, shape) {};\n\n  /**\n   * Draws a connection.\n   *\n   * @param {SVGElement} visuals The SVG element to draw the connection into.\n   * @param {Connection} connection The connection to be drawn.\n   *\n   * @return {SVGElement} The SVG element of the connection drawn.\n   */\n  BaseRenderer.prototype.drawConnection = function(visuals, connection) {};\n\n  /**\n   * Gets the SVG path of the graphical representation of a shape.\n   *\n   * @param {Shape} shape The shape.\n   *\n   * @return {string} The SVG path of the shape.\n   */\n  BaseRenderer.prototype.getShapePath = function(shape) {};\n\n  /**\n   * Gets the SVG path of the graphical representation of a connection.\n   *\n   * @param {Connection} connection The connection.\n   *\n   * @return {string} The SVG path of the connection.\n   */\n  BaseRenderer.prototype.getConnectionPath = function(connection) {};\n\n  /**\n   * @typedef {(string|number)[]} Component\n   *\n   * @typedef {import('../util/Types').Point} Point\n   */\n\n  /**\n   * @param {Component[] | Component[][]} elements\n   *\n   * @return {string}\n   */\n  function componentsToPath(elements) {\n    return elements.flat().join(',').replace(/,?([A-z]),?/g, '$1');\n  }\n\n  /**\n   * @param {Point} point\n   *\n   * @return {Component[]}\n   */\n  function move(point) {\n    return [ 'M', point.x, point.y ];\n  }\n\n  /**\n   * @param {Point} point\n   *\n   * @return {Component[]}\n   */\n  function lineTo(point) {\n    return [ 'L', point.x, point.y ];\n  }\n\n  /**\n   * @param {Point} p1\n   * @param {Point} p2\n   * @param {Point} p3\n   *\n   * @return {Component[]}\n   */\n  function curveTo(p1, p2, p3) {\n    return [ 'C', p1.x, p1.y, p2.x, p2.y, p3.x, p3.y ];\n  }\n\n  /**\n   * @param {Point[]} waypoints\n   * @param {number} [cornerRadius]\n   * @return {Component[][]}\n   */\n  function drawPath(waypoints, cornerRadius) {\n    const pointCount = waypoints.length;\n\n    const path = [ move(waypoints[0]) ];\n\n    for (let i = 1; i < pointCount; i++) {\n\n      const pointBefore = waypoints[i - 1];\n      const point = waypoints[i];\n      const pointAfter = waypoints[i + 1];\n\n      if (!pointAfter || !cornerRadius) {\n        path.push(lineTo(point));\n\n        continue;\n      }\n\n      const effectiveRadius = Math.min(\n        cornerRadius,\n        vectorLength$1(point.x - pointBefore.x, point.y - pointBefore.y),\n        vectorLength$1(pointAfter.x - point.x, pointAfter.y - point.y)\n      );\n\n      if (!effectiveRadius) {\n        path.push(lineTo(point));\n\n        continue;\n      }\n\n      const beforePoint = getPointAtLength(point, pointBefore, effectiveRadius);\n      const beforePoint2 = getPointAtLength(point, pointBefore, effectiveRadius * .5);\n\n      const afterPoint = getPointAtLength(point, pointAfter, effectiveRadius);\n      const afterPoint2 = getPointAtLength(point, pointAfter, effectiveRadius * .5);\n\n      path.push(lineTo(beforePoint));\n      path.push(curveTo(beforePoint2, afterPoint2, afterPoint));\n    }\n\n    return path;\n  }\n\n  function getPointAtLength(start, end, length) {\n\n    const deltaX = end.x - start.x;\n    const deltaY = end.y - start.y;\n\n    const totalLength = vectorLength$1(deltaX, deltaY);\n\n    const percent = length / totalLength;\n\n    return {\n      x: start.x + deltaX * percent,\n      y: start.y + deltaY * percent\n    };\n  }\n\n  function vectorLength$1(x, y) {\n    return Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));\n  }\n\n  /**\n   * @param {Point[]} points\n   * @param {number|Object} [attrs]\n   * @param {number} [radius]\n   *\n   * @return {SVGElement}\n   */\n  function createLine(points, attrs, radius) {\n\n    if (isNumber(attrs)) {\n      radius = attrs;\n      attrs = null;\n    }\n\n    if (!attrs) {\n      attrs = {};\n    }\n\n    const line = create$1('path', attrs);\n\n    if (isNumber(radius)) {\n      line.dataset.cornerRadius = String(radius);\n    }\n\n    return updateLine(line, points);\n  }\n\n  /**\n   * @param {SVGElement} gfx\n   * @param {Point[]} points\n   *\n   * @return {SVGElement}\n   */\n  function updateLine(gfx, points) {\n\n    const cornerRadius = parseInt(gfx.dataset.cornerRadius, 10) || 0;\n\n    attr(gfx, {\n      d: componentsToPath(drawPath(points, cornerRadius))\n    });\n\n    return gfx;\n  }\n\n  /**\n   * @typedef {import('../model/Types').Connection} Connection\n   * @typedef {import('../model/Types').Element} Element\n   * @typedef {import('../model/Types').Shape} Shape\n   *\n   * @typedef {import('../../type/Types').Rect} Rect\n   *\n   * @typedef { {\n   *   allShapes: Record<string, Shape>,\n   *   allConnections: Record<string, Connection>,\n   *   topLevel: Record<string, Element>,\n   *   enclosedConnections: Record<string, Connection>,\n   *   enclosedElements: Record<string, Element>\n   * } } Closure\n   */\n\n  /**\n   * Get parent elements.\n   *\n   * @param {Element[]} elements\n   *\n   * @return {Element[]}\n   */\n  function getParents$1(elements) {\n\n    // find elements that are not children of any other elements\n    return filter(elements, function(element) {\n      return !find(elements, function(e) {\n        return e !== element && getParent$1(element, e);\n      });\n    });\n  }\n\n\n  function getParent$1(element, parent) {\n    if (!parent) {\n      return;\n    }\n\n    if (element === parent) {\n      return parent;\n    }\n\n    if (!element.parent) {\n      return;\n    }\n\n    return getParent$1(element.parent, parent);\n  }\n\n\n  /**\n   * Adds an element to a collection and returns true if the\n   * element was added.\n   *\n   * @param {Object[]} elements\n   * @param {Object} element\n   * @param {boolean} [unique]\n   */\n  function add$1(elements, element, unique) {\n    var canAdd = !unique || elements.indexOf(element) === -1;\n\n    if (canAdd) {\n      elements.push(element);\n    }\n\n    return canAdd;\n  }\n\n\n  /**\n   * Iterate over each element in a collection, calling the iterator function `fn`\n   * with (element, index, recursionDepth).\n   *\n   * Recurse into all elements that are returned by `fn`.\n   *\n   * @param {Element|Element[]} elements\n   * @param {(element: Element, index: number, depth: number) => Element[] | boolean | undefined} fn\n   * @param {number} [depth] maximum recursion depth\n   */\n  function eachElement(elements, fn, depth) {\n\n    depth = depth || 0;\n\n    if (!isArray$3(elements)) {\n      elements = [ elements ];\n    }\n\n    forEach$1(elements, function(s, i) {\n      var filter = fn(s, i, depth);\n\n      if (isArray$3(filter) && filter.length) {\n        eachElement(filter, fn, depth + 1);\n      }\n    });\n  }\n\n\n  /**\n   * Collects self + child elements up to a given depth from a list of elements.\n   *\n   * @param {Element|Element[]} elements the elements to select the children from\n   * @param {boolean} unique whether to return a unique result set (no duplicates)\n   * @param {number} maxDepth the depth to search through or -1 for infinite\n   *\n   * @return {Element[]} found elements\n   */\n  function selfAndChildren(elements, unique, maxDepth) {\n    var result = [],\n        processedChildren = [];\n\n    eachElement(elements, function(element, i, depth) {\n      add$1(result, element, unique);\n\n      var children = element.children;\n\n      // max traversal depth not reached yet\n      if (maxDepth === -1 || depth < maxDepth) {\n\n        // children exist && children not yet processed\n        if (children && add$1(processedChildren, children, unique)) {\n          return children;\n        }\n      }\n    });\n\n    return result;\n  }\n\n\n  /**\n   * Return self + ALL children for a number of elements\n   *\n   * @param {Element[]} elements to query\n   * @param {boolean} [allowDuplicates] to allow duplicates in the result set\n   *\n   * @return {Element[]} the collected elements\n   */\n  function selfAndAllChildren(elements, allowDuplicates) {\n    return selfAndChildren(elements, !allowDuplicates, -1);\n  }\n\n\n  /**\n   * Gets the the closure for all selected elements,\n   * their enclosed children and connections.\n   *\n   * @param {Element[]} elements\n   * @param {boolean} [isTopLevel=true]\n   * @param {Closure} [closure]\n   *\n   * @return {Closure} newClosure\n   */\n  function getClosure(elements, isTopLevel, closure) {\n\n    if (isUndefined$2(isTopLevel)) {\n      isTopLevel = true;\n    }\n\n    if (isObject(isTopLevel)) {\n      closure = isTopLevel;\n      isTopLevel = true;\n    }\n\n\n    closure = closure || {};\n\n    var allShapes = copyObject(closure.allShapes),\n        allConnections = copyObject(closure.allConnections),\n        enclosedElements = copyObject(closure.enclosedElements),\n        enclosedConnections = copyObject(closure.enclosedConnections);\n\n    var topLevel = copyObject(\n      closure.topLevel,\n      isTopLevel && groupBy(elements, function(e) { return e.id; })\n    );\n\n\n    function handleConnection(c) {\n      if (topLevel[c.source.id] && topLevel[c.target.id]) {\n        topLevel[c.id] = [ c ];\n      }\n\n      // not enclosed as a child, but maybe logically\n      // (connecting two moved elements?)\n      if (allShapes[c.source.id] && allShapes[c.target.id]) {\n        enclosedConnections[c.id] = enclosedElements[c.id] = c;\n      }\n\n      allConnections[c.id] = c;\n    }\n\n    function handleElement(element) {\n\n      enclosedElements[element.id] = element;\n\n      if (element.waypoints) {\n\n        // remember connection\n        enclosedConnections[element.id] = allConnections[element.id] = element;\n      } else {\n\n        // remember shape\n        allShapes[element.id] = element;\n\n        // remember all connections\n        forEach$1(element.incoming, handleConnection);\n\n        forEach$1(element.outgoing, handleConnection);\n\n        // recurse into children\n        return element.children;\n      }\n    }\n\n    eachElement(elements, handleElement);\n\n    return {\n      allShapes: allShapes,\n      allConnections: allConnections,\n      topLevel: topLevel,\n      enclosedConnections: enclosedConnections,\n      enclosedElements: enclosedElements\n    };\n  }\n\n  /**\n   * Returns the surrounding bbox for all elements in\n   * the array or the element primitive.\n   *\n   * @param {Element|Element[]} elements\n   * @param {boolean} [stopRecursion=false]\n   *\n   * @return {Rect}\n   */\n  function getBBox(elements, stopRecursion) {\n\n    stopRecursion = !!stopRecursion;\n    if (!isArray$3(elements)) {\n      elements = [ elements ];\n    }\n\n    var minX,\n        minY,\n        maxX,\n        maxY;\n\n    forEach$1(elements, function(element) {\n\n      // If element is a connection the bbox must be computed first\n      var bbox = element;\n      if (element.waypoints && !stopRecursion) {\n        bbox = getBBox(element.waypoints, true);\n      }\n\n      var x = bbox.x,\n          y = bbox.y,\n          height = bbox.height || 0,\n          width = bbox.width || 0;\n\n      if (x < minX || minX === undefined) {\n        minX = x;\n      }\n      if (y < minY || minY === undefined) {\n        minY = y;\n      }\n\n      if ((x + width) > maxX || maxX === undefined) {\n        maxX = x + width;\n      }\n      if ((y + height) > maxY || maxY === undefined) {\n        maxY = y + height;\n      }\n    });\n\n    return {\n      x: minX,\n      y: minY,\n      height: maxY - minY,\n      width: maxX - minX\n    };\n  }\n\n\n  /**\n   * Returns all elements that are enclosed from the bounding box.\n   *\n   *   * If bbox.(width|height) is not specified the method returns\n   *     all elements with element.x/y > bbox.x/y\n   *   * If only bbox.x or bbox.y is specified, method return all elements with\n   *     e.x > bbox.x or e.y > bbox.y\n   *\n   * @param {Element[]} elements List of Elements to search through\n   * @param {Rect} bbox the enclosing bbox.\n   *\n   * @return {Element[]} enclosed elements\n   */\n  function getEnclosedElements(elements, bbox) {\n\n    var filteredElements = {};\n\n    forEach$1(elements, function(element) {\n\n      var e = element;\n\n      if (e.waypoints) {\n        e = getBBox(e);\n      }\n\n      if (!isNumber(bbox.y) && (e.x > bbox.x)) {\n        filteredElements[element.id] = element;\n      }\n      if (!isNumber(bbox.x) && (e.y > bbox.y)) {\n        filteredElements[element.id] = element;\n      }\n      if (e.x > bbox.x && e.y > bbox.y) {\n        if (isNumber(bbox.width) && isNumber(bbox.height) &&\n            e.width + e.x < bbox.width + bbox.x &&\n            e.height + e.y < bbox.height + bbox.y) {\n\n          filteredElements[element.id] = element;\n        } else if (!isNumber(bbox.width) || !isNumber(bbox.height)) {\n          filteredElements[element.id] = element;\n        }\n      }\n    });\n\n    return filteredElements;\n  }\n\n  /**\n   * Get the element's type\n   *\n   * @param {Element} element\n   *\n   * @return {'connection' | 'shape' | 'root'}\n   */\n  function getType(element) {\n\n    if ('waypoints' in element) {\n      return 'connection';\n    }\n\n    if ('x' in element) {\n      return 'shape';\n    }\n\n    return 'root';\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isFrameElement$1(element) {\n    return !!(element && element.isFrame);\n  }\n\n  // helpers ///////////////////////////////\n\n  function copyObject(src1, src2) {\n    return assign$1({}, src1 || {}, src2 || {});\n  }\n\n  /**\n   * @typedef {import('../core/EventBus').default} EventBus\n   * @typedef {import('./Styles').default} Styles\n   */\n\n  // apply default renderer with lowest possible priority\n  // so that it only kicks in if noone else could render\n  var DEFAULT_RENDER_PRIORITY = 1;\n\n  /**\n   * The default renderer used for shapes and connections.\n   *\n   * @param {EventBus} eventBus\n   * @param {Styles} styles\n   */\n  function DefaultRenderer(eventBus, styles) {\n\n    BaseRenderer.call(this, eventBus, DEFAULT_RENDER_PRIORITY);\n\n    this.CONNECTION_STYLE = styles.style([ 'no-fill' ], { strokeWidth: 5, stroke: 'fuchsia' });\n    this.SHAPE_STYLE = styles.style({ fill: 'white', stroke: 'fuchsia', strokeWidth: 2 });\n    this.FRAME_STYLE = styles.style([ 'no-fill' ], { stroke: 'fuchsia', strokeDasharray: 4, strokeWidth: 2 });\n  }\n\n  e$3(DefaultRenderer, BaseRenderer);\n\n\n  /**\n   * @private\n   */\n  DefaultRenderer.prototype.canRender = function() {\n    return true;\n  };\n\n  /**\n   * @private\n   */\n  DefaultRenderer.prototype.drawShape = function drawShape(visuals, element, attrs) {\n    var rect = create$1('rect');\n\n    attr(rect, {\n      x: 0,\n      y: 0,\n      width: element.width || 0,\n      height: element.height || 0\n    });\n\n    if (isFrameElement$1(element)) {\n      attr(rect, assign$1({}, this.FRAME_STYLE, attrs || {}));\n    } else {\n      attr(rect, assign$1({}, this.SHAPE_STYLE, attrs || {}));\n    }\n\n    append(visuals, rect);\n\n    return rect;\n  };\n\n  /**\n   * @private\n   */\n  DefaultRenderer.prototype.drawConnection = function drawConnection(visuals, connection, attrs) {\n\n    var line = createLine(connection.waypoints, assign$1({}, this.CONNECTION_STYLE, attrs || {}));\n    append(visuals, line);\n\n    return line;\n  };\n\n  /**\n   * @private\n   */\n  DefaultRenderer.prototype.getShapePath = function getShapePath(shape) {\n\n    var x = shape.x,\n        y = shape.y,\n        width = shape.width,\n        height = shape.height;\n\n    var shapePath = [\n      [ 'M', x, y ],\n      [ 'l', width, 0 ],\n      [ 'l', 0, height ],\n      [ 'l', -width, 0 ],\n      [ 'z' ]\n    ];\n\n    return componentsToPath(shapePath);\n  };\n\n  /**\n   * @private\n   */\n  DefaultRenderer.prototype.getConnectionPath = function getConnectionPath(connection) {\n    var waypoints = connection.waypoints;\n\n    var idx, point, connectionPath = [];\n\n    for (idx = 0; (point = waypoints[idx]); idx++) {\n\n      // take invisible docking into account\n      // when creating the path\n      point = point.original || point;\n\n      connectionPath.push([ idx === 0 ? 'M' : 'L', point.x, point.y ]);\n    }\n\n    return componentsToPath(connectionPath);\n  };\n\n  DefaultRenderer.$inject = [ 'eventBus', 'styles' ];\n\n  /**\n   * A component that manages shape styles\n   */\n  function Styles() {\n\n    var defaultTraits = {\n\n      'no-fill': {\n        fill: 'none'\n      },\n      'no-border': {\n        strokeOpacity: 0.0\n      },\n      'no-events': {\n        pointerEvents: 'none'\n      }\n    };\n\n    var self = this;\n\n    /**\n     * Builds a style definition from a className, a list of traits and an object\n     * of additional attributes.\n     *\n     * @param {string} className\n     * @param {string[]} [traits]\n     * @param {Object} [additionalAttrs]\n     *\n     * @return {Object} the style definition\n     */\n    this.cls = function(className, traits, additionalAttrs) {\n      var attrs = this.style(traits, additionalAttrs);\n\n      return assign$1(attrs, { 'class': className });\n    };\n\n    /**\n     * Builds a style definition from a list of traits and an object of additional\n     * attributes.\n     *\n     * @param {string[]} [traits]\n     * @param {Object} additionalAttrs\n     *\n     * @return {Object} the style definition\n     */\n    this.style = function(traits, additionalAttrs) {\n\n      if (!isArray$3(traits) && !additionalAttrs) {\n        additionalAttrs = traits;\n        traits = [];\n      }\n\n      var attrs = reduce(traits, function(attrs, t) {\n        return assign$1(attrs, defaultTraits[t] || {});\n      }, {});\n\n      return additionalAttrs ? assign$1(attrs, additionalAttrs) : attrs;\n    };\n\n\n    /**\n     * Computes a style definition from a list of traits and an object of\n     * additional attributes, with custom style definition object.\n     *\n     * @param {Object} custom\n     * @param {string[]} [traits]\n     * @param {Object} defaultStyles\n     *\n     * @return {Object} the style definition\n     */\n    this.computeStyle = function(custom, traits, defaultStyles) {\n      if (!isArray$3(traits)) {\n        defaultStyles = traits;\n        traits = [];\n      }\n\n      return self.style(traits || [], assign$1({}, defaultStyles, custom || {}));\n    };\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var DrawModule$1 = {\n    __init__: [ 'defaultRenderer' ],\n    defaultRenderer: [ 'type', DefaultRenderer ],\n    styles: [ 'type', Styles ]\n  };\n\n  /**\n   * Failsafe remove an element from a collection\n   *\n   * @param {Array<Object>} [collection]\n   * @param {Object} [element]\n   *\n   * @return {number} the previous index of the element\n   */\n  function remove(collection, element) {\n\n    if (!collection || !element) {\n      return -1;\n    }\n\n    var idx = collection.indexOf(element);\n\n    if (idx !== -1) {\n      collection.splice(idx, 1);\n    }\n\n    return idx;\n  }\n\n  /**\n   * Fail save add an element to the given connection, ensuring\n   * it does not yet exist.\n   *\n   * @param {Array<Object>} collection\n   * @param {Object} element\n   * @param {number} [idx]\n   */\n  function add(collection, element, idx) {\n\n    if (!collection || !element) {\n      return;\n    }\n\n    if (typeof idx !== 'number') {\n      idx = -1;\n    }\n\n    var currentIdx = collection.indexOf(element);\n\n    if (currentIdx !== -1) {\n\n      if (currentIdx === idx) {\n\n        // nothing to do, position has not changed\n        return;\n      } else {\n\n        if (idx !== -1) {\n\n          // remove from current position\n          collection.splice(currentIdx, 1);\n        } else {\n\n          // already exists in collection\n          return;\n        }\n      }\n    }\n\n    if (idx !== -1) {\n\n      // insert at specified position\n      collection.splice(idx, 0, element);\n    } else {\n\n      // push to end\n      collection.push(element);\n    }\n  }\n\n\n  /**\n   * Fail save get the index of an element in a collection.\n   *\n   * @param {Array<Object>} collection\n   * @param {Object} element\n   *\n   * @return {number} the index or -1 if collection or element do\n   *                  not exist or the element is not contained.\n   */\n  function indexOf(collection, element) {\n\n    if (!collection || !element) {\n      return -1;\n    }\n\n    return collection.indexOf(element);\n  }\n\n  /**\n   * @typedef {import('../util/Types').Axis} Axis\n   * @typedef {import('../util/Types').Point} Point\n   * @typedef {import('../util/Types').Rect} Rect\n   */\n\n  /**\n   * Computes the distance between two points.\n   *\n   * @param {Point} a\n   * @param {Point} b\n   *\n   * @return {number} The distance between the two points.\n   */\n  function pointDistance(a, b) {\n    if (!a || !b) {\n      return -1;\n    }\n\n    return Math.sqrt(\n      Math.pow(a.x - b.x, 2) +\n      Math.pow(a.y - b.y, 2)\n    );\n  }\n\n\n  /**\n   * Returns true if the point r is on the line between p and q.\n   *\n   * @param {Point} p\n   * @param {Point} q\n   * @param {Point} r\n   * @param {number} [accuracy=5] The accuracy with which to check (lower is better).\n   *\n   * @return {boolean}\n   */\n  function pointsOnLine(p, q, r, accuracy) {\n\n    if (typeof accuracy === 'undefined') {\n      accuracy = 5;\n    }\n\n    if (!p || !q || !r) {\n      return false;\n    }\n\n    var val = (q.x - p.x) * (r.y - p.y) - (q.y - p.y) * (r.x - p.x),\n        dist = pointDistance(p, q);\n\n    // @see http://stackoverflow.com/a/907491/412190\n    return Math.abs(val / dist) <= accuracy;\n  }\n\n\n  var ALIGNED_THRESHOLD = 2;\n\n  /**\n   * Check whether two points are horizontally or vertically aligned.\n   *\n   * @param {Point[]|Point} a\n   * @param {Point} [b]\n   *\n   * @return {string|boolean} If and how the two points are aligned ('h', 'v' or `false`).\n   */\n  function pointsAligned(a, b) {\n    var points = Array.from(arguments).flat();\n\n    const axisMap = {\n      'x': 'v',\n      'y': 'h'\n    };\n\n    for (const [ axis, orientation ] of Object.entries(axisMap)) {\n      if (pointsAlignedOnAxis(axis, points)) {\n        return orientation;\n      }\n    }\n\n    return false;\n  }\n\n  /**\n   * @param {Axis} axis\n   * @param {Point[]} points\n   *\n   * @return {boolean}\n   */\n  function pointsAlignedOnAxis(axis, points) {\n    const referencePoint = points[0];\n\n    return every(points, function(point) {\n      return Math.abs(referencePoint[axis] - point[axis]) <= ALIGNED_THRESHOLD;\n    });\n  }\n\n  /**\n   * Returns true if the point p is inside the rectangle rect\n   *\n   * @param {Point} p\n   * @param {Rect} rect\n   * @param {number} tolerance\n   *\n   * @return {boolean}\n   */\n  function pointInRect(p, rect, tolerance) {\n    tolerance = tolerance || 0;\n\n    return p.x > rect.x - tolerance &&\n           p.y > rect.y - tolerance &&\n           p.x < rect.x + rect.width + tolerance &&\n           p.y < rect.y + rect.height + tolerance;\n  }\n\n  /**\n   * Returns a point in the middle of points p and q\n   *\n   * @param {Point} p\n   * @param {Point} q\n   *\n   * @return {Point} The mid point between the two points.\n   */\n  function getMidPoint(p, q) {\n    return {\n      x: Math.round(p.x + ((q.x - p.x) / 2.0)),\n      y: Math.round(p.y + ((q.y - p.y) / 2.0))\n    };\n  }\n\n  function getDefaultExportFromCjs (x) {\n  \treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n  }\n\n  /**\n   * This file contains source code adapted from Snap.svg (licensed Apache-2.0).\n   *\n   * @see https://github.com/adobe-webplatform/Snap.svg/blob/master/src/path.js\n   */\n\n  /* eslint no-fallthrough: \"off\" */\n\n  var p2s = /,?([a-z]),?/gi,\n      toFloat = parseFloat,\n      math = Math,\n      PI = math.PI,\n      mmin = math.min,\n      mmax = math.max,\n      pow = math.pow,\n      abs$7 = math.abs,\n      pathCommand = /([a-z])[\\s,]*((-?\\d*\\.?\\d*(?:e[-+]?\\d+)?[\\s]*,?[\\s]*)+)/ig,\n      pathValues = /(-?\\d*\\.?\\d*(?:e[-+]?\\d+)?)[\\s]*,?[\\s]*/ig;\n\n  var isArray = Array.isArray || function(o) { return o instanceof Array; };\n\n  function hasProperty(obj, property) {\n    return Object.prototype.hasOwnProperty.call(obj, property);\n  }\n\n  function clone(obj) {\n\n    if (typeof obj == 'function' || Object(obj) !== obj) {\n      return obj;\n    }\n\n    var res = new obj.constructor;\n\n    for (var key in obj) {\n      if (hasProperty(obj, key)) {\n        res[key] = clone(obj[key]);\n      }\n    }\n\n    return res;\n  }\n\n  function repush(array, item) {\n    for (var i = 0, ii = array.length; i < ii; i++) if (array[i] === item) {\n      return array.push(array.splice(i, 1)[0]);\n    }\n  }\n\n  function cacher(f) {\n\n    function newf() {\n\n      var arg = Array.prototype.slice.call(arguments, 0),\n          args = arg.join('\\u2400'),\n          cache = newf.cache = newf.cache || {},\n          count = newf.count = newf.count || [];\n\n      if (hasProperty(cache, args)) {\n        repush(count, args);\n        return cache[args];\n      }\n\n      count.length >= 1e3 && delete cache[count.shift()];\n      count.push(args);\n      cache[args] = f.apply(0, arg);\n\n      return cache[args];\n    }\n    return newf;\n  }\n\n  function parsePathString(pathString) {\n\n    if (!pathString) {\n      return null;\n    }\n\n    var pth = paths(pathString);\n\n    if (pth.arr) {\n      return clone(pth.arr);\n    }\n\n    var paramCounts = { a: 7, c: 6, h: 1, l: 2, m: 2, q: 4, s: 4, t: 2, v: 1, z: 0 },\n        data = [];\n\n    if (isArray(pathString) && isArray(pathString[0])) { // rough assumption\n      data = clone(pathString);\n    }\n\n    if (!data.length) {\n\n      String(pathString).replace(pathCommand, function(a, b, c) {\n        var params = [],\n            name = b.toLowerCase();\n\n        c.replace(pathValues, function(a, b) {\n          b && params.push(+b);\n        });\n\n        if (name == 'm' && params.length > 2) {\n          data.push([b].concat(params.splice(0, 2)));\n          name = 'l';\n          b = b == 'm' ? 'l' : 'L';\n        }\n\n        while (params.length >= paramCounts[name]) {\n          data.push([b].concat(params.splice(0, paramCounts[name])));\n          if (!paramCounts[name]) {\n            break;\n          }\n        }\n      });\n    }\n\n    data.toString = paths.toString;\n    pth.arr = clone(data);\n\n    return data;\n  }\n\n  function paths(ps) {\n    var p = paths.ps = paths.ps || {};\n\n    if (p[ps]) {\n      p[ps].sleep = 100;\n    } else {\n      p[ps] = {\n        sleep: 100\n      };\n    }\n\n    setTimeout(function() {\n      for (var key in p) {\n        if (hasProperty(p, key) && key != ps) {\n          p[key].sleep--;\n          !p[key].sleep && delete p[key];\n        }\n      }\n    });\n\n    return p[ps];\n  }\n\n  function rectBBox(x, y, width, height) {\n\n    if (arguments.length === 1) {\n      y = x.y;\n      width = x.width;\n      height = x.height;\n      x = x.x;\n    }\n\n    return {\n      x: x,\n      y: y,\n      width: width,\n      height: height,\n      x2: x + width,\n      y2: y + height\n    };\n  }\n\n  function pathToString() {\n    return this.join(',').replace(p2s, '$1');\n  }\n\n  function pathClone(pathArray) {\n    var res = clone(pathArray);\n    res.toString = pathToString;\n    return res;\n  }\n\n  function findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {\n    var t1 = 1 - t,\n        t13 = pow(t1, 3),\n        t12 = pow(t1, 2),\n        t2 = t * t,\n        t3 = t2 * t,\n        x = t13 * p1x + t12 * 3 * t * c1x + t1 * 3 * t * t * c2x + t3 * p2x,\n        y = t13 * p1y + t12 * 3 * t * c1y + t1 * 3 * t * t * c2y + t3 * p2y;\n\n    return {\n      x: fixError(x),\n      y: fixError(y)\n    };\n  }\n\n  function bezierBBox(points) {\n\n    var bbox = curveBBox.apply(null, points);\n\n    return rectBBox(\n      bbox.x0,\n      bbox.y0,\n      bbox.x1 - bbox.x0,\n      bbox.y1 - bbox.y0\n    );\n  }\n\n  function isPointInsideBBox$2(bbox, x, y) {\n    return x >= bbox.x &&\n      x <= bbox.x + bbox.width &&\n      y >= bbox.y &&\n      y <= bbox.y + bbox.height;\n  }\n\n  function isBBoxIntersect(bbox1, bbox2) {\n    bbox1 = rectBBox(bbox1);\n    bbox2 = rectBBox(bbox2);\n    return isPointInsideBBox$2(bbox2, bbox1.x, bbox1.y)\n      || isPointInsideBBox$2(bbox2, bbox1.x2, bbox1.y)\n      || isPointInsideBBox$2(bbox2, bbox1.x, bbox1.y2)\n      || isPointInsideBBox$2(bbox2, bbox1.x2, bbox1.y2)\n      || isPointInsideBBox$2(bbox1, bbox2.x, bbox2.y)\n      || isPointInsideBBox$2(bbox1, bbox2.x2, bbox2.y)\n      || isPointInsideBBox$2(bbox1, bbox2.x, bbox2.y2)\n      || isPointInsideBBox$2(bbox1, bbox2.x2, bbox2.y2)\n      || (bbox1.x < bbox2.x2 && bbox1.x > bbox2.x\n          || bbox2.x < bbox1.x2 && bbox2.x > bbox1.x)\n      && (bbox1.y < bbox2.y2 && bbox1.y > bbox2.y\n          || bbox2.y < bbox1.y2 && bbox2.y > bbox1.y);\n  }\n\n  function base3(t, p1, p2, p3, p4) {\n    var t1 = -3 * p1 + 9 * p2 - 9 * p3 + 3 * p4,\n        t2 = t * t1 + 6 * p1 - 12 * p2 + 6 * p3;\n    return t * t2 - 3 * p1 + 3 * p2;\n  }\n\n  function bezlen(x1, y1, x2, y2, x3, y3, x4, y4, z) {\n\n    if (z == null) {\n      z = 1;\n    }\n\n    z = z > 1 ? 1 : z < 0 ? 0 : z;\n\n    var z2 = z / 2,\n        n = 12,\n        Tvalues = [-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],\n        Cvalues = [0.2491,0.2491,0.2335,0.2335,0.2032,0.2032,0.1601,0.1601,0.1069,0.1069,0.0472,0.0472],\n        sum = 0;\n\n    for (var i = 0; i < n; i++) {\n      var ct = z2 * Tvalues[i] + z2,\n          xbase = base3(ct, x1, x2, x3, x4),\n          ybase = base3(ct, y1, y2, y3, y4),\n          comb = xbase * xbase + ybase * ybase;\n\n      sum += Cvalues[i] * math.sqrt(comb);\n    }\n\n    return z2 * sum;\n  }\n\n\n  function intersectLines(x1, y1, x2, y2, x3, y3, x4, y4) {\n\n    if (\n      mmax(x1, x2) < mmin(x3, x4) ||\n        mmin(x1, x2) > mmax(x3, x4) ||\n        mmax(y1, y2) < mmin(y3, y4) ||\n        mmin(y1, y2) > mmax(y3, y4)\n    ) {\n      return;\n    }\n\n    var nx = (x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4),\n        ny = (x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4),\n        denominator = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);\n\n    if (!denominator) {\n      return;\n    }\n\n    var px = fixError(nx / denominator),\n        py = fixError(ny / denominator),\n        px2 = +px.toFixed(2),\n        py2 = +py.toFixed(2);\n\n    if (\n      px2 < +mmin(x1, x2).toFixed(2) ||\n        px2 > +mmax(x1, x2).toFixed(2) ||\n        px2 < +mmin(x3, x4).toFixed(2) ||\n        px2 > +mmax(x3, x4).toFixed(2) ||\n        py2 < +mmin(y1, y2).toFixed(2) ||\n        py2 > +mmax(y1, y2).toFixed(2) ||\n        py2 < +mmin(y3, y4).toFixed(2) ||\n        py2 > +mmax(y3, y4).toFixed(2)\n    ) {\n      return;\n    }\n\n    return { x: px, y: py };\n  }\n\n  function fixError(number) {\n    return Math.round(number * 100000000000) / 100000000000;\n  }\n\n  function findBezierIntersections(bez1, bez2, justCount) {\n    var bbox1 = bezierBBox(bez1),\n        bbox2 = bezierBBox(bez2);\n\n    if (!isBBoxIntersect(bbox1, bbox2)) {\n      return justCount ? 0 : [];\n    }\n\n    // As an optimization, lines will have only 1 segment\n\n    var l1 = bezlen.apply(0, bez1),\n        l2 = bezlen.apply(0, bez2),\n        n1 = isLine(bez1) ? 1 : ~~(l1 / 5) || 1,\n        n2 = isLine(bez2) ? 1 : ~~(l2 / 5) || 1,\n        dots1 = [],\n        dots2 = [],\n        xy = {},\n        res = justCount ? 0 : [];\n\n    for (var i = 0; i < n1 + 1; i++) {\n      var p = findDotsAtSegment.apply(0, bez1.concat(i / n1));\n      dots1.push({ x: p.x, y: p.y, t: i / n1 });\n    }\n\n    for (i = 0; i < n2 + 1; i++) {\n      p = findDotsAtSegment.apply(0, bez2.concat(i / n2));\n      dots2.push({ x: p.x, y: p.y, t: i / n2 });\n    }\n\n    for (i = 0; i < n1; i++) {\n\n      for (var j = 0; j < n2; j++) {\n        var di = dots1[i],\n            di1 = dots1[i + 1],\n            dj = dots2[j],\n            dj1 = dots2[j + 1],\n            ci = abs$7(di1.x - di.x) < .01 ? 'y' : 'x',\n            cj = abs$7(dj1.x - dj.x) < .01 ? 'y' : 'x',\n            is = intersectLines(di.x, di.y, di1.x, di1.y, dj.x, dj.y, dj1.x, dj1.y),\n            key;\n\n        if (is) {\n          key = is.x.toFixed(9) + '#' + is.y.toFixed(9);\n\n          if (xy[key]) {\n            continue;\n          }\n\n          xy[key] = true;\n\n          var t1 = di.t + abs$7((is[ci] - di[ci]) / (di1[ci] - di[ci])) * (di1.t - di.t),\n              t2 = dj.t + abs$7((is[cj] - dj[cj]) / (dj1[cj] - dj[cj])) * (dj1.t - dj.t);\n\n          if (t1 >= 0 && t1 <= 1 && t2 >= 0 && t2 <= 1) {\n\n            if (justCount) {\n              res++;\n            } else {\n              res.push({\n                x: is.x,\n                y: is.y,\n                t1: t1,\n                t2: t2\n              });\n            }\n          }\n        }\n      }\n    }\n\n    return res;\n  }\n\n\n  /**\n   * Find or counts the intersections between two SVG paths.\n   *\n   * Returns a number in counting mode and a list of intersections otherwise.\n   *\n   * A single intersection entry contains the intersection coordinates (x, y)\n   * as well as additional information regarding the intersecting segments\n   * on each path (segment1, segment2) and the relative location of the\n   * intersection on these segments (t1, t2).\n   *\n   * The path may be an SVG path string or a list of path components\n   * such as `[ [ 'M', 0, 10 ], [ 'L', 20, 0 ] ]`.\n   *\n   * @example\n   *\n   * var intersections = findPathIntersections(\n   *   'M0,0L100,100',\n   *   [ [ 'M', 0, 100 ], [ 'L', 100, 0 ] ]\n   * );\n   *\n   * // intersections = [\n   * //   { x: 50, y: 50, segment1: 1, segment2: 1, t1: 0.5, t2: 0.5 }\n   * // ]\n   *\n   * @param {String|Array<PathDef>} path1\n   * @param {String|Array<PathDef>} path2\n   * @param {Boolean} [justCount=false]\n   *\n   * @return {Array<Intersection>|Number}\n   */\n  function findPathIntersections(path1, path2, justCount) {\n    path1 = pathToCurve(path1);\n    path2 = pathToCurve(path2);\n\n    var x1, y1, x2, y2, x1m, y1m, x2m, y2m, bez1, bez2,\n        res = justCount ? 0 : [];\n\n    for (var i = 0, ii = path1.length; i < ii; i++) {\n      var pi = path1[i];\n\n      if (pi[0] == 'M') {\n        x1 = x1m = pi[1];\n        y1 = y1m = pi[2];\n      } else {\n\n        if (pi[0] == 'C') {\n          bez1 = [x1, y1].concat(pi.slice(1));\n          x1 = bez1[6];\n          y1 = bez1[7];\n        } else {\n          bez1 = [x1, y1, x1, y1, x1m, y1m, x1m, y1m];\n          x1 = x1m;\n          y1 = y1m;\n        }\n\n        for (var j = 0, jj = path2.length; j < jj; j++) {\n          var pj = path2[j];\n\n          if (pj[0] == 'M') {\n            x2 = x2m = pj[1];\n            y2 = y2m = pj[2];\n          } else {\n\n            if (pj[0] == 'C') {\n              bez2 = [x2, y2].concat(pj.slice(1));\n              x2 = bez2[6];\n              y2 = bez2[7];\n            } else {\n              bez2 = [x2, y2, x2, y2, x2m, y2m, x2m, y2m];\n              x2 = x2m;\n              y2 = y2m;\n            }\n\n            var intr = findBezierIntersections(bez1, bez2, justCount);\n\n            if (justCount) {\n              res += intr;\n            } else {\n\n              for (var k = 0, kk = intr.length; k < kk; k++) {\n                intr[k].segment1 = i;\n                intr[k].segment2 = j;\n                intr[k].bez1 = bez1;\n                intr[k].bez2 = bez2;\n              }\n\n              res = res.concat(intr);\n            }\n          }\n        }\n      }\n    }\n\n    return res;\n  }\n\n\n  function pathToAbsolute(pathArray) {\n    var pth = paths(pathArray);\n\n    if (pth.abs) {\n      return pathClone(pth.abs);\n    }\n\n    if (!isArray(pathArray) || !isArray(pathArray && pathArray[0])) { // rough assumption\n      pathArray = parsePathString(pathArray);\n    }\n\n    if (!pathArray || !pathArray.length) {\n      return [['M', 0, 0]];\n    }\n\n    var res = [],\n        x = 0,\n        y = 0,\n        mx = 0,\n        my = 0,\n        start = 0,\n        pa0;\n\n    if (pathArray[0][0] == 'M') {\n      x = +pathArray[0][1];\n      y = +pathArray[0][2];\n      mx = x;\n      my = y;\n      start++;\n      res[0] = ['M', x, y];\n    }\n\n    for (var r, pa, i = start, ii = pathArray.length; i < ii; i++) {\n      res.push(r = []);\n      pa = pathArray[i];\n      pa0 = pa[0];\n\n      if (pa0 != pa0.toUpperCase()) {\n        r[0] = pa0.toUpperCase();\n\n        switch (r[0]) {\n        case 'A':\n          r[1] = pa[1];\n          r[2] = pa[2];\n          r[3] = pa[3];\n          r[4] = pa[4];\n          r[5] = pa[5];\n          r[6] = +pa[6] + x;\n          r[7] = +pa[7] + y;\n          break;\n        case 'V':\n          r[1] = +pa[1] + y;\n          break;\n        case 'H':\n          r[1] = +pa[1] + x;\n          break;\n        case 'M':\n          mx = +pa[1] + x;\n          my = +pa[2] + y;\n        default:\n          for (var j = 1, jj = pa.length; j < jj; j++) {\n            r[j] = +pa[j] + ((j % 2) ? x : y);\n          }\n        }\n      } else {\n        for (var k = 0, kk = pa.length; k < kk; k++) {\n          r[k] = pa[k];\n        }\n      }\n      pa0 = pa0.toUpperCase();\n\n      switch (r[0]) {\n      case 'Z':\n        x = +mx;\n        y = +my;\n        break;\n      case 'H':\n        x = r[1];\n        break;\n      case 'V':\n        y = r[1];\n        break;\n      case 'M':\n        mx = r[r.length - 2];\n        my = r[r.length - 1];\n      default:\n        x = r[r.length - 2];\n        y = r[r.length - 1];\n      }\n    }\n\n    res.toString = pathToString;\n    pth.abs = pathClone(res);\n\n    return res;\n  }\n\n  function isLine(bez) {\n    return (\n      bez[0] === bez[2] &&\n      bez[1] === bez[3] &&\n      bez[4] === bez[6] &&\n      bez[5] === bez[7]\n    );\n  }\n\n  function lineToCurve(x1, y1, x2, y2) {\n    return [\n      x1, y1, x2,\n      y2, x2, y2\n    ];\n  }\n\n  function qubicToCurve(x1, y1, ax, ay, x2, y2) {\n    var _13 = 1 / 3,\n        _23 = 2 / 3;\n\n    return [\n      _13 * x1 + _23 * ax,\n      _13 * y1 + _23 * ay,\n      _13 * x2 + _23 * ax,\n      _13 * y2 + _23 * ay,\n      x2,\n      y2\n    ];\n  }\n\n  function arcToCurve(x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2, recursive) {\n\n    // for more information of where this math came from visit:\n    // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n    var _120 = PI * 120 / 180,\n        rad = PI / 180 * (+angle || 0),\n        res = [],\n        xy,\n        rotate = cacher(function(x, y, rad) {\n          var X = x * math.cos(rad) - y * math.sin(rad),\n              Y = x * math.sin(rad) + y * math.cos(rad);\n\n          return { x: X, y: Y };\n        });\n\n    if (!recursive) {\n      xy = rotate(x1, y1, -rad);\n      x1 = xy.x;\n      y1 = xy.y;\n      xy = rotate(x2, y2, -rad);\n      x2 = xy.x;\n      y2 = xy.y;\n\n      var x = (x1 - x2) / 2,\n          y = (y1 - y2) / 2;\n\n      var h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n\n      if (h > 1) {\n        h = math.sqrt(h);\n        rx = h * rx;\n        ry = h * ry;\n      }\n\n      var rx2 = rx * rx,\n          ry2 = ry * ry,\n          k = (large_arc_flag == sweep_flag ? -1 : 1) *\n              math.sqrt(abs$7((rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x))),\n          cx = k * rx * y / ry + (x1 + x2) / 2,\n          cy = k * -ry * x / rx + (y1 + y2) / 2,\n          f1 = math.asin(((y1 - cy) / ry).toFixed(9)),\n          f2 = math.asin(((y2 - cy) / ry).toFixed(9));\n\n      f1 = x1 < cx ? PI - f1 : f1;\n      f2 = x2 < cx ? PI - f2 : f2;\n      f1 < 0 && (f1 = PI * 2 + f1);\n      f2 < 0 && (f2 = PI * 2 + f2);\n\n      if (sweep_flag && f1 > f2) {\n        f1 = f1 - PI * 2;\n      }\n      if (!sweep_flag && f2 > f1) {\n        f2 = f2 - PI * 2;\n      }\n    } else {\n      f1 = recursive[0];\n      f2 = recursive[1];\n      cx = recursive[2];\n      cy = recursive[3];\n    }\n\n    var df = f2 - f1;\n\n    if (abs$7(df) > _120) {\n      var f2old = f2,\n          x2old = x2,\n          y2old = y2;\n\n      f2 = f1 + _120 * (sweep_flag && f2 > f1 ? 1 : -1);\n      x2 = cx + rx * math.cos(f2);\n      y2 = cy + ry * math.sin(f2);\n      res = arcToCurve(x2, y2, rx, ry, angle, 0, sweep_flag, x2old, y2old, [f2, f2old, cx, cy]);\n    }\n\n    df = f2 - f1;\n\n    var c1 = math.cos(f1),\n        s1 = math.sin(f1),\n        c2 = math.cos(f2),\n        s2 = math.sin(f2),\n        t = math.tan(df / 4),\n        hx = 4 / 3 * rx * t,\n        hy = 4 / 3 * ry * t,\n        m1 = [x1, y1],\n        m2 = [x1 + hx * s1, y1 - hy * c1],\n        m3 = [x2 + hx * s2, y2 - hy * c2],\n        m4 = [x2, y2];\n\n    m2[0] = 2 * m1[0] - m2[0];\n    m2[1] = 2 * m1[1] - m2[1];\n\n    if (recursive) {\n      return [m2, m3, m4].concat(res);\n    } else {\n      res = [m2, m3, m4].concat(res).join().split(',');\n      var newres = [];\n\n      for (var i = 0, ii = res.length; i < ii; i++) {\n        newres[i] = i % 2 ? rotate(res[i - 1], res[i], rad).y : rotate(res[i], res[i + 1], rad).x;\n      }\n\n      return newres;\n    }\n  }\n\n  // Returns bounding box of cubic bezier curve.\n  // Source: http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html\n  // Original version: NISHIO Hirokazu\n  // Modifications: https://github.com/timo22345\n  function curveBBox(x0, y0, x1, y1, x2, y2, x3, y3) {\n    var tvalues = [],\n        bounds = [[], []],\n        a, b, c, t, t1, t2, b2ac, sqrtb2ac;\n\n    for (var i = 0; i < 2; ++i) {\n\n      if (i == 0) {\n        b = 6 * x0 - 12 * x1 + 6 * x2;\n        a = -3 * x0 + 9 * x1 - 9 * x2 + 3 * x3;\n        c = 3 * x1 - 3 * x0;\n      } else {\n        b = 6 * y0 - 12 * y1 + 6 * y2;\n        a = -3 * y0 + 9 * y1 - 9 * y2 + 3 * y3;\n        c = 3 * y1 - 3 * y0;\n      }\n\n      if (abs$7(a) < 1e-12) {\n\n        if (abs$7(b) < 1e-12) {\n          continue;\n        }\n\n        t = -c / b;\n\n        if (0 < t && t < 1) {\n          tvalues.push(t);\n        }\n\n        continue;\n      }\n\n      b2ac = b * b - 4 * c * a;\n      sqrtb2ac = math.sqrt(b2ac);\n\n      if (b2ac < 0) {\n        continue;\n      }\n\n      t1 = (-b + sqrtb2ac) / (2 * a);\n\n      if (0 < t1 && t1 < 1) {\n        tvalues.push(t1);\n      }\n\n      t2 = (-b - sqrtb2ac) / (2 * a);\n\n      if (0 < t2 && t2 < 1) {\n        tvalues.push(t2);\n      }\n    }\n\n    var j = tvalues.length,\n        jlen = j,\n        mt;\n\n    while (j--) {\n      t = tvalues[j];\n      mt = 1 - t;\n      bounds[0][j] = (mt * mt * mt * x0) + (3 * mt * mt * t * x1) + (3 * mt * t * t * x2) + (t * t * t * x3);\n      bounds[1][j] = (mt * mt * mt * y0) + (3 * mt * mt * t * y1) + (3 * mt * t * t * y2) + (t * t * t * y3);\n    }\n\n    bounds[0][jlen] = x0;\n    bounds[1][jlen] = y0;\n    bounds[0][jlen + 1] = x3;\n    bounds[1][jlen + 1] = y3;\n    bounds[0].length = bounds[1].length = jlen + 2;\n\n    return {\n      x0: mmin.apply(0, bounds[0]),\n      y0: mmin.apply(0, bounds[1]),\n      x1: mmax.apply(0, bounds[0]),\n      y1: mmax.apply(0, bounds[1])\n    };\n  }\n\n  function pathToCurve(path) {\n\n    var pth = paths(path);\n\n    // return cached curve, if existing\n    if (pth.curve) {\n      return pathClone(pth.curve);\n    }\n\n    var curvedPath = pathToAbsolute(path),\n        attrs = { x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null },\n        processPath = function(path, d, pathCommand) {\n          var nx, ny;\n\n          if (!path) {\n            return ['C', d.x, d.y, d.x, d.y, d.x, d.y];\n          }\n\n          !(path[0] in { T: 1, Q: 1 }) && (d.qx = d.qy = null);\n\n          switch (path[0]) {\n          case 'M':\n            d.X = path[1];\n            d.Y = path[2];\n            break;\n          case 'A':\n            path = ['C'].concat(arcToCurve.apply(0, [d.x, d.y].concat(path.slice(1))));\n            break;\n          case 'S':\n            if (pathCommand == 'C' || pathCommand == 'S') {\n\n              // In 'S' case we have to take into account, if the previous command is C/S.\n              nx = d.x * 2 - d.bx;\n\n              // And reflect the previous\n              ny = d.y * 2 - d.by;\n\n              // command's control point relative to the current point.\n            }\n            else {\n\n              // or some else or nothing\n              nx = d.x;\n              ny = d.y;\n            }\n            path = ['C', nx, ny].concat(path.slice(1));\n            break;\n          case 'T':\n            if (pathCommand == 'Q' || pathCommand == 'T') {\n\n              // In 'T' case we have to take into account, if the previous command is Q/T.\n              d.qx = d.x * 2 - d.qx;\n\n              // And make a reflection similar\n              d.qy = d.y * 2 - d.qy;\n\n              // to case 'S'.\n            }\n            else {\n\n              // or something else or nothing\n              d.qx = d.x;\n              d.qy = d.y;\n            }\n            path = ['C'].concat(qubicToCurve(d.x, d.y, d.qx, d.qy, path[1], path[2]));\n            break;\n          case 'Q':\n            d.qx = path[1];\n            d.qy = path[2];\n            path = ['C'].concat(qubicToCurve(d.x, d.y, path[1], path[2], path[3], path[4]));\n            break;\n          case 'L':\n            path = ['C'].concat(lineToCurve(d.x, d.y, path[1], path[2]));\n            break;\n          case 'H':\n            path = ['C'].concat(lineToCurve(d.x, d.y, path[1], d.y));\n            break;\n          case 'V':\n            path = ['C'].concat(lineToCurve(d.x, d.y, d.x, path[1]));\n            break;\n          case 'Z':\n            path = ['C'].concat(lineToCurve(d.x, d.y, d.X, d.Y));\n            break;\n          }\n\n          return path;\n        },\n\n        fixArc = function(pp, i) {\n\n          if (pp[i].length > 7) {\n            pp[i].shift();\n            var pi = pp[i];\n\n            while (pi.length) {\n              pathCommands[i] = 'A'; // if created multiple C:s, their original seg is saved\n              pp.splice(i++, 0, ['C'].concat(pi.splice(0, 6)));\n            }\n\n            pp.splice(i, 1);\n            ii = curvedPath.length;\n          }\n        },\n\n        pathCommands = [], // path commands of original path p\n        pfirst = '', // temporary holder for original path command\n        pathCommand = ''; // holder for previous path command of original path\n\n    for (var i = 0, ii = curvedPath.length; i < ii; i++) {\n      curvedPath[i] && (pfirst = curvedPath[i][0]); // save current path command\n\n      if (pfirst != 'C') // C is not saved yet, because it may be result of conversion\n      {\n        pathCommands[i] = pfirst; // Save current path command\n        i && (pathCommand = pathCommands[i - 1]); // Get previous path command pathCommand\n      }\n      curvedPath[i] = processPath(curvedPath[i], attrs, pathCommand); // Previous path command is inputted to processPath\n\n      if (pathCommands[i] != 'A' && pfirst == 'C') pathCommands[i] = 'C'; // A is the only command\n      // which may produce multiple C:s\n      // so we have to make sure that C is also C in original path\n\n      fixArc(curvedPath, i); // fixArc adds also the right amount of A:s to pathCommands\n\n      var seg = curvedPath[i],\n          seglen = seg.length;\n\n      attrs.x = seg[seglen - 2];\n      attrs.y = seg[seglen - 1];\n      attrs.bx = toFloat(seg[seglen - 4]) || attrs.x;\n      attrs.by = toFloat(seg[seglen - 3]) || attrs.y;\n    }\n\n    // cache curve\n    pth.curve = pathClone(curvedPath);\n\n    return curvedPath;\n  }\n\n  var intersect = findPathIntersections;\n\n  var intersectPaths = /*@__PURE__*/getDefaultExportFromCjs(intersect);\n\n  /**\n   * Checks whether a value is an instance of Connection.\n   *\n   * @param {any} value\n   *\n   * @return {boolean}\n   */\n  function isConnection(value) {\n    return isObject(value) && has$1(value, 'waypoints');\n  }\n\n  /**\n   * Checks whether a value is an instance of Label.\n   *\n   * @param {any} value\n   *\n   * @return {boolean}\n   */\n  function isLabel(value) {\n    return isObject(value) && has$1(value, 'labelTarget');\n  }\n\n  /**\n   * @typedef {import('../core/Types').ElementLike} Element\n   * @typedef {import('../core/Types').ConnectionLike} Connection\n   *\n   * @typedef {import('../util/Types').DirectionTRBL} DirectionTRBL\n   * @typedef {import('../util/Types').Point} Point\n   * @typedef {import('../util/Types').Rect} Rect\n   * @typedef {import('../util/Types').RectTRBL} RectTRBL\n   */\n\n  /**\n   * @param {Rect} bounds\n   *\n   * @returns {Rect}\n   */\n  function roundBounds(bounds) {\n    return {\n      x: Math.round(bounds.x),\n      y: Math.round(bounds.y),\n      width: Math.round(bounds.width),\n      height: Math.round(bounds.height)\n    };\n  }\n\n  /**\n   * @param {Point} point\n   *\n   * @returns {Point}\n   */\n  function roundPoint(point) {\n\n    return {\n      x: Math.round(point.x),\n      y: Math.round(point.y)\n    };\n  }\n\n\n  /**\n   * Convert the given bounds to a { top, left, bottom, right } descriptor.\n   *\n   * @param {Point|Rect} bounds\n   *\n   * @return {RectTRBL}\n   */\n  function asTRBL(bounds) {\n    return {\n      top: bounds.y,\n      right: bounds.x + (bounds.width || 0),\n      bottom: bounds.y + (bounds.height || 0),\n      left: bounds.x\n    };\n  }\n\n\n  /**\n   * Convert a { top, left, bottom, right } to an objects bounds.\n   *\n   * @param {RectTRBL} trbl\n   *\n   * @return {Rect}\n   */\n  function asBounds(trbl) {\n    return {\n      x: trbl.left,\n      y: trbl.top,\n      width: trbl.right - trbl.left,\n      height: trbl.bottom - trbl.top\n    };\n  }\n\n\n  /**\n   * Get the mid of the given bounds or point.\n   *\n   * @param {Point|Rect} bounds\n   *\n   * @return {Point}\n   */\n  function getBoundsMid(bounds) {\n    return roundPoint({\n      x: bounds.x + (bounds.width || 0) / 2,\n      y: bounds.y + (bounds.height || 0) / 2\n    });\n  }\n\n\n  /**\n   * Get the mid of the given Connection.\n   *\n   * @param {Connection} connection\n   *\n   * @return {Point}\n   */\n  function getConnectionMid(connection) {\n    var waypoints = connection.waypoints;\n\n    // calculate total length and length of each segment\n    var parts = waypoints.reduce(function(parts, point, index) {\n\n      var lastPoint = waypoints[index - 1];\n\n      if (lastPoint) {\n        var lastPart = parts[parts.length - 1];\n\n        var startLength = lastPart && lastPart.endLength || 0;\n        var length = distance(lastPoint, point);\n\n        parts.push({\n          start: lastPoint,\n          end: point,\n          startLength: startLength,\n          endLength: startLength + length,\n          length: length\n        });\n      }\n\n      return parts;\n    }, []);\n\n    var totalLength = parts.reduce(function(length, part) {\n      return length + part.length;\n    }, 0);\n\n    // find which segement contains middle point\n    var midLength = totalLength / 2;\n\n    var i = 0;\n    var midSegment = parts[i];\n\n    while (midSegment.endLength < midLength) {\n      midSegment = parts[++i];\n    }\n\n    // calculate relative position on mid segment\n    var segmentProgress = (midLength - midSegment.startLength) / midSegment.length;\n\n    var midPoint = {\n      x: midSegment.start.x + (midSegment.end.x - midSegment.start.x) * segmentProgress,\n      y: midSegment.start.y + (midSegment.end.y - midSegment.start.y) * segmentProgress\n    };\n\n    return midPoint;\n  }\n\n\n  /**\n   * Get the mid of the given Element.\n   *\n   * @param {Element} element\n   *\n   * @return {Point}\n   */\n  function getMid(element) {\n    if (isConnection(element)) {\n      return getConnectionMid(element);\n    }\n\n    return getBoundsMid(element);\n  }\n\n  // orientation utils //////////////////////\n\n  /**\n   * Get orientation of the given rectangle with respect to\n   * the reference rectangle.\n   *\n   * A padding (positive or negative) may be passed to influence\n   * horizontal / vertical orientation and intersection.\n   *\n   * @param {Rect} rect\n   * @param {Rect} reference\n   * @param {Point|number} padding\n   *\n   * @return {DirectionTRBL} the orientation; one of top, top-left, left, ..., bottom, right or intersect.\n   */\n  function getOrientation(rect, reference, padding) {\n\n    padding = padding || 0;\n\n    // make sure we can use an object, too\n    // for individual { x, y } padding\n    if (!isObject(padding)) {\n      padding = { x: padding, y: padding };\n    }\n\n\n    var rectOrientation = asTRBL(rect),\n        referenceOrientation = asTRBL(reference);\n\n    var top = rectOrientation.bottom + padding.y <= referenceOrientation.top,\n        right = rectOrientation.left - padding.x >= referenceOrientation.right,\n        bottom = rectOrientation.top - padding.y >= referenceOrientation.bottom,\n        left = rectOrientation.right + padding.x <= referenceOrientation.left;\n\n    var vertical = top ? 'top' : (bottom ? 'bottom' : null),\n        horizontal = left ? 'left' : (right ? 'right' : null);\n\n    if (horizontal && vertical) {\n      return vertical + '-' + horizontal;\n    } else {\n      return horizontal || vertical || 'intersect';\n    }\n  }\n\n\n  // intersection utils //////////////////////\n\n  /**\n   * Get intersection between an element and a line path.\n   *\n   * @param {string} elementPath\n   * @param {string} linePath\n   * @param {boolean} cropStart Whether to crop start or end.\n   *\n   * @return {Point}\n   */\n  function getElementLineIntersection(elementPath, linePath, cropStart) {\n\n    var intersections = getIntersections(elementPath, linePath);\n\n    // recognize intersections\n    // only one -> choose\n    // two close together -> choose first\n    // two or more distinct -> pull out appropriate one\n    // none -> ok (fallback to point itself)\n    if (intersections.length === 1) {\n      return roundPoint(intersections[0]);\n    } else if (intersections.length === 2 && pointDistance(intersections[0], intersections[1]) < 1) {\n      return roundPoint(intersections[0]);\n    } else if (intersections.length > 1) {\n\n      // sort by intersections based on connection segment +\n      // distance from start\n      intersections = sortBy(intersections, function(i) {\n        var distance = Math.floor(i.t2 * 100) || 1;\n\n        distance = 100 - distance;\n\n        distance = (distance < 10 ? '0' : '') + distance;\n\n        // create a sort string that makes sure we sort\n        // line segment ASC + line segment position DESC (for cropStart)\n        // line segment ASC + line segment position ASC (for cropEnd)\n        return i.segment2 + '#' + distance;\n      });\n\n      return roundPoint(intersections[cropStart ? 0 : intersections.length - 1]);\n    }\n\n    return null;\n  }\n\n\n  function getIntersections(a, b) {\n    return intersectPaths(a, b);\n  }\n\n\n  function filterRedundantWaypoints(waypoints) {\n\n    // alter copy of waypoints, not original\n    waypoints = waypoints.slice();\n\n    var idx = 0,\n        point,\n        previousPoint,\n        nextPoint;\n\n    while (waypoints[idx]) {\n      point = waypoints[idx];\n      previousPoint = waypoints[idx - 1];\n      nextPoint = waypoints[idx + 1];\n\n      if (pointDistance(point, nextPoint) === 0 ||\n          pointsOnLine(previousPoint, nextPoint, point)) {\n\n        // remove point, if overlapping with {nextPoint}\n        // or on line with {previousPoint} -> {point} -> {nextPoint}\n        waypoints.splice(idx, 1);\n      } else {\n        idx++;\n      }\n    }\n\n    return waypoints;\n  }\n\n  // helpers //////////////////////\n\n  function distance(a, b) {\n    return Math.sqrt(Math.pow(a.x - b.x, 2) + Math.pow(a.y - b.y, 2));\n  }\n\n  /**\n   * @typedef {import('./Types').ConnectionLike} ConnectionLike\n   * @typedef {import('./Types').RootLike} RootLike\n   * @typedef {import('./Types').ParentLike } ParentLike\n   * @typedef {import('./Types').ShapeLike} ShapeLike\n   *\n   * @typedef { {\n   *   container?: HTMLElement;\n   *   deferUpdate?: boolean;\n   *   width?: number;\n   *   height?: number;\n   * } } CanvasConfig\n   * @typedef { {\n   *   group: SVGElement;\n   *   index: number;\n   *   visible: boolean;\n   * } } CanvasLayer\n   * @typedef { {\n   *   [key: string]: CanvasLayer;\n   * } } CanvasLayers\n   * @typedef { {\n   *   rootElement: ShapeLike;\n   *   layer: CanvasLayer;\n   * } } CanvasPlane\n   * @typedef { {\n   *   scale: number;\n   *   inner: Rect;\n   *   outer: Dimensions;\n   * } & Rect } CanvasViewbox\n   *\n   * @typedef {import('./ElementRegistry').default} ElementRegistry\n   * @typedef {import('./EventBus').default} EventBus\n   * @typedef {import('./GraphicsFactory').default} GraphicsFactory\n   *\n   * @typedef {import('../util/Types').Dimensions} Dimensions\n   * @typedef {import('../util/Types').Point} Point\n   * @typedef {import('../util/Types').Rect} Rect\n   * @typedef {import('../util/Types').RectTRBL} RectTRBL\n   */\n\n  function round$b(number, resolution) {\n    return Math.round(number * resolution) / resolution;\n  }\n\n  function ensurePx(number) {\n    return isNumber(number) ? number + 'px' : number;\n  }\n\n  function findRoot(element) {\n    while (element.parent) {\n      element = element.parent;\n    }\n\n    return element;\n  }\n\n  /**\n   * Creates a HTML container element for a SVG element with\n   * the given configuration\n   *\n   * @param {CanvasConfig} options\n   *\n   * @return {HTMLElement} the container element\n   */\n  function createContainer(options) {\n\n    options = assign$1({}, { width: '100%', height: '100%' }, options);\n\n    const container = options.container || document.body;\n\n    // create a <div> around the svg element with the respective size\n    // this way we can always get the correct container size\n    // (this is impossible for <svg> elements at the moment)\n    const parent = document.createElement('div');\n    parent.setAttribute('class', 'djs-container djs-parent');\n\n    assign(parent, {\n      position: 'relative',\n      overflow: 'hidden',\n      width: ensurePx(options.width),\n      height: ensurePx(options.height)\n    });\n\n    container.appendChild(parent);\n\n    return parent;\n  }\n\n  function createGroup(parent, cls, childIndex) {\n    const group = create$1('g');\n    classes(group).add(cls);\n\n    const index = childIndex !== undefined ? childIndex : parent.childNodes.length - 1;\n\n    // must ensure second argument is node or _null_\n    // cf. https://developer.mozilla.org/en-US/docs/Web/API/Node/insertBefore\n    parent.insertBefore(group, parent.childNodes[index] || null);\n\n    return group;\n  }\n\n  const BASE_LAYER = 'base';\n\n  // render plane contents behind utility layers\n  const PLANE_LAYER_INDEX = 0;\n  const UTILITY_LAYER_INDEX = 1;\n\n\n  const REQUIRED_MODEL_ATTRS = {\n    shape: [ 'x', 'y', 'width', 'height' ],\n    connection: [ 'waypoints' ]\n  };\n\n  /**\n   * The main drawing canvas.\n   *\n   * @class\n   * @constructor\n   *\n   * @emits Canvas#canvas.init\n   *\n   * @param {CanvasConfig|null} config\n   * @param {EventBus} eventBus\n   * @param {GraphicsFactory} graphicsFactory\n   * @param {ElementRegistry} elementRegistry\n   */\n  function Canvas(config, eventBus, graphicsFactory, elementRegistry) {\n    this._eventBus = eventBus;\n    this._elementRegistry = elementRegistry;\n    this._graphicsFactory = graphicsFactory;\n\n    /**\n     * @type {number}\n     */\n    this._rootsIdx = 0;\n\n    /**\n     * @type {CanvasLayers}\n     */\n    this._layers = {};\n\n    /**\n     * @type {CanvasPlane[]}\n     */\n    this._planes = [];\n\n    /**\n     * @type {RootLike|null}\n     */\n    this._rootElement = null;\n\n    this._init(config || {});\n  }\n\n  Canvas.$inject = [\n    'config.canvas',\n    'eventBus',\n    'graphicsFactory',\n    'elementRegistry'\n  ];\n\n  /**\n   * Creates a <svg> element that is wrapped into a <div>.\n   * This way we are always able to correctly figure out the size of the svg element\n   * by querying the parent node.\n\n   * (It is not possible to get the size of a svg element cross browser @ 2014-04-01)\n\n   * <div class=\"djs-container\" style=\"width: {desired-width}, height: {desired-height}\">\n   *   <svg width=\"100%\" height=\"100%\">\n   *    ...\n   *   </svg>\n   * </div>\n   *\n   * @param {CanvasConfig} config\n   */\n  Canvas.prototype._init = function(config) {\n\n    const eventBus = this._eventBus;\n\n    // html container\n    const container = this._container = createContainer(config);\n\n    const svg = this._svg = create$1('svg');\n    attr(svg, { width: '100%', height: '100%' });\n\n    append(container, svg);\n\n    const viewport = this._viewport = createGroup(svg, 'viewport');\n\n    // debounce canvas.viewbox.changed events\n    // for smoother diagram interaction\n    if (config.deferUpdate !== false) {\n      this._viewboxChanged = debounce(bind$2(this._viewboxChanged, this), 300);\n    }\n\n    eventBus.on('diagram.init', () => {\n\n      /**\n       * An event indicating that the canvas is ready to be drawn on.\n       *\n       * @memberOf Canvas\n       *\n       * @event canvas.init\n       *\n       * @type {Object}\n       * @property {SVGElement} svg the created svg element\n       * @property {SVGElement} viewport the direct parent of diagram elements and shapes\n       */\n      eventBus.fire('canvas.init', {\n        svg: svg,\n        viewport: viewport\n      });\n\n    });\n\n    // reset viewbox on shape changes to\n    // recompute the viewbox\n    eventBus.on([\n      'shape.added',\n      'connection.added',\n      'shape.removed',\n      'connection.removed',\n      'elements.changed',\n      'root.set'\n    ], () => {\n      delete this._cachedViewbox;\n    });\n\n    eventBus.on('diagram.destroy', 500, this._destroy, this);\n    eventBus.on('diagram.clear', 500, this._clear, this);\n  };\n\n  Canvas.prototype._destroy = function() {\n    this._eventBus.fire('canvas.destroy', {\n      svg: this._svg,\n      viewport: this._viewport\n    });\n\n    const parent = this._container.parentNode;\n\n    if (parent) {\n      parent.removeChild(this._container);\n    }\n\n    delete this._svg;\n    delete this._container;\n    delete this._layers;\n    delete this._planes;\n    delete this._rootElement;\n    delete this._viewport;\n  };\n\n  Canvas.prototype._clear = function() {\n\n    const allElements = this._elementRegistry.getAll();\n\n    // remove all elements\n    allElements.forEach(element => {\n      const type = getType(element);\n\n      if (type === 'root') {\n        this.removeRootElement(element);\n      } else {\n        this._removeElement(element, type);\n      }\n    });\n\n    // remove all planes\n    this._planes = [];\n    this._rootElement = null;\n\n    // force recomputation of view box\n    delete this._cachedViewbox;\n  };\n\n  /**\n   * Returns the default layer on which\n   * all elements are drawn.\n   *\n   * @return {SVGElement}  The SVG element of the layer.\n   */\n  Canvas.prototype.getDefaultLayer = function() {\n    return this.getLayer(BASE_LAYER, PLANE_LAYER_INDEX);\n  };\n\n  /**\n   * Returns a layer that is used to draw elements\n   * or annotations on it.\n   *\n   * Non-existing layers retrieved through this method\n   * will be created. During creation, the optional index\n   * may be used to create layers below or above existing layers.\n   * A layer with a certain index is always created above all\n   * existing layers with the same index.\n   *\n   * @param {string} name The name of the layer.\n   * @param {number} [index] The index of the layer.\n   *\n   * @return {SVGElement} The SVG element of the layer.\n   */\n  Canvas.prototype.getLayer = function(name, index) {\n\n    if (!name) {\n      throw new Error('must specify a name');\n    }\n\n    let layer = this._layers[name];\n\n    if (!layer) {\n      layer = this._layers[name] = this._createLayer(name, index);\n    }\n\n    // throw an error if layer creation / retrival is\n    // requested on different index\n    if (typeof index !== 'undefined' && layer.index !== index) {\n      throw new Error('layer <' + name + '> already created at index <' + index + '>');\n    }\n\n    return layer.group;\n  };\n\n  /**\n   * For a given index, return the number of layers that have a higher index and\n   * are visible.\n   *\n   * This is used to determine the node a layer should be inserted at.\n   *\n   * @param {number} index\n   *\n   * @return {number}\n   */\n  Canvas.prototype._getChildIndex = function(index) {\n    return reduce(this._layers, function(childIndex, layer) {\n      if (layer.visible && index >= layer.index) {\n        childIndex++;\n      }\n\n      return childIndex;\n    }, 0);\n  };\n\n  /**\n   * Creates a given layer and returns it.\n   *\n   * @param {string} name\n   * @param {number} [index=0]\n   *\n   * @return {CanvasLayer}\n   */\n  Canvas.prototype._createLayer = function(name, index) {\n\n    if (typeof index === 'undefined') {\n      index = UTILITY_LAYER_INDEX;\n    }\n\n    const childIndex = this._getChildIndex(index);\n\n    return {\n      group: createGroup(this._viewport, 'layer-' + name, childIndex),\n      index: index,\n      visible: true\n    };\n  };\n\n\n  /**\n   * Shows a given layer.\n   *\n   * @param {string} name The name of the layer.\n   *\n   * @return {SVGElement} The SVG element of the layer.\n   */\n  Canvas.prototype.showLayer = function(name) {\n\n    if (!name) {\n      throw new Error('must specify a name');\n    }\n\n    const layer = this._layers[name];\n\n    if (!layer) {\n      throw new Error('layer <' + name + '> does not exist');\n    }\n\n    const viewport = this._viewport;\n    const group = layer.group;\n    const index = layer.index;\n\n    if (layer.visible) {\n      return group;\n    }\n\n    const childIndex = this._getChildIndex(index);\n\n    viewport.insertBefore(group, viewport.childNodes[childIndex] || null);\n\n    layer.visible = true;\n\n    return group;\n  };\n\n  /**\n   * Hides a given layer.\n   *\n   * @param {string} name The name of the layer.\n   *\n   * @return {SVGElement} The SVG element of the layer.\n   */\n  Canvas.prototype.hideLayer = function(name) {\n\n    if (!name) {\n      throw new Error('must specify a name');\n    }\n\n    const layer = this._layers[name];\n\n    if (!layer) {\n      throw new Error('layer <' + name + '> does not exist');\n    }\n\n    const group = layer.group;\n\n    if (!layer.visible) {\n      return group;\n    }\n\n    remove$1(group);\n\n    layer.visible = false;\n\n    return group;\n  };\n\n\n  Canvas.prototype._removeLayer = function(name) {\n\n    const layer = this._layers[name];\n\n    if (layer) {\n      delete this._layers[name];\n\n      remove$1(layer.group);\n    }\n  };\n\n  /**\n   * Returns the currently active layer. Can be null.\n   *\n   * @return {CanvasLayer|null} The active layer of `null`.\n   */\n  Canvas.prototype.getActiveLayer = function() {\n    const plane = this._findPlaneForRoot(this.getRootElement());\n\n    if (!plane) {\n      return null;\n    }\n\n    return plane.layer;\n  };\n\n\n  /**\n   * Returns the plane which contains the given element.\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element or its ID.\n   *\n   * @return {RootLike|undefined} The root of the element.\n   */\n  Canvas.prototype.findRoot = function(element) {\n    if (typeof element === 'string') {\n      element = this._elementRegistry.get(element);\n    }\n\n    if (!element) {\n      return;\n    }\n\n    const plane = this._findPlaneForRoot(\n      findRoot(element)\n    ) || {};\n\n    return plane.rootElement;\n  };\n\n  /**\n   * Return a list of all root elements on the diagram.\n   *\n   * @return {(RootLike)[]} The list of root elements.\n   */\n  Canvas.prototype.getRootElements = function() {\n    return this._planes.map(function(plane) {\n      return plane.rootElement;\n    });\n  };\n\n  Canvas.prototype._findPlaneForRoot = function(rootElement) {\n    return find(this._planes, function(plane) {\n      return plane.rootElement === rootElement;\n    });\n  };\n\n\n  /**\n   * Returns the html element that encloses the\n   * drawing canvas.\n   *\n   * @return {HTMLElement} The HTML element of the container.\n   */\n  Canvas.prototype.getContainer = function() {\n    return this._container;\n  };\n\n\n  // markers //////////////////////\n\n  Canvas.prototype._updateMarker = function(element, marker, add) {\n    let container;\n\n    if (!element.id) {\n      element = this._elementRegistry.get(element);\n    }\n\n    // we need to access all\n    container = this._elementRegistry._elements[element.id];\n\n    if (!container) {\n      return;\n    }\n\n    forEach$1([ container.gfx, container.secondaryGfx ], function(gfx) {\n      if (gfx) {\n\n        // invoke either addClass or removeClass based on mode\n        if (add) {\n          classes(gfx).add(marker);\n        } else {\n          classes(gfx).remove(marker);\n        }\n      }\n    });\n\n    /**\n     * An event indicating that a marker has been updated for an element\n     *\n     * @event element.marker.update\n     * @type {Object}\n     * @property {Element} element the shape\n     * @property {SVGElement} gfx the graphical representation of the shape\n     * @property {string} marker\n     * @property {boolean} add true if the marker was added, false if it got removed\n     */\n    this._eventBus.fire('element.marker.update', { element: element, gfx: container.gfx, marker: marker, add: !!add });\n  };\n\n\n  /**\n   * Adds a marker to an element (basically a css class).\n   *\n   * Fires the element.marker.update event, making it possible to\n   * integrate extension into the marker life-cycle, too.\n   *\n   * @example\n   *\n   * ```javascript\n   * canvas.addMarker('foo', 'some-marker');\n   *\n   * const fooGfx = canvas.getGraphics('foo');\n   *\n   * fooGfx; // <g class=\"... some-marker\"> ... </g>\n   * ```\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element or its ID.\n   * @param {string} marker The marker.\n   */\n  Canvas.prototype.addMarker = function(element, marker) {\n    this._updateMarker(element, marker, true);\n  };\n\n\n  /**\n   * Remove a marker from an element.\n   *\n   * Fires the element.marker.update event, making it possible to\n   * integrate extension into the marker life-cycle, too.\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element or its ID.\n   * @param {string} marker The marker.\n   */\n  Canvas.prototype.removeMarker = function(element, marker) {\n    this._updateMarker(element, marker, false);\n  };\n\n  /**\n   * Check whether an element has a given marker.\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element or its ID.\n   * @param {string} marker The marker.\n   */\n  Canvas.prototype.hasMarker = function(element, marker) {\n    if (!element.id) {\n      element = this._elementRegistry.get(element);\n    }\n\n    const gfx = this.getGraphics(element);\n\n    return classes(gfx).has(marker);\n  };\n\n  /**\n   * Toggles a marker on an element.\n   *\n   * Fires the element.marker.update event, making it possible to\n   * integrate extension into the marker life-cycle, too.\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element or its ID.\n   * @param {string} marker The marker.\n   */\n  Canvas.prototype.toggleMarker = function(element, marker) {\n    if (this.hasMarker(element, marker)) {\n      this.removeMarker(element, marker);\n    } else {\n      this.addMarker(element, marker);\n    }\n  };\n\n  /**\n   * Returns the current root element.\n   *\n   * Supports two different modes for handling root elements:\n   *\n   * 1. if no root element has been added before, an implicit root will be added\n   * and returned. This is used in applications that don't require explicit\n   * root elements.\n   *\n   * 2. when root elements have been added before calling `getRootElement`,\n   * root elements can be null. This is used for applications that want to manage\n   * root elements themselves.\n   *\n   * @return {RootLike} The current root element.\n   */\n  Canvas.prototype.getRootElement = function() {\n    const rootElement = this._rootElement;\n\n    // can return null if root elements are present but none was set yet\n    if (rootElement || this._planes.length) {\n      return rootElement;\n    }\n\n    return this.setRootElement(this.addRootElement(null));\n  };\n\n  /**\n   * Adds a given root element and returns it.\n   *\n   * @param {RootLike} [rootElement] The root element to be added.\n   *\n   * @return {RootLike} The added root element or an implicit root element.\n   */\n  Canvas.prototype.addRootElement = function(rootElement) {\n    const idx = this._rootsIdx++;\n\n    if (!rootElement) {\n      rootElement = {\n        id: '__implicitroot_' + idx,\n        children: [],\n        isImplicit: true\n      };\n    }\n\n    const layerName = rootElement.layer = 'root-' + idx;\n\n    this._ensureValid('root', rootElement);\n\n    const layer = this.getLayer(layerName, PLANE_LAYER_INDEX);\n\n    this.hideLayer(layerName);\n\n    this._addRoot(rootElement, layer);\n\n    this._planes.push({\n      rootElement: rootElement,\n      layer: layer\n    });\n\n    return rootElement;\n  };\n\n  /**\n   * Removes a given root element and returns it.\n   *\n   * @param {RootLike|string} rootElement element or element ID\n   *\n   * @return {RootLike|undefined} removed element\n   */\n  Canvas.prototype.removeRootElement = function(rootElement) {\n\n    if (typeof rootElement === 'string') {\n      rootElement = this._elementRegistry.get(rootElement);\n    }\n\n    const plane = this._findPlaneForRoot(rootElement);\n\n    if (!plane) {\n      return;\n    }\n\n    // hook up life-cycle events\n    this._removeRoot(rootElement);\n\n    // clean up layer\n    this._removeLayer(rootElement.layer);\n\n    // clean up plane\n    this._planes = this._planes.filter(function(plane) {\n      return plane.rootElement !== rootElement;\n    });\n\n    // clean up active root\n    if (this._rootElement === rootElement) {\n      this._rootElement = null;\n    }\n\n    return rootElement;\n  };\n\n\n  /**\n   * Sets a given element as the new root element for the canvas\n   * and returns the new root element.\n   *\n   * @param {RootLike} rootElement The root element to be set.\n   *\n   * @return {RootLike} The set root element.\n   */\n  Canvas.prototype.setRootElement = function(rootElement) {\n\n    if (rootElement === this._rootElement) {\n      return;\n    }\n\n    let plane;\n\n    if (!rootElement) {\n      throw new Error('rootElement required');\n    }\n\n    plane = this._findPlaneForRoot(rootElement);\n\n    // give set add semantics for backwards compatibility\n    if (!plane) {\n      rootElement = this.addRootElement(rootElement);\n    }\n\n    this._setRoot(rootElement);\n\n    return rootElement;\n  };\n\n\n  Canvas.prototype._removeRoot = function(element) {\n    const elementRegistry = this._elementRegistry,\n          eventBus = this._eventBus;\n\n    // simulate element remove event sequence\n    eventBus.fire('root.remove', { element: element });\n    eventBus.fire('root.removed', { element: element });\n\n    elementRegistry.remove(element);\n  };\n\n\n  Canvas.prototype._addRoot = function(element, gfx) {\n    const elementRegistry = this._elementRegistry,\n          eventBus = this._eventBus;\n\n    // resemble element add event sequence\n    eventBus.fire('root.add', { element: element });\n\n    elementRegistry.add(element, gfx);\n\n    eventBus.fire('root.added', { element: element, gfx: gfx });\n  };\n\n\n  Canvas.prototype._setRoot = function(rootElement, layer) {\n\n    const currentRoot = this._rootElement;\n\n    if (currentRoot) {\n\n      // un-associate previous root element <svg>\n      this._elementRegistry.updateGraphics(currentRoot, null, true);\n\n      // hide previous layer\n      this.hideLayer(currentRoot.layer);\n    }\n\n    if (rootElement) {\n\n      if (!layer) {\n        layer = this._findPlaneForRoot(rootElement).layer;\n      }\n\n      // associate element with <svg>\n      this._elementRegistry.updateGraphics(rootElement, this._svg, true);\n\n      // show root layer\n      this.showLayer(rootElement.layer);\n    }\n\n    this._rootElement = rootElement;\n\n    this._eventBus.fire('root.set', { element: rootElement });\n  };\n\n  Canvas.prototype._ensureValid = function(type, element) {\n    if (!element.id) {\n      throw new Error('element must have an id');\n    }\n\n    if (this._elementRegistry.get(element.id)) {\n      throw new Error('element <' + element.id + '> already exists');\n    }\n\n    const requiredAttrs = REQUIRED_MODEL_ATTRS[type];\n\n    const valid = every(requiredAttrs, function(attr) {\n      return typeof element[attr] !== 'undefined';\n    });\n\n    if (!valid) {\n      throw new Error(\n        'must supply { ' + requiredAttrs.join(', ') + ' } with ' + type);\n    }\n  };\n\n  Canvas.prototype._setParent = function(element, parent, parentIndex) {\n    add(parent.children, element, parentIndex);\n    element.parent = parent;\n  };\n\n  /**\n   * Adds an element to the canvas.\n   *\n   * This wires the parent <-> child relationship between the element and\n   * a explicitly specified parent or an implicit root element.\n   *\n   * During add it emits the events\n   *\n   *  * <{type}.add> (element, parent)\n   *  * <{type}.added> (element, gfx)\n   *\n   * Extensions may hook into these events to perform their magic.\n   *\n   * @param {string} type\n   * @param {ConnectionLike|ShapeLike} element\n   * @param {ShapeLike} [parent]\n   * @param {number} [parentIndex]\n   *\n   * @return {ConnectionLike|ShapeLike} The added element.\n   */\n  Canvas.prototype._addElement = function(type, element, parent, parentIndex) {\n\n    parent = parent || this.getRootElement();\n\n    const eventBus = this._eventBus,\n          graphicsFactory = this._graphicsFactory;\n\n    this._ensureValid(type, element);\n\n    eventBus.fire(type + '.add', { element: element, parent: parent });\n\n    this._setParent(element, parent, parentIndex);\n\n    // create graphics\n    const gfx = graphicsFactory.create(type, element, parentIndex);\n\n    this._elementRegistry.add(element, gfx);\n\n    // update its visual\n    graphicsFactory.update(type, element, gfx);\n\n    eventBus.fire(type + '.added', { element: element, gfx: gfx });\n\n    return element;\n  };\n\n  /**\n   * Adds a shape to the canvas.\n   *\n   * @param {ShapeLike} shape The shape to be added\n   * @param {ParentLike} [parent] The shape's parent.\n   * @param {number} [parentIndex] The index at which to add the shape to the parent's children.\n   *\n   * @return {ShapeLike} The added shape.\n   */\n  Canvas.prototype.addShape = function(shape, parent, parentIndex) {\n    return this._addElement('shape', shape, parent, parentIndex);\n  };\n\n  /**\n   * Adds a connection to the canvas.\n   *\n   * @param {ConnectionLike} connection The connection to be added.\n   * @param {ParentLike} [parent] The connection's parent.\n   * @param {number} [parentIndex] The index at which to add the connection to the parent's children.\n   *\n   * @return {ConnectionLike} The added connection.\n   */\n  Canvas.prototype.addConnection = function(connection, parent, parentIndex) {\n    return this._addElement('connection', connection, parent, parentIndex);\n  };\n\n\n  /**\n   * Internal remove element\n   */\n  Canvas.prototype._removeElement = function(element, type) {\n\n    const elementRegistry = this._elementRegistry,\n          graphicsFactory = this._graphicsFactory,\n          eventBus = this._eventBus;\n\n    element = elementRegistry.get(element.id || element);\n\n    if (!element) {\n\n      // element was removed already\n      return;\n    }\n\n    eventBus.fire(type + '.remove', { element: element });\n\n    graphicsFactory.remove(element);\n\n    // unset parent <-> child relationship\n    remove(element.parent && element.parent.children, element);\n    element.parent = null;\n\n    eventBus.fire(type + '.removed', { element: element });\n\n    elementRegistry.remove(element);\n\n    return element;\n  };\n\n\n  /**\n   * Removes a shape from the canvas.\n   *\n   * @fires ShapeRemoveEvent\n   * @fires ShapeRemovedEvent\n   *\n   * @param {ShapeLike|string} shape The shape or its ID.\n   *\n   * @return {ShapeLike} The removed shape.\n   */\n  Canvas.prototype.removeShape = function(shape) {\n\n    /**\n     * An event indicating that a shape is about to be removed from the canvas.\n     *\n     * @memberOf Canvas\n     *\n     * @event ShapeRemoveEvent\n     * @type {Object}\n     * @property {ShapeLike} element The shape.\n     * @property {SVGElement} gfx The graphical element.\n     */\n\n    /**\n     * An event indicating that a shape has been removed from the canvas.\n     *\n     * @memberOf Canvas\n     *\n     * @event ShapeRemovedEvent\n     * @type {Object}\n     * @property {ShapeLike} element The shape.\n     * @property {SVGElement} gfx The graphical element.\n     */\n    return this._removeElement(shape, 'shape');\n  };\n\n\n  /**\n   * Removes a connection from the canvas.\n   *\n   * @fires ConnectionRemoveEvent\n   * @fires ConnectionRemovedEvent\n   *\n   * @param {ConnectionLike|string} connection The connection or its ID.\n   *\n   * @return {ConnectionLike} The removed connection.\n   */\n  Canvas.prototype.removeConnection = function(connection) {\n\n    /**\n     * An event indicating that a connection is about to be removed from the canvas.\n     *\n     * @memberOf Canvas\n     *\n     * @event ConnectionRemoveEvent\n     * @type {Object}\n     * @property {ConnectionLike} element The connection.\n     * @property {SVGElement} gfx The graphical element.\n     */\n\n    /**\n     * An event indicating that a connection has been removed from the canvas.\n     *\n     * @memberOf Canvas\n     *\n     * @event ConnectionRemovedEvent\n     * @type {Object}\n     * @property {ConnectionLike} element The connection.\n     * @property {SVGElement} gfx The graphical element.\n     */\n    return this._removeElement(connection, 'connection');\n  };\n\n\n  /**\n   * Returns the graphical element of an element.\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element or its ID.\n   * @param {boolean} [secondary=false] Whether to return the secondary graphical element.\n   *\n   * @return {SVGElement} The graphical element.\n   */\n  Canvas.prototype.getGraphics = function(element, secondary) {\n    return this._elementRegistry.getGraphics(element, secondary);\n  };\n\n\n  /**\n   * Perform a viewbox update via a given change function.\n   *\n   * @param {Function} changeFn\n   */\n  Canvas.prototype._changeViewbox = function(changeFn) {\n\n    // notify others of the upcoming viewbox change\n    this._eventBus.fire('canvas.viewbox.changing');\n\n    // perform actual change\n    changeFn.apply(this);\n\n    // reset the cached viewbox so that\n    // a new get operation on viewbox or zoom\n    // triggers a viewbox re-computation\n    this._cachedViewbox = null;\n\n    // notify others of the change; this step\n    // may or may not be debounced\n    this._viewboxChanged();\n  };\n\n  Canvas.prototype._viewboxChanged = function() {\n    this._eventBus.fire('canvas.viewbox.changed', { viewbox: this.viewbox() });\n  };\n\n\n  /**\n   * Gets or sets the view box of the canvas, i.e. the\n   * area that is currently displayed.\n   *\n   * The getter may return a cached viewbox (if it is currently\n   * changing). To force a recomputation, pass `false` as the first argument.\n   *\n   * @example\n   *\n   * ```javascript\n   * canvas.viewbox({ x: 100, y: 100, width: 500, height: 500 })\n   *\n   * // sets the visible area of the diagram to (100|100) -> (600|100)\n   * // and and scales it according to the diagram width\n   *\n   * const viewbox = canvas.viewbox(); // pass `false` to force recomputing the box.\n   *\n   * console.log(viewbox);\n   * // {\n   * //   inner: Dimensions,\n   * //   outer: Dimensions,\n   * //   scale,\n   * //   x, y,\n   * //   width, height\n   * // }\n   *\n   * // if the current diagram is zoomed and scrolled, you may reset it to the\n   * // default zoom via this method, too:\n   *\n   * const zoomedAndScrolledViewbox = canvas.viewbox();\n   *\n   * canvas.viewbox({\n   *   x: 0,\n   *   y: 0,\n   *   width: zoomedAndScrolledViewbox.outer.width,\n   *   height: zoomedAndScrolledViewbox.outer.height\n   * });\n   * ```\n   *\n   * @param {Rect} [box] The viewbox to be set.\n   *\n   * @return {CanvasViewbox} The set viewbox.\n   */\n  Canvas.prototype.viewbox = function(box) {\n\n    if (box === undefined && this._cachedViewbox) {\n      return this._cachedViewbox;\n    }\n\n    const viewport = this._viewport,\n          outerBox = this.getSize();\n    let innerBox,\n        matrix,\n        activeLayer,\n        transform,\n        scale,\n        x, y;\n\n    if (!box) {\n\n      // compute the inner box based on the\n      // diagrams active layer. This allows us to exclude\n      // external components, such as overlays\n\n      activeLayer = this._rootElement ? this.getActiveLayer() : null;\n      innerBox = activeLayer && activeLayer.getBBox() || {};\n\n      transform = transform$1(viewport);\n      matrix = transform ? transform.matrix : createMatrix();\n      scale = round$b(matrix.a, 1000);\n\n      x = round$b(-matrix.e || 0, 1000);\n      y = round$b(-matrix.f || 0, 1000);\n\n      box = this._cachedViewbox = {\n        x: x ? x / scale : 0,\n        y: y ? y / scale : 0,\n        width: outerBox.width / scale,\n        height: outerBox.height / scale,\n        scale: scale,\n        inner: {\n          width: innerBox.width || 0,\n          height: innerBox.height || 0,\n          x: innerBox.x || 0,\n          y: innerBox.y || 0\n        },\n        outer: outerBox\n      };\n\n      return box;\n    } else {\n\n      this._changeViewbox(function() {\n        scale = Math.min(outerBox.width / box.width, outerBox.height / box.height);\n\n        const matrix = this._svg.createSVGMatrix()\n          .scale(scale)\n          .translate(-box.x, -box.y);\n\n        transform$1(viewport, matrix);\n      });\n    }\n\n    return box;\n  };\n\n\n  /**\n   * Gets or sets the scroll of the canvas.\n   *\n   * @param {Point} [delta] The scroll to be set.\n   *\n   * @return {Point}\n   */\n  Canvas.prototype.scroll = function(delta) {\n\n    const node = this._viewport;\n    let matrix = node.getCTM();\n\n    if (delta) {\n      this._changeViewbox(function() {\n        delta = assign$1({ dx: 0, dy: 0 }, delta || {});\n\n        matrix = this._svg.createSVGMatrix().translate(delta.dx, delta.dy).multiply(matrix);\n\n        setCTM(node, matrix);\n      });\n    }\n\n    return { x: matrix.e, y: matrix.f };\n  };\n\n  /**\n   * Scrolls the viewbox to contain the given element.\n   * Optionally specify a padding to be applied to the edges.\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element to scroll to or its ID.\n   * @param {RectTRBL|number} [padding=100] The padding to be applied. Can also specify top, bottom, left and right.\n   */\n  Canvas.prototype.scrollToElement = function(element, padding) {\n    let defaultPadding = 100;\n\n    if (typeof element === 'string') {\n      element = this._elementRegistry.get(element);\n    }\n\n    // set to correct rootElement\n    const rootElement = this.findRoot(element);\n\n    if (rootElement !== this.getRootElement()) {\n      this.setRootElement(rootElement);\n    }\n\n    if (!padding) {\n      padding = {};\n    }\n    if (typeof padding === 'number') {\n      defaultPadding = padding;\n    }\n\n    padding = {\n      top: padding.top || defaultPadding,\n      right: padding.right || defaultPadding,\n      bottom: padding.bottom || defaultPadding,\n      left: padding.left || defaultPadding\n    };\n\n    const elementBounds = getBBox(element),\n          elementTrbl = asTRBL(elementBounds),\n          viewboxBounds = this.viewbox(),\n          zoom = this.zoom();\n    let dx, dy;\n\n    // shrink viewboxBounds with padding\n    viewboxBounds.y += padding.top / zoom;\n    viewboxBounds.x += padding.left / zoom;\n    viewboxBounds.width -= (padding.right + padding.left) / zoom;\n    viewboxBounds.height -= (padding.bottom + padding.top) / zoom;\n\n    const viewboxTrbl = asTRBL(viewboxBounds);\n\n    const canFit = elementBounds.width < viewboxBounds.width && elementBounds.height < viewboxBounds.height;\n\n    if (!canFit) {\n\n      // top-left when element can't fit\n      dx = elementBounds.x - viewboxBounds.x;\n      dy = elementBounds.y - viewboxBounds.y;\n\n    } else {\n\n      const dRight = Math.max(0, elementTrbl.right - viewboxTrbl.right),\n            dLeft = Math.min(0, elementTrbl.left - viewboxTrbl.left),\n            dBottom = Math.max(0, elementTrbl.bottom - viewboxTrbl.bottom),\n            dTop = Math.min(0, elementTrbl.top - viewboxTrbl.top);\n\n      dx = dRight || dLeft;\n      dy = dBottom || dTop;\n\n    }\n\n    this.scroll({ dx: -dx * zoom, dy: -dy * zoom });\n  };\n\n  /**\n   * Gets or sets the current zoom of the canvas, optionally zooming to the\n   * specified position.\n   *\n   * The getter may return a cached zoom level. Call it with `false` as the first\n   * argument to force recomputation of the current level.\n   *\n   * @param {number|'fit-viewport'} [newScale] The new zoom level, either a number,\n   * i.e. 0.9, or `fit-viewport` to adjust the size to fit the current viewport.\n   * @param {Point} [center] The reference point { x: ..., y: ...} to zoom to.\n   *\n   * @return {number} The set zoom level.\n   */\n  Canvas.prototype.zoom = function(newScale, center) {\n\n    if (!newScale) {\n      return this.viewbox(newScale).scale;\n    }\n\n    if (newScale === 'fit-viewport') {\n      return this._fitViewport(center);\n    }\n\n    let outer,\n        matrix;\n\n    this._changeViewbox(function() {\n\n      if (typeof center !== 'object') {\n        outer = this.viewbox().outer;\n\n        center = {\n          x: outer.width / 2,\n          y: outer.height / 2\n        };\n      }\n\n      matrix = this._setZoom(newScale, center);\n    });\n\n    return round$b(matrix.a, 1000);\n  };\n\n  function setCTM(node, m) {\n    const mstr = 'matrix(' + m.a + ',' + m.b + ',' + m.c + ',' + m.d + ',' + m.e + ',' + m.f + ')';\n    node.setAttribute('transform', mstr);\n  }\n\n  Canvas.prototype._fitViewport = function(center) {\n\n    const vbox = this.viewbox(),\n          outer = vbox.outer,\n          inner = vbox.inner;\n    let newScale,\n        newViewbox;\n\n    // display the complete diagram without zooming in.\n    // instead of relying on internal zoom, we perform a\n    // hard reset on the canvas viewbox to realize this\n    //\n    // if diagram does not need to be zoomed in, we focus it around\n    // the diagram origin instead\n\n    if (inner.x >= 0 &&\n        inner.y >= 0 &&\n        inner.x + inner.width <= outer.width &&\n        inner.y + inner.height <= outer.height &&\n        !center) {\n\n      newViewbox = {\n        x: 0,\n        y: 0,\n        width: Math.max(inner.width + inner.x, outer.width),\n        height: Math.max(inner.height + inner.y, outer.height)\n      };\n    } else {\n\n      newScale = Math.min(1, outer.width / inner.width, outer.height / inner.height);\n      newViewbox = {\n        x: inner.x + (center ? inner.width / 2 - outer.width / newScale / 2 : 0),\n        y: inner.y + (center ? inner.height / 2 - outer.height / newScale / 2 : 0),\n        width: outer.width / newScale,\n        height: outer.height / newScale\n      };\n    }\n\n    this.viewbox(newViewbox);\n\n    return this.viewbox(false).scale;\n  };\n\n\n  Canvas.prototype._setZoom = function(scale, center) {\n\n    const svg = this._svg,\n          viewport = this._viewport;\n\n    const matrix = svg.createSVGMatrix();\n    const point = svg.createSVGPoint();\n\n    let centerPoint,\n        originalPoint,\n        currentMatrix,\n        scaleMatrix,\n        newMatrix;\n\n    currentMatrix = viewport.getCTM();\n\n    const currentScale = currentMatrix.a;\n\n    if (center) {\n      centerPoint = assign$1(point, center);\n\n      // revert applied viewport transformations\n      originalPoint = centerPoint.matrixTransform(currentMatrix.inverse());\n\n      // create scale matrix\n      scaleMatrix = matrix\n        .translate(originalPoint.x, originalPoint.y)\n        .scale(1 / currentScale * scale)\n        .translate(-originalPoint.x, -originalPoint.y);\n\n      newMatrix = currentMatrix.multiply(scaleMatrix);\n    } else {\n      newMatrix = matrix.scale(scale);\n    }\n\n    setCTM(this._viewport, newMatrix);\n\n    return newMatrix;\n  };\n\n\n  /**\n   * Returns the size of the canvas.\n   *\n   * @return {Dimensions} The size of the canvas.\n   */\n  Canvas.prototype.getSize = function() {\n    return {\n      width: this._container.clientWidth,\n      height: this._container.clientHeight\n    };\n  };\n\n\n  /**\n   * Returns the absolute bounding box of an element.\n   *\n   * The absolute bounding box may be used to display overlays in the callers\n   * (browser) coordinate system rather than the zoomed in/out canvas coordinates.\n   *\n   * @param {ShapeLike|ConnectionLike} element The element.\n   *\n   * @return {Rect} The element's absolute bounding box.\n   */\n  Canvas.prototype.getAbsoluteBBox = function(element) {\n    const vbox = this.viewbox();\n    let bbox;\n\n    // connection\n    // use svg bbox\n    if (element.waypoints) {\n      const gfx = this.getGraphics(element);\n\n      bbox = gfx.getBBox();\n    }\n\n    // shapes\n    // use data\n    else {\n      bbox = element;\n    }\n\n    const x = bbox.x * vbox.scale - vbox.x * vbox.scale;\n    const y = bbox.y * vbox.scale - vbox.y * vbox.scale;\n\n    const width = bbox.width * vbox.scale;\n    const height = bbox.height * vbox.scale;\n\n    return {\n      x: x,\n      y: y,\n      width: width,\n      height: height\n    };\n  };\n\n  /**\n   * Fires an event so other modules can react to the canvas resizing.\n   */\n  Canvas.prototype.resized = function() {\n\n    // force recomputation of view box\n    delete this._cachedViewbox;\n\n    this._eventBus.fire('canvas.resized');\n  };\n\n  var ELEMENT_ID = 'data-element-id';\n\n  /**\n   * @typedef {import('./Types').ElementLike} ElementLike\n   *\n   * @typedef {import('./EventBus').default} EventBus\n   *\n   * @typedef { (element: ElementLike, gfx: SVGElement) => boolean|any } ElementRegistryFilterCallback\n   * @typedef { (element: ElementLike, gfx: SVGElement) => any } ElementRegistryForEachCallback\n   */\n\n  /**\n   * A registry that keeps track of all shapes in the diagram.\n   *\n   * @class\n   * @constructor\n   *\n   * @param {EventBus} eventBus\n   */\n  function ElementRegistry(eventBus) {\n\n    /**\n     * @type { {\n     *   [id: string]: {\n     *     element: ElementLike;\n     *     gfx?: SVGElement;\n     *     secondaryGfx?: SVGElement;\n     *   }\n     * } }\n     */\n    this._elements = {};\n\n    this._eventBus = eventBus;\n  }\n\n  ElementRegistry.$inject = [ 'eventBus' ];\n\n  /**\n   * Add an element and its graphical representation(s) to the registry.\n   *\n   * @param {ElementLike} element The element to be added.\n   * @param {SVGElement} gfx The primary graphical representation.\n   * @param {SVGElement} [secondaryGfx] The secondary graphical representation.\n   */\n  ElementRegistry.prototype.add = function(element, gfx, secondaryGfx) {\n\n    var id = element.id;\n\n    this._validateId(id);\n\n    // associate dom node with element\n    attr(gfx, ELEMENT_ID, id);\n\n    if (secondaryGfx) {\n      attr(secondaryGfx, ELEMENT_ID, id);\n    }\n\n    this._elements[id] = { element: element, gfx: gfx, secondaryGfx: secondaryGfx };\n  };\n\n  /**\n   * Remove an element from the registry.\n   *\n   * @param {ElementLike|string} element\n   */\n  ElementRegistry.prototype.remove = function(element) {\n    var elements = this._elements,\n        id = element.id || element,\n        container = id && elements[id];\n\n    if (container) {\n\n      // unset element id on gfx\n      attr(container.gfx, ELEMENT_ID, '');\n\n      if (container.secondaryGfx) {\n        attr(container.secondaryGfx, ELEMENT_ID, '');\n      }\n\n      delete elements[id];\n    }\n  };\n\n  /**\n   * Update an elements ID.\n   *\n   * @param {ElementLike|string} element The element or its ID.\n   * @param {string} newId The new ID.\n   */\n  ElementRegistry.prototype.updateId = function(element, newId) {\n\n    this._validateId(newId);\n\n    if (typeof element === 'string') {\n      element = this.get(element);\n    }\n\n    this._eventBus.fire('element.updateId', {\n      element: element,\n      newId: newId\n    });\n\n    var gfx = this.getGraphics(element),\n        secondaryGfx = this.getGraphics(element, true);\n\n    this.remove(element);\n\n    element.id = newId;\n\n    this.add(element, gfx, secondaryGfx);\n  };\n\n  /**\n   * Update the graphical representation of an element.\n   *\n   * @param {ElementLike|string} filter The element or its ID.\n   * @param {SVGElement} gfx The new graphical representation.\n   * @param {boolean} [secondary=false] Whether to update the secondary graphical representation.\n   */\n  ElementRegistry.prototype.updateGraphics = function(filter, gfx, secondary) {\n    var id = filter.id || filter;\n\n    var container = this._elements[id];\n\n    if (secondary) {\n      container.secondaryGfx = gfx;\n    } else {\n      container.gfx = gfx;\n    }\n\n    if (gfx) {\n      attr(gfx, ELEMENT_ID, id);\n    }\n\n    return gfx;\n  };\n\n  /**\n   * Get the element with the given ID or graphical representation.\n   *\n   * @example\n   *\n   * ```javascript\n   * elementRegistry.get('SomeElementId_1');\n   *\n   * elementRegistry.get(gfx);\n   * ```\n   *\n   * @param {string|SVGElement} filter The elements ID or graphical representation.\n   *\n   * @return {ElementLike|undefined} The element.\n   */\n  ElementRegistry.prototype.get = function(filter) {\n    var id;\n\n    if (typeof filter === 'string') {\n      id = filter;\n    } else {\n      id = filter && attr(filter, ELEMENT_ID);\n    }\n\n    var container = this._elements[id];\n    return container && container.element;\n  };\n\n  /**\n   * Return all elements that match a given filter function.\n   *\n   * @param {ElementRegistryFilterCallback} fn The filter function.\n   *\n   * @return {ElementLike[]} The matching elements.\n   */\n  ElementRegistry.prototype.filter = function(fn) {\n\n    var filtered = [];\n\n    this.forEach(function(element, gfx) {\n      if (fn(element, gfx)) {\n        filtered.push(element);\n      }\n    });\n\n    return filtered;\n  };\n\n  /**\n   * Return the first element that matches the given filter function.\n   *\n   * @param {ElementRegistryFilterCallback} fn The filter function.\n   *\n   * @return {ElementLike|undefined} The matching element.\n   */\n  ElementRegistry.prototype.find = function(fn) {\n    var map = this._elements,\n        keys = Object.keys(map);\n\n    for (var i = 0; i < keys.length; i++) {\n      var id = keys[i],\n          container = map[id],\n          element = container.element,\n          gfx = container.gfx;\n\n      if (fn(element, gfx)) {\n        return element;\n      }\n    }\n  };\n\n  /**\n   * Get all elements.\n   *\n   * @return {ElementLike[]} All elements.\n   */\n  ElementRegistry.prototype.getAll = function() {\n    return this.filter(function(e) { return e; });\n  };\n\n  /**\n   * Execute a given function for each element.\n   *\n   * @param {ElementRegistryForEachCallback} fn The function to execute.\n   */\n  ElementRegistry.prototype.forEach = function(fn) {\n\n    var map = this._elements;\n\n    Object.keys(map).forEach(function(id) {\n      var container = map[id],\n          element = container.element,\n          gfx = container.gfx;\n\n      return fn(element, gfx);\n    });\n  };\n\n  /**\n   * Return the graphical representation of an element.\n   *\n   * @example\n   *\n   * ```javascript\n   * elementRegistry.getGraphics('SomeElementId_1');\n   *\n   * elementRegistry.getGraphics(rootElement); // <g ...>\n   *\n   * elementRegistry.getGraphics(rootElement, true); // <svg ...>\n   * ```\n   *\n   * @param {ElementLike|string} filter The element or its ID.\n   * @param {boolean} [secondary=false] Whether to return the secondary graphical representation.\n   *\n   * @return {SVGElement} The graphical representation.\n   */\n  ElementRegistry.prototype.getGraphics = function(filter, secondary) {\n    var id = filter.id || filter;\n\n    var container = this._elements[id];\n    return container && (secondary ? container.secondaryGfx : container.gfx);\n  };\n\n  /**\n   * Validate an ID and throw an error if invalid.\n   *\n   * @param {string} id\n   *\n   * @throws {Error} Error indicating that the ID is invalid or already assigned.\n   */\n  ElementRegistry.prototype._validateId = function(id) {\n    if (!id) {\n      throw new Error('element must have an id');\n    }\n\n    if (this._elements[id]) {\n      throw new Error('element with id ' + id + ' already added');\n    }\n  };\n\n  var objectRefs = {exports: {}};\n\n  var collection = {};\n\n  /**\n   * An empty collection stub. Use {@link RefsCollection.extend} to extend a\n   * collection with ref semantics.\n   *\n   * @class RefsCollection\n   */\n\n  /**\n   * Extends a collection with {@link Refs} aware methods\n   *\n   * @memberof RefsCollection\n   * @static\n   *\n   * @param  {Array<Object>} collection\n   * @param  {Refs} refs instance\n   * @param  {Object} property represented by the collection\n   * @param  {Object} target object the collection is attached to\n   *\n   * @return {RefsCollection<Object>} the extended array\n   */\n  function extend(collection, refs, property, target) {\n\n    var inverseProperty = property.inverse;\n\n    /**\n     * Removes the given element from the array and returns it.\n     *\n     * @method RefsCollection#remove\n     *\n     * @param {Object} element the element to remove\n     */\n    Object.defineProperty(collection, 'remove', {\n      value: function(element) {\n        var idx = this.indexOf(element);\n        if (idx !== -1) {\n          this.splice(idx, 1);\n\n          // unset inverse\n          refs.unset(element, inverseProperty, target);\n        }\n\n        return element;\n      }\n    });\n\n    /**\n     * Returns true if the collection contains the given element\n     *\n     * @method RefsCollection#contains\n     *\n     * @param {Object} element the element to check for\n     */\n    Object.defineProperty(collection, 'contains', {\n      value: function(element) {\n        return this.indexOf(element) !== -1;\n      }\n    });\n\n    /**\n     * Adds an element to the array, unless it exists already (set semantics).\n     *\n     * @method RefsCollection#add\n     *\n     * @param {Object} element the element to add\n     * @param {Number} optional index to add element to\n     *                 (possibly moving other elements around)\n     */\n    Object.defineProperty(collection, 'add', {\n      value: function(element, idx) {\n\n        var currentIdx = this.indexOf(element);\n\n        if (typeof idx === 'undefined') {\n\n          if (currentIdx !== -1) {\n            // element already in collection (!)\n            return;\n          }\n\n          // add to end of array, as no idx is specified\n          idx = this.length;\n        }\n\n        // handle already in collection\n        if (currentIdx !== -1) {\n\n          // remove element from currentIdx\n          this.splice(currentIdx, 1);\n        }\n\n        // add element at idx\n        this.splice(idx, 0, element);\n\n        if (currentIdx === -1) {\n          // set inverse, unless element was\n          // in collection already\n          refs.set(element, inverseProperty, target);\n        }\n      }\n    });\n\n    // a simple marker, identifying this element\n    // as being a refs collection\n    Object.defineProperty(collection, '__refs_collection', {\n      value: true\n    });\n\n    return collection;\n  }\n\n\n  function isExtended(collection) {\n    return collection.__refs_collection === true;\n  }\n\n  collection.extend = extend;\n\n  collection.isExtended = isExtended;\n\n  var Collection = collection;\n\n  function hasOwnProperty$1(e, property) {\n    return Object.prototype.hasOwnProperty.call(e, property.name || property);\n  }\n\n  function defineCollectionProperty(ref, property, target) {\n\n    var collection = Collection.extend(target[property.name] || [], ref, property, target);\n\n    Object.defineProperty(target, property.name, {\n      enumerable: property.enumerable,\n      value: collection\n    });\n\n    if (collection.length) {\n\n      collection.forEach(function(o) {\n        ref.set(o, property.inverse, target);\n      });\n    }\n  }\n\n\n  function defineProperty$1(ref, property, target) {\n\n    var inverseProperty = property.inverse;\n\n    var _value = target[property.name];\n\n    Object.defineProperty(target, property.name, {\n      configurable: property.configurable,\n      enumerable: property.enumerable,\n\n      get: function() {\n        return _value;\n      },\n\n      set: function(value) {\n\n        // return if we already performed all changes\n        if (value === _value) {\n          return;\n        }\n\n        var old = _value;\n\n        // temporary set null\n        _value = null;\n\n        if (old) {\n          ref.unset(old, inverseProperty, target);\n        }\n\n        // set new value\n        _value = value;\n\n        // set inverse value\n        ref.set(_value, inverseProperty, target);\n      }\n    });\n\n  }\n\n  /**\n   * Creates a new references object defining two inversly related\n   * attribute descriptors a and b.\n   *\n   * <p>\n   *   When bound to an object using {@link Refs#bind} the references\n   *   get activated and ensure that add and remove operations are applied\n   *   reversely, too.\n   * </p>\n   *\n   * <p>\n   *   For attributes represented as collections {@link Refs} provides the\n   *   {@link RefsCollection#add}, {@link RefsCollection#remove} and {@link RefsCollection#contains} extensions\n   *   that must be used to properly hook into the inverse change mechanism.\n   * </p>\n   *\n   * @class Refs\n   *\n   * @classdesc A bi-directional reference between two attributes.\n   *\n   * @param {Refs.AttributeDescriptor} a property descriptor\n   * @param {Refs.AttributeDescriptor} b property descriptor\n   *\n   * @example\n   *\n   * var refs = Refs({ name: 'wheels', collection: true, enumerable: true }, { name: 'car' });\n   *\n   * var car = { name: 'toyota' };\n   * var wheels = [{ pos: 'front-left' }, { pos: 'front-right' }];\n   *\n   * refs.bind(car, 'wheels');\n   *\n   * car.wheels // []\n   * car.wheels.add(wheels[0]);\n   * car.wheels.add(wheels[1]);\n   *\n   * car.wheels // [{ pos: 'front-left' }, { pos: 'front-right' }]\n   *\n   * wheels[0].car // { name: 'toyota' };\n   * car.wheels.remove(wheels[0]);\n   *\n   * wheels[0].car // undefined\n   */\n  function Refs$1(a, b) {\n\n    if (!(this instanceof Refs$1)) {\n      return new Refs$1(a, b);\n    }\n\n    // link\n    a.inverse = b;\n    b.inverse = a;\n\n    this.props = {};\n    this.props[a.name] = a;\n    this.props[b.name] = b;\n  }\n\n  /**\n   * Binds one side of a bi-directional reference to a\n   * target object.\n   *\n   * @memberOf Refs\n   *\n   * @param  {Object} target\n   * @param  {String} property\n   */\n  Refs$1.prototype.bind = function(target, property) {\n    if (typeof property === 'string') {\n      if (!this.props[property]) {\n        throw new Error('no property <' + property + '> in ref');\n      }\n      property = this.props[property];\n    }\n\n    if (property.collection) {\n      defineCollectionProperty(this, property, target);\n    } else {\n      defineProperty$1(this, property, target);\n    }\n  };\n\n  Refs$1.prototype.ensureRefsCollection = function(target, property) {\n\n    var collection = target[property.name];\n\n    if (!Collection.isExtended(collection)) {\n      defineCollectionProperty(this, property, target);\n    }\n\n    return collection;\n  };\n\n  Refs$1.prototype.ensureBound = function(target, property) {\n    if (!hasOwnProperty$1(target, property)) {\n      this.bind(target, property);\n    }\n  };\n\n  Refs$1.prototype.unset = function(target, property, value) {\n\n    if (target) {\n      this.ensureBound(target, property);\n\n      if (property.collection) {\n        this.ensureRefsCollection(target, property).remove(value);\n      } else {\n        target[property.name] = undefined;\n      }\n    }\n  };\n\n  Refs$1.prototype.set = function(target, property, value) {\n\n    if (target) {\n      this.ensureBound(target, property);\n\n      if (property.collection) {\n        this.ensureRefsCollection(target, property).add(value);\n      } else {\n        target[property.name] = value;\n      }\n    }\n  };\n\n  var refs = Refs$1;\n\n  objectRefs.exports = refs;\n\n  objectRefs.exports.Collection = collection;\n\n  var objectRefsExports = objectRefs.exports;\n  var Refs = /*@__PURE__*/getDefaultExportFromCjs(objectRefsExports);\n\n  var parentRefs = new Refs({ name: 'children', enumerable: true, collection: true }, { name: 'parent' }),\n      labelRefs = new Refs({ name: 'labels', enumerable: true, collection: true }, { name: 'labelTarget' }),\n      attacherRefs = new Refs({ name: 'attachers', collection: true }, { name: 'host' }),\n      outgoingRefs = new Refs({ name: 'outgoing', collection: true }, { name: 'source' }),\n      incomingRefs = new Refs({ name: 'incoming', collection: true }, { name: 'target' });\n\n  /**\n   * @typedef {import('./Types').Element} Element\n   * @typedef {import('./Types').Shape} Shape\n   * @typedef {import('./Types').Root} Root\n   * @typedef {import('./Types').Label} Label\n   * @typedef {import('./Types').Connection} Connection\n   */\n\n  /**\n   * The basic graphical representation\n   *\n   * @class\n   * @constructor\n   */\n  function ElementImpl() {\n\n    /**\n     * The object that backs up the shape\n     *\n     * @name Element#businessObject\n     * @type Object\n     */\n    Object.defineProperty(this, 'businessObject', {\n      writable: true\n    });\n\n\n    /**\n     * Single label support, will mapped to multi label array\n     *\n     * @name Element#label\n     * @type Object\n     */\n    Object.defineProperty(this, 'label', {\n      get: function() {\n        return this.labels[0];\n      },\n      set: function(newLabel) {\n\n        var label = this.label,\n            labels = this.labels;\n\n        if (!newLabel && label) {\n          labels.remove(label);\n        } else {\n          labels.add(newLabel, 0);\n        }\n      }\n    });\n\n    /**\n     * The parent shape\n     *\n     * @name Element#parent\n     * @type Shape\n     */\n    parentRefs.bind(this, 'parent');\n\n    /**\n     * The list of labels\n     *\n     * @name Element#labels\n     * @type Label\n     */\n    labelRefs.bind(this, 'labels');\n\n    /**\n     * The list of outgoing connections\n     *\n     * @name Element#outgoing\n     * @type Array<Connection>\n     */\n    outgoingRefs.bind(this, 'outgoing');\n\n    /**\n     * The list of incoming connections\n     *\n     * @name Element#incoming\n     * @type Array<Connection>\n     */\n    incomingRefs.bind(this, 'incoming');\n  }\n\n\n  /**\n   * A graphical object\n   *\n   * @class\n   * @constructor\n   *\n   * @extends ElementImpl\n   */\n  function ShapeImpl() {\n    ElementImpl.call(this);\n\n    /**\n     * Indicates frame shapes\n     *\n     * @name ShapeImpl#isFrame\n     * @type boolean\n     */\n\n    /**\n     * The list of children\n     *\n     * @name ShapeImpl#children\n     * @type Element[]\n     */\n    parentRefs.bind(this, 'children');\n\n    /**\n     * @name ShapeImpl#host\n     * @type Shape\n     */\n    attacherRefs.bind(this, 'host');\n\n    /**\n     * @name ShapeImpl#attachers\n     * @type Shape\n     */\n    attacherRefs.bind(this, 'attachers');\n  }\n\n  e$3(ShapeImpl, ElementImpl);\n\n\n  /**\n   * A root graphical object\n   *\n   * @class\n   * @constructor\n   *\n   * @extends ElementImpl\n   */\n  function RootImpl() {\n    ElementImpl.call(this);\n\n    /**\n     * The list of children\n     *\n     * @name RootImpl#children\n     * @type Element[]\n     */\n    parentRefs.bind(this, 'children');\n  }\n\n  e$3(RootImpl, ShapeImpl);\n\n\n  /**\n   * A label for an element\n   *\n   * @class\n   * @constructor\n   *\n   * @extends ShapeImpl\n   */\n  function LabelImpl() {\n    ShapeImpl.call(this);\n\n    /**\n     * The labeled element\n     *\n     * @name LabelImpl#labelTarget\n     * @type Element\n     */\n    labelRefs.bind(this, 'labelTarget');\n  }\n\n  e$3(LabelImpl, ShapeImpl);\n\n\n  /**\n   * A connection between two elements\n   *\n   * @class\n   * @constructor\n   *\n   * @extends ElementImpl\n   */\n  function ConnectionImpl() {\n    ElementImpl.call(this);\n\n    /**\n     * The element this connection originates from\n     *\n     * @name ConnectionImpl#source\n     * @type Element\n     */\n    outgoingRefs.bind(this, 'source');\n\n    /**\n     * The element this connection points to\n     *\n     * @name ConnectionImpl#target\n     * @type Element\n     */\n    incomingRefs.bind(this, 'target');\n  }\n\n  e$3(ConnectionImpl, ElementImpl);\n\n\n  var types$6 = {\n    connection: ConnectionImpl,\n    shape: ShapeImpl,\n    label: LabelImpl,\n    root: RootImpl\n  };\n\n  /**\n   * Creates a root element.\n   *\n   * @overlord\n   *\n   * @example\n   *\n   * ```javascript\n   * import * as Model from 'diagram-js/lib/model';\n   *\n   * const root = Model.create('root', {\n   *   x: 100,\n   *   y: 100,\n   *   width: 100,\n   *   height: 100\n   * });\n   * ```\n   *\n   * @param {'root'} type\n   * @param {any} [attrs]\n   *\n   * @return {Root}\n   */\n\n  /**\n   * Creates a connection.\n   *\n   * @overlord\n   *\n   * @example\n   *\n   * ```javascript\n   * import * as Model from 'diagram-js/lib/model';\n   *\n   * const connection = Model.create('connection', {\n   *   waypoints: [\n   *     { x: 100, y: 100 },\n   *     { x: 200, y: 100 }\n   *   ]\n   * });\n   * ```\n   *\n   * @param {'connection'} type\n   * @param {any} [attrs]\n   *\n   * @return {Connection}\n   */\n\n  /**\n   * Creates a shape.\n   *\n   * @overlord\n   *\n   * @example\n   *\n   * ```javascript\n   * import * as Model from 'diagram-js/lib/model';\n   *\n   * const shape = Model.create('shape', {\n   *   x: 100,\n   *   y: 100,\n   *   width: 100,\n   *   height: 100\n   * });\n   * ```\n   *\n   * @param {'shape'} type\n   * @param {any} [attrs]\n   *\n   * @return {Shape}\n   */\n\n  /**\n   * Creates a label.\n   *\n   * @example\n   *\n   * ```javascript\n   * import * as Model from 'diagram-js/lib/model';\n   *\n   * const label = Model.create('label', {\n   *   x: 100,\n   *   y: 100,\n   *   width: 100,\n   *   height: 100,\n   *   labelTarget: shape\n   * });\n   * ```\n   *\n   * @param {'label'} type\n   * @param {Object} [attrs]\n   *\n   * @return {Label}\n   */\n  function create(type, attrs) {\n    var Type = types$6[type];\n    if (!Type) {\n      throw new Error('unknown type: <' + type + '>');\n    }\n    return assign$1(new Type(), attrs);\n  }\n\n  /**\n   * Checks whether an object is a model instance.\n   *\n   * @param {any} obj\n   *\n   * @return {boolean}\n   */\n  function isModelElement(obj) {\n    return obj instanceof ElementImpl;\n  }\n\n  /**\n   * @typedef {import('../model/Types').Element} Element\n   * @typedef {import('../model/Types').Connection} Connection\n   * @typedef {import('../model/Types').Label} Label\n   * @typedef {import('../model/Types').Root} Root\n   * @typedef {import('../model/Types').Shape} Shape\n   */\n\n  /**\n   * A factory for model elements.\n   *\n   * @template {Connection} [T=Connection]\n   * @template {Label} [U=Label]\n   * @template {Root} [V=Root]\n   * @template {Shape} [W=Shape]\n   */\n  function ElementFactory$1() {\n    this._uid = 12;\n  }\n\n  /**\n   * Create a root element.\n   *\n   * @param {Partial<Root>} [attrs]\n   *\n   * @return {V} The created root element.\n   */\n  ElementFactory$1.prototype.createRoot = function(attrs) {\n    return this.create('root', attrs);\n  };\n\n  /**\n   * Create a label.\n   *\n   * @param {Partial<Label>} [attrs]\n   *\n   * @return {U} The created label.\n   */\n  ElementFactory$1.prototype.createLabel = function(attrs) {\n    return this.create('label', attrs);\n  };\n\n  /**\n   * Create a shape.\n   *\n   * @param {Partial<Shape>} [attrs]\n   *\n   * @return {W} The created shape.\n   */\n  ElementFactory$1.prototype.createShape = function(attrs) {\n    return this.create('shape', attrs);\n  };\n\n  /**\n   * Create a connection.\n   *\n   * @param {Partial<Connection>} [attrs]\n   *\n   * @return {T} The created connection.\n   */\n  ElementFactory$1.prototype.createConnection = function(attrs) {\n    return this.create('connection', attrs);\n  };\n\n  /**\n   * Create a root element.\n   *\n   * @overlord\n   * @param {'root'} type\n   * @param {Partial<Root>} [attrs]\n   * @return {V}\n   */\n  /**\n   * Create a shape.\n   *\n   * @overlord\n   * @param {'shape'} type\n   * @param {Partial<Shape>} [attrs]\n   * @return {W}\n   */\n  /**\n   * Create a connection.\n   *\n   * @overlord\n   * @param {'connection'} type\n   * @param {Partial<Connection>} [attrs]\n   * @return {T}\n   */\n  /**\n   * Create a label.\n   *\n   * @param {'label'} type\n   * @param {Partial<Label>} [attrs]\n   * @return {U}\n   */\n  ElementFactory$1.prototype.create = function(type, attrs) {\n\n    attrs = assign$1({}, attrs || {});\n\n    if (!attrs.id) {\n      attrs.id = type + '_' + (this._uid++);\n    }\n\n    return create(type, attrs);\n  };\n\n  var FN_REF = '__fn';\n\n  var DEFAULT_PRIORITY$5 = 1000;\n\n  var slice = Array.prototype.slice;\n\n  /**\n   * @typedef { {\n   *   stopPropagation(): void;\n   *   preventDefault(): void;\n   *   cancelBubble: boolean;\n   *   defaultPrevented: boolean;\n   *   returnValue: any;\n   * } } Event\n   */\n\n  /**\n   * @template E\n   *\n   * @typedef { (event: E & Event, ...any) => any } EventBusEventCallback\n   */\n\n  /**\n   * @typedef { {\n   *  priority: number;\n   *  next: EventBusListener | null;\n   *  callback: EventBusEventCallback<any>;\n   * } } EventBusListener\n   */\n\n  /**\n   * A general purpose event bus.\n   *\n   * This component is used to communicate across a diagram instance.\n   * Other parts of a diagram can use it to listen to and broadcast events.\n   *\n   *\n   * ## Registering for Events\n   *\n   * The event bus provides the {@link EventBus#on} and {@link EventBus#once}\n   * methods to register for events. {@link EventBus#off} can be used to\n   * remove event registrations. Listeners receive an instance of {@link Event}\n   * as the first argument. It allows them to hook into the event execution.\n   *\n   * ```javascript\n   *\n   * // listen for event\n   * eventBus.on('foo', function(event) {\n   *\n   *   // access event type\n   *   event.type; // 'foo'\n   *\n   *   // stop propagation to other listeners\n   *   event.stopPropagation();\n   *\n   *   // prevent event default\n   *   event.preventDefault();\n   * });\n   *\n   * // listen for event with custom payload\n   * eventBus.on('bar', function(event, payload) {\n   *   console.log(payload);\n   * });\n   *\n   * // listen for event returning value\n   * eventBus.on('foobar', function(event) {\n   *\n   *   // stop event propagation + prevent default\n   *   return false;\n   *\n   *   // stop event propagation + return custom result\n   *   return {\n   *     complex: 'listening result'\n   *   };\n   * });\n   *\n   *\n   * // listen with custom priority (default=1000, higher is better)\n   * eventBus.on('priorityfoo', 1500, function(event) {\n   *   console.log('invoked first!');\n   * });\n   *\n   *\n   * // listen for event and pass the context (`this`)\n   * eventBus.on('foobar', function(event) {\n   *   this.foo();\n   * }, this);\n   * ```\n   *\n   *\n   * ## Emitting Events\n   *\n   * Events can be emitted via the event bus using {@link EventBus#fire}.\n   *\n   * ```javascript\n   *\n   * // false indicates that the default action\n   * // was prevented by listeners\n   * if (eventBus.fire('foo') === false) {\n   *   console.log('default has been prevented!');\n   * };\n   *\n   *\n   * // custom args + return value listener\n   * eventBus.on('sum', function(event, a, b) {\n   *   return a + b;\n   * });\n   *\n   * // you can pass custom arguments + retrieve result values.\n   * var sum = eventBus.fire('sum', 1, 2);\n   * console.log(sum); // 3\n   * ```\n   */\n  function EventBus() {\n\n    /**\n     * @type { Record<string, EventBusListener> }\n     */\n    this._listeners = {};\n\n    // cleanup on destroy on lowest priority to allow\n    // message passing until the bitter end\n    this.on('diagram.destroy', 1, this._destroy, this);\n  }\n\n\n  /**\n   * Register an event listener for events with the given name.\n   *\n   * The callback will be invoked with `event, ...additionalArguments`\n   * that have been passed to {@link EventBus#fire}.\n   *\n   * Returning false from a listener will prevent the events default action\n   * (if any is specified). To stop an event from being processed further in\n   * other listeners execute {@link Event#stopPropagation}.\n   *\n   * Returning anything but `undefined` from a listener will stop the listener propagation.\n   *\n   * @template T\n   *\n   * @param {string|string[]} events to subscribe to\n   * @param {number} [priority=1000] listen priority\n   * @param {EventBusEventCallback<T>} callback\n   * @param {any} [that] callback context\n   */\n  EventBus.prototype.on = function(events, priority, callback, that) {\n\n    events = isArray$3(events) ? events : [ events ];\n\n    if (isFunction(priority)) {\n      that = callback;\n      callback = priority;\n      priority = DEFAULT_PRIORITY$5;\n    }\n\n    if (!isNumber(priority)) {\n      throw new Error('priority must be a number');\n    }\n\n    var actualCallback = callback;\n\n    if (that) {\n      actualCallback = bind$2(callback, that);\n\n      // make sure we remember and are able to remove\n      // bound callbacks via {@link #off} using the original\n      // callback\n      actualCallback[FN_REF] = callback[FN_REF] || callback;\n    }\n\n    var self = this;\n\n    events.forEach(function(e) {\n      self._addListener(e, {\n        priority: priority,\n        callback: actualCallback,\n        next: null\n      });\n    });\n  };\n\n  /**\n   * Register an event listener that is called only once.\n   *\n   * @template T\n   *\n   * @param {string|string[]} events to subscribe to\n   * @param {number} [priority=1000] the listen priority\n   * @param {EventBusEventCallback<T>} callback\n   * @param {any} [that] callback context\n   */\n  EventBus.prototype.once = function(events, priority, callback, that) {\n    var self = this;\n\n    if (isFunction(priority)) {\n      that = callback;\n      callback = priority;\n      priority = DEFAULT_PRIORITY$5;\n    }\n\n    if (!isNumber(priority)) {\n      throw new Error('priority must be a number');\n    }\n\n    function wrappedCallback() {\n      wrappedCallback.__isTomb = true;\n\n      var result = callback.apply(that, arguments);\n\n      self.off(events, wrappedCallback);\n\n      return result;\n    }\n\n    // make sure we remember and are able to remove\n    // bound callbacks via {@link #off} using the original\n    // callback\n    wrappedCallback[FN_REF] = callback;\n\n    this.on(events, priority, wrappedCallback);\n  };\n\n\n  /**\n   * Removes event listeners by event and callback.\n   *\n   * If no callback is given, all listeners for a given event name are being removed.\n   *\n   * @param {string|string[]} events\n   * @param {EventBusEventCallback} [callback]\n   */\n  EventBus.prototype.off = function(events, callback) {\n\n    events = isArray$3(events) ? events : [ events ];\n\n    var self = this;\n\n    events.forEach(function(event) {\n      self._removeListener(event, callback);\n    });\n\n  };\n\n\n  /**\n   * Create an event recognized be the event bus.\n   *\n   * @param {Object} data Event data.\n   *\n   * @return {Event} An event that will be recognized by the event bus.\n   */\n  EventBus.prototype.createEvent = function(data) {\n    var event = new InternalEvent();\n\n    event.init(data);\n\n    return event;\n  };\n\n\n  /**\n   * Fires an event.\n   *\n   * @example\n   *\n   * ```javascript\n   * // fire event by name\n   * events.fire('foo');\n   *\n   * // fire event object with nested type\n   * var event = { type: 'foo' };\n   * events.fire(event);\n   *\n   * // fire event with explicit type\n   * var event = { x: 10, y: 20 };\n   * events.fire('element.moved', event);\n   *\n   * // pass additional arguments to the event\n   * events.on('foo', function(event, bar) {\n   *   alert(bar);\n   * });\n   *\n   * events.fire({ type: 'foo' }, 'I am bar!');\n   * ```\n   *\n   * @param {string} [type] event type\n   * @param {Object} [data] event or event data\n   * @param {...any} [args] additional arguments the callback will be called with.\n   *\n   * @return {any} The return value. Will be set to `false` if the default was prevented.\n   */\n  EventBus.prototype.fire = function(type, data) {\n    var event,\n        firstListener,\n        returnValue,\n        args;\n\n    args = slice.call(arguments);\n\n    if (typeof type === 'object') {\n      data = type;\n      type = data.type;\n    }\n\n    if (!type) {\n      throw new Error('no event type specified');\n    }\n\n    firstListener = this._listeners[type];\n\n    if (!firstListener) {\n      return;\n    }\n\n    // we make sure we fire instances of our home made\n    // events here. We wrap them only once, though\n    if (data instanceof InternalEvent) {\n\n      // we are fine, we alread have an event\n      event = data;\n    } else {\n      event = this.createEvent(data);\n    }\n\n    // ensure we pass the event as the first parameter\n    args[0] = event;\n\n    // original event type (in case we delegate)\n    var originalType = event.type;\n\n    // update event type before delegation\n    if (type !== originalType) {\n      event.type = type;\n    }\n\n    try {\n      returnValue = this._invokeListeners(event, args, firstListener);\n    } finally {\n\n      // reset event type after delegation\n      if (type !== originalType) {\n        event.type = originalType;\n      }\n    }\n\n    // set the return value to false if the event default\n    // got prevented and no other return value exists\n    if (returnValue === undefined && event.defaultPrevented) {\n      returnValue = false;\n    }\n\n    return returnValue;\n  };\n\n  /**\n   * Handle an error by firing an event.\n   *\n   * @param {Error} error The error to be handled.\n   *\n   * @return {boolean} Whether the error was handled.\n   */\n  EventBus.prototype.handleError = function(error) {\n    return this.fire('error', { error: error }) === false;\n  };\n\n\n  EventBus.prototype._destroy = function() {\n    this._listeners = {};\n  };\n\n  /**\n   * @param {Event} event\n   * @param {any[]} args\n   * @param {EventBusListener} listener\n   *\n   * @return {any}\n   */\n  EventBus.prototype._invokeListeners = function(event, args, listener) {\n\n    var returnValue;\n\n    while (listener) {\n\n      // handle stopped propagation\n      if (event.cancelBubble) {\n        break;\n      }\n\n      returnValue = this._invokeListener(event, args, listener);\n\n      listener = listener.next;\n    }\n\n    return returnValue;\n  };\n\n  /**\n   * @param {Event} event\n   * @param {any[]} args\n   * @param {EventBusListener} listener\n   *\n   * @return {any}\n   */\n  EventBus.prototype._invokeListener = function(event, args, listener) {\n\n    var returnValue;\n\n    if (listener.callback.__isTomb) {\n      return returnValue;\n    }\n\n    try {\n\n      // returning false prevents the default action\n      returnValue = invokeFunction(listener.callback, args);\n\n      // stop propagation on return value\n      if (returnValue !== undefined) {\n        event.returnValue = returnValue;\n        event.stopPropagation();\n      }\n\n      // prevent default on return false\n      if (returnValue === false) {\n        event.preventDefault();\n      }\n    } catch (error) {\n      if (!this.handleError(error)) {\n        console.error('unhandled error in event listener', error);\n\n        throw error;\n      }\n    }\n\n    return returnValue;\n  };\n\n  /**\n   * Add new listener with a certain priority to the list\n   * of listeners (for the given event).\n   *\n   * The semantics of listener registration / listener execution are\n   * first register, first serve: New listeners will always be inserted\n   * after existing listeners with the same priority.\n   *\n   * Example: Inserting two listeners with priority 1000 and 1300\n   *\n   *    * before: [ 1500, 1500, 1000, 1000 ]\n   *    * after: [ 1500, 1500, (new=1300), 1000, 1000, (new=1000) ]\n   *\n   * @param {string} event\n   * @param {EventBusListener} newListener\n   */\n  EventBus.prototype._addListener = function(event, newListener) {\n\n    var listener = this._getListeners(event),\n        previousListener;\n\n    // no prior listeners\n    if (!listener) {\n      this._setListeners(event, newListener);\n\n      return;\n    }\n\n    // ensure we order listeners by priority from\n    // 0 (high) to n > 0 (low)\n    while (listener) {\n\n      if (listener.priority < newListener.priority) {\n\n        newListener.next = listener;\n\n        if (previousListener) {\n          previousListener.next = newListener;\n        } else {\n          this._setListeners(event, newListener);\n        }\n\n        return;\n      }\n\n      previousListener = listener;\n      listener = listener.next;\n    }\n\n    // add new listener to back\n    previousListener.next = newListener;\n  };\n\n\n  /**\n   * @param {string} name\n   *\n   * @return {EventBusListener}\n   */\n  EventBus.prototype._getListeners = function(name) {\n    return this._listeners[name];\n  };\n\n  /**\n   * @param {string} name\n   * @param {EventBusListener} listener\n   */\n  EventBus.prototype._setListeners = function(name, listener) {\n    this._listeners[name] = listener;\n  };\n\n  EventBus.prototype._removeListener = function(event, callback) {\n\n    var listener = this._getListeners(event),\n        nextListener,\n        previousListener,\n        listenerCallback;\n\n    if (!callback) {\n\n      // clear listeners\n      this._setListeners(event, null);\n\n      return;\n    }\n\n    while (listener) {\n\n      nextListener = listener.next;\n\n      listenerCallback = listener.callback;\n\n      if (listenerCallback === callback || listenerCallback[FN_REF] === callback) {\n        if (previousListener) {\n          previousListener.next = nextListener;\n        } else {\n\n          // new first listener\n          this._setListeners(event, nextListener);\n        }\n      }\n\n      previousListener = listener;\n      listener = nextListener;\n    }\n  };\n\n  /**\n   * A event that is emitted via the event bus.\n   */\n  function InternalEvent() { }\n\n  InternalEvent.prototype.stopPropagation = function() {\n    this.cancelBubble = true;\n  };\n\n  InternalEvent.prototype.preventDefault = function() {\n    this.defaultPrevented = true;\n  };\n\n  InternalEvent.prototype.init = function(data) {\n    assign$1(this, data || {});\n  };\n\n\n  /**\n   * Invoke function. Be fast...\n   *\n   * @param {Function} fn\n   * @param {any[]} args\n   *\n   * @return {any}\n   */\n  function invokeFunction(fn, args) {\n    return fn.apply(null, args);\n  }\n\n  /**\n   * SVGs for elements are generated by the {@link GraphicsFactory}.\n   *\n   * This utility gives quick access to the important semantic\n   * parts of an element.\n   */\n\n  /**\n   * Returns the visual part of a diagram element.\n   *\n   * @param {SVGElement} gfx\n   *\n   * @return {SVGElement}\n   */\n  function getVisual(gfx) {\n    return gfx.childNodes[0];\n  }\n\n  /**\n   * Returns the children for a given diagram element.\n   *\n   * @param {SVGElement} gfx\n   * @return {SVGElement}\n   */\n  function getChildren$1(gfx) {\n    return gfx.parentNode.childNodes[1];\n  }\n\n  /**\r\n   * @param {SVGElement} gfx\r\n   * @param {number} x\r\n   * @param {number} y\r\n   * @param {number} [angle]\r\n   * @param {number} [amount]\r\n   */\r\n  function transform(gfx, x, y, angle, amount) {\r\n    var translate = createTransform();\r\n    translate.setTranslate(x, y);\r\n\r\n    var rotate = createTransform();\r\n    rotate.setRotate(angle || 0, 0, 0);\r\n\r\n    var scale = createTransform();\r\n    scale.setScale(amount || 1, amount || 1);\r\n\r\n    transform$1(gfx, [ translate, rotate, scale ]);\r\n  }\r\n\r\n\r\n  /**\r\n   * @param {SVGElement} gfx\r\n   * @param {number} x\r\n   * @param {number} y\r\n   */\r\n  function translate$2(gfx, x, y) {\r\n    var translate = createTransform();\r\n    translate.setTranslate(x, y);\r\n\r\n    transform$1(gfx, translate);\r\n  }\r\n\r\n\r\n  /**\r\n   * @param {SVGElement} gfx\r\n   * @param {number} angle\r\n   */\r\n  function rotate(gfx, angle) {\r\n    var rotate = createTransform();\r\n    rotate.setRotate(angle, 0, 0);\r\n\r\n    transform$1(gfx, rotate);\r\n  }\n\n  /**\n   * @typedef {import('./Types').ConnectionLike} ConnectionLike\n   * @typedef {import('./Types').ElementLike} ElementLike\n   * @typedef {import('./Types').ShapeLike} ShapeLike\n   *\n   * @typedef {import('./ElementRegistry').default} ElementRegistry\n   * @typedef {import('./EventBus').default} EventBus\n   */\n\n  /**\n   * A factory that creates graphical elements.\n   *\n   * @param {EventBus} eventBus\n   * @param {ElementRegistry} elementRegistry\n   */\n  function GraphicsFactory(eventBus, elementRegistry) {\n    this._eventBus = eventBus;\n    this._elementRegistry = elementRegistry;\n  }\n\n  GraphicsFactory.$inject = [ 'eventBus' , 'elementRegistry' ];\n\n  /**\n   * @param { { parent?: any } } element\n   * @return {SVGElement}\n   */\n  GraphicsFactory.prototype._getChildrenContainer = function(element) {\n\n    var gfx = this._elementRegistry.getGraphics(element);\n\n    var childrenGfx;\n\n    // root element\n    if (!element.parent) {\n      childrenGfx = gfx;\n    } else {\n      childrenGfx = getChildren$1(gfx);\n      if (!childrenGfx) {\n        childrenGfx = create$1('g');\n        classes(childrenGfx).add('djs-children');\n\n        append(gfx.parentNode, childrenGfx);\n      }\n    }\n\n    return childrenGfx;\n  };\n\n  /**\n   * Clears the graphical representation of the element and returns the\n   * cleared visual (the <g class=\"djs-visual\" /> element).\n   */\n  GraphicsFactory.prototype._clear = function(gfx) {\n    var visual = getVisual(gfx);\n\n    clear$1(visual);\n\n    return visual;\n  };\n\n  /**\n   * Creates a gfx container for shapes and connections\n   *\n   * The layout is as follows:\n   *\n   * <g class=\"djs-group\">\n   *\n   *   <!-- the gfx -->\n   *   <g class=\"djs-element djs-(shape|connection|frame)\">\n   *     <g class=\"djs-visual\">\n   *       <!-- the renderer draws in here -->\n   *     </g>\n   *\n   *     <!-- extensions (overlays, click box, ...) goes here\n   *   </g>\n   *\n   *   <!-- the gfx child nodes -->\n   *   <g class=\"djs-children\"></g>\n   * </g>\n   *\n   * @param {string} type the type of the element, i.e. shape | connection\n   * @param {SVGElement} childrenGfx\n   * @param {number} [parentIndex] position to create container in parent\n   * @param {boolean} [isFrame] is frame element\n   *\n   * @return {SVGElement}\n   */\n  GraphicsFactory.prototype._createContainer = function(\n      type, childrenGfx, parentIndex, isFrame\n  ) {\n    var outerGfx = create$1('g');\n    classes(outerGfx).add('djs-group');\n\n    // insert node at position\n    if (typeof parentIndex !== 'undefined') {\n      prependTo(outerGfx, childrenGfx, childrenGfx.childNodes[parentIndex]);\n    } else {\n      append(childrenGfx, outerGfx);\n    }\n\n    var gfx = create$1('g');\n    classes(gfx).add('djs-element');\n    classes(gfx).add('djs-' + type);\n\n    if (isFrame) {\n      classes(gfx).add('djs-frame');\n    }\n\n    append(outerGfx, gfx);\n\n    // create visual\n    var visual = create$1('g');\n    classes(visual).add('djs-visual');\n\n    append(gfx, visual);\n\n    return gfx;\n  };\n\n  /**\n   * Create a graphical element.\n   *\n   * @param { 'shape' | 'connection' | 'label' | 'root' } type The type of the element.\n   * @param {ElementLike} element The element.\n   * @param {number} [parentIndex] The index at which to add the graphical element to its parent's children.\n   *\n   * @return {SVGElement} The graphical element.\n   */\n  GraphicsFactory.prototype.create = function(type, element, parentIndex) {\n    var childrenGfx = this._getChildrenContainer(element.parent);\n    return this._createContainer(type, childrenGfx, parentIndex, isFrameElement$1(element));\n  };\n\n  /**\n   * Update the containments of the given elements.\n   *\n   * @param {ElementLike[]} elements The elements.\n   */\n  GraphicsFactory.prototype.updateContainments = function(elements) {\n\n    var self = this,\n        elementRegistry = this._elementRegistry,\n        parents;\n\n    parents = reduce(elements, function(map, e) {\n\n      if (e.parent) {\n        map[e.parent.id] = e.parent;\n      }\n\n      return map;\n    }, {});\n\n    // update all parents of changed and reorganized their children\n    // in the correct order (as indicated in our model)\n    forEach$1(parents, function(parent) {\n\n      var children = parent.children;\n\n      if (!children) {\n        return;\n      }\n\n      var childrenGfx = self._getChildrenContainer(parent);\n\n      forEach$1(children.slice().reverse(), function(child) {\n        var childGfx = elementRegistry.getGraphics(child);\n\n        prependTo(childGfx.parentNode, childrenGfx);\n      });\n    });\n  };\n\n  /**\n   * Draw a shape.\n   *\n   * @param {SVGElement} visual The graphical element.\n   * @param {ShapeLike} element The shape.\n   *\n   * @return {SVGElement}\n   */\n  GraphicsFactory.prototype.drawShape = function(visual, element) {\n    var eventBus = this._eventBus;\n\n    return eventBus.fire('render.shape', { gfx: visual, element: element });\n  };\n\n  /**\n   * Get the path of a shape.\n   *\n   * @param {ShapeLike} element The shape.\n   *\n   * @return {string} The path of the shape.\n   */\n  GraphicsFactory.prototype.getShapePath = function(element) {\n    var eventBus = this._eventBus;\n\n    return eventBus.fire('render.getShapePath', element);\n  };\n\n  /**\n   * Draw a connection.\n   *\n   * @param {SVGElement} visual The graphical element.\n   * @param {ConnectionLike} element The connection.\n   *\n   * @return {SVGElement}\n   */\n  GraphicsFactory.prototype.drawConnection = function(visual, element) {\n    var eventBus = this._eventBus;\n\n    return eventBus.fire('render.connection', { gfx: visual, element: element });\n  };\n\n  /**\n   * Get the path of a connection.\n   *\n   * @param {ConnectionLike} connection The connection.\n   *\n   * @return {string} The path of the connection.\n   */\n  GraphicsFactory.prototype.getConnectionPath = function(connection) {\n    var eventBus = this._eventBus;\n\n    return eventBus.fire('render.getConnectionPath', connection);\n  };\n\n  /**\n   * Update an elements graphical representation.\n   *\n   * @param {'shape'|'connection'} type\n   * @param {ElementLike} element\n   * @param {SVGElement} gfx\n   */\n  GraphicsFactory.prototype.update = function(type, element, gfx) {\n\n    // do NOT update root element\n    if (!element.parent) {\n      return;\n    }\n\n    var visual = this._clear(gfx);\n\n    // redraw\n    if (type === 'shape') {\n      this.drawShape(visual, element);\n\n      // update positioning\n      translate$2(gfx, element.x, element.y);\n    } else\n    if (type === 'connection') {\n      this.drawConnection(visual, element);\n    } else {\n      throw new Error('unknown type: ' + type);\n    }\n\n    if (element.hidden) {\n      attr(gfx, 'display', 'none');\n    } else {\n      attr(gfx, 'display', 'block');\n    }\n  };\n\n  /**\n   * Remove a graphical element.\n   *\n   * @param {ElementLike} element The element.\n   */\n  GraphicsFactory.prototype.remove = function(element) {\n    var gfx = this._elementRegistry.getGraphics(element);\n\n    // remove\n    remove$1(gfx.parentNode);\n  };\n\n\n  // helpers //////////\n\n  function prependTo(newNode, parentNode, siblingNode) {\n    var node = siblingNode || parentNode.firstChild;\n\n    // do not prepend node to itself to prevent IE from crashing\n    // https://github.com/bpmn-io/bpmn-js/issues/746\n    if (newNode === node) {\n      return;\n    }\n\n    parentNode.insertBefore(newNode, node);\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var CoreModule$1 = {\n    __depends__: [ DrawModule$1 ],\n    __init__: [ 'canvas' ],\n    canvas: [ 'type', Canvas ],\n    elementRegistry: [ 'type', ElementRegistry ],\n    elementFactory: [ 'type', ElementFactory$1 ],\n    eventBus: [ 'type', EventBus ],\n    graphicsFactory: [ 'type', GraphicsFactory ]\n  };\n\n  /**\n   * @typedef {import('didi').InjectionContext} InjectionContext\n   * @typedef {import('didi').LocalsMap} LocalsMap\n   * @typedef {import('didi').ModuleDeclaration} ModuleDeclaration\n   *\n   * @typedef { {\n   *   modules?: ModuleDeclaration[];\n   * } & Record<string, any> } DiagramOptions\n   */\n\n  /**\n   * Bootstrap an injector from a list of modules, instantiating a number of default components\n   *\n   * @param {ModuleDeclaration[]} modules\n   *\n   * @return {Injector} a injector to use to access the components\n   */\n  function bootstrap(modules) {\n    var injector = new Injector(modules);\n\n    injector.init();\n\n    return injector;\n  }\n\n  /**\n   * Creates an injector from passed options.\n   *\n   * @param {DiagramOptions} [options]\n   *\n   * @return {Injector}\n   */\n  function createInjector(options) {\n\n    options = options || {};\n\n    /**\n     * @type { ModuleDeclaration }\n     */\n    var configModule = {\n      'config': [ 'value', options ]\n    };\n\n    var modules = [ configModule, CoreModule$1 ].concat(options.modules || []);\n\n    return bootstrap(modules);\n  }\n\n\n  /**\n   * The main diagram-js entry point that bootstraps the diagram with the given\n   * configuration.\n   *\n   * To register extensions with the diagram, pass them as Array<Module> to the constructor.\n   *\n   * @class\n   * @constructor\n   *\n   * @example Creating a plug-in that logs whenever a shape is added to the canvas.\n   *\n   * ```javascript\n   * // plug-in implementation\n   * function MyLoggingPlugin(eventBus) {\n   *   eventBus.on('shape.added', function(event) {\n   *     console.log('shape ', event.shape, ' was added to the diagram');\n   *   });\n   * }\n   *\n   * // export as module\n   * export default {\n   *   __init__: [ 'myLoggingPlugin' ],\n   *     myLoggingPlugin: [ 'type', MyLoggingPlugin ]\n   * };\n   * ```\n   *\n   * Use the plug-in in a Diagram instance:\n   *\n   * ```javascript\n   * import MyLoggingModule from 'path-to-my-logging-plugin';\n   *\n   * var diagram = new Diagram({\n   *   modules: [\n   *     MyLoggingModule\n   *   ]\n   * });\n   *\n   * diagram.invoke([ 'canvas', function(canvas) {\n   *   // add shape to drawing canvas\n   *   canvas.addShape({ x: 10, y: 10 });\n   * });\n   *\n   * // 'shape ... was added to the diagram' logged to console\n   * ```\n   *\n   * @param {DiagramOptions} [options]\n   * @param {Injector} [injector] An (optional) injector to bootstrap the diagram with.\n   */\n  function Diagram(options, injector) {\n\n    this._injector = injector = injector || createInjector(options);\n\n    // API\n\n    /**\n     * Resolves a diagram service.\n     *\n     * @template T\n     *\n     * @param {string} name The name of the service to get.\n     * @param {boolean} [strict=true] If false, resolve missing services to null.\n     *\n     * @return {T|null}\n     */\n    this.get = injector.get;\n\n    /**\n     * Executes a function with its dependencies injected.\n     *\n     * @template T\n     *\n     * @param {Function} func function to be invoked\n     * @param {InjectionContext} [context] context of the invocation\n     * @param {LocalsMap} [locals] locals provided\n     *\n     * @return {T|null}\n     */\n    this.invoke = injector.invoke;\n\n    // init\n\n    // indicate via event\n\n\n    /**\n     * An event indicating that all plug-ins are loaded.\n     *\n     * Use this event to fire other events to interested plug-ins\n     *\n     * @memberOf Diagram\n     *\n     * @event diagram.init\n     *\n     * @example\n     *\n     * ```javascript\n     * eventBus.on('diagram.init', function() {\n     *   eventBus.fire('my-custom-event', { foo: 'BAR' });\n     * });\n     * ```\n     *\n     * @type {Object}\n     */\n    this.get('eventBus').fire('diagram.init');\n  }\n\n\n  /**\n   * Destroys the diagram\n   */\n  Diagram.prototype.destroy = function() {\n    this.get('eventBus').fire('diagram.destroy');\n  };\n\n  /**\n   * Clear the diagram, removing all contents.\n   */\n  Diagram.prototype.clear = function() {\n    this.get('eventBus').fire('diagram.clear');\n  };\n\n  /**\n   * Moddle base element.\n   */\n  function Base() { }\n\n  Base.prototype.get = function(name) {\n    return this.$model.properties.get(this, name);\n  };\n\n  Base.prototype.set = function(name, value) {\n    this.$model.properties.set(this, name, value);\n  };\n\n  /**\n   * A model element factory.\n   *\n   * @param {Moddle} model\n   * @param {Properties} properties\n   */\n  function Factory(model, properties) {\n    this.model = model;\n    this.properties = properties;\n  }\n\n\n  Factory.prototype.createType = function(descriptor) {\n\n    var model = this.model;\n\n    var props = this.properties,\n        prototype = Object.create(Base.prototype);\n\n    // initialize default values\n    forEach$1(descriptor.properties, function(p) {\n      if (!p.isMany && p.default !== undefined) {\n        prototype[p.name] = p.default;\n      }\n    });\n\n    props.defineModel(prototype, model);\n    props.defineDescriptor(prototype, descriptor);\n\n    var name = descriptor.ns.name;\n\n    /**\n     * The new type constructor\n     */\n    function ModdleElement(attrs) {\n      props.define(this, '$type', { value: name, enumerable: true });\n      props.define(this, '$attrs', { value: {} });\n      props.define(this, '$parent', { writable: true });\n\n      forEach$1(attrs, bind$2(function(val, key) {\n        this.set(key, val);\n      }, this));\n    }\n\n    ModdleElement.prototype = prototype;\n\n    ModdleElement.hasType = prototype.$instanceOf = this.model.hasType;\n\n    // static links\n    props.defineModel(ModdleElement, model);\n    props.defineDescriptor(ModdleElement, descriptor);\n\n    return ModdleElement;\n  };\n\n  /**\n   * Built-in moddle types\n   */\n  var BUILTINS = {\n    String: true,\n    Boolean: true,\n    Integer: true,\n    Real: true,\n    Element: true\n  };\n\n  /**\n   * Converters for built in types from string representations\n   */\n  var TYPE_CONVERTERS = {\n    String: function(s) { return s; },\n    Boolean: function(s) { return s === 'true'; },\n    Integer: function(s) { return parseInt(s, 10); },\n    Real: function(s) { return parseFloat(s); }\n  };\n\n  /**\n   * Convert a type to its real representation\n   */\n  function coerceType(type, value) {\n\n    var converter = TYPE_CONVERTERS[type];\n\n    if (converter) {\n      return converter(value);\n    } else {\n      return value;\n    }\n  }\n\n  /**\n   * Return whether the given type is built-in\n   */\n  function isBuiltIn(type) {\n    return !!BUILTINS[type];\n  }\n\n  /**\n   * Return whether the given type is simple\n   */\n  function isSimple(type) {\n    return !!TYPE_CONVERTERS[type];\n  }\n\n  /**\n   * Parses a namespaced attribute name of the form (ns:)localName to an object,\n   * given a default prefix to assume in case no explicit namespace is given.\n   *\n   * @param {String} name\n   * @param {String} [defaultPrefix] the default prefix to take, if none is present.\n   *\n   * @return {Object} the parsed name\n   */\n  function parseName(name, defaultPrefix) {\n    var parts = name.split(/:/),\n        localName, prefix;\n\n    // no prefix (i.e. only local name)\n    if (parts.length === 1) {\n      localName = name;\n      prefix = defaultPrefix;\n    } else\n\n    // prefix + local name\n    if (parts.length === 2) {\n      localName = parts[1];\n      prefix = parts[0];\n    } else {\n      throw new Error('expected <prefix:localName> or <localName>, got ' + name);\n    }\n\n    name = (prefix ? prefix + ':' : '') + localName;\n\n    return {\n      name: name,\n      prefix: prefix,\n      localName: localName\n    };\n  }\n\n  /**\n   * A utility to build element descriptors.\n   */\n  function DescriptorBuilder(nameNs) {\n    this.ns = nameNs;\n    this.name = nameNs.name;\n    this.allTypes = [];\n    this.allTypesByName = {};\n    this.properties = [];\n    this.propertiesByName = {};\n  }\n\n\n  DescriptorBuilder.prototype.build = function() {\n    return pick(this, [\n      'ns',\n      'name',\n      'allTypes',\n      'allTypesByName',\n      'properties',\n      'propertiesByName',\n      'bodyProperty',\n      'idProperty'\n    ]);\n  };\n\n  /**\n   * Add property at given index.\n   *\n   * @param {Object} p\n   * @param {Number} [idx]\n   * @param {Boolean} [validate=true]\n   */\n  DescriptorBuilder.prototype.addProperty = function(p, idx, validate) {\n\n    if (typeof idx === 'boolean') {\n      validate = idx;\n      idx = undefined;\n    }\n\n    this.addNamedProperty(p, validate !== false);\n\n    var properties = this.properties;\n\n    if (idx !== undefined) {\n      properties.splice(idx, 0, p);\n    } else {\n      properties.push(p);\n    }\n  };\n\n\n  DescriptorBuilder.prototype.replaceProperty = function(oldProperty, newProperty, replace) {\n    var oldNameNs = oldProperty.ns;\n\n    var props = this.properties,\n        propertiesByName = this.propertiesByName,\n        rename = oldProperty.name !== newProperty.name;\n\n    if (oldProperty.isId) {\n      if (!newProperty.isId) {\n        throw new Error(\n          'property <' + newProperty.ns.name + '> must be id property ' +\n          'to refine <' + oldProperty.ns.name + '>');\n      }\n\n      this.setIdProperty(newProperty, false);\n    }\n\n    if (oldProperty.isBody) {\n\n      if (!newProperty.isBody) {\n        throw new Error(\n          'property <' + newProperty.ns.name + '> must be body property ' +\n          'to refine <' + oldProperty.ns.name + '>');\n      }\n\n      // TODO: Check compatibility\n      this.setBodyProperty(newProperty, false);\n    }\n\n    // validate existence and get location of old property\n    var idx = props.indexOf(oldProperty);\n    if (idx === -1) {\n      throw new Error('property <' + oldNameNs.name + '> not found in property list');\n    }\n\n    // remove old property\n    props.splice(idx, 1);\n\n    // replacing the named property is intentional\n    //\n    //  * validate only if this is a \"rename\" operation\n    //  * add at specific index unless we \"replace\"\n    //\n    this.addProperty(newProperty, replace ? undefined : idx, rename);\n\n    // make new property available under old name\n    propertiesByName[oldNameNs.name] = propertiesByName[oldNameNs.localName] = newProperty;\n  };\n\n\n  DescriptorBuilder.prototype.redefineProperty = function(p, targetPropertyName, replace) {\n\n    var nsPrefix = p.ns.prefix;\n    var parts = targetPropertyName.split('#');\n\n    var name = parseName(parts[0], nsPrefix);\n    var attrName = parseName(parts[1], name.prefix).name;\n\n    var redefinedProperty = this.propertiesByName[attrName];\n    if (!redefinedProperty) {\n      throw new Error('refined property <' + attrName + '> not found');\n    } else {\n      this.replaceProperty(redefinedProperty, p, replace);\n    }\n\n    delete p.redefines;\n  };\n\n  DescriptorBuilder.prototype.addNamedProperty = function(p, validate) {\n    var ns = p.ns,\n        propsByName = this.propertiesByName;\n\n    if (validate) {\n      this.assertNotDefined(p, ns.name);\n      this.assertNotDefined(p, ns.localName);\n    }\n\n    propsByName[ns.name] = propsByName[ns.localName] = p;\n  };\n\n  DescriptorBuilder.prototype.removeNamedProperty = function(p) {\n    var ns = p.ns,\n        propsByName = this.propertiesByName;\n\n    delete propsByName[ns.name];\n    delete propsByName[ns.localName];\n  };\n\n  DescriptorBuilder.prototype.setBodyProperty = function(p, validate) {\n\n    if (validate && this.bodyProperty) {\n      throw new Error(\n        'body property defined multiple times ' +\n        '(<' + this.bodyProperty.ns.name + '>, <' + p.ns.name + '>)');\n    }\n\n    this.bodyProperty = p;\n  };\n\n  DescriptorBuilder.prototype.setIdProperty = function(p, validate) {\n\n    if (validate && this.idProperty) {\n      throw new Error(\n        'id property defined multiple times ' +\n        '(<' + this.idProperty.ns.name + '>, <' + p.ns.name + '>)');\n    }\n\n    this.idProperty = p;\n  };\n\n  DescriptorBuilder.prototype.assertNotDefined = function(p, name) {\n    var propertyName = p.name,\n        definedProperty = this.propertiesByName[propertyName];\n\n    if (definedProperty) {\n      throw new Error(\n        'property <' + propertyName + '> already defined; ' +\n        'override of <' + definedProperty.definedBy.ns.name + '#' + definedProperty.ns.name + '> by ' +\n        '<' + p.definedBy.ns.name + '#' + p.ns.name + '> not allowed without redefines');\n    }\n  };\n\n  DescriptorBuilder.prototype.hasProperty = function(name) {\n    return this.propertiesByName[name];\n  };\n\n  DescriptorBuilder.prototype.addTrait = function(t, inherited) {\n\n    var typesByName = this.allTypesByName,\n        types = this.allTypes;\n\n    var typeName = t.name;\n\n    if (typeName in typesByName) {\n      return;\n    }\n\n    forEach$1(t.properties, bind$2(function(p) {\n\n      // clone property to allow extensions\n      p = assign$1({}, p, {\n        name: p.ns.localName,\n        inherited: inherited\n      });\n\n      Object.defineProperty(p, 'definedBy', {\n        value: t\n      });\n\n      var replaces = p.replaces,\n          redefines = p.redefines;\n\n      // add replace/redefine support\n      if (replaces || redefines) {\n        this.redefineProperty(p, replaces || redefines, replaces);\n      } else {\n        if (p.isBody) {\n          this.setBodyProperty(p);\n        }\n        if (p.isId) {\n          this.setIdProperty(p);\n        }\n        this.addProperty(p);\n      }\n    }, this));\n\n    types.push(t);\n    typesByName[typeName] = t;\n  };\n\n  /**\n   * A registry of Moddle packages.\n   *\n   * @param {Array<Package>} packages\n   * @param {Properties} properties\n   */\n  function Registry(packages, properties) {\n    this.packageMap = {};\n    this.typeMap = {};\n\n    this.packages = [];\n\n    this.properties = properties;\n\n    forEach$1(packages, bind$2(this.registerPackage, this));\n  }\n\n\n  Registry.prototype.getPackage = function(uriOrPrefix) {\n    return this.packageMap[uriOrPrefix];\n  };\n\n  Registry.prototype.getPackages = function() {\n    return this.packages;\n  };\n\n\n  Registry.prototype.registerPackage = function(pkg) {\n\n    // copy package\n    pkg = assign$1({}, pkg);\n\n    var pkgMap = this.packageMap;\n\n    ensureAvailable(pkgMap, pkg, 'prefix');\n    ensureAvailable(pkgMap, pkg, 'uri');\n\n    // register types\n    forEach$1(pkg.types, bind$2(function(descriptor) {\n      this.registerType(descriptor, pkg);\n    }, this));\n\n    pkgMap[pkg.uri] = pkgMap[pkg.prefix] = pkg;\n    this.packages.push(pkg);\n  };\n\n\n  /**\n   * Register a type from a specific package with us\n   */\n  Registry.prototype.registerType = function(type, pkg) {\n\n    type = assign$1({}, type, {\n      superClass: (type.superClass || []).slice(),\n      extends: (type.extends || []).slice(),\n      properties: (type.properties || []).slice(),\n      meta: assign$1((type.meta || {}))\n    });\n\n    var ns = parseName(type.name, pkg.prefix),\n        name = ns.name,\n        propertiesByName = {};\n\n    // parse properties\n    forEach$1(type.properties, bind$2(function(p) {\n\n      // namespace property names\n      var propertyNs = parseName(p.name, ns.prefix),\n          propertyName = propertyNs.name;\n\n      // namespace property types\n      if (!isBuiltIn(p.type)) {\n        p.type = parseName(p.type, propertyNs.prefix).name;\n      }\n\n      assign$1(p, {\n        ns: propertyNs,\n        name: propertyName\n      });\n\n      propertiesByName[propertyName] = p;\n    }, this));\n\n    // update ns + name\n    assign$1(type, {\n      ns: ns,\n      name: name,\n      propertiesByName: propertiesByName\n    });\n\n    forEach$1(type.extends, bind$2(function(extendsName) {\n      var extended = this.typeMap[extendsName];\n\n      extended.traits = extended.traits || [];\n      extended.traits.push(name);\n    }, this));\n\n    // link to package\n    this.definePackage(type, pkg);\n\n    // register\n    this.typeMap[name] = type;\n  };\n\n\n  /**\n   * Traverse the type hierarchy from bottom to top,\n   * calling iterator with (type, inherited) for all elements in\n   * the inheritance chain.\n   *\n   * @param {Object} nsName\n   * @param {Function} iterator\n   * @param {Boolean} [trait=false]\n   */\n  Registry.prototype.mapTypes = function(nsName, iterator, trait) {\n\n    var type = isBuiltIn(nsName.name) ? { name: nsName.name } : this.typeMap[nsName.name];\n\n    var self = this;\n\n    /**\n     * Traverse the selected trait.\n     *\n     * @param {String} cls\n     */\n    function traverseTrait(cls) {\n      return traverseSuper(cls, true);\n    }\n\n    /**\n     * Traverse the selected super type or trait\n     *\n     * @param {String} cls\n     * @param {Boolean} [trait=false]\n     */\n    function traverseSuper(cls, trait) {\n      var parentNs = parseName(cls, isBuiltIn(cls) ? '' : nsName.prefix);\n      self.mapTypes(parentNs, iterator, trait);\n    }\n\n    if (!type) {\n      throw new Error('unknown type <' + nsName.name + '>');\n    }\n\n    forEach$1(type.superClass, trait ? traverseTrait : traverseSuper);\n\n    // call iterator with (type, inherited=!trait)\n    iterator(type, !trait);\n\n    forEach$1(type.traits, traverseTrait);\n  };\n\n\n  /**\n   * Returns the effective descriptor for a type.\n   *\n   * @param  {String} type the namespaced name (ns:localName) of the type\n   *\n   * @return {Descriptor} the resulting effective descriptor\n   */\n  Registry.prototype.getEffectiveDescriptor = function(name) {\n\n    var nsName = parseName(name);\n\n    var builder = new DescriptorBuilder(nsName);\n\n    this.mapTypes(nsName, function(type, inherited) {\n      builder.addTrait(type, inherited);\n    });\n\n    var descriptor = builder.build();\n\n    // define package link\n    this.definePackage(descriptor, descriptor.allTypes[descriptor.allTypes.length - 1].$pkg);\n\n    return descriptor;\n  };\n\n\n  Registry.prototype.definePackage = function(target, pkg) {\n    this.properties.define(target, '$pkg', { value: pkg });\n  };\n\n\n\n  // helpers ////////////////////////////\n\n  function ensureAvailable(packageMap, pkg, identifierKey) {\n\n    var value = pkg[identifierKey];\n\n    if (value in packageMap) {\n      throw new Error('package with ' + identifierKey + ' <' + value + '> already defined');\n    }\n  }\n\n  /**\n   * A utility that gets and sets properties of model elements.\n   *\n   * @param {Model} model\n   */\n  function Properties(model) {\n    this.model = model;\n  }\n\n\n  /**\n   * Sets a named property on the target element.\n   * If the value is undefined, the property gets deleted.\n   *\n   * @param {Object} target\n   * @param {String} name\n   * @param {Object} value\n   */\n  Properties.prototype.set = function(target, name, value) {\n\n    if (!isString(name) || !name.length) {\n      throw new TypeError('property name must be a non-empty string');\n    }\n\n    var property = this.model.getPropertyDescriptor(target, name);\n\n    var propertyName = property && property.name;\n\n    if (isUndefined(value)) {\n\n      // unset the property, if the specified value is undefined;\n      // delete from $attrs (for extensions) or the target itself\n      if (property) {\n        delete target[propertyName];\n      } else {\n        delete target.$attrs[name];\n      }\n    } else {\n\n      // set the property, defining well defined properties on the fly\n      // or simply updating them in target.$attrs (for extensions)\n      if (property) {\n        if (propertyName in target) {\n          target[propertyName] = value;\n        } else {\n          defineProperty(target, property, value);\n        }\n      } else {\n        target.$attrs[name] = value;\n      }\n    }\n  };\n\n  /**\n   * Returns the named property of the given element\n   *\n   * @param  {Object} target\n   * @param  {String} name\n   *\n   * @return {Object}\n   */\n  Properties.prototype.get = function(target, name) {\n\n    var property = this.model.getPropertyDescriptor(target, name);\n\n    if (!property) {\n      return target.$attrs[name];\n    }\n\n    var propertyName = property.name;\n\n    // check if access to collection property and lazily initialize it\n    if (!target[propertyName] && property.isMany) {\n      defineProperty(target, property, []);\n    }\n\n    return target[propertyName];\n  };\n\n\n  /**\n   * Define a property on the target element\n   *\n   * @param  {Object} target\n   * @param  {String} name\n   * @param  {Object} options\n   */\n  Properties.prototype.define = function(target, name, options) {\n\n    if (!options.writable) {\n\n      var value = options.value;\n\n      // use getters for read-only variables to support ES6 proxies\n      // cf. https://github.com/bpmn-io/internal-docs/issues/386\n      options = assign$1({}, options, {\n        get: function() { return value; }\n      });\n\n      delete options.value;\n    }\n\n    Object.defineProperty(target, name, options);\n  };\n\n\n  /**\n   * Define the descriptor for an element\n   */\n  Properties.prototype.defineDescriptor = function(target, descriptor) {\n    this.define(target, '$descriptor', { value: descriptor });\n  };\n\n  /**\n   * Define the model for an element\n   */\n  Properties.prototype.defineModel = function(target, model) {\n    this.define(target, '$model', { value: model });\n  };\n\n\n  function isUndefined(val) {\n    return typeof val === 'undefined';\n  }\n\n  function defineProperty(target, property, value) {\n    Object.defineProperty(target, property.name, {\n      enumerable: !property.isReference,\n      writable: true,\n      value: value,\n      configurable: true\n    });\n  }\n\n  // Moddle implementation /////////////////////////////////////////////////\n\n  /**\n   * @class Moddle\n   *\n   * A model that can be used to create elements of a specific type.\n   *\n   * @example\n   *\n   * var Moddle = require('moddle');\n   *\n   * var pkg = {\n   *   name: 'mypackage',\n   *   prefix: 'my',\n   *   types: [\n   *     { name: 'Root' }\n   *   ]\n   * };\n   *\n   * var moddle = new Moddle([pkg]);\n   *\n   * @param {Array<Package>} packages the packages to contain\n   */\n  function Moddle(packages) {\n\n    this.properties = new Properties(this);\n\n    this.factory = new Factory(this, this.properties);\n    this.registry = new Registry(packages, this.properties);\n\n    this.typeCache = {};\n  }\n\n\n  /**\n   * Create an instance of the specified type.\n   *\n   * @method Moddle#create\n   *\n   * @example\n   *\n   * var foo = moddle.create('my:Foo');\n   * var bar = moddle.create('my:Bar', { id: 'BAR_1' });\n   *\n   * @param  {String|Object} descriptor the type descriptor or name know to the model\n   * @param  {Object} attrs   a number of attributes to initialize the model instance with\n   * @return {Object}         model instance\n   */\n  Moddle.prototype.create = function(descriptor, attrs) {\n    var Type = this.getType(descriptor);\n\n    if (!Type) {\n      throw new Error('unknown type <' + descriptor + '>');\n    }\n\n    return new Type(attrs);\n  };\n\n\n  /**\n   * Returns the type representing a given descriptor\n   *\n   * @method Moddle#getType\n   *\n   * @example\n   *\n   * var Foo = moddle.getType('my:Foo');\n   * var foo = new Foo({ 'id' : 'FOO_1' });\n   *\n   * @param  {String|Object} descriptor the type descriptor or name know to the model\n   * @return {Object}         the type representing the descriptor\n   */\n  Moddle.prototype.getType = function(descriptor) {\n\n    var cache = this.typeCache;\n\n    var name = isString(descriptor) ? descriptor : descriptor.ns.name;\n\n    var type = cache[name];\n\n    if (!type) {\n      descriptor = this.registry.getEffectiveDescriptor(name);\n      type = cache[name] = this.factory.createType(descriptor);\n    }\n\n    return type;\n  };\n\n\n  /**\n   * Creates an any-element type to be used within model instances.\n   *\n   * This can be used to create custom elements that lie outside the meta-model.\n   * The created element contains all the meta-data required to serialize it\n   * as part of meta-model elements.\n   *\n   * @method Moddle#createAny\n   *\n   * @example\n   *\n   * var foo = moddle.createAny('vendor:Foo', 'http://vendor', {\n   *   value: 'bar'\n   * });\n   *\n   * var container = moddle.create('my:Container', 'http://my', {\n   *   any: [ foo ]\n   * });\n   *\n   * // go ahead and serialize the stuff\n   *\n   *\n   * @param  {String} name  the name of the element\n   * @param  {String} nsUri the namespace uri of the element\n   * @param  {Object} [properties] a map of properties to initialize the instance with\n   * @return {Object} the any type instance\n   */\n  Moddle.prototype.createAny = function(name, nsUri, properties) {\n\n    var nameNs = parseName(name);\n\n    var element = {\n      $type: name,\n      $instanceOf: function(type) {\n        return type === this.$type;\n      }\n    };\n\n    var descriptor = {\n      name: name,\n      isGeneric: true,\n      ns: {\n        prefix: nameNs.prefix,\n        localName: nameNs.localName,\n        uri: nsUri\n      }\n    };\n\n    this.properties.defineDescriptor(element, descriptor);\n    this.properties.defineModel(element, this);\n    this.properties.define(element, '$parent', { enumerable: false, writable: true });\n    this.properties.define(element, '$instanceOf', { enumerable: false, writable: true });\n\n    forEach$1(properties, function(a, key) {\n      if (isObject(a) && a.value !== undefined) {\n        element[a.name] = a.value;\n      } else {\n        element[key] = a;\n      }\n    });\n\n    return element;\n  };\n\n  /**\n   * Returns a registered package by uri or prefix\n   *\n   * @return {Object} the package\n   */\n  Moddle.prototype.getPackage = function(uriOrPrefix) {\n    return this.registry.getPackage(uriOrPrefix);\n  };\n\n  /**\n   * Returns a snapshot of all known packages\n   *\n   * @return {Object} the package\n   */\n  Moddle.prototype.getPackages = function() {\n    return this.registry.getPackages();\n  };\n\n  /**\n   * Returns the descriptor for an element\n   */\n  Moddle.prototype.getElementDescriptor = function(element) {\n    return element.$descriptor;\n  };\n\n  /**\n   * Returns true if the given descriptor or instance\n   * represents the given type.\n   *\n   * May be applied to this, if element is omitted.\n   */\n  Moddle.prototype.hasType = function(element, type) {\n    if (type === undefined) {\n      type = element;\n      element = this;\n    }\n\n    var descriptor = element.$model.getElementDescriptor(element);\n\n    return (type in descriptor.allTypesByName);\n  };\n\n  /**\n   * Returns the descriptor of an elements named property\n   */\n  Moddle.prototype.getPropertyDescriptor = function(element, property) {\n    return this.getElementDescriptor(element).propertiesByName[property];\n  };\n\n  /**\n   * Returns a mapped type's descriptor\n   */\n  Moddle.prototype.getTypeDescriptor = function(type) {\n    return this.registry.typeMap[type];\n  };\n\n  var fromCharCode = String.fromCharCode;\n\n  var hasOwnProperty = Object.prototype.hasOwnProperty;\n\n  var ENTITY_PATTERN = /&#(\\d+);|&#x([0-9a-f]+);|&(\\w+);/ig;\n\n  var ENTITY_MAPPING = {\n    'amp': '&',\n    'apos': '\\'',\n    'gt': '>',\n    'lt': '<',\n    'quot': '\"'\n  };\n\n  // map UPPERCASE variants of supported special chars\n  Object.keys(ENTITY_MAPPING).forEach(function(k) {\n    ENTITY_MAPPING[k.toUpperCase()] = ENTITY_MAPPING[k];\n  });\n\n\n  function replaceEntities(_, d, x, z) {\n\n    // reserved names, i.e. &nbsp;\n    if (z) {\n      if (hasOwnProperty.call(ENTITY_MAPPING, z)) {\n        return ENTITY_MAPPING[z];\n      } else {\n\n        // fall back to original value\n        return '&' + z + ';';\n      }\n    }\n\n    // decimal encoded char\n    if (d) {\n      return fromCharCode(d);\n    }\n\n    // hex encoded char\n    return fromCharCode(parseInt(x, 16));\n  }\n\n\n  /**\n   * A basic entity decoder that can decode a minimal\n   * sub-set of reserved names (&amp;) as well as\n   * hex (&#xaaf;) and decimal (&#1231;) encoded characters.\n   *\n   * @param {string} str\n   *\n   * @return {string} decoded string\n   */\n  function decodeEntities(s) {\n    if (s.length > 3 && s.indexOf('&') !== -1) {\n      return s.replace(ENTITY_PATTERN, replaceEntities);\n    }\n\n    return s;\n  }\n\n  var XSI_URI = 'http://www.w3.org/2001/XMLSchema-instance';\n  var XSI_PREFIX = 'xsi';\n  var XSI_TYPE$1 = 'xsi:type';\n\n  var NON_WHITESPACE_OUTSIDE_ROOT_NODE = 'non-whitespace outside of root node';\n\n  function error$2(msg) {\n    return new Error(msg);\n  }\n\n  function missingNamespaceForPrefix(prefix) {\n    return 'missing namespace for prefix <' + prefix + '>';\n  }\n\n  function getter(getFn) {\n    return {\n      'get': getFn,\n      'enumerable': true\n    };\n  }\n\n  function cloneNsMatrix(nsMatrix) {\n    var clone = {}, key;\n    for (key in nsMatrix) {\n      clone[key] = nsMatrix[key];\n    }\n    return clone;\n  }\n\n  function uriPrefix(prefix) {\n    return prefix + '$uri';\n  }\n\n  function buildNsMatrix(nsUriToPrefix) {\n    var nsMatrix = {},\n        uri,\n        prefix;\n\n    for (uri in nsUriToPrefix) {\n      prefix = nsUriToPrefix[uri];\n      nsMatrix[prefix] = prefix;\n      nsMatrix[uriPrefix(prefix)] = uri;\n    }\n\n    return nsMatrix;\n  }\n\n  function noopGetContext() {\n    return { 'line': 0, 'column': 0 };\n  }\n\n  function throwFunc(err) {\n    throw err;\n  }\n\n  /**\n   * Creates a new parser with the given options.\n   *\n   * @constructor\n   *\n   * @param  {!Object<string, ?>=} options\n   */\n  function Parser(options) {\n\n    if (!this) {\n      return new Parser(options);\n    }\n\n    var proxy = options && options['proxy'];\n\n    var onText,\n        onOpenTag,\n        onCloseTag,\n        onCDATA,\n        onError = throwFunc,\n        onWarning,\n        onComment,\n        onQuestion,\n        onAttention;\n\n    var getContext = noopGetContext;\n\n    /**\n     * Do we need to parse the current elements attributes for namespaces?\n     *\n     * @type {boolean}\n     */\n    var maybeNS = false;\n\n    /**\n     * Do we process namespaces at all?\n     *\n     * @type {boolean}\n     */\n    var isNamespace = false;\n\n    /**\n     * The caught error returned on parse end\n     *\n     * @type {Error}\n     */\n    var returnError = null;\n\n    /**\n     * Should we stop parsing?\n     *\n     * @type {boolean}\n     */\n    var parseStop = false;\n\n    /**\n     * A map of { uri: prefix } used by the parser.\n     *\n     * This map will ensure we can normalize prefixes during processing;\n     * for each uri, only one prefix will be exposed to the handlers.\n     *\n     * @type {!Object<string, string>}}\n     */\n    var nsUriToPrefix;\n\n    /**\n     * Handle parse error.\n     *\n     * @param  {string|Error} err\n     */\n    function handleError(err) {\n      if (!(err instanceof Error)) {\n        err = error$2(err);\n      }\n\n      returnError = err;\n\n      onError(err, getContext);\n    }\n\n    /**\n     * Handle parse error.\n     *\n     * @param  {string|Error} err\n     */\n    function handleWarning(err) {\n\n      if (!onWarning) {\n        return;\n      }\n\n      if (!(err instanceof Error)) {\n        err = error$2(err);\n      }\n\n      onWarning(err, getContext);\n    }\n\n    /**\n     * Register parse listener.\n     *\n     * @param  {string}   name\n     * @param  {Function} cb\n     *\n     * @return {Parser}\n     */\n    this['on'] = function(name, cb) {\n\n      if (typeof cb !== 'function') {\n        throw error$2('required args <name, cb>');\n      }\n\n      switch (name) {\n      case 'openTag': onOpenTag = cb; break;\n      case 'text': onText = cb; break;\n      case 'closeTag': onCloseTag = cb; break;\n      case 'error': onError = cb; break;\n      case 'warn': onWarning = cb; break;\n      case 'cdata': onCDATA = cb; break;\n      case 'attention': onAttention = cb; break; // <!XXXXX zzzz=\"eeee\">\n      case 'question': onQuestion = cb; break; // <? ....  ?>\n      case 'comment': onComment = cb; break;\n      default:\n        throw error$2('unsupported event: ' + name);\n      }\n\n      return this;\n    };\n\n    /**\n     * Set the namespace to prefix mapping.\n     *\n     * @example\n     *\n     * parser.ns({\n     *   'http://foo': 'foo',\n     *   'http://bar': 'bar'\n     * });\n     *\n     * @param  {!Object<string, string>} nsMap\n     *\n     * @return {Parser}\n     */\n    this['ns'] = function(nsMap) {\n\n      if (typeof nsMap === 'undefined') {\n        nsMap = {};\n      }\n\n      if (typeof nsMap !== 'object') {\n        throw error$2('required args <nsMap={}>');\n      }\n\n      var _nsUriToPrefix = {}, k;\n\n      for (k in nsMap) {\n        _nsUriToPrefix[k] = nsMap[k];\n      }\n\n      // FORCE default mapping for schema instance\n      _nsUriToPrefix[XSI_URI] = XSI_PREFIX;\n\n      isNamespace = true;\n      nsUriToPrefix = _nsUriToPrefix;\n\n      return this;\n    };\n\n    /**\n     * Parse xml string.\n     *\n     * @param  {string} xml\n     *\n     * @return {Error} returnError, if not thrown\n     */\n    this['parse'] = function(xml) {\n      if (typeof xml !== 'string') {\n        throw error$2('required args <xml=string>');\n      }\n\n      returnError = null;\n\n      parse(xml);\n\n      getContext = noopGetContext;\n      parseStop = false;\n\n      return returnError;\n    };\n\n    /**\n     * Stop parsing.\n     */\n    this['stop'] = function() {\n      parseStop = true;\n    };\n\n    /**\n     * Parse string, invoking configured listeners on element.\n     *\n     * @param  {string} xml\n     */\n    function parse(xml) {\n      var nsMatrixStack = isNamespace ? [] : null,\n          nsMatrix = isNamespace ? buildNsMatrix(nsUriToPrefix) : null,\n          _nsMatrix,\n          nodeStack = [],\n          anonymousNsCount = 0,\n          tagStart = false,\n          tagEnd = false,\n          i = 0, j = 0,\n          x, y, q, w, v,\n          xmlns,\n          elementName,\n          _elementName,\n          elementProxy\n          ;\n\n      var attrsString = '',\n          attrsStart = 0,\n          cachedAttrs // false = parsed with errors, null = needs parsing\n          ;\n\n      /**\n       * Parse attributes on demand and returns the parsed attributes.\n       *\n       * Return semantics: (1) `false` on attribute parse error,\n       * (2) object hash on extracted attrs.\n       *\n       * @return {boolean|Object}\n       */\n      function getAttrs() {\n        if (cachedAttrs !== null) {\n          return cachedAttrs;\n        }\n\n        var nsUri,\n            nsUriPrefix,\n            nsName,\n            defaultAlias = isNamespace && nsMatrix['xmlns'],\n            attrList = isNamespace && maybeNS ? [] : null,\n            i = attrsStart,\n            s = attrsString,\n            l = s.length,\n            hasNewMatrix,\n            newalias,\n            value,\n            alias,\n            name,\n            attrs = {},\n            seenAttrs = {},\n            skipAttr,\n            w,\n            j;\n\n        parseAttr:\n        for (; i < l; i++) {\n          skipAttr = false;\n          w = s.charCodeAt(i);\n\n          if (w === 32 || (w < 14 && w > 8)) { // WHITESPACE={ \\f\\n\\r\\t\\v}\n            continue;\n          }\n\n          // wait for non whitespace character\n          if (w < 65 || w > 122 || (w > 90 && w < 97)) {\n            if (w !== 95 && w !== 58) { // char 95\"_\" 58\":\"\n              handleWarning('illegal first char attribute name');\n              skipAttr = true;\n            }\n          }\n\n          // parse attribute name\n          for (j = i + 1; j < l; j++) {\n            w = s.charCodeAt(j);\n\n            if (\n              w > 96 && w < 123 ||\n              w > 64 && w < 91 ||\n              w > 47 && w < 59 ||\n              w === 46 || // '.'\n              w === 45 || // '-'\n              w === 95 // '_'\n            ) {\n              continue;\n            }\n\n            // unexpected whitespace\n            if (w === 32 || (w < 14 && w > 8)) { // WHITESPACE\n              handleWarning('missing attribute value');\n              i = j;\n\n              continue parseAttr;\n            }\n\n            // expected \"=\"\n            if (w === 61) { // \"=\" == 61\n              break;\n            }\n\n            handleWarning('illegal attribute name char');\n            skipAttr = true;\n          }\n\n          name = s.substring(i, j);\n\n          if (name === 'xmlns:xmlns') {\n            handleWarning('illegal declaration of xmlns');\n            skipAttr = true;\n          }\n\n          w = s.charCodeAt(j + 1);\n\n          if (w === 34) { // '\"'\n            j = s.indexOf('\"', i = j + 2);\n\n            if (j === -1) {\n              j = s.indexOf('\\'', i);\n\n              if (j !== -1) {\n                handleWarning('attribute value quote missmatch');\n                skipAttr = true;\n              }\n            }\n\n          } else if (w === 39) { // \"'\"\n            j = s.indexOf('\\'', i = j + 2);\n\n            if (j === -1) {\n              j = s.indexOf('\"', i);\n\n              if (j !== -1) {\n                handleWarning('attribute value quote missmatch');\n                skipAttr = true;\n              }\n            }\n\n          } else {\n            handleWarning('missing attribute value quotes');\n            skipAttr = true;\n\n            // skip to next space\n            for (j = j + 1; j < l; j++) {\n              w = s.charCodeAt(j + 1);\n\n              if (w === 32 || (w < 14 && w > 8)) { // WHITESPACE\n                break;\n              }\n            }\n\n          }\n\n          if (j === -1) {\n            handleWarning('missing closing quotes');\n\n            j = l;\n            skipAttr = true;\n          }\n\n          if (!skipAttr) {\n            value = s.substring(i, j);\n          }\n\n          i = j;\n\n          // ensure SPACE follows attribute\n          // skip illegal content otherwise\n          // example a=\"b\"c\n          for (; j + 1 < l; j++) {\n            w = s.charCodeAt(j + 1);\n\n            if (w === 32 || (w < 14 && w > 8)) { // WHITESPACE\n              break;\n            }\n\n            // FIRST ILLEGAL CHAR\n            if (i === j) {\n              handleWarning('illegal character after attribute end');\n              skipAttr = true;\n            }\n          }\n\n          // advance cursor to next attribute\n          i = j + 1;\n\n          if (skipAttr) {\n            continue parseAttr;\n          }\n\n          // check attribute re-declaration\n          if (name in seenAttrs) {\n            handleWarning('attribute <' + name + '> already defined');\n            continue;\n          }\n\n          seenAttrs[name] = true;\n\n          if (!isNamespace) {\n            attrs[name] = value;\n            continue;\n          }\n\n          // try to extract namespace information\n          if (maybeNS) {\n            newalias = (\n              name === 'xmlns'\n                ? 'xmlns'\n                : (name.charCodeAt(0) === 120 && name.substr(0, 6) === 'xmlns:')\n                  ? name.substr(6)\n                  : null\n            );\n\n            // handle xmlns(:alias) assignment\n            if (newalias !== null) {\n              nsUri = decodeEntities(value);\n              nsUriPrefix = uriPrefix(newalias);\n\n              alias = nsUriToPrefix[nsUri];\n\n              if (!alias) {\n\n                // no prefix defined or prefix collision\n                if (\n                  (newalias === 'xmlns') ||\n                  (nsUriPrefix in nsMatrix && nsMatrix[nsUriPrefix] !== nsUri)\n                ) {\n\n                  // alocate free ns prefix\n                  do {\n                    alias = 'ns' + (anonymousNsCount++);\n                  } while (typeof nsMatrix[alias] !== 'undefined');\n                } else {\n                  alias = newalias;\n                }\n\n                nsUriToPrefix[nsUri] = alias;\n              }\n\n              if (nsMatrix[newalias] !== alias) {\n                if (!hasNewMatrix) {\n                  nsMatrix = cloneNsMatrix(nsMatrix);\n                  hasNewMatrix = true;\n                }\n\n                nsMatrix[newalias] = alias;\n                if (newalias === 'xmlns') {\n                  nsMatrix[uriPrefix(alias)] = nsUri;\n                  defaultAlias = alias;\n                }\n\n                nsMatrix[nsUriPrefix] = nsUri;\n              }\n\n              // expose xmlns(:asd)=\"...\" in attributes\n              attrs[name] = value;\n              continue;\n            }\n\n            // collect attributes until all namespace\n            // declarations are processed\n            attrList.push(name, value);\n            continue;\n\n          } /** end if (maybeNs) */\n\n          // handle attributes on element without\n          // namespace declarations\n          w = name.indexOf(':');\n          if (w === -1) {\n            attrs[name] = value;\n            continue;\n          }\n\n          // normalize ns attribute name\n          if (!(nsName = nsMatrix[name.substring(0, w)])) {\n            handleWarning(missingNamespaceForPrefix(name.substring(0, w)));\n            continue;\n          }\n\n          name = defaultAlias === nsName\n            ? name.substr(w + 1)\n            : nsName + name.substr(w);\n\n          // end: normalize ns attribute name\n\n          // normalize xsi:type ns attribute value\n          if (name === XSI_TYPE$1) {\n            w = value.indexOf(':');\n\n            if (w !== -1) {\n              nsName = value.substring(0, w);\n\n              // handle default prefixes, i.e. xs:String gracefully\n              nsName = nsMatrix[nsName] || nsName;\n              value = nsName + value.substring(w);\n            } else {\n              value = defaultAlias + ':' + value;\n            }\n          }\n\n          // end: normalize xsi:type ns attribute value\n\n          attrs[name] = value;\n        }\n\n\n        // handle deferred, possibly namespaced attributes\n        if (maybeNS) {\n\n          // normalize captured attributes\n          for (i = 0, l = attrList.length; i < l; i++) {\n\n            name = attrList[i++];\n            value = attrList[i];\n\n            w = name.indexOf(':');\n\n            if (w !== -1) {\n\n              // normalize ns attribute name\n              if (!(nsName = nsMatrix[name.substring(0, w)])) {\n                handleWarning(missingNamespaceForPrefix(name.substring(0, w)));\n                continue;\n              }\n\n              name = defaultAlias === nsName\n                ? name.substr(w + 1)\n                : nsName + name.substr(w);\n\n              // end: normalize ns attribute name\n\n              // normalize xsi:type ns attribute value\n              if (name === XSI_TYPE$1) {\n                w = value.indexOf(':');\n\n                if (w !== -1) {\n                  nsName = value.substring(0, w);\n\n                  // handle default prefixes, i.e. xs:String gracefully\n                  nsName = nsMatrix[nsName] || nsName;\n                  value = nsName + value.substring(w);\n                } else {\n                  value = defaultAlias + ':' + value;\n                }\n              }\n\n              // end: normalize xsi:type ns attribute value\n            }\n\n            attrs[name] = value;\n          }\n\n          // end: normalize captured attributes\n        }\n\n        return cachedAttrs = attrs;\n      }\n\n      /**\n       * Extract the parse context { line, column, part }\n       * from the current parser position.\n       *\n       * @return {Object} parse context\n       */\n      function getParseContext() {\n        var splitsRe = /(\\r\\n|\\r|\\n)/g;\n\n        var line = 0;\n        var column = 0;\n        var startOfLine = 0;\n        var endOfLine = j;\n        var match;\n        var data;\n\n        while (i >= startOfLine) {\n\n          match = splitsRe.exec(xml);\n\n          if (!match) {\n            break;\n          }\n\n          // end of line = (break idx + break chars)\n          endOfLine = match[0].length + match.index;\n\n          if (endOfLine > i) {\n            break;\n          }\n\n          // advance to next line\n          line += 1;\n\n          startOfLine = endOfLine;\n        }\n\n        // EOF errors\n        if (i == -1) {\n          column = endOfLine;\n          data = xml.substring(j);\n        } else\n\n        // start errors\n        if (j === 0) {\n          data = xml.substring(j, i);\n        }\n\n        // other errors\n        else {\n          column = i - startOfLine;\n          data = (j == -1 ? xml.substring(i) : xml.substring(i, j + 1));\n        }\n\n        return {\n          'data': data,\n          'line': line,\n          'column': column\n        };\n      }\n\n      getContext = getParseContext;\n\n\n      if (proxy) {\n        elementProxy = Object.create({}, {\n          'name': getter(function() {\n            return elementName;\n          }),\n          'originalName': getter(function() {\n            return _elementName;\n          }),\n          'attrs': getter(getAttrs),\n          'ns': getter(function() {\n            return nsMatrix;\n          })\n        });\n      }\n\n      // actual parse logic\n      while (j !== -1) {\n\n        if (xml.charCodeAt(j) === 60) { // \"<\"\n          i = j;\n        } else {\n          i = xml.indexOf('<', j);\n        }\n\n        // parse end\n        if (i === -1) {\n          if (nodeStack.length) {\n            return handleError('unexpected end of file');\n          }\n\n          if (j === 0) {\n            return handleError('missing start tag');\n          }\n\n          if (j < xml.length) {\n            if (xml.substring(j).trim()) {\n              handleWarning(NON_WHITESPACE_OUTSIDE_ROOT_NODE);\n            }\n          }\n\n          return;\n        }\n\n        // parse text\n        if (j !== i) {\n\n          if (nodeStack.length) {\n            if (onText) {\n              onText(xml.substring(j, i), decodeEntities, getContext);\n\n              if (parseStop) {\n                return;\n              }\n            }\n          } else {\n            if (xml.substring(j, i).trim()) {\n              handleWarning(NON_WHITESPACE_OUTSIDE_ROOT_NODE);\n\n              if (parseStop) {\n                return;\n              }\n            }\n          }\n        }\n\n        w = xml.charCodeAt(i+1);\n\n        // parse comments + CDATA\n        if (w === 33) { // \"!\"\n          q = xml.charCodeAt(i+2);\n\n          // CDATA section\n          if (q === 91 && xml.substr(i + 3, 6) === 'CDATA[') { // 91 == \"[\"\n            j = xml.indexOf(']]>', i);\n            if (j === -1) {\n              return handleError('unclosed cdata');\n            }\n\n            if (onCDATA) {\n              onCDATA(xml.substring(i + 9, j), getContext);\n              if (parseStop) {\n                return;\n              }\n            }\n\n            j += 3;\n            continue;\n          }\n\n          // comment\n          if (q === 45 && xml.charCodeAt(i + 3) === 45) { // 45 == \"-\"\n            j = xml.indexOf('-->', i);\n            if (j === -1) {\n              return handleError('unclosed comment');\n            }\n\n\n            if (onComment) {\n              onComment(xml.substring(i + 4, j), decodeEntities, getContext);\n              if (parseStop) {\n                return;\n              }\n            }\n\n            j += 3;\n            continue;\n          }\n        }\n\n        // parse question <? ... ?>\n        if (w === 63) { // \"?\"\n          j = xml.indexOf('?>', i);\n          if (j === -1) {\n            return handleError('unclosed question');\n          }\n\n          if (onQuestion) {\n            onQuestion(xml.substring(i, j + 2), getContext);\n            if (parseStop) {\n              return;\n            }\n          }\n\n          j += 2;\n          continue;\n        }\n\n        // find matching closing tag for attention or standard tags\n        // for that we must skip through attribute values\n        // (enclosed in single or double quotes)\n        for (x = i + 1; ; x++) {\n          v = xml.charCodeAt(x);\n          if (isNaN(v)) {\n            j = -1;\n            return handleError('unclosed tag');\n          }\n\n          // [10] AttValue ::= '\"' ([^<&\"] | Reference)* '\"' | \"'\" ([^<&'] | Reference)* \"'\"\n          // skips the quoted string\n          // (double quotes) does not appear in a literal enclosed by (double quotes)\n          // (single quote) does not appear in a literal enclosed by (single quote)\n          if (v === 34) { //  '\"'\n            q = xml.indexOf('\"', x + 1);\n            x = q !== -1 ? q : x;\n          } else if (v === 39) { // \"'\"\n            q = xml.indexOf(\"'\", x + 1);\n            x = q !== -1 ? q : x;\n          } else if (v === 62) { // '>'\n            j = x;\n            break;\n          }\n        }\n\n\n        // parse attention <! ...>\n        // previously comment and CDATA have already been parsed\n        if (w === 33) { // \"!\"\n\n          if (onAttention) {\n            onAttention(xml.substring(i, j + 1), decodeEntities, getContext);\n            if (parseStop) {\n              return;\n            }\n          }\n\n          j += 1;\n          continue;\n        }\n\n        // don't process attributes;\n        // there are none\n        cachedAttrs = {};\n\n        // if (xml.charCodeAt(i+1) === 47) { // </...\n        if (w === 47) { // </...\n          tagStart = false;\n          tagEnd = true;\n\n          if (!nodeStack.length) {\n            return handleError('missing open tag');\n          }\n\n          // verify open <-> close tag match\n          x = elementName = nodeStack.pop();\n          q = i + 2 + x.length;\n\n          if (xml.substring(i + 2, q) !== x) {\n            return handleError('closing tag mismatch');\n          }\n\n          // verify chars in close tag\n          for (; q < j; q++) {\n            w = xml.charCodeAt(q);\n\n            if (w === 32 || (w > 8 && w < 14)) { // \\f\\n\\r\\t\\v space\n              continue;\n            }\n\n            return handleError('close tag');\n          }\n\n        } else {\n          if (xml.charCodeAt(j - 1) === 47) { // .../>\n            x = elementName = xml.substring(i + 1, j - 1);\n\n            tagStart = true;\n            tagEnd = true;\n\n          } else {\n            x = elementName = xml.substring(i + 1, j);\n\n            tagStart = true;\n            tagEnd = false;\n          }\n\n          if (!(w > 96 && w < 123 || w > 64 && w < 91 || w === 95 || w === 58)) { // char 95\"_\" 58\":\"\n            return handleError('illegal first char nodeName');\n          }\n\n          for (q = 1, y = x.length; q < y; q++) {\n            w = x.charCodeAt(q);\n\n            if (w > 96 && w < 123 || w > 64 && w < 91 || w > 47 && w < 59 || w === 45 || w === 95 || w == 46) {\n              continue;\n            }\n\n            if (w === 32 || (w < 14 && w > 8)) { // \\f\\n\\r\\t\\v space\n              elementName = x.substring(0, q);\n\n              // maybe there are attributes\n              cachedAttrs = null;\n              break;\n            }\n\n            return handleError('invalid nodeName');\n          }\n\n          if (!tagEnd) {\n            nodeStack.push(elementName);\n          }\n        }\n\n        if (isNamespace) {\n\n          _nsMatrix = nsMatrix;\n\n          if (tagStart) {\n\n            // remember old namespace\n            // unless we're self-closing\n            if (!tagEnd) {\n              nsMatrixStack.push(_nsMatrix);\n            }\n\n            if (cachedAttrs === null) {\n\n              // quick check, whether there may be namespace\n              // declarations on the node; if that is the case\n              // we need to eagerly parse the node attributes\n              if ((maybeNS = x.indexOf('xmlns', q) !== -1)) {\n                attrsStart = q;\n                attrsString = x;\n\n                getAttrs();\n\n                maybeNS = false;\n              }\n            }\n          }\n\n          _elementName = elementName;\n\n          w = elementName.indexOf(':');\n          if (w !== -1) {\n            xmlns = nsMatrix[elementName.substring(0, w)];\n\n            // prefix given; namespace must exist\n            if (!xmlns) {\n              return handleError('missing namespace on <' + _elementName + '>');\n            }\n\n            elementName = elementName.substr(w + 1);\n          } else {\n            xmlns = nsMatrix['xmlns'];\n\n            // if no default namespace is defined,\n            // we'll import the element as anonymous.\n            //\n            // it is up to users to correct that to the document defined\n            // targetNamespace, or whatever their undersanding of the\n            // XML spec mandates.\n          }\n\n          // adjust namespace prefixs as configured\n          if (xmlns) {\n            elementName = xmlns + ':' + elementName;\n          }\n\n        }\n\n        if (tagStart) {\n          attrsStart = q;\n          attrsString = x;\n\n          if (onOpenTag) {\n            if (proxy) {\n              onOpenTag(elementProxy, decodeEntities, tagEnd, getContext);\n            } else {\n              onOpenTag(elementName, getAttrs, decodeEntities, tagEnd, getContext);\n            }\n\n            if (parseStop) {\n              return;\n            }\n          }\n\n        }\n\n        if (tagEnd) {\n\n          if (onCloseTag) {\n            onCloseTag(proxy ? elementProxy : elementName, decodeEntities, tagStart, getContext);\n\n            if (parseStop) {\n              return;\n            }\n          }\n\n          // restore old namespace\n          if (isNamespace) {\n            if (!tagStart) {\n              nsMatrix = nsMatrixStack.pop();\n            } else {\n              nsMatrix = _nsMatrix;\n            }\n          }\n        }\n\n        j += 1;\n      }\n    } /** end parse */\n\n  }\n\n  function hasLowerCaseAlias(pkg) {\n    return pkg.xml && pkg.xml.tagAlias === 'lowerCase';\n  }\n\n  var DEFAULT_NS_MAP = {\n    'xsi': 'http://www.w3.org/2001/XMLSchema-instance',\n    'xml': 'http://www.w3.org/XML/1998/namespace'\n  };\n\n  var XSI_TYPE = 'xsi:type';\n\n  function serializeFormat(element) {\n    return element.xml && element.xml.serialize;\n  }\n\n  function serializeAsType(element) {\n    return serializeFormat(element) === XSI_TYPE;\n  }\n\n  function serializeAsProperty(element) {\n    return serializeFormat(element) === 'property';\n  }\n\n  function capitalize(str) {\n    return str.charAt(0).toUpperCase() + str.slice(1);\n  }\n\n  function aliasToName(aliasNs, pkg) {\n\n    if (!hasLowerCaseAlias(pkg)) {\n      return aliasNs.name;\n    }\n\n    return aliasNs.prefix + ':' + capitalize(aliasNs.localName);\n  }\n\n  function prefixedToName(nameNs, pkg) {\n\n    var name = nameNs.name,\n        localName = nameNs.localName;\n\n    var typePrefix = pkg.xml && pkg.xml.typePrefix;\n\n    if (typePrefix && localName.indexOf(typePrefix) === 0) {\n      return nameNs.prefix + ':' + localName.slice(typePrefix.length);\n    } else {\n      return name;\n    }\n  }\n\n  function normalizeXsiTypeName(name, model) {\n\n    var nameNs = parseName(name);\n    var pkg = model.getPackage(nameNs.prefix);\n\n    return prefixedToName(nameNs, pkg);\n  }\n\n  function error$1(message) {\n    return new Error(message);\n  }\n\n  /**\n   * Get the moddle descriptor for a given instance or type.\n   *\n   * @param  {ModdleElement|Function} element\n   *\n   * @return {Object} the moddle descriptor\n   */\n  function getModdleDescriptor(element) {\n    return element.$descriptor;\n  }\n\n\n  /**\n   * A parse context.\n   *\n   * @class\n   *\n   * @param {Object} options\n   * @param {ElementHandler} options.rootHandler the root handler for parsing a document\n   * @param {boolean} [options.lax=false] whether or not to ignore invalid elements\n   */\n  function Context(options) {\n\n    /**\n     * @property {ElementHandler} rootHandler\n     */\n\n    /**\n     * @property {Boolean} lax\n     */\n\n    assign$1(this, options);\n\n    this.elementsById = {};\n    this.references = [];\n    this.warnings = [];\n\n    /**\n     * Add an unresolved reference.\n     *\n     * @param {Object} reference\n     */\n    this.addReference = function(reference) {\n      this.references.push(reference);\n    };\n\n    /**\n     * Add a processed element.\n     *\n     * @param {ModdleElement} element\n     */\n    this.addElement = function(element) {\n\n      if (!element) {\n        throw error$1('expected element');\n      }\n\n      var elementsById = this.elementsById;\n\n      var descriptor = getModdleDescriptor(element);\n\n      var idProperty = descriptor.idProperty,\n          id;\n\n      if (idProperty) {\n        id = element.get(idProperty.name);\n\n        if (id) {\n\n          // for QName validation as per http://www.w3.org/TR/REC-xml/#NT-NameChar\n          //if (!/^([a-z][\\w-.]*:)?[a-z_][\\w-.]*$/i.test(id)) {\n          //  throw new Error('illegal ID <' + id + '>');\n          //}\n\n          if (elementsById[id]) {\n            throw error$1('duplicate ID <' + id + '>');\n          }\n\n          elementsById[id] = element;\n        }\n      }\n    };\n\n    /**\n     * Add an import warning.\n     *\n     * @param {Object} warning\n     * @param {String} warning.message\n     * @param {Error} [warning.error]\n     */\n    this.addWarning = function(warning) {\n      this.warnings.push(warning);\n    };\n  }\n\n  function BaseHandler() {}\n\n  BaseHandler.prototype.handleEnd = function() {};\n  BaseHandler.prototype.handleText = function() {};\n  BaseHandler.prototype.handleNode = function() {};\n\n\n  /**\n   * A simple pass through handler that does nothing except for\n   * ignoring all input it receives.\n   *\n   * This is used to ignore unknown elements and\n   * attributes.\n   */\n  function NoopHandler() { }\n\n  NoopHandler.prototype = Object.create(BaseHandler.prototype);\n\n  NoopHandler.prototype.handleNode = function() {\n    return this;\n  };\n\n  function BodyHandler() {}\n\n  BodyHandler.prototype = Object.create(BaseHandler.prototype);\n\n  BodyHandler.prototype.handleText = function(text) {\n    this.body = (this.body || '') + text;\n  };\n\n  function ReferenceHandler(property, context) {\n    this.property = property;\n    this.context = context;\n  }\n\n  ReferenceHandler.prototype = Object.create(BodyHandler.prototype);\n\n  ReferenceHandler.prototype.handleNode = function(node) {\n\n    if (this.element) {\n      throw error$1('expected no sub nodes');\n    } else {\n      this.element = this.createReference(node);\n    }\n\n    return this;\n  };\n\n  ReferenceHandler.prototype.handleEnd = function() {\n    this.element.id = this.body;\n  };\n\n  ReferenceHandler.prototype.createReference = function(node) {\n    return {\n      property: this.property.ns.name,\n      id: ''\n    };\n  };\n\n  function ValueHandler(propertyDesc, element) {\n    this.element = element;\n    this.propertyDesc = propertyDesc;\n  }\n\n  ValueHandler.prototype = Object.create(BodyHandler.prototype);\n\n  ValueHandler.prototype.handleEnd = function() {\n\n    var value = this.body || '',\n        element = this.element,\n        propertyDesc = this.propertyDesc;\n\n    value = coerceType(propertyDesc.type, value);\n\n    if (propertyDesc.isMany) {\n      element.get(propertyDesc.name).push(value);\n    } else {\n      element.set(propertyDesc.name, value);\n    }\n  };\n\n\n  function BaseElementHandler() {}\n\n  BaseElementHandler.prototype = Object.create(BodyHandler.prototype);\n\n  BaseElementHandler.prototype.handleNode = function(node) {\n    var parser = this,\n        element = this.element;\n\n    if (!element) {\n      element = this.element = this.createElement(node);\n\n      this.context.addElement(element);\n    } else {\n      parser = this.handleChild(node);\n    }\n\n    return parser;\n  };\n\n  /**\n   * @class Reader.ElementHandler\n   *\n   */\n  function ElementHandler(model, typeName, context) {\n    this.model = model;\n    this.type = model.getType(typeName);\n    this.context = context;\n  }\n\n  ElementHandler.prototype = Object.create(BaseElementHandler.prototype);\n\n  ElementHandler.prototype.addReference = function(reference) {\n    this.context.addReference(reference);\n  };\n\n  ElementHandler.prototype.handleText = function(text) {\n\n    var element = this.element,\n        descriptor = getModdleDescriptor(element),\n        bodyProperty = descriptor.bodyProperty;\n\n    if (!bodyProperty) {\n      throw error$1('unexpected body text <' + text + '>');\n    }\n\n    BodyHandler.prototype.handleText.call(this, text);\n  };\n\n  ElementHandler.prototype.handleEnd = function() {\n\n    var value = this.body,\n        element = this.element,\n        descriptor = getModdleDescriptor(element),\n        bodyProperty = descriptor.bodyProperty;\n\n    if (bodyProperty && value !== undefined) {\n      value = coerceType(bodyProperty.type, value);\n      element.set(bodyProperty.name, value);\n    }\n  };\n\n  /**\n   * Create an instance of the model from the given node.\n   *\n   * @param  {Element} node the xml node\n   */\n  ElementHandler.prototype.createElement = function(node) {\n    var attributes = node.attributes,\n        Type = this.type,\n        descriptor = getModdleDescriptor(Type),\n        context = this.context,\n        instance = new Type({}),\n        model = this.model,\n        propNameNs;\n\n    forEach$1(attributes, function(value, name) {\n\n      var prop = descriptor.propertiesByName[name],\n          values;\n\n      if (prop && prop.isReference) {\n\n        if (!prop.isMany) {\n          context.addReference({\n            element: instance,\n            property: prop.ns.name,\n            id: value\n          });\n        } else {\n\n          // IDREFS: parse references as whitespace-separated list\n          values = value.split(' ');\n\n          forEach$1(values, function(v) {\n            context.addReference({\n              element: instance,\n              property: prop.ns.name,\n              id: v\n            });\n          });\n        }\n\n      } else {\n        if (prop) {\n          value = coerceType(prop.type, value);\n        } else\n        if (name !== 'xmlns') {\n          propNameNs = parseName(name, descriptor.ns.prefix);\n\n          // check whether attribute is defined in a well-known namespace\n          // if that is the case we emit a warning to indicate potential misuse\n          if (model.getPackage(propNameNs.prefix)) {\n\n            context.addWarning({\n              message: 'unknown attribute <' + name + '>',\n              element: instance,\n              property: name,\n              value: value\n            });\n          }\n        }\n\n        instance.set(name, value);\n      }\n    });\n\n    return instance;\n  };\n\n  ElementHandler.prototype.getPropertyForNode = function(node) {\n\n    var name = node.name;\n    var nameNs = parseName(name);\n\n    var type = this.type,\n        model = this.model,\n        descriptor = getModdleDescriptor(type);\n\n    var propertyName = nameNs.name,\n        property = descriptor.propertiesByName[propertyName],\n        elementTypeName,\n        elementType;\n\n    // search for properties by name first\n\n    if (property && !property.isAttr) {\n\n      if (serializeAsType(property)) {\n        elementTypeName = node.attributes[XSI_TYPE];\n\n        // xsi type is optional, if it does not exists the\n        // default type is assumed\n        if (elementTypeName) {\n\n          // take possible type prefixes from XML\n          // into account, i.e.: xsi:type=\"t{ActualType}\"\n          elementTypeName = normalizeXsiTypeName(elementTypeName, model);\n\n          elementType = model.getType(elementTypeName);\n\n          return assign$1({}, property, {\n            effectiveType: getModdleDescriptor(elementType).name\n          });\n        }\n      }\n\n      // search for properties by name first\n      return property;\n    }\n\n    var pkg = model.getPackage(nameNs.prefix);\n\n    if (pkg) {\n      elementTypeName = aliasToName(nameNs, pkg);\n      elementType = model.getType(elementTypeName);\n\n      // search for collection members later\n      property = find(descriptor.properties, function(p) {\n        return !p.isVirtual && !p.isReference && !p.isAttribute && elementType.hasType(p.type);\n      });\n\n      if (property) {\n        return assign$1({}, property, {\n          effectiveType: getModdleDescriptor(elementType).name\n        });\n      }\n    } else {\n\n      // parse unknown element (maybe extension)\n      property = find(descriptor.properties, function(p) {\n        return !p.isReference && !p.isAttribute && p.type === 'Element';\n      });\n\n      if (property) {\n        return property;\n      }\n    }\n\n    throw error$1('unrecognized element <' + nameNs.name + '>');\n  };\n\n  ElementHandler.prototype.toString = function() {\n    return 'ElementDescriptor[' + getModdleDescriptor(this.type).name + ']';\n  };\n\n  ElementHandler.prototype.valueHandler = function(propertyDesc, element) {\n    return new ValueHandler(propertyDesc, element);\n  };\n\n  ElementHandler.prototype.referenceHandler = function(propertyDesc) {\n    return new ReferenceHandler(propertyDesc, this.context);\n  };\n\n  ElementHandler.prototype.handler = function(type) {\n    if (type === 'Element') {\n      return new GenericElementHandler(this.model, type, this.context);\n    } else {\n      return new ElementHandler(this.model, type, this.context);\n    }\n  };\n\n  /**\n   * Handle the child element parsing\n   *\n   * @param  {Element} node the xml node\n   */\n  ElementHandler.prototype.handleChild = function(node) {\n    var propertyDesc, type, element, childHandler;\n\n    propertyDesc = this.getPropertyForNode(node);\n    element = this.element;\n\n    type = propertyDesc.effectiveType || propertyDesc.type;\n\n    if (isSimple(type)) {\n      return this.valueHandler(propertyDesc, element);\n    }\n\n    if (propertyDesc.isReference) {\n      childHandler = this.referenceHandler(propertyDesc).handleNode(node);\n    } else {\n      childHandler = this.handler(type).handleNode(node);\n    }\n\n    var newElement = childHandler.element;\n\n    // child handles may decide to skip elements\n    // by not returning anything\n    if (newElement !== undefined) {\n\n      if (propertyDesc.isMany) {\n        element.get(propertyDesc.name).push(newElement);\n      } else {\n        element.set(propertyDesc.name, newElement);\n      }\n\n      if (propertyDesc.isReference) {\n        assign$1(newElement, {\n          element: element\n        });\n\n        this.context.addReference(newElement);\n      } else {\n\n        // establish child -> parent relationship\n        newElement.$parent = element;\n      }\n    }\n\n    return childHandler;\n  };\n\n  /**\n   * An element handler that performs special validation\n   * to ensure the node it gets initialized with matches\n   * the handlers type (namespace wise).\n   *\n   * @param {Moddle} model\n   * @param {String} typeName\n   * @param {Context} context\n   */\n  function RootElementHandler(model, typeName, context) {\n    ElementHandler.call(this, model, typeName, context);\n  }\n\n  RootElementHandler.prototype = Object.create(ElementHandler.prototype);\n\n  RootElementHandler.prototype.createElement = function(node) {\n\n    var name = node.name,\n        nameNs = parseName(name),\n        model = this.model,\n        type = this.type,\n        pkg = model.getPackage(nameNs.prefix),\n        typeName = pkg && aliasToName(nameNs, pkg) || name;\n\n    // verify the correct namespace if we parse\n    // the first element in the handler tree\n    //\n    // this ensures we don't mistakenly import wrong namespace elements\n    if (!type.hasType(typeName)) {\n      throw error$1('unexpected element <' + node.originalName + '>');\n    }\n\n    return ElementHandler.prototype.createElement.call(this, node);\n  };\n\n\n  function GenericElementHandler(model, typeName, context) {\n    this.model = model;\n    this.context = context;\n  }\n\n  GenericElementHandler.prototype = Object.create(BaseElementHandler.prototype);\n\n  GenericElementHandler.prototype.createElement = function(node) {\n\n    var name = node.name,\n        ns = parseName(name),\n        prefix = ns.prefix,\n        uri = node.ns[prefix + '$uri'],\n        attributes = node.attributes;\n\n    return this.model.createAny(name, uri, attributes);\n  };\n\n  GenericElementHandler.prototype.handleChild = function(node) {\n\n    var handler = new GenericElementHandler(this.model, 'Element', this.context).handleNode(node),\n        element = this.element;\n\n    var newElement = handler.element,\n        children;\n\n    if (newElement !== undefined) {\n      children = element.$children = element.$children || [];\n      children.push(newElement);\n\n      // establish child -> parent relationship\n      newElement.$parent = element;\n    }\n\n    return handler;\n  };\n\n  GenericElementHandler.prototype.handleEnd = function() {\n    if (this.body) {\n      this.element.$body = this.body;\n    }\n  };\n\n  /**\n   * A reader for a meta-model\n   *\n   * @param {Object} options\n   * @param {Model} options.model used to read xml files\n   * @param {Boolean} options.lax whether to make parse errors warnings\n   */\n  function Reader(options) {\n\n    if (options instanceof Moddle) {\n      options = {\n        model: options\n      };\n    }\n\n    assign$1(this, { lax: false }, options);\n  }\n\n  /**\n   * The fromXML result.\n   *\n   * @typedef {Object} ParseResult\n   *\n   * @property {ModdleElement} rootElement\n   * @property {Array<Object>} references\n   * @property {Array<Error>} warnings\n   * @property {Object} elementsById - a mapping containing each ID -> ModdleElement\n   */\n\n  /**\n   * The fromXML result.\n   *\n   * @typedef {Error} ParseError\n   *\n   * @property {Array<Error>} warnings\n   */\n\n  /**\n   * Parse the given XML into a moddle document tree.\n   *\n   * @param {String} xml\n   * @param {ElementHandler|Object} options or rootHandler\n   *\n   * @returns {Promise<ParseResult, ParseError>}\n   */\n  Reader.prototype.fromXML = function(xml, options, done) {\n\n    var rootHandler = options.rootHandler;\n\n    if (options instanceof ElementHandler) {\n\n      // root handler passed via (xml, { rootHandler: ElementHandler }, ...)\n      rootHandler = options;\n      options = {};\n    } else {\n      if (typeof options === 'string') {\n\n        // rootHandler passed via (xml, 'someString', ...)\n        rootHandler = this.handler(options);\n        options = {};\n      } else if (typeof rootHandler === 'string') {\n\n        // rootHandler passed via (xml, { rootHandler: 'someString' }, ...)\n        rootHandler = this.handler(rootHandler);\n      }\n    }\n\n    var model = this.model,\n        lax = this.lax;\n\n    var context = new Context(assign$1({}, options, { rootHandler: rootHandler })),\n        parser = new Parser({ proxy: true }),\n        stack = createStack();\n\n    rootHandler.context = context;\n\n    // push root handler\n    stack.push(rootHandler);\n\n\n    /**\n     * Handle error.\n     *\n     * @param  {Error} err\n     * @param  {Function} getContext\n     * @param  {boolean} lax\n     *\n     * @return {boolean} true if handled\n     */\n    function handleError(err, getContext, lax) {\n\n      var ctx = getContext();\n\n      var line = ctx.line,\n          column = ctx.column,\n          data = ctx.data;\n\n      // we receive the full context data here,\n      // for elements trim down the information\n      // to the tag name, only\n      if (data.charAt(0) === '<' && data.indexOf(' ') !== -1) {\n        data = data.slice(0, data.indexOf(' ')) + '>';\n      }\n\n      var message =\n        'unparsable content ' + (data ? data + ' ' : '') + 'detected\\n\\t' +\n          'line: ' + line + '\\n\\t' +\n          'column: ' + column + '\\n\\t' +\n          'nested error: ' + err.message;\n\n      if (lax) {\n        context.addWarning({\n          message: message,\n          error: err\n        });\n\n        return true;\n      } else {\n        throw error$1(message);\n      }\n    }\n\n    function handleWarning(err, getContext) {\n\n      // just like handling errors in <lax=true> mode\n      return handleError(err, getContext, true);\n    }\n\n    /**\n     * Resolve collected references on parse end.\n     */\n    function resolveReferences() {\n\n      var elementsById = context.elementsById;\n      var references = context.references;\n\n      var i, r;\n\n      for (i = 0; (r = references[i]); i++) {\n        var element = r.element;\n        var reference = elementsById[r.id];\n        var property = getModdleDescriptor(element).propertiesByName[r.property];\n\n        if (!reference) {\n          context.addWarning({\n            message: 'unresolved reference <' + r.id + '>',\n            element: r.element,\n            property: r.property,\n            value: r.id\n          });\n        }\n\n        if (property.isMany) {\n          var collection = element.get(property.name),\n              idx = collection.indexOf(r);\n\n          // we replace an existing place holder (idx != -1) or\n          // append to the collection instead\n          if (idx === -1) {\n            idx = collection.length;\n          }\n\n          if (!reference) {\n\n            // remove unresolvable reference\n            collection.splice(idx, 1);\n          } else {\n\n            // add or update reference in collection\n            collection[idx] = reference;\n          }\n        } else {\n          element.set(property.name, reference);\n        }\n      }\n    }\n\n    function handleClose() {\n      stack.pop().handleEnd();\n    }\n\n    var PREAMBLE_START_PATTERN = /^<\\?xml /i;\n\n    var ENCODING_PATTERN = / encoding=\"([^\"]+)\"/i;\n\n    var UTF_8_PATTERN = /^utf-8$/i;\n\n    function handleQuestion(question) {\n\n      if (!PREAMBLE_START_PATTERN.test(question)) {\n        return;\n      }\n\n      var match = ENCODING_PATTERN.exec(question);\n      var encoding = match && match[1];\n\n      if (!encoding || UTF_8_PATTERN.test(encoding)) {\n        return;\n      }\n\n      context.addWarning({\n        message:\n          'unsupported document encoding <' + encoding + '>, ' +\n          'falling back to UTF-8'\n      });\n    }\n\n    function handleOpen(node, getContext) {\n      var handler = stack.peek();\n\n      try {\n        stack.push(handler.handleNode(node));\n      } catch (err) {\n\n        if (handleError(err, getContext, lax)) {\n          stack.push(new NoopHandler());\n        }\n      }\n    }\n\n    function handleCData(text, getContext) {\n\n      try {\n        stack.peek().handleText(text);\n      } catch (err) {\n        handleWarning(err, getContext);\n      }\n    }\n\n    function handleText(text, getContext) {\n\n      // strip whitespace only nodes, i.e. before\n      // <!CDATA[ ... ]> sections and in between tags\n\n      if (!text.trim()) {\n        return;\n      }\n\n      handleCData(text, getContext);\n    }\n\n    var uriMap = model.getPackages().reduce(function(uriMap, p) {\n      uriMap[p.uri] = p.prefix;\n\n      return uriMap;\n    }, {\n      'http://www.w3.org/XML/1998/namespace': 'xml' // add default xml ns\n    });\n    parser\n      .ns(uriMap)\n      .on('openTag', function(obj, decodeStr, selfClosing, getContext) {\n\n        // gracefully handle unparsable attributes (attrs=false)\n        var attrs = obj.attrs || {};\n\n        var decodedAttrs = Object.keys(attrs).reduce(function(d, key) {\n          var value = decodeStr(attrs[key]);\n\n          d[key] = value;\n\n          return d;\n        }, {});\n\n        var node = {\n          name: obj.name,\n          originalName: obj.originalName,\n          attributes: decodedAttrs,\n          ns: obj.ns\n        };\n\n        handleOpen(node, getContext);\n      })\n      .on('question', handleQuestion)\n      .on('closeTag', handleClose)\n      .on('cdata', handleCData)\n      .on('text', function(text, decodeEntities, getContext) {\n        handleText(decodeEntities(text), getContext);\n      })\n      .on('error', handleError)\n      .on('warn', handleWarning);\n\n    // async XML parsing to make sure the execution environment\n    // (node or brower) is kept responsive and that certain optimization\n    // strategies can kick in.\n    return new Promise(function(resolve, reject) {\n\n      var err;\n\n      try {\n        parser.parse(xml);\n\n        resolveReferences();\n      } catch (e) {\n        err = e;\n      }\n\n      var rootElement = rootHandler.element;\n\n      if (!err && !rootElement) {\n        err = error$1('failed to parse document as <' + rootHandler.type.$descriptor.name + '>');\n      }\n\n      var warnings = context.warnings;\n      var references = context.references;\n      var elementsById = context.elementsById;\n\n      if (err) {\n        err.warnings = warnings;\n\n        return reject(err);\n      } else {\n        return resolve({\n          rootElement: rootElement,\n          elementsById: elementsById,\n          references: references,\n          warnings: warnings\n        });\n      }\n    });\n  };\n\n  Reader.prototype.handler = function(name) {\n    return new RootElementHandler(this.model, name);\n  };\n\n\n  // helpers //////////////////////////\n\n  function createStack() {\n    var stack = [];\n\n    Object.defineProperty(stack, 'peek', {\n      value: function() {\n        return this[this.length - 1];\n      }\n    });\n\n    return stack;\n  }\n\n  var XML_PREAMBLE = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n';\n\n  var ESCAPE_ATTR_CHARS = /<|>|'|\"|&|\\n\\r|\\n/g;\n  var ESCAPE_CHARS = /<|>|&/g;\n\n\n  function Namespaces(parent) {\n\n    var prefixMap = {};\n    var uriMap = {};\n    var used = {};\n\n    var wellknown = [];\n    var custom = [];\n\n    // API\n\n    this.byUri = function(uri) {\n      return uriMap[uri] || (\n        parent && parent.byUri(uri)\n      );\n    };\n\n    this.add = function(ns, isWellknown) {\n\n      uriMap[ns.uri] = ns;\n\n      if (isWellknown) {\n        wellknown.push(ns);\n      } else {\n        custom.push(ns);\n      }\n\n      this.mapPrefix(ns.prefix, ns.uri);\n    };\n\n    this.uriByPrefix = function(prefix) {\n      return prefixMap[prefix || 'xmlns'];\n    };\n\n    this.mapPrefix = function(prefix, uri) {\n      prefixMap[prefix || 'xmlns'] = uri;\n    };\n\n    this.getNSKey = function(ns) {\n      return (ns.prefix !== undefined) ? (ns.uri + '|' + ns.prefix) : ns.uri;\n    };\n\n    this.logUsed = function(ns) {\n\n      var uri = ns.uri;\n      var nsKey = this.getNSKey(ns);\n\n      used[nsKey] = this.byUri(uri);\n\n      // Inform parent recursively about the usage of this NS\n      if (parent) {\n        parent.logUsed(ns);\n      }\n    };\n\n    this.getUsed = function(ns) {\n\n      function isUsed(ns) {\n        var nsKey = self.getNSKey(ns);\n\n        return used[nsKey];\n      }\n\n      var self = this;\n\n      var allNs = [].concat(wellknown, custom);\n\n      return allNs.filter(isUsed);\n    };\n\n  }\n\n  function lower(string) {\n    return string.charAt(0).toLowerCase() + string.slice(1);\n  }\n\n  function nameToAlias(name, pkg) {\n    if (hasLowerCaseAlias(pkg)) {\n      return lower(name);\n    } else {\n      return name;\n    }\n  }\n\n  function inherits(ctor, superCtor) {\n    ctor.super_ = superCtor;\n    ctor.prototype = Object.create(superCtor.prototype, {\n      constructor: {\n        value: ctor,\n        enumerable: false,\n        writable: true,\n        configurable: true\n      }\n    });\n  }\n\n  function nsName(ns) {\n    if (isString(ns)) {\n      return ns;\n    } else {\n      return (ns.prefix ? ns.prefix + ':' : '') + ns.localName;\n    }\n  }\n\n  function getNsAttrs(namespaces) {\n\n    return namespaces.getUsed().filter(function(ns) {\n\n      // do not serialize built in <xml> namespace\n      return ns.prefix !== 'xml';\n    }).map(function(ns) {\n      var name = 'xmlns' + (ns.prefix ? ':' + ns.prefix : '');\n      return { name: name, value: ns.uri };\n    });\n\n  }\n\n  function getElementNs(ns, descriptor) {\n    if (descriptor.isGeneric) {\n      return assign$1({ localName: descriptor.ns.localName }, ns);\n    } else {\n      return assign$1({ localName: nameToAlias(descriptor.ns.localName, descriptor.$pkg) }, ns);\n    }\n  }\n\n  function getPropertyNs(ns, descriptor) {\n    return assign$1({ localName: descriptor.ns.localName }, ns);\n  }\n\n  function getSerializableProperties(element) {\n    var descriptor = element.$descriptor;\n\n    return filter(descriptor.properties, function(p) {\n      var name = p.name;\n\n      if (p.isVirtual) {\n        return false;\n      }\n\n      // do not serialize defaults\n      if (!has$1(element, name)) {\n        return false;\n      }\n\n      var value = element[name];\n\n      // do not serialize default equals\n      if (value === p.default) {\n        return false;\n      }\n\n      // do not serialize null properties\n      if (value === null) {\n        return false;\n      }\n\n      return p.isMany ? value.length : true;\n    });\n  }\n\n  var ESCAPE_ATTR_MAP = {\n    '\\n': '#10',\n    '\\n\\r': '#10',\n    '\"': '#34',\n    '\\'': '#39',\n    '<': '#60',\n    '>': '#62',\n    '&': '#38'\n  };\n\n  var ESCAPE_MAP = {\n    '<': 'lt',\n    '>': 'gt',\n    '&': 'amp'\n  };\n\n  function escape(str, charPattern, replaceMap) {\n\n    // ensure we are handling strings here\n    str = isString(str) ? str : '' + str;\n\n    return str.replace(charPattern, function(s) {\n      return '&' + replaceMap[s] + ';';\n    });\n  }\n\n  /**\n   * Escape a string attribute to not contain any bad values (line breaks, '\"', ...)\n   *\n   * @param {String} str the string to escape\n   * @return {String} the escaped string\n   */\n  function escapeAttr(str) {\n    return escape(str, ESCAPE_ATTR_CHARS, ESCAPE_ATTR_MAP);\n  }\n\n  function escapeBody(str) {\n    return escape(str, ESCAPE_CHARS, ESCAPE_MAP);\n  }\n\n  function filterAttributes(props) {\n    return filter(props, function(p) { return p.isAttr; });\n  }\n\n  function filterContained(props) {\n    return filter(props, function(p) { return !p.isAttr; });\n  }\n\n\n  function ReferenceSerializer(tagName) {\n    this.tagName = tagName;\n  }\n\n  ReferenceSerializer.prototype.build = function(element) {\n    this.element = element;\n    return this;\n  };\n\n  ReferenceSerializer.prototype.serializeTo = function(writer) {\n    writer\n      .appendIndent()\n      .append('<' + this.tagName + '>' + this.element.id + '</' + this.tagName + '>')\n      .appendNewLine();\n  };\n\n  function BodySerializer() {}\n\n  BodySerializer.prototype.serializeValue =\n  BodySerializer.prototype.serializeTo = function(writer) {\n    writer.append(\n      this.escape\n        ? escapeBody(this.value)\n        : this.value\n    );\n  };\n\n  BodySerializer.prototype.build = function(prop, value) {\n    this.value = value;\n\n    if (prop.type === 'String' && value.search(ESCAPE_CHARS) !== -1) {\n      this.escape = true;\n    }\n\n    return this;\n  };\n\n  function ValueSerializer(tagName) {\n    this.tagName = tagName;\n  }\n\n  inherits(ValueSerializer, BodySerializer);\n\n  ValueSerializer.prototype.serializeTo = function(writer) {\n\n    writer\n      .appendIndent()\n      .append('<' + this.tagName + '>');\n\n    this.serializeValue(writer);\n\n    writer\n      .append('</' + this.tagName + '>')\n      .appendNewLine();\n  };\n\n  function ElementSerializer(parent, propertyDescriptor) {\n    this.body = [];\n    this.attrs = [];\n\n    this.parent = parent;\n    this.propertyDescriptor = propertyDescriptor;\n  }\n\n  ElementSerializer.prototype.build = function(element) {\n    this.element = element;\n\n    var elementDescriptor = element.$descriptor,\n        propertyDescriptor = this.propertyDescriptor;\n\n    var otherAttrs,\n        properties;\n\n    var isGeneric = elementDescriptor.isGeneric;\n\n    if (isGeneric) {\n      otherAttrs = this.parseGeneric(element);\n    } else {\n      otherAttrs = this.parseNsAttributes(element);\n    }\n\n    if (propertyDescriptor) {\n      this.ns = this.nsPropertyTagName(propertyDescriptor);\n    } else {\n      this.ns = this.nsTagName(elementDescriptor);\n    }\n\n    // compute tag name\n    this.tagName = this.addTagName(this.ns);\n\n    if (!isGeneric) {\n      properties = getSerializableProperties(element);\n\n      this.parseAttributes(filterAttributes(properties));\n      this.parseContainments(filterContained(properties));\n    }\n\n    this.parseGenericAttributes(element, otherAttrs);\n\n    return this;\n  };\n\n  ElementSerializer.prototype.nsTagName = function(descriptor) {\n    var effectiveNs = this.logNamespaceUsed(descriptor.ns);\n    return getElementNs(effectiveNs, descriptor);\n  };\n\n  ElementSerializer.prototype.nsPropertyTagName = function(descriptor) {\n    var effectiveNs = this.logNamespaceUsed(descriptor.ns);\n    return getPropertyNs(effectiveNs, descriptor);\n  };\n\n  ElementSerializer.prototype.isLocalNs = function(ns) {\n    return ns.uri === this.ns.uri;\n  };\n\n  /**\n   * Get the actual ns attribute name for the given element.\n   *\n   * @param {Object} element\n   * @param {Boolean} [element.inherited=false]\n   *\n   * @return {Object} nsName\n   */\n  ElementSerializer.prototype.nsAttributeName = function(element) {\n\n    var ns;\n\n    if (isString(element)) {\n      ns = parseName(element);\n    } else {\n      ns = element.ns;\n    }\n\n    // return just local name for inherited attributes\n    if (element.inherited) {\n      return { localName: ns.localName };\n    }\n\n    // parse + log effective ns\n    var effectiveNs = this.logNamespaceUsed(ns);\n\n    // LOG ACTUAL namespace use\n    this.getNamespaces().logUsed(effectiveNs);\n\n    // strip prefix if same namespace like parent\n    if (this.isLocalNs(effectiveNs)) {\n      return { localName: ns.localName };\n    } else {\n      return assign$1({ localName: ns.localName }, effectiveNs);\n    }\n  };\n\n  ElementSerializer.prototype.parseGeneric = function(element) {\n\n    var self = this,\n        body = this.body;\n\n    var attributes = [];\n\n    forEach$1(element, function(val, key) {\n\n      var nonNsAttr;\n\n      if (key === '$body') {\n        body.push(new BodySerializer().build({ type: 'String' }, val));\n      } else\n      if (key === '$children') {\n        forEach$1(val, function(child) {\n          body.push(new ElementSerializer(self).build(child));\n        });\n      } else\n      if (key.indexOf('$') !== 0) {\n        nonNsAttr = self.parseNsAttribute(element, key, val);\n\n        if (nonNsAttr) {\n          attributes.push({ name: key, value: val });\n        }\n      }\n    });\n\n    return attributes;\n  };\n\n  ElementSerializer.prototype.parseNsAttribute = function(element, name, value) {\n    var model = element.$model;\n\n    var nameNs = parseName(name);\n\n    var ns;\n\n    // parse xmlns:foo=\"http://foo.bar\"\n    if (nameNs.prefix === 'xmlns') {\n      ns = { prefix: nameNs.localName, uri: value };\n    }\n\n    // parse xmlns=\"http://foo.bar\"\n    if (!nameNs.prefix && nameNs.localName === 'xmlns') {\n      ns = { uri: value };\n    }\n\n    if (!ns) {\n      return {\n        name: name,\n        value: value\n      };\n    }\n\n    if (model && model.getPackage(value)) {\n\n      // register well known namespace\n      this.logNamespace(ns, true, true);\n    } else {\n\n      // log custom namespace directly as used\n      var actualNs = this.logNamespaceUsed(ns, true);\n\n      this.getNamespaces().logUsed(actualNs);\n    }\n  };\n\n\n  /**\n   * Parse namespaces and return a list of left over generic attributes\n   *\n   * @param  {Object} element\n   * @return {Array<Object>}\n   */\n  ElementSerializer.prototype.parseNsAttributes = function(element, attrs) {\n    var self = this;\n\n    var genericAttrs = element.$attrs;\n\n    var attributes = [];\n\n    // parse namespace attributes first\n    // and log them. push non namespace attributes to a list\n    // and process them later\n    forEach$1(genericAttrs, function(value, name) {\n\n      var nonNsAttr = self.parseNsAttribute(element, name, value);\n\n      if (nonNsAttr) {\n        attributes.push(nonNsAttr);\n      }\n    });\n\n    return attributes;\n  };\n\n  ElementSerializer.prototype.parseGenericAttributes = function(element, attributes) {\n\n    var self = this;\n\n    forEach$1(attributes, function(attr) {\n\n      // do not serialize xsi:type attribute\n      // it is set manually based on the actual implementation type\n      if (attr.name === XSI_TYPE) {\n        return;\n      }\n\n      try {\n        self.addAttribute(self.nsAttributeName(attr.name), attr.value);\n      } catch (e) {\n        /* global console */\n\n        console.warn(\n          'missing namespace information for ',\n          attr.name, '=', attr.value, 'on', element,\n          e);\n      }\n    });\n  };\n\n  ElementSerializer.prototype.parseContainments = function(properties) {\n\n    var self = this,\n        body = this.body,\n        element = this.element;\n\n    forEach$1(properties, function(p) {\n      var value = element.get(p.name),\n          isReference = p.isReference,\n          isMany = p.isMany;\n\n      if (!isMany) {\n        value = [ value ];\n      }\n\n      if (p.isBody) {\n        body.push(new BodySerializer().build(p, value[0]));\n      } else\n      if (isSimple(p.type)) {\n        forEach$1(value, function(v) {\n          body.push(new ValueSerializer(self.addTagName(self.nsPropertyTagName(p))).build(p, v));\n        });\n      } else\n      if (isReference) {\n        forEach$1(value, function(v) {\n          body.push(new ReferenceSerializer(self.addTagName(self.nsPropertyTagName(p))).build(v));\n        });\n      } else {\n\n        // allow serialization via type\n        // rather than element name\n        var asType = serializeAsType(p),\n            asProperty = serializeAsProperty(p);\n\n        forEach$1(value, function(v) {\n          var serializer;\n\n          if (asType) {\n            serializer = new TypeSerializer(self, p);\n          } else\n          if (asProperty) {\n            serializer = new ElementSerializer(self, p);\n          } else {\n            serializer = new ElementSerializer(self);\n          }\n\n          body.push(serializer.build(v));\n        });\n      }\n    });\n  };\n\n  ElementSerializer.prototype.getNamespaces = function(local) {\n\n    var namespaces = this.namespaces,\n        parent = this.parent,\n        parentNamespaces;\n\n    if (!namespaces) {\n      parentNamespaces = parent && parent.getNamespaces();\n\n      if (local || !parentNamespaces) {\n        this.namespaces = namespaces = new Namespaces(parentNamespaces);\n      } else {\n        namespaces = parentNamespaces;\n      }\n    }\n\n    return namespaces;\n  };\n\n  ElementSerializer.prototype.logNamespace = function(ns, wellknown, local) {\n    var namespaces = this.getNamespaces(local);\n\n    var nsUri = ns.uri,\n        nsPrefix = ns.prefix;\n\n    var existing = namespaces.byUri(nsUri);\n\n    if (!existing || local) {\n      namespaces.add(ns, wellknown);\n    }\n\n    namespaces.mapPrefix(nsPrefix, nsUri);\n\n    return ns;\n  };\n\n  ElementSerializer.prototype.logNamespaceUsed = function(ns, local) {\n    var element = this.element,\n        model = element.$model,\n        namespaces = this.getNamespaces(local);\n\n    // ns may be\n    //\n    //   * prefix only\n    //   * prefix:uri\n    //   * localName only\n\n    var prefix = ns.prefix,\n        uri = ns.uri,\n        newPrefix, idx,\n        wellknownUri;\n\n    // handle anonymous namespaces (elementForm=unqualified), cf. #23\n    if (!prefix && !uri) {\n      return { localName: ns.localName };\n    }\n\n    wellknownUri = DEFAULT_NS_MAP[prefix] || model && (model.getPackage(prefix) || {}).uri;\n\n    uri = uri || wellknownUri || namespaces.uriByPrefix(prefix);\n\n    if (!uri) {\n      throw new Error('no namespace uri given for prefix <' + prefix + '>');\n    }\n\n    ns = namespaces.byUri(uri);\n\n    if (!ns) {\n      newPrefix = prefix;\n      idx = 1;\n\n      // find a prefix that is not mapped yet\n      while (namespaces.uriByPrefix(newPrefix)) {\n        newPrefix = prefix + '_' + idx++;\n      }\n\n      ns = this.logNamespace({ prefix: newPrefix, uri: uri }, wellknownUri === uri);\n    }\n\n    if (prefix) {\n      namespaces.mapPrefix(prefix, uri);\n    }\n\n    return ns;\n  };\n\n  ElementSerializer.prototype.parseAttributes = function(properties) {\n    var self = this,\n        element = this.element;\n\n    forEach$1(properties, function(p) {\n\n      var value = element.get(p.name);\n\n      if (p.isReference) {\n\n        if (!p.isMany) {\n          value = value.id;\n        }\n        else {\n          var values = [];\n          forEach$1(value, function(v) {\n            values.push(v.id);\n          });\n\n          // IDREFS is a whitespace-separated list of references.\n          value = values.join(' ');\n        }\n\n      }\n\n      self.addAttribute(self.nsAttributeName(p), value);\n    });\n  };\n\n  ElementSerializer.prototype.addTagName = function(nsTagName) {\n    var actualNs = this.logNamespaceUsed(nsTagName);\n\n    this.getNamespaces().logUsed(actualNs);\n\n    return nsName(nsTagName);\n  };\n\n  ElementSerializer.prototype.addAttribute = function(name, value) {\n    var attrs = this.attrs;\n\n    if (isString(value)) {\n      value = escapeAttr(value);\n    }\n\n    // de-duplicate attributes\n    // https://github.com/bpmn-io/moddle-xml/issues/66\n    var idx = findIndex(attrs, function(element) {\n      return (\n        element.name.localName === name.localName &&\n        element.name.uri === name.uri &&\n        element.name.prefix === name.prefix\n      );\n    });\n\n    var attr = { name: name, value: value };\n\n    if (idx !== -1) {\n      attrs.splice(idx, 1, attr);\n    } else {\n      attrs.push(attr);\n    }\n  };\n\n  ElementSerializer.prototype.serializeAttributes = function(writer) {\n    var attrs = this.attrs,\n        namespaces = this.namespaces;\n\n    if (namespaces) {\n      attrs = getNsAttrs(namespaces).concat(attrs);\n    }\n\n    forEach$1(attrs, function(a) {\n      writer\n        .append(' ')\n        .append(nsName(a.name)).append('=\"').append(a.value).append('\"');\n    });\n  };\n\n  ElementSerializer.prototype.serializeTo = function(writer) {\n    var firstBody = this.body[0],\n        indent = firstBody && firstBody.constructor !== BodySerializer;\n\n    writer\n      .appendIndent()\n      .append('<' + this.tagName);\n\n    this.serializeAttributes(writer);\n\n    writer.append(firstBody ? '>' : ' />');\n\n    if (firstBody) {\n\n      if (indent) {\n        writer\n          .appendNewLine()\n          .indent();\n      }\n\n      forEach$1(this.body, function(b) {\n        b.serializeTo(writer);\n      });\n\n      if (indent) {\n        writer\n          .unindent()\n          .appendIndent();\n      }\n\n      writer.append('</' + this.tagName + '>');\n    }\n\n    writer.appendNewLine();\n  };\n\n  /**\n   * A serializer for types that handles serialization of data types\n   */\n  function TypeSerializer(parent, propertyDescriptor) {\n    ElementSerializer.call(this, parent, propertyDescriptor);\n  }\n\n  inherits(TypeSerializer, ElementSerializer);\n\n  TypeSerializer.prototype.parseNsAttributes = function(element) {\n\n    // extracted attributes\n    var attributes = ElementSerializer.prototype.parseNsAttributes.call(this, element);\n\n    var descriptor = element.$descriptor;\n\n    // only serialize xsi:type if necessary\n    if (descriptor.name === this.propertyDescriptor.type) {\n      return attributes;\n    }\n\n    var typeNs = this.typeNs = this.nsTagName(descriptor);\n    this.getNamespaces().logUsed(this.typeNs);\n\n    // add xsi:type attribute to represent the elements\n    // actual type\n\n    var pkg = element.$model.getPackage(typeNs.uri),\n        typePrefix = (pkg.xml && pkg.xml.typePrefix) || '';\n\n    this.addAttribute(\n      this.nsAttributeName(XSI_TYPE),\n      (typeNs.prefix ? typeNs.prefix + ':' : '') + typePrefix + descriptor.ns.localName\n    );\n\n    return attributes;\n  };\n\n  TypeSerializer.prototype.isLocalNs = function(ns) {\n    return ns.uri === (this.typeNs || this.ns).uri;\n  };\n\n  function SavingWriter() {\n    this.value = '';\n\n    this.write = function(str) {\n      this.value += str;\n    };\n  }\n\n  function FormatingWriter(out, format) {\n\n    var indent = [ '' ];\n\n    this.append = function(str) {\n      out.write(str);\n\n      return this;\n    };\n\n    this.appendNewLine = function() {\n      if (format) {\n        out.write('\\n');\n      }\n\n      return this;\n    };\n\n    this.appendIndent = function() {\n      if (format) {\n        out.write(indent.join('  '));\n      }\n\n      return this;\n    };\n\n    this.indent = function() {\n      indent.push('');\n      return this;\n    };\n\n    this.unindent = function() {\n      indent.pop();\n      return this;\n    };\n  }\n\n  /**\n   * A writer for meta-model backed document trees\n   *\n   * @param {Object} options output options to pass into the writer\n   */\n  function Writer(options) {\n\n    options = assign$1({ format: false, preamble: true }, options || {});\n\n    function toXML(tree, writer) {\n      var internalWriter = writer || new SavingWriter();\n      var formatingWriter = new FormatingWriter(internalWriter, options.format);\n\n      if (options.preamble) {\n        formatingWriter.append(XML_PREAMBLE);\n      }\n\n      new ElementSerializer().build(tree).serializeTo(formatingWriter);\n\n      if (!writer) {\n        return internalWriter.value;\n      }\n    }\n\n    return {\n      toXML: toXML\n    };\n  }\n\n  /**\n   * A sub class of {@link Moddle} with support for import and export of BPMN 2.0 xml files.\n   *\n   * @class BpmnModdle\n   * @extends Moddle\n   *\n   * @param {Object|Array} packages to use for instantiating the model\n   * @param {Object} [options] additional options to pass over\n   */\n  function BpmnModdle(packages, options) {\n    Moddle.call(this, packages, options);\n  }\n\n  BpmnModdle.prototype = Object.create(Moddle.prototype);\n\n  /**\n   * The fromXML result.\n   *\n   * @typedef {Object} ParseResult\n   *\n   * @property {ModdleElement} rootElement\n   * @property {Array<Object>} references\n   * @property {Array<Error>} warnings\n   * @property {Object} elementsById - a mapping containing each ID -> ModdleElement\n   */\n\n  /**\n   * The fromXML error.\n   *\n   * @typedef {Error} ParseError\n   *\n   * @property {Array<Error>} warnings\n   */\n\n  /**\n   * Instantiates a BPMN model tree from a given xml string.\n   *\n   * @param {String}   xmlStr\n   * @param {String}   [typeName='bpmn:Definitions'] name of the root element\n   * @param {Object}   [options]  options to pass to the underlying reader\n   *\n   * @returns {Promise<ParseResult, ParseError>}\n   */\n  BpmnModdle.prototype.fromXML = function(xmlStr, typeName, options) {\n\n    if (!isString(typeName)) {\n      options = typeName;\n      typeName = 'bpmn:Definitions';\n    }\n\n    var reader = new Reader(assign$1({ model: this, lax: true }, options));\n    var rootHandler = reader.handler(typeName);\n\n    return reader.fromXML(xmlStr, rootHandler);\n  };\n\n\n  /**\n   * The toXML result.\n   *\n   * @typedef {Object} SerializationResult\n   *\n   * @property {String} xml\n   */\n\n  /**\n   * Serializes a BPMN 2.0 object tree to XML.\n   *\n   * @param {String}   element    the root element, typically an instance of `bpmn:Definitions`\n   * @param {Object}   [options]  to pass to the underlying writer\n   *\n   * @returns {Promise<SerializationResult, Error>}\n   */\n  BpmnModdle.prototype.toXML = function(element, options) {\n\n    var writer = new Writer(options);\n\n    return new Promise(function(resolve, reject) {\n      try {\n        var result = writer.toXML(element);\n\n        return resolve({\n          xml: result\n        });\n      } catch (err) {\n        return reject(err);\n      }\n    });\n  };\n\n  var name$5 = \"BPMN20\";\n  var uri$5 = \"http://www.omg.org/spec/BPMN/20100524/MODEL\";\n  var prefix$5 = \"bpmn\";\n  var associations$5 = [\n  ];\n  var types$5 = [\n  \t{\n  \t\tname: \"Interface\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"operations\",\n  \t\t\t\ttype: \"Operation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"implementationRef\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Operation\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inMessageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outMessageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"errorRef\",\n  \t\t\t\ttype: \"Error\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"implementationRef\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"EndPoint\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Auditing\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalTask\",\n  \t\tsuperClass: [\n  \t\t\t\"CallableElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"resources\",\n  \t\t\t\ttype: \"ResourceRole\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Monitoring\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Performer\",\n  \t\tsuperClass: [\n  \t\t\t\"ResourceRole\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Process\",\n  \t\tsuperClass: [\n  \t\t\t\"FlowElementsContainer\",\n  \t\t\t\"CallableElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"processType\",\n  \t\t\t\ttype: \"ProcessType\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isClosed\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"auditing\",\n  \t\t\t\ttype: \"Auditing\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"monitoring\",\n  \t\t\t\ttype: \"Monitoring\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"properties\",\n  \t\t\t\ttype: \"Property\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"laneSets\",\n  \t\t\t\tisMany: true,\n  \t\t\t\treplaces: \"FlowElementsContainer#laneSets\",\n  \t\t\t\ttype: \"LaneSet\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"flowElements\",\n  \t\t\t\tisMany: true,\n  \t\t\t\treplaces: \"FlowElementsContainer#flowElements\",\n  \t\t\t\ttype: \"FlowElement\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"artifacts\",\n  \t\t\t\ttype: \"Artifact\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"resources\",\n  \t\t\t\ttype: \"ResourceRole\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"correlationSubscriptions\",\n  \t\t\t\ttype: \"CorrelationSubscription\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"supports\",\n  \t\t\t\ttype: \"Process\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"definitionalCollaborationRef\",\n  \t\t\t\ttype: \"Collaboration\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isExecutable\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"LaneSet\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"lanes\",\n  \t\t\t\ttype: \"Lane\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Lane\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"partitionElementRef\",\n  \t\t\t\ttype: \"BaseElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"partitionElement\",\n  \t\t\t\ttype: \"BaseElement\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"flowNodeRef\",\n  \t\t\t\ttype: \"FlowNode\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"childLaneSet\",\n  \t\t\t\ttype: \"LaneSet\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalManualTask\",\n  \t\tsuperClass: [\n  \t\t\t\"GlobalTask\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ManualTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"UserTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"renderings\",\n  \t\t\t\ttype: \"Rendering\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Rendering\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"HumanPerformer\",\n  \t\tsuperClass: [\n  \t\t\t\"Performer\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"PotentialOwner\",\n  \t\tsuperClass: [\n  \t\t\t\"HumanPerformer\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalUserTask\",\n  \t\tsuperClass: [\n  \t\t\t\"GlobalTask\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"renderings\",\n  \t\t\t\ttype: \"Rendering\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Gateway\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"FlowNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"gatewayDirection\",\n  \t\t\t\ttype: \"GatewayDirection\",\n  \t\t\t\t\"default\": \"Unspecified\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"EventBasedGateway\",\n  \t\tsuperClass: [\n  \t\t\t\"Gateway\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"instantiate\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"eventGatewayType\",\n  \t\t\t\ttype: \"EventBasedGatewayType\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\t\"default\": \"Exclusive\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ComplexGateway\",\n  \t\tsuperClass: [\n  \t\t\t\"Gateway\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"activationCondition\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"default\",\n  \t\t\t\ttype: \"SequenceFlow\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ExclusiveGateway\",\n  \t\tsuperClass: [\n  \t\t\t\"Gateway\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"default\",\n  \t\t\t\ttype: \"SequenceFlow\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"InclusiveGateway\",\n  \t\tsuperClass: [\n  \t\t\t\"Gateway\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"default\",\n  \t\t\t\ttype: \"SequenceFlow\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ParallelGateway\",\n  \t\tsuperClass: [\n  \t\t\t\"Gateway\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"RootElement\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Relationship\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"type\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"direction\",\n  \t\t\t\ttype: \"RelationshipDirection\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"source\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"Element\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"target\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"Element\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BaseElement\",\n  \t\tisAbstract: true,\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"id\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\",\n  \t\t\t\tisId: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"documentation\",\n  \t\t\t\ttype: \"Documentation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extensionDefinitions\",\n  \t\t\t\ttype: \"ExtensionDefinition\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extensionElements\",\n  \t\t\t\ttype: \"ExtensionElements\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Extension\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"mustUnderstand\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"definition\",\n  \t\t\t\ttype: \"ExtensionDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ExtensionDefinition\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extensionAttributeDefinitions\",\n  \t\t\t\ttype: \"ExtensionAttributeDefinition\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ExtensionAttributeDefinition\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"type\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isReference\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extensionDefinition\",\n  \t\t\t\ttype: \"ExtensionDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ExtensionElements\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"valueRef\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"Element\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"values\",\n  \t\t\t\ttype: \"Element\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extensionAttributeDefinition\",\n  \t\t\t\ttype: \"ExtensionAttributeDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Documentation\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"text\",\n  \t\t\t\ttype: \"String\",\n  \t\t\t\tisBody: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"textFormat\",\n  \t\t\t\t\"default\": \"text/plain\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Event\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"FlowNode\",\n  \t\t\t\"InteractionNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"properties\",\n  \t\t\t\ttype: \"Property\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"IntermediateCatchEvent\",\n  \t\tsuperClass: [\n  \t\t\t\"CatchEvent\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"IntermediateThrowEvent\",\n  \t\tsuperClass: [\n  \t\t\t\"ThrowEvent\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"EndEvent\",\n  \t\tsuperClass: [\n  \t\t\t\"ThrowEvent\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"StartEvent\",\n  \t\tsuperClass: [\n  \t\t\t\"CatchEvent\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"isInterrupting\",\n  \t\t\t\t\"default\": true,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ThrowEvent\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Event\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"dataInputs\",\n  \t\t\t\ttype: \"DataInput\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataInputAssociations\",\n  \t\t\t\ttype: \"DataInputAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputSet\",\n  \t\t\t\ttype: \"InputSet\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"eventDefinitions\",\n  \t\t\t\ttype: \"EventDefinition\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"eventDefinitionRef\",\n  \t\t\t\ttype: \"EventDefinition\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CatchEvent\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Event\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"parallelMultiple\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\",\n  \t\t\t\t\"default\": false\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataOutputs\",\n  \t\t\t\ttype: \"DataOutput\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataOutputAssociations\",\n  \t\t\t\ttype: \"DataOutputAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputSet\",\n  \t\t\t\ttype: \"OutputSet\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"eventDefinitions\",\n  \t\t\t\ttype: \"EventDefinition\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"eventDefinitionRef\",\n  \t\t\t\ttype: \"EventDefinition\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BoundaryEvent\",\n  \t\tsuperClass: [\n  \t\t\t\"CatchEvent\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"cancelActivity\",\n  \t\t\t\t\"default\": true,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"attachedToRef\",\n  \t\t\t\ttype: \"Activity\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"EventDefinition\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CancelEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ErrorEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"errorRef\",\n  \t\t\t\ttype: \"Error\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"TerminateEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"EscalationEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"escalationRef\",\n  \t\t\t\ttype: \"Escalation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Escalation\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"structureRef\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"escalationCode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CompensateEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"waitForCompletion\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\",\n  \t\t\t\t\"default\": true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"activityRef\",\n  \t\t\t\ttype: \"Activity\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"TimerEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"timeDate\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"timeCycle\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"timeDuration\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"LinkEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"target\",\n  \t\t\t\ttype: \"LinkEventDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"source\",\n  \t\t\t\ttype: \"LinkEventDefinition\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"MessageEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"messageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"operationRef\",\n  \t\t\t\ttype: \"Operation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ConditionalEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"condition\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"SignalEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"signalRef\",\n  \t\t\t\ttype: \"Signal\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Signal\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"structureRef\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ImplicitThrowEvent\",\n  \t\tsuperClass: [\n  \t\t\t\"ThrowEvent\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataState\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ItemAwareElement\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"itemSubjectRef\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataState\",\n  \t\t\t\ttype: \"DataState\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataAssociation\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"sourceRef\",\n  \t\t\t\ttype: \"ItemAwareElement\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetRef\",\n  \t\t\t\ttype: \"ItemAwareElement\",\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"transformation\",\n  \t\t\t\ttype: \"FormalExpression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"property\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"assignment\",\n  \t\t\t\ttype: \"Assignment\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataInput\",\n  \t\tsuperClass: [\n  \t\t\t\"ItemAwareElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isCollection\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputSetRef\",\n  \t\t\t\ttype: \"InputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputSetWithOptional\",\n  \t\t\t\ttype: \"InputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputSetWithWhileExecuting\",\n  \t\t\t\ttype: \"InputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataOutput\",\n  \t\tsuperClass: [\n  \t\t\t\"ItemAwareElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isCollection\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputSetRef\",\n  \t\t\t\ttype: \"OutputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputSetWithOptional\",\n  \t\t\t\ttype: \"OutputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputSetWithWhileExecuting\",\n  \t\t\t\ttype: \"OutputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"InputSet\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataInputRefs\",\n  \t\t\t\ttype: \"DataInput\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"optionalInputRefs\",\n  \t\t\t\ttype: \"DataInput\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"whileExecutingInputRefs\",\n  \t\t\t\ttype: \"DataInput\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputSetRefs\",\n  \t\t\t\ttype: \"OutputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"OutputSet\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"dataOutputRefs\",\n  \t\t\t\ttype: \"DataOutput\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputSetRefs\",\n  \t\t\t\ttype: \"InputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"optionalOutputRefs\",\n  \t\t\t\ttype: \"DataOutput\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"whileExecutingOutputRefs\",\n  \t\t\t\ttype: \"DataOutput\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Property\",\n  \t\tsuperClass: [\n  \t\t\t\"ItemAwareElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataInputAssociation\",\n  \t\tsuperClass: [\n  \t\t\t\"DataAssociation\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataOutputAssociation\",\n  \t\tsuperClass: [\n  \t\t\t\"DataAssociation\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"InputOutputSpecification\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"dataInputs\",\n  \t\t\t\ttype: \"DataInput\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataOutputs\",\n  \t\t\t\ttype: \"DataOutput\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputSets\",\n  \t\t\t\ttype: \"InputSet\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputSets\",\n  \t\t\t\ttype: \"OutputSet\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataObject\",\n  \t\tsuperClass: [\n  \t\t\t\"FlowElement\",\n  \t\t\t\"ItemAwareElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"isCollection\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"InputOutputBinding\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"inputDataRef\",\n  \t\t\t\ttype: \"InputSet\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputDataRef\",\n  \t\t\t\ttype: \"OutputSet\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"operationRef\",\n  \t\t\t\ttype: \"Operation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Assignment\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"from\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"to\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataStore\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\",\n  \t\t\t\"ItemAwareElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"capacity\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Integer\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isUnlimited\",\n  \t\t\t\t\"default\": true,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataStoreReference\",\n  \t\tsuperClass: [\n  \t\t\t\"ItemAwareElement\",\n  \t\t\t\"FlowElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"dataStoreRef\",\n  \t\t\t\ttype: \"DataStore\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataObjectReference\",\n  \t\tsuperClass: [\n  \t\t\t\"ItemAwareElement\",\n  \t\t\t\"FlowElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"dataObjectRef\",\n  \t\t\t\ttype: \"DataObject\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ConversationLink\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"sourceRef\",\n  \t\t\t\ttype: \"InteractionNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetRef\",\n  \t\t\t\ttype: \"InteractionNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ConversationAssociation\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"innerConversationNodeRef\",\n  \t\t\t\ttype: \"ConversationNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outerConversationNodeRef\",\n  \t\t\t\ttype: \"ConversationNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CallConversation\",\n  \t\tsuperClass: [\n  \t\t\t\"ConversationNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"calledCollaborationRef\",\n  \t\t\t\ttype: \"Collaboration\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantAssociations\",\n  \t\t\t\ttype: \"ParticipantAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Conversation\",\n  \t\tsuperClass: [\n  \t\t\t\"ConversationNode\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"SubConversation\",\n  \t\tsuperClass: [\n  \t\t\t\"ConversationNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"conversationNodes\",\n  \t\t\t\ttype: \"ConversationNode\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ConversationNode\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"InteractionNode\",\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageFlowRefs\",\n  \t\t\t\ttype: \"MessageFlow\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"correlationKeys\",\n  \t\t\t\ttype: \"CorrelationKey\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalConversation\",\n  \t\tsuperClass: [\n  \t\t\t\"Collaboration\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"PartnerEntity\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"PartnerRole\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CorrelationProperty\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"correlationPropertyRetrievalExpression\",\n  \t\t\t\ttype: \"CorrelationPropertyRetrievalExpression\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"type\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Error\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"structureRef\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"errorCode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CorrelationKey\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"correlationPropertyRef\",\n  \t\t\t\ttype: \"CorrelationProperty\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Expression\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tisAbstract: false,\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"body\",\n  \t\t\t\tisBody: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"FormalExpression\",\n  \t\tsuperClass: [\n  \t\t\t\"Expression\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"language\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"evaluatesToTypeRef\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Message\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"itemRef\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ItemDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"itemKind\",\n  \t\t\t\ttype: \"ItemKind\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"structureRef\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isCollection\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"import\",\n  \t\t\t\ttype: \"Import\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"FlowElement\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"auditing\",\n  \t\t\t\ttype: \"Auditing\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"monitoring\",\n  \t\t\t\ttype: \"Monitoring\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"categoryValueRef\",\n  \t\t\t\ttype: \"CategoryValue\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"SequenceFlow\",\n  \t\tsuperClass: [\n  \t\t\t\"FlowElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"isImmediate\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"conditionExpression\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"sourceRef\",\n  \t\t\t\ttype: \"FlowNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetRef\",\n  \t\t\t\ttype: \"FlowNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"FlowElementsContainer\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"laneSets\",\n  \t\t\t\ttype: \"LaneSet\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"flowElements\",\n  \t\t\t\ttype: \"FlowElement\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CallableElement\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"ioSpecification\",\n  \t\t\t\ttype: \"InputOutputSpecification\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"property\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"supportedInterfaceRef\",\n  \t\t\t\ttype: \"Interface\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"ioBinding\",\n  \t\t\t\ttype: \"InputOutputBinding\",\n  \t\t\t\tisMany: true,\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"property\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"FlowNode\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"FlowElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"incoming\",\n  \t\t\t\ttype: \"SequenceFlow\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outgoing\",\n  \t\t\t\ttype: \"SequenceFlow\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"lanes\",\n  \t\t\t\ttype: \"Lane\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CorrelationPropertyRetrievalExpression\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"messagePath\",\n  \t\t\t\ttype: \"FormalExpression\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CorrelationPropertyBinding\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"dataPath\",\n  \t\t\t\ttype: \"FormalExpression\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"correlationPropertyRef\",\n  \t\t\t\ttype: \"CorrelationProperty\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Resource\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"resourceParameters\",\n  \t\t\t\ttype: \"ResourceParameter\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ResourceParameter\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isRequired\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"type\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CorrelationSubscription\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"correlationKeyRef\",\n  \t\t\t\ttype: \"CorrelationKey\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"correlationPropertyBinding\",\n  \t\t\t\ttype: \"CorrelationPropertyBinding\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"MessageFlow\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"sourceRef\",\n  \t\t\t\ttype: \"InteractionNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetRef\",\n  \t\t\t\ttype: \"InteractionNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"MessageFlowAssociation\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"innerMessageFlowRef\",\n  \t\t\t\ttype: \"MessageFlow\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outerMessageFlowRef\",\n  \t\t\t\ttype: \"MessageFlow\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"InteractionNode\",\n  \t\tisAbstract: true,\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"incomingConversationLinks\",\n  \t\t\t\ttype: \"ConversationLink\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outgoingConversationLinks\",\n  \t\t\t\ttype: \"ConversationLink\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Participant\",\n  \t\tsuperClass: [\n  \t\t\t\"InteractionNode\",\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"interfaceRef\",\n  \t\t\t\ttype: \"Interface\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantMultiplicity\",\n  \t\t\t\ttype: \"ParticipantMultiplicity\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"endPointRefs\",\n  \t\t\t\ttype: \"EndPoint\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"processRef\",\n  \t\t\t\ttype: \"Process\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ParticipantAssociation\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"innerParticipantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outerParticipantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ParticipantMultiplicity\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"minimum\",\n  \t\t\t\t\"default\": 0,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Integer\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"maximum\",\n  \t\t\t\t\"default\": 1,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Integer\"\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Collaboration\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isClosed\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participants\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageFlows\",\n  \t\t\t\ttype: \"MessageFlow\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"artifacts\",\n  \t\t\t\ttype: \"Artifact\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"conversations\",\n  \t\t\t\ttype: \"ConversationNode\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"conversationAssociations\",\n  \t\t\t\ttype: \"ConversationAssociation\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantAssociations\",\n  \t\t\t\ttype: \"ParticipantAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageFlowAssociations\",\n  \t\t\t\ttype: \"MessageFlowAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"correlationKeys\",\n  \t\t\t\ttype: \"CorrelationKey\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"choreographyRef\",\n  \t\t\t\ttype: \"Choreography\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"conversationLinks\",\n  \t\t\t\ttype: \"ConversationLink\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ChoreographyActivity\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"FlowNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"participantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"initiatingParticipantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"correlationKeys\",\n  \t\t\t\ttype: \"CorrelationKey\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopType\",\n  \t\t\t\ttype: \"ChoreographyLoopType\",\n  \t\t\t\t\"default\": \"None\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CallChoreography\",\n  \t\tsuperClass: [\n  \t\t\t\"ChoreographyActivity\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"calledChoreographyRef\",\n  \t\t\t\ttype: \"Choreography\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantAssociations\",\n  \t\t\t\ttype: \"ParticipantAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"SubChoreography\",\n  \t\tsuperClass: [\n  \t\t\t\"ChoreographyActivity\",\n  \t\t\t\"FlowElementsContainer\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"artifacts\",\n  \t\t\t\ttype: \"Artifact\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ChoreographyTask\",\n  \t\tsuperClass: [\n  \t\t\t\"ChoreographyActivity\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"messageFlowRef\",\n  \t\t\t\ttype: \"MessageFlow\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Choreography\",\n  \t\tsuperClass: [\n  \t\t\t\"Collaboration\",\n  \t\t\t\"FlowElementsContainer\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalChoreographyTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Choreography\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"initiatingParticipantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"TextAnnotation\",\n  \t\tsuperClass: [\n  \t\t\t\"Artifact\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"text\",\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"textFormat\",\n  \t\t\t\t\"default\": \"text/plain\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Group\",\n  \t\tsuperClass: [\n  \t\t\t\"Artifact\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"categoryValueRef\",\n  \t\t\t\ttype: \"CategoryValue\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Association\",\n  \t\tsuperClass: [\n  \t\t\t\"Artifact\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"associationDirection\",\n  \t\t\t\ttype: \"AssociationDirection\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"sourceRef\",\n  \t\t\t\ttype: \"BaseElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetRef\",\n  \t\t\t\ttype: \"BaseElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Category\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"categoryValue\",\n  \t\t\t\ttype: \"CategoryValue\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Artifact\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CategoryValue\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"categorizedFlowElements\",\n  \t\t\t\ttype: \"FlowElement\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"value\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Activity\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"FlowNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"isForCompensation\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"default\",\n  \t\t\t\ttype: \"SequenceFlow\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"ioSpecification\",\n  \t\t\t\ttype: \"InputOutputSpecification\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"property\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"boundaryEventRefs\",\n  \t\t\t\ttype: \"BoundaryEvent\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"properties\",\n  \t\t\t\ttype: \"Property\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataInputAssociations\",\n  \t\t\t\ttype: \"DataInputAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataOutputAssociations\",\n  \t\t\t\ttype: \"DataOutputAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"startQuantity\",\n  \t\t\t\t\"default\": 1,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Integer\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"resources\",\n  \t\t\t\ttype: \"ResourceRole\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"completionQuantity\",\n  \t\t\t\t\"default\": 1,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Integer\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopCharacteristics\",\n  \t\t\t\ttype: \"LoopCharacteristics\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ServiceTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"operationRef\",\n  \t\t\t\ttype: \"Operation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"SubProcess\",\n  \t\tsuperClass: [\n  \t\t\t\"Activity\",\n  \t\t\t\"FlowElementsContainer\",\n  \t\t\t\"InteractionNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"triggeredByEvent\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"artifacts\",\n  \t\t\t\ttype: \"Artifact\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"LoopCharacteristics\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"MultiInstanceLoopCharacteristics\",\n  \t\tsuperClass: [\n  \t\t\t\"LoopCharacteristics\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"isSequential\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"behavior\",\n  \t\t\t\ttype: \"MultiInstanceBehavior\",\n  \t\t\t\t\"default\": \"All\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopCardinality\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopDataInputRef\",\n  \t\t\t\ttype: \"ItemAwareElement\",\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopDataOutputRef\",\n  \t\t\t\ttype: \"ItemAwareElement\",\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputDataItem\",\n  \t\t\t\ttype: \"DataInput\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"property\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputDataItem\",\n  \t\t\t\ttype: \"DataOutput\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"property\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"complexBehaviorDefinition\",\n  \t\t\t\ttype: \"ComplexBehaviorDefinition\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"completionCondition\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"oneBehaviorEventRef\",\n  \t\t\t\ttype: \"EventDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"noneBehaviorEventRef\",\n  \t\t\t\ttype: \"EventDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"StandardLoopCharacteristics\",\n  \t\tsuperClass: [\n  \t\t\t\"LoopCharacteristics\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"testBefore\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopCondition\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopMaximum\",\n  \t\t\t\ttype: \"Integer\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CallActivity\",\n  \t\tsuperClass: [\n  \t\t\t\"Activity\",\n  \t\t\t\"InteractionNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"calledElement\",\n  \t\t\t\ttype: \"String\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Task\",\n  \t\tsuperClass: [\n  \t\t\t\"Activity\",\n  \t\t\t\"InteractionNode\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"SendTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"operationRef\",\n  \t\t\t\ttype: \"Operation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ReceiveTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"instantiate\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"operationRef\",\n  \t\t\t\ttype: \"Operation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ScriptTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"scriptFormat\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"script\",\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BusinessRuleTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"AdHocSubProcess\",\n  \t\tsuperClass: [\n  \t\t\t\"SubProcess\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"completionCondition\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"ordering\",\n  \t\t\t\ttype: \"AdHocOrdering\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"cancelRemainingInstances\",\n  \t\t\t\t\"default\": true,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Transaction\",\n  \t\tsuperClass: [\n  \t\t\t\"SubProcess\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"protocol\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"method\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalScriptTask\",\n  \t\tsuperClass: [\n  \t\t\t\"GlobalTask\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"scriptLanguage\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"script\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalBusinessRuleTask\",\n  \t\tsuperClass: [\n  \t\t\t\"GlobalTask\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ComplexBehaviorDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"condition\",\n  \t\t\t\ttype: \"FormalExpression\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"event\",\n  \t\t\t\ttype: \"ImplicitThrowEvent\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ResourceRole\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"resourceRef\",\n  \t\t\t\ttype: \"Resource\",\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"resourceParameterBindings\",\n  \t\t\t\ttype: \"ResourceParameterBinding\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"resourceAssignmentExpression\",\n  \t\t\t\ttype: \"ResourceAssignmentExpression\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ResourceParameterBinding\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"expression\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"parameterRef\",\n  \t\t\t\ttype: \"ResourceParameter\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ResourceAssignmentExpression\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"expression\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Import\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"importType\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"location\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"namespace\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Definitions\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetNamespace\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"expressionLanguage\",\n  \t\t\t\t\"default\": \"http://www.w3.org/1999/XPath\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"typeLanguage\",\n  \t\t\t\t\"default\": \"http://www.w3.org/2001/XMLSchema\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"imports\",\n  \t\t\t\ttype: \"Import\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extensions\",\n  \t\t\t\ttype: \"Extension\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"rootElements\",\n  \t\t\t\ttype: \"RootElement\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"diagrams\",\n  \t\t\t\tisMany: true,\n  \t\t\t\ttype: \"bpmndi:BPMNDiagram\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"exporter\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"relationships\",\n  \t\t\t\ttype: \"Relationship\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"exporterVersion\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var enumerations$3 = [\n  \t{\n  \t\tname: \"ProcessType\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"None\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Public\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Private\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GatewayDirection\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"Unspecified\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Converging\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Diverging\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Mixed\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"EventBasedGatewayType\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"Parallel\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Exclusive\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"RelationshipDirection\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"None\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Forward\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Backward\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Both\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ItemKind\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"Physical\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Information\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ChoreographyLoopType\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"None\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Standard\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"MultiInstanceSequential\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"MultiInstanceParallel\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"AssociationDirection\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"None\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"One\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Both\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"MultiInstanceBehavior\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"None\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"One\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"All\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Complex\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"AdHocOrdering\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"Parallel\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Sequential\"\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var xml$1 = {\n  \ttagAlias: \"lowerCase\",\n  \ttypePrefix: \"t\"\n  };\n  var BpmnPackage = {\n  \tname: name$5,\n  \turi: uri$5,\n  \tprefix: prefix$5,\n  \tassociations: associations$5,\n  \ttypes: types$5,\n  \tenumerations: enumerations$3,\n  \txml: xml$1\n  };\n\n  var name$4 = \"BPMNDI\";\n  var uri$4 = \"http://www.omg.org/spec/BPMN/20100524/DI\";\n  var prefix$4 = \"bpmndi\";\n  var types$4 = [\n  \t{\n  \t\tname: \"BPMNDiagram\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"plane\",\n  \t\t\t\ttype: \"BPMNPlane\",\n  \t\t\t\tredefines: \"di:Diagram#rootElement\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"labelStyle\",\n  \t\t\t\ttype: \"BPMNLabelStyle\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"di:Diagram\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BPMNPlane\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"bpmnElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"bpmn:BaseElement\",\n  \t\t\t\tredefines: \"di:DiagramElement#modelElement\"\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"di:Plane\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BPMNShape\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"bpmnElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"bpmn:BaseElement\",\n  \t\t\t\tredefines: \"di:DiagramElement#modelElement\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isHorizontal\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isExpanded\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isMarkerVisible\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"label\",\n  \t\t\t\ttype: \"BPMNLabel\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isMessageVisible\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantBandKind\",\n  \t\t\t\ttype: \"ParticipantBandKind\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"choreographyActivityShape\",\n  \t\t\t\ttype: \"BPMNShape\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"di:LabeledShape\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BPMNEdge\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"label\",\n  \t\t\t\ttype: \"BPMNLabel\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"bpmnElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"bpmn:BaseElement\",\n  \t\t\t\tredefines: \"di:DiagramElement#modelElement\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"sourceElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"di:DiagramElement\",\n  \t\t\t\tredefines: \"di:Edge#source\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"di:DiagramElement\",\n  \t\t\t\tredefines: \"di:Edge#target\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageVisibleKind\",\n  \t\t\t\ttype: \"MessageVisibleKind\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\t\"default\": \"initiating\"\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"di:LabeledEdge\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BPMNLabel\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"labelStyle\",\n  \t\t\t\ttype: \"BPMNLabelStyle\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\tredefines: \"di:DiagramElement#style\"\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"di:Label\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BPMNLabelStyle\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"font\",\n  \t\t\t\ttype: \"dc:Font\"\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"di:Style\"\n  \t\t]\n  \t}\n  ];\n  var enumerations$2 = [\n  \t{\n  \t\tname: \"ParticipantBandKind\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"top_initiating\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"middle_initiating\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"bottom_initiating\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"top_non_initiating\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"middle_non_initiating\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"bottom_non_initiating\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"MessageVisibleKind\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"initiating\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"non_initiating\"\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var associations$4 = [\n  ];\n  var BpmnDiPackage = {\n  \tname: name$4,\n  \turi: uri$4,\n  \tprefix: prefix$4,\n  \ttypes: types$4,\n  \tenumerations: enumerations$2,\n  \tassociations: associations$4\n  };\n\n  var name$3 = \"DC\";\n  var uri$3 = \"http://www.omg.org/spec/DD/20100524/DC\";\n  var prefix$3 = \"dc\";\n  var types$3 = [\n  \t{\n  \t\tname: \"Boolean\"\n  \t},\n  \t{\n  \t\tname: \"Integer\"\n  \t},\n  \t{\n  \t\tname: \"Real\"\n  \t},\n  \t{\n  \t\tname: \"String\"\n  \t},\n  \t{\n  \t\tname: \"Font\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\ttype: \"String\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"size\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isBold\",\n  \t\t\t\ttype: \"Boolean\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isItalic\",\n  \t\t\t\ttype: \"Boolean\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isUnderline\",\n  \t\t\t\ttype: \"Boolean\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isStrikeThrough\",\n  \t\t\t\ttype: \"Boolean\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Point\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"x\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\t\"default\": \"0\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"y\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\t\"default\": \"0\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Bounds\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"x\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\t\"default\": \"0\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"y\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\t\"default\": \"0\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"width\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"height\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var associations$3 = [\n  ];\n  var DcPackage = {\n  \tname: name$3,\n  \turi: uri$3,\n  \tprefix: prefix$3,\n  \ttypes: types$3,\n  \tassociations: associations$3\n  };\n\n  var name$2 = \"DI\";\n  var uri$2 = \"http://www.omg.org/spec/DD/20100524/DI\";\n  var prefix$2 = \"di\";\n  var types$2 = [\n  \t{\n  \t\tname: \"DiagramElement\",\n  \t\tisAbstract: true,\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"id\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisId: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extension\",\n  \t\t\t\ttype: \"Extension\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"owningDiagram\",\n  \t\t\t\ttype: \"Diagram\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"owningElement\",\n  \t\t\t\ttype: \"DiagramElement\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"modelElement\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"Element\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"style\",\n  \t\t\t\ttype: \"Style\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"ownedElement\",\n  \t\t\t\ttype: \"DiagramElement\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Node\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"DiagramElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Edge\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"DiagramElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"source\",\n  \t\t\t\ttype: \"DiagramElement\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"target\",\n  \t\t\t\ttype: \"DiagramElement\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"waypoint\",\n  \t\t\t\tisUnique: false,\n  \t\t\t\tisMany: true,\n  \t\t\t\ttype: \"dc:Point\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Diagram\",\n  \t\tisAbstract: true,\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"id\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisId: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"rootElement\",\n  \t\t\t\ttype: \"DiagramElement\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"documentation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"resolution\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Real\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"ownedStyle\",\n  \t\t\t\ttype: \"Style\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Shape\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Node\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"bounds\",\n  \t\t\t\ttype: \"dc:Bounds\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Plane\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Node\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"planeElement\",\n  \t\t\t\ttype: \"DiagramElement\",\n  \t\t\t\tsubsettedProperty: \"DiagramElement-ownedElement\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"LabeledEdge\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Edge\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"ownedLabel\",\n  \t\t\t\ttype: \"Label\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tsubsettedProperty: \"DiagramElement-ownedElement\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"LabeledShape\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Shape\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"ownedLabel\",\n  \t\t\t\ttype: \"Label\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tsubsettedProperty: \"DiagramElement-ownedElement\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Label\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Node\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"bounds\",\n  \t\t\t\ttype: \"dc:Bounds\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Style\",\n  \t\tisAbstract: true,\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"id\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisId: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Extension\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"values\",\n  \t\t\t\tisMany: true,\n  \t\t\t\ttype: \"Element\"\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var associations$2 = [\n  ];\n  var xml = {\n  \ttagAlias: \"lowerCase\"\n  };\n  var DiPackage = {\n  \tname: name$2,\n  \turi: uri$2,\n  \tprefix: prefix$2,\n  \ttypes: types$2,\n  \tassociations: associations$2,\n  \txml: xml\n  };\n\n  var name$1 = \"bpmn.io colors for BPMN\";\n  var uri$1 = \"http://bpmn.io/schema/bpmn/biocolor/1.0\";\n  var prefix$1 = \"bioc\";\n  var types$1 = [\n  \t{\n  \t\tname: \"ColoredShape\",\n  \t\t\"extends\": [\n  \t\t\t\"bpmndi:BPMNShape\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"stroke\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"fill\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ColoredEdge\",\n  \t\t\"extends\": [\n  \t\t\t\"bpmndi:BPMNEdge\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"stroke\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"fill\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var enumerations$1 = [\n  ];\n  var associations$1 = [\n  ];\n  var BiocPackage = {\n  \tname: name$1,\n  \turi: uri$1,\n  \tprefix: prefix$1,\n  \ttypes: types$1,\n  \tenumerations: enumerations$1,\n  \tassociations: associations$1\n  };\n\n  var name = \"BPMN in Color\";\n  var uri = \"http://www.omg.org/spec/BPMN/non-normative/color/1.0\";\n  var prefix = \"color\";\n  var types = [\n  \t{\n  \t\tname: \"ColoredLabel\",\n  \t\t\"extends\": [\n  \t\t\t\"bpmndi:BPMNLabel\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"color\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ColoredShape\",\n  \t\t\"extends\": [\n  \t\t\t\"bpmndi:BPMNShape\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"background-color\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"border-color\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ColoredEdge\",\n  \t\t\"extends\": [\n  \t\t\t\"bpmndi:BPMNEdge\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"border-color\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var enumerations = [\n  ];\n  var associations = [\n  ];\n  var BpmnInColorPackage = {\n  \tname: name,\n  \turi: uri,\n  \tprefix: prefix,\n  \ttypes: types,\n  \tenumerations: enumerations,\n  \tassociations: associations\n  };\n\n  var packages = {\n    bpmn: BpmnPackage,\n    bpmndi: BpmnDiPackage,\n    dc: DcPackage,\n    di: DiPackage,\n    bioc: BiocPackage,\n    color: BpmnInColorPackage\n  };\n\n  function simple(additionalPackages, options) {\n    var pks = assign$1({}, packages, additionalPackages);\n\n    return new BpmnModdle(pks, options);\n  }\n\n  function elementToString(e) {\n    if (!e) {\n      return '<null>';\n    }\n\n    return '<' + e.$type + (e.id ? ' id=\"' + e.id : '') + '\" />';\n  }\n\n  /**\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   */\n\n  // TODO(nikku): remove with future bpmn-js version\n\n  /**\n   * Wraps APIs to check:\n   *\n   * 1) If a callback is passed -> Warn users about callback deprecation.\n   * 2) If Promise class is implemented in current environment.\n   *\n   * @private\n   *\n   * @param {Function} api\n   *\n   * @return {Function}\n   */\n  function wrapForCompatibility(api) {\n\n    return function() {\n\n      if (!window.Promise) {\n        throw new Error('Promises is not supported in this environment. Please polyfill Promise.');\n      }\n\n      var argLen = arguments.length;\n      if (argLen >= 1 && isFunction(arguments[argLen - 1])) {\n\n        var callback = arguments[argLen - 1];\n\n        console.warn(new Error(\n          'Passing callbacks to ' + api.name + ' is deprecated and will be removed in a future major release. ' +\n          'Please switch to promises: https://bpmn.io/l/moving-to-promises.html'\n        ));\n\n        var argsWithoutCallback = Array.prototype.slice.call(arguments, 0, -1);\n\n        api.apply(this, argsWithoutCallback).then(function(result) {\n\n          var firstKey = Object.keys(result)[0];\n\n          // The APIs we are wrapping all resolve a single item depending on the API.\n          // For instance, importXML resolves { warnings } and saveXML returns { xml }.\n          // That's why we can call the callback with the first item of result.\n          return callback(null, result[firstKey]);\n\n          // Passing a second paramter instead of catch because we don't want to\n          // catch errors thrown by callback().\n        }, function(err) {\n\n          return callback(err, err.warnings);\n        });\n      } else {\n\n        return api.apply(this, arguments);\n      }\n    };\n  }\n\n\n  // TODO(nikku): remove with future bpmn-js version\n\n  var DI_ERROR_MESSAGE = 'Tried to access di from the businessObject. The di is available through the diagram element only. For more information, see https://github.com/bpmn-io/bpmn-js/issues/1472';\n\n  /**\n   * @private\n   *\n   * @param {ModdleElement} businessObject\n   */\n  function ensureCompatDiRef(businessObject) {\n\n    // bpmnElement can have multiple independent DIs\n    if (!has$1(businessObject, 'di')) {\n      Object.defineProperty(businessObject, 'di', {\n        enumerable: false,\n        get: function() {\n          throw new Error(DI_ERROR_MESSAGE);\n        }\n      });\n    }\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n   *\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   */\n\n  /**\n   * Returns true if an element is of the given meta-model type.\n   *\n   * @param {ModdleElement} element\n   * @param {string} type\n   *\n   * @return {boolean}\n   */\n  function is$2(element, type) {\n    return element.$instanceOf(type);\n  }\n\n\n  /**\n   * Find a suitable display candidate for definitions where the DI does not\n   * correctly specify one.\n   *\n   * @param {ModdleElement} definitions\n   *\n   * @return {ModdleElement}\n   */\n  function findDisplayCandidate(definitions) {\n    return find(definitions.rootElements, function(e) {\n      return is$2(e, 'bpmn:Process') || is$2(e, 'bpmn:Collaboration');\n    });\n  }\n\n  /**\n   * @param {Record<'element' | 'root' | 'error', Function>} handler\n   * @param {Translate} translate\n   */\n  function BpmnTreeWalker(handler, translate) {\n\n    // list of containers already walked\n    var handledElements = {};\n\n    // list of elements to handle deferred to ensure\n    // prerequisites are drawn\n    var deferred = [];\n\n    var diMap = {};\n\n    // Helpers //////////////////////\n\n    function contextual(fn, ctx) {\n      return function(e) {\n        fn(e, ctx);\n      };\n    }\n\n    function handled(element) {\n      handledElements[element.id] = element;\n    }\n\n    function isHandled(element) {\n      return handledElements[element.id];\n    }\n\n    function visit(element, ctx) {\n\n      var gfx = element.gfx;\n\n      // avoid multiple rendering of elements\n      if (gfx) {\n        throw new Error(\n          translate('already rendered {element}', { element: elementToString(element) })\n        );\n      }\n\n      // call handler\n      return handler.element(element, diMap[element.id], ctx);\n    }\n\n    function visitRoot(element, diagram) {\n      return handler.root(element, diMap[element.id], diagram);\n    }\n\n    function visitIfDi(element, ctx) {\n\n      try {\n        var gfx = diMap[element.id] && visit(element, ctx);\n\n        handled(element);\n\n        return gfx;\n      } catch (e) {\n        logError(e.message, { element: element, error: e });\n\n        console.error(translate('failed to import {element}', { element: elementToString(element) }));\n        console.error(e);\n      }\n    }\n\n    function logError(message, context) {\n      handler.error(message, context);\n    }\n\n    // DI handling //////////////////////\n\n    var registerDi = this.registerDi = function registerDi(di) {\n      var bpmnElement = di.bpmnElement;\n\n      if (bpmnElement) {\n        if (diMap[bpmnElement.id]) {\n          logError(\n            translate('multiple DI elements defined for {element}', {\n              element: elementToString(bpmnElement)\n            }),\n            { element: bpmnElement }\n          );\n        } else {\n          diMap[bpmnElement.id] = di;\n\n          ensureCompatDiRef(bpmnElement);\n        }\n      } else {\n        logError(\n          translate('no bpmnElement referenced in {element}', {\n            element: elementToString(di)\n          }),\n          { element: di }\n        );\n      }\n    };\n\n    function handleDiagram(diagram) {\n      handlePlane(diagram.plane);\n    }\n\n    function handlePlane(plane) {\n      registerDi(plane);\n\n      forEach$1(plane.planeElement, handlePlaneElement);\n    }\n\n    function handlePlaneElement(planeElement) {\n      registerDi(planeElement);\n    }\n\n\n    // Semantic handling //////////////////////\n\n    /**\n     * Handle definitions and return the rendered diagram (if any).\n     *\n     * @param {ModdleElement} definitions to walk and import\n     * @param {ModdleElement} [diagram] specific diagram to import and display\n     *\n     * @throws {Error} if no diagram to display could be found\n     */\n    this.handleDefinitions = function handleDefinitions(definitions, diagram) {\n\n      // make sure we walk the correct bpmnElement\n\n      var diagrams = definitions.diagrams;\n\n      if (diagram && diagrams.indexOf(diagram) === -1) {\n        throw new Error(translate('diagram not part of bpmn:Definitions'));\n      }\n\n      if (!diagram && diagrams && diagrams.length) {\n        diagram = diagrams[0];\n      }\n\n      // no diagram -> nothing to import\n      if (!diagram) {\n        throw new Error(translate('no diagram to display'));\n      }\n\n      // load DI from selected diagram only\n      diMap = {};\n      handleDiagram(diagram);\n\n\n      var plane = diagram.plane;\n\n      if (!plane) {\n        throw new Error(translate(\n          'no plane for {element}',\n          { element: elementToString(diagram) }\n        ));\n      }\n\n      var rootElement = plane.bpmnElement;\n\n      // ensure we default to a suitable display candidate (process or collaboration),\n      // even if non is specified in DI\n      if (!rootElement) {\n        rootElement = findDisplayCandidate(definitions);\n\n        if (!rootElement) {\n          throw new Error(translate('no process or collaboration to display'));\n        } else {\n\n          logError(\n            translate('correcting missing bpmnElement on {plane} to {rootElement}', {\n              plane: elementToString(plane),\n              rootElement: elementToString(rootElement)\n            })\n          );\n\n          // correct DI on the fly\n          plane.bpmnElement = rootElement;\n          registerDi(plane);\n        }\n      }\n\n\n      var ctx = visitRoot(rootElement, plane);\n\n      if (is$2(rootElement, 'bpmn:Process') || is$2(rootElement, 'bpmn:SubProcess')) {\n        handleProcess(rootElement, ctx);\n      } else if (is$2(rootElement, 'bpmn:Collaboration')) {\n        handleCollaboration(rootElement, ctx);\n\n        // force drawing of everything not yet drawn that is part of the target DI\n        handleUnhandledProcesses(definitions.rootElements, ctx);\n      } else {\n        throw new Error(\n          translate('unsupported bpmnElement for {plane}: {rootElement}', {\n            plane: elementToString(plane),\n            rootElement: elementToString(rootElement)\n          })\n        );\n      }\n\n      // handle all deferred elements\n      handleDeferred(deferred);\n    };\n\n    var handleDeferred = this.handleDeferred = function handleDeferred() {\n\n      var fn;\n\n      // drain deferred until empty\n      while (deferred.length) {\n        fn = deferred.shift();\n\n        fn();\n      }\n    };\n\n    function handleProcess(process, context) {\n      handleFlowElementsContainer(process, context);\n      handleIoSpecification(process.ioSpecification, context);\n\n      handleArtifacts(process.artifacts, context);\n\n      // log process handled\n      handled(process);\n    }\n\n    function handleUnhandledProcesses(rootElements, ctx) {\n\n      // walk through all processes that have not yet been drawn and draw them\n      // if they contain lanes with DI information.\n      // we do this to pass the free-floating lane test cases in the MIWG test suite\n      var processes = filter(rootElements, function(e) {\n        return !isHandled(e) && is$2(e, 'bpmn:Process') && e.laneSets;\n      });\n\n      processes.forEach(contextual(handleProcess, ctx));\n    }\n\n    function handleMessageFlow(messageFlow, context) {\n      visitIfDi(messageFlow, context);\n    }\n\n    function handleMessageFlows(messageFlows, context) {\n      forEach$1(messageFlows, contextual(handleMessageFlow, context));\n    }\n\n    function handleDataAssociation(association, context) {\n      visitIfDi(association, context);\n    }\n\n    function handleDataInput(dataInput, context) {\n      visitIfDi(dataInput, context);\n    }\n\n    function handleDataOutput(dataOutput, context) {\n      visitIfDi(dataOutput, context);\n    }\n\n    function handleArtifact(artifact, context) {\n\n      // bpmn:TextAnnotation\n      // bpmn:Group\n      // bpmn:Association\n\n      visitIfDi(artifact, context);\n    }\n\n    function handleArtifacts(artifacts, context) {\n\n      forEach$1(artifacts, function(e) {\n        if (is$2(e, 'bpmn:Association')) {\n          deferred.push(function() {\n            handleArtifact(e, context);\n          });\n        } else {\n          handleArtifact(e, context);\n        }\n      });\n    }\n\n    function handleIoSpecification(ioSpecification, context) {\n\n      if (!ioSpecification) {\n        return;\n      }\n\n      forEach$1(ioSpecification.dataInputs, contextual(handleDataInput, context));\n      forEach$1(ioSpecification.dataOutputs, contextual(handleDataOutput, context));\n    }\n\n    var handleSubProcess = this.handleSubProcess = function handleSubProcess(subProcess, context) {\n      handleFlowElementsContainer(subProcess, context);\n      handleArtifacts(subProcess.artifacts, context);\n    };\n\n    function handleFlowNode(flowNode, context) {\n      var childCtx = visitIfDi(flowNode, context);\n\n      if (is$2(flowNode, 'bpmn:SubProcess')) {\n        handleSubProcess(flowNode, childCtx || context);\n      }\n\n      if (is$2(flowNode, 'bpmn:Activity')) {\n        handleIoSpecification(flowNode.ioSpecification, context);\n      }\n\n      // defer handling of associations\n      // affected types:\n      //\n      //   * bpmn:Activity\n      //   * bpmn:ThrowEvent\n      //   * bpmn:CatchEvent\n      //\n      deferred.push(function() {\n        forEach$1(flowNode.dataInputAssociations, contextual(handleDataAssociation, context));\n        forEach$1(flowNode.dataOutputAssociations, contextual(handleDataAssociation, context));\n      });\n    }\n\n    function handleSequenceFlow(sequenceFlow, context) {\n      visitIfDi(sequenceFlow, context);\n    }\n\n    function handleDataElement(dataObject, context) {\n      visitIfDi(dataObject, context);\n    }\n\n    function handleLane(lane, context) {\n\n      deferred.push(function() {\n\n        var newContext = visitIfDi(lane, context);\n\n        if (lane.childLaneSet) {\n          handleLaneSet(lane.childLaneSet, newContext || context);\n        }\n\n        wireFlowNodeRefs(lane);\n      });\n    }\n\n    function handleLaneSet(laneSet, context) {\n      forEach$1(laneSet.lanes, contextual(handleLane, context));\n    }\n\n    function handleLaneSets(laneSets, context) {\n      forEach$1(laneSets, contextual(handleLaneSet, context));\n    }\n\n    function handleFlowElementsContainer(container, context) {\n      handleFlowElements(container.flowElements, context);\n\n      if (container.laneSets) {\n        handleLaneSets(container.laneSets, context);\n      }\n    }\n\n    function handleFlowElements(flowElements, context) {\n      forEach$1(flowElements, function(e) {\n        if (is$2(e, 'bpmn:SequenceFlow')) {\n          deferred.push(function() {\n            handleSequenceFlow(e, context);\n          });\n        } else if (is$2(e, 'bpmn:BoundaryEvent')) {\n          deferred.unshift(function() {\n            handleFlowNode(e, context);\n          });\n        } else if (is$2(e, 'bpmn:FlowNode')) {\n          handleFlowNode(e, context);\n        } else if (is$2(e, 'bpmn:DataObject')) ; else if (is$2(e, 'bpmn:DataStoreReference')) {\n          handleDataElement(e, context);\n        } else if (is$2(e, 'bpmn:DataObjectReference')) {\n          handleDataElement(e, context);\n        } else {\n          logError(\n            translate('unrecognized flowElement {element} in context {context}', {\n              element: elementToString(e),\n              context: (context ? elementToString(context.businessObject) : 'null')\n            }),\n            { element: e, context: context }\n          );\n        }\n      });\n    }\n\n    function handleParticipant(participant, context) {\n      var newCtx = visitIfDi(participant, context);\n\n      var process = participant.processRef;\n      if (process) {\n        handleProcess(process, newCtx || context);\n      }\n    }\n\n    function handleCollaboration(collaboration, context) {\n\n      forEach$1(collaboration.participants, contextual(handleParticipant, context));\n\n      handleArtifacts(collaboration.artifacts, context);\n\n      // handle message flows latest in the process\n      deferred.push(function() {\n        handleMessageFlows(collaboration.messageFlows, context);\n      });\n    }\n\n\n    function wireFlowNodeRefs(lane) {\n\n      // wire the virtual flowNodeRefs <-> relationship\n      forEach$1(lane.flowNodeRef, function(flowNode) {\n        var lanes = flowNode.get('lanes');\n\n        if (lanes) {\n          lanes.push(lane);\n        }\n      });\n    }\n  }\n\n  /**\n   * @typedef { import('../model/Types').Element } Element\n   * @typedef { import('../model/Types').ModdleElement } ModdleElement\n   */\n\n  /**\n   * Is an element of the given BPMN type?\n   *\n   * @param  {Element|ModdleElement} element\n   * @param  {string} type\n   *\n   * @return {boolean}\n   */\n  function is$1(element, type) {\n    var bo = getBusinessObject(element);\n\n    return bo && (typeof bo.$instanceOf === 'function') && bo.$instanceOf(type);\n  }\n\n\n  /**\n   * Return true if element has any of the given types.\n   *\n   * @param {Element|ModdleElement} element\n   * @param {string[]} types\n   *\n   * @return {boolean}\n   */\n  function isAny(element, types) {\n    return some(types, function(t) {\n      return is$1(element, t);\n    });\n  }\n\n  /**\n   * Return the business object for a given element.\n   *\n   * @param {Element|ModdleElement} element\n   *\n   * @return {ModdleElement}\n   */\n  function getBusinessObject(element) {\n    return (element && element.businessObject) || element;\n  }\n\n  /**\n   * Return the di object for a given element.\n   *\n   * @param {Element} element\n   *\n   * @return {ModdleElement}\n   */\n  function getDi(element) {\n    return element && element.di;\n  }\n\n  /**\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   *\n   * @typedef { {\n   *   warnings: string[];\n   * } } ImportBPMNDiagramResult\n   *\n   * @typedef {ImportBPMNDiagramResult & Error} ImportBPMNDiagramError\n   */\n\n  /**\n   * Import the definitions into a diagram.\n   *\n   * Errors and warnings are reported through the specified callback.\n   *\n   * @param {ModdleElement} diagram\n   * @param {ModdleElement} definitions\n   * @param {ModdleElement} [bpmnDiagram] The diagram to be rendered (if not\n   * provided, the first one will be rendered).\n   *\n   * @return {Promise<ImportBPMNDiagramResult>}\n   */\n  function importBpmnDiagram(diagram, definitions, bpmnDiagram) {\n\n    var importer,\n        eventBus,\n        translate,\n        canvas;\n\n    var error,\n        warnings = [];\n\n    /**\n     * Walk the diagram semantically, importing (=drawing)\n     * all elements you encounter.\n     *\n     * @param {ModdleElement} definitions\n     * @param {ModdleElement} bpmnDiagram\n     */\n    function render(definitions, bpmnDiagram) {\n\n      var visitor = {\n\n        root: function(element, di) {\n          return importer.add(element, di);\n        },\n\n        element: function(element, di, parentShape) {\n          return importer.add(element, di, parentShape);\n        },\n\n        error: function(message, context) {\n          warnings.push({ message: message, context: context });\n        }\n      };\n\n      var walker = new BpmnTreeWalker(visitor, translate);\n\n\n      bpmnDiagram = bpmnDiagram || (definitions.diagrams && definitions.diagrams[0]);\n\n      var diagramsToImport = getDiagramsToImport(definitions, bpmnDiagram);\n\n      if (!diagramsToImport) {\n        throw new Error(translate('no diagram to display'));\n      }\n\n      // traverse BPMN 2.0 document model,\n      // starting at definitions\n      forEach$1(diagramsToImport, function(diagram) {\n        walker.handleDefinitions(definitions, diagram);\n      });\n\n      var rootId = bpmnDiagram.plane.bpmnElement.id;\n\n      // we do need to account for different ways we create root elements\n      // each nested imported <root> do have the `_plane` suffix, while\n      // the root <root> is found under the business object ID\n      canvas.setRootElement(\n        canvas.findRoot(rootId + '_plane') || canvas.findRoot(rootId)\n      );\n    }\n\n    return new Promise(function(resolve, reject) {\n      try {\n        importer = diagram.get('bpmnImporter');\n        eventBus = diagram.get('eventBus');\n        translate = diagram.get('translate');\n        canvas = diagram.get('canvas');\n\n        eventBus.fire('import.render.start', { definitions: definitions });\n\n        render(definitions, bpmnDiagram);\n\n        eventBus.fire('import.render.complete', {\n          error: error,\n          warnings: warnings\n        });\n\n        return resolve({ warnings: warnings });\n      } catch (e) {\n\n        e.warnings = warnings;\n        return reject(e);\n      }\n    });\n  }\n\n  /**\n   * Returns all diagrams in the same hierarchy as the requested diagram.\n   * Includes all parent and sub process diagrams.\n   *\n   * @param {ModdleElement} definitions\n   * @param {ModdleElement} bpmnDiagram\n   *\n   * @return {ModdleElement[]}\n   */\n  function getDiagramsToImport(definitions, bpmnDiagram) {\n    if (!bpmnDiagram) {\n      return;\n    }\n\n    var bpmnElement = bpmnDiagram.plane.bpmnElement,\n        rootElement = bpmnElement;\n\n    if (!is$1(bpmnElement, 'bpmn:Process') && !is$1(bpmnElement, 'bpmn:Collaboration')) {\n      rootElement = findRootProcess(bpmnElement);\n    }\n\n    // in case the process is part of a collaboration, the plane references the\n    // collaboration, not the process\n    var collaboration;\n\n    if (is$1(rootElement, 'bpmn:Collaboration')) {\n      collaboration = rootElement;\n    } else {\n      collaboration = find(definitions.rootElements, function(element) {\n        if (!is$1(element, 'bpmn:Collaboration')) {\n          return;\n        }\n\n        return find(element.participants, function(participant) {\n          return participant.processRef === rootElement;\n        });\n      });\n    }\n\n    var rootElements = [ rootElement ];\n\n    // all collaboration processes can contain sub-diagrams\n    if (collaboration) {\n      rootElements = map$1(collaboration.participants, function(participant) {\n        return participant.processRef;\n      });\n\n      rootElements.push(collaboration);\n    }\n\n    var allChildren = selfAndAllFlowElements(rootElements);\n\n    // if we have multiple diagrams referencing the same element, we\n    // use the first in the file\n    var diagramsToImport = [ bpmnDiagram ];\n    var handledElements = [ bpmnElement ];\n\n    forEach$1(definitions.diagrams, function(diagram) {\n      var businessObject = diagram.plane.bpmnElement;\n\n      if (\n        allChildren.indexOf(businessObject) !== -1 &&\n        handledElements.indexOf(businessObject) === -1\n      ) {\n        diagramsToImport.push(diagram);\n        handledElements.push(businessObject);\n      }\n    });\n\n\n    return diagramsToImport;\n  }\n\n  function selfAndAllFlowElements(elements) {\n    var result = [];\n\n    forEach$1(elements, function(element) {\n      if (!element) {\n        return;\n      }\n\n      result.push(element);\n\n      result = result.concat(selfAndAllFlowElements(element.flowElements));\n    });\n\n    return result;\n  }\n\n  function findRootProcess(element) {\n    var parent = element;\n\n    while (parent) {\n      if (is$1(parent, 'bpmn:Process')) {\n        return parent;\n      }\n\n      parent = parent.$parent;\n    }\n  }\n\n  /**\n   * This file must not be changed or exchanged.\n   *\n   * @see http://bpmn.io/license for more information.\n   */\n\n\n  // inlined ../../resources/logo.svg\n  var BPMNIO_LOGO_SVG = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 14.02 5.57\" width=\"53\" height=\"21\"><path fill=\"currentColor\" d=\"M1.88.92v.14c0 .41-.13.68-.4.8.33.14.46.44.46.86v.33c0 .61-.33.95-.95.95H0V0h.95c.65 0 .93.3.93.92zM.63.57v1.06h.24c.24 0 .38-.1.38-.43V.98c0-.28-.1-.4-.32-.4zm0 1.63v1.22h.36c.2 0 .32-.1.32-.39v-.35c0-.37-.12-.48-.4-.48H.63zM4.18.99v.52c0 .64-.31.98-.94.98h-.3V4h-.62V0h.92c.63 0 .94.35.94.99zM2.94.57v1.35h.3c.2 0 .3-.09.3-.37v-.6c0-.29-.1-.38-.3-.38h-.3zm2.89 2.27L6.25 0h.88v4h-.6V1.12L6.1 3.99h-.6l-.46-2.82v2.82h-.55V0h.87zM8.14 1.1V4h-.56V0h.79L9 2.4V0h.56v4h-.64zm2.49 2.29v.6h-.6v-.6zM12.12 1c0-.63.33-1 .95-1 .61 0 .95.37.95 1v2.04c0 .64-.34 1-.95 1-.62 0-.95-.37-.95-1zm.62 2.08c0 .28.13.39.33.39s.32-.1.32-.4V.98c0-.29-.12-.4-.32-.4s-.33.11-.33.4z\"/><path fill=\"currentColor\" d=\"M0 4.53h14.02v1.04H0zM11.08 0h.63v.62h-.63zm.63 4V1h-.63v2.98z\"/></svg>';\n\n  var BPMNIO_IMG = BPMNIO_LOGO_SVG;\n\n  var LOGO_STYLES = {\n    verticalAlign: 'middle'\n  };\n\n  var LINK_STYLES = {\n    'color': '#404040'\n  };\n\n  var LIGHTBOX_STYLES = {\n    'zIndex': '1001',\n    'position': 'fixed',\n    'top': '0',\n    'left': '0',\n    'right': '0',\n    'bottom': '0'\n  };\n\n  var BACKDROP_STYLES = {\n    'width': '100%',\n    'height': '100%',\n    'background': 'rgba(40,40,40,0.2)'\n  };\n\n  var NOTICE_STYLES = {\n    'position': 'absolute',\n    'left': '50%',\n    'top': '40%',\n    'transform': 'translate(-50%)',\n    'width': '260px',\n    'padding': '10px',\n    'background': 'white',\n    'boxShadow': '0 1px 4px rgba(0,0,0,0.3)',\n    'fontFamily': 'Helvetica, Arial, sans-serif',\n    'fontSize': '14px',\n    'display': 'flex',\n    'lineHeight': '1.3'\n  };\n\n  var LIGHTBOX_MARKUP =\n    '<div class=\"bjs-powered-by-lightbox\">' +\n      '<div class=\"backdrop\"></div>' +\n      '<div class=\"notice\">' +\n        '<a href=\"https://bpmn.io\" target=\"_blank\" rel=\"noopener\" class=\"link\">' +\n          BPMNIO_IMG +\n        '</a>' +\n        '<span>' +\n          'Web-based tooling for BPMN, DMN and forms ' +\n          'powered by <a href=\"https://bpmn.io\" target=\"_blank\" rel=\"noopener\">bpmn.io</a>.' +\n        '</span>' +\n      '</div>' +\n    '</div>';\n\n\n  var lightbox;\n\n  function createLightbox() {\n    lightbox = domify$1(LIGHTBOX_MARKUP);\n\n    assign(lightbox, LIGHTBOX_STYLES);\n    assign(query('svg', lightbox), LOGO_STYLES);\n    assign(query('.backdrop', lightbox), BACKDROP_STYLES);\n    assign(query('.notice', lightbox), NOTICE_STYLES);\n    assign(query('.link', lightbox), LINK_STYLES, {\n      'margin': '15px 20px 15px 10px',\n      'alignSelf': 'center'\n    });\n  }\n\n  function open() {\n\n    if (!lightbox) {\n      createLightbox();\n\n      delegate.bind(lightbox, '.backdrop', 'click', function(event) {\n        document.body.removeChild(lightbox);\n      });\n    }\n\n    document.body.appendChild(lightbox);\n  }\n\n  /**\n   * The code in the <project-logo></project-logo> area\n   * must not be changed.\n   *\n   * @see http://bpmn.io/license for more information.\n   */\n\n  /**\n   * @template T\n   *\n   * @typedef {import('diagram-js/lib/core/EventBus').EventBusEventCallback<T>} EventBusEventCallback\n   */\n\n  /**\n   * @typedef {import('didi').ModuleDeclaration} ModuleDeclaration\n   *\n   * @typedef {import('./model/Types').Moddle} Moddle\n   * @typedef {import('./model/Types').ModdleElement} ModdleElement\n   * @typedef {import('./model/Types').ModdleExtension} ModdleExtension\n   *\n   * @typedef { {\n   *   width?: number|string;\n   *   height?: number|string;\n   *   position?: string;\n   *   container?: string|HTMLElement;\n   *   moddleExtensions?: ModdleExtensions;\n   *   additionalModules?: ModuleDeclaration[];\n   * } & Record<string, any> } BaseViewerOptions\n   *\n   * @typedef {Record<string, ModdleElement>} ModdleElementsById\n   *\n   * @typedef { {\n   *   [key: string]: ModdleExtension;\n   * } } ModdleExtensions\n   *\n   * @typedef { {\n   *   warnings: string[];\n   * } } ImportXMLResult\n   *\n   * @typedef {ImportXMLResult & Error} ImportXMLError\n   *\n   * @typedef {ImportXMLResult} ImportDefinitionsResult\n   *\n   * @typedef {ImportXMLError} ImportDefinitionsError\n   *\n   * @typedef {ImportXMLResult} OpenResult\n   *\n   * @typedef {ImportXMLError} OpenError\n   *\n   * @typedef { {\n   *   format?: boolean;\n   *   preamble?: boolean;\n   * } } SaveXMLOptions\n   *\n   * @typedef { {\n   *   xml?: string;\n   *   error?: Error;\n   * } } SaveXMLResult\n   *\n   * @typedef { {\n   *   svg: string;\n   * } } SaveSVGResult\n   *\n   * @typedef { {\n   *   xml: string;\n   * } } ImportParseStartEvent\n   *\n   * @typedef { {\n   *   error?: ImportXMLError;\n   *   definitions?: ModdleElement;\n   *   elementsById?: ModdleElementsById;\n   *   references?: ModdleElement[];\n   *   warnings: string[];\n   * } } ImportParseCompleteEvent\n   *\n   * @typedef { {\n   *   error?: ImportXMLError;\n   *   warnings: string[];\n   * } } ImportDoneEvent\n   *\n   * @typedef { {\n   *   definitions: ModdleElement;\n   * } } SaveXMLStartEvent\n   *\n   * @typedef {SaveXMLResult} SaveXMLDoneEvent\n   *\n   * @typedef { {\n   *   error?: Error;\n   *   svg: string;\n   * } } SaveSVGDoneEvent\n   */\n\n  /**\n   * A base viewer for BPMN 2.0 diagrams.\n   *\n   * Have a look at {@link Viewer}, {@link NavigatedViewer} or {@link Modeler} for\n   * bundles that include actual features.\n   *\n   * @param {BaseViewerOptions} [options] The options to configure the viewer.\n   */\n  function BaseViewer(options) {\n\n    /**\n     * @type {BaseViewerOptions}\n     */\n    options = assign$1({}, DEFAULT_OPTIONS, options);\n\n    /**\n     * @type {Moddle}\n     */\n    this._moddle = this._createModdle(options);\n\n    /**\n     * @type {HTMLElement}\n     */\n    this._container = this._createContainer(options);\n\n    /* <project-logo> */\n\n    addProjectLogo(this._container);\n\n    /* </project-logo> */\n\n    this._init(this._container, this._moddle, options);\n  }\n\n  e$3(BaseViewer, Diagram);\n\n  /**\n   * Parse and render a BPMN 2.0 diagram.\n   *\n   * Once finished the viewer reports back the result to the\n   * provided callback function with (err, warnings).\n   *\n   * ## Life-Cycle Events\n   *\n   * During import the viewer will fire life-cycle events:\n   *\n   *   * import.parse.start (about to read model from XML)\n   *   * import.parse.complete (model read; may have worked or not)\n   *   * import.render.start (graphical import start)\n   *   * import.render.complete (graphical import finished)\n   *   * import.done (everything done)\n   *\n   * You can use these events to hook into the life-cycle.\n   *\n   * @throws {ImportXMLError} An error thrown during the import of the XML.\n   *\n   * @fires BaseViewer#ImportParseStartEvent\n   * @fires BaseViewer#ImportParseCompleteEvent\n   * @fires Importer#ImportRenderStartEvent\n   * @fires Importer#ImportRenderCompleteEvent\n   * @fires BaseViewer#ImportDoneEvent\n   *\n   * @param {string} xml The BPMN 2.0 XML to be imported.\n   * @param {ModdleElement|string} [bpmnDiagram] The optional diagram or Id of the BPMN diagram to open.\n   *\n   * @return {Promise<ImportXMLResult>} A promise resolving with warnings that were produced during the import.\n   */\n  BaseViewer.prototype.importXML = async function importXML(xml, bpmnDiagram) {\n\n    const self = this;\n\n    function ParseCompleteEvent(data) {\n\n      const event = self.get('eventBus').createEvent(data);\n\n      // TODO(nikku): remove with future bpmn-js version\n      Object.defineProperty(event, 'context', {\n        enumerable: true,\n        get: function() {\n\n          console.warn(new Error(\n            'import.parse.complete <context> is deprecated ' +\n            'and will be removed in future library versions'\n          ));\n\n          return {\n            warnings: data.warnings,\n            references: data.references,\n            elementsById: data.elementsById\n          };\n        }\n      });\n\n      return event;\n    }\n\n    let aggregatedWarnings = [];\n    try {\n\n      // hook in pre-parse listeners +\n      // allow xml manipulation\n\n      /**\n       * A `import.parse.start` event.\n       *\n       * @event BaseViewer#ImportParseStartEvent\n       * @type {ImportParseStartEvent}\n       */\n      xml = this._emit('import.parse.start', { xml: xml }) || xml;\n\n      let parseResult;\n      try {\n        parseResult = await this._moddle.fromXML(xml, 'bpmn:Definitions');\n      } catch (error) {\n        this._emit('import.parse.complete', {\n          error\n        });\n\n        throw error;\n      }\n\n      let definitions = parseResult.rootElement;\n      const references = parseResult.references;\n      const parseWarnings = parseResult.warnings;\n      const elementsById = parseResult.elementsById;\n\n      aggregatedWarnings = aggregatedWarnings.concat(parseWarnings);\n\n      // hook in post parse listeners +\n      // allow definitions manipulation\n\n      /**\n       * A `import.parse.complete` event.\n       *\n       * @event BaseViewer#ImportParseCompleteEvent\n       * @type {ImportParseCompleteEvent}\n       */\n      definitions = this._emit('import.parse.complete', ParseCompleteEvent({\n        error: null,\n        definitions: definitions,\n        elementsById: elementsById,\n        references: references,\n        warnings: aggregatedWarnings\n      })) || definitions;\n\n      const importResult = await this.importDefinitions(definitions, bpmnDiagram);\n\n      aggregatedWarnings = aggregatedWarnings.concat(importResult.warnings);\n\n      /**\n       * A `import.parse.complete` event.\n       *\n       * @event BaseViewer#ImportDoneEvent\n       * @type {ImportDoneEvent}\n       */\n      this._emit('import.done', { error: null, warnings: aggregatedWarnings });\n\n      return { warnings: aggregatedWarnings };\n    } catch (err) {\n      let error = err;\n      aggregatedWarnings = aggregatedWarnings.concat(error.warnings || []);\n      addWarningsToError(error, aggregatedWarnings);\n\n      error = checkValidationError(error);\n\n      this._emit('import.done', { error, warnings: error.warnings });\n\n      throw error;\n    }\n  };\n\n  BaseViewer.prototype.importXML = wrapForCompatibility(BaseViewer.prototype.importXML);\n\n\n  /**\n   * Import parsed definitions and render a BPMN 2.0 diagram.\n   *\n   * Once finished the viewer reports back the result to the\n   * provided callback function with (err, warnings).\n   *\n   * ## Life-Cycle Events\n   *\n   * During import the viewer will fire life-cycle events:\n   *\n   *   * import.render.start (graphical import start)\n   *   * import.render.complete (graphical import finished)\n   *\n   * You can use these events to hook into the life-cycle.\n   *\n   * @throws {ImportDefinitionsError} An error thrown during the import of the definitions.\n   *\n   * @param {ModdleElement} definitions The definitions.\n   * @param {ModdleElement|string} [bpmnDiagram] The optional diagram or ID of the BPMN diagram to open.\n   *\n   * @return {Promise<ImportDefinitionsResult>} A promise resolving with warnings that were produced during the import.\n   */\n  BaseViewer.prototype.importDefinitions = async function importDefinitions(definitions, bpmnDiagram) {\n    this._setDefinitions(definitions);\n    const result = await this.open(bpmnDiagram);\n\n    return { warnings: result.warnings };\n  };\n\n  BaseViewer.prototype.importDefinitions = wrapForCompatibility(BaseViewer.prototype.importDefinitions);\n\n\n  /**\n   * Open diagram of previously imported XML.\n   *\n   * Once finished the viewer reports back the result to the\n   * provided callback function with (err, warnings).\n   *\n   * ## Life-Cycle Events\n   *\n   * During switch the viewer will fire life-cycle events:\n   *\n   *   * import.render.start (graphical import start)\n   *   * import.render.complete (graphical import finished)\n   *\n   * You can use these events to hook into the life-cycle.\n   *\n   * @throws {OpenError} An error thrown during opening.\n   *\n   * @param {ModdleElement|string} bpmnDiagramOrId The diagram or Id of the BPMN diagram to open.\n   *\n   * @return {Promise<OpenResult>} A promise resolving with warnings that were produced during opening.\n   */\n  BaseViewer.prototype.open = async function open(bpmnDiagramOrId) {\n\n    const definitions = this._definitions;\n    let bpmnDiagram = bpmnDiagramOrId;\n\n    if (!definitions) {\n      const error = new Error('no XML imported');\n      addWarningsToError(error, []);\n\n      throw error;\n    }\n\n    if (typeof bpmnDiagramOrId === 'string') {\n      bpmnDiagram = findBPMNDiagram(definitions, bpmnDiagramOrId);\n\n      if (!bpmnDiagram) {\n        const error = new Error('BPMNDiagram <' + bpmnDiagramOrId + '> not found');\n        addWarningsToError(error, []);\n\n        throw error;\n      }\n    }\n\n    // clear existing rendered diagram\n    // catch synchronous exceptions during #clear()\n    try {\n      this.clear();\n    } catch (error) {\n      addWarningsToError(error, []);\n\n      throw error;\n    }\n\n    // perform graphical import\n    const { warnings } = await importBpmnDiagram(this, definitions, bpmnDiagram);\n\n    return { warnings };\n  };\n\n  BaseViewer.prototype.open = wrapForCompatibility(BaseViewer.prototype.open);\n\n  /**\n   * Export the currently displayed BPMN 2.0 diagram as\n   * a BPMN 2.0 XML document.\n   *\n   * ## Life-Cycle Events\n   *\n   * During XML saving the viewer will fire life-cycle events:\n   *\n   *   * saveXML.start (before serialization)\n   *   * saveXML.serialized (after xml generation)\n   *   * saveXML.done (everything done)\n   *\n   * You can use these events to hook into the life-cycle.\n   *\n   * @throws {Error} An error thrown during export.\n   *\n   * @fires BaseViewer#SaveXMLStart\n   * @fires BaseViewer#SaveXMLDone\n   *\n   * @param {SaveXMLOptions} [options] The options.\n   *\n   * @return {Promise<SaveXMLResult>} A promise resolving with the XML.\n   */\n  BaseViewer.prototype.saveXML = async function saveXML(options) {\n\n    options = options || {};\n\n    let definitions = this._definitions,\n        error, xml;\n\n    try {\n      if (!definitions) {\n        throw new Error('no definitions loaded');\n      }\n\n      // allow to fiddle around with definitions\n\n      /**\n       * A `saveXML.start` event.\n       *\n       * @event BaseViewer#SaveXMLStartEvent\n       * @type {SaveXMLStartEvent}\n       */\n      definitions = this._emit('saveXML.start', {\n        definitions\n      }) || definitions;\n\n      const result = await this._moddle.toXML(definitions, options);\n      xml = result.xml;\n\n      xml = this._emit('saveXML.serialized', {\n        xml\n      }) || xml;\n    } catch (err) {\n      error = err;\n    }\n\n    const result = error ? { error } : { xml };\n\n    /**\n     * A `saveXML.done` event.\n     *\n     * @event BaseViewer#SaveXMLDoneEvent\n     * @type {SaveXMLDoneEvent}\n     */\n    this._emit('saveXML.done', result);\n\n    if (error) {\n      throw error;\n    }\n\n    return result;\n  };\n\n  BaseViewer.prototype.saveXML = wrapForCompatibility(BaseViewer.prototype.saveXML);\n\n\n  /**\n   * Export the currently displayed BPMN 2.0 diagram as\n   * an SVG image.\n   *\n   * ## Life-Cycle Events\n   *\n   * During SVG saving the viewer will fire life-cycle events:\n   *\n   *   * saveSVG.start (before serialization)\n   *   * saveSVG.done (everything done)\n   *\n   * You can use these events to hook into the life-cycle.\n   *\n   * @throws {Error} An error thrown during export.\n   *\n   * @fires BaseViewer#SaveSVGDone\n   *\n   * @return {Promise<SaveSVGResult>} A promise resolving with the SVG.\n   */\n  BaseViewer.prototype.saveSVG = async function saveSVG() {\n    this._emit('saveSVG.start');\n\n    let svg, err;\n\n    try {\n      const canvas = this.get('canvas');\n\n      const contentNode = canvas.getActiveLayer(),\n            defsNode = query('defs', canvas._svg);\n\n      const contents = innerSVG(contentNode),\n            defs = defsNode ? '<defs>' + innerSVG(defsNode) + '</defs>' : '';\n\n      const bbox = contentNode.getBBox();\n\n      svg =\n        '<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n' +\n        '<!-- created with bpmn-js / http://bpmn.io -->\\n' +\n        '<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n' +\n        '<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" ' +\n        'width=\"' + bbox.width + '\" height=\"' + bbox.height + '\" ' +\n        'viewBox=\"' + bbox.x + ' ' + bbox.y + ' ' + bbox.width + ' ' + bbox.height + '\" version=\"1.1\">' +\n        defs + contents +\n        '</svg>';\n    } catch (e) {\n      err = e;\n    }\n\n    /**\n     * A `saveSVG.done` event.\n     *\n     * @event BaseViewer#SaveSVGDoneEvent\n     * @type {SaveSVGDoneEvent}\n     */\n    this._emit('saveSVG.done', {\n      error: err,\n      svg: svg\n    });\n\n    if (err) {\n      throw err;\n    }\n\n    return { svg };\n  };\n\n  BaseViewer.prototype.saveSVG = wrapForCompatibility(BaseViewer.prototype.saveSVG);\n\n  /**\n   * Get a named diagram service.\n   *\n   * @example\n   *\n   * const elementRegistry = viewer.get('elementRegistry');\n   * const startEventShape = elementRegistry.get('StartEvent_1');\n   *\n   * @param {string} name\n   *\n   * @return {Object} diagram service instance\n   *\n   * @method BaseViewer#get\n   */\n\n  /**\n   * Invoke a function in the context of this viewer.\n   *\n   * @example\n   *\n   * viewer.invoke(function(elementRegistry) {\n   *   const startEventShape = elementRegistry.get('StartEvent_1');\n   * });\n   *\n   * @param {Function} fn to be invoked\n   *\n   * @return {Object} the functions return value\n   *\n   * @method BaseViewer#invoke\n   */\n\n\n  BaseViewer.prototype._setDefinitions = function(definitions) {\n    this._definitions = definitions;\n  };\n\n  /**\n   * Return modules to instantiate with.\n   *\n   * @return {ModuleDeclaration[]} The modules.\n   */\n  BaseViewer.prototype.getModules = function() {\n    return this._modules;\n  };\n\n  /**\n   * Remove all drawn elements from the viewer.\n   *\n   * After calling this method the viewer can still be reused for opening another\n   * diagram.\n   */\n  BaseViewer.prototype.clear = function() {\n    if (!this.getDefinitions()) {\n\n      // no diagram to clear\n      return;\n    }\n\n    // remove drawn elements\n    Diagram.prototype.clear.call(this);\n  };\n\n  /**\n   * Destroy the viewer instance and remove all its remainders from the document\n   * tree.\n   */\n  BaseViewer.prototype.destroy = function() {\n\n    // diagram destroy\n    Diagram.prototype.destroy.call(this);\n\n    // dom detach\n    remove$2(this._container);\n  };\n\n  /**\n   * Register an event listener.\n   *\n   * Remove an event listener via {@link BaseViewer#off}.\n   *\n   * @template T\n   *\n   * @param {string|string[]} events The event(s) to listen to.\n   * @param {number} [priority] The priority with which to listen.\n   * @param {EventBusEventCallback<T>} callback The callback.\n   * @param {any} [that] Value of `this` the callback will be called with.\n   */\n  BaseViewer.prototype.on = function(events, priority, callback, that) {\n    return this.get('eventBus').on(events, priority, callback, that);\n  };\n\n  /**\n   * Remove an event listener.\n   *\n   * @param {string|string[]} events The event(s).\n   * @param {Function} [callback] The callback.\n   */\n  BaseViewer.prototype.off = function(events, callback) {\n    this.get('eventBus').off(events, callback);\n  };\n\n  /**\n   * Attach the viewer to an HTML element.\n   *\n   * @param {HTMLElement} parentNode The parent node to attach to.\n   */\n  BaseViewer.prototype.attachTo = function(parentNode) {\n\n    if (!parentNode) {\n      throw new Error('parentNode required');\n    }\n\n    // ensure we detach from the\n    // previous, old parent\n    this.detach();\n\n    // unwrap jQuery if provided\n    if (parentNode.get && parentNode.constructor.prototype.jquery) {\n      parentNode = parentNode.get(0);\n    }\n\n    if (typeof parentNode === 'string') {\n      parentNode = query(parentNode);\n    }\n\n    parentNode.appendChild(this._container);\n\n    this._emit('attach', {});\n\n    this.get('canvas').resized();\n  };\n\n  /**\n   * Get the definitions model element.\n   *\n   * @return {ModdleElement} The definitions model element.\n   */\n  BaseViewer.prototype.getDefinitions = function() {\n    return this._definitions;\n  };\n\n  /**\n   * Detach the viewer.\n   *\n   * @fires BaseViewer#DetachEvent\n   */\n  BaseViewer.prototype.detach = function() {\n\n    const container = this._container,\n          parentNode = container.parentNode;\n\n    if (!parentNode) {\n      return;\n    }\n\n    /**\n     * A `detach` event.\n     *\n     * @event BaseViewer#DetachEvent\n     * @type {Object}\n     */\n    this._emit('detach', {});\n\n    parentNode.removeChild(container);\n  };\n\n  BaseViewer.prototype._init = function(container, moddle, options) {\n\n    const baseModules = options.modules || this.getModules(options),\n          additionalModules = options.additionalModules || [],\n          staticModules = [\n            {\n              bpmnjs: [ 'value', this ],\n              moddle: [ 'value', moddle ]\n            }\n          ];\n\n    const diagramModules = [].concat(staticModules, baseModules, additionalModules);\n\n    const diagramOptions = assign$1(omit(options, [ 'additionalModules' ]), {\n      canvas: assign$1({}, options.canvas, { container: container }),\n      modules: diagramModules\n    });\n\n    // invoke diagram constructor\n    Diagram.call(this, diagramOptions);\n\n    if (options && options.container) {\n      this.attachTo(options.container);\n    }\n  };\n\n  /**\n   * Emit an event on the underlying {@link EventBus}\n   *\n   * @param  {string} type\n   * @param  {Object} event\n   *\n   * @return {Object} The return value after calling all event listeners.\n   */\n  BaseViewer.prototype._emit = function(type, event) {\n    return this.get('eventBus').fire(type, event);\n  };\n\n  /**\n   * @param {BaseViewerOptions} options\n   *\n   * @return {HTMLElement}\n   */\n  BaseViewer.prototype._createContainer = function(options) {\n\n    const container = domify$1('<div class=\"bjs-container\"></div>');\n\n    assign(container, {\n      width: ensureUnit(options.width),\n      height: ensureUnit(options.height),\n      position: options.position\n    });\n\n    return container;\n  };\n\n  /**\n   * @param {BaseViewerOptions} options\n   *\n   * @return {Moddle}\n   */\n  BaseViewer.prototype._createModdle = function(options) {\n    const moddleOptions = assign$1({}, this._moddleExtensions, options.moddleExtensions);\n\n    return new simple(moddleOptions);\n  };\n\n  BaseViewer.prototype._modules = [];\n\n  // helpers ///////////////\n\n  function addWarningsToError(err, warningsAry) {\n    err.warnings = warningsAry;\n    return err;\n  }\n\n  function checkValidationError(err) {\n\n    // check if we can help the user by indicating wrong BPMN 2.0 xml\n    // (in case he or the exporting tool did not get that right)\n\n    const pattern = /unparsable content <([^>]+)> detected([\\s\\S]*)$/;\n    const match = pattern.exec(err.message);\n\n    if (match) {\n      err.message =\n        'unparsable content <' + match[1] + '> detected; ' +\n        'this may indicate an invalid BPMN 2.0 diagram file' + match[2];\n    }\n\n    return err;\n  }\n\n  const DEFAULT_OPTIONS = {\n    width: '100%',\n    height: '100%',\n    position: 'relative'\n  };\n\n\n  /**\n   * Ensure the passed argument is a proper unit (defaulting to px)\n   */\n  function ensureUnit(val) {\n    return val + (isNumber(val) ? 'px' : '');\n  }\n\n\n  /**\n   * Find BPMNDiagram in definitions by ID\n   *\n   * @param {ModdleElement<Definitions>} definitions\n   * @param {string} diagramId\n   *\n   * @return {ModdleElement<BPMNDiagram>|null}\n   */\n  function findBPMNDiagram(definitions, diagramId) {\n    if (!diagramId) {\n      return null;\n    }\n\n    return find(definitions.diagrams, function(element) {\n      return element.id === diagramId;\n    }) || null;\n  }\n\n  /**\n   * Adds the project logo to the diagram container as\n   * required by the bpmn.io license.\n   *\n   * @see http://bpmn.io/license\n   *\n   * @param {Element} container\n   */\n  function addProjectLogo(container) {\n    const img = BPMNIO_IMG;\n\n    const linkMarkup =\n      '<a href=\"http://bpmn.io\" ' +\n      'target=\"_blank\" ' +\n      'class=\"bjs-powered-by\" ' +\n      'title=\"Powered by bpmn.io\" ' +\n      '>' +\n      img +\n      '</a>';\n\n    const linkElement = domify$1(linkMarkup);\n\n    assign(query('svg', linkElement), LOGO_STYLES);\n    assign(linkElement, LINK_STYLES, {\n      position: 'absolute',\n      bottom: '15px',\n      right: '15px',\n      zIndex: '100'\n    });\n\n    container.appendChild(linkElement);\n\n    event.bind(linkElement, 'click', function(event) {\n      open();\n\n      event.preventDefault();\n    });\n  }\n\n  /* </project-logo> */\n\n  /**\n   * @typedef {import('./BaseViewer').BaseViewerOptions} BaseViewerOptions\n   * @typedef {import('./BaseViewer').ModdleElementsById} ModdleElementsById\n   *\n   * @typedef {import('./model/Types').ModdleElement} ModdleElement\n   */\n\n  /**\n   * A base modeler for BPMN 2.0 diagrams.\n   *\n   * See {@link Modeler} for a fully-featured modeler.\n   *\n   * @param {BaseViewerOptions} [options] The options to configure the modeler.\n   */\n  function BaseModeler(options) {\n    BaseViewer.call(this, options);\n\n    // hook ID collection into the modeler\n    this.on('import.parse.complete', function(event) {\n      if (!event.error) {\n        this._collectIds(event.definitions, event.elementsById);\n      }\n    }, this);\n\n    this.on('diagram.destroy', function() {\n      this.get('moddle').ids.clear();\n    }, this);\n  }\n\n  e$3(BaseModeler, BaseViewer);\n\n\n  /**\n   * Create a moddle instance, attaching IDs to it.\n   *\n   * @param {BaseViewerOptions} options\n   *\n   * @return {Moddle}\n   */\n  BaseModeler.prototype._createModdle = function(options) {\n    var moddle = BaseViewer.prototype._createModdle.call(this, options);\n\n    // attach ids to moddle to be able to track and validated ids in the BPMN 2.0\n    // XML document tree\n    moddle.ids = new Ids([ 32, 36, 1 ]);\n\n    return moddle;\n  };\n\n  /**\n   * Collect IDs processed during parsing of the definitions object.\n   *\n   * @param {ModdleElement} definitions\n   * @param {ModdleElementsById} elementsById\n   */\n  BaseModeler.prototype._collectIds = function(definitions, elementsById) {\n\n    var moddle = definitions.$model,\n        ids = moddle.ids,\n        id;\n\n    // remove references from previous import\n    ids.clear();\n\n    for (id in elementsById) {\n      ids.claim(id, elementsById[ id ]);\n    }\n  };\n\n  /**\n   * @typedef {import('../model/Types').Element} Element\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   */\n\n  /**\n   * @param {Element} element\n   * @param {ModdleElement} [di]\n   *\n   * @return {boolean}\n   */\n  function isExpanded(element, di) {\n\n    if (is$1(element, 'bpmn:CallActivity')) {\n      return false;\n    }\n\n    if (is$1(element, 'bpmn:SubProcess')) {\n      di = di || getDi(element);\n\n      if (di && is$1(di, 'bpmndi:BPMNPlane')) {\n        return true;\n      }\n\n      return di && !!di.isExpanded;\n    }\n\n    if (is$1(element, 'bpmn:Participant')) {\n      return !!getBusinessObject(element).processRef;\n    }\n\n    return true;\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isInterrupting(element) {\n    return element && getBusinessObject(element).isInterrupting !== false;\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isEventSubProcess(element) {\n    return element && !!getBusinessObject(element).triggeredByEvent;\n  }\n\n  /**\n   * @param {Element} element\n   * @param {string} eventType\n   *\n   * @return {boolean}\n   */\n  function hasEventDefinition$2(element, eventType) {\n    var eventDefinitions = getBusinessObject(element).eventDefinitions;\n\n    return some(eventDefinitions, function(event) {\n      return is$1(event, eventType);\n    });\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function hasErrorEventDefinition(element) {\n    return hasEventDefinition$2(element, 'bpmn:ErrorEventDefinition');\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function hasEscalationEventDefinition(element) {\n    return hasEventDefinition$2(element, 'bpmn:EscalationEventDefinition');\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function hasCompensateEventDefinition(element) {\n    return hasEventDefinition$2(element, 'bpmn:CompensateEventDefinition');\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/util/Types').Point} Point\n   * @typedef {import('diagram-js/lib/util/Types').Rect} Rect\n   *\n   * @typedef {import('../model/Types').Element} Element\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   */\n\n  var DEFAULT_LABEL_SIZE$1 = {\n    width: 90,\n    height: 20\n  };\n\n  var FLOW_LABEL_INDENT = 15;\n\n\n  /**\n   * Return true if the given semantic has an external label.\n   *\n   * @param {Element} semantic\n   *\n   * @return {boolean}\n   */\n  function isLabelExternal(semantic) {\n    return is$1(semantic, 'bpmn:Event') ||\n           is$1(semantic, 'bpmn:Gateway') ||\n           is$1(semantic, 'bpmn:DataStoreReference') ||\n           is$1(semantic, 'bpmn:DataObjectReference') ||\n           is$1(semantic, 'bpmn:DataInput') ||\n           is$1(semantic, 'bpmn:DataOutput') ||\n           is$1(semantic, 'bpmn:SequenceFlow') ||\n           is$1(semantic, 'bpmn:MessageFlow') ||\n           is$1(semantic, 'bpmn:Group');\n  }\n\n  /**\n   * Return true if the given element has an external label.\n   *\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function hasExternalLabel(element) {\n    return isLabel(element.label);\n  }\n\n  /**\n   * Get the position of a sequence flow label.\n   *\n   * @param  {Point[]} waypoints\n   *\n   * @return {Point}\n   */\n  function getFlowLabelPosition(waypoints) {\n\n    // get the waypoints mid\n    var mid = waypoints.length / 2 - 1;\n\n    var first = waypoints[Math.floor(mid)];\n    var second = waypoints[Math.ceil(mid + 0.01)];\n\n    // get position\n    var position = getWaypointsMid(waypoints);\n\n    // calculate angle\n    var angle = Math.atan((second.y - first.y) / (second.x - first.x));\n\n    var x = position.x,\n        y = position.y;\n\n    if (Math.abs(angle) < Math.PI / 2) {\n      y -= FLOW_LABEL_INDENT;\n    } else {\n      x += FLOW_LABEL_INDENT;\n    }\n\n    return { x: x, y: y };\n  }\n\n\n  /**\n   * Get the middle of a number of waypoints.\n   *\n   * @param  {Point[]} waypoints\n   *\n   * @return {Point}\n   */\n  function getWaypointsMid(waypoints) {\n\n    var mid = waypoints.length / 2 - 1;\n\n    var first = waypoints[Math.floor(mid)];\n    var second = waypoints[Math.ceil(mid + 0.01)];\n\n    return {\n      x: first.x + (second.x - first.x) / 2,\n      y: first.y + (second.y - first.y) / 2\n    };\n  }\n\n  /**\n   * Get the middle of the external label of an element.\n   *\n   * @param {Element} element\n   *\n   * @return {Point}\n   */\n  function getExternalLabelMid(element) {\n\n    if (element.waypoints) {\n      return getFlowLabelPosition(element.waypoints);\n    } else if (is$1(element, 'bpmn:Group')) {\n      return {\n        x: element.x + element.width / 2,\n        y: element.y + DEFAULT_LABEL_SIZE$1.height / 2\n      };\n    } else {\n      return {\n        x: element.x + element.width / 2,\n        y: element.y + element.height + DEFAULT_LABEL_SIZE$1.height / 2\n      };\n    }\n  }\n\n\n  /**\n   * Return the bounds of an elements label, parsed from the elements DI or\n   * generated from its bounds.\n   *\n   * @param {ModdleElement} di\n   * @param {Element} element\n   *\n   * @return {Rect}\n   */\n  function getExternalLabelBounds(di, element) {\n\n    var mid,\n        size,\n        bounds,\n        label = di.label;\n\n    if (label && label.bounds) {\n      bounds = label.bounds;\n\n      size = {\n        width: Math.max(DEFAULT_LABEL_SIZE$1.width, bounds.width),\n        height: bounds.height\n      };\n\n      mid = {\n        x: bounds.x + bounds.width / 2,\n        y: bounds.y + bounds.height / 2\n      };\n    } else {\n\n      mid = getExternalLabelMid(element);\n\n      size = DEFAULT_LABEL_SIZE$1;\n    }\n\n    return assign$1({\n      x: mid.x - size.width / 2,\n      y: mid.y - size.height / 2\n    }, size);\n  }\n\n  /**\n   * @param {ModdleElement} semantic\n   *\n   * @returns {string}\n   */\n  function getLabelAttr(semantic) {\n    if (\n      is$1(semantic, 'bpmn:FlowElement') ||\n      is$1(semantic, 'bpmn:Participant') ||\n      is$1(semantic, 'bpmn:Lane') ||\n      is$1(semantic, 'bpmn:SequenceFlow') ||\n      is$1(semantic, 'bpmn:MessageFlow') ||\n      is$1(semantic, 'bpmn:DataInput') ||\n      is$1(semantic, 'bpmn:DataOutput')\n    ) {\n      return 'name';\n    }\n\n    if (is$1(semantic, 'bpmn:TextAnnotation')) {\n      return 'text';\n    }\n\n    if (is$1(semantic, 'bpmn:Group')) {\n      return 'categoryValueRef';\n    }\n  }\n\n  /**\n   * @param {ModdleElement} semantic\n   *\n   * @returns {string}\n   */\n  function getCategoryValue(semantic) {\n    var categoryValueRef = semantic['categoryValueRef'];\n\n    if (!categoryValueRef) {\n      return '';\n    }\n\n\n    return categoryValueRef.value || '';\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {string}\n   */\n  function getLabel(element) {\n    var semantic = element.businessObject,\n        attr = getLabelAttr(semantic);\n\n    if (attr) {\n\n      if (attr === 'categoryValueRef') {\n\n        return getCategoryValue(semantic);\n      }\n\n      return semantic[attr] || '';\n    }\n  }\n\n\n  /**\n   * @param {Element} element\n   * @param {string} text\n   *\n   * @return {Element}\n   */\n  function setLabel(element, text) {\n    var semantic = element.businessObject,\n        attr = getLabelAttr(semantic);\n\n    if (attr) {\n\n      if (attr === 'categoryValueRef') {\n        semantic['categoryValueRef'].value = text;\n      } else {\n        semantic[attr] = text;\n      }\n\n    }\n\n    return element;\n  }\n\n  var black = 'hsl(225, 10%, 15%)';\n\n  // element utils //////////////////////\n\n  /**\n   * Checks if eventDefinition of the given element matches with semantic type.\n   *\n   * @param {ModdleElement} event\n   * @param {string} eventDefinitionType\n   *\n   * @return {boolean}\n   */\n  function isTypedEvent(event, eventDefinitionType) {\n    return some(event.eventDefinitions, function(definition) {\n      return definition.$type === eventDefinitionType;\n    });\n  }\n\n  /**\n   * Check if element is a throw event.\n   *\n   * @param {ModdleElement} event\n   *\n   * @return {boolean}\n   */\n  function isThrowEvent(event) {\n    return (event.$type === 'bpmn:IntermediateThrowEvent') || (event.$type === 'bpmn:EndEvent');\n  }\n\n  /**\n   * Check if element is a throw event.\n   *\n   * @param {ModdleElement} element\n   *\n   * @return {boolean}\n   */\n  function isCollection(element) {\n    var dataObject = element.dataObjectRef;\n\n    return element.isCollection || (dataObject && dataObject.isCollection);\n  }\n\n\n  // color access //////////////////////\n\n  /**\n   * @param {Element} element\n   * @param {string} [defaultColor]\n   *\n   * @return {string}\n   */\n  function getFillColor(element, defaultColor) {\n    var di = getDi(element);\n\n    return di.get('color:background-color') || di.get('bioc:fill') || defaultColor || 'white';\n  }\n\n  /**\n   * @param {Element} element\n   * @param {string} [defaultColor]\n   *\n   * @return {string}\n   */\n  function getStrokeColor$1(element, defaultColor) {\n    var di = getDi(element);\n\n    return di.get('color:border-color') || di.get('bioc:stroke') || defaultColor || black;\n  }\n\n  /**\n   * @param {Element} element\n   * @param {string} [defaultColor]\n   * @param {string} [defaultStrokeColor]\n   *\n   * @return {string}\n   */\n  function getLabelColor(element, defaultColor, defaultStrokeColor) {\n    var di = getDi(element),\n        label = di.get('label');\n\n    return label && label.get('color:color') || defaultColor ||\n      getStrokeColor$1(element, defaultStrokeColor);\n  }\n\n  // cropping path customizations //////////////////////\n\n  /**\n   * @param {ShapeLike} shape\n   *\n   * @return {string} path\n   */\n  function getCirclePath(shape) {\n\n    var cx = shape.x + shape.width / 2,\n        cy = shape.y + shape.height / 2,\n        radius = shape.width / 2;\n\n    var circlePath = [\n      [ 'M', cx, cy ],\n      [ 'm', 0, -radius ],\n      [ 'a', radius, radius, 0, 1, 1, 0, 2 * radius ],\n      [ 'a', radius, radius, 0, 1, 1, 0, -2 * radius ],\n      [ 'z' ]\n    ];\n\n    return componentsToPath(circlePath);\n  }\n\n  /**\n   * @param {ShapeLike} shape\n   * @param {number} [borderRadius]\n   *\n   * @return {string} path\n   */\n  function getRoundRectPath(shape, borderRadius) {\n\n    var x = shape.x,\n        y = shape.y,\n        width = shape.width,\n        height = shape.height;\n\n    var roundRectPath = [\n      [ 'M', x + borderRadius, y ],\n      [ 'l', width - borderRadius * 2, 0 ],\n      [ 'a', borderRadius, borderRadius, 0, 0, 1, borderRadius, borderRadius ],\n      [ 'l', 0, height - borderRadius * 2 ],\n      [ 'a', borderRadius, borderRadius, 0, 0, 1, -borderRadius, borderRadius ],\n      [ 'l', borderRadius * 2 - width, 0 ],\n      [ 'a', borderRadius, borderRadius, 0, 0, 1, -borderRadius, -borderRadius ],\n      [ 'l', 0, borderRadius * 2 - height ],\n      [ 'a', borderRadius, borderRadius, 0, 0, 1, borderRadius, -borderRadius ],\n      [ 'z' ]\n    ];\n\n    return componentsToPath(roundRectPath);\n  }\n\n  /**\n   * @param {ShapeLike} shape\n   *\n   * @return {string} path\n   */\n  function getDiamondPath(shape) {\n\n    var width = shape.width,\n        height = shape.height,\n        x = shape.x,\n        y = shape.y,\n        halfWidth = width / 2,\n        halfHeight = height / 2;\n\n    var diamondPath = [\n      [ 'M', x + halfWidth, y ],\n      [ 'l', halfWidth, halfHeight ],\n      [ 'l', -halfWidth, halfHeight ],\n      [ 'l', -halfWidth, -halfHeight ],\n      [ 'z' ]\n    ];\n\n    return componentsToPath(diamondPath);\n  }\n\n  /**\n   * @param {ShapeLike} shape\n   *\n   * @return {string} path\n   */\n  function getRectPath(shape) {\n    var x = shape.x,\n        y = shape.y,\n        width = shape.width,\n        height = shape.height;\n\n    var rectPath = [\n      [ 'M', x, y ],\n      [ 'l', width, 0 ],\n      [ 'l', 0, height ],\n      [ 'l', -width, 0 ],\n      [ 'z' ]\n    ];\n\n    return componentsToPath(rectPath);\n  }\n\n  var RENDERER_IDS = new Ids();\n\n  var TASK_BORDER_RADIUS = 10;\n  var INNER_OUTER_DIST = 3;\n\n  var DEFAULT_FILL_OPACITY = .95,\n      HIGH_FILL_OPACITY = .35;\n\n  var ELEMENT_LABEL_DISTANCE$1 = 10;\n\n  /**\n   * @typedef { Partial<{\n   *   defaultFillColor: string,\n   *   defaultStrokeColor: string,\n   *   defaultLabelColor: string\n   * }> } BpmnRendererConfig\n   */\n\n  /**\n   * @typedef { import('../model/Types').Element } Element\n   */\n\n  /**\n   * A renderer for BPMN elements\n   *\n   * @param {BpmnRendererConfig} config\n   * @param {import('diagram-js/lib/core/EventBus').default} eventBus\n   * @param {import('diagram-js/lib/draw/Styles').default} styles\n   * @param {import('./PathMap').default} pathMap\n   * @param {import('diagram-js/lib/core/Canvas').default} canvas\n   * @param {import('./TextRenderer').default} textRenderer\n   * @param {number} [priority]\n   */\n  function BpmnRenderer(\n      config, eventBus, styles, pathMap,\n      canvas, textRenderer, priority) {\n\n    BaseRenderer.call(this, eventBus, priority);\n\n    var defaultFillColor = config && config.defaultFillColor,\n        defaultStrokeColor = config && config.defaultStrokeColor,\n        defaultLabelColor = config && config.defaultLabelColor;\n\n    var rendererId = RENDERER_IDS.next();\n\n    var markers = {};\n\n    function shapeStyle(attrs) {\n      return styles.computeStyle(attrs, {\n        strokeLinecap: 'round',\n        strokeLinejoin: 'round',\n        stroke: black,\n        strokeWidth: 2,\n        fill: 'white'\n      });\n    }\n\n    function lineStyle(attrs) {\n      return styles.computeStyle(attrs, [ 'no-fill' ], {\n        strokeLinecap: 'round',\n        strokeLinejoin: 'round',\n        stroke: black,\n        strokeWidth: 2\n      });\n    }\n\n    function addMarker(id, options) {\n      var {\n        ref = { x: 0, y: 0 },\n        scale = 1,\n        element\n      } = options;\n\n      var marker = create$1('marker', {\n        id: id,\n        viewBox: '0 0 20 20',\n        refX: ref.x,\n        refY: ref.y,\n        markerWidth: 20 * scale,\n        markerHeight: 20 * scale,\n        orient: 'auto'\n      });\n\n      append(marker, element);\n\n      var defs = query('defs', canvas._svg);\n\n      if (!defs) {\n        defs = create$1('defs');\n\n        append(canvas._svg, defs);\n      }\n\n      append(defs, marker);\n\n      markers[id] = marker;\n    }\n\n    function colorEscape(str) {\n\n      // only allow characters and numbers\n      return str.replace(/[^0-9a-zA-Z]+/g, '_');\n    }\n\n    function marker(type, fill, stroke) {\n      var id = type + '-' + colorEscape(fill) + '-' + colorEscape(stroke) + '-' + rendererId;\n\n      if (!markers[id]) {\n        createMarker(id, type, fill, stroke);\n      }\n\n      return 'url(#' + id + ')';\n    }\n\n    function createMarker(id, type, fill, stroke) {\n\n      if (type === 'sequenceflow-end') {\n        var sequenceflowEnd = create$1('path', {\n          d: 'M 1 5 L 11 10 L 1 15 Z',\n          ...shapeStyle({\n            fill: stroke,\n            stroke: stroke,\n            strokeWidth: 1\n          })\n        });\n\n        addMarker(id, {\n          element: sequenceflowEnd,\n          ref: { x: 11, y: 10 },\n          scale: 0.5\n        });\n      }\n\n      if (type === 'messageflow-start') {\n        var messageflowStart = create$1('circle', {\n          cx: 6,\n          cy: 6,\n          r: 3.5,\n          ...shapeStyle({\n            fill: fill,\n            stroke: stroke,\n            strokeWidth: 1,\n\n            // fix for safari / chrome / firefox bug not correctly\n            // resetting stroke dash array\n            strokeDasharray: [ 10000, 1 ]\n          })\n        });\n\n        addMarker(id, {\n          element: messageflowStart,\n          ref: { x: 6, y: 6 }\n        });\n      }\n\n      if (type === 'messageflow-end') {\n        var messageflowEnd = create$1('path', {\n          d: 'm 1 5 l 0 -3 l 7 3 l -7 3 z',\n          ...shapeStyle({\n            fill: fill,\n            stroke: stroke,\n            strokeWidth: 1,\n\n            // fix for safari / chrome / firefox bug not correctly\n            // resetting stroke dash array\n            strokeDasharray: [ 10000, 1 ]\n          })\n        });\n\n        addMarker(id, {\n          element: messageflowEnd,\n          ref: { x: 8.5, y: 5 }\n        });\n      }\n\n      if (type === 'association-start') {\n        var associationStart = create$1('path', {\n          d: 'M 11 5 L 1 10 L 11 15',\n          ...lineStyle({\n            fill: 'none',\n            stroke: stroke,\n            strokeWidth: 1.5,\n\n            // fix for safari / chrome / firefox bug not correctly\n            // resetting stroke dash array\n            strokeDasharray: [ 10000, 1 ]\n          })\n        });\n\n        addMarker(id, {\n          element: associationStart,\n          ref: { x: 1, y: 10 },\n          scale: 0.5\n        });\n      }\n\n      if (type === 'association-end') {\n        var associationEnd = create$1('path', {\n          d: 'M 1 5 L 11 10 L 1 15',\n          ...lineStyle({\n            fill: 'none',\n            stroke: stroke,\n            strokeWidth: 1.5,\n\n            // fix for safari / chrome / firefox bug not correctly\n            // resetting stroke dash array\n            strokeDasharray: [ 10000, 1 ]\n          })\n        });\n\n        addMarker(id, {\n          element: associationEnd,\n          ref: { x: 11, y: 10 },\n          scale: 0.5\n        });\n      }\n\n      if (type === 'conditional-flow-marker') {\n        var conditionalFlowMarker = create$1('path', {\n          d: 'M 0 10 L 8 6 L 16 10 L 8 14 Z',\n          ...shapeStyle({\n            fill: fill,\n            stroke: stroke\n          })\n        });\n\n        addMarker(id, {\n          element: conditionalFlowMarker,\n          ref: { x: -1, y: 10 },\n          scale: 0.5\n        });\n      }\n\n      if (type === 'conditional-default-flow-marker') {\n        var defaultFlowMarker = create$1('path', {\n          d: 'M 6 4 L 10 16',\n          ...shapeStyle({\n            stroke: stroke\n          })\n        });\n\n        addMarker(id, {\n          element: defaultFlowMarker,\n          ref: { x: 0, y: 10 },\n          scale: 0.5\n        });\n      }\n    }\n\n    function drawCircle(parentGfx, width, height, offset, attrs) {\n\n      if (isObject(offset)) {\n        attrs = offset;\n        offset = 0;\n      }\n\n      offset = offset || 0;\n\n      attrs = shapeStyle(attrs);\n\n      if (attrs.fill === 'none') {\n        delete attrs.fillOpacity;\n      }\n\n      var cx = width / 2,\n          cy = height / 2;\n\n      var circle = create$1('circle', {\n        cx: cx,\n        cy: cy,\n        r: Math.round((width + height) / 4 - offset),\n        ...attrs\n      });\n\n      append(parentGfx, circle);\n\n      return circle;\n    }\n\n    function drawRect(parentGfx, width, height, r, offset, attrs) {\n\n      if (isObject(offset)) {\n        attrs = offset;\n        offset = 0;\n      }\n\n      offset = offset || 0;\n\n      attrs = shapeStyle(attrs);\n\n      var rect = create$1('rect', {\n        x: offset,\n        y: offset,\n        width: width - offset * 2,\n        height: height - offset * 2,\n        rx: r,\n        ry: r,\n        ...attrs\n      });\n\n      append(parentGfx, rect);\n\n      return rect;\n    }\n\n    function drawDiamond(parentGfx, width, height, attrs) {\n\n      var x_2 = width / 2;\n      var y_2 = height / 2;\n\n      var points = [\n        { x: x_2, y: 0 },\n        { x: width, y: y_2 },\n        { x: x_2, y: height },\n        { x: 0, y: y_2 }\n      ];\n\n      var pointsString = points.map(function(point) {\n        return point.x + ',' + point.y;\n      }).join(' ');\n\n      attrs = shapeStyle(attrs);\n\n      var polygon = create$1('polygon', {\n        ...attrs,\n        points: pointsString\n      });\n\n      append(parentGfx, polygon);\n\n      return polygon;\n    }\n\n    /**\n     * @param {SVGElement} parentGfx\n     * @param {Point[]} waypoints\n     * @param {any} attrs\n     * @param {number} [radius]\n     *\n     * @return {SVGElement}\n     */\n    function drawLine(parentGfx, waypoints, attrs, radius) {\n      attrs = lineStyle(attrs);\n\n      var line = createLine(waypoints, attrs, radius);\n\n      append(parentGfx, line);\n\n      return line;\n    }\n\n    /**\n     * @param {SVGElement} parentGfx\n     * @param {Point[]} waypoints\n     * @param {any} attrs\n     *\n     * @return {SVGElement}\n     */\n    function drawConnectionSegments(parentGfx, waypoints, attrs) {\n      return drawLine(parentGfx, waypoints, attrs, 5);\n    }\n\n    function drawPath(parentGfx, d, attrs) {\n\n      attrs = lineStyle(attrs);\n\n      var path = create$1('path', {\n        ...attrs,\n        d\n      });\n\n      append(parentGfx, path);\n\n      return path;\n    }\n\n    function drawMarker(type, parentGfx, path, attrs) {\n      return drawPath(parentGfx, path, assign$1({ 'data-marker': type }, attrs));\n    }\n\n    function renderer(type) {\n      return handlers[type];\n    }\n\n    function as(type) {\n      return function(parentGfx, element, options) {\n        return renderer(type)(parentGfx, element, options);\n      };\n    }\n\n    function renderEventContent(element, parentGfx) {\n\n      var event = getBusinessObject(element);\n      var isThrowing = isThrowEvent(event);\n\n      if (event.eventDefinitions && event.eventDefinitions.length > 1) {\n        if (event.parallelMultiple) {\n          return renderer('bpmn:ParallelMultipleEventDefinition')(parentGfx, element, isThrowing);\n        }\n        else {\n          return renderer('bpmn:MultipleEventDefinition')(parentGfx, element, isThrowing);\n        }\n      }\n\n      if (isTypedEvent(event, 'bpmn:MessageEventDefinition')) {\n        return renderer('bpmn:MessageEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:TimerEventDefinition')) {\n        return renderer('bpmn:TimerEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:ConditionalEventDefinition')) {\n        return renderer('bpmn:ConditionalEventDefinition')(parentGfx, element);\n      }\n\n      if (isTypedEvent(event, 'bpmn:SignalEventDefinition')) {\n        return renderer('bpmn:SignalEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:EscalationEventDefinition')) {\n        return renderer('bpmn:EscalationEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:LinkEventDefinition')) {\n        return renderer('bpmn:LinkEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:ErrorEventDefinition')) {\n        return renderer('bpmn:ErrorEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:CancelEventDefinition')) {\n        return renderer('bpmn:CancelEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:CompensateEventDefinition')) {\n        return renderer('bpmn:CompensateEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:TerminateEventDefinition')) {\n        return renderer('bpmn:TerminateEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      return null;\n    }\n\n    function renderLabel(parentGfx, label, options) {\n\n      options = assign$1({\n        size: {\n          width: 100\n        }\n      }, options);\n\n      var text = textRenderer.createText(label || '', options);\n\n      classes(text).add('djs-label');\n\n      append(parentGfx, text);\n\n      return text;\n    }\n\n    function renderEmbeddedLabel(parentGfx, element, align) {\n      var semantic = getBusinessObject(element);\n\n      return renderLabel(parentGfx, semantic.name, {\n        box: element,\n        align: align,\n        padding: 7,\n        style: {\n          fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor)\n        }\n      });\n    }\n\n    function renderExternalLabel(parentGfx, element) {\n\n      var box = {\n        width: 90,\n        height: 30,\n        x: element.width / 2 + element.x,\n        y: element.height / 2 + element.y\n      };\n\n      return renderLabel(parentGfx, getLabel(element), {\n        box: box,\n        fitBox: true,\n        style: assign$1(\n          {},\n          textRenderer.getExternalStyle(),\n          {\n            fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor)\n          }\n        )\n      });\n    }\n\n    function renderLaneLabel(parentGfx, text, element) {\n      var textBox = renderLabel(parentGfx, text, {\n        box: {\n          height: 30,\n          width: element.height\n        },\n        align: 'center-middle',\n        style: {\n          fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor)\n        }\n      });\n\n      var top = -1 * element.height;\n\n      transform(textBox, 0, -top, 270);\n    }\n\n    var handlers = this.handlers = {\n      'bpmn:Event': function(parentGfx, element, attrs) {\n\n        if (!('fillOpacity' in attrs)) {\n          attrs.fillOpacity = DEFAULT_FILL_OPACITY;\n        }\n\n        return drawCircle(parentGfx, element.width, element.height, attrs);\n      },\n      'bpmn:StartEvent': function(parentGfx, element, options) {\n        var attrs = {\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        };\n\n        var semantic = getBusinessObject(element);\n\n        if (!semantic.isInterrupting) {\n          attrs = {\n            strokeDasharray: '6',\n            fill: getFillColor(element, defaultFillColor),\n            stroke: getStrokeColor$1(element, defaultStrokeColor)\n          };\n        }\n\n        var circle = renderer('bpmn:Event')(parentGfx, element, attrs);\n\n        if (!options || options.renderIcon !== false) {\n          renderEventContent(element, parentGfx);\n        }\n\n        return circle;\n      },\n      'bpmn:MessageEventDefinition': function(parentGfx, element, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_MESSAGE', {\n          xScaleFactor: 0.9,\n          yScaleFactor: 0.9,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.235,\n            my: 0.315\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor$1(element, defaultStrokeColor) : getFillColor(element, defaultFillColor);\n        var stroke = isThrowing ? getFillColor(element, defaultFillColor) : getStrokeColor$1(element, defaultStrokeColor);\n\n        var messagePath = drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: stroke\n        });\n\n        return messagePath;\n      },\n      'bpmn:TimerEventDefinition': function(parentGfx, element) {\n        var circle = drawCircle(parentGfx, element.width, element.height, 0.2 * element.height, {\n          strokeWidth: 2,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        var pathData = pathMap.getScaledPath('EVENT_TIMER_WH', {\n          xScaleFactor: 0.75,\n          yScaleFactor: 0.75,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.5,\n            my: 0.5\n          }\n        });\n\n        drawPath(parentGfx, pathData, {\n          strokeWidth: 2,\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        for (var i = 0;i < 12; i++) {\n\n          var linePathData = pathMap.getScaledPath('EVENT_TIMER_LINE', {\n            xScaleFactor: 0.75,\n            yScaleFactor: 0.75,\n            containerWidth: element.width,\n            containerHeight: element.height,\n            position: {\n              mx: 0.5,\n              my: 0.5\n            }\n          });\n\n          var width = element.width / 2;\n          var height = element.height / 2;\n\n          drawPath(parentGfx, linePathData, {\n            strokeWidth: 1,\n            transform: 'rotate(' + (i * 30) + ',' + height + ',' + width + ')',\n            stroke: getStrokeColor$1(element, defaultStrokeColor)\n          });\n        }\n\n        return circle;\n      },\n      'bpmn:EscalationEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_ESCALATION', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.5,\n            my: 0.2\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor$1(event, defaultStrokeColor) : 'none';\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: getStrokeColor$1(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:ConditionalEventDefinition': function(parentGfx, event) {\n        var pathData = pathMap.getScaledPath('EVENT_CONDITIONAL', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.5,\n            my: 0.222\n          }\n        });\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          stroke: getStrokeColor$1(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:LinkEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_LINK', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.57,\n            my: 0.263\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor$1(event, defaultStrokeColor) : 'none';\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: getStrokeColor$1(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:ErrorEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_ERROR', {\n          xScaleFactor: 1.1,\n          yScaleFactor: 1.1,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.2,\n            my: 0.722\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor$1(event, defaultStrokeColor) : 'none';\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: getStrokeColor$1(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:CancelEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_CANCEL_45', {\n          xScaleFactor: 1.0,\n          yScaleFactor: 1.0,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.638,\n            my: -0.055\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor$1(event, defaultStrokeColor) : 'none';\n\n        var path = drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: getStrokeColor$1(event, defaultStrokeColor)\n        });\n\n        rotate(path, 45);\n\n        return path;\n      },\n      'bpmn:CompensateEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_COMPENSATION', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.22,\n            my: 0.5\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor$1(event, defaultStrokeColor) : 'none';\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: getStrokeColor$1(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:SignalEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_SIGNAL', {\n          xScaleFactor: 0.9,\n          yScaleFactor: 0.9,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.5,\n            my: 0.2\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor$1(event, defaultStrokeColor) : 'none';\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: getStrokeColor$1(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:MultipleEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_MULTIPLE', {\n          xScaleFactor: 1.1,\n          yScaleFactor: 1.1,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.222,\n            my: 0.36\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor$1(event, defaultStrokeColor) : 'none';\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill\n        });\n      },\n      'bpmn:ParallelMultipleEventDefinition': function(parentGfx, event) {\n        var pathData = pathMap.getScaledPath('EVENT_PARALLEL_MULTIPLE', {\n          xScaleFactor: 1.2,\n          yScaleFactor: 1.2,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.458,\n            my: 0.194\n          }\n        });\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: getStrokeColor$1(event, defaultStrokeColor),\n          stroke: getStrokeColor$1(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:EndEvent': function(parentGfx, element, options) {\n        var circle = renderer('bpmn:Event')(parentGfx, element, {\n          strokeWidth: 4,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        if (!options || options.renderIcon !== false) {\n          renderEventContent(element, parentGfx);\n        }\n\n        return circle;\n      },\n      'bpmn:TerminateEventDefinition': function(parentGfx, element) {\n        var circle = drawCircle(parentGfx, element.width, element.height, 8, {\n          strokeWidth: 4,\n          fill: getStrokeColor$1(element, defaultStrokeColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        return circle;\n      },\n      'bpmn:IntermediateEvent': function(parentGfx, element, options) {\n        var outer = renderer('bpmn:Event')(parentGfx, element, {\n          strokeWidth: 1.5,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        /* inner */\n        drawCircle(parentGfx, element.width, element.height, INNER_OUTER_DIST, {\n          strokeWidth: 1.5,\n          fill: getFillColor(element, 'none'),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        if (!options || options.renderIcon !== false) {\n          renderEventContent(element, parentGfx);\n        }\n\n        return outer;\n      },\n      'bpmn:IntermediateCatchEvent': as('bpmn:IntermediateEvent'),\n      'bpmn:IntermediateThrowEvent': as('bpmn:IntermediateEvent'),\n\n      'bpmn:Activity': function(parentGfx, element, attrs) {\n\n        attrs = attrs || {};\n\n        if (!('fillOpacity' in attrs)) {\n          attrs.fillOpacity = DEFAULT_FILL_OPACITY;\n        }\n\n        return drawRect(parentGfx, element.width, element.height, TASK_BORDER_RADIUS, attrs);\n      },\n\n      'bpmn:Task': function(parentGfx, element) {\n        var attrs = {\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        };\n\n        var rect = renderer('bpmn:Activity')(parentGfx, element, attrs);\n\n        renderEmbeddedLabel(parentGfx, element, 'center-middle');\n        attachTaskMarkers(parentGfx, element);\n\n        return rect;\n      },\n      'bpmn:ServiceTask': function(parentGfx, element) {\n        var task = renderer('bpmn:Task')(parentGfx, element);\n\n        var pathDataBG = pathMap.getScaledPath('TASK_TYPE_SERVICE', {\n          abspos: {\n            x: 12,\n            y: 18\n          }\n        });\n\n        /* service bg */ drawPath(parentGfx, pathDataBG, {\n          strokeWidth: 1,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        var fillPathData = pathMap.getScaledPath('TASK_TYPE_SERVICE_FILL', {\n          abspos: {\n            x: 17.2,\n            y: 18\n          }\n        });\n\n        /* service fill */ drawPath(parentGfx, fillPathData, {\n          strokeWidth: 0,\n          fill: getFillColor(element, defaultFillColor)\n        });\n\n        var pathData = pathMap.getScaledPath('TASK_TYPE_SERVICE', {\n          abspos: {\n            x: 17,\n            y: 22\n          }\n        });\n\n        /* service */ drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        return task;\n      },\n      'bpmn:UserTask': function(parentGfx, element) {\n        var task = renderer('bpmn:Task')(parentGfx, element);\n\n        var x = 15;\n        var y = 12;\n\n        var pathData = pathMap.getScaledPath('TASK_TYPE_USER_1', {\n          abspos: {\n            x: x,\n            y: y\n          }\n        });\n\n        /* user path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 0.5,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        var pathData2 = pathMap.getScaledPath('TASK_TYPE_USER_2', {\n          abspos: {\n            x: x,\n            y: y\n          }\n        });\n\n        /* user2 path */ drawPath(parentGfx, pathData2, {\n          strokeWidth: 0.5,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        var pathData3 = pathMap.getScaledPath('TASK_TYPE_USER_3', {\n          abspos: {\n            x: x,\n            y: y\n          }\n        });\n\n        /* user3 path */ drawPath(parentGfx, pathData3, {\n          strokeWidth: 0.5,\n          fill: getStrokeColor$1(element, defaultStrokeColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        return task;\n      },\n      'bpmn:ManualTask': function(parentGfx, element) {\n        var task = renderer('bpmn:Task')(parentGfx, element);\n\n        var pathData = pathMap.getScaledPath('TASK_TYPE_MANUAL', {\n          abspos: {\n            x: 17,\n            y: 15\n          }\n        });\n\n        /* manual path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 0.5, // 0.25,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        return task;\n      },\n      'bpmn:SendTask': function(parentGfx, element) {\n        var task = renderer('bpmn:Task')(parentGfx, element);\n\n        var pathData = pathMap.getScaledPath('TASK_TYPE_SEND', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: 21,\n          containerHeight: 14,\n          position: {\n            mx: 0.285,\n            my: 0.357\n          }\n        });\n\n        /* send path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: getStrokeColor$1(element, defaultStrokeColor),\n          stroke: getFillColor(element, defaultFillColor)\n        });\n\n        return task;\n      },\n      'bpmn:ReceiveTask' : function(parentGfx, element) {\n        var semantic = getBusinessObject(element);\n\n        var task = renderer('bpmn:Task')(parentGfx, element);\n        var pathData;\n\n        if (semantic.instantiate) {\n          drawCircle(parentGfx, 28, 28, 20 * 0.22, { strokeWidth: 1 });\n\n          pathData = pathMap.getScaledPath('TASK_TYPE_INSTANTIATING_SEND', {\n            abspos: {\n              x: 7.77,\n              y: 9.52\n            }\n          });\n        } else {\n\n          pathData = pathMap.getScaledPath('TASK_TYPE_SEND', {\n            xScaleFactor: 0.9,\n            yScaleFactor: 0.9,\n            containerWidth: 21,\n            containerHeight: 14,\n            position: {\n              mx: 0.3,\n              my: 0.4\n            }\n          });\n        }\n\n        /* receive path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        return task;\n      },\n      'bpmn:ScriptTask': function(parentGfx, element) {\n        var task = renderer('bpmn:Task')(parentGfx, element);\n\n        var pathData = pathMap.getScaledPath('TASK_TYPE_SCRIPT', {\n          abspos: {\n            x: 15,\n            y: 20\n          }\n        });\n\n        /* script path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        return task;\n      },\n      'bpmn:BusinessRuleTask': function(parentGfx, element) {\n        var task = renderer('bpmn:Task')(parentGfx, element);\n\n        var headerPathData = pathMap.getScaledPath('TASK_TYPE_BUSINESS_RULE_HEADER', {\n          abspos: {\n            x: 8,\n            y: 8\n          }\n        });\n\n        var businessHeaderPath = drawPath(parentGfx, headerPathData);\n        attr(businessHeaderPath, {\n          strokeWidth: 1,\n          fill: getFillColor(element, '#aaaaaa'),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        var headerData = pathMap.getScaledPath('TASK_TYPE_BUSINESS_RULE_MAIN', {\n          abspos: {\n            x: 8,\n            y: 8\n          }\n        });\n\n        var businessPath = drawPath(parentGfx, headerData);\n        attr(businessPath, {\n          strokeWidth: 1,\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        return task;\n      },\n      'bpmn:SubProcess': function(parentGfx, element, attrs) {\n        attrs = {\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor),\n          ...attrs\n        };\n\n        var rect = renderer('bpmn:Activity')(parentGfx, element, attrs);\n\n        var expanded = isExpanded(element);\n\n        if (isEventSubProcess(element)) {\n          attr(rect, {\n            strokeDasharray: '0, 5.5',\n            strokeWidth: 2.5\n          });\n        }\n\n        renderEmbeddedLabel(parentGfx, element, expanded ? 'center-top' : 'center-middle');\n\n        if (expanded) {\n          attachTaskMarkers(parentGfx, element);\n        } else {\n          attachTaskMarkers(parentGfx, element, [ 'SubProcessMarker' ]);\n        }\n\n        return rect;\n      },\n      'bpmn:AdHocSubProcess': function(parentGfx, element) {\n        return renderer('bpmn:SubProcess')(parentGfx, element);\n      },\n      'bpmn:Transaction': function(parentGfx, element) {\n        var outer = renderer('bpmn:SubProcess')(parentGfx, element, { strokeWidth: 1.5 });\n\n        var innerAttrs = styles.style([ 'no-fill', 'no-events' ], {\n          stroke: getStrokeColor$1(element, defaultStrokeColor),\n          strokeWidth: 1.5\n        });\n\n        /* inner path */ drawRect(parentGfx, element.width, element.height, TASK_BORDER_RADIUS - 3, INNER_OUTER_DIST, innerAttrs);\n\n        return outer;\n      },\n      'bpmn:CallActivity': function(parentGfx, element) {\n        return renderer('bpmn:SubProcess')(parentGfx, element, {\n          strokeWidth: 5\n        });\n      },\n      'bpmn:Participant': function(parentGfx, element) {\n\n        var strokeWidth = 1.5;\n\n        var attrs = {\n          fillOpacity: DEFAULT_FILL_OPACITY,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor),\n          strokeWidth\n        };\n\n        var lane = renderer('bpmn:Lane')(parentGfx, element, attrs);\n\n        var expandedPool = isExpanded(element);\n\n        if (expandedPool) {\n          drawLine(parentGfx, [\n            { x: 30, y: 0 },\n            { x: 30, y: element.height }\n          ], {\n            stroke: getStrokeColor$1(element, defaultStrokeColor),\n            strokeWidth\n          });\n          var text = getBusinessObject(element).name;\n          renderLaneLabel(parentGfx, text, element);\n        } else {\n\n          // collapsed pool draw text inline\n          var text2 = getBusinessObject(element).name;\n          renderLabel(parentGfx, text2, {\n            box: element, align: 'center-middle',\n            style: {\n              fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor)\n            }\n          });\n        }\n\n        var participantMultiplicity = !!(getBusinessObject(element).participantMultiplicity);\n\n        if (participantMultiplicity) {\n          renderer('ParticipantMultiplicityMarker')(parentGfx, element);\n        }\n\n        return lane;\n      },\n      'bpmn:Lane': function(parentGfx, element, attrs) {\n        var rect = drawRect(parentGfx, element.width, element.height, 0, {\n          fill: getFillColor(element, defaultFillColor),\n          fillOpacity: HIGH_FILL_OPACITY,\n          stroke: getStrokeColor$1(element, defaultStrokeColor),\n          strokeWidth: 1.5,\n          ...attrs\n        });\n\n        var semantic = getBusinessObject(element);\n\n        if (semantic.$type === 'bpmn:Lane') {\n          var text = semantic.name;\n          renderLaneLabel(parentGfx, text, element);\n        }\n\n        return rect;\n      },\n      'bpmn:InclusiveGateway': function(parentGfx, element) {\n        var diamond = renderer('bpmn:Gateway')(parentGfx, element);\n\n        /* circle path */\n        drawCircle(parentGfx, element.width, element.height, element.height * 0.24, {\n          strokeWidth: 2.5,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        return diamond;\n      },\n      'bpmn:ExclusiveGateway': function(parentGfx, element) {\n        var diamond = renderer('bpmn:Gateway')(parentGfx, element);\n\n        var pathData = pathMap.getScaledPath('GATEWAY_EXCLUSIVE', {\n          xScaleFactor: 0.4,\n          yScaleFactor: 0.4,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.32,\n            my: 0.3\n          }\n        });\n\n        if ((getDi(element).isMarkerVisible)) {\n          drawPath(parentGfx, pathData, {\n            strokeWidth: 1,\n            fill: getStrokeColor$1(element, defaultStrokeColor),\n            stroke: getStrokeColor$1(element, defaultStrokeColor)\n          });\n        }\n\n        return diamond;\n      },\n      'bpmn:ComplexGateway': function(parentGfx, element) {\n        var diamond = renderer('bpmn:Gateway')(parentGfx, element);\n\n        var pathData = pathMap.getScaledPath('GATEWAY_COMPLEX', {\n          xScaleFactor: 0.5,\n          yScaleFactor:0.5,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.46,\n            my: 0.26\n          }\n        });\n\n        /* complex path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: getStrokeColor$1(element, defaultStrokeColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        return diamond;\n      },\n      'bpmn:ParallelGateway': function(parentGfx, element) {\n        var diamond = renderer('bpmn:Gateway')(parentGfx, element);\n\n        var pathData = pathMap.getScaledPath('GATEWAY_PARALLEL', {\n          xScaleFactor: 0.6,\n          yScaleFactor:0.6,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.46,\n            my: 0.2\n          }\n        });\n\n        /* parallel path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: getStrokeColor$1(element, defaultStrokeColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        return diamond;\n      },\n      'bpmn:EventBasedGateway': function(parentGfx, element) {\n\n        var semantic = getBusinessObject(element);\n\n        var diamond = renderer('bpmn:Gateway')(parentGfx, element);\n\n        /* outer circle path */ drawCircle(parentGfx, element.width, element.height, element.height * 0.20, {\n          strokeWidth: 1,\n          fill: 'none',\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        var type = semantic.eventGatewayType;\n        var instantiate = !!semantic.instantiate;\n\n        function drawEvent() {\n\n          var pathData = pathMap.getScaledPath('GATEWAY_EVENT_BASED', {\n            xScaleFactor: 0.18,\n            yScaleFactor: 0.18,\n            containerWidth: element.width,\n            containerHeight: element.height,\n            position: {\n              mx: 0.36,\n              my: 0.44\n            }\n          });\n\n          /* event path */ drawPath(parentGfx, pathData, {\n            strokeWidth: 2,\n            fill: getFillColor(element, 'none'),\n            stroke: getStrokeColor$1(element, defaultStrokeColor)\n          });\n        }\n\n        if (type === 'Parallel') {\n\n          var pathData = pathMap.getScaledPath('GATEWAY_PARALLEL', {\n            xScaleFactor: 0.4,\n            yScaleFactor:0.4,\n            containerWidth: element.width,\n            containerHeight: element.height,\n            position: {\n              mx: 0.474,\n              my: 0.296\n            }\n          });\n\n          drawPath(parentGfx, pathData, {\n            strokeWidth: 1,\n            fill: 'none'\n          });\n        } else if (type === 'Exclusive') {\n\n          if (!instantiate) {\n            drawCircle(parentGfx, element.width, element.height, element.height * 0.26, {\n              strokeWidth: 1,\n              fill: 'none',\n              stroke: getStrokeColor$1(element, defaultStrokeColor)\n            });\n          }\n\n          drawEvent();\n        }\n\n\n        return diamond;\n      },\n      'bpmn:Gateway': function(parentGfx, element) {\n        return drawDiamond(parentGfx, element.width, element.height, {\n          fill: getFillColor(element, defaultFillColor),\n          fillOpacity: DEFAULT_FILL_OPACITY,\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n      },\n      'bpmn:SequenceFlow': function(parentGfx, element) {\n        var fill = getFillColor(element, defaultFillColor),\n            stroke = getStrokeColor$1(element, defaultStrokeColor);\n\n        var path = drawConnectionSegments(parentGfx, element.waypoints, {\n          markerEnd: marker('sequenceflow-end', fill, stroke),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        var sequenceFlow = getBusinessObject(element);\n\n        var source;\n\n        if (element.source) {\n          source = element.source.businessObject;\n\n          // conditional flow marker\n          if (sequenceFlow.conditionExpression && source.$instanceOf('bpmn:Activity')) {\n            attr(path, {\n              markerStart: marker('conditional-flow-marker', fill, stroke)\n            });\n          }\n\n          // default marker\n          if (source.default && (source.$instanceOf('bpmn:Gateway') || source.$instanceOf('bpmn:Activity')) &&\n              source.default === sequenceFlow) {\n            attr(path, {\n              markerStart: marker('conditional-default-flow-marker', fill, stroke)\n            });\n          }\n        }\n\n        return path;\n      },\n      'bpmn:Association': function(parentGfx, element, attrs) {\n\n        var semantic = getBusinessObject(element);\n\n        var fill = getFillColor(element, defaultFillColor),\n            stroke = getStrokeColor$1(element, defaultStrokeColor);\n\n        attrs = {\n          strokeDasharray: '0, 5',\n          stroke: getStrokeColor$1(element, defaultStrokeColor),\n          ...attrs\n        };\n\n        if (semantic.associationDirection === 'One' ||\n            semantic.associationDirection === 'Both') {\n          attrs.markerEnd = marker('association-end', fill, stroke);\n        }\n\n        if (semantic.associationDirection === 'Both') {\n          attrs.markerStart = marker('association-start', fill, stroke);\n        }\n\n        return drawConnectionSegments(parentGfx, element.waypoints, attrs);\n      },\n      'bpmn:DataInputAssociation': function(parentGfx, element) {\n        var fill = getFillColor(element, defaultFillColor),\n            stroke = getStrokeColor$1(element, defaultStrokeColor);\n\n        return renderer('bpmn:Association')(parentGfx, element, {\n          markerEnd: marker('association-end', fill, stroke)\n        });\n      },\n      'bpmn:DataOutputAssociation': function(parentGfx, element) {\n        var fill = getFillColor(element, defaultFillColor),\n            stroke = getStrokeColor$1(element, defaultStrokeColor);\n\n        return renderer('bpmn:Association')(parentGfx, element, {\n          markerEnd: marker('association-end', fill, stroke)\n        });\n      },\n      'bpmn:MessageFlow': function(parentGfx, element) {\n\n        var semantic = getBusinessObject(element),\n            di = getDi(element);\n\n        var fill = getFillColor(element, defaultFillColor),\n            stroke = getStrokeColor$1(element, defaultStrokeColor);\n\n        var path = drawConnectionSegments(parentGfx, element.waypoints, {\n          markerEnd: marker('messageflow-end', fill, stroke),\n          markerStart: marker('messageflow-start', fill, stroke),\n          strokeDasharray: '10, 11',\n          strokeWidth: 1.5,\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        if (semantic.messageRef) {\n          var midPoint = path.getPointAtLength(path.getTotalLength() / 2);\n\n          var markerPathData = pathMap.getScaledPath('MESSAGE_FLOW_MARKER', {\n            abspos: {\n              x: midPoint.x,\n              y: midPoint.y\n            }\n          });\n\n          var messageAttrs = { strokeWidth: 1 };\n\n          if (di.messageVisibleKind === 'initiating') {\n            messageAttrs.fill = 'white';\n            messageAttrs.stroke = black;\n          } else {\n            messageAttrs.fill = '#888';\n            messageAttrs.stroke = 'white';\n          }\n\n          var message = drawPath(parentGfx, markerPathData, messageAttrs);\n\n          var labelText = semantic.messageRef.name;\n          var label = renderLabel(parentGfx, labelText, {\n            align: 'center-top',\n            fitBox: true,\n            style: {\n              fill: getStrokeColor$1(element, defaultLabelColor)\n            }\n          });\n\n          var messageBounds = message.getBBox(),\n              labelBounds = label.getBBox();\n\n          var translateX = midPoint.x - labelBounds.width / 2,\n              translateY = midPoint.y + messageBounds.height / 2 + ELEMENT_LABEL_DISTANCE$1;\n\n          transform(label, translateX, translateY, 0);\n\n        }\n\n        return path;\n      },\n      'bpmn:DataObject': function(parentGfx, element) {\n        var pathData = pathMap.getScaledPath('DATA_OBJECT_PATH', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.474,\n            my: 0.296\n          }\n        });\n\n        var elementObject = drawPath(parentGfx, pathData, {\n          fill: getFillColor(element, defaultFillColor),\n          fillOpacity: DEFAULT_FILL_OPACITY,\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        var semantic = getBusinessObject(element);\n\n        if (isCollection(semantic)) {\n          renderDataItemCollection(parentGfx, element);\n        }\n\n        return elementObject;\n      },\n      'bpmn:DataObjectReference': as('bpmn:DataObject'),\n      'bpmn:DataInput': function(parentGfx, element) {\n\n        var arrowPathData = pathMap.getRawPath('DATA_ARROW');\n\n        // page\n        var elementObject = renderer('bpmn:DataObject')(parentGfx, element);\n\n        /* input arrow path */ drawPath(parentGfx, arrowPathData, { strokeWidth: 1 });\n\n        return elementObject;\n      },\n      'bpmn:DataOutput': function(parentGfx, element) {\n        var arrowPathData = pathMap.getRawPath('DATA_ARROW');\n\n        // page\n        var elementObject = renderer('bpmn:DataObject')(parentGfx, element);\n\n        /* output arrow path */ drawPath(parentGfx, arrowPathData, {\n          strokeWidth: 1,\n          fill: black\n        });\n\n        return elementObject;\n      },\n      'bpmn:DataStoreReference': function(parentGfx, element) {\n        var DATA_STORE_PATH = pathMap.getScaledPath('DATA_STORE', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0,\n            my: 0.133\n          }\n        });\n\n        var elementStore = drawPath(parentGfx, DATA_STORE_PATH, {\n          strokeWidth: 2,\n          fill: getFillColor(element, defaultFillColor),\n          fillOpacity: DEFAULT_FILL_OPACITY,\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        return elementStore;\n      },\n      'bpmn:BoundaryEvent': function(parentGfx, element, options) {\n\n        var semantic = getBusinessObject(element),\n            cancel = semantic.cancelActivity;\n\n        var attrs = {\n          strokeWidth: 1.5,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        };\n\n        if (!cancel) {\n          attrs.strokeDasharray = '6';\n        }\n\n        // apply fillOpacity\n        var outerAttrs = {\n          ...attrs,\n          fillOpacity: 1\n        };\n\n        // apply no-fill\n        var innerAttrs = {\n          ...attrs,\n          fill: 'none'\n        };\n\n        var outer = renderer('bpmn:Event')(parentGfx, element, outerAttrs);\n\n        /* inner path */ drawCircle(parentGfx, element.width, element.height, INNER_OUTER_DIST, innerAttrs);\n\n        if (!options || options.renderIcon !== false) {\n          renderEventContent(element, parentGfx);\n        }\n\n        return outer;\n      },\n      'bpmn:Group': function(parentGfx, element) {\n        return drawRect(parentGfx, element.width, element.height, TASK_BORDER_RADIUS, {\n          stroke: getStrokeColor$1(element, defaultStrokeColor),\n          strokeWidth: 1.5,\n          strokeDasharray: '10,6,0,6',\n          fill: 'none',\n          pointerEvents: 'none'\n        });\n      },\n      'label': function(parentGfx, element) {\n        return renderExternalLabel(parentGfx, element);\n      },\n      'bpmn:TextAnnotation': function(parentGfx, element) {\n        var textElement = drawRect(parentGfx, element.width, element.height, 0, 0, {\n          'fill': 'none',\n          'stroke': 'none'\n        });\n\n        var textPathData = pathMap.getScaledPath('TEXT_ANNOTATION', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.0,\n            my: 0.0\n          }\n        });\n\n        drawPath(parentGfx, textPathData, {\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        var text = getBusinessObject(element).text || '';\n        renderLabel(parentGfx, text, {\n          box: element,\n          align: 'left-top',\n          padding: 7,\n          style: {\n            fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor)\n          }\n        });\n\n        return textElement;\n      },\n      'ParticipantMultiplicityMarker': function(parentGfx, element) {\n        var markerPath = pathMap.getScaledPath('MARKER_PARALLEL', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: ((element.width / 2) / element.width),\n            my: (element.height - 15) / element.height\n          }\n        });\n\n        drawMarker('participant-multiplicity', parentGfx, markerPath, {\n          strokeWidth: 2,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n      },\n      'SubProcessMarker': function(parentGfx, element) {\n        var markerRect = drawRect(parentGfx, 14, 14, 0, {\n          strokeWidth: 1,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n\n        // Process marker is placed in the middle of the box\n        // therefore fixed values can be used here\n        translate$2(markerRect, element.width / 2 - 7.5, element.height - 20);\n\n        var markerPath = pathMap.getScaledPath('MARKER_SUB_PROCESS', {\n          xScaleFactor: 1.5,\n          yScaleFactor: 1.5,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: (element.width / 2 - 7.5) / element.width,\n            my: (element.height - 20) / element.height\n          }\n        });\n\n        drawMarker('sub-process', parentGfx, markerPath, {\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n      },\n      'ParallelMarker': function(parentGfx, element, position) {\n        var markerPath = pathMap.getScaledPath('MARKER_PARALLEL', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: ((element.width / 2 + position.parallel) / element.width),\n            my: (element.height - 20) / element.height\n          }\n        });\n\n        drawMarker('parallel', parentGfx, markerPath, {\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n      },\n      'SequentialMarker': function(parentGfx, element, position) {\n        var markerPath = pathMap.getScaledPath('MARKER_SEQUENTIAL', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: ((element.width / 2 + position.seq) / element.width),\n            my: (element.height - 19) / element.height\n          }\n        });\n\n        drawMarker('sequential', parentGfx, markerPath, {\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n      },\n      'CompensationMarker': function(parentGfx, element, position) {\n        var markerMath = pathMap.getScaledPath('MARKER_COMPENSATION', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: ((element.width / 2 + position.compensation) / element.width),\n            my: (element.height - 13) / element.height\n          }\n        });\n\n        drawMarker('compensation', parentGfx, markerMath, {\n          strokeWidth: 1,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n      },\n      'LoopMarker': function(parentGfx, element, position) {\n        var markerPath = pathMap.getScaledPath('MARKER_LOOP', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: ((element.width / 2 + position.loop) / element.width),\n            my: (element.height - 7) / element.height\n          }\n        });\n\n        drawMarker('loop', parentGfx, markerPath, {\n          strokeWidth: 1.5,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor),\n          strokeMiterlimit: 0.5\n        });\n      },\n      'AdhocMarker': function(parentGfx, element, position) {\n        var markerPath = pathMap.getScaledPath('MARKER_ADHOC', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: ((element.width / 2 + position.adhoc) / element.width),\n            my: (element.height - 15) / element.height\n          }\n        });\n\n        drawMarker('adhoc', parentGfx, markerPath, {\n          strokeWidth: 1,\n          fill: getStrokeColor$1(element, defaultStrokeColor),\n          stroke: getStrokeColor$1(element, defaultStrokeColor)\n        });\n      }\n    };\n\n    function attachTaskMarkers(parentGfx, element, taskMarkers) {\n      var obj = getBusinessObject(element);\n\n      var subprocess = taskMarkers && taskMarkers.indexOf('SubProcessMarker') !== -1;\n      var position;\n\n      if (subprocess) {\n        position = {\n          seq: -21,\n          parallel: -22,\n          compensation: -42,\n          loop: -18,\n          adhoc: 10\n        };\n      } else {\n        position = {\n          seq: -3,\n          parallel: -6,\n          compensation: -27,\n          loop: 0,\n          adhoc: 10\n        };\n      }\n\n      forEach$1(taskMarkers, function(marker) {\n        renderer(marker)(parentGfx, element, position);\n      });\n\n      if (obj.isForCompensation) {\n        renderer('CompensationMarker')(parentGfx, element, position);\n      }\n\n      if (obj.$type === 'bpmn:AdHocSubProcess') {\n        renderer('AdhocMarker')(parentGfx, element, position);\n      }\n\n      var loopCharacteristics = obj.loopCharacteristics,\n          isSequential = loopCharacteristics && loopCharacteristics.isSequential;\n\n      if (loopCharacteristics) {\n\n        if (isSequential === undefined) {\n          renderer('LoopMarker')(parentGfx, element, position);\n        }\n\n        if (isSequential === false) {\n          renderer('ParallelMarker')(parentGfx, element, position);\n        }\n\n        if (isSequential === true) {\n          renderer('SequentialMarker')(parentGfx, element, position);\n        }\n      }\n    }\n\n    function renderDataItemCollection(parentGfx, element) {\n\n      var yPosition = (element.height - 18) / element.height;\n\n      var pathData = pathMap.getScaledPath('DATA_OBJECT_COLLECTION_PATH', {\n        xScaleFactor: 1,\n        yScaleFactor: 1,\n        containerWidth: element.width,\n        containerHeight: element.height,\n        position: {\n          mx: 0.33,\n          my: yPosition\n        }\n      });\n\n      /* collection path */ drawPath(parentGfx, pathData, {\n        strokeWidth: 2\n      });\n    }\n\n\n    // extension API, use at your own risk\n    this._drawPath = drawPath;\n\n    this._renderer = renderer;\n  }\n\n\n  e$3(BpmnRenderer, BaseRenderer);\n\n  BpmnRenderer.$inject = [\n    'config.bpmnRenderer',\n    'eventBus',\n    'styles',\n    'pathMap',\n    'canvas',\n    'textRenderer'\n  ];\n\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  BpmnRenderer.prototype.canRender = function(element) {\n    return is$1(element, 'bpmn:BaseElement');\n  };\n\n  /**\n   * Draw shape into parentGfx.\n   *\n   * @param {SVGElement} parentGfx\n   * @param {Element} element\n   *\n   * @return {SVGElement} mainGfx\n   */\n  BpmnRenderer.prototype.drawShape = function(parentGfx, element) {\n    var type = element.type;\n    var h = this._renderer(type);\n\n    /* jshint -W040 */\n    return h(parentGfx, element);\n  };\n\n  /**\n   * Draw connection into parentGfx.\n   *\n   * @param {SVGElement} parentGfx\n   * @param {Element} element\n   *\n   * @return {SVGElement} mainGfx\n   */\n  BpmnRenderer.prototype.drawConnection = function(parentGfx, element) {\n    var type = element.type;\n    var h = this._renderer(type);\n\n    /* jshint -W040 */\n    return h(parentGfx, element);\n  };\n\n  /**\n   * Get shape path.\n   *\n   * @param {Element} element\n   *\n   * @return {string} path\n   */\n  BpmnRenderer.prototype.getShapePath = function(element) {\n\n    if (is$1(element, 'bpmn:Event')) {\n      return getCirclePath(element);\n    }\n\n    if (is$1(element, 'bpmn:Activity')) {\n      return getRoundRectPath(element, TASK_BORDER_RADIUS);\n    }\n\n    if (is$1(element, 'bpmn:Gateway')) {\n      return getDiamondPath(element);\n    }\n\n    return getRectPath(element);\n  };\n\n  /**\n   * @typedef {import('../util/Types').Dimensions} Dimensions\n   *\n   * @typedef { {\n   *   top: number;\n   *   left: number;\n   *   right: number;\n   *   bottom: number;\n   * } } Padding\n   *\n   * @typedef { number | Partial<Padding> } PaddingConfig\n   *\n   * @typedef { {\n   *   horizontal: 'center' | 'left';\n   *   vertical: 'top' | 'center';\n   * } } Alignment\n   *\n   *  @typedef { 'center-middle' | 'center-top' } AlignmentConfig\n   *\n   * @typedef { Partial<{\n   *   align: AlignmentConfig;\n   *   style: Record<string, number | string>;\n   *   padding: PaddingConfig;\n   * }> } BaseTextConfig\n   *\n   * @typedef { BaseTextConfig & Partial<{\n   *   size: Dimensions;\n   * }> } TextConfig\n   *\n   * @typedef { BaseTextConfig & Partial<{\n   *   box: Dimensions;\n   *   fitBox: boolean;\n   * }> } TextLayoutConfig\n   *\n   *  @typedef { Dimensions & {\n   *  text: string;\n   * } } LineDescriptor\n   */\n\n  var DEFAULT_BOX_PADDING = 0;\n\n  var DEFAULT_LABEL_SIZE = {\n    width: 150,\n    height: 50\n  };\n\n\n  /**\n   * @param {AlignmentConfig} align\n   * @return {Alignment}\n   */\n  function parseAlign(align) {\n\n    var parts = align.split('-');\n\n    return {\n      horizontal: parts[0] || 'center',\n      vertical: parts[1] || 'top'\n    };\n  }\n\n  /**\n   * @param {PaddingConfig} padding\n   *\n   * @return {Padding}\n   */\n  function parsePadding(padding) {\n\n    if (isObject(padding)) {\n      return assign$1({ top: 0, left: 0, right: 0, bottom: 0 }, padding);\n    } else {\n      return {\n        top: padding,\n        left: padding,\n        right: padding,\n        bottom: padding\n      };\n    }\n  }\n\n  /**\n   * @param {string} text\n   * @param {SVGTextElement} fakeText\n   *\n   * @return {import('../util/Types').Dimensions}\n   */\n  function getTextBBox(text, fakeText) {\n\n    fakeText.textContent = text;\n\n    var textBBox;\n\n    try {\n      var bbox,\n          emptyLine = text === '';\n\n      // add dummy text, when line is empty to\n      // determine correct height\n      fakeText.textContent = emptyLine ? 'dummy' : text;\n\n      textBBox = fakeText.getBBox();\n\n      // take text rendering related horizontal\n      // padding into account\n      bbox = {\n        width: textBBox.width + textBBox.x * 2,\n        height: textBBox.height\n      };\n\n      if (emptyLine) {\n\n        // correct width\n        bbox.width = 0;\n      }\n\n      return bbox;\n    } catch (e) {\n      return { width: 0, height: 0 };\n    }\n  }\n\n\n  /**\n   * Layout the next line and return the layouted element.\n   *\n   * Alters the lines passed.\n   *\n   * @param {string[]} lines\n   * @param {number} maxWidth\n   * @param {SVGTextElement} fakeText\n   *\n   * @return {LineDescriptor} the line descriptor\n   */\n  function layoutNext(lines, maxWidth, fakeText) {\n\n    var originalLine = lines.shift(),\n        fitLine = originalLine;\n\n    var textBBox;\n\n    for (;;) {\n      textBBox = getTextBBox(fitLine, fakeText);\n\n      textBBox.width = fitLine ? textBBox.width : 0;\n\n      // try to fit\n      if (fitLine === ' ' || fitLine === '' || textBBox.width < Math.round(maxWidth) || fitLine.length < 2) {\n        return fit(lines, fitLine, originalLine, textBBox);\n      }\n\n      fitLine = shortenLine(fitLine, textBBox.width, maxWidth);\n    }\n  }\n\n  /**\n   * @param {string[]} lines\n   * @param {string} fitLine\n   * @param {string} originalLine\n   * @param {Dimensions} textBBox\n   *\n   * @return {LineDescriptor}\n   */\n  function fit(lines, fitLine, originalLine, textBBox) {\n    if (fitLine.length < originalLine.length) {\n      var remainder = originalLine.slice(fitLine.length).trim();\n\n      lines.unshift(remainder);\n    }\n\n    return {\n      width: textBBox.width,\n      height: textBBox.height,\n      text: fitLine\n    };\n  }\n\n  var SOFT_BREAK = '\\u00AD';\n\n\n  /**\n   * Shortens a line based on spacing and hyphens.\n   * Returns the shortened result on success.\n   *\n   * @param {string} line\n   * @param {number} maxLength the maximum characters of the string\n   *\n   * @return {string} the shortened string\n   */\n  function semanticShorten(line, maxLength) {\n\n    var parts = line.split(/(\\s|-|\\u00AD)/g),\n        part,\n        shortenedParts = [],\n        length = 0;\n\n    // try to shorten via break chars\n    if (parts.length > 1) {\n\n      while ((part = parts.shift())) {\n        if (part.length + length < maxLength) {\n          shortenedParts.push(part);\n          length += part.length;\n        } else {\n\n          // remove previous part, too if hyphen does not fit anymore\n          if (part === '-' || part === SOFT_BREAK) {\n            shortenedParts.pop();\n          }\n\n          break;\n        }\n      }\n    }\n\n    var last = shortenedParts[shortenedParts.length - 1];\n\n    // translate trailing soft break to actual hyphen\n    if (last && last === SOFT_BREAK) {\n      shortenedParts[shortenedParts.length - 1] = '-';\n    }\n\n    return shortenedParts.join('');\n  }\n\n\n  /**\n   * @param {string} line\n   * @param {number} width\n   * @param {number} maxWidth\n   *\n   * @return {string}\n   */\n  function shortenLine(line, width, maxWidth) {\n    var length = Math.max(line.length * (maxWidth / width), 1);\n\n    // try to shorten semantically (i.e. based on spaces and hyphens)\n    var shortenedLine = semanticShorten(line, length);\n\n    if (!shortenedLine) {\n\n      // force shorten by cutting the long word\n      shortenedLine = line.slice(0, Math.max(Math.round(length - 1), 1));\n    }\n\n    return shortenedLine;\n  }\n\n\n  /**\n   * @return {SVGSVGElement}\n   */\n  function getHelperSvg() {\n    var helperSvg = document.getElementById('helper-svg');\n\n    if (!helperSvg) {\n      helperSvg = create$1('svg');\n\n      attr(helperSvg, {\n        id: 'helper-svg'\n      });\n\n      assign(helperSvg, {\n        visibility: 'hidden',\n        position: 'fixed',\n        width: 0,\n        height: 0\n      });\n\n      document.body.appendChild(helperSvg);\n    }\n\n    return helperSvg;\n  }\n\n\n  /**\n   * Creates a new label utility\n   *\n   * @param {TextConfig} config\n   */\n  function Text(config) {\n\n    this._config = assign$1({}, {\n      size: DEFAULT_LABEL_SIZE,\n      padding: DEFAULT_BOX_PADDING,\n      style: {},\n      align: 'center-top'\n    }, config || {});\n  }\n\n  /**\n   * Returns the layouted text as an SVG element.\n   *\n   * @param {string} text\n   * @param {TextLayoutConfig} options\n   *\n   * @return {SVGElement}\n   */\n  Text.prototype.createText = function(text, options) {\n    return this.layoutText(text, options).element;\n  };\n\n  /**\n   * Returns a labels layouted dimensions.\n   *\n   * @param {string} text to layout\n   * @param {TextLayoutConfig} options\n   *\n   * @return {Dimensions}\n   */\n  Text.prototype.getDimensions = function(text, options) {\n    return this.layoutText(text, options).dimensions;\n  };\n\n  /**\n   * Creates and returns a label and its bounding box.\n   *\n   * @param {string} text the text to render on the label\n   * @param {TextLayoutConfig} options\n   *\n   * @return { {\n   *   element: SVGElement,\n   *   dimensions: Dimensions\n   * } }\n   */\n  Text.prototype.layoutText = function(text, options) {\n    var box = assign$1({}, this._config.size, options.box),\n        style = assign$1({}, this._config.style, options.style),\n        align = parseAlign(options.align || this._config.align),\n        padding = parsePadding(options.padding !== undefined ? options.padding : this._config.padding),\n        fitBox = options.fitBox || false;\n\n    var lineHeight = getLineHeight(style);\n\n    // we split text by lines and normalize\n    // {soft break} + {line break} => { line break }\n    var lines = text.split(/\\u00AD?\\r?\\n/),\n        layouted = [];\n\n    var maxWidth = box.width - padding.left - padding.right;\n\n    // ensure correct rendering by attaching helper text node to invisible SVG\n    var helperText = create$1('text');\n    attr(helperText, { x: 0, y: 0 });\n    attr(helperText, style);\n\n    var helperSvg = getHelperSvg();\n\n    append(helperSvg, helperText);\n\n    while (lines.length) {\n      layouted.push(layoutNext(lines, maxWidth, helperText));\n    }\n\n    if (align.vertical === 'middle') {\n      padding.top = padding.bottom = 0;\n    }\n\n    var totalHeight = reduce(layouted, function(sum, line, idx) {\n      return sum + (lineHeight || line.height);\n    }, 0) + padding.top + padding.bottom;\n\n    var maxLineWidth = reduce(layouted, function(sum, line, idx) {\n      return line.width > sum ? line.width : sum;\n    }, 0);\n\n    // the y position of the next line\n    var y = padding.top;\n\n    if (align.vertical === 'middle') {\n      y += (box.height - totalHeight) / 2;\n    }\n\n    // magic number initial offset\n    y -= (lineHeight || layouted[0].height) / 4;\n\n\n    var textElement = create$1('text');\n\n    attr(textElement, style);\n\n    // layout each line taking into account that parent\n    // shape might resize to fit text size\n    forEach$1(layouted, function(line) {\n\n      var x;\n\n      y += (lineHeight || line.height);\n\n      switch (align.horizontal) {\n      case 'left':\n        x = padding.left;\n        break;\n\n      case 'right':\n        x = ((fitBox ? maxLineWidth : maxWidth)\n          - padding.right - line.width);\n        break;\n\n      default:\n\n        // aka center\n        x = Math.max((((fitBox ? maxLineWidth : maxWidth)\n          - line.width) / 2 + padding.left), 0);\n      }\n\n      var tspan = create$1('tspan');\n      attr(tspan, { x: x, y: y });\n\n      tspan.textContent = line.text;\n\n      append(textElement, tspan);\n    });\n\n    remove$1(helperText);\n\n    var dimensions = {\n      width: maxLineWidth,\n      height: totalHeight\n    };\n\n    return {\n      dimensions: dimensions,\n      element: textElement\n    };\n  };\n\n\n  function getLineHeight(style) {\n    if ('fontSize' in style && 'lineHeight' in style) {\n      return style.lineHeight * parseInt(style.fontSize, 10);\n    }\n  }\n\n  var DEFAULT_FONT_SIZE = 12;\n  var LINE_HEIGHT_RATIO = 1.2;\n\n  var MIN_TEXT_ANNOTATION_HEIGHT = 30;\n\n  /**\n   * @typedef { {\n   *   fontFamily: string;\n   *   fontSize: number;\n   *   fontWeight: string;\n   *   lineHeight: number;\n   * } } TextRendererStyle\n   *\n   * @typedef { {\n   *   defaultStyle?: Partial<TextRendererStyle>;\n   *   externalStyle?: Partial<TextRendererStyle>;\n   * } } TextRendererConfig\n   *\n   * @typedef { import('diagram-js/lib/util/Text').TextLayoutConfig } TextLayoutConfig\n   *\n   * @typedef { import('diagram-js/lib/util/Types').Rect } Rect\n   */\n\n\n  /**\n   * Renders text and computes text bounding boxes.\n   *\n   * @param {TextRendererConfig} [config]\n   */\n  function TextRenderer(config) {\n\n    var defaultStyle = assign$1({\n      fontFamily: 'Arial, sans-serif',\n      fontSize: DEFAULT_FONT_SIZE,\n      fontWeight: 'normal',\n      lineHeight: LINE_HEIGHT_RATIO\n    }, config && config.defaultStyle || {});\n\n    var fontSize = parseInt(defaultStyle.fontSize, 10) - 1;\n\n    var externalStyle = assign$1({}, defaultStyle, {\n      fontSize: fontSize\n    }, config && config.externalStyle || {});\n\n    var textUtil = new Text({\n      style: defaultStyle\n    });\n\n    /**\n     * Get the new bounds of an externally rendered,\n     * layouted label.\n     *\n     * @param {Rect} bounds\n     * @param {string} text\n     *\n     * @return {Rect}\n     */\n    this.getExternalLabelBounds = function(bounds, text) {\n\n      var layoutedDimensions = textUtil.getDimensions(text, {\n        box: {\n          width: 90,\n          height: 30\n        },\n        style: externalStyle\n      });\n\n      // resize label shape to fit label text\n      return {\n        x: Math.round(bounds.x + bounds.width / 2 - layoutedDimensions.width / 2),\n        y: Math.round(bounds.y),\n        width: Math.ceil(layoutedDimensions.width),\n        height: Math.ceil(layoutedDimensions.height)\n      };\n\n    };\n\n    /**\n     * Get the new bounds of text annotation.\n     *\n     * @param {Rect} bounds\n     * @param {string} text\n     *\n     * @return {Rect}\n     */\n    this.getTextAnnotationBounds = function(bounds, text) {\n\n      var layoutedDimensions = textUtil.getDimensions(text, {\n        box: bounds,\n        style: defaultStyle,\n        align: 'left-top',\n        padding: 5\n      });\n\n      return {\n        x: bounds.x,\n        y: bounds.y,\n        width: bounds.width,\n        height: Math.max(MIN_TEXT_ANNOTATION_HEIGHT, Math.round(layoutedDimensions.height))\n      };\n    };\n\n    /**\n     * Create a layouted text element.\n     *\n     * @param {string} text\n     * @param {TextLayoutConfig} [options]\n     *\n     * @return {SVGElement} rendered text\n     */\n    this.createText = function(text, options) {\n      return textUtil.createText(text, options || {});\n    };\n\n    /**\n     * Get default text style.\n     */\n    this.getDefaultStyle = function() {\n      return defaultStyle;\n    };\n\n    /**\n     * Get the external text style.\n     */\n    this.getExternalStyle = function() {\n      return externalStyle;\n    };\n\n  }\n\n  TextRenderer.$inject = [\n    'config.textRenderer'\n  ];\n\n  /**\n   * Map containing SVG paths needed by BpmnRenderer\n   */\n  function PathMap() {\n\n    /**\n     * Contains a map of path elements\n     *\n     * <h1>Path definition</h1>\n     * A parameterized path is defined like this:\n     * <pre>\n     * 'GATEWAY_PARALLEL': {\n     *   d: 'm {mx},{my} {e.x0},0 0,{e.x1} {e.x1},0 0,{e.y0} -{e.x1},0 0,{e.y1} ' +\n            '-{e.x0},0 0,-{e.y1} -{e.x1},0 0,-{e.y0} {e.x1},0 z',\n     *   height: 17.5,\n     *   width:  17.5,\n     *   heightElements: [2.5, 7.5],\n     *   widthElements: [2.5, 7.5]\n     * }\n     * </pre>\n     * <p>It's important to specify a correct <b>height and width</b> for the path as the scaling\n     * is based on the ratio between the specified height and width in this object and the\n     * height and width that is set as scale target (Note x,y coordinates will be scaled with\n     * individual ratios).</p>\n     * <p>The '<b>heightElements</b>' and '<b>widthElements</b>' array must contain the values that will be scaled.\n     * The scaling is based on the computed ratios.\n     * Coordinates on the y axis should be in the <b>heightElement</b>'s array, they will be scaled using\n     * the computed ratio coefficient.\n     * In the parameterized path the scaled values can be accessed through the 'e' object in {} brackets.\n     *   <ul>\n     *    <li>The values for the y axis can be accessed in the path string using {e.y0}, {e.y1}, ....</li>\n     *    <li>The values for the x axis can be accessed in the path string using {e.x0}, {e.x1}, ....</li>\n     *   </ul>\n     *   The numbers x0, x1 respectively y0, y1, ... map to the corresponding array index.\n     * </p>\n     */\n    this.pathMap = {\n      'EVENT_MESSAGE': {\n        d: 'm {mx},{my} l 0,{e.y1} l {e.x1},0 l 0,-{e.y1} z l {e.x0},{e.y0} l {e.x0},-{e.y0}',\n        height: 36,\n        width:  36,\n        heightElements: [ 6, 14 ],\n        widthElements: [ 10.5, 21 ]\n      },\n      'EVENT_SIGNAL': {\n        d: 'M {mx},{my} l {e.x0},{e.y0} l -{e.x1},0 Z',\n        height: 36,\n        width: 36,\n        heightElements: [ 18 ],\n        widthElements: [ 10, 20 ]\n      },\n      'EVENT_ESCALATION': {\n        d: 'M {mx},{my} l {e.x0},{e.y0} l -{e.x0},-{e.y1} l -{e.x0},{e.y1} Z',\n        height: 36,\n        width: 36,\n        heightElements: [ 20, 7 ],\n        widthElements: [ 8 ]\n      },\n      'EVENT_CONDITIONAL': {\n        d: 'M {e.x0},{e.y0} l {e.x1},0 l 0,{e.y2} l -{e.x1},0 Z ' +\n           'M {e.x2},{e.y3} l {e.x0},0 ' +\n           'M {e.x2},{e.y4} l {e.x0},0 ' +\n           'M {e.x2},{e.y5} l {e.x0},0 ' +\n           'M {e.x2},{e.y6} l {e.x0},0 ' +\n           'M {e.x2},{e.y7} l {e.x0},0 ' +\n           'M {e.x2},{e.y8} l {e.x0},0 ',\n        height: 36,\n        width:  36,\n        heightElements: [ 8.5, 14.5, 18, 11.5, 14.5, 17.5, 20.5, 23.5, 26.5 ],\n        widthElements:  [ 10.5, 14.5, 12.5 ]\n      },\n      'EVENT_LINK': {\n        d: 'm {mx},{my} 0,{e.y0} -{e.x1},0 0,{e.y1} {e.x1},0 0,{e.y0} {e.x0},-{e.y2} -{e.x0},-{e.y2} z',\n        height: 36,\n        width: 36,\n        heightElements: [ 4.4375, 6.75, 7.8125 ],\n        widthElements: [ 9.84375, 13.5 ]\n      },\n      'EVENT_ERROR': {\n        d: 'm {mx},{my} {e.x0},-{e.y0} {e.x1},-{e.y1} {e.x2},{e.y2} {e.x3},-{e.y3} -{e.x4},{e.y4} -{e.x5},-{e.y5} z',\n        height: 36,\n        width: 36,\n        heightElements: [ 0.023, 8.737, 8.151, 16.564, 10.591, 8.714 ],\n        widthElements: [ 0.085, 6.672, 6.97, 4.273, 5.337, 6.636 ]\n      },\n      'EVENT_CANCEL_45': {\n        d: 'm {mx},{my} -{e.x1},0 0,{e.x0} {e.x1},0 0,{e.y1} {e.x0},0 ' +\n          '0,-{e.y1} {e.x1},0 0,-{e.y0} -{e.x1},0 0,-{e.y1} -{e.x0},0 z',\n        height: 36,\n        width: 36,\n        heightElements: [ 4.75, 8.5 ],\n        widthElements: [ 4.75, 8.5 ]\n      },\n      'EVENT_COMPENSATION': {\n        d: 'm {mx},{my} {e.x0},-{e.y0} 0,{e.y1} z m {e.x1},-{e.y2} {e.x2},-{e.y3} 0,{e.y1} -{e.x2},-{e.y3} z',\n        height: 36,\n        width: 36,\n        heightElements: [ 6.5, 13, 0.4, 6.1 ],\n        widthElements: [ 9, 9.3, 8.7 ]\n      },\n      'EVENT_TIMER_WH': {\n        d: 'M {mx},{my} l {e.x0},-{e.y0} m -{e.x0},{e.y0} l {e.x1},{e.y1} ',\n        height: 36,\n        width:  36,\n        heightElements: [ 10, 2 ],\n        widthElements: [ 3, 7 ]\n      },\n      'EVENT_TIMER_LINE': {\n        d:  'M {mx},{my} ' +\n            'm {e.x0},{e.y0} l -{e.x1},{e.y1} ',\n        height: 36,\n        width:  36,\n        heightElements: [ 10, 3 ],\n        widthElements: [ 0, 0 ]\n      },\n      'EVENT_MULTIPLE': {\n        d:'m {mx},{my} {e.x1},-{e.y0} {e.x1},{e.y0} -{e.x0},{e.y1} -{e.x2},0 z',\n        height: 36,\n        width:  36,\n        heightElements: [ 6.28099, 12.56199 ],\n        widthElements: [ 3.1405, 9.42149, 12.56198 ]\n      },\n      'EVENT_PARALLEL_MULTIPLE': {\n        d:'m {mx},{my} {e.x0},0 0,{e.y1} {e.x1},0 0,{e.y0} -{e.x1},0 0,{e.y1} ' +\n          '-{e.x0},0 0,-{e.y1} -{e.x1},0 0,-{e.y0} {e.x1},0 z',\n        height: 36,\n        width:  36,\n        heightElements: [ 2.56228, 7.68683 ],\n        widthElements: [ 2.56228, 7.68683 ]\n      },\n      'GATEWAY_EXCLUSIVE': {\n        d:'m {mx},{my} {e.x0},{e.y0} {e.x1},{e.y0} {e.x2},0 {e.x4},{e.y2} ' +\n                      '{e.x4},{e.y1} {e.x2},0 {e.x1},{e.y3} {e.x0},{e.y3} ' +\n                      '{e.x3},0 {e.x5},{e.y1} {e.x5},{e.y2} {e.x3},0 z',\n        height: 17.5,\n        width:  17.5,\n        heightElements: [ 8.5, 6.5312, -6.5312, -8.5 ],\n        widthElements:  [ 6.5, -6.5, 3, -3, 5, -5 ]\n      },\n      'GATEWAY_PARALLEL': {\n        d:'m {mx},{my} 0,{e.y1} -{e.x1},0 0,{e.y0} {e.x1},0 0,{e.y1} {e.x0},0 ' +\n          '0,-{e.y1} {e.x1},0 0,-{e.y0} -{e.x1},0 0,-{e.y1} -{e.x0},0 z',\n        height: 30,\n        width:  30,\n        heightElements: [ 5, 12.5 ],\n        widthElements: [ 5, 12.5 ]\n      },\n      'GATEWAY_EVENT_BASED': {\n        d:'m {mx},{my} {e.x0},{e.y0} {e.x0},{e.y1} {e.x1},{e.y2} {e.x2},0 z',\n        height: 11,\n        width:  11,\n        heightElements: [ -6, 6, 12, -12 ],\n        widthElements: [ 9, -3, -12 ]\n      },\n      'GATEWAY_COMPLEX': {\n        d:'m {mx},{my} 0,{e.y0} -{e.x0},-{e.y1} -{e.x1},{e.y2} {e.x0},{e.y1} -{e.x2},0 0,{e.y3} ' +\n          '{e.x2},0  -{e.x0},{e.y1} l {e.x1},{e.y2} {e.x0},-{e.y1} 0,{e.y0} {e.x3},0 0,-{e.y0} {e.x0},{e.y1} ' +\n          '{e.x1},-{e.y2} -{e.x0},-{e.y1} {e.x2},0 0,-{e.y3} -{e.x2},0 {e.x0},-{e.y1} -{e.x1},-{e.y2} ' +\n          '-{e.x0},{e.y1} 0,-{e.y0} -{e.x3},0 z',\n        height: 17.125,\n        width:  17.125,\n        heightElements: [ 4.875, 3.4375, 2.125, 3 ],\n        widthElements: [ 3.4375, 2.125, 4.875, 3 ]\n      },\n      'DATA_OBJECT_PATH': {\n        d:'m 0,0 {e.x1},0 {e.x0},{e.y0} 0,{e.y1} -{e.x2},0 0,-{e.y2} {e.x1},0 0,{e.y0} {e.x0},0',\n        height: 61,\n        width:  51,\n        heightElements: [ 10, 50, 60 ],\n        widthElements: [ 10, 40, 50, 60 ]\n      },\n      'DATA_OBJECT_COLLECTION_PATH': {\n        d: 'm{mx},{my} m 3,2 l 0,10 m 3,-10 l 0,10 m 3,-10 l 0,10',\n        height: 10,\n        width: 10,\n        heightElements: [],\n        widthElements: []\n      },\n      'DATA_ARROW': {\n        d:'m 5,9 9,0 0,-3 5,5 -5,5 0,-3 -9,0 z',\n        height: 61,\n        width:  51,\n        heightElements: [],\n        widthElements: []\n      },\n      'DATA_STORE': {\n        d:'m  {mx},{my} ' +\n          'l  0,{e.y2} ' +\n          'c  {e.x0},{e.y1} {e.x1},{e.y1}  {e.x2},0 ' +\n          'l  0,-{e.y2} ' +\n          'c -{e.x0},-{e.y1} -{e.x1},-{e.y1} -{e.x2},0' +\n          'c  {e.x0},{e.y1} {e.x1},{e.y1}  {e.x2},0 ' +\n          'm  -{e.x2},{e.y0}' +\n          'c  {e.x0},{e.y1} {e.x1},{e.y1} {e.x2},0' +\n          'm  -{e.x2},{e.y0}' +\n          'c  {e.x0},{e.y1} {e.x1},{e.y1}  {e.x2},0',\n        height: 61,\n        width:  61,\n        heightElements: [ 7, 10, 45 ],\n        widthElements:  [ 2, 58, 60 ]\n      },\n      'TEXT_ANNOTATION': {\n        d: 'm {mx}, {my} m 10,0 l -10,0 l 0,{e.y0} l 10,0',\n        height: 30,\n        width: 10,\n        heightElements: [ 30 ],\n        widthElements: [ 10 ]\n      },\n      'MARKER_SUB_PROCESS': {\n        d: 'm{mx},{my} m 7,2 l 0,10 m -5,-5 l 10,0',\n        height: 10,\n        width: 10,\n        heightElements: [],\n        widthElements: []\n      },\n      'MARKER_PARALLEL': {\n        d: 'm{mx},{my} m 3,2 l 0,10 m 3,-10 l 0,10 m 3,-10 l 0,10',\n        height: 10,\n        width: 10,\n        heightElements: [],\n        widthElements: []\n      },\n      'MARKER_SEQUENTIAL': {\n        d: 'm{mx},{my} m 0,3 l 10,0 m -10,3 l 10,0 m -10,3 l 10,0',\n        height: 10,\n        width: 10,\n        heightElements: [],\n        widthElements: []\n      },\n      'MARKER_COMPENSATION': {\n        d: 'm {mx},{my} 7,-5 0,10 z m 7.1,-0.3 6.9,-4.7 0,10 -6.9,-4.7 z',\n        height: 10,\n        width: 21,\n        heightElements: [],\n        widthElements: []\n      },\n      'MARKER_LOOP': {\n        d: 'm {mx},{my} c 3.526979,0 6.386161,-2.829858 6.386161,-6.320661 0,-3.490806 -2.859182,-6.320661 ' +\n          '-6.386161,-6.320661 -3.526978,0 -6.38616,2.829855 -6.38616,6.320661 0,1.745402 ' +\n          '0.714797,3.325567 1.870463,4.469381 0.577834,0.571908 1.265885,1.034728 2.029916,1.35457 ' +\n          'l -0.718163,-3.909793 m 0.718163,3.909793 -3.885211,0.802902',\n        height: 13.9,\n        width: 13.7,\n        heightElements: [],\n        widthElements: []\n      },\n      'MARKER_ADHOC': {\n        d: 'm {mx},{my} m 0.84461,2.64411 c 1.05533,-1.23780996 2.64337,-2.07882 4.29653,-1.97997996 2.05163,0.0805 ' +\n          '3.85579,1.15803 5.76082,1.79107 1.06385,0.34139996 2.24454,0.1438 3.18759,-0.43767 0.61743,-0.33642 ' +\n          '1.2775,-0.64078 1.7542,-1.17511 0,0.56023 0,1.12046 0,1.6807 -0.98706,0.96237996 -2.29792,1.62393996 ' +\n          '-3.6918,1.66181996 -1.24459,0.0927 -2.46671,-0.2491 -3.59505,-0.74812 -1.35789,-0.55965 ' +\n          '-2.75133,-1.33436996 -4.27027,-1.18121996 -1.37741,0.14601 -2.41842,1.13685996 -3.44288,1.96782996 z',\n        height: 4,\n        width: 15,\n        heightElements: [],\n        widthElements: []\n      },\n      'TASK_TYPE_SEND': {\n        d: 'm {mx},{my} l 0,{e.y1} l {e.x1},0 l 0,-{e.y1} z l {e.x0},{e.y0} l {e.x0},-{e.y0}',\n        height: 14,\n        width:  21,\n        heightElements: [ 6, 14 ],\n        widthElements: [ 10.5, 21 ]\n      },\n      'TASK_TYPE_SCRIPT': {\n        d: 'm {mx},{my} c 9.966553,-6.27276 -8.000926,-7.91932 2.968968,-14.938 l -8.802728,0 ' +\n          'c -10.969894,7.01868 6.997585,8.66524 -2.968967,14.938 z ' +\n          'm -7,-12 l 5,0 ' +\n          'm -4.5,3 l 4.5,0 ' +\n          'm -3,3 l 5,0' +\n          'm -4,3 l 5,0',\n        height: 15,\n        width:  12.6,\n        heightElements: [ 6, 14 ],\n        widthElements: [ 10.5, 21 ]\n      },\n      'TASK_TYPE_USER_1': {\n        d: 'm {mx},{my} c 0.909,-0.845 1.594,-2.049 1.594,-3.385 0,-2.554 -1.805,-4.62199999 ' +\n          '-4.357,-4.62199999 -2.55199998,0 -4.28799998,2.06799999 -4.28799998,4.62199999 0,1.348 ' +\n          '0.974,2.562 1.89599998,3.405 -0.52899998,0.187 -5.669,2.097 -5.794,4.7560005 v 6.718 ' +\n          'h 17 v -6.718 c 0,-2.2980005 -5.5279996,-4.5950005 -6.0509996,-4.7760005 z' +\n          'm -8,6 l 0,5.5 m 11,0 l 0,-5'\n      },\n      'TASK_TYPE_USER_2': {\n        d: 'm {mx},{my} m 2.162,1.009 c 0,2.4470005 -2.158,4.4310005 -4.821,4.4310005 ' +\n          '-2.66499998,0 -4.822,-1.981 -4.822,-4.4310005 '\n      },\n      'TASK_TYPE_USER_3': {\n        d: 'm {mx},{my} m -6.9,-3.80 c 0,0 2.25099998,-2.358 4.27399998,-1.177 2.024,1.181 4.221,1.537 ' +\n          '4.124,0.965 -0.098,-0.57 -0.117,-3.79099999 -4.191,-4.13599999 -3.57499998,0.001 ' +\n          '-4.20799998,3.36699999 -4.20699998,4.34799999 z'\n      },\n      'TASK_TYPE_MANUAL': {\n        d: 'm {mx},{my} c 0.234,-0.01 5.604,0.008 8.029,0.004 0.808,0 1.271,-0.172 1.417,-0.752 0.227,-0.898 ' +\n          '-0.334,-1.314 -1.338,-1.316 -2.467,-0.01 -7.886,-0.004 -8.108,-0.004 -0.014,-0.079 0.016,-0.533 0,-0.61 ' +\n          '0.195,-0.042 8.507,0.006 9.616,0.002 0.877,-0.007 1.35,-0.438 1.353,-1.208 0.003,-0.768 -0.479,-1.09 ' +\n          '-1.35,-1.091 -2.968,-0.002 -9.619,-0.013 -9.619,-0.013 v -0.591 c 0,0 5.052,-0.016 7.225,-0.016 ' +\n          '0.888,-0.002 1.354,-0.416 1.351,-1.193 -0.006,-0.761 -0.492,-1.196 -1.361,-1.196 -3.473,-0.005 ' +\n          '-10.86,-0.003 -11.0829995,-0.003 -0.022,-0.047 -0.045,-0.094 -0.069,-0.139 0.3939995,-0.319 ' +\n          '2.0409995,-1.626 2.4149995,-2.017 0.469,-0.4870005 0.519,-1.1650005 0.162,-1.6040005 -0.414,-0.511 ' +\n          '-0.973,-0.5 -1.48,-0.236 -1.4609995,0.764 -6.5999995,3.6430005 -7.7329995,4.2710005 -0.9,0.499 ' +\n          '-1.516,1.253 -1.882,2.19 -0.37000002,0.95 -0.17,2.01 -0.166,2.979 0.004,0.718 -0.27300002,1.345 ' +\n          '-0.055,2.063 0.629,2.087 2.425,3.312 4.859,3.318 4.6179995,0.014 9.2379995,-0.139 13.8569995,-0.158 ' +\n          '0.755,-0.004 1.171,-0.301 1.182,-1.033 0.012,-0.754 -0.423,-0.969 -1.183,-0.973 -1.778,-0.01 ' +\n          '-5.824,-0.004 -6.04,-0.004 10e-4,-0.084 0.003,-0.586 10e-4,-0.67 z'\n      },\n      'TASK_TYPE_INSTANTIATING_SEND': {\n        d: 'm {mx},{my} l 0,8.4 l 12.6,0 l 0,-8.4 z l 6.3,3.6 l 6.3,-3.6'\n      },\n      'TASK_TYPE_SERVICE': {\n        d: 'm {mx},{my} v -1.71335 c 0.352326,-0.0705 0.703932,-0.17838 1.047628,-0.32133 ' +\n          '0.344416,-0.14465 0.665822,-0.32133 0.966377,-0.52145 l 1.19431,1.18005 1.567487,-1.57688 ' +\n          '-1.195028,-1.18014 c 0.403376,-0.61394 0.683079,-1.29908 0.825447,-2.01824 l 1.622133,-0.01 ' +\n          'v -2.2196 l -1.636514,0.01 c -0.07333,-0.35153 -0.178319,-0.70024 -0.323564,-1.04372 ' +\n          '-0.145244,-0.34406 -0.321407,-0.6644 -0.522735,-0.96217 l 1.131035,-1.13631 -1.583305,-1.56293 ' +\n          '-1.129598,1.13589 c -0.614052,-0.40108 -1.302883,-0.68093 -2.022633,-0.82247 l 0.0093,-1.61852 ' +\n          'h -2.241173 l 0.0042,1.63124 c -0.353763,0.0736 -0.705369,0.17977 -1.049785,0.32371 -0.344415,0.14437 ' +\n          '-0.665102,0.32092 -0.9635006,0.52046 l -1.1698628,-1.15823 -1.5667691,1.5792 1.1684265,1.15669 ' +\n          'c -0.4026573,0.61283 -0.68308,1.29797 -0.8247287,2.01713 l -1.6588041,0.003 v 2.22174 ' +\n          'l 1.6724648,-0.006 c 0.073327,0.35077 0.1797598,0.70243 0.3242851,1.04472 0.1452428,0.34448 ' +\n          '0.3214064,0.6644 0.5227339,0.96066 l -1.1993431,1.19723 1.5840256,1.56011 1.1964668,-1.19348 ' +\n          'c 0.6140517,0.40346 1.3028827,0.68232 2.0233517,0.82331 l 7.19e-4,1.69892 h 2.226848 z ' +\n          'm 0.221462,-3.9957 c -1.788948,0.7502 -3.8576,-0.0928 -4.6097055,-1.87438 -0.7521065,-1.78321 ' +\n          '0.090598,-3.84627 1.8802645,-4.59604 1.78823,-0.74936 3.856881,0.0929 4.608987,1.87437 ' +\n          '0.752106,1.78165 -0.0906,3.84612 -1.879546,4.59605 z'\n      },\n      'TASK_TYPE_SERVICE_FILL': {\n        d: 'm {mx},{my} c -1.788948,0.7502 -3.8576,-0.0928 -4.6097055,-1.87438 -0.7521065,-1.78321 ' +\n          '0.090598,-3.84627 1.8802645,-4.59604 1.78823,-0.74936 3.856881,0.0929 4.608987,1.87437 ' +\n          '0.752106,1.78165 -0.0906,3.84612 -1.879546,4.59605 z'\n      },\n      'TASK_TYPE_BUSINESS_RULE_HEADER': {\n        d: 'm {mx},{my} 0,4 20,0 0,-4 z'\n      },\n      'TASK_TYPE_BUSINESS_RULE_MAIN': {\n        d: 'm {mx},{my} 0,12 20,0 0,-12 z' +\n          'm 0,8 l 20,0 ' +\n          'm -13,-4 l 0,8'\n      },\n      'MESSAGE_FLOW_MARKER': {\n        d: 'm {mx},{my} m -10.5 ,-7 l 0,14 l 21,0 l 0,-14 z l 10.5,6 l 10.5,-6'\n      }\n    };\n\n    /**\n     * Return raw path for the given ID.\n     *\n     * @param {string} pathId\n     *\n     * @return {string} raw path\n     */\n    this.getRawPath = function getRawPath(pathId) {\n      return this.pathMap[pathId].d;\n    };\n\n    /**\n     * Scales the path to the given height and width.\n     * <h1>Use case</h1>\n     * <p>Use case is to scale the content of elements (event, gateways) based\n     * on the element bounding box's size.\n     * </p>\n     * <h1>Why not transform</h1>\n     * <p>Scaling a path with transform() will also scale the stroke and IE does not support\n     * the option 'non-scaling-stroke' to prevent this.\n     * Also there are use cases where only some parts of a path should be\n     * scaled.</p>\n     *\n     * @param {string} pathId The ID of the path.\n     * @param {Object} param <p>\n     *   Example param object scales the path to 60% size of the container (data.width, data.height).\n     *   <pre>\n     *   {\n     *     xScaleFactor: 0.6,\n     *     yScaleFactor:0.6,\n     *     containerWidth: data.width,\n     *     containerHeight: data.height,\n     *     position: {\n     *       mx: 0.46,\n     *       my: 0.2,\n     *     }\n     *   }\n     *   </pre>\n     *   <ul>\n     *    <li>targetpathwidth = xScaleFactor * containerWidth</li>\n     *    <li>targetpathheight = yScaleFactor * containerHeight</li>\n     *    <li>Position is used to set the starting coordinate of the path. M is computed:\n      *    <ul>\n      *      <li>position.x * containerWidth</li>\n      *      <li>position.y * containerHeight</li>\n      *    </ul>\n      *    Center of the container <pre> position: {\n     *       mx: 0.5,\n     *       my: 0.5,\n     *     }</pre>\n     *     Upper left corner of the container\n     *     <pre> position: {\n     *       mx: 0.0,\n     *       my: 0.0,\n     *     }</pre>\n     *    </li>\n     *   </ul>\n     * </p>\n     *\n     * @return {string} scaled path\n     */\n    this.getScaledPath = function getScaledPath(pathId, param) {\n      var rawPath = this.pathMap[pathId];\n\n      // positioning\n      // compute the start point of the path\n      var mx, my;\n\n      if (param.abspos) {\n        mx = param.abspos.x;\n        my = param.abspos.y;\n      } else {\n        mx = param.containerWidth * param.position.mx;\n        my = param.containerHeight * param.position.my;\n      }\n\n      var coordinates = {}; // map for the scaled coordinates\n      if (param.position) {\n\n        // path\n        var heightRatio = (param.containerHeight / rawPath.height) * param.yScaleFactor;\n        var widthRatio = (param.containerWidth / rawPath.width) * param.xScaleFactor;\n\n\n        // Apply height ratio\n        for (var heightIndex = 0; heightIndex < rawPath.heightElements.length; heightIndex++) {\n          coordinates['y' + heightIndex] = rawPath.heightElements[heightIndex] * heightRatio;\n        }\n\n        // Apply width ratio\n        for (var widthIndex = 0; widthIndex < rawPath.widthElements.length; widthIndex++) {\n          coordinates['x' + widthIndex] = rawPath.widthElements[widthIndex] * widthRatio;\n        }\n      }\n\n      // Apply value to raw path\n      var path = format(\n        rawPath.d, {\n          mx: mx,\n          my: my,\n          e: coordinates\n        }\n      );\n      return path;\n    };\n  }\n\n  // helpers //////////////////////\n\n  // copied and adjusted from https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js\n  var tokenRegex = /\\{([^{}]+)\\}/g,\n      objNotationRegex = /(?:(?:^|\\.)(.+?)(?=\\[|\\.|$|\\()|\\[('|\")(.+?)\\2\\])(\\(\\))?/g; // matches .xxxxx or [\"xxxxx\"] to run over object properties\n\n  function replacer(all, key, obj) {\n    var res = obj;\n    key.replace(objNotationRegex, function(all, name, quote, quotedName, isFunc) {\n      name = name || quotedName;\n      if (res) {\n        if (name in res) {\n          res = res[name];\n        }\n        typeof res == 'function' && isFunc && (res = res());\n      }\n    });\n    res = (res == null || res == obj ? all : res) + '';\n\n    return res;\n  }\n\n  function format(str, obj) {\n    return String(str).replace(tokenRegex, function(all, key) {\n      return replacer(all, key, obj);\n    });\n  }\n\n  var DrawModule = {\n    __init__: [ 'bpmnRenderer' ],\n    bpmnRenderer: [ 'type', BpmnRenderer ],\n    textRenderer: [ 'type', TextRenderer ],\n    pathMap: [ 'type', PathMap ]\n  };\n\n  /**\n   * @typedef { {\n   *   [key: string]: string;\n   * } } TranslateReplacements\n   */\n\n  /**\n   * A simple translation stub to be used for multi-language support\n   * in diagrams. Can be easily replaced with a more sophisticated\n   * solution.\n   *\n   * @example\n   *\n   * ```javascript\n   * // use it inside any diagram component by injecting `translate`.\n   *\n   * function MyService(translate) {\n   *   alert(translate('HELLO {you}', { you: 'You!' }));\n   * }\n   * ```\n   *\n   * @param {string} template to interpolate\n   * @param {TranslateReplacements} [replacements] a map with substitutes\n   *\n   * @return {string} the translated string\n   */\n  function translate$1(template, replacements) {\n\n    replacements = replacements || {};\n\n    return template.replace(/{([^}]+)}/g, function(_, key) {\n      return replacements[key] || '{' + key + '}';\n    });\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var translate = {\n    translate: [ 'value', translate$1 ]\n  };\n\n  /**\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n   *\n   * @typedef {import('../features/modeling/ElementFactory').default} ElementFactory\n   * @typedef {import('../draw/TextRenderer').default} TextRenderer\n   *\n   * @typedef {import('../model/Types').Element} Element\n   * @typedef {import('../model/Types').Label} Label\n   * @typedef {import('../model/Types').Shape} Shape\n   * @typedef {import('../model/Types').Connection} Connection\n   * @typedef {import('../model/Types').Root} Root\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   */\n\n  /**\n   * @param {ModdleElement} semantic\n   * @param {ModdleElement} di\n   * @param {Object} [attrs=null]\n   *\n   * @return {Object}\n   */\n  function elementData(semantic, di, attrs) {\n    return assign$1({\n      id: semantic.id,\n      type: semantic.$type,\n      businessObject: semantic,\n      di: di\n    }, attrs);\n  }\n\n  function getWaypoints(di, source, target) {\n\n    var waypoints = di.waypoint;\n\n    if (!waypoints || waypoints.length < 2) {\n      return [ getMid(source), getMid(target) ];\n    }\n\n    return waypoints.map(function(p) {\n      return { x: p.x, y: p.y };\n    });\n  }\n\n  function notYetDrawn(translate, semantic, refSemantic, property) {\n    return new Error(translate('element {element} referenced by {referenced}#{property} not yet drawn', {\n      element: elementToString(refSemantic),\n      referenced: elementToString(semantic),\n      property: property\n    }));\n  }\n\n\n  /**\n   * An importer that adds bpmn elements to the canvas\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {ElementFactory} elementFactory\n   * @param {ElementRegistry} elementRegistry\n   * @param {Function} translate\n   * @param {TextRenderer} textRenderer\n   */\n  function BpmnImporter(\n      eventBus, canvas, elementFactory,\n      elementRegistry, translate, textRenderer) {\n\n    this._eventBus = eventBus;\n    this._canvas = canvas;\n    this._elementFactory = elementFactory;\n    this._elementRegistry = elementRegistry;\n    this._translate = translate;\n    this._textRenderer = textRenderer;\n  }\n\n  BpmnImporter.$inject = [\n    'eventBus',\n    'canvas',\n    'elementFactory',\n    'elementRegistry',\n    'translate',\n    'textRenderer'\n  ];\n\n\n  /**\n   * Add a BPMN element (semantic) to the canvas making it a child of the\n   * given parent.\n   *\n   * @param {ModdleElement} semantic\n   * @param {ModdleElement} di\n   * @param {Shape} parentElement\n   *\n   * @return {Shape | Root | Connection}\n   */\n  BpmnImporter.prototype.add = function(semantic, di, parentElement) {\n    var element,\n        translate = this._translate,\n        hidden;\n\n    var parentIndex;\n\n    // ROOT ELEMENT\n    // handle the special case that we deal with a\n    // invisible root element (process, subprocess or collaboration)\n    if (is$1(di, 'bpmndi:BPMNPlane')) {\n\n      var attrs = is$1(semantic, 'bpmn:SubProcess')\n        ? { id: semantic.id + '_plane' }\n        : {};\n\n      // add a virtual element (not being drawn)\n      element = this._elementFactory.createRoot(elementData(semantic, di, attrs));\n\n      this._canvas.addRootElement(element);\n    }\n\n    // SHAPE\n    else if (is$1(di, 'bpmndi:BPMNShape')) {\n\n      var collapsed = !isExpanded(semantic, di),\n          isFrame = isFrameElement(semantic);\n\n      hidden = parentElement && (parentElement.hidden || parentElement.collapsed);\n\n      var bounds = di.bounds;\n\n      element = this._elementFactory.createShape(elementData(semantic, di, {\n        collapsed: collapsed,\n        hidden: hidden,\n        x: Math.round(bounds.x),\n        y: Math.round(bounds.y),\n        width: Math.round(bounds.width),\n        height: Math.round(bounds.height),\n        isFrame: isFrame\n      }));\n\n      if (is$1(semantic, 'bpmn:BoundaryEvent')) {\n        this._attachBoundary(semantic, element);\n      }\n\n      // insert lanes behind other flow nodes (cf. #727)\n      if (is$1(semantic, 'bpmn:Lane')) {\n        parentIndex = 0;\n      }\n\n      if (is$1(semantic, 'bpmn:DataStoreReference')) {\n\n        // check whether data store is inside our outside of its semantic parent\n        if (!isPointInsideBBox$1(parentElement, getMid(bounds))) {\n          parentElement = this._canvas.findRoot(parentElement);\n        }\n      }\n\n      this._canvas.addShape(element, parentElement, parentIndex);\n    }\n\n    // CONNECTION\n    else if (is$1(di, 'bpmndi:BPMNEdge')) {\n\n      var source = this._getSource(semantic),\n          target = this._getTarget(semantic);\n\n      hidden = parentElement && (parentElement.hidden || parentElement.collapsed);\n\n      element = this._elementFactory.createConnection(elementData(semantic, di, {\n        hidden: hidden,\n        source: source,\n        target: target,\n        waypoints: getWaypoints(di, source, target)\n      }));\n\n      if (is$1(semantic, 'bpmn:DataAssociation')) {\n\n        // render always on top; this ensures DataAssociations\n        // are rendered correctly across different \"hacks\" people\n        // love to model such as cross participant / sub process\n        // associations\n        parentElement = this._canvas.findRoot(parentElement);\n      }\n\n      this._canvas.addConnection(element, parentElement, parentIndex);\n    } else {\n      throw new Error(translate('unknown di {di} for element {semantic}', {\n        di: elementToString(di),\n        semantic: elementToString(semantic)\n      }));\n    }\n\n    // (optional) LABEL\n    if (isLabelExternal(semantic) && getLabel(element)) {\n      this.addLabel(semantic, di, element);\n    }\n\n\n    this._eventBus.fire('bpmnElement.added', { element: element });\n\n    return element;\n  };\n\n\n  /**\n   * Attach a boundary element to the given host.\n   *\n   * @param {ModdleElement} boundarySemantic\n   * @param {Shape} boundaryElement\n   */\n  BpmnImporter.prototype._attachBoundary = function(boundarySemantic, boundaryElement) {\n    var translate = this._translate;\n    var hostSemantic = boundarySemantic.attachedToRef;\n\n    if (!hostSemantic) {\n      throw new Error(translate('missing {semantic}#attachedToRef', {\n        semantic: elementToString(boundarySemantic)\n      }));\n    }\n\n    var host = this._elementRegistry.get(hostSemantic.id),\n        attachers = host && host.attachers;\n\n    if (!host) {\n      throw notYetDrawn(translate, boundarySemantic, hostSemantic, 'attachedToRef');\n    }\n\n    // wire element.host <> host.attachers\n    boundaryElement.host = host;\n\n    if (!attachers) {\n      host.attachers = attachers = [];\n    }\n\n    if (attachers.indexOf(boundaryElement) === -1) {\n      attachers.push(boundaryElement);\n    }\n  };\n\n\n  /**\n   * Add a label to a given element.\n   *\n   * @param {ModdleElement} semantic\n   * @param {ModdleElement} di\n   * @param {Element} element\n   *\n   * @return {Label}\n   */\n  BpmnImporter.prototype.addLabel = function(semantic, di, element) {\n    var bounds,\n        text,\n        label;\n\n    bounds = getExternalLabelBounds(di, element);\n\n    text = getLabel(element);\n\n    if (text) {\n\n      // get corrected bounds from actual layouted text\n      bounds = this._textRenderer.getExternalLabelBounds(bounds, text);\n    }\n\n    label = this._elementFactory.createLabel(elementData(semantic, di, {\n      id: semantic.id + '_label',\n      labelTarget: element,\n      type: 'label',\n      hidden: element.hidden || !getLabel(element),\n      x: Math.round(bounds.x),\n      y: Math.round(bounds.y),\n      width: Math.round(bounds.width),\n      height: Math.round(bounds.height)\n    }));\n\n    return this._canvas.addShape(label, element.parent);\n  };\n\n  /**\n   * Get the source or target of the given connection.\n   *\n   * @param {ModdleElement} semantic\n   * @param {'source' | 'target'} side\n   *\n   * @return {Element}\n   */\n  BpmnImporter.prototype._getConnectedElement = function(semantic, side) {\n\n    var element,\n        refSemantic,\n        type = semantic.$type,\n        translate = this._translate;\n\n    refSemantic = semantic[side + 'Ref'];\n\n    // handle mysterious isMany DataAssociation#sourceRef\n    if (side === 'source' && type === 'bpmn:DataInputAssociation') {\n      refSemantic = refSemantic && refSemantic[0];\n    }\n\n    // fix source / target for DataInputAssociation / DataOutputAssociation\n    if (side === 'source' && type === 'bpmn:DataOutputAssociation' ||\n        side === 'target' && type === 'bpmn:DataInputAssociation') {\n\n      refSemantic = semantic.$parent;\n    }\n\n    element = refSemantic && this._getElement(refSemantic);\n\n    if (element) {\n      return element;\n    }\n\n    if (refSemantic) {\n      throw notYetDrawn(translate, semantic, refSemantic, side + 'Ref');\n    } else {\n      throw new Error(translate('{semantic}#{side} Ref not specified', {\n        semantic: elementToString(semantic),\n        side: side\n      }));\n    }\n  };\n\n  BpmnImporter.prototype._getSource = function(semantic) {\n    return this._getConnectedElement(semantic, 'source');\n  };\n\n  BpmnImporter.prototype._getTarget = function(semantic) {\n    return this._getConnectedElement(semantic, 'target');\n  };\n\n\n  BpmnImporter.prototype._getElement = function(semantic) {\n    return this._elementRegistry.get(semantic.id);\n  };\n\n\n  // helpers ////////////////////\n\n  function isPointInsideBBox$1(bbox, point) {\n    var x = point.x,\n        y = point.y;\n\n    return x >= bbox.x &&\n      x <= bbox.x + bbox.width &&\n      y >= bbox.y &&\n      y <= bbox.y + bbox.height;\n  }\n\n  function isFrameElement(semantic) {\n    return is$1(semantic, 'bpmn:Group');\n  }\n\n  var ImportModule = {\n    __depends__: [\n      translate\n    ],\n    bpmnImporter: [ 'type', BpmnImporter ]\n  };\n\n  var CoreModule = {\n    __depends__: [\n      DrawModule,\n      ImportModule\n    ]\n  };\n\n  /**\n   * @typedef {import('../util/Types').Point} Point\n   */\n\n  function __stopPropagation(event) {\n    if (!event || typeof event.stopPropagation !== 'function') {\n      return;\n    }\n\n    event.stopPropagation();\n  }\n\n  /**\n   * @param {import('../core/EventBus').Event} event\n   *\n   * @return {Event}\n   */\n  function getOriginal$1(event) {\n    return event.originalEvent || event.srcEvent;\n  }\n\n  /**\n   * @param {Event|import('../core/EventBus').Event} event\n   */\n  function stopPropagation$1(event) {\n    __stopPropagation(event);\n    __stopPropagation(getOriginal$1(event));\n  }\n\n  /**\n   * @param {Event} event\n   *\n   * @return {Point|null}\n   */\n  function toPoint(event) {\n\n    if (event.pointers && event.pointers.length) {\n      event = event.pointers[0];\n    }\n\n    if (event.touches && event.touches.length) {\n      event = event.touches[0];\n    }\n\n    return event ? {\n      x: event.clientX,\n      y: event.clientY\n    } : null;\n  }\n\n  function isMac() {\n    return (/mac/i).test(navigator.platform);\n  }\n\n  /**\n   * @param {MouseEvent} event\n   * @param {string} button\n   *\n   * @return {boolean}\n   */\n  function isButton(event, button) {\n    return (getOriginal$1(event) || event).button === button;\n  }\n\n  /**\n   * @param {MouseEvent} event\n   *\n   * @return {boolean}\n   */\n  function isPrimaryButton(event) {\n\n    // button === 0 -> left áka primary mouse button\n    return isButton(event, 0);\n  }\n\n  /**\n   * @param {MouseEvent} event\n   *\n   * @return {boolean}\n   */\n  function isAuxiliaryButton(event) {\n\n    // button === 1 -> auxiliary áka wheel button\n    return isButton(event, 1);\n  }\n\n  /**\n   * @param {MouseEvent} event\n   *\n   * @return {boolean}\n   */\n  function hasPrimaryModifier(event) {\n    var originalEvent = getOriginal$1(event) || event;\n\n    if (!isPrimaryButton(event)) {\n      return false;\n    }\n\n    // Use cmd as primary modifier key for mac OS\n    if (isMac()) {\n      return originalEvent.metaKey;\n    } else {\n      return originalEvent.ctrlKey;\n    }\n  }\n\n  /**\n   * @param {MouseEvent} event\n   *\n   * @return {boolean}\n   */\n  function hasSecondaryModifier(event) {\n    var originalEvent = getOriginal$1(event) || event;\n\n    return isPrimaryButton(event) && originalEvent.shiftKey;\n  }\n\n  /**\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../../draw/Styles').default} Styles\n   *\n   * @typedef {import('../../util/Types').Point} Point\n   */\n\n  function allowAll(event) { return true; }\n\n  function allowPrimaryAndAuxiliary(event) {\n    return isPrimaryButton(event) || isAuxiliaryButton(event);\n  }\n\n  var LOW_PRIORITY$q = 500;\n\n\n  /**\n   * A plugin that provides interaction events for diagram elements.\n   *\n   * It emits the following events:\n   *\n   *   * element.click\n   *   * element.contextmenu\n   *   * element.dblclick\n   *   * element.hover\n   *   * element.mousedown\n   *   * element.mousemove\n   *   * element.mouseup\n   *   * element.out\n   *\n   * Each event is a tuple { element, gfx, originalEvent }.\n   *\n   * Canceling the event via Event#preventDefault()\n   * prevents the original DOM operation.\n   *\n   * @param {EventBus} eventBus\n   * @param {ElementRegistry} elementRegistry\n   * @param {Styles} styles\n   */\n  function InteractionEvents(eventBus, elementRegistry, styles) {\n\n    var self = this;\n\n    /**\n     * Fire an interaction event.\n     *\n     * @param {string} type local event name, e.g. element.click.\n     * @param {MouseEvent|TouchEvent} event native event\n     * @param {Element} [element] the diagram element to emit the event on;\n     *                                   defaults to the event target\n     */\n    function fire(type, event, element) {\n\n      if (isIgnored(type, event)) {\n        return;\n      }\n\n      var target, gfx, returnValue;\n\n      if (!element) {\n        target = event.delegateTarget || event.target;\n\n        if (target) {\n          gfx = target;\n          element = elementRegistry.get(gfx);\n        }\n      } else {\n        gfx = elementRegistry.getGraphics(element);\n      }\n\n      if (!gfx || !element) {\n        return;\n      }\n\n      returnValue = eventBus.fire(type, {\n        element: element,\n        gfx: gfx,\n        originalEvent: event\n      });\n\n      if (returnValue === false) {\n        event.stopPropagation();\n        event.preventDefault();\n      }\n    }\n\n    // TODO(nikku): document this\n    var handlers = {};\n\n    function mouseHandler(localEventName) {\n      return handlers[localEventName];\n    }\n\n    function isIgnored(localEventName, event) {\n\n      var filter = ignoredFilters[localEventName] || isPrimaryButton;\n\n      // only react on left mouse button interactions\n      // except for interaction events that are enabled\n      // for secundary mouse button\n      return !filter(event);\n    }\n\n    var bindings = {\n      click: 'element.click',\n      contextmenu: 'element.contextmenu',\n      dblclick: 'element.dblclick',\n      mousedown: 'element.mousedown',\n      mousemove: 'element.mousemove',\n      mouseover: 'element.hover',\n      mouseout: 'element.out',\n      mouseup: 'element.mouseup',\n    };\n\n    var ignoredFilters = {\n      'element.contextmenu': allowAll,\n      'element.mousedown': allowPrimaryAndAuxiliary,\n      'element.mouseup': allowPrimaryAndAuxiliary,\n      'element.click': allowPrimaryAndAuxiliary,\n      'element.dblclick': allowPrimaryAndAuxiliary\n    };\n\n\n    // manual event trigger //////////\n\n    /**\n     * Trigger an interaction event (based on a native dom event)\n     * on the target shape or connection.\n     *\n     * @param {string} eventName the name of the triggered DOM event\n     * @param {MouseEvent|TouchEvent} event\n     * @param {Element} targetElement\n     */\n    function triggerMouseEvent(eventName, event, targetElement) {\n\n      // i.e. element.mousedown...\n      var localEventName = bindings[eventName];\n\n      if (!localEventName) {\n        throw new Error('unmapped DOM event name <' + eventName + '>');\n      }\n\n      return fire(localEventName, event, targetElement);\n    }\n\n\n    var ELEMENT_SELECTOR = 'svg, .djs-element';\n\n    // event handling ///////\n\n    function registerEvent(node, event, localEvent, ignoredFilter) {\n\n      var handler = handlers[localEvent] = function(event) {\n        fire(localEvent, event);\n      };\n\n      if (ignoredFilter) {\n        ignoredFilters[localEvent] = ignoredFilter;\n      }\n\n      handler.$delegate = delegate.bind(node, ELEMENT_SELECTOR, event, handler);\n    }\n\n    function unregisterEvent(node, event, localEvent) {\n\n      var handler = mouseHandler(localEvent);\n\n      if (!handler) {\n        return;\n      }\n\n      delegate.unbind(node, event, handler.$delegate);\n    }\n\n    function registerEvents(svg) {\n      forEach$1(bindings, function(val, key) {\n        registerEvent(svg, key, val);\n      });\n    }\n\n    function unregisterEvents(svg) {\n      forEach$1(bindings, function(val, key) {\n        unregisterEvent(svg, key, val);\n      });\n    }\n\n    eventBus.on('canvas.destroy', function(event) {\n      unregisterEvents(event.svg);\n    });\n\n    eventBus.on('canvas.init', function(event) {\n      registerEvents(event.svg);\n    });\n\n\n    // hit box updating ////////////////\n\n    eventBus.on([ 'shape.added', 'connection.added' ], function(event) {\n      var element = event.element,\n          gfx = event.gfx;\n\n      eventBus.fire('interactionEvents.createHit', { element: element, gfx: gfx });\n    });\n\n    // Update djs-hit on change.\n    // A low priortity is necessary, because djs-hit of labels has to be updated\n    // after the label bounds have been updated in the renderer.\n    eventBus.on([\n      'shape.changed',\n      'connection.changed'\n    ], LOW_PRIORITY$q, function(event) {\n\n      var element = event.element,\n          gfx = event.gfx;\n\n      eventBus.fire('interactionEvents.updateHit', { element: element, gfx: gfx });\n    });\n\n    eventBus.on('interactionEvents.createHit', LOW_PRIORITY$q, function(event) {\n      var element = event.element,\n          gfx = event.gfx;\n\n      self.createDefaultHit(element, gfx);\n    });\n\n    eventBus.on('interactionEvents.updateHit', function(event) {\n      var element = event.element,\n          gfx = event.gfx;\n\n      self.updateDefaultHit(element, gfx);\n    });\n\n\n    // hit styles ////////////\n\n    var STROKE_HIT_STYLE = createHitStyle('djs-hit djs-hit-stroke');\n\n    var CLICK_STROKE_HIT_STYLE = createHitStyle('djs-hit djs-hit-click-stroke');\n\n    var ALL_HIT_STYLE = createHitStyle('djs-hit djs-hit-all');\n\n    var NO_MOVE_HIT_STYLE = createHitStyle('djs-hit djs-hit-no-move');\n\n    var HIT_TYPES = {\n      'all': ALL_HIT_STYLE,\n      'click-stroke': CLICK_STROKE_HIT_STYLE,\n      'stroke': STROKE_HIT_STYLE,\n      'no-move': NO_MOVE_HIT_STYLE\n    };\n\n    function createHitStyle(classNames, attrs) {\n\n      attrs = assign$1({\n        stroke: 'white',\n        strokeWidth: 15\n      }, attrs || {});\n\n      return styles.cls(classNames, [ 'no-fill', 'no-border' ], attrs);\n    }\n\n\n    // style helpers ///////////////\n\n    function applyStyle(hit, type) {\n\n      var attrs = HIT_TYPES[type];\n\n      if (!attrs) {\n        throw new Error('invalid hit type <' + type + '>');\n      }\n\n      attr(hit, attrs);\n\n      return hit;\n    }\n\n    function appendHit(gfx, hit) {\n      append(gfx, hit);\n    }\n\n\n    // API\n\n    /**\n     * Remove hints on the given graphics.\n     *\n     * @param {SVGElement} gfx\n     */\n    this.removeHits = function(gfx) {\n      var hits = all('.djs-hit', gfx);\n\n      forEach$1(hits, remove$1);\n    };\n\n    /**\n     * Create default hit for the given element.\n     *\n     * @param {Element} element\n     * @param {SVGElement} gfx\n     *\n     * @return {SVGElement} created hit\n     */\n    this.createDefaultHit = function(element, gfx) {\n      var waypoints = element.waypoints,\n          isFrame = element.isFrame,\n          boxType;\n\n      if (waypoints) {\n        return this.createWaypointsHit(gfx, waypoints);\n      } else {\n\n        boxType = isFrame ? 'stroke' : 'all';\n\n        return this.createBoxHit(gfx, boxType, {\n          width: element.width,\n          height: element.height\n        });\n      }\n    };\n\n    /**\n     * Create hits for the given waypoints.\n     *\n     * @param {SVGElement} gfx\n     * @param {Point[]} waypoints\n     *\n     * @return {SVGElement}\n     */\n    this.createWaypointsHit = function(gfx, waypoints) {\n\n      var hit = createLine(waypoints);\n\n      applyStyle(hit, 'stroke');\n\n      appendHit(gfx, hit);\n\n      return hit;\n    };\n\n    /**\n     * Create hits for a box.\n     *\n     * @param {SVGElement} gfx\n     * @param {string} type\n     * @param {Object} attrs\n     *\n     * @return {SVGElement}\n     */\n    this.createBoxHit = function(gfx, type, attrs) {\n\n      attrs = assign$1({\n        x: 0,\n        y: 0\n      }, attrs);\n\n      var hit = create$1('rect');\n\n      applyStyle(hit, type);\n\n      attr(hit, attrs);\n\n      appendHit(gfx, hit);\n\n      return hit;\n    };\n\n    /**\n     * Update default hit of the element.\n     *\n     * @param {Element} element\n     * @param {SVGElement} gfx\n     *\n     * @return {SVGElement} updated hit\n     */\n    this.updateDefaultHit = function(element, gfx) {\n\n      var hit = query('.djs-hit', gfx);\n\n      if (!hit) {\n        return;\n      }\n\n      if (element.waypoints) {\n        updateLine(hit, element.waypoints);\n      } else {\n        attr(hit, {\n          width: element.width,\n          height: element.height\n        });\n      }\n\n      return hit;\n    };\n\n    this.fire = fire;\n\n    this.triggerMouseEvent = triggerMouseEvent;\n\n    this.mouseHandler = mouseHandler;\n\n    this.registerEvent = registerEvent;\n    this.unregisterEvent = unregisterEvent;\n  }\n\n\n  InteractionEvents.$inject = [\n    'eventBus',\n    'elementRegistry',\n    'styles'\n  ];\n\n\n  /**\n   * An event indicating that the mouse hovered over an element\n   *\n   * @event element.hover\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * An event indicating that the mouse has left an element\n   *\n   * @event element.out\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * An event indicating that the mouse has clicked an element\n   *\n   * @event element.click\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * An event indicating that the mouse has double clicked an element\n   *\n   * @event element.dblclick\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * An event indicating that the mouse has gone down on an element.\n   *\n   * @event element.mousedown\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * An event indicating that the mouse has gone up on an element.\n   *\n   * @event element.mouseup\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * An event indicating that the context menu action is triggered\n   * via mouse or touch controls.\n   *\n   * @event element.contextmenu\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var InteractionEventsModule$1 = {\n    __init__: [ 'interactionEvents' ],\n    interactionEvents: [ 'type', InteractionEvents ]\n  };\n\n  var LOW_PRIORITY$p = 500;\n\n  /**\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../../draw/Styles').default} Styles\n   */\n\n  /**\n   * @class\n   *\n   * A plugin that adds an outline to shapes and connections that may be activated and styled\n   * via CSS classes.\n   *\n   * @param {EventBus} eventBus\n   * @param {Styles} styles\n   */\n  function Outline(eventBus, styles) {\n\n    this.offset = 6;\n\n    var OUTLINE_STYLE = styles.cls('djs-outline', [ 'no-fill' ]);\n\n    var self = this;\n\n    function createOutline(gfx, bounds) {\n      var outline = create$1('rect');\n\n      attr(outline, assign$1({\n        x: 10,\n        y: 10,\n        rx: 4,\n        width: 100,\n        height: 100\n      }, OUTLINE_STYLE));\n\n      append(gfx, outline);\n\n      return outline;\n    }\n\n    // A low priortity is necessary, because outlines of labels have to be updated\n    // after the label bounds have been updated in the renderer.\n    eventBus.on([ 'shape.added', 'shape.changed' ], LOW_PRIORITY$p, function(event) {\n      var element = event.element,\n          gfx = event.gfx;\n\n      var outline = query('.djs-outline', gfx);\n\n      if (!outline) {\n        outline = createOutline(gfx);\n      }\n\n      self.updateShapeOutline(outline, element);\n    });\n\n    eventBus.on([ 'connection.added', 'connection.changed' ], function(event) {\n      var element = event.element,\n          gfx = event.gfx;\n\n      var outline = query('.djs-outline', gfx);\n\n      if (!outline) {\n        outline = createOutline(gfx);\n      }\n\n      self.updateConnectionOutline(outline, element);\n    });\n  }\n\n\n  /**\n   * Updates the outline of a shape respecting the dimension of the\n   * element and an outline offset.\n   *\n   * @param {SVGElement} outline\n   * @param {Element} element\n   */\n  Outline.prototype.updateShapeOutline = function(outline, element) {\n\n    attr(outline, {\n      x: -this.offset,\n      y: -this.offset,\n      width: element.width + this.offset * 2,\n      height: element.height + this.offset * 2\n    });\n\n  };\n\n\n  /**\n   * Updates the outline of a connection respecting the bounding box of\n   * the connection and an outline offset.\n   *\n   * @param {SVGElement} outline\n   * @param {Element} connection\n   */\n  Outline.prototype.updateConnectionOutline = function(outline, connection) {\n\n    var bbox = getBBox(connection);\n\n    attr(outline, {\n      x: bbox.x - this.offset,\n      y: bbox.y - this.offset,\n      width: bbox.width + this.offset * 2,\n      height: bbox.height + this.offset * 2\n    });\n\n  };\n\n\n  Outline.$inject = [ 'eventBus', 'styles', 'elementRegistry' ];\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var OutlineModule = {\n    __init__: [ 'outline' ],\n    outline: [ 'type', Outline ]\n  };\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   */\n\n  /**\n   * A service that offers the current selection in a diagram.\n   * Offers the api to control the selection, too.\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   */\n  function Selection(eventBus, canvas) {\n\n    this._eventBus = eventBus;\n    this._canvas = canvas;\n\n    /**\n     * @type {Object[]}\n     */\n    this._selectedElements = [];\n\n    var self = this;\n\n    eventBus.on([ 'shape.remove', 'connection.remove' ], function(e) {\n      var element = e.element;\n      self.deselect(element);\n    });\n\n    eventBus.on([ 'diagram.clear', 'root.set' ], function(e) {\n      self.select(null);\n    });\n  }\n\n  Selection.$inject = [ 'eventBus', 'canvas' ];\n\n  /**\n   * Deselect an element.\n   *\n   * @param {Object} element The element to deselect.\n   */\n  Selection.prototype.deselect = function(element) {\n    var selectedElements = this._selectedElements;\n\n    var idx = selectedElements.indexOf(element);\n\n    if (idx !== -1) {\n      var oldSelection = selectedElements.slice();\n\n      selectedElements.splice(idx, 1);\n\n      this._eventBus.fire('selection.changed', { oldSelection: oldSelection, newSelection: selectedElements });\n    }\n  };\n\n  /**\n   * Get the selected elements.\n   *\n   * @return {Object[]} The selected elements.\n   */\n  Selection.prototype.get = function() {\n    return this._selectedElements;\n  };\n\n  /**\n   * Check whether an element is selected.\n   *\n   * @param {Object} element The element.\n   *\n   * @return {boolean} Whether the element is selected.\n   */\n  Selection.prototype.isSelected = function(element) {\n    return this._selectedElements.indexOf(element) !== -1;\n  };\n\n\n  /**\n   * Select one or many elements.\n   *\n   * @param {Object|Object[]} elements The element(s) to select.\n   * @param {boolean} [add] Whether to add the element(s) to the selected elements.\n   * Defaults to `false`.\n   */\n  Selection.prototype.select = function(elements, add) {\n    var selectedElements = this._selectedElements,\n        oldSelection = selectedElements.slice();\n\n    if (!isArray$3(elements)) {\n      elements = elements ? [ elements ] : [];\n    }\n\n    var canvas = this._canvas;\n\n    var rootElement = canvas.getRootElement();\n\n    elements = elements.filter(function(element) {\n      var elementRoot = canvas.findRoot(element);\n\n      return rootElement === elementRoot;\n    });\n\n    // selection may be cleared by passing an empty array or null\n    // to the method\n    if (add) {\n      forEach$1(elements, function(element) {\n        if (selectedElements.indexOf(element) !== -1) {\n\n          // already selected\n          return;\n        } else {\n          selectedElements.push(element);\n        }\n      });\n    } else {\n      this._selectedElements = selectedElements = elements.slice();\n    }\n\n    this._eventBus.fire('selection.changed', { oldSelection: oldSelection, newSelection: selectedElements });\n  };\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('./Selection').default} Selection\n   */\n\n  var MARKER_HOVER = 'hover',\n      MARKER_SELECTED = 'selected';\n\n  var SELECTION_OUTLINE_PADDING = 6;\n\n\n  /**\n   * A plugin that adds a visible selection UI to shapes and connections\n   * by appending the <code>hover</code> and <code>selected</code> classes to them.\n   *\n   * @class\n   *\n   * Makes elements selectable, too.\n   *\n   * @param {Canvas} canvas\n   * @param {EventBus} eventBus\n   * @param {Selection} selection\n   */\n  function SelectionVisuals(canvas, eventBus, selection) {\n    this._canvas = canvas;\n\n    var self = this;\n\n    this._multiSelectionBox = null;\n\n    function addMarker(e, cls) {\n      canvas.addMarker(e, cls);\n    }\n\n    function removeMarker(e, cls) {\n      canvas.removeMarker(e, cls);\n    }\n\n    eventBus.on('element.hover', function(event) {\n      addMarker(event.element, MARKER_HOVER);\n    });\n\n    eventBus.on('element.out', function(event) {\n      removeMarker(event.element, MARKER_HOVER);\n    });\n\n    eventBus.on('selection.changed', function(event) {\n\n      function deselect(s) {\n        removeMarker(s, MARKER_SELECTED);\n      }\n\n      function select(s) {\n        addMarker(s, MARKER_SELECTED);\n      }\n\n      var oldSelection = event.oldSelection,\n          newSelection = event.newSelection;\n\n      forEach$1(oldSelection, function(e) {\n        if (newSelection.indexOf(e) === -1) {\n          deselect(e);\n        }\n      });\n\n      forEach$1(newSelection, function(e) {\n        if (oldSelection.indexOf(e) === -1) {\n          select(e);\n        }\n      });\n\n      self._updateSelectionOutline(newSelection);\n    });\n\n\n    eventBus.on('element.changed', function(event) {\n      if (selection.isSelected(event.element)) {\n        self._updateSelectionOutline(selection.get());\n      }\n    });\n  }\n\n  SelectionVisuals.$inject = [\n    'canvas',\n    'eventBus',\n    'selection'\n  ];\n\n  SelectionVisuals.prototype._updateSelectionOutline = function(selection) {\n    var layer = this._canvas.getLayer('selectionOutline');\n\n    clear(layer);\n\n    var enabled = selection.length > 1;\n\n    var container = this._canvas.getContainer();\n\n    classes(container)[enabled ? 'add' : 'remove']('djs-multi-select');\n\n    if (!enabled) {\n      return;\n    }\n\n    var bBox = addSelectionOutlinePadding(getBBox(selection));\n\n    var rect = create$1('rect');\n\n    attr(rect, assign$1({\n      rx: 3\n    }, bBox));\n\n    classes(rect).add('djs-selection-outline');\n\n    append(layer, rect);\n  };\n\n  // helpers //////////\n\n  function addSelectionOutlinePadding(bBox) {\n    return {\n      x: bBox.x - SELECTION_OUTLINE_PADDING,\n      y: bBox.y - SELECTION_OUTLINE_PADDING,\n      width: bBox.width + SELECTION_OUTLINE_PADDING * 2,\n      height: bBox.height + SELECTION_OUTLINE_PADDING * 2\n    };\n  }\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('./Selection').default} Selection\n   */\n\n  /**\n   * @param {EventBus} eventBus\n   * @param {Selection} selection\n   * @param {Canvas} canvas\n   * @param {ElementRegistry} elementRegistry\n   */\n  function SelectionBehavior(eventBus, selection, canvas, elementRegistry) {\n\n    // Select elements on create\n    eventBus.on('create.end', 500, function(event) {\n      var context = event.context,\n          canExecute = context.canExecute,\n          elements = context.elements,\n          hints = context.hints || {},\n          autoSelect = hints.autoSelect;\n\n      if (canExecute) {\n        if (autoSelect === false) {\n\n          // Select no elements\n          return;\n        }\n\n        if (isArray$3(autoSelect)) {\n          selection.select(autoSelect);\n        } else {\n\n          // Select all elements by default\n          selection.select(elements.filter(isShown));\n        }\n      }\n    });\n\n    // Select connection targets on connect\n    eventBus.on('connect.end', 500, function(event) {\n      var context = event.context,\n          connection = context.connection;\n\n      if (connection) {\n        selection.select(connection);\n      }\n    });\n\n    // Select shapes on move\n    eventBus.on('shape.move.end', 500, function(event) {\n      var previousSelection = event.previousSelection || [];\n\n      var shape = elementRegistry.get(event.context.shape.id);\n\n      // Always select main shape on move\n      var isSelected = find(previousSelection, function(selectedShape) {\n        return shape.id === selectedShape.id;\n      });\n\n      if (!isSelected) {\n        selection.select(shape);\n      }\n    });\n\n    // Select elements on click\n    eventBus.on('element.click', function(event) {\n\n      if (!isPrimaryButton(event)) {\n        return;\n      }\n\n      var element = event.element;\n\n      if (element === canvas.getRootElement()) {\n        element = null;\n      }\n\n      var isSelected = selection.isSelected(element),\n          isMultiSelect = selection.get().length > 1;\n\n      // Add to selection if CTRL or SHIFT pressed\n      var add = hasPrimaryModifier(event) || hasSecondaryModifier(event);\n\n      if (isSelected && isMultiSelect) {\n        if (add) {\n\n          // Deselect element\n          return selection.deselect(element);\n        } else {\n\n          // Select element only\n          return selection.select(element);\n        }\n      } else if (!isSelected) {\n\n        // Select element\n        selection.select(element, add);\n      } else {\n\n        // Deselect element\n        selection.deselect(element);\n      }\n    });\n  }\n\n  SelectionBehavior.$inject = [\n    'eventBus',\n    'selection',\n    'canvas',\n    'elementRegistry'\n  ];\n\n\n  function isShown(element) {\n    return !element.hidden;\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var SelectionModule = {\n    __init__: [ 'selectionVisuals', 'selectionBehavior' ],\n    __depends__: [\n      InteractionEventsModule$1,\n      OutlineModule\n    ],\n    selection: [ 'type', Selection ],\n    selectionVisuals: [ 'type', SelectionVisuals ],\n    selectionBehavior: [ 'type', SelectionBehavior ]\n  };\n\n  /**\n   * Util that provides unique IDs.\n   *\n   * @class\n   * @constructor\n   *\n   * The ids can be customized via a given prefix and contain a random value to avoid collisions.\n   *\n   * @param {string} [prefix] a prefix to prepend to generated ids (for better readability)\n   */\n  function IdGenerator(prefix) {\n\n    this._counter = 0;\n    this._prefix = (prefix ? prefix + '-' : '') + Math.floor(Math.random() * 1000000000) + '-';\n  }\n\n  /**\n   * Returns a next unique ID.\n   *\n   * @return {string} the id\n   */\n  IdGenerator.prototype.next = function() {\n    return this._prefix + (++this._counter);\n  };\n\n  // document wide unique overlay ids\n  var ids$1 = new IdGenerator('ov');\n\n  var LOW_PRIORITY$o = 500;\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../../core/EventBus').default} EventBus\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef { {\n   *   minZoom?: number,\n   *   maxZoom?: number\n   * } } OverlaysConfigShow\n   *\n   * @typedef { {\n   *   min?: number,\n   *   max?: number\n   * } } OverlaysConfigScale\n   *\n   * @typedef { {\n  *   id: string,\n  *   type: string | null,\n  *   element: Element | string\n  * } & OverlayAttrs } Overlay\n  *\n   * @typedef { {\n   *   html: HTMLElement | string,\n   *   position: {\n   *     top?: number,\n   *     right?: number,\n   *     bottom?: number,\n   *     left?: number\n   *   }\n   * } & OverlaysConfigDefault } OverlayAttrs\n   *\n   * @typedef { {\n   *   html: HTMLElement,\n   *   element: Element,\n   *   overlays: Overlay[]\n   * } } OverlayContainer\n   *\n   * @typedef {{\n   *   defaults?: OverlaysConfigDefault\n   * }} OverlaysConfig\n   *\n   * @typedef { {\n   *  show?: OverlaysConfigShow,\n   *  scale?: OverlaysConfigScale | boolean\n   * } } OverlaysConfigDefault\n   *\n   * @typedef { {\n   *   id?: string;\n   *   element?: Element | string;\n   *   type?: string;\n   * } | string } OverlaysFilter\n   */\n\n  /**\n   * A service that allows users to attach overlays to diagram elements.\n   *\n   * The overlay service will take care of overlay positioning during updates.\n   *\n   * @example\n   *\n   * ```javascript\n   * // add a pink badge on the top left of the shape\n   *\n   * overlays.add(someShape, {\n   *   position: {\n   *     top: -5,\n   *     left: -5\n   *   },\n   *   html: '<div style=\"width: 10px; background: fuchsia; color: white;\">0</div>'\n   * });\n   *\n   * // or add via shape id\n   *\n   * overlays.add('some-element-id', {\n   *   position: {\n   *     top: -5,\n   *     left: -5\n   *   }\n   *   html: '<div style=\"width: 10px; background: fuchsia; color: white;\">0</div>'\n   * });\n   *\n   * // or add with optional type\n   *\n   * overlays.add(someShape, 'badge', {\n   *   position: {\n   *     top: -5,\n   *     left: -5\n   *   }\n   *   html: '<div style=\"width: 10px; background: fuchsia; color: white;\">0</div>'\n   * });\n   * ```\n   *\n   * ```javascript\n   * // remove an overlay\n   *\n   * var id = overlays.add(...);\n   * overlays.remove(id);\n   *\n   *\n   * You may configure overlay defaults during tool by providing a `config` module\n   * with `overlays.defaults` as an entry:\n   *\n   * {\n   *   overlays: {\n   *     defaults: {\n   *       show: {\n   *         minZoom: 0.7,\n   *         maxZoom: 5.0\n   *       },\n   *       scale: {\n   *         min: 1\n   *       }\n   *     }\n   * }\n   * ```\n   *\n   * @param {OverlaysConfig} config\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {ElementRegistry} elementRegistry\n   */\n  function Overlays(config, eventBus, canvas, elementRegistry) {\n    this._eventBus = eventBus;\n    this._canvas = canvas;\n    this._elementRegistry = elementRegistry;\n\n    this._ids = ids$1;\n\n    /**\n     * @type {OverlaysConfigDefault}\n     */\n    this._overlayDefaults = assign$1({\n\n      // no show constraints\n      show: null,\n\n      // always scale\n      scale: true\n    }, config && config.defaults);\n\n    /**\n     * @type {Map<string, Overlay>}\n     */\n    this._overlays = {};\n\n    /**\n     * @type {OverlayContainer[]}\n     */\n    this._overlayContainers = [];\n\n    /**\n     * @type {HTMLElement}\n     */\n    this._overlayRoot = createRoot$1(canvas.getContainer());\n\n    this._init();\n  }\n\n\n  Overlays.$inject = [\n    'config.overlays',\n    'eventBus',\n    'canvas',\n    'elementRegistry'\n  ];\n\n\n  /**\n   * Returns the overlay with the specified ID or a list of overlays\n   * for an element with a given type.\n   *\n   * @example\n   *\n   * ```javascript\n   * // return the single overlay with the given ID\n   * overlays.get('some-id');\n   *\n   * // return all overlays for the shape\n   * overlays.get({ element: someShape });\n   *\n   * // return all overlays on shape with type 'badge'\n   * overlays.get({ element: someShape, type: 'badge' });\n   *\n   * // shape can also be specified as ID\n   * overlays.get({ element: 'element-id', type: 'badge' });\n   * ```\n   *\n   * @param {OverlaysFilter} search The filter to be used to find the overlay(s).\n   *\n   * @return {Overlay|Overlay[]} The overlay(s).\n   */\n  Overlays.prototype.get = function(search) {\n\n    if (isString(search)) {\n      search = { id: search };\n    }\n\n    if (isString(search.element)) {\n      search.element = this._elementRegistry.get(search.element);\n    }\n\n    if (search.element) {\n      var container = this._getOverlayContainer(search.element, true);\n\n      // return a list of overlays when searching by element (+type)\n      if (container) {\n        return search.type ? filter(container.overlays, matchPattern({ type: search.type })) : container.overlays.slice();\n      } else {\n        return [];\n      }\n    } else\n    if (search.type) {\n      return filter(this._overlays, matchPattern({ type: search.type }));\n    } else {\n\n      // return single element when searching by id\n      return search.id ? this._overlays[search.id] : null;\n    }\n  };\n\n  /**\n   * Adds an HTML overlay to an element.\n   *\n   * @param {Element|string} element The element to add the overlay to.\n   * @param {string} [type] An optional type that can be used to filter.\n   * @param {OverlayAttrs} overlay The overlay.\n   *\n   * @return {string} The overlay's ID that can be used to get or remove it.\n   */\n  Overlays.prototype.add = function(element, type, overlay) {\n\n    if (isObject(type)) {\n      overlay = type;\n      type = null;\n    }\n\n    if (!element.id) {\n      element = this._elementRegistry.get(element);\n    }\n\n    if (!overlay.position) {\n      throw new Error('must specifiy overlay position');\n    }\n\n    if (!overlay.html) {\n      throw new Error('must specifiy overlay html');\n    }\n\n    if (!element) {\n      throw new Error('invalid element specified');\n    }\n\n    var id = this._ids.next();\n\n    overlay = assign$1({}, this._overlayDefaults, overlay, {\n      id: id,\n      type: type,\n      element: element,\n      html: overlay.html\n    });\n\n    this._addOverlay(overlay);\n\n    return id;\n  };\n\n\n  /**\n   * Remove an overlay with the given ID or all overlays matching the given filter.\n   *\n   * @see Overlays#get for filter options.\n   *\n   * @param {OverlaysFilter} filter The filter to be used to find the overlay.\n   */\n  Overlays.prototype.remove = function(filter) {\n\n    var overlays = this.get(filter) || [];\n\n    if (!isArray$3(overlays)) {\n      overlays = [ overlays ];\n    }\n\n    var self = this;\n\n    forEach$1(overlays, function(overlay) {\n\n      var container = self._getOverlayContainer(overlay.element, true);\n\n      if (overlay) {\n        remove$2(overlay.html);\n        remove$2(overlay.htmlContainer);\n\n        delete overlay.htmlContainer;\n        delete overlay.element;\n\n        delete self._overlays[overlay.id];\n      }\n\n      if (container) {\n        var idx = container.overlays.indexOf(overlay);\n        if (idx !== -1) {\n          container.overlays.splice(idx, 1);\n        }\n      }\n    });\n\n  };\n\n  /**\n   * Checks whether overlays are shown.\n   *\n   * @return {boolean} Whether overlays are shown.\n   */\n  Overlays.prototype.isShown = function() {\n    return this._overlayRoot.style.display !== 'none';\n  };\n\n  /**\n   * Show all overlays.\n   */\n  Overlays.prototype.show = function() {\n    setVisible$1(this._overlayRoot);\n  };\n\n  /**\n   * Hide all overlays.\n   */\n  Overlays.prototype.hide = function() {\n    setVisible$1(this._overlayRoot, false);\n  };\n\n  /**\n   * Remove all overlays and their container.\n   */\n  Overlays.prototype.clear = function() {\n    this._overlays = {};\n\n    this._overlayContainers = [];\n\n    clear$1(this._overlayRoot);\n  };\n\n  Overlays.prototype._updateOverlayContainer = function(container) {\n    var element = container.element,\n        html = container.html;\n\n    // update container left,top according to the elements x,y coordinates\n    // this ensures we can attach child elements relative to this container\n\n    var x = element.x,\n        y = element.y;\n\n    if (element.waypoints) {\n      var bbox = getBBox(element);\n      x = bbox.x;\n      y = bbox.y;\n    }\n\n    setPosition$1(html, x, y);\n\n    attr$1(container.html, 'data-container-id', element.id);\n  };\n\n\n  Overlays.prototype._updateOverlay = function(overlay) {\n\n    var position = overlay.position,\n        htmlContainer = overlay.htmlContainer,\n        element = overlay.element;\n\n    // update overlay html relative to shape because\n    // it is already positioned on the element\n\n    // update relative\n    var left = position.left,\n        top = position.top;\n\n    if (position.right !== undefined) {\n\n      var width;\n\n      if (element.waypoints) {\n        width = getBBox(element).width;\n      } else {\n        width = element.width;\n      }\n\n      left = position.right * -1 + width;\n    }\n\n    if (position.bottom !== undefined) {\n\n      var height;\n\n      if (element.waypoints) {\n        height = getBBox(element).height;\n      } else {\n        height = element.height;\n      }\n\n      top = position.bottom * -1 + height;\n    }\n\n    setPosition$1(htmlContainer, left || 0, top || 0);\n    this._updateOverlayVisibilty(overlay, this._canvas.viewbox());\n  };\n\n\n  Overlays.prototype._createOverlayContainer = function(element) {\n    var html = domify$1('<div class=\"djs-overlays\" />');\n    assign(html, { position: 'absolute' });\n\n    this._overlayRoot.appendChild(html);\n\n    var container = {\n      html: html,\n      element: element,\n      overlays: []\n    };\n\n    this._updateOverlayContainer(container);\n\n    this._overlayContainers.push(container);\n\n    return container;\n  };\n\n\n  Overlays.prototype._updateRoot = function(viewbox) {\n    var scale = viewbox.scale || 1;\n\n    var matrix = 'matrix(' +\n    [\n      scale,\n      0,\n      0,\n      scale,\n      -1 * viewbox.x * scale,\n      -1 * viewbox.y * scale\n    ].join(',') +\n    ')';\n\n    setTransform(this._overlayRoot, matrix);\n  };\n\n\n  Overlays.prototype._getOverlayContainer = function(element, raw) {\n    var container = find(this._overlayContainers, function(c) {\n      return c.element === element;\n    });\n\n\n    if (!container && !raw) {\n      return this._createOverlayContainer(element);\n    }\n\n    return container;\n  };\n\n\n  Overlays.prototype._addOverlay = function(overlay) {\n\n    var id = overlay.id,\n        element = overlay.element,\n        html = overlay.html,\n        htmlContainer,\n        overlayContainer;\n\n    // unwrap jquery (for those who need it)\n    if (html.get && html.constructor.prototype.jquery) {\n      html = html.get(0);\n    }\n\n    // create proper html elements from\n    // overlay HTML strings\n    if (isString(html)) {\n      html = domify$1(html);\n    }\n\n    overlayContainer = this._getOverlayContainer(element);\n\n    htmlContainer = domify$1('<div class=\"djs-overlay\" data-overlay-id=\"' + id + '\">');\n    assign(htmlContainer, { position: 'absolute' });\n\n    htmlContainer.appendChild(html);\n\n    if (overlay.type) {\n      classes$1(htmlContainer).add('djs-overlay-' + overlay.type);\n    }\n\n    var elementRoot = this._canvas.findRoot(element);\n    var activeRoot = this._canvas.getRootElement();\n\n    setVisible$1(htmlContainer, elementRoot === activeRoot);\n\n    overlay.htmlContainer = htmlContainer;\n\n    overlayContainer.overlays.push(overlay);\n    overlayContainer.html.appendChild(htmlContainer);\n\n    this._overlays[id] = overlay;\n\n    this._updateOverlay(overlay);\n    this._updateOverlayVisibilty(overlay, this._canvas.viewbox());\n  };\n\n\n  Overlays.prototype._updateOverlayVisibilty = function(overlay, viewbox) {\n    var show = overlay.show,\n        rootElement = this._canvas.findRoot(overlay.element),\n        minZoom = show && show.minZoom,\n        maxZoom = show && show.maxZoom,\n        htmlContainer = overlay.htmlContainer,\n        activeRootElement = this._canvas.getRootElement(),\n        visible = true;\n\n    if (rootElement !== activeRootElement) {\n      visible = false;\n    } else if (show) {\n      if (\n        (isDefined(minZoom) && minZoom > viewbox.scale) ||\n        (isDefined(maxZoom) && maxZoom < viewbox.scale)\n      ) {\n        visible = false;\n      }\n    }\n\n    setVisible$1(htmlContainer, visible);\n\n    this._updateOverlayScale(overlay, viewbox);\n  };\n\n\n  Overlays.prototype._updateOverlayScale = function(overlay, viewbox) {\n    var shouldScale = overlay.scale,\n        minScale,\n        maxScale,\n        htmlContainer = overlay.htmlContainer;\n\n    var scale, transform = '';\n\n    if (shouldScale !== true) {\n\n      if (shouldScale === false) {\n        minScale = 1;\n        maxScale = 1;\n      } else {\n        minScale = shouldScale.min;\n        maxScale = shouldScale.max;\n      }\n\n      if (isDefined(minScale) && viewbox.scale < minScale) {\n        scale = (1 / viewbox.scale || 1) * minScale;\n      }\n\n      if (isDefined(maxScale) && viewbox.scale > maxScale) {\n        scale = (1 / viewbox.scale || 1) * maxScale;\n      }\n    }\n\n    if (isDefined(scale)) {\n      transform = 'scale(' + scale + ',' + scale + ')';\n    }\n\n    setTransform(htmlContainer, transform);\n  };\n\n\n  Overlays.prototype._updateOverlaysVisibilty = function(viewbox) {\n\n    var self = this;\n\n    forEach$1(this._overlays, function(overlay) {\n      self._updateOverlayVisibilty(overlay, viewbox);\n    });\n  };\n\n\n  Overlays.prototype._init = function() {\n\n    var eventBus = this._eventBus;\n\n    var self = this;\n\n\n    // scroll/zoom integration\n\n    function updateViewbox(viewbox) {\n      self._updateRoot(viewbox);\n      self._updateOverlaysVisibilty(viewbox);\n\n      self.show();\n    }\n\n    eventBus.on('canvas.viewbox.changing', function(event) {\n      self.hide();\n    });\n\n    eventBus.on('canvas.viewbox.changed', function(event) {\n      updateViewbox(event.viewbox);\n    });\n\n\n    // remove integration\n\n    eventBus.on([ 'shape.remove', 'connection.remove' ], function(e) {\n      var element = e.element;\n      var overlays = self.get({ element: element });\n\n      forEach$1(overlays, function(o) {\n        self.remove(o.id);\n      });\n\n      var container = self._getOverlayContainer(element);\n\n      if (container) {\n        remove$2(container.html);\n        var i = self._overlayContainers.indexOf(container);\n        if (i !== -1) {\n          self._overlayContainers.splice(i, 1);\n        }\n      }\n    });\n\n\n    // move integration\n\n    eventBus.on('element.changed', LOW_PRIORITY$o, function(e) {\n      var element = e.element;\n\n      var container = self._getOverlayContainer(element, true);\n\n      if (container) {\n        forEach$1(container.overlays, function(overlay) {\n          self._updateOverlay(overlay);\n        });\n\n        self._updateOverlayContainer(container);\n      }\n    });\n\n\n    // marker integration, simply add them on the overlays as classes, too.\n\n    eventBus.on('element.marker.update', function(e) {\n      var container = self._getOverlayContainer(e.element, true);\n      if (container) {\n        classes$1(container.html)[e.add ? 'add' : 'remove'](e.marker);\n      }\n    });\n\n\n    eventBus.on('root.set', function() {\n      self._updateOverlaysVisibilty(self._canvas.viewbox());\n    });\n\n    // clear overlays with diagram\n\n    eventBus.on('diagram.clear', this.clear, this);\n  };\n\n\n\n  // helpers /////////////////////////////\n\n  function createRoot$1(parentNode) {\n    var root = domify$1(\n      '<div class=\"djs-overlay-container\" />'\n    );\n\n    assign(root, {\n      position: 'absolute',\n      width: 0,\n      height: 0\n    });\n\n    parentNode.insertBefore(root, parentNode.firstChild);\n\n    return root;\n  }\n\n  function setPosition$1(el, x, y) {\n    assign(el, { left: x + 'px', top: y + 'px' });\n  }\n\n  /**\n   * Set element visible\n   *\n   * @param {DOMElement} el\n   * @param {boolean} [visible=true]\n   */\n  function setVisible$1(el, visible) {\n    el.style.display = visible === false ? 'none' : '';\n  }\n\n  function setTransform(el, transform) {\n\n    el.style['transform-origin'] = 'top left';\n\n    [ '', '-ms-', '-webkit-' ].forEach(function(prefix) {\n      el.style[prefix + 'transform'] = transform;\n    });\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var OverlaysModule = {\n    __init__: [ 'overlays' ],\n    overlays: [ 'type', Overlays ]\n  };\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../../core/GraphicsFactory').default} GraphicsFactory\n   */\n\n  /**\n   * Adds change support to the diagram, including\n   *\n   * <ul>\n   *   <li>redrawing shapes and connections on change</li>\n   * </ul>\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {ElementRegistry} elementRegistry\n   * @param {GraphicsFactory} graphicsFactory\n   */\n  function ChangeSupport(\n      eventBus, canvas, elementRegistry,\n      graphicsFactory) {\n\n\n    // redraw shapes / connections on change\n\n    eventBus.on('element.changed', function(event) {\n\n      var element = event.element;\n\n      // element might have been deleted and replaced by new element with same ID\n      // thus check for parent of element except for root element\n      if (element.parent || element === canvas.getRootElement()) {\n        event.gfx = elementRegistry.getGraphics(element);\n      }\n\n      // shape + gfx may have been deleted\n      if (!event.gfx) {\n        return;\n      }\n\n      eventBus.fire(getType(element) + '.changed', event);\n    });\n\n    eventBus.on('elements.changed', function(event) {\n\n      var elements = event.elements;\n\n      elements.forEach(function(e) {\n        eventBus.fire('element.changed', { element: e });\n      });\n\n      graphicsFactory.updateContainments(elements);\n    });\n\n    eventBus.on('shape.changed', function(event) {\n      graphicsFactory.update('shape', event.element, event.gfx);\n    });\n\n    eventBus.on('connection.changed', function(event) {\n      graphicsFactory.update('connection', event.element, event.gfx);\n    });\n  }\n\n  ChangeSupport.$inject = [\n    'eventBus',\n    'canvas',\n    'elementRegistry',\n    'graphicsFactory'\n  ];\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var ChangeSupportModule = {\n    __init__: [ 'changeSupport' ],\n    changeSupport: [ 'type', ChangeSupport ]\n  };\n\n  /**\n   * @typedef {import('../core/Types').ElementLike} ElementLike\n   * @typedef {import('../core/EventBus').default} EventBus\n   * @typedef {import('./CommandStack').CommandContext} CommandContext\n   *\n   * @typedef {string|string[]} Events\n   * @typedef { (context: CommandContext) => ElementLike[] | void } HandlerFunction\n   * @typedef { (context: CommandContext) => void } ComposeHandlerFunction\n   */\n\n  var DEFAULT_PRIORITY$4 = 1000;\n\n  /**\n   * A utility that can be used to plug into the command execution for\n   * extension and/or validation.\n   *\n   * @class\n   * @constructor\n   *\n   * @example\n   *\n   * ```javascript\n   * import CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n   *\n   * class CommandLogger extends CommandInterceptor {\n   *   constructor(eventBus) {\n   *     super(eventBus);\n   *\n   *   this.preExecute('shape.create', (event) => {\n   *     console.log('commandStack.shape-create.preExecute', event);\n   *   });\n   * }\n   * ```\n   *\n   * @param {EventBus} eventBus\n   */\n  function CommandInterceptor(eventBus) {\n\n    /**\n     * @type {EventBus}\n     */\n    this._eventBus = eventBus;\n  }\n\n  CommandInterceptor.$inject = [ 'eventBus' ];\n\n  function unwrapEvent(fn, that) {\n    return function(event) {\n      return fn.call(that || null, event.context, event.command, event);\n    };\n  }\n\n\n  /**\n   * Intercept a command during one of the phases.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {string} [hook] phase to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.on = function(events, hook, priority, handlerFn, unwrap, that) {\n\n    if (isFunction(hook) || isNumber(hook)) {\n      that = unwrap;\n      unwrap = handlerFn;\n      handlerFn = priority;\n      priority = hook;\n      hook = null;\n    }\n\n    if (isFunction(priority)) {\n      that = unwrap;\n      unwrap = handlerFn;\n      handlerFn = priority;\n      priority = DEFAULT_PRIORITY$4;\n    }\n\n    if (isObject(unwrap)) {\n      that = unwrap;\n      unwrap = false;\n    }\n\n    if (!isFunction(handlerFn)) {\n      throw new Error('handlerFn must be a function');\n    }\n\n    if (!isArray$3(events)) {\n      events = [ events ];\n    }\n\n    var eventBus = this._eventBus;\n\n    forEach$1(events, function(event) {\n\n      // concat commandStack(.event)?(.hook)?\n      var fullEvent = [ 'commandStack', event, hook ].filter(function(e) { return e; }).join('.');\n\n      eventBus.on(fullEvent, priority, unwrap ? unwrapEvent(handlerFn, that) : handlerFn, that);\n    });\n  };\n\n  /**\n   * Add a <canExecute> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.canExecute = createHook('canExecute');\n\n  /**\n   * Add a <preExecute> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.preExecute = createHook('preExecute');\n\n  /**\n   * Add a <preExecuted> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.preExecuted = createHook('preExecuted');\n\n  /**\n   * Add a <execute> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.execute = createHook('execute');\n\n  /**\n   * Add a <executed> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.executed = createHook('executed');\n\n  /**\n   * Add a <postExecute> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.postExecute = createHook('postExecute');\n\n  /**\n   * Add a <postExecuted> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.postExecuted = createHook('postExecuted');\n\n  /**\n   * Add a <revert> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.revert = createHook('revert');\n\n  /**\n   * Add a <reverted> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.reverted = createHook('reverted');\n\n  /*\n   * Add prototype methods for each phase of command execution (e.g. execute,\n   * revert).\n   *\n   * @param {string} hook\n   *\n   * @return { (\n   *   events?: Events,\n   *   priority?: number,\n   *   handlerFn: ComposeHandlerFunction|HandlerFunction,\n   *   unwrap?: boolean\n   * ) => any }\n   */\n  function createHook(hook) {\n\n    /**\n     * @this {CommandInterceptor}\n     *\n     * @param {Events} [events]\n     * @param {number} [priority]\n     * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n     * @param {boolean} [unwrap]\n     * @param {any} [that]\n     */\n    const hookFn = function(events, priority, handlerFn, unwrap, that) {\n\n      if (isFunction(events) || isNumber(events)) {\n        that = unwrap;\n        unwrap = handlerFn;\n        handlerFn = priority;\n        priority = events;\n        events = null;\n      }\n\n      this.on(events, hook, priority, handlerFn, unwrap, that);\n    };\n\n    return hookFn;\n  }\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   *\n   * @typedef {import('../../core/Canvas').default} Canvas\n   */\n\n  /**\n   * A modeling behavior that ensures we set the correct root element\n   * as we undo and redo commands.\n   *\n   * @param {Canvas} canvas\n   * @param {Injector} injector\n   */\n  function RootElementsBehavior(canvas, injector) {\n\n    injector.invoke(CommandInterceptor, this);\n\n    this.executed(function(event) {\n      var context = event.context;\n\n      if (context.rootElement) {\n        canvas.setRootElement(context.rootElement);\n      } else {\n        context.rootElement = canvas.getRootElement();\n      }\n    });\n\n    this.revert(function(event) {\n      var context = event.context;\n\n      if (context.rootElement) {\n        canvas.setRootElement(context.rootElement);\n      }\n    });\n  }\n\n  e$3(RootElementsBehavior, CommandInterceptor);\n\n  RootElementsBehavior.$inject = [ 'canvas', 'injector' ];\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var RootElementsModule = {\n    __init__: [ 'rootElementsBehavior' ],\n    rootElementsBehavior: [ 'type', RootElementsBehavior ]\n  };\n\n  /**\n   * @param {string} str\n   *\n   * @return {string}\n   */\n  function escapeCSS(str) {\n    return CSS.escape(str);\n  }\n\n  var HTML_ESCAPE_MAP = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    '\\'': '&#39;'\n  };\n\n  /**\n   * @param {string} str\n   *\n   * @return {string}\n   */\n  function escapeHTML(str) {\n    str = '' + str;\n\n    return str && str.replace(/[&<>\"']/g, function(match) {\n      return HTML_ESCAPE_MAP[match];\n    });\n  }\n\n  /**\n   * @typedef {import('../model/Types').Element} Element\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   */\n\n  var planeSuffix = '_plane';\n\n  /**\n   * Get primary shape ID for a plane.\n   *\n   * @param  {Element|ModdleElement} element\n   *\n   * @return {string}\n   */\n  function getShapeIdFromPlane(element) {\n    var id = element.id;\n\n    return removePlaneSuffix(id);\n  }\n\n  /**\n   * Get plane ID for a primary shape.\n   *\n   * @param  {Element|ModdleElement} element\n   *\n   * @return {string}\n   */\n  function getPlaneIdFromShape(element) {\n    var id = element.id;\n\n    if (is$1(element, 'bpmn:SubProcess')) {\n      return addPlaneSuffix(id);\n    }\n\n    return id;\n  }\n\n  /**\n   * Get plane ID for primary shape ID.\n   *\n   * @param {string} id\n   *\n   * @return {string}\n   */\n  function toPlaneId(id) {\n    return addPlaneSuffix(id);\n  }\n\n  /**\n   * Check wether element is plane.\n   *\n   * @param  {Element|ModdleElement} element\n   *\n   * @return {boolean}\n   */\n  function isPlane(element) {\n    var di = getDi(element);\n\n    return is$1(di, 'bpmndi:BPMNPlane');\n  }\n\n  function addPlaneSuffix(id) {\n    return id + planeSuffix;\n  }\n\n  function removePlaneSuffix(id) {\n    return id.replace(new RegExp(planeSuffix + '$'), '');\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Shape} Shape\n   */\n\n  var OPEN_CLASS = 'bjs-breadcrumbs-shown';\n\n\n  /**\n   * Adds overlays that allow switching planes on collapsed subprocesses.\n   *\n   * @param {EventBus} eventBus\n   * @param {ElementRegistry} elementRegistry\n   * @param {Canvas} canvas\n   */\n  function DrilldownBreadcrumbs(eventBus, elementRegistry, canvas) {\n    var breadcrumbs = domify$1('<ul class=\"bjs-breadcrumbs\"></ul>');\n    var container = canvas.getContainer();\n    var containerClasses = classes$1(container);\n    container.appendChild(breadcrumbs);\n\n    var businessObjectParents = [];\n\n    // update breadcrumbs if name or ID of the primary shape changes\n    eventBus.on('element.changed', function(event) {\n      var shape = event.element,\n          businessObject = getBusinessObject(shape);\n\n      var isPresent = find(businessObjectParents, function(element) {\n        return element === businessObject;\n      });\n\n      if (!isPresent) {\n        return;\n      }\n\n      updateBreadcrumbs();\n    });\n\n    /**\n     * Updates the displayed breadcrumbs. If no element is provided, only the\n     * labels are updated.\n     *\n     * @param {Element} [element]\n     */\n    function updateBreadcrumbs(element) {\n      if (element) {\n        businessObjectParents = getBusinessObjectParentChain(element);\n      }\n\n      var path = businessObjectParents.map(function(parent) {\n        var title = escapeHTML(parent.name || parent.id);\n        var link = domify$1('<li><span class=\"bjs-crumb\"><a title=\"' + title + '\">' + title + '</a></span></li>');\n\n        var parentPlane = canvas.findRoot(getPlaneIdFromShape(parent)) || canvas.findRoot(parent.id);\n\n        // when the root is a collaboration, the process does not have a corresponding\n        // element in the elementRegisty. Instead, we search for the corresponding participant\n        if (!parentPlane && is$1(parent, 'bpmn:Process')) {\n          var participant = elementRegistry.find(function(element) {\n            var businessObject = getBusinessObject(element);\n\n            return businessObject && businessObject.get('processRef') && businessObject.get('processRef') === parent;\n          });\n\n          parentPlane = canvas.findRoot(participant.id);\n        }\n\n        link.addEventListener('click', function() {\n          canvas.setRootElement(parentPlane);\n        });\n\n        return link;\n      });\n\n      breadcrumbs.innerHTML = '';\n\n      // show breadcrumbs and expose state to .djs-container\n      var visible = path.length > 1;\n\n      containerClasses.toggle(OPEN_CLASS, visible);\n\n      path.forEach(function(element) {\n        breadcrumbs.appendChild(element);\n      });\n    }\n\n    eventBus.on('root.set', function(event) {\n      updateBreadcrumbs(event.element);\n    });\n\n  }\n\n  DrilldownBreadcrumbs.$inject = [ 'eventBus', 'elementRegistry', 'canvas' ];\n\n\n  // helpers //////////\n\n  /**\n   * Returns the parents for the element using the business object chain,\n   * starting with the root element.\n   *\n   * @param {Shape} child\n   *\n   * @return {Shape}\n   */\n  function getBusinessObjectParentChain(child) {\n    var businessObject = getBusinessObject(child);\n\n    var parents = [];\n\n    for (var element = businessObject; element; element = element.$parent) {\n      if (is$1(element, 'bpmn:SubProcess') || is$1(element, 'bpmn:Process')) {\n        parents.push(element);\n      }\n    }\n\n    return parents.reverse();\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   */\n\n  /**\n   * Move collapsed subprocesses into view when drilling down.\n   *\n   * Zoom and scroll are saved in a session.\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   */\n  function DrilldownCentering(eventBus, canvas) {\n\n    var currentRoot = null;\n    var positionMap = new Map$1();\n\n    eventBus.on('root.set', function(event) {\n      var newRoot = event.element;\n      var currentViewbox = canvas.viewbox();\n      var storedViewbox = positionMap.get(newRoot);\n\n      positionMap.set(currentRoot, {\n        x: currentViewbox.x,\n        y: currentViewbox.y,\n        zoom: currentViewbox.scale\n      });\n\n      currentRoot = newRoot;\n\n      // current root was replaced with a collaboration, we don't update the viewbox\n      if (is$1(newRoot, 'bpmn:Collaboration') && !storedViewbox) {\n        return;\n      }\n\n      storedViewbox = storedViewbox || { x: 0, y: 0, zoom: 1 };\n\n      var dx = (currentViewbox.x - storedViewbox.x) * currentViewbox.scale,\n          dy = (currentViewbox.y - storedViewbox.y) * currentViewbox.scale;\n\n      if (dx !== 0 || dy !== 0) {\n        canvas.scroll({\n          dx: dx,\n          dy: dy\n        });\n      }\n\n      if (storedViewbox.zoom !== currentViewbox.scale) {\n        canvas.zoom(storedViewbox.zoom, { x: 0, y: 0 });\n      }\n    });\n\n    eventBus.on('diagram.clear', function() {\n      positionMap.clear();\n      currentRoot = null;\n    });\n\n  }\n\n  DrilldownCentering.$inject = [ 'eventBus', 'canvas' ];\n\n\n  /**\n   * ES5 Map implementation. Works.\n   */\n  function Map$1() {\n\n    this._entries = [];\n\n    this.set = function(key, value) {\n\n      var found = false;\n\n      for (var k in this._entries) {\n        if (this._entries[k][0] === key) {\n          this._entries[k][1] = value;\n\n          found = true;\n\n          break;\n        }\n      }\n\n      if (!found) {\n        this._entries.push([ key, value ]);\n      }\n    };\n\n    this.get = function(key) {\n\n      for (var k in this._entries) {\n        if (this._entries[k][0] === key) {\n          return this._entries[k][1];\n        }\n      }\n\n      return null;\n    };\n\n    this.clear = function() {\n      this._entries.length = 0;\n    };\n\n    this.remove = function(key) {\n\n      var idx = -1;\n\n      for (var k in this._entries) {\n        if (this._entries[k][0] === key) {\n          idx = k;\n\n          break;\n        }\n      }\n\n      if (idx !== -1) {\n        this._entries.splice(idx, 1);\n      }\n    };\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../../model/Types').Moddle} Moddle\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Shape} Shape\n   *\n   * @typedef {import('diagram-js/lib/core/Canvas').CanvasPlane} CanvasPlane\n   *\n   * @typedef {import('diagram-js/lib/util/Types').Rect} Rect\n   */\n\n  var DEFAULT_POSITION$1 = {\n    x: 180,\n    y: 160\n  };\n\n  /**\n   * Hook into `import.render.start` and create new planes for diagrams with\n   * collapsed subprocesses and all DI elements on the same plane.\n   *\n   * @param {EventBus} eventBus\n   * @param {Moddle} moddle\n   */\n  function SubprocessCompatibility(eventBus, moddle) {\n    this._eventBus = eventBus;\n    this._moddle = moddle;\n\n    var self = this;\n\n    eventBus.on('import.render.start', 1500, function(e, context) {\n      self._handleImport(context.definitions);\n    });\n  }\n\n  /**\n   * @param {ModdleElement} definitions\n   */\n  SubprocessCompatibility.prototype._handleImport = function(definitions) {\n    if (!definitions.diagrams) {\n      return;\n    }\n\n    var self = this;\n    this._definitions = definitions;\n    this._processToDiagramMap = {};\n\n    definitions.diagrams.forEach(function(diagram) {\n      if (!diagram.plane || !diagram.plane.bpmnElement) {\n        return;\n      }\n\n      self._processToDiagramMap[diagram.plane.bpmnElement.id] = diagram;\n    });\n\n    var newDiagrams = [];\n    definitions.diagrams.forEach(function(diagram) {\n      var createdDiagrams = self._createNewDiagrams(diagram.plane);\n      Array.prototype.push.apply(newDiagrams, createdDiagrams);\n    });\n\n    newDiagrams.forEach(function(diagram) {\n      self._movePlaneElementsToOrigin(diagram.plane);\n    });\n  };\n\n\n  /**\n   * Moves all DI elements from collapsed subprocesses to a new plane.\n   *\n   * @param {CanvasPlane} plane\n   *\n   * @return {ModdleElement[]} new diagrams created for the collapsed subprocesses\n   */\n  SubprocessCompatibility.prototype._createNewDiagrams = function(plane) {\n    var self = this;\n\n    var collapsedElements = [];\n    var elementsToMove = [];\n\n    plane.get('planeElement').forEach(function(diElement) {\n      var businessObject = diElement.bpmnElement;\n\n      if (!businessObject) {\n        return;\n      }\n\n      var parent = businessObject.$parent;\n\n      if (is$1(businessObject, 'bpmn:SubProcess') && !diElement.isExpanded) {\n        collapsedElements.push(businessObject);\n      }\n\n      if (shouldMoveToPlane(businessObject, plane)) {\n\n        // don't change the array while we iterate over it\n        elementsToMove.push({ diElement: diElement, parent: parent });\n      }\n    });\n\n    var newDiagrams = [];\n\n    // create new planes for all collapsed subprocesses, even when they are empty\n    collapsedElements.forEach(function(element) {\n      if (!self._processToDiagramMap[ element.id ]) {\n        var diagram = self._createDiagram(element);\n\n        self._processToDiagramMap[element.id] = diagram;\n\n        newDiagrams.push(diagram);\n      }\n    });\n\n    elementsToMove.forEach(function(element) {\n      var diElement = element.diElement;\n      var parent = element.parent;\n\n      // parent is expanded, get nearest collapsed parent\n      while (parent && collapsedElements.indexOf(parent) === -1) {\n        parent = parent.$parent;\n      }\n\n      // false positive, all parents are expanded\n      if (!parent) {\n        return;\n      }\n\n      var diagram = self._processToDiagramMap[ parent.id ];\n\n      self._moveToDiPlane(diElement, diagram.plane);\n    });\n\n    return newDiagrams;\n  };\n\n  /**\n   * @param {CanvasPlane} plane\n   */\n  SubprocessCompatibility.prototype._movePlaneElementsToOrigin = function(plane) {\n    var elements = plane.get('planeElement');\n\n    // get bounding box of all elements\n    var planeBounds = getPlaneBounds(plane);\n\n    var offset = {\n      x: planeBounds.x - DEFAULT_POSITION$1.x,\n      y: planeBounds.y - DEFAULT_POSITION$1.y\n    };\n\n    elements.forEach(function(diElement) {\n      if (diElement.waypoint) {\n        diElement.waypoint.forEach(function(waypoint) {\n          waypoint.x = waypoint.x - offset.x;\n          waypoint.y = waypoint.y - offset.y;\n        });\n      } else if (diElement.bounds) {\n        diElement.bounds.x = diElement.bounds.x - offset.x;\n        diElement.bounds.y = diElement.bounds.y - offset.y;\n      }\n    });\n  };\n\n  /**\n   * @param {ModdleElement} diElement\n   * @param {CanvasPlane} newPlane\n   */\n  SubprocessCompatibility.prototype._moveToDiPlane = function(diElement, newPlane) {\n    var containingDiagram = findRootDiagram(diElement);\n\n    // remove DI from old Plane and add it to the new one\n    var parentPlaneElement = containingDiagram.plane.get('planeElement');\n\n    parentPlaneElement.splice(parentPlaneElement.indexOf(diElement), 1);\n\n    newPlane.get('planeElement').push(diElement);\n  };\n\n  /**\n   * @param {ModdleElement} businessObject\n   *\n   * @return {ModdleElement}\n   */\n  SubprocessCompatibility.prototype._createDiagram = function(businessObject) {\n    var plane = this._moddle.create('bpmndi:BPMNPlane', {\n      bpmnElement: businessObject\n    });\n\n    var diagram = this._moddle.create('bpmndi:BPMNDiagram', {\n      plane: plane\n    });\n\n    plane.$parent = diagram;\n\n    plane.bpmnElement = businessObject;\n\n    diagram.$parent = this._definitions;\n\n    this._definitions.diagrams.push(diagram);\n\n    return diagram;\n  };\n\n  SubprocessCompatibility.$inject = [ 'eventBus', 'moddle' ];\n\n\n  // helpers //////////\n\n  function findRootDiagram(element) {\n    if (is$1(element, 'bpmndi:BPMNDiagram')) {\n      return element;\n    } else {\n      return findRootDiagram(element.$parent);\n    }\n  }\n\n  /**\n   * @param {CanvasPlane} plane\n   *\n   * @return {Rect}\n   */\n  function getPlaneBounds(plane) {\n    var planeTrbl = {\n      top: Infinity,\n      right: -Infinity,\n      bottom: -Infinity,\n      left: Infinity\n    };\n\n    plane.planeElement.forEach(function(element) {\n      if (!element.bounds) {\n        return;\n      }\n\n      var trbl = asTRBL(element.bounds);\n\n      planeTrbl.top = Math.min(trbl.top, planeTrbl.top);\n      planeTrbl.left = Math.min(trbl.left, planeTrbl.left);\n    });\n\n    return asBounds(planeTrbl);\n  }\n\n  /**\n   * @param {ModdleElement} businessObject\n   * @param {CanvasPlane} plane\n   *\n   * @return {boolean}\n   */\n  function shouldMoveToPlane(businessObject, plane) {\n    var parent = businessObject.$parent;\n\n    // don't move elements that are already on the plane\n    if (!is$1(parent, 'bpmn:SubProcess') || parent === plane.bpmnElement) {\n      return false;\n    }\n\n    // dataAssociations are children of the subprocess but rendered on process level\n    // cf. https://github.com/bpmn-io/bpmn-js/issues/1619\n    if (isAny(businessObject, [ 'bpmn:DataInputAssociation', 'bpmn:DataOutputAssociation' ])) {\n      return false;\n    }\n\n    return true;\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('diagram-js/lib/features/overlays/Overlays').default} Overlays\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Parent} Parent\n   * @typedef {import('../../model/Types').Shape} Shape\n   */\n\n  var LOW_PRIORITY$n = 250;\n  var ARROW_DOWN_SVG = '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 16 16\"><path fill-rule=\"evenodd\" d=\"M4.81801948,3.50735931 L10.4996894,9.1896894 L10.5,4 L12,4 L12,12 L4,12 L4,10.5 L9.6896894,10.4996894 L3.75735931,4.56801948 C3.46446609,4.27512627 3.46446609,3.80025253 3.75735931,3.50735931 C4.05025253,3.21446609 4.52512627,3.21446609 4.81801948,3.50735931 Z\"/></svg>';\n\n  var EMPTY_MARKER = 'bjs-drilldown-empty';\n\n  /**\n   * @param {Canvas} canvas\n   * @param {EventBus} eventBus\n   * @param {ElementRegistry} elementRegistry\n   * @param {Overlays} overlays\n   */\n  function DrilldownOverlayBehavior(\n      canvas, eventBus, elementRegistry, overlays\n  ) {\n    CommandInterceptor.call(this, eventBus);\n\n    this._canvas = canvas;\n    this._eventBus = eventBus;\n    this._elementRegistry = elementRegistry;\n    this._overlays = overlays;\n\n    var self = this;\n\n    this.executed('shape.toggleCollapse', LOW_PRIORITY$n, function(context) {\n      var shape = context.shape;\n\n      // Add overlay to the collapsed shape\n      if (self._canDrillDown(shape)) {\n        self._addOverlay(shape);\n      } else {\n        self._removeOverlay(shape);\n      }\n    }, true);\n\n\n    this.reverted('shape.toggleCollapse', LOW_PRIORITY$n, function(context) {\n      var shape = context.shape;\n\n      // Add overlay to the collapsed shape\n      if (self._canDrillDown(shape)) {\n        self._addOverlay(shape);\n      } else {\n        self._removeOverlay(shape);\n      }\n    }, true);\n\n\n    this.executed([ 'shape.create', 'shape.move', 'shape.delete' ], LOW_PRIORITY$n,\n      function(context) {\n        var oldParent = context.oldParent,\n            newParent = context.newParent || context.parent,\n            shape = context.shape;\n\n        // Add overlay to the collapsed shape\n        if (self._canDrillDown(shape)) {\n          self._addOverlay(shape);\n        }\n\n        self._updateDrilldownOverlay(oldParent);\n        self._updateDrilldownOverlay(newParent);\n        self._updateDrilldownOverlay(shape);\n      }, true);\n\n\n    this.reverted([ 'shape.create', 'shape.move', 'shape.delete' ], LOW_PRIORITY$n,\n      function(context) {\n        var oldParent = context.oldParent,\n            newParent = context.newParent || context.parent,\n            shape = context.shape;\n\n        // Add overlay to the collapsed shape\n        if (self._canDrillDown(shape)) {\n          self._addOverlay(shape);\n        }\n\n        self._updateDrilldownOverlay(oldParent);\n        self._updateDrilldownOverlay(newParent);\n        self._updateDrilldownOverlay(shape);\n      }, true);\n\n\n    eventBus.on('import.render.complete', function() {\n      elementRegistry.filter(function(e) {\n        return self._canDrillDown(e);\n      }).map(function(el) {\n        self._addOverlay(el);\n      });\n    });\n\n  }\n\n  e$3(DrilldownOverlayBehavior, CommandInterceptor);\n\n  /**\n   * @param {Shape} shape\n   */\n  DrilldownOverlayBehavior.prototype._updateDrilldownOverlay = function(shape) {\n    var canvas = this._canvas;\n\n    if (!shape) {\n      return;\n    }\n\n    var root = canvas.findRoot(shape);\n\n    if (root) {\n      this._updateOverlayVisibility(root);\n    }\n  };\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  DrilldownOverlayBehavior.prototype._canDrillDown = function(element) {\n    var canvas = this._canvas;\n\n    return is$1(element, 'bpmn:SubProcess') && canvas.findRoot(getPlaneIdFromShape(element));\n  };\n\n  /**\n   * Update the visibility of the drilldown overlay. If the plane has no elements,\n   * the drilldown will only be shown when the element is selected.\n   *\n   * @param {Parent} element The collapsed root or shape.\n   */\n  DrilldownOverlayBehavior.prototype._updateOverlayVisibility = function(element) {\n    var overlays = this._overlays;\n\n    var businessObject = getBusinessObject(element);\n\n    var overlay = overlays.get({ element: businessObject.id, type: 'drilldown' })[0];\n\n    if (!overlay) {\n      return;\n    }\n\n    var hasFlowElements = businessObject\n      && businessObject.get('flowElements')\n      && businessObject.get('flowElements').length;\n\n    classes$1(overlay.html).toggle(EMPTY_MARKER, !hasFlowElements);\n  };\n\n  /**\n   * Add a drilldown button to the given element assuming the plane has the same\n   * ID as the element.\n   *\n   * @param {Shape} element The collapsed shape.\n   */\n  DrilldownOverlayBehavior.prototype._addOverlay = function(element) {\n    var canvas = this._canvas,\n        overlays = this._overlays;\n\n    var existingOverlays = overlays.get({ element: element, type: 'drilldown' });\n\n    if (existingOverlays.length) {\n      this._removeOverlay(element);\n    }\n\n    var button = domify$1('<button class=\"bjs-drilldown\">' + ARROW_DOWN_SVG + '</button>');\n\n    button.addEventListener('click', function() {\n      canvas.setRootElement(canvas.findRoot(getPlaneIdFromShape(element)));\n    });\n\n    overlays.add(element, 'drilldown', {\n      position: {\n        bottom: -7,\n        right: -8\n      },\n      html: button\n    });\n\n    this._updateOverlayVisibility(element);\n  };\n\n  DrilldownOverlayBehavior.prototype._removeOverlay = function(element) {\n    var overlays = this._overlays;\n\n    overlays.remove({\n      element: element,\n      type: 'drilldown'\n    });\n  };\n\n  DrilldownOverlayBehavior.$inject = [\n    'canvas',\n    'eventBus',\n    'elementRegistry',\n    'overlays'\n  ];\n\n  var DrilldownModdule = {\n    __depends__: [ OverlaysModule, ChangeSupportModule, RootElementsModule ],\n    __init__: [ 'drilldownBreadcrumbs', 'drilldownOverlayBehavior', 'drilldownCentering', 'subprocessCompatibility' ],\n    drilldownBreadcrumbs: [ 'type', DrilldownBreadcrumbs ],\n    drilldownCentering: [ 'type', DrilldownCentering ],\n    drilldownOverlayBehavior: [ 'type', DrilldownOverlayBehavior ],\n    subprocessCompatibility: [ 'type', SubprocessCompatibility ]\n  };\n\n  /**\n   * @typedef { import('./BaseViewer').BaseViewerOptions } BaseViewerOptions\n   */\n\n  /**\n   * A viewer for BPMN 2.0 diagrams.\n   *\n   * Have a look at {@link NavigatedViewer} or {@link Modeler} for bundles that include\n   * additional features.\n   *\n   *\n   * ## Extending the Viewer\n   *\n   * In order to extend the viewer pass extension modules to bootstrap via the\n   * `additionalModules` option. An extension module is an object that exposes\n   * named services.\n   *\n   * The following example depicts the integration of a simple\n   * logging component that integrates with interaction events:\n   *\n   *\n   * ```javascript\n   *\n   * // logging component\n   * function InteractionLogger(eventBus) {\n   *   eventBus.on('element.hover', function(event) {\n   *     console.log()\n   *   })\n   * }\n   *\n   * InteractionLogger.$inject = [ 'eventBus' ]; // minification save\n   *\n   * // extension module\n   * var extensionModule = {\n   *   __init__: [ 'interactionLogger' ],\n   *   interactionLogger: [ 'type', InteractionLogger ]\n   * };\n   *\n   * // extend the viewer\n   * var bpmnViewer = new Viewer({ additionalModules: [ extensionModule ] });\n   * bpmnViewer.importXML(...);\n   * ```\n   *\n   * @param {BaseViewerOptions} [options] The options to configure the viewer.\n   */\n  function Viewer(options) {\n    BaseViewer.call(this, options);\n  }\n\n  e$3(Viewer, BaseViewer);\n\n  // modules the viewer is composed of\n  Viewer.prototype._modules = [\n    CoreModule,\n    translate,\n    SelectionModule,\n    OverlaysModule,\n    DrilldownModdule\n  ];\n\n  // default moddle extensions the viewer is composed of\n  Viewer.prototype._moddleExtensions = {};\n\n  var KEYS_COPY = [ 'c', 'C' ];\r\n  var KEYS_PASTE = [ 'v', 'V' ];\r\n  var KEYS_REDO = [ 'y', 'Y' ];\r\n  var KEYS_UNDO = [ 'z', 'Z' ];\r\n\r\n  /**\r\n   * Returns true if event was triggered with any modifier\r\n   * @param {KeyboardEvent} event\r\n   */\r\n  function hasModifier(event) {\r\n    return (event.ctrlKey || event.metaKey || event.shiftKey || event.altKey);\r\n  }\r\n\r\n  /**\r\n   * @param {KeyboardEvent} event\r\n   * @return {boolean}\r\n   */\r\n  function isCmd(event) {\r\n\r\n    // ensure we don't react to AltGr\r\n    // (mapped to CTRL + ALT)\r\n    if (event.altKey) {\r\n      return false;\r\n    }\r\n\r\n    return event.ctrlKey || event.metaKey;\r\n  }\r\n\r\n  /**\r\n   * Checks if key pressed is one of provided keys.\r\n   *\r\n   * @param {string|string[]} keys\r\n   * @param {KeyboardEvent} event\r\n   * @return {boolean}\r\n   */\r\n  function isKey(keys, event) {\r\n    keys = isArray$3(keys) ? keys : [ keys ];\r\n\r\n    return keys.indexOf(event.key) !== -1 || keys.indexOf(event.code) !== -1;\r\n  }\r\n\r\n  /**\r\n   * @param {KeyboardEvent} event\r\n   */\r\n  function isShift(event) {\r\n    return event.shiftKey;\r\n  }\r\n\r\n  /**\r\n   * @param {KeyboardEvent} event\r\n   */\r\n  function isCopy(event) {\r\n    return isCmd(event) && isKey(KEYS_COPY, event);\r\n  }\r\n\r\n  /**\r\n   * @param {KeyboardEvent} event\r\n   */\r\n  function isPaste(event) {\r\n    return isCmd(event) && isKey(KEYS_PASTE, event);\r\n  }\r\n\r\n  /**\r\n   * @param {KeyboardEvent} event\r\n   */\r\n  function isUndo(event) {\r\n    return isCmd(event) && !isShift(event) && isKey(KEYS_UNDO, event);\r\n  }\r\n\r\n  /**\r\n   * @param {KeyboardEvent} event\r\n   */\r\n  function isRedo(event) {\r\n    return isCmd(event) && (\r\n      isKey(KEYS_REDO, event) || (\r\n        isKey(KEYS_UNDO, event) && isShift(event)\r\n      )\r\n    );\r\n  }\n\n  /**\n   * @typedef {import('../../core/EventBus').default} EventBus\n   *\n   * @typedef {({ keyEvent: KeyboardEvent }) => any} Listener\n   */\n\n  var KEYDOWN_EVENT = 'keyboard.keydown',\n      KEYUP_EVENT = 'keyboard.keyup';\n\n  var HANDLE_MODIFIER_ATTRIBUTE = 'input-handle-modified-keys';\n\n  var DEFAULT_PRIORITY$3 = 1000;\n\n  /**\n   * A keyboard abstraction that may be activated and\n   * deactivated by users at will, consuming global key events\n   * and triggering diagram actions.\n   *\n   * For keys pressed down, keyboard fires `keyboard.keydown` event.\n   * The event context contains one field which is `KeyboardEvent` event.\n   *\n   * The implementation fires the following key events that allow\n   * other components to hook into key handling:\n   *\n   *  - keyboard.bind\n   *  - keyboard.unbind\n   *  - keyboard.init\n   *  - keyboard.destroy\n   *\n   * All events contain one field which is node.\n   *\n   * A default binding for the keyboard may be specified via the\n   * `keyboard.bindTo` configuration option.\n   *\n   * @param {Object} config\n   * @param {EventTarget} [config.bindTo]\n   * @param {EventBus} eventBus\n   */\n  function Keyboard(config, eventBus) {\n    var self = this;\n\n    this._config = config || {};\n    this._eventBus = eventBus;\n\n    this._keydownHandler = this._keydownHandler.bind(this);\n    this._keyupHandler = this._keyupHandler.bind(this);\n\n    // properly clean dom registrations\n    eventBus.on('diagram.destroy', function() {\n      self._fire('destroy');\n\n      self.unbind();\n    });\n\n    eventBus.on('diagram.init', function() {\n      self._fire('init');\n    });\n\n    eventBus.on('attach', function() {\n      if (config && config.bindTo) {\n        self.bind(config.bindTo);\n      }\n    });\n\n    eventBus.on('detach', function() {\n      self.unbind();\n    });\n  }\n\n  Keyboard.$inject = [\n    'config.keyboard',\n    'eventBus'\n  ];\n\n  Keyboard.prototype._keydownHandler = function(event) {\n    this._keyHandler(event, KEYDOWN_EVENT);\n  };\n\n  Keyboard.prototype._keyupHandler = function(event) {\n    this._keyHandler(event, KEYUP_EVENT);\n  };\n\n  Keyboard.prototype._keyHandler = function(event, type) {\n    var eventBusResult;\n\n    if (this._isEventIgnored(event)) {\n      return;\n    }\n\n    var context = {\n      keyEvent: event\n    };\n\n    eventBusResult = this._eventBus.fire(type || KEYDOWN_EVENT, context);\n\n    if (eventBusResult) {\n      event.preventDefault();\n    }\n  };\n\n  Keyboard.prototype._isEventIgnored = function(event) {\n    if (event.defaultPrevented) {\n      return true;\n    }\n\n    return isInput(event.target) && this._isModifiedKeyIgnored(event);\n  };\n\n  Keyboard.prototype._isModifiedKeyIgnored = function(event) {\n    if (!isCmd(event)) {\n      return true;\n    }\n\n    var allowedModifiers = this._getAllowedModifiers(event.target);\n    return allowedModifiers.indexOf(event.key) === -1;\n  };\n\n  Keyboard.prototype._getAllowedModifiers = function(element) {\n    var modifierContainer = closest(element, '[' + HANDLE_MODIFIER_ATTRIBUTE + ']', true);\n\n    if (!modifierContainer || (this._node && !this._node.contains(modifierContainer))) {\n      return [];\n    }\n\n    return modifierContainer.getAttribute(HANDLE_MODIFIER_ATTRIBUTE).split(',');\n  };\n\n  /**\n   * Bind keyboard events to the given DOM node.\n   *\n   * @param {EventTarget} node\n   */\n  Keyboard.prototype.bind = function(node) {\n\n    // make sure that the keyboard is only bound once to the DOM\n    this.unbind();\n\n    this._node = node;\n\n    // bind key events\n    event.bind(node, 'keydown', this._keydownHandler);\n    event.bind(node, 'keyup', this._keyupHandler);\n\n    this._fire('bind');\n  };\n\n  /**\n   * @return {EventTarget}\n   */\n  Keyboard.prototype.getBinding = function() {\n    return this._node;\n  };\n\n  Keyboard.prototype.unbind = function() {\n    var node = this._node;\n\n    if (node) {\n      this._fire('unbind');\n\n      // unbind key events\n      event.unbind(node, 'keydown', this._keydownHandler);\n      event.unbind(node, 'keyup', this._keyupHandler);\n    }\n\n    this._node = null;\n  };\n\n  /**\n   * @param {string} event\n   */\n  Keyboard.prototype._fire = function(event) {\n    this._eventBus.fire('keyboard.' + event, { node: this._node });\n  };\n\n  /**\n   * Add a listener function that is notified with `KeyboardEvent` whenever\n   * the keyboard is bound and the user presses a key. If no priority is\n   * provided, the default value of 1000 is used.\n   *\n   * @param {number} [priority]\n   * @param {Listener} listener\n   * @param {string} [type='keyboard.keydown']\n   */\n  Keyboard.prototype.addListener = function(priority, listener, type) {\n    if (isFunction(priority)) {\n      type = listener;\n      listener = priority;\n      priority = DEFAULT_PRIORITY$3;\n    }\n\n    this._eventBus.on(type || KEYDOWN_EVENT, priority, listener);\n  };\n\n  /**\n   * Remove a listener function.\n   *\n   * @param {Listener} listener\n   * @param {string} [type='keyboard.keydown']\n   */\n  Keyboard.prototype.removeListener = function(listener, type) {\n    this._eventBus.off(type || KEYDOWN_EVENT, listener);\n  };\n\n  Keyboard.prototype.hasModifier = hasModifier;\n  Keyboard.prototype.isCmd = isCmd;\n  Keyboard.prototype.isShift = isShift;\n  Keyboard.prototype.isKey = isKey;\n\n\n\n  // helpers ///////\n\n  function isInput(target) {\n    return target && (matches(target, 'input, textarea') || target.contentEditable === 'true');\n  }\n\n  var LOW_PRIORITY$m = 500;\n\n\n  /**\n   * Adds default keyboard bindings.\n   *\n   * This does not pull in any features will bind only actions that\n   * have previously been registered against the editorActions component.\n   *\n   * @param {EventBus} eventBus\n   * @param {Keyboard} keyboard\n   */\n  function KeyboardBindings(eventBus, keyboard) {\n\n    var self = this;\n\n    eventBus.on('editorActions.init', LOW_PRIORITY$m, function(event) {\n\n      var editorActions = event.editorActions;\n\n      self.registerBindings(keyboard, editorActions);\n    });\n  }\n\n  KeyboardBindings.$inject = [\n    'eventBus',\n    'keyboard'\n  ];\n\n\n  /**\n   * Register available keyboard bindings.\n   *\n   * @param {Keyboard} keyboard\n   * @param {EditorActions} editorActions\n   */\n  KeyboardBindings.prototype.registerBindings = function(keyboard, editorActions) {\n\n    /**\n     * Add keyboard binding if respective editor action\n     * is registered.\n     *\n     * @param {string} action name\n     * @param {Function} fn that implements the key binding\n     */\n    function addListener(action, fn) {\n\n      if (editorActions.isRegistered(action)) {\n        keyboard.addListener(fn);\n      }\n    }\n\n\n    // undo\n    // (CTRL|CMD) + Z\n    addListener('undo', function(context) {\n\n      var event = context.keyEvent;\n\n      if (isUndo(event)) {\n        editorActions.trigger('undo');\n\n        return true;\n      }\n    });\n\n    // redo\n    // CTRL + Y\n    // CMD + SHIFT + Z\n    addListener('redo', function(context) {\n\n      var event = context.keyEvent;\n\n      if (isRedo(event)) {\n        editorActions.trigger('redo');\n\n        return true;\n      }\n    });\n\n    // copy\n    // CTRL/CMD + C\n    addListener('copy', function(context) {\n\n      var event = context.keyEvent;\n\n      if (isCopy(event)) {\n        editorActions.trigger('copy');\n\n        return true;\n      }\n    });\n\n    // paste\n    // CTRL/CMD + V\n    addListener('paste', function(context) {\n\n      var event = context.keyEvent;\n\n      if (isPaste(event)) {\n        editorActions.trigger('paste');\n\n        return true;\n      }\n    });\n\n    // zoom in one step\n    // CTRL/CMD + +\n    addListener('stepZoom', function(context) {\n\n      var event = context.keyEvent;\n\n      // quirk: it has to be triggered by `=` as well to work on international keyboard layout\n      // cf: https://github.com/bpmn-io/bpmn-js/issues/1362#issuecomment-722989754\n      if (isKey([ '+', 'Add', '=' ], event) && isCmd(event)) {\n        editorActions.trigger('stepZoom', { value: 1 });\n\n        return true;\n      }\n    });\n\n    // zoom out one step\n    // CTRL + -\n    addListener('stepZoom', function(context) {\n\n      var event = context.keyEvent;\n\n      if (isKey([ '-', 'Subtract' ], event) && isCmd(event)) {\n        editorActions.trigger('stepZoom', { value: -1 });\n\n        return true;\n      }\n    });\n\n    // zoom to the default level\n    // CTRL + 0\n    addListener('zoom', function(context) {\n\n      var event = context.keyEvent;\n\n      if (isKey('0', event) && isCmd(event)) {\n        editorActions.trigger('zoom', { value: 1 });\n\n        return true;\n      }\n    });\n\n    // delete selected element\n    // DEL\n    addListener('removeSelection', function(context) {\n\n      var event = context.keyEvent;\n\n      if (isKey([ 'Backspace', 'Delete', 'Del' ], event)) {\n        editorActions.trigger('removeSelection');\n\n        return true;\n      }\n    });\n  };\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var KeyboardModule$1 = {\n    __init__: [ 'keyboard', 'keyboardBindings' ],\n    keyboard: [ 'type', Keyboard ],\n    keyboardBindings: [ 'type', KeyboardBindings ]\n  };\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../features/keyboard/Keyboard').default} Keyboard\n   */\n\n  var DEFAULT_CONFIG$1 = {\n    moveSpeed: 50,\n    moveSpeedAccelerated: 200\n  };\n\n\n  /**\n   * A feature that allows users to move the canvas using the keyboard.\n   *\n   * @param {Object} config\n   * @param {number} [config.moveSpeed=50]\n   * @param {number} [config.moveSpeedAccelerated=200]\n   * @param {Keyboard} keyboard\n   * @param {Canvas} canvas\n   */\n  function KeyboardMove(\n      config,\n      keyboard,\n      canvas\n  ) {\n\n    var self = this;\n\n    this._config = assign$1({}, DEFAULT_CONFIG$1, config || {});\n\n    keyboard.addListener(arrowsListener);\n\n\n    function arrowsListener(context) {\n\n      var event = context.keyEvent,\n          config = self._config;\n\n      if (!keyboard.isCmd(event)) {\n        return;\n      }\n\n      if (keyboard.isKey([\n        'ArrowLeft', 'Left',\n        'ArrowUp', 'Up',\n        'ArrowDown', 'Down',\n        'ArrowRight', 'Right'\n      ], event)) {\n\n        var speed = (\n          keyboard.isShift(event) ?\n            config.moveSpeedAccelerated :\n            config.moveSpeed\n        );\n\n        var direction;\n\n        switch (event.key) {\n        case 'ArrowLeft':\n        case 'Left':\n          direction = 'left';\n          break;\n        case 'ArrowUp':\n        case 'Up':\n          direction = 'up';\n          break;\n        case 'ArrowRight':\n        case 'Right':\n          direction = 'right';\n          break;\n        case 'ArrowDown':\n        case 'Down':\n          direction = 'down';\n          break;\n        }\n\n        self.moveCanvas({\n          speed: speed,\n          direction: direction\n        });\n\n        return true;\n      }\n    }\n\n    /**\n     * @param {{\n     *   direction: 'up' | 'down' | 'left' | 'right';\n     *   speed: number;\n     * }} options\n     */\n    this.moveCanvas = function(options) {\n\n      var dx = 0,\n          dy = 0,\n          speed = options.speed;\n\n      var actualSpeed = speed / Math.min(Math.sqrt(canvas.viewbox().scale), 1);\n\n      switch (options.direction) {\n      case 'left': // Left\n        dx = actualSpeed;\n        break;\n      case 'up': // Up\n        dy = actualSpeed;\n        break;\n      case 'right': // Right\n        dx = -actualSpeed;\n        break;\n      case 'down': // Down\n        dy = -actualSpeed;\n        break;\n      }\n\n      canvas.scroll({\n        dx: dx,\n        dy: dy\n      });\n    };\n\n  }\n\n\n  KeyboardMove.$inject = [\n    'config.keyboardMove',\n    'keyboard',\n    'canvas'\n  ];\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var KeyboardMoveModule = {\n    __depends__: [\n      KeyboardModule$1\n    ],\n    __init__: [ 'keyboardMove' ],\n    keyboardMove: [ 'type', KeyboardMove ]\n  };\n\n  var CURSOR_CLS_PATTERN = /^djs-cursor-.*$/;\n\n  /**\n   * @param {string} mode\n   */\n  function set(mode) {\n    var classes = classes$1(document.body);\n\n    classes.removeMatching(CURSOR_CLS_PATTERN);\n\n    if (mode) {\n      classes.add('djs-cursor-' + mode);\n    }\n  }\n\n  function unset() {\n    set(null);\n  }\n\n  /**\n   * @typedef {import('../core/EventBus').EventBus} EventBus\n   */\n\n  var TRAP_PRIORITY = 5000;\n\n  /**\n   * Installs a click trap that prevents a ghost click following a dragging operation.\n   *\n   * @param {EventBus} eventBus\n   * @param {string} [eventName='element.click']\n   *\n   * @return {() => void} a function to immediately remove the installed trap.\n   */\n  function install(eventBus, eventName) {\n\n    eventName = eventName || 'element.click';\n\n    function trap() {\n      return false;\n    }\n\n    eventBus.once(eventName, TRAP_PRIORITY, trap);\n\n    return function() {\n      eventBus.off(eventName, trap);\n    };\n  }\n\n  /**\n   * @typedef {import('../util/Types').Point} Point\n   * @typedef {import('../util/Types').Rect} Rect\n   */\n\n  /**\n   * @param {Rect} bounds\n   * @return {Point}\n   */\n  function center(bounds) {\n    return {\n      x: bounds.x + (bounds.width / 2),\n      y: bounds.y + (bounds.height / 2)\n    };\n  }\n\n\n  /**\n   * @param {Point} a\n   * @param {Point} b\n   * @return {Point}\n   */\n  function delta(a, b) {\n    return {\n      x: a.x - b.x,\n      y: a.y - b.y\n    };\n  }\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   */\n\n  var THRESHOLD$1 = 15;\n\n\n  /**\n   * Move the canvas via mouse.\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   */\n  function MoveCanvas(eventBus, canvas) {\n\n    var context;\n\n\n    // listen for move on element mouse down;\n    // allow others to hook into the event before us though\n    // (dragging / element moving will do this)\n    eventBus.on('element.mousedown', 500, function(e) {\n      return handleStart(e.originalEvent);\n    });\n\n\n    function handleMove(event) {\n\n      var start = context.start,\n          button = context.button,\n          position = toPoint(event),\n          delta$1 = delta(position, start);\n\n      if (!context.dragging && length(delta$1) > THRESHOLD$1) {\n        context.dragging = true;\n\n        if (button === 0) {\n          install(eventBus);\n        }\n\n        set('grab');\n      }\n\n      if (context.dragging) {\n\n        var lastPosition = context.last || context.start;\n\n        delta$1 = delta(position, lastPosition);\n\n        canvas.scroll({\n          dx: delta$1.x,\n          dy: delta$1.y\n        });\n\n        context.last = position;\n      }\n\n      // prevent select\n      event.preventDefault();\n    }\n\n\n    function handleEnd(event$1) {\n      event.unbind(document, 'mousemove', handleMove);\n      event.unbind(document, 'mouseup', handleEnd);\n\n      context = null;\n\n      unset();\n    }\n\n    function handleStart(event$1) {\n\n      // event is already handled by '.djs-draggable'\n      if (closest(event$1.target, '.djs-draggable')) {\n        return;\n      }\n\n      var button = event$1.button;\n\n      // reject right mouse button or modifier key\n      if (button >= 2 || event$1.ctrlKey || event$1.shiftKey || event$1.altKey) {\n        return;\n      }\n\n      context = {\n        button: button,\n        start: toPoint(event$1)\n      };\n\n      event.bind(document, 'mousemove', handleMove);\n      event.bind(document, 'mouseup', handleEnd);\n\n      // we've handled the event\n      return true;\n    }\n\n    this.isActive = function() {\n      return !!context;\n    };\n\n  }\n\n\n  MoveCanvas.$inject = [\n    'eventBus',\n    'canvas'\n  ];\n\n\n\n  // helpers ///////\n\n  function length(point) {\n    return Math.sqrt(Math.pow(point.x, 2) + Math.pow(point.y, 2));\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var MoveCanvasModule = {\n    __init__: [ 'moveCanvas' ],\n    moveCanvas: [ 'type', MoveCanvas ]\n  };\n\n  /**\n   * Get the logarithm of x with base 10.\n   *\n   * @param {number} x\n   */\n  function log10(x) {\n    return Math.log(x) / Math.log(10);\n  }\n\n  /**\n   * Get step size for given range and number of steps.\n   *\n   * @param {Object} range\n   * @param {number} range.min\n   * @param {number} range.max\n   * @param {number} steps\n   */\n  function getStepSize(range, steps) {\n\n    var minLinearRange = log10(range.min),\n        maxLinearRange = log10(range.max);\n\n    var absoluteLinearRange = Math.abs(minLinearRange) + Math.abs(maxLinearRange);\n\n    return absoluteLinearRange / steps;\n  }\n\n  /**\n   * @param {Object} range\n   * @param {number} range.min\n   * @param {number} range.max\n   * @param {number} scale\n   */\n  function cap(range, scale) {\n    return Math.max(range.min, Math.min(range.max, scale));\n  }\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   *\n   * @typedef {import('../../util/Types').Point} Point\n   */\n\n  var sign = Math.sign || function(n) {\n    return n >= 0 ? 1 : -1;\n  };\n\n  var RANGE = { min: 0.2, max: 4 },\n      NUM_STEPS = 10;\n\n  var DELTA_THRESHOLD = 0.1;\n\n  var DEFAULT_SCALE = 0.75;\n\n  /**\n   * An implementation of zooming and scrolling within the\n   * {@link Canvas} via the mouse wheel.\n   *\n   * Mouse wheel zooming / scrolling may be disabled using\n   * the {@link toggle(enabled)} method.\n   *\n   * @param {Object} [config]\n   * @param {boolean} [config.enabled=true] default enabled state\n   * @param {number} [config.scale=.75] scroll sensivity\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   */\n  function ZoomScroll(config, eventBus, canvas) {\n\n    config = config || {};\n\n    this._enabled = false;\n\n    this._canvas = canvas;\n    this._container = canvas._container;\n\n    this._handleWheel = bind$2(this._handleWheel, this);\n\n    this._totalDelta = 0;\n    this._scale = config.scale || DEFAULT_SCALE;\n\n    var self = this;\n\n    eventBus.on('canvas.init', function(e) {\n      self._init(config.enabled !== false);\n    });\n  }\n\n  ZoomScroll.$inject = [\n    'config.zoomScroll',\n    'eventBus',\n    'canvas'\n  ];\n\n  /**\n   * @param {Point} delta\n   */\n  ZoomScroll.prototype.scroll = function scroll(delta) {\n    this._canvas.scroll(delta);\n  };\n\n\n  ZoomScroll.prototype.reset = function reset() {\n    this._canvas.zoom('fit-viewport');\n  };\n\n  /**\n   * Zoom depending on delta.\n   *\n   * @param {number} delta\n   * @param {Point} position\n   */\n  ZoomScroll.prototype.zoom = function zoom(delta, position) {\n\n    // zoom with half the step size of stepZoom\n    var stepSize = getStepSize(RANGE, NUM_STEPS * 2);\n\n    // add until threshold reached\n    this._totalDelta += delta;\n\n    if (Math.abs(this._totalDelta) > DELTA_THRESHOLD) {\n      this._zoom(delta, position, stepSize);\n\n      // reset\n      this._totalDelta = 0;\n    }\n  };\n\n\n  ZoomScroll.prototype._handleWheel = function handleWheel(event) {\n\n    // event is already handled by '.djs-scrollable'\n    if (closest(event.target, '.djs-scrollable', true)) {\n      return;\n    }\n\n    var element = this._container;\n\n    event.preventDefault();\n\n    // pinch to zoom is mapped to wheel + ctrlKey = true\n    // in modern browsers (!)\n\n    var isZoom = event.ctrlKey;\n\n    var isHorizontalScroll = event.shiftKey;\n\n    var factor = -1 * this._scale,\n        delta;\n\n    if (isZoom) {\n      factor *= event.deltaMode === 0 ? 0.020 : 0.32;\n    } else {\n      factor *= event.deltaMode === 0 ? 1.0 : 16.0;\n    }\n\n    if (isZoom) {\n      var elementRect = element.getBoundingClientRect();\n\n      var offset = {\n        x: event.clientX - elementRect.left,\n        y: event.clientY - elementRect.top\n      };\n\n      delta = (\n        Math.sqrt(\n          Math.pow(event.deltaY, 2) +\n          Math.pow(event.deltaX, 2)\n        ) * sign(event.deltaY) * factor\n      );\n\n      // zoom in relative to diagram {x,y} coordinates\n      this.zoom(delta, offset);\n    } else {\n\n      if (isHorizontalScroll) {\n        delta = {\n          dx: factor * event.deltaY,\n          dy: 0\n        };\n      } else {\n        delta = {\n          dx: factor * event.deltaX,\n          dy: factor * event.deltaY\n        };\n      }\n\n      this.scroll(delta);\n    }\n  };\n\n  /**\n   * Zoom with fixed step size.\n   *\n   * @param {number} delta Zoom delta (1 for zooming in, -1 for zooming out).\n   * @param {Point} position\n   */\n  ZoomScroll.prototype.stepZoom = function stepZoom(delta, position) {\n\n    var stepSize = getStepSize(RANGE, NUM_STEPS);\n\n    this._zoom(delta, position, stepSize);\n  };\n\n\n  /**\n   * Zoom in/out given a step size.\n   *\n   * @param {number} delta\n   * @param {Point} position\n   * @param {number} stepSize\n   */\n  ZoomScroll.prototype._zoom = function(delta, position, stepSize) {\n    var canvas = this._canvas;\n\n    var direction = delta > 0 ? 1 : -1;\n\n    var currentLinearZoomLevel = log10(canvas.zoom());\n\n    // snap to a proximate zoom step\n    var newLinearZoomLevel = Math.round(currentLinearZoomLevel / stepSize) * stepSize;\n\n    // increase or decrease one zoom step in the given direction\n    newLinearZoomLevel += stepSize * direction;\n\n    // calculate the absolute logarithmic zoom level based on the linear zoom level\n    // (e.g. 2 for an absolute x2 zoom)\n    var newLogZoomLevel = Math.pow(10, newLinearZoomLevel);\n\n    canvas.zoom(cap(RANGE, newLogZoomLevel), position);\n  };\n\n\n  /**\n   * Toggle the zoom scroll ability via mouse wheel.\n   *\n   * @param {boolean} [newEnabled] new enabled state\n   */\n  ZoomScroll.prototype.toggle = function toggle(newEnabled) {\n\n    var element = this._container;\n    var handleWheel = this._handleWheel;\n\n    var oldEnabled = this._enabled;\n\n    if (typeof newEnabled === 'undefined') {\n      newEnabled = !oldEnabled;\n    }\n\n    // only react on actual changes\n    if (oldEnabled !== newEnabled) {\n\n      // add or remove wheel listener based on\n      // changed enabled state\n      event[newEnabled ? 'bind' : 'unbind'](element, 'wheel', handleWheel, false);\n    }\n\n    this._enabled = newEnabled;\n\n    return newEnabled;\n  };\n\n\n  ZoomScroll.prototype._init = function(newEnabled) {\n    this.toggle(newEnabled);\n  };\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var ZoomScrollModule = {\n    __init__: [ 'zoomScroll' ],\n    zoomScroll: [ 'type', ZoomScroll ]\n  };\n\n  /**\n   * @typedef { import('./BaseViewer').BaseViewerOptions } BaseViewerOptions\n   */\n\n  /**\n   * A viewer with mouse and keyboard navigation features.\n   *\n   * @param {BaseViewerOptions} [options]\n   */\n  function NavigatedViewer(options) {\n    Viewer.call(this, options);\n  }\n\n  e$3(NavigatedViewer, Viewer);\n\n\n  NavigatedViewer.prototype._navigationModules = [\n    KeyboardMoveModule,\n    MoveCanvasModule,\n    ZoomScrollModule\n  ];\n\n  NavigatedViewer.prototype._modules = [].concat(\n    Viewer.prototype._modules,\n    NavigatedViewer.prototype._navigationModules\n  );\n\n  var hammer = {exports: {}};\n\n  /*! Hammer.JS - v2.0.7 - 2016-04-22\n   * http://hammerjs.github.io/\n   *\n   * Copyright (c) 2016 Jorik Tangelder;\n   * Licensed under the MIT license */\n\n  (function (module) {\n  \t(function(window, document, exportName, undefined$1) {\n\n  \tvar VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o'];\n  \tvar TEST_ELEMENT = document.createElement('div');\n\n  \tvar TYPE_FUNCTION = 'function';\n\n  \tvar round = Math.round;\n  \tvar abs = Math.abs;\n  \tvar now = Date.now;\n\n  \t/**\n  \t * set a timeout with a given scope\n  \t * @param {Function} fn\n  \t * @param {Number} timeout\n  \t * @param {Object} context\n  \t * @returns {number}\n  \t */\n  \tfunction setTimeoutContext(fn, timeout, context) {\n  \t    return setTimeout(bindFn(fn, context), timeout);\n  \t}\n\n  \t/**\n  \t * if the argument is an array, we want to execute the fn on each entry\n  \t * if it aint an array we don't want to do a thing.\n  \t * this is used by all the methods that accept a single and array argument.\n  \t * @param {*|Array} arg\n  \t * @param {String} fn\n  \t * @param {Object} [context]\n  \t * @returns {Boolean}\n  \t */\n  \tfunction invokeArrayArg(arg, fn, context) {\n  \t    if (Array.isArray(arg)) {\n  \t        each(arg, context[fn], context);\n  \t        return true;\n  \t    }\n  \t    return false;\n  \t}\n\n  \t/**\n  \t * walk objects and arrays\n  \t * @param {Object} obj\n  \t * @param {Function} iterator\n  \t * @param {Object} context\n  \t */\n  \tfunction each(obj, iterator, context) {\n  \t    var i;\n\n  \t    if (!obj) {\n  \t        return;\n  \t    }\n\n  \t    if (obj.forEach) {\n  \t        obj.forEach(iterator, context);\n  \t    } else if (obj.length !== undefined$1) {\n  \t        i = 0;\n  \t        while (i < obj.length) {\n  \t            iterator.call(context, obj[i], i, obj);\n  \t            i++;\n  \t        }\n  \t    } else {\n  \t        for (i in obj) {\n  \t            obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);\n  \t        }\n  \t    }\n  \t}\n\n  \t/**\n  \t * wrap a method with a deprecation warning and stack trace\n  \t * @param {Function} method\n  \t * @param {String} name\n  \t * @param {String} message\n  \t * @returns {Function} A new function wrapping the supplied method.\n  \t */\n  \tfunction deprecate(method, name, message) {\n  \t    var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\\n' + message + ' AT \\n';\n  \t    return function() {\n  \t        var e = new Error('get-stack-trace');\n  \t        var stack = e && e.stack ? e.stack.replace(/^[^\\(]+?[\\n$]/gm, '')\n  \t            .replace(/^\\s+at\\s+/gm, '')\n  \t            .replace(/^Object.<anonymous>\\s*\\(/gm, '{anonymous}()@') : 'Unknown Stack Trace';\n\n  \t        var log = window.console && (window.console.warn || window.console.log);\n  \t        if (log) {\n  \t            log.call(window.console, deprecationMessage, stack);\n  \t        }\n  \t        return method.apply(this, arguments);\n  \t    };\n  \t}\n\n  \t/**\n  \t * extend object.\n  \t * means that properties in dest will be overwritten by the ones in src.\n  \t * @param {Object} target\n  \t * @param {...Object} objects_to_assign\n  \t * @returns {Object} target\n  \t */\n  \tvar assign;\n  \tif (typeof Object.assign !== 'function') {\n  \t    assign = function assign(target) {\n  \t        if (target === undefined$1 || target === null) {\n  \t            throw new TypeError('Cannot convert undefined or null to object');\n  \t        }\n\n  \t        var output = Object(target);\n  \t        for (var index = 1; index < arguments.length; index++) {\n  \t            var source = arguments[index];\n  \t            if (source !== undefined$1 && source !== null) {\n  \t                for (var nextKey in source) {\n  \t                    if (source.hasOwnProperty(nextKey)) {\n  \t                        output[nextKey] = source[nextKey];\n  \t                    }\n  \t                }\n  \t            }\n  \t        }\n  \t        return output;\n  \t    };\n  \t} else {\n  \t    assign = Object.assign;\n  \t}\n\n  \t/**\n  \t * extend object.\n  \t * means that properties in dest will be overwritten by the ones in src.\n  \t * @param {Object} dest\n  \t * @param {Object} src\n  \t * @param {Boolean} [merge=false]\n  \t * @returns {Object} dest\n  \t */\n  \tvar extend = deprecate(function extend(dest, src, merge) {\n  \t    var keys = Object.keys(src);\n  \t    var i = 0;\n  \t    while (i < keys.length) {\n  \t        if (!merge || (merge && dest[keys[i]] === undefined$1)) {\n  \t            dest[keys[i]] = src[keys[i]];\n  \t        }\n  \t        i++;\n  \t    }\n  \t    return dest;\n  \t}, 'extend', 'Use `assign`.');\n\n  \t/**\n  \t * merge the values from src in the dest.\n  \t * means that properties that exist in dest will not be overwritten by src\n  \t * @param {Object} dest\n  \t * @param {Object} src\n  \t * @returns {Object} dest\n  \t */\n  \tvar merge = deprecate(function merge(dest, src) {\n  \t    return extend(dest, src, true);\n  \t}, 'merge', 'Use `assign`.');\n\n  \t/**\n  \t * simple class inheritance\n  \t * @param {Function} child\n  \t * @param {Function} base\n  \t * @param {Object} [properties]\n  \t */\n  \tfunction inherit(child, base, properties) {\n  \t    var baseP = base.prototype,\n  \t        childP;\n\n  \t    childP = child.prototype = Object.create(baseP);\n  \t    childP.constructor = child;\n  \t    childP._super = baseP;\n\n  \t    if (properties) {\n  \t        assign(childP, properties);\n  \t    }\n  \t}\n\n  \t/**\n  \t * simple function bind\n  \t * @param {Function} fn\n  \t * @param {Object} context\n  \t * @returns {Function}\n  \t */\n  \tfunction bindFn(fn, context) {\n  \t    return function boundFn() {\n  \t        return fn.apply(context, arguments);\n  \t    };\n  \t}\n\n  \t/**\n  \t * let a boolean value also be a function that must return a boolean\n  \t * this first item in args will be used as the context\n  \t * @param {Boolean|Function} val\n  \t * @param {Array} [args]\n  \t * @returns {Boolean}\n  \t */\n  \tfunction boolOrFn(val, args) {\n  \t    if (typeof val == TYPE_FUNCTION) {\n  \t        return val.apply(args ? args[0] || undefined$1 : undefined$1, args);\n  \t    }\n  \t    return val;\n  \t}\n\n  \t/**\n  \t * use the val2 when val1 is undefined\n  \t * @param {*} val1\n  \t * @param {*} val2\n  \t * @returns {*}\n  \t */\n  \tfunction ifUndefined(val1, val2) {\n  \t    return (val1 === undefined$1) ? val2 : val1;\n  \t}\n\n  \t/**\n  \t * addEventListener with multiple events at once\n  \t * @param {EventTarget} target\n  \t * @param {String} types\n  \t * @param {Function} handler\n  \t */\n  \tfunction addEventListeners(target, types, handler) {\n  \t    each(splitStr(types), function(type) {\n  \t        target.addEventListener(type, handler, false);\n  \t    });\n  \t}\n\n  \t/**\n  \t * removeEventListener with multiple events at once\n  \t * @param {EventTarget} target\n  \t * @param {String} types\n  \t * @param {Function} handler\n  \t */\n  \tfunction removeEventListeners(target, types, handler) {\n  \t    each(splitStr(types), function(type) {\n  \t        target.removeEventListener(type, handler, false);\n  \t    });\n  \t}\n\n  \t/**\n  \t * find if a node is in the given parent\n  \t * @method hasParent\n  \t * @param {HTMLElement} node\n  \t * @param {HTMLElement} parent\n  \t * @return {Boolean} found\n  \t */\n  \tfunction hasParent(node, parent) {\n  \t    while (node) {\n  \t        if (node == parent) {\n  \t            return true;\n  \t        }\n  \t        node = node.parentNode;\n  \t    }\n  \t    return false;\n  \t}\n\n  \t/**\n  \t * small indexOf wrapper\n  \t * @param {String} str\n  \t * @param {String} find\n  \t * @returns {Boolean} found\n  \t */\n  \tfunction inStr(str, find) {\n  \t    return str.indexOf(find) > -1;\n  \t}\n\n  \t/**\n  \t * split string on whitespace\n  \t * @param {String} str\n  \t * @returns {Array} words\n  \t */\n  \tfunction splitStr(str) {\n  \t    return str.trim().split(/\\s+/g);\n  \t}\n\n  \t/**\n  \t * find if a array contains the object using indexOf or a simple polyFill\n  \t * @param {Array} src\n  \t * @param {String} find\n  \t * @param {String} [findByKey]\n  \t * @return {Boolean|Number} false when not found, or the index\n  \t */\n  \tfunction inArray(src, find, findByKey) {\n  \t    if (src.indexOf && !findByKey) {\n  \t        return src.indexOf(find);\n  \t    } else {\n  \t        var i = 0;\n  \t        while (i < src.length) {\n  \t            if ((findByKey && src[i][findByKey] == find) || (!findByKey && src[i] === find)) {\n  \t                return i;\n  \t            }\n  \t            i++;\n  \t        }\n  \t        return -1;\n  \t    }\n  \t}\n\n  \t/**\n  \t * convert array-like objects to real arrays\n  \t * @param {Object} obj\n  \t * @returns {Array}\n  \t */\n  \tfunction toArray(obj) {\n  \t    return Array.prototype.slice.call(obj, 0);\n  \t}\n\n  \t/**\n  \t * unique array with objects based on a key (like 'id') or just by the array's value\n  \t * @param {Array} src [{id:1},{id:2},{id:1}]\n  \t * @param {String} [key]\n  \t * @param {Boolean} [sort=False]\n  \t * @returns {Array} [{id:1},{id:2}]\n  \t */\n  \tfunction uniqueArray(src, key, sort) {\n  \t    var results = [];\n  \t    var values = [];\n  \t    var i = 0;\n\n  \t    while (i < src.length) {\n  \t        var val = key ? src[i][key] : src[i];\n  \t        if (inArray(values, val) < 0) {\n  \t            results.push(src[i]);\n  \t        }\n  \t        values[i] = val;\n  \t        i++;\n  \t    }\n\n  \t    if (sort) {\n  \t        if (!key) {\n  \t            results = results.sort();\n  \t        } else {\n  \t            results = results.sort(function sortUniqueArray(a, b) {\n  \t                return a[key] > b[key];\n  \t            });\n  \t        }\n  \t    }\n\n  \t    return results;\n  \t}\n\n  \t/**\n  \t * get the prefixed property\n  \t * @param {Object} obj\n  \t * @param {String} property\n  \t * @returns {String|Undefined} prefixed\n  \t */\n  \tfunction prefixed(obj, property) {\n  \t    var prefix, prop;\n  \t    var camelProp = property[0].toUpperCase() + property.slice(1);\n\n  \t    var i = 0;\n  \t    while (i < VENDOR_PREFIXES.length) {\n  \t        prefix = VENDOR_PREFIXES[i];\n  \t        prop = (prefix) ? prefix + camelProp : property;\n\n  \t        if (prop in obj) {\n  \t            return prop;\n  \t        }\n  \t        i++;\n  \t    }\n  \t    return undefined$1;\n  \t}\n\n  \t/**\n  \t * get a unique id\n  \t * @returns {number} uniqueId\n  \t */\n  \tvar _uniqueId = 1;\n  \tfunction uniqueId() {\n  \t    return _uniqueId++;\n  \t}\n\n  \t/**\n  \t * get the window object of an element\n  \t * @param {HTMLElement} element\n  \t * @returns {DocumentView|Window}\n  \t */\n  \tfunction getWindowForElement(element) {\n  \t    var doc = element.ownerDocument || element;\n  \t    return (doc.defaultView || doc.parentWindow || window);\n  \t}\n\n  \tvar MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;\n\n  \tvar SUPPORT_TOUCH = ('ontouchstart' in window);\n  \tvar SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined$1;\n  \tvar SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);\n\n  \tvar INPUT_TYPE_TOUCH = 'touch';\n  \tvar INPUT_TYPE_PEN = 'pen';\n  \tvar INPUT_TYPE_MOUSE = 'mouse';\n  \tvar INPUT_TYPE_KINECT = 'kinect';\n\n  \tvar COMPUTE_INTERVAL = 25;\n\n  \tvar INPUT_START = 1;\n  \tvar INPUT_MOVE = 2;\n  \tvar INPUT_END = 4;\n  \tvar INPUT_CANCEL = 8;\n\n  \tvar DIRECTION_NONE = 1;\n  \tvar DIRECTION_LEFT = 2;\n  \tvar DIRECTION_RIGHT = 4;\n  \tvar DIRECTION_UP = 8;\n  \tvar DIRECTION_DOWN = 16;\n\n  \tvar DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;\n  \tvar DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;\n  \tvar DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;\n\n  \tvar PROPS_XY = ['x', 'y'];\n  \tvar PROPS_CLIENT_XY = ['clientX', 'clientY'];\n\n  \t/**\n  \t * create new input type manager\n  \t * @param {Manager} manager\n  \t * @param {Function} callback\n  \t * @returns {Input}\n  \t * @constructor\n  \t */\n  \tfunction Input(manager, callback) {\n  \t    var self = this;\n  \t    this.manager = manager;\n  \t    this.callback = callback;\n  \t    this.element = manager.element;\n  \t    this.target = manager.options.inputTarget;\n\n  \t    // smaller wrapper around the handler, for the scope and the enabled state of the manager,\n  \t    // so when disabled the input events are completely bypassed.\n  \t    this.domHandler = function(ev) {\n  \t        if (boolOrFn(manager.options.enable, [manager])) {\n  \t            self.handler(ev);\n  \t        }\n  \t    };\n\n  \t    this.init();\n\n  \t}\n\n  \tInput.prototype = {\n  \t    /**\n  \t     * should handle the inputEvent data and trigger the callback\n  \t     * @virtual\n  \t     */\n  \t    handler: function() { },\n\n  \t    /**\n  \t     * bind the events\n  \t     */\n  \t    init: function() {\n  \t        this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);\n  \t        this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);\n  \t        this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n  \t    },\n\n  \t    /**\n  \t     * unbind the events\n  \t     */\n  \t    destroy: function() {\n  \t        this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);\n  \t        this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);\n  \t        this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n  \t    }\n  \t};\n\n  \t/**\n  \t * create new input type manager\n  \t * called by the Manager constructor\n  \t * @param {Hammer} manager\n  \t * @returns {Input}\n  \t */\n  \tfunction createInputInstance(manager) {\n  \t    var Type;\n  \t    var inputClass = manager.options.inputClass;\n\n  \t    if (inputClass) {\n  \t        Type = inputClass;\n  \t    } else if (SUPPORT_POINTER_EVENTS) {\n  \t        Type = PointerEventInput;\n  \t    } else if (SUPPORT_ONLY_TOUCH) {\n  \t        Type = TouchInput;\n  \t    } else if (!SUPPORT_TOUCH) {\n  \t        Type = MouseInput;\n  \t    } else {\n  \t        Type = TouchMouseInput;\n  \t    }\n  \t    return new (Type)(manager, inputHandler);\n  \t}\n\n  \t/**\n  \t * handle input events\n  \t * @param {Manager} manager\n  \t * @param {String} eventType\n  \t * @param {Object} input\n  \t */\n  \tfunction inputHandler(manager, eventType, input) {\n  \t    var pointersLen = input.pointers.length;\n  \t    var changedPointersLen = input.changedPointers.length;\n  \t    var isFirst = (eventType & INPUT_START && (pointersLen - changedPointersLen === 0));\n  \t    var isFinal = (eventType & (INPUT_END | INPUT_CANCEL) && (pointersLen - changedPointersLen === 0));\n\n  \t    input.isFirst = !!isFirst;\n  \t    input.isFinal = !!isFinal;\n\n  \t    if (isFirst) {\n  \t        manager.session = {};\n  \t    }\n\n  \t    // source event is the normalized value of the domEvents\n  \t    // like 'touchstart, mouseup, pointerdown'\n  \t    input.eventType = eventType;\n\n  \t    // compute scale, rotation etc\n  \t    computeInputData(manager, input);\n\n  \t    // emit secret event\n  \t    manager.emit('hammer.input', input);\n\n  \t    manager.recognize(input);\n  \t    manager.session.prevInput = input;\n  \t}\n\n  \t/**\n  \t * extend the data with some usable properties like scale, rotate, velocity etc\n  \t * @param {Object} manager\n  \t * @param {Object} input\n  \t */\n  \tfunction computeInputData(manager, input) {\n  \t    var session = manager.session;\n  \t    var pointers = input.pointers;\n  \t    var pointersLength = pointers.length;\n\n  \t    // store the first input to calculate the distance and direction\n  \t    if (!session.firstInput) {\n  \t        session.firstInput = simpleCloneInputData(input);\n  \t    }\n\n  \t    // to compute scale and rotation we need to store the multiple touches\n  \t    if (pointersLength > 1 && !session.firstMultiple) {\n  \t        session.firstMultiple = simpleCloneInputData(input);\n  \t    } else if (pointersLength === 1) {\n  \t        session.firstMultiple = false;\n  \t    }\n\n  \t    var firstInput = session.firstInput;\n  \t    var firstMultiple = session.firstMultiple;\n  \t    var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;\n\n  \t    var center = input.center = getCenter(pointers);\n  \t    input.timeStamp = now();\n  \t    input.deltaTime = input.timeStamp - firstInput.timeStamp;\n\n  \t    input.angle = getAngle(offsetCenter, center);\n  \t    input.distance = getDistance(offsetCenter, center);\n\n  \t    computeDeltaXY(session, input);\n  \t    input.offsetDirection = getDirection(input.deltaX, input.deltaY);\n\n  \t    var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY);\n  \t    input.overallVelocityX = overallVelocity.x;\n  \t    input.overallVelocityY = overallVelocity.y;\n  \t    input.overallVelocity = (abs(overallVelocity.x) > abs(overallVelocity.y)) ? overallVelocity.x : overallVelocity.y;\n\n  \t    input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;\n  \t    input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;\n\n  \t    input.maxPointers = !session.prevInput ? input.pointers.length : ((input.pointers.length >\n  \t        session.prevInput.maxPointers) ? input.pointers.length : session.prevInput.maxPointers);\n\n  \t    computeIntervalInputData(session, input);\n\n  \t    // find the correct target\n  \t    var target = manager.element;\n  \t    if (hasParent(input.srcEvent.target, target)) {\n  \t        target = input.srcEvent.target;\n  \t    }\n  \t    input.target = target;\n  \t}\n\n  \tfunction computeDeltaXY(session, input) {\n  \t    var center = input.center;\n  \t    var offset = session.offsetDelta || {};\n  \t    var prevDelta = session.prevDelta || {};\n  \t    var prevInput = session.prevInput || {};\n\n  \t    if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {\n  \t        prevDelta = session.prevDelta = {\n  \t            x: prevInput.deltaX || 0,\n  \t            y: prevInput.deltaY || 0\n  \t        };\n\n  \t        offset = session.offsetDelta = {\n  \t            x: center.x,\n  \t            y: center.y\n  \t        };\n  \t    }\n\n  \t    input.deltaX = prevDelta.x + (center.x - offset.x);\n  \t    input.deltaY = prevDelta.y + (center.y - offset.y);\n  \t}\n\n  \t/**\n  \t * velocity is calculated every x ms\n  \t * @param {Object} session\n  \t * @param {Object} input\n  \t */\n  \tfunction computeIntervalInputData(session, input) {\n  \t    var last = session.lastInterval || input,\n  \t        deltaTime = input.timeStamp - last.timeStamp,\n  \t        velocity, velocityX, velocityY, direction;\n\n  \t    if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined$1)) {\n  \t        var deltaX = input.deltaX - last.deltaX;\n  \t        var deltaY = input.deltaY - last.deltaY;\n\n  \t        var v = getVelocity(deltaTime, deltaX, deltaY);\n  \t        velocityX = v.x;\n  \t        velocityY = v.y;\n  \t        velocity = (abs(v.x) > abs(v.y)) ? v.x : v.y;\n  \t        direction = getDirection(deltaX, deltaY);\n\n  \t        session.lastInterval = input;\n  \t    } else {\n  \t        // use latest velocity info if it doesn't overtake a minimum period\n  \t        velocity = last.velocity;\n  \t        velocityX = last.velocityX;\n  \t        velocityY = last.velocityY;\n  \t        direction = last.direction;\n  \t    }\n\n  \t    input.velocity = velocity;\n  \t    input.velocityX = velocityX;\n  \t    input.velocityY = velocityY;\n  \t    input.direction = direction;\n  \t}\n\n  \t/**\n  \t * create a simple clone from the input used for storage of firstInput and firstMultiple\n  \t * @param {Object} input\n  \t * @returns {Object} clonedInputData\n  \t */\n  \tfunction simpleCloneInputData(input) {\n  \t    // make a simple copy of the pointers because we will get a reference if we don't\n  \t    // we only need clientXY for the calculations\n  \t    var pointers = [];\n  \t    var i = 0;\n  \t    while (i < input.pointers.length) {\n  \t        pointers[i] = {\n  \t            clientX: round(input.pointers[i].clientX),\n  \t            clientY: round(input.pointers[i].clientY)\n  \t        };\n  \t        i++;\n  \t    }\n\n  \t    return {\n  \t        timeStamp: now(),\n  \t        pointers: pointers,\n  \t        center: getCenter(pointers),\n  \t        deltaX: input.deltaX,\n  \t        deltaY: input.deltaY\n  \t    };\n  \t}\n\n  \t/**\n  \t * get the center of all the pointers\n  \t * @param {Array} pointers\n  \t * @return {Object} center contains `x` and `y` properties\n  \t */\n  \tfunction getCenter(pointers) {\n  \t    var pointersLength = pointers.length;\n\n  \t    // no need to loop when only one touch\n  \t    if (pointersLength === 1) {\n  \t        return {\n  \t            x: round(pointers[0].clientX),\n  \t            y: round(pointers[0].clientY)\n  \t        };\n  \t    }\n\n  \t    var x = 0, y = 0, i = 0;\n  \t    while (i < pointersLength) {\n  \t        x += pointers[i].clientX;\n  \t        y += pointers[i].clientY;\n  \t        i++;\n  \t    }\n\n  \t    return {\n  \t        x: round(x / pointersLength),\n  \t        y: round(y / pointersLength)\n  \t    };\n  \t}\n\n  \t/**\n  \t * calculate the velocity between two points. unit is in px per ms.\n  \t * @param {Number} deltaTime\n  \t * @param {Number} x\n  \t * @param {Number} y\n  \t * @return {Object} velocity `x` and `y`\n  \t */\n  \tfunction getVelocity(deltaTime, x, y) {\n  \t    return {\n  \t        x: x / deltaTime || 0,\n  \t        y: y / deltaTime || 0\n  \t    };\n  \t}\n\n  \t/**\n  \t * get the direction between two points\n  \t * @param {Number} x\n  \t * @param {Number} y\n  \t * @return {Number} direction\n  \t */\n  \tfunction getDirection(x, y) {\n  \t    if (x === y) {\n  \t        return DIRECTION_NONE;\n  \t    }\n\n  \t    if (abs(x) >= abs(y)) {\n  \t        return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n  \t    }\n  \t    return y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n  \t}\n\n  \t/**\n  \t * calculate the absolute distance between two points\n  \t * @param {Object} p1 {x, y}\n  \t * @param {Object} p2 {x, y}\n  \t * @param {Array} [props] containing x and y keys\n  \t * @return {Number} distance\n  \t */\n  \tfunction getDistance(p1, p2, props) {\n  \t    if (!props) {\n  \t        props = PROPS_XY;\n  \t    }\n  \t    var x = p2[props[0]] - p1[props[0]],\n  \t        y = p2[props[1]] - p1[props[1]];\n\n  \t    return Math.sqrt((x * x) + (y * y));\n  \t}\n\n  \t/**\n  \t * calculate the angle between two coordinates\n  \t * @param {Object} p1\n  \t * @param {Object} p2\n  \t * @param {Array} [props] containing x and y keys\n  \t * @return {Number} angle\n  \t */\n  \tfunction getAngle(p1, p2, props) {\n  \t    if (!props) {\n  \t        props = PROPS_XY;\n  \t    }\n  \t    var x = p2[props[0]] - p1[props[0]],\n  \t        y = p2[props[1]] - p1[props[1]];\n  \t    return Math.atan2(y, x) * 180 / Math.PI;\n  \t}\n\n  \t/**\n  \t * calculate the rotation degrees between two pointersets\n  \t * @param {Array} start array of pointers\n  \t * @param {Array} end array of pointers\n  \t * @return {Number} rotation\n  \t */\n  \tfunction getRotation(start, end) {\n  \t    return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY);\n  \t}\n\n  \t/**\n  \t * calculate the scale factor between two pointersets\n  \t * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out\n  \t * @param {Array} start array of pointers\n  \t * @param {Array} end array of pointers\n  \t * @return {Number} scale\n  \t */\n  \tfunction getScale(start, end) {\n  \t    return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY);\n  \t}\n\n  \tvar MOUSE_INPUT_MAP = {\n  \t    mousedown: INPUT_START,\n  \t    mousemove: INPUT_MOVE,\n  \t    mouseup: INPUT_END\n  \t};\n\n  \tvar MOUSE_ELEMENT_EVENTS = 'mousedown';\n  \tvar MOUSE_WINDOW_EVENTS = 'mousemove mouseup';\n\n  \t/**\n  \t * Mouse events input\n  \t * @constructor\n  \t * @extends Input\n  \t */\n  \tfunction MouseInput() {\n  \t    this.evEl = MOUSE_ELEMENT_EVENTS;\n  \t    this.evWin = MOUSE_WINDOW_EVENTS;\n\n  \t    this.pressed = false; // mousedown state\n\n  \t    Input.apply(this, arguments);\n  \t}\n\n  \tinherit(MouseInput, Input, {\n  \t    /**\n  \t     * handle mouse events\n  \t     * @param {Object} ev\n  \t     */\n  \t    handler: function MEhandler(ev) {\n  \t        var eventType = MOUSE_INPUT_MAP[ev.type];\n\n  \t        // on start we want to have the left mouse button down\n  \t        if (eventType & INPUT_START && ev.button === 0) {\n  \t            this.pressed = true;\n  \t        }\n\n  \t        if (eventType & INPUT_MOVE && ev.which !== 1) {\n  \t            eventType = INPUT_END;\n  \t        }\n\n  \t        // mouse must be down\n  \t        if (!this.pressed) {\n  \t            return;\n  \t        }\n\n  \t        if (eventType & INPUT_END) {\n  \t            this.pressed = false;\n  \t        }\n\n  \t        this.callback(this.manager, eventType, {\n  \t            pointers: [ev],\n  \t            changedPointers: [ev],\n  \t            pointerType: INPUT_TYPE_MOUSE,\n  \t            srcEvent: ev\n  \t        });\n  \t    }\n  \t});\n\n  \tvar POINTER_INPUT_MAP = {\n  \t    pointerdown: INPUT_START,\n  \t    pointermove: INPUT_MOVE,\n  \t    pointerup: INPUT_END,\n  \t    pointercancel: INPUT_CANCEL,\n  \t    pointerout: INPUT_CANCEL\n  \t};\n\n  \t// in IE10 the pointer types is defined as an enum\n  \tvar IE10_POINTER_TYPE_ENUM = {\n  \t    2: INPUT_TYPE_TOUCH,\n  \t    3: INPUT_TYPE_PEN,\n  \t    4: INPUT_TYPE_MOUSE,\n  \t    5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816\n  \t};\n\n  \tvar POINTER_ELEMENT_EVENTS = 'pointerdown';\n  \tvar POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel';\n\n  \t// IE10 has prefixed support, and case-sensitive\n  \tif (window.MSPointerEvent && !window.PointerEvent) {\n  \t    POINTER_ELEMENT_EVENTS = 'MSPointerDown';\n  \t    POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel';\n  \t}\n\n  \t/**\n  \t * Pointer events input\n  \t * @constructor\n  \t * @extends Input\n  \t */\n  \tfunction PointerEventInput() {\n  \t    this.evEl = POINTER_ELEMENT_EVENTS;\n  \t    this.evWin = POINTER_WINDOW_EVENTS;\n\n  \t    Input.apply(this, arguments);\n\n  \t    this.store = (this.manager.session.pointerEvents = []);\n  \t}\n\n  \tinherit(PointerEventInput, Input, {\n  \t    /**\n  \t     * handle mouse events\n  \t     * @param {Object} ev\n  \t     */\n  \t    handler: function PEhandler(ev) {\n  \t        var store = this.store;\n  \t        var removePointer = false;\n\n  \t        var eventTypeNormalized = ev.type.toLowerCase().replace('ms', '');\n  \t        var eventType = POINTER_INPUT_MAP[eventTypeNormalized];\n  \t        var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;\n\n  \t        var isTouch = (pointerType == INPUT_TYPE_TOUCH);\n\n  \t        // get index of the event in the store\n  \t        var storeIndex = inArray(store, ev.pointerId, 'pointerId');\n\n  \t        // start and mouse must be down\n  \t        if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {\n  \t            if (storeIndex < 0) {\n  \t                store.push(ev);\n  \t                storeIndex = store.length - 1;\n  \t            }\n  \t        } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n  \t            removePointer = true;\n  \t        }\n\n  \t        // it not found, so the pointer hasn't been down (so it's probably a hover)\n  \t        if (storeIndex < 0) {\n  \t            return;\n  \t        }\n\n  \t        // update the event in the store\n  \t        store[storeIndex] = ev;\n\n  \t        this.callback(this.manager, eventType, {\n  \t            pointers: store,\n  \t            changedPointers: [ev],\n  \t            pointerType: pointerType,\n  \t            srcEvent: ev\n  \t        });\n\n  \t        if (removePointer) {\n  \t            // remove from the store\n  \t            store.splice(storeIndex, 1);\n  \t        }\n  \t    }\n  \t});\n\n  \tvar SINGLE_TOUCH_INPUT_MAP = {\n  \t    touchstart: INPUT_START,\n  \t    touchmove: INPUT_MOVE,\n  \t    touchend: INPUT_END,\n  \t    touchcancel: INPUT_CANCEL\n  \t};\n\n  \tvar SINGLE_TOUCH_TARGET_EVENTS = 'touchstart';\n  \tvar SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n  \t/**\n  \t * Touch events input\n  \t * @constructor\n  \t * @extends Input\n  \t */\n  \tfunction SingleTouchInput() {\n  \t    this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;\n  \t    this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;\n  \t    this.started = false;\n\n  \t    Input.apply(this, arguments);\n  \t}\n\n  \tinherit(SingleTouchInput, Input, {\n  \t    handler: function TEhandler(ev) {\n  \t        var type = SINGLE_TOUCH_INPUT_MAP[ev.type];\n\n  \t        // should we handle the touch events?\n  \t        if (type === INPUT_START) {\n  \t            this.started = true;\n  \t        }\n\n  \t        if (!this.started) {\n  \t            return;\n  \t        }\n\n  \t        var touches = normalizeSingleTouches.call(this, ev, type);\n\n  \t        // when done, reset the started state\n  \t        if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) {\n  \t            this.started = false;\n  \t        }\n\n  \t        this.callback(this.manager, type, {\n  \t            pointers: touches[0],\n  \t            changedPointers: touches[1],\n  \t            pointerType: INPUT_TYPE_TOUCH,\n  \t            srcEvent: ev\n  \t        });\n  \t    }\n  \t});\n\n  \t/**\n  \t * @this {TouchInput}\n  \t * @param {Object} ev\n  \t * @param {Number} type flag\n  \t * @returns {undefined|Array} [all, changed]\n  \t */\n  \tfunction normalizeSingleTouches(ev, type) {\n  \t    var all = toArray(ev.touches);\n  \t    var changed = toArray(ev.changedTouches);\n\n  \t    if (type & (INPUT_END | INPUT_CANCEL)) {\n  \t        all = uniqueArray(all.concat(changed), 'identifier', true);\n  \t    }\n\n  \t    return [all, changed];\n  \t}\n\n  \tvar TOUCH_INPUT_MAP = {\n  \t    touchstart: INPUT_START,\n  \t    touchmove: INPUT_MOVE,\n  \t    touchend: INPUT_END,\n  \t    touchcancel: INPUT_CANCEL\n  \t};\n\n  \tvar TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n  \t/**\n  \t * Multi-user touch events input\n  \t * @constructor\n  \t * @extends Input\n  \t */\n  \tfunction TouchInput() {\n  \t    this.evTarget = TOUCH_TARGET_EVENTS;\n  \t    this.targetIds = {};\n\n  \t    Input.apply(this, arguments);\n  \t}\n\n  \tinherit(TouchInput, Input, {\n  \t    handler: function MTEhandler(ev) {\n  \t        var type = TOUCH_INPUT_MAP[ev.type];\n  \t        var touches = getTouches.call(this, ev, type);\n  \t        if (!touches) {\n  \t            return;\n  \t        }\n\n  \t        this.callback(this.manager, type, {\n  \t            pointers: touches[0],\n  \t            changedPointers: touches[1],\n  \t            pointerType: INPUT_TYPE_TOUCH,\n  \t            srcEvent: ev\n  \t        });\n  \t    }\n  \t});\n\n  \t/**\n  \t * @this {TouchInput}\n  \t * @param {Object} ev\n  \t * @param {Number} type flag\n  \t * @returns {undefined|Array} [all, changed]\n  \t */\n  \tfunction getTouches(ev, type) {\n  \t    var allTouches = toArray(ev.touches);\n  \t    var targetIds = this.targetIds;\n\n  \t    // when there is only one touch, the process can be simplified\n  \t    if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {\n  \t        targetIds[allTouches[0].identifier] = true;\n  \t        return [allTouches, allTouches];\n  \t    }\n\n  \t    var i,\n  \t        targetTouches,\n  \t        changedTouches = toArray(ev.changedTouches),\n  \t        changedTargetTouches = [],\n  \t        target = this.target;\n\n  \t    // get target touches from touches\n  \t    targetTouches = allTouches.filter(function(touch) {\n  \t        return hasParent(touch.target, target);\n  \t    });\n\n  \t    // collect touches\n  \t    if (type === INPUT_START) {\n  \t        i = 0;\n  \t        while (i < targetTouches.length) {\n  \t            targetIds[targetTouches[i].identifier] = true;\n  \t            i++;\n  \t        }\n  \t    }\n\n  \t    // filter changed touches to only contain touches that exist in the collected target ids\n  \t    i = 0;\n  \t    while (i < changedTouches.length) {\n  \t        if (targetIds[changedTouches[i].identifier]) {\n  \t            changedTargetTouches.push(changedTouches[i]);\n  \t        }\n\n  \t        // cleanup removed touches\n  \t        if (type & (INPUT_END | INPUT_CANCEL)) {\n  \t            delete targetIds[changedTouches[i].identifier];\n  \t        }\n  \t        i++;\n  \t    }\n\n  \t    if (!changedTargetTouches.length) {\n  \t        return;\n  \t    }\n\n  \t    return [\n  \t        // merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel'\n  \t        uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true),\n  \t        changedTargetTouches\n  \t    ];\n  \t}\n\n  \t/**\n  \t * Combined touch and mouse input\n  \t *\n  \t * Touch has a higher priority then mouse, and while touching no mouse events are allowed.\n  \t * This because touch devices also emit mouse events while doing a touch.\n  \t *\n  \t * @constructor\n  \t * @extends Input\n  \t */\n\n  \tvar DEDUP_TIMEOUT = 2500;\n  \tvar DEDUP_DISTANCE = 25;\n\n  \tfunction TouchMouseInput() {\n  \t    Input.apply(this, arguments);\n\n  \t    var handler = bindFn(this.handler, this);\n  \t    this.touch = new TouchInput(this.manager, handler);\n  \t    this.mouse = new MouseInput(this.manager, handler);\n\n  \t    this.primaryTouch = null;\n  \t    this.lastTouches = [];\n  \t}\n\n  \tinherit(TouchMouseInput, Input, {\n  \t    /**\n  \t     * handle mouse and touch events\n  \t     * @param {Hammer} manager\n  \t     * @param {String} inputEvent\n  \t     * @param {Object} inputData\n  \t     */\n  \t    handler: function TMEhandler(manager, inputEvent, inputData) {\n  \t        var isTouch = (inputData.pointerType == INPUT_TYPE_TOUCH),\n  \t            isMouse = (inputData.pointerType == INPUT_TYPE_MOUSE);\n\n  \t        if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) {\n  \t            return;\n  \t        }\n\n  \t        // when we're in a touch event, record touches to  de-dupe synthetic mouse event\n  \t        if (isTouch) {\n  \t            recordTouches.call(this, inputEvent, inputData);\n  \t        } else if (isMouse && isSyntheticEvent.call(this, inputData)) {\n  \t            return;\n  \t        }\n\n  \t        this.callback(manager, inputEvent, inputData);\n  \t    },\n\n  \t    /**\n  \t     * remove the event listeners\n  \t     */\n  \t    destroy: function destroy() {\n  \t        this.touch.destroy();\n  \t        this.mouse.destroy();\n  \t    }\n  \t});\n\n  \tfunction recordTouches(eventType, eventData) {\n  \t    if (eventType & INPUT_START) {\n  \t        this.primaryTouch = eventData.changedPointers[0].identifier;\n  \t        setLastTouch.call(this, eventData);\n  \t    } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n  \t        setLastTouch.call(this, eventData);\n  \t    }\n  \t}\n\n  \tfunction setLastTouch(eventData) {\n  \t    var touch = eventData.changedPointers[0];\n\n  \t    if (touch.identifier === this.primaryTouch) {\n  \t        var lastTouch = {x: touch.clientX, y: touch.clientY};\n  \t        this.lastTouches.push(lastTouch);\n  \t        var lts = this.lastTouches;\n  \t        var removeLastTouch = function() {\n  \t            var i = lts.indexOf(lastTouch);\n  \t            if (i > -1) {\n  \t                lts.splice(i, 1);\n  \t            }\n  \t        };\n  \t        setTimeout(removeLastTouch, DEDUP_TIMEOUT);\n  \t    }\n  \t}\n\n  \tfunction isSyntheticEvent(eventData) {\n  \t    var x = eventData.srcEvent.clientX, y = eventData.srcEvent.clientY;\n  \t    for (var i = 0; i < this.lastTouches.length; i++) {\n  \t        var t = this.lastTouches[i];\n  \t        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n  \t        if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) {\n  \t            return true;\n  \t        }\n  \t    }\n  \t    return false;\n  \t}\n\n  \tvar PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction');\n  \tvar NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined$1;\n\n  \t// magical touchAction value\n  \tvar TOUCH_ACTION_COMPUTE = 'compute';\n  \tvar TOUCH_ACTION_AUTO = 'auto';\n  \tvar TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented\n  \tvar TOUCH_ACTION_NONE = 'none';\n  \tvar TOUCH_ACTION_PAN_X = 'pan-x';\n  \tvar TOUCH_ACTION_PAN_Y = 'pan-y';\n  \tvar TOUCH_ACTION_MAP = getTouchActionProps();\n\n  \t/**\n  \t * Touch Action\n  \t * sets the touchAction property or uses the js alternative\n  \t * @param {Manager} manager\n  \t * @param {String} value\n  \t * @constructor\n  \t */\n  \tfunction TouchAction(manager, value) {\n  \t    this.manager = manager;\n  \t    this.set(value);\n  \t}\n\n  \tTouchAction.prototype = {\n  \t    /**\n  \t     * set the touchAction value on the element or enable the polyfill\n  \t     * @param {String} value\n  \t     */\n  \t    set: function(value) {\n  \t        // find out the touch-action by the event handlers\n  \t        if (value == TOUCH_ACTION_COMPUTE) {\n  \t            value = this.compute();\n  \t        }\n\n  \t        if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) {\n  \t            this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;\n  \t        }\n  \t        this.actions = value.toLowerCase().trim();\n  \t    },\n\n  \t    /**\n  \t     * just re-set the touchAction value\n  \t     */\n  \t    update: function() {\n  \t        this.set(this.manager.options.touchAction);\n  \t    },\n\n  \t    /**\n  \t     * compute the value for the touchAction property based on the recognizer's settings\n  \t     * @returns {String} value\n  \t     */\n  \t    compute: function() {\n  \t        var actions = [];\n  \t        each(this.manager.recognizers, function(recognizer) {\n  \t            if (boolOrFn(recognizer.options.enable, [recognizer])) {\n  \t                actions = actions.concat(recognizer.getTouchAction());\n  \t            }\n  \t        });\n  \t        return cleanTouchActions(actions.join(' '));\n  \t    },\n\n  \t    /**\n  \t     * this method is called on each input cycle and provides the preventing of the browser behavior\n  \t     * @param {Object} input\n  \t     */\n  \t    preventDefaults: function(input) {\n  \t        var srcEvent = input.srcEvent;\n  \t        var direction = input.offsetDirection;\n\n  \t        // if the touch action did prevented once this session\n  \t        if (this.manager.session.prevented) {\n  \t            srcEvent.preventDefault();\n  \t            return;\n  \t        }\n\n  \t        var actions = this.actions;\n  \t        var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE];\n  \t        var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y];\n  \t        var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];\n\n  \t        if (hasNone) {\n  \t            //do not prevent defaults if this is a tap gesture\n\n  \t            var isTapPointer = input.pointers.length === 1;\n  \t            var isTapMovement = input.distance < 2;\n  \t            var isTapTouchTime = input.deltaTime < 250;\n\n  \t            if (isTapPointer && isTapMovement && isTapTouchTime) {\n  \t                return;\n  \t            }\n  \t        }\n\n  \t        if (hasPanX && hasPanY) {\n  \t            // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent\n  \t            return;\n  \t        }\n\n  \t        if (hasNone ||\n  \t            (hasPanY && direction & DIRECTION_HORIZONTAL) ||\n  \t            (hasPanX && direction & DIRECTION_VERTICAL)) {\n  \t            return this.preventSrc(srcEvent);\n  \t        }\n  \t    },\n\n  \t    /**\n  \t     * call preventDefault to prevent the browser's default behavior (scrolling in most cases)\n  \t     * @param {Object} srcEvent\n  \t     */\n  \t    preventSrc: function(srcEvent) {\n  \t        this.manager.session.prevented = true;\n  \t        srcEvent.preventDefault();\n  \t    }\n  \t};\n\n  \t/**\n  \t * when the touchActions are collected they are not a valid value, so we need to clean things up. *\n  \t * @param {String} actions\n  \t * @returns {*}\n  \t */\n  \tfunction cleanTouchActions(actions) {\n  \t    // none\n  \t    if (inStr(actions, TOUCH_ACTION_NONE)) {\n  \t        return TOUCH_ACTION_NONE;\n  \t    }\n\n  \t    var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);\n  \t    var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y);\n\n  \t    // if both pan-x and pan-y are set (different recognizers\n  \t    // for different directions, e.g. horizontal pan but vertical swipe?)\n  \t    // we need none (as otherwise with pan-x pan-y combined none of these\n  \t    // recognizers will work, since the browser would handle all panning\n  \t    if (hasPanX && hasPanY) {\n  \t        return TOUCH_ACTION_NONE;\n  \t    }\n\n  \t    // pan-x OR pan-y\n  \t    if (hasPanX || hasPanY) {\n  \t        return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;\n  \t    }\n\n  \t    // manipulation\n  \t    if (inStr(actions, TOUCH_ACTION_MANIPULATION)) {\n  \t        return TOUCH_ACTION_MANIPULATION;\n  \t    }\n\n  \t    return TOUCH_ACTION_AUTO;\n  \t}\n\n  \tfunction getTouchActionProps() {\n  \t    if (!NATIVE_TOUCH_ACTION) {\n  \t        return false;\n  \t    }\n  \t    var touchMap = {};\n  \t    var cssSupports = window.CSS && window.CSS.supports;\n  \t    ['auto', 'manipulation', 'pan-y', 'pan-x', 'pan-x pan-y', 'none'].forEach(function(val) {\n\n  \t        // If css.supports is not supported but there is native touch-action assume it supports\n  \t        // all values. This is the case for IE 10 and 11.\n  \t        touchMap[val] = cssSupports ? window.CSS.supports('touch-action', val) : true;\n  \t    });\n  \t    return touchMap;\n  \t}\n\n  \t/**\n  \t * Recognizer flow explained; *\n  \t * All recognizers have the initial state of POSSIBLE when a input session starts.\n  \t * The definition of a input session is from the first input until the last input, with all it's movement in it. *\n  \t * Example session for mouse-input: mousedown -> mousemove -> mouseup\n  \t *\n  \t * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed\n  \t * which determines with state it should be.\n  \t *\n  \t * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to\n  \t * POSSIBLE to give it another change on the next cycle.\n  \t *\n  \t *               Possible\n  \t *                  |\n  \t *            +-----+---------------+\n  \t *            |                     |\n  \t *      +-----+-----+               |\n  \t *      |           |               |\n  \t *   Failed      Cancelled          |\n  \t *                          +-------+------+\n  \t *                          |              |\n  \t *                      Recognized       Began\n  \t *                                         |\n  \t *                                      Changed\n  \t *                                         |\n  \t *                                  Ended/Recognized\n  \t */\n  \tvar STATE_POSSIBLE = 1;\n  \tvar STATE_BEGAN = 2;\n  \tvar STATE_CHANGED = 4;\n  \tvar STATE_ENDED = 8;\n  \tvar STATE_RECOGNIZED = STATE_ENDED;\n  \tvar STATE_CANCELLED = 16;\n  \tvar STATE_FAILED = 32;\n\n  \t/**\n  \t * Recognizer\n  \t * Every recognizer needs to extend from this class.\n  \t * @constructor\n  \t * @param {Object} options\n  \t */\n  \tfunction Recognizer(options) {\n  \t    this.options = assign({}, this.defaults, options || {});\n\n  \t    this.id = uniqueId();\n\n  \t    this.manager = null;\n\n  \t    // default is enable true\n  \t    this.options.enable = ifUndefined(this.options.enable, true);\n\n  \t    this.state = STATE_POSSIBLE;\n\n  \t    this.simultaneous = {};\n  \t    this.requireFail = [];\n  \t}\n\n  \tRecognizer.prototype = {\n  \t    /**\n  \t     * @virtual\n  \t     * @type {Object}\n  \t     */\n  \t    defaults: {},\n\n  \t    /**\n  \t     * set options\n  \t     * @param {Object} options\n  \t     * @return {Recognizer}\n  \t     */\n  \t    set: function(options) {\n  \t        assign(this.options, options);\n\n  \t        // also update the touchAction, in case something changed about the directions/enabled state\n  \t        this.manager && this.manager.touchAction.update();\n  \t        return this;\n  \t    },\n\n  \t    /**\n  \t     * recognize simultaneous with an other recognizer.\n  \t     * @param {Recognizer} otherRecognizer\n  \t     * @returns {Recognizer} this\n  \t     */\n  \t    recognizeWith: function(otherRecognizer) {\n  \t        if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) {\n  \t            return this;\n  \t        }\n\n  \t        var simultaneous = this.simultaneous;\n  \t        otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n  \t        if (!simultaneous[otherRecognizer.id]) {\n  \t            simultaneous[otherRecognizer.id] = otherRecognizer;\n  \t            otherRecognizer.recognizeWith(this);\n  \t        }\n  \t        return this;\n  \t    },\n\n  \t    /**\n  \t     * drop the simultaneous link. it doesnt remove the link on the other recognizer.\n  \t     * @param {Recognizer} otherRecognizer\n  \t     * @returns {Recognizer} this\n  \t     */\n  \t    dropRecognizeWith: function(otherRecognizer) {\n  \t        if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) {\n  \t            return this;\n  \t        }\n\n  \t        otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n  \t        delete this.simultaneous[otherRecognizer.id];\n  \t        return this;\n  \t    },\n\n  \t    /**\n  \t     * recognizer can only run when an other is failing\n  \t     * @param {Recognizer} otherRecognizer\n  \t     * @returns {Recognizer} this\n  \t     */\n  \t    requireFailure: function(otherRecognizer) {\n  \t        if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) {\n  \t            return this;\n  \t        }\n\n  \t        var requireFail = this.requireFail;\n  \t        otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n  \t        if (inArray(requireFail, otherRecognizer) === -1) {\n  \t            requireFail.push(otherRecognizer);\n  \t            otherRecognizer.requireFailure(this);\n  \t        }\n  \t        return this;\n  \t    },\n\n  \t    /**\n  \t     * drop the requireFailure link. it does not remove the link on the other recognizer.\n  \t     * @param {Recognizer} otherRecognizer\n  \t     * @returns {Recognizer} this\n  \t     */\n  \t    dropRequireFailure: function(otherRecognizer) {\n  \t        if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) {\n  \t            return this;\n  \t        }\n\n  \t        otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n  \t        var index = inArray(this.requireFail, otherRecognizer);\n  \t        if (index > -1) {\n  \t            this.requireFail.splice(index, 1);\n  \t        }\n  \t        return this;\n  \t    },\n\n  \t    /**\n  \t     * has require failures boolean\n  \t     * @returns {boolean}\n  \t     */\n  \t    hasRequireFailures: function() {\n  \t        return this.requireFail.length > 0;\n  \t    },\n\n  \t    /**\n  \t     * if the recognizer can recognize simultaneous with an other recognizer\n  \t     * @param {Recognizer} otherRecognizer\n  \t     * @returns {Boolean}\n  \t     */\n  \t    canRecognizeWith: function(otherRecognizer) {\n  \t        return !!this.simultaneous[otherRecognizer.id];\n  \t    },\n\n  \t    /**\n  \t     * You should use `tryEmit` instead of `emit` directly to check\n  \t     * that all the needed recognizers has failed before emitting.\n  \t     * @param {Object} input\n  \t     */\n  \t    emit: function(input) {\n  \t        var self = this;\n  \t        var state = this.state;\n\n  \t        function emit(event) {\n  \t            self.manager.emit(event, input);\n  \t        }\n\n  \t        // 'panstart' and 'panmove'\n  \t        if (state < STATE_ENDED) {\n  \t            emit(self.options.event + stateStr(state));\n  \t        }\n\n  \t        emit(self.options.event); // simple 'eventName' events\n\n  \t        if (input.additionalEvent) { // additional event(panleft, panright, pinchin, pinchout...)\n  \t            emit(input.additionalEvent);\n  \t        }\n\n  \t        // panend and pancancel\n  \t        if (state >= STATE_ENDED) {\n  \t            emit(self.options.event + stateStr(state));\n  \t        }\n  \t    },\n\n  \t    /**\n  \t     * Check that all the require failure recognizers has failed,\n  \t     * if true, it emits a gesture event,\n  \t     * otherwise, setup the state to FAILED.\n  \t     * @param {Object} input\n  \t     */\n  \t    tryEmit: function(input) {\n  \t        if (this.canEmit()) {\n  \t            return this.emit(input);\n  \t        }\n  \t        // it's failing anyway\n  \t        this.state = STATE_FAILED;\n  \t    },\n\n  \t    /**\n  \t     * can we emit?\n  \t     * @returns {boolean}\n  \t     */\n  \t    canEmit: function() {\n  \t        var i = 0;\n  \t        while (i < this.requireFail.length) {\n  \t            if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) {\n  \t                return false;\n  \t            }\n  \t            i++;\n  \t        }\n  \t        return true;\n  \t    },\n\n  \t    /**\n  \t     * update the recognizer\n  \t     * @param {Object} inputData\n  \t     */\n  \t    recognize: function(inputData) {\n  \t        // make a new copy of the inputData\n  \t        // so we can change the inputData without messing up the other recognizers\n  \t        var inputDataClone = assign({}, inputData);\n\n  \t        // is is enabled and allow recognizing?\n  \t        if (!boolOrFn(this.options.enable, [this, inputDataClone])) {\n  \t            this.reset();\n  \t            this.state = STATE_FAILED;\n  \t            return;\n  \t        }\n\n  \t        // reset when we've reached the end\n  \t        if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) {\n  \t            this.state = STATE_POSSIBLE;\n  \t        }\n\n  \t        this.state = this.process(inputDataClone);\n\n  \t        // the recognizer has recognized a gesture\n  \t        // so trigger an event\n  \t        if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) {\n  \t            this.tryEmit(inputDataClone);\n  \t        }\n  \t    },\n\n  \t    /**\n  \t     * return the state of the recognizer\n  \t     * the actual recognizing happens in this method\n  \t     * @virtual\n  \t     * @param {Object} inputData\n  \t     * @returns {Const} STATE\n  \t     */\n  \t    process: function(inputData) { }, // jshint ignore:line\n\n  \t    /**\n  \t     * return the preferred touch-action\n  \t     * @virtual\n  \t     * @returns {Array}\n  \t     */\n  \t    getTouchAction: function() { },\n\n  \t    /**\n  \t     * called when the gesture isn't allowed to recognize\n  \t     * like when another is being recognized or it is disabled\n  \t     * @virtual\n  \t     */\n  \t    reset: function() { }\n  \t};\n\n  \t/**\n  \t * get a usable string, used as event postfix\n  \t * @param {Const} state\n  \t * @returns {String} state\n  \t */\n  \tfunction stateStr(state) {\n  \t    if (state & STATE_CANCELLED) {\n  \t        return 'cancel';\n  \t    } else if (state & STATE_ENDED) {\n  \t        return 'end';\n  \t    } else if (state & STATE_CHANGED) {\n  \t        return 'move';\n  \t    } else if (state & STATE_BEGAN) {\n  \t        return 'start';\n  \t    }\n  \t    return '';\n  \t}\n\n  \t/**\n  \t * direction cons to string\n  \t * @param {Const} direction\n  \t * @returns {String}\n  \t */\n  \tfunction directionStr(direction) {\n  \t    if (direction == DIRECTION_DOWN) {\n  \t        return 'down';\n  \t    } else if (direction == DIRECTION_UP) {\n  \t        return 'up';\n  \t    } else if (direction == DIRECTION_LEFT) {\n  \t        return 'left';\n  \t    } else if (direction == DIRECTION_RIGHT) {\n  \t        return 'right';\n  \t    }\n  \t    return '';\n  \t}\n\n  \t/**\n  \t * get a recognizer by name if it is bound to a manager\n  \t * @param {Recognizer|String} otherRecognizer\n  \t * @param {Recognizer} recognizer\n  \t * @returns {Recognizer}\n  \t */\n  \tfunction getRecognizerByNameIfManager(otherRecognizer, recognizer) {\n  \t    var manager = recognizer.manager;\n  \t    if (manager) {\n  \t        return manager.get(otherRecognizer);\n  \t    }\n  \t    return otherRecognizer;\n  \t}\n\n  \t/**\n  \t * This recognizer is just used as a base for the simple attribute recognizers.\n  \t * @constructor\n  \t * @extends Recognizer\n  \t */\n  \tfunction AttrRecognizer() {\n  \t    Recognizer.apply(this, arguments);\n  \t}\n\n  \tinherit(AttrRecognizer, Recognizer, {\n  \t    /**\n  \t     * @namespace\n  \t     * @memberof AttrRecognizer\n  \t     */\n  \t    defaults: {\n  \t        /**\n  \t         * @type {Number}\n  \t         * @default 1\n  \t         */\n  \t        pointers: 1\n  \t    },\n\n  \t    /**\n  \t     * Used to check if it the recognizer receives valid input, like input.distance > 10.\n  \t     * @memberof AttrRecognizer\n  \t     * @param {Object} input\n  \t     * @returns {Boolean} recognized\n  \t     */\n  \t    attrTest: function(input) {\n  \t        var optionPointers = this.options.pointers;\n  \t        return optionPointers === 0 || input.pointers.length === optionPointers;\n  \t    },\n\n  \t    /**\n  \t     * Process the input and return the state for the recognizer\n  \t     * @memberof AttrRecognizer\n  \t     * @param {Object} input\n  \t     * @returns {*} State\n  \t     */\n  \t    process: function(input) {\n  \t        var state = this.state;\n  \t        var eventType = input.eventType;\n\n  \t        var isRecognized = state & (STATE_BEGAN | STATE_CHANGED);\n  \t        var isValid = this.attrTest(input);\n\n  \t        // on cancel input and we've recognized before, return STATE_CANCELLED\n  \t        if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) {\n  \t            return state | STATE_CANCELLED;\n  \t        } else if (isRecognized || isValid) {\n  \t            if (eventType & INPUT_END) {\n  \t                return state | STATE_ENDED;\n  \t            } else if (!(state & STATE_BEGAN)) {\n  \t                return STATE_BEGAN;\n  \t            }\n  \t            return state | STATE_CHANGED;\n  \t        }\n  \t        return STATE_FAILED;\n  \t    }\n  \t});\n\n  \t/**\n  \t * Pan\n  \t * Recognized when the pointer is down and moved in the allowed direction.\n  \t * @constructor\n  \t * @extends AttrRecognizer\n  \t */\n  \tfunction PanRecognizer() {\n  \t    AttrRecognizer.apply(this, arguments);\n\n  \t    this.pX = null;\n  \t    this.pY = null;\n  \t}\n\n  \tinherit(PanRecognizer, AttrRecognizer, {\n  \t    /**\n  \t     * @namespace\n  \t     * @memberof PanRecognizer\n  \t     */\n  \t    defaults: {\n  \t        event: 'pan',\n  \t        threshold: 10,\n  \t        pointers: 1,\n  \t        direction: DIRECTION_ALL\n  \t    },\n\n  \t    getTouchAction: function() {\n  \t        var direction = this.options.direction;\n  \t        var actions = [];\n  \t        if (direction & DIRECTION_HORIZONTAL) {\n  \t            actions.push(TOUCH_ACTION_PAN_Y);\n  \t        }\n  \t        if (direction & DIRECTION_VERTICAL) {\n  \t            actions.push(TOUCH_ACTION_PAN_X);\n  \t        }\n  \t        return actions;\n  \t    },\n\n  \t    directionTest: function(input) {\n  \t        var options = this.options;\n  \t        var hasMoved = true;\n  \t        var distance = input.distance;\n  \t        var direction = input.direction;\n  \t        var x = input.deltaX;\n  \t        var y = input.deltaY;\n\n  \t        // lock to axis?\n  \t        if (!(direction & options.direction)) {\n  \t            if (options.direction & DIRECTION_HORIZONTAL) {\n  \t                direction = (x === 0) ? DIRECTION_NONE : (x < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT;\n  \t                hasMoved = x != this.pX;\n  \t                distance = Math.abs(input.deltaX);\n  \t            } else {\n  \t                direction = (y === 0) ? DIRECTION_NONE : (y < 0) ? DIRECTION_UP : DIRECTION_DOWN;\n  \t                hasMoved = y != this.pY;\n  \t                distance = Math.abs(input.deltaY);\n  \t            }\n  \t        }\n  \t        input.direction = direction;\n  \t        return hasMoved && distance > options.threshold && direction & options.direction;\n  \t    },\n\n  \t    attrTest: function(input) {\n  \t        return AttrRecognizer.prototype.attrTest.call(this, input) &&\n  \t            (this.state & STATE_BEGAN || (!(this.state & STATE_BEGAN) && this.directionTest(input)));\n  \t    },\n\n  \t    emit: function(input) {\n\n  \t        this.pX = input.deltaX;\n  \t        this.pY = input.deltaY;\n\n  \t        var direction = directionStr(input.direction);\n\n  \t        if (direction) {\n  \t            input.additionalEvent = this.options.event + direction;\n  \t        }\n  \t        this._super.emit.call(this, input);\n  \t    }\n  \t});\n\n  \t/**\n  \t * Pinch\n  \t * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out).\n  \t * @constructor\n  \t * @extends AttrRecognizer\n  \t */\n  \tfunction PinchRecognizer() {\n  \t    AttrRecognizer.apply(this, arguments);\n  \t}\n\n  \tinherit(PinchRecognizer, AttrRecognizer, {\n  \t    /**\n  \t     * @namespace\n  \t     * @memberof PinchRecognizer\n  \t     */\n  \t    defaults: {\n  \t        event: 'pinch',\n  \t        threshold: 0,\n  \t        pointers: 2\n  \t    },\n\n  \t    getTouchAction: function() {\n  \t        return [TOUCH_ACTION_NONE];\n  \t    },\n\n  \t    attrTest: function(input) {\n  \t        return this._super.attrTest.call(this, input) &&\n  \t            (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN);\n  \t    },\n\n  \t    emit: function(input) {\n  \t        if (input.scale !== 1) {\n  \t            var inOut = input.scale < 1 ? 'in' : 'out';\n  \t            input.additionalEvent = this.options.event + inOut;\n  \t        }\n  \t        this._super.emit.call(this, input);\n  \t    }\n  \t});\n\n  \t/**\n  \t * Press\n  \t * Recognized when the pointer is down for x ms without any movement.\n  \t * @constructor\n  \t * @extends Recognizer\n  \t */\n  \tfunction PressRecognizer() {\n  \t    Recognizer.apply(this, arguments);\n\n  \t    this._timer = null;\n  \t    this._input = null;\n  \t}\n\n  \tinherit(PressRecognizer, Recognizer, {\n  \t    /**\n  \t     * @namespace\n  \t     * @memberof PressRecognizer\n  \t     */\n  \t    defaults: {\n  \t        event: 'press',\n  \t        pointers: 1,\n  \t        time: 251, // minimal time of the pointer to be pressed\n  \t        threshold: 9 // a minimal movement is ok, but keep it low\n  \t    },\n\n  \t    getTouchAction: function() {\n  \t        return [TOUCH_ACTION_AUTO];\n  \t    },\n\n  \t    process: function(input) {\n  \t        var options = this.options;\n  \t        var validPointers = input.pointers.length === options.pointers;\n  \t        var validMovement = input.distance < options.threshold;\n  \t        var validTime = input.deltaTime > options.time;\n\n  \t        this._input = input;\n\n  \t        // we only allow little movement\n  \t        // and we've reached an end event, so a tap is possible\n  \t        if (!validMovement || !validPointers || (input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime)) {\n  \t            this.reset();\n  \t        } else if (input.eventType & INPUT_START) {\n  \t            this.reset();\n  \t            this._timer = setTimeoutContext(function() {\n  \t                this.state = STATE_RECOGNIZED;\n  \t                this.tryEmit();\n  \t            }, options.time, this);\n  \t        } else if (input.eventType & INPUT_END) {\n  \t            return STATE_RECOGNIZED;\n  \t        }\n  \t        return STATE_FAILED;\n  \t    },\n\n  \t    reset: function() {\n  \t        clearTimeout(this._timer);\n  \t    },\n\n  \t    emit: function(input) {\n  \t        if (this.state !== STATE_RECOGNIZED) {\n  \t            return;\n  \t        }\n\n  \t        if (input && (input.eventType & INPUT_END)) {\n  \t            this.manager.emit(this.options.event + 'up', input);\n  \t        } else {\n  \t            this._input.timeStamp = now();\n  \t            this.manager.emit(this.options.event, this._input);\n  \t        }\n  \t    }\n  \t});\n\n  \t/**\n  \t * Rotate\n  \t * Recognized when two or more pointer are moving in a circular motion.\n  \t * @constructor\n  \t * @extends AttrRecognizer\n  \t */\n  \tfunction RotateRecognizer() {\n  \t    AttrRecognizer.apply(this, arguments);\n  \t}\n\n  \tinherit(RotateRecognizer, AttrRecognizer, {\n  \t    /**\n  \t     * @namespace\n  \t     * @memberof RotateRecognizer\n  \t     */\n  \t    defaults: {\n  \t        event: 'rotate',\n  \t        threshold: 0,\n  \t        pointers: 2\n  \t    },\n\n  \t    getTouchAction: function() {\n  \t        return [TOUCH_ACTION_NONE];\n  \t    },\n\n  \t    attrTest: function(input) {\n  \t        return this._super.attrTest.call(this, input) &&\n  \t            (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN);\n  \t    }\n  \t});\n\n  \t/**\n  \t * Swipe\n  \t * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction.\n  \t * @constructor\n  \t * @extends AttrRecognizer\n  \t */\n  \tfunction SwipeRecognizer() {\n  \t    AttrRecognizer.apply(this, arguments);\n  \t}\n\n  \tinherit(SwipeRecognizer, AttrRecognizer, {\n  \t    /**\n  \t     * @namespace\n  \t     * @memberof SwipeRecognizer\n  \t     */\n  \t    defaults: {\n  \t        event: 'swipe',\n  \t        threshold: 10,\n  \t        velocity: 0.3,\n  \t        direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL,\n  \t        pointers: 1\n  \t    },\n\n  \t    getTouchAction: function() {\n  \t        return PanRecognizer.prototype.getTouchAction.call(this);\n  \t    },\n\n  \t    attrTest: function(input) {\n  \t        var direction = this.options.direction;\n  \t        var velocity;\n\n  \t        if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) {\n  \t            velocity = input.overallVelocity;\n  \t        } else if (direction & DIRECTION_HORIZONTAL) {\n  \t            velocity = input.overallVelocityX;\n  \t        } else if (direction & DIRECTION_VERTICAL) {\n  \t            velocity = input.overallVelocityY;\n  \t        }\n\n  \t        return this._super.attrTest.call(this, input) &&\n  \t            direction & input.offsetDirection &&\n  \t            input.distance > this.options.threshold &&\n  \t            input.maxPointers == this.options.pointers &&\n  \t            abs(velocity) > this.options.velocity && input.eventType & INPUT_END;\n  \t    },\n\n  \t    emit: function(input) {\n  \t        var direction = directionStr(input.offsetDirection);\n  \t        if (direction) {\n  \t            this.manager.emit(this.options.event + direction, input);\n  \t        }\n\n  \t        this.manager.emit(this.options.event, input);\n  \t    }\n  \t});\n\n  \t/**\n  \t * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur\n  \t * between the given interval and position. The delay option can be used to recognize multi-taps without firing\n  \t * a single tap.\n  \t *\n  \t * The eventData from the emitted event contains the property `tapCount`, which contains the amount of\n  \t * multi-taps being recognized.\n  \t * @constructor\n  \t * @extends Recognizer\n  \t */\n  \tfunction TapRecognizer() {\n  \t    Recognizer.apply(this, arguments);\n\n  \t    // previous time and center,\n  \t    // used for tap counting\n  \t    this.pTime = false;\n  \t    this.pCenter = false;\n\n  \t    this._timer = null;\n  \t    this._input = null;\n  \t    this.count = 0;\n  \t}\n\n  \tinherit(TapRecognizer, Recognizer, {\n  \t    /**\n  \t     * @namespace\n  \t     * @memberof PinchRecognizer\n  \t     */\n  \t    defaults: {\n  \t        event: 'tap',\n  \t        pointers: 1,\n  \t        taps: 1,\n  \t        interval: 300, // max time between the multi-tap taps\n  \t        time: 250, // max time of the pointer to be down (like finger on the screen)\n  \t        threshold: 9, // a minimal movement is ok, but keep it low\n  \t        posThreshold: 10 // a multi-tap can be a bit off the initial position\n  \t    },\n\n  \t    getTouchAction: function() {\n  \t        return [TOUCH_ACTION_MANIPULATION];\n  \t    },\n\n  \t    process: function(input) {\n  \t        var options = this.options;\n\n  \t        var validPointers = input.pointers.length === options.pointers;\n  \t        var validMovement = input.distance < options.threshold;\n  \t        var validTouchTime = input.deltaTime < options.time;\n\n  \t        this.reset();\n\n  \t        if ((input.eventType & INPUT_START) && (this.count === 0)) {\n  \t            return this.failTimeout();\n  \t        }\n\n  \t        // we only allow little movement\n  \t        // and we've reached an end event, so a tap is possible\n  \t        if (validMovement && validTouchTime && validPointers) {\n  \t            if (input.eventType != INPUT_END) {\n  \t                return this.failTimeout();\n  \t            }\n\n  \t            var validInterval = this.pTime ? (input.timeStamp - this.pTime < options.interval) : true;\n  \t            var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold;\n\n  \t            this.pTime = input.timeStamp;\n  \t            this.pCenter = input.center;\n\n  \t            if (!validMultiTap || !validInterval) {\n  \t                this.count = 1;\n  \t            } else {\n  \t                this.count += 1;\n  \t            }\n\n  \t            this._input = input;\n\n  \t            // if tap count matches we have recognized it,\n  \t            // else it has began recognizing...\n  \t            var tapCount = this.count % options.taps;\n  \t            if (tapCount === 0) {\n  \t                // no failing requirements, immediately trigger the tap event\n  \t                // or wait as long as the multitap interval to trigger\n  \t                if (!this.hasRequireFailures()) {\n  \t                    return STATE_RECOGNIZED;\n  \t                } else {\n  \t                    this._timer = setTimeoutContext(function() {\n  \t                        this.state = STATE_RECOGNIZED;\n  \t                        this.tryEmit();\n  \t                    }, options.interval, this);\n  \t                    return STATE_BEGAN;\n  \t                }\n  \t            }\n  \t        }\n  \t        return STATE_FAILED;\n  \t    },\n\n  \t    failTimeout: function() {\n  \t        this._timer = setTimeoutContext(function() {\n  \t            this.state = STATE_FAILED;\n  \t        }, this.options.interval, this);\n  \t        return STATE_FAILED;\n  \t    },\n\n  \t    reset: function() {\n  \t        clearTimeout(this._timer);\n  \t    },\n\n  \t    emit: function() {\n  \t        if (this.state == STATE_RECOGNIZED) {\n  \t            this._input.tapCount = this.count;\n  \t            this.manager.emit(this.options.event, this._input);\n  \t        }\n  \t    }\n  \t});\n\n  \t/**\n  \t * Simple way to create a manager with a default set of recognizers.\n  \t * @param {HTMLElement} element\n  \t * @param {Object} [options]\n  \t * @constructor\n  \t */\n  \tfunction Hammer(element, options) {\n  \t    options = options || {};\n  \t    options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset);\n  \t    return new Manager(element, options);\n  \t}\n\n  \t/**\n  \t * @const {string}\n  \t */\n  \tHammer.VERSION = '2.0.7';\n\n  \t/**\n  \t * default settings\n  \t * @namespace\n  \t */\n  \tHammer.defaults = {\n  \t    /**\n  \t     * set if DOM events are being triggered.\n  \t     * But this is slower and unused by simple implementations, so disabled by default.\n  \t     * @type {Boolean}\n  \t     * @default false\n  \t     */\n  \t    domEvents: false,\n\n  \t    /**\n  \t     * The value for the touchAction property/fallback.\n  \t     * When set to `compute` it will magically set the correct value based on the added recognizers.\n  \t     * @type {String}\n  \t     * @default compute\n  \t     */\n  \t    touchAction: TOUCH_ACTION_COMPUTE,\n\n  \t    /**\n  \t     * @type {Boolean}\n  \t     * @default true\n  \t     */\n  \t    enable: true,\n\n  \t    /**\n  \t     * EXPERIMENTAL FEATURE -- can be removed/changed\n  \t     * Change the parent input target element.\n  \t     * If Null, then it is being set the to main element.\n  \t     * @type {Null|EventTarget}\n  \t     * @default null\n  \t     */\n  \t    inputTarget: null,\n\n  \t    /**\n  \t     * force an input class\n  \t     * @type {Null|Function}\n  \t     * @default null\n  \t     */\n  \t    inputClass: null,\n\n  \t    /**\n  \t     * Default recognizer setup when calling `Hammer()`\n  \t     * When creating a new Manager these will be skipped.\n  \t     * @type {Array}\n  \t     */\n  \t    preset: [\n  \t        // RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...]\n  \t        [RotateRecognizer, {enable: false}],\n  \t        [PinchRecognizer, {enable: false}, ['rotate']],\n  \t        [SwipeRecognizer, {direction: DIRECTION_HORIZONTAL}],\n  \t        [PanRecognizer, {direction: DIRECTION_HORIZONTAL}, ['swipe']],\n  \t        [TapRecognizer],\n  \t        [TapRecognizer, {event: 'doubletap', taps: 2}, ['tap']],\n  \t        [PressRecognizer]\n  \t    ],\n\n  \t    /**\n  \t     * Some CSS properties can be used to improve the working of Hammer.\n  \t     * Add them to this method and they will be set when creating a new Manager.\n  \t     * @namespace\n  \t     */\n  \t    cssProps: {\n  \t        /**\n  \t         * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n  \t         * @type {String}\n  \t         * @default 'none'\n  \t         */\n  \t        userSelect: 'none',\n\n  \t        /**\n  \t         * Disable the Windows Phone grippers when pressing an element.\n  \t         * @type {String}\n  \t         * @default 'none'\n  \t         */\n  \t        touchSelect: 'none',\n\n  \t        /**\n  \t         * Disables the default callout shown when you touch and hold a touch target.\n  \t         * On iOS, when you touch and hold a touch target such as a link, Safari displays\n  \t         * a callout containing information about the link. This property allows you to disable that callout.\n  \t         * @type {String}\n  \t         * @default 'none'\n  \t         */\n  \t        touchCallout: 'none',\n\n  \t        /**\n  \t         * Specifies whether zooming is enabled. Used by IE10>\n  \t         * @type {String}\n  \t         * @default 'none'\n  \t         */\n  \t        contentZooming: 'none',\n\n  \t        /**\n  \t         * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers.\n  \t         * @type {String}\n  \t         * @default 'none'\n  \t         */\n  \t        userDrag: 'none',\n\n  \t        /**\n  \t         * Overrides the highlight color shown when the user taps a link or a JavaScript\n  \t         * clickable element in iOS. This property obeys the alpha value, if specified.\n  \t         * @type {String}\n  \t         * @default 'rgba(0,0,0,0)'\n  \t         */\n  \t        tapHighlightColor: 'rgba(0,0,0,0)'\n  \t    }\n  \t};\n\n  \tvar STOP = 1;\n  \tvar FORCED_STOP = 2;\n\n  \t/**\n  \t * Manager\n  \t * @param {HTMLElement} element\n  \t * @param {Object} [options]\n  \t * @constructor\n  \t */\n  \tfunction Manager(element, options) {\n  \t    this.options = assign({}, Hammer.defaults, options || {});\n\n  \t    this.options.inputTarget = this.options.inputTarget || element;\n\n  \t    this.handlers = {};\n  \t    this.session = {};\n  \t    this.recognizers = [];\n  \t    this.oldCssProps = {};\n\n  \t    this.element = element;\n  \t    this.input = createInputInstance(this);\n  \t    this.touchAction = new TouchAction(this, this.options.touchAction);\n\n  \t    toggleCssProps(this, true);\n\n  \t    each(this.options.recognizers, function(item) {\n  \t        var recognizer = this.add(new (item[0])(item[1]));\n  \t        item[2] && recognizer.recognizeWith(item[2]);\n  \t        item[3] && recognizer.requireFailure(item[3]);\n  \t    }, this);\n  \t}\n\n  \tManager.prototype = {\n  \t    /**\n  \t     * set options\n  \t     * @param {Object} options\n  \t     * @returns {Manager}\n  \t     */\n  \t    set: function(options) {\n  \t        assign(this.options, options);\n\n  \t        // Options that need a little more setup\n  \t        if (options.touchAction) {\n  \t            this.touchAction.update();\n  \t        }\n  \t        if (options.inputTarget) {\n  \t            // Clean up existing event listeners and reinitialize\n  \t            this.input.destroy();\n  \t            this.input.target = options.inputTarget;\n  \t            this.input.init();\n  \t        }\n  \t        return this;\n  \t    },\n\n  \t    /**\n  \t     * stop recognizing for this session.\n  \t     * This session will be discarded, when a new [input]start event is fired.\n  \t     * When forced, the recognizer cycle is stopped immediately.\n  \t     * @param {Boolean} [force]\n  \t     */\n  \t    stop: function(force) {\n  \t        this.session.stopped = force ? FORCED_STOP : STOP;\n  \t    },\n\n  \t    /**\n  \t     * run the recognizers!\n  \t     * called by the inputHandler function on every movement of the pointers (touches)\n  \t     * it walks through all the recognizers and tries to detect the gesture that is being made\n  \t     * @param {Object} inputData\n  \t     */\n  \t    recognize: function(inputData) {\n  \t        var session = this.session;\n  \t        if (session.stopped) {\n  \t            return;\n  \t        }\n\n  \t        // run the touch-action polyfill\n  \t        this.touchAction.preventDefaults(inputData);\n\n  \t        var recognizer;\n  \t        var recognizers = this.recognizers;\n\n  \t        // this holds the recognizer that is being recognized.\n  \t        // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED\n  \t        // if no recognizer is detecting a thing, it is set to `null`\n  \t        var curRecognizer = session.curRecognizer;\n\n  \t        // reset when the last recognizer is recognized\n  \t        // or when we're in a new session\n  \t        if (!curRecognizer || (curRecognizer && curRecognizer.state & STATE_RECOGNIZED)) {\n  \t            curRecognizer = session.curRecognizer = null;\n  \t        }\n\n  \t        var i = 0;\n  \t        while (i < recognizers.length) {\n  \t            recognizer = recognizers[i];\n\n  \t            // find out if we are allowed try to recognize the input for this one.\n  \t            // 1.   allow if the session is NOT forced stopped (see the .stop() method)\n  \t            // 2.   allow if we still haven't recognized a gesture in this session, or the this recognizer is the one\n  \t            //      that is being recognized.\n  \t            // 3.   allow if the recognizer is allowed to run simultaneous with the current recognized recognizer.\n  \t            //      this can be setup with the `recognizeWith()` method on the recognizer.\n  \t            if (session.stopped !== FORCED_STOP && ( // 1\n  \t                    !curRecognizer || recognizer == curRecognizer || // 2\n  \t                    recognizer.canRecognizeWith(curRecognizer))) { // 3\n  \t                recognizer.recognize(inputData);\n  \t            } else {\n  \t                recognizer.reset();\n  \t            }\n\n  \t            // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the\n  \t            // current active recognizer. but only if we don't already have an active recognizer\n  \t            if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) {\n  \t                curRecognizer = session.curRecognizer = recognizer;\n  \t            }\n  \t            i++;\n  \t        }\n  \t    },\n\n  \t    /**\n  \t     * get a recognizer by its event name.\n  \t     * @param {Recognizer|String} recognizer\n  \t     * @returns {Recognizer|Null}\n  \t     */\n  \t    get: function(recognizer) {\n  \t        if (recognizer instanceof Recognizer) {\n  \t            return recognizer;\n  \t        }\n\n  \t        var recognizers = this.recognizers;\n  \t        for (var i = 0; i < recognizers.length; i++) {\n  \t            if (recognizers[i].options.event == recognizer) {\n  \t                return recognizers[i];\n  \t            }\n  \t        }\n  \t        return null;\n  \t    },\n\n  \t    /**\n  \t     * add a recognizer to the manager\n  \t     * existing recognizers with the same event name will be removed\n  \t     * @param {Recognizer} recognizer\n  \t     * @returns {Recognizer|Manager}\n  \t     */\n  \t    add: function(recognizer) {\n  \t        if (invokeArrayArg(recognizer, 'add', this)) {\n  \t            return this;\n  \t        }\n\n  \t        // remove existing\n  \t        var existing = this.get(recognizer.options.event);\n  \t        if (existing) {\n  \t            this.remove(existing);\n  \t        }\n\n  \t        this.recognizers.push(recognizer);\n  \t        recognizer.manager = this;\n\n  \t        this.touchAction.update();\n  \t        return recognizer;\n  \t    },\n\n  \t    /**\n  \t     * remove a recognizer by name or instance\n  \t     * @param {Recognizer|String} recognizer\n  \t     * @returns {Manager}\n  \t     */\n  \t    remove: function(recognizer) {\n  \t        if (invokeArrayArg(recognizer, 'remove', this)) {\n  \t            return this;\n  \t        }\n\n  \t        recognizer = this.get(recognizer);\n\n  \t        // let's make sure this recognizer exists\n  \t        if (recognizer) {\n  \t            var recognizers = this.recognizers;\n  \t            var index = inArray(recognizers, recognizer);\n\n  \t            if (index !== -1) {\n  \t                recognizers.splice(index, 1);\n  \t                this.touchAction.update();\n  \t            }\n  \t        }\n\n  \t        return this;\n  \t    },\n\n  \t    /**\n  \t     * bind event\n  \t     * @param {String} events\n  \t     * @param {Function} handler\n  \t     * @returns {EventEmitter} this\n  \t     */\n  \t    on: function(events, handler) {\n  \t        if (events === undefined$1) {\n  \t            return;\n  \t        }\n  \t        if (handler === undefined$1) {\n  \t            return;\n  \t        }\n\n  \t        var handlers = this.handlers;\n  \t        each(splitStr(events), function(event) {\n  \t            handlers[event] = handlers[event] || [];\n  \t            handlers[event].push(handler);\n  \t        });\n  \t        return this;\n  \t    },\n\n  \t    /**\n  \t     * unbind event, leave emit blank to remove all handlers\n  \t     * @param {String} events\n  \t     * @param {Function} [handler]\n  \t     * @returns {EventEmitter} this\n  \t     */\n  \t    off: function(events, handler) {\n  \t        if (events === undefined$1) {\n  \t            return;\n  \t        }\n\n  \t        var handlers = this.handlers;\n  \t        each(splitStr(events), function(event) {\n  \t            if (!handler) {\n  \t                delete handlers[event];\n  \t            } else {\n  \t                handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1);\n  \t            }\n  \t        });\n  \t        return this;\n  \t    },\n\n  \t    /**\n  \t     * emit event to the listeners\n  \t     * @param {String} event\n  \t     * @param {Object} data\n  \t     */\n  \t    emit: function(event, data) {\n  \t        // we also want to trigger dom events\n  \t        if (this.options.domEvents) {\n  \t            triggerDomEvent(event, data);\n  \t        }\n\n  \t        // no handlers, so skip it all\n  \t        var handlers = this.handlers[event] && this.handlers[event].slice();\n  \t        if (!handlers || !handlers.length) {\n  \t            return;\n  \t        }\n\n  \t        data.type = event;\n  \t        data.preventDefault = function() {\n  \t            data.srcEvent.preventDefault();\n  \t        };\n\n  \t        var i = 0;\n  \t        while (i < handlers.length) {\n  \t            handlers[i](data);\n  \t            i++;\n  \t        }\n  \t    },\n\n  \t    /**\n  \t     * destroy the manager and unbinds all events\n  \t     * it doesn't unbind dom events, that is the user own responsibility\n  \t     */\n  \t    destroy: function() {\n  \t        this.element && toggleCssProps(this, false);\n\n  \t        this.handlers = {};\n  \t        this.session = {};\n  \t        this.input.destroy();\n  \t        this.element = null;\n  \t    }\n  \t};\n\n  \t/**\n  \t * add/remove the css properties as defined in manager.options.cssProps\n  \t * @param {Manager} manager\n  \t * @param {Boolean} add\n  \t */\n  \tfunction toggleCssProps(manager, add) {\n  \t    var element = manager.element;\n  \t    if (!element.style) {\n  \t        return;\n  \t    }\n  \t    var prop;\n  \t    each(manager.options.cssProps, function(value, name) {\n  \t        prop = prefixed(element.style, name);\n  \t        if (add) {\n  \t            manager.oldCssProps[prop] = element.style[prop];\n  \t            element.style[prop] = value;\n  \t        } else {\n  \t            element.style[prop] = manager.oldCssProps[prop] || '';\n  \t        }\n  \t    });\n  \t    if (!add) {\n  \t        manager.oldCssProps = {};\n  \t    }\n  \t}\n\n  \t/**\n  \t * trigger dom event\n  \t * @param {String} event\n  \t * @param {Object} data\n  \t */\n  \tfunction triggerDomEvent(event, data) {\n  \t    var gestureEvent = document.createEvent('Event');\n  \t    gestureEvent.initEvent(event, true, true);\n  \t    gestureEvent.gesture = data;\n  \t    data.target.dispatchEvent(gestureEvent);\n  \t}\n\n  \tassign(Hammer, {\n  \t    INPUT_START: INPUT_START,\n  \t    INPUT_MOVE: INPUT_MOVE,\n  \t    INPUT_END: INPUT_END,\n  \t    INPUT_CANCEL: INPUT_CANCEL,\n\n  \t    STATE_POSSIBLE: STATE_POSSIBLE,\n  \t    STATE_BEGAN: STATE_BEGAN,\n  \t    STATE_CHANGED: STATE_CHANGED,\n  \t    STATE_ENDED: STATE_ENDED,\n  \t    STATE_RECOGNIZED: STATE_RECOGNIZED,\n  \t    STATE_CANCELLED: STATE_CANCELLED,\n  \t    STATE_FAILED: STATE_FAILED,\n\n  \t    DIRECTION_NONE: DIRECTION_NONE,\n  \t    DIRECTION_LEFT: DIRECTION_LEFT,\n  \t    DIRECTION_RIGHT: DIRECTION_RIGHT,\n  \t    DIRECTION_UP: DIRECTION_UP,\n  \t    DIRECTION_DOWN: DIRECTION_DOWN,\n  \t    DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL,\n  \t    DIRECTION_VERTICAL: DIRECTION_VERTICAL,\n  \t    DIRECTION_ALL: DIRECTION_ALL,\n\n  \t    Manager: Manager,\n  \t    Input: Input,\n  \t    TouchAction: TouchAction,\n\n  \t    TouchInput: TouchInput,\n  \t    MouseInput: MouseInput,\n  \t    PointerEventInput: PointerEventInput,\n  \t    TouchMouseInput: TouchMouseInput,\n  \t    SingleTouchInput: SingleTouchInput,\n\n  \t    Recognizer: Recognizer,\n  \t    AttrRecognizer: AttrRecognizer,\n  \t    Tap: TapRecognizer,\n  \t    Pan: PanRecognizer,\n  \t    Swipe: SwipeRecognizer,\n  \t    Pinch: PinchRecognizer,\n  \t    Rotate: RotateRecognizer,\n  \t    Press: PressRecognizer,\n\n  \t    on: addEventListeners,\n  \t    off: removeEventListeners,\n  \t    each: each,\n  \t    merge: merge,\n  \t    extend: extend,\n  \t    assign: assign,\n  \t    inherit: inherit,\n  \t    bindFn: bindFn,\n  \t    prefixed: prefixed\n  \t});\n\n  \t// this prevents errors when Hammer is loaded in the presence of an AMD\n  \t//  style loader but by script tag, not by the loader.\n  \tvar freeGlobal = (typeof window !== 'undefined' ? window : (typeof self !== 'undefined' ? self : {})); // jshint ignore:line\n  \tfreeGlobal.Hammer = Hammer;\n\n  \tif (typeof undefined$1 === 'function' && undefined$1.amd) {\n  \t    undefined$1(function() {\n  \t        return Hammer;\n  \t    });\n  \t} else if (module.exports) {\n  \t    module.exports = Hammer;\n  \t} else {\n  \t    window[exportName] = Hammer;\n  \t}\n\n  \t})(window, document, 'Hammer'); \n  } (hammer));\n\n  var hammerExports = hammer.exports;\n  var Hammer = /*@__PURE__*/getDefaultExportFromCjs(hammerExports);\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   *\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../interaction-events/InteractionEvents').default} InteractionEvents\n   */\n\n  var MIN_ZOOM = 0.2,\n      MAX_ZOOM = 4;\n\n  var mouseEvents = [\n    'mousedown',\n    'mouseup',\n    'mouseover',\n    'mouseout',\n    'click',\n    'dblclick'\n  ];\n\n  function get(service, injector) {\n    return injector.get(service, false);\n  }\n\n  function stopEvent(event) {\n\n    event.preventDefault();\n\n    if (typeof event.stopPropagation === 'function') {\n      event.stopPropagation();\n    } else if (event.srcEvent && typeof event.srcEvent.stopPropagation === 'function') {\n\n      // iPhone & iPad\n      event.srcEvent.stopPropagation();\n    }\n\n    if (typeof event.stopImmediatePropagation === 'function') {\n      event.stopImmediatePropagation();\n    }\n  }\n\n\n  function createTouchRecognizer(node) {\n\n    function stopMouse(event$1) {\n\n      forEach$1(mouseEvents, function(e) {\n        event.bind(node, e, stopEvent, true);\n      });\n    }\n\n    function allowMouse(event$1) {\n      setTimeout(function() {\n        forEach$1(mouseEvents, function(e) {\n          event.unbind(node, e, stopEvent, true);\n        });\n      }, 500);\n    }\n\n    event.bind(node, 'touchstart', stopMouse, true);\n    event.bind(node, 'touchend', allowMouse, true);\n    event.bind(node, 'touchcancel', allowMouse, true);\n\n    // A touch event recognizer that handles\n    // touch events only (we know, we can already handle\n    // mouse events out of the box)\n\n    var recognizer = new Hammer.Manager(node, {\n      inputClass: Hammer.TouchInput,\n      recognizers: [],\n      domEvents: true\n    });\n\n\n    var tap = new Hammer.Tap();\n    var pan = new Hammer.Pan({ threshold: 10 });\n    var press = new Hammer.Press();\n    var pinch = new Hammer.Pinch();\n\n    var doubleTap = new Hammer.Tap({ event: 'doubletap', taps: 2 });\n\n    pinch.requireFailure(pan);\n    pinch.requireFailure(press);\n\n    recognizer.add([ pan, press, pinch, doubleTap, tap ]);\n\n    recognizer.reset = function(force) {\n      var recognizers = this.recognizers,\n          session = this.session;\n\n      if (session.stopped) {\n        return;\n      }\n\n      recognizer.stop(force);\n\n      setTimeout(function() {\n        var i, r;\n        for (i = 0; (r = recognizers[i]); i++) {\n          r.reset();\n          r.state = 8; // FAILED STATE\n        }\n\n        session.curRecognizer = null;\n      }, 0);\n    };\n\n    recognizer.on('hammer.input', function(event) {\n      if (event.srcEvent.defaultPrevented) {\n        recognizer.reset(true);\n      }\n    });\n\n    return recognizer;\n  }\n\n  /**\n   * A plugin that provides touch events for elements.\n   *\n   * @param {Injector} injector\n   * @param {Canvas} canvas\n   * @param {EventBus} eventBus\n   * @param {ElementRegistry} elementRegistry\n   * @param {InteractionEvents} interactionEvents\n   */\n  function TouchInteractionEvents(\n      injector, canvas, eventBus,\n      elementRegistry, interactionEvents) {\n\n    // optional integrations\n    var dragging = get('dragging', injector),\n        move = get('move', injector),\n        contextPad = get('contextPad', injector),\n        palette = get('palette', injector);\n\n    // the touch recognizer\n    var recognizer;\n\n    function handler(type, buttonType) {\n\n      return function(event) {\n\n        var gfx = getGfx(event.target),\n            element = gfx && elementRegistry.get(gfx);\n\n        // translate into an actual mouse click event\n        if (buttonType) {\n          event.srcEvent.button = buttonType;\n        }\n\n        return interactionEvents.fire(type, event, element);\n      };\n    }\n\n\n    function getGfx(target) {\n      var node = closest(target, 'svg, .djs-element', true);\n      return node;\n    }\n\n    function initEvents(svg) {\n\n      // touch recognizer\n      recognizer = createTouchRecognizer(svg);\n\n      function startGrabCanvas(event) {\n\n        var lx = 0, ly = 0;\n\n        function update(e) {\n\n          var dx = e.deltaX - lx,\n              dy = e.deltaY - ly;\n\n          canvas.scroll({ dx: dx, dy: dy });\n\n          lx = e.deltaX;\n          ly = e.deltaY;\n        }\n\n        function end(e) {\n          recognizer.off('panmove', update);\n          recognizer.off('panend', end);\n          recognizer.off('pancancel', end);\n        }\n\n        recognizer.on('panmove', update);\n        recognizer.on('panend', end);\n        recognizer.on('pancancel', end);\n      }\n\n      function startGrab(event) {\n\n        var gfx = getGfx(event.target),\n            element = gfx && elementRegistry.get(gfx);\n\n        // recognizer\n        if (move && canvas.getRootElement() !== element) {\n          return move.start(event, element, true);\n        } else {\n          startGrabCanvas();\n        }\n      }\n\n      function startZoom(e) {\n\n        var zoom = canvas.zoom(),\n            mid = e.center;\n\n        function update(e) {\n\n          var ratio = 1 - (1 - e.scale) / 1.50,\n              newZoom = Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, ratio * zoom));\n\n          canvas.zoom(newZoom, mid);\n\n          stopEvent(e);\n        }\n\n        function end(e) {\n          recognizer.off('pinchmove', update);\n          recognizer.off('pinchend', end);\n          recognizer.off('pinchcancel', end);\n\n          recognizer.reset(true);\n        }\n\n        recognizer.on('pinchmove', update);\n        recognizer.on('pinchend', end);\n        recognizer.on('pinchcancel', end);\n      }\n\n      recognizer.on('tap', handler('element.click'));\n      recognizer.on('doubletap', handler('element.dblclick', 1));\n\n      recognizer.on('panstart', startGrab);\n      recognizer.on('press', startGrab);\n\n      recognizer.on('pinchstart', startZoom);\n    }\n\n    if (dragging) {\n\n      // simulate hover during dragging\n      eventBus.on('drag.move', function(event) {\n\n        var originalEvent = event.originalEvent;\n\n        if (!originalEvent || originalEvent instanceof MouseEvent) {\n          return;\n        }\n\n        var position = toPoint(originalEvent);\n\n        // this gets really expensive ...\n        var node = document.elementFromPoint(position.x, position.y),\n            gfx = getGfx(node),\n            element = gfx && elementRegistry.get(gfx);\n\n        if (element !== event.hover) {\n          if (event.hover) {\n            dragging.out(event);\n          }\n\n          if (element) {\n            dragging.hover({ element: element, gfx: gfx });\n\n            event.hover = element;\n            event.hoverGfx = gfx;\n          }\n        }\n      });\n    }\n\n    if (contextPad) {\n\n      eventBus.on('contextPad.create', function(event) {\n        var node = event.pad.html;\n\n        // touch recognizer\n        var padRecognizer = createTouchRecognizer(node);\n\n        padRecognizer.on('panstart', function(event) {\n          contextPad.trigger('dragstart', event, true);\n        });\n\n        padRecognizer.on('press', function(event) {\n          contextPad.trigger('dragstart', event, true);\n        });\n\n        padRecognizer.on('tap', function(event) {\n          contextPad.trigger('click', event);\n        });\n      });\n    }\n\n    if (palette) {\n      eventBus.on('palette.create', function(event) {\n        var node = event.container;\n\n        // touch recognizer\n        var padRecognizer = createTouchRecognizer(node);\n\n        padRecognizer.on('panstart', function(event) {\n          palette.trigger('dragstart', event, true);\n        });\n\n        padRecognizer.on('press', function(event) {\n          palette.trigger('dragstart', event, true);\n        });\n\n        padRecognizer.on('tap', function(event) {\n          palette.trigger('click', event);\n        });\n      });\n    }\n\n    eventBus.on('canvas.init', function(event) {\n      initEvents(event.svg);\n    });\n  }\n\n\n  TouchInteractionEvents.$inject = [\n    'injector',\n    'canvas',\n    'eventBus',\n    'elementRegistry',\n    'interactionEvents',\n    'touchFix'\n  ];\n\n  /**\n   * @typedef {import('../../core/EventBus').default} EventBus\n   */\n\n  /**\n   * @param {EventBus} eventBus\n   */\n  function TouchFix(eventBus) {\n\n    var self = this;\n\n    eventBus.on('canvas.init', function(e) {\n      self.addBBoxMarker(e.svg);\n    });\n  }\n\n  TouchFix.$inject = [ 'eventBus' ];\n\n\n  /**\n   * Safari mobile (iOS 7) does not fire touchstart event in <SVG> element\n   * if there is no shape between 0,0 and viewport elements origin.\n   *\n   * So touchstart event is only fired when the <g class=\"viewport\"> element was hit.\n   * Putting an element over and below the 'viewport' fixes that behavior.\n   *\n   * @param {SVGElement} svg\n   */\n  TouchFix.prototype.addBBoxMarker = function(svg) {\n\n    var markerStyle = {\n      fill: 'none',\n      class: 'outer-bound-marker'\n    };\n\n    var rect1 = create$1('rect');\n    attr(rect1, {\n      x: -10000,\n      y: 10000,\n      width: 10,\n      height: 10\n    });\n    attr(rect1, markerStyle);\n\n    append(svg, rect1);\n\n    var rect2 = create$1('rect');\n    attr(rect2, {\n      x: 10000,\n      y: 10000,\n      width: 10,\n      height: 10\n    });\n    attr(rect2, markerStyle);\n\n    append(svg, rect2);\n  };\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var TouchModule$1 = {\n    __depends__: [ InteractionEventsModule$1 ],\n    __init__: [ 'touchInteractionEvents' ],\n    touchInteractionEvents: [ 'type', TouchInteractionEvents ],\n    touchFix: [ 'type', TouchFix ]\n  };\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var TouchModule = {\n    __depends__: [\n      TouchModule$1\n    ]\n  };\n\n  /**\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   * @typedef {import('../rules/Rules').default} Rules\n   *\n   * @typedef {import('../../util/Types').Axis} Axis\n   * @typedef {import('../../util/Types').Dimension} Dimension\n   *\n   * @typedef { 'top' | 'right' | 'bottom' | 'left' | 'center' | 'middle' } Alignment\n   */\n\n  function last(arr) {\n    return arr && arr[arr.length - 1];\n  }\n\n  function sortTopOrMiddle(element) {\n    return element.y;\n  }\n\n  function sortLeftOrCenter(element) {\n    return element.x;\n  }\n\n  /**\n   * Sorting functions for different alignments.\n   *\n   * @type {Record<string, Function>}\n   */\n  var ALIGNMENT_SORTING = {\n    left: sortLeftOrCenter,\n    center: sortLeftOrCenter,\n    right: function(element) {\n      return element.x + element.width;\n    },\n    top: sortTopOrMiddle,\n    middle: sortTopOrMiddle,\n    bottom: function(element) {\n      return element.y + element.height;\n    }\n  };\n\n  /**\n   * @param {Modeling} modeling\n   * @param {Rules} rules\n   */\n  function AlignElements$1(modeling, rules) {\n    this._modeling = modeling;\n    this._rules = rules;\n  }\n\n  AlignElements$1.$inject = [ 'modeling', 'rules' ];\n\n\n  /**\n   * Get relevant axis and dimension for given alignment.\n   *\n   * @param {Alignment} type\n   *\n   * @return { {\n   *   axis: Axis;\n   *   dimension: Dimension;\n   * } }\n   */\n  AlignElements$1.prototype._getOrientationDetails = function(type) {\n    var vertical = [ 'top', 'bottom', 'middle' ],\n        axis = 'x',\n        dimension = 'width';\n\n    if (vertical.indexOf(type) !== -1) {\n      axis = 'y';\n      dimension = 'height';\n    }\n\n    return {\n      axis: axis,\n      dimension: dimension\n    };\n  };\n\n  AlignElements$1.prototype._isType = function(type, types) {\n    return types.indexOf(type) !== -1;\n  };\n\n  /**\n   * Get point on relevant axis for given alignment.\n   *\n   * @param {Alignment} type\n   * @param {Element[]} sortedElements\n   *\n   * @return {Partial<Record<Alignment, number>>}\n   */\n  AlignElements$1.prototype._alignmentPosition = function(type, sortedElements) {\n    var orientation = this._getOrientationDetails(type),\n        axis = orientation.axis,\n        dimension = orientation.dimension,\n        alignment = {},\n        centers = {},\n        hasSharedCenters = false,\n        centeredElements,\n        firstElement,\n        lastElement;\n\n    function getMiddleOrTop(first, last) {\n      return Math.round((first[axis] + last[axis] + last[dimension]) / 2);\n    }\n\n    if (this._isType(type, [ 'left', 'top' ])) {\n      alignment[type] = sortedElements[0][axis];\n\n    } else if (this._isType(type, [ 'right', 'bottom' ])) {\n      lastElement = last(sortedElements);\n\n      alignment[type] = lastElement[axis] + lastElement[dimension];\n\n    } else if (this._isType(type, [ 'center', 'middle' ])) {\n\n      // check if there is a center shared by more than one shape\n      // if not, just take the middle of the range\n      forEach$1(sortedElements, function(element) {\n        var center = element[axis] + Math.round(element[dimension] / 2);\n\n        if (centers[center]) {\n          centers[center].elements.push(element);\n        } else {\n          centers[center] = {\n            elements: [ element ],\n            center: center\n          };\n        }\n      });\n\n      centeredElements = sortBy(centers, function(center) {\n        if (center.elements.length > 1) {\n          hasSharedCenters = true;\n        }\n\n        return center.elements.length;\n      });\n\n      if (hasSharedCenters) {\n        alignment[type] = last(centeredElements).center;\n\n        return alignment;\n      }\n\n      firstElement = sortedElements[0];\n\n      sortedElements = sortBy(sortedElements, function(element) {\n        return element[axis] + element[dimension];\n      });\n\n      lastElement = last(sortedElements);\n\n      alignment[type] = getMiddleOrTop(firstElement, lastElement);\n    }\n\n    return alignment;\n  };\n\n  /**\n   * Align elements on relevant axis for given alignment.\n   *\n   * @param {Element[]} elements\n   * @param {Alignment} type\n   */\n  AlignElements$1.prototype.trigger = function(elements, type) {\n    var modeling = this._modeling,\n        allowed;\n\n    // filter out elements which cannot be aligned\n    var filteredElements = filter(elements, function(element) {\n      return !(element.waypoints || element.host || element.labelTarget);\n    });\n\n    // filter out elements via rules\n    allowed = this._rules.allowed('elements.align', { elements: filteredElements });\n    if (isArray$3(allowed)) {\n      filteredElements = allowed;\n    }\n\n    if (filteredElements.length < 2 || !allowed) {\n      return;\n    }\n\n    var sortFn = ALIGNMENT_SORTING[type];\n\n    var sortedElements = sortBy(filteredElements, sortFn);\n\n    var alignment = this._alignmentPosition(type, sortedElements);\n\n    modeling.alignElements(sortedElements, alignment);\n  };\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var AlignElementsModule$1 = {\n    __init__: [ 'alignElements' ],\n    alignElements: [ 'type', AlignElements$1 ]\n  };\n\n  /**\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef {import('../../util/Types').Rect} Rect\n   *\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../overlays/Overlays').default} Overlays\n   *\n   * @typedef {import('../overlays/Overlays').Overlay} Overlay\n   *\n   * @typedef {import('./ContextPadProvider').default} ContextPadProvider\n   * @typedef {import('./ContextPadProvider').ContextPadEntries} ContextPadEntries\n   *\n   * @typedef { {\n   *   scale?: {\n   *     min?: number;\n   *     max?: number;\n   *   };\n   * } } ContextPadConfig\n   */\n\n  /**\n   * @template {Element} [ElementType=Element]\n   *\n   * @typedef {ElementType|ElementType[]} ContextPadTarget\n   */\n\n  var entrySelector = '.entry';\n\n  var DEFAULT_PRIORITY$2 = 1000;\n  var CONTEXT_PAD_PADDING = 12;\n\n  /**\n   * A context pad that displays element specific, contextual actions next\n   * to a diagram element.\n   *\n   * @param {Canvas} canvas\n   * @param {ContextPadConfig} config\n   * @param {EventBus} eventBus\n   * @param {Overlays} overlays\n   */\n  function ContextPad(canvas, config, eventBus, overlays) {\n\n    this._canvas = canvas;\n    this._eventBus = eventBus;\n    this._overlays = overlays;\n\n    var scale = isDefined(config && config.scale) ? config.scale : {\n      min: 1,\n      max: 1.5\n    };\n\n    this._overlaysConfig = {\n      scale: scale\n    };\n\n    this._current = null;\n\n    this._init();\n  }\n\n  ContextPad.$inject = [\n    'canvas',\n    'config.contextPad',\n    'eventBus',\n    'overlays'\n  ];\n\n\n  /**\n   * Registers events needed for interaction with other components.\n   */\n  ContextPad.prototype._init = function() {\n    var self = this;\n\n    this._eventBus.on('selection.changed', function(event) {\n\n      var selection = event.newSelection;\n\n      var target = selection.length\n        ? selection.length === 1\n          ? selection[0]\n          : selection\n        : null;\n\n      if (target) {\n        self.open(target, true);\n      } else {\n        self.close();\n      }\n    });\n\n    this._eventBus.on('elements.changed', function(event) {\n      var elements = event.elements,\n          current = self._current;\n\n      if (!current) {\n        return;\n      }\n\n      var currentTarget = current.target;\n\n      var currentChanged = some(\n        isArray$3(currentTarget) ? currentTarget : [ currentTarget ],\n        function(element) {\n          return includes$8(elements, element);\n        }\n      );\n\n      // re-open if elements in current selection changed\n      if (currentChanged) {\n        self.open(currentTarget, true);\n      }\n    });\n  };\n\n  /**\n   * @overlord\n   *\n   * Register a context pad provider with the default priority. See\n   * {@link ContextPadProvider} for examples.\n   *\n   * @param {ContextPadProvider} provider\n   */\n\n  /**\n   * Register a context pad provider with the given priority. See\n   * {@link ContextPadProvider} for examples.\n   *\n   * @param {number} priority\n   * @param {ContextPadProvider} provider\n   */\n  ContextPad.prototype.registerProvider = function(priority, provider) {\n    if (!provider) {\n      provider = priority;\n      priority = DEFAULT_PRIORITY$2;\n    }\n\n    this._eventBus.on('contextPad.getProviders', priority, function(event) {\n      event.providers.push(provider);\n    });\n  };\n\n\n  /**\n   * Get context pad entries for given elements.\n   *\n   * @param {ContextPadTarget} target\n   *\n   * @return {ContextPadEntries} list of entries\n   */\n  ContextPad.prototype.getEntries = function(target) {\n    var providers = this._getProviders();\n\n    var provideFn = isArray$3(target)\n      ? 'getMultiElementContextPadEntries'\n      : 'getContextPadEntries';\n\n    var entries = {};\n\n    // loop through all providers and their entries.\n    // group entries by id so that overriding an entry is possible\n    forEach$1(providers, function(provider) {\n\n      if (!isFunction(provider[provideFn])) {\n        return;\n      }\n\n      var entriesOrUpdater = provider[provideFn](target);\n\n      if (isFunction(entriesOrUpdater)) {\n        entries = entriesOrUpdater(entries);\n      } else {\n        forEach$1(entriesOrUpdater, function(entry, id) {\n          entries[id] = entry;\n        });\n      }\n    });\n\n    return entries;\n  };\n\n\n  /**\n   * Trigger context pad via DOM event.\n   *\n   * The entry to trigger is determined by the target element.\n   *\n   * @param {string} action\n   * @param {Event} event\n   * @param {boolean} [autoActivate=false]\n   */\n  ContextPad.prototype.trigger = function(action, event, autoActivate) {\n\n    var entry,\n        originalEvent,\n        button = event.delegateTarget || event.target;\n\n    if (!button) {\n      return event.preventDefault();\n    }\n\n    entry = attr$1(button, 'data-action');\n    originalEvent = event.originalEvent || event;\n\n    return this.triggerEntry(entry, action, originalEvent, autoActivate);\n  };\n\n  /**\n   * Trigger context pad entry entry.\n   *\n   * @param {string} entryId\n   * @param {string} action\n   * @param {Event} event\n   * @param {boolean} [autoActivate=false]\n   */\n  ContextPad.prototype.triggerEntry = function(entryId, action, event, autoActivate) {\n\n    if (!this.isShown()) {\n      return;\n    }\n\n    var target = this._current.target,\n        entries = this._current.entries;\n\n    var entry = entries[entryId];\n\n    if (!entry) {\n      return;\n    }\n\n    var handler = entry.action;\n\n    if (this._eventBus.fire('contextPad.trigger', { entry, event }) === false) {\n      return;\n    }\n\n    // simple action (via callback function)\n    if (isFunction(handler)) {\n      if (action === 'click') {\n        return handler(event, target, autoActivate);\n      }\n    } else {\n      if (handler[action]) {\n        return handler[action](event, target, autoActivate);\n      }\n    }\n\n    // silence other actions\n    event.preventDefault();\n  };\n\n\n  /**\n   * Open the context pad for given elements.\n   *\n   * @param {ContextPadTarget} target\n   * @param {boolean} [force=false] - Force re-opening context pad.\n   */\n  ContextPad.prototype.open = function(target, force) {\n    if (!force && this.isOpen(target)) {\n      return;\n    }\n\n    this.close();\n\n    this._updateAndOpen(target);\n  };\n\n  ContextPad.prototype._getProviders = function() {\n\n    var event = this._eventBus.createEvent({\n      type: 'contextPad.getProviders',\n      providers: []\n    });\n\n    this._eventBus.fire(event);\n\n    return event.providers;\n  };\n\n\n  /**\n   * @param {ContextPadTarget} target\n   */\n  ContextPad.prototype._updateAndOpen = function(target) {\n    var entries = this.getEntries(target),\n        pad = this.getPad(target),\n        html = pad.html,\n        image;\n\n    forEach$1(entries, function(entry, id) {\n      var grouping = entry.group || 'default',\n          control = domify$1(entry.html || '<div class=\"entry\" draggable=\"true\"></div>'),\n          container;\n\n      attr$1(control, 'data-action', id);\n\n      container = query('[data-group=' + escapeCSS(grouping) + ']', html);\n      if (!container) {\n        container = domify$1('<div class=\"group\"></div>');\n        attr$1(container, 'data-group', grouping);\n\n        html.appendChild(container);\n      }\n\n      container.appendChild(control);\n\n      if (entry.className) {\n        addClasses$1(control, entry.className);\n      }\n\n      if (entry.title) {\n        attr$1(control, 'title', entry.title);\n      }\n\n      if (entry.imageUrl) {\n        image = domify$1('<img>');\n        attr$1(image, 'src', entry.imageUrl);\n        image.style.width = '100%';\n        image.style.height = '100%';\n\n        control.appendChild(image);\n      }\n    });\n\n    classes$1(html).add('open');\n\n    this._current = {\n      target: target,\n      entries: entries,\n      pad: pad\n    };\n\n    this._eventBus.fire('contextPad.open', { current: this._current });\n  };\n\n  /**\n   * @param {ContextPadTarget} target\n   *\n   * @return {Overlay}\n   */\n  ContextPad.prototype.getPad = function(target) {\n    if (this.isOpen()) {\n      return this._current.pad;\n    }\n\n    var self = this;\n\n    var overlays = this._overlays;\n\n    var html = domify$1('<div class=\"djs-context-pad\"></div>');\n\n    var position = this._getPosition(target);\n\n    var overlaysConfig = assign$1({\n      html: html\n    }, this._overlaysConfig, position);\n\n    delegate.bind(html, entrySelector, 'click', function(event) {\n      self.trigger('click', event);\n    });\n\n    delegate.bind(html, entrySelector, 'dragstart', function(event) {\n      self.trigger('dragstart', event);\n    });\n\n    // stop propagation of mouse events\n    event.bind(html, 'mousedown', function(event) {\n      event.stopPropagation();\n    });\n\n    var activeRootElement = this._canvas.getRootElement();\n\n    this._overlayId = overlays.add(activeRootElement, 'context-pad', overlaysConfig);\n\n    var pad = overlays.get(this._overlayId);\n\n    this._eventBus.fire('contextPad.create', {\n      target: target,\n      pad: pad\n    });\n\n    return pad;\n  };\n\n\n  /**\n   * Close the context pad\n   */\n  ContextPad.prototype.close = function() {\n    if (!this.isOpen()) {\n      return;\n    }\n\n    this._overlays.remove(this._overlayId);\n\n    this._overlayId = null;\n\n    this._eventBus.fire('contextPad.close', { current: this._current });\n\n    this._current = null;\n  };\n\n  /**\n   * Check if pad is open.\n   *\n   * If target is provided, check if it is opened\n   * for the given target (single or multiple elements).\n   *\n   * @param {ContextPadTarget} [target]\n   * @return {boolean}\n   */\n  ContextPad.prototype.isOpen = function(target) {\n    var current = this._current;\n\n    if (!current) {\n      return false;\n    }\n\n    // basic no-args is open check\n    if (!target) {\n      return true;\n    }\n\n    var currentTarget = current.target;\n\n    // strict handling of single vs. multi-selection\n    if (isArray$3(target) !== isArray$3(currentTarget)) {\n      return false;\n    }\n\n    if (isArray$3(target)) {\n      return (\n        target.length === currentTarget.length &&\n        every(target, function(element) {\n          return includes$8(currentTarget, element);\n        })\n      );\n    } else {\n      return currentTarget === target;\n    }\n  };\n\n\n  /**\n   * Check if pad is open and not hidden.\n   *\n   * @return {boolean}\n   */\n  ContextPad.prototype.isShown = function() {\n    return this.isOpen() && this._overlays.isShown();\n  };\n\n\n  /**\n   * Get contex pad position.\n   *\n   * @param {ContextPadTarget} target\n   *\n   * @return {Rect}\n   */\n  ContextPad.prototype._getPosition = function(target) {\n\n    var elements = isArray$3(target) ? target : [ target ];\n    var bBox = getBBox(elements);\n\n    return {\n      position: {\n        left: bBox.x + bBox.width + CONTEXT_PAD_PADDING,\n        top: bBox.y - CONTEXT_PAD_PADDING / 2\n      }\n    };\n  };\n\n\n  // helpers //////////\n\n  function addClasses$1(element, classNames) {\n    var classes = classes$1(element);\n\n    classNames = isArray$3(classNames) ? classNames : classNames.split(/\\s+/g);\n\n    classNames.forEach(function(cls) {\n      classes.add(cls);\n    });\n  }\n\n  /**\n   * @param {any[]} array\n   * @param {any} item\n   *\n   * @return {boolean}\n   */\n  function includes$8(array, item) {\n    return array.indexOf(item) !== -1;\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var ContextPadModule$1 = {\n    __depends__: [\n      InteractionEventsModule$1,\n      OverlaysModule\n    ],\n    contextPad: [ 'type', ContextPad ]\n  };\n\n  var n$1,l$1,u$1,t$2,o$1,f$1={},e$2=[],c$1=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function s$1(n,l){for(var u in l)n[u]=l[u];return n}function a$1(n){var l=n.parentNode;l&&l.removeChild(n);}function h$1(l,u,i){var t,o,r,f={};for(r in u)\"key\"==r?t=u[r]:\"ref\"==r?o=u[r]:f[r]=u[r];if(arguments.length>2&&(f.children=arguments.length>3?n$1.call(arguments,2):i),\"function\"==typeof l&&null!=l.defaultProps)for(r in l.defaultProps)void 0===f[r]&&(f[r]=l.defaultProps[r]);return v$1(l,f,t,o,null)}function v$1(n,i,t,o,r){var f={type:n,props:i,key:t,ref:o,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==r?++u$1:r};return null==r&&null!=l$1.vnode&&l$1.vnode(f),f}function p$1(n){return n.children}function d$1(n,l){this.props=n,this.context=l;}function _$1(n,l){if(null==l)return n.__?_$1(n.__,n.__.__k.indexOf(n)+1):null;for(var u;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e)return u.__e;return \"function\"==typeof n.type?_$1(n):null}function k$1(n){var l,u;if(null!=(n=n.__)&&null!=n.__c){for(n.__e=n.__c.base=null,l=0;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e){n.__e=n.__c.base=u.__e;break}return k$1(n)}}function b$1(n){(!n.__d&&(n.__d=!0)&&t$2.push(n)&&!g$1.__r++||o$1!==l$1.debounceRendering)&&((o$1=l$1.debounceRendering)||setTimeout)(g$1);}function g$1(){for(var n;g$1.__r=t$2.length;)n=t$2.sort(function(n,l){return n.__v.__b-l.__v.__b}),t$2=[],n.some(function(n){var l,u,i,t,o,r;n.__d&&(o=(t=(l=n).__v).__e,(r=l.__P)&&(u=[],(i=s$1({},t)).__v=t.__v+1,j$1(r,t,i,l.__n,void 0!==r.ownerSVGElement,null!=t.__h?[o]:null,u,null==o?_$1(t):o,t.__h),z$1(u,t),t.__e!=o&&k$1(t)));});}function w$1(n,l,u,i,t,o,r,c,s,a){var h,y,d,k,b,g,w,x=i&&i.__k||e$2,C=x.length;for(u.__k=[],h=0;h<l.length;h++)if(null!=(k=u.__k[h]=null==(k=l[h])||\"boolean\"==typeof k?null:\"string\"==typeof k||\"number\"==typeof k||\"bigint\"==typeof k?v$1(null,k,null,null,k):Array.isArray(k)?v$1(p$1,{children:k},null,null,null):k.__b>0?v$1(k.type,k.props,k.key,k.ref?k.ref:null,k.__v):k)){if(k.__=u,k.__b=u.__b+1,null===(d=x[h])||d&&k.key==d.key&&k.type===d.type)x[h]=void 0;else for(y=0;y<C;y++){if((d=x[y])&&k.key==d.key&&k.type===d.type){x[y]=void 0;break}d=null;}j$1(n,k,d=d||f$1,t,o,r,c,s,a),b=k.__e,(y=k.ref)&&d.ref!=y&&(w||(w=[]),d.ref&&w.push(d.ref,null,k),w.push(y,k.__c||b,k)),null!=b?(null==g&&(g=b),\"function\"==typeof k.type&&k.__k===d.__k?k.__d=s=m$2(k,s,n):s=A(n,k,d,x,b,s),\"function\"==typeof u.type&&(u.__d=s)):s&&d.__e==s&&s.parentNode!=n&&(s=_$1(d));}for(u.__e=g,h=C;h--;)null!=x[h]&&N(x[h],x[h]);if(w)for(h=0;h<w.length;h++)M(w[h],w[++h],w[++h]);}function m$2(n,l,u){for(var i,t=n.__k,o=0;t&&o<t.length;o++)(i=t[o])&&(i.__=n,l=\"function\"==typeof i.type?m$2(i,l,u):A(u,i,i,t,i.__e,l));return l}function A(n,l,u,i,t,o){var r,f,e;if(void 0!==l.__d)r=l.__d,l.__d=void 0;else if(null==u||t!=o||null==t.parentNode)n:if(null==o||o.parentNode!==n)n.appendChild(t),r=null;else {for(f=o,e=0;(f=f.nextSibling)&&e<i.length;e+=1)if(f==t)break n;n.insertBefore(t,o),r=o;}return void 0!==r?r:t.nextSibling}function C(n,l,u,i,t){var o;for(o in u)\"children\"===o||\"key\"===o||o in l||H(n,o,null,u[o],i);for(o in l)t&&\"function\"!=typeof l[o]||\"children\"===o||\"key\"===o||\"value\"===o||\"checked\"===o||u[o]===l[o]||H(n,o,l[o],u[o],i);}function $(n,l,u){\"-\"===l[0]?n.setProperty(l,u):n[l]=null==u?\"\":\"number\"!=typeof u||c$1.test(l)?u:u+\"px\";}function H(n,l,u,i,t){var o;n:if(\"style\"===l)if(\"string\"==typeof u)n.style.cssText=u;else {if(\"string\"==typeof i&&(n.style.cssText=i=\"\"),i)for(l in i)u&&l in u||$(n.style,l,\"\");if(u)for(l in u)i&&u[l]===i[l]||$(n.style,l,u[l]);}else if(\"o\"===l[0]&&\"n\"===l[1])o=l!==(l=l.replace(/Capture$/,\"\")),l=l.toLowerCase()in n?l.toLowerCase().slice(2):l.slice(2),n.l||(n.l={}),n.l[l+o]=u,u?i||n.addEventListener(l,o?T$1:I,o):n.removeEventListener(l,o?T$1:I,o);else if(\"dangerouslySetInnerHTML\"!==l){if(t)l=l.replace(/xlink(H|:h)/,\"h\").replace(/sName$/,\"s\");else if(\"href\"!==l&&\"list\"!==l&&\"form\"!==l&&\"tabIndex\"!==l&&\"download\"!==l&&l in n)try{n[l]=null==u?\"\":u;break n}catch(n){}\"function\"==typeof u||(null==u||!1===u&&-1==l.indexOf(\"-\")?n.removeAttribute(l):n.setAttribute(l,u));}}function I(n){this.l[n.type+!1](l$1.event?l$1.event(n):n);}function T$1(n){this.l[n.type+!0](l$1.event?l$1.event(n):n);}function j$1(n,u,i,t,o,r,f,e,c){var a,h,v,y,_,k,b,g,m,x,A,C,$,H,I,T=u.type;if(void 0!==u.constructor)return null;null!=i.__h&&(c=i.__h,e=u.__e=i.__e,u.__h=null,r=[e]),(a=l$1.__b)&&a(u);try{n:if(\"function\"==typeof T){if(g=u.props,m=(a=T.contextType)&&t[a.__c],x=a?m?m.props.value:a.__:t,i.__c?b=(h=u.__c=i.__c).__=h.__E:(\"prototype\"in T&&T.prototype.render?u.__c=h=new T(g,x):(u.__c=h=new d$1(g,x),h.constructor=T,h.render=O),m&&m.sub(h),h.props=g,h.state||(h.state={}),h.context=x,h.__n=t,v=h.__d=!0,h.__h=[],h._sb=[]),null==h.__s&&(h.__s=h.state),null!=T.getDerivedStateFromProps&&(h.__s==h.state&&(h.__s=s$1({},h.__s)),s$1(h.__s,T.getDerivedStateFromProps(g,h.__s))),y=h.props,_=h.state,v)null==T.getDerivedStateFromProps&&null!=h.componentWillMount&&h.componentWillMount(),null!=h.componentDidMount&&h.__h.push(h.componentDidMount);else {if(null==T.getDerivedStateFromProps&&g!==y&&null!=h.componentWillReceiveProps&&h.componentWillReceiveProps(g,x),!h.__e&&null!=h.shouldComponentUpdate&&!1===h.shouldComponentUpdate(g,h.__s,x)||u.__v===i.__v){for(h.props=g,h.state=h.__s,u.__v!==i.__v&&(h.__d=!1),h.__v=u,u.__e=i.__e,u.__k=i.__k,u.__k.forEach(function(n){n&&(n.__=u);}),A=0;A<h._sb.length;A++)h.__h.push(h._sb[A]);h._sb=[],h.__h.length&&f.push(h);break n}null!=h.componentWillUpdate&&h.componentWillUpdate(g,h.__s,x),null!=h.componentDidUpdate&&h.__h.push(function(){h.componentDidUpdate(y,_,k);});}if(h.context=x,h.props=g,h.__v=u,h.__P=n,C=l$1.__r,$=0,\"prototype\"in T&&T.prototype.render){for(h.state=h.__s,h.__d=!1,C&&C(u),a=h.render(h.props,h.state,h.context),H=0;H<h._sb.length;H++)h.__h.push(h._sb[H]);h._sb=[];}else do{h.__d=!1,C&&C(u),a=h.render(h.props,h.state,h.context),h.state=h.__s;}while(h.__d&&++$<25);h.state=h.__s,null!=h.getChildContext&&(t=s$1(s$1({},t),h.getChildContext())),v||null==h.getSnapshotBeforeUpdate||(k=h.getSnapshotBeforeUpdate(y,_)),I=null!=a&&a.type===p$1&&null==a.key?a.props.children:a,w$1(n,Array.isArray(I)?I:[I],u,i,t,o,r,f,e,c),h.base=u.__e,u.__h=null,h.__h.length&&f.push(h),b&&(h.__E=h.__=null),h.__e=!1;}else null==r&&u.__v===i.__v?(u.__k=i.__k,u.__e=i.__e):u.__e=L(i.__e,u,i,t,o,r,f,c);(a=l$1.diffed)&&a(u);}catch(n){u.__v=null,(c||null!=r)&&(u.__e=e,u.__h=!!c,r[r.indexOf(e)]=null),l$1.__e(n,u,i);}}function z$1(n,u){l$1.__c&&l$1.__c(u,n),n.some(function(u){try{n=u.__h,u.__h=[],n.some(function(n){n.call(u);});}catch(n){l$1.__e(n,u.__v);}});}function L(l,u,i,t,o,r,e,c){var s,h,v,y=i.props,p=u.props,d=u.type,k=0;if(\"svg\"===d&&(o=!0),null!=r)for(;k<r.length;k++)if((s=r[k])&&\"setAttribute\"in s==!!d&&(d?s.localName===d:3===s.nodeType)){l=s,r[k]=null;break}if(null==l){if(null===d)return document.createTextNode(p);l=o?document.createElementNS(\"http://www.w3.org/2000/svg\",d):document.createElement(d,p.is&&p),r=null,c=!1;}if(null===d)y===p||c&&l.data===p||(l.data=p);else {if(r=r&&n$1.call(l.childNodes),h=(y=i.props||f$1).dangerouslySetInnerHTML,v=p.dangerouslySetInnerHTML,!c){if(null!=r)for(y={},k=0;k<l.attributes.length;k++)y[l.attributes[k].name]=l.attributes[k].value;(v||h)&&(v&&(h&&v.__html==h.__html||v.__html===l.innerHTML)||(l.innerHTML=v&&v.__html||\"\"));}if(C(l,p,y,o,c),v)u.__k=[];else if(k=u.props.children,w$1(l,Array.isArray(k)?k:[k],u,i,t,o&&\"foreignObject\"!==d,r,e,r?r[0]:i.__k&&_$1(i,0),c),null!=r)for(k=r.length;k--;)null!=r[k]&&a$1(r[k]);c||(\"value\"in p&&void 0!==(k=p.value)&&(k!==l.value||\"progress\"===d&&!k||\"option\"===d&&k!==y.value)&&H(l,\"value\",k,y.value,!1),\"checked\"in p&&void 0!==(k=p.checked)&&k!==l.checked&&H(l,\"checked\",k,y.checked,!1));}return l}function M(n,u,i){try{\"function\"==typeof n?n(u):n.current=u;}catch(n){l$1.__e(n,i);}}function N(n,u,i){var t,o;if(l$1.unmount&&l$1.unmount(n),(t=n.ref)&&(t.current&&t.current!==n.__e||M(t,null,u)),null!=(t=n.__c)){if(t.componentWillUnmount)try{t.componentWillUnmount();}catch(n){l$1.__e(n,u);}t.base=t.__P=null,n.__c=void 0;}if(t=n.__k)for(o=0;o<t.length;o++)t[o]&&N(t[o],u,i||\"function\"!=typeof n.type);i||null==n.__e||a$1(n.__e),n.__=n.__e=n.__d=void 0;}function O(n,l,u){return this.constructor(n,u)}function P(u,i,t){var o,r,e;l$1.__&&l$1.__(u,i),r=(o=\"function\"==typeof t)?null:t&&t.__k||i.__k,e=[],j$1(i,u=(!o&&t||i).__k=h$1(p$1,null,[u]),r||f$1,f$1,void 0!==i.ownerSVGElement,!o&&t?[t]:r?null:i.firstChild?n$1.call(i.childNodes):null,e,!o&&t?t:r?r.__e:i.firstChild,o),z$1(e,u);}n$1=e$2.slice,l$1={__e:function(n,l,u,i){for(var t,o,r;l=l.__;)if((t=l.__c)&&!t.__)try{if((o=t.constructor)&&null!=o.getDerivedStateFromError&&(t.setState(o.getDerivedStateFromError(n)),r=t.__d),null!=t.componentDidCatch&&(t.componentDidCatch(n,i||{}),r=t.__d),r)return t.__E=t}catch(l){n=l;}throw n}},u$1=0,d$1.prototype.setState=function(n,l){var u;u=null!=this.__s&&this.__s!==this.state?this.__s:this.__s=s$1({},this.state),\"function\"==typeof n&&(n=n(s$1({},u),this.props)),n&&s$1(u,n),null!=n&&this.__v&&(l&&this._sb.push(l),b$1(this));},d$1.prototype.forceUpdate=function(n){this.__v&&(this.__e=!0,n&&this.__h.push(n),b$1(this));},d$1.prototype.render=p$1,t$2=[],g$1.__r=0;\n\n  var n=function(t,s,r,e){var u;s[0]=0;for(var h=1;h<s.length;h++){var p=s[h++],a=s[h]?(s[0]|=p?1:2,r[s[h++]]):s[++h];3===p?e[0]=a:4===p?e[1]=Object.assign(e[1]||{},a):5===p?(e[1]=e[1]||{})[s[++h]]=a:6===p?e[1][s[++h]]+=a+\"\":p?(u=t.apply(a,n(t,a,r,[\"\",null])),e.push(u),a[0]?s[0]|=2:(s[h-2]=0,s[h]=u)):e.push(a);}return e},t$1=new Map;function e$1(s){var r=t$1.get(this);return r||(r=new Map,t$1.set(this,r)),(r=n(this,r.get(s)||(r.set(s,r=function(n){for(var t,s,r=1,e=\"\",u=\"\",h=[0],p=function(n){1===r&&(n||(e=e.replace(/^\\s*\\n\\s*|\\s*\\n\\s*$/g,\"\")))?h.push(0,n,e):3===r&&(n||e)?(h.push(3,n,e),r=2):2===r&&\"...\"===e&&n?h.push(4,n,0):2===r&&e&&!n?h.push(5,0,!0,e):r>=5&&((e||!n&&5===r)&&(h.push(r,0,e,s),r=6),n&&(h.push(r,n,0,s),r=6)),e=\"\";},a=0;a<n.length;a++){a&&(1===r&&p(),p(a));for(var l=0;l<n[a].length;l++)t=n[a][l],1===r?\"<\"===t?(p(),h=[h],r=3):e+=t:4===r?\"--\"===e&&\">\"===t?(r=1,e=\"\"):e=t+e[0]:u?t===u?u=\"\":e+=t:'\"'===t||\"'\"===t?u=t:\">\"===t?(p(),r=1):r&&(\"=\"===t?(r=5,s=e,e=\"\"):\"/\"===t&&(r<5||\">\"===n[a][l+1])?(p(),3===r&&(h=h[0]),r=h,(h=h[0]).push(2,0,r),r=0):\" \"===t||\"\\t\"===t||\"\\n\"===t||\"\\r\"===t?(p(),r=2):e+=t),3===r&&\"!--\"===e&&(r=4,h=h[0]);}return p(),h}(s)),r),arguments,[])).length>1?r:r[0]}\n\n  var m$1=e$1.bind(h$1);\n\n  var t,r$1,u,i,o=0,f=[],c=[],e=l$1.__b,a=l$1.__r,v=l$1.diffed,l=l$1.__c,m=l$1.unmount;function d(t,u){l$1.__h&&l$1.__h(r$1,t,o||u),o=0;var i=r$1.__H||(r$1.__H={__:[],__h:[]});return t>=i.__.length&&i.__.push({__V:c}),i.__[t]}function p(n){return o=1,y(B,n)}function y(n,u,i){var o=d(t++,2);if(o.t=n,!o.__c&&(o.__=[i?i(u):B(void 0,u),function(n){var t=o.__N?o.__N[0]:o.__[0],r=o.t(t,n);t!==r&&(o.__N=[r,o.__[1]],o.__c.setState({}));}],o.__c=r$1,!r$1.u)){r$1.u=!0;var f=r$1.shouldComponentUpdate;r$1.shouldComponentUpdate=function(n,t,r){if(!o.__c.__H)return !0;var u=o.__c.__H.__.filter(function(n){return n.__c});if(u.every(function(n){return !n.__N}))return !f||f.call(this,n,t,r);var i=!1;return u.forEach(function(n){if(n.__N){var t=n.__[0];n.__=n.__N,n.__N=void 0,t!==n.__[0]&&(i=!0);}}),!(!i&&o.__c.props===n)&&(!f||f.call(this,n,t,r))};}return o.__N||o.__}function h(u,i){var o=d(t++,3);!l$1.__s&&z(o.__H,i)&&(o.__=u,o.i=i,r$1.__H.__h.push(o));}function s(u,i){var o=d(t++,4);!l$1.__s&&z(o.__H,i)&&(o.__=u,o.i=i,r$1.__h.push(o));}function _(n){return o=5,F(function(){return {current:n}},[])}function F(n,r){var u=d(t++,7);return z(u.__H,r)?(u.__V=n(),u.i=r,u.__h=n,u.__V):u.__}function T(n,t){return o=8,F(function(){return n},t)}function b(){for(var t;t=f.shift();)if(t.__P&&t.__H)try{t.__H.__h.forEach(k),t.__H.__h.forEach(w),t.__H.__h=[];}catch(r){t.__H.__h=[],l$1.__e(r,t.__v);}}l$1.__b=function(n){r$1=null,e&&e(n);},l$1.__r=function(n){a&&a(n),t=0;var i=(r$1=n.__c).__H;i&&(u===r$1?(i.__h=[],r$1.__h=[],i.__.forEach(function(n){n.__N&&(n.__=n.__N),n.__V=c,n.__N=n.i=void 0;})):(i.__h.forEach(k),i.__h.forEach(w),i.__h=[])),u=r$1;},l$1.diffed=function(t){v&&v(t);var o=t.__c;o&&o.__H&&(o.__H.__h.length&&(1!==f.push(o)&&i===l$1.requestAnimationFrame||((i=l$1.requestAnimationFrame)||j)(b)),o.__H.__.forEach(function(n){n.i&&(n.__H=n.i),n.__V!==c&&(n.__=n.__V),n.i=void 0,n.__V=c;})),u=r$1=null;},l$1.__c=function(t,r){r.some(function(t){try{t.__h.forEach(k),t.__h=t.__h.filter(function(n){return !n.__||w(n)});}catch(u){r.some(function(n){n.__h&&(n.__h=[]);}),r=[],l$1.__e(u,t.__v);}}),l&&l(t,r);},l$1.unmount=function(t){m&&m(t);var r,u=t.__c;u&&u.__H&&(u.__H.__.forEach(function(n){try{k(n);}catch(n){r=n;}}),u.__H=void 0,r&&l$1.__e(r,u.__v));};var g=\"function\"==typeof requestAnimationFrame;function j(n){var t,r=function(){clearTimeout(u),g&&cancelAnimationFrame(t),setTimeout(n);},u=setTimeout(r,100);g&&(t=requestAnimationFrame(r));}function k(n){var t=r$1,u=n.__c;\"function\"==typeof u&&(n.__c=void 0,u()),r$1=t;}function w(n){var t=r$1;n.__c=n.__(),r$1=t;}function z(n,t){return !n||n.length!==t.length||t.some(function(t,r){return t!==n[r]})}function B(n,t){return \"function\"==typeof t?t(n):t}\n\n  function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e))for(t=0;t<e.length;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f);else for(t in e)e[t]&&(n&&(n+=\" \"),n+=t);return n}function clsx(){for(var e,t,f=0,n=\"\";f<arguments.length;)(e=arguments[f++])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}\n\n  /**\n   * @typedef {import('./PopupMenuProvider').PopupMenuEntry} PopupMenuEntry\n   */\n\n  /**\n   * Component that renders a popup menu entry.\n   *\n   * @param {Object} props\n   * @param {string} props.key\n   * @param {PopupMenuEntry} props.entry\n   * @param {boolean} props.selected\n   * @param {(event: MouseEvent) => void} props.onMouseEnter\n   * @param {(event: MouseEvent) => void} props.onMouseLeave\n   * @param {(event: MouseEvent, entry?: PopupMenuEntry, action?: string) => void} props.onAction\n   */\n  function PopupMenuItem(props) {\n    const {\n      entry,\n      selected,\n      onMouseEnter,\n      onMouseLeave,\n      onAction\n    } = props;\n\n    return m$1`\n    <li\n      class=${ clsx('entry', { selected }) }\n      data-id=${ entry.id }\n      title=${ entry.title || entry.label }\n      onClick=${ onAction }\n      onMouseEnter=${ onMouseEnter }\n      onMouseLeave=${ onMouseLeave }\n      onDragStart=${ (event) => onAction(event, entry, 'dragstart') }\n      draggable=${ true }\n    >\n      <div class=\"djs-popup-entry-content\">\n        <span\n          class=${ clsx('djs-popup-entry-name', entry.className) }\n        >\n          ${(entry.imageUrl && m$1`<img class=\"djs-popup-entry-icon\" src=${ entry.imageUrl } alt=\"\" />`) ||\n            (entry.imageHtml && m$1`<div class=\"djs-popup-entry-icon\" dangerouslySetInnerHTML=${ { __html: entry.imageHtml } } />`)}\n\n          ${ entry.label ? m$1`\n            <span class=\"djs-popup-label\">\n              ${ entry.label }\n            </span>\n          ` : null }\n        </span>\n        ${ entry.description && m$1`\n          <span\n            class=\"djs-popup-entry-description\"\n            title=${ entry.description }\n          >\n            ${ entry.description }\n          </span>\n        ` }\n      </div>\n      ${ entry.documentationRef && m$1`\n        <div class=\"djs-popup-entry-docs\">\n          <a\n            href=\"${ entry.documentationRef }\"\n            onClick=${ (event) => event.stopPropagation() }\n            title=\"Open element documentation\"\n            target=\"_blank\"\n            rel=\"noopener\"\n          >\n            <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n              <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M10.6368 10.6375V5.91761H11.9995V10.6382C11.9995 10.9973 11.8623 11.3141 11.5878 11.5885C11.3134 11.863 10.9966 12.0002 10.6375 12.0002H1.36266C0.982345 12.0002 0.660159 11.8681 0.396102 11.6041C0.132044 11.34 1.52588e-05 11.0178 1.52588e-05 10.6375V1.36267C1.52588e-05 0.98236 0.132044 0.660173 0.396102 0.396116C0.660159 0.132058 0.982345 2.95639e-05 1.36266 2.95639e-05H5.91624V1.36267H1.36266V10.6375H10.6368ZM12 0H7.2794L7.27873 1.36197H9.68701L3.06507 7.98391L4.01541 8.93425L10.6373 2.31231V4.72059H12V0Z\" fill=\"#818798\"/>\n            </svg>\n          </a>\n        </div>\n      ` }\n    </li>\n  `;\n  }\n\n  /**\n   * @typedef {import('./PopupMenuProvider').PopupMenuEntry} PopupMenuEntry\n   */\n\n  /**\n   * Component that renders a popup menu entry list.\n   *\n   * @param {Object} props\n   * @param {PopupMenuEntry[]} props.entries\n   * @param {PopupMenuEntry} props.selectedEntry\n   * @param {(entry: PopupMenuEntry | null) => void} props.setSelectedEntry\n   */\n  function PopupMenuList(props) {\n    const {\n      selectedEntry,\n      setSelectedEntry,\n      entries,\n      ...restProps\n    } = props;\n\n    const resultsRef = _();\n\n    const groups = F(() => groupEntries(entries), [ entries ]);\n\n    // scroll to selected result\n    s(() => {\n      const containerEl = resultsRef.current;\n\n      if (!containerEl)\n        return;\n\n      const selectedEl = containerEl.querySelector('.selected');\n\n      if (selectedEl) {\n        scrollIntoView(selectedEl);\n      }\n    }, [ selectedEntry ]);\n\n    return m$1`\n    <div class=\"djs-popup-results\" ref=${ resultsRef }>\n      ${ groups.map(group => m$1`\n        ${ group.name && m$1`\n          <div key=${ group.id } class=\"entry-header\" title=${ group.name }>\n            ${ group.name }\n          </div>\n        ` }\n        <ul class=\"djs-popup-group\" data-group=${ group.id }>\n          ${ group.entries.map(entry => m$1`\n            <${PopupMenuItem}\n              key=${ entry.id }\n              entry=${ entry }\n              selected=${ entry === selectedEntry }\n              onMouseEnter=${ () => setSelectedEntry(entry) }\n              onMouseLeave=${ () => setSelectedEntry(null) }\n              ...${ restProps }\n            />\n          `) }\n        </ul>\n      `) }\n    </div>\n  `;\n  }\n\n\n  // helpers\n  function groupEntries(entries) {\n    const groups = [];\n\n    const getGroup = group => groups.find(elem => group.id === elem.id);\n\n    const containsGroup = group => !!getGroup(group);\n\n    // legacy support for provider built for the old popUp menu\n    const formatGroup = group =>\n      typeof group === 'string' ? { id: group } : group;\n\n    entries.forEach(entry => {\n\n      // assume a default group when none is provided\n      const group = entry.group ? formatGroup(entry.group) : { id: 'default' };\n\n      if (!containsGroup(group)) {\n        groups.push({ ...group, entries: [ entry ] });\n      } else {\n        getGroup(group).entries.push(entry);\n      }\n    });\n\n    return groups;\n  }\n\n  // helpers ////////////////\n\n  function scrollIntoView(el) {\n    if (typeof el.scrollIntoViewIfNeeded === 'function') {\n      el.scrollIntoViewIfNeeded();\n    } else {\n      el.scrollIntoView({\n        scrollMode: 'if-needed',\n        block: 'nearest'\n      });\n    }\n  }\n\n  /**\n   * @typedef {import('./PopupMenuProvider').PopupMenuEntry} PopupMenuEntry\n   * @typedef {import('./PopupMenuProvider').PopupMenuHeaderEntry} PopupMenuHeaderEntry\n   *\n   * @typedef {import('../../util/Types').Point} Point\n   */\n\n  /**\n   * A component that renders the popup menus.\n   *\n   * @param {Object} props\n   * @param {() => void} props.onClose\n   * @param {(element: HTMLElement) => Point} props.position\n   * @param {string} props.className\n   * @param {PopupMenuEntry[]} props.entries\n   * @param {PopupMenuHeaderEntry[]} props.headerEntries\n   * @param {number} props.scale\n   * @param {string} [props.title]\n   * @param {boolean} [props.search]\n   * @param {number} [props.width]\n   */\n  function PopupMenuComponent(props) {\n    const {\n      onClose,\n      onSelect,\n      className,\n      headerEntries,\n      position,\n      title,\n      width,\n      scale,\n      search,\n      entries: originalEntries,\n      onOpened,\n      onClosed\n    } = props;\n\n    const searchable = F(() => {\n      if (!isDefined(search)) {\n        return false;\n      }\n\n      return originalEntries.length > 5;\n    }, [ search, originalEntries ]);\n\n    const inputRef = _();\n\n    const [ value, setValue ] = p('');\n\n    const filterEntries = T((originalEntries, value) => {\n\n      if (!searchable) {\n        return originalEntries;\n      }\n\n      const filter = entry => {\n        if (!value) {\n          return (entry.rank || 0) >= 0;\n        }\n\n        const search = [\n          entry.description || '',\n          entry.label || '',\n          entry.search || ''\n        ]\n          .join('---')\n          .toLowerCase();\n\n        return value\n          .toLowerCase()\n          .split(/\\s/g)\n          .every(term => search.includes(term));\n      };\n\n      return originalEntries.filter(filter);\n    }, [ searchable ]);\n\n    const [ entries, setEntries ] = p(filterEntries(originalEntries, value));\n    const [ selectedEntry, setSelectedEntry ] = p(entries[0]);\n\n    const updateEntries = T((newEntries) => {\n\n      // select first entry if non is selected\n      if (!selectedEntry || !newEntries.includes(selectedEntry)) {\n        setSelectedEntry(newEntries[0]);\n      }\n\n      setEntries(newEntries);\n    }, [ selectedEntry, setEntries, setSelectedEntry ]);\n\n    // filter entries on value change\n    h(() => {\n      updateEntries(filterEntries(originalEntries, value));\n    }, [ value, originalEntries ]);\n\n    // register global <Escape> handler\n    h(() => {\n      const handleKeyDown = event => {\n        if (event.key === 'Escape') {\n          event.preventDefault();\n\n          return onClose();\n        }\n      };\n\n      document.documentElement.addEventListener('keydown', handleKeyDown);\n\n      return () => {\n        document.documentElement.removeEventListener('keydown', handleKeyDown);\n      };\n    }, []);\n\n    // focus input on initial mount\n    s(() => {\n      inputRef.current && inputRef.current.focus();\n    }, []);\n\n    // handle keyboard seleciton\n    const keyboardSelect = T(direction => {\n      const idx = entries.indexOf(selectedEntry);\n\n      let nextIdx = idx + direction;\n\n      if (nextIdx < 0) {\n        nextIdx = entries.length - 1;\n      }\n\n      if (nextIdx >= entries.length) {\n        nextIdx = 0;\n      }\n\n      setSelectedEntry(entries[nextIdx]);\n    }, [ entries, selectedEntry, setSelectedEntry ]);\n\n    const handleKeyDown = T(event => {\n      if (event.key === 'Enter' && selectedEntry) {\n        return onSelect(event, selectedEntry);\n      }\n\n      // ARROW_UP or SHIFT + TAB navigation\n      if (event.key === 'ArrowUp' || (event.key === 'Tab' && event.shiftKey)) {\n        keyboardSelect(-1);\n\n        return event.preventDefault();\n      }\n\n      // ARROW_DOWN or TAB navigation\n      if (event.key === 'ArrowDown' || event.key === 'Tab') {\n        keyboardSelect(1);\n\n        return event.preventDefault();\n      }\n    }, [ onSelect, onClose, selectedEntry, keyboardSelect ]);\n\n    const handleKey = T(event => {\n      if (matches(event.target, 'input')) {\n        setValue(() => event.target.value);\n      }\n    }, [ setValue ]);\n\n    h(() => {\n      onOpened();\n\n      return () => {\n        onClosed();\n      };\n    }, []);\n\n    const displayHeader = F(() => title || headerEntries.length > 0, [ title, headerEntries ]);\n\n    return m$1`\n    <${PopupMenuWrapper}\n      onClose=${ onClose }\n      onKeyup=${ handleKey }\n      onKeydown=${ handleKeyDown }\n      className=${ className }\n      position=${position}\n      width=${ width }\n      scale=${ scale }\n    >\n      ${ displayHeader && m$1`\n        <div class=\"djs-popup-header\">\n          <h3 class=\"djs-popup-title\" title=${ title }>${ title }</h3>\n          ${ headerEntries.map(entry => m$1`\n            <span\n              class=${ getHeaderClasses(entry, entry === selectedEntry) }\n              onClick=${ event => onSelect(event, entry) }\n              title=${ entry.title || entry.label }\n              data-id=${ entry.id }\n              onMouseEnter=${ () => setSelectedEntry(entry) }\n              onMouseLeave=${ () => setSelectedEntry(null) }\n            >\n              ${ entry.imageUrl ? m$1`\n                <img class=\"djs-popup-entry-icon\" src=${ entry.imageUrl } alt=\"\" />\n              ` : null }\n\n              ${ entry.label ? m$1`\n                <span class=\"djs-popup-label\">${ entry.label }</span>\n              ` : null }\n            </span>\n          `) }\n        </div>\n      ` }\n      ${ originalEntries.length > 0 && m$1`\n        <div class=\"djs-popup-body\">\n\n          ${ searchable && m$1`\n          <div class=\"djs-popup-search\">\n            <svg class=\"djs-popup-search-icon\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n              <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M9.0325 8.5H9.625L13.3675 12.25L12.25 13.3675L8.5 9.625V9.0325L8.2975 8.8225C7.4425 9.5575 6.3325 10 5.125 10C2.4325 10 0.25 7.8175 0.25 5.125C0.25 2.4325 2.4325 0.25 5.125 0.25C7.8175 0.25 10 2.4325 10 5.125C10 6.3325 9.5575 7.4425 8.8225 8.2975L9.0325 8.5ZM1.75 5.125C1.75 6.9925 3.2575 8.5 5.125 8.5C6.9925 8.5 8.5 6.9925 8.5 5.125C8.5 3.2575 6.9925 1.75 5.125 1.75C3.2575 1.75 1.75 3.2575 1.75 5.125Z\" fill=\"#22242A\"/>\n            </svg>\n            <input\n                ref=${ inputRef }\n                type=\"text\"\n              />\n          </div>\n          ` }\n\n          <${PopupMenuList}\n            entries=${ entries }\n            selectedEntry=${ selectedEntry }\n            setSelectedEntry=${ setSelectedEntry }\n            onAction=${ onSelect }\n          />\n        </div>\n        ${ entries.length === 0 && m$1`\n          <div class=\"djs-popup-no-results\">No matching entries found.</div>\n        ` }\n      ` }\n    </${PopupMenuWrapper}>\n  `;\n  }\n\n  /**\n   * A component that wraps the popup menu.\n   *\n   * @param {*} props\n   */\n  function PopupMenuWrapper(props) {\n    const {\n      onClose,\n      onKeydown,\n      onKeyup,\n      className,\n      children,\n      position: positionGetter\n    } = props;\n\n    const popupRef = _();\n\n    const checkClose = T((event) => {\n\n      const popup = closest(event.target, '.djs-popup', true);\n\n      if (popup) {\n        return;\n      }\n\n      onClose();\n    }, [ onClose ]);\n\n    s(() => {\n      if (typeof positionGetter !== 'function') {\n        return;\n      }\n\n      const popupEl = popupRef.current;\n      const position = positionGetter(popupEl);\n\n      popupEl.style.left = `${position.x}px`;\n      popupEl.style.top = `${position.y}px`;\n    }, [ popupRef.current, positionGetter ]);\n\n    // focus popup initially, on mount\n    s(() => {\n      popupRef.current && popupRef.current.focus();\n    }, []);\n\n    return m$1`\n    <div\n      class=\"djs-popup-backdrop\"\n      onClick=${ checkClose }\n    >\n      <div\n        class=${ clsx('djs-popup', className) }\n        style=${ getPopupStyle(props) }\n        onKeydown=${ onKeydown }\n        onKeyup=${ onKeyup }\n        ref=${ popupRef }\n        tabIndex=\"-1\"\n      >\n        ${children}\n      </div>\n    </div>\n  `;\n  }\n\n  // helpers //////////////////////\n\n  function getPopupStyle(props) {\n    return {\n      transform: `scale(${props.scale})`,\n      width: `${props.width}px`\n    };\n  }\n\n  function getHeaderClasses(entry, selected) {\n    return clsx(\n      'entry',\n      entry.className,\n      entry.active ? 'active' : '',\n      entry.disabled ? 'disabled' : '',\n      selected ? 'selected' : ''\n    );\n  }\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   *\n   * @typedef {import('../../util/Types').Point} Point\n   *\n   * @typedef {import('./PopupMenuProvider').PopupMenuEntries} PopupMenuEntries\n   * @typedef {import('./PopupMenuProvider').PopupMenuEntry} PopupMenuEntry\n   * @typedef {import('./PopupMenuProvider').PopupMenuHeaderEntries} PopupMenuHeaderEntries\n   * @typedef {import('./PopupMenuProvider').PopupMenuHeaderEntry} PopupMenuHeaderEntry\n   * @typedef {import('./PopupMenuProvider').default} PopupMenuProvider\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef { {\n   *   scale?: {\n   *     min?: number;\n   *     max?: number;\n   *   } | boolean;\n   * } } PopupMenuConfig\n   *\n   * @typedef {Element|Element[]} PopupMenuTarget;\n   */\n\n  var DATA_REF = 'data-id';\n\n  var CLOSE_EVENTS = [\n    'contextPad.close',\n    'canvas.viewbox.changing',\n    'commandStack.changed'\n  ];\n\n  var DEFAULT_PRIORITY$1 = 1000;\n\n  /**\n   * A popup menu to show a number of actions on the canvas.\n   *\n   * @param {PopupMenuConfig} config\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   */\n  function PopupMenu(config, eventBus, canvas) {\n    this._eventBus = eventBus;\n    this._canvas = canvas;\n\n    this._current = null;\n\n    var scale = isDefined(config && config.scale) ? config.scale : {\n      min: 1,\n      max: 1.5\n    };\n\n    this._config = {\n      scale: scale\n    };\n\n\n    eventBus.on('diagram.destroy', () => {\n      this.close();\n    });\n\n    eventBus.on('element.changed', event => {\n\n      const element = this.isOpen() && this._current.target;\n\n      if (event.element === element) {\n        this._render();\n      }\n    });\n\n  }\n\n  PopupMenu.$inject = [\n    'config.popupMenu',\n    'eventBus',\n    'canvas'\n  ];\n\n  PopupMenu.prototype._render = function() {\n\n    const {\n      position: _position,\n      className,\n      entries,\n      headerEntries,\n      options\n    } = this._current;\n\n    const entriesArray = Object.entries(entries).map(\n      ([ key, value ]) => ({ id: key, ...value })\n    );\n\n    const headerEntriesArray = Object.entries(headerEntries).map(\n      ([ key, value ]) => ({ id: key, ...value })\n    );\n\n    const position = _position && (\n      (container) => this._ensureVisible(container, _position)\n    );\n\n    const scale = this._updateScale(this._current.container);\n\n    const onClose = result => this.close(result);\n    const onSelect = (event, entry, action) => this.trigger(event, entry, action);\n\n    P(\n      m$1`\n      <${PopupMenuComponent}\n        onClose=${ onClose }\n        onSelect=${ onSelect }\n        position=${ position }\n        className=${ className }\n        entries=${ entriesArray }\n        headerEntries=${ headerEntriesArray }\n        scale=${ scale }\n        onOpened=${ this._onOpened.bind(this) }\n        onClosed=${ this._onClosed.bind(this) }\n        ...${{ ...options }}\n      />\n    `,\n      this._current.container\n    );\n  };\n\n\n  /**\n   * Open the popup menu at the given position.\n   *\n   * @param {PopupMenuTarget} target\n   * @param {string} providerId\n   * @param {Point} position\n   * @param {Object} [options]\n   */\n  PopupMenu.prototype.open = function(target, providerId, position, options) {\n    if (!target) {\n      throw new Error('target is missing');\n    }\n\n    if (!providerId) {\n      throw new Error('providers for <' + providerId + '> not found');\n    }\n\n    if (!position) {\n      throw new Error('position is missing');\n    }\n\n    if (this.isOpen()) {\n      this.close();\n    }\n\n    const {\n      entries,\n      headerEntries\n    } = this._getContext(target, providerId);\n\n    this._current = {\n      position,\n      className: providerId,\n      target,\n      entries,\n      headerEntries,\n      container: this._createContainer({ provider: providerId }),\n      options\n    };\n\n    this._emit('open');\n\n    this._bindAutoClose();\n\n    this._render();\n  };\n\n\n  PopupMenu.prototype._getContext = function(target, provider) {\n\n    const providers = this._getProviders(provider);\n\n    if (!providers || !providers.length) {\n      throw new Error('provider for <' + provider + '> not found');\n    }\n\n    const entries = this._getEntries(target, providers);\n\n    const headerEntries = this._getHeaderEntries(target, providers);\n\n    return {\n      entries,\n      headerEntries,\n      empty: !(\n        Object.keys(entries).length ||\n            Object.keys(headerEntries).length\n      )\n    };\n  };\n\n  PopupMenu.prototype.close = function() {\n\n    if (!this.isOpen()) {\n      return;\n    }\n\n    this._emit('close');\n\n    this.reset();\n\n    this._current = null;\n  };\n\n  PopupMenu.prototype.reset = function() {\n    const container = this._current.container;\n\n    P(null, container);\n\n    remove$2(container);\n  };\n\n  PopupMenu.prototype._emit = function(event, payload) {\n    this._eventBus.fire(`popupMenu.${ event }`, payload);\n  };\n\n  PopupMenu.prototype._onOpened = function() {\n    this._emit('opened');\n  };\n\n  PopupMenu.prototype._onClosed = function() {\n    this._emit('closed');\n  };\n\n  PopupMenu.prototype._createContainer = function(config) {\n\n    var canvas = this._canvas,\n        parent = canvas.getContainer();\n\n    const container = domify$1(`<div class=\"djs-popup-parent djs-scrollable\" data-popup=${config.provider}></div>`);\n\n    parent.appendChild(container);\n\n    return container;\n  };\n\n  /**\n   * Set up listener to close popup automatically on certain events.\n   */\n  PopupMenu.prototype._bindAutoClose = function() {\n    this._eventBus.once(CLOSE_EVENTS, this.close, this);\n  };\n\n\n  /**\n   * Remove the auto-closing listener.\n  */\n  PopupMenu.prototype._unbindAutoClose = function() {\n    this._eventBus.off(CLOSE_EVENTS, this.close, this);\n  };\n\n\n  /**\n   * Updates popup style.transform with respect to the config and zoom level.\n   *\n   * @return {number}\n   */\n  PopupMenu.prototype._updateScale = function() {\n    var zoom = this._canvas.zoom();\n\n    var scaleConfig = this._config.scale,\n        minScale,\n        maxScale,\n        scale = zoom;\n\n    if (scaleConfig !== true) {\n\n      if (scaleConfig === false) {\n        minScale = 1;\n        maxScale = 1;\n      } else {\n        minScale = scaleConfig.min;\n        maxScale = scaleConfig.max;\n      }\n\n      if (isDefined(minScale) && zoom < minScale) {\n        scale = minScale;\n      }\n\n      if (isDefined(maxScale) && zoom > maxScale) {\n        scale = maxScale;\n      }\n\n    }\n\n    return scale;\n  };\n\n  PopupMenu.prototype._ensureVisible = function(container, position) {\n    var documentBounds = document.documentElement.getBoundingClientRect();\n    var containerBounds = container.getBoundingClientRect();\n\n    var overAxis = {},\n        left = position.x,\n        top = position.y;\n\n    if (position.x + containerBounds.width > documentBounds.width) {\n      overAxis.x = true;\n    }\n\n    if (position.y + containerBounds.height > documentBounds.height) {\n      overAxis.y = true;\n    }\n\n    if (overAxis.x && overAxis.y) {\n      left = position.x - containerBounds.width;\n      top = position.y - containerBounds.height;\n    } else if (overAxis.x) {\n      left = position.x - containerBounds.width;\n      top = position.y;\n    } else if (overAxis.y && position.y < containerBounds.height) {\n      left = position.x;\n      top = 10;\n    } else if (overAxis.y) {\n      left = position.x;\n      top = position.y - containerBounds.height;\n    }\n\n    return {\n      x: left,\n      y: top\n    };\n  };\n\n  /**\n   * Check whether there are no popup menu providers or provided entries for the\n   * given target.\n   *\n   * @param {PopupMenuTarget} target\n   * @param {string} providerId\n   *\n   * @return {boolean}\n   */\n  PopupMenu.prototype.isEmpty = function(target, providerId) {\n    if (!target) {\n      throw new Error('target is missing');\n    }\n\n    if (!providerId) {\n      throw new Error('provider ID is missing');\n    }\n\n    const providers = this._getProviders(providerId);\n\n    if (!providers || !providers.length) {\n      return true;\n    }\n\n    return this._getContext(target, providerId).empty;\n  };\n\n  /**\n   * @overlord\n   *\n   * Register a popup menu provider with default priority. See\n   * {@link PopupMenuProvider} for examples.\n   *\n   * @param {string} id\n   * @param {PopupMenuProvider} provider\n   */\n\n  /**\n   * Register a popup menu provider with the given priority. See\n   * {@link PopupMenuProvider} for examples.\n   *\n   * @param {string} id\n   * @param {number} priority\n   * @param {PopupMenuProvider} provider\n   */\n  PopupMenu.prototype.registerProvider = function(id, priority, provider) {\n    if (!provider) {\n      provider = priority;\n      priority = DEFAULT_PRIORITY$1;\n    }\n\n    this._eventBus.on('popupMenu.getProviders.' + id, priority, function(event) {\n      event.providers.push(provider);\n    });\n  };\n\n  /**\n   * @param {string} id\n   *\n   * @return {PopupMenuProvider[]}\n   */\n  PopupMenu.prototype._getProviders = function(id) {\n    var event = this._eventBus.createEvent({\n      type: 'popupMenu.getProviders.' + id,\n      providers: []\n    });\n\n    this._eventBus.fire(event);\n\n    return event.providers;\n  };\n\n  /**\n   * @param {PopupMenuTarget} target\n   * @param {PopupMenuProvider[]} providers\n   *\n   * @return {PopupMenuEntries}\n   */\n  PopupMenu.prototype._getEntries = function(target, providers) {\n    var entries = {};\n\n    forEach$1(providers, function(provider) {\n\n      // handle legacy method\n      if (!provider.getPopupMenuEntries) {\n        forEach$1(provider.getEntries(target), function(entry) {\n          var id = entry.id;\n\n          if (!id) {\n            throw new Error('entry ID is missing');\n          }\n\n          entries[id] = omit(entry, [ 'id' ]);\n        });\n\n        return;\n      }\n\n      var entriesOrUpdater = provider.getPopupMenuEntries(target);\n\n      if (isFunction(entriesOrUpdater)) {\n        entries = entriesOrUpdater(entries);\n      } else {\n        forEach$1(entriesOrUpdater, function(entry, id) {\n          entries[id] = entry;\n        });\n      }\n    });\n\n    return entries;\n  };\n\n  /**\n   * @param {PopupMenuTarget} target\n   * @param {PopupMenuProvider[]} providers\n   *\n   * @return {PopupMenuHeaderEntries}\n   */\n  PopupMenu.prototype._getHeaderEntries = function(target, providers) {\n    var entries = {};\n\n    forEach$1(providers, function(provider) {\n\n      // handle legacy method\n      if (!provider.getPopupMenuHeaderEntries) {\n        if (!provider.getHeaderEntries) {\n          return;\n        }\n\n        forEach$1(provider.getHeaderEntries(target), function(entry) {\n          var id = entry.id;\n\n          if (!id) {\n            throw new Error('entry ID is missing');\n          }\n\n          entries[id] = omit(entry, [ 'id' ]);\n        });\n\n        return;\n      }\n\n      var entriesOrUpdater = provider.getPopupMenuHeaderEntries(target);\n\n      if (isFunction(entriesOrUpdater)) {\n        entries = entriesOrUpdater(entries);\n      } else {\n        forEach$1(entriesOrUpdater, function(entry, id) {\n          entries[id] = entry;\n        });\n      }\n    });\n\n    return entries;\n  };\n\n\n  /**\n   * Check if the popup menu is open.\n   *\n   * @return {boolean}\n   */\n  PopupMenu.prototype.isOpen = function() {\n    return !!this._current;\n  };\n\n\n  /**\n   * Trigger an action associated with an entry.\n   *\n   * @param {Event} event\n   * @param {PopupMenuEntry} entry\n   * @param {string} [action='click']\n   *\n   * @return {any}\n   */\n  PopupMenu.prototype.trigger = function(event, entry, action = 'click') {\n\n    // silence other actions\n    event.preventDefault();\n\n    if (!entry) {\n      let element = closest(event.delegateTarget || event.target, '.entry', true);\n      let entryId = attr$1(element, DATA_REF);\n\n      entry = { id: entryId, ...this._getEntry(entryId) };\n    }\n\n    const handler = entry.action;\n\n    if (this._emit('trigger', { entry, event }) === false) {\n      return;\n    }\n\n    if (isFunction(handler)) {\n      if (action === 'click') {\n        return handler(event, entry);\n      }\n    } else {\n      if (handler[action]) {\n        return handler[action](event, entry);\n      }\n    }\n  };\n\n  /**\n   * Get the entry (entry or header entry) with the given ID.\n   *\n   * @param {string} entryId\n   *\n   * @return {PopupMenuEntry|PopupMenuHeaderEntry}\n   */\n  PopupMenu.prototype._getEntry = function(entryId) {\n\n    var entry = this._current.entries[ entryId ] || this._current.headerEntries[ entryId ];\n\n\n    if (!entry) {\n      throw new Error('entry not found');\n    }\n\n    return entry;\n  };\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var PopupMenuModule$1 = {\n    __init__: [ 'popupMenu' ],\n    popupMenu: [ 'type', PopupMenu ]\n  };\n\n  /**\n   * To change the icons, modify the SVGs in `./resources`, execute `npx svgo -f resources --datauri enc -o dist`,\n   * and then replace respective icons with the optimized data URIs in `./dist`.\n   */\n  var icons$1 = {\n    align:  `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 2000 2000\">\n              <line x1=\"200\" y1=\"150\" x2=\"200\" y2=\"1850\" style=\"stroke:currentColor;stroke-width:100;stroke-linecap:round;\"/>\n              <rect x=\"500\" y=\"150\" width=\"1300\" height=\"700\" rx=\"1\" style=\"fill:none;stroke:currentColor;stroke-width:100;\"></rect>\n              <rect x=\"500\" y=\"1150\" width=\"700\" height=\"700\" rx=\"1\" style=\"fill:currentColor;stroke:currentColor;stroke-width:100;opacity:.5;\"></rect>\n          </svg>`,\n    bottom: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1800 1800\">\n            <line x1=\"150\" y1=\"1650\" x2=\"1650\" y2=\"1650\" style=\"stroke:currentColor;stroke-width:100;stroke-linecap:round;\"/>\n            <rect x=\"150\" y=\"350\" width=\"600\" height=\"1300\" rx=\"1\" style=\"fill:none;stroke:currentColor;stroke-width:100;\"></rect>\n            <rect x=\"1050\" y=\"850\" width=\"600\" height=\"800\" rx=\"1\" style=\"fill:currentColor;stroke:currentColor;stroke-width:100;opacity:.5;\"></rect>\n          </svg>`,\n    center: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1800 1800\">\n            <line x1=\"900\" y1=\"150\" x2=\"900\" y2=\"1650\" style=\"stroke:currentColor;stroke-width:100;stroke-linecap:round;\"/>\n            <rect x=\"250\" y=\"150\" width=\"1300\" height=\"600\" rx=\"1\" style=\"fill:none;stroke:currentColor;stroke-width:100;\"></rect>\n            <rect x=\"500\" y=\"1050\" width=\"800\" height=\"600\" rx=\"1\" style=\"fill:currentColor;stroke:currentColor;stroke-width:100;opacity:.5;\"></rect>\n          </svg>`,\n    left:   `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1800 1800\">\n            <line x1=\"100\" y1=\"150\" x2=\"100\" y2=\"1650\" style=\"stroke:currentColor;stroke-width:100;stroke-linecap:round;\"/>\n            <rect x=\"100\" y=\"150\" width=\"1300\" height=\"600\" rx=\"1\" style=\"fill:none;stroke:currentColor;stroke-width:100;\"></rect>\n            <rect x=\"100\" y=\"1050\" width=\"800\" height=\"600\" rx=\"1\" style=\"fill:currentColor;stroke:currentColor;stroke-width:100;opacity:.5;\"></rect>\n          </svg>`,\n    right:  `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1800 1800\">\n            <line x1=\"1650\" y1=\"150\" x2=\"1650\" y2=\"1650\" style=\"stroke:currentColor;stroke-width:100;stroke-linecap:round;\"/>\n            <rect x=\"350\" y=\"150\" width=\"1300\" height=\"600\" rx=\"1\" style=\"fill:none;stroke:currentColor;stroke-width:100;\"></rect>\n            <rect x=\"850\" y=\"1050\" width=\"800\" height=\"600\" rx=\"1\" style=\"fill:currentColor;stroke:currentColor;stroke-width:100;opacity:.5;\"></rect>\n          </svg>`,\n    top:    `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1800 1800\">\n            <line x1=\"150\" y1=\"150\" x2=\"1650\" y2=\"150\" style=\"stroke:currentColor;stroke-width:100;stroke-linecap:round;\"/>\n            <rect x=\"150\" y=\"150\" width=\"600\" height=\"1300\" rx=\"1\" style=\"fill:none;stroke:currentColor;stroke-width:100;\"></rect>\n            <rect x=\"1050\" y=\"150\" width=\"600\" height=\"800\" rx=\"1\" style=\"fill:currentColor;stroke:currentColor;stroke-width:100;opacity:.5;\"></rect>\n          </svg>`,\n    middle: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1800 1800\">\n            <line x1=\"150\" y1=\"900\" x2=\"1650\" y2=\"900\" style=\"stroke:currentColor;stroke-width:100;stroke-linecap:round;\"/>\n            <rect x=\"150\" y=\"250\" width=\"600\" height=\"1300\" rx=\"1\" style=\"fill:none;stroke:currentColor;stroke-width:100;\"></rect>\n            <rect x=\"1050\" y=\"500\" width=\"600\" height=\"800\" rx=\"1\" style=\"fill:currentColor;stroke:currentColor;stroke-width:100;opacity:.5;\"></rect>\n          </svg>`\n  };\n\n  var ICONS$1 = icons$1;\n\n  /**\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/features/context-pad/ContextPad').default} ContextPad\n   * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenu').default} PopupMenu\n   * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('diagram-js/lib/features/context-pad/ContextPad').ContextPadEntries} ContextPadEntries\n   * @typedef {import('diagram-js/lib/features/context-pad/ContextPadProvider').default} ContextPadProvider\n   */\n\n  var LOW_PRIORITY$l = 900;\n\n  /**\n   * A provider for the `Align elements` context pad entry.\n   *\n   * @implements {ContextPadProvider}\n   *\n   * @param {ContextPad} contextPad\n   * @param {PopupMenu} popupMenu\n   * @param {Translate} translate\n   * @param {Canvas} canvas\n   */\n  function AlignElementsContextPadProvider(contextPad, popupMenu, translate, canvas) {\n\n    contextPad.registerProvider(LOW_PRIORITY$l, this);\n\n    this._contextPad = contextPad;\n    this._popupMenu = popupMenu;\n    this._translate = translate;\n    this._canvas = canvas;\n  }\n\n  AlignElementsContextPadProvider.$inject = [\n    'contextPad',\n    'popupMenu',\n    'translate',\n    'canvas'\n  ];\n\n  /**\n   * @param {Element[]} elements\n   *\n   * @return {ContextPadEntries}\n   */\n  AlignElementsContextPadProvider.prototype.getMultiElementContextPadEntries = function(elements) {\n    var actions = {};\n\n    if (this._isAllowed(elements)) {\n      assign$1(actions, this._getEntries(elements));\n    }\n\n    return actions;\n  };\n\n  AlignElementsContextPadProvider.prototype._isAllowed = function(elements) {\n    return !this._popupMenu.isEmpty(elements, 'align-elements');\n  };\n\n  AlignElementsContextPadProvider.prototype._getEntries = function() {\n    var self = this;\n\n    return {\n      'align-elements': {\n        group: 'align-elements',\n        title: self._translate('Align elements'),\n        html: `<div class=\"entry\">${ICONS$1['align']}</div>`,\n        action: {\n          click: function(event, target) {\n            var position = self._getMenuPosition(target);\n\n            assign$1(position, {\n              cursor: {\n                x: event.x,\n                y: event.y\n              }\n            });\n\n            self._popupMenu.open(target, 'align-elements', position);\n          }\n        }\n      }\n    };\n  };\n\n  AlignElementsContextPadProvider.prototype._getMenuPosition = function(elements) {\n    var Y_OFFSET = 5;\n\n    var pad = this._contextPad.getPad(elements).html;\n\n    var padRect = pad.getBoundingClientRect();\n\n    var pos = {\n      x: padRect.left,\n      y: padRect.bottom + Y_OFFSET\n    };\n\n    return pos;\n  };\n\n  /**\n   * @typedef {import('diagram-js/lib/features/align-elements/AlignElements').default} AlignElements\n   * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenu').default} PopupMenu\n   * @typedef {import('diagram-js/lib/features/rules/Rules').default} Rules\n   * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n   *\n   * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenu').PopupMenuEntries} PopupMenuEntries\n   * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenuProvider').default} PopupMenuProvider\n   * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenu').PopupMenuTarget} PopupMenuTarget\n   */\n\n  var ALIGNMENT_OPTIONS = [\n    'left',\n    'center',\n    'right',\n    'top',\n    'middle',\n    'bottom'\n  ];\n\n  /**\n   * A provider for the `Align elements` popup menu.\n   *\n   * @implements {PopupMenuProvider}\n   *\n   * @param {PopupMenu} popupMenu\n   * @param {AlignElements} alignElements\n   * @param {Translate} translate\n   * @param {Rules} rules\n   */\n  function AlignElementsMenuProvider(popupMenu, alignElements, translate, rules) {\n\n    this._alignElements = alignElements;\n    this._translate = translate;\n    this._popupMenu = popupMenu;\n    this._rules = rules;\n\n    popupMenu.registerProvider('align-elements', this);\n  }\n\n  AlignElementsMenuProvider.$inject = [\n    'popupMenu',\n    'alignElements',\n    'translate',\n    'rules'\n  ];\n\n  /**\n   * @param {PopupMenuTarget} target\n   *\n   * @return {PopupMenuEntries}\n   */\n  AlignElementsMenuProvider.prototype.getPopupMenuEntries = function(target) {\n    var entries = {};\n\n    if (this._isAllowed(target)) {\n      assign$1(entries, this._getEntries(target));\n    }\n\n    return entries;\n  };\n\n  AlignElementsMenuProvider.prototype._isAllowed = function(target) {\n    return this._rules.allowed('elements.align', { elements: target });\n  };\n\n  /**\n   * @param {PopupMenuTarget} target\n   *\n   * @return {PopupMenuEntries}\n   */\n  AlignElementsMenuProvider.prototype._getEntries = function(target) {\n    var alignElements = this._alignElements,\n        translate = this._translate,\n        popupMenu = this._popupMenu;\n\n    var entries = {};\n\n    forEach$1(ALIGNMENT_OPTIONS, function(alignment) {\n      entries[ 'align-elements-' + alignment ] = {\n        group: 'align',\n        title: translate('Align elements ' + alignment),\n        className: 'bjs-align-elements-menu-entry',\n        imageHtml: ICONS$1[ alignment ],\n        action: function() {\n          alignElements.trigger(target, alignment);\n          popupMenu.close();\n        }\n      };\n    });\n\n    return entries;\n  };\n\n  /**\n   * @typedef {import('../../core/EventBus').default} EventBus\n   */\n\n  /**\n   * A basic provider that may be extended to implement modeling rules.\n   *\n   * Extensions should implement the init method to actually add their custom\n   * modeling checks. Checks may be added via the #addRule(action, fn) method.\n   *\n   * @class\n   *\n   * @param {EventBus} eventBus\n   */\n  function RuleProvider(eventBus) {\n    CommandInterceptor.call(this, eventBus);\n\n    this.init();\n  }\n\n  RuleProvider.$inject = [ 'eventBus' ];\n\n  e$3(RuleProvider, CommandInterceptor);\n\n\n  /**\n   * Adds a modeling rule for the given action, implemented through\n   * a callback function.\n   *\n   * The callback receives a modeling specific action context\n   * to perform its check. It must return `false` to disallow the\n   * action from happening or `true` to allow the action. Usually returing\n   * `null` denotes that a particular interaction shall be ignored.\n   * By returning nothing or `undefined` you pass evaluation to lower\n   * priority rules.\n   *\n   * @example\n   *\n   * ```javascript\n   * ResizableRules.prototype.init = function() {\n   *\n   *   \\/**\n   *    * Return `true`, `false` or nothing to denote\n   *    * _allowed_, _not allowed_ and _continue evaluating_.\n   *    *\\/\n   *   this.addRule('shape.resize', function(context) {\n   *\n   *     var shape = context.shape;\n   *\n   *     if (!context.newBounds) {\n   *       // check general resizability\n   *       if (!shape.resizable) {\n   *         return false;\n   *       }\n   *\n   *       // not returning anything (read: undefined)\n   *       // will continue the evaluation of other rules\n   *       // (with lower priority)\n   *       return;\n   *     } else {\n   *       // element must have minimum size of 10*10 points\n   *       return context.newBounds.width > 10 && context.newBounds.height > 10;\n   *     }\n   *   });\n   * };\n   * ```\n   *\n   * @param {string|string[]} actions the identifier for the modeling action to check\n   * @param {number} [priority] the priority at which this rule is being applied\n   * @param {(any) => any} fn the callback function that performs the actual check\n   */\n  RuleProvider.prototype.addRule = function(actions, priority, fn) {\n\n    var self = this;\n\n    if (typeof actions === 'string') {\n      actions = [ actions ];\n    }\n\n    actions.forEach(function(action) {\n\n      self.canExecute(action, priority, function(context, action, event) {\n        return fn(context);\n      }, true);\n    });\n  };\n\n  /**\n   * Implement this method to add new rules during provider initialization.\n   */\n  RuleProvider.prototype.init = function() {};\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   */\n\n  /**\n   * Rule provider for aligning BPMN elements.\n   *\n   * @param {EventBus} eventBus\n   */\n  function BpmnAlignElements(eventBus) {\n    RuleProvider.call(this, eventBus);\n  }\n\n  BpmnAlignElements.$inject = [ 'eventBus' ];\n\n  e$3(BpmnAlignElements, RuleProvider);\n\n  BpmnAlignElements.prototype.init = function() {\n    this.addRule('elements.align', function(context) {\n      var elements = context.elements;\n\n      // filter out elements which cannot be aligned\n      var filteredElements = filter(elements, function(element) {\n        return !(element.waypoints || element.host || element.labelTarget);\n      });\n\n      // filter out elements which are children of any of the selected elements\n      filteredElements = getParents$1(filteredElements);\n\n      if (filteredElements.length < 2) {\n        return false;\n      }\n\n      return filteredElements;\n    });\n  };\n\n  var AlignElementsModule = {\n    __depends__: [\n      AlignElementsModule$1,\n      ContextPadModule$1,\n      PopupMenuModule$1\n    ],\n    __init__: [\n      'alignElementsContextPadProvider',\n      'alignElementsMenuProvider',\n      'bpmnAlignElements'\n    ],\n    alignElementsContextPadProvider: [ 'type', AlignElementsContextPadProvider ],\n    alignElementsMenuProvider: [ 'type', AlignElementsMenuProvider ],\n    bpmnAlignElements: [ 'type', BpmnAlignElements ]\n  };\n\n  /**\n   * @typedef {import('../../model/Types').Connection} Connection\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Shape} Shape\n   *\n   * @typedef {import('../../util/Types').Point} Point\n   */\n\n  // padding to detect element placement\n  var PLACEMENT_DETECTION_PAD = 10;\n\n  var DEFAULT_DISTANCE = 50;\n\n  var DEFAULT_MAX_DISTANCE = 250;\n\n\n  /**\n   * Get free position starting from given position.\n   *\n   * @param {Shape} source\n   * @param {Shape} element\n   * @param {Point} position\n   * @param {(element: Element, position: Point, connectedAtPosition: Element) => Element} getNextPosition\n   *\n   * @return {Point}\n   */\n  function findFreePosition(source, element, position, getNextPosition) {\n    var connectedAtPosition;\n\n    while ((connectedAtPosition = getConnectedAtPosition(source, position, element))) {\n      position = getNextPosition(element, position, connectedAtPosition);\n    }\n\n    return position;\n  }\n\n  /**\n   * Returns function that returns next position.\n   *\n   * @param {Object} nextPositionDirection\n   * @param {Object} [nextPositionDirection.x]\n   * @param {Object} [nextPositionDirection.y]\n   *\n   * @return {(element: Element, previousPosition: Point, connectedAtPosition: Element) => Point}\n   */\n  function generateGetNextPosition(nextPositionDirection) {\n    return function(element, previousPosition, connectedAtPosition) {\n      var nextPosition = {\n        x: previousPosition.x,\n        y: previousPosition.y\n      };\n\n      [ 'x', 'y' ].forEach(function(axis) {\n\n        var nextPositionDirectionForAxis = nextPositionDirection[ axis ];\n\n        if (!nextPositionDirectionForAxis) {\n          return;\n        }\n\n        var dimension = axis === 'x' ? 'width' : 'height';\n\n        var margin = nextPositionDirectionForAxis.margin,\n            minDistance = nextPositionDirectionForAxis.minDistance;\n\n        if (margin < 0) {\n          nextPosition[ axis ] = Math.min(\n            connectedAtPosition[ axis ] + margin - element[ dimension ] / 2,\n            previousPosition[ axis ] - minDistance + margin\n          );\n        } else {\n          nextPosition[ axis ] = Math.max(\n            connectedAtPosition[ axis ] + connectedAtPosition[ dimension ] + margin + element[ dimension ] / 2,\n            previousPosition[ axis ] + minDistance + margin\n          );\n        }\n      });\n\n      return nextPosition;\n    };\n  }\n\n  /**\n   * Return target at given position, if defined.\n   *\n   * This takes connected elements from host and attachers\n   * into account, too.\n   */\n  function getConnectedAtPosition(source, position, element) {\n\n    var bounds = {\n      x: position.x - (element.width / 2),\n      y: position.y - (element.height / 2),\n      width: element.width,\n      height: element.height\n    };\n\n    var closure = getAutoPlaceClosure(source);\n\n    return find(closure, function(target) {\n\n      if (target === element) {\n        return false;\n      }\n\n      var orientation = getOrientation(target, bounds, PLACEMENT_DETECTION_PAD);\n\n      return orientation === 'intersect';\n    });\n  }\n\n  /**\n  * Compute optimal distance between source and target based on existing connections to and from source.\n  * Assumes left-to-right and top-to-down modeling.\n  *\n  * @param {Shape} source\n  * @param {Object} [hints]\n  * @param {number} [hints.defaultDistance]\n  * @param {string} [hints.direction]\n  * @param {(connection: Connection) => boolean} [hints.filter]\n  * @param {(connection: Connection) => number} [hints.getWeight]\n  * @param {number} [hints.maxDistance]\n  * @param {string} [hints.reference]\n  *\n  * @return {number}\n  */\n  function getConnectedDistance(source, hints) {\n    if (!hints) {\n      hints = {};\n    }\n\n    // targets > sources by default\n    function getDefaultWeight(connection) {\n      return connection.source === source ? 1 : -1;\n    }\n\n    var defaultDistance = hints.defaultDistance || DEFAULT_DISTANCE,\n        direction = hints.direction || 'e',\n        filter = hints.filter,\n        getWeight = hints.getWeight || getDefaultWeight,\n        maxDistance = hints.maxDistance || DEFAULT_MAX_DISTANCE,\n        reference = hints.reference || 'start';\n\n    if (!filter) {\n      filter = noneFilter;\n    }\n\n    function getDistance(a, b) {\n      if (direction === 'n') {\n        if (reference === 'start') {\n          return asTRBL(a).top - asTRBL(b).bottom;\n        } else if (reference === 'center') {\n          return asTRBL(a).top - getMid(b).y;\n        } else {\n          return asTRBL(a).top - asTRBL(b).top;\n        }\n      } else if (direction === 'w') {\n        if (reference === 'start') {\n          return asTRBL(a).left - asTRBL(b).right;\n        } else if (reference === 'center') {\n          return asTRBL(a).left - getMid(b).x;\n        } else {\n          return asTRBL(a).left - asTRBL(b).left;\n        }\n      } else if (direction === 's') {\n        if (reference === 'start') {\n          return asTRBL(b).top - asTRBL(a).bottom;\n        } else if (reference === 'center') {\n          return getMid(b).y - asTRBL(a).bottom;\n        } else {\n          return asTRBL(b).bottom - asTRBL(a).bottom;\n        }\n      } else {\n        if (reference === 'start') {\n          return asTRBL(b).left - asTRBL(a).right;\n        } else if (reference === 'center') {\n          return getMid(b).x - asTRBL(a).right;\n        } else {\n          return asTRBL(b).right - asTRBL(a).right;\n        }\n      }\n    }\n\n    var sourcesDistances = source.incoming\n      .filter(filter)\n      .map(function(connection) {\n        var weight = getWeight(connection);\n\n        var distance = weight < 0\n          ? getDistance(connection.source, source)\n          : getDistance(source, connection.source);\n\n        return {\n          id: connection.source.id,\n          distance: distance,\n          weight: weight\n        };\n      });\n\n    var targetsDistances = source.outgoing\n      .filter(filter)\n      .map(function(connection) {\n        var weight = getWeight(connection);\n\n        var distance = weight > 0\n          ? getDistance(source, connection.target)\n          : getDistance(connection.target, source);\n\n        return {\n          id: connection.target.id,\n          distance: distance,\n          weight: weight\n        };\n      });\n\n    var distances = sourcesDistances.concat(targetsDistances).reduce(function(accumulator, currentValue) {\n      accumulator[ currentValue.id + '__weight_' + currentValue.weight ] = currentValue;\n\n      return accumulator;\n    }, {});\n\n    var distancesGrouped = reduce(distances, function(accumulator, currentValue) {\n      var distance = currentValue.distance,\n          weight = currentValue.weight;\n\n      if (distance < 0 || distance > maxDistance) {\n        return accumulator;\n      }\n\n      if (!accumulator[ String(distance) ]) {\n        accumulator[ String(distance) ] = 0;\n      }\n\n      accumulator[ String(distance) ] += 1 * weight;\n\n      if (!accumulator.distance || accumulator[ accumulator.distance ] < accumulator[ String(distance) ]) {\n        accumulator.distance = distance;\n      }\n\n      return accumulator;\n    }, {});\n\n    return distancesGrouped.distance || defaultDistance;\n  }\n\n  /**\n   * Returns all connected elements around the given source.\n   *\n   * This includes:\n   *\n   *   - connected elements\n   *   - host connected elements\n   *   - attachers connected elements\n   *\n   * @param {Shape} source\n   *\n   * @return {Shape[]}\n   */\n  function getAutoPlaceClosure(source) {\n\n    var allConnected = getConnected(source);\n\n    if (source.host) {\n      allConnected = allConnected.concat(getConnected(source.host));\n    }\n\n    if (source.attachers) {\n      allConnected = allConnected.concat(source.attachers.reduce(function(shapes, attacher) {\n        return shapes.concat(getConnected(attacher));\n      }, []));\n    }\n\n    return allConnected;\n  }\n\n  function getConnected(element) {\n    return getTargets(element).concat(getSources(element));\n  }\n\n  function getSources(shape) {\n    return shape.incoming.map(function(connection) {\n      return connection.source;\n    });\n  }\n\n  function getTargets(shape) {\n    return shape.outgoing.map(function(connection) {\n      return connection.target;\n    });\n  }\n\n  function noneFilter() {\n    return true;\n  }\n\n  /**\n   * @typedef {import('../../core/Types').ShapeLike} Shape\n   *\n   * @typedef {import('../../util/Types').Point} Point\n   *\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   */\n\n  var LOW_PRIORITY$k = 100;\n\n\n  /**\n   * A service that places elements connected to existing ones\n   * to an appropriate position in an _automated_ fashion.\n   *\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   * @param {Canvas} canvas\n   */\n  function AutoPlace$1(eventBus, modeling, canvas) {\n\n    eventBus.on('autoPlace', LOW_PRIORITY$k, function(context) {\n      var shape = context.shape,\n          source = context.source;\n\n      return getNewShapePosition$1(source, shape);\n    });\n\n    eventBus.on('autoPlace.end', function(event) {\n      canvas.scrollToElement(event.shape);\n    });\n\n    /**\n     * Append shape to source at appropriate position.\n     *\n     * @param {Shape} source\n     * @param {Shape} shape\n     *\n     * @return {Shape} appended shape\n     */\n    this.append = function(source, shape, hints) {\n\n      eventBus.fire('autoPlace.start', {\n        source: source,\n        shape: shape\n      });\n\n      // allow others to provide the position\n      var position = eventBus.fire('autoPlace', {\n        source: source,\n        shape: shape\n      });\n\n      var newShape = modeling.appendShape(source, shape, position, source.parent, hints);\n\n      eventBus.fire('autoPlace.end', {\n        source: source,\n        shape: newShape\n      });\n\n      return newShape;\n    };\n\n  }\n\n  AutoPlace$1.$inject = [\n    'eventBus',\n    'modeling',\n    'canvas'\n  ];\n\n  // helpers //////////\n\n  /**\n   * Find the new position for the target element to\n   * connect to source.\n   *\n   * @param {Shape} source\n   * @param {Shape} element\n   * @param {Object} [hints]\n   * @param {Object} [hints.defaultDistance]\n   *\n   * @return {Point}\n   */\n  function getNewShapePosition$1(source, element, hints) {\n    if (!hints) {\n      hints = {};\n    }\n\n    var distance = hints.defaultDistance || DEFAULT_DISTANCE;\n\n    var sourceMid = getMid(source),\n        sourceTrbl = asTRBL(source);\n\n    // simply put element right next to source\n    return {\n      x: sourceTrbl.right + distance + element.width / 2,\n      y: sourceMid.y\n    };\n  }\n\n  /**\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../selection/Selection').default} Selection\n   */\n\n  /**\n   * Select element after auto placement.\n   *\n   * @param {EventBus} eventBus\n   * @param {Selection} selection\n   */\n  function AutoPlaceSelectionBehavior(eventBus, selection) {\n\n    eventBus.on('autoPlace.end', 500, function(e) {\n      selection.select(e.shape);\n    });\n\n  }\n\n  AutoPlaceSelectionBehavior.$inject = [\n    'eventBus',\n    'selection'\n  ];\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var AutoPlaceModule$1 = {\n    __init__: [ 'autoPlaceSelectionBehavior' ],\n    autoPlace: [ 'type', AutoPlace$1 ],\n    autoPlaceSelectionBehavior: [ 'type', AutoPlaceSelectionBehavior ]\n  };\n\n  /**\n   * @typedef {import('../../../model/Types').Element} Element\n   */\n\n  /**\n   * Return the parent of the element with any of the given types.\n   *\n   * @param {Element} element\n   * @param {string|string[]} anyType\n   *\n   * @return {Element|null}\n   */\n  function getParent(element, anyType) {\n\n    if (isString(anyType)) {\n      anyType = [ anyType ];\n    }\n\n    while ((element = element.parent)) {\n      if (isAny(element, anyType)) {\n        return element;\n      }\n    }\n\n    return null;\n  }\n\n  /**\n   * @typedef {import('../../model/Types').Shape} Shape\n   *\n   * @typedef {import('diagram-js/lib/util/Types').Point} Point\n   * @typedef {import('diagram-js/lib/util/Types').DirectionTRBL} DirectionTRBL\n   */\n\n  /**\n   * Get the position for given new target relative to the source it will be\n   * connected to.\n   *\n   * @param  {Shape} source\n   * @param  {Shape} element\n   *\n   * @return {Point}\n   */\n  function getNewShapePosition(source, element) {\n\n    if (is$1(element, 'bpmn:TextAnnotation')) {\n      return getTextAnnotationPosition(source, element);\n    }\n\n    if (isAny(element, [ 'bpmn:DataObjectReference', 'bpmn:DataStoreReference' ])) {\n      return getDataElementPosition(source, element);\n    }\n\n    if (is$1(element, 'bpmn:FlowNode')) {\n      return getFlowNodePosition(source, element);\n    }\n  }\n\n  /**\n   * Get the position for given new flow node. Try placing the flow node right of\n   * the source.\n   *\n   * @param {Shape} source\n   * @param {Shape} element\n   *\n   * @return {Point}\n   */\n  function getFlowNodePosition(source, element) {\n\n    var sourceTrbl = asTRBL(source);\n    var sourceMid = getMid(source);\n\n    var horizontalDistance = getConnectedDistance(source, {\n      filter: function(connection) {\n        return is$1(connection, 'bpmn:SequenceFlow');\n      }\n    });\n\n    var margin = 30,\n        minDistance = 80,\n        orientation = 'left';\n\n    if (is$1(source, 'bpmn:BoundaryEvent')) {\n      orientation = getOrientation(source, source.host, -25);\n\n      if (orientation.indexOf('top') !== -1) {\n        margin *= -1;\n      }\n    }\n\n    var position = {\n      x: sourceTrbl.right + horizontalDistance + element.width / 2,\n      y: sourceMid.y + getVerticalDistance(orientation, minDistance)\n    };\n\n    var nextPositionDirection = {\n      y: {\n        margin: margin,\n        minDistance: minDistance\n      }\n    };\n\n    return findFreePosition(source, element, position, generateGetNextPosition(nextPositionDirection));\n  }\n\n  /**\n   * @param {DirectionTRBL} orientation\n   * @param {number} minDistance\n   *\n   * @return {number}\n   */\n  function getVerticalDistance(orientation, minDistance) {\n    if (orientation.includes('top')) {\n      return -1 * minDistance;\n    } else if (orientation.includes('bottom')) {\n      return minDistance;\n    } else {\n      return 0;\n    }\n  }\n\n\n  /**\n   * Get the position for given text annotation. Try placing the text annotation\n   * top-right of the source.\n   *\n   * @param {Shape} source\n   * @param {Shape} element\n   *\n   * @return {Point}\n   */\n  function getTextAnnotationPosition(source, element) {\n\n    var sourceTrbl = asTRBL(source);\n\n    var position = {\n      x: sourceTrbl.right + element.width / 2,\n      y: sourceTrbl.top - 50 - element.height / 2\n    };\n\n    if (isConnection(source)) {\n      position = getMid(source);\n      position.x += 100;\n      position.y -= 50;\n    }\n\n    var nextPositionDirection = {\n      y: {\n        margin: -30,\n        minDistance: 20\n      }\n    };\n\n    return findFreePosition(source, element, position, generateGetNextPosition(nextPositionDirection));\n  }\n\n\n  /**\n   * Get the position for given new data element. Try placing the data element\n   * bottom-right of the source.\n   *\n   * @param {Shape} source\n   * @param {Shape} element\n   *\n   * @return {Point}\n   */\n  function getDataElementPosition(source, element) {\n\n    var sourceTrbl = asTRBL(source);\n\n    var position = {\n      x: sourceTrbl.right - 10 + element.width / 2,\n      y: sourceTrbl.bottom + 40 + element.width / 2\n    };\n\n    var nextPositionDirection = {\n      x: {\n        margin: 30,\n        minDistance: 30\n      }\n    };\n\n    return findFreePosition(source, element, position, generateGetNextPosition(nextPositionDirection));\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   */\n\n  /**\n   * BPMN auto-place behavior.\n   *\n   * @param {EventBus} eventBus\n   */\n  function AutoPlace(eventBus) {\n    eventBus.on('autoPlace', function(context) {\n      var shape = context.shape,\n          source = context.source;\n\n      return getNewShapePosition(source, shape);\n    });\n  }\n\n  AutoPlace.$inject = [ 'eventBus' ];\n\n  var AutoPlaceModule = {\n    __depends__: [ AutoPlaceModule$1 ],\n    __init__: [ 'bpmnAutoPlace' ],\n    bpmnAutoPlace: [ 'type', AutoPlace ]\n  };\n\n  /**\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Shape} Shape\n   *\n   * @typedef {import('../../util/Types').Direction} Direction\n   * @typedef {import('../../util/Types').Rect} Rect\n   * @typedef {import('../../util/Types').RectTRBL} RectTRBL\n   *\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   * @typedef {import('../rules/Rules').default} Rules\n   */\n\n  /**\n   * An auto resize component that takes care of expanding a parent element\n   * if child elements are created or moved close the parents edge.\n   *\n   * @param {EventBus} eventBus\n   * @param {ElementRegistry} elementRegistry\n   * @param {Modeling} modeling\n   * @param {Rules} rules\n   */\n  function AutoResize(eventBus, elementRegistry, modeling, rules) {\n\n    CommandInterceptor.call(this, eventBus);\n\n    this._elementRegistry = elementRegistry;\n    this._modeling = modeling;\n    this._rules = rules;\n\n    var self = this;\n\n    this.postExecuted([ 'shape.create' ], function(event) {\n      var context = event.context,\n          hints = context.hints || {},\n          shape = context.shape,\n          parent = context.parent || context.newParent;\n\n      if (hints.autoResize === false) {\n        return;\n      }\n\n      self._expand([ shape ], parent);\n    });\n\n    this.postExecuted([ 'elements.move' ], function(event) {\n      var context = event.context,\n          elements = flatten(values(context.closure.topLevel)),\n          hints = context.hints;\n\n      var autoResize = hints ? hints.autoResize : true;\n\n      if (autoResize === false) {\n        return;\n      }\n\n      var expandings = groupBy(elements, function(element) {\n        return element.parent.id;\n      });\n\n      forEach$1(expandings, function(elements, parentId) {\n\n        // optionally filter elements to be considered when resizing\n        if (isArray$3(autoResize)) {\n          elements = elements.filter(function(element) {\n            return find(autoResize, matchPattern({ id: element.id }));\n          });\n        }\n\n        self._expand(elements, parentId);\n      });\n    });\n\n    this.postExecuted([ 'shape.toggleCollapse' ], function(event) {\n      var context = event.context,\n          hints = context.hints,\n          shape = context.shape;\n\n      if (hints && hints.autoResize === false) {\n        return;\n      }\n\n      if (shape.collapsed) {\n        return;\n      }\n\n      self._expand(shape.children || [], shape);\n    });\n\n    this.postExecuted([ 'shape.resize' ], function(event) {\n      var context = event.context,\n          hints = context.hints,\n          shape = context.shape,\n          parent = shape.parent;\n\n      if (hints && hints.autoResize === false) {\n        return;\n      }\n\n      if (parent) {\n        self._expand([ shape ], parent);\n      }\n    });\n\n  }\n\n  AutoResize.$inject = [\n    'eventBus',\n    'elementRegistry',\n    'modeling',\n    'rules'\n  ];\n\n  e$3(AutoResize, CommandInterceptor);\n\n\n  /**\n   * Calculate the new bounds of the target shape, given\n   * a number of elements have been moved or added into the parent.\n   *\n   * This method considers the current size, the added elements as well as\n   * the provided padding for the new bounds.\n   *\n   * @param {Shape[]} elements\n   * @param {Shape} target\n   */\n  AutoResize.prototype._getOptimalBounds = function(elements, target) {\n\n    var offset = this.getOffset(target),\n        padding = this.getPadding(target);\n\n    var elementsTrbl = asTRBL(getBBox(elements)),\n        targetTrbl = asTRBL(target);\n\n    var newTrbl = {};\n\n    if (elementsTrbl.top - targetTrbl.top < padding.top) {\n      newTrbl.top = elementsTrbl.top - offset.top;\n    }\n\n    if (elementsTrbl.left - targetTrbl.left < padding.left) {\n      newTrbl.left = elementsTrbl.left - offset.left;\n    }\n\n    if (targetTrbl.right - elementsTrbl.right < padding.right) {\n      newTrbl.right = elementsTrbl.right + offset.right;\n    }\n\n    if (targetTrbl.bottom - elementsTrbl.bottom < padding.bottom) {\n      newTrbl.bottom = elementsTrbl.bottom + offset.bottom;\n    }\n\n    return asBounds(assign$1({}, targetTrbl, newTrbl));\n  };\n\n\n  /**\n   * Expand the target shape respecting rules, offset and padding\n   *\n   * @param {Shape[]} elements\n   * @param {Shape|string} target The target or its ID.\n   */\n  AutoResize.prototype._expand = function(elements, target) {\n\n    if (typeof target === 'string') {\n      target = this._elementRegistry.get(target);\n    }\n\n    var allowed = this._rules.allowed('element.autoResize', {\n      elements: elements,\n      target: target\n    });\n\n    if (!allowed) {\n      return;\n    }\n\n    // calculate the new bounds\n    var newBounds = this._getOptimalBounds(elements, target);\n\n    if (!boundsChanged$1(newBounds, target)) {\n      return;\n    }\n\n    var resizeDirections = getResizeDirections(pick(target, [ 'x', 'y', 'width', 'height' ]), newBounds);\n\n    // resize the parent shape\n    this.resize(target, newBounds, {\n      autoResize: resizeDirections\n    });\n\n    var parent = target.parent;\n\n    // recursively expand parent elements\n    if (parent) {\n      this._expand([ target ], parent);\n    }\n  };\n\n\n  /**\n   * Get the amount to expand the given shape in each direction.\n   *\n   * @param {Shape} shape\n   *\n   * @return {RectTRBL}\n   */\n  AutoResize.prototype.getOffset = function(shape) {\n    return { top: 60, bottom: 60, left: 100, right: 100 };\n  };\n\n\n  /**\n   * Get the activation threshold for each side for which\n   * resize triggers.\n   *\n   * @param {Shape} shape\n   *\n   * @return {RectTRBL}\n   */\n  AutoResize.prototype.getPadding = function(shape) {\n    return { top: 2, bottom: 2, left: 15, right: 15 };\n  };\n\n\n  /**\n   * Perform the actual resize operation.\n   *\n   * @param {Shape} shape\n   * @param {Rect} newBounds\n   * @param {Object} [hints]\n   * @param {string} [hints.autoResize]\n   */\n  AutoResize.prototype.resize = function(shape, newBounds, hints) {\n    this._modeling.resizeShape(shape, newBounds, null, hints);\n  };\n\n\n  function boundsChanged$1(newBounds, oldBounds) {\n    return (\n      newBounds.x !== oldBounds.x ||\n      newBounds.y !== oldBounds.y ||\n      newBounds.width !== oldBounds.width ||\n      newBounds.height !== oldBounds.height\n    );\n  }\n\n  /**\n   * Get directions of resize as {n|w|s|e} e.g. \"nw\".\n   *\n   * @param {Rect} oldBounds\n   * @param {Rect} newBounds\n   *\n   * @return {Direction} Resize directions as {n|w|s|e}.\n   */\n  function getResizeDirections(oldBounds, newBounds) {\n    var directions = '';\n\n    oldBounds = asTRBL(oldBounds);\n    newBounds = asTRBL(newBounds);\n\n    if (oldBounds.top > newBounds.top) {\n      directions = directions.concat('n');\n    }\n\n    if (oldBounds.right < newBounds.right) {\n      directions = directions.concat('w');\n    }\n\n    if (oldBounds.bottom < newBounds.bottom) {\n      directions = directions.concat('s');\n    }\n\n    if (oldBounds.left > newBounds.left) {\n      directions = directions.concat('e');\n    }\n\n    return directions;\n  }\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   *\n   * @typedef {import('../../model/Types').Shape} Shape\n   *\n   * @typedef {import('diagram-js/lib/util/Types').Rect} Rect\n   */\n\n  /**\n   * BPMN-specific resize behavior.\n   *\n   * @param {Injector} injector\n   */\n  function BpmnAutoResize(injector) {\n\n    injector.invoke(AutoResize, this);\n  }\n\n  BpmnAutoResize.$inject = [\n    'injector'\n  ];\n\n  e$3(BpmnAutoResize, AutoResize);\n\n  /**\n   * Perform BPMN-specific resizing of participants.\n   *\n   * @param {Shape} target\n   * @param {Rect} newBounds\n   * @param {Object} [hints]\n   * @param {string} [hints.autoResize]\n   */\n  BpmnAutoResize.prototype.resize = function(target, newBounds, hints) {\n\n    if (is$1(target, 'bpmn:Participant')) {\n      this._modeling.resizeLane(target, newBounds, null, hints);\n    } else {\n      this._modeling.resizeShape(target, newBounds, null, hints);\n    }\n  };\n\n  /**\n   * @typedef {import('../../model/Types').Shape} Shape\n   *\n   * @typedef {import('../../core/EventBus').default} EventBus\n   */\n\n  /**\n   * This is a base rule provider for the element.autoResize rule.\n   *\n   * @param {EventBus} eventBus\n   */\n  function AutoResizeProvider(eventBus) {\n\n    RuleProvider.call(this, eventBus);\n\n    var self = this;\n\n    this.addRule('element.autoResize', function(context) {\n      return self.canResize(context.elements, context.target);\n    });\n  }\n\n  AutoResizeProvider.$inject = [ 'eventBus' ];\n\n  e$3(AutoResizeProvider, RuleProvider);\n\n  /**\n   * Needs to be implemented by sub classes to allow actual auto resize\n   *\n   * @param {Shape[]} elements\n   * @param {Shape} target\n   *\n   * @return {boolean}\n   */\n  AutoResizeProvider.prototype.canResize = function(elements, target) {\n    return false;\n  };\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   *\n   * @typedef {import('../../model/Types').Shape} Shape\n   */\n\n  /**\n   * BPMN-specific provider for automatic resizung.\n   *\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   */\n  function BpmnAutoResizeProvider(eventBus, modeling) {\n    AutoResizeProvider.call(this, eventBus);\n\n    this._modeling = modeling;\n  }\n\n  e$3(BpmnAutoResizeProvider, AutoResizeProvider);\n\n  BpmnAutoResizeProvider.$inject = [\n    'eventBus',\n    'modeling'\n  ];\n\n\n  /**\n   * BPMN-specific check whether given elements can be resized.\n   *\n   * @param {Shape[]} elements\n   * @param {Shape} target\n   *\n   * @return {boolean}\n   */\n  BpmnAutoResizeProvider.prototype.canResize = function(elements, target) {\n\n    // do not resize plane elements:\n    // root elements, collapsed sub-processes\n    if (is$1(target.di, 'bpmndi:BPMNPlane')) {\n      return false;\n    }\n\n    if (!is$1(target, 'bpmn:Participant') && !is$1(target, 'bpmn:Lane') && !(is$1(target, 'bpmn:SubProcess'))) {\n      return false;\n    }\n\n    var canResize = true;\n\n    forEach$1(elements, function(element) {\n\n      if (is$1(element, 'bpmn:Lane') || isLabel(element)) {\n        canResize = false;\n        return;\n      }\n    });\n\n    return canResize;\n  };\n\n  var AutoResizeModule = {\n    __init__: [\n      'bpmnAutoResize',\n      'bpmnAutoResizeProvider'\n    ],\n    bpmnAutoResize: [ 'type', BpmnAutoResize ],\n    bpmnAutoResizeProvider: [ 'type', BpmnAutoResizeProvider ]\n  };\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   *\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../../core/EventBus').default} EventBus\n   */\n\n  var HIGH_PRIORITY$j = 1500;\n\n\n  /**\n   * Browsers may swallow certain events (hover, out ...) if users are to\n   * fast with the mouse.\n   *\n   * @see http://stackoverflow.com/questions/7448468/why-cant-i-reliably-capture-a-mouseout-event\n   *\n   * The fix implemented in this component ensure that we\n   *\n   * 1) have a hover state after a successful drag.move event\n   * 2) have an out event when dragging leaves an element\n   *\n   * @param {ElementRegistry} elementRegistry\n   * @param {EventBus} eventBus\n   * @param {Injector} injector\n   */\n  function HoverFix(elementRegistry, eventBus, injector) {\n\n    var self = this;\n\n    var dragging = injector.get('dragging', false);\n\n    /**\n     * Make sure we are god damn hovering!\n     *\n     * @param {Event} dragging event\n     */\n    function ensureHover(event) {\n\n      if (event.hover) {\n        return;\n      }\n\n      var originalEvent = event.originalEvent;\n\n      var gfx = self._findTargetGfx(originalEvent);\n\n      var element = gfx && elementRegistry.get(gfx);\n\n      if (gfx && element) {\n\n        // 1) cancel current mousemove\n        event.stopPropagation();\n\n        // 2) emit fake hover for new target\n        dragging.hover({ element: element, gfx: gfx });\n\n        // 3) re-trigger move event\n        dragging.move(originalEvent);\n      }\n    }\n\n\n    if (dragging) {\n\n      /**\n       * We wait for a specific sequence of events before\n       * emitting a fake drag.hover event.\n       *\n       * Event Sequence:\n       *\n       * drag.start\n       * drag.move >> ensure we are hovering\n       */\n      eventBus.on('drag.start', function(event) {\n\n        eventBus.once('drag.move', HIGH_PRIORITY$j, function(event) {\n\n          ensureHover(event);\n\n        });\n\n      });\n    }\n\n\n    /**\n     * We make sure that element.out is always fired, even if the\n     * browser swallows an element.out event.\n     *\n     * Event sequence:\n     *\n     * element.hover\n     * (element.out >> sometimes swallowed)\n     * element.hover >> ensure we fired element.out\n     */\n    (function() {\n      var hoverGfx;\n      var hover;\n\n      eventBus.on('element.hover', function(event) {\n\n        // (1) remember current hover element\n        hoverGfx = event.gfx;\n        hover = event.element;\n      });\n\n      eventBus.on('element.hover', HIGH_PRIORITY$j, function(event) {\n\n        // (3) am I on an element still?\n        if (hover) {\n\n          // (4) that is a problem, gotta \"simulate the out\"\n          eventBus.fire('element.out', {\n            element: hover,\n            gfx: hoverGfx\n          });\n        }\n\n      });\n\n      eventBus.on('element.out', function() {\n\n        // (2) unset hover state if we correctly outed us *GG*\n        hoverGfx = null;\n        hover = null;\n      });\n\n    })();\n\n    this._findTargetGfx = function(event) {\n      var position,\n          target;\n\n      if (!(event instanceof MouseEvent)) {\n        return;\n      }\n\n      position = toPoint(event);\n\n      // damn expensive operation, ouch!\n      target = document.elementFromPoint(position.x, position.y);\n\n      return getGfx(target);\n    };\n\n  }\n\n  HoverFix.$inject = [\n    'elementRegistry',\n    'eventBus',\n    'injector'\n  ];\n\n\n  // helpers /////////////////////\n\n  function getGfx(target) {\n    return closest(target, 'svg, .djs-element', true);\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var HoverFixModule = {\n    __init__: [\n      'hoverFix'\n    ],\n    hoverFix: [ 'type', HoverFix ],\n  };\n\n  var round$a = Math.round;\n\n  /**\n   * @typedef {import('../../util/Types').Point} Point\n   *\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../selection/Selection').default} Selection\n   */\n\n  var DRAG_ACTIVE_CLS = 'djs-drag-active';\n\n\n  function preventDefault$1(event) {\n    event.preventDefault();\n  }\n\n  function isTouchEvent(event) {\n\n    // check for TouchEvent being available first\n    // (i.e. not available on desktop Firefox)\n    return typeof TouchEvent !== 'undefined' && event instanceof TouchEvent;\n  }\n\n  function getLength(point) {\n    return Math.sqrt(Math.pow(point.x, 2) + Math.pow(point.y, 2));\n  }\n\n  /**\n   * A helper that fires canvas localized drag events and realizes\n   * the general \"drag-and-drop\" look and feel.\n   *\n   * Calling {@link Dragging#activate} activates dragging on a canvas.\n   *\n   * It provides the following:\n   *\n   *   * emits life cycle events, namespaced with a prefix assigned\n   *     during dragging activation\n   *   * sets and restores the cursor\n   *   * sets and restores the selection if elements still exist\n   *   * ensures there can be only one drag operation active at a time\n   *\n   * Dragging may be canceled manually by calling {@link Dragging#cancel}\n   * or by pressing ESC.\n   *\n   *\n   * ## Life-cycle events\n   *\n   * Dragging can be in three different states, off, initialized\n   * and active.\n   *\n   * (1) off: no dragging operation is in progress\n   * (2) initialized: a new drag operation got initialized but not yet\n   *                  started (i.e. because of no initial move)\n   * (3) started: dragging is in progress\n   *\n   * Eventually dragging will be off again after a drag operation has\n   * been ended or canceled via user click or ESC key press.\n   *\n   * To indicate transitions between these states dragging emits generic\n   * life-cycle events with the `drag.` prefix _and_ events namespaced\n   * to a prefix choosen by a user during drag initialization.\n   *\n   * The following events are emitted (appropriately prefixed) via\n   * the {@link EventBus}.\n   *\n   * * `init`\n   * * `start`\n   * * `move`\n   * * `end`\n   * * `ended` (dragging already in off state)\n   * * `cancel` (only if previously started)\n   * * `canceled` (dragging already in off state, only if previously started)\n   * * `cleanup`\n   *\n   *\n   * @example\n   *\n   * ```javascript\n   * function MyDragComponent(eventBus, dragging) {\n   *\n   *   eventBus.on('mydrag.start', function(event) {\n   *     console.log('yes, we start dragging');\n   *   });\n   *\n   *   eventBus.on('mydrag.move', function(event) {\n   *     console.log('canvas local coordinates', event.x, event.y, event.dx, event.dy);\n   *\n   *     // local drag data is passed with the event\n   *     event.context.foo; // \"BAR\"\n   *\n   *     // the original mouse event, too\n   *     event.originalEvent; // MouseEvent(...)\n   *   });\n   *\n   *   eventBus.on('element.click', function(event) {\n   *     dragging.init(event, 'mydrag', {\n   *       cursor: 'grabbing',\n   *       data: {\n   *         context: {\n   *           foo: \"BAR\"\n   *         }\n   *       }\n   *     });\n   *   });\n   * }\n   * ```\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {Selection} selection\n   * @param {ElementRegistry} elementRegistry\n   */\n  function Dragging(eventBus, canvas, selection, elementRegistry) {\n\n    var defaultOptions = {\n      threshold: 5,\n      trapClick: true\n    };\n\n    // the currently active drag operation\n    // dragging is active as soon as this context exists.\n    //\n    // it is visually _active_ only when a context.active flag is set to true.\n    var context;\n\n    /* convert a global event into local coordinates */\n    function toLocalPoint(globalPosition) {\n\n      var viewbox = canvas.viewbox();\n\n      var clientRect = canvas._container.getBoundingClientRect();\n\n      return {\n        x: viewbox.x + (globalPosition.x - clientRect.left) / viewbox.scale,\n        y: viewbox.y + (globalPosition.y - clientRect.top) / viewbox.scale\n      };\n    }\n\n    // helpers\n\n    function fire(type, dragContext) {\n      dragContext = dragContext || context;\n\n      var event = eventBus.createEvent(\n        assign$1(\n          {},\n          dragContext.payload,\n          dragContext.data,\n          { isTouch: dragContext.isTouch }\n        )\n      );\n\n      // default integration\n      if (eventBus.fire('drag.' + type, event) === false) {\n        return false;\n      }\n\n      return eventBus.fire(dragContext.prefix + '.' + type, event);\n    }\n\n    function restoreSelection(previousSelection) {\n      var existingSelection = previousSelection.filter(function(element) {\n        return elementRegistry.get(element.id);\n      });\n\n      existingSelection.length && selection.select(existingSelection);\n    }\n\n    // event listeners\n\n    function move(event, activate) {\n      var payload = context.payload,\n          displacement = context.displacement;\n\n      var globalStart = context.globalStart,\n          globalCurrent = toPoint(event),\n          globalDelta = delta(globalCurrent, globalStart);\n\n      var localStart = context.localStart,\n          localCurrent = toLocalPoint(globalCurrent),\n          localDelta = delta(localCurrent, localStart);\n\n\n      // activate context explicitly or once threshold is reached\n      if (!context.active && (activate || getLength(globalDelta) > context.threshold)) {\n\n        // fire start event with original\n        // starting coordinates\n\n        assign$1(payload, {\n          x: round$a(localStart.x + displacement.x),\n          y: round$a(localStart.y + displacement.y),\n          dx: 0,\n          dy: 0\n        }, { originalEvent: event });\n\n        if (false === fire('start')) {\n          return cancel();\n        }\n\n        context.active = true;\n\n        // unset selection and remember old selection\n        // the previous (old) selection will always passed\n        // with the event via the event.previousSelection property\n        if (!context.keepSelection) {\n          payload.previousSelection = selection.get();\n          selection.select(null);\n        }\n\n        // allow custom cursor\n        if (context.cursor) {\n          set(context.cursor);\n        }\n\n        // indicate dragging via marker on root element\n        canvas.addMarker(canvas.getRootElement(), DRAG_ACTIVE_CLS);\n      }\n\n      stopPropagation$1(event);\n\n      if (context.active) {\n\n        // update payload with actual coordinates\n        assign$1(payload, {\n          x: round$a(localCurrent.x + displacement.x),\n          y: round$a(localCurrent.y + displacement.y),\n          dx: round$a(localDelta.x),\n          dy: round$a(localDelta.y)\n        }, { originalEvent: event });\n\n        // emit move event\n        fire('move');\n      }\n    }\n\n    function end(event) {\n      var previousContext,\n          returnValue = true;\n\n      if (context.active) {\n\n        if (event) {\n          context.payload.originalEvent = event;\n\n          // suppress original event (click, ...)\n          // because we just ended a drag operation\n          stopPropagation$1(event);\n        }\n\n        // implementations may stop restoring the\n        // original state (selections, ...) by preventing the\n        // end events default action\n        returnValue = fire('end');\n      }\n\n      if (returnValue === false) {\n        fire('rejected');\n      }\n\n      previousContext = cleanup(returnValue !== true);\n\n      // last event to be fired when all drag operations are done\n      // at this point in time no drag operation is in progress anymore\n      fire('ended', previousContext);\n    }\n\n\n    // cancel active drag operation if the user presses\n    // the ESC key on the keyboard\n\n    function checkCancel(event) {\n\n      if (isKey('Escape', event)) {\n        preventDefault$1(event);\n\n        cancel();\n      }\n    }\n\n\n    // prevent ghost click that might occur after a finished\n    // drag and drop session\n\n    function trapClickAndEnd(event) {\n\n      var untrap;\n\n      // trap the click in case we are part of an active\n      // drag operation. This will effectively prevent\n      // the ghost click that cannot be canceled otherwise.\n      if (context.active) {\n\n        untrap = install(eventBus);\n\n        // remove trap after minimal delay\n        setTimeout(untrap, 400);\n\n        // prevent default action (click)\n        preventDefault$1(event);\n      }\n\n      end(event);\n    }\n\n    function trapTouch(event) {\n      move(event);\n    }\n\n    // update the drag events model element (`hover`) and graphical element (`hoverGfx`)\n    // properties during hover and out and fire {prefix}.hover and {prefix}.out properties\n    // respectively\n\n    function hover(event) {\n      var payload = context.payload;\n\n      payload.hoverGfx = event.gfx;\n      payload.hover = event.element;\n\n      fire('hover');\n    }\n\n    function out(event) {\n      fire('out');\n\n      var payload = context.payload;\n\n      payload.hoverGfx = null;\n      payload.hover = null;\n    }\n\n\n    // life-cycle methods\n\n    function cancel(restore) {\n      var previousContext;\n\n      if (!context) {\n        return;\n      }\n\n      var wasActive = context.active;\n\n      if (wasActive) {\n        fire('cancel');\n      }\n\n      previousContext = cleanup(restore);\n\n      if (wasActive) {\n\n        // last event to be fired when all drag operations are done\n        // at this point in time no drag operation is in progress anymore\n        fire('canceled', previousContext);\n      }\n    }\n\n    function cleanup(restore) {\n      var previousContext,\n          endDrag;\n\n      fire('cleanup');\n\n      // reset cursor\n      unset();\n\n      if (context.trapClick) {\n        endDrag = trapClickAndEnd;\n      } else {\n        endDrag = end;\n      }\n\n      // reset dom listeners\n      event.unbind(document, 'mousemove', move);\n\n      event.unbind(document, 'dragstart', preventDefault$1);\n      event.unbind(document, 'selectstart', preventDefault$1);\n\n      event.unbind(document, 'mousedown', endDrag, true);\n      event.unbind(document, 'mouseup', endDrag, true);\n\n      event.unbind(document, 'keyup', checkCancel);\n\n      event.unbind(document, 'touchstart', trapTouch, true);\n      event.unbind(document, 'touchcancel', cancel, true);\n      event.unbind(document, 'touchmove', move, true);\n      event.unbind(document, 'touchend', end, true);\n\n      eventBus.off('element.hover', hover);\n      eventBus.off('element.out', out);\n\n      // remove drag marker on root element\n      canvas.removeMarker(canvas.getRootElement(), DRAG_ACTIVE_CLS);\n\n      // restore selection, unless it has changed\n      var previousSelection = context.payload.previousSelection;\n\n      if (restore !== false && previousSelection && !selection.get().length) {\n        restoreSelection(previousSelection);\n      }\n\n      previousContext = context;\n\n      context = null;\n\n      return previousContext;\n    }\n\n    /**\n     * Initialize a drag operation.\n     *\n     * If `localPosition` is given, drag events will be emitted\n     * relative to it.\n     *\n     * @param {MouseEvent|TouchEvent} [event]\n     * @param {Point} [relativeTo] actual diagram local position this drag operation should start at\n     * @param {string} prefix\n     * @param {Object} [options]\n     */\n    function init(event$1, relativeTo, prefix, options) {\n\n      // only one drag operation may be active, at a time\n      if (context) {\n        cancel(false);\n      }\n\n      if (typeof relativeTo === 'string') {\n        options = prefix;\n        prefix = relativeTo;\n        relativeTo = null;\n      }\n\n      options = assign$1({}, defaultOptions, options || {});\n\n      var data = options.data || {},\n          originalEvent,\n          globalStart,\n          localStart,\n          endDrag,\n          isTouch;\n\n      if (options.trapClick) {\n        endDrag = trapClickAndEnd;\n      } else {\n        endDrag = end;\n      }\n\n      if (event$1) {\n        originalEvent = getOriginal$1(event$1) || event$1;\n        globalStart = toPoint(event$1);\n\n        stopPropagation$1(event$1);\n\n        // prevent default browser dragging behavior\n        if (originalEvent.type === 'dragstart') {\n          preventDefault$1(originalEvent);\n        }\n      } else {\n        originalEvent = null;\n        globalStart = { x: 0, y: 0 };\n      }\n\n      localStart = toLocalPoint(globalStart);\n\n      if (!relativeTo) {\n        relativeTo = localStart;\n      }\n\n      isTouch = isTouchEvent(originalEvent);\n\n      context = assign$1({\n        prefix: prefix,\n        data: data,\n        payload: {},\n        globalStart: globalStart,\n        displacement: delta(relativeTo, localStart),\n        localStart: localStart,\n        isTouch: isTouch\n      }, options);\n\n      // skip dom registration if trigger\n      // is set to manual (during testing)\n      if (!options.manual) {\n\n        // add dom listeners\n\n        if (isTouch) {\n          event.bind(document, 'touchstart', trapTouch, true);\n          event.bind(document, 'touchcancel', cancel, true);\n          event.bind(document, 'touchmove', move, true);\n          event.bind(document, 'touchend', end, true);\n        } else {\n\n          // assume we use the mouse to interact per default\n          event.bind(document, 'mousemove', move);\n\n          // prevent default browser drag and text selection behavior\n          event.bind(document, 'dragstart', preventDefault$1);\n          event.bind(document, 'selectstart', preventDefault$1);\n\n          event.bind(document, 'mousedown', endDrag, true);\n          event.bind(document, 'mouseup', endDrag, true);\n        }\n\n        event.bind(document, 'keyup', checkCancel);\n\n        eventBus.on('element.hover', hover);\n        eventBus.on('element.out', out);\n      }\n\n      fire('init');\n\n      if (options.autoActivate) {\n        move(event$1, true);\n      }\n    }\n\n    // cancel on diagram destruction\n    eventBus.on('diagram.destroy', cancel);\n\n\n    // API\n\n    this.init = init;\n    this.move = move;\n    this.hover = hover;\n    this.out = out;\n    this.end = end;\n\n    this.cancel = cancel;\n\n    // for introspection\n\n    this.context = function() {\n      return context;\n    };\n\n    this.setOptions = function(options) {\n      assign$1(defaultOptions, options);\n    };\n  }\n\n  Dragging.$inject = [\n    'eventBus',\n    'canvas',\n    'selection',\n    'elementRegistry'\n  ];\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var DraggingModule = {\n    __depends__: [\n      HoverFixModule,\n      SelectionModule,\n    ],\n    dragging: [ 'type', Dragging ],\n  };\n\n  /**\n   * @typedef {import('../../util/Types').Point} Point\n   *\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../../core/Canvas').default} Canvas\n   */\n\n  /**\n   * Initiates canvas scrolling if current cursor point is close to a border.\n   * Cancelled when current point moves back inside the scrolling borders\n   * or cancelled manually.\n   *\n   * Default options :\n   *   scrollThresholdIn: [ 20, 20, 20, 20 ],\n   *   scrollThresholdOut: [ 0, 0, 0, 0 ],\n   *   scrollRepeatTimeout: 15,\n   *   scrollStep: 10\n   *\n   * Threshold order:\n   *   [ left, top, right, bottom ]\n   *\n   * @param {Object} config\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   */\n  function AutoScroll(config, eventBus, canvas) {\n\n    this._canvas = canvas;\n\n    this._opts = assign$1({\n      scrollThresholdIn: [ 20, 20, 20, 20 ],\n      scrollThresholdOut: [ 0, 0, 0, 0 ],\n      scrollRepeatTimeout: 15,\n      scrollStep: 10\n    }, config);\n\n    var self = this;\n\n    eventBus.on('drag.move', function(e) {\n      var point = self._toBorderPoint(e);\n\n      self.startScroll(point);\n    });\n\n    eventBus.on([ 'drag.cleanup' ], function() {\n      self.stopScroll();\n    });\n  }\n\n  AutoScroll.$inject = [\n    'config.autoScroll',\n    'eventBus',\n    'canvas'\n  ];\n\n\n  /**\n   * Starts scrolling loop.\n   * Point is given in global scale in canvas container box plane.\n   *\n   * @param {Point} point\n   */\n  AutoScroll.prototype.startScroll = function(point) {\n\n    var canvas = this._canvas;\n    var opts = this._opts;\n    var self = this;\n\n    var clientRect = canvas.getContainer().getBoundingClientRect();\n\n    var diff = [\n      point.x,\n      point.y,\n      clientRect.width - point.x,\n      clientRect.height - point.y\n    ];\n\n    this.stopScroll();\n\n    var dx = 0,\n        dy = 0;\n\n    for (var i = 0; i < 4; i++) {\n      if (between(diff[i], opts.scrollThresholdOut[i], opts.scrollThresholdIn[i])) {\n        if (i === 0) {\n          dx = opts.scrollStep;\n        } else if (i == 1) {\n          dy = opts.scrollStep;\n        } else if (i == 2) {\n          dx = -opts.scrollStep;\n        } else if (i == 3) {\n          dy = -opts.scrollStep;\n        }\n      }\n    }\n\n    if (dx !== 0 || dy !== 0) {\n      canvas.scroll({ dx: dx, dy: dy });\n\n      this._scrolling = setTimeout(function() {\n        self.startScroll(point);\n      }, opts.scrollRepeatTimeout);\n    }\n  };\n\n  function between(val, start, end) {\n    if (start < val && val < end) {\n      return true;\n    }\n\n    return false;\n  }\n\n\n  /**\n   * Stops scrolling loop.\n   */\n  AutoScroll.prototype.stopScroll = function() {\n    clearTimeout(this._scrolling);\n  };\n\n\n  /**\n   * Overrides defaults options.\n   *\n   * @param {Object} options\n   */\n  AutoScroll.prototype.setOptions = function(options) {\n    this._opts = assign$1({}, this._opts, options);\n  };\n\n\n  /**\n   * Converts event to a point in canvas container plane in global scale.\n   *\n   * @param {Event} event\n   * @return {Point}\n   */\n  AutoScroll.prototype._toBorderPoint = function(event) {\n    var clientRect = this._canvas._container.getBoundingClientRect();\n\n    var globalPosition = toPoint(event.originalEvent);\n\n    return {\n      x: globalPosition.x - clientRect.left,\n      y: globalPosition.y - clientRect.top\n    };\n  };\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var AutoScrollModule = {\n    __depends__: [\n      DraggingModule,\n    ],\n    __init__: [ 'autoScroll' ],\n    autoScroll: [ 'type', AutoScroll ]\n  };\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   */\n\n  /**\n   * A service that provides rules for certain diagram actions.\n   *\n   * The default implementation will hook into the {@link CommandStack}\n   * to perform the actual rule evaluation. Make sure to provide the\n   * `commandStack` service with this module if you plan to use it.\n   *\n   * Together with this implementation you may use the {@link import('./RuleProvider').default}\n   * to implement your own rule checkers.\n   *\n   * This module is ment to be easily replaced, thus the tiny foot print.\n   *\n   * @param {Injector} injector\n   */\n  function Rules(injector) {\n    this._commandStack = injector.get('commandStack', false);\n  }\n\n  Rules.$inject = [ 'injector' ];\n\n\n  /**\n   * Returns whether or not a given modeling action can be executed\n   * in the specified context.\n   *\n   * This implementation will respond with allow unless anyone\n   * objects.\n   *\n   * @param {string} action The action to be allowed or disallowed.\n   * @param {Object} [context] The context for allowing or disallowing the action.\n   *\n   * @return {boolean|null} Wether the action is allowed. Returns `null` if the action\n   * is to be ignored.\n   */\n  Rules.prototype.allowed = function(action, context) {\n    var allowed = true;\n\n    var commandStack = this._commandStack;\n\n    if (commandStack) {\n      allowed = commandStack.canExecute(action, context);\n    }\n\n    // map undefined to true, i.e. no rules\n    return allowed === undefined ? true : allowed;\n  };\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var RulesModule$1 = {\n    __init__: [ 'rules' ],\n    rules: [ 'type', Rules ]\n  };\n\n  /**\n   * @typedef {import('../util/Types').Point} Point\n   *\n   * @typedef { {\n   *   bendpoint?: boolean;\n   *   index: number;\n   *   point: Point;\n   * } } Intersection\n   */\n\n  var round$9 = Math.round,\n      max$6 = Math.max;\n\n\n  function circlePath(center, r) {\n    var x = center.x,\n        y = center.y;\n\n    return [\n      [ 'M', x, y ],\n      [ 'm', 0, -r ],\n      [ 'a', r, r, 0, 1, 1, 0, 2 * r ],\n      [ 'a', r, r, 0, 1, 1, 0, -2 * r ],\n      [ 'z' ]\n    ];\n  }\n\n  function linePath(points) {\n    var segments = [];\n\n    points.forEach(function(p, idx) {\n      segments.push([ idx === 0 ? 'M' : 'L', p.x, p.y ]);\n    });\n\n    return segments;\n  }\n\n\n  var INTERSECTION_THRESHOLD$1 = 10;\n\n  /**\n   * @param {Point[]} waypoints\n   * @param {Point} reference\n   *\n   * @return {Intersection|null}\n   */\n  function getBendpointIntersection(waypoints, reference) {\n\n    var i, w;\n\n    for (i = 0; (w = waypoints[i]); i++) {\n\n      if (pointDistance(w, reference) <= INTERSECTION_THRESHOLD$1) {\n        return {\n          point: waypoints[i],\n          bendpoint: true,\n          index: i\n        };\n      }\n    }\n\n    return null;\n  }\n\n  /**\n   * @param {Point[]} waypoints\n   * @param {Point} reference\n   *\n   * @return {Intersection|null}\n   */\n  function getPathIntersection(waypoints, reference) {\n\n    var intersections = intersectPaths(circlePath(reference, INTERSECTION_THRESHOLD$1), linePath(waypoints));\n\n    var a = intersections[0],\n        b = intersections[intersections.length - 1],\n        idx;\n\n    if (!a) {\n\n      // no intersection\n      return null;\n    }\n\n    if (a !== b) {\n\n      if (a.segment2 !== b.segment2) {\n\n        // we use the bendpoint in between both segments\n        // as the intersection point\n\n        idx = max$6(a.segment2, b.segment2) - 1;\n\n        return {\n          point: waypoints[idx],\n          bendpoint: true,\n          index: idx\n        };\n      }\n\n      return {\n        point: {\n          x: (round$9(a.x + b.x) / 2),\n          y: (round$9(a.y + b.y) / 2)\n        },\n        index: a.segment2\n      };\n    }\n\n    return {\n      point: {\n        x: round$9(a.x),\n        y: round$9(a.y)\n      },\n      index: a.segment2\n    };\n  }\n\n  /**\n   * Returns the closest point on the connection towards a given reference point.\n   *\n   * @param {Point[]} waypoints\n   * @param {Point} reference\n   *\n   * @return {Intersection|null}\n   */\n  function getApproxIntersection(waypoints, reference) {\n    return getBendpointIntersection(waypoints, reference) || getPathIntersection(waypoints, reference);\n  }\n\n  /**\n   * @typedef {import('../../util/Types').Point} Point\n   * @typedef {import('../../util/Types').Vector} Vector\n   */\n\n  /**\n   * Returns the length of a vector.\n   *\n   * @param {Vector} vector\n   *\n   * @return {number}\n   */\n  function vectorLength(vector) {\n    return Math.sqrt(Math.pow(vector.x, 2) + Math.pow(vector.y, 2));\n  }\n\n\n  /**\n   * Calculates the angle between a line a the Y axis.\n   *\n   * @param {Point[]} line\n   *\n   * @return {number}\n   */\n  function getAngle(line) {\n\n    // return value is between 0, 180 and -180, -0\n    // @janstuemmel: maybe replace return a/b with b/a\n    return Math.atan((line[1].y - line[0].y) / (line[1].x - line[0].x));\n  }\n\n\n  /**\n   * Rotates a vector by a given angle.\n   *\n   * @param {Vector} vector\n   * @param {number} angle The angle in radians.\n   *\n   * @return {Vector}\n   */\n  function rotateVector(vector, angle) {\n    return (!angle) ? vector : {\n      x: Math.cos(angle) * vector.x - Math.sin(angle) * vector.y,\n      y: Math.sin(angle) * vector.x + Math.cos(angle) * vector.y\n    };\n  }\n\n\n  /**\n   * Solves a 2D equation system\n   * a + r*b = c, where a,b,c are 2D vectors\n   *\n   * @param {Vector} a\n   * @param {Vector} b\n   * @param {Vector} c\n   *\n   * @return {number}\n   */\n  function solveLambaSystem(a, b, c) {\n\n    // the 2d system\n    var system = [\n      { n: a[0] - c[0], lambda: b[0] },\n      { n: a[1] - c[1], lambda: b[1] }\n    ];\n\n    // solve\n    var n = system[0].n * b[0] + system[1].n * b[1],\n        l = system[0].lambda * b[0] + system[1].lambda * b[1];\n\n    return -n / l;\n  }\n\n\n  /**\n   * Calculates the position of the perpendicular foot.\n   *\n   * @param {Point} point\n   * @param {Point[]} line\n   *\n   * @return {Point}\n   */\n  function perpendicularFoot(point, line) {\n\n    var a = line[0], b = line[1];\n\n    // relative position of b from a\n    var bd = { x: b.x - a.x, y: b.y - a.y };\n\n    // solve equation system to the parametrized vectors param real value\n    var r = solveLambaSystem([ a.x, a.y ], [ bd.x, bd.y ], [ point.x, point.y ]);\n\n    return { x: a.x + r * bd.x, y: a.y + r * bd.y };\n  }\n\n\n  /**\n   * Calculates the distance between a point and a line.\n   *\n   * @param {Point} point\n   * @param {Point[]} line\n   *\n   * @return {number}\n   */\n  function getDistancePointLine(point, line) {\n\n    var pfPoint = perpendicularFoot(point, line);\n\n    // distance vector\n    var connectionVector = {\n      x: pfPoint.x - point.x,\n      y: pfPoint.y - point.y\n    };\n\n    return vectorLength(connectionVector);\n  }\n\n\n  /**\n   * Calculates the distance between two points.\n   *\n   * @param {Point} point1\n   * @param {Point} point2\n   *\n   * @return {number}\n   */\n  function getDistancePointPoint(point1, point2) {\n\n    return vectorLength({\n      x: point1.x - point2.x,\n      y: point1.y - point2.y\n    });\n  }\n\n  /**\n   * @typedef {import('../../core/Types').ConnectionLike} Connection\n   *\n   * @typedef {import('../../util/Types').Point} Point\n   */\n\n  var BENDPOINT_CLS = 'djs-bendpoint';\n  var SEGMENT_DRAGGER_CLS = 'djs-segment-dragger';\n\n  function toCanvasCoordinates(canvas, event) {\n\n    var position = toPoint(event),\n        clientRect = canvas._container.getBoundingClientRect(),\n        offset;\n\n    // canvas relative position\n\n    offset = {\n      x: clientRect.left,\n      y: clientRect.top\n    };\n\n    // update actual event payload with canvas relative measures\n\n    var viewbox = canvas.viewbox();\n\n    return {\n      x: viewbox.x + (position.x - offset.x) / viewbox.scale,\n      y: viewbox.y + (position.y - offset.y) / viewbox.scale\n    };\n  }\n\n  function getConnectionIntersection(canvas, waypoints, event) {\n    var localPosition = toCanvasCoordinates(canvas, event),\n        intersection = getApproxIntersection(waypoints, localPosition);\n\n    return intersection;\n  }\n\n  function addBendpoint(parentGfx, cls) {\n    var groupGfx = create$1('g');\n    classes(groupGfx).add(BENDPOINT_CLS);\n\n    append(parentGfx, groupGfx);\n\n    var visual = create$1('circle');\n    attr(visual, {\n      cx: 0,\n      cy: 0,\n      r: 4\n    });\n    classes(visual).add('djs-visual');\n\n    append(groupGfx, visual);\n\n    var hit = create$1('circle');\n    attr(hit, {\n      cx: 0,\n      cy: 0,\n      r: 10\n    });\n    classes(hit).add('djs-hit');\n\n    append(groupGfx, hit);\n\n    if (cls) {\n      classes(groupGfx).add(cls);\n    }\n\n    return groupGfx;\n  }\n\n  function createParallelDragger(parentGfx, segmentStart, segmentEnd, alignment) {\n    var draggerGfx = create$1('g');\n\n    append(parentGfx, draggerGfx);\n\n    var width = 18,\n        height = 6,\n        padding = 11,\n        hitWidth = calculateHitWidth(segmentStart, segmentEnd, alignment),\n        hitHeight = height + padding;\n\n    var visual = create$1('rect');\n    attr(visual, {\n      x: -width / 2,\n      y: -height / 2,\n      width: width,\n      height: height\n    });\n    classes(visual).add('djs-visual');\n\n    append(draggerGfx, visual);\n\n    var hit = create$1('rect');\n    attr(hit, {\n      x: -hitWidth / 2,\n      y: -hitHeight / 2,\n      width: hitWidth,\n      height: hitHeight\n    });\n    classes(hit).add('djs-hit');\n\n    append(draggerGfx, hit);\n\n    rotate(draggerGfx, alignment === 'v' ? 90 : 0);\n\n    return draggerGfx;\n  }\n\n\n  function addSegmentDragger(parentGfx, segmentStart, segmentEnd) {\n\n    var groupGfx = create$1('g'),\n        mid = getMidPoint(segmentStart, segmentEnd),\n        alignment = pointsAligned(segmentStart, segmentEnd);\n\n    append(parentGfx, groupGfx);\n\n    createParallelDragger(groupGfx, segmentStart, segmentEnd, alignment);\n\n    classes(groupGfx).add(SEGMENT_DRAGGER_CLS);\n    classes(groupGfx).add(alignment === 'h' ? 'horizontal' : 'vertical');\n\n    translate$2(groupGfx, mid.x, mid.y);\n\n    return groupGfx;\n  }\n\n  /**\n   * Calculates region for segment move which is 2/3 of the full segment length\n   * @param {number} segmentLength\n   *\n   * @return {number}\n   */\n  function calculateSegmentMoveRegion(segmentLength) {\n    return Math.abs(Math.round(segmentLength * 2 / 3));\n  }\n\n  /**\n   * Returns the point with the closest distance that is on the connection path.\n   *\n   * @param {Point} position\n   * @param {Connection} connection\n   * @return {Point}\n   */\n  function getClosestPointOnConnection(position, connection) {\n    var segment = getClosestSegment(position, connection);\n\n    return perpendicularFoot(position, segment);\n  }\n\n\n  // helper //////////\n\n  function calculateHitWidth(segmentStart, segmentEnd, alignment) {\n    var segmentLengthXAxis = segmentEnd.x - segmentStart.x,\n        segmentLengthYAxis = segmentEnd.y - segmentStart.y;\n\n    return alignment === 'h' ?\n      calculateSegmentMoveRegion(segmentLengthXAxis) :\n      calculateSegmentMoveRegion(segmentLengthYAxis);\n  }\n\n  function getClosestSegment(position, connection) {\n    var waypoints = connection.waypoints;\n\n    var minDistance = Infinity,\n        segmentIndex;\n\n    for (var i = 0; i < waypoints.length - 1; i++) {\n      var start = waypoints[i],\n          end = waypoints[i + 1],\n          distance = getDistancePointLine(position, [ start, end ]);\n\n      if (distance < minDistance) {\n        minDistance = distance;\n        segmentIndex = i;\n      }\n    }\n\n    return [ waypoints[segmentIndex], waypoints[segmentIndex + 1] ];\n  }\n\n  /**\n   * @typedef {import('../bendpoints/BendpointMove').default} BendpointMove\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../bendpoints/ConnectionSegmentMove').default} ConnectionSegmentMove\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../interaction-events/InteractionEvents').default} InteractionEvents\n   */\n\n  /**\n   * A service that adds editable bendpoints to connections.\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {InteractionEvents} interactionEvents\n   * @param {BendpointMove} bendpointMove\n   * @param {ConnectionSegmentMove} connectionSegmentMove\n   */\n  function Bendpoints(\n      eventBus, canvas, interactionEvents,\n      bendpointMove, connectionSegmentMove) {\n\n    /**\n     * Returns true if intersection point is inside middle region of segment, adjusted by\n     * optional threshold\n     */\n    function isIntersectionMiddle(intersection, waypoints, treshold) {\n      var idx = intersection.index,\n          p = intersection.point,\n          p0, p1, mid, aligned, xDelta, yDelta;\n\n      if (idx <= 0 || intersection.bendpoint) {\n        return false;\n      }\n\n      p0 = waypoints[idx - 1];\n      p1 = waypoints[idx];\n      mid = getMidPoint(p0, p1),\n      aligned = pointsAligned(p0, p1);\n      xDelta = Math.abs(p.x - mid.x);\n      yDelta = Math.abs(p.y - mid.y);\n\n      return aligned && xDelta <= treshold && yDelta <= treshold;\n    }\n\n    /**\n     * Calculates the threshold from a connection's middle which fits the two-third-region\n     */\n    function calculateIntersectionThreshold(connection, intersection) {\n      var waypoints = connection.waypoints,\n          relevantSegment, alignment, segmentLength, threshold;\n\n      if (intersection.index <= 0 || intersection.bendpoint) {\n        return null;\n      }\n\n      // segment relative to connection intersection\n      relevantSegment = {\n        start: waypoints[intersection.index - 1],\n        end: waypoints[intersection.index]\n      };\n\n      alignment = pointsAligned(relevantSegment.start, relevantSegment.end);\n\n      if (!alignment) {\n        return null;\n      }\n\n      if (alignment === 'h') {\n        segmentLength = relevantSegment.end.x - relevantSegment.start.x;\n      } else {\n        segmentLength = relevantSegment.end.y - relevantSegment.start.y;\n      }\n\n      // calculate threshold relative to 2/3 of segment length\n      threshold = calculateSegmentMoveRegion(segmentLength) / 2;\n\n      return threshold;\n    }\n\n    function activateBendpointMove(event, connection) {\n      var waypoints = connection.waypoints,\n          intersection = getConnectionIntersection(canvas, waypoints, event),\n          threshold;\n\n      if (!intersection) {\n        return;\n      }\n\n      threshold = calculateIntersectionThreshold(connection, intersection);\n\n      if (isIntersectionMiddle(intersection, waypoints, threshold)) {\n        connectionSegmentMove.start(event, connection, intersection.index);\n      } else {\n        bendpointMove.start(event, connection, intersection.index, !intersection.bendpoint);\n      }\n\n      // we've handled the event\n      return true;\n    }\n\n    function bindInteractionEvents(node, eventName, element) {\n\n      event.bind(node, eventName, function(event) {\n        interactionEvents.triggerMouseEvent(eventName, event, element);\n        event.stopPropagation();\n      });\n    }\n\n    function getBendpointsContainer(element, create) {\n\n      var layer = canvas.getLayer('overlays'),\n          gfx = query('.djs-bendpoints[data-element-id=\"' + escapeCSS(element.id) + '\"]', layer);\n\n      if (!gfx && create) {\n        gfx = create$1('g');\n        attr(gfx, { 'data-element-id': element.id });\n        classes(gfx).add('djs-bendpoints');\n\n        append(layer, gfx);\n\n        bindInteractionEvents(gfx, 'mousedown', element);\n        bindInteractionEvents(gfx, 'click', element);\n        bindInteractionEvents(gfx, 'dblclick', element);\n      }\n\n      return gfx;\n    }\n\n    function getSegmentDragger(idx, parentGfx) {\n      return query(\n        '.djs-segment-dragger[data-segment-idx=\"' + idx + '\"]',\n        parentGfx\n      );\n    }\n\n    function createBendpoints(gfx, connection) {\n      connection.waypoints.forEach(function(p, idx) {\n        var bendpoint = addBendpoint(gfx);\n\n        append(gfx, bendpoint);\n\n        translate$2(bendpoint, p.x, p.y);\n      });\n\n      // add floating bendpoint\n      addBendpoint(gfx, 'floating');\n    }\n\n    function createSegmentDraggers(gfx, connection) {\n\n      var waypoints = connection.waypoints;\n\n      var segmentStart,\n          segmentEnd,\n          segmentDraggerGfx;\n\n      for (var i = 1; i < waypoints.length; i++) {\n\n        segmentStart = waypoints[i - 1];\n        segmentEnd = waypoints[i];\n\n        if (pointsAligned(segmentStart, segmentEnd)) {\n          segmentDraggerGfx = addSegmentDragger(gfx, segmentStart, segmentEnd);\n\n          attr(segmentDraggerGfx, { 'data-segment-idx': i });\n\n          bindInteractionEvents(segmentDraggerGfx, 'mousemove', connection);\n        }\n      }\n    }\n\n    function clearBendpoints(gfx) {\n      forEach$1(all('.' + BENDPOINT_CLS, gfx), function(node) {\n        remove$1(node);\n      });\n    }\n\n    function clearSegmentDraggers(gfx) {\n      forEach$1(all('.' + SEGMENT_DRAGGER_CLS, gfx), function(node) {\n        remove$1(node);\n      });\n    }\n\n    function addHandles(connection) {\n\n      var gfx = getBendpointsContainer(connection);\n\n      if (!gfx) {\n        gfx = getBendpointsContainer(connection, true);\n\n        createBendpoints(gfx, connection);\n        createSegmentDraggers(gfx, connection);\n      }\n\n      return gfx;\n    }\n\n    function updateHandles(connection) {\n\n      var gfx = getBendpointsContainer(connection);\n\n      if (gfx) {\n        clearSegmentDraggers(gfx);\n        clearBendpoints(gfx);\n        createSegmentDraggers(gfx, connection);\n        createBendpoints(gfx, connection);\n      }\n    }\n\n    function updateFloatingBendpointPosition(parentGfx, intersection) {\n      var floating = query('.floating', parentGfx),\n          point = intersection.point;\n\n      if (!floating) {\n        return;\n      }\n\n      translate$2(floating, point.x, point.y);\n\n    }\n\n    function updateSegmentDraggerPosition(parentGfx, intersection, waypoints) {\n\n      var draggerGfx = getSegmentDragger(intersection.index, parentGfx),\n          segmentStart = waypoints[intersection.index - 1],\n          segmentEnd = waypoints[intersection.index],\n          point = intersection.point,\n          mid = getMidPoint(segmentStart, segmentEnd),\n          alignment = pointsAligned(segmentStart, segmentEnd),\n          draggerVisual, relativePosition;\n\n      if (!draggerGfx) {\n        return;\n      }\n\n      draggerVisual = getDraggerVisual(draggerGfx);\n\n      relativePosition = {\n        x: point.x - mid.x,\n        y: point.y - mid.y\n      };\n\n      if (alignment === 'v') {\n\n        // rotate position\n        relativePosition = {\n          x: relativePosition.y,\n          y: relativePosition.x\n        };\n      }\n\n      translate$2(draggerVisual, relativePosition.x, relativePosition.y);\n    }\n\n    eventBus.on('connection.changed', function(event) {\n      updateHandles(event.element);\n    });\n\n    eventBus.on('connection.remove', function(event) {\n      var gfx = getBendpointsContainer(event.element);\n\n      if (gfx) {\n        remove$1(gfx);\n      }\n    });\n\n    eventBus.on('element.marker.update', function(event) {\n\n      var element = event.element,\n          bendpointsGfx;\n\n      if (!element.waypoints) {\n        return;\n      }\n\n      bendpointsGfx = addHandles(element);\n\n      if (event.add) {\n        classes(bendpointsGfx).add(event.marker);\n      } else {\n        classes(bendpointsGfx).remove(event.marker);\n      }\n    });\n\n    eventBus.on('element.mousemove', function(event) {\n\n      var element = event.element,\n          waypoints = element.waypoints,\n          bendpointsGfx,\n          intersection;\n\n      if (waypoints) {\n        bendpointsGfx = getBendpointsContainer(element, true);\n\n        intersection = getConnectionIntersection(canvas, waypoints, event.originalEvent);\n\n        if (!intersection) {\n          return;\n        }\n\n        updateFloatingBendpointPosition(bendpointsGfx, intersection);\n\n        if (!intersection.bendpoint) {\n          updateSegmentDraggerPosition(bendpointsGfx, intersection, waypoints);\n        }\n\n      }\n    });\n\n    eventBus.on('element.mousedown', function(event) {\n\n      if (!isPrimaryButton(event)) {\n        return;\n      }\n\n      var originalEvent = event.originalEvent,\n          element = event.element;\n\n      if (!element.waypoints) {\n        return;\n      }\n\n      return activateBendpointMove(originalEvent, element);\n    });\n\n    eventBus.on('selection.changed', function(event) {\n      var newSelection = event.newSelection,\n          primary = newSelection[0];\n\n      if (primary && primary.waypoints) {\n        addHandles(primary);\n      }\n    });\n\n    eventBus.on('element.hover', function(event) {\n      var element = event.element;\n\n      if (element.waypoints) {\n        addHandles(element);\n        interactionEvents.registerEvent(event.gfx, 'mousemove', 'element.mousemove');\n      }\n    });\n\n    eventBus.on('element.out', function(event) {\n      interactionEvents.unregisterEvent(event.gfx, 'mousemove', 'element.mousemove');\n    });\n\n    // update bendpoint container data attribute on element ID change\n    eventBus.on('element.updateId', function(context) {\n      var element = context.element,\n          newId = context.newId;\n\n      if (element.waypoints) {\n        var bendpointContainer = getBendpointsContainer(element);\n\n        if (bendpointContainer) {\n          attr(bendpointContainer, { 'data-element-id': newId });\n        }\n      }\n    });\n\n    // API\n\n    this.addHandles = addHandles;\n    this.updateHandles = updateHandles;\n    this.getBendpointsContainer = getBendpointsContainer;\n    this.getSegmentDragger = getSegmentDragger;\n  }\n\n  Bendpoints.$inject = [\n    'eventBus',\n    'canvas',\n    'interactionEvents',\n    'bendpointMove',\n    'connectionSegmentMove'\n  ];\n\n\n\n  // helper /////////////\n\n  function getDraggerVisual(draggerGfx) {\n    return query('.djs-visual', draggerGfx);\n  }\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   *\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../dragging/Dragging').default} Dragging\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   * @typedef {import('../rules/Rules').default} Rules\n   */\n\n  var round$8 = Math.round;\n\n  var RECONNECT_START$1 = 'reconnectStart',\n      RECONNECT_END$1 = 'reconnectEnd',\n      UPDATE_WAYPOINTS$1 = 'updateWaypoints';\n\n\n  /**\n   * Move bendpoints through drag and drop to add/remove bendpoints or reconnect connection.\n   *\n   * @param {Injector} injector\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {Dragging} dragging\n   * @param {Rules} rules\n   * @param {Modeling} modeling\n   */\n  function BendpointMove(injector, eventBus, canvas, dragging, rules, modeling) {\n    this._injector = injector;\n\n    this.start = function(event, connection, bendpointIndex, insert) {\n      var gfx = canvas.getGraphics(connection),\n          source = connection.source,\n          target = connection.target,\n          waypoints = connection.waypoints,\n          type;\n\n      if (!insert && bendpointIndex === 0) {\n        type = RECONNECT_START$1;\n      } else\n      if (!insert && bendpointIndex === waypoints.length - 1) {\n        type = RECONNECT_END$1;\n      } else {\n        type = UPDATE_WAYPOINTS$1;\n      }\n\n      var command = type === UPDATE_WAYPOINTS$1 ? 'connection.updateWaypoints' : 'connection.reconnect';\n\n      var allowed = rules.allowed(command, {\n        connection: connection,\n        source: source,\n        target: target\n      });\n\n      if (allowed === false) {\n        allowed = rules.allowed(command, {\n          connection: connection,\n          source: target,\n          target: source\n        });\n      }\n\n      if (allowed === false) {\n        return;\n      }\n\n      dragging.init(event, 'bendpoint.move', {\n        data: {\n          connection: connection,\n          connectionGfx: gfx,\n          context: {\n            allowed: allowed,\n            bendpointIndex: bendpointIndex,\n            connection: connection,\n            source: source,\n            target: target,\n            insert: insert,\n            type: type\n          }\n        }\n      });\n    };\n\n    eventBus.on('bendpoint.move.hover', function(event) {\n      var context = event.context,\n          connection = context.connection,\n          source = connection.source,\n          target = connection.target,\n          hover = event.hover,\n          type = context.type;\n\n      // cache hover state\n      context.hover = hover;\n\n      var allowed;\n\n      if (!hover) {\n        return;\n      }\n\n      var command = type === UPDATE_WAYPOINTS$1 ? 'connection.updateWaypoints' : 'connection.reconnect';\n\n      allowed = context.allowed = rules.allowed(command, {\n        connection: connection,\n        source: type === RECONNECT_START$1 ? hover : source,\n        target: type === RECONNECT_END$1 ? hover : target\n      });\n\n      if (allowed) {\n        context.source = type === RECONNECT_START$1 ? hover : source;\n        context.target = type === RECONNECT_END$1 ? hover : target;\n\n        return;\n      }\n\n      if (allowed === false) {\n        allowed = context.allowed = rules.allowed(command, {\n          connection: connection,\n          source: type === RECONNECT_END$1 ? hover : target,\n          target: type === RECONNECT_START$1 ? hover : source\n        });\n      }\n\n      if (allowed) {\n        context.source = type === RECONNECT_END$1 ? hover : target;\n        context.target = type === RECONNECT_START$1 ? hover : source;\n      }\n    });\n\n    eventBus.on([ 'bendpoint.move.out', 'bendpoint.move.cleanup' ], function(event) {\n      var context = event.context,\n          type = context.type;\n\n      context.hover = null;\n      context.source = null;\n      context.target = null;\n\n      if (type !== UPDATE_WAYPOINTS$1) {\n        context.allowed = false;\n      }\n    });\n\n    eventBus.on('bendpoint.move.end', function(event) {\n      var context = event.context,\n          allowed = context.allowed,\n          bendpointIndex = context.bendpointIndex,\n          connection = context.connection,\n          insert = context.insert,\n          newWaypoints = connection.waypoints.slice(),\n          source = context.source,\n          target = context.target,\n          type = context.type,\n          hints = context.hints || {};\n\n      // ensure integer values (important if zoom level was > 1 during move)\n      var docking = {\n        x: round$8(event.x),\n        y: round$8(event.y)\n      };\n\n      if (!allowed) {\n        return false;\n      }\n\n      if (type === UPDATE_WAYPOINTS$1) {\n        if (insert) {\n\n          // insert new bendpoint\n          newWaypoints.splice(bendpointIndex, 0, docking);\n        } else {\n\n          // swap previous waypoint with moved one\n          newWaypoints[bendpointIndex] = docking;\n        }\n\n        // pass hints about actual moved bendpoint\n        // useful for connection/label layout\n        hints.bendpointMove = {\n          insert: insert,\n          bendpointIndex: bendpointIndex\n        };\n\n        newWaypoints = this.cropWaypoints(connection, newWaypoints);\n\n        modeling.updateWaypoints(connection, filterRedundantWaypoints(newWaypoints), hints);\n      } else {\n        if (type === RECONNECT_START$1) {\n          hints.docking = 'source';\n\n          if (isReverse$2(context)) {\n            hints.docking = 'target';\n\n            hints.newWaypoints = newWaypoints.reverse();\n          }\n        } else if (type === RECONNECT_END$1) {\n          hints.docking = 'target';\n\n          if (isReverse$2(context)) {\n            hints.docking = 'source';\n\n            hints.newWaypoints = newWaypoints.reverse();\n          }\n        }\n\n        modeling.reconnect(connection, source, target, docking, hints);\n      }\n    }, this);\n  }\n\n  BendpointMove.$inject = [\n    'injector',\n    'eventBus',\n    'canvas',\n    'dragging',\n    'rules',\n    'modeling'\n  ];\n\n  BendpointMove.prototype.cropWaypoints = function(connection, newWaypoints) {\n    var connectionDocking = this._injector.get('connectionDocking', false);\n\n    if (!connectionDocking) {\n      return newWaypoints;\n    }\n\n    var waypoints = connection.waypoints;\n\n    connection.waypoints = newWaypoints;\n\n    connection.waypoints = connectionDocking.getCroppedWaypoints(connection);\n\n    newWaypoints = connection.waypoints;\n\n    connection.waypoints = waypoints;\n\n    return newWaypoints;\n  };\n\n\n  // helpers //////////\n\n  function isReverse$2(context) {\n    var hover = context.hover,\n        source = context.source,\n        target = context.target,\n        type = context.type;\n\n    if (type === RECONNECT_START$1) {\n      return hover && target && hover === target && source !== target;\n    }\n\n    if (type === RECONNECT_END$1) {\n      return hover && source && hover === source && source !== target;\n    }\n  }\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   *\n   * @typedef {import('../bendpoints/BendpointMove').default} BendpointMove\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   */\n\n  var RECONNECT_START = 'reconnectStart',\n      RECONNECT_END = 'reconnectEnd',\n      UPDATE_WAYPOINTS = 'updateWaypoints';\n\n  var MARKER_OK$4 = 'connect-ok',\n      MARKER_NOT_OK$4 = 'connect-not-ok',\n      MARKER_CONNECT_HOVER$1 = 'connect-hover',\n      MARKER_CONNECT_UPDATING$1 = 'djs-updating',\n      MARKER_ELEMENT_HIDDEN = 'djs-element-hidden';\n\n  var HIGH_PRIORITY$i = 1100;\n\n  /**\n   * Preview connection while moving bendpoints.\n   *\n   * @param {BendpointMove} bendpointMove\n   * @param {Injector} injector\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   */\n  function BendpointMovePreview(bendpointMove, injector, eventBus, canvas) {\n    this._injector = injector;\n\n    var connectionPreview = injector.get('connectionPreview', false);\n\n    eventBus.on('bendpoint.move.start', function(event) {\n      var context = event.context,\n          bendpointIndex = context.bendpointIndex,\n          connection = context.connection,\n          insert = context.insert,\n          waypoints = connection.waypoints,\n          newWaypoints = waypoints.slice();\n\n      context.waypoints = waypoints;\n\n      if (insert) {\n\n        // insert placeholder for new bendpoint\n        newWaypoints.splice(bendpointIndex, 0, { x: event.x, y: event.y });\n      }\n\n      connection.waypoints = newWaypoints;\n\n      // add dragger gfx\n      var draggerGfx = context.draggerGfx = addBendpoint(canvas.getLayer('overlays'));\n\n      classes(draggerGfx).add('djs-dragging');\n\n      canvas.addMarker(connection, MARKER_ELEMENT_HIDDEN);\n      canvas.addMarker(connection, MARKER_CONNECT_UPDATING$1);\n    });\n\n    eventBus.on('bendpoint.move.hover', function(event) {\n      var context = event.context,\n          allowed = context.allowed,\n          hover = context.hover,\n          type = context.type;\n\n      if (hover) {\n        canvas.addMarker(hover, MARKER_CONNECT_HOVER$1);\n\n        if (type === UPDATE_WAYPOINTS) {\n          return;\n        }\n\n        if (allowed) {\n          canvas.removeMarker(hover, MARKER_NOT_OK$4);\n          canvas.addMarker(hover, MARKER_OK$4);\n        } else if (allowed === false) {\n          canvas.removeMarker(hover, MARKER_OK$4);\n          canvas.addMarker(hover, MARKER_NOT_OK$4);\n        }\n      }\n    });\n\n    eventBus.on([\n      'bendpoint.move.out',\n      'bendpoint.move.cleanup'\n    ], HIGH_PRIORITY$i, function(event) {\n      var context = event.context,\n          hover = context.hover,\n          target = context.target;\n\n      if (hover) {\n        canvas.removeMarker(hover, MARKER_CONNECT_HOVER$1);\n        canvas.removeMarker(hover, target ? MARKER_OK$4 : MARKER_NOT_OK$4);\n      }\n    });\n\n    eventBus.on('bendpoint.move.move', function(event) {\n      var context = event.context,\n          allowed = context.allowed,\n          bendpointIndex = context.bendpointIndex,\n          draggerGfx = context.draggerGfx,\n          hover = context.hover,\n          type = context.type,\n          connection = context.connection,\n          source = connection.source,\n          target = connection.target,\n          newWaypoints = connection.waypoints.slice(),\n          bendpoint = { x: event.x, y: event.y },\n          hints = context.hints || {},\n          drawPreviewHints = {};\n\n      if (connectionPreview) {\n        if (hints.connectionStart) {\n          drawPreviewHints.connectionStart = hints.connectionStart;\n        }\n\n        if (hints.connectionEnd) {\n          drawPreviewHints.connectionEnd = hints.connectionEnd;\n        }\n\n\n        if (type === RECONNECT_START) {\n          if (isReverse$2(context)) {\n            drawPreviewHints.connectionEnd = drawPreviewHints.connectionEnd || bendpoint;\n\n            drawPreviewHints.source = target;\n            drawPreviewHints.target = hover || source;\n\n            newWaypoints = newWaypoints.reverse();\n          } else {\n            drawPreviewHints.connectionStart = drawPreviewHints.connectionStart || bendpoint;\n\n            drawPreviewHints.source = hover || source;\n            drawPreviewHints.target = target;\n          }\n        } else if (type === RECONNECT_END) {\n          if (isReverse$2(context)) {\n            drawPreviewHints.connectionStart = drawPreviewHints.connectionStart || bendpoint;\n\n            drawPreviewHints.source = hover || target;\n            drawPreviewHints.target = source;\n\n            newWaypoints = newWaypoints.reverse();\n          } else {\n            drawPreviewHints.connectionEnd = drawPreviewHints.connectionEnd || bendpoint;\n\n            drawPreviewHints.source = source;\n            drawPreviewHints.target = hover || target;\n          }\n\n        } else {\n          drawPreviewHints.noCropping = true;\n          drawPreviewHints.noLayout = true;\n          newWaypoints[ bendpointIndex ] = bendpoint;\n        }\n\n        if (type === UPDATE_WAYPOINTS) {\n          newWaypoints = bendpointMove.cropWaypoints(connection, newWaypoints);\n        }\n\n        drawPreviewHints.waypoints = newWaypoints;\n\n        connectionPreview.drawPreview(context, allowed, drawPreviewHints);\n      }\n\n      translate$2(draggerGfx, event.x, event.y);\n    }, this);\n\n    eventBus.on([\n      'bendpoint.move.end',\n      'bendpoint.move.cancel'\n    ], HIGH_PRIORITY$i, function(event) {\n      var context = event.context,\n          connection = context.connection,\n          draggerGfx = context.draggerGfx,\n          hover = context.hover,\n          target = context.target,\n          waypoints = context.waypoints;\n\n      connection.waypoints = waypoints;\n\n      // remove dragger gfx\n      remove$1(draggerGfx);\n\n      canvas.removeMarker(connection, MARKER_CONNECT_UPDATING$1);\n      canvas.removeMarker(connection, MARKER_ELEMENT_HIDDEN);\n\n      if (hover) {\n        canvas.removeMarker(hover, MARKER_OK$4);\n        canvas.removeMarker(hover, target ? MARKER_OK$4 : MARKER_NOT_OK$4);\n      }\n\n      if (connectionPreview) {\n        connectionPreview.cleanUp(context);\n      }\n    });\n  }\n\n  BendpointMovePreview.$inject = [\n    'bendpointMove',\n    'injector',\n    'eventBus',\n    'canvas'\n  ];\n\n  var MARKER_CONNECT_HOVER = 'connect-hover',\n      MARKER_CONNECT_UPDATING = 'djs-updating';\n\n  /**\n   * @typedef {import('../../model/Types').Shape} Shape\n   *\n   * @typedef {import('../../util/Types').Axis} Axis\n   * @typedef {import('../../util/Types').Point} Point\n   *\n   * @typedef {import('didi').Injector} Injector\n   *\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../dragging/Dragging').default} Dragging\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../../core/GraphicsFactory').default} GraphicsFactory\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   */\n\n  function axisAdd(point, axis, delta) {\n    return axisSet(point, axis, point[axis] + delta);\n  }\n\n  function axisSet(point, axis, value) {\n    return {\n      x: (axis === 'x' ? value : point.x),\n      y: (axis === 'y' ? value : point.y)\n    };\n  }\n\n  function axisFenced(position, segmentStart, segmentEnd, axis) {\n\n    var maxValue = Math.max(segmentStart[axis], segmentEnd[axis]),\n        minValue = Math.min(segmentStart[axis], segmentEnd[axis]);\n\n    var padding = 20;\n\n    var fencedValue = Math.min(Math.max(minValue + padding, position[axis]), maxValue - padding);\n\n    return axisSet(segmentStart, axis, fencedValue);\n  }\n\n  function flipAxis(axis) {\n    return axis === 'x' ? 'y' : 'x';\n  }\n\n  /**\n   * Get the docking point on the given element.\n   *\n   * Compute a reasonable docking, if non exists.\n   *\n   * @param {Point} point\n   * @param {Shape} referenceElement\n   * @param {Axis} moveAxis\n   *\n   * @return {Point}\n   */\n  function getDocking$2(point, referenceElement, moveAxis) {\n\n    var referenceMid,\n        inverseAxis;\n\n    if (point.original) {\n      return point.original;\n    } else {\n      referenceMid = getMid(referenceElement);\n      inverseAxis = flipAxis(moveAxis);\n\n      return axisSet(point, inverseAxis, referenceMid[inverseAxis]);\n    }\n  }\n\n  /**\n   * A component that implements moving of bendpoints.\n   *\n   * @param {Injector} injector\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {Canvas} dragging\n   * @param {GraphicsFactory} graphicsFactory\n   * @param {Modeling} modeling\n   */\n  function ConnectionSegmentMove(\n      injector, eventBus, canvas,\n      dragging, graphicsFactory, modeling) {\n\n    // optional connection docking integration\n    var connectionDocking = injector.get('connectionDocking', false);\n\n\n    // API\n\n    this.start = function(event, connection, idx) {\n\n      var context,\n          gfx = canvas.getGraphics(connection),\n          segmentStartIndex = idx - 1,\n          segmentEndIndex = idx,\n          waypoints = connection.waypoints,\n          segmentStart = waypoints[segmentStartIndex],\n          segmentEnd = waypoints[segmentEndIndex],\n          intersection = getConnectionIntersection(canvas, waypoints, event),\n          direction, axis, dragPosition;\n\n      direction = pointsAligned(segmentStart, segmentEnd);\n\n      // do not move diagonal connection\n      if (!direction) {\n        return;\n      }\n\n      // the axis where we are going to move things\n      axis = direction === 'v' ? 'x' : 'y';\n\n      if (segmentStartIndex === 0) {\n        segmentStart = getDocking$2(segmentStart, connection.source, axis);\n      }\n\n      if (segmentEndIndex === waypoints.length - 1) {\n        segmentEnd = getDocking$2(segmentEnd, connection.target, axis);\n      }\n\n      if (intersection) {\n        dragPosition = intersection.point;\n      } else {\n\n        // set to segment center as default\n        dragPosition = {\n          x: (segmentStart.x + segmentEnd.x) / 2,\n          y: (segmentStart.y + segmentEnd.y) / 2\n        };\n      }\n\n      context = {\n        connection: connection,\n        segmentStartIndex: segmentStartIndex,\n        segmentEndIndex: segmentEndIndex,\n        segmentStart: segmentStart,\n        segmentEnd: segmentEnd,\n        axis: axis,\n        dragPosition: dragPosition\n      };\n\n      dragging.init(event, dragPosition, 'connectionSegment.move', {\n        cursor: axis === 'x' ? 'resize-ew' : 'resize-ns',\n        data: {\n          connection: connection,\n          connectionGfx: gfx,\n          context: context\n        }\n      });\n    };\n\n    /**\n     * Crop connection if connection cropping is provided.\n     *\n     * @param {Connection} connection\n     * @param {Point[]} newWaypoints\n     *\n     * @return {Point[]} cropped connection waypoints\n     */\n    function cropConnection(connection, newWaypoints) {\n\n      // crop connection, if docking service is provided only\n      if (!connectionDocking) {\n        return newWaypoints;\n      }\n\n      var oldWaypoints = connection.waypoints,\n          croppedWaypoints;\n\n      // temporary set new waypoints\n      connection.waypoints = newWaypoints;\n\n      croppedWaypoints = connectionDocking.getCroppedWaypoints(connection);\n\n      // restore old waypoints\n      connection.waypoints = oldWaypoints;\n\n      return croppedWaypoints;\n    }\n\n    // DRAGGING IMPLEMENTATION\n\n    function redrawConnection(data) {\n      graphicsFactory.update('connection', data.connection, data.connectionGfx);\n    }\n\n    function updateDragger(context, segmentOffset, event) {\n\n      var newWaypoints = context.newWaypoints,\n          segmentStartIndex = context.segmentStartIndex + segmentOffset,\n          segmentStart = newWaypoints[segmentStartIndex],\n          segmentEndIndex = context.segmentEndIndex + segmentOffset,\n          segmentEnd = newWaypoints[segmentEndIndex],\n          axis = flipAxis(context.axis);\n\n      // make sure the dragger does not move\n      // outside the connection\n      var draggerPosition = axisFenced(event, segmentStart, segmentEnd, axis);\n\n      // update dragger\n      translate$2(context.draggerGfx, draggerPosition.x, draggerPosition.y);\n    }\n\n    /**\n     * Filter waypoints for redundant ones (i.e. on the same axis).\n     * Returns the filtered waypoints and the offset related to the segment move.\n     *\n     * @param {Point[]} waypoints\n     * @param {Integer} segmentStartIndex of moved segment start\n     *\n     * @return {Object} { filteredWaypoints, segmentOffset }\n     */\n    function filterRedundantWaypoints(waypoints, segmentStartIndex) {\n\n      var segmentOffset = 0;\n\n      var filteredWaypoints = waypoints.filter(function(r, idx) {\n        if (pointsOnLine(waypoints[idx - 1], waypoints[idx + 1], r)) {\n\n          // remove point and increment offset\n          segmentOffset = idx <= segmentStartIndex ? segmentOffset - 1 : segmentOffset;\n          return false;\n        }\n\n        // dont remove point\n        return true;\n      });\n\n      return {\n        waypoints: filteredWaypoints,\n        segmentOffset: segmentOffset\n      };\n    }\n\n    eventBus.on('connectionSegment.move.start', function(event) {\n\n      var context = event.context,\n          connection = event.connection,\n          layer = canvas.getLayer('overlays');\n\n      context.originalWaypoints = connection.waypoints.slice();\n\n      // add dragger gfx\n      context.draggerGfx = addSegmentDragger(layer, context.segmentStart, context.segmentEnd);\n      classes(context.draggerGfx).add('djs-dragging');\n\n      canvas.addMarker(connection, MARKER_CONNECT_UPDATING);\n    });\n\n    eventBus.on('connectionSegment.move.move', function(event) {\n\n      var context = event.context,\n          connection = context.connection,\n          segmentStartIndex = context.segmentStartIndex,\n          segmentEndIndex = context.segmentEndIndex,\n          segmentStart = context.segmentStart,\n          segmentEnd = context.segmentEnd,\n          axis = context.axis;\n\n      var newWaypoints = context.originalWaypoints.slice(),\n          newSegmentStart = axisAdd(segmentStart, axis, event['d' + axis]),\n          newSegmentEnd = axisAdd(segmentEnd, axis, event['d' + axis]);\n\n      // original waypoint count and added / removed\n      // from start waypoint delta. We use the later\n      // to retrieve the updated segmentStartIndex / segmentEndIndex\n      var waypointCount = newWaypoints.length,\n          segmentOffset = 0;\n\n      // move segment start / end by axis delta\n      newWaypoints[segmentStartIndex] = newSegmentStart;\n      newWaypoints[segmentEndIndex] = newSegmentEnd;\n\n      var sourceToSegmentOrientation,\n          targetToSegmentOrientation;\n\n      // handle first segment\n      if (segmentStartIndex < 2) {\n        sourceToSegmentOrientation = getOrientation(connection.source, newSegmentStart);\n\n        // first bendpoint, remove first segment if intersecting\n        if (segmentStartIndex === 1) {\n\n          if (sourceToSegmentOrientation === 'intersect') {\n            newWaypoints.shift();\n            newWaypoints[0] = newSegmentStart;\n            segmentOffset--;\n          }\n        }\n\n        // docking point, add segment if not intersecting anymore\n        else {\n          if (sourceToSegmentOrientation !== 'intersect') {\n            newWaypoints.unshift(segmentStart);\n            segmentOffset++;\n          }\n        }\n      }\n\n      // handle last segment\n      if (segmentEndIndex > waypointCount - 3) {\n        targetToSegmentOrientation = getOrientation(connection.target, newSegmentEnd);\n\n        // last bendpoint, remove last segment if intersecting\n        if (segmentEndIndex === waypointCount - 2) {\n\n          if (targetToSegmentOrientation === 'intersect') {\n            newWaypoints.pop();\n            newWaypoints[newWaypoints.length - 1] = newSegmentEnd;\n          }\n        }\n\n        // last bendpoint, remove last segment if intersecting\n        else {\n          if (targetToSegmentOrientation !== 'intersect') {\n            newWaypoints.push(segmentEnd);\n          }\n        }\n      }\n\n      // update connection waypoints\n      context.newWaypoints = connection.waypoints = cropConnection(connection, newWaypoints);\n\n      // update dragger position\n      updateDragger(context, segmentOffset, event);\n\n      // save segmentOffset in context\n      context.newSegmentStartIndex = segmentStartIndex + segmentOffset;\n\n      // redraw connection\n      redrawConnection(event);\n    });\n\n    eventBus.on('connectionSegment.move.hover', function(event) {\n\n      event.context.hover = event.hover;\n      canvas.addMarker(event.hover, MARKER_CONNECT_HOVER);\n    });\n\n    eventBus.on([\n      'connectionSegment.move.out',\n      'connectionSegment.move.cleanup'\n    ], function(event) {\n\n      // remove connect marker\n      // if it was added\n      var hover = event.context.hover;\n\n      if (hover) {\n        canvas.removeMarker(hover, MARKER_CONNECT_HOVER);\n      }\n    });\n\n    eventBus.on('connectionSegment.move.cleanup', function(event) {\n\n      var context = event.context,\n          connection = context.connection;\n\n      // remove dragger gfx\n      if (context.draggerGfx) {\n        remove$1(context.draggerGfx);\n      }\n\n      canvas.removeMarker(connection, MARKER_CONNECT_UPDATING);\n    });\n\n    eventBus.on([\n      'connectionSegment.move.cancel',\n      'connectionSegment.move.end'\n    ], function(event) {\n      var context = event.context,\n          connection = context.connection;\n\n      connection.waypoints = context.originalWaypoints;\n\n      redrawConnection(event);\n    });\n\n    eventBus.on('connectionSegment.move.end', function(event) {\n\n      var context = event.context,\n          connection = context.connection,\n          newWaypoints = context.newWaypoints,\n          newSegmentStartIndex = context.newSegmentStartIndex;\n\n      // ensure we have actual pixel values bendpoint\n      // coordinates (important when zoom level was > 1 during move)\n      newWaypoints = newWaypoints.map(function(p) {\n        return {\n          original: p.original,\n          x: Math.round(p.x),\n          y: Math.round(p.y)\n        };\n      });\n\n      // apply filter redunant waypoints\n      var filtered = filterRedundantWaypoints(newWaypoints, newSegmentStartIndex);\n\n      // get filtered waypoints\n      var filteredWaypoints = filtered.waypoints,\n          croppedWaypoints = cropConnection(connection, filteredWaypoints),\n          segmentOffset = filtered.segmentOffset;\n\n      var hints = {\n        segmentMove: {\n          segmentStartIndex: context.segmentStartIndex,\n          newSegmentStartIndex: newSegmentStartIndex + segmentOffset\n        }\n      };\n\n      modeling.updateWaypoints(connection, croppedWaypoints, hints);\n    });\n  }\n\n  ConnectionSegmentMove.$inject = [\n    'injector',\n    'eventBus',\n    'canvas',\n    'dragging',\n    'graphicsFactory',\n    'modeling'\n  ];\n\n  /**\n   * @typedef {import('../../core/Types').ConnectionLike} Connection\n   * @typedef {import('../../core/Types').ShapeLike} Shape\n   *\n   * @typedef {import('../../core/EventBus').Event} Event\n   *\n   * @typedef {import('../../util/Types').Axis} Axis\n   */\n\n  var abs$6 = Math.abs,\n      round$7 = Math.round;\n\n\n  /**\n   * Snap value to a collection of reference values.\n   *\n   * @param {number} value\n   * @param {Array<number>} values\n   * @param {number} [tolerance=10]\n   *\n   * @return {number} the value we snapped to or null, if none snapped\n   */\n  function snapTo(value, values, tolerance) {\n    tolerance = tolerance === undefined ? 10 : tolerance;\n\n    var idx, snapValue;\n\n    for (idx = 0; idx < values.length; idx++) {\n      snapValue = values[idx];\n\n      if (abs$6(snapValue - value) <= tolerance) {\n        return snapValue;\n      }\n    }\n  }\n\n\n  function topLeft(bounds) {\n    return {\n      x: bounds.x,\n      y: bounds.y\n    };\n  }\n\n  function bottomRight(bounds) {\n    return {\n      x: bounds.x + bounds.width,\n      y: bounds.y + bounds.height\n    };\n  }\n\n  function mid$2(bounds, defaultValue) {\n\n    if (!bounds || isNaN(bounds.x) || isNaN(bounds.y)) {\n      return defaultValue;\n    }\n\n    return {\n      x: round$7(bounds.x + bounds.width / 2),\n      y: round$7(bounds.y + bounds.height / 2)\n    };\n  }\n\n\n  /**\n   * Retrieve the snap state of the given event.\n   *\n   * @param {Event} event\n   * @param {Axis} axis\n   *\n   * @return {boolean} the snapped state\n   *\n   */\n  function isSnapped(event, axis) {\n    var snapped = event.snapped;\n\n    if (!snapped) {\n      return false;\n    }\n\n    if (typeof axis === 'string') {\n      return snapped[axis];\n    }\n\n    return snapped.x && snapped.y;\n  }\n\n\n  /**\n   * Set the given event as snapped.\n   *\n   * This method may change the x and/or y position of the shape\n   * from the given event!\n   *\n   * @param {Event} event\n   * @param {Axis} axis\n   * @param {number|boolean} value\n   *\n   * @return {number} old value\n   */\n  function setSnapped(event, axis, value) {\n    if (typeof axis !== 'string') {\n      throw new Error('axis must be in [x, y]');\n    }\n\n    if (typeof value !== 'number' && value !== false) {\n      throw new Error('value must be Number or false');\n    }\n\n    var delta,\n        previousValue = event[axis];\n\n    var snapped = event.snapped = (event.snapped || {});\n\n\n    if (value === false) {\n      snapped[axis] = false;\n    } else {\n      snapped[axis] = true;\n\n      delta = value - previousValue;\n\n      event[axis] += delta;\n      event['d' + axis] += delta;\n    }\n\n    return previousValue;\n  }\n\n  /**\n   * Get children of a shape.\n   *\n   * @param {Shape} parent\n   *\n   * @return {Array<Shape|Connection>}\n   */\n  function getChildren(parent) {\n    return parent.children || [];\n  }\n\n  /**\n   * @typedef {import('../../core/EventBus').default} EventBus\n   */\n  var abs$5 = Math.abs,\n      round$6 = Math.round;\n\n  var TOLERANCE = 10;\n\n  /**\n   * @param {EventBus} eventBus\n   */\n  function BendpointSnapping(eventBus) {\n\n    function snapTo(values, value) {\n\n      if (isArray$3(values)) {\n        var i = values.length;\n\n        while (i--) if (abs$5(values[i] - value) <= TOLERANCE) {\n          return values[i];\n        }\n      } else {\n        values = +values;\n        var rem = value % values;\n\n        if (rem < TOLERANCE) {\n          return value - rem;\n        }\n\n        if (rem > values - TOLERANCE) {\n          return value - rem + values;\n        }\n      }\n\n      return value;\n    }\n\n    function getSnapPoint(element, event) {\n\n      if (element.waypoints) {\n        return getClosestPointOnConnection(event, element);\n      }\n\n      if (element.width) {\n        return {\n          x: round$6(element.width / 2 + element.x),\n          y: round$6(element.height / 2 + element.y)\n        };\n      }\n    }\n\n    // connection segment snapping //////////////////////\n\n    function getConnectionSegmentSnaps(event) {\n\n      var context = event.context,\n          snapPoints = context.snapPoints,\n          connection = context.connection,\n          waypoints = connection.waypoints,\n          segmentStart = context.segmentStart,\n          segmentStartIndex = context.segmentStartIndex,\n          segmentEnd = context.segmentEnd,\n          segmentEndIndex = context.segmentEndIndex,\n          axis = context.axis;\n\n      if (snapPoints) {\n        return snapPoints;\n      }\n\n      var referenceWaypoints = [\n        waypoints[segmentStartIndex - 1],\n        segmentStart,\n        segmentEnd,\n        waypoints[segmentEndIndex + 1]\n      ];\n\n      if (segmentStartIndex < 2) {\n        referenceWaypoints.unshift(getSnapPoint(connection.source, event));\n      }\n\n      if (segmentEndIndex > waypoints.length - 3) {\n        referenceWaypoints.unshift(getSnapPoint(connection.target, event));\n      }\n\n      context.snapPoints = snapPoints = { horizontal: [] , vertical: [] };\n\n      forEach$1(referenceWaypoints, function(p) {\n\n        // we snap on existing bendpoints only,\n        // not placeholders that are inserted during add\n        if (p) {\n          p = p.original || p;\n\n          if (axis === 'y') {\n            snapPoints.horizontal.push(p.y);\n          }\n\n          if (axis === 'x') {\n            snapPoints.vertical.push(p.x);\n          }\n        }\n      });\n\n      return snapPoints;\n    }\n\n    eventBus.on('connectionSegment.move.move', 1500, function(event) {\n      var snapPoints = getConnectionSegmentSnaps(event),\n          x = event.x,\n          y = event.y,\n          sx, sy;\n\n      if (!snapPoints) {\n        return;\n      }\n\n      // snap\n      sx = snapTo(snapPoints.vertical, x);\n      sy = snapTo(snapPoints.horizontal, y);\n\n\n      // correction x/y\n      var cx = (x - sx),\n          cy = (y - sy);\n\n      // update delta\n      assign$1(event, {\n        dx: event.dx - cx,\n        dy: event.dy - cy,\n        x: sx,\n        y: sy\n      });\n\n      // only set snapped if actually snapped\n      if (cx || snapPoints.vertical.indexOf(x) !== -1) {\n        setSnapped(event, 'x', sx);\n      }\n\n      if (cy || snapPoints.horizontal.indexOf(y) !== -1) {\n        setSnapped(event, 'y', sy);\n      }\n    });\n\n\n    // bendpoint snapping //////////////////////\n\n    function getBendpointSnaps(context) {\n\n      var snapPoints = context.snapPoints,\n          waypoints = context.connection.waypoints,\n          bendpointIndex = context.bendpointIndex;\n\n      if (snapPoints) {\n        return snapPoints;\n      }\n\n      var referenceWaypoints = [ waypoints[bendpointIndex - 1], waypoints[bendpointIndex + 1] ];\n\n      context.snapPoints = snapPoints = { horizontal: [] , vertical: [] };\n\n      forEach$1(referenceWaypoints, function(p) {\n\n        // we snap on existing bendpoints only,\n        // not placeholders that are inserted during add\n        if (p) {\n          p = p.original || p;\n\n          snapPoints.horizontal.push(p.y);\n          snapPoints.vertical.push(p.x);\n        }\n      });\n\n      return snapPoints;\n    }\n\n    // Snap Endpoint of new connection\n    eventBus.on([\n      'connect.hover',\n      'connect.move',\n      'connect.end'\n    ], 1500, function(event) {\n      var context = event.context,\n          hover = context.hover,\n          hoverMid = hover && getSnapPoint(hover, event);\n\n      // only snap on connections, elements can have multiple connect endpoints\n      if (!isConnection(hover) || !hoverMid || !hoverMid.x || !hoverMid.y) {\n        return;\n      }\n\n      setSnapped(event, 'x', hoverMid.x);\n      setSnapped(event, 'y', hoverMid.y);\n    });\n\n    eventBus.on([ 'bendpoint.move.move', 'bendpoint.move.end' ], 1500, function(event) {\n\n      var context = event.context,\n          snapPoints = getBendpointSnaps(context),\n          hover = context.hover,\n          hoverMid = hover && getSnapPoint(hover, event),\n          x = event.x,\n          y = event.y,\n          sx, sy;\n\n      if (!snapPoints) {\n        return;\n      }\n\n      // snap to hover mid\n      sx = snapTo(hoverMid ? snapPoints.vertical.concat([ hoverMid.x ]) : snapPoints.vertical, x);\n      sy = snapTo(hoverMid ? snapPoints.horizontal.concat([ hoverMid.y ]) : snapPoints.horizontal, y);\n\n      // correction x/y\n      var cx = (x - sx),\n          cy = (y - sy);\n\n      // update delta\n      assign$1(event, {\n        dx: event.dx - cx,\n        dy: event.dy - cy,\n        x: event.x - cx,\n        y: event.y - cy\n      });\n\n      // only set snapped if actually snapped\n      if (cx || snapPoints.vertical.indexOf(x) !== -1) {\n        setSnapped(event, 'x', sx);\n      }\n\n      if (cy || snapPoints.horizontal.indexOf(y) !== -1) {\n        setSnapped(event, 'y', sy);\n      }\n    });\n  }\n\n\n  BendpointSnapping.$inject = [ 'eventBus' ];\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var BendpointsModule = {\n    __depends__: [\n      DraggingModule,\n      RulesModule$1\n    ],\n    __init__: [ 'bendpoints', 'bendpointSnapping', 'bendpointMovePreview' ],\n    bendpoints: [ 'type', Bendpoints ],\n    bendpointMove: [ 'type', BendpointMove ],\n    bendpointMovePreview: [ 'type', BendpointMovePreview ],\n    connectionSegmentMove: [ 'type', ConnectionSegmentMove ],\n    bendpointSnapping: [ 'type', BendpointSnapping ]\n  };\n\n  /**\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef {import('../../util/Types').Point} Point\n   *\n   * @typedef {import('../dragging/Dragging').default} Dragging\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   * @typedef {import('../rules/Rules').default} Rules\n   */\n\n  /**\n   * @param {EventBus} eventBus\n   * @param {Dragging} dragging\n   * @param {Modeling} modeling\n   * @param {Rules} rules\n   */\n  function Connect(eventBus, dragging, modeling, rules) {\n\n    // rules\n\n    function canConnect(source, target) {\n      return rules.allowed('connection.create', {\n        source: source,\n        target: target\n      });\n    }\n\n    function canConnectReverse(source, target) {\n      return canConnect(target, source);\n    }\n\n\n    // event handlers\n\n    eventBus.on('connect.hover', function(event) {\n      var context = event.context,\n          start = context.start,\n          hover = event.hover,\n          canExecute;\n\n      // cache hover state\n      context.hover = hover;\n\n      canExecute = context.canExecute = canConnect(start, hover);\n\n      // ignore hover\n      if (isNil(canExecute)) {\n        return;\n      }\n\n      if (canExecute !== false) {\n        context.source = start;\n        context.target = hover;\n\n        return;\n      }\n\n      canExecute = context.canExecute = canConnectReverse(start, hover);\n\n      // ignore hover\n      if (isNil(canExecute)) {\n        return;\n      }\n\n      if (canExecute !== false) {\n        context.source = hover;\n        context.target = start;\n      }\n    });\n\n    eventBus.on([ 'connect.out', 'connect.cleanup' ], function(event) {\n      var context = event.context;\n\n      context.hover = null;\n      context.source = null;\n      context.target = null;\n\n      context.canExecute = false;\n    });\n\n    eventBus.on('connect.end', function(event) {\n      var context = event.context,\n          canExecute = context.canExecute,\n          connectionStart = context.connectionStart,\n          connectionEnd = {\n            x: event.x,\n            y: event.y\n          },\n          source = context.source,\n          target = context.target;\n\n      if (!canExecute) {\n        return false;\n      }\n\n      var attrs = null,\n          hints = {\n            connectionStart: isReverse$1(context) ? connectionEnd : connectionStart,\n            connectionEnd: isReverse$1(context) ? connectionStart : connectionEnd\n          };\n\n      if (isObject(canExecute)) {\n        attrs = canExecute;\n      }\n\n      context.connection = modeling.connect(source, target, attrs, hints);\n    });\n\n\n    // API\n\n    /**\n     * Start connect operation.\n     *\n     * @param {MouseEvent|TouchEvent} event\n     * @param {Element} start\n     * @param {Point} [connectionStart]\n     * @param {boolean} [autoActivate=false]\n     */\n    this.start = function(event, start, connectionStart, autoActivate) {\n      if (!isObject(connectionStart)) {\n        autoActivate = connectionStart;\n        connectionStart = getMid(start);\n      }\n\n      dragging.init(event, 'connect', {\n        autoActivate: autoActivate,\n        data: {\n          shape: start,\n          context: {\n            start: start,\n            connectionStart: connectionStart\n          }\n        }\n      });\n    };\n  }\n\n  Connect.$inject = [\n    'eventBus',\n    'dragging',\n    'modeling',\n    'rules'\n  ];\n\n\n  // helpers //////////\n\n  function isReverse$1(context) {\n    var hover = context.hover,\n        source = context.source,\n        target = context.target;\n\n    return hover && source && hover === source && source !== target;\n  }\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   *\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   */\n\n  var HIGH_PRIORITY$h = 1100,\n      LOW_PRIORITY$j = 900;\n\n  var MARKER_OK$3 = 'connect-ok',\n      MARKER_NOT_OK$3 = 'connect-not-ok';\n\n  /**\n   * Shows connection preview during connect.\n   *\n   * @param {Injector} injector\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   */\n  function ConnectPreview(injector, eventBus, canvas) {\n    var connectionPreview = injector.get('connectionPreview', false);\n\n    connectionPreview && eventBus.on('connect.move', function(event) {\n      var context = event.context,\n          canConnect = context.canExecute,\n          hover = context.hover,\n          source = context.source,\n          start = context.start,\n          startPosition = context.startPosition,\n          target = context.target,\n          connectionStart = context.connectionStart || startPosition,\n          connectionEnd = context.connectionEnd || {\n            x: event.x,\n            y: event.y\n          },\n          previewStart = connectionStart,\n          previewEnd = connectionEnd;\n\n      if (isReverse$1(context)) {\n        previewStart = connectionEnd;\n        previewEnd = connectionStart;\n      }\n\n      connectionPreview.drawPreview(context, canConnect, {\n        source: source || start,\n        target: target || hover,\n        connectionStart: previewStart,\n        connectionEnd: previewEnd\n      });\n    });\n\n    eventBus.on('connect.hover', LOW_PRIORITY$j, function(event) {\n      var context = event.context,\n          hover = event.hover,\n          canExecute = context.canExecute;\n\n      // ignore hover\n      if (canExecute === null) {\n        return;\n      }\n\n      canvas.addMarker(hover, canExecute ? MARKER_OK$3 : MARKER_NOT_OK$3);\n    });\n\n    eventBus.on([\n      'connect.out',\n      'connect.cleanup'\n    ], HIGH_PRIORITY$h, function(event) {\n      var hover = event.hover;\n\n      if (hover) {\n        canvas.removeMarker(hover, MARKER_OK$3);\n        canvas.removeMarker(hover, MARKER_NOT_OK$3);\n      }\n    });\n\n    connectionPreview && eventBus.on('connect.cleanup', function(event) {\n      connectionPreview.cleanUp(event.context);\n    });\n  }\n\n  ConnectPreview.$inject = [\n    'injector',\n    'eventBus',\n    'canvas'\n  ];\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var ConnectModule = {\n    __depends__: [\n      SelectionModule,\n      RulesModule$1,\n      DraggingModule\n    ],\n    __init__: [\n      'connectPreview'\n    ],\n    connect: [ 'type', Connect ],\n    connectPreview: [ 'type', ConnectPreview ]\n  };\n\n  /**\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Connection} Connection\n   * @typedef {import('../../model/Types').Shape} Shape\n   *\n   * @typedef {import('../../util/Types').Point} Point\n   *\n   * @typedef {import('didi').Injector} Injector\n   *\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/ElementFactory').default} ElementFactory\n   * @typedef {import('../../core/GraphicsFactory').default} GraphicsFactory\n   */\n\n  var MARKER_CONNECTION_PREVIEW = 'djs-connection-preview';\n\n  /**\n   * Draws connection preview. Optionally, this can use layouter and connection docking to draw\n   * better looking previews.\n   *\n   * @param {Injector} injector\n   * @param {Canvas} canvas\n   * @param {GraphicsFactory} graphicsFactory\n   * @param {ElementFactory} elementFactory\n   */\n  function ConnectionPreview(\n      injector,\n      canvas,\n      graphicsFactory,\n      elementFactory\n  ) {\n    this._canvas = canvas;\n    this._graphicsFactory = graphicsFactory;\n    this._elementFactory = elementFactory;\n\n    // optional components\n    this._connectionDocking = injector.get('connectionDocking', false);\n    this._layouter = injector.get('layouter', false);\n  }\n\n  ConnectionPreview.$inject = [\n    'injector',\n    'canvas',\n    'graphicsFactory',\n    'elementFactory'\n  ];\n\n  /**\n   * Draw connection preview.\n   *\n   * Provide at least one of <source, connectionStart> and <target, connectionEnd> to create a preview.\n   * In the clean up stage, call `connectionPreview#cleanUp` with the context to remove preview.\n   *\n   * @param {Object} context\n   * @param {Object|boolean} canConnect\n   * @param {Object} hints\n   * @param {Element} [hints.source] source element\n   * @param {Element} [hints.target] target element\n   * @param {Point} [hints.connectionStart] connection preview start\n   * @param {Point} [hints.connectionEnd] connection preview end\n   * @param {Point[]} [hints.waypoints] provided waypoints for preview\n   * @param {boolean} [hints.noLayout] true if preview should not be laid out\n   * @param {boolean} [hints.noCropping] true if preview should not be cropped\n   * @param {boolean} [hints.noNoop] true if simple connection should not be drawn\n   */\n  ConnectionPreview.prototype.drawPreview = function(context, canConnect, hints) {\n\n    hints = hints || {};\n\n    var connectionPreviewGfx = context.connectionPreviewGfx,\n        getConnection = context.getConnection,\n        source = hints.source,\n        target = hints.target,\n        waypoints = hints.waypoints,\n        connectionStart = hints.connectionStart,\n        connectionEnd = hints.connectionEnd,\n        noLayout = hints.noLayout,\n        noCropping = hints.noCropping,\n        noNoop = hints.noNoop,\n        connection;\n\n    var self = this;\n\n    if (!connectionPreviewGfx) {\n      connectionPreviewGfx = context.connectionPreviewGfx = this.createConnectionPreviewGfx();\n    }\n\n    clear(connectionPreviewGfx);\n\n    if (!getConnection) {\n      getConnection = context.getConnection = cacheReturnValues(function(canConnect, source, target) {\n        return self.getConnection(canConnect, source, target);\n      });\n    }\n\n    if (canConnect) {\n      connection = getConnection(canConnect, source, target);\n    }\n\n    if (!connection) {\n      !noNoop && this.drawNoopPreview(connectionPreviewGfx, hints);\n      return;\n    }\n\n    connection.waypoints = waypoints || [];\n\n    // optional layout\n    if (this._layouter && !noLayout) {\n      connection.waypoints = this._layouter.layoutConnection(connection, {\n        source: source,\n        target: target,\n        connectionStart: connectionStart,\n        connectionEnd: connectionEnd,\n        waypoints: hints.waypoints || connection.waypoints\n      });\n    }\n\n    // fallback if no waypoints were provided nor created with layouter\n    if (!connection.waypoints || !connection.waypoints.length) {\n      connection.waypoints = [\n        source ? getMid(source) : connectionStart,\n        target ? getMid(target) : connectionEnd\n      ];\n    }\n\n    // optional cropping\n    if (this._connectionDocking && (source || target) && !noCropping) {\n      connection.waypoints = this._connectionDocking.getCroppedWaypoints(connection, source, target);\n    }\n\n    this._graphicsFactory.drawConnection(connectionPreviewGfx, connection);\n  };\n\n  /**\n   * Draw simple connection between source and target or provided points.\n   *\n   * @param {SVGElement} connectionPreviewGfx container for the connection\n   * @param {Object} hints\n   * @param {Element} [hints.source] source element\n   * @param {Element} [hints.target] target element\n   * @param {Point} [hints.connectionStart] required if source is not provided\n   * @param {Point} [hints.connectionEnd] required if target is not provided\n   */\n  ConnectionPreview.prototype.drawNoopPreview = function(connectionPreviewGfx, hints) {\n    var source = hints.source,\n        target = hints.target,\n        start = hints.connectionStart || getMid(source),\n        end = hints.connectionEnd || getMid(target);\n\n    var waypoints = this.cropWaypoints(start, end, source, target);\n\n    var connection = this.createNoopConnection(waypoints[0], waypoints[1]);\n\n    append(connectionPreviewGfx, connection);\n  };\n\n  /**\n   * Return cropped waypoints.\n   *\n   * @param {Point} start\n   * @param {Point} end\n   * @param {Element} source\n   * @param {Element} target\n   *\n   * @return {Point[]}\n   */\n  ConnectionPreview.prototype.cropWaypoints = function(start, end, source, target) {\n    var graphicsFactory = this._graphicsFactory,\n        sourcePath = source && graphicsFactory.getShapePath(source),\n        targetPath = target && graphicsFactory.getShapePath(target),\n        connectionPath = graphicsFactory.getConnectionPath({ waypoints: [ start, end ] });\n\n    start = (source && getElementLineIntersection(sourcePath, connectionPath, true)) || start;\n    end = (target && getElementLineIntersection(targetPath, connectionPath, false)) || end;\n\n    return [ start, end ];\n  };\n\n  /**\n   * Remove connection preview container if it exists.\n   *\n   * @param {Object} [context]\n   * @param {SVGElement} [context.connectionPreviewGfx] preview container\n   */\n  ConnectionPreview.prototype.cleanUp = function(context) {\n    if (context && context.connectionPreviewGfx) {\n      remove$1(context.connectionPreviewGfx);\n    }\n  };\n\n  /**\n   * Get connection that connects source and target.\n   *\n   * @param {Object|boolean} canConnect\n   *\n   * @return {Connection}\n   */\n  ConnectionPreview.prototype.getConnection = function(canConnect) {\n    var attrs = ensureConnectionAttrs(canConnect);\n\n    return this._elementFactory.createConnection(attrs);\n  };\n\n\n  /**\n   * Add and return preview graphics.\n   *\n   * @return {SVGElement}\n   */\n  ConnectionPreview.prototype.createConnectionPreviewGfx = function() {\n    var gfx = create$1('g');\n\n    attr(gfx, {\n      pointerEvents: 'none'\n    });\n\n    classes(gfx).add(MARKER_CONNECTION_PREVIEW);\n\n    append(this._canvas.getActiveLayer(), gfx);\n\n    return gfx;\n  };\n\n  /**\n   * Create and return simple connection.\n   *\n   * @param {Point} start\n   * @param {Point} end\n   *\n   * @return {SVGElement}\n   */\n  ConnectionPreview.prototype.createNoopConnection = function(start, end) {\n    return createLine([ start, end ], {\n      'stroke': '#333',\n      'strokeDasharray': [ 1 ],\n      'strokeWidth': 2,\n      'pointer-events': 'none'\n    });\n  };\n\n  // helpers //////////\n\n  /**\n   * Returns function that returns cached return values referenced by stringified first argument.\n   *\n   * @param {Function} fn\n   *\n   * @return {Function}\n   */\n  function cacheReturnValues(fn) {\n    var returnValues = {};\n\n    /**\n     * Return cached return value referenced by stringified first argument.\n     *\n     * @return {*}\n     */\n    return function(firstArgument) {\n      var key = JSON.stringify(firstArgument);\n\n      var returnValue = returnValues[key];\n\n      if (!returnValue) {\n        returnValue = returnValues[key] = fn.apply(null, arguments);\n      }\n\n      return returnValue;\n    };\n  }\n\n  /**\n   * Ensure connection attributes is object.\n   *\n   * @param {Object|boolean} canConnect\n   *\n   * @return {Object}\n   */\n  function ensureConnectionAttrs(canConnect) {\n    if (isObject(canConnect)) {\n      return canConnect;\n    } else {\n      return {};\n    }\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var ConnectionPreviewModule = {\n    __init__: [ 'connectionPreview' ],\n    connectionPreview: [ 'type', ConnectionPreview ]\n  };\n\n  var min$3 = Math.min,\n      max$5 = Math.max;\n\n  function preventDefault(e) {\n    e.preventDefault();\n  }\n\n  function stopPropagation(e) {\n    e.stopPropagation();\n  }\n\n  function isTextNode(node) {\n    return node.nodeType === Node.TEXT_NODE;\n  }\n\n  function toArray(nodeList) {\n    return [].slice.call(nodeList);\n  }\n\n  /**\n   * Initializes a container for a content editable div.\n   *\n   * Structure:\n   *\n   * container\n   *   parent\n   *     content\n   *     resize-handle\n   *\n   * @param {object} options\n   * @param {DOMElement} options.container The DOM element to append the contentContainer to\n   * @param {Function} options.keyHandler Handler for key events\n   * @param {Function} options.resizeHandler Handler for resize events\n   */\n  function TextBox(options) {\n    this.container = options.container;\n\n    this.parent = domify$1(\n      '<div class=\"djs-direct-editing-parent\">' +\n        '<div class=\"djs-direct-editing-content\" contenteditable=\"true\"></div>' +\n      '</div>'\n    );\n\n    this.content = query('[contenteditable]', this.parent);\n\n    this.keyHandler = options.keyHandler || function() {};\n    this.resizeHandler = options.resizeHandler || function() {};\n\n    this.autoResize = bind$2(this.autoResize, this);\n    this.handlePaste = bind$2(this.handlePaste, this);\n  }\n\n\n  /**\n   * Create a text box with the given position, size, style and text content\n   *\n   * @param {Object} bounds\n   * @param {Number} bounds.x absolute x position\n   * @param {Number} bounds.y absolute y position\n   * @param {Number} [bounds.width] fixed width value\n   * @param {Number} [bounds.height] fixed height value\n   * @param {Number} [bounds.maxWidth] maximum width value\n   * @param {Number} [bounds.maxHeight] maximum height value\n   * @param {Number} [bounds.minWidth] minimum width value\n   * @param {Number} [bounds.minHeight] minimum height value\n   * @param {Object} [style]\n   * @param {String} value text content\n   *\n   * @return {DOMElement} The created content DOM element\n   */\n  TextBox.prototype.create = function(bounds, style, value, options) {\n    var self = this;\n\n    var parent = this.parent,\n        content = this.content,\n        container = this.container;\n\n    options = this.options = options || {};\n\n    style = this.style = style || {};\n\n    var parentStyle = pick(style, [\n      'width',\n      'height',\n      'maxWidth',\n      'maxHeight',\n      'minWidth',\n      'minHeight',\n      'left',\n      'top',\n      'backgroundColor',\n      'position',\n      'overflow',\n      'border',\n      'wordWrap',\n      'textAlign',\n      'outline',\n      'transform'\n    ]);\n\n    assign$1(parent.style, {\n      width: bounds.width + 'px',\n      height: bounds.height + 'px',\n      maxWidth: bounds.maxWidth + 'px',\n      maxHeight: bounds.maxHeight + 'px',\n      minWidth: bounds.minWidth + 'px',\n      minHeight: bounds.minHeight + 'px',\n      left: bounds.x + 'px',\n      top: bounds.y + 'px',\n      backgroundColor: '#ffffff',\n      position: 'absolute',\n      overflow: 'visible',\n      border: '1px solid #ccc',\n      boxSizing: 'border-box',\n      wordWrap: 'normal',\n      textAlign: 'center',\n      outline: 'none'\n    }, parentStyle);\n\n    var contentStyle = pick(style, [\n      'fontFamily',\n      'fontSize',\n      'fontWeight',\n      'lineHeight',\n      'padding',\n      'paddingTop',\n      'paddingRight',\n      'paddingBottom',\n      'paddingLeft'\n    ]);\n\n    assign$1(content.style, {\n      boxSizing: 'border-box',\n      width: '100%',\n      outline: 'none',\n      wordWrap: 'break-word'\n    }, contentStyle);\n\n    if (options.centerVertically) {\n      assign$1(content.style, {\n        position: 'absolute',\n        top: '50%',\n        transform: 'translate(0, -50%)'\n      }, contentStyle);\n    }\n\n    content.innerText = value;\n\n    event.bind(content, 'keydown', this.keyHandler);\n    event.bind(content, 'mousedown', stopPropagation);\n    event.bind(content, 'paste', self.handlePaste);\n\n    if (options.autoResize) {\n      event.bind(content, 'input', this.autoResize);\n    }\n\n    if (options.resizable) {\n      this.resizable(style);\n    }\n\n    container.appendChild(parent);\n\n    // set selection to end of text\n    this.setSelection(content.lastChild, content.lastChild && content.lastChild.length);\n\n    return parent;\n  };\n\n  /**\n   * Intercept paste events to remove formatting from pasted text.\n   */\n  TextBox.prototype.handlePaste = function(e) {\n    var options = this.options,\n        style = this.style;\n\n    e.preventDefault();\n\n    var text;\n\n    if (e.clipboardData) {\n\n      // Chrome, Firefox, Safari\n      text = e.clipboardData.getData('text/plain');\n    } else {\n\n      // Internet Explorer\n      text = window.clipboardData.getData('Text');\n    }\n\n    this.insertText(text);\n\n    if (options.autoResize) {\n      var hasResized = this.autoResize(style);\n\n      if (hasResized) {\n        this.resizeHandler(hasResized);\n      }\n    }\n  };\n\n  TextBox.prototype.insertText = function(text) {\n    text = normalizeEndOfLineSequences(text);\n\n    // insertText command not supported by Internet Explorer\n    var success = document.execCommand('insertText', false, text);\n\n    if (success) {\n      return;\n    }\n\n    this._insertTextIE(text);\n  };\n\n  TextBox.prototype._insertTextIE = function(text) {\n\n    // Internet Explorer\n    var range = this.getSelection(),\n        startContainer = range.startContainer,\n        endContainer = range.endContainer,\n        startOffset = range.startOffset,\n        endOffset = range.endOffset,\n        commonAncestorContainer = range.commonAncestorContainer;\n\n    var childNodesArray = toArray(commonAncestorContainer.childNodes);\n\n    var container,\n        offset;\n\n    if (isTextNode(commonAncestorContainer)) {\n      var containerTextContent = startContainer.textContent;\n\n      startContainer.textContent =\n        containerTextContent.substring(0, startOffset)\n        + text\n        + containerTextContent.substring(endOffset);\n\n      container = startContainer;\n      offset = startOffset + text.length;\n\n    } else if (startContainer === this.content && endContainer === this.content) {\n      var textNode = document.createTextNode(text);\n\n      this.content.insertBefore(textNode, childNodesArray[startOffset]);\n\n      container = textNode;\n      offset = textNode.textContent.length;\n    } else {\n      var startContainerChildIndex = childNodesArray.indexOf(startContainer),\n          endContainerChildIndex = childNodesArray.indexOf(endContainer);\n\n      childNodesArray.forEach(function(childNode, index) {\n\n        if (index === startContainerChildIndex) {\n          childNode.textContent =\n            startContainer.textContent.substring(0, startOffset) +\n            text +\n            endContainer.textContent.substring(endOffset);\n        } else if (index > startContainerChildIndex && index <= endContainerChildIndex) {\n          remove$2(childNode);\n        }\n      });\n\n      container = startContainer;\n      offset = startOffset + text.length;\n    }\n\n    if (container && offset !== undefined) {\n\n      // is necessary in Internet Explorer\n      setTimeout(function() {\n        self.setSelection(container, offset);\n      });\n    }\n  };\n\n  /**\n   * Automatically resize element vertically to fit its content.\n   */\n  TextBox.prototype.autoResize = function() {\n    var parent = this.parent,\n        content = this.content;\n\n    var fontSize = parseInt(this.style.fontSize) || 12;\n\n    if (content.scrollHeight > parent.offsetHeight ||\n        content.scrollHeight < parent.offsetHeight - fontSize) {\n      var bounds = parent.getBoundingClientRect();\n\n      var height = content.scrollHeight;\n      parent.style.height = height + 'px';\n\n      this.resizeHandler({\n        width: bounds.width,\n        height: bounds.height,\n        dx: 0,\n        dy: height - bounds.height\n      });\n    }\n  };\n\n  /**\n   * Make an element resizable by adding a resize handle.\n   */\n  TextBox.prototype.resizable = function() {\n    var self = this;\n\n    var parent = this.parent,\n        resizeHandle = this.resizeHandle;\n\n    var minWidth = parseInt(this.style.minWidth) || 0,\n        minHeight = parseInt(this.style.minHeight) || 0,\n        maxWidth = parseInt(this.style.maxWidth) || Infinity,\n        maxHeight = parseInt(this.style.maxHeight) || Infinity;\n\n    if (!resizeHandle) {\n      resizeHandle = this.resizeHandle = domify$1(\n        '<div class=\"djs-direct-editing-resize-handle\"></div>'\n      );\n\n      var startX, startY, startWidth, startHeight;\n\n      var onMouseDown = function(e) {\n        preventDefault(e);\n        stopPropagation(e);\n\n        startX = e.clientX;\n        startY = e.clientY;\n\n        var bounds = parent.getBoundingClientRect();\n\n        startWidth = bounds.width;\n        startHeight = bounds.height;\n\n        event.bind(document, 'mousemove', onMouseMove);\n        event.bind(document, 'mouseup', onMouseUp);\n      };\n\n      var onMouseMove = function(e) {\n        preventDefault(e);\n        stopPropagation(e);\n\n        var newWidth = min$3(max$5(startWidth + e.clientX - startX, minWidth), maxWidth);\n        var newHeight = min$3(max$5(startHeight + e.clientY - startY, minHeight), maxHeight);\n\n        parent.style.width = newWidth + 'px';\n        parent.style.height = newHeight + 'px';\n\n        self.resizeHandler({\n          width: startWidth,\n          height: startHeight,\n          dx: e.clientX - startX,\n          dy: e.clientY - startY\n        });\n      };\n\n      var onMouseUp = function(e) {\n        preventDefault(e);\n        stopPropagation(e);\n\n        event.unbind(document,'mousemove', onMouseMove, false);\n        event.unbind(document, 'mouseup', onMouseUp, false);\n      };\n\n      event.bind(resizeHandle, 'mousedown', onMouseDown);\n    }\n\n    assign$1(resizeHandle.style, {\n      position: 'absolute',\n      bottom: '0px',\n      right: '0px',\n      cursor: 'nwse-resize',\n      width: '0',\n      height: '0',\n      borderTop: (parseInt(this.style.fontSize) / 4 || 3) + 'px solid transparent',\n      borderRight: (parseInt(this.style.fontSize) / 4 || 3) + 'px solid #ccc',\n      borderBottom: (parseInt(this.style.fontSize) / 4 || 3) + 'px solid #ccc',\n      borderLeft: (parseInt(this.style.fontSize) / 4 || 3) + 'px solid transparent'\n    });\n\n    parent.appendChild(resizeHandle);\n  };\n\n\n  /**\n   * Clear content and style of the textbox, unbind listeners and\n   * reset CSS style.\n   */\n  TextBox.prototype.destroy = function() {\n    var parent = this.parent,\n        content = this.content,\n        resizeHandle = this.resizeHandle;\n\n    // clear content\n    content.innerText = '';\n\n    // clear styles\n    parent.removeAttribute('style');\n    content.removeAttribute('style');\n\n    event.unbind(content, 'keydown', this.keyHandler);\n    event.unbind(content, 'mousedown', stopPropagation);\n    event.unbind(content, 'input', this.autoResize);\n    event.unbind(content, 'paste', this.handlePaste);\n\n    if (resizeHandle) {\n      resizeHandle.removeAttribute('style');\n\n      remove$2(resizeHandle);\n    }\n\n    remove$2(parent);\n  };\n\n\n  TextBox.prototype.getValue = function() {\n    return this.content.innerText.trim();\n  };\n\n\n  TextBox.prototype.getSelection = function() {\n    var selection = window.getSelection(),\n        range = selection.getRangeAt(0);\n\n    return range;\n  };\n\n\n  TextBox.prototype.setSelection = function(container, offset) {\n    var range = document.createRange();\n\n    if (container === null) {\n      range.selectNodeContents(this.content);\n    } else {\n      range.setStart(container, offset);\n      range.setEnd(container, offset);\n    }\n\n    var selection = window.getSelection();\n\n    selection.removeAllRanges();\n    selection.addRange(range);\n  };\n\n  // helpers //////////\n\n  function normalizeEndOfLineSequences(string) {\n    return string.replace(/\\r\\n|\\r|\\n/g, '\\n');\n  }\n\n  /**\n   * A direct editing component that allows users\n   * to edit an elements text directly in the diagram\n   *\n   * @param {EventBus} eventBus the event bus\n   */\n  function DirectEditing(eventBus, canvas) {\n\n    this._eventBus = eventBus;\n\n    this._providers = [];\n    this._textbox = new TextBox({\n      container: canvas.getContainer(),\n      keyHandler: bind$2(this._handleKey, this),\n      resizeHandler: bind$2(this._handleResize, this)\n    });\n  }\n\n  DirectEditing.$inject = [ 'eventBus', 'canvas' ];\n\n\n  /**\n   * Register a direct editing provider\n\n   * @param {Object} provider the provider, must expose an #activate(element) method that returns\n   *                          an activation context ({ bounds: {x, y, width, height }, text }) if\n   *                          direct editing is available for the given element.\n   *                          Additionally the provider must expose a #update(element, value) method\n   *                          to receive direct editing updates.\n   */\n  DirectEditing.prototype.registerProvider = function(provider) {\n    this._providers.push(provider);\n  };\n\n\n  /**\n   * Returns true if direct editing is currently active\n   *\n   * @param {djs.model.Base} [element]\n   *\n   * @return {boolean}\n   */\n  DirectEditing.prototype.isActive = function(element) {\n    return !!(this._active && (!element || this._active.element === element));\n  };\n\n\n  /**\n   * Cancel direct editing, if it is currently active\n   */\n  DirectEditing.prototype.cancel = function() {\n    if (!this._active) {\n      return;\n    }\n\n    this._fire('cancel');\n    this.close();\n  };\n\n\n  DirectEditing.prototype._fire = function(event, context) {\n    this._eventBus.fire('directEditing.' + event, context || { active: this._active });\n  };\n\n  DirectEditing.prototype.close = function() {\n    this._textbox.destroy();\n\n    this._fire('deactivate');\n\n    this._active = null;\n\n    this.resizable = undefined;\n  };\n\n\n  DirectEditing.prototype.complete = function() {\n\n    var active = this._active;\n\n    if (!active) {\n      return;\n    }\n\n    var containerBounds,\n        previousBounds = active.context.bounds,\n        newBounds = this.$textbox.getBoundingClientRect(),\n        newText = this.getValue(),\n        previousText = active.context.text;\n\n    if (\n      newText !== previousText ||\n      newBounds.height !== previousBounds.height ||\n      newBounds.width !== previousBounds.width\n    ) {\n      containerBounds = this._textbox.container.getBoundingClientRect();\n\n      active.provider.update(active.element, newText, active.context.text, {\n        x: newBounds.left - containerBounds.left,\n        y: newBounds.top - containerBounds.top,\n        width: newBounds.width,\n        height: newBounds.height\n      });\n    }\n\n    this._fire('complete');\n\n    this.close();\n  };\n\n\n  DirectEditing.prototype.getValue = function() {\n    return this._textbox.getValue();\n  };\n\n\n  DirectEditing.prototype._handleKey = function(e) {\n\n    // stop bubble\n    e.stopPropagation();\n\n    var key = e.keyCode || e.charCode;\n\n    // ESC\n    if (key === 27) {\n      e.preventDefault();\n      return this.cancel();\n    }\n\n    // Enter\n    if (key === 13 && !e.shiftKey) {\n      e.preventDefault();\n      return this.complete();\n    }\n  };\n\n\n  DirectEditing.prototype._handleResize = function(event) {\n    this._fire('resize', event);\n  };\n\n\n  /**\n   * Activate direct editing on the given element\n   *\n   * @param {Object} ElementDescriptor the descriptor for a shape or connection\n   * @return {Boolean} true if the activation was possible\n   */\n  DirectEditing.prototype.activate = function(element) {\n    if (this.isActive()) {\n      this.cancel();\n    }\n\n    // the direct editing context\n    var context;\n\n    var provider = find(this._providers, function(p) {\n      return ((context = p.activate(element))) ? p : null;\n    });\n\n    // check if activation took place\n    if (context) {\n      this.$textbox = this._textbox.create(\n        context.bounds,\n        context.style,\n        context.text,\n        context.options\n      );\n\n      this._active = {\n        element: element,\n        context: context,\n        provider: provider\n      };\n\n      if (context.options && context.options.resizable) {\n        this.resizable = true;\n      }\n\n      this._fire('activate');\n    }\n\n    return !!context;\n  };\n\n  var DirectEditingModule = {\n    __depends__: [\n      InteractionEventsModule$1\n    ],\n    __init__: [ 'directEditing' ],\n    directEditing: [ 'type', DirectEditing ]\n  };\n\n  /**\r\n   * @typedef {import('../../core/Types').ElementLike} Element\r\n   * @typedef {import('../../core/Types').ShapeLike} Shape\r\n   *\r\n   * @typedef {import('../../core/Canvas').default} Canvas\r\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\r\n   * @typedef {import('../../core/EventBus').default} EventBus\r\n   * @typedef {import('../../draw/Styles').default} Styles\r\n   */\r\n\r\n  var MARKER_TYPES = [\r\n    'marker-start',\r\n    'marker-mid',\r\n    'marker-end'\r\n  ];\r\n\r\n  var NODES_CAN_HAVE_MARKER = [\r\n    'circle',\r\n    'ellipse',\r\n    'line',\r\n    'path',\r\n    'polygon',\r\n    'polyline',\r\n    'path',\r\n    'rect'\r\n  ];\r\n\r\n\r\n  /**\r\n   * Adds support for previews of moving/resizing elements.\r\n   *\r\n   * @param {ElementRegistry} elementRegistry\r\n   * @param {EventBus} eventBus\r\n   * @param {Canvas} canvas\r\n   * @param {Styles} styles\r\n   */\r\n  function PreviewSupport(elementRegistry, eventBus, canvas, styles) {\r\n    this._elementRegistry = elementRegistry;\r\n    this._canvas = canvas;\r\n    this._styles = styles;\r\n\r\n    this._clonedMarkers = {};\r\n\r\n    var self = this;\r\n\r\n    eventBus.on('drag.cleanup', function() {\r\n      forEach$1(self._clonedMarkers, function(clonedMarker) {\r\n        remove$1(clonedMarker);\r\n      });\r\n\r\n      self._clonedMarkers = {};\r\n    });\r\n  }\r\n\r\n  PreviewSupport.$inject = [\r\n    'elementRegistry',\r\n    'eventBus',\r\n    'canvas',\r\n    'styles'\r\n  ];\r\n\r\n\r\n  /**\r\n   * Returns graphics of an element.\r\n   *\r\n   * @param {Element} element\r\n   *\r\n   * @return {SVGElement}\r\n   */\r\n  PreviewSupport.prototype.getGfx = function(element) {\r\n    return this._elementRegistry.getGraphics(element);\r\n  };\r\n\r\n  /**\r\n   * Adds a move preview of a given shape to a given SVG group.\r\n   *\r\n   * @param {Element} element The element to be moved.\r\n   * @param {SVGElement} group The SVG group to add the preview to.\r\n   * @param {SVGElement} [gfx] The optional graphical element of the element.\r\n   *\r\n   * @return {SVGElement} The preview.\r\n   */\r\n  PreviewSupport.prototype.addDragger = function(element, group, gfx) {\r\n    gfx = gfx || this.getGfx(element);\r\n\r\n    var dragger = clone$1(gfx);\r\n    var bbox = gfx.getBoundingClientRect();\r\n\r\n    this._cloneMarkers(getVisual(dragger));\r\n\r\n    attr(dragger, this._styles.cls('djs-dragger', [], {\r\n      x: bbox.top,\r\n      y: bbox.left\r\n    }));\r\n\r\n    append(group, dragger);\r\n\r\n    return dragger;\r\n  };\r\n\r\n  /**\r\n   * Adds a resize preview of a given shape to a given SVG group.\r\n   *\r\n   * @param {Shape} shape The element to be resized.\r\n   * @param {SVGElement} group The SVG group to add the preview to.\r\n   *\r\n   * @return {SVGElement} The preview.\r\n   */\r\n  PreviewSupport.prototype.addFrame = function(shape, group) {\r\n\r\n    var frame = create$1('rect', {\r\n      class: 'djs-resize-overlay',\r\n      width:  shape.width,\r\n      height: shape.height,\r\n      x: shape.x,\r\n      y: shape.y\r\n    });\r\n\r\n    append(group, frame);\r\n\r\n    return frame;\r\n  };\r\n\r\n  /**\r\n   * Clone all markers referenced by a node and its child nodes.\r\n   *\r\n   * @param {SVGElement} gfx\r\n   */\r\n  PreviewSupport.prototype._cloneMarkers = function(gfx) {\r\n    var self = this;\r\n\r\n    if (gfx.childNodes) {\r\n\r\n      // TODO: use forEach once we drop PhantomJS\r\n      for (var i = 0; i < gfx.childNodes.length; i++) {\r\n\r\n        // recursively clone markers of child nodes\r\n        self._cloneMarkers(gfx.childNodes[ i ]);\r\n      }\r\n    }\r\n\r\n    if (!canHaveMarker(gfx)) {\r\n      return;\r\n    }\r\n\r\n    MARKER_TYPES.forEach(function(markerType) {\r\n      if (attr(gfx, markerType)) {\r\n        var marker = getMarker(gfx, markerType, self._canvas.getContainer());\r\n\r\n        self._cloneMarker(gfx, marker, markerType);\r\n      }\r\n    });\r\n  };\r\n\r\n  /**\r\n   * Clone marker referenced by an element.\r\n   *\r\n   * @param {SVGElement} gfx\r\n   * @param {SVGElement} marker\r\n   * @param {string} markerType\r\n   */\r\n  PreviewSupport.prototype._cloneMarker = function(gfx, marker, markerType) {\r\n    var markerId = marker.id;\r\n\r\n    var clonedMarker = this._clonedMarkers[ markerId ];\r\n\r\n    if (!clonedMarker) {\r\n      clonedMarker = clone$1(marker);\r\n\r\n      var clonedMarkerId = markerId + '-clone';\r\n\r\n      clonedMarker.id = clonedMarkerId;\r\n\r\n      classes(clonedMarker)\r\n        .add('djs-dragger')\r\n        .add('djs-dragger-marker');\r\n\r\n      this._clonedMarkers[ markerId ] = clonedMarker;\r\n\r\n      var defs = query('defs', this._canvas._svg);\r\n\r\n      if (!defs) {\r\n        defs = create$1('defs');\r\n\r\n        append(this._canvas._svg, defs);\r\n      }\r\n\r\n      append(defs, clonedMarker);\r\n    }\r\n\r\n    var reference = idToReference(this._clonedMarkers[ markerId ].id);\r\n\r\n    attr(gfx, markerType, reference);\r\n  };\r\n\r\n  // helpers //////////\r\n\r\n  /**\r\n   * Get marker of given type referenced by node.\r\n   *\r\n   * @param {HTMLElement} node\r\n   * @param {string} markerType\r\n   * @param {HTMLElement} [parentNode]\r\n   *\r\n   * @param {HTMLElement}\r\n   */\r\n  function getMarker(node, markerType, parentNode) {\r\n    var id = referenceToId(attr(node, markerType));\r\n\r\n    return query('marker#' + id, parentNode || document);\r\n  }\r\n\r\n  /**\r\n   * Get ID of fragment within current document from its functional IRI reference.\r\n   * References may use single or double quotes.\r\n   *\r\n   * @param {string} reference\r\n   *\r\n   * @return {string}\r\n   */\r\n  function referenceToId(reference) {\r\n    return reference.match(/url\\(['\"]?#([^'\"]*)['\"]?\\)/)[1];\r\n  }\r\n\r\n  /**\r\n   * Get functional IRI reference for given ID of fragment within current document.\r\n   *\r\n   * @param {string} id\r\n   *\r\n   * @return {string}\r\n   */\r\n  function idToReference(id) {\r\n    return 'url(#' + id + ')';\r\n  }\r\n\r\n  /**\r\n   * Check wether node type can have marker attributes.\r\n   *\r\n   * @param {HTMLElement} node\r\n   *\r\n   * @return {boolean}\r\n   */\r\n  function canHaveMarker(node) {\r\n    return NODES_CAN_HAVE_MARKER.indexOf(node.nodeName) !== -1;\r\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var PreviewSupportModule = {\n    __init__: [ 'previewSupport' ],\n    previewSupport: [ 'type', PreviewSupport ]\n  };\n\n  var MARKER_OK$2 = 'drop-ok',\n      MARKER_NOT_OK$2 = 'drop-not-ok',\n      MARKER_ATTACH$2 = 'attach-ok',\n      MARKER_NEW_PARENT$1 = 'new-parent';\n\n  /**\n   * @typedef {import('../../core/Types').ElementLike} Element\n   * @typedef {import('../../core/Types').ShapeLike} Shape\n   *\n   * @typedef {import('../../util/Types').Point} Point\n   *\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../dragging/Dragging').default} Dragging\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   * @typedef {import('../rules/Rules').default} Rules\n   */\n\n  var PREFIX = 'create';\n\n  var HIGH_PRIORITY$g = 2000;\n\n\n  /**\n   * Create new elements through drag and drop.\n   *\n   * @param {Canvas} canvas\n   * @param {Dragging} dragging\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   * @param {Rules} rules\n   */\n  function Create(\n      canvas,\n      dragging,\n      eventBus,\n      modeling,\n      rules\n  ) {\n\n    // rules //////////\n\n    /**\n     * Check wether elements can be created.\n     *\n     * @param {Element[]} elements\n     * @param {Shape} target\n     * @param {Point} position\n     * @param {Element} [source]\n     *\n     * @return {boolean|null|Object}\n     */\n    function canCreate(elements, target, position, source, hints) {\n      if (!target) {\n        return false;\n      }\n\n      // ignore child elements and external labels\n      elements = filter(elements, function(element) {\n        var labelTarget = element.labelTarget;\n\n        return !element.parent && !(isLabel(element) && elements.indexOf(labelTarget) !== -1);\n      });\n\n      var shape = find(elements, function(element) {\n        return !isConnection(element);\n      });\n\n      var attach = false,\n          connect = false,\n          create = false;\n\n      // (1) attaching single shapes\n      if (isSingleShape(elements)) {\n        attach = rules.allowed('shape.attach', {\n          position: position,\n          shape: shape,\n          target: target\n        });\n      }\n\n      if (!attach) {\n\n        // (2) creating elements\n        if (isSingleShape(elements)) {\n          create = rules.allowed('shape.create', {\n            position: position,\n            shape: shape,\n            source: source,\n            target: target\n          });\n        } else {\n          create = rules.allowed('elements.create', {\n            elements: elements,\n            position: position,\n            target: target\n          });\n        }\n\n      }\n\n      var connectionTarget = hints.connectionTarget;\n\n      // (3) appending single shapes\n      if (create || attach) {\n        if (shape && source) {\n          connect = rules.allowed('connection.create', {\n            source: connectionTarget === source ? shape : source,\n            target: connectionTarget === source ? source : shape,\n            hints: {\n              targetParent: target,\n              targetAttach: attach\n            }\n          });\n        }\n\n        return {\n          attach: attach,\n          connect: connect\n        };\n      }\n\n      // ignore wether or not elements can be created\n      if (create === null || attach === null) {\n        return null;\n      }\n\n      return false;\n    }\n\n    function setMarker(element, marker) {\n      [ MARKER_ATTACH$2, MARKER_OK$2, MARKER_NOT_OK$2, MARKER_NEW_PARENT$1 ].forEach(function(m) {\n\n        if (m === marker) {\n          canvas.addMarker(element, m);\n        } else {\n          canvas.removeMarker(element, m);\n        }\n      });\n    }\n\n    // event handling //////////\n\n    eventBus.on([ 'create.move', 'create.hover' ], function(event) {\n      var context = event.context,\n          elements = context.elements,\n          hover = event.hover,\n          source = context.source,\n          hints = context.hints || {};\n\n      if (!hover) {\n        context.canExecute = false;\n        context.target = null;\n\n        return;\n      }\n\n      ensureConstraints$2(event);\n\n      var position = {\n        x: event.x,\n        y: event.y\n      };\n\n      var canExecute = context.canExecute = hover && canCreate(elements, hover, position, source, hints);\n\n      if (hover && canExecute !== null) {\n        context.target = hover;\n\n        if (canExecute && canExecute.attach) {\n          setMarker(hover, MARKER_ATTACH$2);\n        } else {\n          setMarker(hover, canExecute ? MARKER_NEW_PARENT$1 : MARKER_NOT_OK$2);\n        }\n      }\n    });\n\n    eventBus.on([ 'create.end', 'create.out', 'create.cleanup' ], function(event) {\n      var hover = event.hover;\n\n      if (hover) {\n        setMarker(hover, null);\n      }\n    });\n\n    eventBus.on('create.end', function(event) {\n      var context = event.context,\n          source = context.source,\n          shape = context.shape,\n          elements = context.elements,\n          target = context.target,\n          canExecute = context.canExecute,\n          attach = canExecute && canExecute.attach,\n          connect = canExecute && canExecute.connect,\n          hints = context.hints || {};\n\n      if (canExecute === false || !target) {\n        return false;\n      }\n\n      ensureConstraints$2(event);\n\n      var position = {\n        x: event.x,\n        y: event.y\n      };\n\n      if (connect) {\n        shape = modeling.appendShape(source, shape, position, target, {\n          attach: attach,\n          connection: connect === true ? {} : connect,\n          connectionTarget: hints.connectionTarget\n        });\n      } else {\n        elements = modeling.createElements(elements, position, target, assign$1({}, hints, {\n          attach: attach\n        }));\n\n        // update shape\n        shape = find(elements, function(element) {\n          return !isConnection(element);\n        });\n      }\n\n      // update elements and shape\n      assign$1(context, {\n        elements: elements,\n        shape: shape\n      });\n\n      assign$1(event, {\n        elements: elements,\n        shape: shape\n      });\n    });\n\n    function cancel() {\n      var context = dragging.context();\n\n      if (context && context.prefix === PREFIX) {\n        dragging.cancel();\n      }\n    }\n\n    // cancel on <elements.changed> that is not result of <drag.end>\n    eventBus.on('create.init', function() {\n      eventBus.on('elements.changed', cancel);\n\n      eventBus.once([ 'create.cancel', 'create.end' ], HIGH_PRIORITY$g, function() {\n        eventBus.off('elements.changed', cancel);\n      });\n    });\n\n    // API //////////\n\n    this.start = function(event, elements, context) {\n      if (!isArray$3(elements)) {\n        elements = [ elements ];\n      }\n\n      var shape = find(elements, function(element) {\n        return !isConnection(element);\n      });\n\n      if (!shape) {\n\n        // at least one shape is required\n        return;\n      }\n\n      context = assign$1({\n        elements: elements,\n        hints: {},\n        shape: shape\n      }, context || {});\n\n      // make sure each element has x and y\n      forEach$1(elements, function(element) {\n        if (!isNumber(element.x)) {\n          element.x = 0;\n        }\n\n        if (!isNumber(element.y)) {\n          element.y = 0;\n        }\n      });\n\n      var visibleElements = filter(elements, function(element) {\n        return !element.hidden;\n      });\n\n      var bbox = getBBox(visibleElements);\n\n      // center elements around cursor\n      forEach$1(elements, function(element) {\n        if (isConnection(element)) {\n          element.waypoints = map$1(element.waypoints, function(waypoint) {\n            return {\n              x: waypoint.x - bbox.x - bbox.width / 2,\n              y: waypoint.y - bbox.y - bbox.height / 2\n            };\n          });\n        }\n\n        assign$1(element, {\n          x: element.x - bbox.x - bbox.width / 2,\n          y: element.y - bbox.y - bbox.height / 2\n        });\n      });\n\n      dragging.init(event, PREFIX, {\n        cursor: 'grabbing',\n        autoActivate: true,\n        data: {\n          shape: shape,\n          elements: elements,\n          context: context\n        }\n      });\n    };\n  }\n\n  Create.$inject = [\n    'canvas',\n    'dragging',\n    'eventBus',\n    'modeling',\n    'rules'\n  ];\n\n  // helpers //////////\n\n  function ensureConstraints$2(event) {\n    var context = event.context,\n        createConstraints = context.createConstraints;\n\n    if (!createConstraints) {\n      return;\n    }\n\n    if (createConstraints.left) {\n      event.x = Math.max(event.x, createConstraints.left);\n    }\n\n    if (createConstraints.right) {\n      event.x = Math.min(event.x, createConstraints.right);\n    }\n\n    if (createConstraints.top) {\n      event.y = Math.max(event.y, createConstraints.top);\n    }\n\n    if (createConstraints.bottom) {\n      event.y = Math.min(event.y, createConstraints.bottom);\n    }\n  }\n\n  function isSingleShape(elements) {\n    return elements && elements.length === 1 && !isConnection(elements[ 0 ]);\n  }\n\n  /**\r\n   * @typedef {import('../../core/Canvas').default} Canvas\r\n   * @typedef {import('../../core/EventBus').default} EventBus\r\n   * @typedef {import('../../core/GraphicsFactory').default} GraphicsFactory\r\n   * @typedef {import('../preview-support/PreviewSupport').default} PreviewSupport\r\n   * @typedef {import('../../draw/Styles').default} Styles\r\n   */\r\n\r\n  var LOW_PRIORITY$i = 750;\r\n\r\n  /**\r\n   * @param {Canvas} canvas\r\n   * @param {EventBus} eventBus\r\n   * @param {GraphicsFactory} graphicsFactory\r\n   * @param {PreviewSupport} previewSupport\r\n   * @param {Styles} styles\r\n   */\r\n  function CreatePreview(\r\n      canvas,\r\n      eventBus,\r\n      graphicsFactory,\r\n      previewSupport,\r\n      styles\r\n  ) {\r\n    function createDragGroup(elements) {\r\n      var dragGroup = create$1('g');\r\n\r\n      attr(dragGroup, styles.cls('djs-drag-group', [ 'no-events' ]));\r\n\r\n      var childrenGfx = create$1('g');\r\n\r\n      elements.forEach(function(element) {\r\n\r\n        // create graphics\r\n        var gfx;\r\n\r\n        if (element.hidden) {\r\n          return;\r\n        }\r\n\r\n        if (element.waypoints) {\r\n          gfx = graphicsFactory._createContainer('connection', childrenGfx);\r\n\r\n          graphicsFactory.drawConnection(getVisual(gfx), element);\r\n        } else {\r\n          gfx = graphicsFactory._createContainer('shape', childrenGfx);\r\n\r\n          graphicsFactory.drawShape(getVisual(gfx), element);\r\n\r\n          translate$2(gfx, element.x, element.y);\r\n        }\r\n\r\n        // add preview\r\n        previewSupport.addDragger(element, dragGroup, gfx);\r\n      });\r\n\r\n      return dragGroup;\r\n    }\r\n\r\n    eventBus.on('create.move', LOW_PRIORITY$i, function(event) {\r\n\r\n      var hover = event.hover,\r\n          context = event.context,\r\n          elements = context.elements,\r\n          dragGroup = context.dragGroup;\r\n\r\n      // lazily create previews\r\n      if (!dragGroup) {\r\n        dragGroup = context.dragGroup = createDragGroup(elements);\r\n      }\r\n\r\n      var activeLayer;\r\n\r\n      if (hover) {\r\n        if (!dragGroup.parentNode) {\r\n          activeLayer = canvas.getActiveLayer();\r\n\r\n          append(activeLayer, dragGroup);\r\n        }\r\n\r\n        translate$2(dragGroup, event.x, event.y);\r\n      } else {\r\n        remove$1(dragGroup);\r\n      }\r\n    });\r\n\r\n    eventBus.on('create.cleanup', function(event) {\r\n      var context = event.context,\r\n          dragGroup = context.dragGroup;\r\n\r\n      if (dragGroup) {\r\n        remove$1(dragGroup);\r\n      }\r\n    });\r\n  }\r\n\r\n  CreatePreview.$inject = [\r\n    'canvas',\r\n    'eventBus',\r\n    'graphicsFactory',\r\n    'previewSupport',\r\n    'styles'\r\n  ];\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var CreateModule = {\n    __depends__: [\n      DraggingModule,\n      PreviewSupportModule,\n      RulesModule$1,\n      SelectionModule\n    ],\n    __init__: [\n      'create',\n      'createPreview'\n    ],\n    create: [ 'type', Create ],\n    createPreview: [ 'type', CreatePreview ]\n  };\n\n  /**\n   * A clip board stub\n   */\n  function Clipboard() {}\n\n\n  Clipboard.prototype.get = function() {\n    return this._data;\n  };\n\n  Clipboard.prototype.set = function(data) {\n    this._data = data;\n  };\n\n  Clipboard.prototype.clear = function() {\n    var data = this._data;\n\n    delete this._data;\n\n    return data;\n  };\n\n  Clipboard.prototype.isEmpty = function() {\n    return !this._data;\n  };\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var ClipboardModule = {\n    clipboard: [ 'type', Clipboard ]\n  };\n\n  /**\r\n   * @typedef {import('../../core/EventBus').default} EventBus\r\n   */\r\n\r\n  /**\r\n   * @param {EventBus} eventBus\r\n   */\r\n  function Mouse(eventBus) {\r\n    var self = this;\r\n\r\n    this._lastMoveEvent = null;\r\n\r\n    function setLastMoveEvent(mousemoveEvent) {\r\n      self._lastMoveEvent = mousemoveEvent;\r\n    }\r\n\r\n    eventBus.on('canvas.init', function(context) {\r\n      var svg = self._svg = context.svg;\r\n\r\n      svg.addEventListener('mousemove', setLastMoveEvent);\r\n    });\r\n\r\n    eventBus.on('canvas.destroy', function() {\r\n      self._lastMouseEvent = null;\r\n\r\n      self._svg.removeEventListener('mousemove', setLastMoveEvent);\r\n    });\r\n  }\r\n\r\n  Mouse.$inject = [ 'eventBus' ];\r\n\r\n  Mouse.prototype.getLastMoveEvent = function() {\r\n    return this._lastMoveEvent || createMoveEvent(0, 0);\r\n  };\r\n\r\n  // helpers //////////\r\n\r\n  function createMoveEvent(x, y) {\r\n    var event = document.createEvent('MouseEvent');\r\n\r\n    var screenX = x,\r\n        screenY = y,\r\n        clientX = x,\r\n        clientY = y;\r\n\r\n    if (event.initMouseEvent) {\r\n      event.initMouseEvent(\r\n        'mousemove',\r\n        true,\r\n        true,\r\n        window,\r\n        0,\r\n        screenX,\r\n        screenY,\r\n        clientX,\r\n        clientY,\r\n        false,\r\n        false,\r\n        false,\r\n        false,\r\n        0,\r\n        null\r\n      );\r\n    }\r\n\r\n    return event;\r\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var MouseModule = {\n    __init__: [ 'mouse' ],\n    mouse: [ 'type', Mouse ]\n  };\n\n  /**\n   * @typedef {import('../../core/Types').ElementLike} Element\n   * @typedef {import('../../core/Types').ShapeLike} Shape\n   *\n   * @typedef {import('../../util/Types').Point} Point\n   *\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../clipboard/Clipboard').default} Clipboard\n   * @typedef {import('../create/Create').default} Create\n   * @typedef {import('../../core/ElementFactory').default} ElementFactory\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   * @typedef {import('../mouse/Mouse').default} Mouse\n   * @typedef {import('../rules/Rules').default} Rules\n   */\n\n  /**\n   * @typedef { (event: { elements: Element[] }) => Element[]|boolean } CopyPasteCanCopyElementsListener\n   */\n\n  /**\n   * @typedef { (event: { descriptor: any, element: Element, elements: Element[] }) => void } CopyPasteCopyElementListener\n   */\n\n  /**\n   * @typedef { (event: { element: Element, children: Element[] }) => void } CopyPasteCreateTreeListener\n   */\n\n  /**\n   * @typedef { (event: { elements: any, tree: any }) => void } CopyPasteElementsCopiedListener\n   */\n\n  /**\n   * @typedef { (event: { cache: any, descriptor: any }) => void } CopyPastePasteElementListener\n   */\n\n  /**\n   * @typedef { (event: { hints: any }) => void } CopyPastePasteElementsListener\n   */\n\n  /**\n   * Copy and paste elements.\n   *\n   * @param {Canvas} canvas\n   * @param {Create} create\n   * @param {Clipboard} clipboard\n   * @param {ElementFactory} elementFactory\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   * @param {Mouse} mouse\n   * @param {Rules} rules\n   */\n  function CopyPaste(\n      canvas,\n      create,\n      clipboard,\n      elementFactory,\n      eventBus,\n      modeling,\n      mouse,\n      rules\n  ) {\n\n    this._canvas = canvas;\n    this._create = create;\n    this._clipboard = clipboard;\n    this._elementFactory = elementFactory;\n    this._eventBus = eventBus;\n    this._modeling = modeling;\n    this._mouse = mouse;\n    this._rules = rules;\n\n    eventBus.on('copyPaste.copyElement', function(context) {\n      var descriptor = context.descriptor,\n          element = context.element,\n          elements = context.elements;\n\n      // default priority (priority = 1)\n      descriptor.priority = 1;\n\n      descriptor.id = element.id;\n\n      var parentCopied = find(elements, function(e) {\n        return e === element.parent;\n      });\n\n      // do NOT reference parent if parent wasn't copied\n      if (parentCopied) {\n        descriptor.parent = element.parent.id;\n      }\n\n      // attachers (priority = 2)\n      if (isAttacher$2(element)) {\n        descriptor.priority = 2;\n\n        descriptor.host = element.host.id;\n      }\n\n      // connections (priority = 3)\n      if (isConnection(element)) {\n        descriptor.priority = 3;\n\n        descriptor.source = element.source.id;\n        descriptor.target = element.target.id;\n\n        descriptor.waypoints = copyWaypoints$1(element);\n      }\n\n      // labels (priority = 4)\n      if (isLabel(element)) {\n        descriptor.priority = 4;\n\n        descriptor.labelTarget = element.labelTarget.id;\n      }\n\n      forEach$1([ 'x', 'y', 'width', 'height' ], function(property) {\n        if (isNumber(element[ property ])) {\n          descriptor[ property ] = element[ property ];\n        }\n      });\n\n      descriptor.hidden = element.hidden;\n      descriptor.collapsed = element.collapsed;\n\n    });\n\n    eventBus.on('copyPaste.pasteElements', function(context) {\n      var hints = context.hints;\n\n      assign$1(hints, {\n        createElementsBehavior: false\n      });\n    });\n  }\n\n  CopyPaste.$inject = [\n    'canvas',\n    'create',\n    'clipboard',\n    'elementFactory',\n    'eventBus',\n    'modeling',\n    'mouse',\n    'rules'\n  ];\n\n\n  /**\n   * Copy elements.\n   *\n   * @param {Element[]} elements\n   *\n   * @return {Object}\n   */\n  CopyPaste.prototype.copy = function(elements) {\n    var allowed,\n        tree;\n\n    if (!isArray$3(elements)) {\n      elements = elements ? [ elements ] : [];\n    }\n\n    allowed = this._eventBus.fire('copyPaste.canCopyElements', {\n      elements: elements\n    });\n\n    if (allowed === false) {\n      tree = {};\n    } else {\n      tree = this.createTree(isArray$3(allowed) ? allowed : elements);\n    }\n\n    // we set an empty tree, selection of elements\n    // to copy was empty.\n    this._clipboard.set(tree);\n\n    this._eventBus.fire('copyPaste.elementsCopied', {\n      elements: elements,\n      tree: tree\n    });\n\n    return tree;\n  };\n\n  /**\n   * Paste elements.\n   *\n   * @param {Object} [context]\n   * @param {Shape} [context.element] The optional parent.\n   * @param {Point} [context.point] The optional osition.\n   * @param {Object} [context.hints] The optional hints.\n   */\n  CopyPaste.prototype.paste = function(context) {\n    var tree = this._clipboard.get();\n\n    if (this._clipboard.isEmpty()) {\n      return;\n    }\n\n    var hints = context && context.hints || {};\n\n    this._eventBus.fire('copyPaste.pasteElements', {\n      hints: hints\n    });\n\n    var elements = this._createElements(tree);\n\n    // paste directly\n    if (context && context.element && context.point) {\n      return this._paste(elements, context.element, context.point, hints);\n    }\n\n    this._create.start(this._mouse.getLastMoveEvent(), elements, {\n      hints: hints || {}\n    });\n  };\n\n  /**\n   * Paste elements directly.\n   *\n   * @param {Element[]} elements\n   * @param {Shape} target\n   * @param {Point} position\n   * @param {Object} [hints]\n   */\n  CopyPaste.prototype._paste = function(elements, target, position, hints) {\n\n    // make sure each element has x and y\n    forEach$1(elements, function(element) {\n      if (!isNumber(element.x)) {\n        element.x = 0;\n      }\n\n      if (!isNumber(element.y)) {\n        element.y = 0;\n      }\n    });\n\n    var bbox = getBBox(elements);\n\n    // center elements around cursor\n    forEach$1(elements, function(element) {\n      if (isConnection(element)) {\n        element.waypoints = map$1(element.waypoints, function(waypoint) {\n          return {\n            x: waypoint.x - bbox.x - bbox.width / 2,\n            y: waypoint.y - bbox.y - bbox.height / 2\n          };\n        });\n      }\n\n      assign$1(element, {\n        x: element.x - bbox.x - bbox.width / 2,\n        y: element.y - bbox.y - bbox.height / 2\n      });\n    });\n\n    return this._modeling.createElements(elements, position, target, assign$1({}, hints));\n  };\n\n  /**\n   * Create elements from tree.\n   */\n  CopyPaste.prototype._createElements = function(tree) {\n    var self = this;\n\n    var eventBus = this._eventBus;\n\n    var cache = {};\n\n    var elements = [];\n\n    forEach$1(tree, function(branch, depth) {\n\n      // sort by priority\n      branch = sortBy(branch, 'priority');\n\n      forEach$1(branch, function(descriptor) {\n\n        // remove priority\n        var attrs = assign$1({}, omit(descriptor, [ 'priority' ]));\n\n        if (cache[ descriptor.parent ]) {\n          attrs.parent = cache[ descriptor.parent ];\n        } else {\n          delete attrs.parent;\n        }\n\n        eventBus.fire('copyPaste.pasteElement', {\n          cache: cache,\n          descriptor: attrs\n        });\n\n        var element;\n\n        if (isConnection(attrs)) {\n          attrs.source = cache[ descriptor.source ];\n          attrs.target = cache[ descriptor.target ];\n\n          element = cache[ descriptor.id ] = self.createConnection(attrs);\n\n          elements.push(element);\n\n          return;\n        }\n\n        if (isLabel(attrs)) {\n          attrs.labelTarget = cache[ attrs.labelTarget ];\n\n          element = cache[ descriptor.id ] = self.createLabel(attrs);\n\n          elements.push(element);\n\n          return;\n        }\n\n        if (attrs.host) {\n          attrs.host = cache[ attrs.host ];\n        }\n\n        element = cache[ descriptor.id ] = self.createShape(attrs);\n\n        elements.push(element);\n      });\n\n    });\n\n    return elements;\n  };\n\n  CopyPaste.prototype.createConnection = function(attrs) {\n    var connection = this._elementFactory.createConnection(omit(attrs, [ 'id' ]));\n\n    return connection;\n  };\n\n  CopyPaste.prototype.createLabel = function(attrs) {\n    var label = this._elementFactory.createLabel(omit(attrs, [ 'id' ]));\n\n    return label;\n  };\n\n  CopyPaste.prototype.createShape = function(attrs) {\n    var shape = this._elementFactory.createShape(omit(attrs, [ 'id' ]));\n\n    return shape;\n  };\n\n  /**\n   * Check wether element has relations to other elements e.g. attachers, labels and connections.\n   *\n   * @param {Object} element\n   * @param {Element[]} elements\n   *\n   * @return {boolean}\n   */\n  CopyPaste.prototype.hasRelations = function(element, elements) {\n    var labelTarget,\n        source,\n        target;\n\n    if (isConnection(element)) {\n      source = find(elements, matchPattern({ id: element.source.id }));\n      target = find(elements, matchPattern({ id: element.target.id }));\n\n      if (!source || !target) {\n        return false;\n      }\n    }\n\n    if (isLabel(element)) {\n      labelTarget = find(elements, matchPattern({ id: element.labelTarget.id }));\n\n      if (!labelTarget) {\n        return false;\n      }\n    }\n\n    return true;\n  };\n\n  /**\n   * Create a tree-like structure from elements.\n   *\n   * @example\n   *\n   * ```javascript\n   * tree: {\n   *  0: [\n   *    { id: 'Shape_1', priority: 1, ... },\n   *    { id: 'Shape_2', priority: 1, ... },\n   *    { id: 'Connection_1', source: 'Shape_1', target: 'Shape_2', priority: 3, ... },\n   *    ...\n   *  ],\n   *  1: [\n   *    { id: 'Shape_3', parent: 'Shape1', priority: 1, ... },\n   *    ...\n   *  ]\n   * };\n   * ```\n   *\n   * @param {Element[]} elements\n   *\n   * @return {Object}\n   */\n  CopyPaste.prototype.createTree = function(elements) {\n    var rules = this._rules,\n        self = this;\n\n    var tree = {},\n        elementsData = [];\n\n    var parents = getParents$1(elements);\n\n    function canCopy(element, elements) {\n      return rules.allowed('element.copy', {\n        element: element,\n        elements: elements\n      });\n    }\n\n    function addElementData(element, depth) {\n\n      // (1) check wether element has already been added\n      var foundElementData = find(elementsData, function(elementsData) {\n        return element === elementsData.element;\n      });\n\n      // (2) add element if not already added\n      if (!foundElementData) {\n        elementsData.push({\n          element: element,\n          depth: depth\n        });\n\n        return;\n      }\n\n      // (3) update depth\n      if (foundElementData.depth < depth) {\n        elementsData = removeElementData(foundElementData, elementsData);\n\n        elementsData.push({\n          element: foundElementData.element,\n          depth: depth\n        });\n      }\n    }\n\n    function removeElementData(elementData, elementsData) {\n      var index = elementsData.indexOf(elementData);\n\n      if (index !== -1) {\n        elementsData.splice(index, 1);\n      }\n\n      return elementsData;\n    }\n\n    // (1) add elements\n    eachElement(parents, function(element, _index, depth) {\n\n      // do NOT add external labels directly\n      if (isLabel(element)) {\n        return;\n      }\n\n      // always copy external labels\n      forEach$1(element.labels, function(label) {\n        addElementData(label, depth);\n      });\n\n      function addRelatedElements(elements) {\n        elements && elements.length && forEach$1(elements, function(element) {\n\n          // add external labels\n          forEach$1(element.labels, function(label) {\n            addElementData(label, depth);\n          });\n\n          addElementData(element, depth);\n        });\n      }\n\n      forEach$1([ element.attachers, element.incoming, element.outgoing ], addRelatedElements);\n\n      addElementData(element, depth);\n\n      var children = [];\n\n      if (element.children) {\n        children = element.children.slice();\n      }\n\n      // allow others to add children to tree\n      self._eventBus.fire('copyPaste.createTree', {\n        element: element,\n        children: children\n      });\n\n      return children;\n    });\n\n    elements = map$1(elementsData, function(elementData) {\n      return elementData.element;\n    });\n\n    // (2) copy elements\n    elementsData = map$1(elementsData, function(elementData) {\n      elementData.descriptor = {};\n\n      self._eventBus.fire('copyPaste.copyElement', {\n        descriptor: elementData.descriptor,\n        element: elementData.element,\n        elements: elements\n      });\n\n      return elementData;\n    });\n\n    // (3) sort elements by priority\n    elementsData = sortBy(elementsData, function(elementData) {\n      return elementData.descriptor.priority;\n    });\n\n    elements = map$1(elementsData, function(elementData) {\n      return elementData.element;\n    });\n\n    // (4) create tree\n    forEach$1(elementsData, function(elementData) {\n      var depth = elementData.depth;\n\n      if (!self.hasRelations(elementData.element, elements)) {\n        removeElement(elementData.element, elements);\n\n        return;\n      }\n\n      if (!canCopy(elementData.element, elements)) {\n        removeElement(elementData.element, elements);\n\n        return;\n      }\n\n      if (!tree[depth]) {\n        tree[depth] = [];\n      }\n\n      tree[depth].push(elementData.descriptor);\n    });\n\n    return tree;\n  };\n\n  // helpers //////////\n\n  function isAttacher$2(element) {\n    return !!element.host;\n  }\n\n  function copyWaypoints$1(element) {\n    return map$1(element.waypoints, function(waypoint) {\n\n      waypoint = copyWaypoint$1(waypoint);\n\n      if (waypoint.original) {\n        waypoint.original = copyWaypoint$1(waypoint.original);\n      }\n\n      return waypoint;\n    });\n  }\n\n  function copyWaypoint$1(waypoint) {\n    return assign$1({}, waypoint);\n  }\n\n  function removeElement(element, elements) {\n    var index = elements.indexOf(element);\n\n    if (index === -1) {\n      return elements;\n    }\n\n    return elements.splice(index, 1);\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var CopyPasteModule$1 = {\n    __depends__: [\n      ClipboardModule,\n      CreateModule,\n      MouseModule,\n      RulesModule$1\n    ],\n    __init__: [ 'copyPaste' ],\n    copyPaste: [ 'type', CopyPaste ]\n  };\n\n  /**\n   * @typedef {import('../modeling/BpmnFactory').default} BpmnFactory\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('./ModdleCopy').default} ModdleCopy\n   */\n\n  function copyProperties$1(source, target, properties) {\n    if (!isArray$3(properties)) {\n      properties = [ properties ];\n    }\n\n    forEach$1(properties, function(property) {\n      if (!isUndefined$2(source[property])) {\n        target[property] = source[property];\n      }\n    });\n  }\n\n  var LOW_PRIORITY$h = 750;\n\n  /**\n   * BPMN-specific copy & paste.\n   *\n   * @param {BpmnFactory} bpmnFactory\n   * @param {EventBus} eventBus\n   * @param {ModdleCopy} moddleCopy\n   */\n  function BpmnCopyPaste(bpmnFactory, eventBus, moddleCopy) {\n\n    function copy(bo, clone) {\n      var targetBo = bpmnFactory.create(bo.$type);\n\n      return moddleCopy.copyElement(bo, targetBo, null, clone);\n    }\n\n    eventBus.on('copyPaste.copyElement', LOW_PRIORITY$h, function(context) {\n      var descriptor = context.descriptor,\n          element = context.element,\n          businessObject = getBusinessObject(element);\n\n      // do not copy business object + di for labels;\n      // will be pulled from the referenced label target\n      if (isLabel(element)) {\n        return descriptor;\n      }\n\n      var businessObjectCopy = descriptor.businessObject = copy(businessObject, true);\n      var diCopy = descriptor.di = copy(getDi(element), true);\n      diCopy.bpmnElement = businessObjectCopy;\n\n      copyProperties$1(businessObjectCopy, descriptor, 'name');\n      copyProperties$1(diCopy, descriptor, 'isExpanded');\n\n      // default sequence flow\n      if (businessObject.default) {\n        descriptor.default = businessObject.default.id;\n      }\n    });\n\n    var referencesKey = '-bpmn-js-refs';\n\n    function getReferences(cache) {\n      return (cache[referencesKey] = cache[referencesKey] || {});\n    }\n\n    function setReferences(cache, references) {\n      cache[referencesKey] = references;\n    }\n\n    function resolveReferences(descriptor, cache, references) {\n      var businessObject = getBusinessObject(descriptor);\n\n      // default sequence flows\n      if (descriptor.default) {\n\n        // relationship cannot be resolved immediately\n        references[ descriptor.default ] = {\n          element: businessObject,\n          property: 'default'\n        };\n      }\n\n      // boundary events\n      if (descriptor.host) {\n\n        // relationship can be resolved immediately\n        getBusinessObject(descriptor).attachedToRef = getBusinessObject(cache[ descriptor.host ]);\n      }\n\n      return omit(references, reduce(references, function(array, reference, key) {\n        var element = reference.element,\n            property = reference.property;\n\n        if (key === descriptor.id) {\n          element[ property ] = businessObject;\n\n          array.push(descriptor.id);\n        }\n\n        return array;\n      }, []));\n    }\n\n    eventBus.on('copyPaste.pasteElement', function(context) {\n      var cache = context.cache,\n          descriptor = context.descriptor,\n          businessObject = descriptor.businessObject,\n          di = descriptor.di;\n\n      // wire existing di + businessObject for external label\n      if (isLabel(descriptor)) {\n        descriptor.businessObject = getBusinessObject(cache[ descriptor.labelTarget ]);\n        descriptor.di = getDi(cache[ descriptor.labelTarget ]);\n\n        return;\n      }\n\n      businessObject = descriptor.businessObject = copy(businessObject);\n\n      di = descriptor.di = copy(di);\n      di.bpmnElement = businessObject;\n\n      copyProperties$1(descriptor, businessObject, [\n        'isExpanded',\n        'name'\n      ]);\n\n      descriptor.type = businessObject.$type;\n    });\n\n    // copy + paste processRef with participant\n\n    eventBus.on('copyPaste.copyElement', LOW_PRIORITY$h, function(context) {\n      var descriptor = context.descriptor,\n          element = context.element;\n\n      if (!is$1(element, 'bpmn:Participant')) {\n        return;\n      }\n\n      var participantBo = getBusinessObject(element);\n\n      if (participantBo.processRef) {\n        descriptor.processRef = copy(participantBo.processRef, true);\n      }\n    });\n\n    eventBus.on('copyPaste.pasteElement', function(context) {\n      var descriptor = context.descriptor,\n          processRef = descriptor.processRef;\n\n      if (processRef) {\n        descriptor.processRef = copy(processRef);\n      }\n    });\n\n    // resolve references\n\n    eventBus.on('copyPaste.pasteElement', LOW_PRIORITY$h, function(context) {\n      var cache = context.cache,\n          descriptor = context.descriptor;\n\n      // resolve references e.g. default sequence flow\n      setReferences(\n        cache,\n        resolveReferences(descriptor, cache, getReferences(cache))\n      );\n    });\n\n  }\n\n\n  BpmnCopyPaste.$inject = [\n    'bpmnFactory',\n    'eventBus',\n    'moddleCopy'\n  ];\n\n  var DISALLOWED_PROPERTIES = [\n    'artifacts',\n    'dataInputAssociations',\n    'dataOutputAssociations',\n    'default',\n    'flowElements',\n    'lanes',\n    'incoming',\n    'outgoing',\n    'categoryValue'\n  ];\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../modeling/BpmnFactory').default} BpmnFactory\n   * @typedef {import('../../model/Types').Moddle} Moddle\n   *\n   * @typedef {import('../../model/Types').ModdleElement} ModdleElement\n   */\n\n  /**\n   * Utility for copying model properties from source element to target element.\n   *\n   * @param {EventBus} eventBus\n   * @param {BpmnFactory} bpmnFactory\n   * @param {Moddle} moddle\n   */\n  function ModdleCopy(eventBus, bpmnFactory, moddle) {\n    this._bpmnFactory = bpmnFactory;\n    this._eventBus = eventBus;\n    this._moddle = moddle;\n\n    // copy extension elements last\n    eventBus.on('moddleCopy.canCopyProperties', function(context) {\n      var propertyNames = context.propertyNames;\n\n      if (!propertyNames || !propertyNames.length) {\n        return;\n      }\n\n      return sortBy(propertyNames, function(propertyName) {\n        return propertyName === 'extensionElements';\n      });\n    });\n\n    // default check whether property can be copied\n    eventBus.on('moddleCopy.canCopyProperty', function(context) {\n      var parent = context.parent,\n          parentDescriptor = isObject(parent) && parent.$descriptor,\n          propertyName = context.propertyName;\n\n      if (propertyName && DISALLOWED_PROPERTIES.indexOf(propertyName) !== -1) {\n\n        // disallow copying property\n        return false;\n      }\n\n      if (propertyName &&\n        parentDescriptor &&\n        !find(parentDescriptor.properties, matchPattern({ name: propertyName }))) {\n\n        // disallow copying property\n        return false;\n      }\n    });\n\n    // do NOT allow to copy empty extension elements\n    eventBus.on('moddleCopy.canSetCopiedProperty', function(context) {\n      var property = context.property;\n\n      if (is(property, 'bpmn:ExtensionElements') && (!property.values || !property.values.length)) {\n\n        // disallow setting copied property\n        return false;\n      }\n    });\n  }\n\n  ModdleCopy.$inject = [\n    'eventBus',\n    'bpmnFactory',\n    'moddle'\n  ];\n\n  /**\n   * Copy model properties of source element to target element.\n   *\n   * @param {ModdleElement} sourceElement\n   * @param {ModdleElement} targetElement\n   * @param {string[]} [propertyNames]\n   * @param {boolean} [clone=false]\n   *\n   * @return {ModdleElement}\n   */\n  ModdleCopy.prototype.copyElement = function(sourceElement, targetElement, propertyNames, clone = false) {\n    var self = this;\n\n    if (propertyNames && !isArray$3(propertyNames)) {\n      propertyNames = [ propertyNames ];\n    }\n\n    propertyNames = propertyNames || getPropertyNames(sourceElement.$descriptor);\n\n    var canCopyProperties = this._eventBus.fire('moddleCopy.canCopyProperties', {\n      propertyNames: propertyNames,\n      sourceElement: sourceElement,\n      targetElement: targetElement,\n      clone: clone\n    });\n\n    if (canCopyProperties === false) {\n      return targetElement;\n    }\n\n    if (isArray$3(canCopyProperties)) {\n      propertyNames = canCopyProperties;\n    }\n\n    // copy properties\n    forEach$1(propertyNames, function(propertyName) {\n      var sourceProperty;\n\n      if (has$1(sourceElement, propertyName)) {\n        sourceProperty = sourceElement.get(propertyName);\n      }\n\n      var copiedProperty = self.copyProperty(sourceProperty, targetElement, propertyName, clone);\n\n      if (!isDefined(copiedProperty)) {\n        return;\n      }\n\n      var canSetProperty = self._eventBus.fire('moddleCopy.canSetCopiedProperty', {\n        parent: targetElement,\n        property: copiedProperty,\n        propertyName: propertyName\n      });\n\n      if (canSetProperty === false) {\n        return;\n      }\n\n      // TODO(nikku): unclaim old IDs if ID property is copied over\n      // this._moddle.getPropertyDescriptor(parent, propertyName)\n      targetElement.set(propertyName, copiedProperty);\n    });\n\n    return targetElement;\n  };\n\n  /**\n   * Copy model property.\n   *\n   * @param {any} property\n   * @param {ModdleElement} parent\n   * @param {string} propertyName\n   * @param {boolean} [clone=false]\n   *\n   * @return {any}\n   */\n  ModdleCopy.prototype.copyProperty = function(property, parent, propertyName, clone = false) {\n    var self = this;\n\n    // allow others to copy property\n    var copiedProperty = this._eventBus.fire('moddleCopy.canCopyProperty', {\n      parent: parent,\n      property: property,\n      propertyName: propertyName,\n      clone: clone\n    });\n\n    // return if copying is NOT allowed\n    if (copiedProperty === false) {\n      return;\n    }\n\n    if (copiedProperty) {\n      if (isObject(copiedProperty) && copiedProperty.$type && !copiedProperty.$parent) {\n        copiedProperty.$parent = parent;\n      }\n\n      return copiedProperty;\n    }\n\n    var propertyDescriptor = this._moddle.getPropertyDescriptor(parent, propertyName);\n\n    // do NOT copy references\n    if (propertyDescriptor.isReference) {\n      return;\n    }\n\n    // copy id\n    if (propertyDescriptor.isId) {\n      return property && this._copyId(property, parent, clone);\n    }\n\n    // copy arrays\n    if (isArray$3(property)) {\n      return reduce(property, function(childProperties, childProperty) {\n\n        // recursion\n        copiedProperty = self.copyProperty(childProperty, parent, propertyName, clone);\n\n        // copying might NOT be allowed\n        if (copiedProperty) {\n          return childProperties.concat(copiedProperty);\n        }\n\n        return childProperties;\n      }, []);\n    }\n\n    // copy model elements\n    if (isObject(property) && property.$type) {\n      if (this._moddle.getElementDescriptor(property).isGeneric) {\n        return;\n      }\n\n      copiedProperty = self._bpmnFactory.create(property.$type);\n\n      copiedProperty.$parent = parent;\n\n      // recursion\n      copiedProperty = self.copyElement(property, copiedProperty, null, clone);\n\n      return copiedProperty;\n    }\n\n    // copy primitive properties\n    return property;\n  };\n\n  ModdleCopy.prototype._copyId = function(id, element, clone = false) {\n    if (clone) {\n      return id;\n    }\n\n    // disallow if already taken\n    if (this._moddle.ids.assigned(id)) {\n      return;\n    } else {\n\n      this._moddle.ids.claim(id, element);\n      return id;\n    }\n  };\n\n  // helpers //////////\n\n  function getPropertyNames(descriptor, keepDefaultProperties) {\n    return reduce(descriptor.properties, function(properties, property) {\n\n      if (keepDefaultProperties && property.default) {\n        return properties;\n      }\n\n      return properties.concat(property.name);\n    }, []);\n  }\n\n  function is(element, type) {\n    return element && isFunction(element.$instanceOf) && element.$instanceOf(type);\n  }\n\n  var CopyPasteModule = {\n    __depends__: [\n      CopyPasteModule$1\n    ],\n    __init__: [ 'bpmnCopyPaste', 'moddleCopy' ],\n    bpmnCopyPaste: [ 'type', BpmnCopyPaste ],\n    moddleCopy: [ 'type', ModdleCopy ]\n  };\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   *\n   * @typedef {import('../../core/Types').ShapeLike} Shape\n   */\n\n  var round$5 = Math.round;\n\n  /**\n   * Service that allows replacing of elements.\n   *\n   * @param {Modeling} modeling\n   * @param {EventBus} eventBus\n   */\n  function Replace(modeling, eventBus) {\n    this._modeling = modeling;\n    this._eventBus = eventBus;\n  }\n\n  Replace.$inject = [ 'modeling', 'eventBus' ];\n\n  /**\n   * Replace an element.\n   *\n   * @param {Shape} oldElement The element to be replaced.\n   * @param {Object} attrs Containing information about the new element, for\n   * example the new bounds and type.\n   * @param {Object} hints Custom hints that will be attached to the context. It\n   * can be used to inject data that is needed in the command chain. For example\n   * it could be used in eventbus.on('commandStack.shape.replace.postExecute') to\n   * change shape attributes after shape creation.\n   *\n   * @return {Shape}\n   */\n  Replace.prototype.replaceElement = function(oldElement, attrs, hints) {\n\n    if (oldElement.waypoints) {\n\n      // TODO(nikku): we do not replace connections, yet\n      return null;\n    }\n\n    var modeling = this._modeling;\n    var eventBus = this._eventBus;\n\n    eventBus.fire('replace.start', {\n      element: oldElement,\n      attrs,\n      hints\n    });\n\n    var width = attrs.width || oldElement.width,\n        height = attrs.height || oldElement.height,\n        x = attrs.x || oldElement.x,\n        y = attrs.y || oldElement.y,\n        centerX = round$5(x + width / 2),\n        centerY = round$5(y + height / 2);\n\n    // modeling API requires center coordinates,\n    // account for that when handling shape bounds\n\n    var newElement = modeling.replaceShape(\n      oldElement,\n      assign$1(\n        {},\n        attrs,\n        {\n          x: centerX,\n          y: centerY,\n          width: width,\n          height: height\n        }\n      ),\n      hints\n    );\n\n    eventBus.fire('replace.end', {\n      element: oldElement,\n      newElement,\n      hints\n    });\n\n    return newElement;\n  };\n\n  function ReplaceSelectionBehavior(selection, eventBus) {\n\n    eventBus.on('replace.end', 500, function(event) {\n      const {\n        newElement,\n        hints = {}\n      } = event;\n\n      if (hints.select === false) {\n        return;\n      }\n\n      selection.select(newElement);\n    });\n\n  }\n\n  ReplaceSelectionBehavior.$inject = [ 'selection', 'eventBus' ];\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var ReplaceModule$1 = {\n    __init__: [ 'replace', 'replaceSelectionBehavior' ],\n    replaceSelectionBehavior: [ 'type', ReplaceSelectionBehavior ],\n    replace: [ 'type', Replace ]\n  };\n\n  /**\n   * @typedef {import('../modeling/BpmnFactory').default} BpmnFactory\n   * @typedef {import('../modeling/ElementFactory').default} ElementFactory\n   * @typedef {import('../copy-paste/ModdleCopy').default} ModdleCopy\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   * @typedef {import('diagram-js/lib/features/replace/Replace').default} Replace\n   * @typedef {import('diagram-js/lib/features/rules/Rules').default} Rules\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Shape} Shape\n   * @typedef {import('../../model/Types').ModdleElement} ModdleElement\n   *\n   * @typedef { {\n   *   type: string;\n   *   cancelActivity: boolean;\n   *   instantiate: boolean;\n   *   eventGatewayType: string;\n   *   triggeredByEvent: boolean;\n   *   isInterrupting: boolean;\n   *   collapsed: boolean;\n   *   isExpanded: boolean;\n   *   eventDefinitionType: string;\n   *   eventDefinitionAttrs: Object;\n   *   host: Shape;\n   * } } TargetElement\n   *\n   * @typedef { {\n   *   moveChildren: boolean;\n   * } & Record<string, any> } Hints\n   */\n\n  function copyProperties(source, target, properties) {\n    if (!isArray$3(properties)) {\n      properties = [ properties ];\n    }\n\n    forEach$1(properties, function(property) {\n      if (!isUndefined$2(source[property])) {\n        target[property] = source[property];\n      }\n    });\n  }\n\n\n  var CUSTOM_PROPERTIES = [\n    'cancelActivity',\n    'instantiate',\n    'eventGatewayType',\n    'triggeredByEvent',\n    'isInterrupting'\n  ];\n\n  /**\n   * Check if element should be collapsed or expanded.\n   */\n  function shouldToggleCollapsed(element, targetElement) {\n\n    var oldCollapsed = (\n      element && has$1(element, 'collapsed') ? element.collapsed : !isExpanded(element)\n    );\n\n    var targetCollapsed;\n\n    if (targetElement && (has$1(targetElement, 'collapsed') || has$1(targetElement, 'isExpanded'))) {\n\n      // property is explicitly set so use it\n      targetCollapsed = (\n        has$1(targetElement, 'collapsed') ? targetElement.collapsed : !targetElement.isExpanded\n      );\n    } else {\n\n      // keep old state\n      targetCollapsed = oldCollapsed;\n    }\n\n    if (oldCollapsed !== targetCollapsed) {\n      return true;\n    }\n\n    return false;\n  }\n\n\n  /**\n   * BPMN-specific replace.\n   *\n   * @param {BpmnFactory} bpmnFactory\n   * @param {ElementFactory} elementFactory\n   * @param {ModdleCopy} moddleCopy\n   * @param {Modeling} modeling\n   * @param {Replace} replace\n   * @param {Rules} rules\n   */\n  function BpmnReplace(\n      bpmnFactory,\n      elementFactory,\n      moddleCopy,\n      modeling,\n      replace,\n      rules\n  ) {\n\n    /**\n     * Prepares a new business object for the replacement element\n     * and triggers the replace operation.\n     *\n     * @param  {Element} element\n     * @param  {TargetElement} targetElement\n     * @param  {Hints} [hints]\n     *\n     * @return {Element}\n     */\n    function replaceElement(element, targetElement, hints) {\n\n      hints = hints || {};\n\n      var type = targetElement.type,\n          oldBusinessObject = element.businessObject;\n\n      if (isSubProcess(oldBusinessObject) && type === 'bpmn:SubProcess') {\n        if (shouldToggleCollapsed(element, targetElement)) {\n\n          // expanding or collapsing process\n          modeling.toggleCollapse(element);\n\n          return element;\n        }\n      }\n\n      var newBusinessObject = bpmnFactory.create(type);\n\n      var newElement = {\n        type: type,\n        businessObject: newBusinessObject,\n      };\n\n      newElement.di = {};\n\n      // colors will be set to DI\n      copyProperties(element.di, newElement.di, [\n        'fill',\n        'stroke',\n        'background-color',\n        'border-color',\n        'color'\n      ]);\n\n      var elementProps = getPropertyNames(oldBusinessObject.$descriptor),\n          newElementProps = getPropertyNames(newBusinessObject.$descriptor, true),\n          copyProps = intersection(elementProps, newElementProps);\n\n      // initialize special properties defined in target definition\n      assign$1(newBusinessObject, pick(targetElement, CUSTOM_PROPERTIES));\n\n      var properties = filter(copyProps, function(propertyName) {\n\n        // copying event definitions, unless we replace\n        if (propertyName === 'eventDefinitions') {\n          return hasEventDefinition$1(element, targetElement.eventDefinitionType);\n        }\n\n        // retain loop characteristics if the target element\n        // is not an event sub process\n        if (propertyName === 'loopCharacteristics') {\n          return !isEventSubProcess(newBusinessObject);\n        }\n\n        // so the applied properties from 'target' don't get lost\n        if (has$1(newBusinessObject, propertyName)) {\n          return false;\n        }\n\n        if (propertyName === 'processRef' && targetElement.isExpanded === false) {\n          return false;\n        }\n\n        if (propertyName === 'triggeredByEvent') {\n          return false;\n        }\n\n        return true;\n      });\n\n      newBusinessObject = moddleCopy.copyElement(\n        oldBusinessObject,\n        newBusinessObject,\n        properties\n      );\n\n      // initialize custom BPMN extensions\n      if (targetElement.eventDefinitionType) {\n\n        // only initialize with new eventDefinition\n        // if we did not set an event definition yet,\n        // i.e. because we copied it\n        if (!hasEventDefinition$1(newBusinessObject, targetElement.eventDefinitionType)) {\n          newElement.eventDefinitionType = targetElement.eventDefinitionType;\n          newElement.eventDefinitionAttrs = targetElement.eventDefinitionAttrs;\n        }\n      }\n\n      if (is$1(oldBusinessObject, 'bpmn:Activity')) {\n\n        if (isSubProcess(oldBusinessObject)) {\n\n          // no toggeling, so keep old state\n          newElement.isExpanded = isExpanded(element);\n        }\n\n        // else if property is explicitly set, use it\n        else if (targetElement && has$1(targetElement, 'isExpanded')) {\n          newElement.isExpanded = targetElement.isExpanded;\n\n          // assign default size of new expanded element\n          var defaultSize = elementFactory.getDefaultSize(newBusinessObject, {\n            isExpanded: newElement.isExpanded\n          });\n\n          newElement.width = defaultSize.width;\n          newElement.height = defaultSize.height;\n\n          // keep element centered\n          newElement.x = element.x - (newElement.width - element.width) / 2;\n          newElement.y = element.y - (newElement.height - element.height) / 2;\n        }\n\n        // TODO: need also to respect min/max Size\n        // copy size, from an expanded subprocess to an expanded alternative subprocess\n        // except bpmn:Task, because Task is always expanded\n        if ((isExpanded(element) && !is$1(oldBusinessObject, 'bpmn:Task')) && newElement.isExpanded) {\n          newElement.width = element.width;\n          newElement.height = element.height;\n        }\n      }\n\n      // remove children if not expanding sub process\n      if (isSubProcess(oldBusinessObject) && !isSubProcess(newBusinessObject)) {\n        hints.moveChildren = false;\n      }\n\n      // transform collapsed/expanded pools\n      if (is$1(oldBusinessObject, 'bpmn:Participant')) {\n\n        // create expanded pool\n        if (targetElement.isExpanded === true) {\n          newBusinessObject.processRef = bpmnFactory.create('bpmn:Process');\n        } else {\n\n          // remove children when transforming to collapsed pool\n          hints.moveChildren = false;\n        }\n\n        // apply same width and default height\n        newElement.width = element.width;\n        newElement.height = elementFactory.getDefaultSize(newElement).height;\n      }\n\n      if (!rules.allowed('shape.resize', { shape: newBusinessObject })) {\n        newElement.height = elementFactory.getDefaultSize(newElement).height;\n        newElement.width = elementFactory.getDefaultSize(newElement).width;\n      }\n\n      newBusinessObject.name = oldBusinessObject.name;\n\n      // retain default flow's reference between inclusive <-> exclusive gateways and activities\n      if (\n        isAny(oldBusinessObject, [\n          'bpmn:ExclusiveGateway',\n          'bpmn:InclusiveGateway',\n          'bpmn:Activity'\n        ]) &&\n        isAny(newBusinessObject, [\n          'bpmn:ExclusiveGateway',\n          'bpmn:InclusiveGateway',\n          'bpmn:Activity'\n        ])\n      ) {\n        newBusinessObject.default = oldBusinessObject.default;\n      }\n\n      if (\n        targetElement.host &&\n        !is$1(oldBusinessObject, 'bpmn:BoundaryEvent') &&\n        is$1(newBusinessObject, 'bpmn:BoundaryEvent')\n      ) {\n        newElement.host = targetElement.host;\n      }\n\n      // The DataStoreReference element is 14px wider than the DataObjectReference element\n      // This ensures that they stay centered on the x axis when replaced\n      if (\n        newElement.type === 'bpmn:DataStoreReference' ||\n        newElement.type === 'bpmn:DataObjectReference'\n      ) {\n        newElement.x = element.x + (element.width - newElement.width) / 2;\n      }\n\n      return replace.replaceElement(element, newElement, hints);\n    }\n\n    this.replaceElement = replaceElement;\n  }\n\n  BpmnReplace.$inject = [\n    'bpmnFactory',\n    'elementFactory',\n    'moddleCopy',\n    'modeling',\n    'replace',\n    'rules'\n  ];\n\n  /**\n   * @param {ModdleElement} businessObject\n   *\n   * @return {boolean}\n   */\n  function isSubProcess(businessObject) {\n    return is$1(businessObject, 'bpmn:SubProcess');\n  }\n\n  /**\n   * @param {Element|ModdleElement} element\n   * @param {string} type\n   *\n   * @return {boolean}\n   */\n  function hasEventDefinition$1(element, type) {\n    var businessObject = getBusinessObject(element);\n\n    return type && businessObject.get('eventDefinitions').some(function(definition) {\n      return is$1(definition, type);\n    });\n  }\n\n  /**\n   * Compute intersection between two arrays.\n   *\n   * @param {Array} a\n   * @param {Array} b\n   *\n   * @return {Array}\n   */\n  function intersection(a, b) {\n    return a.filter(function(item) {\n      return b.includes(item);\n    });\n  }\n\n  var ReplaceModule = {\n    __depends__: [\n      CopyPasteModule,\n      ReplaceModule$1,\n      SelectionModule\n    ],\n    bpmnReplace: [ 'type', BpmnReplace ]\n  };\n\n  /**\n   * @typedef {import('../../../model/Types').Element} Element\n   * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenu').PopupMenuTarget} PopupMenuTarget\n   *\n   * @typedef {(entry: PopupMenuTarget) => boolean} DifferentTypeValidator\n   */\n\n  /**\n   * Returns true, if an element is from a different type\n   * than a target definition. Takes into account the type,\n   * event definition type and triggeredByEvent property.\n   *\n   * @param {Element} element\n   *\n   * @return {DifferentTypeValidator}\n   */\n  function isDifferentType(element) {\n\n    return function(entry) {\n      var target = entry.target;\n\n      var businessObject = getBusinessObject(element),\n          eventDefinition = businessObject.eventDefinitions && businessObject.eventDefinitions[0];\n\n      var isTypeEqual = businessObject.$type === target.type;\n\n      var isEventDefinitionEqual = (\n        (eventDefinition && eventDefinition.$type) === target.eventDefinitionType\n      );\n\n      var isTriggeredByEventEqual = (\n\n        // coherse to <false>\n        !!target.triggeredByEvent === !!businessObject.triggeredByEvent\n      );\n\n      var isExpandedEqual = (\n        target.isExpanded === undefined ||\n        target.isExpanded === isExpanded(element)\n      );\n\n      return !isTypeEqual || !isEventDefinitionEqual || !isTriggeredByEventEqual || !isExpandedEqual;\n    };\n  }\n\n  /**\n   * @typedef { () => string } LabelGetter\n   *\n   * @typedef { {\n   *   label: string | LabelGetter;\n   *   actionName: string;\n   *   className: string;\n   *   target?: {\n   *     type: string;\n   *     isExpanded?: boolean;\n   *     isInterrupting?: boolean;\n   *     triggeredByEvent?: boolean;\n   *     cancelActivity?: boolean;\n   *     eventDefinitionType?: string;\n   *     eventDefinitionAttrs?: Record<string, any>\n   *   };\n   * } } ReplaceOption\n   */\n\n  /**\n   * @type {ReplaceOption[]}\n   */\n  var START_EVENT = [\n    {\n      label: 'Start Event',\n      actionName: 'replace-with-none-start',\n      className: 'bpmn-icon-start-event-none',\n      target: {\n        type: 'bpmn:StartEvent'\n      }\n    },\n    {\n      label: 'Intermediate Throw Event',\n      actionName: 'replace-with-none-intermediate-throwing',\n      className: 'bpmn-icon-intermediate-event-none',\n      target: {\n        type: 'bpmn:IntermediateThrowEvent'\n      }\n    },\n    {\n      label: 'End Event',\n      actionName: 'replace-with-none-end',\n      className: 'bpmn-icon-end-event-none',\n      target: {\n        type: 'bpmn:EndEvent'\n      }\n    },\n    {\n      label: 'Message Start Event',\n      actionName: 'replace-with-message-start',\n      className: 'bpmn-icon-start-event-message',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:MessageEventDefinition'\n      }\n    },\n    {\n      label: 'Timer Start Event',\n      actionName: 'replace-with-timer-start',\n      className: 'bpmn-icon-start-event-timer',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:TimerEventDefinition'\n      }\n    },\n    {\n      label: 'Conditional Start Event',\n      actionName: 'replace-with-conditional-start',\n      className: 'bpmn-icon-start-event-condition',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:ConditionalEventDefinition'\n      }\n    },\n    {\n      label: 'Signal Start Event',\n      actionName: 'replace-with-signal-start',\n      className: 'bpmn-icon-start-event-signal',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:SignalEventDefinition'\n      }\n    }\n  ];\n\n  /**\n   * @type {ReplaceOption[]}\n   */\n  var START_EVENT_SUB_PROCESS = [\n    {\n      label: 'Start Event',\n      actionName: 'replace-with-none-start',\n      className: 'bpmn-icon-start-event-none',\n      target: {\n        type: 'bpmn:StartEvent'\n      }\n    },\n    {\n      label: 'Intermediate Throw Event',\n      actionName: 'replace-with-none-intermediate-throwing',\n      className: 'bpmn-icon-intermediate-event-none',\n      target: {\n        type: 'bpmn:IntermediateThrowEvent'\n      }\n    },\n    {\n      label: 'End Event',\n      actionName: 'replace-with-none-end',\n      className: 'bpmn-icon-end-event-none',\n      target: {\n        type: 'bpmn:EndEvent'\n      }\n    }\n  ];\n\n  /**\n   * @type {ReplaceOption[]}\n   */\n  var INTERMEDIATE_EVENT = [\n    {\n      label: 'Start Event',\n      actionName: 'replace-with-none-start',\n      className: 'bpmn-icon-start-event-none',\n      target: {\n        type: 'bpmn:StartEvent'\n      }\n    },\n    {\n      label: 'Intermediate Throw Event',\n      actionName: 'replace-with-none-intermediate-throw',\n      className: 'bpmn-icon-intermediate-event-none',\n      target: {\n        type: 'bpmn:IntermediateThrowEvent'\n      }\n    },\n    {\n      label: 'End Event',\n      actionName: 'replace-with-none-end',\n      className: 'bpmn-icon-end-event-none',\n      target: {\n        type: 'bpmn:EndEvent'\n      }\n    },\n    {\n      label: 'Message Intermediate Catch Event',\n      actionName: 'replace-with-message-intermediate-catch',\n      className: 'bpmn-icon-intermediate-event-catch-message',\n      target: {\n        type: 'bpmn:IntermediateCatchEvent',\n        eventDefinitionType: 'bpmn:MessageEventDefinition'\n      }\n    },\n    {\n      label: 'Message Intermediate Throw Event',\n      actionName: 'replace-with-message-intermediate-throw',\n      className: 'bpmn-icon-intermediate-event-throw-message',\n      target: {\n        type: 'bpmn:IntermediateThrowEvent',\n        eventDefinitionType: 'bpmn:MessageEventDefinition'\n      }\n    },\n    {\n      label: 'Timer Intermediate Catch Event',\n      actionName: 'replace-with-timer-intermediate-catch',\n      className: 'bpmn-icon-intermediate-event-catch-timer',\n      target: {\n        type: 'bpmn:IntermediateCatchEvent',\n        eventDefinitionType: 'bpmn:TimerEventDefinition'\n      }\n    },\n    {\n      label: 'Escalation Intermediate Throw Event',\n      actionName: 'replace-with-escalation-intermediate-throw',\n      className: 'bpmn-icon-intermediate-event-throw-escalation',\n      target: {\n        type: 'bpmn:IntermediateThrowEvent',\n        eventDefinitionType: 'bpmn:EscalationEventDefinition'\n      }\n    },\n    {\n      label: 'Conditional Intermediate Catch Event',\n      actionName: 'replace-with-conditional-intermediate-catch',\n      className: 'bpmn-icon-intermediate-event-catch-condition',\n      target: {\n        type: 'bpmn:IntermediateCatchEvent',\n        eventDefinitionType: 'bpmn:ConditionalEventDefinition'\n      }\n    },\n    {\n      label: 'Link Intermediate Catch Event',\n      actionName: 'replace-with-link-intermediate-catch',\n      className: 'bpmn-icon-intermediate-event-catch-link',\n      target: {\n        type: 'bpmn:IntermediateCatchEvent',\n        eventDefinitionType: 'bpmn:LinkEventDefinition',\n        eventDefinitionAttrs: {\n          name: ''\n        }\n      }\n    },\n    {\n      label: 'Link Intermediate Throw Event',\n      actionName: 'replace-with-link-intermediate-throw',\n      className: 'bpmn-icon-intermediate-event-throw-link',\n      target: {\n        type: 'bpmn:IntermediateThrowEvent',\n        eventDefinitionType: 'bpmn:LinkEventDefinition',\n        eventDefinitionAttrs: {\n          name: ''\n        }\n      }\n    },\n    {\n      label: 'Compensation Intermediate Throw Event',\n      actionName: 'replace-with-compensation-intermediate-throw',\n      className: 'bpmn-icon-intermediate-event-throw-compensation',\n      target: {\n        type: 'bpmn:IntermediateThrowEvent',\n        eventDefinitionType: 'bpmn:CompensateEventDefinition'\n      }\n    },\n    {\n      label: 'Signal Intermediate Catch Event',\n      actionName: 'replace-with-signal-intermediate-catch',\n      className: 'bpmn-icon-intermediate-event-catch-signal',\n      target: {\n        type: 'bpmn:IntermediateCatchEvent',\n        eventDefinitionType: 'bpmn:SignalEventDefinition'\n      }\n    },\n    {\n      label: 'Signal Intermediate Throw Event',\n      actionName: 'replace-with-signal-intermediate-throw',\n      className: 'bpmn-icon-intermediate-event-throw-signal',\n      target: {\n        type: 'bpmn:IntermediateThrowEvent',\n        eventDefinitionType: 'bpmn:SignalEventDefinition'\n      }\n    }\n  ];\n\n  /**\n   * @type {ReplaceOption[]}\n   */\n  var END_EVENT = [\n    {\n      label: 'Start Event',\n      actionName: 'replace-with-none-start',\n      className: 'bpmn-icon-start-event-none',\n      target: {\n        type: 'bpmn:StartEvent'\n      }\n    },\n    {\n      label: 'Intermediate Throw Event',\n      actionName: 'replace-with-none-intermediate-throw',\n      className: 'bpmn-icon-intermediate-event-none',\n      target: {\n        type: 'bpmn:IntermediateThrowEvent'\n      }\n    },\n    {\n      label: 'End Event',\n      actionName: 'replace-with-none-end',\n      className: 'bpmn-icon-end-event-none',\n      target: {\n        type: 'bpmn:EndEvent'\n      }\n    },\n    {\n      label: 'Message End Event',\n      actionName: 'replace-with-message-end',\n      className: 'bpmn-icon-end-event-message',\n      target: {\n        type: 'bpmn:EndEvent',\n        eventDefinitionType: 'bpmn:MessageEventDefinition'\n      }\n    },\n    {\n      label: 'Escalation End Event',\n      actionName: 'replace-with-escalation-end',\n      className: 'bpmn-icon-end-event-escalation',\n      target: {\n        type: 'bpmn:EndEvent',\n        eventDefinitionType: 'bpmn:EscalationEventDefinition'\n      }\n    },\n    {\n      label: 'Error End Event',\n      actionName: 'replace-with-error-end',\n      className: 'bpmn-icon-end-event-error',\n      target: {\n        type: 'bpmn:EndEvent',\n        eventDefinitionType: 'bpmn:ErrorEventDefinition'\n      }\n    },\n    {\n      label: 'Cancel End Event',\n      actionName: 'replace-with-cancel-end',\n      className: 'bpmn-icon-end-event-cancel',\n      target: {\n        type: 'bpmn:EndEvent',\n        eventDefinitionType: 'bpmn:CancelEventDefinition'\n      }\n    },\n    {\n      label: 'Compensation End Event',\n      actionName: 'replace-with-compensation-end',\n      className: 'bpmn-icon-end-event-compensation',\n      target: {\n        type: 'bpmn:EndEvent',\n        eventDefinitionType: 'bpmn:CompensateEventDefinition'\n      }\n    },\n    {\n      label: 'Signal End Event',\n      actionName: 'replace-with-signal-end',\n      className: 'bpmn-icon-end-event-signal',\n      target: {\n        type: 'bpmn:EndEvent',\n        eventDefinitionType: 'bpmn:SignalEventDefinition'\n      }\n    },\n    {\n      label: 'Terminate End Event',\n      actionName: 'replace-with-terminate-end',\n      className: 'bpmn-icon-end-event-terminate',\n      target: {\n        type: 'bpmn:EndEvent',\n        eventDefinitionType: 'bpmn:TerminateEventDefinition'\n      }\n    }\n  ];\n\n  /**\n   * @type {ReplaceOption[]}\n   */\n  var GATEWAY = [\n    {\n      label: 'Exclusive Gateway',\n      actionName: 'replace-with-exclusive-gateway',\n      className: 'bpmn-icon-gateway-xor',\n      target: {\n        type: 'bpmn:ExclusiveGateway'\n      }\n    },\n    {\n      label: 'Parallel Gateway',\n      actionName: 'replace-with-parallel-gateway',\n      className: 'bpmn-icon-gateway-parallel',\n      target: {\n        type: 'bpmn:ParallelGateway'\n      }\n    },\n    {\n      label: 'Inclusive Gateway',\n      actionName: 'replace-with-inclusive-gateway',\n      className: 'bpmn-icon-gateway-or',\n      target: {\n        type: 'bpmn:InclusiveGateway'\n      }\n    },\n    {\n      label: 'Complex Gateway',\n      actionName: 'replace-with-complex-gateway',\n      className: 'bpmn-icon-gateway-complex',\n      target: {\n        type: 'bpmn:ComplexGateway'\n      }\n    },\n    {\n      label: 'Event based Gateway',\n      actionName: 'replace-with-event-based-gateway',\n      className: 'bpmn-icon-gateway-eventbased',\n      target: {\n        type: 'bpmn:EventBasedGateway',\n        instantiate: false,\n        eventGatewayType: 'Exclusive'\n      }\n    }\n\n    // Gateways deactivated until https://github.com/bpmn-io/bpmn-js/issues/194\n    // {\n    //   label: 'Event based instantiating Gateway',\n    //   actionName: 'replace-with-exclusive-event-based-gateway',\n    //   className: 'bpmn-icon-exclusive-event-based',\n    //   target: {\n    //     type: 'bpmn:EventBasedGateway'\n    //   },\n    //   options: {\n    //     businessObject: { instantiate: true, eventGatewayType: 'Exclusive' }\n    //   }\n    // },\n    // {\n    //   label: 'Parallel Event based instantiating Gateway',\n    //   actionName: 'replace-with-parallel-event-based-instantiate-gateway',\n    //   className: 'bpmn-icon-parallel-event-based-instantiate-gateway',\n    //   target: {\n    //     type: 'bpmn:EventBasedGateway'\n    //   },\n    //   options: {\n    //     businessObject: { instantiate: true, eventGatewayType: 'Parallel' }\n    //   }\n    // }\n  ];\n\n  /**\n   * @type {ReplaceOption[]}\n   */\n  var SUBPROCESS_EXPANDED = [\n    {\n      label: 'Transaction',\n      actionName: 'replace-with-transaction',\n      className: 'bpmn-icon-transaction',\n      target: {\n        type: 'bpmn:Transaction',\n        isExpanded: true\n      }\n    },\n    {\n      label: 'Event Sub Process',\n      actionName: 'replace-with-event-subprocess',\n      className: 'bpmn-icon-event-subprocess-expanded',\n      target: {\n        type: 'bpmn:SubProcess',\n        triggeredByEvent: true,\n        isExpanded: true\n      }\n    },\n    {\n      label: 'Sub Process (collapsed)',\n      actionName: 'replace-with-collapsed-subprocess',\n      className: 'bpmn-icon-subprocess-collapsed',\n      target: {\n        type: 'bpmn:SubProcess',\n        isExpanded: false\n      }\n    }\n  ];\n\n  /**\n   * @type {ReplaceOption[]}\n   */\n  var TRANSACTION = [\n    {\n      label: 'Transaction',\n      actionName: 'replace-with-transaction',\n      className: 'bpmn-icon-transaction',\n      target: {\n        type: 'bpmn:Transaction',\n        isExpanded: true\n      }\n    },\n    {\n      label: 'Sub Process',\n      actionName: 'replace-with-subprocess',\n      className: 'bpmn-icon-subprocess-expanded',\n      target: {\n        type: 'bpmn:SubProcess',\n        isExpanded: true\n      }\n    },\n    {\n      label: 'Event Sub Process',\n      actionName: 'replace-with-event-subprocess',\n      className: 'bpmn-icon-event-subprocess-expanded',\n      target: {\n        type: 'bpmn:SubProcess',\n        triggeredByEvent: true,\n        isExpanded: true\n      }\n    }\n  ];\n\n  /**\n   * @type {ReplaceOption[]}\n   */\n  var EVENT_SUB_PROCESS = TRANSACTION;\n\n  /**\n   * @type {ReplaceOption[]}\n   */\n  var TASK = [\n    {\n      label: 'Task',\n      actionName: 'replace-with-task',\n      className: 'bpmn-icon-task',\n      target: {\n        type: 'bpmn:Task'\n      }\n    },\n    {\n      label: 'User Task',\n      actionName: 'replace-with-user-task',\n      className: 'bpmn-icon-user',\n      target: {\n        type: 'bpmn:UserTask'\n      }\n    },\n    {\n      label: 'Service Task',\n      actionName: 'replace-with-service-task',\n      className: 'bpmn-icon-service',\n      target: {\n        type: 'bpmn:ServiceTask'\n      }\n    },\n    {\n      label: 'Send Task',\n      actionName: 'replace-with-send-task',\n      className: 'bpmn-icon-send',\n      target: {\n        type: 'bpmn:SendTask'\n      }\n    },\n    {\n      label: 'Receive Task',\n      actionName: 'replace-with-receive-task',\n      className: 'bpmn-icon-receive',\n      target: {\n        type: 'bpmn:ReceiveTask'\n      }\n    },\n    {\n      label: 'Manual Task',\n      actionName: 'replace-with-manual-task',\n      className: 'bpmn-icon-manual',\n      target: {\n        type: 'bpmn:ManualTask'\n      }\n    },\n    {\n      label: 'Business Rule Task',\n      actionName: 'replace-with-rule-task',\n      className: 'bpmn-icon-business-rule',\n      target: {\n        type: 'bpmn:BusinessRuleTask'\n      }\n    },\n    {\n      label: 'Script Task',\n      actionName: 'replace-with-script-task',\n      className: 'bpmn-icon-script',\n      target: {\n        type: 'bpmn:ScriptTask'\n      }\n    },\n    {\n      label: 'Call Activity',\n      actionName: 'replace-with-call-activity',\n      className: 'bpmn-icon-call-activity',\n      target: {\n        type: 'bpmn:CallActivity'\n      }\n    },\n    {\n      label: 'Sub Process (collapsed)',\n      actionName: 'replace-with-collapsed-subprocess',\n      className: 'bpmn-icon-subprocess-collapsed',\n      target: {\n        type: 'bpmn:SubProcess',\n        isExpanded: false\n      }\n    },\n    {\n      label: 'Sub Process (expanded)',\n      actionName: 'replace-with-expanded-subprocess',\n      className: 'bpmn-icon-subprocess-expanded',\n      target: {\n        type: 'bpmn:SubProcess',\n        isExpanded: true\n      }\n    }\n  ];\n\n  /**\n   * @type {ReplaceOption[]}\n   */\n  var DATA_OBJECT_REFERENCE = [\n    {\n      label: 'Data Store Reference',\n      actionName: 'replace-with-data-store-reference',\n      className: 'bpmn-icon-data-store',\n      target: {\n        type: 'bpmn:DataStoreReference'\n      }\n    }\n  ];\n\n  /**\n   * @type {ReplaceOption[]}\n   */\n  var DATA_STORE_REFERENCE = [\n    {\n      label: 'Data Object Reference',\n      actionName: 'replace-with-data-object-reference',\n      className: 'bpmn-icon-data-object',\n      target: {\n        type: 'bpmn:DataObjectReference'\n      }\n    }\n  ];\n\n  /**\n   * @type {ReplaceOption[]}\n   */\n  var BOUNDARY_EVENT = [\n    {\n      label: 'Message Boundary Event',\n      actionName: 'replace-with-message-boundary',\n      className: 'bpmn-icon-intermediate-event-catch-message',\n      target: {\n        type: 'bpmn:BoundaryEvent',\n        eventDefinitionType: 'bpmn:MessageEventDefinition'\n      }\n    },\n    {\n      label: 'Timer Boundary Event',\n      actionName: 'replace-with-timer-boundary',\n      className: 'bpmn-icon-intermediate-event-catch-timer',\n      target: {\n        type: 'bpmn:BoundaryEvent',\n        eventDefinitionType: 'bpmn:TimerEventDefinition'\n      }\n    },\n    {\n      label: 'Escalation Boundary Event',\n      actionName: 'replace-with-escalation-boundary',\n      className: 'bpmn-icon-intermediate-event-catch-escalation',\n      target: {\n        type: 'bpmn:BoundaryEvent',\n        eventDefinitionType: 'bpmn:EscalationEventDefinition'\n      }\n    },\n    {\n      label: 'Conditional Boundary Event',\n      actionName: 'replace-with-conditional-boundary',\n      className: 'bpmn-icon-intermediate-event-catch-condition',\n      target: {\n        type: 'bpmn:BoundaryEvent',\n        eventDefinitionType: 'bpmn:ConditionalEventDefinition'\n      }\n    },\n    {\n      label: 'Error Boundary Event',\n      actionName: 'replace-with-error-boundary',\n      className: 'bpmn-icon-intermediate-event-catch-error',\n      target: {\n        type: 'bpmn:BoundaryEvent',\n        eventDefinitionType: 'bpmn:ErrorEventDefinition'\n      }\n    },\n    {\n      label: 'Cancel Boundary Event',\n      actionName: 'replace-with-cancel-boundary',\n      className: 'bpmn-icon-intermediate-event-catch-cancel',\n      target: {\n        type: 'bpmn:BoundaryEvent',\n        eventDefinitionType: 'bpmn:CancelEventDefinition'\n      }\n    },\n    {\n      label: 'Signal Boundary Event',\n      actionName: 'replace-with-signal-boundary',\n      className: 'bpmn-icon-intermediate-event-catch-signal',\n      target: {\n        type: 'bpmn:BoundaryEvent',\n        eventDefinitionType: 'bpmn:SignalEventDefinition'\n      }\n    },\n    {\n      label: 'Compensation Boundary Event',\n      actionName: 'replace-with-compensation-boundary',\n      className: 'bpmn-icon-intermediate-event-catch-compensation',\n      target: {\n        type: 'bpmn:BoundaryEvent',\n        eventDefinitionType: 'bpmn:CompensateEventDefinition'\n      }\n    },\n    {\n      label: 'Message Boundary Event (non-interrupting)',\n      actionName: 'replace-with-non-interrupting-message-boundary',\n      className: 'bpmn-icon-intermediate-event-catch-non-interrupting-message',\n      target: {\n        type: 'bpmn:BoundaryEvent',\n        eventDefinitionType: 'bpmn:MessageEventDefinition',\n        cancelActivity: false\n      }\n    },\n    {\n      label: 'Timer Boundary Event (non-interrupting)',\n      actionName: 'replace-with-non-interrupting-timer-boundary',\n      className: 'bpmn-icon-intermediate-event-catch-non-interrupting-timer',\n      target: {\n        type: 'bpmn:BoundaryEvent',\n        eventDefinitionType: 'bpmn:TimerEventDefinition',\n        cancelActivity: false\n      }\n    },\n    {\n      label: 'Escalation Boundary Event (non-interrupting)',\n      actionName: 'replace-with-non-interrupting-escalation-boundary',\n      className: 'bpmn-icon-intermediate-event-catch-non-interrupting-escalation',\n      target: {\n        type: 'bpmn:BoundaryEvent',\n        eventDefinitionType: 'bpmn:EscalationEventDefinition',\n        cancelActivity: false\n      }\n    },\n    {\n      label: 'Conditional Boundary Event (non-interrupting)',\n      actionName: 'replace-with-non-interrupting-conditional-boundary',\n      className: 'bpmn-icon-intermediate-event-catch-non-interrupting-condition',\n      target: {\n        type: 'bpmn:BoundaryEvent',\n        eventDefinitionType: 'bpmn:ConditionalEventDefinition',\n        cancelActivity: false\n      }\n    },\n    {\n      label: 'Signal Boundary Event (non-interrupting)',\n      actionName: 'replace-with-non-interrupting-signal-boundary',\n      className: 'bpmn-icon-intermediate-event-catch-non-interrupting-signal',\n      target: {\n        type: 'bpmn:BoundaryEvent',\n        eventDefinitionType: 'bpmn:SignalEventDefinition',\n        cancelActivity: false\n      }\n    }\n  ];\n\n  /**\n   * @type {ReplaceOption[]}\n   */\n  var EVENT_SUB_PROCESS_START_EVENT = [\n    {\n      label: 'Message Start Event',\n      actionName: 'replace-with-message-start',\n      className: 'bpmn-icon-start-event-message',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:MessageEventDefinition'\n      }\n    },\n    {\n      label: 'Timer Start Event',\n      actionName: 'replace-with-timer-start',\n      className: 'bpmn-icon-start-event-timer',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:TimerEventDefinition'\n      }\n    },\n    {\n      label: 'Conditional Start Event',\n      actionName: 'replace-with-conditional-start',\n      className: 'bpmn-icon-start-event-condition',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:ConditionalEventDefinition'\n      }\n    },\n    {\n      label: 'Signal Start Event',\n      actionName: 'replace-with-signal-start',\n      className: 'bpmn-icon-start-event-signal',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:SignalEventDefinition'\n      }\n    },\n    {\n      label: 'Error Start Event',\n      actionName: 'replace-with-error-start',\n      className: 'bpmn-icon-start-event-error',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:ErrorEventDefinition'\n      }\n    },\n    {\n      label: 'Escalation Start Event',\n      actionName: 'replace-with-escalation-start',\n      className: 'bpmn-icon-start-event-escalation',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:EscalationEventDefinition'\n      }\n    },\n    {\n      label: 'Compensation Start Event',\n      actionName: 'replace-with-compensation-start',\n      className: 'bpmn-icon-start-event-compensation',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:CompensateEventDefinition'\n      }\n    },\n    {\n      label: 'Message Start Event (non-interrupting)',\n      actionName: 'replace-with-non-interrupting-message-start',\n      className: 'bpmn-icon-start-event-non-interrupting-message',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:MessageEventDefinition',\n        isInterrupting: false\n      }\n    },\n    {\n      label: 'Timer Start Event (non-interrupting)',\n      actionName: 'replace-with-non-interrupting-timer-start',\n      className: 'bpmn-icon-start-event-non-interrupting-timer',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:TimerEventDefinition',\n        isInterrupting: false\n      }\n    },\n    {\n      label: 'Conditional Start Event (non-interrupting)',\n      actionName: 'replace-with-non-interrupting-conditional-start',\n      className: 'bpmn-icon-start-event-non-interrupting-condition',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:ConditionalEventDefinition',\n        isInterrupting: false\n      }\n    },\n    {\n      label: 'Signal Start Event (non-interrupting)',\n      actionName: 'replace-with-non-interrupting-signal-start',\n      className: 'bpmn-icon-start-event-non-interrupting-signal',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:SignalEventDefinition',\n        isInterrupting: false\n      }\n    },\n    {\n      label: 'Escalation Start Event (non-interrupting)',\n      actionName: 'replace-with-non-interrupting-escalation-start',\n      className: 'bpmn-icon-start-event-non-interrupting-escalation',\n      target: {\n        type: 'bpmn:StartEvent',\n        eventDefinitionType: 'bpmn:EscalationEventDefinition',\n        isInterrupting: false\n      }\n    }\n  ];\n\n  /**\n   * @type {ReplaceOption[]}\n   */\n  var SEQUENCE_FLOW = [\n    {\n      label: 'Sequence Flow',\n      actionName: 'replace-with-sequence-flow',\n      className: 'bpmn-icon-connection'\n    },\n    {\n      label: 'Default Flow',\n      actionName: 'replace-with-default-flow',\n      className: 'bpmn-icon-default-flow'\n    },\n    {\n      label: 'Conditional Flow',\n      actionName: 'replace-with-conditional-flow',\n      className: 'bpmn-icon-conditional-flow'\n    }\n  ];\n\n  /**\n   * @type {ReplaceOption[]}\n   */\n  var PARTICIPANT = [\n    {\n      label: 'Expanded Pool',\n      actionName: 'replace-with-expanded-pool',\n      className: 'bpmn-icon-participant',\n      target: {\n        type: 'bpmn:Participant',\n        isExpanded: true\n      }\n    },\n    {\n      label: function(element) {\n        var label = 'Empty Pool';\n\n        if (element.children && element.children.length) {\n          label += ' (removes content)';\n        }\n\n        return label;\n      },\n      actionName: 'replace-with-collapsed-pool',\n\n      // TODO(@janstuemmel): maybe design new icon\n      className: 'bpmn-icon-lane',\n      target: {\n        type: 'bpmn:Participant',\n        isExpanded: false\n      }\n    }\n  ];\n\n  /**\n   * @typedef {import('../features/BpmnFactory').default} BpmnFactory\n   * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenu').default} PopupMenu\n   * @typedef {import('../features/Modeling').default} Modeling\n   * @typedef {import('../features/BpmnReplace').default} BpmnReplace\n   * @typedef {import('diagram-js/lib/features/Rules').default} Rules\n   * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Moddle} Moddle\n   *\n   * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenuProvider').PopupMenuEntries} PopupMenuEntries\n   * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenuProvider').PopupMenuEntry} PopupMenuEntry\n   * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenuProvider').PopupMenuEntryAction} PopupMenuEntryAction\n   * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenuProvider').PopupMenuHeaderEntries} PopupMenuHeaderEntries\n   * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenuProvider').default} PopupMenuProvider\n   * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenu').PopupMenuTarget} PopupMenuTarget\n   *\n   * @typedef {import('./ReplaceOptions').ReplaceOption} ReplaceOption\n   */\n\n  /**\n   * A BPMN-specific popup menu provider.\n   *\n   * @implements {PopupMenuProvider}\n   *\n   * @param {BpmnFactory} bpmnFactory\n   * @param {PopupMenu} popupMenu\n   * @param {Modeling} modeling\n   * @param {Moddle} moddle\n   * @param {BpmnReplace} bpmnReplace\n   * @param {Rules} rules\n   * @param {Translate} translate\n   */\n  function ReplaceMenuProvider(\n      bpmnFactory, popupMenu, modeling, moddle,\n      bpmnReplace, rules, translate) {\n\n    this._bpmnFactory = bpmnFactory;\n    this._popupMenu = popupMenu;\n    this._modeling = modeling;\n    this._moddle = moddle;\n    this._bpmnReplace = bpmnReplace;\n    this._rules = rules;\n    this._translate = translate;\n\n    this._register();\n  }\n\n  ReplaceMenuProvider.$inject = [\n    'bpmnFactory',\n    'popupMenu',\n    'modeling',\n    'moddle',\n    'bpmnReplace',\n    'rules',\n    'translate'\n  ];\n\n  ReplaceMenuProvider.prototype._register = function() {\n    this._popupMenu.registerProvider('bpmn-replace', this);\n  };\n\n  /**\n   * @param {PopupMenuTarget} target\n   *\n   * @return {PopupMenuEntries}\n   */\n  ReplaceMenuProvider.prototype.getPopupMenuEntries = function(target) {\n\n    var businessObject = target.businessObject;\n\n    var rules = this._rules;\n\n    var filteredReplaceOptions = [];\n\n    if (isArray$3(target) || !rules.allowed('shape.replace', { element: target })) {\n      return {};\n    }\n\n    var differentType = isDifferentType(target);\n\n    if (is$1(businessObject, 'bpmn:DataObjectReference')) {\n      return this._createEntries(target, DATA_OBJECT_REFERENCE);\n    }\n\n    if (is$1(businessObject, 'bpmn:DataStoreReference') && !is$1(target.parent, 'bpmn:Collaboration')) {\n      return this._createEntries(target, DATA_STORE_REFERENCE);\n    }\n\n    // start events outside sub processes\n    if (is$1(businessObject, 'bpmn:StartEvent') && !is$1(businessObject.$parent, 'bpmn:SubProcess')) {\n\n      filteredReplaceOptions = filter(START_EVENT, differentType);\n\n      return this._createEntries(target, filteredReplaceOptions);\n    }\n\n    // expanded/collapsed pools\n    if (is$1(businessObject, 'bpmn:Participant')) {\n\n      filteredReplaceOptions = filter(PARTICIPANT, function(replaceOption) {\n        return isExpanded(target) !== replaceOption.target.isExpanded;\n      });\n\n      return this._createEntries(target, filteredReplaceOptions);\n    }\n\n    // start events inside event sub processes\n    if (is$1(businessObject, 'bpmn:StartEvent') && isEventSubProcess(businessObject.$parent)) {\n      filteredReplaceOptions = filter(EVENT_SUB_PROCESS_START_EVENT, function(replaceOption) {\n\n        var target = replaceOption.target;\n\n        var isInterrupting = target.isInterrupting !== false;\n\n        var isInterruptingEqual = businessObject.isInterrupting === isInterrupting;\n\n        // filters elements which types and event definition are equal but have have different interrupting types\n        return differentType(replaceOption) || !differentType(replaceOption) && !isInterruptingEqual;\n\n      });\n\n      return this._createEntries(target, filteredReplaceOptions);\n    }\n\n    // start events inside sub processes\n    if (is$1(businessObject, 'bpmn:StartEvent') && !isEventSubProcess(businessObject.$parent)\n        && is$1(businessObject.$parent, 'bpmn:SubProcess')) {\n      filteredReplaceOptions = filter(START_EVENT_SUB_PROCESS, differentType);\n\n      return this._createEntries(target, filteredReplaceOptions);\n    }\n\n    // end events\n    if (is$1(businessObject, 'bpmn:EndEvent')) {\n\n      filteredReplaceOptions = filter(END_EVENT, function(replaceOption) {\n        var target = replaceOption.target;\n\n        // hide cancel end events outside transactions\n        if (target.eventDefinitionType == 'bpmn:CancelEventDefinition' && !is$1(businessObject.$parent, 'bpmn:Transaction')) {\n          return false;\n        }\n\n        return differentType(replaceOption);\n      });\n\n      return this._createEntries(target, filteredReplaceOptions);\n    }\n\n    // boundary events\n    if (is$1(businessObject, 'bpmn:BoundaryEvent')) {\n\n      filteredReplaceOptions = filter(BOUNDARY_EVENT, function(replaceOption) {\n\n        var target = replaceOption.target;\n\n        if (target.eventDefinitionType == 'bpmn:CancelEventDefinition' &&\n           !is$1(businessObject.attachedToRef, 'bpmn:Transaction')) {\n          return false;\n        }\n        var cancelActivity = target.cancelActivity !== false;\n\n        var isCancelActivityEqual = businessObject.cancelActivity == cancelActivity;\n\n        return differentType(replaceOption) || !differentType(replaceOption) && !isCancelActivityEqual;\n      });\n\n      return this._createEntries(target, filteredReplaceOptions);\n    }\n\n    // intermediate events\n    if (is$1(businessObject, 'bpmn:IntermediateCatchEvent') ||\n        is$1(businessObject, 'bpmn:IntermediateThrowEvent')) {\n\n      filteredReplaceOptions = filter(INTERMEDIATE_EVENT, differentType);\n\n      return this._createEntries(target, filteredReplaceOptions);\n    }\n\n    // gateways\n    if (is$1(businessObject, 'bpmn:Gateway')) {\n\n      filteredReplaceOptions = filter(GATEWAY, differentType);\n\n      return this._createEntries(target, filteredReplaceOptions);\n    }\n\n    // transactions\n    if (is$1(businessObject, 'bpmn:Transaction')) {\n\n      filteredReplaceOptions = filter(TRANSACTION, differentType);\n\n      return this._createEntries(target, filteredReplaceOptions);\n    }\n\n    // expanded event sub processes\n    if (isEventSubProcess(businessObject) && isExpanded(target)) {\n\n      filteredReplaceOptions = filter(EVENT_SUB_PROCESS, differentType);\n\n      return this._createEntries(target, filteredReplaceOptions);\n    }\n\n    // expanded sub processes\n    if (is$1(businessObject, 'bpmn:SubProcess') && isExpanded(target)) {\n\n      filteredReplaceOptions = filter(SUBPROCESS_EXPANDED, differentType);\n\n      return this._createEntries(target, filteredReplaceOptions);\n    }\n\n    // collapsed ad hoc sub processes\n    if (is$1(businessObject, 'bpmn:AdHocSubProcess') && !isExpanded(target)) {\n\n      filteredReplaceOptions = filter(TASK, function(replaceOption) {\n\n        var target = replaceOption.target;\n\n        var isTargetSubProcess = target.type === 'bpmn:SubProcess';\n\n        var isTargetExpanded = target.isExpanded === true;\n\n        return isDifferentType(target) && (!isTargetSubProcess || isTargetExpanded);\n      });\n\n      return this._createEntries(target, filteredReplaceOptions);\n    }\n\n    // sequence flows\n    if (is$1(businessObject, 'bpmn:SequenceFlow')) {\n      return this._createSequenceFlowEntries(target, SEQUENCE_FLOW);\n    }\n\n    // flow nodes\n    if (is$1(businessObject, 'bpmn:FlowNode')) {\n      filteredReplaceOptions = filter(TASK, differentType);\n\n      // collapsed sub process cannot be replaced with itself\n      if (is$1(businessObject, 'bpmn:SubProcess') && !isExpanded(target)) {\n        filteredReplaceOptions = filter(filteredReplaceOptions, function(replaceOption) {\n          return replaceOption.label !== 'Sub Process (collapsed)';\n        });\n      }\n\n      return this._createEntries(target, filteredReplaceOptions);\n    }\n\n    return {};\n  };\n\n  /**\n   * @param {PopupMenuTarget} target\n   *\n   * @return {PopupMenuHeaderEntries}\n   */\n  ReplaceMenuProvider.prototype.getPopupMenuHeaderEntries = function(target) {\n\n    var headerEntries = {};\n\n    if (is$1(target, 'bpmn:Activity') && !isEventSubProcess(target)) {\n      headerEntries = {\n        ...headerEntries,\n        ...this._getLoopCharacteristicsHeaderEntries(target)\n      };\n    }\n\n    if (is$1(target, 'bpmn:DataObjectReference')) {\n      headerEntries = {\n        ...headerEntries,\n        ...this._getCollectionHeaderEntries(target)\n      };\n    }\n\n    if (is$1(target, 'bpmn:Participant')) {\n      headerEntries = {\n        ...headerEntries,\n        ...this._getParticipantMultiplicityHeaderEntries(target)\n      };\n    }\n\n    if (is$1(target, 'bpmn:SubProcess') &&\n        !is$1(target, 'bpmn:Transaction') &&\n        !isEventSubProcess(target)) {\n      headerEntries = {\n        ...headerEntries,\n        ...this._getAdHocHeaderEntries(target)\n      };\n    }\n\n    return headerEntries;\n  };\n\n\n  /**\n   * Create popup menu entries for the given target.\n   *\n   * @param  {PopupMenuTarget} target\n   * @param  {ReplaceOption[]} replaceOptions\n   *\n   * @return {PopupMenuEntries}\n   */\n  ReplaceMenuProvider.prototype._createEntries = function(target, replaceOptions) {\n    var entries = {};\n\n    var self = this;\n\n    forEach$1(replaceOptions, function(replaceOption) {\n      entries[ replaceOption.actionName ] = self._createEntry(replaceOption, target);\n    });\n\n    return entries;\n  };\n\n  /**\n   * Creates popup menu entries for the given sequence flow.\n   *\n   * @param  {PopupMenuTarget} target\n   * @param  {ReplaceOption[]} replaceOptions\n   *\n   * @return {PopupMenuEntries}\n   */\n  ReplaceMenuProvider.prototype._createSequenceFlowEntries = function(target, replaceOptions) {\n\n    var businessObject = getBusinessObject(target);\n\n    var entries = {};\n\n    var modeling = this._modeling,\n        moddle = this._moddle;\n\n    var self = this;\n\n    forEach$1(replaceOptions, function(replaceOption) {\n\n      switch (replaceOption.actionName) {\n      case 'replace-with-default-flow':\n        if (businessObject.sourceRef.default !== businessObject &&\n              (is$1(businessObject.sourceRef, 'bpmn:ExclusiveGateway') ||\n               is$1(businessObject.sourceRef, 'bpmn:InclusiveGateway') ||\n               is$1(businessObject.sourceRef, 'bpmn:ComplexGateway') ||\n               is$1(businessObject.sourceRef, 'bpmn:Activity'))) {\n\n          entries = {\n            ...entries,\n            [ replaceOption.actionName ]: self._createEntry(replaceOption, target, function() {\n              modeling.updateProperties(target.source, { default: businessObject });\n            })\n          };\n        }\n        break;\n      case 'replace-with-conditional-flow':\n        if (!businessObject.conditionExpression && is$1(businessObject.sourceRef, 'bpmn:Activity')) {\n\n          entries = {\n            ...entries,\n            [ replaceOption.actionName ]: self._createEntry(replaceOption, target, function() {\n              var conditionExpression = moddle.create('bpmn:FormalExpression', { body: '' });\n\n              modeling.updateProperties(target, { conditionExpression: conditionExpression });\n            })\n          };\n        }\n        break;\n      default:\n\n        // conditional flow -> sequence flow\n        if (is$1(businessObject.sourceRef, 'bpmn:Activity') && businessObject.conditionExpression) {\n          entries = {\n            ...entries,\n            [ replaceOption.actionName ]: self._createEntry(replaceOption, target, function() {\n              modeling.updateProperties(target, { conditionExpression: undefined });\n            })\n          };\n        }\n\n        // default flow -> sequence flow\n        if ((is$1(businessObject.sourceRef, 'bpmn:ExclusiveGateway') ||\n             is$1(businessObject.sourceRef, 'bpmn:InclusiveGateway') ||\n             is$1(businessObject.sourceRef, 'bpmn:ComplexGateway') ||\n             is$1(businessObject.sourceRef, 'bpmn:Activity')) &&\n             businessObject.sourceRef.default === businessObject) {\n          entries = {\n            ...entries,\n            [ replaceOption.actionName ]: self._createEntry(replaceOption, target, function() {\n              modeling.updateProperties(target.source, { default: undefined });\n            })\n          };\n        }\n      }\n    });\n\n    return entries;\n  };\n\n  /**\n   * Create a popup menu entry for the given replace option.\n   *\n   * @param  {ReplaceOption} replaceOption\n   * @param  {PopupMenuTarget} target\n   * @param  {PopupMenuEntryAction} [action]\n   *\n   * @return {PopupMenuEntry}\n   */\n  ReplaceMenuProvider.prototype._createEntry = function(replaceOption, target, action) {\n    var translate = this._translate;\n    var replaceElement = this._bpmnReplace.replaceElement;\n\n    var replaceAction = function() {\n      return replaceElement(target, replaceOption.target);\n    };\n\n    var label = replaceOption.label;\n    if (label && typeof label === 'function') {\n      label = label(target);\n    }\n\n    action = action || replaceAction;\n\n    return {\n      label: translate(label),\n      className: replaceOption.className,\n      action: action\n    };\n  };\n\n  /**\n   * Get popup menu header entries for the loop characteristics of the given BPMN element.\n   *\n   * @param  {PopupMenuTarget} target\n   *\n   * @return {PopupMenuHeaderEntries}\n   */\n  ReplaceMenuProvider.prototype._getLoopCharacteristicsHeaderEntries = function(target) {\n\n    var self = this;\n    var translate = this._translate;\n\n    function toggleLoopEntry(event, entry) {\n      var newLoopCharacteristics = getBusinessObject(target).loopCharacteristics;\n\n      if (entry.active) {\n        newLoopCharacteristics = undefined;\n      } else {\n        if (isUndefined$2(entry.options.isSequential) || !newLoopCharacteristics\n        || !is$1(newLoopCharacteristics, entry.options.loopCharacteristics)) {\n          newLoopCharacteristics = self._moddle.create(entry.options.loopCharacteristics);\n        }\n\n        newLoopCharacteristics.isSequential = entry.options.isSequential;\n      }\n      self._modeling.updateProperties(target, { loopCharacteristics: newLoopCharacteristics });\n    }\n\n    var businessObject = getBusinessObject(target),\n        loopCharacteristics = businessObject.loopCharacteristics;\n\n    var isSequential,\n        isLoop,\n        isParallel;\n\n    if (loopCharacteristics) {\n      isSequential = loopCharacteristics.isSequential;\n      isLoop = loopCharacteristics.isSequential === undefined;\n      isParallel = loopCharacteristics.isSequential !== undefined && !loopCharacteristics.isSequential;\n    }\n\n\n    return {\n      'toggle-parallel-mi' : {\n        className: 'bpmn-icon-parallel-mi-marker',\n        title: translate('Parallel Multi Instance'),\n        active: isParallel,\n        action: toggleLoopEntry,\n        options: {\n          loopCharacteristics: 'bpmn:MultiInstanceLoopCharacteristics',\n          isSequential: false\n        }\n      },\n      'toggle-sequential-mi': {\n        className: 'bpmn-icon-sequential-mi-marker',\n        title: translate('Sequential Multi Instance'),\n        active: isSequential,\n        action: toggleLoopEntry,\n        options: {\n          loopCharacteristics: 'bpmn:MultiInstanceLoopCharacteristics',\n          isSequential: true\n        }\n      },\n      'toggle-loop': {\n        className: 'bpmn-icon-loop-marker',\n        title: translate('Loop'),\n        active: isLoop,\n        action: toggleLoopEntry,\n        options: {\n          loopCharacteristics: 'bpmn:StandardLoopCharacteristics'\n        }\n      }\n    };\n  };\n\n  /**\n   * Get popup menu header entries for the collection property of the given BPMN element.\n   *\n   * @param  {PopupMenuTarget} target\n   *\n   * @return {PopupMenuHeaderEntries}\n   */\n  ReplaceMenuProvider.prototype._getCollectionHeaderEntries = function(target) {\n\n    var self = this;\n    var translate = this._translate;\n\n    var dataObject = target.businessObject.dataObjectRef;\n\n    if (!dataObject) {\n      return {};\n    }\n\n    function toggleIsCollection(event, entry) {\n      self._modeling.updateModdleProperties(\n        target,\n        dataObject,\n        { isCollection: !entry.active });\n    }\n\n    var isCollection = dataObject.isCollection;\n\n    return {\n      'toggle-is-collection': {\n        className: 'bpmn-icon-parallel-mi-marker',\n        title: translate('Collection'),\n        active: isCollection,\n        action: toggleIsCollection,\n      }\n    };\n  };\n\n  /**\n   * Get popup menu header entries for the participant multiplicity property of the given BPMN element.\n   *\n   * @param  {PopupMenuTarget} target\n   *\n   * @return {PopupMenuHeaderEntries}\n   */\n  ReplaceMenuProvider.prototype._getParticipantMultiplicityHeaderEntries = function(target) {\n\n    var self = this;\n    var bpmnFactory = this._bpmnFactory;\n    var translate = this._translate;\n\n    function toggleParticipantMultiplicity(event, entry) {\n      var isActive = entry.active;\n      var participantMultiplicity;\n\n      if (!isActive) {\n        participantMultiplicity = bpmnFactory.create('bpmn:ParticipantMultiplicity');\n      }\n\n      self._modeling.updateProperties(\n        target,\n        { participantMultiplicity: participantMultiplicity });\n    }\n\n    var participantMultiplicity = target.businessObject.participantMultiplicity;\n\n    return {\n      'toggle-participant-multiplicity': {\n        className: 'bpmn-icon-parallel-mi-marker',\n        title: translate('Participant Multiplicity'),\n        active: !!participantMultiplicity,\n        action: toggleParticipantMultiplicity,\n      }\n    };\n  };\n\n  /**\n   * Get popup menu header entries for the ad-hoc property of the given BPMN element.\n   *\n   * @param  {PopupMenuTarget} element\n   *\n   * @return {PopupMenuHeaderEntries}\n   */\n  ReplaceMenuProvider.prototype._getAdHocHeaderEntries = function(element) {\n    var translate = this._translate;\n    var businessObject = getBusinessObject(element);\n\n    var isAdHoc = is$1(businessObject, 'bpmn:AdHocSubProcess');\n\n    var replaceElement = this._bpmnReplace.replaceElement;\n\n    return {\n      'toggle-adhoc': {\n        className: 'bpmn-icon-ad-hoc-marker',\n        title: translate('Ad-hoc'),\n        active: isAdHoc,\n        action: function(event, entry) {\n          if (isAdHoc) {\n            return replaceElement(element, { type: 'bpmn:SubProcess' }, {\n              autoResize: false,\n              layoutConnection: false\n            });\n          } else {\n            return replaceElement(element, { type: 'bpmn:AdHocSubProcess' }, {\n              autoResize: false,\n              layoutConnection: false\n            });\n          }\n        }\n      }\n    };\n  };\n\n  var PopupMenuModule = {\n    __depends__: [\n      PopupMenuModule$1,\n      ReplaceModule,\n      AutoPlaceModule\n    ],\n    __init__: [\n      'replaceMenuProvider'\n    ],\n    replaceMenuProvider: [ 'type', ReplaceMenuProvider ]\n  };\n\n  var max$4 = Math.max,\n      min$2 = Math.min;\n\n  var DEFAULT_CHILD_BOX_PADDING = 20;\n\n  /**\n   * @typedef {import('../../core/Types').ElementLike} Element\n   * @typedef {import('../../core/Types').ShapeLike} Shape\n   *\n   * @typedef {import('../../util/Types').Direction} Direction\n   * @typedef {import('../../util/Types').Point} Point\n   * @typedef {import('../../util/Types').Rect} Rect\n   * @typedef {import('../../util/Types').RectTRBL} RectTRBL\n   */\n\n  /**\n   * Substract a TRBL from another\n   *\n   * @param {RectTRBL} trblA\n   * @param {RectTRBL} trblB\n   *\n   * @return {RectTRBL}\n   */\n  function substractTRBL(trblA, trblB) {\n    return {\n      top: trblA.top - trblB.top,\n      right: trblA.right - trblB.right,\n      bottom: trblA.bottom - trblB.bottom,\n      left: trblA.left - trblB.left\n    };\n  }\n\n  /**\n   * Resize the given bounds by the specified delta from a given anchor point.\n   *\n   * @param {Rect} bounds the bounding box that should be resized\n   * @param {Direction} direction in which the element is resized (nw, ne, se, sw)\n   * @param {Point} delta of the resize operation\n   *\n   * @return {Rect} resized bounding box\n   */\n  function resizeBounds$1(bounds, direction, delta) {\n    var dx = delta.x,\n        dy = delta.y;\n\n    var newBounds = {\n      x: bounds.x,\n      y: bounds.y,\n      width: bounds.width,\n      height: bounds.height\n    };\n\n    if (direction.indexOf('n') !== -1) {\n      newBounds.y = bounds.y + dy;\n      newBounds.height = bounds.height - dy;\n    } else if (direction.indexOf('s') !== -1) {\n      newBounds.height = bounds.height + dy;\n    }\n\n    if (direction.indexOf('e') !== -1) {\n      newBounds.width = bounds.width + dx;\n    } else if (direction.indexOf('w') !== -1) {\n      newBounds.x = bounds.x + dx;\n      newBounds.width = bounds.width - dx;\n    }\n\n    return newBounds;\n  }\n\n\n  /**\n   * Resize the given bounds by applying the passed\n   * { top, right, bottom, left } delta.\n   *\n   * @param {Rect} bounds\n   * @param {RectTRBL} resize\n   *\n   * @return {Rect}\n   */\n  function resizeTRBL(bounds, resize) {\n    return {\n      x: bounds.x + (resize.left || 0),\n      y: bounds.y + (resize.top || 0),\n      width: bounds.width - (resize.left || 0) + (resize.right || 0),\n      height: bounds.height - (resize.top || 0) + (resize.bottom || 0)\n    };\n  }\n\n\n  function applyConstraints(attr, trbl, resizeConstraints) {\n\n    var value = trbl[attr],\n        minValue = resizeConstraints.min && resizeConstraints.min[attr],\n        maxValue = resizeConstraints.max && resizeConstraints.max[attr];\n\n    if (isNumber(minValue)) {\n      value = (/top|left/.test(attr) ? min$2 : max$4)(value, minValue);\n    }\n\n    if (isNumber(maxValue)) {\n      value = (/top|left/.test(attr) ? max$4 : min$2)(value, maxValue);\n    }\n\n    return value;\n  }\n\n  function ensureConstraints$1(currentBounds, resizeConstraints) {\n\n    if (!resizeConstraints) {\n      return currentBounds;\n    }\n\n    var currentTrbl = asTRBL(currentBounds);\n\n    return asBounds({\n      top: applyConstraints('top', currentTrbl, resizeConstraints),\n      right: applyConstraints('right', currentTrbl, resizeConstraints),\n      bottom: applyConstraints('bottom', currentTrbl, resizeConstraints),\n      left: applyConstraints('left', currentTrbl, resizeConstraints)\n    });\n  }\n\n\n  function getMinResizeBounds(direction, currentBounds, minDimensions, childrenBounds) {\n\n    var currentBox = asTRBL(currentBounds);\n\n    var minBox = {\n      top: /n/.test(direction) ? currentBox.bottom - minDimensions.height : currentBox.top,\n      left: /w/.test(direction) ? currentBox.right - minDimensions.width : currentBox.left,\n      bottom: /s/.test(direction) ? currentBox.top + minDimensions.height : currentBox.bottom,\n      right: /e/.test(direction) ? currentBox.left + minDimensions.width : currentBox.right\n    };\n\n    var childrenBox = childrenBounds ? asTRBL(childrenBounds) : minBox;\n\n    var combinedBox = {\n      top: min$2(minBox.top, childrenBox.top),\n      left: min$2(minBox.left, childrenBox.left),\n      bottom: max$4(minBox.bottom, childrenBox.bottom),\n      right: max$4(minBox.right, childrenBox.right)\n    };\n\n    return asBounds(combinedBox);\n  }\n\n  function asPadding(mayBePadding, defaultValue) {\n    if (typeof mayBePadding !== 'undefined') {\n      return mayBePadding;\n    } else {\n      return DEFAULT_CHILD_BOX_PADDING;\n    }\n  }\n\n  function addPadding$1(bbox, padding) {\n    var left, right, top, bottom;\n\n    if (typeof padding === 'object') {\n      left = asPadding(padding.left);\n      right = asPadding(padding.right);\n      top = asPadding(padding.top);\n      bottom = asPadding(padding.bottom);\n    } else {\n      left = right = top = bottom = asPadding(padding);\n    }\n\n    return {\n      x: bbox.x - left,\n      y: bbox.y - top,\n      width: bbox.width + left + right,\n      height: bbox.height + top + bottom\n    };\n  }\n\n\n  /**\n   * Is the given element part of the resize\n   * targets min boundary box?\n   *\n   * This is the default implementation which excludes\n   * connections and labels.\n   *\n   * @param {Element} element\n   */\n  function isBBoxChild(element) {\n\n    // exclude connections\n    if (element.waypoints) {\n      return false;\n    }\n\n    // exclude labels\n    if (element.type === 'label') {\n      return false;\n    }\n\n    return true;\n  }\n\n  /**\n   * Return children bounding computed from a shapes children\n   * or a list of prefiltered children.\n   *\n   * @param {Shape|Shape[]} shapeOrChildren\n   * @param {RectTRBL|number} padding\n   *\n   * @return {Rect}\n   */\n  function computeChildrenBBox(shapeOrChildren, padding) {\n\n    var elements;\n\n    // compute based on shape\n    if (shapeOrChildren.length === undefined) {\n\n      // grab all the children that are part of the\n      // parents children box\n      elements = filter(shapeOrChildren.children, isBBoxChild);\n\n    } else {\n      elements = shapeOrChildren;\n    }\n\n    if (elements.length) {\n      return addPadding$1(getBBox(elements), padding);\n    }\n  }\n\n  /**\n   * @typedef {import('../../../model/Types').Shape} Shape\n   *\n   * @typedef {import('diagram-js/lib/util/Types').Rect} Rect\n   */\n\n  var abs$4 = Math.abs;\n\n\n  function getTRBLResize(oldBounds, newBounds) {\n    return substractTRBL(asTRBL(newBounds), asTRBL(oldBounds));\n  }\n\n\n  var LANE_PARENTS = [\n    'bpmn:Participant',\n    'bpmn:Process',\n    'bpmn:SubProcess'\n  ];\n\n  var LANE_INDENTATION = 30;\n\n\n  /**\n   * Return all lanes that are children of the given shape.\n   *\n   * @param  {Shape} shape\n   * @param  {Shape[]} [collectedShapes]\n   *\n   * @return {Shape[]}\n   */\n  function collectLanes(shape, collectedShapes) {\n\n    collectedShapes = collectedShapes || [];\n\n    shape.children.filter(function(s) {\n      if (is$1(s, 'bpmn:Lane')) {\n        collectLanes(s, collectedShapes);\n\n        collectedShapes.push(s);\n      }\n    });\n\n    return collectedShapes;\n  }\n\n\n  /**\n   * Return all lanes that are direct children of the given shape.\n   *\n   * @param {Shape} shape\n   *\n   * @return {Shape[]}\n   */\n  function getChildLanes(shape) {\n    return shape.children.filter(function(c) {\n      return is$1(c, 'bpmn:Lane');\n    });\n  }\n\n\n  /**\n   * Return the parent shape of the given lane.\n   *\n   * @param {Shape} shape\n   *\n   * @return {Shape}\n   */\n  function getLanesRoot(shape) {\n    return getParent(shape, LANE_PARENTS) || shape;\n  }\n\n\n  /**\n   * Compute the required resize operations for lanes\n   * adjacent to the given shape, assuming it will be\n   * resized to the given new bounds.\n   *\n   * @param {Shape} shape\n   * @param {Rect} newBounds\n   *\n   * @return { {\n   *   shape: Shape;\n   *   newBounds: Rect;\n   * }[] }\n   */\n  function computeLanesResize(shape, newBounds) {\n\n    var rootElement = getLanesRoot(shape);\n\n    var initialShapes = is$1(rootElement, 'bpmn:Process') ? [] : [ rootElement ];\n\n    var allLanes = collectLanes(rootElement, initialShapes),\n        shapeTrbl = asTRBL(shape),\n        shapeNewTrbl = asTRBL(newBounds),\n        trblResize = getTRBLResize(shape, newBounds),\n        resizeNeeded = [];\n\n    allLanes.forEach(function(other) {\n\n      if (other === shape) {\n        return;\n      }\n\n      var topResize = 0,\n          rightResize = trblResize.right,\n          bottomResize = 0,\n          leftResize = trblResize.left;\n\n      var otherTrbl = asTRBL(other);\n\n      if (trblResize.top) {\n        if (abs$4(otherTrbl.bottom - shapeTrbl.top) < 10) {\n          bottomResize = shapeNewTrbl.top - otherTrbl.bottom;\n        }\n\n        if (abs$4(otherTrbl.top - shapeTrbl.top) < 5) {\n          topResize = shapeNewTrbl.top - otherTrbl.top;\n        }\n      }\n\n      if (trblResize.bottom) {\n        if (abs$4(otherTrbl.top - shapeTrbl.bottom) < 10) {\n          topResize = shapeNewTrbl.bottom - otherTrbl.top;\n        }\n\n        if (abs$4(otherTrbl.bottom - shapeTrbl.bottom) < 5) {\n          bottomResize = shapeNewTrbl.bottom - otherTrbl.bottom;\n        }\n      }\n\n      if (topResize || rightResize || bottomResize || leftResize) {\n\n        resizeNeeded.push({\n          shape: other,\n          newBounds: resizeTRBL(other, {\n            top: topResize,\n            right: rightResize,\n            bottom: bottomResize,\n            left: leftResize\n          })\n        });\n      }\n\n    });\n\n    return resizeNeeded;\n  }\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('diagram-js/lib/features/context-pad/ContextPad').default} ContextPad\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   * @typedef {import('../modeling/ElementFactory').default} ElementFactory\n   * @typedef {import('diagram-js/lib/features/connect/Connect').default} Connect\n   * @typedef {import('diagram-js/lib/features/create/Create').default} Create\n   * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenu').default} PopupMenu\n   * @typedef {import('diagram-js/lib/features/canvas/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/features/rules/Rules').default} Rules\n   * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').ModdleElement} ModdleElement\n   *\n   * @typedef {import('diagram-js/lib/features/context-pad/ContextPadProvider').default<Element>} BaseContextPadProvider\n   * @typedef {import('diagram-js/lib/features/context-pad/ContextPadProvider').ContextPadEntries} ContextPadEntries\n   * @typedef {import('diagram-js/lib/features/context-pad/ContextPadProvider').ContextPadEntry} ContextPadEntry\n   *\n   * @typedef { { autoPlace?: boolean; } } ContextPadConfig\n   */\n\n  /**\n   * BPMN-specific context pad provider.\n   *\n   * @implements {BaseContextPadProvider}\n   *\n   * @param {ContextPadConfig} config\n   * @param {Injector} injector\n   * @param {EventBus} eventBus\n   * @param {ContextPad} contextPad\n   * @param {Modeling} modeling\n   * @param {ElementFactory} elementFactory\n   * @param {Connect} connect\n   * @param {Create} create\n   * @param {PopupMenu} popupMenu\n   * @param {Canvas} canvas\n   * @param {Rules} rules\n   * @param {Translate} translate\n   */\n  function ContextPadProvider(\n      config, injector, eventBus,\n      contextPad, modeling, elementFactory,\n      connect, create, popupMenu,\n      canvas, rules, translate) {\n\n    config = config || {};\n\n    contextPad.registerProvider(this);\n\n    this._contextPad = contextPad;\n\n    this._modeling = modeling;\n\n    this._elementFactory = elementFactory;\n    this._connect = connect;\n    this._create = create;\n    this._popupMenu = popupMenu;\n    this._canvas = canvas;\n    this._rules = rules;\n    this._translate = translate;\n\n    if (config.autoPlace !== false) {\n      this._autoPlace = injector.get('autoPlace', false);\n    }\n\n    eventBus.on('create.end', 250, function(event) {\n      var context = event.context,\n          shape = context.shape;\n\n      if (!hasPrimaryModifier(event) || !contextPad.isOpen(shape)) {\n        return;\n      }\n\n      var entries = contextPad.getEntries(shape);\n\n      if (entries.replace) {\n        entries.replace.action.click(event, shape);\n      }\n    });\n  }\n\n  ContextPadProvider.$inject = [\n    'config.contextPad',\n    'injector',\n    'eventBus',\n    'contextPad',\n    'modeling',\n    'elementFactory',\n    'connect',\n    'create',\n    'popupMenu',\n    'canvas',\n    'rules',\n    'translate'\n  ];\n\n  /**\n   * @param {Element[]} elements\n   *\n   * @return {ContextPadEntries}\n   */\n  ContextPadProvider.prototype.getMultiElementContextPadEntries = function(elements) {\n    var modeling = this._modeling;\n\n    var actions = {};\n\n    if (this._isDeleteAllowed(elements)) {\n      assign$1(actions, {\n        'delete': {\n          group: 'edit',\n          className: 'bpmn-icon-trash',\n          title: this._translate('Remove'),\n          action: {\n            click: function(event, elements) {\n              modeling.removeElements(elements.slice());\n            }\n          }\n        }\n      });\n    }\n\n    return actions;\n  };\n\n  /**\n   * @param {Element[]} elements\n   *\n   * @return {boolean}\n   */\n  ContextPadProvider.prototype._isDeleteAllowed = function(elements) {\n\n    var baseAllowed = this._rules.allowed('elements.delete', {\n      elements: elements\n    });\n\n    if (isArray$3(baseAllowed)) {\n      return every(baseAllowed, function(element) {\n        return includes$7(baseAllowed, element);\n      });\n    }\n\n    return baseAllowed;\n  };\n\n  /**\n   * @param {Element} element\n   *\n   * @return {ContextPadEntries}\n   */\n  ContextPadProvider.prototype.getContextPadEntries = function(element) {\n    var contextPad = this._contextPad,\n        modeling = this._modeling,\n\n        elementFactory = this._elementFactory,\n        connect = this._connect,\n        create = this._create,\n        popupMenu = this._popupMenu,\n        rules = this._rules,\n        autoPlace = this._autoPlace,\n        translate = this._translate;\n\n    var actions = {};\n\n    if (element.type === 'label') {\n      return actions;\n    }\n\n    var businessObject = element.businessObject;\n\n    function startConnect(event, element) {\n      connect.start(event, element);\n    }\n\n    function removeElement(e, element) {\n      modeling.removeElements([ element ]);\n    }\n\n    function getReplaceMenuPosition(element) {\n\n      var Y_OFFSET = 5;\n\n      var pad = contextPad.getPad(element).html;\n\n      var padRect = pad.getBoundingClientRect();\n\n      var pos = {\n        x: padRect.left,\n        y: padRect.bottom + Y_OFFSET\n      };\n\n      return pos;\n    }\n\n    /**\n     * Create an append action.\n     *\n     * @param {string} type\n     * @param {string} className\n     * @param {string} [title]\n     * @param {Object} [options]\n     *\n     * @return {ContextPadEntry}\n     */\n    function appendAction(type, className, title, options) {\n\n      if (typeof title !== 'string') {\n        options = title;\n        title = translate('Append {type}', { type: type.replace(/^bpmn:/, '') });\n      }\n\n      function appendStart(event, element) {\n\n        var shape = elementFactory.createShape(assign$1({ type: type }, options));\n        create.start(event, shape, {\n          source: element\n        });\n      }\n\n\n      var append = autoPlace ? function(event, element) {\n        var shape = elementFactory.createShape(assign$1({ type: type }, options));\n\n        autoPlace.append(element, shape);\n      } : appendStart;\n\n\n      return {\n        group: 'model',\n        className: className,\n        title: title,\n        action: {\n          dragstart: appendStart,\n          click: append\n        }\n      };\n    }\n\n    function splitLaneHandler(count) {\n\n      return function(_, element) {\n\n        // actual split\n        modeling.splitLane(element, count);\n\n        // refresh context pad after split to\n        // get rid of split icons\n        contextPad.open(element, true);\n      };\n    }\n\n\n    if (isAny(businessObject, [ 'bpmn:Lane', 'bpmn:Participant' ]) && isExpanded(element)) {\n\n      var childLanes = getChildLanes(element);\n\n      assign$1(actions, {\n        'lane-insert-above': {\n          group: 'lane-insert-above',\n          className: 'bpmn-icon-lane-insert-above',\n          title: translate('Add Lane above'),\n          action: {\n            click: function(event, element) {\n              modeling.addLane(element, 'top');\n            }\n          }\n        }\n      });\n\n      if (childLanes.length < 2) {\n\n        if (element.height >= 120) {\n          assign$1(actions, {\n            'lane-divide-two': {\n              group: 'lane-divide',\n              className: 'bpmn-icon-lane-divide-two',\n              title: translate('Divide into two Lanes'),\n              action: {\n                click: splitLaneHandler(2)\n              }\n            }\n          });\n        }\n\n        if (element.height >= 180) {\n          assign$1(actions, {\n            'lane-divide-three': {\n              group: 'lane-divide',\n              className: 'bpmn-icon-lane-divide-three',\n              title: translate('Divide into three Lanes'),\n              action: {\n                click: splitLaneHandler(3)\n              }\n            }\n          });\n        }\n      }\n\n      assign$1(actions, {\n        'lane-insert-below': {\n          group: 'lane-insert-below',\n          className: 'bpmn-icon-lane-insert-below',\n          title: translate('Add Lane below'),\n          action: {\n            click: function(event, element) {\n              modeling.addLane(element, 'bottom');\n            }\n          }\n        }\n      });\n\n    }\n\n    if (is$1(businessObject, 'bpmn:FlowNode')) {\n\n      if (is$1(businessObject, 'bpmn:EventBasedGateway')) {\n\n        assign$1(actions, {\n          'append.receive-task': appendAction(\n            'bpmn:ReceiveTask',\n            'bpmn-icon-receive-task',\n            translate('Append ReceiveTask')\n          ),\n          'append.message-intermediate-event': appendAction(\n            'bpmn:IntermediateCatchEvent',\n            'bpmn-icon-intermediate-event-catch-message',\n            translate('Append MessageIntermediateCatchEvent'),\n            { eventDefinitionType: 'bpmn:MessageEventDefinition' }\n          ),\n          'append.timer-intermediate-event': appendAction(\n            'bpmn:IntermediateCatchEvent',\n            'bpmn-icon-intermediate-event-catch-timer',\n            translate('Append TimerIntermediateCatchEvent'),\n            { eventDefinitionType: 'bpmn:TimerEventDefinition' }\n          ),\n          'append.condition-intermediate-event': appendAction(\n            'bpmn:IntermediateCatchEvent',\n            'bpmn-icon-intermediate-event-catch-condition',\n            translate('Append ConditionIntermediateCatchEvent'),\n            { eventDefinitionType: 'bpmn:ConditionalEventDefinition' }\n          ),\n          'append.signal-intermediate-event': appendAction(\n            'bpmn:IntermediateCatchEvent',\n            'bpmn-icon-intermediate-event-catch-signal',\n            translate('Append SignalIntermediateCatchEvent'),\n            { eventDefinitionType: 'bpmn:SignalEventDefinition' }\n          )\n        });\n      } else\n\n      if (isEventType(businessObject, 'bpmn:BoundaryEvent', 'bpmn:CompensateEventDefinition')) {\n\n        assign$1(actions, {\n          'append.compensation-activity':\n              appendAction(\n                'bpmn:Task',\n                'bpmn-icon-task',\n                translate('Append compensation activity'),\n                {\n                  isForCompensation: true\n                }\n              )\n        });\n      } else\n\n      if (!is$1(businessObject, 'bpmn:EndEvent') &&\n          !businessObject.isForCompensation &&\n          !isEventType(businessObject, 'bpmn:IntermediateThrowEvent', 'bpmn:LinkEventDefinition') &&\n          !isEventSubProcess(businessObject)) {\n\n        assign$1(actions, {\n          'append.end-event': appendAction(\n            'bpmn:EndEvent',\n            'bpmn-icon-end-event-none',\n            translate('Append EndEvent')\n          ),\n          'append.gateway': appendAction(\n            'bpmn:ExclusiveGateway',\n            'bpmn-icon-gateway-none',\n            translate('Append Gateway')\n          ),\n          'append.append-task': appendAction(\n            'bpmn:Task',\n            'bpmn-icon-task',\n            translate('Append Task')\n          ),\n          'append.intermediate-event': appendAction(\n            'bpmn:IntermediateThrowEvent',\n            'bpmn-icon-intermediate-event-none',\n            translate('Append Intermediate/Boundary Event')\n          )\n        });\n      }\n    }\n\n    if (!popupMenu.isEmpty(element, 'bpmn-replace')) {\n\n      // Replace menu entry\n      assign$1(actions, {\n        'replace': {\n          group: 'edit',\n          className: 'bpmn-icon-screw-wrench',\n          title: translate('Change type'),\n          action: {\n            click: function(event, element) {\n\n              var position = assign$1(getReplaceMenuPosition(element), {\n                cursor: { x: event.x, y: event.y }\n              });\n\n              popupMenu.open(element, 'bpmn-replace', position, {\n                title: translate('Change element'),\n                width: 300,\n                search: true\n              });\n            }\n          }\n        }\n      });\n    }\n\n    if (is$1(businessObject, 'bpmn:SequenceFlow')) {\n      assign$1(actions, {\n        'append.text-annotation': appendAction(\n          'bpmn:TextAnnotation',\n          'bpmn-icon-text-annotation'\n        )\n      });\n    }\n\n    if (\n      isAny(businessObject, [\n        'bpmn:FlowNode',\n        'bpmn:InteractionNode',\n        'bpmn:DataObjectReference',\n        'bpmn:DataStoreReference',\n      ])\n    ) {\n      assign$1(actions, {\n        'append.text-annotation': appendAction(\n          'bpmn:TextAnnotation',\n          'bpmn-icon-text-annotation'\n        ),\n\n        'connect': {\n          group: 'connect',\n          className: 'bpmn-icon-connection-multi',\n          title: translate(\n            'Connect using ' +\n              (businessObject.isForCompensation\n                ? ''\n                : 'Sequence/MessageFlow or ') +\n              'Association'\n          ),\n          action: {\n            click: startConnect,\n            dragstart: startConnect,\n          },\n        },\n      });\n    }\n\n    if (is$1(businessObject, 'bpmn:TextAnnotation')) {\n      assign$1(actions, {\n        'connect': {\n          group: 'connect',\n          className: 'bpmn-icon-connection-multi',\n          title: translate('Connect using Association'),\n          action: {\n            click: startConnect,\n            dragstart: startConnect,\n          },\n        },\n      });\n    }\n\n    if (isAny(businessObject, [ 'bpmn:DataObjectReference', 'bpmn:DataStoreReference' ])) {\n      assign$1(actions, {\n        'connect': {\n          group: 'connect',\n          className: 'bpmn-icon-connection-multi',\n          title: translate('Connect using DataInputAssociation'),\n          action: {\n            click: startConnect,\n            dragstart: startConnect\n          }\n        }\n      });\n    }\n\n    if (is$1(businessObject, 'bpmn:Group')) {\n      assign$1(actions, {\n        'append.text-annotation': appendAction('bpmn:TextAnnotation', 'bpmn-icon-text-annotation')\n      });\n    }\n\n    // delete element entry, only show if allowed by rules\n    var deleteAllowed = rules.allowed('elements.delete', { elements: [ element ] });\n\n    if (isArray$3(deleteAllowed)) {\n\n      // was the element returned as a deletion candidate?\n      deleteAllowed = deleteAllowed[0] === element;\n    }\n\n    if (deleteAllowed) {\n      assign$1(actions, {\n        'delete': {\n          group: 'edit',\n          className: 'bpmn-icon-trash',\n          title: translate('Remove'),\n          action: {\n            click: removeElement\n          }\n        }\n      });\n    }\n\n    return actions;\n  };\n\n\n  // helpers /////////\n\n  /**\n   * @param {ModdleElement} businessObject\n   * @param {string} type\n   * @param {string} eventDefinitionType\n   *\n   * @return {boolean}\n   */\n  function isEventType(businessObject, type, eventDefinitionType) {\n\n    var isType = businessObject.$instanceOf(type);\n    var isDefinition = false;\n\n    var definitions = businessObject.eventDefinitions || [];\n    forEach$1(definitions, function(def) {\n      if (def.$type === eventDefinitionType) {\n        isDefinition = true;\n      }\n    });\n\n    return isType && isDefinition;\n  }\n\n  function includes$7(array, item) {\n    return array.indexOf(item) !== -1;\n  }\n\n  var ContextPadModule = {\n    __depends__: [\n      DirectEditingModule,\n      ContextPadModule$1,\n      SelectionModule,\n      ConnectModule,\n      CreateModule,\n      PopupMenuModule\n    ],\n    __init__: [ 'contextPadProvider' ],\n    contextPadProvider: [ 'type', ContextPadProvider ]\n  };\n\n  /**\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef {import('../../util/Types').Axis} Axis\n   * @typedef {import('../../util/Types').Dimension} Dimension\n   * @typedef {import('../../util/Types').Rect} Rect\n   *\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   * @typedef {import('../rules/Rules').default} Rules\n   *\n   * @typedef { {\n   *   min: number;\n   *   max: number;\n   * } } Range\n   *\n   * @typedef { {\n   *   elements: Element[];\n   *   range: Range;\n   * } } Group\n   */\n\n  var AXIS_DIMENSIONS = {\n    horizontal: [ 'x', 'width' ],\n    vertical: [ 'y', 'height' ]\n  };\n\n  var THRESHOLD = 5;\n\n\n  /**\n   * Groups and filters elements and then trigger even distribution.\n   *\n   * @param {Modeling} modeling\n   * @param {Rules} rules\n   */\n  function DistributeElements$1(modeling, rules) {\n    this._modeling = modeling;\n\n    this._filters = [];\n\n    this.registerFilter(function(elements) {\n      var allowed = rules.allowed('elements.distribute', { elements: elements });\n\n      if (isArray$3(allowed)) {\n        return allowed;\n      }\n\n      return allowed ? elements : [];\n    });\n  }\n\n  DistributeElements$1.$inject = [ 'modeling', 'rules' ];\n\n\n  /**\n   * Registers filter functions that allow external parties to filter\n   * out certain elements.\n   *\n   * @param {(distributableElements: Element[], axis: Axis, dimension: Dimension) => Element[]} filterFn\n   */\n  DistributeElements$1.prototype.registerFilter = function(filterFn) {\n    if (typeof filterFn !== 'function') {\n      throw new Error('the filter has to be a function');\n    }\n\n    this._filters.push(filterFn);\n  };\n\n  /**\n   * Distributes the elements with a given orientation\n   *\n   * @param {Element[]} elements\n   * @param {string} orientation\n   */\n  DistributeElements$1.prototype.trigger = function(elements, orientation) {\n    var modeling = this._modeling;\n\n    var groups,\n        distributableElements;\n\n    if (elements.length < 3) {\n      return;\n    }\n\n    this._setOrientation(orientation);\n\n    distributableElements = this._filterElements(elements);\n\n    groups = this._createGroups(distributableElements);\n\n    // nothing to distribute\n    if (groups.length <= 2) {\n      return;\n    }\n\n    modeling.distributeElements(groups, this._axis, this._dimension);\n\n    return groups;\n  };\n\n  /**\n   * Filters the elements with provided filters by external parties\n   *\n   * @param {Element[]} elements\n   *\n   * @return {Element[]}\n   */\n  DistributeElements$1.prototype._filterElements = function(elements) {\n    var filters = this._filters,\n        axis = this._axis,\n        dimension = this._dimension,\n        distributableElements = [].concat(elements);\n\n    if (!filters.length) {\n      return elements;\n    }\n\n    forEach$1(filters, function(filterFn) {\n      distributableElements = filterFn(distributableElements, axis, dimension);\n    });\n\n    return distributableElements;\n  };\n\n\n  /**\n   * Create range (min, max) groups. Also tries to group elements\n   * together that share the same range.\n   *\n   * @example\n   *\n   * ```javascript\n   *   const groups = [\n   *     {\n   *       range: { min: 100, max: 200 },\n   *       elements: [ { id: 'shape1', ... } ]\n   *     }\n   *   ]\n   * ```\n   *\n   * @param {Element[]} elements\n   *\n   * @return {Group[]}\n   */\n  DistributeElements$1.prototype._createGroups = function(elements) {\n    var rangeGroups = [],\n        self = this,\n        axis = this._axis,\n        dimension = this._dimension;\n\n    if (!axis) {\n      throw new Error('must have a defined \"axis\" and \"dimension\"');\n    }\n\n    // sort by 'left->right' or 'top->bottom'\n    var sortedElements = sortBy(elements, axis);\n\n    forEach$1(sortedElements, function(element, idx) {\n      var elementRange = self._findRange(element, axis, dimension),\n          range;\n\n      var previous = rangeGroups[rangeGroups.length - 1];\n\n      if (previous && self._hasIntersection(previous.range, elementRange)) {\n        rangeGroups[rangeGroups.length - 1].elements.push(element);\n      } else {\n        range = { range: elementRange, elements: [ element ] };\n\n        rangeGroups.push(range);\n      }\n    });\n\n    return rangeGroups;\n  };\n\n\n  /**\n   * Maps a direction to the according axis and dimension.\n   *\n   * @param {'horizontal' | 'vertical'} direction 'horizontal' or 'vertical'\n   */\n  DistributeElements$1.prototype._setOrientation = function(direction) {\n    var orientation = AXIS_DIMENSIONS[direction];\n\n    this._axis = orientation[0];\n    this._dimension = orientation[1];\n  };\n\n\n  /**\n   * Checks if the two ranges intercept each other.\n   *\n   * @param {Range} rangeA\n   * @param {Range} rangeB\n   *\n   * @return {boolean}\n   */\n  DistributeElements$1.prototype._hasIntersection = function(rangeA, rangeB) {\n    return Math.max(rangeA.min, rangeA.max) >= Math.min(rangeB.min, rangeB.max) &&\n           Math.min(rangeA.min, rangeA.max) <= Math.max(rangeB.min, rangeB.max);\n  };\n\n\n  /**\n   * Returns the min and max values for an element\n   *\n   * @param {Element} element\n   *\n   * @return {Range}\n   */\n  DistributeElements$1.prototype._findRange = function(element) {\n    var axis = element[this._axis],\n        dimension = element[this._dimension];\n\n    return {\n      min: axis + THRESHOLD,\n      max: axis + dimension - THRESHOLD\n    };\n  };\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var DistributeElementsModule$1 = {\n    __init__: [ 'distributeElements' ],\n    distributeElements: [ 'type', DistributeElements$1 ]\n  };\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   */\n\n  /**\n   * Registers element exclude filters for elements that currently do not support\n   * distribution.\n   *\n   * @param {EventBus} eventBus\n   */\n  function BpmnDistributeElements(eventBus) {\n    RuleProvider.call(this, eventBus);\n  }\n\n  BpmnDistributeElements.$inject = [ 'eventBus' ];\n\n  e$3(BpmnDistributeElements, RuleProvider);\n\n  BpmnDistributeElements.prototype.init = function() {\n    this.addRule('elements.distribute', function(context) {\n      var elements = context.elements;\n\n      elements = filter(elements, function(element) {\n        var cannotDistribute = isAny(element, [\n          'bpmn:Association',\n          'bpmn:BoundaryEvent',\n          'bpmn:DataInputAssociation',\n          'bpmn:DataOutputAssociation',\n          'bpmn:Lane',\n          'bpmn:MessageFlow',\n          'bpmn:SequenceFlow',\n          'bpmn:TextAnnotation'\n        ]);\n\n        return !(element.labelTarget || cannotDistribute);\n      });\n\n      // filter out elements which are children of any of the selected elements\n      elements = getParents$1(elements);\n\n      if (elements.length < 3) {\n        return false;\n      }\n\n      return elements;\n    });\n  };\n\n  /**\n   * To change the icons, modify the SVGs in `./resources`, execute `npx svgo -f resources --datauri enc -o dist`,\n   * and then replace respective icons with the optimized data URIs in `./dist`.\n   */\n  var icons = {\n    horizontal: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1800 1800\">\n                <polyline points=\"450 400 450 150 1350 150 1350 400\" style=\"fill:none;stroke:currentColor;stroke-width:100;stroke-linejoin:round;\"/>\n                <rect x=\"150\" y=\"450\" width=\"600\" height=\"1200\" rx=\"1\" style=\"fill:none;stroke:currentColor;stroke-width:100;\"></rect>\n                <rect x=\"1050\" y=\"450\" width=\"600\" height=\"800\" rx=\"1\" style=\"fill:currentColor;stroke:currentColor;stroke-width:100;opacity:.5;\"></rect>\n              </svg>`,\n    vertical: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1800 1800\">\n              <polyline points=\"400 1350 150 1350 150 450 400 450\" style=\"fill:none;stroke:currentColor;stroke-width:100;stroke-linejoin:round;\"/>\n              <rect x=\"450\" y=\"150\" width=\"1200\" height=\"600\" rx=\"1\" style=\"fill:none;stroke:currentColor;stroke-width:100;\"></rect>\n              <rect x=\"450\" y=\"1050\" width=\"800\" height=\"600\" rx=\"1\" style=\"fill:currentColor;stroke:currentColor;stroke-width:100;opacity:.5;\"></rect>\n            </svg>`\n  };\n\n  var ICONS = icons;\n\n  /**\n   * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenu').default} PopupMenu\n   * @typedef {import('./BpmnDistributeElements').default} DistributeElements\n   * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n   * @typedef {import('diagram-js/lib/features/rules/Rules').default} Rules\n   *\n   * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenuProvider').PopupMenuEntries} PopupMenuEntries\n   * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenuProvider').default} PopupMenuProvider\n   * @typedef {import('diagram-js/lib/features/popup-menu/PopupMenu').PopupMenuTarget} PopupMenuTarget\n   */\n\n  var LOW_PRIORITY$g = 900;\n\n  /**\n   * A provider for the distribute elements popup menu.\n   *\n   * @implements {PopupMenuProvider}\n   *\n   * @param {PopupMenu} popupMenu\n   * @param {DistributeElements} distributeElements\n   * @param {Translate} translate\n   * @param {Rules} rules\n   */\n  function DistributeElementsMenuProvider(\n      popupMenu, distributeElements, translate, rules) {\n    this._distributeElements = distributeElements;\n    this._translate = translate;\n    this._popupMenu = popupMenu;\n    this._rules = rules;\n\n    popupMenu.registerProvider('align-elements', LOW_PRIORITY$g, this);\n  }\n\n  DistributeElementsMenuProvider.$inject = [\n    'popupMenu',\n    'distributeElements',\n    'translate',\n    'rules'\n  ];\n\n  /**\n   * @param {PopupMenuTarget} target\n   *\n   * @return {PopupMenuEntries}\n   */\n  DistributeElementsMenuProvider.prototype.getPopupMenuEntries = function(target) {\n    var entries = {};\n\n    if (this._isAllowed(target)) {\n      assign$1(entries, this._getEntries(target));\n    }\n\n    return entries;\n  };\n\n  DistributeElementsMenuProvider.prototype._isAllowed = function(elements) {\n    return this._rules.allowed('elements.distribute', { elements: elements });\n  };\n\n  DistributeElementsMenuProvider.prototype._getEntries = function(elements) {\n    var distributeElements = this._distributeElements,\n        translate = this._translate,\n        popupMenu = this._popupMenu;\n\n    var entries = {\n      'distribute-elements-horizontal': {\n        group: 'distribute',\n        title: translate('Distribute elements horizontally'),\n        className: 'bjs-align-elements-menu-entry',\n        imageHtml: ICONS['horizontal'],\n        action: function(event, entry) {\n          distributeElements.trigger(elements, 'horizontal');\n          popupMenu.close();\n        }\n      },\n      'distribute-elements-vertical': {\n        group: 'distribute',\n        title: translate('Distribute elements vertically'),\n        imageHtml: ICONS['vertical'],\n        action: function(event, entry) {\n          distributeElements.trigger(elements, 'vertical');\n          popupMenu.close();\n        }\n      },\n    };\n\n    return entries;\n  };\n\n  var DistributeElementsModule = {\n    __depends__: [\n      PopupMenuModule$1,\n      DistributeElementsModule$1\n    ],\n    __init__: [\n      'bpmnDistributeElements',\n      'distributeElementsMenuProvider'\n    ],\n    bpmnDistributeElements: [ 'type', BpmnDistributeElements ],\n    distributeElementsMenuProvider: [ 'type', DistributeElementsMenuProvider ]\n  };\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   *\n   * @typedef {import('../../core/EventBus').default} EventBus\n   */\n\n  var NOT_REGISTERED_ERROR = 'is not a registered action',\n      IS_REGISTERED_ERROR = 'is already registered';\n\n\n  /**\n   * An interface that provides access to modeling actions by decoupling\n   * the one who requests the action to be triggered and the trigger itself.\n   *\n   * It's possible to add new actions by registering them with ´registerAction´\n   * and likewise unregister existing ones with ´unregisterAction´.\n   *\n   *\n   * ## Life-Cycle and configuration\n   *\n   * The editor actions will wait for diagram initialization before\n   * registering default actions _and_ firing an `editorActions.init` event.\n   *\n   * Interested parties may listen to the `editorActions.init` event with\n   * low priority to check, which actions got registered. Other components\n   * may use the event to register their own actions via `registerAction`.\n   *\n   * @param {EventBus} eventBus\n   * @param {Injector} injector\n   */\n  function EditorActions(eventBus, injector) {\n\n    // initialize actions\n    this._actions = {};\n\n    var self = this;\n\n    eventBus.on('diagram.init', function() {\n\n      // all diagram modules got loaded; check which ones\n      // are available and register the respective default actions\n      self._registerDefaultActions(injector);\n\n      // ask interested parties to register available editor\n      // actions on diagram initialization\n      eventBus.fire('editorActions.init', {\n        editorActions: self\n      });\n    });\n\n  }\n\n  EditorActions.$inject = [\n    'eventBus',\n    'injector'\n  ];\n\n  /**\n   * Register default actions.\n   *\n   * @param {Injector} injector\n   */\n  EditorActions.prototype._registerDefaultActions = function(injector) {\n\n    // (1) retrieve optional components to integrate with\n\n    var commandStack = injector.get('commandStack', false);\n    var modeling = injector.get('modeling', false);\n    var selection = injector.get('selection', false);\n    var zoomScroll = injector.get('zoomScroll', false);\n    var copyPaste = injector.get('copyPaste', false);\n    var canvas = injector.get('canvas', false);\n    var rules = injector.get('rules', false);\n    var keyboardMove = injector.get('keyboardMove', false);\n    var keyboardMoveSelection = injector.get('keyboardMoveSelection', false);\n\n    // (2) check components and register actions\n\n    if (commandStack) {\n      this.register('undo', function() {\n        commandStack.undo();\n      });\n\n      this.register('redo', function() {\n        commandStack.redo();\n      });\n    }\n\n    if (copyPaste && selection) {\n      this.register('copy', function() {\n        var selectedElements = selection.get();\n\n        if (selectedElements.length) {\n          return copyPaste.copy(selectedElements);\n        }\n      });\n    }\n\n    if (copyPaste) {\n      this.register('paste', function() {\n        copyPaste.paste();\n      });\n    }\n\n    if (zoomScroll) {\n      this.register('stepZoom', function(opts) {\n        zoomScroll.stepZoom(opts.value);\n      });\n    }\n\n    if (canvas) {\n      this.register('zoom', function(opts) {\n        canvas.zoom(opts.value);\n      });\n    }\n\n    if (modeling && selection && rules) {\n      this.register('removeSelection', function() {\n\n        var selectedElements = selection.get();\n\n        if (!selectedElements.length) {\n          return;\n        }\n\n        var allowed = rules.allowed('elements.delete', { elements: selectedElements }),\n            removableElements;\n\n        if (allowed === false) {\n          return;\n        }\n        else if (isArray$3(allowed)) {\n          removableElements = allowed;\n        }\n        else {\n          removableElements = selectedElements;\n        }\n\n        if (removableElements.length) {\n          modeling.removeElements(removableElements.slice());\n        }\n      });\n    }\n\n    if (keyboardMove) {\n      this.register('moveCanvas', function(opts) {\n        keyboardMove.moveCanvas(opts);\n      });\n    }\n\n    if (keyboardMoveSelection) {\n      this.register('moveSelection', function(opts) {\n        keyboardMoveSelection.moveSelection(opts.direction, opts.accelerated);\n      });\n    }\n\n  };\n\n\n  /**\n   * Triggers a registered action\n   *\n   * @param {string} action\n   * @param {Object} opts\n   *\n   * @return {unknown} Returns what the registered listener returns\n   */\n  EditorActions.prototype.trigger = function(action, opts) {\n    if (!this._actions[action]) {\n      throw error(action, NOT_REGISTERED_ERROR);\n    }\n\n    return this._actions[action](opts);\n  };\n\n\n  /**\n   * Registers a collections of actions.\n   * The key of the object will be the name of the action.\n   *\n   * @example\n   *\n   * ```javascript\n   * var actions = {\n   *   spaceTool: function() {\n   *     spaceTool.activateSelection();\n   *   },\n   *   lassoTool: function() {\n   *     lassoTool.activateSelection();\n   *   }\n   * ];\n   *\n   * editorActions.register(actions);\n   *\n   * editorActions.isRegistered('spaceTool'); // true\n   * ```\n   *\n   * @param {Object} actions\n   */\n  EditorActions.prototype.register = function(actions, listener) {\n    var self = this;\n\n    if (typeof actions === 'string') {\n      return this._registerAction(actions, listener);\n    }\n\n    forEach$1(actions, function(listener, action) {\n      self._registerAction(action, listener);\n    });\n  };\n\n  /**\n   * Registers a listener to an action key\n   *\n   * @param {string} action\n   * @param {Function} listener\n   */\n  EditorActions.prototype._registerAction = function(action, listener) {\n    if (this.isRegistered(action)) {\n      throw error(action, IS_REGISTERED_ERROR);\n    }\n\n    this._actions[action] = listener;\n  };\n\n  /**\n   * Unregister an existing action\n   *\n   * @param {string} action\n   */\n  EditorActions.prototype.unregister = function(action) {\n    if (!this.isRegistered(action)) {\n      throw error(action, NOT_REGISTERED_ERROR);\n    }\n\n    this._actions[action] = undefined;\n  };\n\n  /**\n   * Returns the number of actions that are currently registered\n   *\n   * @return {number}\n   */\n  EditorActions.prototype.getActions = function() {\n    return Object.keys(this._actions);\n  };\n\n  /**\n   * Checks wether the given action is registered\n   *\n   * @param {string} action\n   *\n   * @return {boolean}\n   */\n  EditorActions.prototype.isRegistered = function(action) {\n    return !!this._actions[action];\n  };\n\n\n  function error(action, message) {\n    return new Error(action + ' ' + message);\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var EditorActionsModule$1 = {\n    __init__: [ 'editorActions' ],\n    editorActions: [ 'type', EditorActions ]\n  };\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   */\n\n  /**\n   * Registers and executes BPMN specific editor actions.\n   *\n   * @param {Injector} injector\n   */\n  function BpmnEditorActions(injector) {\n    injector.invoke(EditorActions, this);\n  }\n\n  e$3(BpmnEditorActions, EditorActions);\n\n  BpmnEditorActions.$inject = [\n    'injector'\n  ];\n\n  /**\n   * Register default actions.\n   *\n   * @param {Injector} injector\n   */\n  BpmnEditorActions.prototype._registerDefaultActions = function(injector) {\n\n    // (0) invoke super method\n\n    EditorActions.prototype._registerDefaultActions.call(this, injector);\n\n    // (1) retrieve optional components to integrate with\n\n    var canvas = injector.get('canvas', false);\n    var elementRegistry = injector.get('elementRegistry', false);\n    var selection = injector.get('selection', false);\n    var spaceTool = injector.get('spaceTool', false);\n    var lassoTool = injector.get('lassoTool', false);\n    var handTool = injector.get('handTool', false);\n    var globalConnect = injector.get('globalConnect', false);\n    var distributeElements = injector.get('distributeElements', false);\n    var alignElements = injector.get('alignElements', false);\n    var directEditing = injector.get('directEditing', false);\n    var searchPad = injector.get('searchPad', false);\n    var modeling = injector.get('modeling', false);\n    var contextPad = injector.get('contextPad', false);\n\n    // (2) check components and register actions\n\n    if (canvas && elementRegistry && selection) {\n      this._registerAction('selectElements', function() {\n\n        // select all elements except for the invisible\n        // root element\n        var rootElement = canvas.getRootElement();\n\n        var elements = elementRegistry.filter(function(element) {\n          return element !== rootElement;\n        });\n\n        selection.select(elements);\n\n        return elements;\n      });\n    }\n\n    if (spaceTool) {\n      this._registerAction('spaceTool', function() {\n        spaceTool.toggle();\n      });\n    }\n\n    if (lassoTool) {\n      this._registerAction('lassoTool', function() {\n        lassoTool.toggle();\n      });\n    }\n\n    if (handTool) {\n      this._registerAction('handTool', function() {\n        handTool.toggle();\n      });\n    }\n\n    if (globalConnect) {\n      this._registerAction('globalConnectTool', function() {\n        globalConnect.toggle();\n      });\n    }\n\n    if (selection && distributeElements) {\n      this._registerAction('distributeElements', function(opts) {\n        var currentSelection = selection.get(),\n            type = opts.type;\n\n        if (currentSelection.length) {\n          distributeElements.trigger(currentSelection, type);\n        }\n      });\n    }\n\n    if (selection && alignElements) {\n      this._registerAction('alignElements', function(opts) {\n        var currentSelection = selection.get(),\n            aligneableElements = [],\n            type = opts.type;\n\n        if (currentSelection.length) {\n          aligneableElements = filter(currentSelection, function(element) {\n            return !is$1(element, 'bpmn:Lane');\n          });\n\n          alignElements.trigger(aligneableElements, type);\n        }\n      });\n    }\n\n    if (selection && modeling) {\n      this._registerAction('setColor', function(opts) {\n        var currentSelection = selection.get();\n\n        if (currentSelection.length) {\n          modeling.setColor(currentSelection, opts);\n        }\n      });\n    }\n\n    if (selection && directEditing) {\n      this._registerAction('directEditing', function() {\n        var currentSelection = selection.get();\n\n        if (currentSelection.length) {\n          directEditing.activate(currentSelection[0]);\n        }\n      });\n    }\n\n    if (searchPad) {\n      this._registerAction('find', function() {\n        searchPad.toggle();\n      });\n    }\n\n    if (canvas && modeling) {\n      this._registerAction('moveToOrigin', function() {\n        var rootElement = canvas.getRootElement(),\n            boundingBox,\n            elements;\n\n        if (is$1(rootElement, 'bpmn:Collaboration')) {\n          elements = elementRegistry.filter(function(element) {\n            return is$1(element.parent, 'bpmn:Collaboration');\n          });\n        } else {\n          elements = elementRegistry.filter(function(element) {\n            return element !== rootElement && !is$1(element.parent, 'bpmn:SubProcess');\n          });\n        }\n\n        boundingBox = getBBox(elements);\n\n        modeling.moveElements(\n          elements,\n          { x: -boundingBox.x, y: -boundingBox.y },\n          rootElement\n        );\n      });\n    }\n\n    if (selection && contextPad) {\n      this._registerAction('replaceElement', function(event) {\n        contextPad.triggerEntry('replace', 'click', event);\n      });\n    }\n\n  };\n\n  var EditorActionsModule = {\n    __depends__: [\n      EditorActionsModule$1\n    ],\n    editorActions: [ 'type', BpmnEditorActions ]\n  };\n\n  /**\r\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\r\n   */\r\n\r\n  /**\r\n   * @param {EventBus} eventBus\r\n   */\r\n  function BpmnGridSnapping(eventBus) {\r\n    eventBus.on([\r\n      'create.init',\r\n      'shape.move.init'\r\n    ], function(event) {\r\n      var context = event.context,\r\n          shape = event.shape;\r\n\r\n      if (isAny(shape, [\r\n        'bpmn:Participant',\r\n        'bpmn:SubProcess',\r\n        'bpmn:TextAnnotation'\r\n      ])) {\r\n        if (!context.gridSnappingContext) {\r\n          context.gridSnappingContext = {};\r\n        }\r\n\r\n        context.gridSnappingContext.snapLocation = 'top-left';\r\n      }\r\n    });\r\n  }\r\n\r\n  BpmnGridSnapping.$inject = [ 'eventBus' ];\n\n  var SPACING = 10;\n\n  function quantize(value, quantum, fn) {\n    if (!fn) {\n      fn = 'round';\n    }\n\n    return Math[ fn ](value / quantum) * quantum;\n  }\n\n  /**\r\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\r\n   * @typedef {import('../../core/EventBus').default} EventBus\r\n   */\r\n\r\n  var LOWER_PRIORITY$1 = 1200;\r\n  var LOW_PRIORITY$f = 800;\r\n\r\n  /**\r\n   * Basic grid snapping that covers connecting, creating, moving, resizing shapes, moving bendpoints\r\n   * and connection segments.\r\n   *\r\n   * @param {ElementRegistry} elementRegistry\r\n   * @param {EventBus} eventBus\r\n   * @param {Object} config\r\n   */\r\n  function GridSnapping(elementRegistry, eventBus, config) {\r\n\r\n    var active = !config || config.active !== false;\r\n\r\n    this._eventBus = eventBus;\r\n\r\n    var self = this;\r\n\r\n    eventBus.on('diagram.init', LOW_PRIORITY$f, function() {\r\n      self.setActive(active);\r\n    });\r\n\r\n    eventBus.on([\r\n      'create.move',\r\n      'create.end',\r\n      'bendpoint.move.move',\r\n      'bendpoint.move.end',\r\n      'connect.move',\r\n      'connect.end',\r\n      'connectionSegment.move.move',\r\n      'connectionSegment.move.end',\r\n      'resize.move',\r\n      'resize.end',\r\n      'shape.move.move',\r\n      'shape.move.end'\r\n    ], LOWER_PRIORITY$1, function(event) {\r\n      var originalEvent = event.originalEvent;\r\n\r\n      if (!self.active || (originalEvent && isCmd(originalEvent))) {\r\n        return;\r\n      }\r\n\r\n      var context = event.context,\r\n          gridSnappingContext = context.gridSnappingContext;\r\n\r\n      if (!gridSnappingContext) {\r\n        gridSnappingContext = context.gridSnappingContext = {};\r\n      }\r\n\r\n      [ 'x', 'y' ].forEach(function(axis) {\r\n        var options = {};\r\n\r\n        // allow snapping with offset\r\n        var snapOffset = getSnapOffset(event, axis, elementRegistry);\r\n\r\n        if (snapOffset) {\r\n          options.offset = snapOffset;\r\n        }\r\n\r\n        // allow snapping with min and max\r\n        var snapConstraints = getSnapConstraints(event, axis);\r\n\r\n        if (snapConstraints) {\r\n          assign$1(options, snapConstraints);\r\n        }\r\n\r\n        if (!isSnapped(event, axis)) {\r\n          self.snapEvent(event, axis, options);\r\n        }\r\n      });\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Snap an events x or y with optional min, max and offset.\r\n   *\r\n   * @param {Object} event\r\n   * @param {string} axis\r\n   * @param {number} [options.min]\r\n   * @param {number} [options.max]\r\n   * @param {number} [options.offset]\r\n   */\r\n  GridSnapping.prototype.snapEvent = function(event, axis, options) {\r\n    var snappedValue = this.snapValue(event[ axis ], options);\r\n\r\n    setSnapped(event, axis, snappedValue);\r\n  };\r\n\r\n  /**\r\n   * Expose grid spacing for third parties (i.e. extensions).\r\n   *\r\n   * @return {number} spacing of grid dots\r\n   */\r\n  GridSnapping.prototype.getGridSpacing = function() {\r\n    return SPACING;\r\n  };\r\n\r\n  /**\r\n   * Snap value with optional min, max and offset.\r\n   *\r\n   * @param {number} value\r\n   * @param {Object} options\r\n   * @param {number} [options.min]\r\n   * @param {number} [options.max]\r\n   * @param {number} [options.offset]\r\n   */\r\n  GridSnapping.prototype.snapValue = function(value, options) {\r\n    var offset = 0;\r\n\r\n    if (options && options.offset) {\r\n      offset = options.offset;\r\n    }\r\n\r\n    value += offset;\r\n\r\n    value = quantize(value, SPACING);\r\n\r\n    var min, max;\r\n\r\n    if (options && options.min) {\r\n      min = options.min;\r\n\r\n      if (isNumber(min)) {\r\n        min = quantize(min + offset, SPACING, 'ceil');\r\n\r\n        value = Math.max(value, min);\r\n      }\r\n    }\r\n\r\n    if (options && options.max) {\r\n      max = options.max;\r\n\r\n      if (isNumber(max)) {\r\n        max = quantize(max + offset, SPACING, 'floor');\r\n\r\n        value = Math.min(value, max);\r\n      }\r\n    }\r\n\r\n    value -= offset;\r\n\r\n    return value;\r\n  };\r\n\r\n  GridSnapping.prototype.isActive = function() {\r\n    return this.active;\r\n  };\r\n\r\n  GridSnapping.prototype.setActive = function(active) {\r\n    this.active = active;\r\n\r\n    this._eventBus.fire('gridSnapping.toggle', { active: active });\r\n  };\r\n\r\n  GridSnapping.prototype.toggleActive = function() {\r\n    this.setActive(!this.active);\r\n  };\r\n\r\n  GridSnapping.$inject = [\r\n    'elementRegistry',\r\n    'eventBus',\r\n    'config.gridSnapping'\r\n  ];\r\n\r\n  // helpers //////////\r\n\r\n  /**\r\n   * Get minimum and maximum snap constraints.\r\n   * Constraints are cached.\r\n   *\r\n   * @param {Object} event\r\n   * @param {Object} event.context\r\n   * @param {string} axis\r\n   *\r\n   * @return {boolean|Object}\r\n   */\r\n  function getSnapConstraints(event, axis) {\r\n    var context = event.context,\r\n        createConstraints = context.createConstraints,\r\n        resizeConstraints = context.resizeConstraints || {},\r\n        gridSnappingContext = context.gridSnappingContext,\r\n        snapConstraints = gridSnappingContext.snapConstraints;\r\n\r\n    // cache snap constraints\r\n    if (snapConstraints && snapConstraints[ axis ]) {\r\n      return snapConstraints[ axis ];\r\n    }\r\n\r\n    if (!snapConstraints) {\r\n      snapConstraints = gridSnappingContext.snapConstraints = {};\r\n    }\r\n\r\n    if (!snapConstraints[ axis ]) {\r\n      snapConstraints[ axis ] = {};\r\n    }\r\n\r\n    var direction = context.direction;\r\n\r\n    // create\r\n    if (createConstraints) {\r\n      if (isHorizontal$3(axis)) {\r\n        snapConstraints.x.min = createConstraints.left;\r\n        snapConstraints.x.max = createConstraints.right;\r\n      } else {\r\n        snapConstraints.y.min = createConstraints.top;\r\n        snapConstraints.y.max = createConstraints.bottom;\r\n      }\r\n    }\r\n\r\n    // resize\r\n    var minResizeConstraints = resizeConstraints.min,\r\n        maxResizeConstraints = resizeConstraints.max;\r\n\r\n    if (minResizeConstraints) {\r\n      if (isHorizontal$3(axis)) {\r\n\r\n        if (isWest(direction)) {\r\n          snapConstraints.x.max = minResizeConstraints.left;\r\n        } else {\r\n          snapConstraints.x.min = minResizeConstraints.right;\r\n        }\r\n\r\n      } else {\r\n\r\n        if (isNorth(direction)) {\r\n          snapConstraints.y.max = minResizeConstraints.top;\r\n        } else {\r\n          snapConstraints.y.min = minResizeConstraints.bottom;\r\n        }\r\n\r\n      }\r\n    }\r\n\r\n    if (maxResizeConstraints) {\r\n      if (isHorizontal$3(axis)) {\r\n\r\n        if (isWest(direction)) {\r\n          snapConstraints.x.min = maxResizeConstraints.left;\r\n        } else {\r\n          snapConstraints.x.max = maxResizeConstraints.right;\r\n        }\r\n\r\n      } else {\r\n\r\n        if (isNorth(direction)) {\r\n          snapConstraints.y.min = maxResizeConstraints.top;\r\n        } else {\r\n          snapConstraints.y.max = maxResizeConstraints.bottom;\r\n        }\r\n\r\n      }\r\n    }\r\n\r\n    return snapConstraints[ axis ];\r\n  }\r\n\r\n  /**\r\n   * Get snap offset.\r\n   * Offset is cached.\r\n   *\r\n   * @param {Object} event\r\n   * @param {string} axis\r\n   * @param {ElementRegistry} elementRegistry\r\n   *\r\n   * @return {number}\r\n   */\r\n  function getSnapOffset(event, axis, elementRegistry) {\r\n    var context = event.context,\r\n        shape = event.shape,\r\n        gridSnappingContext = context.gridSnappingContext,\r\n        snapLocation = gridSnappingContext.snapLocation,\r\n        snapOffset = gridSnappingContext.snapOffset;\r\n\r\n    // cache snap offset\r\n    if (snapOffset && isNumber(snapOffset[ axis ])) {\r\n      return snapOffset[ axis ];\r\n    }\r\n\r\n    if (!snapOffset) {\r\n      snapOffset = gridSnappingContext.snapOffset = {};\r\n    }\r\n\r\n    if (!isNumber(snapOffset[ axis ])) {\r\n      snapOffset[ axis ] = 0;\r\n    }\r\n\r\n    if (!shape) {\r\n      return snapOffset[ axis ];\r\n    }\r\n\r\n    if (!elementRegistry.get(shape.id)) {\r\n\r\n      if (isHorizontal$3(axis)) {\r\n        snapOffset[ axis ] += shape[ axis ] + shape.width / 2;\r\n      } else {\r\n        snapOffset[ axis ] += shape[ axis ] + shape.height / 2;\r\n      }\r\n    }\r\n\r\n    if (!snapLocation) {\r\n      return snapOffset[ axis ];\r\n    }\r\n\r\n    if (axis === 'x') {\r\n      if (/left/.test(snapLocation)) {\r\n        snapOffset[ axis ] -= shape.width / 2;\r\n      } else if (/right/.test(snapLocation)) {\r\n        snapOffset[ axis ] += shape.width / 2;\r\n      }\r\n    } else {\r\n      if (/top/.test(snapLocation)) {\r\n        snapOffset[ axis ] -= shape.height / 2;\r\n      } else if (/bottom/.test(snapLocation)) {\r\n        snapOffset[ axis ] += shape.height / 2;\r\n      }\r\n    }\r\n\r\n    return snapOffset[ axis ];\r\n  }\r\n\r\n  function isHorizontal$3(axis) {\r\n    return axis === 'x';\r\n  }\r\n\r\n  function isNorth(direction) {\r\n    return direction.indexOf('n') !== -1;\r\n  }\r\n\r\n  function isWest(direction) {\r\n    return direction.indexOf('w') !== -1;\r\n  }\n\n  /**\r\n   * @typedef {import('../../../model/Types').Shape} Shape\r\n   *\r\n   * @typedef {import('../../../util/Types').Rect} Rect\r\n   *\r\n   * @typedef {import('../../../core/EventBus').default} EventBus\r\n   * @typedef {import('../../grid-snapping/GridSnapping').default} GridSnapping\r\n   */\r\n\r\n  /**\r\n   * Integrates resizing with grid snapping.\r\n   *\r\n   * @param {EventBus} eventBus\r\n   * @param {GridSnapping} gridSnapping\r\n   */\r\n  function ResizeBehavior$1(eventBus, gridSnapping) {\r\n    CommandInterceptor.call(this, eventBus);\r\n\r\n    this._gridSnapping = gridSnapping;\r\n\r\n    var self = this;\r\n\r\n    this.preExecute('shape.resize', function(event) {\r\n      var context = event.context,\r\n          hints = context.hints || {},\r\n          autoResize = hints.autoResize;\r\n\r\n      if (!autoResize) {\r\n        return;\r\n      }\r\n\r\n      var shape = context.shape,\r\n          newBounds = context.newBounds;\r\n\r\n      if (isString(autoResize)) {\r\n        context.newBounds = self.snapComplex(newBounds, autoResize);\r\n      } else {\r\n        context.newBounds = self.snapSimple(shape, newBounds);\r\n      }\r\n    });\r\n  }\r\n\r\n  ResizeBehavior$1.$inject = [\r\n    'eventBus',\r\n    'gridSnapping',\r\n    'modeling'\r\n  ];\r\n\r\n  e$3(ResizeBehavior$1, CommandInterceptor);\r\n\r\n  /**\r\n   * Snap width and height in relation to center.\r\n   *\r\n   * @param {Shape} shape\r\n   * @param {Rect} newBounds\r\n   *\r\n   * @return {Rect} Snapped bounds.\r\n   */\r\n  ResizeBehavior$1.prototype.snapSimple = function(shape, newBounds) {\r\n    var gridSnapping = this._gridSnapping;\r\n\r\n    newBounds.width = gridSnapping.snapValue(newBounds.width, {\r\n      min: newBounds.width\r\n    });\r\n\r\n    newBounds.height = gridSnapping.snapValue(newBounds.height, {\r\n      min: newBounds.height\r\n    });\r\n\r\n    newBounds.x = shape.x + (shape.width / 2) - (newBounds.width / 2);\r\n    newBounds.y = shape.y + (shape.height / 2) - (newBounds.height / 2);\r\n\r\n    return newBounds;\r\n  };\r\n\r\n  /**\r\n   * Snap x, y, width and height according to given directions.\r\n   *\r\n   * @param {Rect} newBounds\r\n   * @param {string} directions - Directions as {n|w|s|e}.\r\n   *\r\n   * @return {Rect} Snapped bounds.\r\n   */\r\n  ResizeBehavior$1.prototype.snapComplex = function(newBounds, directions) {\r\n    if (/w|e/.test(directions)) {\r\n      newBounds = this.snapHorizontally(newBounds, directions);\r\n    }\r\n\r\n    if (/n|s/.test(directions)) {\r\n      newBounds = this.snapVertically(newBounds, directions);\r\n    }\r\n\r\n    return newBounds;\r\n  };\r\n\r\n  /**\r\n   * Snap in one or both directions horizontally.\r\n   *\r\n   * @param {Rect} newBounds\r\n   * @param {string} directions - Directions as {n|w|s|e}.\r\n   *\r\n   * @return {Rect} Snapped bounds.\r\n   */\r\n  ResizeBehavior$1.prototype.snapHorizontally = function(newBounds, directions) {\r\n    var gridSnapping = this._gridSnapping,\r\n        west = /w/.test(directions),\r\n        east = /e/.test(directions);\r\n\r\n    var snappedNewBounds = {};\r\n\r\n    snappedNewBounds.width = gridSnapping.snapValue(newBounds.width, {\r\n      min: newBounds.width\r\n    });\r\n\r\n    if (east) {\r\n\r\n      // handle <we>\r\n      if (west) {\r\n        snappedNewBounds.x = gridSnapping.snapValue(newBounds.x, {\r\n          max: newBounds.x\r\n        });\r\n\r\n        snappedNewBounds.width += gridSnapping.snapValue(newBounds.x - snappedNewBounds.x, {\r\n          min: newBounds.x - snappedNewBounds.x\r\n        });\r\n      }\r\n\r\n      // handle <e>\r\n      else {\r\n        newBounds.x = newBounds.x + newBounds.width - snappedNewBounds.width;\r\n      }\r\n    }\r\n\r\n    // assign snapped x and width\r\n    assign$1(newBounds, snappedNewBounds);\r\n\r\n    return newBounds;\r\n  };\r\n\r\n  /**\r\n   * Snap in one or both directions vertically.\r\n   *\r\n   * @param {Rect} newBounds\r\n   * @param {string} directions - Directions as {n|w|s|e}.\r\n   *\r\n   * @return {Rect} Snapped bounds.\r\n   */\r\n  ResizeBehavior$1.prototype.snapVertically = function(newBounds, directions) {\r\n    var gridSnapping = this._gridSnapping,\r\n        north = /n/.test(directions),\r\n        south = /s/.test(directions);\r\n\r\n    var snappedNewBounds = {};\r\n\r\n    snappedNewBounds.height = gridSnapping.snapValue(newBounds.height, {\r\n      min: newBounds.height\r\n    });\r\n\r\n    if (north) {\r\n\r\n      // handle <ns>\r\n      if (south) {\r\n        snappedNewBounds.y = gridSnapping.snapValue(newBounds.y, {\r\n          max: newBounds.y\r\n        });\r\n\r\n        snappedNewBounds.height += gridSnapping.snapValue(newBounds.y - snappedNewBounds.y, {\r\n          min: newBounds.y - snappedNewBounds.y\r\n        });\r\n      }\r\n\r\n      // handle <n>\r\n      else {\r\n        newBounds.y = newBounds.y + newBounds.height - snappedNewBounds.height;\r\n      }\r\n    }\r\n\r\n    // assign snapped y and height\r\n    assign$1(newBounds, snappedNewBounds);\r\n\r\n    return newBounds;\r\n  };\n\n  /**\r\n   * @typedef {import('../../../core/EventBus').default} EventBus\r\n   * @typedef {import('../../grid-snapping/GridSnapping').default} GridSnapping\r\n   */\r\n\r\n  var HIGH_PRIORITY$f = 2000;\r\n\r\n  /**\r\n   * Integrates space tool with grid snapping.\r\n   *\r\n   * @param {EventBus} eventBus\r\n   * @param {GridSnapping} gridSnapping\r\n   */\r\n  function SpaceToolBehavior$1(eventBus, gridSnapping) {\r\n    eventBus.on([\r\n      'spaceTool.move',\r\n      'spaceTool.end'\r\n    ], HIGH_PRIORITY$f, function(event) {\r\n      var context = event.context;\r\n\r\n      if (!context.initialized) {\r\n        return;\r\n      }\r\n\r\n      var axis = context.axis;\r\n\r\n      var snapped;\r\n\r\n      if (axis === 'x') {\r\n\r\n        // snap delta x to multiple of 10\r\n        snapped = gridSnapping.snapValue(event.dx);\r\n\r\n        event.x = event.x + snapped - event.dx;\r\n        event.dx = snapped;\r\n      } else {\r\n\r\n        // snap delta y to multiple of 10\r\n        snapped = gridSnapping.snapValue(event.dy);\r\n\r\n        event.y = event.y + snapped - event.dy;\r\n        event.dy = snapped;\r\n      }\r\n    });\r\n  }\r\n\r\n  SpaceToolBehavior$1.$inject = [\r\n    'eventBus',\r\n    'gridSnapping'\r\n  ];\n\n  var GridSnappingBehaviorModule$1 = {\r\n    __init__: [\r\n      'gridSnappingResizeBehavior',\r\n      'gridSnappingSpaceToolBehavior'\r\n    ],\r\n    gridSnappingResizeBehavior: [ 'type', ResizeBehavior$1 ],\r\n    gridSnappingSpaceToolBehavior: [ 'type', SpaceToolBehavior$1 ]\r\n  };\n\n  /**\r\n   * @type { import('didi').ModuleDeclaration }\r\n   */\r\n  var GridSnappingModule$1 = {\r\n    __depends__: [ GridSnappingBehaviorModule$1 ],\r\n    __init__: [ 'gridSnapping' ],\r\n    gridSnapping: [ 'type', GridSnapping ]\r\n  };\n\n  /**\r\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\r\n   * @typedef {import('diagram-js/lib/features/grid-snapping/GridSnapping').default} GridSnapping\r\n   *\r\n   * @typedef {import('diagram-js/lib/util/Types').Axis} Axis\r\n   */\r\n\r\n  var HIGH_PRIORITY$e = 2000;\r\n\r\n  /**\r\n   * @param {EventBus} eventBus\r\n   * @param {GridSnapping} gridSnapping\r\n   */\r\n  function GridSnappingAutoPlaceBehavior(eventBus, gridSnapping) {\r\n    eventBus.on('autoPlace', HIGH_PRIORITY$e, function(context) {\r\n      var source = context.source,\r\n          sourceMid = getMid(source),\r\n          shape = context.shape;\r\n\r\n      var position = getNewShapePosition(source, shape);\r\n\r\n      [ 'x', 'y' ].forEach(function(axis) {\r\n        var options = {};\r\n\r\n        // do not snap if x/y equal\r\n        if (position[ axis ] === sourceMid[ axis ]) {\r\n          return;\r\n        }\r\n\r\n        if (position[ axis ] > sourceMid[ axis ]) {\r\n          options.min = position[ axis ];\r\n        } else {\r\n          options.max = position[ axis ];\r\n        }\r\n\r\n        if (is$1(shape, 'bpmn:TextAnnotation')) {\r\n\r\n          if (isHorizontal$2(axis)) {\r\n            options.offset = -shape.width / 2;\r\n          } else {\r\n            options.offset = -shape.height / 2;\r\n          }\r\n\r\n        }\r\n\r\n        position[ axis ] = gridSnapping.snapValue(position[ axis ], options);\r\n\r\n      });\r\n\r\n      // must be returned to be considered by auto place\r\n      return position;\r\n    });\r\n  }\r\n\r\n  GridSnappingAutoPlaceBehavior.$inject = [\r\n    'eventBus',\r\n    'gridSnapping'\r\n  ];\r\n\r\n  // helpers //////////\r\n\r\n  /**\r\n   * @param {Axis} axis\r\n   *\r\n   * @return {boolean}\r\n   */\r\n  function isHorizontal$2(axis) {\r\n    return axis === 'x';\r\n  }\n\n  /**\r\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\r\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\r\n   * @typedef {import('diagram-js/lib/features/grid-snapping/GridSnapping').default} GridSnapping\r\n   */\r\n\r\n  var HIGHER_PRIORITY$4 = 1750;\r\n\r\n  /**\r\n   * @param {Canvas} canvas\r\n   * @param {EventBus} eventBus\r\n   * @param {GridSnapping} gridSnapping\r\n   */\r\n  function GridSnappingParticipantBehavior(canvas, eventBus, gridSnapping) {\r\n    eventBus.on([\r\n      'create.start',\r\n      'shape.move.start'\r\n    ], HIGHER_PRIORITY$4, function(event) {\r\n      var context = event.context,\r\n          shape = context.shape,\r\n          rootElement = canvas.getRootElement();\r\n\r\n      if (!is$1(shape, 'bpmn:Participant') ||\r\n        !is$1(rootElement, 'bpmn:Process') ||\r\n        !rootElement.children.length) {\r\n        return;\r\n      }\r\n\r\n      var createConstraints = context.createConstraints;\r\n\r\n      if (!createConstraints) {\r\n        return;\r\n      }\r\n\r\n      shape.width = gridSnapping.snapValue(shape.width, { min: shape.width });\r\n      shape.height = gridSnapping.snapValue(shape.height, { min: shape.height });\r\n    });\r\n  }\r\n\r\n  GridSnappingParticipantBehavior.$inject = [\r\n    'canvas',\r\n    'eventBus',\r\n    'gridSnapping'\r\n  ];\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('diagram-js/lib/features/grid-snapping/GridSnapping').default} GridSnapping\n   * @typedef {import('../../modeling/Modeling').default} Modeling\n   *\n   * @typedef {import('diagram-js/lib/util/Types').Point} Point\n   */\n\n  var HIGH_PRIORITY$d = 3000;\n\n\n  /**\n   * Snaps connections with Manhattan layout.\n   *\n   * @param {EventBus} eventBus\n   * @param {GridSnapping} gridSnapping\n   * @param {Modeling} modeling\n   */\n  function GridSnappingLayoutConnectionBehavior(eventBus, gridSnapping, modeling) {\n    CommandInterceptor.call(this, eventBus);\n\n    this._gridSnapping = gridSnapping;\n\n    var self = this;\n\n    this.postExecuted([\n      'connection.create',\n      'connection.layout'\n    ], HIGH_PRIORITY$d, function(event) {\n      var context = event.context,\n          connection = context.connection,\n          hints = context.hints || {},\n          waypoints = connection.waypoints;\n\n      if (hints.connectionStart || hints.connectionEnd || hints.createElementsBehavior === false) {\n        return;\n      }\n\n      if (!hasMiddleSegments(waypoints)) {\n        return;\n      }\n\n      modeling.updateWaypoints(connection, self.snapMiddleSegments(waypoints));\n    });\n  }\n\n  GridSnappingLayoutConnectionBehavior.$inject = [\n    'eventBus',\n    'gridSnapping',\n    'modeling'\n  ];\n\n  e$3(GridSnappingLayoutConnectionBehavior, CommandInterceptor);\n\n  /**\n   * Snap middle segments of a given connection.\n   *\n   * @param {Point[]} waypoints\n   *\n   * @return {Point[]}\n   */\n  GridSnappingLayoutConnectionBehavior.prototype.snapMiddleSegments = function(waypoints) {\n    var gridSnapping = this._gridSnapping,\n        snapped;\n\n    waypoints = waypoints.slice();\n\n    for (var i = 1; i < waypoints.length - 2; i++) {\n\n      snapped = snapSegment(gridSnapping, waypoints[i], waypoints[i + 1]);\n\n      waypoints[i] = snapped[0];\n      waypoints[i + 1] = snapped[1];\n    }\n\n    return waypoints;\n  };\n\n\n  // helpers //////////\n\n  /**\n   * Check whether a connection has a middle segments.\n   *\n   * @param {Point[]} waypoints\n   *\n   * @return {boolean}\n   */\n  function hasMiddleSegments(waypoints) {\n    return waypoints.length > 3;\n  }\n\n  /**\n   * Check whether an alignment is horizontal.\n   *\n   * @param {string} aligned\n   *\n   * @return {boolean}\n   */\n  function horizontallyAligned(aligned) {\n    return aligned === 'h';\n  }\n\n  /**\n   * Check whether an alignment is vertical.\n   *\n   * @param {string} aligned\n   *\n   * @return {boolean}\n   */\n  function verticallyAligned(aligned) {\n    return aligned === 'v';\n  }\n\n  /**\n   * Get middle segments from a given connection.\n   *\n   * @param {Point[]} waypoints\n   *\n   * @return {Point[]}\n   */\n  function snapSegment(gridSnapping, segmentStart, segmentEnd) {\n\n    var aligned = pointsAligned(segmentStart, segmentEnd);\n\n    var snapped = {};\n\n    if (horizontallyAligned(aligned)) {\n\n      // snap horizontally\n      snapped.y = gridSnapping.snapValue(segmentStart.y);\n    }\n\n    if (verticallyAligned(aligned)) {\n\n      // snap vertically\n      snapped.x = gridSnapping.snapValue(segmentStart.x);\n    }\n\n    if ('x' in snapped || 'y' in snapped) {\n      segmentStart = assign$1({}, segmentStart, snapped);\n      segmentEnd = assign$1({}, segmentEnd, snapped);\n    }\n\n    return [ segmentStart, segmentEnd ];\n  }\n\n  var GridSnappingBehaviorModule = {\r\n    __init__: [\r\n      'gridSnappingAutoPlaceBehavior',\r\n      'gridSnappingParticipantBehavior',\r\n      'gridSnappingLayoutConnectionBehavior',\r\n    ],\r\n    gridSnappingAutoPlaceBehavior: [ 'type', GridSnappingAutoPlaceBehavior ],\r\n    gridSnappingParticipantBehavior: [ 'type', GridSnappingParticipantBehavior ],\r\n    gridSnappingLayoutConnectionBehavior: [ 'type', GridSnappingLayoutConnectionBehavior ]\r\n  };\n\n  var GridSnappingModule = {\r\n    __depends__: [\r\n      GridSnappingModule$1,\r\n      GridSnappingBehaviorModule\r\n    ],\r\n    __init__: [ 'bpmnGridSnapping' ],\r\n    bpmnGridSnapping: [ 'type', BpmnGridSnapping ]\r\n  };\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('diagram-js/lib/features/interaction-events/InteractionEvents').default} InteractionEvents\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Shape} Shape\n   */\n\n  var LABEL_WIDTH = 30,\n      LABEL_HEIGHT = 30;\n\n\n  /**\n   * BPMN-specific hit zones and interaction fixes.\n   *\n   * @param {EventBus} eventBus\n   * @param {InteractionEvents} interactionEvents\n   */\n  function BpmnInteractionEvents(eventBus, interactionEvents) {\n\n    this._interactionEvents = interactionEvents;\n\n    var self = this;\n\n    eventBus.on([\n      'interactionEvents.createHit',\n      'interactionEvents.updateHit'\n    ], function(context) {\n      var element = context.element,\n          gfx = context.gfx;\n\n      if (is$1(element, 'bpmn:Lane')) {\n        return self._createParticipantHit(element, gfx);\n      } else\n\n      if (is$1(element, 'bpmn:Participant')) {\n        if (isExpanded(element)) {\n          return self._createParticipantHit(element, gfx);\n        } else {\n          return self._createDefaultHit(element, gfx);\n        }\n      } else\n\n      if (is$1(element, 'bpmn:SubProcess')) {\n        if (isExpanded(element)) {\n          return self._createSubProcessHit(element, gfx);\n        } else {\n          return self._createDefaultHit(element, gfx);\n        }\n      }\n    });\n\n  }\n\n  BpmnInteractionEvents.$inject = [\n    'eventBus',\n    'interactionEvents'\n  ];\n\n  /**\n   * @param {Element} element\n   * @param {SVGElement} gfx\n   *\n   * @return {boolean}\n   */\n  BpmnInteractionEvents.prototype._createDefaultHit = function(element, gfx) {\n    this._interactionEvents.removeHits(gfx);\n\n    this._interactionEvents.createDefaultHit(element, gfx);\n\n    // indicate that we created a hit\n    return true;\n  };\n\n  /**\n   * @param {Shape} element\n   * @param {SVGElement} gfx\n   *\n   * @return {boolean}\n   */\n  BpmnInteractionEvents.prototype._createParticipantHit = function(element, gfx) {\n\n    // remove existing hits\n    this._interactionEvents.removeHits(gfx);\n\n    // add body hit\n    this._interactionEvents.createBoxHit(gfx, 'no-move', {\n      width: element.width,\n      height: element.height\n    });\n\n    // add outline hit\n    this._interactionEvents.createBoxHit(gfx, 'click-stroke', {\n      width: element.width,\n      height: element.height\n    });\n\n    // add label hit\n    this._interactionEvents.createBoxHit(gfx, 'all', {\n      width: LABEL_WIDTH,\n      height: element.height\n    });\n\n    // indicate that we created a hit\n    return true;\n  };\n\n  /**\n   * @param {Shape} element\n   * @param {SVGElement} gfx\n   *\n   * @return {boolean}\n   */\n  BpmnInteractionEvents.prototype._createSubProcessHit = function(element, gfx) {\n\n    // remove existing hits\n    this._interactionEvents.removeHits(gfx);\n\n    // add body hit\n    this._interactionEvents.createBoxHit(gfx, 'no-move', {\n      width: element.width,\n      height: element.height\n    });\n\n    // add outline hit\n    this._interactionEvents.createBoxHit(gfx, 'click-stroke', {\n      width: element.width,\n      height: element.height\n    });\n\n    // add label hit\n    this._interactionEvents.createBoxHit(gfx, 'all', {\n      width: element.width,\n      height: LABEL_HEIGHT\n    });\n\n    // indicate that we created a hit\n    return true;\n  };\n\n  var InteractionEventsModule = {\n    __init__: [ 'bpmnInteractionEvents' ],\n    bpmnInteractionEvents: [ 'type', BpmnInteractionEvents ]\n  };\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   * @typedef {import('diagram-js/lib/features/editor-actions/EditorActions').default} EditorActions\n   * @typedef {import('diagram-js/lib/features/keyboard/Keyboard').default} Keyboard\n   */\n\n  /**\n   * BPMN 2.0 specific keyboard bindings.\n   *\n   * @param {Injector} injector\n   */\n  function BpmnKeyboardBindings(injector) {\n    injector.invoke(KeyboardBindings, this);\n  }\n\n  e$3(BpmnKeyboardBindings, KeyboardBindings);\n\n  BpmnKeyboardBindings.$inject = [\n    'injector'\n  ];\n\n\n  /**\n   * Register available keyboard bindings.\n   *\n   * @param {Keyboard} keyboard\n   * @param {EditorActions} editorActions\n   */\n  BpmnKeyboardBindings.prototype.registerBindings = function(keyboard, editorActions) {\n\n    // inherit default bindings\n    KeyboardBindings.prototype.registerBindings.call(this, keyboard, editorActions);\n\n    /**\n     * Add keyboard binding if respective editor action\n     * is registered.\n     *\n     * @param {string} action name\n     * @param {Function} fn that implements the key binding\n     */\n    function addListener(action, fn) {\n\n      if (editorActions.isRegistered(action)) {\n        keyboard.addListener(fn);\n      }\n    }\n\n    // select all elements\n    // CTRL + A\n    addListener('selectElements', function(context) {\n\n      var event = context.keyEvent;\n\n      if (keyboard.isKey([ 'a', 'A' ], event) && keyboard.isCmd(event)) {\n        editorActions.trigger('selectElements');\n\n        return true;\n      }\n    });\n\n    // search labels\n    // CTRL + F\n    addListener('find', function(context) {\n\n      var event = context.keyEvent;\n\n      if (keyboard.isKey([ 'f', 'F' ], event) && keyboard.isCmd(event)) {\n        editorActions.trigger('find');\n\n        return true;\n      }\n    });\n\n    // activate space tool\n    // S\n    addListener('spaceTool', function(context) {\n\n      var event = context.keyEvent;\n\n      if (keyboard.hasModifier(event)) {\n        return;\n      }\n\n      if (keyboard.isKey([ 's', 'S' ], event)) {\n        editorActions.trigger('spaceTool');\n\n        return true;\n      }\n    });\n\n    // activate lasso tool\n    // L\n    addListener('lassoTool', function(context) {\n\n      var event = context.keyEvent;\n\n      if (keyboard.hasModifier(event)) {\n        return;\n      }\n\n      if (keyboard.isKey([ 'l', 'L' ], event)) {\n        editorActions.trigger('lassoTool');\n\n        return true;\n      }\n    });\n\n    // activate hand tool\n    // H\n    addListener('handTool', function(context) {\n\n      var event = context.keyEvent;\n\n      if (keyboard.hasModifier(event)) {\n        return;\n      }\n\n      if (keyboard.isKey([ 'h', 'H' ], event)) {\n        editorActions.trigger('handTool');\n\n        return true;\n      }\n    });\n\n    // activate global connect tool\n    // C\n    addListener('globalConnectTool', function(context) {\n\n      var event = context.keyEvent;\n\n      if (keyboard.hasModifier(event)) {\n        return;\n      }\n\n      if (keyboard.isKey([ 'c', 'C' ], event)) {\n        editorActions.trigger('globalConnectTool');\n\n        return true;\n      }\n    });\n\n    // activate direct editing\n    // E\n    addListener('directEditing', function(context) {\n\n      var event = context.keyEvent;\n\n      if (keyboard.hasModifier(event)) {\n        return;\n      }\n\n      if (keyboard.isKey([ 'e', 'E' ], event)) {\n        editorActions.trigger('directEditing');\n\n        return true;\n      }\n    });\n\n    // activate replace element\n    // R\n    addListener('replaceElement', function(context) {\n\n      var event = context.keyEvent;\n\n      if (keyboard.hasModifier(event)) {\n        return;\n      }\n\n      if (keyboard.isKey([ 'r', 'R' ], event)) {\n        editorActions.trigger('replaceElement', event);\n\n        return true;\n      }\n    });\n\n  };\n\n  var KeyboardModule = {\n    __depends__: [\n      KeyboardModule$1\n    ],\n    __init__: [ 'keyboardBindings' ],\n    keyboardBindings: [ 'type', BpmnKeyboardBindings ]\n  };\n\n  /**\n   * @typedef {import('../keyboard/Keyboard').default} Keyboard\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   * @typedef {import('../rules/Rules').default} Rules\n   * @typedef {import('../selection/Selection').default} Selection\n   */\n\n  var DEFAULT_CONFIG = {\n    moveSpeed: 1,\n    moveSpeedAccelerated: 10\n  };\n\n  var HIGHER_PRIORITY$3 = 1500;\n\n  var LEFT = 'left';\n  var UP = 'up';\n  var RIGHT = 'right';\n  var DOWN = 'down';\n\n  var KEY_TO_DIRECTION = {\n    ArrowLeft: LEFT,\n    Left: LEFT,\n    ArrowUp: UP,\n    Up: UP,\n    ArrowRight: RIGHT,\n    Right: RIGHT,\n    ArrowDown: DOWN,\n    Down: DOWN\n  };\n\n  var DIRECTIONS_DELTA = {\n    left: function(speed) {\n      return {\n        x: -speed,\n        y: 0\n      };\n    },\n    up: function(speed) {\n      return {\n        x: 0,\n        y: -speed\n      };\n    },\n    right: function(speed) {\n      return {\n        x: speed,\n        y: 0\n      };\n    },\n    down: function(speed) {\n      return {\n        x: 0,\n        y: speed\n      };\n    }\n  };\n\n\n  /**\n   * Enables to move selection with keyboard arrows.\n   * Use with Shift for modified speed (default=1, with Shift=10).\n   * Pressed Cmd/Ctrl turns the feature off.\n   *\n   * @param {Object} config\n   * @param {number} [config.moveSpeed=1]\n   * @param {number} [config.moveSpeedAccelerated=10]\n   * @param {Keyboard} keyboard\n   * @param {Modeling} modeling\n   * @param {Rules} rules\n   * @param {Selection} selection\n   */\n  function KeyboardMoveSelection(\n      config,\n      keyboard,\n      modeling,\n      rules,\n      selection\n  ) {\n\n    var self = this;\n\n    this._config = assign$1({}, DEFAULT_CONFIG, config || {});\n\n    keyboard.addListener(HIGHER_PRIORITY$3, function(event) {\n\n      var keyEvent = event.keyEvent;\n\n      var direction = KEY_TO_DIRECTION[keyEvent.key];\n\n      if (!direction) {\n        return;\n      }\n\n      if (keyboard.isCmd(keyEvent)) {\n        return;\n      }\n\n      var accelerated = keyboard.isShift(keyEvent);\n\n      self.moveSelection(direction, accelerated);\n\n      return true;\n    });\n\n\n    /**\n     * Move selected elements in the given direction,\n     * optionally specifying accelerated movement.\n     *\n     * @param {string} direction\n     * @param {boolean} [accelerated=false]\n     */\n    this.moveSelection = function(direction, accelerated) {\n\n      var selectedElements = selection.get();\n\n      if (!selectedElements.length) {\n        return;\n      }\n\n      var speed = this._config[\n        accelerated ?\n          'moveSpeedAccelerated' :\n          'moveSpeed'\n      ];\n\n      var delta = DIRECTIONS_DELTA[direction](speed);\n\n      var canMove = rules.allowed('elements.move', {\n        shapes: selectedElements\n      });\n\n      if (canMove) {\n        modeling.moveElements(selectedElements, delta);\n      }\n    };\n\n  }\n\n  KeyboardMoveSelection.$inject = [\n    'config.keyboardMoveSelection',\n    'keyboard',\n    'modeling',\n    'rules',\n    'selection'\n  ];\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var KeyboardMoveSelectionModule = {\n    __depends__: [\n      KeyboardModule$1,\n      SelectionModule\n    ],\n    __init__: [\n      'keyboardMoveSelection'\n    ],\n    keyboardMoveSelection: [ 'type', KeyboardMoveSelection ]\n  };\n\n  /**\n   * @typedef {import('../../core/Types').ShapeLike} Shape\n   *\n   * @typedef {import('../../util/Types').Direction} Direction\n   * @typedef {import('../../util/Types').Point} Point\n   *\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../dragging/Dragging').default} Dragging\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   * @typedef {import('../rules/Rules').default} Rules\n   */\n\n  var DEFAULT_MIN_WIDTH = 10;\n\n\n  /**\n   * A component that provides resizing of shapes on the canvas.\n   *\n   * The following components are part of shape resize:\n   *\n   *  * adding resize handles,\n   *  * creating a visual during resize\n   *  * checking resize rules\n   *  * committing a change once finished\n   *\n   *\n   * ## Customizing\n   *\n   * It's possible to customize the resizing behaviour by intercepting 'resize.start'\n   * and providing the following parameters through the 'context':\n   *\n   *   * minDimensions ({ width, height }): minimum shape dimensions\n   *\n   *   * childrenBoxPadding ({ left, top, bottom, right } || number):\n   *     gap between the minimum bounding box and the container\n   *\n   * f.ex:\n   *\n   * ```javascript\n   * eventBus.on('resize.start', 1500, function(event) {\n   *   var context = event.context,\n   *\n   *  context.minDimensions = { width: 140, height: 120 };\n   *\n   *  // Passing general padding\n   *  context.childrenBoxPadding = 30;\n   *\n   *  // Passing padding to a specific side\n   *  context.childrenBoxPadding.left = 20;\n   * });\n   * ```\n   *\n   * @param {EventBus} eventBus\n   * @param {Rules} rules\n   * @param {Modeling} modeling\n   * @param {Dragging} dragging\n   */\n  function Resize(eventBus, rules, modeling, dragging) {\n\n    this._dragging = dragging;\n    this._rules = rules;\n\n    var self = this;\n\n\n    /**\n     * Handle resize move by specified delta.\n     *\n     * @param {Object} context\n     * @param {Point} delta\n     */\n    function handleMove(context, delta) {\n\n      var shape = context.shape,\n          direction = context.direction,\n          resizeConstraints = context.resizeConstraints,\n          newBounds;\n\n      context.delta = delta;\n\n      newBounds = resizeBounds$1(shape, direction, delta);\n\n      // ensure constraints during resize\n      context.newBounds = ensureConstraints$1(newBounds, resizeConstraints);\n\n      // update + cache executable state\n      context.canExecute = self.canResize(context);\n    }\n\n    /**\n     * Handle resize start.\n     *\n     * @param {Object} context\n     */\n    function handleStart(context) {\n\n      var resizeConstraints = context.resizeConstraints,\n\n          // evaluate minBounds for backwards compatibility\n          minBounds = context.minBounds;\n\n      if (resizeConstraints !== undefined) {\n        return;\n      }\n\n      if (minBounds === undefined) {\n        minBounds = self.computeMinResizeBox(context);\n      }\n\n      context.resizeConstraints = {\n        min: asTRBL(minBounds)\n      };\n    }\n\n    /**\n     * Handle resize end.\n     *\n     * @param {Object} context\n     */\n    function handleEnd(context) {\n      var shape = context.shape,\n          canExecute = context.canExecute,\n          newBounds = context.newBounds;\n\n      if (canExecute) {\n\n        // ensure we have actual pixel values for new bounds\n        // (important when zoom level was > 1 during move)\n        newBounds = roundBounds(newBounds);\n\n        if (!boundsChanged(shape, newBounds)) {\n\n          // no resize necessary\n          return;\n        }\n\n        // perform the actual resize\n        modeling.resizeShape(shape, newBounds);\n      }\n    }\n\n\n    eventBus.on('resize.start', function(event) {\n      handleStart(event.context);\n    });\n\n    eventBus.on('resize.move', function(event) {\n      var delta = {\n        x: event.dx,\n        y: event.dy\n      };\n\n      handleMove(event.context, delta);\n    });\n\n    eventBus.on('resize.end', function(event) {\n      handleEnd(event.context);\n    });\n\n  }\n\n\n  Resize.prototype.canResize = function(context) {\n    var rules = this._rules;\n\n    var ctx = pick(context, [ 'newBounds', 'shape', 'delta', 'direction' ]);\n\n    return rules.allowed('shape.resize', ctx);\n  };\n\n  /**\n   * Activate a resize operation.\n   *\n   * You may specify additional contextual information and must specify a\n   * resize direction during activation of the resize event.\n   *\n   * @param {MouseEvent|TouchEvent} event\n   * @param {Shape} shape\n   * @param {Object|Direction} contextOrDirection\n   */\n  Resize.prototype.activate = function(event, shape, contextOrDirection) {\n    var dragging = this._dragging,\n        context,\n        direction;\n\n    if (typeof contextOrDirection === 'string') {\n      contextOrDirection = {\n        direction: contextOrDirection\n      };\n    }\n\n    context = assign$1({ shape: shape }, contextOrDirection);\n\n    direction = context.direction;\n\n    if (!direction) {\n      throw new Error('must provide a direction (n|w|s|e|nw|se|ne|sw)');\n    }\n\n    dragging.init(event, getReferencePoint$1(shape, direction), 'resize', {\n      autoActivate: true,\n      cursor: getCursor(direction),\n      data: {\n        shape: shape,\n        context: context\n      }\n    });\n  };\n\n  Resize.prototype.computeMinResizeBox = function(context) {\n    var shape = context.shape,\n        direction = context.direction,\n        minDimensions,\n        childrenBounds;\n\n    minDimensions = context.minDimensions || {\n      width: DEFAULT_MIN_WIDTH,\n      height: DEFAULT_MIN_WIDTH\n    };\n\n    // get children bounds\n    childrenBounds = computeChildrenBBox(shape, context.childrenBoxPadding);\n\n    // get correct minimum bounds from given resize direction\n    // basically ensures that the minBounds is max(childrenBounds, minDimensions)\n    return getMinResizeBounds(direction, shape, minDimensions, childrenBounds);\n  };\n\n\n  Resize.$inject = [\n    'eventBus',\n    'rules',\n    'modeling',\n    'dragging'\n  ];\n\n  // helpers //////////\n\n  function boundsChanged(shape, newBounds) {\n    return shape.x !== newBounds.x ||\n      shape.y !== newBounds.y ||\n      shape.width !== newBounds.width ||\n      shape.height !== newBounds.height;\n  }\n\n  function getReferencePoint$1(shape, direction) {\n    var mid = getMid(shape),\n        trbl = asTRBL(shape);\n\n    var referencePoint = {\n      x: mid.x,\n      y: mid.y\n    };\n\n    if (direction.indexOf('n') !== -1) {\n      referencePoint.y = trbl.top;\n    } else if (direction.indexOf('s') !== -1) {\n      referencePoint.y = trbl.bottom;\n    }\n\n    if (direction.indexOf('e') !== -1) {\n      referencePoint.x = trbl.right;\n    } else if (direction.indexOf('w') !== -1) {\n      referencePoint.x = trbl.left;\n    }\n\n    return referencePoint;\n  }\n\n  function getCursor(direction) {\n    var prefix = 'resize-';\n\n    if (direction === 'n' || direction === 's') {\n      return prefix + 'ns';\n    } else if (direction === 'e' || direction === 'w') {\n      return prefix + 'ew';\n    } else if (direction === 'nw' || direction === 'se') {\n      return prefix + 'nwse';\n    } else {\n      return prefix + 'nesw';\n    }\n  }\n\n  var MARKER_RESIZING$1 = 'djs-resizing',\n      MARKER_RESIZE_NOT_OK = 'resize-not-ok';\n\n  var LOW_PRIORITY$e = 500;\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../preview-support/PreviewSupport').default} PreviewSupport\n   */\n\n  /**\n   * Provides previews for resizing shapes when resizing.\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {PreviewSupport} previewSupport\n   */\n  function ResizePreview(eventBus, canvas, previewSupport) {\n\n    /**\n     * Update resizer frame.\n     *\n     * @param {Object} context\n     */\n    function updateFrame(context) {\n\n      var shape = context.shape,\n          bounds = context.newBounds,\n          frame = context.frame;\n\n      if (!frame) {\n        frame = context.frame = previewSupport.addFrame(shape, canvas.getActiveLayer());\n\n        canvas.addMarker(shape, MARKER_RESIZING$1);\n      }\n\n      if (bounds.width > 5) {\n        attr(frame, { x: bounds.x, width: bounds.width });\n      }\n\n      if (bounds.height > 5) {\n        attr(frame, { y: bounds.y, height: bounds.height });\n      }\n\n      if (context.canExecute) {\n        classes(frame).remove(MARKER_RESIZE_NOT_OK);\n      } else {\n        classes(frame).add(MARKER_RESIZE_NOT_OK);\n      }\n    }\n\n    /**\n     * Remove resizer frame.\n     *\n     * @param {Object} context\n     */\n    function removeFrame(context) {\n      var shape = context.shape,\n          frame = context.frame;\n\n      if (frame) {\n        remove$1(context.frame);\n      }\n\n      canvas.removeMarker(shape, MARKER_RESIZING$1);\n    }\n\n    // add and update previews\n    eventBus.on('resize.move', LOW_PRIORITY$e, function(event) {\n      updateFrame(event.context);\n    });\n\n    // remove previews\n    eventBus.on('resize.cleanup', function(event) {\n      removeFrame(event.context);\n    });\n\n  }\n\n  ResizePreview.$inject = [\n    'eventBus',\n    'canvas',\n    'previewSupport'\n  ];\n\n  /**\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../resize/Resize').default} Resize\n   * @typedef {import('../selection/Selection').default} Selection\n   */\n\n  var HANDLE_OFFSET = -6,\n      HANDLE_SIZE = 8,\n      HANDLE_HIT_SIZE = 20;\n\n  var CLS_RESIZER = 'djs-resizer';\n\n  var directions = [ 'n', 'w', 's', 'e', 'nw', 'ne', 'se', 'sw' ];\n\n\n  /**\n   * This component is responsible for adding resize handles.\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {Selection} selection\n   * @param {Resize} resize\n   */\n  function ResizeHandles(eventBus, canvas, selection, resize) {\n\n    this._resize = resize;\n    this._canvas = canvas;\n\n    var self = this;\n\n    eventBus.on('selection.changed', function(e) {\n      var newSelection = e.newSelection;\n\n      // remove old selection markers\n      self.removeResizers();\n\n      // add new selection markers ONLY if single selection\n      if (newSelection.length === 1) {\n        forEach$1(newSelection, bind$2(self.addResizer, self));\n      }\n    });\n\n    eventBus.on('shape.changed', function(e) {\n      var shape = e.element;\n\n      if (selection.isSelected(shape)) {\n        self.removeResizers();\n\n        self.addResizer(shape);\n      }\n    });\n  }\n\n\n  ResizeHandles.prototype.makeDraggable = function(element, gfx, direction) {\n    var resize = this._resize;\n\n    function startResize(event) {\n\n      // only trigger on left mouse button\n      if (isPrimaryButton(event)) {\n        resize.activate(event, element, direction);\n      }\n    }\n\n    event.bind(gfx, 'mousedown', startResize);\n    event.bind(gfx, 'touchstart', startResize);\n  };\n\n\n  ResizeHandles.prototype._createResizer = function(element, x, y, direction) {\n    var resizersParent = this._getResizersParent();\n\n    var offset = getHandleOffset(direction);\n\n    var group = create$1('g');\n\n    classes(group).add(CLS_RESIZER);\n    classes(group).add(CLS_RESIZER + '-' + element.id);\n    classes(group).add(CLS_RESIZER + '-' + direction);\n\n    append(resizersParent, group);\n\n    var visual = create$1('rect');\n\n    attr(visual, {\n      x: -HANDLE_SIZE / 2 + offset.x,\n      y: -HANDLE_SIZE / 2 + offset.y,\n      width: HANDLE_SIZE,\n      height: HANDLE_SIZE\n    });\n\n    classes(visual).add(CLS_RESIZER + '-visual');\n\n    append(group, visual);\n\n    var hit = create$1('rect');\n\n    attr(hit, {\n      x: -HANDLE_HIT_SIZE / 2 + offset.x,\n      y: -HANDLE_HIT_SIZE / 2 + offset.y,\n      width: HANDLE_HIT_SIZE,\n      height: HANDLE_HIT_SIZE\n    });\n\n    classes(hit).add(CLS_RESIZER + '-hit');\n\n    append(group, hit);\n\n    transform(group, x, y);\n\n    return group;\n  };\n\n  ResizeHandles.prototype.createResizer = function(element, direction) {\n    var point = getReferencePoint$1(element, direction);\n\n    var resizer = this._createResizer(element, point.x, point.y, direction);\n\n    this.makeDraggable(element, resizer, direction);\n  };\n\n  // resize handles implementation ///////////////////////////////\n\n  /**\n   * Add resizers for a given element.\n   *\n   * @param {Element} element\n   */\n  ResizeHandles.prototype.addResizer = function(element) {\n    var self = this;\n\n    if (isConnection(element) || !this._resize.canResize({ shape: element })) {\n      return;\n    }\n\n    forEach$1(directions, function(direction) {\n      self.createResizer(element, direction);\n    });\n  };\n\n  /**\n   * Remove all resizers\n   */\n  ResizeHandles.prototype.removeResizers = function() {\n    var resizersParent = this._getResizersParent();\n\n    clear(resizersParent);\n  };\n\n  ResizeHandles.prototype._getResizersParent = function() {\n    return this._canvas.getLayer('resizers');\n  };\n\n  ResizeHandles.$inject = [\n    'eventBus',\n    'canvas',\n    'selection',\n    'resize'\n  ];\n\n  // helpers //////////\n\n  function getHandleOffset(direction) {\n    var offset = {\n      x: 0,\n      y: 0\n    };\n\n    if (direction.indexOf('e') !== -1) {\n      offset.x = -HANDLE_OFFSET;\n    } else if (direction.indexOf('w') !== -1) {\n      offset.x = HANDLE_OFFSET;\n    }\n\n    if (direction.indexOf('s') !== -1) {\n      offset.y = -HANDLE_OFFSET;\n    } else if (direction.indexOf('n') !== -1) {\n      offset.y = HANDLE_OFFSET;\n    }\n\n    return offset;\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var ResizeModule = {\n    __depends__: [\n      RulesModule$1,\n      DraggingModule,\n      PreviewSupportModule\n    ],\n    __init__: [\n      'resize',\n      'resizePreview',\n      'resizeHandles'\n    ],\n    resize: [ 'type', Resize ],\n    resizePreview: [ 'type', ResizePreview ],\n    resizeHandles: [ 'type', ResizeHandles ]\n  };\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../modeling/BpmnFactory').default} BpmnFactory\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js-direct-editing/lib/DirectEditing').default} DirectEditing\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   * @typedef {import('diagram-js/lib/features/resize/ResizeHandles').default} ResizeHandles\n   * @typedef {import('../../draw/TextRenderer').default} TextRenderer\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef { {\n   *   bounds: {\n   *     x: number;\n   *     y: number;\n   *     width: number;\n   *     height: number;\n   *     minWidth?: number;\n   *     minHeight?: number;\n   *   };\n   *   style: Object;\n   * } } DirectEditingContext\n   */\n\n  var HIGH_PRIORITY$c = 2000;\n\n  /**\n   * @param {EventBus} eventBus\n   * @param {BpmnFactory} bpmnFactory\n   * @param {Canvas} canvas\n   * @param {DirectEditing} directEditing\n   * @param {Modeling} modeling\n   * @param {ResizeHandles} resizeHandles\n   * @param {TextRenderer} textRenderer\n   */\n  function LabelEditingProvider(\n      eventBus, bpmnFactory, canvas, directEditing,\n      modeling, resizeHandles, textRenderer) {\n\n    this._bpmnFactory = bpmnFactory;\n    this._canvas = canvas;\n    this._modeling = modeling;\n    this._textRenderer = textRenderer;\n\n    directEditing.registerProvider(this);\n\n    // listen to dblclick on non-root elements\n    eventBus.on('element.dblclick', function(event) {\n      activateDirectEdit(event.element, true);\n    });\n\n    // complete on followup canvas operation\n    eventBus.on([\n      'autoPlace.start',\n      'canvas.viewbox.changing',\n      'drag.init',\n      'element.mousedown',\n      'popupMenu.open',\n      'root.set',\n      'selection.changed'\n    ], function() {\n      if (directEditing.isActive()) {\n        directEditing.complete();\n      }\n    });\n\n    eventBus.on([\n      'shape.remove',\n      'connection.remove'\n    ], HIGH_PRIORITY$c, function(event) {\n\n      if (directEditing.isActive(event.element)) {\n        directEditing.cancel();\n      }\n    });\n\n    // cancel on command stack changes\n    eventBus.on([ 'commandStack.changed' ], function(e) {\n      if (directEditing.isActive()) {\n        directEditing.cancel();\n      }\n    });\n\n\n    eventBus.on('directEditing.activate', function(event) {\n      resizeHandles.removeResizers();\n    });\n\n    eventBus.on('create.end', 500, function(event) {\n\n      var context = event.context,\n          element = context.shape,\n          canExecute = event.context.canExecute,\n          isTouch = event.isTouch;\n\n      // TODO(nikku): we need to find a way to support the\n      // direct editing on mobile devices; right now this will\n      // break for desworkflowediting on mobile devices\n      // as it breaks the user interaction workflow\n\n      // TODO(nikku): we should temporarily focus the edited element\n      // here and release the focused viewport after the direct edit\n      // operation is finished\n      if (isTouch) {\n        return;\n      }\n\n      if (!canExecute) {\n        return;\n      }\n\n      if (context.hints && context.hints.createElementsBehavior === false) {\n        return;\n      }\n\n      activateDirectEdit(element);\n    });\n\n    eventBus.on('autoPlace.end', 500, function(event) {\n      activateDirectEdit(event.shape);\n    });\n\n\n    function activateDirectEdit(element, force) {\n      if (force ||\n          isAny(element, [ 'bpmn:Task', 'bpmn:TextAnnotation', 'bpmn:Participant' ]) ||\n          isCollapsedSubProcess(element)) {\n\n        directEditing.activate(element);\n      }\n    }\n\n  }\n\n  LabelEditingProvider.$inject = [\n    'eventBus',\n    'bpmnFactory',\n    'canvas',\n    'directEditing',\n    'modeling',\n    'resizeHandles',\n    'textRenderer'\n  ];\n\n\n  /**\n   * Activate direct editing for activities and text annotations.\n   *\n   * @param {Element} element\n   *\n   * @return { {\n   *   text: string;\n   *   options?: {\n   *     autoResize?: boolean;\n   *     centerVertically?: boolean;\n   *     resizable?: boolean;\n   *   }\n   * } & DirectEditingContext }\n   */\n  LabelEditingProvider.prototype.activate = function(element) {\n\n    // text\n    var text = getLabel(element);\n\n    if (text === undefined) {\n      return;\n    }\n\n    var context = {\n      text: text\n    };\n\n    // bounds\n    var bounds = this.getEditingBBox(element);\n\n    assign$1(context, bounds);\n\n    var options = {};\n\n    // tasks\n    if (\n      isAny(element, [\n        'bpmn:Task',\n        'bpmn:Participant',\n        'bpmn:Lane',\n        'bpmn:CallActivity'\n      ]) ||\n      isCollapsedSubProcess(element)\n    ) {\n      assign$1(options, {\n        centerVertically: true\n      });\n    }\n\n    // external labels\n    if (isLabelExternal(element)) {\n      assign$1(options, {\n        autoResize: true\n      });\n    }\n\n    // text annotations\n    if (is$1(element, 'bpmn:TextAnnotation')) {\n      assign$1(options, {\n        resizable: true,\n        autoResize: true\n      });\n    }\n\n    assign$1(context, {\n      options: options\n    });\n\n    return context;\n  };\n\n\n  /**\n   * Get the editing bounding box based on the element's size and position.\n   *\n   * @param {Element} element\n   *\n   * @return {DirectEditingContext}\n   */\n  LabelEditingProvider.prototype.getEditingBBox = function(element) {\n    var canvas = this._canvas;\n\n    var target = element.label || element;\n\n    var bbox = canvas.getAbsoluteBBox(target);\n\n    var mid = {\n      x: bbox.x + bbox.width / 2,\n      y: bbox.y + bbox.height / 2\n    };\n\n    // default position\n    var bounds = { x: bbox.x, y: bbox.y };\n\n    var zoom = canvas.zoom();\n\n    var defaultStyle = this._textRenderer.getDefaultStyle(),\n        externalStyle = this._textRenderer.getExternalStyle();\n\n    // take zoom into account\n    var externalFontSize = externalStyle.fontSize * zoom,\n        externalLineHeight = externalStyle.lineHeight,\n        defaultFontSize = defaultStyle.fontSize * zoom,\n        defaultLineHeight = defaultStyle.lineHeight;\n\n    var style = {\n      fontFamily: this._textRenderer.getDefaultStyle().fontFamily,\n      fontWeight: this._textRenderer.getDefaultStyle().fontWeight\n    };\n\n    // adjust for expanded pools AND lanes\n    if (is$1(element, 'bpmn:Lane') || isExpandedPool(element)) {\n\n      assign$1(bounds, {\n        width: bbox.height,\n        height: 30 * zoom,\n        x: bbox.x - bbox.height / 2 + (15 * zoom),\n        y: mid.y - (30 * zoom) / 2\n      });\n\n      assign$1(style, {\n        fontSize: defaultFontSize + 'px',\n        lineHeight: defaultLineHeight,\n        paddingTop: (7 * zoom) + 'px',\n        paddingBottom: (7 * zoom) + 'px',\n        paddingLeft: (5 * zoom) + 'px',\n        paddingRight: (5 * zoom) + 'px',\n        transform: 'rotate(-90deg)'\n      });\n    }\n\n\n    // internal labels for tasks and collapsed call activities,\n    // sub processes and participants\n    if (isAny(element, [ 'bpmn:Task', 'bpmn:CallActivity' ]) ||\n        isCollapsedPool(element) ||\n        isCollapsedSubProcess(element)) {\n\n      assign$1(bounds, {\n        width: bbox.width,\n        height: bbox.height\n      });\n\n      assign$1(style, {\n        fontSize: defaultFontSize + 'px',\n        lineHeight: defaultLineHeight,\n        paddingTop: (7 * zoom) + 'px',\n        paddingBottom: (7 * zoom) + 'px',\n        paddingLeft: (5 * zoom) + 'px',\n        paddingRight: (5 * zoom) + 'px'\n      });\n    }\n\n\n    // internal labels for expanded sub processes\n    if (isExpandedSubProcess$1(element)) {\n      assign$1(bounds, {\n        width: bbox.width,\n        x: bbox.x\n      });\n\n      assign$1(style, {\n        fontSize: defaultFontSize + 'px',\n        lineHeight: defaultLineHeight,\n        paddingTop: (7 * zoom) + 'px',\n        paddingBottom: (7 * zoom) + 'px',\n        paddingLeft: (5 * zoom) + 'px',\n        paddingRight: (5 * zoom) + 'px'\n      });\n    }\n\n    var width = 90 * zoom,\n        paddingTop = 7 * zoom,\n        paddingBottom = 4 * zoom;\n\n    // external labels for events, data elements, gateways, groups and connections\n    if (target.labelTarget) {\n      assign$1(bounds, {\n        width: width,\n        height: bbox.height + paddingTop + paddingBottom,\n        x: mid.x - width / 2,\n        y: bbox.y - paddingTop\n      });\n\n      assign$1(style, {\n        fontSize: externalFontSize + 'px',\n        lineHeight: externalLineHeight,\n        paddingTop: paddingTop + 'px',\n        paddingBottom: paddingBottom + 'px'\n      });\n    }\n\n    // external label not yet created\n    if (isLabelExternal(target)\n        && !hasExternalLabel(target)\n        && !isLabel(target)) {\n\n      var externalLabelMid = getExternalLabelMid(element);\n\n      var absoluteBBox = canvas.getAbsoluteBBox({\n        x: externalLabelMid.x,\n        y: externalLabelMid.y,\n        width: 0,\n        height: 0\n      });\n\n      var height = externalFontSize + paddingTop + paddingBottom;\n\n      assign$1(bounds, {\n        width: width,\n        height: height,\n        x: absoluteBBox.x - width / 2,\n        y: absoluteBBox.y - height / 2\n      });\n\n      assign$1(style, {\n        fontSize: externalFontSize + 'px',\n        lineHeight: externalLineHeight,\n        paddingTop: paddingTop + 'px',\n        paddingBottom: paddingBottom + 'px'\n      });\n    }\n\n    // text annotations\n    if (is$1(element, 'bpmn:TextAnnotation')) {\n      assign$1(bounds, {\n        width: bbox.width,\n        height: bbox.height,\n        minWidth: 30 * zoom,\n        minHeight: 10 * zoom\n      });\n\n      assign$1(style, {\n        textAlign: 'left',\n        paddingTop: (5 * zoom) + 'px',\n        paddingBottom: (7 * zoom) + 'px',\n        paddingLeft: (7 * zoom) + 'px',\n        paddingRight: (5 * zoom) + 'px',\n        fontSize: defaultFontSize + 'px',\n        lineHeight: defaultLineHeight\n      });\n    }\n\n    return { bounds: bounds, style: style };\n  };\n\n\n  LabelEditingProvider.prototype.update = function(\n      element, newLabel,\n      activeContextText, bounds) {\n\n    var newBounds,\n        bbox;\n\n    if (is$1(element, 'bpmn:TextAnnotation')) {\n\n      bbox = this._canvas.getAbsoluteBBox(element);\n\n      newBounds = {\n        x: element.x,\n        y: element.y,\n        width: element.width / bbox.width * bounds.width,\n        height: element.height / bbox.height * bounds.height\n      };\n    }\n\n    if (isEmptyText$1(newLabel)) {\n      newLabel = null;\n    }\n\n    this._modeling.updateLabel(element, newLabel, newBounds);\n  };\n\n\n\n  // helpers //////////\n\n  function isCollapsedSubProcess(element) {\n    return is$1(element, 'bpmn:SubProcess') && !isExpanded(element);\n  }\n\n  function isExpandedSubProcess$1(element) {\n    return is$1(element, 'bpmn:SubProcess') && isExpanded(element);\n  }\n\n  function isCollapsedPool(element) {\n    return is$1(element, 'bpmn:Participant') && !isExpanded(element);\n  }\n\n  function isExpandedPool(element) {\n    return is$1(element, 'bpmn:Participant') && isExpanded(element);\n  }\n\n  function isEmptyText$1(label) {\n    return !label || !label.trim();\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../../draw/PathMap').default} PathMap\n   */\n\n  var MARKER_HIDDEN = 'djs-element-hidden',\n      MARKER_LABEL_HIDDEN = 'djs-label-hidden';\n\n  /**\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {PathMap} pathMap\n   */\n  function LabelEditingPreview(eventBus, canvas, pathMap) {\n\n    var self = this;\n\n    var defaultLayer = canvas.getDefaultLayer();\n\n    var element, absoluteElementBBox, gfx;\n\n    eventBus.on('directEditing.activate', function(context) {\n      var activeProvider = context.active;\n\n      element = activeProvider.element.label || activeProvider.element;\n\n      // text annotation\n      if (is$1(element, 'bpmn:TextAnnotation')) {\n        absoluteElementBBox = canvas.getAbsoluteBBox(element);\n\n        gfx = create$1('g');\n\n        var textPathData = pathMap.getScaledPath('TEXT_ANNOTATION', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.0,\n            my: 0.0\n          }\n        });\n\n        var path = self.path = create$1('path');\n\n        attr(path, {\n          d: textPathData,\n          strokeWidth: 2,\n          stroke: getStrokeColor(element)\n        });\n\n        append(gfx, path);\n\n        append(defaultLayer, gfx);\n\n        translate$2(gfx, element.x, element.y);\n      }\n\n      if (is$1(element, 'bpmn:TextAnnotation') ||\n          element.labelTarget) {\n        canvas.addMarker(element, MARKER_HIDDEN);\n      } else if (is$1(element, 'bpmn:Task') ||\n                 is$1(element, 'bpmn:CallActivity') ||\n                 is$1(element, 'bpmn:SubProcess') ||\n                 is$1(element, 'bpmn:Participant')) {\n        canvas.addMarker(element, MARKER_LABEL_HIDDEN);\n      }\n    });\n\n    eventBus.on('directEditing.resize', function(context) {\n\n      // text annotation\n      if (is$1(element, 'bpmn:TextAnnotation')) {\n        var height = context.height,\n            dy = context.dy;\n\n        var newElementHeight = Math.max(element.height / absoluteElementBBox.height * (height + dy), 0);\n\n        var textPathData = pathMap.getScaledPath('TEXT_ANNOTATION', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: newElementHeight,\n          position: {\n            mx: 0.0,\n            my: 0.0\n          }\n        });\n\n        attr(self.path, {\n          d: textPathData\n        });\n      }\n    });\n\n    eventBus.on([ 'directEditing.complete', 'directEditing.cancel' ], function(context) {\n      var activeProvider = context.active;\n\n      if (activeProvider) {\n        canvas.removeMarker(activeProvider.element.label || activeProvider.element, MARKER_HIDDEN);\n        canvas.removeMarker(element, MARKER_LABEL_HIDDEN);\n      }\n\n      element = undefined;\n      absoluteElementBBox = undefined;\n\n      if (gfx) {\n        remove$1(gfx);\n\n        gfx = undefined;\n      }\n    });\n  }\n\n  LabelEditingPreview.$inject = [\n    'eventBus',\n    'canvas',\n    'pathMap'\n  ];\n\n\n  // helpers //////////\n\n  function getStrokeColor(element, defaultColor) {\n    var di = getDi(element);\n\n    return di.get('stroke') || defaultColor || 'black';\n  }\n\n  var LabelEditingModule = {\n    __depends__: [\n      ChangeSupportModule,\n      ResizeModule,\n      DirectEditingModule\n    ],\n    __init__: [\n      'labelEditingProvider',\n      'labelEditingPreview'\n    ],\n    labelEditingProvider: [ 'type', LabelEditingProvider ],\n    labelEditingPreview: [ 'type', LabelEditingPreview ]\n  };\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../Modeling').default} Modeling\n   *\n   * @typedef {import('../../../model/Types').Element} Element\n   * @typedef {import('../../../model/Types').Shape} Shape\n   *\n   * @typedef {import('diagram-js/lib/util/Types').DirectionTRBL} DirectionTRBL\n   */\n\n  var ALIGNMENTS = [\n    'top',\n    'bottom',\n    'left',\n    'right'\n  ];\n\n  var ELEMENT_LABEL_DISTANCE = 10;\n\n  /**\n   * A component that makes sure that external labels are added\n   * together with respective elements and properly updated (DI wise)\n   * during move.\n   *\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   */\n  function AdaptiveLabelPositioningBehavior(eventBus, modeling) {\n\n    CommandInterceptor.call(this, eventBus);\n\n    this.postExecuted([\n      'connection.create',\n      'connection.layout',\n      'connection.updateWaypoints'\n    ], function(event) {\n      var context = event.context,\n          connection = context.connection,\n          source = connection.source,\n          target = connection.target,\n          hints = context.hints || {};\n\n      if (hints.createElementsBehavior !== false) {\n        checkLabelAdjustment(source);\n        checkLabelAdjustment(target);\n      }\n    });\n\n\n    this.postExecuted([\n      'label.create'\n    ], function(event) {\n      var context = event.context,\n          shape = context.shape,\n          hints = context.hints || {};\n\n      if (hints.createElementsBehavior !== false) {\n        checkLabelAdjustment(shape.labelTarget);\n      }\n    });\n\n\n    this.postExecuted([\n      'elements.create'\n    ], function(event) {\n      var context = event.context,\n          elements = context.elements,\n          hints = context.hints || {};\n\n      if (hints.createElementsBehavior !== false) {\n        elements.forEach(function(element) {\n          checkLabelAdjustment(element);\n        });\n      }\n    });\n\n    function checkLabelAdjustment(element) {\n\n      // skip non-existing labels\n      if (!hasExternalLabel(element)) {\n        return;\n      }\n\n      var optimalPosition = getOptimalPosition(element);\n\n      // no optimal position found\n      if (!optimalPosition) {\n        return;\n      }\n\n      adjustLabelPosition(element, optimalPosition);\n    }\n\n    function adjustLabelPosition(element, orientation) {\n\n      var elementMid = getMid(element),\n          label = element.label,\n          labelMid = getMid(label);\n\n      // ignore labels that are being created\n      if (!label.parent) {\n        return;\n      }\n\n      var elementTrbl = asTRBL(element);\n\n      var newLabelMid;\n\n      switch (orientation) {\n      case 'top':\n        newLabelMid = {\n          x: elementMid.x,\n          y: elementTrbl.top - ELEMENT_LABEL_DISTANCE - label.height / 2\n        };\n\n        break;\n\n      case 'left':\n\n        newLabelMid = {\n          x: elementTrbl.left - ELEMENT_LABEL_DISTANCE - label.width / 2,\n          y: elementMid.y\n        };\n\n        break;\n\n      case 'bottom':\n\n        newLabelMid = {\n          x: elementMid.x,\n          y: elementTrbl.bottom + ELEMENT_LABEL_DISTANCE + label.height / 2\n        };\n\n        break;\n\n      case 'right':\n\n        newLabelMid = {\n          x: elementTrbl.right + ELEMENT_LABEL_DISTANCE + label.width / 2,\n          y: elementMid.y\n        };\n\n        break;\n      }\n\n      var delta$1 = delta(newLabelMid, labelMid);\n\n      modeling.moveShape(label, delta$1);\n    }\n\n  }\n\n  e$3(AdaptiveLabelPositioningBehavior, CommandInterceptor);\n\n  AdaptiveLabelPositioningBehavior.$inject = [\n    'eventBus',\n    'modeling'\n  ];\n\n\n  // helpers //////////////////////\n\n  /**\n   * Return alignments which are taken by a boundary's host element\n   *\n   * @param {Shape} element\n   *\n   * @return {DirectionTRBL[]}\n   */\n  function getTakenHostAlignments(element) {\n\n    var hostElement = element.host,\n        elementMid = getMid(element),\n        hostOrientation = getOrientation(elementMid, hostElement);\n\n    var freeAlignments;\n\n    // check whether there is a multi-orientation, e.g. 'top-left'\n    if (hostOrientation.indexOf('-') >= 0) {\n      freeAlignments = hostOrientation.split('-');\n    } else {\n      freeAlignments = [ hostOrientation ];\n    }\n\n    var takenAlignments = ALIGNMENTS.filter(function(alignment) {\n\n      return freeAlignments.indexOf(alignment) === -1;\n    });\n\n    return takenAlignments;\n\n  }\n\n  /**\n   * Return alignments which are taken by related connections\n   *\n   * @param {Element} element\n   *\n   * @return {DirectionTRBL[]}\n   */\n  function getTakenConnectionAlignments(element) {\n\n    var elementMid = getMid(element);\n\n    var takenAlignments = [].concat(\n      element.incoming.map(function(c) {\n        return c.waypoints[c.waypoints.length - 2 ];\n      }),\n      element.outgoing.map(function(c) {\n        return c.waypoints[1];\n      })\n    ).map(function(point) {\n      return getApproximateOrientation(elementMid, point);\n    });\n\n    return takenAlignments;\n  }\n\n  /**\n   * Return the optimal label position around an element\n   * or `undefined`, if none was found.\n   *\n   * @param  {Element} element\n   *\n   * @return {DirectionTRBL|undefined}\n   */\n  function getOptimalPosition(element) {\n\n    var labelMid = getMid(element.label);\n\n    var elementMid = getMid(element);\n\n    var labelOrientation = getApproximateOrientation(elementMid, labelMid);\n\n    if (!isAligned(labelOrientation)) {\n      return;\n    }\n\n    var takenAlignments = getTakenConnectionAlignments(element);\n\n    if (element.host) {\n      var takenHostAlignments = getTakenHostAlignments(element);\n\n      takenAlignments = takenAlignments.concat(takenHostAlignments);\n    }\n\n    var freeAlignments = ALIGNMENTS.filter(function(alignment) {\n\n      return takenAlignments.indexOf(alignment) === -1;\n    });\n\n    // NOTHING TO DO; label already aligned a.O.K.\n    if (freeAlignments.indexOf(labelOrientation) !== -1) {\n      return;\n    }\n\n    return freeAlignments[0];\n  }\n\n  function getApproximateOrientation(p0, p1) {\n    return getOrientation(p1, p0, 5);\n  }\n\n  function isAligned(orientation) {\n    return ALIGNMENTS.indexOf(orientation) !== -1;\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   */\n\n  function AppendBehavior(eventBus) {\n\n    CommandInterceptor.call(this, eventBus);\n\n    // assign correct shape position unless already set\n\n    this.preExecute('shape.append', function(context) {\n\n      var source = context.source,\n          shape = context.shape;\n\n      if (!context.position) {\n\n        if (is$1(shape, 'bpmn:TextAnnotation')) {\n          context.position = {\n            x: source.x + source.width / 2 + 75,\n            y: source.y - 50 - shape.height / 2\n          };\n        } else {\n          context.position = {\n            x: source.x + source.width + 80 + shape.width / 2,\n            y: source.y + source.height / 2\n          };\n        }\n      }\n    }, true);\n  }\n\n  e$3(AppendBehavior, CommandInterceptor);\n\n  AppendBehavior.$inject = [\n    'eventBus'\n  ];\n\n  /**\r\n   * @typedef {import('didi').Injector} Injector\r\n   * @typedef {import('../Modeling').default} Modeling\r\n   */\r\n\r\n  /**\r\n   * @param {Injector} injector\r\n   * @param {Modeling} modeling\r\n   */\r\n  function AssociationBehavior(injector, modeling) {\r\n    injector.invoke(CommandInterceptor, this);\r\n\r\n    this.postExecute('shape.move', function(context) {\r\n      var newParent = context.newParent,\r\n          shape = context.shape;\r\n\r\n      var associations = filter(shape.incoming.concat(shape.outgoing), function(connection) {\r\n        return is$1(connection, 'bpmn:Association');\r\n      });\r\n\r\n      forEach$1(associations, function(association) {\r\n        modeling.moveConnection(association, { x: 0, y: 0 }, newParent);\r\n      });\r\n    }, true);\r\n  }\r\n\r\n  e$3(AssociationBehavior, CommandInterceptor);\r\n\r\n  AssociationBehavior.$inject = [\r\n    'injector',\r\n    'modeling'\r\n  ];\n\n  /**\n   * @typedef {import('../../replace/BpmnReplace').default} BpmnReplace\n   * @typedef {import('didi').Injector} Injector\n   */\n\n  var LOW_PRIORITY$d = 500;\n\n\n  /**\n   * Replace intermediate event with boundary event when creating or moving results in attached event.\n   *\n   * @param {BpmnReplace} bpmnReplace\n   * @param {Injector} injector\n   */\n  function AttachEventBehavior(bpmnReplace, injector) {\n    injector.invoke(CommandInterceptor, this);\n\n    this._bpmnReplace = bpmnReplace;\n\n    var self = this;\n\n    this.postExecuted('elements.create', LOW_PRIORITY$d, function(context) {\n      var elements = context.elements;\n\n      elements = elements.filter(function(shape) {\n        var host = shape.host;\n\n        return shouldReplace$1(shape, host);\n      });\n\n      if (elements.length !== 1) {\n        return;\n      }\n\n      elements.map(function(element) {\n        return elements.indexOf(element);\n      }).forEach(function(index) {\n        var host = elements[ index ];\n\n        context.elements[ index ] = self._replaceShape(elements[ index ], host);\n      });\n    }, true);\n\n\n    this.preExecute('elements.move', LOW_PRIORITY$d, function(context) {\n      var shapes = context.shapes,\n          host = context.newHost;\n\n      if (shapes.length !== 1) {\n        return;\n      }\n\n      var shape = shapes[0];\n\n      if (shouldReplace$1(shape, host)) {\n        context.shapes = [ self._replaceShape(shape, host) ];\n      }\n    }, true);\n  }\n\n  AttachEventBehavior.$inject = [\n    'bpmnReplace',\n    'injector'\n  ];\n\n  e$3(AttachEventBehavior, CommandInterceptor);\n\n  AttachEventBehavior.prototype._replaceShape = function(shape, host) {\n    var eventDefinition = getEventDefinition$1(shape);\n\n    var boundaryEvent = {\n      type: 'bpmn:BoundaryEvent',\n      host: host\n    };\n\n    if (eventDefinition) {\n      boundaryEvent.eventDefinitionType = eventDefinition.$type;\n    }\n\n    return this._bpmnReplace.replaceElement(shape, boundaryEvent, { layoutConnection: false });\n  };\n\n\n  // helpers //////////\n\n  function getEventDefinition$1(element) {\n    var businessObject = getBusinessObject(element),\n        eventDefinitions = businessObject.eventDefinitions;\n\n    return eventDefinitions && eventDefinitions[0];\n  }\n\n  function shouldReplace$1(shape, host) {\n    return !isLabel(shape) &&\n      isAny(shape, [ 'bpmn:IntermediateThrowEvent', 'bpmn:IntermediateCatchEvent' ]) && !!host;\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * BPMN specific boundary event behavior.\n   *\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   */\n  function BoundaryEventBehavior(eventBus, modeling) {\n\n    CommandInterceptor.call(this, eventBus);\n\n    function getBoundaryEvents(element) {\n      return filter(element.attachers, function(attacher) {\n        return is$1(attacher, 'bpmn:BoundaryEvent');\n      });\n    }\n\n    // remove after connecting to event-based gateway\n    this.postExecute('connection.create', function(event) {\n      var source = event.context.source,\n          target = event.context.target,\n          boundaryEvents = getBoundaryEvents(target);\n\n      if (\n        is$1(source, 'bpmn:EventBasedGateway') &&\n        is$1(target, 'bpmn:ReceiveTask') &&\n        boundaryEvents.length > 0\n      ) {\n        modeling.removeElements(boundaryEvents);\n      }\n\n    });\n\n    // remove after replacing connected gateway with event-based gateway\n    this.postExecute('connection.reconnect', function(event) {\n      var oldSource = event.context.oldSource,\n          newSource = event.context.newSource;\n\n      if (is$1(oldSource, 'bpmn:Gateway') &&\n          is$1(newSource, 'bpmn:EventBasedGateway')) {\n        forEach$1(newSource.outgoing, function(connection) {\n          var target = connection.target,\n              attachedboundaryEvents = getBoundaryEvents(target);\n\n          if (is$1(target, 'bpmn:ReceiveTask') &&\n              attachedboundaryEvents.length > 0) {\n            modeling.removeElements(attachedboundaryEvents);\n          }\n        });\n      }\n    });\n\n  }\n\n  BoundaryEventBehavior.$inject = [\n    'eventBus',\n    'modeling'\n  ];\n\n  e$3(BoundaryEventBehavior, CommandInterceptor);\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   */\n\n  /**\n   * @param {Injector} injector\n   */\n  function CreateBehavior(injector) {\n    injector.invoke(CommandInterceptor, this);\n\n    this.preExecute('shape.create', 1500, function(event) {\n      var context = event.context,\n          parent = context.parent,\n          shape = context.shape;\n\n      if (is$1(parent, 'bpmn:Lane') && !is$1(shape, 'bpmn:Lane')) {\n        context.parent = getParent(parent, 'bpmn:Participant');\n      }\n    });\n\n  }\n\n\n  CreateBehavior.$inject = [ 'injector' ];\n\n  e$3(CreateBehavior, CommandInterceptor);\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../BpmnFactory').default} BpmnFactory\n   */\n\n  /**\n   * BPMN specific create data object behavior.\n   *\n   * @param {EventBus} eventBus\n   * @param {BpmnFactory} bpmnFactory\n   */\n  function CreateDataObjectBehavior(eventBus, bpmnFactory) {\n\n    CommandInterceptor.call(this, eventBus);\n\n    this.preExecute('shape.create', function(event) {\n\n      var context = event.context,\n          shape = context.shape;\n\n      if (is$1(shape, 'bpmn:DataObjectReference') && shape.type !== 'label') {\n\n        // create a DataObject every time a DataObjectReference is created\n        var dataObject = bpmnFactory.create('bpmn:DataObject');\n\n        // set the reference to the DataObject\n        shape.businessObject.dataObjectRef = dataObject;\n      }\n    });\n\n  }\n\n  CreateDataObjectBehavior.$inject = [\n    'eventBus',\n    'bpmnFactory'\n  ];\n\n  e$3(CreateDataObjectBehavior, CommandInterceptor);\n\n  /**\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  var HORIZONTAL_PARTICIPANT_PADDING = 20,\n      VERTICAL_PARTICIPANT_PADDING = 20;\n\n  var PARTICIPANT_BORDER_WIDTH = 30;\n\n  var HIGH_PRIORITY$b = 2000;\n\n\n  /**\n   * BPMN-specific behavior for creating participants.\n   *\n   * @param {Canvas} canvas\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   */\n  function CreateParticipantBehavior(canvas, eventBus, modeling) {\n    CommandInterceptor.call(this, eventBus);\n\n    // fit participant\n    eventBus.on([\n      'create.start',\n      'shape.move.start'\n    ], HIGH_PRIORITY$b, function(event) {\n      var context = event.context,\n          shape = context.shape,\n          rootElement = canvas.getRootElement();\n\n      if (!is$1(shape, 'bpmn:Participant') ||\n        !is$1(rootElement, 'bpmn:Process') ||\n        !rootElement.children.length) {\n        return;\n      }\n\n      // ignore connections, groups and labels\n      var children = rootElement.children.filter(function(element) {\n        return !is$1(element, 'bpmn:Group') &&\n          !isLabel(element) &&\n          !isConnection(element);\n      });\n\n      // ensure for available children to calculate bounds\n      if (!children.length) {\n        return;\n      }\n\n      var childrenBBox = getBBox(children);\n\n      var participantBounds = getParticipantBounds(shape, childrenBBox);\n\n      // assign width and height\n      assign$1(shape, participantBounds);\n\n      // assign create constraints\n      context.createConstraints = getParticipantCreateConstraints(shape, childrenBBox);\n    });\n\n    // force hovering process when creating first participant\n    eventBus.on('create.start', HIGH_PRIORITY$b, function(event) {\n      var context = event.context,\n          shape = context.shape,\n          rootElement = canvas.getRootElement(),\n          rootElementGfx = canvas.getGraphics(rootElement);\n\n      function ensureHoveringProcess(event) {\n        event.element = rootElement;\n        event.gfx = rootElementGfx;\n      }\n\n      if (is$1(shape, 'bpmn:Participant') && is$1(rootElement, 'bpmn:Process')) {\n        eventBus.on('element.hover', HIGH_PRIORITY$b, ensureHoveringProcess);\n\n        eventBus.once('create.cleanup', function() {\n          eventBus.off('element.hover', ensureHoveringProcess);\n        });\n      }\n    });\n\n    // turn process into collaboration when creating first participant\n    function getOrCreateCollaboration() {\n      var rootElement = canvas.getRootElement();\n\n      if (is$1(rootElement, 'bpmn:Collaboration')) {\n        return rootElement;\n      }\n\n      return modeling.makeCollaboration();\n    }\n\n    // when creating mutliple elements through `elements.create` parent must be set to collaboration\n    // and passed to `shape.create` as hint\n    this.preExecute('elements.create', HIGH_PRIORITY$b, function(context) {\n      var elements = context.elements,\n          parent = context.parent,\n          participant = findParticipant(elements),\n          hints;\n\n      if (participant && is$1(parent, 'bpmn:Process')) {\n        context.parent = getOrCreateCollaboration();\n\n        hints = context.hints = context.hints || {};\n\n        hints.participant = participant;\n        hints.process = parent;\n        hints.processRef = getBusinessObject(participant).get('processRef');\n      }\n    }, true);\n\n    // when creating single shape through `shape.create` parent must be set to collaboration\n    // unless it was already set through `elements.create`\n    this.preExecute('shape.create', function(context) {\n      var parent = context.parent,\n          shape = context.shape;\n\n      if (is$1(shape, 'bpmn:Participant') && is$1(parent, 'bpmn:Process')) {\n        context.parent = getOrCreateCollaboration();\n\n        context.process = parent;\n        context.processRef = getBusinessObject(shape).get('processRef');\n      }\n    }, true);\n\n    // #execute necessary because #preExecute not called on CommandStack#redo\n    this.execute('shape.create', function(context) {\n      var hints = context.hints || {},\n          process = context.process || hints.process,\n          shape = context.shape,\n          participant = hints.participant;\n\n      // both shape.create and elements.create must be handled\n      if (process && (!participant || shape === participant)) {\n\n        // monkey-patch process ref\n        getBusinessObject(shape).set('processRef', getBusinessObject(process));\n      }\n    }, true);\n\n    this.revert('shape.create', function(context) {\n      var hints = context.hints || {},\n          process = context.process || hints.process,\n          processRef = context.processRef || hints.processRef,\n          shape = context.shape,\n          participant = hints.participant;\n\n      // both shape.create and elements.create must be handled\n      if (process && (!participant || shape === participant)) {\n\n        // monkey-patch process ref\n        getBusinessObject(shape).set('processRef', processRef);\n      }\n    }, true);\n\n    this.postExecute('shape.create', function(context) {\n      var hints = context.hints || {},\n          process = context.process || context.hints.process,\n          shape = context.shape,\n          participant = hints.participant;\n\n      if (process) {\n        var children = process.children.slice();\n\n        // both shape.create and elements.create must be handled\n        if (!participant) {\n          modeling.moveElements(children, { x: 0, y: 0 }, shape);\n        } else if (shape === participant) {\n          modeling.moveElements(children, { x: 0, y: 0 }, participant);\n        }\n      }\n    }, true);\n  }\n\n  CreateParticipantBehavior.$inject = [\n    'canvas',\n    'eventBus',\n    'modeling'\n  ];\n\n  e$3(CreateParticipantBehavior, CommandInterceptor);\n\n  // helpers //////////\n\n  function getParticipantBounds(shape, childrenBBox) {\n    childrenBBox = {\n      width: childrenBBox.width + HORIZONTAL_PARTICIPANT_PADDING * 2 + PARTICIPANT_BORDER_WIDTH,\n      height: childrenBBox.height + VERTICAL_PARTICIPANT_PADDING * 2\n    };\n\n    var width = Math.max(shape.width, childrenBBox.width),\n        height = Math.max(shape.height, childrenBBox.height);\n\n    return {\n      x: -width / 2,\n      y: -height / 2,\n      width: width,\n      height: height\n    };\n  }\n\n  function getParticipantCreateConstraints(shape, childrenBBox) {\n    childrenBBox = asTRBL(childrenBBox);\n\n    return {\n      bottom: childrenBBox.top + shape.height / 2 - VERTICAL_PARTICIPANT_PADDING,\n      left: childrenBBox.right - shape.width / 2 + HORIZONTAL_PARTICIPANT_PADDING,\n      top: childrenBBox.bottom - shape.height / 2 + VERTICAL_PARTICIPANT_PADDING,\n      right: childrenBBox.left + shape.width / 2 - HORIZONTAL_PARTICIPANT_PADDING - PARTICIPANT_BORDER_WIDTH\n    };\n  }\n\n  function findParticipant(elements) {\n    return find(elements, function(element) {\n      return is$1(element, 'bpmn:Participant');\n    });\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../BpmnFactory').default} BpmnFactory\n   */\n\n  var TARGET_REF_PLACEHOLDER_NAME = '__targetRef_placeholder';\n\n\n  /**\n   * This behavior makes sure we always set a fake\n   * DataInputAssociation#targetRef as demanded by the BPMN 2.0\n   * XSD schema.\n   *\n   * The reference is set to a bpmn:Property{ name: '__targetRef_placeholder' }\n   * which is created on the fly and cleaned up afterwards if not needed\n   * anymore.\n   *\n   * @param {EventBus} eventBus\n   * @param {BpmnFactory} bpmnFactory\n   */\n  function DataInputAssociationBehavior(eventBus, bpmnFactory) {\n\n    CommandInterceptor.call(this, eventBus);\n\n\n    this.executed([\n      'connection.create',\n      'connection.delete',\n      'connection.move',\n      'connection.reconnect'\n    ], ifDataInputAssociation(fixTargetRef));\n\n    this.reverted([\n      'connection.create',\n      'connection.delete',\n      'connection.move',\n      'connection.reconnect'\n    ], ifDataInputAssociation(fixTargetRef));\n\n\n    function usesTargetRef(element, targetRef, removedConnection) {\n\n      var inputAssociations = element.get('dataInputAssociations');\n\n      return find(inputAssociations, function(association) {\n        return association !== removedConnection &&\n               association.targetRef === targetRef;\n      });\n    }\n\n    function getTargetRef(element, create) {\n\n      var properties = element.get('properties');\n\n      var targetRefProp = find(properties, function(p) {\n        return p.name === TARGET_REF_PLACEHOLDER_NAME;\n      });\n\n      if (!targetRefProp && create) {\n        targetRefProp = bpmnFactory.create('bpmn:Property', {\n          name: TARGET_REF_PLACEHOLDER_NAME\n        });\n\n        add(properties, targetRefProp);\n      }\n\n      return targetRefProp;\n    }\n\n    function cleanupTargetRef(element, connection) {\n\n      var targetRefProp = getTargetRef(element);\n\n      if (!targetRefProp) {\n        return;\n      }\n\n      if (!usesTargetRef(element, targetRefProp, connection)) {\n        remove(element.get('properties'), targetRefProp);\n      }\n    }\n\n    /**\n     * Make sure targetRef is set to a valid property or\n     * `null` if the connection is detached.\n     *\n     * @param {Event} event\n     */\n    function fixTargetRef(event) {\n\n      var context = event.context,\n          connection = context.connection,\n          connectionBo = connection.businessObject,\n          target = connection.target,\n          targetBo = target && target.businessObject,\n          newTarget = context.newTarget,\n          newTargetBo = newTarget && newTarget.businessObject,\n          oldTarget = context.oldTarget || context.target,\n          oldTargetBo = oldTarget && oldTarget.businessObject;\n\n      var dataAssociation = connection.businessObject,\n          targetRefProp;\n\n      if (oldTargetBo && oldTargetBo !== targetBo) {\n        cleanupTargetRef(oldTargetBo, connectionBo);\n      }\n\n      if (newTargetBo && newTargetBo !== targetBo) {\n        cleanupTargetRef(newTargetBo, connectionBo);\n      }\n\n      if (targetBo) {\n        targetRefProp = getTargetRef(targetBo, true);\n        dataAssociation.targetRef = targetRefProp;\n      } else {\n        dataAssociation.targetRef = null;\n      }\n    }\n  }\n\n  DataInputAssociationBehavior.$inject = [\n    'eventBus',\n    'bpmnFactory'\n  ];\n\n  e$3(DataInputAssociationBehavior, CommandInterceptor);\n\n\n  /**\n   * Only call the given function when the event\n   * touches a bpmn:DataInputAssociation.\n   *\n   * @param {Function} fn\n   * @return {Function}\n   */\n  function ifDataInputAssociation(fn) {\n\n    return function(event) {\n      var context = event.context,\n          connection = context.connection;\n\n      if (is$1(connection, 'bpmn:DataInputAssociation')) {\n        return fn(event);\n      }\n    };\n  }\n\n  /**\r\n   * @typedef {import('diagram-js/lib/command/CommandHandler').default} CommandHandler\r\n   *\r\n   * @typedef {import('../BpmnUpdater').default} BpmnUpdater\r\n   */\r\n\r\n  /**\r\n   * @implements {CommandHandler}\r\n   *\r\n   * @param {BpmnUpdater} bpmnUpdater\r\n   */\r\n  function UpdateSemanticParentHandler(bpmnUpdater) {\r\n    this._bpmnUpdater = bpmnUpdater;\r\n  }\r\n\r\n  UpdateSemanticParentHandler.$inject = [ 'bpmnUpdater' ];\r\n\r\n\r\n  UpdateSemanticParentHandler.prototype.execute = function(context) {\r\n    var dataStoreBo = context.dataStoreBo,\r\n        dataStoreDi = context.dataStoreDi,\r\n        newSemanticParent = context.newSemanticParent,\r\n        newDiParent = context.newDiParent;\r\n\r\n    context.oldSemanticParent = dataStoreBo.$parent;\r\n    context.oldDiParent = dataStoreDi.$parent;\r\n\r\n    // update semantic parent\r\n    this._bpmnUpdater.updateSemanticParent(dataStoreBo, newSemanticParent);\r\n\r\n    // update DI parent\r\n    this._bpmnUpdater.updateDiParent(dataStoreDi, newDiParent);\r\n\r\n    return [];\r\n  };\r\n\r\n  UpdateSemanticParentHandler.prototype.revert = function(context) {\r\n    var dataStoreBo = context.dataStoreBo,\r\n        dataStoreDi = context.dataStoreDi,\r\n        oldSemanticParent = context.oldSemanticParent,\r\n        oldDiParent = context.oldDiParent;\r\n\r\n    // update semantic parent\r\n    this._bpmnUpdater.updateSemanticParent(dataStoreBo, oldSemanticParent);\r\n\r\n    // update DI parent\r\n    this._bpmnUpdater.updateDiParent(dataStoreDi, oldDiParent);\r\n\r\n    return [];\r\n  };\n\n  /**\r\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\r\n   * @typedef {import('diagram-js/lib/command/CommandStack').default} CommandStack\r\n   * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\r\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\r\n   */\r\n\r\n  /**\r\n   * BPMN specific data store behavior.\r\n   *\r\n   * @param {Canvas} canvas\r\n   * @param {CommandStack} commandStack\r\n   * @param {ElementRegistry} elementRegistry\r\n   * @param {EventBus} eventBus\r\n   */\r\n  function DataStoreBehavior(\r\n      canvas, commandStack, elementRegistry,\r\n      eventBus) {\r\n\r\n    CommandInterceptor.call(this, eventBus);\r\n\r\n    commandStack.registerHandler('dataStore.updateContainment', UpdateSemanticParentHandler);\r\n\r\n    function getFirstParticipantWithProcessRef() {\r\n      return elementRegistry.filter(function(element) {\r\n        return is$1(element, 'bpmn:Participant') && getBusinessObject(element).processRef;\r\n      })[0];\r\n    }\r\n\r\n    function getDataStores(element) {\r\n      return element.children.filter(function(child) {\r\n        return is$1(child, 'bpmn:DataStoreReference') && !child.labelTarget;\r\n      });\r\n    }\r\n\r\n    function updateDataStoreParent(dataStore, newDataStoreParent) {\r\n      var dataStoreBo = dataStore.businessObject || dataStore;\r\n\r\n      newDataStoreParent = newDataStoreParent || getFirstParticipantWithProcessRef();\r\n\r\n      if (newDataStoreParent) {\r\n        var newDataStoreParentBo = newDataStoreParent.businessObject || newDataStoreParent;\r\n\r\n        commandStack.execute('dataStore.updateContainment', {\r\n          dataStoreBo: dataStoreBo,\r\n          dataStoreDi: getDi(dataStore),\r\n          newSemanticParent: newDataStoreParentBo.processRef || newDataStoreParentBo,\r\n          newDiParent: getDi(newDataStoreParent)\r\n        });\r\n      }\r\n    }\r\n\r\n\r\n    // disable auto-resize for data stores\r\n    this.preExecute('shape.create', function(event) {\r\n\r\n      var context = event.context,\r\n          shape = context.shape;\r\n\r\n      if (is$1(shape, 'bpmn:DataStoreReference') &&\r\n          shape.type !== 'label') {\r\n\r\n        if (!context.hints) {\r\n          context.hints = {};\r\n        }\r\n\r\n        // prevent auto resizing\r\n        context.hints.autoResize = false;\r\n      }\r\n    });\r\n\r\n\r\n    // disable auto-resize for data stores\r\n    this.preExecute('elements.move', function(event) {\r\n      var context = event.context,\r\n          shapes = context.shapes;\r\n\r\n      var dataStoreReferences = shapes.filter(function(shape) {\r\n        return is$1(shape, 'bpmn:DataStoreReference');\r\n      });\r\n\r\n      if (dataStoreReferences.length) {\r\n        if (!context.hints) {\r\n          context.hints = {};\r\n        }\r\n\r\n        // prevent auto resizing for data store references\r\n        context.hints.autoResize = shapes.filter(function(shape) {\r\n          return !is$1(shape, 'bpmn:DataStoreReference');\r\n        });\r\n      }\r\n    });\r\n\r\n\r\n    // update parent on data store created\r\n    this.postExecute('shape.create', function(event) {\r\n      var context = event.context,\r\n          shape = context.shape,\r\n          parent = shape.parent;\r\n\r\n\r\n      if (is$1(shape, 'bpmn:DataStoreReference') &&\r\n          shape.type !== 'label' &&\r\n          is$1(parent, 'bpmn:Collaboration')) {\r\n\r\n        updateDataStoreParent(shape);\r\n      }\r\n    });\r\n\r\n\r\n    // update parent on data store moved\r\n    this.postExecute('shape.move', function(event) {\r\n      var context = event.context,\r\n          shape = context.shape,\r\n          oldParent = context.oldParent,\r\n          parent = shape.parent;\r\n\r\n      if (is$1(oldParent, 'bpmn:Collaboration')) {\r\n\r\n        // do nothing if not necessary\r\n        return;\r\n      }\r\n\r\n      if (is$1(shape, 'bpmn:DataStoreReference') &&\r\n          shape.type !== 'label' &&\r\n          is$1(parent, 'bpmn:Collaboration')) {\r\n\r\n        var participant = is$1(oldParent, 'bpmn:Participant') ?\r\n          oldParent :\r\n          getAncestor(oldParent, 'bpmn:Participant');\r\n\r\n        updateDataStoreParent(shape, participant);\r\n      }\r\n    });\r\n\r\n\r\n    // update data store parents on participant or subprocess deleted\r\n    this.postExecute('shape.delete', function(event) {\r\n      var context = event.context,\r\n          shape = context.shape,\r\n          rootElement = canvas.getRootElement();\r\n\r\n      if (isAny(shape, [ 'bpmn:Participant', 'bpmn:SubProcess' ])\r\n          && is$1(rootElement, 'bpmn:Collaboration')) {\r\n        getDataStores(rootElement)\r\n          .filter(function(dataStore) {\r\n            return isDescendant(dataStore, shape);\r\n          })\r\n          .forEach(function(dataStore) {\r\n            updateDataStoreParent(dataStore);\r\n          });\r\n      }\r\n    });\r\n\r\n    // update data store parents on collaboration -> process\r\n    this.postExecute('canvas.updateRoot', function(event) {\r\n      var context = event.context,\r\n          oldRoot = context.oldRoot,\r\n          newRoot = context.newRoot;\r\n\r\n      var dataStores = getDataStores(oldRoot);\r\n\r\n      dataStores.forEach(function(dataStore) {\r\n\r\n        if (is$1(newRoot, 'bpmn:Process')) {\r\n          updateDataStoreParent(dataStore, newRoot);\r\n        }\r\n\r\n      });\r\n    });\r\n  }\r\n\r\n  DataStoreBehavior.$inject = [\r\n    'canvas',\r\n    'commandStack',\r\n    'elementRegistry',\r\n    'eventBus',\r\n  ];\r\n\r\n  e$3(DataStoreBehavior, CommandInterceptor);\r\n\r\n\r\n  // helpers //////////\r\n\r\n  function isDescendant(descendant, ancestor) {\r\n    var descendantBo = descendant.businessObject || descendant,\r\n        ancestorBo = ancestor.businessObject || ancestor;\r\n\r\n    while (descendantBo.$parent) {\r\n      if (descendantBo.$parent === ancestorBo.processRef || ancestorBo) {\r\n        return true;\r\n      }\r\n\r\n      descendantBo = descendantBo.$parent;\r\n    }\r\n\r\n    return false;\r\n  }\r\n\r\n  function getAncestor(element, type) {\r\n\r\n    while (element.parent) {\r\n      if (is$1(element.parent, type)) {\r\n        return element.parent;\r\n      }\r\n\r\n      element = element.parent;\r\n    }\r\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../../space-tool/BpmnSpaceTool').default} SpaceTool\n   */\n\n  var LOW_PRIORITY$c = 500;\n\n\n  /**\n   * BPMN specific delete lane behavior.\n   *\n   * @param {EventBus} eventBus\n   * @param {SpaceTool} spaceTool\n   */\n  function DeleteLaneBehavior(eventBus, spaceTool) {\n\n    CommandInterceptor.call(this, eventBus);\n\n\n    function compensateLaneDelete(shape, oldParent) {\n\n      var siblings = getChildLanes(oldParent);\n\n      var topAffected = [];\n      var bottomAffected = [];\n\n      eachElement(siblings, function(element) {\n\n        if (element.y > shape.y) {\n          bottomAffected.push(element);\n        } else {\n          topAffected.push(element);\n        }\n\n        return element.children;\n      });\n\n      if (!siblings.length) {\n        return;\n      }\n\n      var offset;\n\n      if (bottomAffected.length && topAffected.length) {\n        offset = shape.height / 2;\n      } else {\n        offset = shape.height;\n      }\n\n      var topAdjustments,\n          bottomAdjustments;\n\n      if (topAffected.length) {\n        topAdjustments = spaceTool.calculateAdjustments(\n          topAffected, 'y', offset, shape.y - 10);\n\n        spaceTool.makeSpace(\n          topAdjustments.movingShapes,\n          topAdjustments.resizingShapes,\n          { x: 0, y: offset }, 's');\n      }\n\n      if (bottomAffected.length) {\n        bottomAdjustments = spaceTool.calculateAdjustments(\n          bottomAffected, 'y', -offset, shape.y + shape.height + 10);\n\n        spaceTool.makeSpace(\n          bottomAdjustments.movingShapes,\n          bottomAdjustments.resizingShapes,\n          { x: 0, y: -offset }, 'n');\n      }\n    }\n\n\n    /**\n     * Adjust sizes of other lanes after lane deletion\n     */\n    this.postExecuted('shape.delete', LOW_PRIORITY$c, function(event) {\n\n      var context = event.context,\n          hints = context.hints,\n          shape = context.shape,\n          oldParent = context.oldParent;\n\n      // only compensate lane deletes\n      if (!is$1(shape, 'bpmn:Lane')) {\n        return;\n      }\n\n      // compensate root deletes only\n      if (hints && hints.nested) {\n        return;\n      }\n\n      compensateLaneDelete(shape, oldParent);\n    });\n  }\n\n  DeleteLaneBehavior.$inject = [\n    'eventBus',\n    'spaceTool'\n  ];\n\n  e$3(DeleteLaneBehavior, CommandInterceptor);\n\n  /**\n   * @typedef {import('../../replace/BpmnReplace').default} BpmnReplace\n   * @typedef {import('didi').Injector} Injector\n   */\n\n  var LOW_PRIORITY$b = 500;\n\n\n  /**\n   * Replace boundary event with intermediate event when creating or moving results in detached event.\n   *\n   * @param {BpmnReplace} bpmnReplace\n   * @param {Injector} injector\n   */\n  function DetachEventBehavior(bpmnReplace, injector) {\n    injector.invoke(CommandInterceptor, this);\n\n    this._bpmnReplace = bpmnReplace;\n\n    var self = this;\n\n    this.postExecuted('elements.create', LOW_PRIORITY$b, function(context) {\n      var elements = context.elements;\n\n      elements.filter(function(shape) {\n        var host = shape.host;\n\n        return shouldReplace(shape, host);\n      }).map(function(shape) {\n        return elements.indexOf(shape);\n      }).forEach(function(index) {\n        context.elements[ index ] = self._replaceShape(elements[ index ]);\n      });\n    }, true);\n\n    this.preExecute('elements.move', LOW_PRIORITY$b, function(context) {\n      var shapes = context.shapes,\n          newHost = context.newHost;\n\n      shapes.forEach(function(shape, index) {\n        var host = shape.host;\n\n        if (shouldReplace(shape, includes$6(shapes, host) ? host : newHost)) {\n          shapes[ index ] = self._replaceShape(shape);\n        }\n      });\n    }, true);\n  }\n\n  DetachEventBehavior.$inject = [\n    'bpmnReplace',\n    'injector'\n  ];\n\n  e$3(DetachEventBehavior, CommandInterceptor);\n\n  DetachEventBehavior.prototype._replaceShape = function(shape) {\n    var eventDefinition = getEventDefinition(shape),\n        intermediateEvent;\n\n    if (eventDefinition) {\n      intermediateEvent = {\n        type: 'bpmn:IntermediateCatchEvent',\n        eventDefinitionType: eventDefinition.$type\n      };\n    } else {\n      intermediateEvent = {\n        type: 'bpmn:IntermediateThrowEvent'\n      };\n    }\n\n    return this._bpmnReplace.replaceElement(shape, intermediateEvent, { layoutConnection: false });\n  };\n\n\n  // helpers //////////\n\n  function getEventDefinition(element) {\n    var businessObject = getBusinessObject(element),\n        eventDefinitions = businessObject.eventDefinitions;\n\n    return eventDefinitions && eventDefinitions[0];\n  }\n\n  function shouldReplace(shape, host) {\n    return !isLabel(shape) && is$1(shape, 'bpmn:BoundaryEvent') && !host;\n  }\n\n  function includes$6(array, item) {\n    return array.indexOf(item) !== -1;\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../../rules/BpmnRules').default} BpmnRules\n   * @typedef {import('../../modeling/Modeling').default} Modeling\n   */\n\n  /**\n   * @param {EventBus} eventBus\n   * @param {BpmnRules} bpmnRules\n   * @param {Modeling} modeling\n   */\n  function DropOnFlowBehavior(eventBus, bpmnRules, modeling) {\n\n    CommandInterceptor.call(this, eventBus);\n\n    /**\n     * Reconnect start / end of a connection after\n     * dropping an element on a flow.\n     */\n\n    function insertShape(shape, targetFlow, positionOrBounds) {\n      var waypoints = targetFlow.waypoints,\n          waypointsBefore,\n          waypointsAfter,\n          dockingPoint,\n          source,\n          target,\n          incomingConnection,\n          outgoingConnection,\n          oldOutgoing = shape.outgoing.slice(),\n          oldIncoming = shape.incoming.slice();\n\n      var mid;\n\n      if (isNumber(positionOrBounds.width)) {\n        mid = getMid(positionOrBounds);\n      } else {\n        mid = positionOrBounds;\n      }\n\n      var intersection = getApproxIntersection(waypoints, mid);\n\n      if (intersection) {\n        waypointsBefore = waypoints.slice(0, intersection.index);\n        waypointsAfter = waypoints.slice(intersection.index + (intersection.bendpoint ? 1 : 0));\n\n        // due to inaccuracy intersection might have been found\n        if (!waypointsBefore.length || !waypointsAfter.length) {\n          return;\n        }\n\n        dockingPoint = intersection.bendpoint ? waypoints[intersection.index] : mid;\n\n        // if last waypointBefore is inside shape's bounds, ignore docking point\n        if (waypointsBefore.length === 1 || !isPointInsideBBox(shape, waypointsBefore[waypointsBefore.length - 1])) {\n          waypointsBefore.push(copy(dockingPoint));\n        }\n\n        // if first waypointAfter is inside shape's bounds, ignore docking point\n        if (waypointsAfter.length === 1 || !isPointInsideBBox(shape, waypointsAfter[0])) {\n          waypointsAfter.unshift(copy(dockingPoint));\n        }\n      }\n\n      source = targetFlow.source;\n      target = targetFlow.target;\n\n      if (bpmnRules.canConnect(source, shape, targetFlow)) {\n\n        // reconnect source -> inserted shape\n        modeling.reconnectEnd(targetFlow, shape, waypointsBefore || mid);\n\n        incomingConnection = targetFlow;\n      }\n\n      if (bpmnRules.canConnect(shape, target, targetFlow)) {\n\n        if (!incomingConnection) {\n\n          // reconnect inserted shape -> end\n          modeling.reconnectStart(targetFlow, shape, waypointsAfter || mid);\n\n          outgoingConnection = targetFlow;\n        } else {\n          outgoingConnection = modeling.connect(\n            shape, target, { type: targetFlow.type, waypoints: waypointsAfter }\n          );\n        }\n      }\n\n      var duplicateConnections = [].concat(\n\n        incomingConnection && filter(oldIncoming, function(connection) {\n          return connection.source === incomingConnection.source;\n        }) || [],\n\n        outgoingConnection && filter(oldOutgoing, function(connection) {\n          return connection.target === outgoingConnection.target;\n        }) || []\n      );\n\n      if (duplicateConnections.length) {\n        modeling.removeElements(duplicateConnections);\n      }\n    }\n\n    this.preExecute('elements.move', function(context) {\n\n      var newParent = context.newParent,\n          shapes = context.shapes,\n          delta = context.delta,\n          shape = shapes[0];\n\n      if (!shape || !newParent) {\n        return;\n      }\n\n      // if the new parent is a connection,\n      // change it to the new parent's parent\n      if (newParent && newParent.waypoints) {\n        context.newParent = newParent = newParent.parent;\n      }\n\n      var shapeMid = getMid(shape);\n      var newShapeMid = {\n        x: shapeMid.x + delta.x,\n        y: shapeMid.y + delta.y\n      };\n\n      // find a connection which intersects with the\n      // element's mid point\n      var connection = find(newParent.children, function(element) {\n        var canInsert = bpmnRules.canInsert(shapes, element);\n\n        return canInsert && getApproxIntersection(element.waypoints, newShapeMid);\n      });\n\n      if (connection) {\n        context.targetFlow = connection;\n        context.position = newShapeMid;\n      }\n\n    }, true);\n\n    this.postExecuted('elements.move', function(context) {\n\n      var shapes = context.shapes,\n          targetFlow = context.targetFlow,\n          position = context.position;\n\n      if (targetFlow) {\n        insertShape(shapes[0], targetFlow, position);\n      }\n\n    }, true);\n\n    this.preExecute('shape.create', function(context) {\n\n      var parent = context.parent,\n          shape = context.shape;\n\n      if (bpmnRules.canInsert(shape, parent)) {\n        context.targetFlow = parent;\n        context.parent = parent.parent;\n      }\n    }, true);\n\n    this.postExecuted('shape.create', function(context) {\n\n      var shape = context.shape,\n          targetFlow = context.targetFlow,\n          positionOrBounds = context.position;\n\n      if (targetFlow) {\n        insertShape(shape, targetFlow, positionOrBounds);\n      }\n    }, true);\n  }\n\n  e$3(DropOnFlowBehavior, CommandInterceptor);\n\n  DropOnFlowBehavior.$inject = [\n    'eventBus',\n    'bpmnRules',\n    'modeling'\n  ];\n\n\n  // helpers /////////////////////\n\n  function isPointInsideBBox(bbox, point) {\n    var x = point.x,\n        y = point.y;\n\n    return x >= bbox.x &&\n      x <= bbox.x + bbox.width &&\n      y >= bbox.y &&\n      y <= bbox.y + bbox.height;\n  }\n\n  function copy(obj) {\n    return assign$1({}, obj);\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   */\n  function EventBasedGatewayBehavior(eventBus, modeling) {\n\n    CommandInterceptor.call(this, eventBus);\n\n    /**\n     * Remove incoming sequence flows of event-based target when creating\n     * sequence flow.\n     *\n     * 1. If source is event-based gateway remove all incoming sequence flows\n     * 2. If source is not event-based gateway remove all incoming sequence flows\n     * whose source is event-based gateway\n     */\n    this.preExecuted('connection.create', function(event) {\n      var context = event.context,\n          connection = context.connection,\n          source = context.source,\n          target = context.target,\n          hints = context.hints;\n\n      if (hints && hints.createElementsBehavior === false) {\n        return;\n      }\n\n      if (!isSequenceFlow(connection)) {\n        return;\n      }\n\n      var sequenceFlows = [];\n\n      if (is$1(source, 'bpmn:EventBasedGateway')) {\n        sequenceFlows = target.incoming.filter(isSequenceFlow);\n      } else {\n        sequenceFlows = target.incoming.filter(function(connection) {\n          return isSequenceFlow(connection)\n            && is$1(connection.source, 'bpmn:EventBasedGateway');\n        });\n      }\n\n      sequenceFlows.forEach(function(sequenceFlow) {\n        modeling.removeConnection(sequenceFlow);\n      });\n    });\n\n    /**\n     * Remove incoming sequence flows of event-based targets when replacing source\n     * with event-based gateway.\n     */\n    this.preExecuted('shape.replace', function(event) {\n      var context = event.context,\n          newShape = context.newShape;\n\n      if (!is$1(newShape, 'bpmn:EventBasedGateway')) {\n        return;\n      }\n\n      var targets = newShape.outgoing.filter(isSequenceFlow)\n        .reduce(function(targets, sequenceFlow) {\n          if (!targets.includes(sequenceFlow.target)) {\n            return targets.concat(sequenceFlow.target);\n          }\n\n          return targets;\n        }, []);\n\n      targets.forEach(function(target) {\n        target.incoming.filter(isSequenceFlow).forEach(function(sequenceFlow) {\n          const sequenceFlowsFromNewShape = target.incoming.filter(isSequenceFlow).filter(function(sequenceFlow) {\n            return sequenceFlow.source === newShape;\n          });\n\n          if (sequenceFlow.source !== newShape || sequenceFlowsFromNewShape.length > 1) {\n            modeling.removeConnection(sequenceFlow);\n          }\n        });\n      });\n    });\n  }\n\n  EventBasedGatewayBehavior.$inject = [\n    'eventBus',\n    'modeling'\n  ];\n\n  e$3(EventBasedGatewayBehavior, CommandInterceptor);\n\n  // helpers //////////\n\n  function isSequenceFlow(connection) {\n    return is$1(connection, 'bpmn:SequenceFlow');\n  }\n\n  /**\r\n   * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\r\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\r\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\r\n   */\r\n\r\n  var HIGH_PRIORITY$a = 1500;\r\n  var HIGHEST_PRIORITY = 2000;\r\n\r\n\r\n  /**\r\n   * Correct hover targets in certain situations to improve diagram interaction.\r\n   *\r\n   * @param {ElementRegistry} elementRegistry\r\n   * @param {EventBus} eventBus\r\n   * @param {Canvas} canvas\r\n   */\r\n  function FixHoverBehavior(elementRegistry, eventBus, canvas) {\r\n\r\n    eventBus.on([\r\n      'create.hover',\r\n      'create.move',\r\n      'create.out',\r\n      'create.end',\r\n      'shape.move.hover',\r\n      'shape.move.move',\r\n      'shape.move.out',\r\n      'shape.move.end'\r\n    ], HIGH_PRIORITY$a, function(event) {\r\n      var context = event.context,\r\n          shape = context.shape || event.shape,\r\n          hover = event.hover;\r\n\r\n      // ensure elements are not dropped onto a bpmn:Lane but onto\r\n      // the underlying bpmn:Participant\r\n      if (is$1(hover, 'bpmn:Lane') && !isAny(shape, [ 'bpmn:Lane', 'bpmn:Participant' ])) {\r\n        event.hover = getLanesRoot(hover);\r\n        event.hoverGfx = elementRegistry.getGraphics(event.hover);\r\n      }\r\n\r\n      var rootElement = canvas.getRootElement();\r\n\r\n      // ensure bpmn:Group and label elements are dropped\r\n      // always onto the root\r\n      if (hover !== rootElement && (shape.labelTarget || is$1(shape, 'bpmn:Group'))) {\r\n        event.hover = rootElement;\r\n        event.hoverGfx = elementRegistry.getGraphics(event.hover);\r\n      }\r\n    });\r\n\r\n    eventBus.on([\r\n      'connect.hover',\r\n      'connect.out',\r\n      'connect.end',\r\n      'connect.cleanup',\r\n      'global-connect.hover',\r\n      'global-connect.out',\r\n      'global-connect.end',\r\n      'global-connect.cleanup'\r\n    ], HIGH_PRIORITY$a, function(event) {\r\n      var hover = event.hover;\r\n\r\n      // ensure connections start/end on bpmn:Participant,\r\n      // not the underlying bpmn:Lane\r\n      if (is$1(hover, 'bpmn:Lane')) {\r\n        event.hover = getLanesRoot(hover) || hover;\r\n        event.hoverGfx = elementRegistry.getGraphics(event.hover);\r\n      }\r\n    });\r\n\r\n\r\n    eventBus.on([\r\n      'bendpoint.move.hover'\r\n    ], HIGH_PRIORITY$a, function(event) {\r\n      var context = event.context,\r\n          hover = event.hover,\r\n          type = context.type;\r\n\r\n      // ensure reconnect start/end on bpmn:Participant,\r\n      // not the underlying bpmn:Lane\r\n      if (is$1(hover, 'bpmn:Lane') && /reconnect/.test(type)) {\r\n        event.hover = getLanesRoot(hover) || hover;\r\n        event.hoverGfx = elementRegistry.getGraphics(event.hover);\r\n      }\r\n    });\r\n\r\n\r\n    eventBus.on([\r\n      'connect.start'\r\n    ], HIGH_PRIORITY$a, function(event) {\r\n      var context = event.context,\r\n          start = context.start;\r\n\r\n      // ensure connect start on bpmn:Participant,\r\n      // not the underlying bpmn:Lane\r\n      if (is$1(start, 'bpmn:Lane')) {\r\n        context.start = getLanesRoot(start) || start;\r\n      }\r\n    });\r\n\r\n\r\n    // allow movement of participants from lanes\r\n    eventBus.on('shape.move.start', HIGHEST_PRIORITY, function(event) {\r\n      var shape = event.shape;\r\n\r\n      if (is$1(shape, 'bpmn:Lane')) {\r\n        event.shape = getLanesRoot(shape) || shape;\r\n      }\r\n    });\r\n\r\n  }\r\n\r\n  FixHoverBehavior.$inject = [\r\n    'elementRegistry',\r\n    'eventBus',\r\n    'canvas'\r\n  ];\n\n  /**\n   * @typedef {import('../../BpmnFactory').default} BpmnFactory\n   *\n   * @typedef {import('../../../model/Types').ModdleElement} ModdleElement\n   */\n\n  /**\n   * Creates a new bpmn:CategoryValue inside a new bpmn:Category\n   *\n   * @param {BpmnFactory} bpmnFactory\n   *\n   * @return {ModdleElement}\n   */\n  function createCategory(bpmnFactory) {\n    return bpmnFactory.create('bpmn:Category');\n  }\n\n  /**\n   * Creates a new bpmn:CategoryValue inside a new bpmn:Category\n   *\n   * @param {BpmnFactory} bpmnFactory\n   *\n   * @return {ModdleElement}\n   */\n  function createCategoryValue(bpmnFactory) {\n    return bpmnFactory.create('bpmn:CategoryValue');\n  }\n\n  /**\n   * Adds category value to definitions\n   *\n   * @param {ModdleElement} categoryValue\n   * @param {ModdleElement} category\n   * @param {ModdleElement} definitions\n   *\n   * @return {ModdleElement}\n   */\n  function linkCategoryValue(categoryValue, category, definitions) {\n    add(category.get('categoryValue'), categoryValue);\n    categoryValue.$parent = category;\n\n    add(definitions.get('rootElements'), category);\n    category.$parent = definitions;\n\n    return categoryValue;\n  }\n\n  /**\n   * Unlink category value from parent\n   *\n   * @param {ModdleElement} categoryValue\n   *\n   * @return {ModdleElement}\n   */\n  function unlinkCategoryValue(categoryValue) {\n    var category = categoryValue.$parent;\n\n    if (category) {\n      remove(category.get('categoryValue'), categoryValue);\n      categoryValue.$parent = null;\n    }\n\n    return categoryValue;\n  }\n\n  /**\n   * Unlink category from parent\n   *\n   * @param {ModdleElement} category\n   *\n   * @return {ModdleElement}\n   */\n  function unlinkCategory(category) {\n    var definitions = category.$parent;\n\n    if (definitions) {\n      remove(definitions.get('rootElements'), category);\n      category.$parent = null;\n    }\n\n    return category;\n  }\n\n  /**\n   * @typedef {import('../BpmnFactory').default} BpmnFactory\n   * @typedef {import('../../../Modeler').default} Modeler\n   * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('didi').Injector} Injector\n   * @typedef {import('../../copy-paste/ModdleCopy').default} ModdleCopy\n   *\n   * @typedef {import('../../../model/Types').Element} Element\n   * @typedef {import('../../../model/Types').Shape} Shape\n   *\n   * @typedef {import('diagram-js/lib/util/Types').DirectionTRBL} DirectionTRBL\n   */\n\n  var LOWER_PRIORITY = 770;\n\n\n  /**\n   * BPMN specific group behavior.\n   *\n   * @param {BpmnFactory} bpmnFactory\n   * @param {Modeler} bpmnjs\n   * @param {ElementRegistry} elementRegistry\n   * @param {EventBus} eventBus\n   * @param {Injector} injector\n   * @param {ModdleCopy} moddleCopy\n   */\n  function GroupBehavior(\n      bpmnFactory,\n      bpmnjs,\n      elementRegistry,\n      eventBus,\n      injector,\n      moddleCopy\n  ) {\n    injector.invoke(CommandInterceptor, this);\n\n    /**\n     * Returns all group element in the current registry.\n     *\n     * @return {Shape[]}\n     */\n    function getGroupElements() {\n      return elementRegistry.filter(function(e) {\n        return is$1(e, 'bpmn:Group');\n      });\n    }\n\n    /**\n     * Returns true if given category is referenced in one of the given elements.\n     *\n     * @param {Element[]} elements\n     * @param {ModdleElement} category\n     *\n     * @return {boolean}\n     */\n    function isReferencedCategory(elements, category) {\n      return elements.some(function(element) {\n        var businessObject = getBusinessObject(element);\n\n        var _category = businessObject.categoryValueRef && businessObject.categoryValueRef.$parent;\n\n        return _category === category;\n      });\n    }\n\n    /**\n     * Returns true if given categoryValue is referenced in one of the given elements.\n     *\n     * @param {Element[]} elements\n     * @param {ModdleElement} categoryValue\n     *\n     * @return {boolean}\n     */\n    function isReferencedCategoryValue(elements, categoryValue) {\n      return elements.some(function(element) {\n        var businessObject = getBusinessObject(element);\n\n        return businessObject.categoryValueRef === categoryValue;\n      });\n    }\n\n    /**\n     * Remove category value unless it is still referenced.\n     *\n     * @param {ModdleElement} categoryValue\n     * @param {ModdleElement} category\n     * @param {ModdleElement} businessObject\n     */\n    function removeCategoryValue(categoryValue, category, businessObject) {\n\n      var groups = getGroupElements().filter(function(element) {\n        return element.businessObject !== businessObject;\n      });\n\n      if (category && !isReferencedCategory(groups, category)) {\n        unlinkCategory(category);\n      }\n\n      if (categoryValue && !isReferencedCategoryValue(groups, categoryValue)) {\n        unlinkCategoryValue(categoryValue);\n      }\n    }\n\n    /**\n     * Add category value.\n     *\n     * @param {ModdleElement} categoryValue\n     * @param {ModdleElement} category\n     *\n     * @return {ModdleElement}\n     */\n    function addCategoryValue(categoryValue, category) {\n      return linkCategoryValue(categoryValue, category, bpmnjs.getDefinitions());\n    }\n\n    function setCategoryValue(element, context) {\n      var businessObject = getBusinessObject(element),\n          categoryValue = businessObject.categoryValueRef;\n\n      if (!categoryValue) {\n        categoryValue =\n        businessObject.categoryValueRef =\n        context.categoryValue = (\n          context.categoryValue || createCategoryValue(bpmnFactory)\n        );\n      }\n\n      var category = categoryValue.$parent;\n\n      if (!category) {\n        category =\n        categoryValue.$parent =\n        context.category = (\n          context.category || createCategory(bpmnFactory)\n        );\n      }\n\n      addCategoryValue(categoryValue, category, bpmnjs.getDefinitions());\n    }\n\n    function unsetCategoryValue(element, context) {\n      var category = context.category,\n          categoryValue = context.categoryValue,\n          businessObject = getBusinessObject(element);\n\n      if (categoryValue) {\n        businessObject.categoryValueRef = null;\n\n        removeCategoryValue(categoryValue, category, businessObject);\n      } else {\n        removeCategoryValue(null, businessObject.categoryValueRef.$parent, businessObject);\n      }\n    }\n\n\n    // ensure category + value exist before label editing\n\n    this.execute('label.create', function(event) {\n      var context = event.context,\n          labelTarget = context.labelTarget;\n\n      if (!is$1(labelTarget, 'bpmn:Group')) {\n        return;\n      }\n\n      setCategoryValue(labelTarget, context);\n    });\n\n    this.revert('label.create', function(event) {\n      var context = event.context,\n          labelTarget = context.labelTarget;\n\n      if (!is$1(labelTarget, 'bpmn:Group')) {\n        return;\n      }\n\n      unsetCategoryValue(labelTarget, context);\n    });\n\n\n    // remove referenced category + value when group was deleted\n\n    this.execute('shape.delete', function(event) {\n\n      var context = event.context,\n          shape = context.shape,\n          businessObject = getBusinessObject(shape);\n\n      if (!is$1(shape, 'bpmn:Group') || shape.labelTarget) {\n        return;\n      }\n\n      var categoryValue = context.categoryValue = businessObject.categoryValueRef,\n          category;\n\n      if (categoryValue) {\n        category = context.category = categoryValue.$parent;\n\n        removeCategoryValue(categoryValue, category, businessObject);\n\n        businessObject.categoryValueRef = null;\n      }\n    });\n\n    this.reverted('shape.delete', function(event) {\n\n      var context = event.context,\n          shape = context.shape;\n\n      if (!is$1(shape, 'bpmn:Group') || shape.labelTarget) {\n        return;\n      }\n\n      var category = context.category,\n          categoryValue = context.categoryValue,\n          businessObject = getBusinessObject(shape);\n\n      if (categoryValue) {\n        businessObject.categoryValueRef = categoryValue;\n\n        addCategoryValue(categoryValue, category);\n      }\n    });\n\n\n    // create new category + value when group was created\n\n    this.execute('shape.create', function(event) {\n      var context = event.context,\n          shape = context.shape;\n\n      if (!is$1(shape, 'bpmn:Group') || shape.labelTarget) {\n        return;\n      }\n\n      if (getBusinessObject(shape).categoryValueRef) {\n        setCategoryValue(shape, context);\n      }\n    });\n\n    this.reverted('shape.create', function(event) {\n\n      var context = event.context,\n          shape = context.shape;\n\n      if (!is$1(shape, 'bpmn:Group') || shape.labelTarget) {\n        return;\n      }\n\n      if (getBusinessObject(shape).categoryValueRef) {\n        unsetCategoryValue(shape, context);\n      }\n    });\n\n\n    // copy + paste categoryValueRef with group\n\n    function copy(bo, clone) {\n      var targetBo = bpmnFactory.create(bo.$type);\n\n      return moddleCopy.copyElement(bo, targetBo, null, clone);\n    }\n\n    eventBus.on('copyPaste.copyElement', LOWER_PRIORITY, function(context) {\n      var descriptor = context.descriptor,\n          element = context.element;\n\n      if (!is$1(element, 'bpmn:Group') || element.labelTarget) {\n        return;\n      }\n\n      var groupBo = getBusinessObject(element);\n\n      if (groupBo.categoryValueRef) {\n\n        var categoryValue = groupBo.categoryValueRef;\n\n        descriptor.categoryValue = copy(categoryValue, true);\n\n        if (categoryValue.$parent) {\n          descriptor.category = copy(categoryValue.$parent, true);\n        }\n      }\n    });\n\n    eventBus.on('copyPaste.pasteElement', LOWER_PRIORITY, function(context) {\n      var descriptor = context.descriptor,\n          businessObject = descriptor.businessObject,\n          categoryValue = descriptor.categoryValue,\n          category = descriptor.category;\n\n      if (categoryValue) {\n        categoryValue = businessObject.categoryValueRef = copy(categoryValue);\n      }\n\n      if (category) {\n        categoryValue.$parent = copy(category);\n      }\n\n      delete descriptor.category;\n      delete descriptor.categoryValue;\n    });\n\n  }\n\n  GroupBehavior.$inject = [\n    'bpmnFactory',\n    'bpmnjs',\n    'elementRegistry',\n    'eventBus',\n    'injector',\n    'moddleCopy'\n  ];\n\n  e$3(GroupBehavior, CommandInterceptor);\n\n  /**\n   * @typedef {import('diagram-js/lib/util/Types').Point} Point\n   */\n\n  /**\n   * Returns the intersection between two line segments a and b.\n   *\n   * @param {Point} l1s\n   * @param {Point} l1e\n   * @param {Point} l2s\n   * @param {Point} l2e\n   *\n   * @return {Point}\n   */\n  function lineIntersect(l1s, l1e, l2s, l2e) {\n\n    // if the lines intersect, the result contains the x and y of the\n    // intersection (treating the lines as infinite) and booleans for\n    // whether line segment 1 or line segment 2 contain the point\n    var denominator, a, b, c, numerator;\n\n    denominator = ((l2e.y - l2s.y) * (l1e.x - l1s.x)) - ((l2e.x - l2s.x) * (l1e.y - l1s.y));\n\n    if (denominator == 0) {\n      return null;\n    }\n\n    a = l1s.y - l2s.y;\n    b = l1s.x - l2s.x;\n    numerator = ((l2e.x - l2s.x) * a) - ((l2e.y - l2s.y) * b);\n\n    c = numerator / denominator;\n\n    // if we cast these lines infinitely in\n    // both directions, they intersect here\n    return {\n      x: Math.round(l1s.x + (c * (l1e.x - l1s.x))),\n      y: Math.round(l1s.y + (c * (l1e.y - l1s.y)))\n    };\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   */\n\n  /**\n   * Fix broken dockings after DI imports.\n   *\n   * @param {EventBus} eventBus\n   */\n  function ImportDockingFix(eventBus) {\n\n    function adjustDocking(startPoint, nextPoint, elementMid) {\n\n      var elementTop = {\n        x: elementMid.x,\n        y: elementMid.y - 50\n      };\n\n      var elementLeft = {\n        x: elementMid.x - 50,\n        y: elementMid.y\n      };\n\n      var verticalIntersect = lineIntersect(startPoint, nextPoint, elementMid, elementTop),\n          horizontalIntersect = lineIntersect(startPoint, nextPoint, elementMid, elementLeft);\n\n      // original is horizontal or vertical center cross intersection\n      var centerIntersect;\n\n      if (verticalIntersect && horizontalIntersect) {\n        if (getDistance$1(verticalIntersect, elementMid) > getDistance$1(horizontalIntersect, elementMid)) {\n          centerIntersect = horizontalIntersect;\n        } else {\n          centerIntersect = verticalIntersect;\n        }\n      } else {\n        centerIntersect = verticalIntersect || horizontalIntersect;\n      }\n\n      startPoint.original = centerIntersect;\n    }\n\n    function fixDockings(connection) {\n      var waypoints = connection.waypoints;\n\n      adjustDocking(\n        waypoints[0],\n        waypoints[1],\n        getMid(connection.source)\n      );\n\n      adjustDocking(\n        waypoints[waypoints.length - 1],\n        waypoints[waypoints.length - 2],\n        getMid(connection.target)\n      );\n    }\n\n    eventBus.on('bpmnElement.added', function(e) {\n\n      var element = e.element;\n\n      if (element.waypoints) {\n        fixDockings(element);\n      }\n    });\n  }\n\n  ImportDockingFix.$inject = [\n    'eventBus'\n  ];\n\n\n  // helpers //////////////////////\n\n  function getDistance$1(p1, p2) {\n    return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2));\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   */\n\n  /**\n   * A component that makes sure that each created or updated\n   * Pool and Lane is assigned an isHorizontal property set to true.\n   *\n   * @param {EventBus} eventBus\n   */\n  function IsHorizontalFix(eventBus) {\n\n    CommandInterceptor.call(this, eventBus);\n\n    var elementTypesToUpdate = [\n      'bpmn:Participant',\n      'bpmn:Lane'\n    ];\n\n    this.executed([ 'shape.move', 'shape.create', 'shape.resize' ], function(event) {\n      var shape = event.context.shape,\n          bo = getBusinessObject(shape),\n          di = getDi(shape);\n\n      if (isAny(bo, elementTypesToUpdate) && !di.get('isHorizontal')) {\n\n        // set attribute directly to avoid modeling#updateProperty side effects\n        di.set('isHorizontal', true);\n      }\n    });\n\n  }\n\n  IsHorizontalFix.$inject = [ 'eventBus' ];\n\n  e$3(IsHorizontalFix, CommandInterceptor);\n\n  /**\n   * @typedef {import('diagram-js/lib/util/Types').Point} Point\n   *\n   * @typedef { {\n  *   type: 'bendpoint' | 'segment';\n  *   position: Point;\n  *   segmentIndex: number;\n  *   bendpointIndex?: number;\n  *   relativeLocation?: number;\n  * } } Attachment\n  */\n\n  var sqrt = Math.sqrt,\n      min$1 = Math.min,\n      max$3 = Math.max,\n      abs$3 = Math.abs;\n\n  /**\n   * Calculate the square (power to two) of a number.\n   *\n   * @param {number} n\n   *\n   * @return {number}\n   */\n  function sq(n) {\n    return Math.pow(n, 2);\n  }\n\n  /**\n   * Get distance between two points.\n   *\n   * @param {Point} p1\n   * @param {Point} p2\n   *\n   * @return {number}\n   */\n  function getDistance(p1, p2) {\n    return sqrt(sq(p1.x - p2.x) + sq(p1.y - p2.y));\n  }\n\n  /**\n   * Return the attachment of the given point on the specified line.\n   *\n   * The attachment is either a bendpoint (attached to the given point)\n   * or segment (attached to a location on a line segment) attachment:\n   *\n   * ```javascript\n   * var pointAttachment = {\n   *   type: 'bendpoint',\n   *   bendpointIndex: 3,\n   *   position: { x: 10, y: 10 } // the attach point on the line\n   * };\n   *\n   * var segmentAttachment = {\n   *   type: 'segment',\n   *   segmentIndex: 2,\n   *   relativeLocation: 0.31, // attach point location between 0 (at start) and 1 (at end)\n   *   position: { x: 10, y: 10 } // the attach point on the line\n   * };\n   * ```\n   *\n   * @param {Point} point\n   * @param {Point[]} line\n   *\n   * @return {Attachment}\n   */\n  function getAttachment(point, line) {\n\n    var idx = 0,\n        segmentStart,\n        segmentEnd,\n        segmentStartDistance,\n        segmentEndDistance,\n        attachmentPosition,\n        minDistance,\n        intersections,\n        attachment,\n        attachmentDistance,\n        closestAttachmentDistance,\n        closestAttachment;\n\n    for (idx = 0; idx < line.length - 1; idx++) {\n\n      segmentStart = line[idx];\n      segmentEnd = line[idx + 1];\n\n      if (pointsEqual(segmentStart, segmentEnd)) {\n        intersections = [ segmentStart ];\n      } else {\n        segmentStartDistance = getDistance(point, segmentStart);\n        segmentEndDistance = getDistance(point, segmentEnd);\n\n        minDistance = min$1(segmentStartDistance, segmentEndDistance);\n\n        intersections = getCircleSegmentIntersections(segmentStart, segmentEnd, point, minDistance);\n      }\n\n      if (intersections.length < 1) {\n        throw new Error('expected between [1, 2] circle -> line intersections');\n      }\n\n      // one intersection -> bendpoint attachment\n      if (intersections.length === 1) {\n        attachment = {\n          type: 'bendpoint',\n          position: intersections[0],\n          segmentIndex: idx,\n          bendpointIndex: pointsEqual(segmentStart, intersections[0]) ? idx : idx + 1\n        };\n      }\n\n      // two intersections -> segment attachment\n      if (intersections.length === 2) {\n\n        attachmentPosition = mid$1(intersections[0], intersections[1]);\n\n        attachment = {\n          type: 'segment',\n          position: attachmentPosition,\n          segmentIndex: idx,\n          relativeLocation: getDistance(segmentStart, attachmentPosition) / getDistance(segmentStart, segmentEnd)\n        };\n      }\n\n      attachmentDistance = getDistance(attachment.position, point);\n\n      if (!closestAttachment || closestAttachmentDistance > attachmentDistance) {\n        closestAttachment = attachment;\n        closestAttachmentDistance = attachmentDistance;\n      }\n    }\n\n    return closestAttachment;\n  }\n\n  /**\n   * Get the intersection between a circle and a line segment.\n   *\n   * @param {Point} s1 segment start\n   * @param {Point} s2 segment end\n   * @param {Point} cc circle center\n   * @param {number} cr circle radius\n   *\n   * @return {Point[]} intersections\n   */\n  function getCircleSegmentIntersections(s1, s2, cc, cr) {\n\n    var baX = s2.x - s1.x;\n    var baY = s2.y - s1.y;\n    var caX = cc.x - s1.x;\n    var caY = cc.y - s1.y;\n\n    var a = baX * baX + baY * baY;\n    var bBy2 = baX * caX + baY * caY;\n    var c = caX * caX + caY * caY - cr * cr;\n\n    var pBy2 = bBy2 / a;\n    var q = c / a;\n\n    var disc = pBy2 * pBy2 - q;\n\n    // check against negative value to work around\n    // negative, very close to zero results (-4e-15)\n    // being produced in some environments\n    if (disc < 0 && disc > -0.000001) {\n      disc = 0;\n    }\n\n    if (disc < 0) {\n      return [];\n    }\n\n    // if disc == 0 ... dealt with later\n    var tmpSqrt = sqrt(disc);\n    var abScalingFactor1 = -pBy2 + tmpSqrt;\n    var abScalingFactor2 = -pBy2 - tmpSqrt;\n\n    var i1 = {\n      x: s1.x - baX * abScalingFactor1,\n      y: s1.y - baY * abScalingFactor1\n    };\n\n    if (disc === 0) { // abScalingFactor1 == abScalingFactor2\n      return [ i1 ];\n    }\n\n    var i2 = {\n      x: s1.x - baX * abScalingFactor2,\n      y: s1.y - baY * abScalingFactor2\n    };\n\n    // return only points on line segment\n    return [ i1, i2 ].filter(function(p) {\n      return isPointInSegment(p, s1, s2);\n    });\n  }\n\n\n  function isPointInSegment(p, segmentStart, segmentEnd) {\n    return (\n      fenced(p.x, segmentStart.x, segmentEnd.x) &&\n      fenced(p.y, segmentStart.y, segmentEnd.y)\n    );\n  }\n\n  function fenced(n, rangeStart, rangeEnd) {\n\n    // use matching threshold to work around\n    // precision errors in intersection computation\n\n    return (\n      n >= min$1(rangeStart, rangeEnd) - EQUAL_THRESHOLD &&\n      n <= max$3(rangeStart, rangeEnd) + EQUAL_THRESHOLD\n    );\n  }\n\n  /**\n   * Calculate the mid between two points.\n   *\n   * @param {Point} p1\n   * @param {Point} p2\n   *\n   * @return {Point}\n   */\n  function mid$1(p1, p2) {\n\n    return {\n      x: (p1.x + p2.x) / 2,\n      y: (p1.y + p2.y) / 2\n    };\n  }\n\n  var EQUAL_THRESHOLD = 0.1;\n\n  function pointsEqual(p1, p2) {\n\n    return (\n      abs$3(p1.x - p2.x) <= EQUAL_THRESHOLD &&\n      abs$3(p1.y - p2.y) <= EQUAL_THRESHOLD\n    );\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/util/Types').Point} Point\n   *\n   * @typedef {import('./LineAttachmentUtil').Attachment} Attachment\n   *\n   * @typedef { {\n   *   point: Point;\n   *   delta: Point;\n   * } } AnchorPointAdjustment\n   *\n   * @typedef { {\n   *   segmentMove?: {\n  *     segmentStartIndex: number;\n  *     newSegmentStartIndex: number;\n  *   };\n  *   bendpointMove?: {\n  *     insert: boolean;\n  *     bendpointIndex: number;\n  *   };\n  *   connectionStart: boolean;\n  *   connectionEnd: boolean;\n  * } } FindNewLineStartIndexHints\n   */\n\n  /**\n   * @param {Point[]} oldWaypoints\n   * @param {Point[]} newWaypoints\n   * @param {Attachment} attachment\n   * @param {FindNewLineStartIndexHints} hints\n   *\n   * @return {number}\n   */\n  function findNewLineStartIndex(oldWaypoints, newWaypoints, attachment, hints) {\n\n    var index = attachment.segmentIndex;\n\n    var offset = newWaypoints.length - oldWaypoints.length;\n\n    // segmentMove happened\n    if (hints.segmentMove) {\n\n      var oldSegmentStartIndex = hints.segmentMove.segmentStartIndex,\n          newSegmentStartIndex = hints.segmentMove.newSegmentStartIndex;\n\n      // if point was on moved segment return new segment index\n      if (index === oldSegmentStartIndex) {\n        return newSegmentStartIndex;\n      }\n\n      // point is after new segment index\n      if (index >= newSegmentStartIndex) {\n        return (index + offset < newSegmentStartIndex) ? newSegmentStartIndex : index + offset;\n      }\n\n      // if point is before new segment index\n      return index;\n    }\n\n    // bendpointMove happened\n    if (hints.bendpointMove) {\n\n      var insert = hints.bendpointMove.insert,\n          bendpointIndex = hints.bendpointMove.bendpointIndex,\n          newIndex;\n\n      // waypoints length didnt change\n      if (offset === 0) {\n        return index;\n      }\n\n      // point behind new/removed bendpoint\n      if (index >= bendpointIndex) {\n        newIndex = insert ? index + 1 : index - 1;\n      }\n\n      // point before new/removed bendpoint\n      if (index < bendpointIndex) {\n\n        newIndex = index;\n\n        // decide point should take right or left segment\n        if (insert && attachment.type !== 'bendpoint' && bendpointIndex - 1 === index) {\n\n          var rel = relativePositionMidWaypoint(newWaypoints, bendpointIndex);\n\n          if (rel < attachment.relativeLocation) {\n            newIndex++;\n          }\n        }\n      }\n\n      return newIndex;\n    }\n\n    // start/end changed\n    if (offset === 0) {\n      return index;\n    }\n\n    if (hints.connectionStart && index === 0) {\n      return 0;\n    }\n\n    if (hints.connectionEnd && index === oldWaypoints.length - 2) {\n      return newWaypoints.length - 2;\n    }\n\n    // if nothing fits, take the middle segment\n    return Math.floor((newWaypoints.length - 2) / 2);\n  }\n\n\n  /**\n   * Calculate the required adjustment (move delta) for the given point\n   * after the connection waypoints got updated.\n   *\n   * @param {Point} position\n   * @param {Point[]} newWaypoints\n   * @param {Point[]} oldWaypoints\n   * @param {FindNewLineStartIndexHints} hints\n   *\n   * @return {AnchorPointAdjustment} result\n   */\n  function getAnchorPointAdjustment(position, newWaypoints, oldWaypoints, hints) {\n\n    var dx = 0,\n        dy = 0;\n\n    var oldPosition = {\n      point: position,\n      delta: { x: 0, y: 0 }\n    };\n\n    // get closest attachment\n    var attachment = getAttachment(position, oldWaypoints),\n        oldLabelLineIndex = attachment.segmentIndex,\n        newLabelLineIndex = findNewLineStartIndex(oldWaypoints, newWaypoints, attachment, hints);\n\n\n    // should never happen\n    // TODO(@janstuemmel): throw an error here when connectionSegmentMove is refactored\n    if (newLabelLineIndex < 0 ||\n        newLabelLineIndex > newWaypoints.length - 2 ||\n        newLabelLineIndex === null) {\n      return oldPosition;\n    }\n\n    var oldLabelLine = getLine(oldWaypoints, oldLabelLineIndex),\n        newLabelLine = getLine(newWaypoints, newLabelLineIndex),\n        oldFoot = attachment.position;\n\n    var relativeFootPosition = getRelativeFootPosition(oldLabelLine, oldFoot),\n        angleDelta = getAngleDelta(oldLabelLine, newLabelLine);\n\n    // special rule if label on bendpoint\n    if (attachment.type === 'bendpoint') {\n\n      var offset = newWaypoints.length - oldWaypoints.length,\n          oldBendpointIndex = attachment.bendpointIndex,\n          oldBendpoint = oldWaypoints[oldBendpointIndex];\n\n      // bendpoint position hasn't changed, return same position\n      if (newWaypoints.indexOf(oldBendpoint) !== -1) {\n        return oldPosition;\n      }\n\n      // new bendpoint and old bendpoint have same index, then just return the offset\n      if (offset === 0) {\n        var newBendpoint = newWaypoints[oldBendpointIndex];\n\n        dx = newBendpoint.x - attachment.position.x,\n        dy = newBendpoint.y - attachment.position.y;\n\n        return {\n          delta: {\n            x: dx,\n            y: dy\n          },\n          point: {\n            x: position.x + dx,\n            y: position.y + dy\n          }\n        };\n      }\n\n      // if bendpoints get removed\n      if (offset < 0 && oldBendpointIndex !== 0 && oldBendpointIndex < oldWaypoints.length - 1) {\n        relativeFootPosition = relativePositionMidWaypoint(oldWaypoints, oldBendpointIndex);\n      }\n    }\n\n    var newFoot = {\n      x: (newLabelLine[1].x - newLabelLine[0].x) * relativeFootPosition + newLabelLine[0].x,\n      y: (newLabelLine[1].y - newLabelLine[0].y) * relativeFootPosition + newLabelLine[0].y\n    };\n\n    // the rotated vector to label\n    var newLabelVector = rotateVector({\n      x: position.x - oldFoot.x,\n      y: position.y - oldFoot.y\n    }, angleDelta);\n\n    // the new relative position\n    dx = newFoot.x + newLabelVector.x - position.x;\n    dy = newFoot.y + newLabelVector.y - position.y;\n\n    return {\n      point: roundPoint(newFoot),\n      delta: roundPoint({\n        x: dx,\n        y: dy\n      })\n    };\n  }\n\n\n  // HELPERS //////////////////////\n\n  function relativePositionMidWaypoint(waypoints, idx) {\n\n    var distanceSegment1 = getDistancePointPoint(waypoints[idx - 1], waypoints[idx]),\n        distanceSegment2 = getDistancePointPoint(waypoints[idx], waypoints[idx + 1]);\n\n    var relativePosition = distanceSegment1 / (distanceSegment1 + distanceSegment2);\n\n    return relativePosition;\n  }\n\n  function getAngleDelta(l1, l2) {\n    var a1 = getAngle(l1),\n        a2 = getAngle(l2);\n    return a2 - a1;\n  }\n\n  function getLine(waypoints, idx) {\n    return [ waypoints[idx], waypoints[idx + 1] ];\n  }\n\n  function getRelativeFootPosition(line, foot) {\n\n    var length = getDistancePointPoint(line[0], line[1]),\n        lengthToFoot = getDistancePointPoint(line[0], foot);\n\n    return length === 0 ? 0 : lengthToFoot / length;\n  }\n\n  /**\n   * Calculate the required adjustment (move delta) for the given label\n   * after the connection waypoints got updated.\n   *\n   * @param {Label} label\n   * @param {Point[]} newWaypoints\n   * @param {Point[]} oldWaypoints\n   * @param {FindNewLineStartIndexHints} hints\n   *\n   * @return {Point}\n   */\n  function getLabelAdjustment(label, newWaypoints, oldWaypoints, hints) {\n    var labelPosition = getMid(label);\n\n    return getAnchorPointAdjustment(labelPosition, newWaypoints, oldWaypoints, hints).delta;\n  }\n\n  /**\n   * @typedef {import('../model/Types').Shape} Shape\n   *\n   * @typedef {import('../util/Types').Point} Point\n   * @typedef {import('../util/Types').Rect} Rect\n   */\n\n  /**\n   * Calculates the absolute point relative to the new element's position.\n   *\n   * @param {Point} point [absolute]\n   * @param {Rect} oldBounds\n   * @param {Rect} newBounds\n   *\n   * @return {Point} point [absolute]\n   */\n  function getNewAttachPoint(point, oldBounds, newBounds) {\n    var oldCenter = center(oldBounds),\n        newCenter = center(newBounds),\n        oldDelta = delta(point, oldCenter);\n\n    var newDelta = {\n      x: oldDelta.x * (newBounds.width / oldBounds.width),\n      y: oldDelta.y * (newBounds.height / oldBounds.height)\n    };\n\n    return roundPoint({\n      x: newCenter.x + newDelta.x,\n      y: newCenter.y + newDelta.y\n    });\n  }\n\n\n  /**\n   * Calculates the shape's delta relative to a new position\n   * of a certain element's bounds.\n   *\n   * @param {Shape} shape\n   * @param {Rect} oldBounds\n   * @param {Rect} newBounds\n   *\n   * @return {Point} delta\n   */\n  function getNewAttachShapeDelta(shape, oldBounds, newBounds) {\n    var shapeCenter = center(shape),\n        oldCenter = center(oldBounds),\n        newCenter = center(newBounds),\n        shapeDelta = delta(shape, shapeCenter),\n        oldCenterDelta = delta(shapeCenter, oldCenter),\n        stickyPositionDelta = getStickyPositionDelta(shapeCenter, oldBounds, newBounds);\n\n    if (stickyPositionDelta) {\n      return stickyPositionDelta;\n    }\n\n    var newCenterDelta = {\n      x: oldCenterDelta.x * (newBounds.width / oldBounds.width),\n      y: oldCenterDelta.y * (newBounds.height / oldBounds.height)\n    };\n\n    var newShapeCenter = {\n      x: newCenter.x + newCenterDelta.x,\n      y: newCenter.y + newCenterDelta.y\n    };\n\n    return roundPoint({\n      x: newShapeCenter.x + shapeDelta.x - shape.x,\n      y: newShapeCenter.y + shapeDelta.y - shape.y\n    });\n  }\n\n  function getStickyPositionDelta(oldShapeCenter, oldBounds, newBounds) {\n    var oldTRBL = asTRBL(oldBounds),\n        newTRBL = asTRBL(newBounds);\n\n    if (isMoved(oldTRBL, newTRBL)) {\n      return null;\n    }\n\n    var oldOrientation = getOrientation(oldBounds, oldShapeCenter),\n        stickyPositionDelta,\n        newShapeCenter,\n        newOrientation;\n\n    if (oldOrientation === 'top') {\n      stickyPositionDelta = {\n        x: 0,\n        y: newTRBL.bottom - oldTRBL.bottom\n      };\n    } else if (oldOrientation === 'bottom') {\n      stickyPositionDelta = {\n        x: 0,\n        y: newTRBL.top - oldTRBL.top\n      };\n    } else if (oldOrientation === 'right') {\n      stickyPositionDelta = {\n        x: newTRBL.left - oldTRBL.left,\n        y: 0\n      };\n    } else if (oldOrientation === 'left') {\n      stickyPositionDelta = {\n        x: newTRBL.right - oldTRBL.right,\n        y: 0\n      };\n    } else {\n\n      // fallback to proportional movement for corner-placed attachments\n      return null;\n    }\n\n    newShapeCenter = {\n      x: oldShapeCenter.x + stickyPositionDelta.x,\n      y: oldShapeCenter.y + stickyPositionDelta.y\n    };\n\n    newOrientation = getOrientation(newBounds, newShapeCenter);\n\n    if (newOrientation !== oldOrientation) {\n\n      // fallback to proportional movement if orientation would otherwise change\n      return null;\n    }\n\n    return stickyPositionDelta;\n  }\n\n  function isMoved(oldTRBL, newTRBL) {\n    return isHorizontallyMoved(oldTRBL, newTRBL) || isVerticallyMoved(oldTRBL, newTRBL);\n  }\n\n  function isHorizontallyMoved(oldTRBL, newTRBL) {\n    return oldTRBL.right !== newTRBL.right && oldTRBL.left !== newTRBL.left;\n  }\n\n  function isVerticallyMoved(oldTRBL, newTRBL) {\n    return oldTRBL.top !== newTRBL.top && oldTRBL.bottom !== newTRBL.bottom;\n  }\n\n  var NAME_PROPERTY = 'name';\n  var TEXT_PROPERTY = 'text';\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../Modeling').default} Modeling\n   * @typedef {import('../BpmnFactory').default} BpmnFactory\n   * @typedef {import('../../../draw/TextRenderer').default} TextRenderer\n   *\n   * @typedef {import('diagram-js/lib/util/Types').Point} Point\n   * @typedef {import('diagram-js/lib/util/Types').Rect} Rect\n   *\n   * @typedef {Point[]} Line\n   */\n\n  /**\n   * A component that makes sure that external labels are added\n   * together with respective elements and properly updated (DI wise)\n   * during move.\n   *\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   * @param {BpmnFactory} bpmnFactory\n   * @param {TextRenderer} textRenderer\n   */\n  function LabelBehavior(\n      eventBus, modeling, bpmnFactory,\n      textRenderer) {\n\n    CommandInterceptor.call(this, eventBus);\n\n    // update label if name property was updated\n    this.postExecute('element.updateProperties', onPropertyUpdate);\n    this.postExecute('element.updateModdleProperties', e => {\n      const elementBo = getBusinessObject(e.context.element);\n\n      if (elementBo === e.context.moddleElement) {\n        onPropertyUpdate(e);\n      }\n    });\n\n    function onPropertyUpdate(e) {\n      var context = e.context,\n          element = context.element,\n          properties = context.properties;\n\n      if (NAME_PROPERTY in properties) {\n        modeling.updateLabel(element, properties[NAME_PROPERTY]);\n      }\n\n      if (TEXT_PROPERTY in properties\n          && is$1(element, 'bpmn:TextAnnotation')) {\n\n        var newBounds = textRenderer.getTextAnnotationBounds(\n          {\n            x: element.x,\n            y: element.y,\n            width: element.width,\n            height: element.height\n          },\n          properties[TEXT_PROPERTY] || ''\n        );\n\n        modeling.updateLabel(element, properties.text, newBounds);\n      }\n    }\n\n    // create label shape after shape/connection was created\n    this.postExecute([ 'shape.create', 'connection.create' ], function(e) {\n      var context = e.context,\n          hints = context.hints || {};\n\n      if (hints.createElementsBehavior === false) {\n        return;\n      }\n\n      var element = context.shape || context.connection;\n\n      if (isLabel(element) || !isLabelExternal(element)) {\n        return;\n      }\n\n      // only create label if attribute available\n      if (!getLabel(element)) {\n        return;\n      }\n\n      modeling.updateLabel(element, getLabel(element));\n    });\n\n    // update label after label shape was deleted\n    this.postExecute('shape.delete', function(event) {\n      var context = event.context,\n          labelTarget = context.labelTarget,\n          hints = context.hints || {};\n\n      // check if label\n      if (labelTarget && hints.unsetLabel !== false) {\n        modeling.updateLabel(labelTarget, null, null, { removeShape: false });\n      }\n    });\n\n    function getVisibleLabelAdjustment(event) {\n\n      var context = event.context,\n          connection = context.connection,\n          label = connection.label,\n          hints = assign$1({}, context.hints),\n          newWaypoints = context.newWaypoints || connection.waypoints,\n          oldWaypoints = context.oldWaypoints;\n\n\n      if (typeof hints.startChanged === 'undefined') {\n        hints.startChanged = !!hints.connectionStart;\n      }\n\n      if (typeof hints.endChanged === 'undefined') {\n        hints.endChanged = !!hints.connectionEnd;\n      }\n\n      return getLabelAdjustment(label, newWaypoints, oldWaypoints, hints);\n    }\n\n    this.postExecute([\n      'connection.layout',\n      'connection.updateWaypoints'\n    ], function(event) {\n      var context = event.context,\n          hints = context.hints || {};\n\n      if (hints.labelBehavior === false) {\n        return;\n      }\n\n      var connection = context.connection,\n          label = connection.label,\n          labelAdjustment;\n\n      // handle missing label as well as the case\n      // that the label parent does not exist (yet),\n      // because it is being pasted / created via multi element create\n      //\n      // Cf. https://github.com/bpmn-io/bpmn-js/pull/1227\n      if (!label || !label.parent) {\n        return;\n      }\n\n      labelAdjustment = getVisibleLabelAdjustment(event);\n\n      modeling.moveShape(label, labelAdjustment);\n    });\n\n\n    // keep label position on shape replace\n    this.postExecute([ 'shape.replace' ], function(event) {\n      var context = event.context,\n          newShape = context.newShape,\n          oldShape = context.oldShape;\n\n      var businessObject = getBusinessObject(newShape);\n\n      if (businessObject\n        && isLabelExternal(businessObject)\n        && oldShape.label\n        && newShape.label) {\n        newShape.label.x = oldShape.label.x;\n        newShape.label.y = oldShape.label.y;\n      }\n    });\n\n\n    // move external label after resizing\n    this.postExecute('shape.resize', function(event) {\n\n      var context = event.context,\n          shape = context.shape,\n          newBounds = context.newBounds,\n          oldBounds = context.oldBounds;\n\n      if (hasExternalLabel(shape)) {\n\n        var label = shape.label,\n            labelMid = getMid(label),\n            edges = asEdges(oldBounds);\n\n        // get nearest border point to label as reference point\n        var referencePoint = getReferencePoint(labelMid, edges);\n\n        var delta = getReferencePointDelta(referencePoint, oldBounds, newBounds);\n\n        modeling.moveShape(label, delta);\n\n      }\n\n    });\n\n  }\n\n  e$3(LabelBehavior, CommandInterceptor);\n\n  LabelBehavior.$inject = [\n    'eventBus',\n    'modeling',\n    'bpmnFactory',\n    'textRenderer'\n  ];\n\n  // helpers //////////////////////\n\n  /**\n   * Calculates a reference point delta relative to a new position\n   * of a certain element's bounds\n   *\n   * @param {Point} referencePoint\n   * @param {Rect} oldBounds\n   * @param {Rect} newBounds\n   *\n   * @return {Point}\n   */\n  function getReferencePointDelta(referencePoint, oldBounds, newBounds) {\n\n    var newReferencePoint = getNewAttachPoint(referencePoint, oldBounds, newBounds);\n\n    return roundPoint(delta(newReferencePoint, referencePoint));\n  }\n\n  /**\n   * Generates the nearest point (reference point) for a given point\n   * onto given set of lines\n   *\n   * @param {Point} point\n   * @param {Line[]} lines\n   *\n   * @return {Point}\n   */\n  function getReferencePoint(point, lines) {\n\n    if (!lines.length) {\n      return;\n    }\n\n    var nearestLine = getNearestLine(point, lines);\n\n    return perpendicularFoot(point, nearestLine);\n  }\n\n  /**\n   * Convert the given bounds to a lines array containing all edges\n   *\n   * @param {Rect|Point} bounds\n   *\n   * @return {Line[]}\n   */\n  function asEdges(bounds) {\n    return [\n      [ // top\n        {\n          x: bounds.x,\n          y: bounds.y\n        },\n        {\n          x: bounds.x + (bounds.width || 0),\n          y: bounds.y\n        }\n      ],\n      [ // right\n        {\n          x: bounds.x + (bounds.width || 0),\n          y: bounds.y\n        },\n        {\n          x: bounds.x + (bounds.width || 0),\n          y: bounds.y + (bounds.height || 0)\n        }\n      ],\n      [ // bottom\n        {\n          x: bounds.x,\n          y: bounds.y + (bounds.height || 0)\n        },\n        {\n          x: bounds.x + (bounds.width || 0),\n          y: bounds.y + (bounds.height || 0)\n        }\n      ],\n      [ // left\n        {\n          x: bounds.x,\n          y: bounds.y\n        },\n        {\n          x: bounds.x,\n          y: bounds.y + (bounds.height || 0)\n        }\n      ]\n    ];\n  }\n\n  /**\n   * Returns the nearest line for a given point by distance\n   * @param {Point} point\n   * @param {Line[]} lines\n   *\n   * @return {Line}\n   */\n  function getNearestLine(point, lines) {\n\n    var distances = lines.map(function(l) {\n      return {\n        line: l,\n        distance: getDistancePointLine(point, l)\n      };\n    });\n\n    var sorted = sortBy(distances, 'distance');\n\n    return sorted[0].line;\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/util/Types').Point} Point\n   *\n   * @typedef {import('./LayoutUtil').FindNewLineStartIndexHints} FindNewLineStartIndexHints\n   */\n\n  /**\n   * Calculate the new point after the connection waypoints got updated.\n   *\n   * @param {Point} position\n   * @param {Point[]} newWaypoints\n   * @param {Point[]} oldWaypoints\n   * @param {FindNewLineStartIndexHints} hints\n   *\n   * @return {Point}\n   */\n  function getConnectionAdjustment(position, newWaypoints, oldWaypoints, hints) {\n    return getAnchorPointAdjustment(position, newWaypoints, oldWaypoints, hints).point;\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * A component that makes sure that Associations connected to Connections\n   * are updated together with the Connection.\n   *\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   */\n  function LayoutConnectionBehavior(eventBus, modeling) {\n\n    CommandInterceptor.call(this, eventBus);\n\n    function getnewAnchorPoint(event, point) {\n\n      var context = event.context,\n          connection = context.connection,\n          hints = assign$1({}, context.hints),\n          newWaypoints = context.newWaypoints || connection.waypoints,\n          oldWaypoints = context.oldWaypoints;\n\n\n      if (typeof hints.startChanged === 'undefined') {\n        hints.startChanged = !!hints.connectionStart;\n      }\n\n      if (typeof hints.endChanged === 'undefined') {\n        hints.endChanged = !!hints.connectionEnd;\n      }\n\n      return getConnectionAdjustment(point, newWaypoints, oldWaypoints, hints);\n    }\n\n    this.postExecute([\n      'connection.layout',\n      'connection.updateWaypoints'\n    ], function(event) {\n      var context = event.context;\n\n      var connection = context.connection,\n          outgoing = connection.outgoing,\n          incoming = connection.incoming;\n\n      incoming.forEach(function(connection) {\n        var endPoint = connection.waypoints[connection.waypoints.length - 1];\n        var newEndpoint = getnewAnchorPoint(event, endPoint);\n\n        var newWaypoints = [].concat(connection.waypoints.slice(0, -1), [ newEndpoint ]);\n\n        modeling.updateWaypoints(connection, newWaypoints);\n      });\n\n      outgoing.forEach(function(connection) {\n        var startpoint = connection.waypoints[0];\n        var newStartpoint = getnewAnchorPoint(event, startpoint);\n\n        var newWaypoints = [].concat([ newStartpoint ], connection.waypoints.slice(1));\n\n        modeling.updateWaypoints(connection, newWaypoints);\n      });\n\n    });\n\n\n    this.postExecute([\n      'connection.move'\n    ], function(event) {\n      var context = event.context;\n\n      var connection = context.connection,\n          outgoing = connection.outgoing,\n          incoming = connection.incoming,\n          delta = context.delta;\n\n      incoming.forEach(function(connection) {\n        var endPoint = connection.waypoints[connection.waypoints.length - 1];\n        var newEndpoint = {\n          x: endPoint.x + delta.x,\n          y: endPoint.y + delta.y\n        };\n\n        var newWaypoints = [].concat(connection.waypoints.slice(0, -1), [ newEndpoint ]);\n\n        modeling.updateWaypoints(connection, newWaypoints);\n      });\n\n      outgoing.forEach(function(connection) {\n        var startpoint = connection.waypoints[0];\n        var newStartpoint = {\n          x: startpoint.x + delta.x,\n          y: startpoint.y + delta.y\n        };\n\n        var newWaypoints = [].concat([ newStartpoint ], connection.waypoints.slice(1));\n\n        modeling.updateWaypoints(connection, newWaypoints);\n      });\n\n    });\n\n  }\n\n  e$3(LayoutConnectionBehavior, CommandInterceptor);\n\n  LayoutConnectionBehavior.$inject = [\n    'eventBus',\n    'modeling'\n  ];\n\n  /**\n   * @typedef {import('../../../../core/Types').ConnectionLike} Connection\n   * @typedef {import('../../../../core/Types').ShapeLike} Shape\n   *\n   * @typedef {import('../../../../util/Types').Point} Point\n   * @typedef {import('../../../../util/Types').Rect} Rect\n   */\n\n  /**\n   * @param {Connection} connection\n   * @param {Shape} shape\n   * @param {Rect} oldBounds\n   * @return {Point}\n   */\n  function getResizedSourceAnchor(connection, shape, oldBounds) {\n\n    var waypoints = safeGetWaypoints(connection),\n        waypointsInsideNewBounds = getWaypointsInsideBounds(waypoints, shape),\n        oldAnchor = waypoints[0];\n\n    // new anchor is the last waypoint enclosed be resized source\n    if (waypointsInsideNewBounds.length) {\n      return waypointsInsideNewBounds[ waypointsInsideNewBounds.length - 1 ];\n    }\n\n    return getNewAttachPoint(oldAnchor.original || oldAnchor, oldBounds, shape);\n  }\n\n\n  function getResizedTargetAnchor(connection, shape, oldBounds) {\n\n    var waypoints = safeGetWaypoints(connection),\n        waypointsInsideNewBounds = getWaypointsInsideBounds(waypoints, shape),\n        oldAnchor = waypoints[waypoints.length - 1];\n\n    // new anchor is the first waypoint enclosed be resized target\n    if (waypointsInsideNewBounds.length) {\n      return waypointsInsideNewBounds[ 0 ];\n    }\n\n    return getNewAttachPoint(oldAnchor.original || oldAnchor, oldBounds, shape);\n  }\n\n\n  function getMovedSourceAnchor(connection, source, moveDelta) {\n\n    var waypoints = safeGetWaypoints(connection),\n        oldBounds = subtract(source, moveDelta),\n        oldAnchor = waypoints[ 0 ];\n\n    return getNewAttachPoint(oldAnchor.original || oldAnchor, oldBounds, source);\n  }\n\n\n  function getMovedTargetAnchor(connection, target, moveDelta) {\n\n    var waypoints = safeGetWaypoints(connection),\n        oldBounds = subtract(target, moveDelta),\n        oldAnchor = waypoints[ waypoints.length - 1 ];\n\n    return getNewAttachPoint(oldAnchor.original || oldAnchor, oldBounds, target);\n  }\n\n\n  // helpers //////////////////////\n\n  function subtract(bounds, delta) {\n    return {\n      x: bounds.x - delta.x,\n      y: bounds.y - delta.y,\n      width: bounds.width,\n      height: bounds.height\n    };\n  }\n\n\n  /**\n   * Return waypoints of given connection; throw if non exists (should not happen!!).\n   *\n   * @param {Connection} connection\n   *\n   * @return {Point[]}\n   */\n  function safeGetWaypoints(connection) {\n\n    var waypoints = connection.waypoints;\n\n    if (!waypoints.length) {\n      throw new Error('connection#' + connection.id + ': no waypoints');\n    }\n\n    return waypoints;\n  }\n\n  function getWaypointsInsideBounds(waypoints, bounds) {\n    var originalWaypoints = map$1(waypoints, getOriginal);\n\n    return filter(originalWaypoints, function(waypoint) {\n      return isInsideBounds(waypoint, bounds);\n    });\n  }\n\n  /**\n   * Checks if point is inside bounds, incl. edges.\n   *\n   * @param {Point} point\n   * @param {Rect} bounds\n   */\n  function isInsideBounds(point, bounds) {\n    return getOrientation(bounds, point, 1) === 'intersect';\n  }\n\n  function getOriginal(point) {\n    return point.original || point;\n  }\n\n  /**\r\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\r\n   * @typedef {import('../Modeling').default} Modeling\r\n   */\r\n\r\n  /**\r\n   * BPMN-specific message flow behavior.\r\n   *\r\n   * @param {EventBus} eventBus\r\n   * @param {Modeling} modeling\r\n   */\r\n  function MessageFlowBehavior(eventBus, modeling) {\r\n\r\n    CommandInterceptor.call(this, eventBus);\r\n\r\n    this.postExecute('shape.replace', function(context) {\r\n      var oldShape = context.oldShape,\r\n          newShape = context.newShape;\r\n\r\n      if (!isParticipantCollapse(oldShape, newShape)) {\r\n        return;\r\n      }\r\n\r\n      var messageFlows = getMessageFlows(oldShape);\r\n\r\n      messageFlows.incoming.forEach(function(incoming) {\r\n        var anchor = getResizedTargetAnchor(incoming, newShape, oldShape);\r\n\r\n        modeling.reconnectEnd(incoming, newShape, anchor);\r\n      });\r\n\r\n      messageFlows.outgoing.forEach(function(outgoing) {\r\n        var anchor = getResizedSourceAnchor(outgoing, newShape, oldShape);\r\n\r\n        modeling.reconnectStart(outgoing, newShape, anchor);\r\n      });\r\n    }, true);\r\n\r\n  }\r\n\r\n  MessageFlowBehavior.$inject = [ 'eventBus', 'modeling' ];\r\n\r\n  e$3(MessageFlowBehavior, CommandInterceptor);\r\n\r\n  // helpers //////////\r\n\r\n  function isParticipantCollapse(oldShape, newShape) {\r\n    return is$1(oldShape, 'bpmn:Participant')\r\n      && isExpanded(oldShape)\r\n      && is$1(newShape, 'bpmn:Participant')\r\n      && !isExpanded(newShape);\r\n  }\r\n\r\n  function getMessageFlows(parent) {\r\n    var elements = selfAndAllChildren([ parent ], false);\r\n\r\n    var incoming = [],\r\n        outgoing = [];\r\n\r\n    elements.forEach(function(element) {\r\n      if (element === parent) {\r\n        return;\r\n      }\r\n\r\n      element.incoming.forEach(function(connection) {\r\n        if (is$1(connection, 'bpmn:MessageFlow')) {\r\n          incoming.push(connection);\r\n        }\r\n      });\r\n\r\n      element.outgoing.forEach(function(connection) {\r\n        if (is$1(connection, 'bpmn:MessageFlow')) {\r\n          outgoing.push(connection);\r\n        }\r\n      });\r\n    }, []);\r\n\r\n    return {\r\n      incoming: incoming,\r\n      outgoing: outgoing\r\n    };\r\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('diagram-js/lib/features/tooltips/Tooltips').default} Tooltips\n   * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n   */\n\n  var COLLAB_ERR_MSG = 'flow elements must be children of pools/participants';\n\n  /**\n   * @param {EventBus} eventBus\n   * @param {Tooltips} tooltips\n   * @param {Translate} translate\n   */\n  function ModelingFeedback(eventBus, tooltips, translate) {\n\n    function showError(position, message, timeout) {\n      tooltips.add({\n        position: {\n          x: position.x + 5,\n          y: position.y + 5\n        },\n        type: 'error',\n        timeout: timeout || 2000,\n        html: '<div>' + message + '</div>'\n      });\n    }\n\n    eventBus.on([ 'shape.move.rejected', 'create.rejected' ], function(event) {\n      var context = event.context,\n          shape = context.shape,\n          target = context.target;\n\n      if (is$1(target, 'bpmn:Collaboration') && is$1(shape, 'bpmn:FlowNode')) {\n        showError(event, translate(COLLAB_ERR_MSG));\n      }\n    });\n\n  }\n\n  ModelingFeedback.$inject = [\n    'eventBus',\n    'tooltips',\n    'translate'\n  ];\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * BPMN specific behavior ensuring that bpmndi:Label's dc:Bounds are removed\n   * when shape is resized.\n   *\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   */\n  function RemoveEmbeddedLabelBoundsBehavior(eventBus, modeling) {\n    CommandInterceptor.call(this, eventBus);\n\n    this.preExecute('shape.resize', function(context) {\n      var shape = context.shape;\n\n      var di = getDi(shape),\n          label = di && di.get('label'),\n          bounds = label && label.get('bounds');\n\n      if (bounds) {\n        modeling.updateModdleProperties(shape, label, {\n          bounds: undefined\n        });\n      }\n    }, true);\n  }\n\n  e$3(RemoveEmbeddedLabelBoundsBehavior, CommandInterceptor);\n\n  RemoveEmbeddedLabelBoundsBehavior.$inject = [\n    'eventBus',\n    'modeling'\n  ];\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../../rules/BpmnRules').default} BpmnRules\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * @param {EventBus} eventBus\n   * @param {BpmnRules} bpmnRules\n   * @param {Modeling} modeling\n   */\n  function RemoveElementBehavior(eventBus, bpmnRules, modeling) {\n\n    CommandInterceptor.call(this, eventBus);\n\n    /**\n     * Combine sequence flows when deleting an element\n     * if there is one incoming and one outgoing\n     * sequence flow\n     */\n    this.preExecute('shape.delete', function(e) {\n\n      var shape = e.context.shape;\n\n      // only handle [a] -> [shape] -> [b] patterns\n      if (shape.incoming.length !== 1 || shape.outgoing.length !== 1) {\n        return;\n      }\n\n      var inConnection = shape.incoming[0],\n          outConnection = shape.outgoing[0];\n\n      // only handle sequence flows\n      if (!is$1(inConnection, 'bpmn:SequenceFlow') || !is$1(outConnection, 'bpmn:SequenceFlow')) {\n        return;\n      }\n\n      if (bpmnRules.canConnect(inConnection.source, outConnection.target, inConnection)) {\n\n        // compute new, combined waypoints\n        var newWaypoints = getNewWaypoints(inConnection.waypoints, outConnection.waypoints);\n\n        modeling.reconnectEnd(inConnection, outConnection.target, newWaypoints);\n      }\n    });\n\n  }\n\n  e$3(RemoveElementBehavior, CommandInterceptor);\n\n  RemoveElementBehavior.$inject = [\n    'eventBus',\n    'bpmnRules',\n    'modeling'\n  ];\n\n\n  // helpers //////////////////////\n\n  function getDocking$1(point) {\n    return point.original || point;\n  }\n\n\n  function getNewWaypoints(inWaypoints, outWaypoints) {\n\n    var intersection = lineIntersect(\n      getDocking$1(inWaypoints[inWaypoints.length - 2]),\n      getDocking$1(inWaypoints[inWaypoints.length - 1]),\n      getDocking$1(outWaypoints[1]),\n      getDocking$1(outWaypoints[0]));\n\n    if (intersection) {\n      return [].concat(\n        inWaypoints.slice(0, inWaypoints.length - 1),\n        [ intersection ],\n        outWaypoints.slice(1));\n    } else {\n      return [\n        getDocking$1(inWaypoints[0]),\n        getDocking$1(outWaypoints[outWaypoints.length - 1])\n      ];\n    }\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * BPMN specific remove behavior.\n   *\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   */\n  function RemoveParticipantBehavior(eventBus, modeling) {\n\n    CommandInterceptor.call(this, eventBus);\n\n\n    /**\n     * morph collaboration diagram into process diagram\n     * after the last participant has been removed\n     */\n\n    this.preExecute('shape.delete', function(context) {\n\n      var shape = context.shape,\n          parent = shape.parent;\n\n      // activate the behavior if the shape to be removed\n      // is a participant\n      if (is$1(shape, 'bpmn:Participant')) {\n        context.collaborationRoot = parent;\n      }\n    }, true);\n\n    this.postExecute('shape.delete', function(context) {\n\n      var collaborationRoot = context.collaborationRoot;\n\n      if (collaborationRoot && !collaborationRoot.businessObject.participants.length) {\n\n        // replace empty collaboration with process diagram\n        modeling.makeProcess();\n      }\n    }, true);\n\n  }\n\n  RemoveParticipantBehavior.$inject = [ 'eventBus', 'modeling' ];\n\n  e$3(RemoveParticipantBehavior, CommandInterceptor);\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../Modeling').default} Modeling\n   * @typedef {import('../../rules/BpmnRules').default} BpmnRules\n   * @typedef {import('didi').Injector} Injector\n   */\n\n  /**\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   * @param {BpmnRules} bpmnRules\n   * @param {Injector} injector\n   */\n  function ReplaceConnectionBehavior(eventBus, modeling, bpmnRules, injector) {\n\n    CommandInterceptor.call(this, eventBus);\n\n    var dragging = injector.get('dragging', false);\n\n    function fixConnection(connection) {\n\n      var source = connection.source,\n          target = connection.target,\n          parent = connection.parent;\n\n      // do not do anything if connection\n      // is already deleted (may happen due to other\n      // behaviors plugged-in before)\n      if (!parent) {\n        return;\n      }\n\n      var replacementType,\n          remove;\n\n      /**\n       * Check if incoming or outgoing connections\n       * can stay or could be substituted with an\n       * appropriate replacement.\n       *\n       * This holds true for SequenceFlow <> MessageFlow.\n       */\n\n      if (is$1(connection, 'bpmn:SequenceFlow')) {\n        if (!bpmnRules.canConnectSequenceFlow(source, target)) {\n          remove = true;\n        }\n\n        if (bpmnRules.canConnectMessageFlow(source, target)) {\n          replacementType = 'bpmn:MessageFlow';\n        }\n      }\n\n      // transform message flows into sequence flows, if possible\n\n      if (is$1(connection, 'bpmn:MessageFlow')) {\n\n        if (!bpmnRules.canConnectMessageFlow(source, target)) {\n          remove = true;\n        }\n\n        if (bpmnRules.canConnectSequenceFlow(source, target)) {\n          replacementType = 'bpmn:SequenceFlow';\n        }\n      }\n\n      if (is$1(connection, 'bpmn:Association') && !bpmnRules.canConnectAssociation(source, target)) {\n        remove = true;\n      }\n\n\n      // remove invalid connection,\n      // unless it has been removed already\n      if (remove) {\n        modeling.removeConnection(connection);\n      }\n\n      // replace SequenceFlow <> MessageFlow\n\n      if (replacementType) {\n        modeling.connect(source, target, {\n          type: replacementType,\n          waypoints: connection.waypoints.slice()\n        });\n      }\n    }\n\n    function replaceReconnectedConnection(event) {\n\n      var context = event.context,\n          connection = context.connection,\n          source = context.newSource || connection.source,\n          target = context.newTarget || connection.target,\n          allowed,\n          replacement;\n\n      allowed = bpmnRules.canConnect(source, target);\n\n      if (!allowed || allowed.type === connection.type) {\n        return;\n      }\n\n      replacement = modeling.connect(source, target, {\n        type: allowed.type,\n        waypoints: connection.waypoints.slice()\n      });\n\n      // remove old connection\n      modeling.removeConnection(connection);\n\n      // replace connection in context to reconnect end/start\n      context.connection = replacement;\n\n      if (dragging) {\n        cleanDraggingSelection(connection, replacement);\n      }\n    }\n\n    // monkey-patch selection saved in dragging in order to re-select it when operation is finished\n    function cleanDraggingSelection(oldConnection, newConnection) {\n      var context = dragging.context(),\n          previousSelection = context && context.payload.previousSelection,\n          index;\n\n      // do nothing if not dragging or no selection was present\n      if (!previousSelection || !previousSelection.length) {\n        return;\n      }\n\n      index = previousSelection.indexOf(oldConnection);\n\n      if (index === -1) {\n        return;\n      }\n\n      previousSelection.splice(index, 1, newConnection);\n    }\n\n    // lifecycle hooks\n\n    this.postExecuted('elements.move', function(context) {\n\n      var closure = context.closure,\n          allConnections = closure.allConnections;\n\n      forEach$1(allConnections, fixConnection);\n    }, true);\n\n    this.preExecute('connection.reconnect', replaceReconnectedConnection);\n\n    this.postExecuted('element.updateProperties', function(event) {\n      var context = event.context,\n          properties = context.properties,\n          element = context.element,\n          businessObject = element.businessObject,\n          connection;\n\n      // remove condition on change to default\n      if (properties.default) {\n        connection = find(\n          element.outgoing,\n          matchPattern({ id: element.businessObject.default.id })\n        );\n\n        if (connection) {\n          modeling.updateProperties(connection, { conditionExpression: undefined });\n        }\n      }\n\n      // remove default from source on change to conditional\n      if (properties.conditionExpression && businessObject.sourceRef.default === businessObject) {\n        modeling.updateProperties(element.source, { default: undefined });\n      }\n    });\n  }\n\n  e$3(ReplaceConnectionBehavior, CommandInterceptor);\n\n  ReplaceConnectionBehavior.$inject = [\n    'eventBus',\n    'modeling',\n    'bpmnRules',\n    'injector'\n  ];\n\n  /**\n   * @typedef {import('../../replace/BpmnReplace').default} BpmnReplace\n   * @typedef {import('../../rules/BpmnRules').default} BpmnRules\n   * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('didi').Injector} Injector\n   * @typedef {import('../Modeling').default} Modeling\n   * @typedef {import('diagram-js/lib/features/selection/Selection').default} Selection\n   */\n\n  /**\n   * BPMN-specific replace behavior.\n   *\n   * @param {BpmnReplace} bpmnReplace\n   * @param {BpmnRules} bpmnRules\n   * @param {ElementRegistry} elementRegistry\n   * @param {Injector} injector\n   * @param {Modeling} modeling\n   * @param {Selection} selection\n   */\n  function ReplaceElementBehaviour(\n      bpmnReplace,\n      bpmnRules,\n      elementRegistry,\n      injector,\n      modeling,\n      selection\n  ) {\n    injector.invoke(CommandInterceptor, this);\n\n    this._bpmnReplace = bpmnReplace;\n    this._elementRegistry = elementRegistry;\n    this._selection = selection;\n\n    // replace elements on create, e.g. during copy-paste\n    this.postExecuted([ 'elements.create' ], 500, function(event) {\n      var context = event.context,\n          target = context.parent,\n          elements = context.elements;\n\n      var elementReplacements = reduce(elements, function(replacements, element) {\n        var canReplace = bpmnRules.canReplace([ element ], element.host || element.parent || target);\n\n        return canReplace ? replacements.concat(canReplace.replacements) : replacements;\n      }, []);\n\n      if (elementReplacements.length) {\n        this._replaceElements(elements, elementReplacements);\n      }\n    }, this);\n\n    // replace elements on move\n    this.postExecuted([ 'elements.move' ], 500, function(event) {\n      var context = event.context,\n          target = context.newParent,\n          newHost = context.newHost,\n          elements = [];\n\n      forEach$1(context.closure.topLevel, function(topLevelElements) {\n        if (isEventSubProcess(topLevelElements)) {\n          elements = elements.concat(topLevelElements.children);\n        } else {\n          elements = elements.concat(topLevelElements);\n        }\n      });\n\n      // set target to host if attaching\n      if (elements.length === 1 && newHost) {\n        target = newHost;\n      }\n\n      var canReplace = bpmnRules.canReplace(elements, target);\n\n      if (canReplace) {\n        this._replaceElements(elements, canReplace.replacements, newHost);\n      }\n    }, this);\n\n    // update attachments on host replace\n    this.postExecute([ 'shape.replace' ], 1500, function(e) {\n      var context = e.context,\n          oldShape = context.oldShape,\n          newShape = context.newShape,\n          attachers = oldShape.attachers,\n          canReplace;\n\n      if (attachers && attachers.length) {\n        canReplace = bpmnRules.canReplace(attachers, newShape);\n\n        this._replaceElements(attachers, canReplace.replacements);\n      }\n\n    }, this);\n\n    // keep ID on shape replace\n    this.postExecuted([ 'shape.replace' ], 1500, function(e) {\n      var context = e.context,\n          oldShape = context.oldShape,\n          newShape = context.newShape;\n\n      modeling.unclaimId(oldShape.businessObject.id, oldShape.businessObject);\n      modeling.updateProperties(newShape, { id: oldShape.id });\n    });\n  }\n\n  e$3(ReplaceElementBehaviour, CommandInterceptor);\n\n  ReplaceElementBehaviour.prototype._replaceElements = function(elements, newElements) {\n    var elementRegistry = this._elementRegistry,\n        bpmnReplace = this._bpmnReplace,\n        selection = this._selection;\n\n    forEach$1(newElements, function(replacement) {\n      var newElement = {\n        type: replacement.newElementType\n      };\n\n      var oldElement = elementRegistry.get(replacement.oldElementId);\n\n      var idx = elements.indexOf(oldElement);\n\n      elements[idx] = bpmnReplace.replaceElement(oldElement, newElement, { select: false });\n    });\n\n    if (newElements) {\n      selection.select(elements);\n    }\n  };\n\n  ReplaceElementBehaviour.$inject = [\n    'bpmnReplace',\n    'bpmnRules',\n    'elementRegistry',\n    'injector',\n    'modeling',\n    'selection'\n  ];\n\n  var HIGH_PRIORITY$9 = 1500;\r\n\r\n  /**\r\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\r\n   *\r\n   * @typedef {import('../../../model/Types').Shape} Shape\r\n   *\r\n   * @typedef {import('diagram-js/lib/util/Types').Dimensions} Dimensions\r\n   * @typedef {import('diagram-js/lib/util/Types').Direction} Direction\r\n   * @typedef {import('diagram-js/lib/util/Types').RectTRBL} RectTRBL\r\n   */\r\n\r\n  /**\r\n   * @type {Dimensions}\r\n   */\r\n  var GROUP_MIN_DIMENSIONS = { width: 140, height: 120 };\r\n\r\n  /**\r\n   * @type {Dimensions}\r\n   */\r\n  var LANE_MIN_DIMENSIONS = { width: 300, height: 60 };\r\n\r\n  /**\r\n   * @type {Dimensions}\r\n   */\r\n  var PARTICIPANT_MIN_DIMENSIONS = { width: 300, height: 150 };\r\n\r\n  /**\r\n   * @type {Dimensions}\r\n   */\r\n  var SUB_PROCESS_MIN_DIMENSIONS = { width: 140, height: 120 };\r\n\r\n  /**\r\n   * @type {Dimensions}\r\n   */\r\n  var TEXT_ANNOTATION_MIN_DIMENSIONS = { width: 50, height: 30 };\r\n\r\n  /**\r\n   * Set minimum bounds/resize constraints on resize.\r\n   *\r\n   * @param {EventBus} eventBus\r\n   */\r\n  function ResizeBehavior(eventBus) {\r\n    eventBus.on('resize.start', HIGH_PRIORITY$9, function(event) {\r\n      var context = event.context,\r\n          shape = context.shape,\r\n          direction = context.direction,\r\n          balanced = context.balanced;\r\n\r\n      if (is$1(shape, 'bpmn:Lane') || is$1(shape, 'bpmn:Participant')) {\r\n        context.resizeConstraints = getParticipantResizeConstraints(shape, direction, balanced);\r\n      }\r\n\r\n      if (is$1(shape, 'bpmn:Participant')) {\r\n        context.minDimensions = PARTICIPANT_MIN_DIMENSIONS;\r\n      }\r\n\r\n      if (is$1(shape, 'bpmn:SubProcess') && isExpanded(shape)) {\r\n        context.minDimensions = SUB_PROCESS_MIN_DIMENSIONS;\r\n      }\r\n\r\n      if (is$1(shape, 'bpmn:TextAnnotation')) {\r\n        context.minDimensions = TEXT_ANNOTATION_MIN_DIMENSIONS;\r\n      }\r\n    });\r\n  }\r\n\r\n  ResizeBehavior.$inject = [ 'eventBus' ];\r\n\r\n\r\n  var abs$2 = Math.abs,\r\n      min = Math.min,\r\n      max$2 = Math.max;\r\n\r\n\r\n  function addToTrbl(trbl, attr, value, choice) {\r\n    var current = trbl[attr];\r\n\r\n    // make sure to set the value if it does not exist\r\n    // or apply the correct value by comparing against\r\n    // choice(value, currentValue)\r\n    trbl[attr] = current === undefined ? value : choice(value, current);\r\n  }\r\n\r\n  function addMin(trbl, attr, value) {\r\n    return addToTrbl(trbl, attr, value, min);\r\n  }\r\n\r\n  function addMax(trbl, attr, value) {\r\n    return addToTrbl(trbl, attr, value, max$2);\r\n  }\r\n\r\n  var LANE_RIGHT_PADDING = 20,\r\n      LANE_LEFT_PADDING = 50,\r\n      LANE_TOP_PADDING = 20,\r\n      LANE_BOTTOM_PADDING = 20;\r\n\r\n  /**\r\n   * @param {Shape} laneShape\r\n   * @param {Direction} resizeDirection\r\n   * @param {boolean} [balanced=false]\r\n   *\r\n   * @return { {\r\n   *   min: RectTRBL;\r\n   *   max: RectTRBL;\r\n   * } }\r\n   */\r\n  function getParticipantResizeConstraints(laneShape, resizeDirection, balanced) {\r\n    var lanesRoot = getLanesRoot(laneShape);\r\n\r\n    var isFirst = true,\r\n        isLast = true;\r\n\r\n    // max top/bottom size for lanes\r\n    var allLanes = collectLanes(lanesRoot, [ lanesRoot ]);\r\n\r\n    var laneTrbl = asTRBL(laneShape);\r\n\r\n    var maxTrbl = {},\r\n        minTrbl = {};\r\n\r\n    if (/e/.test(resizeDirection)) {\r\n      minTrbl.right = laneTrbl.left + LANE_MIN_DIMENSIONS.width;\r\n    } else\r\n    if (/w/.test(resizeDirection)) {\r\n      minTrbl.left = laneTrbl.right - LANE_MIN_DIMENSIONS.width;\r\n    }\r\n\r\n    allLanes.forEach(function(other) {\r\n\r\n      var otherTrbl = asTRBL(other);\r\n\r\n      if (/n/.test(resizeDirection)) {\r\n\r\n        if (otherTrbl.top < (laneTrbl.top - 10)) {\r\n          isFirst = false;\r\n        }\r\n\r\n        // max top size (based on next element)\r\n        if (balanced && abs$2(laneTrbl.top - otherTrbl.bottom) < 10) {\r\n          addMax(maxTrbl, 'top', otherTrbl.top + LANE_MIN_DIMENSIONS.height);\r\n        }\r\n\r\n        // min top size (based on self or nested element)\r\n        if (abs$2(laneTrbl.top - otherTrbl.top) < 5) {\r\n          addMin(minTrbl, 'top', otherTrbl.bottom - LANE_MIN_DIMENSIONS.height);\r\n        }\r\n      }\r\n\r\n      if (/s/.test(resizeDirection)) {\r\n\r\n        if (otherTrbl.bottom > (laneTrbl.bottom + 10)) {\r\n          isLast = false;\r\n        }\r\n\r\n        // max bottom size (based on previous element)\r\n        if (balanced && abs$2(laneTrbl.bottom - otherTrbl.top) < 10) {\r\n          addMin(maxTrbl, 'bottom', otherTrbl.bottom - LANE_MIN_DIMENSIONS.height);\r\n        }\r\n\r\n        // min bottom size (based on self or nested element)\r\n        if (abs$2(laneTrbl.bottom - otherTrbl.bottom) < 5) {\r\n          addMax(minTrbl, 'bottom', otherTrbl.top + LANE_MIN_DIMENSIONS.height);\r\n        }\r\n      }\r\n    });\r\n\r\n    // max top/bottom/left/right size based on flow nodes\r\n    var flowElements = lanesRoot.children.filter(function(s) {\r\n      return !s.hidden && !s.waypoints && (is$1(s, 'bpmn:FlowElement') || is$1(s, 'bpmn:Artifact'));\r\n    });\r\n\r\n    flowElements.forEach(function(flowElement) {\r\n\r\n      var flowElementTrbl = asTRBL(flowElement);\r\n\r\n      if (isFirst && /n/.test(resizeDirection)) {\r\n        addMin(minTrbl, 'top', flowElementTrbl.top - LANE_TOP_PADDING);\r\n      }\r\n\r\n      if (/e/.test(resizeDirection)) {\r\n        addMax(minTrbl, 'right', flowElementTrbl.right + LANE_RIGHT_PADDING);\r\n      }\r\n\r\n      if (isLast && /s/.test(resizeDirection)) {\r\n        addMax(minTrbl, 'bottom', flowElementTrbl.bottom + LANE_BOTTOM_PADDING);\r\n      }\r\n\r\n      if (/w/.test(resizeDirection)) {\r\n        addMin(minTrbl, 'left', flowElementTrbl.left - LANE_LEFT_PADDING);\r\n      }\r\n    });\r\n\r\n    return {\r\n      min: minTrbl,\r\n      max: maxTrbl\r\n    };\r\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  var SLIGHTLY_HIGHER_PRIORITY = 1001;\n\n\n  /**\n   * Invoke {@link Modeling#resizeLane} instead of {@link Modeling#resizeShape}\n   * when resizing a lane or participant shape.\n   *\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   */\n  function ResizeLaneBehavior(eventBus, modeling) {\n\n    eventBus.on('resize.start', SLIGHTLY_HIGHER_PRIORITY + 500, function(event) {\n      var context = event.context,\n          shape = context.shape;\n\n      if (is$1(shape, 'bpmn:Lane') || is$1(shape, 'bpmn:Participant')) {\n\n        // should we resize the opposite lane(s) in\n        // order to compensate for the resize operation?\n        context.balanced = !hasPrimaryModifier(event);\n      }\n    });\n\n    /**\n     * Intercept resize end and call resize lane function instead.\n     */\n    eventBus.on('resize.end', SLIGHTLY_HIGHER_PRIORITY, function(event) {\n      var context = event.context,\n          shape = context.shape,\n          canExecute = context.canExecute,\n          newBounds = context.newBounds;\n\n      if (is$1(shape, 'bpmn:Lane') || is$1(shape, 'bpmn:Participant')) {\n\n        if (canExecute) {\n\n          // ensure we have actual pixel values for new bounds\n          // (important when zoom level was > 1 during move)\n          newBounds = roundBounds(newBounds);\n\n          // perform the actual resize\n          modeling.resizeLane(shape, newBounds, context.balanced);\n        }\n\n        // stop propagation\n        return false;\n      }\n    });\n  }\n\n  ResizeLaneBehavior.$inject = [\n    'eventBus',\n    'modeling'\n  ];\n\n  /**\r\n   * @typedef {import('../../../Modeler').default} Modeler\r\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\r\n   * @typedef {import('didi').Injector} Injector\r\n   * @typedef {import('../../copy-paste/ModdleCopy').default} ModdleCopy\r\n   * @typedef {import('../BpmnFactory').default} BpmnFactory\r\n   *\r\n   * @typedef {import('../../../model/Types').Element} Element\r\n   * @typedef {import('../../../model/Types').Shape} Shape\r\n   *\r\n   * @typedef {import('diagram-js/lib/util/Types').DirectionTRBL} DirectionTRBL\r\n   */\r\n\r\n  var LOW_PRIORITY$a = 500;\r\n\r\n\r\n  /**\r\n   * Add referenced root elements (error, escalation, message, signal) if they don't exist.\r\n   * Copy referenced root elements on copy & paste.\r\n   *\r\n   * @param {Modeler} bpmnjs\r\n   * @param {EventBus} eventBus\r\n   * @param {Injector} injector\r\n   * @param {ModdleCopy} moddleCopy\r\n   * @param {BpmnFactory} bpmnFactory\r\n   */\r\n  function RootElementReferenceBehavior(\r\n      bpmnjs, eventBus, injector, moddleCopy, bpmnFactory\r\n  ) {\r\n    injector.invoke(CommandInterceptor, this);\r\n\r\n    function canHaveRootElementReference(element) {\r\n      return isAny(element, [ 'bpmn:ReceiveTask', 'bpmn:SendTask' ]) ||\r\n        hasAnyEventDefinition(element, [\r\n          'bpmn:ErrorEventDefinition',\r\n          'bpmn:EscalationEventDefinition',\r\n          'bpmn:MessageEventDefinition',\r\n          'bpmn:SignalEventDefinition'\r\n        ]);\r\n    }\r\n\r\n    function hasRootElement(rootElement) {\r\n      var definitions = bpmnjs.getDefinitions(),\r\n          rootElements = definitions.get('rootElements');\r\n\r\n      return !!find(rootElements, matchPattern({ id: rootElement.id }));\r\n    }\r\n\r\n    function getRootElementReferencePropertyName(eventDefinition) {\r\n      if (is$1(eventDefinition, 'bpmn:ErrorEventDefinition')) {\r\n        return 'errorRef';\r\n      } else if (is$1(eventDefinition, 'bpmn:EscalationEventDefinition')) {\r\n        return 'escalationRef';\r\n      } else if (is$1(eventDefinition, 'bpmn:MessageEventDefinition')) {\r\n        return 'messageRef';\r\n      } else if (is$1(eventDefinition, 'bpmn:SignalEventDefinition')) {\r\n        return 'signalRef';\r\n      }\r\n    }\r\n\r\n    function getRootElement(businessObject) {\r\n      if (isAny(businessObject, [ 'bpmn:ReceiveTask', 'bpmn:SendTask' ])) {\r\n        return businessObject.get('messageRef');\r\n      }\r\n\r\n      var eventDefinitions = businessObject.get('eventDefinitions'),\r\n          eventDefinition = eventDefinitions[ 0 ];\r\n\r\n      return eventDefinition.get(getRootElementReferencePropertyName(eventDefinition));\r\n    }\r\n\r\n    function setRootElement(businessObject, rootElement) {\r\n      if (isAny(businessObject, [ 'bpmn:ReceiveTask', 'bpmn:SendTask' ])) {\r\n        return businessObject.set('messageRef', rootElement);\r\n      }\r\n\r\n      var eventDefinitions = businessObject.get('eventDefinitions'),\r\n          eventDefinition = eventDefinitions[ 0 ];\r\n\r\n      return eventDefinition.set(getRootElementReferencePropertyName(eventDefinition), rootElement);\r\n    }\r\n\r\n    // create shape\r\n    this.executed([\r\n      'shape.create',\r\n      'element.updateProperties',\r\n      'element.updateModdleProperties'\r\n    ], function(context) {\r\n      var shape = context.shape || context.element;\r\n\r\n      if (!canHaveRootElementReference(shape)) {\r\n        return;\r\n      }\r\n\r\n      var businessObject = getBusinessObject(shape),\r\n          rootElement = getRootElement(businessObject),\r\n          rootElements;\r\n\r\n      if (rootElement && !hasRootElement(rootElement)) {\r\n        rootElements = bpmnjs.getDefinitions().get('rootElements');\r\n\r\n        // add root element\r\n        add(rootElements, rootElement);\r\n\r\n        context.addedRootElement = rootElement;\r\n      }\r\n    }, true);\r\n\r\n    this.reverted([\r\n      'shape.create',\r\n      'element.updateProperties',\r\n      'element.updateModdleProperties'\r\n    ], function(context) {\r\n      var addedRootElement = context.addedRootElement;\r\n\r\n      if (!addedRootElement) {\r\n        return;\r\n      }\r\n\r\n      var rootElements = bpmnjs.getDefinitions().get('rootElements');\r\n\r\n      // remove root element\r\n      remove(rootElements, addedRootElement);\r\n    }, true);\r\n\r\n    eventBus.on('copyPaste.copyElement', function(context) {\r\n      var descriptor = context.descriptor,\r\n          element = context.element;\r\n\r\n      if (element.labelTarget || !canHaveRootElementReference(element)) {\r\n        return;\r\n      }\r\n\r\n      var businessObject = getBusinessObject(element),\r\n          rootElement = getRootElement(businessObject);\r\n\r\n      if (rootElement) {\r\n\r\n        // TODO(nikku): clone on copy\r\n        descriptor.referencedRootElement = rootElement;\r\n      }\r\n    });\r\n\r\n    eventBus.on('copyPaste.pasteElement', LOW_PRIORITY$a, function(context) {\r\n      var descriptor = context.descriptor,\r\n          businessObject = descriptor.businessObject,\r\n          referencedRootElement = descriptor.referencedRootElement;\r\n\r\n      if (!referencedRootElement) {\r\n        return;\r\n      }\r\n\r\n      if (!hasRootElement(referencedRootElement)) {\r\n        referencedRootElement = moddleCopy.copyElement(\r\n          referencedRootElement,\r\n          bpmnFactory.create(referencedRootElement.$type)\r\n        );\r\n      }\r\n\r\n      setRootElement(businessObject, referencedRootElement);\r\n\r\n      delete descriptor.referencedRootElement;\r\n    });\r\n  }\r\n\r\n  RootElementReferenceBehavior.$inject = [\r\n    'bpmnjs',\r\n    'eventBus',\r\n    'injector',\r\n    'moddleCopy',\r\n    'bpmnFactory'\r\n  ];\r\n\r\n  e$3(RootElementReferenceBehavior, CommandInterceptor);\r\n\r\n  // helpers //////////\r\n\r\n  function hasAnyEventDefinition(element, types) {\r\n    if (!isArray$3(types)) {\r\n      types = [ types ];\r\n    }\r\n\r\n    return some(types, function(type) {\r\n      return hasEventDefinition$2(element, type);\r\n    });\r\n  }\n\n  /**\r\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\r\n   *\r\n   * @typedef {import('../../../model/Types').Shape} Shape\r\n   */\r\n\r\n  var max$1 = Math.max;\r\n\r\n  /**\r\n   * @param {EventBus} eventBus\r\n   */\r\n  function SpaceToolBehavior(eventBus) {\r\n    eventBus.on('spaceTool.getMinDimensions', function(context) {\r\n      var shapes = context.shapes,\r\n          axis = context.axis,\r\n          start = context.start,\r\n          minDimensions = {};\r\n\r\n      forEach$1(shapes, function(shape) {\r\n        var id = shape.id;\r\n\r\n        if (is$1(shape, 'bpmn:Participant')) {\r\n\r\n          if (isHorizontal$1(axis)) {\r\n            minDimensions[ id ] = PARTICIPANT_MIN_DIMENSIONS;\r\n          } else {\r\n            minDimensions[ id ] = {\r\n              width: PARTICIPANT_MIN_DIMENSIONS.width,\r\n              height: getParticipantMinHeight(shape, start)\r\n            };\r\n          }\r\n\r\n        }\r\n\r\n        if (is$1(shape, 'bpmn:SubProcess') && isExpanded(shape)) {\r\n          minDimensions[ id ] = SUB_PROCESS_MIN_DIMENSIONS;\r\n        }\r\n\r\n        if (is$1(shape, 'bpmn:TextAnnotation')) {\r\n          minDimensions[ id ] = TEXT_ANNOTATION_MIN_DIMENSIONS;\r\n        }\r\n\r\n        if (is$1(shape, 'bpmn:Group')) {\r\n          minDimensions[ id ] = GROUP_MIN_DIMENSIONS;\r\n        }\r\n      });\r\n\r\n      return minDimensions;\r\n    });\r\n  }\r\n\r\n  SpaceToolBehavior.$inject = [ 'eventBus' ];\r\n\r\n\r\n  // helpers //////////\r\n  function isHorizontal$1(axis) {\r\n    return axis === 'x';\r\n  }\r\n\r\n  /**\r\n   * Get minimum height for participant taking lanes into account.\r\n   *\r\n   * @param {Shape} participant\r\n   * @param {number} start\r\n   *\r\n   * @return {number}\r\n   */\r\n  function getParticipantMinHeight(participant, start) {\r\n    var lanesMinHeight;\r\n\r\n    if (!hasChildLanes(participant)) {\r\n      return PARTICIPANT_MIN_DIMENSIONS.height;\r\n    }\r\n\r\n    lanesMinHeight = getLanesMinHeight(participant, start);\r\n\r\n    return max$1(PARTICIPANT_MIN_DIMENSIONS.height, lanesMinHeight);\r\n  }\r\n\r\n  function hasChildLanes(element) {\r\n    return !!getChildLanes(element).length;\r\n  }\r\n\r\n  function getLanesMinHeight(participant, resizeStart) {\r\n    var lanes = getChildLanes(participant),\r\n        resizedLane;\r\n\r\n    // find the nested lane which is currently resized\r\n    resizedLane = findResizedLane(lanes, resizeStart);\r\n\r\n    // resized lane cannot shrink below the minimum height\r\n    // but remaining lanes' dimensions are kept intact\r\n    return participant.height - resizedLane.height + LANE_MIN_DIMENSIONS.height;\r\n  }\r\n\r\n  /**\r\n   * Find nested lane which is currently resized.\r\n   *\r\n   * @param {Shape[]} lanes\r\n   * @param {number} resizeStart\r\n   *\r\n   * @return {Shape}\r\n   */\r\n  function findResizedLane(lanes, resizeStart) {\r\n    var i, lane, childLanes;\r\n\r\n    for (i = 0; i < lanes.length; i++) {\r\n      lane = lanes[i];\r\n\r\n      // resizing current lane or a lane nested\r\n      if (resizeStart >= lane.y && resizeStart <= lane.y + lane.height) {\r\n        childLanes = getChildLanes(lane);\r\n\r\n        // a nested lane is resized\r\n        if (childLanes.length) {\r\n          return findResizedLane(childLanes, resizeStart);\r\n        }\r\n\r\n        // current lane is the resized one\r\n        return lane;\r\n      }\r\n    }\r\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../Modeling').default} Modeling\n   * @typedef {import('../ElementFactory').default} ElementFactory\n   * @typedef {import('../BpmnFactory').default} BpmnFactory\n   * @typedef {import('../../../Modeler').default} Modeler\n   * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n   *\n   * @typedef {import('../../../model/Types').Element} Element\n   * @typedef {import('../../../model/Types').Root} Root\n   * @typedef {import('../../../model/Types').ModdleElement} ModdleElement\n   */\n\n  var LOW_PRIORITY$9 = 400;\n  var HIGH_PRIORITY$8 = 600;\n\n  var DEFAULT_POSITION = {\n    x: 180,\n    y: 160\n  };\n\n\n  /**\n   * Creates bpmndi:BPMNPlane elements and canvas planes when collapsed subprocesses are created.\n   *\n   * @param {Canvas} canvas\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   * @param {ElementFactory} elementFactory\n   * @param {BpmnFactory} bpmnFactory\n   * @param {Modeler} bpmnjs\n   * @param {ElementRegistry} elementRegistry\n   */\n  function SubProcessPlaneBehavior(\n      canvas, eventBus, modeling,\n      elementFactory, bpmnFactory, bpmnjs, elementRegistry) {\n\n    CommandInterceptor.call(this, eventBus);\n\n    this._canvas = canvas;\n    this._eventBus = eventBus;\n    this._modeling = modeling;\n    this._elementFactory = elementFactory;\n    this._bpmnFactory = bpmnFactory;\n    this._bpmnjs = bpmnjs;\n    this._elementRegistry = elementRegistry;\n\n    var self = this;\n\n    function isCollapsedSubProcess(element) {\n      return is$1(element, 'bpmn:SubProcess') && !isExpanded(element);\n    }\n\n    function createRoot(context) {\n      var shape = context.shape,\n          rootElement = context.newRootElement;\n\n      var businessObject = getBusinessObject(shape);\n\n      rootElement = self._addDiagram(rootElement || businessObject);\n\n      context.newRootElement = canvas.addRootElement(rootElement);\n    }\n\n    function removeRoot(context) {\n      var shape = context.shape;\n\n      var businessObject = getBusinessObject(shape);\n      self._removeDiagram(businessObject);\n\n      var rootElement = context.newRootElement = elementRegistry.get(getPlaneIdFromShape(businessObject));\n\n      canvas.removeRootElement(rootElement);\n    }\n\n    // add plane elements for newly created sub-processes\n    // this ensures we can actually drill down into the element\n    this.executed('shape.create', function(context) {\n      var shape = context.shape;\n      if (!isCollapsedSubProcess(shape)) {\n        return;\n      }\n\n      createRoot(context);\n    }, true);\n\n\n    this.postExecuted('shape.create', function(context) {\n      var shape = context.shape,\n          rootElement = context.newRootElement;\n\n      if (!rootElement || !shape.children) {\n        return;\n      }\n\n      self._showRecursively(shape.children);\n\n      self._moveChildrenToShape(shape, rootElement);\n    }, true);\n\n\n    this.reverted('shape.create', function(context) {\n      var shape = context.shape;\n      if (!isCollapsedSubProcess(shape)) {\n        return;\n      }\n\n      removeRoot(context);\n    }, true);\n\n\n    this.preExecuted('shape.delete', function(context) {\n      var shape = context.shape;\n      if (!isCollapsedSubProcess(shape)) {\n        return;\n      }\n\n      var attachedRoot = elementRegistry.get(getPlaneIdFromShape(shape));\n\n      if (!attachedRoot) {\n        return;\n      }\n\n      modeling.removeElements(attachedRoot.children.slice());\n    }, true);\n\n\n    this.executed('shape.delete', function(context) {\n      var shape = context.shape;\n      if (!isCollapsedSubProcess(shape)) {\n        return;\n      }\n      removeRoot(context);\n    }, true);\n\n\n    this.reverted('shape.delete', function(context) {\n      var shape = context.shape;\n      if (!isCollapsedSubProcess(shape)) {\n        return;\n      }\n\n      createRoot(context);\n    }, true);\n\n\n    this.preExecuted('shape.replace', function(context) {\n      var oldShape = context.oldShape;\n      var newShape = context.newShape;\n\n      if (!isCollapsedSubProcess(oldShape) || !isCollapsedSubProcess(newShape)) {\n        return;\n      }\n\n      // old plane could have content,\n      // we remove it so it is not recursively deleted from 'shape.delete'\n      context.oldRoot = canvas.removeRootElement(getPlaneIdFromShape(oldShape));\n    }, true);\n\n\n    this.postExecuted('shape.replace', function(context) {\n      var newShape = context.newShape,\n          source = context.oldRoot,\n          target = canvas.findRoot(getPlaneIdFromShape(newShape));\n\n      if (!source || !target) {\n        return;\n      }\n      var elements = source.children;\n\n      modeling.moveElements(elements, { x: 0, y: 0 }, target);\n    }, true);\n\n\n    // rename primary elements when the secondary element changes\n    // this ensures rootElement.id = element.id + '_plane'\n    this.executed('element.updateProperties', function(context) {\n      var shape = context.element;\n\n      if (!is$1(shape, 'bpmn:SubProcess')) {\n        return;\n      }\n\n      var properties = context.properties;\n      var oldProperties = context.oldProperties;\n\n      var oldId = oldProperties.id,\n          newId = properties.id;\n\n      if (oldId === newId) {\n        return;\n      }\n\n      if (isPlane(shape)) {\n        elementRegistry.updateId(shape, toPlaneId(newId));\n        elementRegistry.updateId(oldId, newId);\n\n        return;\n      }\n\n      var planeElement = elementRegistry.get(toPlaneId(oldId));\n\n      if (!planeElement) {\n        return;\n      }\n\n      elementRegistry.updateId(toPlaneId(oldId), toPlaneId(newId));\n    }, true);\n\n\n    this.reverted('element.updateProperties', function(context) {\n      var shape = context.element;\n\n      if (!is$1(shape, 'bpmn:SubProcess')) {\n        return;\n      }\n\n      var properties = context.properties;\n      var oldProperties = context.oldProperties;\n\n      var oldId = oldProperties.id,\n          newId = properties.id;\n\n      if (oldId === newId) {\n        return;\n      }\n\n      if (isPlane(shape)) {\n        elementRegistry.updateId(shape, toPlaneId(oldId));\n        elementRegistry.updateId(newId, oldId);\n\n        return;\n      }\n\n      var planeElement = elementRegistry.get(toPlaneId(newId));\n\n      if (!planeElement) {\n        return;\n      }\n\n      elementRegistry.updateId(planeElement, toPlaneId(oldId));\n    }, true);\n\n    // re-throw element.changed to re-render primary shape if associated plane has\n    // changed (e.g. bpmn:name property has changed)\n    eventBus.on('element.changed', function(context) {\n      var element = context.element;\n\n      if (!isPlane(element)) {\n        return;\n      }\n\n      var plane = element;\n\n      var primaryShape = elementRegistry.get(getShapeIdFromPlane(plane));\n\n      // do not re-throw if no associated primary shape (e.g. bpmn:Process)\n      if (!primaryShape || primaryShape === plane) {\n        return;\n      }\n\n      eventBus.fire('element.changed', { element: primaryShape });\n    });\n\n\n    // create/remove plane for the subprocess\n    this.executed('shape.toggleCollapse', LOW_PRIORITY$9, function(context) {\n      var shape = context.shape;\n\n      if (!is$1(shape, 'bpmn:SubProcess')) {\n        return;\n      }\n\n      if (!isExpanded(shape)) {\n        createRoot(context);\n        self._showRecursively(shape.children);\n      } else {\n        removeRoot(context);\n      }\n\n    }, true);\n\n\n    // create/remove plane for the subprocess\n    this.reverted('shape.toggleCollapse', LOW_PRIORITY$9, function(context) {\n      var shape = context.shape;\n\n      if (!is$1(shape, 'bpmn:SubProcess')) {\n        return;\n      }\n\n      if (!isExpanded(shape)) {\n        createRoot(context);\n        self._showRecursively(shape.children);\n      } else {\n        removeRoot(context);\n      }\n\n    }, true);\n\n    // move elements between planes\n    this.postExecuted('shape.toggleCollapse', HIGH_PRIORITY$8, function(context) {\n      var shape = context.shape;\n\n      if (!is$1(shape, 'bpmn:SubProcess')) {\n        return;\n      }\n\n      var rootElement = context.newRootElement;\n\n      if (!rootElement) {\n        return;\n      }\n\n      if (!isExpanded(shape)) {\n\n        // collapsed\n        self._moveChildrenToShape(shape, rootElement);\n\n      } else {\n        self._moveChildrenToShape(rootElement, shape);\n      }\n    }, true);\n\n\n    // copy-paste ///////////\n\n    // add elements in plane to tree\n    eventBus.on('copyPaste.createTree', function(context) {\n      var element = context.element,\n          children = context.children;\n\n      if (!isCollapsedSubProcess(element)) {\n        return;\n      }\n\n      var id = getPlaneIdFromShape(element);\n      var parent = elementRegistry.get(id);\n\n      if (parent) {\n\n        // do not copy invisible root element\n        children.push.apply(children, parent.children);\n      }\n    });\n\n    // set plane children as direct children of collapsed shape\n    eventBus.on('copyPaste.copyElement', function(context) {\n      var descriptor = context.descriptor,\n          element = context.element,\n          elements = context.elements;\n\n      var parent = element.parent;\n\n      var isPlane = is$1(getDi(parent), 'bpmndi:BPMNPlane');\n      if (!isPlane) {\n        return;\n      }\n\n      var parentId = getShapeIdFromPlane(parent);\n\n      var referencedShape = find(elements, function(element) {\n        return element.id === parentId;\n      });\n\n      if (!referencedShape) {\n        return;\n      }\n\n      descriptor.parent = referencedShape.id;\n    });\n\n    // hide children during pasting\n    eventBus.on('copyPaste.pasteElement', function(context) {\n      var descriptor = context.descriptor;\n\n      if (!descriptor.parent) {\n        return;\n      }\n\n      if (isCollapsedSubProcess(descriptor.parent) || descriptor.parent.hidden) {\n        descriptor.hidden = true;\n      }\n    });\n\n  }\n\n  e$3(SubProcessPlaneBehavior, CommandInterceptor);\n\n  /**\n   * Moves the child elements from source to target.\n   *\n   * If the target is a plane, the children are moved to the top left corner.\n   * Otherwise, the center of the target is used.\n   *\n   * @param {Root} source\n   * @param {Root} target\n   */\n  SubProcessPlaneBehavior.prototype._moveChildrenToShape = function(source, target) {\n    var modeling = this._modeling;\n\n    var children = source.children;\n    var offset;\n\n    if (!children) {\n      return;\n    }\n\n    // add external labels that weren't children of sub process\n    children = children.concat(children.reduce(function(labels, child) {\n      if (child.label && child.label.parent !== source) {\n        return labels.concat(child.label);\n      }\n\n      return labels;\n    }, []));\n\n    // only change plane if there are no visible children, but don't move them\n    var visibleChildren = children.filter(function(child) {\n      return !child.hidden;\n    });\n\n    if (!visibleChildren.length) {\n      modeling.moveElements(children, { x: 0, y: 0 }, target, { autoResize: false });\n      return;\n    }\n\n    var childrenBounds = getBBox(visibleChildren);\n\n    // target is a plane\n    if (!target.x) {\n      offset = {\n        x: DEFAULT_POSITION.x - childrenBounds.x,\n        y: DEFAULT_POSITION.y - childrenBounds.y\n      };\n    }\n\n    // source is a plane\n    else {\n\n      // move relative to the center of the shape\n      var targetMid = getMid(target);\n      var childrenMid = getMid(childrenBounds);\n\n      offset = {\n        x: targetMid.x - childrenMid.x,\n        y: targetMid.y - childrenMid.y\n      };\n    }\n\n    modeling.moveElements(children, offset, target, { autoResize: false });\n  };\n\n  /**\n   * Sets `hidden` property on all children of the given shape.\n   *\n   * @param {Element[]} elements\n   * @param {boolean} [hidden=false]\n   *\n   * @return {Element[]}\n   */\n  SubProcessPlaneBehavior.prototype._showRecursively = function(elements, hidden) {\n    var self = this;\n\n    var result = [];\n    elements.forEach(function(element) {\n      element.hidden = !!hidden;\n\n      result = result.concat(element);\n\n      if (element.children) {\n        result = result.concat(\n          self._showRecursively(element.children, element.collapsed || hidden)\n        );\n      }\n    });\n\n    return result;\n  };\n\n  /**\n   * Adds a given root element to the BPMNDI diagrams.\n   *\n   * @param {Root|ModdleElement} planeElement\n   *\n   * @return {Root}\n   */\n  SubProcessPlaneBehavior.prototype._addDiagram = function(planeElement) {\n    var bpmnjs = this._bpmnjs;\n    var diagrams = bpmnjs.getDefinitions().diagrams;\n\n    if (!planeElement.businessObject) {\n      planeElement = this._createNewDiagram(planeElement);\n    }\n\n    diagrams.push(planeElement.di.$parent);\n\n    return planeElement;\n  };\n\n\n  /**\n   * Creates a new plane element for the given sub process.\n   *\n   * @param {ModdleElement} bpmnElement\n   *\n   * @return {Root}\n   */\n  SubProcessPlaneBehavior.prototype._createNewDiagram = function(bpmnElement) {\n    var bpmnFactory = this._bpmnFactory,\n        elementFactory = this._elementFactory;\n\n    var diPlane = bpmnFactory.create('bpmndi:BPMNPlane', {\n      bpmnElement: bpmnElement\n    });\n\n    var diDiagram = bpmnFactory.create('bpmndi:BPMNDiagram', {\n      plane: diPlane\n    });\n\n    diPlane.$parent = diDiagram;\n\n    // add a virtual element (not being drawn),\n    // a copy cat of our BpmnImporter code\n    var planeElement = elementFactory.createRoot({\n      id: getPlaneIdFromShape(bpmnElement),\n      type: bpmnElement.$type,\n      di: diPlane,\n      businessObject: bpmnElement,\n      collapsed: true\n    });\n\n    return planeElement;\n  };\n\n  /**\n   * Removes the diagram for a given root element.\n   *\n   * @param {Root} rootElement\n   *\n   * @return {ModdleElement}\n   */\n  SubProcessPlaneBehavior.prototype._removeDiagram = function(rootElement) {\n    var bpmnjs = this._bpmnjs;\n\n    var diagrams = bpmnjs.getDefinitions().diagrams;\n\n    var removedDiagram = find(diagrams, function(diagram) {\n      return diagram.plane.bpmnElement.id === rootElement.id;\n    });\n\n    diagrams.splice(diagrams.indexOf(removedDiagram), 1);\n\n    return removedDiagram;\n  };\n\n\n  SubProcessPlaneBehavior.$inject = [\n    'canvas',\n    'eventBus',\n    'modeling',\n    'elementFactory',\n    'bpmnFactory',\n    'bpmnjs',\n    'elementRegistry'\n  ];\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * Add start event replacing element with expanded sub process.\n   *\n   * @param {Injector} injector\n   * @param {Modeling} modeling\n   */\n  function SubProcessStartEventBehavior(injector, modeling) {\n    injector.invoke(CommandInterceptor, this);\n\n    this.postExecuted('shape.replace', function(event) {\n      var oldShape = event.context.oldShape,\n          newShape = event.context.newShape;\n\n      if (\n        !is$1(newShape, 'bpmn:SubProcess') ||\n        ! (is$1(oldShape, 'bpmn:Task') || is$1(oldShape, 'bpmn:CallActivity')) ||\n        !isExpanded(newShape)\n      ) {\n        return;\n      }\n\n      var position = getStartEventPosition(newShape);\n\n      modeling.createShape({ type: 'bpmn:StartEvent' }, position, newShape);\n    });\n  }\n\n  SubProcessStartEventBehavior.$inject = [\n    'injector',\n    'modeling'\n  ];\n\n  e$3(SubProcessStartEventBehavior, CommandInterceptor);\n\n  // helpers //////////\n\n  function getStartEventPosition(shape) {\n    return {\n      x: shape.x + shape.width / 6,\n      y: shape.y + shape.height / 2\n    };\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../Modeling').default} Modeling\n   *\n   * @typedef {import('../../../model/Types').Element} Element\n   * @typedef {import('../../../model/Types').Shape} Shape\n   *\n   * @typedef {import('diagram-js/lib/util/Types').DirectionTRBL} DirectionTRBL\n   */\n\n  /**\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   */\n  function ToggleCollapseConnectionBehaviour(\n      eventBus, modeling\n  ) {\n\n    CommandInterceptor.call(this, eventBus);\n\n    this.postExecuted('shape.toggleCollapse', 1500, function(context) {\n\n      // var shape = context.shape;\n      var shape = context.shape;\n\n      // only change connections when collapsing\n      if (isExpanded(shape)) {\n        return;\n      }\n\n      var allChildren = selfAndAllChildren(shape);\n\n      allChildren.forEach(function(child) {\n\n        // Ensure that the connection array is not modified during iteration\n        var incomingConnections = child.incoming.slice(),\n            outgoingConnections = child.outgoing.slice();\n\n        forEach$1(incomingConnections, function(c) {\n          handleConnection(c, true);\n        });\n\n        forEach$1(outgoingConnections, function(c) {\n          handleConnection(c, false);\n        });\n      });\n\n\n      function handleConnection(c, incoming) {\n        if (allChildren.indexOf(c.source) !== -1 && allChildren.indexOf(c.target) !== -1) {\n          return;\n        }\n\n        if (incoming) {\n          modeling.reconnectEnd(c, shape, getMid(shape));\n        } else {\n          modeling.reconnectStart(c, shape, getMid(shape));\n        }\n\n      }\n\n    }, true);\n\n  }\n\n  e$3(ToggleCollapseConnectionBehaviour, CommandInterceptor);\n\n  ToggleCollapseConnectionBehaviour.$inject = [\n    'eventBus',\n    'modeling',\n  ];\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../ElementFactory').default} ElementFactory\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  var LOW_PRIORITY$8 = 500;\n\n  /**\n   * @param {EventBus} eventBus\n   * @param {ElementFactory} elementFactory\n   * @param {Modeling} modeling\n   */\n  function ToggleElementCollapseBehaviour(\n      eventBus, elementFactory, modeling) {\n\n    CommandInterceptor.call(this, eventBus);\n\n\n    function hideEmptyLabels(children) {\n      if (children.length) {\n        children.forEach(function(child) {\n          if (child.type === 'label' && !child.businessObject.name) {\n            child.hidden = true;\n          }\n        });\n      }\n    }\n\n    function expandedBounds(shape, defaultSize) {\n      var children = shape.children,\n          newBounds = defaultSize,\n          visibleElements,\n          visibleBBox;\n\n      visibleElements = filterVisible(children).concat([ shape ]);\n\n      visibleBBox = computeChildrenBBox(visibleElements);\n\n      if (visibleBBox) {\n\n        // center to visibleBBox with max(defaultSize, childrenBounds)\n        newBounds.width = Math.max(visibleBBox.width, newBounds.width);\n        newBounds.height = Math.max(visibleBBox.height, newBounds.height);\n\n        newBounds.x = visibleBBox.x + (visibleBBox.width - newBounds.width) / 2;\n        newBounds.y = visibleBBox.y + (visibleBBox.height - newBounds.height) / 2;\n      } else {\n\n        // center to collapsed shape with defaultSize\n        newBounds.x = shape.x + (shape.width - newBounds.width) / 2;\n        newBounds.y = shape.y + (shape.height - newBounds.height) / 2;\n      }\n\n      return newBounds;\n    }\n\n    function collapsedBounds(shape, defaultSize) {\n\n      return {\n        x: shape.x + (shape.width - defaultSize.width) / 2,\n        y: shape.y + (shape.height - defaultSize.height) / 2,\n        width: defaultSize.width,\n        height: defaultSize.height\n      };\n    }\n\n    this.executed([ 'shape.toggleCollapse' ], LOW_PRIORITY$8, function(e) {\n\n      var context = e.context,\n          shape = context.shape;\n\n      if (!is$1(shape, 'bpmn:SubProcess')) {\n        return;\n      }\n\n      if (!shape.collapsed) {\n\n        // all children got made visible through djs, hide empty labels\n        hideEmptyLabels(shape.children);\n\n        // remove collapsed marker\n        getDi(shape).isExpanded = true;\n      } else {\n\n        // place collapsed marker\n        getDi(shape).isExpanded = false;\n      }\n    });\n\n    this.reverted([ 'shape.toggleCollapse' ], LOW_PRIORITY$8, function(e) {\n\n      var context = e.context;\n      var shape = context.shape;\n\n\n      // revert removing/placing collapsed marker\n      if (!shape.collapsed) {\n        getDi(shape).isExpanded = true;\n\n      } else {\n        getDi(shape).isExpanded = false;\n      }\n    });\n\n    this.postExecuted([ 'shape.toggleCollapse' ], LOW_PRIORITY$8, function(e) {\n      var shape = e.context.shape,\n          defaultSize = elementFactory.getDefaultSize(shape),\n          newBounds;\n\n      if (shape.collapsed) {\n\n        // resize to default size of collapsed shapes\n        newBounds = collapsedBounds(shape, defaultSize);\n      } else {\n\n        // resize to bounds of max(visible children, defaultSize)\n        newBounds = expandedBounds(shape, defaultSize);\n      }\n\n      modeling.resizeShape(shape, newBounds, null, {\n        autoResize: shape.collapsed ? false : 'nwse'\n      });\n    });\n\n  }\n\n\n  e$3(ToggleElementCollapseBehaviour, CommandInterceptor);\n\n  ToggleElementCollapseBehaviour.$inject = [\n    'eventBus',\n    'elementFactory',\n    'modeling'\n  ];\n\n\n  // helpers //////////////////////\n\n  function filterVisible(elements) {\n    return elements.filter(function(e) {\n      return !e.hidden;\n    });\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('didi').Injector} Injector\n   * @typedef {import('../Modeling').default} Modeling\n   *\n   * @typedef {import('../../../model/Types').Moddle} Moddle\n   */\n\n  /**\n   * Unclaims model IDs on element deletion.\n   *\n   * @param {Canvas} canvas\n   * @param {Injector} injector\n   * @param {Moddle} moddle\n   * @param {Modeling} modeling\n   */\n  function UnclaimIdBehavior(canvas, injector, moddle, modeling) {\n    injector.invoke(CommandInterceptor, this);\n\n    this.preExecute('shape.delete', function(event) {\n      var context = event.context,\n          shape = context.shape,\n          shapeBo = shape.businessObject;\n\n      if (isLabel(shape)) {\n        return;\n      }\n\n      if (is$1(shape, 'bpmn:Participant') && isExpanded(shape)) {\n        moddle.ids.unclaim(shapeBo.processRef.id);\n      }\n\n      modeling.unclaimId(shapeBo.id, shapeBo);\n    });\n\n\n    this.preExecute('connection.delete', function(event) {\n      var context = event.context,\n          connection = context.connection,\n          connectionBo = connection.businessObject;\n\n      modeling.unclaimId(connectionBo.id, connectionBo);\n    });\n\n    this.preExecute('canvas.updateRoot', function() {\n      var rootElement = canvas.getRootElement(),\n          rootElementBo = rootElement.businessObject;\n\n      if (is$1(rootElement, 'bpmn:Collaboration')) {\n        moddle.ids.unclaim(rootElementBo.id);\n      }\n    });\n  }\n\n  e$3(UnclaimIdBehavior, CommandInterceptor);\n\n  UnclaimIdBehavior.$inject = [ 'canvas', 'injector', 'moddle', 'modeling' ];\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * A behavior that unsets the Default property of sequence flow source on\n   * element delete, if the removed element is the Gateway or Task's default flow.\n   *\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   */\n  function DeleteSequenceFlowBehavior(eventBus, modeling) {\n\n    CommandInterceptor.call(this, eventBus);\n\n\n    this.preExecute('connection.delete', function(event) {\n      var context = event.context,\n          connection = context.connection,\n          source = connection.source;\n\n      if (isDefaultFlow(connection, source)) {\n        modeling.updateProperties(source, {\n          'default': null\n        });\n      }\n    });\n  }\n\n  e$3(DeleteSequenceFlowBehavior, CommandInterceptor);\n\n  DeleteSequenceFlowBehavior.$inject = [\n    'eventBus',\n    'modeling'\n  ];\n\n\n  // helpers //////////////////////\n\n  function isDefaultFlow(connection, source) {\n\n    if (!is$1(connection, 'bpmn:SequenceFlow')) {\n      return false;\n    }\n\n    var sourceBo = getBusinessObject(source),\n        sequenceFlow = getBusinessObject(connection);\n\n    return sourceBo.get('default') === sequenceFlow;\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../Modeling').default} Modeling\n   * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n   */\n\n  var LOW_PRIORITY$7 = 500,\n      HIGH_PRIORITY$7 = 5000;\n\n\n  /**\n   * BPMN specific delete lane behavior.\n   *\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   * @param {Translate} translate\n   */\n  function UpdateFlowNodeRefsBehavior(eventBus, modeling, translate) {\n\n    CommandInterceptor.call(this, eventBus);\n\n    /**\n     * Update Lane#flowNodeRefs and FlowNode#lanes with every flow node\n     * move/resize and lane move/resize. Groups elements to recompute containments\n     * as efficient as possible.\n     */\n\n    // the update context\n    var context;\n\n\n    function initContext() {\n      context = context || new UpdateContext();\n      context.enter();\n\n      return context;\n    }\n\n    function getContext() {\n      if (!context) {\n        throw new Error(translate('out of bounds release'));\n      }\n\n      return context;\n    }\n\n    function releaseContext() {\n\n      if (!context) {\n        throw new Error(translate('out of bounds release'));\n      }\n\n      var triggerUpdate = context.leave();\n\n      if (triggerUpdate) {\n        modeling.updateLaneRefs(context.flowNodes, context.lanes);\n\n        context = null;\n      }\n\n      return triggerUpdate;\n    }\n\n\n    var laneRefUpdateEvents = [\n      'spaceTool',\n      'lane.add',\n      'lane.resize',\n      'lane.split',\n      'elements.create',\n      'elements.delete',\n      'elements.move',\n      'shape.create',\n      'shape.delete',\n      'shape.move',\n      'shape.resize'\n    ];\n\n\n    // listen to a lot of stuff to group lane updates\n\n    this.preExecute(laneRefUpdateEvents, HIGH_PRIORITY$7, function(event) {\n      initContext();\n    });\n\n    this.postExecuted(laneRefUpdateEvents, LOW_PRIORITY$7, function(event) {\n      releaseContext();\n    });\n\n\n    // Mark flow nodes + lanes that need an update\n\n    this.preExecute([\n      'shape.create',\n      'shape.move',\n      'shape.delete',\n      'shape.resize'\n    ], function(event) {\n\n      var context = event.context,\n          shape = context.shape;\n\n      var updateContext = getContext();\n\n      // no need to update labels\n      if (shape.labelTarget) {\n        return;\n      }\n\n      if (is$1(shape, 'bpmn:Lane')) {\n        updateContext.addLane(shape);\n      }\n\n      if (is$1(shape, 'bpmn:FlowNode')) {\n        updateContext.addFlowNode(shape);\n      }\n    });\n  }\n\n  UpdateFlowNodeRefsBehavior.$inject = [\n    'eventBus',\n    'modeling' ,\n    'translate'\n  ];\n\n  e$3(UpdateFlowNodeRefsBehavior, CommandInterceptor);\n\n\n  function UpdateContext() {\n\n    this.flowNodes = [];\n    this.lanes = [];\n\n    this.counter = 0;\n\n    this.addLane = function(lane) {\n      this.lanes.push(lane);\n    };\n\n    this.addFlowNode = function(flowNode) {\n      this.flowNodes.push(flowNode);\n    };\n\n    this.enter = function() {\n      this.counter++;\n    };\n\n    this.leave = function() {\n      this.counter--;\n\n      return !this.counter;\n    };\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var BehaviorModule = {\n    __init__: [\n      'adaptiveLabelPositioningBehavior',\n      'appendBehavior',\n      'associationBehavior',\n      'attachEventBehavior',\n      'boundaryEventBehavior',\n      'createBehavior',\n      'createDataObjectBehavior',\n      'createParticipantBehavior',\n      'dataInputAssociationBehavior',\n      'dataStoreBehavior',\n      'deleteLaneBehavior',\n      'detachEventBehavior',\n      'dropOnFlowBehavior',\n      'eventBasedGatewayBehavior',\n      'fixHoverBehavior',\n      'groupBehavior',\n      'importDockingFix',\n      'isHorizontalFix',\n      'labelBehavior',\n      'layoutConnectionBehavior',\n      'messageFlowBehavior',\n      'modelingFeedback',\n      'removeElementBehavior',\n      'removeEmbeddedLabelBoundsBehavior',\n      'removeParticipantBehavior',\n      'replaceConnectionBehavior',\n      'replaceElementBehaviour',\n      'resizeBehavior',\n      'resizeLaneBehavior',\n      'rootElementReferenceBehavior',\n      'spaceToolBehavior',\n      'subProcessPlaneBehavior',\n      'subProcessStartEventBehavior',\n      'toggleCollapseConnectionBehaviour',\n      'toggleElementCollapseBehaviour',\n      'unclaimIdBehavior',\n      'updateFlowNodeRefsBehavior',\n      'unsetDefaultFlowBehavior'\n    ],\n    adaptiveLabelPositioningBehavior: [ 'type', AdaptiveLabelPositioningBehavior ],\n    appendBehavior: [ 'type', AppendBehavior ],\n    associationBehavior: [ 'type', AssociationBehavior ],\n    attachEventBehavior: [ 'type', AttachEventBehavior ],\n    boundaryEventBehavior: [ 'type', BoundaryEventBehavior ],\n    createBehavior: [ 'type', CreateBehavior ],\n    createDataObjectBehavior: [ 'type', CreateDataObjectBehavior ],\n    createParticipantBehavior: [ 'type', CreateParticipantBehavior ],\n    dataInputAssociationBehavior: [ 'type', DataInputAssociationBehavior ],\n    dataStoreBehavior: [ 'type', DataStoreBehavior ],\n    deleteLaneBehavior: [ 'type', DeleteLaneBehavior ],\n    detachEventBehavior: [ 'type', DetachEventBehavior ],\n    dropOnFlowBehavior: [ 'type', DropOnFlowBehavior ],\n    eventBasedGatewayBehavior: [ 'type', EventBasedGatewayBehavior ],\n    fixHoverBehavior: [ 'type', FixHoverBehavior ],\n    groupBehavior: [ 'type', GroupBehavior ],\n    importDockingFix: [ 'type', ImportDockingFix ],\n    isHorizontalFix: [ 'type', IsHorizontalFix ],\n    labelBehavior: [ 'type', LabelBehavior ],\n    layoutConnectionBehavior: [ 'type', LayoutConnectionBehavior ],\n    messageFlowBehavior: [ 'type', MessageFlowBehavior ],\n    modelingFeedback: [ 'type', ModelingFeedback ],\n    removeElementBehavior: [ 'type', RemoveElementBehavior ],\n    removeEmbeddedLabelBoundsBehavior: [ 'type', RemoveEmbeddedLabelBoundsBehavior ],\n    removeParticipantBehavior: [ 'type', RemoveParticipantBehavior ],\n    replaceConnectionBehavior: [ 'type', ReplaceConnectionBehavior ],\n    replaceElementBehaviour: [ 'type', ReplaceElementBehaviour ],\n    resizeBehavior: [ 'type', ResizeBehavior ],\n    resizeLaneBehavior: [ 'type', ResizeLaneBehavior ],\n    rootElementReferenceBehavior: [ 'type', RootElementReferenceBehavior ],\n    spaceToolBehavior: [ 'type', SpaceToolBehavior ],\n    subProcessPlaneBehavior: [ 'type', SubProcessPlaneBehavior ],\n    subProcessStartEventBehavior: [ 'type', SubProcessStartEventBehavior ],\n    toggleCollapseConnectionBehaviour: [ 'type', ToggleCollapseConnectionBehaviour ],\n    toggleElementCollapseBehaviour : [ 'type', ToggleElementCollapseBehaviour ],\n    unclaimIdBehavior: [ 'type', UnclaimIdBehavior ],\n    unsetDefaultFlowBehavior: [ 'type', DeleteSequenceFlowBehavior ],\n    updateFlowNodeRefsBehavior: [ 'type', UpdateFlowNodeRefsBehavior ]\n  };\n\n  /**\r\n   * @typedef {import('diagram-js/lib/util/Types').DirectionTRBL} DirectionTRBL\r\n   * @typedef {import('diagram-js/lib/util/Types').Point} Point\r\n   * @typedef {import('diagram-js/lib/util/Types').Rect} Rect\r\n   */\r\n\r\n  /**\r\n   * @param {Point} position\r\n   * @param {Rect} targetBounds\r\n   *\r\n   * @return {DirectionTRBL|null}\r\n   */\r\n  function getBoundaryAttachment(position, targetBounds) {\r\n\r\n    var orientation = getOrientation(position, targetBounds, -15);\r\n\r\n    if (orientation !== 'intersect') {\r\n      return orientation;\r\n    } else {\r\n      return null;\r\n    }\r\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   *\n   * @typedef {import('../../model/Types').Connection} Connection\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Shape} Shape\n   * @typedef {import('../../model/Types').ModdleElement} ModdleElement\n   *\n   * @typedef {import('diagram-js/lib/util/Types').Point} Point\n   * @typedef {import('diagram-js/lib/util/Types').Rect} Rect\n   *\n   * @typedef { {\n   *   associationDirection?: string;\n   *   type: string;\n   * } | boolean | null } CanConnectResult\n   *\n   * @typedef { {\n   *   id: string;\n   *   type: string;\n   * } | boolean } CanReplaceResult\n   */\n\n  /**\n   * BPMN-specific modeling rules.\n   *\n   * @param {EventBus} eventBus\n   */\n  function BpmnRules(eventBus) {\n    RuleProvider.call(this, eventBus);\n  }\n\n  e$3(BpmnRules, RuleProvider);\n\n  BpmnRules.$inject = [ 'eventBus' ];\n\n  BpmnRules.prototype.init = function() {\n\n    this.addRule('connection.start', function(context) {\n      var source = context.source;\n\n      return canStartConnection(source);\n    });\n\n    this.addRule('connection.create', function(context) {\n      var source = context.source,\n          target = context.target,\n          hints = context.hints || {},\n          targetParent = hints.targetParent,\n          targetAttach = hints.targetAttach;\n\n      // don't allow incoming connections on\n      // newly created boundary events\n      // to boundary events\n      if (targetAttach) {\n        return false;\n      }\n\n      // temporarily set target parent for scoping\n      // checks to work\n      if (targetParent) {\n        target.parent = targetParent;\n      }\n\n      try {\n        return canConnect(source, target);\n      } finally {\n\n        // unset temporary target parent\n        if (targetParent) {\n          target.parent = null;\n        }\n      }\n    });\n\n    this.addRule('connection.reconnect', function(context) {\n\n      var connection = context.connection,\n          source = context.source,\n          target = context.target;\n\n      return canConnect(source, target, connection);\n    });\n\n    this.addRule('connection.updateWaypoints', function(context) {\n      return {\n        type: context.connection.type\n      };\n    });\n\n    this.addRule('shape.resize', function(context) {\n\n      var shape = context.shape,\n          newBounds = context.newBounds;\n\n      return canResize(shape, newBounds);\n    });\n\n    this.addRule('elements.create', function(context) {\n      var elements = context.elements,\n          position = context.position,\n          target = context.target;\n\n      if (isConnection(target) && !canInsert(elements, target)) {\n        return false;\n      }\n\n      return every(elements, function(element) {\n        if (isConnection(element)) {\n          return canConnect(element.source, element.target, element);\n        }\n\n        if (element.host) {\n          return canAttach(element, element.host, null, position);\n        }\n\n        return canCreate(element, target, null);\n      });\n    });\n\n    this.addRule('elements.move', function(context) {\n\n      var target = context.target,\n          shapes = context.shapes,\n          position = context.position;\n\n      return canAttach(shapes, target, null, position) ||\n             canReplace(shapes, target, position) ||\n             canMove(shapes, target) ||\n             canInsert(shapes, target);\n    });\n\n    this.addRule('shape.create', function(context) {\n      return canCreate(\n        context.shape,\n        context.target,\n        context.source,\n        context.position\n      );\n    });\n\n    this.addRule('shape.attach', function(context) {\n\n      return canAttach(\n        context.shape,\n        context.target,\n        null,\n        context.position\n      );\n    });\n\n    this.addRule('element.copy', function(context) {\n      var element = context.element,\n          elements = context.elements;\n\n      return canCopy(elements, element);\n    });\n  };\n\n  BpmnRules.prototype.canConnectMessageFlow = canConnectMessageFlow;\n\n  BpmnRules.prototype.canConnectSequenceFlow = canConnectSequenceFlow;\n\n  BpmnRules.prototype.canConnectDataAssociation = canConnectDataAssociation;\n\n  BpmnRules.prototype.canConnectAssociation = canConnectAssociation;\n\n  BpmnRules.prototype.canMove = canMove;\n\n  BpmnRules.prototype.canAttach = canAttach;\n\n  BpmnRules.prototype.canReplace = canReplace;\n\n  BpmnRules.prototype.canDrop = canDrop;\n\n  BpmnRules.prototype.canInsert = canInsert;\n\n  BpmnRules.prototype.canCreate = canCreate;\n\n  BpmnRules.prototype.canConnect = canConnect;\n\n  BpmnRules.prototype.canResize = canResize;\n\n  BpmnRules.prototype.canCopy = canCopy;\n\n  /**\n   * Utility functions for rule checking\n   */\n\n  /**\n   * Checks if given element can be used for starting connection.\n   *\n   * @param  {Element} source\n   *\n   * @return {boolean}\n   */\n  function canStartConnection(element) {\n    if (nonExistingOrLabel(element)) {\n      return null;\n    }\n\n    return isAny(element, [\n      'bpmn:FlowNode',\n      'bpmn:InteractionNode',\n      'bpmn:DataObjectReference',\n      'bpmn:DataStoreReference',\n      'bpmn:Group',\n      'bpmn:TextAnnotation'\n    ]);\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function nonExistingOrLabel(element) {\n    return !element || isLabel(element);\n  }\n\n  function isSame$1(a, b) {\n    return a === b;\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {ModdleElement}\n   */\n  function getOrganizationalParent(element) {\n\n    do {\n      if (is$1(element, 'bpmn:Process')) {\n        return getBusinessObject(element);\n      }\n\n      if (is$1(element, 'bpmn:Participant')) {\n        return (\n          getBusinessObject(element).processRef ||\n          getBusinessObject(element)\n        );\n      }\n    } while ((element = element.parent));\n\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isTextAnnotation(element) {\n    return is$1(element, 'bpmn:TextAnnotation');\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isGroup(element) {\n    return is$1(element, 'bpmn:Group') && !element.labelTarget;\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isCompensationBoundary(element) {\n    return is$1(element, 'bpmn:BoundaryEvent') &&\n           hasEventDefinition(element, 'bpmn:CompensateEventDefinition');\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isForCompensation(element) {\n    return getBusinessObject(element).isForCompensation;\n  }\n\n  /**\n   * @param {Element} a\n   * @param {Element} b\n   *\n   * @return {boolean}\n   */\n  function isSameOrganization(a, b) {\n    var parentA = getOrganizationalParent(a),\n        parentB = getOrganizationalParent(b);\n\n    return parentA === parentB;\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isMessageFlowSource(element) {\n    return (\n      is$1(element, 'bpmn:InteractionNode') &&\n      !is$1(element, 'bpmn:BoundaryEvent') && (\n        !is$1(element, 'bpmn:Event') || (\n          is$1(element, 'bpmn:ThrowEvent') &&\n          hasEventDefinitionOrNone(element, 'bpmn:MessageEventDefinition')\n        )\n      )\n    );\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isMessageFlowTarget(element) {\n    return (\n      is$1(element, 'bpmn:InteractionNode') &&\n      !isForCompensation(element) && (\n        !is$1(element, 'bpmn:Event') || (\n          is$1(element, 'bpmn:CatchEvent') &&\n          hasEventDefinitionOrNone(element, 'bpmn:MessageEventDefinition')\n        )\n      ) && !(\n        is$1(element, 'bpmn:BoundaryEvent') &&\n        !hasEventDefinition(element, 'bpmn:MessageEventDefinition')\n      )\n    );\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {ModdleElement}\n   */\n  function getScopeParent(element) {\n\n    var parent = element;\n\n    while ((parent = parent.parent)) {\n\n      if (is$1(parent, 'bpmn:FlowElementsContainer')) {\n        return getBusinessObject(parent);\n      }\n\n      if (is$1(parent, 'bpmn:Participant')) {\n        return getBusinessObject(parent).processRef;\n      }\n    }\n\n    return null;\n  }\n\n  /**\n   * @param {Element} a\n   * @param {Element} b\n   *\n   * @return {boolean}\n   */\n  function isSameScope(a, b) {\n    var scopeParentA = getScopeParent(a),\n        scopeParentB = getScopeParent(b);\n\n    return scopeParentA === scopeParentB;\n  }\n\n  /**\n   * @param {Element} element\n   * @param {string} eventDefinition\n   *\n   * @return {boolean}\n   */\n  function hasEventDefinition(element, eventDefinition) {\n    var businessObject = getBusinessObject(element);\n\n    return !!find(businessObject.eventDefinitions || [], function(definition) {\n      return is$1(definition, eventDefinition);\n    });\n  }\n\n  /**\n   * @param {Element} element\n   * @param {string} eventDefinition\n   *\n   * @return {boolean}\n   */\n  function hasEventDefinitionOrNone(element, eventDefinition) {\n    var businessObject = getBusinessObject(element);\n\n    return (businessObject.eventDefinitions || []).every(function(definition) {\n      return is$1(definition, eventDefinition);\n    });\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isSequenceFlowSource(element) {\n    return (\n      is$1(element, 'bpmn:FlowNode') &&\n      !is$1(element, 'bpmn:EndEvent') &&\n      !isEventSubProcess(element) &&\n      !(is$1(element, 'bpmn:IntermediateThrowEvent') &&\n        hasEventDefinition(element, 'bpmn:LinkEventDefinition')\n      ) &&\n      !isCompensationBoundary(element) &&\n      !isForCompensation(element)\n    );\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isSequenceFlowTarget(element) {\n    return (\n      is$1(element, 'bpmn:FlowNode') &&\n      !is$1(element, 'bpmn:StartEvent') &&\n      !is$1(element, 'bpmn:BoundaryEvent') &&\n      !isEventSubProcess(element) &&\n      !(is$1(element, 'bpmn:IntermediateCatchEvent') &&\n        hasEventDefinition(element, 'bpmn:LinkEventDefinition')\n      ) &&\n      !isForCompensation(element)\n    );\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isEventBasedTarget(element) {\n    return (\n      is$1(element, 'bpmn:ReceiveTask') || (\n        is$1(element, 'bpmn:IntermediateCatchEvent') && (\n          hasEventDefinition(element, 'bpmn:MessageEventDefinition') ||\n          hasEventDefinition(element, 'bpmn:TimerEventDefinition') ||\n          hasEventDefinition(element, 'bpmn:ConditionalEventDefinition') ||\n          hasEventDefinition(element, 'bpmn:SignalEventDefinition')\n        )\n      )\n    );\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {Shape[]}\n   */\n  function getParents(element) {\n\n    var parents = [];\n\n    while (element) {\n      element = element.parent;\n\n      if (element) {\n        parents.push(element);\n      }\n    }\n\n    return parents;\n  }\n\n  /**\n   * @param {Shape} possibleParent\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isParent(possibleParent, element) {\n    var allParents = getParents(element);\n\n    return allParents.indexOf(possibleParent) !== -1;\n  }\n\n  /**\n   * @param {Element} source\n   * @param {Element} target\n   * @param {Connection} connection\n   *\n   * @return {CanConnectResult}\n   */\n  function canConnect(source, target, connection) {\n\n    if (nonExistingOrLabel(source) || nonExistingOrLabel(target)) {\n      return null;\n    }\n\n    if (!is$1(connection, 'bpmn:DataAssociation')) {\n\n      if (canConnectMessageFlow(source, target)) {\n        return { type: 'bpmn:MessageFlow' };\n      }\n\n      if (canConnectSequenceFlow(source, target)) {\n        return { type: 'bpmn:SequenceFlow' };\n      }\n    }\n\n    var connectDataAssociation = canConnectDataAssociation(source, target);\n\n    if (connectDataAssociation) {\n      return connectDataAssociation;\n    }\n\n    if (isCompensationBoundary(source) && isForCompensation(target)) {\n      return {\n        type: 'bpmn:Association',\n        associationDirection: 'One'\n      };\n    }\n\n    if (canConnectAssociation(source, target)) {\n\n      return {\n        type: 'bpmn:Association'\n      };\n    }\n\n    return false;\n  }\n\n  /**\n   * Can an element be dropped into the target element.\n   *\n   * @param {Element} element\n   * @param {Shape} target\n   *\n   * @return {boolean}\n   */\n  function canDrop(element, target) {\n\n    // can move labels and groups everywhere\n    if (isLabel(element) || isGroup(element)) {\n      return true;\n    }\n\n\n    // disallow to create elements on collapsed pools\n    if (is$1(target, 'bpmn:Participant') && !isExpanded(target)) {\n      return false;\n    }\n\n    // allow to create new participants on\n    // existing collaboration and process diagrams\n    if (is$1(element, 'bpmn:Participant')) {\n      return is$1(target, 'bpmn:Process') || is$1(target, 'bpmn:Collaboration');\n    }\n\n    // allow moving DataInput / DataOutput within its original container only\n    if (isAny(element, [ 'bpmn:DataInput', 'bpmn:DataOutput' ])) {\n\n      if (element.parent) {\n        return target === element.parent;\n      }\n    }\n\n    // allow creating lanes on participants and other lanes only\n    if (is$1(element, 'bpmn:Lane')) {\n      return is$1(target, 'bpmn:Participant') || is$1(target, 'bpmn:Lane');\n    }\n\n    // disallow dropping boundary events which cannot replace with intermediate event\n    if (is$1(element, 'bpmn:BoundaryEvent') && !isDroppableBoundaryEvent(element)) {\n      return false;\n    }\n\n    // drop flow elements onto flow element containers\n    // and participants\n    if (is$1(element, 'bpmn:FlowElement') && !is$1(element, 'bpmn:DataStoreReference')) {\n      if (is$1(target, 'bpmn:FlowElementsContainer')) {\n        return isExpanded(target);\n      }\n\n      return isAny(target, [ 'bpmn:Participant', 'bpmn:Lane' ]);\n    }\n\n    // disallow dropping data store reference if there is no process to append to\n    if (is$1(element, 'bpmn:DataStoreReference') && is$1(target, 'bpmn:Collaboration')) {\n      return some(getBusinessObject(target).get('participants'), function(participant) {\n        return !!participant.get('processRef');\n      });\n    }\n\n    // account for the fact that data associations are always\n    // rendered and moved to top (Process or Collaboration level)\n    //\n    // artifacts may be placed wherever, too\n    if (isAny(element, [ 'bpmn:Artifact', 'bpmn:DataAssociation', 'bpmn:DataStoreReference' ])) {\n      return isAny(target, [\n        'bpmn:Collaboration',\n        'bpmn:Lane',\n        'bpmn:Participant',\n        'bpmn:Process',\n        'bpmn:SubProcess' ]);\n    }\n\n    if (is$1(element, 'bpmn:MessageFlow')) {\n      return is$1(target, 'bpmn:Collaboration')\n        || element.source.parent == target\n        || element.target.parent == target;\n    }\n\n    return false;\n  }\n\n  /**\n   * @param {Shape} event\n   *\n   * @return {boolean}\n   */\n  function isDroppableBoundaryEvent(event) {\n    return getBusinessObject(event).cancelActivity && (\n      hasNoEventDefinition(event) || hasCommonBoundaryIntermediateEventDefinition(event)\n    );\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isBoundaryEvent(element) {\n    return !isLabel(element) && is$1(element, 'bpmn:BoundaryEvent');\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isLane(element) {\n    return is$1(element, 'bpmn:Lane');\n  }\n\n  /**\n   * `bpmn:IntermediateThrowEvents` are treated as boundary events during create.\n   *\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isBoundaryCandidate(element) {\n    if (isBoundaryEvent(element)) {\n      return true;\n    }\n\n    if (is$1(element, 'bpmn:IntermediateThrowEvent') && hasNoEventDefinition(element)) {\n      return true;\n    }\n\n    return (\n      is$1(element, 'bpmn:IntermediateCatchEvent') &&\n      hasCommonBoundaryIntermediateEventDefinition(element)\n    );\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function hasNoEventDefinition(element) {\n    var businessObject = getBusinessObject(element);\n\n    return businessObject && !(businessObject.eventDefinitions && businessObject.eventDefinitions.length);\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function hasCommonBoundaryIntermediateEventDefinition(element) {\n    return hasOneOfEventDefinitions(element, [\n      'bpmn:MessageEventDefinition',\n      'bpmn:TimerEventDefinition',\n      'bpmn:SignalEventDefinition',\n      'bpmn:ConditionalEventDefinition'\n    ]);\n  }\n\n  /**\n   * @param {Element} element\n   * @param {string[]} eventDefinitions\n   *\n   * @return {boolean}\n   */\n  function hasOneOfEventDefinitions(element, eventDefinitions) {\n    return eventDefinitions.some(function(definition) {\n      return hasEventDefinition(element, definition);\n    });\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isReceiveTaskAfterEventBasedGateway(element) {\n    return (\n      is$1(element, 'bpmn:ReceiveTask') &&\n      find(element.incoming, function(incoming) {\n        return is$1(incoming.source, 'bpmn:EventBasedGateway');\n      })\n    );\n  }\n\n  /**\n   * TODO(philippfromme): remove `source` parameter\n   *\n   * @param {Element[]} elements\n   * @param {Shape} target\n   * @param {Element} source\n   * @param {Point} [position]\n   *\n   * @return {boolean | 'attach'}\n   */\n  function canAttach(elements, target, source, position) {\n\n    if (!Array.isArray(elements)) {\n      elements = [ elements ];\n    }\n\n    // only (re-)attach one element at a time\n    if (elements.length !== 1) {\n      return false;\n    }\n\n    var element = elements[0];\n\n    // do not attach labels\n    if (isLabel(element)) {\n      return false;\n    }\n\n    // only handle boundary events\n    if (!isBoundaryCandidate(element)) {\n      return false;\n    }\n\n    // disallow drop on event sub processes\n    if (isEventSubProcess(target)) {\n      return false;\n    }\n\n    // only allow drop on non compensation activities\n    if (!is$1(target, 'bpmn:Activity') || isForCompensation(target)) {\n      return false;\n    }\n\n    // only attach to subprocess border\n    if (position && !getBoundaryAttachment(position, target)) {\n      return false;\n    }\n\n    // do not attach on receive tasks after event based gateways\n    if (isReceiveTaskAfterEventBasedGateway(target)) {\n      return false;\n    }\n\n    return 'attach';\n  }\n\n  /**\n   * Check whether the given elements can be replaced. Return all elements which\n   * can be replaced.\n   *\n   * @example\n   *\n   * ```javascript\n   * [{\n   *   id: 'IntermediateEvent_1',\n   *   type: 'bpmn:StartEvent'\n   * },\n   * {\n   *   id: 'Task_1',\n   *   type: 'bpmn:ServiceTask'\n   * }]\n   * ```\n   *\n   * @param  {Element[]} elements\n   * @param  {Shape} [target]\n   * @param  {Point} [position]\n   *\n   * @return {CanReplaceResult}\n   */\n  function canReplace(elements, target, position) {\n\n    if (!target) {\n      return false;\n    }\n\n    var canExecute = {\n      replacements: []\n    };\n\n    forEach$1(elements, function(element) {\n\n      if (!isEventSubProcess(target)) {\n\n        if (is$1(element, 'bpmn:StartEvent') &&\n            element.type !== 'label' &&\n            canDrop(element, target)) {\n\n          // replace a non-interrupting start event by a blank interrupting start event\n          // when the target is not an event sub process\n          if (!isInterrupting(element)) {\n            canExecute.replacements.push({\n              oldElementId: element.id,\n              newElementType: 'bpmn:StartEvent'\n            });\n          }\n\n          // replace an error/escalation/compensate start event by a blank interrupting start event\n          // when the target is not an event sub process\n          if (hasErrorEventDefinition(element) ||\n              hasEscalationEventDefinition(element) ||\n              hasCompensateEventDefinition(element)) {\n            canExecute.replacements.push({\n              oldElementId: element.id,\n              newElementType: 'bpmn:StartEvent'\n            });\n          }\n\n          // replace a typed start event by a blank interrupting start event\n          // when the target is a sub process but not an event sub process\n          if (hasOneOfEventDefinitions(element,\n            [\n              'bpmn:MessageEventDefinition',\n              'bpmn:TimerEventDefinition',\n              'bpmn:SignalEventDefinition',\n              'bpmn:ConditionalEventDefinition'\n            ]) &&\n              is$1(target, 'bpmn:SubProcess')) {\n            canExecute.replacements.push({\n              oldElementId: element.id,\n              newElementType: 'bpmn:StartEvent'\n            });\n          }\n        }\n      }\n\n      if (!is$1(target, 'bpmn:Transaction')) {\n        if (hasEventDefinition(element, 'bpmn:CancelEventDefinition') &&\n            element.type !== 'label') {\n\n          if (is$1(element, 'bpmn:EndEvent') && canDrop(element, target)) {\n            canExecute.replacements.push({\n              oldElementId: element.id,\n              newElementType: 'bpmn:EndEvent'\n            });\n          }\n\n          if (is$1(element, 'bpmn:BoundaryEvent') && canAttach(element, target, null, position)) {\n            canExecute.replacements.push({\n              oldElementId: element.id,\n              newElementType: 'bpmn:BoundaryEvent'\n            });\n          }\n        }\n      }\n    });\n\n    return canExecute.replacements.length ? canExecute : false;\n  }\n\n  /**\n   * @param {Element[]} elements\n   * @param {Shape} target\n   *\n   * @return {boolean}\n   */\n  function canMove(elements, target) {\n\n    // do not move selection containing lanes\n    if (some(elements, isLane)) {\n      return false;\n    }\n\n    // allow default move check to start move operation\n    if (!target) {\n      return true;\n    }\n\n    return elements.every(function(element) {\n      return canDrop(element, target);\n    });\n  }\n\n  /**\n   * @param {Shape} shape\n   * @param {Shape} target\n   * @param {Element} source\n   * @param {Point} position\n   *\n   * @return {boolean}\n   */\n  function canCreate(shape, target, source, position) {\n\n    if (!target) {\n      return false;\n    }\n\n    if (isLabel(shape) || isGroup(shape)) {\n      return true;\n    }\n\n    if (isSame$1(source, target)) {\n      return false;\n    }\n\n    // ensure we do not drop the element\n    // into source\n    if (source && isParent(source, target)) {\n      return false;\n    }\n\n    return canDrop(shape, target) || canInsert(shape, target);\n  }\n\n  /**\n   * @param {Shape} shape\n   * @param {Rect} newBounds\n   *\n   * @return {boolean}\n   */\n  function canResize(shape, newBounds) {\n    if (is$1(shape, 'bpmn:SubProcess')) {\n      return (\n        isExpanded(shape) && (\n          !newBounds || (newBounds.width >= 100 && newBounds.height >= 80)\n        )\n      );\n    }\n\n    if (is$1(shape, 'bpmn:Lane')) {\n      return !newBounds || (newBounds.width >= 130 && newBounds.height >= 60);\n    }\n\n    if (is$1(shape, 'bpmn:Participant')) {\n      return !newBounds || (newBounds.width >= 250 && newBounds.height >= 50);\n    }\n\n    if (isTextAnnotation(shape)) {\n      return true;\n    }\n\n    if (isGroup(shape)) {\n      return true;\n    }\n\n    return false;\n  }\n\n  /**\n   * Check whether one of of the elements to be connected is a text annotation.\n   *\n   * @param {Element} source\n   * @param {Element} target\n   *\n   * @return {boolean}\n   */\n  function isOneTextAnnotation(source, target) {\n\n    var sourceTextAnnotation = isTextAnnotation(source),\n        targetTextAnnotation = isTextAnnotation(target);\n\n    return (\n      (sourceTextAnnotation || targetTextAnnotation) &&\n      (sourceTextAnnotation !== targetTextAnnotation)\n    );\n  }\n\n  /**\n   * @param {Element} source\n   * @param {Element} target\n   *\n   * @return {CanConnectResult}\n   */\n  function canConnectAssociation(source, target) {\n\n    // compensation boundary events are exception\n    if (isCompensationBoundary(source) && isForCompensation(target)) {\n      return true;\n    }\n\n    // don't connect parent <-> child\n    if (isParent(target, source) || isParent(source, target)) {\n      return false;\n    }\n\n    // allow connection of associations between <!TextAnnotation> and <TextAnnotation>\n    if (isOneTextAnnotation(source, target)) {\n      return true;\n    }\n\n    // can connect associations where we can connect\n    // data associations, too (!)\n    return !!canConnectDataAssociation(source, target);\n  }\n\n  /**\n   * @param {Element} source\n   * @param {Element} target\n   *\n   * @return {boolean}\n   */\n  function canConnectMessageFlow(source, target) {\n\n    // during connect user might move mouse out of canvas\n    // https://github.com/bpmn-io/bpmn-js/issues/1033\n    if (getRootElement(source) && !getRootElement(target)) {\n      return false;\n    }\n\n    return (\n      isMessageFlowSource(source) &&\n      isMessageFlowTarget(target) &&\n      !isSameOrganization(source, target)\n    );\n  }\n\n  /**\n   * @param {Element} source\n   * @param {Element} target\n   *\n   * @return {boolean}\n   */\n  function canConnectSequenceFlow(source, target) {\n    return isSequenceFlowSource(source) &&\n           isSequenceFlowTarget(target) &&\n           isSameScope(source, target) &&\n           !(is$1(source, 'bpmn:EventBasedGateway') && !isEventBasedTarget(target));\n  }\n\n  /**\n   * @param {Element} source\n   * @param {Element} target\n   *\n   * @return {CanConnectResult}\n   */\n  function canConnectDataAssociation(source, target) {\n\n    if (isAny(source, [ 'bpmn:DataObjectReference', 'bpmn:DataStoreReference' ]) &&\n        isAny(target, [ 'bpmn:Activity', 'bpmn:ThrowEvent' ])) {\n      return { type: 'bpmn:DataInputAssociation' };\n    }\n\n    if (isAny(target, [ 'bpmn:DataObjectReference', 'bpmn:DataStoreReference' ]) &&\n        isAny(source, [ 'bpmn:Activity', 'bpmn:CatchEvent' ])) {\n      return { type: 'bpmn:DataOutputAssociation' };\n    }\n\n    return false;\n  }\n\n  /**\n   * @param {Shape} shape\n   * @param {Connection} connection\n   * @param {Point} position\n   *\n   * @return {boolean}\n   */\n  function canInsert(shape, connection, position) {\n    if (!connection) {\n      return false;\n    }\n\n    if (Array.isArray(shape)) {\n      if (shape.length !== 1) {\n        return false;\n      }\n\n      shape = shape[ 0 ];\n    }\n\n    if (connection.source === shape ||\n        connection.target === shape) {\n      return false;\n    }\n\n    // return true if shape can be inserted into connection parent\n    return (\n      isAny(connection, [ 'bpmn:SequenceFlow', 'bpmn:MessageFlow' ]) &&\n      !isLabel(connection) &&\n      is$1(shape, 'bpmn:FlowNode') &&\n      !is$1(shape, 'bpmn:BoundaryEvent') &&\n      canDrop(shape, connection.parent));\n  }\n\n  /**\n   * @param {Element[]} elements\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function includes$5(elements, element) {\n    return (elements && element) && elements.indexOf(element) !== -1;\n  }\n\n  /**\n   * @param {Element[]} elements\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function canCopy(elements, element) {\n    if (isLabel(element)) {\n      return true;\n    }\n\n    if (is$1(element, 'bpmn:Lane') && !includes$5(elements, element.parent)) {\n      return false;\n    }\n\n    return true;\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {Element|null}\n   */\n  function getRootElement(element) {\n    return getParent(element, 'bpmn:Process') || getParent(element, 'bpmn:Collaboration');\n  }\n\n  var RulesModule = {\n    __depends__: [\n      RulesModule$1\n    ],\n    __init__: [ 'bpmnRules' ],\n    bpmnRules: [ 'type', BpmnRules ]\n  };\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   */\n\n  var HIGH_PRIORITY$6 = 2000;\n\n  /**\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   */\n  function BpmnDiOrdering(eventBus, canvas) {\n\n    eventBus.on('saveXML.start', HIGH_PRIORITY$6, orderDi);\n\n    function orderDi() {\n      var rootElements = canvas.getRootElements();\n\n      forEach$1(rootElements, function(root) {\n        var rootDi = getDi(root),\n            elements,\n            diElements;\n\n        elements = selfAndAllChildren([ root ], false);\n\n        // only bpmndi:Shape and bpmndi:Edge can be direct children of bpmndi:Plane\n        elements = filter(elements, function(element) {\n          return element !== root && !element.labelTarget;\n        });\n\n        diElements = map$1(elements, getDi);\n\n        rootDi.set('planeElement', diElements);\n      });\n    }\n  }\n\n  BpmnDiOrdering.$inject = [ 'eventBus', 'canvas' ];\n\n  var DiOrderingModule = {\n    __init__: [\n      'bpmnDiOrdering'\n    ],\n    bpmnDiOrdering: [ 'type', BpmnDiOrdering ]\n  };\n\n  /**\n   * @typedef {import('../../core/Types').ElementLike} Element\n   * @typedef {import('../../core/Types').ShapeLike} Shape\n   *\n   * @typedef {import('../../core/EventBus').default} EventBus\n   */\n\n  /**\n   * An abstract provider that allows modelers to implement a custom\n   * ordering of diagram elements on the canvas.\n   *\n   * It makes sure that the order is always preserved during element\n   * creation and move operations.\n   *\n   * In order to use this behavior, inherit from it and override\n   * the method {@link OrderingProvider#getOrdering}.\n   *\n   * @example\n   *\n   * ```javascript\n   * function CustomOrderingProvider(eventBus) {\n   *   OrderingProvider.call(this, eventBus);\n   *\n   *   this.getOrdering = function(element, newParent) {\n   *     // always insert elements at the front\n   *     // when moving\n   *     return {\n   *       index: 0,\n   *       parent: newParent\n   *     };\n   *   };\n   * }\n   * ```\n   *\n   * @param {EventBus} eventBus\n   */\n  function OrderingProvider(eventBus) {\n\n    CommandInterceptor.call(this, eventBus);\n\n\n    var self = this;\n\n    this.preExecute([ 'shape.create', 'connection.create' ], function(event) {\n\n      var context = event.context,\n          element = context.shape || context.connection,\n          parent = context.parent;\n\n      var ordering = self.getOrdering(element, parent);\n\n      if (ordering) {\n\n        if (ordering.parent !== undefined) {\n          context.parent = ordering.parent;\n        }\n\n        context.parentIndex = ordering.index;\n      }\n    });\n\n    this.preExecute([ 'shape.move', 'connection.move' ], function(event) {\n\n      var context = event.context,\n          element = context.shape || context.connection,\n          parent = context.newParent || element.parent;\n\n      var ordering = self.getOrdering(element, parent);\n\n      if (ordering) {\n\n        if (ordering.parent !== undefined) {\n          context.newParent = ordering.parent;\n        }\n\n        context.newParentIndex = ordering.index;\n      }\n    });\n  }\n\n  /**\n   * Return a custom ordering of the element, both in terms\n   * of parent element and index in the new parent.\n   *\n   * Implementors of this method must return an object with\n   * `parent` _and_ `index` in it.\n   *\n   * @param {Element} element\n   * @param {Shape} newParent\n   *\n   * @return {Object} ordering descriptor\n   */\n  OrderingProvider.prototype.getOrdering = function(element, newParent) {\n    return null;\n  };\n\n  e$3(OrderingProvider, CommandInterceptor);\n\n  /**\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('diagram-js/i18n/translate/translate').default} Translate\n   */\n\n  /**\n   * A BPMN-specific ordering provider.\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {Translate} translate\n   */\n  function BpmnOrderingProvider(eventBus, canvas, translate) {\n\n    OrderingProvider.call(this, eventBus);\n\n    var orders = [\n      { type: 'bpmn:SubProcess', order: { level: 6 } },\n\n      // handle SequenceFlow(s) like message flows and render them always on top\n      {\n        type: 'bpmn:SequenceFlow',\n        order: {\n          level: 9,\n          containers: [\n            'bpmn:Participant',\n            'bpmn:FlowElementsContainer'\n          ]\n        }\n      },\n\n      // handle DataAssociation(s) like message flows and render them always on top\n      {\n        type: 'bpmn:DataAssociation',\n        order: {\n          level: 9,\n          containers: [\n            'bpmn:Collaboration',\n            'bpmn:FlowElementsContainer'\n          ]\n        }\n      },\n      {\n        type: 'bpmn:MessageFlow', order: {\n          level: 9,\n          containers: [ 'bpmn:Collaboration' ]\n        }\n      },\n      {\n        type: 'bpmn:Association',\n        order: {\n          level: 6,\n          containers: [\n            'bpmn:Participant',\n            'bpmn:FlowElementsContainer',\n            'bpmn:Collaboration'\n          ]\n        }\n      },\n      { type: 'bpmn:BoundaryEvent', order: { level: 8 } },\n      {\n        type: 'bpmn:Group',\n        order: {\n          level: 10,\n          containers: [\n            'bpmn:Collaboration',\n            'bpmn:FlowElementsContainer'\n          ]\n        }\n      },\n      { type: 'bpmn:FlowElement', order: { level: 5 } },\n      { type: 'bpmn:Participant', order: { level: -2 } },\n      { type: 'bpmn:Lane', order: { level: -1 } }\n    ];\n\n    function computeOrder(element) {\n      if (element.labelTarget) {\n        return { level: 10 };\n      }\n\n      var entry = find(orders, function(o) {\n        return isAny(element, [ o.type ]);\n      });\n\n      return entry && entry.order || { level: 1 };\n    }\n\n    function getOrder(element) {\n\n      var order = element.order;\n\n      if (!order) {\n        element.order = order = computeOrder(element);\n      }\n\n      if (!order) {\n        throw new Error('no order for <' + element.id + '>');\n      }\n\n      return order;\n    }\n\n    function findActualParent(element, newParent, containers) {\n\n      var actualParent = newParent;\n\n      while (actualParent) {\n\n        if (isAny(actualParent, containers)) {\n          break;\n        }\n\n        actualParent = actualParent.parent;\n      }\n\n      if (!actualParent) {\n        throw new Error('no parent for <' + element.id + '> in <' + (newParent && newParent.id) + '>');\n      }\n\n      return actualParent;\n    }\n\n    this.getOrdering = function(element, newParent) {\n\n      // render labels always on top\n      if (element.labelTarget) {\n        return {\n          parent: canvas.findRoot(newParent) || canvas.getRootElement(),\n          index: -1\n        };\n      }\n\n      var elementOrder = getOrder(element);\n\n      if (elementOrder.containers) {\n        newParent = findActualParent(element, newParent, elementOrder.containers);\n      }\n\n      var currentIndex = newParent.children.indexOf(element);\n\n      var insertIndex = findIndex(newParent.children, function(child) {\n\n        // do not compare with labels, they are created\n        // in the wrong order (right after elements) during import and\n        // mess up the positioning.\n        if (!element.labelTarget && child.labelTarget) {\n          return false;\n        }\n\n        return elementOrder.level < getOrder(child).level;\n      });\n\n\n      // if the element is already in the child list at\n      // a smaller index, we need to adjust the insert index.\n      // this takes into account that the element is being removed\n      // before being re-inserted\n      if (insertIndex !== -1) {\n        if (currentIndex !== -1 && currentIndex < insertIndex) {\n          insertIndex -= 1;\n        }\n      }\n\n      return {\n        index: insertIndex,\n        parent: newParent\n      };\n    };\n  }\n\n  BpmnOrderingProvider.$inject = [ 'eventBus', 'canvas', 'translate' ];\n\n  e$3(BpmnOrderingProvider, OrderingProvider);\n\n  var OrderingModule = {\n    __depends__: [\n      translate\n    ],\n    __init__: [ 'bpmnOrderingProvider' ],\n    bpmnOrderingProvider: [ 'type', BpmnOrderingProvider ]\n  };\n\n  /**\n   * @typedef {import('../dragging/Dragging').default} Dragging\n   * @typedef {import('../../core/EventBus').default} EventBus\n   *\n   * @typedef {import('../../core/EventBus').Event} Event\n   */\n\n  var LOW_PRIORITY$6 = 250;\n\n  /**\n   * The tool manager acts as middle-man between the available tool's and the Palette,\n   * it takes care of making sure that the correct active state is set.\n   *\n   * @param {EventBus} eventBus\n   * @param {Dragging} dragging\n   */\n  function ToolManager(eventBus, dragging) {\n    this._eventBus = eventBus;\n    this._dragging = dragging;\n\n    this._tools = [];\n    this._active = null;\n  }\n\n  ToolManager.$inject = [ 'eventBus', 'dragging' ];\n\n  /**\n   * Register a tool.\n   *\n   * @param {string} name\n   * @param { {\n   *   dragging: string;\n   *   tool: string;\n   * } } events\n   */\n  ToolManager.prototype.registerTool = function(name, events) {\n    var tools = this._tools;\n\n    if (!events) {\n      throw new Error('A tool has to be registered with it\\'s \"events\"');\n    }\n\n    tools.push(name);\n\n    this.bindEvents(name, events);\n  };\n\n  ToolManager.prototype.isActive = function(tool) {\n    return tool && this._active === tool;\n  };\n\n  ToolManager.prototype.length = function(tool) {\n    return this._tools.length;\n  };\n\n  ToolManager.prototype.setActive = function(tool) {\n    var eventBus = this._eventBus;\n\n    if (this._active !== tool) {\n      this._active = tool;\n\n      eventBus.fire('tool-manager.update', { tool: tool });\n    }\n  };\n\n  ToolManager.prototype.bindEvents = function(name, events) {\n    var eventBus = this._eventBus,\n        dragging = this._dragging;\n\n    var eventsToRegister = [];\n\n    eventBus.on(events.tool + '.init', function(event) {\n      var context = event.context;\n\n      // Active tools that want to reactivate themselves must do this explicitly\n      if (!context.reactivate && this.isActive(name)) {\n        this.setActive(null);\n\n        dragging.cancel();\n        return;\n      }\n\n      this.setActive(name);\n\n    }, this);\n\n    // TODO: add test cases\n    forEach$1(events, function(event) {\n      eventsToRegister.push(event + '.ended');\n      eventsToRegister.push(event + '.canceled');\n    });\n\n    eventBus.on(eventsToRegister, LOW_PRIORITY$6, function(event) {\n\n      // We defer the de-activation of the tool to the .activate phase,\n      // so we're able to check if we want to toggle off the current\n      // active tool or switch to a new one\n      if (!this._active) {\n        return;\n      }\n\n      if (isPaletteClick(event)) {\n        return;\n      }\n\n      this.setActive(null);\n    }, this);\n\n  };\n\n\n  // helpers ///////////////\n\n  /**\n   * Check if a given event is a palette click event.\n   *\n   * @param {Event} event\n   *\n   * @return {boolean}\n   */\n  function isPaletteClick(event) {\n    var target = event.originalEvent && event.originalEvent.target;\n\n    return target && closest(target, '.group[data-group=\"tools\"]');\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var ToolManagerModule = {\n    __depends__: [\n      DraggingModule\n    ],\n    __init__: [ 'toolManager' ],\n    toolManager: [ 'type', ToolManager ]\n  };\n\n  /**\n   * @typedef {import('../../core/Types').ConnectionLike} Connection\n   * @typedef {import('../../core/Types').ShapeLike} Shape\n   *\n   * @typedef {import('../../util/Types').Axis} Axis\n   * @typedef {import('../../util/Types').Direction} Direction\n   * @typedef {import('../../util/Types').Point} Point\n   * @typedef {import('../../util/Types').Rect} Rect\n   */\n\n  /**\n   * Return direction given axis and delta.\n   *\n   * @param {Axis} axis\n   * @param {number} delta\n   *\n   * @return {Direction}\n   */\n  function getDirection(axis, delta) {\n\n    if (axis === 'x') {\n      if (delta > 0) {\n        return 'e';\n      }\n\n      if (delta < 0) {\n        return 'w';\n      }\n    }\n\n    if (axis === 'y') {\n      if (delta > 0) {\n        return 's';\n      }\n\n      if (delta < 0) {\n        return 'n';\n      }\n    }\n\n    return null;\n  }\n\n  /**\n   * Returns connections whose waypoints are to be updated. Waypoints are to be updated if start\n   * or end is to be moved or resized.\n   *\n   * @param {Array<Shape>} movingShapes\n   * @param {Array<Shape>} resizingShapes\n   *\n   * @return {Array<Connection>}\n   */\n  function getWaypointsUpdatingConnections(movingShapes, resizingShapes) {\n    var waypointsUpdatingConnections = [];\n\n    forEach$1(movingShapes.concat(resizingShapes), function(shape) {\n      var incoming = shape.incoming,\n          outgoing = shape.outgoing;\n\n      forEach$1(incoming.concat(outgoing), function(connection) {\n        var source = connection.source,\n            target = connection.target;\n\n        if (includes$4(movingShapes, source) ||\n          includes$4(movingShapes, target) ||\n          includes$4(resizingShapes, source) ||\n          includes$4(resizingShapes, target)) {\n\n          if (!includes$4(waypointsUpdatingConnections, connection)) {\n            waypointsUpdatingConnections.push(connection);\n          }\n        }\n      });\n    });\n\n    return waypointsUpdatingConnections;\n  }\n\n  function includes$4(array, item) {\n    return array.indexOf(item) !== -1;\n  }\n\n  /**\n   * Resize bounds.\n   *\n   * @param {Rect} bounds\n   * @param {Direction} direction\n   * @param {Point} delta\n   *\n   * @return {Rect}\n   */\n  function resizeBounds(bounds, direction, delta) {\n    var x = bounds.x,\n        y = bounds.y,\n        width = bounds.width,\n        height = bounds.height,\n        dx = delta.x,\n        dy = delta.y;\n\n    switch (direction) {\n    case 'n':\n      return {\n        x: x,\n        y: y + dy,\n        width: width,\n        height: height - dy\n      };\n    case 's':\n      return {\n        x: x,\n        y: y,\n        width: width,\n        height: height + dy\n      };\n    case 'w':\n      return {\n        x: x + dx,\n        y: y,\n        width: width - dx,\n        height: height\n      };\n    case 'e':\n      return {\n        x: x,\n        y: y,\n        width: width + dx,\n        height: height\n      };\n    default:\n      throw new Error('unknown direction: ' + direction);\n    }\n  }\n\n  /**\n   * @typedef {import('../../core/Types').ShapeLike} Shape\n   *\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../dragging/Dragging').default} Dragging\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   * @typedef {import('../mouse/Mouse').default} Mouse\n   * @typedef {import('../rules/Rules').default} Rules\n   * @typedef {import('../tool-manager/ToolManager').default} ToolManager\n   *\n   * @typedef {import('../../util/Types').Axis} Axis\n   * @typedef {import('../../util/Types').Direction} Direction\n   * @typedef {import('../../util/Types').Point} Point\n   */\n\n  var abs$1 = Math.abs,\n      round$4 = Math.round;\n\n  var AXIS_TO_DIMENSION = {\n    x: 'width',\n    y: 'height'\n  };\n\n  var CURSOR_CROSSHAIR = 'crosshair';\n\n  var DIRECTION_TO_TRBL = {\n    n: 'top',\n    w: 'left',\n    s: 'bottom',\n    e: 'right'\n  };\n\n  var HIGH_PRIORITY$5 = 1500;\n\n  var DIRECTION_TO_OPPOSITE = {\n    n: 's',\n    w: 'e',\n    s: 'n',\n    e: 'w'\n  };\n\n  var PADDING = 20;\n\n\n  /**\n   * Add or remove space by moving and resizing elements.\n   *\n   * @param {Canvas} canvas\n   * @param {Dragging} dragging\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   * @param {Rules} rules\n   * @param {ToolManager} toolManager\n   * @param {Mouse} mouse\n   */\n  function SpaceTool(\n      canvas, dragging, eventBus,\n      modeling, rules, toolManager,\n      mouse) {\n\n    this._canvas = canvas;\n    this._dragging = dragging;\n    this._eventBus = eventBus;\n    this._modeling = modeling;\n    this._rules = rules;\n    this._toolManager = toolManager;\n    this._mouse = mouse;\n\n    var self = this;\n\n    toolManager.registerTool('space', {\n      tool: 'spaceTool.selection',\n      dragging: 'spaceTool'\n    });\n\n    eventBus.on('spaceTool.selection.end', function(event) {\n      eventBus.once('spaceTool.selection.ended', function() {\n        self.activateMakeSpace(event.originalEvent);\n      });\n    });\n\n    eventBus.on('spaceTool.move', HIGH_PRIORITY$5 , function(event) {\n      var context = event.context,\n          initialized = context.initialized;\n\n      if (!initialized) {\n        initialized = context.initialized = self.init(event, context);\n      }\n\n      if (initialized) {\n        ensureConstraints(event);\n      }\n    });\n\n    eventBus.on('spaceTool.end', function(event) {\n      var context = event.context,\n          axis = context.axis,\n          direction = context.direction,\n          movingShapes = context.movingShapes,\n          resizingShapes = context.resizingShapes,\n          start = context.start;\n\n      if (!context.initialized) {\n        return;\n      }\n\n      ensureConstraints(event);\n\n      var delta = {\n        x: 0,\n        y: 0\n      };\n\n      delta[ axis ] = round$4(event[ 'd' + axis ]);\n\n      self.makeSpace(movingShapes, resizingShapes, delta, direction, start);\n\n      eventBus.once('spaceTool.ended', function(event) {\n\n        // activate space tool selection after make space\n        self.activateSelection(event.originalEvent, true, true);\n      });\n    });\n  }\n\n  SpaceTool.$inject = [\n    'canvas',\n    'dragging',\n    'eventBus',\n    'modeling',\n    'rules',\n    'toolManager',\n    'mouse'\n  ];\n\n  /**\n   * Activate space tool selection.\n   *\n   * @param {MouseEvent|TouchEvent} event\n   * @param {boolean} autoActivate\n   * @param {boolean} reactivate\n   */\n  SpaceTool.prototype.activateSelection = function(event, autoActivate, reactivate) {\n    this._dragging.init(event, 'spaceTool.selection', {\n      autoActivate: autoActivate,\n      cursor: CURSOR_CROSSHAIR,\n      data: {\n        context: {\n          reactivate: reactivate\n        }\n      },\n      trapClick: false\n    });\n  };\n\n  /**\n   * Activate space tool make space.\n   *\n   * @param {MouseEvent|TouchEvent} event\n   */\n  SpaceTool.prototype.activateMakeSpace = function(event) {\n    this._dragging.init(event, 'spaceTool', {\n      autoActivate: true,\n      cursor: CURSOR_CROSSHAIR,\n      data: {\n        context: {}\n      }\n    });\n  };\n\n  /**\n   * Make space.\n   *\n   * @param {Array<Shape>} movingShapes\n   * @param {Array<Shape>} resizingShapes\n   * @param {Point} delta\n   * @param {Direction} direction\n   * @param {number} start\n   */\n  SpaceTool.prototype.makeSpace = function(movingShapes, resizingShapes, delta, direction, start) {\n    return this._modeling.createSpace(movingShapes, resizingShapes, delta, direction, start);\n  };\n\n  /**\n   * Initialize make space and return true if that was successful.\n   *\n   * @param {MouseEvent|TouchEvent} event\n   * @param {Object} context\n   *\n   * @return {boolean}\n   */\n  SpaceTool.prototype.init = function(event, context) {\n    var axis = abs$1(event.dx) > abs$1(event.dy) ? 'x' : 'y',\n        delta = event[ 'd' + axis ],\n        start = event[ axis ] - delta;\n\n    if (abs$1(delta) < 5) {\n      return false;\n    }\n\n    // invert delta to remove space when moving left\n    if (delta < 0) {\n      delta *= -1;\n    }\n\n    // invert delta to add/remove space when removing/adding space if modifier key is pressed\n    if (hasPrimaryModifier(event)) {\n      delta *= -1;\n    }\n\n    var direction = getDirection(axis, delta);\n\n    var root = this._canvas.getRootElement();\n\n    var children = selfAndAllChildren(root, true);\n\n    var elements = this.calculateAdjustments(children, axis, delta, start);\n\n    var minDimensions = this._eventBus.fire('spaceTool.getMinDimensions', {\n      axis: axis,\n      direction: direction,\n      shapes: elements.resizingShapes,\n      start: start\n    });\n\n    var spaceToolConstraints = getSpaceToolConstraints(elements, axis, direction, start, minDimensions);\n\n    assign$1(\n      context,\n      elements,\n      {\n        axis: axis,\n        direction: direction,\n        spaceToolConstraints: spaceToolConstraints,\n        start: start\n      }\n    );\n\n    set('resize-' + (axis === 'x' ? 'ew' : 'ns'));\n\n    return true;\n  };\n\n  /**\n   * Get elements to be moved and resized.\n   *\n   * @param {Array<Shape>} elements\n   * @param {Axis} axis\n   * @param {Point} delta\n   * @param {number} start\n   *\n   * @return {Object}\n   */\n  SpaceTool.prototype.calculateAdjustments = function(elements, axis, delta, start) {\n    var rules = this._rules;\n\n    var movingShapes = [],\n        resizingShapes = [];\n\n    var attachers = [],\n        connections = [];\n\n    function moveShape(shape) {\n      if (!movingShapes.includes(shape)) {\n        movingShapes.push(shape);\n      }\n\n      var label = shape.label;\n\n      // move external label if its label target is moving\n      if (label && !movingShapes.includes(label)) {\n        movingShapes.push(label);\n      }\n    }\n\n    function resizeShape(shape) {\n      if (!resizingShapes.includes(shape)) {\n        resizingShapes.push(shape);\n      }\n    }\n\n    forEach$1(elements, function(element) {\n      if (!element.parent || isLabel(element)) {\n        return;\n      }\n\n      // handle connections separately\n      if (isConnection(element)) {\n        connections.push(element);\n\n        return;\n      }\n\n      var shapeStart = element[ axis ],\n          shapeEnd = shapeStart + element[ AXIS_TO_DIMENSION[ axis ] ];\n\n      // handle attachers separately\n      if (isAttacher$1(element)\n        && ((delta > 0 && getMid(element)[ axis ] > start)\n          || (delta < 0 && getMid(element)[ axis ] < start))) {\n        attachers.push(element);\n\n        return;\n      }\n\n      // move shape if its start is after space tool\n      if ((delta > 0 && shapeStart > start)\n        || (delta < 0 && shapeEnd < start)) {\n        moveShape(element);\n\n        return;\n      }\n\n      // resize shape if it's resizable and its start is before and its end is after space tool\n      if (shapeStart < start\n        && shapeEnd > start\n        && rules.allowed('shape.resize', { shape: element })\n      ) {\n        resizeShape(element);\n\n        return;\n      }\n    });\n\n    // move attacher if its host is moving\n    forEach$1(movingShapes, function(shape) {\n      var attachers = shape.attachers;\n\n      if (attachers) {\n        forEach$1(attachers, function(attacher) {\n          moveShape(attacher);\n        });\n      }\n    });\n\n    var allShapes = movingShapes.concat(resizingShapes);\n\n    // move attacher if its mid is after space tool and its host is moving or resizing\n    forEach$1(attachers, function(attacher) {\n      var host = attacher.host;\n\n      if (includes$3(allShapes, host)) {\n        moveShape(attacher);\n      }\n    });\n\n    allShapes = movingShapes.concat(resizingShapes);\n\n    // move external label if its label target's (connection) source and target are moving\n    forEach$1(connections, function(connection) {\n      var source = connection.source,\n          target = connection.target,\n          label = connection.label;\n\n      if (includes$3(allShapes, source)\n        && includes$3(allShapes, target)\n        && label) {\n        moveShape(label);\n      }\n    });\n\n    return {\n      movingShapes: movingShapes,\n      resizingShapes: resizingShapes\n    };\n  };\n\n  SpaceTool.prototype.toggle = function() {\n\n    if (this.isActive()) {\n      return this._dragging.cancel();\n    }\n\n    var mouseEvent = this._mouse.getLastMoveEvent();\n\n    this.activateSelection(mouseEvent, !!mouseEvent);\n  };\n\n  SpaceTool.prototype.isActive = function() {\n    var context = this._dragging.context();\n\n    if (context) {\n      return /^spaceTool/.test(context.prefix);\n    }\n\n    return false;\n  };\n\n  // helpers //////////\n\n  function addPadding(trbl) {\n    return {\n      top: trbl.top - PADDING,\n      right: trbl.right + PADDING,\n      bottom: trbl.bottom + PADDING,\n      left: trbl.left - PADDING\n    };\n  }\n\n  function ensureConstraints(event) {\n    var context = event.context,\n        spaceToolConstraints = context.spaceToolConstraints;\n\n    if (!spaceToolConstraints) {\n      return;\n    }\n\n    var x, y;\n\n    if (isNumber(spaceToolConstraints.left)) {\n      x = Math.max(event.x, spaceToolConstraints.left);\n\n      event.dx = event.dx + x - event.x;\n      event.x = x;\n    }\n\n    if (isNumber(spaceToolConstraints.right)) {\n      x = Math.min(event.x, spaceToolConstraints.right);\n\n      event.dx = event.dx + x - event.x;\n      event.x = x;\n    }\n\n    if (isNumber(spaceToolConstraints.top)) {\n      y = Math.max(event.y, spaceToolConstraints.top);\n\n      event.dy = event.dy + y - event.y;\n      event.y = y;\n    }\n\n    if (isNumber(spaceToolConstraints.bottom)) {\n      y = Math.min(event.y, spaceToolConstraints.bottom);\n\n      event.dy = event.dy + y - event.y;\n      event.y = y;\n    }\n  }\n\n  function getSpaceToolConstraints(elements, axis, direction, start, minDimensions) {\n    var movingShapes = elements.movingShapes,\n        resizingShapes = elements.resizingShapes;\n\n    if (!resizingShapes.length) {\n      return;\n    }\n\n    var spaceToolConstraints = {},\n        min,\n        max;\n\n    forEach$1(resizingShapes, function(resizingShape) {\n      var attachers = resizingShape.attachers,\n          children = resizingShape.children;\n\n      var resizingShapeBBox = asTRBL(resizingShape);\n\n      // find children that are not moving or resizing\n      var nonMovingResizingChildren = filter(children, function(child) {\n        return !isConnection(child) &&\n          !isLabel(child) &&\n          !includes$3(movingShapes, child) &&\n          !includes$3(resizingShapes, child);\n      });\n\n      // find children that are moving\n      var movingChildren = filter(children, function(child) {\n        return !isConnection(child) && !isLabel(child) && includes$3(movingShapes, child);\n      });\n\n      var minOrMax,\n          nonMovingResizingChildrenBBox,\n          movingChildrenBBox,\n          movingAttachers = [],\n          nonMovingAttachers = [],\n          movingAttachersBBox,\n          movingAttachersConstraint,\n          nonMovingAttachersBBox,\n          nonMovingAttachersConstraint;\n\n      if (nonMovingResizingChildren.length) {\n        nonMovingResizingChildrenBBox = addPadding(asTRBL(getBBox(nonMovingResizingChildren)));\n\n        minOrMax = start -\n          resizingShapeBBox[ DIRECTION_TO_TRBL[ direction ] ] +\n          nonMovingResizingChildrenBBox[ DIRECTION_TO_TRBL[ direction ] ];\n\n        if (direction === 'n') {\n          spaceToolConstraints.bottom = max = isNumber(max) ? Math.min(max, minOrMax) : minOrMax;\n        } else if (direction === 'w') {\n          spaceToolConstraints.right = max = isNumber(max) ? Math.min(max, minOrMax) : minOrMax;\n        } else if (direction === 's') {\n          spaceToolConstraints.top = min = isNumber(min) ? Math.max(min, minOrMax) : minOrMax;\n        } else if (direction === 'e') {\n          spaceToolConstraints.left = min = isNumber(min) ? Math.max(min, minOrMax) : minOrMax;\n        }\n      }\n\n      if (movingChildren.length) {\n        movingChildrenBBox = addPadding(asTRBL(getBBox(movingChildren)));\n\n        minOrMax = start -\n          movingChildrenBBox[ DIRECTION_TO_TRBL[ DIRECTION_TO_OPPOSITE[ direction ] ] ] +\n          resizingShapeBBox[ DIRECTION_TO_TRBL[ DIRECTION_TO_OPPOSITE[ direction ] ] ];\n\n        if (direction === 'n') {\n          spaceToolConstraints.bottom = max = isNumber(max) ? Math.min(max, minOrMax) : minOrMax;\n        } else if (direction === 'w') {\n          spaceToolConstraints.right = max = isNumber(max) ? Math.min(max, minOrMax) : minOrMax;\n        } else if (direction === 's') {\n          spaceToolConstraints.top = min = isNumber(min) ? Math.max(min, minOrMax) : minOrMax;\n        } else if (direction === 'e') {\n          spaceToolConstraints.left = min = isNumber(min) ? Math.max(min, minOrMax) : minOrMax;\n        }\n      }\n\n      if (attachers && attachers.length) {\n        attachers.forEach(function(attacher) {\n          if (includes$3(movingShapes, attacher)) {\n            movingAttachers.push(attacher);\n          } else {\n            nonMovingAttachers.push(attacher);\n          }\n        });\n\n        if (movingAttachers.length) {\n          movingAttachersBBox = asTRBL(getBBox(movingAttachers.map(getMid)));\n\n          movingAttachersConstraint = resizingShapeBBox[ DIRECTION_TO_TRBL[ DIRECTION_TO_OPPOSITE[ direction ] ] ]\n                - (movingAttachersBBox[ DIRECTION_TO_TRBL[ DIRECTION_TO_OPPOSITE[ direction ] ] ] - start);\n        }\n\n        if (nonMovingAttachers.length) {\n          nonMovingAttachersBBox = asTRBL(getBBox(nonMovingAttachers.map(getMid)));\n\n          nonMovingAttachersConstraint = nonMovingAttachersBBox[ DIRECTION_TO_TRBL[ direction ] ]\n                - (resizingShapeBBox[ DIRECTION_TO_TRBL[ direction ] ] - start);\n        }\n\n        if (direction === 'n') {\n          minOrMax = Math.min(movingAttachersConstraint || Infinity, nonMovingAttachersConstraint || Infinity);\n\n          spaceToolConstraints.bottom = max = isNumber(max) ? Math.min(max, minOrMax) : minOrMax;\n        } else if (direction === 'w') {\n          minOrMax = Math.min(movingAttachersConstraint || Infinity, nonMovingAttachersConstraint || Infinity);\n\n          spaceToolConstraints.right = max = isNumber(max) ? Math.min(max, minOrMax) : minOrMax;\n        } else if (direction === 's') {\n          minOrMax = Math.max(movingAttachersConstraint || -Infinity, nonMovingAttachersConstraint || -Infinity);\n\n          spaceToolConstraints.top = min = isNumber(min) ? Math.max(min, minOrMax) : minOrMax;\n        } else if (direction === 'e') {\n          minOrMax = Math.max(movingAttachersConstraint || -Infinity, nonMovingAttachersConstraint || -Infinity);\n\n          spaceToolConstraints.left = min = isNumber(min) ? Math.max(min, minOrMax) : minOrMax;\n        }\n      }\n\n      var resizingShapeMinDimensions = minDimensions && minDimensions[ resizingShape.id ];\n\n      if (resizingShapeMinDimensions) {\n\n        if (direction === 'n') {\n          minOrMax = start +\n            resizingShape[ AXIS_TO_DIMENSION [ axis ] ] -\n            resizingShapeMinDimensions[ AXIS_TO_DIMENSION[ axis ] ];\n\n          spaceToolConstraints.bottom = max = isNumber(max) ? Math.min(max, minOrMax) : minOrMax;\n        } else if (direction === 'w') {\n          minOrMax = start +\n            resizingShape[ AXIS_TO_DIMENSION [ axis ] ] -\n            resizingShapeMinDimensions[ AXIS_TO_DIMENSION[ axis ] ];\n\n          spaceToolConstraints.right = max = isNumber(max) ? Math.min(max, minOrMax) : minOrMax;\n        } else if (direction === 's') {\n          minOrMax = start -\n            resizingShape[ AXIS_TO_DIMENSION [ axis ] ] +\n            resizingShapeMinDimensions[ AXIS_TO_DIMENSION[ axis ] ];\n\n          spaceToolConstraints.top = min = isNumber(min) ? Math.max(min, minOrMax) : minOrMax;\n        } else if (direction === 'e') {\n          minOrMax = start -\n            resizingShape[ AXIS_TO_DIMENSION [ axis ] ] +\n            resizingShapeMinDimensions[ AXIS_TO_DIMENSION[ axis ] ];\n\n          spaceToolConstraints.left = min = isNumber(min) ? Math.max(min, minOrMax) : minOrMax;\n        }\n      }\n    });\n\n    return spaceToolConstraints;\n  }\n\n  function includes$3(array, item) {\n    return array.indexOf(item) !== -1;\n  }\n\n  function isAttacher$1(element) {\n    return !!element.host;\n  }\n\n  var MARKER_DRAGGING$1 = 'djs-dragging',\n      MARKER_RESIZING = 'djs-resizing';\n\n  var LOW_PRIORITY$5 = 250;\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../../draw/Styles').default} Styles\n   */\n\n  var max = Math.max;\n\n\n  /**\n   * Provides previews for selecting/moving/resizing shapes when creating/removing space.\n   *\n   * @param {EventBus} eventBus\n   * @param {ElementRegistry} elementRegistry\n   * @param {Canvas} canvas\n   * @param {Styles} styles\n   */\n  function SpaceToolPreview(\n      eventBus, elementRegistry, canvas,\n      styles, previewSupport) {\n\n    function addPreviewGfx(collection, dragGroup) {\n      forEach$1(collection, function(element) {\n        previewSupport.addDragger(element, dragGroup);\n\n        canvas.addMarker(element, MARKER_DRAGGING$1);\n      });\n    }\n\n    // add crosshair\n    eventBus.on('spaceTool.selection.start', function(event) {\n      var space = canvas.getLayer('space'),\n          context = event.context;\n\n      var orientation = {\n        x: 'M 0,-10000 L 0,10000',\n        y: 'M -10000,0 L 10000,0'\n      };\n\n      var crosshairGroup = create$1('g');\n      attr(crosshairGroup, styles.cls('djs-crosshair-group', [ 'no-events' ]));\n\n      append(space, crosshairGroup);\n\n      // horizontal path\n      var pathX = create$1('path');\n      attr(pathX, 'd', orientation.x);\n      classes(pathX).add('djs-crosshair');\n\n      append(crosshairGroup, pathX);\n\n      // vertical path\n      var pathY = create$1('path');\n      attr(pathY, 'd', orientation.y);\n      classes(pathY).add('djs-crosshair');\n\n      append(crosshairGroup, pathY);\n\n      context.crosshairGroup = crosshairGroup;\n    });\n\n    // update crosshair\n    eventBus.on('spaceTool.selection.move', function(event) {\n      var crosshairGroup = event.context.crosshairGroup;\n\n      translate$2(crosshairGroup, event.x, event.y);\n    });\n\n    // remove crosshair\n    eventBus.on('spaceTool.selection.cleanup', function(event) {\n      var context = event.context,\n          crosshairGroup = context.crosshairGroup;\n\n      if (crosshairGroup) {\n        remove$1(crosshairGroup);\n      }\n    });\n\n    // add and update move/resize previews\n    eventBus.on('spaceTool.move', LOW_PRIORITY$5, function(event) {\n\n      var context = event.context,\n          line = context.line,\n          axis = context.axis,\n          movingShapes = context.movingShapes,\n          resizingShapes = context.resizingShapes;\n\n      if (!context.initialized) {\n        return;\n      }\n\n      if (!context.dragGroup) {\n        var spaceLayer = canvas.getLayer('space');\n\n        line = create$1('path');\n        attr(line, 'd', 'M0,0 L0,0');\n        classes(line).add('djs-crosshair');\n\n        append(spaceLayer, line);\n\n        context.line = line;\n\n        var dragGroup = create$1('g');\n        attr(dragGroup, styles.cls('djs-drag-group', [ 'no-events' ]));\n\n        append(canvas.getActiveLayer(), dragGroup);\n\n        // shapes\n        addPreviewGfx(movingShapes, dragGroup);\n\n        // connections\n        var movingConnections = context.movingConnections = elementRegistry.filter(function(element) {\n          var sourceIsMoving = false;\n\n          forEach$1(movingShapes, function(shape) {\n            forEach$1(shape.outgoing, function(connection) {\n              if (element === connection) {\n                sourceIsMoving = true;\n              }\n            });\n          });\n\n          var targetIsMoving = false;\n\n          forEach$1(movingShapes, function(shape) {\n            forEach$1(shape.incoming, function(connection) {\n              if (element === connection) {\n                targetIsMoving = true;\n              }\n            });\n          });\n\n          var sourceIsResizing = false;\n\n          forEach$1(resizingShapes, function(shape) {\n            forEach$1(shape.outgoing, function(connection) {\n              if (element === connection) {\n                sourceIsResizing = true;\n              }\n            });\n          });\n\n          var targetIsResizing = false;\n\n          forEach$1(resizingShapes, function(shape) {\n            forEach$1(shape.incoming, function(connection) {\n              if (element === connection) {\n                targetIsResizing = true;\n              }\n            });\n          });\n\n          return isConnection(element)\n            && (sourceIsMoving || sourceIsResizing)\n            && (targetIsMoving || targetIsResizing);\n        });\n\n\n        addPreviewGfx(movingConnections, dragGroup);\n\n        context.dragGroup = dragGroup;\n      }\n\n      if (!context.frameGroup) {\n        var frameGroup = create$1('g');\n        attr(frameGroup, styles.cls('djs-frame-group', [ 'no-events' ]));\n\n        append(canvas.getActiveLayer(), frameGroup);\n\n        var frames = [];\n\n        forEach$1(resizingShapes, function(shape) {\n          var frame = previewSupport.addFrame(shape, frameGroup);\n\n          var initialBounds = frame.getBBox();\n\n          frames.push({\n            element: frame,\n            initialBounds: initialBounds\n          });\n\n          canvas.addMarker(shape, MARKER_RESIZING);\n        });\n\n        context.frameGroup = frameGroup;\n        context.frames = frames;\n      }\n\n      var orientation = {\n        x: 'M' + event.x + ', -10000 L' + event.x + ', 10000',\n        y: 'M -10000, ' + event.y + ' L 10000, ' + event.y\n      };\n\n      attr(line, { d: orientation[ axis ] });\n\n      var opposite = { x: 'y', y: 'x' };\n      var delta = { x: event.dx, y: event.dy };\n      delta[ opposite[ context.axis ] ] = 0;\n\n      // update move previews\n      translate$2(context.dragGroup, delta.x, delta.y);\n\n      // update resize previews\n      forEach$1(context.frames, function(frame) {\n        var element = frame.element,\n            initialBounds = frame.initialBounds,\n            width,\n            height;\n\n        if (context.direction === 'e') {\n          attr(element, {\n            width: max(initialBounds.width + delta.x, 5)\n          });\n        } else {\n          width = max(initialBounds.width - delta.x, 5);\n\n          attr(element, {\n            width: width,\n            x: initialBounds.x + initialBounds.width - width\n          });\n        }\n\n        if (context.direction === 's') {\n          attr(element, {\n            height: max(initialBounds.height + delta.y, 5)\n          });\n        } else {\n          height = max(initialBounds.height - delta.y, 5);\n\n          attr(element, {\n            height: height,\n            y: initialBounds.y + initialBounds.height - height\n          });\n        }\n      });\n\n    });\n\n    // remove move/resize previews\n    eventBus.on('spaceTool.cleanup', function(event) {\n\n      var context = event.context,\n          movingShapes = context.movingShapes,\n          movingConnections = context.movingConnections,\n          resizingShapes = context.resizingShapes,\n          line = context.line,\n          dragGroup = context.dragGroup,\n          frameGroup = context.frameGroup;\n\n      // moving shapes\n      forEach$1(movingShapes, function(shape) {\n        canvas.removeMarker(shape, MARKER_DRAGGING$1);\n      });\n\n      // moving connections\n      forEach$1(movingConnections, function(connection) {\n        canvas.removeMarker(connection, MARKER_DRAGGING$1);\n      });\n\n      if (dragGroup) {\n        remove$1(line);\n        remove$1(dragGroup);\n      }\n\n      forEach$1(resizingShapes, function(shape) {\n        canvas.removeMarker(shape, MARKER_RESIZING);\n      });\n\n      if (frameGroup) {\n        remove$1(frameGroup);\n      }\n    });\n  }\n\n  SpaceToolPreview.$inject = [\n    'eventBus',\n    'elementRegistry',\n    'canvas',\n    'styles',\n    'previewSupport'\n  ];\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var SpaceToolModule$1 = {\n    __init__: [ 'spaceToolPreview' ],\n    __depends__: [\n      DraggingModule,\n      RulesModule$1,\n      ToolManagerModule,\n      PreviewSupportModule,\n      MouseModule\n    ],\n    spaceTool: [ 'type', SpaceTool ],\n    spaceToolPreview: [ 'type', SpaceToolPreview ]\n  };\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   *\n   * @typedef {import('../../model/Types').Shape} Shape\n   *\n   * @typedef {import('diagram-js/lib/util/Types').Axis} Axis\n   * @typedef {import('diagram-js/lib/util/Types').Point} Point\n   */\n\n  /**\n   * @param {Injector} injector\n   */\n  function BpmnSpaceTool(injector) {\n    injector.invoke(SpaceTool, this);\n  }\n\n  BpmnSpaceTool.$inject = [\n    'injector'\n  ];\n\n  e$3(BpmnSpaceTool, SpaceTool);\n\n  /**\n   * @param {Shape[]} elements\n   * @param {Axis} axis\n   * @param {Point} delta\n   * @param {number} start\n   *\n   * @return {Object}\n   */\n  BpmnSpaceTool.prototype.calculateAdjustments = function(elements, axis, delta, start) {\n    var adjustments = SpaceTool.prototype.calculateAdjustments.call(this, elements, axis, delta, start);\n\n    // do not resize text annotations\n    adjustments.resizingShapes = adjustments.resizingShapes.filter(function(shape) {\n      return !is$1(shape, 'bpmn:TextAnnotation');\n    });\n\n    return adjustments;\n  };\n\n  var SpaceToolModule = {\n    __depends__: [ SpaceToolModule$1 ],\n    spaceTool: [ 'type', BpmnSpaceTool ]\n  };\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   *\n   * @typedef {import('../core/Types').ElementLike} ElementLike\n   *\n   * @typedef {import('../core/EventBus').default} EventBus\n   * @typedef {import('./CommandHandler').default} CommandHandler\n   *\n   * @typedef { any } CommandContext\n   * @typedef { {\n   *   new (...args: any[]) : CommandHandler\n   * } } CommandHandlerConstructor\n   * @typedef { {\n   *   [key: string]: CommandHandler;\n   * } } CommandHandlerMap\n   * @typedef { {\n   *   command: string;\n   *   context: any;\n   *   id?: any;\n   * } } CommandStackAction\n   * @typedef { {\n   *   actions: CommandStackAction[];\n   *   dirty: ElementLike[];\n   *   trigger: 'execute' | 'undo' | 'redo' | 'clear' | null;\n   *   atomic?: boolean;\n   * } } CurrentExecution\n   */\n\n  /**\n   * A service that offers un- and redoable execution of commands.\n   *\n   * The command stack is responsible for executing modeling actions\n   * in a un- and redoable manner. To do this it delegates the actual\n   * command execution to {@link CommandHandler}s.\n   *\n   * Command handlers provide {@link CommandHandler#execute(ctx)} and\n   * {@link CommandHandler#revert(ctx)} methods to un- and redo a command\n   * identified by a command context.\n   *\n   *\n   * ## Life-Cycle events\n   *\n   * In the process the command stack fires a number of life-cycle events\n   * that other components to participate in the command execution.\n   *\n   *    * preExecute\n   *    * preExecuted\n   *    * execute\n   *    * executed\n   *    * postExecute\n   *    * postExecuted\n   *    * revert\n   *    * reverted\n   *\n   * A special event is used for validating, whether a command can be\n   * performed prior to its execution.\n   *\n   *    * canExecute\n   *\n   * Each of the events is fired as `commandStack.{eventName}` and\n   * `commandStack.{commandName}.{eventName}`, respectively. This gives\n   * components fine grained control on where to hook into.\n   *\n   * The event object fired transports `command`, the name of the\n   * command and `context`, the command context.\n   *\n   *\n   * ## Creating Command Handlers\n   *\n   * Command handlers should provide the {@link CommandHandler#execute(ctx)}\n   * and {@link CommandHandler#revert(ctx)} methods to implement\n   * redoing and undoing of a command.\n   *\n   * A command handler _must_ ensure undo is performed properly in order\n   * not to break the undo chain. It must also return the shapes that\n   * got changed during the `execute` and `revert` operations.\n   *\n   * Command handlers may execute other modeling operations (and thus\n   * commands) in their `preExecute(d)` and `postExecute(d)` phases. The command\n   * stack will properly group all commands together into a logical unit\n   * that may be re- and undone atomically.\n   *\n   * Command handlers must not execute other commands from within their\n   * core implementation (`execute`, `revert`).\n   *\n   *\n   * ## Change Tracking\n   *\n   * During the execution of the CommandStack it will keep track of all\n   * elements that have been touched during the command's execution.\n   *\n   * At the end of the CommandStack execution it will notify interested\n   * components via an 'elements.changed' event with all the dirty\n   * elements.\n   *\n   * The event can be picked up by components that are interested in the fact\n   * that elements have been changed. One use case for this is updating\n   * their graphical representation after moving / resizing or deletion.\n   *\n   * @see CommandHandler\n   *\n   * @param {EventBus} eventBus\n   * @param {Injector} injector\n   */\n  function CommandStack(eventBus, injector) {\n\n    /**\n     * A map of all registered command handlers.\n     *\n     * @type {CommandHandlerMap}\n     */\n    this._handlerMap = {};\n\n    /**\n     * A stack containing all re/undoable actions on the diagram\n     *\n     * @type {CommandStackAction[]}\n     */\n    this._stack = [];\n\n    /**\n     * The current index on the stack\n     *\n     * @type {number}\n     */\n    this._stackIdx = -1;\n\n    /**\n     * Current active commandStack execution\n     *\n     * @type {CurrentExecution}\n     */\n    this._currentExecution = {\n      actions: [],\n      dirty: [],\n      trigger: null\n    };\n\n    /**\n     * @type {Injector}\n     */\n    this._injector = injector;\n\n    /**\n     * @type EventBus\n     */\n    this._eventBus = eventBus;\n\n    /**\n     * @type { number }\n     */\n    this._uid = 1;\n\n    eventBus.on([\n      'diagram.destroy',\n      'diagram.clear'\n    ], function() {\n      this.clear(false);\n    }, this);\n  }\n\n  CommandStack.$inject = [ 'eventBus', 'injector' ];\n\n\n  /**\n   * Execute a command.\n   *\n   * @param {string} command The command to execute.\n   * @param {CommandContext} context The context with which to execute the command.\n   */\n  CommandStack.prototype.execute = function(command, context) {\n    if (!command) {\n      throw new Error('command required');\n    }\n\n    this._currentExecution.trigger = 'execute';\n\n    const action = { command: command, context: context };\n\n    this._pushAction(action);\n    this._internalExecute(action);\n    this._popAction();\n  };\n\n\n  /**\n   * Check whether a command can be executed.\n   *\n   * Implementors may hook into the mechanism on two ways:\n   *\n   *   * in event listeners:\n   *\n   *     Users may prevent the execution via an event listener.\n   *     It must prevent the default action for `commandStack.(<command>.)canExecute` events.\n   *\n   *   * in command handlers:\n   *\n   *     If the method {@link CommandHandler#canExecute} is implemented in a handler\n   *     it will be called to figure out whether the execution is allowed.\n   *\n   * @param {string} command The command to execute.\n   * @param {CommandContext} context The context with which to execute the command.\n   *\n   * @return {boolean} Whether the command can be executed with the given context.\n   */\n  CommandStack.prototype.canExecute = function(command, context) {\n\n    const action = { command: command, context: context };\n\n    const handler = this._getHandler(command);\n\n    let result = this._fire(command, 'canExecute', action);\n\n    // handler#canExecute will only be called if no listener\n    // decided on a result already\n    if (result === undefined) {\n      if (!handler) {\n        return false;\n      }\n\n      if (handler.canExecute) {\n        result = handler.canExecute(context);\n      }\n    }\n\n    return result;\n  };\n\n\n  /**\n   * Clear the command stack, erasing all undo / redo history.\n   *\n   * @param {boolean} [emit=true] Whether to fire an event. Defaults to `true`.\n   */\n  CommandStack.prototype.clear = function(emit) {\n    this._stack.length = 0;\n    this._stackIdx = -1;\n\n    if (emit !== false) {\n      this._fire('changed', { trigger: 'clear' });\n    }\n  };\n\n\n  /**\n   * Undo last command(s)\n   */\n  CommandStack.prototype.undo = function() {\n    let action = this._getUndoAction(),\n        next;\n\n    if (action) {\n      this._currentExecution.trigger = 'undo';\n\n      this._pushAction(action);\n\n      while (action) {\n        this._internalUndo(action);\n        next = this._getUndoAction();\n\n        if (!next || next.id !== action.id) {\n          break;\n        }\n\n        action = next;\n      }\n\n      this._popAction();\n    }\n  };\n\n\n  /**\n   * Redo last command(s)\n   */\n  CommandStack.prototype.redo = function() {\n    let action = this._getRedoAction(),\n        next;\n\n    if (action) {\n      this._currentExecution.trigger = 'redo';\n\n      this._pushAction(action);\n\n      while (action) {\n        this._internalExecute(action, true);\n        next = this._getRedoAction();\n\n        if (!next || next.id !== action.id) {\n          break;\n        }\n\n        action = next;\n      }\n\n      this._popAction();\n    }\n  };\n\n\n  /**\n   * Register a handler instance with the command stack.\n   *\n   * @param {string} command Command to be executed.\n   * @param {CommandHandler} handler Handler to execute the command.\n   */\n  CommandStack.prototype.register = function(command, handler) {\n    this._setHandler(command, handler);\n  };\n\n\n  /**\n   * Register a handler type with the command stack  by instantiating it and\n   * injecting its dependencies.\n   *\n   * @param {string} command Command to be executed.\n   * @param {CommandHandlerConstructor} handlerCls Constructor to instantiate a {@link CommandHandler}.\n   */\n  CommandStack.prototype.registerHandler = function(command, handlerCls) {\n\n    if (!command || !handlerCls) {\n      throw new Error('command and handlerCls must be defined');\n    }\n\n    const handler = this._injector.instantiate(handlerCls);\n    this.register(command, handler);\n  };\n\n  /**\n   * @return {boolean}\n   */\n  CommandStack.prototype.canUndo = function() {\n    return !!this._getUndoAction();\n  };\n\n  /**\n   * @return {boolean}\n   */\n  CommandStack.prototype.canRedo = function() {\n    return !!this._getRedoAction();\n  };\n\n  // stack access  //////////////////////\n\n  CommandStack.prototype._getRedoAction = function() {\n    return this._stack[this._stackIdx + 1];\n  };\n\n\n  CommandStack.prototype._getUndoAction = function() {\n    return this._stack[this._stackIdx];\n  };\n\n\n  // internal functionality //////////////////////\n\n  CommandStack.prototype._internalUndo = function(action) {\n    const command = action.command,\n          context = action.context;\n\n    const handler = this._getHandler(command);\n\n    // guard against illegal nested command stack invocations\n    this._atomicDo(() => {\n      this._fire(command, 'revert', action);\n\n      if (handler.revert) {\n        this._markDirty(handler.revert(context));\n      }\n\n      this._revertedAction(action);\n\n      this._fire(command, 'reverted', action);\n    });\n  };\n\n\n  CommandStack.prototype._fire = function(command, qualifier, event) {\n    if (arguments.length < 3) {\n      event = qualifier;\n      qualifier = null;\n    }\n\n    const names = qualifier ? [ command + '.' + qualifier, qualifier ] : [ command ];\n    let result;\n\n    event = this._eventBus.createEvent(event);\n\n    for (const name of names) {\n      result = this._eventBus.fire('commandStack.' + name, event);\n\n      if (event.cancelBubble) {\n        break;\n      }\n    }\n\n    return result;\n  };\n\n  CommandStack.prototype._createId = function() {\n    return this._uid++;\n  };\n\n  CommandStack.prototype._atomicDo = function(fn) {\n\n    const execution = this._currentExecution;\n\n    execution.atomic = true;\n\n    try {\n      fn();\n    } finally {\n      execution.atomic = false;\n    }\n  };\n\n  CommandStack.prototype._internalExecute = function(action, redo) {\n    const command = action.command,\n          context = action.context;\n\n    const handler = this._getHandler(command);\n\n    if (!handler) {\n      throw new Error('no command handler registered for <' + command + '>');\n    }\n\n    this._pushAction(action);\n\n    if (!redo) {\n      this._fire(command, 'preExecute', action);\n\n      if (handler.preExecute) {\n        handler.preExecute(context);\n      }\n\n      this._fire(command, 'preExecuted', action);\n    }\n\n    // guard against illegal nested command stack invocations\n    this._atomicDo(() => {\n\n      this._fire(command, 'execute', action);\n\n      if (handler.execute) {\n\n        // actual execute + mark return results as dirty\n        this._markDirty(handler.execute(context));\n      }\n\n      // log to stack\n      this._executedAction(action, redo);\n\n      this._fire(command, 'executed', action);\n    });\n\n    if (!redo) {\n      this._fire(command, 'postExecute', action);\n\n      if (handler.postExecute) {\n        handler.postExecute(context);\n      }\n\n      this._fire(command, 'postExecuted', action);\n    }\n\n    this._popAction();\n  };\n\n\n  CommandStack.prototype._pushAction = function(action) {\n\n    const execution = this._currentExecution,\n          actions = execution.actions;\n\n    const baseAction = actions[0];\n\n    if (execution.atomic) {\n      throw new Error('illegal invocation in <execute> or <revert> phase (action: ' + action.command + ')');\n    }\n\n    if (!action.id) {\n      action.id = (baseAction && baseAction.id) || this._createId();\n    }\n\n    actions.push(action);\n  };\n\n\n  CommandStack.prototype._popAction = function() {\n    const execution = this._currentExecution,\n          trigger = execution.trigger,\n          actions = execution.actions,\n          dirty = execution.dirty;\n\n    actions.pop();\n\n    if (!actions.length) {\n      this._eventBus.fire('elements.changed', { elements: uniqueBy('id', dirty.reverse()) });\n\n      dirty.length = 0;\n\n      this._fire('changed', { trigger: trigger });\n\n      execution.trigger = null;\n    }\n  };\n\n\n  CommandStack.prototype._markDirty = function(elements) {\n    const execution = this._currentExecution;\n\n    if (!elements) {\n      return;\n    }\n\n    elements = isArray$3(elements) ? elements : [ elements ];\n\n    execution.dirty = execution.dirty.concat(elements);\n  };\n\n\n  CommandStack.prototype._executedAction = function(action, redo) {\n    const stackIdx = ++this._stackIdx;\n\n    if (!redo) {\n      this._stack.splice(stackIdx, this._stack.length, action);\n    }\n  };\n\n\n  CommandStack.prototype._revertedAction = function(action) {\n    this._stackIdx--;\n  };\n\n\n  CommandStack.prototype._getHandler = function(command) {\n    return this._handlerMap[command];\n  };\n\n  CommandStack.prototype._setHandler = function(command, handler) {\n    if (!command || !handler) {\n      throw new Error('command and handler required');\n    }\n\n    if (this._handlerMap[command]) {\n      throw new Error('overriding handler for command <' + command + '>');\n    }\n\n    this._handlerMap[command] = handler;\n  };\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var CommandModule = {\n    commandStack: [ 'type', CommandStack ]\n  };\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   *\n   * @typedef {import('../../util/Types').RectTRBL} RectTRBL\n   *\n   * @typedef { {\n   *   html: string | HTMLElement;\n   *   position: RectTRBL;\n   *   show?: {\n   *     minZoom?: number;\n   *     maxZoom?: number;\n   *   };\n   *   timeout?: number;\n   * } } Tooltip\n   */\n\n  // document wide unique tooltip ids\n  var ids = new IdGenerator('tt');\n\n\n  function createRoot(parentNode) {\n    var root = domify$1(\n      '<div class=\"djs-tooltip-container\" />'\n    );\n\n    assign(root, {\n      position: 'absolute',\n      width: '0',\n      height: '0'\n    });\n\n    parentNode.insertBefore(root, parentNode.firstChild);\n\n    return root;\n  }\n\n\n  function setPosition(el, x, y) {\n    assign(el, { left: x + 'px', top: y + 'px' });\n  }\n\n  function setVisible(el, visible) {\n    el.style.display = visible === false ? 'none' : '';\n  }\n\n\n  var tooltipClass = 'djs-tooltip',\n      tooltipSelector = '.' + tooltipClass;\n\n  /**\n   * A service that allows users to render tool tips on the diagram.\n   *\n   * The tooltip service will take care of updating the tooltip positioning\n   * during navigation + zooming.\n   *\n   * @example\n   *\n   * ```javascript\n   *\n   * // add a pink badge on the top left of the shape\n   * tooltips.add({\n   *   position: {\n   *     x: 50,\n   *     y: 100\n   *   },\n   *   html: '<div style=\"width: 10px; background: fuchsia; color: white;\">0</div>'\n   * });\n   *\n   * // or with optional life span\n   * tooltips.add({\n   *   position: {\n   *     top: -5,\n   *     left: -5\n   *   },\n   *   html: '<div style=\"width: 10px; background: fuchsia; color: white;\">0</div>',\n   *   ttl: 2000\n   * });\n   *\n   * // remove a tool tip\n   * var id = tooltips.add(...);\n   *\n   * tooltips.remove(id);\n   * ```\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   */\n  function Tooltips(eventBus, canvas) {\n\n    this._eventBus = eventBus;\n    this._canvas = canvas;\n\n    this._ids = ids;\n\n    this._tooltipDefaults = {\n      show: {\n        minZoom: 0.7,\n        maxZoom: 5.0\n      }\n    };\n\n    /**\n     * @type {Record<string, Tooltip>}\n     */\n    this._tooltips = {};\n\n    // root html element for all tooltips\n    this._tooltipRoot = createRoot(canvas.getContainer());\n\n\n    var self = this;\n\n    delegate.bind(this._tooltipRoot, tooltipSelector, 'mousedown', function(event) {\n      event.stopPropagation();\n    });\n\n    delegate.bind(this._tooltipRoot, tooltipSelector, 'mouseover', function(event) {\n      self.trigger('mouseover', event);\n    });\n\n    delegate.bind(this._tooltipRoot, tooltipSelector, 'mouseout', function(event) {\n      self.trigger('mouseout', event);\n    });\n\n    this._init();\n  }\n\n\n  Tooltips.$inject = [ 'eventBus', 'canvas' ];\n\n\n  /**\n   * Adds an HTML tooltip to the diagram.\n   *\n   * @param {Tooltip} tooltip\n   *\n   * @return {string} ID of the tooltip.\n   */\n  Tooltips.prototype.add = function(tooltip) {\n\n    if (!tooltip.position) {\n      throw new Error('must specifiy tooltip position');\n    }\n\n    if (!tooltip.html) {\n      throw new Error('must specifiy tooltip html');\n    }\n\n    var id = this._ids.next();\n\n    tooltip = assign$1({}, this._tooltipDefaults, tooltip, {\n      id: id\n    });\n\n    this._addTooltip(tooltip);\n\n    if (tooltip.timeout) {\n      this.setTimeout(tooltip);\n    }\n\n    return id;\n  };\n\n  /**\n   * @param {string} action\n   * @param {Event} event\n   */\n  Tooltips.prototype.trigger = function(action, event) {\n\n    var node = event.delegateTarget || event.target;\n\n    var tooltip = this.get(attr$1(node, 'data-tooltip-id'));\n\n    if (!tooltip) {\n      return;\n    }\n\n    if (action === 'mouseover' && tooltip.timeout) {\n      this.clearTimeout(tooltip);\n    }\n\n    if (action === 'mouseout' && tooltip.timeout) {\n\n      // cut timeout after mouse out\n      tooltip.timeout = 1000;\n\n      this.setTimeout(tooltip);\n    }\n  };\n\n  /**\n   * Get tooltip with given ID.\n   *\n   * @param {Tooltip|string} id\n   *\n   * @return {Tooltip|undefined}\n   */\n  Tooltips.prototype.get = function(id) {\n\n    if (typeof id !== 'string') {\n      id = id.id;\n    }\n\n    return this._tooltips[id];\n  };\n\n  /**\n   * @param {Tooltip} tooltip\n   */\n  Tooltips.prototype.clearTimeout = function(tooltip) {\n\n    tooltip = this.get(tooltip);\n\n    if (!tooltip) {\n      return;\n    }\n\n    var removeTimer = tooltip.removeTimer;\n\n    if (removeTimer) {\n      clearTimeout(removeTimer);\n      tooltip.removeTimer = null;\n    }\n  };\n\n  /**\n   * @param {Tooltip} tooltip\n   */\n  Tooltips.prototype.setTimeout = function(tooltip) {\n\n    tooltip = this.get(tooltip);\n\n    if (!tooltip) {\n      return;\n    }\n\n    this.clearTimeout(tooltip);\n\n    var self = this;\n\n    tooltip.removeTimer = setTimeout(function() {\n      self.remove(tooltip);\n    }, tooltip.timeout);\n  };\n\n  /**\n   * Remove tooltip with given ID.\n   *\n   * @param {string | Tooltip} id\n   */\n  Tooltips.prototype.remove = function(id) {\n\n    var tooltip = this.get(id);\n\n    if (tooltip) {\n      remove$2(tooltip.html);\n      remove$2(tooltip.htmlContainer);\n\n      delete tooltip.htmlContainer;\n\n      delete this._tooltips[tooltip.id];\n    }\n  };\n\n\n  Tooltips.prototype.show = function() {\n    setVisible(this._tooltipRoot);\n  };\n\n\n  Tooltips.prototype.hide = function() {\n    setVisible(this._tooltipRoot, false);\n  };\n\n\n  Tooltips.prototype._updateRoot = function(viewbox) {\n    var a = viewbox.scale || 1;\n    var d = viewbox.scale || 1;\n\n    var matrix = 'matrix(' + a + ',0,0,' + d + ',' + (-1 * viewbox.x * a) + ',' + (-1 * viewbox.y * d) + ')';\n\n    this._tooltipRoot.style.transform = matrix;\n    this._tooltipRoot.style['-ms-transform'] = matrix;\n  };\n\n\n  Tooltips.prototype._addTooltip = function(tooltip) {\n\n    var id = tooltip.id,\n        html = tooltip.html,\n        htmlContainer,\n        tooltipRoot = this._tooltipRoot;\n\n    // unwrap jquery (for those who need it)\n    if (html.get && html.constructor.prototype.jquery) {\n      html = html.get(0);\n    }\n\n    // create proper html elements from\n    // tooltip HTML strings\n    if (isString(html)) {\n      html = domify$1(html);\n    }\n\n    htmlContainer = domify$1('<div data-tooltip-id=\"' + id + '\" class=\"' + tooltipClass + '\">');\n    assign(htmlContainer, { position: 'absolute' });\n\n    htmlContainer.appendChild(html);\n\n    if (tooltip.type) {\n      classes$1(htmlContainer).add('djs-tooltip-' + tooltip.type);\n    }\n\n    if (tooltip.className) {\n      classes$1(htmlContainer).add(tooltip.className);\n    }\n\n    tooltip.htmlContainer = htmlContainer;\n\n    tooltipRoot.appendChild(htmlContainer);\n\n    this._tooltips[id] = tooltip;\n\n    this._updateTooltip(tooltip);\n  };\n\n\n  Tooltips.prototype._updateTooltip = function(tooltip) {\n\n    var position = tooltip.position,\n        htmlContainer = tooltip.htmlContainer;\n\n    // update overlay html based on tooltip x, y\n\n    setPosition(htmlContainer, position.x, position.y);\n  };\n\n\n  Tooltips.prototype._updateTooltipVisibilty = function(viewbox) {\n\n    forEach$1(this._tooltips, function(tooltip) {\n      var show = tooltip.show,\n          htmlContainer = tooltip.htmlContainer,\n          visible = true;\n\n      if (show) {\n        if (show.minZoom > viewbox.scale ||\n            show.maxZoom < viewbox.scale) {\n          visible = false;\n        }\n\n        setVisible(htmlContainer, visible);\n      }\n    });\n  };\n\n  Tooltips.prototype._init = function() {\n\n    var self = this;\n\n    // scroll/zoom integration\n\n    function updateViewbox(viewbox) {\n      self._updateRoot(viewbox);\n      self._updateTooltipVisibilty(viewbox);\n\n      self.show();\n    }\n\n    this._eventBus.on('canvas.viewbox.changing', function(event) {\n      self.hide();\n    });\n\n    this._eventBus.on('canvas.viewbox.changed', function(event) {\n      updateViewbox(event.viewbox);\n    });\n  };\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var TooltipsModule = {\n    __init__: [ 'tooltips' ],\n    tooltips: [ 'type', Tooltips ]\n  };\n\n  /**\n   * Remove from the beginning of a collection until it is empty.\n   *\n   * This is a null-safe operation that ensures elements\n   * are being removed from the given collection until the\n   * collection is empty.\n   *\n   * The implementation deals with the fact that a remove operation\n   * may touch, i.e. remove multiple elements in the collection\n   * at a time.\n   *\n   * @param {Object[]} [collection]\n   * @param {(element: Object) => void} removeFn\n   *\n   * @return {Object[]} the cleared collection\n   */\n  function saveClear(collection, removeFn) {\n\n    if (typeof removeFn !== 'function') {\n      throw new Error('removeFn iterator must be a function');\n    }\n\n    if (!collection) {\n      return;\n    }\n\n    var e;\n\n    while ((e = collection[0])) {\n      removeFn(e);\n    }\n\n    return collection;\n  }\n\n  var LOW_PRIORITY$4 = 250,\n      HIGH_PRIORITY$4 = 1400;\n\n  /**\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef {import('didi').Injector} Injector\n   *\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   */\n\n  /**\n   * A handler that makes sure labels are properly moved with\n   * their label targets.\n   *\n   * @param {Injector} injector\n   * @param {EventBus} eventBus\n   * @param {Modeling} modeling\n   */\n  function LabelSupport(injector, eventBus, modeling) {\n\n    CommandInterceptor.call(this, eventBus);\n\n    var movePreview = injector.get('movePreview', false);\n\n    // remove labels from the collection that are being\n    // moved with other elements anyway\n    eventBus.on('shape.move.start', HIGH_PRIORITY$4, function(e) {\n\n      var context = e.context,\n          shapes = context.shapes,\n          validatedShapes = context.validatedShapes;\n\n      context.shapes = removeLabels(shapes);\n      context.validatedShapes = removeLabels(validatedShapes);\n    });\n\n    // add labels to visual's group\n    movePreview && eventBus.on('shape.move.start', LOW_PRIORITY$4, function(e) {\n\n      var context = e.context,\n          shapes = context.shapes;\n\n      var labels = [];\n\n      forEach$1(shapes, function(element) {\n\n        forEach$1(element.labels, function(label) {\n\n          if (!label.hidden && context.shapes.indexOf(label) === -1) {\n            labels.push(label);\n          }\n\n          if (element.labelTarget) {\n            labels.push(element);\n          }\n        });\n      });\n\n      forEach$1(labels, function(label) {\n        movePreview.makeDraggable(context, label, true);\n      });\n\n    });\n\n    // add all labels to move closure\n    this.preExecuted('elements.move', HIGH_PRIORITY$4, function(e) {\n      var context = e.context,\n          closure = context.closure,\n          enclosedElements = closure.enclosedElements;\n\n      var enclosedLabels = [];\n\n      // find labels that are not part of\n      // move closure yet and add them\n      forEach$1(enclosedElements, function(element) {\n        forEach$1(element.labels, function(label) {\n\n          if (!enclosedElements[label.id]) {\n            enclosedLabels.push(label);\n          }\n        });\n      });\n\n      closure.addAll(enclosedLabels);\n    });\n\n\n    this.preExecute([\n      'connection.delete',\n      'shape.delete'\n    ], function(e) {\n\n      var context = e.context,\n          element = context.connection || context.shape;\n\n      saveClear(element.labels, function(label) {\n        modeling.removeShape(label, { nested: true });\n      });\n    });\n\n\n    this.execute('shape.delete', function(e) {\n\n      var context = e.context,\n          shape = context.shape,\n          labelTarget = shape.labelTarget;\n\n      // unset labelTarget\n      if (labelTarget) {\n        context.labelTargetIndex = indexOf(labelTarget.labels, shape);\n        context.labelTarget = labelTarget;\n\n        shape.labelTarget = null;\n      }\n    });\n\n    this.revert('shape.delete', function(e) {\n\n      var context = e.context,\n          shape = context.shape,\n          labelTarget = context.labelTarget,\n          labelTargetIndex = context.labelTargetIndex;\n\n      // restore labelTarget\n      if (labelTarget) {\n        add(labelTarget.labels, shape, labelTargetIndex);\n\n        shape.labelTarget = labelTarget;\n      }\n    });\n\n  }\n\n  e$3(LabelSupport, CommandInterceptor);\n\n  LabelSupport.$inject = [\n    'injector',\n    'eventBus',\n    'modeling'\n  ];\n\n\n  /**\n   * Return a filtered list of elements that do not\n   * contain attached elements with hosts being part\n   * of the selection.\n   *\n   * @param {Element[]} elements\n   *\n   * @return {Element[]} filtered\n   */\n  function removeLabels(elements) {\n\n    return filter(elements, function(element) {\n\n      // filter out labels that are move together\n      // with their label targets\n      return elements.indexOf(element.labelTarget) === -1;\n    });\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var LabelSupportModule = {\n    __init__: [ 'labelSupport' ],\n    labelSupport: [ 'type', LabelSupport ]\n  };\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../rules/Rules').default} Rules\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   */\n\n  var LOW_PRIORITY$3 = 251,\n      HIGH_PRIORITY$3 = 1401;\n\n  var MARKER_ATTACH$1 = 'attach-ok';\n\n\n  /**\n   * Adds the notion of attached elements to the modeler.\n   *\n   * Optionally depends on `diagram-js/lib/features/move` to render\n   * the attached elements during move preview.\n   *\n   * Optionally depends on `diagram-js/lib/features/label-support`\n   * to render attached labels during move preview.\n   *\n   * @param {Injector} injector\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {Rules} rules\n   * @param {Modeling} modeling\n   */\n  function AttachSupport(injector, eventBus, canvas, rules, modeling) {\n\n    CommandInterceptor.call(this, eventBus);\n\n    var movePreview = injector.get('movePreview', false);\n\n\n    // remove all the attached elements from the shapes to be validated\n    // add all the attached shapes to the overall list of moved shapes\n    eventBus.on('shape.move.start', HIGH_PRIORITY$3, function(e) {\n\n      var context = e.context,\n          shapes = context.shapes,\n          validatedShapes = context.validatedShapes;\n\n      context.shapes = addAttached(shapes);\n\n      context.validatedShapes = removeAttached(validatedShapes);\n    });\n\n    // add attachers to the visual's group\n    movePreview && eventBus.on('shape.move.start', LOW_PRIORITY$3, function(e) {\n\n      var context = e.context,\n          shapes = context.shapes,\n          attachers = getAttachers(shapes);\n\n      forEach$1(attachers, function(attacher) {\n        movePreview.makeDraggable(context, attacher, true);\n\n        forEach$1(attacher.labels, function(label) {\n          movePreview.makeDraggable(context, label, true);\n        });\n      });\n    });\n\n    // add attach-ok marker to current host\n    movePreview && eventBus.on('shape.move.start', function(event) {\n      var context = event.context,\n          shapes = context.shapes;\n\n      if (shapes.length !== 1) {\n        return;\n      }\n\n      var shape = shapes[0];\n\n      var host = shape.host;\n\n      if (host) {\n        canvas.addMarker(host, MARKER_ATTACH$1);\n\n        eventBus.once([\n          'shape.move.out',\n          'shape.move.cleanup'\n        ], function() {\n          canvas.removeMarker(host, MARKER_ATTACH$1);\n        });\n      }\n    });\n\n    // add all attachers to move closure\n    this.preExecuted('elements.move', HIGH_PRIORITY$3, function(e) {\n      var context = e.context,\n          closure = context.closure,\n          shapes = context.shapes,\n          attachers = getAttachers(shapes);\n\n      forEach$1(attachers, function(attacher) {\n        closure.add(attacher, closure.topLevel[attacher.host.id]);\n      });\n    });\n\n    // perform the attaching after shapes are done moving\n    this.postExecuted('elements.move', function(e) {\n\n      var context = e.context,\n          shapes = context.shapes,\n          newHost = context.newHost,\n          attachers;\n\n      // only single elements can be attached\n      // multiply elements can be detached\n      if (newHost && shapes.length !== 1) {\n        return;\n      }\n\n      if (newHost) {\n        attachers = shapes;\n      } else {\n\n        // find attachers moved without host\n        attachers = filter(shapes, function(shape) {\n          var host = shape.host;\n\n          return isAttacher(shape) && !includes$2(shapes, host);\n        });\n      }\n\n      forEach$1(attachers, function(attacher) {\n        modeling.updateAttachment(attacher, newHost);\n      });\n    });\n\n    // ensure invalid attachment connections are removed\n    this.postExecuted('elements.move', function(e) {\n\n      var shapes = e.context.shapes;\n\n      forEach$1(shapes, function(shape) {\n\n        forEach$1(shape.attachers, function(attacher) {\n\n          // remove invalid outgoing connections\n          forEach$1(attacher.outgoing.slice(), function(connection) {\n            var allowed = rules.allowed('connection.reconnect', {\n              connection: connection,\n              source: connection.source,\n              target: connection.target\n            });\n\n            if (!allowed) {\n              modeling.removeConnection(connection);\n            }\n          });\n\n          // remove invalid incoming connections\n          forEach$1(attacher.incoming.slice(), function(connection) {\n            var allowed = rules.allowed('connection.reconnect', {\n              connection: connection,\n              source: connection.source,\n              target: connection.target\n            });\n\n            if (!allowed) {\n              modeling.removeConnection(connection);\n            }\n          });\n        });\n      });\n    });\n\n    this.postExecute('shape.create', function(e) {\n      var context = e.context,\n          shape = context.shape,\n          host = context.host;\n\n      if (host) {\n        modeling.updateAttachment(shape, host);\n      }\n    });\n\n    // update attachments if the host is replaced\n    this.postExecute('shape.replace', function(e) {\n\n      var context = e.context,\n          oldShape = context.oldShape,\n          newShape = context.newShape;\n\n      // move the attachers to the new host\n      saveClear(oldShape.attachers, function(attacher) {\n        var allowed = rules.allowed('elements.move', {\n          target: newShape,\n          shapes: [ attacher ]\n        });\n\n        if (allowed === 'attach') {\n          modeling.updateAttachment(attacher, newShape);\n        } else {\n          modeling.removeShape(attacher);\n        }\n      });\n\n      // move attachers if new host has different size\n      if (newShape.attachers.length) {\n\n        forEach$1(newShape.attachers, function(attacher) {\n          var delta = getNewAttachShapeDelta(attacher, oldShape, newShape);\n          modeling.moveShape(attacher, delta, attacher.parent);\n        });\n      }\n\n    });\n\n    // move shape on host resize\n    this.postExecute('shape.resize', function(event) {\n      var context = event.context,\n          shape = context.shape,\n          oldBounds = context.oldBounds,\n          newBounds = context.newBounds,\n          attachers = shape.attachers,\n          hints = context.hints || {};\n\n      if (hints.attachSupport === false) {\n        return;\n      }\n\n      forEach$1(attachers, function(attacher) {\n        var delta = getNewAttachShapeDelta(attacher, oldBounds, newBounds);\n\n        modeling.moveShape(attacher, delta, attacher.parent);\n\n        forEach$1(attacher.labels, function(label) {\n          modeling.moveShape(label, delta, label.parent);\n        });\n      });\n    });\n\n    // remove attachments\n    this.preExecute('shape.delete', function(event) {\n\n      var shape = event.context.shape;\n\n      saveClear(shape.attachers, function(attacher) {\n        modeling.removeShape(attacher);\n      });\n\n      if (shape.host) {\n        modeling.updateAttachment(shape, null);\n      }\n    });\n  }\n\n  e$3(AttachSupport, CommandInterceptor);\n\n  AttachSupport.$inject = [\n    'injector',\n    'eventBus',\n    'canvas',\n    'rules',\n    'modeling'\n  ];\n\n\n  /**\n   * Return attachers of the given shapes\n   *\n   * @param {Element[]} shapes\n   * @return {Element[]}\n   */\n  function getAttachers(shapes) {\n    return flatten(map$1(shapes, function(s) {\n      return s.attachers || [];\n    }));\n  }\n\n  /**\n   * Return a combined list of elements and\n   * attachers.\n   *\n   * @param {Element[]} elements\n   * @return {Element[]} filtered\n   */\n  function addAttached(elements) {\n    var attachers = getAttachers(elements);\n\n    return unionBy('id', elements, attachers);\n  }\n\n  /**\n   * Return a filtered list of elements that do not\n   * contain attached elements with hosts being part\n   * of the selection.\n   *\n   * @param {Element[]} elements\n   *\n   * @return {Element[]} filtered\n   */\n  function removeAttached(elements) {\n\n    var ids = groupBy(elements, 'id');\n\n    return filter(elements, function(element) {\n      while (element) {\n\n        // host in selection\n        if (element.host && ids[element.host.id]) {\n          return false;\n        }\n\n        element = element.parent;\n      }\n\n      return true;\n    });\n  }\n\n  function isAttacher(shape) {\n    return !!shape.host;\n  }\n\n  function includes$2(array, item) {\n    return array.indexOf(item) !== -1;\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var AttachSupportModule = {\n    __depends__: [\n      RulesModule$1\n    ],\n    __init__: [ 'attachSupport' ],\n    attachSupport: [ 'type', AttachSupport ]\n  };\n\n  /**\n   * @typedef {import('../../model/Types').Moddle} Moddle\n   * @typedef {import('../../model/Types').ModdleElement} ModdleElement\n   *\n   * @typedef {import('diagram-js/lib/util/Types').Point} Point\n   */\n\n  /**\n   * A factory for BPMN elements.\n   *\n   * @param {Moddle} moddle\n   */\n  function BpmnFactory(moddle) {\n    this._model = moddle;\n  }\n\n  BpmnFactory.$inject = [ 'moddle' ];\n\n  /**\n   * @param {ModdleElement} element\n   *\n   * @return {boolean}\n   */\n  BpmnFactory.prototype._needsId = function(element) {\n    return isAny(element, [\n      'bpmn:RootElement',\n      'bpmn:FlowElement',\n      'bpmn:MessageFlow',\n      'bpmn:DataAssociation',\n      'bpmn:Artifact',\n      'bpmn:Participant',\n      'bpmn:Lane',\n      'bpmn:LaneSet',\n      'bpmn:Process',\n      'bpmn:Collaboration',\n      'bpmndi:BPMNShape',\n      'bpmndi:BPMNEdge',\n      'bpmndi:BPMNDiagram',\n      'bpmndi:BPMNPlane',\n      'bpmn:Property',\n      'bpmn:CategoryValue'\n    ]);\n  };\n\n  /**\n   * @param {ModdleElement} element\n   */\n  BpmnFactory.prototype._ensureId = function(element) {\n    if (element.id) {\n      this._model.ids.claim(element.id, element);\n      return;\n    }\n\n    // generate semantic ids for elements\n    // bpmn:SequenceFlow -> SequenceFlow_ID\n    var prefix;\n\n    if (is$1(element, 'bpmn:Activity')) {\n      prefix = 'Activity';\n    } else if (is$1(element, 'bpmn:Event')) {\n      prefix = 'Event';\n    } else if (is$1(element, 'bpmn:Gateway')) {\n      prefix = 'Gateway';\n    } else if (isAny(element, [ 'bpmn:SequenceFlow', 'bpmn:MessageFlow' ])) {\n      prefix = 'Flow';\n    } else {\n      prefix = (element.$type || '').replace(/^[^:]*:/g, '');\n    }\n\n    prefix += '_';\n\n    if (!element.id && this._needsId(element)) {\n      element.id = this._model.ids.nextPrefixed(prefix, element);\n    }\n  };\n\n  /**\n   * Create BPMN element.\n   *\n   * @param {string} type\n   * @param {Object} [attrs]\n   *\n   * @return {ModdleElement}\n   */\n  BpmnFactory.prototype.create = function(type, attrs) {\n    var element = this._model.create(type, attrs || {});\n\n    this._ensureId(element);\n\n    return element;\n  };\n\n  /**\n   * @return {ModdleElement}\n   */\n  BpmnFactory.prototype.createDiLabel = function() {\n    return this.create('bpmndi:BPMNLabel', {\n      bounds: this.createDiBounds()\n    });\n  };\n\n  /**\n   * @param {ModdleElement} semantic\n   * @param {Object} [attrs]\n   * @return {ModdleElement}\n   */\n  BpmnFactory.prototype.createDiShape = function(semantic, attrs) {\n    return this.create('bpmndi:BPMNShape', assign$1({\n      bpmnElement: semantic,\n      bounds: this.createDiBounds()\n    }, attrs));\n  };\n\n  /**\n   * @return {ModdleElement}\n   */\n  BpmnFactory.prototype.createDiBounds = function(bounds) {\n    return this.create('dc:Bounds', bounds);\n  };\n\n  /**\n   * @param {Point[]} waypoints\n   *\n   * @return {ModdleElement[]}\n   */\n  BpmnFactory.prototype.createDiWaypoints = function(waypoints) {\n    var self = this;\n\n    return map$1(waypoints, function(pos) {\n      return self.createDiWaypoint(pos);\n    });\n  };\n\n  /**\n   * @param {Point} point\n   *\n   * @return {ModdleElement}\n   */\n  BpmnFactory.prototype.createDiWaypoint = function(point) {\n    return this.create('dc:Point', pick(point, [ 'x', 'y' ]));\n  };\n\n  /**\n   * @param {ModdleElement} semantic\n   * @param {Object} [attrs]\n   *\n   * @return {ModdleElement}\n   */\n  BpmnFactory.prototype.createDiEdge = function(semantic, attrs) {\n    return this.create('bpmndi:BPMNEdge', assign$1({\n      bpmnElement: semantic,\n      waypoint: this.createDiWaypoints([])\n    }, attrs));\n  };\n\n  /**\n   * @param {ModdleElement} semantic\n   * @param {Object} [attrs]\n   *\n   * @return {ModdleElement}\n   */\n  BpmnFactory.prototype.createDiPlane = function(semantic, attrs) {\n    return this.create('bpmndi:BPMNPlane', assign$1({\n      bpmnElement: semantic\n    }, attrs));\n  };\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('./BpmnFactory').default} BpmnFactory\n   * @typedef {import('diagram-js/lib/layout/CroppingConnectionDocking').default} CroppingConnectionDocking\n   * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n   *\n   * @typedef {import('../../model/Types').Connection} Connection\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Shape} Shape\n   * @typedef {import('../../model/Types').Parent} Parent\n   * @typedef {import('../../model/Types').ModdleElement} ModdleElement\n   */\n\n  /**\n   * A handler responsible for updating the underlying BPMN 2.0 XML & DI\n   * once changes on the diagram happen.\n   *\n   * @param {EventBus} eventBus\n   * @param {BpmnFactory} bpmnFactory\n   * @param {CroppingConnectionDocking} connectionDocking\n   * @param {Translate} translate\n   */\n  function BpmnUpdater(\n      eventBus,\n      bpmnFactory,\n      connectionDocking,\n      translate\n  ) {\n\n    CommandInterceptor.call(this, eventBus);\n\n    this._bpmnFactory = bpmnFactory;\n    this._translate = translate;\n\n    var self = this;\n\n\n\n    // connection cropping //////////////////////\n\n    // crop connection ends during create/update\n    function cropConnection(e) {\n      var context = e.context,\n          hints = context.hints || {},\n          connection;\n\n      if (!context.cropped && hints.createElementsBehavior !== false) {\n        connection = context.connection;\n        connection.waypoints = connectionDocking.getCroppedWaypoints(connection);\n        context.cropped = true;\n      }\n    }\n\n    this.executed([\n      'connection.layout',\n      'connection.create'\n    ], cropConnection);\n\n    this.reverted([ 'connection.layout' ], function(e) {\n      delete e.context.cropped;\n    });\n\n\n\n    // BPMN + DI update //////////////////////\n\n\n    // update parent\n    function updateParent(e) {\n      var context = e.context;\n\n      self.updateParent(context.shape || context.connection, context.oldParent);\n    }\n\n    function reverseUpdateParent(e) {\n      var context = e.context;\n\n      var element = context.shape || context.connection,\n\n          // oldParent is the (old) new parent, because we are undoing\n          oldParent = context.parent || context.newParent;\n\n      self.updateParent(element, oldParent);\n    }\n\n    this.executed([\n      'shape.move',\n      'shape.create',\n      'shape.delete',\n      'connection.create',\n      'connection.move',\n      'connection.delete'\n    ], ifBpmn(updateParent));\n\n    this.reverted([\n      'shape.move',\n      'shape.create',\n      'shape.delete',\n      'connection.create',\n      'connection.move',\n      'connection.delete'\n    ], ifBpmn(reverseUpdateParent));\n\n    /*\n     * ## Updating Parent\n     *\n     * When morphing a Process into a Collaboration or vice-versa,\n     * make sure that both the *semantic* and *di* parent of each element\n     * is updated.\n     *\n     */\n    function updateRoot(event) {\n      var context = event.context,\n          oldRoot = context.oldRoot,\n          children = oldRoot.children;\n\n      forEach$1(children, function(child) {\n        if (is$1(child, 'bpmn:BaseElement')) {\n          self.updateParent(child);\n        }\n      });\n    }\n\n    this.executed([ 'canvas.updateRoot' ], updateRoot);\n    this.reverted([ 'canvas.updateRoot' ], updateRoot);\n\n\n    // update bounds\n    function updateBounds(e) {\n      var shape = e.context.shape;\n\n      if (!is$1(shape, 'bpmn:BaseElement')) {\n        return;\n      }\n\n      self.updateBounds(shape);\n    }\n\n    this.executed([ 'shape.move', 'shape.create', 'shape.resize' ], ifBpmn(function(event) {\n\n      // exclude labels because they're handled separately during shape.changed\n      if (event.context.shape.type === 'label') {\n        return;\n      }\n\n      updateBounds(event);\n    }));\n\n    this.reverted([ 'shape.move', 'shape.create', 'shape.resize' ], ifBpmn(function(event) {\n\n      // exclude labels because they're handled separately during shape.changed\n      if (event.context.shape.type === 'label') {\n        return;\n      }\n\n      updateBounds(event);\n    }));\n\n    // Handle labels separately. This is necessary, because the label bounds have to be updated\n    // every time its shape changes, not only on move, create and resize.\n    eventBus.on('shape.changed', function(event) {\n      if (event.element.type === 'label') {\n        updateBounds({ context: { shape: event.element } });\n      }\n    });\n\n    // attach / detach connection\n    function updateConnection(e) {\n      self.updateConnection(e.context);\n    }\n\n    this.executed([\n      'connection.create',\n      'connection.move',\n      'connection.delete',\n      'connection.reconnect'\n    ], ifBpmn(updateConnection));\n\n    this.reverted([\n      'connection.create',\n      'connection.move',\n      'connection.delete',\n      'connection.reconnect'\n    ], ifBpmn(updateConnection));\n\n\n    // update waypoints\n    function updateConnectionWaypoints(e) {\n      self.updateConnectionWaypoints(e.context.connection);\n    }\n\n    this.executed([\n      'connection.layout',\n      'connection.move',\n      'connection.updateWaypoints',\n    ], ifBpmn(updateConnectionWaypoints));\n\n    this.reverted([\n      'connection.layout',\n      'connection.move',\n      'connection.updateWaypoints',\n    ], ifBpmn(updateConnectionWaypoints));\n\n    // update conditional/default flows\n    this.executed('connection.reconnect', ifBpmn(function(event) {\n      var context = event.context,\n          connection = context.connection,\n          oldSource = context.oldSource,\n          newSource = context.newSource,\n          connectionBo = getBusinessObject(connection),\n          oldSourceBo = getBusinessObject(oldSource),\n          newSourceBo = getBusinessObject(newSource);\n\n      // remove condition from connection on reconnect to new source\n      // if new source can NOT have condional sequence flow\n      if (connectionBo.conditionExpression && !isAny(newSourceBo, [\n        'bpmn:Activity',\n        'bpmn:ExclusiveGateway',\n        'bpmn:InclusiveGateway'\n      ])) {\n        context.oldConditionExpression = connectionBo.conditionExpression;\n\n        delete connectionBo.conditionExpression;\n      }\n\n      // remove default from old source flow on reconnect to new source\n      // if source changed\n      if (oldSource !== newSource && oldSourceBo.default === connectionBo) {\n        context.oldDefault = oldSourceBo.default;\n\n        delete oldSourceBo.default;\n      }\n    }));\n\n    this.reverted('connection.reconnect', ifBpmn(function(event) {\n      var context = event.context,\n          connection = context.connection,\n          oldSource = context.oldSource,\n          newSource = context.newSource,\n          connectionBo = getBusinessObject(connection),\n          oldSourceBo = getBusinessObject(oldSource),\n          newSourceBo = getBusinessObject(newSource);\n\n      // add condition to connection on revert reconnect to new source\n      if (context.oldConditionExpression) {\n        connectionBo.conditionExpression = context.oldConditionExpression;\n      }\n\n      // add default to old source on revert reconnect to new source\n      if (context.oldDefault) {\n        oldSourceBo.default = context.oldDefault;\n\n        delete newSourceBo.default;\n      }\n    }));\n\n    // update attachments\n    function updateAttachment(e) {\n      self.updateAttachment(e.context);\n    }\n\n    this.executed([ 'element.updateAttachment' ], ifBpmn(updateAttachment));\n    this.reverted([ 'element.updateAttachment' ], ifBpmn(updateAttachment));\n\n\n    // update BPMNLabel\n    this.executed('element.updateLabel', ifBpmn(updateBPMNLabel));\n    this.reverted('element.updateLabel', ifBpmn(updateBPMNLabel));\n\n    function updateBPMNLabel(event) {\n      const { element } = event.context,\n            label = getLabel(element);\n      const di = getDi(element),\n            diLabel = di && di.get('label');\n\n      if (isLabelExternal(element)) {\n        return;\n      }\n\n      if (label && !diLabel) {\n        di.set('label', bpmnFactory.create('bpmndi:BPMNLabel'));\n      } else if (!label && diLabel) {\n        di.set('label', undefined);\n      }\n    }\n  }\n\n  e$3(BpmnUpdater, CommandInterceptor);\n\n  BpmnUpdater.$inject = [\n    'eventBus',\n    'bpmnFactory',\n    'connectionDocking',\n    'translate'\n  ];\n\n\n  // implementation //////////////////////\n\n  /**\n   * @param { {\n   *   shape: Shape;\n   *   host: Shape;\n   * } } context\n   */\n  BpmnUpdater.prototype.updateAttachment = function(context) {\n\n    var shape = context.shape,\n        businessObject = shape.businessObject,\n        host = shape.host;\n\n    businessObject.attachedToRef = host && host.businessObject;\n  };\n\n  /**\n   * @param {Element} element\n   * @param {Parent} oldParent\n   */\n  BpmnUpdater.prototype.updateParent = function(element, oldParent) {\n\n    // do not update BPMN 2.0 label parent\n    if (isLabel(element)) {\n      return;\n    }\n\n    // data stores in collaborations are handled separately by DataStoreBehavior\n    if (is$1(element, 'bpmn:DataStoreReference') &&\n        element.parent &&\n        is$1(element.parent, 'bpmn:Collaboration')) {\n      return;\n    }\n\n    var parentShape = element.parent;\n\n    var businessObject = element.businessObject,\n        di = getDi(element),\n        parentBusinessObject = parentShape && parentShape.businessObject,\n        parentDi = getDi(parentShape);\n\n    if (is$1(element, 'bpmn:FlowNode')) {\n      this.updateFlowNodeRefs(businessObject, parentBusinessObject, oldParent && oldParent.businessObject);\n    }\n\n    if (is$1(element, 'bpmn:DataOutputAssociation')) {\n      if (element.source) {\n        parentBusinessObject = element.source.businessObject;\n      } else {\n        parentBusinessObject = null;\n      }\n    }\n\n    if (is$1(element, 'bpmn:DataInputAssociation')) {\n      if (element.target) {\n        parentBusinessObject = element.target.businessObject;\n      } else {\n        parentBusinessObject = null;\n      }\n    }\n\n    this.updateSemanticParent(businessObject, parentBusinessObject);\n\n    if (is$1(element, 'bpmn:DataObjectReference') && businessObject.dataObjectRef) {\n      this.updateSemanticParent(businessObject.dataObjectRef, parentBusinessObject);\n    }\n\n    this.updateDiParent(di, parentDi);\n  };\n\n  /**\n   * @param {Shape} shape\n   */\n  BpmnUpdater.prototype.updateBounds = function(shape) {\n\n    var di = getDi(shape),\n        embeddedLabelBounds = getEmbeddedLabelBounds(shape);\n\n    // update embedded label bounds if possible\n    if (embeddedLabelBounds) {\n      var embeddedLabelBoundsDelta = delta(embeddedLabelBounds, di.get('bounds'));\n\n      assign$1(embeddedLabelBounds, {\n        x: shape.x + embeddedLabelBoundsDelta.x,\n        y: shape.y + embeddedLabelBoundsDelta.y\n      });\n    }\n\n    var target = isLabel(shape) ? this._getLabel(di) : di;\n\n    var bounds = target.bounds;\n\n    if (!bounds) {\n      bounds = this._bpmnFactory.createDiBounds();\n      target.set('bounds', bounds);\n    }\n\n    assign$1(bounds, {\n      x: shape.x,\n      y: shape.y,\n      width: shape.width,\n      height: shape.height\n    });\n  };\n\n  /**\n   * @param {ModdleElement} businessObject\n   * @param {ModdleElement} newContainment\n   * @param {ModdleElement} oldContainment\n   */\n  BpmnUpdater.prototype.updateFlowNodeRefs = function(businessObject, newContainment, oldContainment) {\n\n    if (oldContainment === newContainment) {\n      return;\n    }\n\n    var oldRefs, newRefs;\n\n    if (is$1 (oldContainment, 'bpmn:Lane')) {\n      oldRefs = oldContainment.get('flowNodeRef');\n      remove(oldRefs, businessObject);\n    }\n\n    if (is$1(newContainment, 'bpmn:Lane')) {\n      newRefs = newContainment.get('flowNodeRef');\n      add(newRefs, businessObject);\n    }\n  };\n\n  /**\n   * @param {Connection} connection\n   * @param {Element} newSource\n   * @param {Element} newTarget\n   */\n  BpmnUpdater.prototype.updateDiConnection = function(connection, newSource, newTarget) {\n    var connectionDi = getDi(connection),\n        newSourceDi = getDi(newSource),\n        newTargetDi = getDi(newTarget);\n\n    if (connectionDi.sourceElement && connectionDi.sourceElement.bpmnElement !== getBusinessObject(newSource)) {\n      connectionDi.sourceElement = newSource && newSourceDi;\n    }\n\n    if (connectionDi.targetElement && connectionDi.targetElement.bpmnElement !== getBusinessObject(newTarget)) {\n      connectionDi.targetElement = newTarget && newTargetDi;\n    }\n\n  };\n\n  /**\n   * @param {ModdleElement} di\n   * @param {ModdleElement} parentDi\n   */\n  BpmnUpdater.prototype.updateDiParent = function(di, parentDi) {\n\n    if (parentDi && !is$1(parentDi, 'bpmndi:BPMNPlane')) {\n      parentDi = parentDi.$parent;\n    }\n\n    if (di.$parent === parentDi) {\n      return;\n    }\n\n    var planeElements = (parentDi || di.$parent).get('planeElement');\n\n    if (parentDi) {\n      planeElements.push(di);\n      di.$parent = parentDi;\n    } else {\n      remove(planeElements, di);\n      di.$parent = null;\n    }\n  };\n\n  /**\n   * @param {ModdleElement} element\n   *\n   * @return {ModdleElement}\n   */\n  function getDefinitions(element) {\n    while (element && !is$1(element, 'bpmn:Definitions')) {\n      element = element.$parent;\n    }\n\n    return element;\n  }\n\n  /**\n   * @param {ModdleElement} container\n   *\n   * @return {ModdleElement}\n   */\n  BpmnUpdater.prototype.getLaneSet = function(container) {\n\n    var laneSet, laneSets;\n\n    // bpmn:Lane\n    if (is$1(container, 'bpmn:Lane')) {\n      laneSet = container.childLaneSet;\n\n      if (!laneSet) {\n        laneSet = this._bpmnFactory.create('bpmn:LaneSet');\n        container.childLaneSet = laneSet;\n        laneSet.$parent = container;\n      }\n\n      return laneSet;\n    }\n\n    // bpmn:Participant\n    if (is$1(container, 'bpmn:Participant')) {\n      container = container.processRef;\n    }\n\n    // bpmn:FlowElementsContainer\n    laneSets = container.get('laneSets');\n    laneSet = laneSets[0];\n\n    if (!laneSet) {\n      laneSet = this._bpmnFactory.create('bpmn:LaneSet');\n      laneSet.$parent = container;\n      laneSets.push(laneSet);\n    }\n\n    return laneSet;\n  };\n\n  /**\n   * @param {ModdleElement} businessObject\n   * @param {ModdleElement} newParent\n   * @param {ModdleElement} visualParent\n   */\n  BpmnUpdater.prototype.updateSemanticParent = function(businessObject, newParent, visualParent) {\n\n    var containment,\n        translate = this._translate;\n\n    if (businessObject.$parent === newParent) {\n      return;\n    }\n\n    if (is$1(businessObject, 'bpmn:DataInput') || is$1(businessObject, 'bpmn:DataOutput')) {\n\n      if (is$1(newParent, 'bpmn:Participant') && 'processRef' in newParent) {\n        newParent = newParent.processRef;\n      }\n\n      // already in correct ioSpecification\n      if ('ioSpecification' in newParent && newParent.ioSpecification === businessObject.$parent) {\n        return;\n      }\n    }\n\n    if (is$1(businessObject, 'bpmn:Lane')) {\n\n      if (newParent) {\n        newParent = this.getLaneSet(newParent);\n      }\n\n      containment = 'lanes';\n    } else\n\n    if (is$1(businessObject, 'bpmn:FlowElement')) {\n\n      if (newParent) {\n\n        if (is$1(newParent, 'bpmn:Participant')) {\n          newParent = newParent.processRef;\n        } else\n\n        if (is$1(newParent, 'bpmn:Lane')) {\n          do {\n\n            // unwrap Lane -> LaneSet -> (Lane | FlowElementsContainer)\n            newParent = newParent.$parent.$parent;\n          } while (is$1(newParent, 'bpmn:Lane'));\n\n        }\n      }\n\n      containment = 'flowElements';\n\n    } else\n\n    if (is$1(businessObject, 'bpmn:Artifact')) {\n\n      while (newParent &&\n             !is$1(newParent, 'bpmn:Process') &&\n             !is$1(newParent, 'bpmn:SubProcess') &&\n             !is$1(newParent, 'bpmn:Collaboration')) {\n\n        if (is$1(newParent, 'bpmn:Participant')) {\n          newParent = newParent.processRef;\n          break;\n        } else {\n          newParent = newParent.$parent;\n        }\n      }\n\n      containment = 'artifacts';\n    } else\n\n    if (is$1(businessObject, 'bpmn:MessageFlow')) {\n      containment = 'messageFlows';\n\n    } else\n\n    if (is$1(businessObject, 'bpmn:Participant')) {\n      containment = 'participants';\n\n      // make sure the participants process is properly attached / detached\n      // from the XML document\n\n      var process = businessObject.processRef,\n          definitions;\n\n      if (process) {\n        definitions = getDefinitions(businessObject.$parent || newParent);\n\n        if (businessObject.$parent) {\n          remove(definitions.get('rootElements'), process);\n          process.$parent = null;\n        }\n\n        if (newParent) {\n          add(definitions.get('rootElements'), process);\n          process.$parent = definitions;\n        }\n      }\n    } else\n\n    if (is$1(businessObject, 'bpmn:DataOutputAssociation')) {\n      containment = 'dataOutputAssociations';\n    } else\n\n    if (is$1(businessObject, 'bpmn:DataInputAssociation')) {\n      containment = 'dataInputAssociations';\n    }\n\n    if (!containment) {\n      throw new Error(translate(\n        'no parent for {element} in {parent}',\n        {\n          element: businessObject.id,\n          parent: newParent.id\n        }\n      ));\n    }\n\n    var children;\n\n    if (businessObject.$parent) {\n\n      // remove from old parent\n      children = businessObject.$parent.get(containment);\n      remove(children, businessObject);\n    }\n\n    if (!newParent) {\n      businessObject.$parent = null;\n    } else {\n\n      // add to new parent\n      children = newParent.get(containment);\n      children.push(businessObject);\n      businessObject.$parent = newParent;\n    }\n\n    if (visualParent) {\n      var diChildren = visualParent.get(containment);\n\n      remove(children, businessObject);\n\n      if (newParent) {\n\n        if (!diChildren) {\n          diChildren = [];\n          newParent.set(containment, diChildren);\n        }\n\n        diChildren.push(businessObject);\n      }\n    }\n  };\n\n  /**\n   * @param {Connection} connection\n   */\n  BpmnUpdater.prototype.updateConnectionWaypoints = function(connection) {\n    var di = getDi(connection);\n\n    di.set('waypoint', this._bpmnFactory.createDiWaypoints(connection.waypoints));\n  };\n\n  /**\n   * @param { {\n   *   connection: Connection;\n   *   parent: Parent;\n   *   newParent: Parent;\n   * } } context\n   */\n  BpmnUpdater.prototype.updateConnection = function(context) {\n    var connection = context.connection,\n        businessObject = getBusinessObject(connection),\n        newSource = connection.source,\n        newSourceBo = getBusinessObject(newSource),\n        newTarget = connection.target,\n        newTargetBo = getBusinessObject(connection.target),\n        visualParent;\n\n    if (!is$1(businessObject, 'bpmn:DataAssociation')) {\n\n      var inverseSet = is$1(businessObject, 'bpmn:SequenceFlow');\n\n      if (businessObject.sourceRef !== newSourceBo) {\n        if (inverseSet) {\n          remove(businessObject.sourceRef && businessObject.sourceRef.get('outgoing'), businessObject);\n\n          if (newSourceBo && newSourceBo.get('outgoing')) {\n            newSourceBo.get('outgoing').push(businessObject);\n          }\n        }\n\n        businessObject.sourceRef = newSourceBo;\n      }\n\n      if (businessObject.targetRef !== newTargetBo) {\n        if (inverseSet) {\n          remove(businessObject.targetRef && businessObject.targetRef.get('incoming'), businessObject);\n\n          if (newTargetBo && newTargetBo.get('incoming')) {\n            newTargetBo.get('incoming').push(businessObject);\n          }\n        }\n\n        businessObject.targetRef = newTargetBo;\n      }\n    } else\n\n    if (is$1(businessObject, 'bpmn:DataInputAssociation')) {\n\n      // handle obnoxious isMsome sourceRef\n      businessObject.get('sourceRef')[0] = newSourceBo;\n\n      visualParent = context.parent || context.newParent || newTargetBo;\n\n      this.updateSemanticParent(businessObject, newTargetBo, visualParent);\n    } else\n\n    if (is$1(businessObject, 'bpmn:DataOutputAssociation')) {\n      visualParent = context.parent || context.newParent || newSourceBo;\n\n      this.updateSemanticParent(businessObject, newSourceBo, visualParent);\n\n      // targetRef = new target\n      businessObject.targetRef = newTargetBo;\n    }\n\n    this.updateConnectionWaypoints(connection);\n\n    this.updateDiConnection(connection, newSource, newTarget);\n  };\n\n\n  // helpers //////////////////////\n\n  BpmnUpdater.prototype._getLabel = function(di) {\n    if (!di.label) {\n      di.label = this._bpmnFactory.createDiLabel();\n    }\n\n    return di.label;\n  };\n\n\n  /**\n   * Call function if shape or connection is BPMN element.\n   *\n   * @param  {Function} fn\n   *\n   * @return {Function}\n   */\n  function ifBpmn(fn) {\n\n    return function(event) {\n\n      var context = event.context,\n          element = context.shape || context.connection || context.element;\n\n      if (is$1(element, 'bpmn:BaseElement')) {\n        fn(event);\n      }\n    };\n  }\n\n  /**\n   * Return dc:Bounds of bpmndi:BPMNLabel if exists.\n   *\n   * @param {Shape} shape\n   *\n   * @return {ModdleElement|undefined}\n   */\n  function getEmbeddedLabelBounds(shape) {\n    if (!is$1(shape, 'bpmn:Activity')) {\n      return;\n    }\n\n    var di = getDi(shape);\n\n    if (!di) {\n      return;\n    }\n\n    var label = di.get('label');\n\n    if (!label) {\n      return;\n    }\n\n    return label.get('bounds');\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n   *\n   * @typedef {import('diagram-js/lib/util/Types').Dimensions} Dimensions\n   *\n   * @typedef {import('./BpmnFactory').default} BpmnFactory\n   *\n   * @typedef {import('../../model/Types').BpmnAttributes} BpmnAttributes\n   * @typedef {import('../../model/Types').Connection} Connection\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Label} Label\n   * @typedef {import('../../model/Types').Root} Root\n   * @typedef {import('../../model/Types').Shape} Shape\n   * @typedef {import('../../model/Types').Moddle} Moddle\n   * @typedef {import('../../model/Types').ModdleElement} ModdleElement\n   */\n\n  /**\n   * A BPMN-specific element factory.\n   *\n   * @template {Connection} [T=Connection]\n   * @template {Label} [U=Label]\n   * @template {Root} [V=Root]\n   * @template {Shape} [W=Shape]\n   *\n   * @extends {BaseElementFactory<T, U, V, W>}\n   *\n   * @param {BpmnFactory} bpmnFactory\n   * @param {Moddle} moddle\n   * @param {Translate} translate\n   */\n  function ElementFactory(bpmnFactory, moddle, translate) {\n    ElementFactory$1.call(this);\n\n    this._bpmnFactory = bpmnFactory;\n    this._moddle = moddle;\n    this._translate = translate;\n  }\n\n  e$3(ElementFactory, ElementFactory$1);\n\n  ElementFactory.$inject = [\n    'bpmnFactory',\n    'moddle',\n    'translate'\n  ];\n\n  ElementFactory.prototype._baseCreate = ElementFactory$1.prototype.create;\n\n  /**\n   * Create a root element.\n   *\n   * @overlord\n   * @param {'root'} elementType\n   * @param {Partial<Root> & Partial<BpmnAttributes>} [attrs]\n   * @return {V}\n   */\n\n  /**\n   * Create a shape.\n   *\n   * @overlord\n   * @param {'shape'} elementType\n   * @param {Partial<Shape> & Partial<BpmnAttributes>} [attrs]\n   * @return {W}\n   */\n\n  /**\n   * Create a connection.\n   *\n   * @overlord\n   * @param {'connection'} elementType\n   * @param {Partial<Connection> & Partial<BpmnAttributes>} [attrs]\n   * @return {T}\n   */\n\n  /**\n   * Create a label.\n   *\n   * @param {'label'} elementType\n   * @param {Partial<Label> & Partial<BpmnAttributes>} [attrs]\n   * @return {U}\n   */\n  ElementFactory.prototype.create = function(elementType, attrs) {\n\n    // no special magic for labels,\n    // we assume their businessObjects have already been created\n    // and wired via attrs\n    if (elementType === 'label') {\n      var di = attrs.di || this._bpmnFactory.createDiLabel();\n      return this._baseCreate(elementType, assign$1({ type: 'label', di: di }, DEFAULT_LABEL_SIZE$1, attrs));\n    }\n\n    return this.createElement(elementType, attrs);\n  };\n\n  /**\n   * Create a BPMN root element.\n   *\n   * @overlord\n   * @param {'root'} elementType\n   * @param {Partial<Root> & Partial<BpmnAttributes>} [attrs]\n   * @return {V}\n   */\n\n  /**\n   * Create a BPMN shape.\n   *\n   * @overlord\n   * @param {'shape'} elementType\n   * @param {Partial<Shape> & Partial<BpmnAttributes>} [attrs]\n   * @return {W}\n   */\n\n  /**\n   * Create a BPMN connection.\n   *\n   * @param {'connection'} elementType\n   * @param {Partial<Connection> & Partial<BpmnAttributes>} [attrs]\n   * @return {T}\n   */\n  ElementFactory.prototype.createElement = function(elementType, attrs) {\n    var size,\n        translate = this._translate;\n\n    attrs = assign$1({}, attrs || {});\n\n    var businessObject = attrs.businessObject,\n        di = attrs.di;\n\n    if (!businessObject) {\n      if (!attrs.type) {\n        throw new Error(translate('no shape type specified'));\n      }\n\n      businessObject = this._bpmnFactory.create(attrs.type);\n\n      ensureCompatDiRef(businessObject);\n    }\n\n    if (!isModdleDi(di)) {\n      var diAttrs = assign$1(\n        {},\n        di || {},\n        { id: businessObject.id + '_di' }\n      );\n\n      if (elementType === 'root') {\n        di = this._bpmnFactory.createDiPlane(businessObject, diAttrs);\n      } else\n      if (elementType === 'connection') {\n        di = this._bpmnFactory.createDiEdge(businessObject, diAttrs);\n      } else {\n        di = this._bpmnFactory.createDiShape(businessObject, diAttrs);\n      }\n    }\n\n    if (is$1(businessObject, 'bpmn:Group')) {\n      attrs = assign$1({\n        isFrame: true\n      }, attrs);\n    }\n\n    attrs = applyAttributes(businessObject, attrs, [\n      'processRef',\n      'isInterrupting',\n      'associationDirection',\n      'isForCompensation'\n    ]);\n\n    if (attrs.isExpanded) {\n      attrs = applyAttribute(di, attrs, 'isExpanded');\n    }\n\n    if (is$1(businessObject, 'bpmn:SubProcess')) {\n      attrs.collapsed = !isExpanded(businessObject, di);\n    }\n\n    if (is$1(businessObject, 'bpmn:ExclusiveGateway')) {\n      di.isMarkerVisible = true;\n    }\n\n    if (isDefined(attrs.triggeredByEvent)) {\n      businessObject.triggeredByEvent = attrs.triggeredByEvent;\n      delete attrs.triggeredByEvent;\n    }\n\n    if (isDefined(attrs.cancelActivity)) {\n      businessObject.cancelActivity = attrs.cancelActivity;\n      delete attrs.cancelActivity;\n    }\n\n    var eventDefinitions,\n        newEventDefinition;\n\n    if (attrs.eventDefinitionType) {\n      eventDefinitions = businessObject.get('eventDefinitions') || [];\n      newEventDefinition = this._bpmnFactory.create(attrs.eventDefinitionType, attrs.eventDefinitionAttrs);\n\n      if (attrs.eventDefinitionType === 'bpmn:ConditionalEventDefinition') {\n        newEventDefinition.condition = this._bpmnFactory.create('bpmn:FormalExpression');\n      }\n\n      eventDefinitions.push(newEventDefinition);\n\n      newEventDefinition.$parent = businessObject;\n      businessObject.eventDefinitions = eventDefinitions;\n\n      delete attrs.eventDefinitionType;\n    }\n\n    size = this.getDefaultSize(businessObject, di);\n\n    attrs = assign$1({\n      id: businessObject.id\n    }, size, attrs, {\n      businessObject: businessObject,\n      di: di\n    });\n\n    return this._baseCreate(elementType, attrs);\n  };\n\n  /**\n   * Get the default size of a diagram element.\n   *\n   * @param {Element} element The element.\n   * @param {ModdleElement} di The DI.\n   *\n   * @return {Dimensions} Default width and height of the element.\n   */\n  ElementFactory.prototype.getDefaultSize = function(element, di) {\n\n    var bo = getBusinessObject(element);\n    di = di || getDi(element);\n\n    if (is$1(bo, 'bpmn:SubProcess')) {\n      if (isExpanded(bo, di)) {\n        return { width: 350, height: 200 };\n      } else {\n        return { width: 100, height: 80 };\n      }\n    }\n\n    if (is$1(bo, 'bpmn:Task')) {\n      return { width: 100, height: 80 };\n    }\n\n    if (is$1(bo, 'bpmn:Gateway')) {\n      return { width: 50, height: 50 };\n    }\n\n    if (is$1(bo, 'bpmn:Event')) {\n      return { width: 36, height: 36 };\n    }\n\n    if (is$1(bo, 'bpmn:Participant')) {\n      if (isExpanded(bo, di)) {\n        return { width: 600, height: 250 };\n      } else {\n        return { width: 400, height: 60 };\n      }\n    }\n\n    if (is$1(bo, 'bpmn:Lane')) {\n      return { width: 400, height: 100 };\n    }\n\n    if (is$1(bo, 'bpmn:DataObjectReference')) {\n      return { width: 36, height: 50 };\n    }\n\n    if (is$1(bo, 'bpmn:DataStoreReference')) {\n      return { width: 50, height: 50 };\n    }\n\n    if (is$1(bo, 'bpmn:TextAnnotation')) {\n      return { width: 100, height: 30 };\n    }\n\n    if (is$1(bo, 'bpmn:Group')) {\n      return { width: 300, height: 300 };\n    }\n\n    return { width: 100, height: 80 };\n  };\n\n\n  /**\n   * Create participant.\n   *\n   * @param {boolean|Partial<Shape> & Partial<BpmnAttributes>} [attrs]\n   * Attributes or whether the participant is expanded.\n   *\n   * @return {W} The created participant.\n   */\n  ElementFactory.prototype.createParticipantShape = function(attrs) {\n\n    if (!isObject(attrs)) {\n      attrs = { isExpanded: attrs };\n    }\n\n    attrs = assign$1({ type: 'bpmn:Participant' }, attrs || {});\n\n    // participants are expanded by default\n    if (attrs.isExpanded !== false) {\n      attrs.processRef = this._bpmnFactory.create('bpmn:Process');\n    }\n\n    return this.createShape(attrs);\n  };\n\n\n  // helpers //////////////////////\n\n  /**\n   * Apply attributes from a map to the given element, remove attribute from the\n   * map on application.\n   *\n   * @param {Element} element\n   * @param {Object} attrs (in/out map of attributes)\n   * @param {string[]} attributeNames name of attributes to apply\n   *\n   * @return {Object} changed attrs\n   */\n  function applyAttributes(element, attrs, attributeNames) {\n\n    forEach$1(attributeNames, function(property) {\n      attrs = applyAttribute(element, attrs, property);\n    });\n\n    return attrs;\n  }\n\n  /**\n   * Apply named property to element and drain it from the attrs collection.\n   *\n   * @param {Element} element\n   * @param {Object} attrs (in/out map of attributes)\n   * @param {string} attributeName to apply\n   *\n   * @return {Object} changed attrs\n   */\n  function applyAttribute(element, attrs, attributeName) {\n    if (attrs[attributeName] === undefined) {\n      return attrs;\n    }\n\n    element[attributeName] = attrs[attributeName];\n\n    return omit(attrs, [ attributeName ]);\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isModdleDi(element) {\n    return isAny(element, [\n      'bpmndi:BPMNShape',\n      'bpmndi:BPMNEdge',\n      'bpmndi:BPMNDiagram',\n      'bpmndi:BPMNPlane',\n    ]);\n  }\n\n  /**\n   * @typedef {import('../../../core/Canvas').default} Canvas\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * A handler that align elements in a certain way.\n   *\n   * @param {Modeling} modeling\n   * @param {Canvas} canvas\n   */\n  function AlignElements(modeling, canvas) {\n    this._modeling = modeling;\n    this._canvas = canvas;\n  }\n\n  AlignElements.$inject = [ 'modeling', 'canvas' ];\n\n\n  AlignElements.prototype.preExecute = function(context) {\n    var modeling = this._modeling;\n\n    var elements = context.elements,\n        alignment = context.alignment;\n\n\n    forEach$1(elements, function(element) {\n      var delta = {\n        x: 0,\n        y: 0\n      };\n\n      if (isDefined(alignment.left)) {\n        delta.x = alignment.left - element.x;\n\n      } else if (isDefined(alignment.right)) {\n        delta.x = (alignment.right - element.width) - element.x;\n\n      } else if (isDefined(alignment.center)) {\n        delta.x = (alignment.center - Math.round(element.width / 2)) - element.x;\n\n      } else if (isDefined(alignment.top)) {\n        delta.y = alignment.top - element.y;\n\n      } else if (isDefined(alignment.bottom)) {\n        delta.y = (alignment.bottom - element.height) - element.y;\n\n      } else if (isDefined(alignment.middle)) {\n        delta.y = (alignment.middle - Math.round(element.height / 2)) - element.y;\n      }\n\n      modeling.moveElements([ element ], delta, element.parent);\n    });\n  };\n\n  AlignElements.prototype.postExecute = function(context) {\n\n  };\n\n  /**\n   * @typedef {import('../../../model/Types').Element} Element\n   * @typedef {import('../../../model/Types').Parent} Parent\n   * @typedef {import('../../../model/Types').Shape} Shape\n   *\n   * @typedef {import('../../../util/Types').Point} Point\n   *\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * A handler that implements reversible appending of shapes\n   * to a source shape.\n   *\n   * @param {Modeling} modeling\n   */\n  function AppendShapeHandler(modeling) {\n    this._modeling = modeling;\n  }\n\n  AppendShapeHandler.$inject = [ 'modeling' ];\n\n\n  // api //////////////////////\n\n\n  /**\n   * Creates a new shape.\n   *\n   * @param {Object} context\n   * @param {Partial<Shape>} context.shape The new shape.\n   * @param {Element} context.source The element to which to append the new shape to.\n   * @param {Parent} context.parent The parent.\n   * @param {Point} context.position The position at which to create the new shape.\n   */\n  AppendShapeHandler.prototype.preExecute = function(context) {\n\n    var source = context.source;\n\n    if (!source) {\n      throw new Error('source required');\n    }\n\n    var target = context.target || source.parent,\n        shape = context.shape,\n        hints = context.hints || {};\n\n    shape = context.shape =\n      this._modeling.createShape(\n        shape,\n        context.position,\n        target, { attach: hints.attach });\n\n    context.shape = shape;\n  };\n\n  AppendShapeHandler.prototype.postExecute = function(context) {\n    var hints = context.hints || {};\n\n    if (!existsConnection(context.source, context.shape)) {\n\n      // create connection\n      if (hints.connectionTarget === context.source) {\n        this._modeling.connect(context.shape, context.source, context.connection);\n      } else {\n        this._modeling.connect(context.source, context.shape, context.connection);\n      }\n    }\n  };\n\n\n  function existsConnection(source, target) {\n    return some(source.outgoing, function(c) {\n      return c.target === target;\n    });\n  }\n\n  /**\n   * @typedef {import('../../../model/Types').Element} Element\n   * @typedef {import('../../../model/Types').Shape} Shape\n   *\n   * @typedef {import('../../../util/Types').Point} Point\n   *\n   * @typedef {import('../Modeling').ModelingHints} ModelingHints\n   *\n   * @typedef {import('../../../core/Canvas').default} Canvas\n   * @typedef {import('../../../layout/BaseLayouter').default} Layouter\n   */\n\n  /**\n   * @param {Canvas} canvas\n   * @param {Layouter} layouter\n   */\n  function CreateConnectionHandler(canvas, layouter) {\n    this._canvas = canvas;\n    this._layouter = layouter;\n  }\n\n  CreateConnectionHandler.$inject = [ 'canvas', 'layouter' ];\n\n\n  // api //////////////////////\n\n\n  /**\n   * Creates a new connection between two elements.\n   *\n   * @param {Object} context\n   * @param {Element} context.source The source.\n   * @param {Element} context.target The target.\n   * @param {Shape} context.parent The parent.\n   * @param {number} [context.parentIndex] The optional index at which to add the\n   * connection to the parent's children.\n   * @param {ModelingHints} [context.hints] The optional hints.\n   */\n  CreateConnectionHandler.prototype.execute = function(context) {\n\n    var connection = context.connection,\n        source = context.source,\n        target = context.target,\n        parent = context.parent,\n        parentIndex = context.parentIndex,\n        hints = context.hints;\n\n    if (!source || !target) {\n      throw new Error('source and target required');\n    }\n\n    if (!parent) {\n      throw new Error('parent required');\n    }\n\n    connection.source = source;\n    connection.target = target;\n\n    if (!connection.waypoints) {\n      connection.waypoints = this._layouter.layoutConnection(connection, hints);\n    }\n\n    // add connection\n    this._canvas.addConnection(connection, parent, parentIndex);\n\n    return connection;\n  };\n\n  CreateConnectionHandler.prototype.revert = function(context) {\n    var connection = context.connection;\n\n    this._canvas.removeConnection(connection);\n\n    connection.source = null;\n    connection.target = null;\n\n    return connection;\n  };\n\n  /**\r\n   * @typedef {import('../Modeling').default} Modeling\r\n   */\r\n\r\n  var round$3 = Math.round;\r\n\r\n  /**\r\n   * @param {Modeling} modeling\r\n   */\r\n  function CreateElementsHandler(modeling) {\r\n    this._modeling = modeling;\r\n  }\r\n\r\n  CreateElementsHandler.$inject = [\r\n    'modeling'\r\n  ];\r\n\r\n  CreateElementsHandler.prototype.preExecute = function(context) {\r\n    var elements = context.elements,\r\n        parent = context.parent,\r\n        parentIndex = context.parentIndex,\r\n        position = context.position,\r\n        hints = context.hints;\r\n\r\n    var modeling = this._modeling;\r\n\r\n    // make sure each element has x and y\r\n    forEach$1(elements, function(element) {\r\n      if (!isNumber(element.x)) {\r\n        element.x = 0;\r\n      }\r\n\r\n      if (!isNumber(element.y)) {\r\n        element.y = 0;\r\n      }\r\n    });\r\n\r\n    var visibleElements = filter(elements, function(element) {\r\n      return !element.hidden;\r\n    });\r\n\r\n    var bbox = getBBox(visibleElements);\r\n\r\n    // center elements around position\r\n    forEach$1(elements, function(element) {\r\n      if (isConnection(element)) {\r\n        element.waypoints = map$1(element.waypoints, function(waypoint) {\r\n          return {\r\n            x: round$3(waypoint.x - bbox.x - bbox.width / 2 + position.x),\r\n            y: round$3(waypoint.y - bbox.y - bbox.height / 2 + position.y)\r\n          };\r\n        });\r\n      }\r\n\r\n      assign$1(element, {\r\n        x: round$3(element.x - bbox.x - bbox.width / 2 + position.x),\r\n        y: round$3(element.y - bbox.y - bbox.height / 2 + position.y)\r\n      });\r\n    });\r\n\r\n    var parents = getParents$1(elements);\r\n\r\n    var cache = {};\r\n\r\n    forEach$1(elements, function(element) {\r\n      if (isConnection(element)) {\r\n        cache[ element.id ] = isNumber(parentIndex) ?\r\n          modeling.createConnection(\r\n            cache[ element.source.id ],\r\n            cache[ element.target.id ],\r\n            parentIndex,\r\n            element,\r\n            element.parent || parent,\r\n            hints\r\n          ) :\r\n          modeling.createConnection(\r\n            cache[ element.source.id ],\r\n            cache[ element.target.id ],\r\n            element,\r\n            element.parent || parent,\r\n            hints\r\n          );\r\n\r\n        return;\r\n      }\r\n\r\n      var createShapeHints = assign$1({}, hints);\r\n\r\n      if (parents.indexOf(element) === -1) {\r\n        createShapeHints.autoResize = false;\r\n      }\r\n\r\n      if (isLabel(element)) {\r\n        createShapeHints = omit(createShapeHints, [ 'attach' ]);\r\n      }\r\n\r\n      cache[ element.id ] = isNumber(parentIndex) ?\r\n        modeling.createShape(\r\n          element,\r\n          pick(element, [ 'x', 'y', 'width', 'height' ]),\r\n          element.parent || parent,\r\n          parentIndex,\r\n          createShapeHints\r\n        ) :\r\n        modeling.createShape(\r\n          element,\r\n          pick(element, [ 'x', 'y', 'width', 'height' ]),\r\n          element.parent || parent,\r\n          createShapeHints\r\n        );\r\n    });\r\n\r\n    context.elements = values(cache);\r\n  };\n\n  /**\n   * @typedef {import('../../../model/Types').Element} Element\n   * @typedef {import('../../../util/Types').Point} Point\n   *\n   * @typedef {import('../../../core/Canvas').default} Canvas\n   */\n\n  var round$2 = Math.round;\n\n\n  /**\n   * A handler that implements reversible addition of shapes.\n   *\n   * @param {Canvas} canvas\n   */\n  function CreateShapeHandler(canvas) {\n    this._canvas = canvas;\n  }\n\n  CreateShapeHandler.$inject = [ 'canvas' ];\n\n\n  // api //////////////////////\n\n\n  /**\n   * Appends a shape to a target shape\n   *\n   * @param {Object} context\n   * @param {Element} context.parent The parent.\n   * @param {Point} context.position The position at which to create the new shape.\n   * @param {number} [context.parentIndex] The optional index at which to add the\n   * shape to the parent's children.\n   */\n  CreateShapeHandler.prototype.execute = function(context) {\n\n    var shape = context.shape,\n        positionOrBounds = context.position,\n        parent = context.parent,\n        parentIndex = context.parentIndex;\n\n    if (!parent) {\n      throw new Error('parent required');\n    }\n\n    if (!positionOrBounds) {\n      throw new Error('position required');\n    }\n\n    // (1) add at event center position _or_ at given bounds\n    if (positionOrBounds.width !== undefined) {\n      assign$1(shape, positionOrBounds);\n    } else {\n      assign$1(shape, {\n        x: positionOrBounds.x - round$2(shape.width / 2),\n        y: positionOrBounds.y - round$2(shape.height / 2)\n      });\n    }\n\n    // (2) add to canvas\n    this._canvas.addShape(shape, parent, parentIndex);\n\n    return shape;\n  };\n\n\n  /**\n   * Undo append by removing the shape\n   */\n  CreateShapeHandler.prototype.revert = function(context) {\n\n    var shape = context.shape;\n\n    // (3) remove form canvas\n    this._canvas.removeShape(shape);\n\n    return shape;\n  };\n\n  /**\n   * @typedef {import('../../../core/Canvas').default} Canvas\n   *\n   * @typedef {import('../../../model/Types').Element} Element\n   * @typedef {import('../../../model/Types').Parent} Parent\n   * @typedef {import('../../../model/Types').Shape} Shape\n   * @typedef {import('../../../util/Types').Point} Point\n   */\n\n  /**\n   * A handler that attaches a label to a given target shape.\n   *\n   * @param {Canvas} canvas\n   */\n  function CreateLabelHandler(canvas) {\n    CreateShapeHandler.call(this, canvas);\n  }\n\n  e$3(CreateLabelHandler, CreateShapeHandler);\n\n  CreateLabelHandler.$inject = [ 'canvas' ];\n\n\n  // api //////////////////////\n\n\n  var originalExecute = CreateShapeHandler.prototype.execute;\n\n  /**\n   * Append label to element.\n   *\n   * @param { {\n   *   parent: Parent;\n   *   position: Point;\n   *   shape: Shape;\n   *   target: Element;\n   * } } context\n   */\n  CreateLabelHandler.prototype.execute = function(context) {\n\n    var label = context.shape;\n\n    ensureValidDimensions(label);\n\n    label.labelTarget = context.labelTarget;\n\n    return originalExecute.call(this, context);\n  };\n\n  var originalRevert = CreateShapeHandler.prototype.revert;\n\n  /**\n   * Revert appending by removing label.\n   */\n  CreateLabelHandler.prototype.revert = function(context) {\n    context.shape.labelTarget = null;\n\n    return originalRevert.call(this, context);\n  };\n\n\n  // helpers //////////////////////\n\n  function ensureValidDimensions(label) {\n\n    // make sure a label has valid { width, height } dimensions\n    [ 'width', 'height' ].forEach(function(prop) {\n      if (typeof label[prop] === 'undefined') {\n        label[prop] = 0;\n      }\n    });\n  }\n\n  /**\n   * @typedef {import('../../../core/Canvas').default} Canvas\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * A handler that implements reversible deletion of Connections.\n   */\n  function DeleteConnectionHandler(canvas, modeling) {\n    this._canvas = canvas;\n    this._modeling = modeling;\n  }\n\n  DeleteConnectionHandler.$inject = [\n    'canvas',\n    'modeling'\n  ];\n\n\n  /**\n   * - Remove connections\n   */\n  DeleteConnectionHandler.prototype.preExecute = function(context) {\n\n    var modeling = this._modeling;\n\n    var connection = context.connection;\n\n    // remove connections\n    saveClear(connection.incoming, function(connection) {\n\n      // To make sure that the connection isn't removed twice\n      // For example if a container is removed\n      modeling.removeConnection(connection, { nested: true });\n    });\n\n    saveClear(connection.outgoing, function(connection) {\n      modeling.removeConnection(connection, { nested: true });\n    });\n\n  };\n\n\n  DeleteConnectionHandler.prototype.execute = function(context) {\n\n    var connection = context.connection,\n        parent = connection.parent;\n\n    context.parent = parent;\n\n    // remember containment\n    context.parentIndex = indexOf(parent.children, connection);\n\n    context.source = connection.source;\n    context.target = connection.target;\n\n    this._canvas.removeConnection(connection);\n\n    connection.source = null;\n    connection.target = null;\n\n    return connection;\n  };\n\n  /**\n   * Command revert implementation.\n   */\n  DeleteConnectionHandler.prototype.revert = function(context) {\n\n    var connection = context.connection,\n        parent = context.parent,\n        parentIndex = context.parentIndex;\n\n    connection.source = context.source;\n    connection.target = context.target;\n\n    // restore containment\n    add(parent.children, connection, parentIndex);\n\n    this._canvas.addConnection(connection, parent);\n\n    return connection;\n  };\n\n  /**\n   * @typedef {import('../../../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * @param {Modeling} modeling\n   * @param {ElementRegistry} elementRegistry\n   */\n  function DeleteElementsHandler(modeling, elementRegistry) {\n    this._modeling = modeling;\n    this._elementRegistry = elementRegistry;\n  }\n\n  DeleteElementsHandler.$inject = [\n    'modeling',\n    'elementRegistry'\n  ];\n\n\n  DeleteElementsHandler.prototype.postExecute = function(context) {\n\n    var modeling = this._modeling,\n        elementRegistry = this._elementRegistry,\n        elements = context.elements;\n\n    forEach$1(elements, function(element) {\n\n      // element may have been removed with previous\n      // remove operations already (e.g. in case of nesting)\n      if (!elementRegistry.get(element.id)) {\n        return;\n      }\n\n      if (element.waypoints) {\n        modeling.removeConnection(element);\n      } else {\n        modeling.removeShape(element);\n      }\n    });\n  };\n\n  /**\n   * @typedef {import('../../../core/Canvas').default} Canvas\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * A handler that implements reversible deletion of shapes.\n   *\n   * @param {Canvas} canvas\n   * @param {Modeling} modeling\n   */\n  function DeleteShapeHandler(canvas, modeling) {\n    this._canvas = canvas;\n    this._modeling = modeling;\n  }\n\n  DeleteShapeHandler.$inject = [ 'canvas', 'modeling' ];\n\n\n  /**\n   * - Remove connections\n   * - Remove all direct children\n   */\n  DeleteShapeHandler.prototype.preExecute = function(context) {\n\n    var modeling = this._modeling;\n\n    var shape = context.shape;\n\n    // remove connections\n    saveClear(shape.incoming, function(connection) {\n\n      // To make sure that the connection isn't removed twice\n      // For example if a container is removed\n      modeling.removeConnection(connection, { nested: true });\n    });\n\n    saveClear(shape.outgoing, function(connection) {\n      modeling.removeConnection(connection, { nested: true });\n    });\n\n    // remove child shapes and connections\n    saveClear(shape.children, function(child) {\n      if (isConnection(child)) {\n        modeling.removeConnection(child, { nested: true });\n      } else {\n        modeling.removeShape(child, { nested: true });\n      }\n    });\n  };\n\n  /**\n   * Remove shape and remember the parent\n   */\n  DeleteShapeHandler.prototype.execute = function(context) {\n    var canvas = this._canvas;\n\n    var shape = context.shape,\n        oldParent = shape.parent;\n\n    context.oldParent = oldParent;\n\n    // remove containment\n    context.oldParentIndex = indexOf(oldParent.children, shape);\n\n    // remove shape\n    canvas.removeShape(shape);\n\n    return shape;\n  };\n\n\n  /**\n   * Command revert implementation\n   */\n  DeleteShapeHandler.prototype.revert = function(context) {\n\n    var canvas = this._canvas;\n\n    var shape = context.shape,\n        oldParent = context.oldParent,\n        oldParentIndex = context.oldParentIndex;\n\n    // restore containment\n    add(oldParent.children, shape, oldParentIndex);\n\n    canvas.addShape(shape, oldParent);\n\n    return shape;\n  };\n\n  /**\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * A handler that distributes elements evenly.\n   *\n   * @param {Modeling} modeling\n   */\n  function DistributeElements(modeling) {\n    this._modeling = modeling;\n  }\n\n  DistributeElements.$inject = [ 'modeling' ];\n\n  var OFF_AXIS = {\n    x: 'y',\n    y: 'x'\n  };\n\n  DistributeElements.prototype.preExecute = function(context) {\n    var modeling = this._modeling;\n\n    var groups = context.groups,\n        axis = context.axis,\n        dimension = context.dimension;\n\n    function updateRange(group, element) {\n      group.range.min = Math.min(element[axis], group.range.min);\n      group.range.max = Math.max(element[axis] + element[dimension], group.range.max);\n    }\n\n    function center(element) {\n      return element[axis] + element[dimension] / 2;\n    }\n\n    function lastIdx(arr) {\n      return arr.length - 1;\n    }\n\n    function rangeDiff(range) {\n      return range.max - range.min;\n    }\n\n    function centerElement(refCenter, element) {\n      var delta = { y: 0 };\n\n      delta[axis] = refCenter - center(element);\n\n      if (delta[axis]) {\n\n        delta[OFF_AXIS[axis]] = 0;\n\n        modeling.moveElements([ element ], delta, element.parent);\n      }\n    }\n\n    var firstGroup = groups[0],\n        lastGroupIdx = lastIdx(groups),\n        lastGroup = groups[ lastGroupIdx ];\n\n    var margin,\n        spaceInBetween,\n        groupsSize = 0; // the size of each range\n\n    forEach$1(groups, function(group, idx) {\n      var sortedElements,\n          refElem,\n          refCenter;\n\n      if (group.elements.length < 2) {\n        if (idx && idx !== groups.length - 1) {\n          updateRange(group, group.elements[0]);\n\n          groupsSize += rangeDiff(group.range);\n        }\n        return;\n      }\n\n      sortedElements = sortBy(group.elements, axis);\n\n      refElem = sortedElements[0];\n\n      if (idx === lastGroupIdx) {\n        refElem = sortedElements[lastIdx(sortedElements)];\n      }\n\n      refCenter = center(refElem);\n\n      // wanna update the ranges after the shapes have been centered\n      group.range = null;\n\n      forEach$1(sortedElements, function(element) {\n\n        centerElement(refCenter, element);\n\n        if (group.range === null) {\n          group.range = {\n            min: element[axis],\n            max: element[axis] + element[dimension]\n          };\n\n          return;\n        }\n\n        // update group's range after centering the range elements\n        updateRange(group, element);\n      });\n\n      if (idx && idx !== groups.length - 1) {\n        groupsSize += rangeDiff(group.range);\n      }\n    });\n\n    spaceInBetween = Math.abs(lastGroup.range.min - firstGroup.range.max);\n\n    margin = Math.round((spaceInBetween - groupsSize) / (groups.length - 1));\n\n    if (margin < groups.length - 1) {\n      return;\n    }\n\n    forEach$1(groups, function(group, groupIdx) {\n      var delta = {},\n          prevGroup;\n\n      if (group === firstGroup || group === lastGroup) {\n        return;\n      }\n\n      prevGroup = groups[groupIdx - 1];\n\n      group.range.max = 0;\n\n      forEach$1(group.elements, function(element, idx) {\n        delta[OFF_AXIS[axis]] = 0;\n        delta[axis] = (prevGroup.range.max - element[axis]) + margin;\n\n        if (group.range.min !== element[axis]) {\n          delta[axis] += element[axis] - group.range.min;\n        }\n\n        if (delta[axis]) {\n          modeling.moveElements([ element ], delta, element.parent);\n        }\n\n        group.range.max = Math.max(element[axis] + element[dimension], idx ? group.range.max : 0);\n      });\n    });\n  };\n\n  DistributeElements.prototype.postExecute = function(context) {\n\n  };\n\n  /**\n   * @typedef {import('../../../core/Canvas').default} Canvas\n   * @typedef {import('../../../layout/BaseLayouter').default} Layouter\n   */\n\n  /**\n   * A handler that implements reversible moving of shapes.\n   *\n   * @param {Layouter} layouter\n   * @param {Canvas} canvas\n   */\n  function LayoutConnectionHandler(layouter, canvas) {\n    this._layouter = layouter;\n    this._canvas = canvas;\n  }\n\n  LayoutConnectionHandler.$inject = [ 'layouter', 'canvas' ];\n\n  LayoutConnectionHandler.prototype.execute = function(context) {\n\n    var connection = context.connection;\n\n    var oldWaypoints = connection.waypoints;\n\n    assign$1(context, {\n      oldWaypoints: oldWaypoints\n    });\n\n    connection.waypoints = this._layouter.layoutConnection(connection, context.hints);\n\n    return connection;\n  };\n\n  LayoutConnectionHandler.prototype.revert = function(context) {\n\n    var connection = context.connection;\n\n    connection.waypoints = context.oldWaypoints;\n\n    return connection;\n  };\n\n  /**\n   * A handler that implements reversible moving of connections.\n   *\n   * The handler differs from the layout connection handler in a sense\n   * that it preserves the connection layout.\n   */\n  function MoveConnectionHandler() { }\n\n\n  MoveConnectionHandler.prototype.execute = function(context) {\n\n    var connection = context.connection,\n        delta = context.delta;\n\n    var newParent = context.newParent || connection.parent,\n        newParentIndex = context.newParentIndex,\n        oldParent = connection.parent;\n\n    // save old parent in context\n    context.oldParent = oldParent;\n    context.oldParentIndex = remove(oldParent.children, connection);\n\n    // add to new parent at position\n    add(newParent.children, connection, newParentIndex);\n\n    // update parent\n    connection.parent = newParent;\n\n    // update waypoint positions\n    forEach$1(connection.waypoints, function(p) {\n      p.x += delta.x;\n      p.y += delta.y;\n\n      if (p.original) {\n        p.original.x += delta.x;\n        p.original.y += delta.y;\n      }\n    });\n\n    return connection;\n  };\n\n  MoveConnectionHandler.prototype.revert = function(context) {\n\n    var connection = context.connection,\n        newParent = connection.parent,\n        oldParent = context.oldParent,\n        oldParentIndex = context.oldParentIndex,\n        delta = context.delta;\n\n    // remove from newParent\n    remove(newParent.children, connection);\n\n    // restore previous location in old parent\n    add(oldParent.children, connection, oldParentIndex);\n\n    // restore parent\n    connection.parent = oldParent;\n\n    // revert to old waypoint positions\n    forEach$1(connection.waypoints, function(p) {\n      p.x -= delta.x;\n      p.y -= delta.y;\n\n      if (p.original) {\n        p.original.x -= delta.x;\n        p.original.y -= delta.y;\n      }\n    });\n\n    return connection;\n  };\n\n  /**\n   * @typedef {import('../../../../model/Types').Connection} Connection\n   * @typedef {import('../../../../model/Types').Element} Element\n   * @typedef {import('../../../../model/Types').Shape} Shape\n   */\n\n  function MoveClosure() {\n\n    /**\n     * @type {Record<string, Shape>}\n     */\n    this.allShapes = {};\n\n    /**\n     * @type {Record<string, Connection>}\n     */\n    this.allConnections = {};\n\n    /**\n     * @type {Record<string, Element>}\n     */\n    this.enclosedElements = {};\n\n    /**\n     * @type {Record<string, Connection>}\n     */\n    this.enclosedConnections = {};\n\n    /**\n     * @type {Record<string, Element>}\n     */\n    this.topLevel = {};\n  }\n\n  /**\n   * @param {Element} element\n   * @param {boolean} [isTopLevel]\n   *\n   * @return {MoveClosure}\n   */\n  MoveClosure.prototype.add = function(element, isTopLevel) {\n    return this.addAll([ element ], isTopLevel);\n  };\n\n  /**\n   * @param {Element[]} elements\n   * @param {boolean} [isTopLevel]\n   *\n   * @return {MoveClosure}\n   */\n  MoveClosure.prototype.addAll = function(elements, isTopLevel) {\n\n    var newClosure = getClosure(elements, !!isTopLevel, this);\n\n    assign$1(this, newClosure);\n\n    return this;\n  };\n\n  /**\n   * @typedef {import('../../../../core/Types').ElementLike} Element\n   * @typedef {import('../../../../core/Types').ShapeLike} Shape\n   *\n   * @typedef {import('../../../../util/Types').Point} Point\n   *\n   * @typedef {import('../../Modeling').default} Modeling\n   */\n\n  /**\n   * A helper that is able to carry out serialized move\n   * operations on multiple elements.\n   *\n   * @param {Modeling} modeling\n   */\n  function MoveHelper(modeling) {\n    this._modeling = modeling;\n  }\n\n  /**\n   * Move the specified elements and all children by the given delta.\n   *\n   * This moves all enclosed connections, too and layouts all affected\n   * external connections.\n   *\n   * @template {Element} T\n   *\n   * @param {T[]} elements\n   * @param {Point} delta\n   * @param {Shape} newParent The new parent of all elements that are not nested.\n   *\n   * @return {T[]}\n   */\n  MoveHelper.prototype.moveRecursive = function(elements, delta, newParent) {\n    if (!elements) {\n      return [];\n    } else {\n      return this.moveClosure(this.getClosure(elements), delta, newParent);\n    }\n  };\n\n  /**\n   * Move the given closure of elmements.\n   *\n   * @param {Object} closure\n   * @param {Point} delta\n   * @param {Shape} [newParent]\n   * @param {Shape} [newHost]\n   */\n  MoveHelper.prototype.moveClosure = function(closure, delta, newParent, newHost, primaryShape) {\n    var modeling = this._modeling;\n\n    var allShapes = closure.allShapes,\n        allConnections = closure.allConnections,\n        enclosedConnections = closure.enclosedConnections,\n        topLevel = closure.topLevel,\n        keepParent = false;\n\n    if (primaryShape && primaryShape.parent === newParent) {\n      keepParent = true;\n    }\n\n    // move all shapes\n    forEach$1(allShapes, function(shape) {\n\n      // move the element according to the given delta\n      modeling.moveShape(shape, delta, topLevel[shape.id] && !keepParent && newParent, {\n        recurse: false,\n        layout: false\n      });\n    });\n\n    // move all child connections / layout external connections\n    forEach$1(allConnections, function(c) {\n\n      var sourceMoved = !!allShapes[c.source.id],\n          targetMoved = !!allShapes[c.target.id];\n\n      if (enclosedConnections[c.id] && sourceMoved && targetMoved) {\n        modeling.moveConnection(c, delta, topLevel[c.id] && !keepParent && newParent);\n      } else {\n        modeling.layoutConnection(c, {\n          connectionStart: sourceMoved && getMovedSourceAnchor(c, c.source, delta),\n          connectionEnd: targetMoved && getMovedTargetAnchor(c, c.target, delta)\n        });\n      }\n    });\n  };\n\n  /**\n   * Returns the closure for the selected elements\n   *\n   * @param {Element[]} elements\n   *\n   * @return {MoveClosure}\n   */\n  MoveHelper.prototype.getClosure = function(elements) {\n    return new MoveClosure().addAll(elements, true);\n  };\n\n  /**\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * A handler that implements reversible moving of shapes.\n   *\n   * @param {Modeling} modeling\n   */\n  function MoveElementsHandler(modeling) {\n    this._helper = new MoveHelper(modeling);\n  }\n\n  MoveElementsHandler.$inject = [ 'modeling' ];\n\n  MoveElementsHandler.prototype.preExecute = function(context) {\n    context.closure = this._helper.getClosure(context.shapes);\n  };\n\n  MoveElementsHandler.prototype.postExecute = function(context) {\n\n    var hints = context.hints,\n        primaryShape;\n\n    if (hints && hints.primaryShape) {\n      primaryShape = hints.primaryShape;\n      hints.oldParent = primaryShape.parent;\n    }\n\n    this._helper.moveClosure(\n      context.closure,\n      context.delta,\n      context.newParent,\n      context.newHost,\n      primaryShape\n    );\n  };\n\n  /**\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * A handler that implements reversible moving of shapes.\n   *\n   * @param {Modeling} modeling\n   */\n  function MoveShapeHandler(modeling) {\n    this._modeling = modeling;\n\n    this._helper = new MoveHelper(modeling);\n  }\n\n  MoveShapeHandler.$inject = [ 'modeling' ];\n\n\n  MoveShapeHandler.prototype.execute = function(context) {\n\n    var shape = context.shape,\n        delta = context.delta,\n        newParent = context.newParent || shape.parent,\n        newParentIndex = context.newParentIndex,\n        oldParent = shape.parent;\n\n    context.oldBounds = pick(shape, [ 'x', 'y', 'width', 'height' ]);\n\n    // save old parent in context\n    context.oldParent = oldParent;\n    context.oldParentIndex = remove(oldParent.children, shape);\n\n    // add to new parent at position\n    add(newParent.children, shape, newParentIndex);\n\n    // update shape parent + position\n    assign$1(shape, {\n      parent: newParent,\n      x: shape.x + delta.x,\n      y: shape.y + delta.y\n    });\n\n    return shape;\n  };\n\n  MoveShapeHandler.prototype.postExecute = function(context) {\n\n    var shape = context.shape,\n        delta = context.delta,\n        hints = context.hints;\n\n    var modeling = this._modeling;\n\n    if (hints.layout !== false) {\n\n      forEach$1(shape.incoming, function(c) {\n        modeling.layoutConnection(c, {\n          connectionEnd: getMovedTargetAnchor(c, shape, delta)\n        });\n      });\n\n      forEach$1(shape.outgoing, function(c) {\n        modeling.layoutConnection(c, {\n          connectionStart: getMovedSourceAnchor(c, shape, delta)\n        });\n      });\n    }\n\n    if (hints.recurse !== false) {\n      this.moveChildren(context);\n    }\n  };\n\n  MoveShapeHandler.prototype.revert = function(context) {\n\n    var shape = context.shape,\n        oldParent = context.oldParent,\n        oldParentIndex = context.oldParentIndex,\n        delta = context.delta;\n\n    // restore previous location in old parent\n    add(oldParent.children, shape, oldParentIndex);\n\n    // revert to old position and parent\n    assign$1(shape, {\n      parent: oldParent,\n      x: shape.x - delta.x,\n      y: shape.y - delta.y\n    });\n\n    return shape;\n  };\n\n  MoveShapeHandler.prototype.moveChildren = function(context) {\n\n    var delta = context.delta,\n        shape = context.shape;\n\n    this._helper.moveRecursive(shape.children, delta, null);\n  };\n\n  MoveShapeHandler.prototype.getNewParent = function(context) {\n    return context.newParent || context.shape.parent;\n  };\n\n  /**\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * Reconnect connection handler.\n   *\n   * @param {Modeling} modeling\n   */\n  function ReconnectConnectionHandler(modeling) {\n    this._modeling = modeling;\n  }\n\n  ReconnectConnectionHandler.$inject = [ 'modeling' ];\n\n  ReconnectConnectionHandler.prototype.execute = function(context) {\n    var newSource = context.newSource,\n        newTarget = context.newTarget,\n        connection = context.connection,\n        dockingOrPoints = context.dockingOrPoints;\n\n    if (!newSource && !newTarget) {\n      throw new Error('newSource or newTarget required');\n    }\n\n    if (isArray$3(dockingOrPoints)) {\n      context.oldWaypoints = connection.waypoints;\n      connection.waypoints = dockingOrPoints;\n    }\n\n    if (newSource) {\n      context.oldSource = connection.source;\n      connection.source = newSource;\n    }\n\n    if (newTarget) {\n      context.oldTarget = connection.target;\n      connection.target = newTarget;\n    }\n\n    return connection;\n  };\n\n  ReconnectConnectionHandler.prototype.postExecute = function(context) {\n    var connection = context.connection,\n        newSource = context.newSource,\n        newTarget = context.newTarget,\n        dockingOrPoints = context.dockingOrPoints,\n        hints = context.hints || {};\n\n    var layoutConnectionHints = {};\n\n    if (hints.connectionStart) {\n      layoutConnectionHints.connectionStart = hints.connectionStart;\n    }\n\n    if (hints.connectionEnd) {\n      layoutConnectionHints.connectionEnd = hints.connectionEnd;\n    }\n\n    if (hints.layoutConnection === false) {\n      return;\n    }\n\n    if (newSource && (!newTarget || hints.docking === 'source')) {\n      layoutConnectionHints.connectionStart = layoutConnectionHints.connectionStart\n        || getDocking(isArray$3(dockingOrPoints) ? dockingOrPoints[ 0 ] : dockingOrPoints);\n    }\n\n    if (newTarget && (!newSource || hints.docking === 'target')) {\n      layoutConnectionHints.connectionEnd = layoutConnectionHints.connectionEnd\n        || getDocking(isArray$3(dockingOrPoints) ? dockingOrPoints[ dockingOrPoints.length - 1 ] : dockingOrPoints);\n    }\n\n    if (hints.newWaypoints) {\n      layoutConnectionHints.waypoints = hints.newWaypoints;\n    }\n\n    this._modeling.layoutConnection(connection, layoutConnectionHints);\n  };\n\n  ReconnectConnectionHandler.prototype.revert = function(context) {\n    var oldSource = context.oldSource,\n        oldTarget = context.oldTarget,\n        oldWaypoints = context.oldWaypoints,\n        connection = context.connection;\n\n    if (oldSource) {\n      connection.source = oldSource;\n    }\n\n    if (oldTarget) {\n      connection.target = oldTarget;\n    }\n\n    if (oldWaypoints) {\n      connection.waypoints = oldWaypoints;\n    }\n\n    return connection;\n  };\n\n\n\n  // helpers //////////\n\n  function getDocking(point) {\n    return point.original || point;\n  }\n\n  /**\n   * @typedef {import('../../model/Types').Shape} Shape\n   *\n   * @typedef {import('../Modeling').default} Modeling\n   * @typedef {import('../../rules/Rules').default} Rules\n   */\n\n  /**\n   * Replace shape by adding new shape and removing old shape. Incoming and outgoing connections will\n   * be kept if possible.\n   *\n   * @class\n   * @constructor\n   *\n   * @param {Modeling} modeling\n   * @param {Rules} rules\n   */\n  function ReplaceShapeHandler(modeling, rules) {\n    this._modeling = modeling;\n    this._rules = rules;\n  }\n\n  ReplaceShapeHandler.$inject = [ 'modeling', 'rules' ];\n\n\n  /**\n   * Add new shape.\n   *\n   * @param {Object} context\n   * @param {Shape} context.oldShape\n   * @param {Object} context.newData\n   * @param {string} context.newData.type\n   * @param {number} context.newData.x\n   * @param {number} context.newData.y\n   * @param {Object} [context.hints]\n   */\n  ReplaceShapeHandler.prototype.preExecute = function(context) {\n    var self = this,\n        modeling = this._modeling,\n        rules = this._rules;\n\n    var oldShape = context.oldShape,\n        newData = context.newData,\n        hints = context.hints || {},\n        newShape;\n\n    function canReconnect(source, target, connection) {\n      return rules.allowed('connection.reconnect', {\n        connection: connection,\n        source: source,\n        target: target\n      });\n    }\n\n    // (1) add new shape at given position\n    var position = {\n      x: newData.x,\n      y: newData.y\n    };\n\n    var oldBounds = {\n      x: oldShape.x,\n      y: oldShape.y,\n      width: oldShape.width,\n      height: oldShape.height\n    };\n\n    newShape = context.newShape =\n      context.newShape ||\n      self.createShape(newData, position, oldShape.parent, hints);\n\n    // (2) update host\n    if (oldShape.host) {\n      modeling.updateAttachment(newShape, oldShape.host);\n    }\n\n    // (3) adopt all children from old shape\n    var children;\n\n    if (hints.moveChildren !== false) {\n      children = oldShape.children.slice();\n\n      modeling.moveElements(children, { x: 0, y: 0 }, newShape, hints);\n    }\n\n    // (4) reconnect connections to new shape if possible\n    var incoming = oldShape.incoming.slice(),\n        outgoing = oldShape.outgoing.slice();\n\n    forEach$1(incoming, function(connection) {\n      var source = connection.source,\n          allowed = canReconnect(source, newShape, connection);\n\n      if (allowed) {\n        self.reconnectEnd(\n          connection, newShape,\n          getResizedTargetAnchor(connection, newShape, oldBounds),\n          hints\n        );\n      }\n    });\n\n    forEach$1(outgoing, function(connection) {\n      var target = connection.target,\n          allowed = canReconnect(newShape, target, connection);\n\n      if (allowed) {\n        self.reconnectStart(\n          connection, newShape,\n          getResizedSourceAnchor(connection, newShape, oldBounds),\n          hints\n        );\n      }\n    });\n  };\n\n\n  /**\n   * Remove old shape.\n   */\n  ReplaceShapeHandler.prototype.postExecute = function(context) {\n    var oldShape = context.oldShape;\n\n    this._modeling.removeShape(oldShape);\n  };\n\n\n  ReplaceShapeHandler.prototype.execute = function(context) {};\n\n\n  ReplaceShapeHandler.prototype.revert = function(context) {};\n\n\n  ReplaceShapeHandler.prototype.createShape = function(shape, position, target, hints) {\n    return this._modeling.createShape(shape, position, target, hints);\n  };\n\n\n  ReplaceShapeHandler.prototype.reconnectStart = function(connection, newSource, dockingPoint, hints) {\n    this._modeling.reconnectStart(connection, newSource, dockingPoint, hints);\n  };\n\n\n  ReplaceShapeHandler.prototype.reconnectEnd = function(connection, newTarget, dockingPoint, hints) {\n    this._modeling.reconnectEnd(connection, newTarget, dockingPoint, hints);\n  };\n\n  /**\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * A handler that implements reversible resizing of shapes.\n   *\n   * @param {Modeling} modeling\n   */\n  function ResizeShapeHandler(modeling) {\n    this._modeling = modeling;\n  }\n\n  ResizeShapeHandler.$inject = [ 'modeling' ];\n\n  /**\n   * {\n   *   shape: {....}\n   *   newBounds: {\n   *     width:  20,\n   *     height: 40,\n   *     x:       5,\n   *     y:      10\n   *   }\n   *\n   * }\n   */\n  ResizeShapeHandler.prototype.execute = function(context) {\n    var shape = context.shape,\n        newBounds = context.newBounds,\n        minBounds = context.minBounds;\n\n    if (newBounds.x === undefined || newBounds.y === undefined ||\n        newBounds.width === undefined || newBounds.height === undefined) {\n      throw new Error('newBounds must have {x, y, width, height} properties');\n    }\n\n    if (minBounds && (newBounds.width < minBounds.width\n      || newBounds.height < minBounds.height)) {\n      throw new Error('width and height cannot be less than minimum height and width');\n    } else if (!minBounds\n      && newBounds.width < 10 || newBounds.height < 10) {\n      throw new Error('width and height cannot be less than 10px');\n    }\n\n    // save old bbox in context\n    context.oldBounds = {\n      width:  shape.width,\n      height: shape.height,\n      x:      shape.x,\n      y:      shape.y\n    };\n\n    // update shape\n    assign$1(shape, {\n      width:  newBounds.width,\n      height: newBounds.height,\n      x:      newBounds.x,\n      y:      newBounds.y\n    });\n\n    return shape;\n  };\n\n  ResizeShapeHandler.prototype.postExecute = function(context) {\n    var modeling = this._modeling;\n\n    var shape = context.shape,\n        oldBounds = context.oldBounds,\n        hints = context.hints || {};\n\n    if (hints.layout === false) {\n      return;\n    }\n\n    forEach$1(shape.incoming, function(c) {\n      modeling.layoutConnection(c, {\n        connectionEnd: getResizedTargetAnchor(c, shape, oldBounds)\n      });\n    });\n\n    forEach$1(shape.outgoing, function(c) {\n      modeling.layoutConnection(c, {\n        connectionStart: getResizedSourceAnchor(c, shape, oldBounds)\n      });\n    });\n\n  };\n\n  ResizeShapeHandler.prototype.revert = function(context) {\n\n    var shape = context.shape,\n        oldBounds = context.oldBounds;\n\n    // restore previous bbox\n    assign$1(shape, {\n      width:  oldBounds.width,\n      height: oldBounds.height,\n      x:      oldBounds.x,\n      y:      oldBounds.y\n    });\n\n    return shape;\n  };\n\n  /**\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * Add or remove space by moving and resizing shapes and updating connection waypoints.\n   *\n   * @param {Modeling} modeling\n   */\n  function SpaceToolHandler(modeling) {\n    this._modeling = modeling;\n  }\n\n  SpaceToolHandler.$inject = [ 'modeling' ];\n\n  SpaceToolHandler.prototype.preExecute = function(context) {\n    var delta = context.delta,\n        direction = context.direction,\n        movingShapes = context.movingShapes,\n        resizingShapes = context.resizingShapes,\n        start = context.start,\n        oldBounds = {};\n\n    // (1) move shapes\n    this.moveShapes(movingShapes, delta);\n\n    // (2a) save old bounds of resized shapes\n    forEach$1(resizingShapes, function(shape) {\n      oldBounds[shape.id] = getBounds(shape);\n    });\n\n    // (2b) resize shapes\n    this.resizeShapes(resizingShapes, delta, direction);\n\n    // (3) update connection waypoints\n    this.updateConnectionWaypoints(\n      getWaypointsUpdatingConnections(movingShapes, resizingShapes),\n      delta,\n      direction,\n      start,\n      movingShapes,\n      resizingShapes,\n      oldBounds\n    );\n  };\n\n  SpaceToolHandler.prototype.execute = function() {};\n  SpaceToolHandler.prototype.revert = function() {};\n\n  SpaceToolHandler.prototype.moveShapes = function(shapes, delta) {\n    var self = this;\n\n    forEach$1(shapes, function(element) {\n      self._modeling.moveShape(element, delta, null, {\n        autoResize: false,\n        layout: false,\n        recurse: false\n      });\n    });\n  };\n\n  SpaceToolHandler.prototype.resizeShapes = function(shapes, delta, direction) {\n    var self = this;\n\n    forEach$1(shapes, function(shape) {\n      var newBounds = resizeBounds(shape, direction, delta);\n\n      self._modeling.resizeShape(shape, newBounds, null, {\n        attachSupport: false,\n        autoResize: false,\n        layout: false\n      });\n    });\n  };\n\n  /**\n   * Update connections waypoints according to the rules:\n   *   1. Both source and target are moved/resized => move waypoints by the delta\n   *   2. Only one of source and target is moved/resized => re-layout connection with moved start/end\n   */\n  SpaceToolHandler.prototype.updateConnectionWaypoints = function(\n      connections,\n      delta,\n      direction,\n      start,\n      movingShapes,\n      resizingShapes,\n      oldBounds\n  ) {\n    var self = this,\n        affectedShapes = movingShapes.concat(resizingShapes);\n\n    forEach$1(connections, function(connection) {\n      var source = connection.source,\n          target = connection.target,\n          waypoints = copyWaypoints(connection),\n          axis = getAxisFromDirection(direction),\n          layoutHints = {};\n\n      if (includes$1(affectedShapes, source) && includes$1(affectedShapes, target)) {\n\n        // move waypoints\n        waypoints = map$1(waypoints, function(waypoint) {\n          if (shouldMoveWaypoint(waypoint, start, direction)) {\n\n            // move waypoint\n            waypoint[ axis ] = waypoint[ axis ] + delta[ axis ];\n          }\n\n          if (waypoint.original && shouldMoveWaypoint(waypoint.original, start, direction)) {\n\n            // move waypoint original\n            waypoint.original[ axis ] = waypoint.original[ axis ] + delta[ axis ];\n          }\n\n          return waypoint;\n        });\n\n        self._modeling.updateWaypoints(connection, waypoints, {\n          labelBehavior: false\n        });\n      } else if (includes$1(affectedShapes, source) || includes$1(affectedShapes, target)) {\n\n        // re-layout connection with moved start/end\n        if (includes$1(movingShapes, source)) {\n          layoutHints.connectionStart = getMovedSourceAnchor(connection, source, delta);\n        } else if (includes$1(movingShapes, target)) {\n          layoutHints.connectionEnd = getMovedTargetAnchor(connection, target, delta);\n        } else if (includes$1(resizingShapes, source)) {\n          layoutHints.connectionStart = getResizedSourceAnchor(\n            connection, source, oldBounds[source.id]\n          );\n        } else if (includes$1(resizingShapes, target)) {\n          layoutHints.connectionEnd = getResizedTargetAnchor(\n            connection, target, oldBounds[target.id]\n          );\n        }\n\n        self._modeling.layoutConnection(connection, layoutHints);\n      }\n    });\n  };\n\n\n  // helpers //////////\n\n  function copyWaypoint(waypoint) {\n    return assign$1({}, waypoint);\n  }\n\n  function copyWaypoints(connection) {\n    return map$1(connection.waypoints, function(waypoint) {\n\n      waypoint = copyWaypoint(waypoint);\n\n      if (waypoint.original) {\n        waypoint.original = copyWaypoint(waypoint.original);\n      }\n\n      return waypoint;\n    });\n  }\n\n  function getAxisFromDirection(direction) {\n    switch (direction) {\n    case 'n':\n      return 'y';\n    case 'w':\n      return 'x';\n    case 's':\n      return 'y';\n    case 'e':\n      return 'x';\n    }\n  }\n\n  function shouldMoveWaypoint(waypoint, start, direction) {\n    var relevantAxis = getAxisFromDirection(direction);\n\n    if (/e|s/.test(direction)) {\n      return waypoint[ relevantAxis ] > start;\n    } else if (/n|w/.test(direction)) {\n      return waypoint[ relevantAxis ] < start;\n    }\n  }\n\n  function includes$1(array, item) {\n    return array.indexOf(item) !== -1;\n  }\n\n  function getBounds(shape) {\n    return {\n      x: shape.x,\n      y: shape.y,\n      height: shape.height,\n      width: shape.width\n    };\n  }\n\n  /**\n   * @typedef {import('../../model/Types').Shape} Shape\n   *\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * A handler that toggles the collapsed state of an element\n   * and the visibility of all its children.\n   *\n   * @param {Modeling} modeling\n   */\n  function ToggleShapeCollapseHandler(modeling) {\n    this._modeling = modeling;\n  }\n\n  ToggleShapeCollapseHandler.$inject = [ 'modeling' ];\n\n\n  ToggleShapeCollapseHandler.prototype.execute = function(context) {\n\n    var shape = context.shape,\n        children = shape.children;\n\n    // recursively remember previous visibility of children\n    context.oldChildrenVisibility = getElementsVisibilityRecursive(children);\n\n    // toggle state\n    shape.collapsed = !shape.collapsed;\n\n    // recursively hide/show children\n    var result = setHiddenRecursive(children, shape.collapsed);\n\n    return [ shape ].concat(result);\n  };\n\n\n  ToggleShapeCollapseHandler.prototype.revert = function(context) {\n\n    var shape = context.shape,\n        oldChildrenVisibility = context.oldChildrenVisibility;\n\n    var children = shape.children;\n\n    // recursively set old visability of children\n    var result = restoreVisibilityRecursive(children, oldChildrenVisibility);\n\n    // retoggle state\n    shape.collapsed = !shape.collapsed;\n\n    return [ shape ].concat(result);\n  };\n\n\n  // helpers //////////////////////\n\n  /**\n   * Return a map { elementId -> hiddenState}.\n   *\n   * @param {Shape[]} elements\n   *\n   * @return {Object}\n   */\n  function getElementsVisibilityRecursive(elements) {\n\n    var result = {};\n\n    forEach$1(elements, function(element) {\n      result[element.id] = element.hidden;\n\n      if (element.children) {\n        result = assign$1({}, result, getElementsVisibilityRecursive(element.children));\n      }\n    });\n\n    return result;\n  }\n\n\n  function setHiddenRecursive(elements, newHidden) {\n    var result = [];\n    forEach$1(elements, function(element) {\n      element.hidden = newHidden;\n\n      result = result.concat(element);\n\n      if (element.children) {\n        result = result.concat(setHiddenRecursive(element.children, element.collapsed || newHidden));\n      }\n    });\n\n    return result;\n  }\n\n  function restoreVisibilityRecursive(elements, lastState) {\n    var result = [];\n    forEach$1(elements, function(element) {\n      element.hidden = lastState[element.id];\n\n      result = result.concat(element);\n\n      if (element.children) {\n        result = result.concat(restoreVisibilityRecursive(element.children, lastState));\n      }\n    });\n\n    return result;\n  }\n\n  /**\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * A handler that implements reversible attaching/detaching of shapes.\n   *\n   * @param {Modeling} modeling\n   */\n  function UpdateAttachmentHandler(modeling) {\n    this._modeling = modeling;\n  }\n\n  UpdateAttachmentHandler.$inject = [ 'modeling' ];\n\n\n  UpdateAttachmentHandler.prototype.execute = function(context) {\n    var shape = context.shape,\n        newHost = context.newHost,\n        oldHost = shape.host;\n\n    // (0) detach from old host\n    context.oldHost = oldHost;\n    context.attacherIdx = removeAttacher(oldHost, shape);\n\n    // (1) attach to new host\n    addAttacher(newHost, shape);\n\n    // (2) update host\n    shape.host = newHost;\n\n    return shape;\n  };\n\n  UpdateAttachmentHandler.prototype.revert = function(context) {\n    var shape = context.shape,\n        newHost = context.newHost,\n        oldHost = context.oldHost,\n        attacherIdx = context.attacherIdx;\n\n    // (2) update host\n    shape.host = oldHost;\n\n    // (1) attach to new host\n    removeAttacher(newHost, shape);\n\n    // (0) detach from old host\n    addAttacher(oldHost, shape, attacherIdx);\n\n    return shape;\n  };\n\n\n  function removeAttacher(host, attacher) {\n\n    // remove attacher from host\n    return remove(host && host.attachers, attacher);\n  }\n\n  function addAttacher(host, attacher, idx) {\n\n    if (!host) {\n      return;\n    }\n\n    var attachers = host.attachers;\n\n    if (!attachers) {\n      host.attachers = attachers = [];\n    }\n\n    add(attachers, attacher, idx);\n  }\n\n  function UpdateWaypointsHandler() { }\n\n  UpdateWaypointsHandler.prototype.execute = function(context) {\n\n    var connection = context.connection,\n        newWaypoints = context.newWaypoints;\n\n    context.oldWaypoints = connection.waypoints;\n\n    connection.waypoints = newWaypoints;\n\n    return connection;\n  };\n\n  UpdateWaypointsHandler.prototype.revert = function(context) {\n\n    var connection = context.connection,\n        oldWaypoints = context.oldWaypoints;\n\n    connection.waypoints = oldWaypoints;\n\n    return connection;\n  };\n\n  /**\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Connection} Connection\n   * @typedef {import('../../model/Types').Parent} Parent\n   * @typedef {import('../../model/Types').Shape} Shape\n   * @typedef {import('../../model/Types').Label} Label\n   *\n   * @typedef {import('../../command/CommandStack').default} CommandStack\n   * @typedef {import('../../core/ElementFactory').default} ElementFactory\n   * @typedef {import('../../core/EventBus').default} EventBus\n   *\n   * @typedef {import('../../command/CommandStack').CommandHandlerConstructor} CommandHandlerConstructor\n   *\n   * @typedef {import('../../util/Types').Dimensions} Dimensions\n   * @typedef {import('../../util/Types').Direction} Direction\n   * @typedef {import('../../util/Types').Point} Point\n   * @typedef {import('../../util/Types').Rect} Rect\n   *\n   * @typedef { 'x' | 'y' } ModelingDistributeAxis\n   *\n   * @typedef { 'width' | 'height' } ModelingDistributeDimension\n   *\n   * @typedef { {\n   *   bottom?: number;\n   *   center?: number;\n   *   left?: number;\n   *   middle?: number;\n   *   right?: number;\n   *   top?: number;\n   * } } ModelingAlignAlignment\n   *\n   * @typedef { {\n   *   [key: string]: any;\n   * } } ModelingHints\n   *\n   * @typedef { {\n   *   attach?: boolean;\n   * } & ModelingHints } ModelingMoveElementsHints\n   *\n   * @typedef { {\n   *   attach?: boolean;\n   * } & ModelingHints } ModelingCreateShapeHints\n   */\n\n  /**\n   * @template {Element} U\n   *\n   * @typedef { {\n   *   elements: U[],\n   *   range: {\n   *     min: number;\n   *     max: number;\n   *   } }\n   * } ModelingDistributeGroup\n   */\n\n  /**\n   * The basic modeling entry point.\n   *\n   * @template {Connection} [T=Connection]\n   * @template {Element} [U=Element]\n   * @template {Label} [V=Label]\n   * @template {Parent} [W=Parent]\n   * @template {Shape} [X=Shape]\n   *\n   * @param {EventBus} eventBus\n   * @param {ElementFactory} elementFactory\n   * @param {CommandStack} commandStack\n   */\n  function Modeling$1(eventBus, elementFactory, commandStack) {\n    this._eventBus = eventBus;\n    this._elementFactory = elementFactory;\n    this._commandStack = commandStack;\n\n    var self = this;\n\n    eventBus.on('diagram.init', function() {\n\n      // register modeling handlers\n      self.registerHandlers(commandStack);\n    });\n  }\n\n  Modeling$1.$inject = [ 'eventBus', 'elementFactory', 'commandStack' ];\n\n  /**\n   * Get a map of all command handlers.\n   *\n   * @return {Map<string, CommandHandlerConstructor>}\n   */\n  Modeling$1.prototype.getHandlers = function() {\n    return {\n      'shape.append': AppendShapeHandler,\n      'shape.create': CreateShapeHandler,\n      'shape.delete': DeleteShapeHandler,\n      'shape.move': MoveShapeHandler,\n      'shape.resize': ResizeShapeHandler,\n      'shape.replace': ReplaceShapeHandler,\n      'shape.toggleCollapse': ToggleShapeCollapseHandler,\n\n      'spaceTool': SpaceToolHandler,\n\n      'label.create': CreateLabelHandler,\n\n      'connection.create': CreateConnectionHandler,\n      'connection.delete': DeleteConnectionHandler,\n      'connection.move': MoveConnectionHandler,\n      'connection.layout': LayoutConnectionHandler,\n\n      'connection.updateWaypoints': UpdateWaypointsHandler,\n\n      'connection.reconnect': ReconnectConnectionHandler,\n\n      'elements.create': CreateElementsHandler,\n      'elements.move': MoveElementsHandler,\n      'elements.delete': DeleteElementsHandler,\n\n      'elements.distribute': DistributeElements,\n      'elements.align': AlignElements,\n\n      'element.updateAttachment': UpdateAttachmentHandler\n    };\n  };\n\n  /**\n   * Register handlers with the command stack\n   *\n   * @param {CommandStack} commandStack\n   */\n  Modeling$1.prototype.registerHandlers = function(commandStack) {\n    forEach$1(this.getHandlers(), function(handler, id) {\n      commandStack.registerHandler(id, handler);\n    });\n  };\n\n\n  /**\n   * Move a shape by the given delta and optionally to a new parent.\n   *\n   * @param {X} shape\n   * @param {Point} delta\n   * @param {W} [newParent]\n   * @param {number} [newParentIndex]\n   * @param {ModelingHints} [hints]\n   */\n  Modeling$1.prototype.moveShape = function(shape, delta, newParent, newParentIndex, hints) {\n\n    if (typeof newParentIndex === 'object') {\n      hints = newParentIndex;\n      newParentIndex = null;\n    }\n\n    var context = {\n      shape: shape,\n      delta:  delta,\n      newParent: newParent,\n      newParentIndex: newParentIndex,\n      hints: hints || {}\n    };\n\n    this._commandStack.execute('shape.move', context);\n  };\n\n\n  /**\n   * Update the attachment of a shape.\n   *\n   * @param {X} shape\n   * @param {X} [newHost=undefined]\n   */\n  Modeling$1.prototype.updateAttachment = function(shape, newHost) {\n    var context = {\n      shape: shape,\n      newHost: newHost\n    };\n\n    this._commandStack.execute('element.updateAttachment', context);\n  };\n\n\n  /**\n   * Move elements by a given delta and optionally to a new parent.\n   *\n   * @param {U[]} shapes\n   * @param {Point} delta\n   * @param {W} [target]\n   * @param {ModelingMoveElementsHints} [hints]\n   */\n  Modeling$1.prototype.moveElements = function(shapes, delta, target, hints) {\n\n    hints = hints || {};\n\n    var attach = hints.attach;\n\n    var newParent = target,\n        newHost;\n\n    if (attach === true) {\n      newHost = target;\n      newParent = target.parent;\n    } else\n\n    if (attach === false) {\n      newHost = null;\n    }\n\n    var context = {\n      shapes: shapes,\n      delta: delta,\n      newParent: newParent,\n      newHost: newHost,\n      hints: hints\n    };\n\n    this._commandStack.execute('elements.move', context);\n  };\n\n  /**\n   * Move a shape by the given delta and optionally to a new parent.\n   *\n   * @param {T} connection\n   * @param {Point} delta\n   * @param {W} [newParent]\n   * @param {number} [newParentIndex]\n   * @param {ModelingHints} [hints]\n   */\n  Modeling$1.prototype.moveConnection = function(connection, delta, newParent, newParentIndex, hints) {\n\n    if (typeof newParentIndex === 'object') {\n      hints = newParentIndex;\n      newParentIndex = undefined;\n    }\n\n    var context = {\n      connection: connection,\n      delta: delta,\n      newParent: newParent,\n      newParentIndex: newParentIndex,\n      hints: hints || {}\n    };\n\n    this._commandStack.execute('connection.move', context);\n  };\n\n  /**\n   * Layout a connection.\n   *\n   * @param {T} connection\n   * @param {ModelingHints} [hints]\n   */\n  Modeling$1.prototype.layoutConnection = function(connection, hints) {\n    var context = {\n      connection: connection,\n      hints: hints || {}\n    };\n\n    this._commandStack.execute('connection.layout', context);\n  };\n\n  /**\n   * Create a connection.\n   *\n   * @overlord\n   *\n   * @param {U} source\n   * @param {U} target\n   * @param {Partial<T>} connection\n   * @param {W} parent\n   * @param {ModelingHints} [hints]\n   *\n   * @return {T}\n   */\n\n  /**\n   * Create a connection.\n   *\n   * @param {U} source\n   * @param {U} target\n   * @param {number} parentIndex\n   * @param {Partial<T>} connection\n   * @param {W} parent\n   * @param {ModelingHints} [hints]\n   *\n   * @return {T}\n   */\n  Modeling$1.prototype.createConnection = function(source, target, parentIndex, connection, parent, hints) {\n\n    if (typeof parentIndex === 'object') {\n      hints = parent;\n      parent = connection;\n      connection = parentIndex;\n      parentIndex = undefined;\n    }\n\n    connection = this._create('connection', connection);\n\n    var context = {\n      source: source,\n      target: target,\n      parent: parent,\n      parentIndex: parentIndex,\n      connection: connection,\n      hints: hints\n    };\n\n    this._commandStack.execute('connection.create', context);\n\n    return context.connection;\n  };\n\n\n  /**\n   * Create a shape.\n   *\n   * @overlord\n   *\n   * @param {Partial<X>} shape\n   * @param {Point} position\n   * @param {W} target\n   * @param {ModelingCreateShapeHints} [hints]\n   *\n   * @return {X}\n   */\n\n  /**\n   * Create a shape.\n   *\n   * @param {Partial<X>} shape\n   * @param {Point} position\n   * @param {W} target\n   * @param {number} parentIndex\n   * @param {ModelingCreateShapeHints} [hints]\n   *\n   * @return {X}\n   */\n  Modeling$1.prototype.createShape = function(shape, position, target, parentIndex, hints) {\n\n    if (typeof parentIndex !== 'number') {\n      hints = parentIndex;\n      parentIndex = undefined;\n    }\n\n    hints = hints || {};\n\n    var attach = hints.attach,\n        parent,\n        host;\n\n    shape = this._create('shape', shape);\n\n    if (attach) {\n      parent = target.parent;\n      host = target;\n    } else {\n      parent = target;\n    }\n\n    var context = {\n      position: position,\n      shape: shape,\n      parent: parent,\n      parentIndex: parentIndex,\n      host: host,\n      hints: hints\n    };\n\n    this._commandStack.execute('shape.create', context);\n\n    return context.shape;\n  };\n\n  /**\n   * Create elements.\n   *\n   * @param {Partial<U>[]} elements\n   * @param {Point} position\n   * @param {W} parent\n   * @param {number} [parentIndex]\n   * @param {ModelingHints} [hints]\n   *\n   * @return {U[]}\n   */\n  Modeling$1.prototype.createElements = function(elements, position, parent, parentIndex, hints) {\n    if (!isArray$3(elements)) {\n      elements = [ elements ];\n    }\n\n    if (typeof parentIndex !== 'number') {\n      hints = parentIndex;\n      parentIndex = undefined;\n    }\n\n    hints = hints || {};\n\n    var context = {\n      position: position,\n      elements: elements,\n      parent: parent,\n      parentIndex: parentIndex,\n      hints: hints\n    };\n\n    this._commandStack.execute('elements.create', context);\n\n    return context.elements;\n  };\n\n  /**\n   * Create a label.\n   *\n   * @param {U} labelTarget\n   * @param {Point} position\n   * @param {Partial<V>} label\n   * @param {W} [parent]\n   *\n   * @return {V}\n   */\n  Modeling$1.prototype.createLabel = function(labelTarget, position, label, parent) {\n\n    label = this._create('label', label);\n\n    var context = {\n      labelTarget: labelTarget,\n      position: position,\n      parent: parent || labelTarget.parent,\n      shape: label\n    };\n\n    this._commandStack.execute('label.create', context);\n\n    return context.shape;\n  };\n\n\n  /**\n   * Create and connect a shape to a source.\n   *\n   * @param {U} source\n   * @param {Partial<X>} shape\n   * @param {Point} position\n   * @param {W} target\n   * @param {ModelingHints} [hints]\n   *\n   * @return {X}\n   */\n  Modeling$1.prototype.appendShape = function(source, shape, position, target, hints) {\n\n    hints = hints || {};\n\n    shape = this._create('shape', shape);\n\n    var context = {\n      source: source,\n      position: position,\n      target: target,\n      shape: shape,\n      connection: hints.connection,\n      connectionParent: hints.connectionParent,\n      hints: hints\n    };\n\n    this._commandStack.execute('shape.append', context);\n\n    return context.shape;\n  };\n\n  /**\n   * Remove elements.\n   *\n   * @param {U[]} elements\n   */\n  Modeling$1.prototype.removeElements = function(elements) {\n    var context = {\n      elements: elements\n    };\n\n    this._commandStack.execute('elements.delete', context);\n  };\n\n  /**\n   * Distribute elements along a given axis.\n   *\n   * @param {ModelingDistributeGroup<U>[]} groups\n   * @param {ModelingDistributeAxis} axis\n   * @param {ModelingDistributeDimension} dimension\n   */\n  Modeling$1.prototype.distributeElements = function(groups, axis, dimension) {\n    var context = {\n      groups: groups,\n      axis: axis,\n      dimension: dimension\n    };\n\n    this._commandStack.execute('elements.distribute', context);\n  };\n\n  /**\n   * Remove a shape.\n   *\n   * @param {X} shape\n   * @param {ModelingHints} [hints]\n   */\n  Modeling$1.prototype.removeShape = function(shape, hints) {\n    var context = {\n      shape: shape,\n      hints: hints || {}\n    };\n\n    this._commandStack.execute('shape.delete', context);\n  };\n\n  /**\n   * Remove a connection.\n   *\n   * @param {T} connection\n   * @param {ModelingHints} [hints]\n   */\n  Modeling$1.prototype.removeConnection = function(connection, hints) {\n    var context = {\n      connection: connection,\n      hints: hints || {}\n    };\n\n    this._commandStack.execute('connection.delete', context);\n  };\n\n  /**\n   * Replace a shape.\n   *\n   * @param {X} oldShape\n   * @param {Partial<X>} newShape\n   * @param {ModelingHints} [hints]\n   *\n   * @return {X}\n   */\n  Modeling$1.prototype.replaceShape = function(oldShape, newShape, hints) {\n    var context = {\n      oldShape: oldShape,\n      newData: newShape,\n      hints: hints || {}\n    };\n\n    this._commandStack.execute('shape.replace', context);\n\n    return context.newShape;\n  };\n\n  /**\n   * Align elements.\n   *\n   * @param {U[]} elements\n   * @param {ModelingAlignAlignment} alignment\n   */\n  Modeling$1.prototype.alignElements = function(elements, alignment) {\n    var context = {\n      elements: elements,\n      alignment: alignment\n    };\n\n    this._commandStack.execute('elements.align', context);\n  };\n\n  /**\n   * Resize a shape.\n   *\n   * @param {X} shape\n   * @param {Rect} newBounds\n   * @param {Dimensions} [minBounds]\n   * @param {ModelingHints} [hints]\n   */\n  Modeling$1.prototype.resizeShape = function(shape, newBounds, minBounds, hints) {\n    var context = {\n      shape: shape,\n      newBounds: newBounds,\n      minBounds: minBounds,\n      hints: hints\n    };\n\n    this._commandStack.execute('shape.resize', context);\n  };\n\n  /**\n   * Create space along an horizontally or vertically.\n   *\n   * @param {X[]} movingShapes\n   * @param {X[]} resizingShapes\n   * @param {Point} delta\n   * @param {Direction} direction\n   * @param {number} start\n   */\n  Modeling$1.prototype.createSpace = function(movingShapes, resizingShapes, delta, direction, start) {\n    var context = {\n      delta: delta,\n      direction: direction,\n      movingShapes: movingShapes,\n      resizingShapes: resizingShapes,\n      start: start\n    };\n\n    this._commandStack.execute('spaceTool', context);\n  };\n\n  /**\n   * Update a connetions waypoints.\n   *\n   * @param {T} connection\n   * @param {Point[]} newWaypoints\n   * @param {ModelingHints} [hints]\n   */\n  Modeling$1.prototype.updateWaypoints = function(connection, newWaypoints, hints) {\n    var context = {\n      connection: connection,\n      newWaypoints: newWaypoints,\n      hints: hints || {}\n    };\n\n    this._commandStack.execute('connection.updateWaypoints', context);\n  };\n\n  /**\n   * Reconnect a connections source and/or target.\n   *\n   * @param {T} connection\n   * @param {U} source\n   * @param {U} target\n   * @param {Point|Point[]} dockingOrPoints\n   * @param {ModelingHints} [hints]\n   */\n  Modeling$1.prototype.reconnect = function(connection, source, target, dockingOrPoints, hints) {\n    var context = {\n      connection: connection,\n      newSource: source,\n      newTarget: target,\n      dockingOrPoints: dockingOrPoints,\n      hints: hints || {}\n    };\n\n    this._commandStack.execute('connection.reconnect', context);\n  };\n\n  /**\n   * Reconnect a connections source.\n   *\n   * @param {T} connection\n   * @param {U} newSource\n   * @param {Point|Point[]} dockingOrPoints\n   * @param {ModelingHints} [hints]\n   */\n  Modeling$1.prototype.reconnectStart = function(connection, newSource, dockingOrPoints, hints) {\n    if (!hints) {\n      hints = {};\n    }\n\n    this.reconnect(connection, newSource, connection.target, dockingOrPoints, assign$1(hints, {\n      docking: 'source'\n    }));\n  };\n\n  /**\n   * Reconnect a connections target.\n   *\n   * @param {T} connection\n   * @param {U} newTarget\n   * @param {Point|Point[]} dockingOrPoints\n   * @param {ModelingHints} [hints]\n   */\n  Modeling$1.prototype.reconnectEnd = function(connection, newTarget, dockingOrPoints, hints) {\n    if (!hints) {\n      hints = {};\n    }\n\n    this.reconnect(connection, connection.source, newTarget, dockingOrPoints, assign$1(hints, {\n      docking: 'target'\n    }));\n  };\n\n  /**\n   * Connect two elements.\n   *\n   * @param {U} source\n   * @param {U} target\n   * @param {Partial<T>} [attrs]\n   * @param {ModelingHints} [hints]\n   *\n   * @return {T}\n   */\n  Modeling$1.prototype.connect = function(source, target, attrs, hints) {\n    return this.createConnection(source, target, attrs || {}, source.parent, hints);\n  };\n\n  Modeling$1.prototype._create = function(type, attrs) {\n    if (isModelElement(attrs)) {\n      return attrs;\n    } else {\n      return this._elementFactory.create(type, attrs);\n    }\n  };\n\n  /**\n   * Collapse or expand a shape.\n   *\n   * @param {X} shape\n   * @param {ModelingHints} [hints]\n   */\n  Modeling$1.prototype.toggleCollapse = function(shape, hints) {\n    var context = {\n      shape: shape,\n      hints: hints || {}\n    };\n\n    this._commandStack.execute('shape.toggleCollapse', context);\n  };\n\n  /**\n   * @typedef {import('diagram-js/lib/command/CommandHandler').default} CommandHandler\n   *\n   * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n   *\n   * @typedef {import('../../../model/Types').Shape} Shape\n   * @typedef {import('../../../model/Types').ModdleElement} ModdleElement\n   */\n\n  /**\n   * @implements {CommandHandler}\n   *\n   * @param {ElementRegistry} elementRegistry\n   */\n  function UpdateModdlePropertiesHandler(elementRegistry) {\n    this._elementRegistry = elementRegistry;\n  }\n\n  UpdateModdlePropertiesHandler.$inject = [ 'elementRegistry' ];\n\n  UpdateModdlePropertiesHandler.prototype.execute = function(context) {\n\n    var element = context.element,\n        moddleElement = context.moddleElement,\n        properties = context.properties;\n\n    if (!moddleElement) {\n      throw new Error('<moddleElement> required');\n    }\n\n    // TODO(nikku): we need to ensure that ID properties\n    // are properly registered / unregistered via\n    // this._moddle.ids.assigned(id)\n    var changed = context.changed || this._getVisualReferences(moddleElement).concat(element);\n    var oldProperties = context.oldProperties || getModdleProperties(moddleElement, keys(properties));\n\n    setModdleProperties(moddleElement, properties);\n\n    context.oldProperties = oldProperties;\n    context.changed = changed;\n\n    return changed;\n  };\n\n  UpdateModdlePropertiesHandler.prototype.revert = function(context) {\n    var oldProperties = context.oldProperties,\n        moddleElement = context.moddleElement,\n        changed = context.changed;\n\n    setModdleProperties(moddleElement, oldProperties);\n\n    return changed;\n  };\n\n  /**\n   * Return visual references of given moddle element within the diagram.\n   *\n   * @param {ModdleElement} moddleElement\n   *\n   * @return {Shape[]}\n   */\n  UpdateModdlePropertiesHandler.prototype._getVisualReferences = function(moddleElement) {\n\n    var elementRegistry = this._elementRegistry;\n\n    if (is$1(moddleElement, 'bpmn:DataObject')) {\n      return getAllDataObjectReferences(moddleElement, elementRegistry);\n    }\n\n    return [];\n  };\n\n\n  // helpers /////////////////\n\n  function getModdleProperties(moddleElement, propertyNames) {\n    return reduce(propertyNames, function(result, key) {\n      result[key] = moddleElement.get(key);\n      return result;\n    }, {});\n  }\n\n  function setModdleProperties(moddleElement, properties) {\n    forEach$1(properties, function(value, key) {\n      moddleElement.set(key, value);\n    });\n  }\n\n  function getAllDataObjectReferences(dataObject, elementRegistry) {\n    return elementRegistry.filter(function(element) {\n      return (\n        is$1(element, 'bpmn:DataObjectReference') &&\n            getBusinessObject(element).dataObjectRef === dataObject\n      );\n    });\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/command/CommandHandler').default} CommandHandler\n   * @typedef {import('diagram-js/lib/command/CommandStack').CommandContext} CommandContext\n   *\n   * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../../../model/Types').Moddle} Moddle\n   * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n   * @typedef {import('../Modeling').default} Modeling\n   * @typedef {import('../../../draw/TextRenderer').default} TextRenderer\n   *\n   * @typedef {import('../../../model/Types').Element} Element\n   */\n\n  var DEFAULT_FLOW = 'default',\n      ID = 'id',\n      DI = 'di';\n\n  var NULL_DIMENSIONS$1 = {\n    width: 0,\n    height: 0\n  };\n\n  /**\n   * A handler that implements a BPMN 2.0 property update.\n   *\n   * This should be used to set simple properties on elements with\n   * an underlying BPMN business object.\n   *\n   * Use respective diagram-js provided handlers if you would\n   * like to perform automated modeling.\n   *\n   * @implements {CommandHandler}\n   *\n   * @param {ElementRegistry} elementRegistry\n   * @param {Moddle} moddle\n   * @param {Translate} translate\n   * @param {Modeling} modeling\n   * @param {TextRenderer} textRenderer\n   */\n  function UpdatePropertiesHandler(\n      elementRegistry, moddle, translate,\n      modeling, textRenderer) {\n\n    this._elementRegistry = elementRegistry;\n    this._moddle = moddle;\n    this._translate = translate;\n    this._modeling = modeling;\n    this._textRenderer = textRenderer;\n  }\n\n  UpdatePropertiesHandler.$inject = [\n    'elementRegistry',\n    'moddle',\n    'translate',\n    'modeling',\n    'textRenderer'\n  ];\n\n\n  // api //////////////////////\n\n  /**\n   * Update a BPMN element's properties.\n   *\n   * @param { {\n   *   element: Element;\n   *   properties: Record<string, any>;\n   * } & CommandContext } context\n   *\n   * @return {Element[]}\n   */\n  UpdatePropertiesHandler.prototype.execute = function(context) {\n\n    var element = context.element,\n        changed = [ element ],\n        translate = this._translate;\n\n    if (!element) {\n      throw new Error(translate('element required'));\n    }\n\n    var elementRegistry = this._elementRegistry,\n        ids = this._moddle.ids;\n\n    var businessObject = element.businessObject,\n        properties = unwrapBusinessObjects(context.properties),\n        oldProperties = context.oldProperties || getProperties(element, properties);\n\n    if (isIdChange(properties, businessObject)) {\n      ids.unclaim(businessObject[ID]);\n\n      elementRegistry.updateId(element, properties[ID]);\n\n      ids.claim(properties[ID], businessObject);\n    }\n\n    // correctly indicate visual changes on default flow updates\n    if (DEFAULT_FLOW in properties) {\n\n      if (properties[DEFAULT_FLOW]) {\n        changed.push(elementRegistry.get(properties[DEFAULT_FLOW].id));\n      }\n\n      if (businessObject[DEFAULT_FLOW]) {\n        changed.push(elementRegistry.get(businessObject[DEFAULT_FLOW].id));\n      }\n    }\n\n    // update properties\n    setProperties(element, properties);\n\n    // store old values\n    context.oldProperties = oldProperties;\n    context.changed = changed;\n\n    // indicate changed on objects affected by the update\n    return changed;\n  };\n\n\n  UpdatePropertiesHandler.prototype.postExecute = function(context) {\n    var element = context.element,\n        label = element.label;\n\n    var text = label && getBusinessObject(label).name;\n\n    if (!text) {\n      return;\n    }\n\n    // get layouted text bounds and resize external\n    // external label accordingly\n    var newLabelBounds = this._textRenderer.getExternalLabelBounds(label, text);\n\n    this._modeling.resizeShape(label, newLabelBounds, NULL_DIMENSIONS$1);\n  };\n\n  /**\n   * Revert updating a BPMN element's properties.\n   *\n   * @param { {\n   *   element: Element;\n   *   properties: Record<string, any>;\n   *   oldProperties: Record<string, any>;\n   * } & CommandContext } context\n   *\n   * @return {Element[]}\n   */\n  UpdatePropertiesHandler.prototype.revert = function(context) {\n\n    var element = context.element,\n        properties = context.properties,\n        oldProperties = context.oldProperties,\n        businessObject = element.businessObject,\n        elementRegistry = this._elementRegistry,\n        ids = this._moddle.ids;\n\n    // update properties\n    setProperties(element, oldProperties);\n\n    if (isIdChange(properties, businessObject)) {\n      ids.unclaim(properties[ID]);\n\n      elementRegistry.updateId(element, oldProperties[ID]);\n\n      ids.claim(oldProperties[ID], businessObject);\n    }\n\n    return context.changed;\n  };\n\n\n  function isIdChange(properties, businessObject) {\n    return ID in properties && properties[ID] !== businessObject[ID];\n  }\n\n\n  function getProperties(element, properties) {\n    var propertyNames = keys(properties),\n        businessObject = element.businessObject,\n        di = getDi(element);\n\n    return reduce(propertyNames, function(result, key) {\n\n      // handle DI separately\n      if (key !== DI) {\n        result[key] = businessObject.get(key);\n\n      } else {\n        result[key] = getDiProperties(di, keys(properties.di));\n      }\n\n      return result;\n    }, {});\n  }\n\n\n  function getDiProperties(di, propertyNames) {\n    return reduce(propertyNames, function(result, key) {\n      result[key] = di && di.get(key);\n\n      return result;\n    }, {});\n  }\n\n\n  function setProperties(element, properties) {\n    var businessObject = element.businessObject,\n        di = getDi(element);\n\n    forEach$1(properties, function(value, key) {\n\n      if (key !== DI) {\n        businessObject.set(key, value);\n      } else {\n\n        // only update, if di exists\n        if (di) {\n          setDiProperties(di, value);\n        }\n      }\n    });\n  }\n\n\n  function setDiProperties(di, properties) {\n    forEach$1(properties, function(value, key) {\n      di.set(key, value);\n    });\n  }\n\n\n  var referencePropertyNames = [ 'default' ];\n\n  /**\n   * Make sure we unwrap the actual business object behind diagram element that\n   * may have been passed as arguments.\n   *\n   * @param  {Record<string, any>} properties\n   *\n   * @return {Record<string, any>} unwrappedProps\n   */\n  function unwrapBusinessObjects(properties) {\n\n    var unwrappedProps = assign$1({}, properties);\n\n    referencePropertyNames.forEach(function(name) {\n      if (name in properties) {\n        unwrappedProps[name] = getBusinessObject(unwrappedProps[name]);\n      }\n    });\n\n    return unwrappedProps;\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/command/CommandHandler').default} CommandHandler\n   *\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('../Modeling').default} Modeling\n   */\n\n  /**\n   * @implements {CommandHandler}\n   *\n   * @param {Canvas} canvas\n   * @param {Modeling} modeling\n   */\n  function UpdateCanvasRootHandler(canvas, modeling) {\n    this._canvas = canvas;\n    this._modeling = modeling;\n  }\n\n  UpdateCanvasRootHandler.$inject = [\n    'canvas',\n    'modeling'\n  ];\n\n\n  UpdateCanvasRootHandler.prototype.execute = function(context) {\n\n    var canvas = this._canvas;\n\n    var newRoot = context.newRoot,\n        newRootBusinessObject = newRoot.businessObject,\n        oldRoot = canvas.getRootElement(),\n        oldRootBusinessObject = oldRoot.businessObject,\n        bpmnDefinitions = oldRootBusinessObject.$parent,\n        diPlane = getDi(oldRoot);\n\n    // (1) replace process old <> new root\n    canvas.setRootElement(newRoot);\n    canvas.removeRootElement(oldRoot);\n\n    // (2) update root elements\n    add(bpmnDefinitions.rootElements, newRootBusinessObject);\n    newRootBusinessObject.$parent = bpmnDefinitions;\n\n    remove(bpmnDefinitions.rootElements, oldRootBusinessObject);\n    oldRootBusinessObject.$parent = null;\n\n    // (3) wire di\n    oldRoot.di = null;\n\n    diPlane.bpmnElement = newRootBusinessObject;\n    newRoot.di = diPlane;\n\n    context.oldRoot = oldRoot;\n\n    // TODO(nikku): return changed elements?\n    // return [ newRoot, oldRoot ];\n    return [];\n  };\n\n\n  UpdateCanvasRootHandler.prototype.revert = function(context) {\n\n    var canvas = this._canvas;\n\n    var newRoot = context.newRoot,\n        newRootBusinessObject = newRoot.businessObject,\n        oldRoot = context.oldRoot,\n        oldRootBusinessObject = oldRoot.businessObject,\n        bpmnDefinitions = newRootBusinessObject.$parent,\n        diPlane = getDi(newRoot);\n\n    // (1) replace process old <> new root\n    canvas.setRootElement(oldRoot);\n    canvas.removeRootElement(newRoot);\n\n    // (2) update root elements\n    remove(bpmnDefinitions.rootElements, newRootBusinessObject);\n    newRootBusinessObject.$parent = null;\n\n    add(bpmnDefinitions.rootElements, oldRootBusinessObject);\n    oldRootBusinessObject.$parent = bpmnDefinitions;\n\n    // (3) wire di\n    newRoot.di = null;\n\n    diPlane.bpmnElement = oldRootBusinessObject;\n    oldRoot.di = diPlane;\n\n    // TODO(nikku): return changed elements?\n    // return [ newRoot, oldRoot ];\n\n    return [];\n  };\n\n  /**\n   * @typedef {import('diagram-js/lib/command/CommandHandler').default} CommandHandler\n   *\n   * @typedef {import('../Modeling').default} Modeling\n   * @typedef {import('../../space-tool/BpmnSpaceTool').default} SpaceTool\n   */\n\n  /**\n   * A handler that allows us to add a new lane\n   * above or below an existing one.\n   *\n   * @implements {CommandHandler}\n   *\n   * @param {Modeling} modeling\n   * @param {SpaceTool} spaceTool\n   */\n  function AddLaneHandler(modeling, spaceTool) {\n    this._modeling = modeling;\n    this._spaceTool = spaceTool;\n  }\n\n  AddLaneHandler.$inject = [\n    'modeling',\n    'spaceTool'\n  ];\n\n\n  AddLaneHandler.prototype.preExecute = function(context) {\n\n    var spaceTool = this._spaceTool,\n        modeling = this._modeling;\n\n    var shape = context.shape,\n        location = context.location;\n\n    var lanesRoot = getLanesRoot(shape);\n\n    var isRoot = lanesRoot === shape,\n        laneParent = isRoot ? shape : shape.parent;\n\n    var existingChildLanes = getChildLanes(laneParent);\n\n    // (0) add a lane if we currently got none and are adding to root\n    if (!existingChildLanes.length) {\n      modeling.createShape({ type: 'bpmn:Lane' }, {\n        x: shape.x + LANE_INDENTATION,\n        y: shape.y,\n        width: shape.width - LANE_INDENTATION,\n        height: shape.height\n      }, laneParent);\n    }\n\n    // (1) collect affected elements to create necessary space\n    var allAffected = [];\n\n    eachElement(lanesRoot, function(element) {\n      allAffected.push(element);\n\n      // handle element labels in the diagram root\n      if (element.label) {\n        allAffected.push(element.label);\n      }\n\n      if (element === shape) {\n        return [];\n      }\n\n      return filter(element.children, function(c) {\n        return c !== shape;\n      });\n    });\n\n    var offset = location === 'top' ? -120 : 120,\n        lanePosition = location === 'top' ? shape.y : shape.y + shape.height,\n        spacePos = lanePosition + (location === 'top' ? 10 : -10),\n        direction = location === 'top' ? 'n' : 's';\n\n    var adjustments = spaceTool.calculateAdjustments(allAffected, 'y', offset, spacePos);\n\n    spaceTool.makeSpace(\n      adjustments.movingShapes,\n      adjustments.resizingShapes,\n      { x: 0, y: offset },\n      direction,\n      spacePos\n    );\n\n    // (2) create new lane at open space\n    context.newLane = modeling.createShape({ type: 'bpmn:Lane' }, {\n      x: shape.x + (isRoot ? LANE_INDENTATION : 0),\n      y: lanePosition - (location === 'top' ? 120 : 0),\n      width: shape.width - (isRoot ? LANE_INDENTATION : 0),\n      height: 120\n    }, laneParent);\n  };\n\n  /**\n   * @typedef {import('diagram-js/lib/command/CommandHandler').default} CommandHandler\n   *\n   * @typedef {import('../Modeling').default} Modeling\n   * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n   */\n\n  /**\n   * A handler that splits a lane into a number of sub-lanes,\n   * creating new sub lanes, if necessary.\n   *\n   * @implements {CommandHandler}\n   *\n   * @param {Modeling} modeling\n   * @param {Translate} translate\n   */\n  function SplitLaneHandler(modeling, translate) {\n    this._modeling = modeling;\n    this._translate = translate;\n  }\n\n  SplitLaneHandler.$inject = [\n    'modeling',\n    'translate'\n  ];\n\n\n  SplitLaneHandler.prototype.preExecute = function(context) {\n\n    var modeling = this._modeling,\n        translate = this._translate;\n\n    var shape = context.shape,\n        newLanesCount = context.count;\n\n    var childLanes = getChildLanes(shape),\n        existingLanesCount = childLanes.length;\n\n    if (existingLanesCount > newLanesCount) {\n      throw new Error(translate('more than {count} child lanes', { count: newLanesCount }));\n    }\n\n    var newLanesHeight = Math.round(shape.height / newLanesCount);\n\n    // Iterate from top to bottom in child lane order,\n    // resizing existing lanes and creating new ones\n    // so that they split the parent proportionally.\n    //\n    // Due to rounding related errors, the bottom lane\n    // needs to take up all the remaining space.\n    var laneY,\n        laneHeight,\n        laneBounds,\n        newLaneAttrs,\n        idx;\n\n    for (idx = 0; idx < newLanesCount; idx++) {\n\n      laneY = shape.y + idx * newLanesHeight;\n\n      // if bottom lane\n      if (idx === newLanesCount - 1) {\n        laneHeight = shape.height - (newLanesHeight * idx);\n      } else {\n        laneHeight = newLanesHeight;\n      }\n\n      laneBounds = {\n        x: shape.x + LANE_INDENTATION,\n        y: laneY,\n        width: shape.width - LANE_INDENTATION,\n        height: laneHeight\n      };\n\n      if (idx < existingLanesCount) {\n\n        // resize existing lane\n        modeling.resizeShape(childLanes[idx], laneBounds);\n      } else {\n\n        // create a new lane at position\n        newLaneAttrs = {\n          type: 'bpmn:Lane'\n        };\n\n        modeling.createShape(newLaneAttrs, laneBounds, shape);\n      }\n    }\n  };\n\n  /**\n   * @typedef {import('diagram-js/lib/command/CommandHandler').default} CommandHandler\n   *\n   * @typedef {import('../Modeling').default} Modeling\n   * @typedef {import('../../space-tool/BpmnSpaceTool').default} SpaceTool\n   *\n   * @typedef {import('../../../model/Types').Shape} Shape\n   *\n   * @typedef {import('diagram-js/lib/util/Types').Rect} Rect\n   */\n\n  /**\n   * A handler that resizes a lane.\n   *\n   * @implements {CommandHandler}\n   *\n   * @param {Modeling} modeling\n   * @param {SpaceTool} spaceTool\n   */\n  function ResizeLaneHandler(modeling, spaceTool) {\n    this._modeling = modeling;\n    this._spaceTool = spaceTool;\n  }\n\n  ResizeLaneHandler.$inject = [\n    'modeling',\n    'spaceTool'\n  ];\n\n\n  ResizeLaneHandler.prototype.preExecute = function(context) {\n\n    var shape = context.shape,\n        newBounds = context.newBounds,\n        balanced = context.balanced;\n\n    if (balanced !== false) {\n      this.resizeBalanced(shape, newBounds);\n    } else {\n      this.resizeSpace(shape, newBounds);\n    }\n  };\n\n\n  /**\n   * Resize balanced, adjusting next / previous lane sizes.\n   *\n   * @param {Shape} shape\n   * @param {Rect} newBounds\n   */\n  ResizeLaneHandler.prototype.resizeBalanced = function(shape, newBounds) {\n\n    var modeling = this._modeling;\n\n    var resizeNeeded = computeLanesResize(shape, newBounds);\n\n    // resize the lane\n    modeling.resizeShape(shape, newBounds);\n\n    // resize other lanes as needed\n    resizeNeeded.forEach(function(r) {\n      modeling.resizeShape(r.shape, r.newBounds);\n    });\n  };\n\n\n  /**\n   * Resize, making actual space and moving below / above elements.\n   *\n   * @param {Shape} shape\n   * @param {Rect} newBounds\n   */\n  ResizeLaneHandler.prototype.resizeSpace = function(shape, newBounds) {\n    var spaceTool = this._spaceTool;\n\n    var shapeTrbl = asTRBL(shape),\n        newTrbl = asTRBL(newBounds);\n\n    var trblDiff = substractTRBL(newTrbl, shapeTrbl);\n\n    var lanesRoot = getLanesRoot(shape);\n\n    var allAffected = [],\n        allLanes = [];\n\n    eachElement(lanesRoot, function(element) {\n      allAffected.push(element);\n\n      if (is$1(element, 'bpmn:Lane') || is$1(element, 'bpmn:Participant')) {\n        allLanes.push(element);\n      }\n\n      return element.children;\n    });\n\n    var change,\n        spacePos,\n        direction,\n        offset,\n        adjustments;\n\n    if (trblDiff.bottom || trblDiff.top) {\n\n      change = trblDiff.bottom || trblDiff.top;\n      spacePos = shape.y + (trblDiff.bottom ? shape.height : 0) + (trblDiff.bottom ? -10 : 10);\n      direction = trblDiff.bottom ? 's' : 'n';\n\n      offset = trblDiff.top > 0 || trblDiff.bottom < 0 ? -change : change;\n\n      adjustments = spaceTool.calculateAdjustments(allAffected, 'y', offset, spacePos);\n\n      spaceTool.makeSpace(adjustments.movingShapes, adjustments.resizingShapes, { x: 0, y: change }, direction);\n    }\n\n\n    if (trblDiff.left || trblDiff.right) {\n\n      change = trblDiff.right || trblDiff.left;\n      spacePos = shape.x + (trblDiff.right ? shape.width : 0) + (trblDiff.right ? -10 : 100);\n      direction = trblDiff.right ? 'e' : 'w';\n\n      offset = trblDiff.left > 0 || trblDiff.right < 0 ? -change : change;\n\n      adjustments = spaceTool.calculateAdjustments(allLanes, 'x', offset, spacePos);\n\n      spaceTool.makeSpace(adjustments.movingShapes, adjustments.resizingShapes, { x: change, y: 0 }, direction);\n    }\n  };\n\n  /**\n   * @typedef {import('diagram-js/lib/command/CommandHandler').default} CommandHandler\n   *\n   * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n   *\n   * @typedef {import('../../../model/Types').Shape} Shape\n   */\n\n  var FLOW_NODE_REFS_ATTR = 'flowNodeRef',\n      LANES_ATTR = 'lanes';\n\n\n  /**\n   * A handler that updates lane refs on changed elements.\n   *\n   * @implements {CommandHandler}\n   *\n   * @param {ElementRegistry} elementRegistry\n   */\n  function UpdateFlowNodeRefsHandler(elementRegistry) {\n    this._elementRegistry = elementRegistry;\n  }\n\n  UpdateFlowNodeRefsHandler.$inject = [\n    'elementRegistry'\n  ];\n\n  /**\n   * @param {Shape} flowNodeShapes\n   * @param {Shape} laneShapes\n   *\n   * @return { {\n   *   flowNode: Shape;\n   *   add: Shape[];\n   *   remove: Shape[];\n   * }[] }\n   */\n  UpdateFlowNodeRefsHandler.prototype._computeUpdates = function(flowNodeShapes, laneShapes) {\n\n    var handledNodes = [];\n\n    var updates = [];\n\n    var participantCache = {};\n\n    var allFlowNodeShapes = [];\n\n    function isInLaneShape(element, laneShape) {\n\n      var laneTrbl = asTRBL(laneShape);\n\n      var elementMid = {\n        x: element.x + element.width / 2,\n        y: element.y + element.height / 2\n      };\n\n      return elementMid.x > laneTrbl.left &&\n             elementMid.x < laneTrbl.right &&\n             elementMid.y > laneTrbl.top &&\n             elementMid.y < laneTrbl.bottom;\n    }\n\n    function addFlowNodeShape(flowNodeShape) {\n      if (handledNodes.indexOf(flowNodeShape) === -1) {\n        allFlowNodeShapes.push(flowNodeShape);\n        handledNodes.push(flowNodeShape);\n      }\n    }\n\n    function getAllLaneShapes(flowNodeShape) {\n\n      var root = getLanesRoot(flowNodeShape);\n\n      if (!participantCache[root.id]) {\n        participantCache[root.id] = collectLanes(root);\n      }\n\n      return participantCache[root.id];\n    }\n\n    function getNewLanes(flowNodeShape) {\n      if (!flowNodeShape.parent) {\n        return [];\n      }\n\n      var allLaneShapes = getAllLaneShapes(flowNodeShape);\n\n      return allLaneShapes.filter(function(l) {\n        return isInLaneShape(flowNodeShape, l);\n      }).map(function(shape) {\n        return shape.businessObject;\n      });\n    }\n\n    laneShapes.forEach(function(laneShape) {\n      var root = getLanesRoot(laneShape);\n\n      if (!root || handledNodes.indexOf(root) !== -1) {\n        return;\n      }\n\n      var children = root.children.filter(function(c) {\n        return is$1(c, 'bpmn:FlowNode');\n      });\n\n      children.forEach(addFlowNodeShape);\n\n      handledNodes.push(root);\n    });\n\n    flowNodeShapes.forEach(addFlowNodeShape);\n\n\n    allFlowNodeShapes.forEach(function(flowNodeShape) {\n\n      var flowNode = flowNodeShape.businessObject;\n\n      var lanes = flowNode.get(LANES_ATTR),\n          remove = lanes.slice(),\n          add = getNewLanes(flowNodeShape);\n\n      updates.push({ flowNode: flowNode, remove: remove, add: add });\n    });\n\n    laneShapes.forEach(function(laneShape) {\n\n      var lane = laneShape.businessObject;\n\n      // lane got removed XX-)\n      if (!laneShape.parent) {\n        lane.get(FLOW_NODE_REFS_ATTR).forEach(function(flowNode) {\n          updates.push({ flowNode: flowNode, remove: [ lane ], add: [] });\n        });\n      }\n    });\n\n    return updates;\n  };\n\n  UpdateFlowNodeRefsHandler.prototype.execute = function(context) {\n\n    var updates = context.updates;\n\n    if (!updates) {\n      updates = context.updates = this._computeUpdates(context.flowNodeShapes, context.laneShapes);\n    }\n\n\n    updates.forEach(function(update) {\n\n      var flowNode = update.flowNode,\n          lanes = flowNode.get(LANES_ATTR);\n\n      // unwire old\n      update.remove.forEach(function(oldLane) {\n        remove(lanes, oldLane);\n        remove(oldLane.get(FLOW_NODE_REFS_ATTR), flowNode);\n      });\n\n      // wire new\n      update.add.forEach(function(newLane) {\n        add(lanes, newLane);\n        add(newLane.get(FLOW_NODE_REFS_ATTR), flowNode);\n      });\n    });\n\n    // TODO(nikku): return changed elements\n    // return [ ... ];\n\n    return [];\n  };\n\n\n  UpdateFlowNodeRefsHandler.prototype.revert = function(context) {\n\n    var updates = context.updates;\n\n    updates.forEach(function(update) {\n\n      var flowNode = update.flowNode,\n          lanes = flowNode.get(LANES_ATTR);\n\n      // unwire new\n      update.add.forEach(function(newLane) {\n        remove(lanes, newLane);\n        remove(newLane.get(FLOW_NODE_REFS_ATTR), flowNode);\n      });\n\n      // wire old\n      update.remove.forEach(function(oldLane) {\n        add(lanes, oldLane);\n        add(oldLane.get(FLOW_NODE_REFS_ATTR), flowNode);\n      });\n    });\n\n    // TODO(nikku): return changed elements\n    // return [ ... ];\n\n    return [];\n  };\n\n  /**\n   * @typedef {import('diagram-js/lib/command/CommandHandler').default} CommandHandler\n   *\n   * @typedef {import('../../../model/Types').Moddle} Moddle\n   */\n\n  /**\n   * @implements {CommandHandler}\n   *\n   * @param {Moddle} moddle\n   */\n  function IdClaimHandler(moddle) {\n    this._moddle = moddle;\n  }\n\n  IdClaimHandler.$inject = [ 'moddle' ];\n\n\n  IdClaimHandler.prototype.execute = function(context) {\n    var ids = this._moddle.ids,\n        id = context.id,\n        element = context.element,\n        claiming = context.claiming;\n\n    if (claiming) {\n      ids.claim(id, element);\n    } else {\n      ids.unclaim(id);\n    }\n\n    return [];\n  };\n\n  /**\n   * Command revert implementation.\n   */\n  IdClaimHandler.prototype.revert = function(context) {\n    var ids = this._moddle.ids,\n        id = context.id,\n        element = context.element,\n        claiming = context.claiming;\n\n    if (claiming) {\n      ids.unclaim(id);\n    } else {\n      ids.claim(id, element);\n    }\n\n    return [];\n  };\n\n  /**\r\n   * @typedef {import('diagram-js/lib/command/CommandHandler').default} CommandHandler\r\n   *\r\n   * @typedef {import('diagram-js/lib/command/CommandStack').default} CommandStack\r\n   *\r\n   * @typedef {import('../../../model/Types').ModdleElement} ModdleElement\r\n   */\r\n\r\n  var DEFAULT_COLORS = {\r\n    fill: undefined,\r\n    stroke: undefined\r\n  };\r\n\r\n  /**\r\n   * @implements {CommandHandler}\r\n   *\r\n   * @param {CommandStack} commandStack\r\n   */\r\n  function SetColorHandler(commandStack) {\r\n    this._commandStack = commandStack;\r\n\r\n    this._normalizeColor = function(color) {\r\n\r\n      // Remove color for falsy values.\r\n      if (!color) {\r\n        return undefined;\r\n      }\r\n\r\n      if (isString(color)) {\r\n        var hexColor = colorToHex(color);\r\n\r\n        if (hexColor) {\r\n          return hexColor;\r\n        }\r\n      }\r\n\r\n      throw new Error('invalid color value: ' + color);\r\n    };\r\n  }\r\n\r\n  SetColorHandler.$inject = [\r\n    'commandStack'\r\n  ];\r\n\r\n\r\n  SetColorHandler.prototype.postExecute = function(context) {\r\n    var elements = context.elements,\r\n        colors = context.colors || DEFAULT_COLORS;\r\n\r\n    var self = this;\r\n\r\n    var di = {};\r\n\r\n    if ('fill' in colors) {\r\n      assign$1(di, {\r\n        'background-color': this._normalizeColor(colors.fill) });\r\n    }\r\n\r\n    if ('stroke' in colors) {\r\n      assign$1(di, {\r\n        'border-color': this._normalizeColor(colors.stroke) });\r\n    }\r\n\r\n    forEach$1(elements, function(element) {\r\n      var assignedDi = isConnection(element) ? pick(di, [ 'border-color' ]) : di,\r\n          elementDi = getDi(element);\r\n\r\n      // TODO @barmac: remove once we drop bpmn.io properties\r\n      ensureLegacySupport(assignedDi);\r\n\r\n      if (isLabel(element)) {\r\n\r\n        // set label colors as bpmndi:BPMNLabel#color\r\n        self._commandStack.execute('element.updateModdleProperties', {\r\n          element: element,\r\n          moddleElement: elementDi.label,\r\n          properties: {\r\n            color: di['border-color']\r\n          }\r\n        });\r\n      } else {\r\n\r\n        // ignore non-compliant di\r\n        if (!isAny(elementDi, [ 'bpmndi:BPMNEdge', 'bpmndi:BPMNShape' ])) {\r\n          return;\r\n        }\r\n\r\n        // set colors bpmndi:BPMNEdge or bpmndi:BPMNShape\r\n        self._commandStack.execute('element.updateProperties', {\r\n          element: element,\r\n          properties: {\r\n            di: assignedDi\r\n          }\r\n        });\r\n      }\r\n    });\r\n\r\n  };\r\n\r\n  /**\r\n   * Convert color from rgb(a)/hsl to hex. Returns `null` for unknown color names\r\n   * and for colors with alpha less than 1.0. This depends on `<canvas>`\r\n   * serialization of the `context.fillStyle`.\r\n   * Cf. https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-fillstyle\r\n   *\r\n   * @example\r\n   *\r\n   * ```javascript\r\n   * colorToHex('fuchsia'); // \"#ff00ff\"\r\n   *\r\n   * colorToHex('rgba(1, 2, 3, 0.4)'); // null\r\n   * ```\r\n   *\r\n   * @param {string} color\r\n   *\r\n   * @return {string|null}\r\n   */\r\n  function colorToHex(color) {\r\n    var context = document.createElement('canvas').getContext('2d');\r\n\r\n    // (0) Start with transparent to account for browser default values.\r\n    context.fillStyle = 'transparent';\r\n\r\n    // (1) Assign color so that it's serialized.\r\n    context.fillStyle = color;\r\n\r\n    // (2) Return null for non-hex serialization result.\r\n    return /^#[0-9a-fA-F]{6}$/.test(context.fillStyle) ? context.fillStyle : null;\r\n  }\r\n\r\n  /**\r\n   * Add legacy properties if required.\r\n   *\r\n   * @param {ModdleElement} di\r\n   */\r\n  function ensureLegacySupport(di) {\r\n    if ('border-color' in di) {\r\n      di.stroke = di['border-color'];\r\n    }\r\n\r\n    if ('background-color' in di) {\r\n      di.fill = di['background-color'];\r\n    }\r\n  }\n\n  var NULL_DIMENSIONS = {\n    width: 0,\n    height: 0\n  };\n\n  /**\n   * @typedef {import('../../modeling/Modeling').default} Modeling\n   * @typedef {import('../../../draw/TextRenderer').default} TextRenderer\n   * @typedef {import('../../modeling/BpmnFactory').default} BpmnFactory\n   *\n   * @typedef {import('../../../model/Types').Element} Element\n   */\n\n  /**\n   * A handler that updates the text of a BPMN element.\n   *\n   * @param {Modeling} modeling\n   * @param {TextRenderer} textRenderer\n   * @param {BpmnFactory} bpmnFactory\n   */\n  function UpdateLabelHandler(modeling, textRenderer, bpmnFactory) {\n\n    /**\n     * Set the label and return the changed elements.\n     *\n     * Element parameter can be label itself or connection (i.e. sequence flow).\n     *\n     * @param {Element} element\n     * @param {string} text\n     */\n    function setText(element, text) {\n\n      // external label if present\n      var label = element.label || element;\n\n      var labelTarget = element.labelTarget || element;\n\n      setLabel(label, text);\n\n      return [ label, labelTarget ];\n    }\n\n    function preExecute(ctx) {\n      var element = ctx.element,\n          businessObject = element.businessObject,\n          newLabel = ctx.newLabel;\n\n      if (!isLabel(element)\n          && isLabelExternal(element)\n          && !hasExternalLabel(element)\n          && !isEmptyText(newLabel)) {\n\n        // create label\n        var paddingTop = 7;\n\n        var labelCenter = getExternalLabelMid(element);\n\n        labelCenter = {\n          x: labelCenter.x,\n          y: labelCenter.y + paddingTop\n        };\n\n        modeling.createLabel(element, labelCenter, {\n          id: businessObject.id + '_label',\n          businessObject: businessObject,\n          di: element.di\n        });\n      }\n    }\n\n    function execute(ctx) {\n      ctx.oldLabel = getLabel(ctx.element);\n      return setText(ctx.element, ctx.newLabel);\n    }\n\n    function revert(ctx) {\n      return setText(ctx.element, ctx.oldLabel);\n    }\n\n    function postExecute(ctx) {\n      var element = ctx.element,\n          label = element.label || element,\n          newLabel = ctx.newLabel,\n          newBounds = ctx.newBounds,\n          hints = ctx.hints || {};\n\n      // ignore internal labels for elements except text annotations\n      if (!isLabel(label) && !is$1(label, 'bpmn:TextAnnotation')) {\n        return;\n      }\n\n      if (isLabel(label) && isEmptyText(newLabel)) {\n\n        if (hints.removeShape !== false) {\n          modeling.removeShape(label, { unsetLabel: false });\n        }\n\n        return;\n      }\n\n      var text = getLabel(element);\n\n      // resize element based on label _or_ pre-defined bounds\n      if (typeof newBounds === 'undefined') {\n        newBounds = textRenderer.getExternalLabelBounds(label, text);\n      }\n\n      // setting newBounds to false or _null_ will\n      // disable the postExecute resize operation\n      if (newBounds) {\n        modeling.resizeShape(label, newBounds, NULL_DIMENSIONS);\n      }\n    }\n\n    // API\n\n    this.preExecute = preExecute;\n    this.execute = execute;\n    this.revert = revert;\n    this.postExecute = postExecute;\n  }\n\n  UpdateLabelHandler.$inject = [\n    'modeling',\n    'textRenderer',\n    'bpmnFactory'\n  ];\n\n\n  // helpers //////////\n\n  function isEmptyText(label) {\n    return !label || !label.trim();\n  }\n\n  /**\n   * @typedef {import('../rules/BpmnRules').default} BpmnRules\n   * @typedef {import('diagram-js/lib/command/CommandStack').default} CommandStack\n   * @typedef {import('./ElementFactory').default} ElementFactory\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   *\n   * @typedef {import('diagram-js/lib/features/modeling/Modeling').ModelingHints} ModelingHints\n   *\n   * @typedef {import('../../model/Types').Connection} Connection\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Label} Label\n   * @typedef {import('../../model/Types').Parent} Parent\n   * @typedef {import('../../model/Types').Root} Root\n   * @typedef {import('../../model/Types').Shape} Shape\n   * @typedef {import('../../model/Types').ModdleElement} ModdleElement\n   *\n   * @typedef {import('diagram-js/lib/util/Types').Rect} Rect\n   *\n   * @typedef {import('../../util/Types').Colors} Colors\n   *\n   * @typedef { {\n   *   removeShape?: boolean;\n   * } } UpdateLabelHints\n   */\n\n  /**\n   * The BPMN 2.0 modeling entry point.\n   *\n   * @template {Connection} [T=Connection]\n   * @template {Element} [U=Element]\n   * @template {Label} [V=Label]\n   * @template {Parent} [W=Parent]\n   * @template {Shape} [X=Shape]\n   *\n   * @extends {BaseModeling<T, U, V, W, X>}\n   *\n   * @param {EventBus} eventBus\n   * @param {ElementFactory} elementFactory\n   * @param {CommandStack} commandStack\n   * @param {BpmnRules} bpmnRules\n   */\n  function Modeling(\n      eventBus,\n      elementFactory,\n      commandStack,\n      bpmnRules\n  ) {\n\n    Modeling$1.call(this, eventBus, elementFactory, commandStack);\n\n    this._bpmnRules = bpmnRules;\n  }\n\n  e$3(Modeling, Modeling$1);\n\n  Modeling.$inject = [\n    'eventBus',\n    'elementFactory',\n    'commandStack',\n    'bpmnRules'\n  ];\n\n\n  Modeling.prototype.getHandlers = function() {\n    var handlers = Modeling$1.prototype.getHandlers.call(this);\n\n    handlers['element.updateModdleProperties'] = UpdateModdlePropertiesHandler;\n    handlers['element.updateProperties'] = UpdatePropertiesHandler;\n    handlers['canvas.updateRoot'] = UpdateCanvasRootHandler;\n    handlers['lane.add'] = AddLaneHandler;\n    handlers['lane.resize'] = ResizeLaneHandler;\n    handlers['lane.split'] = SplitLaneHandler;\n    handlers['lane.updateRefs'] = UpdateFlowNodeRefsHandler;\n    handlers['id.updateClaim'] = IdClaimHandler;\n    handlers['element.setColor'] = SetColorHandler;\n    handlers['element.updateLabel'] = UpdateLabelHandler;\n\n    return handlers;\n  };\n\n  /**\n   * Update an element's label.\n   *\n   * @param {Element} element The element.\n   * @param {string} newLabel The new label.\n   * @param {Rect} [newBounds] The optional bounds of the label.\n   * @param {UpdateLabelHints} [hints] The optional hints.\n   */\n  Modeling.prototype.updateLabel = function(element, newLabel, newBounds, hints) {\n    this._commandStack.execute('element.updateLabel', {\n      element: element,\n      newLabel: newLabel,\n      newBounds: newBounds,\n      hints: hints || {}\n    });\n  };\n\n  /**\n   * @param {Element} source\n   * @param {Element} target\n   * @param {Partial<Connection>} attrs\n   * @param {ModelingHints} [hints]\n   *\n   * @return {T}\n   */\n  Modeling.prototype.connect = function(source, target, attrs, hints) {\n\n    var bpmnRules = this._bpmnRules;\n\n    if (!attrs) {\n      attrs = bpmnRules.canConnect(source, target);\n    }\n\n    if (!attrs) {\n      return;\n    }\n\n    return this.createConnection(source, target, attrs, source.parent, hints);\n  };\n\n  /**\n   * Update a model element's properties.\n   *\n   * @param {Element} element The element.\n   * @param {ModdleElement} moddleElement The model element.\n   * @param {Object} properties The updated properties.\n   */\n  Modeling.prototype.updateModdleProperties = function(element, moddleElement, properties) {\n    this._commandStack.execute('element.updateModdleProperties', {\n      element: element,\n      moddleElement: moddleElement,\n      properties: properties\n    });\n  };\n\n  /**\n   * Update an element's properties.\n   *\n   * @param {Element} element The element.\n   * @param {Object} properties The updated properties.\n   */\n  Modeling.prototype.updateProperties = function(element, properties) {\n    this._commandStack.execute('element.updateProperties', {\n      element: element,\n      properties: properties\n    });\n  };\n\n  /**\n   * Resize a lane.\n   *\n   * @param {Shape} laneShape The lane.\n   * @param {Rect} newBounds The new bounds of the lane.\n   * @param {boolean} [balanced] Wether to resize neighboring lanes.\n   */\n  Modeling.prototype.resizeLane = function(laneShape, newBounds, balanced) {\n    this._commandStack.execute('lane.resize', {\n      shape: laneShape,\n      newBounds: newBounds,\n      balanced: balanced\n    });\n  };\n\n  /**\n   * Add a lane.\n   *\n   * @param {Shape} targetLaneShape The shape to add the lane to.\n   * @param {string} location The location.\n   *\n   * @return {Shape} The added lane.\n   */\n  Modeling.prototype.addLane = function(targetLaneShape, location) {\n    var context = {\n      shape: targetLaneShape,\n      location: location\n    };\n\n    this._commandStack.execute('lane.add', context);\n\n    return context.newLane;\n  };\n\n  /**\n   * Split a lane.\n   *\n   * @param {Shape} targetLane The lane to split.\n   * @param {number} count The number of lanes to split the lane into. Must not\n   * exceed the number of existing lanes.\n   */\n  Modeling.prototype.splitLane = function(targetLane, count) {\n    this._commandStack.execute('lane.split', {\n      shape: targetLane,\n      count: count\n    });\n  };\n\n  /**\n   * Turn a process into a collaboration.\n   *\n   * @return {Root} The root of the collaboration.\n   */\n  Modeling.prototype.makeCollaboration = function() {\n\n    var collaborationElement = this._create('root', {\n      type: 'bpmn:Collaboration'\n    });\n\n    var context = {\n      newRoot: collaborationElement\n    };\n\n    this._commandStack.execute('canvas.updateRoot', context);\n\n    return collaborationElement;\n  };\n\n  /**\n   * Transform a collaboration into a process.\n   *\n   * @return {Root} The root of the process.\n   */\n  Modeling.prototype.makeProcess = function() {\n\n    var processElement = this._create('root', {\n      type: 'bpmn:Process'\n    });\n\n    var context = {\n      newRoot: processElement\n    };\n\n    this._commandStack.execute('canvas.updateRoot', context);\n  };\n\n  /**\n   * Update the referenced lanes of each flow node.\n   *\n   * @param {Shape[]} flowNodeShapes The flow nodes to update.\n   * @param {Shape[]} laneShapes The lanes.\n   */\n  Modeling.prototype.updateLaneRefs = function(flowNodeShapes, laneShapes) {\n\n    this._commandStack.execute('lane.updateRefs', {\n      flowNodeShapes: flowNodeShapes,\n      laneShapes: laneShapes\n    });\n  };\n\n  /**\n   * Claim an ID.\n   *\n   * @param {string} id The ID to claim.\n   * @param {ModdleElement} moddleElement The model element the ID is claimed for.\n   */\n  Modeling.prototype.claimId = function(id, moddleElement) {\n    this._commandStack.execute('id.updateClaim', {\n      id: id,\n      element: moddleElement,\n      claiming: true\n    });\n  };\n\n  /**\n   * Unclaim an ID.\n   *\n   * @param {string} id The ID to unclaim.\n   * @param {ModdleElement} moddleElement The model element the ID is claimed for.\n   */\n  Modeling.prototype.unclaimId = function(id, moddleElement) {\n    this._commandStack.execute('id.updateClaim', {\n      id: id,\n      element: moddleElement\n    });\n  };\n\n  /**\n   * Set the color(s) of one or many elements.\n   *\n   * @param {Element[]} elements The elements to set the color(s) for.\n   * @param {Colors} colors The color(s) to set.\n   */\n  Modeling.prototype.setColor = function(elements, colors) {\n    if (!elements.length) {\n      elements = [ elements ];\n    }\n\n    this._commandStack.execute('element.setColor', {\n      elements: elements,\n      colors: colors\n    });\n  };\n\n  /**\n   * @typedef {import('../core/Types').ElementLike} Element\n   * @typedef {import('../core/Types').ConnectionLike} Connection\n   *\n   * @typedef {import('../util').Point} Point\n   *\n   * @typedef { {\n   *   connectionStart?: Point;\n   *   connectionEnd?: Point;\n   *   source?: Element;\n   *   target?: Element;\n   * } } LayoutConnectionHints\n   */\n\n\n  /**\n   * A base connection layouter implementation\n   * that layouts the connection by directly connecting\n   * mid(source) + mid(target).\n   */\n  function BaseLayouter() {}\n\n\n  /**\n   * Return the new layouted waypoints for the given connection.\n   *\n   * The connection passed is still unchanged; you may figure out about\n   * the new connection start / end via the layout hints provided.\n   *\n   * @param {Connection} connection\n   * @param {LayoutConnectionHints} [hints]\n   *\n   * @return {Point[]} The waypoints of the laid out connection.\n   */\n  BaseLayouter.prototype.layoutConnection = function(connection, hints) {\n\n    hints = hints || {};\n\n    return [\n      hints.connectionStart || getMid(hints.source || connection.source),\n      hints.connectionEnd || getMid(hints.target || connection.target)\n    ];\n  };\n\n  /**\n   * @typedef {import('../util/Types').Point} Point\n   * @typedef {import('../util/Types').Rect} Rect\n   */\n\n  var MIN_SEGMENT_LENGTH = 20,\n      POINT_ORIENTATION_PADDING = 5;\n\n  var round$1 = Math.round;\n\n  var INTERSECTION_THRESHOLD = 20,\n      ORIENTATION_THRESHOLD = {\n        'h:h': 20,\n        'v:v': 20,\n        'h:v': -10,\n        'v:h': -10\n      };\n\n  function needsTurn(orientation, startDirection) {\n    return !{\n      t: /top/,\n      r: /right/,\n      b: /bottom/,\n      l: /left/,\n      h: /./,\n      v: /./\n    }[startDirection].test(orientation);\n  }\n\n  function canLayoutStraight(direction, targetOrientation) {\n    return {\n      t: /top/,\n      r: /right/,\n      b: /bottom/,\n      l: /left/,\n      h: /left|right/,\n      v: /top|bottom/\n    }[direction].test(targetOrientation);\n  }\n\n  function getSegmentBendpoints(a, b, directions) {\n    var orientation = getOrientation(b, a, POINT_ORIENTATION_PADDING);\n\n    var startDirection = directions.split(':')[0];\n\n    var xmid = round$1((b.x - a.x) / 2 + a.x),\n        ymid = round$1((b.y - a.y) / 2 + a.y);\n\n    var segmentEnd, segmentDirections;\n\n    var layoutStraight = canLayoutStraight(startDirection, orientation),\n        layoutHorizontal = /h|r|l/.test(startDirection),\n        layoutTurn = false;\n\n    var turnNextDirections = false;\n\n    if (layoutStraight) {\n      segmentEnd = layoutHorizontal ? { x: xmid, y: a.y } : { x: a.x, y: ymid };\n\n      segmentDirections = layoutHorizontal ? 'h:h' : 'v:v';\n    } else {\n      layoutTurn = needsTurn(orientation, startDirection);\n\n      segmentDirections = layoutHorizontal ? 'h:v' : 'v:h';\n\n      if (layoutTurn) {\n\n        if (layoutHorizontal) {\n          turnNextDirections = ymid === a.y;\n\n          segmentEnd = {\n            x: a.x + MIN_SEGMENT_LENGTH * (/l/.test(startDirection) ? -1 : 1),\n            y: turnNextDirections ? ymid + MIN_SEGMENT_LENGTH : ymid\n          };\n        } else {\n          turnNextDirections = xmid === a.x;\n\n          segmentEnd = {\n            x: turnNextDirections ? xmid + MIN_SEGMENT_LENGTH : xmid,\n            y: a.y + MIN_SEGMENT_LENGTH * (/t/.test(startDirection) ? -1 : 1)\n          };\n        }\n\n      } else {\n        segmentEnd = {\n          x: xmid,\n          y: ymid\n        };\n      }\n    }\n\n    return {\n      waypoints: getBendpoints(a, segmentEnd, segmentDirections).concat(segmentEnd),\n      directions:  segmentDirections,\n      turnNextDirections: turnNextDirections\n    };\n  }\n\n  function getStartSegment(a, b, directions) {\n    return getSegmentBendpoints(a, b, directions);\n  }\n\n  function getEndSegment(a, b, directions) {\n    var invertedSegment = getSegmentBendpoints(b, a, invertDirections(directions));\n\n    return {\n      waypoints: invertedSegment.waypoints.slice().reverse(),\n      directions: invertDirections(invertedSegment.directions),\n      turnNextDirections: invertedSegment.turnNextDirections\n    };\n  }\n\n  function getMidSegment(startSegment, endSegment) {\n\n    var startDirection = startSegment.directions.split(':')[1],\n        endDirection = endSegment.directions.split(':')[0];\n\n    if (startSegment.turnNextDirections) {\n      startDirection = startDirection == 'h' ? 'v' : 'h';\n    }\n\n    if (endSegment.turnNextDirections) {\n      endDirection = endDirection == 'h' ? 'v' : 'h';\n    }\n\n    var directions = startDirection + ':' + endDirection;\n\n    var bendpoints = getBendpoints(\n      startSegment.waypoints[startSegment.waypoints.length - 1],\n      endSegment.waypoints[0],\n      directions\n    );\n\n    return {\n      waypoints: bendpoints,\n      directions: directions\n    };\n  }\n\n  function invertDirections(directions) {\n    return directions.split(':').reverse().join(':');\n  }\n\n  /**\n   * Handle simple layouts with maximum two bendpoints.\n   */\n  function getSimpleBendpoints(a, b, directions) {\n\n    var xmid = round$1((b.x - a.x) / 2 + a.x),\n        ymid = round$1((b.y - a.y) / 2 + a.y);\n\n    // one point, right or left from a\n    if (directions === 'h:v') {\n      return [ { x: b.x, y: a.y } ];\n    }\n\n    // one point, above or below a\n    if (directions === 'v:h') {\n      return [ { x: a.x, y: b.y } ];\n    }\n\n    // vertical segment between a and b\n    if (directions === 'h:h') {\n      return [\n        { x: xmid, y: a.y },\n        { x: xmid, y: b.y }\n      ];\n    }\n\n    // horizontal segment between a and b\n    if (directions === 'v:v') {\n      return [\n        { x: a.x, y: ymid },\n        { x: b.x, y: ymid }\n      ];\n    }\n\n    throw new Error('invalid directions: can only handle varians of [hv]:[hv]');\n  }\n\n\n  /**\n   * Returns the mid points for a manhattan connection between two points.\n   *\n   * @example h:h (horizontal:horizontal)\n   *\n   * [a]----[x]\n   *         |\n   *        [x]----[b]\n   *\n   * @example h:v (horizontal:vertical)\n   *\n   * [a]----[x]\n   *         |\n   *        [b]\n   *\n   * @example h:r (horizontal:right)\n   *\n   * [a]----[x]\n   *         |\n   *    [b]-[x]\n   *\n   * @param {Point} a\n   * @param {Point} b\n   * @param {string} directions\n   *\n   * @return {Point[]}\n   */\n  function getBendpoints(a, b, directions) {\n    directions = directions || 'h:h';\n\n    if (!isValidDirections(directions)) {\n      throw new Error(\n        'unknown directions: <' + directions + '>: ' +\n        'must be specified as <start>:<end> ' +\n        'with start/end in { h,v,t,r,b,l }'\n      );\n    }\n\n    // compute explicit directions, involving trbl dockings\n    // using a three segmented layouting algorithm\n    if (isExplicitDirections(directions)) {\n      var startSegment = getStartSegment(a, b, directions),\n          endSegment = getEndSegment(a, b, directions),\n          midSegment = getMidSegment(startSegment, endSegment);\n\n      return [].concat(\n        startSegment.waypoints,\n        midSegment.waypoints,\n        endSegment.waypoints\n      );\n    }\n\n    // handle simple [hv]:[hv] cases that can be easily computed\n    return getSimpleBendpoints(a, b, directions);\n  }\n\n  /**\n   * Create a connection between the two points according\n   * to the manhattan layout (only horizontal and vertical) edges.\n   *\n   * @param {Point} a\n   * @param {Point} b\n   * @param {string} [directions='h:h'] Specifies manhattan directions for each\n   * point as {direction}:{direction}. A direction for a point is either\n   * `h` (horizontal) or `v` (vertical).\n   *\n   * @return {Point[]}\n   */\n  function connectPoints(a, b, directions) {\n\n    var points = getBendpoints(a, b, directions);\n\n    points.unshift(a);\n    points.push(b);\n\n    return withoutRedundantPoints(points);\n  }\n\n\n  /**\n   * Connect two rectangles using a manhattan layouted connection.\n   *\n   * @param {Rect} source source rectangle\n   * @param {Rect} target target rectangle\n   * @param {Point} [start] source docking\n   * @param {Point} [end] target docking\n   * @param {Object} [hints]\n   * @param {string} [hints.preserveDocking=source] preserve docking on selected side\n   * @param {string[]} [hints.preferredLayouts]\n   * @param {Point|boolean} [hints.connectionStart] whether the start changed\n   * @param {Point|boolean} [hints.connectionEnd] whether the end changed\n   *\n   * @return {Point[]} connection points\n   */\n  function connectRectangles(source, target, start, end, hints) {\n\n    var preferredLayouts = hints && hints.preferredLayouts || [];\n\n    var preferredLayout = without(preferredLayouts, 'straight')[0] || 'h:h';\n\n    var threshold = ORIENTATION_THRESHOLD[preferredLayout] || 0;\n\n    var orientation = getOrientation(source, target, threshold);\n\n    var directions = getDirections(orientation, preferredLayout);\n\n    start = start || getMid(source);\n    end = end || getMid(target);\n\n    var directionSplit = directions.split(':');\n\n    // compute actual docking points for start / end\n    // this ensures we properly layout only parts of the\n    // connection that lies in between the two rectangles\n    var startDocking = getDockingPoint(start, source, directionSplit[0], invertOrientation(orientation)),\n        endDocking = getDockingPoint(end, target, directionSplit[1], orientation);\n\n    return connectPoints(startDocking, endDocking, directions);\n  }\n\n\n  /**\n   * Repair the connection between two rectangles, of which one has been updated.\n   *\n   * @param {Rect} source\n   * @param {Rect} target\n   * @param {Point} [start]\n   * @param {Point} [end]\n   * @param {Point[]} [waypoints]\n   * @param {Object} [hints]\n   * @param {string[]} [hints.preferredLayouts] The list of preferred layouts.\n   * @param {boolean} [hints.connectionStart]\n   * @param {boolean} [hints.connectionEnd]\n   *\n   * @return {Point[]} The waypoints of the repaired connection.\n   */\n  function repairConnection(source, target, start, end, waypoints, hints) {\n\n    if (isArray$3(start)) {\n      waypoints = start;\n      hints = end;\n\n      start = getMid(source);\n      end = getMid(target);\n    }\n\n    hints = assign$1({ preferredLayouts: [] }, hints);\n    waypoints = waypoints || [];\n\n    var preferredLayouts = hints.preferredLayouts,\n        preferStraight = preferredLayouts.indexOf('straight') !== -1,\n        repairedWaypoints;\n\n    // just layout non-existing or simple connections\n    // attempt to render straight lines, if required\n\n    // attempt to layout a straight line\n    repairedWaypoints = preferStraight && tryLayoutStraight(source, target, start, end, hints);\n\n    if (repairedWaypoints) {\n      return repairedWaypoints;\n    }\n\n    // try to layout from end\n    repairedWaypoints = hints.connectionEnd && tryRepairConnectionEnd(target, source, end, waypoints);\n\n    if (repairedWaypoints) {\n      return repairedWaypoints;\n    }\n\n    // try to layout from start\n    repairedWaypoints = hints.connectionStart && tryRepairConnectionStart(source, target, start, waypoints);\n\n    if (repairedWaypoints) {\n      return repairedWaypoints;\n    }\n\n    // or whether nothing seems to have changed\n    if (!hints.connectionStart && !hints.connectionEnd && waypoints && waypoints.length) {\n      return waypoints;\n    }\n\n    // simply reconnect if nothing else worked\n    return connectRectangles(source, target, start, end, hints);\n  }\n\n\n  function inRange(a, start, end) {\n    return a >= start && a <= end;\n  }\n\n  function isInRange(axis, a, b) {\n    var size = {\n      x: 'width',\n      y: 'height'\n    };\n\n    return inRange(a[axis], b[axis], b[axis] + b[size[axis]]);\n  }\n\n  /**\n   * Lay out a straight connection.\n   *\n   * @param {Rect} source\n   * @param {Rect} target\n   * @param {Point} start\n   * @param {Point} end\n   * @param {Object} [hints]\n   * @param {string} [hints.preserveDocking]\n   *\n   * @return {Point[]|null} The waypoints or null if layout isn't possible.\n   */\n  function tryLayoutStraight(source, target, start, end, hints) {\n    var axis = {},\n        primaryAxis,\n        orientation;\n\n    orientation = getOrientation(source, target);\n\n    // only layout a straight connection if shapes are\n    // horizontally or vertically aligned\n    if (!/^(top|bottom|left|right)$/.test(orientation)) {\n      return null;\n    }\n\n    if (/top|bottom/.test(orientation)) {\n      primaryAxis = 'x';\n    }\n\n    if (/left|right/.test(orientation)) {\n      primaryAxis = 'y';\n    }\n\n    if (hints.preserveDocking === 'target') {\n\n      if (!isInRange(primaryAxis, end, source)) {\n        return null;\n      }\n\n      axis[primaryAxis] = end[primaryAxis];\n\n      return [\n        {\n          x: axis.x !== undefined ? axis.x : start.x,\n          y: axis.y !== undefined ? axis.y : start.y,\n          original: {\n            x: axis.x !== undefined ? axis.x : start.x,\n            y: axis.y !== undefined ? axis.y : start.y\n          }\n        },\n        {\n          x: end.x,\n          y: end.y\n        }\n      ];\n\n    } else {\n\n      if (!isInRange(primaryAxis, start, target)) {\n        return null;\n      }\n\n      axis[primaryAxis] = start[primaryAxis];\n\n      return [\n        {\n          x: start.x,\n          y: start.y\n        },\n        {\n          x: axis.x !== undefined ? axis.x : end.x,\n          y: axis.y !== undefined ? axis.y : end.y,\n          original: {\n            x: axis.x !== undefined ? axis.x : end.x,\n            y: axis.y !== undefined ? axis.y : end.y\n          }\n        }\n      ];\n    }\n\n  }\n\n  /**\n   * Repair a connection from start.\n   *\n   * @param {Rect} moved\n   * @param {Rect} other\n   * @param {Point} newDocking\n   * @param {Point[]} points originalPoints from moved to other\n   *\n   * @return {Point[]|null} The waypoints of the repaired connection.\n   */\n  function tryRepairConnectionStart(moved, other, newDocking, points) {\n    return _tryRepairConnectionSide(moved, other, newDocking, points);\n  }\n\n  /**\n   * Repair a connection from end.\n   *\n   * @param {Rect} moved\n   * @param {Rect} other\n   * @param {Point} newDocking\n   * @param {Point[]} points originalPoints from moved to other\n   *\n   * @return {Point[]|null} The waypoints of the repaired connection.\n   */\n  function tryRepairConnectionEnd(moved, other, newDocking, points) {\n    var waypoints = points.slice().reverse();\n\n    waypoints = _tryRepairConnectionSide(moved, other, newDocking, waypoints);\n\n    return waypoints ? waypoints.reverse() : null;\n  }\n\n  /**\n   * Repair a connection from one side that moved.\n   *\n   * @param {Rect} moved\n   * @param {Rect} other\n   * @param {Point} newDocking\n   * @param {Point[]} points originalPoints from moved to other\n   *\n   * @return {Point[]} The waypoints of the repaired connection.\n   */\n  function _tryRepairConnectionSide(moved, other, newDocking, points) {\n\n    function needsRelayout(points) {\n      if (points.length < 3) {\n        return true;\n      }\n\n      if (points.length > 4) {\n        return false;\n      }\n\n      // relayout if two points overlap\n      // this is most likely due to\n      return !!find(points, function(p, idx) {\n        var q = points[idx - 1];\n\n        return q && pointDistance(p, q) < 3;\n      });\n    }\n\n    function repairBendpoint(candidate, oldPeer, newPeer) {\n\n      var alignment = pointsAligned(oldPeer, candidate);\n\n      switch (alignment) {\n      case 'v':\n\n        // repair horizontal alignment\n        return { x: newPeer.x, y: candidate.y };\n      case 'h':\n\n        // repair vertical alignment\n        return { x: candidate.x, y: newPeer.y };\n      }\n\n      return { x: candidate.x, y: candidate. y };\n    }\n\n    function removeOverlapping(points, a, b) {\n      var i;\n\n      for (i = points.length - 2; i !== 0; i--) {\n\n        // intersects (?) break, remove all bendpoints up to this one and relayout\n        if (pointInRect(points[i], a, INTERSECTION_THRESHOLD) ||\n            pointInRect(points[i], b, INTERSECTION_THRESHOLD)) {\n\n          // return sliced old connection\n          return points.slice(i);\n        }\n      }\n\n      return points;\n    }\n\n    // (0) only repair what has layoutable bendpoints\n\n    // (1) if only one bendpoint and on shape moved onto other shapes axis\n    //     (horizontally / vertically), relayout\n\n    if (needsRelayout(points)) {\n      return null;\n    }\n\n    var oldDocking = points[0],\n        newPoints = points.slice(),\n        slicedPoints;\n\n    // (2) repair only last line segment and only if it was layouted before\n\n    newPoints[0] = newDocking;\n    newPoints[1] = repairBendpoint(newPoints[1], oldDocking, newDocking);\n\n\n    // (3) if shape intersects with any bendpoint after repair,\n    //     remove all segments up to this bendpoint and repair from there\n    slicedPoints = removeOverlapping(newPoints, moved, other);\n\n    if (slicedPoints !== newPoints) {\n      newPoints = _tryRepairConnectionSide(moved, other, newDocking, slicedPoints);\n    }\n\n    // (4) do NOT repair if repaired bendpoints are aligned\n    if (newPoints && pointsAligned(newPoints)) {\n      return null;\n    }\n\n    return newPoints;\n  }\n\n\n  /**\n   * Returns the manhattan directions connecting two rectangles\n   * with the given orientation.\n   *\n   * Will always return the default layout, if it is specific\n   * regarding sides already (trbl).\n   *\n   * @example\n   *\n   * ```javascript\n   * getDirections('top'); // -> 'v:v'\n   * getDirections('intersect'); // -> 't:t'\n   *\n   * getDirections('top-right', 'v:h'); // -> 'v:h'\n   * getDirections('top-right', 'h:h'); // -> 'h:h'\n   * ```\n   *\n   * @param {string} orientation\n   * @param {string} defaultLayout\n   *\n   * @return {string}\n   */\n  function getDirections(orientation, defaultLayout) {\n\n    // don't override specific trbl directions\n    if (isExplicitDirections(defaultLayout)) {\n      return defaultLayout;\n    }\n\n    switch (orientation) {\n    case 'intersect':\n      return 't:t';\n\n    case 'top':\n    case 'bottom':\n      return 'v:v';\n\n    case 'left':\n    case 'right':\n      return 'h:h';\n\n    // 'top-left'\n    // 'top-right'\n    // 'bottom-left'\n    // 'bottom-right'\n    default:\n      return defaultLayout;\n    }\n  }\n\n  function isValidDirections(directions) {\n    return directions && /^h|v|t|r|b|l:h|v|t|r|b|l$/.test(directions);\n  }\n\n  function isExplicitDirections(directions) {\n    return directions && /t|r|b|l/.test(directions);\n  }\n\n  function invertOrientation(orientation) {\n    return {\n      'top': 'bottom',\n      'bottom': 'top',\n      'left': 'right',\n      'right': 'left',\n      'top-left': 'bottom-right',\n      'bottom-right': 'top-left',\n      'top-right': 'bottom-left',\n      'bottom-left': 'top-right',\n    }[orientation];\n  }\n\n  function getDockingPoint(point, rectangle, dockingDirection, targetOrientation) {\n\n    // ensure we end up with a specific docking direction\n    // based on the targetOrientation, if <h|v> is being passed\n\n    if (dockingDirection === 'h') {\n      dockingDirection = /left/.test(targetOrientation) ? 'l' : 'r';\n    }\n\n    if (dockingDirection === 'v') {\n      dockingDirection = /top/.test(targetOrientation) ? 't' : 'b';\n    }\n\n    if (dockingDirection === 't') {\n      return { original: point, x: point.x, y: rectangle.y };\n    }\n\n    if (dockingDirection === 'r') {\n      return { original: point, x: rectangle.x + rectangle.width, y: point.y };\n    }\n\n    if (dockingDirection === 'b') {\n      return { original: point, x: point.x, y: rectangle.y + rectangle.height };\n    }\n\n    if (dockingDirection === 'l') {\n      return { original: point, x: rectangle.x, y: point.y };\n    }\n\n    throw new Error('unexpected dockingDirection: <' + dockingDirection + '>');\n  }\n\n\n  /**\n   * Return list of waypoints with redundant ones filtered out.\n   *\n   * @example\n   *\n   * Original points:\n   *\n   *   [x] ----- [x] ------ [x]\n   *                         |\n   *                        [x] ----- [x] - [x]\n   *\n   * Filtered:\n   *\n   *   [x] ---------------- [x]\n   *                         |\n   *                        [x] ----------- [x]\n   *\n   * @param {Point[]} waypoints\n   *\n   * @return {Point[]}\n   */\n  function withoutRedundantPoints(waypoints) {\n    return waypoints.reduce(function(points, p, idx) {\n\n      var previous = points[points.length - 1],\n          next = waypoints[idx + 1];\n\n      if (!pointsOnLine(previous, next, p, 0)) {\n        points.push(p);\n      }\n\n      return points;\n    }, []);\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/util/Types').Point} Point\n   *\n   * @typedef {import('../../model/Types').Connection} Connection\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef {import('diagram-js/lib/layout/BaseLayouter').LayoutConnectionHints} LayoutConnectionHints\n   *\n   * @typedef { {\n   *   source?: Element;\n   *   target?: Element;\n   *   waypoints?: Point[];\n   *   connectionStart?: Point;\n   *   connectionEnd?: Point;\n   * } & LayoutConnectionHints } BpmnLayoutConnectionHints\n   */\n\n  var ATTACH_ORIENTATION_PADDING = -10,\n      BOUNDARY_TO_HOST_THRESHOLD$1 = 40;\n\n  var oppositeOrientationMapping = {\n    'top': 'bottom',\n    'top-right': 'bottom-left',\n    'top-left': 'bottom-right',\n    'right': 'left',\n    'bottom': 'top',\n    'bottom-right': 'top-left',\n    'bottom-left': 'top-right',\n    'left': 'right'\n  };\n\n  var orientationDirectionMapping = {\n    top: 't',\n    right: 'r',\n    bottom: 'b',\n    left: 'l'\n  };\n\n  function BpmnLayouter() {}\n\n  e$3(BpmnLayouter, BaseLayouter);\n\n  /**\n   * Returns waypoints of laid out connection.\n   *\n   * @param {Connection} connection\n   * @param {BpmnLayoutConnectionHints} [hints]\n   *\n   * @return {Point[]}\n   */\n  BpmnLayouter.prototype.layoutConnection = function(connection, hints) {\n    if (!hints) {\n      hints = {};\n    }\n\n    var source = hints.source || connection.source,\n        target = hints.target || connection.target,\n        waypoints = hints.waypoints || connection.waypoints,\n        connectionStart = hints.connectionStart,\n        connectionEnd = hints.connectionEnd;\n\n    var manhattanOptions,\n        updatedWaypoints;\n\n    if (!connectionStart) {\n      connectionStart = getConnectionDocking(waypoints && waypoints[ 0 ], source);\n    }\n\n    if (!connectionEnd) {\n      connectionEnd = getConnectionDocking(waypoints && waypoints[ waypoints.length - 1 ], target);\n    }\n\n    // TODO(nikku): support vertical modeling\n    // and invert preferredLayouts accordingly\n\n    if (is$1(connection, 'bpmn:Association') ||\n        is$1(connection, 'bpmn:DataAssociation')) {\n\n      if (waypoints && !isCompensationAssociation(source, target)) {\n        return [].concat([ connectionStart ], waypoints.slice(1, -1), [ connectionEnd ]);\n      }\n    }\n\n    if (is$1(connection, 'bpmn:MessageFlow')) {\n      manhattanOptions = getMessageFlowManhattanOptions(source, target);\n    } else if (is$1(connection, 'bpmn:SequenceFlow') || isCompensationAssociation(source, target)) {\n\n      // layout all connection between flow elements h:h, except for\n      // (1) outgoing of boundary events -> layout based on attach orientation and target orientation\n      // (2) incoming/outgoing of gateways -> v:h for outgoing, h:v for incoming\n      // (3) loops\n      if (source === target) {\n        manhattanOptions = {\n          preferredLayouts: getLoopPreferredLayout(source, connection)\n        };\n      } else if (is$1(source, 'bpmn:BoundaryEvent')) {\n        manhattanOptions = {\n          preferredLayouts: getBoundaryEventPreferredLayouts(source, target, connectionEnd)\n        };\n      } else if (isExpandedSubProcess(source) || isExpandedSubProcess(target)) {\n        manhattanOptions = getSubProcessManhattanOptions(source);\n      } else if (is$1(source, 'bpmn:Gateway')) {\n        manhattanOptions = {\n          preferredLayouts: [ 'v:h' ]\n        };\n      } else if (is$1(target, 'bpmn:Gateway')) {\n        manhattanOptions = {\n          preferredLayouts: [ 'h:v' ]\n        };\n      } else {\n        manhattanOptions = {\n          preferredLayouts: [ 'h:h' ]\n        };\n      }\n    }\n\n    if (manhattanOptions) {\n      manhattanOptions = assign$1(manhattanOptions, hints);\n\n      updatedWaypoints = withoutRedundantPoints(repairConnection(\n        source,\n        target,\n        connectionStart,\n        connectionEnd,\n        waypoints,\n        manhattanOptions\n      ));\n    }\n\n    return updatedWaypoints || [ connectionStart, connectionEnd ];\n  };\n\n\n  // helpers //////////\n\n  function getAttachOrientation(attachedElement) {\n    var hostElement = attachedElement.host;\n\n    return getOrientation(getMid(attachedElement), hostElement, ATTACH_ORIENTATION_PADDING);\n  }\n\n  function getMessageFlowManhattanOptions(source, target) {\n    return {\n      preferredLayouts: [ 'straight', 'v:v' ],\n      preserveDocking: getMessageFlowPreserveDocking(source, target)\n    };\n  }\n\n  function getMessageFlowPreserveDocking(source, target) {\n\n    // (1) docking element connected to participant has precedence\n    if (is$1(target, 'bpmn:Participant')) {\n      return 'source';\n    }\n\n    if (is$1(source, 'bpmn:Participant')) {\n      return 'target';\n    }\n\n    // (2) docking element connected to expanded sub-process has precedence\n    if (isExpandedSubProcess(target)) {\n      return 'source';\n    }\n\n    if (isExpandedSubProcess(source)) {\n      return 'target';\n    }\n\n    // (3) docking event has precedence\n    if (is$1(target, 'bpmn:Event')) {\n      return 'target';\n    }\n\n    if (is$1(source, 'bpmn:Event')) {\n      return 'source';\n    }\n\n    return null;\n  }\n\n  function getSubProcessManhattanOptions(source) {\n    return {\n      preferredLayouts: [ 'straight', 'h:h' ],\n      preserveDocking: getSubProcessPreserveDocking(source)\n    };\n  }\n\n  function getSubProcessPreserveDocking(source) {\n    return isExpandedSubProcess(source) ? 'target' : 'source';\n  }\n\n  function getConnectionDocking(point, shape) {\n    return point ? (point.original || point) : getMid(shape);\n  }\n\n  function isCompensationAssociation(source, target) {\n    return is$1(target, 'bpmn:Activity') &&\n      is$1(source, 'bpmn:BoundaryEvent') &&\n      target.businessObject.isForCompensation;\n  }\n\n  function isExpandedSubProcess(element) {\n    return is$1(element, 'bpmn:SubProcess') && isExpanded(element);\n  }\n\n  function isSame(a, b) {\n    return a === b;\n  }\n\n  function isAnyOrientation(orientation, orientations) {\n    return orientations.indexOf(orientation) !== -1;\n  }\n\n  function getHorizontalOrientation(orientation) {\n    var matches = /right|left/.exec(orientation);\n\n    return matches && matches[0];\n  }\n\n  function getVerticalOrientation(orientation) {\n    var matches = /top|bottom/.exec(orientation);\n\n    return matches && matches[0];\n  }\n\n  function isOppositeOrientation(a, b) {\n    return oppositeOrientationMapping[a] === b;\n  }\n\n  function isOppositeHorizontalOrientation(a, b) {\n    var horizontalOrientation = getHorizontalOrientation(a);\n\n    var oppositeHorizontalOrientation = oppositeOrientationMapping[horizontalOrientation];\n\n    return b.indexOf(oppositeHorizontalOrientation) !== -1;\n  }\n\n  function isOppositeVerticalOrientation(a, b) {\n    var verticalOrientation = getVerticalOrientation(a);\n\n    var oppositeVerticalOrientation = oppositeOrientationMapping[verticalOrientation];\n\n    return b.indexOf(oppositeVerticalOrientation) !== -1;\n  }\n\n  function isHorizontalOrientation(orientation) {\n    return orientation === 'right' || orientation === 'left';\n  }\n\n  function getLoopPreferredLayout(source, connection) {\n    var waypoints = connection.waypoints;\n\n    var orientation = waypoints && waypoints.length && getOrientation(waypoints[0], source);\n\n    if (orientation === 'top') {\n      return [ 't:r' ];\n    } else if (orientation === 'right') {\n      return [ 'r:b' ];\n    } else if (orientation === 'left') {\n      return [ 'l:t' ];\n    }\n\n    return [ 'b:l' ];\n  }\n\n  function getBoundaryEventPreferredLayouts(source, target, end) {\n    var sourceMid = getMid(source),\n        targetMid = getMid(target),\n        attachOrientation = getAttachOrientation(source),\n        sourceLayout,\n        targetLayout;\n\n    var isLoop = isSame(source.host, target);\n\n    var attachedToSide = isAnyOrientation(attachOrientation, [ 'top', 'right', 'bottom', 'left' ]);\n\n    var targetOrientation = getOrientation(targetMid, sourceMid, {\n      x: source.width / 2 + target.width / 2,\n      y: source.height / 2 + target.height / 2\n    });\n\n    if (isLoop) {\n      return getBoundaryEventLoopLayout(attachOrientation, attachedToSide, source, target, end);\n    }\n\n    // source layout\n    sourceLayout = getBoundaryEventSourceLayout(attachOrientation, targetOrientation, attachedToSide);\n\n    // target layout\n    targetLayout = getBoundaryEventTargetLayout(attachOrientation, targetOrientation, attachedToSide);\n\n    return [ sourceLayout + ':' + targetLayout ];\n  }\n\n  function getBoundaryEventLoopLayout(attachOrientation, attachedToSide, source, target, end) {\n    var orientation = attachedToSide ? attachOrientation : getVerticalOrientation(attachOrientation),\n        sourceLayout = orientationDirectionMapping[ orientation ],\n        targetLayout;\n\n    if (attachedToSide) {\n      if (isHorizontalOrientation(attachOrientation)) {\n        targetLayout = shouldConnectToSameSide('y', source, target, end) ? 'h' : 'b';\n      } else {\n        targetLayout = shouldConnectToSameSide('x', source, target, end) ? 'v' : 'l';\n      }\n    } else {\n      targetLayout = 'v';\n    }\n\n    return [ sourceLayout + ':' + targetLayout ];\n  }\n\n  function shouldConnectToSameSide(axis, source, target, end) {\n    var threshold = BOUNDARY_TO_HOST_THRESHOLD$1;\n\n    return !(\n      areCloseOnAxis(axis, end, target, threshold) ||\n      areCloseOnAxis(axis, end, {\n        x: target.x + target.width,\n        y: target.y + target.height\n      }, threshold) ||\n      areCloseOnAxis(axis, end, getMid(source), threshold)\n    );\n  }\n\n  function areCloseOnAxis(axis, a, b, threshold) {\n    return Math.abs(a[ axis ] - b[ axis ]) < threshold;\n  }\n\n  function getBoundaryEventSourceLayout(attachOrientation, targetOrientation, attachedToSide) {\n\n    // attached to either top, right, bottom or left side\n    if (attachedToSide) {\n      return orientationDirectionMapping[ attachOrientation ];\n    }\n\n    // attached to either top-right, top-left, bottom-right or bottom-left corner\n\n    // same vertical or opposite horizontal orientation\n    if (isSame(\n      getVerticalOrientation(attachOrientation), getVerticalOrientation(targetOrientation)\n    ) || isOppositeOrientation(\n      getHorizontalOrientation(attachOrientation), getHorizontalOrientation(targetOrientation)\n    )) {\n      return orientationDirectionMapping[ getVerticalOrientation(attachOrientation) ];\n    }\n\n    // fallback\n    return orientationDirectionMapping[ getHorizontalOrientation(attachOrientation) ];\n  }\n\n  function getBoundaryEventTargetLayout(attachOrientation, targetOrientation, attachedToSide) {\n\n    // attached to either top, right, bottom or left side\n    if (attachedToSide) {\n      if (isHorizontalOrientation(attachOrientation)) {\n\n        // orientation is right or left\n\n        // opposite horizontal orientation or same orientation\n        if (\n          isOppositeHorizontalOrientation(attachOrientation, targetOrientation) ||\n          isSame(attachOrientation, targetOrientation)\n        ) {\n          return 'h';\n        }\n\n        // fallback\n        return 'v';\n      } else {\n\n        // orientation is top or bottom\n\n        // opposite vertical orientation or same orientation\n        if (\n          isOppositeVerticalOrientation(attachOrientation, targetOrientation) ||\n          isSame(attachOrientation, targetOrientation)\n        ) {\n          return 'v';\n        }\n\n        // fallback\n        return 'h';\n      }\n    }\n\n    // attached to either top-right, top-left, bottom-right or bottom-left corner\n\n    // orientation is right, left\n    // or same vertical orientation but also right or left\n    if (isHorizontalOrientation(targetOrientation) ||\n      (isSame(getVerticalOrientation(attachOrientation), getVerticalOrientation(targetOrientation)) &&\n        getHorizontalOrientation(targetOrientation))) {\n      return 'h';\n    } else {\n      return 'v';\n    }\n  }\n\n  /**\n   * @typedef {import('../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../core/GraphicsFactory').default} GraphicsFactory\n   */\n\n  function dockingToPoint(docking) {\n\n    // use the dockings actual point and\n    // retain the original docking\n    return assign$1({ original: docking.point.original || docking.point }, docking.actual);\n  }\n\n\n  /**\n   * A {@link ConnectionDocking} that crops connection waypoints based on\n   * the path(s) of the connection source and target.\n   *\n   * @param {ElementRegistry} elementRegistry\n   * @param {GraphicsFactory} graphicsFactory\n   */\n  function CroppingConnectionDocking(elementRegistry, graphicsFactory) {\n    this._elementRegistry = elementRegistry;\n    this._graphicsFactory = graphicsFactory;\n  }\n\n  CroppingConnectionDocking.$inject = [ 'elementRegistry', 'graphicsFactory' ];\n\n\n  /**\n   * @inheritDoc ConnectionDocking#getCroppedWaypoints\n   */\n  CroppingConnectionDocking.prototype.getCroppedWaypoints = function(connection, source, target) {\n\n    source = source || connection.source;\n    target = target || connection.target;\n\n    var sourceDocking = this.getDockingPoint(connection, source, true),\n        targetDocking = this.getDockingPoint(connection, target);\n\n    var croppedWaypoints = connection.waypoints.slice(sourceDocking.idx + 1, targetDocking.idx);\n\n    croppedWaypoints.unshift(dockingToPoint(sourceDocking));\n    croppedWaypoints.push(dockingToPoint(targetDocking));\n\n    return croppedWaypoints;\n  };\n\n  /**\n   * Return the connection docking point on the specified shape\n   *\n   * @inheritDoc ConnectionDocking#getDockingPoint\n   */\n  CroppingConnectionDocking.prototype.getDockingPoint = function(connection, shape, dockStart) {\n\n    var waypoints = connection.waypoints,\n        dockingIdx,\n        dockingPoint,\n        croppedPoint;\n\n    dockingIdx = dockStart ? 0 : waypoints.length - 1;\n    dockingPoint = waypoints[dockingIdx];\n\n    croppedPoint = this._getIntersection(shape, connection, dockStart);\n\n    return {\n      point: dockingPoint,\n      actual: croppedPoint || dockingPoint,\n      idx: dockingIdx\n    };\n  };\n\n\n  // helpers //////////////////////\n\n  CroppingConnectionDocking.prototype._getIntersection = function(shape, connection, takeFirst) {\n\n    var shapePath = this._getShapePath(shape),\n        connectionPath = this._getConnectionPath(connection);\n\n    return getElementLineIntersection(shapePath, connectionPath, takeFirst);\n  };\n\n  CroppingConnectionDocking.prototype._getConnectionPath = function(connection) {\n    return this._graphicsFactory.getConnectionPath(connection);\n  };\n\n  CroppingConnectionDocking.prototype._getShapePath = function(shape) {\n    return this._graphicsFactory.getShapePath(shape);\n  };\n\n  CroppingConnectionDocking.prototype._getGfx = function(element) {\n    return this._elementRegistry.getGraphics(element);\n  };\n\n  var ModelingModule = {\n    __init__: [\n      'modeling',\n      'bpmnUpdater'\n    ],\n    __depends__: [\n      BehaviorModule,\n      RulesModule,\n      DiOrderingModule,\n      OrderingModule,\n      ReplaceModule,\n      CommandModule,\n      TooltipsModule,\n      LabelSupportModule,\n      AttachSupportModule,\n      SelectionModule,\n      ChangeSupportModule,\n      SpaceToolModule\n    ],\n    bpmnFactory: [ 'type', BpmnFactory ],\n    bpmnUpdater: [ 'type', BpmnUpdater ],\n    elementFactory: [ 'type', ElementFactory ],\n    modeling: [ 'type', Modeling ],\n    layouter: [ 'type', BpmnLayouter ],\n    connectionDocking: [ 'type', CroppingConnectionDocking ]\n  };\n\n  /**\n   * @typedef {import('../../core/Types').ElementLike} Element\n   * @typedef {import('../../core/Types').ShapeLike} Shape\n   *\n   * @typedef {import('../dragging/Dragging').default} Dragging\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../modeling/Modeling').default} Modeling\n   * @typedef {import('../rules/Rules').default} Rules\n   * @typedef {import('../selection/Selection').default} Selection\n   */\n\n  var LOW_PRIORITY$2 = 500,\n      MEDIUM_PRIORITY = 1250,\n      HIGH_PRIORITY$2 = 1500;\n\n  var round = Math.round;\n\n  function mid(element) {\n    return {\n      x: element.x + round(element.width / 2),\n      y: element.y + round(element.height / 2)\n    };\n  }\n\n  /**\n   * A plugin that makes shapes draggable / droppable.\n   *\n   * @param {EventBus} eventBus\n   * @param {Dragging} dragging\n   * @param {Modeling} modeling\n   * @param {Selection} selection\n   * @param {Rules} rules\n   */\n  function MoveEvents(\n      eventBus, dragging, modeling,\n      selection, rules) {\n\n    // rules\n\n    function canMove(shapes, delta, position, target) {\n\n      return rules.allowed('elements.move', {\n        shapes: shapes,\n        delta: delta,\n        position: position,\n        target: target\n      });\n    }\n\n\n    // move events\n\n    // assign a high priority to this handler to setup the environment\n    // others may hook up later, e.g. at default priority and modify\n    // the move environment.\n    //\n    // This sets up the context with\n    //\n    // * shape: the primary shape being moved\n    // * shapes: a list of shapes to be moved\n    // * validatedShapes: a list of shapes that are being checked\n    //                    against the rules before and during move\n    //\n    eventBus.on('shape.move.start', HIGH_PRIORITY$2, function(event) {\n\n      var context = event.context,\n          shape = event.shape,\n          shapes = selection.get().slice();\n\n      // move only single shape if the dragged element\n      // is not part of the current selection\n      if (shapes.indexOf(shape) === -1) {\n        shapes = [ shape ];\n      }\n\n      // ensure we remove nested elements in the collection\n      // and add attachers for a proper dragger\n      shapes = removeNested(shapes);\n\n      // attach shapes to drag context\n      assign$1(context, {\n        shapes: shapes,\n        validatedShapes: shapes,\n        shape: shape\n      });\n    });\n\n\n    // assign a high priority to this handler to setup the environment\n    // others may hook up later, e.g. at default priority and modify\n    // the move environment\n    //\n    eventBus.on('shape.move.start', MEDIUM_PRIORITY, function(event) {\n\n      var context = event.context,\n          validatedShapes = context.validatedShapes,\n          canExecute;\n\n      canExecute = context.canExecute = canMove(validatedShapes);\n\n      // check if we can move the elements\n      if (!canExecute) {\n        return false;\n      }\n    });\n\n    // assign a low priority to this handler\n    // to let others modify the move event before we update\n    // the context\n    //\n    eventBus.on('shape.move.move', LOW_PRIORITY$2, function(event) {\n\n      var context = event.context,\n          validatedShapes = context.validatedShapes,\n          hover = event.hover,\n          delta = { x: event.dx, y: event.dy },\n          position = { x: event.x, y: event.y },\n          canExecute;\n\n      // check if we can move the elements\n      canExecute = canMove(validatedShapes, delta, position, hover);\n\n      context.delta = delta;\n      context.canExecute = canExecute;\n\n      // simply ignore move over\n      if (canExecute === null) {\n        context.target = null;\n\n        return;\n      }\n\n      context.target = hover;\n    });\n\n    eventBus.on('shape.move.end', function(event) {\n\n      var context = event.context;\n\n      var delta = context.delta,\n          canExecute = context.canExecute,\n          isAttach = canExecute === 'attach',\n          shapes = context.shapes;\n\n      if (canExecute === false) {\n        return false;\n      }\n\n      // ensure we have actual pixel values deltas\n      // (important when zoom level was > 1 during move)\n      delta.x = round(delta.x);\n      delta.y = round(delta.y);\n\n      if (delta.x === 0 && delta.y === 0) {\n\n        // didn't move\n        return;\n      }\n\n      modeling.moveElements(shapes, delta, context.target, {\n        primaryShape: context.shape,\n        attach: isAttach\n      });\n    });\n\n\n    // move activation\n\n    eventBus.on('element.mousedown', function(event) {\n\n      if (!isPrimaryButton(event)) {\n        return;\n      }\n\n      var originalEvent = getOriginal$1(event);\n\n      if (!originalEvent) {\n        throw new Error('must supply DOM mousedown event');\n      }\n\n      return start(originalEvent, event.element);\n    });\n\n    /**\n     * Start move.\n     *\n     * @param {MouseEvent|TouchEvent} event\n     * @param {Shape} element\n     * @param {boolean} [activate]\n     * @param {Object} [context]\n     */\n    function start(event, element, activate, context) {\n      if (isObject(activate)) {\n        context = activate;\n        activate = false;\n      }\n\n      // do not move connections or the root element\n      if (element.waypoints || !element.parent) {\n        return;\n      }\n\n      // ignore non-draggable hits\n      if (classes(event.target).has('djs-hit-no-move')) {\n        return;\n      }\n\n      var referencePoint = mid(element);\n\n      dragging.init(event, referencePoint, 'shape.move', {\n        cursor: 'grabbing',\n        autoActivate: activate,\n        data: {\n          shape: element,\n          context: context || {}\n        }\n      });\n\n      // we've handled the event\n      return true;\n    }\n\n    // API\n\n    this.start = start;\n  }\n\n  MoveEvents.$inject = [\n    'eventBus',\n    'dragging',\n    'modeling',\n    'selection',\n    'rules'\n  ];\n\n\n  /**\n   * Return a filtered list of elements that do not contain\n   * those nested into others.\n   *\n   * @param {Element[]} elements\n   *\n   * @return {Element[]} filtered\n   */\n  function removeNested(elements) {\n\n    var ids = groupBy(elements, 'id');\n\n    return filter(elements, function(element) {\n      while ((element = element.parent)) {\n\n        // parent in selection\n        if (ids[element.id]) {\n          return false;\n        }\n      }\n\n      return true;\n    });\n  }\n\n  /**\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../preview-support/PreviewSupport').default} PreviewSupport\n   * @typedef {import('../../draw/Styles').default} Styles\n   */\n\n  var LOW_PRIORITY$1 = 499;\n\n  var MARKER_DRAGGING = 'djs-dragging',\n      MARKER_OK$1 = 'drop-ok',\n      MARKER_NOT_OK$1 = 'drop-not-ok',\n      MARKER_NEW_PARENT = 'new-parent',\n      MARKER_ATTACH = 'attach-ok';\n\n\n  /**\n   * Provides previews for moving shapes when moving.\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {Styles} styles\n   * @param {PreviewSupport} previewSupport\n   */\n  function MovePreview(\n      eventBus, canvas, styles, previewSupport) {\n\n    function getVisualDragShapes(shapes) {\n      var elements = getAllDraggedElements(shapes);\n\n      var filteredElements = removeEdges(elements);\n\n      return filteredElements;\n    }\n\n    function getAllDraggedElements(shapes) {\n      var allShapes = selfAndAllChildren(shapes, true);\n\n      var allConnections = map$1(allShapes, function(shape) {\n        return (shape.incoming || []).concat(shape.outgoing || []);\n      });\n\n      return flatten(allShapes.concat(allConnections));\n    }\n\n    /**\n     * Sets drop marker on an element.\n     */\n    function setMarker(element, marker) {\n\n      [ MARKER_ATTACH, MARKER_OK$1, MARKER_NOT_OK$1, MARKER_NEW_PARENT ].forEach(function(m) {\n\n        if (m === marker) {\n          canvas.addMarker(element, m);\n        } else {\n          canvas.removeMarker(element, m);\n        }\n      });\n    }\n\n    /**\n     * Make an element draggable.\n     *\n     * @param {Object} context\n     * @param {Element} element\n     * @param {boolean} addMarker\n     */\n    function makeDraggable(context, element, addMarker) {\n\n      previewSupport.addDragger(element, context.dragGroup);\n\n      if (addMarker) {\n        canvas.addMarker(element, MARKER_DRAGGING);\n      }\n\n      if (context.allDraggedElements) {\n        context.allDraggedElements.push(element);\n      } else {\n        context.allDraggedElements = [ element ];\n      }\n    }\n\n    // assign a low priority to this handler\n    // to let others modify the move context before\n    // we draw things\n    eventBus.on('shape.move.start', LOW_PRIORITY$1, function(event) {\n      var context = event.context,\n          dragShapes = context.shapes,\n          allDraggedElements = context.allDraggedElements;\n\n      var visuallyDraggedShapes = getVisualDragShapes(dragShapes);\n\n      if (!context.dragGroup) {\n        var dragGroup = create$1('g');\n\n        attr(dragGroup, styles.cls('djs-drag-group', [ 'no-events' ]));\n\n        var activeLayer = canvas.getActiveLayer();\n\n        append(activeLayer, dragGroup);\n\n        context.dragGroup = dragGroup;\n      }\n\n      // add previews\n      visuallyDraggedShapes.forEach(function(shape) {\n        previewSupport.addDragger(shape, context.dragGroup);\n      });\n\n      // cache all dragged elements / gfx\n      // so that we can quickly undo their state changes later\n      if (!allDraggedElements) {\n        allDraggedElements = getAllDraggedElements(dragShapes);\n      } else {\n        allDraggedElements = flatten([\n          allDraggedElements,\n          getAllDraggedElements(dragShapes)\n        ]);\n      }\n\n      // add dragging marker\n      forEach$1(allDraggedElements, function(e) {\n        canvas.addMarker(e, MARKER_DRAGGING);\n      });\n\n      context.allDraggedElements = allDraggedElements;\n\n      // determine, if any of the dragged elements have different parents\n      context.differentParents = haveDifferentParents(dragShapes);\n    });\n\n    // update previews\n    eventBus.on('shape.move.move', LOW_PRIORITY$1, function(event) {\n\n      var context = event.context,\n          dragGroup = context.dragGroup,\n          target = context.target,\n          parent = context.shape.parent,\n          canExecute = context.canExecute;\n\n      if (target) {\n        if (canExecute === 'attach') {\n          setMarker(target, MARKER_ATTACH);\n        } else if (context.canExecute && target && target.id !== parent.id) {\n          setMarker(target, MARKER_NEW_PARENT);\n        } else {\n          setMarker(target, context.canExecute ? MARKER_OK$1 : MARKER_NOT_OK$1);\n        }\n      }\n\n      translate$2(dragGroup, event.dx, event.dy);\n    });\n\n    eventBus.on([ 'shape.move.out', 'shape.move.cleanup' ], function(event) {\n      var context = event.context,\n          target = context.target;\n\n      if (target) {\n        setMarker(target, null);\n      }\n    });\n\n    // remove previews\n    eventBus.on('shape.move.cleanup', function(event) {\n\n      var context = event.context,\n          allDraggedElements = context.allDraggedElements,\n          dragGroup = context.dragGroup;\n\n\n      // remove dragging marker\n      forEach$1(allDraggedElements, function(e) {\n        canvas.removeMarker(e, MARKER_DRAGGING);\n      });\n\n      if (dragGroup) {\n        remove$1(dragGroup);\n      }\n    });\n\n\n    // API //////////////////////\n\n    /**\n     * Make an element draggable.\n     *\n     * @param {Object} context\n     * @param {Element} element\n     * @param {boolean} addMarker\n     */\n    this.makeDraggable = makeDraggable;\n  }\n\n  MovePreview.$inject = [\n    'eventBus',\n    'canvas',\n    'styles',\n    'previewSupport'\n  ];\n\n\n  // helpers //////////////////////\n\n  /**\n   * returns elements minus all connections\n   * where source or target is not elements\n   */\n  function removeEdges(elements) {\n\n    var filteredElements = filter(elements, function(element) {\n\n      if (!isConnection(element)) {\n        return true;\n      } else {\n\n        return (\n          find(elements, matchPattern({ id: element.source.id })) &&\n          find(elements, matchPattern({ id: element.target.id }))\n        );\n      }\n    });\n\n    return filteredElements;\n  }\n\n  function haveDifferentParents(elements) {\n    return size(groupBy(elements, function(e) { return e.parent && e.parent.id; })) !== 1;\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var MoveModule = {\n    __depends__: [\n      InteractionEventsModule$1,\n      SelectionModule,\n      OutlineModule,\n      RulesModule$1,\n      DraggingModule,\n      PreviewSupportModule\n    ],\n    __init__: [\n      'move',\n      'movePreview'\n    ],\n    move: [ 'type', MoveEvents ],\n    movePreview: [ 'type', MovePreview ]\n  };\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   *\n   * @typedef {import('./PaletteProvider').PaletteEntries} PaletteEntries\n   * @typedef {import('./PaletteProvider').default} PaletteProvider\n   */\n\n  var TOGGLE_SELECTOR = '.djs-palette-toggle',\n      ENTRY_SELECTOR = '.entry',\n      ELEMENT_SELECTOR = TOGGLE_SELECTOR + ', ' + ENTRY_SELECTOR;\n\n  var PALETTE_PREFIX = 'djs-palette-',\n      PALETTE_SHOWN_CLS = 'shown',\n      PALETTE_OPEN_CLS = 'open',\n      PALETTE_TWO_COLUMN_CLS = 'two-column';\n\n  var DEFAULT_PRIORITY = 1000;\n\n\n  /**\n   * A palette containing modeling elements.\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   */\n  function Palette(eventBus, canvas) {\n\n    this._eventBus = eventBus;\n    this._canvas = canvas;\n\n    var self = this;\n\n    eventBus.on('tool-manager.update', function(event) {\n      var tool = event.tool;\n\n      self.updateToolHighlight(tool);\n    });\n\n    eventBus.on('i18n.changed', function() {\n      self._update();\n    });\n\n    eventBus.on('diagram.init', function() {\n\n      self._diagramInitialized = true;\n\n      self._rebuild();\n    });\n  }\n\n  Palette.$inject = [ 'eventBus', 'canvas' ];\n\n  /**\n   * @overlord\n   *\n   * Register a palette provider with default priority. See\n   * {@link PaletteProvider} for examples.\n   *\n   * @param {PaletteProvider} provider\n   */\n\n  /**\n   * Register a palette provider with the given priority. See\n   * {@link PaletteProvider} for examples.\n   *\n   * @param {number} priority\n   * @param {PaletteProvider} provider\n   */\n  Palette.prototype.registerProvider = function(priority, provider) {\n    if (!provider) {\n      provider = priority;\n      priority = DEFAULT_PRIORITY;\n    }\n\n    this._eventBus.on('palette.getProviders', priority, function(event) {\n      event.providers.push(provider);\n    });\n\n    this._rebuild();\n  };\n\n\n  /**\n   * Returns the palette entries.\n   *\n   * @return {PaletteEntries}\n   */\n  Palette.prototype.getEntries = function() {\n    var providers = this._getProviders();\n\n    return providers.reduce(addPaletteEntries, {});\n  };\n\n  Palette.prototype._rebuild = function() {\n\n    if (!this._diagramInitialized) {\n      return;\n    }\n\n    var providers = this._getProviders();\n\n    if (!providers.length) {\n      return;\n    }\n\n    if (!this._container) {\n      this._init();\n    }\n\n    this._update();\n  };\n\n  /**\n   * Initialize palette.\n   */\n  Palette.prototype._init = function() {\n\n    var self = this;\n\n    var eventBus = this._eventBus;\n\n    var parentContainer = this._getParentContainer();\n\n    var container = this._container = domify$1(Palette.HTML_MARKUP);\n\n    parentContainer.appendChild(container);\n    classes$1(parentContainer).add(PALETTE_PREFIX + PALETTE_SHOWN_CLS);\n\n    delegate.bind(container, ELEMENT_SELECTOR, 'click', function(event) {\n\n      var target = event.delegateTarget;\n\n      if (matches(target, TOGGLE_SELECTOR)) {\n        return self.toggle();\n      }\n\n      self.trigger('click', event);\n    });\n\n    // prevent drag propagation\n    event.bind(container, 'mousedown', function(event) {\n      event.stopPropagation();\n    });\n\n    // prevent drag propagation\n    delegate.bind(container, ENTRY_SELECTOR, 'dragstart', function(event) {\n      self.trigger('dragstart', event);\n    });\n\n    eventBus.on('canvas.resized', this._layoutChanged, this);\n\n    eventBus.fire('palette.create', {\n      container: container\n    });\n  };\n\n  Palette.prototype._getProviders = function(id) {\n\n    var event = this._eventBus.createEvent({\n      type: 'palette.getProviders',\n      providers: []\n    });\n\n    this._eventBus.fire(event);\n\n    return event.providers;\n  };\n\n  /**\n   * Update palette state.\n   *\n   * @param { {\n   *   open?: boolean;\n   *   twoColumn?: boolean;\n   * } } [state]\n   */\n  Palette.prototype._toggleState = function(state) {\n\n    state = state || {};\n\n    var parent = this._getParentContainer(),\n        container = this._container;\n\n    var eventBus = this._eventBus;\n\n    var twoColumn;\n\n    var cls = classes$1(container),\n        parentCls = classes$1(parent);\n\n    if ('twoColumn' in state) {\n      twoColumn = state.twoColumn;\n    } else {\n      twoColumn = this._needsCollapse(parent.clientHeight, this._entries || {});\n    }\n\n    // always update two column\n    cls.toggle(PALETTE_TWO_COLUMN_CLS, twoColumn);\n    parentCls.toggle(PALETTE_PREFIX + PALETTE_TWO_COLUMN_CLS, twoColumn);\n\n    if ('open' in state) {\n      cls.toggle(PALETTE_OPEN_CLS, state.open);\n      parentCls.toggle(PALETTE_PREFIX + PALETTE_OPEN_CLS, state.open);\n    }\n\n    eventBus.fire('palette.changed', {\n      twoColumn: twoColumn,\n      open: this.isOpen()\n    });\n  };\n\n  Palette.prototype._update = function() {\n\n    var entriesContainer = query('.djs-palette-entries', this._container),\n        entries = this._entries = this.getEntries();\n\n    clear$1(entriesContainer);\n\n    forEach$1(entries, function(entry, id) {\n\n      var grouping = entry.group || 'default';\n\n      var container = query('[data-group=' + escapeCSS(grouping) + ']', entriesContainer);\n      if (!container) {\n        container = domify$1('<div class=\"group\"></div>');\n        attr$1(container, 'data-group', grouping);\n\n        entriesContainer.appendChild(container);\n      }\n\n      var html = entry.html || (\n        entry.separator ?\n          '<hr class=\"separator\" />' :\n          '<div class=\"entry\" draggable=\"true\"></div>');\n\n\n      var control = domify$1(html);\n      container.appendChild(control);\n\n      if (!entry.separator) {\n        attr$1(control, 'data-action', id);\n\n        if (entry.title) {\n          attr$1(control, 'title', entry.title);\n        }\n\n        if (entry.className) {\n          addClasses(control, entry.className);\n        }\n\n        if (entry.imageUrl) {\n          var image = domify$1('<img>');\n          attr$1(image, 'src', entry.imageUrl);\n\n          control.appendChild(image);\n        }\n      }\n    });\n\n    // open after update\n    this.open();\n  };\n\n\n  /**\n   * Trigger an action available on the palette\n   *\n   * @param {string} action\n   * @param {Event} event\n   * @param {boolean} [autoActivate=false]\n   */\n  Palette.prototype.trigger = function(action, event, autoActivate) {\n    var entry,\n        originalEvent,\n        button = event.delegateTarget || event.target;\n\n    if (!button) {\n      return event.preventDefault();\n    }\n\n    entry = attr$1(button, 'data-action');\n    originalEvent = event.originalEvent || event;\n\n    return this.triggerEntry(entry, action, originalEvent, autoActivate);\n  };\n\n  /**\n   * @param {string} entryId\n   * @param {string} action\n   * @param {Event} event\n   * @param {boolean} [autoActivate=false]\n   */\n  Palette.prototype.triggerEntry = function(entryId, action, event, autoActivate) {\n    var entries = this._entries,\n        entry,\n        handler;\n\n    entry = entries[entryId];\n\n    // when user clicks on the palette and not on an action\n    if (!entry) {\n      return;\n    }\n\n    handler = entry.action;\n\n    if (this._eventBus.fire('palette.trigger', { entry, event }) === false) {\n      return;\n    }\n\n    // simple action (via callback function)\n    if (isFunction(handler)) {\n      if (action === 'click') {\n        return handler(event, autoActivate);\n      }\n    } else {\n      if (handler[action]) {\n        return handler[action](event, autoActivate);\n      }\n    }\n\n    // silence other actions\n    event.preventDefault();\n  };\n\n  Palette.prototype._layoutChanged = function() {\n    this._toggleState({});\n  };\n\n  /**\n   * Do we need to collapse to two columns?\n   *\n   * @param {number} availableHeight\n   * @param {PaletteEntries} entries\n   *\n   * @return {boolean}\n   */\n  Palette.prototype._needsCollapse = function(availableHeight, entries) {\n\n    // top margin + bottom toggle + bottom margin\n    // implementors must override this method if they\n    // change the palette styles\n    var margin = 20 + 10 + 20;\n\n    var entriesHeight = Object.keys(entries).length * 46;\n\n    return availableHeight < entriesHeight + margin;\n  };\n\n  /**\n   * Close the palette.\n   */\n  Palette.prototype.close = function() {\n    this._toggleState({\n      open: false,\n      twoColumn: false\n    });\n  };\n\n  /**\n   * Open the palette.\n   */\n  Palette.prototype.open = function() {\n    this._toggleState({ open: true });\n  };\n\n  /**\n   * Toggle the palette.\n   */\n  Palette.prototype.toggle = function() {\n    if (this.isOpen()) {\n      this.close();\n    } else {\n      this.open();\n    }\n  };\n\n  /**\n   * @param {string} tool\n   *\n   * @return {boolean}\n   */\n  Palette.prototype.isActiveTool = function(tool) {\n    return tool && this._activeTool === tool;\n  };\n\n  /**\n   * @param {string} name\n   */\n  Palette.prototype.updateToolHighlight = function(name) {\n    var entriesContainer,\n        toolsContainer;\n\n    if (!this._toolsContainer) {\n      entriesContainer = query('.djs-palette-entries', this._container);\n\n      this._toolsContainer = query('[data-group=tools]', entriesContainer);\n    }\n\n    toolsContainer = this._toolsContainer;\n\n    forEach$1(toolsContainer.children, function(tool) {\n      var actionName = tool.getAttribute('data-action');\n\n      if (!actionName) {\n        return;\n      }\n\n      var toolClasses = classes$1(tool);\n\n      actionName = actionName.replace('-tool', '');\n\n      if (toolClasses.contains('entry') && actionName === name) {\n        toolClasses.add('highlighted-entry');\n      } else {\n        toolClasses.remove('highlighted-entry');\n      }\n    });\n  };\n\n\n  /**\n   * Return `true` if the palette is opened.\n   *\n   * @example\n   *\n   * ```javascript\n   * palette.open();\n   *\n   * if (palette.isOpen()) {\n   *   // yes, we are open\n   * }\n   * ```\n   *\n   * @return {boolean}\n   */\n  Palette.prototype.isOpen = function() {\n    return classes$1(this._container).has(PALETTE_OPEN_CLS);\n  };\n\n  /**\n   * Get parent element of palette.\n   *\n   * @return {HTMLElement}\n   */\n  Palette.prototype._getParentContainer = function() {\n    return this._canvas.getContainer();\n  };\n\n\n  /* markup definition */\n\n  Palette.HTML_MARKUP =\n    '<div class=\"djs-palette\">' +\n      '<div class=\"djs-palette-entries\"></div>' +\n      '<div class=\"djs-palette-toggle\"></div>' +\n    '</div>';\n\n\n  // helpers //////////////////////\n\n  function addClasses(element, classNames) {\n\n    var classes = classes$1(element);\n\n    var actualClassNames = isArray$3(classNames) ? classNames : classNames.split(/\\s+/g);\n    actualClassNames.forEach(function(cls) {\n      classes.add(cls);\n    });\n  }\n\n  function addPaletteEntries(entries, provider) {\n\n    var entriesOrUpdater = provider.getPaletteEntries();\n\n    if (isFunction(entriesOrUpdater)) {\n      return entriesOrUpdater(entries);\n    }\n\n    forEach$1(entriesOrUpdater, function(entry, id) {\n      entries[id] = entry;\n    });\n\n    return entries;\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var PaletteModule$1 = {\n    __init__: [ 'palette' ],\n    palette: [ 'type', Palette ]\n  };\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../dragging/Dragging').default} Dragging\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../mouse/Mouse').default} Mouse\n   * @typedef {import('../selection/Selection').default} Selection\n   * @typedef {import('../tool-manager/ToolManager').default} ToolManager\n   */\n\n  var LASSO_TOOL_CURSOR = 'crosshair';\n\n  /**\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {Dragging} dragging\n   * @param {ElementRegistry} elementRegistry\n   * @param {Selection} selection\n   * @param {ToolManager} toolManager\n   * @param {Mouse} mouse\n   */\n  function LassoTool(\n      eventBus, canvas, dragging,\n      elementRegistry, selection, toolManager,\n      mouse) {\n\n    this._selection = selection;\n    this._dragging = dragging;\n    this._mouse = mouse;\n\n    var self = this;\n\n    // lasso visuals implementation\n\n    /**\n    * A helper that realizes the selection box visual\n    */\n    var visuals = {\n\n      create: function(context) {\n        var container = canvas.getActiveLayer(),\n            frame;\n\n        frame = context.frame = create$1('rect');\n        attr(frame, {\n          class: 'djs-lasso-overlay',\n          width:  1,\n          height: 1,\n          x: 0,\n          y: 0\n        });\n\n        append(container, frame);\n      },\n\n      update: function(context) {\n        var frame = context.frame,\n            bbox = context.bbox;\n\n        attr(frame, {\n          x: bbox.x,\n          y: bbox.y,\n          width: bbox.width,\n          height: bbox.height\n        });\n      },\n\n      remove: function(context) {\n\n        if (context.frame) {\n          remove$1(context.frame);\n        }\n      }\n    };\n\n    toolManager.registerTool('lasso', {\n      tool: 'lasso.selection',\n      dragging: 'lasso'\n    });\n\n    eventBus.on('lasso.selection.end', function(event) {\n      var target = event.originalEvent.target;\n\n      // only reactive on diagram click\n      // on some occasions, event.hover is not set and we have to check if the target is an svg\n      if (!event.hover && !(target instanceof SVGElement)) {\n        return;\n      }\n\n      eventBus.once('lasso.selection.ended', function() {\n        self.activateLasso(event.originalEvent, true);\n      });\n    });\n\n    // lasso interaction implementation\n\n    eventBus.on('lasso.end', function(event) {\n\n      var bbox = toBBox(event);\n\n      var elements = elementRegistry.filter(function(element) {\n        return element;\n      });\n\n      self.select(elements, bbox);\n    });\n\n    eventBus.on('lasso.start', function(event) {\n\n      var context = event.context;\n\n      context.bbox = toBBox(event);\n      visuals.create(context);\n    });\n\n    eventBus.on('lasso.move', function(event) {\n\n      var context = event.context;\n\n      context.bbox = toBBox(event);\n      visuals.update(context);\n    });\n\n    eventBus.on('lasso.cleanup', function(event) {\n\n      var context = event.context;\n\n      visuals.remove(context);\n    });\n\n\n    // event integration\n\n    eventBus.on('element.mousedown', 1500, function(event) {\n\n      if (!hasSecondaryModifier(event)) {\n        return;\n      }\n\n      self.activateLasso(event.originalEvent);\n\n      // we've handled the event\n      return true;\n    });\n  }\n\n  LassoTool.$inject = [\n    'eventBus',\n    'canvas',\n    'dragging',\n    'elementRegistry',\n    'selection',\n    'toolManager',\n    'mouse'\n  ];\n\n\n  LassoTool.prototype.activateLasso = function(event, autoActivate) {\n\n    this._dragging.init(event, 'lasso', {\n      autoActivate: autoActivate,\n      cursor: LASSO_TOOL_CURSOR,\n      data: {\n        context: {}\n      }\n    });\n  };\n\n  LassoTool.prototype.activateSelection = function(event, autoActivate) {\n\n    this._dragging.init(event, 'lasso.selection', {\n      trapClick: false,\n      autoActivate: autoActivate,\n      cursor: LASSO_TOOL_CURSOR,\n      data: {\n        context: {}\n      }\n    });\n  };\n\n  LassoTool.prototype.select = function(elements, bbox) {\n    var selectedElements = getEnclosedElements(elements, bbox);\n\n    this._selection.select(values(selectedElements));\n  };\n\n  LassoTool.prototype.toggle = function() {\n    if (this.isActive()) {\n      return this._dragging.cancel();\n    }\n\n    var mouseEvent = this._mouse.getLastMoveEvent();\n\n    this.activateSelection(mouseEvent, !!mouseEvent);\n  };\n\n  LassoTool.prototype.isActive = function() {\n    var context = this._dragging.context();\n\n    return context && /^lasso/.test(context.prefix);\n  };\n\n\n\n  function toBBox(event) {\n\n    var start = {\n\n      x: event.x - event.dx,\n      y: event.y - event.dy\n    };\n\n    var end = {\n      x: event.x,\n      y: event.y\n    };\n\n    var bbox;\n\n    if ((start.x <= end.x && start.y < end.y) ||\n        (start.x < end.x && start.y <= end.y)) {\n\n      bbox = {\n        x: start.x,\n        y: start.y,\n        width:  end.x - start.x,\n        height: end.y - start.y\n      };\n    } else if ((start.x >= end.x && start.y < end.y) ||\n               (start.x > end.x && start.y <= end.y)) {\n\n      bbox = {\n        x: end.x,\n        y: start.y,\n        width:  start.x - end.x,\n        height: end.y - start.y\n      };\n    } else if ((start.x <= end.x && start.y > end.y) ||\n               (start.x < end.x && start.y >= end.y)) {\n\n      bbox = {\n        x: start.x,\n        y: end.y,\n        width:  end.x - start.x,\n        height: start.y - end.y\n      };\n    } else if ((start.x >= end.x && start.y > end.y) ||\n               (start.x > end.x && start.y >= end.y)) {\n\n      bbox = {\n        x: end.x,\n        y: end.y,\n        width:  start.x - end.x,\n        height: start.y - end.y\n      };\n    } else {\n\n      bbox = {\n        x: end.x,\n        y: end.y,\n        width:  0,\n        height: 0\n      };\n    }\n    return bbox;\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var LassoToolModule = {\n    __depends__: [\n      ToolManagerModule,\n      MouseModule\n    ],\n    __init__: [ 'lassoTool' ],\n    lassoTool: [ 'type', LassoTool ]\n  };\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   *\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../dragging/Dragging').default} Dragging\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../mouse/Mouse').default} Mouse\n   * @typedef {import('../tool-manager/ToolManager').default} ToolManager\n   */\n\n  var HIGH_PRIORITY$1 = 1500;\n  var HAND_CURSOR = 'grab';\n\n  /**\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {Dragging} dragging\n   * @param {Injector} injector\n   * @param {ToolManager} toolManager\n   * @param {Mouse} mouse\n   */\n  function HandTool(\n      eventBus, canvas, dragging,\n      injector, toolManager, mouse) {\n\n    this._dragging = dragging;\n    this._mouse = mouse;\n\n    var self = this,\n        keyboard = injector.get('keyboard', false);\n\n    toolManager.registerTool('hand', {\n      tool: 'hand',\n      dragging: 'hand.move'\n    });\n\n    eventBus.on('element.mousedown', HIGH_PRIORITY$1, function(event) {\n\n      if (!hasPrimaryModifier(event)) {\n        return;\n      }\n\n      self.activateMove(event.originalEvent, true);\n\n      return false;\n    });\n\n    keyboard && keyboard.addListener(HIGH_PRIORITY$1, function(e) {\n      if (!isSpace(e.keyEvent) || self.isActive()) {\n        return;\n      }\n\n      var mouseEvent = self._mouse.getLastMoveEvent();\n\n      self.activateMove(mouseEvent, !!mouseEvent);\n    }, 'keyboard.keydown');\n\n    keyboard && keyboard.addListener(HIGH_PRIORITY$1, function(e) {\n      if (!isSpace(e.keyEvent) || !self.isActive()) {\n        return;\n      }\n\n      self.toggle();\n    }, 'keyboard.keyup');\n\n    eventBus.on('hand.end', function(event) {\n      var target = event.originalEvent.target;\n\n      // only reactive on diagram click\n      // on some occasions, event.hover is not set and we have to check if the target is an svg\n      if (!event.hover && !(target instanceof SVGElement)) {\n        return false;\n      }\n\n      eventBus.once('hand.ended', function() {\n        self.activateMove(event.originalEvent, { reactivate: true });\n      });\n\n    });\n\n    eventBus.on('hand.move.move', function(event) {\n      var scale = canvas.viewbox().scale;\n\n      canvas.scroll({\n        dx: event.dx * scale,\n        dy: event.dy * scale\n      });\n    });\n\n    eventBus.on('hand.move.end', function(event) {\n      var context = event.context,\n          reactivate = context.reactivate;\n\n      // Don't reactivate if the user is using the keyboard keybinding\n      if (!hasPrimaryModifier(event) && reactivate) {\n\n        eventBus.once('hand.move.ended', function(event) {\n          self.activateHand(event.originalEvent, true, true);\n        });\n\n      }\n\n      return false;\n    });\n\n  }\n\n  HandTool.$inject = [\n    'eventBus',\n    'canvas',\n    'dragging',\n    'injector',\n    'toolManager',\n    'mouse'\n  ];\n\n\n  HandTool.prototype.activateMove = function(event, autoActivate, context) {\n    if (typeof autoActivate === 'object') {\n      context = autoActivate;\n      autoActivate = false;\n    }\n\n    this._dragging.init(event, 'hand.move', {\n      autoActivate: autoActivate,\n      cursor: HAND_CURSOR,\n      data: {\n        context: context || {}\n      }\n    });\n  };\n\n  HandTool.prototype.activateHand = function(event, autoActivate, reactivate) {\n    this._dragging.init(event, 'hand', {\n      trapClick: false,\n      autoActivate: autoActivate,\n      cursor: HAND_CURSOR,\n      data: {\n        context: {\n          reactivate: reactivate\n        }\n      }\n    });\n  };\n\n  HandTool.prototype.toggle = function() {\n    if (this.isActive()) {\n      return this._dragging.cancel();\n    }\n\n    var mouseEvent = this._mouse.getLastMoveEvent();\n\n    this.activateHand(mouseEvent, !!mouseEvent);\n  };\n\n  HandTool.prototype.isActive = function() {\n    var context = this._dragging.context();\n\n    if (context) {\n      return /^(hand|hand\\.move)$/.test(context.prefix);\n    }\n\n    return false;\n  };\n\n  // helpers //////////\n\n  function isSpace(keyEvent) {\n    return isKey('Space', keyEvent);\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var HandToolModule = {\n    __depends__: [\n      ToolManagerModule,\n      MouseModule\n    ],\n    __init__: [ 'handTool' ],\n    handTool: [ 'type', HandTool ]\n  };\n\n  var MARKER_OK = 'connect-ok',\n      MARKER_NOT_OK = 'connect-not-ok';\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../connect/Connect').default} Connect\n   * @typedef {import('../dragging/Dragging').default} Dragging\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../mouse/Mouse').default} Mouse\n   * @typedef {import('../rules/Rules').default} Rules\n   * @typedef {import('../tool-manager/ToolManager').default} ToolManager\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   */\n\n  /**\n   * @class\n   * @constructor\n   *\n   * @param {EventBus} eventBus\n   * @param {Dragging} dragging\n   * @param {Connect} connect\n   * @param {Canvas} canvas\n   * @param {ToolManager} toolManager\n   * @param {Rules} rules\n   * @param {Mouse} mouse\n   */\n  function GlobalConnect(\n      eventBus, dragging, connect,\n      canvas, toolManager, rules,\n      mouse) {\n\n    var self = this;\n\n    this._dragging = dragging;\n    this._rules = rules;\n    this._mouse = mouse;\n\n    toolManager.registerTool('global-connect', {\n      tool: 'global-connect',\n      dragging: 'global-connect.drag'\n    });\n\n    eventBus.on('global-connect.hover', function(event) {\n      var context = event.context,\n          startTarget = event.hover;\n\n      var canStartConnect = context.canStartConnect = self.canStartConnect(startTarget);\n\n      // simply ignore hover\n      if (canStartConnect === null) {\n        return;\n      }\n\n      context.startTarget = startTarget;\n\n      canvas.addMarker(startTarget, canStartConnect ? MARKER_OK : MARKER_NOT_OK);\n    });\n\n\n    eventBus.on([ 'global-connect.out', 'global-connect.cleanup' ], function(event) {\n      var startTarget = event.context.startTarget,\n          canStartConnect = event.context.canStartConnect;\n\n      if (startTarget) {\n        canvas.removeMarker(startTarget, canStartConnect ? MARKER_OK : MARKER_NOT_OK);\n      }\n    });\n\n\n    eventBus.on([ 'global-connect.ended' ], function(event) {\n      var context = event.context,\n          startTarget = context.startTarget,\n          startPosition = {\n            x: event.x,\n            y: event.y\n          };\n\n      var canStartConnect = self.canStartConnect(startTarget);\n\n      if (!canStartConnect) {\n        return;\n      }\n\n      eventBus.once('element.out', function() {\n        eventBus.once([ 'connect.ended', 'connect.canceled' ], function() {\n          eventBus.fire('global-connect.drag.ended');\n        });\n\n        connect.start(null, startTarget, startPosition);\n      });\n\n      return false;\n    });\n  }\n\n  GlobalConnect.$inject = [\n    'eventBus',\n    'dragging',\n    'connect',\n    'canvas',\n    'toolManager',\n    'rules',\n    'mouse'\n  ];\n\n  /**\n   * Initiates tool activity.\n   */\n  GlobalConnect.prototype.start = function(event, autoActivate) {\n    this._dragging.init(event, 'global-connect', {\n      autoActivate: autoActivate,\n      trapClick: false,\n      data: {\n        context: {}\n      }\n    });\n  };\n\n  GlobalConnect.prototype.toggle = function() {\n\n    if (this.isActive()) {\n      return this._dragging.cancel();\n    }\n\n    var mouseEvent = this._mouse.getLastMoveEvent();\n\n    return this.start(mouseEvent, !!mouseEvent);\n  };\n\n  GlobalConnect.prototype.isActive = function() {\n    var context = this._dragging.context();\n\n    return context && /^global-connect/.test(context.prefix);\n  };\n\n  /**\n   * Check if source element can initiate connection.\n   *\n   * @param {Element} startTarget\n   * @return {boolean}\n   */\n  GlobalConnect.prototype.canStartConnect = function(startTarget) {\n    return this._rules.allowed('connection.start', { source: startTarget });\n  };\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var GlobalConnectModule = {\n    __depends__: [\n      ConnectModule,\n      RulesModule$1,\n      DraggingModule,\n      ToolManagerModule,\n      MouseModule\n    ],\n    globalConnect: [ 'type', GlobalConnect ]\n  };\n\n  /**\n   * @typedef {import('diagram-js/lib/features/palette/Palette').default} Palette\n   * @typedef {import('diagram-js/lib/features/create/Create').default} Create\n   * @typedef {import('diagram-js/lib/core/ElementFactory').default} ElementFactory\n   * @typedef {import('../space-tool/BpmnSpaceTool').default} SpaceTool\n   * @typedef {import('diagram-js/lib/features/lasso-tool/LassoTool').default} LassoTool\n   * @typedef {import('diagram-js/lib/features/hand-tool/HandTool').default} HandTool\n   * @typedef {import('diagram-js/lib/features/global-connect/GlobalConnect').default} GlobalConnect\n   * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n   *\n   * @typedef {import('diagram-js/lib/features/palette/Palette').PaletteEntries} PaletteEntries\n   */\n\n  /**\n   * A palette provider for BPMN 2.0 elements.\n   *\n   * @param {Palette} palette\n   * @param {Create} create\n   * @param {ElementFactory} elementFactory\n   * @param {SpaceTool} spaceTool\n   * @param {LassoTool} lassoTool\n   * @param {HandTool} handTool\n   * @param {GlobalConnect} globalConnect\n   * @param {Translate} translate\n   */\n  function PaletteProvider(\n      palette, create, elementFactory,\n      spaceTool, lassoTool, handTool,\n      globalConnect, translate) {\n\n    this._palette = palette;\n    this._create = create;\n    this._elementFactory = elementFactory;\n    this._spaceTool = spaceTool;\n    this._lassoTool = lassoTool;\n    this._handTool = handTool;\n    this._globalConnect = globalConnect;\n    this._translate = translate;\n\n    palette.registerProvider(this);\n  }\n\n  PaletteProvider.$inject = [\n    'palette',\n    'create',\n    'elementFactory',\n    'spaceTool',\n    'lassoTool',\n    'handTool',\n    'globalConnect',\n    'translate'\n  ];\n\n  /**\n   * @return {PaletteEntries}\n   */\n  PaletteProvider.prototype.getPaletteEntries = function() {\n\n    var actions = {},\n        create = this._create,\n        elementFactory = this._elementFactory,\n        spaceTool = this._spaceTool,\n        lassoTool = this._lassoTool,\n        handTool = this._handTool,\n        globalConnect = this._globalConnect,\n        translate = this._translate;\n\n    function createAction(type, group, className, title, options) {\n\n      function createListener(event) {\n        var shape = elementFactory.createShape(assign$1({ type: type }, options));\n\n        if (options) {\n          var di = getDi(shape);\n          di.isExpanded = options.isExpanded;\n        }\n\n        create.start(event, shape);\n      }\n\n      var shortType = type.replace(/^bpmn:/, '');\n\n      return {\n        group: group,\n        className: className,\n        title: title || translate('Create {type}', { type: shortType }),\n        action: {\n          dragstart: createListener,\n          click: createListener\n        }\n      };\n    }\n\n    function createSubprocess(event) {\n      var subProcess = elementFactory.createShape({\n        type: 'bpmn:SubProcess',\n        x: 0,\n        y: 0,\n        isExpanded: true\n      });\n\n      var startEvent = elementFactory.createShape({\n        type: 'bpmn:StartEvent',\n        x: 40,\n        y: 82,\n        parent: subProcess\n      });\n\n      create.start(event, [ subProcess, startEvent ], {\n        hints: {\n          autoSelect: [ subProcess ]\n        }\n      });\n    }\n\n    function createParticipant(event) {\n      create.start(event, elementFactory.createParticipantShape());\n    }\n\n    assign$1(actions, {\n      'hand-tool': {\n        group: 'tools',\n        className: 'bpmn-icon-hand-tool',\n        title: translate('Activate the hand tool'),\n        action: {\n          click: function(event) {\n            handTool.activateHand(event);\n          }\n        }\n      },\n      'lasso-tool': {\n        group: 'tools',\n        className: 'bpmn-icon-lasso-tool',\n        title: translate('Activate the lasso tool'),\n        action: {\n          click: function(event) {\n            lassoTool.activateSelection(event);\n          }\n        }\n      },\n      'space-tool': {\n        group: 'tools',\n        className: 'bpmn-icon-space-tool',\n        title: translate('Activate the create/remove space tool'),\n        action: {\n          click: function(event) {\n            spaceTool.activateSelection(event);\n          }\n        }\n      },\n      'global-connect-tool': {\n        group: 'tools',\n        className: 'bpmn-icon-connection-multi',\n        title: translate('Activate the global connect tool'),\n        action: {\n          click: function(event) {\n            globalConnect.start(event);\n          }\n        }\n      },\n      'tool-separator': {\n        group: 'tools',\n        separator: true\n      },\n      'create.start-event': createAction(\n        'bpmn:StartEvent', 'event', 'bpmn-icon-start-event-none',\n        translate('Create StartEvent')\n      ),\n      'create.intermediate-event': createAction(\n        'bpmn:IntermediateThrowEvent', 'event', 'bpmn-icon-intermediate-event-none',\n        translate('Create Intermediate/Boundary Event')\n      ),\n      'create.end-event': createAction(\n        'bpmn:EndEvent', 'event', 'bpmn-icon-end-event-none',\n        translate('Create EndEvent')\n      ),\n      'create.exclusive-gateway': createAction(\n        'bpmn:ExclusiveGateway', 'gateway', 'bpmn-icon-gateway-none',\n        translate('Create Gateway')\n      ),\n      'create.task': createAction(\n        'bpmn:Task', 'activity', 'bpmn-icon-task',\n        translate('Create Task')\n      ),\n      'create.data-object': createAction(\n        'bpmn:DataObjectReference', 'data-object', 'bpmn-icon-data-object',\n        translate('Create DataObjectReference')\n      ),\n      'create.data-store': createAction(\n        'bpmn:DataStoreReference', 'data-store', 'bpmn-icon-data-store',\n        translate('Create DataStoreReference')\n      ),\n      'create.subprocess-expanded': {\n        group: 'activity',\n        className: 'bpmn-icon-subprocess-expanded',\n        title: translate('Create expanded SubProcess'),\n        action: {\n          dragstart: createSubprocess,\n          click: createSubprocess\n        }\n      },\n      'create.participant-expanded': {\n        group: 'collaboration',\n        className: 'bpmn-icon-participant',\n        title: translate('Create Pool/Participant'),\n        action: {\n          dragstart: createParticipant,\n          click: createParticipant\n        }\n      },\n      'create.group': createAction(\n        'bpmn:Group', 'artifact', 'bpmn-icon-group',\n        translate('Create Group')\n      ),\n    });\n\n    return actions;\n  };\n\n  var PaletteModule = {\n    __depends__: [\n      PaletteModule$1,\n      CreateModule,\n      SpaceToolModule,\n      LassoToolModule,\n      HandToolModule,\n      GlobalConnectModule,\n      translate\n    ],\n    __init__: [ 'paletteProvider' ],\n    paletteProvider: [ 'type', PaletteProvider ]\n  };\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('diagram-js/lib/core/ElementFactory').default} ElementFactory\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/features/preview-support/PreviewSupport').default} PreviewSupport\n   */\n\n  var LOW_PRIORITY = 250;\n\n  /**\n   * @param {EventBus} eventBus\n   * @param {ElementRegistry} elementRegistry\n   * @param {ElementFactory} elementFactory\n   * @param {Canvas} canvas\n   * @param {PreviewSupport} previewSupport\n   */\n  function BpmnReplacePreview(\n      eventBus, elementRegistry, elementFactory,\n      canvas, previewSupport) {\n\n    CommandInterceptor.call(this, eventBus);\n\n    /**\n     * Replace the visuals of all elements in the context which can be replaced\n     *\n     * @param  {Object} context\n     */\n    function replaceVisual(context) {\n\n      var replacements = context.canExecute.replacements;\n\n      forEach$1(replacements, function(replacement) {\n\n        var id = replacement.oldElementId;\n\n        var newElement = {\n          type: replacement.newElementType\n        };\n\n        // if the visual of the element is already replaced\n        if (context.visualReplacements[id]) {\n          return;\n        }\n\n        var element = elementRegistry.get(id);\n\n        assign$1(newElement, { x: element.x, y: element.y });\n\n        // create a temporary shape\n        var tempShape = elementFactory.createShape(newElement);\n\n        canvas.addShape(tempShape, element.parent);\n\n        // select the original SVG element related to the element and hide it\n        var gfx = query('[data-element-id=\"' + escapeCSS(element.id) + '\"]', context.dragGroup);\n\n        if (gfx) {\n          attr(gfx, { display: 'none' });\n        }\n\n        // clone the gfx of the temporary shape and add it to the drag group\n        var dragger = previewSupport.addDragger(tempShape, context.dragGroup);\n\n        context.visualReplacements[id] = dragger;\n\n        canvas.removeShape(tempShape);\n      });\n    }\n\n    /**\n     * Restore the original visuals of the previously replaced elements\n     *\n     * @param  {Object} context\n     */\n    function restoreVisual(context) {\n\n      var visualReplacements = context.visualReplacements;\n\n      forEach$1(visualReplacements, function(dragger, id) {\n\n        var originalGfx = query('[data-element-id=\"' + escapeCSS(id) + '\"]', context.dragGroup);\n\n        if (originalGfx) {\n          attr(originalGfx, { display: 'inline' });\n        }\n\n        dragger.remove();\n\n        if (visualReplacements[id]) {\n          delete visualReplacements[id];\n        }\n      });\n    }\n\n    eventBus.on('shape.move.move', LOW_PRIORITY, function(event) {\n\n      var context = event.context,\n          canExecute = context.canExecute;\n\n      if (!context.visualReplacements) {\n        context.visualReplacements = {};\n      }\n\n      if (canExecute && canExecute.replacements) {\n        replaceVisual(context);\n      } else {\n        restoreVisual(context);\n      }\n    });\n  }\n\n  BpmnReplacePreview.$inject = [\n    'eventBus',\n    'elementRegistry',\n    'elementFactory',\n    'canvas',\n    'previewSupport'\n  ];\n\n  e$3(BpmnReplacePreview, CommandInterceptor);\n\n  var ReplacePreviewModule = {\n    __depends__: [\n      PreviewSupportModule\n    ],\n    __init__: [ 'bpmnReplacePreview' ],\n    bpmnReplacePreview: [ 'type', BpmnReplacePreview ]\n  };\n\n  /**\r\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\r\n   *\r\n   * @typedef {import('diagram-js/lib/core/EventBus').Event} Event\r\n   *\r\n   * @typedef {import('../../model/Types').Shape} Shape\r\n   *\r\n   * @typedef {import('diagram-js/lib/util/Types').Axis} Axis\r\n   * @typedef {import('diagram-js/lib/util/Types').Point} Point\r\n   */\r\n\r\n  var HIGHER_PRIORITY$2 = 1250;\r\n\r\n  var BOUNDARY_TO_HOST_THRESHOLD = 40;\r\n\r\n  var TARGET_BOUNDS_PADDING = 20,\r\n      TASK_BOUNDS_PADDING = 10;\r\n\r\n  var TARGET_CENTER_PADDING = 20;\r\n\r\n  var AXES = [ 'x', 'y' ];\r\n\r\n  var abs = Math.abs;\r\n\r\n  /**\r\n   * Snap during connect.\r\n   *\r\n   * @param {EventBus} eventBus\r\n   */\r\n  function BpmnConnectSnapping(eventBus) {\r\n    eventBus.on([\r\n      'connect.hover',\r\n      'connect.move',\r\n      'connect.end',\r\n    ], HIGHER_PRIORITY$2, function(event) {\r\n      var context = event.context,\r\n          canExecute = context.canExecute,\r\n          start = context.start,\r\n          hover = context.hover,\r\n          source = context.source,\r\n          target = context.target;\r\n\r\n      // do NOT snap on CMD\r\n      if (event.originalEvent && isCmd(event.originalEvent)) {\r\n        return;\r\n      }\r\n\r\n      if (!context.initialConnectionStart) {\r\n        context.initialConnectionStart = context.connectionStart;\r\n      }\r\n\r\n      // snap hover\r\n      if (canExecute && hover) {\r\n        snapToShape(event, hover, getTargetBoundsPadding(hover));\r\n      }\r\n\r\n      if (hover && isAnyType(canExecute, [\r\n        'bpmn:Association',\r\n        'bpmn:DataInputAssociation',\r\n        'bpmn:DataOutputAssociation',\r\n        'bpmn:SequenceFlow'\r\n      ])) {\r\n        context.connectionStart = mid$2(start);\r\n\r\n        // snap hover\r\n        if (isAny(hover, [ 'bpmn:Event', 'bpmn:Gateway' ])) {\r\n          snapToPosition(event, mid$2(hover));\r\n        }\r\n\r\n        // snap hover\r\n        if (isAny(hover, [ 'bpmn:Task', 'bpmn:SubProcess' ])) {\r\n          snapToTargetMid(event, hover);\r\n        }\r\n\r\n        // snap source and target\r\n        if (is$1(source, 'bpmn:BoundaryEvent') && target === source.host) {\r\n          snapBoundaryEventLoop(event);\r\n        }\r\n\r\n      } else if (isType(canExecute, 'bpmn:MessageFlow')) {\r\n\r\n        if (is$1(start, 'bpmn:Event')) {\r\n\r\n          // snap start\r\n          context.connectionStart = mid$2(start);\r\n        }\r\n\r\n        if (is$1(hover, 'bpmn:Event')) {\r\n\r\n          // snap hover\r\n          snapToPosition(event, mid$2(hover));\r\n        }\r\n\r\n      } else {\r\n\r\n        // un-snap source\r\n        context.connectionStart = context.initialConnectionStart;\r\n      }\r\n    });\r\n  }\r\n\r\n  BpmnConnectSnapping.$inject = [ 'eventBus' ];\r\n\r\n\r\n  // helpers //////////\r\n\r\n  /**\r\n   * Snap to the given target if the event is inside the bounds of the target.\r\n   *\r\n   * @param {Event} event\r\n   * @param {Shape} target\r\n   * @param {number} padding\r\n   */\r\n  function snapToShape(event, target, padding) {\r\n    AXES.forEach(function(axis) {\r\n      var dimensionForAxis = getDimensionForAxis(axis, target);\r\n\r\n      if (event[ axis ] < target[ axis ] + padding) {\r\n        setSnapped(event, axis, target[ axis ] + padding);\r\n      } else if (event[ axis ] > target[ axis ] + dimensionForAxis - padding) {\r\n        setSnapped(event, axis, target[ axis ] + dimensionForAxis - padding);\r\n      }\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Snap to the target mid if the event is in the target mid.\r\n   *\r\n   * @param {Event} event\r\n   * @param {Shape} target\r\n   */\r\n  function snapToTargetMid(event, target) {\r\n    var targetMid = mid$2(target);\r\n\r\n    AXES.forEach(function(axis) {\r\n      if (isMid(event, target, axis)) {\r\n        setSnapped(event, axis, targetMid[ axis ]);\r\n      }\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Snap to prevent a loop overlapping a boundary event.\r\n   *\r\n   * @param {Event} event\r\n   */\r\n  function snapBoundaryEventLoop(event) {\r\n    var context = event.context,\r\n        source = context.source,\r\n        target = context.target;\r\n\r\n    if (isReverse(context)) {\r\n      return;\r\n    }\r\n\r\n    var sourceMid = mid$2(source),\r\n        orientation = getOrientation(sourceMid, target, -10),\r\n        axes = [];\r\n\r\n    if (/top|bottom/.test(orientation)) {\r\n      axes.push('x');\r\n    }\r\n\r\n    if (/left|right/.test(orientation)) {\r\n      axes.push('y');\r\n    }\r\n\r\n    axes.forEach(function(axis) {\r\n      var coordinate = event[ axis ], newCoordinate;\r\n\r\n      if (abs(coordinate - sourceMid[ axis ]) < BOUNDARY_TO_HOST_THRESHOLD) {\r\n        if (coordinate > sourceMid[ axis ]) {\r\n          newCoordinate = sourceMid[ axis ] + BOUNDARY_TO_HOST_THRESHOLD;\r\n        }\r\n        else {\r\n          newCoordinate = sourceMid[ axis ] - BOUNDARY_TO_HOST_THRESHOLD;\r\n        }\r\n\r\n        setSnapped(event, axis, newCoordinate);\r\n      }\r\n    });\r\n  }\r\n\r\n  /**\r\n   * @param {Event} event\r\n   * @param {Point} position\r\n   */\r\n  function snapToPosition(event, position) {\r\n    setSnapped(event, 'x', position.x);\r\n    setSnapped(event, 'y', position.y);\r\n  }\r\n\r\n  function isType(attrs, type) {\r\n    return attrs && attrs.type === type;\r\n  }\r\n\r\n  function isAnyType(attrs, types) {\r\n    return some(types, function(type) {\r\n      return isType(attrs, type);\r\n    });\r\n  }\r\n\r\n  /**\r\n   * @param {Axis} axis\r\n   * @param {Shape} element\r\n   *\r\n   * @return {number}\r\n   */\r\n  function getDimensionForAxis(axis, element) {\r\n    return axis === 'x' ? element.width : element.height;\r\n  }\r\n\r\n  /**\r\n   * @param {Shape} target\r\n   *\r\n   * @return {number}\r\n   */\r\n  function getTargetBoundsPadding(target) {\r\n    if (is$1(target, 'bpmn:Task')) {\r\n      return TASK_BOUNDS_PADDING;\r\n    } else {\r\n      return TARGET_BOUNDS_PADDING;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @param {Event} event\r\n   * @param {Shape} target\r\n   * @param {Axis} axis\r\n   *\r\n   * @return {boolean}\r\n   */\r\n  function isMid(event, target, axis) {\r\n    return event[ axis ] > target[ axis ] + TARGET_CENTER_PADDING\r\n      && event[ axis ] < target[ axis ] + getDimensionForAxis(axis, target) - TARGET_CENTER_PADDING;\r\n  }\r\n\r\n  function isReverse(context) {\r\n    var hover = context.hover,\r\n        source = context.source;\r\n\r\n    return hover && source && hover === source;\r\n  }\n\n  /**\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef {import('../../util/Types').Axis} Axis\n   * @typedef {import('../../util/Types').DirectionTRBL} DirectionTRBL\n   * @typedef {import('../../util/Types').Point} Point\n   *\n   * @typedef {DirectionTRBL & 'mid'} SnapLocation\n   */\n\n  /**\n   * A snap context, containing the (possibly incomplete)\n   * mappings of drop targets (to identify the snapping)\n   * to computed snap points.\n   */\n  function SnapContext() {\n\n    /**\n     * @type {Record<string, SnapPoints>}\n     */\n    this._targets = {};\n\n    /**\n     * @type {Record<SnapLocation, Point>}\n     */\n    this._snapOrigins = {};\n\n    /**\n     * @type {SnapLocation[]}\n     */\n    this._snapLocations = [];\n\n    /**\n     * @type {Record<SnapLocation, Point[]>}\n     */\n    this._defaultSnaps = {};\n  }\n\n  /**\n   * Get the snap origin for a given location.\n   *\n   * @param {SnapLocation} snapLocation\n   *\n   * @return {Point}\n   */\n  SnapContext.prototype.getSnapOrigin = function(snapLocation) {\n    return this._snapOrigins[snapLocation];\n  };\n\n  /**\n   * Set the snap origin for a given location.\n   *\n   * @param {SnapLocation} snapLocation\n   * @param {Point} snapOrigin\n   */\n  SnapContext.prototype.setSnapOrigin = function(snapLocation, snapOrigin) {\n    this._snapOrigins[snapLocation] = snapOrigin;\n\n    if (this._snapLocations.indexOf(snapLocation) === -1) {\n      this._snapLocations.push(snapLocation);\n    }\n  };\n\n  /**\n   * Add a default snap point.\n   *\n   * @param {SnapLocation} snapLocation\n   * @param {Point} point\n   */\n  SnapContext.prototype.addDefaultSnap = function(snapLocation, point) {\n\n    var snapValues = this._defaultSnaps[snapLocation];\n\n    if (!snapValues) {\n      snapValues = this._defaultSnaps[snapLocation] = [];\n    }\n\n    snapValues.push(point);\n  };\n\n  /**\n   * Get the snap locations for this context.\n   *\n   * @return {SnapLocation[]}\n   */\n  SnapContext.prototype.getSnapLocations = function() {\n    return this._snapLocations;\n  };\n\n  /**\n   * Set the snap locations for this context.\n   *\n   * The order of locations determines precedence.\n   *\n   * @param {SnapLocation[]} snapLocations\n   */\n  SnapContext.prototype.setSnapLocations = function(snapLocations) {\n    this._snapLocations = snapLocations;\n  };\n\n  /**\n   * Get snap points for the given target.\n   *\n   * @param {Element|string} target\n   *\n   * @return {SnapPoints}\n   */\n  SnapContext.prototype.pointsForTarget = function(target) {\n\n    var targetId = target.id || target;\n\n    var snapPoints = this._targets[targetId];\n\n    if (!snapPoints) {\n      snapPoints = this._targets[targetId] = new SnapPoints();\n      snapPoints.initDefaults(this._defaultSnaps);\n    }\n\n    return snapPoints;\n  };\n\n\n  /**\n   * Add points to snap to.\n   */\n  function SnapPoints() {\n\n    /**\n     * Example:\n     *\n     * ```javascript\n     * {\n     *   'top-right': {\n     *     x: [ 100, 200, 300 ]\n     *     y: [ 100, 200, 300 ]\n     *   }\n     * }\n     * ```\n     *\n     * @type {Record<string, Record<Axis, number[]>>}\n     */\n    this._snapValues = {};\n  }\n\n  /**\n   * Add a snap point.\n   *\n   * @param {SnapLocation} snapLocation\n   * @param {Point} point\n   */\n  SnapPoints.prototype.add = function(snapLocation, point) {\n\n    var snapValues = this._snapValues[snapLocation];\n\n    if (!snapValues) {\n      snapValues = this._snapValues[snapLocation] = { x: [], y: [] };\n    }\n\n    if (snapValues.x.indexOf(point.x) === -1) {\n      snapValues.x.push(point.x);\n    }\n\n    if (snapValues.y.indexOf(point.y) === -1) {\n      snapValues.y.push(point.y);\n    }\n  };\n\n  /**\n   * Snap a point's x or y value.\n   *\n   * @param {Point} point\n   * @param {SnapLocation} snapLocation\n   * @param {Axis} axis\n   * @param {number} tolerance\n   *\n   * @return {number}\n   */\n  SnapPoints.prototype.snap = function(point, snapLocation, axis, tolerance) {\n    var snappingValues = this._snapValues[snapLocation];\n\n    return snappingValues && snapTo(point[axis], snappingValues[axis], tolerance);\n  };\n\n  /**\n   * Initialize default snap points.\n   *\n   * @param {Record<SnapLocation, Point[]>} defaultSnaps\n   */\n  SnapPoints.prototype.initDefaults = function(defaultSnaps) {\n\n    var self = this;\n\n    forEach$1(defaultSnaps || {}, function(snapPoints, snapLocation) {\n      forEach$1(snapPoints, function(point) {\n        self.add(snapLocation, point);\n      });\n    });\n  };\n\n  /**\r\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\r\n   * @typedef {import('../../core/EventBus').default} EventBus\r\n   * @typedef {import('./Snapping').default} Snapping\r\n   */\r\n\r\n  var HIGHER_PRIORITY$1 = 1250;\r\n\r\n\r\n  /**\r\n   * Snap during create and move.\r\n   *\r\n   * @param {ElementRegistry} elementRegistry\r\n   * @param {EventBus} eventBus\r\n   * @param {Snapping} snapping\r\n   */\r\n  function CreateMoveSnapping(elementRegistry, eventBus, snapping) {\r\n    var self = this;\r\n\r\n    this._elementRegistry = elementRegistry;\r\n\r\n    eventBus.on([\r\n      'create.start',\r\n      'shape.move.start'\r\n    ], function(event) {\r\n      self.initSnap(event);\r\n    });\r\n\r\n    eventBus.on([\r\n      'create.move',\r\n      'create.end',\r\n      'shape.move.move',\r\n      'shape.move.end'\r\n    ], HIGHER_PRIORITY$1, function(event) {\r\n      var context = event.context,\r\n          shape = context.shape,\r\n          snapContext = context.snapContext,\r\n          target = context.target;\r\n\r\n      if (event.originalEvent && isCmd(event.originalEvent)) {\r\n        return;\r\n      }\r\n\r\n      if (isSnapped(event) || !target) {\r\n        return;\r\n      }\r\n\r\n      var snapPoints = snapContext.pointsForTarget(target);\r\n\r\n      if (!snapPoints.initialized) {\r\n        snapPoints = self.addSnapTargetPoints(snapPoints, shape, target);\r\n\r\n        snapPoints.initialized = true;\r\n      }\r\n\r\n      snapping.snap(event, snapPoints);\r\n    });\r\n\r\n    eventBus.on([\r\n      'create.cleanup',\r\n      'shape.move.cleanup'\r\n    ], function() {\r\n      snapping.hide();\r\n    });\r\n  }\r\n\r\n  CreateMoveSnapping.$inject = [\r\n    'elementRegistry',\r\n    'eventBus',\r\n    'snapping'\r\n  ];\r\n\r\n  CreateMoveSnapping.prototype.initSnap = function(event) {\r\n    var elementRegistry = this._elementRegistry;\r\n\r\n    var context = event.context,\r\n        shape = context.shape,\r\n        snapContext = context.snapContext;\r\n\r\n    if (!snapContext) {\r\n      snapContext = context.snapContext = new SnapContext();\r\n    }\r\n\r\n    var shapeMid;\r\n\r\n    if (elementRegistry.get(shape.id)) {\r\n\r\n      // move\r\n      shapeMid = mid$2(shape, event);\r\n    } else {\r\n\r\n      // create\r\n      shapeMid = {\r\n        x: event.x + mid$2(shape).x,\r\n        y: event.y + mid$2(shape).y\r\n      };\r\n    }\r\n\r\n    var shapeTopLeft = {\r\n          x: shapeMid.x - shape.width / 2,\r\n          y: shapeMid.y - shape.height / 2\r\n        },\r\n        shapeBottomRight = {\r\n          x: shapeMid.x + shape.width / 2,\r\n          y: shapeMid.y + shape.height / 2\r\n        };\r\n\r\n    snapContext.setSnapOrigin('mid', {\r\n      x: shapeMid.x - event.x,\r\n      y: shapeMid.y - event.y\r\n    });\r\n\r\n    // snap labels to mid only\r\n    if (isLabel(shape)) {\r\n      return snapContext;\r\n    }\r\n\r\n    snapContext.setSnapOrigin('top-left', {\r\n      x: shapeTopLeft.x - event.x,\r\n      y: shapeTopLeft.y - event.y\r\n    });\r\n\r\n    snapContext.setSnapOrigin('bottom-right', {\r\n      x: shapeBottomRight.x - event.x,\r\n      y: shapeBottomRight.y - event.y\r\n    });\r\n\r\n    return snapContext;\r\n  };\r\n\r\n  CreateMoveSnapping.prototype.addSnapTargetPoints = function(snapPoints, shape, target) {\r\n    var snapTargets = this.getSnapTargets(shape, target);\r\n\r\n    forEach$1(snapTargets, function(snapTarget) {\r\n\r\n      // handle labels\r\n      if (isLabel(snapTarget)) {\r\n\r\n        if (isLabel(shape)) {\r\n          snapPoints.add('mid', mid$2(snapTarget));\r\n        }\r\n\r\n        return;\r\n      }\r\n\r\n      // handle connections\r\n      if (isConnection(snapTarget)) {\r\n\r\n        // ignore single segment connections\r\n        if (snapTarget.waypoints.length < 3) {\r\n          return;\r\n        }\r\n\r\n        // ignore first and last waypoint\r\n        var waypoints = snapTarget.waypoints.slice(1, -1);\r\n\r\n        forEach$1(waypoints, function(waypoint) {\r\n          snapPoints.add('mid', waypoint);\r\n        });\r\n\r\n        return;\r\n      }\r\n\r\n      // handle shapes\r\n      snapPoints.add('mid', mid$2(snapTarget));\r\n    });\r\n\r\n    if (!isNumber(shape.x) || !isNumber(shape.y)) {\r\n      return snapPoints;\r\n    }\r\n\r\n    // snap to original position when moving\r\n    if (this._elementRegistry.get(shape.id)) {\r\n      snapPoints.add('mid', mid$2(shape));\r\n    }\r\n\r\n    return snapPoints;\r\n  };\r\n\r\n  CreateMoveSnapping.prototype.getSnapTargets = function(shape, target) {\r\n    return getChildren(target).filter(function(child) {\r\n      return !isHidden$1(child);\r\n    });\r\n  };\r\n\r\n  // helpers //////////\r\n\r\n  function isHidden$1(element) {\r\n    return !!element.hidden;\r\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('didi').Injector} Injector\n   *\n   * @typedef {import('diagram-js/lib/features/snapping/SnapContext').default} SnapContext\n   * @typedef {import('diagram-js/lib/features/snapping/SnapContext').SnapPoints} SnapPoints\n   *\n   * @typedef {import('diagram-js/lib/core/EventBus').Event} Event\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Shape} Shape\n   */\n\n  var HIGH_PRIORITY = 1500;\n\n\n  /**\n   * Snap during create and move.\n   *\n   * @param {EventBus} eventBus\n   * @param {Injector} injector\n   */\n  function BpmnCreateMoveSnapping(eventBus, injector) {\n    injector.invoke(CreateMoveSnapping, this);\n\n    // creating first participant\n    eventBus.on([ 'create.move', 'create.end' ], HIGH_PRIORITY, setSnappedIfConstrained);\n\n    // snap boundary events\n    eventBus.on([\n      'create.move',\n      'create.end',\n      'shape.move.move',\n      'shape.move.end'\n    ], HIGH_PRIORITY, function(event) {\n      var context = event.context,\n          canExecute = context.canExecute,\n          target = context.target;\n\n      var canAttach = canExecute && (canExecute === 'attach' || canExecute.attach);\n\n      if (canAttach && !isSnapped(event)) {\n        snapBoundaryEvent(event, target);\n      }\n    });\n  }\n\n  e$3(BpmnCreateMoveSnapping, CreateMoveSnapping);\n\n  BpmnCreateMoveSnapping.$inject = [\n    'eventBus',\n    'injector'\n  ];\n\n  /**\n   * @param {Event} event\n   *\n   * @return {SnapContext}\n   */\n  BpmnCreateMoveSnapping.prototype.initSnap = function(event) {\n    var snapContext = CreateMoveSnapping.prototype.initSnap.call(this, event);\n\n    var shape = event.shape;\n\n    var isMove = !!this._elementRegistry.get(shape.id);\n\n    // snap to docking points\n    forEach$1(shape.outgoing, function(connection) {\n      var docking = connection.waypoints[0];\n\n      docking = docking.original || docking;\n\n      snapContext.setSnapOrigin(connection.id + '-docking', getDockingSnapOrigin(docking, isMove, event));\n    });\n\n    forEach$1(shape.incoming, function(connection) {\n      var docking = connection.waypoints[connection.waypoints.length - 1];\n\n      docking = docking.original || docking;\n\n      snapContext.setSnapOrigin(connection.id + '-docking', getDockingSnapOrigin(docking, isMove, event));\n    });\n\n    if (is$1(shape, 'bpmn:Participant')) {\n\n      // snap to borders with higher priority\n      snapContext.setSnapLocations([ 'top-left', 'bottom-right', 'mid' ]);\n    }\n\n    return snapContext;\n  };\n\n  /**\n   * @param {SnapPoints} snapPoints\n   * @param {Shape} shape\n   * @param {Shape} target\n   *\n   * @return {SnapPoints}\n   */\n  BpmnCreateMoveSnapping.prototype.addSnapTargetPoints = function(snapPoints, shape, target) {\n    CreateMoveSnapping.prototype.addSnapTargetPoints.call(this, snapPoints, shape, target);\n\n    var snapTargets = this.getSnapTargets(shape, target);\n\n    forEach$1(snapTargets, function(snapTarget) {\n\n      // handle TRBL alignment\n      //\n      // * with container elements\n      // * with text annotations\n      if (isContainer(snapTarget) || areAll([ shape, snapTarget ], 'bpmn:TextAnnotation')) {\n        snapPoints.add('top-left', topLeft(snapTarget));\n        snapPoints.add('bottom-right', bottomRight(snapTarget));\n      }\n    });\n\n    var elementRegistry = this._elementRegistry;\n\n    // snap to docking points if not create mode\n    forEach$1(shape.incoming, function(connection) {\n      if (elementRegistry.get(shape.id)) {\n\n        if (!includes(snapTargets, connection.source)) {\n          snapPoints.add('mid', getMid(connection.source));\n        }\n\n        var docking = connection.waypoints[0];\n        snapPoints.add(connection.id + '-docking', docking.original || docking);\n      }\n    });\n\n    forEach$1(shape.outgoing, function(connection) {\n      if (elementRegistry.get(shape.id)) {\n\n        if (!includes(snapTargets, connection.target)) {\n          snapPoints.add('mid', getMid(connection.target));\n        }\n\n        var docking = connection.waypoints[ connection.waypoints.length - 1 ];\n\n        snapPoints.add(connection.id + '-docking', docking.original || docking);\n      }\n    });\n\n    // add sequence flow parents as snap targets\n    if (is$1(target, 'bpmn:SequenceFlow')) {\n      snapPoints = this.addSnapTargetPoints(snapPoints, shape, target.parent);\n    }\n\n    return snapPoints;\n  };\n\n  /**\n   * @param {Shape} shape\n   * @param {Shape} target\n   *\n   * @return {Shape[]}\n   */\n  BpmnCreateMoveSnapping.prototype.getSnapTargets = function(shape, target) {\n    return CreateMoveSnapping.prototype.getSnapTargets.call(this, shape, target)\n      .filter(function(snapTarget) {\n\n        // do not snap to lanes\n        return !is$1(snapTarget, 'bpmn:Lane');\n      });\n  };\n\n  // helpers //////////\n\n  /**\n   * @param {Shape} event\n   * @param {Shape} target\n   */\n  function snapBoundaryEvent(event, target) {\n    var targetTRBL = asTRBL(target);\n\n    var direction = getBoundaryAttachment(event, target);\n\n    var context = event.context,\n        shape = context.shape;\n\n    var offset;\n\n    if (shape.parent) {\n      offset = { x: 0, y: 0 };\n    } else {\n      offset = getMid(shape);\n    }\n\n    if (/top/.test(direction)) {\n      setSnapped(event, 'y', targetTRBL.top - offset.y);\n    } else if (/bottom/.test(direction)) {\n      setSnapped(event, 'y', targetTRBL.bottom - offset.y);\n    }\n\n    if (/left/.test(direction)) {\n      setSnapped(event, 'x', targetTRBL.left - offset.x);\n    } else if (/right/.test(direction)) {\n      setSnapped(event, 'x', targetTRBL.right - offset.x);\n    }\n  }\n\n  /**\n   * @param {Element[]} elements\n   * @param {string} type\n   *\n   * @return {boolean}\n   */\n  function areAll(elements, type) {\n    return elements.every(function(el) {\n      return is$1(el, type);\n    });\n  }\n\n  /**\n   * @param {Element} element\n   */\n  function isContainer(element) {\n    if (is$1(element, 'bpmn:SubProcess') && isExpanded(element)) {\n      return true;\n    }\n\n    return is$1(element, 'bpmn:Participant');\n  }\n\n  /**\n   * @param {Event} event\n   */\n  function setSnappedIfConstrained(event) {\n    var context = event.context,\n        createConstraints = context.createConstraints;\n\n    if (!createConstraints) {\n      return;\n    }\n\n    var top = createConstraints.top,\n        right = createConstraints.right,\n        bottom = createConstraints.bottom,\n        left = createConstraints.left;\n\n    if ((left && left >= event.x) || (right && right <= event.x)) {\n      setSnapped(event, 'x', event.x);\n    }\n\n    if ((top && top >= event.y) || (bottom && bottom <= event.y)) {\n      setSnapped(event, 'y', event.y);\n    }\n  }\n\n  function includes(array, value) {\n    return array.indexOf(value) !== -1;\n  }\n\n  function getDockingSnapOrigin(docking, isMove, event) {\n    return isMove ? (\n      {\n        x: docking.x - event.x,\n        y: docking.y - event.y\n      }\n    ) : {\n      x: docking.x,\n      y: docking.y\n    };\n  }\n\n  /**\r\n   * @typedef {import('../../core/EventBus').default} EventBus\r\n   * @typedef {import('./Snapping').default} Snapping\r\n   */\r\n\r\n  var HIGHER_PRIORITY = 1250;\r\n\r\n\r\n  /**\r\n   * Snap during resize.\r\n   *\r\n   * @param {EventBus} eventBus\r\n   * @param {Snapping} snapping\r\n   */\r\n  function ResizeSnapping(eventBus, snapping) {\r\n    var self = this;\r\n\r\n    eventBus.on([ 'resize.start' ], function(event) {\r\n      self.initSnap(event);\r\n    });\r\n\r\n    eventBus.on([\r\n      'resize.move',\r\n      'resize.end',\r\n    ], HIGHER_PRIORITY, function(event) {\r\n      var context = event.context,\r\n          shape = context.shape,\r\n          parent = shape.parent,\r\n          direction = context.direction,\r\n          snapContext = context.snapContext;\r\n\r\n      if (event.originalEvent && isCmd(event.originalEvent)) {\r\n        return;\r\n      }\r\n\r\n      if (isSnapped(event)) {\r\n        return;\r\n      }\r\n\r\n      var snapPoints = snapContext.pointsForTarget(parent);\r\n\r\n      if (!snapPoints.initialized) {\r\n        snapPoints = self.addSnapTargetPoints(snapPoints, shape, parent, direction);\r\n\r\n        snapPoints.initialized = true;\r\n      }\r\n\r\n      if (isHorizontal(direction)) {\r\n        setSnapped(event, 'x', event.x);\r\n      }\r\n\r\n      if (isVertical(direction)) {\r\n        setSnapped(event, 'y', event.y);\r\n      }\r\n\r\n      snapping.snap(event, snapPoints);\r\n    });\r\n\r\n    eventBus.on([ 'resize.cleanup' ], function() {\r\n      snapping.hide();\r\n    });\r\n  }\r\n\r\n  ResizeSnapping.prototype.initSnap = function(event) {\r\n    var context = event.context,\r\n        shape = context.shape,\r\n        direction = context.direction,\r\n        snapContext = context.snapContext;\r\n\r\n    if (!snapContext) {\r\n      snapContext = context.snapContext = new SnapContext();\r\n    }\r\n\r\n    var snapOrigin = getSnapOrigin(shape, direction);\r\n\r\n    snapContext.setSnapOrigin('corner', {\r\n      x: snapOrigin.x - event.x,\r\n      y: snapOrigin.y - event.y\r\n    });\r\n\r\n    return snapContext;\r\n  };\r\n\r\n  ResizeSnapping.prototype.addSnapTargetPoints = function(snapPoints, shape, target, direction) {\r\n    var snapTargets = this.getSnapTargets(shape, target);\r\n\r\n    forEach$1(snapTargets, function(snapTarget) {\r\n      snapPoints.add('corner', bottomRight(snapTarget));\r\n      snapPoints.add('corner', topLeft(snapTarget));\r\n    });\r\n\r\n    snapPoints.add('corner', getSnapOrigin(shape, direction));\r\n\r\n    return snapPoints;\r\n  };\r\n\r\n  ResizeSnapping.$inject = [\r\n    'eventBus',\r\n    'snapping'\r\n  ];\r\n\r\n  ResizeSnapping.prototype.getSnapTargets = function(shape, target) {\r\n    return getChildren(target).filter(function(child) {\r\n      return !isAttached(child, shape)\r\n        && !isConnection(child)\r\n        && !isHidden(child)\r\n        && !isLabel(child);\r\n    });\r\n  };\r\n\r\n  // helpers //////////\r\n\r\n  function getSnapOrigin(shape, direction) {\r\n    var mid = getMid(shape),\r\n        trbl = asTRBL(shape);\r\n\r\n    var snapOrigin = {\r\n      x: mid.x,\r\n      y: mid.y\r\n    };\r\n\r\n    if (direction.indexOf('n') !== -1) {\r\n      snapOrigin.y = trbl.top;\r\n    } else if (direction.indexOf('s') !== -1) {\r\n      snapOrigin.y = trbl.bottom;\r\n    }\r\n\r\n    if (direction.indexOf('e') !== -1) {\r\n      snapOrigin.x = trbl.right;\r\n    } else if (direction.indexOf('w') !== -1) {\r\n      snapOrigin.x = trbl.left;\r\n    }\r\n\r\n    return snapOrigin;\r\n  }\r\n\r\n  function isAttached(element, host) {\r\n    return element.host === host;\r\n  }\r\n\r\n  function isHidden(element) {\r\n    return !!element.hidden;\r\n  }\r\n\r\n  function isHorizontal(direction) {\r\n    return direction === 'n' || direction === 's';\r\n  }\r\n\r\n  function isVertical(direction) {\r\n    return direction === 'e' || direction === 'w';\r\n  }\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   *\n   * @typedef {import('../../core/EventBus').Event} Event\n   *\n   * @typedef {import('./SnapContext').SnapPoints} SnapPoints\n   */\n\n  var SNAP_TOLERANCE = 7;\n\n  var SNAP_LINE_HIDE_DELAY = 1000;\n\n\n  /**\n   * Generic snapping feature.\n   *\n   * @param {Canvas} canvas\n   */\n  function Snapping(canvas) {\n    this._canvas = canvas;\n\n    // delay hide by 1000 seconds since last snap\n    this._asyncHide = debounce(bind$2(this.hide, this), SNAP_LINE_HIDE_DELAY);\n  }\n\n  Snapping.$inject = [ 'canvas' ];\n\n  /**\n   * Snap an event to given snap points.\n   *\n   * @param {Event} event\n   * @param {SnapPoints} snapPoints\n   */\n  Snapping.prototype.snap = function(event, snapPoints) {\n    var context = event.context,\n        snapContext = context.snapContext,\n        snapLocations = snapContext.getSnapLocations();\n\n    var snapping = {\n      x: isSnapped(event, 'x'),\n      y: isSnapped(event, 'y')\n    };\n\n    forEach$1(snapLocations, function(location) {\n      var snapOrigin = snapContext.getSnapOrigin(location);\n\n      var snapCurrent = {\n        x: event.x + snapOrigin.x,\n        y: event.y + snapOrigin.y\n      };\n\n      // snap both axis if not snapped already\n      forEach$1([ 'x', 'y' ], function(axis) {\n        var locationSnapping;\n\n        if (!snapping[axis]) {\n          locationSnapping = snapPoints.snap(snapCurrent, location, axis, SNAP_TOLERANCE);\n\n          if (locationSnapping !== undefined) {\n            snapping[axis] = {\n              value: locationSnapping,\n              originValue: locationSnapping - snapOrigin[axis]\n            };\n          }\n        }\n      });\n\n      // no need to continue snapping\n      if (snapping.x && snapping.y) {\n        return false;\n      }\n    });\n\n    // show snap lines\n    this.showSnapLine('vertical', snapping.x && snapping.x.value);\n    this.showSnapLine('horizontal', snapping.y && snapping.y.value);\n\n    // snap event\n    forEach$1([ 'x', 'y' ], function(axis) {\n      var axisSnapping = snapping[axis];\n\n      if (isObject(axisSnapping)) {\n        setSnapped(event, axis, axisSnapping.originValue);\n      }\n    });\n  };\n\n  Snapping.prototype._createLine = function(orientation) {\n    var root = this._canvas.getLayer('snap');\n\n    var line = create$1('path');\n\n    attr(line, { d: 'M0,0 L0,0' });\n\n    classes(line).add('djs-snap-line');\n\n    append(root, line);\n\n    return {\n      update: function(position) {\n\n        if (!isNumber(position)) {\n          attr(line, { display: 'none' });\n        } else {\n          if (orientation === 'horizontal') {\n            attr(line, {\n              d: 'M-100000,' + position + ' L+100000,' + position,\n              display: ''\n            });\n          } else {\n            attr(line, {\n              d: 'M ' + position + ',-100000 L ' + position + ', +100000',\n              display: ''\n            });\n          }\n        }\n      }\n    };\n  };\n\n  Snapping.prototype._createSnapLines = function() {\n    this._snapLines = {\n      horizontal: this._createLine('horizontal'),\n      vertical: this._createLine('vertical')\n    };\n  };\n\n  Snapping.prototype.showSnapLine = function(orientation, position) {\n\n    var line = this.getSnapLine(orientation);\n\n    if (line) {\n      line.update(position);\n    }\n\n    this._asyncHide();\n  };\n\n  Snapping.prototype.getSnapLine = function(orientation) {\n    if (!this._snapLines) {\n      this._createSnapLines();\n    }\n\n    return this._snapLines[orientation];\n  };\n\n  Snapping.prototype.hide = function() {\n    forEach$1(this._snapLines, function(snapLine) {\n      snapLine.update();\n    });\n  };\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var SnappingModule$1 = {\n    __init__: [\n      'createMoveSnapping',\n      'resizeSnapping',\n      'snapping'\n    ],\n    createMoveSnapping: [ 'type', CreateMoveSnapping ],\n    resizeSnapping: [ 'type', ResizeSnapping ],\n    snapping: [ 'type', Snapping ]\n  };\n\n  var SnappingModule = {\n    __depends__: [ SnappingModule$1 ],\n    __init__: [\n      'connectSnapping',\n      'createMoveSnapping'\n    ],\n    connectSnapping: [ 'type', BpmnConnectSnapping ],\n    createMoveSnapping: [ 'type', BpmnCreateMoveSnapping ]\n  };\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../overlays/Overlays').default} Overlays\n   * @typedef {import('../selection/Selection').default} Selection\n   *\n   * @typedef {import('../overlays/Overlays').OverlayAttrs} OverlayAttrs\n   *\n   * @typedef {import('../../util/Types').Dimensions} Dimensions\n   *\n   * @typedef {import('./SearchPadProvider').default} SearchPadProvider\n   * @typedef {import('./SearchPadProvider').SearchResult} SearchResult\n   * @typedef {import('./SearchPadProvider').Token} Token\n   */\n\n  /**\n   * Provides searching infrastructure.\n   *\n   * @param {Canvas} canvas\n   * @param {EventBus} eventBus\n   * @param {Overlays} overlays\n   * @param {Selection} selection\n   */\n  function SearchPad(canvas, eventBus, overlays, selection) {\n    this._open = false;\n    this._results = [];\n    this._eventMaps = [];\n\n    this._canvas = canvas;\n    this._eventBus = eventBus;\n    this._overlays = overlays;\n    this._selection = selection;\n\n    // setup elements\n    this._container = domify$1(SearchPad.BOX_HTML);\n    this._searchInput = query(SearchPad.INPUT_SELECTOR, this._container);\n    this._resultsContainer = query(SearchPad.RESULTS_CONTAINER_SELECTOR, this._container);\n\n    // attach search pad\n    this._canvas.getContainer().appendChild(this._container);\n\n    // cleanup on destroy\n    eventBus.on([ 'canvas.destroy', 'diagram.destroy' ], this.close, this);\n  }\n\n\n  SearchPad.$inject = [\n    'canvas',\n    'eventBus',\n    'overlays',\n    'selection'\n  ];\n\n\n  /**\n   * Binds and keeps track of all event listereners\n   */\n  SearchPad.prototype._bindEvents = function() {\n    var self = this;\n\n    function listen(el, selector, type, fn) {\n      self._eventMaps.push({\n        el: el,\n        type: type,\n        listener: delegate.bind(el, selector, type, fn)\n      });\n    }\n\n    // close search on clicking anywhere outside\n    listen(document, 'html', 'click', function(e) {\n      self.close();\n    });\n\n    // stop event from propagating and closing search\n    // focus on input\n    listen(this._container, SearchPad.INPUT_SELECTOR, 'click', function(e) {\n      e.stopPropagation();\n      e.delegateTarget.focus();\n    });\n\n    // preselect result on hover\n    listen(this._container, SearchPad.RESULT_SELECTOR, 'mouseover', function(e) {\n      e.stopPropagation();\n      self._scrollToNode(e.delegateTarget);\n      self._preselect(e.delegateTarget);\n    });\n\n    // selects desired result on mouse click\n    listen(this._container, SearchPad.RESULT_SELECTOR, 'click', function(e) {\n      e.stopPropagation();\n      self._select(e.delegateTarget);\n    });\n\n    // prevent cursor in input from going left and right when using up/down to\n    // navigate results\n    listen(this._container, SearchPad.INPUT_SELECTOR, 'keydown', function(e) {\n\n      if (isKey('ArrowUp', e)) {\n        e.preventDefault();\n      }\n\n      if (isKey('ArrowDown', e)) {\n        e.preventDefault();\n      }\n    });\n\n    // handle keyboard input\n    listen(this._container, SearchPad.INPUT_SELECTOR, 'keyup', function(e) {\n\n      if (isKey('Escape', e)) {\n        return self.close();\n      }\n\n      if (isKey('Enter', e)) {\n        var selected = self._getCurrentResult();\n\n        return selected ? self._select(selected) : self.close();\n      }\n\n      if (isKey('ArrowUp', e)) {\n        return self._scrollToDirection(true);\n      }\n\n      if (isKey('ArrowDown', e)) {\n        return self._scrollToDirection();\n      }\n\n      // do not search while navigating text input\n      if (isKey([ 'ArrowLeft', 'ArrowRight' ], e)) {\n        return;\n      }\n\n      // anything else\n      self._search(e.delegateTarget.value);\n    });\n  };\n\n\n  /**\n   * Unbinds all previously established listeners\n   */\n  SearchPad.prototype._unbindEvents = function() {\n    this._eventMaps.forEach(function(m) {\n      delegate.unbind(m.el, m.type, m.listener);\n    });\n  };\n\n\n  /**\n   * Performs a search for the given pattern.\n   *\n   * @param {string} pattern\n   */\n  SearchPad.prototype._search = function(pattern) {\n    var self = this;\n\n    this._clearResults();\n\n    // do not search on empty query\n    if (!pattern || pattern === '') {\n      return;\n    }\n\n    var searchResults = this._searchProvider.find(pattern);\n\n    if (!searchResults.length) {\n      return;\n    }\n\n    // append new results\n    searchResults.forEach(function(result) {\n      var id = result.element.id;\n      var node = self._createResultNode(result, id);\n      self._results[id] = {\n        element: result.element,\n        node: node\n      };\n    });\n\n    // preselect first result\n    var node = query(SearchPad.RESULT_SELECTOR, this._resultsContainer);\n    this._scrollToNode(node);\n    this._preselect(node);\n  };\n\n\n  /**\n   * Navigate to the previous/next result. Defaults to next result.\n   *\n   * @param {boolean} previous\n   */\n  SearchPad.prototype._scrollToDirection = function(previous) {\n    var selected = this._getCurrentResult();\n    if (!selected) {\n      return;\n    }\n\n    var node = previous ? selected.previousElementSibling : selected.nextElementSibling;\n    if (node) {\n      this._scrollToNode(node);\n      this._preselect(node);\n    }\n  };\n\n\n  /**\n   * Scroll to the node if it is not visible.\n   *\n   * @param {HTMLElement} node\n   */\n  SearchPad.prototype._scrollToNode = function(node) {\n    if (!node || node === this._getCurrentResult()) {\n      return;\n    }\n\n    var nodeOffset = node.offsetTop;\n    var containerScroll = this._resultsContainer.scrollTop;\n\n    var bottomScroll = nodeOffset - this._resultsContainer.clientHeight + node.clientHeight;\n\n    if (nodeOffset < containerScroll) {\n      this._resultsContainer.scrollTop = nodeOffset;\n    } else if (containerScroll < bottomScroll) {\n      this._resultsContainer.scrollTop = bottomScroll;\n    }\n  };\n\n\n  /**\n   * Clears all results data.\n   */\n  SearchPad.prototype._clearResults = function() {\n    clear$1(this._resultsContainer);\n\n    this._results = [];\n\n    this._resetOverlay();\n\n    this._eventBus.fire('searchPad.cleared');\n  };\n\n\n  /**\n   * Get currently selected result.\n   *\n   * @return {HTMLElement}\n   */\n  SearchPad.prototype._getCurrentResult = function() {\n    return query(SearchPad.RESULT_SELECTED_SELECTOR, this._resultsContainer);\n  };\n\n\n  /**\n   * Create result DOM element within results container\n   * that corresponds to a search result.\n   *\n   * 'result' : one of the elements returned by Pad\n   * 'id' : id attribute value to assign to the new DOM node\n   * return : created DOM element\n   *\n   * @param {SearchResult} result\n   * @param {string} id\n   *\n   * @return {HTMLElement}\n   */\n  SearchPad.prototype._createResultNode = function(result, id) {\n    var node = domify$1(SearchPad.RESULT_HTML);\n\n    // create only if available\n    if (result.primaryTokens.length > 0) {\n      createInnerTextNode(node, result.primaryTokens, SearchPad.RESULT_PRIMARY_HTML);\n    }\n\n    // secondary tokens (represent element ID) are allways available\n    createInnerTextNode(node, result.secondaryTokens, SearchPad.RESULT_SECONDARY_HTML);\n\n    attr$1(node, SearchPad.RESULT_ID_ATTRIBUTE, id);\n\n    this._resultsContainer.appendChild(node);\n\n    return node;\n  };\n\n\n  /**\n   * Register search element provider.\n   *\n   * @param {SearchPadProvider} provider\n   */\n  SearchPad.prototype.registerProvider = function(provider) {\n    this._searchProvider = provider;\n  };\n\n\n  /**\n   * Open search pad.\n   */\n  SearchPad.prototype.open = function() {\n    if (!this._searchProvider) {\n      throw new Error('no search provider registered');\n    }\n\n    if (this.isOpen()) {\n      return;\n    }\n\n    this._bindEvents();\n\n    this._open = true;\n\n    classes$1(this._container).add('open');\n\n    this._searchInput.focus();\n\n    this._eventBus.fire('searchPad.opened');\n  };\n\n\n  /**\n   * Close search pad.\n   */\n  SearchPad.prototype.close = function() {\n    if (!this.isOpen()) {\n      return;\n    }\n\n    this._unbindEvents();\n\n    this._open = false;\n\n    classes$1(this._container).remove('open');\n\n    this._clearResults();\n\n    this._searchInput.value = '';\n    this._searchInput.blur();\n\n    this._resetOverlay();\n\n    this._eventBus.fire('searchPad.closed');\n  };\n\n\n  /**\n   * Toggles search pad on/off.\n   */\n  SearchPad.prototype.toggle = function() {\n    this.isOpen() ? this.close() : this.open();\n  };\n\n\n  /**\n   * Report state of search pad.\n   */\n  SearchPad.prototype.isOpen = function() {\n    return this._open;\n  };\n\n\n  /**\n   * Preselect result entry.\n   *\n   * @param {HTMLElement} element\n   */\n  SearchPad.prototype._preselect = function(node) {\n    var selectedNode = this._getCurrentResult();\n\n    // already selected\n    if (node === selectedNode) {\n      return;\n    }\n\n    // removing preselection from current node\n    if (selectedNode) {\n      classes$1(selectedNode).remove(SearchPad.RESULT_SELECTED_CLASS);\n    }\n\n    var id = attr$1(node, SearchPad.RESULT_ID_ATTRIBUTE);\n    var element = this._results[id].element;\n\n    classes$1(node).add(SearchPad.RESULT_SELECTED_CLASS);\n\n    this._resetOverlay(element);\n\n    this._canvas.scrollToElement(element, { top: 400 });\n\n    this._selection.select(element);\n\n    this._eventBus.fire('searchPad.preselected', element);\n  };\n\n\n  /**\n   * Select result node.\n   *\n   * @param {HTMLElement} element\n   */\n  SearchPad.prototype._select = function(node) {\n    var id = attr$1(node, SearchPad.RESULT_ID_ATTRIBUTE);\n    var element = this._results[id].element;\n\n    this.close();\n\n    this._resetOverlay();\n\n    this._canvas.scrollToElement(element, { top: 400 });\n\n    this._selection.select(element);\n\n    this._eventBus.fire('searchPad.selected', element);\n  };\n\n\n  /**\n   * Reset overlay removes and, optionally, set\n   * overlay to a new element.\n   *\n   * @param {HTMLElement} element\n   */\n  SearchPad.prototype._resetOverlay = function(element) {\n    if (this._overlayId) {\n      this._overlays.remove(this._overlayId);\n    }\n\n    if (element) {\n      var box = getBBox(element);\n      var overlay = constructOverlay(box);\n      this._overlayId = this._overlays.add(element, overlay);\n    }\n  };\n\n\n  /**\n   * Construct overlay object for the given bounding box.\n   *\n   * @param {Dimensions} box\n   *\n   * @return {OverlayAttrs}\n   */\n  function constructOverlay(box) {\n\n    var offset = 6;\n    var w = box.width + offset * 2;\n    var h = box.height + offset * 2;\n\n    var styles = {\n      width: w + 'px',\n      height: h + 'px'\n    };\n\n    var html = domify$1('<div class=\"' + SearchPad.OVERLAY_CLASS + '\"></div>');\n\n    assign(html, styles);\n\n    return {\n      position: {\n        bottom: h - offset,\n        right: w - offset\n      },\n      show: true,\n      html: html\n    };\n  }\n\n\n  /**\n   * Creates and appends child node from result tokens and HTML template.\n   *\n   * @param {HTMLElement} node\n   * @param {Token[]} tokens\n   * @param {string} template\n   */\n  function createInnerTextNode(parentNode, tokens, template) {\n    var text = createHtmlText(tokens);\n    var childNode = domify$1(template);\n    childNode.innerHTML = text;\n    parentNode.appendChild(childNode);\n  }\n\n  /**\n   * Create internal HTML markup from result tokens.\n   * Caters for highlighting pattern matched tokens.\n   *\n   * @param {Token[]} tokens\n   *\n   * @return {string|null}\n   */\n  function createHtmlText(tokens) {\n    var htmlText = '';\n\n    tokens.forEach(function(t) {\n      if (t.matched) {\n        htmlText += '<strong class=\"' + SearchPad.RESULT_HIGHLIGHT_CLASS + '\">' + escapeHTML(t.matched) + '</strong>';\n      } else {\n        htmlText += escapeHTML(t.normal);\n      }\n    });\n\n    return htmlText !== '' ? htmlText : null;\n  }\n\n\n  /**\n   * CONSTANTS\n   */\n  SearchPad.CONTAINER_SELECTOR = '.djs-search-container';\n  SearchPad.INPUT_SELECTOR = '.djs-search-input input';\n  SearchPad.RESULTS_CONTAINER_SELECTOR = '.djs-search-results';\n  SearchPad.RESULT_SELECTOR = '.djs-search-result';\n  SearchPad.RESULT_SELECTED_CLASS = 'djs-search-result-selected';\n  SearchPad.RESULT_SELECTED_SELECTOR = '.' + SearchPad.RESULT_SELECTED_CLASS;\n  SearchPad.RESULT_ID_ATTRIBUTE = 'data-result-id';\n  SearchPad.RESULT_HIGHLIGHT_CLASS = 'djs-search-highlight';\n  SearchPad.OVERLAY_CLASS = 'djs-search-overlay';\n\n  SearchPad.BOX_HTML =\n    '<div class=\"djs-search-container djs-draggable djs-scrollable\">' +\n      '<div class=\"djs-search-input\">' +\n        '<input type=\"text\"/>' +\n      '</div>' +\n      '<div class=\"djs-search-results\"></div>' +\n    '</div>';\n\n  SearchPad.RESULT_HTML =\n    '<div class=\"djs-search-result\"></div>';\n\n  SearchPad.RESULT_PRIMARY_HTML =\n    '<div class=\"djs-search-result-primary\"></div>';\n\n  SearchPad.RESULT_SECONDARY_HTML =\n    '<p class=\"djs-search-result-secondary\"></p>';\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var SearchPadModule = {\n    __depends__: [\n      OverlaysModule,\n      SelectionModule\n    ],\n    searchPad: [ 'type', SearchPad ]\n  };\n\n  /**\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('diagram-js/lib/features/search-pad/SearchPad').default} SearchPad\n   *\n   * @typedef {import('diagram-js/lib/features/search-pad/SearchPadProvider').default} SearchPadProvider\n   * @typedef {import('diagram-js/lib/features/search-pad/SearchPadProvider').SearchResult} SearchResult\n   */\n\n  /**\n   * Provides ability to search for BPMN elements.\n   *\n   * @implements {SearchPadProvider}\n   *\n   * @param {ElementRegistry} elementRegistry\n   * @param {SearchPad} searchPad\n   * @param {Canvas} canvas\n   */\n  function BpmnSearchProvider(elementRegistry, searchPad, canvas) {\n    this._elementRegistry = elementRegistry;\n    this._canvas = canvas;\n\n    searchPad.registerProvider(this);\n  }\n\n  BpmnSearchProvider.$inject = [\n    'elementRegistry',\n    'searchPad',\n    'canvas'\n  ];\n\n  /**\n   * @param {string} pattern\n   *\n   * @return {SearchResult[]}\n   */\n  BpmnSearchProvider.prototype.find = function(pattern) {\n    var rootElement = this._canvas.getRootElement();\n\n    var elements = this._elementRegistry.filter(function(element) {\n      if (element.labelTarget) {\n        return false;\n      }\n      return true;\n    });\n\n    // do not include root element\n    elements = filter(elements, function(element) {\n      return element !== rootElement;\n    });\n\n    elements = map$1(elements, function(element) {\n      return {\n        primaryTokens: matchAndSplit(getLabel(element), pattern),\n        secondaryTokens: matchAndSplit(element.id, pattern),\n        element: element\n      };\n    });\n\n    // exclude non-matched elements\n    elements = filter(elements, function(element) {\n      return hasMatched(element.primaryTokens) || hasMatched(element.secondaryTokens);\n    });\n\n    elements = sortBy(elements, function(element) {\n      return getLabel(element.element) + element.element.id;\n    });\n\n    return elements;\n  };\n\n  /**\n   * @param {Token[]} tokens\n   *\n   * @return {boolean}\n   */\n  function hasMatched(tokens) {\n    var matched = filter(tokens, function(token) {\n      return !!token.matched;\n    });\n\n    return matched.length > 0;\n  }\n\n  /**\n   * @param {string} text\n   * @param {string} pattern\n   *\n   * @return {Token[]}\n   */\n  function matchAndSplit(text, pattern) {\n    var tokens = [],\n        originalText = text;\n\n    if (!text) {\n      return tokens;\n    }\n\n    text = text.toLowerCase();\n    pattern = pattern.toLowerCase();\n\n    var i = text.indexOf(pattern);\n\n    if (i > -1) {\n      if (i !== 0) {\n        tokens.push({\n          normal: originalText.substr(0, i)\n        });\n      }\n\n      tokens.push({\n        matched: originalText.substr(i, pattern.length)\n      });\n\n      if (pattern.length + i < text.length) {\n        tokens.push({\n          normal: originalText.substr(pattern.length + i, text.length)\n        });\n      }\n    } else {\n      tokens.push({\n        normal: originalText\n      });\n    }\n\n    return tokens;\n  }\n\n  var SearchModule = {\n    __depends__: [\n      SearchPadModule\n    ],\n    __init__: [ 'bpmnSearch' ],\n    bpmnSearch: [ 'type', BpmnSearchProvider ]\n  };\n\n  var initialDiagram =\n    '<?xml version=\"1.0\" encoding=\"UTF-8\"?>' +\n    '<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ' +\n                      'xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" ' +\n                      'xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" ' +\n                      'xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" ' +\n                      'targetNamespace=\"http://bpmn.io/schema/bpmn\" ' +\n                      'id=\"Definitions_1\">' +\n      '<bpmn:process id=\"Process_1\" isExecutable=\"false\">' +\n        '<bpmn:startEvent id=\"StartEvent_1\"/>' +\n      '</bpmn:process>' +\n      '<bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">' +\n        '<bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">' +\n          '<bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">' +\n            '<dc:Bounds height=\"36.0\" width=\"36.0\" x=\"173.0\" y=\"102.0\"/>' +\n          '</bpmndi:BPMNShape>' +\n        '</bpmndi:BPMNPlane>' +\n      '</bpmndi:BPMNDiagram>' +\n    '</bpmn:definitions>';\n\n\n  /**\n   * @typedef {import('./BaseViewer').BaseViewerOptions} BaseViewerOptions\n   * @typedef {import('./BaseViewer').ImportXMLResult} ImportXMLResult\n   */\n\n  /**\n   * A modeler for BPMN 2.0 diagrams.\n   *\n   *\n   * ## Extending the Modeler\n   *\n   * In order to extend the viewer pass extension modules to bootstrap via the\n   * `additionalModules` option. An extension module is an object that exposes\n   * named services.\n   *\n   * The following example depicts the integration of a simple\n   * logging component that integrates with interaction events:\n   *\n   *\n   * ```javascript\n   *\n   * // logging component\n   * function InteractionLogger(eventBus) {\n   *   eventBus.on('element.hover', function(event) {\n   *     console.log()\n   *   })\n   * }\n   *\n   * InteractionLogger.$inject = [ 'eventBus' ]; // minification save\n   *\n   * // extension module\n   * var extensionModule = {\n   *   __init__: [ 'interactionLogger' ],\n   *   interactionLogger: [ 'type', InteractionLogger ]\n   * };\n   *\n   * // extend the viewer\n   * var bpmnModeler = new Modeler({ additionalModules: [ extensionModule ] });\n   * bpmnModeler.importXML(...);\n   * ```\n   *\n   *\n   * ## Customizing / Replacing Components\n   *\n   * You can replace individual diagram components by redefining them in override modules.\n   * This works for all components, including those defined in the core.\n   *\n   * Pass in override modules via the `options.additionalModules` flag like this:\n   *\n   * ```javascript\n   * function CustomContextPadProvider(contextPad) {\n   *\n   *   contextPad.registerProvider(this);\n   *\n   *   this.getContextPadEntries = function(element) {\n   *     // no entries, effectively disable the context pad\n   *     return {};\n   *   };\n   * }\n   *\n   * CustomContextPadProvider.$inject = [ 'contextPad' ];\n   *\n   * var overrideModule = {\n   *   contextPadProvider: [ 'type', CustomContextPadProvider ]\n   * };\n   *\n   * var bpmnModeler = new Modeler({ additionalModules: [ overrideModule ]});\n   * ```\n   *\n   * @param {BaseViewerOptions} [options] The options to configure the modeler.\n   */\n  function Modeler(options) {\n    BaseModeler.call(this, options);\n  }\n\n  e$3(Modeler, BaseModeler);\n\n\n  Modeler.Viewer = Viewer;\n  Modeler.NavigatedViewer = NavigatedViewer;\n\n  /**\n   * Create a new diagram to start modeling.\n   *\n   * @throws {ImportXMLError} An error thrown during the import of the XML.\n   *\n   * @return {Promise<ImportXMLResult>} A promise resolving with warnings that were produced during the import.\n   */\n  Modeler.prototype.createDiagram = function createDiagram() {\n    return this.importXML(initialDiagram);\n  };\n\n  Modeler.prototype.createDiagram = wrapForCompatibility(Modeler.prototype.createDiagram);\n\n\n  Modeler.prototype._interactionModules = [\n\n    // non-modeling components\n    KeyboardMoveModule,\n    MoveCanvasModule,\n    TouchModule,\n    ZoomScrollModule\n  ];\n\n  Modeler.prototype._modelingModules = [\n\n    // modeling components\n    AlignElementsModule,\n    AutoPlaceModule,\n    AutoScrollModule,\n    AutoResizeModule,\n    BendpointsModule,\n    ConnectModule,\n    ConnectionPreviewModule,\n    ContextPadModule,\n    CopyPasteModule,\n    CreateModule,\n    DistributeElementsModule,\n    EditorActionsModule,\n    GridSnappingModule,\n    InteractionEventsModule,\n    KeyboardModule,\n    KeyboardMoveSelectionModule,\n    LabelEditingModule,\n    ModelingModule,\n    MoveModule,\n    PaletteModule,\n    ReplacePreviewModule,\n    ResizeModule,\n    SnappingModule,\n    SearchModule\n  ];\n\n\n  // modules the modeler is composed of\n  //\n  // - viewer modules\n  // - interaction modules\n  // - modeling modules\n\n  Modeler.prototype._modules = [].concat(\n    Viewer.prototype._modules,\n    Modeler.prototype._interactionModules,\n    Modeler.prototype._modelingModules\n  );\n\n  return Modeler;\n\n}));\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bpmnjs/bpmn-modeler.production.min.js",
    "content": "/*! bpmn-js - bpmn-modeler v13.2.1 | Copyright (c) 2014-present, camunda Services GmbH | bpmn.io/license */\n!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).BpmnModeler=t()}(this,(function(){\"use strict\";function e(e,t){t&&(e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}var t=function(e,t){return e(t={exports:{}},t.exports),t.exports}((function(e){var t=e.exports=function(e,n){if(n||(n=16),void 0===e&&(e=128),e<=0)return\"0\";for(var i=Math.log(Math.pow(2,e))/Math.log(n),r=2;i===1/0;r*=2)i=Math.log(Math.pow(2,e/r))/Math.log(n)*r;var o=i-Math.floor(i),a=\"\";for(r=0;r<Math.floor(i);r++){a=Math.floor(Math.random()*n).toString(n)+a}if(o){var s=Math.pow(n,o);a=Math.floor(Math.random()*s).toString(n)+a}var c=parseInt(a,n);return c!==1/0&&c>=Math.pow(2,e)?t(e,n):a};t.rack=function(e,n,i){var r=function(r){var a=0;do{if(a++>10){if(!i)throw new Error(\"too many ID collisions, use more bits\");e+=i}var s=t(e,n)}while(Object.hasOwnProperty.call(o,s));return o[s]=r,s},o=r.hats={};return r.get=function(e){return r.hats[e]},r.set=function(e,t){return r.hats[e]=t,r},r.bits=e||128,r.base=n||16,r}}));function n(e){if(!(this instanceof n))return new n(e);e=e||[128,36,1],this._seed=e.length?t.rack(e[0],e[1],e[2]):e}function i(e){return Array.prototype.concat.apply([],e)}n.prototype.next=function(e){return this._seed(e||!0)},n.prototype.nextPrefixed=function(e,t){var n;do{n=e+this.next(!0)}while(this.assigned(n));return this.claim(n,t),n},n.prototype.claim=function(e,t){this._seed.set(e,t||!0)},n.prototype.assigned=function(e){return this._seed.get(e)||!1},n.prototype.unclaim=function(e){delete this._seed.hats[e]},n.prototype.clear=function(){var e,t=this._seed.hats;for(e in t)this.unclaim(e)};const r=Object.prototype.toString,o=Object.prototype.hasOwnProperty;function a(e){return void 0===e}function s(e){return void 0!==e}function c(e){return null==e}function p(e){return\"[object Array]\"===r.call(e)}function l(e){return\"[object Object]\"===r.call(e)}function u(e){return\"[object Number]\"===r.call(e)}function h(e){const t=r.call(e);return\"[object Function]\"===t||\"[object AsyncFunction]\"===t||\"[object GeneratorFunction]\"===t||\"[object AsyncGeneratorFunction]\"===t||\"[object Proxy]\"===t}function d(e){return\"[object String]\"===r.call(e)}function f(e,t){return o.call(e,t)}function m(e,t){const n=D(t);let i;return g(e,(function(e,t){if(n(e,t))return i=e,!1})),i}function v(e,t){const n=D(t);let i=p(e)?-1:void 0;return g(e,(function(e,t){if(n(e,t))return i=t,!1})),i}function y(e,t){const n=D(t);let i=[];return g(e,(function(e,t){n(e,t)&&i.push(e)})),i}function g(e,t){let n,i;if(a(e))return;const r=p(e)?N:B;for(let o in e)if(f(e,o)&&(n=e[o],i=t(n,r(o)),!1===i))return n}function b(e,t){if(a(e))return[];!function(e){if(!p(e))throw new Error(\"must supply array\")}(e);const n=D(t);return e.filter((function(e,t){return!n(e,t)}))}function x(e,t,n){return g(e,(function(e,i){n=t(n,e,i)})),n}function _(e,t){return!!x(e,(function(e,n,i){return e&&t(n,i)}),!0)}function w(e,t){return!!m(e,t)}function E(e,t){let n=[];return g(e,(function(e,i){n.push(t(e,i))})),n}function S(e){return e&&Object.keys(e)||[]}function C(e){return E(e,(e=>e))}function R(e,t,n={}){return t=M(t),g(e,(function(e){let i=t(e)||\"_\",r=n[i];r||(r=n[i]=[]),r.push(e)})),n}function P(e,...t){e=M(e);let n={};return g(t,(t=>R(t,e,n))),E(n,(function(e,t){return e[0]}))}const T=P;function k(e,t){t=M(t);let n=[];return g(e,(function(e,i){let r=t(e,i),o={d:r,v:e};for(var a=0;a<n.length;a++){let{d:e}=n[a];if(r<e)return void n.splice(a,0,o)}n.push(o)})),E(n,(e=>e.v))}function A(e){return function(t){return _(e,(function(e,n){return t[n]===e}))}}function M(e){return h(e)?e:t=>t[e]}function D(e){return h(e)?e:t=>t===e}function B(e){return e}function N(e){return Number(e)}function O(e,t){let n,i,r,o;function a(n){let a=Date.now(),p=n?0:o+t-a;if(p>0)return s(p);e.apply(r,i),c()}function s(e){n=setTimeout(a,e)}function c(){n&&clearTimeout(n),n=o=i=r=void 0}function p(...e){o=Date.now(),i=e,r=this,n||s(t)}return p.flush=function(){n&&a(!0),c()},p.cancel=c,p}function j(e,t){return e.bind(t)}function L(e,...t){return Object.assign(e,...t)}function I(e,t){let n={},i=Object(e);return g(t,(function(t){t in i&&(n[t]=e[t])})),n}function $(e,t){let n={};return g(Object(e),(function(e,i){-1===t.indexOf(i)&&(n[i]=e)})),n}function F(e,t){return t.forEach((function(t){t&&\"string\"!=typeof t&&!Array.isArray(t)&&Object.keys(t).forEach((function(n){if(\"default\"!==n&&!(n in e)){var i=Object.getOwnPropertyDescriptor(t,n);Object.defineProperty(e,n,i.get?i:{enumerable:!0,get:function(){return t[n]}})}}))})),Object.freeze(e)}const z=Object.prototype.toString,H=Object.prototype.hasOwnProperty;function G(e,t){return H.call(e,t)}function V(e,t){let n,i;if(void 0===e)return;const r=function(e){return\"[object Array]\"===z.call(e)}(e)?U:W;for(let o in e)if(G(e,o)&&(n=e[o],i=t(n,r(o)),!1===i))return n}function W(e){return e}function U(e){return Number(e)}function q(e,...t){const n=e.style;return V(t,(function(e){e&&V(e,(function(e,t){n[t]=e}))})),e}function K(e,t,n){return 2==arguments.length?e.getAttribute(t):null===n?e.removeAttribute(t):(e.setAttribute(t,n),e)}const Y=Object.prototype.toString;function X(e){return new Z(e)}function Z(e){if(!e||!e.nodeType)throw new Error(\"A DOM element reference is required\");this.el=e,this.list=e.classList}function Q(e){for(var t;e.childNodes.length;)t=e.childNodes[0],e.removeChild(t);return e}function J(e,t){return e&&\"function\"==typeof e.matches&&e.matches(t)}function ee(e,t,n){for(var i=n?e:e.parentNode;i&&i.nodeType!==document.DOCUMENT_NODE&&i.nodeType!==document.DOCUMENT_FRAGMENT_NODE;){if(J(i,t))return i;i=i.parentNode}return J(i,t)?i:null}Z.prototype.add=function(e){return this.list.add(e),this},Z.prototype.remove=function(e){return\"[object RegExp]\"==Y.call(e)?this.removeMatching(e):(this.list.remove(e),this)},Z.prototype.removeMatching=function(e){const t=this.array();for(let n=0;n<t.length;n++)e.test(t[n])&&this.remove(t[n]);return this},Z.prototype.toggle=function(e,t){return void 0!==t?t!==this.list.toggle(e,t)&&this.list.toggle(e):this.list.toggle(e),this},Z.prototype.array=function(){return Array.from(this.list)},Z.prototype.has=Z.prototype.contains=function(e){return this.list.contains(e)};var te,ne,ie,re={};function oe(){te=window.addEventListener?\"addEventListener\":\"attachEvent\",ne=window.removeEventListener?\"removeEventListener\":\"detachEvent\",ie=\"addEventListener\"!==te?\"on\":\"\"}var ae=F({__proto__:null,bind:re.bind=function(e,t,n,i){return te||oe(),e[te](ie+t,n,i||!1),n},unbind:re.unbind=function(e,t,n,i){return ne||oe(),e[ne](ie+t,n,i||!1),n},default:re},[re]),se=[\"focus\",\"blur\"];var ce,pe={bind:function(e,t,n,i,r){return-1!==se.indexOf(n)&&(r=!0),ae.bind(e,n,(function(n){var r=n.target||n.srcElement;n.delegateTarget=ee(r,t,!0),n.delegateTarget&&i.call(e,n)}),r)},unbind:function(e,t,n,i){return-1!==se.indexOf(t)&&(i=!0),ae.unbind(e,t,n,i)}},le=function(e,t){if(\"string\"!=typeof e)throw new TypeError(\"String expected\");t||(t=document);var n=/<([\\w:]+)/.exec(e);if(!n)return t.createTextNode(e);e=e.replace(/^\\s+|\\s+$/g,\"\");var i=n[1];if(\"body\"==i){return(r=t.createElement(\"html\")).innerHTML=e,r.removeChild(r.lastChild)}var r,o=Object.prototype.hasOwnProperty.call(he,i)?he[i]:he._default,a=o[0],s=o[1],c=o[2];(r=t.createElement(\"div\")).innerHTML=s+e+c;for(;a--;)r=r.lastChild;if(r.firstChild==r.lastChild)return r.removeChild(r.firstChild);var p=t.createDocumentFragment();for(;r.firstChild;)p.appendChild(r.removeChild(r.firstChild));return p},ue=!1;\"undefined\"!=typeof document&&((ce=document.createElement(\"div\")).innerHTML='  <link/><table></table><a href=\"/a\">a</a><input type=\"checkbox\"/>',ue=!ce.getElementsByTagName(\"link\").length,ce=void 0);var he={legend:[1,\"<fieldset>\",\"</fieldset>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],col:[2,\"<table><tbody></tbody><colgroup>\",\"</colgroup></table>\"],_default:ue?[1,\"X<div>\",\"</div>\"]:[0,\"\",\"\"]};he.td=he.th=[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],he.option=he.optgroup=[1,'<select multiple=\"multiple\">',\"</select>\"],he.thead=he.tbody=he.colgroup=he.caption=he.tfoot=[1,\"<table>\",\"</table>\"],he.polyline=he.ellipse=he.polygon=he.circle=he.text=he.line=he.path=he.rect=he.g=[1,'<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\">',\"</svg>\"];var de=le;function fe(e,t){return(t=t||document).querySelector(e)}function me(e,t){return(t=t||document).querySelectorAll(e)}function ve(e){e.parentNode&&e.parentNode.removeChild(e)}function ye(e,t){return t.appendChild(function(e,t){if(e.ownerDocument!==t.ownerDocument)try{return t.ownerDocument.importNode(e,!0)}catch(e){}return e}(e,t))}function ge(e,t){return ye(t,e),e}var be=2,xe={\"alignment-baseline\":1,\"baseline-shift\":1,clip:1,\"clip-path\":1,\"clip-rule\":1,color:1,\"color-interpolation\":1,\"color-interpolation-filters\":1,\"color-profile\":1,\"color-rendering\":1,cursor:1,direction:1,display:1,\"dominant-baseline\":1,\"enable-background\":1,fill:1,\"fill-opacity\":1,\"fill-rule\":1,filter:1,\"flood-color\":1,\"flood-opacity\":1,font:1,\"font-family\":1,\"font-size\":be,\"font-size-adjust\":1,\"font-stretch\":1,\"font-style\":1,\"font-variant\":1,\"font-weight\":1,\"glyph-orientation-horizontal\":1,\"glyph-orientation-vertical\":1,\"image-rendering\":1,kerning:1,\"letter-spacing\":1,\"lighting-color\":1,marker:1,\"marker-end\":1,\"marker-mid\":1,\"marker-start\":1,mask:1,opacity:1,overflow:1,\"pointer-events\":1,\"shape-rendering\":1,\"stop-color\":1,\"stop-opacity\":1,stroke:1,\"stroke-dasharray\":1,\"stroke-dashoffset\":1,\"stroke-linecap\":1,\"stroke-linejoin\":1,\"stroke-miterlimit\":1,\"stroke-opacity\":1,\"stroke-width\":be,\"text-anchor\":1,\"text-decoration\":1,\"text-rendering\":1,\"unicode-bidi\":1,visibility:1,\"word-spacing\":1,\"writing-mode\":1};function _e(e,t,n){var i=t.replace(/([a-z])([A-Z])/g,\"$1-$2\").toLowerCase(),r=xe[i];r?(r===be&&\"number\"==typeof n&&(n=String(n)+\"px\"),e.style[i]=n):e.setAttributeNS(null,t,n)}function we(e,t,n){if(\"string\"==typeof t){if(void 0===n)return function(e,t){return xe[t]?e.style[t]:e.getAttributeNS(null,t)}(e,t);_e(e,t,n)}else!function(e,t){var n,i,r=Object.keys(t);for(n=0;i=r[n];n++)_e(e,i,t[i])}(e,t);return e}const Ee=Object.prototype.toString;function Se(e){return new Ce(e)}function Ce(e){if(!e||!e.nodeType)throw new Error(\"A DOM element reference is required\");this.el=e,this.list=e.classList}function Re(e){var t=e.parentNode;return t&&t.removeChild(e),e}function Pe(e){for(var t;t=e.firstChild;)Re(t);return e}function Te(e){return e.cloneNode(!0)}Ce.prototype.add=function(e){return this.list.add(e),this},Ce.prototype.remove=function(e){return\"[object RegExp]\"==Ee.call(e)?this.removeMatching(e):(this.list.remove(e),this)},Ce.prototype.removeMatching=function(e){const t=this.array();for(let n=0;n<t.length;n++)e.test(t[n])&&this.remove(t[n]);return this},Ce.prototype.toggle=function(e,t){return void 0!==t?t!==this.list.toggle(e,t)&&this.list.toggle(e):this.list.toggle(e),this},Ce.prototype.array=function(){return Array.from(this.list)},Ce.prototype.has=Ce.prototype.contains=function(e){return this.list.contains(e)};var ke={svg:\"http://www.w3.org/2000/svg\"},Ae='<svg xmlns=\"'+ke.svg+'\"';function Me(e){var t=!1;\"<svg\"===e.substring(0,4)?-1===e.indexOf(ke.svg)&&(e=Ae+e.substring(4)):(e=Ae+\">\"+e+\"</svg>\",t=!0);var n=function(e){var t;return(t=new DOMParser).async=!1,t.parseFromString(e,\"text/xml\")}(e);if(!t)return n;for(var i=document.createDocumentFragment(),r=n.firstChild;r.firstChild;)i.appendChild(r.firstChild);return i}function De(e,t){var n;return\"<\"===e.charAt(0)?(n=Me(e).firstChild,n=document.importNode(n,!0)):n=document.createElementNS(ke.svg,e),t&&we(n,t),n}var Be=null;function Ne(){return null===Be&&(Be=De(\"svg\")),Be}function Oe(e,t){var n,i,r=Object.keys(t);for(n=0;i=r[n];n++)e[i]=t[i];return e}function je(e){return e?Ne().createSVGTransformFromMatrix(e):Ne().createSVGTransform()}var Le=/([&<>]{1})/g,Ie=/([\\n\\r\"]{1})/g,$e={\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"'\"};function Fe(e,t){return e.replace(t,(function(e,t){return $e[t]||t}))}function ze(e,t){var n,i,r,o,a;switch(e.nodeType){case 3:t.push(Fe(e.textContent,Le));break;case 1:if(t.push(\"<\",e.tagName),e.hasAttributes())for(n=0,i=(r=e.attributes).length;n<i;++n)o=r.item(n),t.push(\" \",o.name,'=\"',Fe(o.value,Ie),'\"');if(e.hasChildNodes()){for(t.push(\">\"),n=0,i=(a=e.childNodes).length;n<i;++n)ze(a.item(n),t);t.push(\"</\",e.tagName,\">\")}else t.push(\"/>\");break;case 8:t.push(\"\\x3c!--\",Fe(e.nodeValue,Le),\"--\\x3e\");break;case 4:t.push(\"<![CDATA[\",e.nodeValue,\"]]>\");break;default:throw new Error(\"unable to handle node \"+e.nodeType)}return t}function He(e,t){var n=Me(t);if(Pe(e),t){(function(e){return\"#document-fragment\"===e.nodeName})(n)||(n=n.documentElement);for(var i,r=(i=n.childNodes,Array.prototype.slice.call(i)),o=0;o<r.length;o++)ye(r[o],e)}}function Ge(e,t){if(void 0!==t){try{He(e,t)}catch(e){throw new Error(\"error parsing SVG: \"+e.message)}return e}return function(e){for(var t=e.firstChild,n=[];t;)ze(t,n),t=t.nextSibling;return n.join(\"\")}(e)}function Ve(e,t){return t instanceof SVGMatrix?e.createSVGTransformFromMatrix(t):t}function We(e,t){var n=e.transform.baseVal;return t&&(Array.isArray(t)||(t=[t]),function(e,t){var n,i;for(e.clear(),n=0;i=t[n];n++)e.appendItem(Ve(e,i))}(n,t)),n.consolidate()}const Ue=/^class[ {]/;function qe(e){return Array.isArray(e)}function Ke(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function Ye(...e){1===e.length&&qe(e[0])&&(e=e[0]);const t=(e=[...e]).pop();return t.$inject=e,t}const Xe=/constructor\\s*[^(]*\\(\\s*([^)]*)\\)/m,Ze=/^(?:async\\s+)?(?:function\\s*[^(]*)?(?:\\(\\s*([^)]*)\\)|(\\w+))/m,Qe=/\\/\\*([^*]*)\\*\\//m;function Je(e){if(\"function\"!=typeof e)throw new Error(`Cannot annotate \"${e}\". Expected a function!`);const t=e.toString().match(function(e){return Ue.test(e.toString())}(e)?Xe:Ze);if(!t)return[];const n=t[1]||t[2];return n&&n.split(\",\").map((e=>{const t=e.match(Qe);return(t&&t[1]||e).trim()}))||[]}function et(e,t){t=t||{get:function(e,t){if(n.push(e),!1===t)return null;throw a(`No provider for \"${e}\"!`)}};const n=[],i=this._providers=Object.create(t._providers||null),r=this._instances=Object.create(null),o=r.injector=this,a=function(e){const t=n.join(\" -> \");return n.length=0,new Error(t?`${e} (Resolving: ${t})`:e)};function s(e,o){if(!i[e]&&-1!==e.indexOf(\".\")){const t=e.split(\".\");let n=s(t.shift());for(;t.length;)n=n[t.shift()];return n}if(Ke(r,e))return r[e];if(Ke(i,e)){if(-1!==n.indexOf(e))throw n.push(e),a(\"Cannot resolve circular dependency!\");return n.push(e),r[e]=i[e][0](i[e][1]),n.pop(),r[e]}return t.get(e,o)}function c(e,t){if(void 0===t&&(t={}),\"function\"!=typeof e){if(!qe(e))throw a(`Cannot invoke \"${e}\". Expected a function!`);e=Ye(e.slice())}return{fn:e,dependencies:(e.$inject||Je(e)).map((e=>Ke(t,e)?t[e]:s(e)))}}function p(e){const{fn:t,dependencies:n}=c(e);return new(Function.prototype.bind.apply(t,[null].concat(n)))}function l(e,t,n){const{fn:i,dependencies:r}=c(e,n);return i.apply(t,r)}function u(e){return Ye((t=>e.get(t)))}function h(e,t){if(t&&t.length){const n=Object.create(null),r=Object.create(null),o=[],a=[],s=[];let c,p,l,h;for(let e in i)c=i[e],-1!==t.indexOf(e)&&(\"private\"===c[2]?(p=o.indexOf(c[3]),-1===p?(l=c[3].createChild([],t),h=u(l),o.push(c[3]),a.push(l),s.push(h),n[e]=[h,e,\"private\",l]):n[e]=[s[p],e,\"private\",a[p]]):n[e]=[c[2],c[1]],r[e]=!0),\"factory\"!==c[2]&&\"type\"!==c[2]||!c[1].$scope||t.forEach((t=>{-1!==c[1].$scope.indexOf(t)&&(n[e]=[c[2],c[1]],r[t]=!0)}));t.forEach((e=>{if(!r[e])throw new Error('No provider for \"'+e+'\". Cannot use provider from the parent!')})),e.unshift(n)}return new et(e,o)}const d={factory:l,type:p,value:function(e){return e}};function f(e,t){const n=e.__init__||[];return function(){n.forEach((e=>{\"string\"==typeof e?t.get(e):t.invoke(e)}))}}function m(e){const t=e.__exports__;if(t){const n=e.__modules__,r=Object.keys(e).reduce(((t,n)=>(\"__exports__\"!==n&&\"__modules__\"!==n&&\"__init__\"!==n&&\"__depends__\"!==n&&(t[n]=e[n]),t)),Object.create(null)),o=h((n||[]).concat(r)),a=Ye((function(e){return o.get(e)}));t.forEach((function(e){i[e]=[a,e,\"private\",o]}));const s=(e.__init__||[]).slice();return s.unshift((function(){o.init()})),f(e=Object.assign({},e,{__init__:s}),o)}return Object.keys(e).forEach((function(t){if(\"__init__\"===t||\"__depends__\"===t)return;if(\"private\"===e[t][2])return void(i[t]=e[t]);const n=e[t][0],r=e[t][1];i[t]=[d[n],tt(n,r),n]})),f(e,o)}function v(e,t){return-1!==e.indexOf(t)||-1!==(e=(t.__depends__||[]).reduce(v,e)).indexOf(t)?e:e.concat(t)}this.get=s,this.invoke=l,this.instantiate=p,this.createChild=h,this.init=function(e){const t=e.reduce(v,[]).map(m);let n=!1;return function(){n||(n=!0,t.forEach((e=>e())))}}(e)}function tt(e,t){return\"value\"!==e&&qe(t)&&(t=Ye(t.slice())),t}var nt=1e3;function it(e,t){var n=this;t=t||nt,e.on([\"render.shape\",\"render.connection\"],t,(function(e,t){var i=e.type,r=t.element,o=t.gfx,a=t.attrs;if(n.canRender(r))return\"render.shape\"===i?n.drawShape(o,r,a):n.drawConnection(o,r,a)})),e.on([\"render.getShapePath\",\"render.getConnectionPath\"],t,(function(e,t){if(n.canRender(t))return\"render.getShapePath\"===e.type?n.getShapePath(t):n.getConnectionPath(t)}))}function rt(e){return e.flat().join(\",\").replace(/,?([A-z]),?/g,\"$1\")}function ot(e){return[\"L\",e.x,e.y]}function at(e,t){const n=e.length,i=[(r=e[0],[\"M\",r.x,r.y])];var r,o,a,s;for(let r=1;r<n;r++){const n=e[r-1],c=e[r],p=e[r+1];if(!p||!t){i.push(ot(c));continue}const l=Math.min(t,ct(c.x-n.x,c.y-n.y),ct(p.x-c.x,p.y-c.y));if(!l){i.push(ot(c));continue}const u=st(c,n,l),h=st(c,n,.5*l),d=st(c,p,l),f=st(c,p,.5*l);i.push(ot(u)),i.push((a=f,s=d,[\"C\",(o=h).x,o.y,a.x,a.y,s.x,s.y]))}return i}function st(e,t,n){const i=t.x-e.x,r=t.y-e.y,o=n/ct(i,r);return{x:e.x+i*o,y:e.y+r*o}}function ct(e,t){return Math.sqrt(Math.pow(e,2)+Math.pow(t,2))}function pt(e,t,n){u(t)&&(n=t,t=null),t||(t={});const i=De(\"path\",t);return u(n)&&(i.dataset.cornerRadius=String(n)),lt(i,e)}function lt(e,t){return we(e,{d:rt(at(t,parseInt(e.dataset.cornerRadius,10)||0))}),e}function ut(e){return y(e,(function(t){return!m(e,(function(e){return e!==t&&ht(t,e)}))}))}function ht(e,t){if(t){if(e===t)return t;if(e.parent)return ht(e.parent,t)}}function dt(e,t,n){var i=!n||-1===e.indexOf(t);return i&&e.push(t),i}function ft(e,t,n){n=n||0,p(e)||(e=[e]),g(e,(function(e,i){var r=t(e,i,n);p(r)&&r.length&&ft(r,t,n+1)}))}function mt(e,t){return function(e,t,n){var i=[],r=[];return ft(e,(function(e,o,a){dt(i,e,t);var s=e.children;if((-1===n||a<n)&&s&&dt(r,s,t))return s})),i}(e,!t,-1)}function vt(e,t){var n,i,r,o;return t=!!t,p(e)||(e=[e]),g(e,(function(e){var a=e;e.waypoints&&!t&&(a=vt(e.waypoints,!0));var s=a.x,c=a.y,p=a.height||0,l=a.width||0;(s<n||void 0===n)&&(n=s),(c<i||void 0===i)&&(i=c),(s+l>r||void 0===r)&&(r=s+l),(c+p>o||void 0===o)&&(o=c+p)})),{x:n,y:i,height:o-i,width:r-n}}function yt(e){return\"waypoints\"in e?\"connection\":\"x\"in e?\"shape\":\"root\"}function gt(e){return!(!e||!e.isFrame)}function bt(e,t){return L({},e||{},t||{})}it.prototype.canRender=function(e){},it.prototype.drawShape=function(e,t){},it.prototype.drawConnection=function(e,t){},it.prototype.getShapePath=function(e){},it.prototype.getConnectionPath=function(e){};function xt(e,t){it.call(this,e,1),this.CONNECTION_STYLE=t.style([\"no-fill\"],{strokeWidth:5,stroke:\"fuchsia\"}),this.SHAPE_STYLE=t.style({fill:\"white\",stroke:\"fuchsia\",strokeWidth:2}),this.FRAME_STYLE=t.style([\"no-fill\"],{stroke:\"fuchsia\",strokeDasharray:4,strokeWidth:2})}e(xt,it),xt.prototype.canRender=function(){return!0},xt.prototype.drawShape=function(e,t,n){var i=De(\"rect\");return we(i,{x:0,y:0,width:t.width||0,height:t.height||0}),gt(t)?we(i,L({},this.FRAME_STYLE,n||{})):we(i,L({},this.SHAPE_STYLE,n||{})),ge(e,i),i},xt.prototype.drawConnection=function(e,t,n){var i=pt(t.waypoints,L({},this.CONNECTION_STYLE,n||{}));return ge(e,i),i},xt.prototype.getShapePath=function(e){var t=e.x,n=e.y,i=e.width;return rt([[\"M\",t,n],[\"l\",i,0],[\"l\",0,e.height],[\"l\",-i,0],[\"z\"]])},xt.prototype.getConnectionPath=function(e){var t,n,i=e.waypoints,r=[];for(t=0;n=i[t];t++)n=n.original||n,r.push([0===t?\"M\":\"L\",n.x,n.y]);return rt(r)},xt.$inject=[\"eventBus\",\"styles\"];var _t={__init__:[\"defaultRenderer\"],defaultRenderer:[\"type\",xt],styles:[\"type\",function(){var e={\"no-fill\":{fill:\"none\"},\"no-border\":{strokeOpacity:0},\"no-events\":{pointerEvents:\"none\"}},t=this;this.cls=function(e,t,n){return L(this.style(t,n),{class:e})},this.style=function(t,n){p(t)||n||(n=t,t=[]);var i=x(t,(function(t,n){return L(t,e[n]||{})}),{});return n?L(i,n):i},this.computeStyle=function(e,n,i){return p(n)||(i=n,n=[]),t.style(n||[],L({},i,e||{}))}}]};function wt(e,t){if(!e||!t)return-1;var n=e.indexOf(t);return-1!==n&&e.splice(n,1),n}function Et(e,t,n){if(e&&t){\"number\"!=typeof n&&(n=-1);var i=e.indexOf(t);if(-1!==i){if(i===n)return;if(-1===n)return;e.splice(i,1)}-1!==n?e.splice(n,0,t):e.push(t)}}function St(e,t){return e&&t?e.indexOf(t):-1}function Ct(e,t){return e&&t?Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2)):-1}function Rt(e,t,n,i){if(void 0===i&&(i=5),!e||!t||!n)return!1;var r=(t.x-e.x)*(n.y-e.y)-(t.y-e.y)*(n.x-e.x),o=Ct(e,t);return Math.abs(r/o)<=i}var Pt=2;function Tt(e,t){var n=Array.from(arguments).flat();const i={x:\"v\",y:\"h\"};for(const[e,t]of Object.entries(i))if(kt(e,n))return t;return!1}function kt(e,t){const n=t[0];return _(t,(function(t){return Math.abs(n[e]-t[e])<=Pt}))}function At(e,t,n){return n=n||0,e.x>t.x-n&&e.y>t.y-n&&e.x<t.x+t.width+n&&e.y<t.y+t.height+n}function Mt(e,t){return{x:Math.round(e.x+(t.x-e.x)/2),y:Math.round(e.y+(t.y-e.y)/2)}}function Dt(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,\"default\")?e.default:e}\n/**\n   * This file contains source code adapted from Snap.svg (licensed Apache-2.0).\n   *\n   * @see https://github.com/adobe-webplatform/Snap.svg/blob/master/src/path.js\n   */var Bt=/,?([a-z]),?/gi,Nt=parseFloat,Ot=Math,jt=Ot.PI,Lt=Ot.min,It=Ot.max,$t=Ot.pow,Ft=Ot.abs,zt=/([a-z])[\\s,]*((-?\\d*\\.?\\d*(?:e[-+]?\\d+)?[\\s]*,?[\\s]*)+)/gi,Ht=/(-?\\d*\\.?\\d*(?:e[-+]?\\d+)?)[\\s]*,?[\\s]*/gi,Gt=Array.isArray||function(e){return e instanceof Array};function Vt(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function Wt(e){if(\"function\"==typeof e||Object(e)!==e)return e;var t=new e.constructor;for(var n in e)Vt(e,n)&&(t[n]=Wt(e[n]));return t}function Ut(e){var t=Ut.ps=Ut.ps||{};return t[e]?t[e].sleep=100:t[e]={sleep:100},setTimeout((function(){for(var n in t)Vt(t,n)&&n!=e&&(t[n].sleep--,!t[n].sleep&&delete t[n])})),t[e]}function qt(e,t,n,i){return 1===arguments.length&&(t=e.y,n=e.width,i=e.height,e=e.x),{x:e,y:t,width:n,height:i,x2:e+n,y2:t+i}}function Kt(){return this.join(\",\").replace(Bt,\"$1\")}function Yt(e){var t=Wt(e);return t.toString=Kt,t}function Xt(e,t,n,i,r,o,a,s,c){var p=1-c,l=$t(p,3),u=$t(p,2),h=c*c*c,d=l*t+3*u*c*i+3*p*c*c*o+h*s;return{x:nn(l*e+3*u*c*n+3*p*c*c*r+h*a),y:nn(d)}}function Zt(e){var t=ln.apply(null,e);return qt(t.x0,t.y0,t.x1-t.x0,t.y1-t.y0)}function Qt(e,t,n){return t>=e.x&&t<=e.x+e.width&&n>=e.y&&n<=e.y+e.height}function Jt(e,t,n,i,r){return e*(e*(-3*t+9*n-9*i+3*r)+6*t-12*n+6*i)-3*t+3*n}function en(e,t,n,i,r,o,a,s,c){null==c&&(c=1);for(var p=(c=c>1?1:c<0?0:c)/2,l=[-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],u=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],h=0,d=0;d<12;d++){var f=p*l[d]+p,m=Jt(f,e,n,r,a),v=Jt(f,t,i,o,s),y=m*m+v*v;h+=u[d]*Ot.sqrt(y)}return p*h}function tn(e,t,n,i,r,o,a,s){if(!(It(e,n)<Lt(r,a)||Lt(e,n)>It(r,a)||It(t,i)<Lt(o,s)||Lt(t,i)>It(o,s))){var c=(e*i-t*n)*(o-s)-(t-i)*(r*s-o*a),p=(e-n)*(o-s)-(t-i)*(r-a);if(p){var l=nn(((e*i-t*n)*(r-a)-(e-n)*(r*s-o*a))/p),u=nn(c/p),h=+l.toFixed(2),d=+u.toFixed(2);if(!(h<+Lt(e,n).toFixed(2)||h>+It(e,n).toFixed(2)||h<+Lt(r,a).toFixed(2)||h>+It(r,a).toFixed(2)||d<+Lt(t,i).toFixed(2)||d>+It(t,i).toFixed(2)||d<+Lt(o,s).toFixed(2)||d>+It(o,s).toFixed(2)))return{x:l,y:u}}}}function nn(e){return Math.round(1e11*e)/1e11}function rn(e,t,n){if(!function(e,t){return e=qt(e),Qt(t=qt(t),e.x,e.y)||Qt(t,e.x2,e.y)||Qt(t,e.x,e.y2)||Qt(t,e.x2,e.y2)||Qt(e,t.x,t.y)||Qt(e,t.x2,t.y)||Qt(e,t.x,t.y2)||Qt(e,t.x2,t.y2)||(e.x<t.x2&&e.x>t.x||t.x<e.x2&&t.x>e.x)&&(e.y<t.y2&&e.y>t.y||t.y<e.y2&&t.y>e.y)}(Zt(e),Zt(t)))return n?0:[];for(var i=en.apply(0,e),r=en.apply(0,t),o=an(e)?1:~~(i/5)||1,a=an(t)?1:~~(r/5)||1,s=[],c=[],p={},l=n?0:[],u=0;u<o+1;u++){var h=Xt.apply(0,e.concat(u/o));s.push({x:h.x,y:h.y,t:u/o})}for(u=0;u<a+1;u++)h=Xt.apply(0,t.concat(u/a)),c.push({x:h.x,y:h.y,t:u/a});for(u=0;u<o;u++)for(var d=0;d<a;d++){var f,m=s[u],v=s[u+1],y=c[d],g=c[d+1],b=Ft(v.x-m.x)<.01?\"y\":\"x\",x=Ft(g.x-y.x)<.01?\"y\":\"x\",_=tn(m.x,m.y,v.x,v.y,y.x,y.y,g.x,g.y);if(_){if(p[f=_.x.toFixed(9)+\"#\"+_.y.toFixed(9)])continue;p[f]=!0;var w=m.t+Ft((_[b]-m[b])/(v[b]-m[b]))*(v.t-m.t),E=y.t+Ft((_[x]-y[x])/(g[x]-y[x]))*(g.t-y.t);w>=0&&w<=1&&E>=0&&E<=1&&(n?l++:l.push({x:_.x,y:_.y,t1:w,t2:E}))}}return l}function on(e){var t=Ut(e);if(t.abs)return Yt(t.abs);if(Gt(e)&&Gt(e&&e[0])||(e=function(e){if(!e)return null;var t=Ut(e);if(t.arr)return Wt(t.arr);var n={a:7,c:6,h:1,l:2,m:2,q:4,s:4,t:2,v:1,z:0},i=[];return Gt(e)&&Gt(e[0])&&(i=Wt(e)),i.length||String(e).replace(zt,(function(e,t,r){var o=[],a=t.toLowerCase();for(r.replace(Ht,(function(e,t){t&&o.push(+t)})),\"m\"==a&&o.length>2&&(i.push([t].concat(o.splice(0,2))),a=\"l\",t=\"m\"==t?\"l\":\"L\");o.length>=n[a]&&(i.push([t].concat(o.splice(0,n[a]))),n[a]););})),i.toString=Ut.toString,t.arr=Wt(i),i}(e)),!e||!e.length)return[[\"M\",0,0]];var n,i=[],r=0,o=0,a=0,s=0,c=0;\"M\"==e[0][0]&&(a=r=+e[0][1],s=o=+e[0][2],c++,i[0]=[\"M\",r,o]);for(var p,l,u=c,h=e.length;u<h;u++){if(i.push(p=[]),(n=(l=e[u])[0])!=n.toUpperCase())switch(p[0]=n.toUpperCase(),p[0]){case\"A\":p[1]=l[1],p[2]=l[2],p[3]=l[3],p[4]=l[4],p[5]=l[5],p[6]=+l[6]+r,p[7]=+l[7]+o;break;case\"V\":p[1]=+l[1]+o;break;case\"H\":p[1]=+l[1]+r;break;case\"M\":a=+l[1]+r,s=+l[2]+o;default:for(var d=1,f=l.length;d<f;d++)p[d]=+l[d]+(d%2?r:o)}else for(var m=0,v=l.length;m<v;m++)p[m]=l[m];switch(n=n.toUpperCase(),p[0]){case\"Z\":r=+a,o=+s;break;case\"H\":r=p[1];break;case\"V\":o=p[1];break;case\"M\":a=p[p.length-2],s=p[p.length-1];default:r=p[p.length-2],o=p[p.length-1]}}return i.toString=Kt,t.abs=Yt(i),i}function an(e){return e[0]===e[2]&&e[1]===e[3]&&e[4]===e[6]&&e[5]===e[7]}function sn(e,t,n,i){return[e,t,n,i,n,i]}function cn(e,t,n,i,r,o){var a=1/3,s=2/3;return[a*e+s*n,a*t+s*i,a*r+s*n,a*o+s*i,r,o]}function pn(e,t,n,i,r,o,a,s,c,p){var l,u=120*jt/180,h=jt/180*(+r||0),d=[],f=function(e){return function t(){var n=Array.prototype.slice.call(arguments,0),i=n.join(\"␀\"),r=t.cache=t.cache||{},o=t.count=t.count||[];return Vt(r,i)?(function(e,t){for(var n=0,i=e.length;n<i;n++)if(e[n]===t)return e.push(e.splice(n,1)[0])}(o,i),r[i]):(o.length>=1e3&&delete r[o.shift()],o.push(i),r[i]=e.apply(0,n),r[i])}}((function(e,t,n){return{x:e*Ot.cos(n)-t*Ot.sin(n),y:e*Ot.sin(n)+t*Ot.cos(n)}}));if(p)E=p[0],S=p[1],_=p[2],w=p[3];else{e=(l=f(e,t,-h)).x,t=l.y;var m=(e-(s=(l=f(s,c,-h)).x))/2,v=(t-(c=l.y))/2,y=m*m/(n*n)+v*v/(i*i);y>1&&(n*=y=Ot.sqrt(y),i*=y);var g=n*n,b=i*i,x=(o==a?-1:1)*Ot.sqrt(Ft((g*b-g*v*v-b*m*m)/(g*v*v+b*m*m))),_=x*n*v/i+(e+s)/2,w=x*-i*m/n+(t+c)/2,E=Ot.asin(((t-w)/i).toFixed(9)),S=Ot.asin(((c-w)/i).toFixed(9));(E=e<_?jt-E:E)<0&&(E=2*jt+E),(S=s<_?jt-S:S)<0&&(S=2*jt+S),a&&E>S&&(E-=2*jt),!a&&S>E&&(S-=2*jt)}var C=S-E;if(Ft(C)>u){var R=S,P=s,T=c;S=E+u*(a&&S>E?1:-1),d=pn(s=_+n*Ot.cos(S),c=w+i*Ot.sin(S),n,i,r,0,a,P,T,[S,R,_,w])}C=S-E;var k=Ot.cos(E),A=Ot.sin(E),M=Ot.cos(S),D=Ot.sin(S),B=Ot.tan(C/4),N=4/3*n*B,O=4/3*i*B,j=[e,t],L=[e+N*A,t-O*k],I=[s+N*D,c-O*M],$=[s,c];if(L[0]=2*j[0]-L[0],L[1]=2*j[1]-L[1],p)return[L,I,$].concat(d);for(var F=[],z=0,H=(d=[L,I,$].concat(d).join().split(\",\")).length;z<H;z++)F[z]=z%2?f(d[z-1],d[z],h).y:f(d[z],d[z+1],h).x;return F}function ln(e,t,n,i,r,o,a,s){for(var c,p,l,u,h,d,f,m,v=[],y=[[],[]],g=0;g<2;++g)if(0==g?(p=6*e-12*n+6*r,c=-3*e+9*n-9*r+3*a,l=3*n-3*e):(p=6*t-12*i+6*o,c=-3*t+9*i-9*o+3*s,l=3*i-3*t),Ft(c)<1e-12){if(Ft(p)<1e-12)continue;0<(u=-l/p)&&u<1&&v.push(u)}else f=p*p-4*l*c,m=Ot.sqrt(f),f<0||(0<(h=(-p+m)/(2*c))&&h<1&&v.push(h),0<(d=(-p-m)/(2*c))&&d<1&&v.push(d));for(var b,x=v.length,_=x;x--;)b=1-(u=v[x]),y[0][x]=b*b*b*e+3*b*b*u*n+3*b*u*u*r+u*u*u*a,y[1][x]=b*b*b*t+3*b*b*u*i+3*b*u*u*o+u*u*u*s;return y[0][_]=e,y[1][_]=t,y[0][_+1]=a,y[1][_+1]=s,y[0].length=y[1].length=_+2,{x0:Lt.apply(0,y[0]),y0:Lt.apply(0,y[1]),x1:It.apply(0,y[0]),y1:It.apply(0,y[1])}}function un(e){var t=Ut(e);if(t.curve)return Yt(t.curve);for(var n=on(e),i={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},r=function(e,t,n){var i,r;if(!e)return[\"C\",t.x,t.y,t.x,t.y,t.x,t.y];switch(!(e[0]in{T:1,Q:1})&&(t.qx=t.qy=null),e[0]){case\"M\":t.X=e[1],t.Y=e[2];break;case\"A\":e=[\"C\"].concat(pn.apply(0,[t.x,t.y].concat(e.slice(1))));break;case\"S\":\"C\"==n||\"S\"==n?(i=2*t.x-t.bx,r=2*t.y-t.by):(i=t.x,r=t.y),e=[\"C\",i,r].concat(e.slice(1));break;case\"T\":\"Q\"==n||\"T\"==n?(t.qx=2*t.x-t.qx,t.qy=2*t.y-t.qy):(t.qx=t.x,t.qy=t.y),e=[\"C\"].concat(cn(t.x,t.y,t.qx,t.qy,e[1],e[2]));break;case\"Q\":t.qx=e[1],t.qy=e[2],e=[\"C\"].concat(cn(t.x,t.y,e[1],e[2],e[3],e[4]));break;case\"L\":e=[\"C\"].concat(sn(t.x,t.y,e[1],e[2]));break;case\"H\":e=[\"C\"].concat(sn(t.x,t.y,e[1],t.y));break;case\"V\":e=[\"C\"].concat(sn(t.x,t.y,t.x,e[1]));break;case\"Z\":e=[\"C\"].concat(sn(t.x,t.y,t.X,t.Y))}return e},o=function(e,t){if(e[t].length>7){e[t].shift();for(var i=e[t];i.length;)a[t]=\"A\",e.splice(t++,0,[\"C\"].concat(i.splice(0,6)));e.splice(t,1),l=n.length}},a=[],s=\"\",c=\"\",p=0,l=n.length;p<l;p++){n[p]&&(s=n[p][0]),\"C\"!=s&&(a[p]=s,p&&(c=a[p-1])),n[p]=r(n[p],i,c),\"A\"!=a[p]&&\"C\"==s&&(a[p]=\"C\"),o(n,p);var u=n[p],h=u.length;i.x=u[h-2],i.y=u[h-1],i.bx=Nt(u[h-4])||i.x,i.by=Nt(u[h-3])||i.y}return t.curve=Yt(n),n}var hn=function(e,t,n){e=un(e),t=un(t);for(var i,r,o,a,s,c,p,l,u,h,d=n?0:[],f=0,m=e.length;f<m;f++){var v=e[f];if(\"M\"==v[0])i=s=v[1],r=c=v[2];else{\"C\"==v[0]?(u=[i,r].concat(v.slice(1)),i=u[6],r=u[7]):(u=[i,r,i,r,s,c,s,c],i=s,r=c);for(var y=0,g=t.length;y<g;y++){var b=t[y];if(\"M\"==b[0])o=p=b[1],a=l=b[2];else{\"C\"==b[0]?(h=[o,a].concat(b.slice(1)),o=h[6],a=h[7]):(h=[o,a,o,a,p,l,p,l],o=p,a=l);var x=rn(u,h,n);if(n)d+=x;else{for(var _=0,w=x.length;_<w;_++)x[_].segment1=f,x[_].segment2=y,x[_].bez1=u,x[_].bez2=h;d=d.concat(x)}}}}}return d},dn=Dt(hn);function fn(e){return l(e)&&f(e,\"waypoints\")}function mn(e){return l(e)&&f(e,\"labelTarget\")}function vn(e){return{x:Math.round(e.x),y:Math.round(e.y),width:Math.round(e.width),height:Math.round(e.height)}}function yn(e){return{x:Math.round(e.x),y:Math.round(e.y)}}function gn(e){return{top:e.y,right:e.x+(e.width||0),bottom:e.y+(e.height||0),left:e.x}}function bn(e){return{x:e.left,y:e.top,width:e.right-e.left,height:e.bottom-e.top}}function xn(e){for(var t=e.waypoints,n=t.reduce((function(e,n,i){var r=t[i-1];if(r){var o=e[e.length-1],a=o&&o.endLength||0,s=function(e,t){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))}(r,n);e.push({start:r,end:n,startLength:a,endLength:a+s,length:s})}return e}),[]),i=n.reduce((function(e,t){return e+t.length}),0),r=i/2,o=0,a=n[o];a.endLength<r;)a=n[++o];var s=(r-a.startLength)/a.length;return{x:a.start.x+(a.end.x-a.start.x)*s,y:a.start.y+(a.end.y-a.start.y)*s}}function _n(e){return fn(e)?xn(e):yn({x:(t=e).x+(t.width||0)/2,y:t.y+(t.height||0)/2});var t}function wn(e,t,n){l(n=n||0)||(n={x:n,y:n});var i=gn(e),r=gn(t),o=i.bottom+n.y<=r.top,a=i.left-n.x>=r.right,s=i.top-n.y>=r.bottom,c=o?\"top\":s?\"bottom\":null,p=i.right+n.x<=r.left?\"left\":a?\"right\":null;return p&&c?c+\"-\"+p:p||c||\"intersect\"}function En(e,t,n){var i=function(e,t){return dn(e,t)}(e,t);return 1===i.length||2===i.length&&Ct(i[0],i[1])<1?yn(i[0]):i.length>1?(i=k(i,(function(e){var t=Math.floor(100*e.t2)||1;return t=((t=100-t)<10?\"0\":\"\")+t,e.segment2+\"#\"+t})),yn(i[n?0:i.length-1])):null}function Sn(e,t){return Math.round(e*t)/t}function Cn(e){return u(e)?e+\"px\":e}function Rn(e,t,n){const i=De(\"g\");Se(i).add(t);const r=void 0!==n?n:e.childNodes.length-1;return e.insertBefore(i,e.childNodes[r]||null),i}const Pn={shape:[\"x\",\"y\",\"width\",\"height\"],connection:[\"waypoints\"]};function Tn(e,t,n,i){this._eventBus=t,this._elementRegistry=i,this._graphicsFactory=n,this._rootsIdx=0,this._layers={},this._planes=[],this._rootElement=null,this._init(e||{})}function kn(e,t){const n=\"matrix(\"+t.a+\",\"+t.b+\",\"+t.c+\",\"+t.d+\",\"+t.e+\",\"+t.f+\")\";e.setAttribute(\"transform\",n)}Tn.$inject=[\"config.canvas\",\"eventBus\",\"graphicsFactory\",\"elementRegistry\"],Tn.prototype._init=function(e){const t=this._eventBus,n=this._container=function(e){const t=(e=L({},{width:\"100%\",height:\"100%\"},e)).container||document.body,n=document.createElement(\"div\");return n.setAttribute(\"class\",\"djs-container djs-parent\"),q(n,{position:\"relative\",overflow:\"hidden\",width:Cn(e.width),height:Cn(e.height)}),t.appendChild(n),n}(e),i=this._svg=De(\"svg\");we(i,{width:\"100%\",height:\"100%\"}),ge(n,i);const r=this._viewport=Rn(i,\"viewport\");!1!==e.deferUpdate&&(this._viewboxChanged=O(j(this._viewboxChanged,this),300)),t.on(\"diagram.init\",(()=>{t.fire(\"canvas.init\",{svg:i,viewport:r})})),t.on([\"shape.added\",\"connection.added\",\"shape.removed\",\"connection.removed\",\"elements.changed\",\"root.set\"],(()=>{delete this._cachedViewbox})),t.on(\"diagram.destroy\",500,this._destroy,this),t.on(\"diagram.clear\",500,this._clear,this)},Tn.prototype._destroy=function(){this._eventBus.fire(\"canvas.destroy\",{svg:this._svg,viewport:this._viewport});const e=this._container.parentNode;e&&e.removeChild(this._container),delete this._svg,delete this._container,delete this._layers,delete this._planes,delete this._rootElement,delete this._viewport},Tn.prototype._clear=function(){this._elementRegistry.getAll().forEach((e=>{const t=yt(e);\"root\"===t?this.removeRootElement(e):this._removeElement(e,t)})),this._planes=[],this._rootElement=null,delete this._cachedViewbox},Tn.prototype.getDefaultLayer=function(){return this.getLayer(\"base\",0)},Tn.prototype.getLayer=function(e,t){if(!e)throw new Error(\"must specify a name\");let n=this._layers[e];if(n||(n=this._layers[e]=this._createLayer(e,t)),void 0!==t&&n.index!==t)throw new Error(\"layer <\"+e+\"> already created at index <\"+t+\">\");return n.group},Tn.prototype._getChildIndex=function(e){return x(this._layers,(function(t,n){return n.visible&&e>=n.index&&t++,t}),0)},Tn.prototype._createLayer=function(e,t){void 0===t&&(t=1);const n=this._getChildIndex(t);return{group:Rn(this._viewport,\"layer-\"+e,n),index:t,visible:!0}},Tn.prototype.showLayer=function(e){if(!e)throw new Error(\"must specify a name\");const t=this._layers[e];if(!t)throw new Error(\"layer <\"+e+\"> does not exist\");const n=this._viewport,i=t.group,r=t.index;if(t.visible)return i;const o=this._getChildIndex(r);return n.insertBefore(i,n.childNodes[o]||null),t.visible=!0,i},Tn.prototype.hideLayer=function(e){if(!e)throw new Error(\"must specify a name\");const t=this._layers[e];if(!t)throw new Error(\"layer <\"+e+\"> does not exist\");const n=t.group;return t.visible?(Re(n),t.visible=!1,n):n},Tn.prototype._removeLayer=function(e){const t=this._layers[e];t&&(delete this._layers[e],Re(t.group))},Tn.prototype.getActiveLayer=function(){const e=this._findPlaneForRoot(this.getRootElement());return e?e.layer:null},Tn.prototype.findRoot=function(e){if(\"string\"==typeof e&&(e=this._elementRegistry.get(e)),!e)return;const t=this._findPlaneForRoot(function(e){for(;e.parent;)e=e.parent;return e}(e))||{};return t.rootElement},Tn.prototype.getRootElements=function(){return this._planes.map((function(e){return e.rootElement}))},Tn.prototype._findPlaneForRoot=function(e){return m(this._planes,(function(t){return t.rootElement===e}))},Tn.prototype.getContainer=function(){return this._container},Tn.prototype._updateMarker=function(e,t,n){let i;e.id||(e=this._elementRegistry.get(e)),i=this._elementRegistry._elements[e.id],i&&(g([i.gfx,i.secondaryGfx],(function(e){e&&(n?Se(e).add(t):Se(e).remove(t))})),this._eventBus.fire(\"element.marker.update\",{element:e,gfx:i.gfx,marker:t,add:!!n}))},Tn.prototype.addMarker=function(e,t){this._updateMarker(e,t,!0)},Tn.prototype.removeMarker=function(e,t){this._updateMarker(e,t,!1)},Tn.prototype.hasMarker=function(e,t){e.id||(e=this._elementRegistry.get(e));return Se(this.getGraphics(e)).has(t)},Tn.prototype.toggleMarker=function(e,t){this.hasMarker(e,t)?this.removeMarker(e,t):this.addMarker(e,t)},Tn.prototype.getRootElement=function(){const e=this._rootElement;return e||this._planes.length?e:this.setRootElement(this.addRootElement(null))},Tn.prototype.addRootElement=function(e){const t=this._rootsIdx++;e||(e={id:\"__implicitroot_\"+t,children:[],isImplicit:!0});const n=e.layer=\"root-\"+t;this._ensureValid(\"root\",e);const i=this.getLayer(n,0);return this.hideLayer(n),this._addRoot(e,i),this._planes.push({rootElement:e,layer:i}),e},Tn.prototype.removeRootElement=function(e){\"string\"==typeof e&&(e=this._elementRegistry.get(e));if(this._findPlaneForRoot(e))return this._removeRoot(e),this._removeLayer(e.layer),this._planes=this._planes.filter((function(t){return t.rootElement!==e})),this._rootElement===e&&(this._rootElement=null),e},Tn.prototype.setRootElement=function(e){if(e===this._rootElement)return;let t;if(!e)throw new Error(\"rootElement required\");return t=this._findPlaneForRoot(e),t||(e=this.addRootElement(e)),this._setRoot(e),e},Tn.prototype._removeRoot=function(e){const t=this._elementRegistry,n=this._eventBus;n.fire(\"root.remove\",{element:e}),n.fire(\"root.removed\",{element:e}),t.remove(e)},Tn.prototype._addRoot=function(e,t){const n=this._elementRegistry,i=this._eventBus;i.fire(\"root.add\",{element:e}),n.add(e,t),i.fire(\"root.added\",{element:e,gfx:t})},Tn.prototype._setRoot=function(e,t){const n=this._rootElement;n&&(this._elementRegistry.updateGraphics(n,null,!0),this.hideLayer(n.layer)),e&&(t||(t=this._findPlaneForRoot(e).layer),this._elementRegistry.updateGraphics(e,this._svg,!0),this.showLayer(e.layer)),this._rootElement=e,this._eventBus.fire(\"root.set\",{element:e})},Tn.prototype._ensureValid=function(e,t){if(!t.id)throw new Error(\"element must have an id\");if(this._elementRegistry.get(t.id))throw new Error(\"element <\"+t.id+\"> already exists\");const n=Pn[e],i=_(n,(function(e){return void 0!==t[e]}));if(!i)throw new Error(\"must supply { \"+n.join(\", \")+\" } with \"+e)},Tn.prototype._setParent=function(e,t,n){Et(t.children,e,n),e.parent=t},Tn.prototype._addElement=function(e,t,n,i){n=n||this.getRootElement();const r=this._eventBus,o=this._graphicsFactory;this._ensureValid(e,t),r.fire(e+\".add\",{element:t,parent:n}),this._setParent(t,n,i);const a=o.create(e,t,i);return this._elementRegistry.add(t,a),o.update(e,t,a),r.fire(e+\".added\",{element:t,gfx:a}),t},Tn.prototype.addShape=function(e,t,n){return this._addElement(\"shape\",e,t,n)},Tn.prototype.addConnection=function(e,t,n){return this._addElement(\"connection\",e,t,n)},Tn.prototype._removeElement=function(e,t){const n=this._elementRegistry,i=this._graphicsFactory,r=this._eventBus;if(e=n.get(e.id||e))return r.fire(t+\".remove\",{element:e}),i.remove(e),wt(e.parent&&e.parent.children,e),e.parent=null,r.fire(t+\".removed\",{element:e}),n.remove(e),e},Tn.prototype.removeShape=function(e){return this._removeElement(e,\"shape\")},Tn.prototype.removeConnection=function(e){return this._removeElement(e,\"connection\")},Tn.prototype.getGraphics=function(e,t){return this._elementRegistry.getGraphics(e,t)},Tn.prototype._changeViewbox=function(e){this._eventBus.fire(\"canvas.viewbox.changing\"),e.apply(this),this._cachedViewbox=null,this._viewboxChanged()},Tn.prototype._viewboxChanged=function(){this._eventBus.fire(\"canvas.viewbox.changed\",{viewbox:this.viewbox()})},Tn.prototype.viewbox=function(e){if(void 0===e&&this._cachedViewbox)return this._cachedViewbox;const t=this._viewport,n=this.getSize();let i,r,o,a,s,c,p;return e?(this._changeViewbox((function(){s=Math.min(n.width/e.width,n.height/e.height);const i=this._svg.createSVGMatrix().scale(s).translate(-e.x,-e.y);We(t,i)})),e):(o=this._rootElement?this.getActiveLayer():null,i=o&&o.getBBox()||{},a=We(t),r=a?a.matrix:function(e,t,n,i,r,o){var a=Ne().createSVGMatrix();switch(arguments.length){case 0:return a;case 1:return Oe(a,e);case 6:return Oe(a,{a:e,b:t,c:n,d:i,e:r,f:o})}}(),s=Sn(r.a,1e3),c=Sn(-r.e||0,1e3),p=Sn(-r.f||0,1e3),e=this._cachedViewbox={x:c?c/s:0,y:p?p/s:0,width:n.width/s,height:n.height/s,scale:s,inner:{width:i.width||0,height:i.height||0,x:i.x||0,y:i.y||0},outer:n})},Tn.prototype.scroll=function(e){const t=this._viewport;let n=t.getCTM();return e&&this._changeViewbox((function(){e=L({dx:0,dy:0},e||{}),n=this._svg.createSVGMatrix().translate(e.dx,e.dy).multiply(n),kn(t,n)})),{x:n.e,y:n.f}},Tn.prototype.scrollToElement=function(e,t){let n=100;\"string\"==typeof e&&(e=this._elementRegistry.get(e));const i=this.findRoot(e);i!==this.getRootElement()&&this.setRootElement(i),t||(t={}),\"number\"==typeof t&&(n=t),t={top:t.top||n,right:t.right||n,bottom:t.bottom||n,left:t.left||n};const r=vt(e),o=gn(r),a=this.viewbox(),s=this.zoom();let c,p;a.y+=t.top/s,a.x+=t.left/s,a.width-=(t.right+t.left)/s,a.height-=(t.bottom+t.top)/s;const l=gn(a);if(r.width<a.width&&r.height<a.height){const e=Math.max(0,o.right-l.right),t=Math.min(0,o.left-l.left),n=Math.max(0,o.bottom-l.bottom),i=Math.min(0,o.top-l.top);c=e||t,p=n||i}else c=r.x-a.x,p=r.y-a.y;this.scroll({dx:-c*s,dy:-p*s})},Tn.prototype.zoom=function(e,t){if(!e)return this.viewbox(e).scale;if(\"fit-viewport\"===e)return this._fitViewport(t);let n,i;return this._changeViewbox((function(){\"object\"!=typeof t&&(n=this.viewbox().outer,t={x:n.width/2,y:n.height/2}),i=this._setZoom(e,t)})),Sn(i.a,1e3)},Tn.prototype._fitViewport=function(e){const t=this.viewbox(),n=t.outer,i=t.inner;let r,o;return i.x>=0&&i.y>=0&&i.x+i.width<=n.width&&i.y+i.height<=n.height&&!e?o={x:0,y:0,width:Math.max(i.width+i.x,n.width),height:Math.max(i.height+i.y,n.height)}:(r=Math.min(1,n.width/i.width,n.height/i.height),o={x:i.x+(e?i.width/2-n.width/r/2:0),y:i.y+(e?i.height/2-n.height/r/2:0),width:n.width/r,height:n.height/r}),this.viewbox(o),this.viewbox(!1).scale},Tn.prototype._setZoom=function(e,t){const n=this._svg,i=this._viewport,r=n.createSVGMatrix(),o=n.createSVGPoint();let a,s,c,p,l;c=i.getCTM();const u=c.a;return t?(a=L(o,t),s=a.matrixTransform(c.inverse()),p=r.translate(s.x,s.y).scale(1/u*e).translate(-s.x,-s.y),l=c.multiply(p)):l=r.scale(e),kn(this._viewport,l),l},Tn.prototype.getSize=function(){return{width:this._container.clientWidth,height:this._container.clientHeight}},Tn.prototype.getAbsoluteBBox=function(e){const t=this.viewbox();let n;if(e.waypoints){n=this.getGraphics(e).getBBox()}else n=e;return{x:n.x*t.scale-t.x*t.scale,y:n.y*t.scale-t.y*t.scale,width:n.width*t.scale,height:n.height*t.scale}},Tn.prototype.resized=function(){delete this._cachedViewbox,this._eventBus.fire(\"canvas.resized\")};var An=\"data-element-id\";function Mn(e){this._elements={},this._eventBus=e}Mn.$inject=[\"eventBus\"],Mn.prototype.add=function(e,t,n){var i=e.id;this._validateId(i),we(t,An,i),n&&we(n,An,i),this._elements[i]={element:e,gfx:t,secondaryGfx:n}},Mn.prototype.remove=function(e){var t=this._elements,n=e.id||e,i=n&&t[n];i&&(we(i.gfx,An,\"\"),i.secondaryGfx&&we(i.secondaryGfx,An,\"\"),delete t[n])},Mn.prototype.updateId=function(e,t){this._validateId(t),\"string\"==typeof e&&(e=this.get(e)),this._eventBus.fire(\"element.updateId\",{element:e,newId:t});var n=this.getGraphics(e),i=this.getGraphics(e,!0);this.remove(e),e.id=t,this.add(e,n,i)},Mn.prototype.updateGraphics=function(e,t,n){var i=e.id||e,r=this._elements[i];return n?r.secondaryGfx=t:r.gfx=t,t&&we(t,An,i),t},Mn.prototype.get=function(e){var t;t=\"string\"==typeof e?e:e&&we(e,An);var n=this._elements[t];return n&&n.element},Mn.prototype.filter=function(e){var t=[];return this.forEach((function(n,i){e(n,i)&&t.push(n)})),t},Mn.prototype.find=function(e){for(var t=this._elements,n=Object.keys(t),i=0;i<n.length;i++){var r=t[n[i]],o=r.element;if(e(o,r.gfx))return o}},Mn.prototype.getAll=function(){return this.filter((function(e){return e}))},Mn.prototype.forEach=function(e){var t=this._elements;Object.keys(t).forEach((function(n){var i=t[n],r=i.element,o=i.gfx;return e(r,o)}))},Mn.prototype.getGraphics=function(e,t){var n=e.id||e,i=this._elements[n];return i&&(t?i.secondaryGfx:i.gfx)},Mn.prototype._validateId=function(e){if(!e)throw new Error(\"element must have an id\");if(this._elements[e])throw new Error(\"element with id \"+e+\" already added\")};var Dn={exports:{}},Bn={};Bn.extend=function(e,t,n,i){var r=n.inverse;return Object.defineProperty(e,\"remove\",{value:function(e){var n=this.indexOf(e);return-1!==n&&(this.splice(n,1),t.unset(e,r,i)),e}}),Object.defineProperty(e,\"contains\",{value:function(e){return-1!==this.indexOf(e)}}),Object.defineProperty(e,\"add\",{value:function(e,n){var o=this.indexOf(e);if(void 0===n){if(-1!==o)return;n=this.length}-1!==o&&this.splice(o,1),this.splice(n,0,e),-1===o&&t.set(e,r,i)}}),Object.defineProperty(e,\"__refs_collection\",{value:!0}),e},Bn.isExtended=function(e){return!0===e.__refs_collection};var Nn=Bn;function On(e,t,n){var i=Nn.extend(n[t.name]||[],e,t,n);Object.defineProperty(n,t.name,{enumerable:t.enumerable,value:i}),i.length&&i.forEach((function(i){e.set(i,t.inverse,n)}))}function jn(e,t){if(!(this instanceof jn))return new jn(e,t);e.inverse=t,t.inverse=e,this.props={},this.props[e.name]=e,this.props[t.name]=t}jn.prototype.bind=function(e,t){if(\"string\"==typeof t){if(!this.props[t])throw new Error(\"no property <\"+t+\"> in ref\");t=this.props[t]}t.collection?On(this,t,e):function(e,t,n){var i=t.inverse,r=n[t.name];Object.defineProperty(n,t.name,{configurable:t.configurable,enumerable:t.enumerable,get:function(){return r},set:function(t){if(t!==r){var o=r;r=null,o&&e.unset(o,i,n),r=t,e.set(r,i,n)}}})}(this,t,e)},jn.prototype.ensureRefsCollection=function(e,t){var n=e[t.name];return Nn.isExtended(n)||On(this,t,e),n},jn.prototype.ensureBound=function(e,t){(function(e,t){return Object.prototype.hasOwnProperty.call(e,t.name||t)})(e,t)||this.bind(e,t)},jn.prototype.unset=function(e,t,n){e&&(this.ensureBound(e,t),t.collection?this.ensureRefsCollection(e,t).remove(n):e[t.name]=void 0)},jn.prototype.set=function(e,t,n){e&&(this.ensureBound(e,t),t.collection?this.ensureRefsCollection(e,t).add(n):e[t.name]=n)};var Ln=jn;Dn.exports=Ln,Dn.exports.Collection=Bn;var In=Dt(Dn.exports),$n=new In({name:\"children\",enumerable:!0,collection:!0},{name:\"parent\"}),Fn=new In({name:\"labels\",enumerable:!0,collection:!0},{name:\"labelTarget\"}),zn=new In({name:\"attachers\",collection:!0},{name:\"host\"}),Hn=new In({name:\"outgoing\",collection:!0},{name:\"source\"}),Gn=new In({name:\"incoming\",collection:!0},{name:\"target\"});function Vn(){Object.defineProperty(this,\"businessObject\",{writable:!0}),Object.defineProperty(this,\"label\",{get:function(){return this.labels[0]},set:function(e){var t=this.label,n=this.labels;!e&&t?n.remove(t):n.add(e,0)}}),$n.bind(this,\"parent\"),Fn.bind(this,\"labels\"),Hn.bind(this,\"outgoing\"),Gn.bind(this,\"incoming\")}function Wn(){Vn.call(this),$n.bind(this,\"children\"),zn.bind(this,\"host\"),zn.bind(this,\"attachers\")}function Un(){Vn.call(this),$n.bind(this,\"children\")}function qn(){Wn.call(this),Fn.bind(this,\"labelTarget\")}function Kn(){Vn.call(this),Hn.bind(this,\"source\"),Gn.bind(this,\"target\")}e(Wn,Vn),e(Un,Wn),e(qn,Wn),e(Kn,Vn);var Yn={connection:Kn,shape:Wn,label:qn,root:Un};function Xn(){this._uid=12}Xn.prototype.createRoot=function(e){return this.create(\"root\",e)},Xn.prototype.createLabel=function(e){return this.create(\"label\",e)},Xn.prototype.createShape=function(e){return this.create(\"shape\",e)},Xn.prototype.createConnection=function(e){return this.create(\"connection\",e)},Xn.prototype.create=function(e,t){return(t=L({},t||{})).id||(t.id=e+\"_\"+this._uid++),function(e,t){var n=Yn[e];if(!n)throw new Error(\"unknown type: <\"+e+\">\");return L(new n,t)}(e,t)};var Zn=\"__fn\",Qn=Array.prototype.slice;function Jn(){this._listeners={},this.on(\"diagram.destroy\",1,this._destroy,this)}function ei(){}function ti(e){return e.childNodes[0]}function ni(e,t,n,i,r){var o=je();o.setTranslate(t,n);var a=je();a.setRotate(i||0,0,0);var s=je();s.setScale(r||1,r||1),We(e,[o,a,s])}function ii(e,t,n){var i=je();i.setTranslate(t,n),We(e,i)}function ri(e,t){var n=je();n.setRotate(t,0,0),We(e,n)}function oi(e,t){this._eventBus=e,this._elementRegistry=t}function ai(e,t,n){var i=n||t.firstChild;e!==i&&t.insertBefore(e,i)}Jn.prototype.on=function(e,t,n,i){if(e=p(e)?e:[e],h(t)&&(i=n,n=t,t=1e3),!u(t))throw new Error(\"priority must be a number\");var r=n;i&&((r=j(n,i))[Zn]=n[Zn]||n);var o=this;e.forEach((function(e){o._addListener(e,{priority:t,callback:r,next:null})}))},Jn.prototype.once=function(e,t,n,i){var r=this;if(h(t)&&(i=n,n=t,t=1e3),!u(t))throw new Error(\"priority must be a number\");function o(){o.__isTomb=!0;var t=n.apply(i,arguments);return r.off(e,o),t}o[Zn]=n,this.on(e,t,o)},Jn.prototype.off=function(e,t){e=p(e)?e:[e];var n=this;e.forEach((function(e){n._removeListener(e,t)}))},Jn.prototype.createEvent=function(e){var t=new ei;return t.init(e),t},Jn.prototype.fire=function(e,t){var n,i,r,o;if(o=Qn.call(arguments),\"object\"==typeof e&&(e=(t=e).type),!e)throw new Error(\"no event type specified\");if(i=this._listeners[e]){n=t instanceof ei?t:this.createEvent(t),o[0]=n;var a=n.type;e!==a&&(n.type=e);try{r=this._invokeListeners(n,o,i)}finally{e!==a&&(n.type=a)}return void 0===r&&n.defaultPrevented&&(r=!1),r}},Jn.prototype.handleError=function(e){return!1===this.fire(\"error\",{error:e})},Jn.prototype._destroy=function(){this._listeners={}},Jn.prototype._invokeListeners=function(e,t,n){for(var i;n&&!e.cancelBubble;)i=this._invokeListener(e,t,n),n=n.next;return i},Jn.prototype._invokeListener=function(e,t,n){var i;if(n.callback.__isTomb)return i;try{i=function(e,t){return e.apply(null,t)}(n.callback,t),void 0!==i&&(e.returnValue=i,e.stopPropagation()),!1===i&&e.preventDefault()}catch(e){if(!this.handleError(e))throw console.error(\"unhandled error in event listener\",e),e}return i},Jn.prototype._addListener=function(e,t){var n,i=this._getListeners(e);if(i){for(;i;){if(i.priority<t.priority)return t.next=i,void(n?n.next=t:this._setListeners(e,t));n=i,i=i.next}n.next=t}else this._setListeners(e,t)},Jn.prototype._getListeners=function(e){return this._listeners[e]},Jn.prototype._setListeners=function(e,t){this._listeners[e]=t},Jn.prototype._removeListener=function(e,t){var n,i,r,o=this._getListeners(e);if(t)for(;o;)n=o.next,(r=o.callback)!==t&&r[Zn]!==t||(i?i.next=n:this._setListeners(e,n)),i=o,o=n;else this._setListeners(e,null)},ei.prototype.stopPropagation=function(){this.cancelBubble=!0},ei.prototype.preventDefault=function(){this.defaultPrevented=!0},ei.prototype.init=function(e){L(this,e||{})},oi.$inject=[\"eventBus\",\"elementRegistry\"],oi.prototype._getChildrenContainer=function(e){var t,n=this._elementRegistry.getGraphics(e);return e.parent?(t=function(e){return e.parentNode.childNodes[1]}(n),t||(Se(t=De(\"g\")).add(\"djs-children\"),ge(n.parentNode,t))):t=n,t},oi.prototype._clear=function(e){var t=ti(e);return Q(t),t},oi.prototype._createContainer=function(e,t,n,i){var r=De(\"g\");Se(r).add(\"djs-group\"),void 0!==n?ai(r,t,t.childNodes[n]):ge(t,r);var o=De(\"g\");Se(o).add(\"djs-element\"),Se(o).add(\"djs-\"+e),i&&Se(o).add(\"djs-frame\"),ge(r,o);var a=De(\"g\");return Se(a).add(\"djs-visual\"),ge(o,a),o},oi.prototype.create=function(e,t,n){var i=this._getChildrenContainer(t.parent);return this._createContainer(e,i,n,gt(t))},oi.prototype.updateContainments=function(e){var t,n=this,i=this._elementRegistry;t=x(e,(function(e,t){return t.parent&&(e[t.parent.id]=t.parent),e}),{}),g(t,(function(e){var t=e.children;if(t){var r=n._getChildrenContainer(e);g(t.slice().reverse(),(function(e){ai(i.getGraphics(e).parentNode,r)}))}}))},oi.prototype.drawShape=function(e,t){return this._eventBus.fire(\"render.shape\",{gfx:e,element:t})},oi.prototype.getShapePath=function(e){return this._eventBus.fire(\"render.getShapePath\",e)},oi.prototype.drawConnection=function(e,t){return this._eventBus.fire(\"render.connection\",{gfx:e,element:t})},oi.prototype.getConnectionPath=function(e){return this._eventBus.fire(\"render.getConnectionPath\",e)},oi.prototype.update=function(e,t,n){if(t.parent){var i=this._clear(n);if(\"shape\"===e)this.drawShape(i,t),ii(n,t.x,t.y);else{if(\"connection\"!==e)throw new Error(\"unknown type: \"+e);this.drawConnection(i,t)}t.hidden?we(n,\"display\",\"none\"):we(n,\"display\",\"block\")}},oi.prototype.remove=function(e){Re(this._elementRegistry.getGraphics(e).parentNode)};var si={__depends__:[_t],__init__:[\"canvas\"],canvas:[\"type\",Tn],elementRegistry:[\"type\",Mn],elementFactory:[\"type\",Xn],eventBus:[\"type\",Jn],graphicsFactory:[\"type\",oi]};function ci(e){return function(e){var t=new et(e);return t.init(),t}([{config:[\"value\",e=e||{}]},si].concat(e.modules||[]))}function pi(e,t){this._injector=t=t||ci(e),this.get=t.get,this.invoke=t.invoke,this.get(\"eventBus\").fire(\"diagram.init\")}function li(){}function ui(e,t){this.model=e,this.properties=t}pi.prototype.destroy=function(){this.get(\"eventBus\").fire(\"diagram.destroy\")},pi.prototype.clear=function(){this.get(\"eventBus\").fire(\"diagram.clear\")},li.prototype.get=function(e){return this.$model.properties.get(this,e)},li.prototype.set=function(e,t){this.$model.properties.set(this,e,t)},ui.prototype.createType=function(e){var t=this.model,n=this.properties,i=Object.create(li.prototype);g(e.properties,(function(e){e.isMany||void 0===e.default||(i[e.name]=e.default)})),n.defineModel(i,t),n.defineDescriptor(i,e);var r=e.ns.name;function o(e){n.define(this,\"$type\",{value:r,enumerable:!0}),n.define(this,\"$attrs\",{value:{}}),n.define(this,\"$parent\",{writable:!0}),g(e,j((function(e,t){this.set(t,e)}),this))}return o.prototype=i,o.hasType=i.$instanceOf=this.model.hasType,n.defineModel(o,t),n.defineDescriptor(o,e),o};var hi={String:!0,Boolean:!0,Integer:!0,Real:!0,Element:!0},di={String:function(e){return e},Boolean:function(e){return\"true\"===e},Integer:function(e){return parseInt(e,10)},Real:function(e){return parseFloat(e)}};function fi(e,t){var n=di[e];return n?n(t):t}function mi(e){return!!hi[e]}function vi(e){return!!di[e]}function yi(e,t){var n,i,r=e.split(/:/);if(1===r.length)n=e,i=t;else{if(2!==r.length)throw new Error(\"expected <prefix:localName> or <localName>, got \"+e);n=r[1],i=r[0]}return{name:e=(i?i+\":\":\"\")+n,prefix:i,localName:n}}function gi(e){this.ns=e,this.name=e.name,this.allTypes=[],this.allTypesByName={},this.properties=[],this.propertiesByName={}}function bi(e,t){this.packageMap={},this.typeMap={},this.packages=[],this.properties=t,g(e,j(this.registerPackage,this))}function xi(e,t,n){var i=t[n];if(i in e)throw new Error(\"package with \"+n+\" <\"+i+\"> already defined\")}function _i(e){this.model=e}function wi(e,t,n){Object.defineProperty(e,t.name,{enumerable:!t.isReference,writable:!0,value:n,configurable:!0})}function Ei(e){this.properties=new _i(this),this.factory=new ui(this,this.properties),this.registry=new bi(e,this.properties),this.typeCache={}}gi.prototype.build=function(){return I(this,[\"ns\",\"name\",\"allTypes\",\"allTypesByName\",\"properties\",\"propertiesByName\",\"bodyProperty\",\"idProperty\"])},gi.prototype.addProperty=function(e,t,n){\"boolean\"==typeof t&&(n=t,t=void 0),this.addNamedProperty(e,!1!==n);var i=this.properties;void 0!==t?i.splice(t,0,e):i.push(e)},gi.prototype.replaceProperty=function(e,t,n){var i=e.ns,r=this.properties,o=this.propertiesByName,a=e.name!==t.name;if(e.isId){if(!t.isId)throw new Error(\"property <\"+t.ns.name+\"> must be id property to refine <\"+e.ns.name+\">\");this.setIdProperty(t,!1)}if(e.isBody){if(!t.isBody)throw new Error(\"property <\"+t.ns.name+\"> must be body property to refine <\"+e.ns.name+\">\");this.setBodyProperty(t,!1)}var s=r.indexOf(e);if(-1===s)throw new Error(\"property <\"+i.name+\"> not found in property list\");r.splice(s,1),this.addProperty(t,n?void 0:s,a),o[i.name]=o[i.localName]=t},gi.prototype.redefineProperty=function(e,t,n){var i=e.ns.prefix,r=t.split(\"#\"),o=yi(r[0],i),a=yi(r[1],o.prefix).name,s=this.propertiesByName[a];if(!s)throw new Error(\"refined property <\"+a+\"> not found\");this.replaceProperty(s,e,n),delete e.redefines},gi.prototype.addNamedProperty=function(e,t){var n=e.ns,i=this.propertiesByName;t&&(this.assertNotDefined(e,n.name),this.assertNotDefined(e,n.localName)),i[n.name]=i[n.localName]=e},gi.prototype.removeNamedProperty=function(e){var t=e.ns,n=this.propertiesByName;delete n[t.name],delete n[t.localName]},gi.prototype.setBodyProperty=function(e,t){if(t&&this.bodyProperty)throw new Error(\"body property defined multiple times (<\"+this.bodyProperty.ns.name+\">, <\"+e.ns.name+\">)\");this.bodyProperty=e},gi.prototype.setIdProperty=function(e,t){if(t&&this.idProperty)throw new Error(\"id property defined multiple times (<\"+this.idProperty.ns.name+\">, <\"+e.ns.name+\">)\");this.idProperty=e},gi.prototype.assertNotDefined=function(e,t){var n=e.name,i=this.propertiesByName[n];if(i)throw new Error(\"property <\"+n+\"> already defined; override of <\"+i.definedBy.ns.name+\"#\"+i.ns.name+\"> by <\"+e.definedBy.ns.name+\"#\"+e.ns.name+\"> not allowed without redefines\")},gi.prototype.hasProperty=function(e){return this.propertiesByName[e]},gi.prototype.addTrait=function(e,t){var n=this.allTypesByName,i=this.allTypes,r=e.name;r in n||(g(e.properties,j((function(n){n=L({},n,{name:n.ns.localName,inherited:t}),Object.defineProperty(n,\"definedBy\",{value:e});var i=n.replaces,r=n.redefines;i||r?this.redefineProperty(n,i||r,i):(n.isBody&&this.setBodyProperty(n),n.isId&&this.setIdProperty(n),this.addProperty(n))}),this)),i.push(e),n[r]=e)},bi.prototype.getPackage=function(e){return this.packageMap[e]},bi.prototype.getPackages=function(){return this.packages},bi.prototype.registerPackage=function(e){e=L({},e);var t=this.packageMap;xi(t,e,\"prefix\"),xi(t,e,\"uri\"),g(e.types,j((function(t){this.registerType(t,e)}),this)),t[e.uri]=t[e.prefix]=e,this.packages.push(e)},bi.prototype.registerType=function(e,t){var n=yi((e=L({},e,{superClass:(e.superClass||[]).slice(),extends:(e.extends||[]).slice(),properties:(e.properties||[]).slice(),meta:L(e.meta||{})})).name,t.prefix),i=n.name,r={};g(e.properties,j((function(e){var t=yi(e.name,n.prefix),i=t.name;mi(e.type)||(e.type=yi(e.type,t.prefix).name),L(e,{ns:t,name:i}),r[i]=e}),this)),L(e,{ns:n,name:i,propertiesByName:r}),g(e.extends,j((function(e){var t=this.typeMap[e];t.traits=t.traits||[],t.traits.push(i)}),this)),this.definePackage(e,t),this.typeMap[i]=e},bi.prototype.mapTypes=function(e,t,n){var i=mi(e.name)?{name:e.name}:this.typeMap[e.name],r=this;function o(e){return a(e,!0)}function a(n,i){var o=yi(n,mi(n)?\"\":e.prefix);r.mapTypes(o,t,i)}if(!i)throw new Error(\"unknown type <\"+e.name+\">\");g(i.superClass,n?o:a),t(i,!n),g(i.traits,o)},bi.prototype.getEffectiveDescriptor=function(e){var t=yi(e),n=new gi(t);this.mapTypes(t,(function(e,t){n.addTrait(e,t)}));var i=n.build();return this.definePackage(i,i.allTypes[i.allTypes.length-1].$pkg),i},bi.prototype.definePackage=function(e,t){this.properties.define(e,\"$pkg\",{value:t})},_i.prototype.set=function(e,t,n){if(!d(t)||!t.length)throw new TypeError(\"property name must be a non-empty string\");var i=this.model.getPropertyDescriptor(e,t),r=i&&i.name;void 0===n?i?delete e[r]:delete e.$attrs[t]:i?r in e?e[r]=n:wi(e,i,n):e.$attrs[t]=n},_i.prototype.get=function(e,t){var n=this.model.getPropertyDescriptor(e,t);if(!n)return e.$attrs[t];var i=n.name;return!e[i]&&n.isMany&&wi(e,n,[]),e[i]},_i.prototype.define=function(e,t,n){if(!n.writable){var i=n.value;delete(n=L({},n,{get:function(){return i}})).value}Object.defineProperty(e,t,n)},_i.prototype.defineDescriptor=function(e,t){this.define(e,\"$descriptor\",{value:t})},_i.prototype.defineModel=function(e,t){this.define(e,\"$model\",{value:t})},Ei.prototype.create=function(e,t){var n=this.getType(e);if(!n)throw new Error(\"unknown type <\"+e+\">\");return new n(t)},Ei.prototype.getType=function(e){var t=this.typeCache,n=d(e)?e:e.ns.name,i=t[n];return i||(e=this.registry.getEffectiveDescriptor(n),i=t[n]=this.factory.createType(e)),i},Ei.prototype.createAny=function(e,t,n){var i=yi(e),r={$type:e,$instanceOf:function(e){return e===this.$type}},o={name:e,isGeneric:!0,ns:{prefix:i.prefix,localName:i.localName,uri:t}};return this.properties.defineDescriptor(r,o),this.properties.defineModel(r,this),this.properties.define(r,\"$parent\",{enumerable:!1,writable:!0}),this.properties.define(r,\"$instanceOf\",{enumerable:!1,writable:!0}),g(n,(function(e,t){l(e)&&void 0!==e.value?r[e.name]=e.value:r[t]=e})),r},Ei.prototype.getPackage=function(e){return this.registry.getPackage(e)},Ei.prototype.getPackages=function(){return this.registry.getPackages()},Ei.prototype.getElementDescriptor=function(e){return e.$descriptor},Ei.prototype.hasType=function(e,t){return void 0===t&&(t=e,e=this),t in e.$model.getElementDescriptor(e).allTypesByName},Ei.prototype.getPropertyDescriptor=function(e,t){return this.getElementDescriptor(e).propertiesByName[t]},Ei.prototype.getTypeDescriptor=function(e){return this.registry.typeMap[e]};var Si=String.fromCharCode,Ci=Object.prototype.hasOwnProperty,Ri=/&#(\\d+);|&#x([0-9a-f]+);|&(\\w+);/gi,Pi={amp:\"&\",apos:\"'\",gt:\">\",lt:\"<\",quot:'\"'};function Ti(e,t,n,i){return i?Ci.call(Pi,i)?Pi[i]:\"&\"+i+\";\":Si(t||parseInt(n,16))}function ki(e){return e.length>3&&-1!==e.indexOf(\"&\")?e.replace(Ri,Ti):e}Object.keys(Pi).forEach((function(e){Pi[e.toUpperCase()]=Pi[e]}));var Ai=\"xsi:type\",Mi=\"non-whitespace outside of root node\";function Di(e){return new Error(e)}function Bi(e){return\"missing namespace for prefix <\"+e+\">\"}function Ni(e){return{get:e,enumerable:!0}}function Oi(e){var t,n={};for(t in e)n[t]=e[t];return n}function ji(e){return e+\"$uri\"}function Li(){return{line:0,column:0}}function Ii(e){throw e}function $i(e){if(!this)return new $i(e);var t,n,i,r,o,a,s,c,p,l=e&&e.proxy,u=Ii,h=Li,d=!1,f=!1,m=null,v=!1;function y(e){e instanceof Error||(e=Di(e)),m=e,u(e,h)}function g(e){o&&(e instanceof Error||(e=Di(e)),o(e,h))}this.on=function(e,p){if(\"function\"!=typeof p)throw Di(\"required args <name, cb>\");switch(e){case\"openTag\":n=p;break;case\"text\":t=p;break;case\"closeTag\":i=p;break;case\"error\":u=p;break;case\"warn\":o=p;break;case\"cdata\":r=p;break;case\"attention\":c=p;break;case\"question\":s=p;break;case\"comment\":a=p;break;default:throw Di(\"unsupported event: \"+e)}return this},this.ns=function(e){if(void 0===e&&(e={}),\"object\"!=typeof e)throw Di(\"required args <nsMap={}>\");var t,n={};for(t in e)n[t]=e[t];return n[\"http://www.w3.org/2001/XMLSchema-instance\"]=\"xsi\",f=!0,p=n,this},this.parse=function(e){if(\"string\"!=typeof e)throw Di(\"required args <xml=string>\");return m=null,function(e){var o,u,m,b,x,_,w,E,S,C,R,P=f?[]:null,T=f?function(e){var t,n,i={};for(t in e)i[n=e[t]]=n,i[ji(n)]=t;return i}(p):null,k=[],A=0,M=!1,D=!1,B=0,N=0,O=\"\",j=0;function L(){if(null!==R)return R;var e,t,n,i,r,o,a,s,c,l,u,h=f&&T.xmlns,m=f&&d?[]:null,v=j,y=O,b=y.length,x={},_={};e:for(;v<b;v++)if(c=!1,!(32===(l=y.charCodeAt(v))||l<14&&l>8)){for((l<65||l>122||l>90&&l<97)&&95!==l&&58!==l&&(g(\"illegal first char attribute name\"),c=!0),u=v+1;u<b;u++)if(!((l=y.charCodeAt(u))>96&&l<123||l>64&&l<91||l>47&&l<59||46===l||45===l||95===l)){if(32===l||l<14&&l>8){g(\"missing attribute value\"),v=u;continue e}if(61===l)break;g(\"illegal attribute name char\"),c=!0}if(\"xmlns:xmlns\"===(s=y.substring(v,u))&&(g(\"illegal declaration of xmlns\"),c=!0),34===(l=y.charCodeAt(u+1)))-1===(u=y.indexOf('\"',v=u+2))&&-1!==(u=y.indexOf(\"'\",v))&&(g(\"attribute value quote missmatch\"),c=!0);else if(39===l)-1===(u=y.indexOf(\"'\",v=u+2))&&-1!==(u=y.indexOf('\"',v))&&(g(\"attribute value quote missmatch\"),c=!0);else for(g(\"missing attribute value quotes\"),c=!0,u+=1;u<b&&!(32===(l=y.charCodeAt(u+1))||l<14&&l>8);u++);for(-1===u&&(g(\"missing closing quotes\"),u=b,c=!0),c||(o=y.substring(v,u)),v=u;u+1<b&&!(32===(l=y.charCodeAt(u+1))||l<14&&l>8);u++)v===u&&(g(\"illegal character after attribute end\"),c=!0);if(v=u+1,!c)if(s in _)g(\"attribute <\"+s+\"> already defined\");else if(_[s]=!0,f)if(d){if(null!==(r=\"xmlns\"===s?\"xmlns\":120===s.charCodeAt(0)&&\"xmlns:\"===s.substr(0,6)?s.substr(6):null)){if(e=ki(o),t=ji(r),!(a=p[e])){if(\"xmlns\"===r||t in T&&T[t]!==e)do{a=\"ns\"+A++}while(void 0!==T[a]);else a=r;p[e]=a}T[r]!==a&&(i||(T=Oi(T),i=!0),T[r]=a,\"xmlns\"===r&&(T[ji(a)]=e,h=a),T[t]=e),x[s]=o;continue}m.push(s,o)}else-1!==(l=s.indexOf(\":\"))?(n=T[s.substring(0,l)])?((s=h===n?s.substr(l+1):n+s.substr(l))===Ai&&(-1!==(l=o.indexOf(\":\"))?(n=o.substring(0,l),o=(n=T[n]||n)+o.substring(l)):o=h+\":\"+o),x[s]=o):g(Bi(s.substring(0,l))):x[s]=o;else x[s]=o}if(d)for(v=0,b=m.length;v<b;v++){if(s=m[v++],o=m[v],-1!==(l=s.indexOf(\":\"))){if(!(n=T[s.substring(0,l)])){g(Bi(s.substring(0,l)));continue}(s=h===n?s.substr(l+1):n+s.substr(l))===Ai&&(-1!==(l=o.indexOf(\":\"))?(n=o.substring(0,l),o=(n=T[n]||n)+o.substring(l)):o=h+\":\"+o)}x[s]=o}return R=x}function I(){for(var t,n,i=/(\\r\\n|\\r|\\n)/g,r=0,o=0,a=0,s=N;B>=a&&(t=i.exec(e))&&!((s=t[0].length+t.index)>B);)r+=1,a=s;return-1==B?(o=s,n=e.substring(N)):0===N?n=e.substring(N,B):(o=B-a,n=-1==N?e.substring(B):e.substring(B,N+1)),{data:n,line:r,column:o}}h=I,l&&(C=Object.create({},{name:Ni((function(){return E})),originalName:Ni((function(){return S})),attrs:Ni(L),ns:Ni((function(){return T}))}));for(;-1!==N;){if(-1===(B=60===e.charCodeAt(N)?N:e.indexOf(\"<\",N)))return k.length?y(\"unexpected end of file\"):0===N?y(\"missing start tag\"):void(N<e.length&&e.substring(N).trim()&&g(Mi));if(N!==B)if(k.length){if(t&&(t(e.substring(N,B),ki,h),v))return}else if(e.substring(N,B).trim()&&(g(Mi),v))return;if(33===(x=e.charCodeAt(B+1))){if(91===(b=e.charCodeAt(B+2))&&\"CDATA[\"===e.substr(B+3,6)){if(-1===(N=e.indexOf(\"]]>\",B)))return y(\"unclosed cdata\");if(r&&(r(e.substring(B+9,N),h),v))return;N+=3;continue}if(45===b&&45===e.charCodeAt(B+3)){if(-1===(N=e.indexOf(\"--\\x3e\",B)))return y(\"unclosed comment\");if(a&&(a(e.substring(B+4,N),ki,h),v))return;N+=3;continue}}if(63!==x){for(u=B+1;;u++){if(_=e.charCodeAt(u),isNaN(_))return N=-1,y(\"unclosed tag\");if(34===_)u=-1!==(b=e.indexOf('\"',u+1))?b:u;else if(39===_)u=-1!==(b=e.indexOf(\"'\",u+1))?b:u;else if(62===_){N=u;break}}if(33!==x){if(R={},47===x){if(M=!1,D=!0,!k.length)return y(\"missing open tag\");if(u=E=k.pop(),b=B+2+u.length,e.substring(B+2,b)!==u)return y(\"closing tag mismatch\");for(;b<N;b++)if(!(32===(x=e.charCodeAt(b))||x>8&&x<14))return y(\"close tag\")}else{if(47===e.charCodeAt(N-1)?(u=E=e.substring(B+1,N-1),M=!0,D=!0):(u=E=e.substring(B+1,N),M=!0,D=!1),!(x>96&&x<123||x>64&&x<91||95===x||58===x))return y(\"illegal first char nodeName\");for(b=1,m=u.length;b<m;b++)if(!((x=u.charCodeAt(b))>96&&x<123||x>64&&x<91||x>47&&x<59||45===x||95===x||46==x)){if(32===x||x<14&&x>8){E=u.substring(0,b),R=null;break}return y(\"invalid nodeName\")}D||k.push(E)}if(f){if(o=T,M&&(D||P.push(o),null===R&&(d=-1!==u.indexOf(\"xmlns\",b))&&(j=b,O=u,L(),d=!1)),S=E,-1!==(x=E.indexOf(\":\"))){if(!(w=T[E.substring(0,x)]))return y(\"missing namespace on <\"+S+\">\");E=E.substr(x+1)}else w=T.xmlns;w&&(E=w+\":\"+E)}if(M&&(j=b,O=u,n&&(l?n(C,ki,D,h):n(E,L,ki,D,h),v)))return;if(D){if(i&&(i(l?C:E,ki,M,h),v))return;f&&(T=M?o:P.pop())}N+=1}else{if(c&&(c(e.substring(B,N+1),ki,h),v))return;N+=1}}else{if(-1===(N=e.indexOf(\"?>\",B)))return y(\"unclosed question\");if(s&&(s(e.substring(B,N+2),h),v))return;N+=2}}}(e),h=Li,v=!1,m},this.stop=function(){v=!0}}function Fi(e){return e.xml&&\"lowerCase\"===e.xml.tagAlias}var zi={xsi:\"http://www.w3.org/2001/XMLSchema-instance\",xml:\"http://www.w3.org/XML/1998/namespace\"},Hi=\"xsi:type\";function Gi(e){return e.xml&&e.xml.serialize}function Vi(e){return Gi(e)===Hi}function Wi(e,t){return Fi(t)?e.prefix+\":\"+((n=e.localName).charAt(0).toUpperCase()+n.slice(1)):e.name;var n}function Ui(e){return new Error(e)}function qi(e){return e.$descriptor}function Ki(e){L(this,e),this.elementsById={},this.references=[],this.warnings=[],this.addReference=function(e){this.references.push(e)},this.addElement=function(e){if(!e)throw Ui(\"expected element\");var t,n=this.elementsById,i=qi(e).idProperty;if(i&&(t=e.get(i.name))){if(n[t])throw Ui(\"duplicate ID <\"+t+\">\");n[t]=e}},this.addWarning=function(e){this.warnings.push(e)}}function Yi(){}function Xi(){}function Zi(){}function Qi(e,t){this.property=e,this.context=t}function Ji(e,t){this.element=t,this.propertyDesc=e}function er(){}function tr(e,t,n){this.model=e,this.type=e.getType(t),this.context=n}function nr(e,t,n){tr.call(this,e,t,n)}function ir(e,t,n){this.model=e,this.context=n}function rr(e){e instanceof Ei&&(e={model:e}),L(this,{lax:!1},e)}Yi.prototype.handleEnd=function(){},Yi.prototype.handleText=function(){},Yi.prototype.handleNode=function(){},Xi.prototype=Object.create(Yi.prototype),Xi.prototype.handleNode=function(){return this},Zi.prototype=Object.create(Yi.prototype),Zi.prototype.handleText=function(e){this.body=(this.body||\"\")+e},Qi.prototype=Object.create(Zi.prototype),Qi.prototype.handleNode=function(e){if(this.element)throw Ui(\"expected no sub nodes\");return this.element=this.createReference(e),this},Qi.prototype.handleEnd=function(){this.element.id=this.body},Qi.prototype.createReference=function(e){return{property:this.property.ns.name,id:\"\"}},Ji.prototype=Object.create(Zi.prototype),Ji.prototype.handleEnd=function(){var e=this.body||\"\",t=this.element,n=this.propertyDesc;e=fi(n.type,e),n.isMany?t.get(n.name).push(e):t.set(n.name,e)},er.prototype=Object.create(Zi.prototype),er.prototype.handleNode=function(e){var t=this,n=this.element;return n?t=this.handleChild(e):(n=this.element=this.createElement(e),this.context.addElement(n)),t},tr.prototype=Object.create(er.prototype),tr.prototype.addReference=function(e){this.context.addReference(e)},tr.prototype.handleText=function(e){if(!qi(this.element).bodyProperty)throw Ui(\"unexpected body text <\"+e+\">\");Zi.prototype.handleText.call(this,e)},tr.prototype.handleEnd=function(){var e=this.body,t=this.element,n=qi(t).bodyProperty;n&&void 0!==e&&(e=fi(n.type,e),t.set(n.name,e))},tr.prototype.createElement=function(e){var t,n=e.attributes,i=this.type,r=qi(i),o=this.context,a=new i({}),s=this.model;return g(n,(function(e,n){var i=r.propertiesByName[n];i&&i.isReference?i.isMany?g(e.split(\" \"),(function(e){o.addReference({element:a,property:i.ns.name,id:e})})):o.addReference({element:a,property:i.ns.name,id:e}):(i?e=fi(i.type,e):\"xmlns\"!==n&&(t=yi(n,r.ns.prefix),s.getPackage(t.prefix)&&o.addWarning({message:\"unknown attribute <\"+n+\">\",element:a,property:n,value:e})),a.set(n,e))})),a},tr.prototype.getPropertyForNode=function(e){var t,n,i=yi(e.name),r=this.type,o=this.model,a=qi(r),s=i.name,c=a.propertiesByName[s];if(c&&!c.isAttr)return Vi(c)&&(t=e.attributes[Hi])?(t=function(e,t){var n=yi(e);return function(e,t){var n=e.name,i=e.localName,r=t.xml&&t.xml.typePrefix;return r&&0===i.indexOf(r)?e.prefix+\":\"+i.slice(r.length):n}(n,t.getPackage(n.prefix))}(t,o),L({},c,{effectiveType:qi(n=o.getType(t)).name})):c;var p=o.getPackage(i.prefix);if(p){if(t=Wi(i,p),n=o.getType(t),c=m(a.properties,(function(e){return!e.isVirtual&&!e.isReference&&!e.isAttribute&&n.hasType(e.type)})),c)return L({},c,{effectiveType:qi(n).name})}else if(c=m(a.properties,(function(e){return!e.isReference&&!e.isAttribute&&\"Element\"===e.type})),c)return c;throw Ui(\"unrecognized element <\"+i.name+\">\")},tr.prototype.toString=function(){return\"ElementDescriptor[\"+qi(this.type).name+\"]\"},tr.prototype.valueHandler=function(e,t){return new Ji(e,t)},tr.prototype.referenceHandler=function(e){return new Qi(e,this.context)},tr.prototype.handler=function(e){return\"Element\"===e?new ir(this.model,e,this.context):new tr(this.model,e,this.context)},tr.prototype.handleChild=function(e){var t,n,i,r;if(t=this.getPropertyForNode(e),i=this.element,vi(n=t.effectiveType||t.type))return this.valueHandler(t,i);var o=(r=t.isReference?this.referenceHandler(t).handleNode(e):this.handler(n).handleNode(e)).element;return void 0!==o&&(t.isMany?i.get(t.name).push(o):i.set(t.name,o),t.isReference?(L(o,{element:i}),this.context.addReference(o)):o.$parent=i),r},nr.prototype=Object.create(tr.prototype),nr.prototype.createElement=function(e){var t=e.name,n=yi(t),i=this.model,r=this.type,o=i.getPackage(n.prefix),a=o&&Wi(n,o)||t;if(!r.hasType(a))throw Ui(\"unexpected element <\"+e.originalName+\">\");return tr.prototype.createElement.call(this,e)},ir.prototype=Object.create(er.prototype),ir.prototype.createElement=function(e){var t=e.name,n=yi(t).prefix,i=e.ns[n+\"$uri\"],r=e.attributes;return this.model.createAny(t,i,r)},ir.prototype.handleChild=function(e){var t=new ir(this.model,\"Element\",this.context).handleNode(e),n=this.element,i=t.element;return void 0!==i&&((n.$children=n.$children||[]).push(i),i.$parent=n),t},ir.prototype.handleEnd=function(){this.body&&(this.element.$body=this.body)},rr.prototype.fromXML=function(e,t,n){var i=t.rootHandler;t instanceof tr?(i=t,t={}):\"string\"==typeof t?(i=this.handler(t),t={}):\"string\"==typeof i&&(i=this.handler(i));var r=this.model,o=this.lax,a=new Ki(L({},t,{rootHandler:i})),s=new $i({proxy:!0}),c=function(){var e=[];return Object.defineProperty(e,\"peek\",{value:function(){return this[this.length-1]}}),e}();function p(e,t,n){var i=t(),r=i.line,o=i.column,s=i.data;\"<\"===s.charAt(0)&&-1!==s.indexOf(\" \")&&(s=s.slice(0,s.indexOf(\" \"))+\">\");var c=\"unparsable content \"+(s?s+\" \":\"\")+\"detected\\n\\tline: \"+r+\"\\n\\tcolumn: \"+o+\"\\n\\tnested error: \"+e.message;if(n)return a.addWarning({message:c,error:e}),!0;throw Ui(c)}function l(e,t){return p(e,t,!0)}i.context=a,c.push(i);var u=/^<\\?xml /i,h=/ encoding=\"([^\"]+)\"/i,d=/^utf-8$/i;function f(e,t){try{c.peek().handleText(e)}catch(e){l(e,t)}}var m=r.getPackages().reduce((function(e,t){return e[t.uri]=t.prefix,e}),{\"http://www.w3.org/XML/1998/namespace\":\"xml\"});return s.ns(m).on(\"openTag\",(function(e,t,n,i){var r=e.attrs||{},a=Object.keys(r).reduce((function(e,n){var i=t(r[n]);return e[n]=i,e}),{});!function(e,t){var n=c.peek();try{c.push(n.handleNode(e))}catch(e){p(e,t,o)&&c.push(new Xi)}}({name:e.name,originalName:e.originalName,attributes:a,ns:e.ns},i)})).on(\"question\",(function(e){if(u.test(e)){var t=h.exec(e),n=t&&t[1];n&&!d.test(n)&&a.addWarning({message:\"unsupported document encoding <\"+n+\">, falling back to UTF-8\"})}})).on(\"closeTag\",(function(){c.pop().handleEnd()})).on(\"cdata\",f).on(\"text\",(function(e,t,n){!function(e,t){e.trim()&&f(e,t)}(t(e),n)})).on(\"error\",p).on(\"warn\",l),new Promise((function(t,n){var r;try{s.parse(e),function(){var e,t,n=a.elementsById,i=a.references;for(e=0;t=i[e];e++){var r=t.element,o=n[t.id],s=qi(r).propertiesByName[t.property];if(o||a.addWarning({message:\"unresolved reference <\"+t.id+\">\",element:t.element,property:t.property,value:t.id}),s.isMany){var c=r.get(s.name),p=c.indexOf(t);-1===p&&(p=c.length),o?c[p]=o:c.splice(p,1)}else r.set(s.name,o)}}()}catch(e){r=e}var o=i.element;r||o||(r=Ui(\"failed to parse document as <\"+i.type.$descriptor.name+\">\"));var c=a.warnings,p=a.references,l=a.elementsById;return r?(r.warnings=c,n(r)):t({rootElement:o,elementsById:l,references:p,warnings:c})}))},rr.prototype.handler=function(e){return new nr(this.model,e)};var or=/<|>|'|\"|&|\\n\\r|\\n/g,ar=/<|>|&/g;function sr(e){var t={},n={},i={},r=[],o=[];this.byUri=function(t){return n[t]||e&&e.byUri(t)},this.add=function(e,t){n[e.uri]=e,t?r.push(e):o.push(e),this.mapPrefix(e.prefix,e.uri)},this.uriByPrefix=function(e){return t[e||\"xmlns\"]},this.mapPrefix=function(e,n){t[e||\"xmlns\"]=n},this.getNSKey=function(e){return void 0!==e.prefix?e.uri+\"|\"+e.prefix:e.uri},this.logUsed=function(t){var n=t.uri,r=this.getNSKey(t);i[r]=this.byUri(n),e&&e.logUsed(t)},this.getUsed=function(e){var t=this;return[].concat(r,o).filter((function(e){var n=t.getNSKey(e);return i[n]}))}}function cr(e,t){return Fi(t)?(n=e).charAt(0).toLowerCase()+n.slice(1):e;var n}function pr(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}function lr(e){return d(e)?e:(e.prefix?e.prefix+\":\":\"\")+e.localName}var ur={\"\\n\":\"#10\",\"\\n\\r\":\"#10\",'\"':\"#34\",\"'\":\"#39\",\"<\":\"#60\",\">\":\"#62\",\"&\":\"#38\"},hr={\"<\":\"lt\",\">\":\"gt\",\"&\":\"amp\"};function dr(e,t,n){return(e=d(e)?e:\"\"+e).replace(t,(function(e){return\"&\"+n[e]+\";\"}))}function fr(e){this.tagName=e}function mr(){}function vr(e){this.tagName=e}function yr(e,t){this.body=[],this.attrs=[],this.parent=e,this.propertyDescriptor=t}function gr(e,t){yr.call(this,e,t)}function br(){this.value=\"\",this.write=function(e){this.value+=e}}function xr(e,t){var n=[\"\"];this.append=function(t){return e.write(t),this},this.appendNewLine=function(){return t&&e.write(\"\\n\"),this},this.appendIndent=function(){return t&&e.write(n.join(\"  \")),this},this.indent=function(){return n.push(\"\"),this},this.unindent=function(){return n.pop(),this}}function _r(e){return e=L({format:!1,preamble:!0},e||{}),{toXML:function(t,n){var i=n||new br,r=new xr(i,e.format);if(e.preamble&&r.append('<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n'),(new yr).build(t).serializeTo(r),!n)return i.value}}}function wr(e,t){Ei.call(this,e,t)}fr.prototype.build=function(e){return this.element=e,this},fr.prototype.serializeTo=function(e){e.appendIndent().append(\"<\"+this.tagName+\">\"+this.element.id+\"</\"+this.tagName+\">\").appendNewLine()},mr.prototype.serializeValue=mr.prototype.serializeTo=function(e){e.append(this.escape?dr(this.value,ar,hr):this.value)},mr.prototype.build=function(e,t){return this.value=t,\"String\"===e.type&&-1!==t.search(ar)&&(this.escape=!0),this},pr(vr,mr),vr.prototype.serializeTo=function(e){e.appendIndent().append(\"<\"+this.tagName+\">\"),this.serializeValue(e),e.append(\"</\"+this.tagName+\">\").appendNewLine()},yr.prototype.build=function(e){this.element=e;var t,n,i=e.$descriptor,r=this.propertyDescriptor,o=i.isGeneric;return t=o?this.parseGeneric(e):this.parseNsAttributes(e),this.ns=r?this.nsPropertyTagName(r):this.nsTagName(i),this.tagName=this.addTagName(this.ns),o||(n=function(e){return y(e.$descriptor.properties,(function(t){var n=t.name;if(t.isVirtual)return!1;if(!f(e,n))return!1;var i=e[n];return i!==t.default&&null!==i&&(!t.isMany||i.length)}))}(e),this.parseAttributes(y(n,(function(e){return e.isAttr}))),this.parseContainments(function(e){return y(e,(function(e){return!e.isAttr}))}(n))),this.parseGenericAttributes(e,t),this},yr.prototype.nsTagName=function(e){return function(e,t){return t.isGeneric?L({localName:t.ns.localName},e):L({localName:cr(t.ns.localName,t.$pkg)},e)}(this.logNamespaceUsed(e.ns),e)},yr.prototype.nsPropertyTagName=function(e){return function(e,t){return L({localName:t.ns.localName},e)}(this.logNamespaceUsed(e.ns),e)},yr.prototype.isLocalNs=function(e){return e.uri===this.ns.uri},yr.prototype.nsAttributeName=function(e){var t;if(t=d(e)?yi(e):e.ns,e.inherited)return{localName:t.localName};var n=this.logNamespaceUsed(t);return this.getNamespaces().logUsed(n),this.isLocalNs(n)?{localName:t.localName}:L({localName:t.localName},n)},yr.prototype.parseGeneric=function(e){var t=this,n=this.body,i=[];return g(e,(function(r,o){\"$body\"===o?n.push((new mr).build({type:\"String\"},r)):\"$children\"===o?g(r,(function(e){n.push(new yr(t).build(e))})):0!==o.indexOf(\"$\")&&t.parseNsAttribute(e,o,r)&&i.push({name:o,value:r})})),i},yr.prototype.parseNsAttribute=function(e,t,n){var i,r=e.$model,o=yi(t);if(\"xmlns\"===o.prefix&&(i={prefix:o.localName,uri:n}),o.prefix||\"xmlns\"!==o.localName||(i={uri:n}),!i)return{name:t,value:n};if(r&&r.getPackage(n))this.logNamespace(i,!0,!0);else{var a=this.logNamespaceUsed(i,!0);this.getNamespaces().logUsed(a)}},yr.prototype.parseNsAttributes=function(e,t){var n=this,i=e.$attrs,r=[];return g(i,(function(t,i){var o=n.parseNsAttribute(e,i,t);o&&r.push(o)})),r},yr.prototype.parseGenericAttributes=function(e,t){var n=this;g(t,(function(t){if(t.name!==Hi)try{n.addAttribute(n.nsAttributeName(t.name),t.value)}catch(n){console.warn(\"missing namespace information for \",t.name,\"=\",t.value,\"on\",e,n)}}))},yr.prototype.parseContainments=function(e){var t=this,n=this.body,i=this.element;g(e,(function(e){var r=i.get(e.name),o=e.isReference;if(e.isMany||(r=[r]),e.isBody)n.push((new mr).build(e,r[0]));else if(vi(e.type))g(r,(function(i){n.push(new vr(t.addTagName(t.nsPropertyTagName(e))).build(e,i))}));else if(o)g(r,(function(i){n.push(new fr(t.addTagName(t.nsPropertyTagName(e))).build(i))}));else{var a=Vi(e),s=function(e){return\"property\"===Gi(e)}(e);g(r,(function(i){var r;r=a?new gr(t,e):s?new yr(t,e):new yr(t),n.push(r.build(i))}))}}))},yr.prototype.getNamespaces=function(e){var t,n=this.namespaces,i=this.parent;return n||(t=i&&i.getNamespaces(),e||!t?this.namespaces=n=new sr(t):n=t),n},yr.prototype.logNamespace=function(e,t,n){var i=this.getNamespaces(n),r=e.uri,o=e.prefix;return i.byUri(r)&&!n||i.add(e,t),i.mapPrefix(o,r),e},yr.prototype.logNamespaceUsed=function(e,t){var n,i,r,o=this.element.$model,a=this.getNamespaces(t),s=e.prefix,c=e.uri;if(!s&&!c)return{localName:e.localName};if(r=zi[s]||o&&(o.getPackage(s)||{}).uri,!(c=c||r||a.uriByPrefix(s)))throw new Error(\"no namespace uri given for prefix <\"+s+\">\");if(!(e=a.byUri(c))){for(n=s,i=1;a.uriByPrefix(n);)n=s+\"_\"+i++;e=this.logNamespace({prefix:n,uri:c},r===c)}return s&&a.mapPrefix(s,c),e},yr.prototype.parseAttributes=function(e){var t=this,n=this.element;g(e,(function(e){var i=n.get(e.name);if(e.isReference)if(e.isMany){var r=[];g(i,(function(e){r.push(e.id)})),i=r.join(\" \")}else i=i.id;t.addAttribute(t.nsAttributeName(e),i)}))},yr.prototype.addTagName=function(e){var t=this.logNamespaceUsed(e);return this.getNamespaces().logUsed(t),lr(e)},yr.prototype.addAttribute=function(e,t){var n=this.attrs;d(t)&&(t=dr(t,or,ur));var i=v(n,(function(t){return t.name.localName===e.localName&&t.name.uri===e.uri&&t.name.prefix===e.prefix})),r={name:e,value:t};-1!==i?n.splice(i,1,r):n.push(r)},yr.prototype.serializeAttributes=function(e){var t=this.attrs,n=this.namespaces;n&&(t=function(e){return e.getUsed().filter((function(e){return\"xml\"!==e.prefix})).map((function(e){return{name:\"xmlns\"+(e.prefix?\":\"+e.prefix:\"\"),value:e.uri}}))}(n).concat(t)),g(t,(function(t){e.append(\" \").append(lr(t.name)).append('=\"').append(t.value).append('\"')}))},yr.prototype.serializeTo=function(e){var t=this.body[0],n=t&&t.constructor!==mr;e.appendIndent().append(\"<\"+this.tagName),this.serializeAttributes(e),e.append(t?\">\":\" />\"),t&&(n&&e.appendNewLine().indent(),g(this.body,(function(t){t.serializeTo(e)})),n&&e.unindent().appendIndent(),e.append(\"</\"+this.tagName+\">\")),e.appendNewLine()},pr(gr,yr),gr.prototype.parseNsAttributes=function(e){var t=yr.prototype.parseNsAttributes.call(this,e),n=e.$descriptor;if(n.name===this.propertyDescriptor.type)return t;var i=this.typeNs=this.nsTagName(n);this.getNamespaces().logUsed(this.typeNs);var r=e.$model.getPackage(i.uri),o=r.xml&&r.xml.typePrefix||\"\";return this.addAttribute(this.nsAttributeName(Hi),(i.prefix?i.prefix+\":\":\"\")+o+n.ns.localName),t},gr.prototype.isLocalNs=function(e){return e.uri===(this.typeNs||this.ns).uri},wr.prototype=Object.create(Ei.prototype),wr.prototype.fromXML=function(e,t,n){d(t)||(n=t,t=\"bpmn:Definitions\");var i=new rr(L({model:this,lax:!0},n)),r=i.handler(t);return i.fromXML(e,r)},wr.prototype.toXML=function(e,t){var n=new _r(t);return new Promise((function(t,i){try{return t({xml:n.toXML(e)})}catch(e){return i(e)}}))};var Er={bpmn:{name:\"BPMN20\",uri:\"http://www.omg.org/spec/BPMN/20100524/MODEL\",prefix:\"bpmn\",associations:[],types:[{name:\"Interface\",superClass:[\"RootElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"operations\",type:\"Operation\",isMany:!0},{name:\"implementationRef\",isAttr:!0,type:\"String\"}]},{name:\"Operation\",superClass:[\"BaseElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"inMessageRef\",type:\"Message\",isReference:!0},{name:\"outMessageRef\",type:\"Message\",isReference:!0},{name:\"errorRef\",type:\"Error\",isMany:!0,isReference:!0},{name:\"implementationRef\",isAttr:!0,type:\"String\"}]},{name:\"EndPoint\",superClass:[\"RootElement\"]},{name:\"Auditing\",superClass:[\"BaseElement\"]},{name:\"GlobalTask\",superClass:[\"CallableElement\"],properties:[{name:\"resources\",type:\"ResourceRole\",isMany:!0}]},{name:\"Monitoring\",superClass:[\"BaseElement\"]},{name:\"Performer\",superClass:[\"ResourceRole\"]},{name:\"Process\",superClass:[\"FlowElementsContainer\",\"CallableElement\"],properties:[{name:\"processType\",type:\"ProcessType\",isAttr:!0},{name:\"isClosed\",isAttr:!0,type:\"Boolean\"},{name:\"auditing\",type:\"Auditing\"},{name:\"monitoring\",type:\"Monitoring\"},{name:\"properties\",type:\"Property\",isMany:!0},{name:\"laneSets\",isMany:!0,replaces:\"FlowElementsContainer#laneSets\",type:\"LaneSet\"},{name:\"flowElements\",isMany:!0,replaces:\"FlowElementsContainer#flowElements\",type:\"FlowElement\"},{name:\"artifacts\",type:\"Artifact\",isMany:!0},{name:\"resources\",type:\"ResourceRole\",isMany:!0},{name:\"correlationSubscriptions\",type:\"CorrelationSubscription\",isMany:!0},{name:\"supports\",type:\"Process\",isMany:!0,isReference:!0},{name:\"definitionalCollaborationRef\",type:\"Collaboration\",isAttr:!0,isReference:!0},{name:\"isExecutable\",isAttr:!0,type:\"Boolean\"}]},{name:\"LaneSet\",superClass:[\"BaseElement\"],properties:[{name:\"lanes\",type:\"Lane\",isMany:!0},{name:\"name\",isAttr:!0,type:\"String\"}]},{name:\"Lane\",superClass:[\"BaseElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"partitionElementRef\",type:\"BaseElement\",isAttr:!0,isReference:!0},{name:\"partitionElement\",type:\"BaseElement\"},{name:\"flowNodeRef\",type:\"FlowNode\",isMany:!0,isReference:!0},{name:\"childLaneSet\",type:\"LaneSet\",xml:{serialize:\"xsi:type\"}}]},{name:\"GlobalManualTask\",superClass:[\"GlobalTask\"]},{name:\"ManualTask\",superClass:[\"Task\"]},{name:\"UserTask\",superClass:[\"Task\"],properties:[{name:\"renderings\",type:\"Rendering\",isMany:!0},{name:\"implementation\",isAttr:!0,type:\"String\"}]},{name:\"Rendering\",superClass:[\"BaseElement\"]},{name:\"HumanPerformer\",superClass:[\"Performer\"]},{name:\"PotentialOwner\",superClass:[\"HumanPerformer\"]},{name:\"GlobalUserTask\",superClass:[\"GlobalTask\"],properties:[{name:\"implementation\",isAttr:!0,type:\"String\"},{name:\"renderings\",type:\"Rendering\",isMany:!0}]},{name:\"Gateway\",isAbstract:!0,superClass:[\"FlowNode\"],properties:[{name:\"gatewayDirection\",type:\"GatewayDirection\",default:\"Unspecified\",isAttr:!0}]},{name:\"EventBasedGateway\",superClass:[\"Gateway\"],properties:[{name:\"instantiate\",default:!1,isAttr:!0,type:\"Boolean\"},{name:\"eventGatewayType\",type:\"EventBasedGatewayType\",isAttr:!0,default:\"Exclusive\"}]},{name:\"ComplexGateway\",superClass:[\"Gateway\"],properties:[{name:\"activationCondition\",type:\"Expression\",xml:{serialize:\"xsi:type\"}},{name:\"default\",type:\"SequenceFlow\",isAttr:!0,isReference:!0}]},{name:\"ExclusiveGateway\",superClass:[\"Gateway\"],properties:[{name:\"default\",type:\"SequenceFlow\",isAttr:!0,isReference:!0}]},{name:\"InclusiveGateway\",superClass:[\"Gateway\"],properties:[{name:\"default\",type:\"SequenceFlow\",isAttr:!0,isReference:!0}]},{name:\"ParallelGateway\",superClass:[\"Gateway\"]},{name:\"RootElement\",isAbstract:!0,superClass:[\"BaseElement\"]},{name:\"Relationship\",superClass:[\"BaseElement\"],properties:[{name:\"type\",isAttr:!0,type:\"String\"},{name:\"direction\",type:\"RelationshipDirection\",isAttr:!0},{name:\"source\",isMany:!0,isReference:!0,type:\"Element\"},{name:\"target\",isMany:!0,isReference:!0,type:\"Element\"}]},{name:\"BaseElement\",isAbstract:!0,properties:[{name:\"id\",isAttr:!0,type:\"String\",isId:!0},{name:\"documentation\",type:\"Documentation\",isMany:!0},{name:\"extensionDefinitions\",type:\"ExtensionDefinition\",isMany:!0,isReference:!0},{name:\"extensionElements\",type:\"ExtensionElements\"}]},{name:\"Extension\",properties:[{name:\"mustUnderstand\",default:!1,isAttr:!0,type:\"Boolean\"},{name:\"definition\",type:\"ExtensionDefinition\",isAttr:!0,isReference:!0}]},{name:\"ExtensionDefinition\",properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"extensionAttributeDefinitions\",type:\"ExtensionAttributeDefinition\",isMany:!0}]},{name:\"ExtensionAttributeDefinition\",properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"type\",isAttr:!0,type:\"String\"},{name:\"isReference\",default:!1,isAttr:!0,type:\"Boolean\"},{name:\"extensionDefinition\",type:\"ExtensionDefinition\",isAttr:!0,isReference:!0}]},{name:\"ExtensionElements\",properties:[{name:\"valueRef\",isAttr:!0,isReference:!0,type:\"Element\"},{name:\"values\",type:\"Element\",isMany:!0},{name:\"extensionAttributeDefinition\",type:\"ExtensionAttributeDefinition\",isAttr:!0,isReference:!0}]},{name:\"Documentation\",superClass:[\"BaseElement\"],properties:[{name:\"text\",type:\"String\",isBody:!0},{name:\"textFormat\",default:\"text/plain\",isAttr:!0,type:\"String\"}]},{name:\"Event\",isAbstract:!0,superClass:[\"FlowNode\",\"InteractionNode\"],properties:[{name:\"properties\",type:\"Property\",isMany:!0}]},{name:\"IntermediateCatchEvent\",superClass:[\"CatchEvent\"]},{name:\"IntermediateThrowEvent\",superClass:[\"ThrowEvent\"]},{name:\"EndEvent\",superClass:[\"ThrowEvent\"]},{name:\"StartEvent\",superClass:[\"CatchEvent\"],properties:[{name:\"isInterrupting\",default:!0,isAttr:!0,type:\"Boolean\"}]},{name:\"ThrowEvent\",isAbstract:!0,superClass:[\"Event\"],properties:[{name:\"dataInputs\",type:\"DataInput\",isMany:!0},{name:\"dataInputAssociations\",type:\"DataInputAssociation\",isMany:!0},{name:\"inputSet\",type:\"InputSet\"},{name:\"eventDefinitions\",type:\"EventDefinition\",isMany:!0},{name:\"eventDefinitionRef\",type:\"EventDefinition\",isMany:!0,isReference:!0}]},{name:\"CatchEvent\",isAbstract:!0,superClass:[\"Event\"],properties:[{name:\"parallelMultiple\",isAttr:!0,type:\"Boolean\",default:!1},{name:\"dataOutputs\",type:\"DataOutput\",isMany:!0},{name:\"dataOutputAssociations\",type:\"DataOutputAssociation\",isMany:!0},{name:\"outputSet\",type:\"OutputSet\"},{name:\"eventDefinitions\",type:\"EventDefinition\",isMany:!0},{name:\"eventDefinitionRef\",type:\"EventDefinition\",isMany:!0,isReference:!0}]},{name:\"BoundaryEvent\",superClass:[\"CatchEvent\"],properties:[{name:\"cancelActivity\",default:!0,isAttr:!0,type:\"Boolean\"},{name:\"attachedToRef\",type:\"Activity\",isAttr:!0,isReference:!0}]},{name:\"EventDefinition\",isAbstract:!0,superClass:[\"RootElement\"]},{name:\"CancelEventDefinition\",superClass:[\"EventDefinition\"]},{name:\"ErrorEventDefinition\",superClass:[\"EventDefinition\"],properties:[{name:\"errorRef\",type:\"Error\",isAttr:!0,isReference:!0}]},{name:\"TerminateEventDefinition\",superClass:[\"EventDefinition\"]},{name:\"EscalationEventDefinition\",superClass:[\"EventDefinition\"],properties:[{name:\"escalationRef\",type:\"Escalation\",isAttr:!0,isReference:!0}]},{name:\"Escalation\",properties:[{name:\"structureRef\",type:\"ItemDefinition\",isAttr:!0,isReference:!0},{name:\"name\",isAttr:!0,type:\"String\"},{name:\"escalationCode\",isAttr:!0,type:\"String\"}],superClass:[\"RootElement\"]},{name:\"CompensateEventDefinition\",superClass:[\"EventDefinition\"],properties:[{name:\"waitForCompletion\",isAttr:!0,type:\"Boolean\",default:!0},{name:\"activityRef\",type:\"Activity\",isAttr:!0,isReference:!0}]},{name:\"TimerEventDefinition\",superClass:[\"EventDefinition\"],properties:[{name:\"timeDate\",type:\"Expression\",xml:{serialize:\"xsi:type\"}},{name:\"timeCycle\",type:\"Expression\",xml:{serialize:\"xsi:type\"}},{name:\"timeDuration\",type:\"Expression\",xml:{serialize:\"xsi:type\"}}]},{name:\"LinkEventDefinition\",superClass:[\"EventDefinition\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"target\",type:\"LinkEventDefinition\",isAttr:!0,isReference:!0},{name:\"source\",type:\"LinkEventDefinition\",isMany:!0,isReference:!0}]},{name:\"MessageEventDefinition\",superClass:[\"EventDefinition\"],properties:[{name:\"messageRef\",type:\"Message\",isAttr:!0,isReference:!0},{name:\"operationRef\",type:\"Operation\",isAttr:!0,isReference:!0}]},{name:\"ConditionalEventDefinition\",superClass:[\"EventDefinition\"],properties:[{name:\"condition\",type:\"Expression\",xml:{serialize:\"xsi:type\"}}]},{name:\"SignalEventDefinition\",superClass:[\"EventDefinition\"],properties:[{name:\"signalRef\",type:\"Signal\",isAttr:!0,isReference:!0}]},{name:\"Signal\",superClass:[\"RootElement\"],properties:[{name:\"structureRef\",type:\"ItemDefinition\",isAttr:!0,isReference:!0},{name:\"name\",isAttr:!0,type:\"String\"}]},{name:\"ImplicitThrowEvent\",superClass:[\"ThrowEvent\"]},{name:\"DataState\",superClass:[\"BaseElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"}]},{name:\"ItemAwareElement\",superClass:[\"BaseElement\"],properties:[{name:\"itemSubjectRef\",type:\"ItemDefinition\",isAttr:!0,isReference:!0},{name:\"dataState\",type:\"DataState\"}]},{name:\"DataAssociation\",superClass:[\"BaseElement\"],properties:[{name:\"sourceRef\",type:\"ItemAwareElement\",isMany:!0,isReference:!0},{name:\"targetRef\",type:\"ItemAwareElement\",isReference:!0},{name:\"transformation\",type:\"FormalExpression\",xml:{serialize:\"property\"}},{name:\"assignment\",type:\"Assignment\",isMany:!0}]},{name:\"DataInput\",superClass:[\"ItemAwareElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"isCollection\",default:!1,isAttr:!0,type:\"Boolean\"},{name:\"inputSetRef\",type:\"InputSet\",isMany:!0,isVirtual:!0,isReference:!0},{name:\"inputSetWithOptional\",type:\"InputSet\",isMany:!0,isVirtual:!0,isReference:!0},{name:\"inputSetWithWhileExecuting\",type:\"InputSet\",isMany:!0,isVirtual:!0,isReference:!0}]},{name:\"DataOutput\",superClass:[\"ItemAwareElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"isCollection\",default:!1,isAttr:!0,type:\"Boolean\"},{name:\"outputSetRef\",type:\"OutputSet\",isMany:!0,isVirtual:!0,isReference:!0},{name:\"outputSetWithOptional\",type:\"OutputSet\",isMany:!0,isVirtual:!0,isReference:!0},{name:\"outputSetWithWhileExecuting\",type:\"OutputSet\",isMany:!0,isVirtual:!0,isReference:!0}]},{name:\"InputSet\",superClass:[\"BaseElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"dataInputRefs\",type:\"DataInput\",isMany:!0,isReference:!0},{name:\"optionalInputRefs\",type:\"DataInput\",isMany:!0,isReference:!0},{name:\"whileExecutingInputRefs\",type:\"DataInput\",isMany:!0,isReference:!0},{name:\"outputSetRefs\",type:\"OutputSet\",isMany:!0,isReference:!0}]},{name:\"OutputSet\",superClass:[\"BaseElement\"],properties:[{name:\"dataOutputRefs\",type:\"DataOutput\",isMany:!0,isReference:!0},{name:\"name\",isAttr:!0,type:\"String\"},{name:\"inputSetRefs\",type:\"InputSet\",isMany:!0,isReference:!0},{name:\"optionalOutputRefs\",type:\"DataOutput\",isMany:!0,isReference:!0},{name:\"whileExecutingOutputRefs\",type:\"DataOutput\",isMany:!0,isReference:!0}]},{name:\"Property\",superClass:[\"ItemAwareElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"}]},{name:\"DataInputAssociation\",superClass:[\"DataAssociation\"]},{name:\"DataOutputAssociation\",superClass:[\"DataAssociation\"]},{name:\"InputOutputSpecification\",superClass:[\"BaseElement\"],properties:[{name:\"dataInputs\",type:\"DataInput\",isMany:!0},{name:\"dataOutputs\",type:\"DataOutput\",isMany:!0},{name:\"inputSets\",type:\"InputSet\",isMany:!0},{name:\"outputSets\",type:\"OutputSet\",isMany:!0}]},{name:\"DataObject\",superClass:[\"FlowElement\",\"ItemAwareElement\"],properties:[{name:\"isCollection\",default:!1,isAttr:!0,type:\"Boolean\"}]},{name:\"InputOutputBinding\",properties:[{name:\"inputDataRef\",type:\"InputSet\",isAttr:!0,isReference:!0},{name:\"outputDataRef\",type:\"OutputSet\",isAttr:!0,isReference:!0},{name:\"operationRef\",type:\"Operation\",isAttr:!0,isReference:!0}]},{name:\"Assignment\",superClass:[\"BaseElement\"],properties:[{name:\"from\",type:\"Expression\",xml:{serialize:\"xsi:type\"}},{name:\"to\",type:\"Expression\",xml:{serialize:\"xsi:type\"}}]},{name:\"DataStore\",superClass:[\"RootElement\",\"ItemAwareElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"capacity\",isAttr:!0,type:\"Integer\"},{name:\"isUnlimited\",default:!0,isAttr:!0,type:\"Boolean\"}]},{name:\"DataStoreReference\",superClass:[\"ItemAwareElement\",\"FlowElement\"],properties:[{name:\"dataStoreRef\",type:\"DataStore\",isAttr:!0,isReference:!0}]},{name:\"DataObjectReference\",superClass:[\"ItemAwareElement\",\"FlowElement\"],properties:[{name:\"dataObjectRef\",type:\"DataObject\",isAttr:!0,isReference:!0}]},{name:\"ConversationLink\",superClass:[\"BaseElement\"],properties:[{name:\"sourceRef\",type:\"InteractionNode\",isAttr:!0,isReference:!0},{name:\"targetRef\",type:\"InteractionNode\",isAttr:!0,isReference:!0},{name:\"name\",isAttr:!0,type:\"String\"}]},{name:\"ConversationAssociation\",superClass:[\"BaseElement\"],properties:[{name:\"innerConversationNodeRef\",type:\"ConversationNode\",isAttr:!0,isReference:!0},{name:\"outerConversationNodeRef\",type:\"ConversationNode\",isAttr:!0,isReference:!0}]},{name:\"CallConversation\",superClass:[\"ConversationNode\"],properties:[{name:\"calledCollaborationRef\",type:\"Collaboration\",isAttr:!0,isReference:!0},{name:\"participantAssociations\",type:\"ParticipantAssociation\",isMany:!0}]},{name:\"Conversation\",superClass:[\"ConversationNode\"]},{name:\"SubConversation\",superClass:[\"ConversationNode\"],properties:[{name:\"conversationNodes\",type:\"ConversationNode\",isMany:!0}]},{name:\"ConversationNode\",isAbstract:!0,superClass:[\"InteractionNode\",\"BaseElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"participantRef\",type:\"Participant\",isMany:!0,isReference:!0},{name:\"messageFlowRefs\",type:\"MessageFlow\",isMany:!0,isReference:!0},{name:\"correlationKeys\",type:\"CorrelationKey\",isMany:!0}]},{name:\"GlobalConversation\",superClass:[\"Collaboration\"]},{name:\"PartnerEntity\",superClass:[\"RootElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"participantRef\",type:\"Participant\",isMany:!0,isReference:!0}]},{name:\"PartnerRole\",superClass:[\"RootElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"participantRef\",type:\"Participant\",isMany:!0,isReference:!0}]},{name:\"CorrelationProperty\",superClass:[\"RootElement\"],properties:[{name:\"correlationPropertyRetrievalExpression\",type:\"CorrelationPropertyRetrievalExpression\",isMany:!0},{name:\"name\",isAttr:!0,type:\"String\"},{name:\"type\",type:\"ItemDefinition\",isAttr:!0,isReference:!0}]},{name:\"Error\",superClass:[\"RootElement\"],properties:[{name:\"structureRef\",type:\"ItemDefinition\",isAttr:!0,isReference:!0},{name:\"name\",isAttr:!0,type:\"String\"},{name:\"errorCode\",isAttr:!0,type:\"String\"}]},{name:\"CorrelationKey\",superClass:[\"BaseElement\"],properties:[{name:\"correlationPropertyRef\",type:\"CorrelationProperty\",isMany:!0,isReference:!0},{name:\"name\",isAttr:!0,type:\"String\"}]},{name:\"Expression\",superClass:[\"BaseElement\"],isAbstract:!1,properties:[{name:\"body\",isBody:!0,type:\"String\"}]},{name:\"FormalExpression\",superClass:[\"Expression\"],properties:[{name:\"language\",isAttr:!0,type:\"String\"},{name:\"evaluatesToTypeRef\",type:\"ItemDefinition\",isAttr:!0,isReference:!0}]},{name:\"Message\",superClass:[\"RootElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"itemRef\",type:\"ItemDefinition\",isAttr:!0,isReference:!0}]},{name:\"ItemDefinition\",superClass:[\"RootElement\"],properties:[{name:\"itemKind\",type:\"ItemKind\",isAttr:!0},{name:\"structureRef\",isAttr:!0,type:\"String\"},{name:\"isCollection\",default:!1,isAttr:!0,type:\"Boolean\"},{name:\"import\",type:\"Import\",isAttr:!0,isReference:!0}]},{name:\"FlowElement\",isAbstract:!0,superClass:[\"BaseElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"auditing\",type:\"Auditing\"},{name:\"monitoring\",type:\"Monitoring\"},{name:\"categoryValueRef\",type:\"CategoryValue\",isMany:!0,isReference:!0}]},{name:\"SequenceFlow\",superClass:[\"FlowElement\"],properties:[{name:\"isImmediate\",isAttr:!0,type:\"Boolean\"},{name:\"conditionExpression\",type:\"Expression\",xml:{serialize:\"xsi:type\"}},{name:\"sourceRef\",type:\"FlowNode\",isAttr:!0,isReference:!0},{name:\"targetRef\",type:\"FlowNode\",isAttr:!0,isReference:!0}]},{name:\"FlowElementsContainer\",isAbstract:!0,superClass:[\"BaseElement\"],properties:[{name:\"laneSets\",type:\"LaneSet\",isMany:!0},{name:\"flowElements\",type:\"FlowElement\",isMany:!0}]},{name:\"CallableElement\",isAbstract:!0,superClass:[\"RootElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"ioSpecification\",type:\"InputOutputSpecification\",xml:{serialize:\"property\"}},{name:\"supportedInterfaceRef\",type:\"Interface\",isMany:!0,isReference:!0},{name:\"ioBinding\",type:\"InputOutputBinding\",isMany:!0,xml:{serialize:\"property\"}}]},{name:\"FlowNode\",isAbstract:!0,superClass:[\"FlowElement\"],properties:[{name:\"incoming\",type:\"SequenceFlow\",isMany:!0,isReference:!0},{name:\"outgoing\",type:\"SequenceFlow\",isMany:!0,isReference:!0},{name:\"lanes\",type:\"Lane\",isMany:!0,isVirtual:!0,isReference:!0}]},{name:\"CorrelationPropertyRetrievalExpression\",superClass:[\"BaseElement\"],properties:[{name:\"messagePath\",type:\"FormalExpression\"},{name:\"messageRef\",type:\"Message\",isAttr:!0,isReference:!0}]},{name:\"CorrelationPropertyBinding\",superClass:[\"BaseElement\"],properties:[{name:\"dataPath\",type:\"FormalExpression\"},{name:\"correlationPropertyRef\",type:\"CorrelationProperty\",isAttr:!0,isReference:!0}]},{name:\"Resource\",superClass:[\"RootElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"resourceParameters\",type:\"ResourceParameter\",isMany:!0}]},{name:\"ResourceParameter\",superClass:[\"BaseElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"isRequired\",isAttr:!0,type:\"Boolean\"},{name:\"type\",type:\"ItemDefinition\",isAttr:!0,isReference:!0}]},{name:\"CorrelationSubscription\",superClass:[\"BaseElement\"],properties:[{name:\"correlationKeyRef\",type:\"CorrelationKey\",isAttr:!0,isReference:!0},{name:\"correlationPropertyBinding\",type:\"CorrelationPropertyBinding\",isMany:!0}]},{name:\"MessageFlow\",superClass:[\"BaseElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"sourceRef\",type:\"InteractionNode\",isAttr:!0,isReference:!0},{name:\"targetRef\",type:\"InteractionNode\",isAttr:!0,isReference:!0},{name:\"messageRef\",type:\"Message\",isAttr:!0,isReference:!0}]},{name:\"MessageFlowAssociation\",superClass:[\"BaseElement\"],properties:[{name:\"innerMessageFlowRef\",type:\"MessageFlow\",isAttr:!0,isReference:!0},{name:\"outerMessageFlowRef\",type:\"MessageFlow\",isAttr:!0,isReference:!0}]},{name:\"InteractionNode\",isAbstract:!0,properties:[{name:\"incomingConversationLinks\",type:\"ConversationLink\",isMany:!0,isVirtual:!0,isReference:!0},{name:\"outgoingConversationLinks\",type:\"ConversationLink\",isMany:!0,isVirtual:!0,isReference:!0}]},{name:\"Participant\",superClass:[\"InteractionNode\",\"BaseElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"interfaceRef\",type:\"Interface\",isMany:!0,isReference:!0},{name:\"participantMultiplicity\",type:\"ParticipantMultiplicity\"},{name:\"endPointRefs\",type:\"EndPoint\",isMany:!0,isReference:!0},{name:\"processRef\",type:\"Process\",isAttr:!0,isReference:!0}]},{name:\"ParticipantAssociation\",superClass:[\"BaseElement\"],properties:[{name:\"innerParticipantRef\",type:\"Participant\",isAttr:!0,isReference:!0},{name:\"outerParticipantRef\",type:\"Participant\",isAttr:!0,isReference:!0}]},{name:\"ParticipantMultiplicity\",properties:[{name:\"minimum\",default:0,isAttr:!0,type:\"Integer\"},{name:\"maximum\",default:1,isAttr:!0,type:\"Integer\"}],superClass:[\"BaseElement\"]},{name:\"Collaboration\",superClass:[\"RootElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"isClosed\",isAttr:!0,type:\"Boolean\"},{name:\"participants\",type:\"Participant\",isMany:!0},{name:\"messageFlows\",type:\"MessageFlow\",isMany:!0},{name:\"artifacts\",type:\"Artifact\",isMany:!0},{name:\"conversations\",type:\"ConversationNode\",isMany:!0},{name:\"conversationAssociations\",type:\"ConversationAssociation\"},{name:\"participantAssociations\",type:\"ParticipantAssociation\",isMany:!0},{name:\"messageFlowAssociations\",type:\"MessageFlowAssociation\",isMany:!0},{name:\"correlationKeys\",type:\"CorrelationKey\",isMany:!0},{name:\"choreographyRef\",type:\"Choreography\",isMany:!0,isReference:!0},{name:\"conversationLinks\",type:\"ConversationLink\",isMany:!0}]},{name:\"ChoreographyActivity\",isAbstract:!0,superClass:[\"FlowNode\"],properties:[{name:\"participantRef\",type:\"Participant\",isMany:!0,isReference:!0},{name:\"initiatingParticipantRef\",type:\"Participant\",isAttr:!0,isReference:!0},{name:\"correlationKeys\",type:\"CorrelationKey\",isMany:!0},{name:\"loopType\",type:\"ChoreographyLoopType\",default:\"None\",isAttr:!0}]},{name:\"CallChoreography\",superClass:[\"ChoreographyActivity\"],properties:[{name:\"calledChoreographyRef\",type:\"Choreography\",isAttr:!0,isReference:!0},{name:\"participantAssociations\",type:\"ParticipantAssociation\",isMany:!0}]},{name:\"SubChoreography\",superClass:[\"ChoreographyActivity\",\"FlowElementsContainer\"],properties:[{name:\"artifacts\",type:\"Artifact\",isMany:!0}]},{name:\"ChoreographyTask\",superClass:[\"ChoreographyActivity\"],properties:[{name:\"messageFlowRef\",type:\"MessageFlow\",isMany:!0,isReference:!0}]},{name:\"Choreography\",superClass:[\"Collaboration\",\"FlowElementsContainer\"]},{name:\"GlobalChoreographyTask\",superClass:[\"Choreography\"],properties:[{name:\"initiatingParticipantRef\",type:\"Participant\",isAttr:!0,isReference:!0}]},{name:\"TextAnnotation\",superClass:[\"Artifact\"],properties:[{name:\"text\",type:\"String\"},{name:\"textFormat\",default:\"text/plain\",isAttr:!0,type:\"String\"}]},{name:\"Group\",superClass:[\"Artifact\"],properties:[{name:\"categoryValueRef\",type:\"CategoryValue\",isAttr:!0,isReference:!0}]},{name:\"Association\",superClass:[\"Artifact\"],properties:[{name:\"associationDirection\",type:\"AssociationDirection\",isAttr:!0},{name:\"sourceRef\",type:\"BaseElement\",isAttr:!0,isReference:!0},{name:\"targetRef\",type:\"BaseElement\",isAttr:!0,isReference:!0}]},{name:\"Category\",superClass:[\"RootElement\"],properties:[{name:\"categoryValue\",type:\"CategoryValue\",isMany:!0},{name:\"name\",isAttr:!0,type:\"String\"}]},{name:\"Artifact\",isAbstract:!0,superClass:[\"BaseElement\"]},{name:\"CategoryValue\",superClass:[\"BaseElement\"],properties:[{name:\"categorizedFlowElements\",type:\"FlowElement\",isMany:!0,isVirtual:!0,isReference:!0},{name:\"value\",isAttr:!0,type:\"String\"}]},{name:\"Activity\",isAbstract:!0,superClass:[\"FlowNode\"],properties:[{name:\"isForCompensation\",default:!1,isAttr:!0,type:\"Boolean\"},{name:\"default\",type:\"SequenceFlow\",isAttr:!0,isReference:!0},{name:\"ioSpecification\",type:\"InputOutputSpecification\",xml:{serialize:\"property\"}},{name:\"boundaryEventRefs\",type:\"BoundaryEvent\",isMany:!0,isReference:!0},{name:\"properties\",type:\"Property\",isMany:!0},{name:\"dataInputAssociations\",type:\"DataInputAssociation\",isMany:!0},{name:\"dataOutputAssociations\",type:\"DataOutputAssociation\",isMany:!0},{name:\"startQuantity\",default:1,isAttr:!0,type:\"Integer\"},{name:\"resources\",type:\"ResourceRole\",isMany:!0},{name:\"completionQuantity\",default:1,isAttr:!0,type:\"Integer\"},{name:\"loopCharacteristics\",type:\"LoopCharacteristics\"}]},{name:\"ServiceTask\",superClass:[\"Task\"],properties:[{name:\"implementation\",isAttr:!0,type:\"String\"},{name:\"operationRef\",type:\"Operation\",isAttr:!0,isReference:!0}]},{name:\"SubProcess\",superClass:[\"Activity\",\"FlowElementsContainer\",\"InteractionNode\"],properties:[{name:\"triggeredByEvent\",default:!1,isAttr:!0,type:\"Boolean\"},{name:\"artifacts\",type:\"Artifact\",isMany:!0}]},{name:\"LoopCharacteristics\",isAbstract:!0,superClass:[\"BaseElement\"]},{name:\"MultiInstanceLoopCharacteristics\",superClass:[\"LoopCharacteristics\"],properties:[{name:\"isSequential\",default:!1,isAttr:!0,type:\"Boolean\"},{name:\"behavior\",type:\"MultiInstanceBehavior\",default:\"All\",isAttr:!0},{name:\"loopCardinality\",type:\"Expression\",xml:{serialize:\"xsi:type\"}},{name:\"loopDataInputRef\",type:\"ItemAwareElement\",isReference:!0},{name:\"loopDataOutputRef\",type:\"ItemAwareElement\",isReference:!0},{name:\"inputDataItem\",type:\"DataInput\",xml:{serialize:\"property\"}},{name:\"outputDataItem\",type:\"DataOutput\",xml:{serialize:\"property\"}},{name:\"complexBehaviorDefinition\",type:\"ComplexBehaviorDefinition\",isMany:!0},{name:\"completionCondition\",type:\"Expression\",xml:{serialize:\"xsi:type\"}},{name:\"oneBehaviorEventRef\",type:\"EventDefinition\",isAttr:!0,isReference:!0},{name:\"noneBehaviorEventRef\",type:\"EventDefinition\",isAttr:!0,isReference:!0}]},{name:\"StandardLoopCharacteristics\",superClass:[\"LoopCharacteristics\"],properties:[{name:\"testBefore\",default:!1,isAttr:!0,type:\"Boolean\"},{name:\"loopCondition\",type:\"Expression\",xml:{serialize:\"xsi:type\"}},{name:\"loopMaximum\",type:\"Integer\",isAttr:!0}]},{name:\"CallActivity\",superClass:[\"Activity\",\"InteractionNode\"],properties:[{name:\"calledElement\",type:\"String\",isAttr:!0}]},{name:\"Task\",superClass:[\"Activity\",\"InteractionNode\"]},{name:\"SendTask\",superClass:[\"Task\"],properties:[{name:\"implementation\",isAttr:!0,type:\"String\"},{name:\"operationRef\",type:\"Operation\",isAttr:!0,isReference:!0},{name:\"messageRef\",type:\"Message\",isAttr:!0,isReference:!0}]},{name:\"ReceiveTask\",superClass:[\"Task\"],properties:[{name:\"implementation\",isAttr:!0,type:\"String\"},{name:\"instantiate\",default:!1,isAttr:!0,type:\"Boolean\"},{name:\"operationRef\",type:\"Operation\",isAttr:!0,isReference:!0},{name:\"messageRef\",type:\"Message\",isAttr:!0,isReference:!0}]},{name:\"ScriptTask\",superClass:[\"Task\"],properties:[{name:\"scriptFormat\",isAttr:!0,type:\"String\"},{name:\"script\",type:\"String\"}]},{name:\"BusinessRuleTask\",superClass:[\"Task\"],properties:[{name:\"implementation\",isAttr:!0,type:\"String\"}]},{name:\"AdHocSubProcess\",superClass:[\"SubProcess\"],properties:[{name:\"completionCondition\",type:\"Expression\",xml:{serialize:\"xsi:type\"}},{name:\"ordering\",type:\"AdHocOrdering\",isAttr:!0},{name:\"cancelRemainingInstances\",default:!0,isAttr:!0,type:\"Boolean\"}]},{name:\"Transaction\",superClass:[\"SubProcess\"],properties:[{name:\"protocol\",isAttr:!0,type:\"String\"},{name:\"method\",isAttr:!0,type:\"String\"}]},{name:\"GlobalScriptTask\",superClass:[\"GlobalTask\"],properties:[{name:\"scriptLanguage\",isAttr:!0,type:\"String\"},{name:\"script\",isAttr:!0,type:\"String\"}]},{name:\"GlobalBusinessRuleTask\",superClass:[\"GlobalTask\"],properties:[{name:\"implementation\",isAttr:!0,type:\"String\"}]},{name:\"ComplexBehaviorDefinition\",superClass:[\"BaseElement\"],properties:[{name:\"condition\",type:\"FormalExpression\"},{name:\"event\",type:\"ImplicitThrowEvent\"}]},{name:\"ResourceRole\",superClass:[\"BaseElement\"],properties:[{name:\"resourceRef\",type:\"Resource\",isReference:!0},{name:\"resourceParameterBindings\",type:\"ResourceParameterBinding\",isMany:!0},{name:\"resourceAssignmentExpression\",type:\"ResourceAssignmentExpression\"},{name:\"name\",isAttr:!0,type:\"String\"}]},{name:\"ResourceParameterBinding\",properties:[{name:\"expression\",type:\"Expression\",xml:{serialize:\"xsi:type\"}},{name:\"parameterRef\",type:\"ResourceParameter\",isAttr:!0,isReference:!0}],superClass:[\"BaseElement\"]},{name:\"ResourceAssignmentExpression\",properties:[{name:\"expression\",type:\"Expression\",xml:{serialize:\"xsi:type\"}}],superClass:[\"BaseElement\"]},{name:\"Import\",properties:[{name:\"importType\",isAttr:!0,type:\"String\"},{name:\"location\",isAttr:!0,type:\"String\"},{name:\"namespace\",isAttr:!0,type:\"String\"}]},{name:\"Definitions\",superClass:[\"BaseElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"targetNamespace\",isAttr:!0,type:\"String\"},{name:\"expressionLanguage\",default:\"http://www.w3.org/1999/XPath\",isAttr:!0,type:\"String\"},{name:\"typeLanguage\",default:\"http://www.w3.org/2001/XMLSchema\",isAttr:!0,type:\"String\"},{name:\"imports\",type:\"Import\",isMany:!0},{name:\"extensions\",type:\"Extension\",isMany:!0},{name:\"rootElements\",type:\"RootElement\",isMany:!0},{name:\"diagrams\",isMany:!0,type:\"bpmndi:BPMNDiagram\"},{name:\"exporter\",isAttr:!0,type:\"String\"},{name:\"relationships\",type:\"Relationship\",isMany:!0},{name:\"exporterVersion\",isAttr:!0,type:\"String\"}]}],enumerations:[{name:\"ProcessType\",literalValues:[{name:\"None\"},{name:\"Public\"},{name:\"Private\"}]},{name:\"GatewayDirection\",literalValues:[{name:\"Unspecified\"},{name:\"Converging\"},{name:\"Diverging\"},{name:\"Mixed\"}]},{name:\"EventBasedGatewayType\",literalValues:[{name:\"Parallel\"},{name:\"Exclusive\"}]},{name:\"RelationshipDirection\",literalValues:[{name:\"None\"},{name:\"Forward\"},{name:\"Backward\"},{name:\"Both\"}]},{name:\"ItemKind\",literalValues:[{name:\"Physical\"},{name:\"Information\"}]},{name:\"ChoreographyLoopType\",literalValues:[{name:\"None\"},{name:\"Standard\"},{name:\"MultiInstanceSequential\"},{name:\"MultiInstanceParallel\"}]},{name:\"AssociationDirection\",literalValues:[{name:\"None\"},{name:\"One\"},{name:\"Both\"}]},{name:\"MultiInstanceBehavior\",literalValues:[{name:\"None\"},{name:\"One\"},{name:\"All\"},{name:\"Complex\"}]},{name:\"AdHocOrdering\",literalValues:[{name:\"Parallel\"},{name:\"Sequential\"}]}],xml:{tagAlias:\"lowerCase\",typePrefix:\"t\"}},bpmndi:{name:\"BPMNDI\",uri:\"http://www.omg.org/spec/BPMN/20100524/DI\",prefix:\"bpmndi\",types:[{name:\"BPMNDiagram\",properties:[{name:\"plane\",type:\"BPMNPlane\",redefines:\"di:Diagram#rootElement\"},{name:\"labelStyle\",type:\"BPMNLabelStyle\",isMany:!0}],superClass:[\"di:Diagram\"]},{name:\"BPMNPlane\",properties:[{name:\"bpmnElement\",isAttr:!0,isReference:!0,type:\"bpmn:BaseElement\",redefines:\"di:DiagramElement#modelElement\"}],superClass:[\"di:Plane\"]},{name:\"BPMNShape\",properties:[{name:\"bpmnElement\",isAttr:!0,isReference:!0,type:\"bpmn:BaseElement\",redefines:\"di:DiagramElement#modelElement\"},{name:\"isHorizontal\",isAttr:!0,type:\"Boolean\"},{name:\"isExpanded\",isAttr:!0,type:\"Boolean\"},{name:\"isMarkerVisible\",isAttr:!0,type:\"Boolean\"},{name:\"label\",type:\"BPMNLabel\"},{name:\"isMessageVisible\",isAttr:!0,type:\"Boolean\"},{name:\"participantBandKind\",type:\"ParticipantBandKind\",isAttr:!0},{name:\"choreographyActivityShape\",type:\"BPMNShape\",isAttr:!0,isReference:!0}],superClass:[\"di:LabeledShape\"]},{name:\"BPMNEdge\",properties:[{name:\"label\",type:\"BPMNLabel\"},{name:\"bpmnElement\",isAttr:!0,isReference:!0,type:\"bpmn:BaseElement\",redefines:\"di:DiagramElement#modelElement\"},{name:\"sourceElement\",isAttr:!0,isReference:!0,type:\"di:DiagramElement\",redefines:\"di:Edge#source\"},{name:\"targetElement\",isAttr:!0,isReference:!0,type:\"di:DiagramElement\",redefines:\"di:Edge#target\"},{name:\"messageVisibleKind\",type:\"MessageVisibleKind\",isAttr:!0,default:\"initiating\"}],superClass:[\"di:LabeledEdge\"]},{name:\"BPMNLabel\",properties:[{name:\"labelStyle\",type:\"BPMNLabelStyle\",isAttr:!0,isReference:!0,redefines:\"di:DiagramElement#style\"}],superClass:[\"di:Label\"]},{name:\"BPMNLabelStyle\",properties:[{name:\"font\",type:\"dc:Font\"}],superClass:[\"di:Style\"]}],enumerations:[{name:\"ParticipantBandKind\",literalValues:[{name:\"top_initiating\"},{name:\"middle_initiating\"},{name:\"bottom_initiating\"},{name:\"top_non_initiating\"},{name:\"middle_non_initiating\"},{name:\"bottom_non_initiating\"}]},{name:\"MessageVisibleKind\",literalValues:[{name:\"initiating\"},{name:\"non_initiating\"}]}],associations:[]},dc:{name:\"DC\",uri:\"http://www.omg.org/spec/DD/20100524/DC\",prefix:\"dc\",types:[{name:\"Boolean\"},{name:\"Integer\"},{name:\"Real\"},{name:\"String\"},{name:\"Font\",properties:[{name:\"name\",type:\"String\",isAttr:!0},{name:\"size\",type:\"Real\",isAttr:!0},{name:\"isBold\",type:\"Boolean\",isAttr:!0},{name:\"isItalic\",type:\"Boolean\",isAttr:!0},{name:\"isUnderline\",type:\"Boolean\",isAttr:!0},{name:\"isStrikeThrough\",type:\"Boolean\",isAttr:!0}]},{name:\"Point\",properties:[{name:\"x\",type:\"Real\",default:\"0\",isAttr:!0},{name:\"y\",type:\"Real\",default:\"0\",isAttr:!0}]},{name:\"Bounds\",properties:[{name:\"x\",type:\"Real\",default:\"0\",isAttr:!0},{name:\"y\",type:\"Real\",default:\"0\",isAttr:!0},{name:\"width\",type:\"Real\",isAttr:!0},{name:\"height\",type:\"Real\",isAttr:!0}]}],associations:[]},di:{name:\"DI\",uri:\"http://www.omg.org/spec/DD/20100524/DI\",prefix:\"di\",types:[{name:\"DiagramElement\",isAbstract:!0,properties:[{name:\"id\",isAttr:!0,isId:!0,type:\"String\"},{name:\"extension\",type:\"Extension\"},{name:\"owningDiagram\",type:\"Diagram\",isReadOnly:!0,isVirtual:!0,isReference:!0},{name:\"owningElement\",type:\"DiagramElement\",isReadOnly:!0,isVirtual:!0,isReference:!0},{name:\"modelElement\",isReadOnly:!0,isVirtual:!0,isReference:!0,type:\"Element\"},{name:\"style\",type:\"Style\",isReadOnly:!0,isVirtual:!0,isReference:!0},{name:\"ownedElement\",type:\"DiagramElement\",isReadOnly:!0,isMany:!0,isVirtual:!0}]},{name:\"Node\",isAbstract:!0,superClass:[\"DiagramElement\"]},{name:\"Edge\",isAbstract:!0,superClass:[\"DiagramElement\"],properties:[{name:\"source\",type:\"DiagramElement\",isReadOnly:!0,isVirtual:!0,isReference:!0},{name:\"target\",type:\"DiagramElement\",isReadOnly:!0,isVirtual:!0,isReference:!0},{name:\"waypoint\",isUnique:!1,isMany:!0,type:\"dc:Point\",xml:{serialize:\"xsi:type\"}}]},{name:\"Diagram\",isAbstract:!0,properties:[{name:\"id\",isAttr:!0,isId:!0,type:\"String\"},{name:\"rootElement\",type:\"DiagramElement\",isReadOnly:!0,isVirtual:!0},{name:\"name\",isAttr:!0,type:\"String\"},{name:\"documentation\",isAttr:!0,type:\"String\"},{name:\"resolution\",isAttr:!0,type:\"Real\"},{name:\"ownedStyle\",type:\"Style\",isReadOnly:!0,isMany:!0,isVirtual:!0}]},{name:\"Shape\",isAbstract:!0,superClass:[\"Node\"],properties:[{name:\"bounds\",type:\"dc:Bounds\"}]},{name:\"Plane\",isAbstract:!0,superClass:[\"Node\"],properties:[{name:\"planeElement\",type:\"DiagramElement\",subsettedProperty:\"DiagramElement-ownedElement\",isMany:!0}]},{name:\"LabeledEdge\",isAbstract:!0,superClass:[\"Edge\"],properties:[{name:\"ownedLabel\",type:\"Label\",isReadOnly:!0,subsettedProperty:\"DiagramElement-ownedElement\",isMany:!0,isVirtual:!0}]},{name:\"LabeledShape\",isAbstract:!0,superClass:[\"Shape\"],properties:[{name:\"ownedLabel\",type:\"Label\",isReadOnly:!0,subsettedProperty:\"DiagramElement-ownedElement\",isMany:!0,isVirtual:!0}]},{name:\"Label\",isAbstract:!0,superClass:[\"Node\"],properties:[{name:\"bounds\",type:\"dc:Bounds\"}]},{name:\"Style\",isAbstract:!0,properties:[{name:\"id\",isAttr:!0,isId:!0,type:\"String\"}]},{name:\"Extension\",properties:[{name:\"values\",isMany:!0,type:\"Element\"}]}],associations:[],xml:{tagAlias:\"lowerCase\"}},bioc:{name:\"bpmn.io colors for BPMN\",uri:\"http://bpmn.io/schema/bpmn/biocolor/1.0\",prefix:\"bioc\",types:[{name:\"ColoredShape\",extends:[\"bpmndi:BPMNShape\"],properties:[{name:\"stroke\",isAttr:!0,type:\"String\"},{name:\"fill\",isAttr:!0,type:\"String\"}]},{name:\"ColoredEdge\",extends:[\"bpmndi:BPMNEdge\"],properties:[{name:\"stroke\",isAttr:!0,type:\"String\"},{name:\"fill\",isAttr:!0,type:\"String\"}]}],enumerations:[],associations:[]},color:{name:\"BPMN in Color\",uri:\"http://www.omg.org/spec/BPMN/non-normative/color/1.0\",prefix:\"color\",types:[{name:\"ColoredLabel\",extends:[\"bpmndi:BPMNLabel\"],properties:[{name:\"color\",isAttr:!0,type:\"String\"}]},{name:\"ColoredShape\",extends:[\"bpmndi:BPMNShape\"],properties:[{name:\"background-color\",isAttr:!0,type:\"String\"},{name:\"border-color\",isAttr:!0,type:\"String\"}]},{name:\"ColoredEdge\",extends:[\"bpmndi:BPMNEdge\"],properties:[{name:\"border-color\",isAttr:!0,type:\"String\"}]}],enumerations:[],associations:[]}};function Sr(e,t){return new wr(L({},Er,e),t)}function Cr(e){return e?\"<\"+e.$type+(e.id?' id=\"'+e.id:\"\")+'\" />':\"<null>\"}function Rr(e){return function(){if(!window.Promise)throw new Error(\"Promises is not supported in this environment. Please polyfill Promise.\");var t=arguments.length;if(!(t>=1&&h(arguments[t-1])))return e.apply(this,arguments);var n=arguments[t-1];console.warn(new Error(\"Passing callbacks to \"+e.name+\" is deprecated and will be removed in a future major release. Please switch to promises: https://bpmn.io/l/moving-to-promises.html\"));var i=Array.prototype.slice.call(arguments,0,-1);e.apply(this,i).then((function(e){var t=Object.keys(e)[0];return n(null,e[t])}),(function(e){return n(e,e.warnings)}))}}var Pr=\"Tried to access di from the businessObject. The di is available through the diagram element only. For more information, see https://github.com/bpmn-io/bpmn-js/issues/1472\";function Tr(e){f(e,\"di\")||Object.defineProperty(e,\"di\",{enumerable:!1,get:function(){throw new Error(Pr)}})}function kr(e,t){return e.$instanceOf(t)}function Ar(e,t){var n={},i=[],r={};function o(e,t){return function(n){e(n,t)}}function a(e){n[e.id]=e}function s(n,i){try{var o=r[n.id]&&function(n,i){if(n.gfx)throw new Error(t(\"already rendered {element}\",{element:Cr(n)}));return e.element(n,r[n.id],i)}(n,i);return a(n),o}catch(e){c(e.message,{element:n,error:e}),console.error(t(\"failed to import {element}\",{element:Cr(n)})),console.error(e)}}function c(t,n){e.error(t,n)}var p=this.registerDi=function(e){var n=e.bpmnElement;n?r[n.id]?c(t(\"multiple DI elements defined for {element}\",{element:Cr(n)}),{element:n}):(r[n.id]=e,Tr(n)):c(t(\"no bpmnElement referenced in {element}\",{element:Cr(e)}),{element:e})};function l(e){var t;t=e.plane,p(t),g(t.planeElement,u)}function u(e){p(e)}this.handleDefinitions=function(a,s){var u=a.diagrams;if(s&&-1===u.indexOf(s))throw new Error(t(\"diagram not part of bpmn:Definitions\"));if(!s&&u&&u.length&&(s=u[0]),!s)throw new Error(t(\"no diagram to display\"));r={},l(s);var v=s.plane;if(!v)throw new Error(t(\"no plane for {element}\",{element:Cr(s)}));var b=v.bpmnElement;if(!b){if(b=function(e){return m(e.rootElements,(function(e){return kr(e,\"bpmn:Process\")||kr(e,\"bpmn:Collaboration\")}))}(a),!b)throw new Error(t(\"no process or collaboration to display\"));c(t(\"correcting missing bpmnElement on {plane} to {rootElement}\",{plane:Cr(v),rootElement:Cr(b)})),v.bpmnElement=b,p(v)}var x,_,E=function(t,n){return e.root(t,r[t.id],n)}(b,v);if(kr(b,\"bpmn:Process\")||kr(b,\"bpmn:SubProcess\"))d(b,E);else{if(!kr(b,\"bpmn:Collaboration\"))throw new Error(t(\"unsupported bpmnElement for {plane}: {rootElement}\",{plane:Cr(v),rootElement:Cr(b)}));_=E,g((x=b).participants,o(A,_)),w(x.artifacts,_),i.push((function(){!function(e,t){g(e,o(f,t))}(x.messageFlows,_)})),function(e,t){var i=y(e,(function(e){return!n[e.id]&&kr(e,\"bpmn:Process\")&&e.laneSets}));i.forEach(o(d,t))}(a.rootElements,E)}h(i)};var h=this.handleDeferred=function(){for(;i.length;)i.shift()()};function d(e,t){k(e,t),E(e.ioSpecification,t),w(e.artifacts,t),a(e)}function f(e,t){s(e,t)}function v(e,t){s(e,t)}function b(e,t){s(e,t)}function x(e,t){s(e,t)}function _(e,t){s(e,t)}function w(e,t){g(e,(function(e){kr(e,\"bpmn:Association\")?i.push((function(){_(e,t)})):_(e,t)}))}function E(e,t){e&&(g(e.dataInputs,o(b,t)),g(e.dataOutputs,o(x,t)))}var S=this.handleSubProcess=function(e,t){k(e,t),w(e.artifacts,t)};function C(e,t){var n=s(e,t);kr(e,\"bpmn:SubProcess\")&&S(e,n||t),kr(e,\"bpmn:Activity\")&&E(e.ioSpecification,t),i.push((function(){g(e.dataInputAssociations,o(v,t)),g(e.dataOutputAssociations,o(v,t))}))}function R(e,t){s(e,t)}function P(e,t){i.push((function(){var n=s(e,t);e.childLaneSet&&T(e.childLaneSet,n||t),function(e){g(e.flowNodeRef,(function(t){var n=t.get(\"lanes\");n&&n.push(e)}))}(e)}))}function T(e,t){g(e.lanes,o(P,t))}function k(e,n){!function(e,n){g(e,(function(e){kr(e,\"bpmn:SequenceFlow\")?i.push((function(){!function(e,t){s(e,t)}(e,n)})):kr(e,\"bpmn:BoundaryEvent\")?i.unshift((function(){C(e,n)})):kr(e,\"bpmn:FlowNode\")?C(e,n):kr(e,\"bpmn:DataObject\")||(kr(e,\"bpmn:DataStoreReference\")||kr(e,\"bpmn:DataObjectReference\")?R(e,n):c(t(\"unrecognized flowElement {element} in context {context}\",{element:Cr(e),context:n?Cr(n.businessObject):\"null\"}),{element:e,context:n}))}))}(e.flowElements,n),e.laneSets&&function(e,t){g(e,o(T,t))}(e.laneSets,n)}function A(e,t){var n=s(e,t),i=e.processRef;i&&d(i,n||t)}}function Mr(e,t){var n=Br(e);return n&&\"function\"==typeof n.$instanceOf&&n.$instanceOf(t)}function Dr(e,t){return w(t,(function(t){return Mr(e,t)}))}function Br(e){return e&&e.businessObject||e}function Nr(e){return e&&e.di}function Or(e,t,n){var i,r,o,a,s=[];function c(e,t){var n=new Ar({root:function(e,t){return i.add(e,t)},element:function(e,t,n){return i.add(e,t,n)},error:function(e,t){s.push({message:e,context:t})}},o);t=t||e.diagrams&&e.diagrams[0];var r=function(e,t){if(!t)return;var n,i=t.plane.bpmnElement,r=i;Mr(i,\"bpmn:Process\")||Mr(i,\"bpmn:Collaboration\")||(r=function(e){var t=e;for(;t;){if(Mr(t,\"bpmn:Process\"))return t;t=t.$parent}}\n/**\n   * This file must not be changed or exchanged.\n   *\n   * @see http://bpmn.io/license for more information.\n   */(i));n=Mr(r,\"bpmn:Collaboration\")?r:m(e.rootElements,(function(e){if(Mr(e,\"bpmn:Collaboration\"))return m(e.participants,(function(e){return e.processRef===r}))}));var o=[r];n&&(o=E(n.participants,(function(e){return e.processRef}))).push(n);var a=jr(o),s=[t],c=[i];return g(e.diagrams,(function(e){var t=e.plane.bpmnElement;-1!==a.indexOf(t)&&-1===c.indexOf(t)&&(s.push(e),c.push(t))})),s}(e,t);if(!r)throw new Error(o(\"no diagram to display\"));g(r,(function(t){n.handleDefinitions(e,t)}));var c=t.plane.bpmnElement.id;a.setRootElement(a.findRoot(c+\"_plane\")||a.findRoot(c))}return new Promise((function(p,l){try{return i=e.get(\"bpmnImporter\"),r=e.get(\"eventBus\"),o=e.get(\"translate\"),a=e.get(\"canvas\"),r.fire(\"import.render.start\",{definitions:t}),c(t,n),r.fire(\"import.render.complete\",{error:undefined,warnings:s}),p({warnings:s})}catch(e){return e.warnings=s,l(e)}}))}function jr(e){var t=[];return g(e,(function(e){e&&(t.push(e),t=t.concat(jr(e.flowElements)))})),t}var Lr,Ir='<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 14.02 5.57\" width=\"53\" height=\"21\"><path fill=\"currentColor\" d=\"M1.88.92v.14c0 .41-.13.68-.4.8.33.14.46.44.46.86v.33c0 .61-.33.95-.95.95H0V0h.95c.65 0 .93.3.93.92zM.63.57v1.06h.24c.24 0 .38-.1.38-.43V.98c0-.28-.1-.4-.32-.4zm0 1.63v1.22h.36c.2 0 .32-.1.32-.39v-.35c0-.37-.12-.48-.4-.48H.63zM4.18.99v.52c0 .64-.31.98-.94.98h-.3V4h-.62V0h.92c.63 0 .94.35.94.99zM2.94.57v1.35h.3c.2 0 .3-.09.3-.37v-.6c0-.29-.1-.38-.3-.38h-.3zm2.89 2.27L6.25 0h.88v4h-.6V1.12L6.1 3.99h-.6l-.46-2.82v2.82h-.55V0h.87zM8.14 1.1V4h-.56V0h.79L9 2.4V0h.56v4h-.64zm2.49 2.29v.6h-.6v-.6zM12.12 1c0-.63.33-1 .95-1 .61 0 .95.37.95 1v2.04c0 .64-.34 1-.95 1-.62 0-.95-.37-.95-1zm.62 2.08c0 .28.13.39.33.39s.32-.1.32-.4V.98c0-.29-.12-.4-.32-.4s-.33.11-.33.4z\"/><path fill=\"currentColor\" d=\"M0 4.53h14.02v1.04H0zM11.08 0h.63v.62h-.63zm.63 4V1h-.63v2.98z\"/></svg>',$r={verticalAlign:\"middle\"},Fr={color:\"#404040\"},zr={zIndex:\"1001\",position:\"fixed\",top:\"0\",left:\"0\",right:\"0\",bottom:\"0\"},Hr={width:\"100%\",height:\"100%\",background:\"rgba(40,40,40,0.2)\"},Gr={position:\"absolute\",left:\"50%\",top:\"40%\",transform:\"translate(-50%)\",width:\"260px\",padding:\"10px\",background:\"white\",boxShadow:\"0 1px 4px rgba(0,0,0,0.3)\",fontFamily:\"Helvetica, Arial, sans-serif\",fontSize:\"14px\",display:\"flex\",lineHeight:\"1.3\"},Vr='<div class=\"bjs-powered-by-lightbox\"><div class=\"backdrop\"></div><div class=\"notice\"><a href=\"https://bpmn.io\" target=\"_blank\" rel=\"noopener\" class=\"link\">'+Ir+'</a><span>Web-based tooling for BPMN, DMN and forms powered by <a href=\"https://bpmn.io\" target=\"_blank\" rel=\"noopener\">bpmn.io</a>.</span></div></div>';function Wr(){Lr||(q(Lr=de(Vr),zr),q(fe(\"svg\",Lr),$r),q(fe(\".backdrop\",Lr),Hr),q(fe(\".notice\",Lr),Gr),q(fe(\".link\",Lr),Fr,{margin:\"15px 20px 15px 10px\",alignSelf:\"center\"}),pe.bind(Lr,\".backdrop\",\"click\",(function(e){document.body.removeChild(Lr)}))),document.body.appendChild(Lr)}\n/**\n   * The code in the <project-logo></project-logo> area\n   * must not be changed.\n   *\n   * @see http://bpmn.io/license for more information.\n   */function Ur(e){e=L({},Kr,e),this._moddle=this._createModdle(e),this._container=this._createContainer(e),\n/**\n   * Adds the project logo to the diagram container as\n   * required by the bpmn.io license.\n   *\n   * @see http://bpmn.io/license\n   *\n   * @param {Element} container\n   */\nfunction(e){const t=de('<a href=\"http://bpmn.io\" target=\"_blank\" class=\"bjs-powered-by\" title=\"Powered by bpmn.io\" >'+Ir+\"</a>\");q(fe(\"svg\",t),$r),q(t,Fr,{position:\"absolute\",bottom:\"15px\",right:\"15px\",zIndex:\"100\"}),e.appendChild(t),ae.bind(t,\"click\",(function(e){Wr(),e.preventDefault()}))}(this._container),this._init(this._container,this._moddle,e)}function qr(e,t){return e.warnings=t,e}e(Ur,pi),Ur.prototype.importXML=async function(e,t){const n=this;let i=[];try{let r;e=this._emit(\"import.parse.start\",{xml:e})||e;try{r=await this._moddle.fromXML(e,\"bpmn:Definitions\")}catch(e){throw this._emit(\"import.parse.complete\",{error:e}),e}let o=r.rootElement;const a=r.references,s=r.warnings,c=r.elementsById;i=i.concat(s),o=this._emit(\"import.parse.complete\",function(e){const t=n.get(\"eventBus\").createEvent(e);return Object.defineProperty(t,\"context\",{enumerable:!0,get:function(){return console.warn(new Error(\"import.parse.complete <context> is deprecated and will be removed in future library versions\")),{warnings:e.warnings,references:e.references,elementsById:e.elementsById}}}),t}({error:null,definitions:o,elementsById:c,references:a,warnings:i}))||o;const p=await this.importDefinitions(o,t);return i=i.concat(p.warnings),this._emit(\"import.done\",{error:null,warnings:i}),{warnings:i}}catch(e){let t=e;throw i=i.concat(t.warnings||[]),qr(t,i),t=function(e){const t=/unparsable content <([^>]+)> detected([\\s\\S]*)$/.exec(e.message);t&&(e.message=\"unparsable content <\"+t[1]+\"> detected; this may indicate an invalid BPMN 2.0 diagram file\"+t[2]);return e}(t),this._emit(\"import.done\",{error:t,warnings:t.warnings}),t}},Ur.prototype.importXML=Rr(Ur.prototype.importXML),Ur.prototype.importDefinitions=async function(e,t){this._setDefinitions(e);return{warnings:(await this.open(t)).warnings}},Ur.prototype.importDefinitions=Rr(Ur.prototype.importDefinitions),Ur.prototype.open=async function(e){const t=this._definitions;let n=e;if(!t){const e=new Error(\"no XML imported\");throw qr(e,[]),e}if(\"string\"==typeof e&&(n=function(e,t){if(!t)return null;return m(e.diagrams,(function(e){return e.id===t}))||null}(t,e),!n)){const t=new Error(\"BPMNDiagram <\"+e+\"> not found\");throw qr(t,[]),t}try{this.clear()}catch(e){throw qr(e,[]),e}const{warnings:i}=await Or(this,t,n);return{warnings:i}},Ur.prototype.open=Rr(Ur.prototype.open),Ur.prototype.saveXML=async function(e){e=e||{};let t,n,i=this._definitions;try{if(!i)throw new Error(\"no definitions loaded\");i=this._emit(\"saveXML.start\",{definitions:i})||i;n=(await this._moddle.toXML(i,e)).xml,n=this._emit(\"saveXML.serialized\",{xml:n})||n}catch(e){t=e}const r=t?{error:t}:{xml:n};if(this._emit(\"saveXML.done\",r),t)throw t;return r},Ur.prototype.saveXML=Rr(Ur.prototype.saveXML),Ur.prototype.saveSVG=async function(){let e,t;this._emit(\"saveSVG.start\");try{const t=this.get(\"canvas\"),n=t.getActiveLayer(),i=fe(\"defs\",t._svg),r=Ge(n),o=i?\"<defs>\"+Ge(i)+\"</defs>\":\"\",a=n.getBBox();e='<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n\\x3c!-- created with bpmn-js / http://bpmn.io --\\x3e\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"'+a.width+'\" height=\"'+a.height+'\" viewBox=\"'+a.x+\" \"+a.y+\" \"+a.width+\" \"+a.height+'\" version=\"1.1\">'+o+r+\"</svg>\"}catch(e){t=e}if(this._emit(\"saveSVG.done\",{error:t,svg:e}),t)throw t;return{svg:e}},Ur.prototype.saveSVG=Rr(Ur.prototype.saveSVG),Ur.prototype._setDefinitions=function(e){this._definitions=e},Ur.prototype.getModules=function(){return this._modules},Ur.prototype.clear=function(){this.getDefinitions()&&pi.prototype.clear.call(this)},Ur.prototype.destroy=function(){pi.prototype.destroy.call(this),ve(this._container)},Ur.prototype.on=function(e,t,n,i){return this.get(\"eventBus\").on(e,t,n,i)},Ur.prototype.off=function(e,t){this.get(\"eventBus\").off(e,t)},Ur.prototype.attachTo=function(e){if(!e)throw new Error(\"parentNode required\");this.detach(),e.get&&e.constructor.prototype.jquery&&(e=e.get(0)),\"string\"==typeof e&&(e=fe(e)),e.appendChild(this._container),this._emit(\"attach\",{}),this.get(\"canvas\").resized()},Ur.prototype.getDefinitions=function(){return this._definitions},Ur.prototype.detach=function(){const e=this._container,t=e.parentNode;t&&(this._emit(\"detach\",{}),t.removeChild(e))},Ur.prototype._init=function(e,t,n){const i=n.modules||this.getModules(n),r=n.additionalModules||[],o=[].concat([{bpmnjs:[\"value\",this],moddle:[\"value\",t]}],i,r),a=L($(n,[\"additionalModules\"]),{canvas:L({},n.canvas,{container:e}),modules:o});pi.call(this,a),n&&n.container&&this.attachTo(n.container)},Ur.prototype._emit=function(e,t){return this.get(\"eventBus\").fire(e,t)},Ur.prototype._createContainer=function(e){const t=de('<div class=\"bjs-container\"></div>');return q(t,{width:Yr(e.width),height:Yr(e.height),position:e.position}),t},Ur.prototype._createModdle=function(e){return new Sr(L({},this._moddleExtensions,e.moddleExtensions))},Ur.prototype._modules=[];const Kr={width:\"100%\",height:\"100%\",position:\"relative\"};function Yr(e){return e+(u(e)?\"px\":\"\")}function Xr(e){Ur.call(this,e),this.on(\"import.parse.complete\",(function(e){e.error||this._collectIds(e.definitions,e.elementsById)}),this),this.on(\"diagram.destroy\",(function(){this.get(\"moddle\").ids.clear()}),this)}function Zr(e,t){return!Mr(e,\"bpmn:CallActivity\")&&(Mr(e,\"bpmn:SubProcess\")?!(!(t=t||Nr(e))||!Mr(t,\"bpmndi:BPMNPlane\"))||t&&!!t.isExpanded:!Mr(e,\"bpmn:Participant\")||!!Br(e).processRef)}function Qr(e){return e&&!!Br(e).triggeredByEvent}function Jr(e,t){return w(Br(e).eventDefinitions,(function(e){return Mr(e,t)}))}e(Xr,Ur),Xr.prototype._createModdle=function(e){var t=Ur.prototype._createModdle.call(this,e);return t.ids=new n([32,36,1]),t},Xr.prototype._collectIds=function(e,t){var n,i=e.$model.ids;for(n in i.clear(),t)i.claim(n,t[n])};var eo={width:90,height:20},to=15;function no(e){return Mr(e,\"bpmn:Event\")||Mr(e,\"bpmn:Gateway\")||Mr(e,\"bpmn:DataStoreReference\")||Mr(e,\"bpmn:DataObjectReference\")||Mr(e,\"bpmn:DataInput\")||Mr(e,\"bpmn:DataOutput\")||Mr(e,\"bpmn:SequenceFlow\")||Mr(e,\"bpmn:MessageFlow\")||Mr(e,\"bpmn:Group\")}function io(e){return mn(e.label)}function ro(e){var t=e.length/2-1,n=e[Math.floor(t)],i=e[Math.ceil(t+.01)],r=function(e){var t=e.length/2-1,n=e[Math.floor(t)],i=e[Math.ceil(t+.01)];return{x:n.x+(i.x-n.x)/2,y:n.y+(i.y-n.y)/2}}(e),o=Math.atan((i.y-n.y)/(i.x-n.x)),a=r.x,s=r.y;return Math.abs(o)<Math.PI/2?s-=to:a+=to,{x:a,y:s}}function oo(e){return e.waypoints?ro(e.waypoints):Mr(e,\"bpmn:Group\")?{x:e.x+e.width/2,y:e.y+eo.height/2}:{x:e.x+e.width/2,y:e.y+e.height+eo.height/2}}function ao(e){return Mr(e,\"bpmn:FlowElement\")||Mr(e,\"bpmn:Participant\")||Mr(e,\"bpmn:Lane\")||Mr(e,\"bpmn:SequenceFlow\")||Mr(e,\"bpmn:MessageFlow\")||Mr(e,\"bpmn:DataInput\")||Mr(e,\"bpmn:DataOutput\")?\"name\":Mr(e,\"bpmn:TextAnnotation\")?\"text\":Mr(e,\"bpmn:Group\")?\"categoryValueRef\":void 0}function so(e){var t=e.businessObject,n=ao(t);if(n)return\"categoryValueRef\"===n?function(e){var t=e.categoryValueRef;return t&&t.value||\"\"}(t):t[n]||\"\"}var co=\"hsl(225, 10%, 15%)\";function po(e,t){return w(e.eventDefinitions,(function(e){return e.$type===t}))}function lo(e,t){var n=Nr(e);return n.get(\"color:background-color\")||n.get(\"bioc:fill\")||t||\"white\"}function uo(e,t){var n=Nr(e);return n.get(\"color:border-color\")||n.get(\"bioc:stroke\")||t||co}function ho(e,t,n){var i=Nr(e).get(\"label\");return i&&i.get(\"color:color\")||t||uo(e,n)}var fo=new n,mo=.95;function vo(e,t,n,i,r,o,a){it.call(this,t,a);var s=e&&e.defaultFillColor,c=e&&e.defaultStrokeColor,p=e&&e.defaultLabelColor,u=fo.next(),h={};function d(e){return n.computeStyle(e,{strokeLinecap:\"round\",strokeLinejoin:\"round\",stroke:co,strokeWidth:2,fill:\"white\"})}function f(e){return n.computeStyle(e,[\"no-fill\"],{strokeLinecap:\"round\",strokeLinejoin:\"round\",stroke:co,strokeWidth:2})}function m(e,t){var{ref:n={x:0,y:0},scale:i=1,element:o}=t,a=De(\"marker\",{id:e,viewBox:\"0 0 20 20\",refX:n.x,refY:n.y,markerWidth:20*i,markerHeight:20*i,orient:\"auto\"});ge(a,o);var s=fe(\"defs\",r._svg);s||(s=De(\"defs\"),ge(r._svg,s)),ge(s,a),h[e]=a}function v(e){return e.replace(/[^0-9a-zA-Z]+/g,\"_\")}function y(e,t,n){var i=e+\"-\"+v(t)+\"-\"+v(n)+\"-\"+u;return h[i]||function(e,t,n,i){if(\"sequenceflow-end\"===t){m(e,{element:De(\"path\",{d:\"M 1 5 L 11 10 L 1 15 Z\",...d({fill:i,stroke:i,strokeWidth:1})}),ref:{x:11,y:10},scale:.5})}if(\"messageflow-start\"===t){m(e,{element:De(\"circle\",{cx:6,cy:6,r:3.5,...d({fill:n,stroke:i,strokeWidth:1,strokeDasharray:[1e4,1]})}),ref:{x:6,y:6}})}if(\"messageflow-end\"===t){m(e,{element:De(\"path\",{d:\"m 1 5 l 0 -3 l 7 3 l -7 3 z\",...d({fill:n,stroke:i,strokeWidth:1,strokeDasharray:[1e4,1]})}),ref:{x:8.5,y:5}})}if(\"association-start\"===t){m(e,{element:De(\"path\",{d:\"M 11 5 L 1 10 L 11 15\",...f({fill:\"none\",stroke:i,strokeWidth:1.5,strokeDasharray:[1e4,1]})}),ref:{x:1,y:10},scale:.5})}if(\"association-end\"===t){m(e,{element:De(\"path\",{d:\"M 1 5 L 11 10 L 1 15\",...f({fill:\"none\",stroke:i,strokeWidth:1.5,strokeDasharray:[1e4,1]})}),ref:{x:11,y:10},scale:.5})}if(\"conditional-flow-marker\"===t){m(e,{element:De(\"path\",{d:\"M 0 10 L 8 6 L 16 10 L 8 14 Z\",...d({fill:n,stroke:i})}),ref:{x:-1,y:10},scale:.5})}if(\"conditional-default-flow-marker\"===t){m(e,{element:De(\"path\",{d:\"M 6 4 L 10 16\",...d({stroke:i})}),ref:{x:0,y:10},scale:.5})}}(i,e,t,n),\"url(#\"+i+\")\"}function b(e,t,n,i,r){l(i)&&(r=i,i=0),i=i||0,\"none\"===(r=d(r)).fill&&delete r.fillOpacity;var o=De(\"circle\",{cx:t/2,cy:n/2,r:Math.round((t+n)/4-i),...r});return ge(e,o),o}function x(e,t,n,i,r,o){l(r)&&(o=r,r=0),r=r||0,o=d(o);var a=De(\"rect\",{x:r,y:r,width:t-2*r,height:n-2*r,rx:i,ry:i,...o});return ge(e,a),a}function _(e,t,n,i){var r=pt(t,n=f(n),i);return ge(e,r),r}function w(e,t,n){return _(e,t,n,5)}function E(e,t,n){n=f(n);var i=De(\"path\",{...n,d:t});return ge(e,i),i}function S(e,t,n,i){return E(t,n,L({\"data-marker\":e},i))}function C(e){return M[e]}function R(e){return function(t,n,i){return C(e)(t,n,i)}}function P(e,t){var n=Br(e),i=function(e){return\"bpmn:IntermediateThrowEvent\"===e.$type||\"bpmn:EndEvent\"===e.$type}(n);return n.eventDefinitions&&n.eventDefinitions.length>1?n.parallelMultiple?C(\"bpmn:ParallelMultipleEventDefinition\")(t,e,i):C(\"bpmn:MultipleEventDefinition\")(t,e,i):po(n,\"bpmn:MessageEventDefinition\")?C(\"bpmn:MessageEventDefinition\")(t,e,i):po(n,\"bpmn:TimerEventDefinition\")?C(\"bpmn:TimerEventDefinition\")(t,e,i):po(n,\"bpmn:ConditionalEventDefinition\")?C(\"bpmn:ConditionalEventDefinition\")(t,e):po(n,\"bpmn:SignalEventDefinition\")?C(\"bpmn:SignalEventDefinition\")(t,e,i):po(n,\"bpmn:EscalationEventDefinition\")?C(\"bpmn:EscalationEventDefinition\")(t,e,i):po(n,\"bpmn:LinkEventDefinition\")?C(\"bpmn:LinkEventDefinition\")(t,e,i):po(n,\"bpmn:ErrorEventDefinition\")?C(\"bpmn:ErrorEventDefinition\")(t,e,i):po(n,\"bpmn:CancelEventDefinition\")?C(\"bpmn:CancelEventDefinition\")(t,e,i):po(n,\"bpmn:CompensateEventDefinition\")?C(\"bpmn:CompensateEventDefinition\")(t,e,i):po(n,\"bpmn:TerminateEventDefinition\")?C(\"bpmn:TerminateEventDefinition\")(t,e,i):null}function T(e,t,n){n=L({size:{width:100}},n);var i=o.createText(t||\"\",n);return Se(i).add(\"djs-label\"),ge(e,i),i}function k(e,t,n){return T(e,Br(t).name,{box:t,align:n,padding:7,style:{fill:ho(t,p,c)}})}function A(e,t,n){ni(T(e,t,{box:{height:30,width:n.height},align:\"center-middle\",style:{fill:ho(n,p,c)}}),0,-(-1*n.height),270)}var M=this.handlers={\"bpmn:Event\":function(e,t,n){return\"fillOpacity\"in n||(n.fillOpacity=mo),b(e,t.width,t.height,n)},\"bpmn:StartEvent\":function(e,t,n){var i={fill:lo(t,s),stroke:uo(t,c)};Br(t).isInterrupting||(i={strokeDasharray:\"6\",fill:lo(t,s),stroke:uo(t,c)});var r=C(\"bpmn:Event\")(e,t,i);return n&&!1===n.renderIcon||P(t,e),r},\"bpmn:MessageEventDefinition\":function(e,t,n){return E(e,i.getScaledPath(\"EVENT_MESSAGE\",{xScaleFactor:.9,yScaleFactor:.9,containerWidth:t.width,containerHeight:t.height,position:{mx:.235,my:.315}}),{strokeWidth:1,fill:n?uo(t,c):lo(t,s),stroke:n?lo(t,s):uo(t,c)})},\"bpmn:TimerEventDefinition\":function(e,t){var n=b(e,t.width,t.height,.2*t.height,{strokeWidth:2,fill:lo(t,s),stroke:uo(t,c)});E(e,i.getScaledPath(\"EVENT_TIMER_WH\",{xScaleFactor:.75,yScaleFactor:.75,containerWidth:t.width,containerHeight:t.height,position:{mx:.5,my:.5}}),{strokeWidth:2,stroke:uo(t,c)});for(var r=0;r<12;r++){var o=i.getScaledPath(\"EVENT_TIMER_LINE\",{xScaleFactor:.75,yScaleFactor:.75,containerWidth:t.width,containerHeight:t.height,position:{mx:.5,my:.5}}),a=t.width/2;E(e,o,{strokeWidth:1,transform:\"rotate(\"+30*r+\",\"+t.height/2+\",\"+a+\")\",stroke:uo(t,c)})}return n},\"bpmn:EscalationEventDefinition\":function(e,t,n){return E(e,i.getScaledPath(\"EVENT_ESCALATION\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:.5,my:.2}}),{strokeWidth:1,fill:n?uo(t,c):\"none\",stroke:uo(t,c)})},\"bpmn:ConditionalEventDefinition\":function(e,t){return E(e,i.getScaledPath(\"EVENT_CONDITIONAL\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:.5,my:.222}}),{strokeWidth:1,stroke:uo(t,c)})},\"bpmn:LinkEventDefinition\":function(e,t,n){return E(e,i.getScaledPath(\"EVENT_LINK\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:.57,my:.263}}),{strokeWidth:1,fill:n?uo(t,c):\"none\",stroke:uo(t,c)})},\"bpmn:ErrorEventDefinition\":function(e,t,n){return E(e,i.getScaledPath(\"EVENT_ERROR\",{xScaleFactor:1.1,yScaleFactor:1.1,containerWidth:t.width,containerHeight:t.height,position:{mx:.2,my:.722}}),{strokeWidth:1,fill:n?uo(t,c):\"none\",stroke:uo(t,c)})},\"bpmn:CancelEventDefinition\":function(e,t,n){var r=E(e,i.getScaledPath(\"EVENT_CANCEL_45\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:.638,my:-.055}}),{strokeWidth:1,fill:n?uo(t,c):\"none\",stroke:uo(t,c)});return ri(r,45),r},\"bpmn:CompensateEventDefinition\":function(e,t,n){return E(e,i.getScaledPath(\"EVENT_COMPENSATION\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:.22,my:.5}}),{strokeWidth:1,fill:n?uo(t,c):\"none\",stroke:uo(t,c)})},\"bpmn:SignalEventDefinition\":function(e,t,n){return E(e,i.getScaledPath(\"EVENT_SIGNAL\",{xScaleFactor:.9,yScaleFactor:.9,containerWidth:t.width,containerHeight:t.height,position:{mx:.5,my:.2}}),{strokeWidth:1,fill:n?uo(t,c):\"none\",stroke:uo(t,c)})},\"bpmn:MultipleEventDefinition\":function(e,t,n){return E(e,i.getScaledPath(\"EVENT_MULTIPLE\",{xScaleFactor:1.1,yScaleFactor:1.1,containerWidth:t.width,containerHeight:t.height,position:{mx:.222,my:.36}}),{strokeWidth:1,fill:n?uo(t,c):\"none\"})},\"bpmn:ParallelMultipleEventDefinition\":function(e,t){return E(e,i.getScaledPath(\"EVENT_PARALLEL_MULTIPLE\",{xScaleFactor:1.2,yScaleFactor:1.2,containerWidth:t.width,containerHeight:t.height,position:{mx:.458,my:.194}}),{strokeWidth:1,fill:uo(t,c),stroke:uo(t,c)})},\"bpmn:EndEvent\":function(e,t,n){var i=C(\"bpmn:Event\")(e,t,{strokeWidth:4,fill:lo(t,s),stroke:uo(t,c)});return n&&!1===n.renderIcon||P(t,e),i},\"bpmn:TerminateEventDefinition\":function(e,t){return b(e,t.width,t.height,8,{strokeWidth:4,fill:uo(t,c),stroke:uo(t,c)})},\"bpmn:IntermediateEvent\":function(e,t,n){var i=C(\"bpmn:Event\")(e,t,{strokeWidth:1.5,fill:lo(t,s),stroke:uo(t,c)});return b(e,t.width,t.height,3,{strokeWidth:1.5,fill:lo(t,\"none\"),stroke:uo(t,c)}),n&&!1===n.renderIcon||P(t,e),i},\"bpmn:IntermediateCatchEvent\":R(\"bpmn:IntermediateEvent\"),\"bpmn:IntermediateThrowEvent\":R(\"bpmn:IntermediateEvent\"),\"bpmn:Activity\":function(e,t,n){return\"fillOpacity\"in(n=n||{})||(n.fillOpacity=mo),x(e,t.width,t.height,10,n)},\"bpmn:Task\":function(e,t){var n={fill:lo(t,s),stroke:uo(t,c)},i=C(\"bpmn:Activity\")(e,t,n);return k(e,t,\"center-middle\"),D(e,t),i},\"bpmn:ServiceTask\":function(e,t){var n=C(\"bpmn:Task\")(e,t);return E(e,i.getScaledPath(\"TASK_TYPE_SERVICE\",{abspos:{x:12,y:18}}),{strokeWidth:1,fill:lo(t,s),stroke:uo(t,c)}),E(e,i.getScaledPath(\"TASK_TYPE_SERVICE_FILL\",{abspos:{x:17.2,y:18}}),{strokeWidth:0,fill:lo(t,s)}),E(e,i.getScaledPath(\"TASK_TYPE_SERVICE\",{abspos:{x:17,y:22}}),{strokeWidth:1,fill:lo(t,s),stroke:uo(t,c)}),n},\"bpmn:UserTask\":function(e,t){var n=C(\"bpmn:Task\")(e,t);return E(e,i.getScaledPath(\"TASK_TYPE_USER_1\",{abspos:{x:15,y:12}}),{strokeWidth:.5,fill:lo(t,s),stroke:uo(t,c)}),E(e,i.getScaledPath(\"TASK_TYPE_USER_2\",{abspos:{x:15,y:12}}),{strokeWidth:.5,fill:lo(t,s),stroke:uo(t,c)}),E(e,i.getScaledPath(\"TASK_TYPE_USER_3\",{abspos:{x:15,y:12}}),{strokeWidth:.5,fill:uo(t,c),stroke:uo(t,c)}),n},\"bpmn:ManualTask\":function(e,t){var n=C(\"bpmn:Task\")(e,t);return E(e,i.getScaledPath(\"TASK_TYPE_MANUAL\",{abspos:{x:17,y:15}}),{strokeWidth:.5,fill:lo(t,s),stroke:uo(t,c)}),n},\"bpmn:SendTask\":function(e,t){var n=C(\"bpmn:Task\")(e,t);return E(e,i.getScaledPath(\"TASK_TYPE_SEND\",{xScaleFactor:1,yScaleFactor:1,containerWidth:21,containerHeight:14,position:{mx:.285,my:.357}}),{strokeWidth:1,fill:uo(t,c),stroke:lo(t,s)}),n},\"bpmn:ReceiveTask\":function(e,t){var n,r=Br(t),o=C(\"bpmn:Task\")(e,t);return r.instantiate?(b(e,28,28,4.4,{strokeWidth:1}),n=i.getScaledPath(\"TASK_TYPE_INSTANTIATING_SEND\",{abspos:{x:7.77,y:9.52}})):n=i.getScaledPath(\"TASK_TYPE_SEND\",{xScaleFactor:.9,yScaleFactor:.9,containerWidth:21,containerHeight:14,position:{mx:.3,my:.4}}),E(e,n,{strokeWidth:1,fill:lo(t,s),stroke:uo(t,c)}),o},\"bpmn:ScriptTask\":function(e,t){var n=C(\"bpmn:Task\")(e,t);return E(e,i.getScaledPath(\"TASK_TYPE_SCRIPT\",{abspos:{x:15,y:20}}),{strokeWidth:1,stroke:uo(t,c)}),n},\"bpmn:BusinessRuleTask\":function(e,t){var n=C(\"bpmn:Task\")(e,t);return we(E(e,i.getScaledPath(\"TASK_TYPE_BUSINESS_RULE_HEADER\",{abspos:{x:8,y:8}})),{strokeWidth:1,fill:lo(t,\"#aaaaaa\"),stroke:uo(t,c)}),we(E(e,i.getScaledPath(\"TASK_TYPE_BUSINESS_RULE_MAIN\",{abspos:{x:8,y:8}})),{strokeWidth:1,stroke:uo(t,c)}),n},\"bpmn:SubProcess\":function(e,t,n){n={fill:lo(t,s),stroke:uo(t,c),...n};var i=C(\"bpmn:Activity\")(e,t,n),r=Zr(t);return Qr(t)&&we(i,{strokeDasharray:\"0, 5.5\",strokeWidth:2.5}),k(e,t,r?\"center-top\":\"center-middle\"),r?D(e,t):D(e,t,[\"SubProcessMarker\"]),i},\"bpmn:AdHocSubProcess\":function(e,t){return C(\"bpmn:SubProcess\")(e,t)},\"bpmn:Transaction\":function(e,t){var i=C(\"bpmn:SubProcess\")(e,t,{strokeWidth:1.5}),r=n.style([\"no-fill\",\"no-events\"],{stroke:uo(t,c),strokeWidth:1.5});return x(e,t.width,t.height,7,3,r),i},\"bpmn:CallActivity\":function(e,t){return C(\"bpmn:SubProcess\")(e,t,{strokeWidth:5})},\"bpmn:Participant\":function(e,t){var n={fillOpacity:mo,fill:lo(t,s),stroke:uo(t,c),strokeWidth:1.5},i=C(\"bpmn:Lane\")(e,t,n);Zr(t)?(_(e,[{x:30,y:0},{x:30,y:t.height}],{stroke:uo(t,c),strokeWidth:1.5}),A(e,Br(t).name,t)):T(e,Br(t).name,{box:t,align:\"center-middle\",style:{fill:ho(t,p,c)}});return!!Br(t).participantMultiplicity&&C(\"ParticipantMultiplicityMarker\")(e,t),i},\"bpmn:Lane\":function(e,t,n){var i=x(e,t.width,t.height,0,{fill:lo(t,s),fillOpacity:.35,stroke:uo(t,c),strokeWidth:1.5,...n}),r=Br(t);\"bpmn:Lane\"===r.$type&&A(e,r.name,t);return i},\"bpmn:InclusiveGateway\":function(e,t){var n=C(\"bpmn:Gateway\")(e,t);return b(e,t.width,t.height,.24*t.height,{strokeWidth:2.5,fill:lo(t,s),stroke:uo(t,c)}),n},\"bpmn:ExclusiveGateway\":function(e,t){var n=C(\"bpmn:Gateway\")(e,t),r=i.getScaledPath(\"GATEWAY_EXCLUSIVE\",{xScaleFactor:.4,yScaleFactor:.4,containerWidth:t.width,containerHeight:t.height,position:{mx:.32,my:.3}});return Nr(t).isMarkerVisible&&E(e,r,{strokeWidth:1,fill:uo(t,c),stroke:uo(t,c)}),n},\"bpmn:ComplexGateway\":function(e,t){var n=C(\"bpmn:Gateway\")(e,t);return E(e,i.getScaledPath(\"GATEWAY_COMPLEX\",{xScaleFactor:.5,yScaleFactor:.5,containerWidth:t.width,containerHeight:t.height,position:{mx:.46,my:.26}}),{strokeWidth:1,fill:uo(t,c),stroke:uo(t,c)}),n},\"bpmn:ParallelGateway\":function(e,t){var n=C(\"bpmn:Gateway\")(e,t);return E(e,i.getScaledPath(\"GATEWAY_PARALLEL\",{xScaleFactor:.6,yScaleFactor:.6,containerWidth:t.width,containerHeight:t.height,position:{mx:.46,my:.2}}),{strokeWidth:1,fill:uo(t,c),stroke:uo(t,c)}),n},\"bpmn:EventBasedGateway\":function(e,t){var n=Br(t),r=C(\"bpmn:Gateway\")(e,t);b(e,t.width,t.height,.2*t.height,{strokeWidth:1,fill:\"none\",stroke:uo(t,c)});var o=n.eventGatewayType,a=!!n.instantiate;if(\"Parallel\"===o){var s=i.getScaledPath(\"GATEWAY_PARALLEL\",{xScaleFactor:.4,yScaleFactor:.4,containerWidth:t.width,containerHeight:t.height,position:{mx:.474,my:.296}});E(e,s,{strokeWidth:1,fill:\"none\"})}else\"Exclusive\"===o&&(a||b(e,t.width,t.height,.26*t.height,{strokeWidth:1,fill:\"none\",stroke:uo(t,c)}),function(){var n=i.getScaledPath(\"GATEWAY_EVENT_BASED\",{xScaleFactor:.18,yScaleFactor:.18,containerWidth:t.width,containerHeight:t.height,position:{mx:.36,my:.44}});E(e,n,{strokeWidth:2,fill:lo(t,\"none\"),stroke:uo(t,c)})}());return r},\"bpmn:Gateway\":function(e,t){return function(e,t,n,i){var r=t/2,o=n/2,a=[{x:r,y:0},{x:t,y:o},{x:r,y:n},{x:0,y:o}].map((function(e){return e.x+\",\"+e.y})).join(\" \");i=d(i);var s=De(\"polygon\",{...i,points:a});return ge(e,s),s}(e,t.width,t.height,{fill:lo(t,s),fillOpacity:mo,stroke:uo(t,c)})},\"bpmn:SequenceFlow\":function(e,t){var n,i=lo(t,s),r=uo(t,c),o=w(e,t.waypoints,{markerEnd:y(\"sequenceflow-end\",i,r),stroke:uo(t,c)}),a=Br(t);return t.source&&(n=t.source.businessObject,a.conditionExpression&&n.$instanceOf(\"bpmn:Activity\")&&we(o,{markerStart:y(\"conditional-flow-marker\",i,r)}),n.default&&(n.$instanceOf(\"bpmn:Gateway\")||n.$instanceOf(\"bpmn:Activity\"))&&n.default===a&&we(o,{markerStart:y(\"conditional-default-flow-marker\",i,r)})),o},\"bpmn:Association\":function(e,t,n){var i=Br(t),r=lo(t,s),o=uo(t,c);return n={strokeDasharray:\"0, 5\",stroke:uo(t,c),...n},\"One\"!==i.associationDirection&&\"Both\"!==i.associationDirection||(n.markerEnd=y(\"association-end\",r,o)),\"Both\"===i.associationDirection&&(n.markerStart=y(\"association-start\",r,o)),w(e,t.waypoints,n)},\"bpmn:DataInputAssociation\":function(e,t){var n=lo(t,s),i=uo(t,c);return C(\"bpmn:Association\")(e,t,{markerEnd:y(\"association-end\",n,i)})},\"bpmn:DataOutputAssociation\":function(e,t){var n=lo(t,s),i=uo(t,c);return C(\"bpmn:Association\")(e,t,{markerEnd:y(\"association-end\",n,i)})},\"bpmn:MessageFlow\":function(e,t){var n=Br(t),r=Nr(t),o=lo(t,s),a=uo(t,c),l=w(e,t.waypoints,{markerEnd:y(\"messageflow-end\",o,a),markerStart:y(\"messageflow-start\",o,a),strokeDasharray:\"10, 11\",strokeWidth:1.5,stroke:uo(t,c)});if(n.messageRef){var u=l.getPointAtLength(l.getTotalLength()/2),h=i.getScaledPath(\"MESSAGE_FLOW_MARKER\",{abspos:{x:u.x,y:u.y}}),d={strokeWidth:1};\"initiating\"===r.messageVisibleKind?(d.fill=\"white\",d.stroke=co):(d.fill=\"#888\",d.stroke=\"white\");var f=E(e,h,d),m=T(e,n.messageRef.name,{align:\"center-top\",fitBox:!0,style:{fill:uo(t,p)}}),v=f.getBBox(),g=m.getBBox();ni(m,u.x-g.width/2,u.y+v.height/2+10,0)}return l},\"bpmn:DataObject\":function(e,t){var n=E(e,i.getScaledPath(\"DATA_OBJECT_PATH\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:.474,my:.296}}),{fill:lo(t,s),fillOpacity:mo,stroke:uo(t,c)});return function(e){var t=e.dataObjectRef;return e.isCollection||t&&t.isCollection}(Br(t))&&function(e,t){var n=(t.height-18)/t.height,r=i.getScaledPath(\"DATA_OBJECT_COLLECTION_PATH\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:.33,my:n}});E(e,r,{strokeWidth:2})}(e,t),n},\"bpmn:DataObjectReference\":R(\"bpmn:DataObject\"),\"bpmn:DataInput\":function(e,t){var n=i.getRawPath(\"DATA_ARROW\"),r=C(\"bpmn:DataObject\")(e,t);return E(e,n,{strokeWidth:1}),r},\"bpmn:DataOutput\":function(e,t){var n=i.getRawPath(\"DATA_ARROW\"),r=C(\"bpmn:DataObject\")(e,t);return E(e,n,{strokeWidth:1,fill:co}),r},\"bpmn:DataStoreReference\":function(e,t){return E(e,i.getScaledPath(\"DATA_STORE\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:0,my:.133}}),{strokeWidth:2,fill:lo(t,s),fillOpacity:mo,stroke:uo(t,c)})},\"bpmn:BoundaryEvent\":function(e,t,n){var i=Br(t).cancelActivity,r={strokeWidth:1.5,fill:lo(t,s),stroke:uo(t,c)};i||(r.strokeDasharray=\"6\");var o={...r,fillOpacity:1},a={...r,fill:\"none\"},p=C(\"bpmn:Event\")(e,t,o);return b(e,t.width,t.height,3,a),n&&!1===n.renderIcon||P(t,e),p},\"bpmn:Group\":function(e,t){return x(e,t.width,t.height,10,{stroke:uo(t,c),strokeWidth:1.5,strokeDasharray:\"10,6,0,6\",fill:\"none\",pointerEvents:\"none\"})},label:function(e,t){return function(e,t){var n={width:90,height:30,x:t.width/2+t.x,y:t.height/2+t.y};return T(e,so(t),{box:n,fitBox:!0,style:L({},o.getExternalStyle(),{fill:ho(t,p,c)})})}(e,t)},\"bpmn:TextAnnotation\":function(e,t){var n=x(e,t.width,t.height,0,0,{fill:\"none\",stroke:\"none\"});return E(e,i.getScaledPath(\"TEXT_ANNOTATION\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:0,my:0}}),{stroke:uo(t,c)}),T(e,Br(t).text||\"\",{box:t,align:\"left-top\",padding:7,style:{fill:ho(t,p,c)}}),n},ParticipantMultiplicityMarker:function(e,t){S(\"participant-multiplicity\",e,i.getScaledPath(\"MARKER_PARALLEL\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:t.width/2/t.width,my:(t.height-15)/t.height}}),{strokeWidth:2,fill:lo(t,s),stroke:uo(t,c)})},SubProcessMarker:function(e,t){ii(x(e,14,14,0,{strokeWidth:1,fill:lo(t,s),stroke:uo(t,c)}),t.width/2-7.5,t.height-20),S(\"sub-process\",e,i.getScaledPath(\"MARKER_SUB_PROCESS\",{xScaleFactor:1.5,yScaleFactor:1.5,containerWidth:t.width,containerHeight:t.height,position:{mx:(t.width/2-7.5)/t.width,my:(t.height-20)/t.height}}),{fill:lo(t,s),stroke:uo(t,c)})},ParallelMarker:function(e,t,n){S(\"parallel\",e,i.getScaledPath(\"MARKER_PARALLEL\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:(t.width/2+n.parallel)/t.width,my:(t.height-20)/t.height}}),{fill:lo(t,s),stroke:uo(t,c)})},SequentialMarker:function(e,t,n){S(\"sequential\",e,i.getScaledPath(\"MARKER_SEQUENTIAL\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:(t.width/2+n.seq)/t.width,my:(t.height-19)/t.height}}),{fill:lo(t,s),stroke:uo(t,c)})},CompensationMarker:function(e,t,n){S(\"compensation\",e,i.getScaledPath(\"MARKER_COMPENSATION\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:(t.width/2+n.compensation)/t.width,my:(t.height-13)/t.height}}),{strokeWidth:1,fill:lo(t,s),stroke:uo(t,c)})},LoopMarker:function(e,t,n){S(\"loop\",e,i.getScaledPath(\"MARKER_LOOP\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:(t.width/2+n.loop)/t.width,my:(t.height-7)/t.height}}),{strokeWidth:1.5,fill:lo(t,s),stroke:uo(t,c),strokeMiterlimit:.5})},AdhocMarker:function(e,t,n){S(\"adhoc\",e,i.getScaledPath(\"MARKER_ADHOC\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:(t.width/2+n.adhoc)/t.width,my:(t.height-15)/t.height}}),{strokeWidth:1,fill:uo(t,c),stroke:uo(t,c)})}};function D(e,t,n){var i,r=Br(t),o=n&&-1!==n.indexOf(\"SubProcessMarker\");i=o?{seq:-21,parallel:-22,compensation:-42,loop:-18,adhoc:10}:{seq:-3,parallel:-6,compensation:-27,loop:0,adhoc:10},g(n,(function(n){C(n)(e,t,i)})),r.isForCompensation&&C(\"CompensationMarker\")(e,t,i),\"bpmn:AdHocSubProcess\"===r.$type&&C(\"AdhocMarker\")(e,t,i);var a=r.loopCharacteristics,s=a&&a.isSequential;a&&(void 0===s&&C(\"LoopMarker\")(e,t,i),!1===s&&C(\"ParallelMarker\")(e,t,i),!0===s&&C(\"SequentialMarker\")(e,t,i))}this._drawPath=E,this._renderer=C}e(vo,it),vo.$inject=[\"config.bpmnRenderer\",\"eventBus\",\"styles\",\"pathMap\",\"canvas\",\"textRenderer\"],vo.prototype.canRender=function(e){return Mr(e,\"bpmn:BaseElement\")},vo.prototype.drawShape=function(e,t){var n=t.type;return this._renderer(n)(e,t)},vo.prototype.drawConnection=function(e,t){var n=t.type;return this._renderer(n)(e,t)},vo.prototype.getShapePath=function(e){return Mr(e,\"bpmn:Event\")?(n=(t=e).x+t.width/2,i=t.y+t.height/2,r=t.width/2,rt([[\"M\",n,i],[\"m\",0,-r],[\"a\",r,r,0,1,1,0,2*r],[\"a\",r,r,0,1,1,0,-2*r],[\"z\"]])):Mr(e,\"bpmn:Activity\")?function(e,t){var n=e.x,i=e.y,r=e.width,o=e.height;return rt([[\"M\",n+t,i],[\"l\",r-2*t,0],[\"a\",t,t,0,0,1,t,t],[\"l\",0,o-2*t],[\"a\",t,t,0,0,1,-t,t],[\"l\",2*t-r,0],[\"a\",t,t,0,0,1,-t,-t],[\"l\",0,2*t-o],[\"a\",t,t,0,0,1,t,-t],[\"z\"]])}(e,10):Mr(e,\"bpmn:Gateway\")?function(e){var t=e.width/2,n=e.height/2;return rt([[\"M\",e.x+t,e.y],[\"l\",t,n],[\"l\",-t,n],[\"l\",-t,-n],[\"z\"]])}(e):function(e){var t=e.x,n=e.y,i=e.width;return rt([[\"M\",t,n],[\"l\",i,0],[\"l\",0,e.height],[\"l\",-i,0],[\"z\"]])}(e);var t,n,i,r};var yo=0,go={width:150,height:50};function bo(e,t){var n;t.textContent=e;try{var i,r=\"\"===e;return t.textContent=r?\"dummy\":e,i={width:(n=t.getBBox()).width+2*n.x,height:n.height},r&&(i.width=0),i}catch(e){return{width:0,height:0}}}function xo(e,t,n){for(var i,r=e.shift(),o=r;;){if((i=bo(o,n)).width=o?i.width:0,\" \"===o||\"\"===o||i.width<Math.round(t)||o.length<2)return _o(e,o,r,i);o=Eo(o,i.width,t)}}function _o(e,t,n,i){if(t.length<n.length){var r=n.slice(t.length).trim();e.unshift(r)}return{width:i.width,height:i.height,text:t}}var wo=\"­\";function Eo(e,t,n){var i=Math.max(e.length*(n/t),1),r=function(e,t){var n,i=e.split(/(\\s|-|\\u00AD)/g),r=[],o=0;if(i.length>1)for(;n=i.shift();){if(!(n.length+o<t)){\"-\"!==n&&n!==wo||r.pop();break}r.push(n),o+=n.length}var a=r[r.length-1];return a&&a===wo&&(r[r.length-1]=\"-\"),r.join(\"\")}(e,i);return r||(r=e.slice(0,Math.max(Math.round(i-1),1))),r}function So(e){this._config=L({},{size:go,padding:yo,style:{},align:\"center-top\"},e||{})}So.prototype.createText=function(e,t){return this.layoutText(e,t).element},So.prototype.getDimensions=function(e,t){return this.layoutText(e,t).dimensions},So.prototype.layoutText=function(e,t){var n=L({},this._config.size,t.box),i=L({},this._config.style,t.style),r=function(e){var t=e.split(\"-\");return{horizontal:t[0]||\"center\",vertical:t[1]||\"top\"}}(t.align||this._config.align),o=function(e){return l(e)?L({top:0,left:0,right:0,bottom:0},e):{top:e,left:e,right:e,bottom:e}}(void 0!==t.padding?t.padding:this._config.padding),a=t.fitBox||!1,s=function(e){if(\"fontSize\"in e&&\"lineHeight\"in e)return e.lineHeight*parseInt(e.fontSize,10)}(i),c=e.split(/\\u00AD?\\r?\\n/),p=[],u=n.width-o.left-o.right,h=De(\"text\");for(we(h,{x:0,y:0}),we(h,i),ge(function(){var e=document.getElementById(\"helper-svg\");return e||(we(e=De(\"svg\"),{id:\"helper-svg\"}),q(e,{visibility:\"hidden\",position:\"fixed\",width:0,height:0}),document.body.appendChild(e)),e}(),h);c.length;)p.push(xo(c,u,h));\"middle\"===r.vertical&&(o.top=o.bottom=0);var d=x(p,(function(e,t,n){return e+(s||t.height)}),0)+o.top+o.bottom,f=x(p,(function(e,t,n){return t.width>e?t.width:e}),0),m=o.top;\"middle\"===r.vertical&&(m+=(n.height-d)/2),m-=(s||p[0].height)/4;var v=De(\"text\");return we(v,i),g(p,(function(e){var t;switch(m+=s||e.height,r.horizontal){case\"left\":t=o.left;break;case\"right\":t=(a?f:u)-o.right-e.width;break;default:t=Math.max(((a?f:u)-e.width)/2+o.left,0)}var n=De(\"tspan\");we(n,{x:t,y:m}),n.textContent=e.text,ge(v,n)})),Re(h),{dimensions:{width:f,height:d},element:v}};function Co(e){var t=L({fontFamily:\"Arial, sans-serif\",fontSize:12,fontWeight:\"normal\",lineHeight:1.2},e&&e.defaultStyle||{}),n=parseInt(t.fontSize,10)-1,i=L({},t,{fontSize:n},e&&e.externalStyle||{}),r=new So({style:t});this.getExternalLabelBounds=function(e,t){var n=r.getDimensions(t,{box:{width:90,height:30},style:i});return{x:Math.round(e.x+e.width/2-n.width/2),y:Math.round(e.y),width:Math.ceil(n.width),height:Math.ceil(n.height)}},this.getTextAnnotationBounds=function(e,n){var i=r.getDimensions(n,{box:e,style:t,align:\"left-top\",padding:5});return{x:e.x,y:e.y,width:e.width,height:Math.max(30,Math.round(i.height))}},this.createText=function(e,t){return r.createText(e,t||{})},this.getDefaultStyle=function(){return t},this.getExternalStyle=function(){return i}}Co.$inject=[\"config.textRenderer\"];var Ro=/\\{([^{}]+)\\}/g,Po=/(?:(?:^|\\.)(.+?)(?=\\[|\\.|$|\\()|\\[('|\")(.+?)\\2\\])(\\(\\))?/g;var To={__init__:[\"bpmnRenderer\"],bpmnRenderer:[\"type\",vo],textRenderer:[\"type\",Co],pathMap:[\"type\",function(){this.pathMap={EVENT_MESSAGE:{d:\"m {mx},{my} l 0,{e.y1} l {e.x1},0 l 0,-{e.y1} z l {e.x0},{e.y0} l {e.x0},-{e.y0}\",height:36,width:36,heightElements:[6,14],widthElements:[10.5,21]},EVENT_SIGNAL:{d:\"M {mx},{my} l {e.x0},{e.y0} l -{e.x1},0 Z\",height:36,width:36,heightElements:[18],widthElements:[10,20]},EVENT_ESCALATION:{d:\"M {mx},{my} l {e.x0},{e.y0} l -{e.x0},-{e.y1} l -{e.x0},{e.y1} Z\",height:36,width:36,heightElements:[20,7],widthElements:[8]},EVENT_CONDITIONAL:{d:\"M {e.x0},{e.y0} l {e.x1},0 l 0,{e.y2} l -{e.x1},0 Z M {e.x2},{e.y3} l {e.x0},0 M {e.x2},{e.y4} l {e.x0},0 M {e.x2},{e.y5} l {e.x0},0 M {e.x2},{e.y6} l {e.x0},0 M {e.x2},{e.y7} l {e.x0},0 M {e.x2},{e.y8} l {e.x0},0 \",height:36,width:36,heightElements:[8.5,14.5,18,11.5,14.5,17.5,20.5,23.5,26.5],widthElements:[10.5,14.5,12.5]},EVENT_LINK:{d:\"m {mx},{my} 0,{e.y0} -{e.x1},0 0,{e.y1} {e.x1},0 0,{e.y0} {e.x0},-{e.y2} -{e.x0},-{e.y2} z\",height:36,width:36,heightElements:[4.4375,6.75,7.8125],widthElements:[9.84375,13.5]},EVENT_ERROR:{d:\"m {mx},{my} {e.x0},-{e.y0} {e.x1},-{e.y1} {e.x2},{e.y2} {e.x3},-{e.y3} -{e.x4},{e.y4} -{e.x5},-{e.y5} z\",height:36,width:36,heightElements:[.023,8.737,8.151,16.564,10.591,8.714],widthElements:[.085,6.672,6.97,4.273,5.337,6.636]},EVENT_CANCEL_45:{d:\"m {mx},{my} -{e.x1},0 0,{e.x0} {e.x1},0 0,{e.y1} {e.x0},0 0,-{e.y1} {e.x1},0 0,-{e.y0} -{e.x1},0 0,-{e.y1} -{e.x0},0 z\",height:36,width:36,heightElements:[4.75,8.5],widthElements:[4.75,8.5]},EVENT_COMPENSATION:{d:\"m {mx},{my} {e.x0},-{e.y0} 0,{e.y1} z m {e.x1},-{e.y2} {e.x2},-{e.y3} 0,{e.y1} -{e.x2},-{e.y3} z\",height:36,width:36,heightElements:[6.5,13,.4,6.1],widthElements:[9,9.3,8.7]},EVENT_TIMER_WH:{d:\"M {mx},{my} l {e.x0},-{e.y0} m -{e.x0},{e.y0} l {e.x1},{e.y1} \",height:36,width:36,heightElements:[10,2],widthElements:[3,7]},EVENT_TIMER_LINE:{d:\"M {mx},{my} m {e.x0},{e.y0} l -{e.x1},{e.y1} \",height:36,width:36,heightElements:[10,3],widthElements:[0,0]},EVENT_MULTIPLE:{d:\"m {mx},{my} {e.x1},-{e.y0} {e.x1},{e.y0} -{e.x0},{e.y1} -{e.x2},0 z\",height:36,width:36,heightElements:[6.28099,12.56199],widthElements:[3.1405,9.42149,12.56198]},EVENT_PARALLEL_MULTIPLE:{d:\"m {mx},{my} {e.x0},0 0,{e.y1} {e.x1},0 0,{e.y0} -{e.x1},0 0,{e.y1} -{e.x0},0 0,-{e.y1} -{e.x1},0 0,-{e.y0} {e.x1},0 z\",height:36,width:36,heightElements:[2.56228,7.68683],widthElements:[2.56228,7.68683]},GATEWAY_EXCLUSIVE:{d:\"m {mx},{my} {e.x0},{e.y0} {e.x1},{e.y0} {e.x2},0 {e.x4},{e.y2} {e.x4},{e.y1} {e.x2},0 {e.x1},{e.y3} {e.x0},{e.y3} {e.x3},0 {e.x5},{e.y1} {e.x5},{e.y2} {e.x3},0 z\",height:17.5,width:17.5,heightElements:[8.5,6.5312,-6.5312,-8.5],widthElements:[6.5,-6.5,3,-3,5,-5]},GATEWAY_PARALLEL:{d:\"m {mx},{my} 0,{e.y1} -{e.x1},0 0,{e.y0} {e.x1},0 0,{e.y1} {e.x0},0 0,-{e.y1} {e.x1},0 0,-{e.y0} -{e.x1},0 0,-{e.y1} -{e.x0},0 z\",height:30,width:30,heightElements:[5,12.5],widthElements:[5,12.5]},GATEWAY_EVENT_BASED:{d:\"m {mx},{my} {e.x0},{e.y0} {e.x0},{e.y1} {e.x1},{e.y2} {e.x2},0 z\",height:11,width:11,heightElements:[-6,6,12,-12],widthElements:[9,-3,-12]},GATEWAY_COMPLEX:{d:\"m {mx},{my} 0,{e.y0} -{e.x0},-{e.y1} -{e.x1},{e.y2} {e.x0},{e.y1} -{e.x2},0 0,{e.y3} {e.x2},0  -{e.x0},{e.y1} l {e.x1},{e.y2} {e.x0},-{e.y1} 0,{e.y0} {e.x3},0 0,-{e.y0} {e.x0},{e.y1} {e.x1},-{e.y2} -{e.x0},-{e.y1} {e.x2},0 0,-{e.y3} -{e.x2},0 {e.x0},-{e.y1} -{e.x1},-{e.y2} -{e.x0},{e.y1} 0,-{e.y0} -{e.x3},0 z\",height:17.125,width:17.125,heightElements:[4.875,3.4375,2.125,3],widthElements:[3.4375,2.125,4.875,3]},DATA_OBJECT_PATH:{d:\"m 0,0 {e.x1},0 {e.x0},{e.y0} 0,{e.y1} -{e.x2},0 0,-{e.y2} {e.x1},0 0,{e.y0} {e.x0},0\",height:61,width:51,heightElements:[10,50,60],widthElements:[10,40,50,60]},DATA_OBJECT_COLLECTION_PATH:{d:\"m{mx},{my} m 3,2 l 0,10 m 3,-10 l 0,10 m 3,-10 l 0,10\",height:10,width:10,heightElements:[],widthElements:[]},DATA_ARROW:{d:\"m 5,9 9,0 0,-3 5,5 -5,5 0,-3 -9,0 z\",height:61,width:51,heightElements:[],widthElements:[]},DATA_STORE:{d:\"m  {mx},{my} l  0,{e.y2} c  {e.x0},{e.y1} {e.x1},{e.y1}  {e.x2},0 l  0,-{e.y2} c -{e.x0},-{e.y1} -{e.x1},-{e.y1} -{e.x2},0c  {e.x0},{e.y1} {e.x1},{e.y1}  {e.x2},0 m  -{e.x2},{e.y0}c  {e.x0},{e.y1} {e.x1},{e.y1} {e.x2},0m  -{e.x2},{e.y0}c  {e.x0},{e.y1} {e.x1},{e.y1}  {e.x2},0\",height:61,width:61,heightElements:[7,10,45],widthElements:[2,58,60]},TEXT_ANNOTATION:{d:\"m {mx}, {my} m 10,0 l -10,0 l 0,{e.y0} l 10,0\",height:30,width:10,heightElements:[30],widthElements:[10]},MARKER_SUB_PROCESS:{d:\"m{mx},{my} m 7,2 l 0,10 m -5,-5 l 10,0\",height:10,width:10,heightElements:[],widthElements:[]},MARKER_PARALLEL:{d:\"m{mx},{my} m 3,2 l 0,10 m 3,-10 l 0,10 m 3,-10 l 0,10\",height:10,width:10,heightElements:[],widthElements:[]},MARKER_SEQUENTIAL:{d:\"m{mx},{my} m 0,3 l 10,0 m -10,3 l 10,0 m -10,3 l 10,0\",height:10,width:10,heightElements:[],widthElements:[]},MARKER_COMPENSATION:{d:\"m {mx},{my} 7,-5 0,10 z m 7.1,-0.3 6.9,-4.7 0,10 -6.9,-4.7 z\",height:10,width:21,heightElements:[],widthElements:[]},MARKER_LOOP:{d:\"m {mx},{my} c 3.526979,0 6.386161,-2.829858 6.386161,-6.320661 0,-3.490806 -2.859182,-6.320661 -6.386161,-6.320661 -3.526978,0 -6.38616,2.829855 -6.38616,6.320661 0,1.745402 0.714797,3.325567 1.870463,4.469381 0.577834,0.571908 1.265885,1.034728 2.029916,1.35457 l -0.718163,-3.909793 m 0.718163,3.909793 -3.885211,0.802902\",height:13.9,width:13.7,heightElements:[],widthElements:[]},MARKER_ADHOC:{d:\"m {mx},{my} m 0.84461,2.64411 c 1.05533,-1.23780996 2.64337,-2.07882 4.29653,-1.97997996 2.05163,0.0805 3.85579,1.15803 5.76082,1.79107 1.06385,0.34139996 2.24454,0.1438 3.18759,-0.43767 0.61743,-0.33642 1.2775,-0.64078 1.7542,-1.17511 0,0.56023 0,1.12046 0,1.6807 -0.98706,0.96237996 -2.29792,1.62393996 -3.6918,1.66181996 -1.24459,0.0927 -2.46671,-0.2491 -3.59505,-0.74812 -1.35789,-0.55965 -2.75133,-1.33436996 -4.27027,-1.18121996 -1.37741,0.14601 -2.41842,1.13685996 -3.44288,1.96782996 z\",height:4,width:15,heightElements:[],widthElements:[]},TASK_TYPE_SEND:{d:\"m {mx},{my} l 0,{e.y1} l {e.x1},0 l 0,-{e.y1} z l {e.x0},{e.y0} l {e.x0},-{e.y0}\",height:14,width:21,heightElements:[6,14],widthElements:[10.5,21]},TASK_TYPE_SCRIPT:{d:\"m {mx},{my} c 9.966553,-6.27276 -8.000926,-7.91932 2.968968,-14.938 l -8.802728,0 c -10.969894,7.01868 6.997585,8.66524 -2.968967,14.938 z m -7,-12 l 5,0 m -4.5,3 l 4.5,0 m -3,3 l 5,0m -4,3 l 5,0\",height:15,width:12.6,heightElements:[6,14],widthElements:[10.5,21]},TASK_TYPE_USER_1:{d:\"m {mx},{my} c 0.909,-0.845 1.594,-2.049 1.594,-3.385 0,-2.554 -1.805,-4.62199999 -4.357,-4.62199999 -2.55199998,0 -4.28799998,2.06799999 -4.28799998,4.62199999 0,1.348 0.974,2.562 1.89599998,3.405 -0.52899998,0.187 -5.669,2.097 -5.794,4.7560005 v 6.718 h 17 v -6.718 c 0,-2.2980005 -5.5279996,-4.5950005 -6.0509996,-4.7760005 zm -8,6 l 0,5.5 m 11,0 l 0,-5\"},TASK_TYPE_USER_2:{d:\"m {mx},{my} m 2.162,1.009 c 0,2.4470005 -2.158,4.4310005 -4.821,4.4310005 -2.66499998,0 -4.822,-1.981 -4.822,-4.4310005 \"},TASK_TYPE_USER_3:{d:\"m {mx},{my} m -6.9,-3.80 c 0,0 2.25099998,-2.358 4.27399998,-1.177 2.024,1.181 4.221,1.537 4.124,0.965 -0.098,-0.57 -0.117,-3.79099999 -4.191,-4.13599999 -3.57499998,0.001 -4.20799998,3.36699999 -4.20699998,4.34799999 z\"},TASK_TYPE_MANUAL:{d:\"m {mx},{my} c 0.234,-0.01 5.604,0.008 8.029,0.004 0.808,0 1.271,-0.172 1.417,-0.752 0.227,-0.898 -0.334,-1.314 -1.338,-1.316 -2.467,-0.01 -7.886,-0.004 -8.108,-0.004 -0.014,-0.079 0.016,-0.533 0,-0.61 0.195,-0.042 8.507,0.006 9.616,0.002 0.877,-0.007 1.35,-0.438 1.353,-1.208 0.003,-0.768 -0.479,-1.09 -1.35,-1.091 -2.968,-0.002 -9.619,-0.013 -9.619,-0.013 v -0.591 c 0,0 5.052,-0.016 7.225,-0.016 0.888,-0.002 1.354,-0.416 1.351,-1.193 -0.006,-0.761 -0.492,-1.196 -1.361,-1.196 -3.473,-0.005 -10.86,-0.003 -11.0829995,-0.003 -0.022,-0.047 -0.045,-0.094 -0.069,-0.139 0.3939995,-0.319 2.0409995,-1.626 2.4149995,-2.017 0.469,-0.4870005 0.519,-1.1650005 0.162,-1.6040005 -0.414,-0.511 -0.973,-0.5 -1.48,-0.236 -1.4609995,0.764 -6.5999995,3.6430005 -7.7329995,4.2710005 -0.9,0.499 -1.516,1.253 -1.882,2.19 -0.37000002,0.95 -0.17,2.01 -0.166,2.979 0.004,0.718 -0.27300002,1.345 -0.055,2.063 0.629,2.087 2.425,3.312 4.859,3.318 4.6179995,0.014 9.2379995,-0.139 13.8569995,-0.158 0.755,-0.004 1.171,-0.301 1.182,-1.033 0.012,-0.754 -0.423,-0.969 -1.183,-0.973 -1.778,-0.01 -5.824,-0.004 -6.04,-0.004 10e-4,-0.084 0.003,-0.586 10e-4,-0.67 z\"},TASK_TYPE_INSTANTIATING_SEND:{d:\"m {mx},{my} l 0,8.4 l 12.6,0 l 0,-8.4 z l 6.3,3.6 l 6.3,-3.6\"},TASK_TYPE_SERVICE:{d:\"m {mx},{my} v -1.71335 c 0.352326,-0.0705 0.703932,-0.17838 1.047628,-0.32133 0.344416,-0.14465 0.665822,-0.32133 0.966377,-0.52145 l 1.19431,1.18005 1.567487,-1.57688 -1.195028,-1.18014 c 0.403376,-0.61394 0.683079,-1.29908 0.825447,-2.01824 l 1.622133,-0.01 v -2.2196 l -1.636514,0.01 c -0.07333,-0.35153 -0.178319,-0.70024 -0.323564,-1.04372 -0.145244,-0.34406 -0.321407,-0.6644 -0.522735,-0.96217 l 1.131035,-1.13631 -1.583305,-1.56293 -1.129598,1.13589 c -0.614052,-0.40108 -1.302883,-0.68093 -2.022633,-0.82247 l 0.0093,-1.61852 h -2.241173 l 0.0042,1.63124 c -0.353763,0.0736 -0.705369,0.17977 -1.049785,0.32371 -0.344415,0.14437 -0.665102,0.32092 -0.9635006,0.52046 l -1.1698628,-1.15823 -1.5667691,1.5792 1.1684265,1.15669 c -0.4026573,0.61283 -0.68308,1.29797 -0.8247287,2.01713 l -1.6588041,0.003 v 2.22174 l 1.6724648,-0.006 c 0.073327,0.35077 0.1797598,0.70243 0.3242851,1.04472 0.1452428,0.34448 0.3214064,0.6644 0.5227339,0.96066 l -1.1993431,1.19723 1.5840256,1.56011 1.1964668,-1.19348 c 0.6140517,0.40346 1.3028827,0.68232 2.0233517,0.82331 l 7.19e-4,1.69892 h 2.226848 z m 0.221462,-3.9957 c -1.788948,0.7502 -3.8576,-0.0928 -4.6097055,-1.87438 -0.7521065,-1.78321 0.090598,-3.84627 1.8802645,-4.59604 1.78823,-0.74936 3.856881,0.0929 4.608987,1.87437 0.752106,1.78165 -0.0906,3.84612 -1.879546,4.59605 z\"},TASK_TYPE_SERVICE_FILL:{d:\"m {mx},{my} c -1.788948,0.7502 -3.8576,-0.0928 -4.6097055,-1.87438 -0.7521065,-1.78321 0.090598,-3.84627 1.8802645,-4.59604 1.78823,-0.74936 3.856881,0.0929 4.608987,1.87437 0.752106,1.78165 -0.0906,3.84612 -1.879546,4.59605 z\"},TASK_TYPE_BUSINESS_RULE_HEADER:{d:\"m {mx},{my} 0,4 20,0 0,-4 z\"},TASK_TYPE_BUSINESS_RULE_MAIN:{d:\"m {mx},{my} 0,12 20,0 0,-12 zm 0,8 l 20,0 m -13,-4 l 0,8\"},MESSAGE_FLOW_MARKER:{d:\"m {mx},{my} m -10.5 ,-7 l 0,14 l 21,0 l 0,-14 z l 10.5,6 l 10.5,-6\"}},this.getRawPath=function(e){return this.pathMap[e].d},this.getScaledPath=function(e,t){var n,i,r=this.pathMap[e];t.abspos?(n=t.abspos.x,i=t.abspos.y):(n=t.containerWidth*t.position.mx,i=t.containerHeight*t.position.my);var o={};if(t.position){for(var a=t.containerHeight/r.height*t.yScaleFactor,s=t.containerWidth/r.width*t.xScaleFactor,c=0;c<r.heightElements.length;c++)o[\"y\"+c]=r.heightElements[c]*a;for(var p=0;p<r.widthElements.length;p++)o[\"x\"+p]=r.widthElements[p]*s}var l,u,h=(l=r.d,u={mx:n,my:i,e:o},String(l).replace(Ro,(function(e,t){return function(e,t,n){var i=n;return t.replace(Po,(function(e,t,n,r,o){t=t||r,i&&(t in i&&(i=i[t]),\"function\"==typeof i&&o&&(i=i()))})),i=(null==i||i==n?e:i)+\"\"}(e,t,u)})));return h}}]};var ko={translate:[\"value\",function(e,t){return t=t||{},e.replace(/{([^}]+)}/g,(function(e,n){return t[n]||\"{\"+n+\"}\"}))}]};function Ao(e,t,n){return L({id:e.id,type:e.$type,businessObject:e,di:t},n)}function Mo(e,t,n){var i=e.waypoint;return!i||i.length<2?[_n(t),_n(n)]:i.map((function(e){return{x:e.x,y:e.y}}))}function Do(e,t,n,i){return new Error(e(\"element {element} referenced by {referenced}#{property} not yet drawn\",{element:Cr(n),referenced:Cr(t),property:i}))}function Bo(e,t,n,i,r,o){this._eventBus=e,this._canvas=t,this._elementFactory=n,this._elementRegistry=i,this._translate=r,this._textRenderer=o}Bo.$inject=[\"eventBus\",\"canvas\",\"elementFactory\",\"elementRegistry\",\"translate\",\"textRenderer\"],Bo.prototype.add=function(e,t,n){var i,r,o,a=this._translate;if(Mr(t,\"bpmndi:BPMNPlane\")){var s=Mr(e,\"bpmn:SubProcess\")?{id:e.id+\"_plane\"}:{};i=this._elementFactory.createRoot(Ao(e,t,s)),this._canvas.addRootElement(i)}else if(Mr(t,\"bpmndi:BPMNShape\")){var c=!Zr(e,t),p=function(e){return Mr(e,\"bpmn:Group\")}(e);r=n&&(n.hidden||n.collapsed);var l=t.bounds;i=this._elementFactory.createShape(Ao(e,t,{collapsed:c,hidden:r,x:Math.round(l.x),y:Math.round(l.y),width:Math.round(l.width),height:Math.round(l.height),isFrame:p})),Mr(e,\"bpmn:BoundaryEvent\")&&this._attachBoundary(e,i),Mr(e,\"bpmn:Lane\")&&(o=0),Mr(e,\"bpmn:DataStoreReference\")&&(function(e,t){var n=t.x,i=t.y;return n>=e.x&&n<=e.x+e.width&&i>=e.y&&i<=e.y+e.height}(n,_n(l))||(n=this._canvas.findRoot(n))),this._canvas.addShape(i,n,o)}else{if(!Mr(t,\"bpmndi:BPMNEdge\"))throw new Error(a(\"unknown di {di} for element {semantic}\",{di:Cr(t),semantic:Cr(e)}));var u=this._getSource(e),h=this._getTarget(e);r=n&&(n.hidden||n.collapsed),i=this._elementFactory.createConnection(Ao(e,t,{hidden:r,source:u,target:h,waypoints:Mo(t,u,h)})),Mr(e,\"bpmn:DataAssociation\")&&(n=this._canvas.findRoot(n)),this._canvas.addConnection(i,n,o)}return no(e)&&so(i)&&this.addLabel(e,t,i),this._eventBus.fire(\"bpmnElement.added\",{element:i}),i},Bo.prototype._attachBoundary=function(e,t){var n=this._translate,i=e.attachedToRef;if(!i)throw new Error(n(\"missing {semantic}#attachedToRef\",{semantic:Cr(e)}));var r=this._elementRegistry.get(i.id),o=r&&r.attachers;if(!r)throw Do(n,e,i,\"attachedToRef\");t.host=r,o||(r.attachers=o=[]),-1===o.indexOf(t)&&o.push(t)},Bo.prototype.addLabel=function(e,t,n){var i,r,o;return i=function(e,t){var n,i,r,o=e.label;return o&&o.bounds?(r=o.bounds,i={width:Math.max(eo.width,r.width),height:r.height},n={x:r.x+r.width/2,y:r.y+r.height/2}):(n=oo(t),i=eo),L({x:n.x-i.width/2,y:n.y-i.height/2},i)}(t,n),(r=so(n))&&(i=this._textRenderer.getExternalLabelBounds(i,r)),o=this._elementFactory.createLabel(Ao(e,t,{id:e.id+\"_label\",labelTarget:n,type:\"label\",hidden:n.hidden||!so(n),x:Math.round(i.x),y:Math.round(i.y),width:Math.round(i.width),height:Math.round(i.height)})),this._canvas.addShape(o,n.parent)},Bo.prototype._getConnectedElement=function(e,t){var n,i,r=e.$type,o=this._translate;if(i=e[t+\"Ref\"],\"source\"===t&&\"bpmn:DataInputAssociation\"===r&&(i=i&&i[0]),(\"source\"===t&&\"bpmn:DataOutputAssociation\"===r||\"target\"===t&&\"bpmn:DataInputAssociation\"===r)&&(i=e.$parent),n=i&&this._getElement(i))return n;throw i?Do(o,e,i,t+\"Ref\"):new Error(o(\"{semantic}#{side} Ref not specified\",{semantic:Cr(e),side:t}))},Bo.prototype._getSource=function(e){return this._getConnectedElement(e,\"source\")},Bo.prototype._getTarget=function(e){return this._getConnectedElement(e,\"target\")},Bo.prototype._getElement=function(e){return this._elementRegistry.get(e.id)};var No={__depends__:[To,{__depends__:[ko],bpmnImporter:[\"type\",Bo]}]};function Oo(e){e&&\"function\"==typeof e.stopPropagation&&e.stopPropagation()}function jo(e){return e.originalEvent||e.srcEvent}function Lo(e){Oo(e),Oo(jo(e))}function Io(e){return e.pointers&&e.pointers.length&&(e=e.pointers[0]),e.touches&&e.touches.length&&(e=e.touches[0]),e?{x:e.clientX,y:e.clientY}:null}function $o(e,t){return(jo(e)||e).button===t}function Fo(e){return $o(e,0)}function zo(e){var t=jo(e)||e;return!!Fo(e)&&(/mac/i.test(navigator.platform)?t.metaKey:t.ctrlKey)}function Ho(e){var t=jo(e)||e;return Fo(e)&&t.shiftKey}function Go(e){return!0}function Vo(e){return Fo(e)||function(e){return $o(e,1)}(e)}function Wo(e,t,n){var i=this;function r(n,i,r){var o,a;(function(e,t){var n=c[e]||Fo;return!n(t)})(n,i)||(r?a=t.getGraphics(r):(o=i.delegateTarget||i.target)&&(a=o,r=t.get(a)),a&&r&&!1===e.fire(n,{element:r,gfx:a,originalEvent:i})&&(i.stopPropagation(),i.preventDefault()))}var o={};function a(e){return o[e]}var s={click:\"element.click\",contextmenu:\"element.contextmenu\",dblclick:\"element.dblclick\",mousedown:\"element.mousedown\",mousemove:\"element.mousemove\",mouseover:\"element.hover\",mouseout:\"element.out\",mouseup:\"element.mouseup\"},c={\"element.contextmenu\":Go,\"element.mousedown\":Vo,\"element.mouseup\":Vo,\"element.click\":Vo,\"element.dblclick\":Vo};var p=\"svg, .djs-element\";function l(e,t,n,i){var a=o[n]=function(e){r(n,e)};i&&(c[n]=i),a.$delegate=pe.bind(e,p,t,a)}function u(e,t,n){var i=a(n);i&&pe.unbind(e,t,i.$delegate)}e.on(\"canvas.destroy\",(function(e){var t;t=e.svg,g(s,(function(e,n){u(t,n,e)}))})),e.on(\"canvas.init\",(function(e){var t;t=e.svg,g(s,(function(e,n){l(t,n,e)}))})),e.on([\"shape.added\",\"connection.added\"],(function(t){var n=t.element,i=t.gfx;e.fire(\"interactionEvents.createHit\",{element:n,gfx:i})})),e.on([\"shape.changed\",\"connection.changed\"],500,(function(t){var n=t.element,i=t.gfx;e.fire(\"interactionEvents.updateHit\",{element:n,gfx:i})})),e.on(\"interactionEvents.createHit\",500,(function(e){var t=e.element,n=e.gfx;i.createDefaultHit(t,n)})),e.on(\"interactionEvents.updateHit\",(function(e){var t=e.element,n=e.gfx;i.updateDefaultHit(t,n)}));var h=m(\"djs-hit djs-hit-stroke\"),d=m(\"djs-hit djs-hit-click-stroke\"),f={all:m(\"djs-hit djs-hit-all\"),\"click-stroke\":d,stroke:h,\"no-move\":m(\"djs-hit djs-hit-no-move\")};function m(e,t){return t=L({stroke:\"white\",strokeWidth:15},t||{}),n.cls(e,[\"no-fill\",\"no-border\"],t)}function v(e,t){var n=f[t];if(!n)throw new Error(\"invalid hit type <\"+t+\">\");return we(e,n),e}function y(e,t){ge(e,t)}this.removeHits=function(e){g(me(\".djs-hit\",e),Re)},this.createDefaultHit=function(e,t){var n,i=e.waypoints,r=e.isFrame;return i?this.createWaypointsHit(t,i):(n=r?\"stroke\":\"all\",this.createBoxHit(t,n,{width:e.width,height:e.height}))},this.createWaypointsHit=function(e,t){var n=pt(t);return v(n,\"stroke\"),y(e,n),n},this.createBoxHit=function(e,t,n){n=L({x:0,y:0},n);var i=De(\"rect\");return v(i,t),we(i,n),y(e,i),i},this.updateDefaultHit=function(e,t){var n=fe(\".djs-hit\",t);if(n)return e.waypoints?lt(n,e.waypoints):we(n,{width:e.width,height:e.height}),n},this.fire=r,this.triggerMouseEvent=function(e,t,n){var i=s[e];if(!i)throw new Error(\"unmapped DOM event name <\"+e+\">\");return r(i,t,n)},this.mouseHandler=a,this.registerEvent=l,this.unregisterEvent=u}Wo.$inject=[\"eventBus\",\"elementRegistry\",\"styles\"];var Uo={__init__:[\"interactionEvents\"],interactionEvents:[\"type\",Wo]};function qo(e,t){this.offset=6;var n=t.cls(\"djs-outline\",[\"no-fill\"]),i=this;function r(e,t){var i=De(\"rect\");return we(i,L({x:10,y:10,rx:4,width:100,height:100},n)),ge(e,i),i}e.on([\"shape.added\",\"shape.changed\"],500,(function(e){var t=e.element,n=e.gfx,o=fe(\".djs-outline\",n);o||(o=r(n)),i.updateShapeOutline(o,t)})),e.on([\"connection.added\",\"connection.changed\"],(function(e){var t=e.element,n=e.gfx,o=fe(\".djs-outline\",n);o||(o=r(n)),i.updateConnectionOutline(o,t)}))}qo.prototype.updateShapeOutline=function(e,t){we(e,{x:-this.offset,y:-this.offset,width:t.width+2*this.offset,height:t.height+2*this.offset})},qo.prototype.updateConnectionOutline=function(e,t){var n=vt(t);we(e,{x:n.x-this.offset,y:n.y-this.offset,width:n.width+2*this.offset,height:n.height+2*this.offset})},qo.$inject=[\"eventBus\",\"styles\",\"elementRegistry\"];var Ko={__init__:[\"outline\"],outline:[\"type\",qo]};function Yo(e,t){this._eventBus=e,this._canvas=t,this._selectedElements=[];var n=this;e.on([\"shape.remove\",\"connection.remove\"],(function(e){var t=e.element;n.deselect(t)})),e.on([\"diagram.clear\",\"root.set\"],(function(e){n.select(null)}))}Yo.$inject=[\"eventBus\",\"canvas\"],Yo.prototype.deselect=function(e){var t=this._selectedElements,n=t.indexOf(e);if(-1!==n){var i=t.slice();t.splice(n,1),this._eventBus.fire(\"selection.changed\",{oldSelection:i,newSelection:t})}},Yo.prototype.get=function(){return this._selectedElements},Yo.prototype.isSelected=function(e){return-1!==this._selectedElements.indexOf(e)},Yo.prototype.select=function(e,t){var n=this._selectedElements,i=n.slice();p(e)||(e=e?[e]:[]);var r=this._canvas,o=r.getRootElement();e=e.filter((function(e){var t=r.findRoot(e);return o===t})),t?g(e,(function(e){-1===n.indexOf(e)&&n.push(e)})):this._selectedElements=n=e.slice(),this._eventBus.fire(\"selection.changed\",{oldSelection:i,newSelection:n})};var Xo=\"hover\",Zo=\"selected\";function Qo(e,t,n){this._canvas=e;var i=this;function r(t,n){e.addMarker(t,n)}function o(t,n){e.removeMarker(t,n)}this._multiSelectionBox=null,t.on(\"element.hover\",(function(e){r(e.element,Xo)})),t.on(\"element.out\",(function(e){o(e.element,Xo)})),t.on(\"selection.changed\",(function(e){var t=e.oldSelection,n=e.newSelection;g(t,(function(e){-1===n.indexOf(e)&&function(e){o(e,Zo)}(e)})),g(n,(function(e){-1===t.indexOf(e)&&function(e){r(e,Zo)}(e)})),i._updateSelectionOutline(n)})),t.on(\"element.changed\",(function(e){n.isSelected(e.element)&&i._updateSelectionOutline(n.get())}))}function Jo(e,t,n,i){e.on(\"create.end\",500,(function(e){var n=e.context,i=n.canExecute,r=n.elements,o=(n.hints||{}).autoSelect;if(i){if(!1===o)return;p(o)?t.select(o):t.select(r.filter(ea))}})),e.on(\"connect.end\",500,(function(e){var n=e.context.connection;n&&t.select(n)})),e.on(\"shape.move.end\",500,(function(e){var n=e.previousSelection||[],r=i.get(e.context.shape.id);m(n,(function(e){return r.id===e.id}))||t.select(r)})),e.on(\"element.click\",(function(e){if(Fo(e)){var i=e.element;i===n.getRootElement()&&(i=null);var r=t.isSelected(i),o=t.get().length>1,a=zo(e)||Ho(e);if(r&&o)return a?t.deselect(i):t.select(i);r?t.deselect(i):t.select(i,a)}}))}function ea(e){return!e.hidden}Qo.$inject=[\"canvas\",\"eventBus\",\"selection\"],Qo.prototype._updateSelectionOutline=function(e){var t=this._canvas.getLayer(\"selectionOutline\");Pe(t);var n=e.length>1;if(Se(this._canvas.getContainer())[n?\"add\":\"remove\"](\"djs-multi-select\"),n){var i=function(e){return{x:e.x-6,y:e.y-6,width:e.width+12,height:e.height+12}}(vt(e)),r=De(\"rect\");we(r,L({rx:3},i)),Se(r).add(\"djs-selection-outline\"),ge(t,r)}},Jo.$inject=[\"eventBus\",\"selection\",\"canvas\",\"elementRegistry\"];var ta={__init__:[\"selectionVisuals\",\"selectionBehavior\"],__depends__:[Uo,Ko],selection:[\"type\",Yo],selectionVisuals:[\"type\",Qo],selectionBehavior:[\"type\",Jo]};function na(e){this._counter=0,this._prefix=(e?e+\"-\":\"\")+Math.floor(1e9*Math.random())+\"-\"}na.prototype.next=function(){return this._prefix+ ++this._counter};var ia=new na(\"ov\");function ra(e,t,n,i){var r,o;this._eventBus=t,this._canvas=n,this._elementRegistry=i,this._ids=ia,this._overlayDefaults=L({show:null,scale:!0},e&&e.defaults),this._overlays={},this._overlayContainers=[],this._overlayRoot=(r=n.getContainer(),q(o=de('<div class=\"djs-overlay-container\" />'),{position:\"absolute\",width:0,height:0}),r.insertBefore(o,r.firstChild),o),this._init()}function oa(e,t,n){q(e,{left:t+\"px\",top:n+\"px\"})}function aa(e,t){e.style.display=!1===t?\"none\":\"\"}function sa(e,t){e.style[\"transform-origin\"]=\"top left\",[\"\",\"-ms-\",\"-webkit-\"].forEach((function(n){e.style[n+\"transform\"]=t}))}ra.$inject=[\"config.overlays\",\"eventBus\",\"canvas\",\"elementRegistry\"],ra.prototype.get=function(e){if(d(e)&&(e={id:e}),d(e.element)&&(e.element=this._elementRegistry.get(e.element)),e.element){var t=this._getOverlayContainer(e.element,!0);return t?e.type?y(t.overlays,A({type:e.type})):t.overlays.slice():[]}return e.type?y(this._overlays,A({type:e.type})):e.id?this._overlays[e.id]:null},ra.prototype.add=function(e,t,n){if(l(t)&&(n=t,t=null),e.id||(e=this._elementRegistry.get(e)),!n.position)throw new Error(\"must specifiy overlay position\");if(!n.html)throw new Error(\"must specifiy overlay html\");if(!e)throw new Error(\"invalid element specified\");var i=this._ids.next();return n=L({},this._overlayDefaults,n,{id:i,type:t,element:e,html:n.html}),this._addOverlay(n),i},ra.prototype.remove=function(e){var t=this.get(e)||[];p(t)||(t=[t]);var n=this;g(t,(function(e){var t=n._getOverlayContainer(e.element,!0);if(e&&(ve(e.html),ve(e.htmlContainer),delete e.htmlContainer,delete e.element,delete n._overlays[e.id]),t){var i=t.overlays.indexOf(e);-1!==i&&t.overlays.splice(i,1)}}))},ra.prototype.isShown=function(){return\"none\"!==this._overlayRoot.style.display},ra.prototype.show=function(){aa(this._overlayRoot)},ra.prototype.hide=function(){aa(this._overlayRoot,!1)},ra.prototype.clear=function(){this._overlays={},this._overlayContainers=[],Q(this._overlayRoot)},ra.prototype._updateOverlayContainer=function(e){var t=e.element,n=e.html,i=t.x,r=t.y;if(t.waypoints){var o=vt(t);i=o.x,r=o.y}oa(n,i,r),K(e.html,\"data-container-id\",t.id)},ra.prototype._updateOverlay=function(e){var t,n,i=e.position,r=e.htmlContainer,o=e.element,a=i.left,s=i.top;void 0!==i.right&&(t=o.waypoints?vt(o).width:o.width,a=-1*i.right+t);void 0!==i.bottom&&(n=o.waypoints?vt(o).height:o.height,s=-1*i.bottom+n);oa(r,a||0,s||0),this._updateOverlayVisibilty(e,this._canvas.viewbox())},ra.prototype._createOverlayContainer=function(e){var t=de('<div class=\"djs-overlays\" />');q(t,{position:\"absolute\"}),this._overlayRoot.appendChild(t);var n={html:t,element:e,overlays:[]};return this._updateOverlayContainer(n),this._overlayContainers.push(n),n},ra.prototype._updateRoot=function(e){var t=e.scale||1,n=\"matrix(\"+[t,0,0,t,-1*e.x*t,-1*e.y*t].join(\",\")+\")\";sa(this._overlayRoot,n)},ra.prototype._getOverlayContainer=function(e,t){var n=m(this._overlayContainers,(function(t){return t.element===e}));return n||t?n:this._createOverlayContainer(e)},ra.prototype._addOverlay=function(e){var t,n,i=e.id,r=e.element,o=e.html;o.get&&o.constructor.prototype.jquery&&(o=o.get(0)),d(o)&&(o=de(o)),n=this._getOverlayContainer(r),q(t=de('<div class=\"djs-overlay\" data-overlay-id=\"'+i+'\">'),{position:\"absolute\"}),t.appendChild(o),e.type&&X(t).add(\"djs-overlay-\"+e.type),aa(t,this._canvas.findRoot(r)===this._canvas.getRootElement()),e.htmlContainer=t,n.overlays.push(e),n.html.appendChild(t),this._overlays[i]=e,this._updateOverlay(e),this._updateOverlayVisibilty(e,this._canvas.viewbox())},ra.prototype._updateOverlayVisibilty=function(e,t){var n=e.show,i=this._canvas.findRoot(e.element),r=n&&n.minZoom,o=n&&n.maxZoom,a=e.htmlContainer,c=!0;(i!==this._canvas.getRootElement()||n&&(s(r)&&r>t.scale||s(o)&&o<t.scale))&&(c=!1),aa(a,c),this._updateOverlayScale(e,t)},ra.prototype._updateOverlayScale=function(e,t){var n,i,r,o=e.scale,a=e.htmlContainer,c=\"\";!0!==o&&(!1===o?(n=1,i=1):(n=o.min,i=o.max),s(n)&&t.scale<n&&(r=(1/t.scale||1)*n),s(i)&&t.scale>i&&(r=(1/t.scale||1)*i)),s(r)&&(c=\"scale(\"+r+\",\"+r+\")\"),sa(a,c)},ra.prototype._updateOverlaysVisibilty=function(e){var t=this;g(this._overlays,(function(n){t._updateOverlayVisibilty(n,e)}))},ra.prototype._init=function(){var e=this._eventBus,t=this;e.on(\"canvas.viewbox.changing\",(function(e){t.hide()})),e.on(\"canvas.viewbox.changed\",(function(e){var n;n=e.viewbox,t._updateRoot(n),t._updateOverlaysVisibilty(n),t.show()})),e.on([\"shape.remove\",\"connection.remove\"],(function(e){var n=e.element;g(t.get({element:n}),(function(e){t.remove(e.id)}));var i=t._getOverlayContainer(n);if(i){ve(i.html);var r=t._overlayContainers.indexOf(i);-1!==r&&t._overlayContainers.splice(r,1)}})),e.on(\"element.changed\",500,(function(e){var n=e.element,i=t._getOverlayContainer(n,!0);i&&(g(i.overlays,(function(e){t._updateOverlay(e)})),t._updateOverlayContainer(i))})),e.on(\"element.marker.update\",(function(e){var n=t._getOverlayContainer(e.element,!0);n&&X(n.html)[e.add?\"add\":\"remove\"](e.marker)})),e.on(\"root.set\",(function(){t._updateOverlaysVisibilty(t._canvas.viewbox())})),e.on(\"diagram.clear\",this.clear,this)};var ca={__init__:[\"overlays\"],overlays:[\"type\",ra]};function pa(e,t,n,i){e.on(\"element.changed\",(function(i){var r=i.element;(r.parent||r===t.getRootElement())&&(i.gfx=n.getGraphics(r)),i.gfx&&e.fire(yt(r)+\".changed\",i)})),e.on(\"elements.changed\",(function(t){var n=t.elements;n.forEach((function(t){e.fire(\"element.changed\",{element:t})})),i.updateContainments(n)})),e.on(\"shape.changed\",(function(e){i.update(\"shape\",e.element,e.gfx)})),e.on(\"connection.changed\",(function(e){i.update(\"connection\",e.element,e.gfx)}))}pa.$inject=[\"eventBus\",\"canvas\",\"elementRegistry\",\"graphicsFactory\"];var la={__init__:[\"changeSupport\"],changeSupport:[\"type\",pa]};function ua(e){this._eventBus=e}function ha(e){return function(t,n,i,r,o){(h(t)||u(t))&&(o=r,r=i,i=n,n=t,t=null),this.on(t,e,n,i,r,o)}}function da(e,t){t.invoke(ua,this),this.executed((function(t){var n=t.context;n.rootElement?e.setRootElement(n.rootElement):n.rootElement=e.getRootElement()})),this.revert((function(t){var n=t.context;n.rootElement&&e.setRootElement(n.rootElement)}))}ua.$inject=[\"eventBus\"],ua.prototype.on=function(e,t,n,i,r,o){if((h(t)||u(t))&&(o=r,r=i,i=n,n=t,t=null),h(n)&&(o=r,r=i,i=n,n=1e3),l(r)&&(o=r,r=!1),!h(i))throw new Error(\"handlerFn must be a function\");p(e)||(e=[e]);var a=this._eventBus;g(e,(function(e){var s=[\"commandStack\",e,t].filter((function(e){return e})).join(\".\");a.on(s,n,r?function(e,t){return function(n){return e.call(t||null,n.context,n.command,n)}}(i,o):i,o)}))},ua.prototype.canExecute=ha(\"canExecute\"),ua.prototype.preExecute=ha(\"preExecute\"),ua.prototype.preExecuted=ha(\"preExecuted\"),ua.prototype.execute=ha(\"execute\"),ua.prototype.executed=ha(\"executed\"),ua.prototype.postExecute=ha(\"postExecute\"),ua.prototype.postExecuted=ha(\"postExecuted\"),ua.prototype.revert=ha(\"revert\"),ua.prototype.reverted=ha(\"reverted\"),e(da,ua),da.$inject=[\"canvas\",\"injector\"];var fa={__init__:[\"rootElementsBehavior\"],rootElementsBehavior:[\"type\",da]};function ma(e){return CSS.escape(e)}var va={\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\"};function ya(e){return(e=\"\"+e)&&e.replace(/[&<>\"']/g,(function(e){return va[e]}))}var ga=\"_plane\";function ba(e){return function(e){return e.replace(new RegExp(ga+\"$\"),\"\")}(e.id)}function xa(e){var t=e.id;return Mr(e,\"bpmn:SubProcess\")?Ea(t):t}function _a(e){return Ea(e)}function wa(e){return Mr(Nr(e),\"bpmndi:BPMNPlane\")}function Ea(e){return e+ga}function Sa(e,t,n){var i=de('<ul class=\"bjs-breadcrumbs\"></ul>'),r=n.getContainer(),o=X(r);r.appendChild(i);var a=[];function s(e){e&&(a=function(e){for(var t=Br(e),n=[],i=t;i;i=i.$parent)(Mr(i,\"bpmn:SubProcess\")||Mr(i,\"bpmn:Process\"))&&n.push(i);return n.reverse()}(e));var r=a.map((function(e){var i=ya(e.name||e.id),r=de('<li><span class=\"bjs-crumb\"><a title=\"'+i+'\">'+i+\"</a></span></li>\"),o=n.findRoot(xa(e))||n.findRoot(e.id);if(!o&&Mr(e,\"bpmn:Process\")){var a=t.find((function(t){var n=Br(t);return n&&n.get(\"processRef\")&&n.get(\"processRef\")===e}));o=n.findRoot(a.id)}return r.addEventListener(\"click\",(function(){n.setRootElement(o)})),r}));i.innerHTML=\"\";var s=r.length>1;o.toggle(\"bjs-breadcrumbs-shown\",s),r.forEach((function(e){i.appendChild(e)}))}e.on(\"element.changed\",(function(e){var t=Br(e.element);m(a,(function(e){return e===t}))&&s()})),e.on(\"root.set\",(function(e){s(e.element)}))}function Ca(e,t){var n=null,i=new Ra;e.on(\"root.set\",(function(e){var r=e.element,o=t.viewbox(),a=i.get(r);if(i.set(n,{x:o.x,y:o.y,zoom:o.scale}),n=r,!Mr(r,\"bpmn:Collaboration\")||a){a=a||{x:0,y:0,zoom:1};var s=(o.x-a.x)*o.scale,c=(o.y-a.y)*o.scale;0===s&&0===c||t.scroll({dx:s,dy:c}),a.zoom!==o.scale&&t.zoom(a.zoom,{x:0,y:0})}})),e.on(\"diagram.clear\",(function(){i.clear(),n=null}))}function Ra(){this._entries=[],this.set=function(e,t){var n=!1;for(var i in this._entries)if(this._entries[i][0]===e){this._entries[i][1]=t,n=!0;break}n||this._entries.push([e,t])},this.get=function(e){for(var t in this._entries)if(this._entries[t][0]===e)return this._entries[t][1];return null},this.clear=function(){this._entries.length=0},this.remove=function(e){var t=-1;for(var n in this._entries)if(this._entries[n][0]===e){t=n;break}-1!==t&&this._entries.splice(t,1)}}Sa.$inject=[\"eventBus\",\"elementRegistry\",\"canvas\"],Ca.$inject=[\"eventBus\",\"canvas\"];var Pa=180,Ta=160;function ka(e,t){this._eventBus=e,this._moddle=t;var n=this;e.on(\"import.render.start\",1500,(function(e,t){n._handleImport(t.definitions)}))}function Aa(e){return Mr(e,\"bpmndi:BPMNDiagram\")?e:Aa(e.$parent)}ka.prototype._handleImport=function(e){if(e.diagrams){var t=this;this._definitions=e,this._processToDiagramMap={},e.diagrams.forEach((function(e){e.plane&&e.plane.bpmnElement&&(t._processToDiagramMap[e.plane.bpmnElement.id]=e)}));var n=[];e.diagrams.forEach((function(e){var i=t._createNewDiagrams(e.plane);Array.prototype.push.apply(n,i)})),n.forEach((function(e){t._movePlaneElementsToOrigin(e.plane)}))}},ka.prototype._createNewDiagrams=function(e){var t=this,n=[],i=[];e.get(\"planeElement\").forEach((function(t){var r=t.bpmnElement;if(r){var o=r.$parent;Mr(r,\"bpmn:SubProcess\")&&!t.isExpanded&&n.push(r),function(e,t){var n=e.$parent;if(!Mr(n,\"bpmn:SubProcess\")||n===t.bpmnElement)return!1;if(Dr(e,[\"bpmn:DataInputAssociation\",\"bpmn:DataOutputAssociation\"]))return!1;return!0}(r,e)&&i.push({diElement:t,parent:o})}}));var r=[];return n.forEach((function(e){if(!t._processToDiagramMap[e.id]){var n=t._createDiagram(e);t._processToDiagramMap[e.id]=n,r.push(n)}})),i.forEach((function(e){for(var i=e.diElement,r=e.parent;r&&-1===n.indexOf(r);)r=r.$parent;if(r){var o=t._processToDiagramMap[r.id];t._moveToDiPlane(i,o.plane)}})),r},ka.prototype._movePlaneElementsToOrigin=function(e){var t=e.get(\"planeElement\"),n=function(e){var t={top:1/0,right:-1/0,bottom:-1/0,left:1/0};return e.planeElement.forEach((function(e){if(e.bounds){var n=gn(e.bounds);t.top=Math.min(n.top,t.top),t.left=Math.min(n.left,t.left)}})),bn(t)}(e),i=n.x-Pa,r=n.y-Ta;t.forEach((function(e){e.waypoint?e.waypoint.forEach((function(e){e.x=e.x-i,e.y=e.y-r})):e.bounds&&(e.bounds.x=e.bounds.x-i,e.bounds.y=e.bounds.y-r)}))},ka.prototype._moveToDiPlane=function(e,t){var n=Aa(e).plane.get(\"planeElement\");n.splice(n.indexOf(e),1),t.get(\"planeElement\").push(e)},ka.prototype._createDiagram=function(e){var t=this._moddle.create(\"bpmndi:BPMNPlane\",{bpmnElement:e}),n=this._moddle.create(\"bpmndi:BPMNDiagram\",{plane:t});return t.$parent=n,t.bpmnElement=e,n.$parent=this._definitions,this._definitions.diagrams.push(n),n},ka.$inject=[\"eventBus\",\"moddle\"];var Ma=250;function Da(e,t,n,i){ua.call(this,t),this._canvas=e,this._eventBus=t,this._elementRegistry=n,this._overlays=i;var r=this;this.executed(\"shape.toggleCollapse\",Ma,(function(e){var t=e.shape;r._canDrillDown(t)?r._addOverlay(t):r._removeOverlay(t)}),!0),this.reverted(\"shape.toggleCollapse\",Ma,(function(e){var t=e.shape;r._canDrillDown(t)?r._addOverlay(t):r._removeOverlay(t)}),!0),this.executed([\"shape.create\",\"shape.move\",\"shape.delete\"],Ma,(function(e){var t=e.oldParent,n=e.newParent||e.parent,i=e.shape;r._canDrillDown(i)&&r._addOverlay(i),r._updateDrilldownOverlay(t),r._updateDrilldownOverlay(n),r._updateDrilldownOverlay(i)}),!0),this.reverted([\"shape.create\",\"shape.move\",\"shape.delete\"],Ma,(function(e){var t=e.oldParent,n=e.newParent||e.parent,i=e.shape;r._canDrillDown(i)&&r._addOverlay(i),r._updateDrilldownOverlay(t),r._updateDrilldownOverlay(n),r._updateDrilldownOverlay(i)}),!0),t.on(\"import.render.complete\",(function(){n.filter((function(e){return r._canDrillDown(e)})).map((function(e){r._addOverlay(e)}))}))}e(Da,ua),Da.prototype._updateDrilldownOverlay=function(e){var t=this._canvas;if(e){var n=t.findRoot(e);n&&this._updateOverlayVisibility(n)}},Da.prototype._canDrillDown=function(e){var t=this._canvas;return Mr(e,\"bpmn:SubProcess\")&&t.findRoot(xa(e))},Da.prototype._updateOverlayVisibility=function(e){var t=this._overlays,n=Br(e),i=t.get({element:n.id,type:\"drilldown\"})[0];if(i){var r=n&&n.get(\"flowElements\")&&n.get(\"flowElements\").length;X(i.html).toggle(\"bjs-drilldown-empty\",!r)}},Da.prototype._addOverlay=function(e){var t=this._canvas,n=this._overlays;n.get({element:e,type:\"drilldown\"}).length&&this._removeOverlay(e);var i=de('<button class=\"bjs-drilldown\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 16 16\"><path fill-rule=\"evenodd\" d=\"M4.81801948,3.50735931 L10.4996894,9.1896894 L10.5,4 L12,4 L12,12 L4,12 L4,10.5 L9.6896894,10.4996894 L3.75735931,4.56801948 C3.46446609,4.27512627 3.46446609,3.80025253 3.75735931,3.50735931 C4.05025253,3.21446609 4.52512627,3.21446609 4.81801948,3.50735931 Z\"/></svg></button>');i.addEventListener(\"click\",(function(){t.setRootElement(t.findRoot(xa(e)))})),n.add(e,\"drilldown\",{position:{bottom:-7,right:-8},html:i}),this._updateOverlayVisibility(e)},Da.prototype._removeOverlay=function(e){this._overlays.remove({element:e,type:\"drilldown\"})},Da.$inject=[\"canvas\",\"eventBus\",\"elementRegistry\",\"overlays\"];var Ba={__depends__:[ca,la,fa],__init__:[\"drilldownBreadcrumbs\",\"drilldownOverlayBehavior\",\"drilldownCentering\",\"subprocessCompatibility\"],drilldownBreadcrumbs:[\"type\",Sa],drilldownCentering:[\"type\",Ca],drilldownOverlayBehavior:[\"type\",Da],subprocessCompatibility:[\"type\",ka]};function Na(e){Ur.call(this,e)}e(Na,Ur),Na.prototype._modules=[No,ko,ta,ca,Ba],Na.prototype._moddleExtensions={};var Oa=[\"c\",\"C\"],ja=[\"v\",\"V\"],La=[\"y\",\"Y\"],Ia=[\"z\",\"Z\"];function $a(e){return!e.altKey&&(e.ctrlKey||e.metaKey)}function Fa(e,t){return-1!==(e=p(e)?e:[e]).indexOf(t.key)||-1!==e.indexOf(t.code)}function za(e){return e.shiftKey}var Ha=\"keyboard.keydown\",Ga=\"input-handle-modified-keys\";function Va(e,t){var n=this;this._config=e||{},this._eventBus=t,this._keydownHandler=this._keydownHandler.bind(this),this._keyupHandler=this._keyupHandler.bind(this),t.on(\"diagram.destroy\",(function(){n._fire(\"destroy\"),n.unbind()})),t.on(\"diagram.init\",(function(){n._fire(\"init\")})),t.on(\"attach\",(function(){e&&e.bindTo&&n.bind(e.bindTo)})),t.on(\"detach\",(function(){n.unbind()}))}Va.$inject=[\"config.keyboard\",\"eventBus\"],Va.prototype._keydownHandler=function(e){this._keyHandler(e,Ha)},Va.prototype._keyupHandler=function(e){this._keyHandler(e,\"keyboard.keyup\")},Va.prototype._keyHandler=function(e,t){if(!this._isEventIgnored(e)){var n={keyEvent:e};this._eventBus.fire(t||Ha,n)&&e.preventDefault()}},Va.prototype._isEventIgnored=function(e){return!!e.defaultPrevented||(t=e.target)&&(J(t,\"input, textarea\")||\"true\"===t.contentEditable)&&this._isModifiedKeyIgnored(e);var t},Va.prototype._isModifiedKeyIgnored=function(e){return!$a(e)||-1===this._getAllowedModifiers(e.target).indexOf(e.key)},Va.prototype._getAllowedModifiers=function(e){var t=ee(e,\"[\"+Ga+\"]\",!0);return!t||this._node&&!this._node.contains(t)?[]:t.getAttribute(Ga).split(\",\")},Va.prototype.bind=function(e){this.unbind(),this._node=e,ae.bind(e,\"keydown\",this._keydownHandler),ae.bind(e,\"keyup\",this._keyupHandler),this._fire(\"bind\")},Va.prototype.getBinding=function(){return this._node},Va.prototype.unbind=function(){var e=this._node;e&&(this._fire(\"unbind\"),ae.unbind(e,\"keydown\",this._keydownHandler),ae.unbind(e,\"keyup\",this._keyupHandler)),this._node=null},Va.prototype._fire=function(e){this._eventBus.fire(\"keyboard.\"+e,{node:this._node})},Va.prototype.addListener=function(e,t,n){h(e)&&(n=t,t=e,e=1e3),this._eventBus.on(n||Ha,e,t)},Va.prototype.removeListener=function(e,t){this._eventBus.off(t||Ha,e)},Va.prototype.hasModifier=function(e){return e.ctrlKey||e.metaKey||e.shiftKey||e.altKey},Va.prototype.isCmd=$a,Va.prototype.isShift=za,Va.prototype.isKey=Fa;var Wa=500;function Ua(e,t){var n=this;e.on(\"editorActions.init\",Wa,(function(e){var i=e.editorActions;n.registerBindings(t,i)}))}Ua.$inject=[\"eventBus\",\"keyboard\"],Ua.prototype.registerBindings=function(e,t){function n(n,i){t.isRegistered(n)&&e.addListener(i)}n(\"undo\",(function(e){if(function(e){return $a(e)&&!za(e)&&Fa(Ia,e)}(e.keyEvent))return t.trigger(\"undo\"),!0})),n(\"redo\",(function(e){if(function(e){return $a(e)&&(Fa(La,e)||Fa(Ia,e)&&za(e))}(e.keyEvent))return t.trigger(\"redo\"),!0})),n(\"copy\",(function(e){if(function(e){return $a(e)&&Fa(Oa,e)}(e.keyEvent))return t.trigger(\"copy\"),!0})),n(\"paste\",(function(e){if(function(e){return $a(e)&&Fa(ja,e)}(e.keyEvent))return t.trigger(\"paste\"),!0})),n(\"stepZoom\",(function(e){var n=e.keyEvent;if(Fa([\"+\",\"Add\",\"=\"],n)&&$a(n))return t.trigger(\"stepZoom\",{value:1}),!0})),n(\"stepZoom\",(function(e){var n=e.keyEvent;if(Fa([\"-\",\"Subtract\"],n)&&$a(n))return t.trigger(\"stepZoom\",{value:-1}),!0})),n(\"zoom\",(function(e){var n=e.keyEvent;if(Fa(\"0\",n)&&$a(n))return t.trigger(\"zoom\",{value:1}),!0})),n(\"removeSelection\",(function(e){if(Fa([\"Backspace\",\"Delete\",\"Del\"],e.keyEvent))return t.trigger(\"removeSelection\"),!0}))};var qa={__init__:[\"keyboard\",\"keyboardBindings\"],keyboard:[\"type\",Va],keyboardBindings:[\"type\",Ua]},Ka={moveSpeed:50,moveSpeedAccelerated:200};function Ya(e,t,n){var i=this;this._config=L({},Ka,e||{}),t.addListener((function(e){var n=e.keyEvent,r=i._config;if(!t.isCmd(n))return;if(t.isKey([\"ArrowLeft\",\"Left\",\"ArrowUp\",\"Up\",\"ArrowDown\",\"Down\",\"ArrowRight\",\"Right\"],n)){var o,a=t.isShift(n)?r.moveSpeedAccelerated:r.moveSpeed;switch(n.key){case\"ArrowLeft\":case\"Left\":o=\"left\";break;case\"ArrowUp\":case\"Up\":o=\"up\";break;case\"ArrowRight\":case\"Right\":o=\"right\";break;case\"ArrowDown\":case\"Down\":o=\"down\"}return i.moveCanvas({speed:a,direction:o}),!0}})),this.moveCanvas=function(e){var t=0,i=0,r=e.speed/Math.min(Math.sqrt(n.viewbox().scale),1);switch(e.direction){case\"left\":t=r;break;case\"up\":i=r;break;case\"right\":t=-r;break;case\"down\":i=-r}n.scroll({dx:t,dy:i})}}Ya.$inject=[\"config.keyboardMove\",\"keyboard\",\"canvas\"];var Xa={__depends__:[qa],__init__:[\"keyboardMove\"],keyboardMove:[\"type\",Ya]},Za=/^djs-cursor-.*$/;function Qa(e){var t=X(document.body);t.removeMatching(Za),e&&t.add(\"djs-cursor-\"+e)}function Ja(){Qa(null)}var es=5e3;function ts(e,t){function n(){return!1}return t=t||\"element.click\",e.once(t,es,n),function(){e.off(t,n)}}function ns(e){return{x:e.x+e.width/2,y:e.y+e.height/2}}function is(e,t){return{x:e.x-t.x,y:e.y-t.y}}function rs(e,t){var n;function i(i){var r,o=n.start,a=n.button,s=Io(i),c=is(s,o);(!n.dragging&&(r=c,Math.sqrt(Math.pow(r.x,2)+Math.pow(r.y,2))>15)&&(n.dragging=!0,0===a&&ts(e),Qa(\"grab\")),n.dragging)&&(c=is(s,n.last||n.start),t.scroll({dx:c.x,dy:c.y}),n.last=s);i.preventDefault()}function r(e){ae.unbind(document,\"mousemove\",i),ae.unbind(document,\"mouseup\",r),n=null,Ja()}e.on(\"element.mousedown\",500,(function(e){return function(e){if(ee(e.target,\".djs-draggable\"))return;var t=e.button;if(t>=2||e.ctrlKey||e.shiftKey||e.altKey)return;return n={button:t,start:Io(e)},ae.bind(document,\"mousemove\",i),ae.bind(document,\"mouseup\",r),!0}(e.originalEvent)})),this.isActive=function(){return!!n}}rs.$inject=[\"eventBus\",\"canvas\"];var os={__init__:[\"moveCanvas\"],moveCanvas:[\"type\",rs]};function as(e){return Math.log(e)/Math.log(10)}function ss(e,t){var n=as(e.min),i=as(e.max);return(Math.abs(n)+Math.abs(i))/t}var cs=Math.sign||function(e){return e>=0?1:-1},ps={min:.2,max:4};function ls(e,t,n){e=e||{},this._enabled=!1,this._canvas=n,this._container=n._container,this._handleWheel=j(this._handleWheel,this),this._totalDelta=0,this._scale=e.scale||.75;var i=this;t.on(\"canvas.init\",(function(t){i._init(!1!==e.enabled)}))}ls.$inject=[\"config.zoomScroll\",\"eventBus\",\"canvas\"],ls.prototype.scroll=function(e){this._canvas.scroll(e)},ls.prototype.reset=function(){this._canvas.zoom(\"fit-viewport\")},ls.prototype.zoom=function(e,t){var n=ss(ps,20);this._totalDelta+=e,Math.abs(this._totalDelta)>.1&&(this._zoom(e,t,n),this._totalDelta=0)},ls.prototype._handleWheel=function(e){if(!ee(e.target,\".djs-scrollable\",!0)){var t=this._container;e.preventDefault();var n,i=e.ctrlKey,r=e.shiftKey,o=-1*this._scale;if(o*=i?0===e.deltaMode?.02:.32:0===e.deltaMode?1:16,i){var a=t.getBoundingClientRect(),s={x:e.clientX-a.left,y:e.clientY-a.top};n=Math.sqrt(Math.pow(e.deltaY,2)+Math.pow(e.deltaX,2))*cs(e.deltaY)*o,this.zoom(n,s)}else n=r?{dx:o*e.deltaY,dy:0}:{dx:o*e.deltaX,dy:o*e.deltaY},this.scroll(n)}},ls.prototype.stepZoom=function(e,t){var n=ss(ps,10);this._zoom(e,t,n)},ls.prototype._zoom=function(e,t,n){var i=this._canvas,r=e>0?1:-1,o=as(i.zoom()),a=Math.round(o/n)*n;a+=n*r;var s,c,p=Math.pow(10,a);i.zoom((s=ps,c=p,Math.max(s.min,Math.min(s.max,c))),t)},ls.prototype.toggle=function(e){var t=this._container,n=this._handleWheel,i=this._enabled;return void 0===e&&(e=!i),i!==e&&ae[e?\"bind\":\"unbind\"](t,\"wheel\",n,!1),this._enabled=e,e},ls.prototype._init=function(e){this.toggle(e)};var us={__init__:[\"zoomScroll\"],zoomScroll:[\"type\",ls]};function hs(e){Na.call(this,e)}e(hs,Na),hs.prototype._navigationModules=[Xa,os,us],hs.prototype._modules=[].concat(Na.prototype._modules,hs.prototype._navigationModules);var ds={exports:{}};\n/*! Hammer.JS - v2.0.7 - 2016-04-22\n   * http://hammerjs.github.io/\n   *\n   * Copyright (c) 2016 Jorik Tangelder;\n   * Licensed under the MIT license */!function(e){!function(t,n,i,r){var o,a=[\"\",\"webkit\",\"Moz\",\"MS\",\"ms\",\"o\"],s=n.createElement(\"div\"),c=\"function\",p=Math.round,l=Math.abs,u=Date.now;function h(e,t,n){return setTimeout(b(e,n),t)}function d(e,t,n){return!!Array.isArray(e)&&(f(e,n[t],n),!0)}function f(e,t,n){var i;if(e)if(e.forEach)e.forEach(t,n);else if(e.length!==r)for(i=0;i<e.length;)t.call(n,e[i],i,e),i++;else for(i in e)e.hasOwnProperty(i)&&t.call(n,e[i],i,e)}function m(e,n,i){var r=\"DEPRECATED METHOD: \"+n+\"\\n\"+i+\" AT \\n\";return function(){var n=new Error(\"get-stack-trace\"),i=n&&n.stack?n.stack.replace(/^[^\\(]+?[\\n$]/gm,\"\").replace(/^\\s+at\\s+/gm,\"\").replace(/^Object.<anonymous>\\s*\\(/gm,\"{anonymous}()@\"):\"Unknown Stack Trace\",o=t.console&&(t.console.warn||t.console.log);return o&&o.call(t.console,r,i),e.apply(this,arguments)}}o=\"function\"!=typeof Object.assign?function(e){if(e===r||null===e)throw new TypeError(\"Cannot convert undefined or null to object\");for(var t=Object(e),n=1;n<arguments.length;n++){var i=arguments[n];if(i!==r&&null!==i)for(var o in i)i.hasOwnProperty(o)&&(t[o]=i[o])}return t}:Object.assign;var v=m((function(e,t,n){for(var i=Object.keys(t),o=0;o<i.length;)(!n||n&&e[i[o]]===r)&&(e[i[o]]=t[i[o]]),o++;return e}),\"extend\",\"Use `assign`.\"),y=m((function(e,t){return v(e,t,!0)}),\"merge\",\"Use `assign`.\");function g(e,t,n){var i,r=t.prototype;(i=e.prototype=Object.create(r)).constructor=e,i._super=r,n&&o(i,n)}function b(e,t){return function(){return e.apply(t,arguments)}}function x(e,t){return typeof e==c?e.apply(t&&t[0]||r,t):e}function _(e,t){return e===r?t:e}function w(e,t,n){f(R(t),(function(t){e.addEventListener(t,n,!1)}))}function E(e,t,n){f(R(t),(function(t){e.removeEventListener(t,n,!1)}))}function S(e,t){for(;e;){if(e==t)return!0;e=e.parentNode}return!1}function C(e,t){return e.indexOf(t)>-1}function R(e){return e.trim().split(/\\s+/g)}function P(e,t,n){if(e.indexOf&&!n)return e.indexOf(t);for(var i=0;i<e.length;){if(n&&e[i][n]==t||!n&&e[i]===t)return i;i++}return-1}function T(e){return Array.prototype.slice.call(e,0)}function k(e,t,n){for(var i=[],r=[],o=0;o<e.length;){var a=t?e[o][t]:e[o];P(r,a)<0&&i.push(e[o]),r[o]=a,o++}return n&&(i=t?i.sort((function(e,n){return e[t]>n[t]})):i.sort()),i}function A(e,t){for(var n,i,o=t[0].toUpperCase()+t.slice(1),s=0;s<a.length;){if((i=(n=a[s])?n+o:t)in e)return i;s++}return r}var M=1;function D(e){var n=e.ownerDocument||e;return n.defaultView||n.parentWindow||t}var B=\"ontouchstart\"in t,N=A(t,\"PointerEvent\")!==r,O=B&&/mobile|tablet|ip(ad|hone|od)|android/i.test(navigator.userAgent),j=\"touch\",L=\"mouse\",I=25,$=1,F=4,z=8,H=1,G=2,V=4,W=8,U=16,q=G|V,K=W|U,Y=q|K,X=[\"x\",\"y\"],Z=[\"clientX\",\"clientY\"];function Q(e,t){var n=this;this.manager=e,this.callback=t,this.element=e.element,this.target=e.options.inputTarget,this.domHandler=function(t){x(e.options.enable,[e])&&n.handler(t)},this.init()}function J(e,t,n){var i=n.pointers.length,o=n.changedPointers.length,a=t&$&&i-o==0,s=t&(F|z)&&i-o==0;n.isFirst=!!a,n.isFinal=!!s,a&&(e.session={}),n.eventType=t,function(e,t){var n=e.session,i=t.pointers,o=i.length;n.firstInput||(n.firstInput=ee(t));o>1&&!n.firstMultiple?n.firstMultiple=ee(t):1===o&&(n.firstMultiple=!1);var a=n.firstInput,s=n.firstMultiple,c=s?s.center:a.center,p=t.center=te(i);t.timeStamp=u(),t.deltaTime=t.timeStamp-a.timeStamp,t.angle=oe(c,p),t.distance=re(c,p),function(e,t){var n=t.center,i=e.offsetDelta||{},r=e.prevDelta||{},o=e.prevInput||{};t.eventType!==$&&o.eventType!==F||(r=e.prevDelta={x:o.deltaX||0,y:o.deltaY||0},i=e.offsetDelta={x:n.x,y:n.y});t.deltaX=r.x+(n.x-i.x),t.deltaY=r.y+(n.y-i.y)}(n,t),t.offsetDirection=ie(t.deltaX,t.deltaY);var h=ne(t.deltaTime,t.deltaX,t.deltaY);t.overallVelocityX=h.x,t.overallVelocityY=h.y,t.overallVelocity=l(h.x)>l(h.y)?h.x:h.y,t.scale=s?(d=s.pointers,f=i,re(f[0],f[1],Z)/re(d[0],d[1],Z)):1,t.rotation=s?function(e,t){return oe(t[1],t[0],Z)+oe(e[1],e[0],Z)}(s.pointers,i):0,t.maxPointers=n.prevInput?t.pointers.length>n.prevInput.maxPointers?t.pointers.length:n.prevInput.maxPointers:t.pointers.length,function(e,t){var n,i,o,a,s=e.lastInterval||t,c=t.timeStamp-s.timeStamp;if(t.eventType!=z&&(c>I||s.velocity===r)){var p=t.deltaX-s.deltaX,u=t.deltaY-s.deltaY,h=ne(c,p,u);i=h.x,o=h.y,n=l(h.x)>l(h.y)?h.x:h.y,a=ie(p,u),e.lastInterval=t}else n=s.velocity,i=s.velocityX,o=s.velocityY,a=s.direction;t.velocity=n,t.velocityX=i,t.velocityY=o,t.direction=a}(n,t);var d,f;var m=e.element;S(t.srcEvent.target,m)&&(m=t.srcEvent.target);t.target=m}(e,n),e.emit(\"hammer.input\",n),e.recognize(n),e.session.prevInput=n}function ee(e){for(var t=[],n=0;n<e.pointers.length;)t[n]={clientX:p(e.pointers[n].clientX),clientY:p(e.pointers[n].clientY)},n++;return{timeStamp:u(),pointers:t,center:te(t),deltaX:e.deltaX,deltaY:e.deltaY}}function te(e){var t=e.length;if(1===t)return{x:p(e[0].clientX),y:p(e[0].clientY)};for(var n=0,i=0,r=0;r<t;)n+=e[r].clientX,i+=e[r].clientY,r++;return{x:p(n/t),y:p(i/t)}}function ne(e,t,n){return{x:t/e||0,y:n/e||0}}function ie(e,t){return e===t?H:l(e)>=l(t)?e<0?G:V:t<0?W:U}function re(e,t,n){n||(n=X);var i=t[n[0]]-e[n[0]],r=t[n[1]]-e[n[1]];return Math.sqrt(i*i+r*r)}function oe(e,t,n){n||(n=X);var i=t[n[0]]-e[n[0]],r=t[n[1]]-e[n[1]];return 180*Math.atan2(r,i)/Math.PI}Q.prototype={handler:function(){},init:function(){this.evEl&&w(this.element,this.evEl,this.domHandler),this.evTarget&&w(this.target,this.evTarget,this.domHandler),this.evWin&&w(D(this.element),this.evWin,this.domHandler)},destroy:function(){this.evEl&&E(this.element,this.evEl,this.domHandler),this.evTarget&&E(this.target,this.evTarget,this.domHandler),this.evWin&&E(D(this.element),this.evWin,this.domHandler)}};var ae={mousedown:$,mousemove:2,mouseup:F},se=\"mousedown\",ce=\"mousemove mouseup\";function pe(){this.evEl=se,this.evWin=ce,this.pressed=!1,Q.apply(this,arguments)}g(pe,Q,{handler:function(e){var t=ae[e.type];t&$&&0===e.button&&(this.pressed=!0),2&t&&1!==e.which&&(t=F),this.pressed&&(t&F&&(this.pressed=!1),this.callback(this.manager,t,{pointers:[e],changedPointers:[e],pointerType:L,srcEvent:e}))}});var le={pointerdown:$,pointermove:2,pointerup:F,pointercancel:z,pointerout:z},ue={2:j,3:\"pen\",4:L,5:\"kinect\"},he=\"pointerdown\",de=\"pointermove pointerup pointercancel\";function fe(){this.evEl=he,this.evWin=de,Q.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}t.MSPointerEvent&&!t.PointerEvent&&(he=\"MSPointerDown\",de=\"MSPointerMove MSPointerUp MSPointerCancel\"),g(fe,Q,{handler:function(e){var t=this.store,n=!1,i=e.type.toLowerCase().replace(\"ms\",\"\"),r=le[i],o=ue[e.pointerType]||e.pointerType,a=o==j,s=P(t,e.pointerId,\"pointerId\");r&$&&(0===e.button||a)?s<0&&(t.push(e),s=t.length-1):r&(F|z)&&(n=!0),s<0||(t[s]=e,this.callback(this.manager,r,{pointers:t,changedPointers:[e],pointerType:o,srcEvent:e}),n&&t.splice(s,1))}});var me={touchstart:$,touchmove:2,touchend:F,touchcancel:z};function ve(){this.evTarget=\"touchstart\",this.evWin=\"touchstart touchmove touchend touchcancel\",this.started=!1,Q.apply(this,arguments)}function ye(e,t){var n=T(e.touches),i=T(e.changedTouches);return t&(F|z)&&(n=k(n.concat(i),\"identifier\",!0)),[n,i]}g(ve,Q,{handler:function(e){var t=me[e.type];if(t===$&&(this.started=!0),this.started){var n=ye.call(this,e,t);t&(F|z)&&n[0].length-n[1].length==0&&(this.started=!1),this.callback(this.manager,t,{pointers:n[0],changedPointers:n[1],pointerType:j,srcEvent:e})}}});var ge={touchstart:$,touchmove:2,touchend:F,touchcancel:z},be=\"touchstart touchmove touchend touchcancel\";function xe(){this.evTarget=be,this.targetIds={},Q.apply(this,arguments)}function _e(e,t){var n=T(e.touches),i=this.targetIds;if(t&(2|$)&&1===n.length)return i[n[0].identifier]=!0,[n,n];var r,o,a=T(e.changedTouches),s=[],c=this.target;if(o=n.filter((function(e){return S(e.target,c)})),t===$)for(r=0;r<o.length;)i[o[r].identifier]=!0,r++;for(r=0;r<a.length;)i[a[r].identifier]&&s.push(a[r]),t&(F|z)&&delete i[a[r].identifier],r++;return s.length?[k(o.concat(s),\"identifier\",!0),s]:void 0}g(xe,Q,{handler:function(e){var t=ge[e.type],n=_e.call(this,e,t);n&&this.callback(this.manager,t,{pointers:n[0],changedPointers:n[1],pointerType:j,srcEvent:e})}});var we=2500;function Ee(){Q.apply(this,arguments);var e=b(this.handler,this);this.touch=new xe(this.manager,e),this.mouse=new pe(this.manager,e),this.primaryTouch=null,this.lastTouches=[]}function Se(e,t){e&$?(this.primaryTouch=t.changedPointers[0].identifier,Ce.call(this,t)):e&(F|z)&&Ce.call(this,t)}function Ce(e){var t=e.changedPointers[0];if(t.identifier===this.primaryTouch){var n={x:t.clientX,y:t.clientY};this.lastTouches.push(n);var i=this.lastTouches;setTimeout((function(){var e=i.indexOf(n);e>-1&&i.splice(e,1)}),we)}}function Re(e){for(var t=e.srcEvent.clientX,n=e.srcEvent.clientY,i=0;i<this.lastTouches.length;i++){var r=this.lastTouches[i],o=Math.abs(t-r.x),a=Math.abs(n-r.y);if(o<=25&&a<=25)return!0}return!1}g(Ee,Q,{handler:function(e,t,n){var i=n.pointerType==j,r=n.pointerType==L;if(!(r&&n.sourceCapabilities&&n.sourceCapabilities.firesTouchEvents)){if(i)Se.call(this,t,n);else if(r&&Re.call(this,n))return;this.callback(e,t,n)}},destroy:function(){this.touch.destroy(),this.mouse.destroy()}});var Pe=A(s.style,\"touchAction\"),Te=Pe!==r,ke=\"compute\",Ae=\"auto\",Me=\"manipulation\",De=\"none\",Be=\"pan-x\",Ne=\"pan-y\",Oe=function(){if(!Te)return!1;var e={},n=t.CSS&&t.CSS.supports;return[\"auto\",\"manipulation\",\"pan-y\",\"pan-x\",\"pan-x pan-y\",\"none\"].forEach((function(i){e[i]=!n||t.CSS.supports(\"touch-action\",i)})),e}();function je(e,t){this.manager=e,this.set(t)}je.prototype={set:function(e){e==ke&&(e=this.compute()),Te&&this.manager.element.style&&Oe[e]&&(this.manager.element.style[Pe]=e),this.actions=e.toLowerCase().trim()},update:function(){this.set(this.manager.options.touchAction)},compute:function(){var e=[];return f(this.manager.recognizers,(function(t){x(t.options.enable,[t])&&(e=e.concat(t.getTouchAction()))})),function(e){if(C(e,De))return De;var t=C(e,Be),n=C(e,Ne);if(t&&n)return De;if(t||n)return t?Be:Ne;if(C(e,Me))return Me;return Ae}(e.join(\" \"))},preventDefaults:function(e){var t=e.srcEvent,n=e.offsetDirection;if(this.manager.session.prevented)t.preventDefault();else{var i=this.actions,r=C(i,De)&&!Oe[De],o=C(i,Ne)&&!Oe[Ne],a=C(i,Be)&&!Oe[Be];if(r){var s=1===e.pointers.length,c=e.distance<2,p=e.deltaTime<250;if(s&&c&&p)return}if(!a||!o)return r||o&&n&q||a&&n&K?this.preventSrc(t):void 0}},preventSrc:function(e){this.manager.session.prevented=!0,e.preventDefault()}};var Le=1,Ie=32;function $e(e){this.options=o({},this.defaults,e||{}),this.id=M++,this.manager=null,this.options.enable=_(this.options.enable,!0),this.state=Le,this.simultaneous={},this.requireFail=[]}function Fe(e){return 16&e?\"cancel\":8&e?\"end\":4&e?\"move\":2&e?\"start\":\"\"}function ze(e){return e==U?\"down\":e==W?\"up\":e==G?\"left\":e==V?\"right\":\"\"}function He(e,t){var n=t.manager;return n?n.get(e):e}function Ge(){$e.apply(this,arguments)}function Ve(){Ge.apply(this,arguments),this.pX=null,this.pY=null}function We(){Ge.apply(this,arguments)}function Ue(){$e.apply(this,arguments),this._timer=null,this._input=null}function qe(){Ge.apply(this,arguments)}function Ke(){Ge.apply(this,arguments)}function Ye(){$e.apply(this,arguments),this.pTime=!1,this.pCenter=!1,this._timer=null,this._input=null,this.count=0}function Xe(e,t){return(t=t||{}).recognizers=_(t.recognizers,Xe.defaults.preset),new Ze(e,t)}$e.prototype={defaults:{},set:function(e){return o(this.options,e),this.manager&&this.manager.touchAction.update(),this},recognizeWith:function(e){if(d(e,\"recognizeWith\",this))return this;var t=this.simultaneous;return t[(e=He(e,this)).id]||(t[e.id]=e,e.recognizeWith(this)),this},dropRecognizeWith:function(e){return d(e,\"dropRecognizeWith\",this)||(e=He(e,this),delete this.simultaneous[e.id]),this},requireFailure:function(e){if(d(e,\"requireFailure\",this))return this;var t=this.requireFail;return-1===P(t,e=He(e,this))&&(t.push(e),e.requireFailure(this)),this},dropRequireFailure:function(e){if(d(e,\"dropRequireFailure\",this))return this;e=He(e,this);var t=P(this.requireFail,e);return t>-1&&this.requireFail.splice(t,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(e){return!!this.simultaneous[e.id]},emit:function(e){var t=this,n=this.state;function i(n){t.manager.emit(n,e)}n<8&&i(t.options.event+Fe(n)),i(t.options.event),e.additionalEvent&&i(e.additionalEvent),n>=8&&i(t.options.event+Fe(n))},tryEmit:function(e){if(this.canEmit())return this.emit(e);this.state=Ie},canEmit:function(){for(var e=0;e<this.requireFail.length;){if(!(this.requireFail[e].state&(Ie|Le)))return!1;e++}return!0},recognize:function(e){var t=o({},e);if(!x(this.options.enable,[this,t]))return this.reset(),void(this.state=Ie);56&this.state&&(this.state=Le),this.state=this.process(t),30&this.state&&this.tryEmit(t)},process:function(e){},getTouchAction:function(){},reset:function(){}},g(Ge,$e,{defaults:{pointers:1},attrTest:function(e){var t=this.options.pointers;return 0===t||e.pointers.length===t},process:function(e){var t=this.state,n=e.eventType,i=6&t,r=this.attrTest(e);return i&&(n&z||!r)?16|t:i||r?n&F?8|t:2&t?4|t:2:Ie}}),g(Ve,Ge,{defaults:{event:\"pan\",threshold:10,pointers:1,direction:Y},getTouchAction:function(){var e=this.options.direction,t=[];return e&q&&t.push(Ne),e&K&&t.push(Be),t},directionTest:function(e){var t=this.options,n=!0,i=e.distance,r=e.direction,o=e.deltaX,a=e.deltaY;return r&t.direction||(t.direction&q?(r=0===o?H:o<0?G:V,n=o!=this.pX,i=Math.abs(e.deltaX)):(r=0===a?H:a<0?W:U,n=a!=this.pY,i=Math.abs(e.deltaY))),e.direction=r,n&&i>t.threshold&&r&t.direction},attrTest:function(e){return Ge.prototype.attrTest.call(this,e)&&(2&this.state||!(2&this.state)&&this.directionTest(e))},emit:function(e){this.pX=e.deltaX,this.pY=e.deltaY;var t=ze(e.direction);t&&(e.additionalEvent=this.options.event+t),this._super.emit.call(this,e)}}),g(We,Ge,{defaults:{event:\"pinch\",threshold:0,pointers:2},getTouchAction:function(){return[De]},attrTest:function(e){return this._super.attrTest.call(this,e)&&(Math.abs(e.scale-1)>this.options.threshold||2&this.state)},emit:function(e){if(1!==e.scale){var t=e.scale<1?\"in\":\"out\";e.additionalEvent=this.options.event+t}this._super.emit.call(this,e)}}),g(Ue,$e,{defaults:{event:\"press\",pointers:1,time:251,threshold:9},getTouchAction:function(){return[Ae]},process:function(e){var t=this.options,n=e.pointers.length===t.pointers,i=e.distance<t.threshold,r=e.deltaTime>t.time;if(this._input=e,!i||!n||e.eventType&(F|z)&&!r)this.reset();else if(e.eventType&$)this.reset(),this._timer=h((function(){this.state=8,this.tryEmit()}),t.time,this);else if(e.eventType&F)return 8;return Ie},reset:function(){clearTimeout(this._timer)},emit:function(e){8===this.state&&(e&&e.eventType&F?this.manager.emit(this.options.event+\"up\",e):(this._input.timeStamp=u(),this.manager.emit(this.options.event,this._input)))}}),g(qe,Ge,{defaults:{event:\"rotate\",threshold:0,pointers:2},getTouchAction:function(){return[De]},attrTest:function(e){return this._super.attrTest.call(this,e)&&(Math.abs(e.rotation)>this.options.threshold||2&this.state)}}),g(Ke,Ge,{defaults:{event:\"swipe\",threshold:10,velocity:.3,direction:q|K,pointers:1},getTouchAction:function(){return Ve.prototype.getTouchAction.call(this)},attrTest:function(e){var t,n=this.options.direction;return n&(q|K)?t=e.overallVelocity:n&q?t=e.overallVelocityX:n&K&&(t=e.overallVelocityY),this._super.attrTest.call(this,e)&&n&e.offsetDirection&&e.distance>this.options.threshold&&e.maxPointers==this.options.pointers&&l(t)>this.options.velocity&&e.eventType&F},emit:function(e){var t=ze(e.offsetDirection);t&&this.manager.emit(this.options.event+t,e),this.manager.emit(this.options.event,e)}}),g(Ye,$e,{defaults:{event:\"tap\",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},getTouchAction:function(){return[Me]},process:function(e){var t=this.options,n=e.pointers.length===t.pointers,i=e.distance<t.threshold,r=e.deltaTime<t.time;if(this.reset(),e.eventType&$&&0===this.count)return this.failTimeout();if(i&&r&&n){if(e.eventType!=F)return this.failTimeout();var o=!this.pTime||e.timeStamp-this.pTime<t.interval,a=!this.pCenter||re(this.pCenter,e.center)<t.posThreshold;if(this.pTime=e.timeStamp,this.pCenter=e.center,a&&o?this.count+=1:this.count=1,this._input=e,0===this.count%t.taps)return this.hasRequireFailures()?(this._timer=h((function(){this.state=8,this.tryEmit()}),t.interval,this),2):8}return Ie},failTimeout:function(){return this._timer=h((function(){this.state=Ie}),this.options.interval,this),Ie},reset:function(){clearTimeout(this._timer)},emit:function(){8==this.state&&(this._input.tapCount=this.count,this.manager.emit(this.options.event,this._input))}}),Xe.VERSION=\"2.0.7\",Xe.defaults={domEvents:!1,touchAction:ke,enable:!0,inputTarget:null,inputClass:null,preset:[[qe,{enable:!1}],[We,{enable:!1},[\"rotate\"]],[Ke,{direction:q}],[Ve,{direction:q},[\"swipe\"]],[Ye],[Ye,{event:\"doubletap\",taps:2},[\"tap\"]],[Ue]],cssProps:{userSelect:\"none\",touchSelect:\"none\",touchCallout:\"none\",contentZooming:\"none\",userDrag:\"none\",tapHighlightColor:\"rgba(0,0,0,0)\"}};function Ze(e,t){var n;this.options=o({},Xe.defaults,t||{}),this.options.inputTarget=this.options.inputTarget||e,this.handlers={},this.session={},this.recognizers=[],this.oldCssProps={},this.element=e,this.input=new((n=this).options.inputClass||(N?fe:O?xe:B?Ee:pe))(n,J),this.touchAction=new je(this,this.options.touchAction),Qe(this,!0),f(this.options.recognizers,(function(e){var t=this.add(new e[0](e[1]));e[2]&&t.recognizeWith(e[2]),e[3]&&t.requireFailure(e[3])}),this)}function Qe(e,t){var n,i=e.element;i.style&&(f(e.options.cssProps,(function(r,o){n=A(i.style,o),t?(e.oldCssProps[n]=i.style[n],i.style[n]=r):i.style[n]=e.oldCssProps[n]||\"\"})),t||(e.oldCssProps={}))}Ze.prototype={set:function(e){return o(this.options,e),e.touchAction&&this.touchAction.update(),e.inputTarget&&(this.input.destroy(),this.input.target=e.inputTarget,this.input.init()),this},stop:function(e){this.session.stopped=e?2:1},recognize:function(e){var t=this.session;if(!t.stopped){var n;this.touchAction.preventDefaults(e);var i=this.recognizers,r=t.curRecognizer;(!r||r&&8&r.state)&&(r=t.curRecognizer=null);for(var o=0;o<i.length;)n=i[o],2===t.stopped||r&&n!=r&&!n.canRecognizeWith(r)?n.reset():n.recognize(e),!r&&14&n.state&&(r=t.curRecognizer=n),o++}},get:function(e){if(e instanceof $e)return e;for(var t=this.recognizers,n=0;n<t.length;n++)if(t[n].options.event==e)return t[n];return null},add:function(e){if(d(e,\"add\",this))return this;var t=this.get(e.options.event);return t&&this.remove(t),this.recognizers.push(e),e.manager=this,this.touchAction.update(),e},remove:function(e){if(d(e,\"remove\",this))return this;if(e=this.get(e)){var t=this.recognizers,n=P(t,e);-1!==n&&(t.splice(n,1),this.touchAction.update())}return this},on:function(e,t){if(e!==r&&t!==r){var n=this.handlers;return f(R(e),(function(e){n[e]=n[e]||[],n[e].push(t)})),this}},off:function(e,t){if(e!==r){var n=this.handlers;return f(R(e),(function(e){t?n[e]&&n[e].splice(P(n[e],t),1):delete n[e]})),this}},emit:function(e,t){this.options.domEvents&&function(e,t){var i=n.createEvent(\"Event\");i.initEvent(e,!0,!0),i.gesture=t,t.target.dispatchEvent(i)}(e,t);var i=this.handlers[e]&&this.handlers[e].slice();if(i&&i.length){t.type=e,t.preventDefault=function(){t.srcEvent.preventDefault()};for(var r=0;r<i.length;)i[r](t),r++}},destroy:function(){this.element&&Qe(this,!1),this.handlers={},this.session={},this.input.destroy(),this.element=null}},o(Xe,{INPUT_START:$,INPUT_MOVE:2,INPUT_END:F,INPUT_CANCEL:z,STATE_POSSIBLE:Le,STATE_BEGAN:2,STATE_CHANGED:4,STATE_ENDED:8,STATE_RECOGNIZED:8,STATE_CANCELLED:16,STATE_FAILED:Ie,DIRECTION_NONE:H,DIRECTION_LEFT:G,DIRECTION_RIGHT:V,DIRECTION_UP:W,DIRECTION_DOWN:U,DIRECTION_HORIZONTAL:q,DIRECTION_VERTICAL:K,DIRECTION_ALL:Y,Manager:Ze,Input:Q,TouchAction:je,TouchInput:xe,MouseInput:pe,PointerEventInput:fe,TouchMouseInput:Ee,SingleTouchInput:ve,Recognizer:$e,AttrRecognizer:Ge,Tap:Ye,Pan:Ve,Swipe:Ke,Pinch:We,Rotate:qe,Press:Ue,on:w,off:E,each:f,merge:y,extend:v,assign:o,inherit:g,bindFn:b,prefixed:A}),(void 0!==t?t:\"undefined\"!=typeof self?self:{}).Hammer=Xe,\"function\"==typeof r&&r.amd?r((function(){return Xe})):e.exports?e.exports=Xe:t.Hammer=Xe}(window,document)}(ds);var fs=Dt(ds.exports),ms=[\"mousedown\",\"mouseup\",\"mouseover\",\"mouseout\",\"click\",\"dblclick\"];function vs(e,t){return t.get(e,!1)}function ys(e){e.preventDefault(),\"function\"==typeof e.stopPropagation?e.stopPropagation():e.srcEvent&&\"function\"==typeof e.srcEvent.stopPropagation&&e.srcEvent.stopPropagation(),\"function\"==typeof e.stopImmediatePropagation&&e.stopImmediatePropagation()}function gs(e){function t(t){setTimeout((function(){g(ms,(function(t){ae.unbind(e,t,ys,!0)}))}),500)}ae.bind(e,\"touchstart\",(function(t){g(ms,(function(t){ae.bind(e,t,ys,!0)}))}),!0),ae.bind(e,\"touchend\",t,!0),ae.bind(e,\"touchcancel\",t,!0);var n=new fs.Manager(e,{inputClass:fs.TouchInput,recognizers:[],domEvents:!0}),i=new fs.Tap,r=new fs.Pan({threshold:10}),o=new fs.Press,a=new fs.Pinch,s=new fs.Tap({event:\"doubletap\",taps:2});return a.requireFailure(r),a.requireFailure(o),n.add([r,o,a,s,i]),n.reset=function(e){var t=this.recognizers,i=this.session;i.stopped||(n.stop(e),setTimeout((function(){var e,n;for(e=0;n=t[e];e++)n.reset(),n.state=8;i.curRecognizer=null}),0))},n.on(\"hammer.input\",(function(e){e.srcEvent.defaultPrevented&&n.reset(!0)})),n}function bs(e,t,n,i,r){var o,a=vs(\"dragging\",e),s=vs(\"move\",e),c=vs(\"contextPad\",e),p=vs(\"palette\",e);function l(e,t){return function(n){var o=u(n.target),a=o&&i.get(o);return t&&(n.srcEvent.button=t),r.fire(e,n,a)}}function u(e){return ee(e,\"svg, .djs-element\",!0)}function h(e){function n(e){var n=u(e.target),r=n&&i.get(n);if(s&&t.getRootElement()!==r)return s.start(e,r,!0);!function(e){var n=0,i=0;function r(e){var r=e.deltaX-n,o=e.deltaY-i;t.scroll({dx:r,dy:o}),n=e.deltaX,i=e.deltaY}function a(e){o.off(\"panmove\",r),o.off(\"panend\",a),o.off(\"pancancel\",a)}o.on(\"panmove\",r),o.on(\"panend\",a),o.on(\"pancancel\",a)}()}(o=gs(e)).on(\"tap\",l(\"element.click\")),o.on(\"doubletap\",l(\"element.dblclick\",1)),o.on(\"panstart\",n),o.on(\"press\",n),o.on(\"pinchstart\",(function(e){var n=t.zoom(),i=e.center;function r(e){var r=1-(1-e.scale)/1.5,o=Math.max(.2,Math.min(4,r*n));t.zoom(o,i),ys(e)}function a(e){o.off(\"pinchmove\",r),o.off(\"pinchend\",a),o.off(\"pinchcancel\",a),o.reset(!0)}o.on(\"pinchmove\",r),o.on(\"pinchend\",a),o.on(\"pinchcancel\",a)}))}a&&n.on(\"drag.move\",(function(e){var t=e.originalEvent;if(t&&!(t instanceof MouseEvent)){var n=Io(t),r=u(document.elementFromPoint(n.x,n.y)),o=r&&i.get(r);o!==e.hover&&(e.hover&&a.out(e),o&&(a.hover({element:o,gfx:r}),e.hover=o,e.hoverGfx=r))}})),c&&n.on(\"contextPad.create\",(function(e){var t=gs(e.pad.html);t.on(\"panstart\",(function(e){c.trigger(\"dragstart\",e,!0)})),t.on(\"press\",(function(e){c.trigger(\"dragstart\",e,!0)})),t.on(\"tap\",(function(e){c.trigger(\"click\",e)}))})),p&&n.on(\"palette.create\",(function(e){var t=gs(e.container);t.on(\"panstart\",(function(e){p.trigger(\"dragstart\",e,!0)})),t.on(\"press\",(function(e){p.trigger(\"dragstart\",e,!0)})),t.on(\"tap\",(function(e){p.trigger(\"click\",e)}))})),n.on(\"canvas.init\",(function(e){h(e.svg)}))}function xs(e){var t=this;e.on(\"canvas.init\",(function(e){t.addBBoxMarker(e.svg)}))}bs.$inject=[\"injector\",\"canvas\",\"eventBus\",\"elementRegistry\",\"interactionEvents\",\"touchFix\"],xs.$inject=[\"eventBus\"],xs.prototype.addBBoxMarker=function(e){var t={fill:\"none\",class:\"outer-bound-marker\"},n=De(\"rect\");we(n,{x:-1e4,y:1e4,width:10,height:10}),we(n,t),ge(e,n);var i=De(\"rect\");we(i,{x:1e4,y:1e4,width:10,height:10}),we(i,t),ge(e,i)};var _s={__depends__:[{__depends__:[Uo],__init__:[\"touchInteractionEvents\"],touchInteractionEvents:[\"type\",bs],touchFix:[\"type\",xs]}]};function ws(e){return e&&e[e.length-1]}function Es(e){return e.y}function Ss(e){return e.x}var Cs={left:Ss,center:Ss,right:function(e){return e.x+e.width},top:Es,middle:Es,bottom:function(e){return e.y+e.height}};function Rs(e,t){this._modeling=e,this._rules=t}Rs.$inject=[\"modeling\",\"rules\"],Rs.prototype._getOrientationDetails=function(e){var t=\"x\",n=\"width\";return-1!==[\"top\",\"bottom\",\"middle\"].indexOf(e)&&(t=\"y\",n=\"height\"),{axis:t,dimension:n}},Rs.prototype._isType=function(e,t){return-1!==t.indexOf(e)},Rs.prototype._alignmentPosition=function(e,t){var n,i,r,o=this._getOrientationDetails(e),a=o.axis,s=o.dimension,c={},p={},l=!1;if(this._isType(e,[\"left\",\"top\"]))c[e]=t[0][a];else if(this._isType(e,[\"right\",\"bottom\"]))r=ws(t),c[e]=r[a]+r[s];else if(this._isType(e,[\"center\",\"middle\"])){if(g(t,(function(e){var t=e[a]+Math.round(e[s]/2);p[t]?p[t].elements.push(e):p[t]={elements:[e],center:t}})),n=k(p,(function(e){return e.elements.length>1&&(l=!0),e.elements.length})),l)return c[e]=ws(n).center,c;i=t[0],r=ws(t=k(t,(function(e){return e[a]+e[s]}))),c[e]=function(e,t){return Math.round((e[a]+t[a]+t[s])/2)}(i,r)}return c},Rs.prototype.trigger=function(e,t){var n,i=this._modeling,r=y(e,(function(e){return!(e.waypoints||e.host||e.labelTarget)}));if(p(n=this._rules.allowed(\"elements.align\",{elements:r}))&&(r=n),!(r.length<2)&&n){var o=k(r,Cs[t]),a=this._alignmentPosition(t,o);i.alignElements(o,a)}};var Ps={__init__:[\"alignElements\"],alignElements:[\"type\",Rs]},Ts=\".entry\";function ks(e,t,n,i){this._canvas=e,this._eventBus=n,this._overlays=i;var r=s(t&&t.scale)?t.scale:{min:1,max:1.5};this._overlaysConfig={scale:r},this._current=null,this._init()}function As(e,t){return-1!==e.indexOf(t)}ks.$inject=[\"canvas\",\"config.contextPad\",\"eventBus\",\"overlays\"],ks.prototype._init=function(){var e=this;this._eventBus.on(\"selection.changed\",(function(t){var n=t.newSelection,i=n.length?1===n.length?n[0]:n:null;i?e.open(i,!0):e.close()})),this._eventBus.on(\"elements.changed\",(function(t){var n=t.elements,i=e._current;if(i){var r=i.target;w(p(r)?r:[r],(function(e){return As(n,e)}))&&e.open(r,!0)}}))},ks.prototype.registerProvider=function(e,t){t||(t=e,e=1e3),this._eventBus.on(\"contextPad.getProviders\",e,(function(e){e.providers.push(t)}))},ks.prototype.getEntries=function(e){var t=this._getProviders(),n=p(e)?\"getMultiElementContextPadEntries\":\"getContextPadEntries\",i={};return g(t,(function(t){if(h(t[n])){var r=t[n](e);h(r)?i=r(i):g(r,(function(e,t){i[t]=e}))}})),i},ks.prototype.trigger=function(e,t,n){var i,r,o=t.delegateTarget||t.target;return o?(i=K(o,\"data-action\"),r=t.originalEvent||t,this.triggerEntry(i,e,r,n)):t.preventDefault()},ks.prototype.triggerEntry=function(e,t,n,i){if(this.isShown()){var r=this._current.target,o=this._current.entries[e];if(o){var a=o.action;if(!1!==this._eventBus.fire(\"contextPad.trigger\",{entry:o,event:n})){if(h(a)){if(\"click\"===t)return a(n,r,i)}else if(a[t])return a[t](n,r,i);n.preventDefault()}}}},ks.prototype.open=function(e,t){!t&&this.isOpen(e)||(this.close(),this._updateAndOpen(e))},ks.prototype._getProviders=function(){var e=this._eventBus.createEvent({type:\"contextPad.getProviders\",providers:[]});return this._eventBus.fire(e),e.providers},ks.prototype._updateAndOpen=function(e){var t,n=this.getEntries(e),i=this.getPad(e),r=i.html;g(n,(function(e,n){var i,o=e.group||\"default\",a=de(e.html||'<div class=\"entry\" draggable=\"true\"></div>');K(a,\"data-action\",n),(i=fe(\"[data-group=\"+ma(o)+\"]\",r))||(K(i=de('<div class=\"group\"></div>'),\"data-group\",o),r.appendChild(i)),i.appendChild(a),e.className&&function(e,t){var n=X(e);(t=p(t)?t:t.split(/\\s+/g)).forEach((function(e){n.add(e)}))}(a,e.className),e.title&&K(a,\"title\",e.title),e.imageUrl&&(K(t=de(\"<img>\"),\"src\",e.imageUrl),t.style.width=\"100%\",t.style.height=\"100%\",a.appendChild(t))})),X(r).add(\"open\"),this._current={target:e,entries:n,pad:i},this._eventBus.fire(\"contextPad.open\",{current:this._current})},ks.prototype.getPad=function(e){if(this.isOpen())return this._current.pad;var t=this,n=this._overlays,i=de('<div class=\"djs-context-pad\"></div>'),r=this._getPosition(e),o=L({html:i},this._overlaysConfig,r);pe.bind(i,Ts,\"click\",(function(e){t.trigger(\"click\",e)})),pe.bind(i,Ts,\"dragstart\",(function(e){t.trigger(\"dragstart\",e)})),ae.bind(i,\"mousedown\",(function(e){e.stopPropagation()}));var a=this._canvas.getRootElement();this._overlayId=n.add(a,\"context-pad\",o);var s=n.get(this._overlayId);return this._eventBus.fire(\"contextPad.create\",{target:e,pad:s}),s},ks.prototype.close=function(){this.isOpen()&&(this._overlays.remove(this._overlayId),this._overlayId=null,this._eventBus.fire(\"contextPad.close\",{current:this._current}),this._current=null)},ks.prototype.isOpen=function(e){var t=this._current;if(!t)return!1;if(!e)return!0;var n=t.target;return p(e)===p(n)&&(p(e)?e.length===n.length&&_(e,(function(e){return As(n,e)})):n===e)},ks.prototype.isShown=function(){return this.isOpen()&&this._overlays.isShown()},ks.prototype._getPosition=function(e){var t=vt(p(e)?e:[e]);return{position:{left:t.x+t.width+12,top:t.y-6}}};var Ms,Ds,Bs,Ns,Os,js={__depends__:[Uo,ca],contextPad:[\"type\",ks]},Ls={},Is=[],$s=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function Fs(e,t){for(var n in t)e[n]=t[n];return e}function zs(e){var t=e.parentNode;t&&t.removeChild(e)}function Hs(e,t,n){var i,r,o,a={};for(o in t)\"key\"==o?i=t[o]:\"ref\"==o?r=t[o]:a[o]=t[o];if(arguments.length>2&&(a.children=arguments.length>3?Ms.call(arguments,2):n),\"function\"==typeof e&&null!=e.defaultProps)for(o in e.defaultProps)void 0===a[o]&&(a[o]=e.defaultProps[o]);return Gs(e,a,i,r,null)}function Gs(e,t,n,i,r){var o={type:e,props:t,key:n,ref:i,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==r?++Bs:r};return null==r&&null!=Ds.vnode&&Ds.vnode(o),o}function Vs(e){return e.children}function Ws(e,t){this.props=e,this.context=t}function Us(e,t){if(null==t)return e.__?Us(e.__,e.__.__k.indexOf(e)+1):null;for(var n;t<e.__k.length;t++)if(null!=(n=e.__k[t])&&null!=n.__e)return n.__e;return\"function\"==typeof e.type?Us(e):null}function qs(e){var t,n;if(null!=(e=e.__)&&null!=e.__c){for(e.__e=e.__c.base=null,t=0;t<e.__k.length;t++)if(null!=(n=e.__k[t])&&null!=n.__e){e.__e=e.__c.base=n.__e;break}return qs(e)}}function Ks(e){(!e.__d&&(e.__d=!0)&&Ns.push(e)&&!Ys.__r++||Os!==Ds.debounceRendering)&&((Os=Ds.debounceRendering)||setTimeout)(Ys)}function Ys(){for(var e;Ys.__r=Ns.length;)e=Ns.sort((function(e,t){return e.__v.__b-t.__v.__b})),Ns=[],e.some((function(e){var t,n,i,r,o,a;e.__d&&(o=(r=(t=e).__v).__e,(a=t.__P)&&(n=[],(i=Fs({},r)).__v=r.__v+1,ic(a,r,i,t.__n,void 0!==a.ownerSVGElement,null!=r.__h?[o]:null,n,null==o?Us(r):o,r.__h),rc(n,r),r.__e!=o&&qs(r)))}))}function Xs(e,t,n,i,r,o,a,s,c,p){var l,u,h,d,f,m,v,y=i&&i.__k||Is,g=y.length;for(n.__k=[],l=0;l<t.length;l++)if(null!=(d=n.__k[l]=null==(d=t[l])||\"boolean\"==typeof d?null:\"string\"==typeof d||\"number\"==typeof d||\"bigint\"==typeof d?Gs(null,d,null,null,d):Array.isArray(d)?Gs(Vs,{children:d},null,null,null):d.__b>0?Gs(d.type,d.props,d.key,d.ref?d.ref:null,d.__v):d)){if(d.__=n,d.__b=n.__b+1,null===(h=y[l])||h&&d.key==h.key&&d.type===h.type)y[l]=void 0;else for(u=0;u<g;u++){if((h=y[u])&&d.key==h.key&&d.type===h.type){y[u]=void 0;break}h=null}ic(e,d,h=h||Ls,r,o,a,s,c,p),f=d.__e,(u=d.ref)&&h.ref!=u&&(v||(v=[]),h.ref&&v.push(h.ref,null,d),v.push(u,d.__c||f,d)),null!=f?(null==m&&(m=f),\"function\"==typeof d.type&&d.__k===h.__k?d.__d=c=Zs(d,c,e):c=Qs(e,d,h,y,f,c),\"function\"==typeof n.type&&(n.__d=c)):c&&h.__e==c&&c.parentNode!=e&&(c=Us(h))}for(n.__e=m,l=g;l--;)null!=y[l]&&sc(y[l],y[l]);if(v)for(l=0;l<v.length;l++)ac(v[l],v[++l],v[++l])}function Zs(e,t,n){for(var i,r=e.__k,o=0;r&&o<r.length;o++)(i=r[o])&&(i.__=e,t=\"function\"==typeof i.type?Zs(i,t,n):Qs(n,i,i,r,i.__e,t));return t}function Qs(e,t,n,i,r,o){var a,s,c;if(void 0!==t.__d)a=t.__d,t.__d=void 0;else if(null==n||r!=o||null==r.parentNode)e:if(null==o||o.parentNode!==e)e.appendChild(r),a=null;else{for(s=o,c=0;(s=s.nextSibling)&&c<i.length;c+=1)if(s==r)break e;e.insertBefore(r,o),a=o}return void 0!==a?a:r.nextSibling}function Js(e,t,n){\"-\"===t[0]?e.setProperty(t,n):e[t]=null==n?\"\":\"number\"!=typeof n||$s.test(t)?n:n+\"px\"}function ec(e,t,n,i,r){var o;e:if(\"style\"===t)if(\"string\"==typeof n)e.style.cssText=n;else{if(\"string\"==typeof i&&(e.style.cssText=i=\"\"),i)for(t in i)n&&t in n||Js(e.style,t,\"\");if(n)for(t in n)i&&n[t]===i[t]||Js(e.style,t,n[t])}else if(\"o\"===t[0]&&\"n\"===t[1])o=t!==(t=t.replace(/Capture$/,\"\")),t=t.toLowerCase()in e?t.toLowerCase().slice(2):t.slice(2),e.l||(e.l={}),e.l[t+o]=n,n?i||e.addEventListener(t,o?nc:tc,o):e.removeEventListener(t,o?nc:tc,o);else if(\"dangerouslySetInnerHTML\"!==t){if(r)t=t.replace(/xlink(H|:h)/,\"h\").replace(/sName$/,\"s\");else if(\"href\"!==t&&\"list\"!==t&&\"form\"!==t&&\"tabIndex\"!==t&&\"download\"!==t&&t in e)try{e[t]=null==n?\"\":n;break e}catch(e){}\"function\"==typeof n||(null==n||!1===n&&-1==t.indexOf(\"-\")?e.removeAttribute(t):e.setAttribute(t,n))}}function tc(e){this.l[e.type+!1](Ds.event?Ds.event(e):e)}function nc(e){this.l[e.type+!0](Ds.event?Ds.event(e):e)}function ic(e,t,n,i,r,o,a,s,c){var p,l,u,h,d,f,m,v,y,g,b,x,_,w,E,S=t.type;if(void 0!==t.constructor)return null;null!=n.__h&&(c=n.__h,s=t.__e=n.__e,t.__h=null,o=[s]),(p=Ds.__b)&&p(t);try{e:if(\"function\"==typeof S){if(v=t.props,y=(p=S.contextType)&&i[p.__c],g=p?y?y.props.value:p.__:i,n.__c?m=(l=t.__c=n.__c).__=l.__E:(\"prototype\"in S&&S.prototype.render?t.__c=l=new S(v,g):(t.__c=l=new Ws(v,g),l.constructor=S,l.render=cc),y&&y.sub(l),l.props=v,l.state||(l.state={}),l.context=g,l.__n=i,u=l.__d=!0,l.__h=[],l._sb=[]),null==l.__s&&(l.__s=l.state),null!=S.getDerivedStateFromProps&&(l.__s==l.state&&(l.__s=Fs({},l.__s)),Fs(l.__s,S.getDerivedStateFromProps(v,l.__s))),h=l.props,d=l.state,u)null==S.getDerivedStateFromProps&&null!=l.componentWillMount&&l.componentWillMount(),null!=l.componentDidMount&&l.__h.push(l.componentDidMount);else{if(null==S.getDerivedStateFromProps&&v!==h&&null!=l.componentWillReceiveProps&&l.componentWillReceiveProps(v,g),!l.__e&&null!=l.shouldComponentUpdate&&!1===l.shouldComponentUpdate(v,l.__s,g)||t.__v===n.__v){for(l.props=v,l.state=l.__s,t.__v!==n.__v&&(l.__d=!1),l.__v=t,t.__e=n.__e,t.__k=n.__k,t.__k.forEach((function(e){e&&(e.__=t)})),b=0;b<l._sb.length;b++)l.__h.push(l._sb[b]);l._sb=[],l.__h.length&&a.push(l);break e}null!=l.componentWillUpdate&&l.componentWillUpdate(v,l.__s,g),null!=l.componentDidUpdate&&l.__h.push((function(){l.componentDidUpdate(h,d,f)}))}if(l.context=g,l.props=v,l.__v=t,l.__P=e,x=Ds.__r,_=0,\"prototype\"in S&&S.prototype.render){for(l.state=l.__s,l.__d=!1,x&&x(t),p=l.render(l.props,l.state,l.context),w=0;w<l._sb.length;w++)l.__h.push(l._sb[w]);l._sb=[]}else do{l.__d=!1,x&&x(t),p=l.render(l.props,l.state,l.context),l.state=l.__s}while(l.__d&&++_<25);l.state=l.__s,null!=l.getChildContext&&(i=Fs(Fs({},i),l.getChildContext())),u||null==l.getSnapshotBeforeUpdate||(f=l.getSnapshotBeforeUpdate(h,d)),E=null!=p&&p.type===Vs&&null==p.key?p.props.children:p,Xs(e,Array.isArray(E)?E:[E],t,n,i,r,o,a,s,c),l.base=t.__e,t.__h=null,l.__h.length&&a.push(l),m&&(l.__E=l.__=null),l.__e=!1}else null==o&&t.__v===n.__v?(t.__k=n.__k,t.__e=n.__e):t.__e=oc(n.__e,t,n,i,r,o,a,c);(p=Ds.diffed)&&p(t)}catch(e){t.__v=null,(c||null!=o)&&(t.__e=s,t.__h=!!c,o[o.indexOf(s)]=null),Ds.__e(e,t,n)}}function rc(e,t){Ds.__c&&Ds.__c(t,e),e.some((function(t){try{e=t.__h,t.__h=[],e.some((function(e){e.call(t)}))}catch(e){Ds.__e(e,t.__v)}}))}function oc(e,t,n,i,r,o,a,s){var c,p,l,u=n.props,h=t.props,d=t.type,f=0;if(\"svg\"===d&&(r=!0),null!=o)for(;f<o.length;f++)if((c=o[f])&&\"setAttribute\"in c==!!d&&(d?c.localName===d:3===c.nodeType)){e=c,o[f]=null;break}if(null==e){if(null===d)return document.createTextNode(h);e=r?document.createElementNS(\"http://www.w3.org/2000/svg\",d):document.createElement(d,h.is&&h),o=null,s=!1}if(null===d)u===h||s&&e.data===h||(e.data=h);else{if(o=o&&Ms.call(e.childNodes),p=(u=n.props||Ls).dangerouslySetInnerHTML,l=h.dangerouslySetInnerHTML,!s){if(null!=o)for(u={},f=0;f<e.attributes.length;f++)u[e.attributes[f].name]=e.attributes[f].value;(l||p)&&(l&&(p&&l.__html==p.__html||l.__html===e.innerHTML)||(e.innerHTML=l&&l.__html||\"\"))}if(function(e,t,n,i,r){var o;for(o in n)\"children\"===o||\"key\"===o||o in t||ec(e,o,null,n[o],i);for(o in t)r&&\"function\"!=typeof t[o]||\"children\"===o||\"key\"===o||\"value\"===o||\"checked\"===o||n[o]===t[o]||ec(e,o,t[o],n[o],i)}(e,h,u,r,s),l)t.__k=[];else if(f=t.props.children,Xs(e,Array.isArray(f)?f:[f],t,n,i,r&&\"foreignObject\"!==d,o,a,o?o[0]:n.__k&&Us(n,0),s),null!=o)for(f=o.length;f--;)null!=o[f]&&zs(o[f]);s||(\"value\"in h&&void 0!==(f=h.value)&&(f!==e.value||\"progress\"===d&&!f||\"option\"===d&&f!==u.value)&&ec(e,\"value\",f,u.value,!1),\"checked\"in h&&void 0!==(f=h.checked)&&f!==e.checked&&ec(e,\"checked\",f,u.checked,!1))}return e}function ac(e,t,n){try{\"function\"==typeof e?e(t):e.current=t}catch(e){Ds.__e(e,n)}}function sc(e,t,n){var i,r;if(Ds.unmount&&Ds.unmount(e),(i=e.ref)&&(i.current&&i.current!==e.__e||ac(i,null,t)),null!=(i=e.__c)){if(i.componentWillUnmount)try{i.componentWillUnmount()}catch(e){Ds.__e(e,t)}i.base=i.__P=null,e.__c=void 0}if(i=e.__k)for(r=0;r<i.length;r++)i[r]&&sc(i[r],t,n||\"function\"!=typeof e.type);n||null==e.__e||zs(e.__e),e.__=e.__e=e.__d=void 0}function cc(e,t,n){return this.constructor(e,n)}function pc(e,t,n){var i,r,o;Ds.__&&Ds.__(e,t),r=(i=\"function\"==typeof n)?null:n&&n.__k||t.__k,o=[],ic(t,e=(!i&&n||t).__k=Hs(Vs,null,[e]),r||Ls,Ls,void 0!==t.ownerSVGElement,!i&&n?[n]:r?null:t.firstChild?Ms.call(t.childNodes):null,o,!i&&n?n:r?r.__e:t.firstChild,i),rc(o,e)}Ms=Is.slice,Ds={__e:function(e,t,n,i){for(var r,o,a;t=t.__;)if((r=t.__c)&&!r.__)try{if((o=r.constructor)&&null!=o.getDerivedStateFromError&&(r.setState(o.getDerivedStateFromError(e)),a=r.__d),null!=r.componentDidCatch&&(r.componentDidCatch(e,i||{}),a=r.__d),a)return r.__E=r}catch(t){e=t}throw e}},Bs=0,Ws.prototype.setState=function(e,t){var n;n=null!=this.__s&&this.__s!==this.state?this.__s:this.__s=Fs({},this.state),\"function\"==typeof e&&(e=e(Fs({},n),this.props)),e&&Fs(n,e),null!=e&&this.__v&&(t&&this._sb.push(t),Ks(this))},Ws.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),Ks(this))},Ws.prototype.render=Vs,Ns=[],Ys.__r=0;var lc=function(e,t,n,i){var r;t[0]=0;for(var o=1;o<t.length;o++){var a=t[o++],s=t[o]?(t[0]|=a?1:2,n[t[o++]]):t[++o];3===a?i[0]=s:4===a?i[1]=Object.assign(i[1]||{},s):5===a?(i[1]=i[1]||{})[t[++o]]=s:6===a?i[1][t[++o]]+=s+\"\":a?(r=e.apply(s,lc(e,s,n,[\"\",null])),i.push(r),s[0]?t[0]|=2:(t[o-2]=0,t[o]=r)):i.push(s)}return i},uc=new Map;var hc,dc,fc,mc,vc=function(e){var t=uc.get(this);return t||(t=new Map,uc.set(this,t)),(t=lc(this,t.get(e)||(t.set(e,t=function(e){for(var t,n,i=1,r=\"\",o=\"\",a=[0],s=function(e){1===i&&(e||(r=r.replace(/^\\s*\\n\\s*|\\s*\\n\\s*$/g,\"\")))?a.push(0,e,r):3===i&&(e||r)?(a.push(3,e,r),i=2):2===i&&\"...\"===r&&e?a.push(4,e,0):2===i&&r&&!e?a.push(5,0,!0,r):i>=5&&((r||!e&&5===i)&&(a.push(i,0,r,n),i=6),e&&(a.push(i,e,0,n),i=6)),r=\"\"},c=0;c<e.length;c++){c&&(1===i&&s(),s(c));for(var p=0;p<e[c].length;p++)t=e[c][p],1===i?\"<\"===t?(s(),a=[a],i=3):r+=t:4===i?\"--\"===r&&\">\"===t?(i=1,r=\"\"):r=t+r[0]:o?t===o?o=\"\":r+=t:'\"'===t||\"'\"===t?o=t:\">\"===t?(s(),i=1):i&&(\"=\"===t?(i=5,n=r,r=\"\"):\"/\"===t&&(i<5||\">\"===e[c][p+1])?(s(),3===i&&(a=a[0]),i=a,(a=a[0]).push(2,0,i),i=0):\" \"===t||\"\\t\"===t||\"\\n\"===t||\"\\r\"===t?(s(),i=2):r+=t),3===i&&\"!--\"===r&&(i=4,a=a[0])}return s(),a}(e)),t),arguments,[])).length>1?t:t[0]}.bind(Hs),yc=0,gc=[],bc=[],xc=Ds.__b,_c=Ds.__r,wc=Ds.diffed,Ec=Ds.__c,Sc=Ds.unmount;function Cc(e,t){Ds.__h&&Ds.__h(dc,e,yc||t),yc=0;var n=dc.__H||(dc.__H={__:[],__h:[]});return e>=n.__.length&&n.__.push({__V:bc}),n.__[e]}function Rc(e){return yc=1,function(e,t,n){var i=Cc(hc++,2);if(i.t=e,!i.__c&&(i.__=[n?n(t):Ic(void 0,t),function(e){var t=i.__N?i.__N[0]:i.__[0],n=i.t(t,e);t!==n&&(i.__N=[n,i.__[1]],i.__c.setState({}))}],i.__c=dc,!dc.u)){dc.u=!0;var r=dc.shouldComponentUpdate;dc.shouldComponentUpdate=function(e,t,n){if(!i.__c.__H)return!0;var o=i.__c.__H.__.filter((function(e){return e.__c}));if(o.every((function(e){return!e.__N})))return!r||r.call(this,e,t,n);var a=!1;return o.forEach((function(e){if(e.__N){var t=e.__[0];e.__=e.__N,e.__N=void 0,t!==e.__[0]&&(a=!0)}})),!(!a&&i.__c.props===e)&&(!r||r.call(this,e,t,n))}}return i.__N||i.__}(Ic,e)}function Pc(e,t){var n=Cc(hc++,3);!Ds.__s&&Lc(n.__H,t)&&(n.__=e,n.i=t,dc.__H.__h.push(n))}function Tc(e,t){var n=Cc(hc++,4);!Ds.__s&&Lc(n.__H,t)&&(n.__=e,n.i=t,dc.__h.push(n))}function kc(e){return yc=5,Ac((function(){return{current:e}}),[])}function Ac(e,t){var n=Cc(hc++,7);return Lc(n.__H,t)?(n.__V=e(),n.i=t,n.__h=e,n.__V):n.__}function Mc(e,t){return yc=8,Ac((function(){return e}),t)}function Dc(){for(var e;e=gc.shift();)if(e.__P&&e.__H)try{e.__H.__h.forEach(Oc),e.__H.__h.forEach(jc),e.__H.__h=[]}catch(t){e.__H.__h=[],Ds.__e(t,e.__v)}}Ds.__b=function(e){dc=null,xc&&xc(e)},Ds.__r=function(e){_c&&_c(e),hc=0;var t=(dc=e.__c).__H;t&&(fc===dc?(t.__h=[],dc.__h=[],t.__.forEach((function(e){e.__N&&(e.__=e.__N),e.__V=bc,e.__N=e.i=void 0}))):(t.__h.forEach(Oc),t.__h.forEach(jc),t.__h=[])),fc=dc},Ds.diffed=function(e){wc&&wc(e);var t=e.__c;t&&t.__H&&(t.__H.__h.length&&(1!==gc.push(t)&&mc===Ds.requestAnimationFrame||((mc=Ds.requestAnimationFrame)||Nc)(Dc)),t.__H.__.forEach((function(e){e.i&&(e.__H=e.i),e.__V!==bc&&(e.__=e.__V),e.i=void 0,e.__V=bc}))),fc=dc=null},Ds.__c=function(e,t){t.some((function(e){try{e.__h.forEach(Oc),e.__h=e.__h.filter((function(e){return!e.__||jc(e)}))}catch(n){t.some((function(e){e.__h&&(e.__h=[])})),t=[],Ds.__e(n,e.__v)}})),Ec&&Ec(e,t)},Ds.unmount=function(e){Sc&&Sc(e);var t,n=e.__c;n&&n.__H&&(n.__H.__.forEach((function(e){try{Oc(e)}catch(e){t=e}})),n.__H=void 0,t&&Ds.__e(t,n.__v))};var Bc=\"function\"==typeof requestAnimationFrame;function Nc(e){var t,n=function(){clearTimeout(i),Bc&&cancelAnimationFrame(t),setTimeout(e)},i=setTimeout(n,100);Bc&&(t=requestAnimationFrame(n))}function Oc(e){var t=dc,n=e.__c;\"function\"==typeof n&&(e.__c=void 0,n()),dc=t}function jc(e){var t=dc;e.__c=e.__(),dc=t}function Lc(e,t){return!e||e.length!==t.length||t.some((function(t,n){return t!==e[n]}))}function Ic(e,t){return\"function\"==typeof t?t(e):t}function $c(e){var t,n,i=\"\";if(\"string\"==typeof e||\"number\"==typeof e)i+=e;else if(\"object\"==typeof e)if(Array.isArray(e))for(t=0;t<e.length;t++)e[t]&&(n=$c(e[t]))&&(i&&(i+=\" \"),i+=n);else for(t in e)e[t]&&(i&&(i+=\" \"),i+=t);return i}function Fc(){for(var e,t,n=0,i=\"\";n<arguments.length;)(e=arguments[n++])&&(t=$c(e))&&(i&&(i+=\" \"),i+=t);return i}function zc(e){const{entry:t,selected:n,onMouseEnter:i,onMouseLeave:r,onAction:o}=e;return vc`\n    <li\n      class=${Fc(\"entry\",{selected:n})}\n      data-id=${t.id}\n      title=${t.title||t.label}\n      onClick=${o}\n      onMouseEnter=${i}\n      onMouseLeave=${r}\n      onDragStart=${e=>o(e,t,\"dragstart\")}\n      draggable=${!0}\n    >\n      <div class=\"djs-popup-entry-content\">\n        <span\n          class=${Fc(\"djs-popup-entry-name\",t.className)}\n        >\n          ${t.imageUrl&&vc`<img class=\"djs-popup-entry-icon\" src=${t.imageUrl} alt=\"\" />`||t.imageHtml&&vc`<div class=\"djs-popup-entry-icon\" dangerouslySetInnerHTML=${{__html:t.imageHtml}} />`}\n\n          ${t.label?vc`\n            <span class=\"djs-popup-label\">\n              ${t.label}\n            </span>\n          `:null}\n        </span>\n        ${t.description&&vc`\n          <span\n            class=\"djs-popup-entry-description\"\n            title=${t.description}\n          >\n            ${t.description}\n          </span>\n        `}\n      </div>\n      ${t.documentationRef&&vc`\n        <div class=\"djs-popup-entry-docs\">\n          <a\n            href=\"${t.documentationRef}\"\n            onClick=${e=>e.stopPropagation()}\n            title=\"Open element documentation\"\n            target=\"_blank\"\n            rel=\"noopener\"\n          >\n            <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n              <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M10.6368 10.6375V5.91761H11.9995V10.6382C11.9995 10.9973 11.8623 11.3141 11.5878 11.5885C11.3134 11.863 10.9966 12.0002 10.6375 12.0002H1.36266C0.982345 12.0002 0.660159 11.8681 0.396102 11.6041C0.132044 11.34 1.52588e-05 11.0178 1.52588e-05 10.6375V1.36267C1.52588e-05 0.98236 0.132044 0.660173 0.396102 0.396116C0.660159 0.132058 0.982345 2.95639e-05 1.36266 2.95639e-05H5.91624V1.36267H1.36266V10.6375H10.6368ZM12 0H7.2794L7.27873 1.36197H9.68701L3.06507 7.98391L4.01541 8.93425L10.6373 2.31231V4.72059H12V0Z\" fill=\"#818798\"/>\n            </svg>\n          </a>\n        </div>\n      `}\n    </li>\n  `}function Hc(e){const{selectedEntry:t,setSelectedEntry:n,entries:i,...r}=e,o=kc(),a=Ac((()=>function(e){const t=[],n=e=>t.find((t=>e.id===t.id)),i=e=>!!n(e),r=e=>\"string\"==typeof e?{id:e}:e;return e.forEach((e=>{const o=e.group?r(e.group):{id:\"default\"};i(o)?n(o).entries.push(e):t.push({...o,entries:[e]})})),t}(i)),[i]);return Tc((()=>{const e=o.current;if(!e)return;const t=e.querySelector(\".selected\");var n;t&&(\"function\"==typeof(n=t).scrollIntoViewIfNeeded?n.scrollIntoViewIfNeeded():n.scrollIntoView({scrollMode:\"if-needed\",block:\"nearest\"}))}),[t]),vc`\n    <div class=\"djs-popup-results\" ref=${o}>\n      ${a.map((e=>vc`\n        ${e.name&&vc`\n          <div key=${e.id} class=\"entry-header\" title=${e.name}>\n            ${e.name}\n          </div>\n        `}\n        <ul class=\"djs-popup-group\" data-group=${e.id}>\n          ${e.entries.map((e=>vc`\n            <${zc}\n              key=${e.id}\n              entry=${e}\n              selected=${e===t}\n              onMouseEnter=${()=>n(e)}\n              onMouseLeave=${()=>n(null)}\n              ...${r}\n            />\n          `))}\n        </ul>\n      `))}\n    </div>\n  `}function Gc(e){const{onClose:t,onSelect:n,className:i,headerEntries:r,position:o,title:a,width:c,scale:p,search:l,entries:u,onOpened:h,onClosed:d}=e,f=Ac((()=>!!s(l)&&u.length>5),[l,u]),m=kc(),[v,y]=Rc(\"\"),g=Mc(((e,t)=>{if(!f)return e;return e.filter((e=>{if(!t)return(e.rank||0)>=0;const n=[e.description||\"\",e.label||\"\",e.search||\"\"].join(\"---\").toLowerCase();return t.toLowerCase().split(/\\s/g).every((e=>n.includes(e)))}))}),[f]),[b,x]=Rc(g(u,v)),[_,w]=Rc(b[0]),E=Mc((e=>{_&&e.includes(_)||w(e[0]),x(e)}),[_,x,w]);Pc((()=>{E(g(u,v))}),[v,u]),Pc((()=>{const e=e=>{if(\"Escape\"===e.key)return e.preventDefault(),t()};return document.documentElement.addEventListener(\"keydown\",e),()=>{document.documentElement.removeEventListener(\"keydown\",e)}}),[]),Tc((()=>{m.current&&m.current.focus()}),[]);const S=Mc((e=>{let t=b.indexOf(_)+e;t<0&&(t=b.length-1),t>=b.length&&(t=0),w(b[t])}),[b,_,w]),C=Mc((e=>\"Enter\"===e.key&&_?n(e,_):\"ArrowUp\"===e.key||\"Tab\"===e.key&&e.shiftKey?(S(-1),e.preventDefault()):\"ArrowDown\"===e.key||\"Tab\"===e.key?(S(1),e.preventDefault()):void 0),[n,t,_,S]),R=Mc((e=>{J(e.target,\"input\")&&y((()=>e.target.value))}),[y]);Pc((()=>(h(),()=>{d()})),[]);const P=Ac((()=>a||r.length>0),[a,r]);return vc`\n    <${Vc}\n      onClose=${t}\n      onKeyup=${R}\n      onKeydown=${C}\n      className=${i}\n      position=${o}\n      width=${c}\n      scale=${p}\n    >\n      ${P&&vc`\n        <div class=\"djs-popup-header\">\n          <h3 class=\"djs-popup-title\" title=${a}>${a}</h3>\n          ${r.map((e=>vc`\n            <span\n              class=${function(e,t){return Fc(\"entry\",e.className,e.active?\"active\":\"\",e.disabled?\"disabled\":\"\",t?\"selected\":\"\")}(e,e===_)}\n              onClick=${t=>n(t,e)}\n              title=${e.title||e.label}\n              data-id=${e.id}\n              onMouseEnter=${()=>w(e)}\n              onMouseLeave=${()=>w(null)}\n            >\n              ${e.imageUrl?vc`\n                <img class=\"djs-popup-entry-icon\" src=${e.imageUrl} alt=\"\" />\n              `:null}\n\n              ${e.label?vc`\n                <span class=\"djs-popup-label\">${e.label}</span>\n              `:null}\n            </span>\n          `))}\n        </div>\n      `}\n      ${u.length>0&&vc`\n        <div class=\"djs-popup-body\">\n\n          ${f&&vc`\n          <div class=\"djs-popup-search\">\n            <svg class=\"djs-popup-search-icon\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n              <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M9.0325 8.5H9.625L13.3675 12.25L12.25 13.3675L8.5 9.625V9.0325L8.2975 8.8225C7.4425 9.5575 6.3325 10 5.125 10C2.4325 10 0.25 7.8175 0.25 5.125C0.25 2.4325 2.4325 0.25 5.125 0.25C7.8175 0.25 10 2.4325 10 5.125C10 6.3325 9.5575 7.4425 8.8225 8.2975L9.0325 8.5ZM1.75 5.125C1.75 6.9925 3.2575 8.5 5.125 8.5C6.9925 8.5 8.5 6.9925 8.5 5.125C8.5 3.2575 6.9925 1.75 5.125 1.75C3.2575 1.75 1.75 3.2575 1.75 5.125Z\" fill=\"#22242A\"/>\n            </svg>\n            <input\n                ref=${m}\n                type=\"text\"\n              />\n          </div>\n          `}\n\n          <${Hc}\n            entries=${b}\n            selectedEntry=${_}\n            setSelectedEntry=${w}\n            onAction=${n}\n          />\n        </div>\n        ${0===b.length&&vc`\n          <div class=\"djs-popup-no-results\">No matching entries found.</div>\n        `}\n      `}\n    </${Vc}>\n  `}function Vc(e){const{onClose:t,onKeydown:n,onKeyup:i,className:r,children:o,position:a}=e,s=kc(),c=Mc((e=>{ee(e.target,\".djs-popup\",!0)||t()}),[t]);return Tc((()=>{if(\"function\"!=typeof a)return;const e=s.current,t=a(e);e.style.left=`${t.x}px`,e.style.top=`${t.y}px`}),[s.current,a]),Tc((()=>{s.current&&s.current.focus()}),[]),vc`\n    <div\n      class=\"djs-popup-backdrop\"\n      onClick=${c}\n    >\n      <div\n        class=${Fc(\"djs-popup\",r)}\n        style=${function(e){return{transform:`scale(${e.scale})`,width:`${e.width}px`}}(e)}\n        onKeydown=${n}\n        onKeyup=${i}\n        ref=${s}\n        tabIndex=\"-1\"\n      >\n        ${o}\n      </div>\n    </div>\n  `}var Wc=[\"contextPad.close\",\"canvas.viewbox.changing\",\"commandStack.changed\"];function Uc(e,t,n){this._eventBus=t,this._canvas=n,this._current=null;var i=s(e&&e.scale)?e.scale:{min:1,max:1.5};this._config={scale:i},t.on(\"diagram.destroy\",(()=>{this.close()})),t.on(\"element.changed\",(e=>{const t=this.isOpen()&&this._current.target;e.element===t&&this._render()}))}Uc.$inject=[\"config.popupMenu\",\"eventBus\",\"canvas\"],Uc.prototype._render=function(){const{position:e,className:t,entries:n,headerEntries:i,options:r}=this._current,o=Object.entries(n).map((([e,t])=>({id:e,...t}))),a=Object.entries(i).map((([e,t])=>({id:e,...t}))),s=e&&(t=>this._ensureVisible(t,e)),c=this._updateScale(this._current.container);pc(vc`\n      <${Gc}\n        onClose=${e=>this.close(e)}\n        onSelect=${(e,t,n)=>this.trigger(e,t,n)}\n        position=${s}\n        className=${t}\n        entries=${o}\n        headerEntries=${a}\n        scale=${c}\n        onOpened=${this._onOpened.bind(this)}\n        onClosed=${this._onClosed.bind(this)}\n        ...${{...r}}\n      />\n    `,this._current.container)},Uc.prototype.open=function(e,t,n,i){if(!e)throw new Error(\"target is missing\");if(!t)throw new Error(\"providers for <\"+t+\"> not found\");if(!n)throw new Error(\"position is missing\");this.isOpen()&&this.close();const{entries:r,headerEntries:o}=this._getContext(e,t);this._current={position:n,className:t,target:e,entries:r,headerEntries:o,container:this._createContainer({provider:t}),options:i},this._emit(\"open\"),this._bindAutoClose(),this._render()},Uc.prototype._getContext=function(e,t){const n=this._getProviders(t);if(!n||!n.length)throw new Error(\"provider for <\"+t+\"> not found\");const i=this._getEntries(e,n),r=this._getHeaderEntries(e,n);return{entries:i,headerEntries:r,empty:!(Object.keys(i).length||Object.keys(r).length)}},Uc.prototype.close=function(){this.isOpen()&&(this._emit(\"close\"),this.reset(),this._current=null)},Uc.prototype.reset=function(){const e=this._current.container;pc(null,e),ve(e)},Uc.prototype._emit=function(e,t){this._eventBus.fire(`popupMenu.${e}`,t)},Uc.prototype._onOpened=function(){this._emit(\"opened\")},Uc.prototype._onClosed=function(){this._emit(\"closed\")},Uc.prototype._createContainer=function(e){var t=this._canvas.getContainer();const n=de(`<div class=\"djs-popup-parent djs-scrollable\" data-popup=${e.provider}></div>`);return t.appendChild(n),n},Uc.prototype._bindAutoClose=function(){this._eventBus.once(Wc,this.close,this)},Uc.prototype._unbindAutoClose=function(){this._eventBus.off(Wc,this.close,this)},Uc.prototype._updateScale=function(){var e,t,n=this._canvas.zoom(),i=this._config.scale,r=n;return!0!==i&&(!1===i?(e=1,t=1):(e=i.min,t=i.max),s(e)&&n<e&&(r=e),s(t)&&n>t&&(r=t)),r},Uc.prototype._ensureVisible=function(e,t){var n=document.documentElement.getBoundingClientRect(),i=e.getBoundingClientRect(),r={},o=t.x,a=t.y;return t.x+i.width>n.width&&(r.x=!0),t.y+i.height>n.height&&(r.y=!0),r.x&&r.y?(o=t.x-i.width,a=t.y-i.height):r.x?(o=t.x-i.width,a=t.y):r.y&&t.y<i.height?(o=t.x,a=10):r.y&&(o=t.x,a=t.y-i.height),{x:o,y:a}},Uc.prototype.isEmpty=function(e,t){if(!e)throw new Error(\"target is missing\");if(!t)throw new Error(\"provider ID is missing\");const n=this._getProviders(t);return!n||!n.length||this._getContext(e,t).empty},Uc.prototype.registerProvider=function(e,t,n){n||(n=t,t=1e3),this._eventBus.on(\"popupMenu.getProviders.\"+e,t,(function(e){e.providers.push(n)}))},Uc.prototype._getProviders=function(e){var t=this._eventBus.createEvent({type:\"popupMenu.getProviders.\"+e,providers:[]});return this._eventBus.fire(t),t.providers},Uc.prototype._getEntries=function(e,t){var n={};return g(t,(function(t){if(t.getPopupMenuEntries){var i=t.getPopupMenuEntries(e);h(i)?n=i(n):g(i,(function(e,t){n[t]=e}))}else g(t.getEntries(e),(function(e){var t=e.id;if(!t)throw new Error(\"entry ID is missing\");n[t]=$(e,[\"id\"])}))})),n},Uc.prototype._getHeaderEntries=function(e,t){var n={};return g(t,(function(t){if(t.getPopupMenuHeaderEntries){var i=t.getPopupMenuHeaderEntries(e);h(i)?n=i(n):g(i,(function(e,t){n[t]=e}))}else{if(!t.getHeaderEntries)return;g(t.getHeaderEntries(e),(function(e){var t=e.id;if(!t)throw new Error(\"entry ID is missing\");n[t]=$(e,[\"id\"])}))}})),n},Uc.prototype.isOpen=function(){return!!this._current},Uc.prototype.trigger=function(e,t,n=\"click\"){if(e.preventDefault(),!t){let n=K(ee(e.delegateTarget||e.target,\".entry\",!0),\"data-id\");t={id:n,...this._getEntry(n)}}const i=t.action;if(!1!==this._emit(\"trigger\",{entry:t,event:e}))if(h(i)){if(\"click\"===n)return i(e,t)}else if(i[n])return i[n](e,t)},Uc.prototype._getEntry=function(e){var t=this._current.entries[e]||this._current.headerEntries[e];if(!t)throw new Error(\"entry not found\");return t};var qc={__init__:[\"popupMenu\"],popupMenu:[\"type\",Uc]},Kc={align:'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 2000 2000\">\\n              <line x1=\"200\" y1=\"150\" x2=\"200\" y2=\"1850\" style=\"stroke:currentColor;stroke-width:100;stroke-linecap:round;\"/>\\n              <rect x=\"500\" y=\"150\" width=\"1300\" height=\"700\" rx=\"1\" style=\"fill:none;stroke:currentColor;stroke-width:100;\"></rect>\\n              <rect x=\"500\" y=\"1150\" width=\"700\" height=\"700\" rx=\"1\" style=\"fill:currentColor;stroke:currentColor;stroke-width:100;opacity:.5;\"></rect>\\n          </svg>',bottom:'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1800 1800\">\\n            <line x1=\"150\" y1=\"1650\" x2=\"1650\" y2=\"1650\" style=\"stroke:currentColor;stroke-width:100;stroke-linecap:round;\"/>\\n            <rect x=\"150\" y=\"350\" width=\"600\" height=\"1300\" rx=\"1\" style=\"fill:none;stroke:currentColor;stroke-width:100;\"></rect>\\n            <rect x=\"1050\" y=\"850\" width=\"600\" height=\"800\" rx=\"1\" style=\"fill:currentColor;stroke:currentColor;stroke-width:100;opacity:.5;\"></rect>\\n          </svg>',center:'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1800 1800\">\\n            <line x1=\"900\" y1=\"150\" x2=\"900\" y2=\"1650\" style=\"stroke:currentColor;stroke-width:100;stroke-linecap:round;\"/>\\n            <rect x=\"250\" y=\"150\" width=\"1300\" height=\"600\" rx=\"1\" style=\"fill:none;stroke:currentColor;stroke-width:100;\"></rect>\\n            <rect x=\"500\" y=\"1050\" width=\"800\" height=\"600\" rx=\"1\" style=\"fill:currentColor;stroke:currentColor;stroke-width:100;opacity:.5;\"></rect>\\n          </svg>',left:'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1800 1800\">\\n            <line x1=\"100\" y1=\"150\" x2=\"100\" y2=\"1650\" style=\"stroke:currentColor;stroke-width:100;stroke-linecap:round;\"/>\\n            <rect x=\"100\" y=\"150\" width=\"1300\" height=\"600\" rx=\"1\" style=\"fill:none;stroke:currentColor;stroke-width:100;\"></rect>\\n            <rect x=\"100\" y=\"1050\" width=\"800\" height=\"600\" rx=\"1\" style=\"fill:currentColor;stroke:currentColor;stroke-width:100;opacity:.5;\"></rect>\\n          </svg>',right:'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1800 1800\">\\n            <line x1=\"1650\" y1=\"150\" x2=\"1650\" y2=\"1650\" style=\"stroke:currentColor;stroke-width:100;stroke-linecap:round;\"/>\\n            <rect x=\"350\" y=\"150\" width=\"1300\" height=\"600\" rx=\"1\" style=\"fill:none;stroke:currentColor;stroke-width:100;\"></rect>\\n            <rect x=\"850\" y=\"1050\" width=\"800\" height=\"600\" rx=\"1\" style=\"fill:currentColor;stroke:currentColor;stroke-width:100;opacity:.5;\"></rect>\\n          </svg>',top:'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1800 1800\">\\n            <line x1=\"150\" y1=\"150\" x2=\"1650\" y2=\"150\" style=\"stroke:currentColor;stroke-width:100;stroke-linecap:round;\"/>\\n            <rect x=\"150\" y=\"150\" width=\"600\" height=\"1300\" rx=\"1\" style=\"fill:none;stroke:currentColor;stroke-width:100;\"></rect>\\n            <rect x=\"1050\" y=\"150\" width=\"600\" height=\"800\" rx=\"1\" style=\"fill:currentColor;stroke:currentColor;stroke-width:100;opacity:.5;\"></rect>\\n          </svg>',middle:'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1800 1800\">\\n            <line x1=\"150\" y1=\"900\" x2=\"1650\" y2=\"900\" style=\"stroke:currentColor;stroke-width:100;stroke-linecap:round;\"/>\\n            <rect x=\"150\" y=\"250\" width=\"600\" height=\"1300\" rx=\"1\" style=\"fill:none;stroke:currentColor;stroke-width:100;\"></rect>\\n            <rect x=\"1050\" y=\"500\" width=\"600\" height=\"800\" rx=\"1\" style=\"fill:currentColor;stroke:currentColor;stroke-width:100;opacity:.5;\"></rect>\\n          </svg>'};function Yc(e,t,n,i){e.registerProvider(900,this),this._contextPad=e,this._popupMenu=t,this._translate=n,this._canvas=i}Yc.$inject=[\"contextPad\",\"popupMenu\",\"translate\",\"canvas\"],Yc.prototype.getMultiElementContextPadEntries=function(e){var t={};return this._isAllowed(e)&&L(t,this._getEntries(e)),t},Yc.prototype._isAllowed=function(e){return!this._popupMenu.isEmpty(e,\"align-elements\")},Yc.prototype._getEntries=function(){var e=this;return{\"align-elements\":{group:\"align-elements\",title:e._translate(\"Align elements\"),html:`<div class=\"entry\">${Kc.align}</div>`,action:{click:function(t,n){var i=e._getMenuPosition(n);L(i,{cursor:{x:t.x,y:t.y}}),e._popupMenu.open(n,\"align-elements\",i)}}}}},Yc.prototype._getMenuPosition=function(e){var t=this._contextPad.getPad(e).html.getBoundingClientRect();return{x:t.left,y:t.bottom+5}};var Xc=[\"left\",\"center\",\"right\",\"top\",\"middle\",\"bottom\"];function Zc(e,t,n,i){this._alignElements=t,this._translate=n,this._popupMenu=e,this._rules=i,e.registerProvider(\"align-elements\",this)}function Qc(e){ua.call(this,e),this.init()}function Jc(e){Qc.call(this,e)}Zc.$inject=[\"popupMenu\",\"alignElements\",\"translate\",\"rules\"],Zc.prototype.getPopupMenuEntries=function(e){var t={};return this._isAllowed(e)&&L(t,this._getEntries(e)),t},Zc.prototype._isAllowed=function(e){return this._rules.allowed(\"elements.align\",{elements:e})},Zc.prototype._getEntries=function(e){var t=this._alignElements,n=this._translate,i=this._popupMenu,r={};return g(Xc,(function(o){r[\"align-elements-\"+o]={group:\"align\",title:n(\"Align elements \"+o),className:\"bjs-align-elements-menu-entry\",imageHtml:Kc[o],action:function(){t.trigger(e,o),i.close()}}})),r},Qc.$inject=[\"eventBus\"],e(Qc,ua),Qc.prototype.addRule=function(e,t,n){var i=this;\"string\"==typeof e&&(e=[e]),e.forEach((function(e){i.canExecute(e,t,(function(e,t,i){return n(e)}),!0)}))},Qc.prototype.init=function(){},Jc.$inject=[\"eventBus\"],e(Jc,Qc),Jc.prototype.init=function(){this.addRule(\"elements.align\",(function(e){var t=y(e.elements,(function(e){return!(e.waypoints||e.host||e.labelTarget)}));return!((t=ut(t)).length<2)&&t}))};var ep={__depends__:[Ps,js,qc],__init__:[\"alignElementsContextPadProvider\",\"alignElementsMenuProvider\",\"bpmnAlignElements\"],alignElementsContextPadProvider:[\"type\",Yc],alignElementsMenuProvider:[\"type\",Zc],bpmnAlignElements:[\"type\",Jc]},tp=10,np=50,ip=250;function rp(e,t,n,i){for(var r;r=ap(e,n,t);)n=i(t,n,r);return n}function op(e){return function(t,n,i){var r={x:n.x,y:n.y};return[\"x\",\"y\"].forEach((function(o){var a=e[o];if(a){var s=\"x\"===o?\"width\":\"height\",c=a.margin,p=a.minDistance;r[o]=c<0?Math.min(i[o]+c-t[s]/2,n[o]-p+c):Math.max(i[o]+i[s]+c+t[s]/2,n[o]+p+c)}})),r}}function ap(e,t,n){var i={x:t.x-n.width/2,y:t.y-n.height/2,width:n.width,height:n.height},r=function(e){var t=sp(e);e.host&&(t=t.concat(sp(e.host)));e.attachers&&(t=t.concat(e.attachers.reduce((function(e,t){return e.concat(sp(t))}),[])));return t}(e);return m(r,(function(e){return e!==n&&\"intersect\"===wn(e,i,tp)}))}function sp(e){return(t=e,t.outgoing.map((function(e){return e.target}))).concat(function(e){return e.incoming.map((function(e){return e.source}))}(e));var t}function cp(){return!0}function pp(e,t,n){e.on(\"autoPlace\",100,(function(e){var t=e.shape;return function(e,t,n){n||(n={});var i=n.defaultDistance||np,r=_n(e),o=gn(e);return{x:o.right+i+t.width/2,y:r.y}}(e.source,t)})),e.on(\"autoPlace.end\",(function(e){n.scrollToElement(e.shape)})),this.append=function(n,i,r){e.fire(\"autoPlace.start\",{source:n,shape:i});var o=e.fire(\"autoPlace\",{source:n,shape:i}),a=t.appendShape(n,i,o,n.parent,r);return e.fire(\"autoPlace.end\",{source:n,shape:a}),a}}function lp(e,t){e.on(\"autoPlace.end\",500,(function(e){t.select(e.shape)}))}pp.$inject=[\"eventBus\",\"modeling\",\"canvas\"],lp.$inject=[\"eventBus\",\"selection\"];var up={__init__:[\"autoPlaceSelectionBehavior\"],autoPlace:[\"type\",pp],autoPlaceSelectionBehavior:[\"type\",lp]};function hp(e,t){for(d(t)&&(t=[t]);e=e.parent;)if(Dr(e,t))return e;return null}function dp(e,t){return Mr(t,\"bpmn:TextAnnotation\")?function(e,t){var n=gn(e),i={x:n.right+t.width/2,y:n.top-50-t.height/2};fn(e)&&((i=_n(e)).x+=100,i.y-=50);return rp(e,t,i,op({y:{margin:-30,minDistance:20}}))}(e,t):Dr(t,[\"bpmn:DataObjectReference\",\"bpmn:DataStoreReference\"])?function(e,t){var n=gn(e),i={x:n.right-10+t.width/2,y:n.bottom+40+t.width/2};return rp(e,t,i,op({x:{margin:30,minDistance:30}}))}(e,t):Mr(t,\"bpmn:FlowNode\")?function(e,t){var n=gn(e),i=_n(e),r=function(e,t){t||(t={});var n=t.defaultDistance||np,i=t.direction||\"e\",r=t.filter,o=t.getWeight||function(t){return t.source===e?1:-1},a=t.maxDistance||ip,s=t.reference||\"start\";function c(e,t){return\"n\"===i?\"start\"===s?gn(e).top-gn(t).bottom:\"center\"===s?gn(e).top-_n(t).y:gn(e).top-gn(t).top:\"w\"===i?\"start\"===s?gn(e).left-gn(t).right:\"center\"===s?gn(e).left-_n(t).x:gn(e).left-gn(t).left:\"s\"===i?\"start\"===s?gn(t).top-gn(e).bottom:\"center\"===s?_n(t).y-gn(e).bottom:gn(t).bottom-gn(e).bottom:\"start\"===s?gn(t).left-gn(e).right:\"center\"===s?_n(t).x-gn(e).right:gn(t).right-gn(e).right}r||(r=cp);var p=e.incoming.filter(r).map((function(t){var n=o(t),i=n<0?c(t.source,e):c(e,t.source);return{id:t.source.id,distance:i,weight:n}})),l=e.outgoing.filter(r).map((function(t){var n=o(t),i=n>0?c(e,t.target):c(t.target,e);return{id:t.target.id,distance:i,weight:n}})),u=x(p.concat(l).reduce((function(e,t){return e[t.id+\"__weight_\"+t.weight]=t,e}),{}),(function(e,t){var n=t.distance,i=t.weight;return n<0||n>a||(e[String(n)]||(e[String(n)]=0),e[String(n)]+=1*i,(!e.distance||e[e.distance]<e[String(n)])&&(e.distance=n)),e}),{});return u.distance||n}(e,{filter:function(e){return Mr(e,\"bpmn:SequenceFlow\")}}),o=30,a=80,s=\"left\";Mr(e,\"bpmn:BoundaryEvent\")&&-1!==(s=wn(e,e.host,-25)).indexOf(\"top\")&&(o*=-1);var c={x:n.right+r+t.width/2,y:i.y+fp(s,a)};return rp(e,t,c,op({y:{margin:o,minDistance:a}}))}(e,t):void 0}function fp(e,t){return e.includes(\"top\")?-1*t:e.includes(\"bottom\")?t:0}function mp(e){e.on(\"autoPlace\",(function(e){var t=e.shape;return dp(e.source,t)}))}mp.$inject=[\"eventBus\"];var vp={__depends__:[up],__init__:[\"bpmnAutoPlace\"],bpmnAutoPlace:[\"type\",mp]};function yp(e,t,n,r){ua.call(this,e),this._elementRegistry=t,this._modeling=n,this._rules=r;var o=this;this.postExecuted([\"shape.create\"],(function(e){var t=e.context,n=t.hints||{},i=t.shape,r=t.parent||t.newParent;!1!==n.autoResize&&o._expand([i],r)})),this.postExecuted([\"elements.move\"],(function(e){var t=e.context,n=i(C(t.closure.topLevel)),r=t.hints,a=!r||r.autoResize;!1!==a&&g(R(n,(function(e){return e.parent.id})),(function(e,t){p(a)&&(e=e.filter((function(e){return m(a,A({id:e.id}))}))),o._expand(e,t)}))})),this.postExecuted([\"shape.toggleCollapse\"],(function(e){var t=e.context,n=t.hints,i=t.shape;n&&!1===n.autoResize||i.collapsed||o._expand(i.children||[],i)})),this.postExecuted([\"shape.resize\"],(function(e){var t=e.context,n=t.hints,i=t.shape,r=i.parent;n&&!1===n.autoResize||r&&o._expand([i],r)}))}function gp(e){e.invoke(yp,this)}function bp(e){Qc.call(this,e);var t=this;this.addRule(\"element.autoResize\",(function(e){return t.canResize(e.elements,e.target)}))}function xp(e,t){bp.call(this,e),this._modeling=t}yp.$inject=[\"eventBus\",\"elementRegistry\",\"modeling\",\"rules\"],e(yp,ua),yp.prototype._getOptimalBounds=function(e,t){var n=this.getOffset(t),i=this.getPadding(t),r=gn(vt(e)),o=gn(t),a={};return r.top-o.top<i.top&&(a.top=r.top-n.top),r.left-o.left<i.left&&(a.left=r.left-n.left),o.right-r.right<i.right&&(a.right=r.right+n.right),o.bottom-r.bottom<i.bottom&&(a.bottom=r.bottom+n.bottom),bn(L({},o,a))},yp.prototype._expand=function(e,t){if(\"string\"==typeof t&&(t=this._elementRegistry.get(t)),this._rules.allowed(\"element.autoResize\",{elements:e,target:t})){var n=this._getOptimalBounds(e,t);if(function(e,t){return e.x!==t.x||e.y!==t.y||e.width!==t.width||e.height!==t.height}(n,t)){var i=function(e,t){var n=\"\";e=gn(e),t=gn(t),e.top>t.top&&(n=n.concat(\"n\"));e.right<t.right&&(n=n.concat(\"w\"));e.bottom<t.bottom&&(n=n.concat(\"s\"));e.left>t.left&&(n=n.concat(\"e\"));return n}(I(t,[\"x\",\"y\",\"width\",\"height\"]),n);this.resize(t,n,{autoResize:i});var r=t.parent;r&&this._expand([t],r)}}},yp.prototype.getOffset=function(e){return{top:60,bottom:60,left:100,right:100}},yp.prototype.getPadding=function(e){return{top:2,bottom:2,left:15,right:15}},yp.prototype.resize=function(e,t,n){this._modeling.resizeShape(e,t,null,n)},gp.$inject=[\"injector\"],e(gp,yp),gp.prototype.resize=function(e,t,n){Mr(e,\"bpmn:Participant\")?this._modeling.resizeLane(e,t,null,n):this._modeling.resizeShape(e,t,null,n)},bp.$inject=[\"eventBus\"],e(bp,Qc),bp.prototype.canResize=function(e,t){return!1},e(xp,bp),xp.$inject=[\"eventBus\",\"modeling\"],xp.prototype.canResize=function(e,t){if(Mr(t.di,\"bpmndi:BPMNPlane\"))return!1;if(!Mr(t,\"bpmn:Participant\")&&!Mr(t,\"bpmn:Lane\")&&!Mr(t,\"bpmn:SubProcess\"))return!1;var n=!0;return g(e,(function(e){(Mr(e,\"bpmn:Lane\")||mn(e))&&(n=!1)})),n};var _p={__init__:[\"bpmnAutoResize\",\"bpmnAutoResizeProvider\"],bpmnAutoResize:[\"type\",gp],bpmnAutoResizeProvider:[\"type\",xp]};function wp(e,t,n){var i,r,o=this,a=n.get(\"dragging\",!1);a&&t.on(\"drag.start\",(function(n){t.once(\"drag.move\",1500,(function(t){!function(t){if(!t.hover){var n=t.originalEvent,i=o._findTargetGfx(n),r=i&&e.get(i);i&&r&&(t.stopPropagation(),a.hover({element:r,gfx:i}),a.move(n))}}(t)}))})),t.on(\"element.hover\",(function(e){i=e.gfx,r=e.element})),t.on(\"element.hover\",1500,(function(e){r&&t.fire(\"element.out\",{element:r,gfx:i})})),t.on(\"element.out\",(function(){i=null,r=null})),this._findTargetGfx=function(e){var t;if(e instanceof MouseEvent)return t=Io(e),function(e){return ee(e,\"svg, .djs-element\",!0)}(document.elementFromPoint(t.x,t.y))}}wp.$inject=[\"elementRegistry\",\"eventBus\",\"injector\"];var Ep={__init__:[\"hoverFix\"],hoverFix:[\"type\",wp]},Sp=Math.round,Cp=\"djs-drag-active\";function Rp(e){e.preventDefault()}function Pp(e,t,n,i){var r,o={threshold:5,trapClick:!0};function a(e){var n=t.viewbox(),i=t._container.getBoundingClientRect();return{x:n.x+(e.x-i.left)/n.scale,y:n.y+(e.y-i.top)/n.scale}}function s(t,n){n=n||r;var i=e.createEvent(L({},n.payload,n.data,{isTouch:n.isTouch}));return!1!==e.fire(\"drag.\"+t,i)&&e.fire(n.prefix+\".\"+t,i)}function c(e,i){var o,c=r.payload,p=r.displacement,l=r.globalStart,u=Io(e),h=is(u,l),d=r.localStart,f=a(u),v=is(f,d);if(!r.active&&(i||(o=h,Math.sqrt(Math.pow(o.x,2)+Math.pow(o.y,2))>r.threshold))){if(L(c,{x:Sp(d.x+p.x),y:Sp(d.y+p.y),dx:0,dy:0},{originalEvent:e}),!1===s(\"start\"))return m();r.active=!0,r.keepSelection||(c.previousSelection=n.get(),n.select(null)),r.cursor&&Qa(r.cursor),t.addMarker(t.getRootElement(),Cp)}Lo(e),r.active&&(L(c,{x:Sp(f.x+p.x),y:Sp(f.y+p.y),dx:Sp(v.x),dy:Sp(v.y)},{originalEvent:e}),s(\"move\"))}function p(e){var t=!0;r.active&&(e&&(r.payload.originalEvent=e,Lo(e)),t=s(\"end\")),!1===t&&s(\"rejected\"),s(\"ended\",v(!0!==t))}function l(e){Fa(\"Escape\",e)&&(Rp(e),m())}function u(t){var n;r.active&&(n=ts(e),setTimeout(n,400),Rp(t)),p(t)}function h(e){c(e)}function d(e){var t=r.payload;t.hoverGfx=e.gfx,t.hover=e.element,s(\"hover\")}function f(e){s(\"out\");var t=r.payload;t.hoverGfx=null,t.hover=null}function m(e){var t;if(r){var n=r.active;n&&s(\"cancel\"),t=v(e),n&&s(\"canceled\",t)}}function v(o){var a,v;s(\"cleanup\"),Ja(),v=r.trapClick?u:p,ae.unbind(document,\"mousemove\",c),ae.unbind(document,\"dragstart\",Rp),ae.unbind(document,\"selectstart\",Rp),ae.unbind(document,\"mousedown\",v,!0),ae.unbind(document,\"mouseup\",v,!0),ae.unbind(document,\"keyup\",l),ae.unbind(document,\"touchstart\",h,!0),ae.unbind(document,\"touchcancel\",m,!0),ae.unbind(document,\"touchmove\",c,!0),ae.unbind(document,\"touchend\",p,!0),e.off(\"element.hover\",d),e.off(\"element.out\",f),t.removeMarker(t.getRootElement(),Cp);var y=r.payload.previousSelection;return!1!==o&&y&&!n.get().length&&function(e){var t=e.filter((function(e){return i.get(e.id)}));t.length&&n.select(t)}(y),a=r,r=null,a}e.on(\"diagram.destroy\",m),this.init=function(t,n,i,v){r&&m(!1),\"string\"==typeof n&&(v=i,i=n,n=null);var y,g,b,x,_,w=(v=L({},o,v||{})).data||{};x=v.trapClick?u:p,t?(y=jo(t)||t,g=Io(t),Lo(t),\"dragstart\"===y.type&&Rp(y)):(y=null,g={x:0,y:0}),b=a(g),n||(n=b),_=function(e){return\"undefined\"!=typeof TouchEvent&&e instanceof TouchEvent}(y),r=L({prefix:i,data:w,payload:{},globalStart:g,displacement:is(n,b),localStart:b,isTouch:_},v),v.manual||(_?(ae.bind(document,\"touchstart\",h,!0),ae.bind(document,\"touchcancel\",m,!0),ae.bind(document,\"touchmove\",c,!0),ae.bind(document,\"touchend\",p,!0)):(ae.bind(document,\"mousemove\",c),ae.bind(document,\"dragstart\",Rp),ae.bind(document,\"selectstart\",Rp),ae.bind(document,\"mousedown\",x,!0),ae.bind(document,\"mouseup\",x,!0)),ae.bind(document,\"keyup\",l),e.on(\"element.hover\",d),e.on(\"element.out\",f)),s(\"init\"),v.autoActivate&&c(t,!0)},this.move=c,this.hover=d,this.out=f,this.end=p,this.cancel=m,this.context=function(){return r},this.setOptions=function(e){L(o,e)}}Pp.$inject=[\"eventBus\",\"canvas\",\"selection\",\"elementRegistry\"];var Tp={__depends__:[Ep,ta],dragging:[\"type\",Pp]};function kp(e,t,n){this._canvas=n,this._opts=L({scrollThresholdIn:[20,20,20,20],scrollThresholdOut:[0,0,0,0],scrollRepeatTimeout:15,scrollStep:10},e);var i=this;t.on(\"drag.move\",(function(e){var t=i._toBorderPoint(e);i.startScroll(t)})),t.on([\"drag.cleanup\"],(function(){i.stopScroll()}))}function Ap(e,t,n){return t<e&&e<n}kp.$inject=[\"config.autoScroll\",\"eventBus\",\"canvas\"],kp.prototype.startScroll=function(e){var t=this._canvas,n=this._opts,i=this,r=t.getContainer().getBoundingClientRect(),o=[e.x,e.y,r.width-e.x,r.height-e.y];this.stopScroll();for(var a=0,s=0,c=0;c<4;c++)Ap(o[c],n.scrollThresholdOut[c],n.scrollThresholdIn[c])&&(0===c?a=n.scrollStep:1==c?s=n.scrollStep:2==c?a=-n.scrollStep:3==c&&(s=-n.scrollStep));0===a&&0===s||(t.scroll({dx:a,dy:s}),this._scrolling=setTimeout((function(){i.startScroll(e)}),n.scrollRepeatTimeout))},kp.prototype.stopScroll=function(){clearTimeout(this._scrolling)},kp.prototype.setOptions=function(e){this._opts=L({},this._opts,e)},kp.prototype._toBorderPoint=function(e){var t=this._canvas._container.getBoundingClientRect(),n=Io(e.originalEvent);return{x:n.x-t.left,y:n.y-t.top}};var Mp={__depends__:[Tp],__init__:[\"autoScroll\"],autoScroll:[\"type\",kp]};function Dp(e){this._commandStack=e.get(\"commandStack\",!1)}Dp.$inject=[\"injector\"],Dp.prototype.allowed=function(e,t){var n=!0,i=this._commandStack;return i&&(n=i.canExecute(e,t)),void 0===n||n};var Bp={__init__:[\"rules\"],rules:[\"type\",Dp]},Np=Math.round,Op=Math.max;var jp=10;function Lp(e,t){return function(e,t){var n,i;for(n=0;i=e[n];n++)if(Ct(i,t)<=jp)return{point:e[n],bendpoint:!0,index:n};return null}(e,t)||function(e,t){var n,i,r=dn(function(e,t){return[[\"M\",e.x,e.y],[\"m\",0,-t],[\"a\",t,t,0,1,1,0,2*t],[\"a\",t,t,0,1,1,0,-2*t],[\"z\"]]}(t,jp),(n=[],e.forEach((function(e,t){n.push([0===t?\"M\":\"L\",e.x,e.y])})),n)),o=r[0],a=r[r.length-1];return o?o!==a?o.segment2!==a.segment2?{point:e[i=Op(o.segment2,a.segment2)-1],bendpoint:!0,index:i}:{point:{x:Np(o.x+a.x)/2,y:Np(o.y+a.y)/2},index:o.segment2}:{point:{x:Np(o.x),y:Np(o.y)},index:o.segment2}:null}(e,t)}function Ip(e){return Math.sqrt(Math.pow(e.x,2)+Math.pow(e.y,2))}function $p(e){return Math.atan((e[1].y-e[0].y)/(e[1].x-e[0].x))}function Fp(e,t){var n=t[0],i=t[1],r={x:i.x-n.x,y:i.y-n.y},o=function(e,t,n){var i=[{n:e[0]-n[0],lambda:t[0]},{n:e[1]-n[1],lambda:t[1]}];return-(i[0].n*t[0]+i[1].n*t[1])/(i[0].lambda*t[0]+i[1].lambda*t[1])}([n.x,n.y],[r.x,r.y],[e.x,e.y]);return{x:n.x+o*r.x,y:n.y+o*r.y}}function zp(e,t){var n=Fp(e,t);return Ip({x:n.x-e.x,y:n.y-e.y})}function Hp(e,t){return Ip({x:e.x-t.x,y:e.y-t.y})}var Gp=\"djs-bendpoint\",Vp=\"djs-segment-dragger\";function Wp(e,t,n){var i=function(e,t){var n,i=Io(t),r=e._container.getBoundingClientRect();n={x:r.left,y:r.top};var o=e.viewbox();return{x:o.x+(i.x-n.x)/o.scale,y:o.y+(i.y-n.y)/o.scale}}(e,n);return Lp(t,i)}function Up(e,t){var n=De(\"g\");Se(n).add(Gp),ge(e,n);var i=De(\"circle\");we(i,{cx:0,cy:0,r:4}),Se(i).add(\"djs-visual\"),ge(n,i);var r=De(\"circle\");return we(r,{cx:0,cy:0,r:10}),Se(r).add(\"djs-hit\"),ge(n,r),t&&Se(n).add(t),n}function qp(e,t,n,i){var r=De(\"g\");ge(e,r);var o=function(e,t,n){var i=t.x-e.x,r=t.y-e.y;return Yp(\"h\"===n?i:r)}(t,n,i),a=De(\"rect\");we(a,{x:-9,y:-3,width:18,height:6}),Se(a).add(\"djs-visual\"),ge(r,a);var s=De(\"rect\");return we(s,{x:-o/2,y:-8.5,width:o,height:17}),Se(s).add(\"djs-hit\"),ge(r,s),ri(r,\"v\"===i?90:0),r}function Kp(e,t,n){var i=De(\"g\"),r=Mt(t,n),o=Tt(t,n);return ge(e,i),qp(i,t,n,o),Se(i).add(Vp),Se(i).add(\"h\"===o?\"horizontal\":\"vertical\"),ii(i,r.x,r.y),i}function Yp(e){return Math.abs(Math.round(2*e/3))}function Xp(e,t){var n=function(e,t){for(var n,i=t.waypoints,r=1/0,o=0;o<i.length-1;o++){var a=zp(e,[i[o],i[o+1]]);a<r&&(r=a,n=o)}return[i[n],i[n+1]]}(e,t);return Fp(e,n)}function Zp(e,t,n,i,r){function o(e,n){var o,a=n.waypoints,s=Wp(t,a,e);if(s)return o=function(e,t){var n,i,r=e.waypoints;return t.index<=0||t.bendpoint?null:(i=Tt((n={start:r[t.index-1],end:r[t.index]}).start,n.end))?Yp(\"h\"===i?n.end.x-n.start.x:n.end.y-n.start.y)/2:null}(n,s),!function(e,t,n){var i,r,o,a,s,c,p=e.index,l=e.point;return!(p<=0||e.bendpoint)&&(o=Mt(i=t[p-1],r=t[p]),a=Tt(i,r),s=Math.abs(l.x-o.x),c=Math.abs(l.y-o.y),a&&s<=n&&c<=n)}(s,a,o)?i.start(e,n,s.index,!s.bendpoint):r.start(e,n,s.index),!0}function a(e,t,i){ae.bind(e,t,(function(e){n.triggerMouseEvent(t,e,i),e.stopPropagation()}))}function s(e,n){var i=t.getLayer(\"overlays\"),r=fe('.djs-bendpoints[data-element-id=\"'+ma(e.id)+'\"]',i);return!r&&n&&(we(r=De(\"g\"),{\"data-element-id\":e.id}),Se(r).add(\"djs-bendpoints\"),ge(i,r),a(r,\"mousedown\",e),a(r,\"click\",e),a(r,\"dblclick\",e)),r}function c(e,t){return fe('.djs-segment-dragger[data-segment-idx=\"'+e+'\"]',t)}function p(e,t){t.waypoints.forEach((function(t,n){var i=Up(e);ge(e,i),ii(i,t.x,t.y)})),Up(e,\"floating\")}function l(e,t){for(var n,i,r,o=t.waypoints,s=1;s<o.length;s++)Tt(n=o[s-1],i=o[s])&&(we(r=Kp(e,n,i),{\"data-segment-idx\":s}),a(r,\"mousemove\",t))}function u(e){var t=s(e);return t||(p(t=s(e,!0),e),l(t,e)),t}function h(e){var t=s(e);t&&(!function(e){g(me(\".\"+Vp,e),(function(e){Re(e)}))}(t),function(e){g(me(\".\"+Gp,e),(function(e){Re(e)}))}(t),l(t,e),p(t,e))}function d(e,t,n){var i,r,o=c(t.index,e),a=n[t.index-1],s=n[t.index],p=t.point,l=Mt(a,s),u=Tt(a,s);o&&(i=function(e){return fe(\".djs-visual\",e)}(o),r={x:p.x-l.x,y:p.y-l.y},\"v\"===u&&(r={x:r.y,y:r.x}),ii(i,r.x,r.y))}e.on(\"connection.changed\",(function(e){h(e.element)})),e.on(\"connection.remove\",(function(e){var t=s(e.element);t&&Re(t)})),e.on(\"element.marker.update\",(function(e){var t,n=e.element;n.waypoints&&(t=u(n),e.add?Se(t).add(e.marker):Se(t).remove(e.marker))})),e.on(\"element.mousemove\",(function(e){var n,i,r=e.element,o=r.waypoints;if(o){if(n=s(r,!0),!(i=Wp(t,o,e.originalEvent)))return;!function(e,t){var n=fe(\".floating\",e),i=t.point;n&&ii(n,i.x,i.y)}(n,i),i.bendpoint||d(n,i,o)}})),e.on(\"element.mousedown\",(function(e){if(Fo(e)){var t=e.originalEvent,n=e.element;if(n.waypoints)return o(t,n)}})),e.on(\"selection.changed\",(function(e){var t=e.newSelection[0];t&&t.waypoints&&u(t)})),e.on(\"element.hover\",(function(e){var t=e.element;t.waypoints&&(u(t),n.registerEvent(e.gfx,\"mousemove\",\"element.mousemove\"))})),e.on(\"element.out\",(function(e){n.unregisterEvent(e.gfx,\"mousemove\",\"element.mousemove\")})),e.on(\"element.updateId\",(function(e){var t=e.element,n=e.newId;if(t.waypoints){var i=s(t);i&&we(i,{\"data-element-id\":n})}})),this.addHandles=u,this.updateHandles=h,this.getBendpointsContainer=s,this.getSegmentDragger=c}Zp.$inject=[\"eventBus\",\"canvas\",\"interactionEvents\",\"bendpointMove\",\"connectionSegmentMove\"];var Qp=Math.round,Jp=\"reconnectStart\",el=\"reconnectEnd\",tl=\"updateWaypoints\";function nl(e,t,n,i,r,o){this._injector=e,this.start=function(e,t,o,a){var s,c=n.getGraphics(t),p=t.source,l=t.target,u=t.waypoints,h=(s=a||0!==o?a||o!==u.length-1?tl:el:Jp)===tl?\"connection.updateWaypoints\":\"connection.reconnect\",d=r.allowed(h,{connection:t,source:p,target:l});!1===d&&(d=r.allowed(h,{connection:t,source:l,target:p})),!1!==d&&i.init(e,\"bendpoint.move\",{data:{connection:t,connectionGfx:c,context:{allowed:d,bendpointIndex:o,connection:t,source:p,target:l,insert:a,type:s}}})},t.on(\"bendpoint.move.hover\",(function(e){var t,n=e.context,i=n.connection,o=i.source,a=i.target,s=e.hover,c=n.type;if(n.hover=s,s){var p=c===tl?\"connection.updateWaypoints\":\"connection.reconnect\";if(t=n.allowed=r.allowed(p,{connection:i,source:c===Jp?s:o,target:c===el?s:a}))return n.source=c===Jp?s:o,void(n.target=c===el?s:a);!1===t&&(t=n.allowed=r.allowed(p,{connection:i,source:c===el?s:a,target:c===Jp?s:o})),t&&(n.source=c===el?s:a,n.target=c===Jp?s:o)}})),t.on([\"bendpoint.move.out\",\"bendpoint.move.cleanup\"],(function(e){var t=e.context,n=t.type;t.hover=null,t.source=null,t.target=null,n!==tl&&(t.allowed=!1)})),t.on(\"bendpoint.move.end\",(function(e){var t=e.context,n=t.allowed,i=t.bendpointIndex,r=t.connection,a=t.insert,s=r.waypoints.slice(),c=t.source,p=t.target,l=t.type,u=t.hints||{},h={x:Qp(e.x),y:Qp(e.y)};if(!n)return!1;l===tl?(a?s.splice(i,0,h):s[i]=h,u.bendpointMove={insert:a,bendpointIndex:i},s=this.cropWaypoints(r,s),o.updateWaypoints(r,function(e){e=e.slice();for(var t,n,i,r=0;e[r];)t=e[r],n=e[r-1],0===Ct(t,i=e[r+1])||Rt(n,i,t)?e.splice(r,1):r++;return e}(s),u)):(l===Jp?(u.docking=\"source\",il(t)&&(u.docking=\"target\",u.newWaypoints=s.reverse())):l===el&&(u.docking=\"target\",il(t)&&(u.docking=\"source\",u.newWaypoints=s.reverse())),o.reconnect(r,c,p,h,u))}),this)}function il(e){var t=e.hover,n=e.source,i=e.target,r=e.type;return r===Jp?t&&i&&t===i&&n!==i:r===el?t&&n&&t===n&&n!==i:void 0}nl.$inject=[\"injector\",\"eventBus\",\"canvas\",\"dragging\",\"rules\",\"modeling\"],nl.prototype.cropWaypoints=function(e,t){var n=this._injector.get(\"connectionDocking\",!1);if(!n)return t;var i=e.waypoints;return e.waypoints=t,e.waypoints=n.getCroppedWaypoints(e),t=e.waypoints,e.waypoints=i,t};var rl=\"updateWaypoints\",ol=\"connect-ok\",al=\"connect-not-ok\",sl=\"connect-hover\",cl=\"djs-updating\",pl=\"djs-element-hidden\";function ll(e,t,n,i){this._injector=t;var r=t.get(\"connectionPreview\",!1);n.on(\"bendpoint.move.start\",(function(e){var t=e.context,n=t.bendpointIndex,r=t.connection,o=t.insert,a=r.waypoints,s=a.slice();t.waypoints=a,o&&s.splice(n,0,{x:e.x,y:e.y}),r.waypoints=s,Se(t.draggerGfx=Up(i.getLayer(\"overlays\"))).add(\"djs-dragging\"),i.addMarker(r,pl),i.addMarker(r,cl)})),n.on(\"bendpoint.move.hover\",(function(e){var t=e.context,n=t.allowed,r=t.hover,o=t.type;if(r){if(i.addMarker(r,sl),o===rl)return;n?(i.removeMarker(r,al),i.addMarker(r,ol)):!1===n&&(i.removeMarker(r,ol),i.addMarker(r,al))}})),n.on([\"bendpoint.move.out\",\"bendpoint.move.cleanup\"],1100,(function(e){var t=e.context,n=t.hover,r=t.target;n&&(i.removeMarker(n,sl),i.removeMarker(n,r?ol:al))})),n.on(\"bendpoint.move.move\",(function(t){var n=t.context,i=n.allowed,o=n.bendpointIndex,a=n.draggerGfx,s=n.hover,c=n.type,p=n.connection,l=p.source,u=p.target,h=p.waypoints.slice(),d={x:t.x,y:t.y},f=n.hints||{},m={};r&&(f.connectionStart&&(m.connectionStart=f.connectionStart),f.connectionEnd&&(m.connectionEnd=f.connectionEnd),\"reconnectStart\"===c?il(n)?(m.connectionEnd=m.connectionEnd||d,m.source=u,m.target=s||l,h=h.reverse()):(m.connectionStart=m.connectionStart||d,m.source=s||l,m.target=u):\"reconnectEnd\"===c?il(n)?(m.connectionStart=m.connectionStart||d,m.source=s||u,m.target=l,h=h.reverse()):(m.connectionEnd=m.connectionEnd||d,m.source=l,m.target=s||u):(m.noCropping=!0,m.noLayout=!0,h[o]=d),c===rl&&(h=e.cropWaypoints(p,h)),m.waypoints=h,r.drawPreview(n,i,m)),ii(a,t.x,t.y)}),this),n.on([\"bendpoint.move.end\",\"bendpoint.move.cancel\"],1100,(function(e){var t=e.context,n=t.connection,o=t.draggerGfx,a=t.hover,s=t.target,c=t.waypoints;n.waypoints=c,Re(o),i.removeMarker(n,cl),i.removeMarker(n,pl),a&&(i.removeMarker(a,ol),i.removeMarker(a,s?ol:al)),r&&r.cleanUp(t)}))}ll.$inject=[\"bendpointMove\",\"injector\",\"eventBus\",\"canvas\"];var ul=\"connect-hover\",hl=\"djs-updating\";function dl(e,t,n){return fl(e,t,e[t]+n)}function fl(e,t,n){return{x:\"x\"===t?n:e.x,y:\"y\"===t?n:e.y}}function ml(e){return\"x\"===e?\"y\":\"x\"}function vl(e,t,n){var i,r;return e.original?e.original:(i=_n(t),fl(e,r=ml(n),i[r]))}function yl(e,t,n,i,r,o){var a=e.get(\"connectionDocking\",!1);function s(e,t){if(!a)return t;var n,i=e.waypoints;return e.waypoints=t,n=a.getCroppedWaypoints(e),e.waypoints=i,n}function c(e){r.update(\"connection\",e.connection,e.connectionGfx)}function p(e,t,n){var i=e.newWaypoints,r=function(e,t,n,i){var r=Math.max(t[i],n[i]),o=Math.min(t[i],n[i]);return fl(t,i,Math.min(Math.max(o+20,e[i]),r-20))}(n,i[e.segmentStartIndex+t],i[e.segmentEndIndex+t],ml(e.axis));ii(e.draggerGfx,r.x,r.y)}this.start=function(e,t,r){var o,a,s,c,p=n.getGraphics(t),l=r-1,u=r,h=t.waypoints,d=h[l],f=h[u],m=Wp(n,h,e);(a=Tt(d,f))&&(s=\"v\"===a?\"x\":\"y\",0===l&&(d=vl(d,t.source,s)),u===h.length-1&&(f=vl(f,t.target,s)),o={connection:t,segmentStartIndex:l,segmentEndIndex:u,segmentStart:d,segmentEnd:f,axis:s,dragPosition:c=m?m.point:{x:(d.x+f.x)/2,y:(d.y+f.y)/2}},i.init(e,c,\"connectionSegment.move\",{cursor:\"x\"===s?\"resize-ew\":\"resize-ns\",data:{connection:t,connectionGfx:p,context:o}}))},t.on(\"connectionSegment.move.start\",(function(e){var t=e.context,i=e.connection,r=n.getLayer(\"overlays\");t.originalWaypoints=i.waypoints.slice(),t.draggerGfx=Kp(r,t.segmentStart,t.segmentEnd),Se(t.draggerGfx).add(\"djs-dragging\"),n.addMarker(i,hl)})),t.on(\"connectionSegment.move.move\",(function(e){var t,n,i=e.context,r=i.connection,o=i.segmentStartIndex,a=i.segmentEndIndex,l=i.segmentStart,u=i.segmentEnd,h=i.axis,d=i.originalWaypoints.slice(),f=dl(l,h,e[\"d\"+h]),m=dl(u,h,e[\"d\"+h]),v=d.length,y=0;d[o]=f,d[a]=m,o<2&&(t=wn(r.source,f),1===o?\"intersect\"===t&&(d.shift(),d[0]=f,y--):\"intersect\"!==t&&(d.unshift(l),y++)),a>v-3&&(n=wn(r.target,m),a===v-2?\"intersect\"===n&&(d.pop(),d[d.length-1]=m):\"intersect\"!==n&&d.push(u)),i.newWaypoints=r.waypoints=s(r,d),p(i,y,e),i.newSegmentStartIndex=o+y,c(e)})),t.on(\"connectionSegment.move.hover\",(function(e){e.context.hover=e.hover,n.addMarker(e.hover,ul)})),t.on([\"connectionSegment.move.out\",\"connectionSegment.move.cleanup\"],(function(e){var t=e.context.hover;t&&n.removeMarker(t,ul)})),t.on(\"connectionSegment.move.cleanup\",(function(e){var t=e.context,i=t.connection;t.draggerGfx&&Re(t.draggerGfx),n.removeMarker(i,hl)})),t.on([\"connectionSegment.move.cancel\",\"connectionSegment.move.end\"],(function(e){var t=e.context;t.connection.waypoints=t.originalWaypoints,c(e)})),t.on(\"connectionSegment.move.end\",(function(e){var t=e.context,n=t.connection,i=t.newWaypoints,r=t.newSegmentStartIndex;i=i.map((function(e){return{original:e.original,x:Math.round(e.x),y:Math.round(e.y)}}));var a=function(e,t){var n=0,i=e.filter((function(i,r){return!Rt(e[r-1],e[r+1],i)||(n=r<=t?n-1:n,!1)}));return{waypoints:i,segmentOffset:n}}(i,r),c=s(n,a.waypoints),p=a.segmentOffset,l={segmentMove:{segmentStartIndex:t.segmentStartIndex,newSegmentStartIndex:r+p}};o.updateWaypoints(n,c,l)}))}yl.$inject=[\"injector\",\"eventBus\",\"canvas\",\"dragging\",\"graphicsFactory\",\"modeling\"];var gl=Math.abs,bl=Math.round;function xl(e){return{x:e.x,y:e.y}}function _l(e){return{x:e.x+e.width,y:e.y+e.height}}function wl(e,t){return!e||isNaN(e.x)||isNaN(e.y)?t:{x:bl(e.x+e.width/2),y:bl(e.y+e.height/2)}}function El(e,t){var n=e.snapped;return!!n&&(\"string\"==typeof t?n[t]:n.x&&n.y)}function Sl(e,t,n){if(\"string\"!=typeof t)throw new Error(\"axis must be in [x, y]\");if(\"number\"!=typeof n&&!1!==n)throw new Error(\"value must be Number or false\");var i,r=e[t],o=e.snapped=e.snapped||{};return!1===n?o[t]=!1:(o[t]=!0,i=n-r,e[t]+=i,e[\"d\"+t]+=i),r}function Cl(e){return e.children||[]}var Rl=Math.abs,Pl=Math.round;function Tl(e){function t(e,t){if(p(e)){for(var n=e.length;n--;)if(Rl(e[n]-t)<=10)return e[n]}else{var i=t%(e=+e);if(i<10)return t-i;if(i>e-10)return t-i+e}return t}function n(e,t){return e.waypoints?Xp(t,e):e.width?{x:Pl(e.width/2+e.x),y:Pl(e.height/2+e.y)}:void 0}e.on(\"connectionSegment.move.move\",1500,(function(e){var i,r,o=function(e){var t=e.context,i=t.snapPoints,r=t.connection,o=r.waypoints,a=t.segmentStart,s=t.segmentStartIndex,c=t.segmentEnd,p=t.segmentEndIndex,l=t.axis;if(i)return i;var u=[o[s-1],a,c,o[p+1]];return s<2&&u.unshift(n(r.source,e)),p>o.length-3&&u.unshift(n(r.target,e)),t.snapPoints=i={horizontal:[],vertical:[]},g(u,(function(e){e&&(e=e.original||e,\"y\"===l&&i.horizontal.push(e.y),\"x\"===l&&i.vertical.push(e.x))})),i}(e),a=e.x,s=e.y;if(o){var c=a-(i=t(o.vertical,a)),p=s-(r=t(o.horizontal,s));L(e,{dx:e.dx-c,dy:e.dy-p,x:i,y:r}),(c||-1!==o.vertical.indexOf(a))&&Sl(e,\"x\",i),(p||-1!==o.horizontal.indexOf(s))&&Sl(e,\"y\",r)}})),e.on([\"connect.hover\",\"connect.move\",\"connect.end\"],1500,(function(e){var t=e.context.hover,i=t&&n(t,e);fn(t)&&i&&i.x&&i.y&&(Sl(e,\"x\",i.x),Sl(e,\"y\",i.y))})),e.on([\"bendpoint.move.move\",\"bendpoint.move.end\"],1500,(function(e){var i,r,o=e.context,a=function(e){var t=e.snapPoints,n=e.connection.waypoints,i=e.bendpointIndex;if(t)return t;var r=[n[i-1],n[i+1]];return e.snapPoints=t={horizontal:[],vertical:[]},g(r,(function(e){e&&(e=e.original||e,t.horizontal.push(e.y),t.vertical.push(e.x))})),t}(o),s=o.hover,c=s&&n(s,e),p=e.x,l=e.y;if(a){var u=p-(i=t(c?a.vertical.concat([c.x]):a.vertical,p)),h=l-(r=t(c?a.horizontal.concat([c.y]):a.horizontal,l));L(e,{dx:e.dx-u,dy:e.dy-h,x:e.x-u,y:e.y-h}),(u||-1!==a.vertical.indexOf(p))&&Sl(e,\"x\",i),(h||-1!==a.horizontal.indexOf(l))&&Sl(e,\"y\",r)}}))}Tl.$inject=[\"eventBus\"];var kl={__depends__:[Tp,Bp],__init__:[\"bendpoints\",\"bendpointSnapping\",\"bendpointMovePreview\"],bendpoints:[\"type\",Zp],bendpointMove:[\"type\",nl],bendpointMovePreview:[\"type\",ll],connectionSegmentMove:[\"type\",yl],bendpointSnapping:[\"type\",Tl]};function Al(e,t,n,i){function r(e,t){return i.allowed(\"connection.create\",{source:e,target:t})}e.on(\"connect.hover\",(function(e){var t,n=e.context,i=n.start,o=e.hover;if(n.hover=o,!c(t=n.canExecute=r(i,o))){if(!1!==t)return n.source=i,void(n.target=o);c(t=n.canExecute=r(o,i))||!1!==t&&(n.source=o,n.target=i)}})),e.on([\"connect.out\",\"connect.cleanup\"],(function(e){var t=e.context;t.hover=null,t.source=null,t.target=null,t.canExecute=!1})),e.on(\"connect.end\",(function(e){var t=e.context,i=t.canExecute,r=t.connectionStart,o={x:e.x,y:e.y},a=t.source,s=t.target;if(!i)return!1;var c=null,p={connectionStart:Ml(t)?o:r,connectionEnd:Ml(t)?r:o};l(i)&&(c=i),t.connection=n.connect(a,s,c,p)})),this.start=function(e,n,i,r){l(i)||(r=i,i=_n(n)),t.init(e,\"connect\",{autoActivate:r,data:{shape:n,context:{start:n,connectionStart:i}}})}}function Ml(e){var t=e.hover,n=e.source,i=e.target;return t&&n&&t===n&&n!==i}Al.$inject=[\"eventBus\",\"dragging\",\"modeling\",\"rules\"];var Dl=\"connect-ok\",Bl=\"connect-not-ok\";function Nl(e,t,n){var i=e.get(\"connectionPreview\",!1);i&&t.on(\"connect.move\",(function(e){var t=e.context,n=t.canExecute,r=t.hover,o=t.source,a=t.start,s=t.startPosition,c=t.target,p=t.connectionStart||s,l=t.connectionEnd||{x:e.x,y:e.y},u=p,h=l;Ml(t)&&(u=l,h=p),i.drawPreview(t,n,{source:o||a,target:c||r,connectionStart:u,connectionEnd:h})})),t.on(\"connect.hover\",900,(function(e){var t=e.context,i=e.hover,r=t.canExecute;null!==r&&n.addMarker(i,r?Dl:Bl)})),t.on([\"connect.out\",\"connect.cleanup\"],1100,(function(e){var t=e.hover;t&&(n.removeMarker(t,Dl),n.removeMarker(t,Bl))})),i&&t.on(\"connect.cleanup\",(function(e){i.cleanUp(e.context)}))}Nl.$inject=[\"injector\",\"eventBus\",\"canvas\"];var Ol={__depends__:[ta,Bp,Tp],__init__:[\"connectPreview\"],connect:[\"type\",Al],connectPreview:[\"type\",Nl]};function jl(e,t,n,i){this._canvas=t,this._graphicsFactory=n,this._elementFactory=i,this._connectionDocking=e.get(\"connectionDocking\",!1),this._layouter=e.get(\"layouter\",!1)}jl.$inject=[\"injector\",\"canvas\",\"graphicsFactory\",\"elementFactory\"],jl.prototype.drawPreview=function(e,t,n){n=n||{};var i,r,o,a=e.connectionPreviewGfx,s=e.getConnection,c=n.source,p=n.target,l=n.waypoints,u=n.connectionStart,h=n.connectionEnd,d=n.noLayout,f=n.noCropping,m=n.noNoop,v=this;a||(a=e.connectionPreviewGfx=this.createConnectionPreviewGfx()),Pe(a),s||(s=e.getConnection=(r=function(e,t,n){return v.getConnection(e,t,n)},o={},function(e){var t=JSON.stringify(e),n=o[t];return n||(n=o[t]=r.apply(null,arguments)),n})),t&&(i=s(t,c,p)),i?(i.waypoints=l||[],this._layouter&&!d&&(i.waypoints=this._layouter.layoutConnection(i,{source:c,target:p,connectionStart:u,connectionEnd:h,waypoints:n.waypoints||i.waypoints})),i.waypoints&&i.waypoints.length||(i.waypoints=[c?_n(c):u,p?_n(p):h]),this._connectionDocking&&(c||p)&&!f&&(i.waypoints=this._connectionDocking.getCroppedWaypoints(i,c,p)),this._graphicsFactory.drawConnection(a,i)):!m&&this.drawNoopPreview(a,n)},jl.prototype.drawNoopPreview=function(e,t){var n=t.source,i=t.target,r=t.connectionStart||_n(n),o=t.connectionEnd||_n(i),a=this.cropWaypoints(r,o,n,i);ge(e,this.createNoopConnection(a[0],a[1]))},jl.prototype.cropWaypoints=function(e,t,n,i){var r=this._graphicsFactory,o=n&&r.getShapePath(n),a=i&&r.getShapePath(i),s=r.getConnectionPath({waypoints:[e,t]});return[e=n&&En(o,s,!0)||e,t=i&&En(a,s,!1)||t]},jl.prototype.cleanUp=function(e){e&&e.connectionPreviewGfx&&Re(e.connectionPreviewGfx)},jl.prototype.getConnection=function(e){var t=function(e){return l(e)?e:{}}(e);return this._elementFactory.createConnection(t)},jl.prototype.createConnectionPreviewGfx=function(){var e=De(\"g\");return we(e,{pointerEvents:\"none\"}),Se(e).add(\"djs-connection-preview\"),ge(this._canvas.getActiveLayer(),e),e},jl.prototype.createNoopConnection=function(e,t){return pt([e,t],{stroke:\"#333\",strokeDasharray:[1],strokeWidth:2,\"pointer-events\":\"none\"})};var Ll={__init__:[\"connectionPreview\"],connectionPreview:[\"type\",jl]},Il=Math.min,$l=Math.max;function Fl(e){e.preventDefault()}function zl(e){e.stopPropagation()}function Hl(e){this.container=e.container,this.parent=de('<div class=\"djs-direct-editing-parent\"><div class=\"djs-direct-editing-content\" contenteditable=\"true\"></div></div>'),this.content=fe(\"[contenteditable]\",this.parent),this.keyHandler=e.keyHandler||function(){},this.resizeHandler=e.resizeHandler||function(){},this.autoResize=j(this.autoResize,this),this.handlePaste=j(this.handlePaste,this)}function Gl(e,t){this._eventBus=e,this._providers=[],this._textbox=new Hl({container:t.getContainer(),keyHandler:j(this._handleKey,this),resizeHandler:j(this._handleResize,this)})}Hl.prototype.create=function(e,t,n,i){var r=this.parent,o=this.content,a=this.container;i=this.options=i||{};var s=I(t=this.style=t||{},[\"width\",\"height\",\"maxWidth\",\"maxHeight\",\"minWidth\",\"minHeight\",\"left\",\"top\",\"backgroundColor\",\"position\",\"overflow\",\"border\",\"wordWrap\",\"textAlign\",\"outline\",\"transform\"]);L(r.style,{width:e.width+\"px\",height:e.height+\"px\",maxWidth:e.maxWidth+\"px\",maxHeight:e.maxHeight+\"px\",minWidth:e.minWidth+\"px\",minHeight:e.minHeight+\"px\",left:e.x+\"px\",top:e.y+\"px\",backgroundColor:\"#ffffff\",position:\"absolute\",overflow:\"visible\",border:\"1px solid #ccc\",boxSizing:\"border-box\",wordWrap:\"normal\",textAlign:\"center\",outline:\"none\"},s);var c=I(t,[\"fontFamily\",\"fontSize\",\"fontWeight\",\"lineHeight\",\"padding\",\"paddingTop\",\"paddingRight\",\"paddingBottom\",\"paddingLeft\"]);return L(o.style,{boxSizing:\"border-box\",width:\"100%\",outline:\"none\",wordWrap:\"break-word\"},c),i.centerVertically&&L(o.style,{position:\"absolute\",top:\"50%\",transform:\"translate(0, -50%)\"},c),o.innerText=n,ae.bind(o,\"keydown\",this.keyHandler),ae.bind(o,\"mousedown\",zl),ae.bind(o,\"paste\",this.handlePaste),i.autoResize&&ae.bind(o,\"input\",this.autoResize),i.resizable&&this.resizable(t),a.appendChild(r),this.setSelection(o.lastChild,o.lastChild&&o.lastChild.length),r},Hl.prototype.handlePaste=function(e){var t,n=this.options,i=this.style;if(e.preventDefault(),t=e.clipboardData?e.clipboardData.getData(\"text/plain\"):window.clipboardData.getData(\"Text\"),this.insertText(t),n.autoResize){var r=this.autoResize(i);r&&this.resizeHandler(r)}},Hl.prototype.insertText=function(e){e=e.replace(/\\r\\n|\\r|\\n/g,\"\\n\"),document.execCommand(\"insertText\",!1,e)||this._insertTextIE(e)},Hl.prototype._insertTextIE=function(e){var t,n,i,r=this.getSelection(),o=r.startContainer,a=r.endContainer,s=r.startOffset,c=r.endOffset,p=r.commonAncestorContainer,l=(t=p.childNodes,[].slice.call(t));if(function(e){return e.nodeType===Node.TEXT_NODE}(p)){var u=o.textContent;o.textContent=u.substring(0,s)+e+u.substring(c),n=o,i=s+e.length}else if(o===this.content&&a===this.content){var h=document.createTextNode(e);this.content.insertBefore(h,l[s]),n=h,i=h.textContent.length}else{var d=l.indexOf(o),f=l.indexOf(a);l.forEach((function(t,n){n===d?t.textContent=o.textContent.substring(0,s)+e+a.textContent.substring(c):n>d&&n<=f&&ve(t)})),n=o,i=s+e.length}n&&void 0!==i&&setTimeout((function(){self.setSelection(n,i)}))},Hl.prototype.autoResize=function(){var e=this.parent,t=this.content,n=parseInt(this.style.fontSize)||12;if(t.scrollHeight>e.offsetHeight||t.scrollHeight<e.offsetHeight-n){var i=e.getBoundingClientRect(),r=t.scrollHeight;e.style.height=r+\"px\",this.resizeHandler({width:i.width,height:i.height,dx:0,dy:r-i.height})}},Hl.prototype.resizable=function(){var e=this,t=this.parent,n=this.resizeHandle,i=parseInt(this.style.minWidth)||0,r=parseInt(this.style.minHeight)||0,o=parseInt(this.style.maxWidth)||1/0,a=parseInt(this.style.maxHeight)||1/0;if(!n){var s,c,p,l;n=this.resizeHandle=de('<div class=\"djs-direct-editing-resize-handle\"></div>');var u=function(n){Fl(n),zl(n);var u=Il($l(p+n.clientX-s,i),o),h=Il($l(l+n.clientY-c,r),a);t.style.width=u+\"px\",t.style.height=h+\"px\",e.resizeHandler({width:p,height:l,dx:n.clientX-s,dy:n.clientY-c})},h=function(e){Fl(e),zl(e),ae.unbind(document,\"mousemove\",u,!1),ae.unbind(document,\"mouseup\",h,!1)};ae.bind(n,\"mousedown\",(function(e){Fl(e),zl(e),s=e.clientX,c=e.clientY;var n=t.getBoundingClientRect();p=n.width,l=n.height,ae.bind(document,\"mousemove\",u),ae.bind(document,\"mouseup\",h)}))}L(n.style,{position:\"absolute\",bottom:\"0px\",right:\"0px\",cursor:\"nwse-resize\",width:\"0\",height:\"0\",borderTop:(parseInt(this.style.fontSize)/4||3)+\"px solid transparent\",borderRight:(parseInt(this.style.fontSize)/4||3)+\"px solid #ccc\",borderBottom:(parseInt(this.style.fontSize)/4||3)+\"px solid #ccc\",borderLeft:(parseInt(this.style.fontSize)/4||3)+\"px solid transparent\"}),t.appendChild(n)},Hl.prototype.destroy=function(){var e=this.parent,t=this.content,n=this.resizeHandle;t.innerText=\"\",e.removeAttribute(\"style\"),t.removeAttribute(\"style\"),ae.unbind(t,\"keydown\",this.keyHandler),ae.unbind(t,\"mousedown\",zl),ae.unbind(t,\"input\",this.autoResize),ae.unbind(t,\"paste\",this.handlePaste),n&&(n.removeAttribute(\"style\"),ve(n)),ve(e)},Hl.prototype.getValue=function(){return this.content.innerText.trim()},Hl.prototype.getSelection=function(){return window.getSelection().getRangeAt(0)},Hl.prototype.setSelection=function(e,t){var n=document.createRange();null===e?n.selectNodeContents(this.content):(n.setStart(e,t),n.setEnd(e,t));var i=window.getSelection();i.removeAllRanges(),i.addRange(n)},Gl.$inject=[\"eventBus\",\"canvas\"],Gl.prototype.registerProvider=function(e){this._providers.push(e)},Gl.prototype.isActive=function(e){return!(!this._active||e&&this._active.element!==e)},Gl.prototype.cancel=function(){this._active&&(this._fire(\"cancel\"),this.close())},Gl.prototype._fire=function(e,t){this._eventBus.fire(\"directEditing.\"+e,t||{active:this._active})},Gl.prototype.close=function(){this._textbox.destroy(),this._fire(\"deactivate\"),this._active=null,this.resizable=void 0},Gl.prototype.complete=function(){var e=this._active;if(e){var t,n=e.context.bounds,i=this.$textbox.getBoundingClientRect(),r=this.getValue();r===e.context.text&&i.height===n.height&&i.width===n.width||(t=this._textbox.container.getBoundingClientRect(),e.provider.update(e.element,r,e.context.text,{x:i.left-t.left,y:i.top-t.top,width:i.width,height:i.height})),this._fire(\"complete\"),this.close()}},Gl.prototype.getValue=function(){return this._textbox.getValue()},Gl.prototype._handleKey=function(e){e.stopPropagation();var t=e.keyCode||e.charCode;return 27===t?(e.preventDefault(),this.cancel()):13!==t||e.shiftKey?void 0:(e.preventDefault(),this.complete())},Gl.prototype._handleResize=function(e){this._fire(\"resize\",e)},Gl.prototype.activate=function(e){var t;this.isActive()&&this.cancel();var n=m(this._providers,(function(n){return(t=n.activate(e))?n:null}));return t&&(this.$textbox=this._textbox.create(t.bounds,t.style,t.text,t.options),this._active={element:e,context:t,provider:n},t.options&&t.options.resizable&&(this.resizable=!0),this._fire(\"activate\")),!!t};var Vl={__depends__:[Uo],__init__:[\"directEditing\"],directEditing:[\"type\",Gl]},Wl=[\"marker-start\",\"marker-mid\",\"marker-end\"],Ul=[\"circle\",\"ellipse\",\"line\",\"path\",\"polygon\",\"polyline\",\"path\",\"rect\"];function ql(e,t,n,i){this._elementRegistry=e,this._canvas=n,this._styles=i,this._clonedMarkers={};var r=this;t.on(\"drag.cleanup\",(function(){g(r._clonedMarkers,(function(e){Re(e)})),r._clonedMarkers={}}))}ql.$inject=[\"elementRegistry\",\"eventBus\",\"canvas\",\"styles\"],ql.prototype.getGfx=function(e){return this._elementRegistry.getGraphics(e)},ql.prototype.addDragger=function(e,t,n){var i=Te(n=n||this.getGfx(e)),r=n.getBoundingClientRect();return this._cloneMarkers(ti(i)),we(i,this._styles.cls(\"djs-dragger\",[],{x:r.top,y:r.left})),ge(t,i),i},ql.prototype.addFrame=function(e,t){var n=De(\"rect\",{class:\"djs-resize-overlay\",width:e.width,height:e.height,x:e.x,y:e.y});return ge(t,n),n},ql.prototype._cloneMarkers=function(e){var t=this;if(e.childNodes)for(var n=0;n<e.childNodes.length;n++)t._cloneMarkers(e.childNodes[n]);(function(e){return-1!==Ul.indexOf(e.nodeName)})(e)&&Wl.forEach((function(n){if(we(e,n)){var i=function(e,t,n){var i=(r=we(e,t),r.match(/url\\(['\"]?#([^'\"]*)['\"]?\\)/)[1]);var r;return fe(\"marker#\"+i,n||document)}(e,n,t._canvas.getContainer());t._cloneMarker(e,i,n)}}))},ql.prototype._cloneMarker=function(e,t,n){var i=t.id,r=this._clonedMarkers[i];if(!r){var o=i+\"-clone\";(r=Te(t)).id=o,Se(r).add(\"djs-dragger\").add(\"djs-dragger-marker\"),this._clonedMarkers[i]=r;var a=fe(\"defs\",this._canvas._svg);a||(a=De(\"defs\"),ge(this._canvas._svg,a)),ge(a,r)}we(e,n,\"url(#\"+this._clonedMarkers[i].id+\")\")};var Kl={__init__:[\"previewSupport\"],previewSupport:[\"type\",ql]},Yl=\"drop-ok\",Xl=\"drop-not-ok\",Zl=\"attach-ok\",Ql=\"new-parent\",Jl=\"create\";function eu(e,t,n,i,r){function o(t,n){[Zl,Yl,Xl,Ql].forEach((function(i){i===n?e.addMarker(t,i):e.removeMarker(t,i)}))}function a(){var e=t.context();e&&e.prefix===Jl&&t.cancel()}n.on([\"create.move\",\"create.hover\"],(function(e){var t=e.context,n=t.elements,i=e.hover,a=t.source,s=t.hints||{};if(!i)return t.canExecute=!1,void(t.target=null);tu(e);var c={x:e.x,y:e.y},p=t.canExecute=i&&function(e,t,n,i,o){if(!t)return!1;var a=m(e=y(e,(function(t){var n=t.labelTarget;return!(t.parent||mn(t)&&-1!==e.indexOf(n))})),(function(e){return!fn(e)})),s=!1,c=!1,p=!1;nu(e)&&(s=r.allowed(\"shape.attach\",{position:n,shape:a,target:t})),s||(p=nu(e)?r.allowed(\"shape.create\",{position:n,shape:a,source:i,target:t}):r.allowed(\"elements.create\",{elements:e,position:n,target:t}));var l=o.connectionTarget;return p||s?(a&&i&&(c=r.allowed(\"connection.create\",{source:l===i?a:i,target:l===i?i:a,hints:{targetParent:t,targetAttach:s}})),{attach:s,connect:c}):(null===p||null===s)&&null}(n,i,c,a,s);i&&null!==p&&(t.target=i,p&&p.attach?o(i,Zl):o(i,p?Ql:Xl))})),n.on([\"create.end\",\"create.out\",\"create.cleanup\"],(function(e){var t=e.hover;t&&o(t,null)})),n.on(\"create.end\",(function(e){var t=e.context,n=t.source,r=t.shape,o=t.elements,a=t.target,s=t.canExecute,c=s&&s.attach,p=s&&s.connect,l=t.hints||{};if(!1===s||!a)return!1;tu(e);var u={x:e.x,y:e.y};r=p?i.appendShape(n,r,u,a,{attach:c,connection:!0===p?{}:p,connectionTarget:l.connectionTarget}):m(o=i.createElements(o,u,a,L({},l,{attach:c})),(function(e){return!fn(e)})),L(t,{elements:o,shape:r}),L(e,{elements:o,shape:r})})),n.on(\"create.init\",(function(){n.on(\"elements.changed\",a),n.once([\"create.cancel\",\"create.end\"],2e3,(function(){n.off(\"elements.changed\",a)}))})),this.start=function(e,n,i){p(n)||(n=[n]);var r=m(n,(function(e){return!fn(e)}));if(r){i=L({elements:n,hints:{},shape:r},i||{}),g(n,(function(e){u(e.x)||(e.x=0),u(e.y)||(e.y=0)}));var o=vt(y(n,(function(e){return!e.hidden})));g(n,(function(e){fn(e)&&(e.waypoints=E(e.waypoints,(function(e){return{x:e.x-o.x-o.width/2,y:e.y-o.y-o.height/2}}))),L(e,{x:e.x-o.x-o.width/2,y:e.y-o.y-o.height/2})})),t.init(e,Jl,{cursor:\"grabbing\",autoActivate:!0,data:{shape:r,elements:n,context:i}})}}}function tu(e){var t=e.context.createConstraints;t&&(t.left&&(e.x=Math.max(e.x,t.left)),t.right&&(e.x=Math.min(e.x,t.right)),t.top&&(e.y=Math.max(e.y,t.top)),t.bottom&&(e.y=Math.min(e.y,t.bottom)))}function nu(e){return e&&1===e.length&&!fn(e[0])}eu.$inject=[\"canvas\",\"dragging\",\"eventBus\",\"modeling\",\"rules\"];function iu(e,t,n,i,r){t.on(\"create.move\",750,(function(t){var o=t.hover,a=t.context,s=a.elements,c=a.dragGroup;c||(c=a.dragGroup=function(e){var t=De(\"g\");we(t,r.cls(\"djs-drag-group\",[\"no-events\"]));var o=De(\"g\");return e.forEach((function(e){var r;e.hidden||(e.waypoints?(r=n._createContainer(\"connection\",o),n.drawConnection(ti(r),e)):(r=n._createContainer(\"shape\",o),n.drawShape(ti(r),e),ii(r,e.x,e.y)),i.addDragger(e,t,r))})),t}(s)),o?(c.parentNode||ge(e.getActiveLayer(),c),ii(c,t.x,t.y)):Re(c)})),t.on(\"create.cleanup\",(function(e){var t=e.context.dragGroup;t&&Re(t)}))}iu.$inject=[\"canvas\",\"eventBus\",\"graphicsFactory\",\"previewSupport\",\"styles\"];var ru={__depends__:[Tp,Kl,Bp,ta],__init__:[\"create\",\"createPreview\"],create:[\"type\",eu],createPreview:[\"type\",iu]};function ou(){}ou.prototype.get=function(){return this._data},ou.prototype.set=function(e){this._data=e},ou.prototype.clear=function(){var e=this._data;return delete this._data,e},ou.prototype.isEmpty=function(){return!this._data};var au={clipboard:[\"type\",ou]};function su(e){var t=this;function n(e){t._lastMoveEvent=e}this._lastMoveEvent=null,e.on(\"canvas.init\",(function(e){(t._svg=e.svg).addEventListener(\"mousemove\",n)})),e.on(\"canvas.destroy\",(function(){t._lastMouseEvent=null,t._svg.removeEventListener(\"mousemove\",n)}))}su.$inject=[\"eventBus\"],su.prototype.getLastMoveEvent=function(){return this._lastMoveEvent||function(e,t){var n=document.createEvent(\"MouseEvent\"),i=e,r=t,o=e,a=t;n.initMouseEvent&&n.initMouseEvent(\"mousemove\",!0,!0,window,0,i,r,o,a,!1,!1,!1,!1,0,null);return n}(0,0)};var cu={__init__:[\"mouse\"],mouse:[\"type\",su]};function pu(e,t,n,i,r,o,a,s){this._canvas=e,this._create=t,this._clipboard=n,this._elementFactory=i,this._eventBus=r,this._modeling=o,this._mouse=a,this._rules=s,r.on(\"copyPaste.copyElement\",(function(e){var t=e.descriptor,n=e.element,i=e.elements;t.priority=1,t.id=n.id;var r=m(i,(function(e){return e===n.parent}));r&&(t.parent=n.parent.id),function(e){return!!e.host}(n)&&(t.priority=2,t.host=n.host.id),fn(n)&&(t.priority=3,t.source=n.source.id,t.target=n.target.id,t.waypoints=function(e){return E(e.waypoints,(function(e){return(e=lu(e)).original&&(e.original=lu(e.original)),e}))}(n)),mn(n)&&(t.priority=4,t.labelTarget=n.labelTarget.id),g([\"x\",\"y\",\"width\",\"height\"],(function(e){u(n[e])&&(t[e]=n[e])})),t.hidden=n.hidden,t.collapsed=n.collapsed})),r.on(\"copyPaste.pasteElements\",(function(e){L(e.hints,{createElementsBehavior:!1})}))}function lu(e){return L({},e)}function uu(e,t){var n=t.indexOf(e);return-1===n?t:t.splice(n,1)}pu.$inject=[\"canvas\",\"create\",\"clipboard\",\"elementFactory\",\"eventBus\",\"modeling\",\"mouse\",\"rules\"],pu.prototype.copy=function(e){var t,n;return p(e)||(e=e?[e]:[]),n=!1===(t=this._eventBus.fire(\"copyPaste.canCopyElements\",{elements:e}))?{}:this.createTree(p(t)?t:e),this._clipboard.set(n),this._eventBus.fire(\"copyPaste.elementsCopied\",{elements:e,tree:n}),n},pu.prototype.paste=function(e){var t=this._clipboard.get();if(!this._clipboard.isEmpty()){var n=e&&e.hints||{};this._eventBus.fire(\"copyPaste.pasteElements\",{hints:n});var i=this._createElements(t);if(e&&e.element&&e.point)return this._paste(i,e.element,e.point,n);this._create.start(this._mouse.getLastMoveEvent(),i,{hints:n||{}})}},pu.prototype._paste=function(e,t,n,i){g(e,(function(e){u(e.x)||(e.x=0),u(e.y)||(e.y=0)}));var r=vt(e);return g(e,(function(e){fn(e)&&(e.waypoints=E(e.waypoints,(function(e){return{x:e.x-r.x-r.width/2,y:e.y-r.y-r.height/2}}))),L(e,{x:e.x-r.x-r.width/2,y:e.y-r.y-r.height/2})})),this._modeling.createElements(e,n,t,L({},i))},pu.prototype._createElements=function(e){var t=this,n=this._eventBus,i={},r=[];return g(e,(function(e,o){g(e=k(e,\"priority\"),(function(e){var o,a=L({},$(e,[\"priority\"]));return i[e.parent]?a.parent=i[e.parent]:delete a.parent,n.fire(\"copyPaste.pasteElement\",{cache:i,descriptor:a}),fn(a)?(a.source=i[e.source],a.target=i[e.target],o=i[e.id]=t.createConnection(a),void r.push(o)):mn(a)?(a.labelTarget=i[a.labelTarget],o=i[e.id]=t.createLabel(a),void r.push(o)):(a.host&&(a.host=i[a.host]),o=i[e.id]=t.createShape(a),void r.push(o))}))})),r},pu.prototype.createConnection=function(e){return this._elementFactory.createConnection($(e,[\"id\"]))},pu.prototype.createLabel=function(e){return this._elementFactory.createLabel($(e,[\"id\"]))},pu.prototype.createShape=function(e){return this._elementFactory.createShape($(e,[\"id\"]))},pu.prototype.hasRelations=function(e,t){var n,i;return!(fn(e)&&(n=m(t,A({id:e.source.id})),i=m(t,A({id:e.target.id})),!n||!i))&&!(mn(e)&&!m(t,A({id:e.labelTarget.id})))},pu.prototype.createTree=function(e){var t=this._rules,n=this,i={},r=[];function o(e,t){var n=m(r,(function(t){return e===t.element}));n?n.depth<t&&(r=function(e,t){var n=t.indexOf(e);-1!==n&&t.splice(n,1);return t}(n,r),r.push({element:n.element,depth:t})):r.push({element:e,depth:t})}return ft(ut(e),(function(e,t,i){if(!mn(e)){g(e.labels,(function(e){o(e,i)})),g([e.attachers,e.incoming,e.outgoing],(function(e){e&&e.length&&g(e,(function(e){g(e.labels,(function(e){o(e,i)})),o(e,i)}))})),o(e,i);var r=[];return e.children&&(r=e.children.slice()),n._eventBus.fire(\"copyPaste.createTree\",{element:e,children:r}),r}})),e=E(r,(function(e){return e.element})),r=E(r,(function(t){return t.descriptor={},n._eventBus.fire(\"copyPaste.copyElement\",{descriptor:t.descriptor,element:t.element,elements:e}),t})),r=k(r,(function(e){return e.descriptor.priority})),e=E(r,(function(e){return e.element})),g(r,(function(r){var o=r.depth;n.hasRelations(r.element,e)?!function(e,n){return t.allowed(\"element.copy\",{element:e,elements:n})}(r.element,e)?uu(r.element,e):(i[o]||(i[o]=[]),i[o].push(r.descriptor)):uu(r.element,e)})),i};var hu={__depends__:[au,ru,cu,Bp],__init__:[\"copyPaste\"],copyPaste:[\"type\",pu]};function du(e,t,n){p(n)||(n=[n]),g(n,(function(n){a(e[n])||(t[n]=e[n])}))}function fu(e,t,n){function i(t,i){var r=e.create(t.$type);return n.copyElement(t,r,null,i)}t.on(\"copyPaste.copyElement\",750,(function(e){var t=e.descriptor,n=e.element,r=Br(n);if(mn(n))return t;var o=t.businessObject=i(r,!0),a=t.di=i(Nr(n),!0);a.bpmnElement=o,du(o,t,\"name\"),du(a,t,\"isExpanded\"),r.default&&(t.default=r.default.id)}));var r=\"-bpmn-js-refs\";t.on(\"copyPaste.pasteElement\",(function(e){var t=e.cache,n=e.descriptor,r=n.businessObject,o=n.di;if(mn(n))return n.businessObject=Br(t[n.labelTarget]),void(n.di=Nr(t[n.labelTarget]));r=n.businessObject=i(r),(o=n.di=i(o)).bpmnElement=r,du(n,r,[\"isExpanded\",\"name\"]),n.type=r.$type})),t.on(\"copyPaste.copyElement\",750,(function(e){var t=e.descriptor,n=e.element;if(Mr(n,\"bpmn:Participant\")){var r=Br(n);r.processRef&&(t.processRef=i(r.processRef,!0))}})),t.on(\"copyPaste.pasteElement\",(function(e){var t=e.descriptor,n=t.processRef;n&&(t.processRef=i(n))})),t.on(\"copyPaste.pasteElement\",750,(function(e){var t=e.cache;!function(e,t){e[r]=t}(t,function(e,t,n){var i=Br(e);return e.default&&(n[e.default]={element:i,property:\"default\"}),e.host&&(Br(e).attachedToRef=Br(t[e.host])),$(n,x(n,(function(t,n,r){var o=n.element,a=n.property;return r===e.id&&(o[a]=i,t.push(e.id)),t}),[]))}(e.descriptor,t,function(e){return e[r]=e[r]||{}}(t)))}))}fu.$inject=[\"bpmnFactory\",\"eventBus\",\"moddleCopy\"];var mu=[\"artifacts\",\"dataInputAssociations\",\"dataOutputAssociations\",\"default\",\"flowElements\",\"lanes\",\"incoming\",\"outgoing\",\"categoryValue\"];function vu(e,t,n){this._bpmnFactory=t,this._eventBus=e,this._moddle=n,e.on(\"moddleCopy.canCopyProperties\",(function(e){var t=e.propertyNames;if(t&&t.length)return k(t,(function(e){return\"extensionElements\"===e}))})),e.on(\"moddleCopy.canCopyProperty\",(function(e){var t=e.parent,n=l(t)&&t.$descriptor,i=e.propertyName;return(!i||-1===mu.indexOf(i))&&(!(i&&n&&!m(n.properties,A({name:i})))&&void 0)})),e.on(\"moddleCopy.canSetCopiedProperty\",(function(e){var t,n,i=e.property;if(n=\"bpmn:ExtensionElements\",(t=i)&&h(t.$instanceOf)&&t.$instanceOf(n)&&(!i.values||!i.values.length))return!1}))}function yu(e,t){return x(e.properties,(function(e,n){return t&&n.default?e:e.concat(n.name)}),[])}vu.$inject=[\"eventBus\",\"bpmnFactory\",\"moddle\"],vu.prototype.copyElement=function(e,t,n,i=!1){var r=this;n&&!p(n)&&(n=[n]),n=n||yu(e.$descriptor);var o=this._eventBus.fire(\"moddleCopy.canCopyProperties\",{propertyNames:n,sourceElement:e,targetElement:t,clone:i});return!1===o||(p(o)&&(n=o),g(n,(function(n){var o;f(e,n)&&(o=e.get(n));var a=r.copyProperty(o,t,n,i);s(a)&&(!1!==r._eventBus.fire(\"moddleCopy.canSetCopiedProperty\",{parent:t,property:a,propertyName:n})&&t.set(n,a))}))),t},vu.prototype.copyProperty=function(e,t,n,i=!1){var r=this,o=this._eventBus.fire(\"moddleCopy.canCopyProperty\",{parent:t,property:e,propertyName:n,clone:i});if(!1!==o){if(o)return l(o)&&o.$type&&!o.$parent&&(o.$parent=t),o;var a=this._moddle.getPropertyDescriptor(t,n);if(!a.isReference){if(a.isId)return e&&this._copyId(e,t,i);if(p(e))return x(e,(function(e,a){return(o=r.copyProperty(a,t,n,i))?e.concat(o):e}),[]);if(l(e)&&e.$type){if(this._moddle.getElementDescriptor(e).isGeneric)return;return(o=r._bpmnFactory.create(e.$type)).$parent=t,o=r.copyElement(e,o,null,i)}return e}}},vu.prototype._copyId=function(e,t,n=!1){return n?e:this._moddle.ids.assigned(e)?void 0:(this._moddle.ids.claim(e,t),e)};var gu={__depends__:[hu],__init__:[\"bpmnCopyPaste\",\"moddleCopy\"],bpmnCopyPaste:[\"type\",fu],moddleCopy:[\"type\",vu]},bu=Math.round;function xu(e,t){this._modeling=e,this._eventBus=t}function _u(e,t){t.on(\"replace.end\",500,(function(t){const{newElement:n,hints:i={}}=t;!1!==i.select&&e.select(n)}))}xu.$inject=[\"modeling\",\"eventBus\"],xu.prototype.replaceElement=function(e,t,n){if(e.waypoints)return null;var i=this._modeling,r=this._eventBus;r.fire(\"replace.start\",{element:e,attrs:t,hints:n});var o=t.width||e.width,a=t.height||e.height,s=t.x||e.x,c=t.y||e.y,p=bu(s+o/2),l=bu(c+a/2),u=i.replaceShape(e,L({},t,{x:p,y:l,width:o,height:a}),n);return r.fire(\"replace.end\",{element:e,newElement:u,hints:n}),u},_u.$inject=[\"selection\",\"eventBus\"];var wu={__init__:[\"replace\",\"replaceSelectionBehavior\"],replaceSelectionBehavior:[\"type\",_u],replace:[\"type\",xu]};var Eu=[\"cancelActivity\",\"instantiate\",\"eventGatewayType\",\"triggeredByEvent\",\"isInterrupting\"];function Su(e,t,n,i,r,o){this.replaceElement=function(s,c,l){l=l||{};var u=c.type,h=s.businessObject;if(Cu(h)&&\"bpmn:SubProcess\"===u&&function(e,t){var n=e&&f(e,\"collapsed\")?e.collapsed:!Zr(e);return n!==(t&&(f(t,\"collapsed\")||f(t,\"isExpanded\"))?f(t,\"collapsed\")?t.collapsed:!t.isExpanded:n)}(s,c))return i.toggleCollapse(s),s;var d=e.create(u),m={type:u,businessObject:d,di:{}};!function(e,t,n){p(n)||(n=[n]),g(n,(function(n){a(e[n])||(t[n]=e[n])}))}(s.di,m.di,[\"fill\",\"stroke\",\"background-color\",\"border-color\",\"color\"]);var v=function(e,t){return e.filter((function(e){return t.includes(e)}))}(yu(h.$descriptor),yu(d.$descriptor,!0));L(d,I(c,Eu));var b=y(v,(function(e){return\"eventDefinitions\"===e?Ru(s,c.eventDefinitionType):\"loopCharacteristics\"===e?!Qr(d):!f(d,e)&&((\"processRef\"!==e||!1!==c.isExpanded)&&\"triggeredByEvent\"!==e)}));if(d=n.copyElement(h,d,b),c.eventDefinitionType&&(Ru(d,c.eventDefinitionType)||(m.eventDefinitionType=c.eventDefinitionType,m.eventDefinitionAttrs=c.eventDefinitionAttrs)),Mr(h,\"bpmn:Activity\")){if(Cu(h))m.isExpanded=Zr(s);else if(c&&f(c,\"isExpanded\")){m.isExpanded=c.isExpanded;var x=t.getDefaultSize(d,{isExpanded:m.isExpanded});m.width=x.width,m.height=x.height,m.x=s.x-(m.width-s.width)/2,m.y=s.y-(m.height-s.height)/2}Zr(s)&&!Mr(h,\"bpmn:Task\")&&m.isExpanded&&(m.width=s.width,m.height=s.height)}return Cu(h)&&!Cu(d)&&(l.moveChildren=!1),Mr(h,\"bpmn:Participant\")&&(!0===c.isExpanded?d.processRef=e.create(\"bpmn:Process\"):l.moveChildren=!1,m.width=s.width,m.height=t.getDefaultSize(m).height),o.allowed(\"shape.resize\",{shape:d})||(m.height=t.getDefaultSize(m).height,m.width=t.getDefaultSize(m).width),d.name=h.name,Dr(h,[\"bpmn:ExclusiveGateway\",\"bpmn:InclusiveGateway\",\"bpmn:Activity\"])&&Dr(d,[\"bpmn:ExclusiveGateway\",\"bpmn:InclusiveGateway\",\"bpmn:Activity\"])&&(d.default=h.default),c.host&&!Mr(h,\"bpmn:BoundaryEvent\")&&Mr(d,\"bpmn:BoundaryEvent\")&&(m.host=c.host),\"bpmn:DataStoreReference\"!==m.type&&\"bpmn:DataObjectReference\"!==m.type||(m.x=s.x+(s.width-m.width)/2),r.replaceElement(s,m,l)}}function Cu(e){return Mr(e,\"bpmn:SubProcess\")}function Ru(e,t){var n=Br(e);return t&&n.get(\"eventDefinitions\").some((function(e){return Mr(e,t)}))}Su.$inject=[\"bpmnFactory\",\"elementFactory\",\"moddleCopy\",\"modeling\",\"replace\",\"rules\"];var Pu={__depends__:[gu,wu,ta],bpmnReplace:[\"type\",Su]};function Tu(e){return function(t){var n=t.target,i=Br(e),r=i.eventDefinitions&&i.eventDefinitions[0],o=i.$type===n.type,a=(r&&r.$type)===n.eventDefinitionType,s=!!n.triggeredByEvent==!!i.triggeredByEvent,c=void 0===n.isExpanded||n.isExpanded===Zr(e);return!(o&&a&&s&&c)}}var ku=[{label:\"Start Event\",actionName:\"replace-with-none-start\",className:\"bpmn-icon-start-event-none\",target:{type:\"bpmn:StartEvent\"}},{label:\"Intermediate Throw Event\",actionName:\"replace-with-none-intermediate-throwing\",className:\"bpmn-icon-intermediate-event-none\",target:{type:\"bpmn:IntermediateThrowEvent\"}},{label:\"End Event\",actionName:\"replace-with-none-end\",className:\"bpmn-icon-end-event-none\",target:{type:\"bpmn:EndEvent\"}},{label:\"Message Start Event\",actionName:\"replace-with-message-start\",className:\"bpmn-icon-start-event-message\",target:{type:\"bpmn:StartEvent\",eventDefinitionType:\"bpmn:MessageEventDefinition\"}},{label:\"Timer Start Event\",actionName:\"replace-with-timer-start\",className:\"bpmn-icon-start-event-timer\",target:{type:\"bpmn:StartEvent\",eventDefinitionType:\"bpmn:TimerEventDefinition\"}},{label:\"Conditional Start Event\",actionName:\"replace-with-conditional-start\",className:\"bpmn-icon-start-event-condition\",target:{type:\"bpmn:StartEvent\",eventDefinitionType:\"bpmn:ConditionalEventDefinition\"}},{label:\"Signal Start Event\",actionName:\"replace-with-signal-start\",className:\"bpmn-icon-start-event-signal\",target:{type:\"bpmn:StartEvent\",eventDefinitionType:\"bpmn:SignalEventDefinition\"}}],Au=[{label:\"Start Event\",actionName:\"replace-with-none-start\",className:\"bpmn-icon-start-event-none\",target:{type:\"bpmn:StartEvent\"}},{label:\"Intermediate Throw Event\",actionName:\"replace-with-none-intermediate-throwing\",className:\"bpmn-icon-intermediate-event-none\",target:{type:\"bpmn:IntermediateThrowEvent\"}},{label:\"End Event\",actionName:\"replace-with-none-end\",className:\"bpmn-icon-end-event-none\",target:{type:\"bpmn:EndEvent\"}}],Mu=[{label:\"Start Event\",actionName:\"replace-with-none-start\",className:\"bpmn-icon-start-event-none\",target:{type:\"bpmn:StartEvent\"}},{label:\"Intermediate Throw Event\",actionName:\"replace-with-none-intermediate-throw\",className:\"bpmn-icon-intermediate-event-none\",target:{type:\"bpmn:IntermediateThrowEvent\"}},{label:\"End Event\",actionName:\"replace-with-none-end\",className:\"bpmn-icon-end-event-none\",target:{type:\"bpmn:EndEvent\"}},{label:\"Message Intermediate Catch Event\",actionName:\"replace-with-message-intermediate-catch\",className:\"bpmn-icon-intermediate-event-catch-message\",target:{type:\"bpmn:IntermediateCatchEvent\",eventDefinitionType:\"bpmn:MessageEventDefinition\"}},{label:\"Message Intermediate Throw Event\",actionName:\"replace-with-message-intermediate-throw\",className:\"bpmn-icon-intermediate-event-throw-message\",target:{type:\"bpmn:IntermediateThrowEvent\",eventDefinitionType:\"bpmn:MessageEventDefinition\"}},{label:\"Timer Intermediate Catch Event\",actionName:\"replace-with-timer-intermediate-catch\",className:\"bpmn-icon-intermediate-event-catch-timer\",target:{type:\"bpmn:IntermediateCatchEvent\",eventDefinitionType:\"bpmn:TimerEventDefinition\"}},{label:\"Escalation Intermediate Throw Event\",actionName:\"replace-with-escalation-intermediate-throw\",className:\"bpmn-icon-intermediate-event-throw-escalation\",target:{type:\"bpmn:IntermediateThrowEvent\",eventDefinitionType:\"bpmn:EscalationEventDefinition\"}},{label:\"Conditional Intermediate Catch Event\",actionName:\"replace-with-conditional-intermediate-catch\",className:\"bpmn-icon-intermediate-event-catch-condition\",target:{type:\"bpmn:IntermediateCatchEvent\",eventDefinitionType:\"bpmn:ConditionalEventDefinition\"}},{label:\"Link Intermediate Catch Event\",actionName:\"replace-with-link-intermediate-catch\",className:\"bpmn-icon-intermediate-event-catch-link\",target:{type:\"bpmn:IntermediateCatchEvent\",eventDefinitionType:\"bpmn:LinkEventDefinition\",eventDefinitionAttrs:{name:\"\"}}},{label:\"Link Intermediate Throw Event\",actionName:\"replace-with-link-intermediate-throw\",className:\"bpmn-icon-intermediate-event-throw-link\",target:{type:\"bpmn:IntermediateThrowEvent\",eventDefinitionType:\"bpmn:LinkEventDefinition\",eventDefinitionAttrs:{name:\"\"}}},{label:\"Compensation Intermediate Throw Event\",actionName:\"replace-with-compensation-intermediate-throw\",className:\"bpmn-icon-intermediate-event-throw-compensation\",target:{type:\"bpmn:IntermediateThrowEvent\",eventDefinitionType:\"bpmn:CompensateEventDefinition\"}},{label:\"Signal Intermediate Catch Event\",actionName:\"replace-with-signal-intermediate-catch\",className:\"bpmn-icon-intermediate-event-catch-signal\",target:{type:\"bpmn:IntermediateCatchEvent\",eventDefinitionType:\"bpmn:SignalEventDefinition\"}},{label:\"Signal Intermediate Throw Event\",actionName:\"replace-with-signal-intermediate-throw\",className:\"bpmn-icon-intermediate-event-throw-signal\",target:{type:\"bpmn:IntermediateThrowEvent\",eventDefinitionType:\"bpmn:SignalEventDefinition\"}}],Du=[{label:\"Start Event\",actionName:\"replace-with-none-start\",className:\"bpmn-icon-start-event-none\",target:{type:\"bpmn:StartEvent\"}},{label:\"Intermediate Throw Event\",actionName:\"replace-with-none-intermediate-throw\",className:\"bpmn-icon-intermediate-event-none\",target:{type:\"bpmn:IntermediateThrowEvent\"}},{label:\"End Event\",actionName:\"replace-with-none-end\",className:\"bpmn-icon-end-event-none\",target:{type:\"bpmn:EndEvent\"}},{label:\"Message End Event\",actionName:\"replace-with-message-end\",className:\"bpmn-icon-end-event-message\",target:{type:\"bpmn:EndEvent\",eventDefinitionType:\"bpmn:MessageEventDefinition\"}},{label:\"Escalation End Event\",actionName:\"replace-with-escalation-end\",className:\"bpmn-icon-end-event-escalation\",target:{type:\"bpmn:EndEvent\",eventDefinitionType:\"bpmn:EscalationEventDefinition\"}},{label:\"Error End Event\",actionName:\"replace-with-error-end\",className:\"bpmn-icon-end-event-error\",target:{type:\"bpmn:EndEvent\",eventDefinitionType:\"bpmn:ErrorEventDefinition\"}},{label:\"Cancel End Event\",actionName:\"replace-with-cancel-end\",className:\"bpmn-icon-end-event-cancel\",target:{type:\"bpmn:EndEvent\",eventDefinitionType:\"bpmn:CancelEventDefinition\"}},{label:\"Compensation End Event\",actionName:\"replace-with-compensation-end\",className:\"bpmn-icon-end-event-compensation\",target:{type:\"bpmn:EndEvent\",eventDefinitionType:\"bpmn:CompensateEventDefinition\"}},{label:\"Signal End Event\",actionName:\"replace-with-signal-end\",className:\"bpmn-icon-end-event-signal\",target:{type:\"bpmn:EndEvent\",eventDefinitionType:\"bpmn:SignalEventDefinition\"}},{label:\"Terminate End Event\",actionName:\"replace-with-terminate-end\",className:\"bpmn-icon-end-event-terminate\",target:{type:\"bpmn:EndEvent\",eventDefinitionType:\"bpmn:TerminateEventDefinition\"}}],Bu=[{label:\"Exclusive Gateway\",actionName:\"replace-with-exclusive-gateway\",className:\"bpmn-icon-gateway-xor\",target:{type:\"bpmn:ExclusiveGateway\"}},{label:\"Parallel Gateway\",actionName:\"replace-with-parallel-gateway\",className:\"bpmn-icon-gateway-parallel\",target:{type:\"bpmn:ParallelGateway\"}},{label:\"Inclusive Gateway\",actionName:\"replace-with-inclusive-gateway\",className:\"bpmn-icon-gateway-or\",target:{type:\"bpmn:InclusiveGateway\"}},{label:\"Complex Gateway\",actionName:\"replace-with-complex-gateway\",className:\"bpmn-icon-gateway-complex\",target:{type:\"bpmn:ComplexGateway\"}},{label:\"Event based Gateway\",actionName:\"replace-with-event-based-gateway\",className:\"bpmn-icon-gateway-eventbased\",target:{type:\"bpmn:EventBasedGateway\",instantiate:!1,eventGatewayType:\"Exclusive\"}}],Nu=[{label:\"Transaction\",actionName:\"replace-with-transaction\",className:\"bpmn-icon-transaction\",target:{type:\"bpmn:Transaction\",isExpanded:!0}},{label:\"Event Sub Process\",actionName:\"replace-with-event-subprocess\",className:\"bpmn-icon-event-subprocess-expanded\",target:{type:\"bpmn:SubProcess\",triggeredByEvent:!0,isExpanded:!0}},{label:\"Sub Process (collapsed)\",actionName:\"replace-with-collapsed-subprocess\",className:\"bpmn-icon-subprocess-collapsed\",target:{type:\"bpmn:SubProcess\",isExpanded:!1}}],Ou=[{label:\"Transaction\",actionName:\"replace-with-transaction\",className:\"bpmn-icon-transaction\",target:{type:\"bpmn:Transaction\",isExpanded:!0}},{label:\"Sub Process\",actionName:\"replace-with-subprocess\",className:\"bpmn-icon-subprocess-expanded\",target:{type:\"bpmn:SubProcess\",isExpanded:!0}},{label:\"Event Sub Process\",actionName:\"replace-with-event-subprocess\",className:\"bpmn-icon-event-subprocess-expanded\",target:{type:\"bpmn:SubProcess\",triggeredByEvent:!0,isExpanded:!0}}],ju=Ou,Lu=[{label:\"Task\",actionName:\"replace-with-task\",className:\"bpmn-icon-task\",target:{type:\"bpmn:Task\"}},{label:\"User Task\",actionName:\"replace-with-user-task\",className:\"bpmn-icon-user\",target:{type:\"bpmn:UserTask\"}},{label:\"Service Task\",actionName:\"replace-with-service-task\",className:\"bpmn-icon-service\",target:{type:\"bpmn:ServiceTask\"}},{label:\"Send Task\",actionName:\"replace-with-send-task\",className:\"bpmn-icon-send\",target:{type:\"bpmn:SendTask\"}},{label:\"Receive Task\",actionName:\"replace-with-receive-task\",className:\"bpmn-icon-receive\",target:{type:\"bpmn:ReceiveTask\"}},{label:\"Manual Task\",actionName:\"replace-with-manual-task\",className:\"bpmn-icon-manual\",target:{type:\"bpmn:ManualTask\"}},{label:\"Business Rule Task\",actionName:\"replace-with-rule-task\",className:\"bpmn-icon-business-rule\",target:{type:\"bpmn:BusinessRuleTask\"}},{label:\"Script Task\",actionName:\"replace-with-script-task\",className:\"bpmn-icon-script\",target:{type:\"bpmn:ScriptTask\"}},{label:\"Call Activity\",actionName:\"replace-with-call-activity\",className:\"bpmn-icon-call-activity\",target:{type:\"bpmn:CallActivity\"}},{label:\"Sub Process (collapsed)\",actionName:\"replace-with-collapsed-subprocess\",className:\"bpmn-icon-subprocess-collapsed\",target:{type:\"bpmn:SubProcess\",isExpanded:!1}},{label:\"Sub Process (expanded)\",actionName:\"replace-with-expanded-subprocess\",className:\"bpmn-icon-subprocess-expanded\",target:{type:\"bpmn:SubProcess\",isExpanded:!0}}],Iu=[{label:\"Data Store Reference\",actionName:\"replace-with-data-store-reference\",className:\"bpmn-icon-data-store\",target:{type:\"bpmn:DataStoreReference\"}}],$u=[{label:\"Data Object Reference\",actionName:\"replace-with-data-object-reference\",className:\"bpmn-icon-data-object\",target:{type:\"bpmn:DataObjectReference\"}}],Fu=[{label:\"Message Boundary Event\",actionName:\"replace-with-message-boundary\",className:\"bpmn-icon-intermediate-event-catch-message\",target:{type:\"bpmn:BoundaryEvent\",eventDefinitionType:\"bpmn:MessageEventDefinition\"}},{label:\"Timer Boundary Event\",actionName:\"replace-with-timer-boundary\",className:\"bpmn-icon-intermediate-event-catch-timer\",target:{type:\"bpmn:BoundaryEvent\",eventDefinitionType:\"bpmn:TimerEventDefinition\"}},{label:\"Escalation Boundary Event\",actionName:\"replace-with-escalation-boundary\",className:\"bpmn-icon-intermediate-event-catch-escalation\",target:{type:\"bpmn:BoundaryEvent\",eventDefinitionType:\"bpmn:EscalationEventDefinition\"}},{label:\"Conditional Boundary Event\",actionName:\"replace-with-conditional-boundary\",className:\"bpmn-icon-intermediate-event-catch-condition\",target:{type:\"bpmn:BoundaryEvent\",eventDefinitionType:\"bpmn:ConditionalEventDefinition\"}},{label:\"Error Boundary Event\",actionName:\"replace-with-error-boundary\",className:\"bpmn-icon-intermediate-event-catch-error\",target:{type:\"bpmn:BoundaryEvent\",eventDefinitionType:\"bpmn:ErrorEventDefinition\"}},{label:\"Cancel Boundary Event\",actionName:\"replace-with-cancel-boundary\",className:\"bpmn-icon-intermediate-event-catch-cancel\",target:{type:\"bpmn:BoundaryEvent\",eventDefinitionType:\"bpmn:CancelEventDefinition\"}},{label:\"Signal Boundary Event\",actionName:\"replace-with-signal-boundary\",className:\"bpmn-icon-intermediate-event-catch-signal\",target:{type:\"bpmn:BoundaryEvent\",eventDefinitionType:\"bpmn:SignalEventDefinition\"}},{label:\"Compensation Boundary Event\",actionName:\"replace-with-compensation-boundary\",className:\"bpmn-icon-intermediate-event-catch-compensation\",target:{type:\"bpmn:BoundaryEvent\",eventDefinitionType:\"bpmn:CompensateEventDefinition\"}},{label:\"Message Boundary Event (non-interrupting)\",actionName:\"replace-with-non-interrupting-message-boundary\",className:\"bpmn-icon-intermediate-event-catch-non-interrupting-message\",target:{type:\"bpmn:BoundaryEvent\",eventDefinitionType:\"bpmn:MessageEventDefinition\",cancelActivity:!1}},{label:\"Timer Boundary Event (non-interrupting)\",actionName:\"replace-with-non-interrupting-timer-boundary\",className:\"bpmn-icon-intermediate-event-catch-non-interrupting-timer\",target:{type:\"bpmn:BoundaryEvent\",eventDefinitionType:\"bpmn:TimerEventDefinition\",cancelActivity:!1}},{label:\"Escalation Boundary Event (non-interrupting)\",actionName:\"replace-with-non-interrupting-escalation-boundary\",className:\"bpmn-icon-intermediate-event-catch-non-interrupting-escalation\",target:{type:\"bpmn:BoundaryEvent\",eventDefinitionType:\"bpmn:EscalationEventDefinition\",cancelActivity:!1}},{label:\"Conditional Boundary Event (non-interrupting)\",actionName:\"replace-with-non-interrupting-conditional-boundary\",className:\"bpmn-icon-intermediate-event-catch-non-interrupting-condition\",target:{type:\"bpmn:BoundaryEvent\",eventDefinitionType:\"bpmn:ConditionalEventDefinition\",cancelActivity:!1}},{label:\"Signal Boundary Event (non-interrupting)\",actionName:\"replace-with-non-interrupting-signal-boundary\",className:\"bpmn-icon-intermediate-event-catch-non-interrupting-signal\",target:{type:\"bpmn:BoundaryEvent\",eventDefinitionType:\"bpmn:SignalEventDefinition\",cancelActivity:!1}}],zu=[{label:\"Message Start Event\",actionName:\"replace-with-message-start\",className:\"bpmn-icon-start-event-message\",target:{type:\"bpmn:StartEvent\",eventDefinitionType:\"bpmn:MessageEventDefinition\"}},{label:\"Timer Start Event\",actionName:\"replace-with-timer-start\",className:\"bpmn-icon-start-event-timer\",target:{type:\"bpmn:StartEvent\",eventDefinitionType:\"bpmn:TimerEventDefinition\"}},{label:\"Conditional Start Event\",actionName:\"replace-with-conditional-start\",className:\"bpmn-icon-start-event-condition\",target:{type:\"bpmn:StartEvent\",eventDefinitionType:\"bpmn:ConditionalEventDefinition\"}},{label:\"Signal Start Event\",actionName:\"replace-with-signal-start\",className:\"bpmn-icon-start-event-signal\",target:{type:\"bpmn:StartEvent\",eventDefinitionType:\"bpmn:SignalEventDefinition\"}},{label:\"Error Start Event\",actionName:\"replace-with-error-start\",className:\"bpmn-icon-start-event-error\",target:{type:\"bpmn:StartEvent\",eventDefinitionType:\"bpmn:ErrorEventDefinition\"}},{label:\"Escalation Start Event\",actionName:\"replace-with-escalation-start\",className:\"bpmn-icon-start-event-escalation\",target:{type:\"bpmn:StartEvent\",eventDefinitionType:\"bpmn:EscalationEventDefinition\"}},{label:\"Compensation Start Event\",actionName:\"replace-with-compensation-start\",className:\"bpmn-icon-start-event-compensation\",target:{type:\"bpmn:StartEvent\",eventDefinitionType:\"bpmn:CompensateEventDefinition\"}},{label:\"Message Start Event (non-interrupting)\",actionName:\"replace-with-non-interrupting-message-start\",className:\"bpmn-icon-start-event-non-interrupting-message\",target:{type:\"bpmn:StartEvent\",eventDefinitionType:\"bpmn:MessageEventDefinition\",isInterrupting:!1}},{label:\"Timer Start Event (non-interrupting)\",actionName:\"replace-with-non-interrupting-timer-start\",className:\"bpmn-icon-start-event-non-interrupting-timer\",target:{type:\"bpmn:StartEvent\",eventDefinitionType:\"bpmn:TimerEventDefinition\",isInterrupting:!1}},{label:\"Conditional Start Event (non-interrupting)\",actionName:\"replace-with-non-interrupting-conditional-start\",className:\"bpmn-icon-start-event-non-interrupting-condition\",target:{type:\"bpmn:StartEvent\",eventDefinitionType:\"bpmn:ConditionalEventDefinition\",isInterrupting:!1}},{label:\"Signal Start Event (non-interrupting)\",actionName:\"replace-with-non-interrupting-signal-start\",className:\"bpmn-icon-start-event-non-interrupting-signal\",target:{type:\"bpmn:StartEvent\",eventDefinitionType:\"bpmn:SignalEventDefinition\",isInterrupting:!1}},{label:\"Escalation Start Event (non-interrupting)\",actionName:\"replace-with-non-interrupting-escalation-start\",className:\"bpmn-icon-start-event-non-interrupting-escalation\",target:{type:\"bpmn:StartEvent\",eventDefinitionType:\"bpmn:EscalationEventDefinition\",isInterrupting:!1}}],Hu=[{label:\"Sequence Flow\",actionName:\"replace-with-sequence-flow\",className:\"bpmn-icon-connection\"},{label:\"Default Flow\",actionName:\"replace-with-default-flow\",className:\"bpmn-icon-default-flow\"},{label:\"Conditional Flow\",actionName:\"replace-with-conditional-flow\",className:\"bpmn-icon-conditional-flow\"}],Gu=[{label:\"Expanded Pool\",actionName:\"replace-with-expanded-pool\",className:\"bpmn-icon-participant\",target:{type:\"bpmn:Participant\",isExpanded:!0}},{label:function(e){var t=\"Empty Pool\";return e.children&&e.children.length&&(t+=\" (removes content)\"),t},actionName:\"replace-with-collapsed-pool\",className:\"bpmn-icon-lane\",target:{type:\"bpmn:Participant\",isExpanded:!1}}];function Vu(e,t,n,i,r,o,a){this._bpmnFactory=e,this._popupMenu=t,this._modeling=n,this._moddle=i,this._bpmnReplace=r,this._rules=o,this._translate=a,this._register()}Vu.$inject=[\"bpmnFactory\",\"popupMenu\",\"modeling\",\"moddle\",\"bpmnReplace\",\"rules\",\"translate\"],Vu.prototype._register=function(){this._popupMenu.registerProvider(\"bpmn-replace\",this)},Vu.prototype.getPopupMenuEntries=function(e){var t=e.businessObject,n=this._rules,i=[];if(p(e)||!n.allowed(\"shape.replace\",{element:e}))return{};var r=Tu(e);return Mr(t,\"bpmn:DataObjectReference\")?this._createEntries(e,Iu):Mr(t,\"bpmn:DataStoreReference\")&&!Mr(e.parent,\"bpmn:Collaboration\")?this._createEntries(e,$u):Mr(t,\"bpmn:StartEvent\")&&!Mr(t.$parent,\"bpmn:SubProcess\")?(i=y(ku,r),this._createEntries(e,i)):Mr(t,\"bpmn:Participant\")?(i=y(Gu,(function(t){return Zr(e)!==t.target.isExpanded})),this._createEntries(e,i)):Mr(t,\"bpmn:StartEvent\")&&Qr(t.$parent)?(i=y(zu,(function(e){var n=!1!==e.target.isInterrupting,i=t.isInterrupting===n;return r(e)||!r(e)&&!i})),this._createEntries(e,i)):Mr(t,\"bpmn:StartEvent\")&&!Qr(t.$parent)&&Mr(t.$parent,\"bpmn:SubProcess\")?(i=y(Au,r),this._createEntries(e,i)):Mr(t,\"bpmn:EndEvent\")?(i=y(Du,(function(e){return!(\"bpmn:CancelEventDefinition\"==e.target.eventDefinitionType&&!Mr(t.$parent,\"bpmn:Transaction\"))&&r(e)})),this._createEntries(e,i)):Mr(t,\"bpmn:BoundaryEvent\")?(i=y(Fu,(function(e){var n=e.target;if(\"bpmn:CancelEventDefinition\"==n.eventDefinitionType&&!Mr(t.attachedToRef,\"bpmn:Transaction\"))return!1;var i=!1!==n.cancelActivity,o=t.cancelActivity==i;return r(e)||!r(e)&&!o})),this._createEntries(e,i)):Mr(t,\"bpmn:IntermediateCatchEvent\")||Mr(t,\"bpmn:IntermediateThrowEvent\")?(i=y(Mu,r),this._createEntries(e,i)):Mr(t,\"bpmn:Gateway\")?(i=y(Bu,r),this._createEntries(e,i)):Mr(t,\"bpmn:Transaction\")?(i=y(Ou,r),this._createEntries(e,i)):Qr(t)&&Zr(e)?(i=y(ju,r),this._createEntries(e,i)):Mr(t,\"bpmn:SubProcess\")&&Zr(e)?(i=y(Nu,r),this._createEntries(e,i)):Mr(t,\"bpmn:AdHocSubProcess\")&&!Zr(e)?(i=y(Lu,(function(e){var t=e.target,n=\"bpmn:SubProcess\"===t.type,i=!0===t.isExpanded;return Tu(t)&&(!n||i)})),this._createEntries(e,i)):Mr(t,\"bpmn:SequenceFlow\")?this._createSequenceFlowEntries(e,Hu):Mr(t,\"bpmn:FlowNode\")?(i=y(Lu,r),Mr(t,\"bpmn:SubProcess\")&&!Zr(e)&&(i=y(i,(function(e){return\"Sub Process (collapsed)\"!==e.label}))),this._createEntries(e,i)):{}},Vu.prototype.getPopupMenuHeaderEntries=function(e){var t={};return Mr(e,\"bpmn:Activity\")&&!Qr(e)&&(t={...t,...this._getLoopCharacteristicsHeaderEntries(e)}),Mr(e,\"bpmn:DataObjectReference\")&&(t={...t,...this._getCollectionHeaderEntries(e)}),Mr(e,\"bpmn:Participant\")&&(t={...t,...this._getParticipantMultiplicityHeaderEntries(e)}),!Mr(e,\"bpmn:SubProcess\")||Mr(e,\"bpmn:Transaction\")||Qr(e)||(t={...t,...this._getAdHocHeaderEntries(e)}),t},Vu.prototype._createEntries=function(e,t){var n={},i=this;return g(t,(function(t){n[t.actionName]=i._createEntry(t,e)})),n},Vu.prototype._createSequenceFlowEntries=function(e,t){var n=Br(e),i={},r=this._modeling,o=this._moddle,a=this;return g(t,(function(t){switch(t.actionName){case\"replace-with-default-flow\":n.sourceRef.default!==n&&(Mr(n.sourceRef,\"bpmn:ExclusiveGateway\")||Mr(n.sourceRef,\"bpmn:InclusiveGateway\")||Mr(n.sourceRef,\"bpmn:ComplexGateway\")||Mr(n.sourceRef,\"bpmn:Activity\"))&&(i={...i,[t.actionName]:a._createEntry(t,e,(function(){r.updateProperties(e.source,{default:n})}))});break;case\"replace-with-conditional-flow\":!n.conditionExpression&&Mr(n.sourceRef,\"bpmn:Activity\")&&(i={...i,[t.actionName]:a._createEntry(t,e,(function(){var t=o.create(\"bpmn:FormalExpression\",{body:\"\"});r.updateProperties(e,{conditionExpression:t})}))});break;default:Mr(n.sourceRef,\"bpmn:Activity\")&&n.conditionExpression&&(i={...i,[t.actionName]:a._createEntry(t,e,(function(){r.updateProperties(e,{conditionExpression:void 0})}))}),(Mr(n.sourceRef,\"bpmn:ExclusiveGateway\")||Mr(n.sourceRef,\"bpmn:InclusiveGateway\")||Mr(n.sourceRef,\"bpmn:ComplexGateway\")||Mr(n.sourceRef,\"bpmn:Activity\"))&&n.sourceRef.default===n&&(i={...i,[t.actionName]:a._createEntry(t,e,(function(){r.updateProperties(e.source,{default:void 0})}))})}})),i},Vu.prototype._createEntry=function(e,t,n){var i=this._translate,r=this._bpmnReplace.replaceElement,o=e.label;return o&&\"function\"==typeof o&&(o=o(t)),n=n||function(){return r(t,e.target)},{label:i(o),className:e.className,action:n}},Vu.prototype._getLoopCharacteristicsHeaderEntries=function(e){var t=this,n=this._translate;function i(n,i){var r=Br(e).loopCharacteristics;i.active?r=void 0:(!a(i.options.isSequential)&&r&&Mr(r,i.options.loopCharacteristics)||(r=t._moddle.create(i.options.loopCharacteristics)),r.isSequential=i.options.isSequential),t._modeling.updateProperties(e,{loopCharacteristics:r})}var r,o,s,c=Br(e).loopCharacteristics;return c&&(r=c.isSequential,o=void 0===c.isSequential,s=void 0!==c.isSequential&&!c.isSequential),{\"toggle-parallel-mi\":{className:\"bpmn-icon-parallel-mi-marker\",title:n(\"Parallel Multi Instance\"),active:s,action:i,options:{loopCharacteristics:\"bpmn:MultiInstanceLoopCharacteristics\",isSequential:!1}},\"toggle-sequential-mi\":{className:\"bpmn-icon-sequential-mi-marker\",title:n(\"Sequential Multi Instance\"),active:r,action:i,options:{loopCharacteristics:\"bpmn:MultiInstanceLoopCharacteristics\",isSequential:!0}},\"toggle-loop\":{className:\"bpmn-icon-loop-marker\",title:n(\"Loop\"),active:o,action:i,options:{loopCharacteristics:\"bpmn:StandardLoopCharacteristics\"}}}},Vu.prototype._getCollectionHeaderEntries=function(e){var t=this,n=this._translate,i=e.businessObject.dataObjectRef;if(!i)return{};var r=i.isCollection;return{\"toggle-is-collection\":{className:\"bpmn-icon-parallel-mi-marker\",title:n(\"Collection\"),active:r,action:function(n,r){t._modeling.updateModdleProperties(e,i,{isCollection:!r.active})}}}},Vu.prototype._getParticipantMultiplicityHeaderEntries=function(e){var t=this,n=this._bpmnFactory,i=this._translate;var r=e.businessObject.participantMultiplicity;return{\"toggle-participant-multiplicity\":{className:\"bpmn-icon-parallel-mi-marker\",title:i(\"Participant Multiplicity\"),active:!!r,action:function(i,r){var o;r.active||(o=n.create(\"bpmn:ParticipantMultiplicity\")),t._modeling.updateProperties(e,{participantMultiplicity:o})}}}},Vu.prototype._getAdHocHeaderEntries=function(e){var t=this._translate,n=Mr(Br(e),\"bpmn:AdHocSubProcess\"),i=this._bpmnReplace.replaceElement;return{\"toggle-adhoc\":{className:\"bpmn-icon-ad-hoc-marker\",title:t(\"Ad-hoc\"),active:n,action:function(t,r){return i(e,n?{type:\"bpmn:SubProcess\"}:{type:\"bpmn:AdHocSubProcess\"},{autoResize:!1,layoutConnection:!1})}}}};var Wu={__depends__:[qc,Pu,vp],__init__:[\"replaceMenuProvider\"],replaceMenuProvider:[\"type\",Vu]},Uu=Math.max,qu=Math.min,Ku=20;function Yu(e,t){return{top:e.top-t.top,right:e.right-t.right,bottom:e.bottom-t.bottom,left:e.left-t.left}}function Xu(e,t,n){var i=t[e],r=n.min&&n.min[e],o=n.max&&n.max[e];return u(r)&&(i=(/top|left/.test(e)?qu:Uu)(i,r)),u(o)&&(i=(/top|left/.test(e)?Uu:qu)(i,o)),i}function Zu(e,t){return void 0!==e?e:Ku}function Qu(e){return!e.waypoints&&\"label\"!==e.type}function Ju(e,t){var n;if((n=void 0===e.length?y(e.children,Qu):e).length)return function(e,t){var n,i,r,o;return\"object\"==typeof t?(n=Zu(t.left),i=Zu(t.right),r=Zu(t.top),o=Zu(t.bottom)):n=i=r=o=Zu(t),{x:e.x-n,y:e.y-r,width:e.width+n+i,height:e.height+r+o}}(vt(n),t)}var eh=Math.abs;var th=[\"bpmn:Participant\",\"bpmn:Process\",\"bpmn:SubProcess\"],nh=30;function ih(e,t){return t=t||[],e.children.filter((function(e){Mr(e,\"bpmn:Lane\")&&(ih(e,t),t.push(e))})),t}function rh(e){return e.children.filter((function(e){return Mr(e,\"bpmn:Lane\")}))}function oh(e){return hp(e,th)||e}function ah(e,t){var n=oh(e),i=ih(n,Mr(n,\"bpmn:Process\")?[]:[n]),r=gn(e),o=gn(t),a=function(e,t){return Yu(gn(t),gn(e))}(e,t),s=[];return i.forEach((function(t){if(t!==e){var n,i,c=0,p=a.right,l=0,u=a.left,h=gn(t);a.top&&(eh(h.bottom-r.top)<10&&(l=o.top-h.bottom),eh(h.top-r.top)<5&&(c=o.top-h.top)),a.bottom&&(eh(h.top-r.bottom)<10&&(c=o.bottom-h.top),eh(h.bottom-r.bottom)<5&&(l=o.bottom-h.bottom)),(c||p||l||u)&&s.push({shape:t,newBounds:(n=t,i={top:c,right:p,bottom:l,left:u},{x:n.x+(i.left||0),y:n.y+(i.top||0),width:n.width-(i.left||0)+(i.right||0),height:n.height-(i.top||0)+(i.bottom||0)})})}})),s}function sh(e,t,n,i,r,o,a,s,c,p,l,u){e=e||{},i.registerProvider(this),this._contextPad=i,this._modeling=r,this._elementFactory=o,this._connect=a,this._create=s,this._popupMenu=c,this._canvas=p,this._rules=l,this._translate=u,!1!==e.autoPlace&&(this._autoPlace=t.get(\"autoPlace\",!1)),n.on(\"create.end\",250,(function(e){var t=e.context.shape;if(zo(e)&&i.isOpen(t)){var n=i.getEntries(t);n.replace&&n.replace.action.click(e,t)}}))}function ch(e,t,n){var i=e.$instanceOf(t),r=!1;return g(e.eventDefinitions||[],(function(e){e.$type===n&&(r=!0)})),i&&r}sh.$inject=[\"config.contextPad\",\"injector\",\"eventBus\",\"contextPad\",\"modeling\",\"elementFactory\",\"connect\",\"create\",\"popupMenu\",\"canvas\",\"rules\",\"translate\"],sh.prototype.getMultiElementContextPadEntries=function(e){var t=this._modeling,n={};return this._isDeleteAllowed(e)&&L(n,{delete:{group:\"edit\",className:\"bpmn-icon-trash\",title:this._translate(\"Remove\"),action:{click:function(e,n){t.removeElements(n.slice())}}}}),n},sh.prototype._isDeleteAllowed=function(e){var t=this._rules.allowed(\"elements.delete\",{elements:e});return p(t)?_(t,(function(e){return n=e,-1!==t.indexOf(n);var n})):t},sh.prototype.getContextPadEntries=function(e){var t=this._contextPad,n=this._modeling,i=this._elementFactory,r=this._connect,o=this._create,a=this._popupMenu,s=this._rules,c=this._autoPlace,l=this._translate,u={};if(\"label\"===e.type)return u;var h=e.businessObject;function d(e,t){r.start(e,t)}function f(e,t,n,r){function a(t,n){var a=i.createShape(L({type:e},r));o.start(t,a,{source:n})}\"string\"!=typeof n&&(r=n,n=l(\"Append {type}\",{type:e.replace(/^bpmn:/,\"\")}));var s=c?function(t,n){var o=i.createShape(L({type:e},r));c.append(n,o)}:a;return{group:\"model\",className:t,title:n,action:{dragstart:a,click:s}}}function m(e){return function(i,r){n.splitLane(r,e),t.open(r,!0)}}if(Dr(h,[\"bpmn:Lane\",\"bpmn:Participant\"])&&Zr(e)){var v=rh(e);L(u,{\"lane-insert-above\":{group:\"lane-insert-above\",className:\"bpmn-icon-lane-insert-above\",title:l(\"Add Lane above\"),action:{click:function(e,t){n.addLane(t,\"top\")}}}}),v.length<2&&(e.height>=120&&L(u,{\"lane-divide-two\":{group:\"lane-divide\",className:\"bpmn-icon-lane-divide-two\",title:l(\"Divide into two Lanes\"),action:{click:m(2)}}}),e.height>=180&&L(u,{\"lane-divide-three\":{group:\"lane-divide\",className:\"bpmn-icon-lane-divide-three\",title:l(\"Divide into three Lanes\"),action:{click:m(3)}}})),L(u,{\"lane-insert-below\":{group:\"lane-insert-below\",className:\"bpmn-icon-lane-insert-below\",title:l(\"Add Lane below\"),action:{click:function(e,t){n.addLane(t,\"bottom\")}}}})}Mr(h,\"bpmn:FlowNode\")&&(Mr(h,\"bpmn:EventBasedGateway\")?L(u,{\"append.receive-task\":f(\"bpmn:ReceiveTask\",\"bpmn-icon-receive-task\",l(\"Append ReceiveTask\")),\"append.message-intermediate-event\":f(\"bpmn:IntermediateCatchEvent\",\"bpmn-icon-intermediate-event-catch-message\",l(\"Append MessageIntermediateCatchEvent\"),{eventDefinitionType:\"bpmn:MessageEventDefinition\"}),\"append.timer-intermediate-event\":f(\"bpmn:IntermediateCatchEvent\",\"bpmn-icon-intermediate-event-catch-timer\",l(\"Append TimerIntermediateCatchEvent\"),{eventDefinitionType:\"bpmn:TimerEventDefinition\"}),\"append.condition-intermediate-event\":f(\"bpmn:IntermediateCatchEvent\",\"bpmn-icon-intermediate-event-catch-condition\",l(\"Append ConditionIntermediateCatchEvent\"),{eventDefinitionType:\"bpmn:ConditionalEventDefinition\"}),\"append.signal-intermediate-event\":f(\"bpmn:IntermediateCatchEvent\",\"bpmn-icon-intermediate-event-catch-signal\",l(\"Append SignalIntermediateCatchEvent\"),{eventDefinitionType:\"bpmn:SignalEventDefinition\"})}):ch(h,\"bpmn:BoundaryEvent\",\"bpmn:CompensateEventDefinition\")?L(u,{\"append.compensation-activity\":f(\"bpmn:Task\",\"bpmn-icon-task\",l(\"Append compensation activity\"),{isForCompensation:!0})}):Mr(h,\"bpmn:EndEvent\")||h.isForCompensation||ch(h,\"bpmn:IntermediateThrowEvent\",\"bpmn:LinkEventDefinition\")||Qr(h)||L(u,{\"append.end-event\":f(\"bpmn:EndEvent\",\"bpmn-icon-end-event-none\",l(\"Append EndEvent\")),\"append.gateway\":f(\"bpmn:ExclusiveGateway\",\"bpmn-icon-gateway-none\",l(\"Append Gateway\")),\"append.append-task\":f(\"bpmn:Task\",\"bpmn-icon-task\",l(\"Append Task\")),\"append.intermediate-event\":f(\"bpmn:IntermediateThrowEvent\",\"bpmn-icon-intermediate-event-none\",l(\"Append Intermediate/Boundary Event\"))})),a.isEmpty(e,\"bpmn-replace\")||L(u,{replace:{group:\"edit\",className:\"bpmn-icon-screw-wrench\",title:l(\"Change type\"),action:{click:function(e,n){var i=L(function(e){var n=t.getPad(e).html.getBoundingClientRect();return{x:n.left,y:n.bottom+5}}(n),{cursor:{x:e.x,y:e.y}});a.open(n,\"bpmn-replace\",i,{title:l(\"Change element\"),width:300,search:!0})}}}}),Mr(h,\"bpmn:SequenceFlow\")&&L(u,{\"append.text-annotation\":f(\"bpmn:TextAnnotation\",\"bpmn-icon-text-annotation\")}),Dr(h,[\"bpmn:FlowNode\",\"bpmn:InteractionNode\",\"bpmn:DataObjectReference\",\"bpmn:DataStoreReference\"])&&L(u,{\"append.text-annotation\":f(\"bpmn:TextAnnotation\",\"bpmn-icon-text-annotation\"),connect:{group:\"connect\",className:\"bpmn-icon-connection-multi\",title:l(\"Connect using \"+(h.isForCompensation?\"\":\"Sequence/MessageFlow or \")+\"Association\"),action:{click:d,dragstart:d}}}),Mr(h,\"bpmn:TextAnnotation\")&&L(u,{connect:{group:\"connect\",className:\"bpmn-icon-connection-multi\",title:l(\"Connect using Association\"),action:{click:d,dragstart:d}}}),Dr(h,[\"bpmn:DataObjectReference\",\"bpmn:DataStoreReference\"])&&L(u,{connect:{group:\"connect\",className:\"bpmn-icon-connection-multi\",title:l(\"Connect using DataInputAssociation\"),action:{click:d,dragstart:d}}}),Mr(h,\"bpmn:Group\")&&L(u,{\"append.text-annotation\":f(\"bpmn:TextAnnotation\",\"bpmn-icon-text-annotation\")});var y=s.allowed(\"elements.delete\",{elements:[e]});return p(y)&&(y=y[0]===e),y&&L(u,{delete:{group:\"edit\",className:\"bpmn-icon-trash\",title:l(\"Remove\"),action:{click:function(e,t){n.removeElements([t])}}}}),u};var ph={__depends__:[Vl,js,ta,Ol,ru,Wu],__init__:[\"contextPadProvider\"],contextPadProvider:[\"type\",sh]},lh={horizontal:[\"x\",\"width\"],vertical:[\"y\",\"height\"]};function uh(e,t){this._modeling=e,this._filters=[],this.registerFilter((function(e){var n=t.allowed(\"elements.distribute\",{elements:e});return p(n)?n:n?e:[]}))}uh.$inject=[\"modeling\",\"rules\"],uh.prototype.registerFilter=function(e){if(\"function\"!=typeof e)throw new Error(\"the filter has to be a function\");this._filters.push(e)},uh.prototype.trigger=function(e,t){var n,i,r=this._modeling;if(!(e.length<3||(this._setOrientation(t),i=this._filterElements(e),(n=this._createGroups(i)).length<=2)))return r.distributeElements(n,this._axis,this._dimension),n},uh.prototype._filterElements=function(e){var t=this._filters,n=this._axis,i=this._dimension,r=[].concat(e);return t.length?(g(t,(function(e){r=e(r,n,i)})),r):e},uh.prototype._createGroups=function(e){var t=[],n=this,i=this._axis,r=this._dimension;if(!i)throw new Error('must have a defined \"axis\" and \"dimension\"');return g(k(e,i),(function(e,o){var a,s=n._findRange(e,i,r),c=t[t.length-1];c&&n._hasIntersection(c.range,s)?t[t.length-1].elements.push(e):(a={range:s,elements:[e]},t.push(a))})),t},uh.prototype._setOrientation=function(e){var t=lh[e];this._axis=t[0],this._dimension=t[1]},uh.prototype._hasIntersection=function(e,t){return Math.max(e.min,e.max)>=Math.min(t.min,t.max)&&Math.min(e.min,e.max)<=Math.max(t.min,t.max)},uh.prototype._findRange=function(e){var t=e[this._axis];return{min:t+5,max:t+e[this._dimension]-5}};var hh={__init__:[\"distributeElements\"],distributeElements:[\"type\",uh]};function dh(e){Qc.call(this,e)}dh.$inject=[\"eventBus\"],e(dh,Qc),dh.prototype.init=function(){this.addRule(\"elements.distribute\",(function(e){var t=e.elements;return!((t=ut(t=y(t,(function(e){var t=Dr(e,[\"bpmn:Association\",\"bpmn:BoundaryEvent\",\"bpmn:DataInputAssociation\",\"bpmn:DataOutputAssociation\",\"bpmn:Lane\",\"bpmn:MessageFlow\",\"bpmn:SequenceFlow\",\"bpmn:TextAnnotation\"]);return!(e.labelTarget||t)})))).length<3)&&t}))};var fh={horizontal:'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1800 1800\">\\n                <polyline points=\"450 400 450 150 1350 150 1350 400\" style=\"fill:none;stroke:currentColor;stroke-width:100;stroke-linejoin:round;\"/>\\n                <rect x=\"150\" y=\"450\" width=\"600\" height=\"1200\" rx=\"1\" style=\"fill:none;stroke:currentColor;stroke-width:100;\"></rect>\\n                <rect x=\"1050\" y=\"450\" width=\"600\" height=\"800\" rx=\"1\" style=\"fill:currentColor;stroke:currentColor;stroke-width:100;opacity:.5;\"></rect>\\n              </svg>',vertical:'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1800 1800\">\\n              <polyline points=\"400 1350 150 1350 150 450 400 450\" style=\"fill:none;stroke:currentColor;stroke-width:100;stroke-linejoin:round;\"/>\\n              <rect x=\"450\" y=\"150\" width=\"1200\" height=\"600\" rx=\"1\" style=\"fill:none;stroke:currentColor;stroke-width:100;\"></rect>\\n              <rect x=\"450\" y=\"1050\" width=\"800\" height=\"600\" rx=\"1\" style=\"fill:currentColor;stroke:currentColor;stroke-width:100;opacity:.5;\"></rect>\\n            </svg>'};function mh(e,t,n,i){this._distributeElements=t,this._translate=n,this._popupMenu=e,this._rules=i,e.registerProvider(\"align-elements\",900,this)}mh.$inject=[\"popupMenu\",\"distributeElements\",\"translate\",\"rules\"],mh.prototype.getPopupMenuEntries=function(e){var t={};return this._isAllowed(e)&&L(t,this._getEntries(e)),t},mh.prototype._isAllowed=function(e){return this._rules.allowed(\"elements.distribute\",{elements:e})},mh.prototype._getEntries=function(e){var t=this._distributeElements,n=this._translate,i=this._popupMenu;return{\"distribute-elements-horizontal\":{group:\"distribute\",title:n(\"Distribute elements horizontally\"),className:\"bjs-align-elements-menu-entry\",imageHtml:fh.horizontal,action:function(n,r){t.trigger(e,\"horizontal\"),i.close()}},\"distribute-elements-vertical\":{group:\"distribute\",title:n(\"Distribute elements vertically\"),imageHtml:fh.vertical,action:function(n,r){t.trigger(e,\"vertical\"),i.close()}}}};var vh={__depends__:[qc,hh],__init__:[\"bpmnDistributeElements\",\"distributeElementsMenuProvider\"],bpmnDistributeElements:[\"type\",dh],distributeElementsMenuProvider:[\"type\",mh]},yh=\"is not a registered action\";function gh(e,t){this._actions={};var n=this;e.on(\"diagram.init\",(function(){n._registerDefaultActions(t),e.fire(\"editorActions.init\",{editorActions:n})}))}function bh(e,t){return new Error(e+\" \"+t)}gh.$inject=[\"eventBus\",\"injector\"],gh.prototype._registerDefaultActions=function(e){var t=e.get(\"commandStack\",!1),n=e.get(\"modeling\",!1),i=e.get(\"selection\",!1),r=e.get(\"zoomScroll\",!1),o=e.get(\"copyPaste\",!1),a=e.get(\"canvas\",!1),s=e.get(\"rules\",!1),c=e.get(\"keyboardMove\",!1),l=e.get(\"keyboardMoveSelection\",!1);t&&(this.register(\"undo\",(function(){t.undo()})),this.register(\"redo\",(function(){t.redo()}))),o&&i&&this.register(\"copy\",(function(){var e=i.get();if(e.length)return o.copy(e)})),o&&this.register(\"paste\",(function(){o.paste()})),r&&this.register(\"stepZoom\",(function(e){r.stepZoom(e.value)})),a&&this.register(\"zoom\",(function(e){a.zoom(e.value)})),n&&i&&s&&this.register(\"removeSelection\",(function(){var e=i.get();if(e.length){var t,r=s.allowed(\"elements.delete\",{elements:e});!1!==r&&(t=p(r)?r:e).length&&n.removeElements(t.slice())}})),c&&this.register(\"moveCanvas\",(function(e){c.moveCanvas(e)})),l&&this.register(\"moveSelection\",(function(e){l.moveSelection(e.direction,e.accelerated)}))},gh.prototype.trigger=function(e,t){if(!this._actions[e])throw bh(e,yh);return this._actions[e](t)},gh.prototype.register=function(e,t){var n=this;if(\"string\"==typeof e)return this._registerAction(e,t);g(e,(function(e,t){n._registerAction(t,e)}))},gh.prototype._registerAction=function(e,t){if(this.isRegistered(e))throw bh(e,\"is already registered\");this._actions[e]=t},gh.prototype.unregister=function(e){if(!this.isRegistered(e))throw bh(e,yh);this._actions[e]=void 0},gh.prototype.getActions=function(){return Object.keys(this._actions)},gh.prototype.isRegistered=function(e){return!!this._actions[e]};var xh={__init__:[\"editorActions\"],editorActions:[\"type\",gh]};function _h(e){e.invoke(gh,this)}e(_h,gh),_h.$inject=[\"injector\"],_h.prototype._registerDefaultActions=function(e){gh.prototype._registerDefaultActions.call(this,e);var t=e.get(\"canvas\",!1),n=e.get(\"elementRegistry\",!1),i=e.get(\"selection\",!1),r=e.get(\"spaceTool\",!1),o=e.get(\"lassoTool\",!1),a=e.get(\"handTool\",!1),s=e.get(\"globalConnect\",!1),c=e.get(\"distributeElements\",!1),p=e.get(\"alignElements\",!1),l=e.get(\"directEditing\",!1),u=e.get(\"searchPad\",!1),h=e.get(\"modeling\",!1),d=e.get(\"contextPad\",!1);t&&n&&i&&this._registerAction(\"selectElements\",(function(){var e=t.getRootElement(),r=n.filter((function(t){return t!==e}));return i.select(r),r})),r&&this._registerAction(\"spaceTool\",(function(){r.toggle()})),o&&this._registerAction(\"lassoTool\",(function(){o.toggle()})),a&&this._registerAction(\"handTool\",(function(){a.toggle()})),s&&this._registerAction(\"globalConnectTool\",(function(){s.toggle()})),i&&c&&this._registerAction(\"distributeElements\",(function(e){var t=i.get(),n=e.type;t.length&&c.trigger(t,n)})),i&&p&&this._registerAction(\"alignElements\",(function(e){var t=i.get(),n=[],r=e.type;t.length&&(n=y(t,(function(e){return!Mr(e,\"bpmn:Lane\")})),p.trigger(n,r))})),i&&h&&this._registerAction(\"setColor\",(function(e){var t=i.get();t.length&&h.setColor(t,e)})),i&&l&&this._registerAction(\"directEditing\",(function(){var e=i.get();e.length&&l.activate(e[0])})),u&&this._registerAction(\"find\",(function(){u.toggle()})),t&&h&&this._registerAction(\"moveToOrigin\",(function(){var e,i,r=t.getRootElement();e=vt(i=Mr(r,\"bpmn:Collaboration\")?n.filter((function(e){return Mr(e.parent,\"bpmn:Collaboration\")})):n.filter((function(e){return e!==r&&!Mr(e.parent,\"bpmn:SubProcess\")}))),h.moveElements(i,{x:-e.x,y:-e.y},r)})),i&&d&&this._registerAction(\"replaceElement\",(function(e){d.triggerEntry(\"replace\",\"click\",e)}))};var wh={__depends__:[xh],editorActions:[\"type\",_h]};function Eh(e){e.on([\"create.init\",\"shape.move.init\"],(function(e){var t=e.context;Dr(e.shape,[\"bpmn:Participant\",\"bpmn:SubProcess\",\"bpmn:TextAnnotation\"])&&(t.gridSnappingContext||(t.gridSnappingContext={}),t.gridSnappingContext.snapLocation=\"top-left\")}))}Eh.$inject=[\"eventBus\"];function Sh(e,t,n){return n||(n=\"round\"),Math[n](e/t)*t}function Ch(e,t,n){var i=!n||!1!==n.active;this._eventBus=t;var r=this;t.on(\"diagram.init\",800,(function(){r.setActive(i)})),t.on([\"create.move\",\"create.end\",\"bendpoint.move.move\",\"bendpoint.move.end\",\"connect.move\",\"connect.end\",\"connectionSegment.move.move\",\"connectionSegment.move.end\",\"resize.move\",\"resize.end\",\"shape.move.move\",\"shape.move.end\"],1200,(function(t){var n=t.originalEvent;if(!(!r.active||n&&$a(n))){var i=t.context,o=i.gridSnappingContext;o||(o=i.gridSnappingContext={}),[\"x\",\"y\"].forEach((function(n){var i={},o=function(e,t,n){var i=e.context,r=e.shape,o=i.gridSnappingContext,a=o.snapLocation,s=o.snapOffset;if(s&&u(s[t]))return s[t];s||(s=o.snapOffset={});u(s[t])||(s[t]=0);if(!r)return s[t];n.get(r.id)||(Rh(t)?s[t]+=r[t]+r.width/2:s[t]+=r[t]+r.height/2);if(!a)return s[t];\"x\"===t?/left/.test(a)?s[t]-=r.width/2:/right/.test(a)&&(s[t]+=r.width/2):/top/.test(a)?s[t]-=r.height/2:/bottom/.test(a)&&(s[t]+=r.height/2);return s[t]}(t,n,e);o&&(i.offset=o);var a=function(e,t){var n=e.context,i=n.createConstraints,r=n.resizeConstraints||{},o=n.gridSnappingContext,a=o.snapConstraints;if(a&&a[t])return a[t];a||(a=o.snapConstraints={});a[t]||(a[t]={});var s=n.direction;i&&(Rh(t)?(a.x.min=i.left,a.x.max=i.right):(a.y.min=i.top,a.y.max=i.bottom));var c=r.min,p=r.max;c&&(Rh(t)?Th(s)?a.x.max=c.left:a.x.min=c.right:Ph(s)?a.y.max=c.top:a.y.min=c.bottom);p&&(Rh(t)?Th(s)?a.x.min=p.left:a.x.max=p.right:Ph(s)?a.y.min=p.top:a.y.max=p.bottom);return a[t]}(t,n);a&&L(i,a),El(t,n)||r.snapEvent(t,n,i)}))}}))}function Rh(e){return\"x\"===e}function Ph(e){return-1!==e.indexOf(\"n\")}function Th(e){return-1!==e.indexOf(\"w\")}function kh(e,t){ua.call(this,e),this._gridSnapping=t;var n=this;this.preExecute(\"shape.resize\",(function(e){var t=e.context,i=(t.hints||{}).autoResize;if(i){var r=t.shape,o=t.newBounds;d(i)?t.newBounds=n.snapComplex(o,i):t.newBounds=n.snapSimple(r,o)}}))}Ch.prototype.snapEvent=function(e,t,n){Sl(e,t,this.snapValue(e[t],n))},Ch.prototype.getGridSpacing=function(){return 10},Ch.prototype.snapValue=function(e,t){var n,i,r=0;return t&&t.offset&&(r=t.offset),e=Sh(e+=r,10),t&&t.min&&u(n=t.min)&&(n=Sh(n+r,10,\"ceil\"),e=Math.max(e,n)),t&&t.max&&u(i=t.max)&&(i=Sh(i+r,10,\"floor\"),e=Math.min(e,i)),e-=r},Ch.prototype.isActive=function(){return this.active},Ch.prototype.setActive=function(e){this.active=e,this._eventBus.fire(\"gridSnapping.toggle\",{active:e})},Ch.prototype.toggleActive=function(){this.setActive(!this.active)},Ch.$inject=[\"elementRegistry\",\"eventBus\",\"config.gridSnapping\"],kh.$inject=[\"eventBus\",\"gridSnapping\",\"modeling\"],e(kh,ua),kh.prototype.snapSimple=function(e,t){var n=this._gridSnapping;return t.width=n.snapValue(t.width,{min:t.width}),t.height=n.snapValue(t.height,{min:t.height}),t.x=e.x+e.width/2-t.width/2,t.y=e.y+e.height/2-t.height/2,t},kh.prototype.snapComplex=function(e,t){return/w|e/.test(t)&&(e=this.snapHorizontally(e,t)),/n|s/.test(t)&&(e=this.snapVertically(e,t)),e},kh.prototype.snapHorizontally=function(e,t){var n=this._gridSnapping,i=/w/.test(t),r=/e/.test(t),o={};return o.width=n.snapValue(e.width,{min:e.width}),r&&(i?(o.x=n.snapValue(e.x,{max:e.x}),o.width+=n.snapValue(e.x-o.x,{min:e.x-o.x})):e.x=e.x+e.width-o.width),L(e,o),e},kh.prototype.snapVertically=function(e,t){var n=this._gridSnapping,i=/n/.test(t),r=/s/.test(t),o={};return o.height=n.snapValue(e.height,{min:e.height}),i&&(r?(o.y=n.snapValue(e.y,{max:e.y}),o.height+=n.snapValue(e.y-o.y,{min:e.y-o.y})):e.y=e.y+e.height-o.height),L(e,o),e};function Ah(e,t){e.on([\"spaceTool.move\",\"spaceTool.end\"],2e3,(function(e){var n,i=e.context;i.initialized&&(\"x\"===i.axis?(n=t.snapValue(e.dx),e.x=e.x+n-e.dx,e.dx=n):(n=t.snapValue(e.dy),e.y=e.y+n-e.dy,e.dy=n))}))}Ah.$inject=[\"eventBus\",\"gridSnapping\"];var Mh={__depends__:[{__init__:[\"gridSnappingResizeBehavior\",\"gridSnappingSpaceToolBehavior\"],gridSnappingResizeBehavior:[\"type\",kh],gridSnappingSpaceToolBehavior:[\"type\",Ah]}],__init__:[\"gridSnapping\"],gridSnapping:[\"type\",Ch]};function Dh(e,t){e.on(\"autoPlace\",2e3,(function(e){var n=e.source,i=_n(n),r=e.shape,o=dp(n,r);return[\"x\",\"y\"].forEach((function(e){var n={};o[e]!==i[e]&&(o[e]>i[e]?n.min=o[e]:n.max=o[e],Mr(r,\"bpmn:TextAnnotation\")&&(!function(e){return\"x\"===e}(e)?n.offset=-r.height/2:n.offset=-r.width/2),o[e]=t.snapValue(o[e],n))})),o}))}Dh.$inject=[\"eventBus\",\"gridSnapping\"];function Bh(e,t,n){t.on([\"create.start\",\"shape.move.start\"],1750,(function(t){var i=t.context,r=i.shape,o=e.getRootElement();Mr(r,\"bpmn:Participant\")&&Mr(o,\"bpmn:Process\")&&o.children.length&&(i.createConstraints&&(r.width=n.snapValue(r.width,{min:r.width}),r.height=n.snapValue(r.height,{min:r.height})))}))}Bh.$inject=[\"canvas\",\"eventBus\",\"gridSnapping\"];function Nh(e,t,n){ua.call(this,e),this._gridSnapping=t;var i=this;this.postExecuted([\"connection.create\",\"connection.layout\"],3e3,(function(e){var t=e.context,r=t.connection,o=t.hints||{},a=r.waypoints;o.connectionStart||o.connectionEnd||!1===o.createElementsBehavior||function(e){return e.length>3}(a)&&n.updateWaypoints(r,i.snapMiddleSegments(a))}))}function Oh(e,t,n){var i=Tt(t,n),r={};return function(e){return\"h\"===e}(i)&&(r.y=e.snapValue(t.y)),function(e){return\"v\"===e}(i)&&(r.x=e.snapValue(t.x)),(\"x\"in r||\"y\"in r)&&(t=L({},t,r),n=L({},n,r)),[t,n]}Nh.$inject=[\"eventBus\",\"gridSnapping\",\"modeling\"],e(Nh,ua),Nh.prototype.snapMiddleSegments=function(e){var t,n=this._gridSnapping;e=e.slice();for(var i=1;i<e.length-2;i++)t=Oh(n,e[i],e[i+1]),e[i]=t[0],e[i+1]=t[1];return e};var jh={__depends__:[Mh,{__init__:[\"gridSnappingAutoPlaceBehavior\",\"gridSnappingParticipantBehavior\",\"gridSnappingLayoutConnectionBehavior\"],gridSnappingAutoPlaceBehavior:[\"type\",Dh],gridSnappingParticipantBehavior:[\"type\",Bh],gridSnappingLayoutConnectionBehavior:[\"type\",Nh]}],__init__:[\"bpmnGridSnapping\"],bpmnGridSnapping:[\"type\",Eh]};function Lh(e,t){this._interactionEvents=t;var n=this;e.on([\"interactionEvents.createHit\",\"interactionEvents.updateHit\"],(function(e){var t=e.element,i=e.gfx;return Mr(t,\"bpmn:Lane\")?n._createParticipantHit(t,i):Mr(t,\"bpmn:Participant\")?Zr(t)?n._createParticipantHit(t,i):n._createDefaultHit(t,i):Mr(t,\"bpmn:SubProcess\")?Zr(t)?n._createSubProcessHit(t,i):n._createDefaultHit(t,i):void 0}))}Lh.$inject=[\"eventBus\",\"interactionEvents\"],Lh.prototype._createDefaultHit=function(e,t){return this._interactionEvents.removeHits(t),this._interactionEvents.createDefaultHit(e,t),!0},Lh.prototype._createParticipantHit=function(e,t){return this._interactionEvents.removeHits(t),this._interactionEvents.createBoxHit(t,\"no-move\",{width:e.width,height:e.height}),this._interactionEvents.createBoxHit(t,\"click-stroke\",{width:e.width,height:e.height}),this._interactionEvents.createBoxHit(t,\"all\",{width:30,height:e.height}),!0},Lh.prototype._createSubProcessHit=function(e,t){return this._interactionEvents.removeHits(t),this._interactionEvents.createBoxHit(t,\"no-move\",{width:e.width,height:e.height}),this._interactionEvents.createBoxHit(t,\"click-stroke\",{width:e.width,height:e.height}),this._interactionEvents.createBoxHit(t,\"all\",{width:e.width,height:30}),!0};var Ih={__init__:[\"bpmnInteractionEvents\"],bpmnInteractionEvents:[\"type\",Lh]};function $h(e){e.invoke(Ua,this)}e($h,Ua),$h.$inject=[\"injector\"],$h.prototype.registerBindings=function(e,t){function n(n,i){t.isRegistered(n)&&e.addListener(i)}Ua.prototype.registerBindings.call(this,e,t),n(\"selectElements\",(function(n){var i=n.keyEvent;if(e.isKey([\"a\",\"A\"],i)&&e.isCmd(i))return t.trigger(\"selectElements\"),!0})),n(\"find\",(function(n){var i=n.keyEvent;if(e.isKey([\"f\",\"F\"],i)&&e.isCmd(i))return t.trigger(\"find\"),!0})),n(\"spaceTool\",(function(n){var i=n.keyEvent;if(!e.hasModifier(i))return e.isKey([\"s\",\"S\"],i)?(t.trigger(\"spaceTool\"),!0):void 0})),n(\"lassoTool\",(function(n){var i=n.keyEvent;if(!e.hasModifier(i))return e.isKey([\"l\",\"L\"],i)?(t.trigger(\"lassoTool\"),!0):void 0})),n(\"handTool\",(function(n){var i=n.keyEvent;if(!e.hasModifier(i))return e.isKey([\"h\",\"H\"],i)?(t.trigger(\"handTool\"),!0):void 0})),n(\"globalConnectTool\",(function(n){var i=n.keyEvent;if(!e.hasModifier(i))return e.isKey([\"c\",\"C\"],i)?(t.trigger(\"globalConnectTool\"),!0):void 0})),n(\"directEditing\",(function(n){var i=n.keyEvent;if(!e.hasModifier(i))return e.isKey([\"e\",\"E\"],i)?(t.trigger(\"directEditing\"),!0):void 0})),n(\"replaceElement\",(function(n){var i=n.keyEvent;if(!e.hasModifier(i))return e.isKey([\"r\",\"R\"],i)?(t.trigger(\"replaceElement\",i),!0):void 0}))};var Fh={__depends__:[qa],__init__:[\"keyboardBindings\"],keyboardBindings:[\"type\",$h]},zh={moveSpeed:1,moveSpeedAccelerated:10},Hh=\"left\",Gh=\"right\",Vh=\"down\",Wh={ArrowLeft:Hh,Left:Hh,ArrowUp:\"up\",Up:\"up\",ArrowRight:Gh,Right:Gh,ArrowDown:Vh,Down:Vh},Uh={left:function(e){return{x:-e,y:0}},up:function(e){return{x:0,y:-e}},right:function(e){return{x:e,y:0}},down:function(e){return{x:0,y:e}}};function qh(e,t,n,i,r){var o=this;this._config=L({},zh,e||{}),t.addListener(1500,(function(e){var n=e.keyEvent,i=Wh[n.key];if(i&&!t.isCmd(n)){var r=t.isShift(n);return o.moveSelection(i,r),!0}})),this.moveSelection=function(e,t){var o=r.get();if(o.length){var a=this._config[t?\"moveSpeedAccelerated\":\"moveSpeed\"],s=Uh[e](a);i.allowed(\"elements.move\",{shapes:o})&&n.moveElements(o,s)}}}qh.$inject=[\"config.keyboardMoveSelection\",\"keyboard\",\"modeling\",\"rules\",\"selection\"];var Kh={__depends__:[qa,ta],__init__:[\"keyboardMoveSelection\"],keyboardMoveSelection:[\"type\",qh]};function Yh(e,t,n,i){this._dragging=i,this._rules=t;var r=this;function o(e,t){var n,i=e.shape,o=e.direction,a=e.resizeConstraints;e.delta=t,n=function(e,t,n){var i=n.x,r=n.y,o={x:e.x,y:e.y,width:e.width,height:e.height};return-1!==t.indexOf(\"n\")?(o.y=e.y+r,o.height=e.height-r):-1!==t.indexOf(\"s\")&&(o.height=e.height+r),-1!==t.indexOf(\"e\")?o.width=e.width+i:-1!==t.indexOf(\"w\")&&(o.x=e.x+i,o.width=e.width-i),o}(i,o,t),e.newBounds=function(e,t){if(!t)return e;var n=gn(e);return bn({top:Xu(\"top\",n,t),right:Xu(\"right\",n,t),bottom:Xu(\"bottom\",n,t),left:Xu(\"left\",n,t)})}(n,a),e.canExecute=r.canResize(e)}e.on(\"resize.start\",(function(e){var t,n,i;t=e.context,n=t.resizeConstraints,i=t.minBounds,void 0===n&&(void 0===i&&(i=r.computeMinResizeBox(t)),t.resizeConstraints={min:gn(i)})})),e.on(\"resize.move\",(function(e){var t={x:e.dx,y:e.dy};o(e.context,t)})),e.on(\"resize.end\",(function(e){!function(e){var t=e.shape,i=e.canExecute,r=e.newBounds;if(i){if(!function(e,t){return e.x!==t.x||e.y!==t.y||e.width!==t.width||e.height!==t.height}(t,r=vn(r)))return;n.resizeShape(t,r)}}(e.context)}))}function Xh(e,t){var n=_n(e),i=gn(e),r={x:n.x,y:n.y};return-1!==t.indexOf(\"n\")?r.y=i.top:-1!==t.indexOf(\"s\")&&(r.y=i.bottom),-1!==t.indexOf(\"e\")?r.x=i.right:-1!==t.indexOf(\"w\")&&(r.x=i.left),r}function Zh(e){var t=\"resize-\";return\"n\"===e||\"s\"===e?t+\"ns\":\"e\"===e||\"w\"===e?t+\"ew\":\"nw\"===e||\"se\"===e?t+\"nwse\":t+\"nesw\"}Yh.prototype.canResize=function(e){var t=this._rules,n=I(e,[\"newBounds\",\"shape\",\"delta\",\"direction\"]);return t.allowed(\"shape.resize\",n)},Yh.prototype.activate=function(e,t,n){var i,r,o=this._dragging;if(\"string\"==typeof n&&(n={direction:n}),!(r=(i=L({shape:t},n)).direction))throw new Error(\"must provide a direction (n|w|s|e|nw|se|ne|sw)\");o.init(e,Xh(t,r),\"resize\",{autoActivate:!0,cursor:Zh(r),data:{shape:t,context:i}})},Yh.prototype.computeMinResizeBox=function(e){var t=e.shape;return function(e,t,n,i){var r=gn(t),o={top:/n/.test(e)?r.bottom-n.height:r.top,left:/w/.test(e)?r.right-n.width:r.left,bottom:/s/.test(e)?r.top+n.height:r.bottom,right:/e/.test(e)?r.left+n.width:r.right},a=i?gn(i):o;return bn({top:qu(o.top,a.top),left:qu(o.left,a.left),bottom:Uu(o.bottom,a.bottom),right:Uu(o.right,a.right)})}(e.direction,t,e.minDimensions||{width:10,height:10},Ju(t,e.childrenBoxPadding))},Yh.$inject=[\"eventBus\",\"rules\",\"modeling\",\"dragging\"];var Qh=\"djs-resizing\",Jh=\"resize-not-ok\";function ed(e,t,n){e.on(\"resize.move\",500,(function(e){var i,r,o,a;i=e.context,r=i.shape,o=i.newBounds,(a=i.frame)||(a=i.frame=n.addFrame(r,t.getActiveLayer()),t.addMarker(r,Qh)),o.width>5&&we(a,{x:o.x,width:o.width}),o.height>5&&we(a,{y:o.y,height:o.height}),i.canExecute?Se(a).remove(Jh):Se(a).add(Jh)})),e.on(\"resize.cleanup\",(function(e){var n,i;n=e.context,i=n.shape,n.frame&&Re(n.frame),t.removeMarker(i,Qh)}))}ed.$inject=[\"eventBus\",\"canvas\",\"previewSupport\"];var td=-6,nd=\"djs-resizer\",id=[\"n\",\"w\",\"s\",\"e\",\"nw\",\"ne\",\"se\",\"sw\"];function rd(e,t,n,i){this._resize=i,this._canvas=t;var r=this;e.on(\"selection.changed\",(function(e){var t=e.newSelection;r.removeResizers(),1===t.length&&g(t,j(r.addResizer,r))})),e.on(\"shape.changed\",(function(e){var t=e.element;n.isSelected(t)&&(r.removeResizers(),r.addResizer(t))}))}rd.prototype.makeDraggable=function(e,t,n){var i=this._resize;function r(t){Fo(t)&&i.activate(t,e,n)}ae.bind(t,\"mousedown\",r),ae.bind(t,\"touchstart\",r)},rd.prototype._createResizer=function(e,t,n,i){var r=this._getResizersParent(),o=function(e){var t={x:0,y:0};-1!==e.indexOf(\"e\")?t.x=6:-1!==e.indexOf(\"w\")&&(t.x=td);-1!==e.indexOf(\"s\")?t.y=6:-1!==e.indexOf(\"n\")&&(t.y=td);return t}(i),a=De(\"g\");Se(a).add(nd),Se(a).add(nd+\"-\"+e.id),Se(a).add(nd+\"-\"+i),ge(r,a);var s=De(\"rect\");we(s,{x:-4+o.x,y:-4+o.y,width:8,height:8}),Se(s).add(nd+\"-visual\"),ge(a,s);var c=De(\"rect\");return we(c,{x:-10+o.x,y:-10+o.y,width:20,height:20}),Se(c).add(nd+\"-hit\"),ge(a,c),ni(a,t,n),a},rd.prototype.createResizer=function(e,t){var n=Xh(e,t),i=this._createResizer(e,n.x,n.y,t);this.makeDraggable(e,i,t)},rd.prototype.addResizer=function(e){var t=this;!fn(e)&&this._resize.canResize({shape:e})&&g(id,(function(n){t.createResizer(e,n)}))},rd.prototype.removeResizers=function(){Pe(this._getResizersParent())},rd.prototype._getResizersParent=function(){return this._canvas.getLayer(\"resizers\")},rd.$inject=[\"eventBus\",\"canvas\",\"selection\",\"resize\"];var od={__depends__:[Bp,Tp,Kl],__init__:[\"resize\",\"resizePreview\",\"resizeHandles\"],resize:[\"type\",Yh],resizePreview:[\"type\",ed],resizeHandles:[\"type\",rd]};function ad(e,t,n,i,r,o,a){function s(e,t){(t||Dr(e,[\"bpmn:Task\",\"bpmn:TextAnnotation\",\"bpmn:Participant\"])||sd(e))&&i.activate(e)}this._bpmnFactory=t,this._canvas=n,this._modeling=r,this._textRenderer=a,i.registerProvider(this),e.on(\"element.dblclick\",(function(e){s(e.element,!0)})),e.on([\"autoPlace.start\",\"canvas.viewbox.changing\",\"drag.init\",\"element.mousedown\",\"popupMenu.open\",\"root.set\",\"selection.changed\"],(function(){i.isActive()&&i.complete()})),e.on([\"shape.remove\",\"connection.remove\"],2e3,(function(e){i.isActive(e.element)&&i.cancel()})),e.on([\"commandStack.changed\"],(function(e){i.isActive()&&i.cancel()})),e.on(\"directEditing.activate\",(function(e){o.removeResizers()})),e.on(\"create.end\",500,(function(e){var t=e.context,n=t.shape,i=e.context.canExecute;e.isTouch||i&&(t.hints&&!1===t.hints.createElementsBehavior||s(n))})),e.on(\"autoPlace.end\",500,(function(e){s(e.shape)}))}function sd(e){return Mr(e,\"bpmn:SubProcess\")&&!Zr(e)}ad.$inject=[\"eventBus\",\"bpmnFactory\",\"canvas\",\"directEditing\",\"modeling\",\"resizeHandles\",\"textRenderer\"],ad.prototype.activate=function(e){var t=so(e);if(void 0!==t){var n={text:t};L(n,this.getEditingBBox(e));var i={};return(Dr(e,[\"bpmn:Task\",\"bpmn:Participant\",\"bpmn:Lane\",\"bpmn:CallActivity\"])||sd(e))&&L(i,{centerVertically:!0}),no(e)&&L(i,{autoResize:!0}),Mr(e,\"bpmn:TextAnnotation\")&&L(i,{resizable:!0,autoResize:!0}),L(n,{options:i}),n}},ad.prototype.getEditingBBox=function(e){var t=this._canvas,n=e.label||e,i=t.getAbsoluteBBox(n),r=i.x+i.width/2,o=i.y+i.height/2,a={x:i.x,y:i.y},s=t.zoom(),c=this._textRenderer.getDefaultStyle(),p=this._textRenderer.getExternalStyle(),l=p.fontSize*s,u=p.lineHeight,h=c.fontSize*s,d=c.lineHeight,f={fontFamily:this._textRenderer.getDefaultStyle().fontFamily,fontWeight:this._textRenderer.getDefaultStyle().fontWeight};(Mr(e,\"bpmn:Lane\")||function(e){return Mr(e,\"bpmn:Participant\")&&Zr(e)}(e))&&(L(a,{width:i.height,height:30*s,x:i.x-i.height/2+15*s,y:o-30*s/2}),L(f,{fontSize:h+\"px\",lineHeight:d,paddingTop:7*s+\"px\",paddingBottom:7*s+\"px\",paddingLeft:5*s+\"px\",paddingRight:5*s+\"px\",transform:\"rotate(-90deg)\"})),(Dr(e,[\"bpmn:Task\",\"bpmn:CallActivity\"])||function(e){return Mr(e,\"bpmn:Participant\")&&!Zr(e)}(e)||sd(e))&&(L(a,{width:i.width,height:i.height}),L(f,{fontSize:h+\"px\",lineHeight:d,paddingTop:7*s+\"px\",paddingBottom:7*s+\"px\",paddingLeft:5*s+\"px\",paddingRight:5*s+\"px\"})),function(e){return Mr(e,\"bpmn:SubProcess\")&&Zr(e)}(e)&&(L(a,{width:i.width,x:i.x}),L(f,{fontSize:h+\"px\",lineHeight:d,paddingTop:7*s+\"px\",paddingBottom:7*s+\"px\",paddingLeft:5*s+\"px\",paddingRight:5*s+\"px\"}));var m=90*s,v=7*s,y=4*s;if(n.labelTarget&&(L(a,{width:m,height:i.height+v+y,x:r-m/2,y:i.y-v}),L(f,{fontSize:l+\"px\",lineHeight:u,paddingTop:v+\"px\",paddingBottom:y+\"px\"})),no(n)&&!io(n)&&!mn(n)){var g=oo(e),b=t.getAbsoluteBBox({x:g.x,y:g.y,width:0,height:0}),x=l+v+y;L(a,{width:m,height:x,x:b.x-m/2,y:b.y-x/2}),L(f,{fontSize:l+\"px\",lineHeight:u,paddingTop:v+\"px\",paddingBottom:y+\"px\"})}return Mr(e,\"bpmn:TextAnnotation\")&&(L(a,{width:i.width,height:i.height,minWidth:30*s,minHeight:10*s}),L(f,{textAlign:\"left\",paddingTop:5*s+\"px\",paddingBottom:7*s+\"px\",paddingLeft:7*s+\"px\",paddingRight:5*s+\"px\",fontSize:h+\"px\",lineHeight:d})),{bounds:a,style:f}},ad.prototype.update=function(e,t,n,i){var r,o,a;Mr(e,\"bpmn:TextAnnotation\")&&(o=this._canvas.getAbsoluteBBox(e),r={x:e.x,y:e.y,width:e.width/o.width*i.width,height:e.height/o.height*i.height}),(a=t)&&a.trim()||(t=null),this._modeling.updateLabel(e,t,r)};var cd=\"djs-element-hidden\",pd=\"djs-label-hidden\";function ld(e,t,n){var i,r,o,a=this,s=t.getDefaultLayer();e.on(\"directEditing.activate\",(function(e){var c=e.active;if(Mr(i=c.element.label||c.element,\"bpmn:TextAnnotation\")){r=t.getAbsoluteBBox(i),o=De(\"g\");var p=n.getScaledPath(\"TEXT_ANNOTATION\",{xScaleFactor:1,yScaleFactor:1,containerWidth:i.width,containerHeight:i.height,position:{mx:0,my:0}}),l=a.path=De(\"path\");we(l,{d:p,strokeWidth:2,stroke:ud(i)}),ge(o,l),ge(s,o),ii(o,i.x,i.y)}Mr(i,\"bpmn:TextAnnotation\")||i.labelTarget?t.addMarker(i,cd):(Mr(i,\"bpmn:Task\")||Mr(i,\"bpmn:CallActivity\")||Mr(i,\"bpmn:SubProcess\")||Mr(i,\"bpmn:Participant\"))&&t.addMarker(i,pd)})),e.on(\"directEditing.resize\",(function(e){if(Mr(i,\"bpmn:TextAnnotation\")){var t=e.height,o=e.dy,s=Math.max(i.height/r.height*(t+o),0),c=n.getScaledPath(\"TEXT_ANNOTATION\",{xScaleFactor:1,yScaleFactor:1,containerWidth:i.width,containerHeight:s,position:{mx:0,my:0}});we(a.path,{d:c})}})),e.on([\"directEditing.complete\",\"directEditing.cancel\"],(function(e){var n=e.active;n&&(t.removeMarker(n.element.label||n.element,cd),t.removeMarker(i,pd)),i=void 0,r=void 0,o&&(Re(o),o=void 0)}))}function ud(e,t){return Nr(e).get(\"stroke\")||t||\"black\"}ld.$inject=[\"eventBus\",\"canvas\",\"pathMap\"];var hd={__depends__:[la,od,Vl],__init__:[\"labelEditingProvider\",\"labelEditingPreview\"],labelEditingProvider:[\"type\",ad],labelEditingPreview:[\"type\",ld]},dd=[\"top\",\"bottom\",\"left\",\"right\"],fd=10;function md(e,t){function n(e){if(io(e)){var n=function(e){var t=_n(e.label),n=_n(e),i=vd(n,t);if(r=i,-1===dd.indexOf(r))return;var r;var o=function(e){var t=_n(e),n=[].concat(e.incoming.map((function(e){return e.waypoints[e.waypoints.length-2]})),e.outgoing.map((function(e){return e.waypoints[1]}))).map((function(e){return vd(t,e)}));return n}(e);if(e.host){var a=function(e){var t,n=e.host,i=_n(e),r=wn(i,n);t=r.indexOf(\"-\")>=0?r.split(\"-\"):[r];var o=dd.filter((function(e){return-1===t.indexOf(e)}));return o}(e);o=o.concat(a)}var s=dd.filter((function(e){return-1===o.indexOf(e)}));if(-1!==s.indexOf(i))return;return s[0]}(e);n&&function(e,n){var i=_n(e),r=e.label,o=_n(r);if(!r.parent)return;var a,s=gn(e);switch(n){case\"top\":a={x:i.x,y:s.top-fd-r.height/2};break;case\"left\":a={x:s.left-fd-r.width/2,y:i.y};break;case\"bottom\":a={x:i.x,y:s.bottom+fd+r.height/2};break;case\"right\":a={x:s.right+fd+r.width/2,y:i.y}}var c=is(a,o);t.moveShape(r,c)}(e,n)}}ua.call(this,e),this.postExecuted([\"connection.create\",\"connection.layout\",\"connection.updateWaypoints\"],(function(e){var t=e.context,i=t.connection,r=i.source,o=i.target;!1!==(t.hints||{}).createElementsBehavior&&(n(r),n(o))})),this.postExecuted([\"label.create\"],(function(e){var t=e.context,i=t.shape;!1!==(t.hints||{}).createElementsBehavior&&n(i.labelTarget)})),this.postExecuted([\"elements.create\"],(function(e){var t=e.context,i=t.elements;!1!==(t.hints||{}).createElementsBehavior&&i.forEach((function(e){n(e)}))}))}function vd(e,t){return wn(t,e,5)}function yd(e){ua.call(this,e),this.preExecute(\"shape.append\",(function(e){var t=e.source,n=e.shape;e.position||(Mr(n,\"bpmn:TextAnnotation\")?e.position={x:t.x+t.width/2+75,y:t.y-50-n.height/2}:e.position={x:t.x+t.width+80+n.width/2,y:t.y+t.height/2})}),!0)}function gd(e,t){e.invoke(ua,this),this.postExecute(\"shape.move\",(function(e){var n=e.newParent,i=e.shape;g(y(i.incoming.concat(i.outgoing),(function(e){return Mr(e,\"bpmn:Association\")})),(function(e){t.moveConnection(e,{x:0,y:0},n)}))}),!0)}e(md,ua),md.$inject=[\"eventBus\",\"modeling\"],e(yd,ua),yd.$inject=[\"eventBus\"],e(gd,ua),gd.$inject=[\"injector\",\"modeling\"];function bd(e,t){t.invoke(ua,this),this._bpmnReplace=e;var n=this;this.postExecuted(\"elements.create\",500,(function(e){var t=e.elements;1===(t=t.filter((function(e){return xd(e,e.host)}))).length&&t.map((function(e){return t.indexOf(e)})).forEach((function(i){var r=t[i];e.elements[i]=n._replaceShape(t[i],r)}))}),!0),this.preExecute(\"elements.move\",500,(function(e){var t=e.shapes,i=e.newHost;if(1===t.length){var r=t[0];xd(r,i)&&(e.shapes=[n._replaceShape(r,i)])}}),!0)}function xd(e,t){return!mn(e)&&Dr(e,[\"bpmn:IntermediateThrowEvent\",\"bpmn:IntermediateCatchEvent\"])&&!!t}function _d(e,t){function n(e){return y(e.attachers,(function(e){return Mr(e,\"bpmn:BoundaryEvent\")}))}ua.call(this,e),this.postExecute(\"connection.create\",(function(e){var i=e.context.source,r=e.context.target,o=n(r);Mr(i,\"bpmn:EventBasedGateway\")&&Mr(r,\"bpmn:ReceiveTask\")&&o.length>0&&t.removeElements(o)})),this.postExecute(\"connection.reconnect\",(function(e){var i=e.context.oldSource,r=e.context.newSource;Mr(i,\"bpmn:Gateway\")&&Mr(r,\"bpmn:EventBasedGateway\")&&g(r.outgoing,(function(e){var i=e.target,r=n(i);Mr(i,\"bpmn:ReceiveTask\")&&r.length>0&&t.removeElements(r)}))}))}function wd(e){e.invoke(ua,this),this.preExecute(\"shape.create\",1500,(function(e){var t=e.context,n=t.parent,i=t.shape;Mr(n,\"bpmn:Lane\")&&!Mr(i,\"bpmn:Lane\")&&(t.parent=hp(n,\"bpmn:Participant\"))}))}function Ed(e,t){ua.call(this,e),this.preExecute(\"shape.create\",(function(e){var n=e.context.shape;if(Mr(n,\"bpmn:DataObjectReference\")&&\"label\"!==n.type){var i=t.create(\"bpmn:DataObject\");n.businessObject.dataObjectRef=i}}))}bd.$inject=[\"bpmnReplace\",\"injector\"],e(bd,ua),bd.prototype._replaceShape=function(e,t){var n,i=(n=Br(e).eventDefinitions)&&n[0],r={type:\"bpmn:BoundaryEvent\",host:t};return i&&(r.eventDefinitionType=i.$type),this._bpmnReplace.replaceElement(e,r,{layoutConnection:!1})},_d.$inject=[\"eventBus\",\"modeling\"],e(_d,ua),wd.$inject=[\"injector\"],e(wd,ua),Ed.$inject=[\"eventBus\",\"bpmnFactory\"],e(Ed,ua);var Sd=20,Cd=20,Rd=30,Pd=2e3;function Td(e,t,n){function i(){var t=e.getRootElement();return Mr(t,\"bpmn:Collaboration\")?t:n.makeCollaboration()}ua.call(this,t),t.on([\"create.start\",\"shape.move.start\"],Pd,(function(t){var n=t.context,i=n.shape,r=e.getRootElement();if(Mr(i,\"bpmn:Participant\")&&Mr(r,\"bpmn:Process\")&&r.children.length){var o=r.children.filter((function(e){return!Mr(e,\"bpmn:Group\")&&!mn(e)&&!fn(e)}));if(o.length){var a=vt(o),s=function(e,t){t={width:t.width+2*Sd+Rd,height:t.height+2*Cd};var n=Math.max(e.width,t.width),i=Math.max(e.height,t.height);return{x:-n/2,y:-i/2,width:n,height:i}}(i,a);L(i,s),n.createConstraints=function(e,t){return t=gn(t),{bottom:t.top+e.height/2-Cd,left:t.right-e.width/2+Sd,top:t.bottom-e.height/2+Cd,right:t.left+e.width/2-Sd-Rd}}(i,a)}}})),t.on(\"create.start\",Pd,(function(n){var i=n.context.shape,r=e.getRootElement(),o=e.getGraphics(r);function a(e){e.element=r,e.gfx=o}Mr(i,\"bpmn:Participant\")&&Mr(r,\"bpmn:Process\")&&(t.on(\"element.hover\",Pd,a),t.once(\"create.cleanup\",(function(){t.off(\"element.hover\",a)})))})),this.preExecute(\"elements.create\",Pd,(function(e){var t,n=e.elements,r=e.parent,o=function(e){return m(e,(function(e){return Mr(e,\"bpmn:Participant\")}))}(n);o&&Mr(r,\"bpmn:Process\")&&(e.parent=i(),(t=e.hints=e.hints||{}).participant=o,t.process=r,t.processRef=Br(o).get(\"processRef\"))}),!0),this.preExecute(\"shape.create\",(function(e){var t=e.parent,n=e.shape;Mr(n,\"bpmn:Participant\")&&Mr(t,\"bpmn:Process\")&&(e.parent=i(),e.process=t,e.processRef=Br(n).get(\"processRef\"))}),!0),this.execute(\"shape.create\",(function(e){var t=e.hints||{},n=e.process||t.process,i=e.shape,r=t.participant;!n||r&&i!==r||Br(i).set(\"processRef\",Br(n))}),!0),this.revert(\"shape.create\",(function(e){var t=e.hints||{},n=e.process||t.process,i=e.processRef||t.processRef,r=e.shape,o=t.participant;!n||o&&r!==o||Br(r).set(\"processRef\",i)}),!0),this.postExecute(\"shape.create\",(function(e){var t=e.hints||{},i=e.process||e.hints.process,r=e.shape,o=t.participant;if(i){var a=i.children.slice();o?r===o&&n.moveElements(a,{x:0,y:0},o):n.moveElements(a,{x:0,y:0},r)}}),!0)}Td.$inject=[\"canvas\",\"eventBus\",\"modeling\"],e(Td,ua);var kd=\"__targetRef_placeholder\";function Ad(e,t){function n(e,n){var i=e.get(\"properties\"),r=m(i,(function(e){return e.name===kd}));return!r&&n&&Et(i,r=t.create(\"bpmn:Property\",{name:kd})),r}function i(e,t){var i=n(e);i&&(function(e,t,n){return m(e.get(\"dataInputAssociations\"),(function(e){return e!==n&&e.targetRef===t}))}(e,i,t)||wt(e.get(\"properties\"),i))}function r(e){var t,r=e.context,o=r.connection,a=o.businessObject,s=o.target,c=s&&s.businessObject,p=r.newTarget,l=p&&p.businessObject,u=r.oldTarget||r.target,h=u&&u.businessObject,d=o.businessObject;h&&h!==c&&i(h,a),l&&l!==c&&i(l,a),c?(t=n(c,!0),d.targetRef=t):d.targetRef=null}ua.call(this,e),this.executed([\"connection.create\",\"connection.delete\",\"connection.move\",\"connection.reconnect\"],Md(r)),this.reverted([\"connection.create\",\"connection.delete\",\"connection.move\",\"connection.reconnect\"],Md(r))}function Md(e){return function(t){if(Mr(t.context.connection,\"bpmn:DataInputAssociation\"))return e(t)}}function Dd(e){this._bpmnUpdater=e}function Bd(e,t,n,i){function r(e){return e.children.filter((function(e){return Mr(e,\"bpmn:DataStoreReference\")&&!e.labelTarget}))}function o(e,i){var r=e.businessObject||e;if(i=i||n.filter((function(e){return Mr(e,\"bpmn:Participant\")&&Br(e).processRef}))[0]){var o=i.businessObject||i;t.execute(\"dataStore.updateContainment\",{dataStoreBo:r,dataStoreDi:Nr(e),newSemanticParent:o.processRef||o,newDiParent:Nr(i)})}}ua.call(this,i),t.registerHandler(\"dataStore.updateContainment\",Dd),this.preExecute(\"shape.create\",(function(e){var t=e.context,n=t.shape;Mr(n,\"bpmn:DataStoreReference\")&&\"label\"!==n.type&&(t.hints||(t.hints={}),t.hints.autoResize=!1)})),this.preExecute(\"elements.move\",(function(e){var t=e.context,n=t.shapes;n.filter((function(e){return Mr(e,\"bpmn:DataStoreReference\")})).length&&(t.hints||(t.hints={}),t.hints.autoResize=n.filter((function(e){return!Mr(e,\"bpmn:DataStoreReference\")})))})),this.postExecute(\"shape.create\",(function(e){var t=e.context.shape,n=t.parent;Mr(t,\"bpmn:DataStoreReference\")&&\"label\"!==t.type&&Mr(n,\"bpmn:Collaboration\")&&o(t)})),this.postExecute(\"shape.move\",(function(e){var t=e.context,n=t.shape,i=t.oldParent,r=n.parent;Mr(i,\"bpmn:Collaboration\")||Mr(n,\"bpmn:DataStoreReference\")&&\"label\"!==n.type&&Mr(r,\"bpmn:Collaboration\")&&o(n,Mr(i,\"bpmn:Participant\")?i:function(e,t){for(;e.parent;){if(Mr(e.parent,t))return e.parent;e=e.parent}}(i,\"bpmn:Participant\"))})),this.postExecute(\"shape.delete\",(function(t){var n=t.context.shape,i=e.getRootElement();Dr(n,[\"bpmn:Participant\",\"bpmn:SubProcess\"])&&Mr(i,\"bpmn:Collaboration\")&&r(i).filter((function(e){return function(e,t){var n=e.businessObject||e,i=t.businessObject||t;for(;n.$parent;){if(n.$parent===i.processRef||i)return!0;n=n.$parent}return!1}(e,n)})).forEach((function(e){o(e)}))})),this.postExecute(\"canvas.updateRoot\",(function(e){var t=e.context,n=t.oldRoot,i=t.newRoot;r(n).forEach((function(e){Mr(i,\"bpmn:Process\")&&o(e,i)}))}))}Ad.$inject=[\"eventBus\",\"bpmnFactory\"],e(Ad,ua),Dd.$inject=[\"bpmnUpdater\"],Dd.prototype.execute=function(e){var t=e.dataStoreBo,n=e.dataStoreDi,i=e.newSemanticParent,r=e.newDiParent;return e.oldSemanticParent=t.$parent,e.oldDiParent=n.$parent,this._bpmnUpdater.updateSemanticParent(t,i),this._bpmnUpdater.updateDiParent(n,r),[]},Dd.prototype.revert=function(e){var t=e.dataStoreBo,n=e.dataStoreDi,i=e.oldSemanticParent,r=e.oldDiParent;return this._bpmnUpdater.updateSemanticParent(t,i),this._bpmnUpdater.updateDiParent(n,r),[]},Bd.$inject=[\"canvas\",\"commandStack\",\"elementRegistry\",\"eventBus\"],e(Bd,ua);function Nd(e,t){ua.call(this,e),this.postExecuted(\"shape.delete\",500,(function(e){var n=e.context,i=n.hints,r=n.shape,o=n.oldParent;Mr(r,\"bpmn:Lane\")&&(i&&i.nested||function(e,n){var i,r,o,a=rh(n),s=[],c=[];ft(a,(function(t){return t.y>e.y?c.push(t):s.push(t),t.children})),a.length&&(i=c.length&&s.length?e.height/2:e.height,s.length&&(r=t.calculateAdjustments(s,\"y\",i,e.y-10),t.makeSpace(r.movingShapes,r.resizingShapes,{x:0,y:i},\"s\")),c.length&&(o=t.calculateAdjustments(c,\"y\",-i,e.y+e.height+10),t.makeSpace(o.movingShapes,o.resizingShapes,{x:0,y:-i},\"n\")))}(r,o))}))}Nd.$inject=[\"eventBus\",\"spaceTool\"],e(Nd,ua);function Od(e,t){t.invoke(ua,this),this._bpmnReplace=e;var n=this;this.postExecuted(\"elements.create\",500,(function(e){var t=e.elements;t.filter((function(e){return jd(e,e.host)})).map((function(e){return t.indexOf(e)})).forEach((function(i){e.elements[i]=n._replaceShape(t[i])}))}),!0),this.preExecute(\"elements.move\",500,(function(e){var t=e.shapes,i=e.newHost;t.forEach((function(e,r){var o,a=e.host;jd(e,(o=a,-1!==t.indexOf(o)?a:i))&&(t[r]=n._replaceShape(e))}))}),!0)}function jd(e,t){return!mn(e)&&Mr(e,\"bpmn:BoundaryEvent\")&&!t}function Ld(e,t,n){function i(e,i,r){var o,a,s,c,p,l,h,d,f=i.waypoints,m=e.outgoing.slice(),v=e.incoming.slice(),g=Lp(f,d=u(r.width)?_n(r):r);if(g){if(o=f.slice(0,g.index),a=f.slice(g.index+(g.bendpoint?1:0)),!o.length||!a.length)return;s=g.bendpoint?f[g.index]:d,1!==o.length&&Id(e,o[o.length-1])||o.push($d(s)),1!==a.length&&Id(e,a[0])||a.unshift($d(s))}c=i.source,p=i.target,t.canConnect(c,e,i)&&(n.reconnectEnd(i,e,o||d),l=i),t.canConnect(e,p,i)&&(l?h=n.connect(e,p,{type:i.type,waypoints:a}):(n.reconnectStart(i,e,a||d),h=i));var b=[].concat(l&&y(v,(function(e){return e.source===l.source}))||[],h&&y(m,(function(e){return e.target===h.target}))||[]);b.length&&n.removeElements(b)}ua.call(this,e),this.preExecute(\"elements.move\",(function(e){var n=e.newParent,i=e.shapes,r=e.delta,o=i[0];if(o&&n){n&&n.waypoints&&(e.newParent=n=n.parent);var a=_n(o),s={x:a.x+r.x,y:a.y+r.y},c=m(n.children,(function(e){return t.canInsert(i,e)&&Lp(e.waypoints,s)}));c&&(e.targetFlow=c,e.position=s)}}),!0),this.postExecuted(\"elements.move\",(function(e){var t=e.shapes,n=e.targetFlow,r=e.position;n&&i(t[0],n,r)}),!0),this.preExecute(\"shape.create\",(function(e){var n=e.parent,i=e.shape;t.canInsert(i,n)&&(e.targetFlow=n,e.parent=n.parent)}),!0),this.postExecuted(\"shape.create\",(function(e){var t=e.shape,n=e.targetFlow,r=e.position;n&&i(t,n,r)}),!0)}function Id(e,t){var n=t.x,i=t.y;return n>=e.x&&n<=e.x+e.width&&i>=e.y&&i<=e.y+e.height}function $d(e){return L({},e)}function Fd(e,t){ua.call(this,e),this.preExecuted(\"connection.create\",(function(e){var n=e.context,i=n.connection,r=n.source,o=n.target,a=n.hints;if((!a||!1!==a.createElementsBehavior)&&zd(i)){var s=[];s=Mr(r,\"bpmn:EventBasedGateway\")?o.incoming.filter(zd):o.incoming.filter((function(e){return zd(e)&&Mr(e.source,\"bpmn:EventBasedGateway\")})),s.forEach((function(e){t.removeConnection(e)}))}})),this.preExecuted(\"shape.replace\",(function(e){var n=e.context.newShape;Mr(n,\"bpmn:EventBasedGateway\")&&n.outgoing.filter(zd).reduce((function(e,t){return e.includes(t.target)?e:e.concat(t.target)}),[]).forEach((function(e){e.incoming.filter(zd).forEach((function(i){const r=e.incoming.filter(zd).filter((function(e){return e.source===n}));(i.source!==n||r.length>1)&&t.removeConnection(i)}))}))}))}function zd(e){return Mr(e,\"bpmn:SequenceFlow\")}Od.$inject=[\"bpmnReplace\",\"injector\"],e(Od,ua),Od.prototype._replaceShape=function(e){var t,n,i=(n=Br(e).eventDefinitions)&&n[0];return t=i?{type:\"bpmn:IntermediateCatchEvent\",eventDefinitionType:i.$type}:{type:\"bpmn:IntermediateThrowEvent\"},this._bpmnReplace.replaceElement(e,t,{layoutConnection:!1})},e(Ld,ua),Ld.$inject=[\"eventBus\",\"bpmnRules\",\"modeling\"],Fd.$inject=[\"eventBus\",\"modeling\"],e(Fd,ua);var Hd=1500;function Gd(e,t,n){t.on([\"create.hover\",\"create.move\",\"create.out\",\"create.end\",\"shape.move.hover\",\"shape.move.move\",\"shape.move.out\",\"shape.move.end\"],Hd,(function(t){var i=t.context.shape||t.shape,r=t.hover;Mr(r,\"bpmn:Lane\")&&!Dr(i,[\"bpmn:Lane\",\"bpmn:Participant\"])&&(t.hover=oh(r),t.hoverGfx=e.getGraphics(t.hover));var o=n.getRootElement();r!==o&&(i.labelTarget||Mr(i,\"bpmn:Group\"))&&(t.hover=o,t.hoverGfx=e.getGraphics(t.hover))})),t.on([\"connect.hover\",\"connect.out\",\"connect.end\",\"connect.cleanup\",\"global-connect.hover\",\"global-connect.out\",\"global-connect.end\",\"global-connect.cleanup\"],Hd,(function(t){var n=t.hover;Mr(n,\"bpmn:Lane\")&&(t.hover=oh(n)||n,t.hoverGfx=e.getGraphics(t.hover))})),t.on([\"bendpoint.move.hover\"],Hd,(function(t){var n=t.context,i=t.hover,r=n.type;Mr(i,\"bpmn:Lane\")&&/reconnect/.test(r)&&(t.hover=oh(i)||i,t.hoverGfx=e.getGraphics(t.hover))})),t.on([\"connect.start\"],Hd,(function(e){var t=e.context,n=t.start;Mr(n,\"bpmn:Lane\")&&(t.start=oh(n)||n)})),t.on(\"shape.move.start\",2e3,(function(e){var t=e.shape;Mr(t,\"bpmn:Lane\")&&(e.shape=oh(t)||t)}))}Gd.$inject=[\"elementRegistry\",\"eventBus\",\"canvas\"];function Vd(e,t,n,i,r,o){function a(e,t,i){var r=n.filter((function(e){return Mr(e,\"bpmn:Group\")})).filter((function(e){return e.businessObject!==i}));t&&!function(e,t){return e.some((function(e){var n=Br(e);return(n.categoryValueRef&&n.categoryValueRef.$parent)===t}))}(r,t)&&function(e){var t=e.$parent;t&&(wt(t.get(\"rootElements\"),e),e.$parent=null)}(t),e&&!function(e,t){return e.some((function(e){return Br(e).categoryValueRef===t}))}(r,e)&&function(e){var t=e.$parent;t&&(wt(t.get(\"categoryValue\"),e),e.$parent=null)}(e)}function s(e,n){return function(e,t,n){return Et(t.get(\"categoryValue\"),e),e.$parent=t,Et(n.get(\"rootElements\"),t),t.$parent=n,e}(e,n,t.getDefinitions())}function c(n,i){var r=Br(n),o=r.categoryValueRef;o||(o=r.categoryValueRef=i.categoryValue=i.categoryValue||function(e){return e.create(\"bpmn:CategoryValue\")}(e));var a=o.$parent;a||(a=o.$parent=i.category=i.category||function(e){return e.create(\"bpmn:Category\")}(e)),s(o,a,t.getDefinitions())}function p(e,t){var n=t.category,i=t.categoryValue,r=Br(e);i?(r.categoryValueRef=null,a(i,n,r)):a(null,r.categoryValueRef.$parent,r)}function l(t,n){var i=e.create(t.$type);return o.copyElement(t,i,null,n)}r.invoke(ua,this),this.execute(\"label.create\",(function(e){var t=e.context,n=t.labelTarget;Mr(n,\"bpmn:Group\")&&c(n,t)})),this.revert(\"label.create\",(function(e){var t=e.context,n=t.labelTarget;Mr(n,\"bpmn:Group\")&&p(n,t)})),this.execute(\"shape.delete\",(function(e){var t=e.context,n=t.shape,i=Br(n);if(Mr(n,\"bpmn:Group\")&&!n.labelTarget){var r=t.categoryValue=i.categoryValueRef;r&&(a(r,t.category=r.$parent,i),i.categoryValueRef=null)}})),this.reverted(\"shape.delete\",(function(e){var t=e.context,n=t.shape;if(Mr(n,\"bpmn:Group\")&&!n.labelTarget){var i=t.category,r=t.categoryValue,o=Br(n);r&&(o.categoryValueRef=r,s(r,i))}})),this.execute(\"shape.create\",(function(e){var t=e.context,n=t.shape;Mr(n,\"bpmn:Group\")&&!n.labelTarget&&Br(n).categoryValueRef&&c(n,t)})),this.reverted(\"shape.create\",(function(e){var t=e.context,n=t.shape;Mr(n,\"bpmn:Group\")&&!n.labelTarget&&Br(n).categoryValueRef&&p(n,t)})),i.on(\"copyPaste.copyElement\",770,(function(e){var t=e.descriptor,n=e.element;if(Mr(n,\"bpmn:Group\")&&!n.labelTarget){var i=Br(n);if(i.categoryValueRef){var r=i.categoryValueRef;t.categoryValue=l(r,!0),r.$parent&&(t.category=l(r.$parent,!0))}}})),i.on(\"copyPaste.pasteElement\",770,(function(e){var t=e.descriptor,n=t.businessObject,i=t.categoryValue,r=t.category;i&&(i=n.categoryValueRef=l(i)),r&&(i.$parent=l(r)),delete t.category,delete t.categoryValue}))}function Wd(e,t,n,i){var r,o,a,s;return 0==(r=(i.y-n.y)*(t.x-e.x)-(i.x-n.x)*(t.y-e.y))?null:(o=e.y-n.y,a=e.x-n.x,s=((i.x-n.x)*o-(i.y-n.y)*a)/r,{x:Math.round(e.x+s*(t.x-e.x)),y:Math.round(e.y+s*(t.y-e.y))})}function Ud(e){function t(e,t,n){var i,r={x:n.x,y:n.y-50},o={x:n.x-50,y:n.y},a=Wd(e,t,n,r),s=Wd(e,t,n,o);i=a&&s?qd(a,n)>qd(s,n)?s:a:a||s,e.original=i}e.on(\"bpmnElement.added\",(function(e){var n,i,r=e.element;r.waypoints&&(t((i=(n=r).waypoints)[0],i[1],_n(n.source)),t(i[i.length-1],i[i.length-2],_n(n.target)))}))}function qd(e,t){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))}function Kd(e){ua.call(this,e);var t=[\"bpmn:Participant\",\"bpmn:Lane\"];this.executed([\"shape.move\",\"shape.create\",\"shape.resize\"],(function(e){var n=e.context.shape,i=Br(n),r=Nr(n);Dr(i,t)&&!r.get(\"isHorizontal\")&&r.set(\"isHorizontal\",!0)}))}Vd.$inject=[\"bpmnFactory\",\"bpmnjs\",\"elementRegistry\",\"eventBus\",\"injector\",\"moddleCopy\"],e(Vd,ua),Ud.$inject=[\"eventBus\"],Kd.$inject=[\"eventBus\"],e(Kd,ua);var Yd=Math.sqrt,Xd=Math.min,Zd=Math.max,Qd=Math.abs;function Jd(e){return Math.pow(e,2)}function ef(e,t){return Yd(Jd(e.x-t.x)+Jd(e.y-t.y))}function tf(e,t,n,i){var r=t.x-e.x,o=t.y-e.y,a=n.x-e.x,s=n.y-e.y,c=r*r+o*o,p=(r*a+o*s)/c,l=p*p-(a*a+s*s-i*i)/c;if(l<0&&l>-1e-6&&(l=0),l<0)return[];var u=Yd(l),h=-p+u,d=-p-u,f={x:e.x-r*h,y:e.y-o*h};return 0===l?[f]:[f,{x:e.x-r*d,y:e.y-o*d}].filter((function(n){return function(e,t,n){return nf(e.x,t.x,n.x)&&nf(e.y,t.y,n.y)}(n,e,t)}))}function nf(e,t,n){return e>=Xd(t,n)-rf&&e<=Zd(t,n)+rf}var rf=.1;function of(e,t){return Qd(e.x-t.x)<=rf&&Qd(e.y-t.y)<=rf}function af(e,t,n,i){var r=0,o=0,a={point:e,delta:{x:0,y:0}},s=function(e,t){var n,i,r,o,a,s,c,p,l,u,h,d,f=0;for(f=0;f<t.length-1;f++){if(of(n=t[f],i=t[f+1])?s=[n]:(r=ef(e,n),o=ef(e,i),s=tf(n,i,e,Xd(r,o))),s.length<1)throw new Error(\"expected between [1, 2] circle -> line intersections\");1===s.length&&(c={type:\"bendpoint\",position:s[0],segmentIndex:f,bendpointIndex:of(n,s[0])?f:f+1}),2===s.length&&(h=s[0],d=s[1],c={type:\"segment\",position:a={x:(h.x+d.x)/2,y:(h.y+d.y)/2},segmentIndex:f,relativeLocation:ef(n,a)/ef(n,i)}),p=ef(c.position,e),(!u||l>p)&&(u=c,l=p)}return u}(e,n),c=s.segmentIndex,p=function(e,t,n,i){var r=n.segmentIndex,o=t.length-e.length;if(i.segmentMove){var a=i.segmentMove.segmentStartIndex,s=i.segmentMove.newSegmentStartIndex;return r===a?s:r>=s?r+o<s?s:r+o:r}if(i.bendpointMove){var c,p=i.bendpointMove.insert,l=i.bendpointMove.bendpointIndex;return 0===o?r:(r>=l&&(c=p?r+1:r-1),r<l&&(c=r,p&&\"bendpoint\"!==n.type&&l-1===r&&sf(t,l)<n.relativeLocation&&c++),c)}return 0===o?r:i.connectionStart&&0===r?0:i.connectionEnd&&r===e.length-2?t.length-2:Math.floor((t.length-2)/2)}(n,t,s,i);if(p<0||p>t.length-2||null===p)return a;var l,u,h=cf(n,c),d=cf(t,p),f=s.position,m=function(e,t){var n=Hp(e[0],e[1]),i=Hp(e[0],t);return 0===n?0:i/n}(h,f),v=(l=d,u=$p(h),$p(l)-u);if(\"bendpoint\"===s.type){var y=t.length-n.length,g=s.bendpointIndex,b=n[g];if(-1!==t.indexOf(b))return a;if(0===y){var x=t[g];return{delta:{x:r=x.x-s.position.x,y:o=x.y-s.position.y},point:{x:e.x+r,y:e.y+o}}}y<0&&0!==g&&g<n.length-1&&(m=sf(n,g))}var _,w,E={x:(d[1].x-d[0].x)*m+d[0].x,y:(d[1].y-d[0].y)*m+d[0].y},S=(_={x:e.x-f.x,y:e.y-f.y},(w=v)?{x:Math.cos(w)*_.x-Math.sin(w)*_.y,y:Math.sin(w)*_.x+Math.cos(w)*_.y}:_);return r=E.x+S.x-e.x,o=E.y+S.y-e.y,{point:yn(E),delta:yn({x:r,y:o})}}function sf(e,t){var n=Hp(e[t-1],e[t]);return n/(n+Hp(e[t],e[t+1]))}function cf(e,t){return[e[t],e[t+1]]}function pf(e,t,n){var i=ns(t),r=ns(n),o=is(e,i),a=o.x*(n.width/t.width),s=o.y*(n.height/t.height);return yn({x:r.x+a,y:r.y+s})}function lf(e,t,n){var i=ns(e),r=ns(t),o=ns(n),a=is(e,i),s=is(i,r),c=function(e,t,n){var i=gn(t),r=gn(n);if(function(e,t){return function(e,t){return e.right!==t.right&&e.left!==t.left}(e,t)||function(e,t){return e.top!==t.top&&e.bottom!==t.bottom}(e,t)}(i,r))return null;var o,a,s,c=wn(t,e);if(\"top\"===c)o={x:0,y:r.bottom-i.bottom};else if(\"bottom\"===c)o={x:0,y:r.top-i.top};else if(\"right\"===c)o={x:r.left-i.left,y:0};else{if(\"left\"!==c)return null;o={x:r.right-i.right,y:0}}if(a={x:e.x+o.x,y:e.y+o.y},s=wn(n,a),s!==c)return null;return o}(i,t,n);if(c)return c;var p=s.x*(n.width/t.width),l=s.y*(n.height/t.height),u=o.x+p,h=o.y+l;return yn({x:u+a.x-e.x,y:h+a.y-e.y})}var uf=\"name\",hf=\"text\";function df(e,t,n,i){function r(e){var n=e.context,r=n.element,o=n.properties;if(uf in o&&t.updateLabel(r,o[uf]),hf in o&&Mr(r,\"bpmn:TextAnnotation\")){var a=i.getTextAnnotationBounds({x:r.x,y:r.y,width:r.width,height:r.height},o[hf]||\"\");t.updateLabel(r,o.text,a)}}function o(e){var t=e.context,n=t.connection,i=n.label,r=L({},t.hints),o=t.newWaypoints||n.waypoints,a=t.oldWaypoints;return void 0===r.startChanged&&(r.startChanged=!!r.connectionStart),void 0===r.endChanged&&(r.endChanged=!!r.connectionEnd),function(e,t,n,i){return af(_n(e),t,n,i).delta}(i,o,a,r)}ua.call(this,e),this.postExecute(\"element.updateProperties\",r),this.postExecute(\"element.updateModdleProperties\",(e=>{Br(e.context.element)===e.context.moddleElement&&r(e)})),this.postExecute([\"shape.create\",\"connection.create\"],(function(e){var n=e.context;if(!1!==(n.hints||{}).createElementsBehavior){var i=n.shape||n.connection;!mn(i)&&no(i)&&so(i)&&t.updateLabel(i,so(i))}})),this.postExecute(\"shape.delete\",(function(e){var n=e.context,i=n.labelTarget,r=n.hints||{};i&&!1!==r.unsetLabel&&t.updateLabel(i,null,null,{removeShape:!1})})),this.postExecute([\"connection.layout\",\"connection.updateWaypoints\"],(function(e){var n=e.context;if(!1!==(n.hints||{}).labelBehavior){var i,r=n.connection.label;r&&r.parent&&(i=o(e),t.moveShape(r,i))}})),this.postExecute([\"shape.replace\"],(function(e){var t=e.context,n=t.newShape,i=t.oldShape,r=Br(n);r&&no(r)&&i.label&&n.label&&(n.label.x=i.label.x,n.label.y=i.label.y)})),this.postExecute(\"shape.resize\",(function(e){var n,i=e.context,r=i.shape,o=i.newBounds,a=i.oldBounds;if(io(r)){var s=r.label,c=function(e,t){if(!t.length)return;var n=function(e,t){var n=t.map((function(t){return{line:t,distance:zp(e,t)}}));return k(n,\"distance\")[0].line}(e,t);return Fp(e,n)}(_n(s),[[{x:(n=a).x,y:n.y},{x:n.x+(n.width||0),y:n.y}],[{x:n.x+(n.width||0),y:n.y},{x:n.x+(n.width||0),y:n.y+(n.height||0)}],[{x:n.x,y:n.y+(n.height||0)},{x:n.x+(n.width||0),y:n.y+(n.height||0)}],[{x:n.x,y:n.y},{x:n.x,y:n.y+(n.height||0)}]]),p=ff(c,a,o);t.moveShape(s,p)}}))}function ff(e,t,n){return yn(is(pf(e,t,n),e))}function mf(e,t){function n(e,t){var n=e.context,i=n.connection,r=L({},n.hints),o=n.newWaypoints||i.waypoints,a=n.oldWaypoints;return void 0===r.startChanged&&(r.startChanged=!!r.connectionStart),void 0===r.endChanged&&(r.endChanged=!!r.connectionEnd),function(e,t,n,i){return af(e,t,n,i).point}(t,o,a,r)}ua.call(this,e),this.postExecute([\"connection.layout\",\"connection.updateWaypoints\"],(function(e){var i=e.context.connection,r=i.outgoing;i.incoming.forEach((function(i){var r=i.waypoints[i.waypoints.length-1],o=n(e,r),a=[].concat(i.waypoints.slice(0,-1),[o]);t.updateWaypoints(i,a)})),r.forEach((function(i){var r=i.waypoints[0],o=n(e,r),a=[].concat([o],i.waypoints.slice(1));t.updateWaypoints(i,a)}))})),this.postExecute([\"connection.move\"],(function(e){var n=e.context,i=n.connection,r=i.outgoing,o=i.incoming,a=n.delta;o.forEach((function(e){var n=e.waypoints[e.waypoints.length-1],i={x:n.x+a.x,y:n.y+a.y},r=[].concat(e.waypoints.slice(0,-1),[i]);t.updateWaypoints(e,r)})),r.forEach((function(e){var n=e.waypoints[0],i={x:n.x+a.x,y:n.y+a.y},r=[].concat([i],e.waypoints.slice(1));t.updateWaypoints(e,r)}))}))}function vf(e,t,n){var i=_f(e),r=wf(i,t),o=i[0];return r.length?r[r.length-1]:pf(o.original||o,n,t)}function yf(e,t,n){var i=_f(e),r=wf(i,t),o=i[i.length-1];return r.length?r[0]:pf(o.original||o,n,t)}function gf(e,t,n){var i=_f(e),r=xf(t,n),o=i[0];return pf(o.original||o,r,t)}function bf(e,t,n){var i=_f(e),r=xf(t,n),o=i[i.length-1];return pf(o.original||o,r,t)}function xf(e,t){return{x:e.x-t.x,y:e.y-t.y,width:e.width,height:e.height}}function _f(e){var t=e.waypoints;if(!t.length)throw new Error(\"connection#\"+e.id+\": no waypoints\");return t}function wf(e,t){return y(E(e,Ef),(function(e){return function(e,t){return\"intersect\"===wn(t,e,1)}(e,t)}))}function Ef(e){return e.original||e}function Sf(e,t){ua.call(this,e),this.postExecute(\"shape.replace\",(function(e){var n=e.oldShape,i=e.newShape;if(function(e,t){return Mr(e,\"bpmn:Participant\")&&Zr(e)&&Mr(t,\"bpmn:Participant\")&&!Zr(t)}(n,i)){var r,o,a,s,c=(o=mt([r=n],!1),a=[],s=[],o.forEach((function(e){e!==r&&(e.incoming.forEach((function(e){Mr(e,\"bpmn:MessageFlow\")&&a.push(e)})),e.outgoing.forEach((function(e){Mr(e,\"bpmn:MessageFlow\")&&s.push(e)})))}),[]),{incoming:a,outgoing:s});c.incoming.forEach((function(e){var r=yf(e,i,n);t.reconnectEnd(e,i,r)})),c.outgoing.forEach((function(e){var r=vf(e,i,n);t.reconnectStart(e,i,r)}))}}),!0)}e(df,ua),df.$inject=[\"eventBus\",\"modeling\",\"bpmnFactory\",\"textRenderer\"],e(mf,ua),mf.$inject=[\"eventBus\",\"modeling\"],Sf.$inject=[\"eventBus\",\"modeling\"],e(Sf,ua);function Cf(e,t,n){e.on([\"shape.move.rejected\",\"create.rejected\"],(function(e){var i,r,o,a=e.context,s=a.shape;Mr(a.target,\"bpmn:Collaboration\")&&Mr(s,\"bpmn:FlowNode\")&&(i=e,r=n(\"flow elements must be children of pools/participants\"),t.add({position:{x:i.x+5,y:i.y+5},type:\"error\",timeout:o||2e3,html:\"<div>\"+r+\"</div>\"}))}))}function Rf(e,t){ua.call(this,e),this.preExecute(\"shape.resize\",(function(e){var n=e.shape,i=Nr(n),r=i&&i.get(\"label\");r&&r.get(\"bounds\")&&t.updateModdleProperties(n,r,{bounds:void 0})}),!0)}function Pf(e,t,n){ua.call(this,e),this.preExecute(\"shape.delete\",(function(e){var i=e.context.shape;if(1===i.incoming.length&&1===i.outgoing.length){var r=i.incoming[0],o=i.outgoing[0];if(Mr(r,\"bpmn:SequenceFlow\")&&Mr(o,\"bpmn:SequenceFlow\")&&t.canConnect(r.source,o.target,r)){var a=function(e,t){var n=Wd(Tf(e[e.length-2]),Tf(e[e.length-1]),Tf(t[1]),Tf(t[0]));return n?[].concat(e.slice(0,e.length-1),[n],t.slice(1)):[Tf(e[0]),Tf(t[t.length-1])]}(r.waypoints,o.waypoints);n.reconnectEnd(r,o.target,a)}}}))}function Tf(e){return e.original||e}function kf(e,t){ua.call(this,e),this.preExecute(\"shape.delete\",(function(e){var t=e.shape,n=t.parent;Mr(t,\"bpmn:Participant\")&&(e.collaborationRoot=n)}),!0),this.postExecute(\"shape.delete\",(function(e){var n=e.collaborationRoot;n&&!n.businessObject.participants.length&&t.makeProcess()}),!0)}function Af(e,t,n,i){ua.call(this,e);var r=i.get(\"dragging\",!1);function o(e){var i,r,o=e.source,a=e.target;e.parent&&(Mr(e,\"bpmn:SequenceFlow\")&&(n.canConnectSequenceFlow(o,a)||(r=!0),n.canConnectMessageFlow(o,a)&&(i=\"bpmn:MessageFlow\")),Mr(e,\"bpmn:MessageFlow\")&&(n.canConnectMessageFlow(o,a)||(r=!0),n.canConnectSequenceFlow(o,a)&&(i=\"bpmn:SequenceFlow\")),Mr(e,\"bpmn:Association\")&&!n.canConnectAssociation(o,a)&&(r=!0),r&&t.removeConnection(e),i&&t.connect(o,a,{type:i,waypoints:e.waypoints.slice()}))}this.postExecuted(\"elements.move\",(function(e){g(e.closure.allConnections,o)}),!0),this.preExecute(\"connection.reconnect\",(function(e){var i,o,a=e.context,s=a.connection,c=a.newSource||s.source,p=a.newTarget||s.target;(i=n.canConnect(c,p))&&i.type!==s.type&&(o=t.connect(c,p,{type:i.type,waypoints:s.waypoints.slice()}),t.removeConnection(s),a.connection=o,r&&function(e,t){var n,i=r.context(),o=i&&i.payload.previousSelection;if(!o||!o.length)return;if(-1===(n=o.indexOf(e)))return;o.splice(n,1,t)}(s,o))})),this.postExecuted(\"element.updateProperties\",(function(e){var n,i=e.context,r=i.properties,o=i.element,a=o.businessObject;r.default&&(n=m(o.outgoing,A({id:o.businessObject.default.id})))&&t.updateProperties(n,{conditionExpression:void 0}),r.conditionExpression&&a.sourceRef.default===a&&t.updateProperties(o.source,{default:void 0})}))}function Mf(e,t,n,i,r,o){i.invoke(ua,this),this._bpmnReplace=e,this._elementRegistry=n,this._selection=o,this.postExecuted([\"elements.create\"],500,(function(e){var n=e.context,i=n.parent,r=n.elements,o=x(r,(function(e,n){var r=t.canReplace([n],n.host||n.parent||i);return r?e.concat(r.replacements):e}),[]);o.length&&this._replaceElements(r,o)}),this),this.postExecuted([\"elements.move\"],500,(function(e){var n=e.context,i=n.newParent,r=n.newHost,o=[];g(n.closure.topLevel,(function(e){o=Qr(e)?o.concat(e.children):o.concat(e)})),1===o.length&&r&&(i=r);var a=t.canReplace(o,i);a&&this._replaceElements(o,a.replacements,r)}),this),this.postExecute([\"shape.replace\"],1500,(function(e){var n,i=e.context,r=i.oldShape,o=i.newShape,a=r.attachers;a&&a.length&&(n=t.canReplace(a,o),this._replaceElements(a,n.replacements))}),this),this.postExecuted([\"shape.replace\"],1500,(function(e){var t=e.context,n=t.oldShape,i=t.newShape;r.unclaimId(n.businessObject.id,n.businessObject),r.updateProperties(i,{id:n.id})}))}Cf.$inject=[\"eventBus\",\"tooltips\",\"translate\"],e(Rf,ua),Rf.$inject=[\"eventBus\",\"modeling\"],e(Pf,ua),Pf.$inject=[\"eventBus\",\"bpmnRules\",\"modeling\"],kf.$inject=[\"eventBus\",\"modeling\"],e(kf,ua),e(Af,ua),Af.$inject=[\"eventBus\",\"modeling\",\"bpmnRules\",\"injector\"],e(Mf,ua),Mf.prototype._replaceElements=function(e,t){var n=this._elementRegistry,i=this._bpmnReplace,r=this._selection;g(t,(function(t){var r={type:t.newElementType},o=n.get(t.oldElementId),a=e.indexOf(o);e[a]=i.replaceElement(o,r,{select:!1})})),t&&r.select(e)},Mf.$inject=[\"bpmnReplace\",\"bpmnRules\",\"elementRegistry\",\"injector\",\"modeling\",\"selection\"];var Df={width:140,height:120},Bf={width:300,height:60},Nf={width:300,height:150},Of={width:140,height:120},jf={width:50,height:30};function Lf(e){e.on(\"resize.start\",1500,(function(e){var t=e.context,n=t.shape,i=t.direction,r=t.balanced;(Mr(n,\"bpmn:Lane\")||Mr(n,\"bpmn:Participant\"))&&(t.resizeConstraints=function(e,t,n){var i=oh(e),r=!0,o=!0,a=ih(i,[i]),s=gn(e),c={},p={};/e/.test(t)?p.right=s.left+Bf.width:/w/.test(t)&&(p.left=s.right-Bf.width);a.forEach((function(e){var i=gn(e);/n/.test(t)&&(i.top<s.top-10&&(r=!1),n&&If(s.top-i.bottom)<10&&Gf(c,\"top\",i.top+Bf.height),If(s.top-i.top)<5&&Hf(p,\"top\",i.bottom-Bf.height)),/s/.test(t)&&(i.bottom>s.bottom+10&&(o=!1),n&&If(s.bottom-i.top)<10&&Hf(c,\"bottom\",i.bottom-Bf.height),If(s.bottom-i.bottom)<5&&Gf(p,\"bottom\",i.top+Bf.height))}));var l=i.children.filter((function(e){return!e.hidden&&!e.waypoints&&(Mr(e,\"bpmn:FlowElement\")||Mr(e,\"bpmn:Artifact\"))}));return l.forEach((function(e){var n=gn(e);r&&/n/.test(t)&&Hf(p,\"top\",n.top-Uf),/e/.test(t)&&Gf(p,\"right\",n.right+Vf),o&&/s/.test(t)&&Gf(p,\"bottom\",n.bottom+qf),/w/.test(t)&&Hf(p,\"left\",n.left-Wf)})),{min:p,max:c}}(n,i,r)),Mr(n,\"bpmn:Participant\")&&(t.minDimensions=Nf),Mr(n,\"bpmn:SubProcess\")&&Zr(n)&&(t.minDimensions=Of),Mr(n,\"bpmn:TextAnnotation\")&&(t.minDimensions=jf)}))}Lf.$inject=[\"eventBus\"];var If=Math.abs,$f=Math.min,Ff=Math.max;function zf(e,t,n,i){var r=e[t];e[t]=void 0===r?n:i(n,r)}function Hf(e,t,n){return zf(e,t,n,$f)}function Gf(e,t,n){return zf(e,t,n,Ff)}var Vf=20,Wf=50,Uf=20,qf=20;function Kf(e,t){e.on(\"resize.start\",1501,(function(e){var t=e.context,n=t.shape;(Mr(n,\"bpmn:Lane\")||Mr(n,\"bpmn:Participant\"))&&(t.balanced=!zo(e))})),e.on(\"resize.end\",1001,(function(e){var n=e.context,i=n.shape,r=n.canExecute,o=n.newBounds;if(Mr(i,\"bpmn:Lane\")||Mr(i,\"bpmn:Participant\"))return r&&(o=vn(o),t.resizeLane(i,o,n.balanced)),!1}))}Kf.$inject=[\"eventBus\",\"modeling\"];function Yf(e,t,n,i,r){function o(e){return Dr(e,[\"bpmn:ReceiveTask\",\"bpmn:SendTask\"])||function(e,t){p(t)||(t=[t]);return w(t,(function(t){return Jr(e,t)}))}(e,[\"bpmn:ErrorEventDefinition\",\"bpmn:EscalationEventDefinition\",\"bpmn:MessageEventDefinition\",\"bpmn:SignalEventDefinition\"])}function a(t){return!!m(e.getDefinitions().get(\"rootElements\"),A({id:t.id}))}function s(e){return Mr(e,\"bpmn:ErrorEventDefinition\")?\"errorRef\":Mr(e,\"bpmn:EscalationEventDefinition\")?\"escalationRef\":Mr(e,\"bpmn:MessageEventDefinition\")?\"messageRef\":Mr(e,\"bpmn:SignalEventDefinition\")?\"signalRef\":void 0}function c(e){if(Dr(e,[\"bpmn:ReceiveTask\",\"bpmn:SendTask\"]))return e.get(\"messageRef\");var t=e.get(\"eventDefinitions\")[0];return t.get(s(t))}n.invoke(ua,this),this.executed([\"shape.create\",\"element.updateProperties\",\"element.updateModdleProperties\"],(function(t){var n=t.shape||t.element;if(o(n)){var i=c(Br(n));i&&!a(i)&&(Et(e.getDefinitions().get(\"rootElements\"),i),t.addedRootElement=i)}}),!0),this.reverted([\"shape.create\",\"element.updateProperties\",\"element.updateModdleProperties\"],(function(t){var n=t.addedRootElement;n&&wt(e.getDefinitions().get(\"rootElements\"),n)}),!0),t.on(\"copyPaste.copyElement\",(function(e){var t=e.descriptor,n=e.element;if(!n.labelTarget&&o(n)){var i=c(Br(n));i&&(t.referencedRootElement=i)}})),t.on(\"copyPaste.pasteElement\",500,(function(e){var t=e.descriptor,n=t.businessObject,o=t.referencedRootElement;o&&(a(o)||(o=i.copyElement(o,r.create(o.$type))),function(e,t){if(Dr(e,[\"bpmn:ReceiveTask\",\"bpmn:SendTask\"]))return e.set(\"messageRef\",t);var n=e.get(\"eventDefinitions\")[0];n.set(s(n),t)}(n,o),delete t.referencedRootElement)}))}Yf.$inject=[\"bpmnjs\",\"eventBus\",\"injector\",\"moddleCopy\",\"bpmnFactory\"],e(Yf,ua);var Xf=Math.max;function Zf(e){e.on(\"spaceTool.getMinDimensions\",(function(e){var t=e.shapes,n=e.axis,i=e.start,r={};return g(t,(function(e){var t=e.id;Mr(e,\"bpmn:Participant\")&&(!function(e){return\"x\"===e}(n)?r[t]={width:Nf.width,height:Qf(e,i)}:r[t]=Nf),Mr(e,\"bpmn:SubProcess\")&&Zr(e)&&(r[t]=Of),Mr(e,\"bpmn:TextAnnotation\")&&(r[t]=jf),Mr(e,\"bpmn:Group\")&&(r[t]=Df)})),r}))}function Qf(e,t){var n;return rh(e).length?(n=function(e,t){var n,i=rh(e);return n=Jf(i,t),e.height-n.height+Bf.height}(e,t),Xf(Nf.height,n)):Nf.height}function Jf(e,t){var n,i,r;for(n=0;n<e.length;n++)if(t>=(i=e[n]).y&&t<=i.y+i.height)return(r=rh(i)).length?Jf(r,t):i}Zf.$inject=[\"eventBus\"];var em=180,tm=160;function nm(e,t,n,i,r,o,a){ua.call(this,t),this._canvas=e,this._eventBus=t,this._modeling=n,this._elementFactory=i,this._bpmnFactory=r,this._bpmnjs=o,this._elementRegistry=a;var s=this;function c(e){return Mr(e,\"bpmn:SubProcess\")&&!Zr(e)}function p(t){var n=t.shape,i=t.newRootElement,r=Br(n);i=s._addDiagram(i||r),t.newRootElement=e.addRootElement(i)}function l(t){var n=Br(t.shape);s._removeDiagram(n);var i=t.newRootElement=a.get(xa(n));e.removeRootElement(i)}this.executed(\"shape.create\",(function(e){c(e.shape)&&p(e)}),!0),this.postExecuted(\"shape.create\",(function(e){var t=e.shape,n=e.newRootElement;n&&t.children&&(s._showRecursively(t.children),s._moveChildrenToShape(t,n))}),!0),this.reverted(\"shape.create\",(function(e){c(e.shape)&&l(e)}),!0),this.preExecuted(\"shape.delete\",(function(e){var t=e.shape;if(c(t)){var i=a.get(xa(t));i&&n.removeElements(i.children.slice())}}),!0),this.executed(\"shape.delete\",(function(e){c(e.shape)&&l(e)}),!0),this.reverted(\"shape.delete\",(function(e){c(e.shape)&&p(e)}),!0),this.preExecuted(\"shape.replace\",(function(t){var n=t.oldShape,i=t.newShape;c(n)&&c(i)&&(t.oldRoot=e.removeRootElement(xa(n)))}),!0),this.postExecuted(\"shape.replace\",(function(t){var i=t.newShape,r=t.oldRoot,o=e.findRoot(xa(i));if(r&&o){var a=r.children;n.moveElements(a,{x:0,y:0},o)}}),!0),this.executed(\"element.updateProperties\",(function(e){var t=e.element;if(Mr(t,\"bpmn:SubProcess\")){var n=e.properties,i=e.oldProperties.id,r=n.id;if(i!==r){if(wa(t))return a.updateId(t,_a(r)),void a.updateId(i,r);a.get(_a(i))&&a.updateId(_a(i),_a(r))}}}),!0),this.reverted(\"element.updateProperties\",(function(e){var t=e.element;if(Mr(t,\"bpmn:SubProcess\")){var n=e.properties,i=e.oldProperties.id,r=n.id;if(i!==r){if(wa(t))return a.updateId(t,_a(i)),void a.updateId(r,i);var o=a.get(_a(r));o&&a.updateId(o,_a(i))}}}),!0),t.on(\"element.changed\",(function(e){var n=e.element;if(wa(n)){var i=n,r=a.get(ba(i));r&&r!==i&&t.fire(\"element.changed\",{element:r})}})),this.executed(\"shape.toggleCollapse\",400,(function(e){var t=e.shape;Mr(t,\"bpmn:SubProcess\")&&(Zr(t)?l(e):(p(e),s._showRecursively(t.children)))}),!0),this.reverted(\"shape.toggleCollapse\",400,(function(e){var t=e.shape;Mr(t,\"bpmn:SubProcess\")&&(Zr(t)?l(e):(p(e),s._showRecursively(t.children)))}),!0),this.postExecuted(\"shape.toggleCollapse\",600,(function(e){var t=e.shape;if(Mr(t,\"bpmn:SubProcess\")){var n=e.newRootElement;n&&(Zr(t)?s._moveChildrenToShape(n,t):s._moveChildrenToShape(t,n))}}),!0),t.on(\"copyPaste.createTree\",(function(e){var t=e.element,n=e.children;if(c(t)){var i=xa(t),r=a.get(i);r&&n.push.apply(n,r.children)}})),t.on(\"copyPaste.copyElement\",(function(e){var t=e.descriptor,n=e.element,i=e.elements,r=n.parent;if(Mr(Nr(r),\"bpmndi:BPMNPlane\")){var o=ba(r),a=m(i,(function(e){return e.id===o}));a&&(t.parent=a.id)}})),t.on(\"copyPaste.pasteElement\",(function(e){var t=e.descriptor;t.parent&&(c(t.parent)||t.parent.hidden)&&(t.hidden=!0)}))}function im(e,t){e.invoke(ua,this),this.postExecuted(\"shape.replace\",(function(e){var n=e.context.oldShape,i=e.context.newShape;if(Mr(i,\"bpmn:SubProcess\")&&(Mr(n,\"bpmn:Task\")||Mr(n,\"bpmn:CallActivity\"))&&Zr(i)){var r,o={x:(r=i).x+r.width/6,y:r.y+r.height/2};t.createShape({type:\"bpmn:StartEvent\"},o,i)}}))}function rm(e,t){ua.call(this,e),this.postExecuted(\"shape.toggleCollapse\",1500,(function(e){var n=e.shape;if(!Zr(n)){var i=mt(n);i.forEach((function(e){var t=e.incoming.slice(),n=e.outgoing.slice();g(t,(function(e){r(e,!0)})),g(n,(function(e){r(e,!1)}))}))}function r(e,r){-1!==i.indexOf(e.source)&&-1!==i.indexOf(e.target)||(r?t.reconnectEnd(e,n,_n(n)):t.reconnectStart(e,n,_n(n)))}}),!0)}e(nm,ua),nm.prototype._moveChildrenToShape=function(e,t){var n,i=this._modeling,r=e.children;if(r){var o=(r=r.concat(r.reduce((function(t,n){return n.label&&n.label.parent!==e?t.concat(n.label):t}),[]))).filter((function(e){return!e.hidden}));if(o.length){var a=vt(o);if(t.x){var s=_n(t),c=_n(a);n={x:s.x-c.x,y:s.y-c.y}}else n={x:em-a.x,y:tm-a.y};i.moveElements(r,n,t,{autoResize:!1})}else i.moveElements(r,{x:0,y:0},t,{autoResize:!1})}},nm.prototype._showRecursively=function(e,t){var n=this,i=[];return e.forEach((function(e){e.hidden=!!t,i=i.concat(e),e.children&&(i=i.concat(n._showRecursively(e.children,e.collapsed||t)))})),i},nm.prototype._addDiagram=function(e){var t=this._bpmnjs.getDefinitions().diagrams;return e.businessObject||(e=this._createNewDiagram(e)),t.push(e.di.$parent),e},nm.prototype._createNewDiagram=function(e){var t=this._bpmnFactory,n=this._elementFactory,i=t.create(\"bpmndi:BPMNPlane\",{bpmnElement:e}),r=t.create(\"bpmndi:BPMNDiagram\",{plane:i});return i.$parent=r,n.createRoot({id:xa(e),type:e.$type,di:i,businessObject:e,collapsed:!0})},nm.prototype._removeDiagram=function(e){var t=this._bpmnjs.getDefinitions().diagrams,n=m(t,(function(t){return t.plane.bpmnElement.id===e.id}));return t.splice(t.indexOf(n),1),n},nm.$inject=[\"canvas\",\"eventBus\",\"modeling\",\"elementFactory\",\"bpmnFactory\",\"bpmnjs\",\"elementRegistry\"],im.$inject=[\"injector\",\"modeling\"],e(im,ua),e(rm,ua),rm.$inject=[\"eventBus\",\"modeling\"];function om(e,t,n){ua.call(this,e),this.executed([\"shape.toggleCollapse\"],500,(function(e){var t,n=e.context.shape;Mr(n,\"bpmn:SubProcess\")&&(n.collapsed?Nr(n).isExpanded=!1:((t=n.children).length&&t.forEach((function(e){\"label\"!==e.type||e.businessObject.name||(e.hidden=!0)})),Nr(n).isExpanded=!0))})),this.reverted([\"shape.toggleCollapse\"],500,(function(e){var t=e.context.shape;t.collapsed?Nr(t).isExpanded=!1:Nr(t).isExpanded=!0})),this.postExecuted([\"shape.toggleCollapse\"],500,(function(e){var i,r=e.context.shape,o=t.getDefaultSize(r);i=r.collapsed?function(e,t){return{x:e.x+(e.width-t.width)/2,y:e.y+(e.height-t.height)/2,width:t.width,height:t.height}}(r,o):function(e,t){var n,i,r,o=e.children,a=t;return n=(r=o,r.filter((function(e){return!e.hidden}))).concat([e]),(i=Ju(n))?(a.width=Math.max(i.width,a.width),a.height=Math.max(i.height,a.height),a.x=i.x+(i.width-a.width)/2,a.y=i.y+(i.height-a.height)/2):(a.x=e.x+(e.width-a.width)/2,a.y=e.y+(e.height-a.height)/2),a}(r,o),n.resizeShape(r,i,null,{autoResize:!r.collapsed&&\"nwse\"})}))}function am(e,t,n,i){t.invoke(ua,this),this.preExecute(\"shape.delete\",(function(e){var t=e.context.shape,r=t.businessObject;mn(t)||(Mr(t,\"bpmn:Participant\")&&Zr(t)&&n.ids.unclaim(r.processRef.id),i.unclaimId(r.id,r))})),this.preExecute(\"connection.delete\",(function(e){var t=e.context.connection.businessObject;i.unclaimId(t.id,t)})),this.preExecute(\"canvas.updateRoot\",(function(){var t=e.getRootElement(),i=t.businessObject;Mr(t,\"bpmn:Collaboration\")&&n.ids.unclaim(i.id)}))}function sm(e,t){ua.call(this,e),this.preExecute(\"connection.delete\",(function(e){var n=e.context.connection,i=n.source;(function(e,t){if(!Mr(e,\"bpmn:SequenceFlow\"))return!1;var n=Br(t),i=Br(e);return n.get(\"default\")===i})(n,i)&&t.updateProperties(i,{default:null})}))}e(om,ua),om.$inject=[\"eventBus\",\"elementFactory\",\"modeling\"],e(am,ua),am.$inject=[\"canvas\",\"injector\",\"moddle\",\"modeling\"],e(sm,ua),sm.$inject=[\"eventBus\",\"modeling\"];function cm(e,t,n){var i;function r(){if(!i)throw new Error(n(\"out of bounds release\"));return i}ua.call(this,e);var o=[\"spaceTool\",\"lane.add\",\"lane.resize\",\"lane.split\",\"elements.create\",\"elements.delete\",\"elements.move\",\"shape.create\",\"shape.delete\",\"shape.move\",\"shape.resize\"];this.preExecute(o,5e3,(function(e){(i=i||new pm).enter()})),this.postExecuted(o,500,(function(e){!function(){if(!i)throw new Error(n(\"out of bounds release\"));var e=i.leave();e&&(t.updateLaneRefs(i.flowNodes,i.lanes),i=null)}()})),this.preExecute([\"shape.create\",\"shape.move\",\"shape.delete\",\"shape.resize\"],(function(e){var t=e.context.shape,n=r();t.labelTarget||(Mr(t,\"bpmn:Lane\")&&n.addLane(t),Mr(t,\"bpmn:FlowNode\")&&n.addFlowNode(t))}))}function pm(){this.flowNodes=[],this.lanes=[],this.counter=0,this.addLane=function(e){this.lanes.push(e)},this.addFlowNode=function(e){this.flowNodes.push(e)},this.enter=function(){this.counter++},this.leave=function(){return this.counter--,!this.counter}}cm.$inject=[\"eventBus\",\"modeling\",\"translate\"],e(cm,ua);var lm={__init__:[\"adaptiveLabelPositioningBehavior\",\"appendBehavior\",\"associationBehavior\",\"attachEventBehavior\",\"boundaryEventBehavior\",\"createBehavior\",\"createDataObjectBehavior\",\"createParticipantBehavior\",\"dataInputAssociationBehavior\",\"dataStoreBehavior\",\"deleteLaneBehavior\",\"detachEventBehavior\",\"dropOnFlowBehavior\",\"eventBasedGatewayBehavior\",\"fixHoverBehavior\",\"groupBehavior\",\"importDockingFix\",\"isHorizontalFix\",\"labelBehavior\",\"layoutConnectionBehavior\",\"messageFlowBehavior\",\"modelingFeedback\",\"removeElementBehavior\",\"removeEmbeddedLabelBoundsBehavior\",\"removeParticipantBehavior\",\"replaceConnectionBehavior\",\"replaceElementBehaviour\",\"resizeBehavior\",\"resizeLaneBehavior\",\"rootElementReferenceBehavior\",\"spaceToolBehavior\",\"subProcessPlaneBehavior\",\"subProcessStartEventBehavior\",\"toggleCollapseConnectionBehaviour\",\"toggleElementCollapseBehaviour\",\"unclaimIdBehavior\",\"updateFlowNodeRefsBehavior\",\"unsetDefaultFlowBehavior\"],adaptiveLabelPositioningBehavior:[\"type\",md],appendBehavior:[\"type\",yd],associationBehavior:[\"type\",gd],attachEventBehavior:[\"type\",bd],boundaryEventBehavior:[\"type\",_d],createBehavior:[\"type\",wd],createDataObjectBehavior:[\"type\",Ed],createParticipantBehavior:[\"type\",Td],dataInputAssociationBehavior:[\"type\",Ad],dataStoreBehavior:[\"type\",Bd],deleteLaneBehavior:[\"type\",Nd],detachEventBehavior:[\"type\",Od],dropOnFlowBehavior:[\"type\",Ld],eventBasedGatewayBehavior:[\"type\",Fd],fixHoverBehavior:[\"type\",Gd],groupBehavior:[\"type\",Vd],importDockingFix:[\"type\",Ud],isHorizontalFix:[\"type\",Kd],labelBehavior:[\"type\",df],layoutConnectionBehavior:[\"type\",mf],messageFlowBehavior:[\"type\",Sf],modelingFeedback:[\"type\",Cf],removeElementBehavior:[\"type\",Pf],removeEmbeddedLabelBoundsBehavior:[\"type\",Rf],removeParticipantBehavior:[\"type\",kf],replaceConnectionBehavior:[\"type\",Af],replaceElementBehaviour:[\"type\",Mf],resizeBehavior:[\"type\",Lf],resizeLaneBehavior:[\"type\",Kf],rootElementReferenceBehavior:[\"type\",Yf],spaceToolBehavior:[\"type\",Zf],subProcessPlaneBehavior:[\"type\",nm],subProcessStartEventBehavior:[\"type\",im],toggleCollapseConnectionBehaviour:[\"type\",rm],toggleElementCollapseBehaviour:[\"type\",om],unclaimIdBehavior:[\"type\",am],unsetDefaultFlowBehavior:[\"type\",sm],updateFlowNodeRefsBehavior:[\"type\",cm]};function um(e,t){var n=wn(e,t,-15);return\"intersect\"!==n?n:null}function hm(e){Qc.call(this,e)}function dm(e){return!e||mn(e)}function fm(e){do{if(Mr(e,\"bpmn:Process\"))return Br(e);if(Mr(e,\"bpmn:Participant\"))return Br(e).processRef||Br(e)}while(e=e.parent)}function mm(e){return Mr(e,\"bpmn:TextAnnotation\")}function vm(e){return Mr(e,\"bpmn:Group\")&&!e.labelTarget}function ym(e){return Mr(e,\"bpmn:BoundaryEvent\")&&xm(e,\"bpmn:CompensateEventDefinition\")}function gm(e){return Br(e).isForCompensation}function bm(e){for(var t=e;t=t.parent;){if(Mr(t,\"bpmn:FlowElementsContainer\"))return Br(t);if(Mr(t,\"bpmn:Participant\"))return Br(t).processRef}return null}function xm(e,t){return!!m(Br(e).eventDefinitions||[],(function(e){return Mr(e,t)}))}function _m(e,t){return(Br(e).eventDefinitions||[]).every((function(e){return Mr(e,t)}))}function wm(e,t){var n=function(e){for(var t=[];e;)(e=e.parent)&&t.push(e);return t}(t);return-1!==n.indexOf(e)}function Em(e,t,n){if(dm(e)||dm(t))return null;if(!Mr(n,\"bpmn:DataAssociation\")){if(jm(e,t))return{type:\"bpmn:MessageFlow\"};if(Lm(e,t))return{type:\"bpmn:SequenceFlow\"}}var i=Im(e,t);return i||(ym(e)&&gm(t)?{type:\"bpmn:Association\",associationDirection:\"One\"}:!!Om(e,t)&&{type:\"bpmn:Association\"})}function Sm(e,t){return!(!mn(e)&&!vm(e))||!(Mr(t,\"bpmn:Participant\")&&!Zr(t))&&(Mr(e,\"bpmn:Participant\")?Mr(t,\"bpmn:Process\")||Mr(t,\"bpmn:Collaboration\"):Dr(e,[\"bpmn:DataInput\",\"bpmn:DataOutput\"])&&e.parent?t===e.parent:Mr(e,\"bpmn:Lane\")?Mr(t,\"bpmn:Participant\")||Mr(t,\"bpmn:Lane\"):!(Mr(e,\"bpmn:BoundaryEvent\")&&!function(e){return Br(e).cancelActivity&&(Pm(e)||Tm(e))}(e))&&(Mr(e,\"bpmn:FlowElement\")&&!Mr(e,\"bpmn:DataStoreReference\")?Mr(t,\"bpmn:FlowElementsContainer\")?Zr(t):Dr(t,[\"bpmn:Participant\",\"bpmn:Lane\"]):Mr(e,\"bpmn:DataStoreReference\")&&Mr(t,\"bpmn:Collaboration\")?w(Br(t).get(\"participants\"),(function(e){return!!e.get(\"processRef\")})):Dr(e,[\"bpmn:Artifact\",\"bpmn:DataAssociation\",\"bpmn:DataStoreReference\"])?Dr(t,[\"bpmn:Collaboration\",\"bpmn:Lane\",\"bpmn:Participant\",\"bpmn:Process\",\"bpmn:SubProcess\"]):!!Mr(e,\"bpmn:MessageFlow\")&&(Mr(t,\"bpmn:Collaboration\")||e.source.parent==t||e.target.parent==t)))}function Cm(e){return Mr(e,\"bpmn:Lane\")}function Rm(e){return!!function(e){return!mn(e)&&Mr(e,\"bpmn:BoundaryEvent\")}(e)||(!(!Mr(e,\"bpmn:IntermediateThrowEvent\")||!Pm(e))||Mr(e,\"bpmn:IntermediateCatchEvent\")&&Tm(e))}function Pm(e){var t=Br(e);return t&&!(t.eventDefinitions&&t.eventDefinitions.length)}function Tm(e){return km(e,[\"bpmn:MessageEventDefinition\",\"bpmn:TimerEventDefinition\",\"bpmn:SignalEventDefinition\",\"bpmn:ConditionalEventDefinition\"])}function km(e,t){return t.some((function(t){return xm(e,t)}))}function Am(e,t,n,i){if(Array.isArray(e)||(e=[e]),1!==e.length)return!1;var r=e[0];return!mn(r)&&(!!Rm(r)&&(!Qr(t)&&(!(!Mr(t,\"bpmn:Activity\")||gm(t))&&(!(i&&!um(i,t))&&(!function(e){return Mr(e,\"bpmn:ReceiveTask\")&&m(e.incoming,(function(e){return Mr(e.source,\"bpmn:EventBasedGateway\")}))}(t)&&\"attach\")))))}function Mm(e,t,n){if(!t)return!1;var i={replacements:[]};return g(e,(function(e){Qr(t)||Mr(e,\"bpmn:StartEvent\")&&\"label\"!==e.type&&Sm(e,t)&&(function(e){return e&&!1!==Br(e).isInterrupting}(e)||i.replacements.push({oldElementId:e.id,newElementType:\"bpmn:StartEvent\"}),(function(e){return Jr(e,\"bpmn:ErrorEventDefinition\")}(e)||function(e){return Jr(e,\"bpmn:EscalationEventDefinition\")}(e)||function(e){return Jr(e,\"bpmn:CompensateEventDefinition\")}(e))&&i.replacements.push({oldElementId:e.id,newElementType:\"bpmn:StartEvent\"}),km(e,[\"bpmn:MessageEventDefinition\",\"bpmn:TimerEventDefinition\",\"bpmn:SignalEventDefinition\",\"bpmn:ConditionalEventDefinition\"])&&Mr(t,\"bpmn:SubProcess\")&&i.replacements.push({oldElementId:e.id,newElementType:\"bpmn:StartEvent\"})),Mr(t,\"bpmn:Transaction\")||xm(e,\"bpmn:CancelEventDefinition\")&&\"label\"!==e.type&&(Mr(e,\"bpmn:EndEvent\")&&Sm(e,t)&&i.replacements.push({oldElementId:e.id,newElementType:\"bpmn:EndEvent\"}),Mr(e,\"bpmn:BoundaryEvent\")&&Am(e,t,0,n)&&i.replacements.push({oldElementId:e.id,newElementType:\"bpmn:BoundaryEvent\"}))})),!!i.replacements.length&&i}function Dm(e,t){return!w(e,Cm)&&(!t||e.every((function(e){return Sm(e,t)})))}function Bm(e,t,n,i){return!!t&&(!(!mn(e)&&!vm(e))||!function(e,t){return e===t}(n,t)&&((!n||!wm(n,t))&&(Sm(e,t)||$m(e,t))))}function Nm(e,t){return Mr(e,\"bpmn:SubProcess\")?Zr(e)&&(!t||t.width>=100&&t.height>=80):Mr(e,\"bpmn:Lane\")?!t||t.width>=130&&t.height>=60:Mr(e,\"bpmn:Participant\")?!t||t.width>=250&&t.height>=50:!!mm(e)||!!vm(e)}function Om(e,t){return!(!ym(e)||!gm(t))||!wm(t,e)&&!wm(e,t)&&(!!function(e,t){var n=mm(e),i=mm(t);return(n||i)&&n!==i}(e,t)||!!Im(e,t))}function jm(e,t){return!(zm(e)&&!zm(t))&&(Mr(n=e,\"bpmn:InteractionNode\")&&!Mr(n,\"bpmn:BoundaryEvent\")&&(!Mr(n,\"bpmn:Event\")||Mr(n,\"bpmn:ThrowEvent\")&&_m(n,\"bpmn:MessageEventDefinition\"))&&function(e){return Mr(e,\"bpmn:InteractionNode\")&&!gm(e)&&(!Mr(e,\"bpmn:Event\")||Mr(e,\"bpmn:CatchEvent\")&&_m(e,\"bpmn:MessageEventDefinition\"))&&!(Mr(e,\"bpmn:BoundaryEvent\")&&!xm(e,\"bpmn:MessageEventDefinition\"))}(t)&&!function(e,t){return fm(e)===fm(t)}(e,t));var n}function Lm(e,t){return Mr(n=e,\"bpmn:FlowNode\")&&!Mr(n,\"bpmn:EndEvent\")&&!Qr(n)&&!(Mr(n,\"bpmn:IntermediateThrowEvent\")&&xm(n,\"bpmn:LinkEventDefinition\"))&&!ym(n)&&!gm(n)&&function(e){return Mr(e,\"bpmn:FlowNode\")&&!Mr(e,\"bpmn:StartEvent\")&&!Mr(e,\"bpmn:BoundaryEvent\")&&!Qr(e)&&!(Mr(e,\"bpmn:IntermediateCatchEvent\")&&xm(e,\"bpmn:LinkEventDefinition\"))&&!gm(e)}(t)&&function(e,t){return bm(e)===bm(t)}(e,t)&&!(Mr(e,\"bpmn:EventBasedGateway\")&&!function(e){return Mr(e,\"bpmn:ReceiveTask\")||Mr(e,\"bpmn:IntermediateCatchEvent\")&&(xm(e,\"bpmn:MessageEventDefinition\")||xm(e,\"bpmn:TimerEventDefinition\")||xm(e,\"bpmn:ConditionalEventDefinition\")||xm(e,\"bpmn:SignalEventDefinition\"))}(t));var n}function Im(e,t){return Dr(e,[\"bpmn:DataObjectReference\",\"bpmn:DataStoreReference\"])&&Dr(t,[\"bpmn:Activity\",\"bpmn:ThrowEvent\"])?{type:\"bpmn:DataInputAssociation\"}:!(!Dr(t,[\"bpmn:DataObjectReference\",\"bpmn:DataStoreReference\"])||!Dr(e,[\"bpmn:Activity\",\"bpmn:CatchEvent\"]))&&{type:\"bpmn:DataOutputAssociation\"}}function $m(e,t,n){if(!t)return!1;if(Array.isArray(e)){if(1!==e.length)return!1;e=e[0]}return t.source!==e&&t.target!==e&&(Dr(t,[\"bpmn:SequenceFlow\",\"bpmn:MessageFlow\"])&&!mn(t)&&Mr(e,\"bpmn:FlowNode\")&&!Mr(e,\"bpmn:BoundaryEvent\")&&Sm(e,t.parent))}function Fm(e,t){return!!mn(t)||!(Mr(t,\"bpmn:Lane\")&&!function(e,t){return e&&t&&-1!==e.indexOf(t)}(e,t.parent))}function zm(e){return hp(e,\"bpmn:Process\")||hp(e,\"bpmn:Collaboration\")}e(hm,Qc),hm.$inject=[\"eventBus\"],hm.prototype.init=function(){this.addRule(\"connection.start\",(function(e){return function(e){if(dm(e))return null;return Dr(e,[\"bpmn:FlowNode\",\"bpmn:InteractionNode\",\"bpmn:DataObjectReference\",\"bpmn:DataStoreReference\",\"bpmn:Group\",\"bpmn:TextAnnotation\"])}(e.source)})),this.addRule(\"connection.create\",(function(e){var t=e.source,n=e.target,i=e.hints||{},r=i.targetParent;if(i.targetAttach)return!1;r&&(n.parent=r);try{return Em(t,n)}finally{r&&(n.parent=null)}})),this.addRule(\"connection.reconnect\",(function(e){var t=e.connection;return Em(e.source,e.target,t)})),this.addRule(\"connection.updateWaypoints\",(function(e){return{type:e.connection.type}})),this.addRule(\"shape.resize\",(function(e){return Nm(e.shape,e.newBounds)})),this.addRule(\"elements.create\",(function(e){var t=e.elements,n=e.position,i=e.target;return!(fn(i)&&!$m(t,i))&&_(t,(function(e){return fn(e)?Em(e.source,e.target,e):e.host?Am(e,e.host,null,n):Bm(e,i,null)}))})),this.addRule(\"elements.move\",(function(e){var t=e.target,n=e.shapes,i=e.position;return Am(n,t,null,i)||Mm(n,t,i)||Dm(n,t)||$m(n,t)})),this.addRule(\"shape.create\",(function(e){return Bm(e.shape,e.target,e.source,e.position)})),this.addRule(\"shape.attach\",(function(e){return Am(e.shape,e.target,null,e.position)})),this.addRule(\"element.copy\",(function(e){var t=e.element;return Fm(e.elements,t)}))},hm.prototype.canConnectMessageFlow=jm,hm.prototype.canConnectSequenceFlow=Lm,hm.prototype.canConnectDataAssociation=Im,hm.prototype.canConnectAssociation=Om,hm.prototype.canMove=Dm,hm.prototype.canAttach=Am,hm.prototype.canReplace=Mm,hm.prototype.canDrop=Sm,hm.prototype.canInsert=$m,hm.prototype.canCreate=Bm,hm.prototype.canConnect=Em,hm.prototype.canResize=Nm,hm.prototype.canCopy=Fm;var Hm={__depends__:[Bp],__init__:[\"bpmnRules\"],bpmnRules:[\"type\",hm]};function Gm(e,t){e.on(\"saveXML.start\",2e3,(function(){g(t.getRootElements(),(function(e){var t,n=Nr(e);t=E(y(mt([e],!1),(function(t){return t!==e&&!t.labelTarget})),Nr),n.set(\"planeElement\",t)}))}))}Gm.$inject=[\"eventBus\",\"canvas\"];var Vm={__init__:[\"bpmnDiOrdering\"],bpmnDiOrdering:[\"type\",Gm]};function Wm(e){ua.call(this,e);var t=this;this.preExecute([\"shape.create\",\"connection.create\"],(function(e){var n=e.context,i=n.shape||n.connection,r=n.parent,o=t.getOrdering(i,r);o&&(void 0!==o.parent&&(n.parent=o.parent),n.parentIndex=o.index)})),this.preExecute([\"shape.move\",\"connection.move\"],(function(e){var n=e.context,i=n.shape||n.connection,r=n.newParent||i.parent,o=t.getOrdering(i,r);o&&(void 0!==o.parent&&(n.newParent=o.parent),n.newParentIndex=o.index)}))}function Um(e,t,n){Wm.call(this,e);var i=[{type:\"bpmn:SubProcess\",order:{level:6}},{type:\"bpmn:SequenceFlow\",order:{level:9,containers:[\"bpmn:Participant\",\"bpmn:FlowElementsContainer\"]}},{type:\"bpmn:DataAssociation\",order:{level:9,containers:[\"bpmn:Collaboration\",\"bpmn:FlowElementsContainer\"]}},{type:\"bpmn:MessageFlow\",order:{level:9,containers:[\"bpmn:Collaboration\"]}},{type:\"bpmn:Association\",order:{level:6,containers:[\"bpmn:Participant\",\"bpmn:FlowElementsContainer\",\"bpmn:Collaboration\"]}},{type:\"bpmn:BoundaryEvent\",order:{level:8}},{type:\"bpmn:Group\",order:{level:10,containers:[\"bpmn:Collaboration\",\"bpmn:FlowElementsContainer\"]}},{type:\"bpmn:FlowElement\",order:{level:5}},{type:\"bpmn:Participant\",order:{level:-2}},{type:\"bpmn:Lane\",order:{level:-1}}];function r(e){var t=e.order;if(t||(e.order=t=function(e){if(e.labelTarget)return{level:10};var t=m(i,(function(t){return Dr(e,[t.type])}));return t&&t.order||{level:1}}(e)),!t)throw new Error(\"no order for <\"+e.id+\">\");return t}this.getOrdering=function(e,n){if(e.labelTarget)return{parent:t.findRoot(n)||t.getRootElement(),index:-1};var i=r(e);i.containers&&(n=function(e,t,n){for(var i=t;i&&!Dr(i,n);)i=i.parent;if(!i)throw new Error(\"no parent for <\"+e.id+\"> in <\"+(t&&t.id)+\">\");return i}(e,n,i.containers));var o=n.children.indexOf(e),a=v(n.children,(function(t){return!(!e.labelTarget&&t.labelTarget)&&i.level<r(t).level}));return-1!==a&&-1!==o&&o<a&&(a-=1),{index:a,parent:n}}}Wm.prototype.getOrdering=function(e,t){return null},e(Wm,ua),Um.$inject=[\"eventBus\",\"canvas\",\"translate\"],e(Um,Wm);var qm={__depends__:[ko],__init__:[\"bpmnOrderingProvider\"],bpmnOrderingProvider:[\"type\",Um]};function Km(e,t){this._eventBus=e,this._dragging=t,this._tools=[],this._active=null}Km.$inject=[\"eventBus\",\"dragging\"],Km.prototype.registerTool=function(e,t){var n=this._tools;if(!t)throw new Error('A tool has to be registered with it\\'s \"events\"');n.push(e),this.bindEvents(e,t)},Km.prototype.isActive=function(e){return e&&this._active===e},Km.prototype.length=function(e){return this._tools.length},Km.prototype.setActive=function(e){var t=this._eventBus;this._active!==e&&(this._active=e,t.fire(\"tool-manager.update\",{tool:e}))},Km.prototype.bindEvents=function(e,t){var n=this._eventBus,i=this._dragging,r=[];n.on(t.tool+\".init\",(function(t){if(!t.context.reactivate&&this.isActive(e))return this.setActive(null),void i.cancel();this.setActive(e)}),this),g(t,(function(e){r.push(e+\".ended\"),r.push(e+\".canceled\")})),n.on(r,250,(function(e){this._active&&(function(e){var t=e.originalEvent&&e.originalEvent.target;return t&&ee(t,'.group[data-group=\"tools\"]')}(e)||this.setActive(null))}),this)};var Ym={__depends__:[Tp],__init__:[\"toolManager\"],toolManager:[\"type\",Km]};function Xm(e,t){return-1!==e.indexOf(t)}var Zm=Math.abs,Qm=Math.round,Jm={x:\"width\",y:\"height\"},ev=\"crosshair\",tv={n:\"top\",w:\"left\",s:\"bottom\",e:\"right\"},nv=1500,iv={n:\"s\",w:\"e\",s:\"n\",e:\"w\"},rv=20;function ov(e,t,n,i,r,o,a){this._canvas=e,this._dragging=t,this._eventBus=n,this._modeling=i,this._rules=r,this._toolManager=o,this._mouse=a;var s=this;o.registerTool(\"space\",{tool:\"spaceTool.selection\",dragging:\"spaceTool\"}),n.on(\"spaceTool.selection.end\",(function(e){n.once(\"spaceTool.selection.ended\",(function(){s.activateMakeSpace(e.originalEvent)}))})),n.on(\"spaceTool.move\",nv,(function(e){var t=e.context,n=t.initialized;n||(n=t.initialized=s.init(e,t)),n&&sv(e)})),n.on(\"spaceTool.end\",(function(e){var t=e.context,i=t.axis,r=t.direction,o=t.movingShapes,a=t.resizingShapes,c=t.start;if(t.initialized){sv(e);var p={x:0,y:0};p[i]=Qm(e[\"d\"+i]),s.makeSpace(o,a,p,r,c),n.once(\"spaceTool.ended\",(function(e){s.activateSelection(e.originalEvent,!0,!0)}))}}))}function av(e){return{top:e.top-rv,right:e.right+rv,bottom:e.bottom+rv,left:e.left-rv}}function sv(e){var t,n,i=e.context.spaceToolConstraints;i&&(u(i.left)&&(t=Math.max(e.x,i.left),e.dx=e.dx+t-e.x,e.x=t),u(i.right)&&(t=Math.min(e.x,i.right),e.dx=e.dx+t-e.x,e.x=t),u(i.top)&&(n=Math.max(e.y,i.top),e.dy=e.dy+n-e.y,e.y=n),u(i.bottom)&&(n=Math.min(e.y,i.bottom),e.dy=e.dy+n-e.y,e.y=n))}function cv(e,t){return-1!==e.indexOf(t)}ov.$inject=[\"canvas\",\"dragging\",\"eventBus\",\"modeling\",\"rules\",\"toolManager\",\"mouse\"],ov.prototype.activateSelection=function(e,t,n){this._dragging.init(e,\"spaceTool.selection\",{autoActivate:t,cursor:ev,data:{context:{reactivate:n}},trapClick:!1})},ov.prototype.activateMakeSpace=function(e){this._dragging.init(e,\"spaceTool\",{autoActivate:!0,cursor:ev,data:{context:{}}})},ov.prototype.makeSpace=function(e,t,n,i,r){return this._modeling.createSpace(e,t,n,i,r)},ov.prototype.init=function(e,t){var n=Zm(e.dx)>Zm(e.dy)?\"x\":\"y\",i=e[\"d\"+n],r=e[n]-i;if(Zm(i)<5)return!1;i<0&&(i*=-1),zo(e)&&(i*=-1);var o=function(e,t){if(\"x\"===e){if(t>0)return\"e\";if(t<0)return\"w\"}if(\"y\"===e){if(t>0)return\"s\";if(t<0)return\"n\"}return null}(n,i),a=mt(this._canvas.getRootElement(),!0),s=this.calculateAdjustments(a,n,i,r),c=function(e,t,n,i,r){var o=e.movingShapes,a=e.resizingShapes;if(!a.length)return;var s,c,p={};return g(a,(function(e){var l,h,d,f,m,v,g=e.attachers,b=e.children,x=gn(e),_=y(b,(function(e){return!(fn(e)||mn(e)||cv(o,e)||cv(a,e))})),w=y(b,(function(e){return!fn(e)&&!mn(e)&&cv(o,e)})),E=[],S=[];_.length&&(h=av(gn(vt(_))),l=i-x[tv[n]]+h[tv[n]],\"n\"===n?p.bottom=c=u(c)?Math.min(c,l):l:\"w\"===n?p.right=c=u(c)?Math.min(c,l):l:\"s\"===n?p.top=s=u(s)?Math.max(s,l):l:\"e\"===n&&(p.left=s=u(s)?Math.max(s,l):l)),w.length&&(d=av(gn(vt(w))),l=i-d[tv[iv[n]]]+x[tv[iv[n]]],\"n\"===n?p.bottom=c=u(c)?Math.min(c,l):l:\"w\"===n?p.right=c=u(c)?Math.min(c,l):l:\"s\"===n?p.top=s=u(s)?Math.max(s,l):l:\"e\"===n&&(p.left=s=u(s)?Math.max(s,l):l)),g&&g.length&&(g.forEach((function(e){cv(o,e)?E.push(e):S.push(e)})),E.length&&(f=gn(vt(E.map(_n))),m=x[tv[iv[n]]]-(f[tv[iv[n]]]-i)),S.length&&(v=gn(vt(S.map(_n)))[tv[n]]-(x[tv[n]]-i)),\"n\"===n?(l=Math.min(m||1/0,v||1/0),p.bottom=c=u(c)?Math.min(c,l):l):\"w\"===n?(l=Math.min(m||1/0,v||1/0),p.right=c=u(c)?Math.min(c,l):l):\"s\"===n?(l=Math.max(m||-1/0,v||-1/0),p.top=s=u(s)?Math.max(s,l):l):\"e\"===n&&(l=Math.max(m||-1/0,v||-1/0),p.left=s=u(s)?Math.max(s,l):l));var C=r&&r[e.id];C&&(\"n\"===n?(l=i+e[Jm[t]]-C[Jm[t]],p.bottom=c=u(c)?Math.min(c,l):l):\"w\"===n?(l=i+e[Jm[t]]-C[Jm[t]],p.right=c=u(c)?Math.min(c,l):l):\"s\"===n?(l=i-e[Jm[t]]+C[Jm[t]],p.top=s=u(s)?Math.max(s,l):l):\"e\"===n&&(l=i-e[Jm[t]]+C[Jm[t]],p.left=s=u(s)?Math.max(s,l):l))})),p}(s,n,o,r,this._eventBus.fire(\"spaceTool.getMinDimensions\",{axis:n,direction:o,shapes:s.resizingShapes,start:r}));return L(t,s,{axis:n,direction:o,spaceToolConstraints:c,start:r}),Qa(\"resize-\"+(\"x\"===n?\"ew\":\"ns\")),!0},ov.prototype.calculateAdjustments=function(e,t,n,i){var r=this._rules,o=[],a=[],s=[],c=[];function p(e){o.includes(e)||o.push(e);var t=e.label;t&&!o.includes(t)&&o.push(t)}g(e,(function(e){if(e.parent&&!mn(e))if(fn(e))c.push(e);else{var o=e[t],l=o+e[Jm[t]];if(function(e){return!!e.host}(e)&&(n>0&&_n(e)[t]>i||n<0&&_n(e)[t]<i))s.push(e);else{var u;if(!(n>0&&o>i||n<0&&l<i))return o<i&&l>i&&r.allowed(\"shape.resize\",{shape:e})?(u=e,void(a.includes(u)||a.push(u))):void 0;p(e)}}})),g(o,(function(e){var t=e.attachers;t&&g(t,(function(e){p(e)}))}));var l=o.concat(a);return g(s,(function(e){var t=e.host;cv(l,t)&&p(e)})),l=o.concat(a),g(c,(function(e){var t=e.source,n=e.target,i=e.label;cv(l,t)&&cv(l,n)&&i&&p(i)})),{movingShapes:o,resizingShapes:a}},ov.prototype.toggle=function(){if(this.isActive())return this._dragging.cancel();var e=this._mouse.getLastMoveEvent();this.activateSelection(e,!!e)},ov.prototype.isActive=function(){var e=this._dragging.context();return!!e&&/^spaceTool/.test(e.prefix)};var pv=\"djs-dragging\",lv=\"djs-resizing\",uv=Math.max;function hv(e,t,n,i,r){function o(e,t){g(e,(function(e){r.addDragger(e,t),n.addMarker(e,pv)}))}e.on(\"spaceTool.selection.start\",(function(e){var t=n.getLayer(\"space\"),r=e.context,o=\"M 0,-10000 L 0,10000\",a=\"M -10000,0 L 10000,0\",s=De(\"g\");we(s,i.cls(\"djs-crosshair-group\",[\"no-events\"])),ge(t,s);var c=De(\"path\");we(c,\"d\",o),Se(c).add(\"djs-crosshair\"),ge(s,c);var p=De(\"path\");we(p,\"d\",a),Se(p).add(\"djs-crosshair\"),ge(s,p),r.crosshairGroup=s})),e.on(\"spaceTool.selection.move\",(function(e){ii(e.context.crosshairGroup,e.x,e.y)})),e.on(\"spaceTool.selection.cleanup\",(function(e){var t=e.context.crosshairGroup;t&&Re(t)})),e.on(\"spaceTool.move\",250,(function(e){var a=e.context,s=a.line,c=a.axis,p=a.movingShapes,l=a.resizingShapes;if(a.initialized){if(!a.dragGroup){var u=n.getLayer(\"space\");we(s=De(\"path\"),\"d\",\"M0,0 L0,0\"),Se(s).add(\"djs-crosshair\"),ge(u,s),a.line=s;var h=De(\"g\");we(h,i.cls(\"djs-drag-group\",[\"no-events\"])),ge(n.getActiveLayer(),h),o(p,h),o(a.movingConnections=t.filter((function(e){var t=!1;g(p,(function(n){g(n.outgoing,(function(n){e===n&&(t=!0)}))}));var n=!1;g(p,(function(t){g(t.incoming,(function(t){e===t&&(n=!0)}))}));var i=!1;g(l,(function(t){g(t.outgoing,(function(t){e===t&&(i=!0)}))}));var r=!1;return g(l,(function(t){g(t.incoming,(function(t){e===t&&(r=!0)}))})),fn(e)&&(t||i)&&(n||r)})),h),a.dragGroup=h}if(!a.frameGroup){var d=De(\"g\");we(d,i.cls(\"djs-frame-group\",[\"no-events\"])),ge(n.getActiveLayer(),d);var f=[];g(l,(function(e){var t=r.addFrame(e,d),i=t.getBBox();f.push({element:t,initialBounds:i}),n.addMarker(e,lv)})),a.frameGroup=d,a.frames=f}we(s,{d:{x:\"M\"+e.x+\", -10000 L\"+e.x+\", 10000\",y:\"M -10000, \"+e.y+\" L 10000, \"+e.y}[c]});var m={x:e.dx,y:e.dy};m[{x:\"y\",y:\"x\"}[a.axis]]=0,ii(a.dragGroup,m.x,m.y),g(a.frames,(function(e){var t,n,i=e.element,r=e.initialBounds;\"e\"===a.direction?we(i,{width:uv(r.width+m.x,5)}):we(i,{width:t=uv(r.width-m.x,5),x:r.x+r.width-t}),\"s\"===a.direction?we(i,{height:uv(r.height+m.y,5)}):we(i,{height:n=uv(r.height-m.y,5),y:r.y+r.height-n})}))}})),e.on(\"spaceTool.cleanup\",(function(e){var t=e.context,i=t.movingShapes,r=t.movingConnections,o=t.resizingShapes,a=t.line,s=t.dragGroup,c=t.frameGroup;g(i,(function(e){n.removeMarker(e,pv)})),g(r,(function(e){n.removeMarker(e,pv)})),s&&(Re(a),Re(s)),g(o,(function(e){n.removeMarker(e,lv)})),c&&Re(c)}))}hv.$inject=[\"eventBus\",\"elementRegistry\",\"canvas\",\"styles\",\"previewSupport\"];var dv={__init__:[\"spaceToolPreview\"],__depends__:[Tp,Bp,Ym,Kl,cu],spaceTool:[\"type\",ov],spaceToolPreview:[\"type\",hv]};function fv(e){e.invoke(ov,this)}fv.$inject=[\"injector\"],e(fv,ov),fv.prototype.calculateAdjustments=function(e,t,n,i){var r=ov.prototype.calculateAdjustments.call(this,e,t,n,i);return r.resizingShapes=r.resizingShapes.filter((function(e){return!Mr(e,\"bpmn:TextAnnotation\")})),r};var mv={__depends__:[dv],spaceTool:[\"type\",fv]};function vv(e,t){this._handlerMap={},this._stack=[],this._stackIdx=-1,this._currentExecution={actions:[],dirty:[],trigger:null},this._injector=t,this._eventBus=e,this._uid=1,e.on([\"diagram.destroy\",\"diagram.clear\"],(function(){this.clear(!1)}),this)}vv.$inject=[\"eventBus\",\"injector\"],vv.prototype.execute=function(e,t){if(!e)throw new Error(\"command required\");this._currentExecution.trigger=\"execute\";const n={command:e,context:t};this._pushAction(n),this._internalExecute(n),this._popAction()},vv.prototype.canExecute=function(e,t){const n={command:e,context:t},i=this._getHandler(e);let r=this._fire(e,\"canExecute\",n);if(void 0===r){if(!i)return!1;i.canExecute&&(r=i.canExecute(t))}return r},vv.prototype.clear=function(e){this._stack.length=0,this._stackIdx=-1,!1!==e&&this._fire(\"changed\",{trigger:\"clear\"})},vv.prototype.undo=function(){let e,t=this._getUndoAction();if(t){for(this._currentExecution.trigger=\"undo\",this._pushAction(t);t&&(this._internalUndo(t),e=this._getUndoAction(),e&&e.id===t.id);)t=e;this._popAction()}},vv.prototype.redo=function(){let e,t=this._getRedoAction();if(t){for(this._currentExecution.trigger=\"redo\",this._pushAction(t);t&&(this._internalExecute(t,!0),e=this._getRedoAction(),e&&e.id===t.id);)t=e;this._popAction()}},vv.prototype.register=function(e,t){this._setHandler(e,t)},vv.prototype.registerHandler=function(e,t){if(!e||!t)throw new Error(\"command and handlerCls must be defined\");const n=this._injector.instantiate(t);this.register(e,n)},vv.prototype.canUndo=function(){return!!this._getUndoAction()},vv.prototype.canRedo=function(){return!!this._getRedoAction()},vv.prototype._getRedoAction=function(){return this._stack[this._stackIdx+1]},vv.prototype._getUndoAction=function(){return this._stack[this._stackIdx]},vv.prototype._internalUndo=function(e){const t=e.command,n=e.context,i=this._getHandler(t);this._atomicDo((()=>{this._fire(t,\"revert\",e),i.revert&&this._markDirty(i.revert(n)),this._revertedAction(e),this._fire(t,\"reverted\",e)}))},vv.prototype._fire=function(e,t,n){arguments.length<3&&(n=t,t=null);const i=t?[e+\".\"+t,t]:[e];let r;n=this._eventBus.createEvent(n);for(const e of i)if(r=this._eventBus.fire(\"commandStack.\"+e,n),n.cancelBubble)break;return r},vv.prototype._createId=function(){return this._uid++},vv.prototype._atomicDo=function(e){const t=this._currentExecution;t.atomic=!0;try{e()}finally{t.atomic=!1}},vv.prototype._internalExecute=function(e,t){const n=e.command,i=e.context,r=this._getHandler(n);if(!r)throw new Error(\"no command handler registered for <\"+n+\">\");this._pushAction(e),t||(this._fire(n,\"preExecute\",e),r.preExecute&&r.preExecute(i),this._fire(n,\"preExecuted\",e)),this._atomicDo((()=>{this._fire(n,\"execute\",e),r.execute&&this._markDirty(r.execute(i)),this._executedAction(e,t),this._fire(n,\"executed\",e)})),t||(this._fire(n,\"postExecute\",e),r.postExecute&&r.postExecute(i),this._fire(n,\"postExecuted\",e)),this._popAction()},vv.prototype._pushAction=function(e){const t=this._currentExecution,n=t.actions,i=n[0];if(t.atomic)throw new Error(\"illegal invocation in <execute> or <revert> phase (action: \"+e.command+\")\");e.id||(e.id=i&&i.id||this._createId()),n.push(e)},vv.prototype._popAction=function(){const e=this._currentExecution,t=e.trigger,n=e.actions,i=e.dirty;n.pop(),n.length||(this._eventBus.fire(\"elements.changed\",{elements:P(\"id\",i.reverse())}),i.length=0,this._fire(\"changed\",{trigger:t}),e.trigger=null)},vv.prototype._markDirty=function(e){const t=this._currentExecution;e&&(e=p(e)?e:[e],t.dirty=t.dirty.concat(e))},vv.prototype._executedAction=function(e,t){const n=++this._stackIdx;t||this._stack.splice(n,this._stack.length,e)},vv.prototype._revertedAction=function(e){this._stackIdx--},vv.prototype._getHandler=function(e){return this._handlerMap[e]},vv.prototype._setHandler=function(e,t){if(!e||!t)throw new Error(\"command and handler required\");if(this._handlerMap[e])throw new Error(\"overriding handler for command <\"+e+\">\");this._handlerMap[e]=t};var yv={commandStack:[\"type\",vv]},gv=new na(\"tt\");function bv(e,t){e.style.display=!1===t?\"none\":\"\"}var xv=\"djs-tooltip\",_v=\".\"+xv;function wv(e,t){var n,i;this._eventBus=e,this._canvas=t,this._ids=gv,this._tooltipDefaults={show:{minZoom:.7,maxZoom:5}},this._tooltips={},this._tooltipRoot=(n=t.getContainer(),q(i=de('<div class=\"djs-tooltip-container\" />'),{position:\"absolute\",width:\"0\",height:\"0\"}),n.insertBefore(i,n.firstChild),i);var r=this;pe.bind(this._tooltipRoot,_v,\"mousedown\",(function(e){e.stopPropagation()})),pe.bind(this._tooltipRoot,_v,\"mouseover\",(function(e){r.trigger(\"mouseover\",e)})),pe.bind(this._tooltipRoot,_v,\"mouseout\",(function(e){r.trigger(\"mouseout\",e)})),this._init()}wv.$inject=[\"eventBus\",\"canvas\"],wv.prototype.add=function(e){if(!e.position)throw new Error(\"must specifiy tooltip position\");if(!e.html)throw new Error(\"must specifiy tooltip html\");var t=this._ids.next();return e=L({},this._tooltipDefaults,e,{id:t}),this._addTooltip(e),e.timeout&&this.setTimeout(e),t},wv.prototype.trigger=function(e,t){var n=t.delegateTarget||t.target,i=this.get(K(n,\"data-tooltip-id\"));i&&(\"mouseover\"===e&&i.timeout&&this.clearTimeout(i),\"mouseout\"===e&&i.timeout&&(i.timeout=1e3,this.setTimeout(i)))},wv.prototype.get=function(e){return\"string\"!=typeof e&&(e=e.id),this._tooltips[e]},wv.prototype.clearTimeout=function(e){if(e=this.get(e)){var t=e.removeTimer;t&&(clearTimeout(t),e.removeTimer=null)}},wv.prototype.setTimeout=function(e){if(e=this.get(e)){this.clearTimeout(e);var t=this;e.removeTimer=setTimeout((function(){t.remove(e)}),e.timeout)}},wv.prototype.remove=function(e){var t=this.get(e);t&&(ve(t.html),ve(t.htmlContainer),delete t.htmlContainer,delete this._tooltips[t.id])},wv.prototype.show=function(){bv(this._tooltipRoot)},wv.prototype.hide=function(){bv(this._tooltipRoot,!1)},wv.prototype._updateRoot=function(e){var t=e.scale||1,n=e.scale||1,i=\"matrix(\"+t+\",0,0,\"+n+\",\"+-1*e.x*t+\",\"+-1*e.y*n+\")\";this._tooltipRoot.style.transform=i,this._tooltipRoot.style[\"-ms-transform\"]=i},wv.prototype._addTooltip=function(e){var t,n=e.id,i=e.html,r=this._tooltipRoot;i.get&&i.constructor.prototype.jquery&&(i=i.get(0)),d(i)&&(i=de(i)),q(t=de('<div data-tooltip-id=\"'+n+'\" class=\"'+xv+'\">'),{position:\"absolute\"}),t.appendChild(i),e.type&&X(t).add(\"djs-tooltip-\"+e.type),e.className&&X(t).add(e.className),e.htmlContainer=t,r.appendChild(t),this._tooltips[n]=e,this._updateTooltip(e)},wv.prototype._updateTooltip=function(e){var t=e.position;!function(e,t,n){q(e,{left:t+\"px\",top:n+\"px\"})}(e.htmlContainer,t.x,t.y)},wv.prototype._updateTooltipVisibilty=function(e){g(this._tooltips,(function(t){var n=t.show,i=t.htmlContainer,r=!0;n&&((n.minZoom>e.scale||n.maxZoom<e.scale)&&(r=!1),bv(i,r))}))},wv.prototype._init=function(){var e=this;this._eventBus.on(\"canvas.viewbox.changing\",(function(t){e.hide()})),this._eventBus.on(\"canvas.viewbox.changed\",(function(t){var n;n=t.viewbox,e._updateRoot(n),e._updateTooltipVisibilty(n),e.show()}))};var Ev={__init__:[\"tooltips\"],tooltips:[\"type\",wv]};function Sv(e,t){if(\"function\"!=typeof t)throw new Error(\"removeFn iterator must be a function\");if(e){for(var n;n=e[0];)t(n);return e}}function Cv(e,t,n){ua.call(this,t);var i=e.get(\"movePreview\",!1);t.on(\"shape.move.start\",1400,(function(e){var t=e.context,n=t.shapes,i=t.validatedShapes;t.shapes=Rv(n),t.validatedShapes=Rv(i)})),i&&t.on(\"shape.move.start\",250,(function(e){var t=e.context,n=t.shapes,r=[];g(n,(function(e){g(e.labels,(function(n){n.hidden||-1!==t.shapes.indexOf(n)||r.push(n),e.labelTarget&&r.push(e)}))})),g(r,(function(e){i.makeDraggable(t,e,!0)}))})),this.preExecuted(\"elements.move\",1400,(function(e){var t=e.context.closure,n=t.enclosedElements,i=[];g(n,(function(e){g(e.labels,(function(e){n[e.id]||i.push(e)}))})),t.addAll(i)})),this.preExecute([\"connection.delete\",\"shape.delete\"],(function(e){var t=e.context;Sv((t.connection||t.shape).labels,(function(e){n.removeShape(e,{nested:!0})}))})),this.execute(\"shape.delete\",(function(e){var t=e.context,n=t.shape,i=n.labelTarget;i&&(t.labelTargetIndex=St(i.labels,n),t.labelTarget=i,n.labelTarget=null)})),this.revert(\"shape.delete\",(function(e){var t=e.context,n=t.shape,i=t.labelTarget,r=t.labelTargetIndex;i&&(Et(i.labels,n,r),n.labelTarget=i)}))}function Rv(e){return y(e,(function(t){return-1===e.indexOf(t.labelTarget)}))}e(Cv,ua),Cv.$inject=[\"injector\",\"eventBus\",\"modeling\"];var Pv={__init__:[\"labelSupport\"],labelSupport:[\"type\",Cv]},Tv=\"attach-ok\";function kv(e,t,n,i,r){ua.call(this,t);var o=e.get(\"movePreview\",!1);t.on(\"shape.move.start\",1401,(function(e){var t,n,i=e.context,r=i.shapes,o=i.validatedShapes;i.shapes=(n=Av(t=r),T(\"id\",t,n)),i.validatedShapes=function(e){var t=R(e,\"id\");return y(e,(function(e){for(;e;){if(e.host&&t[e.host.id])return!1;e=e.parent}return!0}))}(o)})),o&&t.on(\"shape.move.start\",251,(function(e){var t=e.context;g(Av(t.shapes),(function(e){o.makeDraggable(t,e,!0),g(e.labels,(function(e){o.makeDraggable(t,e,!0)}))}))})),o&&t.on(\"shape.move.start\",(function(e){var i=e.context.shapes;if(1===i.length){var r=i[0].host;r&&(n.addMarker(r,Tv),t.once([\"shape.move.out\",\"shape.move.cleanup\"],(function(){n.removeMarker(r,Tv)})))}})),this.preExecuted(\"elements.move\",1401,(function(e){var t=e.context,n=t.closure;g(Av(t.shapes),(function(e){n.add(e,n.topLevel[e.host.id])}))})),this.postExecuted(\"elements.move\",(function(e){var t=e.context,n=t.shapes,i=t.newHost;i&&1!==n.length||g(i?n:y(n,(function(e){var t,i=e.host;return function(e){return!!e.host}(e)&&(t=i,!(-1!==n.indexOf(t)))})),(function(e){r.updateAttachment(e,i)}))})),this.postExecuted(\"elements.move\",(function(e){g(e.context.shapes,(function(e){g(e.attachers,(function(e){g(e.outgoing.slice(),(function(e){i.allowed(\"connection.reconnect\",{connection:e,source:e.source,target:e.target})||r.removeConnection(e)})),g(e.incoming.slice(),(function(e){i.allowed(\"connection.reconnect\",{connection:e,source:e.source,target:e.target})||r.removeConnection(e)}))}))}))})),this.postExecute(\"shape.create\",(function(e){var t=e.context,n=t.shape,i=t.host;i&&r.updateAttachment(n,i)})),this.postExecute(\"shape.replace\",(function(e){var t=e.context,n=t.oldShape,o=t.newShape;Sv(n.attachers,(function(e){\"attach\"===i.allowed(\"elements.move\",{target:o,shapes:[e]})?r.updateAttachment(e,o):r.removeShape(e)})),o.attachers.length&&g(o.attachers,(function(e){var t=lf(e,n,o);r.moveShape(e,t,e.parent)}))})),this.postExecute(\"shape.resize\",(function(e){var t=e.context,n=t.shape,i=t.oldBounds,o=t.newBounds,a=n.attachers;!1!==(t.hints||{}).attachSupport&&g(a,(function(e){var t=lf(e,i,o);r.moveShape(e,t,e.parent),g(e.labels,(function(e){r.moveShape(e,t,e.parent)}))}))})),this.preExecute(\"shape.delete\",(function(e){var t=e.context.shape;Sv(t.attachers,(function(e){r.removeShape(e)})),t.host&&r.updateAttachment(t,null)}))}function Av(e){return i(E(e,(function(e){return e.attachers||[]})))}e(kv,ua),kv.$inject=[\"injector\",\"eventBus\",\"canvas\",\"rules\",\"modeling\"];var Mv={__depends__:[Bp],__init__:[\"attachSupport\"],attachSupport:[\"type\",kv]};function Dv(e){this._model=e}function Bv(e,t,n,i){ua.call(this,e),this._bpmnFactory=t,this._translate=i;var r=this;function o(e){g(e.context.oldRoot.children,(function(e){Mr(e,\"bpmn:BaseElement\")&&r.updateParent(e)}))}function a(e){var t=e.context.shape;Mr(t,\"bpmn:BaseElement\")&&r.updateBounds(t)}function s(e){r.updateConnection(e.context)}function c(e){r.updateConnectionWaypoints(e.context.connection)}function p(e){r.updateAttachment(e.context)}function l(e){const{element:n}=e.context,i=so(n),r=Nr(n),o=r&&r.get(\"label\");no(n)||(i&&!o?r.set(\"label\",t.create(\"bpmndi:BPMNLabel\")):!i&&o&&r.set(\"label\",void 0))}this.executed([\"connection.layout\",\"connection.create\"],(function(e){var t,i=e.context,r=i.hints||{};i.cropped||!1===r.createElementsBehavior||((t=i.connection).waypoints=n.getCroppedWaypoints(t),i.cropped=!0)})),this.reverted([\"connection.layout\"],(function(e){delete e.context.cropped})),this.executed([\"shape.move\",\"shape.create\",\"shape.delete\",\"connection.create\",\"connection.move\",\"connection.delete\"],Nv((function(e){var t=e.context;r.updateParent(t.shape||t.connection,t.oldParent)}))),this.reverted([\"shape.move\",\"shape.create\",\"shape.delete\",\"connection.create\",\"connection.move\",\"connection.delete\"],Nv((function(e){var t=e.context,n=t.shape||t.connection,i=t.parent||t.newParent;r.updateParent(n,i)}))),this.executed([\"canvas.updateRoot\"],o),this.reverted([\"canvas.updateRoot\"],o),this.executed([\"shape.move\",\"shape.create\",\"shape.resize\"],Nv((function(e){\"label\"!==e.context.shape.type&&a(e)}))),this.reverted([\"shape.move\",\"shape.create\",\"shape.resize\"],Nv((function(e){\"label\"!==e.context.shape.type&&a(e)}))),e.on(\"shape.changed\",(function(e){\"label\"===e.element.type&&a({context:{shape:e.element}})})),this.executed([\"connection.create\",\"connection.move\",\"connection.delete\",\"connection.reconnect\"],Nv(s)),this.reverted([\"connection.create\",\"connection.move\",\"connection.delete\",\"connection.reconnect\"],Nv(s)),this.executed([\"connection.layout\",\"connection.move\",\"connection.updateWaypoints\"],Nv(c)),this.reverted([\"connection.layout\",\"connection.move\",\"connection.updateWaypoints\"],Nv(c)),this.executed(\"connection.reconnect\",Nv((function(e){var t=e.context,n=t.connection,i=t.oldSource,r=t.newSource,o=Br(n),a=Br(i),s=Br(r);o.conditionExpression&&!Dr(s,[\"bpmn:Activity\",\"bpmn:ExclusiveGateway\",\"bpmn:InclusiveGateway\"])&&(t.oldConditionExpression=o.conditionExpression,delete o.conditionExpression),i!==r&&a.default===o&&(t.oldDefault=a.default,delete a.default)}))),this.reverted(\"connection.reconnect\",Nv((function(e){var t=e.context,n=t.connection,i=t.oldSource,r=t.newSource,o=Br(n),a=Br(i),s=Br(r);t.oldConditionExpression&&(o.conditionExpression=t.oldConditionExpression),t.oldDefault&&(a.default=t.oldDefault,delete s.default)}))),this.executed([\"element.updateAttachment\"],Nv(p)),this.reverted([\"element.updateAttachment\"],Nv(p)),this.executed(\"element.updateLabel\",Nv(l)),this.reverted(\"element.updateLabel\",Nv(l))}function Nv(e){return function(t){var n=t.context;Mr(n.shape||n.connection||n.element,\"bpmn:BaseElement\")&&e(t)}}function Ov(e,t,n){Xn.call(this),this._bpmnFactory=e,this._moddle=t,this._translate=n}function jv(e,t,n){return void 0===t[n]?t:(e[n]=t[n],$(t,[n]))}function Lv(e,t){this._modeling=e,this._canvas=t}function Iv(e){this._modeling=e}function $v(e,t){this._canvas=e,this._layouter=t}Dv.$inject=[\"moddle\"],Dv.prototype._needsId=function(e){return Dr(e,[\"bpmn:RootElement\",\"bpmn:FlowElement\",\"bpmn:MessageFlow\",\"bpmn:DataAssociation\",\"bpmn:Artifact\",\"bpmn:Participant\",\"bpmn:Lane\",\"bpmn:LaneSet\",\"bpmn:Process\",\"bpmn:Collaboration\",\"bpmndi:BPMNShape\",\"bpmndi:BPMNEdge\",\"bpmndi:BPMNDiagram\",\"bpmndi:BPMNPlane\",\"bpmn:Property\",\"bpmn:CategoryValue\"])},Dv.prototype._ensureId=function(e){var t;e.id?this._model.ids.claim(e.id,e):(t=Mr(e,\"bpmn:Activity\")?\"Activity\":Mr(e,\"bpmn:Event\")?\"Event\":Mr(e,\"bpmn:Gateway\")?\"Gateway\":Dr(e,[\"bpmn:SequenceFlow\",\"bpmn:MessageFlow\"])?\"Flow\":(e.$type||\"\").replace(/^[^:]*:/g,\"\"),t+=\"_\",!e.id&&this._needsId(e)&&(e.id=this._model.ids.nextPrefixed(t,e)))},Dv.prototype.create=function(e,t){var n=this._model.create(e,t||{});return this._ensureId(n),n},Dv.prototype.createDiLabel=function(){return this.create(\"bpmndi:BPMNLabel\",{bounds:this.createDiBounds()})},Dv.prototype.createDiShape=function(e,t){return this.create(\"bpmndi:BPMNShape\",L({bpmnElement:e,bounds:this.createDiBounds()},t))},Dv.prototype.createDiBounds=function(e){return this.create(\"dc:Bounds\",e)},Dv.prototype.createDiWaypoints=function(e){var t=this;return E(e,(function(e){return t.createDiWaypoint(e)}))},Dv.prototype.createDiWaypoint=function(e){return this.create(\"dc:Point\",I(e,[\"x\",\"y\"]))},Dv.prototype.createDiEdge=function(e,t){return this.create(\"bpmndi:BPMNEdge\",L({bpmnElement:e,waypoint:this.createDiWaypoints([])},t))},Dv.prototype.createDiPlane=function(e,t){return this.create(\"bpmndi:BPMNPlane\",L({bpmnElement:e},t))},e(Bv,ua),Bv.$inject=[\"eventBus\",\"bpmnFactory\",\"connectionDocking\",\"translate\"],Bv.prototype.updateAttachment=function(e){var t=e.shape,n=t.businessObject,i=t.host;n.attachedToRef=i&&i.businessObject},Bv.prototype.updateParent=function(e,t){if(!(mn(e)||Mr(e,\"bpmn:DataStoreReference\")&&e.parent&&Mr(e.parent,\"bpmn:Collaboration\"))){var n=e.parent,i=e.businessObject,r=Nr(e),o=n&&n.businessObject,a=Nr(n);Mr(e,\"bpmn:FlowNode\")&&this.updateFlowNodeRefs(i,o,t&&t.businessObject),Mr(e,\"bpmn:DataOutputAssociation\")&&(o=e.source?e.source.businessObject:null),Mr(e,\"bpmn:DataInputAssociation\")&&(o=e.target?e.target.businessObject:null),this.updateSemanticParent(i,o),Mr(e,\"bpmn:DataObjectReference\")&&i.dataObjectRef&&this.updateSemanticParent(i.dataObjectRef,o),this.updateDiParent(r,a)}},Bv.prototype.updateBounds=function(e){var t=Nr(e),n=function(e){if(!Mr(e,\"bpmn:Activity\"))return;var t=Nr(e);if(!t)return;var n=t.get(\"label\");if(!n)return;return n.get(\"bounds\")}(e);if(n){var i=is(n,t.get(\"bounds\"));L(n,{x:e.x+i.x,y:e.y+i.y})}var r=mn(e)?this._getLabel(t):t,o=r.bounds;o||(o=this._bpmnFactory.createDiBounds(),r.set(\"bounds\",o)),L(o,{x:e.x,y:e.y,width:e.width,height:e.height})},Bv.prototype.updateFlowNodeRefs=function(e,t,n){n!==t&&(Mr(n,\"bpmn:Lane\")&&wt(n.get(\"flowNodeRef\"),e),Mr(t,\"bpmn:Lane\")&&Et(t.get(\"flowNodeRef\"),e))},Bv.prototype.updateDiConnection=function(e,t,n){var i=Nr(e),r=Nr(t),o=Nr(n);i.sourceElement&&i.sourceElement.bpmnElement!==Br(t)&&(i.sourceElement=t&&r),i.targetElement&&i.targetElement.bpmnElement!==Br(n)&&(i.targetElement=n&&o)},Bv.prototype.updateDiParent=function(e,t){if(t&&!Mr(t,\"bpmndi:BPMNPlane\")&&(t=t.$parent),e.$parent!==t){var n=(t||e.$parent).get(\"planeElement\");t?(n.push(e),e.$parent=t):(wt(n,e),e.$parent=null)}},Bv.prototype.getLaneSet=function(e){var t,n;return Mr(e,\"bpmn:Lane\")?((t=e.childLaneSet)||(t=this._bpmnFactory.create(\"bpmn:LaneSet\"),e.childLaneSet=t,t.$parent=e),t):(Mr(e,\"bpmn:Participant\")&&(e=e.processRef),(t=(n=e.get(\"laneSets\"))[0])||((t=this._bpmnFactory.create(\"bpmn:LaneSet\")).$parent=e,n.push(t)),t)},Bv.prototype.updateSemanticParent=function(e,t,n){var i,r=this._translate;if(e.$parent!==t&&(!Mr(e,\"bpmn:DataInput\")&&!Mr(e,\"bpmn:DataOutput\")||(Mr(t,\"bpmn:Participant\")&&\"processRef\"in t&&(t=t.processRef),!(\"ioSpecification\"in t)||t.ioSpecification!==e.$parent))){if(Mr(e,\"bpmn:Lane\"))t&&(t=this.getLaneSet(t)),i=\"lanes\";else if(Mr(e,\"bpmn:FlowElement\")){if(t)if(Mr(t,\"bpmn:Participant\"))t=t.processRef;else if(Mr(t,\"bpmn:Lane\"))do{t=t.$parent.$parent}while(Mr(t,\"bpmn:Lane\"));i=\"flowElements\"}else if(Mr(e,\"bpmn:Artifact\")){for(;t&&!Mr(t,\"bpmn:Process\")&&!Mr(t,\"bpmn:SubProcess\")&&!Mr(t,\"bpmn:Collaboration\");){if(Mr(t,\"bpmn:Participant\")){t=t.processRef;break}t=t.$parent}i=\"artifacts\"}else if(Mr(e,\"bpmn:MessageFlow\"))i=\"messageFlows\";else if(Mr(e,\"bpmn:Participant\")){i=\"participants\";var o,a=e.processRef;a&&(o=function(e){for(;e&&!Mr(e,\"bpmn:Definitions\");)e=e.$parent;return e}(e.$parent||t),e.$parent&&(wt(o.get(\"rootElements\"),a),a.$parent=null),t&&(Et(o.get(\"rootElements\"),a),a.$parent=o))}else Mr(e,\"bpmn:DataOutputAssociation\")?i=\"dataOutputAssociations\":Mr(e,\"bpmn:DataInputAssociation\")&&(i=\"dataInputAssociations\");if(!i)throw new Error(r(\"no parent for {element} in {parent}\",{element:e.id,parent:t.id}));var s;if(e.$parent&&wt(s=e.$parent.get(i),e),t?((s=t.get(i)).push(e),e.$parent=t):e.$parent=null,n){var c=n.get(i);wt(s,e),t&&(c||(c=[],t.set(i,c)),c.push(e))}}},Bv.prototype.updateConnectionWaypoints=function(e){Nr(e).set(\"waypoint\",this._bpmnFactory.createDiWaypoints(e.waypoints))},Bv.prototype.updateConnection=function(e){var t,n=e.connection,i=Br(n),r=n.source,o=Br(r),a=n.target,s=Br(n.target);if(Mr(i,\"bpmn:DataAssociation\"))Mr(i,\"bpmn:DataInputAssociation\")?(i.get(\"sourceRef\")[0]=o,t=e.parent||e.newParent||s,this.updateSemanticParent(i,s,t)):Mr(i,\"bpmn:DataOutputAssociation\")&&(t=e.parent||e.newParent||o,this.updateSemanticParent(i,o,t),i.targetRef=s);else{var c=Mr(i,\"bpmn:SequenceFlow\");i.sourceRef!==o&&(c&&(wt(i.sourceRef&&i.sourceRef.get(\"outgoing\"),i),o&&o.get(\"outgoing\")&&o.get(\"outgoing\").push(i)),i.sourceRef=o),i.targetRef!==s&&(c&&(wt(i.targetRef&&i.targetRef.get(\"incoming\"),i),s&&s.get(\"incoming\")&&s.get(\"incoming\").push(i)),i.targetRef=s)}this.updateConnectionWaypoints(n),this.updateDiConnection(n,r,a)},Bv.prototype._getLabel=function(e){return e.label||(e.label=this._bpmnFactory.createDiLabel()),e.label},e(Ov,Xn),Ov.$inject=[\"bpmnFactory\",\"moddle\",\"translate\"],Ov.prototype._baseCreate=Xn.prototype.create,Ov.prototype.create=function(e,t){if(\"label\"===e){var n=t.di||this._bpmnFactory.createDiLabel();return this._baseCreate(e,L({type:\"label\",di:n},eo,t))}return this.createElement(e,t)},Ov.prototype.createElement=function(e,t){var n,i,r,o=this._translate,a=(t=L({},t||{})).businessObject,c=t.di;if(!a){if(!t.type)throw new Error(o(\"no shape type specified\"));Tr(a=this._bpmnFactory.create(t.type))}if(!Dr(c,[\"bpmndi:BPMNShape\",\"bpmndi:BPMNEdge\",\"bpmndi:BPMNDiagram\",\"bpmndi:BPMNPlane\"])){var p=L({},c||{},{id:a.id+\"_di\"});c=\"root\"===e?this._bpmnFactory.createDiPlane(a,p):\"connection\"===e?this._bpmnFactory.createDiEdge(a,p):this._bpmnFactory.createDiShape(a,p)}return Mr(a,\"bpmn:Group\")&&(t=L({isFrame:!0},t)),t=function(e,t,n){return g(n,(function(n){t=jv(e,t,n)})),t}(a,t,[\"processRef\",\"isInterrupting\",\"associationDirection\",\"isForCompensation\"]),t.isExpanded&&(t=jv(c,t,\"isExpanded\")),Mr(a,\"bpmn:SubProcess\")&&(t.collapsed=!Zr(a,c)),Mr(a,\"bpmn:ExclusiveGateway\")&&(c.isMarkerVisible=!0),s(t.triggeredByEvent)&&(a.triggeredByEvent=t.triggeredByEvent,delete t.triggeredByEvent),s(t.cancelActivity)&&(a.cancelActivity=t.cancelActivity,delete t.cancelActivity),t.eventDefinitionType&&(i=a.get(\"eventDefinitions\")||[],r=this._bpmnFactory.create(t.eventDefinitionType,t.eventDefinitionAttrs),\"bpmn:ConditionalEventDefinition\"===t.eventDefinitionType&&(r.condition=this._bpmnFactory.create(\"bpmn:FormalExpression\")),i.push(r),r.$parent=a,a.eventDefinitions=i,delete t.eventDefinitionType),n=this.getDefaultSize(a,c),t=L({id:a.id},n,t,{businessObject:a,di:c}),this._baseCreate(e,t)},Ov.prototype.getDefaultSize=function(e,t){var n=Br(e);return t=t||Nr(e),Mr(n,\"bpmn:SubProcess\")?Zr(n,t)?{width:350,height:200}:{width:100,height:80}:Mr(n,\"bpmn:Task\")?{width:100,height:80}:Mr(n,\"bpmn:Gateway\")?{width:50,height:50}:Mr(n,\"bpmn:Event\")?{width:36,height:36}:Mr(n,\"bpmn:Participant\")?Zr(n,t)?{width:600,height:250}:{width:400,height:60}:Mr(n,\"bpmn:Lane\")?{width:400,height:100}:Mr(n,\"bpmn:DataObjectReference\")?{width:36,height:50}:Mr(n,\"bpmn:DataStoreReference\")?{width:50,height:50}:Mr(n,\"bpmn:TextAnnotation\")?{width:100,height:30}:Mr(n,\"bpmn:Group\")?{width:300,height:300}:{width:100,height:80}},Ov.prototype.createParticipantShape=function(e){return l(e)||(e={isExpanded:e}),!1!==(e=L({type:\"bpmn:Participant\"},e||{})).isExpanded&&(e.processRef=this._bpmnFactory.create(\"bpmn:Process\")),this.createShape(e)},Lv.$inject=[\"modeling\",\"canvas\"],Lv.prototype.preExecute=function(e){var t=this._modeling,n=e.elements,i=e.alignment;g(n,(function(e){var n={x:0,y:0};s(i.left)?n.x=i.left-e.x:s(i.right)?n.x=i.right-e.width-e.x:s(i.center)?n.x=i.center-Math.round(e.width/2)-e.x:s(i.top)?n.y=i.top-e.y:s(i.bottom)?n.y=i.bottom-e.height-e.y:s(i.middle)&&(n.y=i.middle-Math.round(e.height/2)-e.y),t.moveElements([e],n,e.parent)}))},Lv.prototype.postExecute=function(e){},Iv.$inject=[\"modeling\"],Iv.prototype.preExecute=function(e){var t=e.source;if(!t)throw new Error(\"source required\");var n=e.target||t.parent,i=e.shape,r=e.hints||{};i=e.shape=this._modeling.createShape(i,e.position,n,{attach:r.attach}),e.shape=i},Iv.prototype.postExecute=function(e){var t,n,i=e.hints||{};t=e.source,n=e.shape,w(t.outgoing,(function(e){return e.target===n}))||(i.connectionTarget===e.source?this._modeling.connect(e.shape,e.source,e.connection):this._modeling.connect(e.source,e.shape,e.connection))},$v.$inject=[\"canvas\",\"layouter\"],$v.prototype.execute=function(e){var t=e.connection,n=e.source,i=e.target,r=e.parent,o=e.parentIndex,a=e.hints;if(!n||!i)throw new Error(\"source and target required\");if(!r)throw new Error(\"parent required\");return t.source=n,t.target=i,t.waypoints||(t.waypoints=this._layouter.layoutConnection(t,a)),this._canvas.addConnection(t,r,o),t},$v.prototype.revert=function(e){var t=e.connection;return this._canvas.removeConnection(t),t.source=null,t.target=null,t};var Fv=Math.round;function zv(e){this._modeling=e}zv.$inject=[\"modeling\"],zv.prototype.preExecute=function(e){var t=e.elements,n=e.parent,i=e.parentIndex,r=e.position,o=e.hints,a=this._modeling;g(t,(function(e){u(e.x)||(e.x=0),u(e.y)||(e.y=0)}));var s=vt(y(t,(function(e){return!e.hidden})));g(t,(function(e){fn(e)&&(e.waypoints=E(e.waypoints,(function(e){return{x:Fv(e.x-s.x-s.width/2+r.x),y:Fv(e.y-s.y-s.height/2+r.y)}}))),L(e,{x:Fv(e.x-s.x-s.width/2+r.x),y:Fv(e.y-s.y-s.height/2+r.y)})}));var c=ut(t),p={};g(t,(function(e){if(fn(e))p[e.id]=u(i)?a.createConnection(p[e.source.id],p[e.target.id],i,e,e.parent||n,o):a.createConnection(p[e.source.id],p[e.target.id],e,e.parent||n,o);else{var t=L({},o);-1===c.indexOf(e)&&(t.autoResize=!1),mn(e)&&(t=$(t,[\"attach\"])),p[e.id]=u(i)?a.createShape(e,I(e,[\"x\",\"y\",\"width\",\"height\"]),e.parent||n,i,t):a.createShape(e,I(e,[\"x\",\"y\",\"width\",\"height\"]),e.parent||n,t)}})),e.elements=C(p)};var Hv=Math.round;function Gv(e){this._canvas=e}function Vv(e){Gv.call(this,e)}Gv.$inject=[\"canvas\"],Gv.prototype.execute=function(e){var t=e.shape,n=e.position,i=e.parent,r=e.parentIndex;if(!i)throw new Error(\"parent required\");if(!n)throw new Error(\"position required\");return void 0!==n.width?L(t,n):L(t,{x:n.x-Hv(t.width/2),y:n.y-Hv(t.height/2)}),this._canvas.addShape(t,i,r),t},Gv.prototype.revert=function(e){var t=e.shape;return this._canvas.removeShape(t),t},e(Vv,Gv),Vv.$inject=[\"canvas\"];var Wv=Gv.prototype.execute;Vv.prototype.execute=function(e){var t=e.shape;return function(e){[\"width\",\"height\"].forEach((function(t){void 0===e[t]&&(e[t]=0)}))}(t),t.labelTarget=e.labelTarget,Wv.call(this,e)};var Uv=Gv.prototype.revert;function qv(e,t){this._canvas=e,this._modeling=t}function Kv(e,t){this._modeling=e,this._elementRegistry=t}function Yv(e,t){this._canvas=e,this._modeling=t}function Xv(e){this._modeling=e}Vv.prototype.revert=function(e){return e.shape.labelTarget=null,Uv.call(this,e)},qv.$inject=[\"canvas\",\"modeling\"],qv.prototype.preExecute=function(e){var t=this._modeling,n=e.connection;Sv(n.incoming,(function(e){t.removeConnection(e,{nested:!0})})),Sv(n.outgoing,(function(e){t.removeConnection(e,{nested:!0})}))},qv.prototype.execute=function(e){var t=e.connection,n=t.parent;return e.parent=n,e.parentIndex=St(n.children,t),e.source=t.source,e.target=t.target,this._canvas.removeConnection(t),t.source=null,t.target=null,t},qv.prototype.revert=function(e){var t=e.connection,n=e.parent,i=e.parentIndex;return t.source=e.source,t.target=e.target,Et(n.children,t,i),this._canvas.addConnection(t,n),t},Kv.$inject=[\"modeling\",\"elementRegistry\"],Kv.prototype.postExecute=function(e){var t=this._modeling,n=this._elementRegistry;g(e.elements,(function(e){n.get(e.id)&&(e.waypoints?t.removeConnection(e):t.removeShape(e))}))},Yv.$inject=[\"canvas\",\"modeling\"],Yv.prototype.preExecute=function(e){var t=this._modeling,n=e.shape;Sv(n.incoming,(function(e){t.removeConnection(e,{nested:!0})})),Sv(n.outgoing,(function(e){t.removeConnection(e,{nested:!0})})),Sv(n.children,(function(e){fn(e)?t.removeConnection(e,{nested:!0}):t.removeShape(e,{nested:!0})}))},Yv.prototype.execute=function(e){var t=this._canvas,n=e.shape,i=n.parent;return e.oldParent=i,e.oldParentIndex=St(i.children,n),t.removeShape(n),n},Yv.prototype.revert=function(e){var t=this._canvas,n=e.shape,i=e.oldParent,r=e.oldParentIndex;return Et(i.children,n,r),t.addShape(n,i),n},Xv.$inject=[\"modeling\"];var Zv={x:\"y\",y:\"x\"};function Qv(e,t){this._layouter=e,this._canvas=t}function Jv(){}function ey(){this.allShapes={},this.allConnections={},this.enclosedElements={},this.enclosedConnections={},this.topLevel={}}function ty(e){this._modeling=e}function ny(e){this._helper=new ty(e)}function iy(e){this._modeling=e,this._helper=new ty(e)}function ry(e){this._modeling=e}function oy(e){return e.original||e}function ay(e,t){this._modeling=e,this._rules=t}function sy(e){this._modeling=e}function cy(e){this._modeling=e}function py(e){return L({},e)}function ly(e){switch(e){case\"n\":case\"s\":return\"y\";case\"w\":case\"e\":return\"x\"}}function uy(e,t,n){var i=ly(n);return/e|s/.test(n)?e[i]>t:/n|w/.test(n)?e[i]<t:void 0}function hy(e,t){return-1!==e.indexOf(t)}function dy(e){this._modeling=e}function fy(e){var t={};return g(e,(function(e){t[e.id]=e.hidden,e.children&&(t=L({},t,fy(e.children)))})),t}function my(e,t){var n=[];return g(e,(function(e){e.hidden=t,n=n.concat(e),e.children&&(n=n.concat(my(e.children,e.collapsed||t)))})),n}function vy(e,t){var n=[];return g(e,(function(e){e.hidden=t[e.id],n=n.concat(e),e.children&&(n=n.concat(vy(e.children,t)))})),n}function yy(e){this._modeling=e}function gy(e,t){return wt(e&&e.attachers,t)}function by(e,t,n){if(e){var i=e.attachers;i||(e.attachers=i=[]),Et(i,t,n)}}function xy(){}function _y(e,t,n){this._eventBus=e,this._elementFactory=t,this._commandStack=n;var i=this;e.on(\"diagram.init\",(function(){i.registerHandlers(n)}))}function wy(e){this._elementRegistry=e}function Ey(e,t){g(t,(function(t,n){e.set(n,t)}))}Xv.prototype.preExecute=function(e){var t=this._modeling,n=e.groups,i=e.axis,r=e.dimension;function o(e,t){e.range.min=Math.min(t[i],e.range.min),e.range.max=Math.max(t[i]+t[r],e.range.max)}function a(e){return e[i]+e[r]/2}function s(e){return e.length-1}function c(e){return e.max-e.min}var p,l,u=n[0],h=s(n),d=n[h],f=0;g(n,(function(e,p){var l,u,d;e.elements.length<2?p&&p!==n.length-1&&(o(e,e.elements[0]),f+=c(e.range)):(u=(l=k(e.elements,i))[0],p===h&&(u=l[s(l)]),d=a(u),e.range=null,g(l,(function(n){!function(e,n){var r={y:0};r[i]=e-a(n),r[i]&&(r[Zv[i]]=0,t.moveElements([n],r,n.parent))}(d,n),null!==e.range?o(e,n):e.range={min:n[i],max:n[i]+n[r]}})),p&&p!==n.length-1&&(f+=c(e.range)))})),l=Math.abs(d.range.min-u.range.max),(p=Math.round((l-f)/(n.length-1)))<n.length-1||g(n,(function(e,o){var a,s={};e!==u&&e!==d&&(a=n[o-1],e.range.max=0,g(e.elements,(function(n,o){s[Zv[i]]=0,s[i]=a.range.max-n[i]+p,e.range.min!==n[i]&&(s[i]+=n[i]-e.range.min),s[i]&&t.moveElements([n],s,n.parent),e.range.max=Math.max(n[i]+n[r],o?e.range.max:0)})))}))},Xv.prototype.postExecute=function(e){},Qv.$inject=[\"layouter\",\"canvas\"],Qv.prototype.execute=function(e){var t=e.connection;return L(e,{oldWaypoints:t.waypoints}),t.waypoints=this._layouter.layoutConnection(t,e.hints),t},Qv.prototype.revert=function(e){var t=e.connection;return t.waypoints=e.oldWaypoints,t},Jv.prototype.execute=function(e){var t=e.connection,n=e.delta,i=e.newParent||t.parent,r=e.newParentIndex,o=t.parent;return e.oldParent=o,e.oldParentIndex=wt(o.children,t),Et(i.children,t,r),t.parent=i,g(t.waypoints,(function(e){e.x+=n.x,e.y+=n.y,e.original&&(e.original.x+=n.x,e.original.y+=n.y)})),t},Jv.prototype.revert=function(e){var t=e.connection,n=t.parent,i=e.oldParent,r=e.oldParentIndex,o=e.delta;return wt(n.children,t),Et(i.children,t,r),t.parent=i,g(t.waypoints,(function(e){e.x-=o.x,e.y-=o.y,e.original&&(e.original.x-=o.x,e.original.y-=o.y)})),t},ey.prototype.add=function(e,t){return this.addAll([e],t)},ey.prototype.addAll=function(e,t){var n=function(e,t,n){a(t)&&(t=!0),l(t)&&(n=t,t=!0);var i=bt((n=n||{}).allShapes),r=bt(n.allConnections),o=bt(n.enclosedElements),s=bt(n.enclosedConnections),c=bt(n.topLevel,t&&R(e,(function(e){return e.id})));function p(e){c[e.source.id]&&c[e.target.id]&&(c[e.id]=[e]),i[e.source.id]&&i[e.target.id]&&(s[e.id]=o[e.id]=e),r[e.id]=e}return ft(e,(function(e){if(o[e.id]=e,!e.waypoints)return i[e.id]=e,g(e.incoming,p),g(e.outgoing,p),e.children;s[e.id]=r[e.id]=e})),{allShapes:i,allConnections:r,topLevel:c,enclosedConnections:s,enclosedElements:o}}(e,!!t,this);return L(this,n),this},ty.prototype.moveRecursive=function(e,t,n){return e?this.moveClosure(this.getClosure(e),t,n):[]},ty.prototype.moveClosure=function(e,t,n,i,r){var o=this._modeling,a=e.allShapes,s=e.allConnections,c=e.enclosedConnections,p=e.topLevel,l=!1;r&&r.parent===n&&(l=!0),g(a,(function(e){o.moveShape(e,t,p[e.id]&&!l&&n,{recurse:!1,layout:!1})})),g(s,(function(e){var i=!!a[e.source.id],r=!!a[e.target.id];c[e.id]&&i&&r?o.moveConnection(e,t,p[e.id]&&!l&&n):o.layoutConnection(e,{connectionStart:i&&gf(e,e.source,t),connectionEnd:r&&bf(e,e.target,t)})}))},ty.prototype.getClosure=function(e){return(new ey).addAll(e,!0)},ny.$inject=[\"modeling\"],ny.prototype.preExecute=function(e){e.closure=this._helper.getClosure(e.shapes)},ny.prototype.postExecute=function(e){var t,n=e.hints;n&&n.primaryShape&&(t=n.primaryShape,n.oldParent=t.parent),this._helper.moveClosure(e.closure,e.delta,e.newParent,e.newHost,t)},iy.$inject=[\"modeling\"],iy.prototype.execute=function(e){var t=e.shape,n=e.delta,i=e.newParent||t.parent,r=e.newParentIndex,o=t.parent;return e.oldBounds=I(t,[\"x\",\"y\",\"width\",\"height\"]),e.oldParent=o,e.oldParentIndex=wt(o.children,t),Et(i.children,t,r),L(t,{parent:i,x:t.x+n.x,y:t.y+n.y}),t},iy.prototype.postExecute=function(e){var t=e.shape,n=e.delta,i=e.hints,r=this._modeling;!1!==i.layout&&(g(t.incoming,(function(e){r.layoutConnection(e,{connectionEnd:bf(e,t,n)})})),g(t.outgoing,(function(e){r.layoutConnection(e,{connectionStart:gf(e,t,n)})}))),!1!==i.recurse&&this.moveChildren(e)},iy.prototype.revert=function(e){var t=e.shape,n=e.oldParent,i=e.oldParentIndex,r=e.delta;return Et(n.children,t,i),L(t,{parent:n,x:t.x-r.x,y:t.y-r.y}),t},iy.prototype.moveChildren=function(e){var t=e.delta,n=e.shape;this._helper.moveRecursive(n.children,t,null)},iy.prototype.getNewParent=function(e){return e.newParent||e.shape.parent},ry.$inject=[\"modeling\"],ry.prototype.execute=function(e){var t=e.newSource,n=e.newTarget,i=e.connection,r=e.dockingOrPoints;if(!t&&!n)throw new Error(\"newSource or newTarget required\");return p(r)&&(e.oldWaypoints=i.waypoints,i.waypoints=r),t&&(e.oldSource=i.source,i.source=t),n&&(e.oldTarget=i.target,i.target=n),i},ry.prototype.postExecute=function(e){var t=e.connection,n=e.newSource,i=e.newTarget,r=e.dockingOrPoints,o=e.hints||{},a={};o.connectionStart&&(a.connectionStart=o.connectionStart),o.connectionEnd&&(a.connectionEnd=o.connectionEnd),!1!==o.layoutConnection&&(!n||i&&\"source\"!==o.docking||(a.connectionStart=a.connectionStart||oy(p(r)?r[0]:r)),!i||n&&\"target\"!==o.docking||(a.connectionEnd=a.connectionEnd||oy(p(r)?r[r.length-1]:r)),o.newWaypoints&&(a.waypoints=o.newWaypoints),this._modeling.layoutConnection(t,a))},ry.prototype.revert=function(e){var t=e.oldSource,n=e.oldTarget,i=e.oldWaypoints,r=e.connection;return t&&(r.source=t),n&&(r.target=n),i&&(r.waypoints=i),r},ay.$inject=[\"modeling\",\"rules\"],ay.prototype.preExecute=function(e){var t,n=this,i=this._modeling,r=this._rules,o=e.oldShape,a=e.newData,s=e.hints||{};function c(e,t,n){return r.allowed(\"connection.reconnect\",{connection:n,source:e,target:t})}var p,l={x:a.x,y:a.y},u={x:o.x,y:o.y,width:o.width,height:o.height};t=e.newShape=e.newShape||n.createShape(a,l,o.parent,s),o.host&&i.updateAttachment(t,o.host),!1!==s.moveChildren&&(p=o.children.slice(),i.moveElements(p,{x:0,y:0},t,s));var h=o.incoming.slice(),d=o.outgoing.slice();g(h,(function(e){c(e.source,t,e)&&n.reconnectEnd(e,t,yf(e,t,u),s)})),g(d,(function(e){var i=e.target;c(t,i,e)&&n.reconnectStart(e,t,vf(e,t,u),s)}))},ay.prototype.postExecute=function(e){var t=e.oldShape;this._modeling.removeShape(t)},ay.prototype.execute=function(e){},ay.prototype.revert=function(e){},ay.prototype.createShape=function(e,t,n,i){return this._modeling.createShape(e,t,n,i)},ay.prototype.reconnectStart=function(e,t,n,i){this._modeling.reconnectStart(e,t,n,i)},ay.prototype.reconnectEnd=function(e,t,n,i){this._modeling.reconnectEnd(e,t,n,i)},sy.$inject=[\"modeling\"],sy.prototype.execute=function(e){var t=e.shape,n=e.newBounds,i=e.minBounds;if(void 0===n.x||void 0===n.y||void 0===n.width||void 0===n.height)throw new Error(\"newBounds must have {x, y, width, height} properties\");if(i&&(n.width<i.width||n.height<i.height))throw new Error(\"width and height cannot be less than minimum height and width\");if(!i&&n.width<10||n.height<10)throw new Error(\"width and height cannot be less than 10px\");return e.oldBounds={width:t.width,height:t.height,x:t.x,y:t.y},L(t,{width:n.width,height:n.height,x:n.x,y:n.y}),t},sy.prototype.postExecute=function(e){var t=this._modeling,n=e.shape,i=e.oldBounds;!1!==(e.hints||{}).layout&&(g(n.incoming,(function(e){t.layoutConnection(e,{connectionEnd:yf(e,n,i)})})),g(n.outgoing,(function(e){t.layoutConnection(e,{connectionStart:vf(e,n,i)})})))},sy.prototype.revert=function(e){var t=e.shape,n=e.oldBounds;return L(t,{width:n.width,height:n.height,x:n.x,y:n.y}),t},cy.$inject=[\"modeling\"],cy.prototype.preExecute=function(e){var t=e.delta,n=e.direction,i=e.movingShapes,r=e.resizingShapes,o=e.start,a={};this.moveShapes(i,t),g(r,(function(e){a[e.id]=function(e){return{x:e.x,y:e.y,height:e.height,width:e.width}}(e)})),this.resizeShapes(r,t,n),this.updateConnectionWaypoints(function(e,t){var n=[];return g(e.concat(t),(function(i){var r=i.incoming,o=i.outgoing;g(r.concat(o),(function(i){var r=i.source,o=i.target;(Xm(e,r)||Xm(e,o)||Xm(t,r)||Xm(t,o))&&(Xm(n,i)||n.push(i))}))})),n}(i,r),t,n,o,i,r,a)},cy.prototype.execute=function(){},cy.prototype.revert=function(){},cy.prototype.moveShapes=function(e,t){var n=this;g(e,(function(e){n._modeling.moveShape(e,t,null,{autoResize:!1,layout:!1,recurse:!1})}))},cy.prototype.resizeShapes=function(e,t,n){var i=this;g(e,(function(e){var r=function(e,t,n){var i=e.x,r=e.y,o=e.width,a=e.height,s=n.x,c=n.y;switch(t){case\"n\":return{x:i,y:r+c,width:o,height:a-c};case\"s\":return{x:i,y:r,width:o,height:a+c};case\"w\":return{x:i+s,y:r,width:o-s,height:a};case\"e\":return{x:i,y:r,width:o+s,height:a};default:throw new Error(\"unknown direction: \"+t)}}(e,n,t);i._modeling.resizeShape(e,r,null,{attachSupport:!1,autoResize:!1,layout:!1})}))},cy.prototype.updateConnectionWaypoints=function(e,t,n,i,r,o,a){var s=this,c=r.concat(o);g(e,(function(e){var p=e.source,l=e.target,u=function(e){return E(e.waypoints,(function(e){return(e=py(e)).original&&(e.original=py(e.original)),e}))}(e),h=ly(n),d={};hy(c,p)&&hy(c,l)?(u=E(u,(function(e){return uy(e,i,n)&&(e[h]=e[h]+t[h]),e.original&&uy(e.original,i,n)&&(e.original[h]=e.original[h]+t[h]),e})),s._modeling.updateWaypoints(e,u,{labelBehavior:!1})):(hy(c,p)||hy(c,l))&&(hy(r,p)?d.connectionStart=gf(e,p,t):hy(r,l)?d.connectionEnd=bf(e,l,t):hy(o,p)?d.connectionStart=vf(e,p,a[p.id]):hy(o,l)&&(d.connectionEnd=yf(e,l,a[l.id])),s._modeling.layoutConnection(e,d))}))},dy.$inject=[\"modeling\"],dy.prototype.execute=function(e){var t=e.shape,n=t.children;e.oldChildrenVisibility=fy(n),t.collapsed=!t.collapsed;var i=my(n,t.collapsed);return[t].concat(i)},dy.prototype.revert=function(e){var t=e.shape,n=e.oldChildrenVisibility,i=vy(t.children,n);return t.collapsed=!t.collapsed,[t].concat(i)},yy.$inject=[\"modeling\"],yy.prototype.execute=function(e){var t=e.shape,n=e.newHost,i=t.host;return e.oldHost=i,e.attacherIdx=gy(i,t),by(n,t),t.host=n,t},yy.prototype.revert=function(e){var t=e.shape,n=e.newHost,i=e.oldHost,r=e.attacherIdx;return t.host=i,gy(n,t),by(i,t,r),t},xy.prototype.execute=function(e){var t=e.connection,n=e.newWaypoints;return e.oldWaypoints=t.waypoints,t.waypoints=n,t},xy.prototype.revert=function(e){var t=e.connection,n=e.oldWaypoints;return t.waypoints=n,t},_y.$inject=[\"eventBus\",\"elementFactory\",\"commandStack\"],_y.prototype.getHandlers=function(){return{\"shape.append\":Iv,\"shape.create\":Gv,\"shape.delete\":Yv,\"shape.move\":iy,\"shape.resize\":sy,\"shape.replace\":ay,\"shape.toggleCollapse\":dy,spaceTool:cy,\"label.create\":Vv,\"connection.create\":$v,\"connection.delete\":qv,\"connection.move\":Jv,\"connection.layout\":Qv,\"connection.updateWaypoints\":xy,\"connection.reconnect\":ry,\"elements.create\":zv,\"elements.move\":ny,\"elements.delete\":Kv,\"elements.distribute\":Xv,\"elements.align\":Lv,\"element.updateAttachment\":yy}},_y.prototype.registerHandlers=function(e){g(this.getHandlers(),(function(t,n){e.registerHandler(n,t)}))},_y.prototype.moveShape=function(e,t,n,i,r){\"object\"==typeof i&&(r=i,i=null);var o={shape:e,delta:t,newParent:n,newParentIndex:i,hints:r||{}};this._commandStack.execute(\"shape.move\",o)},_y.prototype.updateAttachment=function(e,t){var n={shape:e,newHost:t};this._commandStack.execute(\"element.updateAttachment\",n)},_y.prototype.moveElements=function(e,t,n,i){var r,o=(i=i||{}).attach,a=n;!0===o?(r=n,a=n.parent):!1===o&&(r=null);var s={shapes:e,delta:t,newParent:a,newHost:r,hints:i};this._commandStack.execute(\"elements.move\",s)},_y.prototype.moveConnection=function(e,t,n,i,r){\"object\"==typeof i&&(r=i,i=void 0);var o={connection:e,delta:t,newParent:n,newParentIndex:i,hints:r||{}};this._commandStack.execute(\"connection.move\",o)},_y.prototype.layoutConnection=function(e,t){var n={connection:e,hints:t||{}};this._commandStack.execute(\"connection.layout\",n)},_y.prototype.createConnection=function(e,t,n,i,r,o){\"object\"==typeof n&&(o=r,r=i,i=n,n=void 0);var a={source:e,target:t,parent:r,parentIndex:n,connection:i=this._create(\"connection\",i),hints:o};return this._commandStack.execute(\"connection.create\",a),a.connection},_y.prototype.createShape=function(e,t,n,i,r){\"number\"!=typeof i&&(r=i,i=void 0);var o,a,s=(r=r||{}).attach;e=this._create(\"shape\",e),s?(o=n.parent,a=n):o=n;var c={position:t,shape:e,parent:o,parentIndex:i,host:a,hints:r};return this._commandStack.execute(\"shape.create\",c),c.shape},_y.prototype.createElements=function(e,t,n,i,r){p(e)||(e=[e]),\"number\"!=typeof i&&(r=i,i=void 0);var o={position:t,elements:e,parent:n,parentIndex:i,hints:r=r||{}};return this._commandStack.execute(\"elements.create\",o),o.elements},_y.prototype.createLabel=function(e,t,n,i){n=this._create(\"label\",n);var r={labelTarget:e,position:t,parent:i||e.parent,shape:n};return this._commandStack.execute(\"label.create\",r),r.shape},_y.prototype.appendShape=function(e,t,n,i,r){r=r||{};var o={source:e,position:n,target:i,shape:t=this._create(\"shape\",t),connection:r.connection,connectionParent:r.connectionParent,hints:r};return this._commandStack.execute(\"shape.append\",o),o.shape},_y.prototype.removeElements=function(e){var t={elements:e};this._commandStack.execute(\"elements.delete\",t)},_y.prototype.distributeElements=function(e,t,n){var i={groups:e,axis:t,dimension:n};this._commandStack.execute(\"elements.distribute\",i)},_y.prototype.removeShape=function(e,t){var n={shape:e,hints:t||{}};this._commandStack.execute(\"shape.delete\",n)},_y.prototype.removeConnection=function(e,t){var n={connection:e,hints:t||{}};this._commandStack.execute(\"connection.delete\",n)},_y.prototype.replaceShape=function(e,t,n){var i={oldShape:e,newData:t,hints:n||{}};return this._commandStack.execute(\"shape.replace\",i),i.newShape},_y.prototype.alignElements=function(e,t){var n={elements:e,alignment:t};this._commandStack.execute(\"elements.align\",n)},_y.prototype.resizeShape=function(e,t,n,i){var r={shape:e,newBounds:t,minBounds:n,hints:i};this._commandStack.execute(\"shape.resize\",r)},_y.prototype.createSpace=function(e,t,n,i,r){var o={delta:n,direction:i,movingShapes:e,resizingShapes:t,start:r};this._commandStack.execute(\"spaceTool\",o)},_y.prototype.updateWaypoints=function(e,t,n){var i={connection:e,newWaypoints:t,hints:n||{}};this._commandStack.execute(\"connection.updateWaypoints\",i)},_y.prototype.reconnect=function(e,t,n,i,r){var o={connection:e,newSource:t,newTarget:n,dockingOrPoints:i,hints:r||{}};this._commandStack.execute(\"connection.reconnect\",o)},_y.prototype.reconnectStart=function(e,t,n,i){i||(i={}),this.reconnect(e,t,e.target,n,L(i,{docking:\"source\"}))},_y.prototype.reconnectEnd=function(e,t,n,i){i||(i={}),this.reconnect(e,e.source,t,n,L(i,{docking:\"target\"}))},_y.prototype.connect=function(e,t,n,i){return this.createConnection(e,t,n||{},e.parent,i)},_y.prototype._create=function(e,t){return t instanceof Vn?t:this._elementFactory.create(e,t)},_y.prototype.toggleCollapse=function(e,t){var n={shape:e,hints:t||{}};this._commandStack.execute(\"shape.toggleCollapse\",n)},wy.$inject=[\"elementRegistry\"],wy.prototype.execute=function(e){var t=e.element,n=e.moddleElement,i=e.properties;if(!n)throw new Error(\"<moddleElement> required\");var r=e.changed||this._getVisualReferences(n).concat(t),o=e.oldProperties||function(e,t){return x(t,(function(t,n){return t[n]=e.get(n),t}),{})}(n,S(i));return Ey(n,i),e.oldProperties=o,e.changed=r,r},wy.prototype.revert=function(e){var t=e.oldProperties,n=e.moddleElement,i=e.changed;return Ey(n,t),i},wy.prototype._getVisualReferences=function(e){var t=this._elementRegistry;return Mr(e,\"bpmn:DataObject\")?function(e,t){return t.filter((function(t){return Mr(t,\"bpmn:DataObjectReference\")&&Br(t).dataObjectRef===e}))}(e,t):[]};var Sy=\"default\",Cy=\"id\",Ry=\"di\",Py={width:0,height:0};function Ty(e,t,n,i,r){this._elementRegistry=e,this._moddle=t,this._translate=n,this._modeling=i,this._textRenderer=r}function ky(e,t){return Cy in e&&e[Cy]!==t[Cy]}function Ay(e,t){var n=e.businessObject,i=Nr(e);g(t,(function(e,t){t!==Ry?n.set(t,e):i&&function(e,t){g(t,(function(t,n){e.set(n,t)}))}(i,e)}))}Ty.$inject=[\"elementRegistry\",\"moddle\",\"translate\",\"modeling\",\"textRenderer\"],Ty.prototype.execute=function(e){var t=e.element,n=[t],i=this._translate;if(!t)throw new Error(i(\"element required\"));var r=this._elementRegistry,o=this._moddle.ids,a=t.businessObject,s=function(e){var t=L({},e);return My.forEach((function(n){n in e&&(t[n]=Br(t[n]))})),t}(e.properties),c=e.oldProperties||function(e,t){var n=S(t),i=e.businessObject,r=Nr(e);return x(n,(function(e,n){return e[n]=n!==Ry?i.get(n):function(e,t){return x(t,(function(t,n){return t[n]=e&&e.get(n),t}),{})}(r,S(t.di)),e}),{})}(t,s);return ky(s,a)&&(o.unclaim(a[Cy]),r.updateId(t,s[Cy]),o.claim(s[Cy],a)),Sy in s&&(s[Sy]&&n.push(r.get(s[Sy].id)),a[Sy]&&n.push(r.get(a[Sy].id))),Ay(t,s),e.oldProperties=c,e.changed=n,n},Ty.prototype.postExecute=function(e){var t=e.element.label,n=t&&Br(t).name;if(n){var i=this._textRenderer.getExternalLabelBounds(t,n);this._modeling.resizeShape(t,i,Py)}},Ty.prototype.revert=function(e){var t=e.element,n=e.properties,i=e.oldProperties,r=t.businessObject,o=this._elementRegistry,a=this._moddle.ids;return Ay(t,i),ky(n,r)&&(a.unclaim(n[Cy]),o.updateId(t,i[Cy]),a.claim(i[Cy],r)),e.changed};var My=[\"default\"];function Dy(e,t){this._canvas=e,this._modeling=t}function By(e,t){this._modeling=e,this._spaceTool=t}function Ny(e,t){this._modeling=e,this._translate=t}function Oy(e,t){this._modeling=e,this._spaceTool=t}Dy.$inject=[\"canvas\",\"modeling\"],Dy.prototype.execute=function(e){var t=this._canvas,n=e.newRoot,i=n.businessObject,r=t.getRootElement(),o=r.businessObject,a=o.$parent,s=Nr(r);return t.setRootElement(n),t.removeRootElement(r),Et(a.rootElements,i),i.$parent=a,wt(a.rootElements,o),o.$parent=null,r.di=null,s.bpmnElement=i,n.di=s,e.oldRoot=r,[]},Dy.prototype.revert=function(e){var t=this._canvas,n=e.newRoot,i=n.businessObject,r=e.oldRoot,o=r.businessObject,a=i.$parent,s=Nr(n);return t.setRootElement(r),t.removeRootElement(n),wt(a.rootElements,i),i.$parent=null,Et(a.rootElements,o),o.$parent=a,n.di=null,s.bpmnElement=o,r.di=s,[]},By.$inject=[\"modeling\",\"spaceTool\"],By.prototype.preExecute=function(e){var t=this._spaceTool,n=this._modeling,i=e.shape,r=e.location,o=oh(i),a=o===i,s=a?i:i.parent;rh(s).length||n.createShape({type:\"bpmn:Lane\"},{x:i.x+nh,y:i.y,width:i.width-nh,height:i.height},s);var c=[];ft(o,(function(e){return c.push(e),e.label&&c.push(e.label),e===i?[]:y(e.children,(function(e){return e!==i}))}));var p=\"top\"===r?-120:120,l=\"top\"===r?i.y:i.y+i.height,u=l+(\"top\"===r?10:-10),h=\"top\"===r?\"n\":\"s\",d=t.calculateAdjustments(c,\"y\",p,u);t.makeSpace(d.movingShapes,d.resizingShapes,{x:0,y:p},h,u),e.newLane=n.createShape({type:\"bpmn:Lane\"},{x:i.x+(a?nh:0),y:l-(\"top\"===r?120:0),width:i.width-(a?nh:0),height:120},s)},Ny.$inject=[\"modeling\",\"translate\"],Ny.prototype.preExecute=function(e){var t=this._modeling,n=this._translate,i=e.shape,r=e.count,o=rh(i),a=o.length;if(a>r)throw new Error(n(\"more than {count} child lanes\",{count:r}));var s,c,p,l,u,h=Math.round(i.height/r);for(u=0;u<r;u++)s=i.y+u*h,c=u===r-1?i.height-h*u:h,p={x:i.x+nh,y:s,width:i.width-nh,height:c},u<a?t.resizeShape(o[u],p):(l={type:\"bpmn:Lane\"},t.createShape(l,p,i))},Oy.$inject=[\"modeling\",\"spaceTool\"],Oy.prototype.preExecute=function(e){var t=e.shape,n=e.newBounds;!1!==e.balanced?this.resizeBalanced(t,n):this.resizeSpace(t,n)},Oy.prototype.resizeBalanced=function(e,t){var n=this._modeling,i=ah(e,t);n.resizeShape(e,t),i.forEach((function(e){n.resizeShape(e.shape,e.newBounds)}))},Oy.prototype.resizeSpace=function(e,t){var n,i,r,o,a,s=this._spaceTool,c=gn(e),p=Yu(gn(t),c),l=oh(e),u=[],h=[];ft(l,(function(e){return u.push(e),(Mr(e,\"bpmn:Lane\")||Mr(e,\"bpmn:Participant\"))&&h.push(e),e.children})),(p.bottom||p.top)&&(n=p.bottom||p.top,i=e.y+(p.bottom?e.height:0)+(p.bottom?-10:10),r=p.bottom?\"s\":\"n\",o=p.top>0||p.bottom<0?-n:n,a=s.calculateAdjustments(u,\"y\",o,i),s.makeSpace(a.movingShapes,a.resizingShapes,{x:0,y:n},r)),(p.left||p.right)&&(n=p.right||p.left,i=e.x+(p.right?e.width:0)+(p.right?-10:100),r=p.right?\"e\":\"w\",o=p.left>0||p.right<0?-n:n,a=s.calculateAdjustments(h,\"x\",o,i),s.makeSpace(a.movingShapes,a.resizingShapes,{x:n,y:0},r))};var jy=\"flowNodeRef\",Ly=\"lanes\";function Iy(e){this._elementRegistry=e}function $y(e){this._moddle=e}Iy.$inject=[\"elementRegistry\"],Iy.prototype._computeUpdates=function(e,t){var n=[],i=[],r={},o=[];function a(e){-1===n.indexOf(e)&&(o.push(e),n.push(e))}function s(e){if(!e.parent)return[];var t=function(e){var t=oh(e);return r[t.id]||(r[t.id]=ih(t)),r[t.id]}(e);return t.filter((function(t){return n=e,i=gn(t),r=n.x+n.width/2,o=n.y+n.height/2,r>i.left&&r<i.right&&o>i.top&&o<i.bottom;var n,i,r,o})).map((function(e){return e.businessObject}))}return t.forEach((function(e){var t=oh(e);if(t&&-1===n.indexOf(t)){var i=t.children.filter((function(e){return Mr(e,\"bpmn:FlowNode\")}));i.forEach(a),n.push(t)}})),e.forEach(a),o.forEach((function(e){var t=e.businessObject,n=t.get(Ly).slice(),r=s(e);i.push({flowNode:t,remove:n,add:r})})),t.forEach((function(e){var t=e.businessObject;e.parent||t.get(jy).forEach((function(e){i.push({flowNode:e,remove:[t],add:[]})}))})),i},Iy.prototype.execute=function(e){var t=e.updates;return t||(t=e.updates=this._computeUpdates(e.flowNodeShapes,e.laneShapes)),t.forEach((function(e){var t=e.flowNode,n=t.get(Ly);e.remove.forEach((function(e){wt(n,e),wt(e.get(jy),t)})),e.add.forEach((function(e){Et(n,e),Et(e.get(jy),t)}))})),[]},Iy.prototype.revert=function(e){return e.updates.forEach((function(e){var t=e.flowNode,n=t.get(Ly);e.add.forEach((function(e){wt(n,e),wt(e.get(jy),t)})),e.remove.forEach((function(e){Et(n,e),Et(e.get(jy),t)}))})),[]},$y.$inject=[\"moddle\"],$y.prototype.execute=function(e){var t=this._moddle.ids,n=e.id,i=e.element;return e.claiming?t.claim(n,i):t.unclaim(n),[]},$y.prototype.revert=function(e){var t=this._moddle.ids,n=e.id,i=e.element;return e.claiming?t.unclaim(n):t.claim(n,i),[]};var Fy={fill:void 0,stroke:void 0};function zy(e){this._commandStack=e,this._normalizeColor=function(e){if(e){if(d(e)){var t=function(e){var t=document.createElement(\"canvas\").getContext(\"2d\");return t.fillStyle=\"transparent\",t.fillStyle=e,/^#[0-9a-fA-F]{6}$/.test(t.fillStyle)?t.fillStyle:null}(e);if(t)return t}throw new Error(\"invalid color value: \"+e)}}}zy.$inject=[\"commandStack\"],zy.prototype.postExecute=function(e){var t=e.elements,n=e.colors||Fy,i=this,r={};\"fill\"in n&&L(r,{\"background-color\":this._normalizeColor(n.fill)}),\"stroke\"in n&&L(r,{\"border-color\":this._normalizeColor(n.stroke)}),g(t,(function(e){var t=fn(e)?I(r,[\"border-color\"]):r,n=Nr(e);if(function(e){\"border-color\"in e&&(e.stroke=e[\"border-color\"]);\"background-color\"in e&&(e.fill=e[\"background-color\"])}(t),mn(e))i._commandStack.execute(\"element.updateModdleProperties\",{element:e,moddleElement:n.label,properties:{color:r[\"border-color\"]}});else{if(!Dr(n,[\"bpmndi:BPMNEdge\",\"bpmndi:BPMNShape\"]))return;i._commandStack.execute(\"element.updateProperties\",{element:e,properties:{di:t}})}}))};var Hy={width:0,height:0};function Gy(e,t,n){function i(e,t){var n=e.label||e,i=e.labelTarget||e;return function(e,t){var n=e.businessObject,i=ao(n);i&&(\"categoryValueRef\"===i?n.categoryValueRef.value=t:n[i]=t)}(n,t),[n,i]}this.preExecute=function(t){var n=t.element,i=n.businessObject,r=t.newLabel;if(!mn(n)&&no(n)&&!io(n)&&!Vy(r)){var o=oo(n);o={x:o.x,y:o.y+7},e.createLabel(n,o,{id:i.id+\"_label\",businessObject:i,di:n.di})}},this.execute=function(e){return e.oldLabel=so(e.element),i(e.element,e.newLabel)},this.revert=function(e){return i(e.element,e.oldLabel)},this.postExecute=function(n){var i=n.element,r=i.label||i,o=n.newLabel,a=n.newBounds,s=n.hints||{};if(mn(r)||Mr(r,\"bpmn:TextAnnotation\"))if(mn(r)&&Vy(o))!1!==s.removeShape&&e.removeShape(r,{unsetLabel:!1});else{var c=so(i);void 0===a&&(a=t.getExternalLabelBounds(r,c)),a&&e.resizeShape(r,a,Hy)}}}function Vy(e){return!e||!e.trim()}function Wy(e,t,n,i){_y.call(this,e,t,n),this._bpmnRules=i}function Uy(){}Gy.$inject=[\"modeling\",\"textRenderer\",\"bpmnFactory\"],e(Wy,_y),Wy.$inject=[\"eventBus\",\"elementFactory\",\"commandStack\",\"bpmnRules\"],Wy.prototype.getHandlers=function(){var e=_y.prototype.getHandlers.call(this);return e[\"element.updateModdleProperties\"]=wy,e[\"element.updateProperties\"]=Ty,e[\"canvas.updateRoot\"]=Dy,e[\"lane.add\"]=By,e[\"lane.resize\"]=Oy,e[\"lane.split\"]=Ny,e[\"lane.updateRefs\"]=Iy,e[\"id.updateClaim\"]=$y,e[\"element.setColor\"]=zy,e[\"element.updateLabel\"]=Gy,e},Wy.prototype.updateLabel=function(e,t,n,i){this._commandStack.execute(\"element.updateLabel\",{element:e,newLabel:t,newBounds:n,hints:i||{}})},Wy.prototype.connect=function(e,t,n,i){var r=this._bpmnRules;if(n||(n=r.canConnect(e,t)),n)return this.createConnection(e,t,n,e.parent,i)},Wy.prototype.updateModdleProperties=function(e,t,n){this._commandStack.execute(\"element.updateModdleProperties\",{element:e,moddleElement:t,properties:n})},Wy.prototype.updateProperties=function(e,t){this._commandStack.execute(\"element.updateProperties\",{element:e,properties:t})},Wy.prototype.resizeLane=function(e,t,n){this._commandStack.execute(\"lane.resize\",{shape:e,newBounds:t,balanced:n})},Wy.prototype.addLane=function(e,t){var n={shape:e,location:t};return this._commandStack.execute(\"lane.add\",n),n.newLane},Wy.prototype.splitLane=function(e,t){this._commandStack.execute(\"lane.split\",{shape:e,count:t})},Wy.prototype.makeCollaboration=function(){var e=this._create(\"root\",{type:\"bpmn:Collaboration\"}),t={newRoot:e};return this._commandStack.execute(\"canvas.updateRoot\",t),e},Wy.prototype.makeProcess=function(){var e={newRoot:this._create(\"root\",{type:\"bpmn:Process\"})};this._commandStack.execute(\"canvas.updateRoot\",e)},Wy.prototype.updateLaneRefs=function(e,t){this._commandStack.execute(\"lane.updateRefs\",{flowNodeShapes:e,laneShapes:t})},Wy.prototype.claimId=function(e,t){this._commandStack.execute(\"id.updateClaim\",{id:e,element:t,claiming:!0})},Wy.prototype.unclaimId=function(e,t){this._commandStack.execute(\"id.updateClaim\",{id:e,element:t})},Wy.prototype.setColor=function(e,t){e.length||(e=[e]),this._commandStack.execute(\"element.setColor\",{elements:e,colors:t})},Uy.prototype.layoutConnection=function(e,t){return[(t=t||{}).connectionStart||_n(t.source||e.source),t.connectionEnd||_n(t.target||e.target)]};var qy=20,Ky=5,Yy=Math.round,Xy=20,Zy={\"h:h\":20,\"v:v\":20,\"h:v\":-10,\"v:h\":-10};function Qy(e,t,n){var i,r,o,a=wn(t,e,Ky),s=n.split(\":\")[0],c=Yy((t.x-e.x)/2+e.x),p=Yy((t.y-e.y)/2+e.y),l=(o=a,{t:/top/,r:/right/,b:/bottom/,l:/left/,h:/left|right/,v:/top|bottom/}[s].test(o)),u=/h|r|l/.test(s),h=!1,d=!1;return l?(i=u?{x:c,y:e.y}:{x:e.x,y:p},r=u?\"h:h\":\"v:v\"):(h=function(e,t){return!{t:/top/,r:/right/,b:/bottom/,l:/left/,h:/./,v:/./}[t].test(e)}(a,s),r=u?\"h:v\":\"v:h\",h?u?(d=p===e.y,i={x:e.x+qy*(/l/.test(s)?-1:1),y:d?p+qy:p}):i={x:(d=c===e.x)?c+qy:c,y:e.y+qy*(/t/.test(s)?-1:1)}:i={x:c,y:p}),{waypoints:eg(e,i,r).concat(i),directions:r,turnNextDirections:d}}function Jy(e){return e.split(\":\").reverse().join(\":\")}function eg(e,t,n){if(!function(e){return e&&/^h|v|t|r|b|l:h|v|t|r|b|l$/.test(e)}(n=n||\"h:h\"))throw new Error(\"unknown directions: <\"+n+\">: must be specified as <start>:<end> with start/end in { h,v,t,r,b,l }\");if(og(n)){var i=function(e,t,n){return Qy(e,t,n)}(e,t,n),r=function(e,t,n){var i=Qy(t,e,Jy(n));return{waypoints:i.waypoints.slice().reverse(),directions:Jy(i.directions),turnNextDirections:i.turnNextDirections}}(e,t,n),o=function(e,t){var n=e.directions.split(\":\")[1],i=t.directions.split(\":\")[0];e.turnNextDirections&&(n=\"h\"==n?\"v\":\"h\"),t.turnNextDirections&&(i=\"h\"==i?\"v\":\"h\");var r=n+\":\"+i;return{waypoints:eg(e.waypoints[e.waypoints.length-1],t.waypoints[0],r),directions:r}}(i,r);return[].concat(i.waypoints,o.waypoints,r.waypoints)}return function(e,t,n){var i=Yy((t.x-e.x)/2+e.x),r=Yy((t.y-e.y)/2+e.y);if(\"h:v\"===n)return[{x:t.x,y:e.y}];if(\"v:h\"===n)return[{x:e.x,y:t.y}];if(\"h:h\"===n)return[{x:i,y:e.y},{x:i,y:t.y}];if(\"v:v\"===n)return[{x:e.x,y:r},{x:t.x,y:r}];throw new Error(\"invalid directions: can only handle varians of [hv]:[hv]\")}(e,t,n)}function tg(e,t,n,i,r){var o=b(r&&r.preferredLayouts||[],\"straight\")[0]||\"h:h\",a=wn(e,t,Zy[o]||0),s=function(e,t){if(og(t))return t;switch(e){case\"intersect\":return\"t:t\";case\"top\":case\"bottom\":return\"v:v\";case\"left\":case\"right\":return\"h:h\";default:return t}}(a,o);n=n||_n(e),i=i||_n(t);var c=s.split(\":\"),p=ag(n,e,c[0],function(e){return{top:\"bottom\",bottom:\"top\",left:\"right\",right:\"left\",\"top-left\":\"bottom-right\",\"bottom-right\":\"top-left\",\"top-right\":\"bottom-left\",\"bottom-left\":\"top-right\"}[e]}(a));return function(e,t,n){var i=eg(e,t,n);return i.unshift(e),i.push(t),sg(i)}(p,ag(i,t,c[1],a),s)}function ng(e,t,n,i,r,o){var a;return p(n)&&(r=n,o=i,n=_n(e),i=_n(t)),r=r||[],a=-1!==(o=L({preferredLayouts:[]},o)).preferredLayouts.indexOf(\"straight\")&&function(e,t,n,i,r){var o,a,s={};if(a=wn(e,t),!/^(top|bottom|left|right)$/.test(a))return null;/top|bottom/.test(a)&&(o=\"x\");/left|right/.test(a)&&(o=\"y\");return\"target\"===r.preserveDocking?ig(o,i,e)?(s[o]=i[o],[{x:void 0!==s.x?s.x:n.x,y:void 0!==s.y?s.y:n.y,original:{x:void 0!==s.x?s.x:n.x,y:void 0!==s.y?s.y:n.y}},{x:i.x,y:i.y}]):null:ig(o,n,t)?(s[o]=n[o],[{x:n.x,y:n.y},{x:void 0!==s.x?s.x:i.x,y:void 0!==s.y?s.y:i.y,original:{x:void 0!==s.x?s.x:i.x,y:void 0!==s.y?s.y:i.y}}]):null}(e,t,n,i,o),a||(a=o.connectionEnd&&function(e,t,n,i){var r=i.slice().reverse();return r=rg(e,t,n,r),r?r.reverse():null}(t,e,i,r),a||((a=o.connectionStart&&rg(e,t,n,r))||(!o.connectionStart&&!o.connectionEnd&&r&&r.length?r:tg(e,t,n,i,o))))}function ig(e,t,n){return function(e,t,n){return e>=t&&e<=n}(t[e],n[e],n[e]+n[{x:\"width\",y:\"height\"}[e]])}function rg(e,t,n,i){if(function(e){return e.length<3||!(e.length>4)&&!!m(e,(function(t,n){var i=e[n-1];return i&&Ct(t,i)<3}))}(i))return null;var r,o=i[0],a=i.slice();return a[0]=n,a[1]=function(e,t,n){switch(Tt(t,e)){case\"v\":return{x:n.x,y:e.y};case\"h\":return{x:e.x,y:n.y}}return{x:e.x,y:e.y}}(a[1],o,n),r=function(e,t,n){var i;for(i=e.length-2;0!==i;i--)if(At(e[i],t,Xy)||At(e[i],n,Xy))return e.slice(i);return e}(a,e,t),r!==a&&(a=rg(e,t,n,r)),a&&Tt(a)?null:a}function og(e){return e&&/t|r|b|l/.test(e)}function ag(e,t,n,i){if(\"h\"===n&&(n=/left/.test(i)?\"l\":\"r\"),\"v\"===n&&(n=/top/.test(i)?\"t\":\"b\"),\"t\"===n)return{original:e,x:e.x,y:t.y};if(\"r\"===n)return{original:e,x:t.x+t.width,y:e.y};if(\"b\"===n)return{original:e,x:e.x,y:t.y+t.height};if(\"l\"===n)return{original:e,x:t.x,y:e.y};throw new Error(\"unexpected dockingDirection: <\"+n+\">\")}function sg(e){return e.reduce((function(t,n,i){return Rt(t[t.length-1],e[i+1],n,0)||t.push(n),t}),[])}var cg=-10,pg=40,lg={top:\"bottom\",\"top-right\":\"bottom-left\",\"top-left\":\"bottom-right\",right:\"left\",bottom:\"top\",\"bottom-right\":\"top-left\",\"bottom-left\":\"top-right\",left:\"right\"},ug={top:\"t\",right:\"r\",bottom:\"b\",left:\"l\"};function hg(){}function dg(e,t){return Mr(t,\"bpmn:Participant\")?\"source\":Mr(e,\"bpmn:Participant\")?\"target\":yg(t)?\"source\":yg(e)||Mr(t,\"bpmn:Event\")?\"target\":Mr(e,\"bpmn:Event\")?\"source\":null}function fg(e){return yg(e)?\"target\":\"source\"}function mg(e,t){return e?e.original||e:_n(t)}function vg(e,t){return Mr(t,\"bpmn:Activity\")&&Mr(e,\"bpmn:BoundaryEvent\")&&t.businessObject.isForCompensation}function yg(e){return Mr(e,\"bpmn:SubProcess\")&&Zr(e)}function gg(e,t){return e===t}function bg(e){var t=/right|left/.exec(e);return t&&t[0]}function xg(e){var t=/top|bottom/.exec(e);return t&&t[0]}function _g(e){return\"right\"===e||\"left\"===e}function wg(e,t){var n=t.waypoints,i=n&&n.length&&wn(n[0],e);return\"top\"===i?[\"t:r\"]:\"right\"===i?[\"r:b\"]:\"left\"===i?[\"l:t\"]:[\"b:l\"]}function Eg(e,t,n){var i,r,o,a,s=_n(e),c=_n(t),p=(a=(o=e).host,wn(_n(o),a,cg)),l=gg(e.host,t),u=-1!==[\"top\",\"right\",\"bottom\",\"left\"].indexOf(p),h=wn(c,s,{x:e.width/2+t.width/2,y:e.height/2+t.height/2});return l?function(e,t,n,i,r){var o,a=t?e:xg(e),s=ug[a];o=t?_g(e)?Sg(\"y\",n,i,r)?\"h\":\"b\":Sg(\"x\",n,i,r)?\"v\":\"l\":\"v\";return[s+\":\"+o]}(p,u,e,t,n):(i=function(e,t,n){if(n)return ug[e];if(gg(xg(e),xg(t))||function(e,t){return lg[e]===t}(bg(e),bg(t)))return ug[xg(e)];return ug[bg(e)]}(p,h,u),r=function(e,t,n){if(n)return _g(e)?function(e,t){var n=bg(e),i=lg[n];return-1!==t.indexOf(i)}(e,t)||gg(e,t)?\"h\":\"v\":function(e,t){var n=xg(e),i=lg[n];return-1!==t.indexOf(i)}(e,t)||gg(e,t)?\"v\":\"h\";return _g(t)||gg(xg(e),xg(t))&&bg(t)?\"h\":\"v\"}(p,h,u),[i+\":\"+r])}function Sg(e,t,n,i){var r=pg;return!(Cg(e,i,n,r)||Cg(e,i,{x:n.x+n.width,y:n.y+n.height},r)||Cg(e,i,_n(t),r))}function Cg(e,t,n,i){return Math.abs(t[e]-n[e])<i}function Rg(e){return L({original:e.point.original||e.point},e.actual)}function Pg(e,t){this._elementRegistry=e,this._graphicsFactory=t}e(hg,Uy),hg.prototype.layoutConnection=function(e,t){t||(t={});var n,i,r=t.source||e.source,o=t.target||e.target,a=t.waypoints||e.waypoints,s=t.connectionStart,c=t.connectionEnd;return s||(s=mg(a&&a[0],r)),c||(c=mg(a&&a[a.length-1],o)),(Mr(e,\"bpmn:Association\")||Mr(e,\"bpmn:DataAssociation\"))&&a&&!vg(r,o)?[].concat([s],a.slice(1,-1),[c]):(Mr(e,\"bpmn:MessageFlow\")?n=function(e,t){return{preferredLayouts:[\"straight\",\"v:v\"],preserveDocking:dg(e,t)}}(r,o):(Mr(e,\"bpmn:SequenceFlow\")||vg(r,o))&&(n=r===o?{preferredLayouts:wg(r,e)}:Mr(r,\"bpmn:BoundaryEvent\")?{preferredLayouts:Eg(r,o,c)}:yg(r)||yg(o)?function(e){return{preferredLayouts:[\"straight\",\"h:h\"],preserveDocking:fg(e)}}(r):Mr(r,\"bpmn:Gateway\")?{preferredLayouts:[\"v:h\"]}:Mr(o,\"bpmn:Gateway\")?{preferredLayouts:[\"h:v\"]}:{preferredLayouts:[\"h:h\"]}),n&&(i=sg(ng(r,o,s,c,a,n=L(n,t)))),i||[s,c])},Pg.$inject=[\"elementRegistry\",\"graphicsFactory\"],Pg.prototype.getCroppedWaypoints=function(e,t,n){t=t||e.source,n=n||e.target;var i=this.getDockingPoint(e,t,!0),r=this.getDockingPoint(e,n),o=e.waypoints.slice(i.idx+1,r.idx);return o.unshift(Rg(i)),o.push(Rg(r)),o},Pg.prototype.getDockingPoint=function(e,t,n){var i,r,o=e.waypoints;return{point:r=o[i=n?0:o.length-1],actual:this._getIntersection(t,e,n)||r,idx:i}},Pg.prototype._getIntersection=function(e,t,n){return En(this._getShapePath(e),this._getConnectionPath(t),n)},Pg.prototype._getConnectionPath=function(e){return this._graphicsFactory.getConnectionPath(e)},Pg.prototype._getShapePath=function(e){return this._graphicsFactory.getShapePath(e)},Pg.prototype._getGfx=function(e){return this._elementRegistry.getGraphics(e)};var Tg={__init__:[\"modeling\",\"bpmnUpdater\"],__depends__:[lm,Hm,Vm,qm,Pu,yv,Ev,Pv,Mv,ta,la,mv],bpmnFactory:[\"type\",Dv],bpmnUpdater:[\"type\",Bv],elementFactory:[\"type\",Ov],modeling:[\"type\",Wy],layouter:[\"type\",hg],connectionDocking:[\"type\",Pg]},kg=Math.round;function Ag(e,t,n,i,r){function o(e,t,n,i){return r.allowed(\"elements.move\",{shapes:e,delta:t,position:n,target:i})}function a(e,n,i,r){if(l(i)&&(r=i,i=!1),!n.waypoints&&n.parent&&!Se(e.target).has(\"djs-hit-no-move\")){var o=function(e){return{x:e.x+kg(e.width/2),y:e.y+kg(e.height/2)}}(n);return t.init(e,o,\"shape.move\",{cursor:\"grabbing\",autoActivate:i,data:{shape:n,context:r||{}}}),!0}}e.on(\"shape.move.start\",1500,(function(e){var t=e.context,n=e.shape,r=i.get().slice();-1===r.indexOf(n)&&(r=[n]),r=function(e){var t=R(e,\"id\");return y(e,(function(e){for(;e=e.parent;)if(t[e.id])return!1;return!0}))}(r),L(t,{shapes:r,validatedShapes:r,shape:n})})),e.on(\"shape.move.start\",1250,(function(e){var t=e.context,n=t.validatedShapes;if(!(t.canExecute=o(n)))return!1})),e.on(\"shape.move.move\",500,(function(e){var t,n=e.context,i=n.validatedShapes,r=e.hover,a={x:e.dx,y:e.dy};t=o(i,a,{x:e.x,y:e.y},r),n.delta=a,n.canExecute=t,n.target=null!==t?r:null})),e.on(\"shape.move.end\",(function(e){var t=e.context,i=t.delta,r=t.canExecute,o=\"attach\"===r,a=t.shapes;if(!1===r)return!1;i.x=kg(i.x),i.y=kg(i.y),0===i.x&&0===i.y||n.moveElements(a,i,t.target,{primaryShape:t.shape,attach:o})})),e.on(\"element.mousedown\",(function(e){if(Fo(e)){var t=jo(e);if(!t)throw new Error(\"must supply DOM mousedown event\");return a(t,e.element)}})),this.start=a}Ag.$inject=[\"eventBus\",\"dragging\",\"modeling\",\"selection\",\"rules\"];var Mg=\"djs-dragging\",Dg=\"drop-ok\",Bg=\"drop-not-ok\",Ng=\"new-parent\",Og=\"attach-ok\";function jg(e,t,n,r){function o(e){var t=function(e){var t=y(e,(function(t){return!fn(t)||m(e,A({id:t.source.id}))&&m(e,A({id:t.target.id}))}));return t}(a(e));return t}function a(e){var t=mt(e,!0),n=E(t,(function(e){return(e.incoming||[]).concat(e.outgoing||[])}));return i(t.concat(n))}function s(e,n){[Og,Dg,Bg,Ng].forEach((function(i){i===n?t.addMarker(e,i):t.removeMarker(e,i)}))}e.on(\"shape.move.start\",499,(function(e){var s=e.context,c=s.shapes,p=s.allDraggedElements,l=o(c);if(!s.dragGroup){var u=De(\"g\");we(u,n.cls(\"djs-drag-group\",[\"no-events\"])),ge(t.getActiveLayer(),u),s.dragGroup=u}l.forEach((function(e){r.addDragger(e,s.dragGroup)})),g(p=p?i([p,a(c)]):a(c),(function(e){t.addMarker(e,Mg)})),s.allDraggedElements=p,s.differentParents=1!==function(e){return S(e).length}(R(c,(function(e){return e.parent&&e.parent.id})))})),e.on(\"shape.move.move\",499,(function(e){var t=e.context,n=t.dragGroup,i=t.target,r=t.shape.parent,o=t.canExecute;i&&(\"attach\"===o?s(i,Og):t.canExecute&&i&&i.id!==r.id?s(i,Ng):s(i,t.canExecute?Dg:Bg)),ii(n,e.dx,e.dy)})),e.on([\"shape.move.out\",\"shape.move.cleanup\"],(function(e){var t=e.context.target;t&&s(t,null)})),e.on(\"shape.move.cleanup\",(function(e){var n=e.context,i=n.allDraggedElements,r=n.dragGroup;g(i,(function(e){t.removeMarker(e,Mg)})),r&&Re(r)})),this.makeDraggable=function(e,n,i){r.addDragger(n,e.dragGroup),i&&t.addMarker(n,Mg),e.allDraggedElements?e.allDraggedElements.push(n):e.allDraggedElements=[n]}}jg.$inject=[\"eventBus\",\"canvas\",\"styles\",\"previewSupport\"];var Lg={__depends__:[Uo,ta,Ko,Bp,Tp,Kl],__init__:[\"move\",\"movePreview\"],move:[\"type\",Ag],movePreview:[\"type\",jg]},Ig=\".djs-palette-toggle\",$g=\".entry\",Fg=Ig+\", \"+$g,zg=\"djs-palette-\",Hg=\"open\",Gg=\"two-column\";function Vg(e,t){this._eventBus=e,this._canvas=t;var n=this;e.on(\"tool-manager.update\",(function(e){var t=e.tool;n.updateToolHighlight(t)})),e.on(\"i18n.changed\",(function(){n._update()})),e.on(\"diagram.init\",(function(){n._diagramInitialized=!0,n._rebuild()}))}function Wg(e,t){var n=t.getPaletteEntries();return h(n)?n(e):(g(n,(function(t,n){e[n]=t})),e)}Vg.$inject=[\"eventBus\",\"canvas\"],Vg.prototype.registerProvider=function(e,t){t||(t=e,e=1e3),this._eventBus.on(\"palette.getProviders\",e,(function(e){e.providers.push(t)})),this._rebuild()},Vg.prototype.getEntries=function(){return this._getProviders().reduce(Wg,{})},Vg.prototype._rebuild=function(){this._diagramInitialized&&(this._getProviders().length&&(this._container||this._init(),this._update()))},Vg.prototype._init=function(){var e=this,t=this._eventBus,n=this._getParentContainer(),i=this._container=de(Vg.HTML_MARKUP);n.appendChild(i),X(n).add(zg+\"shown\"),pe.bind(i,Fg,\"click\",(function(t){if(J(t.delegateTarget,Ig))return e.toggle();e.trigger(\"click\",t)})),ae.bind(i,\"mousedown\",(function(e){e.stopPropagation()})),pe.bind(i,$g,\"dragstart\",(function(t){e.trigger(\"dragstart\",t)})),t.on(\"canvas.resized\",this._layoutChanged,this),t.fire(\"palette.create\",{container:i})},Vg.prototype._getProviders=function(e){var t=this._eventBus.createEvent({type:\"palette.getProviders\",providers:[]});return this._eventBus.fire(t),t.providers},Vg.prototype._toggleState=function(e){e=e||{};var t,n=this._getParentContainer(),i=this._container,r=this._eventBus,o=X(i),a=X(n);t=\"twoColumn\"in e?e.twoColumn:this._needsCollapse(n.clientHeight,this._entries||{}),o.toggle(Gg,t),a.toggle(zg+Gg,t),\"open\"in e&&(o.toggle(Hg,e.open),a.toggle(zg+Hg,e.open)),r.fire(\"palette.changed\",{twoColumn:t,open:this.isOpen()})},Vg.prototype._update=function(){var e=fe(\".djs-palette-entries\",this._container),t=this._entries=this.getEntries();Q(e),g(t,(function(t,n){var i=t.group||\"default\",r=fe(\"[data-group=\"+ma(i)+\"]\",e);r||(K(r=de('<div class=\"group\"></div>'),\"data-group\",i),e.appendChild(r));var o=t.html||(t.separator?'<hr class=\"separator\" />':'<div class=\"entry\" draggable=\"true\"></div>'),a=de(o);if(r.appendChild(a),!t.separator&&(K(a,\"data-action\",n),t.title&&K(a,\"title\",t.title),t.className&&function(e,t){var n=X(e);(p(t)?t:t.split(/\\s+/g)).forEach((function(e){n.add(e)}))}(a,t.className),t.imageUrl)){var s=de(\"<img>\");K(s,\"src\",t.imageUrl),a.appendChild(s)}})),this.open()},Vg.prototype.trigger=function(e,t,n){var i,r,o=t.delegateTarget||t.target;return o?(i=K(o,\"data-action\"),r=t.originalEvent||t,this.triggerEntry(i,e,r,n)):t.preventDefault()},Vg.prototype.triggerEntry=function(e,t,n,i){var r,o;if((r=this._entries[e])&&(o=r.action,!1!==this._eventBus.fire(\"palette.trigger\",{entry:r,event:n}))){if(h(o)){if(\"click\"===t)return o(n,i)}else if(o[t])return o[t](n,i);n.preventDefault()}},Vg.prototype._layoutChanged=function(){this._toggleState({})},Vg.prototype._needsCollapse=function(e,t){return e<46*Object.keys(t).length+50},Vg.prototype.close=function(){this._toggleState({open:!1,twoColumn:!1})},Vg.prototype.open=function(){this._toggleState({open:!0})},Vg.prototype.toggle=function(){this.isOpen()?this.close():this.open()},Vg.prototype.isActiveTool=function(e){return e&&this._activeTool===e},Vg.prototype.updateToolHighlight=function(e){var t;this._toolsContainer||(t=fe(\".djs-palette-entries\",this._container),this._toolsContainer=fe(\"[data-group=tools]\",t)),g(this._toolsContainer.children,(function(t){var n=t.getAttribute(\"data-action\");if(n){var i=X(t);n=n.replace(\"-tool\",\"\"),i.contains(\"entry\")&&n===e?i.add(\"highlighted-entry\"):i.remove(\"highlighted-entry\")}}))},Vg.prototype.isOpen=function(){return X(this._container).has(Hg)},Vg.prototype._getParentContainer=function(){return this._canvas.getContainer()},Vg.HTML_MARKUP='<div class=\"djs-palette\"><div class=\"djs-palette-entries\"></div><div class=\"djs-palette-toggle\"></div></div>';var Ug={__init__:[\"palette\"],palette:[\"type\",Vg]},qg=\"crosshair\";function Kg(e,t,n,i,r,o,a){this._selection=r,this._dragging=n,this._mouse=a;var s=this,c=function(e){var n,i=t.getActiveLayer();we(n=e.frame=De(\"rect\"),{class:\"djs-lasso-overlay\",width:1,height:1,x:0,y:0}),ge(i,n)},p=function(e){var t=e.frame,n=e.bbox;we(t,{x:n.x,y:n.y,width:n.width,height:n.height})},l=function(e){e.frame&&Re(e.frame)};o.registerTool(\"lasso\",{tool:\"lasso.selection\",dragging:\"lasso\"}),e.on(\"lasso.selection.end\",(function(t){var n=t.originalEvent.target;(t.hover||n instanceof SVGElement)&&e.once(\"lasso.selection.ended\",(function(){s.activateLasso(t.originalEvent,!0)}))})),e.on(\"lasso.end\",(function(e){var t=Yg(e),n=i.filter((function(e){return e}));s.select(n,t)})),e.on(\"lasso.start\",(function(e){var t=e.context;t.bbox=Yg(e),c(t)})),e.on(\"lasso.move\",(function(e){var t=e.context;t.bbox=Yg(e),p(t)})),e.on(\"lasso.cleanup\",(function(e){var t=e.context;l(t)})),e.on(\"element.mousedown\",1500,(function(e){if(Ho(e))return s.activateLasso(e.originalEvent),!0}))}function Yg(e){var t={x:e.x-e.dx,y:e.y-e.dy},n={x:e.x,y:e.y};return t.x<=n.x&&t.y<n.y||t.x<n.x&&t.y<=n.y?{x:t.x,y:t.y,width:n.x-t.x,height:n.y-t.y}:t.x>=n.x&&t.y<n.y||t.x>n.x&&t.y<=n.y?{x:n.x,y:t.y,width:t.x-n.x,height:n.y-t.y}:t.x<=n.x&&t.y>n.y||t.x<n.x&&t.y>=n.y?{x:t.x,y:n.y,width:n.x-t.x,height:t.y-n.y}:t.x>=n.x&&t.y>n.y||t.x>n.x&&t.y>=n.y?{x:n.x,y:n.y,width:t.x-n.x,height:t.y-n.y}:{x:n.x,y:n.y,width:0,height:0}}Kg.$inject=[\"eventBus\",\"canvas\",\"dragging\",\"elementRegistry\",\"selection\",\"toolManager\",\"mouse\"],Kg.prototype.activateLasso=function(e,t){this._dragging.init(e,\"lasso\",{autoActivate:t,cursor:qg,data:{context:{}}})},Kg.prototype.activateSelection=function(e,t){this._dragging.init(e,\"lasso.selection\",{trapClick:!1,autoActivate:t,cursor:qg,data:{context:{}}})},Kg.prototype.select=function(e,t){var n=function(e,t){var n={};return g(e,(function(e){var i=e;i.waypoints&&(i=vt(i)),!u(t.y)&&i.x>t.x&&(n[e.id]=e),!u(t.x)&&i.y>t.y&&(n[e.id]=e),i.x>t.x&&i.y>t.y&&(u(t.width)&&u(t.height)&&i.width+i.x<t.width+t.x&&i.height+i.y<t.height+t.y?n[e.id]=e:u(t.width)&&u(t.height)||(n[e.id]=e))})),n}(e,t);this._selection.select(C(n))},Kg.prototype.toggle=function(){if(this.isActive())return this._dragging.cancel();var e=this._mouse.getLastMoveEvent();this.activateSelection(e,!!e)},Kg.prototype.isActive=function(){var e=this._dragging.context();return e&&/^lasso/.test(e.prefix)};var Xg={__depends__:[Ym,cu],__init__:[\"lassoTool\"],lassoTool:[\"type\",Kg]},Zg=1500,Qg=\"grab\";function Jg(e,t,n,i,r,o){this._dragging=n,this._mouse=o;var a=this,s=i.get(\"keyboard\",!1);r.registerTool(\"hand\",{tool:\"hand\",dragging:\"hand.move\"}),e.on(\"element.mousedown\",Zg,(function(e){if(zo(e))return a.activateMove(e.originalEvent,!0),!1})),s&&s.addListener(Zg,(function(e){if(eb(e.keyEvent)&&!a.isActive()){var t=a._mouse.getLastMoveEvent();a.activateMove(t,!!t)}}),\"keyboard.keydown\"),s&&s.addListener(Zg,(function(e){eb(e.keyEvent)&&a.isActive()&&a.toggle()}),\"keyboard.keyup\"),e.on(\"hand.end\",(function(t){var n=t.originalEvent.target;if(!(t.hover||n instanceof SVGElement))return!1;e.once(\"hand.ended\",(function(){a.activateMove(t.originalEvent,{reactivate:!0})}))})),e.on(\"hand.move.move\",(function(e){var n=t.viewbox().scale;t.scroll({dx:e.dx*n,dy:e.dy*n})})),e.on(\"hand.move.end\",(function(t){var n=t.context.reactivate;return!zo(t)&&n&&e.once(\"hand.move.ended\",(function(e){a.activateHand(e.originalEvent,!0,!0)})),!1}))}function eb(e){return Fa(\"Space\",e)}Jg.$inject=[\"eventBus\",\"canvas\",\"dragging\",\"injector\",\"toolManager\",\"mouse\"],Jg.prototype.activateMove=function(e,t,n){\"object\"==typeof t&&(n=t,t=!1),this._dragging.init(e,\"hand.move\",{autoActivate:t,cursor:Qg,data:{context:n||{}}})},Jg.prototype.activateHand=function(e,t,n){this._dragging.init(e,\"hand\",{trapClick:!1,autoActivate:t,cursor:Qg,data:{context:{reactivate:n}}})},Jg.prototype.toggle=function(){if(this.isActive())return this._dragging.cancel();var e=this._mouse.getLastMoveEvent();this.activateHand(e,!!e)},Jg.prototype.isActive=function(){var e=this._dragging.context();return!!e&&/^(hand|hand\\.move)$/.test(e.prefix)};var tb={__depends__:[Ym,cu],__init__:[\"handTool\"],handTool:[\"type\",Jg]},nb=\"connect-ok\",ib=\"connect-not-ok\";function rb(e,t,n,i,r,o,a){var s=this;this._dragging=t,this._rules=o,this._mouse=a,r.registerTool(\"global-connect\",{tool:\"global-connect\",dragging:\"global-connect.drag\"}),e.on(\"global-connect.hover\",(function(e){var t=e.context,n=e.hover,r=t.canStartConnect=s.canStartConnect(n);null!==r&&(t.startTarget=n,i.addMarker(n,r?nb:ib))})),e.on([\"global-connect.out\",\"global-connect.cleanup\"],(function(e){var t=e.context.startTarget,n=e.context.canStartConnect;t&&i.removeMarker(t,n?nb:ib)})),e.on([\"global-connect.ended\"],(function(t){var i=t.context.startTarget,r={x:t.x,y:t.y};if(s.canStartConnect(i))return e.once(\"element.out\",(function(){e.once([\"connect.ended\",\"connect.canceled\"],(function(){e.fire(\"global-connect.drag.ended\")})),n.start(null,i,r)})),!1}))}rb.$inject=[\"eventBus\",\"dragging\",\"connect\",\"canvas\",\"toolManager\",\"rules\",\"mouse\"],rb.prototype.start=function(e,t){this._dragging.init(e,\"global-connect\",{autoActivate:t,trapClick:!1,data:{context:{}}})},rb.prototype.toggle=function(){if(this.isActive())return this._dragging.cancel();var e=this._mouse.getLastMoveEvent();return this.start(e,!!e)},rb.prototype.isActive=function(){var e=this._dragging.context();return e&&/^global-connect/.test(e.prefix)},rb.prototype.canStartConnect=function(e){return this._rules.allowed(\"connection.start\",{source:e})};var ob={__depends__:[Ol,Bp,Tp,Ym,cu],globalConnect:[\"type\",rb]};function ab(e,t,n,i,r,o,a,s){this._palette=e,this._create=t,this._elementFactory=n,this._spaceTool=i,this._lassoTool=r,this._handTool=o,this._globalConnect=a,this._translate=s,e.registerProvider(this)}ab.$inject=[\"palette\",\"create\",\"elementFactory\",\"spaceTool\",\"lassoTool\",\"handTool\",\"globalConnect\",\"translate\"],ab.prototype.getPaletteEntries=function(){var e={},t=this._create,n=this._elementFactory,i=this._spaceTool,r=this._lassoTool,o=this._handTool,a=this._globalConnect,s=this._translate;function c(e,i,r,o,a){function c(i){var r=n.createShape(L({type:e},a));a&&(Nr(r).isExpanded=a.isExpanded);t.start(i,r)}var p=e.replace(/^bpmn:/,\"\");return{group:i,className:r,title:o||s(\"Create {type}\",{type:p}),action:{dragstart:c,click:c}}}function p(e){var i=n.createShape({type:\"bpmn:SubProcess\",x:0,y:0,isExpanded:!0}),r=n.createShape({type:\"bpmn:StartEvent\",x:40,y:82,parent:i});t.start(e,[i,r],{hints:{autoSelect:[i]}})}function l(e){t.start(e,n.createParticipantShape())}return L(e,{\"hand-tool\":{group:\"tools\",className:\"bpmn-icon-hand-tool\",title:s(\"Activate the hand tool\"),action:{click:function(e){o.activateHand(e)}}},\"lasso-tool\":{group:\"tools\",className:\"bpmn-icon-lasso-tool\",title:s(\"Activate the lasso tool\"),action:{click:function(e){r.activateSelection(e)}}},\"space-tool\":{group:\"tools\",className:\"bpmn-icon-space-tool\",title:s(\"Activate the create/remove space tool\"),action:{click:function(e){i.activateSelection(e)}}},\"global-connect-tool\":{group:\"tools\",className:\"bpmn-icon-connection-multi\",title:s(\"Activate the global connect tool\"),action:{click:function(e){a.start(e)}}},\"tool-separator\":{group:\"tools\",separator:!0},\"create.start-event\":c(\"bpmn:StartEvent\",\"event\",\"bpmn-icon-start-event-none\",s(\"Create StartEvent\")),\"create.intermediate-event\":c(\"bpmn:IntermediateThrowEvent\",\"event\",\"bpmn-icon-intermediate-event-none\",s(\"Create Intermediate/Boundary Event\")),\"create.end-event\":c(\"bpmn:EndEvent\",\"event\",\"bpmn-icon-end-event-none\",s(\"Create EndEvent\")),\"create.exclusive-gateway\":c(\"bpmn:ExclusiveGateway\",\"gateway\",\"bpmn-icon-gateway-none\",s(\"Create Gateway\")),\"create.task\":c(\"bpmn:Task\",\"activity\",\"bpmn-icon-task\",s(\"Create Task\")),\"create.data-object\":c(\"bpmn:DataObjectReference\",\"data-object\",\"bpmn-icon-data-object\",s(\"Create DataObjectReference\")),\"create.data-store\":c(\"bpmn:DataStoreReference\",\"data-store\",\"bpmn-icon-data-store\",s(\"Create DataStoreReference\")),\"create.subprocess-expanded\":{group:\"activity\",className:\"bpmn-icon-subprocess-expanded\",title:s(\"Create expanded SubProcess\"),action:{dragstart:p,click:p}},\"create.participant-expanded\":{group:\"collaboration\",className:\"bpmn-icon-participant\",title:s(\"Create Pool/Participant\"),action:{dragstart:l,click:l}},\"create.group\":c(\"bpmn:Group\",\"artifact\",\"bpmn-icon-group\",s(\"Create Group\"))}),e};var sb={__depends__:[Ug,ru,mv,Xg,tb,ob,ko],__init__:[\"paletteProvider\"],paletteProvider:[\"type\",ab]};function cb(e,t,n,i,r){ua.call(this,e),e.on(\"shape.move.move\",250,(function(e){var o=e.context,a=o.canExecute;o.visualReplacements||(o.visualReplacements={}),a&&a.replacements?function(e){g(e.canExecute.replacements,(function(o){var a=o.oldElementId,s={type:o.newElementType};if(!e.visualReplacements[a]){var c=t.get(a);L(s,{x:c.x,y:c.y});var p=n.createShape(s);i.addShape(p,c.parent);var l=fe('[data-element-id=\"'+ma(c.id)+'\"]',e.dragGroup);l&&we(l,{display:\"none\"});var u=r.addDragger(p,e.dragGroup);e.visualReplacements[a]=u,i.removeShape(p)}}))}(o):function(e){var t=e.visualReplacements;g(t,(function(n,i){var r=fe('[data-element-id=\"'+ma(i)+'\"]',e.dragGroup);r&&we(r,{display:\"inline\"}),n.remove(),t[i]&&delete t[i]}))}(o)}))}cb.$inject=[\"eventBus\",\"elementRegistry\",\"elementFactory\",\"canvas\",\"previewSupport\"],e(cb,ua);var pb={__depends__:[Kl],__init__:[\"bpmnReplacePreview\"],bpmnReplacePreview:[\"type\",cb]},lb=40,ub=20,hb=10,db=20,fb=[\"x\",\"y\"],mb=Math.abs;function vb(e){e.on([\"connect.hover\",\"connect.move\",\"connect.end\"],1250,(function(e){var t=e.context,n=t.canExecute,i=t.start,r=t.hover,o=t.source,a=t.target;e.originalEvent&&$a(e.originalEvent)||(t.initialConnectionStart||(t.initialConnectionStart=t.connectionStart),n&&r&&function(e,t,n){fb.forEach((function(i){var r=bb(i,t);e[i]<t[i]+n?Sl(e,i,t[i]+n):e[i]>t[i]+r-n&&Sl(e,i,t[i]+r-n)}))}(e,r,function(e){return Mr(e,\"bpmn:Task\")?hb:ub}(r)),r&&function(e,t){return w(t,(function(t){return gb(e,t)}))}(n,[\"bpmn:Association\",\"bpmn:DataInputAssociation\",\"bpmn:DataOutputAssociation\",\"bpmn:SequenceFlow\"])?(t.connectionStart=wl(i),Dr(r,[\"bpmn:Event\",\"bpmn:Gateway\"])&&yb(e,wl(r)),Dr(r,[\"bpmn:Task\",\"bpmn:SubProcess\"])&&function(e,t){var n=wl(t);fb.forEach((function(i){(function(e,t,n){return e[n]>t[n]+db&&e[n]<t[n]+bb(n,t)-db})(e,t,i)&&Sl(e,i,n[i])}))}(e,r),Mr(o,\"bpmn:BoundaryEvent\")&&a===o.host&&function(e){var t=e.context,n=t.source,i=t.target;if(function(e){var t=e.hover,n=e.source;return t&&n&&t===n}(t))return;var r=wl(n),o=wn(r,i,-10),a=[];/top|bottom/.test(o)&&a.push(\"x\");/left|right/.test(o)&&a.push(\"y\");a.forEach((function(t){var n,i=e[t];mb(i-r[t])<lb&&(n=i>r[t]?r[t]+lb:r[t]-lb,Sl(e,t,n))}))}(e)):gb(n,\"bpmn:MessageFlow\")?(Mr(i,\"bpmn:Event\")&&(t.connectionStart=wl(i)),Mr(r,\"bpmn:Event\")&&yb(e,wl(r))):t.connectionStart=t.initialConnectionStart)}))}function yb(e,t){Sl(e,\"x\",t.x),Sl(e,\"y\",t.y)}function gb(e,t){return e&&e.type===t}function bb(e,t){return\"x\"===e?t.width:t.height}function xb(){this._targets={},this._snapOrigins={},this._snapLocations=[],this._defaultSnaps={}}function _b(){this._snapValues={}}vb.$inject=[\"eventBus\"],xb.prototype.getSnapOrigin=function(e){return this._snapOrigins[e]},xb.prototype.setSnapOrigin=function(e,t){this._snapOrigins[e]=t,-1===this._snapLocations.indexOf(e)&&this._snapLocations.push(e)},xb.prototype.addDefaultSnap=function(e,t){var n=this._defaultSnaps[e];n||(n=this._defaultSnaps[e]=[]),n.push(t)},xb.prototype.getSnapLocations=function(){return this._snapLocations},xb.prototype.setSnapLocations=function(e){this._snapLocations=e},xb.prototype.pointsForTarget=function(e){var t=e.id||e,n=this._targets[t];return n||(n=this._targets[t]=new _b).initDefaults(this._defaultSnaps),n},_b.prototype.add=function(e,t){var n=this._snapValues[e];n||(n=this._snapValues[e]={x:[],y:[]}),-1===n.x.indexOf(t.x)&&n.x.push(t.x),-1===n.y.indexOf(t.y)&&n.y.push(t.y)},_b.prototype.snap=function(e,t,n,i){var r=this._snapValues[t];return r&&function(e,t,n){var i,r;for(n=void 0===n?10:n,i=0;i<t.length;i++)if(r=t[i],gl(r-e)<=n)return r}(e[n],r[n],i)},_b.prototype.initDefaults=function(e){var t=this;g(e||{},(function(e,n){g(e,(function(e){t.add(n,e)}))}))};var wb=1250;function Eb(e,t,n){var i=this;this._elementRegistry=e,t.on([\"create.start\",\"shape.move.start\"],(function(e){i.initSnap(e)})),t.on([\"create.move\",\"create.end\",\"shape.move.move\",\"shape.move.end\"],wb,(function(e){var t=e.context,r=t.shape,o=t.snapContext,a=t.target;if((!e.originalEvent||!$a(e.originalEvent))&&!El(e)&&a){var s=o.pointsForTarget(a);s.initialized||((s=i.addSnapTargetPoints(s,r,a)).initialized=!0),n.snap(e,s)}})),t.on([\"create.cleanup\",\"shape.move.cleanup\"],(function(){n.hide()}))}Eb.$inject=[\"elementRegistry\",\"eventBus\",\"snapping\"],Eb.prototype.initSnap=function(e){var t,n=this._elementRegistry,i=e.context,r=i.shape,o=i.snapContext;o||(o=i.snapContext=new xb);var a=(t=n.get(r.id)?wl(r,e):{x:e.x+wl(r).x,y:e.y+wl(r).y}).x-r.width/2,s=t.y-r.height/2,c=t.x+r.width/2,p=t.y+r.height/2;return o.setSnapOrigin(\"mid\",{x:t.x-e.x,y:t.y-e.y}),mn(r)||(o.setSnapOrigin(\"top-left\",{x:a-e.x,y:s-e.y}),o.setSnapOrigin(\"bottom-right\",{x:c-e.x,y:p-e.y})),o},Eb.prototype.addSnapTargetPoints=function(e,t,n){return g(this.getSnapTargets(t,n),(function(n){if(mn(n))mn(t)&&e.add(\"mid\",wl(n));else if(fn(n)){if(n.waypoints.length<3)return;g(n.waypoints.slice(1,-1),(function(t){e.add(\"mid\",t)}))}else e.add(\"mid\",wl(n))})),u(t.x)&&u(t.y)?(this._elementRegistry.get(t.id)&&e.add(\"mid\",wl(t)),e):e},Eb.prototype.getSnapTargets=function(e,t){return Cl(t).filter((function(e){return!e.hidden}))};function Sb(e,t){t.invoke(Eb,this),e.on([\"create.move\",\"create.end\"],1500,Cb),e.on([\"create.move\",\"create.end\",\"shape.move.move\",\"shape.move.end\"],1500,(function(e){var t=e.context,n=t.canExecute,i=t.target;n&&(\"attach\"===n||n.attach)&&!El(e)&&function(e,t){var n,i=gn(t),r=um(e,t),o=e.context,a=o.shape;n=a.parent?{x:0,y:0}:_n(a);/top/.test(r)?Sl(e,\"y\",i.top-n.y):/bottom/.test(r)&&Sl(e,\"y\",i.bottom-n.y);/left/.test(r)?Sl(e,\"x\",i.left-n.x):/right/.test(r)&&Sl(e,\"x\",i.right-n.x)}(e,i)}))}function Cb(e){var t=e.context.createConstraints;if(t){var n=t.top,i=t.right,r=t.bottom,o=t.left;(o&&o>=e.x||i&&i<=e.x)&&Sl(e,\"x\",e.x),(n&&n>=e.y||r&&r<=e.y)&&Sl(e,\"y\",e.y)}}function Rb(e,t){return-1!==e.indexOf(t)}function Pb(e,t,n){return t?{x:e.x-n.x,y:e.y-n.y}:{x:e.x,y:e.y}}e(Sb,Eb),Sb.$inject=[\"eventBus\",\"injector\"],Sb.prototype.initSnap=function(e){var t=Eb.prototype.initSnap.call(this,e),n=e.shape,i=!!this._elementRegistry.get(n.id);return g(n.outgoing,(function(n){var r=n.waypoints[0];r=r.original||r,t.setSnapOrigin(n.id+\"-docking\",Pb(r,i,e))})),g(n.incoming,(function(n){var r=n.waypoints[n.waypoints.length-1];r=r.original||r,t.setSnapOrigin(n.id+\"-docking\",Pb(r,i,e))})),Mr(n,\"bpmn:Participant\")&&t.setSnapLocations([\"top-left\",\"bottom-right\",\"mid\"]),t},Sb.prototype.addSnapTargetPoints=function(e,t,n){Eb.prototype.addSnapTargetPoints.call(this,e,t,n);var i=this.getSnapTargets(t,n);g(i,(function(n){var i;(function(e){if(Mr(e,\"bpmn:SubProcess\")&&Zr(e))return!0;return Mr(e,\"bpmn:Participant\")}(n)||(i=\"bpmn:TextAnnotation\",[t,n].every((function(e){return Mr(e,i)}))))&&(e.add(\"top-left\",xl(n)),e.add(\"bottom-right\",_l(n)))}));var r=this._elementRegistry;return g(t.incoming,(function(n){if(r.get(t.id)){Rb(i,n.source)||e.add(\"mid\",_n(n.source));var o=n.waypoints[0];e.add(n.id+\"-docking\",o.original||o)}})),g(t.outgoing,(function(n){if(r.get(t.id)){Rb(i,n.target)||e.add(\"mid\",_n(n.target));var o=n.waypoints[n.waypoints.length-1];e.add(n.id+\"-docking\",o.original||o)}})),Mr(n,\"bpmn:SequenceFlow\")&&(e=this.addSnapTargetPoints(e,t,n.parent)),e},Sb.prototype.getSnapTargets=function(e,t){return Eb.prototype.getSnapTargets.call(this,e,t).filter((function(e){return!Mr(e,\"bpmn:Lane\")}))};function Tb(e,t){var n=this;e.on([\"resize.start\"],(function(e){n.initSnap(e)})),e.on([\"resize.move\",\"resize.end\"],1250,(function(e){var i=e.context,r=i.shape,o=r.parent,a=i.direction,s=i.snapContext;if(!(e.originalEvent&&$a(e.originalEvent)||El(e))){var c=s.pointsForTarget(o);c.initialized||((c=n.addSnapTargetPoints(c,r,o,a)).initialized=!0),function(e){return\"n\"===e||\"s\"===e}(a)&&Sl(e,\"x\",e.x),function(e){return\"e\"===e||\"w\"===e}(a)&&Sl(e,\"y\",e.y),t.snap(e,c)}})),e.on([\"resize.cleanup\"],(function(){t.hide()}))}function kb(e,t){var n=_n(e),i=gn(e),r={x:n.x,y:n.y};return-1!==t.indexOf(\"n\")?r.y=i.top:-1!==t.indexOf(\"s\")&&(r.y=i.bottom),-1!==t.indexOf(\"e\")?r.x=i.right:-1!==t.indexOf(\"w\")&&(r.x=i.left),r}Tb.prototype.initSnap=function(e){var t=e.context,n=t.shape,i=t.direction,r=t.snapContext;r||(r=t.snapContext=new xb);var o=kb(n,i);return r.setSnapOrigin(\"corner\",{x:o.x-e.x,y:o.y-e.y}),r},Tb.prototype.addSnapTargetPoints=function(e,t,n,i){return g(this.getSnapTargets(t,n),(function(t){e.add(\"corner\",_l(t)),e.add(\"corner\",xl(t))})),e.add(\"corner\",kb(t,i)),e},Tb.$inject=[\"eventBus\",\"snapping\"],Tb.prototype.getSnapTargets=function(e,t){return Cl(t).filter((function(t){return!(n=t,i=e,n.host===i||fn(t)||function(e){return!!e.hidden}(t)||mn(t));var n,i}))};function Ab(e){this._canvas=e,this._asyncHide=O(j(this.hide,this),1e3)}Ab.$inject=[\"canvas\"],Ab.prototype.snap=function(e,t){var n=e.context.snapContext,i=n.getSnapLocations(),r={x:El(e,\"x\"),y:El(e,\"y\")};g(i,(function(i){var o=n.getSnapOrigin(i),a={x:e.x+o.x,y:e.y+o.y};if(g([\"x\",\"y\"],(function(e){var n;r[e]||void 0!==(n=t.snap(a,i,e,7))&&(r[e]={value:n,originValue:n-o[e]})})),r.x&&r.y)return!1})),this.showSnapLine(\"vertical\",r.x&&r.x.value),this.showSnapLine(\"horizontal\",r.y&&r.y.value),g([\"x\",\"y\"],(function(t){var n=r[t];l(n)&&Sl(e,t,n.originValue)}))},Ab.prototype._createLine=function(e){var t=this._canvas.getLayer(\"snap\"),n=De(\"path\");return we(n,{d:\"M0,0 L0,0\"}),Se(n).add(\"djs-snap-line\"),ge(t,n),{update:function(t){u(t)?we(n,\"horizontal\"===e?{d:\"M-100000,\"+t+\" L+100000,\"+t,display:\"\"}:{d:\"M \"+t+\",-100000 L \"+t+\", +100000\",display:\"\"}):we(n,{display:\"none\"})}}},Ab.prototype._createSnapLines=function(){this._snapLines={horizontal:this._createLine(\"horizontal\"),vertical:this._createLine(\"vertical\")}},Ab.prototype.showSnapLine=function(e,t){var n=this.getSnapLine(e);n&&n.update(t),this._asyncHide()},Ab.prototype.getSnapLine=function(e){return this._snapLines||this._createSnapLines(),this._snapLines[e]},Ab.prototype.hide=function(){g(this._snapLines,(function(e){e.update()}))};var Mb={__depends__:[{__init__:[\"createMoveSnapping\",\"resizeSnapping\",\"snapping\"],createMoveSnapping:[\"type\",Eb],resizeSnapping:[\"type\",Tb],snapping:[\"type\",Ab]}],__init__:[\"connectSnapping\",\"createMoveSnapping\"],connectSnapping:[\"type\",vb],createMoveSnapping:[\"type\",Sb]};function Db(e,t,n,i){this._open=!1,this._results=[],this._eventMaps=[],this._canvas=e,this._eventBus=t,this._overlays=n,this._selection=i,this._container=de(Db.BOX_HTML),this._searchInput=fe(Db.INPUT_SELECTOR,this._container),this._resultsContainer=fe(Db.RESULTS_CONTAINER_SELECTOR,this._container),this._canvas.getContainer().appendChild(this._container),t.on([\"canvas.destroy\",\"diagram.destroy\"],this.close,this)}function Bb(e,t,n){var i=function(e){var t=\"\";return e.forEach((function(e){e.matched?t+='<strong class=\"'+Db.RESULT_HIGHLIGHT_CLASS+'\">'+ya(e.matched)+\"</strong>\":t+=ya(e.normal)})),\"\"!==t?t:null}(t),r=de(n);r.innerHTML=i,e.appendChild(r)}Db.$inject=[\"canvas\",\"eventBus\",\"overlays\",\"selection\"],Db.prototype._bindEvents=function(){var e=this;function t(t,n,i,r){e._eventMaps.push({el:t,type:i,listener:pe.bind(t,n,i,r)})}t(document,\"html\",\"click\",(function(t){e.close()})),t(this._container,Db.INPUT_SELECTOR,\"click\",(function(e){e.stopPropagation(),e.delegateTarget.focus()})),t(this._container,Db.RESULT_SELECTOR,\"mouseover\",(function(t){t.stopPropagation(),e._scrollToNode(t.delegateTarget),e._preselect(t.delegateTarget)})),t(this._container,Db.RESULT_SELECTOR,\"click\",(function(t){t.stopPropagation(),e._select(t.delegateTarget)})),t(this._container,Db.INPUT_SELECTOR,\"keydown\",(function(e){Fa(\"ArrowUp\",e)&&e.preventDefault(),Fa(\"ArrowDown\",e)&&e.preventDefault()})),t(this._container,Db.INPUT_SELECTOR,\"keyup\",(function(t){if(Fa(\"Escape\",t))return e.close();if(Fa(\"Enter\",t)){var n=e._getCurrentResult();return n?e._select(n):e.close()}return Fa(\"ArrowUp\",t)?e._scrollToDirection(!0):Fa(\"ArrowDown\",t)?e._scrollToDirection():void(Fa([\"ArrowLeft\",\"ArrowRight\"],t)||e._search(t.delegateTarget.value))}))},Db.prototype._unbindEvents=function(){this._eventMaps.forEach((function(e){pe.unbind(e.el,e.type,e.listener)}))},Db.prototype._search=function(e){var t=this;if(this._clearResults(),e&&\"\"!==e){var n=this._searchProvider.find(e);if(n.length){n.forEach((function(e){var n=e.element.id,i=t._createResultNode(e,n);t._results[n]={element:e.element,node:i}}));var i=fe(Db.RESULT_SELECTOR,this._resultsContainer);this._scrollToNode(i),this._preselect(i)}}},Db.prototype._scrollToDirection=function(e){var t=this._getCurrentResult();if(t){var n=e?t.previousElementSibling:t.nextElementSibling;n&&(this._scrollToNode(n),this._preselect(n))}},Db.prototype._scrollToNode=function(e){if(e&&e!==this._getCurrentResult()){var t=e.offsetTop,n=this._resultsContainer.scrollTop,i=t-this._resultsContainer.clientHeight+e.clientHeight;t<n?this._resultsContainer.scrollTop=t:n<i&&(this._resultsContainer.scrollTop=i)}},Db.prototype._clearResults=function(){Q(this._resultsContainer),this._results=[],this._resetOverlay(),this._eventBus.fire(\"searchPad.cleared\")},Db.prototype._getCurrentResult=function(){return fe(Db.RESULT_SELECTED_SELECTOR,this._resultsContainer)},Db.prototype._createResultNode=function(e,t){var n=de(Db.RESULT_HTML);return e.primaryTokens.length>0&&Bb(n,e.primaryTokens,Db.RESULT_PRIMARY_HTML),Bb(n,e.secondaryTokens,Db.RESULT_SECONDARY_HTML),K(n,Db.RESULT_ID_ATTRIBUTE,t),this._resultsContainer.appendChild(n),n},Db.prototype.registerProvider=function(e){this._searchProvider=e},Db.prototype.open=function(){if(!this._searchProvider)throw new Error(\"no search provider registered\");this.isOpen()||(this._bindEvents(),this._open=!0,X(this._container).add(\"open\"),this._searchInput.focus(),this._eventBus.fire(\"searchPad.opened\"))},Db.prototype.close=function(){this.isOpen()&&(this._unbindEvents(),this._open=!1,X(this._container).remove(\"open\"),this._clearResults(),this._searchInput.value=\"\",this._searchInput.blur(),this._resetOverlay(),this._eventBus.fire(\"searchPad.closed\"))},Db.prototype.toggle=function(){this.isOpen()?this.close():this.open()},Db.prototype.isOpen=function(){return this._open},Db.prototype._preselect=function(e){var t=this._getCurrentResult();if(e!==t){t&&X(t).remove(Db.RESULT_SELECTED_CLASS);var n=K(e,Db.RESULT_ID_ATTRIBUTE),i=this._results[n].element;X(e).add(Db.RESULT_SELECTED_CLASS),this._resetOverlay(i),this._canvas.scrollToElement(i,{top:400}),this._selection.select(i),this._eventBus.fire(\"searchPad.preselected\",i)}},Db.prototype._select=function(e){var t=K(e,Db.RESULT_ID_ATTRIBUTE),n=this._results[t].element;this.close(),this._resetOverlay(),this._canvas.scrollToElement(n,{top:400}),this._selection.select(n),this._eventBus.fire(\"searchPad.selected\",n)},Db.prototype._resetOverlay=function(e){if(this._overlayId&&this._overlays.remove(this._overlayId),e){var t=function(e){var t=6,n=e.width+2*t,i=e.height+2*t,r={width:n+\"px\",height:i+\"px\"},o=de('<div class=\"'+Db.OVERLAY_CLASS+'\"></div>');return q(o,r),{position:{bottom:i-t,right:n-t},show:!0,html:o}}(vt(e));this._overlayId=this._overlays.add(e,t)}},Db.CONTAINER_SELECTOR=\".djs-search-container\",Db.INPUT_SELECTOR=\".djs-search-input input\",Db.RESULTS_CONTAINER_SELECTOR=\".djs-search-results\",Db.RESULT_SELECTOR=\".djs-search-result\",Db.RESULT_SELECTED_CLASS=\"djs-search-result-selected\",Db.RESULT_SELECTED_SELECTOR=\".\"+Db.RESULT_SELECTED_CLASS,Db.RESULT_ID_ATTRIBUTE=\"data-result-id\",Db.RESULT_HIGHLIGHT_CLASS=\"djs-search-highlight\",Db.OVERLAY_CLASS=\"djs-search-overlay\",Db.BOX_HTML='<div class=\"djs-search-container djs-draggable djs-scrollable\"><div class=\"djs-search-input\"><input type=\"text\"/></div><div class=\"djs-search-results\"></div></div>',Db.RESULT_HTML='<div class=\"djs-search-result\"></div>',Db.RESULT_PRIMARY_HTML='<div class=\"djs-search-result-primary\"></div>',Db.RESULT_SECONDARY_HTML='<p class=\"djs-search-result-secondary\"></p>';var Nb={__depends__:[ca,ta],searchPad:[\"type\",Db]};function Ob(e,t,n){this._elementRegistry=e,this._canvas=n,t.registerProvider(this)}function jb(e){return y(e,(function(e){return!!e.matched})).length>0}function Lb(e,t){var n=[],i=e;if(!e)return n;e=e.toLowerCase(),t=t.toLowerCase();var r=e.indexOf(t);return r>-1?(0!==r&&n.push({normal:i.substr(0,r)}),n.push({matched:i.substr(r,t.length)}),t.length+r<e.length&&n.push({normal:i.substr(t.length+r,e.length)})):n.push({normal:i}),n}Ob.$inject=[\"elementRegistry\",\"searchPad\",\"canvas\"],Ob.prototype.find=function(e){var t=this._canvas.getRootElement(),n=this._elementRegistry.filter((function(e){return!e.labelTarget}));return n=y(n,(function(e){return e!==t})),n=k(n=y(n=E(n,(function(t){return{primaryTokens:Lb(so(t),e),secondaryTokens:Lb(t.id,e),element:t}})),(function(e){return jb(e.primaryTokens)||jb(e.secondaryTokens)})),(function(e){return so(e.element)+e.element.id}))};var Ib={__depends__:[Nb],__init__:[\"bpmnSearch\"],bpmnSearch:[\"type\",Ob]};function $b(e){Xr.call(this,e)}return e($b,Xr),$b.Viewer=Na,$b.NavigatedViewer=hs,$b.prototype.createDiagram=function(){return this.importXML('<?xml version=\"1.0\" encoding=\"UTF-8\"?><bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" targetNamespace=\"http://bpmn.io/schema/bpmn\" id=\"Definitions_1\"><bpmn:process id=\"Process_1\" isExecutable=\"false\"><bpmn:startEvent id=\"StartEvent_1\"/></bpmn:process><bpmndi:BPMNDiagram id=\"BPMNDiagram_1\"><bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\"><bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\"><dc:Bounds height=\"36.0\" width=\"36.0\" x=\"173.0\" y=\"102.0\"/></bpmndi:BPMNShape></bpmndi:BPMNPlane></bpmndi:BPMNDiagram></bpmn:definitions>')},$b.prototype.createDiagram=Rr($b.prototype.createDiagram),$b.prototype._interactionModules=[Xa,os,_s,us],$b.prototype._modelingModules=[ep,vp,Mp,_p,kl,Ol,Ll,ph,gu,ru,vh,wh,jh,Ih,Fh,Kh,hd,Tg,Lg,sb,pb,od,Mb,Ib],$b.prototype._modules=[].concat(Na.prototype._modules,$b.prototype._interactionModules,$b.prototype._modelingModules),$b}));\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bpmnjs/bpmn-navigated-viewer.development.js",
    "content": "/*!\n * bpmn-js - bpmn-navigated-viewer v13.2.1\n *\n * Copyright (c) 2014-present, camunda Services GmbH\n *\n * Released under the bpmn.io license\n * http://bpmn.io/license\n *\n * Source Code: https://github.com/bpmn-io/bpmn-js\n *\n * Date: 2023-08-05\n */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n  typeof define === 'function' && define.amd ? define(factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.BpmnNavigatedViewer = factory());\n})(this, (function () { 'use strict';\n\n  function e(e,t){t&&(e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}));}\n\n  /**\n   * Flatten array, one level deep.\n   *\n   * @template T\n   *\n   * @param {T[][]} arr\n   *\n   * @return {T[]}\n   */\n\n  const nativeToString$1 = Object.prototype.toString;\n  const nativeHasOwnProperty$1 = Object.prototype.hasOwnProperty;\n\n  function isUndefined$2(obj) {\n    return obj === undefined;\n  }\n\n  function isDefined(obj) {\n    return obj !== undefined;\n  }\n\n  function isArray$2(obj) {\n    return nativeToString$1.call(obj) === '[object Array]';\n  }\n\n  function isObject(obj) {\n    return nativeToString$1.call(obj) === '[object Object]';\n  }\n\n  function isNumber(obj) {\n    return nativeToString$1.call(obj) === '[object Number]';\n  }\n\n  /**\n   * @param {any} obj\n   *\n   * @return {boolean}\n   */\n  function isFunction(obj) {\n    const tag = nativeToString$1.call(obj);\n\n    return (\n      tag === '[object Function]' ||\n      tag === '[object AsyncFunction]' ||\n      tag === '[object GeneratorFunction]' ||\n      tag === '[object AsyncGeneratorFunction]' ||\n      tag === '[object Proxy]'\n    );\n  }\n\n  function isString(obj) {\n    return nativeToString$1.call(obj) === '[object String]';\n  }\n\n  /**\n   * Return true, if target owns a property with the given key.\n   *\n   * @param {Object} target\n   * @param {String} key\n   *\n   * @return {Boolean}\n   */\n  function has$1(target, key) {\n    return nativeHasOwnProperty$1.call(target, key);\n  }\n\n  /**\n   * @template T\n   * @typedef { (\n   *   ((e: T) => boolean) |\n   *   ((e: T, idx: number) => boolean) |\n   *   ((e: T, key: string) => boolean) |\n   *   string |\n   *   number\n   * ) } Matcher\n   */\n\n  /**\n   * @template T\n   * @template U\n   *\n   * @typedef { (\n   *   ((e: T) => U) | string | number\n   * ) } Extractor\n   */\n\n\n  /**\n   * @template T\n   * @typedef { (val: T, key: any) => boolean } MatchFn\n   */\n\n  /**\n   * @template T\n   * @typedef { T[] } ArrayCollection\n   */\n\n  /**\n   * @template T\n   * @typedef { { [key: string]: T } } StringKeyValueCollection\n   */\n\n  /**\n   * @template T\n   * @typedef { { [key: number]: T } } NumberKeyValueCollection\n   */\n\n  /**\n   * @template T\n   * @typedef { StringKeyValueCollection<T> | NumberKeyValueCollection<T> } KeyValueCollection\n   */\n\n  /**\n   * @template T\n   * @typedef { KeyValueCollection<T> | ArrayCollection<T> } Collection\n   */\n\n  /**\n   * Find element in collection.\n   *\n   * @template T\n   * @param {Collection<T>} collection\n   * @param {Matcher<T>} matcher\n   *\n   * @return {Object}\n   */\n  function find(collection, matcher) {\n\n    const matchFn = toMatcher(matcher);\n\n    let match;\n\n    forEach$1(collection, function(val, key) {\n      if (matchFn(val, key)) {\n        match = val;\n\n        return false;\n      }\n    });\n\n    return match;\n\n  }\n\n\n  /**\n   * Find element index in collection.\n   *\n   * @template T\n   * @param {Collection<T>} collection\n   * @param {Matcher<T>} matcher\n   *\n   * @return {number}\n   */\n  function findIndex(collection, matcher) {\n\n    const matchFn = toMatcher(matcher);\n\n    let idx = isArray$2(collection) ? -1 : undefined;\n\n    forEach$1(collection, function(val, key) {\n      if (matchFn(val, key)) {\n        idx = key;\n\n        return false;\n      }\n    });\n\n    return idx;\n  }\n\n\n  /**\n   * Filter elements in collection.\n   *\n   * @template T\n   * @param {Collection<T>} collection\n   * @param {Matcher<T>} matcher\n   *\n   * @return {T[]} result\n   */\n  function filter(collection, matcher) {\n\n    const matchFn = toMatcher(matcher);\n\n    let result = [];\n\n    forEach$1(collection, function(val, key) {\n      if (matchFn(val, key)) {\n        result.push(val);\n      }\n    });\n\n    return result;\n  }\n\n\n  /**\n   * Iterate over collection; returning something\n   * (non-undefined) will stop iteration.\n   *\n   * @template T\n   * @param {Collection<T>} collection\n   * @param { ((item: T, idx: number) => (boolean|void)) | ((item: T, key: string) => (boolean|void)) } iterator\n   *\n   * @return {T} return result that stopped the iteration\n   */\n  function forEach$1(collection, iterator) {\n\n    let val,\n        result;\n\n    if (isUndefined$2(collection)) {\n      return;\n    }\n\n    const convertKey = isArray$2(collection) ? toNum$1 : identity$1;\n\n    for (let key in collection) {\n\n      if (has$1(collection, key)) {\n        val = collection[key];\n\n        result = iterator(val, convertKey(key));\n\n        if (result === false) {\n          return val;\n        }\n      }\n    }\n  }\n\n\n  /**\n   * Reduce collection, returning a single result.\n   *\n   * @template T\n   * @template V\n   *\n   * @param {Collection<T>} collection\n   * @param {(result: V, entry: T, index: any) => V} iterator\n   * @param {V} result\n   *\n   * @return {V} result returned from last iterator\n   */\n  function reduce(collection, iterator, result) {\n\n    forEach$1(collection, function(value, idx) {\n      result = iterator(result, value, idx);\n    });\n\n    return result;\n  }\n\n\n  /**\n   * Return true if every element in the collection\n   * matches the criteria.\n   *\n   * @param  {Object|Array} collection\n   * @param  {Function} matcher\n   *\n   * @return {Boolean}\n   */\n  function every(collection, matcher) {\n\n    return !!reduce(collection, function(matches, val, key) {\n      return matches && matcher(val, key);\n    }, true);\n  }\n\n\n  /**\n   * Return true if some elements in the collection\n   * match the criteria.\n   *\n   * @param  {Object|Array} collection\n   * @param  {Function} matcher\n   *\n   * @return {Boolean}\n   */\n  function some(collection, matcher) {\n\n    return !!find(collection, matcher);\n  }\n\n\n  /**\n   * Transform a collection into another collection\n   * by piping each member through the given fn.\n   *\n   * @param  {Object|Array}   collection\n   * @param  {Function} fn\n   *\n   * @return {Array} transformed collection\n   */\n  function map$1(collection, fn) {\n\n    let result = [];\n\n    forEach$1(collection, function(val, key) {\n      result.push(fn(val, key));\n    });\n\n    return result;\n  }\n\n\n  /**\n   * Create an object pattern matcher.\n   *\n   * @example\n   *\n   * ```javascript\n   * const matcher = matchPattern({ id: 1 });\n   *\n   * let element = find(elements, matcher);\n   * ```\n   *\n   * @template T\n   *\n   * @param {T} pattern\n   *\n   * @return { (el: any) =>  boolean } matcherFn\n   */\n  function matchPattern(pattern) {\n\n    return function(el) {\n\n      return every(pattern, function(val, key) {\n        return el[key] === val;\n      });\n\n    };\n  }\n\n\n  /**\n   * @template T\n   * @param {Matcher<T>} matcher\n   *\n   * @return {MatchFn<T>}\n   */\n  function toMatcher(matcher) {\n    return isFunction(matcher) ? matcher : (e) => {\n      return e === matcher;\n    };\n  }\n\n\n  function identity$1(arg) {\n    return arg;\n  }\n\n  function toNum$1(arg) {\n    return Number(arg);\n  }\n\n  /* global setTimeout clearTimeout */\n\n  /**\n   * @typedef { {\n   *   (...args: any[]): any;\n   *   flush: () => void;\n   *   cancel: () => void;\n   * } } DebouncedFunction\n   */\n\n  /**\n   * Debounce fn, calling it only once if the given time\n   * elapsed between calls.\n   *\n   * Lodash-style the function exposes methods to `#clear`\n   * and `#flush` to control internal behavior.\n   *\n   * @param  {Function} fn\n   * @param  {Number} timeout\n   *\n   * @return {DebouncedFunction} debounced function\n   */\n  function debounce(fn, timeout) {\n\n    let timer;\n\n    let lastArgs;\n    let lastThis;\n\n    let lastNow;\n\n    function fire(force) {\n\n      let now = Date.now();\n\n      let scheduledDiff = force ? 0 : (lastNow + timeout) - now;\n\n      if (scheduledDiff > 0) {\n        return schedule(scheduledDiff);\n      }\n\n      fn.apply(lastThis, lastArgs);\n\n      clear();\n    }\n\n    function schedule(timeout) {\n      timer = setTimeout(fire, timeout);\n    }\n\n    function clear() {\n      if (timer) {\n        clearTimeout(timer);\n      }\n\n      timer = lastNow = lastArgs = lastThis = undefined;\n    }\n\n    function flush() {\n      if (timer) {\n        fire(true);\n      }\n\n      clear();\n    }\n\n    /**\n     * @type { DebouncedFunction }\n     */\n    function callback(...args) {\n      lastNow = Date.now();\n\n      lastArgs = args;\n      lastThis = this;\n\n      // ensure an execution is scheduled\n      if (!timer) {\n        schedule(timeout);\n      }\n    }\n\n    callback.flush = flush;\n    callback.cancel = clear;\n\n    return callback;\n  }\n\n  /**\n   * Bind function against target <this>.\n   *\n   * @param  {Function} fn\n   * @param  {Object}   target\n   *\n   * @return {Function} bound function\n   */\n  function bind$2(fn, target) {\n    return fn.bind(target);\n  }\n\n  /**\n   * Convenience wrapper for `Object.assign`.\n   *\n   * @param {Object} target\n   * @param {...Object} others\n   *\n   * @return {Object} the target\n   */\n  function assign$1(target, ...others) {\n    return Object.assign(target, ...others);\n  }\n\n  /**\n   * Pick properties from the given target.\n   *\n   * @template T\n   * @template {any[]} V\n   *\n   * @param {T} target\n   * @param {V} properties\n   *\n   * @return Pick<T, V>\n   */\n  function pick(target, properties) {\n\n    let result = {};\n\n    let obj = Object(target);\n\n    forEach$1(properties, function(prop) {\n\n      if (prop in obj) {\n        result[prop] = target[prop];\n      }\n    });\n\n    return result;\n  }\n\n  /**\n   * Pick all target properties, excluding the given ones.\n   *\n   * @template T\n   * @template {any[]} V\n   *\n   * @param {T} target\n   * @param {V} properties\n   *\n   * @return {Omit<T, V>} target\n   */\n  function omit(target, properties) {\n\n    let result = {};\n\n    let obj = Object(target);\n\n    forEach$1(obj, function(prop, key) {\n\n      if (properties.indexOf(key) === -1) {\n        result[key] = prop;\n      }\n    });\n\n    return result;\n  }\n\n  var DEFAULT_RENDER_PRIORITY$1 = 1000;\n\n  /**\n   * @typedef {import('../core/Types').ElementLike} Element\n   * @typedef {import('../core/Types').ConnectionLike} Connection\n   * @typedef {import('../core/Types').ShapeLike} Shape\n   *\n   * @typedef {import('../core/EventBus').default} EventBus\n   */\n\n  /**\n   * The base implementation of shape and connection renderers.\n   *\n   * @param {EventBus} eventBus\n   * @param {number} [renderPriority=1000]\n   */\n  function BaseRenderer(eventBus, renderPriority) {\n    var self = this;\n\n    renderPriority = renderPriority || DEFAULT_RENDER_PRIORITY$1;\n\n    eventBus.on([ 'render.shape', 'render.connection' ], renderPriority, function(evt, context) {\n      var type = evt.type,\n          element = context.element,\n          visuals = context.gfx,\n          attrs = context.attrs;\n\n      if (self.canRender(element)) {\n        if (type === 'render.shape') {\n          return self.drawShape(visuals, element, attrs);\n        } else {\n          return self.drawConnection(visuals, element, attrs);\n        }\n      }\n    });\n\n    eventBus.on([ 'render.getShapePath', 'render.getConnectionPath' ], renderPriority, function(evt, element) {\n      if (self.canRender(element)) {\n        if (evt.type === 'render.getShapePath') {\n          return self.getShapePath(element);\n        } else {\n          return self.getConnectionPath(element);\n        }\n      }\n    });\n  }\n\n  /**\n   * Checks whether an element can be rendered.\n   *\n   * @param {Element} element The element to be rendered.\n   *\n   * @return {boolean} Whether the element can be rendered.\n   */\n  BaseRenderer.prototype.canRender = function(element) {};\n\n  /**\n   * Draws a shape.\n   *\n   * @param {SVGElement} visuals The SVG element to draw the shape into.\n   * @param {Shape} shape The shape to be drawn.\n   *\n   * @return {SVGElement} The SVG element of the shape drawn.\n   */\n  BaseRenderer.prototype.drawShape = function(visuals, shape) {};\n\n  /**\n   * Draws a connection.\n   *\n   * @param {SVGElement} visuals The SVG element to draw the connection into.\n   * @param {Connection} connection The connection to be drawn.\n   *\n   * @return {SVGElement} The SVG element of the connection drawn.\n   */\n  BaseRenderer.prototype.drawConnection = function(visuals, connection) {};\n\n  /**\n   * Gets the SVG path of the graphical representation of a shape.\n   *\n   * @param {Shape} shape The shape.\n   *\n   * @return {string} The SVG path of the shape.\n   */\n  BaseRenderer.prototype.getShapePath = function(shape) {};\n\n  /**\n   * Gets the SVG path of the graphical representation of a connection.\n   *\n   * @param {Connection} connection The connection.\n   *\n   * @return {string} The SVG path of the connection.\n   */\n  BaseRenderer.prototype.getConnectionPath = function(connection) {};\n\n  /**\n   * @typedef { import('../model/Types').Element } Element\n   * @typedef { import('../model/Types').ModdleElement } ModdleElement\n   */\n\n  /**\n   * Is an element of the given BPMN type?\n   *\n   * @param  {Element|ModdleElement} element\n   * @param  {string} type\n   *\n   * @return {boolean}\n   */\n  function is$1(element, type) {\n    var bo = getBusinessObject(element);\n\n    return bo && (typeof bo.$instanceOf === 'function') && bo.$instanceOf(type);\n  }\n\n\n  /**\n   * Return true if element has any of the given types.\n   *\n   * @param {Element|ModdleElement} element\n   * @param {string[]} types\n   *\n   * @return {boolean}\n   */\n  function isAny(element, types) {\n    return some(types, function(t) {\n      return is$1(element, t);\n    });\n  }\n\n  /**\n   * Return the business object for a given element.\n   *\n   * @param {Element|ModdleElement} element\n   *\n   * @return {ModdleElement}\n   */\n  function getBusinessObject(element) {\n    return (element && element.businessObject) || element;\n  }\n\n  /**\n   * Return the di object for a given element.\n   *\n   * @param {Element} element\n   *\n   * @return {ModdleElement}\n   */\n  function getDi(element) {\n    return element && element.di;\n  }\n\n  /**\n   * @typedef {import('../model/Types').Element} Element\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   */\n\n  /**\n   * @param {Element} element\n   * @param {ModdleElement} [di]\n   *\n   * @return {boolean}\n   */\n  function isExpanded(element, di) {\n\n    if (is$1(element, 'bpmn:CallActivity')) {\n      return false;\n    }\n\n    if (is$1(element, 'bpmn:SubProcess')) {\n      di = di || getDi(element);\n\n      if (di && is$1(di, 'bpmndi:BPMNPlane')) {\n        return true;\n      }\n\n      return di && !!di.isExpanded;\n    }\n\n    if (is$1(element, 'bpmn:Participant')) {\n      return !!getBusinessObject(element).processRef;\n    }\n\n    return true;\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isEventSubProcess(element) {\n    return element && !!getBusinessObject(element).triggeredByEvent;\n  }\n\n  /**\n   * Checks whether a value is an instance of Connection.\n   *\n   * @param {any} value\n   *\n   * @return {boolean}\n   */\n  function isConnection(value) {\n    return isObject(value) && has$1(value, 'waypoints');\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/util/Types').Point} Point\n   * @typedef {import('diagram-js/lib/util/Types').Rect} Rect\n   *\n   * @typedef {import('../model/Types').Element} Element\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   */\n\n  var DEFAULT_LABEL_SIZE$1 = {\n    width: 90,\n    height: 20\n  };\n\n  var FLOW_LABEL_INDENT = 15;\n\n\n  /**\n   * Return true if the given semantic has an external label.\n   *\n   * @param {Element} semantic\n   *\n   * @return {boolean}\n   */\n  function isLabelExternal(semantic) {\n    return is$1(semantic, 'bpmn:Event') ||\n           is$1(semantic, 'bpmn:Gateway') ||\n           is$1(semantic, 'bpmn:DataStoreReference') ||\n           is$1(semantic, 'bpmn:DataObjectReference') ||\n           is$1(semantic, 'bpmn:DataInput') ||\n           is$1(semantic, 'bpmn:DataOutput') ||\n           is$1(semantic, 'bpmn:SequenceFlow') ||\n           is$1(semantic, 'bpmn:MessageFlow') ||\n           is$1(semantic, 'bpmn:Group');\n  }\n\n  /**\n   * Get the position of a sequence flow label.\n   *\n   * @param  {Point[]} waypoints\n   *\n   * @return {Point}\n   */\n  function getFlowLabelPosition(waypoints) {\n\n    // get the waypoints mid\n    var mid = waypoints.length / 2 - 1;\n\n    var first = waypoints[Math.floor(mid)];\n    var second = waypoints[Math.ceil(mid + 0.01)];\n\n    // get position\n    var position = getWaypointsMid(waypoints);\n\n    // calculate angle\n    var angle = Math.atan((second.y - first.y) / (second.x - first.x));\n\n    var x = position.x,\n        y = position.y;\n\n    if (Math.abs(angle) < Math.PI / 2) {\n      y -= FLOW_LABEL_INDENT;\n    } else {\n      x += FLOW_LABEL_INDENT;\n    }\n\n    return { x: x, y: y };\n  }\n\n\n  /**\n   * Get the middle of a number of waypoints.\n   *\n   * @param  {Point[]} waypoints\n   *\n   * @return {Point}\n   */\n  function getWaypointsMid(waypoints) {\n\n    var mid = waypoints.length / 2 - 1;\n\n    var first = waypoints[Math.floor(mid)];\n    var second = waypoints[Math.ceil(mid + 0.01)];\n\n    return {\n      x: first.x + (second.x - first.x) / 2,\n      y: first.y + (second.y - first.y) / 2\n    };\n  }\n\n  /**\n   * Get the middle of the external label of an element.\n   *\n   * @param {Element} element\n   *\n   * @return {Point}\n   */\n  function getExternalLabelMid(element) {\n\n    if (element.waypoints) {\n      return getFlowLabelPosition(element.waypoints);\n    } else if (is$1(element, 'bpmn:Group')) {\n      return {\n        x: element.x + element.width / 2,\n        y: element.y + DEFAULT_LABEL_SIZE$1.height / 2\n      };\n    } else {\n      return {\n        x: element.x + element.width / 2,\n        y: element.y + element.height + DEFAULT_LABEL_SIZE$1.height / 2\n      };\n    }\n  }\n\n\n  /**\n   * Return the bounds of an elements label, parsed from the elements DI or\n   * generated from its bounds.\n   *\n   * @param {ModdleElement} di\n   * @param {Element} element\n   *\n   * @return {Rect}\n   */\n  function getExternalLabelBounds(di, element) {\n\n    var mid,\n        size,\n        bounds,\n        label = di.label;\n\n    if (label && label.bounds) {\n      bounds = label.bounds;\n\n      size = {\n        width: Math.max(DEFAULT_LABEL_SIZE$1.width, bounds.width),\n        height: bounds.height\n      };\n\n      mid = {\n        x: bounds.x + bounds.width / 2,\n        y: bounds.y + bounds.height / 2\n      };\n    } else {\n\n      mid = getExternalLabelMid(element);\n\n      size = DEFAULT_LABEL_SIZE$1;\n    }\n\n    return assign$1({\n      x: mid.x - size.width / 2,\n      y: mid.y - size.height / 2\n    }, size);\n  }\n\n  /**\n   * @param {ModdleElement} semantic\n   *\n   * @returns {string}\n   */\n  function getLabelAttr(semantic) {\n    if (\n      is$1(semantic, 'bpmn:FlowElement') ||\n      is$1(semantic, 'bpmn:Participant') ||\n      is$1(semantic, 'bpmn:Lane') ||\n      is$1(semantic, 'bpmn:SequenceFlow') ||\n      is$1(semantic, 'bpmn:MessageFlow') ||\n      is$1(semantic, 'bpmn:DataInput') ||\n      is$1(semantic, 'bpmn:DataOutput')\n    ) {\n      return 'name';\n    }\n\n    if (is$1(semantic, 'bpmn:TextAnnotation')) {\n      return 'text';\n    }\n\n    if (is$1(semantic, 'bpmn:Group')) {\n      return 'categoryValueRef';\n    }\n  }\n\n  /**\n   * @param {ModdleElement} semantic\n   *\n   * @returns {string}\n   */\n  function getCategoryValue(semantic) {\n    var categoryValueRef = semantic['categoryValueRef'];\n\n    if (!categoryValueRef) {\n      return '';\n    }\n\n\n    return categoryValueRef.value || '';\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {string}\n   */\n  function getLabel(element) {\n    var semantic = element.businessObject,\n        attr = getLabelAttr(semantic);\n\n    if (attr) {\n\n      if (attr === 'categoryValueRef') {\n\n        return getCategoryValue(semantic);\n      }\n\n      return semantic[attr] || '';\n    }\n  }\n\n  function ensureImported(element, target) {\n\n    if (element.ownerDocument !== target.ownerDocument) {\n      try {\n\n        // may fail on webkit\n        return target.ownerDocument.importNode(element, true);\n      } catch (e) {\n\n        // ignore\n      }\n    }\n\n    return element;\n  }\n\n  /**\n   * appendTo utility\n   */\n\n  /**\n   * Append a node to a target element and return the appended node.\n   *\n   * @param  {SVGElement} element\n   * @param  {SVGElement} target\n   *\n   * @return {SVGElement} the appended node\n   */\n  function appendTo(element, target) {\n    return target.appendChild(ensureImported(element, target));\n  }\n\n  /**\n   * append utility\n   */\n\n  /**\n   * Append a node to an element\n   *\n   * @param  {SVGElement} element\n   * @param  {SVGElement} node\n   *\n   * @return {SVGElement} the element\n   */\n  function append(target, node) {\n    appendTo(node, target);\n    return target;\n  }\n\n  /**\n   * attribute accessor utility\n   */\n\n  var LENGTH_ATTR = 2;\n\n  var CSS_PROPERTIES = {\n    'alignment-baseline': 1,\n    'baseline-shift': 1,\n    'clip': 1,\n    'clip-path': 1,\n    'clip-rule': 1,\n    'color': 1,\n    'color-interpolation': 1,\n    'color-interpolation-filters': 1,\n    'color-profile': 1,\n    'color-rendering': 1,\n    'cursor': 1,\n    'direction': 1,\n    'display': 1,\n    'dominant-baseline': 1,\n    'enable-background': 1,\n    'fill': 1,\n    'fill-opacity': 1,\n    'fill-rule': 1,\n    'filter': 1,\n    'flood-color': 1,\n    'flood-opacity': 1,\n    'font': 1,\n    'font-family': 1,\n    'font-size': LENGTH_ATTR,\n    'font-size-adjust': 1,\n    'font-stretch': 1,\n    'font-style': 1,\n    'font-variant': 1,\n    'font-weight': 1,\n    'glyph-orientation-horizontal': 1,\n    'glyph-orientation-vertical': 1,\n    'image-rendering': 1,\n    'kerning': 1,\n    'letter-spacing': 1,\n    'lighting-color': 1,\n    'marker': 1,\n    'marker-end': 1,\n    'marker-mid': 1,\n    'marker-start': 1,\n    'mask': 1,\n    'opacity': 1,\n    'overflow': 1,\n    'pointer-events': 1,\n    'shape-rendering': 1,\n    'stop-color': 1,\n    'stop-opacity': 1,\n    'stroke': 1,\n    'stroke-dasharray': 1,\n    'stroke-dashoffset': 1,\n    'stroke-linecap': 1,\n    'stroke-linejoin': 1,\n    'stroke-miterlimit': 1,\n    'stroke-opacity': 1,\n    'stroke-width': LENGTH_ATTR,\n    'text-anchor': 1,\n    'text-decoration': 1,\n    'text-rendering': 1,\n    'unicode-bidi': 1,\n    'visibility': 1,\n    'word-spacing': 1,\n    'writing-mode': 1\n  };\n\n\n  function getAttribute(node, name) {\n    if (CSS_PROPERTIES[name]) {\n      return node.style[name];\n    } else {\n      return node.getAttributeNS(null, name);\n    }\n  }\n\n  function setAttribute(node, name, value) {\n    var hyphenated = name.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n\n    var type = CSS_PROPERTIES[hyphenated];\n\n    if (type) {\n\n      // append pixel unit, unless present\n      if (type === LENGTH_ATTR && typeof value === 'number') {\n        value = String(value) + 'px';\n      }\n\n      node.style[hyphenated] = value;\n    } else {\n      node.setAttributeNS(null, name, value);\n    }\n  }\n\n  function setAttributes(node, attrs) {\n\n    var names = Object.keys(attrs), i, name;\n\n    for (i = 0, name; (name = names[i]); i++) {\n      setAttribute(node, name, attrs[name]);\n    }\n  }\n\n  /**\n   * Gets or sets raw attributes on a node.\n   *\n   * @param  {SVGElement} node\n   * @param  {Object} [attrs]\n   * @param  {String} [name]\n   * @param  {String} [value]\n   *\n   * @return {String}\n   */\n  function attr$1(node, name, value) {\n    if (typeof name === 'string') {\n      if (value !== undefined) {\n        setAttribute(node, name, value);\n      } else {\n        return getAttribute(node, name);\n      }\n    } else {\n      setAttributes(node, name);\n    }\n\n    return node;\n  }\n\n  /**\r\n   * Taken from https://github.com/component/classes\r\n   *\r\n   * Without the component bits.\r\n   */\r\n\r\n  /**\r\n   * toString reference.\r\n   */\r\n\r\n  const toString$1 = Object.prototype.toString;\r\n\r\n  /**\r\n    * Wrap `el` in a `ClassList`.\r\n    *\r\n    * @param {Element} el\r\n    * @return {ClassList}\r\n    * @api public\r\n    */\r\n\r\n  function classes$1(el) {\r\n    return new ClassList$1(el);\r\n  }\r\n\r\n  function ClassList$1(el) {\r\n    if (!el || !el.nodeType) {\r\n      throw new Error('A DOM element reference is required');\r\n    }\r\n    this.el = el;\r\n    this.list = el.classList;\r\n  }\r\n\r\n  /**\r\n    * Add class `name` if not already present.\r\n    *\r\n    * @param {String} name\r\n    * @return {ClassList}\r\n    * @api public\r\n    */\r\n\r\n  ClassList$1.prototype.add = function(name) {\r\n    this.list.add(name);\r\n    return this;\r\n  };\r\n\r\n  /**\r\n    * Remove class `name` when present, or\r\n    * pass a regular expression to remove\r\n    * any which match.\r\n    *\r\n    * @param {String|RegExp} name\r\n    * @return {ClassList}\r\n    * @api public\r\n    */\r\n\r\n  ClassList$1.prototype.remove = function(name) {\r\n    if ('[object RegExp]' == toString$1.call(name)) {\r\n      return this.removeMatching(name);\r\n    }\r\n\r\n    this.list.remove(name);\r\n    return this;\r\n  };\r\n\r\n  /**\r\n    * Remove all classes matching `re`.\r\n    *\r\n    * @param {RegExp} re\r\n    * @return {ClassList}\r\n    * @api private\r\n    */\r\n\r\n  ClassList$1.prototype.removeMatching = function(re) {\r\n    const arr = this.array();\r\n    for (let i = 0; i < arr.length; i++) {\r\n      if (re.test(arr[i])) {\r\n        this.remove(arr[i]);\r\n      }\r\n    }\r\n    return this;\r\n  };\r\n\r\n  /**\r\n    * Toggle class `name`, can force state via `force`.\r\n    *\r\n    * For browsers that support classList, but do not support `force` yet,\r\n    * the mistake will be detected and corrected.\r\n    *\r\n    * @param {String} name\r\n    * @param {Boolean} force\r\n    * @return {ClassList}\r\n    * @api public\r\n    */\r\n\r\n  ClassList$1.prototype.toggle = function(name, force) {\r\n    if ('undefined' !== typeof force) {\r\n      if (force !== this.list.toggle(name, force)) {\r\n        this.list.toggle(name); // toggle again to correct\r\n      }\r\n    } else {\r\n      this.list.toggle(name);\r\n    }\r\n    return this;\r\n  };\r\n\r\n  /**\r\n    * Return an array of classes.\r\n    *\r\n    * @return {Array}\r\n    * @api public\r\n    */\r\n\r\n  ClassList$1.prototype.array = function() {\r\n    return Array.from(this.list);\r\n  };\r\n\r\n  /**\r\n    * Check if class `name` is present.\r\n    *\r\n    * @param {String} name\r\n    * @return {ClassList}\r\n    * @api public\r\n    */\r\n\r\n  ClassList$1.prototype.has =\r\n   ClassList$1.prototype.contains = function(name) {\r\n     return this.list.contains(name);\r\n   };\n\n  function remove$2(element) {\n    var parent = element.parentNode;\n\n    if (parent) {\n      parent.removeChild(element);\n    }\n\n    return element;\n  }\n\n  /**\n   * Clear utility\n   */\n\n  /**\n   * Removes all children from the given element\n   *\n   * @param  {DOMElement} element\n   * @return {DOMElement} the element (for chaining)\n   */\n  function clear$1(element) {\n    var child;\n\n    while ((child = element.firstChild)) {\n      remove$2(child);\n    }\n\n    return element;\n  }\n\n  var ns = {\n    svg: 'http://www.w3.org/2000/svg'\n  };\n\n  /**\n   * DOM parsing utility\n   */\n\n  var SVG_START = '<svg xmlns=\"' + ns.svg + '\"';\n\n  function parse$1(svg) {\n\n    var unwrap = false;\n\n    // ensure we import a valid svg document\n    if (svg.substring(0, 4) === '<svg') {\n      if (svg.indexOf(ns.svg) === -1) {\n        svg = SVG_START + svg.substring(4);\n      }\n    } else {\n\n      // namespace svg\n      svg = SVG_START + '>' + svg + '</svg>';\n      unwrap = true;\n    }\n\n    var parsed = parseDocument(svg);\n\n    if (!unwrap) {\n      return parsed;\n    }\n\n    var fragment = document.createDocumentFragment();\n\n    var parent = parsed.firstChild;\n\n    while (parent.firstChild) {\n      fragment.appendChild(parent.firstChild);\n    }\n\n    return fragment;\n  }\n\n  function parseDocument(svg) {\n\n    var parser;\n\n    // parse\n    parser = new DOMParser();\n    parser.async = false;\n\n    return parser.parseFromString(svg, 'text/xml');\n  }\n\n  /**\n   * Create utility for SVG elements\n   */\n\n\n  /**\n   * Create a specific type from name or SVG markup.\n   *\n   * @param {String} name the name or markup of the element\n   * @param {Object} [attrs] attributes to set on the element\n   *\n   * @returns {SVGElement}\n   */\n  function create$1(name, attrs) {\n    var element;\n\n    if (name.charAt(0) === '<') {\n      element = parse$1(name).firstChild;\n      element = document.importNode(element, true);\n    } else {\n      element = document.createElementNS(ns.svg, name);\n    }\n\n    if (attrs) {\n      attr$1(element, attrs);\n    }\n\n    return element;\n  }\n\n  /**\n   * Geometry helpers\n   */\n\n  // fake node used to instantiate svg geometry elements\n  var node = null;\n\n  function getNode() {\n    if (node === null) {\n      node = create$1('svg');\n    }\n\n    return node;\n  }\n\n  function extend$1(object, props) {\n    var i, k, keys = Object.keys(props);\n\n    for (i = 0; (k = keys[i]); i++) {\n      object[k] = props[k];\n    }\n\n    return object;\n  }\n\n  /**\n   * Create matrix via args.\n   *\n   * @example\n   *\n   * createMatrix({ a: 1, b: 1 });\n   * createMatrix();\n   * createMatrix(1, 2, 0, 0, 30, 20);\n   *\n   * @return {SVGMatrix}\n   */\n  function createMatrix(a, b, c, d, e, f) {\n    var matrix = getNode().createSVGMatrix();\n\n    switch (arguments.length) {\n    case 0:\n      return matrix;\n    case 1:\n      return extend$1(matrix, a);\n    case 6:\n      return extend$1(matrix, {\n        a: a,\n        b: b,\n        c: c,\n        d: d,\n        e: e,\n        f: f\n      });\n    }\n  }\n\n  function createTransform(matrix) {\n    if (matrix) {\n      return getNode().createSVGTransformFromMatrix(matrix);\n    } else {\n      return getNode().createSVGTransform();\n    }\n  }\n\n  /**\n   * Serialization util\n   */\n\n  var TEXT_ENTITIES = /([&<>]{1})/g;\n  var ATTR_ENTITIES = /([\\n\\r\"]{1})/g;\n\n  var ENTITY_REPLACEMENT = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '\\''\n  };\n\n  function escape$1(str, pattern) {\n\n    function replaceFn(match, entity) {\n      return ENTITY_REPLACEMENT[entity] || entity;\n    }\n\n    return str.replace(pattern, replaceFn);\n  }\n\n  function serialize(node, output) {\n\n    var i, len, attrMap, attrNode, childNodes;\n\n    switch (node.nodeType) {\n\n    // TEXT\n    case 3:\n\n      // replace special XML characters\n      output.push(escape$1(node.textContent, TEXT_ENTITIES));\n      break;\n\n    // ELEMENT\n    case 1:\n      output.push('<', node.tagName);\n\n      if (node.hasAttributes()) {\n        attrMap = node.attributes;\n        for (i = 0, len = attrMap.length; i < len; ++i) {\n          attrNode = attrMap.item(i);\n          output.push(' ', attrNode.name, '=\"', escape$1(attrNode.value, ATTR_ENTITIES), '\"');\n        }\n      }\n\n      if (node.hasChildNodes()) {\n        output.push('>');\n        childNodes = node.childNodes;\n        for (i = 0, len = childNodes.length; i < len; ++i) {\n          serialize(childNodes.item(i), output);\n        }\n        output.push('</', node.tagName, '>');\n      } else {\n        output.push('/>');\n      }\n      break;\n\n    // COMMENT\n    case 8:\n      output.push('<!--', escape$1(node.nodeValue, TEXT_ENTITIES), '-->');\n      break;\n\n    // CDATA\n    case 4:\n      output.push('<![CDATA[', node.nodeValue, ']]>');\n      break;\n\n    default:\n      throw new Error('unable to handle node ' + node.nodeType);\n    }\n\n    return output;\n  }\n\n  /**\n   * innerHTML like functionality for SVG elements.\n   * based on innerSVG (https://code.google.com/p/innersvg)\n   */\n\n\n  function set$1(element, svg) {\n\n    var parsed = parse$1(svg);\n\n    // clear element contents\n    clear$1(element);\n\n    if (!svg) {\n      return;\n    }\n\n    if (!isFragment(parsed)) {\n\n      // extract <svg> from parsed document\n      parsed = parsed.documentElement;\n    }\n\n    var nodes = slice$1(parsed.childNodes);\n\n    // import + append each node\n    for (var i = 0; i < nodes.length; i++) {\n      appendTo(nodes[i], element);\n    }\n\n  }\n\n  function get(element) {\n    var child = element.firstChild,\n        output = [];\n\n    while (child) {\n      serialize(child, output);\n      child = child.nextSibling;\n    }\n\n    return output.join('');\n  }\n\n  function isFragment(node) {\n    return node.nodeName === '#document-fragment';\n  }\n\n  function innerSVG(element, svg) {\n\n    if (svg !== undefined) {\n\n      try {\n        set$1(element, svg);\n      } catch (e) {\n        throw new Error('error parsing SVG: ' + e.message);\n      }\n\n      return element;\n    } else {\n      return get(element);\n    }\n  }\n\n\n  function slice$1(arr) {\n    return Array.prototype.slice.call(arr);\n  }\n\n  /**\n   * transform accessor utility\n   */\n\n  function wrapMatrix(transformList, transform) {\n    if (transform instanceof SVGMatrix) {\n      return transformList.createSVGTransformFromMatrix(transform);\n    }\n\n    return transform;\n  }\n\n\n  function setTransforms(transformList, transforms) {\n    var i, t;\n\n    transformList.clear();\n\n    for (i = 0; (t = transforms[i]); i++) {\n      transformList.appendItem(wrapMatrix(transformList, t));\n    }\n  }\n\n  /**\n   * Get or set the transforms on the given node.\n   *\n   * @param {SVGElement} node\n   * @param  {SVGTransform|SVGMatrix|Array<SVGTransform|SVGMatrix>} [transforms]\n   *\n   * @return {SVGTransform} the consolidated transform\n   */\n  function transform$1(node, transforms) {\n    var transformList = node.transform.baseVal;\n\n    if (transforms) {\n\n      if (!Array.isArray(transforms)) {\n        transforms = [ transforms ];\n      }\n\n      setTransforms(transformList, transforms);\n    }\n\n    return transformList.consolidate();\n  }\n\n  /**\n   * @typedef {(string|number)[]} Component\n   *\n   * @typedef {import('../util/Types').Point} Point\n   */\n\n  /**\n   * @param {Component[] | Component[][]} elements\n   *\n   * @return {string}\n   */\n  function componentsToPath(elements) {\n    return elements.flat().join(',').replace(/,?([A-z]),?/g, '$1');\n  }\n\n  /**\n   * @param {Point} point\n   *\n   * @return {Component[]}\n   */\n  function move(point) {\n    return [ 'M', point.x, point.y ];\n  }\n\n  /**\n   * @param {Point} point\n   *\n   * @return {Component[]}\n   */\n  function lineTo(point) {\n    return [ 'L', point.x, point.y ];\n  }\n\n  /**\n   * @param {Point} p1\n   * @param {Point} p2\n   * @param {Point} p3\n   *\n   * @return {Component[]}\n   */\n  function curveTo(p1, p2, p3) {\n    return [ 'C', p1.x, p1.y, p2.x, p2.y, p3.x, p3.y ];\n  }\n\n  /**\n   * @param {Point[]} waypoints\n   * @param {number} [cornerRadius]\n   * @return {Component[][]}\n   */\n  function drawPath(waypoints, cornerRadius) {\n    const pointCount = waypoints.length;\n\n    const path = [ move(waypoints[0]) ];\n\n    for (let i = 1; i < pointCount; i++) {\n\n      const pointBefore = waypoints[i - 1];\n      const point = waypoints[i];\n      const pointAfter = waypoints[i + 1];\n\n      if (!pointAfter || !cornerRadius) {\n        path.push(lineTo(point));\n\n        continue;\n      }\n\n      const effectiveRadius = Math.min(\n        cornerRadius,\n        vectorLength(point.x - pointBefore.x, point.y - pointBefore.y),\n        vectorLength(pointAfter.x - point.x, pointAfter.y - point.y)\n      );\n\n      if (!effectiveRadius) {\n        path.push(lineTo(point));\n\n        continue;\n      }\n\n      const beforePoint = getPointAtLength(point, pointBefore, effectiveRadius);\n      const beforePoint2 = getPointAtLength(point, pointBefore, effectiveRadius * .5);\n\n      const afterPoint = getPointAtLength(point, pointAfter, effectiveRadius);\n      const afterPoint2 = getPointAtLength(point, pointAfter, effectiveRadius * .5);\n\n      path.push(lineTo(beforePoint));\n      path.push(curveTo(beforePoint2, afterPoint2, afterPoint));\n    }\n\n    return path;\n  }\n\n  function getPointAtLength(start, end, length) {\n\n    const deltaX = end.x - start.x;\n    const deltaY = end.y - start.y;\n\n    const totalLength = vectorLength(deltaX, deltaY);\n\n    const percent = length / totalLength;\n\n    return {\n      x: start.x + deltaX * percent,\n      y: start.y + deltaY * percent\n    };\n  }\n\n  function vectorLength(x, y) {\n    return Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));\n  }\n\n  /**\n   * @param {Point[]} points\n   * @param {number|Object} [attrs]\n   * @param {number} [radius]\n   *\n   * @return {SVGElement}\n   */\n  function createLine(points, attrs, radius) {\n\n    if (isNumber(attrs)) {\n      radius = attrs;\n      attrs = null;\n    }\n\n    if (!attrs) {\n      attrs = {};\n    }\n\n    const line = create$1('path', attrs);\n\n    if (isNumber(radius)) {\n      line.dataset.cornerRadius = String(radius);\n    }\n\n    return updateLine(line, points);\n  }\n\n  /**\n   * @param {SVGElement} gfx\n   * @param {Point[]} points\n   *\n   * @return {SVGElement}\n   */\n  function updateLine(gfx, points) {\n\n    const cornerRadius = parseInt(gfx.dataset.cornerRadius, 10) || 0;\n\n    attr$1(gfx, {\n      d: componentsToPath(drawPath(points, cornerRadius))\n    });\n\n    return gfx;\n  }\n\n  var black = 'hsl(225, 10%, 15%)';\n\n  // element utils //////////////////////\n\n  /**\n   * Checks if eventDefinition of the given element matches with semantic type.\n   *\n   * @param {ModdleElement} event\n   * @param {string} eventDefinitionType\n   *\n   * @return {boolean}\n   */\n  function isTypedEvent(event, eventDefinitionType) {\n    return some(event.eventDefinitions, function(definition) {\n      return definition.$type === eventDefinitionType;\n    });\n  }\n\n  /**\n   * Check if element is a throw event.\n   *\n   * @param {ModdleElement} event\n   *\n   * @return {boolean}\n   */\n  function isThrowEvent(event) {\n    return (event.$type === 'bpmn:IntermediateThrowEvent') || (event.$type === 'bpmn:EndEvent');\n  }\n\n  /**\n   * Check if element is a throw event.\n   *\n   * @param {ModdleElement} element\n   *\n   * @return {boolean}\n   */\n  function isCollection(element) {\n    var dataObject = element.dataObjectRef;\n\n    return element.isCollection || (dataObject && dataObject.isCollection);\n  }\n\n\n  // color access //////////////////////\n\n  /**\n   * @param {Element} element\n   * @param {string} [defaultColor]\n   *\n   * @return {string}\n   */\n  function getFillColor(element, defaultColor) {\n    var di = getDi(element);\n\n    return di.get('color:background-color') || di.get('bioc:fill') || defaultColor || 'white';\n  }\n\n  /**\n   * @param {Element} element\n   * @param {string} [defaultColor]\n   *\n   * @return {string}\n   */\n  function getStrokeColor(element, defaultColor) {\n    var di = getDi(element);\n\n    return di.get('color:border-color') || di.get('bioc:stroke') || defaultColor || black;\n  }\n\n  /**\n   * @param {Element} element\n   * @param {string} [defaultColor]\n   * @param {string} [defaultStrokeColor]\n   *\n   * @return {string}\n   */\n  function getLabelColor(element, defaultColor, defaultStrokeColor) {\n    var di = getDi(element),\n        label = di.get('label');\n\n    return label && label.get('color:color') || defaultColor ||\n      getStrokeColor(element, defaultStrokeColor);\n  }\n\n  // cropping path customizations //////////////////////\n\n  /**\n   * @param {ShapeLike} shape\n   *\n   * @return {string} path\n   */\n  function getCirclePath(shape) {\n\n    var cx = shape.x + shape.width / 2,\n        cy = shape.y + shape.height / 2,\n        radius = shape.width / 2;\n\n    var circlePath = [\n      [ 'M', cx, cy ],\n      [ 'm', 0, -radius ],\n      [ 'a', radius, radius, 0, 1, 1, 0, 2 * radius ],\n      [ 'a', radius, radius, 0, 1, 1, 0, -2 * radius ],\n      [ 'z' ]\n    ];\n\n    return componentsToPath(circlePath);\n  }\n\n  /**\n   * @param {ShapeLike} shape\n   * @param {number} [borderRadius]\n   *\n   * @return {string} path\n   */\n  function getRoundRectPath(shape, borderRadius) {\n\n    var x = shape.x,\n        y = shape.y,\n        width = shape.width,\n        height = shape.height;\n\n    var roundRectPath = [\n      [ 'M', x + borderRadius, y ],\n      [ 'l', width - borderRadius * 2, 0 ],\n      [ 'a', borderRadius, borderRadius, 0, 0, 1, borderRadius, borderRadius ],\n      [ 'l', 0, height - borderRadius * 2 ],\n      [ 'a', borderRadius, borderRadius, 0, 0, 1, -borderRadius, borderRadius ],\n      [ 'l', borderRadius * 2 - width, 0 ],\n      [ 'a', borderRadius, borderRadius, 0, 0, 1, -borderRadius, -borderRadius ],\n      [ 'l', 0, borderRadius * 2 - height ],\n      [ 'a', borderRadius, borderRadius, 0, 0, 1, borderRadius, -borderRadius ],\n      [ 'z' ]\n    ];\n\n    return componentsToPath(roundRectPath);\n  }\n\n  /**\n   * @param {ShapeLike} shape\n   *\n   * @return {string} path\n   */\n  function getDiamondPath(shape) {\n\n    var width = shape.width,\n        height = shape.height,\n        x = shape.x,\n        y = shape.y,\n        halfWidth = width / 2,\n        halfHeight = height / 2;\n\n    var diamondPath = [\n      [ 'M', x + halfWidth, y ],\n      [ 'l', halfWidth, halfHeight ],\n      [ 'l', -halfWidth, halfHeight ],\n      [ 'l', -halfWidth, -halfHeight ],\n      [ 'z' ]\n    ];\n\n    return componentsToPath(diamondPath);\n  }\n\n  /**\n   * @param {ShapeLike} shape\n   *\n   * @return {string} path\n   */\n  function getRectPath(shape) {\n    var x = shape.x,\n        y = shape.y,\n        width = shape.width,\n        height = shape.height;\n\n    var rectPath = [\n      [ 'M', x, y ],\n      [ 'l', width, 0 ],\n      [ 'l', 0, height ],\n      [ 'l', -width, 0 ],\n      [ 'z' ]\n    ];\n\n    return componentsToPath(rectPath);\n  }\n\n  function _mergeNamespaces$1(n, m) {\n    m.forEach(function (e) {\n      e && typeof e !== 'string' && !Array.isArray(e) && Object.keys(e).forEach(function (k) {\n        if (k !== 'default' && !(k in n)) {\n          var d = Object.getOwnPropertyDescriptor(e, k);\n          Object.defineProperty(n, k, d.get ? d : {\n            enumerable: true,\n            get: function () { return e[k]; }\n          });\n        }\n      });\n    });\n    return Object.freeze(n);\n  }\n\n  /**\n   * Flatten array, one level deep.\n   *\n   * @param {Array<?>} arr\n   *\n   * @return {Array<?>}\n   */\n\n  const nativeToString = Object.prototype.toString;\n  const nativeHasOwnProperty = Object.prototype.hasOwnProperty;\n\n  function isUndefined$1(obj) {\n    return obj === undefined;\n  }\n\n  function isArray$1(obj) {\n    return nativeToString.call(obj) === '[object Array]';\n  }\n\n  /**\n   * Return true, if target owns a property with the given key.\n   *\n   * @param {Object} target\n   * @param {String} key\n   *\n   * @return {Boolean}\n   */\n  function has(target, key) {\n    return nativeHasOwnProperty.call(target, key);\n  }\n\n\n  /**\n   * Iterate over collection; returning something\n   * (non-undefined) will stop iteration.\n   *\n   * @param  {Array|Object} collection\n   * @param  {Function} iterator\n   *\n   * @return {Object} return result that stopped the iteration\n   */\n  function forEach(collection, iterator) {\n\n    let val,\n        result;\n\n    if (isUndefined$1(collection)) {\n      return;\n    }\n\n    const convertKey = isArray$1(collection) ? toNum : identity;\n\n    for (let key in collection) {\n\n      if (has(collection, key)) {\n        val = collection[key];\n\n        result = iterator(val, convertKey(key));\n\n        if (result === false) {\n          return val;\n        }\n      }\n    }\n  }\n\n\n  function identity(arg) {\n    return arg;\n  }\n\n  function toNum(arg) {\n    return Number(arg);\n  }\n\n  /**\n   * Assigns style attributes in a style-src compliant way.\n   *\n   * @param {Element} element\n   * @param {...Object} styleSources\n   *\n   * @return {Element} the element\n   */\n  function assign(element, ...styleSources) {\n    const target = element.style;\n\n    forEach(styleSources, function(style) {\n      if (!style) {\n        return;\n      }\n\n      forEach(style, function(value, key) {\n        target[key] = value;\n      });\n    });\n\n    return element;\n  }\n\n  /**\n   * Set attribute `name` to `val`, or get attr `name`.\n   *\n   * @param {Element} el\n   * @param {String} name\n   * @param {String} [val]\n   * @api public\n   */\n  function attr(el, name, val) {\n\n    // get\n    if (arguments.length == 2) {\n      return el.getAttribute(name);\n    }\n\n    // remove\n    if (val === null) {\n      return el.removeAttribute(name);\n    }\n\n    // set\n    el.setAttribute(name, val);\n\n    return el;\n  }\n\n  /**\n   * Taken from https://github.com/component/classes\n   *\n   * Without the component bits.\n   */\n\n  /**\n   * toString reference.\n   */\n\n  const toString = Object.prototype.toString;\n\n  /**\n   * Wrap `el` in a `ClassList`.\n   *\n   * @param {Element} el\n   * @return {ClassList}\n   * @api public\n   */\n\n  function classes(el) {\n    return new ClassList(el);\n  }\n\n  /**\n   * Initialize a new ClassList for `el`.\n   *\n   * @param {Element} el\n   * @api private\n   */\n\n  function ClassList(el) {\n    if (!el || !el.nodeType) {\n      throw new Error('A DOM element reference is required');\n    }\n    this.el = el;\n    this.list = el.classList;\n  }\n\n  /**\n   * Add class `name` if not already present.\n   *\n   * @param {String} name\n   * @return {ClassList}\n   * @api public\n   */\n\n  ClassList.prototype.add = function(name) {\n    this.list.add(name);\n    return this;\n  };\n\n  /**\n   * Remove class `name` when present, or\n   * pass a regular expression to remove\n   * any which match.\n   *\n   * @param {String|RegExp} name\n   * @return {ClassList}\n   * @api public\n   */\n\n  ClassList.prototype.remove = function(name) {\n    if ('[object RegExp]' == toString.call(name)) {\n      return this.removeMatching(name);\n    }\n\n    this.list.remove(name);\n    return this;\n  };\n\n  /**\n   * Remove all classes matching `re`.\n   *\n   * @param {RegExp} re\n   * @return {ClassList}\n   * @api private\n   */\n\n  ClassList.prototype.removeMatching = function(re) {\n    const arr = this.array();\n    for (let i = 0; i < arr.length; i++) {\n      if (re.test(arr[i])) {\n        this.remove(arr[i]);\n      }\n    }\n    return this;\n  };\n\n  /**\n   * Toggle class `name`, can force state via `force`.\n   *\n   * For browsers that support classList, but do not support `force` yet,\n   * the mistake will be detected and corrected.\n   *\n   * @param {String} name\n   * @param {Boolean} force\n   * @return {ClassList}\n   * @api public\n   */\n\n  ClassList.prototype.toggle = function(name, force) {\n    if ('undefined' !== typeof force) {\n      if (force !== this.list.toggle(name, force)) {\n        this.list.toggle(name); // toggle again to correct\n      }\n    } else {\n      this.list.toggle(name);\n    }\n    return this;\n  };\n\n  /**\n   * Return an array of classes.\n   *\n   * @return {Array}\n   * @api public\n   */\n\n  ClassList.prototype.array = function() {\n    return Array.from(this.list);\n  };\n\n  /**\n   * Check if class `name` is present.\n   *\n   * @param {String} name\n   * @return {ClassList}\n   * @api public\n   */\n\n  ClassList.prototype.has =\n  ClassList.prototype.contains = function(name) {\n    return this.list.contains(name);\n  };\n\n  /**\n   * Remove all children from the given element.\n   */\n  function clear(el) {\n\n    var c;\n\n    while (el.childNodes.length) {\n      c = el.childNodes[0];\n      el.removeChild(c);\n    }\n\n    return el;\n  }\n\n  /**\n   * @param { HTMLElement } element\n   * @param { String } selector\n   *\n   * @return { boolean }\n   */\n  function matches(element, selector) {\n    return element && typeof element.matches === 'function' && element.matches(selector);\n  }\n\n  /**\n   * Closest\n   *\n   * @param {Element} el\n   * @param {String} selector\n   * @param {Boolean} checkYourSelf (optional)\n   */\n  function closest(element, selector, checkYourSelf) {\n    var currentElem = checkYourSelf ? element : element.parentNode;\n\n    while (currentElem && currentElem.nodeType !== document.DOCUMENT_NODE &&\n        currentElem.nodeType !== document.DOCUMENT_FRAGMENT_NODE) {\n\n      if (matches(currentElem, selector)) {\n        return currentElem;\n      }\n\n      currentElem = currentElem.parentNode;\n    }\n\n    return matches(currentElem, selector) ? currentElem : null;\n  }\n\n  var componentEvent = {};\n\n  var bind$1, unbind$1, prefix$6;\n\n  function detect () {\n    bind$1 = window.addEventListener ? 'addEventListener' : 'attachEvent';\n    unbind$1 = window.removeEventListener ? 'removeEventListener' : 'detachEvent';\n    prefix$6 = bind$1 !== 'addEventListener' ? 'on' : '';\n  }\n\n  /**\n   * Bind `el` event `type` to `fn`.\n   *\n   * @param {Element} el\n   * @param {String} type\n   * @param {Function} fn\n   * @param {Boolean} capture\n   * @return {Function}\n   * @api public\n   */\n\n  var bind_1 = componentEvent.bind = function(el, type, fn, capture){\n    if (!bind$1) detect();\n    el[bind$1](prefix$6 + type, fn, capture || false);\n    return fn;\n  };\n\n  /**\n   * Unbind `el` event `type`'s callback `fn`.\n   *\n   * @param {Element} el\n   * @param {String} type\n   * @param {Function} fn\n   * @param {Boolean} capture\n   * @return {Function}\n   * @api public\n   */\n\n  var unbind_1 = componentEvent.unbind = function(el, type, fn, capture){\n    if (!unbind$1) detect();\n    el[unbind$1](prefix$6 + type, fn, capture || false);\n    return fn;\n  };\n\n  var event = /*#__PURE__*/_mergeNamespaces$1({\n    __proto__: null,\n    bind: bind_1,\n    unbind: unbind_1,\n    'default': componentEvent\n  }, [componentEvent]);\n\n  /**\n   * Module dependencies.\n   */\n\n  /**\n   * Delegate event `type` to `selector`\n   * and invoke `fn(e)`. A callback function\n   * is returned which may be passed to `.unbind()`.\n   *\n   * @param {Element} el\n   * @param {String} selector\n   * @param {String} type\n   * @param {Function} fn\n   * @param {Boolean} capture\n   * @return {Function}\n   * @api public\n   */\n\n  // Some events don't bubble, so we want to bind to the capture phase instead\n  // when delegating.\n  var forceCaptureEvents = [ 'focus', 'blur' ];\n\n  function bind(el, selector, type, fn, capture) {\n    if (forceCaptureEvents.indexOf(type) !== -1) {\n      capture = true;\n    }\n\n    return event.bind(el, type, function(e) {\n      var target = e.target || e.srcElement;\n      e.delegateTarget = closest(target, selector, true);\n      if (e.delegateTarget) {\n        fn.call(el, e);\n      }\n    }, capture);\n  }\n\n  /**\n   * Unbind event `type`'s callback `fn`.\n   *\n   * @param {Element} el\n   * @param {String} type\n   * @param {Function} fn\n   * @param {Boolean} capture\n   * @api public\n   */\n  function unbind(el, type, fn, capture) {\n    if (forceCaptureEvents.indexOf(type) !== -1) {\n      capture = true;\n    }\n\n    return event.unbind(el, type, fn, capture);\n  }\n\n  var delegate = {\n    bind,\n    unbind\n  };\n\n  /**\n   * Expose `parse`.\n   */\n\n  var domify = parse;\n\n  /**\n   * Tests for browser support.\n   */\n\n  var innerHTMLBug = false;\n  var bugTestDiv;\n  if (typeof document !== 'undefined') {\n    bugTestDiv = document.createElement('div');\n    // Setup\n    bugTestDiv.innerHTML = '  <link/><table></table><a href=\"/a\">a</a><input type=\"checkbox\"/>';\n    // Make sure that link elements get serialized correctly by innerHTML\n    // This requires a wrapper element in IE\n    innerHTMLBug = !bugTestDiv.getElementsByTagName('link').length;\n    bugTestDiv = undefined;\n  }\n\n  /**\n   * Wrap map from jquery.\n   */\n\n  var map = {\n    legend: [1, '<fieldset>', '</fieldset>'],\n    tr: [2, '<table><tbody>', '</tbody></table>'],\n    col: [2, '<table><tbody></tbody><colgroup>', '</colgroup></table>'],\n    // for script/link/style tags to work in IE6-8, you have to wrap\n    // in a div with a non-whitespace character in front, ha!\n    _default: innerHTMLBug ? [1, 'X<div>', '</div>'] : [0, '', '']\n  };\n\n  map.td =\n  map.th = [3, '<table><tbody><tr>', '</tr></tbody></table>'];\n\n  map.option =\n  map.optgroup = [1, '<select multiple=\"multiple\">', '</select>'];\n\n  map.thead =\n  map.tbody =\n  map.colgroup =\n  map.caption =\n  map.tfoot = [1, '<table>', '</table>'];\n\n  map.polyline =\n  map.ellipse =\n  map.polygon =\n  map.circle =\n  map.text =\n  map.line =\n  map.path =\n  map.rect =\n  map.g = [1, '<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\">','</svg>'];\n\n  /**\n   * Parse `html` and return a DOM Node instance, which could be a TextNode,\n   * HTML DOM Node of some kind (<div> for example), or a DocumentFragment\n   * instance, depending on the contents of the `html` string.\n   *\n   * @param {String} html - HTML string to \"domify\"\n   * @param {Document} doc - The `document` instance to create the Node for\n   * @return {DOMNode} the TextNode, DOM Node, or DocumentFragment instance\n   * @api private\n   */\n\n  function parse(html, doc) {\n    if ('string' != typeof html) throw new TypeError('String expected');\n\n    // default to the global `document` object\n    if (!doc) doc = document;\n\n    // tag name\n    var m = /<([\\w:]+)/.exec(html);\n    if (!m) return doc.createTextNode(html);\n\n    html = html.replace(/^\\s+|\\s+$/g, ''); // Remove leading/trailing whitespace\n\n    var tag = m[1];\n\n    // body support\n    if (tag == 'body') {\n      var el = doc.createElement('html');\n      el.innerHTML = html;\n      return el.removeChild(el.lastChild);\n    }\n\n    // wrap map\n    var wrap = Object.prototype.hasOwnProperty.call(map, tag) ? map[tag] : map._default;\n    var depth = wrap[0];\n    var prefix = wrap[1];\n    var suffix = wrap[2];\n    var el = doc.createElement('div');\n    el.innerHTML = prefix + html + suffix;\n    while (depth--) el = el.lastChild;\n\n    // one element\n    if (el.firstChild == el.lastChild) {\n      return el.removeChild(el.firstChild);\n    }\n\n    // several elements\n    var fragment = doc.createDocumentFragment();\n    while (el.firstChild) {\n      fragment.appendChild(el.removeChild(el.firstChild));\n    }\n\n    return fragment;\n  }\n\n  var domify$1 = domify;\n\n  function query(selector, el) {\n    el = el || document;\n\n    return el.querySelector(selector);\n  }\n\n  function all(selector, el) {\n    el = el || document;\n\n    return el.querySelectorAll(selector);\n  }\n\n  function remove$1(el) {\n    el.parentNode && el.parentNode.removeChild(el);\n  }\n\n  /**\r\n   * @param {SVGElement} gfx\r\n   * @param {number} x\r\n   * @param {number} y\r\n   * @param {number} [angle]\r\n   * @param {number} [amount]\r\n   */\r\n  function transform(gfx, x, y, angle, amount) {\r\n    var translate = createTransform();\r\n    translate.setTranslate(x, y);\r\n\r\n    var rotate = createTransform();\r\n    rotate.setRotate(angle || 0, 0, 0);\r\n\r\n    var scale = createTransform();\r\n    scale.setScale(amount || 1, amount || 1);\r\n\r\n    transform$1(gfx, [ translate, rotate, scale ]);\r\n  }\r\n\r\n\r\n  /**\r\n   * @param {SVGElement} gfx\r\n   * @param {number} x\r\n   * @param {number} y\r\n   */\r\n  function translate$1(gfx, x, y) {\r\n    var translate = createTransform();\r\n    translate.setTranslate(x, y);\r\n\r\n    transform$1(gfx, translate);\r\n  }\r\n\r\n\r\n  /**\r\n   * @param {SVGElement} gfx\r\n   * @param {number} angle\r\n   */\r\n  function rotate(gfx, angle) {\r\n    var rotate = createTransform();\r\n    rotate.setRotate(angle, 0, 0);\r\n\r\n    transform$1(gfx, rotate);\r\n  }\n\n  function createCommonjsModule(fn, module) {\n  \treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n  }\n\n  var hat_1 = createCommonjsModule(function (module) {\n  var hat = module.exports = function (bits, base) {\n      if (!base) base = 16;\n      if (bits === undefined) bits = 128;\n      if (bits <= 0) return '0';\n      \n      var digits = Math.log(Math.pow(2, bits)) / Math.log(base);\n      for (var i = 2; digits === Infinity; i *= 2) {\n          digits = Math.log(Math.pow(2, bits / i)) / Math.log(base) * i;\n      }\n      \n      var rem = digits - Math.floor(digits);\n      \n      var res = '';\n      \n      for (var i = 0; i < Math.floor(digits); i++) {\n          var x = Math.floor(Math.random() * base).toString(base);\n          res = x + res;\n      }\n      \n      if (rem) {\n          var b = Math.pow(base, rem);\n          var x = Math.floor(Math.random() * b).toString(base);\n          res = x + res;\n      }\n      \n      var parsed = parseInt(res, base);\n      if (parsed !== Infinity && parsed >= Math.pow(2, bits)) {\n          return hat(bits, base)\n      }\n      else return res;\n  };\n\n  hat.rack = function (bits, base, expandBy) {\n      var fn = function (data) {\n          var iters = 0;\n          do {\n              if (iters ++ > 10) {\n                  if (expandBy) bits += expandBy;\n                  else throw new Error('too many ID collisions, use more bits')\n              }\n              \n              var id = hat(bits, base);\n          } while (Object.hasOwnProperty.call(hats, id));\n          \n          hats[id] = data;\n          return id;\n      };\n      var hats = fn.hats = {};\n      \n      fn.get = function (id) {\n          return fn.hats[id];\n      };\n      \n      fn.set = function (id, value) {\n          fn.hats[id] = value;\n          return fn;\n      };\n      \n      fn.bits = bits || 128;\n      fn.base = base || 16;\n      return fn;\n  };\n  });\n\n  /**\n   * Create a new id generator / cache instance.\n   *\n   * You may optionally provide a seed that is used internally.\n   *\n   * @param {Seed} seed\n   */\n\n  function Ids(seed) {\n    if (!(this instanceof Ids)) {\n      return new Ids(seed);\n    }\n\n    seed = seed || [128, 36, 1];\n    this._seed = seed.length ? hat_1.rack(seed[0], seed[1], seed[2]) : seed;\n  }\n  /**\n   * Generate a next id.\n   *\n   * @param {Object} [element] element to bind the id to\n   *\n   * @return {String} id\n   */\n\n  Ids.prototype.next = function (element) {\n    return this._seed(element || true);\n  };\n  /**\n   * Generate a next id with a given prefix.\n   *\n   * @param {Object} [element] element to bind the id to\n   *\n   * @return {String} id\n   */\n\n\n  Ids.prototype.nextPrefixed = function (prefix, element) {\n    var id;\n\n    do {\n      id = prefix + this.next(true);\n    } while (this.assigned(id)); // claim {prefix}{random}\n\n\n    this.claim(id, element); // return\n\n    return id;\n  };\n  /**\n   * Manually claim an existing id.\n   *\n   * @param {String} id\n   * @param {String} [element] element the id is claimed by\n   */\n\n\n  Ids.prototype.claim = function (id, element) {\n    this._seed.set(id, element || true);\n  };\n  /**\n   * Returns true if the given id has already been assigned.\n   *\n   * @param  {String} id\n   * @return {Boolean}\n   */\n\n\n  Ids.prototype.assigned = function (id) {\n    return this._seed.get(id) || false;\n  };\n  /**\n   * Unclaim an id.\n   *\n   * @param  {String} id the id to unclaim\n   */\n\n\n  Ids.prototype.unclaim = function (id) {\n    delete this._seed.hats[id];\n  };\n  /**\n   * Clear all claimed ids.\n   */\n\n\n  Ids.prototype.clear = function () {\n    var hats = this._seed.hats,\n        id;\n\n    for (id in hats) {\n      this.unclaim(id);\n    }\n  };\n\n  var RENDERER_IDS = new Ids();\n\n  var TASK_BORDER_RADIUS = 10;\n  var INNER_OUTER_DIST = 3;\n\n  var DEFAULT_FILL_OPACITY = .95,\n      HIGH_FILL_OPACITY = .35;\n\n  var ELEMENT_LABEL_DISTANCE = 10;\n\n  /**\n   * @typedef { Partial<{\n   *   defaultFillColor: string,\n   *   defaultStrokeColor: string,\n   *   defaultLabelColor: string\n   * }> } BpmnRendererConfig\n   */\n\n  /**\n   * @typedef { import('../model/Types').Element } Element\n   */\n\n  /**\n   * A renderer for BPMN elements\n   *\n   * @param {BpmnRendererConfig} config\n   * @param {import('diagram-js/lib/core/EventBus').default} eventBus\n   * @param {import('diagram-js/lib/draw/Styles').default} styles\n   * @param {import('./PathMap').default} pathMap\n   * @param {import('diagram-js/lib/core/Canvas').default} canvas\n   * @param {import('./TextRenderer').default} textRenderer\n   * @param {number} [priority]\n   */\n  function BpmnRenderer(\n      config, eventBus, styles, pathMap,\n      canvas, textRenderer, priority) {\n\n    BaseRenderer.call(this, eventBus, priority);\n\n    var defaultFillColor = config && config.defaultFillColor,\n        defaultStrokeColor = config && config.defaultStrokeColor,\n        defaultLabelColor = config && config.defaultLabelColor;\n\n    var rendererId = RENDERER_IDS.next();\n\n    var markers = {};\n\n    function shapeStyle(attrs) {\n      return styles.computeStyle(attrs, {\n        strokeLinecap: 'round',\n        strokeLinejoin: 'round',\n        stroke: black,\n        strokeWidth: 2,\n        fill: 'white'\n      });\n    }\n\n    function lineStyle(attrs) {\n      return styles.computeStyle(attrs, [ 'no-fill' ], {\n        strokeLinecap: 'round',\n        strokeLinejoin: 'round',\n        stroke: black,\n        strokeWidth: 2\n      });\n    }\n\n    function addMarker(id, options) {\n      var {\n        ref = { x: 0, y: 0 },\n        scale = 1,\n        element\n      } = options;\n\n      var marker = create$1('marker', {\n        id: id,\n        viewBox: '0 0 20 20',\n        refX: ref.x,\n        refY: ref.y,\n        markerWidth: 20 * scale,\n        markerHeight: 20 * scale,\n        orient: 'auto'\n      });\n\n      append(marker, element);\n\n      var defs = query('defs', canvas._svg);\n\n      if (!defs) {\n        defs = create$1('defs');\n\n        append(canvas._svg, defs);\n      }\n\n      append(defs, marker);\n\n      markers[id] = marker;\n    }\n\n    function colorEscape(str) {\n\n      // only allow characters and numbers\n      return str.replace(/[^0-9a-zA-Z]+/g, '_');\n    }\n\n    function marker(type, fill, stroke) {\n      var id = type + '-' + colorEscape(fill) + '-' + colorEscape(stroke) + '-' + rendererId;\n\n      if (!markers[id]) {\n        createMarker(id, type, fill, stroke);\n      }\n\n      return 'url(#' + id + ')';\n    }\n\n    function createMarker(id, type, fill, stroke) {\n\n      if (type === 'sequenceflow-end') {\n        var sequenceflowEnd = create$1('path', {\n          d: 'M 1 5 L 11 10 L 1 15 Z',\n          ...shapeStyle({\n            fill: stroke,\n            stroke: stroke,\n            strokeWidth: 1\n          })\n        });\n\n        addMarker(id, {\n          element: sequenceflowEnd,\n          ref: { x: 11, y: 10 },\n          scale: 0.5\n        });\n      }\n\n      if (type === 'messageflow-start') {\n        var messageflowStart = create$1('circle', {\n          cx: 6,\n          cy: 6,\n          r: 3.5,\n          ...shapeStyle({\n            fill: fill,\n            stroke: stroke,\n            strokeWidth: 1,\n\n            // fix for safari / chrome / firefox bug not correctly\n            // resetting stroke dash array\n            strokeDasharray: [ 10000, 1 ]\n          })\n        });\n\n        addMarker(id, {\n          element: messageflowStart,\n          ref: { x: 6, y: 6 }\n        });\n      }\n\n      if (type === 'messageflow-end') {\n        var messageflowEnd = create$1('path', {\n          d: 'm 1 5 l 0 -3 l 7 3 l -7 3 z',\n          ...shapeStyle({\n            fill: fill,\n            stroke: stroke,\n            strokeWidth: 1,\n\n            // fix for safari / chrome / firefox bug not correctly\n            // resetting stroke dash array\n            strokeDasharray: [ 10000, 1 ]\n          })\n        });\n\n        addMarker(id, {\n          element: messageflowEnd,\n          ref: { x: 8.5, y: 5 }\n        });\n      }\n\n      if (type === 'association-start') {\n        var associationStart = create$1('path', {\n          d: 'M 11 5 L 1 10 L 11 15',\n          ...lineStyle({\n            fill: 'none',\n            stroke: stroke,\n            strokeWidth: 1.5,\n\n            // fix for safari / chrome / firefox bug not correctly\n            // resetting stroke dash array\n            strokeDasharray: [ 10000, 1 ]\n          })\n        });\n\n        addMarker(id, {\n          element: associationStart,\n          ref: { x: 1, y: 10 },\n          scale: 0.5\n        });\n      }\n\n      if (type === 'association-end') {\n        var associationEnd = create$1('path', {\n          d: 'M 1 5 L 11 10 L 1 15',\n          ...lineStyle({\n            fill: 'none',\n            stroke: stroke,\n            strokeWidth: 1.5,\n\n            // fix for safari / chrome / firefox bug not correctly\n            // resetting stroke dash array\n            strokeDasharray: [ 10000, 1 ]\n          })\n        });\n\n        addMarker(id, {\n          element: associationEnd,\n          ref: { x: 11, y: 10 },\n          scale: 0.5\n        });\n      }\n\n      if (type === 'conditional-flow-marker') {\n        var conditionalFlowMarker = create$1('path', {\n          d: 'M 0 10 L 8 6 L 16 10 L 8 14 Z',\n          ...shapeStyle({\n            fill: fill,\n            stroke: stroke\n          })\n        });\n\n        addMarker(id, {\n          element: conditionalFlowMarker,\n          ref: { x: -1, y: 10 },\n          scale: 0.5\n        });\n      }\n\n      if (type === 'conditional-default-flow-marker') {\n        var defaultFlowMarker = create$1('path', {\n          d: 'M 6 4 L 10 16',\n          ...shapeStyle({\n            stroke: stroke\n          })\n        });\n\n        addMarker(id, {\n          element: defaultFlowMarker,\n          ref: { x: 0, y: 10 },\n          scale: 0.5\n        });\n      }\n    }\n\n    function drawCircle(parentGfx, width, height, offset, attrs) {\n\n      if (isObject(offset)) {\n        attrs = offset;\n        offset = 0;\n      }\n\n      offset = offset || 0;\n\n      attrs = shapeStyle(attrs);\n\n      if (attrs.fill === 'none') {\n        delete attrs.fillOpacity;\n      }\n\n      var cx = width / 2,\n          cy = height / 2;\n\n      var circle = create$1('circle', {\n        cx: cx,\n        cy: cy,\n        r: Math.round((width + height) / 4 - offset),\n        ...attrs\n      });\n\n      append(parentGfx, circle);\n\n      return circle;\n    }\n\n    function drawRect(parentGfx, width, height, r, offset, attrs) {\n\n      if (isObject(offset)) {\n        attrs = offset;\n        offset = 0;\n      }\n\n      offset = offset || 0;\n\n      attrs = shapeStyle(attrs);\n\n      var rect = create$1('rect', {\n        x: offset,\n        y: offset,\n        width: width - offset * 2,\n        height: height - offset * 2,\n        rx: r,\n        ry: r,\n        ...attrs\n      });\n\n      append(parentGfx, rect);\n\n      return rect;\n    }\n\n    function drawDiamond(parentGfx, width, height, attrs) {\n\n      var x_2 = width / 2;\n      var y_2 = height / 2;\n\n      var points = [\n        { x: x_2, y: 0 },\n        { x: width, y: y_2 },\n        { x: x_2, y: height },\n        { x: 0, y: y_2 }\n      ];\n\n      var pointsString = points.map(function(point) {\n        return point.x + ',' + point.y;\n      }).join(' ');\n\n      attrs = shapeStyle(attrs);\n\n      var polygon = create$1('polygon', {\n        ...attrs,\n        points: pointsString\n      });\n\n      append(parentGfx, polygon);\n\n      return polygon;\n    }\n\n    /**\n     * @param {SVGElement} parentGfx\n     * @param {Point[]} waypoints\n     * @param {any} attrs\n     * @param {number} [radius]\n     *\n     * @return {SVGElement}\n     */\n    function drawLine(parentGfx, waypoints, attrs, radius) {\n      attrs = lineStyle(attrs);\n\n      var line = createLine(waypoints, attrs, radius);\n\n      append(parentGfx, line);\n\n      return line;\n    }\n\n    /**\n     * @param {SVGElement} parentGfx\n     * @param {Point[]} waypoints\n     * @param {any} attrs\n     *\n     * @return {SVGElement}\n     */\n    function drawConnectionSegments(parentGfx, waypoints, attrs) {\n      return drawLine(parentGfx, waypoints, attrs, 5);\n    }\n\n    function drawPath(parentGfx, d, attrs) {\n\n      attrs = lineStyle(attrs);\n\n      var path = create$1('path', {\n        ...attrs,\n        d\n      });\n\n      append(parentGfx, path);\n\n      return path;\n    }\n\n    function drawMarker(type, parentGfx, path, attrs) {\n      return drawPath(parentGfx, path, assign$1({ 'data-marker': type }, attrs));\n    }\n\n    function renderer(type) {\n      return handlers[type];\n    }\n\n    function as(type) {\n      return function(parentGfx, element, options) {\n        return renderer(type)(parentGfx, element, options);\n      };\n    }\n\n    function renderEventContent(element, parentGfx) {\n\n      var event = getBusinessObject(element);\n      var isThrowing = isThrowEvent(event);\n\n      if (event.eventDefinitions && event.eventDefinitions.length > 1) {\n        if (event.parallelMultiple) {\n          return renderer('bpmn:ParallelMultipleEventDefinition')(parentGfx, element, isThrowing);\n        }\n        else {\n          return renderer('bpmn:MultipleEventDefinition')(parentGfx, element, isThrowing);\n        }\n      }\n\n      if (isTypedEvent(event, 'bpmn:MessageEventDefinition')) {\n        return renderer('bpmn:MessageEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:TimerEventDefinition')) {\n        return renderer('bpmn:TimerEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:ConditionalEventDefinition')) {\n        return renderer('bpmn:ConditionalEventDefinition')(parentGfx, element);\n      }\n\n      if (isTypedEvent(event, 'bpmn:SignalEventDefinition')) {\n        return renderer('bpmn:SignalEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:EscalationEventDefinition')) {\n        return renderer('bpmn:EscalationEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:LinkEventDefinition')) {\n        return renderer('bpmn:LinkEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:ErrorEventDefinition')) {\n        return renderer('bpmn:ErrorEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:CancelEventDefinition')) {\n        return renderer('bpmn:CancelEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:CompensateEventDefinition')) {\n        return renderer('bpmn:CompensateEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:TerminateEventDefinition')) {\n        return renderer('bpmn:TerminateEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      return null;\n    }\n\n    function renderLabel(parentGfx, label, options) {\n\n      options = assign$1({\n        size: {\n          width: 100\n        }\n      }, options);\n\n      var text = textRenderer.createText(label || '', options);\n\n      classes$1(text).add('djs-label');\n\n      append(parentGfx, text);\n\n      return text;\n    }\n\n    function renderEmbeddedLabel(parentGfx, element, align) {\n      var semantic = getBusinessObject(element);\n\n      return renderLabel(parentGfx, semantic.name, {\n        box: element,\n        align: align,\n        padding: 7,\n        style: {\n          fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor)\n        }\n      });\n    }\n\n    function renderExternalLabel(parentGfx, element) {\n\n      var box = {\n        width: 90,\n        height: 30,\n        x: element.width / 2 + element.x,\n        y: element.height / 2 + element.y\n      };\n\n      return renderLabel(parentGfx, getLabel(element), {\n        box: box,\n        fitBox: true,\n        style: assign$1(\n          {},\n          textRenderer.getExternalStyle(),\n          {\n            fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor)\n          }\n        )\n      });\n    }\n\n    function renderLaneLabel(parentGfx, text, element) {\n      var textBox = renderLabel(parentGfx, text, {\n        box: {\n          height: 30,\n          width: element.height\n        },\n        align: 'center-middle',\n        style: {\n          fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor)\n        }\n      });\n\n      var top = -1 * element.height;\n\n      transform(textBox, 0, -top, 270);\n    }\n\n    var handlers = this.handlers = {\n      'bpmn:Event': function(parentGfx, element, attrs) {\n\n        if (!('fillOpacity' in attrs)) {\n          attrs.fillOpacity = DEFAULT_FILL_OPACITY;\n        }\n\n        return drawCircle(parentGfx, element.width, element.height, attrs);\n      },\n      'bpmn:StartEvent': function(parentGfx, element, options) {\n        var attrs = {\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        };\n\n        var semantic = getBusinessObject(element);\n\n        if (!semantic.isInterrupting) {\n          attrs = {\n            strokeDasharray: '6',\n            fill: getFillColor(element, defaultFillColor),\n            stroke: getStrokeColor(element, defaultStrokeColor)\n          };\n        }\n\n        var circle = renderer('bpmn:Event')(parentGfx, element, attrs);\n\n        if (!options || options.renderIcon !== false) {\n          renderEventContent(element, parentGfx);\n        }\n\n        return circle;\n      },\n      'bpmn:MessageEventDefinition': function(parentGfx, element, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_MESSAGE', {\n          xScaleFactor: 0.9,\n          yScaleFactor: 0.9,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.235,\n            my: 0.315\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor(element, defaultStrokeColor) : getFillColor(element, defaultFillColor);\n        var stroke = isThrowing ? getFillColor(element, defaultFillColor) : getStrokeColor(element, defaultStrokeColor);\n\n        var messagePath = drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: stroke\n        });\n\n        return messagePath;\n      },\n      'bpmn:TimerEventDefinition': function(parentGfx, element) {\n        var circle = drawCircle(parentGfx, element.width, element.height, 0.2 * element.height, {\n          strokeWidth: 2,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        var pathData = pathMap.getScaledPath('EVENT_TIMER_WH', {\n          xScaleFactor: 0.75,\n          yScaleFactor: 0.75,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.5,\n            my: 0.5\n          }\n        });\n\n        drawPath(parentGfx, pathData, {\n          strokeWidth: 2,\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        for (var i = 0;i < 12; i++) {\n\n          var linePathData = pathMap.getScaledPath('EVENT_TIMER_LINE', {\n            xScaleFactor: 0.75,\n            yScaleFactor: 0.75,\n            containerWidth: element.width,\n            containerHeight: element.height,\n            position: {\n              mx: 0.5,\n              my: 0.5\n            }\n          });\n\n          var width = element.width / 2;\n          var height = element.height / 2;\n\n          drawPath(parentGfx, linePathData, {\n            strokeWidth: 1,\n            transform: 'rotate(' + (i * 30) + ',' + height + ',' + width + ')',\n            stroke: getStrokeColor(element, defaultStrokeColor)\n          });\n        }\n\n        return circle;\n      },\n      'bpmn:EscalationEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_ESCALATION', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.5,\n            my: 0.2\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor(event, defaultStrokeColor) : 'none';\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: getStrokeColor(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:ConditionalEventDefinition': function(parentGfx, event) {\n        var pathData = pathMap.getScaledPath('EVENT_CONDITIONAL', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.5,\n            my: 0.222\n          }\n        });\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          stroke: getStrokeColor(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:LinkEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_LINK', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.57,\n            my: 0.263\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor(event, defaultStrokeColor) : 'none';\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: getStrokeColor(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:ErrorEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_ERROR', {\n          xScaleFactor: 1.1,\n          yScaleFactor: 1.1,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.2,\n            my: 0.722\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor(event, defaultStrokeColor) : 'none';\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: getStrokeColor(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:CancelEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_CANCEL_45', {\n          xScaleFactor: 1.0,\n          yScaleFactor: 1.0,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.638,\n            my: -0.055\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor(event, defaultStrokeColor) : 'none';\n\n        var path = drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: getStrokeColor(event, defaultStrokeColor)\n        });\n\n        rotate(path, 45);\n\n        return path;\n      },\n      'bpmn:CompensateEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_COMPENSATION', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.22,\n            my: 0.5\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor(event, defaultStrokeColor) : 'none';\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: getStrokeColor(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:SignalEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_SIGNAL', {\n          xScaleFactor: 0.9,\n          yScaleFactor: 0.9,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.5,\n            my: 0.2\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor(event, defaultStrokeColor) : 'none';\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: getStrokeColor(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:MultipleEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_MULTIPLE', {\n          xScaleFactor: 1.1,\n          yScaleFactor: 1.1,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.222,\n            my: 0.36\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor(event, defaultStrokeColor) : 'none';\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill\n        });\n      },\n      'bpmn:ParallelMultipleEventDefinition': function(parentGfx, event) {\n        var pathData = pathMap.getScaledPath('EVENT_PARALLEL_MULTIPLE', {\n          xScaleFactor: 1.2,\n          yScaleFactor: 1.2,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.458,\n            my: 0.194\n          }\n        });\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: getStrokeColor(event, defaultStrokeColor),\n          stroke: getStrokeColor(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:EndEvent': function(parentGfx, element, options) {\n        var circle = renderer('bpmn:Event')(parentGfx, element, {\n          strokeWidth: 4,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        if (!options || options.renderIcon !== false) {\n          renderEventContent(element, parentGfx);\n        }\n\n        return circle;\n      },\n      'bpmn:TerminateEventDefinition': function(parentGfx, element) {\n        var circle = drawCircle(parentGfx, element.width, element.height, 8, {\n          strokeWidth: 4,\n          fill: getStrokeColor(element, defaultStrokeColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return circle;\n      },\n      'bpmn:IntermediateEvent': function(parentGfx, element, options) {\n        var outer = renderer('bpmn:Event')(parentGfx, element, {\n          strokeWidth: 1.5,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        /* inner */\n        drawCircle(parentGfx, element.width, element.height, INNER_OUTER_DIST, {\n          strokeWidth: 1.5,\n          fill: getFillColor(element, 'none'),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        if (!options || options.renderIcon !== false) {\n          renderEventContent(element, parentGfx);\n        }\n\n        return outer;\n      },\n      'bpmn:IntermediateCatchEvent': as('bpmn:IntermediateEvent'),\n      'bpmn:IntermediateThrowEvent': as('bpmn:IntermediateEvent'),\n\n      'bpmn:Activity': function(parentGfx, element, attrs) {\n\n        attrs = attrs || {};\n\n        if (!('fillOpacity' in attrs)) {\n          attrs.fillOpacity = DEFAULT_FILL_OPACITY;\n        }\n\n        return drawRect(parentGfx, element.width, element.height, TASK_BORDER_RADIUS, attrs);\n      },\n\n      'bpmn:Task': function(parentGfx, element) {\n        var attrs = {\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        };\n\n        var rect = renderer('bpmn:Activity')(parentGfx, element, attrs);\n\n        renderEmbeddedLabel(parentGfx, element, 'center-middle');\n        attachTaskMarkers(parentGfx, element);\n\n        return rect;\n      },\n      'bpmn:ServiceTask': function(parentGfx, element) {\n        var task = renderer('bpmn:Task')(parentGfx, element);\n\n        var pathDataBG = pathMap.getScaledPath('TASK_TYPE_SERVICE', {\n          abspos: {\n            x: 12,\n            y: 18\n          }\n        });\n\n        /* service bg */ drawPath(parentGfx, pathDataBG, {\n          strokeWidth: 1,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        var fillPathData = pathMap.getScaledPath('TASK_TYPE_SERVICE_FILL', {\n          abspos: {\n            x: 17.2,\n            y: 18\n          }\n        });\n\n        /* service fill */ drawPath(parentGfx, fillPathData, {\n          strokeWidth: 0,\n          fill: getFillColor(element, defaultFillColor)\n        });\n\n        var pathData = pathMap.getScaledPath('TASK_TYPE_SERVICE', {\n          abspos: {\n            x: 17,\n            y: 22\n          }\n        });\n\n        /* service */ drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return task;\n      },\n      'bpmn:UserTask': function(parentGfx, element) {\n        var task = renderer('bpmn:Task')(parentGfx, element);\n\n        var x = 15;\n        var y = 12;\n\n        var pathData = pathMap.getScaledPath('TASK_TYPE_USER_1', {\n          abspos: {\n            x: x,\n            y: y\n          }\n        });\n\n        /* user path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 0.5,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        var pathData2 = pathMap.getScaledPath('TASK_TYPE_USER_2', {\n          abspos: {\n            x: x,\n            y: y\n          }\n        });\n\n        /* user2 path */ drawPath(parentGfx, pathData2, {\n          strokeWidth: 0.5,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        var pathData3 = pathMap.getScaledPath('TASK_TYPE_USER_3', {\n          abspos: {\n            x: x,\n            y: y\n          }\n        });\n\n        /* user3 path */ drawPath(parentGfx, pathData3, {\n          strokeWidth: 0.5,\n          fill: getStrokeColor(element, defaultStrokeColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return task;\n      },\n      'bpmn:ManualTask': function(parentGfx, element) {\n        var task = renderer('bpmn:Task')(parentGfx, element);\n\n        var pathData = pathMap.getScaledPath('TASK_TYPE_MANUAL', {\n          abspos: {\n            x: 17,\n            y: 15\n          }\n        });\n\n        /* manual path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 0.5, // 0.25,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return task;\n      },\n      'bpmn:SendTask': function(parentGfx, element) {\n        var task = renderer('bpmn:Task')(parentGfx, element);\n\n        var pathData = pathMap.getScaledPath('TASK_TYPE_SEND', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: 21,\n          containerHeight: 14,\n          position: {\n            mx: 0.285,\n            my: 0.357\n          }\n        });\n\n        /* send path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: getStrokeColor(element, defaultStrokeColor),\n          stroke: getFillColor(element, defaultFillColor)\n        });\n\n        return task;\n      },\n      'bpmn:ReceiveTask' : function(parentGfx, element) {\n        var semantic = getBusinessObject(element);\n\n        var task = renderer('bpmn:Task')(parentGfx, element);\n        var pathData;\n\n        if (semantic.instantiate) {\n          drawCircle(parentGfx, 28, 28, 20 * 0.22, { strokeWidth: 1 });\n\n          pathData = pathMap.getScaledPath('TASK_TYPE_INSTANTIATING_SEND', {\n            abspos: {\n              x: 7.77,\n              y: 9.52\n            }\n          });\n        } else {\n\n          pathData = pathMap.getScaledPath('TASK_TYPE_SEND', {\n            xScaleFactor: 0.9,\n            yScaleFactor: 0.9,\n            containerWidth: 21,\n            containerHeight: 14,\n            position: {\n              mx: 0.3,\n              my: 0.4\n            }\n          });\n        }\n\n        /* receive path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return task;\n      },\n      'bpmn:ScriptTask': function(parentGfx, element) {\n        var task = renderer('bpmn:Task')(parentGfx, element);\n\n        var pathData = pathMap.getScaledPath('TASK_TYPE_SCRIPT', {\n          abspos: {\n            x: 15,\n            y: 20\n          }\n        });\n\n        /* script path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return task;\n      },\n      'bpmn:BusinessRuleTask': function(parentGfx, element) {\n        var task = renderer('bpmn:Task')(parentGfx, element);\n\n        var headerPathData = pathMap.getScaledPath('TASK_TYPE_BUSINESS_RULE_HEADER', {\n          abspos: {\n            x: 8,\n            y: 8\n          }\n        });\n\n        var businessHeaderPath = drawPath(parentGfx, headerPathData);\n        attr$1(businessHeaderPath, {\n          strokeWidth: 1,\n          fill: getFillColor(element, '#aaaaaa'),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        var headerData = pathMap.getScaledPath('TASK_TYPE_BUSINESS_RULE_MAIN', {\n          abspos: {\n            x: 8,\n            y: 8\n          }\n        });\n\n        var businessPath = drawPath(parentGfx, headerData);\n        attr$1(businessPath, {\n          strokeWidth: 1,\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return task;\n      },\n      'bpmn:SubProcess': function(parentGfx, element, attrs) {\n        attrs = {\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor),\n          ...attrs\n        };\n\n        var rect = renderer('bpmn:Activity')(parentGfx, element, attrs);\n\n        var expanded = isExpanded(element);\n\n        if (isEventSubProcess(element)) {\n          attr$1(rect, {\n            strokeDasharray: '0, 5.5',\n            strokeWidth: 2.5\n          });\n        }\n\n        renderEmbeddedLabel(parentGfx, element, expanded ? 'center-top' : 'center-middle');\n\n        if (expanded) {\n          attachTaskMarkers(parentGfx, element);\n        } else {\n          attachTaskMarkers(parentGfx, element, [ 'SubProcessMarker' ]);\n        }\n\n        return rect;\n      },\n      'bpmn:AdHocSubProcess': function(parentGfx, element) {\n        return renderer('bpmn:SubProcess')(parentGfx, element);\n      },\n      'bpmn:Transaction': function(parentGfx, element) {\n        var outer = renderer('bpmn:SubProcess')(parentGfx, element, { strokeWidth: 1.5 });\n\n        var innerAttrs = styles.style([ 'no-fill', 'no-events' ], {\n          stroke: getStrokeColor(element, defaultStrokeColor),\n          strokeWidth: 1.5\n        });\n\n        /* inner path */ drawRect(parentGfx, element.width, element.height, TASK_BORDER_RADIUS - 3, INNER_OUTER_DIST, innerAttrs);\n\n        return outer;\n      },\n      'bpmn:CallActivity': function(parentGfx, element) {\n        return renderer('bpmn:SubProcess')(parentGfx, element, {\n          strokeWidth: 5\n        });\n      },\n      'bpmn:Participant': function(parentGfx, element) {\n\n        var strokeWidth = 1.5;\n\n        var attrs = {\n          fillOpacity: DEFAULT_FILL_OPACITY,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor),\n          strokeWidth\n        };\n\n        var lane = renderer('bpmn:Lane')(parentGfx, element, attrs);\n\n        var expandedPool = isExpanded(element);\n\n        if (expandedPool) {\n          drawLine(parentGfx, [\n            { x: 30, y: 0 },\n            { x: 30, y: element.height }\n          ], {\n            stroke: getStrokeColor(element, defaultStrokeColor),\n            strokeWidth\n          });\n          var text = getBusinessObject(element).name;\n          renderLaneLabel(parentGfx, text, element);\n        } else {\n\n          // collapsed pool draw text inline\n          var text2 = getBusinessObject(element).name;\n          renderLabel(parentGfx, text2, {\n            box: element, align: 'center-middle',\n            style: {\n              fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor)\n            }\n          });\n        }\n\n        var participantMultiplicity = !!(getBusinessObject(element).participantMultiplicity);\n\n        if (participantMultiplicity) {\n          renderer('ParticipantMultiplicityMarker')(parentGfx, element);\n        }\n\n        return lane;\n      },\n      'bpmn:Lane': function(parentGfx, element, attrs) {\n        var rect = drawRect(parentGfx, element.width, element.height, 0, {\n          fill: getFillColor(element, defaultFillColor),\n          fillOpacity: HIGH_FILL_OPACITY,\n          stroke: getStrokeColor(element, defaultStrokeColor),\n          strokeWidth: 1.5,\n          ...attrs\n        });\n\n        var semantic = getBusinessObject(element);\n\n        if (semantic.$type === 'bpmn:Lane') {\n          var text = semantic.name;\n          renderLaneLabel(parentGfx, text, element);\n        }\n\n        return rect;\n      },\n      'bpmn:InclusiveGateway': function(parentGfx, element) {\n        var diamond = renderer('bpmn:Gateway')(parentGfx, element);\n\n        /* circle path */\n        drawCircle(parentGfx, element.width, element.height, element.height * 0.24, {\n          strokeWidth: 2.5,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return diamond;\n      },\n      'bpmn:ExclusiveGateway': function(parentGfx, element) {\n        var diamond = renderer('bpmn:Gateway')(parentGfx, element);\n\n        var pathData = pathMap.getScaledPath('GATEWAY_EXCLUSIVE', {\n          xScaleFactor: 0.4,\n          yScaleFactor: 0.4,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.32,\n            my: 0.3\n          }\n        });\n\n        if ((getDi(element).isMarkerVisible)) {\n          drawPath(parentGfx, pathData, {\n            strokeWidth: 1,\n            fill: getStrokeColor(element, defaultStrokeColor),\n            stroke: getStrokeColor(element, defaultStrokeColor)\n          });\n        }\n\n        return diamond;\n      },\n      'bpmn:ComplexGateway': function(parentGfx, element) {\n        var diamond = renderer('bpmn:Gateway')(parentGfx, element);\n\n        var pathData = pathMap.getScaledPath('GATEWAY_COMPLEX', {\n          xScaleFactor: 0.5,\n          yScaleFactor:0.5,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.46,\n            my: 0.26\n          }\n        });\n\n        /* complex path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: getStrokeColor(element, defaultStrokeColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return diamond;\n      },\n      'bpmn:ParallelGateway': function(parentGfx, element) {\n        var diamond = renderer('bpmn:Gateway')(parentGfx, element);\n\n        var pathData = pathMap.getScaledPath('GATEWAY_PARALLEL', {\n          xScaleFactor: 0.6,\n          yScaleFactor:0.6,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.46,\n            my: 0.2\n          }\n        });\n\n        /* parallel path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: getStrokeColor(element, defaultStrokeColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return diamond;\n      },\n      'bpmn:EventBasedGateway': function(parentGfx, element) {\n\n        var semantic = getBusinessObject(element);\n\n        var diamond = renderer('bpmn:Gateway')(parentGfx, element);\n\n        /* outer circle path */ drawCircle(parentGfx, element.width, element.height, element.height * 0.20, {\n          strokeWidth: 1,\n          fill: 'none',\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        var type = semantic.eventGatewayType;\n        var instantiate = !!semantic.instantiate;\n\n        function drawEvent() {\n\n          var pathData = pathMap.getScaledPath('GATEWAY_EVENT_BASED', {\n            xScaleFactor: 0.18,\n            yScaleFactor: 0.18,\n            containerWidth: element.width,\n            containerHeight: element.height,\n            position: {\n              mx: 0.36,\n              my: 0.44\n            }\n          });\n\n          /* event path */ drawPath(parentGfx, pathData, {\n            strokeWidth: 2,\n            fill: getFillColor(element, 'none'),\n            stroke: getStrokeColor(element, defaultStrokeColor)\n          });\n        }\n\n        if (type === 'Parallel') {\n\n          var pathData = pathMap.getScaledPath('GATEWAY_PARALLEL', {\n            xScaleFactor: 0.4,\n            yScaleFactor:0.4,\n            containerWidth: element.width,\n            containerHeight: element.height,\n            position: {\n              mx: 0.474,\n              my: 0.296\n            }\n          });\n\n          drawPath(parentGfx, pathData, {\n            strokeWidth: 1,\n            fill: 'none'\n          });\n        } else if (type === 'Exclusive') {\n\n          if (!instantiate) {\n            drawCircle(parentGfx, element.width, element.height, element.height * 0.26, {\n              strokeWidth: 1,\n              fill: 'none',\n              stroke: getStrokeColor(element, defaultStrokeColor)\n            });\n          }\n\n          drawEvent();\n        }\n\n\n        return diamond;\n      },\n      'bpmn:Gateway': function(parentGfx, element) {\n        return drawDiamond(parentGfx, element.width, element.height, {\n          fill: getFillColor(element, defaultFillColor),\n          fillOpacity: DEFAULT_FILL_OPACITY,\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n      },\n      'bpmn:SequenceFlow': function(parentGfx, element) {\n        var fill = getFillColor(element, defaultFillColor),\n            stroke = getStrokeColor(element, defaultStrokeColor);\n\n        var path = drawConnectionSegments(parentGfx, element.waypoints, {\n          markerEnd: marker('sequenceflow-end', fill, stroke),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        var sequenceFlow = getBusinessObject(element);\n\n        var source;\n\n        if (element.source) {\n          source = element.source.businessObject;\n\n          // conditional flow marker\n          if (sequenceFlow.conditionExpression && source.$instanceOf('bpmn:Activity')) {\n            attr$1(path, {\n              markerStart: marker('conditional-flow-marker', fill, stroke)\n            });\n          }\n\n          // default marker\n          if (source.default && (source.$instanceOf('bpmn:Gateway') || source.$instanceOf('bpmn:Activity')) &&\n              source.default === sequenceFlow) {\n            attr$1(path, {\n              markerStart: marker('conditional-default-flow-marker', fill, stroke)\n            });\n          }\n        }\n\n        return path;\n      },\n      'bpmn:Association': function(parentGfx, element, attrs) {\n\n        var semantic = getBusinessObject(element);\n\n        var fill = getFillColor(element, defaultFillColor),\n            stroke = getStrokeColor(element, defaultStrokeColor);\n\n        attrs = {\n          strokeDasharray: '0, 5',\n          stroke: getStrokeColor(element, defaultStrokeColor),\n          ...attrs\n        };\n\n        if (semantic.associationDirection === 'One' ||\n            semantic.associationDirection === 'Both') {\n          attrs.markerEnd = marker('association-end', fill, stroke);\n        }\n\n        if (semantic.associationDirection === 'Both') {\n          attrs.markerStart = marker('association-start', fill, stroke);\n        }\n\n        return drawConnectionSegments(parentGfx, element.waypoints, attrs);\n      },\n      'bpmn:DataInputAssociation': function(parentGfx, element) {\n        var fill = getFillColor(element, defaultFillColor),\n            stroke = getStrokeColor(element, defaultStrokeColor);\n\n        return renderer('bpmn:Association')(parentGfx, element, {\n          markerEnd: marker('association-end', fill, stroke)\n        });\n      },\n      'bpmn:DataOutputAssociation': function(parentGfx, element) {\n        var fill = getFillColor(element, defaultFillColor),\n            stroke = getStrokeColor(element, defaultStrokeColor);\n\n        return renderer('bpmn:Association')(parentGfx, element, {\n          markerEnd: marker('association-end', fill, stroke)\n        });\n      },\n      'bpmn:MessageFlow': function(parentGfx, element) {\n\n        var semantic = getBusinessObject(element),\n            di = getDi(element);\n\n        var fill = getFillColor(element, defaultFillColor),\n            stroke = getStrokeColor(element, defaultStrokeColor);\n\n        var path = drawConnectionSegments(parentGfx, element.waypoints, {\n          markerEnd: marker('messageflow-end', fill, stroke),\n          markerStart: marker('messageflow-start', fill, stroke),\n          strokeDasharray: '10, 11',\n          strokeWidth: 1.5,\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        if (semantic.messageRef) {\n          var midPoint = path.getPointAtLength(path.getTotalLength() / 2);\n\n          var markerPathData = pathMap.getScaledPath('MESSAGE_FLOW_MARKER', {\n            abspos: {\n              x: midPoint.x,\n              y: midPoint.y\n            }\n          });\n\n          var messageAttrs = { strokeWidth: 1 };\n\n          if (di.messageVisibleKind === 'initiating') {\n            messageAttrs.fill = 'white';\n            messageAttrs.stroke = black;\n          } else {\n            messageAttrs.fill = '#888';\n            messageAttrs.stroke = 'white';\n          }\n\n          var message = drawPath(parentGfx, markerPathData, messageAttrs);\n\n          var labelText = semantic.messageRef.name;\n          var label = renderLabel(parentGfx, labelText, {\n            align: 'center-top',\n            fitBox: true,\n            style: {\n              fill: getStrokeColor(element, defaultLabelColor)\n            }\n          });\n\n          var messageBounds = message.getBBox(),\n              labelBounds = label.getBBox();\n\n          var translateX = midPoint.x - labelBounds.width / 2,\n              translateY = midPoint.y + messageBounds.height / 2 + ELEMENT_LABEL_DISTANCE;\n\n          transform(label, translateX, translateY, 0);\n\n        }\n\n        return path;\n      },\n      'bpmn:DataObject': function(parentGfx, element) {\n        var pathData = pathMap.getScaledPath('DATA_OBJECT_PATH', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.474,\n            my: 0.296\n          }\n        });\n\n        var elementObject = drawPath(parentGfx, pathData, {\n          fill: getFillColor(element, defaultFillColor),\n          fillOpacity: DEFAULT_FILL_OPACITY,\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        var semantic = getBusinessObject(element);\n\n        if (isCollection(semantic)) {\n          renderDataItemCollection(parentGfx, element);\n        }\n\n        return elementObject;\n      },\n      'bpmn:DataObjectReference': as('bpmn:DataObject'),\n      'bpmn:DataInput': function(parentGfx, element) {\n\n        var arrowPathData = pathMap.getRawPath('DATA_ARROW');\n\n        // page\n        var elementObject = renderer('bpmn:DataObject')(parentGfx, element);\n\n        /* input arrow path */ drawPath(parentGfx, arrowPathData, { strokeWidth: 1 });\n\n        return elementObject;\n      },\n      'bpmn:DataOutput': function(parentGfx, element) {\n        var arrowPathData = pathMap.getRawPath('DATA_ARROW');\n\n        // page\n        var elementObject = renderer('bpmn:DataObject')(parentGfx, element);\n\n        /* output arrow path */ drawPath(parentGfx, arrowPathData, {\n          strokeWidth: 1,\n          fill: black\n        });\n\n        return elementObject;\n      },\n      'bpmn:DataStoreReference': function(parentGfx, element) {\n        var DATA_STORE_PATH = pathMap.getScaledPath('DATA_STORE', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0,\n            my: 0.133\n          }\n        });\n\n        var elementStore = drawPath(parentGfx, DATA_STORE_PATH, {\n          strokeWidth: 2,\n          fill: getFillColor(element, defaultFillColor),\n          fillOpacity: DEFAULT_FILL_OPACITY,\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return elementStore;\n      },\n      'bpmn:BoundaryEvent': function(parentGfx, element, options) {\n\n        var semantic = getBusinessObject(element),\n            cancel = semantic.cancelActivity;\n\n        var attrs = {\n          strokeWidth: 1.5,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        };\n\n        if (!cancel) {\n          attrs.strokeDasharray = '6';\n        }\n\n        // apply fillOpacity\n        var outerAttrs = {\n          ...attrs,\n          fillOpacity: 1\n        };\n\n        // apply no-fill\n        var innerAttrs = {\n          ...attrs,\n          fill: 'none'\n        };\n\n        var outer = renderer('bpmn:Event')(parentGfx, element, outerAttrs);\n\n        /* inner path */ drawCircle(parentGfx, element.width, element.height, INNER_OUTER_DIST, innerAttrs);\n\n        if (!options || options.renderIcon !== false) {\n          renderEventContent(element, parentGfx);\n        }\n\n        return outer;\n      },\n      'bpmn:Group': function(parentGfx, element) {\n        return drawRect(parentGfx, element.width, element.height, TASK_BORDER_RADIUS, {\n          stroke: getStrokeColor(element, defaultStrokeColor),\n          strokeWidth: 1.5,\n          strokeDasharray: '10,6,0,6',\n          fill: 'none',\n          pointerEvents: 'none'\n        });\n      },\n      'label': function(parentGfx, element) {\n        return renderExternalLabel(parentGfx, element);\n      },\n      'bpmn:TextAnnotation': function(parentGfx, element) {\n        var textElement = drawRect(parentGfx, element.width, element.height, 0, 0, {\n          'fill': 'none',\n          'stroke': 'none'\n        });\n\n        var textPathData = pathMap.getScaledPath('TEXT_ANNOTATION', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.0,\n            my: 0.0\n          }\n        });\n\n        drawPath(parentGfx, textPathData, {\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        var text = getBusinessObject(element).text || '';\n        renderLabel(parentGfx, text, {\n          box: element,\n          align: 'left-top',\n          padding: 7,\n          style: {\n            fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor)\n          }\n        });\n\n        return textElement;\n      },\n      'ParticipantMultiplicityMarker': function(parentGfx, element) {\n        var markerPath = pathMap.getScaledPath('MARKER_PARALLEL', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: ((element.width / 2) / element.width),\n            my: (element.height - 15) / element.height\n          }\n        });\n\n        drawMarker('participant-multiplicity', parentGfx, markerPath, {\n          strokeWidth: 2,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n      },\n      'SubProcessMarker': function(parentGfx, element) {\n        var markerRect = drawRect(parentGfx, 14, 14, 0, {\n          strokeWidth: 1,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        // Process marker is placed in the middle of the box\n        // therefore fixed values can be used here\n        translate$1(markerRect, element.width / 2 - 7.5, element.height - 20);\n\n        var markerPath = pathMap.getScaledPath('MARKER_SUB_PROCESS', {\n          xScaleFactor: 1.5,\n          yScaleFactor: 1.5,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: (element.width / 2 - 7.5) / element.width,\n            my: (element.height - 20) / element.height\n          }\n        });\n\n        drawMarker('sub-process', parentGfx, markerPath, {\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n      },\n      'ParallelMarker': function(parentGfx, element, position) {\n        var markerPath = pathMap.getScaledPath('MARKER_PARALLEL', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: ((element.width / 2 + position.parallel) / element.width),\n            my: (element.height - 20) / element.height\n          }\n        });\n\n        drawMarker('parallel', parentGfx, markerPath, {\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n      },\n      'SequentialMarker': function(parentGfx, element, position) {\n        var markerPath = pathMap.getScaledPath('MARKER_SEQUENTIAL', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: ((element.width / 2 + position.seq) / element.width),\n            my: (element.height - 19) / element.height\n          }\n        });\n\n        drawMarker('sequential', parentGfx, markerPath, {\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n      },\n      'CompensationMarker': function(parentGfx, element, position) {\n        var markerMath = pathMap.getScaledPath('MARKER_COMPENSATION', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: ((element.width / 2 + position.compensation) / element.width),\n            my: (element.height - 13) / element.height\n          }\n        });\n\n        drawMarker('compensation', parentGfx, markerMath, {\n          strokeWidth: 1,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n      },\n      'LoopMarker': function(parentGfx, element, position) {\n        var markerPath = pathMap.getScaledPath('MARKER_LOOP', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: ((element.width / 2 + position.loop) / element.width),\n            my: (element.height - 7) / element.height\n          }\n        });\n\n        drawMarker('loop', parentGfx, markerPath, {\n          strokeWidth: 1.5,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor),\n          strokeMiterlimit: 0.5\n        });\n      },\n      'AdhocMarker': function(parentGfx, element, position) {\n        var markerPath = pathMap.getScaledPath('MARKER_ADHOC', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: ((element.width / 2 + position.adhoc) / element.width),\n            my: (element.height - 15) / element.height\n          }\n        });\n\n        drawMarker('adhoc', parentGfx, markerPath, {\n          strokeWidth: 1,\n          fill: getStrokeColor(element, defaultStrokeColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n      }\n    };\n\n    function attachTaskMarkers(parentGfx, element, taskMarkers) {\n      var obj = getBusinessObject(element);\n\n      var subprocess = taskMarkers && taskMarkers.indexOf('SubProcessMarker') !== -1;\n      var position;\n\n      if (subprocess) {\n        position = {\n          seq: -21,\n          parallel: -22,\n          compensation: -42,\n          loop: -18,\n          adhoc: 10\n        };\n      } else {\n        position = {\n          seq: -3,\n          parallel: -6,\n          compensation: -27,\n          loop: 0,\n          adhoc: 10\n        };\n      }\n\n      forEach$1(taskMarkers, function(marker) {\n        renderer(marker)(parentGfx, element, position);\n      });\n\n      if (obj.isForCompensation) {\n        renderer('CompensationMarker')(parentGfx, element, position);\n      }\n\n      if (obj.$type === 'bpmn:AdHocSubProcess') {\n        renderer('AdhocMarker')(parentGfx, element, position);\n      }\n\n      var loopCharacteristics = obj.loopCharacteristics,\n          isSequential = loopCharacteristics && loopCharacteristics.isSequential;\n\n      if (loopCharacteristics) {\n\n        if (isSequential === undefined) {\n          renderer('LoopMarker')(parentGfx, element, position);\n        }\n\n        if (isSequential === false) {\n          renderer('ParallelMarker')(parentGfx, element, position);\n        }\n\n        if (isSequential === true) {\n          renderer('SequentialMarker')(parentGfx, element, position);\n        }\n      }\n    }\n\n    function renderDataItemCollection(parentGfx, element) {\n\n      var yPosition = (element.height - 18) / element.height;\n\n      var pathData = pathMap.getScaledPath('DATA_OBJECT_COLLECTION_PATH', {\n        xScaleFactor: 1,\n        yScaleFactor: 1,\n        containerWidth: element.width,\n        containerHeight: element.height,\n        position: {\n          mx: 0.33,\n          my: yPosition\n        }\n      });\n\n      /* collection path */ drawPath(parentGfx, pathData, {\n        strokeWidth: 2\n      });\n    }\n\n\n    // extension API, use at your own risk\n    this._drawPath = drawPath;\n\n    this._renderer = renderer;\n  }\n\n\n  e(BpmnRenderer, BaseRenderer);\n\n  BpmnRenderer.$inject = [\n    'config.bpmnRenderer',\n    'eventBus',\n    'styles',\n    'pathMap',\n    'canvas',\n    'textRenderer'\n  ];\n\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  BpmnRenderer.prototype.canRender = function(element) {\n    return is$1(element, 'bpmn:BaseElement');\n  };\n\n  /**\n   * Draw shape into parentGfx.\n   *\n   * @param {SVGElement} parentGfx\n   * @param {Element} element\n   *\n   * @return {SVGElement} mainGfx\n   */\n  BpmnRenderer.prototype.drawShape = function(parentGfx, element) {\n    var type = element.type;\n    var h = this._renderer(type);\n\n    /* jshint -W040 */\n    return h(parentGfx, element);\n  };\n\n  /**\n   * Draw connection into parentGfx.\n   *\n   * @param {SVGElement} parentGfx\n   * @param {Element} element\n   *\n   * @return {SVGElement} mainGfx\n   */\n  BpmnRenderer.prototype.drawConnection = function(parentGfx, element) {\n    var type = element.type;\n    var h = this._renderer(type);\n\n    /* jshint -W040 */\n    return h(parentGfx, element);\n  };\n\n  /**\n   * Get shape path.\n   *\n   * @param {Element} element\n   *\n   * @return {string} path\n   */\n  BpmnRenderer.prototype.getShapePath = function(element) {\n\n    if (is$1(element, 'bpmn:Event')) {\n      return getCirclePath(element);\n    }\n\n    if (is$1(element, 'bpmn:Activity')) {\n      return getRoundRectPath(element, TASK_BORDER_RADIUS);\n    }\n\n    if (is$1(element, 'bpmn:Gateway')) {\n      return getDiamondPath(element);\n    }\n\n    return getRectPath(element);\n  };\n\n  /**\n   * @typedef {import('../util/Types').Dimensions} Dimensions\n   *\n   * @typedef { {\n   *   top: number;\n   *   left: number;\n   *   right: number;\n   *   bottom: number;\n   * } } Padding\n   *\n   * @typedef { number | Partial<Padding> } PaddingConfig\n   *\n   * @typedef { {\n   *   horizontal: 'center' | 'left';\n   *   vertical: 'top' | 'center';\n   * } } Alignment\n   *\n   *  @typedef { 'center-middle' | 'center-top' } AlignmentConfig\n   *\n   * @typedef { Partial<{\n   *   align: AlignmentConfig;\n   *   style: Record<string, number | string>;\n   *   padding: PaddingConfig;\n   * }> } BaseTextConfig\n   *\n   * @typedef { BaseTextConfig & Partial<{\n   *   size: Dimensions;\n   * }> } TextConfig\n   *\n   * @typedef { BaseTextConfig & Partial<{\n   *   box: Dimensions;\n   *   fitBox: boolean;\n   * }> } TextLayoutConfig\n   *\n   *  @typedef { Dimensions & {\n   *  text: string;\n   * } } LineDescriptor\n   */\n\n  var DEFAULT_BOX_PADDING = 0;\n\n  var DEFAULT_LABEL_SIZE = {\n    width: 150,\n    height: 50\n  };\n\n\n  /**\n   * @param {AlignmentConfig} align\n   * @return {Alignment}\n   */\n  function parseAlign(align) {\n\n    var parts = align.split('-');\n\n    return {\n      horizontal: parts[0] || 'center',\n      vertical: parts[1] || 'top'\n    };\n  }\n\n  /**\n   * @param {PaddingConfig} padding\n   *\n   * @return {Padding}\n   */\n  function parsePadding(padding) {\n\n    if (isObject(padding)) {\n      return assign$1({ top: 0, left: 0, right: 0, bottom: 0 }, padding);\n    } else {\n      return {\n        top: padding,\n        left: padding,\n        right: padding,\n        bottom: padding\n      };\n    }\n  }\n\n  /**\n   * @param {string} text\n   * @param {SVGTextElement} fakeText\n   *\n   * @return {import('../util/Types').Dimensions}\n   */\n  function getTextBBox(text, fakeText) {\n\n    fakeText.textContent = text;\n\n    var textBBox;\n\n    try {\n      var bbox,\n          emptyLine = text === '';\n\n      // add dummy text, when line is empty to\n      // determine correct height\n      fakeText.textContent = emptyLine ? 'dummy' : text;\n\n      textBBox = fakeText.getBBox();\n\n      // take text rendering related horizontal\n      // padding into account\n      bbox = {\n        width: textBBox.width + textBBox.x * 2,\n        height: textBBox.height\n      };\n\n      if (emptyLine) {\n\n        // correct width\n        bbox.width = 0;\n      }\n\n      return bbox;\n    } catch (e) {\n      return { width: 0, height: 0 };\n    }\n  }\n\n\n  /**\n   * Layout the next line and return the layouted element.\n   *\n   * Alters the lines passed.\n   *\n   * @param {string[]} lines\n   * @param {number} maxWidth\n   * @param {SVGTextElement} fakeText\n   *\n   * @return {LineDescriptor} the line descriptor\n   */\n  function layoutNext(lines, maxWidth, fakeText) {\n\n    var originalLine = lines.shift(),\n        fitLine = originalLine;\n\n    var textBBox;\n\n    for (;;) {\n      textBBox = getTextBBox(fitLine, fakeText);\n\n      textBBox.width = fitLine ? textBBox.width : 0;\n\n      // try to fit\n      if (fitLine === ' ' || fitLine === '' || textBBox.width < Math.round(maxWidth) || fitLine.length < 2) {\n        return fit(lines, fitLine, originalLine, textBBox);\n      }\n\n      fitLine = shortenLine(fitLine, textBBox.width, maxWidth);\n    }\n  }\n\n  /**\n   * @param {string[]} lines\n   * @param {string} fitLine\n   * @param {string} originalLine\n   * @param {Dimensions} textBBox\n   *\n   * @return {LineDescriptor}\n   */\n  function fit(lines, fitLine, originalLine, textBBox) {\n    if (fitLine.length < originalLine.length) {\n      var remainder = originalLine.slice(fitLine.length).trim();\n\n      lines.unshift(remainder);\n    }\n\n    return {\n      width: textBBox.width,\n      height: textBBox.height,\n      text: fitLine\n    };\n  }\n\n  var SOFT_BREAK = '\\u00AD';\n\n\n  /**\n   * Shortens a line based on spacing and hyphens.\n   * Returns the shortened result on success.\n   *\n   * @param {string} line\n   * @param {number} maxLength the maximum characters of the string\n   *\n   * @return {string} the shortened string\n   */\n  function semanticShorten(line, maxLength) {\n\n    var parts = line.split(/(\\s|-|\\u00AD)/g),\n        part,\n        shortenedParts = [],\n        length = 0;\n\n    // try to shorten via break chars\n    if (parts.length > 1) {\n\n      while ((part = parts.shift())) {\n        if (part.length + length < maxLength) {\n          shortenedParts.push(part);\n          length += part.length;\n        } else {\n\n          // remove previous part, too if hyphen does not fit anymore\n          if (part === '-' || part === SOFT_BREAK) {\n            shortenedParts.pop();\n          }\n\n          break;\n        }\n      }\n    }\n\n    var last = shortenedParts[shortenedParts.length - 1];\n\n    // translate trailing soft break to actual hyphen\n    if (last && last === SOFT_BREAK) {\n      shortenedParts[shortenedParts.length - 1] = '-';\n    }\n\n    return shortenedParts.join('');\n  }\n\n\n  /**\n   * @param {string} line\n   * @param {number} width\n   * @param {number} maxWidth\n   *\n   * @return {string}\n   */\n  function shortenLine(line, width, maxWidth) {\n    var length = Math.max(line.length * (maxWidth / width), 1);\n\n    // try to shorten semantically (i.e. based on spaces and hyphens)\n    var shortenedLine = semanticShorten(line, length);\n\n    if (!shortenedLine) {\n\n      // force shorten by cutting the long word\n      shortenedLine = line.slice(0, Math.max(Math.round(length - 1), 1));\n    }\n\n    return shortenedLine;\n  }\n\n\n  /**\n   * @return {SVGSVGElement}\n   */\n  function getHelperSvg() {\n    var helperSvg = document.getElementById('helper-svg');\n\n    if (!helperSvg) {\n      helperSvg = create$1('svg');\n\n      attr$1(helperSvg, {\n        id: 'helper-svg'\n      });\n\n      assign(helperSvg, {\n        visibility: 'hidden',\n        position: 'fixed',\n        width: 0,\n        height: 0\n      });\n\n      document.body.appendChild(helperSvg);\n    }\n\n    return helperSvg;\n  }\n\n\n  /**\n   * Creates a new label utility\n   *\n   * @param {TextConfig} config\n   */\n  function Text(config) {\n\n    this._config = assign$1({}, {\n      size: DEFAULT_LABEL_SIZE,\n      padding: DEFAULT_BOX_PADDING,\n      style: {},\n      align: 'center-top'\n    }, config || {});\n  }\n\n  /**\n   * Returns the layouted text as an SVG element.\n   *\n   * @param {string} text\n   * @param {TextLayoutConfig} options\n   *\n   * @return {SVGElement}\n   */\n  Text.prototype.createText = function(text, options) {\n    return this.layoutText(text, options).element;\n  };\n\n  /**\n   * Returns a labels layouted dimensions.\n   *\n   * @param {string} text to layout\n   * @param {TextLayoutConfig} options\n   *\n   * @return {Dimensions}\n   */\n  Text.prototype.getDimensions = function(text, options) {\n    return this.layoutText(text, options).dimensions;\n  };\n\n  /**\n   * Creates and returns a label and its bounding box.\n   *\n   * @param {string} text the text to render on the label\n   * @param {TextLayoutConfig} options\n   *\n   * @return { {\n   *   element: SVGElement,\n   *   dimensions: Dimensions\n   * } }\n   */\n  Text.prototype.layoutText = function(text, options) {\n    var box = assign$1({}, this._config.size, options.box),\n        style = assign$1({}, this._config.style, options.style),\n        align = parseAlign(options.align || this._config.align),\n        padding = parsePadding(options.padding !== undefined ? options.padding : this._config.padding),\n        fitBox = options.fitBox || false;\n\n    var lineHeight = getLineHeight(style);\n\n    // we split text by lines and normalize\n    // {soft break} + {line break} => { line break }\n    var lines = text.split(/\\u00AD?\\r?\\n/),\n        layouted = [];\n\n    var maxWidth = box.width - padding.left - padding.right;\n\n    // ensure correct rendering by attaching helper text node to invisible SVG\n    var helperText = create$1('text');\n    attr$1(helperText, { x: 0, y: 0 });\n    attr$1(helperText, style);\n\n    var helperSvg = getHelperSvg();\n\n    append(helperSvg, helperText);\n\n    while (lines.length) {\n      layouted.push(layoutNext(lines, maxWidth, helperText));\n    }\n\n    if (align.vertical === 'middle') {\n      padding.top = padding.bottom = 0;\n    }\n\n    var totalHeight = reduce(layouted, function(sum, line, idx) {\n      return sum + (lineHeight || line.height);\n    }, 0) + padding.top + padding.bottom;\n\n    var maxLineWidth = reduce(layouted, function(sum, line, idx) {\n      return line.width > sum ? line.width : sum;\n    }, 0);\n\n    // the y position of the next line\n    var y = padding.top;\n\n    if (align.vertical === 'middle') {\n      y += (box.height - totalHeight) / 2;\n    }\n\n    // magic number initial offset\n    y -= (lineHeight || layouted[0].height) / 4;\n\n\n    var textElement = create$1('text');\n\n    attr$1(textElement, style);\n\n    // layout each line taking into account that parent\n    // shape might resize to fit text size\n    forEach$1(layouted, function(line) {\n\n      var x;\n\n      y += (lineHeight || line.height);\n\n      switch (align.horizontal) {\n      case 'left':\n        x = padding.left;\n        break;\n\n      case 'right':\n        x = ((fitBox ? maxLineWidth : maxWidth)\n          - padding.right - line.width);\n        break;\n\n      default:\n\n        // aka center\n        x = Math.max((((fitBox ? maxLineWidth : maxWidth)\n          - line.width) / 2 + padding.left), 0);\n      }\n\n      var tspan = create$1('tspan');\n      attr$1(tspan, { x: x, y: y });\n\n      tspan.textContent = line.text;\n\n      append(textElement, tspan);\n    });\n\n    remove$2(helperText);\n\n    var dimensions = {\n      width: maxLineWidth,\n      height: totalHeight\n    };\n\n    return {\n      dimensions: dimensions,\n      element: textElement\n    };\n  };\n\n\n  function getLineHeight(style) {\n    if ('fontSize' in style && 'lineHeight' in style) {\n      return style.lineHeight * parseInt(style.fontSize, 10);\n    }\n  }\n\n  var DEFAULT_FONT_SIZE = 12;\n  var LINE_HEIGHT_RATIO = 1.2;\n\n  var MIN_TEXT_ANNOTATION_HEIGHT = 30;\n\n  /**\n   * @typedef { {\n   *   fontFamily: string;\n   *   fontSize: number;\n   *   fontWeight: string;\n   *   lineHeight: number;\n   * } } TextRendererStyle\n   *\n   * @typedef { {\n   *   defaultStyle?: Partial<TextRendererStyle>;\n   *   externalStyle?: Partial<TextRendererStyle>;\n   * } } TextRendererConfig\n   *\n   * @typedef { import('diagram-js/lib/util/Text').TextLayoutConfig } TextLayoutConfig\n   *\n   * @typedef { import('diagram-js/lib/util/Types').Rect } Rect\n   */\n\n\n  /**\n   * Renders text and computes text bounding boxes.\n   *\n   * @param {TextRendererConfig} [config]\n   */\n  function TextRenderer(config) {\n\n    var defaultStyle = assign$1({\n      fontFamily: 'Arial, sans-serif',\n      fontSize: DEFAULT_FONT_SIZE,\n      fontWeight: 'normal',\n      lineHeight: LINE_HEIGHT_RATIO\n    }, config && config.defaultStyle || {});\n\n    var fontSize = parseInt(defaultStyle.fontSize, 10) - 1;\n\n    var externalStyle = assign$1({}, defaultStyle, {\n      fontSize: fontSize\n    }, config && config.externalStyle || {});\n\n    var textUtil = new Text({\n      style: defaultStyle\n    });\n\n    /**\n     * Get the new bounds of an externally rendered,\n     * layouted label.\n     *\n     * @param {Rect} bounds\n     * @param {string} text\n     *\n     * @return {Rect}\n     */\n    this.getExternalLabelBounds = function(bounds, text) {\n\n      var layoutedDimensions = textUtil.getDimensions(text, {\n        box: {\n          width: 90,\n          height: 30\n        },\n        style: externalStyle\n      });\n\n      // resize label shape to fit label text\n      return {\n        x: Math.round(bounds.x + bounds.width / 2 - layoutedDimensions.width / 2),\n        y: Math.round(bounds.y),\n        width: Math.ceil(layoutedDimensions.width),\n        height: Math.ceil(layoutedDimensions.height)\n      };\n\n    };\n\n    /**\n     * Get the new bounds of text annotation.\n     *\n     * @param {Rect} bounds\n     * @param {string} text\n     *\n     * @return {Rect}\n     */\n    this.getTextAnnotationBounds = function(bounds, text) {\n\n      var layoutedDimensions = textUtil.getDimensions(text, {\n        box: bounds,\n        style: defaultStyle,\n        align: 'left-top',\n        padding: 5\n      });\n\n      return {\n        x: bounds.x,\n        y: bounds.y,\n        width: bounds.width,\n        height: Math.max(MIN_TEXT_ANNOTATION_HEIGHT, Math.round(layoutedDimensions.height))\n      };\n    };\n\n    /**\n     * Create a layouted text element.\n     *\n     * @param {string} text\n     * @param {TextLayoutConfig} [options]\n     *\n     * @return {SVGElement} rendered text\n     */\n    this.createText = function(text, options) {\n      return textUtil.createText(text, options || {});\n    };\n\n    /**\n     * Get default text style.\n     */\n    this.getDefaultStyle = function() {\n      return defaultStyle;\n    };\n\n    /**\n     * Get the external text style.\n     */\n    this.getExternalStyle = function() {\n      return externalStyle;\n    };\n\n  }\n\n  TextRenderer.$inject = [\n    'config.textRenderer'\n  ];\n\n  /**\n   * Map containing SVG paths needed by BpmnRenderer\n   */\n  function PathMap() {\n\n    /**\n     * Contains a map of path elements\n     *\n     * <h1>Path definition</h1>\n     * A parameterized path is defined like this:\n     * <pre>\n     * 'GATEWAY_PARALLEL': {\n     *   d: 'm {mx},{my} {e.x0},0 0,{e.x1} {e.x1},0 0,{e.y0} -{e.x1},0 0,{e.y1} ' +\n            '-{e.x0},0 0,-{e.y1} -{e.x1},0 0,-{e.y0} {e.x1},0 z',\n     *   height: 17.5,\n     *   width:  17.5,\n     *   heightElements: [2.5, 7.5],\n     *   widthElements: [2.5, 7.5]\n     * }\n     * </pre>\n     * <p>It's important to specify a correct <b>height and width</b> for the path as the scaling\n     * is based on the ratio between the specified height and width in this object and the\n     * height and width that is set as scale target (Note x,y coordinates will be scaled with\n     * individual ratios).</p>\n     * <p>The '<b>heightElements</b>' and '<b>widthElements</b>' array must contain the values that will be scaled.\n     * The scaling is based on the computed ratios.\n     * Coordinates on the y axis should be in the <b>heightElement</b>'s array, they will be scaled using\n     * the computed ratio coefficient.\n     * In the parameterized path the scaled values can be accessed through the 'e' object in {} brackets.\n     *   <ul>\n     *    <li>The values for the y axis can be accessed in the path string using {e.y0}, {e.y1}, ....</li>\n     *    <li>The values for the x axis can be accessed in the path string using {e.x0}, {e.x1}, ....</li>\n     *   </ul>\n     *   The numbers x0, x1 respectively y0, y1, ... map to the corresponding array index.\n     * </p>\n     */\n    this.pathMap = {\n      'EVENT_MESSAGE': {\n        d: 'm {mx},{my} l 0,{e.y1} l {e.x1},0 l 0,-{e.y1} z l {e.x0},{e.y0} l {e.x0},-{e.y0}',\n        height: 36,\n        width:  36,\n        heightElements: [ 6, 14 ],\n        widthElements: [ 10.5, 21 ]\n      },\n      'EVENT_SIGNAL': {\n        d: 'M {mx},{my} l {e.x0},{e.y0} l -{e.x1},0 Z',\n        height: 36,\n        width: 36,\n        heightElements: [ 18 ],\n        widthElements: [ 10, 20 ]\n      },\n      'EVENT_ESCALATION': {\n        d: 'M {mx},{my} l {e.x0},{e.y0} l -{e.x0},-{e.y1} l -{e.x0},{e.y1} Z',\n        height: 36,\n        width: 36,\n        heightElements: [ 20, 7 ],\n        widthElements: [ 8 ]\n      },\n      'EVENT_CONDITIONAL': {\n        d: 'M {e.x0},{e.y0} l {e.x1},0 l 0,{e.y2} l -{e.x1},0 Z ' +\n           'M {e.x2},{e.y3} l {e.x0},0 ' +\n           'M {e.x2},{e.y4} l {e.x0},0 ' +\n           'M {e.x2},{e.y5} l {e.x0},0 ' +\n           'M {e.x2},{e.y6} l {e.x0},0 ' +\n           'M {e.x2},{e.y7} l {e.x0},0 ' +\n           'M {e.x2},{e.y8} l {e.x0},0 ',\n        height: 36,\n        width:  36,\n        heightElements: [ 8.5, 14.5, 18, 11.5, 14.5, 17.5, 20.5, 23.5, 26.5 ],\n        widthElements:  [ 10.5, 14.5, 12.5 ]\n      },\n      'EVENT_LINK': {\n        d: 'm {mx},{my} 0,{e.y0} -{e.x1},0 0,{e.y1} {e.x1},0 0,{e.y0} {e.x0},-{e.y2} -{e.x0},-{e.y2} z',\n        height: 36,\n        width: 36,\n        heightElements: [ 4.4375, 6.75, 7.8125 ],\n        widthElements: [ 9.84375, 13.5 ]\n      },\n      'EVENT_ERROR': {\n        d: 'm {mx},{my} {e.x0},-{e.y0} {e.x1},-{e.y1} {e.x2},{e.y2} {e.x3},-{e.y3} -{e.x4},{e.y4} -{e.x5},-{e.y5} z',\n        height: 36,\n        width: 36,\n        heightElements: [ 0.023, 8.737, 8.151, 16.564, 10.591, 8.714 ],\n        widthElements: [ 0.085, 6.672, 6.97, 4.273, 5.337, 6.636 ]\n      },\n      'EVENT_CANCEL_45': {\n        d: 'm {mx},{my} -{e.x1},0 0,{e.x0} {e.x1},0 0,{e.y1} {e.x0},0 ' +\n          '0,-{e.y1} {e.x1},0 0,-{e.y0} -{e.x1},0 0,-{e.y1} -{e.x0},0 z',\n        height: 36,\n        width: 36,\n        heightElements: [ 4.75, 8.5 ],\n        widthElements: [ 4.75, 8.5 ]\n      },\n      'EVENT_COMPENSATION': {\n        d: 'm {mx},{my} {e.x0},-{e.y0} 0,{e.y1} z m {e.x1},-{e.y2} {e.x2},-{e.y3} 0,{e.y1} -{e.x2},-{e.y3} z',\n        height: 36,\n        width: 36,\n        heightElements: [ 6.5, 13, 0.4, 6.1 ],\n        widthElements: [ 9, 9.3, 8.7 ]\n      },\n      'EVENT_TIMER_WH': {\n        d: 'M {mx},{my} l {e.x0},-{e.y0} m -{e.x0},{e.y0} l {e.x1},{e.y1} ',\n        height: 36,\n        width:  36,\n        heightElements: [ 10, 2 ],\n        widthElements: [ 3, 7 ]\n      },\n      'EVENT_TIMER_LINE': {\n        d:  'M {mx},{my} ' +\n            'm {e.x0},{e.y0} l -{e.x1},{e.y1} ',\n        height: 36,\n        width:  36,\n        heightElements: [ 10, 3 ],\n        widthElements: [ 0, 0 ]\n      },\n      'EVENT_MULTIPLE': {\n        d:'m {mx},{my} {e.x1},-{e.y0} {e.x1},{e.y0} -{e.x0},{e.y1} -{e.x2},0 z',\n        height: 36,\n        width:  36,\n        heightElements: [ 6.28099, 12.56199 ],\n        widthElements: [ 3.1405, 9.42149, 12.56198 ]\n      },\n      'EVENT_PARALLEL_MULTIPLE': {\n        d:'m {mx},{my} {e.x0},0 0,{e.y1} {e.x1},0 0,{e.y0} -{e.x1},0 0,{e.y1} ' +\n          '-{e.x0},0 0,-{e.y1} -{e.x1},0 0,-{e.y0} {e.x1},0 z',\n        height: 36,\n        width:  36,\n        heightElements: [ 2.56228, 7.68683 ],\n        widthElements: [ 2.56228, 7.68683 ]\n      },\n      'GATEWAY_EXCLUSIVE': {\n        d:'m {mx},{my} {e.x0},{e.y0} {e.x1},{e.y0} {e.x2},0 {e.x4},{e.y2} ' +\n                      '{e.x4},{e.y1} {e.x2},0 {e.x1},{e.y3} {e.x0},{e.y3} ' +\n                      '{e.x3},0 {e.x5},{e.y1} {e.x5},{e.y2} {e.x3},0 z',\n        height: 17.5,\n        width:  17.5,\n        heightElements: [ 8.5, 6.5312, -6.5312, -8.5 ],\n        widthElements:  [ 6.5, -6.5, 3, -3, 5, -5 ]\n      },\n      'GATEWAY_PARALLEL': {\n        d:'m {mx},{my} 0,{e.y1} -{e.x1},0 0,{e.y0} {e.x1},0 0,{e.y1} {e.x0},0 ' +\n          '0,-{e.y1} {e.x1},0 0,-{e.y0} -{e.x1},0 0,-{e.y1} -{e.x0},0 z',\n        height: 30,\n        width:  30,\n        heightElements: [ 5, 12.5 ],\n        widthElements: [ 5, 12.5 ]\n      },\n      'GATEWAY_EVENT_BASED': {\n        d:'m {mx},{my} {e.x0},{e.y0} {e.x0},{e.y1} {e.x1},{e.y2} {e.x2},0 z',\n        height: 11,\n        width:  11,\n        heightElements: [ -6, 6, 12, -12 ],\n        widthElements: [ 9, -3, -12 ]\n      },\n      'GATEWAY_COMPLEX': {\n        d:'m {mx},{my} 0,{e.y0} -{e.x0},-{e.y1} -{e.x1},{e.y2} {e.x0},{e.y1} -{e.x2},0 0,{e.y3} ' +\n          '{e.x2},0  -{e.x0},{e.y1} l {e.x1},{e.y2} {e.x0},-{e.y1} 0,{e.y0} {e.x3},0 0,-{e.y0} {e.x0},{e.y1} ' +\n          '{e.x1},-{e.y2} -{e.x0},-{e.y1} {e.x2},0 0,-{e.y3} -{e.x2},0 {e.x0},-{e.y1} -{e.x1},-{e.y2} ' +\n          '-{e.x0},{e.y1} 0,-{e.y0} -{e.x3},0 z',\n        height: 17.125,\n        width:  17.125,\n        heightElements: [ 4.875, 3.4375, 2.125, 3 ],\n        widthElements: [ 3.4375, 2.125, 4.875, 3 ]\n      },\n      'DATA_OBJECT_PATH': {\n        d:'m 0,0 {e.x1},0 {e.x0},{e.y0} 0,{e.y1} -{e.x2},0 0,-{e.y2} {e.x1},0 0,{e.y0} {e.x0},0',\n        height: 61,\n        width:  51,\n        heightElements: [ 10, 50, 60 ],\n        widthElements: [ 10, 40, 50, 60 ]\n      },\n      'DATA_OBJECT_COLLECTION_PATH': {\n        d: 'm{mx},{my} m 3,2 l 0,10 m 3,-10 l 0,10 m 3,-10 l 0,10',\n        height: 10,\n        width: 10,\n        heightElements: [],\n        widthElements: []\n      },\n      'DATA_ARROW': {\n        d:'m 5,9 9,0 0,-3 5,5 -5,5 0,-3 -9,0 z',\n        height: 61,\n        width:  51,\n        heightElements: [],\n        widthElements: []\n      },\n      'DATA_STORE': {\n        d:'m  {mx},{my} ' +\n          'l  0,{e.y2} ' +\n          'c  {e.x0},{e.y1} {e.x1},{e.y1}  {e.x2},0 ' +\n          'l  0,-{e.y2} ' +\n          'c -{e.x0},-{e.y1} -{e.x1},-{e.y1} -{e.x2},0' +\n          'c  {e.x0},{e.y1} {e.x1},{e.y1}  {e.x2},0 ' +\n          'm  -{e.x2},{e.y0}' +\n          'c  {e.x0},{e.y1} {e.x1},{e.y1} {e.x2},0' +\n          'm  -{e.x2},{e.y0}' +\n          'c  {e.x0},{e.y1} {e.x1},{e.y1}  {e.x2},0',\n        height: 61,\n        width:  61,\n        heightElements: [ 7, 10, 45 ],\n        widthElements:  [ 2, 58, 60 ]\n      },\n      'TEXT_ANNOTATION': {\n        d: 'm {mx}, {my} m 10,0 l -10,0 l 0,{e.y0} l 10,0',\n        height: 30,\n        width: 10,\n        heightElements: [ 30 ],\n        widthElements: [ 10 ]\n      },\n      'MARKER_SUB_PROCESS': {\n        d: 'm{mx},{my} m 7,2 l 0,10 m -5,-5 l 10,0',\n        height: 10,\n        width: 10,\n        heightElements: [],\n        widthElements: []\n      },\n      'MARKER_PARALLEL': {\n        d: 'm{mx},{my} m 3,2 l 0,10 m 3,-10 l 0,10 m 3,-10 l 0,10',\n        height: 10,\n        width: 10,\n        heightElements: [],\n        widthElements: []\n      },\n      'MARKER_SEQUENTIAL': {\n        d: 'm{mx},{my} m 0,3 l 10,0 m -10,3 l 10,0 m -10,3 l 10,0',\n        height: 10,\n        width: 10,\n        heightElements: [],\n        widthElements: []\n      },\n      'MARKER_COMPENSATION': {\n        d: 'm {mx},{my} 7,-5 0,10 z m 7.1,-0.3 6.9,-4.7 0,10 -6.9,-4.7 z',\n        height: 10,\n        width: 21,\n        heightElements: [],\n        widthElements: []\n      },\n      'MARKER_LOOP': {\n        d: 'm {mx},{my} c 3.526979,0 6.386161,-2.829858 6.386161,-6.320661 0,-3.490806 -2.859182,-6.320661 ' +\n          '-6.386161,-6.320661 -3.526978,0 -6.38616,2.829855 -6.38616,6.320661 0,1.745402 ' +\n          '0.714797,3.325567 1.870463,4.469381 0.577834,0.571908 1.265885,1.034728 2.029916,1.35457 ' +\n          'l -0.718163,-3.909793 m 0.718163,3.909793 -3.885211,0.802902',\n        height: 13.9,\n        width: 13.7,\n        heightElements: [],\n        widthElements: []\n      },\n      'MARKER_ADHOC': {\n        d: 'm {mx},{my} m 0.84461,2.64411 c 1.05533,-1.23780996 2.64337,-2.07882 4.29653,-1.97997996 2.05163,0.0805 ' +\n          '3.85579,1.15803 5.76082,1.79107 1.06385,0.34139996 2.24454,0.1438 3.18759,-0.43767 0.61743,-0.33642 ' +\n          '1.2775,-0.64078 1.7542,-1.17511 0,0.56023 0,1.12046 0,1.6807 -0.98706,0.96237996 -2.29792,1.62393996 ' +\n          '-3.6918,1.66181996 -1.24459,0.0927 -2.46671,-0.2491 -3.59505,-0.74812 -1.35789,-0.55965 ' +\n          '-2.75133,-1.33436996 -4.27027,-1.18121996 -1.37741,0.14601 -2.41842,1.13685996 -3.44288,1.96782996 z',\n        height: 4,\n        width: 15,\n        heightElements: [],\n        widthElements: []\n      },\n      'TASK_TYPE_SEND': {\n        d: 'm {mx},{my} l 0,{e.y1} l {e.x1},0 l 0,-{e.y1} z l {e.x0},{e.y0} l {e.x0},-{e.y0}',\n        height: 14,\n        width:  21,\n        heightElements: [ 6, 14 ],\n        widthElements: [ 10.5, 21 ]\n      },\n      'TASK_TYPE_SCRIPT': {\n        d: 'm {mx},{my} c 9.966553,-6.27276 -8.000926,-7.91932 2.968968,-14.938 l -8.802728,0 ' +\n          'c -10.969894,7.01868 6.997585,8.66524 -2.968967,14.938 z ' +\n          'm -7,-12 l 5,0 ' +\n          'm -4.5,3 l 4.5,0 ' +\n          'm -3,3 l 5,0' +\n          'm -4,3 l 5,0',\n        height: 15,\n        width:  12.6,\n        heightElements: [ 6, 14 ],\n        widthElements: [ 10.5, 21 ]\n      },\n      'TASK_TYPE_USER_1': {\n        d: 'm {mx},{my} c 0.909,-0.845 1.594,-2.049 1.594,-3.385 0,-2.554 -1.805,-4.62199999 ' +\n          '-4.357,-4.62199999 -2.55199998,0 -4.28799998,2.06799999 -4.28799998,4.62199999 0,1.348 ' +\n          '0.974,2.562 1.89599998,3.405 -0.52899998,0.187 -5.669,2.097 -5.794,4.7560005 v 6.718 ' +\n          'h 17 v -6.718 c 0,-2.2980005 -5.5279996,-4.5950005 -6.0509996,-4.7760005 z' +\n          'm -8,6 l 0,5.5 m 11,0 l 0,-5'\n      },\n      'TASK_TYPE_USER_2': {\n        d: 'm {mx},{my} m 2.162,1.009 c 0,2.4470005 -2.158,4.4310005 -4.821,4.4310005 ' +\n          '-2.66499998,0 -4.822,-1.981 -4.822,-4.4310005 '\n      },\n      'TASK_TYPE_USER_3': {\n        d: 'm {mx},{my} m -6.9,-3.80 c 0,0 2.25099998,-2.358 4.27399998,-1.177 2.024,1.181 4.221,1.537 ' +\n          '4.124,0.965 -0.098,-0.57 -0.117,-3.79099999 -4.191,-4.13599999 -3.57499998,0.001 ' +\n          '-4.20799998,3.36699999 -4.20699998,4.34799999 z'\n      },\n      'TASK_TYPE_MANUAL': {\n        d: 'm {mx},{my} c 0.234,-0.01 5.604,0.008 8.029,0.004 0.808,0 1.271,-0.172 1.417,-0.752 0.227,-0.898 ' +\n          '-0.334,-1.314 -1.338,-1.316 -2.467,-0.01 -7.886,-0.004 -8.108,-0.004 -0.014,-0.079 0.016,-0.533 0,-0.61 ' +\n          '0.195,-0.042 8.507,0.006 9.616,0.002 0.877,-0.007 1.35,-0.438 1.353,-1.208 0.003,-0.768 -0.479,-1.09 ' +\n          '-1.35,-1.091 -2.968,-0.002 -9.619,-0.013 -9.619,-0.013 v -0.591 c 0,0 5.052,-0.016 7.225,-0.016 ' +\n          '0.888,-0.002 1.354,-0.416 1.351,-1.193 -0.006,-0.761 -0.492,-1.196 -1.361,-1.196 -3.473,-0.005 ' +\n          '-10.86,-0.003 -11.0829995,-0.003 -0.022,-0.047 -0.045,-0.094 -0.069,-0.139 0.3939995,-0.319 ' +\n          '2.0409995,-1.626 2.4149995,-2.017 0.469,-0.4870005 0.519,-1.1650005 0.162,-1.6040005 -0.414,-0.511 ' +\n          '-0.973,-0.5 -1.48,-0.236 -1.4609995,0.764 -6.5999995,3.6430005 -7.7329995,4.2710005 -0.9,0.499 ' +\n          '-1.516,1.253 -1.882,2.19 -0.37000002,0.95 -0.17,2.01 -0.166,2.979 0.004,0.718 -0.27300002,1.345 ' +\n          '-0.055,2.063 0.629,2.087 2.425,3.312 4.859,3.318 4.6179995,0.014 9.2379995,-0.139 13.8569995,-0.158 ' +\n          '0.755,-0.004 1.171,-0.301 1.182,-1.033 0.012,-0.754 -0.423,-0.969 -1.183,-0.973 -1.778,-0.01 ' +\n          '-5.824,-0.004 -6.04,-0.004 10e-4,-0.084 0.003,-0.586 10e-4,-0.67 z'\n      },\n      'TASK_TYPE_INSTANTIATING_SEND': {\n        d: 'm {mx},{my} l 0,8.4 l 12.6,0 l 0,-8.4 z l 6.3,3.6 l 6.3,-3.6'\n      },\n      'TASK_TYPE_SERVICE': {\n        d: 'm {mx},{my} v -1.71335 c 0.352326,-0.0705 0.703932,-0.17838 1.047628,-0.32133 ' +\n          '0.344416,-0.14465 0.665822,-0.32133 0.966377,-0.52145 l 1.19431,1.18005 1.567487,-1.57688 ' +\n          '-1.195028,-1.18014 c 0.403376,-0.61394 0.683079,-1.29908 0.825447,-2.01824 l 1.622133,-0.01 ' +\n          'v -2.2196 l -1.636514,0.01 c -0.07333,-0.35153 -0.178319,-0.70024 -0.323564,-1.04372 ' +\n          '-0.145244,-0.34406 -0.321407,-0.6644 -0.522735,-0.96217 l 1.131035,-1.13631 -1.583305,-1.56293 ' +\n          '-1.129598,1.13589 c -0.614052,-0.40108 -1.302883,-0.68093 -2.022633,-0.82247 l 0.0093,-1.61852 ' +\n          'h -2.241173 l 0.0042,1.63124 c -0.353763,0.0736 -0.705369,0.17977 -1.049785,0.32371 -0.344415,0.14437 ' +\n          '-0.665102,0.32092 -0.9635006,0.52046 l -1.1698628,-1.15823 -1.5667691,1.5792 1.1684265,1.15669 ' +\n          'c -0.4026573,0.61283 -0.68308,1.29797 -0.8247287,2.01713 l -1.6588041,0.003 v 2.22174 ' +\n          'l 1.6724648,-0.006 c 0.073327,0.35077 0.1797598,0.70243 0.3242851,1.04472 0.1452428,0.34448 ' +\n          '0.3214064,0.6644 0.5227339,0.96066 l -1.1993431,1.19723 1.5840256,1.56011 1.1964668,-1.19348 ' +\n          'c 0.6140517,0.40346 1.3028827,0.68232 2.0233517,0.82331 l 7.19e-4,1.69892 h 2.226848 z ' +\n          'm 0.221462,-3.9957 c -1.788948,0.7502 -3.8576,-0.0928 -4.6097055,-1.87438 -0.7521065,-1.78321 ' +\n          '0.090598,-3.84627 1.8802645,-4.59604 1.78823,-0.74936 3.856881,0.0929 4.608987,1.87437 ' +\n          '0.752106,1.78165 -0.0906,3.84612 -1.879546,4.59605 z'\n      },\n      'TASK_TYPE_SERVICE_FILL': {\n        d: 'm {mx},{my} c -1.788948,0.7502 -3.8576,-0.0928 -4.6097055,-1.87438 -0.7521065,-1.78321 ' +\n          '0.090598,-3.84627 1.8802645,-4.59604 1.78823,-0.74936 3.856881,0.0929 4.608987,1.87437 ' +\n          '0.752106,1.78165 -0.0906,3.84612 -1.879546,4.59605 z'\n      },\n      'TASK_TYPE_BUSINESS_RULE_HEADER': {\n        d: 'm {mx},{my} 0,4 20,0 0,-4 z'\n      },\n      'TASK_TYPE_BUSINESS_RULE_MAIN': {\n        d: 'm {mx},{my} 0,12 20,0 0,-12 z' +\n          'm 0,8 l 20,0 ' +\n          'm -13,-4 l 0,8'\n      },\n      'MESSAGE_FLOW_MARKER': {\n        d: 'm {mx},{my} m -10.5 ,-7 l 0,14 l 21,0 l 0,-14 z l 10.5,6 l 10.5,-6'\n      }\n    };\n\n    /**\n     * Return raw path for the given ID.\n     *\n     * @param {string} pathId\n     *\n     * @return {string} raw path\n     */\n    this.getRawPath = function getRawPath(pathId) {\n      return this.pathMap[pathId].d;\n    };\n\n    /**\n     * Scales the path to the given height and width.\n     * <h1>Use case</h1>\n     * <p>Use case is to scale the content of elements (event, gateways) based\n     * on the element bounding box's size.\n     * </p>\n     * <h1>Why not transform</h1>\n     * <p>Scaling a path with transform() will also scale the stroke and IE does not support\n     * the option 'non-scaling-stroke' to prevent this.\n     * Also there are use cases where only some parts of a path should be\n     * scaled.</p>\n     *\n     * @param {string} pathId The ID of the path.\n     * @param {Object} param <p>\n     *   Example param object scales the path to 60% size of the container (data.width, data.height).\n     *   <pre>\n     *   {\n     *     xScaleFactor: 0.6,\n     *     yScaleFactor:0.6,\n     *     containerWidth: data.width,\n     *     containerHeight: data.height,\n     *     position: {\n     *       mx: 0.46,\n     *       my: 0.2,\n     *     }\n     *   }\n     *   </pre>\n     *   <ul>\n     *    <li>targetpathwidth = xScaleFactor * containerWidth</li>\n     *    <li>targetpathheight = yScaleFactor * containerHeight</li>\n     *    <li>Position is used to set the starting coordinate of the path. M is computed:\n      *    <ul>\n      *      <li>position.x * containerWidth</li>\n      *      <li>position.y * containerHeight</li>\n      *    </ul>\n      *    Center of the container <pre> position: {\n     *       mx: 0.5,\n     *       my: 0.5,\n     *     }</pre>\n     *     Upper left corner of the container\n     *     <pre> position: {\n     *       mx: 0.0,\n     *       my: 0.0,\n     *     }</pre>\n     *    </li>\n     *   </ul>\n     * </p>\n     *\n     * @return {string} scaled path\n     */\n    this.getScaledPath = function getScaledPath(pathId, param) {\n      var rawPath = this.pathMap[pathId];\n\n      // positioning\n      // compute the start point of the path\n      var mx, my;\n\n      if (param.abspos) {\n        mx = param.abspos.x;\n        my = param.abspos.y;\n      } else {\n        mx = param.containerWidth * param.position.mx;\n        my = param.containerHeight * param.position.my;\n      }\n\n      var coordinates = {}; // map for the scaled coordinates\n      if (param.position) {\n\n        // path\n        var heightRatio = (param.containerHeight / rawPath.height) * param.yScaleFactor;\n        var widthRatio = (param.containerWidth / rawPath.width) * param.xScaleFactor;\n\n\n        // Apply height ratio\n        for (var heightIndex = 0; heightIndex < rawPath.heightElements.length; heightIndex++) {\n          coordinates['y' + heightIndex] = rawPath.heightElements[heightIndex] * heightRatio;\n        }\n\n        // Apply width ratio\n        for (var widthIndex = 0; widthIndex < rawPath.widthElements.length; widthIndex++) {\n          coordinates['x' + widthIndex] = rawPath.widthElements[widthIndex] * widthRatio;\n        }\n      }\n\n      // Apply value to raw path\n      var path = format(\n        rawPath.d, {\n          mx: mx,\n          my: my,\n          e: coordinates\n        }\n      );\n      return path;\n    };\n  }\n\n  // helpers //////////////////////\n\n  // copied and adjusted from https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js\n  var tokenRegex = /\\{([^{}]+)\\}/g,\n      objNotationRegex = /(?:(?:^|\\.)(.+?)(?=\\[|\\.|$|\\()|\\[('|\")(.+?)\\2\\])(\\(\\))?/g; // matches .xxxxx or [\"xxxxx\"] to run over object properties\n\n  function replacer(all, key, obj) {\n    var res = obj;\n    key.replace(objNotationRegex, function(all, name, quote, quotedName, isFunc) {\n      name = name || quotedName;\n      if (res) {\n        if (name in res) {\n          res = res[name];\n        }\n        typeof res == 'function' && isFunc && (res = res());\n      }\n    });\n    res = (res == null || res == obj ? all : res) + '';\n\n    return res;\n  }\n\n  function format(str, obj) {\n    return String(str).replace(tokenRegex, function(all, key) {\n      return replacer(all, key, obj);\n    });\n  }\n\n  var DrawModule$1 = {\n    __init__: [ 'bpmnRenderer' ],\n    bpmnRenderer: [ 'type', BpmnRenderer ],\n    textRenderer: [ 'type', TextRenderer ],\n    pathMap: [ 'type', PathMap ]\n  };\n\n  /**\n   * @typedef { {\n   *   [key: string]: string;\n   * } } TranslateReplacements\n   */\n\n  /**\n   * A simple translation stub to be used for multi-language support\n   * in diagrams. Can be easily replaced with a more sophisticated\n   * solution.\n   *\n   * @example\n   *\n   * ```javascript\n   * // use it inside any diagram component by injecting `translate`.\n   *\n   * function MyService(translate) {\n   *   alert(translate('HELLO {you}', { you: 'You!' }));\n   * }\n   * ```\n   *\n   * @param {string} template to interpolate\n   * @param {TranslateReplacements} [replacements] a map with substitutes\n   *\n   * @return {string} the translated string\n   */\n  function translate(template, replacements) {\n\n    replacements = replacements || {};\n\n    return template.replace(/{([^}]+)}/g, function(_, key) {\n      return replacements[key] || '{' + key + '}';\n    });\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var TranslateModule = {\n    translate: [ 'value', translate ]\n  };\n\n  function getDefaultExportFromCjs (x) {\n  \treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n  }\n\n  /**\n   * @param {Point} point\n   *\n   * @returns {Point}\n   */\n  function roundPoint(point) {\n\n    return {\n      x: Math.round(point.x),\n      y: Math.round(point.y)\n    };\n  }\n\n\n  /**\n   * Convert the given bounds to a { top, left, bottom, right } descriptor.\n   *\n   * @param {Point|Rect} bounds\n   *\n   * @return {RectTRBL}\n   */\n  function asTRBL(bounds) {\n    return {\n      top: bounds.y,\n      right: bounds.x + (bounds.width || 0),\n      bottom: bounds.y + (bounds.height || 0),\n      left: bounds.x\n    };\n  }\n\n\n  /**\n   * Convert a { top, left, bottom, right } to an objects bounds.\n   *\n   * @param {RectTRBL} trbl\n   *\n   * @return {Rect}\n   */\n  function asBounds(trbl) {\n    return {\n      x: trbl.left,\n      y: trbl.top,\n      width: trbl.right - trbl.left,\n      height: trbl.bottom - trbl.top\n    };\n  }\n\n\n  /**\n   * Get the mid of the given bounds or point.\n   *\n   * @param {Point|Rect} bounds\n   *\n   * @return {Point}\n   */\n  function getBoundsMid(bounds) {\n    return roundPoint({\n      x: bounds.x + (bounds.width || 0) / 2,\n      y: bounds.y + (bounds.height || 0) / 2\n    });\n  }\n\n\n  /**\n   * Get the mid of the given Connection.\n   *\n   * @param {Connection} connection\n   *\n   * @return {Point}\n   */\n  function getConnectionMid(connection) {\n    var waypoints = connection.waypoints;\n\n    // calculate total length and length of each segment\n    var parts = waypoints.reduce(function(parts, point, index) {\n\n      var lastPoint = waypoints[index - 1];\n\n      if (lastPoint) {\n        var lastPart = parts[parts.length - 1];\n\n        var startLength = lastPart && lastPart.endLength || 0;\n        var length = distance(lastPoint, point);\n\n        parts.push({\n          start: lastPoint,\n          end: point,\n          startLength: startLength,\n          endLength: startLength + length,\n          length: length\n        });\n      }\n\n      return parts;\n    }, []);\n\n    var totalLength = parts.reduce(function(length, part) {\n      return length + part.length;\n    }, 0);\n\n    // find which segement contains middle point\n    var midLength = totalLength / 2;\n\n    var i = 0;\n    var midSegment = parts[i];\n\n    while (midSegment.endLength < midLength) {\n      midSegment = parts[++i];\n    }\n\n    // calculate relative position on mid segment\n    var segmentProgress = (midLength - midSegment.startLength) / midSegment.length;\n\n    var midPoint = {\n      x: midSegment.start.x + (midSegment.end.x - midSegment.start.x) * segmentProgress,\n      y: midSegment.start.y + (midSegment.end.y - midSegment.start.y) * segmentProgress\n    };\n\n    return midPoint;\n  }\n\n\n  /**\n   * Get the mid of the given Element.\n   *\n   * @param {Element} element\n   *\n   * @return {Point}\n   */\n  function getMid(element) {\n    if (isConnection(element)) {\n      return getConnectionMid(element);\n    }\n\n    return getBoundsMid(element);\n  }\n\n  // helpers //////////////////////\n\n  function distance(a, b) {\n    return Math.sqrt(Math.pow(a.x - b.x, 2) + Math.pow(a.y - b.y, 2));\n  }\n\n  function elementToString(e) {\n    if (!e) {\n      return '<null>';\n    }\n\n    return '<' + e.$type + (e.id ? ' id=\"' + e.id : '') + '\" />';\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n   *\n   * @typedef {import('../features/modeling/ElementFactory').default} ElementFactory\n   * @typedef {import('../draw/TextRenderer').default} TextRenderer\n   *\n   * @typedef {import('../model/Types').Element} Element\n   * @typedef {import('../model/Types').Label} Label\n   * @typedef {import('../model/Types').Shape} Shape\n   * @typedef {import('../model/Types').Connection} Connection\n   * @typedef {import('../model/Types').Root} Root\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   */\n\n  /**\n   * @param {ModdleElement} semantic\n   * @param {ModdleElement} di\n   * @param {Object} [attrs=null]\n   *\n   * @return {Object}\n   */\n  function elementData(semantic, di, attrs) {\n    return assign$1({\n      id: semantic.id,\n      type: semantic.$type,\n      businessObject: semantic,\n      di: di\n    }, attrs);\n  }\n\n  function getWaypoints(di, source, target) {\n\n    var waypoints = di.waypoint;\n\n    if (!waypoints || waypoints.length < 2) {\n      return [ getMid(source), getMid(target) ];\n    }\n\n    return waypoints.map(function(p) {\n      return { x: p.x, y: p.y };\n    });\n  }\n\n  function notYetDrawn(translate, semantic, refSemantic, property) {\n    return new Error(translate('element {element} referenced by {referenced}#{property} not yet drawn', {\n      element: elementToString(refSemantic),\n      referenced: elementToString(semantic),\n      property: property\n    }));\n  }\n\n\n  /**\n   * An importer that adds bpmn elements to the canvas\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {ElementFactory} elementFactory\n   * @param {ElementRegistry} elementRegistry\n   * @param {Function} translate\n   * @param {TextRenderer} textRenderer\n   */\n  function BpmnImporter(\n      eventBus, canvas, elementFactory,\n      elementRegistry, translate, textRenderer) {\n\n    this._eventBus = eventBus;\n    this._canvas = canvas;\n    this._elementFactory = elementFactory;\n    this._elementRegistry = elementRegistry;\n    this._translate = translate;\n    this._textRenderer = textRenderer;\n  }\n\n  BpmnImporter.$inject = [\n    'eventBus',\n    'canvas',\n    'elementFactory',\n    'elementRegistry',\n    'translate',\n    'textRenderer'\n  ];\n\n\n  /**\n   * Add a BPMN element (semantic) to the canvas making it a child of the\n   * given parent.\n   *\n   * @param {ModdleElement} semantic\n   * @param {ModdleElement} di\n   * @param {Shape} parentElement\n   *\n   * @return {Shape | Root | Connection}\n   */\n  BpmnImporter.prototype.add = function(semantic, di, parentElement) {\n    var element,\n        translate = this._translate,\n        hidden;\n\n    var parentIndex;\n\n    // ROOT ELEMENT\n    // handle the special case that we deal with a\n    // invisible root element (process, subprocess or collaboration)\n    if (is$1(di, 'bpmndi:BPMNPlane')) {\n\n      var attrs = is$1(semantic, 'bpmn:SubProcess')\n        ? { id: semantic.id + '_plane' }\n        : {};\n\n      // add a virtual element (not being drawn)\n      element = this._elementFactory.createRoot(elementData(semantic, di, attrs));\n\n      this._canvas.addRootElement(element);\n    }\n\n    // SHAPE\n    else if (is$1(di, 'bpmndi:BPMNShape')) {\n\n      var collapsed = !isExpanded(semantic, di),\n          isFrame = isFrameElement$1(semantic);\n\n      hidden = parentElement && (parentElement.hidden || parentElement.collapsed);\n\n      var bounds = di.bounds;\n\n      element = this._elementFactory.createShape(elementData(semantic, di, {\n        collapsed: collapsed,\n        hidden: hidden,\n        x: Math.round(bounds.x),\n        y: Math.round(bounds.y),\n        width: Math.round(bounds.width),\n        height: Math.round(bounds.height),\n        isFrame: isFrame\n      }));\n\n      if (is$1(semantic, 'bpmn:BoundaryEvent')) {\n        this._attachBoundary(semantic, element);\n      }\n\n      // insert lanes behind other flow nodes (cf. #727)\n      if (is$1(semantic, 'bpmn:Lane')) {\n        parentIndex = 0;\n      }\n\n      if (is$1(semantic, 'bpmn:DataStoreReference')) {\n\n        // check whether data store is inside our outside of its semantic parent\n        if (!isPointInsideBBox(parentElement, getMid(bounds))) {\n          parentElement = this._canvas.findRoot(parentElement);\n        }\n      }\n\n      this._canvas.addShape(element, parentElement, parentIndex);\n    }\n\n    // CONNECTION\n    else if (is$1(di, 'bpmndi:BPMNEdge')) {\n\n      var source = this._getSource(semantic),\n          target = this._getTarget(semantic);\n\n      hidden = parentElement && (parentElement.hidden || parentElement.collapsed);\n\n      element = this._elementFactory.createConnection(elementData(semantic, di, {\n        hidden: hidden,\n        source: source,\n        target: target,\n        waypoints: getWaypoints(di, source, target)\n      }));\n\n      if (is$1(semantic, 'bpmn:DataAssociation')) {\n\n        // render always on top; this ensures DataAssociations\n        // are rendered correctly across different \"hacks\" people\n        // love to model such as cross participant / sub process\n        // associations\n        parentElement = this._canvas.findRoot(parentElement);\n      }\n\n      this._canvas.addConnection(element, parentElement, parentIndex);\n    } else {\n      throw new Error(translate('unknown di {di} for element {semantic}', {\n        di: elementToString(di),\n        semantic: elementToString(semantic)\n      }));\n    }\n\n    // (optional) LABEL\n    if (isLabelExternal(semantic) && getLabel(element)) {\n      this.addLabel(semantic, di, element);\n    }\n\n\n    this._eventBus.fire('bpmnElement.added', { element: element });\n\n    return element;\n  };\n\n\n  /**\n   * Attach a boundary element to the given host.\n   *\n   * @param {ModdleElement} boundarySemantic\n   * @param {Shape} boundaryElement\n   */\n  BpmnImporter.prototype._attachBoundary = function(boundarySemantic, boundaryElement) {\n    var translate = this._translate;\n    var hostSemantic = boundarySemantic.attachedToRef;\n\n    if (!hostSemantic) {\n      throw new Error(translate('missing {semantic}#attachedToRef', {\n        semantic: elementToString(boundarySemantic)\n      }));\n    }\n\n    var host = this._elementRegistry.get(hostSemantic.id),\n        attachers = host && host.attachers;\n\n    if (!host) {\n      throw notYetDrawn(translate, boundarySemantic, hostSemantic, 'attachedToRef');\n    }\n\n    // wire element.host <> host.attachers\n    boundaryElement.host = host;\n\n    if (!attachers) {\n      host.attachers = attachers = [];\n    }\n\n    if (attachers.indexOf(boundaryElement) === -1) {\n      attachers.push(boundaryElement);\n    }\n  };\n\n\n  /**\n   * Add a label to a given element.\n   *\n   * @param {ModdleElement} semantic\n   * @param {ModdleElement} di\n   * @param {Element} element\n   *\n   * @return {Label}\n   */\n  BpmnImporter.prototype.addLabel = function(semantic, di, element) {\n    var bounds,\n        text,\n        label;\n\n    bounds = getExternalLabelBounds(di, element);\n\n    text = getLabel(element);\n\n    if (text) {\n\n      // get corrected bounds from actual layouted text\n      bounds = this._textRenderer.getExternalLabelBounds(bounds, text);\n    }\n\n    label = this._elementFactory.createLabel(elementData(semantic, di, {\n      id: semantic.id + '_label',\n      labelTarget: element,\n      type: 'label',\n      hidden: element.hidden || !getLabel(element),\n      x: Math.round(bounds.x),\n      y: Math.round(bounds.y),\n      width: Math.round(bounds.width),\n      height: Math.round(bounds.height)\n    }));\n\n    return this._canvas.addShape(label, element.parent);\n  };\n\n  /**\n   * Get the source or target of the given connection.\n   *\n   * @param {ModdleElement} semantic\n   * @param {'source' | 'target'} side\n   *\n   * @return {Element}\n   */\n  BpmnImporter.prototype._getConnectedElement = function(semantic, side) {\n\n    var element,\n        refSemantic,\n        type = semantic.$type,\n        translate = this._translate;\n\n    refSemantic = semantic[side + 'Ref'];\n\n    // handle mysterious isMany DataAssociation#sourceRef\n    if (side === 'source' && type === 'bpmn:DataInputAssociation') {\n      refSemantic = refSemantic && refSemantic[0];\n    }\n\n    // fix source / target for DataInputAssociation / DataOutputAssociation\n    if (side === 'source' && type === 'bpmn:DataOutputAssociation' ||\n        side === 'target' && type === 'bpmn:DataInputAssociation') {\n\n      refSemantic = semantic.$parent;\n    }\n\n    element = refSemantic && this._getElement(refSemantic);\n\n    if (element) {\n      return element;\n    }\n\n    if (refSemantic) {\n      throw notYetDrawn(translate, semantic, refSemantic, side + 'Ref');\n    } else {\n      throw new Error(translate('{semantic}#{side} Ref not specified', {\n        semantic: elementToString(semantic),\n        side: side\n      }));\n    }\n  };\n\n  BpmnImporter.prototype._getSource = function(semantic) {\n    return this._getConnectedElement(semantic, 'source');\n  };\n\n  BpmnImporter.prototype._getTarget = function(semantic) {\n    return this._getConnectedElement(semantic, 'target');\n  };\n\n\n  BpmnImporter.prototype._getElement = function(semantic) {\n    return this._elementRegistry.get(semantic.id);\n  };\n\n\n  // helpers ////////////////////\n\n  function isPointInsideBBox(bbox, point) {\n    var x = point.x,\n        y = point.y;\n\n    return x >= bbox.x &&\n      x <= bbox.x + bbox.width &&\n      y >= bbox.y &&\n      y <= bbox.y + bbox.height;\n  }\n\n  function isFrameElement$1(semantic) {\n    return is$1(semantic, 'bpmn:Group');\n  }\n\n  var ImportModule = {\n    __depends__: [\n      TranslateModule\n    ],\n    bpmnImporter: [ 'type', BpmnImporter ]\n  };\n\n  var CoreModule$1 = {\n    __depends__: [\n      DrawModule$1,\n      ImportModule\n    ]\n  };\n\n  /**\n   * @typedef {import('../util/Types').Point} Point\n   */\n\n  /**\n   * @param {import('../core/EventBus').Event} event\n   *\n   * @return {Event}\n   */\n  function getOriginal(event) {\n    return event.originalEvent || event.srcEvent;\n  }\n\n  /**\n   * @param {Event} event\n   *\n   * @return {Point|null}\n   */\n  function toPoint(event) {\n\n    if (event.pointers && event.pointers.length) {\n      event = event.pointers[0];\n    }\n\n    if (event.touches && event.touches.length) {\n      event = event.touches[0];\n    }\n\n    return event ? {\n      x: event.clientX,\n      y: event.clientY\n    } : null;\n  }\n\n  function isMac() {\n    return (/mac/i).test(navigator.platform);\n  }\n\n  /**\n   * @param {MouseEvent} event\n   * @param {string} button\n   *\n   * @return {boolean}\n   */\n  function isButton(event, button) {\n    return (getOriginal(event) || event).button === button;\n  }\n\n  /**\n   * @param {MouseEvent} event\n   *\n   * @return {boolean}\n   */\n  function isPrimaryButton(event) {\n\n    // button === 0 -> left áka primary mouse button\n    return isButton(event, 0);\n  }\n\n  /**\n   * @param {MouseEvent} event\n   *\n   * @return {boolean}\n   */\n  function isAuxiliaryButton(event) {\n\n    // button === 1 -> auxiliary áka wheel button\n    return isButton(event, 1);\n  }\n\n  /**\n   * @param {MouseEvent} event\n   *\n   * @return {boolean}\n   */\n  function hasPrimaryModifier(event) {\n    var originalEvent = getOriginal(event) || event;\n\n    if (!isPrimaryButton(event)) {\n      return false;\n    }\n\n    // Use cmd as primary modifier key for mac OS\n    if (isMac()) {\n      return originalEvent.metaKey;\n    } else {\n      return originalEvent.ctrlKey;\n    }\n  }\n\n  /**\n   * @param {MouseEvent} event\n   *\n   * @return {boolean}\n   */\n  function hasSecondaryModifier(event) {\n    var originalEvent = getOriginal(event) || event;\n\n    return isPrimaryButton(event) && originalEvent.shiftKey;\n  }\n\n  /**\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../../draw/Styles').default} Styles\n   *\n   * @typedef {import('../../util/Types').Point} Point\n   */\n\n  function allowAll(event) { return true; }\n\n  function allowPrimaryAndAuxiliary(event) {\n    return isPrimaryButton(event) || isAuxiliaryButton(event);\n  }\n\n  var LOW_PRIORITY$4 = 500;\n\n\n  /**\n   * A plugin that provides interaction events for diagram elements.\n   *\n   * It emits the following events:\n   *\n   *   * element.click\n   *   * element.contextmenu\n   *   * element.dblclick\n   *   * element.hover\n   *   * element.mousedown\n   *   * element.mousemove\n   *   * element.mouseup\n   *   * element.out\n   *\n   * Each event is a tuple { element, gfx, originalEvent }.\n   *\n   * Canceling the event via Event#preventDefault()\n   * prevents the original DOM operation.\n   *\n   * @param {EventBus} eventBus\n   * @param {ElementRegistry} elementRegistry\n   * @param {Styles} styles\n   */\n  function InteractionEvents(eventBus, elementRegistry, styles) {\n\n    var self = this;\n\n    /**\n     * Fire an interaction event.\n     *\n     * @param {string} type local event name, e.g. element.click.\n     * @param {MouseEvent|TouchEvent} event native event\n     * @param {Element} [element] the diagram element to emit the event on;\n     *                                   defaults to the event target\n     */\n    function fire(type, event, element) {\n\n      if (isIgnored(type, event)) {\n        return;\n      }\n\n      var target, gfx, returnValue;\n\n      if (!element) {\n        target = event.delegateTarget || event.target;\n\n        if (target) {\n          gfx = target;\n          element = elementRegistry.get(gfx);\n        }\n      } else {\n        gfx = elementRegistry.getGraphics(element);\n      }\n\n      if (!gfx || !element) {\n        return;\n      }\n\n      returnValue = eventBus.fire(type, {\n        element: element,\n        gfx: gfx,\n        originalEvent: event\n      });\n\n      if (returnValue === false) {\n        event.stopPropagation();\n        event.preventDefault();\n      }\n    }\n\n    // TODO(nikku): document this\n    var handlers = {};\n\n    function mouseHandler(localEventName) {\n      return handlers[localEventName];\n    }\n\n    function isIgnored(localEventName, event) {\n\n      var filter = ignoredFilters[localEventName] || isPrimaryButton;\n\n      // only react on left mouse button interactions\n      // except for interaction events that are enabled\n      // for secundary mouse button\n      return !filter(event);\n    }\n\n    var bindings = {\n      click: 'element.click',\n      contextmenu: 'element.contextmenu',\n      dblclick: 'element.dblclick',\n      mousedown: 'element.mousedown',\n      mousemove: 'element.mousemove',\n      mouseover: 'element.hover',\n      mouseout: 'element.out',\n      mouseup: 'element.mouseup',\n    };\n\n    var ignoredFilters = {\n      'element.contextmenu': allowAll,\n      'element.mousedown': allowPrimaryAndAuxiliary,\n      'element.mouseup': allowPrimaryAndAuxiliary,\n      'element.click': allowPrimaryAndAuxiliary,\n      'element.dblclick': allowPrimaryAndAuxiliary\n    };\n\n\n    // manual event trigger //////////\n\n    /**\n     * Trigger an interaction event (based on a native dom event)\n     * on the target shape or connection.\n     *\n     * @param {string} eventName the name of the triggered DOM event\n     * @param {MouseEvent|TouchEvent} event\n     * @param {Element} targetElement\n     */\n    function triggerMouseEvent(eventName, event, targetElement) {\n\n      // i.e. element.mousedown...\n      var localEventName = bindings[eventName];\n\n      if (!localEventName) {\n        throw new Error('unmapped DOM event name <' + eventName + '>');\n      }\n\n      return fire(localEventName, event, targetElement);\n    }\n\n\n    var ELEMENT_SELECTOR = 'svg, .djs-element';\n\n    // event handling ///////\n\n    function registerEvent(node, event, localEvent, ignoredFilter) {\n\n      var handler = handlers[localEvent] = function(event) {\n        fire(localEvent, event);\n      };\n\n      if (ignoredFilter) {\n        ignoredFilters[localEvent] = ignoredFilter;\n      }\n\n      handler.$delegate = delegate.bind(node, ELEMENT_SELECTOR, event, handler);\n    }\n\n    function unregisterEvent(node, event, localEvent) {\n\n      var handler = mouseHandler(localEvent);\n\n      if (!handler) {\n        return;\n      }\n\n      delegate.unbind(node, event, handler.$delegate);\n    }\n\n    function registerEvents(svg) {\n      forEach$1(bindings, function(val, key) {\n        registerEvent(svg, key, val);\n      });\n    }\n\n    function unregisterEvents(svg) {\n      forEach$1(bindings, function(val, key) {\n        unregisterEvent(svg, key, val);\n      });\n    }\n\n    eventBus.on('canvas.destroy', function(event) {\n      unregisterEvents(event.svg);\n    });\n\n    eventBus.on('canvas.init', function(event) {\n      registerEvents(event.svg);\n    });\n\n\n    // hit box updating ////////////////\n\n    eventBus.on([ 'shape.added', 'connection.added' ], function(event) {\n      var element = event.element,\n          gfx = event.gfx;\n\n      eventBus.fire('interactionEvents.createHit', { element: element, gfx: gfx });\n    });\n\n    // Update djs-hit on change.\n    // A low priortity is necessary, because djs-hit of labels has to be updated\n    // after the label bounds have been updated in the renderer.\n    eventBus.on([\n      'shape.changed',\n      'connection.changed'\n    ], LOW_PRIORITY$4, function(event) {\n\n      var element = event.element,\n          gfx = event.gfx;\n\n      eventBus.fire('interactionEvents.updateHit', { element: element, gfx: gfx });\n    });\n\n    eventBus.on('interactionEvents.createHit', LOW_PRIORITY$4, function(event) {\n      var element = event.element,\n          gfx = event.gfx;\n\n      self.createDefaultHit(element, gfx);\n    });\n\n    eventBus.on('interactionEvents.updateHit', function(event) {\n      var element = event.element,\n          gfx = event.gfx;\n\n      self.updateDefaultHit(element, gfx);\n    });\n\n\n    // hit styles ////////////\n\n    var STROKE_HIT_STYLE = createHitStyle('djs-hit djs-hit-stroke');\n\n    var CLICK_STROKE_HIT_STYLE = createHitStyle('djs-hit djs-hit-click-stroke');\n\n    var ALL_HIT_STYLE = createHitStyle('djs-hit djs-hit-all');\n\n    var NO_MOVE_HIT_STYLE = createHitStyle('djs-hit djs-hit-no-move');\n\n    var HIT_TYPES = {\n      'all': ALL_HIT_STYLE,\n      'click-stroke': CLICK_STROKE_HIT_STYLE,\n      'stroke': STROKE_HIT_STYLE,\n      'no-move': NO_MOVE_HIT_STYLE\n    };\n\n    function createHitStyle(classNames, attrs) {\n\n      attrs = assign$1({\n        stroke: 'white',\n        strokeWidth: 15\n      }, attrs || {});\n\n      return styles.cls(classNames, [ 'no-fill', 'no-border' ], attrs);\n    }\n\n\n    // style helpers ///////////////\n\n    function applyStyle(hit, type) {\n\n      var attrs = HIT_TYPES[type];\n\n      if (!attrs) {\n        throw new Error('invalid hit type <' + type + '>');\n      }\n\n      attr$1(hit, attrs);\n\n      return hit;\n    }\n\n    function appendHit(gfx, hit) {\n      append(gfx, hit);\n    }\n\n\n    // API\n\n    /**\n     * Remove hints on the given graphics.\n     *\n     * @param {SVGElement} gfx\n     */\n    this.removeHits = function(gfx) {\n      var hits = all('.djs-hit', gfx);\n\n      forEach$1(hits, remove$2);\n    };\n\n    /**\n     * Create default hit for the given element.\n     *\n     * @param {Element} element\n     * @param {SVGElement} gfx\n     *\n     * @return {SVGElement} created hit\n     */\n    this.createDefaultHit = function(element, gfx) {\n      var waypoints = element.waypoints,\n          isFrame = element.isFrame,\n          boxType;\n\n      if (waypoints) {\n        return this.createWaypointsHit(gfx, waypoints);\n      } else {\n\n        boxType = isFrame ? 'stroke' : 'all';\n\n        return this.createBoxHit(gfx, boxType, {\n          width: element.width,\n          height: element.height\n        });\n      }\n    };\n\n    /**\n     * Create hits for the given waypoints.\n     *\n     * @param {SVGElement} gfx\n     * @param {Point[]} waypoints\n     *\n     * @return {SVGElement}\n     */\n    this.createWaypointsHit = function(gfx, waypoints) {\n\n      var hit = createLine(waypoints);\n\n      applyStyle(hit, 'stroke');\n\n      appendHit(gfx, hit);\n\n      return hit;\n    };\n\n    /**\n     * Create hits for a box.\n     *\n     * @param {SVGElement} gfx\n     * @param {string} type\n     * @param {Object} attrs\n     *\n     * @return {SVGElement}\n     */\n    this.createBoxHit = function(gfx, type, attrs) {\n\n      attrs = assign$1({\n        x: 0,\n        y: 0\n      }, attrs);\n\n      var hit = create$1('rect');\n\n      applyStyle(hit, type);\n\n      attr$1(hit, attrs);\n\n      appendHit(gfx, hit);\n\n      return hit;\n    };\n\n    /**\n     * Update default hit of the element.\n     *\n     * @param {Element} element\n     * @param {SVGElement} gfx\n     *\n     * @return {SVGElement} updated hit\n     */\n    this.updateDefaultHit = function(element, gfx) {\n\n      var hit = query('.djs-hit', gfx);\n\n      if (!hit) {\n        return;\n      }\n\n      if (element.waypoints) {\n        updateLine(hit, element.waypoints);\n      } else {\n        attr$1(hit, {\n          width: element.width,\n          height: element.height\n        });\n      }\n\n      return hit;\n    };\n\n    this.fire = fire;\n\n    this.triggerMouseEvent = triggerMouseEvent;\n\n    this.mouseHandler = mouseHandler;\n\n    this.registerEvent = registerEvent;\n    this.unregisterEvent = unregisterEvent;\n  }\n\n\n  InteractionEvents.$inject = [\n    'eventBus',\n    'elementRegistry',\n    'styles'\n  ];\n\n\n  /**\n   * An event indicating that the mouse hovered over an element\n   *\n   * @event element.hover\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * An event indicating that the mouse has left an element\n   *\n   * @event element.out\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * An event indicating that the mouse has clicked an element\n   *\n   * @event element.click\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * An event indicating that the mouse has double clicked an element\n   *\n   * @event element.dblclick\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * An event indicating that the mouse has gone down on an element.\n   *\n   * @event element.mousedown\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * An event indicating that the mouse has gone up on an element.\n   *\n   * @event element.mouseup\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * An event indicating that the context menu action is triggered\n   * via mouse or touch controls.\n   *\n   * @event element.contextmenu\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var InteractionEventsModule = {\n    __init__: [ 'interactionEvents' ],\n    interactionEvents: [ 'type', InteractionEvents ]\n  };\n\n  /**\n   * Returns the surrounding bbox for all elements in\n   * the array or the element primitive.\n   *\n   * @param {Element|Element[]} elements\n   * @param {boolean} [stopRecursion=false]\n   *\n   * @return {Rect}\n   */\n  function getBBox(elements, stopRecursion) {\n\n    stopRecursion = !!stopRecursion;\n    if (!isArray$2(elements)) {\n      elements = [ elements ];\n    }\n\n    var minX,\n        minY,\n        maxX,\n        maxY;\n\n    forEach$1(elements, function(element) {\n\n      // If element is a connection the bbox must be computed first\n      var bbox = element;\n      if (element.waypoints && !stopRecursion) {\n        bbox = getBBox(element.waypoints, true);\n      }\n\n      var x = bbox.x,\n          y = bbox.y,\n          height = bbox.height || 0,\n          width = bbox.width || 0;\n\n      if (x < minX || minX === undefined) {\n        minX = x;\n      }\n      if (y < minY || minY === undefined) {\n        minY = y;\n      }\n\n      if ((x + width) > maxX || maxX === undefined) {\n        maxX = x + width;\n      }\n      if ((y + height) > maxY || maxY === undefined) {\n        maxY = y + height;\n      }\n    });\n\n    return {\n      x: minX,\n      y: minY,\n      height: maxY - minY,\n      width: maxX - minX\n    };\n  }\n\n  /**\n   * Get the element's type\n   *\n   * @param {Element} element\n   *\n   * @return {'connection' | 'shape' | 'root'}\n   */\n  function getType(element) {\n\n    if ('waypoints' in element) {\n      return 'connection';\n    }\n\n    if ('x' in element) {\n      return 'shape';\n    }\n\n    return 'root';\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isFrameElement(element) {\n    return !!(element && element.isFrame);\n  }\n\n  var LOW_PRIORITY$3 = 500;\n\n  /**\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../../draw/Styles').default} Styles\n   */\n\n  /**\n   * @class\n   *\n   * A plugin that adds an outline to shapes and connections that may be activated and styled\n   * via CSS classes.\n   *\n   * @param {EventBus} eventBus\n   * @param {Styles} styles\n   */\n  function Outline(eventBus, styles) {\n\n    this.offset = 6;\n\n    var OUTLINE_STYLE = styles.cls('djs-outline', [ 'no-fill' ]);\n\n    var self = this;\n\n    function createOutline(gfx, bounds) {\n      var outline = create$1('rect');\n\n      attr$1(outline, assign$1({\n        x: 10,\n        y: 10,\n        rx: 4,\n        width: 100,\n        height: 100\n      }, OUTLINE_STYLE));\n\n      append(gfx, outline);\n\n      return outline;\n    }\n\n    // A low priortity is necessary, because outlines of labels have to be updated\n    // after the label bounds have been updated in the renderer.\n    eventBus.on([ 'shape.added', 'shape.changed' ], LOW_PRIORITY$3, function(event) {\n      var element = event.element,\n          gfx = event.gfx;\n\n      var outline = query('.djs-outline', gfx);\n\n      if (!outline) {\n        outline = createOutline(gfx);\n      }\n\n      self.updateShapeOutline(outline, element);\n    });\n\n    eventBus.on([ 'connection.added', 'connection.changed' ], function(event) {\n      var element = event.element,\n          gfx = event.gfx;\n\n      var outline = query('.djs-outline', gfx);\n\n      if (!outline) {\n        outline = createOutline(gfx);\n      }\n\n      self.updateConnectionOutline(outline, element);\n    });\n  }\n\n\n  /**\n   * Updates the outline of a shape respecting the dimension of the\n   * element and an outline offset.\n   *\n   * @param {SVGElement} outline\n   * @param {Element} element\n   */\n  Outline.prototype.updateShapeOutline = function(outline, element) {\n\n    attr$1(outline, {\n      x: -this.offset,\n      y: -this.offset,\n      width: element.width + this.offset * 2,\n      height: element.height + this.offset * 2\n    });\n\n  };\n\n\n  /**\n   * Updates the outline of a connection respecting the bounding box of\n   * the connection and an outline offset.\n   *\n   * @param {SVGElement} outline\n   * @param {Element} connection\n   */\n  Outline.prototype.updateConnectionOutline = function(outline, connection) {\n\n    var bbox = getBBox(connection);\n\n    attr$1(outline, {\n      x: bbox.x - this.offset,\n      y: bbox.y - this.offset,\n      width: bbox.width + this.offset * 2,\n      height: bbox.height + this.offset * 2\n    });\n\n  };\n\n\n  Outline.$inject = [ 'eventBus', 'styles', 'elementRegistry' ];\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var OutlineModule = {\n    __init__: [ 'outline' ],\n    outline: [ 'type', Outline ]\n  };\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   */\n\n  /**\n   * A service that offers the current selection in a diagram.\n   * Offers the api to control the selection, too.\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   */\n  function Selection(eventBus, canvas) {\n\n    this._eventBus = eventBus;\n    this._canvas = canvas;\n\n    /**\n     * @type {Object[]}\n     */\n    this._selectedElements = [];\n\n    var self = this;\n\n    eventBus.on([ 'shape.remove', 'connection.remove' ], function(e) {\n      var element = e.element;\n      self.deselect(element);\n    });\n\n    eventBus.on([ 'diagram.clear', 'root.set' ], function(e) {\n      self.select(null);\n    });\n  }\n\n  Selection.$inject = [ 'eventBus', 'canvas' ];\n\n  /**\n   * Deselect an element.\n   *\n   * @param {Object} element The element to deselect.\n   */\n  Selection.prototype.deselect = function(element) {\n    var selectedElements = this._selectedElements;\n\n    var idx = selectedElements.indexOf(element);\n\n    if (idx !== -1) {\n      var oldSelection = selectedElements.slice();\n\n      selectedElements.splice(idx, 1);\n\n      this._eventBus.fire('selection.changed', { oldSelection: oldSelection, newSelection: selectedElements });\n    }\n  };\n\n  /**\n   * Get the selected elements.\n   *\n   * @return {Object[]} The selected elements.\n   */\n  Selection.prototype.get = function() {\n    return this._selectedElements;\n  };\n\n  /**\n   * Check whether an element is selected.\n   *\n   * @param {Object} element The element.\n   *\n   * @return {boolean} Whether the element is selected.\n   */\n  Selection.prototype.isSelected = function(element) {\n    return this._selectedElements.indexOf(element) !== -1;\n  };\n\n\n  /**\n   * Select one or many elements.\n   *\n   * @param {Object|Object[]} elements The element(s) to select.\n   * @param {boolean} [add] Whether to add the element(s) to the selected elements.\n   * Defaults to `false`.\n   */\n  Selection.prototype.select = function(elements, add) {\n    var selectedElements = this._selectedElements,\n        oldSelection = selectedElements.slice();\n\n    if (!isArray$2(elements)) {\n      elements = elements ? [ elements ] : [];\n    }\n\n    var canvas = this._canvas;\n\n    var rootElement = canvas.getRootElement();\n\n    elements = elements.filter(function(element) {\n      var elementRoot = canvas.findRoot(element);\n\n      return rootElement === elementRoot;\n    });\n\n    // selection may be cleared by passing an empty array or null\n    // to the method\n    if (add) {\n      forEach$1(elements, function(element) {\n        if (selectedElements.indexOf(element) !== -1) {\n\n          // already selected\n          return;\n        } else {\n          selectedElements.push(element);\n        }\n      });\n    } else {\n      this._selectedElements = selectedElements = elements.slice();\n    }\n\n    this._eventBus.fire('selection.changed', { oldSelection: oldSelection, newSelection: selectedElements });\n  };\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('./Selection').default} Selection\n   */\n\n  var MARKER_HOVER = 'hover',\n      MARKER_SELECTED = 'selected';\n\n  var SELECTION_OUTLINE_PADDING = 6;\n\n\n  /**\n   * A plugin that adds a visible selection UI to shapes and connections\n   * by appending the <code>hover</code> and <code>selected</code> classes to them.\n   *\n   * @class\n   *\n   * Makes elements selectable, too.\n   *\n   * @param {Canvas} canvas\n   * @param {EventBus} eventBus\n   * @param {Selection} selection\n   */\n  function SelectionVisuals(canvas, eventBus, selection) {\n    this._canvas = canvas;\n\n    var self = this;\n\n    this._multiSelectionBox = null;\n\n    function addMarker(e, cls) {\n      canvas.addMarker(e, cls);\n    }\n\n    function removeMarker(e, cls) {\n      canvas.removeMarker(e, cls);\n    }\n\n    eventBus.on('element.hover', function(event) {\n      addMarker(event.element, MARKER_HOVER);\n    });\n\n    eventBus.on('element.out', function(event) {\n      removeMarker(event.element, MARKER_HOVER);\n    });\n\n    eventBus.on('selection.changed', function(event) {\n\n      function deselect(s) {\n        removeMarker(s, MARKER_SELECTED);\n      }\n\n      function select(s) {\n        addMarker(s, MARKER_SELECTED);\n      }\n\n      var oldSelection = event.oldSelection,\n          newSelection = event.newSelection;\n\n      forEach$1(oldSelection, function(e) {\n        if (newSelection.indexOf(e) === -1) {\n          deselect(e);\n        }\n      });\n\n      forEach$1(newSelection, function(e) {\n        if (oldSelection.indexOf(e) === -1) {\n          select(e);\n        }\n      });\n\n      self._updateSelectionOutline(newSelection);\n    });\n\n\n    eventBus.on('element.changed', function(event) {\n      if (selection.isSelected(event.element)) {\n        self._updateSelectionOutline(selection.get());\n      }\n    });\n  }\n\n  SelectionVisuals.$inject = [\n    'canvas',\n    'eventBus',\n    'selection'\n  ];\n\n  SelectionVisuals.prototype._updateSelectionOutline = function(selection) {\n    var layer = this._canvas.getLayer('selectionOutline');\n\n    clear$1(layer);\n\n    var enabled = selection.length > 1;\n\n    var container = this._canvas.getContainer();\n\n    classes$1(container)[enabled ? 'add' : 'remove']('djs-multi-select');\n\n    if (!enabled) {\n      return;\n    }\n\n    var bBox = addSelectionOutlinePadding(getBBox(selection));\n\n    var rect = create$1('rect');\n\n    attr$1(rect, assign$1({\n      rx: 3\n    }, bBox));\n\n    classes$1(rect).add('djs-selection-outline');\n\n    append(layer, rect);\n  };\n\n  // helpers //////////\n\n  function addSelectionOutlinePadding(bBox) {\n    return {\n      x: bBox.x - SELECTION_OUTLINE_PADDING,\n      y: bBox.y - SELECTION_OUTLINE_PADDING,\n      width: bBox.width + SELECTION_OUTLINE_PADDING * 2,\n      height: bBox.height + SELECTION_OUTLINE_PADDING * 2\n    };\n  }\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('./Selection').default} Selection\n   */\n\n  /**\n   * @param {EventBus} eventBus\n   * @param {Selection} selection\n   * @param {Canvas} canvas\n   * @param {ElementRegistry} elementRegistry\n   */\n  function SelectionBehavior(eventBus, selection, canvas, elementRegistry) {\n\n    // Select elements on create\n    eventBus.on('create.end', 500, function(event) {\n      var context = event.context,\n          canExecute = context.canExecute,\n          elements = context.elements,\n          hints = context.hints || {},\n          autoSelect = hints.autoSelect;\n\n      if (canExecute) {\n        if (autoSelect === false) {\n\n          // Select no elements\n          return;\n        }\n\n        if (isArray$2(autoSelect)) {\n          selection.select(autoSelect);\n        } else {\n\n          // Select all elements by default\n          selection.select(elements.filter(isShown));\n        }\n      }\n    });\n\n    // Select connection targets on connect\n    eventBus.on('connect.end', 500, function(event) {\n      var context = event.context,\n          connection = context.connection;\n\n      if (connection) {\n        selection.select(connection);\n      }\n    });\n\n    // Select shapes on move\n    eventBus.on('shape.move.end', 500, function(event) {\n      var previousSelection = event.previousSelection || [];\n\n      var shape = elementRegistry.get(event.context.shape.id);\n\n      // Always select main shape on move\n      var isSelected = find(previousSelection, function(selectedShape) {\n        return shape.id === selectedShape.id;\n      });\n\n      if (!isSelected) {\n        selection.select(shape);\n      }\n    });\n\n    // Select elements on click\n    eventBus.on('element.click', function(event) {\n\n      if (!isPrimaryButton(event)) {\n        return;\n      }\n\n      var element = event.element;\n\n      if (element === canvas.getRootElement()) {\n        element = null;\n      }\n\n      var isSelected = selection.isSelected(element),\n          isMultiSelect = selection.get().length > 1;\n\n      // Add to selection if CTRL or SHIFT pressed\n      var add = hasPrimaryModifier(event) || hasSecondaryModifier(event);\n\n      if (isSelected && isMultiSelect) {\n        if (add) {\n\n          // Deselect element\n          return selection.deselect(element);\n        } else {\n\n          // Select element only\n          return selection.select(element);\n        }\n      } else if (!isSelected) {\n\n        // Select element\n        selection.select(element, add);\n      } else {\n\n        // Deselect element\n        selection.deselect(element);\n      }\n    });\n  }\n\n  SelectionBehavior.$inject = [\n    'eventBus',\n    'selection',\n    'canvas',\n    'elementRegistry'\n  ];\n\n\n  function isShown(element) {\n    return !element.hidden;\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var SelectionModule = {\n    __init__: [ 'selectionVisuals', 'selectionBehavior' ],\n    __depends__: [\n      InteractionEventsModule,\n      OutlineModule\n    ],\n    selection: [ 'type', Selection ],\n    selectionVisuals: [ 'type', SelectionVisuals ],\n    selectionBehavior: [ 'type', SelectionBehavior ]\n  };\n\n  /**\n   * Util that provides unique IDs.\n   *\n   * @class\n   * @constructor\n   *\n   * The ids can be customized via a given prefix and contain a random value to avoid collisions.\n   *\n   * @param {string} [prefix] a prefix to prepend to generated ids (for better readability)\n   */\n  function IdGenerator(prefix) {\n\n    this._counter = 0;\n    this._prefix = (prefix ? prefix + '-' : '') + Math.floor(Math.random() * 1000000000) + '-';\n  }\n\n  /**\n   * Returns a next unique ID.\n   *\n   * @return {string} the id\n   */\n  IdGenerator.prototype.next = function() {\n    return this._prefix + (++this._counter);\n  };\n\n  // document wide unique overlay ids\n  var ids = new IdGenerator('ov');\n\n  var LOW_PRIORITY$2 = 500;\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../../core/EventBus').default} EventBus\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef { {\n   *   minZoom?: number,\n   *   maxZoom?: number\n   * } } OverlaysConfigShow\n   *\n   * @typedef { {\n   *   min?: number,\n   *   max?: number\n   * } } OverlaysConfigScale\n   *\n   * @typedef { {\n  *   id: string,\n  *   type: string | null,\n  *   element: Element | string\n  * } & OverlayAttrs } Overlay\n  *\n   * @typedef { {\n   *   html: HTMLElement | string,\n   *   position: {\n   *     top?: number,\n   *     right?: number,\n   *     bottom?: number,\n   *     left?: number\n   *   }\n   * } & OverlaysConfigDefault } OverlayAttrs\n   *\n   * @typedef { {\n   *   html: HTMLElement,\n   *   element: Element,\n   *   overlays: Overlay[]\n   * } } OverlayContainer\n   *\n   * @typedef {{\n   *   defaults?: OverlaysConfigDefault\n   * }} OverlaysConfig\n   *\n   * @typedef { {\n   *  show?: OverlaysConfigShow,\n   *  scale?: OverlaysConfigScale | boolean\n   * } } OverlaysConfigDefault\n   *\n   * @typedef { {\n   *   id?: string;\n   *   element?: Element | string;\n   *   type?: string;\n   * } | string } OverlaysFilter\n   */\n\n  /**\n   * A service that allows users to attach overlays to diagram elements.\n   *\n   * The overlay service will take care of overlay positioning during updates.\n   *\n   * @example\n   *\n   * ```javascript\n   * // add a pink badge on the top left of the shape\n   *\n   * overlays.add(someShape, {\n   *   position: {\n   *     top: -5,\n   *     left: -5\n   *   },\n   *   html: '<div style=\"width: 10px; background: fuchsia; color: white;\">0</div>'\n   * });\n   *\n   * // or add via shape id\n   *\n   * overlays.add('some-element-id', {\n   *   position: {\n   *     top: -5,\n   *     left: -5\n   *   }\n   *   html: '<div style=\"width: 10px; background: fuchsia; color: white;\">0</div>'\n   * });\n   *\n   * // or add with optional type\n   *\n   * overlays.add(someShape, 'badge', {\n   *   position: {\n   *     top: -5,\n   *     left: -5\n   *   }\n   *   html: '<div style=\"width: 10px; background: fuchsia; color: white;\">0</div>'\n   * });\n   * ```\n   *\n   * ```javascript\n   * // remove an overlay\n   *\n   * var id = overlays.add(...);\n   * overlays.remove(id);\n   *\n   *\n   * You may configure overlay defaults during tool by providing a `config` module\n   * with `overlays.defaults` as an entry:\n   *\n   * {\n   *   overlays: {\n   *     defaults: {\n   *       show: {\n   *         minZoom: 0.7,\n   *         maxZoom: 5.0\n   *       },\n   *       scale: {\n   *         min: 1\n   *       }\n   *     }\n   * }\n   * ```\n   *\n   * @param {OverlaysConfig} config\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {ElementRegistry} elementRegistry\n   */\n  function Overlays(config, eventBus, canvas, elementRegistry) {\n    this._eventBus = eventBus;\n    this._canvas = canvas;\n    this._elementRegistry = elementRegistry;\n\n    this._ids = ids;\n\n    /**\n     * @type {OverlaysConfigDefault}\n     */\n    this._overlayDefaults = assign$1({\n\n      // no show constraints\n      show: null,\n\n      // always scale\n      scale: true\n    }, config && config.defaults);\n\n    /**\n     * @type {Map<string, Overlay>}\n     */\n    this._overlays = {};\n\n    /**\n     * @type {OverlayContainer[]}\n     */\n    this._overlayContainers = [];\n\n    /**\n     * @type {HTMLElement}\n     */\n    this._overlayRoot = createRoot(canvas.getContainer());\n\n    this._init();\n  }\n\n\n  Overlays.$inject = [\n    'config.overlays',\n    'eventBus',\n    'canvas',\n    'elementRegistry'\n  ];\n\n\n  /**\n   * Returns the overlay with the specified ID or a list of overlays\n   * for an element with a given type.\n   *\n   * @example\n   *\n   * ```javascript\n   * // return the single overlay with the given ID\n   * overlays.get('some-id');\n   *\n   * // return all overlays for the shape\n   * overlays.get({ element: someShape });\n   *\n   * // return all overlays on shape with type 'badge'\n   * overlays.get({ element: someShape, type: 'badge' });\n   *\n   * // shape can also be specified as ID\n   * overlays.get({ element: 'element-id', type: 'badge' });\n   * ```\n   *\n   * @param {OverlaysFilter} search The filter to be used to find the overlay(s).\n   *\n   * @return {Overlay|Overlay[]} The overlay(s).\n   */\n  Overlays.prototype.get = function(search) {\n\n    if (isString(search)) {\n      search = { id: search };\n    }\n\n    if (isString(search.element)) {\n      search.element = this._elementRegistry.get(search.element);\n    }\n\n    if (search.element) {\n      var container = this._getOverlayContainer(search.element, true);\n\n      // return a list of overlays when searching by element (+type)\n      if (container) {\n        return search.type ? filter(container.overlays, matchPattern({ type: search.type })) : container.overlays.slice();\n      } else {\n        return [];\n      }\n    } else\n    if (search.type) {\n      return filter(this._overlays, matchPattern({ type: search.type }));\n    } else {\n\n      // return single element when searching by id\n      return search.id ? this._overlays[search.id] : null;\n    }\n  };\n\n  /**\n   * Adds an HTML overlay to an element.\n   *\n   * @param {Element|string} element The element to add the overlay to.\n   * @param {string} [type] An optional type that can be used to filter.\n   * @param {OverlayAttrs} overlay The overlay.\n   *\n   * @return {string} The overlay's ID that can be used to get or remove it.\n   */\n  Overlays.prototype.add = function(element, type, overlay) {\n\n    if (isObject(type)) {\n      overlay = type;\n      type = null;\n    }\n\n    if (!element.id) {\n      element = this._elementRegistry.get(element);\n    }\n\n    if (!overlay.position) {\n      throw new Error('must specifiy overlay position');\n    }\n\n    if (!overlay.html) {\n      throw new Error('must specifiy overlay html');\n    }\n\n    if (!element) {\n      throw new Error('invalid element specified');\n    }\n\n    var id = this._ids.next();\n\n    overlay = assign$1({}, this._overlayDefaults, overlay, {\n      id: id,\n      type: type,\n      element: element,\n      html: overlay.html\n    });\n\n    this._addOverlay(overlay);\n\n    return id;\n  };\n\n\n  /**\n   * Remove an overlay with the given ID or all overlays matching the given filter.\n   *\n   * @see Overlays#get for filter options.\n   *\n   * @param {OverlaysFilter} filter The filter to be used to find the overlay.\n   */\n  Overlays.prototype.remove = function(filter) {\n\n    var overlays = this.get(filter) || [];\n\n    if (!isArray$2(overlays)) {\n      overlays = [ overlays ];\n    }\n\n    var self = this;\n\n    forEach$1(overlays, function(overlay) {\n\n      var container = self._getOverlayContainer(overlay.element, true);\n\n      if (overlay) {\n        remove$1(overlay.html);\n        remove$1(overlay.htmlContainer);\n\n        delete overlay.htmlContainer;\n        delete overlay.element;\n\n        delete self._overlays[overlay.id];\n      }\n\n      if (container) {\n        var idx = container.overlays.indexOf(overlay);\n        if (idx !== -1) {\n          container.overlays.splice(idx, 1);\n        }\n      }\n    });\n\n  };\n\n  /**\n   * Checks whether overlays are shown.\n   *\n   * @return {boolean} Whether overlays are shown.\n   */\n  Overlays.prototype.isShown = function() {\n    return this._overlayRoot.style.display !== 'none';\n  };\n\n  /**\n   * Show all overlays.\n   */\n  Overlays.prototype.show = function() {\n    setVisible(this._overlayRoot);\n  };\n\n  /**\n   * Hide all overlays.\n   */\n  Overlays.prototype.hide = function() {\n    setVisible(this._overlayRoot, false);\n  };\n\n  /**\n   * Remove all overlays and their container.\n   */\n  Overlays.prototype.clear = function() {\n    this._overlays = {};\n\n    this._overlayContainers = [];\n\n    clear(this._overlayRoot);\n  };\n\n  Overlays.prototype._updateOverlayContainer = function(container) {\n    var element = container.element,\n        html = container.html;\n\n    // update container left,top according to the elements x,y coordinates\n    // this ensures we can attach child elements relative to this container\n\n    var x = element.x,\n        y = element.y;\n\n    if (element.waypoints) {\n      var bbox = getBBox(element);\n      x = bbox.x;\n      y = bbox.y;\n    }\n\n    setPosition(html, x, y);\n\n    attr(container.html, 'data-container-id', element.id);\n  };\n\n\n  Overlays.prototype._updateOverlay = function(overlay) {\n\n    var position = overlay.position,\n        htmlContainer = overlay.htmlContainer,\n        element = overlay.element;\n\n    // update overlay html relative to shape because\n    // it is already positioned on the element\n\n    // update relative\n    var left = position.left,\n        top = position.top;\n\n    if (position.right !== undefined) {\n\n      var width;\n\n      if (element.waypoints) {\n        width = getBBox(element).width;\n      } else {\n        width = element.width;\n      }\n\n      left = position.right * -1 + width;\n    }\n\n    if (position.bottom !== undefined) {\n\n      var height;\n\n      if (element.waypoints) {\n        height = getBBox(element).height;\n      } else {\n        height = element.height;\n      }\n\n      top = position.bottom * -1 + height;\n    }\n\n    setPosition(htmlContainer, left || 0, top || 0);\n    this._updateOverlayVisibilty(overlay, this._canvas.viewbox());\n  };\n\n\n  Overlays.prototype._createOverlayContainer = function(element) {\n    var html = domify$1('<div class=\"djs-overlays\" />');\n    assign(html, { position: 'absolute' });\n\n    this._overlayRoot.appendChild(html);\n\n    var container = {\n      html: html,\n      element: element,\n      overlays: []\n    };\n\n    this._updateOverlayContainer(container);\n\n    this._overlayContainers.push(container);\n\n    return container;\n  };\n\n\n  Overlays.prototype._updateRoot = function(viewbox) {\n    var scale = viewbox.scale || 1;\n\n    var matrix = 'matrix(' +\n    [\n      scale,\n      0,\n      0,\n      scale,\n      -1 * viewbox.x * scale,\n      -1 * viewbox.y * scale\n    ].join(',') +\n    ')';\n\n    setTransform(this._overlayRoot, matrix);\n  };\n\n\n  Overlays.prototype._getOverlayContainer = function(element, raw) {\n    var container = find(this._overlayContainers, function(c) {\n      return c.element === element;\n    });\n\n\n    if (!container && !raw) {\n      return this._createOverlayContainer(element);\n    }\n\n    return container;\n  };\n\n\n  Overlays.prototype._addOverlay = function(overlay) {\n\n    var id = overlay.id,\n        element = overlay.element,\n        html = overlay.html,\n        htmlContainer,\n        overlayContainer;\n\n    // unwrap jquery (for those who need it)\n    if (html.get && html.constructor.prototype.jquery) {\n      html = html.get(0);\n    }\n\n    // create proper html elements from\n    // overlay HTML strings\n    if (isString(html)) {\n      html = domify$1(html);\n    }\n\n    overlayContainer = this._getOverlayContainer(element);\n\n    htmlContainer = domify$1('<div class=\"djs-overlay\" data-overlay-id=\"' + id + '\">');\n    assign(htmlContainer, { position: 'absolute' });\n\n    htmlContainer.appendChild(html);\n\n    if (overlay.type) {\n      classes(htmlContainer).add('djs-overlay-' + overlay.type);\n    }\n\n    var elementRoot = this._canvas.findRoot(element);\n    var activeRoot = this._canvas.getRootElement();\n\n    setVisible(htmlContainer, elementRoot === activeRoot);\n\n    overlay.htmlContainer = htmlContainer;\n\n    overlayContainer.overlays.push(overlay);\n    overlayContainer.html.appendChild(htmlContainer);\n\n    this._overlays[id] = overlay;\n\n    this._updateOverlay(overlay);\n    this._updateOverlayVisibilty(overlay, this._canvas.viewbox());\n  };\n\n\n  Overlays.prototype._updateOverlayVisibilty = function(overlay, viewbox) {\n    var show = overlay.show,\n        rootElement = this._canvas.findRoot(overlay.element),\n        minZoom = show && show.minZoom,\n        maxZoom = show && show.maxZoom,\n        htmlContainer = overlay.htmlContainer,\n        activeRootElement = this._canvas.getRootElement(),\n        visible = true;\n\n    if (rootElement !== activeRootElement) {\n      visible = false;\n    } else if (show) {\n      if (\n        (isDefined(minZoom) && minZoom > viewbox.scale) ||\n        (isDefined(maxZoom) && maxZoom < viewbox.scale)\n      ) {\n        visible = false;\n      }\n    }\n\n    setVisible(htmlContainer, visible);\n\n    this._updateOverlayScale(overlay, viewbox);\n  };\n\n\n  Overlays.prototype._updateOverlayScale = function(overlay, viewbox) {\n    var shouldScale = overlay.scale,\n        minScale,\n        maxScale,\n        htmlContainer = overlay.htmlContainer;\n\n    var scale, transform = '';\n\n    if (shouldScale !== true) {\n\n      if (shouldScale === false) {\n        minScale = 1;\n        maxScale = 1;\n      } else {\n        minScale = shouldScale.min;\n        maxScale = shouldScale.max;\n      }\n\n      if (isDefined(minScale) && viewbox.scale < minScale) {\n        scale = (1 / viewbox.scale || 1) * minScale;\n      }\n\n      if (isDefined(maxScale) && viewbox.scale > maxScale) {\n        scale = (1 / viewbox.scale || 1) * maxScale;\n      }\n    }\n\n    if (isDefined(scale)) {\n      transform = 'scale(' + scale + ',' + scale + ')';\n    }\n\n    setTransform(htmlContainer, transform);\n  };\n\n\n  Overlays.prototype._updateOverlaysVisibilty = function(viewbox) {\n\n    var self = this;\n\n    forEach$1(this._overlays, function(overlay) {\n      self._updateOverlayVisibilty(overlay, viewbox);\n    });\n  };\n\n\n  Overlays.prototype._init = function() {\n\n    var eventBus = this._eventBus;\n\n    var self = this;\n\n\n    // scroll/zoom integration\n\n    function updateViewbox(viewbox) {\n      self._updateRoot(viewbox);\n      self._updateOverlaysVisibilty(viewbox);\n\n      self.show();\n    }\n\n    eventBus.on('canvas.viewbox.changing', function(event) {\n      self.hide();\n    });\n\n    eventBus.on('canvas.viewbox.changed', function(event) {\n      updateViewbox(event.viewbox);\n    });\n\n\n    // remove integration\n\n    eventBus.on([ 'shape.remove', 'connection.remove' ], function(e) {\n      var element = e.element;\n      var overlays = self.get({ element: element });\n\n      forEach$1(overlays, function(o) {\n        self.remove(o.id);\n      });\n\n      var container = self._getOverlayContainer(element);\n\n      if (container) {\n        remove$1(container.html);\n        var i = self._overlayContainers.indexOf(container);\n        if (i !== -1) {\n          self._overlayContainers.splice(i, 1);\n        }\n      }\n    });\n\n\n    // move integration\n\n    eventBus.on('element.changed', LOW_PRIORITY$2, function(e) {\n      var element = e.element;\n\n      var container = self._getOverlayContainer(element, true);\n\n      if (container) {\n        forEach$1(container.overlays, function(overlay) {\n          self._updateOverlay(overlay);\n        });\n\n        self._updateOverlayContainer(container);\n      }\n    });\n\n\n    // marker integration, simply add them on the overlays as classes, too.\n\n    eventBus.on('element.marker.update', function(e) {\n      var container = self._getOverlayContainer(e.element, true);\n      if (container) {\n        classes(container.html)[e.add ? 'add' : 'remove'](e.marker);\n      }\n    });\n\n\n    eventBus.on('root.set', function() {\n      self._updateOverlaysVisibilty(self._canvas.viewbox());\n    });\n\n    // clear overlays with diagram\n\n    eventBus.on('diagram.clear', this.clear, this);\n  };\n\n\n\n  // helpers /////////////////////////////\n\n  function createRoot(parentNode) {\n    var root = domify$1(\n      '<div class=\"djs-overlay-container\" />'\n    );\n\n    assign(root, {\n      position: 'absolute',\n      width: 0,\n      height: 0\n    });\n\n    parentNode.insertBefore(root, parentNode.firstChild);\n\n    return root;\n  }\n\n  function setPosition(el, x, y) {\n    assign(el, { left: x + 'px', top: y + 'px' });\n  }\n\n  /**\n   * Set element visible\n   *\n   * @param {DOMElement} el\n   * @param {boolean} [visible=true]\n   */\n  function setVisible(el, visible) {\n    el.style.display = visible === false ? 'none' : '';\n  }\n\n  function setTransform(el, transform) {\n\n    el.style['transform-origin'] = 'top left';\n\n    [ '', '-ms-', '-webkit-' ].forEach(function(prefix) {\n      el.style[prefix + 'transform'] = transform;\n    });\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var OverlaysModule = {\n    __init__: [ 'overlays' ],\n    overlays: [ 'type', Overlays ]\n  };\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../../core/GraphicsFactory').default} GraphicsFactory\n   */\n\n  /**\n   * Adds change support to the diagram, including\n   *\n   * <ul>\n   *   <li>redrawing shapes and connections on change</li>\n   * </ul>\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {ElementRegistry} elementRegistry\n   * @param {GraphicsFactory} graphicsFactory\n   */\n  function ChangeSupport(\n      eventBus, canvas, elementRegistry,\n      graphicsFactory) {\n\n\n    // redraw shapes / connections on change\n\n    eventBus.on('element.changed', function(event) {\n\n      var element = event.element;\n\n      // element might have been deleted and replaced by new element with same ID\n      // thus check for parent of element except for root element\n      if (element.parent || element === canvas.getRootElement()) {\n        event.gfx = elementRegistry.getGraphics(element);\n      }\n\n      // shape + gfx may have been deleted\n      if (!event.gfx) {\n        return;\n      }\n\n      eventBus.fire(getType(element) + '.changed', event);\n    });\n\n    eventBus.on('elements.changed', function(event) {\n\n      var elements = event.elements;\n\n      elements.forEach(function(e) {\n        eventBus.fire('element.changed', { element: e });\n      });\n\n      graphicsFactory.updateContainments(elements);\n    });\n\n    eventBus.on('shape.changed', function(event) {\n      graphicsFactory.update('shape', event.element, event.gfx);\n    });\n\n    eventBus.on('connection.changed', function(event) {\n      graphicsFactory.update('connection', event.element, event.gfx);\n    });\n  }\n\n  ChangeSupport.$inject = [\n    'eventBus',\n    'canvas',\n    'elementRegistry',\n    'graphicsFactory'\n  ];\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var ChangeSupportModule = {\n    __init__: [ 'changeSupport' ],\n    changeSupport: [ 'type', ChangeSupport ]\n  };\n\n  /**\n   * @typedef {import('../core/Types').ElementLike} ElementLike\n   * @typedef {import('../core/EventBus').default} EventBus\n   * @typedef {import('./CommandStack').CommandContext} CommandContext\n   *\n   * @typedef {string|string[]} Events\n   * @typedef { (context: CommandContext) => ElementLike[] | void } HandlerFunction\n   * @typedef { (context: CommandContext) => void } ComposeHandlerFunction\n   */\n\n  var DEFAULT_PRIORITY$2 = 1000;\n\n  /**\n   * A utility that can be used to plug into the command execution for\n   * extension and/or validation.\n   *\n   * @class\n   * @constructor\n   *\n   * @example\n   *\n   * ```javascript\n   * import CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n   *\n   * class CommandLogger extends CommandInterceptor {\n   *   constructor(eventBus) {\n   *     super(eventBus);\n   *\n   *   this.preExecute('shape.create', (event) => {\n   *     console.log('commandStack.shape-create.preExecute', event);\n   *   });\n   * }\n   * ```\n   *\n   * @param {EventBus} eventBus\n   */\n  function CommandInterceptor(eventBus) {\n\n    /**\n     * @type {EventBus}\n     */\n    this._eventBus = eventBus;\n  }\n\n  CommandInterceptor.$inject = [ 'eventBus' ];\n\n  function unwrapEvent(fn, that) {\n    return function(event) {\n      return fn.call(that || null, event.context, event.command, event);\n    };\n  }\n\n\n  /**\n   * Intercept a command during one of the phases.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {string} [hook] phase to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.on = function(events, hook, priority, handlerFn, unwrap, that) {\n\n    if (isFunction(hook) || isNumber(hook)) {\n      that = unwrap;\n      unwrap = handlerFn;\n      handlerFn = priority;\n      priority = hook;\n      hook = null;\n    }\n\n    if (isFunction(priority)) {\n      that = unwrap;\n      unwrap = handlerFn;\n      handlerFn = priority;\n      priority = DEFAULT_PRIORITY$2;\n    }\n\n    if (isObject(unwrap)) {\n      that = unwrap;\n      unwrap = false;\n    }\n\n    if (!isFunction(handlerFn)) {\n      throw new Error('handlerFn must be a function');\n    }\n\n    if (!isArray$2(events)) {\n      events = [ events ];\n    }\n\n    var eventBus = this._eventBus;\n\n    forEach$1(events, function(event) {\n\n      // concat commandStack(.event)?(.hook)?\n      var fullEvent = [ 'commandStack', event, hook ].filter(function(e) { return e; }).join('.');\n\n      eventBus.on(fullEvent, priority, unwrap ? unwrapEvent(handlerFn, that) : handlerFn, that);\n    });\n  };\n\n  /**\n   * Add a <canExecute> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.canExecute = createHook('canExecute');\n\n  /**\n   * Add a <preExecute> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.preExecute = createHook('preExecute');\n\n  /**\n   * Add a <preExecuted> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.preExecuted = createHook('preExecuted');\n\n  /**\n   * Add a <execute> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.execute = createHook('execute');\n\n  /**\n   * Add a <executed> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.executed = createHook('executed');\n\n  /**\n   * Add a <postExecute> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.postExecute = createHook('postExecute');\n\n  /**\n   * Add a <postExecuted> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.postExecuted = createHook('postExecuted');\n\n  /**\n   * Add a <revert> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.revert = createHook('revert');\n\n  /**\n   * Add a <reverted> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.reverted = createHook('reverted');\n\n  /*\n   * Add prototype methods for each phase of command execution (e.g. execute,\n   * revert).\n   *\n   * @param {string} hook\n   *\n   * @return { (\n   *   events?: Events,\n   *   priority?: number,\n   *   handlerFn: ComposeHandlerFunction|HandlerFunction,\n   *   unwrap?: boolean\n   * ) => any }\n   */\n  function createHook(hook) {\n\n    /**\n     * @this {CommandInterceptor}\n     *\n     * @param {Events} [events]\n     * @param {number} [priority]\n     * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n     * @param {boolean} [unwrap]\n     * @param {any} [that]\n     */\n    const hookFn = function(events, priority, handlerFn, unwrap, that) {\n\n      if (isFunction(events) || isNumber(events)) {\n        that = unwrap;\n        unwrap = handlerFn;\n        handlerFn = priority;\n        priority = events;\n        events = null;\n      }\n\n      this.on(events, hook, priority, handlerFn, unwrap, that);\n    };\n\n    return hookFn;\n  }\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   *\n   * @typedef {import('../../core/Canvas').default} Canvas\n   */\n\n  /**\n   * A modeling behavior that ensures we set the correct root element\n   * as we undo and redo commands.\n   *\n   * @param {Canvas} canvas\n   * @param {Injector} injector\n   */\n  function RootElementsBehavior(canvas, injector) {\n\n    injector.invoke(CommandInterceptor, this);\n\n    this.executed(function(event) {\n      var context = event.context;\n\n      if (context.rootElement) {\n        canvas.setRootElement(context.rootElement);\n      } else {\n        context.rootElement = canvas.getRootElement();\n      }\n    });\n\n    this.revert(function(event) {\n      var context = event.context;\n\n      if (context.rootElement) {\n        canvas.setRootElement(context.rootElement);\n      }\n    });\n  }\n\n  e(RootElementsBehavior, CommandInterceptor);\n\n  RootElementsBehavior.$inject = [ 'canvas', 'injector' ];\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var RootElementsModule = {\n    __init__: [ 'rootElementsBehavior' ],\n    rootElementsBehavior: [ 'type', RootElementsBehavior ]\n  };\n\n  /**\n   * @param {string} str\n   *\n   * @return {string}\n   */\n\n  var HTML_ESCAPE_MAP = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    '\\'': '&#39;'\n  };\n\n  /**\n   * @param {string} str\n   *\n   * @return {string}\n   */\n  function escapeHTML(str) {\n    str = '' + str;\n\n    return str && str.replace(/[&<>\"']/g, function(match) {\n      return HTML_ESCAPE_MAP[match];\n    });\n  }\n\n  /**\n   * @typedef {import('../model/Types').Element} Element\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   */\n\n  var planeSuffix = '_plane';\n\n  /**\n   * Get plane ID for a primary shape.\n   *\n   * @param  {Element|ModdleElement} element\n   *\n   * @return {string}\n   */\n  function getPlaneIdFromShape(element) {\n    var id = element.id;\n\n    if (is$1(element, 'bpmn:SubProcess')) {\n      return addPlaneSuffix(id);\n    }\n\n    return id;\n  }\n\n  function addPlaneSuffix(id) {\n    return id + planeSuffix;\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Shape} Shape\n   */\n\n  var OPEN_CLASS = 'bjs-breadcrumbs-shown';\n\n\n  /**\n   * Adds overlays that allow switching planes on collapsed subprocesses.\n   *\n   * @param {EventBus} eventBus\n   * @param {ElementRegistry} elementRegistry\n   * @param {Canvas} canvas\n   */\n  function DrilldownBreadcrumbs(eventBus, elementRegistry, canvas) {\n    var breadcrumbs = domify$1('<ul class=\"bjs-breadcrumbs\"></ul>');\n    var container = canvas.getContainer();\n    var containerClasses = classes(container);\n    container.appendChild(breadcrumbs);\n\n    var businessObjectParents = [];\n\n    // update breadcrumbs if name or ID of the primary shape changes\n    eventBus.on('element.changed', function(event) {\n      var shape = event.element,\n          businessObject = getBusinessObject(shape);\n\n      var isPresent = find(businessObjectParents, function(element) {\n        return element === businessObject;\n      });\n\n      if (!isPresent) {\n        return;\n      }\n\n      updateBreadcrumbs();\n    });\n\n    /**\n     * Updates the displayed breadcrumbs. If no element is provided, only the\n     * labels are updated.\n     *\n     * @param {Element} [element]\n     */\n    function updateBreadcrumbs(element) {\n      if (element) {\n        businessObjectParents = getBusinessObjectParentChain(element);\n      }\n\n      var path = businessObjectParents.map(function(parent) {\n        var title = escapeHTML(parent.name || parent.id);\n        var link = domify$1('<li><span class=\"bjs-crumb\"><a title=\"' + title + '\">' + title + '</a></span></li>');\n\n        var parentPlane = canvas.findRoot(getPlaneIdFromShape(parent)) || canvas.findRoot(parent.id);\n\n        // when the root is a collaboration, the process does not have a corresponding\n        // element in the elementRegisty. Instead, we search for the corresponding participant\n        if (!parentPlane && is$1(parent, 'bpmn:Process')) {\n          var participant = elementRegistry.find(function(element) {\n            var businessObject = getBusinessObject(element);\n\n            return businessObject && businessObject.get('processRef') && businessObject.get('processRef') === parent;\n          });\n\n          parentPlane = canvas.findRoot(participant.id);\n        }\n\n        link.addEventListener('click', function() {\n          canvas.setRootElement(parentPlane);\n        });\n\n        return link;\n      });\n\n      breadcrumbs.innerHTML = '';\n\n      // show breadcrumbs and expose state to .djs-container\n      var visible = path.length > 1;\n\n      containerClasses.toggle(OPEN_CLASS, visible);\n\n      path.forEach(function(element) {\n        breadcrumbs.appendChild(element);\n      });\n    }\n\n    eventBus.on('root.set', function(event) {\n      updateBreadcrumbs(event.element);\n    });\n\n  }\n\n  DrilldownBreadcrumbs.$inject = [ 'eventBus', 'elementRegistry', 'canvas' ];\n\n\n  // helpers //////////\n\n  /**\n   * Returns the parents for the element using the business object chain,\n   * starting with the root element.\n   *\n   * @param {Shape} child\n   *\n   * @return {Shape}\n   */\n  function getBusinessObjectParentChain(child) {\n    var businessObject = getBusinessObject(child);\n\n    var parents = [];\n\n    for (var element = businessObject; element; element = element.$parent) {\n      if (is$1(element, 'bpmn:SubProcess') || is$1(element, 'bpmn:Process')) {\n        parents.push(element);\n      }\n    }\n\n    return parents.reverse();\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   */\n\n  /**\n   * Move collapsed subprocesses into view when drilling down.\n   *\n   * Zoom and scroll are saved in a session.\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   */\n  function DrilldownCentering(eventBus, canvas) {\n\n    var currentRoot = null;\n    var positionMap = new Map();\n\n    eventBus.on('root.set', function(event) {\n      var newRoot = event.element;\n      var currentViewbox = canvas.viewbox();\n      var storedViewbox = positionMap.get(newRoot);\n\n      positionMap.set(currentRoot, {\n        x: currentViewbox.x,\n        y: currentViewbox.y,\n        zoom: currentViewbox.scale\n      });\n\n      currentRoot = newRoot;\n\n      // current root was replaced with a collaboration, we don't update the viewbox\n      if (is$1(newRoot, 'bpmn:Collaboration') && !storedViewbox) {\n        return;\n      }\n\n      storedViewbox = storedViewbox || { x: 0, y: 0, zoom: 1 };\n\n      var dx = (currentViewbox.x - storedViewbox.x) * currentViewbox.scale,\n          dy = (currentViewbox.y - storedViewbox.y) * currentViewbox.scale;\n\n      if (dx !== 0 || dy !== 0) {\n        canvas.scroll({\n          dx: dx,\n          dy: dy\n        });\n      }\n\n      if (storedViewbox.zoom !== currentViewbox.scale) {\n        canvas.zoom(storedViewbox.zoom, { x: 0, y: 0 });\n      }\n    });\n\n    eventBus.on('diagram.clear', function() {\n      positionMap.clear();\n      currentRoot = null;\n    });\n\n  }\n\n  DrilldownCentering.$inject = [ 'eventBus', 'canvas' ];\n\n\n  /**\n   * ES5 Map implementation. Works.\n   */\n  function Map() {\n\n    this._entries = [];\n\n    this.set = function(key, value) {\n\n      var found = false;\n\n      for (var k in this._entries) {\n        if (this._entries[k][0] === key) {\n          this._entries[k][1] = value;\n\n          found = true;\n\n          break;\n        }\n      }\n\n      if (!found) {\n        this._entries.push([ key, value ]);\n      }\n    };\n\n    this.get = function(key) {\n\n      for (var k in this._entries) {\n        if (this._entries[k][0] === key) {\n          return this._entries[k][1];\n        }\n      }\n\n      return null;\n    };\n\n    this.clear = function() {\n      this._entries.length = 0;\n    };\n\n    this.remove = function(key) {\n\n      var idx = -1;\n\n      for (var k in this._entries) {\n        if (this._entries[k][0] === key) {\n          idx = k;\n\n          break;\n        }\n      }\n\n      if (idx !== -1) {\n        this._entries.splice(idx, 1);\n      }\n    };\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../../model/Types').Moddle} Moddle\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Shape} Shape\n   *\n   * @typedef {import('diagram-js/lib/core/Canvas').CanvasPlane} CanvasPlane\n   *\n   * @typedef {import('diagram-js/lib/util/Types').Rect} Rect\n   */\n\n  var DEFAULT_POSITION = {\n    x: 180,\n    y: 160\n  };\n\n  /**\n   * Hook into `import.render.start` and create new planes for diagrams with\n   * collapsed subprocesses and all DI elements on the same plane.\n   *\n   * @param {EventBus} eventBus\n   * @param {Moddle} moddle\n   */\n  function SubprocessCompatibility(eventBus, moddle) {\n    this._eventBus = eventBus;\n    this._moddle = moddle;\n\n    var self = this;\n\n    eventBus.on('import.render.start', 1500, function(e, context) {\n      self._handleImport(context.definitions);\n    });\n  }\n\n  /**\n   * @param {ModdleElement} definitions\n   */\n  SubprocessCompatibility.prototype._handleImport = function(definitions) {\n    if (!definitions.diagrams) {\n      return;\n    }\n\n    var self = this;\n    this._definitions = definitions;\n    this._processToDiagramMap = {};\n\n    definitions.diagrams.forEach(function(diagram) {\n      if (!diagram.plane || !diagram.plane.bpmnElement) {\n        return;\n      }\n\n      self._processToDiagramMap[diagram.plane.bpmnElement.id] = diagram;\n    });\n\n    var newDiagrams = [];\n    definitions.diagrams.forEach(function(diagram) {\n      var createdDiagrams = self._createNewDiagrams(diagram.plane);\n      Array.prototype.push.apply(newDiagrams, createdDiagrams);\n    });\n\n    newDiagrams.forEach(function(diagram) {\n      self._movePlaneElementsToOrigin(diagram.plane);\n    });\n  };\n\n\n  /**\n   * Moves all DI elements from collapsed subprocesses to a new plane.\n   *\n   * @param {CanvasPlane} plane\n   *\n   * @return {ModdleElement[]} new diagrams created for the collapsed subprocesses\n   */\n  SubprocessCompatibility.prototype._createNewDiagrams = function(plane) {\n    var self = this;\n\n    var collapsedElements = [];\n    var elementsToMove = [];\n\n    plane.get('planeElement').forEach(function(diElement) {\n      var businessObject = diElement.bpmnElement;\n\n      if (!businessObject) {\n        return;\n      }\n\n      var parent = businessObject.$parent;\n\n      if (is$1(businessObject, 'bpmn:SubProcess') && !diElement.isExpanded) {\n        collapsedElements.push(businessObject);\n      }\n\n      if (shouldMoveToPlane(businessObject, plane)) {\n\n        // don't change the array while we iterate over it\n        elementsToMove.push({ diElement: diElement, parent: parent });\n      }\n    });\n\n    var newDiagrams = [];\n\n    // create new planes for all collapsed subprocesses, even when they are empty\n    collapsedElements.forEach(function(element) {\n      if (!self._processToDiagramMap[ element.id ]) {\n        var diagram = self._createDiagram(element);\n\n        self._processToDiagramMap[element.id] = diagram;\n\n        newDiagrams.push(diagram);\n      }\n    });\n\n    elementsToMove.forEach(function(element) {\n      var diElement = element.diElement;\n      var parent = element.parent;\n\n      // parent is expanded, get nearest collapsed parent\n      while (parent && collapsedElements.indexOf(parent) === -1) {\n        parent = parent.$parent;\n      }\n\n      // false positive, all parents are expanded\n      if (!parent) {\n        return;\n      }\n\n      var diagram = self._processToDiagramMap[ parent.id ];\n\n      self._moveToDiPlane(diElement, diagram.plane);\n    });\n\n    return newDiagrams;\n  };\n\n  /**\n   * @param {CanvasPlane} plane\n   */\n  SubprocessCompatibility.prototype._movePlaneElementsToOrigin = function(plane) {\n    var elements = plane.get('planeElement');\n\n    // get bounding box of all elements\n    var planeBounds = getPlaneBounds(plane);\n\n    var offset = {\n      x: planeBounds.x - DEFAULT_POSITION.x,\n      y: planeBounds.y - DEFAULT_POSITION.y\n    };\n\n    elements.forEach(function(diElement) {\n      if (diElement.waypoint) {\n        diElement.waypoint.forEach(function(waypoint) {\n          waypoint.x = waypoint.x - offset.x;\n          waypoint.y = waypoint.y - offset.y;\n        });\n      } else if (diElement.bounds) {\n        diElement.bounds.x = diElement.bounds.x - offset.x;\n        diElement.bounds.y = diElement.bounds.y - offset.y;\n      }\n    });\n  };\n\n  /**\n   * @param {ModdleElement} diElement\n   * @param {CanvasPlane} newPlane\n   */\n  SubprocessCompatibility.prototype._moveToDiPlane = function(diElement, newPlane) {\n    var containingDiagram = findRootDiagram(diElement);\n\n    // remove DI from old Plane and add it to the new one\n    var parentPlaneElement = containingDiagram.plane.get('planeElement');\n\n    parentPlaneElement.splice(parentPlaneElement.indexOf(diElement), 1);\n\n    newPlane.get('planeElement').push(diElement);\n  };\n\n  /**\n   * @param {ModdleElement} businessObject\n   *\n   * @return {ModdleElement}\n   */\n  SubprocessCompatibility.prototype._createDiagram = function(businessObject) {\n    var plane = this._moddle.create('bpmndi:BPMNPlane', {\n      bpmnElement: businessObject\n    });\n\n    var diagram = this._moddle.create('bpmndi:BPMNDiagram', {\n      plane: plane\n    });\n\n    plane.$parent = diagram;\n\n    plane.bpmnElement = businessObject;\n\n    diagram.$parent = this._definitions;\n\n    this._definitions.diagrams.push(diagram);\n\n    return diagram;\n  };\n\n  SubprocessCompatibility.$inject = [ 'eventBus', 'moddle' ];\n\n\n  // helpers //////////\n\n  function findRootDiagram(element) {\n    if (is$1(element, 'bpmndi:BPMNDiagram')) {\n      return element;\n    } else {\n      return findRootDiagram(element.$parent);\n    }\n  }\n\n  /**\n   * @param {CanvasPlane} plane\n   *\n   * @return {Rect}\n   */\n  function getPlaneBounds(plane) {\n    var planeTrbl = {\n      top: Infinity,\n      right: -Infinity,\n      bottom: -Infinity,\n      left: Infinity\n    };\n\n    plane.planeElement.forEach(function(element) {\n      if (!element.bounds) {\n        return;\n      }\n\n      var trbl = asTRBL(element.bounds);\n\n      planeTrbl.top = Math.min(trbl.top, planeTrbl.top);\n      planeTrbl.left = Math.min(trbl.left, planeTrbl.left);\n    });\n\n    return asBounds(planeTrbl);\n  }\n\n  /**\n   * @param {ModdleElement} businessObject\n   * @param {CanvasPlane} plane\n   *\n   * @return {boolean}\n   */\n  function shouldMoveToPlane(businessObject, plane) {\n    var parent = businessObject.$parent;\n\n    // don't move elements that are already on the plane\n    if (!is$1(parent, 'bpmn:SubProcess') || parent === plane.bpmnElement) {\n      return false;\n    }\n\n    // dataAssociations are children of the subprocess but rendered on process level\n    // cf. https://github.com/bpmn-io/bpmn-js/issues/1619\n    if (isAny(businessObject, [ 'bpmn:DataInputAssociation', 'bpmn:DataOutputAssociation' ])) {\n      return false;\n    }\n\n    return true;\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('diagram-js/lib/features/overlays/Overlays').default} Overlays\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Parent} Parent\n   * @typedef {import('../../model/Types').Shape} Shape\n   */\n\n  var LOW_PRIORITY$1 = 250;\n  var ARROW_DOWN_SVG = '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 16 16\"><path fill-rule=\"evenodd\" d=\"M4.81801948,3.50735931 L10.4996894,9.1896894 L10.5,4 L12,4 L12,12 L4,12 L4,10.5 L9.6896894,10.4996894 L3.75735931,4.56801948 C3.46446609,4.27512627 3.46446609,3.80025253 3.75735931,3.50735931 C4.05025253,3.21446609 4.52512627,3.21446609 4.81801948,3.50735931 Z\"/></svg>';\n\n  var EMPTY_MARKER = 'bjs-drilldown-empty';\n\n  /**\n   * @param {Canvas} canvas\n   * @param {EventBus} eventBus\n   * @param {ElementRegistry} elementRegistry\n   * @param {Overlays} overlays\n   */\n  function DrilldownOverlayBehavior(\n      canvas, eventBus, elementRegistry, overlays\n  ) {\n    CommandInterceptor.call(this, eventBus);\n\n    this._canvas = canvas;\n    this._eventBus = eventBus;\n    this._elementRegistry = elementRegistry;\n    this._overlays = overlays;\n\n    var self = this;\n\n    this.executed('shape.toggleCollapse', LOW_PRIORITY$1, function(context) {\n      var shape = context.shape;\n\n      // Add overlay to the collapsed shape\n      if (self._canDrillDown(shape)) {\n        self._addOverlay(shape);\n      } else {\n        self._removeOverlay(shape);\n      }\n    }, true);\n\n\n    this.reverted('shape.toggleCollapse', LOW_PRIORITY$1, function(context) {\n      var shape = context.shape;\n\n      // Add overlay to the collapsed shape\n      if (self._canDrillDown(shape)) {\n        self._addOverlay(shape);\n      } else {\n        self._removeOverlay(shape);\n      }\n    }, true);\n\n\n    this.executed([ 'shape.create', 'shape.move', 'shape.delete' ], LOW_PRIORITY$1,\n      function(context) {\n        var oldParent = context.oldParent,\n            newParent = context.newParent || context.parent,\n            shape = context.shape;\n\n        // Add overlay to the collapsed shape\n        if (self._canDrillDown(shape)) {\n          self._addOverlay(shape);\n        }\n\n        self._updateDrilldownOverlay(oldParent);\n        self._updateDrilldownOverlay(newParent);\n        self._updateDrilldownOverlay(shape);\n      }, true);\n\n\n    this.reverted([ 'shape.create', 'shape.move', 'shape.delete' ], LOW_PRIORITY$1,\n      function(context) {\n        var oldParent = context.oldParent,\n            newParent = context.newParent || context.parent,\n            shape = context.shape;\n\n        // Add overlay to the collapsed shape\n        if (self._canDrillDown(shape)) {\n          self._addOverlay(shape);\n        }\n\n        self._updateDrilldownOverlay(oldParent);\n        self._updateDrilldownOverlay(newParent);\n        self._updateDrilldownOverlay(shape);\n      }, true);\n\n\n    eventBus.on('import.render.complete', function() {\n      elementRegistry.filter(function(e) {\n        return self._canDrillDown(e);\n      }).map(function(el) {\n        self._addOverlay(el);\n      });\n    });\n\n  }\n\n  e(DrilldownOverlayBehavior, CommandInterceptor);\n\n  /**\n   * @param {Shape} shape\n   */\n  DrilldownOverlayBehavior.prototype._updateDrilldownOverlay = function(shape) {\n    var canvas = this._canvas;\n\n    if (!shape) {\n      return;\n    }\n\n    var root = canvas.findRoot(shape);\n\n    if (root) {\n      this._updateOverlayVisibility(root);\n    }\n  };\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  DrilldownOverlayBehavior.prototype._canDrillDown = function(element) {\n    var canvas = this._canvas;\n\n    return is$1(element, 'bpmn:SubProcess') && canvas.findRoot(getPlaneIdFromShape(element));\n  };\n\n  /**\n   * Update the visibility of the drilldown overlay. If the plane has no elements,\n   * the drilldown will only be shown when the element is selected.\n   *\n   * @param {Parent} element The collapsed root or shape.\n   */\n  DrilldownOverlayBehavior.prototype._updateOverlayVisibility = function(element) {\n    var overlays = this._overlays;\n\n    var businessObject = getBusinessObject(element);\n\n    var overlay = overlays.get({ element: businessObject.id, type: 'drilldown' })[0];\n\n    if (!overlay) {\n      return;\n    }\n\n    var hasFlowElements = businessObject\n      && businessObject.get('flowElements')\n      && businessObject.get('flowElements').length;\n\n    classes(overlay.html).toggle(EMPTY_MARKER, !hasFlowElements);\n  };\n\n  /**\n   * Add a drilldown button to the given element assuming the plane has the same\n   * ID as the element.\n   *\n   * @param {Shape} element The collapsed shape.\n   */\n  DrilldownOverlayBehavior.prototype._addOverlay = function(element) {\n    var canvas = this._canvas,\n        overlays = this._overlays;\n\n    var existingOverlays = overlays.get({ element: element, type: 'drilldown' });\n\n    if (existingOverlays.length) {\n      this._removeOverlay(element);\n    }\n\n    var button = domify$1('<button class=\"bjs-drilldown\">' + ARROW_DOWN_SVG + '</button>');\n\n    button.addEventListener('click', function() {\n      canvas.setRootElement(canvas.findRoot(getPlaneIdFromShape(element)));\n    });\n\n    overlays.add(element, 'drilldown', {\n      position: {\n        bottom: -7,\n        right: -8\n      },\n      html: button\n    });\n\n    this._updateOverlayVisibility(element);\n  };\n\n  DrilldownOverlayBehavior.prototype._removeOverlay = function(element) {\n    var overlays = this._overlays;\n\n    overlays.remove({\n      element: element,\n      type: 'drilldown'\n    });\n  };\n\n  DrilldownOverlayBehavior.$inject = [\n    'canvas',\n    'eventBus',\n    'elementRegistry',\n    'overlays'\n  ];\n\n  var DrilldownModdule = {\n    __depends__: [ OverlaysModule, ChangeSupportModule, RootElementsModule ],\n    __init__: [ 'drilldownBreadcrumbs', 'drilldownOverlayBehavior', 'drilldownCentering', 'subprocessCompatibility' ],\n    drilldownBreadcrumbs: [ 'type', DrilldownBreadcrumbs ],\n    drilldownCentering: [ 'type', DrilldownCentering ],\n    drilldownOverlayBehavior: [ 'type', DrilldownOverlayBehavior ],\n    subprocessCompatibility: [ 'type', SubprocessCompatibility ]\n  };\n\n  const CLASS_PATTERN = /^class[ {]/;\n\n\n  /**\n   * @param {function} fn\n   *\n   * @return {boolean}\n   */\n  function isClass(fn) {\n    return CLASS_PATTERN.test(fn.toString());\n  }\n\n  /**\n   * @param {any} obj\n   *\n   * @return {boolean}\n   */\n  function isArray(obj) {\n    return Array.isArray(obj);\n  }\n\n  /**\n   * @param {any} obj\n   * @param {string} prop\n   *\n   * @return {boolean}\n   */\n  function hasOwnProp(obj, prop) {\n    return Object.prototype.hasOwnProperty.call(obj, prop);\n  }\n\n  /**\n   * @typedef {import('./index').InjectAnnotated } InjectAnnotated\n   */\n\n  /**\n   * @template T\n   *\n   * @params {[...string[], T] | ...string[], T} args\n   *\n   * @return {T & InjectAnnotated}\n   */\n  function annotate(...args) {\n\n    if (args.length === 1 && isArray(args[0])) {\n      args = args[0];\n    }\n\n    args = [ ...args ];\n\n    const fn = args.pop();\n\n    fn.$inject = args;\n\n    return fn;\n  }\n\n\n  // Current limitations:\n  // - can't put into \"function arg\" comments\n  // function /* (no parenthesis like this) */ (){}\n  // function abc( /* xx (no parenthesis like this) */ a, b) {}\n  //\n  // Just put the comment before function or inside:\n  // /* (((this is fine))) */ function(a, b) {}\n  // function abc(a) { /* (((this is fine))) */}\n  //\n  // - can't reliably auto-annotate constructor; we'll match the\n  // first constructor(...) pattern found which may be the one\n  // of a nested class, too.\n\n  const CONSTRUCTOR_ARGS = /constructor\\s*[^(]*\\(\\s*([^)]*)\\)/m;\n  const FN_ARGS = /^(?:async\\s+)?(?:function\\s*[^(]*)?(?:\\(\\s*([^)]*)\\)|(\\w+))/m;\n  const FN_ARG = /\\/\\*([^*]*)\\*\\//m;\n\n  /**\n   * @param {unknown} fn\n   *\n   * @return {string[]}\n   */\n  function parseAnnotations(fn) {\n\n    if (typeof fn !== 'function') {\n      throw new Error(`Cannot annotate \"${fn}\". Expected a function!`);\n    }\n\n    const match = fn.toString().match(isClass(fn) ? CONSTRUCTOR_ARGS : FN_ARGS);\n\n    // may parse class without constructor\n    if (!match) {\n      return [];\n    }\n\n    const args = match[1] || match[2];\n\n    return args && args.split(',').map(arg => {\n      const argMatch = arg.match(FN_ARG);\n      return (argMatch && argMatch[1] || arg).trim();\n    }) || [];\n  }\n\n  /**\n   * @typedef { import('./index').ModuleDeclaration } ModuleDeclaration\n   * @typedef { import('./index').ModuleDefinition } ModuleDefinition\n   * @typedef { import('./index').InjectorContext } InjectorContext\n   */\n\n  /**\n   * Create a new injector with the given modules.\n   *\n   * @param {ModuleDefinition[]} modules\n   * @param {InjectorContext} [parent]\n   */\n  function Injector(modules, parent) {\n    parent = parent || {\n      get: function(name, strict) {\n        currentlyResolving.push(name);\n\n        if (strict === false) {\n          return null;\n        } else {\n          throw error(`No provider for \"${ name }\"!`);\n        }\n      }\n    };\n\n    const currentlyResolving = [];\n    const providers = this._providers = Object.create(parent._providers || null);\n    const instances = this._instances = Object.create(null);\n\n    const self = instances.injector = this;\n\n    const error = function(msg) {\n      const stack = currentlyResolving.join(' -> ');\n      currentlyResolving.length = 0;\n      return new Error(stack ? `${ msg } (Resolving: ${ stack })` : msg);\n    };\n\n    /**\n     * Return a named service.\n     *\n     * @param {string} name\n     * @param {boolean} [strict=true] if false, resolve missing services to null\n     *\n     * @return {any}\n     */\n    function get(name, strict) {\n      if (!providers[name] && name.indexOf('.') !== -1) {\n        const parts = name.split('.');\n        let pivot = get(parts.shift());\n\n        while (parts.length) {\n          pivot = pivot[parts.shift()];\n        }\n\n        return pivot;\n      }\n\n      if (hasOwnProp(instances, name)) {\n        return instances[name];\n      }\n\n      if (hasOwnProp(providers, name)) {\n        if (currentlyResolving.indexOf(name) !== -1) {\n          currentlyResolving.push(name);\n          throw error('Cannot resolve circular dependency!');\n        }\n\n        currentlyResolving.push(name);\n        instances[name] = providers[name][0](providers[name][1]);\n        currentlyResolving.pop();\n\n        return instances[name];\n      }\n\n      return parent.get(name, strict);\n    }\n\n    function fnDef(fn, locals) {\n\n      if (typeof locals === 'undefined') {\n        locals = {};\n      }\n\n      if (typeof fn !== 'function') {\n        if (isArray(fn)) {\n          fn = annotate(fn.slice());\n        } else {\n          throw error(`Cannot invoke \"${ fn }\". Expected a function!`);\n        }\n      }\n\n      const inject = fn.$inject || parseAnnotations(fn);\n      const dependencies = inject.map(dep => {\n        if (hasOwnProp(locals, dep)) {\n          return locals[dep];\n        } else {\n          return get(dep);\n        }\n      });\n\n      return {\n        fn: fn,\n        dependencies: dependencies\n      };\n    }\n\n    function instantiate(Type) {\n      const {\n        fn,\n        dependencies\n      } = fnDef(Type);\n\n      // instantiate var args constructor\n      const Constructor = Function.prototype.bind.apply(fn, [ null ].concat(dependencies));\n\n      return new Constructor();\n    }\n\n    function invoke(func, context, locals) {\n      const {\n        fn,\n        dependencies\n      } = fnDef(func, locals);\n\n      return fn.apply(context, dependencies);\n    }\n\n    /**\n     * @param {Injector} childInjector\n     *\n     * @return {Function}\n     */\n    function createPrivateInjectorFactory(childInjector) {\n      return annotate(key => childInjector.get(key));\n    }\n\n    /**\n     * @param {ModuleDefinition[]} modules\n     * @param {string[]} [forceNewInstances]\n     *\n     * @return {Injector}\n     */\n    function createChild(modules, forceNewInstances) {\n      if (forceNewInstances && forceNewInstances.length) {\n        const fromParentModule = Object.create(null);\n        const matchedScopes = Object.create(null);\n\n        const privateInjectorsCache = [];\n        const privateChildInjectors = [];\n        const privateChildFactories = [];\n\n        let provider;\n        let cacheIdx;\n        let privateChildInjector;\n        let privateChildInjectorFactory;\n\n        for (let name in providers) {\n          provider = providers[name];\n\n          if (forceNewInstances.indexOf(name) !== -1) {\n            if (provider[2] === 'private') {\n              cacheIdx = privateInjectorsCache.indexOf(provider[3]);\n              if (cacheIdx === -1) {\n                privateChildInjector = provider[3].createChild([], forceNewInstances);\n                privateChildInjectorFactory = createPrivateInjectorFactory(privateChildInjector);\n                privateInjectorsCache.push(provider[3]);\n                privateChildInjectors.push(privateChildInjector);\n                privateChildFactories.push(privateChildInjectorFactory);\n                fromParentModule[name] = [ privateChildInjectorFactory, name, 'private', privateChildInjector ];\n              } else {\n                fromParentModule[name] = [ privateChildFactories[cacheIdx], name, 'private', privateChildInjectors[cacheIdx] ];\n              }\n            } else {\n              fromParentModule[name] = [ provider[2], provider[1] ];\n            }\n            matchedScopes[name] = true;\n          }\n\n          if ((provider[2] === 'factory' || provider[2] === 'type') && provider[1].$scope) {\n            /* jshint -W083 */\n            forceNewInstances.forEach(scope => {\n              if (provider[1].$scope.indexOf(scope) !== -1) {\n                fromParentModule[name] = [ provider[2], provider[1] ];\n                matchedScopes[scope] = true;\n              }\n            });\n          }\n        }\n\n        forceNewInstances.forEach(scope => {\n          if (!matchedScopes[scope]) {\n            throw new Error('No provider for \"' + scope + '\". Cannot use provider from the parent!');\n          }\n        });\n\n        modules.unshift(fromParentModule);\n      }\n\n      return new Injector(modules, self);\n    }\n\n    const factoryMap = {\n      factory: invoke,\n      type: instantiate,\n      value: function(value) {\n        return value;\n      }\n    };\n\n    /**\n     * @param {ModuleDefinition} moduleDefinition\n     * @param {Injector} injector\n     */\n    function createInitializer(moduleDefinition, injector) {\n\n      const initializers = moduleDefinition.__init__ || [];\n\n      return function() {\n        initializers.forEach(initializer => {\n\n          // eagerly resolve component (fn or string)\n          if (typeof initializer === 'string') {\n            injector.get(initializer);\n          } else {\n            injector.invoke(initializer);\n          }\n        });\n      };\n    }\n\n    /**\n     * @param {ModuleDefinition} moduleDefinition\n     */\n    function loadModule(moduleDefinition) {\n\n      const moduleExports = moduleDefinition.__exports__;\n\n      // private module\n      if (moduleExports) {\n        const nestedModules = moduleDefinition.__modules__;\n\n        const clonedModule = Object.keys(moduleDefinition).reduce((clonedModule, key) => {\n\n          if (key !== '__exports__' && key !== '__modules__' && key !== '__init__' && key !== '__depends__') {\n            clonedModule[key] = moduleDefinition[key];\n          }\n\n          return clonedModule;\n        }, Object.create(null));\n\n        const childModules = (nestedModules || []).concat(clonedModule);\n\n        const privateInjector = createChild(childModules);\n        const getFromPrivateInjector = annotate(function(key) {\n          return privateInjector.get(key);\n        });\n\n        moduleExports.forEach(function(key) {\n          providers[key] = [ getFromPrivateInjector, key, 'private', privateInjector ];\n        });\n\n        // ensure child injector initializes\n        const initializers = (moduleDefinition.__init__ || []).slice();\n\n        initializers.unshift(function() {\n          privateInjector.init();\n        });\n\n        moduleDefinition = Object.assign({}, moduleDefinition, {\n          __init__: initializers\n        });\n\n        return createInitializer(moduleDefinition, privateInjector);\n      }\n\n      // normal module\n      Object.keys(moduleDefinition).forEach(function(key) {\n\n        if (key === '__init__' || key === '__depends__') {\n          return;\n        }\n\n        if (moduleDefinition[key][2] === 'private') {\n          providers[key] = moduleDefinition[key];\n          return;\n        }\n\n        const type = moduleDefinition[key][0];\n        const value = moduleDefinition[key][1];\n\n        providers[key] = [ factoryMap[type], arrayUnwrap(type, value), type ];\n      });\n\n      return createInitializer(moduleDefinition, self);\n    }\n\n    /**\n     * @param {ModuleDefinition[]} moduleDefinitions\n     * @param {ModuleDefinition} moduleDefinition\n     *\n     * @return {ModuleDefinition[]}\n     */\n    function resolveDependencies(moduleDefinitions, moduleDefinition) {\n\n      if (moduleDefinitions.indexOf(moduleDefinition) !== -1) {\n        return moduleDefinitions;\n      }\n\n      moduleDefinitions = (moduleDefinition.__depends__ || []).reduce(resolveDependencies, moduleDefinitions);\n\n      if (moduleDefinitions.indexOf(moduleDefinition) !== -1) {\n        return moduleDefinitions;\n      }\n\n      return moduleDefinitions.concat(moduleDefinition);\n    }\n\n    /**\n     * @param {ModuleDefinition[]} moduleDefinitions\n     *\n     * @return { () => void } initializerFn\n     */\n    function bootstrap(moduleDefinitions) {\n\n      const initializers = moduleDefinitions\n        .reduce(resolveDependencies, [])\n        .map(loadModule);\n\n      let initialized = false;\n\n      return function() {\n\n        if (initialized) {\n          return;\n        }\n\n        initialized = true;\n\n        initializers.forEach(initializer => initializer());\n      };\n    }\n\n    // public API\n    this.get = get;\n    this.invoke = invoke;\n    this.instantiate = instantiate;\n    this.createChild = createChild;\n\n    // setup\n    this.init = bootstrap(modules);\n  }\n\n\n  // helpers ///////////////\n\n  function arrayUnwrap(type, value) {\n    if (type !== 'value' && isArray(value)) {\n      value = annotate(value.slice());\n    }\n\n    return value;\n  }\n\n  /**\n   * @typedef {import('../core/EventBus').default} EventBus\n   * @typedef {import('./Styles').default} Styles\n   */\n\n  // apply default renderer with lowest possible priority\n  // so that it only kicks in if noone else could render\n  var DEFAULT_RENDER_PRIORITY = 1;\n\n  /**\n   * The default renderer used for shapes and connections.\n   *\n   * @param {EventBus} eventBus\n   * @param {Styles} styles\n   */\n  function DefaultRenderer(eventBus, styles) {\n\n    BaseRenderer.call(this, eventBus, DEFAULT_RENDER_PRIORITY);\n\n    this.CONNECTION_STYLE = styles.style([ 'no-fill' ], { strokeWidth: 5, stroke: 'fuchsia' });\n    this.SHAPE_STYLE = styles.style({ fill: 'white', stroke: 'fuchsia', strokeWidth: 2 });\n    this.FRAME_STYLE = styles.style([ 'no-fill' ], { stroke: 'fuchsia', strokeDasharray: 4, strokeWidth: 2 });\n  }\n\n  e(DefaultRenderer, BaseRenderer);\n\n\n  /**\n   * @private\n   */\n  DefaultRenderer.prototype.canRender = function() {\n    return true;\n  };\n\n  /**\n   * @private\n   */\n  DefaultRenderer.prototype.drawShape = function drawShape(visuals, element, attrs) {\n    var rect = create$1('rect');\n\n    attr$1(rect, {\n      x: 0,\n      y: 0,\n      width: element.width || 0,\n      height: element.height || 0\n    });\n\n    if (isFrameElement(element)) {\n      attr$1(rect, assign$1({}, this.FRAME_STYLE, attrs || {}));\n    } else {\n      attr$1(rect, assign$1({}, this.SHAPE_STYLE, attrs || {}));\n    }\n\n    append(visuals, rect);\n\n    return rect;\n  };\n\n  /**\n   * @private\n   */\n  DefaultRenderer.prototype.drawConnection = function drawConnection(visuals, connection, attrs) {\n\n    var line = createLine(connection.waypoints, assign$1({}, this.CONNECTION_STYLE, attrs || {}));\n    append(visuals, line);\n\n    return line;\n  };\n\n  /**\n   * @private\n   */\n  DefaultRenderer.prototype.getShapePath = function getShapePath(shape) {\n\n    var x = shape.x,\n        y = shape.y,\n        width = shape.width,\n        height = shape.height;\n\n    var shapePath = [\n      [ 'M', x, y ],\n      [ 'l', width, 0 ],\n      [ 'l', 0, height ],\n      [ 'l', -width, 0 ],\n      [ 'z' ]\n    ];\n\n    return componentsToPath(shapePath);\n  };\n\n  /**\n   * @private\n   */\n  DefaultRenderer.prototype.getConnectionPath = function getConnectionPath(connection) {\n    var waypoints = connection.waypoints;\n\n    var idx, point, connectionPath = [];\n\n    for (idx = 0; (point = waypoints[idx]); idx++) {\n\n      // take invisible docking into account\n      // when creating the path\n      point = point.original || point;\n\n      connectionPath.push([ idx === 0 ? 'M' : 'L', point.x, point.y ]);\n    }\n\n    return componentsToPath(connectionPath);\n  };\n\n  DefaultRenderer.$inject = [ 'eventBus', 'styles' ];\n\n  /**\n   * A component that manages shape styles\n   */\n  function Styles() {\n\n    var defaultTraits = {\n\n      'no-fill': {\n        fill: 'none'\n      },\n      'no-border': {\n        strokeOpacity: 0.0\n      },\n      'no-events': {\n        pointerEvents: 'none'\n      }\n    };\n\n    var self = this;\n\n    /**\n     * Builds a style definition from a className, a list of traits and an object\n     * of additional attributes.\n     *\n     * @param {string} className\n     * @param {string[]} [traits]\n     * @param {Object} [additionalAttrs]\n     *\n     * @return {Object} the style definition\n     */\n    this.cls = function(className, traits, additionalAttrs) {\n      var attrs = this.style(traits, additionalAttrs);\n\n      return assign$1(attrs, { 'class': className });\n    };\n\n    /**\n     * Builds a style definition from a list of traits and an object of additional\n     * attributes.\n     *\n     * @param {string[]} [traits]\n     * @param {Object} additionalAttrs\n     *\n     * @return {Object} the style definition\n     */\n    this.style = function(traits, additionalAttrs) {\n\n      if (!isArray$2(traits) && !additionalAttrs) {\n        additionalAttrs = traits;\n        traits = [];\n      }\n\n      var attrs = reduce(traits, function(attrs, t) {\n        return assign$1(attrs, defaultTraits[t] || {});\n      }, {});\n\n      return additionalAttrs ? assign$1(attrs, additionalAttrs) : attrs;\n    };\n\n\n    /**\n     * Computes a style definition from a list of traits and an object of\n     * additional attributes, with custom style definition object.\n     *\n     * @param {Object} custom\n     * @param {string[]} [traits]\n     * @param {Object} defaultStyles\n     *\n     * @return {Object} the style definition\n     */\n    this.computeStyle = function(custom, traits, defaultStyles) {\n      if (!isArray$2(traits)) {\n        defaultStyles = traits;\n        traits = [];\n      }\n\n      return self.style(traits || [], assign$1({}, defaultStyles, custom || {}));\n    };\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var DrawModule = {\n    __init__: [ 'defaultRenderer' ],\n    defaultRenderer: [ 'type', DefaultRenderer ],\n    styles: [ 'type', Styles ]\n  };\n\n  /**\n   * Failsafe remove an element from a collection\n   *\n   * @param {Array<Object>} [collection]\n   * @param {Object} [element]\n   *\n   * @return {number} the previous index of the element\n   */\n  function remove(collection, element) {\n\n    if (!collection || !element) {\n      return -1;\n    }\n\n    var idx = collection.indexOf(element);\n\n    if (idx !== -1) {\n      collection.splice(idx, 1);\n    }\n\n    return idx;\n  }\n\n  /**\n   * Fail save add an element to the given connection, ensuring\n   * it does not yet exist.\n   *\n   * @param {Array<Object>} collection\n   * @param {Object} element\n   * @param {number} [idx]\n   */\n  function add(collection, element, idx) {\n\n    if (!collection || !element) {\n      return;\n    }\n\n    if (typeof idx !== 'number') {\n      idx = -1;\n    }\n\n    var currentIdx = collection.indexOf(element);\n\n    if (currentIdx !== -1) {\n\n      if (currentIdx === idx) {\n\n        // nothing to do, position has not changed\n        return;\n      } else {\n\n        if (idx !== -1) {\n\n          // remove from current position\n          collection.splice(currentIdx, 1);\n        } else {\n\n          // already exists in collection\n          return;\n        }\n      }\n    }\n\n    if (idx !== -1) {\n\n      // insert at specified position\n      collection.splice(idx, 0, element);\n    } else {\n\n      // push to end\n      collection.push(element);\n    }\n  }\n\n  /**\n   * @typedef {import('./Types').ConnectionLike} ConnectionLike\n   * @typedef {import('./Types').RootLike} RootLike\n   * @typedef {import('./Types').ParentLike } ParentLike\n   * @typedef {import('./Types').ShapeLike} ShapeLike\n   *\n   * @typedef { {\n   *   container?: HTMLElement;\n   *   deferUpdate?: boolean;\n   *   width?: number;\n   *   height?: number;\n   * } } CanvasConfig\n   * @typedef { {\n   *   group: SVGElement;\n   *   index: number;\n   *   visible: boolean;\n   * } } CanvasLayer\n   * @typedef { {\n   *   [key: string]: CanvasLayer;\n   * } } CanvasLayers\n   * @typedef { {\n   *   rootElement: ShapeLike;\n   *   layer: CanvasLayer;\n   * } } CanvasPlane\n   * @typedef { {\n   *   scale: number;\n   *   inner: Rect;\n   *   outer: Dimensions;\n   * } & Rect } CanvasViewbox\n   *\n   * @typedef {import('./ElementRegistry').default} ElementRegistry\n   * @typedef {import('./EventBus').default} EventBus\n   * @typedef {import('./GraphicsFactory').default} GraphicsFactory\n   *\n   * @typedef {import('../util/Types').Dimensions} Dimensions\n   * @typedef {import('../util/Types').Point} Point\n   * @typedef {import('../util/Types').Rect} Rect\n   * @typedef {import('../util/Types').RectTRBL} RectTRBL\n   */\n\n  function round(number, resolution) {\n    return Math.round(number * resolution) / resolution;\n  }\n\n  function ensurePx(number) {\n    return isNumber(number) ? number + 'px' : number;\n  }\n\n  function findRoot(element) {\n    while (element.parent) {\n      element = element.parent;\n    }\n\n    return element;\n  }\n\n  /**\n   * Creates a HTML container element for a SVG element with\n   * the given configuration\n   *\n   * @param {CanvasConfig} options\n   *\n   * @return {HTMLElement} the container element\n   */\n  function createContainer(options) {\n\n    options = assign$1({}, { width: '100%', height: '100%' }, options);\n\n    const container = options.container || document.body;\n\n    // create a <div> around the svg element with the respective size\n    // this way we can always get the correct container size\n    // (this is impossible for <svg> elements at the moment)\n    const parent = document.createElement('div');\n    parent.setAttribute('class', 'djs-container djs-parent');\n\n    assign(parent, {\n      position: 'relative',\n      overflow: 'hidden',\n      width: ensurePx(options.width),\n      height: ensurePx(options.height)\n    });\n\n    container.appendChild(parent);\n\n    return parent;\n  }\n\n  function createGroup(parent, cls, childIndex) {\n    const group = create$1('g');\n    classes$1(group).add(cls);\n\n    const index = childIndex !== undefined ? childIndex : parent.childNodes.length - 1;\n\n    // must ensure second argument is node or _null_\n    // cf. https://developer.mozilla.org/en-US/docs/Web/API/Node/insertBefore\n    parent.insertBefore(group, parent.childNodes[index] || null);\n\n    return group;\n  }\n\n  const BASE_LAYER = 'base';\n\n  // render plane contents behind utility layers\n  const PLANE_LAYER_INDEX = 0;\n  const UTILITY_LAYER_INDEX = 1;\n\n\n  const REQUIRED_MODEL_ATTRS = {\n    shape: [ 'x', 'y', 'width', 'height' ],\n    connection: [ 'waypoints' ]\n  };\n\n  /**\n   * The main drawing canvas.\n   *\n   * @class\n   * @constructor\n   *\n   * @emits Canvas#canvas.init\n   *\n   * @param {CanvasConfig|null} config\n   * @param {EventBus} eventBus\n   * @param {GraphicsFactory} graphicsFactory\n   * @param {ElementRegistry} elementRegistry\n   */\n  function Canvas(config, eventBus, graphicsFactory, elementRegistry) {\n    this._eventBus = eventBus;\n    this._elementRegistry = elementRegistry;\n    this._graphicsFactory = graphicsFactory;\n\n    /**\n     * @type {number}\n     */\n    this._rootsIdx = 0;\n\n    /**\n     * @type {CanvasLayers}\n     */\n    this._layers = {};\n\n    /**\n     * @type {CanvasPlane[]}\n     */\n    this._planes = [];\n\n    /**\n     * @type {RootLike|null}\n     */\n    this._rootElement = null;\n\n    this._init(config || {});\n  }\n\n  Canvas.$inject = [\n    'config.canvas',\n    'eventBus',\n    'graphicsFactory',\n    'elementRegistry'\n  ];\n\n  /**\n   * Creates a <svg> element that is wrapped into a <div>.\n   * This way we are always able to correctly figure out the size of the svg element\n   * by querying the parent node.\n\n   * (It is not possible to get the size of a svg element cross browser @ 2014-04-01)\n\n   * <div class=\"djs-container\" style=\"width: {desired-width}, height: {desired-height}\">\n   *   <svg width=\"100%\" height=\"100%\">\n   *    ...\n   *   </svg>\n   * </div>\n   *\n   * @param {CanvasConfig} config\n   */\n  Canvas.prototype._init = function(config) {\n\n    const eventBus = this._eventBus;\n\n    // html container\n    const container = this._container = createContainer(config);\n\n    const svg = this._svg = create$1('svg');\n    attr$1(svg, { width: '100%', height: '100%' });\n\n    append(container, svg);\n\n    const viewport = this._viewport = createGroup(svg, 'viewport');\n\n    // debounce canvas.viewbox.changed events\n    // for smoother diagram interaction\n    if (config.deferUpdate !== false) {\n      this._viewboxChanged = debounce(bind$2(this._viewboxChanged, this), 300);\n    }\n\n    eventBus.on('diagram.init', () => {\n\n      /**\n       * An event indicating that the canvas is ready to be drawn on.\n       *\n       * @memberOf Canvas\n       *\n       * @event canvas.init\n       *\n       * @type {Object}\n       * @property {SVGElement} svg the created svg element\n       * @property {SVGElement} viewport the direct parent of diagram elements and shapes\n       */\n      eventBus.fire('canvas.init', {\n        svg: svg,\n        viewport: viewport\n      });\n\n    });\n\n    // reset viewbox on shape changes to\n    // recompute the viewbox\n    eventBus.on([\n      'shape.added',\n      'connection.added',\n      'shape.removed',\n      'connection.removed',\n      'elements.changed',\n      'root.set'\n    ], () => {\n      delete this._cachedViewbox;\n    });\n\n    eventBus.on('diagram.destroy', 500, this._destroy, this);\n    eventBus.on('diagram.clear', 500, this._clear, this);\n  };\n\n  Canvas.prototype._destroy = function() {\n    this._eventBus.fire('canvas.destroy', {\n      svg: this._svg,\n      viewport: this._viewport\n    });\n\n    const parent = this._container.parentNode;\n\n    if (parent) {\n      parent.removeChild(this._container);\n    }\n\n    delete this._svg;\n    delete this._container;\n    delete this._layers;\n    delete this._planes;\n    delete this._rootElement;\n    delete this._viewport;\n  };\n\n  Canvas.prototype._clear = function() {\n\n    const allElements = this._elementRegistry.getAll();\n\n    // remove all elements\n    allElements.forEach(element => {\n      const type = getType(element);\n\n      if (type === 'root') {\n        this.removeRootElement(element);\n      } else {\n        this._removeElement(element, type);\n      }\n    });\n\n    // remove all planes\n    this._planes = [];\n    this._rootElement = null;\n\n    // force recomputation of view box\n    delete this._cachedViewbox;\n  };\n\n  /**\n   * Returns the default layer on which\n   * all elements are drawn.\n   *\n   * @return {SVGElement}  The SVG element of the layer.\n   */\n  Canvas.prototype.getDefaultLayer = function() {\n    return this.getLayer(BASE_LAYER, PLANE_LAYER_INDEX);\n  };\n\n  /**\n   * Returns a layer that is used to draw elements\n   * or annotations on it.\n   *\n   * Non-existing layers retrieved through this method\n   * will be created. During creation, the optional index\n   * may be used to create layers below or above existing layers.\n   * A layer with a certain index is always created above all\n   * existing layers with the same index.\n   *\n   * @param {string} name The name of the layer.\n   * @param {number} [index] The index of the layer.\n   *\n   * @return {SVGElement} The SVG element of the layer.\n   */\n  Canvas.prototype.getLayer = function(name, index) {\n\n    if (!name) {\n      throw new Error('must specify a name');\n    }\n\n    let layer = this._layers[name];\n\n    if (!layer) {\n      layer = this._layers[name] = this._createLayer(name, index);\n    }\n\n    // throw an error if layer creation / retrival is\n    // requested on different index\n    if (typeof index !== 'undefined' && layer.index !== index) {\n      throw new Error('layer <' + name + '> already created at index <' + index + '>');\n    }\n\n    return layer.group;\n  };\n\n  /**\n   * For a given index, return the number of layers that have a higher index and\n   * are visible.\n   *\n   * This is used to determine the node a layer should be inserted at.\n   *\n   * @param {number} index\n   *\n   * @return {number}\n   */\n  Canvas.prototype._getChildIndex = function(index) {\n    return reduce(this._layers, function(childIndex, layer) {\n      if (layer.visible && index >= layer.index) {\n        childIndex++;\n      }\n\n      return childIndex;\n    }, 0);\n  };\n\n  /**\n   * Creates a given layer and returns it.\n   *\n   * @param {string} name\n   * @param {number} [index=0]\n   *\n   * @return {CanvasLayer}\n   */\n  Canvas.prototype._createLayer = function(name, index) {\n\n    if (typeof index === 'undefined') {\n      index = UTILITY_LAYER_INDEX;\n    }\n\n    const childIndex = this._getChildIndex(index);\n\n    return {\n      group: createGroup(this._viewport, 'layer-' + name, childIndex),\n      index: index,\n      visible: true\n    };\n  };\n\n\n  /**\n   * Shows a given layer.\n   *\n   * @param {string} name The name of the layer.\n   *\n   * @return {SVGElement} The SVG element of the layer.\n   */\n  Canvas.prototype.showLayer = function(name) {\n\n    if (!name) {\n      throw new Error('must specify a name');\n    }\n\n    const layer = this._layers[name];\n\n    if (!layer) {\n      throw new Error('layer <' + name + '> does not exist');\n    }\n\n    const viewport = this._viewport;\n    const group = layer.group;\n    const index = layer.index;\n\n    if (layer.visible) {\n      return group;\n    }\n\n    const childIndex = this._getChildIndex(index);\n\n    viewport.insertBefore(group, viewport.childNodes[childIndex] || null);\n\n    layer.visible = true;\n\n    return group;\n  };\n\n  /**\n   * Hides a given layer.\n   *\n   * @param {string} name The name of the layer.\n   *\n   * @return {SVGElement} The SVG element of the layer.\n   */\n  Canvas.prototype.hideLayer = function(name) {\n\n    if (!name) {\n      throw new Error('must specify a name');\n    }\n\n    const layer = this._layers[name];\n\n    if (!layer) {\n      throw new Error('layer <' + name + '> does not exist');\n    }\n\n    const group = layer.group;\n\n    if (!layer.visible) {\n      return group;\n    }\n\n    remove$2(group);\n\n    layer.visible = false;\n\n    return group;\n  };\n\n\n  Canvas.prototype._removeLayer = function(name) {\n\n    const layer = this._layers[name];\n\n    if (layer) {\n      delete this._layers[name];\n\n      remove$2(layer.group);\n    }\n  };\n\n  /**\n   * Returns the currently active layer. Can be null.\n   *\n   * @return {CanvasLayer|null} The active layer of `null`.\n   */\n  Canvas.prototype.getActiveLayer = function() {\n    const plane = this._findPlaneForRoot(this.getRootElement());\n\n    if (!plane) {\n      return null;\n    }\n\n    return plane.layer;\n  };\n\n\n  /**\n   * Returns the plane which contains the given element.\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element or its ID.\n   *\n   * @return {RootLike|undefined} The root of the element.\n   */\n  Canvas.prototype.findRoot = function(element) {\n    if (typeof element === 'string') {\n      element = this._elementRegistry.get(element);\n    }\n\n    if (!element) {\n      return;\n    }\n\n    const plane = this._findPlaneForRoot(\n      findRoot(element)\n    ) || {};\n\n    return plane.rootElement;\n  };\n\n  /**\n   * Return a list of all root elements on the diagram.\n   *\n   * @return {(RootLike)[]} The list of root elements.\n   */\n  Canvas.prototype.getRootElements = function() {\n    return this._planes.map(function(plane) {\n      return plane.rootElement;\n    });\n  };\n\n  Canvas.prototype._findPlaneForRoot = function(rootElement) {\n    return find(this._planes, function(plane) {\n      return plane.rootElement === rootElement;\n    });\n  };\n\n\n  /**\n   * Returns the html element that encloses the\n   * drawing canvas.\n   *\n   * @return {HTMLElement} The HTML element of the container.\n   */\n  Canvas.prototype.getContainer = function() {\n    return this._container;\n  };\n\n\n  // markers //////////////////////\n\n  Canvas.prototype._updateMarker = function(element, marker, add) {\n    let container;\n\n    if (!element.id) {\n      element = this._elementRegistry.get(element);\n    }\n\n    // we need to access all\n    container = this._elementRegistry._elements[element.id];\n\n    if (!container) {\n      return;\n    }\n\n    forEach$1([ container.gfx, container.secondaryGfx ], function(gfx) {\n      if (gfx) {\n\n        // invoke either addClass or removeClass based on mode\n        if (add) {\n          classes$1(gfx).add(marker);\n        } else {\n          classes$1(gfx).remove(marker);\n        }\n      }\n    });\n\n    /**\n     * An event indicating that a marker has been updated for an element\n     *\n     * @event element.marker.update\n     * @type {Object}\n     * @property {Element} element the shape\n     * @property {SVGElement} gfx the graphical representation of the shape\n     * @property {string} marker\n     * @property {boolean} add true if the marker was added, false if it got removed\n     */\n    this._eventBus.fire('element.marker.update', { element: element, gfx: container.gfx, marker: marker, add: !!add });\n  };\n\n\n  /**\n   * Adds a marker to an element (basically a css class).\n   *\n   * Fires the element.marker.update event, making it possible to\n   * integrate extension into the marker life-cycle, too.\n   *\n   * @example\n   *\n   * ```javascript\n   * canvas.addMarker('foo', 'some-marker');\n   *\n   * const fooGfx = canvas.getGraphics('foo');\n   *\n   * fooGfx; // <g class=\"... some-marker\"> ... </g>\n   * ```\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element or its ID.\n   * @param {string} marker The marker.\n   */\n  Canvas.prototype.addMarker = function(element, marker) {\n    this._updateMarker(element, marker, true);\n  };\n\n\n  /**\n   * Remove a marker from an element.\n   *\n   * Fires the element.marker.update event, making it possible to\n   * integrate extension into the marker life-cycle, too.\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element or its ID.\n   * @param {string} marker The marker.\n   */\n  Canvas.prototype.removeMarker = function(element, marker) {\n    this._updateMarker(element, marker, false);\n  };\n\n  /**\n   * Check whether an element has a given marker.\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element or its ID.\n   * @param {string} marker The marker.\n   */\n  Canvas.prototype.hasMarker = function(element, marker) {\n    if (!element.id) {\n      element = this._elementRegistry.get(element);\n    }\n\n    const gfx = this.getGraphics(element);\n\n    return classes$1(gfx).has(marker);\n  };\n\n  /**\n   * Toggles a marker on an element.\n   *\n   * Fires the element.marker.update event, making it possible to\n   * integrate extension into the marker life-cycle, too.\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element or its ID.\n   * @param {string} marker The marker.\n   */\n  Canvas.prototype.toggleMarker = function(element, marker) {\n    if (this.hasMarker(element, marker)) {\n      this.removeMarker(element, marker);\n    } else {\n      this.addMarker(element, marker);\n    }\n  };\n\n  /**\n   * Returns the current root element.\n   *\n   * Supports two different modes for handling root elements:\n   *\n   * 1. if no root element has been added before, an implicit root will be added\n   * and returned. This is used in applications that don't require explicit\n   * root elements.\n   *\n   * 2. when root elements have been added before calling `getRootElement`,\n   * root elements can be null. This is used for applications that want to manage\n   * root elements themselves.\n   *\n   * @return {RootLike} The current root element.\n   */\n  Canvas.prototype.getRootElement = function() {\n    const rootElement = this._rootElement;\n\n    // can return null if root elements are present but none was set yet\n    if (rootElement || this._planes.length) {\n      return rootElement;\n    }\n\n    return this.setRootElement(this.addRootElement(null));\n  };\n\n  /**\n   * Adds a given root element and returns it.\n   *\n   * @param {RootLike} [rootElement] The root element to be added.\n   *\n   * @return {RootLike} The added root element or an implicit root element.\n   */\n  Canvas.prototype.addRootElement = function(rootElement) {\n    const idx = this._rootsIdx++;\n\n    if (!rootElement) {\n      rootElement = {\n        id: '__implicitroot_' + idx,\n        children: [],\n        isImplicit: true\n      };\n    }\n\n    const layerName = rootElement.layer = 'root-' + idx;\n\n    this._ensureValid('root', rootElement);\n\n    const layer = this.getLayer(layerName, PLANE_LAYER_INDEX);\n\n    this.hideLayer(layerName);\n\n    this._addRoot(rootElement, layer);\n\n    this._planes.push({\n      rootElement: rootElement,\n      layer: layer\n    });\n\n    return rootElement;\n  };\n\n  /**\n   * Removes a given root element and returns it.\n   *\n   * @param {RootLike|string} rootElement element or element ID\n   *\n   * @return {RootLike|undefined} removed element\n   */\n  Canvas.prototype.removeRootElement = function(rootElement) {\n\n    if (typeof rootElement === 'string') {\n      rootElement = this._elementRegistry.get(rootElement);\n    }\n\n    const plane = this._findPlaneForRoot(rootElement);\n\n    if (!plane) {\n      return;\n    }\n\n    // hook up life-cycle events\n    this._removeRoot(rootElement);\n\n    // clean up layer\n    this._removeLayer(rootElement.layer);\n\n    // clean up plane\n    this._planes = this._planes.filter(function(plane) {\n      return plane.rootElement !== rootElement;\n    });\n\n    // clean up active root\n    if (this._rootElement === rootElement) {\n      this._rootElement = null;\n    }\n\n    return rootElement;\n  };\n\n\n  /**\n   * Sets a given element as the new root element for the canvas\n   * and returns the new root element.\n   *\n   * @param {RootLike} rootElement The root element to be set.\n   *\n   * @return {RootLike} The set root element.\n   */\n  Canvas.prototype.setRootElement = function(rootElement) {\n\n    if (rootElement === this._rootElement) {\n      return;\n    }\n\n    let plane;\n\n    if (!rootElement) {\n      throw new Error('rootElement required');\n    }\n\n    plane = this._findPlaneForRoot(rootElement);\n\n    // give set add semantics for backwards compatibility\n    if (!plane) {\n      rootElement = this.addRootElement(rootElement);\n    }\n\n    this._setRoot(rootElement);\n\n    return rootElement;\n  };\n\n\n  Canvas.prototype._removeRoot = function(element) {\n    const elementRegistry = this._elementRegistry,\n          eventBus = this._eventBus;\n\n    // simulate element remove event sequence\n    eventBus.fire('root.remove', { element: element });\n    eventBus.fire('root.removed', { element: element });\n\n    elementRegistry.remove(element);\n  };\n\n\n  Canvas.prototype._addRoot = function(element, gfx) {\n    const elementRegistry = this._elementRegistry,\n          eventBus = this._eventBus;\n\n    // resemble element add event sequence\n    eventBus.fire('root.add', { element: element });\n\n    elementRegistry.add(element, gfx);\n\n    eventBus.fire('root.added', { element: element, gfx: gfx });\n  };\n\n\n  Canvas.prototype._setRoot = function(rootElement, layer) {\n\n    const currentRoot = this._rootElement;\n\n    if (currentRoot) {\n\n      // un-associate previous root element <svg>\n      this._elementRegistry.updateGraphics(currentRoot, null, true);\n\n      // hide previous layer\n      this.hideLayer(currentRoot.layer);\n    }\n\n    if (rootElement) {\n\n      if (!layer) {\n        layer = this._findPlaneForRoot(rootElement).layer;\n      }\n\n      // associate element with <svg>\n      this._elementRegistry.updateGraphics(rootElement, this._svg, true);\n\n      // show root layer\n      this.showLayer(rootElement.layer);\n    }\n\n    this._rootElement = rootElement;\n\n    this._eventBus.fire('root.set', { element: rootElement });\n  };\n\n  Canvas.prototype._ensureValid = function(type, element) {\n    if (!element.id) {\n      throw new Error('element must have an id');\n    }\n\n    if (this._elementRegistry.get(element.id)) {\n      throw new Error('element <' + element.id + '> already exists');\n    }\n\n    const requiredAttrs = REQUIRED_MODEL_ATTRS[type];\n\n    const valid = every(requiredAttrs, function(attr) {\n      return typeof element[attr] !== 'undefined';\n    });\n\n    if (!valid) {\n      throw new Error(\n        'must supply { ' + requiredAttrs.join(', ') + ' } with ' + type);\n    }\n  };\n\n  Canvas.prototype._setParent = function(element, parent, parentIndex) {\n    add(parent.children, element, parentIndex);\n    element.parent = parent;\n  };\n\n  /**\n   * Adds an element to the canvas.\n   *\n   * This wires the parent <-> child relationship between the element and\n   * a explicitly specified parent or an implicit root element.\n   *\n   * During add it emits the events\n   *\n   *  * <{type}.add> (element, parent)\n   *  * <{type}.added> (element, gfx)\n   *\n   * Extensions may hook into these events to perform their magic.\n   *\n   * @param {string} type\n   * @param {ConnectionLike|ShapeLike} element\n   * @param {ShapeLike} [parent]\n   * @param {number} [parentIndex]\n   *\n   * @return {ConnectionLike|ShapeLike} The added element.\n   */\n  Canvas.prototype._addElement = function(type, element, parent, parentIndex) {\n\n    parent = parent || this.getRootElement();\n\n    const eventBus = this._eventBus,\n          graphicsFactory = this._graphicsFactory;\n\n    this._ensureValid(type, element);\n\n    eventBus.fire(type + '.add', { element: element, parent: parent });\n\n    this._setParent(element, parent, parentIndex);\n\n    // create graphics\n    const gfx = graphicsFactory.create(type, element, parentIndex);\n\n    this._elementRegistry.add(element, gfx);\n\n    // update its visual\n    graphicsFactory.update(type, element, gfx);\n\n    eventBus.fire(type + '.added', { element: element, gfx: gfx });\n\n    return element;\n  };\n\n  /**\n   * Adds a shape to the canvas.\n   *\n   * @param {ShapeLike} shape The shape to be added\n   * @param {ParentLike} [parent] The shape's parent.\n   * @param {number} [parentIndex] The index at which to add the shape to the parent's children.\n   *\n   * @return {ShapeLike} The added shape.\n   */\n  Canvas.prototype.addShape = function(shape, parent, parentIndex) {\n    return this._addElement('shape', shape, parent, parentIndex);\n  };\n\n  /**\n   * Adds a connection to the canvas.\n   *\n   * @param {ConnectionLike} connection The connection to be added.\n   * @param {ParentLike} [parent] The connection's parent.\n   * @param {number} [parentIndex] The index at which to add the connection to the parent's children.\n   *\n   * @return {ConnectionLike} The added connection.\n   */\n  Canvas.prototype.addConnection = function(connection, parent, parentIndex) {\n    return this._addElement('connection', connection, parent, parentIndex);\n  };\n\n\n  /**\n   * Internal remove element\n   */\n  Canvas.prototype._removeElement = function(element, type) {\n\n    const elementRegistry = this._elementRegistry,\n          graphicsFactory = this._graphicsFactory,\n          eventBus = this._eventBus;\n\n    element = elementRegistry.get(element.id || element);\n\n    if (!element) {\n\n      // element was removed already\n      return;\n    }\n\n    eventBus.fire(type + '.remove', { element: element });\n\n    graphicsFactory.remove(element);\n\n    // unset parent <-> child relationship\n    remove(element.parent && element.parent.children, element);\n    element.parent = null;\n\n    eventBus.fire(type + '.removed', { element: element });\n\n    elementRegistry.remove(element);\n\n    return element;\n  };\n\n\n  /**\n   * Removes a shape from the canvas.\n   *\n   * @fires ShapeRemoveEvent\n   * @fires ShapeRemovedEvent\n   *\n   * @param {ShapeLike|string} shape The shape or its ID.\n   *\n   * @return {ShapeLike} The removed shape.\n   */\n  Canvas.prototype.removeShape = function(shape) {\n\n    /**\n     * An event indicating that a shape is about to be removed from the canvas.\n     *\n     * @memberOf Canvas\n     *\n     * @event ShapeRemoveEvent\n     * @type {Object}\n     * @property {ShapeLike} element The shape.\n     * @property {SVGElement} gfx The graphical element.\n     */\n\n    /**\n     * An event indicating that a shape has been removed from the canvas.\n     *\n     * @memberOf Canvas\n     *\n     * @event ShapeRemovedEvent\n     * @type {Object}\n     * @property {ShapeLike} element The shape.\n     * @property {SVGElement} gfx The graphical element.\n     */\n    return this._removeElement(shape, 'shape');\n  };\n\n\n  /**\n   * Removes a connection from the canvas.\n   *\n   * @fires ConnectionRemoveEvent\n   * @fires ConnectionRemovedEvent\n   *\n   * @param {ConnectionLike|string} connection The connection or its ID.\n   *\n   * @return {ConnectionLike} The removed connection.\n   */\n  Canvas.prototype.removeConnection = function(connection) {\n\n    /**\n     * An event indicating that a connection is about to be removed from the canvas.\n     *\n     * @memberOf Canvas\n     *\n     * @event ConnectionRemoveEvent\n     * @type {Object}\n     * @property {ConnectionLike} element The connection.\n     * @property {SVGElement} gfx The graphical element.\n     */\n\n    /**\n     * An event indicating that a connection has been removed from the canvas.\n     *\n     * @memberOf Canvas\n     *\n     * @event ConnectionRemovedEvent\n     * @type {Object}\n     * @property {ConnectionLike} element The connection.\n     * @property {SVGElement} gfx The graphical element.\n     */\n    return this._removeElement(connection, 'connection');\n  };\n\n\n  /**\n   * Returns the graphical element of an element.\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element or its ID.\n   * @param {boolean} [secondary=false] Whether to return the secondary graphical element.\n   *\n   * @return {SVGElement} The graphical element.\n   */\n  Canvas.prototype.getGraphics = function(element, secondary) {\n    return this._elementRegistry.getGraphics(element, secondary);\n  };\n\n\n  /**\n   * Perform a viewbox update via a given change function.\n   *\n   * @param {Function} changeFn\n   */\n  Canvas.prototype._changeViewbox = function(changeFn) {\n\n    // notify others of the upcoming viewbox change\n    this._eventBus.fire('canvas.viewbox.changing');\n\n    // perform actual change\n    changeFn.apply(this);\n\n    // reset the cached viewbox so that\n    // a new get operation on viewbox or zoom\n    // triggers a viewbox re-computation\n    this._cachedViewbox = null;\n\n    // notify others of the change; this step\n    // may or may not be debounced\n    this._viewboxChanged();\n  };\n\n  Canvas.prototype._viewboxChanged = function() {\n    this._eventBus.fire('canvas.viewbox.changed', { viewbox: this.viewbox() });\n  };\n\n\n  /**\n   * Gets or sets the view box of the canvas, i.e. the\n   * area that is currently displayed.\n   *\n   * The getter may return a cached viewbox (if it is currently\n   * changing). To force a recomputation, pass `false` as the first argument.\n   *\n   * @example\n   *\n   * ```javascript\n   * canvas.viewbox({ x: 100, y: 100, width: 500, height: 500 })\n   *\n   * // sets the visible area of the diagram to (100|100) -> (600|100)\n   * // and and scales it according to the diagram width\n   *\n   * const viewbox = canvas.viewbox(); // pass `false` to force recomputing the box.\n   *\n   * console.log(viewbox);\n   * // {\n   * //   inner: Dimensions,\n   * //   outer: Dimensions,\n   * //   scale,\n   * //   x, y,\n   * //   width, height\n   * // }\n   *\n   * // if the current diagram is zoomed and scrolled, you may reset it to the\n   * // default zoom via this method, too:\n   *\n   * const zoomedAndScrolledViewbox = canvas.viewbox();\n   *\n   * canvas.viewbox({\n   *   x: 0,\n   *   y: 0,\n   *   width: zoomedAndScrolledViewbox.outer.width,\n   *   height: zoomedAndScrolledViewbox.outer.height\n   * });\n   * ```\n   *\n   * @param {Rect} [box] The viewbox to be set.\n   *\n   * @return {CanvasViewbox} The set viewbox.\n   */\n  Canvas.prototype.viewbox = function(box) {\n\n    if (box === undefined && this._cachedViewbox) {\n      return this._cachedViewbox;\n    }\n\n    const viewport = this._viewport,\n          outerBox = this.getSize();\n    let innerBox,\n        matrix,\n        activeLayer,\n        transform,\n        scale,\n        x, y;\n\n    if (!box) {\n\n      // compute the inner box based on the\n      // diagrams active layer. This allows us to exclude\n      // external components, such as overlays\n\n      activeLayer = this._rootElement ? this.getActiveLayer() : null;\n      innerBox = activeLayer && activeLayer.getBBox() || {};\n\n      transform = transform$1(viewport);\n      matrix = transform ? transform.matrix : createMatrix();\n      scale = round(matrix.a, 1000);\n\n      x = round(-matrix.e || 0, 1000);\n      y = round(-matrix.f || 0, 1000);\n\n      box = this._cachedViewbox = {\n        x: x ? x / scale : 0,\n        y: y ? y / scale : 0,\n        width: outerBox.width / scale,\n        height: outerBox.height / scale,\n        scale: scale,\n        inner: {\n          width: innerBox.width || 0,\n          height: innerBox.height || 0,\n          x: innerBox.x || 0,\n          y: innerBox.y || 0\n        },\n        outer: outerBox\n      };\n\n      return box;\n    } else {\n\n      this._changeViewbox(function() {\n        scale = Math.min(outerBox.width / box.width, outerBox.height / box.height);\n\n        const matrix = this._svg.createSVGMatrix()\n          .scale(scale)\n          .translate(-box.x, -box.y);\n\n        transform$1(viewport, matrix);\n      });\n    }\n\n    return box;\n  };\n\n\n  /**\n   * Gets or sets the scroll of the canvas.\n   *\n   * @param {Point} [delta] The scroll to be set.\n   *\n   * @return {Point}\n   */\n  Canvas.prototype.scroll = function(delta) {\n\n    const node = this._viewport;\n    let matrix = node.getCTM();\n\n    if (delta) {\n      this._changeViewbox(function() {\n        delta = assign$1({ dx: 0, dy: 0 }, delta || {});\n\n        matrix = this._svg.createSVGMatrix().translate(delta.dx, delta.dy).multiply(matrix);\n\n        setCTM(node, matrix);\n      });\n    }\n\n    return { x: matrix.e, y: matrix.f };\n  };\n\n  /**\n   * Scrolls the viewbox to contain the given element.\n   * Optionally specify a padding to be applied to the edges.\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element to scroll to or its ID.\n   * @param {RectTRBL|number} [padding=100] The padding to be applied. Can also specify top, bottom, left and right.\n   */\n  Canvas.prototype.scrollToElement = function(element, padding) {\n    let defaultPadding = 100;\n\n    if (typeof element === 'string') {\n      element = this._elementRegistry.get(element);\n    }\n\n    // set to correct rootElement\n    const rootElement = this.findRoot(element);\n\n    if (rootElement !== this.getRootElement()) {\n      this.setRootElement(rootElement);\n    }\n\n    if (!padding) {\n      padding = {};\n    }\n    if (typeof padding === 'number') {\n      defaultPadding = padding;\n    }\n\n    padding = {\n      top: padding.top || defaultPadding,\n      right: padding.right || defaultPadding,\n      bottom: padding.bottom || defaultPadding,\n      left: padding.left || defaultPadding\n    };\n\n    const elementBounds = getBBox(element),\n          elementTrbl = asTRBL(elementBounds),\n          viewboxBounds = this.viewbox(),\n          zoom = this.zoom();\n    let dx, dy;\n\n    // shrink viewboxBounds with padding\n    viewboxBounds.y += padding.top / zoom;\n    viewboxBounds.x += padding.left / zoom;\n    viewboxBounds.width -= (padding.right + padding.left) / zoom;\n    viewboxBounds.height -= (padding.bottom + padding.top) / zoom;\n\n    const viewboxTrbl = asTRBL(viewboxBounds);\n\n    const canFit = elementBounds.width < viewboxBounds.width && elementBounds.height < viewboxBounds.height;\n\n    if (!canFit) {\n\n      // top-left when element can't fit\n      dx = elementBounds.x - viewboxBounds.x;\n      dy = elementBounds.y - viewboxBounds.y;\n\n    } else {\n\n      const dRight = Math.max(0, elementTrbl.right - viewboxTrbl.right),\n            dLeft = Math.min(0, elementTrbl.left - viewboxTrbl.left),\n            dBottom = Math.max(0, elementTrbl.bottom - viewboxTrbl.bottom),\n            dTop = Math.min(0, elementTrbl.top - viewboxTrbl.top);\n\n      dx = dRight || dLeft;\n      dy = dBottom || dTop;\n\n    }\n\n    this.scroll({ dx: -dx * zoom, dy: -dy * zoom });\n  };\n\n  /**\n   * Gets or sets the current zoom of the canvas, optionally zooming to the\n   * specified position.\n   *\n   * The getter may return a cached zoom level. Call it with `false` as the first\n   * argument to force recomputation of the current level.\n   *\n   * @param {number|'fit-viewport'} [newScale] The new zoom level, either a number,\n   * i.e. 0.9, or `fit-viewport` to adjust the size to fit the current viewport.\n   * @param {Point} [center] The reference point { x: ..., y: ...} to zoom to.\n   *\n   * @return {number} The set zoom level.\n   */\n  Canvas.prototype.zoom = function(newScale, center) {\n\n    if (!newScale) {\n      return this.viewbox(newScale).scale;\n    }\n\n    if (newScale === 'fit-viewport') {\n      return this._fitViewport(center);\n    }\n\n    let outer,\n        matrix;\n\n    this._changeViewbox(function() {\n\n      if (typeof center !== 'object') {\n        outer = this.viewbox().outer;\n\n        center = {\n          x: outer.width / 2,\n          y: outer.height / 2\n        };\n      }\n\n      matrix = this._setZoom(newScale, center);\n    });\n\n    return round(matrix.a, 1000);\n  };\n\n  function setCTM(node, m) {\n    const mstr = 'matrix(' + m.a + ',' + m.b + ',' + m.c + ',' + m.d + ',' + m.e + ',' + m.f + ')';\n    node.setAttribute('transform', mstr);\n  }\n\n  Canvas.prototype._fitViewport = function(center) {\n\n    const vbox = this.viewbox(),\n          outer = vbox.outer,\n          inner = vbox.inner;\n    let newScale,\n        newViewbox;\n\n    // display the complete diagram without zooming in.\n    // instead of relying on internal zoom, we perform a\n    // hard reset on the canvas viewbox to realize this\n    //\n    // if diagram does not need to be zoomed in, we focus it around\n    // the diagram origin instead\n\n    if (inner.x >= 0 &&\n        inner.y >= 0 &&\n        inner.x + inner.width <= outer.width &&\n        inner.y + inner.height <= outer.height &&\n        !center) {\n\n      newViewbox = {\n        x: 0,\n        y: 0,\n        width: Math.max(inner.width + inner.x, outer.width),\n        height: Math.max(inner.height + inner.y, outer.height)\n      };\n    } else {\n\n      newScale = Math.min(1, outer.width / inner.width, outer.height / inner.height);\n      newViewbox = {\n        x: inner.x + (center ? inner.width / 2 - outer.width / newScale / 2 : 0),\n        y: inner.y + (center ? inner.height / 2 - outer.height / newScale / 2 : 0),\n        width: outer.width / newScale,\n        height: outer.height / newScale\n      };\n    }\n\n    this.viewbox(newViewbox);\n\n    return this.viewbox(false).scale;\n  };\n\n\n  Canvas.prototype._setZoom = function(scale, center) {\n\n    const svg = this._svg,\n          viewport = this._viewport;\n\n    const matrix = svg.createSVGMatrix();\n    const point = svg.createSVGPoint();\n\n    let centerPoint,\n        originalPoint,\n        currentMatrix,\n        scaleMatrix,\n        newMatrix;\n\n    currentMatrix = viewport.getCTM();\n\n    const currentScale = currentMatrix.a;\n\n    if (center) {\n      centerPoint = assign$1(point, center);\n\n      // revert applied viewport transformations\n      originalPoint = centerPoint.matrixTransform(currentMatrix.inverse());\n\n      // create scale matrix\n      scaleMatrix = matrix\n        .translate(originalPoint.x, originalPoint.y)\n        .scale(1 / currentScale * scale)\n        .translate(-originalPoint.x, -originalPoint.y);\n\n      newMatrix = currentMatrix.multiply(scaleMatrix);\n    } else {\n      newMatrix = matrix.scale(scale);\n    }\n\n    setCTM(this._viewport, newMatrix);\n\n    return newMatrix;\n  };\n\n\n  /**\n   * Returns the size of the canvas.\n   *\n   * @return {Dimensions} The size of the canvas.\n   */\n  Canvas.prototype.getSize = function() {\n    return {\n      width: this._container.clientWidth,\n      height: this._container.clientHeight\n    };\n  };\n\n\n  /**\n   * Returns the absolute bounding box of an element.\n   *\n   * The absolute bounding box may be used to display overlays in the callers\n   * (browser) coordinate system rather than the zoomed in/out canvas coordinates.\n   *\n   * @param {ShapeLike|ConnectionLike} element The element.\n   *\n   * @return {Rect} The element's absolute bounding box.\n   */\n  Canvas.prototype.getAbsoluteBBox = function(element) {\n    const vbox = this.viewbox();\n    let bbox;\n\n    // connection\n    // use svg bbox\n    if (element.waypoints) {\n      const gfx = this.getGraphics(element);\n\n      bbox = gfx.getBBox();\n    }\n\n    // shapes\n    // use data\n    else {\n      bbox = element;\n    }\n\n    const x = bbox.x * vbox.scale - vbox.x * vbox.scale;\n    const y = bbox.y * vbox.scale - vbox.y * vbox.scale;\n\n    const width = bbox.width * vbox.scale;\n    const height = bbox.height * vbox.scale;\n\n    return {\n      x: x,\n      y: y,\n      width: width,\n      height: height\n    };\n  };\n\n  /**\n   * Fires an event so other modules can react to the canvas resizing.\n   */\n  Canvas.prototype.resized = function() {\n\n    // force recomputation of view box\n    delete this._cachedViewbox;\n\n    this._eventBus.fire('canvas.resized');\n  };\n\n  var ELEMENT_ID = 'data-element-id';\n\n  /**\n   * @typedef {import('./Types').ElementLike} ElementLike\n   *\n   * @typedef {import('./EventBus').default} EventBus\n   *\n   * @typedef { (element: ElementLike, gfx: SVGElement) => boolean|any } ElementRegistryFilterCallback\n   * @typedef { (element: ElementLike, gfx: SVGElement) => any } ElementRegistryForEachCallback\n   */\n\n  /**\n   * A registry that keeps track of all shapes in the diagram.\n   *\n   * @class\n   * @constructor\n   *\n   * @param {EventBus} eventBus\n   */\n  function ElementRegistry(eventBus) {\n\n    /**\n     * @type { {\n     *   [id: string]: {\n     *     element: ElementLike;\n     *     gfx?: SVGElement;\n     *     secondaryGfx?: SVGElement;\n     *   }\n     * } }\n     */\n    this._elements = {};\n\n    this._eventBus = eventBus;\n  }\n\n  ElementRegistry.$inject = [ 'eventBus' ];\n\n  /**\n   * Add an element and its graphical representation(s) to the registry.\n   *\n   * @param {ElementLike} element The element to be added.\n   * @param {SVGElement} gfx The primary graphical representation.\n   * @param {SVGElement} [secondaryGfx] The secondary graphical representation.\n   */\n  ElementRegistry.prototype.add = function(element, gfx, secondaryGfx) {\n\n    var id = element.id;\n\n    this._validateId(id);\n\n    // associate dom node with element\n    attr$1(gfx, ELEMENT_ID, id);\n\n    if (secondaryGfx) {\n      attr$1(secondaryGfx, ELEMENT_ID, id);\n    }\n\n    this._elements[id] = { element: element, gfx: gfx, secondaryGfx: secondaryGfx };\n  };\n\n  /**\n   * Remove an element from the registry.\n   *\n   * @param {ElementLike|string} element\n   */\n  ElementRegistry.prototype.remove = function(element) {\n    var elements = this._elements,\n        id = element.id || element,\n        container = id && elements[id];\n\n    if (container) {\n\n      // unset element id on gfx\n      attr$1(container.gfx, ELEMENT_ID, '');\n\n      if (container.secondaryGfx) {\n        attr$1(container.secondaryGfx, ELEMENT_ID, '');\n      }\n\n      delete elements[id];\n    }\n  };\n\n  /**\n   * Update an elements ID.\n   *\n   * @param {ElementLike|string} element The element or its ID.\n   * @param {string} newId The new ID.\n   */\n  ElementRegistry.prototype.updateId = function(element, newId) {\n\n    this._validateId(newId);\n\n    if (typeof element === 'string') {\n      element = this.get(element);\n    }\n\n    this._eventBus.fire('element.updateId', {\n      element: element,\n      newId: newId\n    });\n\n    var gfx = this.getGraphics(element),\n        secondaryGfx = this.getGraphics(element, true);\n\n    this.remove(element);\n\n    element.id = newId;\n\n    this.add(element, gfx, secondaryGfx);\n  };\n\n  /**\n   * Update the graphical representation of an element.\n   *\n   * @param {ElementLike|string} filter The element or its ID.\n   * @param {SVGElement} gfx The new graphical representation.\n   * @param {boolean} [secondary=false] Whether to update the secondary graphical representation.\n   */\n  ElementRegistry.prototype.updateGraphics = function(filter, gfx, secondary) {\n    var id = filter.id || filter;\n\n    var container = this._elements[id];\n\n    if (secondary) {\n      container.secondaryGfx = gfx;\n    } else {\n      container.gfx = gfx;\n    }\n\n    if (gfx) {\n      attr$1(gfx, ELEMENT_ID, id);\n    }\n\n    return gfx;\n  };\n\n  /**\n   * Get the element with the given ID or graphical representation.\n   *\n   * @example\n   *\n   * ```javascript\n   * elementRegistry.get('SomeElementId_1');\n   *\n   * elementRegistry.get(gfx);\n   * ```\n   *\n   * @param {string|SVGElement} filter The elements ID or graphical representation.\n   *\n   * @return {ElementLike|undefined} The element.\n   */\n  ElementRegistry.prototype.get = function(filter) {\n    var id;\n\n    if (typeof filter === 'string') {\n      id = filter;\n    } else {\n      id = filter && attr$1(filter, ELEMENT_ID);\n    }\n\n    var container = this._elements[id];\n    return container && container.element;\n  };\n\n  /**\n   * Return all elements that match a given filter function.\n   *\n   * @param {ElementRegistryFilterCallback} fn The filter function.\n   *\n   * @return {ElementLike[]} The matching elements.\n   */\n  ElementRegistry.prototype.filter = function(fn) {\n\n    var filtered = [];\n\n    this.forEach(function(element, gfx) {\n      if (fn(element, gfx)) {\n        filtered.push(element);\n      }\n    });\n\n    return filtered;\n  };\n\n  /**\n   * Return the first element that matches the given filter function.\n   *\n   * @param {ElementRegistryFilterCallback} fn The filter function.\n   *\n   * @return {ElementLike|undefined} The matching element.\n   */\n  ElementRegistry.prototype.find = function(fn) {\n    var map = this._elements,\n        keys = Object.keys(map);\n\n    for (var i = 0; i < keys.length; i++) {\n      var id = keys[i],\n          container = map[id],\n          element = container.element,\n          gfx = container.gfx;\n\n      if (fn(element, gfx)) {\n        return element;\n      }\n    }\n  };\n\n  /**\n   * Get all elements.\n   *\n   * @return {ElementLike[]} All elements.\n   */\n  ElementRegistry.prototype.getAll = function() {\n    return this.filter(function(e) { return e; });\n  };\n\n  /**\n   * Execute a given function for each element.\n   *\n   * @param {ElementRegistryForEachCallback} fn The function to execute.\n   */\n  ElementRegistry.prototype.forEach = function(fn) {\n\n    var map = this._elements;\n\n    Object.keys(map).forEach(function(id) {\n      var container = map[id],\n          element = container.element,\n          gfx = container.gfx;\n\n      return fn(element, gfx);\n    });\n  };\n\n  /**\n   * Return the graphical representation of an element.\n   *\n   * @example\n   *\n   * ```javascript\n   * elementRegistry.getGraphics('SomeElementId_1');\n   *\n   * elementRegistry.getGraphics(rootElement); // <g ...>\n   *\n   * elementRegistry.getGraphics(rootElement, true); // <svg ...>\n   * ```\n   *\n   * @param {ElementLike|string} filter The element or its ID.\n   * @param {boolean} [secondary=false] Whether to return the secondary graphical representation.\n   *\n   * @return {SVGElement} The graphical representation.\n   */\n  ElementRegistry.prototype.getGraphics = function(filter, secondary) {\n    var id = filter.id || filter;\n\n    var container = this._elements[id];\n    return container && (secondary ? container.secondaryGfx : container.gfx);\n  };\n\n  /**\n   * Validate an ID and throw an error if invalid.\n   *\n   * @param {string} id\n   *\n   * @throws {Error} Error indicating that the ID is invalid or already assigned.\n   */\n  ElementRegistry.prototype._validateId = function(id) {\n    if (!id) {\n      throw new Error('element must have an id');\n    }\n\n    if (this._elements[id]) {\n      throw new Error('element with id ' + id + ' already added');\n    }\n  };\n\n  var objectRefs = {exports: {}};\n\n  var collection = {};\n\n  /**\n   * An empty collection stub. Use {@link RefsCollection.extend} to extend a\n   * collection with ref semantics.\n   *\n   * @class RefsCollection\n   */\n\n  /**\n   * Extends a collection with {@link Refs} aware methods\n   *\n   * @memberof RefsCollection\n   * @static\n   *\n   * @param  {Array<Object>} collection\n   * @param  {Refs} refs instance\n   * @param  {Object} property represented by the collection\n   * @param  {Object} target object the collection is attached to\n   *\n   * @return {RefsCollection<Object>} the extended array\n   */\n  function extend(collection, refs, property, target) {\n\n    var inverseProperty = property.inverse;\n\n    /**\n     * Removes the given element from the array and returns it.\n     *\n     * @method RefsCollection#remove\n     *\n     * @param {Object} element the element to remove\n     */\n    Object.defineProperty(collection, 'remove', {\n      value: function(element) {\n        var idx = this.indexOf(element);\n        if (idx !== -1) {\n          this.splice(idx, 1);\n\n          // unset inverse\n          refs.unset(element, inverseProperty, target);\n        }\n\n        return element;\n      }\n    });\n\n    /**\n     * Returns true if the collection contains the given element\n     *\n     * @method RefsCollection#contains\n     *\n     * @param {Object} element the element to check for\n     */\n    Object.defineProperty(collection, 'contains', {\n      value: function(element) {\n        return this.indexOf(element) !== -1;\n      }\n    });\n\n    /**\n     * Adds an element to the array, unless it exists already (set semantics).\n     *\n     * @method RefsCollection#add\n     *\n     * @param {Object} element the element to add\n     * @param {Number} optional index to add element to\n     *                 (possibly moving other elements around)\n     */\n    Object.defineProperty(collection, 'add', {\n      value: function(element, idx) {\n\n        var currentIdx = this.indexOf(element);\n\n        if (typeof idx === 'undefined') {\n\n          if (currentIdx !== -1) {\n            // element already in collection (!)\n            return;\n          }\n\n          // add to end of array, as no idx is specified\n          idx = this.length;\n        }\n\n        // handle already in collection\n        if (currentIdx !== -1) {\n\n          // remove element from currentIdx\n          this.splice(currentIdx, 1);\n        }\n\n        // add element at idx\n        this.splice(idx, 0, element);\n\n        if (currentIdx === -1) {\n          // set inverse, unless element was\n          // in collection already\n          refs.set(element, inverseProperty, target);\n        }\n      }\n    });\n\n    // a simple marker, identifying this element\n    // as being a refs collection\n    Object.defineProperty(collection, '__refs_collection', {\n      value: true\n    });\n\n    return collection;\n  }\n\n\n  function isExtended(collection) {\n    return collection.__refs_collection === true;\n  }\n\n  collection.extend = extend;\n\n  collection.isExtended = isExtended;\n\n  var Collection = collection;\n\n  function hasOwnProperty$1(e, property) {\n    return Object.prototype.hasOwnProperty.call(e, property.name || property);\n  }\n\n  function defineCollectionProperty(ref, property, target) {\n\n    var collection = Collection.extend(target[property.name] || [], ref, property, target);\n\n    Object.defineProperty(target, property.name, {\n      enumerable: property.enumerable,\n      value: collection\n    });\n\n    if (collection.length) {\n\n      collection.forEach(function(o) {\n        ref.set(o, property.inverse, target);\n      });\n    }\n  }\n\n\n  function defineProperty$1(ref, property, target) {\n\n    var inverseProperty = property.inverse;\n\n    var _value = target[property.name];\n\n    Object.defineProperty(target, property.name, {\n      configurable: property.configurable,\n      enumerable: property.enumerable,\n\n      get: function() {\n        return _value;\n      },\n\n      set: function(value) {\n\n        // return if we already performed all changes\n        if (value === _value) {\n          return;\n        }\n\n        var old = _value;\n\n        // temporary set null\n        _value = null;\n\n        if (old) {\n          ref.unset(old, inverseProperty, target);\n        }\n\n        // set new value\n        _value = value;\n\n        // set inverse value\n        ref.set(_value, inverseProperty, target);\n      }\n    });\n\n  }\n\n  /**\n   * Creates a new references object defining two inversly related\n   * attribute descriptors a and b.\n   *\n   * <p>\n   *   When bound to an object using {@link Refs#bind} the references\n   *   get activated and ensure that add and remove operations are applied\n   *   reversely, too.\n   * </p>\n   *\n   * <p>\n   *   For attributes represented as collections {@link Refs} provides the\n   *   {@link RefsCollection#add}, {@link RefsCollection#remove} and {@link RefsCollection#contains} extensions\n   *   that must be used to properly hook into the inverse change mechanism.\n   * </p>\n   *\n   * @class Refs\n   *\n   * @classdesc A bi-directional reference between two attributes.\n   *\n   * @param {Refs.AttributeDescriptor} a property descriptor\n   * @param {Refs.AttributeDescriptor} b property descriptor\n   *\n   * @example\n   *\n   * var refs = Refs({ name: 'wheels', collection: true, enumerable: true }, { name: 'car' });\n   *\n   * var car = { name: 'toyota' };\n   * var wheels = [{ pos: 'front-left' }, { pos: 'front-right' }];\n   *\n   * refs.bind(car, 'wheels');\n   *\n   * car.wheels // []\n   * car.wheels.add(wheels[0]);\n   * car.wheels.add(wheels[1]);\n   *\n   * car.wheels // [{ pos: 'front-left' }, { pos: 'front-right' }]\n   *\n   * wheels[0].car // { name: 'toyota' };\n   * car.wheels.remove(wheels[0]);\n   *\n   * wheels[0].car // undefined\n   */\n  function Refs$1(a, b) {\n\n    if (!(this instanceof Refs$1)) {\n      return new Refs$1(a, b);\n    }\n\n    // link\n    a.inverse = b;\n    b.inverse = a;\n\n    this.props = {};\n    this.props[a.name] = a;\n    this.props[b.name] = b;\n  }\n\n  /**\n   * Binds one side of a bi-directional reference to a\n   * target object.\n   *\n   * @memberOf Refs\n   *\n   * @param  {Object} target\n   * @param  {String} property\n   */\n  Refs$1.prototype.bind = function(target, property) {\n    if (typeof property === 'string') {\n      if (!this.props[property]) {\n        throw new Error('no property <' + property + '> in ref');\n      }\n      property = this.props[property];\n    }\n\n    if (property.collection) {\n      defineCollectionProperty(this, property, target);\n    } else {\n      defineProperty$1(this, property, target);\n    }\n  };\n\n  Refs$1.prototype.ensureRefsCollection = function(target, property) {\n\n    var collection = target[property.name];\n\n    if (!Collection.isExtended(collection)) {\n      defineCollectionProperty(this, property, target);\n    }\n\n    return collection;\n  };\n\n  Refs$1.prototype.ensureBound = function(target, property) {\n    if (!hasOwnProperty$1(target, property)) {\n      this.bind(target, property);\n    }\n  };\n\n  Refs$1.prototype.unset = function(target, property, value) {\n\n    if (target) {\n      this.ensureBound(target, property);\n\n      if (property.collection) {\n        this.ensureRefsCollection(target, property).remove(value);\n      } else {\n        target[property.name] = undefined;\n      }\n    }\n  };\n\n  Refs$1.prototype.set = function(target, property, value) {\n\n    if (target) {\n      this.ensureBound(target, property);\n\n      if (property.collection) {\n        this.ensureRefsCollection(target, property).add(value);\n      } else {\n        target[property.name] = value;\n      }\n    }\n  };\n\n  var refs = Refs$1;\n\n  objectRefs.exports = refs;\n\n  objectRefs.exports.Collection = collection;\n\n  var objectRefsExports = objectRefs.exports;\n  var Refs = /*@__PURE__*/getDefaultExportFromCjs(objectRefsExports);\n\n  var parentRefs = new Refs({ name: 'children', enumerable: true, collection: true }, { name: 'parent' }),\n      labelRefs = new Refs({ name: 'labels', enumerable: true, collection: true }, { name: 'labelTarget' }),\n      attacherRefs = new Refs({ name: 'attachers', collection: true }, { name: 'host' }),\n      outgoingRefs = new Refs({ name: 'outgoing', collection: true }, { name: 'source' }),\n      incomingRefs = new Refs({ name: 'incoming', collection: true }, { name: 'target' });\n\n  /**\n   * @typedef {import('./Types').Element} Element\n   * @typedef {import('./Types').Shape} Shape\n   * @typedef {import('./Types').Root} Root\n   * @typedef {import('./Types').Label} Label\n   * @typedef {import('./Types').Connection} Connection\n   */\n\n  /**\n   * The basic graphical representation\n   *\n   * @class\n   * @constructor\n   */\n  function ElementImpl() {\n\n    /**\n     * The object that backs up the shape\n     *\n     * @name Element#businessObject\n     * @type Object\n     */\n    Object.defineProperty(this, 'businessObject', {\n      writable: true\n    });\n\n\n    /**\n     * Single label support, will mapped to multi label array\n     *\n     * @name Element#label\n     * @type Object\n     */\n    Object.defineProperty(this, 'label', {\n      get: function() {\n        return this.labels[0];\n      },\n      set: function(newLabel) {\n\n        var label = this.label,\n            labels = this.labels;\n\n        if (!newLabel && label) {\n          labels.remove(label);\n        } else {\n          labels.add(newLabel, 0);\n        }\n      }\n    });\n\n    /**\n     * The parent shape\n     *\n     * @name Element#parent\n     * @type Shape\n     */\n    parentRefs.bind(this, 'parent');\n\n    /**\n     * The list of labels\n     *\n     * @name Element#labels\n     * @type Label\n     */\n    labelRefs.bind(this, 'labels');\n\n    /**\n     * The list of outgoing connections\n     *\n     * @name Element#outgoing\n     * @type Array<Connection>\n     */\n    outgoingRefs.bind(this, 'outgoing');\n\n    /**\n     * The list of incoming connections\n     *\n     * @name Element#incoming\n     * @type Array<Connection>\n     */\n    incomingRefs.bind(this, 'incoming');\n  }\n\n\n  /**\n   * A graphical object\n   *\n   * @class\n   * @constructor\n   *\n   * @extends ElementImpl\n   */\n  function ShapeImpl() {\n    ElementImpl.call(this);\n\n    /**\n     * Indicates frame shapes\n     *\n     * @name ShapeImpl#isFrame\n     * @type boolean\n     */\n\n    /**\n     * The list of children\n     *\n     * @name ShapeImpl#children\n     * @type Element[]\n     */\n    parentRefs.bind(this, 'children');\n\n    /**\n     * @name ShapeImpl#host\n     * @type Shape\n     */\n    attacherRefs.bind(this, 'host');\n\n    /**\n     * @name ShapeImpl#attachers\n     * @type Shape\n     */\n    attacherRefs.bind(this, 'attachers');\n  }\n\n  e(ShapeImpl, ElementImpl);\n\n\n  /**\n   * A root graphical object\n   *\n   * @class\n   * @constructor\n   *\n   * @extends ElementImpl\n   */\n  function RootImpl() {\n    ElementImpl.call(this);\n\n    /**\n     * The list of children\n     *\n     * @name RootImpl#children\n     * @type Element[]\n     */\n    parentRefs.bind(this, 'children');\n  }\n\n  e(RootImpl, ShapeImpl);\n\n\n  /**\n   * A label for an element\n   *\n   * @class\n   * @constructor\n   *\n   * @extends ShapeImpl\n   */\n  function LabelImpl() {\n    ShapeImpl.call(this);\n\n    /**\n     * The labeled element\n     *\n     * @name LabelImpl#labelTarget\n     * @type Element\n     */\n    labelRefs.bind(this, 'labelTarget');\n  }\n\n  e(LabelImpl, ShapeImpl);\n\n\n  /**\n   * A connection between two elements\n   *\n   * @class\n   * @constructor\n   *\n   * @extends ElementImpl\n   */\n  function ConnectionImpl() {\n    ElementImpl.call(this);\n\n    /**\n     * The element this connection originates from\n     *\n     * @name ConnectionImpl#source\n     * @type Element\n     */\n    outgoingRefs.bind(this, 'source');\n\n    /**\n     * The element this connection points to\n     *\n     * @name ConnectionImpl#target\n     * @type Element\n     */\n    incomingRefs.bind(this, 'target');\n  }\n\n  e(ConnectionImpl, ElementImpl);\n\n\n  var types$6 = {\n    connection: ConnectionImpl,\n    shape: ShapeImpl,\n    label: LabelImpl,\n    root: RootImpl\n  };\n\n  /**\n   * Creates a root element.\n   *\n   * @overlord\n   *\n   * @example\n   *\n   * ```javascript\n   * import * as Model from 'diagram-js/lib/model';\n   *\n   * const root = Model.create('root', {\n   *   x: 100,\n   *   y: 100,\n   *   width: 100,\n   *   height: 100\n   * });\n   * ```\n   *\n   * @param {'root'} type\n   * @param {any} [attrs]\n   *\n   * @return {Root}\n   */\n\n  /**\n   * Creates a connection.\n   *\n   * @overlord\n   *\n   * @example\n   *\n   * ```javascript\n   * import * as Model from 'diagram-js/lib/model';\n   *\n   * const connection = Model.create('connection', {\n   *   waypoints: [\n   *     { x: 100, y: 100 },\n   *     { x: 200, y: 100 }\n   *   ]\n   * });\n   * ```\n   *\n   * @param {'connection'} type\n   * @param {any} [attrs]\n   *\n   * @return {Connection}\n   */\n\n  /**\n   * Creates a shape.\n   *\n   * @overlord\n   *\n   * @example\n   *\n   * ```javascript\n   * import * as Model from 'diagram-js/lib/model';\n   *\n   * const shape = Model.create('shape', {\n   *   x: 100,\n   *   y: 100,\n   *   width: 100,\n   *   height: 100\n   * });\n   * ```\n   *\n   * @param {'shape'} type\n   * @param {any} [attrs]\n   *\n   * @return {Shape}\n   */\n\n  /**\n   * Creates a label.\n   *\n   * @example\n   *\n   * ```javascript\n   * import * as Model from 'diagram-js/lib/model';\n   *\n   * const label = Model.create('label', {\n   *   x: 100,\n   *   y: 100,\n   *   width: 100,\n   *   height: 100,\n   *   labelTarget: shape\n   * });\n   * ```\n   *\n   * @param {'label'} type\n   * @param {Object} [attrs]\n   *\n   * @return {Label}\n   */\n  function create(type, attrs) {\n    var Type = types$6[type];\n    if (!Type) {\n      throw new Error('unknown type: <' + type + '>');\n    }\n    return assign$1(new Type(), attrs);\n  }\n\n  /**\n   * @typedef {import('../model/Types').Element} Element\n   * @typedef {import('../model/Types').Connection} Connection\n   * @typedef {import('../model/Types').Label} Label\n   * @typedef {import('../model/Types').Root} Root\n   * @typedef {import('../model/Types').Shape} Shape\n   */\n\n  /**\n   * A factory for model elements.\n   *\n   * @template {Connection} [T=Connection]\n   * @template {Label} [U=Label]\n   * @template {Root} [V=Root]\n   * @template {Shape} [W=Shape]\n   */\n  function ElementFactory() {\n    this._uid = 12;\n  }\n\n  /**\n   * Create a root element.\n   *\n   * @param {Partial<Root>} [attrs]\n   *\n   * @return {V} The created root element.\n   */\n  ElementFactory.prototype.createRoot = function(attrs) {\n    return this.create('root', attrs);\n  };\n\n  /**\n   * Create a label.\n   *\n   * @param {Partial<Label>} [attrs]\n   *\n   * @return {U} The created label.\n   */\n  ElementFactory.prototype.createLabel = function(attrs) {\n    return this.create('label', attrs);\n  };\n\n  /**\n   * Create a shape.\n   *\n   * @param {Partial<Shape>} [attrs]\n   *\n   * @return {W} The created shape.\n   */\n  ElementFactory.prototype.createShape = function(attrs) {\n    return this.create('shape', attrs);\n  };\n\n  /**\n   * Create a connection.\n   *\n   * @param {Partial<Connection>} [attrs]\n   *\n   * @return {T} The created connection.\n   */\n  ElementFactory.prototype.createConnection = function(attrs) {\n    return this.create('connection', attrs);\n  };\n\n  /**\n   * Create a root element.\n   *\n   * @overlord\n   * @param {'root'} type\n   * @param {Partial<Root>} [attrs]\n   * @return {V}\n   */\n  /**\n   * Create a shape.\n   *\n   * @overlord\n   * @param {'shape'} type\n   * @param {Partial<Shape>} [attrs]\n   * @return {W}\n   */\n  /**\n   * Create a connection.\n   *\n   * @overlord\n   * @param {'connection'} type\n   * @param {Partial<Connection>} [attrs]\n   * @return {T}\n   */\n  /**\n   * Create a label.\n   *\n   * @param {'label'} type\n   * @param {Partial<Label>} [attrs]\n   * @return {U}\n   */\n  ElementFactory.prototype.create = function(type, attrs) {\n\n    attrs = assign$1({}, attrs || {});\n\n    if (!attrs.id) {\n      attrs.id = type + '_' + (this._uid++);\n    }\n\n    return create(type, attrs);\n  };\n\n  var FN_REF = '__fn';\n\n  var DEFAULT_PRIORITY$1 = 1000;\n\n  var slice = Array.prototype.slice;\n\n  /**\n   * @typedef { {\n   *   stopPropagation(): void;\n   *   preventDefault(): void;\n   *   cancelBubble: boolean;\n   *   defaultPrevented: boolean;\n   *   returnValue: any;\n   * } } Event\n   */\n\n  /**\n   * @template E\n   *\n   * @typedef { (event: E & Event, ...any) => any } EventBusEventCallback\n   */\n\n  /**\n   * @typedef { {\n   *  priority: number;\n   *  next: EventBusListener | null;\n   *  callback: EventBusEventCallback<any>;\n   * } } EventBusListener\n   */\n\n  /**\n   * A general purpose event bus.\n   *\n   * This component is used to communicate across a diagram instance.\n   * Other parts of a diagram can use it to listen to and broadcast events.\n   *\n   *\n   * ## Registering for Events\n   *\n   * The event bus provides the {@link EventBus#on} and {@link EventBus#once}\n   * methods to register for events. {@link EventBus#off} can be used to\n   * remove event registrations. Listeners receive an instance of {@link Event}\n   * as the first argument. It allows them to hook into the event execution.\n   *\n   * ```javascript\n   *\n   * // listen for event\n   * eventBus.on('foo', function(event) {\n   *\n   *   // access event type\n   *   event.type; // 'foo'\n   *\n   *   // stop propagation to other listeners\n   *   event.stopPropagation();\n   *\n   *   // prevent event default\n   *   event.preventDefault();\n   * });\n   *\n   * // listen for event with custom payload\n   * eventBus.on('bar', function(event, payload) {\n   *   console.log(payload);\n   * });\n   *\n   * // listen for event returning value\n   * eventBus.on('foobar', function(event) {\n   *\n   *   // stop event propagation + prevent default\n   *   return false;\n   *\n   *   // stop event propagation + return custom result\n   *   return {\n   *     complex: 'listening result'\n   *   };\n   * });\n   *\n   *\n   * // listen with custom priority (default=1000, higher is better)\n   * eventBus.on('priorityfoo', 1500, function(event) {\n   *   console.log('invoked first!');\n   * });\n   *\n   *\n   * // listen for event and pass the context (`this`)\n   * eventBus.on('foobar', function(event) {\n   *   this.foo();\n   * }, this);\n   * ```\n   *\n   *\n   * ## Emitting Events\n   *\n   * Events can be emitted via the event bus using {@link EventBus#fire}.\n   *\n   * ```javascript\n   *\n   * // false indicates that the default action\n   * // was prevented by listeners\n   * if (eventBus.fire('foo') === false) {\n   *   console.log('default has been prevented!');\n   * };\n   *\n   *\n   * // custom args + return value listener\n   * eventBus.on('sum', function(event, a, b) {\n   *   return a + b;\n   * });\n   *\n   * // you can pass custom arguments + retrieve result values.\n   * var sum = eventBus.fire('sum', 1, 2);\n   * console.log(sum); // 3\n   * ```\n   */\n  function EventBus() {\n\n    /**\n     * @type { Record<string, EventBusListener> }\n     */\n    this._listeners = {};\n\n    // cleanup on destroy on lowest priority to allow\n    // message passing until the bitter end\n    this.on('diagram.destroy', 1, this._destroy, this);\n  }\n\n\n  /**\n   * Register an event listener for events with the given name.\n   *\n   * The callback will be invoked with `event, ...additionalArguments`\n   * that have been passed to {@link EventBus#fire}.\n   *\n   * Returning false from a listener will prevent the events default action\n   * (if any is specified). To stop an event from being processed further in\n   * other listeners execute {@link Event#stopPropagation}.\n   *\n   * Returning anything but `undefined` from a listener will stop the listener propagation.\n   *\n   * @template T\n   *\n   * @param {string|string[]} events to subscribe to\n   * @param {number} [priority=1000] listen priority\n   * @param {EventBusEventCallback<T>} callback\n   * @param {any} [that] callback context\n   */\n  EventBus.prototype.on = function(events, priority, callback, that) {\n\n    events = isArray$2(events) ? events : [ events ];\n\n    if (isFunction(priority)) {\n      that = callback;\n      callback = priority;\n      priority = DEFAULT_PRIORITY$1;\n    }\n\n    if (!isNumber(priority)) {\n      throw new Error('priority must be a number');\n    }\n\n    var actualCallback = callback;\n\n    if (that) {\n      actualCallback = bind$2(callback, that);\n\n      // make sure we remember and are able to remove\n      // bound callbacks via {@link #off} using the original\n      // callback\n      actualCallback[FN_REF] = callback[FN_REF] || callback;\n    }\n\n    var self = this;\n\n    events.forEach(function(e) {\n      self._addListener(e, {\n        priority: priority,\n        callback: actualCallback,\n        next: null\n      });\n    });\n  };\n\n  /**\n   * Register an event listener that is called only once.\n   *\n   * @template T\n   *\n   * @param {string|string[]} events to subscribe to\n   * @param {number} [priority=1000] the listen priority\n   * @param {EventBusEventCallback<T>} callback\n   * @param {any} [that] callback context\n   */\n  EventBus.prototype.once = function(events, priority, callback, that) {\n    var self = this;\n\n    if (isFunction(priority)) {\n      that = callback;\n      callback = priority;\n      priority = DEFAULT_PRIORITY$1;\n    }\n\n    if (!isNumber(priority)) {\n      throw new Error('priority must be a number');\n    }\n\n    function wrappedCallback() {\n      wrappedCallback.__isTomb = true;\n\n      var result = callback.apply(that, arguments);\n\n      self.off(events, wrappedCallback);\n\n      return result;\n    }\n\n    // make sure we remember and are able to remove\n    // bound callbacks via {@link #off} using the original\n    // callback\n    wrappedCallback[FN_REF] = callback;\n\n    this.on(events, priority, wrappedCallback);\n  };\n\n\n  /**\n   * Removes event listeners by event and callback.\n   *\n   * If no callback is given, all listeners for a given event name are being removed.\n   *\n   * @param {string|string[]} events\n   * @param {EventBusEventCallback} [callback]\n   */\n  EventBus.prototype.off = function(events, callback) {\n\n    events = isArray$2(events) ? events : [ events ];\n\n    var self = this;\n\n    events.forEach(function(event) {\n      self._removeListener(event, callback);\n    });\n\n  };\n\n\n  /**\n   * Create an event recognized be the event bus.\n   *\n   * @param {Object} data Event data.\n   *\n   * @return {Event} An event that will be recognized by the event bus.\n   */\n  EventBus.prototype.createEvent = function(data) {\n    var event = new InternalEvent();\n\n    event.init(data);\n\n    return event;\n  };\n\n\n  /**\n   * Fires an event.\n   *\n   * @example\n   *\n   * ```javascript\n   * // fire event by name\n   * events.fire('foo');\n   *\n   * // fire event object with nested type\n   * var event = { type: 'foo' };\n   * events.fire(event);\n   *\n   * // fire event with explicit type\n   * var event = { x: 10, y: 20 };\n   * events.fire('element.moved', event);\n   *\n   * // pass additional arguments to the event\n   * events.on('foo', function(event, bar) {\n   *   alert(bar);\n   * });\n   *\n   * events.fire({ type: 'foo' }, 'I am bar!');\n   * ```\n   *\n   * @param {string} [type] event type\n   * @param {Object} [data] event or event data\n   * @param {...any} [args] additional arguments the callback will be called with.\n   *\n   * @return {any} The return value. Will be set to `false` if the default was prevented.\n   */\n  EventBus.prototype.fire = function(type, data) {\n    var event,\n        firstListener,\n        returnValue,\n        args;\n\n    args = slice.call(arguments);\n\n    if (typeof type === 'object') {\n      data = type;\n      type = data.type;\n    }\n\n    if (!type) {\n      throw new Error('no event type specified');\n    }\n\n    firstListener = this._listeners[type];\n\n    if (!firstListener) {\n      return;\n    }\n\n    // we make sure we fire instances of our home made\n    // events here. We wrap them only once, though\n    if (data instanceof InternalEvent) {\n\n      // we are fine, we alread have an event\n      event = data;\n    } else {\n      event = this.createEvent(data);\n    }\n\n    // ensure we pass the event as the first parameter\n    args[0] = event;\n\n    // original event type (in case we delegate)\n    var originalType = event.type;\n\n    // update event type before delegation\n    if (type !== originalType) {\n      event.type = type;\n    }\n\n    try {\n      returnValue = this._invokeListeners(event, args, firstListener);\n    } finally {\n\n      // reset event type after delegation\n      if (type !== originalType) {\n        event.type = originalType;\n      }\n    }\n\n    // set the return value to false if the event default\n    // got prevented and no other return value exists\n    if (returnValue === undefined && event.defaultPrevented) {\n      returnValue = false;\n    }\n\n    return returnValue;\n  };\n\n  /**\n   * Handle an error by firing an event.\n   *\n   * @param {Error} error The error to be handled.\n   *\n   * @return {boolean} Whether the error was handled.\n   */\n  EventBus.prototype.handleError = function(error) {\n    return this.fire('error', { error: error }) === false;\n  };\n\n\n  EventBus.prototype._destroy = function() {\n    this._listeners = {};\n  };\n\n  /**\n   * @param {Event} event\n   * @param {any[]} args\n   * @param {EventBusListener} listener\n   *\n   * @return {any}\n   */\n  EventBus.prototype._invokeListeners = function(event, args, listener) {\n\n    var returnValue;\n\n    while (listener) {\n\n      // handle stopped propagation\n      if (event.cancelBubble) {\n        break;\n      }\n\n      returnValue = this._invokeListener(event, args, listener);\n\n      listener = listener.next;\n    }\n\n    return returnValue;\n  };\n\n  /**\n   * @param {Event} event\n   * @param {any[]} args\n   * @param {EventBusListener} listener\n   *\n   * @return {any}\n   */\n  EventBus.prototype._invokeListener = function(event, args, listener) {\n\n    var returnValue;\n\n    if (listener.callback.__isTomb) {\n      return returnValue;\n    }\n\n    try {\n\n      // returning false prevents the default action\n      returnValue = invokeFunction(listener.callback, args);\n\n      // stop propagation on return value\n      if (returnValue !== undefined) {\n        event.returnValue = returnValue;\n        event.stopPropagation();\n      }\n\n      // prevent default on return false\n      if (returnValue === false) {\n        event.preventDefault();\n      }\n    } catch (error) {\n      if (!this.handleError(error)) {\n        console.error('unhandled error in event listener', error);\n\n        throw error;\n      }\n    }\n\n    return returnValue;\n  };\n\n  /**\n   * Add new listener with a certain priority to the list\n   * of listeners (for the given event).\n   *\n   * The semantics of listener registration / listener execution are\n   * first register, first serve: New listeners will always be inserted\n   * after existing listeners with the same priority.\n   *\n   * Example: Inserting two listeners with priority 1000 and 1300\n   *\n   *    * before: [ 1500, 1500, 1000, 1000 ]\n   *    * after: [ 1500, 1500, (new=1300), 1000, 1000, (new=1000) ]\n   *\n   * @param {string} event\n   * @param {EventBusListener} newListener\n   */\n  EventBus.prototype._addListener = function(event, newListener) {\n\n    var listener = this._getListeners(event),\n        previousListener;\n\n    // no prior listeners\n    if (!listener) {\n      this._setListeners(event, newListener);\n\n      return;\n    }\n\n    // ensure we order listeners by priority from\n    // 0 (high) to n > 0 (low)\n    while (listener) {\n\n      if (listener.priority < newListener.priority) {\n\n        newListener.next = listener;\n\n        if (previousListener) {\n          previousListener.next = newListener;\n        } else {\n          this._setListeners(event, newListener);\n        }\n\n        return;\n      }\n\n      previousListener = listener;\n      listener = listener.next;\n    }\n\n    // add new listener to back\n    previousListener.next = newListener;\n  };\n\n\n  /**\n   * @param {string} name\n   *\n   * @return {EventBusListener}\n   */\n  EventBus.prototype._getListeners = function(name) {\n    return this._listeners[name];\n  };\n\n  /**\n   * @param {string} name\n   * @param {EventBusListener} listener\n   */\n  EventBus.prototype._setListeners = function(name, listener) {\n    this._listeners[name] = listener;\n  };\n\n  EventBus.prototype._removeListener = function(event, callback) {\n\n    var listener = this._getListeners(event),\n        nextListener,\n        previousListener,\n        listenerCallback;\n\n    if (!callback) {\n\n      // clear listeners\n      this._setListeners(event, null);\n\n      return;\n    }\n\n    while (listener) {\n\n      nextListener = listener.next;\n\n      listenerCallback = listener.callback;\n\n      if (listenerCallback === callback || listenerCallback[FN_REF] === callback) {\n        if (previousListener) {\n          previousListener.next = nextListener;\n        } else {\n\n          // new first listener\n          this._setListeners(event, nextListener);\n        }\n      }\n\n      previousListener = listener;\n      listener = nextListener;\n    }\n  };\n\n  /**\n   * A event that is emitted via the event bus.\n   */\n  function InternalEvent() { }\n\n  InternalEvent.prototype.stopPropagation = function() {\n    this.cancelBubble = true;\n  };\n\n  InternalEvent.prototype.preventDefault = function() {\n    this.defaultPrevented = true;\n  };\n\n  InternalEvent.prototype.init = function(data) {\n    assign$1(this, data || {});\n  };\n\n\n  /**\n   * Invoke function. Be fast...\n   *\n   * @param {Function} fn\n   * @param {any[]} args\n   *\n   * @return {any}\n   */\n  function invokeFunction(fn, args) {\n    return fn.apply(null, args);\n  }\n\n  /**\n   * SVGs for elements are generated by the {@link GraphicsFactory}.\n   *\n   * This utility gives quick access to the important semantic\n   * parts of an element.\n   */\n\n  /**\n   * Returns the visual part of a diagram element.\n   *\n   * @param {SVGElement} gfx\n   *\n   * @return {SVGElement}\n   */\n  function getVisual(gfx) {\n    return gfx.childNodes[0];\n  }\n\n  /**\n   * Returns the children for a given diagram element.\n   *\n   * @param {SVGElement} gfx\n   * @return {SVGElement}\n   */\n  function getChildren(gfx) {\n    return gfx.parentNode.childNodes[1];\n  }\n\n  /**\n   * @typedef {import('./Types').ConnectionLike} ConnectionLike\n   * @typedef {import('./Types').ElementLike} ElementLike\n   * @typedef {import('./Types').ShapeLike} ShapeLike\n   *\n   * @typedef {import('./ElementRegistry').default} ElementRegistry\n   * @typedef {import('./EventBus').default} EventBus\n   */\n\n  /**\n   * A factory that creates graphical elements.\n   *\n   * @param {EventBus} eventBus\n   * @param {ElementRegistry} elementRegistry\n   */\n  function GraphicsFactory(eventBus, elementRegistry) {\n    this._eventBus = eventBus;\n    this._elementRegistry = elementRegistry;\n  }\n\n  GraphicsFactory.$inject = [ 'eventBus' , 'elementRegistry' ];\n\n  /**\n   * @param { { parent?: any } } element\n   * @return {SVGElement}\n   */\n  GraphicsFactory.prototype._getChildrenContainer = function(element) {\n\n    var gfx = this._elementRegistry.getGraphics(element);\n\n    var childrenGfx;\n\n    // root element\n    if (!element.parent) {\n      childrenGfx = gfx;\n    } else {\n      childrenGfx = getChildren(gfx);\n      if (!childrenGfx) {\n        childrenGfx = create$1('g');\n        classes$1(childrenGfx).add('djs-children');\n\n        append(gfx.parentNode, childrenGfx);\n      }\n    }\n\n    return childrenGfx;\n  };\n\n  /**\n   * Clears the graphical representation of the element and returns the\n   * cleared visual (the <g class=\"djs-visual\" /> element).\n   */\n  GraphicsFactory.prototype._clear = function(gfx) {\n    var visual = getVisual(gfx);\n\n    clear(visual);\n\n    return visual;\n  };\n\n  /**\n   * Creates a gfx container for shapes and connections\n   *\n   * The layout is as follows:\n   *\n   * <g class=\"djs-group\">\n   *\n   *   <!-- the gfx -->\n   *   <g class=\"djs-element djs-(shape|connection|frame)\">\n   *     <g class=\"djs-visual\">\n   *       <!-- the renderer draws in here -->\n   *     </g>\n   *\n   *     <!-- extensions (overlays, click box, ...) goes here\n   *   </g>\n   *\n   *   <!-- the gfx child nodes -->\n   *   <g class=\"djs-children\"></g>\n   * </g>\n   *\n   * @param {string} type the type of the element, i.e. shape | connection\n   * @param {SVGElement} childrenGfx\n   * @param {number} [parentIndex] position to create container in parent\n   * @param {boolean} [isFrame] is frame element\n   *\n   * @return {SVGElement}\n   */\n  GraphicsFactory.prototype._createContainer = function(\n      type, childrenGfx, parentIndex, isFrame\n  ) {\n    var outerGfx = create$1('g');\n    classes$1(outerGfx).add('djs-group');\n\n    // insert node at position\n    if (typeof parentIndex !== 'undefined') {\n      prependTo(outerGfx, childrenGfx, childrenGfx.childNodes[parentIndex]);\n    } else {\n      append(childrenGfx, outerGfx);\n    }\n\n    var gfx = create$1('g');\n    classes$1(gfx).add('djs-element');\n    classes$1(gfx).add('djs-' + type);\n\n    if (isFrame) {\n      classes$1(gfx).add('djs-frame');\n    }\n\n    append(outerGfx, gfx);\n\n    // create visual\n    var visual = create$1('g');\n    classes$1(visual).add('djs-visual');\n\n    append(gfx, visual);\n\n    return gfx;\n  };\n\n  /**\n   * Create a graphical element.\n   *\n   * @param { 'shape' | 'connection' | 'label' | 'root' } type The type of the element.\n   * @param {ElementLike} element The element.\n   * @param {number} [parentIndex] The index at which to add the graphical element to its parent's children.\n   *\n   * @return {SVGElement} The graphical element.\n   */\n  GraphicsFactory.prototype.create = function(type, element, parentIndex) {\n    var childrenGfx = this._getChildrenContainer(element.parent);\n    return this._createContainer(type, childrenGfx, parentIndex, isFrameElement(element));\n  };\n\n  /**\n   * Update the containments of the given elements.\n   *\n   * @param {ElementLike[]} elements The elements.\n   */\n  GraphicsFactory.prototype.updateContainments = function(elements) {\n\n    var self = this,\n        elementRegistry = this._elementRegistry,\n        parents;\n\n    parents = reduce(elements, function(map, e) {\n\n      if (e.parent) {\n        map[e.parent.id] = e.parent;\n      }\n\n      return map;\n    }, {});\n\n    // update all parents of changed and reorganized their children\n    // in the correct order (as indicated in our model)\n    forEach$1(parents, function(parent) {\n\n      var children = parent.children;\n\n      if (!children) {\n        return;\n      }\n\n      var childrenGfx = self._getChildrenContainer(parent);\n\n      forEach$1(children.slice().reverse(), function(child) {\n        var childGfx = elementRegistry.getGraphics(child);\n\n        prependTo(childGfx.parentNode, childrenGfx);\n      });\n    });\n  };\n\n  /**\n   * Draw a shape.\n   *\n   * @param {SVGElement} visual The graphical element.\n   * @param {ShapeLike} element The shape.\n   *\n   * @return {SVGElement}\n   */\n  GraphicsFactory.prototype.drawShape = function(visual, element) {\n    var eventBus = this._eventBus;\n\n    return eventBus.fire('render.shape', { gfx: visual, element: element });\n  };\n\n  /**\n   * Get the path of a shape.\n   *\n   * @param {ShapeLike} element The shape.\n   *\n   * @return {string} The path of the shape.\n   */\n  GraphicsFactory.prototype.getShapePath = function(element) {\n    var eventBus = this._eventBus;\n\n    return eventBus.fire('render.getShapePath', element);\n  };\n\n  /**\n   * Draw a connection.\n   *\n   * @param {SVGElement} visual The graphical element.\n   * @param {ConnectionLike} element The connection.\n   *\n   * @return {SVGElement}\n   */\n  GraphicsFactory.prototype.drawConnection = function(visual, element) {\n    var eventBus = this._eventBus;\n\n    return eventBus.fire('render.connection', { gfx: visual, element: element });\n  };\n\n  /**\n   * Get the path of a connection.\n   *\n   * @param {ConnectionLike} connection The connection.\n   *\n   * @return {string} The path of the connection.\n   */\n  GraphicsFactory.prototype.getConnectionPath = function(connection) {\n    var eventBus = this._eventBus;\n\n    return eventBus.fire('render.getConnectionPath', connection);\n  };\n\n  /**\n   * Update an elements graphical representation.\n   *\n   * @param {'shape'|'connection'} type\n   * @param {ElementLike} element\n   * @param {SVGElement} gfx\n   */\n  GraphicsFactory.prototype.update = function(type, element, gfx) {\n\n    // do NOT update root element\n    if (!element.parent) {\n      return;\n    }\n\n    var visual = this._clear(gfx);\n\n    // redraw\n    if (type === 'shape') {\n      this.drawShape(visual, element);\n\n      // update positioning\n      translate$1(gfx, element.x, element.y);\n    } else\n    if (type === 'connection') {\n      this.drawConnection(visual, element);\n    } else {\n      throw new Error('unknown type: ' + type);\n    }\n\n    if (element.hidden) {\n      attr$1(gfx, 'display', 'none');\n    } else {\n      attr$1(gfx, 'display', 'block');\n    }\n  };\n\n  /**\n   * Remove a graphical element.\n   *\n   * @param {ElementLike} element The element.\n   */\n  GraphicsFactory.prototype.remove = function(element) {\n    var gfx = this._elementRegistry.getGraphics(element);\n\n    // remove\n    remove$2(gfx.parentNode);\n  };\n\n\n  // helpers //////////\n\n  function prependTo(newNode, parentNode, siblingNode) {\n    var node = siblingNode || parentNode.firstChild;\n\n    // do not prepend node to itself to prevent IE from crashing\n    // https://github.com/bpmn-io/bpmn-js/issues/746\n    if (newNode === node) {\n      return;\n    }\n\n    parentNode.insertBefore(newNode, node);\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var CoreModule = {\n    __depends__: [ DrawModule ],\n    __init__: [ 'canvas' ],\n    canvas: [ 'type', Canvas ],\n    elementRegistry: [ 'type', ElementRegistry ],\n    elementFactory: [ 'type', ElementFactory ],\n    eventBus: [ 'type', EventBus ],\n    graphicsFactory: [ 'type', GraphicsFactory ]\n  };\n\n  /**\n   * @typedef {import('didi').InjectionContext} InjectionContext\n   * @typedef {import('didi').LocalsMap} LocalsMap\n   * @typedef {import('didi').ModuleDeclaration} ModuleDeclaration\n   *\n   * @typedef { {\n   *   modules?: ModuleDeclaration[];\n   * } & Record<string, any> } DiagramOptions\n   */\n\n  /**\n   * Bootstrap an injector from a list of modules, instantiating a number of default components\n   *\n   * @param {ModuleDeclaration[]} modules\n   *\n   * @return {Injector} a injector to use to access the components\n   */\n  function bootstrap(modules) {\n    var injector = new Injector(modules);\n\n    injector.init();\n\n    return injector;\n  }\n\n  /**\n   * Creates an injector from passed options.\n   *\n   * @param {DiagramOptions} [options]\n   *\n   * @return {Injector}\n   */\n  function createInjector(options) {\n\n    options = options || {};\n\n    /**\n     * @type { ModuleDeclaration }\n     */\n    var configModule = {\n      'config': [ 'value', options ]\n    };\n\n    var modules = [ configModule, CoreModule ].concat(options.modules || []);\n\n    return bootstrap(modules);\n  }\n\n\n  /**\n   * The main diagram-js entry point that bootstraps the diagram with the given\n   * configuration.\n   *\n   * To register extensions with the diagram, pass them as Array<Module> to the constructor.\n   *\n   * @class\n   * @constructor\n   *\n   * @example Creating a plug-in that logs whenever a shape is added to the canvas.\n   *\n   * ```javascript\n   * // plug-in implementation\n   * function MyLoggingPlugin(eventBus) {\n   *   eventBus.on('shape.added', function(event) {\n   *     console.log('shape ', event.shape, ' was added to the diagram');\n   *   });\n   * }\n   *\n   * // export as module\n   * export default {\n   *   __init__: [ 'myLoggingPlugin' ],\n   *     myLoggingPlugin: [ 'type', MyLoggingPlugin ]\n   * };\n   * ```\n   *\n   * Use the plug-in in a Diagram instance:\n   *\n   * ```javascript\n   * import MyLoggingModule from 'path-to-my-logging-plugin';\n   *\n   * var diagram = new Diagram({\n   *   modules: [\n   *     MyLoggingModule\n   *   ]\n   * });\n   *\n   * diagram.invoke([ 'canvas', function(canvas) {\n   *   // add shape to drawing canvas\n   *   canvas.addShape({ x: 10, y: 10 });\n   * });\n   *\n   * // 'shape ... was added to the diagram' logged to console\n   * ```\n   *\n   * @param {DiagramOptions} [options]\n   * @param {Injector} [injector] An (optional) injector to bootstrap the diagram with.\n   */\n  function Diagram(options, injector) {\n\n    this._injector = injector = injector || createInjector(options);\n\n    // API\n\n    /**\n     * Resolves a diagram service.\n     *\n     * @template T\n     *\n     * @param {string} name The name of the service to get.\n     * @param {boolean} [strict=true] If false, resolve missing services to null.\n     *\n     * @return {T|null}\n     */\n    this.get = injector.get;\n\n    /**\n     * Executes a function with its dependencies injected.\n     *\n     * @template T\n     *\n     * @param {Function} func function to be invoked\n     * @param {InjectionContext} [context] context of the invocation\n     * @param {LocalsMap} [locals] locals provided\n     *\n     * @return {T|null}\n     */\n    this.invoke = injector.invoke;\n\n    // init\n\n    // indicate via event\n\n\n    /**\n     * An event indicating that all plug-ins are loaded.\n     *\n     * Use this event to fire other events to interested plug-ins\n     *\n     * @memberOf Diagram\n     *\n     * @event diagram.init\n     *\n     * @example\n     *\n     * ```javascript\n     * eventBus.on('diagram.init', function() {\n     *   eventBus.fire('my-custom-event', { foo: 'BAR' });\n     * });\n     * ```\n     *\n     * @type {Object}\n     */\n    this.get('eventBus').fire('diagram.init');\n  }\n\n\n  /**\n   * Destroys the diagram\n   */\n  Diagram.prototype.destroy = function() {\n    this.get('eventBus').fire('diagram.destroy');\n  };\n\n  /**\n   * Clear the diagram, removing all contents.\n   */\n  Diagram.prototype.clear = function() {\n    this.get('eventBus').fire('diagram.clear');\n  };\n\n  /**\n   * Moddle base element.\n   */\n  function Base() { }\n\n  Base.prototype.get = function(name) {\n    return this.$model.properties.get(this, name);\n  };\n\n  Base.prototype.set = function(name, value) {\n    this.$model.properties.set(this, name, value);\n  };\n\n  /**\n   * A model element factory.\n   *\n   * @param {Moddle} model\n   * @param {Properties} properties\n   */\n  function Factory(model, properties) {\n    this.model = model;\n    this.properties = properties;\n  }\n\n\n  Factory.prototype.createType = function(descriptor) {\n\n    var model = this.model;\n\n    var props = this.properties,\n        prototype = Object.create(Base.prototype);\n\n    // initialize default values\n    forEach$1(descriptor.properties, function(p) {\n      if (!p.isMany && p.default !== undefined) {\n        prototype[p.name] = p.default;\n      }\n    });\n\n    props.defineModel(prototype, model);\n    props.defineDescriptor(prototype, descriptor);\n\n    var name = descriptor.ns.name;\n\n    /**\n     * The new type constructor\n     */\n    function ModdleElement(attrs) {\n      props.define(this, '$type', { value: name, enumerable: true });\n      props.define(this, '$attrs', { value: {} });\n      props.define(this, '$parent', { writable: true });\n\n      forEach$1(attrs, bind$2(function(val, key) {\n        this.set(key, val);\n      }, this));\n    }\n\n    ModdleElement.prototype = prototype;\n\n    ModdleElement.hasType = prototype.$instanceOf = this.model.hasType;\n\n    // static links\n    props.defineModel(ModdleElement, model);\n    props.defineDescriptor(ModdleElement, descriptor);\n\n    return ModdleElement;\n  };\n\n  /**\n   * Built-in moddle types\n   */\n  var BUILTINS = {\n    String: true,\n    Boolean: true,\n    Integer: true,\n    Real: true,\n    Element: true\n  };\n\n  /**\n   * Converters for built in types from string representations\n   */\n  var TYPE_CONVERTERS = {\n    String: function(s) { return s; },\n    Boolean: function(s) { return s === 'true'; },\n    Integer: function(s) { return parseInt(s, 10); },\n    Real: function(s) { return parseFloat(s); }\n  };\n\n  /**\n   * Convert a type to its real representation\n   */\n  function coerceType(type, value) {\n\n    var converter = TYPE_CONVERTERS[type];\n\n    if (converter) {\n      return converter(value);\n    } else {\n      return value;\n    }\n  }\n\n  /**\n   * Return whether the given type is built-in\n   */\n  function isBuiltIn(type) {\n    return !!BUILTINS[type];\n  }\n\n  /**\n   * Return whether the given type is simple\n   */\n  function isSimple(type) {\n    return !!TYPE_CONVERTERS[type];\n  }\n\n  /**\n   * Parses a namespaced attribute name of the form (ns:)localName to an object,\n   * given a default prefix to assume in case no explicit namespace is given.\n   *\n   * @param {String} name\n   * @param {String} [defaultPrefix] the default prefix to take, if none is present.\n   *\n   * @return {Object} the parsed name\n   */\n  function parseName(name, defaultPrefix) {\n    var parts = name.split(/:/),\n        localName, prefix;\n\n    // no prefix (i.e. only local name)\n    if (parts.length === 1) {\n      localName = name;\n      prefix = defaultPrefix;\n    } else\n\n    // prefix + local name\n    if (parts.length === 2) {\n      localName = parts[1];\n      prefix = parts[0];\n    } else {\n      throw new Error('expected <prefix:localName> or <localName>, got ' + name);\n    }\n\n    name = (prefix ? prefix + ':' : '') + localName;\n\n    return {\n      name: name,\n      prefix: prefix,\n      localName: localName\n    };\n  }\n\n  /**\n   * A utility to build element descriptors.\n   */\n  function DescriptorBuilder(nameNs) {\n    this.ns = nameNs;\n    this.name = nameNs.name;\n    this.allTypes = [];\n    this.allTypesByName = {};\n    this.properties = [];\n    this.propertiesByName = {};\n  }\n\n\n  DescriptorBuilder.prototype.build = function() {\n    return pick(this, [\n      'ns',\n      'name',\n      'allTypes',\n      'allTypesByName',\n      'properties',\n      'propertiesByName',\n      'bodyProperty',\n      'idProperty'\n    ]);\n  };\n\n  /**\n   * Add property at given index.\n   *\n   * @param {Object} p\n   * @param {Number} [idx]\n   * @param {Boolean} [validate=true]\n   */\n  DescriptorBuilder.prototype.addProperty = function(p, idx, validate) {\n\n    if (typeof idx === 'boolean') {\n      validate = idx;\n      idx = undefined;\n    }\n\n    this.addNamedProperty(p, validate !== false);\n\n    var properties = this.properties;\n\n    if (idx !== undefined) {\n      properties.splice(idx, 0, p);\n    } else {\n      properties.push(p);\n    }\n  };\n\n\n  DescriptorBuilder.prototype.replaceProperty = function(oldProperty, newProperty, replace) {\n    var oldNameNs = oldProperty.ns;\n\n    var props = this.properties,\n        propertiesByName = this.propertiesByName,\n        rename = oldProperty.name !== newProperty.name;\n\n    if (oldProperty.isId) {\n      if (!newProperty.isId) {\n        throw new Error(\n          'property <' + newProperty.ns.name + '> must be id property ' +\n          'to refine <' + oldProperty.ns.name + '>');\n      }\n\n      this.setIdProperty(newProperty, false);\n    }\n\n    if (oldProperty.isBody) {\n\n      if (!newProperty.isBody) {\n        throw new Error(\n          'property <' + newProperty.ns.name + '> must be body property ' +\n          'to refine <' + oldProperty.ns.name + '>');\n      }\n\n      // TODO: Check compatibility\n      this.setBodyProperty(newProperty, false);\n    }\n\n    // validate existence and get location of old property\n    var idx = props.indexOf(oldProperty);\n    if (idx === -1) {\n      throw new Error('property <' + oldNameNs.name + '> not found in property list');\n    }\n\n    // remove old property\n    props.splice(idx, 1);\n\n    // replacing the named property is intentional\n    //\n    //  * validate only if this is a \"rename\" operation\n    //  * add at specific index unless we \"replace\"\n    //\n    this.addProperty(newProperty, replace ? undefined : idx, rename);\n\n    // make new property available under old name\n    propertiesByName[oldNameNs.name] = propertiesByName[oldNameNs.localName] = newProperty;\n  };\n\n\n  DescriptorBuilder.prototype.redefineProperty = function(p, targetPropertyName, replace) {\n\n    var nsPrefix = p.ns.prefix;\n    var parts = targetPropertyName.split('#');\n\n    var name = parseName(parts[0], nsPrefix);\n    var attrName = parseName(parts[1], name.prefix).name;\n\n    var redefinedProperty = this.propertiesByName[attrName];\n    if (!redefinedProperty) {\n      throw new Error('refined property <' + attrName + '> not found');\n    } else {\n      this.replaceProperty(redefinedProperty, p, replace);\n    }\n\n    delete p.redefines;\n  };\n\n  DescriptorBuilder.prototype.addNamedProperty = function(p, validate) {\n    var ns = p.ns,\n        propsByName = this.propertiesByName;\n\n    if (validate) {\n      this.assertNotDefined(p, ns.name);\n      this.assertNotDefined(p, ns.localName);\n    }\n\n    propsByName[ns.name] = propsByName[ns.localName] = p;\n  };\n\n  DescriptorBuilder.prototype.removeNamedProperty = function(p) {\n    var ns = p.ns,\n        propsByName = this.propertiesByName;\n\n    delete propsByName[ns.name];\n    delete propsByName[ns.localName];\n  };\n\n  DescriptorBuilder.prototype.setBodyProperty = function(p, validate) {\n\n    if (validate && this.bodyProperty) {\n      throw new Error(\n        'body property defined multiple times ' +\n        '(<' + this.bodyProperty.ns.name + '>, <' + p.ns.name + '>)');\n    }\n\n    this.bodyProperty = p;\n  };\n\n  DescriptorBuilder.prototype.setIdProperty = function(p, validate) {\n\n    if (validate && this.idProperty) {\n      throw new Error(\n        'id property defined multiple times ' +\n        '(<' + this.idProperty.ns.name + '>, <' + p.ns.name + '>)');\n    }\n\n    this.idProperty = p;\n  };\n\n  DescriptorBuilder.prototype.assertNotDefined = function(p, name) {\n    var propertyName = p.name,\n        definedProperty = this.propertiesByName[propertyName];\n\n    if (definedProperty) {\n      throw new Error(\n        'property <' + propertyName + '> already defined; ' +\n        'override of <' + definedProperty.definedBy.ns.name + '#' + definedProperty.ns.name + '> by ' +\n        '<' + p.definedBy.ns.name + '#' + p.ns.name + '> not allowed without redefines');\n    }\n  };\n\n  DescriptorBuilder.prototype.hasProperty = function(name) {\n    return this.propertiesByName[name];\n  };\n\n  DescriptorBuilder.prototype.addTrait = function(t, inherited) {\n\n    var typesByName = this.allTypesByName,\n        types = this.allTypes;\n\n    var typeName = t.name;\n\n    if (typeName in typesByName) {\n      return;\n    }\n\n    forEach$1(t.properties, bind$2(function(p) {\n\n      // clone property to allow extensions\n      p = assign$1({}, p, {\n        name: p.ns.localName,\n        inherited: inherited\n      });\n\n      Object.defineProperty(p, 'definedBy', {\n        value: t\n      });\n\n      var replaces = p.replaces,\n          redefines = p.redefines;\n\n      // add replace/redefine support\n      if (replaces || redefines) {\n        this.redefineProperty(p, replaces || redefines, replaces);\n      } else {\n        if (p.isBody) {\n          this.setBodyProperty(p);\n        }\n        if (p.isId) {\n          this.setIdProperty(p);\n        }\n        this.addProperty(p);\n      }\n    }, this));\n\n    types.push(t);\n    typesByName[typeName] = t;\n  };\n\n  /**\n   * A registry of Moddle packages.\n   *\n   * @param {Array<Package>} packages\n   * @param {Properties} properties\n   */\n  function Registry(packages, properties) {\n    this.packageMap = {};\n    this.typeMap = {};\n\n    this.packages = [];\n\n    this.properties = properties;\n\n    forEach$1(packages, bind$2(this.registerPackage, this));\n  }\n\n\n  Registry.prototype.getPackage = function(uriOrPrefix) {\n    return this.packageMap[uriOrPrefix];\n  };\n\n  Registry.prototype.getPackages = function() {\n    return this.packages;\n  };\n\n\n  Registry.prototype.registerPackage = function(pkg) {\n\n    // copy package\n    pkg = assign$1({}, pkg);\n\n    var pkgMap = this.packageMap;\n\n    ensureAvailable(pkgMap, pkg, 'prefix');\n    ensureAvailable(pkgMap, pkg, 'uri');\n\n    // register types\n    forEach$1(pkg.types, bind$2(function(descriptor) {\n      this.registerType(descriptor, pkg);\n    }, this));\n\n    pkgMap[pkg.uri] = pkgMap[pkg.prefix] = pkg;\n    this.packages.push(pkg);\n  };\n\n\n  /**\n   * Register a type from a specific package with us\n   */\n  Registry.prototype.registerType = function(type, pkg) {\n\n    type = assign$1({}, type, {\n      superClass: (type.superClass || []).slice(),\n      extends: (type.extends || []).slice(),\n      properties: (type.properties || []).slice(),\n      meta: assign$1((type.meta || {}))\n    });\n\n    var ns = parseName(type.name, pkg.prefix),\n        name = ns.name,\n        propertiesByName = {};\n\n    // parse properties\n    forEach$1(type.properties, bind$2(function(p) {\n\n      // namespace property names\n      var propertyNs = parseName(p.name, ns.prefix),\n          propertyName = propertyNs.name;\n\n      // namespace property types\n      if (!isBuiltIn(p.type)) {\n        p.type = parseName(p.type, propertyNs.prefix).name;\n      }\n\n      assign$1(p, {\n        ns: propertyNs,\n        name: propertyName\n      });\n\n      propertiesByName[propertyName] = p;\n    }, this));\n\n    // update ns + name\n    assign$1(type, {\n      ns: ns,\n      name: name,\n      propertiesByName: propertiesByName\n    });\n\n    forEach$1(type.extends, bind$2(function(extendsName) {\n      var extended = this.typeMap[extendsName];\n\n      extended.traits = extended.traits || [];\n      extended.traits.push(name);\n    }, this));\n\n    // link to package\n    this.definePackage(type, pkg);\n\n    // register\n    this.typeMap[name] = type;\n  };\n\n\n  /**\n   * Traverse the type hierarchy from bottom to top,\n   * calling iterator with (type, inherited) for all elements in\n   * the inheritance chain.\n   *\n   * @param {Object} nsName\n   * @param {Function} iterator\n   * @param {Boolean} [trait=false]\n   */\n  Registry.prototype.mapTypes = function(nsName, iterator, trait) {\n\n    var type = isBuiltIn(nsName.name) ? { name: nsName.name } : this.typeMap[nsName.name];\n\n    var self = this;\n\n    /**\n     * Traverse the selected trait.\n     *\n     * @param {String} cls\n     */\n    function traverseTrait(cls) {\n      return traverseSuper(cls, true);\n    }\n\n    /**\n     * Traverse the selected super type or trait\n     *\n     * @param {String} cls\n     * @param {Boolean} [trait=false]\n     */\n    function traverseSuper(cls, trait) {\n      var parentNs = parseName(cls, isBuiltIn(cls) ? '' : nsName.prefix);\n      self.mapTypes(parentNs, iterator, trait);\n    }\n\n    if (!type) {\n      throw new Error('unknown type <' + nsName.name + '>');\n    }\n\n    forEach$1(type.superClass, trait ? traverseTrait : traverseSuper);\n\n    // call iterator with (type, inherited=!trait)\n    iterator(type, !trait);\n\n    forEach$1(type.traits, traverseTrait);\n  };\n\n\n  /**\n   * Returns the effective descriptor for a type.\n   *\n   * @param  {String} type the namespaced name (ns:localName) of the type\n   *\n   * @return {Descriptor} the resulting effective descriptor\n   */\n  Registry.prototype.getEffectiveDescriptor = function(name) {\n\n    var nsName = parseName(name);\n\n    var builder = new DescriptorBuilder(nsName);\n\n    this.mapTypes(nsName, function(type, inherited) {\n      builder.addTrait(type, inherited);\n    });\n\n    var descriptor = builder.build();\n\n    // define package link\n    this.definePackage(descriptor, descriptor.allTypes[descriptor.allTypes.length - 1].$pkg);\n\n    return descriptor;\n  };\n\n\n  Registry.prototype.definePackage = function(target, pkg) {\n    this.properties.define(target, '$pkg', { value: pkg });\n  };\n\n\n\n  // helpers ////////////////////////////\n\n  function ensureAvailable(packageMap, pkg, identifierKey) {\n\n    var value = pkg[identifierKey];\n\n    if (value in packageMap) {\n      throw new Error('package with ' + identifierKey + ' <' + value + '> already defined');\n    }\n  }\n\n  /**\n   * A utility that gets and sets properties of model elements.\n   *\n   * @param {Model} model\n   */\n  function Properties(model) {\n    this.model = model;\n  }\n\n\n  /**\n   * Sets a named property on the target element.\n   * If the value is undefined, the property gets deleted.\n   *\n   * @param {Object} target\n   * @param {String} name\n   * @param {Object} value\n   */\n  Properties.prototype.set = function(target, name, value) {\n\n    if (!isString(name) || !name.length) {\n      throw new TypeError('property name must be a non-empty string');\n    }\n\n    var property = this.model.getPropertyDescriptor(target, name);\n\n    var propertyName = property && property.name;\n\n    if (isUndefined(value)) {\n\n      // unset the property, if the specified value is undefined;\n      // delete from $attrs (for extensions) or the target itself\n      if (property) {\n        delete target[propertyName];\n      } else {\n        delete target.$attrs[name];\n      }\n    } else {\n\n      // set the property, defining well defined properties on the fly\n      // or simply updating them in target.$attrs (for extensions)\n      if (property) {\n        if (propertyName in target) {\n          target[propertyName] = value;\n        } else {\n          defineProperty(target, property, value);\n        }\n      } else {\n        target.$attrs[name] = value;\n      }\n    }\n  };\n\n  /**\n   * Returns the named property of the given element\n   *\n   * @param  {Object} target\n   * @param  {String} name\n   *\n   * @return {Object}\n   */\n  Properties.prototype.get = function(target, name) {\n\n    var property = this.model.getPropertyDescriptor(target, name);\n\n    if (!property) {\n      return target.$attrs[name];\n    }\n\n    var propertyName = property.name;\n\n    // check if access to collection property and lazily initialize it\n    if (!target[propertyName] && property.isMany) {\n      defineProperty(target, property, []);\n    }\n\n    return target[propertyName];\n  };\n\n\n  /**\n   * Define a property on the target element\n   *\n   * @param  {Object} target\n   * @param  {String} name\n   * @param  {Object} options\n   */\n  Properties.prototype.define = function(target, name, options) {\n\n    if (!options.writable) {\n\n      var value = options.value;\n\n      // use getters for read-only variables to support ES6 proxies\n      // cf. https://github.com/bpmn-io/internal-docs/issues/386\n      options = assign$1({}, options, {\n        get: function() { return value; }\n      });\n\n      delete options.value;\n    }\n\n    Object.defineProperty(target, name, options);\n  };\n\n\n  /**\n   * Define the descriptor for an element\n   */\n  Properties.prototype.defineDescriptor = function(target, descriptor) {\n    this.define(target, '$descriptor', { value: descriptor });\n  };\n\n  /**\n   * Define the model for an element\n   */\n  Properties.prototype.defineModel = function(target, model) {\n    this.define(target, '$model', { value: model });\n  };\n\n\n  function isUndefined(val) {\n    return typeof val === 'undefined';\n  }\n\n  function defineProperty(target, property, value) {\n    Object.defineProperty(target, property.name, {\n      enumerable: !property.isReference,\n      writable: true,\n      value: value,\n      configurable: true\n    });\n  }\n\n  // Moddle implementation /////////////////////////////////////////////////\n\n  /**\n   * @class Moddle\n   *\n   * A model that can be used to create elements of a specific type.\n   *\n   * @example\n   *\n   * var Moddle = require('moddle');\n   *\n   * var pkg = {\n   *   name: 'mypackage',\n   *   prefix: 'my',\n   *   types: [\n   *     { name: 'Root' }\n   *   ]\n   * };\n   *\n   * var moddle = new Moddle([pkg]);\n   *\n   * @param {Array<Package>} packages the packages to contain\n   */\n  function Moddle(packages) {\n\n    this.properties = new Properties(this);\n\n    this.factory = new Factory(this, this.properties);\n    this.registry = new Registry(packages, this.properties);\n\n    this.typeCache = {};\n  }\n\n\n  /**\n   * Create an instance of the specified type.\n   *\n   * @method Moddle#create\n   *\n   * @example\n   *\n   * var foo = moddle.create('my:Foo');\n   * var bar = moddle.create('my:Bar', { id: 'BAR_1' });\n   *\n   * @param  {String|Object} descriptor the type descriptor or name know to the model\n   * @param  {Object} attrs   a number of attributes to initialize the model instance with\n   * @return {Object}         model instance\n   */\n  Moddle.prototype.create = function(descriptor, attrs) {\n    var Type = this.getType(descriptor);\n\n    if (!Type) {\n      throw new Error('unknown type <' + descriptor + '>');\n    }\n\n    return new Type(attrs);\n  };\n\n\n  /**\n   * Returns the type representing a given descriptor\n   *\n   * @method Moddle#getType\n   *\n   * @example\n   *\n   * var Foo = moddle.getType('my:Foo');\n   * var foo = new Foo({ 'id' : 'FOO_1' });\n   *\n   * @param  {String|Object} descriptor the type descriptor or name know to the model\n   * @return {Object}         the type representing the descriptor\n   */\n  Moddle.prototype.getType = function(descriptor) {\n\n    var cache = this.typeCache;\n\n    var name = isString(descriptor) ? descriptor : descriptor.ns.name;\n\n    var type = cache[name];\n\n    if (!type) {\n      descriptor = this.registry.getEffectiveDescriptor(name);\n      type = cache[name] = this.factory.createType(descriptor);\n    }\n\n    return type;\n  };\n\n\n  /**\n   * Creates an any-element type to be used within model instances.\n   *\n   * This can be used to create custom elements that lie outside the meta-model.\n   * The created element contains all the meta-data required to serialize it\n   * as part of meta-model elements.\n   *\n   * @method Moddle#createAny\n   *\n   * @example\n   *\n   * var foo = moddle.createAny('vendor:Foo', 'http://vendor', {\n   *   value: 'bar'\n   * });\n   *\n   * var container = moddle.create('my:Container', 'http://my', {\n   *   any: [ foo ]\n   * });\n   *\n   * // go ahead and serialize the stuff\n   *\n   *\n   * @param  {String} name  the name of the element\n   * @param  {String} nsUri the namespace uri of the element\n   * @param  {Object} [properties] a map of properties to initialize the instance with\n   * @return {Object} the any type instance\n   */\n  Moddle.prototype.createAny = function(name, nsUri, properties) {\n\n    var nameNs = parseName(name);\n\n    var element = {\n      $type: name,\n      $instanceOf: function(type) {\n        return type === this.$type;\n      }\n    };\n\n    var descriptor = {\n      name: name,\n      isGeneric: true,\n      ns: {\n        prefix: nameNs.prefix,\n        localName: nameNs.localName,\n        uri: nsUri\n      }\n    };\n\n    this.properties.defineDescriptor(element, descriptor);\n    this.properties.defineModel(element, this);\n    this.properties.define(element, '$parent', { enumerable: false, writable: true });\n    this.properties.define(element, '$instanceOf', { enumerable: false, writable: true });\n\n    forEach$1(properties, function(a, key) {\n      if (isObject(a) && a.value !== undefined) {\n        element[a.name] = a.value;\n      } else {\n        element[key] = a;\n      }\n    });\n\n    return element;\n  };\n\n  /**\n   * Returns a registered package by uri or prefix\n   *\n   * @return {Object} the package\n   */\n  Moddle.prototype.getPackage = function(uriOrPrefix) {\n    return this.registry.getPackage(uriOrPrefix);\n  };\n\n  /**\n   * Returns a snapshot of all known packages\n   *\n   * @return {Object} the package\n   */\n  Moddle.prototype.getPackages = function() {\n    return this.registry.getPackages();\n  };\n\n  /**\n   * Returns the descriptor for an element\n   */\n  Moddle.prototype.getElementDescriptor = function(element) {\n    return element.$descriptor;\n  };\n\n  /**\n   * Returns true if the given descriptor or instance\n   * represents the given type.\n   *\n   * May be applied to this, if element is omitted.\n   */\n  Moddle.prototype.hasType = function(element, type) {\n    if (type === undefined) {\n      type = element;\n      element = this;\n    }\n\n    var descriptor = element.$model.getElementDescriptor(element);\n\n    return (type in descriptor.allTypesByName);\n  };\n\n  /**\n   * Returns the descriptor of an elements named property\n   */\n  Moddle.prototype.getPropertyDescriptor = function(element, property) {\n    return this.getElementDescriptor(element).propertiesByName[property];\n  };\n\n  /**\n   * Returns a mapped type's descriptor\n   */\n  Moddle.prototype.getTypeDescriptor = function(type) {\n    return this.registry.typeMap[type];\n  };\n\n  var fromCharCode = String.fromCharCode;\n\n  var hasOwnProperty = Object.prototype.hasOwnProperty;\n\n  var ENTITY_PATTERN = /&#(\\d+);|&#x([0-9a-f]+);|&(\\w+);/ig;\n\n  var ENTITY_MAPPING = {\n    'amp': '&',\n    'apos': '\\'',\n    'gt': '>',\n    'lt': '<',\n    'quot': '\"'\n  };\n\n  // map UPPERCASE variants of supported special chars\n  Object.keys(ENTITY_MAPPING).forEach(function(k) {\n    ENTITY_MAPPING[k.toUpperCase()] = ENTITY_MAPPING[k];\n  });\n\n\n  function replaceEntities(_, d, x, z) {\n\n    // reserved names, i.e. &nbsp;\n    if (z) {\n      if (hasOwnProperty.call(ENTITY_MAPPING, z)) {\n        return ENTITY_MAPPING[z];\n      } else {\n\n        // fall back to original value\n        return '&' + z + ';';\n      }\n    }\n\n    // decimal encoded char\n    if (d) {\n      return fromCharCode(d);\n    }\n\n    // hex encoded char\n    return fromCharCode(parseInt(x, 16));\n  }\n\n\n  /**\n   * A basic entity decoder that can decode a minimal\n   * sub-set of reserved names (&amp;) as well as\n   * hex (&#xaaf;) and decimal (&#1231;) encoded characters.\n   *\n   * @param {string} str\n   *\n   * @return {string} decoded string\n   */\n  function decodeEntities(s) {\n    if (s.length > 3 && s.indexOf('&') !== -1) {\n      return s.replace(ENTITY_PATTERN, replaceEntities);\n    }\n\n    return s;\n  }\n\n  var XSI_URI = 'http://www.w3.org/2001/XMLSchema-instance';\n  var XSI_PREFIX = 'xsi';\n  var XSI_TYPE$1 = 'xsi:type';\n\n  var NON_WHITESPACE_OUTSIDE_ROOT_NODE = 'non-whitespace outside of root node';\n\n  function error$1(msg) {\n    return new Error(msg);\n  }\n\n  function missingNamespaceForPrefix(prefix) {\n    return 'missing namespace for prefix <' + prefix + '>';\n  }\n\n  function getter(getFn) {\n    return {\n      'get': getFn,\n      'enumerable': true\n    };\n  }\n\n  function cloneNsMatrix(nsMatrix) {\n    var clone = {}, key;\n    for (key in nsMatrix) {\n      clone[key] = nsMatrix[key];\n    }\n    return clone;\n  }\n\n  function uriPrefix(prefix) {\n    return prefix + '$uri';\n  }\n\n  function buildNsMatrix(nsUriToPrefix) {\n    var nsMatrix = {},\n        uri,\n        prefix;\n\n    for (uri in nsUriToPrefix) {\n      prefix = nsUriToPrefix[uri];\n      nsMatrix[prefix] = prefix;\n      nsMatrix[uriPrefix(prefix)] = uri;\n    }\n\n    return nsMatrix;\n  }\n\n  function noopGetContext() {\n    return { 'line': 0, 'column': 0 };\n  }\n\n  function throwFunc(err) {\n    throw err;\n  }\n\n  /**\n   * Creates a new parser with the given options.\n   *\n   * @constructor\n   *\n   * @param  {!Object<string, ?>=} options\n   */\n  function Parser(options) {\n\n    if (!this) {\n      return new Parser(options);\n    }\n\n    var proxy = options && options['proxy'];\n\n    var onText,\n        onOpenTag,\n        onCloseTag,\n        onCDATA,\n        onError = throwFunc,\n        onWarning,\n        onComment,\n        onQuestion,\n        onAttention;\n\n    var getContext = noopGetContext;\n\n    /**\n     * Do we need to parse the current elements attributes for namespaces?\n     *\n     * @type {boolean}\n     */\n    var maybeNS = false;\n\n    /**\n     * Do we process namespaces at all?\n     *\n     * @type {boolean}\n     */\n    var isNamespace = false;\n\n    /**\n     * The caught error returned on parse end\n     *\n     * @type {Error}\n     */\n    var returnError = null;\n\n    /**\n     * Should we stop parsing?\n     *\n     * @type {boolean}\n     */\n    var parseStop = false;\n\n    /**\n     * A map of { uri: prefix } used by the parser.\n     *\n     * This map will ensure we can normalize prefixes during processing;\n     * for each uri, only one prefix will be exposed to the handlers.\n     *\n     * @type {!Object<string, string>}}\n     */\n    var nsUriToPrefix;\n\n    /**\n     * Handle parse error.\n     *\n     * @param  {string|Error} err\n     */\n    function handleError(err) {\n      if (!(err instanceof Error)) {\n        err = error$1(err);\n      }\n\n      returnError = err;\n\n      onError(err, getContext);\n    }\n\n    /**\n     * Handle parse error.\n     *\n     * @param  {string|Error} err\n     */\n    function handleWarning(err) {\n\n      if (!onWarning) {\n        return;\n      }\n\n      if (!(err instanceof Error)) {\n        err = error$1(err);\n      }\n\n      onWarning(err, getContext);\n    }\n\n    /**\n     * Register parse listener.\n     *\n     * @param  {string}   name\n     * @param  {Function} cb\n     *\n     * @return {Parser}\n     */\n    this['on'] = function(name, cb) {\n\n      if (typeof cb !== 'function') {\n        throw error$1('required args <name, cb>');\n      }\n\n      switch (name) {\n      case 'openTag': onOpenTag = cb; break;\n      case 'text': onText = cb; break;\n      case 'closeTag': onCloseTag = cb; break;\n      case 'error': onError = cb; break;\n      case 'warn': onWarning = cb; break;\n      case 'cdata': onCDATA = cb; break;\n      case 'attention': onAttention = cb; break; // <!XXXXX zzzz=\"eeee\">\n      case 'question': onQuestion = cb; break; // <? ....  ?>\n      case 'comment': onComment = cb; break;\n      default:\n        throw error$1('unsupported event: ' + name);\n      }\n\n      return this;\n    };\n\n    /**\n     * Set the namespace to prefix mapping.\n     *\n     * @example\n     *\n     * parser.ns({\n     *   'http://foo': 'foo',\n     *   'http://bar': 'bar'\n     * });\n     *\n     * @param  {!Object<string, string>} nsMap\n     *\n     * @return {Parser}\n     */\n    this['ns'] = function(nsMap) {\n\n      if (typeof nsMap === 'undefined') {\n        nsMap = {};\n      }\n\n      if (typeof nsMap !== 'object') {\n        throw error$1('required args <nsMap={}>');\n      }\n\n      var _nsUriToPrefix = {}, k;\n\n      for (k in nsMap) {\n        _nsUriToPrefix[k] = nsMap[k];\n      }\n\n      // FORCE default mapping for schema instance\n      _nsUriToPrefix[XSI_URI] = XSI_PREFIX;\n\n      isNamespace = true;\n      nsUriToPrefix = _nsUriToPrefix;\n\n      return this;\n    };\n\n    /**\n     * Parse xml string.\n     *\n     * @param  {string} xml\n     *\n     * @return {Error} returnError, if not thrown\n     */\n    this['parse'] = function(xml) {\n      if (typeof xml !== 'string') {\n        throw error$1('required args <xml=string>');\n      }\n\n      returnError = null;\n\n      parse(xml);\n\n      getContext = noopGetContext;\n      parseStop = false;\n\n      return returnError;\n    };\n\n    /**\n     * Stop parsing.\n     */\n    this['stop'] = function() {\n      parseStop = true;\n    };\n\n    /**\n     * Parse string, invoking configured listeners on element.\n     *\n     * @param  {string} xml\n     */\n    function parse(xml) {\n      var nsMatrixStack = isNamespace ? [] : null,\n          nsMatrix = isNamespace ? buildNsMatrix(nsUriToPrefix) : null,\n          _nsMatrix,\n          nodeStack = [],\n          anonymousNsCount = 0,\n          tagStart = false,\n          tagEnd = false,\n          i = 0, j = 0,\n          x, y, q, w, v,\n          xmlns,\n          elementName,\n          _elementName,\n          elementProxy\n          ;\n\n      var attrsString = '',\n          attrsStart = 0,\n          cachedAttrs // false = parsed with errors, null = needs parsing\n          ;\n\n      /**\n       * Parse attributes on demand and returns the parsed attributes.\n       *\n       * Return semantics: (1) `false` on attribute parse error,\n       * (2) object hash on extracted attrs.\n       *\n       * @return {boolean|Object}\n       */\n      function getAttrs() {\n        if (cachedAttrs !== null) {\n          return cachedAttrs;\n        }\n\n        var nsUri,\n            nsUriPrefix,\n            nsName,\n            defaultAlias = isNamespace && nsMatrix['xmlns'],\n            attrList = isNamespace && maybeNS ? [] : null,\n            i = attrsStart,\n            s = attrsString,\n            l = s.length,\n            hasNewMatrix,\n            newalias,\n            value,\n            alias,\n            name,\n            attrs = {},\n            seenAttrs = {},\n            skipAttr,\n            w,\n            j;\n\n        parseAttr:\n        for (; i < l; i++) {\n          skipAttr = false;\n          w = s.charCodeAt(i);\n\n          if (w === 32 || (w < 14 && w > 8)) { // WHITESPACE={ \\f\\n\\r\\t\\v}\n            continue;\n          }\n\n          // wait for non whitespace character\n          if (w < 65 || w > 122 || (w > 90 && w < 97)) {\n            if (w !== 95 && w !== 58) { // char 95\"_\" 58\":\"\n              handleWarning('illegal first char attribute name');\n              skipAttr = true;\n            }\n          }\n\n          // parse attribute name\n          for (j = i + 1; j < l; j++) {\n            w = s.charCodeAt(j);\n\n            if (\n              w > 96 && w < 123 ||\n              w > 64 && w < 91 ||\n              w > 47 && w < 59 ||\n              w === 46 || // '.'\n              w === 45 || // '-'\n              w === 95 // '_'\n            ) {\n              continue;\n            }\n\n            // unexpected whitespace\n            if (w === 32 || (w < 14 && w > 8)) { // WHITESPACE\n              handleWarning('missing attribute value');\n              i = j;\n\n              continue parseAttr;\n            }\n\n            // expected \"=\"\n            if (w === 61) { // \"=\" == 61\n              break;\n            }\n\n            handleWarning('illegal attribute name char');\n            skipAttr = true;\n          }\n\n          name = s.substring(i, j);\n\n          if (name === 'xmlns:xmlns') {\n            handleWarning('illegal declaration of xmlns');\n            skipAttr = true;\n          }\n\n          w = s.charCodeAt(j + 1);\n\n          if (w === 34) { // '\"'\n            j = s.indexOf('\"', i = j + 2);\n\n            if (j === -1) {\n              j = s.indexOf('\\'', i);\n\n              if (j !== -1) {\n                handleWarning('attribute value quote missmatch');\n                skipAttr = true;\n              }\n            }\n\n          } else if (w === 39) { // \"'\"\n            j = s.indexOf('\\'', i = j + 2);\n\n            if (j === -1) {\n              j = s.indexOf('\"', i);\n\n              if (j !== -1) {\n                handleWarning('attribute value quote missmatch');\n                skipAttr = true;\n              }\n            }\n\n          } else {\n            handleWarning('missing attribute value quotes');\n            skipAttr = true;\n\n            // skip to next space\n            for (j = j + 1; j < l; j++) {\n              w = s.charCodeAt(j + 1);\n\n              if (w === 32 || (w < 14 && w > 8)) { // WHITESPACE\n                break;\n              }\n            }\n\n          }\n\n          if (j === -1) {\n            handleWarning('missing closing quotes');\n\n            j = l;\n            skipAttr = true;\n          }\n\n          if (!skipAttr) {\n            value = s.substring(i, j);\n          }\n\n          i = j;\n\n          // ensure SPACE follows attribute\n          // skip illegal content otherwise\n          // example a=\"b\"c\n          for (; j + 1 < l; j++) {\n            w = s.charCodeAt(j + 1);\n\n            if (w === 32 || (w < 14 && w > 8)) { // WHITESPACE\n              break;\n            }\n\n            // FIRST ILLEGAL CHAR\n            if (i === j) {\n              handleWarning('illegal character after attribute end');\n              skipAttr = true;\n            }\n          }\n\n          // advance cursor to next attribute\n          i = j + 1;\n\n          if (skipAttr) {\n            continue parseAttr;\n          }\n\n          // check attribute re-declaration\n          if (name in seenAttrs) {\n            handleWarning('attribute <' + name + '> already defined');\n            continue;\n          }\n\n          seenAttrs[name] = true;\n\n          if (!isNamespace) {\n            attrs[name] = value;\n            continue;\n          }\n\n          // try to extract namespace information\n          if (maybeNS) {\n            newalias = (\n              name === 'xmlns'\n                ? 'xmlns'\n                : (name.charCodeAt(0) === 120 && name.substr(0, 6) === 'xmlns:')\n                  ? name.substr(6)\n                  : null\n            );\n\n            // handle xmlns(:alias) assignment\n            if (newalias !== null) {\n              nsUri = decodeEntities(value);\n              nsUriPrefix = uriPrefix(newalias);\n\n              alias = nsUriToPrefix[nsUri];\n\n              if (!alias) {\n\n                // no prefix defined or prefix collision\n                if (\n                  (newalias === 'xmlns') ||\n                  (nsUriPrefix in nsMatrix && nsMatrix[nsUriPrefix] !== nsUri)\n                ) {\n\n                  // alocate free ns prefix\n                  do {\n                    alias = 'ns' + (anonymousNsCount++);\n                  } while (typeof nsMatrix[alias] !== 'undefined');\n                } else {\n                  alias = newalias;\n                }\n\n                nsUriToPrefix[nsUri] = alias;\n              }\n\n              if (nsMatrix[newalias] !== alias) {\n                if (!hasNewMatrix) {\n                  nsMatrix = cloneNsMatrix(nsMatrix);\n                  hasNewMatrix = true;\n                }\n\n                nsMatrix[newalias] = alias;\n                if (newalias === 'xmlns') {\n                  nsMatrix[uriPrefix(alias)] = nsUri;\n                  defaultAlias = alias;\n                }\n\n                nsMatrix[nsUriPrefix] = nsUri;\n              }\n\n              // expose xmlns(:asd)=\"...\" in attributes\n              attrs[name] = value;\n              continue;\n            }\n\n            // collect attributes until all namespace\n            // declarations are processed\n            attrList.push(name, value);\n            continue;\n\n          } /** end if (maybeNs) */\n\n          // handle attributes on element without\n          // namespace declarations\n          w = name.indexOf(':');\n          if (w === -1) {\n            attrs[name] = value;\n            continue;\n          }\n\n          // normalize ns attribute name\n          if (!(nsName = nsMatrix[name.substring(0, w)])) {\n            handleWarning(missingNamespaceForPrefix(name.substring(0, w)));\n            continue;\n          }\n\n          name = defaultAlias === nsName\n            ? name.substr(w + 1)\n            : nsName + name.substr(w);\n\n          // end: normalize ns attribute name\n\n          // normalize xsi:type ns attribute value\n          if (name === XSI_TYPE$1) {\n            w = value.indexOf(':');\n\n            if (w !== -1) {\n              nsName = value.substring(0, w);\n\n              // handle default prefixes, i.e. xs:String gracefully\n              nsName = nsMatrix[nsName] || nsName;\n              value = nsName + value.substring(w);\n            } else {\n              value = defaultAlias + ':' + value;\n            }\n          }\n\n          // end: normalize xsi:type ns attribute value\n\n          attrs[name] = value;\n        }\n\n\n        // handle deferred, possibly namespaced attributes\n        if (maybeNS) {\n\n          // normalize captured attributes\n          for (i = 0, l = attrList.length; i < l; i++) {\n\n            name = attrList[i++];\n            value = attrList[i];\n\n            w = name.indexOf(':');\n\n            if (w !== -1) {\n\n              // normalize ns attribute name\n              if (!(nsName = nsMatrix[name.substring(0, w)])) {\n                handleWarning(missingNamespaceForPrefix(name.substring(0, w)));\n                continue;\n              }\n\n              name = defaultAlias === nsName\n                ? name.substr(w + 1)\n                : nsName + name.substr(w);\n\n              // end: normalize ns attribute name\n\n              // normalize xsi:type ns attribute value\n              if (name === XSI_TYPE$1) {\n                w = value.indexOf(':');\n\n                if (w !== -1) {\n                  nsName = value.substring(0, w);\n\n                  // handle default prefixes, i.e. xs:String gracefully\n                  nsName = nsMatrix[nsName] || nsName;\n                  value = nsName + value.substring(w);\n                } else {\n                  value = defaultAlias + ':' + value;\n                }\n              }\n\n              // end: normalize xsi:type ns attribute value\n            }\n\n            attrs[name] = value;\n          }\n\n          // end: normalize captured attributes\n        }\n\n        return cachedAttrs = attrs;\n      }\n\n      /**\n       * Extract the parse context { line, column, part }\n       * from the current parser position.\n       *\n       * @return {Object} parse context\n       */\n      function getParseContext() {\n        var splitsRe = /(\\r\\n|\\r|\\n)/g;\n\n        var line = 0;\n        var column = 0;\n        var startOfLine = 0;\n        var endOfLine = j;\n        var match;\n        var data;\n\n        while (i >= startOfLine) {\n\n          match = splitsRe.exec(xml);\n\n          if (!match) {\n            break;\n          }\n\n          // end of line = (break idx + break chars)\n          endOfLine = match[0].length + match.index;\n\n          if (endOfLine > i) {\n            break;\n          }\n\n          // advance to next line\n          line += 1;\n\n          startOfLine = endOfLine;\n        }\n\n        // EOF errors\n        if (i == -1) {\n          column = endOfLine;\n          data = xml.substring(j);\n        } else\n\n        // start errors\n        if (j === 0) {\n          data = xml.substring(j, i);\n        }\n\n        // other errors\n        else {\n          column = i - startOfLine;\n          data = (j == -1 ? xml.substring(i) : xml.substring(i, j + 1));\n        }\n\n        return {\n          'data': data,\n          'line': line,\n          'column': column\n        };\n      }\n\n      getContext = getParseContext;\n\n\n      if (proxy) {\n        elementProxy = Object.create({}, {\n          'name': getter(function() {\n            return elementName;\n          }),\n          'originalName': getter(function() {\n            return _elementName;\n          }),\n          'attrs': getter(getAttrs),\n          'ns': getter(function() {\n            return nsMatrix;\n          })\n        });\n      }\n\n      // actual parse logic\n      while (j !== -1) {\n\n        if (xml.charCodeAt(j) === 60) { // \"<\"\n          i = j;\n        } else {\n          i = xml.indexOf('<', j);\n        }\n\n        // parse end\n        if (i === -1) {\n          if (nodeStack.length) {\n            return handleError('unexpected end of file');\n          }\n\n          if (j === 0) {\n            return handleError('missing start tag');\n          }\n\n          if (j < xml.length) {\n            if (xml.substring(j).trim()) {\n              handleWarning(NON_WHITESPACE_OUTSIDE_ROOT_NODE);\n            }\n          }\n\n          return;\n        }\n\n        // parse text\n        if (j !== i) {\n\n          if (nodeStack.length) {\n            if (onText) {\n              onText(xml.substring(j, i), decodeEntities, getContext);\n\n              if (parseStop) {\n                return;\n              }\n            }\n          } else {\n            if (xml.substring(j, i).trim()) {\n              handleWarning(NON_WHITESPACE_OUTSIDE_ROOT_NODE);\n\n              if (parseStop) {\n                return;\n              }\n            }\n          }\n        }\n\n        w = xml.charCodeAt(i+1);\n\n        // parse comments + CDATA\n        if (w === 33) { // \"!\"\n          q = xml.charCodeAt(i+2);\n\n          // CDATA section\n          if (q === 91 && xml.substr(i + 3, 6) === 'CDATA[') { // 91 == \"[\"\n            j = xml.indexOf(']]>', i);\n            if (j === -1) {\n              return handleError('unclosed cdata');\n            }\n\n            if (onCDATA) {\n              onCDATA(xml.substring(i + 9, j), getContext);\n              if (parseStop) {\n                return;\n              }\n            }\n\n            j += 3;\n            continue;\n          }\n\n          // comment\n          if (q === 45 && xml.charCodeAt(i + 3) === 45) { // 45 == \"-\"\n            j = xml.indexOf('-->', i);\n            if (j === -1) {\n              return handleError('unclosed comment');\n            }\n\n\n            if (onComment) {\n              onComment(xml.substring(i + 4, j), decodeEntities, getContext);\n              if (parseStop) {\n                return;\n              }\n            }\n\n            j += 3;\n            continue;\n          }\n        }\n\n        // parse question <? ... ?>\n        if (w === 63) { // \"?\"\n          j = xml.indexOf('?>', i);\n          if (j === -1) {\n            return handleError('unclosed question');\n          }\n\n          if (onQuestion) {\n            onQuestion(xml.substring(i, j + 2), getContext);\n            if (parseStop) {\n              return;\n            }\n          }\n\n          j += 2;\n          continue;\n        }\n\n        // find matching closing tag for attention or standard tags\n        // for that we must skip through attribute values\n        // (enclosed in single or double quotes)\n        for (x = i + 1; ; x++) {\n          v = xml.charCodeAt(x);\n          if (isNaN(v)) {\n            j = -1;\n            return handleError('unclosed tag');\n          }\n\n          // [10] AttValue ::= '\"' ([^<&\"] | Reference)* '\"' | \"'\" ([^<&'] | Reference)* \"'\"\n          // skips the quoted string\n          // (double quotes) does not appear in a literal enclosed by (double quotes)\n          // (single quote) does not appear in a literal enclosed by (single quote)\n          if (v === 34) { //  '\"'\n            q = xml.indexOf('\"', x + 1);\n            x = q !== -1 ? q : x;\n          } else if (v === 39) { // \"'\"\n            q = xml.indexOf(\"'\", x + 1);\n            x = q !== -1 ? q : x;\n          } else if (v === 62) { // '>'\n            j = x;\n            break;\n          }\n        }\n\n\n        // parse attention <! ...>\n        // previously comment and CDATA have already been parsed\n        if (w === 33) { // \"!\"\n\n          if (onAttention) {\n            onAttention(xml.substring(i, j + 1), decodeEntities, getContext);\n            if (parseStop) {\n              return;\n            }\n          }\n\n          j += 1;\n          continue;\n        }\n\n        // don't process attributes;\n        // there are none\n        cachedAttrs = {};\n\n        // if (xml.charCodeAt(i+1) === 47) { // </...\n        if (w === 47) { // </...\n          tagStart = false;\n          tagEnd = true;\n\n          if (!nodeStack.length) {\n            return handleError('missing open tag');\n          }\n\n          // verify open <-> close tag match\n          x = elementName = nodeStack.pop();\n          q = i + 2 + x.length;\n\n          if (xml.substring(i + 2, q) !== x) {\n            return handleError('closing tag mismatch');\n          }\n\n          // verify chars in close tag\n          for (; q < j; q++) {\n            w = xml.charCodeAt(q);\n\n            if (w === 32 || (w > 8 && w < 14)) { // \\f\\n\\r\\t\\v space\n              continue;\n            }\n\n            return handleError('close tag');\n          }\n\n        } else {\n          if (xml.charCodeAt(j - 1) === 47) { // .../>\n            x = elementName = xml.substring(i + 1, j - 1);\n\n            tagStart = true;\n            tagEnd = true;\n\n          } else {\n            x = elementName = xml.substring(i + 1, j);\n\n            tagStart = true;\n            tagEnd = false;\n          }\n\n          if (!(w > 96 && w < 123 || w > 64 && w < 91 || w === 95 || w === 58)) { // char 95\"_\" 58\":\"\n            return handleError('illegal first char nodeName');\n          }\n\n          for (q = 1, y = x.length; q < y; q++) {\n            w = x.charCodeAt(q);\n\n            if (w > 96 && w < 123 || w > 64 && w < 91 || w > 47 && w < 59 || w === 45 || w === 95 || w == 46) {\n              continue;\n            }\n\n            if (w === 32 || (w < 14 && w > 8)) { // \\f\\n\\r\\t\\v space\n              elementName = x.substring(0, q);\n\n              // maybe there are attributes\n              cachedAttrs = null;\n              break;\n            }\n\n            return handleError('invalid nodeName');\n          }\n\n          if (!tagEnd) {\n            nodeStack.push(elementName);\n          }\n        }\n\n        if (isNamespace) {\n\n          _nsMatrix = nsMatrix;\n\n          if (tagStart) {\n\n            // remember old namespace\n            // unless we're self-closing\n            if (!tagEnd) {\n              nsMatrixStack.push(_nsMatrix);\n            }\n\n            if (cachedAttrs === null) {\n\n              // quick check, whether there may be namespace\n              // declarations on the node; if that is the case\n              // we need to eagerly parse the node attributes\n              if ((maybeNS = x.indexOf('xmlns', q) !== -1)) {\n                attrsStart = q;\n                attrsString = x;\n\n                getAttrs();\n\n                maybeNS = false;\n              }\n            }\n          }\n\n          _elementName = elementName;\n\n          w = elementName.indexOf(':');\n          if (w !== -1) {\n            xmlns = nsMatrix[elementName.substring(0, w)];\n\n            // prefix given; namespace must exist\n            if (!xmlns) {\n              return handleError('missing namespace on <' + _elementName + '>');\n            }\n\n            elementName = elementName.substr(w + 1);\n          } else {\n            xmlns = nsMatrix['xmlns'];\n\n            // if no default namespace is defined,\n            // we'll import the element as anonymous.\n            //\n            // it is up to users to correct that to the document defined\n            // targetNamespace, or whatever their undersanding of the\n            // XML spec mandates.\n          }\n\n          // adjust namespace prefixs as configured\n          if (xmlns) {\n            elementName = xmlns + ':' + elementName;\n          }\n\n        }\n\n        if (tagStart) {\n          attrsStart = q;\n          attrsString = x;\n\n          if (onOpenTag) {\n            if (proxy) {\n              onOpenTag(elementProxy, decodeEntities, tagEnd, getContext);\n            } else {\n              onOpenTag(elementName, getAttrs, decodeEntities, tagEnd, getContext);\n            }\n\n            if (parseStop) {\n              return;\n            }\n          }\n\n        }\n\n        if (tagEnd) {\n\n          if (onCloseTag) {\n            onCloseTag(proxy ? elementProxy : elementName, decodeEntities, tagStart, getContext);\n\n            if (parseStop) {\n              return;\n            }\n          }\n\n          // restore old namespace\n          if (isNamespace) {\n            if (!tagStart) {\n              nsMatrix = nsMatrixStack.pop();\n            } else {\n              nsMatrix = _nsMatrix;\n            }\n          }\n        }\n\n        j += 1;\n      }\n    } /** end parse */\n\n  }\n\n  function hasLowerCaseAlias(pkg) {\n    return pkg.xml && pkg.xml.tagAlias === 'lowerCase';\n  }\n\n  var DEFAULT_NS_MAP = {\n    'xsi': 'http://www.w3.org/2001/XMLSchema-instance',\n    'xml': 'http://www.w3.org/XML/1998/namespace'\n  };\n\n  var XSI_TYPE = 'xsi:type';\n\n  function serializeFormat(element) {\n    return element.xml && element.xml.serialize;\n  }\n\n  function serializeAsType(element) {\n    return serializeFormat(element) === XSI_TYPE;\n  }\n\n  function serializeAsProperty(element) {\n    return serializeFormat(element) === 'property';\n  }\n\n  function capitalize(str) {\n    return str.charAt(0).toUpperCase() + str.slice(1);\n  }\n\n  function aliasToName(aliasNs, pkg) {\n\n    if (!hasLowerCaseAlias(pkg)) {\n      return aliasNs.name;\n    }\n\n    return aliasNs.prefix + ':' + capitalize(aliasNs.localName);\n  }\n\n  function prefixedToName(nameNs, pkg) {\n\n    var name = nameNs.name,\n        localName = nameNs.localName;\n\n    var typePrefix = pkg.xml && pkg.xml.typePrefix;\n\n    if (typePrefix && localName.indexOf(typePrefix) === 0) {\n      return nameNs.prefix + ':' + localName.slice(typePrefix.length);\n    } else {\n      return name;\n    }\n  }\n\n  function normalizeXsiTypeName(name, model) {\n\n    var nameNs = parseName(name);\n    var pkg = model.getPackage(nameNs.prefix);\n\n    return prefixedToName(nameNs, pkg);\n  }\n\n  function error(message) {\n    return new Error(message);\n  }\n\n  /**\n   * Get the moddle descriptor for a given instance or type.\n   *\n   * @param  {ModdleElement|Function} element\n   *\n   * @return {Object} the moddle descriptor\n   */\n  function getModdleDescriptor(element) {\n    return element.$descriptor;\n  }\n\n\n  /**\n   * A parse context.\n   *\n   * @class\n   *\n   * @param {Object} options\n   * @param {ElementHandler} options.rootHandler the root handler for parsing a document\n   * @param {boolean} [options.lax=false] whether or not to ignore invalid elements\n   */\n  function Context(options) {\n\n    /**\n     * @property {ElementHandler} rootHandler\n     */\n\n    /**\n     * @property {Boolean} lax\n     */\n\n    assign$1(this, options);\n\n    this.elementsById = {};\n    this.references = [];\n    this.warnings = [];\n\n    /**\n     * Add an unresolved reference.\n     *\n     * @param {Object} reference\n     */\n    this.addReference = function(reference) {\n      this.references.push(reference);\n    };\n\n    /**\n     * Add a processed element.\n     *\n     * @param {ModdleElement} element\n     */\n    this.addElement = function(element) {\n\n      if (!element) {\n        throw error('expected element');\n      }\n\n      var elementsById = this.elementsById;\n\n      var descriptor = getModdleDescriptor(element);\n\n      var idProperty = descriptor.idProperty,\n          id;\n\n      if (idProperty) {\n        id = element.get(idProperty.name);\n\n        if (id) {\n\n          // for QName validation as per http://www.w3.org/TR/REC-xml/#NT-NameChar\n          //if (!/^([a-z][\\w-.]*:)?[a-z_][\\w-.]*$/i.test(id)) {\n          //  throw new Error('illegal ID <' + id + '>');\n          //}\n\n          if (elementsById[id]) {\n            throw error('duplicate ID <' + id + '>');\n          }\n\n          elementsById[id] = element;\n        }\n      }\n    };\n\n    /**\n     * Add an import warning.\n     *\n     * @param {Object} warning\n     * @param {String} warning.message\n     * @param {Error} [warning.error]\n     */\n    this.addWarning = function(warning) {\n      this.warnings.push(warning);\n    };\n  }\n\n  function BaseHandler() {}\n\n  BaseHandler.prototype.handleEnd = function() {};\n  BaseHandler.prototype.handleText = function() {};\n  BaseHandler.prototype.handleNode = function() {};\n\n\n  /**\n   * A simple pass through handler that does nothing except for\n   * ignoring all input it receives.\n   *\n   * This is used to ignore unknown elements and\n   * attributes.\n   */\n  function NoopHandler() { }\n\n  NoopHandler.prototype = Object.create(BaseHandler.prototype);\n\n  NoopHandler.prototype.handleNode = function() {\n    return this;\n  };\n\n  function BodyHandler() {}\n\n  BodyHandler.prototype = Object.create(BaseHandler.prototype);\n\n  BodyHandler.prototype.handleText = function(text) {\n    this.body = (this.body || '') + text;\n  };\n\n  function ReferenceHandler(property, context) {\n    this.property = property;\n    this.context = context;\n  }\n\n  ReferenceHandler.prototype = Object.create(BodyHandler.prototype);\n\n  ReferenceHandler.prototype.handleNode = function(node) {\n\n    if (this.element) {\n      throw error('expected no sub nodes');\n    } else {\n      this.element = this.createReference(node);\n    }\n\n    return this;\n  };\n\n  ReferenceHandler.prototype.handleEnd = function() {\n    this.element.id = this.body;\n  };\n\n  ReferenceHandler.prototype.createReference = function(node) {\n    return {\n      property: this.property.ns.name,\n      id: ''\n    };\n  };\n\n  function ValueHandler(propertyDesc, element) {\n    this.element = element;\n    this.propertyDesc = propertyDesc;\n  }\n\n  ValueHandler.prototype = Object.create(BodyHandler.prototype);\n\n  ValueHandler.prototype.handleEnd = function() {\n\n    var value = this.body || '',\n        element = this.element,\n        propertyDesc = this.propertyDesc;\n\n    value = coerceType(propertyDesc.type, value);\n\n    if (propertyDesc.isMany) {\n      element.get(propertyDesc.name).push(value);\n    } else {\n      element.set(propertyDesc.name, value);\n    }\n  };\n\n\n  function BaseElementHandler() {}\n\n  BaseElementHandler.prototype = Object.create(BodyHandler.prototype);\n\n  BaseElementHandler.prototype.handleNode = function(node) {\n    var parser = this,\n        element = this.element;\n\n    if (!element) {\n      element = this.element = this.createElement(node);\n\n      this.context.addElement(element);\n    } else {\n      parser = this.handleChild(node);\n    }\n\n    return parser;\n  };\n\n  /**\n   * @class Reader.ElementHandler\n   *\n   */\n  function ElementHandler(model, typeName, context) {\n    this.model = model;\n    this.type = model.getType(typeName);\n    this.context = context;\n  }\n\n  ElementHandler.prototype = Object.create(BaseElementHandler.prototype);\n\n  ElementHandler.prototype.addReference = function(reference) {\n    this.context.addReference(reference);\n  };\n\n  ElementHandler.prototype.handleText = function(text) {\n\n    var element = this.element,\n        descriptor = getModdleDescriptor(element),\n        bodyProperty = descriptor.bodyProperty;\n\n    if (!bodyProperty) {\n      throw error('unexpected body text <' + text + '>');\n    }\n\n    BodyHandler.prototype.handleText.call(this, text);\n  };\n\n  ElementHandler.prototype.handleEnd = function() {\n\n    var value = this.body,\n        element = this.element,\n        descriptor = getModdleDescriptor(element),\n        bodyProperty = descriptor.bodyProperty;\n\n    if (bodyProperty && value !== undefined) {\n      value = coerceType(bodyProperty.type, value);\n      element.set(bodyProperty.name, value);\n    }\n  };\n\n  /**\n   * Create an instance of the model from the given node.\n   *\n   * @param  {Element} node the xml node\n   */\n  ElementHandler.prototype.createElement = function(node) {\n    var attributes = node.attributes,\n        Type = this.type,\n        descriptor = getModdleDescriptor(Type),\n        context = this.context,\n        instance = new Type({}),\n        model = this.model,\n        propNameNs;\n\n    forEach$1(attributes, function(value, name) {\n\n      var prop = descriptor.propertiesByName[name],\n          values;\n\n      if (prop && prop.isReference) {\n\n        if (!prop.isMany) {\n          context.addReference({\n            element: instance,\n            property: prop.ns.name,\n            id: value\n          });\n        } else {\n\n          // IDREFS: parse references as whitespace-separated list\n          values = value.split(' ');\n\n          forEach$1(values, function(v) {\n            context.addReference({\n              element: instance,\n              property: prop.ns.name,\n              id: v\n            });\n          });\n        }\n\n      } else {\n        if (prop) {\n          value = coerceType(prop.type, value);\n        } else\n        if (name !== 'xmlns') {\n          propNameNs = parseName(name, descriptor.ns.prefix);\n\n          // check whether attribute is defined in a well-known namespace\n          // if that is the case we emit a warning to indicate potential misuse\n          if (model.getPackage(propNameNs.prefix)) {\n\n            context.addWarning({\n              message: 'unknown attribute <' + name + '>',\n              element: instance,\n              property: name,\n              value: value\n            });\n          }\n        }\n\n        instance.set(name, value);\n      }\n    });\n\n    return instance;\n  };\n\n  ElementHandler.prototype.getPropertyForNode = function(node) {\n\n    var name = node.name;\n    var nameNs = parseName(name);\n\n    var type = this.type,\n        model = this.model,\n        descriptor = getModdleDescriptor(type);\n\n    var propertyName = nameNs.name,\n        property = descriptor.propertiesByName[propertyName],\n        elementTypeName,\n        elementType;\n\n    // search for properties by name first\n\n    if (property && !property.isAttr) {\n\n      if (serializeAsType(property)) {\n        elementTypeName = node.attributes[XSI_TYPE];\n\n        // xsi type is optional, if it does not exists the\n        // default type is assumed\n        if (elementTypeName) {\n\n          // take possible type prefixes from XML\n          // into account, i.e.: xsi:type=\"t{ActualType}\"\n          elementTypeName = normalizeXsiTypeName(elementTypeName, model);\n\n          elementType = model.getType(elementTypeName);\n\n          return assign$1({}, property, {\n            effectiveType: getModdleDescriptor(elementType).name\n          });\n        }\n      }\n\n      // search for properties by name first\n      return property;\n    }\n\n    var pkg = model.getPackage(nameNs.prefix);\n\n    if (pkg) {\n      elementTypeName = aliasToName(nameNs, pkg);\n      elementType = model.getType(elementTypeName);\n\n      // search for collection members later\n      property = find(descriptor.properties, function(p) {\n        return !p.isVirtual && !p.isReference && !p.isAttribute && elementType.hasType(p.type);\n      });\n\n      if (property) {\n        return assign$1({}, property, {\n          effectiveType: getModdleDescriptor(elementType).name\n        });\n      }\n    } else {\n\n      // parse unknown element (maybe extension)\n      property = find(descriptor.properties, function(p) {\n        return !p.isReference && !p.isAttribute && p.type === 'Element';\n      });\n\n      if (property) {\n        return property;\n      }\n    }\n\n    throw error('unrecognized element <' + nameNs.name + '>');\n  };\n\n  ElementHandler.prototype.toString = function() {\n    return 'ElementDescriptor[' + getModdleDescriptor(this.type).name + ']';\n  };\n\n  ElementHandler.prototype.valueHandler = function(propertyDesc, element) {\n    return new ValueHandler(propertyDesc, element);\n  };\n\n  ElementHandler.prototype.referenceHandler = function(propertyDesc) {\n    return new ReferenceHandler(propertyDesc, this.context);\n  };\n\n  ElementHandler.prototype.handler = function(type) {\n    if (type === 'Element') {\n      return new GenericElementHandler(this.model, type, this.context);\n    } else {\n      return new ElementHandler(this.model, type, this.context);\n    }\n  };\n\n  /**\n   * Handle the child element parsing\n   *\n   * @param  {Element} node the xml node\n   */\n  ElementHandler.prototype.handleChild = function(node) {\n    var propertyDesc, type, element, childHandler;\n\n    propertyDesc = this.getPropertyForNode(node);\n    element = this.element;\n\n    type = propertyDesc.effectiveType || propertyDesc.type;\n\n    if (isSimple(type)) {\n      return this.valueHandler(propertyDesc, element);\n    }\n\n    if (propertyDesc.isReference) {\n      childHandler = this.referenceHandler(propertyDesc).handleNode(node);\n    } else {\n      childHandler = this.handler(type).handleNode(node);\n    }\n\n    var newElement = childHandler.element;\n\n    // child handles may decide to skip elements\n    // by not returning anything\n    if (newElement !== undefined) {\n\n      if (propertyDesc.isMany) {\n        element.get(propertyDesc.name).push(newElement);\n      } else {\n        element.set(propertyDesc.name, newElement);\n      }\n\n      if (propertyDesc.isReference) {\n        assign$1(newElement, {\n          element: element\n        });\n\n        this.context.addReference(newElement);\n      } else {\n\n        // establish child -> parent relationship\n        newElement.$parent = element;\n      }\n    }\n\n    return childHandler;\n  };\n\n  /**\n   * An element handler that performs special validation\n   * to ensure the node it gets initialized with matches\n   * the handlers type (namespace wise).\n   *\n   * @param {Moddle} model\n   * @param {String} typeName\n   * @param {Context} context\n   */\n  function RootElementHandler(model, typeName, context) {\n    ElementHandler.call(this, model, typeName, context);\n  }\n\n  RootElementHandler.prototype = Object.create(ElementHandler.prototype);\n\n  RootElementHandler.prototype.createElement = function(node) {\n\n    var name = node.name,\n        nameNs = parseName(name),\n        model = this.model,\n        type = this.type,\n        pkg = model.getPackage(nameNs.prefix),\n        typeName = pkg && aliasToName(nameNs, pkg) || name;\n\n    // verify the correct namespace if we parse\n    // the first element in the handler tree\n    //\n    // this ensures we don't mistakenly import wrong namespace elements\n    if (!type.hasType(typeName)) {\n      throw error('unexpected element <' + node.originalName + '>');\n    }\n\n    return ElementHandler.prototype.createElement.call(this, node);\n  };\n\n\n  function GenericElementHandler(model, typeName, context) {\n    this.model = model;\n    this.context = context;\n  }\n\n  GenericElementHandler.prototype = Object.create(BaseElementHandler.prototype);\n\n  GenericElementHandler.prototype.createElement = function(node) {\n\n    var name = node.name,\n        ns = parseName(name),\n        prefix = ns.prefix,\n        uri = node.ns[prefix + '$uri'],\n        attributes = node.attributes;\n\n    return this.model.createAny(name, uri, attributes);\n  };\n\n  GenericElementHandler.prototype.handleChild = function(node) {\n\n    var handler = new GenericElementHandler(this.model, 'Element', this.context).handleNode(node),\n        element = this.element;\n\n    var newElement = handler.element,\n        children;\n\n    if (newElement !== undefined) {\n      children = element.$children = element.$children || [];\n      children.push(newElement);\n\n      // establish child -> parent relationship\n      newElement.$parent = element;\n    }\n\n    return handler;\n  };\n\n  GenericElementHandler.prototype.handleEnd = function() {\n    if (this.body) {\n      this.element.$body = this.body;\n    }\n  };\n\n  /**\n   * A reader for a meta-model\n   *\n   * @param {Object} options\n   * @param {Model} options.model used to read xml files\n   * @param {Boolean} options.lax whether to make parse errors warnings\n   */\n  function Reader(options) {\n\n    if (options instanceof Moddle) {\n      options = {\n        model: options\n      };\n    }\n\n    assign$1(this, { lax: false }, options);\n  }\n\n  /**\n   * The fromXML result.\n   *\n   * @typedef {Object} ParseResult\n   *\n   * @property {ModdleElement} rootElement\n   * @property {Array<Object>} references\n   * @property {Array<Error>} warnings\n   * @property {Object} elementsById - a mapping containing each ID -> ModdleElement\n   */\n\n  /**\n   * The fromXML result.\n   *\n   * @typedef {Error} ParseError\n   *\n   * @property {Array<Error>} warnings\n   */\n\n  /**\n   * Parse the given XML into a moddle document tree.\n   *\n   * @param {String} xml\n   * @param {ElementHandler|Object} options or rootHandler\n   *\n   * @returns {Promise<ParseResult, ParseError>}\n   */\n  Reader.prototype.fromXML = function(xml, options, done) {\n\n    var rootHandler = options.rootHandler;\n\n    if (options instanceof ElementHandler) {\n\n      // root handler passed via (xml, { rootHandler: ElementHandler }, ...)\n      rootHandler = options;\n      options = {};\n    } else {\n      if (typeof options === 'string') {\n\n        // rootHandler passed via (xml, 'someString', ...)\n        rootHandler = this.handler(options);\n        options = {};\n      } else if (typeof rootHandler === 'string') {\n\n        // rootHandler passed via (xml, { rootHandler: 'someString' }, ...)\n        rootHandler = this.handler(rootHandler);\n      }\n    }\n\n    var model = this.model,\n        lax = this.lax;\n\n    var context = new Context(assign$1({}, options, { rootHandler: rootHandler })),\n        parser = new Parser({ proxy: true }),\n        stack = createStack();\n\n    rootHandler.context = context;\n\n    // push root handler\n    stack.push(rootHandler);\n\n\n    /**\n     * Handle error.\n     *\n     * @param  {Error} err\n     * @param  {Function} getContext\n     * @param  {boolean} lax\n     *\n     * @return {boolean} true if handled\n     */\n    function handleError(err, getContext, lax) {\n\n      var ctx = getContext();\n\n      var line = ctx.line,\n          column = ctx.column,\n          data = ctx.data;\n\n      // we receive the full context data here,\n      // for elements trim down the information\n      // to the tag name, only\n      if (data.charAt(0) === '<' && data.indexOf(' ') !== -1) {\n        data = data.slice(0, data.indexOf(' ')) + '>';\n      }\n\n      var message =\n        'unparsable content ' + (data ? data + ' ' : '') + 'detected\\n\\t' +\n          'line: ' + line + '\\n\\t' +\n          'column: ' + column + '\\n\\t' +\n          'nested error: ' + err.message;\n\n      if (lax) {\n        context.addWarning({\n          message: message,\n          error: err\n        });\n\n        return true;\n      } else {\n        throw error(message);\n      }\n    }\n\n    function handleWarning(err, getContext) {\n\n      // just like handling errors in <lax=true> mode\n      return handleError(err, getContext, true);\n    }\n\n    /**\n     * Resolve collected references on parse end.\n     */\n    function resolveReferences() {\n\n      var elementsById = context.elementsById;\n      var references = context.references;\n\n      var i, r;\n\n      for (i = 0; (r = references[i]); i++) {\n        var element = r.element;\n        var reference = elementsById[r.id];\n        var property = getModdleDescriptor(element).propertiesByName[r.property];\n\n        if (!reference) {\n          context.addWarning({\n            message: 'unresolved reference <' + r.id + '>',\n            element: r.element,\n            property: r.property,\n            value: r.id\n          });\n        }\n\n        if (property.isMany) {\n          var collection = element.get(property.name),\n              idx = collection.indexOf(r);\n\n          // we replace an existing place holder (idx != -1) or\n          // append to the collection instead\n          if (idx === -1) {\n            idx = collection.length;\n          }\n\n          if (!reference) {\n\n            // remove unresolvable reference\n            collection.splice(idx, 1);\n          } else {\n\n            // add or update reference in collection\n            collection[idx] = reference;\n          }\n        } else {\n          element.set(property.name, reference);\n        }\n      }\n    }\n\n    function handleClose() {\n      stack.pop().handleEnd();\n    }\n\n    var PREAMBLE_START_PATTERN = /^<\\?xml /i;\n\n    var ENCODING_PATTERN = / encoding=\"([^\"]+)\"/i;\n\n    var UTF_8_PATTERN = /^utf-8$/i;\n\n    function handleQuestion(question) {\n\n      if (!PREAMBLE_START_PATTERN.test(question)) {\n        return;\n      }\n\n      var match = ENCODING_PATTERN.exec(question);\n      var encoding = match && match[1];\n\n      if (!encoding || UTF_8_PATTERN.test(encoding)) {\n        return;\n      }\n\n      context.addWarning({\n        message:\n          'unsupported document encoding <' + encoding + '>, ' +\n          'falling back to UTF-8'\n      });\n    }\n\n    function handleOpen(node, getContext) {\n      var handler = stack.peek();\n\n      try {\n        stack.push(handler.handleNode(node));\n      } catch (err) {\n\n        if (handleError(err, getContext, lax)) {\n          stack.push(new NoopHandler());\n        }\n      }\n    }\n\n    function handleCData(text, getContext) {\n\n      try {\n        stack.peek().handleText(text);\n      } catch (err) {\n        handleWarning(err, getContext);\n      }\n    }\n\n    function handleText(text, getContext) {\n\n      // strip whitespace only nodes, i.e. before\n      // <!CDATA[ ... ]> sections and in between tags\n\n      if (!text.trim()) {\n        return;\n      }\n\n      handleCData(text, getContext);\n    }\n\n    var uriMap = model.getPackages().reduce(function(uriMap, p) {\n      uriMap[p.uri] = p.prefix;\n\n      return uriMap;\n    }, {\n      'http://www.w3.org/XML/1998/namespace': 'xml' // add default xml ns\n    });\n    parser\n      .ns(uriMap)\n      .on('openTag', function(obj, decodeStr, selfClosing, getContext) {\n\n        // gracefully handle unparsable attributes (attrs=false)\n        var attrs = obj.attrs || {};\n\n        var decodedAttrs = Object.keys(attrs).reduce(function(d, key) {\n          var value = decodeStr(attrs[key]);\n\n          d[key] = value;\n\n          return d;\n        }, {});\n\n        var node = {\n          name: obj.name,\n          originalName: obj.originalName,\n          attributes: decodedAttrs,\n          ns: obj.ns\n        };\n\n        handleOpen(node, getContext);\n      })\n      .on('question', handleQuestion)\n      .on('closeTag', handleClose)\n      .on('cdata', handleCData)\n      .on('text', function(text, decodeEntities, getContext) {\n        handleText(decodeEntities(text), getContext);\n      })\n      .on('error', handleError)\n      .on('warn', handleWarning);\n\n    // async XML parsing to make sure the execution environment\n    // (node or brower) is kept responsive and that certain optimization\n    // strategies can kick in.\n    return new Promise(function(resolve, reject) {\n\n      var err;\n\n      try {\n        parser.parse(xml);\n\n        resolveReferences();\n      } catch (e) {\n        err = e;\n      }\n\n      var rootElement = rootHandler.element;\n\n      if (!err && !rootElement) {\n        err = error('failed to parse document as <' + rootHandler.type.$descriptor.name + '>');\n      }\n\n      var warnings = context.warnings;\n      var references = context.references;\n      var elementsById = context.elementsById;\n\n      if (err) {\n        err.warnings = warnings;\n\n        return reject(err);\n      } else {\n        return resolve({\n          rootElement: rootElement,\n          elementsById: elementsById,\n          references: references,\n          warnings: warnings\n        });\n      }\n    });\n  };\n\n  Reader.prototype.handler = function(name) {\n    return new RootElementHandler(this.model, name);\n  };\n\n\n  // helpers //////////////////////////\n\n  function createStack() {\n    var stack = [];\n\n    Object.defineProperty(stack, 'peek', {\n      value: function() {\n        return this[this.length - 1];\n      }\n    });\n\n    return stack;\n  }\n\n  var XML_PREAMBLE = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n';\n\n  var ESCAPE_ATTR_CHARS = /<|>|'|\"|&|\\n\\r|\\n/g;\n  var ESCAPE_CHARS = /<|>|&/g;\n\n\n  function Namespaces(parent) {\n\n    var prefixMap = {};\n    var uriMap = {};\n    var used = {};\n\n    var wellknown = [];\n    var custom = [];\n\n    // API\n\n    this.byUri = function(uri) {\n      return uriMap[uri] || (\n        parent && parent.byUri(uri)\n      );\n    };\n\n    this.add = function(ns, isWellknown) {\n\n      uriMap[ns.uri] = ns;\n\n      if (isWellknown) {\n        wellknown.push(ns);\n      } else {\n        custom.push(ns);\n      }\n\n      this.mapPrefix(ns.prefix, ns.uri);\n    };\n\n    this.uriByPrefix = function(prefix) {\n      return prefixMap[prefix || 'xmlns'];\n    };\n\n    this.mapPrefix = function(prefix, uri) {\n      prefixMap[prefix || 'xmlns'] = uri;\n    };\n\n    this.getNSKey = function(ns) {\n      return (ns.prefix !== undefined) ? (ns.uri + '|' + ns.prefix) : ns.uri;\n    };\n\n    this.logUsed = function(ns) {\n\n      var uri = ns.uri;\n      var nsKey = this.getNSKey(ns);\n\n      used[nsKey] = this.byUri(uri);\n\n      // Inform parent recursively about the usage of this NS\n      if (parent) {\n        parent.logUsed(ns);\n      }\n    };\n\n    this.getUsed = function(ns) {\n\n      function isUsed(ns) {\n        var nsKey = self.getNSKey(ns);\n\n        return used[nsKey];\n      }\n\n      var self = this;\n\n      var allNs = [].concat(wellknown, custom);\n\n      return allNs.filter(isUsed);\n    };\n\n  }\n\n  function lower(string) {\n    return string.charAt(0).toLowerCase() + string.slice(1);\n  }\n\n  function nameToAlias(name, pkg) {\n    if (hasLowerCaseAlias(pkg)) {\n      return lower(name);\n    } else {\n      return name;\n    }\n  }\n\n  function inherits(ctor, superCtor) {\n    ctor.super_ = superCtor;\n    ctor.prototype = Object.create(superCtor.prototype, {\n      constructor: {\n        value: ctor,\n        enumerable: false,\n        writable: true,\n        configurable: true\n      }\n    });\n  }\n\n  function nsName(ns) {\n    if (isString(ns)) {\n      return ns;\n    } else {\n      return (ns.prefix ? ns.prefix + ':' : '') + ns.localName;\n    }\n  }\n\n  function getNsAttrs(namespaces) {\n\n    return namespaces.getUsed().filter(function(ns) {\n\n      // do not serialize built in <xml> namespace\n      return ns.prefix !== 'xml';\n    }).map(function(ns) {\n      var name = 'xmlns' + (ns.prefix ? ':' + ns.prefix : '');\n      return { name: name, value: ns.uri };\n    });\n\n  }\n\n  function getElementNs(ns, descriptor) {\n    if (descriptor.isGeneric) {\n      return assign$1({ localName: descriptor.ns.localName }, ns);\n    } else {\n      return assign$1({ localName: nameToAlias(descriptor.ns.localName, descriptor.$pkg) }, ns);\n    }\n  }\n\n  function getPropertyNs(ns, descriptor) {\n    return assign$1({ localName: descriptor.ns.localName }, ns);\n  }\n\n  function getSerializableProperties(element) {\n    var descriptor = element.$descriptor;\n\n    return filter(descriptor.properties, function(p) {\n      var name = p.name;\n\n      if (p.isVirtual) {\n        return false;\n      }\n\n      // do not serialize defaults\n      if (!has$1(element, name)) {\n        return false;\n      }\n\n      var value = element[name];\n\n      // do not serialize default equals\n      if (value === p.default) {\n        return false;\n      }\n\n      // do not serialize null properties\n      if (value === null) {\n        return false;\n      }\n\n      return p.isMany ? value.length : true;\n    });\n  }\n\n  var ESCAPE_ATTR_MAP = {\n    '\\n': '#10',\n    '\\n\\r': '#10',\n    '\"': '#34',\n    '\\'': '#39',\n    '<': '#60',\n    '>': '#62',\n    '&': '#38'\n  };\n\n  var ESCAPE_MAP = {\n    '<': 'lt',\n    '>': 'gt',\n    '&': 'amp'\n  };\n\n  function escape(str, charPattern, replaceMap) {\n\n    // ensure we are handling strings here\n    str = isString(str) ? str : '' + str;\n\n    return str.replace(charPattern, function(s) {\n      return '&' + replaceMap[s] + ';';\n    });\n  }\n\n  /**\n   * Escape a string attribute to not contain any bad values (line breaks, '\"', ...)\n   *\n   * @param {String} str the string to escape\n   * @return {String} the escaped string\n   */\n  function escapeAttr(str) {\n    return escape(str, ESCAPE_ATTR_CHARS, ESCAPE_ATTR_MAP);\n  }\n\n  function escapeBody(str) {\n    return escape(str, ESCAPE_CHARS, ESCAPE_MAP);\n  }\n\n  function filterAttributes(props) {\n    return filter(props, function(p) { return p.isAttr; });\n  }\n\n  function filterContained(props) {\n    return filter(props, function(p) { return !p.isAttr; });\n  }\n\n\n  function ReferenceSerializer(tagName) {\n    this.tagName = tagName;\n  }\n\n  ReferenceSerializer.prototype.build = function(element) {\n    this.element = element;\n    return this;\n  };\n\n  ReferenceSerializer.prototype.serializeTo = function(writer) {\n    writer\n      .appendIndent()\n      .append('<' + this.tagName + '>' + this.element.id + '</' + this.tagName + '>')\n      .appendNewLine();\n  };\n\n  function BodySerializer() {}\n\n  BodySerializer.prototype.serializeValue =\n  BodySerializer.prototype.serializeTo = function(writer) {\n    writer.append(\n      this.escape\n        ? escapeBody(this.value)\n        : this.value\n    );\n  };\n\n  BodySerializer.prototype.build = function(prop, value) {\n    this.value = value;\n\n    if (prop.type === 'String' && value.search(ESCAPE_CHARS) !== -1) {\n      this.escape = true;\n    }\n\n    return this;\n  };\n\n  function ValueSerializer(tagName) {\n    this.tagName = tagName;\n  }\n\n  inherits(ValueSerializer, BodySerializer);\n\n  ValueSerializer.prototype.serializeTo = function(writer) {\n\n    writer\n      .appendIndent()\n      .append('<' + this.tagName + '>');\n\n    this.serializeValue(writer);\n\n    writer\n      .append('</' + this.tagName + '>')\n      .appendNewLine();\n  };\n\n  function ElementSerializer(parent, propertyDescriptor) {\n    this.body = [];\n    this.attrs = [];\n\n    this.parent = parent;\n    this.propertyDescriptor = propertyDescriptor;\n  }\n\n  ElementSerializer.prototype.build = function(element) {\n    this.element = element;\n\n    var elementDescriptor = element.$descriptor,\n        propertyDescriptor = this.propertyDescriptor;\n\n    var otherAttrs,\n        properties;\n\n    var isGeneric = elementDescriptor.isGeneric;\n\n    if (isGeneric) {\n      otherAttrs = this.parseGeneric(element);\n    } else {\n      otherAttrs = this.parseNsAttributes(element);\n    }\n\n    if (propertyDescriptor) {\n      this.ns = this.nsPropertyTagName(propertyDescriptor);\n    } else {\n      this.ns = this.nsTagName(elementDescriptor);\n    }\n\n    // compute tag name\n    this.tagName = this.addTagName(this.ns);\n\n    if (!isGeneric) {\n      properties = getSerializableProperties(element);\n\n      this.parseAttributes(filterAttributes(properties));\n      this.parseContainments(filterContained(properties));\n    }\n\n    this.parseGenericAttributes(element, otherAttrs);\n\n    return this;\n  };\n\n  ElementSerializer.prototype.nsTagName = function(descriptor) {\n    var effectiveNs = this.logNamespaceUsed(descriptor.ns);\n    return getElementNs(effectiveNs, descriptor);\n  };\n\n  ElementSerializer.prototype.nsPropertyTagName = function(descriptor) {\n    var effectiveNs = this.logNamespaceUsed(descriptor.ns);\n    return getPropertyNs(effectiveNs, descriptor);\n  };\n\n  ElementSerializer.prototype.isLocalNs = function(ns) {\n    return ns.uri === this.ns.uri;\n  };\n\n  /**\n   * Get the actual ns attribute name for the given element.\n   *\n   * @param {Object} element\n   * @param {Boolean} [element.inherited=false]\n   *\n   * @return {Object} nsName\n   */\n  ElementSerializer.prototype.nsAttributeName = function(element) {\n\n    var ns;\n\n    if (isString(element)) {\n      ns = parseName(element);\n    } else {\n      ns = element.ns;\n    }\n\n    // return just local name for inherited attributes\n    if (element.inherited) {\n      return { localName: ns.localName };\n    }\n\n    // parse + log effective ns\n    var effectiveNs = this.logNamespaceUsed(ns);\n\n    // LOG ACTUAL namespace use\n    this.getNamespaces().logUsed(effectiveNs);\n\n    // strip prefix if same namespace like parent\n    if (this.isLocalNs(effectiveNs)) {\n      return { localName: ns.localName };\n    } else {\n      return assign$1({ localName: ns.localName }, effectiveNs);\n    }\n  };\n\n  ElementSerializer.prototype.parseGeneric = function(element) {\n\n    var self = this,\n        body = this.body;\n\n    var attributes = [];\n\n    forEach$1(element, function(val, key) {\n\n      var nonNsAttr;\n\n      if (key === '$body') {\n        body.push(new BodySerializer().build({ type: 'String' }, val));\n      } else\n      if (key === '$children') {\n        forEach$1(val, function(child) {\n          body.push(new ElementSerializer(self).build(child));\n        });\n      } else\n      if (key.indexOf('$') !== 0) {\n        nonNsAttr = self.parseNsAttribute(element, key, val);\n\n        if (nonNsAttr) {\n          attributes.push({ name: key, value: val });\n        }\n      }\n    });\n\n    return attributes;\n  };\n\n  ElementSerializer.prototype.parseNsAttribute = function(element, name, value) {\n    var model = element.$model;\n\n    var nameNs = parseName(name);\n\n    var ns;\n\n    // parse xmlns:foo=\"http://foo.bar\"\n    if (nameNs.prefix === 'xmlns') {\n      ns = { prefix: nameNs.localName, uri: value };\n    }\n\n    // parse xmlns=\"http://foo.bar\"\n    if (!nameNs.prefix && nameNs.localName === 'xmlns') {\n      ns = { uri: value };\n    }\n\n    if (!ns) {\n      return {\n        name: name,\n        value: value\n      };\n    }\n\n    if (model && model.getPackage(value)) {\n\n      // register well known namespace\n      this.logNamespace(ns, true, true);\n    } else {\n\n      // log custom namespace directly as used\n      var actualNs = this.logNamespaceUsed(ns, true);\n\n      this.getNamespaces().logUsed(actualNs);\n    }\n  };\n\n\n  /**\n   * Parse namespaces and return a list of left over generic attributes\n   *\n   * @param  {Object} element\n   * @return {Array<Object>}\n   */\n  ElementSerializer.prototype.parseNsAttributes = function(element, attrs) {\n    var self = this;\n\n    var genericAttrs = element.$attrs;\n\n    var attributes = [];\n\n    // parse namespace attributes first\n    // and log them. push non namespace attributes to a list\n    // and process them later\n    forEach$1(genericAttrs, function(value, name) {\n\n      var nonNsAttr = self.parseNsAttribute(element, name, value);\n\n      if (nonNsAttr) {\n        attributes.push(nonNsAttr);\n      }\n    });\n\n    return attributes;\n  };\n\n  ElementSerializer.prototype.parseGenericAttributes = function(element, attributes) {\n\n    var self = this;\n\n    forEach$1(attributes, function(attr) {\n\n      // do not serialize xsi:type attribute\n      // it is set manually based on the actual implementation type\n      if (attr.name === XSI_TYPE) {\n        return;\n      }\n\n      try {\n        self.addAttribute(self.nsAttributeName(attr.name), attr.value);\n      } catch (e) {\n        /* global console */\n\n        console.warn(\n          'missing namespace information for ',\n          attr.name, '=', attr.value, 'on', element,\n          e);\n      }\n    });\n  };\n\n  ElementSerializer.prototype.parseContainments = function(properties) {\n\n    var self = this,\n        body = this.body,\n        element = this.element;\n\n    forEach$1(properties, function(p) {\n      var value = element.get(p.name),\n          isReference = p.isReference,\n          isMany = p.isMany;\n\n      if (!isMany) {\n        value = [ value ];\n      }\n\n      if (p.isBody) {\n        body.push(new BodySerializer().build(p, value[0]));\n      } else\n      if (isSimple(p.type)) {\n        forEach$1(value, function(v) {\n          body.push(new ValueSerializer(self.addTagName(self.nsPropertyTagName(p))).build(p, v));\n        });\n      } else\n      if (isReference) {\n        forEach$1(value, function(v) {\n          body.push(new ReferenceSerializer(self.addTagName(self.nsPropertyTagName(p))).build(v));\n        });\n      } else {\n\n        // allow serialization via type\n        // rather than element name\n        var asType = serializeAsType(p),\n            asProperty = serializeAsProperty(p);\n\n        forEach$1(value, function(v) {\n          var serializer;\n\n          if (asType) {\n            serializer = new TypeSerializer(self, p);\n          } else\n          if (asProperty) {\n            serializer = new ElementSerializer(self, p);\n          } else {\n            serializer = new ElementSerializer(self);\n          }\n\n          body.push(serializer.build(v));\n        });\n      }\n    });\n  };\n\n  ElementSerializer.prototype.getNamespaces = function(local) {\n\n    var namespaces = this.namespaces,\n        parent = this.parent,\n        parentNamespaces;\n\n    if (!namespaces) {\n      parentNamespaces = parent && parent.getNamespaces();\n\n      if (local || !parentNamespaces) {\n        this.namespaces = namespaces = new Namespaces(parentNamespaces);\n      } else {\n        namespaces = parentNamespaces;\n      }\n    }\n\n    return namespaces;\n  };\n\n  ElementSerializer.prototype.logNamespace = function(ns, wellknown, local) {\n    var namespaces = this.getNamespaces(local);\n\n    var nsUri = ns.uri,\n        nsPrefix = ns.prefix;\n\n    var existing = namespaces.byUri(nsUri);\n\n    if (!existing || local) {\n      namespaces.add(ns, wellknown);\n    }\n\n    namespaces.mapPrefix(nsPrefix, nsUri);\n\n    return ns;\n  };\n\n  ElementSerializer.prototype.logNamespaceUsed = function(ns, local) {\n    var element = this.element,\n        model = element.$model,\n        namespaces = this.getNamespaces(local);\n\n    // ns may be\n    //\n    //   * prefix only\n    //   * prefix:uri\n    //   * localName only\n\n    var prefix = ns.prefix,\n        uri = ns.uri,\n        newPrefix, idx,\n        wellknownUri;\n\n    // handle anonymous namespaces (elementForm=unqualified), cf. #23\n    if (!prefix && !uri) {\n      return { localName: ns.localName };\n    }\n\n    wellknownUri = DEFAULT_NS_MAP[prefix] || model && (model.getPackage(prefix) || {}).uri;\n\n    uri = uri || wellknownUri || namespaces.uriByPrefix(prefix);\n\n    if (!uri) {\n      throw new Error('no namespace uri given for prefix <' + prefix + '>');\n    }\n\n    ns = namespaces.byUri(uri);\n\n    if (!ns) {\n      newPrefix = prefix;\n      idx = 1;\n\n      // find a prefix that is not mapped yet\n      while (namespaces.uriByPrefix(newPrefix)) {\n        newPrefix = prefix + '_' + idx++;\n      }\n\n      ns = this.logNamespace({ prefix: newPrefix, uri: uri }, wellknownUri === uri);\n    }\n\n    if (prefix) {\n      namespaces.mapPrefix(prefix, uri);\n    }\n\n    return ns;\n  };\n\n  ElementSerializer.prototype.parseAttributes = function(properties) {\n    var self = this,\n        element = this.element;\n\n    forEach$1(properties, function(p) {\n\n      var value = element.get(p.name);\n\n      if (p.isReference) {\n\n        if (!p.isMany) {\n          value = value.id;\n        }\n        else {\n          var values = [];\n          forEach$1(value, function(v) {\n            values.push(v.id);\n          });\n\n          // IDREFS is a whitespace-separated list of references.\n          value = values.join(' ');\n        }\n\n      }\n\n      self.addAttribute(self.nsAttributeName(p), value);\n    });\n  };\n\n  ElementSerializer.prototype.addTagName = function(nsTagName) {\n    var actualNs = this.logNamespaceUsed(nsTagName);\n\n    this.getNamespaces().logUsed(actualNs);\n\n    return nsName(nsTagName);\n  };\n\n  ElementSerializer.prototype.addAttribute = function(name, value) {\n    var attrs = this.attrs;\n\n    if (isString(value)) {\n      value = escapeAttr(value);\n    }\n\n    // de-duplicate attributes\n    // https://github.com/bpmn-io/moddle-xml/issues/66\n    var idx = findIndex(attrs, function(element) {\n      return (\n        element.name.localName === name.localName &&\n        element.name.uri === name.uri &&\n        element.name.prefix === name.prefix\n      );\n    });\n\n    var attr = { name: name, value: value };\n\n    if (idx !== -1) {\n      attrs.splice(idx, 1, attr);\n    } else {\n      attrs.push(attr);\n    }\n  };\n\n  ElementSerializer.prototype.serializeAttributes = function(writer) {\n    var attrs = this.attrs,\n        namespaces = this.namespaces;\n\n    if (namespaces) {\n      attrs = getNsAttrs(namespaces).concat(attrs);\n    }\n\n    forEach$1(attrs, function(a) {\n      writer\n        .append(' ')\n        .append(nsName(a.name)).append('=\"').append(a.value).append('\"');\n    });\n  };\n\n  ElementSerializer.prototype.serializeTo = function(writer) {\n    var firstBody = this.body[0],\n        indent = firstBody && firstBody.constructor !== BodySerializer;\n\n    writer\n      .appendIndent()\n      .append('<' + this.tagName);\n\n    this.serializeAttributes(writer);\n\n    writer.append(firstBody ? '>' : ' />');\n\n    if (firstBody) {\n\n      if (indent) {\n        writer\n          .appendNewLine()\n          .indent();\n      }\n\n      forEach$1(this.body, function(b) {\n        b.serializeTo(writer);\n      });\n\n      if (indent) {\n        writer\n          .unindent()\n          .appendIndent();\n      }\n\n      writer.append('</' + this.tagName + '>');\n    }\n\n    writer.appendNewLine();\n  };\n\n  /**\n   * A serializer for types that handles serialization of data types\n   */\n  function TypeSerializer(parent, propertyDescriptor) {\n    ElementSerializer.call(this, parent, propertyDescriptor);\n  }\n\n  inherits(TypeSerializer, ElementSerializer);\n\n  TypeSerializer.prototype.parseNsAttributes = function(element) {\n\n    // extracted attributes\n    var attributes = ElementSerializer.prototype.parseNsAttributes.call(this, element);\n\n    var descriptor = element.$descriptor;\n\n    // only serialize xsi:type if necessary\n    if (descriptor.name === this.propertyDescriptor.type) {\n      return attributes;\n    }\n\n    var typeNs = this.typeNs = this.nsTagName(descriptor);\n    this.getNamespaces().logUsed(this.typeNs);\n\n    // add xsi:type attribute to represent the elements\n    // actual type\n\n    var pkg = element.$model.getPackage(typeNs.uri),\n        typePrefix = (pkg.xml && pkg.xml.typePrefix) || '';\n\n    this.addAttribute(\n      this.nsAttributeName(XSI_TYPE),\n      (typeNs.prefix ? typeNs.prefix + ':' : '') + typePrefix + descriptor.ns.localName\n    );\n\n    return attributes;\n  };\n\n  TypeSerializer.prototype.isLocalNs = function(ns) {\n    return ns.uri === (this.typeNs || this.ns).uri;\n  };\n\n  function SavingWriter() {\n    this.value = '';\n\n    this.write = function(str) {\n      this.value += str;\n    };\n  }\n\n  function FormatingWriter(out, format) {\n\n    var indent = [ '' ];\n\n    this.append = function(str) {\n      out.write(str);\n\n      return this;\n    };\n\n    this.appendNewLine = function() {\n      if (format) {\n        out.write('\\n');\n      }\n\n      return this;\n    };\n\n    this.appendIndent = function() {\n      if (format) {\n        out.write(indent.join('  '));\n      }\n\n      return this;\n    };\n\n    this.indent = function() {\n      indent.push('');\n      return this;\n    };\n\n    this.unindent = function() {\n      indent.pop();\n      return this;\n    };\n  }\n\n  /**\n   * A writer for meta-model backed document trees\n   *\n   * @param {Object} options output options to pass into the writer\n   */\n  function Writer(options) {\n\n    options = assign$1({ format: false, preamble: true }, options || {});\n\n    function toXML(tree, writer) {\n      var internalWriter = writer || new SavingWriter();\n      var formatingWriter = new FormatingWriter(internalWriter, options.format);\n\n      if (options.preamble) {\n        formatingWriter.append(XML_PREAMBLE);\n      }\n\n      new ElementSerializer().build(tree).serializeTo(formatingWriter);\n\n      if (!writer) {\n        return internalWriter.value;\n      }\n    }\n\n    return {\n      toXML: toXML\n    };\n  }\n\n  /**\n   * A sub class of {@link Moddle} with support for import and export of BPMN 2.0 xml files.\n   *\n   * @class BpmnModdle\n   * @extends Moddle\n   *\n   * @param {Object|Array} packages to use for instantiating the model\n   * @param {Object} [options] additional options to pass over\n   */\n  function BpmnModdle(packages, options) {\n    Moddle.call(this, packages, options);\n  }\n\n  BpmnModdle.prototype = Object.create(Moddle.prototype);\n\n  /**\n   * The fromXML result.\n   *\n   * @typedef {Object} ParseResult\n   *\n   * @property {ModdleElement} rootElement\n   * @property {Array<Object>} references\n   * @property {Array<Error>} warnings\n   * @property {Object} elementsById - a mapping containing each ID -> ModdleElement\n   */\n\n  /**\n   * The fromXML error.\n   *\n   * @typedef {Error} ParseError\n   *\n   * @property {Array<Error>} warnings\n   */\n\n  /**\n   * Instantiates a BPMN model tree from a given xml string.\n   *\n   * @param {String}   xmlStr\n   * @param {String}   [typeName='bpmn:Definitions'] name of the root element\n   * @param {Object}   [options]  options to pass to the underlying reader\n   *\n   * @returns {Promise<ParseResult, ParseError>}\n   */\n  BpmnModdle.prototype.fromXML = function(xmlStr, typeName, options) {\n\n    if (!isString(typeName)) {\n      options = typeName;\n      typeName = 'bpmn:Definitions';\n    }\n\n    var reader = new Reader(assign$1({ model: this, lax: true }, options));\n    var rootHandler = reader.handler(typeName);\n\n    return reader.fromXML(xmlStr, rootHandler);\n  };\n\n\n  /**\n   * The toXML result.\n   *\n   * @typedef {Object} SerializationResult\n   *\n   * @property {String} xml\n   */\n\n  /**\n   * Serializes a BPMN 2.0 object tree to XML.\n   *\n   * @param {String}   element    the root element, typically an instance of `bpmn:Definitions`\n   * @param {Object}   [options]  to pass to the underlying writer\n   *\n   * @returns {Promise<SerializationResult, Error>}\n   */\n  BpmnModdle.prototype.toXML = function(element, options) {\n\n    var writer = new Writer(options);\n\n    return new Promise(function(resolve, reject) {\n      try {\n        var result = writer.toXML(element);\n\n        return resolve({\n          xml: result\n        });\n      } catch (err) {\n        return reject(err);\n      }\n    });\n  };\n\n  var name$5 = \"BPMN20\";\n  var uri$5 = \"http://www.omg.org/spec/BPMN/20100524/MODEL\";\n  var prefix$5 = \"bpmn\";\n  var associations$5 = [\n  ];\n  var types$5 = [\n  \t{\n  \t\tname: \"Interface\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"operations\",\n  \t\t\t\ttype: \"Operation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"implementationRef\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Operation\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inMessageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outMessageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"errorRef\",\n  \t\t\t\ttype: \"Error\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"implementationRef\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"EndPoint\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Auditing\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalTask\",\n  \t\tsuperClass: [\n  \t\t\t\"CallableElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"resources\",\n  \t\t\t\ttype: \"ResourceRole\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Monitoring\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Performer\",\n  \t\tsuperClass: [\n  \t\t\t\"ResourceRole\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Process\",\n  \t\tsuperClass: [\n  \t\t\t\"FlowElementsContainer\",\n  \t\t\t\"CallableElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"processType\",\n  \t\t\t\ttype: \"ProcessType\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isClosed\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"auditing\",\n  \t\t\t\ttype: \"Auditing\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"monitoring\",\n  \t\t\t\ttype: \"Monitoring\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"properties\",\n  \t\t\t\ttype: \"Property\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"laneSets\",\n  \t\t\t\tisMany: true,\n  \t\t\t\treplaces: \"FlowElementsContainer#laneSets\",\n  \t\t\t\ttype: \"LaneSet\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"flowElements\",\n  \t\t\t\tisMany: true,\n  \t\t\t\treplaces: \"FlowElementsContainer#flowElements\",\n  \t\t\t\ttype: \"FlowElement\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"artifacts\",\n  \t\t\t\ttype: \"Artifact\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"resources\",\n  \t\t\t\ttype: \"ResourceRole\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"correlationSubscriptions\",\n  \t\t\t\ttype: \"CorrelationSubscription\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"supports\",\n  \t\t\t\ttype: \"Process\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"definitionalCollaborationRef\",\n  \t\t\t\ttype: \"Collaboration\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isExecutable\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"LaneSet\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"lanes\",\n  \t\t\t\ttype: \"Lane\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Lane\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"partitionElementRef\",\n  \t\t\t\ttype: \"BaseElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"partitionElement\",\n  \t\t\t\ttype: \"BaseElement\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"flowNodeRef\",\n  \t\t\t\ttype: \"FlowNode\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"childLaneSet\",\n  \t\t\t\ttype: \"LaneSet\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalManualTask\",\n  \t\tsuperClass: [\n  \t\t\t\"GlobalTask\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ManualTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"UserTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"renderings\",\n  \t\t\t\ttype: \"Rendering\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Rendering\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"HumanPerformer\",\n  \t\tsuperClass: [\n  \t\t\t\"Performer\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"PotentialOwner\",\n  \t\tsuperClass: [\n  \t\t\t\"HumanPerformer\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalUserTask\",\n  \t\tsuperClass: [\n  \t\t\t\"GlobalTask\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"renderings\",\n  \t\t\t\ttype: \"Rendering\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Gateway\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"FlowNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"gatewayDirection\",\n  \t\t\t\ttype: \"GatewayDirection\",\n  \t\t\t\t\"default\": \"Unspecified\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"EventBasedGateway\",\n  \t\tsuperClass: [\n  \t\t\t\"Gateway\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"instantiate\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"eventGatewayType\",\n  \t\t\t\ttype: \"EventBasedGatewayType\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\t\"default\": \"Exclusive\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ComplexGateway\",\n  \t\tsuperClass: [\n  \t\t\t\"Gateway\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"activationCondition\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"default\",\n  \t\t\t\ttype: \"SequenceFlow\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ExclusiveGateway\",\n  \t\tsuperClass: [\n  \t\t\t\"Gateway\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"default\",\n  \t\t\t\ttype: \"SequenceFlow\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"InclusiveGateway\",\n  \t\tsuperClass: [\n  \t\t\t\"Gateway\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"default\",\n  \t\t\t\ttype: \"SequenceFlow\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ParallelGateway\",\n  \t\tsuperClass: [\n  \t\t\t\"Gateway\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"RootElement\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Relationship\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"type\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"direction\",\n  \t\t\t\ttype: \"RelationshipDirection\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"source\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"Element\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"target\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"Element\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BaseElement\",\n  \t\tisAbstract: true,\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"id\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\",\n  \t\t\t\tisId: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"documentation\",\n  \t\t\t\ttype: \"Documentation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extensionDefinitions\",\n  \t\t\t\ttype: \"ExtensionDefinition\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extensionElements\",\n  \t\t\t\ttype: \"ExtensionElements\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Extension\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"mustUnderstand\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"definition\",\n  \t\t\t\ttype: \"ExtensionDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ExtensionDefinition\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extensionAttributeDefinitions\",\n  \t\t\t\ttype: \"ExtensionAttributeDefinition\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ExtensionAttributeDefinition\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"type\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isReference\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extensionDefinition\",\n  \t\t\t\ttype: \"ExtensionDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ExtensionElements\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"valueRef\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"Element\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"values\",\n  \t\t\t\ttype: \"Element\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extensionAttributeDefinition\",\n  \t\t\t\ttype: \"ExtensionAttributeDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Documentation\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"text\",\n  \t\t\t\ttype: \"String\",\n  \t\t\t\tisBody: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"textFormat\",\n  \t\t\t\t\"default\": \"text/plain\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Event\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"FlowNode\",\n  \t\t\t\"InteractionNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"properties\",\n  \t\t\t\ttype: \"Property\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"IntermediateCatchEvent\",\n  \t\tsuperClass: [\n  \t\t\t\"CatchEvent\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"IntermediateThrowEvent\",\n  \t\tsuperClass: [\n  \t\t\t\"ThrowEvent\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"EndEvent\",\n  \t\tsuperClass: [\n  \t\t\t\"ThrowEvent\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"StartEvent\",\n  \t\tsuperClass: [\n  \t\t\t\"CatchEvent\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"isInterrupting\",\n  \t\t\t\t\"default\": true,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ThrowEvent\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Event\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"dataInputs\",\n  \t\t\t\ttype: \"DataInput\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataInputAssociations\",\n  \t\t\t\ttype: \"DataInputAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputSet\",\n  \t\t\t\ttype: \"InputSet\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"eventDefinitions\",\n  \t\t\t\ttype: \"EventDefinition\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"eventDefinitionRef\",\n  \t\t\t\ttype: \"EventDefinition\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CatchEvent\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Event\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"parallelMultiple\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\",\n  \t\t\t\t\"default\": false\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataOutputs\",\n  \t\t\t\ttype: \"DataOutput\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataOutputAssociations\",\n  \t\t\t\ttype: \"DataOutputAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputSet\",\n  \t\t\t\ttype: \"OutputSet\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"eventDefinitions\",\n  \t\t\t\ttype: \"EventDefinition\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"eventDefinitionRef\",\n  \t\t\t\ttype: \"EventDefinition\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BoundaryEvent\",\n  \t\tsuperClass: [\n  \t\t\t\"CatchEvent\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"cancelActivity\",\n  \t\t\t\t\"default\": true,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"attachedToRef\",\n  \t\t\t\ttype: \"Activity\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"EventDefinition\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CancelEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ErrorEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"errorRef\",\n  \t\t\t\ttype: \"Error\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"TerminateEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"EscalationEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"escalationRef\",\n  \t\t\t\ttype: \"Escalation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Escalation\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"structureRef\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"escalationCode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CompensateEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"waitForCompletion\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\",\n  \t\t\t\t\"default\": true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"activityRef\",\n  \t\t\t\ttype: \"Activity\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"TimerEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"timeDate\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"timeCycle\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"timeDuration\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"LinkEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"target\",\n  \t\t\t\ttype: \"LinkEventDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"source\",\n  \t\t\t\ttype: \"LinkEventDefinition\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"MessageEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"messageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"operationRef\",\n  \t\t\t\ttype: \"Operation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ConditionalEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"condition\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"SignalEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"signalRef\",\n  \t\t\t\ttype: \"Signal\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Signal\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"structureRef\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ImplicitThrowEvent\",\n  \t\tsuperClass: [\n  \t\t\t\"ThrowEvent\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataState\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ItemAwareElement\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"itemSubjectRef\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataState\",\n  \t\t\t\ttype: \"DataState\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataAssociation\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"sourceRef\",\n  \t\t\t\ttype: \"ItemAwareElement\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetRef\",\n  \t\t\t\ttype: \"ItemAwareElement\",\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"transformation\",\n  \t\t\t\ttype: \"FormalExpression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"property\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"assignment\",\n  \t\t\t\ttype: \"Assignment\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataInput\",\n  \t\tsuperClass: [\n  \t\t\t\"ItemAwareElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isCollection\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputSetRef\",\n  \t\t\t\ttype: \"InputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputSetWithOptional\",\n  \t\t\t\ttype: \"InputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputSetWithWhileExecuting\",\n  \t\t\t\ttype: \"InputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataOutput\",\n  \t\tsuperClass: [\n  \t\t\t\"ItemAwareElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isCollection\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputSetRef\",\n  \t\t\t\ttype: \"OutputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputSetWithOptional\",\n  \t\t\t\ttype: \"OutputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputSetWithWhileExecuting\",\n  \t\t\t\ttype: \"OutputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"InputSet\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataInputRefs\",\n  \t\t\t\ttype: \"DataInput\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"optionalInputRefs\",\n  \t\t\t\ttype: \"DataInput\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"whileExecutingInputRefs\",\n  \t\t\t\ttype: \"DataInput\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputSetRefs\",\n  \t\t\t\ttype: \"OutputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"OutputSet\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"dataOutputRefs\",\n  \t\t\t\ttype: \"DataOutput\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputSetRefs\",\n  \t\t\t\ttype: \"InputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"optionalOutputRefs\",\n  \t\t\t\ttype: \"DataOutput\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"whileExecutingOutputRefs\",\n  \t\t\t\ttype: \"DataOutput\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Property\",\n  \t\tsuperClass: [\n  \t\t\t\"ItemAwareElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataInputAssociation\",\n  \t\tsuperClass: [\n  \t\t\t\"DataAssociation\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataOutputAssociation\",\n  \t\tsuperClass: [\n  \t\t\t\"DataAssociation\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"InputOutputSpecification\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"dataInputs\",\n  \t\t\t\ttype: \"DataInput\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataOutputs\",\n  \t\t\t\ttype: \"DataOutput\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputSets\",\n  \t\t\t\ttype: \"InputSet\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputSets\",\n  \t\t\t\ttype: \"OutputSet\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataObject\",\n  \t\tsuperClass: [\n  \t\t\t\"FlowElement\",\n  \t\t\t\"ItemAwareElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"isCollection\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"InputOutputBinding\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"inputDataRef\",\n  \t\t\t\ttype: \"InputSet\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputDataRef\",\n  \t\t\t\ttype: \"OutputSet\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"operationRef\",\n  \t\t\t\ttype: \"Operation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Assignment\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"from\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"to\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataStore\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\",\n  \t\t\t\"ItemAwareElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"capacity\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Integer\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isUnlimited\",\n  \t\t\t\t\"default\": true,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataStoreReference\",\n  \t\tsuperClass: [\n  \t\t\t\"ItemAwareElement\",\n  \t\t\t\"FlowElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"dataStoreRef\",\n  \t\t\t\ttype: \"DataStore\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataObjectReference\",\n  \t\tsuperClass: [\n  \t\t\t\"ItemAwareElement\",\n  \t\t\t\"FlowElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"dataObjectRef\",\n  \t\t\t\ttype: \"DataObject\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ConversationLink\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"sourceRef\",\n  \t\t\t\ttype: \"InteractionNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetRef\",\n  \t\t\t\ttype: \"InteractionNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ConversationAssociation\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"innerConversationNodeRef\",\n  \t\t\t\ttype: \"ConversationNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outerConversationNodeRef\",\n  \t\t\t\ttype: \"ConversationNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CallConversation\",\n  \t\tsuperClass: [\n  \t\t\t\"ConversationNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"calledCollaborationRef\",\n  \t\t\t\ttype: \"Collaboration\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantAssociations\",\n  \t\t\t\ttype: \"ParticipantAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Conversation\",\n  \t\tsuperClass: [\n  \t\t\t\"ConversationNode\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"SubConversation\",\n  \t\tsuperClass: [\n  \t\t\t\"ConversationNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"conversationNodes\",\n  \t\t\t\ttype: \"ConversationNode\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ConversationNode\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"InteractionNode\",\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageFlowRefs\",\n  \t\t\t\ttype: \"MessageFlow\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"correlationKeys\",\n  \t\t\t\ttype: \"CorrelationKey\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalConversation\",\n  \t\tsuperClass: [\n  \t\t\t\"Collaboration\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"PartnerEntity\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"PartnerRole\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CorrelationProperty\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"correlationPropertyRetrievalExpression\",\n  \t\t\t\ttype: \"CorrelationPropertyRetrievalExpression\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"type\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Error\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"structureRef\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"errorCode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CorrelationKey\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"correlationPropertyRef\",\n  \t\t\t\ttype: \"CorrelationProperty\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Expression\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tisAbstract: false,\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"body\",\n  \t\t\t\tisBody: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"FormalExpression\",\n  \t\tsuperClass: [\n  \t\t\t\"Expression\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"language\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"evaluatesToTypeRef\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Message\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"itemRef\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ItemDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"itemKind\",\n  \t\t\t\ttype: \"ItemKind\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"structureRef\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isCollection\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"import\",\n  \t\t\t\ttype: \"Import\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"FlowElement\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"auditing\",\n  \t\t\t\ttype: \"Auditing\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"monitoring\",\n  \t\t\t\ttype: \"Monitoring\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"categoryValueRef\",\n  \t\t\t\ttype: \"CategoryValue\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"SequenceFlow\",\n  \t\tsuperClass: [\n  \t\t\t\"FlowElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"isImmediate\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"conditionExpression\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"sourceRef\",\n  \t\t\t\ttype: \"FlowNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetRef\",\n  \t\t\t\ttype: \"FlowNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"FlowElementsContainer\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"laneSets\",\n  \t\t\t\ttype: \"LaneSet\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"flowElements\",\n  \t\t\t\ttype: \"FlowElement\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CallableElement\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"ioSpecification\",\n  \t\t\t\ttype: \"InputOutputSpecification\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"property\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"supportedInterfaceRef\",\n  \t\t\t\ttype: \"Interface\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"ioBinding\",\n  \t\t\t\ttype: \"InputOutputBinding\",\n  \t\t\t\tisMany: true,\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"property\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"FlowNode\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"FlowElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"incoming\",\n  \t\t\t\ttype: \"SequenceFlow\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outgoing\",\n  \t\t\t\ttype: \"SequenceFlow\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"lanes\",\n  \t\t\t\ttype: \"Lane\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CorrelationPropertyRetrievalExpression\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"messagePath\",\n  \t\t\t\ttype: \"FormalExpression\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CorrelationPropertyBinding\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"dataPath\",\n  \t\t\t\ttype: \"FormalExpression\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"correlationPropertyRef\",\n  \t\t\t\ttype: \"CorrelationProperty\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Resource\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"resourceParameters\",\n  \t\t\t\ttype: \"ResourceParameter\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ResourceParameter\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isRequired\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"type\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CorrelationSubscription\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"correlationKeyRef\",\n  \t\t\t\ttype: \"CorrelationKey\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"correlationPropertyBinding\",\n  \t\t\t\ttype: \"CorrelationPropertyBinding\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"MessageFlow\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"sourceRef\",\n  \t\t\t\ttype: \"InteractionNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetRef\",\n  \t\t\t\ttype: \"InteractionNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"MessageFlowAssociation\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"innerMessageFlowRef\",\n  \t\t\t\ttype: \"MessageFlow\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outerMessageFlowRef\",\n  \t\t\t\ttype: \"MessageFlow\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"InteractionNode\",\n  \t\tisAbstract: true,\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"incomingConversationLinks\",\n  \t\t\t\ttype: \"ConversationLink\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outgoingConversationLinks\",\n  \t\t\t\ttype: \"ConversationLink\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Participant\",\n  \t\tsuperClass: [\n  \t\t\t\"InteractionNode\",\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"interfaceRef\",\n  \t\t\t\ttype: \"Interface\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantMultiplicity\",\n  \t\t\t\ttype: \"ParticipantMultiplicity\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"endPointRefs\",\n  \t\t\t\ttype: \"EndPoint\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"processRef\",\n  \t\t\t\ttype: \"Process\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ParticipantAssociation\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"innerParticipantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outerParticipantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ParticipantMultiplicity\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"minimum\",\n  \t\t\t\t\"default\": 0,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Integer\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"maximum\",\n  \t\t\t\t\"default\": 1,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Integer\"\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Collaboration\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isClosed\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participants\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageFlows\",\n  \t\t\t\ttype: \"MessageFlow\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"artifacts\",\n  \t\t\t\ttype: \"Artifact\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"conversations\",\n  \t\t\t\ttype: \"ConversationNode\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"conversationAssociations\",\n  \t\t\t\ttype: \"ConversationAssociation\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantAssociations\",\n  \t\t\t\ttype: \"ParticipantAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageFlowAssociations\",\n  \t\t\t\ttype: \"MessageFlowAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"correlationKeys\",\n  \t\t\t\ttype: \"CorrelationKey\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"choreographyRef\",\n  \t\t\t\ttype: \"Choreography\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"conversationLinks\",\n  \t\t\t\ttype: \"ConversationLink\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ChoreographyActivity\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"FlowNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"participantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"initiatingParticipantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"correlationKeys\",\n  \t\t\t\ttype: \"CorrelationKey\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopType\",\n  \t\t\t\ttype: \"ChoreographyLoopType\",\n  \t\t\t\t\"default\": \"None\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CallChoreography\",\n  \t\tsuperClass: [\n  \t\t\t\"ChoreographyActivity\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"calledChoreographyRef\",\n  \t\t\t\ttype: \"Choreography\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantAssociations\",\n  \t\t\t\ttype: \"ParticipantAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"SubChoreography\",\n  \t\tsuperClass: [\n  \t\t\t\"ChoreographyActivity\",\n  \t\t\t\"FlowElementsContainer\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"artifacts\",\n  \t\t\t\ttype: \"Artifact\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ChoreographyTask\",\n  \t\tsuperClass: [\n  \t\t\t\"ChoreographyActivity\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"messageFlowRef\",\n  \t\t\t\ttype: \"MessageFlow\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Choreography\",\n  \t\tsuperClass: [\n  \t\t\t\"Collaboration\",\n  \t\t\t\"FlowElementsContainer\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalChoreographyTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Choreography\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"initiatingParticipantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"TextAnnotation\",\n  \t\tsuperClass: [\n  \t\t\t\"Artifact\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"text\",\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"textFormat\",\n  \t\t\t\t\"default\": \"text/plain\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Group\",\n  \t\tsuperClass: [\n  \t\t\t\"Artifact\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"categoryValueRef\",\n  \t\t\t\ttype: \"CategoryValue\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Association\",\n  \t\tsuperClass: [\n  \t\t\t\"Artifact\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"associationDirection\",\n  \t\t\t\ttype: \"AssociationDirection\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"sourceRef\",\n  \t\t\t\ttype: \"BaseElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetRef\",\n  \t\t\t\ttype: \"BaseElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Category\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"categoryValue\",\n  \t\t\t\ttype: \"CategoryValue\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Artifact\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CategoryValue\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"categorizedFlowElements\",\n  \t\t\t\ttype: \"FlowElement\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"value\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Activity\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"FlowNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"isForCompensation\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"default\",\n  \t\t\t\ttype: \"SequenceFlow\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"ioSpecification\",\n  \t\t\t\ttype: \"InputOutputSpecification\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"property\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"boundaryEventRefs\",\n  \t\t\t\ttype: \"BoundaryEvent\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"properties\",\n  \t\t\t\ttype: \"Property\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataInputAssociations\",\n  \t\t\t\ttype: \"DataInputAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataOutputAssociations\",\n  \t\t\t\ttype: \"DataOutputAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"startQuantity\",\n  \t\t\t\t\"default\": 1,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Integer\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"resources\",\n  \t\t\t\ttype: \"ResourceRole\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"completionQuantity\",\n  \t\t\t\t\"default\": 1,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Integer\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopCharacteristics\",\n  \t\t\t\ttype: \"LoopCharacteristics\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ServiceTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"operationRef\",\n  \t\t\t\ttype: \"Operation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"SubProcess\",\n  \t\tsuperClass: [\n  \t\t\t\"Activity\",\n  \t\t\t\"FlowElementsContainer\",\n  \t\t\t\"InteractionNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"triggeredByEvent\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"artifacts\",\n  \t\t\t\ttype: \"Artifact\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"LoopCharacteristics\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"MultiInstanceLoopCharacteristics\",\n  \t\tsuperClass: [\n  \t\t\t\"LoopCharacteristics\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"isSequential\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"behavior\",\n  \t\t\t\ttype: \"MultiInstanceBehavior\",\n  \t\t\t\t\"default\": \"All\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopCardinality\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopDataInputRef\",\n  \t\t\t\ttype: \"ItemAwareElement\",\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopDataOutputRef\",\n  \t\t\t\ttype: \"ItemAwareElement\",\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputDataItem\",\n  \t\t\t\ttype: \"DataInput\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"property\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputDataItem\",\n  \t\t\t\ttype: \"DataOutput\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"property\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"complexBehaviorDefinition\",\n  \t\t\t\ttype: \"ComplexBehaviorDefinition\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"completionCondition\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"oneBehaviorEventRef\",\n  \t\t\t\ttype: \"EventDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"noneBehaviorEventRef\",\n  \t\t\t\ttype: \"EventDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"StandardLoopCharacteristics\",\n  \t\tsuperClass: [\n  \t\t\t\"LoopCharacteristics\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"testBefore\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopCondition\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopMaximum\",\n  \t\t\t\ttype: \"Integer\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CallActivity\",\n  \t\tsuperClass: [\n  \t\t\t\"Activity\",\n  \t\t\t\"InteractionNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"calledElement\",\n  \t\t\t\ttype: \"String\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Task\",\n  \t\tsuperClass: [\n  \t\t\t\"Activity\",\n  \t\t\t\"InteractionNode\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"SendTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"operationRef\",\n  \t\t\t\ttype: \"Operation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ReceiveTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"instantiate\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"operationRef\",\n  \t\t\t\ttype: \"Operation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ScriptTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"scriptFormat\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"script\",\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BusinessRuleTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"AdHocSubProcess\",\n  \t\tsuperClass: [\n  \t\t\t\"SubProcess\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"completionCondition\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"ordering\",\n  \t\t\t\ttype: \"AdHocOrdering\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"cancelRemainingInstances\",\n  \t\t\t\t\"default\": true,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Transaction\",\n  \t\tsuperClass: [\n  \t\t\t\"SubProcess\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"protocol\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"method\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalScriptTask\",\n  \t\tsuperClass: [\n  \t\t\t\"GlobalTask\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"scriptLanguage\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"script\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalBusinessRuleTask\",\n  \t\tsuperClass: [\n  \t\t\t\"GlobalTask\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ComplexBehaviorDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"condition\",\n  \t\t\t\ttype: \"FormalExpression\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"event\",\n  \t\t\t\ttype: \"ImplicitThrowEvent\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ResourceRole\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"resourceRef\",\n  \t\t\t\ttype: \"Resource\",\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"resourceParameterBindings\",\n  \t\t\t\ttype: \"ResourceParameterBinding\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"resourceAssignmentExpression\",\n  \t\t\t\ttype: \"ResourceAssignmentExpression\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ResourceParameterBinding\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"expression\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"parameterRef\",\n  \t\t\t\ttype: \"ResourceParameter\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ResourceAssignmentExpression\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"expression\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Import\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"importType\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"location\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"namespace\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Definitions\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetNamespace\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"expressionLanguage\",\n  \t\t\t\t\"default\": \"http://www.w3.org/1999/XPath\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"typeLanguage\",\n  \t\t\t\t\"default\": \"http://www.w3.org/2001/XMLSchema\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"imports\",\n  \t\t\t\ttype: \"Import\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extensions\",\n  \t\t\t\ttype: \"Extension\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"rootElements\",\n  \t\t\t\ttype: \"RootElement\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"diagrams\",\n  \t\t\t\tisMany: true,\n  \t\t\t\ttype: \"bpmndi:BPMNDiagram\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"exporter\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"relationships\",\n  \t\t\t\ttype: \"Relationship\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"exporterVersion\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var enumerations$3 = [\n  \t{\n  \t\tname: \"ProcessType\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"None\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Public\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Private\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GatewayDirection\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"Unspecified\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Converging\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Diverging\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Mixed\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"EventBasedGatewayType\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"Parallel\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Exclusive\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"RelationshipDirection\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"None\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Forward\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Backward\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Both\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ItemKind\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"Physical\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Information\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ChoreographyLoopType\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"None\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Standard\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"MultiInstanceSequential\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"MultiInstanceParallel\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"AssociationDirection\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"None\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"One\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Both\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"MultiInstanceBehavior\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"None\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"One\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"All\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Complex\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"AdHocOrdering\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"Parallel\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Sequential\"\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var xml$1 = {\n  \ttagAlias: \"lowerCase\",\n  \ttypePrefix: \"t\"\n  };\n  var BpmnPackage = {\n  \tname: name$5,\n  \turi: uri$5,\n  \tprefix: prefix$5,\n  \tassociations: associations$5,\n  \ttypes: types$5,\n  \tenumerations: enumerations$3,\n  \txml: xml$1\n  };\n\n  var name$4 = \"BPMNDI\";\n  var uri$4 = \"http://www.omg.org/spec/BPMN/20100524/DI\";\n  var prefix$4 = \"bpmndi\";\n  var types$4 = [\n  \t{\n  \t\tname: \"BPMNDiagram\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"plane\",\n  \t\t\t\ttype: \"BPMNPlane\",\n  \t\t\t\tredefines: \"di:Diagram#rootElement\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"labelStyle\",\n  \t\t\t\ttype: \"BPMNLabelStyle\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"di:Diagram\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BPMNPlane\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"bpmnElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"bpmn:BaseElement\",\n  \t\t\t\tredefines: \"di:DiagramElement#modelElement\"\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"di:Plane\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BPMNShape\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"bpmnElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"bpmn:BaseElement\",\n  \t\t\t\tredefines: \"di:DiagramElement#modelElement\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isHorizontal\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isExpanded\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isMarkerVisible\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"label\",\n  \t\t\t\ttype: \"BPMNLabel\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isMessageVisible\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantBandKind\",\n  \t\t\t\ttype: \"ParticipantBandKind\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"choreographyActivityShape\",\n  \t\t\t\ttype: \"BPMNShape\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"di:LabeledShape\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BPMNEdge\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"label\",\n  \t\t\t\ttype: \"BPMNLabel\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"bpmnElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"bpmn:BaseElement\",\n  \t\t\t\tredefines: \"di:DiagramElement#modelElement\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"sourceElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"di:DiagramElement\",\n  \t\t\t\tredefines: \"di:Edge#source\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"di:DiagramElement\",\n  \t\t\t\tredefines: \"di:Edge#target\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageVisibleKind\",\n  \t\t\t\ttype: \"MessageVisibleKind\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\t\"default\": \"initiating\"\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"di:LabeledEdge\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BPMNLabel\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"labelStyle\",\n  \t\t\t\ttype: \"BPMNLabelStyle\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\tredefines: \"di:DiagramElement#style\"\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"di:Label\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BPMNLabelStyle\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"font\",\n  \t\t\t\ttype: \"dc:Font\"\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"di:Style\"\n  \t\t]\n  \t}\n  ];\n  var enumerations$2 = [\n  \t{\n  \t\tname: \"ParticipantBandKind\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"top_initiating\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"middle_initiating\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"bottom_initiating\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"top_non_initiating\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"middle_non_initiating\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"bottom_non_initiating\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"MessageVisibleKind\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"initiating\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"non_initiating\"\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var associations$4 = [\n  ];\n  var BpmnDiPackage = {\n  \tname: name$4,\n  \turi: uri$4,\n  \tprefix: prefix$4,\n  \ttypes: types$4,\n  \tenumerations: enumerations$2,\n  \tassociations: associations$4\n  };\n\n  var name$3 = \"DC\";\n  var uri$3 = \"http://www.omg.org/spec/DD/20100524/DC\";\n  var prefix$3 = \"dc\";\n  var types$3 = [\n  \t{\n  \t\tname: \"Boolean\"\n  \t},\n  \t{\n  \t\tname: \"Integer\"\n  \t},\n  \t{\n  \t\tname: \"Real\"\n  \t},\n  \t{\n  \t\tname: \"String\"\n  \t},\n  \t{\n  \t\tname: \"Font\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\ttype: \"String\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"size\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isBold\",\n  \t\t\t\ttype: \"Boolean\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isItalic\",\n  \t\t\t\ttype: \"Boolean\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isUnderline\",\n  \t\t\t\ttype: \"Boolean\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isStrikeThrough\",\n  \t\t\t\ttype: \"Boolean\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Point\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"x\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\t\"default\": \"0\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"y\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\t\"default\": \"0\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Bounds\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"x\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\t\"default\": \"0\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"y\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\t\"default\": \"0\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"width\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"height\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var associations$3 = [\n  ];\n  var DcPackage = {\n  \tname: name$3,\n  \turi: uri$3,\n  \tprefix: prefix$3,\n  \ttypes: types$3,\n  \tassociations: associations$3\n  };\n\n  var name$2 = \"DI\";\n  var uri$2 = \"http://www.omg.org/spec/DD/20100524/DI\";\n  var prefix$2 = \"di\";\n  var types$2 = [\n  \t{\n  \t\tname: \"DiagramElement\",\n  \t\tisAbstract: true,\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"id\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisId: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extension\",\n  \t\t\t\ttype: \"Extension\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"owningDiagram\",\n  \t\t\t\ttype: \"Diagram\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"owningElement\",\n  \t\t\t\ttype: \"DiagramElement\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"modelElement\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"Element\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"style\",\n  \t\t\t\ttype: \"Style\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"ownedElement\",\n  \t\t\t\ttype: \"DiagramElement\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Node\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"DiagramElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Edge\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"DiagramElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"source\",\n  \t\t\t\ttype: \"DiagramElement\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"target\",\n  \t\t\t\ttype: \"DiagramElement\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"waypoint\",\n  \t\t\t\tisUnique: false,\n  \t\t\t\tisMany: true,\n  \t\t\t\ttype: \"dc:Point\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Diagram\",\n  \t\tisAbstract: true,\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"id\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisId: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"rootElement\",\n  \t\t\t\ttype: \"DiagramElement\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"documentation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"resolution\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Real\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"ownedStyle\",\n  \t\t\t\ttype: \"Style\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Shape\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Node\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"bounds\",\n  \t\t\t\ttype: \"dc:Bounds\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Plane\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Node\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"planeElement\",\n  \t\t\t\ttype: \"DiagramElement\",\n  \t\t\t\tsubsettedProperty: \"DiagramElement-ownedElement\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"LabeledEdge\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Edge\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"ownedLabel\",\n  \t\t\t\ttype: \"Label\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tsubsettedProperty: \"DiagramElement-ownedElement\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"LabeledShape\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Shape\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"ownedLabel\",\n  \t\t\t\ttype: \"Label\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tsubsettedProperty: \"DiagramElement-ownedElement\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Label\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Node\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"bounds\",\n  \t\t\t\ttype: \"dc:Bounds\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Style\",\n  \t\tisAbstract: true,\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"id\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisId: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Extension\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"values\",\n  \t\t\t\tisMany: true,\n  \t\t\t\ttype: \"Element\"\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var associations$2 = [\n  ];\n  var xml = {\n  \ttagAlias: \"lowerCase\"\n  };\n  var DiPackage = {\n  \tname: name$2,\n  \turi: uri$2,\n  \tprefix: prefix$2,\n  \ttypes: types$2,\n  \tassociations: associations$2,\n  \txml: xml\n  };\n\n  var name$1 = \"bpmn.io colors for BPMN\";\n  var uri$1 = \"http://bpmn.io/schema/bpmn/biocolor/1.0\";\n  var prefix$1 = \"bioc\";\n  var types$1 = [\n  \t{\n  \t\tname: \"ColoredShape\",\n  \t\t\"extends\": [\n  \t\t\t\"bpmndi:BPMNShape\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"stroke\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"fill\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ColoredEdge\",\n  \t\t\"extends\": [\n  \t\t\t\"bpmndi:BPMNEdge\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"stroke\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"fill\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var enumerations$1 = [\n  ];\n  var associations$1 = [\n  ];\n  var BiocPackage = {\n  \tname: name$1,\n  \turi: uri$1,\n  \tprefix: prefix$1,\n  \ttypes: types$1,\n  \tenumerations: enumerations$1,\n  \tassociations: associations$1\n  };\n\n  var name = \"BPMN in Color\";\n  var uri = \"http://www.omg.org/spec/BPMN/non-normative/color/1.0\";\n  var prefix = \"color\";\n  var types = [\n  \t{\n  \t\tname: \"ColoredLabel\",\n  \t\t\"extends\": [\n  \t\t\t\"bpmndi:BPMNLabel\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"color\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ColoredShape\",\n  \t\t\"extends\": [\n  \t\t\t\"bpmndi:BPMNShape\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"background-color\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"border-color\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ColoredEdge\",\n  \t\t\"extends\": [\n  \t\t\t\"bpmndi:BPMNEdge\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"border-color\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var enumerations = [\n  ];\n  var associations = [\n  ];\n  var BpmnInColorPackage = {\n  \tname: name,\n  \turi: uri,\n  \tprefix: prefix,\n  \ttypes: types,\n  \tenumerations: enumerations,\n  \tassociations: associations\n  };\n\n  var packages = {\n    bpmn: BpmnPackage,\n    bpmndi: BpmnDiPackage,\n    dc: DcPackage,\n    di: DiPackage,\n    bioc: BiocPackage,\n    color: BpmnInColorPackage\n  };\n\n  function simple(additionalPackages, options) {\n    var pks = assign$1({}, packages, additionalPackages);\n\n    return new BpmnModdle(pks, options);\n  }\n\n  /**\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   */\n\n  // TODO(nikku): remove with future bpmn-js version\n\n  /**\n   * Wraps APIs to check:\n   *\n   * 1) If a callback is passed -> Warn users about callback deprecation.\n   * 2) If Promise class is implemented in current environment.\n   *\n   * @private\n   *\n   * @param {Function} api\n   *\n   * @return {Function}\n   */\n  function wrapForCompatibility(api) {\n\n    return function() {\n\n      if (!window.Promise) {\n        throw new Error('Promises is not supported in this environment. Please polyfill Promise.');\n      }\n\n      var argLen = arguments.length;\n      if (argLen >= 1 && isFunction(arguments[argLen - 1])) {\n\n        var callback = arguments[argLen - 1];\n\n        console.warn(new Error(\n          'Passing callbacks to ' + api.name + ' is deprecated and will be removed in a future major release. ' +\n          'Please switch to promises: https://bpmn.io/l/moving-to-promises.html'\n        ));\n\n        var argsWithoutCallback = Array.prototype.slice.call(arguments, 0, -1);\n\n        api.apply(this, argsWithoutCallback).then(function(result) {\n\n          var firstKey = Object.keys(result)[0];\n\n          // The APIs we are wrapping all resolve a single item depending on the API.\n          // For instance, importXML resolves { warnings } and saveXML returns { xml }.\n          // That's why we can call the callback with the first item of result.\n          return callback(null, result[firstKey]);\n\n          // Passing a second paramter instead of catch because we don't want to\n          // catch errors thrown by callback().\n        }, function(err) {\n\n          return callback(err, err.warnings);\n        });\n      } else {\n\n        return api.apply(this, arguments);\n      }\n    };\n  }\n\n\n  // TODO(nikku): remove with future bpmn-js version\n\n  var DI_ERROR_MESSAGE = 'Tried to access di from the businessObject. The di is available through the diagram element only. For more information, see https://github.com/bpmn-io/bpmn-js/issues/1472';\n\n  /**\n   * @private\n   *\n   * @param {ModdleElement} businessObject\n   */\n  function ensureCompatDiRef(businessObject) {\n\n    // bpmnElement can have multiple independent DIs\n    if (!has$1(businessObject, 'di')) {\n      Object.defineProperty(businessObject, 'di', {\n        enumerable: false,\n        get: function() {\n          throw new Error(DI_ERROR_MESSAGE);\n        }\n      });\n    }\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n   *\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   */\n\n  /**\n   * Returns true if an element is of the given meta-model type.\n   *\n   * @param {ModdleElement} element\n   * @param {string} type\n   *\n   * @return {boolean}\n   */\n  function is(element, type) {\n    return element.$instanceOf(type);\n  }\n\n\n  /**\n   * Find a suitable display candidate for definitions where the DI does not\n   * correctly specify one.\n   *\n   * @param {ModdleElement} definitions\n   *\n   * @return {ModdleElement}\n   */\n  function findDisplayCandidate(definitions) {\n    return find(definitions.rootElements, function(e) {\n      return is(e, 'bpmn:Process') || is(e, 'bpmn:Collaboration');\n    });\n  }\n\n  /**\n   * @param {Record<'element' | 'root' | 'error', Function>} handler\n   * @param {Translate} translate\n   */\n  function BpmnTreeWalker(handler, translate) {\n\n    // list of containers already walked\n    var handledElements = {};\n\n    // list of elements to handle deferred to ensure\n    // prerequisites are drawn\n    var deferred = [];\n\n    var diMap = {};\n\n    // Helpers //////////////////////\n\n    function contextual(fn, ctx) {\n      return function(e) {\n        fn(e, ctx);\n      };\n    }\n\n    function handled(element) {\n      handledElements[element.id] = element;\n    }\n\n    function isHandled(element) {\n      return handledElements[element.id];\n    }\n\n    function visit(element, ctx) {\n\n      var gfx = element.gfx;\n\n      // avoid multiple rendering of elements\n      if (gfx) {\n        throw new Error(\n          translate('already rendered {element}', { element: elementToString(element) })\n        );\n      }\n\n      // call handler\n      return handler.element(element, diMap[element.id], ctx);\n    }\n\n    function visitRoot(element, diagram) {\n      return handler.root(element, diMap[element.id], diagram);\n    }\n\n    function visitIfDi(element, ctx) {\n\n      try {\n        var gfx = diMap[element.id] && visit(element, ctx);\n\n        handled(element);\n\n        return gfx;\n      } catch (e) {\n        logError(e.message, { element: element, error: e });\n\n        console.error(translate('failed to import {element}', { element: elementToString(element) }));\n        console.error(e);\n      }\n    }\n\n    function logError(message, context) {\n      handler.error(message, context);\n    }\n\n    // DI handling //////////////////////\n\n    var registerDi = this.registerDi = function registerDi(di) {\n      var bpmnElement = di.bpmnElement;\n\n      if (bpmnElement) {\n        if (diMap[bpmnElement.id]) {\n          logError(\n            translate('multiple DI elements defined for {element}', {\n              element: elementToString(bpmnElement)\n            }),\n            { element: bpmnElement }\n          );\n        } else {\n          diMap[bpmnElement.id] = di;\n\n          ensureCompatDiRef(bpmnElement);\n        }\n      } else {\n        logError(\n          translate('no bpmnElement referenced in {element}', {\n            element: elementToString(di)\n          }),\n          { element: di }\n        );\n      }\n    };\n\n    function handleDiagram(diagram) {\n      handlePlane(diagram.plane);\n    }\n\n    function handlePlane(plane) {\n      registerDi(plane);\n\n      forEach$1(plane.planeElement, handlePlaneElement);\n    }\n\n    function handlePlaneElement(planeElement) {\n      registerDi(planeElement);\n    }\n\n\n    // Semantic handling //////////////////////\n\n    /**\n     * Handle definitions and return the rendered diagram (if any).\n     *\n     * @param {ModdleElement} definitions to walk and import\n     * @param {ModdleElement} [diagram] specific diagram to import and display\n     *\n     * @throws {Error} if no diagram to display could be found\n     */\n    this.handleDefinitions = function handleDefinitions(definitions, diagram) {\n\n      // make sure we walk the correct bpmnElement\n\n      var diagrams = definitions.diagrams;\n\n      if (diagram && diagrams.indexOf(diagram) === -1) {\n        throw new Error(translate('diagram not part of bpmn:Definitions'));\n      }\n\n      if (!diagram && diagrams && diagrams.length) {\n        diagram = diagrams[0];\n      }\n\n      // no diagram -> nothing to import\n      if (!diagram) {\n        throw new Error(translate('no diagram to display'));\n      }\n\n      // load DI from selected diagram only\n      diMap = {};\n      handleDiagram(diagram);\n\n\n      var plane = diagram.plane;\n\n      if (!plane) {\n        throw new Error(translate(\n          'no plane for {element}',\n          { element: elementToString(diagram) }\n        ));\n      }\n\n      var rootElement = plane.bpmnElement;\n\n      // ensure we default to a suitable display candidate (process or collaboration),\n      // even if non is specified in DI\n      if (!rootElement) {\n        rootElement = findDisplayCandidate(definitions);\n\n        if (!rootElement) {\n          throw new Error(translate('no process or collaboration to display'));\n        } else {\n\n          logError(\n            translate('correcting missing bpmnElement on {plane} to {rootElement}', {\n              plane: elementToString(plane),\n              rootElement: elementToString(rootElement)\n            })\n          );\n\n          // correct DI on the fly\n          plane.bpmnElement = rootElement;\n          registerDi(plane);\n        }\n      }\n\n\n      var ctx = visitRoot(rootElement, plane);\n\n      if (is(rootElement, 'bpmn:Process') || is(rootElement, 'bpmn:SubProcess')) {\n        handleProcess(rootElement, ctx);\n      } else if (is(rootElement, 'bpmn:Collaboration')) {\n        handleCollaboration(rootElement, ctx);\n\n        // force drawing of everything not yet drawn that is part of the target DI\n        handleUnhandledProcesses(definitions.rootElements, ctx);\n      } else {\n        throw new Error(\n          translate('unsupported bpmnElement for {plane}: {rootElement}', {\n            plane: elementToString(plane),\n            rootElement: elementToString(rootElement)\n          })\n        );\n      }\n\n      // handle all deferred elements\n      handleDeferred(deferred);\n    };\n\n    var handleDeferred = this.handleDeferred = function handleDeferred() {\n\n      var fn;\n\n      // drain deferred until empty\n      while (deferred.length) {\n        fn = deferred.shift();\n\n        fn();\n      }\n    };\n\n    function handleProcess(process, context) {\n      handleFlowElementsContainer(process, context);\n      handleIoSpecification(process.ioSpecification, context);\n\n      handleArtifacts(process.artifacts, context);\n\n      // log process handled\n      handled(process);\n    }\n\n    function handleUnhandledProcesses(rootElements, ctx) {\n\n      // walk through all processes that have not yet been drawn and draw them\n      // if they contain lanes with DI information.\n      // we do this to pass the free-floating lane test cases in the MIWG test suite\n      var processes = filter(rootElements, function(e) {\n        return !isHandled(e) && is(e, 'bpmn:Process') && e.laneSets;\n      });\n\n      processes.forEach(contextual(handleProcess, ctx));\n    }\n\n    function handleMessageFlow(messageFlow, context) {\n      visitIfDi(messageFlow, context);\n    }\n\n    function handleMessageFlows(messageFlows, context) {\n      forEach$1(messageFlows, contextual(handleMessageFlow, context));\n    }\n\n    function handleDataAssociation(association, context) {\n      visitIfDi(association, context);\n    }\n\n    function handleDataInput(dataInput, context) {\n      visitIfDi(dataInput, context);\n    }\n\n    function handleDataOutput(dataOutput, context) {\n      visitIfDi(dataOutput, context);\n    }\n\n    function handleArtifact(artifact, context) {\n\n      // bpmn:TextAnnotation\n      // bpmn:Group\n      // bpmn:Association\n\n      visitIfDi(artifact, context);\n    }\n\n    function handleArtifacts(artifacts, context) {\n\n      forEach$1(artifacts, function(e) {\n        if (is(e, 'bpmn:Association')) {\n          deferred.push(function() {\n            handleArtifact(e, context);\n          });\n        } else {\n          handleArtifact(e, context);\n        }\n      });\n    }\n\n    function handleIoSpecification(ioSpecification, context) {\n\n      if (!ioSpecification) {\n        return;\n      }\n\n      forEach$1(ioSpecification.dataInputs, contextual(handleDataInput, context));\n      forEach$1(ioSpecification.dataOutputs, contextual(handleDataOutput, context));\n    }\n\n    var handleSubProcess = this.handleSubProcess = function handleSubProcess(subProcess, context) {\n      handleFlowElementsContainer(subProcess, context);\n      handleArtifacts(subProcess.artifacts, context);\n    };\n\n    function handleFlowNode(flowNode, context) {\n      var childCtx = visitIfDi(flowNode, context);\n\n      if (is(flowNode, 'bpmn:SubProcess')) {\n        handleSubProcess(flowNode, childCtx || context);\n      }\n\n      if (is(flowNode, 'bpmn:Activity')) {\n        handleIoSpecification(flowNode.ioSpecification, context);\n      }\n\n      // defer handling of associations\n      // affected types:\n      //\n      //   * bpmn:Activity\n      //   * bpmn:ThrowEvent\n      //   * bpmn:CatchEvent\n      //\n      deferred.push(function() {\n        forEach$1(flowNode.dataInputAssociations, contextual(handleDataAssociation, context));\n        forEach$1(flowNode.dataOutputAssociations, contextual(handleDataAssociation, context));\n      });\n    }\n\n    function handleSequenceFlow(sequenceFlow, context) {\n      visitIfDi(sequenceFlow, context);\n    }\n\n    function handleDataElement(dataObject, context) {\n      visitIfDi(dataObject, context);\n    }\n\n    function handleLane(lane, context) {\n\n      deferred.push(function() {\n\n        var newContext = visitIfDi(lane, context);\n\n        if (lane.childLaneSet) {\n          handleLaneSet(lane.childLaneSet, newContext || context);\n        }\n\n        wireFlowNodeRefs(lane);\n      });\n    }\n\n    function handleLaneSet(laneSet, context) {\n      forEach$1(laneSet.lanes, contextual(handleLane, context));\n    }\n\n    function handleLaneSets(laneSets, context) {\n      forEach$1(laneSets, contextual(handleLaneSet, context));\n    }\n\n    function handleFlowElementsContainer(container, context) {\n      handleFlowElements(container.flowElements, context);\n\n      if (container.laneSets) {\n        handleLaneSets(container.laneSets, context);\n      }\n    }\n\n    function handleFlowElements(flowElements, context) {\n      forEach$1(flowElements, function(e) {\n        if (is(e, 'bpmn:SequenceFlow')) {\n          deferred.push(function() {\n            handleSequenceFlow(e, context);\n          });\n        } else if (is(e, 'bpmn:BoundaryEvent')) {\n          deferred.unshift(function() {\n            handleFlowNode(e, context);\n          });\n        } else if (is(e, 'bpmn:FlowNode')) {\n          handleFlowNode(e, context);\n        } else if (is(e, 'bpmn:DataObject')) ; else if (is(e, 'bpmn:DataStoreReference')) {\n          handleDataElement(e, context);\n        } else if (is(e, 'bpmn:DataObjectReference')) {\n          handleDataElement(e, context);\n        } else {\n          logError(\n            translate('unrecognized flowElement {element} in context {context}', {\n              element: elementToString(e),\n              context: (context ? elementToString(context.businessObject) : 'null')\n            }),\n            { element: e, context: context }\n          );\n        }\n      });\n    }\n\n    function handleParticipant(participant, context) {\n      var newCtx = visitIfDi(participant, context);\n\n      var process = participant.processRef;\n      if (process) {\n        handleProcess(process, newCtx || context);\n      }\n    }\n\n    function handleCollaboration(collaboration, context) {\n\n      forEach$1(collaboration.participants, contextual(handleParticipant, context));\n\n      handleArtifacts(collaboration.artifacts, context);\n\n      // handle message flows latest in the process\n      deferred.push(function() {\n        handleMessageFlows(collaboration.messageFlows, context);\n      });\n    }\n\n\n    function wireFlowNodeRefs(lane) {\n\n      // wire the virtual flowNodeRefs <-> relationship\n      forEach$1(lane.flowNodeRef, function(flowNode) {\n        var lanes = flowNode.get('lanes');\n\n        if (lanes) {\n          lanes.push(lane);\n        }\n      });\n    }\n  }\n\n  /**\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   *\n   * @typedef { {\n   *   warnings: string[];\n   * } } ImportBPMNDiagramResult\n   *\n   * @typedef {ImportBPMNDiagramResult & Error} ImportBPMNDiagramError\n   */\n\n  /**\n   * Import the definitions into a diagram.\n   *\n   * Errors and warnings are reported through the specified callback.\n   *\n   * @param {ModdleElement} diagram\n   * @param {ModdleElement} definitions\n   * @param {ModdleElement} [bpmnDiagram] The diagram to be rendered (if not\n   * provided, the first one will be rendered).\n   *\n   * @return {Promise<ImportBPMNDiagramResult>}\n   */\n  function importBpmnDiagram(diagram, definitions, bpmnDiagram) {\n\n    var importer,\n        eventBus,\n        translate,\n        canvas;\n\n    var error,\n        warnings = [];\n\n    /**\n     * Walk the diagram semantically, importing (=drawing)\n     * all elements you encounter.\n     *\n     * @param {ModdleElement} definitions\n     * @param {ModdleElement} bpmnDiagram\n     */\n    function render(definitions, bpmnDiagram) {\n\n      var visitor = {\n\n        root: function(element, di) {\n          return importer.add(element, di);\n        },\n\n        element: function(element, di, parentShape) {\n          return importer.add(element, di, parentShape);\n        },\n\n        error: function(message, context) {\n          warnings.push({ message: message, context: context });\n        }\n      };\n\n      var walker = new BpmnTreeWalker(visitor, translate);\n\n\n      bpmnDiagram = bpmnDiagram || (definitions.diagrams && definitions.diagrams[0]);\n\n      var diagramsToImport = getDiagramsToImport(definitions, bpmnDiagram);\n\n      if (!diagramsToImport) {\n        throw new Error(translate('no diagram to display'));\n      }\n\n      // traverse BPMN 2.0 document model,\n      // starting at definitions\n      forEach$1(diagramsToImport, function(diagram) {\n        walker.handleDefinitions(definitions, diagram);\n      });\n\n      var rootId = bpmnDiagram.plane.bpmnElement.id;\n\n      // we do need to account for different ways we create root elements\n      // each nested imported <root> do have the `_plane` suffix, while\n      // the root <root> is found under the business object ID\n      canvas.setRootElement(\n        canvas.findRoot(rootId + '_plane') || canvas.findRoot(rootId)\n      );\n    }\n\n    return new Promise(function(resolve, reject) {\n      try {\n        importer = diagram.get('bpmnImporter');\n        eventBus = diagram.get('eventBus');\n        translate = diagram.get('translate');\n        canvas = diagram.get('canvas');\n\n        eventBus.fire('import.render.start', { definitions: definitions });\n\n        render(definitions, bpmnDiagram);\n\n        eventBus.fire('import.render.complete', {\n          error: error,\n          warnings: warnings\n        });\n\n        return resolve({ warnings: warnings });\n      } catch (e) {\n\n        e.warnings = warnings;\n        return reject(e);\n      }\n    });\n  }\n\n  /**\n   * Returns all diagrams in the same hierarchy as the requested diagram.\n   * Includes all parent and sub process diagrams.\n   *\n   * @param {ModdleElement} definitions\n   * @param {ModdleElement} bpmnDiagram\n   *\n   * @return {ModdleElement[]}\n   */\n  function getDiagramsToImport(definitions, bpmnDiagram) {\n    if (!bpmnDiagram) {\n      return;\n    }\n\n    var bpmnElement = bpmnDiagram.plane.bpmnElement,\n        rootElement = bpmnElement;\n\n    if (!is$1(bpmnElement, 'bpmn:Process') && !is$1(bpmnElement, 'bpmn:Collaboration')) {\n      rootElement = findRootProcess(bpmnElement);\n    }\n\n    // in case the process is part of a collaboration, the plane references the\n    // collaboration, not the process\n    var collaboration;\n\n    if (is$1(rootElement, 'bpmn:Collaboration')) {\n      collaboration = rootElement;\n    } else {\n      collaboration = find(definitions.rootElements, function(element) {\n        if (!is$1(element, 'bpmn:Collaboration')) {\n          return;\n        }\n\n        return find(element.participants, function(participant) {\n          return participant.processRef === rootElement;\n        });\n      });\n    }\n\n    var rootElements = [ rootElement ];\n\n    // all collaboration processes can contain sub-diagrams\n    if (collaboration) {\n      rootElements = map$1(collaboration.participants, function(participant) {\n        return participant.processRef;\n      });\n\n      rootElements.push(collaboration);\n    }\n\n    var allChildren = selfAndAllFlowElements(rootElements);\n\n    // if we have multiple diagrams referencing the same element, we\n    // use the first in the file\n    var diagramsToImport = [ bpmnDiagram ];\n    var handledElements = [ bpmnElement ];\n\n    forEach$1(definitions.diagrams, function(diagram) {\n      var businessObject = diagram.plane.bpmnElement;\n\n      if (\n        allChildren.indexOf(businessObject) !== -1 &&\n        handledElements.indexOf(businessObject) === -1\n      ) {\n        diagramsToImport.push(diagram);\n        handledElements.push(businessObject);\n      }\n    });\n\n\n    return diagramsToImport;\n  }\n\n  function selfAndAllFlowElements(elements) {\n    var result = [];\n\n    forEach$1(elements, function(element) {\n      if (!element) {\n        return;\n      }\n\n      result.push(element);\n\n      result = result.concat(selfAndAllFlowElements(element.flowElements));\n    });\n\n    return result;\n  }\n\n  function findRootProcess(element) {\n    var parent = element;\n\n    while (parent) {\n      if (is$1(parent, 'bpmn:Process')) {\n        return parent;\n      }\n\n      parent = parent.$parent;\n    }\n  }\n\n  /**\n   * This file must not be changed or exchanged.\n   *\n   * @see http://bpmn.io/license for more information.\n   */\n\n\n  // inlined ../../resources/logo.svg\n  var BPMNIO_LOGO_SVG = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 14.02 5.57\" width=\"53\" height=\"21\"><path fill=\"currentColor\" d=\"M1.88.92v.14c0 .41-.13.68-.4.8.33.14.46.44.46.86v.33c0 .61-.33.95-.95.95H0V0h.95c.65 0 .93.3.93.92zM.63.57v1.06h.24c.24 0 .38-.1.38-.43V.98c0-.28-.1-.4-.32-.4zm0 1.63v1.22h.36c.2 0 .32-.1.32-.39v-.35c0-.37-.12-.48-.4-.48H.63zM4.18.99v.52c0 .64-.31.98-.94.98h-.3V4h-.62V0h.92c.63 0 .94.35.94.99zM2.94.57v1.35h.3c.2 0 .3-.09.3-.37v-.6c0-.29-.1-.38-.3-.38h-.3zm2.89 2.27L6.25 0h.88v4h-.6V1.12L6.1 3.99h-.6l-.46-2.82v2.82h-.55V0h.87zM8.14 1.1V4h-.56V0h.79L9 2.4V0h.56v4h-.64zm2.49 2.29v.6h-.6v-.6zM12.12 1c0-.63.33-1 .95-1 .61 0 .95.37.95 1v2.04c0 .64-.34 1-.95 1-.62 0-.95-.37-.95-1zm.62 2.08c0 .28.13.39.33.39s.32-.1.32-.4V.98c0-.29-.12-.4-.32-.4s-.33.11-.33.4z\"/><path fill=\"currentColor\" d=\"M0 4.53h14.02v1.04H0zM11.08 0h.63v.62h-.63zm.63 4V1h-.63v2.98z\"/></svg>';\n\n  var BPMNIO_IMG = BPMNIO_LOGO_SVG;\n\n  var LOGO_STYLES = {\n    verticalAlign: 'middle'\n  };\n\n  var LINK_STYLES = {\n    'color': '#404040'\n  };\n\n  var LIGHTBOX_STYLES = {\n    'zIndex': '1001',\n    'position': 'fixed',\n    'top': '0',\n    'left': '0',\n    'right': '0',\n    'bottom': '0'\n  };\n\n  var BACKDROP_STYLES = {\n    'width': '100%',\n    'height': '100%',\n    'background': 'rgba(40,40,40,0.2)'\n  };\n\n  var NOTICE_STYLES = {\n    'position': 'absolute',\n    'left': '50%',\n    'top': '40%',\n    'transform': 'translate(-50%)',\n    'width': '260px',\n    'padding': '10px',\n    'background': 'white',\n    'boxShadow': '0 1px 4px rgba(0,0,0,0.3)',\n    'fontFamily': 'Helvetica, Arial, sans-serif',\n    'fontSize': '14px',\n    'display': 'flex',\n    'lineHeight': '1.3'\n  };\n\n  var LIGHTBOX_MARKUP =\n    '<div class=\"bjs-powered-by-lightbox\">' +\n      '<div class=\"backdrop\"></div>' +\n      '<div class=\"notice\">' +\n        '<a href=\"https://bpmn.io\" target=\"_blank\" rel=\"noopener\" class=\"link\">' +\n          BPMNIO_IMG +\n        '</a>' +\n        '<span>' +\n          'Web-based tooling for BPMN, DMN and forms ' +\n          'powered by <a href=\"https://bpmn.io\" target=\"_blank\" rel=\"noopener\">bpmn.io</a>.' +\n        '</span>' +\n      '</div>' +\n    '</div>';\n\n\n  var lightbox;\n\n  function createLightbox() {\n    lightbox = domify$1(LIGHTBOX_MARKUP);\n\n    assign(lightbox, LIGHTBOX_STYLES);\n    assign(query('svg', lightbox), LOGO_STYLES);\n    assign(query('.backdrop', lightbox), BACKDROP_STYLES);\n    assign(query('.notice', lightbox), NOTICE_STYLES);\n    assign(query('.link', lightbox), LINK_STYLES, {\n      'margin': '15px 20px 15px 10px',\n      'alignSelf': 'center'\n    });\n  }\n\n  function open() {\n\n    if (!lightbox) {\n      createLightbox();\n\n      delegate.bind(lightbox, '.backdrop', 'click', function(event) {\n        document.body.removeChild(lightbox);\n      });\n    }\n\n    document.body.appendChild(lightbox);\n  }\n\n  /**\n   * The code in the <project-logo></project-logo> area\n   * must not be changed.\n   *\n   * @see http://bpmn.io/license for more information.\n   */\n\n  /**\n   * @template T\n   *\n   * @typedef {import('diagram-js/lib/core/EventBus').EventBusEventCallback<T>} EventBusEventCallback\n   */\n\n  /**\n   * @typedef {import('didi').ModuleDeclaration} ModuleDeclaration\n   *\n   * @typedef {import('./model/Types').Moddle} Moddle\n   * @typedef {import('./model/Types').ModdleElement} ModdleElement\n   * @typedef {import('./model/Types').ModdleExtension} ModdleExtension\n   *\n   * @typedef { {\n   *   width?: number|string;\n   *   height?: number|string;\n   *   position?: string;\n   *   container?: string|HTMLElement;\n   *   moddleExtensions?: ModdleExtensions;\n   *   additionalModules?: ModuleDeclaration[];\n   * } & Record<string, any> } BaseViewerOptions\n   *\n   * @typedef {Record<string, ModdleElement>} ModdleElementsById\n   *\n   * @typedef { {\n   *   [key: string]: ModdleExtension;\n   * } } ModdleExtensions\n   *\n   * @typedef { {\n   *   warnings: string[];\n   * } } ImportXMLResult\n   *\n   * @typedef {ImportXMLResult & Error} ImportXMLError\n   *\n   * @typedef {ImportXMLResult} ImportDefinitionsResult\n   *\n   * @typedef {ImportXMLError} ImportDefinitionsError\n   *\n   * @typedef {ImportXMLResult} OpenResult\n   *\n   * @typedef {ImportXMLError} OpenError\n   *\n   * @typedef { {\n   *   format?: boolean;\n   *   preamble?: boolean;\n   * } } SaveXMLOptions\n   *\n   * @typedef { {\n   *   xml?: string;\n   *   error?: Error;\n   * } } SaveXMLResult\n   *\n   * @typedef { {\n   *   svg: string;\n   * } } SaveSVGResult\n   *\n   * @typedef { {\n   *   xml: string;\n   * } } ImportParseStartEvent\n   *\n   * @typedef { {\n   *   error?: ImportXMLError;\n   *   definitions?: ModdleElement;\n   *   elementsById?: ModdleElementsById;\n   *   references?: ModdleElement[];\n   *   warnings: string[];\n   * } } ImportParseCompleteEvent\n   *\n   * @typedef { {\n   *   error?: ImportXMLError;\n   *   warnings: string[];\n   * } } ImportDoneEvent\n   *\n   * @typedef { {\n   *   definitions: ModdleElement;\n   * } } SaveXMLStartEvent\n   *\n   * @typedef {SaveXMLResult} SaveXMLDoneEvent\n   *\n   * @typedef { {\n   *   error?: Error;\n   *   svg: string;\n   * } } SaveSVGDoneEvent\n   */\n\n  /**\n   * A base viewer for BPMN 2.0 diagrams.\n   *\n   * Have a look at {@link Viewer}, {@link NavigatedViewer} or {@link Modeler} for\n   * bundles that include actual features.\n   *\n   * @param {BaseViewerOptions} [options] The options to configure the viewer.\n   */\n  function BaseViewer(options) {\n\n    /**\n     * @type {BaseViewerOptions}\n     */\n    options = assign$1({}, DEFAULT_OPTIONS, options);\n\n    /**\n     * @type {Moddle}\n     */\n    this._moddle = this._createModdle(options);\n\n    /**\n     * @type {HTMLElement}\n     */\n    this._container = this._createContainer(options);\n\n    /* <project-logo> */\n\n    addProjectLogo(this._container);\n\n    /* </project-logo> */\n\n    this._init(this._container, this._moddle, options);\n  }\n\n  e(BaseViewer, Diagram);\n\n  /**\n   * Parse and render a BPMN 2.0 diagram.\n   *\n   * Once finished the viewer reports back the result to the\n   * provided callback function with (err, warnings).\n   *\n   * ## Life-Cycle Events\n   *\n   * During import the viewer will fire life-cycle events:\n   *\n   *   * import.parse.start (about to read model from XML)\n   *   * import.parse.complete (model read; may have worked or not)\n   *   * import.render.start (graphical import start)\n   *   * import.render.complete (graphical import finished)\n   *   * import.done (everything done)\n   *\n   * You can use these events to hook into the life-cycle.\n   *\n   * @throws {ImportXMLError} An error thrown during the import of the XML.\n   *\n   * @fires BaseViewer#ImportParseStartEvent\n   * @fires BaseViewer#ImportParseCompleteEvent\n   * @fires Importer#ImportRenderStartEvent\n   * @fires Importer#ImportRenderCompleteEvent\n   * @fires BaseViewer#ImportDoneEvent\n   *\n   * @param {string} xml The BPMN 2.0 XML to be imported.\n   * @param {ModdleElement|string} [bpmnDiagram] The optional diagram or Id of the BPMN diagram to open.\n   *\n   * @return {Promise<ImportXMLResult>} A promise resolving with warnings that were produced during the import.\n   */\n  BaseViewer.prototype.importXML = async function importXML(xml, bpmnDiagram) {\n\n    const self = this;\n\n    function ParseCompleteEvent(data) {\n\n      const event = self.get('eventBus').createEvent(data);\n\n      // TODO(nikku): remove with future bpmn-js version\n      Object.defineProperty(event, 'context', {\n        enumerable: true,\n        get: function() {\n\n          console.warn(new Error(\n            'import.parse.complete <context> is deprecated ' +\n            'and will be removed in future library versions'\n          ));\n\n          return {\n            warnings: data.warnings,\n            references: data.references,\n            elementsById: data.elementsById\n          };\n        }\n      });\n\n      return event;\n    }\n\n    let aggregatedWarnings = [];\n    try {\n\n      // hook in pre-parse listeners +\n      // allow xml manipulation\n\n      /**\n       * A `import.parse.start` event.\n       *\n       * @event BaseViewer#ImportParseStartEvent\n       * @type {ImportParseStartEvent}\n       */\n      xml = this._emit('import.parse.start', { xml: xml }) || xml;\n\n      let parseResult;\n      try {\n        parseResult = await this._moddle.fromXML(xml, 'bpmn:Definitions');\n      } catch (error) {\n        this._emit('import.parse.complete', {\n          error\n        });\n\n        throw error;\n      }\n\n      let definitions = parseResult.rootElement;\n      const references = parseResult.references;\n      const parseWarnings = parseResult.warnings;\n      const elementsById = parseResult.elementsById;\n\n      aggregatedWarnings = aggregatedWarnings.concat(parseWarnings);\n\n      // hook in post parse listeners +\n      // allow definitions manipulation\n\n      /**\n       * A `import.parse.complete` event.\n       *\n       * @event BaseViewer#ImportParseCompleteEvent\n       * @type {ImportParseCompleteEvent}\n       */\n      definitions = this._emit('import.parse.complete', ParseCompleteEvent({\n        error: null,\n        definitions: definitions,\n        elementsById: elementsById,\n        references: references,\n        warnings: aggregatedWarnings\n      })) || definitions;\n\n      const importResult = await this.importDefinitions(definitions, bpmnDiagram);\n\n      aggregatedWarnings = aggregatedWarnings.concat(importResult.warnings);\n\n      /**\n       * A `import.parse.complete` event.\n       *\n       * @event BaseViewer#ImportDoneEvent\n       * @type {ImportDoneEvent}\n       */\n      this._emit('import.done', { error: null, warnings: aggregatedWarnings });\n\n      return { warnings: aggregatedWarnings };\n    } catch (err) {\n      let error = err;\n      aggregatedWarnings = aggregatedWarnings.concat(error.warnings || []);\n      addWarningsToError(error, aggregatedWarnings);\n\n      error = checkValidationError(error);\n\n      this._emit('import.done', { error, warnings: error.warnings });\n\n      throw error;\n    }\n  };\n\n  BaseViewer.prototype.importXML = wrapForCompatibility(BaseViewer.prototype.importXML);\n\n\n  /**\n   * Import parsed definitions and render a BPMN 2.0 diagram.\n   *\n   * Once finished the viewer reports back the result to the\n   * provided callback function with (err, warnings).\n   *\n   * ## Life-Cycle Events\n   *\n   * During import the viewer will fire life-cycle events:\n   *\n   *   * import.render.start (graphical import start)\n   *   * import.render.complete (graphical import finished)\n   *\n   * You can use these events to hook into the life-cycle.\n   *\n   * @throws {ImportDefinitionsError} An error thrown during the import of the definitions.\n   *\n   * @param {ModdleElement} definitions The definitions.\n   * @param {ModdleElement|string} [bpmnDiagram] The optional diagram or ID of the BPMN diagram to open.\n   *\n   * @return {Promise<ImportDefinitionsResult>} A promise resolving with warnings that were produced during the import.\n   */\n  BaseViewer.prototype.importDefinitions = async function importDefinitions(definitions, bpmnDiagram) {\n    this._setDefinitions(definitions);\n    const result = await this.open(bpmnDiagram);\n\n    return { warnings: result.warnings };\n  };\n\n  BaseViewer.prototype.importDefinitions = wrapForCompatibility(BaseViewer.prototype.importDefinitions);\n\n\n  /**\n   * Open diagram of previously imported XML.\n   *\n   * Once finished the viewer reports back the result to the\n   * provided callback function with (err, warnings).\n   *\n   * ## Life-Cycle Events\n   *\n   * During switch the viewer will fire life-cycle events:\n   *\n   *   * import.render.start (graphical import start)\n   *   * import.render.complete (graphical import finished)\n   *\n   * You can use these events to hook into the life-cycle.\n   *\n   * @throws {OpenError} An error thrown during opening.\n   *\n   * @param {ModdleElement|string} bpmnDiagramOrId The diagram or Id of the BPMN diagram to open.\n   *\n   * @return {Promise<OpenResult>} A promise resolving with warnings that were produced during opening.\n   */\n  BaseViewer.prototype.open = async function open(bpmnDiagramOrId) {\n\n    const definitions = this._definitions;\n    let bpmnDiagram = bpmnDiagramOrId;\n\n    if (!definitions) {\n      const error = new Error('no XML imported');\n      addWarningsToError(error, []);\n\n      throw error;\n    }\n\n    if (typeof bpmnDiagramOrId === 'string') {\n      bpmnDiagram = findBPMNDiagram(definitions, bpmnDiagramOrId);\n\n      if (!bpmnDiagram) {\n        const error = new Error('BPMNDiagram <' + bpmnDiagramOrId + '> not found');\n        addWarningsToError(error, []);\n\n        throw error;\n      }\n    }\n\n    // clear existing rendered diagram\n    // catch synchronous exceptions during #clear()\n    try {\n      this.clear();\n    } catch (error) {\n      addWarningsToError(error, []);\n\n      throw error;\n    }\n\n    // perform graphical import\n    const { warnings } = await importBpmnDiagram(this, definitions, bpmnDiagram);\n\n    return { warnings };\n  };\n\n  BaseViewer.prototype.open = wrapForCompatibility(BaseViewer.prototype.open);\n\n  /**\n   * Export the currently displayed BPMN 2.0 diagram as\n   * a BPMN 2.0 XML document.\n   *\n   * ## Life-Cycle Events\n   *\n   * During XML saving the viewer will fire life-cycle events:\n   *\n   *   * saveXML.start (before serialization)\n   *   * saveXML.serialized (after xml generation)\n   *   * saveXML.done (everything done)\n   *\n   * You can use these events to hook into the life-cycle.\n   *\n   * @throws {Error} An error thrown during export.\n   *\n   * @fires BaseViewer#SaveXMLStart\n   * @fires BaseViewer#SaveXMLDone\n   *\n   * @param {SaveXMLOptions} [options] The options.\n   *\n   * @return {Promise<SaveXMLResult>} A promise resolving with the XML.\n   */\n  BaseViewer.prototype.saveXML = async function saveXML(options) {\n\n    options = options || {};\n\n    let definitions = this._definitions,\n        error, xml;\n\n    try {\n      if (!definitions) {\n        throw new Error('no definitions loaded');\n      }\n\n      // allow to fiddle around with definitions\n\n      /**\n       * A `saveXML.start` event.\n       *\n       * @event BaseViewer#SaveXMLStartEvent\n       * @type {SaveXMLStartEvent}\n       */\n      definitions = this._emit('saveXML.start', {\n        definitions\n      }) || definitions;\n\n      const result = await this._moddle.toXML(definitions, options);\n      xml = result.xml;\n\n      xml = this._emit('saveXML.serialized', {\n        xml\n      }) || xml;\n    } catch (err) {\n      error = err;\n    }\n\n    const result = error ? { error } : { xml };\n\n    /**\n     * A `saveXML.done` event.\n     *\n     * @event BaseViewer#SaveXMLDoneEvent\n     * @type {SaveXMLDoneEvent}\n     */\n    this._emit('saveXML.done', result);\n\n    if (error) {\n      throw error;\n    }\n\n    return result;\n  };\n\n  BaseViewer.prototype.saveXML = wrapForCompatibility(BaseViewer.prototype.saveXML);\n\n\n  /**\n   * Export the currently displayed BPMN 2.0 diagram as\n   * an SVG image.\n   *\n   * ## Life-Cycle Events\n   *\n   * During SVG saving the viewer will fire life-cycle events:\n   *\n   *   * saveSVG.start (before serialization)\n   *   * saveSVG.done (everything done)\n   *\n   * You can use these events to hook into the life-cycle.\n   *\n   * @throws {Error} An error thrown during export.\n   *\n   * @fires BaseViewer#SaveSVGDone\n   *\n   * @return {Promise<SaveSVGResult>} A promise resolving with the SVG.\n   */\n  BaseViewer.prototype.saveSVG = async function saveSVG() {\n    this._emit('saveSVG.start');\n\n    let svg, err;\n\n    try {\n      const canvas = this.get('canvas');\n\n      const contentNode = canvas.getActiveLayer(),\n            defsNode = query('defs', canvas._svg);\n\n      const contents = innerSVG(contentNode),\n            defs = defsNode ? '<defs>' + innerSVG(defsNode) + '</defs>' : '';\n\n      const bbox = contentNode.getBBox();\n\n      svg =\n        '<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n' +\n        '<!-- created with bpmn-js / http://bpmn.io -->\\n' +\n        '<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n' +\n        '<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" ' +\n        'width=\"' + bbox.width + '\" height=\"' + bbox.height + '\" ' +\n        'viewBox=\"' + bbox.x + ' ' + bbox.y + ' ' + bbox.width + ' ' + bbox.height + '\" version=\"1.1\">' +\n        defs + contents +\n        '</svg>';\n    } catch (e) {\n      err = e;\n    }\n\n    /**\n     * A `saveSVG.done` event.\n     *\n     * @event BaseViewer#SaveSVGDoneEvent\n     * @type {SaveSVGDoneEvent}\n     */\n    this._emit('saveSVG.done', {\n      error: err,\n      svg: svg\n    });\n\n    if (err) {\n      throw err;\n    }\n\n    return { svg };\n  };\n\n  BaseViewer.prototype.saveSVG = wrapForCompatibility(BaseViewer.prototype.saveSVG);\n\n  /**\n   * Get a named diagram service.\n   *\n   * @example\n   *\n   * const elementRegistry = viewer.get('elementRegistry');\n   * const startEventShape = elementRegistry.get('StartEvent_1');\n   *\n   * @param {string} name\n   *\n   * @return {Object} diagram service instance\n   *\n   * @method BaseViewer#get\n   */\n\n  /**\n   * Invoke a function in the context of this viewer.\n   *\n   * @example\n   *\n   * viewer.invoke(function(elementRegistry) {\n   *   const startEventShape = elementRegistry.get('StartEvent_1');\n   * });\n   *\n   * @param {Function} fn to be invoked\n   *\n   * @return {Object} the functions return value\n   *\n   * @method BaseViewer#invoke\n   */\n\n\n  BaseViewer.prototype._setDefinitions = function(definitions) {\n    this._definitions = definitions;\n  };\n\n  /**\n   * Return modules to instantiate with.\n   *\n   * @return {ModuleDeclaration[]} The modules.\n   */\n  BaseViewer.prototype.getModules = function() {\n    return this._modules;\n  };\n\n  /**\n   * Remove all drawn elements from the viewer.\n   *\n   * After calling this method the viewer can still be reused for opening another\n   * diagram.\n   */\n  BaseViewer.prototype.clear = function() {\n    if (!this.getDefinitions()) {\n\n      // no diagram to clear\n      return;\n    }\n\n    // remove drawn elements\n    Diagram.prototype.clear.call(this);\n  };\n\n  /**\n   * Destroy the viewer instance and remove all its remainders from the document\n   * tree.\n   */\n  BaseViewer.prototype.destroy = function() {\n\n    // diagram destroy\n    Diagram.prototype.destroy.call(this);\n\n    // dom detach\n    remove$1(this._container);\n  };\n\n  /**\n   * Register an event listener.\n   *\n   * Remove an event listener via {@link BaseViewer#off}.\n   *\n   * @template T\n   *\n   * @param {string|string[]} events The event(s) to listen to.\n   * @param {number} [priority] The priority with which to listen.\n   * @param {EventBusEventCallback<T>} callback The callback.\n   * @param {any} [that] Value of `this` the callback will be called with.\n   */\n  BaseViewer.prototype.on = function(events, priority, callback, that) {\n    return this.get('eventBus').on(events, priority, callback, that);\n  };\n\n  /**\n   * Remove an event listener.\n   *\n   * @param {string|string[]} events The event(s).\n   * @param {Function} [callback] The callback.\n   */\n  BaseViewer.prototype.off = function(events, callback) {\n    this.get('eventBus').off(events, callback);\n  };\n\n  /**\n   * Attach the viewer to an HTML element.\n   *\n   * @param {HTMLElement} parentNode The parent node to attach to.\n   */\n  BaseViewer.prototype.attachTo = function(parentNode) {\n\n    if (!parentNode) {\n      throw new Error('parentNode required');\n    }\n\n    // ensure we detach from the\n    // previous, old parent\n    this.detach();\n\n    // unwrap jQuery if provided\n    if (parentNode.get && parentNode.constructor.prototype.jquery) {\n      parentNode = parentNode.get(0);\n    }\n\n    if (typeof parentNode === 'string') {\n      parentNode = query(parentNode);\n    }\n\n    parentNode.appendChild(this._container);\n\n    this._emit('attach', {});\n\n    this.get('canvas').resized();\n  };\n\n  /**\n   * Get the definitions model element.\n   *\n   * @return {ModdleElement} The definitions model element.\n   */\n  BaseViewer.prototype.getDefinitions = function() {\n    return this._definitions;\n  };\n\n  /**\n   * Detach the viewer.\n   *\n   * @fires BaseViewer#DetachEvent\n   */\n  BaseViewer.prototype.detach = function() {\n\n    const container = this._container,\n          parentNode = container.parentNode;\n\n    if (!parentNode) {\n      return;\n    }\n\n    /**\n     * A `detach` event.\n     *\n     * @event BaseViewer#DetachEvent\n     * @type {Object}\n     */\n    this._emit('detach', {});\n\n    parentNode.removeChild(container);\n  };\n\n  BaseViewer.prototype._init = function(container, moddle, options) {\n\n    const baseModules = options.modules || this.getModules(options),\n          additionalModules = options.additionalModules || [],\n          staticModules = [\n            {\n              bpmnjs: [ 'value', this ],\n              moddle: [ 'value', moddle ]\n            }\n          ];\n\n    const diagramModules = [].concat(staticModules, baseModules, additionalModules);\n\n    const diagramOptions = assign$1(omit(options, [ 'additionalModules' ]), {\n      canvas: assign$1({}, options.canvas, { container: container }),\n      modules: diagramModules\n    });\n\n    // invoke diagram constructor\n    Diagram.call(this, diagramOptions);\n\n    if (options && options.container) {\n      this.attachTo(options.container);\n    }\n  };\n\n  /**\n   * Emit an event on the underlying {@link EventBus}\n   *\n   * @param  {string} type\n   * @param  {Object} event\n   *\n   * @return {Object} The return value after calling all event listeners.\n   */\n  BaseViewer.prototype._emit = function(type, event) {\n    return this.get('eventBus').fire(type, event);\n  };\n\n  /**\n   * @param {BaseViewerOptions} options\n   *\n   * @return {HTMLElement}\n   */\n  BaseViewer.prototype._createContainer = function(options) {\n\n    const container = domify$1('<div class=\"bjs-container\"></div>');\n\n    assign(container, {\n      width: ensureUnit(options.width),\n      height: ensureUnit(options.height),\n      position: options.position\n    });\n\n    return container;\n  };\n\n  /**\n   * @param {BaseViewerOptions} options\n   *\n   * @return {Moddle}\n   */\n  BaseViewer.prototype._createModdle = function(options) {\n    const moddleOptions = assign$1({}, this._moddleExtensions, options.moddleExtensions);\n\n    return new simple(moddleOptions);\n  };\n\n  BaseViewer.prototype._modules = [];\n\n  // helpers ///////////////\n\n  function addWarningsToError(err, warningsAry) {\n    err.warnings = warningsAry;\n    return err;\n  }\n\n  function checkValidationError(err) {\n\n    // check if we can help the user by indicating wrong BPMN 2.0 xml\n    // (in case he or the exporting tool did not get that right)\n\n    const pattern = /unparsable content <([^>]+)> detected([\\s\\S]*)$/;\n    const match = pattern.exec(err.message);\n\n    if (match) {\n      err.message =\n        'unparsable content <' + match[1] + '> detected; ' +\n        'this may indicate an invalid BPMN 2.0 diagram file' + match[2];\n    }\n\n    return err;\n  }\n\n  const DEFAULT_OPTIONS = {\n    width: '100%',\n    height: '100%',\n    position: 'relative'\n  };\n\n\n  /**\n   * Ensure the passed argument is a proper unit (defaulting to px)\n   */\n  function ensureUnit(val) {\n    return val + (isNumber(val) ? 'px' : '');\n  }\n\n\n  /**\n   * Find BPMNDiagram in definitions by ID\n   *\n   * @param {ModdleElement<Definitions>} definitions\n   * @param {string} diagramId\n   *\n   * @return {ModdleElement<BPMNDiagram>|null}\n   */\n  function findBPMNDiagram(definitions, diagramId) {\n    if (!diagramId) {\n      return null;\n    }\n\n    return find(definitions.diagrams, function(element) {\n      return element.id === diagramId;\n    }) || null;\n  }\n\n  /**\n   * Adds the project logo to the diagram container as\n   * required by the bpmn.io license.\n   *\n   * @see http://bpmn.io/license\n   *\n   * @param {Element} container\n   */\n  function addProjectLogo(container) {\n    const img = BPMNIO_IMG;\n\n    const linkMarkup =\n      '<a href=\"http://bpmn.io\" ' +\n      'target=\"_blank\" ' +\n      'class=\"bjs-powered-by\" ' +\n      'title=\"Powered by bpmn.io\" ' +\n      '>' +\n      img +\n      '</a>';\n\n    const linkElement = domify$1(linkMarkup);\n\n    assign(query('svg', linkElement), LOGO_STYLES);\n    assign(linkElement, LINK_STYLES, {\n      position: 'absolute',\n      bottom: '15px',\n      right: '15px',\n      zIndex: '100'\n    });\n\n    container.appendChild(linkElement);\n\n    event.bind(linkElement, 'click', function(event) {\n      open();\n\n      event.preventDefault();\n    });\n  }\n\n  /* </project-logo> */\n\n  /**\n   * @typedef { import('./BaseViewer').BaseViewerOptions } BaseViewerOptions\n   */\n\n  /**\n   * A viewer for BPMN 2.0 diagrams.\n   *\n   * Have a look at {@link NavigatedViewer} or {@link Modeler} for bundles that include\n   * additional features.\n   *\n   *\n   * ## Extending the Viewer\n   *\n   * In order to extend the viewer pass extension modules to bootstrap via the\n   * `additionalModules` option. An extension module is an object that exposes\n   * named services.\n   *\n   * The following example depicts the integration of a simple\n   * logging component that integrates with interaction events:\n   *\n   *\n   * ```javascript\n   *\n   * // logging component\n   * function InteractionLogger(eventBus) {\n   *   eventBus.on('element.hover', function(event) {\n   *     console.log()\n   *   })\n   * }\n   *\n   * InteractionLogger.$inject = [ 'eventBus' ]; // minification save\n   *\n   * // extension module\n   * var extensionModule = {\n   *   __init__: [ 'interactionLogger' ],\n   *   interactionLogger: [ 'type', InteractionLogger ]\n   * };\n   *\n   * // extend the viewer\n   * var bpmnViewer = new Viewer({ additionalModules: [ extensionModule ] });\n   * bpmnViewer.importXML(...);\n   * ```\n   *\n   * @param {BaseViewerOptions} [options] The options to configure the viewer.\n   */\n  function Viewer(options) {\n    BaseViewer.call(this, options);\n  }\n\n  e(Viewer, BaseViewer);\n\n  // modules the viewer is composed of\n  Viewer.prototype._modules = [\n    CoreModule$1,\n    TranslateModule,\n    SelectionModule,\n    OverlaysModule,\n    DrilldownModdule\n  ];\n\n  // default moddle extensions the viewer is composed of\n  Viewer.prototype._moddleExtensions = {};\n\n  var KEYS_COPY = [ 'c', 'C' ];\r\n  var KEYS_PASTE = [ 'v', 'V' ];\r\n  var KEYS_REDO = [ 'y', 'Y' ];\r\n  var KEYS_UNDO = [ 'z', 'Z' ];\r\n\r\n  /**\r\n   * Returns true if event was triggered with any modifier\r\n   * @param {KeyboardEvent} event\r\n   */\r\n  function hasModifier(event) {\r\n    return (event.ctrlKey || event.metaKey || event.shiftKey || event.altKey);\r\n  }\r\n\r\n  /**\r\n   * @param {KeyboardEvent} event\r\n   * @return {boolean}\r\n   */\r\n  function isCmd(event) {\r\n\r\n    // ensure we don't react to AltGr\r\n    // (mapped to CTRL + ALT)\r\n    if (event.altKey) {\r\n      return false;\r\n    }\r\n\r\n    return event.ctrlKey || event.metaKey;\r\n  }\r\n\r\n  /**\r\n   * Checks if key pressed is one of provided keys.\r\n   *\r\n   * @param {string|string[]} keys\r\n   * @param {KeyboardEvent} event\r\n   * @return {boolean}\r\n   */\r\n  function isKey(keys, event) {\r\n    keys = isArray$2(keys) ? keys : [ keys ];\r\n\r\n    return keys.indexOf(event.key) !== -1 || keys.indexOf(event.code) !== -1;\r\n  }\r\n\r\n  /**\r\n   * @param {KeyboardEvent} event\r\n   */\r\n  function isShift(event) {\r\n    return event.shiftKey;\r\n  }\r\n\r\n  /**\r\n   * @param {KeyboardEvent} event\r\n   */\r\n  function isCopy(event) {\r\n    return isCmd(event) && isKey(KEYS_COPY, event);\r\n  }\r\n\r\n  /**\r\n   * @param {KeyboardEvent} event\r\n   */\r\n  function isPaste(event) {\r\n    return isCmd(event) && isKey(KEYS_PASTE, event);\r\n  }\r\n\r\n  /**\r\n   * @param {KeyboardEvent} event\r\n   */\r\n  function isUndo(event) {\r\n    return isCmd(event) && !isShift(event) && isKey(KEYS_UNDO, event);\r\n  }\r\n\r\n  /**\r\n   * @param {KeyboardEvent} event\r\n   */\r\n  function isRedo(event) {\r\n    return isCmd(event) && (\r\n      isKey(KEYS_REDO, event) || (\r\n        isKey(KEYS_UNDO, event) && isShift(event)\r\n      )\r\n    );\r\n  }\n\n  /**\n   * @typedef {import('../../core/EventBus').default} EventBus\n   *\n   * @typedef {({ keyEvent: KeyboardEvent }) => any} Listener\n   */\n\n  var KEYDOWN_EVENT = 'keyboard.keydown',\n      KEYUP_EVENT = 'keyboard.keyup';\n\n  var HANDLE_MODIFIER_ATTRIBUTE = 'input-handle-modified-keys';\n\n  var DEFAULT_PRIORITY = 1000;\n\n  /**\n   * A keyboard abstraction that may be activated and\n   * deactivated by users at will, consuming global key events\n   * and triggering diagram actions.\n   *\n   * For keys pressed down, keyboard fires `keyboard.keydown` event.\n   * The event context contains one field which is `KeyboardEvent` event.\n   *\n   * The implementation fires the following key events that allow\n   * other components to hook into key handling:\n   *\n   *  - keyboard.bind\n   *  - keyboard.unbind\n   *  - keyboard.init\n   *  - keyboard.destroy\n   *\n   * All events contain one field which is node.\n   *\n   * A default binding for the keyboard may be specified via the\n   * `keyboard.bindTo` configuration option.\n   *\n   * @param {Object} config\n   * @param {EventTarget} [config.bindTo]\n   * @param {EventBus} eventBus\n   */\n  function Keyboard(config, eventBus) {\n    var self = this;\n\n    this._config = config || {};\n    this._eventBus = eventBus;\n\n    this._keydownHandler = this._keydownHandler.bind(this);\n    this._keyupHandler = this._keyupHandler.bind(this);\n\n    // properly clean dom registrations\n    eventBus.on('diagram.destroy', function() {\n      self._fire('destroy');\n\n      self.unbind();\n    });\n\n    eventBus.on('diagram.init', function() {\n      self._fire('init');\n    });\n\n    eventBus.on('attach', function() {\n      if (config && config.bindTo) {\n        self.bind(config.bindTo);\n      }\n    });\n\n    eventBus.on('detach', function() {\n      self.unbind();\n    });\n  }\n\n  Keyboard.$inject = [\n    'config.keyboard',\n    'eventBus'\n  ];\n\n  Keyboard.prototype._keydownHandler = function(event) {\n    this._keyHandler(event, KEYDOWN_EVENT);\n  };\n\n  Keyboard.prototype._keyupHandler = function(event) {\n    this._keyHandler(event, KEYUP_EVENT);\n  };\n\n  Keyboard.prototype._keyHandler = function(event, type) {\n    var eventBusResult;\n\n    if (this._isEventIgnored(event)) {\n      return;\n    }\n\n    var context = {\n      keyEvent: event\n    };\n\n    eventBusResult = this._eventBus.fire(type || KEYDOWN_EVENT, context);\n\n    if (eventBusResult) {\n      event.preventDefault();\n    }\n  };\n\n  Keyboard.prototype._isEventIgnored = function(event) {\n    if (event.defaultPrevented) {\n      return true;\n    }\n\n    return isInput(event.target) && this._isModifiedKeyIgnored(event);\n  };\n\n  Keyboard.prototype._isModifiedKeyIgnored = function(event) {\n    if (!isCmd(event)) {\n      return true;\n    }\n\n    var allowedModifiers = this._getAllowedModifiers(event.target);\n    return allowedModifiers.indexOf(event.key) === -1;\n  };\n\n  Keyboard.prototype._getAllowedModifiers = function(element) {\n    var modifierContainer = closest(element, '[' + HANDLE_MODIFIER_ATTRIBUTE + ']', true);\n\n    if (!modifierContainer || (this._node && !this._node.contains(modifierContainer))) {\n      return [];\n    }\n\n    return modifierContainer.getAttribute(HANDLE_MODIFIER_ATTRIBUTE).split(',');\n  };\n\n  /**\n   * Bind keyboard events to the given DOM node.\n   *\n   * @param {EventTarget} node\n   */\n  Keyboard.prototype.bind = function(node) {\n\n    // make sure that the keyboard is only bound once to the DOM\n    this.unbind();\n\n    this._node = node;\n\n    // bind key events\n    event.bind(node, 'keydown', this._keydownHandler);\n    event.bind(node, 'keyup', this._keyupHandler);\n\n    this._fire('bind');\n  };\n\n  /**\n   * @return {EventTarget}\n   */\n  Keyboard.prototype.getBinding = function() {\n    return this._node;\n  };\n\n  Keyboard.prototype.unbind = function() {\n    var node = this._node;\n\n    if (node) {\n      this._fire('unbind');\n\n      // unbind key events\n      event.unbind(node, 'keydown', this._keydownHandler);\n      event.unbind(node, 'keyup', this._keyupHandler);\n    }\n\n    this._node = null;\n  };\n\n  /**\n   * @param {string} event\n   */\n  Keyboard.prototype._fire = function(event) {\n    this._eventBus.fire('keyboard.' + event, { node: this._node });\n  };\n\n  /**\n   * Add a listener function that is notified with `KeyboardEvent` whenever\n   * the keyboard is bound and the user presses a key. If no priority is\n   * provided, the default value of 1000 is used.\n   *\n   * @param {number} [priority]\n   * @param {Listener} listener\n   * @param {string} [type='keyboard.keydown']\n   */\n  Keyboard.prototype.addListener = function(priority, listener, type) {\n    if (isFunction(priority)) {\n      type = listener;\n      listener = priority;\n      priority = DEFAULT_PRIORITY;\n    }\n\n    this._eventBus.on(type || KEYDOWN_EVENT, priority, listener);\n  };\n\n  /**\n   * Remove a listener function.\n   *\n   * @param {Listener} listener\n   * @param {string} [type='keyboard.keydown']\n   */\n  Keyboard.prototype.removeListener = function(listener, type) {\n    this._eventBus.off(type || KEYDOWN_EVENT, listener);\n  };\n\n  Keyboard.prototype.hasModifier = hasModifier;\n  Keyboard.prototype.isCmd = isCmd;\n  Keyboard.prototype.isShift = isShift;\n  Keyboard.prototype.isKey = isKey;\n\n\n\n  // helpers ///////\n\n  function isInput(target) {\n    return target && (matches(target, 'input, textarea') || target.contentEditable === 'true');\n  }\n\n  var LOW_PRIORITY = 500;\n\n\n  /**\n   * Adds default keyboard bindings.\n   *\n   * This does not pull in any features will bind only actions that\n   * have previously been registered against the editorActions component.\n   *\n   * @param {EventBus} eventBus\n   * @param {Keyboard} keyboard\n   */\n  function KeyboardBindings(eventBus, keyboard) {\n\n    var self = this;\n\n    eventBus.on('editorActions.init', LOW_PRIORITY, function(event) {\n\n      var editorActions = event.editorActions;\n\n      self.registerBindings(keyboard, editorActions);\n    });\n  }\n\n  KeyboardBindings.$inject = [\n    'eventBus',\n    'keyboard'\n  ];\n\n\n  /**\n   * Register available keyboard bindings.\n   *\n   * @param {Keyboard} keyboard\n   * @param {EditorActions} editorActions\n   */\n  KeyboardBindings.prototype.registerBindings = function(keyboard, editorActions) {\n\n    /**\n     * Add keyboard binding if respective editor action\n     * is registered.\n     *\n     * @param {string} action name\n     * @param {Function} fn that implements the key binding\n     */\n    function addListener(action, fn) {\n\n      if (editorActions.isRegistered(action)) {\n        keyboard.addListener(fn);\n      }\n    }\n\n\n    // undo\n    // (CTRL|CMD) + Z\n    addListener('undo', function(context) {\n\n      var event = context.keyEvent;\n\n      if (isUndo(event)) {\n        editorActions.trigger('undo');\n\n        return true;\n      }\n    });\n\n    // redo\n    // CTRL + Y\n    // CMD + SHIFT + Z\n    addListener('redo', function(context) {\n\n      var event = context.keyEvent;\n\n      if (isRedo(event)) {\n        editorActions.trigger('redo');\n\n        return true;\n      }\n    });\n\n    // copy\n    // CTRL/CMD + C\n    addListener('copy', function(context) {\n\n      var event = context.keyEvent;\n\n      if (isCopy(event)) {\n        editorActions.trigger('copy');\n\n        return true;\n      }\n    });\n\n    // paste\n    // CTRL/CMD + V\n    addListener('paste', function(context) {\n\n      var event = context.keyEvent;\n\n      if (isPaste(event)) {\n        editorActions.trigger('paste');\n\n        return true;\n      }\n    });\n\n    // zoom in one step\n    // CTRL/CMD + +\n    addListener('stepZoom', function(context) {\n\n      var event = context.keyEvent;\n\n      // quirk: it has to be triggered by `=` as well to work on international keyboard layout\n      // cf: https://github.com/bpmn-io/bpmn-js/issues/1362#issuecomment-722989754\n      if (isKey([ '+', 'Add', '=' ], event) && isCmd(event)) {\n        editorActions.trigger('stepZoom', { value: 1 });\n\n        return true;\n      }\n    });\n\n    // zoom out one step\n    // CTRL + -\n    addListener('stepZoom', function(context) {\n\n      var event = context.keyEvent;\n\n      if (isKey([ '-', 'Subtract' ], event) && isCmd(event)) {\n        editorActions.trigger('stepZoom', { value: -1 });\n\n        return true;\n      }\n    });\n\n    // zoom to the default level\n    // CTRL + 0\n    addListener('zoom', function(context) {\n\n      var event = context.keyEvent;\n\n      if (isKey('0', event) && isCmd(event)) {\n        editorActions.trigger('zoom', { value: 1 });\n\n        return true;\n      }\n    });\n\n    // delete selected element\n    // DEL\n    addListener('removeSelection', function(context) {\n\n      var event = context.keyEvent;\n\n      if (isKey([ 'Backspace', 'Delete', 'Del' ], event)) {\n        editorActions.trigger('removeSelection');\n\n        return true;\n      }\n    });\n  };\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var KeyboardModule = {\n    __init__: [ 'keyboard', 'keyboardBindings' ],\n    keyboard: [ 'type', Keyboard ],\n    keyboardBindings: [ 'type', KeyboardBindings ]\n  };\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../features/keyboard/Keyboard').default} Keyboard\n   */\n\n  var DEFAULT_CONFIG = {\n    moveSpeed: 50,\n    moveSpeedAccelerated: 200\n  };\n\n\n  /**\n   * A feature that allows users to move the canvas using the keyboard.\n   *\n   * @param {Object} config\n   * @param {number} [config.moveSpeed=50]\n   * @param {number} [config.moveSpeedAccelerated=200]\n   * @param {Keyboard} keyboard\n   * @param {Canvas} canvas\n   */\n  function KeyboardMove(\n      config,\n      keyboard,\n      canvas\n  ) {\n\n    var self = this;\n\n    this._config = assign$1({}, DEFAULT_CONFIG, config || {});\n\n    keyboard.addListener(arrowsListener);\n\n\n    function arrowsListener(context) {\n\n      var event = context.keyEvent,\n          config = self._config;\n\n      if (!keyboard.isCmd(event)) {\n        return;\n      }\n\n      if (keyboard.isKey([\n        'ArrowLeft', 'Left',\n        'ArrowUp', 'Up',\n        'ArrowDown', 'Down',\n        'ArrowRight', 'Right'\n      ], event)) {\n\n        var speed = (\n          keyboard.isShift(event) ?\n            config.moveSpeedAccelerated :\n            config.moveSpeed\n        );\n\n        var direction;\n\n        switch (event.key) {\n        case 'ArrowLeft':\n        case 'Left':\n          direction = 'left';\n          break;\n        case 'ArrowUp':\n        case 'Up':\n          direction = 'up';\n          break;\n        case 'ArrowRight':\n        case 'Right':\n          direction = 'right';\n          break;\n        case 'ArrowDown':\n        case 'Down':\n          direction = 'down';\n          break;\n        }\n\n        self.moveCanvas({\n          speed: speed,\n          direction: direction\n        });\n\n        return true;\n      }\n    }\n\n    /**\n     * @param {{\n     *   direction: 'up' | 'down' | 'left' | 'right';\n     *   speed: number;\n     * }} options\n     */\n    this.moveCanvas = function(options) {\n\n      var dx = 0,\n          dy = 0,\n          speed = options.speed;\n\n      var actualSpeed = speed / Math.min(Math.sqrt(canvas.viewbox().scale), 1);\n\n      switch (options.direction) {\n      case 'left': // Left\n        dx = actualSpeed;\n        break;\n      case 'up': // Up\n        dy = actualSpeed;\n        break;\n      case 'right': // Right\n        dx = -actualSpeed;\n        break;\n      case 'down': // Down\n        dy = -actualSpeed;\n        break;\n      }\n\n      canvas.scroll({\n        dx: dx,\n        dy: dy\n      });\n    };\n\n  }\n\n\n  KeyboardMove.$inject = [\n    'config.keyboardMove',\n    'keyboard',\n    'canvas'\n  ];\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var KeyboardMoveModule = {\n    __depends__: [\n      KeyboardModule\n    ],\n    __init__: [ 'keyboardMove' ],\n    keyboardMove: [ 'type', KeyboardMove ]\n  };\n\n  var CURSOR_CLS_PATTERN = /^djs-cursor-.*$/;\n\n  /**\n   * @param {string} mode\n   */\n  function set(mode) {\n    var classes$1 = classes(document.body);\n\n    classes$1.removeMatching(CURSOR_CLS_PATTERN);\n\n    if (mode) {\n      classes$1.add('djs-cursor-' + mode);\n    }\n  }\n\n  function unset() {\n    set(null);\n  }\n\n  /**\n   * @typedef {import('../core/EventBus').EventBus} EventBus\n   */\n\n  var TRAP_PRIORITY = 5000;\n\n  /**\n   * Installs a click trap that prevents a ghost click following a dragging operation.\n   *\n   * @param {EventBus} eventBus\n   * @param {string} [eventName='element.click']\n   *\n   * @return {() => void} a function to immediately remove the installed trap.\n   */\n  function install(eventBus, eventName) {\n\n    eventName = eventName || 'element.click';\n\n    function trap() {\n      return false;\n    }\n\n    eventBus.once(eventName, TRAP_PRIORITY, trap);\n\n    return function() {\n      eventBus.off(eventName, trap);\n    };\n  }\n\n  /**\n   * @typedef {import('../util/Types').Point} Point\n   * @typedef {import('../util/Types').Rect} Rect\n   */\n\n\n  /**\n   * @param {Point} a\n   * @param {Point} b\n   * @return {Point}\n   */\n  function delta(a, b) {\n    return {\n      x: a.x - b.x,\n      y: a.y - b.y\n    };\n  }\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   */\n\n  var THRESHOLD = 15;\n\n\n  /**\n   * Move the canvas via mouse.\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   */\n  function MoveCanvas(eventBus, canvas) {\n\n    var context;\n\n\n    // listen for move on element mouse down;\n    // allow others to hook into the event before us though\n    // (dragging / element moving will do this)\n    eventBus.on('element.mousedown', 500, function(e) {\n      return handleStart(e.originalEvent);\n    });\n\n\n    function handleMove(event) {\n\n      var start = context.start,\n          button = context.button,\n          position = toPoint(event),\n          delta$1 = delta(position, start);\n\n      if (!context.dragging && length(delta$1) > THRESHOLD) {\n        context.dragging = true;\n\n        if (button === 0) {\n          install(eventBus);\n        }\n\n        set('grab');\n      }\n\n      if (context.dragging) {\n\n        var lastPosition = context.last || context.start;\n\n        delta$1 = delta(position, lastPosition);\n\n        canvas.scroll({\n          dx: delta$1.x,\n          dy: delta$1.y\n        });\n\n        context.last = position;\n      }\n\n      // prevent select\n      event.preventDefault();\n    }\n\n\n    function handleEnd(event$1) {\n      event.unbind(document, 'mousemove', handleMove);\n      event.unbind(document, 'mouseup', handleEnd);\n\n      context = null;\n\n      unset();\n    }\n\n    function handleStart(event$1) {\n\n      // event is already handled by '.djs-draggable'\n      if (closest(event$1.target, '.djs-draggable')) {\n        return;\n      }\n\n      var button = event$1.button;\n\n      // reject right mouse button or modifier key\n      if (button >= 2 || event$1.ctrlKey || event$1.shiftKey || event$1.altKey) {\n        return;\n      }\n\n      context = {\n        button: button,\n        start: toPoint(event$1)\n      };\n\n      event.bind(document, 'mousemove', handleMove);\n      event.bind(document, 'mouseup', handleEnd);\n\n      // we've handled the event\n      return true;\n    }\n\n    this.isActive = function() {\n      return !!context;\n    };\n\n  }\n\n\n  MoveCanvas.$inject = [\n    'eventBus',\n    'canvas'\n  ];\n\n\n\n  // helpers ///////\n\n  function length(point) {\n    return Math.sqrt(Math.pow(point.x, 2) + Math.pow(point.y, 2));\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var MoveCanvasModule = {\n    __init__: [ 'moveCanvas' ],\n    moveCanvas: [ 'type', MoveCanvas ]\n  };\n\n  /**\n   * Get the logarithm of x with base 10.\n   *\n   * @param {number} x\n   */\n  function log10(x) {\n    return Math.log(x) / Math.log(10);\n  }\n\n  /**\n   * Get step size for given range and number of steps.\n   *\n   * @param {Object} range\n   * @param {number} range.min\n   * @param {number} range.max\n   * @param {number} steps\n   */\n  function getStepSize(range, steps) {\n\n    var minLinearRange = log10(range.min),\n        maxLinearRange = log10(range.max);\n\n    var absoluteLinearRange = Math.abs(minLinearRange) + Math.abs(maxLinearRange);\n\n    return absoluteLinearRange / steps;\n  }\n\n  /**\n   * @param {Object} range\n   * @param {number} range.min\n   * @param {number} range.max\n   * @param {number} scale\n   */\n  function cap(range, scale) {\n    return Math.max(range.min, Math.min(range.max, scale));\n  }\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   *\n   * @typedef {import('../../util/Types').Point} Point\n   */\n\n  var sign = Math.sign || function(n) {\n    return n >= 0 ? 1 : -1;\n  };\n\n  var RANGE = { min: 0.2, max: 4 },\n      NUM_STEPS = 10;\n\n  var DELTA_THRESHOLD = 0.1;\n\n  var DEFAULT_SCALE = 0.75;\n\n  /**\n   * An implementation of zooming and scrolling within the\n   * {@link Canvas} via the mouse wheel.\n   *\n   * Mouse wheel zooming / scrolling may be disabled using\n   * the {@link toggle(enabled)} method.\n   *\n   * @param {Object} [config]\n   * @param {boolean} [config.enabled=true] default enabled state\n   * @param {number} [config.scale=.75] scroll sensivity\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   */\n  function ZoomScroll(config, eventBus, canvas) {\n\n    config = config || {};\n\n    this._enabled = false;\n\n    this._canvas = canvas;\n    this._container = canvas._container;\n\n    this._handleWheel = bind$2(this._handleWheel, this);\n\n    this._totalDelta = 0;\n    this._scale = config.scale || DEFAULT_SCALE;\n\n    var self = this;\n\n    eventBus.on('canvas.init', function(e) {\n      self._init(config.enabled !== false);\n    });\n  }\n\n  ZoomScroll.$inject = [\n    'config.zoomScroll',\n    'eventBus',\n    'canvas'\n  ];\n\n  /**\n   * @param {Point} delta\n   */\n  ZoomScroll.prototype.scroll = function scroll(delta) {\n    this._canvas.scroll(delta);\n  };\n\n\n  ZoomScroll.prototype.reset = function reset() {\n    this._canvas.zoom('fit-viewport');\n  };\n\n  /**\n   * Zoom depending on delta.\n   *\n   * @param {number} delta\n   * @param {Point} position\n   */\n  ZoomScroll.prototype.zoom = function zoom(delta, position) {\n\n    // zoom with half the step size of stepZoom\n    var stepSize = getStepSize(RANGE, NUM_STEPS * 2);\n\n    // add until threshold reached\n    this._totalDelta += delta;\n\n    if (Math.abs(this._totalDelta) > DELTA_THRESHOLD) {\n      this._zoom(delta, position, stepSize);\n\n      // reset\n      this._totalDelta = 0;\n    }\n  };\n\n\n  ZoomScroll.prototype._handleWheel = function handleWheel(event) {\n\n    // event is already handled by '.djs-scrollable'\n    if (closest(event.target, '.djs-scrollable', true)) {\n      return;\n    }\n\n    var element = this._container;\n\n    event.preventDefault();\n\n    // pinch to zoom is mapped to wheel + ctrlKey = true\n    // in modern browsers (!)\n\n    var isZoom = event.ctrlKey;\n\n    var isHorizontalScroll = event.shiftKey;\n\n    var factor = -1 * this._scale,\n        delta;\n\n    if (isZoom) {\n      factor *= event.deltaMode === 0 ? 0.020 : 0.32;\n    } else {\n      factor *= event.deltaMode === 0 ? 1.0 : 16.0;\n    }\n\n    if (isZoom) {\n      var elementRect = element.getBoundingClientRect();\n\n      var offset = {\n        x: event.clientX - elementRect.left,\n        y: event.clientY - elementRect.top\n      };\n\n      delta = (\n        Math.sqrt(\n          Math.pow(event.deltaY, 2) +\n          Math.pow(event.deltaX, 2)\n        ) * sign(event.deltaY) * factor\n      );\n\n      // zoom in relative to diagram {x,y} coordinates\n      this.zoom(delta, offset);\n    } else {\n\n      if (isHorizontalScroll) {\n        delta = {\n          dx: factor * event.deltaY,\n          dy: 0\n        };\n      } else {\n        delta = {\n          dx: factor * event.deltaX,\n          dy: factor * event.deltaY\n        };\n      }\n\n      this.scroll(delta);\n    }\n  };\n\n  /**\n   * Zoom with fixed step size.\n   *\n   * @param {number} delta Zoom delta (1 for zooming in, -1 for zooming out).\n   * @param {Point} position\n   */\n  ZoomScroll.prototype.stepZoom = function stepZoom(delta, position) {\n\n    var stepSize = getStepSize(RANGE, NUM_STEPS);\n\n    this._zoom(delta, position, stepSize);\n  };\n\n\n  /**\n   * Zoom in/out given a step size.\n   *\n   * @param {number} delta\n   * @param {Point} position\n   * @param {number} stepSize\n   */\n  ZoomScroll.prototype._zoom = function(delta, position, stepSize) {\n    var canvas = this._canvas;\n\n    var direction = delta > 0 ? 1 : -1;\n\n    var currentLinearZoomLevel = log10(canvas.zoom());\n\n    // snap to a proximate zoom step\n    var newLinearZoomLevel = Math.round(currentLinearZoomLevel / stepSize) * stepSize;\n\n    // increase or decrease one zoom step in the given direction\n    newLinearZoomLevel += stepSize * direction;\n\n    // calculate the absolute logarithmic zoom level based on the linear zoom level\n    // (e.g. 2 for an absolute x2 zoom)\n    var newLogZoomLevel = Math.pow(10, newLinearZoomLevel);\n\n    canvas.zoom(cap(RANGE, newLogZoomLevel), position);\n  };\n\n\n  /**\n   * Toggle the zoom scroll ability via mouse wheel.\n   *\n   * @param {boolean} [newEnabled] new enabled state\n   */\n  ZoomScroll.prototype.toggle = function toggle(newEnabled) {\n\n    var element = this._container;\n    var handleWheel = this._handleWheel;\n\n    var oldEnabled = this._enabled;\n\n    if (typeof newEnabled === 'undefined') {\n      newEnabled = !oldEnabled;\n    }\n\n    // only react on actual changes\n    if (oldEnabled !== newEnabled) {\n\n      // add or remove wheel listener based on\n      // changed enabled state\n      event[newEnabled ? 'bind' : 'unbind'](element, 'wheel', handleWheel, false);\n    }\n\n    this._enabled = newEnabled;\n\n    return newEnabled;\n  };\n\n\n  ZoomScroll.prototype._init = function(newEnabled) {\n    this.toggle(newEnabled);\n  };\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var ZoomScrollModule = {\n    __init__: [ 'zoomScroll' ],\n    zoomScroll: [ 'type', ZoomScroll ]\n  };\n\n  /**\n   * @typedef { import('./BaseViewer').BaseViewerOptions } BaseViewerOptions\n   */\n\n  /**\n   * A viewer with mouse and keyboard navigation features.\n   *\n   * @param {BaseViewerOptions} [options]\n   */\n  function NavigatedViewer(options) {\n    Viewer.call(this, options);\n  }\n\n  e(NavigatedViewer, Viewer);\n\n\n  NavigatedViewer.prototype._navigationModules = [\n    KeyboardMoveModule,\n    MoveCanvasModule,\n    ZoomScrollModule\n  ];\n\n  NavigatedViewer.prototype._modules = [].concat(\n    Viewer.prototype._modules,\n    NavigatedViewer.prototype._navigationModules\n  );\n\n  return NavigatedViewer;\n\n}));\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bpmnjs/bpmn-navigated-viewer.production.min.js",
    "content": "/*! bpmn-js - bpmn-navigated-viewer v13.2.1 | Copyright (c) 2014-present, camunda Services GmbH | bpmn.io/license */\n!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).BpmnNavigatedViewer=t()}(this,(function(){\"use strict\";function e(e,t){t&&(e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}const t=Object.prototype.toString,n=Object.prototype.hasOwnProperty;function i(e){return void 0!==e}function r(e){return\"[object Array]\"===t.call(e)}function o(e){return\"[object Object]\"===t.call(e)}function a(e){return\"[object Number]\"===t.call(e)}function s(e){const n=t.call(e);return\"[object Function]\"===n||\"[object AsyncFunction]\"===n||\"[object GeneratorFunction]\"===n||\"[object AsyncGeneratorFunction]\"===n||\"[object Proxy]\"===n}function l(e){return\"[object String]\"===t.call(e)}function p(e,t){return n.call(e,t)}function c(e,t){const n=g(t);let i;return h(e,(function(e,t){if(n(e,t))return i=e,!1})),i}function u(e,t){const n=g(t);let i=[];return h(e,(function(e,t){n(e,t)&&i.push(e)})),i}function h(e,t){let n,i;if(void 0===e)return;const o=r(e)?b:v;for(let r in e)if(p(e,r)&&(n=e[r],i=t(n,o(r)),!1===i))return n}function m(e,t,n){return h(e,(function(e,i){n=t(n,e,i)})),n}function f(e,t){return!!m(e,(function(e,n,i){return e&&t(n,i)}),!0)}function d(e,t){return!!c(e,t)}function y(e){return function(t){return f(e,(function(e,n){return t[n]===e}))}}function g(e){return s(e)?e:t=>t===e}function v(e){return e}function b(e){return Number(e)}function x(e,t){return e.bind(t)}function w(e,...t){return Object.assign(e,...t)}var E=1e3;function _(e,t){var n=this;t=t||E,e.on([\"render.shape\",\"render.connection\"],t,(function(e,t){var i=e.type,r=t.element,o=t.gfx,a=t.attrs;if(n.canRender(r))return\"render.shape\"===i?n.drawShape(o,r,a):n.drawConnection(o,r,a)})),e.on([\"render.getShapePath\",\"render.getConnectionPath\"],t,(function(e,t){if(n.canRender(t))return\"render.getShapePath\"===e.type?n.getShapePath(t):n.getConnectionPath(t)}))}function A(e,t){var n=S(e);return n&&\"function\"==typeof n.$instanceOf&&n.$instanceOf(t)}function S(e){return e&&e.businessObject||e}function R(e){return e&&e.di}function C(e,t){return!A(e,\"bpmn:CallActivity\")&&(A(e,\"bpmn:SubProcess\")?!(!(t=t||R(e))||!A(t,\"bpmndi:BPMNPlane\"))||t&&!!t.isExpanded:!A(e,\"bpmn:Participant\")||!!S(e).processRef)}_.prototype.canRender=function(e){},_.prototype.drawShape=function(e,t){},_.prototype.drawConnection=function(e,t){},_.prototype.getShapePath=function(e){},_.prototype.getConnectionPath=function(e){};var M={width:90,height:20},k=15;function P(e){var t=e.length/2-1,n=e[Math.floor(t)],i=e[Math.ceil(t+.01)],r=function(e){var t=e.length/2-1,n=e[Math.floor(t)],i=e[Math.ceil(t+.01)];return{x:n.x+(i.x-n.x)/2,y:n.y+(i.y-n.y)/2}}(e),o=Math.atan((i.y-n.y)/(i.x-n.x)),a=r.x,s=r.y;return Math.abs(o)<Math.PI/2?s-=k:a+=k,{x:a,y:s}}function D(e,t){var n,i,r,o=e.label;return o&&o.bounds?(r=o.bounds,i={width:Math.max(M.width,r.width),height:r.height},n={x:r.x+r.width/2,y:r.y+r.height/2}):(n=function(e){return e.waypoints?P(e.waypoints):A(e,\"bpmn:Group\")?{x:e.x+e.width/2,y:e.y+M.height/2}:{x:e.x+e.width/2,y:e.y+e.height+M.height/2}}(t),i=M),w({x:n.x-i.width/2,y:n.y-i.height/2},i)}function T(e){var t=e.businessObject,n=function(e){return A(e,\"bpmn:FlowElement\")||A(e,\"bpmn:Participant\")||A(e,\"bpmn:Lane\")||A(e,\"bpmn:SequenceFlow\")||A(e,\"bpmn:MessageFlow\")||A(e,\"bpmn:DataInput\")||A(e,\"bpmn:DataOutput\")?\"name\":A(e,\"bpmn:TextAnnotation\")?\"text\":A(e,\"bpmn:Group\")?\"categoryValueRef\":void 0}(t);if(n)return\"categoryValueRef\"===n?function(e){var t=e.categoryValueRef;return t&&t.value||\"\"}(t):t[n]||\"\"}function O(e,t){return t.appendChild(function(e,t){if(e.ownerDocument!==t.ownerDocument)try{return t.ownerDocument.importNode(e,!0)}catch(e){}return e}(e,t))}function N(e,t){return O(t,e),e}var B=2,L={\"alignment-baseline\":1,\"baseline-shift\":1,clip:1,\"clip-path\":1,\"clip-rule\":1,color:1,\"color-interpolation\":1,\"color-interpolation-filters\":1,\"color-profile\":1,\"color-rendering\":1,cursor:1,direction:1,display:1,\"dominant-baseline\":1,\"enable-background\":1,fill:1,\"fill-opacity\":1,\"fill-rule\":1,filter:1,\"flood-color\":1,\"flood-opacity\":1,font:1,\"font-family\":1,\"font-size\":B,\"font-size-adjust\":1,\"font-stretch\":1,\"font-style\":1,\"font-variant\":1,\"font-weight\":1,\"glyph-orientation-horizontal\":1,\"glyph-orientation-vertical\":1,\"image-rendering\":1,kerning:1,\"letter-spacing\":1,\"lighting-color\":1,marker:1,\"marker-end\":1,\"marker-mid\":1,\"marker-start\":1,mask:1,opacity:1,overflow:1,\"pointer-events\":1,\"shape-rendering\":1,\"stop-color\":1,\"stop-opacity\":1,stroke:1,\"stroke-dasharray\":1,\"stroke-dashoffset\":1,\"stroke-linecap\":1,\"stroke-linejoin\":1,\"stroke-miterlimit\":1,\"stroke-opacity\":1,\"stroke-width\":B,\"text-anchor\":1,\"text-decoration\":1,\"text-rendering\":1,\"unicode-bidi\":1,visibility:1,\"word-spacing\":1,\"writing-mode\":1};function I(e,t,n){var i=t.replace(/([a-z])([A-Z])/g,\"$1-$2\").toLowerCase(),r=L[i];r?(r===B&&\"number\"==typeof n&&(n=String(n)+\"px\"),e.style[i]=n):e.setAttributeNS(null,t,n)}function j(e,t,n){if(\"string\"==typeof t){if(void 0===n)return function(e,t){return L[t]?e.style[t]:e.getAttributeNS(null,t)}(e,t);I(e,t,n)}else!function(e,t){var n,i,r=Object.keys(t);for(n=0;i=r[n];n++)I(e,i,t[i])}(e,t);return e}const F=Object.prototype.toString;function V(e){return new W(e)}function W(e){if(!e||!e.nodeType)throw new Error(\"A DOM element reference is required\");this.el=e,this.list=e.classList}function z(e){var t=e.parentNode;return t&&t.removeChild(e),e}function G(e){for(var t;t=e.firstChild;)z(t);return e}W.prototype.add=function(e){return this.list.add(e),this},W.prototype.remove=function(e){return\"[object RegExp]\"==F.call(e)?this.removeMatching(e):(this.list.remove(e),this)},W.prototype.removeMatching=function(e){const t=this.array();for(let n=0;n<t.length;n++)e.test(t[n])&&this.remove(t[n]);return this},W.prototype.toggle=function(e,t){return void 0!==t?t!==this.list.toggle(e,t)&&this.list.toggle(e):this.list.toggle(e),this},W.prototype.array=function(){return Array.from(this.list)},W.prototype.has=W.prototype.contains=function(e){return this.list.contains(e)};var $={svg:\"http://www.w3.org/2000/svg\"},H='<svg xmlns=\"'+$.svg+'\"';function K(e){var t=!1;\"<svg\"===e.substring(0,4)?-1===e.indexOf($.svg)&&(e=H+e.substring(4)):(e=H+\">\"+e+\"</svg>\",t=!0);var n=function(e){var t;return(t=new DOMParser).async=!1,t.parseFromString(e,\"text/xml\")}(e);if(!t)return n;for(var i=document.createDocumentFragment(),r=n.firstChild;r.firstChild;)i.appendChild(r.firstChild);return i}function U(e,t){var n;return\"<\"===e.charAt(0)?(n=K(e).firstChild,n=document.importNode(n,!0)):n=document.createElementNS($.svg,e),t&&j(n,t),n}var q=null;function Y(){return null===q&&(q=U(\"svg\")),q}function X(e,t){var n,i,r=Object.keys(t);for(n=0;i=r[n];n++)e[i]=t[i];return e}function Z(e){return e?Y().createSVGTransformFromMatrix(e):Y().createSVGTransform()}var J=/([&<>]{1})/g,Q=/([\\n\\r\"]{1})/g,ee={\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"'\"};function te(e,t){return e.replace(t,(function(e,t){return ee[t]||t}))}function ne(e,t){var n,i,r,o,a;switch(e.nodeType){case 3:t.push(te(e.textContent,J));break;case 1:if(t.push(\"<\",e.tagName),e.hasAttributes())for(n=0,i=(r=e.attributes).length;n<i;++n)o=r.item(n),t.push(\" \",o.name,'=\"',te(o.value,Q),'\"');if(e.hasChildNodes()){for(t.push(\">\"),n=0,i=(a=e.childNodes).length;n<i;++n)ne(a.item(n),t);t.push(\"</\",e.tagName,\">\")}else t.push(\"/>\");break;case 8:t.push(\"\\x3c!--\",te(e.nodeValue,J),\"--\\x3e\");break;case 4:t.push(\"<![CDATA[\",e.nodeValue,\"]]>\");break;default:throw new Error(\"unable to handle node \"+e.nodeType)}return t}function ie(e,t){var n=K(t);if(G(e),t){(function(e){return\"#document-fragment\"===e.nodeName})(n)||(n=n.documentElement);for(var i,r=(i=n.childNodes,Array.prototype.slice.call(i)),o=0;o<r.length;o++)O(r[o],e)}}function re(e,t){if(void 0!==t){try{ie(e,t)}catch(e){throw new Error(\"error parsing SVG: \"+e.message)}return e}return function(e){for(var t=e.firstChild,n=[];t;)ne(t,n),t=t.nextSibling;return n.join(\"\")}(e)}function oe(e,t){return t instanceof SVGMatrix?e.createSVGTransformFromMatrix(t):t}function ae(e,t){var n=e.transform.baseVal;return t&&(Array.isArray(t)||(t=[t]),function(e,t){var n,i;for(e.clear(),n=0;i=t[n];n++)e.appendItem(oe(e,i))}(n,t)),n.consolidate()}function se(e){return e.flat().join(\",\").replace(/,?([A-z]),?/g,\"$1\")}function le(e){return[\"L\",e.x,e.y]}function pe(e,t){const n=e.length,i=[(r=e[0],[\"M\",r.x,r.y])];var r,o,a,s;for(let r=1;r<n;r++){const n=e[r-1],l=e[r],p=e[r+1];if(!p||!t){i.push(le(l));continue}const c=Math.min(t,ue(l.x-n.x,l.y-n.y),ue(p.x-l.x,p.y-l.y));if(!c){i.push(le(l));continue}const u=ce(l,n,c),h=ce(l,n,.5*c),m=ce(l,p,c),f=ce(l,p,.5*c);i.push(le(u)),i.push((a=f,s=m,[\"C\",(o=h).x,o.y,a.x,a.y,s.x,s.y]))}return i}function ce(e,t,n){const i=t.x-e.x,r=t.y-e.y,o=n/ue(i,r);return{x:e.x+i*o,y:e.y+r*o}}function ue(e,t){return Math.sqrt(Math.pow(e,2)+Math.pow(t,2))}function he(e,t,n){a(t)&&(n=t,t=null),t||(t={});const i=U(\"path\",t);return a(n)&&(i.dataset.cornerRadius=String(n)),me(i,e)}function me(e,t){return j(e,{d:se(pe(t,parseInt(e.dataset.cornerRadius,10)||0))}),e}var fe=\"hsl(225, 10%, 15%)\";function de(e,t){return d(e.eventDefinitions,(function(e){return e.$type===t}))}function ye(e,t){var n=R(e);return n.get(\"color:background-color\")||n.get(\"bioc:fill\")||t||\"white\"}function ge(e,t){var n=R(e);return n.get(\"color:border-color\")||n.get(\"bioc:stroke\")||t||fe}function ve(e,t,n){var i=R(e).get(\"label\");return i&&i.get(\"color:color\")||t||ge(e,n)}function be(e,t){return t.forEach((function(t){t&&\"string\"!=typeof t&&!Array.isArray(t)&&Object.keys(t).forEach((function(n){if(\"default\"!==n&&!(n in e)){var i=Object.getOwnPropertyDescriptor(t,n);Object.defineProperty(e,n,i.get?i:{enumerable:!0,get:function(){return t[n]}})}}))})),Object.freeze(e)}const xe=Object.prototype.toString,we=Object.prototype.hasOwnProperty;function Ee(e,t){return we.call(e,t)}function _e(e,t){let n,i;if(void 0===e)return;const r=function(e){return\"[object Array]\"===xe.call(e)}(e)?Se:Ae;for(let o in e)if(Ee(e,o)&&(n=e[o],i=t(n,r(o)),!1===i))return n}function Ae(e){return e}function Se(e){return Number(e)}function Re(e,...t){const n=e.style;return _e(t,(function(e){e&&_e(e,(function(e,t){n[t]=e}))})),e}const Ce=Object.prototype.toString;function Me(e){return new ke(e)}function ke(e){if(!e||!e.nodeType)throw new Error(\"A DOM element reference is required\");this.el=e,this.list=e.classList}function Pe(e){for(var t;e.childNodes.length;)t=e.childNodes[0],e.removeChild(t);return e}function De(e,t){return e&&\"function\"==typeof e.matches&&e.matches(t)}function Te(e,t,n){for(var i=n?e:e.parentNode;i&&i.nodeType!==document.DOCUMENT_NODE&&i.nodeType!==document.DOCUMENT_FRAGMENT_NODE;){if(De(i,t))return i;i=i.parentNode}return De(i,t)?i:null}ke.prototype.add=function(e){return this.list.add(e),this},ke.prototype.remove=function(e){return\"[object RegExp]\"==Ce.call(e)?this.removeMatching(e):(this.list.remove(e),this)},ke.prototype.removeMatching=function(e){const t=this.array();for(let n=0;n<t.length;n++)e.test(t[n])&&this.remove(t[n]);return this},ke.prototype.toggle=function(e,t){return void 0!==t?t!==this.list.toggle(e,t)&&this.list.toggle(e):this.list.toggle(e),this},ke.prototype.array=function(){return Array.from(this.list)},ke.prototype.has=ke.prototype.contains=function(e){return this.list.contains(e)};var Oe,Ne,Be,Le={};function Ie(){Oe=window.addEventListener?\"addEventListener\":\"attachEvent\",Ne=window.removeEventListener?\"removeEventListener\":\"detachEvent\",Be=\"addEventListener\"!==Oe?\"on\":\"\"}var je=be({__proto__:null,bind:Le.bind=function(e,t,n,i){return Oe||Ie(),e[Oe](Be+t,n,i||!1),n},unbind:Le.unbind=function(e,t,n,i){return Ne||Ie(),e[Ne](Be+t,n,i||!1),n},default:Le},[Le]),Fe=[\"focus\",\"blur\"];var Ve,We={bind:function(e,t,n,i,r){return-1!==Fe.indexOf(n)&&(r=!0),je.bind(e,n,(function(n){var r=n.target||n.srcElement;n.delegateTarget=Te(r,t,!0),n.delegateTarget&&i.call(e,n)}),r)},unbind:function(e,t,n,i){return-1!==Fe.indexOf(t)&&(i=!0),je.unbind(e,t,n,i)}},ze=function(e,t){if(\"string\"!=typeof e)throw new TypeError(\"String expected\");t||(t=document);var n=/<([\\w:]+)/.exec(e);if(!n)return t.createTextNode(e);e=e.replace(/^\\s+|\\s+$/g,\"\");var i=n[1];if(\"body\"==i){return(r=t.createElement(\"html\")).innerHTML=e,r.removeChild(r.lastChild)}var r,o=Object.prototype.hasOwnProperty.call($e,i)?$e[i]:$e._default,a=o[0],s=o[1],l=o[2];(r=t.createElement(\"div\")).innerHTML=s+e+l;for(;a--;)r=r.lastChild;if(r.firstChild==r.lastChild)return r.removeChild(r.firstChild);var p=t.createDocumentFragment();for(;r.firstChild;)p.appendChild(r.removeChild(r.firstChild));return p},Ge=!1;\"undefined\"!=typeof document&&((Ve=document.createElement(\"div\")).innerHTML='  <link/><table></table><a href=\"/a\">a</a><input type=\"checkbox\"/>',Ge=!Ve.getElementsByTagName(\"link\").length,Ve=void 0);var $e={legend:[1,\"<fieldset>\",\"</fieldset>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],col:[2,\"<table><tbody></tbody><colgroup>\",\"</colgroup></table>\"],_default:Ge?[1,\"X<div>\",\"</div>\"]:[0,\"\",\"\"]};$e.td=$e.th=[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],$e.option=$e.optgroup=[1,'<select multiple=\"multiple\">',\"</select>\"],$e.thead=$e.tbody=$e.colgroup=$e.caption=$e.tfoot=[1,\"<table>\",\"</table>\"],$e.polyline=$e.ellipse=$e.polygon=$e.circle=$e.text=$e.line=$e.path=$e.rect=$e.g=[1,'<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\">',\"</svg>\"];var He=ze;function Ke(e,t){return(t=t||document).querySelector(e)}function Ue(e){e.parentNode&&e.parentNode.removeChild(e)}function qe(e,t,n,i,r){var o=Z();o.setTranslate(t,n);var a=Z();a.setRotate(i||0,0,0);var s=Z();s.setScale(r||1,r||1),ae(e,[o,a,s])}function Ye(e,t,n){var i=Z();i.setTranslate(t,n),ae(e,i)}var Xe=function(e,t){return e(t={exports:{}},t.exports),t.exports}((function(e){var t=e.exports=function(e,n){if(n||(n=16),void 0===e&&(e=128),e<=0)return\"0\";for(var i=Math.log(Math.pow(2,e))/Math.log(n),r=2;i===1/0;r*=2)i=Math.log(Math.pow(2,e/r))/Math.log(n)*r;var o=i-Math.floor(i),a=\"\";for(r=0;r<Math.floor(i);r++){a=Math.floor(Math.random()*n).toString(n)+a}if(o){var s=Math.pow(n,o);a=Math.floor(Math.random()*s).toString(n)+a}var l=parseInt(a,n);return l!==1/0&&l>=Math.pow(2,e)?t(e,n):a};t.rack=function(e,n,i){var r=function(r){var a=0;do{if(a++>10){if(!i)throw new Error(\"too many ID collisions, use more bits\");e+=i}var s=t(e,n)}while(Object.hasOwnProperty.call(o,s));return o[s]=r,s},o=r.hats={};return r.get=function(e){return r.hats[e]},r.set=function(e,t){return r.hats[e]=t,r},r.bits=e||128,r.base=n||16,r}}));function Ze(e){if(!(this instanceof Ze))return new Ze(e);e=e||[128,36,1],this._seed=e.length?Xe.rack(e[0],e[1],e[2]):e}Ze.prototype.next=function(e){return this._seed(e||!0)},Ze.prototype.nextPrefixed=function(e,t){var n;do{n=e+this.next(!0)}while(this.assigned(n));return this.claim(n,t),n},Ze.prototype.claim=function(e,t){this._seed.set(e,t||!0)},Ze.prototype.assigned=function(e){return this._seed.get(e)||!1},Ze.prototype.unclaim=function(e){delete this._seed.hats[e]},Ze.prototype.clear=function(){var e,t=this._seed.hats;for(e in t)this.unclaim(e)};var Je=new Ze,Qe=.95;function et(e,t,n,i,r,a,s){_.call(this,t,s);var l=e&&e.defaultFillColor,p=e&&e.defaultStrokeColor,c=e&&e.defaultLabelColor,u=Je.next(),m={};function f(e){return n.computeStyle(e,{strokeLinecap:\"round\",strokeLinejoin:\"round\",stroke:fe,strokeWidth:2,fill:\"white\"})}function d(e){return n.computeStyle(e,[\"no-fill\"],{strokeLinecap:\"round\",strokeLinejoin:\"round\",stroke:fe,strokeWidth:2})}function y(e,t){var{ref:n={x:0,y:0},scale:i=1,element:o}=t,a=U(\"marker\",{id:e,viewBox:\"0 0 20 20\",refX:n.x,refY:n.y,markerWidth:20*i,markerHeight:20*i,orient:\"auto\"});N(a,o);var s=Ke(\"defs\",r._svg);s||(s=U(\"defs\"),N(r._svg,s)),N(s,a),m[e]=a}function g(e){return e.replace(/[^0-9a-zA-Z]+/g,\"_\")}function v(e,t,n){var i=e+\"-\"+g(t)+\"-\"+g(n)+\"-\"+u;return m[i]||function(e,t,n,i){if(\"sequenceflow-end\"===t){y(e,{element:U(\"path\",{d:\"M 1 5 L 11 10 L 1 15 Z\",...f({fill:i,stroke:i,strokeWidth:1})}),ref:{x:11,y:10},scale:.5})}if(\"messageflow-start\"===t){y(e,{element:U(\"circle\",{cx:6,cy:6,r:3.5,...f({fill:n,stroke:i,strokeWidth:1,strokeDasharray:[1e4,1]})}),ref:{x:6,y:6}})}if(\"messageflow-end\"===t){y(e,{element:U(\"path\",{d:\"m 1 5 l 0 -3 l 7 3 l -7 3 z\",...f({fill:n,stroke:i,strokeWidth:1,strokeDasharray:[1e4,1]})}),ref:{x:8.5,y:5}})}if(\"association-start\"===t){y(e,{element:U(\"path\",{d:\"M 11 5 L 1 10 L 11 15\",...d({fill:\"none\",stroke:i,strokeWidth:1.5,strokeDasharray:[1e4,1]})}),ref:{x:1,y:10},scale:.5})}if(\"association-end\"===t){y(e,{element:U(\"path\",{d:\"M 1 5 L 11 10 L 1 15\",...d({fill:\"none\",stroke:i,strokeWidth:1.5,strokeDasharray:[1e4,1]})}),ref:{x:11,y:10},scale:.5})}if(\"conditional-flow-marker\"===t){y(e,{element:U(\"path\",{d:\"M 0 10 L 8 6 L 16 10 L 8 14 Z\",...f({fill:n,stroke:i})}),ref:{x:-1,y:10},scale:.5})}if(\"conditional-default-flow-marker\"===t){y(e,{element:U(\"path\",{d:\"M 6 4 L 10 16\",...f({stroke:i})}),ref:{x:0,y:10},scale:.5})}}(i,e,t,n),\"url(#\"+i+\")\"}function b(e,t,n,i,r){o(i)&&(r=i,i=0),i=i||0,\"none\"===(r=f(r)).fill&&delete r.fillOpacity;var a=U(\"circle\",{cx:t/2,cy:n/2,r:Math.round((t+n)/4-i),...r});return N(e,a),a}function x(e,t,n,i,r,a){o(r)&&(a=r,r=0),r=r||0,a=f(a);var s=U(\"rect\",{x:r,y:r,width:t-2*r,height:n-2*r,rx:i,ry:i,...a});return N(e,s),s}function E(e,t,n,i){var r=he(t,n=d(n),i);return N(e,r),r}function A(e,t,n){return E(e,t,n,5)}function M(e,t,n){n=d(n);var i=U(\"path\",{...n,d:t});return N(e,i),i}function k(e,t,n,i){return M(t,n,w({\"data-marker\":e},i))}function P(e){return F[e]}function D(e){return function(t,n,i){return P(e)(t,n,i)}}function O(e,t){var n=S(e),i=function(e){return\"bpmn:IntermediateThrowEvent\"===e.$type||\"bpmn:EndEvent\"===e.$type}(n);return n.eventDefinitions&&n.eventDefinitions.length>1?n.parallelMultiple?P(\"bpmn:ParallelMultipleEventDefinition\")(t,e,i):P(\"bpmn:MultipleEventDefinition\")(t,e,i):de(n,\"bpmn:MessageEventDefinition\")?P(\"bpmn:MessageEventDefinition\")(t,e,i):de(n,\"bpmn:TimerEventDefinition\")?P(\"bpmn:TimerEventDefinition\")(t,e,i):de(n,\"bpmn:ConditionalEventDefinition\")?P(\"bpmn:ConditionalEventDefinition\")(t,e):de(n,\"bpmn:SignalEventDefinition\")?P(\"bpmn:SignalEventDefinition\")(t,e,i):de(n,\"bpmn:EscalationEventDefinition\")?P(\"bpmn:EscalationEventDefinition\")(t,e,i):de(n,\"bpmn:LinkEventDefinition\")?P(\"bpmn:LinkEventDefinition\")(t,e,i):de(n,\"bpmn:ErrorEventDefinition\")?P(\"bpmn:ErrorEventDefinition\")(t,e,i):de(n,\"bpmn:CancelEventDefinition\")?P(\"bpmn:CancelEventDefinition\")(t,e,i):de(n,\"bpmn:CompensateEventDefinition\")?P(\"bpmn:CompensateEventDefinition\")(t,e,i):de(n,\"bpmn:TerminateEventDefinition\")?P(\"bpmn:TerminateEventDefinition\")(t,e,i):null}function B(e,t,n){n=w({size:{width:100}},n);var i=a.createText(t||\"\",n);return V(i).add(\"djs-label\"),N(e,i),i}function L(e,t,n){return B(e,S(t).name,{box:t,align:n,padding:7,style:{fill:ve(t,c,p)}})}function I(e,t,n){qe(B(e,t,{box:{height:30,width:n.height},align:\"center-middle\",style:{fill:ve(n,c,p)}}),0,-(-1*n.height),270)}var F=this.handlers={\"bpmn:Event\":function(e,t,n){return\"fillOpacity\"in n||(n.fillOpacity=Qe),b(e,t.width,t.height,n)},\"bpmn:StartEvent\":function(e,t,n){var i={fill:ye(t,l),stroke:ge(t,p)};S(t).isInterrupting||(i={strokeDasharray:\"6\",fill:ye(t,l),stroke:ge(t,p)});var r=P(\"bpmn:Event\")(e,t,i);return n&&!1===n.renderIcon||O(t,e),r},\"bpmn:MessageEventDefinition\":function(e,t,n){return M(e,i.getScaledPath(\"EVENT_MESSAGE\",{xScaleFactor:.9,yScaleFactor:.9,containerWidth:t.width,containerHeight:t.height,position:{mx:.235,my:.315}}),{strokeWidth:1,fill:n?ge(t,p):ye(t,l),stroke:n?ye(t,l):ge(t,p)})},\"bpmn:TimerEventDefinition\":function(e,t){var n=b(e,t.width,t.height,.2*t.height,{strokeWidth:2,fill:ye(t,l),stroke:ge(t,p)});M(e,i.getScaledPath(\"EVENT_TIMER_WH\",{xScaleFactor:.75,yScaleFactor:.75,containerWidth:t.width,containerHeight:t.height,position:{mx:.5,my:.5}}),{strokeWidth:2,stroke:ge(t,p)});for(var r=0;r<12;r++){var o=i.getScaledPath(\"EVENT_TIMER_LINE\",{xScaleFactor:.75,yScaleFactor:.75,containerWidth:t.width,containerHeight:t.height,position:{mx:.5,my:.5}}),a=t.width/2;M(e,o,{strokeWidth:1,transform:\"rotate(\"+30*r+\",\"+t.height/2+\",\"+a+\")\",stroke:ge(t,p)})}return n},\"bpmn:EscalationEventDefinition\":function(e,t,n){return M(e,i.getScaledPath(\"EVENT_ESCALATION\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:.5,my:.2}}),{strokeWidth:1,fill:n?ge(t,p):\"none\",stroke:ge(t,p)})},\"bpmn:ConditionalEventDefinition\":function(e,t){return M(e,i.getScaledPath(\"EVENT_CONDITIONAL\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:.5,my:.222}}),{strokeWidth:1,stroke:ge(t,p)})},\"bpmn:LinkEventDefinition\":function(e,t,n){return M(e,i.getScaledPath(\"EVENT_LINK\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:.57,my:.263}}),{strokeWidth:1,fill:n?ge(t,p):\"none\",stroke:ge(t,p)})},\"bpmn:ErrorEventDefinition\":function(e,t,n){return M(e,i.getScaledPath(\"EVENT_ERROR\",{xScaleFactor:1.1,yScaleFactor:1.1,containerWidth:t.width,containerHeight:t.height,position:{mx:.2,my:.722}}),{strokeWidth:1,fill:n?ge(t,p):\"none\",stroke:ge(t,p)})},\"bpmn:CancelEventDefinition\":function(e,t,n){var r=M(e,i.getScaledPath(\"EVENT_CANCEL_45\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:.638,my:-.055}}),{strokeWidth:1,fill:n?ge(t,p):\"none\",stroke:ge(t,p)});return function(e,t){var n=Z();n.setRotate(t,0,0),ae(e,n)}(r,45),r},\"bpmn:CompensateEventDefinition\":function(e,t,n){return M(e,i.getScaledPath(\"EVENT_COMPENSATION\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:.22,my:.5}}),{strokeWidth:1,fill:n?ge(t,p):\"none\",stroke:ge(t,p)})},\"bpmn:SignalEventDefinition\":function(e,t,n){return M(e,i.getScaledPath(\"EVENT_SIGNAL\",{xScaleFactor:.9,yScaleFactor:.9,containerWidth:t.width,containerHeight:t.height,position:{mx:.5,my:.2}}),{strokeWidth:1,fill:n?ge(t,p):\"none\",stroke:ge(t,p)})},\"bpmn:MultipleEventDefinition\":function(e,t,n){return M(e,i.getScaledPath(\"EVENT_MULTIPLE\",{xScaleFactor:1.1,yScaleFactor:1.1,containerWidth:t.width,containerHeight:t.height,position:{mx:.222,my:.36}}),{strokeWidth:1,fill:n?ge(t,p):\"none\"})},\"bpmn:ParallelMultipleEventDefinition\":function(e,t){return M(e,i.getScaledPath(\"EVENT_PARALLEL_MULTIPLE\",{xScaleFactor:1.2,yScaleFactor:1.2,containerWidth:t.width,containerHeight:t.height,position:{mx:.458,my:.194}}),{strokeWidth:1,fill:ge(t,p),stroke:ge(t,p)})},\"bpmn:EndEvent\":function(e,t,n){var i=P(\"bpmn:Event\")(e,t,{strokeWidth:4,fill:ye(t,l),stroke:ge(t,p)});return n&&!1===n.renderIcon||O(t,e),i},\"bpmn:TerminateEventDefinition\":function(e,t){return b(e,t.width,t.height,8,{strokeWidth:4,fill:ge(t,p),stroke:ge(t,p)})},\"bpmn:IntermediateEvent\":function(e,t,n){var i=P(\"bpmn:Event\")(e,t,{strokeWidth:1.5,fill:ye(t,l),stroke:ge(t,p)});return b(e,t.width,t.height,3,{strokeWidth:1.5,fill:ye(t,\"none\"),stroke:ge(t,p)}),n&&!1===n.renderIcon||O(t,e),i},\"bpmn:IntermediateCatchEvent\":D(\"bpmn:IntermediateEvent\"),\"bpmn:IntermediateThrowEvent\":D(\"bpmn:IntermediateEvent\"),\"bpmn:Activity\":function(e,t,n){return\"fillOpacity\"in(n=n||{})||(n.fillOpacity=Qe),x(e,t.width,t.height,10,n)},\"bpmn:Task\":function(e,t){var n={fill:ye(t,l),stroke:ge(t,p)},i=P(\"bpmn:Activity\")(e,t,n);return L(e,t,\"center-middle\"),W(e,t),i},\"bpmn:ServiceTask\":function(e,t){var n=P(\"bpmn:Task\")(e,t);return M(e,i.getScaledPath(\"TASK_TYPE_SERVICE\",{abspos:{x:12,y:18}}),{strokeWidth:1,fill:ye(t,l),stroke:ge(t,p)}),M(e,i.getScaledPath(\"TASK_TYPE_SERVICE_FILL\",{abspos:{x:17.2,y:18}}),{strokeWidth:0,fill:ye(t,l)}),M(e,i.getScaledPath(\"TASK_TYPE_SERVICE\",{abspos:{x:17,y:22}}),{strokeWidth:1,fill:ye(t,l),stroke:ge(t,p)}),n},\"bpmn:UserTask\":function(e,t){var n=P(\"bpmn:Task\")(e,t);return M(e,i.getScaledPath(\"TASK_TYPE_USER_1\",{abspos:{x:15,y:12}}),{strokeWidth:.5,fill:ye(t,l),stroke:ge(t,p)}),M(e,i.getScaledPath(\"TASK_TYPE_USER_2\",{abspos:{x:15,y:12}}),{strokeWidth:.5,fill:ye(t,l),stroke:ge(t,p)}),M(e,i.getScaledPath(\"TASK_TYPE_USER_3\",{abspos:{x:15,y:12}}),{strokeWidth:.5,fill:ge(t,p),stroke:ge(t,p)}),n},\"bpmn:ManualTask\":function(e,t){var n=P(\"bpmn:Task\")(e,t);return M(e,i.getScaledPath(\"TASK_TYPE_MANUAL\",{abspos:{x:17,y:15}}),{strokeWidth:.5,fill:ye(t,l),stroke:ge(t,p)}),n},\"bpmn:SendTask\":function(e,t){var n=P(\"bpmn:Task\")(e,t);return M(e,i.getScaledPath(\"TASK_TYPE_SEND\",{xScaleFactor:1,yScaleFactor:1,containerWidth:21,containerHeight:14,position:{mx:.285,my:.357}}),{strokeWidth:1,fill:ge(t,p),stroke:ye(t,l)}),n},\"bpmn:ReceiveTask\":function(e,t){var n,r=S(t),o=P(\"bpmn:Task\")(e,t);return r.instantiate?(b(e,28,28,4.4,{strokeWidth:1}),n=i.getScaledPath(\"TASK_TYPE_INSTANTIATING_SEND\",{abspos:{x:7.77,y:9.52}})):n=i.getScaledPath(\"TASK_TYPE_SEND\",{xScaleFactor:.9,yScaleFactor:.9,containerWidth:21,containerHeight:14,position:{mx:.3,my:.4}}),M(e,n,{strokeWidth:1,fill:ye(t,l),stroke:ge(t,p)}),o},\"bpmn:ScriptTask\":function(e,t){var n=P(\"bpmn:Task\")(e,t);return M(e,i.getScaledPath(\"TASK_TYPE_SCRIPT\",{abspos:{x:15,y:20}}),{strokeWidth:1,stroke:ge(t,p)}),n},\"bpmn:BusinessRuleTask\":function(e,t){var n=P(\"bpmn:Task\")(e,t);return j(M(e,i.getScaledPath(\"TASK_TYPE_BUSINESS_RULE_HEADER\",{abspos:{x:8,y:8}})),{strokeWidth:1,fill:ye(t,\"#aaaaaa\"),stroke:ge(t,p)}),j(M(e,i.getScaledPath(\"TASK_TYPE_BUSINESS_RULE_MAIN\",{abspos:{x:8,y:8}})),{strokeWidth:1,stroke:ge(t,p)}),n},\"bpmn:SubProcess\":function(e,t,n){n={fill:ye(t,l),stroke:ge(t,p),...n};var i=P(\"bpmn:Activity\")(e,t,n),r=C(t);return function(e){return e&&!!S(e).triggeredByEvent}(t)&&j(i,{strokeDasharray:\"0, 5.5\",strokeWidth:2.5}),L(e,t,r?\"center-top\":\"center-middle\"),r?W(e,t):W(e,t,[\"SubProcessMarker\"]),i},\"bpmn:AdHocSubProcess\":function(e,t){return P(\"bpmn:SubProcess\")(e,t)},\"bpmn:Transaction\":function(e,t){var i=P(\"bpmn:SubProcess\")(e,t,{strokeWidth:1.5}),r=n.style([\"no-fill\",\"no-events\"],{stroke:ge(t,p),strokeWidth:1.5});return x(e,t.width,t.height,7,3,r),i},\"bpmn:CallActivity\":function(e,t){return P(\"bpmn:SubProcess\")(e,t,{strokeWidth:5})},\"bpmn:Participant\":function(e,t){var n={fillOpacity:Qe,fill:ye(t,l),stroke:ge(t,p),strokeWidth:1.5},i=P(\"bpmn:Lane\")(e,t,n);C(t)?(E(e,[{x:30,y:0},{x:30,y:t.height}],{stroke:ge(t,p),strokeWidth:1.5}),I(e,S(t).name,t)):B(e,S(t).name,{box:t,align:\"center-middle\",style:{fill:ve(t,c,p)}});return!!S(t).participantMultiplicity&&P(\"ParticipantMultiplicityMarker\")(e,t),i},\"bpmn:Lane\":function(e,t,n){var i=x(e,t.width,t.height,0,{fill:ye(t,l),fillOpacity:.35,stroke:ge(t,p),strokeWidth:1.5,...n}),r=S(t);\"bpmn:Lane\"===r.$type&&I(e,r.name,t);return i},\"bpmn:InclusiveGateway\":function(e,t){var n=P(\"bpmn:Gateway\")(e,t);return b(e,t.width,t.height,.24*t.height,{strokeWidth:2.5,fill:ye(t,l),stroke:ge(t,p)}),n},\"bpmn:ExclusiveGateway\":function(e,t){var n=P(\"bpmn:Gateway\")(e,t),r=i.getScaledPath(\"GATEWAY_EXCLUSIVE\",{xScaleFactor:.4,yScaleFactor:.4,containerWidth:t.width,containerHeight:t.height,position:{mx:.32,my:.3}});return R(t).isMarkerVisible&&M(e,r,{strokeWidth:1,fill:ge(t,p),stroke:ge(t,p)}),n},\"bpmn:ComplexGateway\":function(e,t){var n=P(\"bpmn:Gateway\")(e,t);return M(e,i.getScaledPath(\"GATEWAY_COMPLEX\",{xScaleFactor:.5,yScaleFactor:.5,containerWidth:t.width,containerHeight:t.height,position:{mx:.46,my:.26}}),{strokeWidth:1,fill:ge(t,p),stroke:ge(t,p)}),n},\"bpmn:ParallelGateway\":function(e,t){var n=P(\"bpmn:Gateway\")(e,t);return M(e,i.getScaledPath(\"GATEWAY_PARALLEL\",{xScaleFactor:.6,yScaleFactor:.6,containerWidth:t.width,containerHeight:t.height,position:{mx:.46,my:.2}}),{strokeWidth:1,fill:ge(t,p),stroke:ge(t,p)}),n},\"bpmn:EventBasedGateway\":function(e,t){var n=S(t),r=P(\"bpmn:Gateway\")(e,t);b(e,t.width,t.height,.2*t.height,{strokeWidth:1,fill:\"none\",stroke:ge(t,p)});var o=n.eventGatewayType,a=!!n.instantiate;if(\"Parallel\"===o){var s=i.getScaledPath(\"GATEWAY_PARALLEL\",{xScaleFactor:.4,yScaleFactor:.4,containerWidth:t.width,containerHeight:t.height,position:{mx:.474,my:.296}});M(e,s,{strokeWidth:1,fill:\"none\"})}else\"Exclusive\"===o&&(a||b(e,t.width,t.height,.26*t.height,{strokeWidth:1,fill:\"none\",stroke:ge(t,p)}),function(){var n=i.getScaledPath(\"GATEWAY_EVENT_BASED\",{xScaleFactor:.18,yScaleFactor:.18,containerWidth:t.width,containerHeight:t.height,position:{mx:.36,my:.44}});M(e,n,{strokeWidth:2,fill:ye(t,\"none\"),stroke:ge(t,p)})}());return r},\"bpmn:Gateway\":function(e,t){return function(e,t,n,i){var r=t/2,o=n/2,a=[{x:r,y:0},{x:t,y:o},{x:r,y:n},{x:0,y:o}].map((function(e){return e.x+\",\"+e.y})).join(\" \");i=f(i);var s=U(\"polygon\",{...i,points:a});return N(e,s),s}(e,t.width,t.height,{fill:ye(t,l),fillOpacity:Qe,stroke:ge(t,p)})},\"bpmn:SequenceFlow\":function(e,t){var n,i=ye(t,l),r=ge(t,p),o=A(e,t.waypoints,{markerEnd:v(\"sequenceflow-end\",i,r),stroke:ge(t,p)}),a=S(t);return t.source&&(n=t.source.businessObject,a.conditionExpression&&n.$instanceOf(\"bpmn:Activity\")&&j(o,{markerStart:v(\"conditional-flow-marker\",i,r)}),n.default&&(n.$instanceOf(\"bpmn:Gateway\")||n.$instanceOf(\"bpmn:Activity\"))&&n.default===a&&j(o,{markerStart:v(\"conditional-default-flow-marker\",i,r)})),o},\"bpmn:Association\":function(e,t,n){var i=S(t),r=ye(t,l),o=ge(t,p);return n={strokeDasharray:\"0, 5\",stroke:ge(t,p),...n},\"One\"!==i.associationDirection&&\"Both\"!==i.associationDirection||(n.markerEnd=v(\"association-end\",r,o)),\"Both\"===i.associationDirection&&(n.markerStart=v(\"association-start\",r,o)),A(e,t.waypoints,n)},\"bpmn:DataInputAssociation\":function(e,t){var n=ye(t,l),i=ge(t,p);return P(\"bpmn:Association\")(e,t,{markerEnd:v(\"association-end\",n,i)})},\"bpmn:DataOutputAssociation\":function(e,t){var n=ye(t,l),i=ge(t,p);return P(\"bpmn:Association\")(e,t,{markerEnd:v(\"association-end\",n,i)})},\"bpmn:MessageFlow\":function(e,t){var n=S(t),r=R(t),o=ye(t,l),a=ge(t,p),s=A(e,t.waypoints,{markerEnd:v(\"messageflow-end\",o,a),markerStart:v(\"messageflow-start\",o,a),strokeDasharray:\"10, 11\",strokeWidth:1.5,stroke:ge(t,p)});if(n.messageRef){var u=s.getPointAtLength(s.getTotalLength()/2),h=i.getScaledPath(\"MESSAGE_FLOW_MARKER\",{abspos:{x:u.x,y:u.y}}),m={strokeWidth:1};\"initiating\"===r.messageVisibleKind?(m.fill=\"white\",m.stroke=fe):(m.fill=\"#888\",m.stroke=\"white\");var f=M(e,h,m),d=B(e,n.messageRef.name,{align:\"center-top\",fitBox:!0,style:{fill:ge(t,c)}}),y=f.getBBox(),g=d.getBBox();qe(d,u.x-g.width/2,u.y+y.height/2+10,0)}return s},\"bpmn:DataObject\":function(e,t){var n=M(e,i.getScaledPath(\"DATA_OBJECT_PATH\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:.474,my:.296}}),{fill:ye(t,l),fillOpacity:Qe,stroke:ge(t,p)});return function(e){var t=e.dataObjectRef;return e.isCollection||t&&t.isCollection}(S(t))&&function(e,t){var n=(t.height-18)/t.height,r=i.getScaledPath(\"DATA_OBJECT_COLLECTION_PATH\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:.33,my:n}});M(e,r,{strokeWidth:2})}(e,t),n},\"bpmn:DataObjectReference\":D(\"bpmn:DataObject\"),\"bpmn:DataInput\":function(e,t){var n=i.getRawPath(\"DATA_ARROW\"),r=P(\"bpmn:DataObject\")(e,t);return M(e,n,{strokeWidth:1}),r},\"bpmn:DataOutput\":function(e,t){var n=i.getRawPath(\"DATA_ARROW\"),r=P(\"bpmn:DataObject\")(e,t);return M(e,n,{strokeWidth:1,fill:fe}),r},\"bpmn:DataStoreReference\":function(e,t){return M(e,i.getScaledPath(\"DATA_STORE\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:0,my:.133}}),{strokeWidth:2,fill:ye(t,l),fillOpacity:Qe,stroke:ge(t,p)})},\"bpmn:BoundaryEvent\":function(e,t,n){var i=S(t).cancelActivity,r={strokeWidth:1.5,fill:ye(t,l),stroke:ge(t,p)};i||(r.strokeDasharray=\"6\");var o={...r,fillOpacity:1},a={...r,fill:\"none\"},s=P(\"bpmn:Event\")(e,t,o);return b(e,t.width,t.height,3,a),n&&!1===n.renderIcon||O(t,e),s},\"bpmn:Group\":function(e,t){return x(e,t.width,t.height,10,{stroke:ge(t,p),strokeWidth:1.5,strokeDasharray:\"10,6,0,6\",fill:\"none\",pointerEvents:\"none\"})},label:function(e,t){return function(e,t){var n={width:90,height:30,x:t.width/2+t.x,y:t.height/2+t.y};return B(e,T(t),{box:n,fitBox:!0,style:w({},a.getExternalStyle(),{fill:ve(t,c,p)})})}(e,t)},\"bpmn:TextAnnotation\":function(e,t){var n=x(e,t.width,t.height,0,0,{fill:\"none\",stroke:\"none\"});return M(e,i.getScaledPath(\"TEXT_ANNOTATION\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:0,my:0}}),{stroke:ge(t,p)}),B(e,S(t).text||\"\",{box:t,align:\"left-top\",padding:7,style:{fill:ve(t,c,p)}}),n},ParticipantMultiplicityMarker:function(e,t){k(\"participant-multiplicity\",e,i.getScaledPath(\"MARKER_PARALLEL\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:t.width/2/t.width,my:(t.height-15)/t.height}}),{strokeWidth:2,fill:ye(t,l),stroke:ge(t,p)})},SubProcessMarker:function(e,t){Ye(x(e,14,14,0,{strokeWidth:1,fill:ye(t,l),stroke:ge(t,p)}),t.width/2-7.5,t.height-20),k(\"sub-process\",e,i.getScaledPath(\"MARKER_SUB_PROCESS\",{xScaleFactor:1.5,yScaleFactor:1.5,containerWidth:t.width,containerHeight:t.height,position:{mx:(t.width/2-7.5)/t.width,my:(t.height-20)/t.height}}),{fill:ye(t,l),stroke:ge(t,p)})},ParallelMarker:function(e,t,n){k(\"parallel\",e,i.getScaledPath(\"MARKER_PARALLEL\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:(t.width/2+n.parallel)/t.width,my:(t.height-20)/t.height}}),{fill:ye(t,l),stroke:ge(t,p)})},SequentialMarker:function(e,t,n){k(\"sequential\",e,i.getScaledPath(\"MARKER_SEQUENTIAL\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:(t.width/2+n.seq)/t.width,my:(t.height-19)/t.height}}),{fill:ye(t,l),stroke:ge(t,p)})},CompensationMarker:function(e,t,n){k(\"compensation\",e,i.getScaledPath(\"MARKER_COMPENSATION\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:(t.width/2+n.compensation)/t.width,my:(t.height-13)/t.height}}),{strokeWidth:1,fill:ye(t,l),stroke:ge(t,p)})},LoopMarker:function(e,t,n){k(\"loop\",e,i.getScaledPath(\"MARKER_LOOP\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:(t.width/2+n.loop)/t.width,my:(t.height-7)/t.height}}),{strokeWidth:1.5,fill:ye(t,l),stroke:ge(t,p),strokeMiterlimit:.5})},AdhocMarker:function(e,t,n){k(\"adhoc\",e,i.getScaledPath(\"MARKER_ADHOC\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:(t.width/2+n.adhoc)/t.width,my:(t.height-15)/t.height}}),{strokeWidth:1,fill:ge(t,p),stroke:ge(t,p)})}};function W(e,t,n){var i,r=S(t),o=n&&-1!==n.indexOf(\"SubProcessMarker\");i=o?{seq:-21,parallel:-22,compensation:-42,loop:-18,adhoc:10}:{seq:-3,parallel:-6,compensation:-27,loop:0,adhoc:10},h(n,(function(n){P(n)(e,t,i)})),r.isForCompensation&&P(\"CompensationMarker\")(e,t,i),\"bpmn:AdHocSubProcess\"===r.$type&&P(\"AdhocMarker\")(e,t,i);var a=r.loopCharacteristics,s=a&&a.isSequential;a&&(void 0===s&&P(\"LoopMarker\")(e,t,i),!1===s&&P(\"ParallelMarker\")(e,t,i),!0===s&&P(\"SequentialMarker\")(e,t,i))}this._drawPath=M,this._renderer=P}e(et,_),et.$inject=[\"config.bpmnRenderer\",\"eventBus\",\"styles\",\"pathMap\",\"canvas\",\"textRenderer\"],et.prototype.canRender=function(e){return A(e,\"bpmn:BaseElement\")},et.prototype.drawShape=function(e,t){var n=t.type;return this._renderer(n)(e,t)},et.prototype.drawConnection=function(e,t){var n=t.type;return this._renderer(n)(e,t)},et.prototype.getShapePath=function(e){return A(e,\"bpmn:Event\")?(n=(t=e).x+t.width/2,i=t.y+t.height/2,r=t.width/2,se([[\"M\",n,i],[\"m\",0,-r],[\"a\",r,r,0,1,1,0,2*r],[\"a\",r,r,0,1,1,0,-2*r],[\"z\"]])):A(e,\"bpmn:Activity\")?function(e,t){var n=e.x,i=e.y,r=e.width,o=e.height;return se([[\"M\",n+t,i],[\"l\",r-2*t,0],[\"a\",t,t,0,0,1,t,t],[\"l\",0,o-2*t],[\"a\",t,t,0,0,1,-t,t],[\"l\",2*t-r,0],[\"a\",t,t,0,0,1,-t,-t],[\"l\",0,2*t-o],[\"a\",t,t,0,0,1,t,-t],[\"z\"]])}(e,10):A(e,\"bpmn:Gateway\")?function(e){var t=e.width/2,n=e.height/2;return se([[\"M\",e.x+t,e.y],[\"l\",t,n],[\"l\",-t,n],[\"l\",-t,-n],[\"z\"]])}(e):function(e){var t=e.x,n=e.y,i=e.width;return se([[\"M\",t,n],[\"l\",i,0],[\"l\",0,e.height],[\"l\",-i,0],[\"z\"]])}(e);var t,n,i,r};var tt=0,nt={width:150,height:50};function it(e,t){var n;t.textContent=e;try{var i,r=\"\"===e;return t.textContent=r?\"dummy\":e,i={width:(n=t.getBBox()).width+2*n.x,height:n.height},r&&(i.width=0),i}catch(e){return{width:0,height:0}}}function rt(e,t,n){for(var i,r=e.shift(),o=r;;){if((i=it(o,n)).width=o?i.width:0,\" \"===o||\"\"===o||i.width<Math.round(t)||o.length<2)return ot(e,o,r,i);o=st(o,i.width,t)}}function ot(e,t,n,i){if(t.length<n.length){var r=n.slice(t.length).trim();e.unshift(r)}return{width:i.width,height:i.height,text:t}}var at=\"­\";function st(e,t,n){var i=Math.max(e.length*(n/t),1),r=function(e,t){var n,i=e.split(/(\\s|-|\\u00AD)/g),r=[],o=0;if(i.length>1)for(;n=i.shift();){if(!(n.length+o<t)){\"-\"!==n&&n!==at||r.pop();break}r.push(n),o+=n.length}var a=r[r.length-1];return a&&a===at&&(r[r.length-1]=\"-\"),r.join(\"\")}(e,i);return r||(r=e.slice(0,Math.max(Math.round(i-1),1))),r}function lt(e){this._config=w({},{size:nt,padding:tt,style:{},align:\"center-top\"},e||{})}lt.prototype.createText=function(e,t){return this.layoutText(e,t).element},lt.prototype.getDimensions=function(e,t){return this.layoutText(e,t).dimensions},lt.prototype.layoutText=function(e,t){var n=w({},this._config.size,t.box),i=w({},this._config.style,t.style),r=function(e){var t=e.split(\"-\");return{horizontal:t[0]||\"center\",vertical:t[1]||\"top\"}}(t.align||this._config.align),a=function(e){return o(e)?w({top:0,left:0,right:0,bottom:0},e):{top:e,left:e,right:e,bottom:e}}(void 0!==t.padding?t.padding:this._config.padding),s=t.fitBox||!1,l=function(e){if(\"fontSize\"in e&&\"lineHeight\"in e)return e.lineHeight*parseInt(e.fontSize,10)}(i),p=e.split(/\\u00AD?\\r?\\n/),c=[],u=n.width-a.left-a.right,f=U(\"text\");for(j(f,{x:0,y:0}),j(f,i),N(function(){var e=document.getElementById(\"helper-svg\");return e||(j(e=U(\"svg\"),{id:\"helper-svg\"}),Re(e,{visibility:\"hidden\",position:\"fixed\",width:0,height:0}),document.body.appendChild(e)),e}(),f);p.length;)c.push(rt(p,u,f));\"middle\"===r.vertical&&(a.top=a.bottom=0);var d=m(c,(function(e,t,n){return e+(l||t.height)}),0)+a.top+a.bottom,y=m(c,(function(e,t,n){return t.width>e?t.width:e}),0),g=a.top;\"middle\"===r.vertical&&(g+=(n.height-d)/2),g-=(l||c[0].height)/4;var v=U(\"text\");return j(v,i),h(c,(function(e){var t;switch(g+=l||e.height,r.horizontal){case\"left\":t=a.left;break;case\"right\":t=(s?y:u)-a.right-e.width;break;default:t=Math.max(((s?y:u)-e.width)/2+a.left,0)}var n=U(\"tspan\");j(n,{x:t,y:g}),n.textContent=e.text,N(v,n)})),z(f),{dimensions:{width:y,height:d},element:v}};function pt(e){var t=w({fontFamily:\"Arial, sans-serif\",fontSize:12,fontWeight:\"normal\",lineHeight:1.2},e&&e.defaultStyle||{}),n=parseInt(t.fontSize,10)-1,i=w({},t,{fontSize:n},e&&e.externalStyle||{}),r=new lt({style:t});this.getExternalLabelBounds=function(e,t){var n=r.getDimensions(t,{box:{width:90,height:30},style:i});return{x:Math.round(e.x+e.width/2-n.width/2),y:Math.round(e.y),width:Math.ceil(n.width),height:Math.ceil(n.height)}},this.getTextAnnotationBounds=function(e,n){var i=r.getDimensions(n,{box:e,style:t,align:\"left-top\",padding:5});return{x:e.x,y:e.y,width:e.width,height:Math.max(30,Math.round(i.height))}},this.createText=function(e,t){return r.createText(e,t||{})},this.getDefaultStyle=function(){return t},this.getExternalStyle=function(){return i}}pt.$inject=[\"config.textRenderer\"];var ct=/\\{([^{}]+)\\}/g,ut=/(?:(?:^|\\.)(.+?)(?=\\[|\\.|$|\\()|\\[('|\")(.+?)\\2\\])(\\(\\))?/g;var ht={__init__:[\"bpmnRenderer\"],bpmnRenderer:[\"type\",et],textRenderer:[\"type\",pt],pathMap:[\"type\",function(){this.pathMap={EVENT_MESSAGE:{d:\"m {mx},{my} l 0,{e.y1} l {e.x1},0 l 0,-{e.y1} z l {e.x0},{e.y0} l {e.x0},-{e.y0}\",height:36,width:36,heightElements:[6,14],widthElements:[10.5,21]},EVENT_SIGNAL:{d:\"M {mx},{my} l {e.x0},{e.y0} l -{e.x1},0 Z\",height:36,width:36,heightElements:[18],widthElements:[10,20]},EVENT_ESCALATION:{d:\"M {mx},{my} l {e.x0},{e.y0} l -{e.x0},-{e.y1} l -{e.x0},{e.y1} Z\",height:36,width:36,heightElements:[20,7],widthElements:[8]},EVENT_CONDITIONAL:{d:\"M {e.x0},{e.y0} l {e.x1},0 l 0,{e.y2} l -{e.x1},0 Z M {e.x2},{e.y3} l {e.x0},0 M {e.x2},{e.y4} l {e.x0},0 M {e.x2},{e.y5} l {e.x0},0 M {e.x2},{e.y6} l {e.x0},0 M {e.x2},{e.y7} l {e.x0},0 M {e.x2},{e.y8} l {e.x0},0 \",height:36,width:36,heightElements:[8.5,14.5,18,11.5,14.5,17.5,20.5,23.5,26.5],widthElements:[10.5,14.5,12.5]},EVENT_LINK:{d:\"m {mx},{my} 0,{e.y0} -{e.x1},0 0,{e.y1} {e.x1},0 0,{e.y0} {e.x0},-{e.y2} -{e.x0},-{e.y2} z\",height:36,width:36,heightElements:[4.4375,6.75,7.8125],widthElements:[9.84375,13.5]},EVENT_ERROR:{d:\"m {mx},{my} {e.x0},-{e.y0} {e.x1},-{e.y1} {e.x2},{e.y2} {e.x3},-{e.y3} -{e.x4},{e.y4} -{e.x5},-{e.y5} z\",height:36,width:36,heightElements:[.023,8.737,8.151,16.564,10.591,8.714],widthElements:[.085,6.672,6.97,4.273,5.337,6.636]},EVENT_CANCEL_45:{d:\"m {mx},{my} -{e.x1},0 0,{e.x0} {e.x1},0 0,{e.y1} {e.x0},0 0,-{e.y1} {e.x1},0 0,-{e.y0} -{e.x1},0 0,-{e.y1} -{e.x0},0 z\",height:36,width:36,heightElements:[4.75,8.5],widthElements:[4.75,8.5]},EVENT_COMPENSATION:{d:\"m {mx},{my} {e.x0},-{e.y0} 0,{e.y1} z m {e.x1},-{e.y2} {e.x2},-{e.y3} 0,{e.y1} -{e.x2},-{e.y3} z\",height:36,width:36,heightElements:[6.5,13,.4,6.1],widthElements:[9,9.3,8.7]},EVENT_TIMER_WH:{d:\"M {mx},{my} l {e.x0},-{e.y0} m -{e.x0},{e.y0} l {e.x1},{e.y1} \",height:36,width:36,heightElements:[10,2],widthElements:[3,7]},EVENT_TIMER_LINE:{d:\"M {mx},{my} m {e.x0},{e.y0} l -{e.x1},{e.y1} \",height:36,width:36,heightElements:[10,3],widthElements:[0,0]},EVENT_MULTIPLE:{d:\"m {mx},{my} {e.x1},-{e.y0} {e.x1},{e.y0} -{e.x0},{e.y1} -{e.x2},0 z\",height:36,width:36,heightElements:[6.28099,12.56199],widthElements:[3.1405,9.42149,12.56198]},EVENT_PARALLEL_MULTIPLE:{d:\"m {mx},{my} {e.x0},0 0,{e.y1} {e.x1},0 0,{e.y0} -{e.x1},0 0,{e.y1} -{e.x0},0 0,-{e.y1} -{e.x1},0 0,-{e.y0} {e.x1},0 z\",height:36,width:36,heightElements:[2.56228,7.68683],widthElements:[2.56228,7.68683]},GATEWAY_EXCLUSIVE:{d:\"m {mx},{my} {e.x0},{e.y0} {e.x1},{e.y0} {e.x2},0 {e.x4},{e.y2} {e.x4},{e.y1} {e.x2},0 {e.x1},{e.y3} {e.x0},{e.y3} {e.x3},0 {e.x5},{e.y1} {e.x5},{e.y2} {e.x3},0 z\",height:17.5,width:17.5,heightElements:[8.5,6.5312,-6.5312,-8.5],widthElements:[6.5,-6.5,3,-3,5,-5]},GATEWAY_PARALLEL:{d:\"m {mx},{my} 0,{e.y1} -{e.x1},0 0,{e.y0} {e.x1},0 0,{e.y1} {e.x0},0 0,-{e.y1} {e.x1},0 0,-{e.y0} -{e.x1},0 0,-{e.y1} -{e.x0},0 z\",height:30,width:30,heightElements:[5,12.5],widthElements:[5,12.5]},GATEWAY_EVENT_BASED:{d:\"m {mx},{my} {e.x0},{e.y0} {e.x0},{e.y1} {e.x1},{e.y2} {e.x2},0 z\",height:11,width:11,heightElements:[-6,6,12,-12],widthElements:[9,-3,-12]},GATEWAY_COMPLEX:{d:\"m {mx},{my} 0,{e.y0} -{e.x0},-{e.y1} -{e.x1},{e.y2} {e.x0},{e.y1} -{e.x2},0 0,{e.y3} {e.x2},0  -{e.x0},{e.y1} l {e.x1},{e.y2} {e.x0},-{e.y1} 0,{e.y0} {e.x3},0 0,-{e.y0} {e.x0},{e.y1} {e.x1},-{e.y2} -{e.x0},-{e.y1} {e.x2},0 0,-{e.y3} -{e.x2},0 {e.x0},-{e.y1} -{e.x1},-{e.y2} -{e.x0},{e.y1} 0,-{e.y0} -{e.x3},0 z\",height:17.125,width:17.125,heightElements:[4.875,3.4375,2.125,3],widthElements:[3.4375,2.125,4.875,3]},DATA_OBJECT_PATH:{d:\"m 0,0 {e.x1},0 {e.x0},{e.y0} 0,{e.y1} -{e.x2},0 0,-{e.y2} {e.x1},0 0,{e.y0} {e.x0},0\",height:61,width:51,heightElements:[10,50,60],widthElements:[10,40,50,60]},DATA_OBJECT_COLLECTION_PATH:{d:\"m{mx},{my} m 3,2 l 0,10 m 3,-10 l 0,10 m 3,-10 l 0,10\",height:10,width:10,heightElements:[],widthElements:[]},DATA_ARROW:{d:\"m 5,9 9,0 0,-3 5,5 -5,5 0,-3 -9,0 z\",height:61,width:51,heightElements:[],widthElements:[]},DATA_STORE:{d:\"m  {mx},{my} l  0,{e.y2} c  {e.x0},{e.y1} {e.x1},{e.y1}  {e.x2},0 l  0,-{e.y2} c -{e.x0},-{e.y1} -{e.x1},-{e.y1} -{e.x2},0c  {e.x0},{e.y1} {e.x1},{e.y1}  {e.x2},0 m  -{e.x2},{e.y0}c  {e.x0},{e.y1} {e.x1},{e.y1} {e.x2},0m  -{e.x2},{e.y0}c  {e.x0},{e.y1} {e.x1},{e.y1}  {e.x2},0\",height:61,width:61,heightElements:[7,10,45],widthElements:[2,58,60]},TEXT_ANNOTATION:{d:\"m {mx}, {my} m 10,0 l -10,0 l 0,{e.y0} l 10,0\",height:30,width:10,heightElements:[30],widthElements:[10]},MARKER_SUB_PROCESS:{d:\"m{mx},{my} m 7,2 l 0,10 m -5,-5 l 10,0\",height:10,width:10,heightElements:[],widthElements:[]},MARKER_PARALLEL:{d:\"m{mx},{my} m 3,2 l 0,10 m 3,-10 l 0,10 m 3,-10 l 0,10\",height:10,width:10,heightElements:[],widthElements:[]},MARKER_SEQUENTIAL:{d:\"m{mx},{my} m 0,3 l 10,0 m -10,3 l 10,0 m -10,3 l 10,0\",height:10,width:10,heightElements:[],widthElements:[]},MARKER_COMPENSATION:{d:\"m {mx},{my} 7,-5 0,10 z m 7.1,-0.3 6.9,-4.7 0,10 -6.9,-4.7 z\",height:10,width:21,heightElements:[],widthElements:[]},MARKER_LOOP:{d:\"m {mx},{my} c 3.526979,0 6.386161,-2.829858 6.386161,-6.320661 0,-3.490806 -2.859182,-6.320661 -6.386161,-6.320661 -3.526978,0 -6.38616,2.829855 -6.38616,6.320661 0,1.745402 0.714797,3.325567 1.870463,4.469381 0.577834,0.571908 1.265885,1.034728 2.029916,1.35457 l -0.718163,-3.909793 m 0.718163,3.909793 -3.885211,0.802902\",height:13.9,width:13.7,heightElements:[],widthElements:[]},MARKER_ADHOC:{d:\"m {mx},{my} m 0.84461,2.64411 c 1.05533,-1.23780996 2.64337,-2.07882 4.29653,-1.97997996 2.05163,0.0805 3.85579,1.15803 5.76082,1.79107 1.06385,0.34139996 2.24454,0.1438 3.18759,-0.43767 0.61743,-0.33642 1.2775,-0.64078 1.7542,-1.17511 0,0.56023 0,1.12046 0,1.6807 -0.98706,0.96237996 -2.29792,1.62393996 -3.6918,1.66181996 -1.24459,0.0927 -2.46671,-0.2491 -3.59505,-0.74812 -1.35789,-0.55965 -2.75133,-1.33436996 -4.27027,-1.18121996 -1.37741,0.14601 -2.41842,1.13685996 -3.44288,1.96782996 z\",height:4,width:15,heightElements:[],widthElements:[]},TASK_TYPE_SEND:{d:\"m {mx},{my} l 0,{e.y1} l {e.x1},0 l 0,-{e.y1} z l {e.x0},{e.y0} l {e.x0},-{e.y0}\",height:14,width:21,heightElements:[6,14],widthElements:[10.5,21]},TASK_TYPE_SCRIPT:{d:\"m {mx},{my} c 9.966553,-6.27276 -8.000926,-7.91932 2.968968,-14.938 l -8.802728,0 c -10.969894,7.01868 6.997585,8.66524 -2.968967,14.938 z m -7,-12 l 5,0 m -4.5,3 l 4.5,0 m -3,3 l 5,0m -4,3 l 5,0\",height:15,width:12.6,heightElements:[6,14],widthElements:[10.5,21]},TASK_TYPE_USER_1:{d:\"m {mx},{my} c 0.909,-0.845 1.594,-2.049 1.594,-3.385 0,-2.554 -1.805,-4.62199999 -4.357,-4.62199999 -2.55199998,0 -4.28799998,2.06799999 -4.28799998,4.62199999 0,1.348 0.974,2.562 1.89599998,3.405 -0.52899998,0.187 -5.669,2.097 -5.794,4.7560005 v 6.718 h 17 v -6.718 c 0,-2.2980005 -5.5279996,-4.5950005 -6.0509996,-4.7760005 zm -8,6 l 0,5.5 m 11,0 l 0,-5\"},TASK_TYPE_USER_2:{d:\"m {mx},{my} m 2.162,1.009 c 0,2.4470005 -2.158,4.4310005 -4.821,4.4310005 -2.66499998,0 -4.822,-1.981 -4.822,-4.4310005 \"},TASK_TYPE_USER_3:{d:\"m {mx},{my} m -6.9,-3.80 c 0,0 2.25099998,-2.358 4.27399998,-1.177 2.024,1.181 4.221,1.537 4.124,0.965 -0.098,-0.57 -0.117,-3.79099999 -4.191,-4.13599999 -3.57499998,0.001 -4.20799998,3.36699999 -4.20699998,4.34799999 z\"},TASK_TYPE_MANUAL:{d:\"m {mx},{my} c 0.234,-0.01 5.604,0.008 8.029,0.004 0.808,0 1.271,-0.172 1.417,-0.752 0.227,-0.898 -0.334,-1.314 -1.338,-1.316 -2.467,-0.01 -7.886,-0.004 -8.108,-0.004 -0.014,-0.079 0.016,-0.533 0,-0.61 0.195,-0.042 8.507,0.006 9.616,0.002 0.877,-0.007 1.35,-0.438 1.353,-1.208 0.003,-0.768 -0.479,-1.09 -1.35,-1.091 -2.968,-0.002 -9.619,-0.013 -9.619,-0.013 v -0.591 c 0,0 5.052,-0.016 7.225,-0.016 0.888,-0.002 1.354,-0.416 1.351,-1.193 -0.006,-0.761 -0.492,-1.196 -1.361,-1.196 -3.473,-0.005 -10.86,-0.003 -11.0829995,-0.003 -0.022,-0.047 -0.045,-0.094 -0.069,-0.139 0.3939995,-0.319 2.0409995,-1.626 2.4149995,-2.017 0.469,-0.4870005 0.519,-1.1650005 0.162,-1.6040005 -0.414,-0.511 -0.973,-0.5 -1.48,-0.236 -1.4609995,0.764 -6.5999995,3.6430005 -7.7329995,4.2710005 -0.9,0.499 -1.516,1.253 -1.882,2.19 -0.37000002,0.95 -0.17,2.01 -0.166,2.979 0.004,0.718 -0.27300002,1.345 -0.055,2.063 0.629,2.087 2.425,3.312 4.859,3.318 4.6179995,0.014 9.2379995,-0.139 13.8569995,-0.158 0.755,-0.004 1.171,-0.301 1.182,-1.033 0.012,-0.754 -0.423,-0.969 -1.183,-0.973 -1.778,-0.01 -5.824,-0.004 -6.04,-0.004 10e-4,-0.084 0.003,-0.586 10e-4,-0.67 z\"},TASK_TYPE_INSTANTIATING_SEND:{d:\"m {mx},{my} l 0,8.4 l 12.6,0 l 0,-8.4 z l 6.3,3.6 l 6.3,-3.6\"},TASK_TYPE_SERVICE:{d:\"m {mx},{my} v -1.71335 c 0.352326,-0.0705 0.703932,-0.17838 1.047628,-0.32133 0.344416,-0.14465 0.665822,-0.32133 0.966377,-0.52145 l 1.19431,1.18005 1.567487,-1.57688 -1.195028,-1.18014 c 0.403376,-0.61394 0.683079,-1.29908 0.825447,-2.01824 l 1.622133,-0.01 v -2.2196 l -1.636514,0.01 c -0.07333,-0.35153 -0.178319,-0.70024 -0.323564,-1.04372 -0.145244,-0.34406 -0.321407,-0.6644 -0.522735,-0.96217 l 1.131035,-1.13631 -1.583305,-1.56293 -1.129598,1.13589 c -0.614052,-0.40108 -1.302883,-0.68093 -2.022633,-0.82247 l 0.0093,-1.61852 h -2.241173 l 0.0042,1.63124 c -0.353763,0.0736 -0.705369,0.17977 -1.049785,0.32371 -0.344415,0.14437 -0.665102,0.32092 -0.9635006,0.52046 l -1.1698628,-1.15823 -1.5667691,1.5792 1.1684265,1.15669 c -0.4026573,0.61283 -0.68308,1.29797 -0.8247287,2.01713 l -1.6588041,0.003 v 2.22174 l 1.6724648,-0.006 c 0.073327,0.35077 0.1797598,0.70243 0.3242851,1.04472 0.1452428,0.34448 0.3214064,0.6644 0.5227339,0.96066 l -1.1993431,1.19723 1.5840256,1.56011 1.1964668,-1.19348 c 0.6140517,0.40346 1.3028827,0.68232 2.0233517,0.82331 l 7.19e-4,1.69892 h 2.226848 z m 0.221462,-3.9957 c -1.788948,0.7502 -3.8576,-0.0928 -4.6097055,-1.87438 -0.7521065,-1.78321 0.090598,-3.84627 1.8802645,-4.59604 1.78823,-0.74936 3.856881,0.0929 4.608987,1.87437 0.752106,1.78165 -0.0906,3.84612 -1.879546,4.59605 z\"},TASK_TYPE_SERVICE_FILL:{d:\"m {mx},{my} c -1.788948,0.7502 -3.8576,-0.0928 -4.6097055,-1.87438 -0.7521065,-1.78321 0.090598,-3.84627 1.8802645,-4.59604 1.78823,-0.74936 3.856881,0.0929 4.608987,1.87437 0.752106,1.78165 -0.0906,3.84612 -1.879546,4.59605 z\"},TASK_TYPE_BUSINESS_RULE_HEADER:{d:\"m {mx},{my} 0,4 20,0 0,-4 z\"},TASK_TYPE_BUSINESS_RULE_MAIN:{d:\"m {mx},{my} 0,12 20,0 0,-12 zm 0,8 l 20,0 m -13,-4 l 0,8\"},MESSAGE_FLOW_MARKER:{d:\"m {mx},{my} m -10.5 ,-7 l 0,14 l 21,0 l 0,-14 z l 10.5,6 l 10.5,-6\"}},this.getRawPath=function(e){return this.pathMap[e].d},this.getScaledPath=function(e,t){var n,i,r=this.pathMap[e];t.abspos?(n=t.abspos.x,i=t.abspos.y):(n=t.containerWidth*t.position.mx,i=t.containerHeight*t.position.my);var o={};if(t.position){for(var a=t.containerHeight/r.height*t.yScaleFactor,s=t.containerWidth/r.width*t.xScaleFactor,l=0;l<r.heightElements.length;l++)o[\"y\"+l]=r.heightElements[l]*a;for(var p=0;p<r.widthElements.length;p++)o[\"x\"+p]=r.widthElements[p]*s}var c,u,h=(c=r.d,u={mx:n,my:i,e:o},String(c).replace(ct,(function(e,t){return function(e,t,n){var i=n;return t.replace(ut,(function(e,t,n,r,o){t=t||r,i&&(t in i&&(i=i[t]),\"function\"==typeof i&&o&&(i=i()))})),i=(null==i||i==n?e:i)+\"\"}(e,t,u)})));return h}}]};var mt={translate:[\"value\",function(e,t){return t=t||{},e.replace(/{([^}]+)}/g,(function(e,n){return t[n]||\"{\"+n+\"}\"}))}]};function ft(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,\"default\")?e.default:e}function dt(e){return{top:e.y,right:e.x+(e.width||0),bottom:e.y+(e.height||0),left:e.x}}function yt(e){return t={x:e.x+(e.width||0)/2,y:e.y+(e.height||0)/2},{x:Math.round(t.x),y:Math.round(t.y)};var t}function gt(e){for(var t=e.waypoints,n=t.reduce((function(e,n,i){var r,o,a=t[i-1];if(a){var s=e[e.length-1],l=s&&s.endLength||0,p=(r=a,o=n,Math.sqrt(Math.pow(r.x-o.x,2)+Math.pow(r.y-o.y,2)));e.push({start:a,end:n,startLength:l,endLength:l+p,length:p})}return e}),[]),i=n.reduce((function(e,t){return e+t.length}),0),r=i/2,o=0,a=n[o];a.endLength<r;)a=n[++o];var s=(r-a.startLength)/a.length;return{x:a.start.x+(a.end.x-a.start.x)*s,y:a.start.y+(a.end.y-a.start.y)*s}}function vt(e){return o(t=e)&&p(t,\"waypoints\")?gt(e):yt(e);var t}function bt(e){return e?\"<\"+e.$type+(e.id?' id=\"'+e.id:\"\")+'\" />':\"<null>\"}function xt(e,t,n){return w({id:e.id,type:e.$type,businessObject:e,di:t},n)}function wt(e,t,n){var i=e.waypoint;return!i||i.length<2?[vt(t),vt(n)]:i.map((function(e){return{x:e.x,y:e.y}}))}function Et(e,t,n,i){return new Error(e(\"element {element} referenced by {referenced}#{property} not yet drawn\",{element:bt(n),referenced:bt(t),property:i}))}function _t(e,t,n,i,r,o){this._eventBus=e,this._canvas=t,this._elementFactory=n,this._elementRegistry=i,this._translate=r,this._textRenderer=o}_t.$inject=[\"eventBus\",\"canvas\",\"elementFactory\",\"elementRegistry\",\"translate\",\"textRenderer\"],_t.prototype.add=function(e,t,n){var i,r,o,a,s,l,p,c=this._translate;if(A(t,\"bpmndi:BPMNPlane\")){var u=A(e,\"bpmn:SubProcess\")?{id:e.id+\"_plane\"}:{};i=this._elementFactory.createRoot(xt(e,t,u)),this._canvas.addRootElement(i)}else if(A(t,\"bpmndi:BPMNShape\")){var h=!C(e,t),m=function(e){return A(e,\"bpmn:Group\")}(e);r=n&&(n.hidden||n.collapsed);var f=t.bounds;i=this._elementFactory.createShape(xt(e,t,{collapsed:h,hidden:r,x:Math.round(f.x),y:Math.round(f.y),width:Math.round(f.width),height:Math.round(f.height),isFrame:m})),A(e,\"bpmn:BoundaryEvent\")&&this._attachBoundary(e,i),A(e,\"bpmn:Lane\")&&(o=0),A(e,\"bpmn:DataStoreReference\")&&(a=n,s=vt(f),l=s.x,p=s.y,l>=a.x&&l<=a.x+a.width&&p>=a.y&&p<=a.y+a.height||(n=this._canvas.findRoot(n))),this._canvas.addShape(i,n,o)}else{if(!A(t,\"bpmndi:BPMNEdge\"))throw new Error(c(\"unknown di {di} for element {semantic}\",{di:bt(t),semantic:bt(e)}));var d=this._getSource(e),y=this._getTarget(e);r=n&&(n.hidden||n.collapsed),i=this._elementFactory.createConnection(xt(e,t,{hidden:r,source:d,target:y,waypoints:wt(t,d,y)})),A(e,\"bpmn:DataAssociation\")&&(n=this._canvas.findRoot(n)),this._canvas.addConnection(i,n,o)}return function(e){return A(e,\"bpmn:Event\")||A(e,\"bpmn:Gateway\")||A(e,\"bpmn:DataStoreReference\")||A(e,\"bpmn:DataObjectReference\")||A(e,\"bpmn:DataInput\")||A(e,\"bpmn:DataOutput\")||A(e,\"bpmn:SequenceFlow\")||A(e,\"bpmn:MessageFlow\")||A(e,\"bpmn:Group\")}(e)&&T(i)&&this.addLabel(e,t,i),this._eventBus.fire(\"bpmnElement.added\",{element:i}),i},_t.prototype._attachBoundary=function(e,t){var n=this._translate,i=e.attachedToRef;if(!i)throw new Error(n(\"missing {semantic}#attachedToRef\",{semantic:bt(e)}));var r=this._elementRegistry.get(i.id),o=r&&r.attachers;if(!r)throw Et(n,e,i,\"attachedToRef\");t.host=r,o||(r.attachers=o=[]),-1===o.indexOf(t)&&o.push(t)},_t.prototype.addLabel=function(e,t,n){var i,r,o;return i=D(t,n),(r=T(n))&&(i=this._textRenderer.getExternalLabelBounds(i,r)),o=this._elementFactory.createLabel(xt(e,t,{id:e.id+\"_label\",labelTarget:n,type:\"label\",hidden:n.hidden||!T(n),x:Math.round(i.x),y:Math.round(i.y),width:Math.round(i.width),height:Math.round(i.height)})),this._canvas.addShape(o,n.parent)},_t.prototype._getConnectedElement=function(e,t){var n,i,r=e.$type,o=this._translate;if(i=e[t+\"Ref\"],\"source\"===t&&\"bpmn:DataInputAssociation\"===r&&(i=i&&i[0]),(\"source\"===t&&\"bpmn:DataOutputAssociation\"===r||\"target\"===t&&\"bpmn:DataInputAssociation\"===r)&&(i=e.$parent),n=i&&this._getElement(i))return n;throw i?Et(o,e,i,t+\"Ref\"):new Error(o(\"{semantic}#{side} Ref not specified\",{semantic:bt(e),side:t}))},_t.prototype._getSource=function(e){return this._getConnectedElement(e,\"source\")},_t.prototype._getTarget=function(e){return this._getConnectedElement(e,\"target\")},_t.prototype._getElement=function(e){return this._elementRegistry.get(e.id)};var At={__depends__:[ht,{__depends__:[mt],bpmnImporter:[\"type\",_t]}]};function St(e){return e.originalEvent||e.srcEvent}function Rt(e){return e.pointers&&e.pointers.length&&(e=e.pointers[0]),e.touches&&e.touches.length&&(e=e.touches[0]),e?{x:e.clientX,y:e.clientY}:null}function Ct(e,t){return(St(e)||e).button===t}function Mt(e){return Ct(e,0)}function kt(e){var t=St(e)||e;return!!Mt(e)&&(/mac/i.test(navigator.platform)?t.metaKey:t.ctrlKey)}function Pt(e){return!0}function Dt(e){return Mt(e)||function(e){return Ct(e,1)}(e)}function Tt(e,t,n){var i=this;function r(n,i,r){var o,a;(function(e,t){var n=l[e]||Mt;return!n(t)})(n,i)||(r?a=t.getGraphics(r):(o=i.delegateTarget||i.target)&&(a=o,r=t.get(a)),a&&r&&!1===e.fire(n,{element:r,gfx:a,originalEvent:i})&&(i.stopPropagation(),i.preventDefault()))}var o={};function a(e){return o[e]}var s={click:\"element.click\",contextmenu:\"element.contextmenu\",dblclick:\"element.dblclick\",mousedown:\"element.mousedown\",mousemove:\"element.mousemove\",mouseover:\"element.hover\",mouseout:\"element.out\",mouseup:\"element.mouseup\"},l={\"element.contextmenu\":Pt,\"element.mousedown\":Dt,\"element.mouseup\":Dt,\"element.click\":Dt,\"element.dblclick\":Dt};var p=\"svg, .djs-element\";function c(e,t,n,i){var a=o[n]=function(e){r(n,e)};i&&(l[n]=i),a.$delegate=We.bind(e,p,t,a)}function u(e,t,n){var i=a(n);i&&We.unbind(e,t,i.$delegate)}e.on(\"canvas.destroy\",(function(e){var t;t=e.svg,h(s,(function(e,n){u(t,n,e)}))})),e.on(\"canvas.init\",(function(e){var t;t=e.svg,h(s,(function(e,n){c(t,n,e)}))})),e.on([\"shape.added\",\"connection.added\"],(function(t){var n=t.element,i=t.gfx;e.fire(\"interactionEvents.createHit\",{element:n,gfx:i})})),e.on([\"shape.changed\",\"connection.changed\"],500,(function(t){var n=t.element,i=t.gfx;e.fire(\"interactionEvents.updateHit\",{element:n,gfx:i})})),e.on(\"interactionEvents.createHit\",500,(function(e){var t=e.element,n=e.gfx;i.createDefaultHit(t,n)})),e.on(\"interactionEvents.updateHit\",(function(e){var t=e.element,n=e.gfx;i.updateDefaultHit(t,n)}));var m=y(\"djs-hit djs-hit-stroke\"),f=y(\"djs-hit djs-hit-click-stroke\"),d={all:y(\"djs-hit djs-hit-all\"),\"click-stroke\":f,stroke:m,\"no-move\":y(\"djs-hit djs-hit-no-move\")};function y(e,t){return t=w({stroke:\"white\",strokeWidth:15},t||{}),n.cls(e,[\"no-fill\",\"no-border\"],t)}function g(e,t){var n=d[t];if(!n)throw new Error(\"invalid hit type <\"+t+\">\");return j(e,n),e}function v(e,t){N(e,t)}this.removeHits=function(e){var t;h((t=\".djs-hit\",(e||document).querySelectorAll(t)),z)},this.createDefaultHit=function(e,t){var n,i=e.waypoints,r=e.isFrame;return i?this.createWaypointsHit(t,i):(n=r?\"stroke\":\"all\",this.createBoxHit(t,n,{width:e.width,height:e.height}))},this.createWaypointsHit=function(e,t){var n=he(t);return g(n,\"stroke\"),v(e,n),n},this.createBoxHit=function(e,t,n){n=w({x:0,y:0},n);var i=U(\"rect\");return g(i,t),j(i,n),v(e,i),i},this.updateDefaultHit=function(e,t){var n=Ke(\".djs-hit\",t);if(n)return e.waypoints?me(n,e.waypoints):j(n,{width:e.width,height:e.height}),n},this.fire=r,this.triggerMouseEvent=function(e,t,n){var i=s[e];if(!i)throw new Error(\"unmapped DOM event name <\"+e+\">\");return r(i,t,n)},this.mouseHandler=a,this.registerEvent=c,this.unregisterEvent=u}Tt.$inject=[\"eventBus\",\"elementRegistry\",\"styles\"];var Ot={__init__:[\"interactionEvents\"],interactionEvents:[\"type\",Tt]};function Nt(e,t){var n,i,o,a;return t=!!t,r(e)||(e=[e]),h(e,(function(e){var r=e;e.waypoints&&!t&&(r=Nt(e.waypoints,!0));var s=r.x,l=r.y,p=r.height||0,c=r.width||0;(s<n||void 0===n)&&(n=s),(l<i||void 0===i)&&(i=l),(s+c>o||void 0===o)&&(o=s+c),(l+p>a||void 0===a)&&(a=l+p)})),{x:n,y:i,height:a-i,width:o-n}}function Bt(e){return\"waypoints\"in e?\"connection\":\"x\"in e?\"shape\":\"root\"}function Lt(e){return!(!e||!e.isFrame)}function It(e,t){this.offset=6;var n=t.cls(\"djs-outline\",[\"no-fill\"]),i=this;function r(e,t){var i=U(\"rect\");return j(i,w({x:10,y:10,rx:4,width:100,height:100},n)),N(e,i),i}e.on([\"shape.added\",\"shape.changed\"],500,(function(e){var t=e.element,n=e.gfx,o=Ke(\".djs-outline\",n);o||(o=r(n)),i.updateShapeOutline(o,t)})),e.on([\"connection.added\",\"connection.changed\"],(function(e){var t=e.element,n=e.gfx,o=Ke(\".djs-outline\",n);o||(o=r(n)),i.updateConnectionOutline(o,t)}))}It.prototype.updateShapeOutline=function(e,t){j(e,{x:-this.offset,y:-this.offset,width:t.width+2*this.offset,height:t.height+2*this.offset})},It.prototype.updateConnectionOutline=function(e,t){var n=Nt(t);j(e,{x:n.x-this.offset,y:n.y-this.offset,width:n.width+2*this.offset,height:n.height+2*this.offset})},It.$inject=[\"eventBus\",\"styles\",\"elementRegistry\"];var jt={__init__:[\"outline\"],outline:[\"type\",It]};function Ft(e,t){this._eventBus=e,this._canvas=t,this._selectedElements=[];var n=this;e.on([\"shape.remove\",\"connection.remove\"],(function(e){var t=e.element;n.deselect(t)})),e.on([\"diagram.clear\",\"root.set\"],(function(e){n.select(null)}))}Ft.$inject=[\"eventBus\",\"canvas\"],Ft.prototype.deselect=function(e){var t=this._selectedElements,n=t.indexOf(e);if(-1!==n){var i=t.slice();t.splice(n,1),this._eventBus.fire(\"selection.changed\",{oldSelection:i,newSelection:t})}},Ft.prototype.get=function(){return this._selectedElements},Ft.prototype.isSelected=function(e){return-1!==this._selectedElements.indexOf(e)},Ft.prototype.select=function(e,t){var n=this._selectedElements,i=n.slice();r(e)||(e=e?[e]:[]);var o=this._canvas,a=o.getRootElement();e=e.filter((function(e){var t=o.findRoot(e);return a===t})),t?h(e,(function(e){-1===n.indexOf(e)&&n.push(e)})):this._selectedElements=n=e.slice(),this._eventBus.fire(\"selection.changed\",{oldSelection:i,newSelection:n})};var Vt=\"hover\",Wt=\"selected\";function zt(e,t,n){this._canvas=e;var i=this;function r(t,n){e.addMarker(t,n)}function o(t,n){e.removeMarker(t,n)}this._multiSelectionBox=null,t.on(\"element.hover\",(function(e){r(e.element,Vt)})),t.on(\"element.out\",(function(e){o(e.element,Vt)})),t.on(\"selection.changed\",(function(e){var t=e.oldSelection,n=e.newSelection;h(t,(function(e){-1===n.indexOf(e)&&o(e,Wt)})),h(n,(function(e){-1===t.indexOf(e)&&r(e,Wt)})),i._updateSelectionOutline(n)})),t.on(\"element.changed\",(function(e){n.isSelected(e.element)&&i._updateSelectionOutline(n.get())}))}function Gt(e,t,n,i){e.on(\"create.end\",500,(function(e){var n=e.context,i=n.canExecute,o=n.elements,a=(n.hints||{}).autoSelect;if(i){if(!1===a)return;r(a)?t.select(a):t.select(o.filter($t))}})),e.on(\"connect.end\",500,(function(e){var n=e.context.connection;n&&t.select(n)})),e.on(\"shape.move.end\",500,(function(e){var n=e.previousSelection||[],r=i.get(e.context.shape.id);c(n,(function(e){return r.id===e.id}))||t.select(r)})),e.on(\"element.click\",(function(e){if(Mt(e)){var i=e.element;i===n.getRootElement()&&(i=null);var r=t.isSelected(i),o=t.get().length>1,a=kt(e)||function(e){var t=St(e)||e;return Mt(e)&&t.shiftKey}(e);if(r&&o)return a?t.deselect(i):t.select(i);r?t.deselect(i):t.select(i,a)}}))}function $t(e){return!e.hidden}zt.$inject=[\"canvas\",\"eventBus\",\"selection\"],zt.prototype._updateSelectionOutline=function(e){var t=this._canvas.getLayer(\"selectionOutline\");G(t);var n=e.length>1;if(V(this._canvas.getContainer())[n?\"add\":\"remove\"](\"djs-multi-select\"),n){var i=function(e){return{x:e.x-6,y:e.y-6,width:e.width+12,height:e.height+12}}(Nt(e)),r=U(\"rect\");j(r,w({rx:3},i)),V(r).add(\"djs-selection-outline\"),N(t,r)}},Gt.$inject=[\"eventBus\",\"selection\",\"canvas\",\"elementRegistry\"];var Ht={__init__:[\"selectionVisuals\",\"selectionBehavior\"],__depends__:[Ot,jt],selection:[\"type\",Ft],selectionVisuals:[\"type\",zt],selectionBehavior:[\"type\",Gt]};function Kt(e){this._counter=0,this._prefix=(e?e+\"-\":\"\")+Math.floor(1e9*Math.random())+\"-\"}Kt.prototype.next=function(){return this._prefix+ ++this._counter};var Ut=new Kt(\"ov\");function qt(e,t,n,i){var r,o;this._eventBus=t,this._canvas=n,this._elementRegistry=i,this._ids=Ut,this._overlayDefaults=w({show:null,scale:!0},e&&e.defaults),this._overlays={},this._overlayContainers=[],this._overlayRoot=(r=n.getContainer(),Re(o=He('<div class=\"djs-overlay-container\" />'),{position:\"absolute\",width:0,height:0}),r.insertBefore(o,r.firstChild),o),this._init()}function Yt(e,t,n){Re(e,{left:t+\"px\",top:n+\"px\"})}function Xt(e,t){e.style.display=!1===t?\"none\":\"\"}function Zt(e,t){e.style[\"transform-origin\"]=\"top left\",[\"\",\"-ms-\",\"-webkit-\"].forEach((function(n){e.style[n+\"transform\"]=t}))}qt.$inject=[\"config.overlays\",\"eventBus\",\"canvas\",\"elementRegistry\"],qt.prototype.get=function(e){if(l(e)&&(e={id:e}),l(e.element)&&(e.element=this._elementRegistry.get(e.element)),e.element){var t=this._getOverlayContainer(e.element,!0);return t?e.type?u(t.overlays,y({type:e.type})):t.overlays.slice():[]}return e.type?u(this._overlays,y({type:e.type})):e.id?this._overlays[e.id]:null},qt.prototype.add=function(e,t,n){if(o(t)&&(n=t,t=null),e.id||(e=this._elementRegistry.get(e)),!n.position)throw new Error(\"must specifiy overlay position\");if(!n.html)throw new Error(\"must specifiy overlay html\");if(!e)throw new Error(\"invalid element specified\");var i=this._ids.next();return n=w({},this._overlayDefaults,n,{id:i,type:t,element:e,html:n.html}),this._addOverlay(n),i},qt.prototype.remove=function(e){var t=this.get(e)||[];r(t)||(t=[t]);var n=this;h(t,(function(e){var t=n._getOverlayContainer(e.element,!0);if(e&&(Ue(e.html),Ue(e.htmlContainer),delete e.htmlContainer,delete e.element,delete n._overlays[e.id]),t){var i=t.overlays.indexOf(e);-1!==i&&t.overlays.splice(i,1)}}))},qt.prototype.isShown=function(){return\"none\"!==this._overlayRoot.style.display},qt.prototype.show=function(){Xt(this._overlayRoot)},qt.prototype.hide=function(){Xt(this._overlayRoot,!1)},qt.prototype.clear=function(){this._overlays={},this._overlayContainers=[],Pe(this._overlayRoot)},qt.prototype._updateOverlayContainer=function(e){var t=e.element,n=e.html,i=t.x,r=t.y;if(t.waypoints){var o=Nt(t);i=o.x,r=o.y}Yt(n,i,r),function(e,t,n){2==arguments.length?e.getAttribute(t):null===n?e.removeAttribute(t):e.setAttribute(t,n)}(e.html,\"data-container-id\",t.id)},qt.prototype._updateOverlay=function(e){var t,n,i=e.position,r=e.htmlContainer,o=e.element,a=i.left,s=i.top;void 0!==i.right&&(t=o.waypoints?Nt(o).width:o.width,a=-1*i.right+t);void 0!==i.bottom&&(n=o.waypoints?Nt(o).height:o.height,s=-1*i.bottom+n);Yt(r,a||0,s||0),this._updateOverlayVisibilty(e,this._canvas.viewbox())},qt.prototype._createOverlayContainer=function(e){var t=He('<div class=\"djs-overlays\" />');Re(t,{position:\"absolute\"}),this._overlayRoot.appendChild(t);var n={html:t,element:e,overlays:[]};return this._updateOverlayContainer(n),this._overlayContainers.push(n),n},qt.prototype._updateRoot=function(e){var t=e.scale||1,n=\"matrix(\"+[t,0,0,t,-1*e.x*t,-1*e.y*t].join(\",\")+\")\";Zt(this._overlayRoot,n)},qt.prototype._getOverlayContainer=function(e,t){var n=c(this._overlayContainers,(function(t){return t.element===e}));return n||t?n:this._createOverlayContainer(e)},qt.prototype._addOverlay=function(e){var t,n,i=e.id,r=e.element,o=e.html;o.get&&o.constructor.prototype.jquery&&(o=o.get(0)),l(o)&&(o=He(o)),n=this._getOverlayContainer(r),Re(t=He('<div class=\"djs-overlay\" data-overlay-id=\"'+i+'\">'),{position:\"absolute\"}),t.appendChild(o),e.type&&Me(t).add(\"djs-overlay-\"+e.type),Xt(t,this._canvas.findRoot(r)===this._canvas.getRootElement()),e.htmlContainer=t,n.overlays.push(e),n.html.appendChild(t),this._overlays[i]=e,this._updateOverlay(e),this._updateOverlayVisibilty(e,this._canvas.viewbox())},qt.prototype._updateOverlayVisibilty=function(e,t){var n=e.show,r=this._canvas.findRoot(e.element),o=n&&n.minZoom,a=n&&n.maxZoom,s=e.htmlContainer,l=!0;(r!==this._canvas.getRootElement()||n&&(i(o)&&o>t.scale||i(a)&&a<t.scale))&&(l=!1),Xt(s,l),this._updateOverlayScale(e,t)},qt.prototype._updateOverlayScale=function(e,t){var n,r,o,a=e.scale,s=e.htmlContainer,l=\"\";!0!==a&&(!1===a?(n=1,r=1):(n=a.min,r=a.max),i(n)&&t.scale<n&&(o=(1/t.scale||1)*n),i(r)&&t.scale>r&&(o=(1/t.scale||1)*r)),i(o)&&(l=\"scale(\"+o+\",\"+o+\")\"),Zt(s,l)},qt.prototype._updateOverlaysVisibilty=function(e){var t=this;h(this._overlays,(function(n){t._updateOverlayVisibilty(n,e)}))},qt.prototype._init=function(){var e=this._eventBus,t=this;e.on(\"canvas.viewbox.changing\",(function(e){t.hide()})),e.on(\"canvas.viewbox.changed\",(function(e){var n;n=e.viewbox,t._updateRoot(n),t._updateOverlaysVisibilty(n),t.show()})),e.on([\"shape.remove\",\"connection.remove\"],(function(e){var n=e.element;h(t.get({element:n}),(function(e){t.remove(e.id)}));var i=t._getOverlayContainer(n);if(i){Ue(i.html);var r=t._overlayContainers.indexOf(i);-1!==r&&t._overlayContainers.splice(r,1)}})),e.on(\"element.changed\",500,(function(e){var n=e.element,i=t._getOverlayContainer(n,!0);i&&(h(i.overlays,(function(e){t._updateOverlay(e)})),t._updateOverlayContainer(i))})),e.on(\"element.marker.update\",(function(e){var n=t._getOverlayContainer(e.element,!0);n&&Me(n.html)[e.add?\"add\":\"remove\"](e.marker)})),e.on(\"root.set\",(function(){t._updateOverlaysVisibilty(t._canvas.viewbox())})),e.on(\"diagram.clear\",this.clear,this)};var Jt={__init__:[\"overlays\"],overlays:[\"type\",qt]};function Qt(e,t,n,i){e.on(\"element.changed\",(function(i){var r=i.element;(r.parent||r===t.getRootElement())&&(i.gfx=n.getGraphics(r)),i.gfx&&e.fire(Bt(r)+\".changed\",i)})),e.on(\"elements.changed\",(function(t){var n=t.elements;n.forEach((function(t){e.fire(\"element.changed\",{element:t})})),i.updateContainments(n)})),e.on(\"shape.changed\",(function(e){i.update(\"shape\",e.element,e.gfx)})),e.on(\"connection.changed\",(function(e){i.update(\"connection\",e.element,e.gfx)}))}Qt.$inject=[\"eventBus\",\"canvas\",\"elementRegistry\",\"graphicsFactory\"];var en={__init__:[\"changeSupport\"],changeSupport:[\"type\",Qt]};function tn(e){this._eventBus=e}function nn(e){return function(t,n,i,r,o){(s(t)||a(t))&&(o=r,r=i,i=n,n=t,t=null),this.on(t,e,n,i,r,o)}}function rn(e,t){t.invoke(tn,this),this.executed((function(t){var n=t.context;n.rootElement?e.setRootElement(n.rootElement):n.rootElement=e.getRootElement()})),this.revert((function(t){var n=t.context;n.rootElement&&e.setRootElement(n.rootElement)}))}tn.$inject=[\"eventBus\"],tn.prototype.on=function(e,t,n,i,l,p){if((s(t)||a(t))&&(p=l,l=i,i=n,n=t,t=null),s(n)&&(p=l,l=i,i=n,n=1e3),o(l)&&(p=l,l=!1),!s(i))throw new Error(\"handlerFn must be a function\");r(e)||(e=[e]);var c=this._eventBus;h(e,(function(e){var r=[\"commandStack\",e,t].filter((function(e){return e})).join(\".\");c.on(r,n,l?function(e,t){return function(n){return e.call(t||null,n.context,n.command,n)}}(i,p):i,p)}))},tn.prototype.canExecute=nn(\"canExecute\"),tn.prototype.preExecute=nn(\"preExecute\"),tn.prototype.preExecuted=nn(\"preExecuted\"),tn.prototype.execute=nn(\"execute\"),tn.prototype.executed=nn(\"executed\"),tn.prototype.postExecute=nn(\"postExecute\"),tn.prototype.postExecuted=nn(\"postExecuted\"),tn.prototype.revert=nn(\"revert\"),tn.prototype.reverted=nn(\"reverted\"),e(rn,tn),rn.$inject=[\"canvas\",\"injector\"];var on={__init__:[\"rootElementsBehavior\"],rootElementsBehavior:[\"type\",rn]},an={\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\"};var sn=\"_plane\";function ln(e){var t=e.id;return A(e,\"bpmn:SubProcess\")?function(e){return e+sn}(t):t}function pn(e,t,n){var i=He('<ul class=\"bjs-breadcrumbs\"></ul>'),r=n.getContainer(),o=Me(r);r.appendChild(i);var a=[];function s(e){e&&(a=function(e){for(var t=S(e),n=[],i=t;i;i=i.$parent)(A(i,\"bpmn:SubProcess\")||A(i,\"bpmn:Process\"))&&n.push(i);return n.reverse()}(e));var r=a.map((function(e){var i,r=(i=\"\"+(i=e.name||e.id))&&i.replace(/[&<>\"']/g,(function(e){return an[e]})),o=He('<li><span class=\"bjs-crumb\"><a title=\"'+r+'\">'+r+\"</a></span></li>\"),a=n.findRoot(ln(e))||n.findRoot(e.id);if(!a&&A(e,\"bpmn:Process\")){var s=t.find((function(t){var n=S(t);return n&&n.get(\"processRef\")&&n.get(\"processRef\")===e}));a=n.findRoot(s.id)}return o.addEventListener(\"click\",(function(){n.setRootElement(a)})),o}));i.innerHTML=\"\";var s=r.length>1;o.toggle(\"bjs-breadcrumbs-shown\",s),r.forEach((function(e){i.appendChild(e)}))}e.on(\"element.changed\",(function(e){var t=S(e.element);c(a,(function(e){return e===t}))&&s()})),e.on(\"root.set\",(function(e){s(e.element)}))}function cn(e,t){var n=null,i=new un;e.on(\"root.set\",(function(e){var r=e.element,o=t.viewbox(),a=i.get(r);if(i.set(n,{x:o.x,y:o.y,zoom:o.scale}),n=r,!A(r,\"bpmn:Collaboration\")||a){a=a||{x:0,y:0,zoom:1};var s=(o.x-a.x)*o.scale,l=(o.y-a.y)*o.scale;0===s&&0===l||t.scroll({dx:s,dy:l}),a.zoom!==o.scale&&t.zoom(a.zoom,{x:0,y:0})}})),e.on(\"diagram.clear\",(function(){i.clear(),n=null}))}function un(){this._entries=[],this.set=function(e,t){var n=!1;for(var i in this._entries)if(this._entries[i][0]===e){this._entries[i][1]=t,n=!0;break}n||this._entries.push([e,t])},this.get=function(e){for(var t in this._entries)if(this._entries[t][0]===e)return this._entries[t][1];return null},this.clear=function(){this._entries.length=0},this.remove=function(e){var t=-1;for(var n in this._entries)if(this._entries[n][0]===e){t=n;break}-1!==t&&this._entries.splice(t,1)}}pn.$inject=[\"eventBus\",\"elementRegistry\",\"canvas\"],cn.$inject=[\"eventBus\",\"canvas\"];var hn=180,mn=160;function fn(e,t){this._eventBus=e,this._moddle=t;var n=this;e.on(\"import.render.start\",1500,(function(e,t){n._handleImport(t.definitions)}))}function dn(e){return A(e,\"bpmndi:BPMNDiagram\")?e:dn(e.$parent)}fn.prototype._handleImport=function(e){if(e.diagrams){var t=this;this._definitions=e,this._processToDiagramMap={},e.diagrams.forEach((function(e){e.plane&&e.plane.bpmnElement&&(t._processToDiagramMap[e.plane.bpmnElement.id]=e)}));var n=[];e.diagrams.forEach((function(e){var i=t._createNewDiagrams(e.plane);Array.prototype.push.apply(n,i)})),n.forEach((function(e){t._movePlaneElementsToOrigin(e.plane)}))}},fn.prototype._createNewDiagrams=function(e){var t=this,n=[],i=[];e.get(\"planeElement\").forEach((function(t){var r=t.bpmnElement;if(r){var o=r.$parent;A(r,\"bpmn:SubProcess\")&&!t.isExpanded&&n.push(r),function(e,t){var n=e.$parent;if(!A(n,\"bpmn:SubProcess\")||n===t.bpmnElement)return!1;if(function(e,t){return d(t,(function(t){return A(e,t)}))}(e,[\"bpmn:DataInputAssociation\",\"bpmn:DataOutputAssociation\"]))return!1;return!0}(r,e)&&i.push({diElement:t,parent:o})}}));var r=[];return n.forEach((function(e){if(!t._processToDiagramMap[e.id]){var n=t._createDiagram(e);t._processToDiagramMap[e.id]=n,r.push(n)}})),i.forEach((function(e){for(var i=e.diElement,r=e.parent;r&&-1===n.indexOf(r);)r=r.$parent;if(r){var o=t._processToDiagramMap[r.id];t._moveToDiPlane(i,o.plane)}})),r},fn.prototype._movePlaneElementsToOrigin=function(e){var t=e.get(\"planeElement\"),n=function(e){var t={top:1/0,right:-1/0,bottom:-1/0,left:1/0};return e.planeElement.forEach((function(e){if(e.bounds){var n=dt(e.bounds);t.top=Math.min(n.top,t.top),t.left=Math.min(n.left,t.left)}})),function(e){return{x:e.left,y:e.top,width:e.right-e.left,height:e.bottom-e.top}}(t)}(e),i=n.x-hn,r=n.y-mn;t.forEach((function(e){e.waypoint?e.waypoint.forEach((function(e){e.x=e.x-i,e.y=e.y-r})):e.bounds&&(e.bounds.x=e.bounds.x-i,e.bounds.y=e.bounds.y-r)}))},fn.prototype._moveToDiPlane=function(e,t){var n=dn(e).plane.get(\"planeElement\");n.splice(n.indexOf(e),1),t.get(\"planeElement\").push(e)},fn.prototype._createDiagram=function(e){var t=this._moddle.create(\"bpmndi:BPMNPlane\",{bpmnElement:e}),n=this._moddle.create(\"bpmndi:BPMNDiagram\",{plane:t});return t.$parent=n,t.bpmnElement=e,n.$parent=this._definitions,this._definitions.diagrams.push(n),n},fn.$inject=[\"eventBus\",\"moddle\"];var yn=250;function gn(e,t,n,i){tn.call(this,t),this._canvas=e,this._eventBus=t,this._elementRegistry=n,this._overlays=i;var r=this;this.executed(\"shape.toggleCollapse\",yn,(function(e){var t=e.shape;r._canDrillDown(t)?r._addOverlay(t):r._removeOverlay(t)}),!0),this.reverted(\"shape.toggleCollapse\",yn,(function(e){var t=e.shape;r._canDrillDown(t)?r._addOverlay(t):r._removeOverlay(t)}),!0),this.executed([\"shape.create\",\"shape.move\",\"shape.delete\"],yn,(function(e){var t=e.oldParent,n=e.newParent||e.parent,i=e.shape;r._canDrillDown(i)&&r._addOverlay(i),r._updateDrilldownOverlay(t),r._updateDrilldownOverlay(n),r._updateDrilldownOverlay(i)}),!0),this.reverted([\"shape.create\",\"shape.move\",\"shape.delete\"],yn,(function(e){var t=e.oldParent,n=e.newParent||e.parent,i=e.shape;r._canDrillDown(i)&&r._addOverlay(i),r._updateDrilldownOverlay(t),r._updateDrilldownOverlay(n),r._updateDrilldownOverlay(i)}),!0),t.on(\"import.render.complete\",(function(){n.filter((function(e){return r._canDrillDown(e)})).map((function(e){r._addOverlay(e)}))}))}e(gn,tn),gn.prototype._updateDrilldownOverlay=function(e){var t=this._canvas;if(e){var n=t.findRoot(e);n&&this._updateOverlayVisibility(n)}},gn.prototype._canDrillDown=function(e){var t=this._canvas;return A(e,\"bpmn:SubProcess\")&&t.findRoot(ln(e))},gn.prototype._updateOverlayVisibility=function(e){var t=this._overlays,n=S(e),i=t.get({element:n.id,type:\"drilldown\"})[0];if(i){var r=n&&n.get(\"flowElements\")&&n.get(\"flowElements\").length;Me(i.html).toggle(\"bjs-drilldown-empty\",!r)}},gn.prototype._addOverlay=function(e){var t=this._canvas,n=this._overlays;n.get({element:e,type:\"drilldown\"}).length&&this._removeOverlay(e);var i=He('<button class=\"bjs-drilldown\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 16 16\"><path fill-rule=\"evenodd\" d=\"M4.81801948,3.50735931 L10.4996894,9.1896894 L10.5,4 L12,4 L12,12 L4,12 L4,10.5 L9.6896894,10.4996894 L3.75735931,4.56801948 C3.46446609,4.27512627 3.46446609,3.80025253 3.75735931,3.50735931 C4.05025253,3.21446609 4.52512627,3.21446609 4.81801948,3.50735931 Z\"/></svg></button>');i.addEventListener(\"click\",(function(){t.setRootElement(t.findRoot(ln(e)))})),n.add(e,\"drilldown\",{position:{bottom:-7,right:-8},html:i}),this._updateOverlayVisibility(e)},gn.prototype._removeOverlay=function(e){this._overlays.remove({element:e,type:\"drilldown\"})},gn.$inject=[\"canvas\",\"eventBus\",\"elementRegistry\",\"overlays\"];var vn={__depends__:[Jt,en,on],__init__:[\"drilldownBreadcrumbs\",\"drilldownOverlayBehavior\",\"drilldownCentering\",\"subprocessCompatibility\"],drilldownBreadcrumbs:[\"type\",pn],drilldownCentering:[\"type\",cn],drilldownOverlayBehavior:[\"type\",gn],subprocessCompatibility:[\"type\",fn]};const bn=/^class[ {]/;function xn(e){return Array.isArray(e)}function wn(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function En(...e){1===e.length&&xn(e[0])&&(e=e[0]);const t=(e=[...e]).pop();return t.$inject=e,t}const _n=/constructor\\s*[^(]*\\(\\s*([^)]*)\\)/m,An=/^(?:async\\s+)?(?:function\\s*[^(]*)?(?:\\(\\s*([^)]*)\\)|(\\w+))/m,Sn=/\\/\\*([^*]*)\\*\\//m;function Rn(e){if(\"function\"!=typeof e)throw new Error(`Cannot annotate \"${e}\". Expected a function!`);const t=e.toString().match(function(e){return bn.test(e.toString())}(e)?_n:An);if(!t)return[];const n=t[1]||t[2];return n&&n.split(\",\").map((e=>{const t=e.match(Sn);return(t&&t[1]||e).trim()}))||[]}function Cn(e,t){t=t||{get:function(e,t){if(n.push(e),!1===t)return null;throw a(`No provider for \"${e}\"!`)}};const n=[],i=this._providers=Object.create(t._providers||null),r=this._instances=Object.create(null),o=r.injector=this,a=function(e){const t=n.join(\" -> \");return n.length=0,new Error(t?`${e} (Resolving: ${t})`:e)};function s(e,o){if(!i[e]&&-1!==e.indexOf(\".\")){const t=e.split(\".\");let n=s(t.shift());for(;t.length;)n=n[t.shift()];return n}if(wn(r,e))return r[e];if(wn(i,e)){if(-1!==n.indexOf(e))throw n.push(e),a(\"Cannot resolve circular dependency!\");return n.push(e),r[e]=i[e][0](i[e][1]),n.pop(),r[e]}return t.get(e,o)}function l(e,t){if(void 0===t&&(t={}),\"function\"!=typeof e){if(!xn(e))throw a(`Cannot invoke \"${e}\". Expected a function!`);e=En(e.slice())}return{fn:e,dependencies:(e.$inject||Rn(e)).map((e=>wn(t,e)?t[e]:s(e)))}}function p(e){const{fn:t,dependencies:n}=l(e);return new(Function.prototype.bind.apply(t,[null].concat(n)))}function c(e,t,n){const{fn:i,dependencies:r}=l(e,n);return i.apply(t,r)}function u(e){return En((t=>e.get(t)))}function h(e,t){if(t&&t.length){const n=Object.create(null),r=Object.create(null),o=[],a=[],s=[];let l,p,c,h;for(let e in i)l=i[e],-1!==t.indexOf(e)&&(\"private\"===l[2]?(p=o.indexOf(l[3]),-1===p?(c=l[3].createChild([],t),h=u(c),o.push(l[3]),a.push(c),s.push(h),n[e]=[h,e,\"private\",c]):n[e]=[s[p],e,\"private\",a[p]]):n[e]=[l[2],l[1]],r[e]=!0),\"factory\"!==l[2]&&\"type\"!==l[2]||!l[1].$scope||t.forEach((t=>{-1!==l[1].$scope.indexOf(t)&&(n[e]=[l[2],l[1]],r[t]=!0)}));t.forEach((e=>{if(!r[e])throw new Error('No provider for \"'+e+'\". Cannot use provider from the parent!')})),e.unshift(n)}return new Cn(e,o)}const m={factory:c,type:p,value:function(e){return e}};function f(e,t){const n=e.__init__||[];return function(){n.forEach((e=>{\"string\"==typeof e?t.get(e):t.invoke(e)}))}}function d(e){const t=e.__exports__;if(t){const n=e.__modules__,r=Object.keys(e).reduce(((t,n)=>(\"__exports__\"!==n&&\"__modules__\"!==n&&\"__init__\"!==n&&\"__depends__\"!==n&&(t[n]=e[n]),t)),Object.create(null)),o=h((n||[]).concat(r)),a=En((function(e){return o.get(e)}));t.forEach((function(e){i[e]=[a,e,\"private\",o]}));const s=(e.__init__||[]).slice();return s.unshift((function(){o.init()})),f(e=Object.assign({},e,{__init__:s}),o)}return Object.keys(e).forEach((function(t){if(\"__init__\"===t||\"__depends__\"===t)return;if(\"private\"===e[t][2])return void(i[t]=e[t]);const n=e[t][0],r=e[t][1];i[t]=[m[n],Mn(n,r),n]})),f(e,o)}function y(e,t){return-1!==e.indexOf(t)||-1!==(e=(t.__depends__||[]).reduce(y,e)).indexOf(t)?e:e.concat(t)}this.get=s,this.invoke=c,this.instantiate=p,this.createChild=h,this.init=function(e){const t=e.reduce(y,[]).map(d);let n=!1;return function(){n||(n=!0,t.forEach((e=>e())))}}(e)}function Mn(e,t){return\"value\"!==e&&xn(t)&&(t=En(t.slice())),t}function kn(e,t){_.call(this,e,1),this.CONNECTION_STYLE=t.style([\"no-fill\"],{strokeWidth:5,stroke:\"fuchsia\"}),this.SHAPE_STYLE=t.style({fill:\"white\",stroke:\"fuchsia\",strokeWidth:2}),this.FRAME_STYLE=t.style([\"no-fill\"],{stroke:\"fuchsia\",strokeDasharray:4,strokeWidth:2})}e(kn,_),kn.prototype.canRender=function(){return!0},kn.prototype.drawShape=function(e,t,n){var i=U(\"rect\");return j(i,{x:0,y:0,width:t.width||0,height:t.height||0}),Lt(t)?j(i,w({},this.FRAME_STYLE,n||{})):j(i,w({},this.SHAPE_STYLE,n||{})),N(e,i),i},kn.prototype.drawConnection=function(e,t,n){var i=he(t.waypoints,w({},this.CONNECTION_STYLE,n||{}));return N(e,i),i},kn.prototype.getShapePath=function(e){var t=e.x,n=e.y,i=e.width;return se([[\"M\",t,n],[\"l\",i,0],[\"l\",0,e.height],[\"l\",-i,0],[\"z\"]])},kn.prototype.getConnectionPath=function(e){var t,n,i=e.waypoints,r=[];for(t=0;n=i[t];t++)n=n.original||n,r.push([0===t?\"M\":\"L\",n.x,n.y]);return se(r)},kn.$inject=[\"eventBus\",\"styles\"];var Pn={__init__:[\"defaultRenderer\"],defaultRenderer:[\"type\",kn],styles:[\"type\",function(){var e={\"no-fill\":{fill:\"none\"},\"no-border\":{strokeOpacity:0},\"no-events\":{pointerEvents:\"none\"}},t=this;this.cls=function(e,t,n){return w(this.style(t,n),{class:e})},this.style=function(t,n){r(t)||n||(n=t,t=[]);var i=m(t,(function(t,n){return w(t,e[n]||{})}),{});return n?w(i,n):i},this.computeStyle=function(e,n,i){return r(n)||(i=n,n=[]),t.style(n||[],w({},i,e||{}))}}]};function Dn(e,t){return Math.round(e*t)/t}function Tn(e){return a(e)?e+\"px\":e}function On(e,t,n){const i=U(\"g\");V(i).add(t);const r=void 0!==n?n:e.childNodes.length-1;return e.insertBefore(i,e.childNodes[r]||null),i}const Nn={shape:[\"x\",\"y\",\"width\",\"height\"],connection:[\"waypoints\"]};function Bn(e,t,n,i){this._eventBus=t,this._elementRegistry=i,this._graphicsFactory=n,this._rootsIdx=0,this._layers={},this._planes=[],this._rootElement=null,this._init(e||{})}function Ln(e,t){const n=\"matrix(\"+t.a+\",\"+t.b+\",\"+t.c+\",\"+t.d+\",\"+t.e+\",\"+t.f+\")\";e.setAttribute(\"transform\",n)}Bn.$inject=[\"config.canvas\",\"eventBus\",\"graphicsFactory\",\"elementRegistry\"],Bn.prototype._init=function(e){const t=this._eventBus,n=this._container=function(e){const t=(e=w({},{width:\"100%\",height:\"100%\"},e)).container||document.body,n=document.createElement(\"div\");return n.setAttribute(\"class\",\"djs-container djs-parent\"),Re(n,{position:\"relative\",overflow:\"hidden\",width:Tn(e.width),height:Tn(e.height)}),t.appendChild(n),n}(e),i=this._svg=U(\"svg\");j(i,{width:\"100%\",height:\"100%\"}),N(n,i);const r=this._viewport=On(i,\"viewport\");!1!==e.deferUpdate&&(this._viewboxChanged=function(e,t){let n,i,r,o;function a(n){let a=Date.now(),p=n?0:o+t-a;if(p>0)return s(p);e.apply(r,i),l()}function s(e){n=setTimeout(a,e)}function l(){n&&clearTimeout(n),n=o=i=r=void 0}function p(...e){o=Date.now(),i=e,r=this,n||s(t)}return p.flush=function(){n&&a(!0),l()},p.cancel=l,p}(x(this._viewboxChanged,this),300)),t.on(\"diagram.init\",(()=>{t.fire(\"canvas.init\",{svg:i,viewport:r})})),t.on([\"shape.added\",\"connection.added\",\"shape.removed\",\"connection.removed\",\"elements.changed\",\"root.set\"],(()=>{delete this._cachedViewbox})),t.on(\"diagram.destroy\",500,this._destroy,this),t.on(\"diagram.clear\",500,this._clear,this)},Bn.prototype._destroy=function(){this._eventBus.fire(\"canvas.destroy\",{svg:this._svg,viewport:this._viewport});const e=this._container.parentNode;e&&e.removeChild(this._container),delete this._svg,delete this._container,delete this._layers,delete this._planes,delete this._rootElement,delete this._viewport},Bn.prototype._clear=function(){this._elementRegistry.getAll().forEach((e=>{const t=Bt(e);\"root\"===t?this.removeRootElement(e):this._removeElement(e,t)})),this._planes=[],this._rootElement=null,delete this._cachedViewbox},Bn.prototype.getDefaultLayer=function(){return this.getLayer(\"base\",0)},Bn.prototype.getLayer=function(e,t){if(!e)throw new Error(\"must specify a name\");let n=this._layers[e];if(n||(n=this._layers[e]=this._createLayer(e,t)),void 0!==t&&n.index!==t)throw new Error(\"layer <\"+e+\"> already created at index <\"+t+\">\");return n.group},Bn.prototype._getChildIndex=function(e){return m(this._layers,(function(t,n){return n.visible&&e>=n.index&&t++,t}),0)},Bn.prototype._createLayer=function(e,t){void 0===t&&(t=1);const n=this._getChildIndex(t);return{group:On(this._viewport,\"layer-\"+e,n),index:t,visible:!0}},Bn.prototype.showLayer=function(e){if(!e)throw new Error(\"must specify a name\");const t=this._layers[e];if(!t)throw new Error(\"layer <\"+e+\"> does not exist\");const n=this._viewport,i=t.group,r=t.index;if(t.visible)return i;const o=this._getChildIndex(r);return n.insertBefore(i,n.childNodes[o]||null),t.visible=!0,i},Bn.prototype.hideLayer=function(e){if(!e)throw new Error(\"must specify a name\");const t=this._layers[e];if(!t)throw new Error(\"layer <\"+e+\"> does not exist\");const n=t.group;return t.visible?(z(n),t.visible=!1,n):n},Bn.prototype._removeLayer=function(e){const t=this._layers[e];t&&(delete this._layers[e],z(t.group))},Bn.prototype.getActiveLayer=function(){const e=this._findPlaneForRoot(this.getRootElement());return e?e.layer:null},Bn.prototype.findRoot=function(e){if(\"string\"==typeof e&&(e=this._elementRegistry.get(e)),!e)return;const t=this._findPlaneForRoot(function(e){for(;e.parent;)e=e.parent;return e}(e))||{};return t.rootElement},Bn.prototype.getRootElements=function(){return this._planes.map((function(e){return e.rootElement}))},Bn.prototype._findPlaneForRoot=function(e){return c(this._planes,(function(t){return t.rootElement===e}))},Bn.prototype.getContainer=function(){return this._container},Bn.prototype._updateMarker=function(e,t,n){let i;e.id||(e=this._elementRegistry.get(e)),i=this._elementRegistry._elements[e.id],i&&(h([i.gfx,i.secondaryGfx],(function(e){e&&(n?V(e).add(t):V(e).remove(t))})),this._eventBus.fire(\"element.marker.update\",{element:e,gfx:i.gfx,marker:t,add:!!n}))},Bn.prototype.addMarker=function(e,t){this._updateMarker(e,t,!0)},Bn.prototype.removeMarker=function(e,t){this._updateMarker(e,t,!1)},Bn.prototype.hasMarker=function(e,t){e.id||(e=this._elementRegistry.get(e));return V(this.getGraphics(e)).has(t)},Bn.prototype.toggleMarker=function(e,t){this.hasMarker(e,t)?this.removeMarker(e,t):this.addMarker(e,t)},Bn.prototype.getRootElement=function(){const e=this._rootElement;return e||this._planes.length?e:this.setRootElement(this.addRootElement(null))},Bn.prototype.addRootElement=function(e){const t=this._rootsIdx++;e||(e={id:\"__implicitroot_\"+t,children:[],isImplicit:!0});const n=e.layer=\"root-\"+t;this._ensureValid(\"root\",e);const i=this.getLayer(n,0);return this.hideLayer(n),this._addRoot(e,i),this._planes.push({rootElement:e,layer:i}),e},Bn.prototype.removeRootElement=function(e){\"string\"==typeof e&&(e=this._elementRegistry.get(e));if(this._findPlaneForRoot(e))return this._removeRoot(e),this._removeLayer(e.layer),this._planes=this._planes.filter((function(t){return t.rootElement!==e})),this._rootElement===e&&(this._rootElement=null),e},Bn.prototype.setRootElement=function(e){if(e===this._rootElement)return;let t;if(!e)throw new Error(\"rootElement required\");return t=this._findPlaneForRoot(e),t||(e=this.addRootElement(e)),this._setRoot(e),e},Bn.prototype._removeRoot=function(e){const t=this._elementRegistry,n=this._eventBus;n.fire(\"root.remove\",{element:e}),n.fire(\"root.removed\",{element:e}),t.remove(e)},Bn.prototype._addRoot=function(e,t){const n=this._elementRegistry,i=this._eventBus;i.fire(\"root.add\",{element:e}),n.add(e,t),i.fire(\"root.added\",{element:e,gfx:t})},Bn.prototype._setRoot=function(e,t){const n=this._rootElement;n&&(this._elementRegistry.updateGraphics(n,null,!0),this.hideLayer(n.layer)),e&&(t||(t=this._findPlaneForRoot(e).layer),this._elementRegistry.updateGraphics(e,this._svg,!0),this.showLayer(e.layer)),this._rootElement=e,this._eventBus.fire(\"root.set\",{element:e})},Bn.prototype._ensureValid=function(e,t){if(!t.id)throw new Error(\"element must have an id\");if(this._elementRegistry.get(t.id))throw new Error(\"element <\"+t.id+\"> already exists\");const n=Nn[e],i=f(n,(function(e){return void 0!==t[e]}));if(!i)throw new Error(\"must supply { \"+n.join(\", \")+\" } with \"+e)},Bn.prototype._setParent=function(e,t,n){!function(e,t,n){if(e&&t){\"number\"!=typeof n&&(n=-1);var i=e.indexOf(t);if(-1!==i){if(i===n)return;if(-1===n)return;e.splice(i,1)}-1!==n?e.splice(n,0,t):e.push(t)}}(t.children,e,n),e.parent=t},Bn.prototype._addElement=function(e,t,n,i){n=n||this.getRootElement();const r=this._eventBus,o=this._graphicsFactory;this._ensureValid(e,t),r.fire(e+\".add\",{element:t,parent:n}),this._setParent(t,n,i);const a=o.create(e,t,i);return this._elementRegistry.add(t,a),o.update(e,t,a),r.fire(e+\".added\",{element:t,gfx:a}),t},Bn.prototype.addShape=function(e,t,n){return this._addElement(\"shape\",e,t,n)},Bn.prototype.addConnection=function(e,t,n){return this._addElement(\"connection\",e,t,n)},Bn.prototype._removeElement=function(e,t){const n=this._elementRegistry,i=this._graphicsFactory,r=this._eventBus;if(e=n.get(e.id||e))return r.fire(t+\".remove\",{element:e}),i.remove(e),function(e,t){if(!e||!t)return-1;var n=e.indexOf(t);-1!==n&&e.splice(n,1)}(e.parent&&e.parent.children,e),e.parent=null,r.fire(t+\".removed\",{element:e}),n.remove(e),e},Bn.prototype.removeShape=function(e){return this._removeElement(e,\"shape\")},Bn.prototype.removeConnection=function(e){return this._removeElement(e,\"connection\")},Bn.prototype.getGraphics=function(e,t){return this._elementRegistry.getGraphics(e,t)},Bn.prototype._changeViewbox=function(e){this._eventBus.fire(\"canvas.viewbox.changing\"),e.apply(this),this._cachedViewbox=null,this._viewboxChanged()},Bn.prototype._viewboxChanged=function(){this._eventBus.fire(\"canvas.viewbox.changed\",{viewbox:this.viewbox()})},Bn.prototype.viewbox=function(e){if(void 0===e&&this._cachedViewbox)return this._cachedViewbox;const t=this._viewport,n=this.getSize();let i,r,o,a,s,l,p;return e?(this._changeViewbox((function(){s=Math.min(n.width/e.width,n.height/e.height);const i=this._svg.createSVGMatrix().scale(s).translate(-e.x,-e.y);ae(t,i)})),e):(o=this._rootElement?this.getActiveLayer():null,i=o&&o.getBBox()||{},a=ae(t),r=a?a.matrix:function(e,t,n,i,r,o){var a=Y().createSVGMatrix();switch(arguments.length){case 0:return a;case 1:return X(a,e);case 6:return X(a,{a:e,b:t,c:n,d:i,e:r,f:o})}}(),s=Dn(r.a,1e3),l=Dn(-r.e||0,1e3),p=Dn(-r.f||0,1e3),e=this._cachedViewbox={x:l?l/s:0,y:p?p/s:0,width:n.width/s,height:n.height/s,scale:s,inner:{width:i.width||0,height:i.height||0,x:i.x||0,y:i.y||0},outer:n})},Bn.prototype.scroll=function(e){const t=this._viewport;let n=t.getCTM();return e&&this._changeViewbox((function(){e=w({dx:0,dy:0},e||{}),n=this._svg.createSVGMatrix().translate(e.dx,e.dy).multiply(n),Ln(t,n)})),{x:n.e,y:n.f}},Bn.prototype.scrollToElement=function(e,t){let n=100;\"string\"==typeof e&&(e=this._elementRegistry.get(e));const i=this.findRoot(e);i!==this.getRootElement()&&this.setRootElement(i),t||(t={}),\"number\"==typeof t&&(n=t),t={top:t.top||n,right:t.right||n,bottom:t.bottom||n,left:t.left||n};const r=Nt(e),o=dt(r),a=this.viewbox(),s=this.zoom();let l,p;a.y+=t.top/s,a.x+=t.left/s,a.width-=(t.right+t.left)/s,a.height-=(t.bottom+t.top)/s;const c=dt(a);if(r.width<a.width&&r.height<a.height){const e=Math.max(0,o.right-c.right),t=Math.min(0,o.left-c.left),n=Math.max(0,o.bottom-c.bottom),i=Math.min(0,o.top-c.top);l=e||t,p=n||i}else l=r.x-a.x,p=r.y-a.y;this.scroll({dx:-l*s,dy:-p*s})},Bn.prototype.zoom=function(e,t){if(!e)return this.viewbox(e).scale;if(\"fit-viewport\"===e)return this._fitViewport(t);let n,i;return this._changeViewbox((function(){\"object\"!=typeof t&&(n=this.viewbox().outer,t={x:n.width/2,y:n.height/2}),i=this._setZoom(e,t)})),Dn(i.a,1e3)},Bn.prototype._fitViewport=function(e){const t=this.viewbox(),n=t.outer,i=t.inner;let r,o;return i.x>=0&&i.y>=0&&i.x+i.width<=n.width&&i.y+i.height<=n.height&&!e?o={x:0,y:0,width:Math.max(i.width+i.x,n.width),height:Math.max(i.height+i.y,n.height)}:(r=Math.min(1,n.width/i.width,n.height/i.height),o={x:i.x+(e?i.width/2-n.width/r/2:0),y:i.y+(e?i.height/2-n.height/r/2:0),width:n.width/r,height:n.height/r}),this.viewbox(o),this.viewbox(!1).scale},Bn.prototype._setZoom=function(e,t){const n=this._svg,i=this._viewport,r=n.createSVGMatrix(),o=n.createSVGPoint();let a,s,l,p,c;l=i.getCTM();const u=l.a;return t?(a=w(o,t),s=a.matrixTransform(l.inverse()),p=r.translate(s.x,s.y).scale(1/u*e).translate(-s.x,-s.y),c=l.multiply(p)):c=r.scale(e),Ln(this._viewport,c),c},Bn.prototype.getSize=function(){return{width:this._container.clientWidth,height:this._container.clientHeight}},Bn.prototype.getAbsoluteBBox=function(e){const t=this.viewbox();let n;if(e.waypoints){n=this.getGraphics(e).getBBox()}else n=e;return{x:n.x*t.scale-t.x*t.scale,y:n.y*t.scale-t.y*t.scale,width:n.width*t.scale,height:n.height*t.scale}},Bn.prototype.resized=function(){delete this._cachedViewbox,this._eventBus.fire(\"canvas.resized\")};var In=\"data-element-id\";function jn(e){this._elements={},this._eventBus=e}jn.$inject=[\"eventBus\"],jn.prototype.add=function(e,t,n){var i=e.id;this._validateId(i),j(t,In,i),n&&j(n,In,i),this._elements[i]={element:e,gfx:t,secondaryGfx:n}},jn.prototype.remove=function(e){var t=this._elements,n=e.id||e,i=n&&t[n];i&&(j(i.gfx,In,\"\"),i.secondaryGfx&&j(i.secondaryGfx,In,\"\"),delete t[n])},jn.prototype.updateId=function(e,t){this._validateId(t),\"string\"==typeof e&&(e=this.get(e)),this._eventBus.fire(\"element.updateId\",{element:e,newId:t});var n=this.getGraphics(e),i=this.getGraphics(e,!0);this.remove(e),e.id=t,this.add(e,n,i)},jn.prototype.updateGraphics=function(e,t,n){var i=e.id||e,r=this._elements[i];return n?r.secondaryGfx=t:r.gfx=t,t&&j(t,In,i),t},jn.prototype.get=function(e){var t;t=\"string\"==typeof e?e:e&&j(e,In);var n=this._elements[t];return n&&n.element},jn.prototype.filter=function(e){var t=[];return this.forEach((function(n,i){e(n,i)&&t.push(n)})),t},jn.prototype.find=function(e){for(var t=this._elements,n=Object.keys(t),i=0;i<n.length;i++){var r=t[n[i]],o=r.element;if(e(o,r.gfx))return o}},jn.prototype.getAll=function(){return this.filter((function(e){return e}))},jn.prototype.forEach=function(e){var t=this._elements;Object.keys(t).forEach((function(n){var i=t[n],r=i.element,o=i.gfx;return e(r,o)}))},jn.prototype.getGraphics=function(e,t){var n=e.id||e,i=this._elements[n];return i&&(t?i.secondaryGfx:i.gfx)},jn.prototype._validateId=function(e){if(!e)throw new Error(\"element must have an id\");if(this._elements[e])throw new Error(\"element with id \"+e+\" already added\")};var Fn={exports:{}},Vn={};Vn.extend=function(e,t,n,i){var r=n.inverse;return Object.defineProperty(e,\"remove\",{value:function(e){var n=this.indexOf(e);return-1!==n&&(this.splice(n,1),t.unset(e,r,i)),e}}),Object.defineProperty(e,\"contains\",{value:function(e){return-1!==this.indexOf(e)}}),Object.defineProperty(e,\"add\",{value:function(e,n){var o=this.indexOf(e);if(void 0===n){if(-1!==o)return;n=this.length}-1!==o&&this.splice(o,1),this.splice(n,0,e),-1===o&&t.set(e,r,i)}}),Object.defineProperty(e,\"__refs_collection\",{value:!0}),e},Vn.isExtended=function(e){return!0===e.__refs_collection};var Wn=Vn;function zn(e,t,n){var i=Wn.extend(n[t.name]||[],e,t,n);Object.defineProperty(n,t.name,{enumerable:t.enumerable,value:i}),i.length&&i.forEach((function(i){e.set(i,t.inverse,n)}))}function Gn(e,t){if(!(this instanceof Gn))return new Gn(e,t);e.inverse=t,t.inverse=e,this.props={},this.props[e.name]=e,this.props[t.name]=t}Gn.prototype.bind=function(e,t){if(\"string\"==typeof t){if(!this.props[t])throw new Error(\"no property <\"+t+\"> in ref\");t=this.props[t]}t.collection?zn(this,t,e):function(e,t,n){var i=t.inverse,r=n[t.name];Object.defineProperty(n,t.name,{configurable:t.configurable,enumerable:t.enumerable,get:function(){return r},set:function(t){if(t!==r){var o=r;r=null,o&&e.unset(o,i,n),r=t,e.set(r,i,n)}}})}(this,t,e)},Gn.prototype.ensureRefsCollection=function(e,t){var n=e[t.name];return Wn.isExtended(n)||zn(this,t,e),n},Gn.prototype.ensureBound=function(e,t){(function(e,t){return Object.prototype.hasOwnProperty.call(e,t.name||t)})(e,t)||this.bind(e,t)},Gn.prototype.unset=function(e,t,n){e&&(this.ensureBound(e,t),t.collection?this.ensureRefsCollection(e,t).remove(n):e[t.name]=void 0)},Gn.prototype.set=function(e,t,n){e&&(this.ensureBound(e,t),t.collection?this.ensureRefsCollection(e,t).add(n):e[t.name]=n)};var $n=Gn;Fn.exports=$n,Fn.exports.Collection=Vn;var Hn=ft(Fn.exports),Kn=new Hn({name:\"children\",enumerable:!0,collection:!0},{name:\"parent\"}),Un=new Hn({name:\"labels\",enumerable:!0,collection:!0},{name:\"labelTarget\"}),qn=new Hn({name:\"attachers\",collection:!0},{name:\"host\"}),Yn=new Hn({name:\"outgoing\",collection:!0},{name:\"source\"}),Xn=new Hn({name:\"incoming\",collection:!0},{name:\"target\"});function Zn(){Object.defineProperty(this,\"businessObject\",{writable:!0}),Object.defineProperty(this,\"label\",{get:function(){return this.labels[0]},set:function(e){var t=this.label,n=this.labels;!e&&t?n.remove(t):n.add(e,0)}}),Kn.bind(this,\"parent\"),Un.bind(this,\"labels\"),Yn.bind(this,\"outgoing\"),Xn.bind(this,\"incoming\")}function Jn(){Zn.call(this),Kn.bind(this,\"children\"),qn.bind(this,\"host\"),qn.bind(this,\"attachers\")}function Qn(){Zn.call(this),Kn.bind(this,\"children\")}function ei(){Jn.call(this),Un.bind(this,\"labelTarget\")}function ti(){Zn.call(this),Yn.bind(this,\"source\"),Xn.bind(this,\"target\")}e(Jn,Zn),e(Qn,Jn),e(ei,Jn),e(ti,Zn);var ni={connection:ti,shape:Jn,label:ei,root:Qn};function ii(){this._uid=12}ii.prototype.createRoot=function(e){return this.create(\"root\",e)},ii.prototype.createLabel=function(e){return this.create(\"label\",e)},ii.prototype.createShape=function(e){return this.create(\"shape\",e)},ii.prototype.createConnection=function(e){return this.create(\"connection\",e)},ii.prototype.create=function(e,t){return(t=w({},t||{})).id||(t.id=e+\"_\"+this._uid++),function(e,t){var n=ni[e];if(!n)throw new Error(\"unknown type: <\"+e+\">\");return w(new n,t)}(e,t)};var ri=\"__fn\",oi=Array.prototype.slice;function ai(){this._listeners={},this.on(\"diagram.destroy\",1,this._destroy,this)}function si(){}function li(e,t){this._eventBus=e,this._elementRegistry=t}function pi(e,t,n){var i=n||t.firstChild;e!==i&&t.insertBefore(e,i)}ai.prototype.on=function(e,t,n,i){if(e=r(e)?e:[e],s(t)&&(i=n,n=t,t=1e3),!a(t))throw new Error(\"priority must be a number\");var o=n;i&&((o=x(n,i))[ri]=n[ri]||n);var l=this;e.forEach((function(e){l._addListener(e,{priority:t,callback:o,next:null})}))},ai.prototype.once=function(e,t,n,i){var r=this;if(s(t)&&(i=n,n=t,t=1e3),!a(t))throw new Error(\"priority must be a number\");function o(){o.__isTomb=!0;var t=n.apply(i,arguments);return r.off(e,o),t}o[ri]=n,this.on(e,t,o)},ai.prototype.off=function(e,t){e=r(e)?e:[e];var n=this;e.forEach((function(e){n._removeListener(e,t)}))},ai.prototype.createEvent=function(e){var t=new si;return t.init(e),t},ai.prototype.fire=function(e,t){var n,i,r,o;if(o=oi.call(arguments),\"object\"==typeof e&&(e=(t=e).type),!e)throw new Error(\"no event type specified\");if(i=this._listeners[e]){n=t instanceof si?t:this.createEvent(t),o[0]=n;var a=n.type;e!==a&&(n.type=e);try{r=this._invokeListeners(n,o,i)}finally{e!==a&&(n.type=a)}return void 0===r&&n.defaultPrevented&&(r=!1),r}},ai.prototype.handleError=function(e){return!1===this.fire(\"error\",{error:e})},ai.prototype._destroy=function(){this._listeners={}},ai.prototype._invokeListeners=function(e,t,n){for(var i;n&&!e.cancelBubble;)i=this._invokeListener(e,t,n),n=n.next;return i},ai.prototype._invokeListener=function(e,t,n){var i;if(n.callback.__isTomb)return i;try{i=function(e,t){return e.apply(null,t)}(n.callback,t),void 0!==i&&(e.returnValue=i,e.stopPropagation()),!1===i&&e.preventDefault()}catch(e){if(!this.handleError(e))throw console.error(\"unhandled error in event listener\",e),e}return i},ai.prototype._addListener=function(e,t){var n,i=this._getListeners(e);if(i){for(;i;){if(i.priority<t.priority)return t.next=i,void(n?n.next=t:this._setListeners(e,t));n=i,i=i.next}n.next=t}else this._setListeners(e,t)},ai.prototype._getListeners=function(e){return this._listeners[e]},ai.prototype._setListeners=function(e,t){this._listeners[e]=t},ai.prototype._removeListener=function(e,t){var n,i,r,o=this._getListeners(e);if(t)for(;o;)n=o.next,(r=o.callback)!==t&&r[ri]!==t||(i?i.next=n:this._setListeners(e,n)),i=o,o=n;else this._setListeners(e,null)},si.prototype.stopPropagation=function(){this.cancelBubble=!0},si.prototype.preventDefault=function(){this.defaultPrevented=!0},si.prototype.init=function(e){w(this,e||{})},li.$inject=[\"eventBus\",\"elementRegistry\"],li.prototype._getChildrenContainer=function(e){var t,n=this._elementRegistry.getGraphics(e);return e.parent?(t=function(e){return e.parentNode.childNodes[1]}(n),t||(V(t=U(\"g\")).add(\"djs-children\"),N(n.parentNode,t))):t=n,t},li.prototype._clear=function(e){var t=function(e){return e.childNodes[0]}(e);return Pe(t),t},li.prototype._createContainer=function(e,t,n,i){var r=U(\"g\");V(r).add(\"djs-group\"),void 0!==n?pi(r,t,t.childNodes[n]):N(t,r);var o=U(\"g\");V(o).add(\"djs-element\"),V(o).add(\"djs-\"+e),i&&V(o).add(\"djs-frame\"),N(r,o);var a=U(\"g\");return V(a).add(\"djs-visual\"),N(o,a),o},li.prototype.create=function(e,t,n){var i=this._getChildrenContainer(t.parent);return this._createContainer(e,i,n,Lt(t))},li.prototype.updateContainments=function(e){var t,n=this,i=this._elementRegistry;t=m(e,(function(e,t){return t.parent&&(e[t.parent.id]=t.parent),e}),{}),h(t,(function(e){var t=e.children;if(t){var r=n._getChildrenContainer(e);h(t.slice().reverse(),(function(e){pi(i.getGraphics(e).parentNode,r)}))}}))},li.prototype.drawShape=function(e,t){return this._eventBus.fire(\"render.shape\",{gfx:e,element:t})},li.prototype.getShapePath=function(e){return this._eventBus.fire(\"render.getShapePath\",e)},li.prototype.drawConnection=function(e,t){return this._eventBus.fire(\"render.connection\",{gfx:e,element:t})},li.prototype.getConnectionPath=function(e){return this._eventBus.fire(\"render.getConnectionPath\",e)},li.prototype.update=function(e,t,n){if(t.parent){var i=this._clear(n);if(\"shape\"===e)this.drawShape(i,t),Ye(n,t.x,t.y);else{if(\"connection\"!==e)throw new Error(\"unknown type: \"+e);this.drawConnection(i,t)}t.hidden?j(n,\"display\",\"none\"):j(n,\"display\",\"block\")}},li.prototype.remove=function(e){z(this._elementRegistry.getGraphics(e).parentNode)};var ci={__depends__:[Pn],__init__:[\"canvas\"],canvas:[\"type\",Bn],elementRegistry:[\"type\",jn],elementFactory:[\"type\",ii],eventBus:[\"type\",ai],graphicsFactory:[\"type\",li]};function ui(e){return function(e){var t=new Cn(e);return t.init(),t}([{config:[\"value\",e=e||{}]},ci].concat(e.modules||[]))}function hi(e,t){this._injector=t=t||ui(e),this.get=t.get,this.invoke=t.invoke,this.get(\"eventBus\").fire(\"diagram.init\")}function mi(){}function fi(e,t){this.model=e,this.properties=t}hi.prototype.destroy=function(){this.get(\"eventBus\").fire(\"diagram.destroy\")},hi.prototype.clear=function(){this.get(\"eventBus\").fire(\"diagram.clear\")},mi.prototype.get=function(e){return this.$model.properties.get(this,e)},mi.prototype.set=function(e,t){this.$model.properties.set(this,e,t)},fi.prototype.createType=function(e){var t=this.model,n=this.properties,i=Object.create(mi.prototype);h(e.properties,(function(e){e.isMany||void 0===e.default||(i[e.name]=e.default)})),n.defineModel(i,t),n.defineDescriptor(i,e);var r=e.ns.name;function o(e){n.define(this,\"$type\",{value:r,enumerable:!0}),n.define(this,\"$attrs\",{value:{}}),n.define(this,\"$parent\",{writable:!0}),h(e,x((function(e,t){this.set(t,e)}),this))}return o.prototype=i,o.hasType=i.$instanceOf=this.model.hasType,n.defineModel(o,t),n.defineDescriptor(o,e),o};var di={String:!0,Boolean:!0,Integer:!0,Real:!0,Element:!0},yi={String:function(e){return e},Boolean:function(e){return\"true\"===e},Integer:function(e){return parseInt(e,10)},Real:function(e){return parseFloat(e)}};function gi(e,t){var n=yi[e];return n?n(t):t}function vi(e){return!!di[e]}function bi(e){return!!yi[e]}function xi(e,t){var n,i,r=e.split(/:/);if(1===r.length)n=e,i=t;else{if(2!==r.length)throw new Error(\"expected <prefix:localName> or <localName>, got \"+e);n=r[1],i=r[0]}return{name:e=(i?i+\":\":\"\")+n,prefix:i,localName:n}}function wi(e){this.ns=e,this.name=e.name,this.allTypes=[],this.allTypesByName={},this.properties=[],this.propertiesByName={}}function Ei(e,t){this.packageMap={},this.typeMap={},this.packages=[],this.properties=t,h(e,x(this.registerPackage,this))}function _i(e,t,n){var i=t[n];if(i in e)throw new Error(\"package with \"+n+\" <\"+i+\"> already defined\")}function Ai(e){this.model=e}function Si(e,t,n){Object.defineProperty(e,t.name,{enumerable:!t.isReference,writable:!0,value:n,configurable:!0})}function Ri(e){this.properties=new Ai(this),this.factory=new fi(this,this.properties),this.registry=new Ei(e,this.properties),this.typeCache={}}wi.prototype.build=function(){return function(e,t){let n={},i=Object(e);return h(t,(function(t){t in i&&(n[t]=e[t])})),n}(this,[\"ns\",\"name\",\"allTypes\",\"allTypesByName\",\"properties\",\"propertiesByName\",\"bodyProperty\",\"idProperty\"])},wi.prototype.addProperty=function(e,t,n){\"boolean\"==typeof t&&(n=t,t=void 0),this.addNamedProperty(e,!1!==n);var i=this.properties;void 0!==t?i.splice(t,0,e):i.push(e)},wi.prototype.replaceProperty=function(e,t,n){var i=e.ns,r=this.properties,o=this.propertiesByName,a=e.name!==t.name;if(e.isId){if(!t.isId)throw new Error(\"property <\"+t.ns.name+\"> must be id property to refine <\"+e.ns.name+\">\");this.setIdProperty(t,!1)}if(e.isBody){if(!t.isBody)throw new Error(\"property <\"+t.ns.name+\"> must be body property to refine <\"+e.ns.name+\">\");this.setBodyProperty(t,!1)}var s=r.indexOf(e);if(-1===s)throw new Error(\"property <\"+i.name+\"> not found in property list\");r.splice(s,1),this.addProperty(t,n?void 0:s,a),o[i.name]=o[i.localName]=t},wi.prototype.redefineProperty=function(e,t,n){var i=e.ns.prefix,r=t.split(\"#\"),o=xi(r[0],i),a=xi(r[1],o.prefix).name,s=this.propertiesByName[a];if(!s)throw new Error(\"refined property <\"+a+\"> not found\");this.replaceProperty(s,e,n),delete e.redefines},wi.prototype.addNamedProperty=function(e,t){var n=e.ns,i=this.propertiesByName;t&&(this.assertNotDefined(e,n.name),this.assertNotDefined(e,n.localName)),i[n.name]=i[n.localName]=e},wi.prototype.removeNamedProperty=function(e){var t=e.ns,n=this.propertiesByName;delete n[t.name],delete n[t.localName]},wi.prototype.setBodyProperty=function(e,t){if(t&&this.bodyProperty)throw new Error(\"body property defined multiple times (<\"+this.bodyProperty.ns.name+\">, <\"+e.ns.name+\">)\");this.bodyProperty=e},wi.prototype.setIdProperty=function(e,t){if(t&&this.idProperty)throw new Error(\"id property defined multiple times (<\"+this.idProperty.ns.name+\">, <\"+e.ns.name+\">)\");this.idProperty=e},wi.prototype.assertNotDefined=function(e,t){var n=e.name,i=this.propertiesByName[n];if(i)throw new Error(\"property <\"+n+\"> already defined; override of <\"+i.definedBy.ns.name+\"#\"+i.ns.name+\"> by <\"+e.definedBy.ns.name+\"#\"+e.ns.name+\"> not allowed without redefines\")},wi.prototype.hasProperty=function(e){return this.propertiesByName[e]},wi.prototype.addTrait=function(e,t){var n=this.allTypesByName,i=this.allTypes,r=e.name;r in n||(h(e.properties,x((function(n){n=w({},n,{name:n.ns.localName,inherited:t}),Object.defineProperty(n,\"definedBy\",{value:e});var i=n.replaces,r=n.redefines;i||r?this.redefineProperty(n,i||r,i):(n.isBody&&this.setBodyProperty(n),n.isId&&this.setIdProperty(n),this.addProperty(n))}),this)),i.push(e),n[r]=e)},Ei.prototype.getPackage=function(e){return this.packageMap[e]},Ei.prototype.getPackages=function(){return this.packages},Ei.prototype.registerPackage=function(e){e=w({},e);var t=this.packageMap;_i(t,e,\"prefix\"),_i(t,e,\"uri\"),h(e.types,x((function(t){this.registerType(t,e)}),this)),t[e.uri]=t[e.prefix]=e,this.packages.push(e)},Ei.prototype.registerType=function(e,t){var n=xi((e=w({},e,{superClass:(e.superClass||[]).slice(),extends:(e.extends||[]).slice(),properties:(e.properties||[]).slice(),meta:w(e.meta||{})})).name,t.prefix),i=n.name,r={};h(e.properties,x((function(e){var t=xi(e.name,n.prefix),i=t.name;vi(e.type)||(e.type=xi(e.type,t.prefix).name),w(e,{ns:t,name:i}),r[i]=e}),this)),w(e,{ns:n,name:i,propertiesByName:r}),h(e.extends,x((function(e){var t=this.typeMap[e];t.traits=t.traits||[],t.traits.push(i)}),this)),this.definePackage(e,t),this.typeMap[i]=e},Ei.prototype.mapTypes=function(e,t,n){var i=vi(e.name)?{name:e.name}:this.typeMap[e.name],r=this;function o(e){return a(e,!0)}function a(n,i){var o=xi(n,vi(n)?\"\":e.prefix);r.mapTypes(o,t,i)}if(!i)throw new Error(\"unknown type <\"+e.name+\">\");h(i.superClass,n?o:a),t(i,!n),h(i.traits,o)},Ei.prototype.getEffectiveDescriptor=function(e){var t=xi(e),n=new wi(t);this.mapTypes(t,(function(e,t){n.addTrait(e,t)}));var i=n.build();return this.definePackage(i,i.allTypes[i.allTypes.length-1].$pkg),i},Ei.prototype.definePackage=function(e,t){this.properties.define(e,\"$pkg\",{value:t})},Ai.prototype.set=function(e,t,n){if(!l(t)||!t.length)throw new TypeError(\"property name must be a non-empty string\");var i=this.model.getPropertyDescriptor(e,t),r=i&&i.name;void 0===n?i?delete e[r]:delete e.$attrs[t]:i?r in e?e[r]=n:Si(e,i,n):e.$attrs[t]=n},Ai.prototype.get=function(e,t){var n=this.model.getPropertyDescriptor(e,t);if(!n)return e.$attrs[t];var i=n.name;return!e[i]&&n.isMany&&Si(e,n,[]),e[i]},Ai.prototype.define=function(e,t,n){if(!n.writable){var i=n.value;delete(n=w({},n,{get:function(){return i}})).value}Object.defineProperty(e,t,n)},Ai.prototype.defineDescriptor=function(e,t){this.define(e,\"$descriptor\",{value:t})},Ai.prototype.defineModel=function(e,t){this.define(e,\"$model\",{value:t})},Ri.prototype.create=function(e,t){var n=this.getType(e);if(!n)throw new Error(\"unknown type <\"+e+\">\");return new n(t)},Ri.prototype.getType=function(e){var t=this.typeCache,n=l(e)?e:e.ns.name,i=t[n];return i||(e=this.registry.getEffectiveDescriptor(n),i=t[n]=this.factory.createType(e)),i},Ri.prototype.createAny=function(e,t,n){var i=xi(e),r={$type:e,$instanceOf:function(e){return e===this.$type}},a={name:e,isGeneric:!0,ns:{prefix:i.prefix,localName:i.localName,uri:t}};return this.properties.defineDescriptor(r,a),this.properties.defineModel(r,this),this.properties.define(r,\"$parent\",{enumerable:!1,writable:!0}),this.properties.define(r,\"$instanceOf\",{enumerable:!1,writable:!0}),h(n,(function(e,t){o(e)&&void 0!==e.value?r[e.name]=e.value:r[t]=e})),r},Ri.prototype.getPackage=function(e){return this.registry.getPackage(e)},Ri.prototype.getPackages=function(){return this.registry.getPackages()},Ri.prototype.getElementDescriptor=function(e){return e.$descriptor},Ri.prototype.hasType=function(e,t){return void 0===t&&(t=e,e=this),t in e.$model.getElementDescriptor(e).allTypesByName},Ri.prototype.getPropertyDescriptor=function(e,t){return this.getElementDescriptor(e).propertiesByName[t]},Ri.prototype.getTypeDescriptor=function(e){return this.registry.typeMap[e]};var Ci=String.fromCharCode,Mi=Object.prototype.hasOwnProperty,ki=/&#(\\d+);|&#x([0-9a-f]+);|&(\\w+);/gi,Pi={amp:\"&\",apos:\"'\",gt:\">\",lt:\"<\",quot:'\"'};function Di(e,t,n,i){return i?Mi.call(Pi,i)?Pi[i]:\"&\"+i+\";\":Ci(t||parseInt(n,16))}function Ti(e){return e.length>3&&-1!==e.indexOf(\"&\")?e.replace(ki,Di):e}Object.keys(Pi).forEach((function(e){Pi[e.toUpperCase()]=Pi[e]}));var Oi=\"xsi:type\",Ni=\"non-whitespace outside of root node\";function Bi(e){return new Error(e)}function Li(e){return\"missing namespace for prefix <\"+e+\">\"}function Ii(e){return{get:e,enumerable:!0}}function ji(e){var t,n={};for(t in e)n[t]=e[t];return n}function Fi(e){return e+\"$uri\"}function Vi(){return{line:0,column:0}}function Wi(e){throw e}function zi(e){if(!this)return new zi(e);var t,n,i,r,o,a,s,l,p,c=e&&e.proxy,u=Wi,h=Vi,m=!1,f=!1,d=null,y=!1;function g(e){e instanceof Error||(e=Bi(e)),d=e,u(e,h)}function v(e){o&&(e instanceof Error||(e=Bi(e)),o(e,h))}this.on=function(e,p){if(\"function\"!=typeof p)throw Bi(\"required args <name, cb>\");switch(e){case\"openTag\":n=p;break;case\"text\":t=p;break;case\"closeTag\":i=p;break;case\"error\":u=p;break;case\"warn\":o=p;break;case\"cdata\":r=p;break;case\"attention\":l=p;break;case\"question\":s=p;break;case\"comment\":a=p;break;default:throw Bi(\"unsupported event: \"+e)}return this},this.ns=function(e){if(void 0===e&&(e={}),\"object\"!=typeof e)throw Bi(\"required args <nsMap={}>\");var t,n={};for(t in e)n[t]=e[t];return n[\"http://www.w3.org/2001/XMLSchema-instance\"]=\"xsi\",f=!0,p=n,this},this.parse=function(e){if(\"string\"!=typeof e)throw Bi(\"required args <xml=string>\");return d=null,function(e){var o,u,d,b,x,w,E,_,A,S,R,C=f?[]:null,M=f?function(e){var t,n,i={};for(t in e)i[n=e[t]]=n,i[Fi(n)]=t;return i}(p):null,k=[],P=0,D=!1,T=!1,O=0,N=0,B=\"\",L=0;function I(){if(null!==R)return R;var e,t,n,i,r,o,a,s,l,c,u,h=f&&M.xmlns,d=f&&m?[]:null,y=L,g=B,b=g.length,x={},w={};e:for(;y<b;y++)if(l=!1,!(32===(c=g.charCodeAt(y))||c<14&&c>8)){for((c<65||c>122||c>90&&c<97)&&95!==c&&58!==c&&(v(\"illegal first char attribute name\"),l=!0),u=y+1;u<b;u++)if(!((c=g.charCodeAt(u))>96&&c<123||c>64&&c<91||c>47&&c<59||46===c||45===c||95===c)){if(32===c||c<14&&c>8){v(\"missing attribute value\"),y=u;continue e}if(61===c)break;v(\"illegal attribute name char\"),l=!0}if(\"xmlns:xmlns\"===(s=g.substring(y,u))&&(v(\"illegal declaration of xmlns\"),l=!0),34===(c=g.charCodeAt(u+1)))-1===(u=g.indexOf('\"',y=u+2))&&-1!==(u=g.indexOf(\"'\",y))&&(v(\"attribute value quote missmatch\"),l=!0);else if(39===c)-1===(u=g.indexOf(\"'\",y=u+2))&&-1!==(u=g.indexOf('\"',y))&&(v(\"attribute value quote missmatch\"),l=!0);else for(v(\"missing attribute value quotes\"),l=!0,u+=1;u<b&&!(32===(c=g.charCodeAt(u+1))||c<14&&c>8);u++);for(-1===u&&(v(\"missing closing quotes\"),u=b,l=!0),l||(o=g.substring(y,u)),y=u;u+1<b&&!(32===(c=g.charCodeAt(u+1))||c<14&&c>8);u++)y===u&&(v(\"illegal character after attribute end\"),l=!0);if(y=u+1,!l)if(s in w)v(\"attribute <\"+s+\"> already defined\");else if(w[s]=!0,f)if(m){if(null!==(r=\"xmlns\"===s?\"xmlns\":120===s.charCodeAt(0)&&\"xmlns:\"===s.substr(0,6)?s.substr(6):null)){if(e=Ti(o),t=Fi(r),!(a=p[e])){if(\"xmlns\"===r||t in M&&M[t]!==e)do{a=\"ns\"+P++}while(void 0!==M[a]);else a=r;p[e]=a}M[r]!==a&&(i||(M=ji(M),i=!0),M[r]=a,\"xmlns\"===r&&(M[Fi(a)]=e,h=a),M[t]=e),x[s]=o;continue}d.push(s,o)}else-1!==(c=s.indexOf(\":\"))?(n=M[s.substring(0,c)])?((s=h===n?s.substr(c+1):n+s.substr(c))===Oi&&(-1!==(c=o.indexOf(\":\"))?(n=o.substring(0,c),o=(n=M[n]||n)+o.substring(c)):o=h+\":\"+o),x[s]=o):v(Li(s.substring(0,c))):x[s]=o;else x[s]=o}if(m)for(y=0,b=d.length;y<b;y++){if(s=d[y++],o=d[y],-1!==(c=s.indexOf(\":\"))){if(!(n=M[s.substring(0,c)])){v(Li(s.substring(0,c)));continue}(s=h===n?s.substr(c+1):n+s.substr(c))===Oi&&(-1!==(c=o.indexOf(\":\"))?(n=o.substring(0,c),o=(n=M[n]||n)+o.substring(c)):o=h+\":\"+o)}x[s]=o}return R=x}function j(){for(var t,n,i=/(\\r\\n|\\r|\\n)/g,r=0,o=0,a=0,s=N;O>=a&&(t=i.exec(e))&&!((s=t[0].length+t.index)>O);)r+=1,a=s;return-1==O?(o=s,n=e.substring(N)):0===N?n=e.substring(N,O):(o=O-a,n=-1==N?e.substring(O):e.substring(O,N+1)),{data:n,line:r,column:o}}h=j,c&&(S=Object.create({},{name:Ii((function(){return _})),originalName:Ii((function(){return A})),attrs:Ii(I),ns:Ii((function(){return M}))}));for(;-1!==N;){if(-1===(O=60===e.charCodeAt(N)?N:e.indexOf(\"<\",N)))return k.length?g(\"unexpected end of file\"):0===N?g(\"missing start tag\"):void(N<e.length&&e.substring(N).trim()&&v(Ni));if(N!==O)if(k.length){if(t&&(t(e.substring(N,O),Ti,h),y))return}else if(e.substring(N,O).trim()&&(v(Ni),y))return;if(33===(x=e.charCodeAt(O+1))){if(91===(b=e.charCodeAt(O+2))&&\"CDATA[\"===e.substr(O+3,6)){if(-1===(N=e.indexOf(\"]]>\",O)))return g(\"unclosed cdata\");if(r&&(r(e.substring(O+9,N),h),y))return;N+=3;continue}if(45===b&&45===e.charCodeAt(O+3)){if(-1===(N=e.indexOf(\"--\\x3e\",O)))return g(\"unclosed comment\");if(a&&(a(e.substring(O+4,N),Ti,h),y))return;N+=3;continue}}if(63!==x){for(u=O+1;;u++){if(w=e.charCodeAt(u),isNaN(w))return N=-1,g(\"unclosed tag\");if(34===w)u=-1!==(b=e.indexOf('\"',u+1))?b:u;else if(39===w)u=-1!==(b=e.indexOf(\"'\",u+1))?b:u;else if(62===w){N=u;break}}if(33!==x){if(R={},47===x){if(D=!1,T=!0,!k.length)return g(\"missing open tag\");if(u=_=k.pop(),b=O+2+u.length,e.substring(O+2,b)!==u)return g(\"closing tag mismatch\");for(;b<N;b++)if(!(32===(x=e.charCodeAt(b))||x>8&&x<14))return g(\"close tag\")}else{if(47===e.charCodeAt(N-1)?(u=_=e.substring(O+1,N-1),D=!0,T=!0):(u=_=e.substring(O+1,N),D=!0,T=!1),!(x>96&&x<123||x>64&&x<91||95===x||58===x))return g(\"illegal first char nodeName\");for(b=1,d=u.length;b<d;b++)if(!((x=u.charCodeAt(b))>96&&x<123||x>64&&x<91||x>47&&x<59||45===x||95===x||46==x)){if(32===x||x<14&&x>8){_=u.substring(0,b),R=null;break}return g(\"invalid nodeName\")}T||k.push(_)}if(f){if(o=M,D&&(T||C.push(o),null===R&&(m=-1!==u.indexOf(\"xmlns\",b))&&(L=b,B=u,I(),m=!1)),A=_,-1!==(x=_.indexOf(\":\"))){if(!(E=M[_.substring(0,x)]))return g(\"missing namespace on <\"+A+\">\");_=_.substr(x+1)}else E=M.xmlns;E&&(_=E+\":\"+_)}if(D&&(L=b,B=u,n&&(c?n(S,Ti,T,h):n(_,I,Ti,T,h),y)))return;if(T){if(i&&(i(c?S:_,Ti,D,h),y))return;f&&(M=D?o:C.pop())}N+=1}else{if(l&&(l(e.substring(O,N+1),Ti,h),y))return;N+=1}}else{if(-1===(N=e.indexOf(\"?>\",O)))return g(\"unclosed question\");if(s&&(s(e.substring(O,N+2),h),y))return;N+=2}}}(e),h=Vi,y=!1,d},this.stop=function(){y=!0}}function Gi(e){return e.xml&&\"lowerCase\"===e.xml.tagAlias}var $i={xsi:\"http://www.w3.org/2001/XMLSchema-instance\",xml:\"http://www.w3.org/XML/1998/namespace\"},Hi=\"xsi:type\";function Ki(e){return e.xml&&e.xml.serialize}function Ui(e){return Ki(e)===Hi}function qi(e,t){return Gi(t)?e.prefix+\":\"+((n=e.localName).charAt(0).toUpperCase()+n.slice(1)):e.name;var n}function Yi(e){return new Error(e)}function Xi(e){return e.$descriptor}function Zi(e){w(this,e),this.elementsById={},this.references=[],this.warnings=[],this.addReference=function(e){this.references.push(e)},this.addElement=function(e){if(!e)throw Yi(\"expected element\");var t,n=this.elementsById,i=Xi(e).idProperty;if(i&&(t=e.get(i.name))){if(n[t])throw Yi(\"duplicate ID <\"+t+\">\");n[t]=e}},this.addWarning=function(e){this.warnings.push(e)}}function Ji(){}function Qi(){}function er(){}function tr(e,t){this.property=e,this.context=t}function nr(e,t){this.element=t,this.propertyDesc=e}function ir(){}function rr(e,t,n){this.model=e,this.type=e.getType(t),this.context=n}function or(e,t,n){rr.call(this,e,t,n)}function ar(e,t,n){this.model=e,this.context=n}function sr(e){e instanceof Ri&&(e={model:e}),w(this,{lax:!1},e)}Ji.prototype.handleEnd=function(){},Ji.prototype.handleText=function(){},Ji.prototype.handleNode=function(){},Qi.prototype=Object.create(Ji.prototype),Qi.prototype.handleNode=function(){return this},er.prototype=Object.create(Ji.prototype),er.prototype.handleText=function(e){this.body=(this.body||\"\")+e},tr.prototype=Object.create(er.prototype),tr.prototype.handleNode=function(e){if(this.element)throw Yi(\"expected no sub nodes\");return this.element=this.createReference(e),this},tr.prototype.handleEnd=function(){this.element.id=this.body},tr.prototype.createReference=function(e){return{property:this.property.ns.name,id:\"\"}},nr.prototype=Object.create(er.prototype),nr.prototype.handleEnd=function(){var e=this.body||\"\",t=this.element,n=this.propertyDesc;e=gi(n.type,e),n.isMany?t.get(n.name).push(e):t.set(n.name,e)},ir.prototype=Object.create(er.prototype),ir.prototype.handleNode=function(e){var t=this,n=this.element;return n?t=this.handleChild(e):(n=this.element=this.createElement(e),this.context.addElement(n)),t},rr.prototype=Object.create(ir.prototype),rr.prototype.addReference=function(e){this.context.addReference(e)},rr.prototype.handleText=function(e){if(!Xi(this.element).bodyProperty)throw Yi(\"unexpected body text <\"+e+\">\");er.prototype.handleText.call(this,e)},rr.prototype.handleEnd=function(){var e=this.body,t=this.element,n=Xi(t).bodyProperty;n&&void 0!==e&&(e=gi(n.type,e),t.set(n.name,e))},rr.prototype.createElement=function(e){var t,n=e.attributes,i=this.type,r=Xi(i),o=this.context,a=new i({}),s=this.model;return h(n,(function(e,n){var i=r.propertiesByName[n];i&&i.isReference?i.isMany?h(e.split(\" \"),(function(e){o.addReference({element:a,property:i.ns.name,id:e})})):o.addReference({element:a,property:i.ns.name,id:e}):(i?e=gi(i.type,e):\"xmlns\"!==n&&(t=xi(n,r.ns.prefix),s.getPackage(t.prefix)&&o.addWarning({message:\"unknown attribute <\"+n+\">\",element:a,property:n,value:e})),a.set(n,e))})),a},rr.prototype.getPropertyForNode=function(e){var t,n,i=xi(e.name),r=this.type,o=this.model,a=Xi(r),s=i.name,l=a.propertiesByName[s];if(l&&!l.isAttr)return Ui(l)&&(t=e.attributes[Hi])?(t=function(e,t){var n=xi(e);return function(e,t){var n=e.name,i=e.localName,r=t.xml&&t.xml.typePrefix;return r&&0===i.indexOf(r)?e.prefix+\":\"+i.slice(r.length):n}(n,t.getPackage(n.prefix))}(t,o),w({},l,{effectiveType:Xi(n=o.getType(t)).name})):l;var p=o.getPackage(i.prefix);if(p){if(t=qi(i,p),n=o.getType(t),l=c(a.properties,(function(e){return!e.isVirtual&&!e.isReference&&!e.isAttribute&&n.hasType(e.type)})))return w({},l,{effectiveType:Xi(n).name})}else if(l=c(a.properties,(function(e){return!e.isReference&&!e.isAttribute&&\"Element\"===e.type})))return l;throw Yi(\"unrecognized element <\"+i.name+\">\")},rr.prototype.toString=function(){return\"ElementDescriptor[\"+Xi(this.type).name+\"]\"},rr.prototype.valueHandler=function(e,t){return new nr(e,t)},rr.prototype.referenceHandler=function(e){return new tr(e,this.context)},rr.prototype.handler=function(e){return\"Element\"===e?new ar(this.model,e,this.context):new rr(this.model,e,this.context)},rr.prototype.handleChild=function(e){var t,n,i,r;if(t=this.getPropertyForNode(e),i=this.element,bi(n=t.effectiveType||t.type))return this.valueHandler(t,i);var o=(r=t.isReference?this.referenceHandler(t).handleNode(e):this.handler(n).handleNode(e)).element;return void 0!==o&&(t.isMany?i.get(t.name).push(o):i.set(t.name,o),t.isReference?(w(o,{element:i}),this.context.addReference(o)):o.$parent=i),r},or.prototype=Object.create(rr.prototype),or.prototype.createElement=function(e){var t=e.name,n=xi(t),i=this.model,r=this.type,o=i.getPackage(n.prefix),a=o&&qi(n,o)||t;if(!r.hasType(a))throw Yi(\"unexpected element <\"+e.originalName+\">\");return rr.prototype.createElement.call(this,e)},ar.prototype=Object.create(ir.prototype),ar.prototype.createElement=function(e){var t=e.name,n=xi(t).prefix,i=e.ns[n+\"$uri\"],r=e.attributes;return this.model.createAny(t,i,r)},ar.prototype.handleChild=function(e){var t=new ar(this.model,\"Element\",this.context).handleNode(e),n=this.element,i=t.element;return void 0!==i&&((n.$children=n.$children||[]).push(i),i.$parent=n),t},ar.prototype.handleEnd=function(){this.body&&(this.element.$body=this.body)},sr.prototype.fromXML=function(e,t,n){var i=t.rootHandler;t instanceof rr?(i=t,t={}):\"string\"==typeof t?(i=this.handler(t),t={}):\"string\"==typeof i&&(i=this.handler(i));var r=this.model,o=this.lax,a=new Zi(w({},t,{rootHandler:i})),s=new zi({proxy:!0}),l=function(){var e=[];return Object.defineProperty(e,\"peek\",{value:function(){return this[this.length-1]}}),e}();function p(e,t,n){var i=t(),r=i.line,o=i.column,s=i.data;\"<\"===s.charAt(0)&&-1!==s.indexOf(\" \")&&(s=s.slice(0,s.indexOf(\" \"))+\">\");var l=\"unparsable content \"+(s?s+\" \":\"\")+\"detected\\n\\tline: \"+r+\"\\n\\tcolumn: \"+o+\"\\n\\tnested error: \"+e.message;if(n)return a.addWarning({message:l,error:e}),!0;throw Yi(l)}function c(e,t){return p(e,t,!0)}i.context=a,l.push(i);var u=/^<\\?xml /i,h=/ encoding=\"([^\"]+)\"/i,m=/^utf-8$/i;function f(e,t){try{l.peek().handleText(e)}catch(e){c(e,t)}}var d=r.getPackages().reduce((function(e,t){return e[t.uri]=t.prefix,e}),{\"http://www.w3.org/XML/1998/namespace\":\"xml\"});return s.ns(d).on(\"openTag\",(function(e,t,n,i){var r=e.attrs||{},a=Object.keys(r).reduce((function(e,n){var i=t(r[n]);return e[n]=i,e}),{});!function(e,t){var n=l.peek();try{l.push(n.handleNode(e))}catch(e){p(e,t,o)&&l.push(new Qi)}}({name:e.name,originalName:e.originalName,attributes:a,ns:e.ns},i)})).on(\"question\",(function(e){if(u.test(e)){var t=h.exec(e),n=t&&t[1];n&&!m.test(n)&&a.addWarning({message:\"unsupported document encoding <\"+n+\">, falling back to UTF-8\"})}})).on(\"closeTag\",(function(){l.pop().handleEnd()})).on(\"cdata\",f).on(\"text\",(function(e,t,n){!function(e,t){e.trim()&&f(e,t)}(t(e),n)})).on(\"error\",p).on(\"warn\",c),new Promise((function(t,n){var r;try{s.parse(e),function(){var e,t,n=a.elementsById,i=a.references;for(e=0;t=i[e];e++){var r=t.element,o=n[t.id],s=Xi(r).propertiesByName[t.property];if(o||a.addWarning({message:\"unresolved reference <\"+t.id+\">\",element:t.element,property:t.property,value:t.id}),s.isMany){var l=r.get(s.name),p=l.indexOf(t);-1===p&&(p=l.length),o?l[p]=o:l.splice(p,1)}else r.set(s.name,o)}}()}catch(e){r=e}var o=i.element;r||o||(r=Yi(\"failed to parse document as <\"+i.type.$descriptor.name+\">\"));var l=a.warnings,p=a.references,c=a.elementsById;return r?(r.warnings=l,n(r)):t({rootElement:o,elementsById:c,references:p,warnings:l})}))},sr.prototype.handler=function(e){return new or(this.model,e)};var lr=/<|>|'|\"|&|\\n\\r|\\n/g,pr=/<|>|&/g;function cr(e){var t={},n={},i={},r=[],o=[];this.byUri=function(t){return n[t]||e&&e.byUri(t)},this.add=function(e,t){n[e.uri]=e,t?r.push(e):o.push(e),this.mapPrefix(e.prefix,e.uri)},this.uriByPrefix=function(e){return t[e||\"xmlns\"]},this.mapPrefix=function(e,n){t[e||\"xmlns\"]=n},this.getNSKey=function(e){return void 0!==e.prefix?e.uri+\"|\"+e.prefix:e.uri},this.logUsed=function(t){var n=t.uri,r=this.getNSKey(t);i[r]=this.byUri(n),e&&e.logUsed(t)},this.getUsed=function(e){var t=this;return[].concat(r,o).filter((function(e){var n=t.getNSKey(e);return i[n]}))}}function ur(e,t){return Gi(t)?(n=e).charAt(0).toLowerCase()+n.slice(1):e;var n}function hr(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}function mr(e){return l(e)?e:(e.prefix?e.prefix+\":\":\"\")+e.localName}var fr={\"\\n\":\"#10\",\"\\n\\r\":\"#10\",'\"':\"#34\",\"'\":\"#39\",\"<\":\"#60\",\">\":\"#62\",\"&\":\"#38\"},dr={\"<\":\"lt\",\">\":\"gt\",\"&\":\"amp\"};function yr(e,t,n){return(e=l(e)?e:\"\"+e).replace(t,(function(e){return\"&\"+n[e]+\";\"}))}function gr(e){this.tagName=e}function vr(){}function br(e){this.tagName=e}function xr(e,t){this.body=[],this.attrs=[],this.parent=e,this.propertyDescriptor=t}function wr(e,t){xr.call(this,e,t)}function Er(){this.value=\"\",this.write=function(e){this.value+=e}}function _r(e,t){var n=[\"\"];this.append=function(t){return e.write(t),this},this.appendNewLine=function(){return t&&e.write(\"\\n\"),this},this.appendIndent=function(){return t&&e.write(n.join(\"  \")),this},this.indent=function(){return n.push(\"\"),this},this.unindent=function(){return n.pop(),this}}function Ar(e){return e=w({format:!1,preamble:!0},e||{}),{toXML:function(t,n){var i=n||new Er,r=new _r(i,e.format);if(e.preamble&&r.append('<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n'),(new xr).build(t).serializeTo(r),!n)return i.value}}}function Sr(e,t){Ri.call(this,e,t)}gr.prototype.build=function(e){return this.element=e,this},gr.prototype.serializeTo=function(e){e.appendIndent().append(\"<\"+this.tagName+\">\"+this.element.id+\"</\"+this.tagName+\">\").appendNewLine()},vr.prototype.serializeValue=vr.prototype.serializeTo=function(e){e.append(this.escape?yr(this.value,pr,dr):this.value)},vr.prototype.build=function(e,t){return this.value=t,\"String\"===e.type&&-1!==t.search(pr)&&(this.escape=!0),this},hr(br,vr),br.prototype.serializeTo=function(e){e.appendIndent().append(\"<\"+this.tagName+\">\"),this.serializeValue(e),e.append(\"</\"+this.tagName+\">\").appendNewLine()},xr.prototype.build=function(e){this.element=e;var t,n,i=e.$descriptor,r=this.propertyDescriptor,o=i.isGeneric;return t=o?this.parseGeneric(e):this.parseNsAttributes(e),this.ns=r?this.nsPropertyTagName(r):this.nsTagName(i),this.tagName=this.addTagName(this.ns),o||(n=function(e){return u(e.$descriptor.properties,(function(t){var n=t.name;if(t.isVirtual)return!1;if(!p(e,n))return!1;var i=e[n];return i!==t.default&&null!==i&&(!t.isMany||i.length)}))}(e),this.parseAttributes(u(n,(function(e){return e.isAttr}))),this.parseContainments(function(e){return u(e,(function(e){return!e.isAttr}))}(n))),this.parseGenericAttributes(e,t),this},xr.prototype.nsTagName=function(e){return function(e,t){return t.isGeneric?w({localName:t.ns.localName},e):w({localName:ur(t.ns.localName,t.$pkg)},e)}(this.logNamespaceUsed(e.ns),e)},xr.prototype.nsPropertyTagName=function(e){return function(e,t){return w({localName:t.ns.localName},e)}(this.logNamespaceUsed(e.ns),e)},xr.prototype.isLocalNs=function(e){return e.uri===this.ns.uri},xr.prototype.nsAttributeName=function(e){var t;if(t=l(e)?xi(e):e.ns,e.inherited)return{localName:t.localName};var n=this.logNamespaceUsed(t);return this.getNamespaces().logUsed(n),this.isLocalNs(n)?{localName:t.localName}:w({localName:t.localName},n)},xr.prototype.parseGeneric=function(e){var t=this,n=this.body,i=[];return h(e,(function(r,o){\"$body\"===o?n.push((new vr).build({type:\"String\"},r)):\"$children\"===o?h(r,(function(e){n.push(new xr(t).build(e))})):0!==o.indexOf(\"$\")&&t.parseNsAttribute(e,o,r)&&i.push({name:o,value:r})})),i},xr.prototype.parseNsAttribute=function(e,t,n){var i,r=e.$model,o=xi(t);if(\"xmlns\"===o.prefix&&(i={prefix:o.localName,uri:n}),o.prefix||\"xmlns\"!==o.localName||(i={uri:n}),!i)return{name:t,value:n};if(r&&r.getPackage(n))this.logNamespace(i,!0,!0);else{var a=this.logNamespaceUsed(i,!0);this.getNamespaces().logUsed(a)}},xr.prototype.parseNsAttributes=function(e,t){var n=this,i=e.$attrs,r=[];return h(i,(function(t,i){var o=n.parseNsAttribute(e,i,t);o&&r.push(o)})),r},xr.prototype.parseGenericAttributes=function(e,t){var n=this;h(t,(function(t){if(t.name!==Hi)try{n.addAttribute(n.nsAttributeName(t.name),t.value)}catch(n){console.warn(\"missing namespace information for \",t.name,\"=\",t.value,\"on\",e,n)}}))},xr.prototype.parseContainments=function(e){var t=this,n=this.body,i=this.element;h(e,(function(e){var r=i.get(e.name),o=e.isReference;if(e.isMany||(r=[r]),e.isBody)n.push((new vr).build(e,r[0]));else if(bi(e.type))h(r,(function(i){n.push(new br(t.addTagName(t.nsPropertyTagName(e))).build(e,i))}));else if(o)h(r,(function(i){n.push(new gr(t.addTagName(t.nsPropertyTagName(e))).build(i))}));else{var a=Ui(e),s=function(e){return\"property\"===Ki(e)}(e);h(r,(function(i){var r;r=a?new wr(t,e):s?new xr(t,e):new xr(t),n.push(r.build(i))}))}}))},xr.prototype.getNamespaces=function(e){var t,n=this.namespaces,i=this.parent;return n||(t=i&&i.getNamespaces(),e||!t?this.namespaces=n=new cr(t):n=t),n},xr.prototype.logNamespace=function(e,t,n){var i=this.getNamespaces(n),r=e.uri,o=e.prefix;return i.byUri(r)&&!n||i.add(e,t),i.mapPrefix(o,r),e},xr.prototype.logNamespaceUsed=function(e,t){var n,i,r,o=this.element.$model,a=this.getNamespaces(t),s=e.prefix,l=e.uri;if(!s&&!l)return{localName:e.localName};if(r=$i[s]||o&&(o.getPackage(s)||{}).uri,!(l=l||r||a.uriByPrefix(s)))throw new Error(\"no namespace uri given for prefix <\"+s+\">\");if(!(e=a.byUri(l))){for(n=s,i=1;a.uriByPrefix(n);)n=s+\"_\"+i++;e=this.logNamespace({prefix:n,uri:l},r===l)}return s&&a.mapPrefix(s,l),e},xr.prototype.parseAttributes=function(e){var t=this,n=this.element;h(e,(function(e){var i=n.get(e.name);if(e.isReference)if(e.isMany){var r=[];h(i,(function(e){r.push(e.id)})),i=r.join(\" \")}else i=i.id;t.addAttribute(t.nsAttributeName(e),i)}))},xr.prototype.addTagName=function(e){var t=this.logNamespaceUsed(e);return this.getNamespaces().logUsed(t),mr(e)},xr.prototype.addAttribute=function(e,t){var n=this.attrs;l(t)&&(t=yr(t,lr,fr));var i=function(e,t){const n=g(t);let i=r(e)?-1:void 0;return h(e,(function(e,t){if(n(e,t))return i=t,!1})),i}(n,(function(t){return t.name.localName===e.localName&&t.name.uri===e.uri&&t.name.prefix===e.prefix})),o={name:e,value:t};-1!==i?n.splice(i,1,o):n.push(o)},xr.prototype.serializeAttributes=function(e){var t=this.attrs,n=this.namespaces;n&&(t=function(e){return e.getUsed().filter((function(e){return\"xml\"!==e.prefix})).map((function(e){return{name:\"xmlns\"+(e.prefix?\":\"+e.prefix:\"\"),value:e.uri}}))}(n).concat(t)),h(t,(function(t){e.append(\" \").append(mr(t.name)).append('=\"').append(t.value).append('\"')}))},xr.prototype.serializeTo=function(e){var t=this.body[0],n=t&&t.constructor!==vr;e.appendIndent().append(\"<\"+this.tagName),this.serializeAttributes(e),e.append(t?\">\":\" />\"),t&&(n&&e.appendNewLine().indent(),h(this.body,(function(t){t.serializeTo(e)})),n&&e.unindent().appendIndent(),e.append(\"</\"+this.tagName+\">\")),e.appendNewLine()},hr(wr,xr),wr.prototype.parseNsAttributes=function(e){var t=xr.prototype.parseNsAttributes.call(this,e),n=e.$descriptor;if(n.name===this.propertyDescriptor.type)return t;var i=this.typeNs=this.nsTagName(n);this.getNamespaces().logUsed(this.typeNs);var r=e.$model.getPackage(i.uri),o=r.xml&&r.xml.typePrefix||\"\";return this.addAttribute(this.nsAttributeName(Hi),(i.prefix?i.prefix+\":\":\"\")+o+n.ns.localName),t},wr.prototype.isLocalNs=function(e){return e.uri===(this.typeNs||this.ns).uri},Sr.prototype=Object.create(Ri.prototype),Sr.prototype.fromXML=function(e,t,n){l(t)||(n=t,t=\"bpmn:Definitions\");var i=new sr(w({model:this,lax:!0},n)),r=i.handler(t);return i.fromXML(e,r)},Sr.prototype.toXML=function(e,t){var n=new Ar(t);return new Promise((function(t,i){try{return t({xml:n.toXML(e)})}catch(e){return i(e)}}))};var Rr={bpmn:{name:\"BPMN20\",uri:\"http://www.omg.org/spec/BPMN/20100524/MODEL\",prefix:\"bpmn\",associations:[],types:[{name:\"Interface\",superClass:[\"RootElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"operations\",type:\"Operation\",isMany:!0},{name:\"implementationRef\",isAttr:!0,type:\"String\"}]},{name:\"Operation\",superClass:[\"BaseElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"inMessageRef\",type:\"Message\",isReference:!0},{name:\"outMessageRef\",type:\"Message\",isReference:!0},{name:\"errorRef\",type:\"Error\",isMany:!0,isReference:!0},{name:\"implementationRef\",isAttr:!0,type:\"String\"}]},{name:\"EndPoint\",superClass:[\"RootElement\"]},{name:\"Auditing\",superClass:[\"BaseElement\"]},{name:\"GlobalTask\",superClass:[\"CallableElement\"],properties:[{name:\"resources\",type:\"ResourceRole\",isMany:!0}]},{name:\"Monitoring\",superClass:[\"BaseElement\"]},{name:\"Performer\",superClass:[\"ResourceRole\"]},{name:\"Process\",superClass:[\"FlowElementsContainer\",\"CallableElement\"],properties:[{name:\"processType\",type:\"ProcessType\",isAttr:!0},{name:\"isClosed\",isAttr:!0,type:\"Boolean\"},{name:\"auditing\",type:\"Auditing\"},{name:\"monitoring\",type:\"Monitoring\"},{name:\"properties\",type:\"Property\",isMany:!0},{name:\"laneSets\",isMany:!0,replaces:\"FlowElementsContainer#laneSets\",type:\"LaneSet\"},{name:\"flowElements\",isMany:!0,replaces:\"FlowElementsContainer#flowElements\",type:\"FlowElement\"},{name:\"artifacts\",type:\"Artifact\",isMany:!0},{name:\"resources\",type:\"ResourceRole\",isMany:!0},{name:\"correlationSubscriptions\",type:\"CorrelationSubscription\",isMany:!0},{name:\"supports\",type:\"Process\",isMany:!0,isReference:!0},{name:\"definitionalCollaborationRef\",type:\"Collaboration\",isAttr:!0,isReference:!0},{name:\"isExecutable\",isAttr:!0,type:\"Boolean\"}]},{name:\"LaneSet\",superClass:[\"BaseElement\"],properties:[{name:\"lanes\",type:\"Lane\",isMany:!0},{name:\"name\",isAttr:!0,type:\"String\"}]},{name:\"Lane\",superClass:[\"BaseElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"partitionElementRef\",type:\"BaseElement\",isAttr:!0,isReference:!0},{name:\"partitionElement\",type:\"BaseElement\"},{name:\"flowNodeRef\",type:\"FlowNode\",isMany:!0,isReference:!0},{name:\"childLaneSet\",type:\"LaneSet\",xml:{serialize:\"xsi:type\"}}]},{name:\"GlobalManualTask\",superClass:[\"GlobalTask\"]},{name:\"ManualTask\",superClass:[\"Task\"]},{name:\"UserTask\",superClass:[\"Task\"],properties:[{name:\"renderings\",type:\"Rendering\",isMany:!0},{name:\"implementation\",isAttr:!0,type:\"String\"}]},{name:\"Rendering\",superClass:[\"BaseElement\"]},{name:\"HumanPerformer\",superClass:[\"Performer\"]},{name:\"PotentialOwner\",superClass:[\"HumanPerformer\"]},{name:\"GlobalUserTask\",superClass:[\"GlobalTask\"],properties:[{name:\"implementation\",isAttr:!0,type:\"String\"},{name:\"renderings\",type:\"Rendering\",isMany:!0}]},{name:\"Gateway\",isAbstract:!0,superClass:[\"FlowNode\"],properties:[{name:\"gatewayDirection\",type:\"GatewayDirection\",default:\"Unspecified\",isAttr:!0}]},{name:\"EventBasedGateway\",superClass:[\"Gateway\"],properties:[{name:\"instantiate\",default:!1,isAttr:!0,type:\"Boolean\"},{name:\"eventGatewayType\",type:\"EventBasedGatewayType\",isAttr:!0,default:\"Exclusive\"}]},{name:\"ComplexGateway\",superClass:[\"Gateway\"],properties:[{name:\"activationCondition\",type:\"Expression\",xml:{serialize:\"xsi:type\"}},{name:\"default\",type:\"SequenceFlow\",isAttr:!0,isReference:!0}]},{name:\"ExclusiveGateway\",superClass:[\"Gateway\"],properties:[{name:\"default\",type:\"SequenceFlow\",isAttr:!0,isReference:!0}]},{name:\"InclusiveGateway\",superClass:[\"Gateway\"],properties:[{name:\"default\",type:\"SequenceFlow\",isAttr:!0,isReference:!0}]},{name:\"ParallelGateway\",superClass:[\"Gateway\"]},{name:\"RootElement\",isAbstract:!0,superClass:[\"BaseElement\"]},{name:\"Relationship\",superClass:[\"BaseElement\"],properties:[{name:\"type\",isAttr:!0,type:\"String\"},{name:\"direction\",type:\"RelationshipDirection\",isAttr:!0},{name:\"source\",isMany:!0,isReference:!0,type:\"Element\"},{name:\"target\",isMany:!0,isReference:!0,type:\"Element\"}]},{name:\"BaseElement\",isAbstract:!0,properties:[{name:\"id\",isAttr:!0,type:\"String\",isId:!0},{name:\"documentation\",type:\"Documentation\",isMany:!0},{name:\"extensionDefinitions\",type:\"ExtensionDefinition\",isMany:!0,isReference:!0},{name:\"extensionElements\",type:\"ExtensionElements\"}]},{name:\"Extension\",properties:[{name:\"mustUnderstand\",default:!1,isAttr:!0,type:\"Boolean\"},{name:\"definition\",type:\"ExtensionDefinition\",isAttr:!0,isReference:!0}]},{name:\"ExtensionDefinition\",properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"extensionAttributeDefinitions\",type:\"ExtensionAttributeDefinition\",isMany:!0}]},{name:\"ExtensionAttributeDefinition\",properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"type\",isAttr:!0,type:\"String\"},{name:\"isReference\",default:!1,isAttr:!0,type:\"Boolean\"},{name:\"extensionDefinition\",type:\"ExtensionDefinition\",isAttr:!0,isReference:!0}]},{name:\"ExtensionElements\",properties:[{name:\"valueRef\",isAttr:!0,isReference:!0,type:\"Element\"},{name:\"values\",type:\"Element\",isMany:!0},{name:\"extensionAttributeDefinition\",type:\"ExtensionAttributeDefinition\",isAttr:!0,isReference:!0}]},{name:\"Documentation\",superClass:[\"BaseElement\"],properties:[{name:\"text\",type:\"String\",isBody:!0},{name:\"textFormat\",default:\"text/plain\",isAttr:!0,type:\"String\"}]},{name:\"Event\",isAbstract:!0,superClass:[\"FlowNode\",\"InteractionNode\"],properties:[{name:\"properties\",type:\"Property\",isMany:!0}]},{name:\"IntermediateCatchEvent\",superClass:[\"CatchEvent\"]},{name:\"IntermediateThrowEvent\",superClass:[\"ThrowEvent\"]},{name:\"EndEvent\",superClass:[\"ThrowEvent\"]},{name:\"StartEvent\",superClass:[\"CatchEvent\"],properties:[{name:\"isInterrupting\",default:!0,isAttr:!0,type:\"Boolean\"}]},{name:\"ThrowEvent\",isAbstract:!0,superClass:[\"Event\"],properties:[{name:\"dataInputs\",type:\"DataInput\",isMany:!0},{name:\"dataInputAssociations\",type:\"DataInputAssociation\",isMany:!0},{name:\"inputSet\",type:\"InputSet\"},{name:\"eventDefinitions\",type:\"EventDefinition\",isMany:!0},{name:\"eventDefinitionRef\",type:\"EventDefinition\",isMany:!0,isReference:!0}]},{name:\"CatchEvent\",isAbstract:!0,superClass:[\"Event\"],properties:[{name:\"parallelMultiple\",isAttr:!0,type:\"Boolean\",default:!1},{name:\"dataOutputs\",type:\"DataOutput\",isMany:!0},{name:\"dataOutputAssociations\",type:\"DataOutputAssociation\",isMany:!0},{name:\"outputSet\",type:\"OutputSet\"},{name:\"eventDefinitions\",type:\"EventDefinition\",isMany:!0},{name:\"eventDefinitionRef\",type:\"EventDefinition\",isMany:!0,isReference:!0}]},{name:\"BoundaryEvent\",superClass:[\"CatchEvent\"],properties:[{name:\"cancelActivity\",default:!0,isAttr:!0,type:\"Boolean\"},{name:\"attachedToRef\",type:\"Activity\",isAttr:!0,isReference:!0}]},{name:\"EventDefinition\",isAbstract:!0,superClass:[\"RootElement\"]},{name:\"CancelEventDefinition\",superClass:[\"EventDefinition\"]},{name:\"ErrorEventDefinition\",superClass:[\"EventDefinition\"],properties:[{name:\"errorRef\",type:\"Error\",isAttr:!0,isReference:!0}]},{name:\"TerminateEventDefinition\",superClass:[\"EventDefinition\"]},{name:\"EscalationEventDefinition\",superClass:[\"EventDefinition\"],properties:[{name:\"escalationRef\",type:\"Escalation\",isAttr:!0,isReference:!0}]},{name:\"Escalation\",properties:[{name:\"structureRef\",type:\"ItemDefinition\",isAttr:!0,isReference:!0},{name:\"name\",isAttr:!0,type:\"String\"},{name:\"escalationCode\",isAttr:!0,type:\"String\"}],superClass:[\"RootElement\"]},{name:\"CompensateEventDefinition\",superClass:[\"EventDefinition\"],properties:[{name:\"waitForCompletion\",isAttr:!0,type:\"Boolean\",default:!0},{name:\"activityRef\",type:\"Activity\",isAttr:!0,isReference:!0}]},{name:\"TimerEventDefinition\",superClass:[\"EventDefinition\"],properties:[{name:\"timeDate\",type:\"Expression\",xml:{serialize:\"xsi:type\"}},{name:\"timeCycle\",type:\"Expression\",xml:{serialize:\"xsi:type\"}},{name:\"timeDuration\",type:\"Expression\",xml:{serialize:\"xsi:type\"}}]},{name:\"LinkEventDefinition\",superClass:[\"EventDefinition\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"target\",type:\"LinkEventDefinition\",isAttr:!0,isReference:!0},{name:\"source\",type:\"LinkEventDefinition\",isMany:!0,isReference:!0}]},{name:\"MessageEventDefinition\",superClass:[\"EventDefinition\"],properties:[{name:\"messageRef\",type:\"Message\",isAttr:!0,isReference:!0},{name:\"operationRef\",type:\"Operation\",isAttr:!0,isReference:!0}]},{name:\"ConditionalEventDefinition\",superClass:[\"EventDefinition\"],properties:[{name:\"condition\",type:\"Expression\",xml:{serialize:\"xsi:type\"}}]},{name:\"SignalEventDefinition\",superClass:[\"EventDefinition\"],properties:[{name:\"signalRef\",type:\"Signal\",isAttr:!0,isReference:!0}]},{name:\"Signal\",superClass:[\"RootElement\"],properties:[{name:\"structureRef\",type:\"ItemDefinition\",isAttr:!0,isReference:!0},{name:\"name\",isAttr:!0,type:\"String\"}]},{name:\"ImplicitThrowEvent\",superClass:[\"ThrowEvent\"]},{name:\"DataState\",superClass:[\"BaseElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"}]},{name:\"ItemAwareElement\",superClass:[\"BaseElement\"],properties:[{name:\"itemSubjectRef\",type:\"ItemDefinition\",isAttr:!0,isReference:!0},{name:\"dataState\",type:\"DataState\"}]},{name:\"DataAssociation\",superClass:[\"BaseElement\"],properties:[{name:\"sourceRef\",type:\"ItemAwareElement\",isMany:!0,isReference:!0},{name:\"targetRef\",type:\"ItemAwareElement\",isReference:!0},{name:\"transformation\",type:\"FormalExpression\",xml:{serialize:\"property\"}},{name:\"assignment\",type:\"Assignment\",isMany:!0}]},{name:\"DataInput\",superClass:[\"ItemAwareElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"isCollection\",default:!1,isAttr:!0,type:\"Boolean\"},{name:\"inputSetRef\",type:\"InputSet\",isMany:!0,isVirtual:!0,isReference:!0},{name:\"inputSetWithOptional\",type:\"InputSet\",isMany:!0,isVirtual:!0,isReference:!0},{name:\"inputSetWithWhileExecuting\",type:\"InputSet\",isMany:!0,isVirtual:!0,isReference:!0}]},{name:\"DataOutput\",superClass:[\"ItemAwareElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"isCollection\",default:!1,isAttr:!0,type:\"Boolean\"},{name:\"outputSetRef\",type:\"OutputSet\",isMany:!0,isVirtual:!0,isReference:!0},{name:\"outputSetWithOptional\",type:\"OutputSet\",isMany:!0,isVirtual:!0,isReference:!0},{name:\"outputSetWithWhileExecuting\",type:\"OutputSet\",isMany:!0,isVirtual:!0,isReference:!0}]},{name:\"InputSet\",superClass:[\"BaseElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"dataInputRefs\",type:\"DataInput\",isMany:!0,isReference:!0},{name:\"optionalInputRefs\",type:\"DataInput\",isMany:!0,isReference:!0},{name:\"whileExecutingInputRefs\",type:\"DataInput\",isMany:!0,isReference:!0},{name:\"outputSetRefs\",type:\"OutputSet\",isMany:!0,isReference:!0}]},{name:\"OutputSet\",superClass:[\"BaseElement\"],properties:[{name:\"dataOutputRefs\",type:\"DataOutput\",isMany:!0,isReference:!0},{name:\"name\",isAttr:!0,type:\"String\"},{name:\"inputSetRefs\",type:\"InputSet\",isMany:!0,isReference:!0},{name:\"optionalOutputRefs\",type:\"DataOutput\",isMany:!0,isReference:!0},{name:\"whileExecutingOutputRefs\",type:\"DataOutput\",isMany:!0,isReference:!0}]},{name:\"Property\",superClass:[\"ItemAwareElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"}]},{name:\"DataInputAssociation\",superClass:[\"DataAssociation\"]},{name:\"DataOutputAssociation\",superClass:[\"DataAssociation\"]},{name:\"InputOutputSpecification\",superClass:[\"BaseElement\"],properties:[{name:\"dataInputs\",type:\"DataInput\",isMany:!0},{name:\"dataOutputs\",type:\"DataOutput\",isMany:!0},{name:\"inputSets\",type:\"InputSet\",isMany:!0},{name:\"outputSets\",type:\"OutputSet\",isMany:!0}]},{name:\"DataObject\",superClass:[\"FlowElement\",\"ItemAwareElement\"],properties:[{name:\"isCollection\",default:!1,isAttr:!0,type:\"Boolean\"}]},{name:\"InputOutputBinding\",properties:[{name:\"inputDataRef\",type:\"InputSet\",isAttr:!0,isReference:!0},{name:\"outputDataRef\",type:\"OutputSet\",isAttr:!0,isReference:!0},{name:\"operationRef\",type:\"Operation\",isAttr:!0,isReference:!0}]},{name:\"Assignment\",superClass:[\"BaseElement\"],properties:[{name:\"from\",type:\"Expression\",xml:{serialize:\"xsi:type\"}},{name:\"to\",type:\"Expression\",xml:{serialize:\"xsi:type\"}}]},{name:\"DataStore\",superClass:[\"RootElement\",\"ItemAwareElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"capacity\",isAttr:!0,type:\"Integer\"},{name:\"isUnlimited\",default:!0,isAttr:!0,type:\"Boolean\"}]},{name:\"DataStoreReference\",superClass:[\"ItemAwareElement\",\"FlowElement\"],properties:[{name:\"dataStoreRef\",type:\"DataStore\",isAttr:!0,isReference:!0}]},{name:\"DataObjectReference\",superClass:[\"ItemAwareElement\",\"FlowElement\"],properties:[{name:\"dataObjectRef\",type:\"DataObject\",isAttr:!0,isReference:!0}]},{name:\"ConversationLink\",superClass:[\"BaseElement\"],properties:[{name:\"sourceRef\",type:\"InteractionNode\",isAttr:!0,isReference:!0},{name:\"targetRef\",type:\"InteractionNode\",isAttr:!0,isReference:!0},{name:\"name\",isAttr:!0,type:\"String\"}]},{name:\"ConversationAssociation\",superClass:[\"BaseElement\"],properties:[{name:\"innerConversationNodeRef\",type:\"ConversationNode\",isAttr:!0,isReference:!0},{name:\"outerConversationNodeRef\",type:\"ConversationNode\",isAttr:!0,isReference:!0}]},{name:\"CallConversation\",superClass:[\"ConversationNode\"],properties:[{name:\"calledCollaborationRef\",type:\"Collaboration\",isAttr:!0,isReference:!0},{name:\"participantAssociations\",type:\"ParticipantAssociation\",isMany:!0}]},{name:\"Conversation\",superClass:[\"ConversationNode\"]},{name:\"SubConversation\",superClass:[\"ConversationNode\"],properties:[{name:\"conversationNodes\",type:\"ConversationNode\",isMany:!0}]},{name:\"ConversationNode\",isAbstract:!0,superClass:[\"InteractionNode\",\"BaseElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"participantRef\",type:\"Participant\",isMany:!0,isReference:!0},{name:\"messageFlowRefs\",type:\"MessageFlow\",isMany:!0,isReference:!0},{name:\"correlationKeys\",type:\"CorrelationKey\",isMany:!0}]},{name:\"GlobalConversation\",superClass:[\"Collaboration\"]},{name:\"PartnerEntity\",superClass:[\"RootElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"participantRef\",type:\"Participant\",isMany:!0,isReference:!0}]},{name:\"PartnerRole\",superClass:[\"RootElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"participantRef\",type:\"Participant\",isMany:!0,isReference:!0}]},{name:\"CorrelationProperty\",superClass:[\"RootElement\"],properties:[{name:\"correlationPropertyRetrievalExpression\",type:\"CorrelationPropertyRetrievalExpression\",isMany:!0},{name:\"name\",isAttr:!0,type:\"String\"},{name:\"type\",type:\"ItemDefinition\",isAttr:!0,isReference:!0}]},{name:\"Error\",superClass:[\"RootElement\"],properties:[{name:\"structureRef\",type:\"ItemDefinition\",isAttr:!0,isReference:!0},{name:\"name\",isAttr:!0,type:\"String\"},{name:\"errorCode\",isAttr:!0,type:\"String\"}]},{name:\"CorrelationKey\",superClass:[\"BaseElement\"],properties:[{name:\"correlationPropertyRef\",type:\"CorrelationProperty\",isMany:!0,isReference:!0},{name:\"name\",isAttr:!0,type:\"String\"}]},{name:\"Expression\",superClass:[\"BaseElement\"],isAbstract:!1,properties:[{name:\"body\",isBody:!0,type:\"String\"}]},{name:\"FormalExpression\",superClass:[\"Expression\"],properties:[{name:\"language\",isAttr:!0,type:\"String\"},{name:\"evaluatesToTypeRef\",type:\"ItemDefinition\",isAttr:!0,isReference:!0}]},{name:\"Message\",superClass:[\"RootElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"itemRef\",type:\"ItemDefinition\",isAttr:!0,isReference:!0}]},{name:\"ItemDefinition\",superClass:[\"RootElement\"],properties:[{name:\"itemKind\",type:\"ItemKind\",isAttr:!0},{name:\"structureRef\",isAttr:!0,type:\"String\"},{name:\"isCollection\",default:!1,isAttr:!0,type:\"Boolean\"},{name:\"import\",type:\"Import\",isAttr:!0,isReference:!0}]},{name:\"FlowElement\",isAbstract:!0,superClass:[\"BaseElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"auditing\",type:\"Auditing\"},{name:\"monitoring\",type:\"Monitoring\"},{name:\"categoryValueRef\",type:\"CategoryValue\",isMany:!0,isReference:!0}]},{name:\"SequenceFlow\",superClass:[\"FlowElement\"],properties:[{name:\"isImmediate\",isAttr:!0,type:\"Boolean\"},{name:\"conditionExpression\",type:\"Expression\",xml:{serialize:\"xsi:type\"}},{name:\"sourceRef\",type:\"FlowNode\",isAttr:!0,isReference:!0},{name:\"targetRef\",type:\"FlowNode\",isAttr:!0,isReference:!0}]},{name:\"FlowElementsContainer\",isAbstract:!0,superClass:[\"BaseElement\"],properties:[{name:\"laneSets\",type:\"LaneSet\",isMany:!0},{name:\"flowElements\",type:\"FlowElement\",isMany:!0}]},{name:\"CallableElement\",isAbstract:!0,superClass:[\"RootElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"ioSpecification\",type:\"InputOutputSpecification\",xml:{serialize:\"property\"}},{name:\"supportedInterfaceRef\",type:\"Interface\",isMany:!0,isReference:!0},{name:\"ioBinding\",type:\"InputOutputBinding\",isMany:!0,xml:{serialize:\"property\"}}]},{name:\"FlowNode\",isAbstract:!0,superClass:[\"FlowElement\"],properties:[{name:\"incoming\",type:\"SequenceFlow\",isMany:!0,isReference:!0},{name:\"outgoing\",type:\"SequenceFlow\",isMany:!0,isReference:!0},{name:\"lanes\",type:\"Lane\",isMany:!0,isVirtual:!0,isReference:!0}]},{name:\"CorrelationPropertyRetrievalExpression\",superClass:[\"BaseElement\"],properties:[{name:\"messagePath\",type:\"FormalExpression\"},{name:\"messageRef\",type:\"Message\",isAttr:!0,isReference:!0}]},{name:\"CorrelationPropertyBinding\",superClass:[\"BaseElement\"],properties:[{name:\"dataPath\",type:\"FormalExpression\"},{name:\"correlationPropertyRef\",type:\"CorrelationProperty\",isAttr:!0,isReference:!0}]},{name:\"Resource\",superClass:[\"RootElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"resourceParameters\",type:\"ResourceParameter\",isMany:!0}]},{name:\"ResourceParameter\",superClass:[\"BaseElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"isRequired\",isAttr:!0,type:\"Boolean\"},{name:\"type\",type:\"ItemDefinition\",isAttr:!0,isReference:!0}]},{name:\"CorrelationSubscription\",superClass:[\"BaseElement\"],properties:[{name:\"correlationKeyRef\",type:\"CorrelationKey\",isAttr:!0,isReference:!0},{name:\"correlationPropertyBinding\",type:\"CorrelationPropertyBinding\",isMany:!0}]},{name:\"MessageFlow\",superClass:[\"BaseElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"sourceRef\",type:\"InteractionNode\",isAttr:!0,isReference:!0},{name:\"targetRef\",type:\"InteractionNode\",isAttr:!0,isReference:!0},{name:\"messageRef\",type:\"Message\",isAttr:!0,isReference:!0}]},{name:\"MessageFlowAssociation\",superClass:[\"BaseElement\"],properties:[{name:\"innerMessageFlowRef\",type:\"MessageFlow\",isAttr:!0,isReference:!0},{name:\"outerMessageFlowRef\",type:\"MessageFlow\",isAttr:!0,isReference:!0}]},{name:\"InteractionNode\",isAbstract:!0,properties:[{name:\"incomingConversationLinks\",type:\"ConversationLink\",isMany:!0,isVirtual:!0,isReference:!0},{name:\"outgoingConversationLinks\",type:\"ConversationLink\",isMany:!0,isVirtual:!0,isReference:!0}]},{name:\"Participant\",superClass:[\"InteractionNode\",\"BaseElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"interfaceRef\",type:\"Interface\",isMany:!0,isReference:!0},{name:\"participantMultiplicity\",type:\"ParticipantMultiplicity\"},{name:\"endPointRefs\",type:\"EndPoint\",isMany:!0,isReference:!0},{name:\"processRef\",type:\"Process\",isAttr:!0,isReference:!0}]},{name:\"ParticipantAssociation\",superClass:[\"BaseElement\"],properties:[{name:\"innerParticipantRef\",type:\"Participant\",isAttr:!0,isReference:!0},{name:\"outerParticipantRef\",type:\"Participant\",isAttr:!0,isReference:!0}]},{name:\"ParticipantMultiplicity\",properties:[{name:\"minimum\",default:0,isAttr:!0,type:\"Integer\"},{name:\"maximum\",default:1,isAttr:!0,type:\"Integer\"}],superClass:[\"BaseElement\"]},{name:\"Collaboration\",superClass:[\"RootElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"isClosed\",isAttr:!0,type:\"Boolean\"},{name:\"participants\",type:\"Participant\",isMany:!0},{name:\"messageFlows\",type:\"MessageFlow\",isMany:!0},{name:\"artifacts\",type:\"Artifact\",isMany:!0},{name:\"conversations\",type:\"ConversationNode\",isMany:!0},{name:\"conversationAssociations\",type:\"ConversationAssociation\"},{name:\"participantAssociations\",type:\"ParticipantAssociation\",isMany:!0},{name:\"messageFlowAssociations\",type:\"MessageFlowAssociation\",isMany:!0},{name:\"correlationKeys\",type:\"CorrelationKey\",isMany:!0},{name:\"choreographyRef\",type:\"Choreography\",isMany:!0,isReference:!0},{name:\"conversationLinks\",type:\"ConversationLink\",isMany:!0}]},{name:\"ChoreographyActivity\",isAbstract:!0,superClass:[\"FlowNode\"],properties:[{name:\"participantRef\",type:\"Participant\",isMany:!0,isReference:!0},{name:\"initiatingParticipantRef\",type:\"Participant\",isAttr:!0,isReference:!0},{name:\"correlationKeys\",type:\"CorrelationKey\",isMany:!0},{name:\"loopType\",type:\"ChoreographyLoopType\",default:\"None\",isAttr:!0}]},{name:\"CallChoreography\",superClass:[\"ChoreographyActivity\"],properties:[{name:\"calledChoreographyRef\",type:\"Choreography\",isAttr:!0,isReference:!0},{name:\"participantAssociations\",type:\"ParticipantAssociation\",isMany:!0}]},{name:\"SubChoreography\",superClass:[\"ChoreographyActivity\",\"FlowElementsContainer\"],properties:[{name:\"artifacts\",type:\"Artifact\",isMany:!0}]},{name:\"ChoreographyTask\",superClass:[\"ChoreographyActivity\"],properties:[{name:\"messageFlowRef\",type:\"MessageFlow\",isMany:!0,isReference:!0}]},{name:\"Choreography\",superClass:[\"Collaboration\",\"FlowElementsContainer\"]},{name:\"GlobalChoreographyTask\",superClass:[\"Choreography\"],properties:[{name:\"initiatingParticipantRef\",type:\"Participant\",isAttr:!0,isReference:!0}]},{name:\"TextAnnotation\",superClass:[\"Artifact\"],properties:[{name:\"text\",type:\"String\"},{name:\"textFormat\",default:\"text/plain\",isAttr:!0,type:\"String\"}]},{name:\"Group\",superClass:[\"Artifact\"],properties:[{name:\"categoryValueRef\",type:\"CategoryValue\",isAttr:!0,isReference:!0}]},{name:\"Association\",superClass:[\"Artifact\"],properties:[{name:\"associationDirection\",type:\"AssociationDirection\",isAttr:!0},{name:\"sourceRef\",type:\"BaseElement\",isAttr:!0,isReference:!0},{name:\"targetRef\",type:\"BaseElement\",isAttr:!0,isReference:!0}]},{name:\"Category\",superClass:[\"RootElement\"],properties:[{name:\"categoryValue\",type:\"CategoryValue\",isMany:!0},{name:\"name\",isAttr:!0,type:\"String\"}]},{name:\"Artifact\",isAbstract:!0,superClass:[\"BaseElement\"]},{name:\"CategoryValue\",superClass:[\"BaseElement\"],properties:[{name:\"categorizedFlowElements\",type:\"FlowElement\",isMany:!0,isVirtual:!0,isReference:!0},{name:\"value\",isAttr:!0,type:\"String\"}]},{name:\"Activity\",isAbstract:!0,superClass:[\"FlowNode\"],properties:[{name:\"isForCompensation\",default:!1,isAttr:!0,type:\"Boolean\"},{name:\"default\",type:\"SequenceFlow\",isAttr:!0,isReference:!0},{name:\"ioSpecification\",type:\"InputOutputSpecification\",xml:{serialize:\"property\"}},{name:\"boundaryEventRefs\",type:\"BoundaryEvent\",isMany:!0,isReference:!0},{name:\"properties\",type:\"Property\",isMany:!0},{name:\"dataInputAssociations\",type:\"DataInputAssociation\",isMany:!0},{name:\"dataOutputAssociations\",type:\"DataOutputAssociation\",isMany:!0},{name:\"startQuantity\",default:1,isAttr:!0,type:\"Integer\"},{name:\"resources\",type:\"ResourceRole\",isMany:!0},{name:\"completionQuantity\",default:1,isAttr:!0,type:\"Integer\"},{name:\"loopCharacteristics\",type:\"LoopCharacteristics\"}]},{name:\"ServiceTask\",superClass:[\"Task\"],properties:[{name:\"implementation\",isAttr:!0,type:\"String\"},{name:\"operationRef\",type:\"Operation\",isAttr:!0,isReference:!0}]},{name:\"SubProcess\",superClass:[\"Activity\",\"FlowElementsContainer\",\"InteractionNode\"],properties:[{name:\"triggeredByEvent\",default:!1,isAttr:!0,type:\"Boolean\"},{name:\"artifacts\",type:\"Artifact\",isMany:!0}]},{name:\"LoopCharacteristics\",isAbstract:!0,superClass:[\"BaseElement\"]},{name:\"MultiInstanceLoopCharacteristics\",superClass:[\"LoopCharacteristics\"],properties:[{name:\"isSequential\",default:!1,isAttr:!0,type:\"Boolean\"},{name:\"behavior\",type:\"MultiInstanceBehavior\",default:\"All\",isAttr:!0},{name:\"loopCardinality\",type:\"Expression\",xml:{serialize:\"xsi:type\"}},{name:\"loopDataInputRef\",type:\"ItemAwareElement\",isReference:!0},{name:\"loopDataOutputRef\",type:\"ItemAwareElement\",isReference:!0},{name:\"inputDataItem\",type:\"DataInput\",xml:{serialize:\"property\"}},{name:\"outputDataItem\",type:\"DataOutput\",xml:{serialize:\"property\"}},{name:\"complexBehaviorDefinition\",type:\"ComplexBehaviorDefinition\",isMany:!0},{name:\"completionCondition\",type:\"Expression\",xml:{serialize:\"xsi:type\"}},{name:\"oneBehaviorEventRef\",type:\"EventDefinition\",isAttr:!0,isReference:!0},{name:\"noneBehaviorEventRef\",type:\"EventDefinition\",isAttr:!0,isReference:!0}]},{name:\"StandardLoopCharacteristics\",superClass:[\"LoopCharacteristics\"],properties:[{name:\"testBefore\",default:!1,isAttr:!0,type:\"Boolean\"},{name:\"loopCondition\",type:\"Expression\",xml:{serialize:\"xsi:type\"}},{name:\"loopMaximum\",type:\"Integer\",isAttr:!0}]},{name:\"CallActivity\",superClass:[\"Activity\",\"InteractionNode\"],properties:[{name:\"calledElement\",type:\"String\",isAttr:!0}]},{name:\"Task\",superClass:[\"Activity\",\"InteractionNode\"]},{name:\"SendTask\",superClass:[\"Task\"],properties:[{name:\"implementation\",isAttr:!0,type:\"String\"},{name:\"operationRef\",type:\"Operation\",isAttr:!0,isReference:!0},{name:\"messageRef\",type:\"Message\",isAttr:!0,isReference:!0}]},{name:\"ReceiveTask\",superClass:[\"Task\"],properties:[{name:\"implementation\",isAttr:!0,type:\"String\"},{name:\"instantiate\",default:!1,isAttr:!0,type:\"Boolean\"},{name:\"operationRef\",type:\"Operation\",isAttr:!0,isReference:!0},{name:\"messageRef\",type:\"Message\",isAttr:!0,isReference:!0}]},{name:\"ScriptTask\",superClass:[\"Task\"],properties:[{name:\"scriptFormat\",isAttr:!0,type:\"String\"},{name:\"script\",type:\"String\"}]},{name:\"BusinessRuleTask\",superClass:[\"Task\"],properties:[{name:\"implementation\",isAttr:!0,type:\"String\"}]},{name:\"AdHocSubProcess\",superClass:[\"SubProcess\"],properties:[{name:\"completionCondition\",type:\"Expression\",xml:{serialize:\"xsi:type\"}},{name:\"ordering\",type:\"AdHocOrdering\",isAttr:!0},{name:\"cancelRemainingInstances\",default:!0,isAttr:!0,type:\"Boolean\"}]},{name:\"Transaction\",superClass:[\"SubProcess\"],properties:[{name:\"protocol\",isAttr:!0,type:\"String\"},{name:\"method\",isAttr:!0,type:\"String\"}]},{name:\"GlobalScriptTask\",superClass:[\"GlobalTask\"],properties:[{name:\"scriptLanguage\",isAttr:!0,type:\"String\"},{name:\"script\",isAttr:!0,type:\"String\"}]},{name:\"GlobalBusinessRuleTask\",superClass:[\"GlobalTask\"],properties:[{name:\"implementation\",isAttr:!0,type:\"String\"}]},{name:\"ComplexBehaviorDefinition\",superClass:[\"BaseElement\"],properties:[{name:\"condition\",type:\"FormalExpression\"},{name:\"event\",type:\"ImplicitThrowEvent\"}]},{name:\"ResourceRole\",superClass:[\"BaseElement\"],properties:[{name:\"resourceRef\",type:\"Resource\",isReference:!0},{name:\"resourceParameterBindings\",type:\"ResourceParameterBinding\",isMany:!0},{name:\"resourceAssignmentExpression\",type:\"ResourceAssignmentExpression\"},{name:\"name\",isAttr:!0,type:\"String\"}]},{name:\"ResourceParameterBinding\",properties:[{name:\"expression\",type:\"Expression\",xml:{serialize:\"xsi:type\"}},{name:\"parameterRef\",type:\"ResourceParameter\",isAttr:!0,isReference:!0}],superClass:[\"BaseElement\"]},{name:\"ResourceAssignmentExpression\",properties:[{name:\"expression\",type:\"Expression\",xml:{serialize:\"xsi:type\"}}],superClass:[\"BaseElement\"]},{name:\"Import\",properties:[{name:\"importType\",isAttr:!0,type:\"String\"},{name:\"location\",isAttr:!0,type:\"String\"},{name:\"namespace\",isAttr:!0,type:\"String\"}]},{name:\"Definitions\",superClass:[\"BaseElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"targetNamespace\",isAttr:!0,type:\"String\"},{name:\"expressionLanguage\",default:\"http://www.w3.org/1999/XPath\",isAttr:!0,type:\"String\"},{name:\"typeLanguage\",default:\"http://www.w3.org/2001/XMLSchema\",isAttr:!0,type:\"String\"},{name:\"imports\",type:\"Import\",isMany:!0},{name:\"extensions\",type:\"Extension\",isMany:!0},{name:\"rootElements\",type:\"RootElement\",isMany:!0},{name:\"diagrams\",isMany:!0,type:\"bpmndi:BPMNDiagram\"},{name:\"exporter\",isAttr:!0,type:\"String\"},{name:\"relationships\",type:\"Relationship\",isMany:!0},{name:\"exporterVersion\",isAttr:!0,type:\"String\"}]}],enumerations:[{name:\"ProcessType\",literalValues:[{name:\"None\"},{name:\"Public\"},{name:\"Private\"}]},{name:\"GatewayDirection\",literalValues:[{name:\"Unspecified\"},{name:\"Converging\"},{name:\"Diverging\"},{name:\"Mixed\"}]},{name:\"EventBasedGatewayType\",literalValues:[{name:\"Parallel\"},{name:\"Exclusive\"}]},{name:\"RelationshipDirection\",literalValues:[{name:\"None\"},{name:\"Forward\"},{name:\"Backward\"},{name:\"Both\"}]},{name:\"ItemKind\",literalValues:[{name:\"Physical\"},{name:\"Information\"}]},{name:\"ChoreographyLoopType\",literalValues:[{name:\"None\"},{name:\"Standard\"},{name:\"MultiInstanceSequential\"},{name:\"MultiInstanceParallel\"}]},{name:\"AssociationDirection\",literalValues:[{name:\"None\"},{name:\"One\"},{name:\"Both\"}]},{name:\"MultiInstanceBehavior\",literalValues:[{name:\"None\"},{name:\"One\"},{name:\"All\"},{name:\"Complex\"}]},{name:\"AdHocOrdering\",literalValues:[{name:\"Parallel\"},{name:\"Sequential\"}]}],xml:{tagAlias:\"lowerCase\",typePrefix:\"t\"}},bpmndi:{name:\"BPMNDI\",uri:\"http://www.omg.org/spec/BPMN/20100524/DI\",prefix:\"bpmndi\",types:[{name:\"BPMNDiagram\",properties:[{name:\"plane\",type:\"BPMNPlane\",redefines:\"di:Diagram#rootElement\"},{name:\"labelStyle\",type:\"BPMNLabelStyle\",isMany:!0}],superClass:[\"di:Diagram\"]},{name:\"BPMNPlane\",properties:[{name:\"bpmnElement\",isAttr:!0,isReference:!0,type:\"bpmn:BaseElement\",redefines:\"di:DiagramElement#modelElement\"}],superClass:[\"di:Plane\"]},{name:\"BPMNShape\",properties:[{name:\"bpmnElement\",isAttr:!0,isReference:!0,type:\"bpmn:BaseElement\",redefines:\"di:DiagramElement#modelElement\"},{name:\"isHorizontal\",isAttr:!0,type:\"Boolean\"},{name:\"isExpanded\",isAttr:!0,type:\"Boolean\"},{name:\"isMarkerVisible\",isAttr:!0,type:\"Boolean\"},{name:\"label\",type:\"BPMNLabel\"},{name:\"isMessageVisible\",isAttr:!0,type:\"Boolean\"},{name:\"participantBandKind\",type:\"ParticipantBandKind\",isAttr:!0},{name:\"choreographyActivityShape\",type:\"BPMNShape\",isAttr:!0,isReference:!0}],superClass:[\"di:LabeledShape\"]},{name:\"BPMNEdge\",properties:[{name:\"label\",type:\"BPMNLabel\"},{name:\"bpmnElement\",isAttr:!0,isReference:!0,type:\"bpmn:BaseElement\",redefines:\"di:DiagramElement#modelElement\"},{name:\"sourceElement\",isAttr:!0,isReference:!0,type:\"di:DiagramElement\",redefines:\"di:Edge#source\"},{name:\"targetElement\",isAttr:!0,isReference:!0,type:\"di:DiagramElement\",redefines:\"di:Edge#target\"},{name:\"messageVisibleKind\",type:\"MessageVisibleKind\",isAttr:!0,default:\"initiating\"}],superClass:[\"di:LabeledEdge\"]},{name:\"BPMNLabel\",properties:[{name:\"labelStyle\",type:\"BPMNLabelStyle\",isAttr:!0,isReference:!0,redefines:\"di:DiagramElement#style\"}],superClass:[\"di:Label\"]},{name:\"BPMNLabelStyle\",properties:[{name:\"font\",type:\"dc:Font\"}],superClass:[\"di:Style\"]}],enumerations:[{name:\"ParticipantBandKind\",literalValues:[{name:\"top_initiating\"},{name:\"middle_initiating\"},{name:\"bottom_initiating\"},{name:\"top_non_initiating\"},{name:\"middle_non_initiating\"},{name:\"bottom_non_initiating\"}]},{name:\"MessageVisibleKind\",literalValues:[{name:\"initiating\"},{name:\"non_initiating\"}]}],associations:[]},dc:{name:\"DC\",uri:\"http://www.omg.org/spec/DD/20100524/DC\",prefix:\"dc\",types:[{name:\"Boolean\"},{name:\"Integer\"},{name:\"Real\"},{name:\"String\"},{name:\"Font\",properties:[{name:\"name\",type:\"String\",isAttr:!0},{name:\"size\",type:\"Real\",isAttr:!0},{name:\"isBold\",type:\"Boolean\",isAttr:!0},{name:\"isItalic\",type:\"Boolean\",isAttr:!0},{name:\"isUnderline\",type:\"Boolean\",isAttr:!0},{name:\"isStrikeThrough\",type:\"Boolean\",isAttr:!0}]},{name:\"Point\",properties:[{name:\"x\",type:\"Real\",default:\"0\",isAttr:!0},{name:\"y\",type:\"Real\",default:\"0\",isAttr:!0}]},{name:\"Bounds\",properties:[{name:\"x\",type:\"Real\",default:\"0\",isAttr:!0},{name:\"y\",type:\"Real\",default:\"0\",isAttr:!0},{name:\"width\",type:\"Real\",isAttr:!0},{name:\"height\",type:\"Real\",isAttr:!0}]}],associations:[]},di:{name:\"DI\",uri:\"http://www.omg.org/spec/DD/20100524/DI\",prefix:\"di\",types:[{name:\"DiagramElement\",isAbstract:!0,properties:[{name:\"id\",isAttr:!0,isId:!0,type:\"String\"},{name:\"extension\",type:\"Extension\"},{name:\"owningDiagram\",type:\"Diagram\",isReadOnly:!0,isVirtual:!0,isReference:!0},{name:\"owningElement\",type:\"DiagramElement\",isReadOnly:!0,isVirtual:!0,isReference:!0},{name:\"modelElement\",isReadOnly:!0,isVirtual:!0,isReference:!0,type:\"Element\"},{name:\"style\",type:\"Style\",isReadOnly:!0,isVirtual:!0,isReference:!0},{name:\"ownedElement\",type:\"DiagramElement\",isReadOnly:!0,isMany:!0,isVirtual:!0}]},{name:\"Node\",isAbstract:!0,superClass:[\"DiagramElement\"]},{name:\"Edge\",isAbstract:!0,superClass:[\"DiagramElement\"],properties:[{name:\"source\",type:\"DiagramElement\",isReadOnly:!0,isVirtual:!0,isReference:!0},{name:\"target\",type:\"DiagramElement\",isReadOnly:!0,isVirtual:!0,isReference:!0},{name:\"waypoint\",isUnique:!1,isMany:!0,type:\"dc:Point\",xml:{serialize:\"xsi:type\"}}]},{name:\"Diagram\",isAbstract:!0,properties:[{name:\"id\",isAttr:!0,isId:!0,type:\"String\"},{name:\"rootElement\",type:\"DiagramElement\",isReadOnly:!0,isVirtual:!0},{name:\"name\",isAttr:!0,type:\"String\"},{name:\"documentation\",isAttr:!0,type:\"String\"},{name:\"resolution\",isAttr:!0,type:\"Real\"},{name:\"ownedStyle\",type:\"Style\",isReadOnly:!0,isMany:!0,isVirtual:!0}]},{name:\"Shape\",isAbstract:!0,superClass:[\"Node\"],properties:[{name:\"bounds\",type:\"dc:Bounds\"}]},{name:\"Plane\",isAbstract:!0,superClass:[\"Node\"],properties:[{name:\"planeElement\",type:\"DiagramElement\",subsettedProperty:\"DiagramElement-ownedElement\",isMany:!0}]},{name:\"LabeledEdge\",isAbstract:!0,superClass:[\"Edge\"],properties:[{name:\"ownedLabel\",type:\"Label\",isReadOnly:!0,subsettedProperty:\"DiagramElement-ownedElement\",isMany:!0,isVirtual:!0}]},{name:\"LabeledShape\",isAbstract:!0,superClass:[\"Shape\"],properties:[{name:\"ownedLabel\",type:\"Label\",isReadOnly:!0,subsettedProperty:\"DiagramElement-ownedElement\",isMany:!0,isVirtual:!0}]},{name:\"Label\",isAbstract:!0,superClass:[\"Node\"],properties:[{name:\"bounds\",type:\"dc:Bounds\"}]},{name:\"Style\",isAbstract:!0,properties:[{name:\"id\",isAttr:!0,isId:!0,type:\"String\"}]},{name:\"Extension\",properties:[{name:\"values\",isMany:!0,type:\"Element\"}]}],associations:[],xml:{tagAlias:\"lowerCase\"}},bioc:{name:\"bpmn.io colors for BPMN\",uri:\"http://bpmn.io/schema/bpmn/biocolor/1.0\",prefix:\"bioc\",types:[{name:\"ColoredShape\",extends:[\"bpmndi:BPMNShape\"],properties:[{name:\"stroke\",isAttr:!0,type:\"String\"},{name:\"fill\",isAttr:!0,type:\"String\"}]},{name:\"ColoredEdge\",extends:[\"bpmndi:BPMNEdge\"],properties:[{name:\"stroke\",isAttr:!0,type:\"String\"},{name:\"fill\",isAttr:!0,type:\"String\"}]}],enumerations:[],associations:[]},color:{name:\"BPMN in Color\",uri:\"http://www.omg.org/spec/BPMN/non-normative/color/1.0\",prefix:\"color\",types:[{name:\"ColoredLabel\",extends:[\"bpmndi:BPMNLabel\"],properties:[{name:\"color\",isAttr:!0,type:\"String\"}]},{name:\"ColoredShape\",extends:[\"bpmndi:BPMNShape\"],properties:[{name:\"background-color\",isAttr:!0,type:\"String\"},{name:\"border-color\",isAttr:!0,type:\"String\"}]},{name:\"ColoredEdge\",extends:[\"bpmndi:BPMNEdge\"],properties:[{name:\"border-color\",isAttr:!0,type:\"String\"}]}],enumerations:[],associations:[]}};function Cr(e,t){return new Sr(w({},Rr,e),t)}function Mr(e){return function(){if(!window.Promise)throw new Error(\"Promises is not supported in this environment. Please polyfill Promise.\");var t=arguments.length;if(!(t>=1&&s(arguments[t-1])))return e.apply(this,arguments);var n=arguments[t-1];console.warn(new Error(\"Passing callbacks to \"+e.name+\" is deprecated and will be removed in a future major release. Please switch to promises: https://bpmn.io/l/moving-to-promises.html\"));var i=Array.prototype.slice.call(arguments,0,-1);e.apply(this,i).then((function(e){var t=Object.keys(e)[0];return n(null,e[t])}),(function(e){return n(e,e.warnings)}))}}var kr=\"Tried to access di from the businessObject. The di is available through the diagram element only. For more information, see https://github.com/bpmn-io/bpmn-js/issues/1472\";function Pr(e,t){return e.$instanceOf(t)}function Dr(e,t){var n={},i=[],r={};function o(e,t){return function(n){e(n,t)}}function a(e){n[e.id]=e}function s(n,i){try{var o=r[n.id]&&function(n,i){if(n.gfx)throw new Error(t(\"already rendered {element}\",{element:bt(n)}));return e.element(n,r[n.id],i)}(n,i);return a(n),o}catch(e){l(e.message,{element:n,error:e}),console.error(t(\"failed to import {element}\",{element:bt(n)})),console.error(e)}}function l(t,n){e.error(t,n)}var m=this.registerDi=function(e){var n,i=e.bpmnElement;i?r[i.id]?l(t(\"multiple DI elements defined for {element}\",{element:bt(i)}),{element:i}):(r[i.id]=e,p(n=i,\"di\")||Object.defineProperty(n,\"di\",{enumerable:!1,get:function(){throw new Error(kr)}})):l(t(\"no bpmnElement referenced in {element}\",{element:bt(e)}),{element:e})};function f(e){var t;t=e.plane,m(t),h(t.planeElement,d)}function d(e){m(e)}this.handleDefinitions=function(a,s){var p=a.diagrams;if(s&&-1===p.indexOf(s))throw new Error(t(\"diagram not part of bpmn:Definitions\"));if(!s&&p&&p.length&&(s=p[0]),!s)throw new Error(t(\"no diagram to display\"));r={},f(s);var d=s.plane;if(!d)throw new Error(t(\"no plane for {element}\",{element:bt(s)}));var b=d.bpmnElement;if(!b){if(b=function(e){return c(e.rootElements,(function(e){return Pr(e,\"bpmn:Process\")||Pr(e,\"bpmn:Collaboration\")}))}(a),!b)throw new Error(t(\"no process or collaboration to display\"));l(t(\"correcting missing bpmnElement on {plane} to {rootElement}\",{plane:bt(d),rootElement:bt(b)})),d.bpmnElement=b,m(d)}var x,w,E=function(t,n){return e.root(t,r[t.id],n)}(b,d);if(Pr(b,\"bpmn:Process\")||Pr(b,\"bpmn:SubProcess\"))g(b,E);else{if(!Pr(b,\"bpmn:Collaboration\"))throw new Error(t(\"unsupported bpmnElement for {plane}: {rootElement}\",{plane:bt(d),rootElement:bt(b)}));w=E,h((x=b).participants,o(D,w)),_(x.artifacts,w),i.push((function(){!function(e,t){h(e,o(v,t))}(x.messageFlows,w)})),function(e,t){var i=u(e,(function(e){return!n[e.id]&&Pr(e,\"bpmn:Process\")&&e.laneSets}));i.forEach(o(g,t))}(a.rootElements,E)}y(i)};var y=this.handleDeferred=function(){for(;i.length;)i.shift()()};function g(e,t){P(e,t),A(e.ioSpecification,t),_(e.artifacts,t),a(e)}function v(e,t){s(e,t)}function b(e,t){s(e,t)}function x(e,t){s(e,t)}function w(e,t){s(e,t)}function E(e,t){s(e,t)}function _(e,t){h(e,(function(e){Pr(e,\"bpmn:Association\")?i.push((function(){E(e,t)})):E(e,t)}))}function A(e,t){e&&(h(e.dataInputs,o(x,t)),h(e.dataOutputs,o(w,t)))}var S=this.handleSubProcess=function(e,t){P(e,t),_(e.artifacts,t)};function R(e,t){var n=s(e,t);Pr(e,\"bpmn:SubProcess\")&&S(e,n||t),Pr(e,\"bpmn:Activity\")&&A(e.ioSpecification,t),i.push((function(){h(e.dataInputAssociations,o(b,t)),h(e.dataOutputAssociations,o(b,t))}))}function C(e,t){s(e,t)}function M(e,t){i.push((function(){var n=s(e,t);e.childLaneSet&&k(e.childLaneSet,n||t),function(e){h(e.flowNodeRef,(function(t){var n=t.get(\"lanes\");n&&n.push(e)}))}(e)}))}function k(e,t){h(e.lanes,o(M,t))}function P(e,n){!function(e,n){h(e,(function(e){Pr(e,\"bpmn:SequenceFlow\")?i.push((function(){!function(e,t){s(e,t)}(e,n)})):Pr(e,\"bpmn:BoundaryEvent\")?i.unshift((function(){R(e,n)})):Pr(e,\"bpmn:FlowNode\")?R(e,n):Pr(e,\"bpmn:DataObject\")||(Pr(e,\"bpmn:DataStoreReference\")||Pr(e,\"bpmn:DataObjectReference\")?C(e,n):l(t(\"unrecognized flowElement {element} in context {context}\",{element:bt(e),context:n?bt(n.businessObject):\"null\"}),{element:e,context:n}))}))}(e.flowElements,n),e.laneSets&&function(e,t){h(e,o(k,t))}(e.laneSets,n)}function D(e,t){var n=s(e,t),i=e.processRef;i&&g(i,n||t)}}function Tr(e,t,n){var i,r,o,a,s=[];function l(e,t){var n=new Dr({root:function(e,t){return i.add(e,t)},element:function(e,t,n){return i.add(e,t,n)},error:function(e,t){s.push({message:e,context:t})}},o);t=t||e.diagrams&&e.diagrams[0];var r=function(e,t){if(!t)return;var n,i=t.plane.bpmnElement,r=i;A(i,\"bpmn:Process\")||A(i,\"bpmn:Collaboration\")||(r=function(e){var t=e;for(;t;){if(A(t,\"bpmn:Process\"))return t;t=t.$parent}}\n/**\n   * This file must not be changed or exchanged.\n   *\n   * @see http://bpmn.io/license for more information.\n   */(i));n=A(r,\"bpmn:Collaboration\")?r:c(e.rootElements,(function(e){if(A(e,\"bpmn:Collaboration\"))return c(e.participants,(function(e){return e.processRef===r}))}));var o=[r];n&&(o=function(e,t){let n=[];return h(e,(function(e,i){n.push(t(e,i))})),n}(n.participants,(function(e){return e.processRef})),o.push(n));var a=Or(o),s=[t],l=[i];return h(e.diagrams,(function(e){var t=e.plane.bpmnElement;-1!==a.indexOf(t)&&-1===l.indexOf(t)&&(s.push(e),l.push(t))})),s}(e,t);if(!r)throw new Error(o(\"no diagram to display\"));h(r,(function(t){n.handleDefinitions(e,t)}));var l=t.plane.bpmnElement.id;a.setRootElement(a.findRoot(l+\"_plane\")||a.findRoot(l))}return new Promise((function(p,c){try{return i=e.get(\"bpmnImporter\"),r=e.get(\"eventBus\"),o=e.get(\"translate\"),a=e.get(\"canvas\"),r.fire(\"import.render.start\",{definitions:t}),l(t,n),r.fire(\"import.render.complete\",{error:undefined,warnings:s}),p({warnings:s})}catch(e){return e.warnings=s,c(e)}}))}function Or(e){var t=[];return h(e,(function(e){e&&(t.push(e),t=t.concat(Or(e.flowElements)))})),t}var Nr,Br='<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 14.02 5.57\" width=\"53\" height=\"21\"><path fill=\"currentColor\" d=\"M1.88.92v.14c0 .41-.13.68-.4.8.33.14.46.44.46.86v.33c0 .61-.33.95-.95.95H0V0h.95c.65 0 .93.3.93.92zM.63.57v1.06h.24c.24 0 .38-.1.38-.43V.98c0-.28-.1-.4-.32-.4zm0 1.63v1.22h.36c.2 0 .32-.1.32-.39v-.35c0-.37-.12-.48-.4-.48H.63zM4.18.99v.52c0 .64-.31.98-.94.98h-.3V4h-.62V0h.92c.63 0 .94.35.94.99zM2.94.57v1.35h.3c.2 0 .3-.09.3-.37v-.6c0-.29-.1-.38-.3-.38h-.3zm2.89 2.27L6.25 0h.88v4h-.6V1.12L6.1 3.99h-.6l-.46-2.82v2.82h-.55V0h.87zM8.14 1.1V4h-.56V0h.79L9 2.4V0h.56v4h-.64zm2.49 2.29v.6h-.6v-.6zM12.12 1c0-.63.33-1 .95-1 .61 0 .95.37.95 1v2.04c0 .64-.34 1-.95 1-.62 0-.95-.37-.95-1zm.62 2.08c0 .28.13.39.33.39s.32-.1.32-.4V.98c0-.29-.12-.4-.32-.4s-.33.11-.33.4z\"/><path fill=\"currentColor\" d=\"M0 4.53h14.02v1.04H0zM11.08 0h.63v.62h-.63zm.63 4V1h-.63v2.98z\"/></svg>',Lr={verticalAlign:\"middle\"},Ir={color:\"#404040\"},jr={zIndex:\"1001\",position:\"fixed\",top:\"0\",left:\"0\",right:\"0\",bottom:\"0\"},Fr={width:\"100%\",height:\"100%\",background:\"rgba(40,40,40,0.2)\"},Vr={position:\"absolute\",left:\"50%\",top:\"40%\",transform:\"translate(-50%)\",width:\"260px\",padding:\"10px\",background:\"white\",boxShadow:\"0 1px 4px rgba(0,0,0,0.3)\",fontFamily:\"Helvetica, Arial, sans-serif\",fontSize:\"14px\",display:\"flex\",lineHeight:\"1.3\"},Wr='<div class=\"bjs-powered-by-lightbox\"><div class=\"backdrop\"></div><div class=\"notice\"><a href=\"https://bpmn.io\" target=\"_blank\" rel=\"noopener\" class=\"link\">'+Br+'</a><span>Web-based tooling for BPMN, DMN and forms powered by <a href=\"https://bpmn.io\" target=\"_blank\" rel=\"noopener\">bpmn.io</a>.</span></div></div>';function zr(){Nr||(Re(Nr=He(Wr),jr),Re(Ke(\"svg\",Nr),Lr),Re(Ke(\".backdrop\",Nr),Fr),Re(Ke(\".notice\",Nr),Vr),Re(Ke(\".link\",Nr),Ir,{margin:\"15px 20px 15px 10px\",alignSelf:\"center\"}),We.bind(Nr,\".backdrop\",\"click\",(function(e){document.body.removeChild(Nr)}))),document.body.appendChild(Nr)}\n/**\n   * The code in the <project-logo></project-logo> area\n   * must not be changed.\n   *\n   * @see http://bpmn.io/license for more information.\n   */function Gr(e){e=w({},Hr,e),this._moddle=this._createModdle(e),this._container=this._createContainer(e),\n/**\n   * Adds the project logo to the diagram container as\n   * required by the bpmn.io license.\n   *\n   * @see http://bpmn.io/license\n   *\n   * @param {Element} container\n   */\nfunction(e){const t=He('<a href=\"http://bpmn.io\" target=\"_blank\" class=\"bjs-powered-by\" title=\"Powered by bpmn.io\" >'+Br+\"</a>\");Re(Ke(\"svg\",t),Lr),Re(t,Ir,{position:\"absolute\",bottom:\"15px\",right:\"15px\",zIndex:\"100\"}),e.appendChild(t),je.bind(t,\"click\",(function(e){zr(),e.preventDefault()}))}(this._container),this._init(this._container,this._moddle,e)}function $r(e,t){return e.warnings=t,e}e(Gr,hi),Gr.prototype.importXML=async function(e,t){const n=this;let i=[];try{let r;e=this._emit(\"import.parse.start\",{xml:e})||e;try{r=await this._moddle.fromXML(e,\"bpmn:Definitions\")}catch(e){throw this._emit(\"import.parse.complete\",{error:e}),e}let o=r.rootElement;const a=r.references,s=r.warnings,l=r.elementsById;i=i.concat(s),o=this._emit(\"import.parse.complete\",function(e){const t=n.get(\"eventBus\").createEvent(e);return Object.defineProperty(t,\"context\",{enumerable:!0,get:function(){return console.warn(new Error(\"import.parse.complete <context> is deprecated and will be removed in future library versions\")),{warnings:e.warnings,references:e.references,elementsById:e.elementsById}}}),t}({error:null,definitions:o,elementsById:l,references:a,warnings:i}))||o;const p=await this.importDefinitions(o,t);return i=i.concat(p.warnings),this._emit(\"import.done\",{error:null,warnings:i}),{warnings:i}}catch(e){let t=e;throw i=i.concat(t.warnings||[]),$r(t,i),t=function(e){const t=/unparsable content <([^>]+)> detected([\\s\\S]*)$/.exec(e.message);t&&(e.message=\"unparsable content <\"+t[1]+\"> detected; this may indicate an invalid BPMN 2.0 diagram file\"+t[2]);return e}(t),this._emit(\"import.done\",{error:t,warnings:t.warnings}),t}},Gr.prototype.importXML=Mr(Gr.prototype.importXML),Gr.prototype.importDefinitions=async function(e,t){this._setDefinitions(e);return{warnings:(await this.open(t)).warnings}},Gr.prototype.importDefinitions=Mr(Gr.prototype.importDefinitions),Gr.prototype.open=async function(e){const t=this._definitions;let n=e;if(!t){const e=new Error(\"no XML imported\");throw $r(e,[]),e}if(\"string\"==typeof e&&(n=function(e,t){if(!t)return null;return c(e.diagrams,(function(e){return e.id===t}))||null}(t,e),!n)){const t=new Error(\"BPMNDiagram <\"+e+\"> not found\");throw $r(t,[]),t}try{this.clear()}catch(e){throw $r(e,[]),e}const{warnings:i}=await Tr(this,t,n);return{warnings:i}},Gr.prototype.open=Mr(Gr.prototype.open),Gr.prototype.saveXML=async function(e){e=e||{};let t,n,i=this._definitions;try{if(!i)throw new Error(\"no definitions loaded\");i=this._emit(\"saveXML.start\",{definitions:i})||i;n=(await this._moddle.toXML(i,e)).xml,n=this._emit(\"saveXML.serialized\",{xml:n})||n}catch(e){t=e}const r=t?{error:t}:{xml:n};if(this._emit(\"saveXML.done\",r),t)throw t;return r},Gr.prototype.saveXML=Mr(Gr.prototype.saveXML),Gr.prototype.saveSVG=async function(){let e,t;this._emit(\"saveSVG.start\");try{const t=this.get(\"canvas\"),n=t.getActiveLayer(),i=Ke(\"defs\",t._svg),r=re(n),o=i?\"<defs>\"+re(i)+\"</defs>\":\"\",a=n.getBBox();e='<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n\\x3c!-- created with bpmn-js / http://bpmn.io --\\x3e\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"'+a.width+'\" height=\"'+a.height+'\" viewBox=\"'+a.x+\" \"+a.y+\" \"+a.width+\" \"+a.height+'\" version=\"1.1\">'+o+r+\"</svg>\"}catch(e){t=e}if(this._emit(\"saveSVG.done\",{error:t,svg:e}),t)throw t;return{svg:e}},Gr.prototype.saveSVG=Mr(Gr.prototype.saveSVG),Gr.prototype._setDefinitions=function(e){this._definitions=e},Gr.prototype.getModules=function(){return this._modules},Gr.prototype.clear=function(){this.getDefinitions()&&hi.prototype.clear.call(this)},Gr.prototype.destroy=function(){hi.prototype.destroy.call(this),Ue(this._container)},Gr.prototype.on=function(e,t,n,i){return this.get(\"eventBus\").on(e,t,n,i)},Gr.prototype.off=function(e,t){this.get(\"eventBus\").off(e,t)},Gr.prototype.attachTo=function(e){if(!e)throw new Error(\"parentNode required\");this.detach(),e.get&&e.constructor.prototype.jquery&&(e=e.get(0)),\"string\"==typeof e&&(e=Ke(e)),e.appendChild(this._container),this._emit(\"attach\",{}),this.get(\"canvas\").resized()},Gr.prototype.getDefinitions=function(){return this._definitions},Gr.prototype.detach=function(){const e=this._container,t=e.parentNode;t&&(this._emit(\"detach\",{}),t.removeChild(e))},Gr.prototype._init=function(e,t,n){const i=n.modules||this.getModules(n),r=n.additionalModules||[],o=[].concat([{bpmnjs:[\"value\",this],moddle:[\"value\",t]}],i,r),a=w(function(e,t){let n={};return h(Object(e),(function(e,i){-1===t.indexOf(i)&&(n[i]=e)})),n}(n,[\"additionalModules\"]),{canvas:w({},n.canvas,{container:e}),modules:o});hi.call(this,a),n&&n.container&&this.attachTo(n.container)},Gr.prototype._emit=function(e,t){return this.get(\"eventBus\").fire(e,t)},Gr.prototype._createContainer=function(e){const t=He('<div class=\"bjs-container\"></div>');return Re(t,{width:Kr(e.width),height:Kr(e.height),position:e.position}),t},Gr.prototype._createModdle=function(e){return new Cr(w({},this._moddleExtensions,e.moddleExtensions))},Gr.prototype._modules=[];const Hr={width:\"100%\",height:\"100%\",position:\"relative\"};function Kr(e){return e+(a(e)?\"px\":\"\")}function Ur(e){Gr.call(this,e)}e(Ur,Gr),Ur.prototype._modules=[At,mt,Ht,Jt,vn],Ur.prototype._moddleExtensions={};var qr=[\"c\",\"C\"],Yr=[\"v\",\"V\"],Xr=[\"y\",\"Y\"],Zr=[\"z\",\"Z\"];function Jr(e){return!e.altKey&&(e.ctrlKey||e.metaKey)}function Qr(e,t){return-1!==(e=r(e)?e:[e]).indexOf(t.key)||-1!==e.indexOf(t.code)}function eo(e){return e.shiftKey}var to=\"keyboard.keydown\",no=\"input-handle-modified-keys\";function io(e,t){var n=this;this._config=e||{},this._eventBus=t,this._keydownHandler=this._keydownHandler.bind(this),this._keyupHandler=this._keyupHandler.bind(this),t.on(\"diagram.destroy\",(function(){n._fire(\"destroy\"),n.unbind()})),t.on(\"diagram.init\",(function(){n._fire(\"init\")})),t.on(\"attach\",(function(){e&&e.bindTo&&n.bind(e.bindTo)})),t.on(\"detach\",(function(){n.unbind()}))}io.$inject=[\"config.keyboard\",\"eventBus\"],io.prototype._keydownHandler=function(e){this._keyHandler(e,to)},io.prototype._keyupHandler=function(e){this._keyHandler(e,\"keyboard.keyup\")},io.prototype._keyHandler=function(e,t){if(!this._isEventIgnored(e)){var n={keyEvent:e};this._eventBus.fire(t||to,n)&&e.preventDefault()}},io.prototype._isEventIgnored=function(e){return!!e.defaultPrevented||(t=e.target)&&(De(t,\"input, textarea\")||\"true\"===t.contentEditable)&&this._isModifiedKeyIgnored(e);var t},io.prototype._isModifiedKeyIgnored=function(e){return!Jr(e)||-1===this._getAllowedModifiers(e.target).indexOf(e.key)},io.prototype._getAllowedModifiers=function(e){var t=Te(e,\"[\"+no+\"]\",!0);return!t||this._node&&!this._node.contains(t)?[]:t.getAttribute(no).split(\",\")},io.prototype.bind=function(e){this.unbind(),this._node=e,je.bind(e,\"keydown\",this._keydownHandler),je.bind(e,\"keyup\",this._keyupHandler),this._fire(\"bind\")},io.prototype.getBinding=function(){return this._node},io.prototype.unbind=function(){var e=this._node;e&&(this._fire(\"unbind\"),je.unbind(e,\"keydown\",this._keydownHandler),je.unbind(e,\"keyup\",this._keyupHandler)),this._node=null},io.prototype._fire=function(e){this._eventBus.fire(\"keyboard.\"+e,{node:this._node})},io.prototype.addListener=function(e,t,n){s(e)&&(n=t,t=e,e=1e3),this._eventBus.on(n||to,e,t)},io.prototype.removeListener=function(e,t){this._eventBus.off(t||to,e)},io.prototype.hasModifier=function(e){return e.ctrlKey||e.metaKey||e.shiftKey||e.altKey},io.prototype.isCmd=Jr,io.prototype.isShift=eo,io.prototype.isKey=Qr;function ro(e,t){var n=this;e.on(\"editorActions.init\",500,(function(e){var i=e.editorActions;n.registerBindings(t,i)}))}ro.$inject=[\"eventBus\",\"keyboard\"],ro.prototype.registerBindings=function(e,t){function n(n,i){t.isRegistered(n)&&e.addListener(i)}n(\"undo\",(function(e){if(function(e){return Jr(e)&&!eo(e)&&Qr(Zr,e)}(e.keyEvent))return t.trigger(\"undo\"),!0})),n(\"redo\",(function(e){if(function(e){return Jr(e)&&(Qr(Xr,e)||Qr(Zr,e)&&eo(e))}(e.keyEvent))return t.trigger(\"redo\"),!0})),n(\"copy\",(function(e){if(function(e){return Jr(e)&&Qr(qr,e)}(e.keyEvent))return t.trigger(\"copy\"),!0})),n(\"paste\",(function(e){if(function(e){return Jr(e)&&Qr(Yr,e)}(e.keyEvent))return t.trigger(\"paste\"),!0})),n(\"stepZoom\",(function(e){var n=e.keyEvent;if(Qr([\"+\",\"Add\",\"=\"],n)&&Jr(n))return t.trigger(\"stepZoom\",{value:1}),!0})),n(\"stepZoom\",(function(e){var n=e.keyEvent;if(Qr([\"-\",\"Subtract\"],n)&&Jr(n))return t.trigger(\"stepZoom\",{value:-1}),!0})),n(\"zoom\",(function(e){var n=e.keyEvent;if(Qr(\"0\",n)&&Jr(n))return t.trigger(\"zoom\",{value:1}),!0})),n(\"removeSelection\",(function(e){if(Qr([\"Backspace\",\"Delete\",\"Del\"],e.keyEvent))return t.trigger(\"removeSelection\"),!0}))};var oo={__init__:[\"keyboard\",\"keyboardBindings\"],keyboard:[\"type\",io],keyboardBindings:[\"type\",ro]},ao={moveSpeed:50,moveSpeedAccelerated:200};function so(e,t,n){var i=this;this._config=w({},ao,e||{}),t.addListener((function(e){var n=e.keyEvent,r=i._config;if(!t.isCmd(n))return;if(t.isKey([\"ArrowLeft\",\"Left\",\"ArrowUp\",\"Up\",\"ArrowDown\",\"Down\",\"ArrowRight\",\"Right\"],n)){var o,a=t.isShift(n)?r.moveSpeedAccelerated:r.moveSpeed;switch(n.key){case\"ArrowLeft\":case\"Left\":o=\"left\";break;case\"ArrowUp\":case\"Up\":o=\"up\";break;case\"ArrowRight\":case\"Right\":o=\"right\";break;case\"ArrowDown\":case\"Down\":o=\"down\"}return i.moveCanvas({speed:a,direction:o}),!0}})),this.moveCanvas=function(e){var t=0,i=0,r=e.speed/Math.min(Math.sqrt(n.viewbox().scale),1);switch(e.direction){case\"left\":t=r;break;case\"up\":i=r;break;case\"right\":t=-r;break;case\"down\":i=-r}n.scroll({dx:t,dy:i})}}so.$inject=[\"config.keyboardMove\",\"keyboard\",\"canvas\"];var lo={__depends__:[oo],__init__:[\"keyboardMove\"],keyboardMove:[\"type\",so]},po=/^djs-cursor-.*$/;function co(e){var t=Me(document.body);t.removeMatching(po),e&&t.add(\"djs-cursor-\"+e)}var uo=5e3;function ho(e,t){return{x:e.x-t.x,y:e.y-t.y}}function mo(e,t){var n;function i(i){var r,o=n.start,a=n.button,s=Rt(i),l=ho(s,o);(!n.dragging&&(r=l,Math.sqrt(Math.pow(r.x,2)+Math.pow(r.y,2))>15)&&(n.dragging=!0,0===a&&function(e,t){function n(){return!1}t=t||\"element.click\",e.once(t,uo,n)}(e),co(\"grab\")),n.dragging)&&(l=ho(s,n.last||n.start),t.scroll({dx:l.x,dy:l.y}),n.last=s);i.preventDefault()}function r(e){je.unbind(document,\"mousemove\",i),je.unbind(document,\"mouseup\",r),n=null,co(null)}e.on(\"element.mousedown\",500,(function(e){return function(e){if(Te(e.target,\".djs-draggable\"))return;var t=e.button;if(t>=2||e.ctrlKey||e.shiftKey||e.altKey)return;return n={button:t,start:Rt(e)},je.bind(document,\"mousemove\",i),je.bind(document,\"mouseup\",r),!0}(e.originalEvent)})),this.isActive=function(){return!!n}}mo.$inject=[\"eventBus\",\"canvas\"];var fo={__init__:[\"moveCanvas\"],moveCanvas:[\"type\",mo]};function yo(e){return Math.log(e)/Math.log(10)}function go(e,t){var n=yo(e.min),i=yo(e.max);return(Math.abs(n)+Math.abs(i))/t}var vo=Math.sign||function(e){return e>=0?1:-1},bo={min:.2,max:4};function xo(e,t,n){e=e||{},this._enabled=!1,this._canvas=n,this._container=n._container,this._handleWheel=x(this._handleWheel,this),this._totalDelta=0,this._scale=e.scale||.75;var i=this;t.on(\"canvas.init\",(function(t){i._init(!1!==e.enabled)}))}xo.$inject=[\"config.zoomScroll\",\"eventBus\",\"canvas\"],xo.prototype.scroll=function(e){this._canvas.scroll(e)},xo.prototype.reset=function(){this._canvas.zoom(\"fit-viewport\")},xo.prototype.zoom=function(e,t){var n=go(bo,20);this._totalDelta+=e,Math.abs(this._totalDelta)>.1&&(this._zoom(e,t,n),this._totalDelta=0)},xo.prototype._handleWheel=function(e){if(!Te(e.target,\".djs-scrollable\",!0)){var t=this._container;e.preventDefault();var n,i=e.ctrlKey,r=e.shiftKey,o=-1*this._scale;if(o*=i?0===e.deltaMode?.02:.32:0===e.deltaMode?1:16,i){var a=t.getBoundingClientRect(),s={x:e.clientX-a.left,y:e.clientY-a.top};n=Math.sqrt(Math.pow(e.deltaY,2)+Math.pow(e.deltaX,2))*vo(e.deltaY)*o,this.zoom(n,s)}else n=r?{dx:o*e.deltaY,dy:0}:{dx:o*e.deltaX,dy:o*e.deltaY},this.scroll(n)}},xo.prototype.stepZoom=function(e,t){var n=go(bo,10);this._zoom(e,t,n)},xo.prototype._zoom=function(e,t,n){var i=this._canvas,r=e>0?1:-1,o=yo(i.zoom()),a=Math.round(o/n)*n;a+=n*r;var s,l,p=Math.pow(10,a);i.zoom((s=bo,l=p,Math.max(s.min,Math.min(s.max,l))),t)},xo.prototype.toggle=function(e){var t=this._container,n=this._handleWheel,i=this._enabled;return void 0===e&&(e=!i),i!==e&&je[e?\"bind\":\"unbind\"](t,\"wheel\",n,!1),this._enabled=e,e},xo.prototype._init=function(e){this.toggle(e)};var wo={__init__:[\"zoomScroll\"],zoomScroll:[\"type\",xo]};function Eo(e){Ur.call(this,e)}return e(Eo,Ur),Eo.prototype._navigationModules=[lo,fo,wo],Eo.prototype._modules=[].concat(Ur.prototype._modules,Eo.prototype._navigationModules),Eo}));\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bpmnjs/bpmn-viewer.development.js",
    "content": "/*!\n * bpmn-js - bpmn-viewer v13.2.1\n *\n * Copyright (c) 2014-present, camunda Services GmbH\n *\n * Released under the bpmn.io license\n * http://bpmn.io/license\n *\n * Source Code: https://github.com/bpmn-io/bpmn-js\n *\n * Date: 2023-08-05\n */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n  typeof define === 'function' && define.amd ? define(factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.BpmnViewer = factory());\n})(this, (function () { 'use strict';\n\n  function e(e,t){t&&(e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}));}\n\n  /**\n   * Flatten array, one level deep.\n   *\n   * @template T\n   *\n   * @param {T[][]} arr\n   *\n   * @return {T[]}\n   */\n\n  const nativeToString$1 = Object.prototype.toString;\n  const nativeHasOwnProperty$1 = Object.prototype.hasOwnProperty;\n\n  function isUndefined$2(obj) {\n    return obj === undefined;\n  }\n\n  function isDefined(obj) {\n    return obj !== undefined;\n  }\n\n  function isArray$2(obj) {\n    return nativeToString$1.call(obj) === '[object Array]';\n  }\n\n  function isObject(obj) {\n    return nativeToString$1.call(obj) === '[object Object]';\n  }\n\n  function isNumber(obj) {\n    return nativeToString$1.call(obj) === '[object Number]';\n  }\n\n  /**\n   * @param {any} obj\n   *\n   * @return {boolean}\n   */\n  function isFunction(obj) {\n    const tag = nativeToString$1.call(obj);\n\n    return (\n      tag === '[object Function]' ||\n      tag === '[object AsyncFunction]' ||\n      tag === '[object GeneratorFunction]' ||\n      tag === '[object AsyncGeneratorFunction]' ||\n      tag === '[object Proxy]'\n    );\n  }\n\n  function isString(obj) {\n    return nativeToString$1.call(obj) === '[object String]';\n  }\n\n  /**\n   * Return true, if target owns a property with the given key.\n   *\n   * @param {Object} target\n   * @param {String} key\n   *\n   * @return {Boolean}\n   */\n  function has$1(target, key) {\n    return nativeHasOwnProperty$1.call(target, key);\n  }\n\n  /**\n   * @template T\n   * @typedef { (\n   *   ((e: T) => boolean) |\n   *   ((e: T, idx: number) => boolean) |\n   *   ((e: T, key: string) => boolean) |\n   *   string |\n   *   number\n   * ) } Matcher\n   */\n\n  /**\n   * @template T\n   * @template U\n   *\n   * @typedef { (\n   *   ((e: T) => U) | string | number\n   * ) } Extractor\n   */\n\n\n  /**\n   * @template T\n   * @typedef { (val: T, key: any) => boolean } MatchFn\n   */\n\n  /**\n   * @template T\n   * @typedef { T[] } ArrayCollection\n   */\n\n  /**\n   * @template T\n   * @typedef { { [key: string]: T } } StringKeyValueCollection\n   */\n\n  /**\n   * @template T\n   * @typedef { { [key: number]: T } } NumberKeyValueCollection\n   */\n\n  /**\n   * @template T\n   * @typedef { StringKeyValueCollection<T> | NumberKeyValueCollection<T> } KeyValueCollection\n   */\n\n  /**\n   * @template T\n   * @typedef { KeyValueCollection<T> | ArrayCollection<T> } Collection\n   */\n\n  /**\n   * Find element in collection.\n   *\n   * @template T\n   * @param {Collection<T>} collection\n   * @param {Matcher<T>} matcher\n   *\n   * @return {Object}\n   */\n  function find(collection, matcher) {\n\n    const matchFn = toMatcher(matcher);\n\n    let match;\n\n    forEach$1(collection, function(val, key) {\n      if (matchFn(val, key)) {\n        match = val;\n\n        return false;\n      }\n    });\n\n    return match;\n\n  }\n\n\n  /**\n   * Find element index in collection.\n   *\n   * @template T\n   * @param {Collection<T>} collection\n   * @param {Matcher<T>} matcher\n   *\n   * @return {number}\n   */\n  function findIndex(collection, matcher) {\n\n    const matchFn = toMatcher(matcher);\n\n    let idx = isArray$2(collection) ? -1 : undefined;\n\n    forEach$1(collection, function(val, key) {\n      if (matchFn(val, key)) {\n        idx = key;\n\n        return false;\n      }\n    });\n\n    return idx;\n  }\n\n\n  /**\n   * Filter elements in collection.\n   *\n   * @template T\n   * @param {Collection<T>} collection\n   * @param {Matcher<T>} matcher\n   *\n   * @return {T[]} result\n   */\n  function filter(collection, matcher) {\n\n    const matchFn = toMatcher(matcher);\n\n    let result = [];\n\n    forEach$1(collection, function(val, key) {\n      if (matchFn(val, key)) {\n        result.push(val);\n      }\n    });\n\n    return result;\n  }\n\n\n  /**\n   * Iterate over collection; returning something\n   * (non-undefined) will stop iteration.\n   *\n   * @template T\n   * @param {Collection<T>} collection\n   * @param { ((item: T, idx: number) => (boolean|void)) | ((item: T, key: string) => (boolean|void)) } iterator\n   *\n   * @return {T} return result that stopped the iteration\n   */\n  function forEach$1(collection, iterator) {\n\n    let val,\n        result;\n\n    if (isUndefined$2(collection)) {\n      return;\n    }\n\n    const convertKey = isArray$2(collection) ? toNum$1 : identity$1;\n\n    for (let key in collection) {\n\n      if (has$1(collection, key)) {\n        val = collection[key];\n\n        result = iterator(val, convertKey(key));\n\n        if (result === false) {\n          return val;\n        }\n      }\n    }\n  }\n\n\n  /**\n   * Reduce collection, returning a single result.\n   *\n   * @template T\n   * @template V\n   *\n   * @param {Collection<T>} collection\n   * @param {(result: V, entry: T, index: any) => V} iterator\n   * @param {V} result\n   *\n   * @return {V} result returned from last iterator\n   */\n  function reduce(collection, iterator, result) {\n\n    forEach$1(collection, function(value, idx) {\n      result = iterator(result, value, idx);\n    });\n\n    return result;\n  }\n\n\n  /**\n   * Return true if every element in the collection\n   * matches the criteria.\n   *\n   * @param  {Object|Array} collection\n   * @param  {Function} matcher\n   *\n   * @return {Boolean}\n   */\n  function every(collection, matcher) {\n\n    return !!reduce(collection, function(matches, val, key) {\n      return matches && matcher(val, key);\n    }, true);\n  }\n\n\n  /**\n   * Return true if some elements in the collection\n   * match the criteria.\n   *\n   * @param  {Object|Array} collection\n   * @param  {Function} matcher\n   *\n   * @return {Boolean}\n   */\n  function some(collection, matcher) {\n\n    return !!find(collection, matcher);\n  }\n\n\n  /**\n   * Transform a collection into another collection\n   * by piping each member through the given fn.\n   *\n   * @param  {Object|Array}   collection\n   * @param  {Function} fn\n   *\n   * @return {Array} transformed collection\n   */\n  function map$1(collection, fn) {\n\n    let result = [];\n\n    forEach$1(collection, function(val, key) {\n      result.push(fn(val, key));\n    });\n\n    return result;\n  }\n\n\n  /**\n   * Create an object pattern matcher.\n   *\n   * @example\n   *\n   * ```javascript\n   * const matcher = matchPattern({ id: 1 });\n   *\n   * let element = find(elements, matcher);\n   * ```\n   *\n   * @template T\n   *\n   * @param {T} pattern\n   *\n   * @return { (el: any) =>  boolean } matcherFn\n   */\n  function matchPattern(pattern) {\n\n    return function(el) {\n\n      return every(pattern, function(val, key) {\n        return el[key] === val;\n      });\n\n    };\n  }\n\n\n  /**\n   * @template T\n   * @param {Matcher<T>} matcher\n   *\n   * @return {MatchFn<T>}\n   */\n  function toMatcher(matcher) {\n    return isFunction(matcher) ? matcher : (e) => {\n      return e === matcher;\n    };\n  }\n\n\n  function identity$1(arg) {\n    return arg;\n  }\n\n  function toNum$1(arg) {\n    return Number(arg);\n  }\n\n  /* global setTimeout clearTimeout */\n\n  /**\n   * @typedef { {\n   *   (...args: any[]): any;\n   *   flush: () => void;\n   *   cancel: () => void;\n   * } } DebouncedFunction\n   */\n\n  /**\n   * Debounce fn, calling it only once if the given time\n   * elapsed between calls.\n   *\n   * Lodash-style the function exposes methods to `#clear`\n   * and `#flush` to control internal behavior.\n   *\n   * @param  {Function} fn\n   * @param  {Number} timeout\n   *\n   * @return {DebouncedFunction} debounced function\n   */\n  function debounce(fn, timeout) {\n\n    let timer;\n\n    let lastArgs;\n    let lastThis;\n\n    let lastNow;\n\n    function fire(force) {\n\n      let now = Date.now();\n\n      let scheduledDiff = force ? 0 : (lastNow + timeout) - now;\n\n      if (scheduledDiff > 0) {\n        return schedule(scheduledDiff);\n      }\n\n      fn.apply(lastThis, lastArgs);\n\n      clear();\n    }\n\n    function schedule(timeout) {\n      timer = setTimeout(fire, timeout);\n    }\n\n    function clear() {\n      if (timer) {\n        clearTimeout(timer);\n      }\n\n      timer = lastNow = lastArgs = lastThis = undefined;\n    }\n\n    function flush() {\n      if (timer) {\n        fire(true);\n      }\n\n      clear();\n    }\n\n    /**\n     * @type { DebouncedFunction }\n     */\n    function callback(...args) {\n      lastNow = Date.now();\n\n      lastArgs = args;\n      lastThis = this;\n\n      // ensure an execution is scheduled\n      if (!timer) {\n        schedule(timeout);\n      }\n    }\n\n    callback.flush = flush;\n    callback.cancel = clear;\n\n    return callback;\n  }\n\n  /**\n   * Bind function against target <this>.\n   *\n   * @param  {Function} fn\n   * @param  {Object}   target\n   *\n   * @return {Function} bound function\n   */\n  function bind$2(fn, target) {\n    return fn.bind(target);\n  }\n\n  /**\n   * Convenience wrapper for `Object.assign`.\n   *\n   * @param {Object} target\n   * @param {...Object} others\n   *\n   * @return {Object} the target\n   */\n  function assign$1(target, ...others) {\n    return Object.assign(target, ...others);\n  }\n\n  /**\n   * Pick properties from the given target.\n   *\n   * @template T\n   * @template {any[]} V\n   *\n   * @param {T} target\n   * @param {V} properties\n   *\n   * @return Pick<T, V>\n   */\n  function pick(target, properties) {\n\n    let result = {};\n\n    let obj = Object(target);\n\n    forEach$1(properties, function(prop) {\n\n      if (prop in obj) {\n        result[prop] = target[prop];\n      }\n    });\n\n    return result;\n  }\n\n  /**\n   * Pick all target properties, excluding the given ones.\n   *\n   * @template T\n   * @template {any[]} V\n   *\n   * @param {T} target\n   * @param {V} properties\n   *\n   * @return {Omit<T, V>} target\n   */\n  function omit(target, properties) {\n\n    let result = {};\n\n    let obj = Object(target);\n\n    forEach$1(obj, function(prop, key) {\n\n      if (properties.indexOf(key) === -1) {\n        result[key] = prop;\n      }\n    });\n\n    return result;\n  }\n\n  var DEFAULT_RENDER_PRIORITY$1 = 1000;\n\n  /**\n   * @typedef {import('../core/Types').ElementLike} Element\n   * @typedef {import('../core/Types').ConnectionLike} Connection\n   * @typedef {import('../core/Types').ShapeLike} Shape\n   *\n   * @typedef {import('../core/EventBus').default} EventBus\n   */\n\n  /**\n   * The base implementation of shape and connection renderers.\n   *\n   * @param {EventBus} eventBus\n   * @param {number} [renderPriority=1000]\n   */\n  function BaseRenderer(eventBus, renderPriority) {\n    var self = this;\n\n    renderPriority = renderPriority || DEFAULT_RENDER_PRIORITY$1;\n\n    eventBus.on([ 'render.shape', 'render.connection' ], renderPriority, function(evt, context) {\n      var type = evt.type,\n          element = context.element,\n          visuals = context.gfx,\n          attrs = context.attrs;\n\n      if (self.canRender(element)) {\n        if (type === 'render.shape') {\n          return self.drawShape(visuals, element, attrs);\n        } else {\n          return self.drawConnection(visuals, element, attrs);\n        }\n      }\n    });\n\n    eventBus.on([ 'render.getShapePath', 'render.getConnectionPath' ], renderPriority, function(evt, element) {\n      if (self.canRender(element)) {\n        if (evt.type === 'render.getShapePath') {\n          return self.getShapePath(element);\n        } else {\n          return self.getConnectionPath(element);\n        }\n      }\n    });\n  }\n\n  /**\n   * Checks whether an element can be rendered.\n   *\n   * @param {Element} element The element to be rendered.\n   *\n   * @return {boolean} Whether the element can be rendered.\n   */\n  BaseRenderer.prototype.canRender = function(element) {};\n\n  /**\n   * Draws a shape.\n   *\n   * @param {SVGElement} visuals The SVG element to draw the shape into.\n   * @param {Shape} shape The shape to be drawn.\n   *\n   * @return {SVGElement} The SVG element of the shape drawn.\n   */\n  BaseRenderer.prototype.drawShape = function(visuals, shape) {};\n\n  /**\n   * Draws a connection.\n   *\n   * @param {SVGElement} visuals The SVG element to draw the connection into.\n   * @param {Connection} connection The connection to be drawn.\n   *\n   * @return {SVGElement} The SVG element of the connection drawn.\n   */\n  BaseRenderer.prototype.drawConnection = function(visuals, connection) {};\n\n  /**\n   * Gets the SVG path of the graphical representation of a shape.\n   *\n   * @param {Shape} shape The shape.\n   *\n   * @return {string} The SVG path of the shape.\n   */\n  BaseRenderer.prototype.getShapePath = function(shape) {};\n\n  /**\n   * Gets the SVG path of the graphical representation of a connection.\n   *\n   * @param {Connection} connection The connection.\n   *\n   * @return {string} The SVG path of the connection.\n   */\n  BaseRenderer.prototype.getConnectionPath = function(connection) {};\n\n  /**\n   * @typedef { import('../model/Types').Element } Element\n   * @typedef { import('../model/Types').ModdleElement } ModdleElement\n   */\n\n  /**\n   * Is an element of the given BPMN type?\n   *\n   * @param  {Element|ModdleElement} element\n   * @param  {string} type\n   *\n   * @return {boolean}\n   */\n  function is$1(element, type) {\n    var bo = getBusinessObject(element);\n\n    return bo && (typeof bo.$instanceOf === 'function') && bo.$instanceOf(type);\n  }\n\n\n  /**\n   * Return true if element has any of the given types.\n   *\n   * @param {Element|ModdleElement} element\n   * @param {string[]} types\n   *\n   * @return {boolean}\n   */\n  function isAny(element, types) {\n    return some(types, function(t) {\n      return is$1(element, t);\n    });\n  }\n\n  /**\n   * Return the business object for a given element.\n   *\n   * @param {Element|ModdleElement} element\n   *\n   * @return {ModdleElement}\n   */\n  function getBusinessObject(element) {\n    return (element && element.businessObject) || element;\n  }\n\n  /**\n   * Return the di object for a given element.\n   *\n   * @param {Element} element\n   *\n   * @return {ModdleElement}\n   */\n  function getDi(element) {\n    return element && element.di;\n  }\n\n  /**\n   * @typedef {import('../model/Types').Element} Element\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   */\n\n  /**\n   * @param {Element} element\n   * @param {ModdleElement} [di]\n   *\n   * @return {boolean}\n   */\n  function isExpanded(element, di) {\n\n    if (is$1(element, 'bpmn:CallActivity')) {\n      return false;\n    }\n\n    if (is$1(element, 'bpmn:SubProcess')) {\n      di = di || getDi(element);\n\n      if (di && is$1(di, 'bpmndi:BPMNPlane')) {\n        return true;\n      }\n\n      return di && !!di.isExpanded;\n    }\n\n    if (is$1(element, 'bpmn:Participant')) {\n      return !!getBusinessObject(element).processRef;\n    }\n\n    return true;\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isEventSubProcess(element) {\n    return element && !!getBusinessObject(element).triggeredByEvent;\n  }\n\n  /**\n   * Checks whether a value is an instance of Connection.\n   *\n   * @param {any} value\n   *\n   * @return {boolean}\n   */\n  function isConnection(value) {\n    return isObject(value) && has$1(value, 'waypoints');\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/util/Types').Point} Point\n   * @typedef {import('diagram-js/lib/util/Types').Rect} Rect\n   *\n   * @typedef {import('../model/Types').Element} Element\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   */\n\n  var DEFAULT_LABEL_SIZE$1 = {\n    width: 90,\n    height: 20\n  };\n\n  var FLOW_LABEL_INDENT = 15;\n\n\n  /**\n   * Return true if the given semantic has an external label.\n   *\n   * @param {Element} semantic\n   *\n   * @return {boolean}\n   */\n  function isLabelExternal(semantic) {\n    return is$1(semantic, 'bpmn:Event') ||\n           is$1(semantic, 'bpmn:Gateway') ||\n           is$1(semantic, 'bpmn:DataStoreReference') ||\n           is$1(semantic, 'bpmn:DataObjectReference') ||\n           is$1(semantic, 'bpmn:DataInput') ||\n           is$1(semantic, 'bpmn:DataOutput') ||\n           is$1(semantic, 'bpmn:SequenceFlow') ||\n           is$1(semantic, 'bpmn:MessageFlow') ||\n           is$1(semantic, 'bpmn:Group');\n  }\n\n  /**\n   * Get the position of a sequence flow label.\n   *\n   * @param  {Point[]} waypoints\n   *\n   * @return {Point}\n   */\n  function getFlowLabelPosition(waypoints) {\n\n    // get the waypoints mid\n    var mid = waypoints.length / 2 - 1;\n\n    var first = waypoints[Math.floor(mid)];\n    var second = waypoints[Math.ceil(mid + 0.01)];\n\n    // get position\n    var position = getWaypointsMid(waypoints);\n\n    // calculate angle\n    var angle = Math.atan((second.y - first.y) / (second.x - first.x));\n\n    var x = position.x,\n        y = position.y;\n\n    if (Math.abs(angle) < Math.PI / 2) {\n      y -= FLOW_LABEL_INDENT;\n    } else {\n      x += FLOW_LABEL_INDENT;\n    }\n\n    return { x: x, y: y };\n  }\n\n\n  /**\n   * Get the middle of a number of waypoints.\n   *\n   * @param  {Point[]} waypoints\n   *\n   * @return {Point}\n   */\n  function getWaypointsMid(waypoints) {\n\n    var mid = waypoints.length / 2 - 1;\n\n    var first = waypoints[Math.floor(mid)];\n    var second = waypoints[Math.ceil(mid + 0.01)];\n\n    return {\n      x: first.x + (second.x - first.x) / 2,\n      y: first.y + (second.y - first.y) / 2\n    };\n  }\n\n  /**\n   * Get the middle of the external label of an element.\n   *\n   * @param {Element} element\n   *\n   * @return {Point}\n   */\n  function getExternalLabelMid(element) {\n\n    if (element.waypoints) {\n      return getFlowLabelPosition(element.waypoints);\n    } else if (is$1(element, 'bpmn:Group')) {\n      return {\n        x: element.x + element.width / 2,\n        y: element.y + DEFAULT_LABEL_SIZE$1.height / 2\n      };\n    } else {\n      return {\n        x: element.x + element.width / 2,\n        y: element.y + element.height + DEFAULT_LABEL_SIZE$1.height / 2\n      };\n    }\n  }\n\n\n  /**\n   * Return the bounds of an elements label, parsed from the elements DI or\n   * generated from its bounds.\n   *\n   * @param {ModdleElement} di\n   * @param {Element} element\n   *\n   * @return {Rect}\n   */\n  function getExternalLabelBounds(di, element) {\n\n    var mid,\n        size,\n        bounds,\n        label = di.label;\n\n    if (label && label.bounds) {\n      bounds = label.bounds;\n\n      size = {\n        width: Math.max(DEFAULT_LABEL_SIZE$1.width, bounds.width),\n        height: bounds.height\n      };\n\n      mid = {\n        x: bounds.x + bounds.width / 2,\n        y: bounds.y + bounds.height / 2\n      };\n    } else {\n\n      mid = getExternalLabelMid(element);\n\n      size = DEFAULT_LABEL_SIZE$1;\n    }\n\n    return assign$1({\n      x: mid.x - size.width / 2,\n      y: mid.y - size.height / 2\n    }, size);\n  }\n\n  /**\n   * @param {ModdleElement} semantic\n   *\n   * @returns {string}\n   */\n  function getLabelAttr(semantic) {\n    if (\n      is$1(semantic, 'bpmn:FlowElement') ||\n      is$1(semantic, 'bpmn:Participant') ||\n      is$1(semantic, 'bpmn:Lane') ||\n      is$1(semantic, 'bpmn:SequenceFlow') ||\n      is$1(semantic, 'bpmn:MessageFlow') ||\n      is$1(semantic, 'bpmn:DataInput') ||\n      is$1(semantic, 'bpmn:DataOutput')\n    ) {\n      return 'name';\n    }\n\n    if (is$1(semantic, 'bpmn:TextAnnotation')) {\n      return 'text';\n    }\n\n    if (is$1(semantic, 'bpmn:Group')) {\n      return 'categoryValueRef';\n    }\n  }\n\n  /**\n   * @param {ModdleElement} semantic\n   *\n   * @returns {string}\n   */\n  function getCategoryValue(semantic) {\n    var categoryValueRef = semantic['categoryValueRef'];\n\n    if (!categoryValueRef) {\n      return '';\n    }\n\n\n    return categoryValueRef.value || '';\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {string}\n   */\n  function getLabel(element) {\n    var semantic = element.businessObject,\n        attr = getLabelAttr(semantic);\n\n    if (attr) {\n\n      if (attr === 'categoryValueRef') {\n\n        return getCategoryValue(semantic);\n      }\n\n      return semantic[attr] || '';\n    }\n  }\n\n  function ensureImported(element, target) {\n\n    if (element.ownerDocument !== target.ownerDocument) {\n      try {\n\n        // may fail on webkit\n        return target.ownerDocument.importNode(element, true);\n      } catch (e) {\n\n        // ignore\n      }\n    }\n\n    return element;\n  }\n\n  /**\n   * appendTo utility\n   */\n\n  /**\n   * Append a node to a target element and return the appended node.\n   *\n   * @param  {SVGElement} element\n   * @param  {SVGElement} target\n   *\n   * @return {SVGElement} the appended node\n   */\n  function appendTo(element, target) {\n    return target.appendChild(ensureImported(element, target));\n  }\n\n  /**\n   * append utility\n   */\n\n  /**\n   * Append a node to an element\n   *\n   * @param  {SVGElement} element\n   * @param  {SVGElement} node\n   *\n   * @return {SVGElement} the element\n   */\n  function append(target, node) {\n    appendTo(node, target);\n    return target;\n  }\n\n  /**\n   * attribute accessor utility\n   */\n\n  var LENGTH_ATTR = 2;\n\n  var CSS_PROPERTIES = {\n    'alignment-baseline': 1,\n    'baseline-shift': 1,\n    'clip': 1,\n    'clip-path': 1,\n    'clip-rule': 1,\n    'color': 1,\n    'color-interpolation': 1,\n    'color-interpolation-filters': 1,\n    'color-profile': 1,\n    'color-rendering': 1,\n    'cursor': 1,\n    'direction': 1,\n    'display': 1,\n    'dominant-baseline': 1,\n    'enable-background': 1,\n    'fill': 1,\n    'fill-opacity': 1,\n    'fill-rule': 1,\n    'filter': 1,\n    'flood-color': 1,\n    'flood-opacity': 1,\n    'font': 1,\n    'font-family': 1,\n    'font-size': LENGTH_ATTR,\n    'font-size-adjust': 1,\n    'font-stretch': 1,\n    'font-style': 1,\n    'font-variant': 1,\n    'font-weight': 1,\n    'glyph-orientation-horizontal': 1,\n    'glyph-orientation-vertical': 1,\n    'image-rendering': 1,\n    'kerning': 1,\n    'letter-spacing': 1,\n    'lighting-color': 1,\n    'marker': 1,\n    'marker-end': 1,\n    'marker-mid': 1,\n    'marker-start': 1,\n    'mask': 1,\n    'opacity': 1,\n    'overflow': 1,\n    'pointer-events': 1,\n    'shape-rendering': 1,\n    'stop-color': 1,\n    'stop-opacity': 1,\n    'stroke': 1,\n    'stroke-dasharray': 1,\n    'stroke-dashoffset': 1,\n    'stroke-linecap': 1,\n    'stroke-linejoin': 1,\n    'stroke-miterlimit': 1,\n    'stroke-opacity': 1,\n    'stroke-width': LENGTH_ATTR,\n    'text-anchor': 1,\n    'text-decoration': 1,\n    'text-rendering': 1,\n    'unicode-bidi': 1,\n    'visibility': 1,\n    'word-spacing': 1,\n    'writing-mode': 1\n  };\n\n\n  function getAttribute(node, name) {\n    if (CSS_PROPERTIES[name]) {\n      return node.style[name];\n    } else {\n      return node.getAttributeNS(null, name);\n    }\n  }\n\n  function setAttribute(node, name, value) {\n    var hyphenated = name.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n\n    var type = CSS_PROPERTIES[hyphenated];\n\n    if (type) {\n\n      // append pixel unit, unless present\n      if (type === LENGTH_ATTR && typeof value === 'number') {\n        value = String(value) + 'px';\n      }\n\n      node.style[hyphenated] = value;\n    } else {\n      node.setAttributeNS(null, name, value);\n    }\n  }\n\n  function setAttributes(node, attrs) {\n\n    var names = Object.keys(attrs), i, name;\n\n    for (i = 0, name; (name = names[i]); i++) {\n      setAttribute(node, name, attrs[name]);\n    }\n  }\n\n  /**\n   * Gets or sets raw attributes on a node.\n   *\n   * @param  {SVGElement} node\n   * @param  {Object} [attrs]\n   * @param  {String} [name]\n   * @param  {String} [value]\n   *\n   * @return {String}\n   */\n  function attr$1(node, name, value) {\n    if (typeof name === 'string') {\n      if (value !== undefined) {\n        setAttribute(node, name, value);\n      } else {\n        return getAttribute(node, name);\n      }\n    } else {\n      setAttributes(node, name);\n    }\n\n    return node;\n  }\n\n  /**\r\n   * Taken from https://github.com/component/classes\r\n   *\r\n   * Without the component bits.\r\n   */\r\n\r\n  /**\r\n   * toString reference.\r\n   */\r\n\r\n  const toString$1 = Object.prototype.toString;\r\n\r\n  /**\r\n    * Wrap `el` in a `ClassList`.\r\n    *\r\n    * @param {Element} el\r\n    * @return {ClassList}\r\n    * @api public\r\n    */\r\n\r\n  function classes$1(el) {\r\n    return new ClassList$1(el);\r\n  }\r\n\r\n  function ClassList$1(el) {\r\n    if (!el || !el.nodeType) {\r\n      throw new Error('A DOM element reference is required');\r\n    }\r\n    this.el = el;\r\n    this.list = el.classList;\r\n  }\r\n\r\n  /**\r\n    * Add class `name` if not already present.\r\n    *\r\n    * @param {String} name\r\n    * @return {ClassList}\r\n    * @api public\r\n    */\r\n\r\n  ClassList$1.prototype.add = function(name) {\r\n    this.list.add(name);\r\n    return this;\r\n  };\r\n\r\n  /**\r\n    * Remove class `name` when present, or\r\n    * pass a regular expression to remove\r\n    * any which match.\r\n    *\r\n    * @param {String|RegExp} name\r\n    * @return {ClassList}\r\n    * @api public\r\n    */\r\n\r\n  ClassList$1.prototype.remove = function(name) {\r\n    if ('[object RegExp]' == toString$1.call(name)) {\r\n      return this.removeMatching(name);\r\n    }\r\n\r\n    this.list.remove(name);\r\n    return this;\r\n  };\r\n\r\n  /**\r\n    * Remove all classes matching `re`.\r\n    *\r\n    * @param {RegExp} re\r\n    * @return {ClassList}\r\n    * @api private\r\n    */\r\n\r\n  ClassList$1.prototype.removeMatching = function(re) {\r\n    const arr = this.array();\r\n    for (let i = 0; i < arr.length; i++) {\r\n      if (re.test(arr[i])) {\r\n        this.remove(arr[i]);\r\n      }\r\n    }\r\n    return this;\r\n  };\r\n\r\n  /**\r\n    * Toggle class `name`, can force state via `force`.\r\n    *\r\n    * For browsers that support classList, but do not support `force` yet,\r\n    * the mistake will be detected and corrected.\r\n    *\r\n    * @param {String} name\r\n    * @param {Boolean} force\r\n    * @return {ClassList}\r\n    * @api public\r\n    */\r\n\r\n  ClassList$1.prototype.toggle = function(name, force) {\r\n    if ('undefined' !== typeof force) {\r\n      if (force !== this.list.toggle(name, force)) {\r\n        this.list.toggle(name); // toggle again to correct\r\n      }\r\n    } else {\r\n      this.list.toggle(name);\r\n    }\r\n    return this;\r\n  };\r\n\r\n  /**\r\n    * Return an array of classes.\r\n    *\r\n    * @return {Array}\r\n    * @api public\r\n    */\r\n\r\n  ClassList$1.prototype.array = function() {\r\n    return Array.from(this.list);\r\n  };\r\n\r\n  /**\r\n    * Check if class `name` is present.\r\n    *\r\n    * @param {String} name\r\n    * @return {ClassList}\r\n    * @api public\r\n    */\r\n\r\n  ClassList$1.prototype.has =\r\n   ClassList$1.prototype.contains = function(name) {\r\n     return this.list.contains(name);\r\n   };\n\n  function remove$2(element) {\n    var parent = element.parentNode;\n\n    if (parent) {\n      parent.removeChild(element);\n    }\n\n    return element;\n  }\n\n  /**\n   * Clear utility\n   */\n\n  /**\n   * Removes all children from the given element\n   *\n   * @param  {DOMElement} element\n   * @return {DOMElement} the element (for chaining)\n   */\n  function clear$1(element) {\n    var child;\n\n    while ((child = element.firstChild)) {\n      remove$2(child);\n    }\n\n    return element;\n  }\n\n  var ns = {\n    svg: 'http://www.w3.org/2000/svg'\n  };\n\n  /**\n   * DOM parsing utility\n   */\n\n  var SVG_START = '<svg xmlns=\"' + ns.svg + '\"';\n\n  function parse$1(svg) {\n\n    var unwrap = false;\n\n    // ensure we import a valid svg document\n    if (svg.substring(0, 4) === '<svg') {\n      if (svg.indexOf(ns.svg) === -1) {\n        svg = SVG_START + svg.substring(4);\n      }\n    } else {\n\n      // namespace svg\n      svg = SVG_START + '>' + svg + '</svg>';\n      unwrap = true;\n    }\n\n    var parsed = parseDocument(svg);\n\n    if (!unwrap) {\n      return parsed;\n    }\n\n    var fragment = document.createDocumentFragment();\n\n    var parent = parsed.firstChild;\n\n    while (parent.firstChild) {\n      fragment.appendChild(parent.firstChild);\n    }\n\n    return fragment;\n  }\n\n  function parseDocument(svg) {\n\n    var parser;\n\n    // parse\n    parser = new DOMParser();\n    parser.async = false;\n\n    return parser.parseFromString(svg, 'text/xml');\n  }\n\n  /**\n   * Create utility for SVG elements\n   */\n\n\n  /**\n   * Create a specific type from name or SVG markup.\n   *\n   * @param {String} name the name or markup of the element\n   * @param {Object} [attrs] attributes to set on the element\n   *\n   * @returns {SVGElement}\n   */\n  function create$1(name, attrs) {\n    var element;\n\n    if (name.charAt(0) === '<') {\n      element = parse$1(name).firstChild;\n      element = document.importNode(element, true);\n    } else {\n      element = document.createElementNS(ns.svg, name);\n    }\n\n    if (attrs) {\n      attr$1(element, attrs);\n    }\n\n    return element;\n  }\n\n  /**\n   * Geometry helpers\n   */\n\n  // fake node used to instantiate svg geometry elements\n  var node = null;\n\n  function getNode() {\n    if (node === null) {\n      node = create$1('svg');\n    }\n\n    return node;\n  }\n\n  function extend$1(object, props) {\n    var i, k, keys = Object.keys(props);\n\n    for (i = 0; (k = keys[i]); i++) {\n      object[k] = props[k];\n    }\n\n    return object;\n  }\n\n  /**\n   * Create matrix via args.\n   *\n   * @example\n   *\n   * createMatrix({ a: 1, b: 1 });\n   * createMatrix();\n   * createMatrix(1, 2, 0, 0, 30, 20);\n   *\n   * @return {SVGMatrix}\n   */\n  function createMatrix(a, b, c, d, e, f) {\n    var matrix = getNode().createSVGMatrix();\n\n    switch (arguments.length) {\n    case 0:\n      return matrix;\n    case 1:\n      return extend$1(matrix, a);\n    case 6:\n      return extend$1(matrix, {\n        a: a,\n        b: b,\n        c: c,\n        d: d,\n        e: e,\n        f: f\n      });\n    }\n  }\n\n  function createTransform(matrix) {\n    if (matrix) {\n      return getNode().createSVGTransformFromMatrix(matrix);\n    } else {\n      return getNode().createSVGTransform();\n    }\n  }\n\n  /**\n   * Serialization util\n   */\n\n  var TEXT_ENTITIES = /([&<>]{1})/g;\n  var ATTR_ENTITIES = /([\\n\\r\"]{1})/g;\n\n  var ENTITY_REPLACEMENT = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '\\''\n  };\n\n  function escape$1(str, pattern) {\n\n    function replaceFn(match, entity) {\n      return ENTITY_REPLACEMENT[entity] || entity;\n    }\n\n    return str.replace(pattern, replaceFn);\n  }\n\n  function serialize(node, output) {\n\n    var i, len, attrMap, attrNode, childNodes;\n\n    switch (node.nodeType) {\n\n    // TEXT\n    case 3:\n\n      // replace special XML characters\n      output.push(escape$1(node.textContent, TEXT_ENTITIES));\n      break;\n\n    // ELEMENT\n    case 1:\n      output.push('<', node.tagName);\n\n      if (node.hasAttributes()) {\n        attrMap = node.attributes;\n        for (i = 0, len = attrMap.length; i < len; ++i) {\n          attrNode = attrMap.item(i);\n          output.push(' ', attrNode.name, '=\"', escape$1(attrNode.value, ATTR_ENTITIES), '\"');\n        }\n      }\n\n      if (node.hasChildNodes()) {\n        output.push('>');\n        childNodes = node.childNodes;\n        for (i = 0, len = childNodes.length; i < len; ++i) {\n          serialize(childNodes.item(i), output);\n        }\n        output.push('</', node.tagName, '>');\n      } else {\n        output.push('/>');\n      }\n      break;\n\n    // COMMENT\n    case 8:\n      output.push('<!--', escape$1(node.nodeValue, TEXT_ENTITIES), '-->');\n      break;\n\n    // CDATA\n    case 4:\n      output.push('<![CDATA[', node.nodeValue, ']]>');\n      break;\n\n    default:\n      throw new Error('unable to handle node ' + node.nodeType);\n    }\n\n    return output;\n  }\n\n  /**\n   * innerHTML like functionality for SVG elements.\n   * based on innerSVG (https://code.google.com/p/innersvg)\n   */\n\n\n  function set(element, svg) {\n\n    var parsed = parse$1(svg);\n\n    // clear element contents\n    clear$1(element);\n\n    if (!svg) {\n      return;\n    }\n\n    if (!isFragment(parsed)) {\n\n      // extract <svg> from parsed document\n      parsed = parsed.documentElement;\n    }\n\n    var nodes = slice$1(parsed.childNodes);\n\n    // import + append each node\n    for (var i = 0; i < nodes.length; i++) {\n      appendTo(nodes[i], element);\n    }\n\n  }\n\n  function get(element) {\n    var child = element.firstChild,\n        output = [];\n\n    while (child) {\n      serialize(child, output);\n      child = child.nextSibling;\n    }\n\n    return output.join('');\n  }\n\n  function isFragment(node) {\n    return node.nodeName === '#document-fragment';\n  }\n\n  function innerSVG(element, svg) {\n\n    if (svg !== undefined) {\n\n      try {\n        set(element, svg);\n      } catch (e) {\n        throw new Error('error parsing SVG: ' + e.message);\n      }\n\n      return element;\n    } else {\n      return get(element);\n    }\n  }\n\n\n  function slice$1(arr) {\n    return Array.prototype.slice.call(arr);\n  }\n\n  /**\n   * transform accessor utility\n   */\n\n  function wrapMatrix(transformList, transform) {\n    if (transform instanceof SVGMatrix) {\n      return transformList.createSVGTransformFromMatrix(transform);\n    }\n\n    return transform;\n  }\n\n\n  function setTransforms(transformList, transforms) {\n    var i, t;\n\n    transformList.clear();\n\n    for (i = 0; (t = transforms[i]); i++) {\n      transformList.appendItem(wrapMatrix(transformList, t));\n    }\n  }\n\n  /**\n   * Get or set the transforms on the given node.\n   *\n   * @param {SVGElement} node\n   * @param  {SVGTransform|SVGMatrix|Array<SVGTransform|SVGMatrix>} [transforms]\n   *\n   * @return {SVGTransform} the consolidated transform\n   */\n  function transform$1(node, transforms) {\n    var transformList = node.transform.baseVal;\n\n    if (transforms) {\n\n      if (!Array.isArray(transforms)) {\n        transforms = [ transforms ];\n      }\n\n      setTransforms(transformList, transforms);\n    }\n\n    return transformList.consolidate();\n  }\n\n  /**\n   * @typedef {(string|number)[]} Component\n   *\n   * @typedef {import('../util/Types').Point} Point\n   */\n\n  /**\n   * @param {Component[] | Component[][]} elements\n   *\n   * @return {string}\n   */\n  function componentsToPath(elements) {\n    return elements.flat().join(',').replace(/,?([A-z]),?/g, '$1');\n  }\n\n  /**\n   * @param {Point} point\n   *\n   * @return {Component[]}\n   */\n  function move(point) {\n    return [ 'M', point.x, point.y ];\n  }\n\n  /**\n   * @param {Point} point\n   *\n   * @return {Component[]}\n   */\n  function lineTo(point) {\n    return [ 'L', point.x, point.y ];\n  }\n\n  /**\n   * @param {Point} p1\n   * @param {Point} p2\n   * @param {Point} p3\n   *\n   * @return {Component[]}\n   */\n  function curveTo(p1, p2, p3) {\n    return [ 'C', p1.x, p1.y, p2.x, p2.y, p3.x, p3.y ];\n  }\n\n  /**\n   * @param {Point[]} waypoints\n   * @param {number} [cornerRadius]\n   * @return {Component[][]}\n   */\n  function drawPath(waypoints, cornerRadius) {\n    const pointCount = waypoints.length;\n\n    const path = [ move(waypoints[0]) ];\n\n    for (let i = 1; i < pointCount; i++) {\n\n      const pointBefore = waypoints[i - 1];\n      const point = waypoints[i];\n      const pointAfter = waypoints[i + 1];\n\n      if (!pointAfter || !cornerRadius) {\n        path.push(lineTo(point));\n\n        continue;\n      }\n\n      const effectiveRadius = Math.min(\n        cornerRadius,\n        vectorLength(point.x - pointBefore.x, point.y - pointBefore.y),\n        vectorLength(pointAfter.x - point.x, pointAfter.y - point.y)\n      );\n\n      if (!effectiveRadius) {\n        path.push(lineTo(point));\n\n        continue;\n      }\n\n      const beforePoint = getPointAtLength(point, pointBefore, effectiveRadius);\n      const beforePoint2 = getPointAtLength(point, pointBefore, effectiveRadius * .5);\n\n      const afterPoint = getPointAtLength(point, pointAfter, effectiveRadius);\n      const afterPoint2 = getPointAtLength(point, pointAfter, effectiveRadius * .5);\n\n      path.push(lineTo(beforePoint));\n      path.push(curveTo(beforePoint2, afterPoint2, afterPoint));\n    }\n\n    return path;\n  }\n\n  function getPointAtLength(start, end, length) {\n\n    const deltaX = end.x - start.x;\n    const deltaY = end.y - start.y;\n\n    const totalLength = vectorLength(deltaX, deltaY);\n\n    const percent = length / totalLength;\n\n    return {\n      x: start.x + deltaX * percent,\n      y: start.y + deltaY * percent\n    };\n  }\n\n  function vectorLength(x, y) {\n    return Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));\n  }\n\n  /**\n   * @param {Point[]} points\n   * @param {number|Object} [attrs]\n   * @param {number} [radius]\n   *\n   * @return {SVGElement}\n   */\n  function createLine(points, attrs, radius) {\n\n    if (isNumber(attrs)) {\n      radius = attrs;\n      attrs = null;\n    }\n\n    if (!attrs) {\n      attrs = {};\n    }\n\n    const line = create$1('path', attrs);\n\n    if (isNumber(radius)) {\n      line.dataset.cornerRadius = String(radius);\n    }\n\n    return updateLine(line, points);\n  }\n\n  /**\n   * @param {SVGElement} gfx\n   * @param {Point[]} points\n   *\n   * @return {SVGElement}\n   */\n  function updateLine(gfx, points) {\n\n    const cornerRadius = parseInt(gfx.dataset.cornerRadius, 10) || 0;\n\n    attr$1(gfx, {\n      d: componentsToPath(drawPath(points, cornerRadius))\n    });\n\n    return gfx;\n  }\n\n  var black = 'hsl(225, 10%, 15%)';\n\n  // element utils //////////////////////\n\n  /**\n   * Checks if eventDefinition of the given element matches with semantic type.\n   *\n   * @param {ModdleElement} event\n   * @param {string} eventDefinitionType\n   *\n   * @return {boolean}\n   */\n  function isTypedEvent(event, eventDefinitionType) {\n    return some(event.eventDefinitions, function(definition) {\n      return definition.$type === eventDefinitionType;\n    });\n  }\n\n  /**\n   * Check if element is a throw event.\n   *\n   * @param {ModdleElement} event\n   *\n   * @return {boolean}\n   */\n  function isThrowEvent(event) {\n    return (event.$type === 'bpmn:IntermediateThrowEvent') || (event.$type === 'bpmn:EndEvent');\n  }\n\n  /**\n   * Check if element is a throw event.\n   *\n   * @param {ModdleElement} element\n   *\n   * @return {boolean}\n   */\n  function isCollection(element) {\n    var dataObject = element.dataObjectRef;\n\n    return element.isCollection || (dataObject && dataObject.isCollection);\n  }\n\n\n  // color access //////////////////////\n\n  /**\n   * @param {Element} element\n   * @param {string} [defaultColor]\n   *\n   * @return {string}\n   */\n  function getFillColor(element, defaultColor) {\n    var di = getDi(element);\n\n    return di.get('color:background-color') || di.get('bioc:fill') || defaultColor || 'white';\n  }\n\n  /**\n   * @param {Element} element\n   * @param {string} [defaultColor]\n   *\n   * @return {string}\n   */\n  function getStrokeColor(element, defaultColor) {\n    var di = getDi(element);\n\n    return di.get('color:border-color') || di.get('bioc:stroke') || defaultColor || black;\n  }\n\n  /**\n   * @param {Element} element\n   * @param {string} [defaultColor]\n   * @param {string} [defaultStrokeColor]\n   *\n   * @return {string}\n   */\n  function getLabelColor(element, defaultColor, defaultStrokeColor) {\n    var di = getDi(element),\n        label = di.get('label');\n\n    return label && label.get('color:color') || defaultColor ||\n      getStrokeColor(element, defaultStrokeColor);\n  }\n\n  // cropping path customizations //////////////////////\n\n  /**\n   * @param {ShapeLike} shape\n   *\n   * @return {string} path\n   */\n  function getCirclePath(shape) {\n\n    var cx = shape.x + shape.width / 2,\n        cy = shape.y + shape.height / 2,\n        radius = shape.width / 2;\n\n    var circlePath = [\n      [ 'M', cx, cy ],\n      [ 'm', 0, -radius ],\n      [ 'a', radius, radius, 0, 1, 1, 0, 2 * radius ],\n      [ 'a', radius, radius, 0, 1, 1, 0, -2 * radius ],\n      [ 'z' ]\n    ];\n\n    return componentsToPath(circlePath);\n  }\n\n  /**\n   * @param {ShapeLike} shape\n   * @param {number} [borderRadius]\n   *\n   * @return {string} path\n   */\n  function getRoundRectPath(shape, borderRadius) {\n\n    var x = shape.x,\n        y = shape.y,\n        width = shape.width,\n        height = shape.height;\n\n    var roundRectPath = [\n      [ 'M', x + borderRadius, y ],\n      [ 'l', width - borderRadius * 2, 0 ],\n      [ 'a', borderRadius, borderRadius, 0, 0, 1, borderRadius, borderRadius ],\n      [ 'l', 0, height - borderRadius * 2 ],\n      [ 'a', borderRadius, borderRadius, 0, 0, 1, -borderRadius, borderRadius ],\n      [ 'l', borderRadius * 2 - width, 0 ],\n      [ 'a', borderRadius, borderRadius, 0, 0, 1, -borderRadius, -borderRadius ],\n      [ 'l', 0, borderRadius * 2 - height ],\n      [ 'a', borderRadius, borderRadius, 0, 0, 1, borderRadius, -borderRadius ],\n      [ 'z' ]\n    ];\n\n    return componentsToPath(roundRectPath);\n  }\n\n  /**\n   * @param {ShapeLike} shape\n   *\n   * @return {string} path\n   */\n  function getDiamondPath(shape) {\n\n    var width = shape.width,\n        height = shape.height,\n        x = shape.x,\n        y = shape.y,\n        halfWidth = width / 2,\n        halfHeight = height / 2;\n\n    var diamondPath = [\n      [ 'M', x + halfWidth, y ],\n      [ 'l', halfWidth, halfHeight ],\n      [ 'l', -halfWidth, halfHeight ],\n      [ 'l', -halfWidth, -halfHeight ],\n      [ 'z' ]\n    ];\n\n    return componentsToPath(diamondPath);\n  }\n\n  /**\n   * @param {ShapeLike} shape\n   *\n   * @return {string} path\n   */\n  function getRectPath(shape) {\n    var x = shape.x,\n        y = shape.y,\n        width = shape.width,\n        height = shape.height;\n\n    var rectPath = [\n      [ 'M', x, y ],\n      [ 'l', width, 0 ],\n      [ 'l', 0, height ],\n      [ 'l', -width, 0 ],\n      [ 'z' ]\n    ];\n\n    return componentsToPath(rectPath);\n  }\n\n  function _mergeNamespaces$1(n, m) {\n    m.forEach(function (e) {\n      e && typeof e !== 'string' && !Array.isArray(e) && Object.keys(e).forEach(function (k) {\n        if (k !== 'default' && !(k in n)) {\n          var d = Object.getOwnPropertyDescriptor(e, k);\n          Object.defineProperty(n, k, d.get ? d : {\n            enumerable: true,\n            get: function () { return e[k]; }\n          });\n        }\n      });\n    });\n    return Object.freeze(n);\n  }\n\n  /**\n   * Flatten array, one level deep.\n   *\n   * @param {Array<?>} arr\n   *\n   * @return {Array<?>}\n   */\n\n  const nativeToString = Object.prototype.toString;\n  const nativeHasOwnProperty = Object.prototype.hasOwnProperty;\n\n  function isUndefined$1(obj) {\n    return obj === undefined;\n  }\n\n  function isArray$1(obj) {\n    return nativeToString.call(obj) === '[object Array]';\n  }\n\n  /**\n   * Return true, if target owns a property with the given key.\n   *\n   * @param {Object} target\n   * @param {String} key\n   *\n   * @return {Boolean}\n   */\n  function has(target, key) {\n    return nativeHasOwnProperty.call(target, key);\n  }\n\n\n  /**\n   * Iterate over collection; returning something\n   * (non-undefined) will stop iteration.\n   *\n   * @param  {Array|Object} collection\n   * @param  {Function} iterator\n   *\n   * @return {Object} return result that stopped the iteration\n   */\n  function forEach(collection, iterator) {\n\n    let val,\n        result;\n\n    if (isUndefined$1(collection)) {\n      return;\n    }\n\n    const convertKey = isArray$1(collection) ? toNum : identity;\n\n    for (let key in collection) {\n\n      if (has(collection, key)) {\n        val = collection[key];\n\n        result = iterator(val, convertKey(key));\n\n        if (result === false) {\n          return val;\n        }\n      }\n    }\n  }\n\n\n  function identity(arg) {\n    return arg;\n  }\n\n  function toNum(arg) {\n    return Number(arg);\n  }\n\n  /**\n   * Assigns style attributes in a style-src compliant way.\n   *\n   * @param {Element} element\n   * @param {...Object} styleSources\n   *\n   * @return {Element} the element\n   */\n  function assign(element, ...styleSources) {\n    const target = element.style;\n\n    forEach(styleSources, function(style) {\n      if (!style) {\n        return;\n      }\n\n      forEach(style, function(value, key) {\n        target[key] = value;\n      });\n    });\n\n    return element;\n  }\n\n  /**\n   * Set attribute `name` to `val`, or get attr `name`.\n   *\n   * @param {Element} el\n   * @param {String} name\n   * @param {String} [val]\n   * @api public\n   */\n  function attr(el, name, val) {\n\n    // get\n    if (arguments.length == 2) {\n      return el.getAttribute(name);\n    }\n\n    // remove\n    if (val === null) {\n      return el.removeAttribute(name);\n    }\n\n    // set\n    el.setAttribute(name, val);\n\n    return el;\n  }\n\n  /**\n   * Taken from https://github.com/component/classes\n   *\n   * Without the component bits.\n   */\n\n  /**\n   * toString reference.\n   */\n\n  const toString = Object.prototype.toString;\n\n  /**\n   * Wrap `el` in a `ClassList`.\n   *\n   * @param {Element} el\n   * @return {ClassList}\n   * @api public\n   */\n\n  function classes(el) {\n    return new ClassList(el);\n  }\n\n  /**\n   * Initialize a new ClassList for `el`.\n   *\n   * @param {Element} el\n   * @api private\n   */\n\n  function ClassList(el) {\n    if (!el || !el.nodeType) {\n      throw new Error('A DOM element reference is required');\n    }\n    this.el = el;\n    this.list = el.classList;\n  }\n\n  /**\n   * Add class `name` if not already present.\n   *\n   * @param {String} name\n   * @return {ClassList}\n   * @api public\n   */\n\n  ClassList.prototype.add = function(name) {\n    this.list.add(name);\n    return this;\n  };\n\n  /**\n   * Remove class `name` when present, or\n   * pass a regular expression to remove\n   * any which match.\n   *\n   * @param {String|RegExp} name\n   * @return {ClassList}\n   * @api public\n   */\n\n  ClassList.prototype.remove = function(name) {\n    if ('[object RegExp]' == toString.call(name)) {\n      return this.removeMatching(name);\n    }\n\n    this.list.remove(name);\n    return this;\n  };\n\n  /**\n   * Remove all classes matching `re`.\n   *\n   * @param {RegExp} re\n   * @return {ClassList}\n   * @api private\n   */\n\n  ClassList.prototype.removeMatching = function(re) {\n    const arr = this.array();\n    for (let i = 0; i < arr.length; i++) {\n      if (re.test(arr[i])) {\n        this.remove(arr[i]);\n      }\n    }\n    return this;\n  };\n\n  /**\n   * Toggle class `name`, can force state via `force`.\n   *\n   * For browsers that support classList, but do not support `force` yet,\n   * the mistake will be detected and corrected.\n   *\n   * @param {String} name\n   * @param {Boolean} force\n   * @return {ClassList}\n   * @api public\n   */\n\n  ClassList.prototype.toggle = function(name, force) {\n    if ('undefined' !== typeof force) {\n      if (force !== this.list.toggle(name, force)) {\n        this.list.toggle(name); // toggle again to correct\n      }\n    } else {\n      this.list.toggle(name);\n    }\n    return this;\n  };\n\n  /**\n   * Return an array of classes.\n   *\n   * @return {Array}\n   * @api public\n   */\n\n  ClassList.prototype.array = function() {\n    return Array.from(this.list);\n  };\n\n  /**\n   * Check if class `name` is present.\n   *\n   * @param {String} name\n   * @return {ClassList}\n   * @api public\n   */\n\n  ClassList.prototype.has =\n  ClassList.prototype.contains = function(name) {\n    return this.list.contains(name);\n  };\n\n  /**\n   * Remove all children from the given element.\n   */\n  function clear(el) {\n\n    var c;\n\n    while (el.childNodes.length) {\n      c = el.childNodes[0];\n      el.removeChild(c);\n    }\n\n    return el;\n  }\n\n  /**\n   * @param { HTMLElement } element\n   * @param { String } selector\n   *\n   * @return { boolean }\n   */\n  function matches(element, selector) {\n    return element && typeof element.matches === 'function' && element.matches(selector);\n  }\n\n  /**\n   * Closest\n   *\n   * @param {Element} el\n   * @param {String} selector\n   * @param {Boolean} checkYourSelf (optional)\n   */\n  function closest(element, selector, checkYourSelf) {\n    var currentElem = checkYourSelf ? element : element.parentNode;\n\n    while (currentElem && currentElem.nodeType !== document.DOCUMENT_NODE &&\n        currentElem.nodeType !== document.DOCUMENT_FRAGMENT_NODE) {\n\n      if (matches(currentElem, selector)) {\n        return currentElem;\n      }\n\n      currentElem = currentElem.parentNode;\n    }\n\n    return matches(currentElem, selector) ? currentElem : null;\n  }\n\n  var componentEvent = {};\n\n  var bind$1, unbind$1, prefix$6;\n\n  function detect () {\n    bind$1 = window.addEventListener ? 'addEventListener' : 'attachEvent';\n    unbind$1 = window.removeEventListener ? 'removeEventListener' : 'detachEvent';\n    prefix$6 = bind$1 !== 'addEventListener' ? 'on' : '';\n  }\n\n  /**\n   * Bind `el` event `type` to `fn`.\n   *\n   * @param {Element} el\n   * @param {String} type\n   * @param {Function} fn\n   * @param {Boolean} capture\n   * @return {Function}\n   * @api public\n   */\n\n  var bind_1 = componentEvent.bind = function(el, type, fn, capture){\n    if (!bind$1) detect();\n    el[bind$1](prefix$6 + type, fn, capture || false);\n    return fn;\n  };\n\n  /**\n   * Unbind `el` event `type`'s callback `fn`.\n   *\n   * @param {Element} el\n   * @param {String} type\n   * @param {Function} fn\n   * @param {Boolean} capture\n   * @return {Function}\n   * @api public\n   */\n\n  var unbind_1 = componentEvent.unbind = function(el, type, fn, capture){\n    if (!unbind$1) detect();\n    el[unbind$1](prefix$6 + type, fn, capture || false);\n    return fn;\n  };\n\n  var event = /*#__PURE__*/_mergeNamespaces$1({\n    __proto__: null,\n    bind: bind_1,\n    unbind: unbind_1,\n    'default': componentEvent\n  }, [componentEvent]);\n\n  /**\n   * Module dependencies.\n   */\n\n  /**\n   * Delegate event `type` to `selector`\n   * and invoke `fn(e)`. A callback function\n   * is returned which may be passed to `.unbind()`.\n   *\n   * @param {Element} el\n   * @param {String} selector\n   * @param {String} type\n   * @param {Function} fn\n   * @param {Boolean} capture\n   * @return {Function}\n   * @api public\n   */\n\n  // Some events don't bubble, so we want to bind to the capture phase instead\n  // when delegating.\n  var forceCaptureEvents = [ 'focus', 'blur' ];\n\n  function bind(el, selector, type, fn, capture) {\n    if (forceCaptureEvents.indexOf(type) !== -1) {\n      capture = true;\n    }\n\n    return event.bind(el, type, function(e) {\n      var target = e.target || e.srcElement;\n      e.delegateTarget = closest(target, selector, true);\n      if (e.delegateTarget) {\n        fn.call(el, e);\n      }\n    }, capture);\n  }\n\n  /**\n   * Unbind event `type`'s callback `fn`.\n   *\n   * @param {Element} el\n   * @param {String} type\n   * @param {Function} fn\n   * @param {Boolean} capture\n   * @api public\n   */\n  function unbind(el, type, fn, capture) {\n    if (forceCaptureEvents.indexOf(type) !== -1) {\n      capture = true;\n    }\n\n    return event.unbind(el, type, fn, capture);\n  }\n\n  var delegate = {\n    bind,\n    unbind\n  };\n\n  /**\n   * Expose `parse`.\n   */\n\n  var domify = parse;\n\n  /**\n   * Tests for browser support.\n   */\n\n  var innerHTMLBug = false;\n  var bugTestDiv;\n  if (typeof document !== 'undefined') {\n    bugTestDiv = document.createElement('div');\n    // Setup\n    bugTestDiv.innerHTML = '  <link/><table></table><a href=\"/a\">a</a><input type=\"checkbox\"/>';\n    // Make sure that link elements get serialized correctly by innerHTML\n    // This requires a wrapper element in IE\n    innerHTMLBug = !bugTestDiv.getElementsByTagName('link').length;\n    bugTestDiv = undefined;\n  }\n\n  /**\n   * Wrap map from jquery.\n   */\n\n  var map = {\n    legend: [1, '<fieldset>', '</fieldset>'],\n    tr: [2, '<table><tbody>', '</tbody></table>'],\n    col: [2, '<table><tbody></tbody><colgroup>', '</colgroup></table>'],\n    // for script/link/style tags to work in IE6-8, you have to wrap\n    // in a div with a non-whitespace character in front, ha!\n    _default: innerHTMLBug ? [1, 'X<div>', '</div>'] : [0, '', '']\n  };\n\n  map.td =\n  map.th = [3, '<table><tbody><tr>', '</tr></tbody></table>'];\n\n  map.option =\n  map.optgroup = [1, '<select multiple=\"multiple\">', '</select>'];\n\n  map.thead =\n  map.tbody =\n  map.colgroup =\n  map.caption =\n  map.tfoot = [1, '<table>', '</table>'];\n\n  map.polyline =\n  map.ellipse =\n  map.polygon =\n  map.circle =\n  map.text =\n  map.line =\n  map.path =\n  map.rect =\n  map.g = [1, '<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\">','</svg>'];\n\n  /**\n   * Parse `html` and return a DOM Node instance, which could be a TextNode,\n   * HTML DOM Node of some kind (<div> for example), or a DocumentFragment\n   * instance, depending on the contents of the `html` string.\n   *\n   * @param {String} html - HTML string to \"domify\"\n   * @param {Document} doc - The `document` instance to create the Node for\n   * @return {DOMNode} the TextNode, DOM Node, or DocumentFragment instance\n   * @api private\n   */\n\n  function parse(html, doc) {\n    if ('string' != typeof html) throw new TypeError('String expected');\n\n    // default to the global `document` object\n    if (!doc) doc = document;\n\n    // tag name\n    var m = /<([\\w:]+)/.exec(html);\n    if (!m) return doc.createTextNode(html);\n\n    html = html.replace(/^\\s+|\\s+$/g, ''); // Remove leading/trailing whitespace\n\n    var tag = m[1];\n\n    // body support\n    if (tag == 'body') {\n      var el = doc.createElement('html');\n      el.innerHTML = html;\n      return el.removeChild(el.lastChild);\n    }\n\n    // wrap map\n    var wrap = Object.prototype.hasOwnProperty.call(map, tag) ? map[tag] : map._default;\n    var depth = wrap[0];\n    var prefix = wrap[1];\n    var suffix = wrap[2];\n    var el = doc.createElement('div');\n    el.innerHTML = prefix + html + suffix;\n    while (depth--) el = el.lastChild;\n\n    // one element\n    if (el.firstChild == el.lastChild) {\n      return el.removeChild(el.firstChild);\n    }\n\n    // several elements\n    var fragment = doc.createDocumentFragment();\n    while (el.firstChild) {\n      fragment.appendChild(el.removeChild(el.firstChild));\n    }\n\n    return fragment;\n  }\n\n  var domify$1 = domify;\n\n  function query(selector, el) {\n    el = el || document;\n\n    return el.querySelector(selector);\n  }\n\n  function all(selector, el) {\n    el = el || document;\n\n    return el.querySelectorAll(selector);\n  }\n\n  function remove$1(el) {\n    el.parentNode && el.parentNode.removeChild(el);\n  }\n\n  /**\r\n   * @param {SVGElement} gfx\r\n   * @param {number} x\r\n   * @param {number} y\r\n   * @param {number} [angle]\r\n   * @param {number} [amount]\r\n   */\r\n  function transform(gfx, x, y, angle, amount) {\r\n    var translate = createTransform();\r\n    translate.setTranslate(x, y);\r\n\r\n    var rotate = createTransform();\r\n    rotate.setRotate(angle || 0, 0, 0);\r\n\r\n    var scale = createTransform();\r\n    scale.setScale(amount || 1, amount || 1);\r\n\r\n    transform$1(gfx, [ translate, rotate, scale ]);\r\n  }\r\n\r\n\r\n  /**\r\n   * @param {SVGElement} gfx\r\n   * @param {number} x\r\n   * @param {number} y\r\n   */\r\n  function translate$1(gfx, x, y) {\r\n    var translate = createTransform();\r\n    translate.setTranslate(x, y);\r\n\r\n    transform$1(gfx, translate);\r\n  }\r\n\r\n\r\n  /**\r\n   * @param {SVGElement} gfx\r\n   * @param {number} angle\r\n   */\r\n  function rotate(gfx, angle) {\r\n    var rotate = createTransform();\r\n    rotate.setRotate(angle, 0, 0);\r\n\r\n    transform$1(gfx, rotate);\r\n  }\n\n  function createCommonjsModule(fn, module) {\n  \treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n  }\n\n  var hat_1 = createCommonjsModule(function (module) {\n  var hat = module.exports = function (bits, base) {\n      if (!base) base = 16;\n      if (bits === undefined) bits = 128;\n      if (bits <= 0) return '0';\n      \n      var digits = Math.log(Math.pow(2, bits)) / Math.log(base);\n      for (var i = 2; digits === Infinity; i *= 2) {\n          digits = Math.log(Math.pow(2, bits / i)) / Math.log(base) * i;\n      }\n      \n      var rem = digits - Math.floor(digits);\n      \n      var res = '';\n      \n      for (var i = 0; i < Math.floor(digits); i++) {\n          var x = Math.floor(Math.random() * base).toString(base);\n          res = x + res;\n      }\n      \n      if (rem) {\n          var b = Math.pow(base, rem);\n          var x = Math.floor(Math.random() * b).toString(base);\n          res = x + res;\n      }\n      \n      var parsed = parseInt(res, base);\n      if (parsed !== Infinity && parsed >= Math.pow(2, bits)) {\n          return hat(bits, base)\n      }\n      else return res;\n  };\n\n  hat.rack = function (bits, base, expandBy) {\n      var fn = function (data) {\n          var iters = 0;\n          do {\n              if (iters ++ > 10) {\n                  if (expandBy) bits += expandBy;\n                  else throw new Error('too many ID collisions, use more bits')\n              }\n              \n              var id = hat(bits, base);\n          } while (Object.hasOwnProperty.call(hats, id));\n          \n          hats[id] = data;\n          return id;\n      };\n      var hats = fn.hats = {};\n      \n      fn.get = function (id) {\n          return fn.hats[id];\n      };\n      \n      fn.set = function (id, value) {\n          fn.hats[id] = value;\n          return fn;\n      };\n      \n      fn.bits = bits || 128;\n      fn.base = base || 16;\n      return fn;\n  };\n  });\n\n  /**\n   * Create a new id generator / cache instance.\n   *\n   * You may optionally provide a seed that is used internally.\n   *\n   * @param {Seed} seed\n   */\n\n  function Ids(seed) {\n    if (!(this instanceof Ids)) {\n      return new Ids(seed);\n    }\n\n    seed = seed || [128, 36, 1];\n    this._seed = seed.length ? hat_1.rack(seed[0], seed[1], seed[2]) : seed;\n  }\n  /**\n   * Generate a next id.\n   *\n   * @param {Object} [element] element to bind the id to\n   *\n   * @return {String} id\n   */\n\n  Ids.prototype.next = function (element) {\n    return this._seed(element || true);\n  };\n  /**\n   * Generate a next id with a given prefix.\n   *\n   * @param {Object} [element] element to bind the id to\n   *\n   * @return {String} id\n   */\n\n\n  Ids.prototype.nextPrefixed = function (prefix, element) {\n    var id;\n\n    do {\n      id = prefix + this.next(true);\n    } while (this.assigned(id)); // claim {prefix}{random}\n\n\n    this.claim(id, element); // return\n\n    return id;\n  };\n  /**\n   * Manually claim an existing id.\n   *\n   * @param {String} id\n   * @param {String} [element] element the id is claimed by\n   */\n\n\n  Ids.prototype.claim = function (id, element) {\n    this._seed.set(id, element || true);\n  };\n  /**\n   * Returns true if the given id has already been assigned.\n   *\n   * @param  {String} id\n   * @return {Boolean}\n   */\n\n\n  Ids.prototype.assigned = function (id) {\n    return this._seed.get(id) || false;\n  };\n  /**\n   * Unclaim an id.\n   *\n   * @param  {String} id the id to unclaim\n   */\n\n\n  Ids.prototype.unclaim = function (id) {\n    delete this._seed.hats[id];\n  };\n  /**\n   * Clear all claimed ids.\n   */\n\n\n  Ids.prototype.clear = function () {\n    var hats = this._seed.hats,\n        id;\n\n    for (id in hats) {\n      this.unclaim(id);\n    }\n  };\n\n  var RENDERER_IDS = new Ids();\n\n  var TASK_BORDER_RADIUS = 10;\n  var INNER_OUTER_DIST = 3;\n\n  var DEFAULT_FILL_OPACITY = .95,\n      HIGH_FILL_OPACITY = .35;\n\n  var ELEMENT_LABEL_DISTANCE = 10;\n\n  /**\n   * @typedef { Partial<{\n   *   defaultFillColor: string,\n   *   defaultStrokeColor: string,\n   *   defaultLabelColor: string\n   * }> } BpmnRendererConfig\n   */\n\n  /**\n   * @typedef { import('../model/Types').Element } Element\n   */\n\n  /**\n   * A renderer for BPMN elements\n   *\n   * @param {BpmnRendererConfig} config\n   * @param {import('diagram-js/lib/core/EventBus').default} eventBus\n   * @param {import('diagram-js/lib/draw/Styles').default} styles\n   * @param {import('./PathMap').default} pathMap\n   * @param {import('diagram-js/lib/core/Canvas').default} canvas\n   * @param {import('./TextRenderer').default} textRenderer\n   * @param {number} [priority]\n   */\n  function BpmnRenderer(\n      config, eventBus, styles, pathMap,\n      canvas, textRenderer, priority) {\n\n    BaseRenderer.call(this, eventBus, priority);\n\n    var defaultFillColor = config && config.defaultFillColor,\n        defaultStrokeColor = config && config.defaultStrokeColor,\n        defaultLabelColor = config && config.defaultLabelColor;\n\n    var rendererId = RENDERER_IDS.next();\n\n    var markers = {};\n\n    function shapeStyle(attrs) {\n      return styles.computeStyle(attrs, {\n        strokeLinecap: 'round',\n        strokeLinejoin: 'round',\n        stroke: black,\n        strokeWidth: 2,\n        fill: 'white'\n      });\n    }\n\n    function lineStyle(attrs) {\n      return styles.computeStyle(attrs, [ 'no-fill' ], {\n        strokeLinecap: 'round',\n        strokeLinejoin: 'round',\n        stroke: black,\n        strokeWidth: 2\n      });\n    }\n\n    function addMarker(id, options) {\n      var {\n        ref = { x: 0, y: 0 },\n        scale = 1,\n        element\n      } = options;\n\n      var marker = create$1('marker', {\n        id: id,\n        viewBox: '0 0 20 20',\n        refX: ref.x,\n        refY: ref.y,\n        markerWidth: 20 * scale,\n        markerHeight: 20 * scale,\n        orient: 'auto'\n      });\n\n      append(marker, element);\n\n      var defs = query('defs', canvas._svg);\n\n      if (!defs) {\n        defs = create$1('defs');\n\n        append(canvas._svg, defs);\n      }\n\n      append(defs, marker);\n\n      markers[id] = marker;\n    }\n\n    function colorEscape(str) {\n\n      // only allow characters and numbers\n      return str.replace(/[^0-9a-zA-Z]+/g, '_');\n    }\n\n    function marker(type, fill, stroke) {\n      var id = type + '-' + colorEscape(fill) + '-' + colorEscape(stroke) + '-' + rendererId;\n\n      if (!markers[id]) {\n        createMarker(id, type, fill, stroke);\n      }\n\n      return 'url(#' + id + ')';\n    }\n\n    function createMarker(id, type, fill, stroke) {\n\n      if (type === 'sequenceflow-end') {\n        var sequenceflowEnd = create$1('path', {\n          d: 'M 1 5 L 11 10 L 1 15 Z',\n          ...shapeStyle({\n            fill: stroke,\n            stroke: stroke,\n            strokeWidth: 1\n          })\n        });\n\n        addMarker(id, {\n          element: sequenceflowEnd,\n          ref: { x: 11, y: 10 },\n          scale: 0.5\n        });\n      }\n\n      if (type === 'messageflow-start') {\n        var messageflowStart = create$1('circle', {\n          cx: 6,\n          cy: 6,\n          r: 3.5,\n          ...shapeStyle({\n            fill: fill,\n            stroke: stroke,\n            strokeWidth: 1,\n\n            // fix for safari / chrome / firefox bug not correctly\n            // resetting stroke dash array\n            strokeDasharray: [ 10000, 1 ]\n          })\n        });\n\n        addMarker(id, {\n          element: messageflowStart,\n          ref: { x: 6, y: 6 }\n        });\n      }\n\n      if (type === 'messageflow-end') {\n        var messageflowEnd = create$1('path', {\n          d: 'm 1 5 l 0 -3 l 7 3 l -7 3 z',\n          ...shapeStyle({\n            fill: fill,\n            stroke: stroke,\n            strokeWidth: 1,\n\n            // fix for safari / chrome / firefox bug not correctly\n            // resetting stroke dash array\n            strokeDasharray: [ 10000, 1 ]\n          })\n        });\n\n        addMarker(id, {\n          element: messageflowEnd,\n          ref: { x: 8.5, y: 5 }\n        });\n      }\n\n      if (type === 'association-start') {\n        var associationStart = create$1('path', {\n          d: 'M 11 5 L 1 10 L 11 15',\n          ...lineStyle({\n            fill: 'none',\n            stroke: stroke,\n            strokeWidth: 1.5,\n\n            // fix for safari / chrome / firefox bug not correctly\n            // resetting stroke dash array\n            strokeDasharray: [ 10000, 1 ]\n          })\n        });\n\n        addMarker(id, {\n          element: associationStart,\n          ref: { x: 1, y: 10 },\n          scale: 0.5\n        });\n      }\n\n      if (type === 'association-end') {\n        var associationEnd = create$1('path', {\n          d: 'M 1 5 L 11 10 L 1 15',\n          ...lineStyle({\n            fill: 'none',\n            stroke: stroke,\n            strokeWidth: 1.5,\n\n            // fix for safari / chrome / firefox bug not correctly\n            // resetting stroke dash array\n            strokeDasharray: [ 10000, 1 ]\n          })\n        });\n\n        addMarker(id, {\n          element: associationEnd,\n          ref: { x: 11, y: 10 },\n          scale: 0.5\n        });\n      }\n\n      if (type === 'conditional-flow-marker') {\n        var conditionalFlowMarker = create$1('path', {\n          d: 'M 0 10 L 8 6 L 16 10 L 8 14 Z',\n          ...shapeStyle({\n            fill: fill,\n            stroke: stroke\n          })\n        });\n\n        addMarker(id, {\n          element: conditionalFlowMarker,\n          ref: { x: -1, y: 10 },\n          scale: 0.5\n        });\n      }\n\n      if (type === 'conditional-default-flow-marker') {\n        var defaultFlowMarker = create$1('path', {\n          d: 'M 6 4 L 10 16',\n          ...shapeStyle({\n            stroke: stroke\n          })\n        });\n\n        addMarker(id, {\n          element: defaultFlowMarker,\n          ref: { x: 0, y: 10 },\n          scale: 0.5\n        });\n      }\n    }\n\n    function drawCircle(parentGfx, width, height, offset, attrs) {\n\n      if (isObject(offset)) {\n        attrs = offset;\n        offset = 0;\n      }\n\n      offset = offset || 0;\n\n      attrs = shapeStyle(attrs);\n\n      if (attrs.fill === 'none') {\n        delete attrs.fillOpacity;\n      }\n\n      var cx = width / 2,\n          cy = height / 2;\n\n      var circle = create$1('circle', {\n        cx: cx,\n        cy: cy,\n        r: Math.round((width + height) / 4 - offset),\n        ...attrs\n      });\n\n      append(parentGfx, circle);\n\n      return circle;\n    }\n\n    function drawRect(parentGfx, width, height, r, offset, attrs) {\n\n      if (isObject(offset)) {\n        attrs = offset;\n        offset = 0;\n      }\n\n      offset = offset || 0;\n\n      attrs = shapeStyle(attrs);\n\n      var rect = create$1('rect', {\n        x: offset,\n        y: offset,\n        width: width - offset * 2,\n        height: height - offset * 2,\n        rx: r,\n        ry: r,\n        ...attrs\n      });\n\n      append(parentGfx, rect);\n\n      return rect;\n    }\n\n    function drawDiamond(parentGfx, width, height, attrs) {\n\n      var x_2 = width / 2;\n      var y_2 = height / 2;\n\n      var points = [\n        { x: x_2, y: 0 },\n        { x: width, y: y_2 },\n        { x: x_2, y: height },\n        { x: 0, y: y_2 }\n      ];\n\n      var pointsString = points.map(function(point) {\n        return point.x + ',' + point.y;\n      }).join(' ');\n\n      attrs = shapeStyle(attrs);\n\n      var polygon = create$1('polygon', {\n        ...attrs,\n        points: pointsString\n      });\n\n      append(parentGfx, polygon);\n\n      return polygon;\n    }\n\n    /**\n     * @param {SVGElement} parentGfx\n     * @param {Point[]} waypoints\n     * @param {any} attrs\n     * @param {number} [radius]\n     *\n     * @return {SVGElement}\n     */\n    function drawLine(parentGfx, waypoints, attrs, radius) {\n      attrs = lineStyle(attrs);\n\n      var line = createLine(waypoints, attrs, radius);\n\n      append(parentGfx, line);\n\n      return line;\n    }\n\n    /**\n     * @param {SVGElement} parentGfx\n     * @param {Point[]} waypoints\n     * @param {any} attrs\n     *\n     * @return {SVGElement}\n     */\n    function drawConnectionSegments(parentGfx, waypoints, attrs) {\n      return drawLine(parentGfx, waypoints, attrs, 5);\n    }\n\n    function drawPath(parentGfx, d, attrs) {\n\n      attrs = lineStyle(attrs);\n\n      var path = create$1('path', {\n        ...attrs,\n        d\n      });\n\n      append(parentGfx, path);\n\n      return path;\n    }\n\n    function drawMarker(type, parentGfx, path, attrs) {\n      return drawPath(parentGfx, path, assign$1({ 'data-marker': type }, attrs));\n    }\n\n    function renderer(type) {\n      return handlers[type];\n    }\n\n    function as(type) {\n      return function(parentGfx, element, options) {\n        return renderer(type)(parentGfx, element, options);\n      };\n    }\n\n    function renderEventContent(element, parentGfx) {\n\n      var event = getBusinessObject(element);\n      var isThrowing = isThrowEvent(event);\n\n      if (event.eventDefinitions && event.eventDefinitions.length > 1) {\n        if (event.parallelMultiple) {\n          return renderer('bpmn:ParallelMultipleEventDefinition')(parentGfx, element, isThrowing);\n        }\n        else {\n          return renderer('bpmn:MultipleEventDefinition')(parentGfx, element, isThrowing);\n        }\n      }\n\n      if (isTypedEvent(event, 'bpmn:MessageEventDefinition')) {\n        return renderer('bpmn:MessageEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:TimerEventDefinition')) {\n        return renderer('bpmn:TimerEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:ConditionalEventDefinition')) {\n        return renderer('bpmn:ConditionalEventDefinition')(parentGfx, element);\n      }\n\n      if (isTypedEvent(event, 'bpmn:SignalEventDefinition')) {\n        return renderer('bpmn:SignalEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:EscalationEventDefinition')) {\n        return renderer('bpmn:EscalationEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:LinkEventDefinition')) {\n        return renderer('bpmn:LinkEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:ErrorEventDefinition')) {\n        return renderer('bpmn:ErrorEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:CancelEventDefinition')) {\n        return renderer('bpmn:CancelEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:CompensateEventDefinition')) {\n        return renderer('bpmn:CompensateEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      if (isTypedEvent(event, 'bpmn:TerminateEventDefinition')) {\n        return renderer('bpmn:TerminateEventDefinition')(parentGfx, element, isThrowing);\n      }\n\n      return null;\n    }\n\n    function renderLabel(parentGfx, label, options) {\n\n      options = assign$1({\n        size: {\n          width: 100\n        }\n      }, options);\n\n      var text = textRenderer.createText(label || '', options);\n\n      classes$1(text).add('djs-label');\n\n      append(parentGfx, text);\n\n      return text;\n    }\n\n    function renderEmbeddedLabel(parentGfx, element, align) {\n      var semantic = getBusinessObject(element);\n\n      return renderLabel(parentGfx, semantic.name, {\n        box: element,\n        align: align,\n        padding: 7,\n        style: {\n          fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor)\n        }\n      });\n    }\n\n    function renderExternalLabel(parentGfx, element) {\n\n      var box = {\n        width: 90,\n        height: 30,\n        x: element.width / 2 + element.x,\n        y: element.height / 2 + element.y\n      };\n\n      return renderLabel(parentGfx, getLabel(element), {\n        box: box,\n        fitBox: true,\n        style: assign$1(\n          {},\n          textRenderer.getExternalStyle(),\n          {\n            fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor)\n          }\n        )\n      });\n    }\n\n    function renderLaneLabel(parentGfx, text, element) {\n      var textBox = renderLabel(parentGfx, text, {\n        box: {\n          height: 30,\n          width: element.height\n        },\n        align: 'center-middle',\n        style: {\n          fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor)\n        }\n      });\n\n      var top = -1 * element.height;\n\n      transform(textBox, 0, -top, 270);\n    }\n\n    var handlers = this.handlers = {\n      'bpmn:Event': function(parentGfx, element, attrs) {\n\n        if (!('fillOpacity' in attrs)) {\n          attrs.fillOpacity = DEFAULT_FILL_OPACITY;\n        }\n\n        return drawCircle(parentGfx, element.width, element.height, attrs);\n      },\n      'bpmn:StartEvent': function(parentGfx, element, options) {\n        var attrs = {\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        };\n\n        var semantic = getBusinessObject(element);\n\n        if (!semantic.isInterrupting) {\n          attrs = {\n            strokeDasharray: '6',\n            fill: getFillColor(element, defaultFillColor),\n            stroke: getStrokeColor(element, defaultStrokeColor)\n          };\n        }\n\n        var circle = renderer('bpmn:Event')(parentGfx, element, attrs);\n\n        if (!options || options.renderIcon !== false) {\n          renderEventContent(element, parentGfx);\n        }\n\n        return circle;\n      },\n      'bpmn:MessageEventDefinition': function(parentGfx, element, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_MESSAGE', {\n          xScaleFactor: 0.9,\n          yScaleFactor: 0.9,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.235,\n            my: 0.315\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor(element, defaultStrokeColor) : getFillColor(element, defaultFillColor);\n        var stroke = isThrowing ? getFillColor(element, defaultFillColor) : getStrokeColor(element, defaultStrokeColor);\n\n        var messagePath = drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: stroke\n        });\n\n        return messagePath;\n      },\n      'bpmn:TimerEventDefinition': function(parentGfx, element) {\n        var circle = drawCircle(parentGfx, element.width, element.height, 0.2 * element.height, {\n          strokeWidth: 2,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        var pathData = pathMap.getScaledPath('EVENT_TIMER_WH', {\n          xScaleFactor: 0.75,\n          yScaleFactor: 0.75,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.5,\n            my: 0.5\n          }\n        });\n\n        drawPath(parentGfx, pathData, {\n          strokeWidth: 2,\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        for (var i = 0;i < 12; i++) {\n\n          var linePathData = pathMap.getScaledPath('EVENT_TIMER_LINE', {\n            xScaleFactor: 0.75,\n            yScaleFactor: 0.75,\n            containerWidth: element.width,\n            containerHeight: element.height,\n            position: {\n              mx: 0.5,\n              my: 0.5\n            }\n          });\n\n          var width = element.width / 2;\n          var height = element.height / 2;\n\n          drawPath(parentGfx, linePathData, {\n            strokeWidth: 1,\n            transform: 'rotate(' + (i * 30) + ',' + height + ',' + width + ')',\n            stroke: getStrokeColor(element, defaultStrokeColor)\n          });\n        }\n\n        return circle;\n      },\n      'bpmn:EscalationEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_ESCALATION', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.5,\n            my: 0.2\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor(event, defaultStrokeColor) : 'none';\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: getStrokeColor(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:ConditionalEventDefinition': function(parentGfx, event) {\n        var pathData = pathMap.getScaledPath('EVENT_CONDITIONAL', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.5,\n            my: 0.222\n          }\n        });\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          stroke: getStrokeColor(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:LinkEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_LINK', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.57,\n            my: 0.263\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor(event, defaultStrokeColor) : 'none';\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: getStrokeColor(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:ErrorEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_ERROR', {\n          xScaleFactor: 1.1,\n          yScaleFactor: 1.1,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.2,\n            my: 0.722\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor(event, defaultStrokeColor) : 'none';\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: getStrokeColor(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:CancelEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_CANCEL_45', {\n          xScaleFactor: 1.0,\n          yScaleFactor: 1.0,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.638,\n            my: -0.055\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor(event, defaultStrokeColor) : 'none';\n\n        var path = drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: getStrokeColor(event, defaultStrokeColor)\n        });\n\n        rotate(path, 45);\n\n        return path;\n      },\n      'bpmn:CompensateEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_COMPENSATION', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.22,\n            my: 0.5\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor(event, defaultStrokeColor) : 'none';\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: getStrokeColor(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:SignalEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_SIGNAL', {\n          xScaleFactor: 0.9,\n          yScaleFactor: 0.9,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.5,\n            my: 0.2\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor(event, defaultStrokeColor) : 'none';\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill,\n          stroke: getStrokeColor(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:MultipleEventDefinition': function(parentGfx, event, isThrowing) {\n        var pathData = pathMap.getScaledPath('EVENT_MULTIPLE', {\n          xScaleFactor: 1.1,\n          yScaleFactor: 1.1,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.222,\n            my: 0.36\n          }\n        });\n\n        var fill = isThrowing ? getStrokeColor(event, defaultStrokeColor) : 'none';\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: fill\n        });\n      },\n      'bpmn:ParallelMultipleEventDefinition': function(parentGfx, event) {\n        var pathData = pathMap.getScaledPath('EVENT_PARALLEL_MULTIPLE', {\n          xScaleFactor: 1.2,\n          yScaleFactor: 1.2,\n          containerWidth: event.width,\n          containerHeight: event.height,\n          position: {\n            mx: 0.458,\n            my: 0.194\n          }\n        });\n\n        return drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: getStrokeColor(event, defaultStrokeColor),\n          stroke: getStrokeColor(event, defaultStrokeColor)\n        });\n      },\n      'bpmn:EndEvent': function(parentGfx, element, options) {\n        var circle = renderer('bpmn:Event')(parentGfx, element, {\n          strokeWidth: 4,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        if (!options || options.renderIcon !== false) {\n          renderEventContent(element, parentGfx);\n        }\n\n        return circle;\n      },\n      'bpmn:TerminateEventDefinition': function(parentGfx, element) {\n        var circle = drawCircle(parentGfx, element.width, element.height, 8, {\n          strokeWidth: 4,\n          fill: getStrokeColor(element, defaultStrokeColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return circle;\n      },\n      'bpmn:IntermediateEvent': function(parentGfx, element, options) {\n        var outer = renderer('bpmn:Event')(parentGfx, element, {\n          strokeWidth: 1.5,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        /* inner */\n        drawCircle(parentGfx, element.width, element.height, INNER_OUTER_DIST, {\n          strokeWidth: 1.5,\n          fill: getFillColor(element, 'none'),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        if (!options || options.renderIcon !== false) {\n          renderEventContent(element, parentGfx);\n        }\n\n        return outer;\n      },\n      'bpmn:IntermediateCatchEvent': as('bpmn:IntermediateEvent'),\n      'bpmn:IntermediateThrowEvent': as('bpmn:IntermediateEvent'),\n\n      'bpmn:Activity': function(parentGfx, element, attrs) {\n\n        attrs = attrs || {};\n\n        if (!('fillOpacity' in attrs)) {\n          attrs.fillOpacity = DEFAULT_FILL_OPACITY;\n        }\n\n        return drawRect(parentGfx, element.width, element.height, TASK_BORDER_RADIUS, attrs);\n      },\n\n      'bpmn:Task': function(parentGfx, element) {\n        var attrs = {\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        };\n\n        var rect = renderer('bpmn:Activity')(parentGfx, element, attrs);\n\n        renderEmbeddedLabel(parentGfx, element, 'center-middle');\n        attachTaskMarkers(parentGfx, element);\n\n        return rect;\n      },\n      'bpmn:ServiceTask': function(parentGfx, element) {\n        var task = renderer('bpmn:Task')(parentGfx, element);\n\n        var pathDataBG = pathMap.getScaledPath('TASK_TYPE_SERVICE', {\n          abspos: {\n            x: 12,\n            y: 18\n          }\n        });\n\n        /* service bg */ drawPath(parentGfx, pathDataBG, {\n          strokeWidth: 1,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        var fillPathData = pathMap.getScaledPath('TASK_TYPE_SERVICE_FILL', {\n          abspos: {\n            x: 17.2,\n            y: 18\n          }\n        });\n\n        /* service fill */ drawPath(parentGfx, fillPathData, {\n          strokeWidth: 0,\n          fill: getFillColor(element, defaultFillColor)\n        });\n\n        var pathData = pathMap.getScaledPath('TASK_TYPE_SERVICE', {\n          abspos: {\n            x: 17,\n            y: 22\n          }\n        });\n\n        /* service */ drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return task;\n      },\n      'bpmn:UserTask': function(parentGfx, element) {\n        var task = renderer('bpmn:Task')(parentGfx, element);\n\n        var x = 15;\n        var y = 12;\n\n        var pathData = pathMap.getScaledPath('TASK_TYPE_USER_1', {\n          abspos: {\n            x: x,\n            y: y\n          }\n        });\n\n        /* user path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 0.5,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        var pathData2 = pathMap.getScaledPath('TASK_TYPE_USER_2', {\n          abspos: {\n            x: x,\n            y: y\n          }\n        });\n\n        /* user2 path */ drawPath(parentGfx, pathData2, {\n          strokeWidth: 0.5,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        var pathData3 = pathMap.getScaledPath('TASK_TYPE_USER_3', {\n          abspos: {\n            x: x,\n            y: y\n          }\n        });\n\n        /* user3 path */ drawPath(parentGfx, pathData3, {\n          strokeWidth: 0.5,\n          fill: getStrokeColor(element, defaultStrokeColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return task;\n      },\n      'bpmn:ManualTask': function(parentGfx, element) {\n        var task = renderer('bpmn:Task')(parentGfx, element);\n\n        var pathData = pathMap.getScaledPath('TASK_TYPE_MANUAL', {\n          abspos: {\n            x: 17,\n            y: 15\n          }\n        });\n\n        /* manual path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 0.5, // 0.25,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return task;\n      },\n      'bpmn:SendTask': function(parentGfx, element) {\n        var task = renderer('bpmn:Task')(parentGfx, element);\n\n        var pathData = pathMap.getScaledPath('TASK_TYPE_SEND', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: 21,\n          containerHeight: 14,\n          position: {\n            mx: 0.285,\n            my: 0.357\n          }\n        });\n\n        /* send path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: getStrokeColor(element, defaultStrokeColor),\n          stroke: getFillColor(element, defaultFillColor)\n        });\n\n        return task;\n      },\n      'bpmn:ReceiveTask' : function(parentGfx, element) {\n        var semantic = getBusinessObject(element);\n\n        var task = renderer('bpmn:Task')(parentGfx, element);\n        var pathData;\n\n        if (semantic.instantiate) {\n          drawCircle(parentGfx, 28, 28, 20 * 0.22, { strokeWidth: 1 });\n\n          pathData = pathMap.getScaledPath('TASK_TYPE_INSTANTIATING_SEND', {\n            abspos: {\n              x: 7.77,\n              y: 9.52\n            }\n          });\n        } else {\n\n          pathData = pathMap.getScaledPath('TASK_TYPE_SEND', {\n            xScaleFactor: 0.9,\n            yScaleFactor: 0.9,\n            containerWidth: 21,\n            containerHeight: 14,\n            position: {\n              mx: 0.3,\n              my: 0.4\n            }\n          });\n        }\n\n        /* receive path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return task;\n      },\n      'bpmn:ScriptTask': function(parentGfx, element) {\n        var task = renderer('bpmn:Task')(parentGfx, element);\n\n        var pathData = pathMap.getScaledPath('TASK_TYPE_SCRIPT', {\n          abspos: {\n            x: 15,\n            y: 20\n          }\n        });\n\n        /* script path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return task;\n      },\n      'bpmn:BusinessRuleTask': function(parentGfx, element) {\n        var task = renderer('bpmn:Task')(parentGfx, element);\n\n        var headerPathData = pathMap.getScaledPath('TASK_TYPE_BUSINESS_RULE_HEADER', {\n          abspos: {\n            x: 8,\n            y: 8\n          }\n        });\n\n        var businessHeaderPath = drawPath(parentGfx, headerPathData);\n        attr$1(businessHeaderPath, {\n          strokeWidth: 1,\n          fill: getFillColor(element, '#aaaaaa'),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        var headerData = pathMap.getScaledPath('TASK_TYPE_BUSINESS_RULE_MAIN', {\n          abspos: {\n            x: 8,\n            y: 8\n          }\n        });\n\n        var businessPath = drawPath(parentGfx, headerData);\n        attr$1(businessPath, {\n          strokeWidth: 1,\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return task;\n      },\n      'bpmn:SubProcess': function(parentGfx, element, attrs) {\n        attrs = {\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor),\n          ...attrs\n        };\n\n        var rect = renderer('bpmn:Activity')(parentGfx, element, attrs);\n\n        var expanded = isExpanded(element);\n\n        if (isEventSubProcess(element)) {\n          attr$1(rect, {\n            strokeDasharray: '0, 5.5',\n            strokeWidth: 2.5\n          });\n        }\n\n        renderEmbeddedLabel(parentGfx, element, expanded ? 'center-top' : 'center-middle');\n\n        if (expanded) {\n          attachTaskMarkers(parentGfx, element);\n        } else {\n          attachTaskMarkers(parentGfx, element, [ 'SubProcessMarker' ]);\n        }\n\n        return rect;\n      },\n      'bpmn:AdHocSubProcess': function(parentGfx, element) {\n        return renderer('bpmn:SubProcess')(parentGfx, element);\n      },\n      'bpmn:Transaction': function(parentGfx, element) {\n        var outer = renderer('bpmn:SubProcess')(parentGfx, element, { strokeWidth: 1.5 });\n\n        var innerAttrs = styles.style([ 'no-fill', 'no-events' ], {\n          stroke: getStrokeColor(element, defaultStrokeColor),\n          strokeWidth: 1.5\n        });\n\n        /* inner path */ drawRect(parentGfx, element.width, element.height, TASK_BORDER_RADIUS - 3, INNER_OUTER_DIST, innerAttrs);\n\n        return outer;\n      },\n      'bpmn:CallActivity': function(parentGfx, element) {\n        return renderer('bpmn:SubProcess')(parentGfx, element, {\n          strokeWidth: 5\n        });\n      },\n      'bpmn:Participant': function(parentGfx, element) {\n\n        var strokeWidth = 1.5;\n\n        var attrs = {\n          fillOpacity: DEFAULT_FILL_OPACITY,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor),\n          strokeWidth\n        };\n\n        var lane = renderer('bpmn:Lane')(parentGfx, element, attrs);\n\n        var expandedPool = isExpanded(element);\n\n        if (expandedPool) {\n          drawLine(parentGfx, [\n            { x: 30, y: 0 },\n            { x: 30, y: element.height }\n          ], {\n            stroke: getStrokeColor(element, defaultStrokeColor),\n            strokeWidth\n          });\n          var text = getBusinessObject(element).name;\n          renderLaneLabel(parentGfx, text, element);\n        } else {\n\n          // collapsed pool draw text inline\n          var text2 = getBusinessObject(element).name;\n          renderLabel(parentGfx, text2, {\n            box: element, align: 'center-middle',\n            style: {\n              fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor)\n            }\n          });\n        }\n\n        var participantMultiplicity = !!(getBusinessObject(element).participantMultiplicity);\n\n        if (participantMultiplicity) {\n          renderer('ParticipantMultiplicityMarker')(parentGfx, element);\n        }\n\n        return lane;\n      },\n      'bpmn:Lane': function(parentGfx, element, attrs) {\n        var rect = drawRect(parentGfx, element.width, element.height, 0, {\n          fill: getFillColor(element, defaultFillColor),\n          fillOpacity: HIGH_FILL_OPACITY,\n          stroke: getStrokeColor(element, defaultStrokeColor),\n          strokeWidth: 1.5,\n          ...attrs\n        });\n\n        var semantic = getBusinessObject(element);\n\n        if (semantic.$type === 'bpmn:Lane') {\n          var text = semantic.name;\n          renderLaneLabel(parentGfx, text, element);\n        }\n\n        return rect;\n      },\n      'bpmn:InclusiveGateway': function(parentGfx, element) {\n        var diamond = renderer('bpmn:Gateway')(parentGfx, element);\n\n        /* circle path */\n        drawCircle(parentGfx, element.width, element.height, element.height * 0.24, {\n          strokeWidth: 2.5,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return diamond;\n      },\n      'bpmn:ExclusiveGateway': function(parentGfx, element) {\n        var diamond = renderer('bpmn:Gateway')(parentGfx, element);\n\n        var pathData = pathMap.getScaledPath('GATEWAY_EXCLUSIVE', {\n          xScaleFactor: 0.4,\n          yScaleFactor: 0.4,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.32,\n            my: 0.3\n          }\n        });\n\n        if ((getDi(element).isMarkerVisible)) {\n          drawPath(parentGfx, pathData, {\n            strokeWidth: 1,\n            fill: getStrokeColor(element, defaultStrokeColor),\n            stroke: getStrokeColor(element, defaultStrokeColor)\n          });\n        }\n\n        return diamond;\n      },\n      'bpmn:ComplexGateway': function(parentGfx, element) {\n        var diamond = renderer('bpmn:Gateway')(parentGfx, element);\n\n        var pathData = pathMap.getScaledPath('GATEWAY_COMPLEX', {\n          xScaleFactor: 0.5,\n          yScaleFactor:0.5,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.46,\n            my: 0.26\n          }\n        });\n\n        /* complex path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: getStrokeColor(element, defaultStrokeColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return diamond;\n      },\n      'bpmn:ParallelGateway': function(parentGfx, element) {\n        var diamond = renderer('bpmn:Gateway')(parentGfx, element);\n\n        var pathData = pathMap.getScaledPath('GATEWAY_PARALLEL', {\n          xScaleFactor: 0.6,\n          yScaleFactor:0.6,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.46,\n            my: 0.2\n          }\n        });\n\n        /* parallel path */ drawPath(parentGfx, pathData, {\n          strokeWidth: 1,\n          fill: getStrokeColor(element, defaultStrokeColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return diamond;\n      },\n      'bpmn:EventBasedGateway': function(parentGfx, element) {\n\n        var semantic = getBusinessObject(element);\n\n        var diamond = renderer('bpmn:Gateway')(parentGfx, element);\n\n        /* outer circle path */ drawCircle(parentGfx, element.width, element.height, element.height * 0.20, {\n          strokeWidth: 1,\n          fill: 'none',\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        var type = semantic.eventGatewayType;\n        var instantiate = !!semantic.instantiate;\n\n        function drawEvent() {\n\n          var pathData = pathMap.getScaledPath('GATEWAY_EVENT_BASED', {\n            xScaleFactor: 0.18,\n            yScaleFactor: 0.18,\n            containerWidth: element.width,\n            containerHeight: element.height,\n            position: {\n              mx: 0.36,\n              my: 0.44\n            }\n          });\n\n          /* event path */ drawPath(parentGfx, pathData, {\n            strokeWidth: 2,\n            fill: getFillColor(element, 'none'),\n            stroke: getStrokeColor(element, defaultStrokeColor)\n          });\n        }\n\n        if (type === 'Parallel') {\n\n          var pathData = pathMap.getScaledPath('GATEWAY_PARALLEL', {\n            xScaleFactor: 0.4,\n            yScaleFactor:0.4,\n            containerWidth: element.width,\n            containerHeight: element.height,\n            position: {\n              mx: 0.474,\n              my: 0.296\n            }\n          });\n\n          drawPath(parentGfx, pathData, {\n            strokeWidth: 1,\n            fill: 'none'\n          });\n        } else if (type === 'Exclusive') {\n\n          if (!instantiate) {\n            drawCircle(parentGfx, element.width, element.height, element.height * 0.26, {\n              strokeWidth: 1,\n              fill: 'none',\n              stroke: getStrokeColor(element, defaultStrokeColor)\n            });\n          }\n\n          drawEvent();\n        }\n\n\n        return diamond;\n      },\n      'bpmn:Gateway': function(parentGfx, element) {\n        return drawDiamond(parentGfx, element.width, element.height, {\n          fill: getFillColor(element, defaultFillColor),\n          fillOpacity: DEFAULT_FILL_OPACITY,\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n      },\n      'bpmn:SequenceFlow': function(parentGfx, element) {\n        var fill = getFillColor(element, defaultFillColor),\n            stroke = getStrokeColor(element, defaultStrokeColor);\n\n        var path = drawConnectionSegments(parentGfx, element.waypoints, {\n          markerEnd: marker('sequenceflow-end', fill, stroke),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        var sequenceFlow = getBusinessObject(element);\n\n        var source;\n\n        if (element.source) {\n          source = element.source.businessObject;\n\n          // conditional flow marker\n          if (sequenceFlow.conditionExpression && source.$instanceOf('bpmn:Activity')) {\n            attr$1(path, {\n              markerStart: marker('conditional-flow-marker', fill, stroke)\n            });\n          }\n\n          // default marker\n          if (source.default && (source.$instanceOf('bpmn:Gateway') || source.$instanceOf('bpmn:Activity')) &&\n              source.default === sequenceFlow) {\n            attr$1(path, {\n              markerStart: marker('conditional-default-flow-marker', fill, stroke)\n            });\n          }\n        }\n\n        return path;\n      },\n      'bpmn:Association': function(parentGfx, element, attrs) {\n\n        var semantic = getBusinessObject(element);\n\n        var fill = getFillColor(element, defaultFillColor),\n            stroke = getStrokeColor(element, defaultStrokeColor);\n\n        attrs = {\n          strokeDasharray: '0, 5',\n          stroke: getStrokeColor(element, defaultStrokeColor),\n          ...attrs\n        };\n\n        if (semantic.associationDirection === 'One' ||\n            semantic.associationDirection === 'Both') {\n          attrs.markerEnd = marker('association-end', fill, stroke);\n        }\n\n        if (semantic.associationDirection === 'Both') {\n          attrs.markerStart = marker('association-start', fill, stroke);\n        }\n\n        return drawConnectionSegments(parentGfx, element.waypoints, attrs);\n      },\n      'bpmn:DataInputAssociation': function(parentGfx, element) {\n        var fill = getFillColor(element, defaultFillColor),\n            stroke = getStrokeColor(element, defaultStrokeColor);\n\n        return renderer('bpmn:Association')(parentGfx, element, {\n          markerEnd: marker('association-end', fill, stroke)\n        });\n      },\n      'bpmn:DataOutputAssociation': function(parentGfx, element) {\n        var fill = getFillColor(element, defaultFillColor),\n            stroke = getStrokeColor(element, defaultStrokeColor);\n\n        return renderer('bpmn:Association')(parentGfx, element, {\n          markerEnd: marker('association-end', fill, stroke)\n        });\n      },\n      'bpmn:MessageFlow': function(parentGfx, element) {\n\n        var semantic = getBusinessObject(element),\n            di = getDi(element);\n\n        var fill = getFillColor(element, defaultFillColor),\n            stroke = getStrokeColor(element, defaultStrokeColor);\n\n        var path = drawConnectionSegments(parentGfx, element.waypoints, {\n          markerEnd: marker('messageflow-end', fill, stroke),\n          markerStart: marker('messageflow-start', fill, stroke),\n          strokeDasharray: '10, 11',\n          strokeWidth: 1.5,\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        if (semantic.messageRef) {\n          var midPoint = path.getPointAtLength(path.getTotalLength() / 2);\n\n          var markerPathData = pathMap.getScaledPath('MESSAGE_FLOW_MARKER', {\n            abspos: {\n              x: midPoint.x,\n              y: midPoint.y\n            }\n          });\n\n          var messageAttrs = { strokeWidth: 1 };\n\n          if (di.messageVisibleKind === 'initiating') {\n            messageAttrs.fill = 'white';\n            messageAttrs.stroke = black;\n          } else {\n            messageAttrs.fill = '#888';\n            messageAttrs.stroke = 'white';\n          }\n\n          var message = drawPath(parentGfx, markerPathData, messageAttrs);\n\n          var labelText = semantic.messageRef.name;\n          var label = renderLabel(parentGfx, labelText, {\n            align: 'center-top',\n            fitBox: true,\n            style: {\n              fill: getStrokeColor(element, defaultLabelColor)\n            }\n          });\n\n          var messageBounds = message.getBBox(),\n              labelBounds = label.getBBox();\n\n          var translateX = midPoint.x - labelBounds.width / 2,\n              translateY = midPoint.y + messageBounds.height / 2 + ELEMENT_LABEL_DISTANCE;\n\n          transform(label, translateX, translateY, 0);\n\n        }\n\n        return path;\n      },\n      'bpmn:DataObject': function(parentGfx, element) {\n        var pathData = pathMap.getScaledPath('DATA_OBJECT_PATH', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.474,\n            my: 0.296\n          }\n        });\n\n        var elementObject = drawPath(parentGfx, pathData, {\n          fill: getFillColor(element, defaultFillColor),\n          fillOpacity: DEFAULT_FILL_OPACITY,\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        var semantic = getBusinessObject(element);\n\n        if (isCollection(semantic)) {\n          renderDataItemCollection(parentGfx, element);\n        }\n\n        return elementObject;\n      },\n      'bpmn:DataObjectReference': as('bpmn:DataObject'),\n      'bpmn:DataInput': function(parentGfx, element) {\n\n        var arrowPathData = pathMap.getRawPath('DATA_ARROW');\n\n        // page\n        var elementObject = renderer('bpmn:DataObject')(parentGfx, element);\n\n        /* input arrow path */ drawPath(parentGfx, arrowPathData, { strokeWidth: 1 });\n\n        return elementObject;\n      },\n      'bpmn:DataOutput': function(parentGfx, element) {\n        var arrowPathData = pathMap.getRawPath('DATA_ARROW');\n\n        // page\n        var elementObject = renderer('bpmn:DataObject')(parentGfx, element);\n\n        /* output arrow path */ drawPath(parentGfx, arrowPathData, {\n          strokeWidth: 1,\n          fill: black\n        });\n\n        return elementObject;\n      },\n      'bpmn:DataStoreReference': function(parentGfx, element) {\n        var DATA_STORE_PATH = pathMap.getScaledPath('DATA_STORE', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0,\n            my: 0.133\n          }\n        });\n\n        var elementStore = drawPath(parentGfx, DATA_STORE_PATH, {\n          strokeWidth: 2,\n          fill: getFillColor(element, defaultFillColor),\n          fillOpacity: DEFAULT_FILL_OPACITY,\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        return elementStore;\n      },\n      'bpmn:BoundaryEvent': function(parentGfx, element, options) {\n\n        var semantic = getBusinessObject(element),\n            cancel = semantic.cancelActivity;\n\n        var attrs = {\n          strokeWidth: 1.5,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        };\n\n        if (!cancel) {\n          attrs.strokeDasharray = '6';\n        }\n\n        // apply fillOpacity\n        var outerAttrs = {\n          ...attrs,\n          fillOpacity: 1\n        };\n\n        // apply no-fill\n        var innerAttrs = {\n          ...attrs,\n          fill: 'none'\n        };\n\n        var outer = renderer('bpmn:Event')(parentGfx, element, outerAttrs);\n\n        /* inner path */ drawCircle(parentGfx, element.width, element.height, INNER_OUTER_DIST, innerAttrs);\n\n        if (!options || options.renderIcon !== false) {\n          renderEventContent(element, parentGfx);\n        }\n\n        return outer;\n      },\n      'bpmn:Group': function(parentGfx, element) {\n        return drawRect(parentGfx, element.width, element.height, TASK_BORDER_RADIUS, {\n          stroke: getStrokeColor(element, defaultStrokeColor),\n          strokeWidth: 1.5,\n          strokeDasharray: '10,6,0,6',\n          fill: 'none',\n          pointerEvents: 'none'\n        });\n      },\n      'label': function(parentGfx, element) {\n        return renderExternalLabel(parentGfx, element);\n      },\n      'bpmn:TextAnnotation': function(parentGfx, element) {\n        var textElement = drawRect(parentGfx, element.width, element.height, 0, 0, {\n          'fill': 'none',\n          'stroke': 'none'\n        });\n\n        var textPathData = pathMap.getScaledPath('TEXT_ANNOTATION', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: 0.0,\n            my: 0.0\n          }\n        });\n\n        drawPath(parentGfx, textPathData, {\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        var text = getBusinessObject(element).text || '';\n        renderLabel(parentGfx, text, {\n          box: element,\n          align: 'left-top',\n          padding: 7,\n          style: {\n            fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor)\n          }\n        });\n\n        return textElement;\n      },\n      'ParticipantMultiplicityMarker': function(parentGfx, element) {\n        var markerPath = pathMap.getScaledPath('MARKER_PARALLEL', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: ((element.width / 2) / element.width),\n            my: (element.height - 15) / element.height\n          }\n        });\n\n        drawMarker('participant-multiplicity', parentGfx, markerPath, {\n          strokeWidth: 2,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n      },\n      'SubProcessMarker': function(parentGfx, element) {\n        var markerRect = drawRect(parentGfx, 14, 14, 0, {\n          strokeWidth: 1,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n\n        // Process marker is placed in the middle of the box\n        // therefore fixed values can be used here\n        translate$1(markerRect, element.width / 2 - 7.5, element.height - 20);\n\n        var markerPath = pathMap.getScaledPath('MARKER_SUB_PROCESS', {\n          xScaleFactor: 1.5,\n          yScaleFactor: 1.5,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: (element.width / 2 - 7.5) / element.width,\n            my: (element.height - 20) / element.height\n          }\n        });\n\n        drawMarker('sub-process', parentGfx, markerPath, {\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n      },\n      'ParallelMarker': function(parentGfx, element, position) {\n        var markerPath = pathMap.getScaledPath('MARKER_PARALLEL', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: ((element.width / 2 + position.parallel) / element.width),\n            my: (element.height - 20) / element.height\n          }\n        });\n\n        drawMarker('parallel', parentGfx, markerPath, {\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n      },\n      'SequentialMarker': function(parentGfx, element, position) {\n        var markerPath = pathMap.getScaledPath('MARKER_SEQUENTIAL', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: ((element.width / 2 + position.seq) / element.width),\n            my: (element.height - 19) / element.height\n          }\n        });\n\n        drawMarker('sequential', parentGfx, markerPath, {\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n      },\n      'CompensationMarker': function(parentGfx, element, position) {\n        var markerMath = pathMap.getScaledPath('MARKER_COMPENSATION', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: ((element.width / 2 + position.compensation) / element.width),\n            my: (element.height - 13) / element.height\n          }\n        });\n\n        drawMarker('compensation', parentGfx, markerMath, {\n          strokeWidth: 1,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n      },\n      'LoopMarker': function(parentGfx, element, position) {\n        var markerPath = pathMap.getScaledPath('MARKER_LOOP', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: ((element.width / 2 + position.loop) / element.width),\n            my: (element.height - 7) / element.height\n          }\n        });\n\n        drawMarker('loop', parentGfx, markerPath, {\n          strokeWidth: 1.5,\n          fill: getFillColor(element, defaultFillColor),\n          stroke: getStrokeColor(element, defaultStrokeColor),\n          strokeMiterlimit: 0.5\n        });\n      },\n      'AdhocMarker': function(parentGfx, element, position) {\n        var markerPath = pathMap.getScaledPath('MARKER_ADHOC', {\n          xScaleFactor: 1,\n          yScaleFactor: 1,\n          containerWidth: element.width,\n          containerHeight: element.height,\n          position: {\n            mx: ((element.width / 2 + position.adhoc) / element.width),\n            my: (element.height - 15) / element.height\n          }\n        });\n\n        drawMarker('adhoc', parentGfx, markerPath, {\n          strokeWidth: 1,\n          fill: getStrokeColor(element, defaultStrokeColor),\n          stroke: getStrokeColor(element, defaultStrokeColor)\n        });\n      }\n    };\n\n    function attachTaskMarkers(parentGfx, element, taskMarkers) {\n      var obj = getBusinessObject(element);\n\n      var subprocess = taskMarkers && taskMarkers.indexOf('SubProcessMarker') !== -1;\n      var position;\n\n      if (subprocess) {\n        position = {\n          seq: -21,\n          parallel: -22,\n          compensation: -42,\n          loop: -18,\n          adhoc: 10\n        };\n      } else {\n        position = {\n          seq: -3,\n          parallel: -6,\n          compensation: -27,\n          loop: 0,\n          adhoc: 10\n        };\n      }\n\n      forEach$1(taskMarkers, function(marker) {\n        renderer(marker)(parentGfx, element, position);\n      });\n\n      if (obj.isForCompensation) {\n        renderer('CompensationMarker')(parentGfx, element, position);\n      }\n\n      if (obj.$type === 'bpmn:AdHocSubProcess') {\n        renderer('AdhocMarker')(parentGfx, element, position);\n      }\n\n      var loopCharacteristics = obj.loopCharacteristics,\n          isSequential = loopCharacteristics && loopCharacteristics.isSequential;\n\n      if (loopCharacteristics) {\n\n        if (isSequential === undefined) {\n          renderer('LoopMarker')(parentGfx, element, position);\n        }\n\n        if (isSequential === false) {\n          renderer('ParallelMarker')(parentGfx, element, position);\n        }\n\n        if (isSequential === true) {\n          renderer('SequentialMarker')(parentGfx, element, position);\n        }\n      }\n    }\n\n    function renderDataItemCollection(parentGfx, element) {\n\n      var yPosition = (element.height - 18) / element.height;\n\n      var pathData = pathMap.getScaledPath('DATA_OBJECT_COLLECTION_PATH', {\n        xScaleFactor: 1,\n        yScaleFactor: 1,\n        containerWidth: element.width,\n        containerHeight: element.height,\n        position: {\n          mx: 0.33,\n          my: yPosition\n        }\n      });\n\n      /* collection path */ drawPath(parentGfx, pathData, {\n        strokeWidth: 2\n      });\n    }\n\n\n    // extension API, use at your own risk\n    this._drawPath = drawPath;\n\n    this._renderer = renderer;\n  }\n\n\n  e(BpmnRenderer, BaseRenderer);\n\n  BpmnRenderer.$inject = [\n    'config.bpmnRenderer',\n    'eventBus',\n    'styles',\n    'pathMap',\n    'canvas',\n    'textRenderer'\n  ];\n\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  BpmnRenderer.prototype.canRender = function(element) {\n    return is$1(element, 'bpmn:BaseElement');\n  };\n\n  /**\n   * Draw shape into parentGfx.\n   *\n   * @param {SVGElement} parentGfx\n   * @param {Element} element\n   *\n   * @return {SVGElement} mainGfx\n   */\n  BpmnRenderer.prototype.drawShape = function(parentGfx, element) {\n    var type = element.type;\n    var h = this._renderer(type);\n\n    /* jshint -W040 */\n    return h(parentGfx, element);\n  };\n\n  /**\n   * Draw connection into parentGfx.\n   *\n   * @param {SVGElement} parentGfx\n   * @param {Element} element\n   *\n   * @return {SVGElement} mainGfx\n   */\n  BpmnRenderer.prototype.drawConnection = function(parentGfx, element) {\n    var type = element.type;\n    var h = this._renderer(type);\n\n    /* jshint -W040 */\n    return h(parentGfx, element);\n  };\n\n  /**\n   * Get shape path.\n   *\n   * @param {Element} element\n   *\n   * @return {string} path\n   */\n  BpmnRenderer.prototype.getShapePath = function(element) {\n\n    if (is$1(element, 'bpmn:Event')) {\n      return getCirclePath(element);\n    }\n\n    if (is$1(element, 'bpmn:Activity')) {\n      return getRoundRectPath(element, TASK_BORDER_RADIUS);\n    }\n\n    if (is$1(element, 'bpmn:Gateway')) {\n      return getDiamondPath(element);\n    }\n\n    return getRectPath(element);\n  };\n\n  /**\n   * @typedef {import('../util/Types').Dimensions} Dimensions\n   *\n   * @typedef { {\n   *   top: number;\n   *   left: number;\n   *   right: number;\n   *   bottom: number;\n   * } } Padding\n   *\n   * @typedef { number | Partial<Padding> } PaddingConfig\n   *\n   * @typedef { {\n   *   horizontal: 'center' | 'left';\n   *   vertical: 'top' | 'center';\n   * } } Alignment\n   *\n   *  @typedef { 'center-middle' | 'center-top' } AlignmentConfig\n   *\n   * @typedef { Partial<{\n   *   align: AlignmentConfig;\n   *   style: Record<string, number | string>;\n   *   padding: PaddingConfig;\n   * }> } BaseTextConfig\n   *\n   * @typedef { BaseTextConfig & Partial<{\n   *   size: Dimensions;\n   * }> } TextConfig\n   *\n   * @typedef { BaseTextConfig & Partial<{\n   *   box: Dimensions;\n   *   fitBox: boolean;\n   * }> } TextLayoutConfig\n   *\n   *  @typedef { Dimensions & {\n   *  text: string;\n   * } } LineDescriptor\n   */\n\n  var DEFAULT_BOX_PADDING = 0;\n\n  var DEFAULT_LABEL_SIZE = {\n    width: 150,\n    height: 50\n  };\n\n\n  /**\n   * @param {AlignmentConfig} align\n   * @return {Alignment}\n   */\n  function parseAlign(align) {\n\n    var parts = align.split('-');\n\n    return {\n      horizontal: parts[0] || 'center',\n      vertical: parts[1] || 'top'\n    };\n  }\n\n  /**\n   * @param {PaddingConfig} padding\n   *\n   * @return {Padding}\n   */\n  function parsePadding(padding) {\n\n    if (isObject(padding)) {\n      return assign$1({ top: 0, left: 0, right: 0, bottom: 0 }, padding);\n    } else {\n      return {\n        top: padding,\n        left: padding,\n        right: padding,\n        bottom: padding\n      };\n    }\n  }\n\n  /**\n   * @param {string} text\n   * @param {SVGTextElement} fakeText\n   *\n   * @return {import('../util/Types').Dimensions}\n   */\n  function getTextBBox(text, fakeText) {\n\n    fakeText.textContent = text;\n\n    var textBBox;\n\n    try {\n      var bbox,\n          emptyLine = text === '';\n\n      // add dummy text, when line is empty to\n      // determine correct height\n      fakeText.textContent = emptyLine ? 'dummy' : text;\n\n      textBBox = fakeText.getBBox();\n\n      // take text rendering related horizontal\n      // padding into account\n      bbox = {\n        width: textBBox.width + textBBox.x * 2,\n        height: textBBox.height\n      };\n\n      if (emptyLine) {\n\n        // correct width\n        bbox.width = 0;\n      }\n\n      return bbox;\n    } catch (e) {\n      return { width: 0, height: 0 };\n    }\n  }\n\n\n  /**\n   * Layout the next line and return the layouted element.\n   *\n   * Alters the lines passed.\n   *\n   * @param {string[]} lines\n   * @param {number} maxWidth\n   * @param {SVGTextElement} fakeText\n   *\n   * @return {LineDescriptor} the line descriptor\n   */\n  function layoutNext(lines, maxWidth, fakeText) {\n\n    var originalLine = lines.shift(),\n        fitLine = originalLine;\n\n    var textBBox;\n\n    for (;;) {\n      textBBox = getTextBBox(fitLine, fakeText);\n\n      textBBox.width = fitLine ? textBBox.width : 0;\n\n      // try to fit\n      if (fitLine === ' ' || fitLine === '' || textBBox.width < Math.round(maxWidth) || fitLine.length < 2) {\n        return fit(lines, fitLine, originalLine, textBBox);\n      }\n\n      fitLine = shortenLine(fitLine, textBBox.width, maxWidth);\n    }\n  }\n\n  /**\n   * @param {string[]} lines\n   * @param {string} fitLine\n   * @param {string} originalLine\n   * @param {Dimensions} textBBox\n   *\n   * @return {LineDescriptor}\n   */\n  function fit(lines, fitLine, originalLine, textBBox) {\n    if (fitLine.length < originalLine.length) {\n      var remainder = originalLine.slice(fitLine.length).trim();\n\n      lines.unshift(remainder);\n    }\n\n    return {\n      width: textBBox.width,\n      height: textBBox.height,\n      text: fitLine\n    };\n  }\n\n  var SOFT_BREAK = '\\u00AD';\n\n\n  /**\n   * Shortens a line based on spacing and hyphens.\n   * Returns the shortened result on success.\n   *\n   * @param {string} line\n   * @param {number} maxLength the maximum characters of the string\n   *\n   * @return {string} the shortened string\n   */\n  function semanticShorten(line, maxLength) {\n\n    var parts = line.split(/(\\s|-|\\u00AD)/g),\n        part,\n        shortenedParts = [],\n        length = 0;\n\n    // try to shorten via break chars\n    if (parts.length > 1) {\n\n      while ((part = parts.shift())) {\n        if (part.length + length < maxLength) {\n          shortenedParts.push(part);\n          length += part.length;\n        } else {\n\n          // remove previous part, too if hyphen does not fit anymore\n          if (part === '-' || part === SOFT_BREAK) {\n            shortenedParts.pop();\n          }\n\n          break;\n        }\n      }\n    }\n\n    var last = shortenedParts[shortenedParts.length - 1];\n\n    // translate trailing soft break to actual hyphen\n    if (last && last === SOFT_BREAK) {\n      shortenedParts[shortenedParts.length - 1] = '-';\n    }\n\n    return shortenedParts.join('');\n  }\n\n\n  /**\n   * @param {string} line\n   * @param {number} width\n   * @param {number} maxWidth\n   *\n   * @return {string}\n   */\n  function shortenLine(line, width, maxWidth) {\n    var length = Math.max(line.length * (maxWidth / width), 1);\n\n    // try to shorten semantically (i.e. based on spaces and hyphens)\n    var shortenedLine = semanticShorten(line, length);\n\n    if (!shortenedLine) {\n\n      // force shorten by cutting the long word\n      shortenedLine = line.slice(0, Math.max(Math.round(length - 1), 1));\n    }\n\n    return shortenedLine;\n  }\n\n\n  /**\n   * @return {SVGSVGElement}\n   */\n  function getHelperSvg() {\n    var helperSvg = document.getElementById('helper-svg');\n\n    if (!helperSvg) {\n      helperSvg = create$1('svg');\n\n      attr$1(helperSvg, {\n        id: 'helper-svg'\n      });\n\n      assign(helperSvg, {\n        visibility: 'hidden',\n        position: 'fixed',\n        width: 0,\n        height: 0\n      });\n\n      document.body.appendChild(helperSvg);\n    }\n\n    return helperSvg;\n  }\n\n\n  /**\n   * Creates a new label utility\n   *\n   * @param {TextConfig} config\n   */\n  function Text(config) {\n\n    this._config = assign$1({}, {\n      size: DEFAULT_LABEL_SIZE,\n      padding: DEFAULT_BOX_PADDING,\n      style: {},\n      align: 'center-top'\n    }, config || {});\n  }\n\n  /**\n   * Returns the layouted text as an SVG element.\n   *\n   * @param {string} text\n   * @param {TextLayoutConfig} options\n   *\n   * @return {SVGElement}\n   */\n  Text.prototype.createText = function(text, options) {\n    return this.layoutText(text, options).element;\n  };\n\n  /**\n   * Returns a labels layouted dimensions.\n   *\n   * @param {string} text to layout\n   * @param {TextLayoutConfig} options\n   *\n   * @return {Dimensions}\n   */\n  Text.prototype.getDimensions = function(text, options) {\n    return this.layoutText(text, options).dimensions;\n  };\n\n  /**\n   * Creates and returns a label and its bounding box.\n   *\n   * @param {string} text the text to render on the label\n   * @param {TextLayoutConfig} options\n   *\n   * @return { {\n   *   element: SVGElement,\n   *   dimensions: Dimensions\n   * } }\n   */\n  Text.prototype.layoutText = function(text, options) {\n    var box = assign$1({}, this._config.size, options.box),\n        style = assign$1({}, this._config.style, options.style),\n        align = parseAlign(options.align || this._config.align),\n        padding = parsePadding(options.padding !== undefined ? options.padding : this._config.padding),\n        fitBox = options.fitBox || false;\n\n    var lineHeight = getLineHeight(style);\n\n    // we split text by lines and normalize\n    // {soft break} + {line break} => { line break }\n    var lines = text.split(/\\u00AD?\\r?\\n/),\n        layouted = [];\n\n    var maxWidth = box.width - padding.left - padding.right;\n\n    // ensure correct rendering by attaching helper text node to invisible SVG\n    var helperText = create$1('text');\n    attr$1(helperText, { x: 0, y: 0 });\n    attr$1(helperText, style);\n\n    var helperSvg = getHelperSvg();\n\n    append(helperSvg, helperText);\n\n    while (lines.length) {\n      layouted.push(layoutNext(lines, maxWidth, helperText));\n    }\n\n    if (align.vertical === 'middle') {\n      padding.top = padding.bottom = 0;\n    }\n\n    var totalHeight = reduce(layouted, function(sum, line, idx) {\n      return sum + (lineHeight || line.height);\n    }, 0) + padding.top + padding.bottom;\n\n    var maxLineWidth = reduce(layouted, function(sum, line, idx) {\n      return line.width > sum ? line.width : sum;\n    }, 0);\n\n    // the y position of the next line\n    var y = padding.top;\n\n    if (align.vertical === 'middle') {\n      y += (box.height - totalHeight) / 2;\n    }\n\n    // magic number initial offset\n    y -= (lineHeight || layouted[0].height) / 4;\n\n\n    var textElement = create$1('text');\n\n    attr$1(textElement, style);\n\n    // layout each line taking into account that parent\n    // shape might resize to fit text size\n    forEach$1(layouted, function(line) {\n\n      var x;\n\n      y += (lineHeight || line.height);\n\n      switch (align.horizontal) {\n      case 'left':\n        x = padding.left;\n        break;\n\n      case 'right':\n        x = ((fitBox ? maxLineWidth : maxWidth)\n          - padding.right - line.width);\n        break;\n\n      default:\n\n        // aka center\n        x = Math.max((((fitBox ? maxLineWidth : maxWidth)\n          - line.width) / 2 + padding.left), 0);\n      }\n\n      var tspan = create$1('tspan');\n      attr$1(tspan, { x: x, y: y });\n\n      tspan.textContent = line.text;\n\n      append(textElement, tspan);\n    });\n\n    remove$2(helperText);\n\n    var dimensions = {\n      width: maxLineWidth,\n      height: totalHeight\n    };\n\n    return {\n      dimensions: dimensions,\n      element: textElement\n    };\n  };\n\n\n  function getLineHeight(style) {\n    if ('fontSize' in style && 'lineHeight' in style) {\n      return style.lineHeight * parseInt(style.fontSize, 10);\n    }\n  }\n\n  var DEFAULT_FONT_SIZE = 12;\n  var LINE_HEIGHT_RATIO = 1.2;\n\n  var MIN_TEXT_ANNOTATION_HEIGHT = 30;\n\n  /**\n   * @typedef { {\n   *   fontFamily: string;\n   *   fontSize: number;\n   *   fontWeight: string;\n   *   lineHeight: number;\n   * } } TextRendererStyle\n   *\n   * @typedef { {\n   *   defaultStyle?: Partial<TextRendererStyle>;\n   *   externalStyle?: Partial<TextRendererStyle>;\n   * } } TextRendererConfig\n   *\n   * @typedef { import('diagram-js/lib/util/Text').TextLayoutConfig } TextLayoutConfig\n   *\n   * @typedef { import('diagram-js/lib/util/Types').Rect } Rect\n   */\n\n\n  /**\n   * Renders text and computes text bounding boxes.\n   *\n   * @param {TextRendererConfig} [config]\n   */\n  function TextRenderer(config) {\n\n    var defaultStyle = assign$1({\n      fontFamily: 'Arial, sans-serif',\n      fontSize: DEFAULT_FONT_SIZE,\n      fontWeight: 'normal',\n      lineHeight: LINE_HEIGHT_RATIO\n    }, config && config.defaultStyle || {});\n\n    var fontSize = parseInt(defaultStyle.fontSize, 10) - 1;\n\n    var externalStyle = assign$1({}, defaultStyle, {\n      fontSize: fontSize\n    }, config && config.externalStyle || {});\n\n    var textUtil = new Text({\n      style: defaultStyle\n    });\n\n    /**\n     * Get the new bounds of an externally rendered,\n     * layouted label.\n     *\n     * @param {Rect} bounds\n     * @param {string} text\n     *\n     * @return {Rect}\n     */\n    this.getExternalLabelBounds = function(bounds, text) {\n\n      var layoutedDimensions = textUtil.getDimensions(text, {\n        box: {\n          width: 90,\n          height: 30\n        },\n        style: externalStyle\n      });\n\n      // resize label shape to fit label text\n      return {\n        x: Math.round(bounds.x + bounds.width / 2 - layoutedDimensions.width / 2),\n        y: Math.round(bounds.y),\n        width: Math.ceil(layoutedDimensions.width),\n        height: Math.ceil(layoutedDimensions.height)\n      };\n\n    };\n\n    /**\n     * Get the new bounds of text annotation.\n     *\n     * @param {Rect} bounds\n     * @param {string} text\n     *\n     * @return {Rect}\n     */\n    this.getTextAnnotationBounds = function(bounds, text) {\n\n      var layoutedDimensions = textUtil.getDimensions(text, {\n        box: bounds,\n        style: defaultStyle,\n        align: 'left-top',\n        padding: 5\n      });\n\n      return {\n        x: bounds.x,\n        y: bounds.y,\n        width: bounds.width,\n        height: Math.max(MIN_TEXT_ANNOTATION_HEIGHT, Math.round(layoutedDimensions.height))\n      };\n    };\n\n    /**\n     * Create a layouted text element.\n     *\n     * @param {string} text\n     * @param {TextLayoutConfig} [options]\n     *\n     * @return {SVGElement} rendered text\n     */\n    this.createText = function(text, options) {\n      return textUtil.createText(text, options || {});\n    };\n\n    /**\n     * Get default text style.\n     */\n    this.getDefaultStyle = function() {\n      return defaultStyle;\n    };\n\n    /**\n     * Get the external text style.\n     */\n    this.getExternalStyle = function() {\n      return externalStyle;\n    };\n\n  }\n\n  TextRenderer.$inject = [\n    'config.textRenderer'\n  ];\n\n  /**\n   * Map containing SVG paths needed by BpmnRenderer\n   */\n  function PathMap() {\n\n    /**\n     * Contains a map of path elements\n     *\n     * <h1>Path definition</h1>\n     * A parameterized path is defined like this:\n     * <pre>\n     * 'GATEWAY_PARALLEL': {\n     *   d: 'm {mx},{my} {e.x0},0 0,{e.x1} {e.x1},0 0,{e.y0} -{e.x1},0 0,{e.y1} ' +\n            '-{e.x0},0 0,-{e.y1} -{e.x1},0 0,-{e.y0} {e.x1},0 z',\n     *   height: 17.5,\n     *   width:  17.5,\n     *   heightElements: [2.5, 7.5],\n     *   widthElements: [2.5, 7.5]\n     * }\n     * </pre>\n     * <p>It's important to specify a correct <b>height and width</b> for the path as the scaling\n     * is based on the ratio between the specified height and width in this object and the\n     * height and width that is set as scale target (Note x,y coordinates will be scaled with\n     * individual ratios).</p>\n     * <p>The '<b>heightElements</b>' and '<b>widthElements</b>' array must contain the values that will be scaled.\n     * The scaling is based on the computed ratios.\n     * Coordinates on the y axis should be in the <b>heightElement</b>'s array, they will be scaled using\n     * the computed ratio coefficient.\n     * In the parameterized path the scaled values can be accessed through the 'e' object in {} brackets.\n     *   <ul>\n     *    <li>The values for the y axis can be accessed in the path string using {e.y0}, {e.y1}, ....</li>\n     *    <li>The values for the x axis can be accessed in the path string using {e.x0}, {e.x1}, ....</li>\n     *   </ul>\n     *   The numbers x0, x1 respectively y0, y1, ... map to the corresponding array index.\n     * </p>\n     */\n    this.pathMap = {\n      'EVENT_MESSAGE': {\n        d: 'm {mx},{my} l 0,{e.y1} l {e.x1},0 l 0,-{e.y1} z l {e.x0},{e.y0} l {e.x0},-{e.y0}',\n        height: 36,\n        width:  36,\n        heightElements: [ 6, 14 ],\n        widthElements: [ 10.5, 21 ]\n      },\n      'EVENT_SIGNAL': {\n        d: 'M {mx},{my} l {e.x0},{e.y0} l -{e.x1},0 Z',\n        height: 36,\n        width: 36,\n        heightElements: [ 18 ],\n        widthElements: [ 10, 20 ]\n      },\n      'EVENT_ESCALATION': {\n        d: 'M {mx},{my} l {e.x0},{e.y0} l -{e.x0},-{e.y1} l -{e.x0},{e.y1} Z',\n        height: 36,\n        width: 36,\n        heightElements: [ 20, 7 ],\n        widthElements: [ 8 ]\n      },\n      'EVENT_CONDITIONAL': {\n        d: 'M {e.x0},{e.y0} l {e.x1},0 l 0,{e.y2} l -{e.x1},0 Z ' +\n           'M {e.x2},{e.y3} l {e.x0},0 ' +\n           'M {e.x2},{e.y4} l {e.x0},0 ' +\n           'M {e.x2},{e.y5} l {e.x0},0 ' +\n           'M {e.x2},{e.y6} l {e.x0},0 ' +\n           'M {e.x2},{e.y7} l {e.x0},0 ' +\n           'M {e.x2},{e.y8} l {e.x0},0 ',\n        height: 36,\n        width:  36,\n        heightElements: [ 8.5, 14.5, 18, 11.5, 14.5, 17.5, 20.5, 23.5, 26.5 ],\n        widthElements:  [ 10.5, 14.5, 12.5 ]\n      },\n      'EVENT_LINK': {\n        d: 'm {mx},{my} 0,{e.y0} -{e.x1},0 0,{e.y1} {e.x1},0 0,{e.y0} {e.x0},-{e.y2} -{e.x0},-{e.y2} z',\n        height: 36,\n        width: 36,\n        heightElements: [ 4.4375, 6.75, 7.8125 ],\n        widthElements: [ 9.84375, 13.5 ]\n      },\n      'EVENT_ERROR': {\n        d: 'm {mx},{my} {e.x0},-{e.y0} {e.x1},-{e.y1} {e.x2},{e.y2} {e.x3},-{e.y3} -{e.x4},{e.y4} -{e.x5},-{e.y5} z',\n        height: 36,\n        width: 36,\n        heightElements: [ 0.023, 8.737, 8.151, 16.564, 10.591, 8.714 ],\n        widthElements: [ 0.085, 6.672, 6.97, 4.273, 5.337, 6.636 ]\n      },\n      'EVENT_CANCEL_45': {\n        d: 'm {mx},{my} -{e.x1},0 0,{e.x0} {e.x1},0 0,{e.y1} {e.x0},0 ' +\n          '0,-{e.y1} {e.x1},0 0,-{e.y0} -{e.x1},0 0,-{e.y1} -{e.x0},0 z',\n        height: 36,\n        width: 36,\n        heightElements: [ 4.75, 8.5 ],\n        widthElements: [ 4.75, 8.5 ]\n      },\n      'EVENT_COMPENSATION': {\n        d: 'm {mx},{my} {e.x0},-{e.y0} 0,{e.y1} z m {e.x1},-{e.y2} {e.x2},-{e.y3} 0,{e.y1} -{e.x2},-{e.y3} z',\n        height: 36,\n        width: 36,\n        heightElements: [ 6.5, 13, 0.4, 6.1 ],\n        widthElements: [ 9, 9.3, 8.7 ]\n      },\n      'EVENT_TIMER_WH': {\n        d: 'M {mx},{my} l {e.x0},-{e.y0} m -{e.x0},{e.y0} l {e.x1},{e.y1} ',\n        height: 36,\n        width:  36,\n        heightElements: [ 10, 2 ],\n        widthElements: [ 3, 7 ]\n      },\n      'EVENT_TIMER_LINE': {\n        d:  'M {mx},{my} ' +\n            'm {e.x0},{e.y0} l -{e.x1},{e.y1} ',\n        height: 36,\n        width:  36,\n        heightElements: [ 10, 3 ],\n        widthElements: [ 0, 0 ]\n      },\n      'EVENT_MULTIPLE': {\n        d:'m {mx},{my} {e.x1},-{e.y0} {e.x1},{e.y0} -{e.x0},{e.y1} -{e.x2},0 z',\n        height: 36,\n        width:  36,\n        heightElements: [ 6.28099, 12.56199 ],\n        widthElements: [ 3.1405, 9.42149, 12.56198 ]\n      },\n      'EVENT_PARALLEL_MULTIPLE': {\n        d:'m {mx},{my} {e.x0},0 0,{e.y1} {e.x1},0 0,{e.y0} -{e.x1},0 0,{e.y1} ' +\n          '-{e.x0},0 0,-{e.y1} -{e.x1},0 0,-{e.y0} {e.x1},0 z',\n        height: 36,\n        width:  36,\n        heightElements: [ 2.56228, 7.68683 ],\n        widthElements: [ 2.56228, 7.68683 ]\n      },\n      'GATEWAY_EXCLUSIVE': {\n        d:'m {mx},{my} {e.x0},{e.y0} {e.x1},{e.y0} {e.x2},0 {e.x4},{e.y2} ' +\n                      '{e.x4},{e.y1} {e.x2},0 {e.x1},{e.y3} {e.x0},{e.y3} ' +\n                      '{e.x3},0 {e.x5},{e.y1} {e.x5},{e.y2} {e.x3},0 z',\n        height: 17.5,\n        width:  17.5,\n        heightElements: [ 8.5, 6.5312, -6.5312, -8.5 ],\n        widthElements:  [ 6.5, -6.5, 3, -3, 5, -5 ]\n      },\n      'GATEWAY_PARALLEL': {\n        d:'m {mx},{my} 0,{e.y1} -{e.x1},0 0,{e.y0} {e.x1},0 0,{e.y1} {e.x0},0 ' +\n          '0,-{e.y1} {e.x1},0 0,-{e.y0} -{e.x1},0 0,-{e.y1} -{e.x0},0 z',\n        height: 30,\n        width:  30,\n        heightElements: [ 5, 12.5 ],\n        widthElements: [ 5, 12.5 ]\n      },\n      'GATEWAY_EVENT_BASED': {\n        d:'m {mx},{my} {e.x0},{e.y0} {e.x0},{e.y1} {e.x1},{e.y2} {e.x2},0 z',\n        height: 11,\n        width:  11,\n        heightElements: [ -6, 6, 12, -12 ],\n        widthElements: [ 9, -3, -12 ]\n      },\n      'GATEWAY_COMPLEX': {\n        d:'m {mx},{my} 0,{e.y0} -{e.x0},-{e.y1} -{e.x1},{e.y2} {e.x0},{e.y1} -{e.x2},0 0,{e.y3} ' +\n          '{e.x2},0  -{e.x0},{e.y1} l {e.x1},{e.y2} {e.x0},-{e.y1} 0,{e.y0} {e.x3},0 0,-{e.y0} {e.x0},{e.y1} ' +\n          '{e.x1},-{e.y2} -{e.x0},-{e.y1} {e.x2},0 0,-{e.y3} -{e.x2},0 {e.x0},-{e.y1} -{e.x1},-{e.y2} ' +\n          '-{e.x0},{e.y1} 0,-{e.y0} -{e.x3},0 z',\n        height: 17.125,\n        width:  17.125,\n        heightElements: [ 4.875, 3.4375, 2.125, 3 ],\n        widthElements: [ 3.4375, 2.125, 4.875, 3 ]\n      },\n      'DATA_OBJECT_PATH': {\n        d:'m 0,0 {e.x1},0 {e.x0},{e.y0} 0,{e.y1} -{e.x2},0 0,-{e.y2} {e.x1},0 0,{e.y0} {e.x0},0',\n        height: 61,\n        width:  51,\n        heightElements: [ 10, 50, 60 ],\n        widthElements: [ 10, 40, 50, 60 ]\n      },\n      'DATA_OBJECT_COLLECTION_PATH': {\n        d: 'm{mx},{my} m 3,2 l 0,10 m 3,-10 l 0,10 m 3,-10 l 0,10',\n        height: 10,\n        width: 10,\n        heightElements: [],\n        widthElements: []\n      },\n      'DATA_ARROW': {\n        d:'m 5,9 9,0 0,-3 5,5 -5,5 0,-3 -9,0 z',\n        height: 61,\n        width:  51,\n        heightElements: [],\n        widthElements: []\n      },\n      'DATA_STORE': {\n        d:'m  {mx},{my} ' +\n          'l  0,{e.y2} ' +\n          'c  {e.x0},{e.y1} {e.x1},{e.y1}  {e.x2},0 ' +\n          'l  0,-{e.y2} ' +\n          'c -{e.x0},-{e.y1} -{e.x1},-{e.y1} -{e.x2},0' +\n          'c  {e.x0},{e.y1} {e.x1},{e.y1}  {e.x2},0 ' +\n          'm  -{e.x2},{e.y0}' +\n          'c  {e.x0},{e.y1} {e.x1},{e.y1} {e.x2},0' +\n          'm  -{e.x2},{e.y0}' +\n          'c  {e.x0},{e.y1} {e.x1},{e.y1}  {e.x2},0',\n        height: 61,\n        width:  61,\n        heightElements: [ 7, 10, 45 ],\n        widthElements:  [ 2, 58, 60 ]\n      },\n      'TEXT_ANNOTATION': {\n        d: 'm {mx}, {my} m 10,0 l -10,0 l 0,{e.y0} l 10,0',\n        height: 30,\n        width: 10,\n        heightElements: [ 30 ],\n        widthElements: [ 10 ]\n      },\n      'MARKER_SUB_PROCESS': {\n        d: 'm{mx},{my} m 7,2 l 0,10 m -5,-5 l 10,0',\n        height: 10,\n        width: 10,\n        heightElements: [],\n        widthElements: []\n      },\n      'MARKER_PARALLEL': {\n        d: 'm{mx},{my} m 3,2 l 0,10 m 3,-10 l 0,10 m 3,-10 l 0,10',\n        height: 10,\n        width: 10,\n        heightElements: [],\n        widthElements: []\n      },\n      'MARKER_SEQUENTIAL': {\n        d: 'm{mx},{my} m 0,3 l 10,0 m -10,3 l 10,0 m -10,3 l 10,0',\n        height: 10,\n        width: 10,\n        heightElements: [],\n        widthElements: []\n      },\n      'MARKER_COMPENSATION': {\n        d: 'm {mx},{my} 7,-5 0,10 z m 7.1,-0.3 6.9,-4.7 0,10 -6.9,-4.7 z',\n        height: 10,\n        width: 21,\n        heightElements: [],\n        widthElements: []\n      },\n      'MARKER_LOOP': {\n        d: 'm {mx},{my} c 3.526979,0 6.386161,-2.829858 6.386161,-6.320661 0,-3.490806 -2.859182,-6.320661 ' +\n          '-6.386161,-6.320661 -3.526978,0 -6.38616,2.829855 -6.38616,6.320661 0,1.745402 ' +\n          '0.714797,3.325567 1.870463,4.469381 0.577834,0.571908 1.265885,1.034728 2.029916,1.35457 ' +\n          'l -0.718163,-3.909793 m 0.718163,3.909793 -3.885211,0.802902',\n        height: 13.9,\n        width: 13.7,\n        heightElements: [],\n        widthElements: []\n      },\n      'MARKER_ADHOC': {\n        d: 'm {mx},{my} m 0.84461,2.64411 c 1.05533,-1.23780996 2.64337,-2.07882 4.29653,-1.97997996 2.05163,0.0805 ' +\n          '3.85579,1.15803 5.76082,1.79107 1.06385,0.34139996 2.24454,0.1438 3.18759,-0.43767 0.61743,-0.33642 ' +\n          '1.2775,-0.64078 1.7542,-1.17511 0,0.56023 0,1.12046 0,1.6807 -0.98706,0.96237996 -2.29792,1.62393996 ' +\n          '-3.6918,1.66181996 -1.24459,0.0927 -2.46671,-0.2491 -3.59505,-0.74812 -1.35789,-0.55965 ' +\n          '-2.75133,-1.33436996 -4.27027,-1.18121996 -1.37741,0.14601 -2.41842,1.13685996 -3.44288,1.96782996 z',\n        height: 4,\n        width: 15,\n        heightElements: [],\n        widthElements: []\n      },\n      'TASK_TYPE_SEND': {\n        d: 'm {mx},{my} l 0,{e.y1} l {e.x1},0 l 0,-{e.y1} z l {e.x0},{e.y0} l {e.x0},-{e.y0}',\n        height: 14,\n        width:  21,\n        heightElements: [ 6, 14 ],\n        widthElements: [ 10.5, 21 ]\n      },\n      'TASK_TYPE_SCRIPT': {\n        d: 'm {mx},{my} c 9.966553,-6.27276 -8.000926,-7.91932 2.968968,-14.938 l -8.802728,0 ' +\n          'c -10.969894,7.01868 6.997585,8.66524 -2.968967,14.938 z ' +\n          'm -7,-12 l 5,0 ' +\n          'm -4.5,3 l 4.5,0 ' +\n          'm -3,3 l 5,0' +\n          'm -4,3 l 5,0',\n        height: 15,\n        width:  12.6,\n        heightElements: [ 6, 14 ],\n        widthElements: [ 10.5, 21 ]\n      },\n      'TASK_TYPE_USER_1': {\n        d: 'm {mx},{my} c 0.909,-0.845 1.594,-2.049 1.594,-3.385 0,-2.554 -1.805,-4.62199999 ' +\n          '-4.357,-4.62199999 -2.55199998,0 -4.28799998,2.06799999 -4.28799998,4.62199999 0,1.348 ' +\n          '0.974,2.562 1.89599998,3.405 -0.52899998,0.187 -5.669,2.097 -5.794,4.7560005 v 6.718 ' +\n          'h 17 v -6.718 c 0,-2.2980005 -5.5279996,-4.5950005 -6.0509996,-4.7760005 z' +\n          'm -8,6 l 0,5.5 m 11,0 l 0,-5'\n      },\n      'TASK_TYPE_USER_2': {\n        d: 'm {mx},{my} m 2.162,1.009 c 0,2.4470005 -2.158,4.4310005 -4.821,4.4310005 ' +\n          '-2.66499998,0 -4.822,-1.981 -4.822,-4.4310005 '\n      },\n      'TASK_TYPE_USER_3': {\n        d: 'm {mx},{my} m -6.9,-3.80 c 0,0 2.25099998,-2.358 4.27399998,-1.177 2.024,1.181 4.221,1.537 ' +\n          '4.124,0.965 -0.098,-0.57 -0.117,-3.79099999 -4.191,-4.13599999 -3.57499998,0.001 ' +\n          '-4.20799998,3.36699999 -4.20699998,4.34799999 z'\n      },\n      'TASK_TYPE_MANUAL': {\n        d: 'm {mx},{my} c 0.234,-0.01 5.604,0.008 8.029,0.004 0.808,0 1.271,-0.172 1.417,-0.752 0.227,-0.898 ' +\n          '-0.334,-1.314 -1.338,-1.316 -2.467,-0.01 -7.886,-0.004 -8.108,-0.004 -0.014,-0.079 0.016,-0.533 0,-0.61 ' +\n          '0.195,-0.042 8.507,0.006 9.616,0.002 0.877,-0.007 1.35,-0.438 1.353,-1.208 0.003,-0.768 -0.479,-1.09 ' +\n          '-1.35,-1.091 -2.968,-0.002 -9.619,-0.013 -9.619,-0.013 v -0.591 c 0,0 5.052,-0.016 7.225,-0.016 ' +\n          '0.888,-0.002 1.354,-0.416 1.351,-1.193 -0.006,-0.761 -0.492,-1.196 -1.361,-1.196 -3.473,-0.005 ' +\n          '-10.86,-0.003 -11.0829995,-0.003 -0.022,-0.047 -0.045,-0.094 -0.069,-0.139 0.3939995,-0.319 ' +\n          '2.0409995,-1.626 2.4149995,-2.017 0.469,-0.4870005 0.519,-1.1650005 0.162,-1.6040005 -0.414,-0.511 ' +\n          '-0.973,-0.5 -1.48,-0.236 -1.4609995,0.764 -6.5999995,3.6430005 -7.7329995,4.2710005 -0.9,0.499 ' +\n          '-1.516,1.253 -1.882,2.19 -0.37000002,0.95 -0.17,2.01 -0.166,2.979 0.004,0.718 -0.27300002,1.345 ' +\n          '-0.055,2.063 0.629,2.087 2.425,3.312 4.859,3.318 4.6179995,0.014 9.2379995,-0.139 13.8569995,-0.158 ' +\n          '0.755,-0.004 1.171,-0.301 1.182,-1.033 0.012,-0.754 -0.423,-0.969 -1.183,-0.973 -1.778,-0.01 ' +\n          '-5.824,-0.004 -6.04,-0.004 10e-4,-0.084 0.003,-0.586 10e-4,-0.67 z'\n      },\n      'TASK_TYPE_INSTANTIATING_SEND': {\n        d: 'm {mx},{my} l 0,8.4 l 12.6,0 l 0,-8.4 z l 6.3,3.6 l 6.3,-3.6'\n      },\n      'TASK_TYPE_SERVICE': {\n        d: 'm {mx},{my} v -1.71335 c 0.352326,-0.0705 0.703932,-0.17838 1.047628,-0.32133 ' +\n          '0.344416,-0.14465 0.665822,-0.32133 0.966377,-0.52145 l 1.19431,1.18005 1.567487,-1.57688 ' +\n          '-1.195028,-1.18014 c 0.403376,-0.61394 0.683079,-1.29908 0.825447,-2.01824 l 1.622133,-0.01 ' +\n          'v -2.2196 l -1.636514,0.01 c -0.07333,-0.35153 -0.178319,-0.70024 -0.323564,-1.04372 ' +\n          '-0.145244,-0.34406 -0.321407,-0.6644 -0.522735,-0.96217 l 1.131035,-1.13631 -1.583305,-1.56293 ' +\n          '-1.129598,1.13589 c -0.614052,-0.40108 -1.302883,-0.68093 -2.022633,-0.82247 l 0.0093,-1.61852 ' +\n          'h -2.241173 l 0.0042,1.63124 c -0.353763,0.0736 -0.705369,0.17977 -1.049785,0.32371 -0.344415,0.14437 ' +\n          '-0.665102,0.32092 -0.9635006,0.52046 l -1.1698628,-1.15823 -1.5667691,1.5792 1.1684265,1.15669 ' +\n          'c -0.4026573,0.61283 -0.68308,1.29797 -0.8247287,2.01713 l -1.6588041,0.003 v 2.22174 ' +\n          'l 1.6724648,-0.006 c 0.073327,0.35077 0.1797598,0.70243 0.3242851,1.04472 0.1452428,0.34448 ' +\n          '0.3214064,0.6644 0.5227339,0.96066 l -1.1993431,1.19723 1.5840256,1.56011 1.1964668,-1.19348 ' +\n          'c 0.6140517,0.40346 1.3028827,0.68232 2.0233517,0.82331 l 7.19e-4,1.69892 h 2.226848 z ' +\n          'm 0.221462,-3.9957 c -1.788948,0.7502 -3.8576,-0.0928 -4.6097055,-1.87438 -0.7521065,-1.78321 ' +\n          '0.090598,-3.84627 1.8802645,-4.59604 1.78823,-0.74936 3.856881,0.0929 4.608987,1.87437 ' +\n          '0.752106,1.78165 -0.0906,3.84612 -1.879546,4.59605 z'\n      },\n      'TASK_TYPE_SERVICE_FILL': {\n        d: 'm {mx},{my} c -1.788948,0.7502 -3.8576,-0.0928 -4.6097055,-1.87438 -0.7521065,-1.78321 ' +\n          '0.090598,-3.84627 1.8802645,-4.59604 1.78823,-0.74936 3.856881,0.0929 4.608987,1.87437 ' +\n          '0.752106,1.78165 -0.0906,3.84612 -1.879546,4.59605 z'\n      },\n      'TASK_TYPE_BUSINESS_RULE_HEADER': {\n        d: 'm {mx},{my} 0,4 20,0 0,-4 z'\n      },\n      'TASK_TYPE_BUSINESS_RULE_MAIN': {\n        d: 'm {mx},{my} 0,12 20,0 0,-12 z' +\n          'm 0,8 l 20,0 ' +\n          'm -13,-4 l 0,8'\n      },\n      'MESSAGE_FLOW_MARKER': {\n        d: 'm {mx},{my} m -10.5 ,-7 l 0,14 l 21,0 l 0,-14 z l 10.5,6 l 10.5,-6'\n      }\n    };\n\n    /**\n     * Return raw path for the given ID.\n     *\n     * @param {string} pathId\n     *\n     * @return {string} raw path\n     */\n    this.getRawPath = function getRawPath(pathId) {\n      return this.pathMap[pathId].d;\n    };\n\n    /**\n     * Scales the path to the given height and width.\n     * <h1>Use case</h1>\n     * <p>Use case is to scale the content of elements (event, gateways) based\n     * on the element bounding box's size.\n     * </p>\n     * <h1>Why not transform</h1>\n     * <p>Scaling a path with transform() will also scale the stroke and IE does not support\n     * the option 'non-scaling-stroke' to prevent this.\n     * Also there are use cases where only some parts of a path should be\n     * scaled.</p>\n     *\n     * @param {string} pathId The ID of the path.\n     * @param {Object} param <p>\n     *   Example param object scales the path to 60% size of the container (data.width, data.height).\n     *   <pre>\n     *   {\n     *     xScaleFactor: 0.6,\n     *     yScaleFactor:0.6,\n     *     containerWidth: data.width,\n     *     containerHeight: data.height,\n     *     position: {\n     *       mx: 0.46,\n     *       my: 0.2,\n     *     }\n     *   }\n     *   </pre>\n     *   <ul>\n     *    <li>targetpathwidth = xScaleFactor * containerWidth</li>\n     *    <li>targetpathheight = yScaleFactor * containerHeight</li>\n     *    <li>Position is used to set the starting coordinate of the path. M is computed:\n      *    <ul>\n      *      <li>position.x * containerWidth</li>\n      *      <li>position.y * containerHeight</li>\n      *    </ul>\n      *    Center of the container <pre> position: {\n     *       mx: 0.5,\n     *       my: 0.5,\n     *     }</pre>\n     *     Upper left corner of the container\n     *     <pre> position: {\n     *       mx: 0.0,\n     *       my: 0.0,\n     *     }</pre>\n     *    </li>\n     *   </ul>\n     * </p>\n     *\n     * @return {string} scaled path\n     */\n    this.getScaledPath = function getScaledPath(pathId, param) {\n      var rawPath = this.pathMap[pathId];\n\n      // positioning\n      // compute the start point of the path\n      var mx, my;\n\n      if (param.abspos) {\n        mx = param.abspos.x;\n        my = param.abspos.y;\n      } else {\n        mx = param.containerWidth * param.position.mx;\n        my = param.containerHeight * param.position.my;\n      }\n\n      var coordinates = {}; // map for the scaled coordinates\n      if (param.position) {\n\n        // path\n        var heightRatio = (param.containerHeight / rawPath.height) * param.yScaleFactor;\n        var widthRatio = (param.containerWidth / rawPath.width) * param.xScaleFactor;\n\n\n        // Apply height ratio\n        for (var heightIndex = 0; heightIndex < rawPath.heightElements.length; heightIndex++) {\n          coordinates['y' + heightIndex] = rawPath.heightElements[heightIndex] * heightRatio;\n        }\n\n        // Apply width ratio\n        for (var widthIndex = 0; widthIndex < rawPath.widthElements.length; widthIndex++) {\n          coordinates['x' + widthIndex] = rawPath.widthElements[widthIndex] * widthRatio;\n        }\n      }\n\n      // Apply value to raw path\n      var path = format(\n        rawPath.d, {\n          mx: mx,\n          my: my,\n          e: coordinates\n        }\n      );\n      return path;\n    };\n  }\n\n  // helpers //////////////////////\n\n  // copied and adjusted from https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js\n  var tokenRegex = /\\{([^{}]+)\\}/g,\n      objNotationRegex = /(?:(?:^|\\.)(.+?)(?=\\[|\\.|$|\\()|\\[('|\")(.+?)\\2\\])(\\(\\))?/g; // matches .xxxxx or [\"xxxxx\"] to run over object properties\n\n  function replacer(all, key, obj) {\n    var res = obj;\n    key.replace(objNotationRegex, function(all, name, quote, quotedName, isFunc) {\n      name = name || quotedName;\n      if (res) {\n        if (name in res) {\n          res = res[name];\n        }\n        typeof res == 'function' && isFunc && (res = res());\n      }\n    });\n    res = (res == null || res == obj ? all : res) + '';\n\n    return res;\n  }\n\n  function format(str, obj) {\n    return String(str).replace(tokenRegex, function(all, key) {\n      return replacer(all, key, obj);\n    });\n  }\n\n  var DrawModule$1 = {\n    __init__: [ 'bpmnRenderer' ],\n    bpmnRenderer: [ 'type', BpmnRenderer ],\n    textRenderer: [ 'type', TextRenderer ],\n    pathMap: [ 'type', PathMap ]\n  };\n\n  /**\n   * @typedef { {\n   *   [key: string]: string;\n   * } } TranslateReplacements\n   */\n\n  /**\n   * A simple translation stub to be used for multi-language support\n   * in diagrams. Can be easily replaced with a more sophisticated\n   * solution.\n   *\n   * @example\n   *\n   * ```javascript\n   * // use it inside any diagram component by injecting `translate`.\n   *\n   * function MyService(translate) {\n   *   alert(translate('HELLO {you}', { you: 'You!' }));\n   * }\n   * ```\n   *\n   * @param {string} template to interpolate\n   * @param {TranslateReplacements} [replacements] a map with substitutes\n   *\n   * @return {string} the translated string\n   */\n  function translate(template, replacements) {\n\n    replacements = replacements || {};\n\n    return template.replace(/{([^}]+)}/g, function(_, key) {\n      return replacements[key] || '{' + key + '}';\n    });\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var TranslateModule = {\n    translate: [ 'value', translate ]\n  };\n\n  function getDefaultExportFromCjs (x) {\n  \treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n  }\n\n  /**\n   * @param {Point} point\n   *\n   * @returns {Point}\n   */\n  function roundPoint(point) {\n\n    return {\n      x: Math.round(point.x),\n      y: Math.round(point.y)\n    };\n  }\n\n\n  /**\n   * Convert the given bounds to a { top, left, bottom, right } descriptor.\n   *\n   * @param {Point|Rect} bounds\n   *\n   * @return {RectTRBL}\n   */\n  function asTRBL(bounds) {\n    return {\n      top: bounds.y,\n      right: bounds.x + (bounds.width || 0),\n      bottom: bounds.y + (bounds.height || 0),\n      left: bounds.x\n    };\n  }\n\n\n  /**\n   * Convert a { top, left, bottom, right } to an objects bounds.\n   *\n   * @param {RectTRBL} trbl\n   *\n   * @return {Rect}\n   */\n  function asBounds(trbl) {\n    return {\n      x: trbl.left,\n      y: trbl.top,\n      width: trbl.right - trbl.left,\n      height: trbl.bottom - trbl.top\n    };\n  }\n\n\n  /**\n   * Get the mid of the given bounds or point.\n   *\n   * @param {Point|Rect} bounds\n   *\n   * @return {Point}\n   */\n  function getBoundsMid(bounds) {\n    return roundPoint({\n      x: bounds.x + (bounds.width || 0) / 2,\n      y: bounds.y + (bounds.height || 0) / 2\n    });\n  }\n\n\n  /**\n   * Get the mid of the given Connection.\n   *\n   * @param {Connection} connection\n   *\n   * @return {Point}\n   */\n  function getConnectionMid(connection) {\n    var waypoints = connection.waypoints;\n\n    // calculate total length and length of each segment\n    var parts = waypoints.reduce(function(parts, point, index) {\n\n      var lastPoint = waypoints[index - 1];\n\n      if (lastPoint) {\n        var lastPart = parts[parts.length - 1];\n\n        var startLength = lastPart && lastPart.endLength || 0;\n        var length = distance(lastPoint, point);\n\n        parts.push({\n          start: lastPoint,\n          end: point,\n          startLength: startLength,\n          endLength: startLength + length,\n          length: length\n        });\n      }\n\n      return parts;\n    }, []);\n\n    var totalLength = parts.reduce(function(length, part) {\n      return length + part.length;\n    }, 0);\n\n    // find which segement contains middle point\n    var midLength = totalLength / 2;\n\n    var i = 0;\n    var midSegment = parts[i];\n\n    while (midSegment.endLength < midLength) {\n      midSegment = parts[++i];\n    }\n\n    // calculate relative position on mid segment\n    var segmentProgress = (midLength - midSegment.startLength) / midSegment.length;\n\n    var midPoint = {\n      x: midSegment.start.x + (midSegment.end.x - midSegment.start.x) * segmentProgress,\n      y: midSegment.start.y + (midSegment.end.y - midSegment.start.y) * segmentProgress\n    };\n\n    return midPoint;\n  }\n\n\n  /**\n   * Get the mid of the given Element.\n   *\n   * @param {Element} element\n   *\n   * @return {Point}\n   */\n  function getMid(element) {\n    if (isConnection(element)) {\n      return getConnectionMid(element);\n    }\n\n    return getBoundsMid(element);\n  }\n\n  // helpers //////////////////////\n\n  function distance(a, b) {\n    return Math.sqrt(Math.pow(a.x - b.x, 2) + Math.pow(a.y - b.y, 2));\n  }\n\n  function elementToString(e) {\n    if (!e) {\n      return '<null>';\n    }\n\n    return '<' + e.$type + (e.id ? ' id=\"' + e.id : '') + '\" />';\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n   *\n   * @typedef {import('../features/modeling/ElementFactory').default} ElementFactory\n   * @typedef {import('../draw/TextRenderer').default} TextRenderer\n   *\n   * @typedef {import('../model/Types').Element} Element\n   * @typedef {import('../model/Types').Label} Label\n   * @typedef {import('../model/Types').Shape} Shape\n   * @typedef {import('../model/Types').Connection} Connection\n   * @typedef {import('../model/Types').Root} Root\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   */\n\n  /**\n   * @param {ModdleElement} semantic\n   * @param {ModdleElement} di\n   * @param {Object} [attrs=null]\n   *\n   * @return {Object}\n   */\n  function elementData(semantic, di, attrs) {\n    return assign$1({\n      id: semantic.id,\n      type: semantic.$type,\n      businessObject: semantic,\n      di: di\n    }, attrs);\n  }\n\n  function getWaypoints(di, source, target) {\n\n    var waypoints = di.waypoint;\n\n    if (!waypoints || waypoints.length < 2) {\n      return [ getMid(source), getMid(target) ];\n    }\n\n    return waypoints.map(function(p) {\n      return { x: p.x, y: p.y };\n    });\n  }\n\n  function notYetDrawn(translate, semantic, refSemantic, property) {\n    return new Error(translate('element {element} referenced by {referenced}#{property} not yet drawn', {\n      element: elementToString(refSemantic),\n      referenced: elementToString(semantic),\n      property: property\n    }));\n  }\n\n\n  /**\n   * An importer that adds bpmn elements to the canvas\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {ElementFactory} elementFactory\n   * @param {ElementRegistry} elementRegistry\n   * @param {Function} translate\n   * @param {TextRenderer} textRenderer\n   */\n  function BpmnImporter(\n      eventBus, canvas, elementFactory,\n      elementRegistry, translate, textRenderer) {\n\n    this._eventBus = eventBus;\n    this._canvas = canvas;\n    this._elementFactory = elementFactory;\n    this._elementRegistry = elementRegistry;\n    this._translate = translate;\n    this._textRenderer = textRenderer;\n  }\n\n  BpmnImporter.$inject = [\n    'eventBus',\n    'canvas',\n    'elementFactory',\n    'elementRegistry',\n    'translate',\n    'textRenderer'\n  ];\n\n\n  /**\n   * Add a BPMN element (semantic) to the canvas making it a child of the\n   * given parent.\n   *\n   * @param {ModdleElement} semantic\n   * @param {ModdleElement} di\n   * @param {Shape} parentElement\n   *\n   * @return {Shape | Root | Connection}\n   */\n  BpmnImporter.prototype.add = function(semantic, di, parentElement) {\n    var element,\n        translate = this._translate,\n        hidden;\n\n    var parentIndex;\n\n    // ROOT ELEMENT\n    // handle the special case that we deal with a\n    // invisible root element (process, subprocess or collaboration)\n    if (is$1(di, 'bpmndi:BPMNPlane')) {\n\n      var attrs = is$1(semantic, 'bpmn:SubProcess')\n        ? { id: semantic.id + '_plane' }\n        : {};\n\n      // add a virtual element (not being drawn)\n      element = this._elementFactory.createRoot(elementData(semantic, di, attrs));\n\n      this._canvas.addRootElement(element);\n    }\n\n    // SHAPE\n    else if (is$1(di, 'bpmndi:BPMNShape')) {\n\n      var collapsed = !isExpanded(semantic, di),\n          isFrame = isFrameElement$1(semantic);\n\n      hidden = parentElement && (parentElement.hidden || parentElement.collapsed);\n\n      var bounds = di.bounds;\n\n      element = this._elementFactory.createShape(elementData(semantic, di, {\n        collapsed: collapsed,\n        hidden: hidden,\n        x: Math.round(bounds.x),\n        y: Math.round(bounds.y),\n        width: Math.round(bounds.width),\n        height: Math.round(bounds.height),\n        isFrame: isFrame\n      }));\n\n      if (is$1(semantic, 'bpmn:BoundaryEvent')) {\n        this._attachBoundary(semantic, element);\n      }\n\n      // insert lanes behind other flow nodes (cf. #727)\n      if (is$1(semantic, 'bpmn:Lane')) {\n        parentIndex = 0;\n      }\n\n      if (is$1(semantic, 'bpmn:DataStoreReference')) {\n\n        // check whether data store is inside our outside of its semantic parent\n        if (!isPointInsideBBox(parentElement, getMid(bounds))) {\n          parentElement = this._canvas.findRoot(parentElement);\n        }\n      }\n\n      this._canvas.addShape(element, parentElement, parentIndex);\n    }\n\n    // CONNECTION\n    else if (is$1(di, 'bpmndi:BPMNEdge')) {\n\n      var source = this._getSource(semantic),\n          target = this._getTarget(semantic);\n\n      hidden = parentElement && (parentElement.hidden || parentElement.collapsed);\n\n      element = this._elementFactory.createConnection(elementData(semantic, di, {\n        hidden: hidden,\n        source: source,\n        target: target,\n        waypoints: getWaypoints(di, source, target)\n      }));\n\n      if (is$1(semantic, 'bpmn:DataAssociation')) {\n\n        // render always on top; this ensures DataAssociations\n        // are rendered correctly across different \"hacks\" people\n        // love to model such as cross participant / sub process\n        // associations\n        parentElement = this._canvas.findRoot(parentElement);\n      }\n\n      this._canvas.addConnection(element, parentElement, parentIndex);\n    } else {\n      throw new Error(translate('unknown di {di} for element {semantic}', {\n        di: elementToString(di),\n        semantic: elementToString(semantic)\n      }));\n    }\n\n    // (optional) LABEL\n    if (isLabelExternal(semantic) && getLabel(element)) {\n      this.addLabel(semantic, di, element);\n    }\n\n\n    this._eventBus.fire('bpmnElement.added', { element: element });\n\n    return element;\n  };\n\n\n  /**\n   * Attach a boundary element to the given host.\n   *\n   * @param {ModdleElement} boundarySemantic\n   * @param {Shape} boundaryElement\n   */\n  BpmnImporter.prototype._attachBoundary = function(boundarySemantic, boundaryElement) {\n    var translate = this._translate;\n    var hostSemantic = boundarySemantic.attachedToRef;\n\n    if (!hostSemantic) {\n      throw new Error(translate('missing {semantic}#attachedToRef', {\n        semantic: elementToString(boundarySemantic)\n      }));\n    }\n\n    var host = this._elementRegistry.get(hostSemantic.id),\n        attachers = host && host.attachers;\n\n    if (!host) {\n      throw notYetDrawn(translate, boundarySemantic, hostSemantic, 'attachedToRef');\n    }\n\n    // wire element.host <> host.attachers\n    boundaryElement.host = host;\n\n    if (!attachers) {\n      host.attachers = attachers = [];\n    }\n\n    if (attachers.indexOf(boundaryElement) === -1) {\n      attachers.push(boundaryElement);\n    }\n  };\n\n\n  /**\n   * Add a label to a given element.\n   *\n   * @param {ModdleElement} semantic\n   * @param {ModdleElement} di\n   * @param {Element} element\n   *\n   * @return {Label}\n   */\n  BpmnImporter.prototype.addLabel = function(semantic, di, element) {\n    var bounds,\n        text,\n        label;\n\n    bounds = getExternalLabelBounds(di, element);\n\n    text = getLabel(element);\n\n    if (text) {\n\n      // get corrected bounds from actual layouted text\n      bounds = this._textRenderer.getExternalLabelBounds(bounds, text);\n    }\n\n    label = this._elementFactory.createLabel(elementData(semantic, di, {\n      id: semantic.id + '_label',\n      labelTarget: element,\n      type: 'label',\n      hidden: element.hidden || !getLabel(element),\n      x: Math.round(bounds.x),\n      y: Math.round(bounds.y),\n      width: Math.round(bounds.width),\n      height: Math.round(bounds.height)\n    }));\n\n    return this._canvas.addShape(label, element.parent);\n  };\n\n  /**\n   * Get the source or target of the given connection.\n   *\n   * @param {ModdleElement} semantic\n   * @param {'source' | 'target'} side\n   *\n   * @return {Element}\n   */\n  BpmnImporter.prototype._getConnectedElement = function(semantic, side) {\n\n    var element,\n        refSemantic,\n        type = semantic.$type,\n        translate = this._translate;\n\n    refSemantic = semantic[side + 'Ref'];\n\n    // handle mysterious isMany DataAssociation#sourceRef\n    if (side === 'source' && type === 'bpmn:DataInputAssociation') {\n      refSemantic = refSemantic && refSemantic[0];\n    }\n\n    // fix source / target for DataInputAssociation / DataOutputAssociation\n    if (side === 'source' && type === 'bpmn:DataOutputAssociation' ||\n        side === 'target' && type === 'bpmn:DataInputAssociation') {\n\n      refSemantic = semantic.$parent;\n    }\n\n    element = refSemantic && this._getElement(refSemantic);\n\n    if (element) {\n      return element;\n    }\n\n    if (refSemantic) {\n      throw notYetDrawn(translate, semantic, refSemantic, side + 'Ref');\n    } else {\n      throw new Error(translate('{semantic}#{side} Ref not specified', {\n        semantic: elementToString(semantic),\n        side: side\n      }));\n    }\n  };\n\n  BpmnImporter.prototype._getSource = function(semantic) {\n    return this._getConnectedElement(semantic, 'source');\n  };\n\n  BpmnImporter.prototype._getTarget = function(semantic) {\n    return this._getConnectedElement(semantic, 'target');\n  };\n\n\n  BpmnImporter.prototype._getElement = function(semantic) {\n    return this._elementRegistry.get(semantic.id);\n  };\n\n\n  // helpers ////////////////////\n\n  function isPointInsideBBox(bbox, point) {\n    var x = point.x,\n        y = point.y;\n\n    return x >= bbox.x &&\n      x <= bbox.x + bbox.width &&\n      y >= bbox.y &&\n      y <= bbox.y + bbox.height;\n  }\n\n  function isFrameElement$1(semantic) {\n    return is$1(semantic, 'bpmn:Group');\n  }\n\n  var ImportModule = {\n    __depends__: [\n      TranslateModule\n    ],\n    bpmnImporter: [ 'type', BpmnImporter ]\n  };\n\n  var CoreModule$1 = {\n    __depends__: [\n      DrawModule$1,\n      ImportModule\n    ]\n  };\n\n  /**\n   * @typedef {import('../util/Types').Point} Point\n   */\n\n  /**\n   * @param {import('../core/EventBus').Event} event\n   *\n   * @return {Event}\n   */\n  function getOriginal(event) {\n    return event.originalEvent || event.srcEvent;\n  }\n\n  function isMac() {\n    return (/mac/i).test(navigator.platform);\n  }\n\n  /**\n   * @param {MouseEvent} event\n   * @param {string} button\n   *\n   * @return {boolean}\n   */\n  function isButton(event, button) {\n    return (getOriginal(event) || event).button === button;\n  }\n\n  /**\n   * @param {MouseEvent} event\n   *\n   * @return {boolean}\n   */\n  function isPrimaryButton(event) {\n\n    // button === 0 -> left áka primary mouse button\n    return isButton(event, 0);\n  }\n\n  /**\n   * @param {MouseEvent} event\n   *\n   * @return {boolean}\n   */\n  function isAuxiliaryButton(event) {\n\n    // button === 1 -> auxiliary áka wheel button\n    return isButton(event, 1);\n  }\n\n  /**\n   * @param {MouseEvent} event\n   *\n   * @return {boolean}\n   */\n  function hasPrimaryModifier(event) {\n    var originalEvent = getOriginal(event) || event;\n\n    if (!isPrimaryButton(event)) {\n      return false;\n    }\n\n    // Use cmd as primary modifier key for mac OS\n    if (isMac()) {\n      return originalEvent.metaKey;\n    } else {\n      return originalEvent.ctrlKey;\n    }\n  }\n\n  /**\n   * @param {MouseEvent} event\n   *\n   * @return {boolean}\n   */\n  function hasSecondaryModifier(event) {\n    var originalEvent = getOriginal(event) || event;\n\n    return isPrimaryButton(event) && originalEvent.shiftKey;\n  }\n\n  /**\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../../draw/Styles').default} Styles\n   *\n   * @typedef {import('../../util/Types').Point} Point\n   */\n\n  function allowAll(event) { return true; }\n\n  function allowPrimaryAndAuxiliary(event) {\n    return isPrimaryButton(event) || isAuxiliaryButton(event);\n  }\n\n  var LOW_PRIORITY$3 = 500;\n\n\n  /**\n   * A plugin that provides interaction events for diagram elements.\n   *\n   * It emits the following events:\n   *\n   *   * element.click\n   *   * element.contextmenu\n   *   * element.dblclick\n   *   * element.hover\n   *   * element.mousedown\n   *   * element.mousemove\n   *   * element.mouseup\n   *   * element.out\n   *\n   * Each event is a tuple { element, gfx, originalEvent }.\n   *\n   * Canceling the event via Event#preventDefault()\n   * prevents the original DOM operation.\n   *\n   * @param {EventBus} eventBus\n   * @param {ElementRegistry} elementRegistry\n   * @param {Styles} styles\n   */\n  function InteractionEvents(eventBus, elementRegistry, styles) {\n\n    var self = this;\n\n    /**\n     * Fire an interaction event.\n     *\n     * @param {string} type local event name, e.g. element.click.\n     * @param {MouseEvent|TouchEvent} event native event\n     * @param {Element} [element] the diagram element to emit the event on;\n     *                                   defaults to the event target\n     */\n    function fire(type, event, element) {\n\n      if (isIgnored(type, event)) {\n        return;\n      }\n\n      var target, gfx, returnValue;\n\n      if (!element) {\n        target = event.delegateTarget || event.target;\n\n        if (target) {\n          gfx = target;\n          element = elementRegistry.get(gfx);\n        }\n      } else {\n        gfx = elementRegistry.getGraphics(element);\n      }\n\n      if (!gfx || !element) {\n        return;\n      }\n\n      returnValue = eventBus.fire(type, {\n        element: element,\n        gfx: gfx,\n        originalEvent: event\n      });\n\n      if (returnValue === false) {\n        event.stopPropagation();\n        event.preventDefault();\n      }\n    }\n\n    // TODO(nikku): document this\n    var handlers = {};\n\n    function mouseHandler(localEventName) {\n      return handlers[localEventName];\n    }\n\n    function isIgnored(localEventName, event) {\n\n      var filter = ignoredFilters[localEventName] || isPrimaryButton;\n\n      // only react on left mouse button interactions\n      // except for interaction events that are enabled\n      // for secundary mouse button\n      return !filter(event);\n    }\n\n    var bindings = {\n      click: 'element.click',\n      contextmenu: 'element.contextmenu',\n      dblclick: 'element.dblclick',\n      mousedown: 'element.mousedown',\n      mousemove: 'element.mousemove',\n      mouseover: 'element.hover',\n      mouseout: 'element.out',\n      mouseup: 'element.mouseup',\n    };\n\n    var ignoredFilters = {\n      'element.contextmenu': allowAll,\n      'element.mousedown': allowPrimaryAndAuxiliary,\n      'element.mouseup': allowPrimaryAndAuxiliary,\n      'element.click': allowPrimaryAndAuxiliary,\n      'element.dblclick': allowPrimaryAndAuxiliary\n    };\n\n\n    // manual event trigger //////////\n\n    /**\n     * Trigger an interaction event (based on a native dom event)\n     * on the target shape or connection.\n     *\n     * @param {string} eventName the name of the triggered DOM event\n     * @param {MouseEvent|TouchEvent} event\n     * @param {Element} targetElement\n     */\n    function triggerMouseEvent(eventName, event, targetElement) {\n\n      // i.e. element.mousedown...\n      var localEventName = bindings[eventName];\n\n      if (!localEventName) {\n        throw new Error('unmapped DOM event name <' + eventName + '>');\n      }\n\n      return fire(localEventName, event, targetElement);\n    }\n\n\n    var ELEMENT_SELECTOR = 'svg, .djs-element';\n\n    // event handling ///////\n\n    function registerEvent(node, event, localEvent, ignoredFilter) {\n\n      var handler = handlers[localEvent] = function(event) {\n        fire(localEvent, event);\n      };\n\n      if (ignoredFilter) {\n        ignoredFilters[localEvent] = ignoredFilter;\n      }\n\n      handler.$delegate = delegate.bind(node, ELEMENT_SELECTOR, event, handler);\n    }\n\n    function unregisterEvent(node, event, localEvent) {\n\n      var handler = mouseHandler(localEvent);\n\n      if (!handler) {\n        return;\n      }\n\n      delegate.unbind(node, event, handler.$delegate);\n    }\n\n    function registerEvents(svg) {\n      forEach$1(bindings, function(val, key) {\n        registerEvent(svg, key, val);\n      });\n    }\n\n    function unregisterEvents(svg) {\n      forEach$1(bindings, function(val, key) {\n        unregisterEvent(svg, key, val);\n      });\n    }\n\n    eventBus.on('canvas.destroy', function(event) {\n      unregisterEvents(event.svg);\n    });\n\n    eventBus.on('canvas.init', function(event) {\n      registerEvents(event.svg);\n    });\n\n\n    // hit box updating ////////////////\n\n    eventBus.on([ 'shape.added', 'connection.added' ], function(event) {\n      var element = event.element,\n          gfx = event.gfx;\n\n      eventBus.fire('interactionEvents.createHit', { element: element, gfx: gfx });\n    });\n\n    // Update djs-hit on change.\n    // A low priortity is necessary, because djs-hit of labels has to be updated\n    // after the label bounds have been updated in the renderer.\n    eventBus.on([\n      'shape.changed',\n      'connection.changed'\n    ], LOW_PRIORITY$3, function(event) {\n\n      var element = event.element,\n          gfx = event.gfx;\n\n      eventBus.fire('interactionEvents.updateHit', { element: element, gfx: gfx });\n    });\n\n    eventBus.on('interactionEvents.createHit', LOW_PRIORITY$3, function(event) {\n      var element = event.element,\n          gfx = event.gfx;\n\n      self.createDefaultHit(element, gfx);\n    });\n\n    eventBus.on('interactionEvents.updateHit', function(event) {\n      var element = event.element,\n          gfx = event.gfx;\n\n      self.updateDefaultHit(element, gfx);\n    });\n\n\n    // hit styles ////////////\n\n    var STROKE_HIT_STYLE = createHitStyle('djs-hit djs-hit-stroke');\n\n    var CLICK_STROKE_HIT_STYLE = createHitStyle('djs-hit djs-hit-click-stroke');\n\n    var ALL_HIT_STYLE = createHitStyle('djs-hit djs-hit-all');\n\n    var NO_MOVE_HIT_STYLE = createHitStyle('djs-hit djs-hit-no-move');\n\n    var HIT_TYPES = {\n      'all': ALL_HIT_STYLE,\n      'click-stroke': CLICK_STROKE_HIT_STYLE,\n      'stroke': STROKE_HIT_STYLE,\n      'no-move': NO_MOVE_HIT_STYLE\n    };\n\n    function createHitStyle(classNames, attrs) {\n\n      attrs = assign$1({\n        stroke: 'white',\n        strokeWidth: 15\n      }, attrs || {});\n\n      return styles.cls(classNames, [ 'no-fill', 'no-border' ], attrs);\n    }\n\n\n    // style helpers ///////////////\n\n    function applyStyle(hit, type) {\n\n      var attrs = HIT_TYPES[type];\n\n      if (!attrs) {\n        throw new Error('invalid hit type <' + type + '>');\n      }\n\n      attr$1(hit, attrs);\n\n      return hit;\n    }\n\n    function appendHit(gfx, hit) {\n      append(gfx, hit);\n    }\n\n\n    // API\n\n    /**\n     * Remove hints on the given graphics.\n     *\n     * @param {SVGElement} gfx\n     */\n    this.removeHits = function(gfx) {\n      var hits = all('.djs-hit', gfx);\n\n      forEach$1(hits, remove$2);\n    };\n\n    /**\n     * Create default hit for the given element.\n     *\n     * @param {Element} element\n     * @param {SVGElement} gfx\n     *\n     * @return {SVGElement} created hit\n     */\n    this.createDefaultHit = function(element, gfx) {\n      var waypoints = element.waypoints,\n          isFrame = element.isFrame,\n          boxType;\n\n      if (waypoints) {\n        return this.createWaypointsHit(gfx, waypoints);\n      } else {\n\n        boxType = isFrame ? 'stroke' : 'all';\n\n        return this.createBoxHit(gfx, boxType, {\n          width: element.width,\n          height: element.height\n        });\n      }\n    };\n\n    /**\n     * Create hits for the given waypoints.\n     *\n     * @param {SVGElement} gfx\n     * @param {Point[]} waypoints\n     *\n     * @return {SVGElement}\n     */\n    this.createWaypointsHit = function(gfx, waypoints) {\n\n      var hit = createLine(waypoints);\n\n      applyStyle(hit, 'stroke');\n\n      appendHit(gfx, hit);\n\n      return hit;\n    };\n\n    /**\n     * Create hits for a box.\n     *\n     * @param {SVGElement} gfx\n     * @param {string} type\n     * @param {Object} attrs\n     *\n     * @return {SVGElement}\n     */\n    this.createBoxHit = function(gfx, type, attrs) {\n\n      attrs = assign$1({\n        x: 0,\n        y: 0\n      }, attrs);\n\n      var hit = create$1('rect');\n\n      applyStyle(hit, type);\n\n      attr$1(hit, attrs);\n\n      appendHit(gfx, hit);\n\n      return hit;\n    };\n\n    /**\n     * Update default hit of the element.\n     *\n     * @param {Element} element\n     * @param {SVGElement} gfx\n     *\n     * @return {SVGElement} updated hit\n     */\n    this.updateDefaultHit = function(element, gfx) {\n\n      var hit = query('.djs-hit', gfx);\n\n      if (!hit) {\n        return;\n      }\n\n      if (element.waypoints) {\n        updateLine(hit, element.waypoints);\n      } else {\n        attr$1(hit, {\n          width: element.width,\n          height: element.height\n        });\n      }\n\n      return hit;\n    };\n\n    this.fire = fire;\n\n    this.triggerMouseEvent = triggerMouseEvent;\n\n    this.mouseHandler = mouseHandler;\n\n    this.registerEvent = registerEvent;\n    this.unregisterEvent = unregisterEvent;\n  }\n\n\n  InteractionEvents.$inject = [\n    'eventBus',\n    'elementRegistry',\n    'styles'\n  ];\n\n\n  /**\n   * An event indicating that the mouse hovered over an element\n   *\n   * @event element.hover\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * An event indicating that the mouse has left an element\n   *\n   * @event element.out\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * An event indicating that the mouse has clicked an element\n   *\n   * @event element.click\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * An event indicating that the mouse has double clicked an element\n   *\n   * @event element.dblclick\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * An event indicating that the mouse has gone down on an element.\n   *\n   * @event element.mousedown\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * An event indicating that the mouse has gone up on an element.\n   *\n   * @event element.mouseup\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * An event indicating that the context menu action is triggered\n   * via mouse or touch controls.\n   *\n   * @event element.contextmenu\n   *\n   * @type {Object}\n   * @property {Element} element\n   * @property {SVGElement} gfx\n   * @property {Event} originalEvent\n   */\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var InteractionEventsModule = {\n    __init__: [ 'interactionEvents' ],\n    interactionEvents: [ 'type', InteractionEvents ]\n  };\n\n  /**\n   * Returns the surrounding bbox for all elements in\n   * the array or the element primitive.\n   *\n   * @param {Element|Element[]} elements\n   * @param {boolean} [stopRecursion=false]\n   *\n   * @return {Rect}\n   */\n  function getBBox(elements, stopRecursion) {\n\n    stopRecursion = !!stopRecursion;\n    if (!isArray$2(elements)) {\n      elements = [ elements ];\n    }\n\n    var minX,\n        minY,\n        maxX,\n        maxY;\n\n    forEach$1(elements, function(element) {\n\n      // If element is a connection the bbox must be computed first\n      var bbox = element;\n      if (element.waypoints && !stopRecursion) {\n        bbox = getBBox(element.waypoints, true);\n      }\n\n      var x = bbox.x,\n          y = bbox.y,\n          height = bbox.height || 0,\n          width = bbox.width || 0;\n\n      if (x < minX || minX === undefined) {\n        minX = x;\n      }\n      if (y < minY || minY === undefined) {\n        minY = y;\n      }\n\n      if ((x + width) > maxX || maxX === undefined) {\n        maxX = x + width;\n      }\n      if ((y + height) > maxY || maxY === undefined) {\n        maxY = y + height;\n      }\n    });\n\n    return {\n      x: minX,\n      y: minY,\n      height: maxY - minY,\n      width: maxX - minX\n    };\n  }\n\n  /**\n   * Get the element's type\n   *\n   * @param {Element} element\n   *\n   * @return {'connection' | 'shape' | 'root'}\n   */\n  function getType(element) {\n\n    if ('waypoints' in element) {\n      return 'connection';\n    }\n\n    if ('x' in element) {\n      return 'shape';\n    }\n\n    return 'root';\n  }\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  function isFrameElement(element) {\n    return !!(element && element.isFrame);\n  }\n\n  var LOW_PRIORITY$2 = 500;\n\n  /**\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../../draw/Styles').default} Styles\n   */\n\n  /**\n   * @class\n   *\n   * A plugin that adds an outline to shapes and connections that may be activated and styled\n   * via CSS classes.\n   *\n   * @param {EventBus} eventBus\n   * @param {Styles} styles\n   */\n  function Outline(eventBus, styles) {\n\n    this.offset = 6;\n\n    var OUTLINE_STYLE = styles.cls('djs-outline', [ 'no-fill' ]);\n\n    var self = this;\n\n    function createOutline(gfx, bounds) {\n      var outline = create$1('rect');\n\n      attr$1(outline, assign$1({\n        x: 10,\n        y: 10,\n        rx: 4,\n        width: 100,\n        height: 100\n      }, OUTLINE_STYLE));\n\n      append(gfx, outline);\n\n      return outline;\n    }\n\n    // A low priortity is necessary, because outlines of labels have to be updated\n    // after the label bounds have been updated in the renderer.\n    eventBus.on([ 'shape.added', 'shape.changed' ], LOW_PRIORITY$2, function(event) {\n      var element = event.element,\n          gfx = event.gfx;\n\n      var outline = query('.djs-outline', gfx);\n\n      if (!outline) {\n        outline = createOutline(gfx);\n      }\n\n      self.updateShapeOutline(outline, element);\n    });\n\n    eventBus.on([ 'connection.added', 'connection.changed' ], function(event) {\n      var element = event.element,\n          gfx = event.gfx;\n\n      var outline = query('.djs-outline', gfx);\n\n      if (!outline) {\n        outline = createOutline(gfx);\n      }\n\n      self.updateConnectionOutline(outline, element);\n    });\n  }\n\n\n  /**\n   * Updates the outline of a shape respecting the dimension of the\n   * element and an outline offset.\n   *\n   * @param {SVGElement} outline\n   * @param {Element} element\n   */\n  Outline.prototype.updateShapeOutline = function(outline, element) {\n\n    attr$1(outline, {\n      x: -this.offset,\n      y: -this.offset,\n      width: element.width + this.offset * 2,\n      height: element.height + this.offset * 2\n    });\n\n  };\n\n\n  /**\n   * Updates the outline of a connection respecting the bounding box of\n   * the connection and an outline offset.\n   *\n   * @param {SVGElement} outline\n   * @param {Element} connection\n   */\n  Outline.prototype.updateConnectionOutline = function(outline, connection) {\n\n    var bbox = getBBox(connection);\n\n    attr$1(outline, {\n      x: bbox.x - this.offset,\n      y: bbox.y - this.offset,\n      width: bbox.width + this.offset * 2,\n      height: bbox.height + this.offset * 2\n    });\n\n  };\n\n\n  Outline.$inject = [ 'eventBus', 'styles', 'elementRegistry' ];\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var OutlineModule = {\n    __init__: [ 'outline' ],\n    outline: [ 'type', Outline ]\n  };\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   */\n\n  /**\n   * A service that offers the current selection in a diagram.\n   * Offers the api to control the selection, too.\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   */\n  function Selection(eventBus, canvas) {\n\n    this._eventBus = eventBus;\n    this._canvas = canvas;\n\n    /**\n     * @type {Object[]}\n     */\n    this._selectedElements = [];\n\n    var self = this;\n\n    eventBus.on([ 'shape.remove', 'connection.remove' ], function(e) {\n      var element = e.element;\n      self.deselect(element);\n    });\n\n    eventBus.on([ 'diagram.clear', 'root.set' ], function(e) {\n      self.select(null);\n    });\n  }\n\n  Selection.$inject = [ 'eventBus', 'canvas' ];\n\n  /**\n   * Deselect an element.\n   *\n   * @param {Object} element The element to deselect.\n   */\n  Selection.prototype.deselect = function(element) {\n    var selectedElements = this._selectedElements;\n\n    var idx = selectedElements.indexOf(element);\n\n    if (idx !== -1) {\n      var oldSelection = selectedElements.slice();\n\n      selectedElements.splice(idx, 1);\n\n      this._eventBus.fire('selection.changed', { oldSelection: oldSelection, newSelection: selectedElements });\n    }\n  };\n\n  /**\n   * Get the selected elements.\n   *\n   * @return {Object[]} The selected elements.\n   */\n  Selection.prototype.get = function() {\n    return this._selectedElements;\n  };\n\n  /**\n   * Check whether an element is selected.\n   *\n   * @param {Object} element The element.\n   *\n   * @return {boolean} Whether the element is selected.\n   */\n  Selection.prototype.isSelected = function(element) {\n    return this._selectedElements.indexOf(element) !== -1;\n  };\n\n\n  /**\n   * Select one or many elements.\n   *\n   * @param {Object|Object[]} elements The element(s) to select.\n   * @param {boolean} [add] Whether to add the element(s) to the selected elements.\n   * Defaults to `false`.\n   */\n  Selection.prototype.select = function(elements, add) {\n    var selectedElements = this._selectedElements,\n        oldSelection = selectedElements.slice();\n\n    if (!isArray$2(elements)) {\n      elements = elements ? [ elements ] : [];\n    }\n\n    var canvas = this._canvas;\n\n    var rootElement = canvas.getRootElement();\n\n    elements = elements.filter(function(element) {\n      var elementRoot = canvas.findRoot(element);\n\n      return rootElement === elementRoot;\n    });\n\n    // selection may be cleared by passing an empty array or null\n    // to the method\n    if (add) {\n      forEach$1(elements, function(element) {\n        if (selectedElements.indexOf(element) !== -1) {\n\n          // already selected\n          return;\n        } else {\n          selectedElements.push(element);\n        }\n      });\n    } else {\n      this._selectedElements = selectedElements = elements.slice();\n    }\n\n    this._eventBus.fire('selection.changed', { oldSelection: oldSelection, newSelection: selectedElements });\n  };\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('./Selection').default} Selection\n   */\n\n  var MARKER_HOVER = 'hover',\n      MARKER_SELECTED = 'selected';\n\n  var SELECTION_OUTLINE_PADDING = 6;\n\n\n  /**\n   * A plugin that adds a visible selection UI to shapes and connections\n   * by appending the <code>hover</code> and <code>selected</code> classes to them.\n   *\n   * @class\n   *\n   * Makes elements selectable, too.\n   *\n   * @param {Canvas} canvas\n   * @param {EventBus} eventBus\n   * @param {Selection} selection\n   */\n  function SelectionVisuals(canvas, eventBus, selection) {\n    this._canvas = canvas;\n\n    var self = this;\n\n    this._multiSelectionBox = null;\n\n    function addMarker(e, cls) {\n      canvas.addMarker(e, cls);\n    }\n\n    function removeMarker(e, cls) {\n      canvas.removeMarker(e, cls);\n    }\n\n    eventBus.on('element.hover', function(event) {\n      addMarker(event.element, MARKER_HOVER);\n    });\n\n    eventBus.on('element.out', function(event) {\n      removeMarker(event.element, MARKER_HOVER);\n    });\n\n    eventBus.on('selection.changed', function(event) {\n\n      function deselect(s) {\n        removeMarker(s, MARKER_SELECTED);\n      }\n\n      function select(s) {\n        addMarker(s, MARKER_SELECTED);\n      }\n\n      var oldSelection = event.oldSelection,\n          newSelection = event.newSelection;\n\n      forEach$1(oldSelection, function(e) {\n        if (newSelection.indexOf(e) === -1) {\n          deselect(e);\n        }\n      });\n\n      forEach$1(newSelection, function(e) {\n        if (oldSelection.indexOf(e) === -1) {\n          select(e);\n        }\n      });\n\n      self._updateSelectionOutline(newSelection);\n    });\n\n\n    eventBus.on('element.changed', function(event) {\n      if (selection.isSelected(event.element)) {\n        self._updateSelectionOutline(selection.get());\n      }\n    });\n  }\n\n  SelectionVisuals.$inject = [\n    'canvas',\n    'eventBus',\n    'selection'\n  ];\n\n  SelectionVisuals.prototype._updateSelectionOutline = function(selection) {\n    var layer = this._canvas.getLayer('selectionOutline');\n\n    clear$1(layer);\n\n    var enabled = selection.length > 1;\n\n    var container = this._canvas.getContainer();\n\n    classes$1(container)[enabled ? 'add' : 'remove']('djs-multi-select');\n\n    if (!enabled) {\n      return;\n    }\n\n    var bBox = addSelectionOutlinePadding(getBBox(selection));\n\n    var rect = create$1('rect');\n\n    attr$1(rect, assign$1({\n      rx: 3\n    }, bBox));\n\n    classes$1(rect).add('djs-selection-outline');\n\n    append(layer, rect);\n  };\n\n  // helpers //////////\n\n  function addSelectionOutlinePadding(bBox) {\n    return {\n      x: bBox.x - SELECTION_OUTLINE_PADDING,\n      y: bBox.y - SELECTION_OUTLINE_PADDING,\n      width: bBox.width + SELECTION_OUTLINE_PADDING * 2,\n      height: bBox.height + SELECTION_OUTLINE_PADDING * 2\n    };\n  }\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('./Selection').default} Selection\n   */\n\n  /**\n   * @param {EventBus} eventBus\n   * @param {Selection} selection\n   * @param {Canvas} canvas\n   * @param {ElementRegistry} elementRegistry\n   */\n  function SelectionBehavior(eventBus, selection, canvas, elementRegistry) {\n\n    // Select elements on create\n    eventBus.on('create.end', 500, function(event) {\n      var context = event.context,\n          canExecute = context.canExecute,\n          elements = context.elements,\n          hints = context.hints || {},\n          autoSelect = hints.autoSelect;\n\n      if (canExecute) {\n        if (autoSelect === false) {\n\n          // Select no elements\n          return;\n        }\n\n        if (isArray$2(autoSelect)) {\n          selection.select(autoSelect);\n        } else {\n\n          // Select all elements by default\n          selection.select(elements.filter(isShown));\n        }\n      }\n    });\n\n    // Select connection targets on connect\n    eventBus.on('connect.end', 500, function(event) {\n      var context = event.context,\n          connection = context.connection;\n\n      if (connection) {\n        selection.select(connection);\n      }\n    });\n\n    // Select shapes on move\n    eventBus.on('shape.move.end', 500, function(event) {\n      var previousSelection = event.previousSelection || [];\n\n      var shape = elementRegistry.get(event.context.shape.id);\n\n      // Always select main shape on move\n      var isSelected = find(previousSelection, function(selectedShape) {\n        return shape.id === selectedShape.id;\n      });\n\n      if (!isSelected) {\n        selection.select(shape);\n      }\n    });\n\n    // Select elements on click\n    eventBus.on('element.click', function(event) {\n\n      if (!isPrimaryButton(event)) {\n        return;\n      }\n\n      var element = event.element;\n\n      if (element === canvas.getRootElement()) {\n        element = null;\n      }\n\n      var isSelected = selection.isSelected(element),\n          isMultiSelect = selection.get().length > 1;\n\n      // Add to selection if CTRL or SHIFT pressed\n      var add = hasPrimaryModifier(event) || hasSecondaryModifier(event);\n\n      if (isSelected && isMultiSelect) {\n        if (add) {\n\n          // Deselect element\n          return selection.deselect(element);\n        } else {\n\n          // Select element only\n          return selection.select(element);\n        }\n      } else if (!isSelected) {\n\n        // Select element\n        selection.select(element, add);\n      } else {\n\n        // Deselect element\n        selection.deselect(element);\n      }\n    });\n  }\n\n  SelectionBehavior.$inject = [\n    'eventBus',\n    'selection',\n    'canvas',\n    'elementRegistry'\n  ];\n\n\n  function isShown(element) {\n    return !element.hidden;\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var SelectionModule = {\n    __init__: [ 'selectionVisuals', 'selectionBehavior' ],\n    __depends__: [\n      InteractionEventsModule,\n      OutlineModule\n    ],\n    selection: [ 'type', Selection ],\n    selectionVisuals: [ 'type', SelectionVisuals ],\n    selectionBehavior: [ 'type', SelectionBehavior ]\n  };\n\n  /**\n   * Util that provides unique IDs.\n   *\n   * @class\n   * @constructor\n   *\n   * The ids can be customized via a given prefix and contain a random value to avoid collisions.\n   *\n   * @param {string} [prefix] a prefix to prepend to generated ids (for better readability)\n   */\n  function IdGenerator(prefix) {\n\n    this._counter = 0;\n    this._prefix = (prefix ? prefix + '-' : '') + Math.floor(Math.random() * 1000000000) + '-';\n  }\n\n  /**\n   * Returns a next unique ID.\n   *\n   * @return {string} the id\n   */\n  IdGenerator.prototype.next = function() {\n    return this._prefix + (++this._counter);\n  };\n\n  // document wide unique overlay ids\n  var ids = new IdGenerator('ov');\n\n  var LOW_PRIORITY$1 = 500;\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../../core/EventBus').default} EventBus\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   *\n   * @typedef { {\n   *   minZoom?: number,\n   *   maxZoom?: number\n   * } } OverlaysConfigShow\n   *\n   * @typedef { {\n   *   min?: number,\n   *   max?: number\n   * } } OverlaysConfigScale\n   *\n   * @typedef { {\n  *   id: string,\n  *   type: string | null,\n  *   element: Element | string\n  * } & OverlayAttrs } Overlay\n  *\n   * @typedef { {\n   *   html: HTMLElement | string,\n   *   position: {\n   *     top?: number,\n   *     right?: number,\n   *     bottom?: number,\n   *     left?: number\n   *   }\n   * } & OverlaysConfigDefault } OverlayAttrs\n   *\n   * @typedef { {\n   *   html: HTMLElement,\n   *   element: Element,\n   *   overlays: Overlay[]\n   * } } OverlayContainer\n   *\n   * @typedef {{\n   *   defaults?: OverlaysConfigDefault\n   * }} OverlaysConfig\n   *\n   * @typedef { {\n   *  show?: OverlaysConfigShow,\n   *  scale?: OverlaysConfigScale | boolean\n   * } } OverlaysConfigDefault\n   *\n   * @typedef { {\n   *   id?: string;\n   *   element?: Element | string;\n   *   type?: string;\n   * } | string } OverlaysFilter\n   */\n\n  /**\n   * A service that allows users to attach overlays to diagram elements.\n   *\n   * The overlay service will take care of overlay positioning during updates.\n   *\n   * @example\n   *\n   * ```javascript\n   * // add a pink badge on the top left of the shape\n   *\n   * overlays.add(someShape, {\n   *   position: {\n   *     top: -5,\n   *     left: -5\n   *   },\n   *   html: '<div style=\"width: 10px; background: fuchsia; color: white;\">0</div>'\n   * });\n   *\n   * // or add via shape id\n   *\n   * overlays.add('some-element-id', {\n   *   position: {\n   *     top: -5,\n   *     left: -5\n   *   }\n   *   html: '<div style=\"width: 10px; background: fuchsia; color: white;\">0</div>'\n   * });\n   *\n   * // or add with optional type\n   *\n   * overlays.add(someShape, 'badge', {\n   *   position: {\n   *     top: -5,\n   *     left: -5\n   *   }\n   *   html: '<div style=\"width: 10px; background: fuchsia; color: white;\">0</div>'\n   * });\n   * ```\n   *\n   * ```javascript\n   * // remove an overlay\n   *\n   * var id = overlays.add(...);\n   * overlays.remove(id);\n   *\n   *\n   * You may configure overlay defaults during tool by providing a `config` module\n   * with `overlays.defaults` as an entry:\n   *\n   * {\n   *   overlays: {\n   *     defaults: {\n   *       show: {\n   *         minZoom: 0.7,\n   *         maxZoom: 5.0\n   *       },\n   *       scale: {\n   *         min: 1\n   *       }\n   *     }\n   * }\n   * ```\n   *\n   * @param {OverlaysConfig} config\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {ElementRegistry} elementRegistry\n   */\n  function Overlays(config, eventBus, canvas, elementRegistry) {\n    this._eventBus = eventBus;\n    this._canvas = canvas;\n    this._elementRegistry = elementRegistry;\n\n    this._ids = ids;\n\n    /**\n     * @type {OverlaysConfigDefault}\n     */\n    this._overlayDefaults = assign$1({\n\n      // no show constraints\n      show: null,\n\n      // always scale\n      scale: true\n    }, config && config.defaults);\n\n    /**\n     * @type {Map<string, Overlay>}\n     */\n    this._overlays = {};\n\n    /**\n     * @type {OverlayContainer[]}\n     */\n    this._overlayContainers = [];\n\n    /**\n     * @type {HTMLElement}\n     */\n    this._overlayRoot = createRoot(canvas.getContainer());\n\n    this._init();\n  }\n\n\n  Overlays.$inject = [\n    'config.overlays',\n    'eventBus',\n    'canvas',\n    'elementRegistry'\n  ];\n\n\n  /**\n   * Returns the overlay with the specified ID or a list of overlays\n   * for an element with a given type.\n   *\n   * @example\n   *\n   * ```javascript\n   * // return the single overlay with the given ID\n   * overlays.get('some-id');\n   *\n   * // return all overlays for the shape\n   * overlays.get({ element: someShape });\n   *\n   * // return all overlays on shape with type 'badge'\n   * overlays.get({ element: someShape, type: 'badge' });\n   *\n   * // shape can also be specified as ID\n   * overlays.get({ element: 'element-id', type: 'badge' });\n   * ```\n   *\n   * @param {OverlaysFilter} search The filter to be used to find the overlay(s).\n   *\n   * @return {Overlay|Overlay[]} The overlay(s).\n   */\n  Overlays.prototype.get = function(search) {\n\n    if (isString(search)) {\n      search = { id: search };\n    }\n\n    if (isString(search.element)) {\n      search.element = this._elementRegistry.get(search.element);\n    }\n\n    if (search.element) {\n      var container = this._getOverlayContainer(search.element, true);\n\n      // return a list of overlays when searching by element (+type)\n      if (container) {\n        return search.type ? filter(container.overlays, matchPattern({ type: search.type })) : container.overlays.slice();\n      } else {\n        return [];\n      }\n    } else\n    if (search.type) {\n      return filter(this._overlays, matchPattern({ type: search.type }));\n    } else {\n\n      // return single element when searching by id\n      return search.id ? this._overlays[search.id] : null;\n    }\n  };\n\n  /**\n   * Adds an HTML overlay to an element.\n   *\n   * @param {Element|string} element The element to add the overlay to.\n   * @param {string} [type] An optional type that can be used to filter.\n   * @param {OverlayAttrs} overlay The overlay.\n   *\n   * @return {string} The overlay's ID that can be used to get or remove it.\n   */\n  Overlays.prototype.add = function(element, type, overlay) {\n\n    if (isObject(type)) {\n      overlay = type;\n      type = null;\n    }\n\n    if (!element.id) {\n      element = this._elementRegistry.get(element);\n    }\n\n    if (!overlay.position) {\n      throw new Error('must specifiy overlay position');\n    }\n\n    if (!overlay.html) {\n      throw new Error('must specifiy overlay html');\n    }\n\n    if (!element) {\n      throw new Error('invalid element specified');\n    }\n\n    var id = this._ids.next();\n\n    overlay = assign$1({}, this._overlayDefaults, overlay, {\n      id: id,\n      type: type,\n      element: element,\n      html: overlay.html\n    });\n\n    this._addOverlay(overlay);\n\n    return id;\n  };\n\n\n  /**\n   * Remove an overlay with the given ID or all overlays matching the given filter.\n   *\n   * @see Overlays#get for filter options.\n   *\n   * @param {OverlaysFilter} filter The filter to be used to find the overlay.\n   */\n  Overlays.prototype.remove = function(filter) {\n\n    var overlays = this.get(filter) || [];\n\n    if (!isArray$2(overlays)) {\n      overlays = [ overlays ];\n    }\n\n    var self = this;\n\n    forEach$1(overlays, function(overlay) {\n\n      var container = self._getOverlayContainer(overlay.element, true);\n\n      if (overlay) {\n        remove$1(overlay.html);\n        remove$1(overlay.htmlContainer);\n\n        delete overlay.htmlContainer;\n        delete overlay.element;\n\n        delete self._overlays[overlay.id];\n      }\n\n      if (container) {\n        var idx = container.overlays.indexOf(overlay);\n        if (idx !== -1) {\n          container.overlays.splice(idx, 1);\n        }\n      }\n    });\n\n  };\n\n  /**\n   * Checks whether overlays are shown.\n   *\n   * @return {boolean} Whether overlays are shown.\n   */\n  Overlays.prototype.isShown = function() {\n    return this._overlayRoot.style.display !== 'none';\n  };\n\n  /**\n   * Show all overlays.\n   */\n  Overlays.prototype.show = function() {\n    setVisible(this._overlayRoot);\n  };\n\n  /**\n   * Hide all overlays.\n   */\n  Overlays.prototype.hide = function() {\n    setVisible(this._overlayRoot, false);\n  };\n\n  /**\n   * Remove all overlays and their container.\n   */\n  Overlays.prototype.clear = function() {\n    this._overlays = {};\n\n    this._overlayContainers = [];\n\n    clear(this._overlayRoot);\n  };\n\n  Overlays.prototype._updateOverlayContainer = function(container) {\n    var element = container.element,\n        html = container.html;\n\n    // update container left,top according to the elements x,y coordinates\n    // this ensures we can attach child elements relative to this container\n\n    var x = element.x,\n        y = element.y;\n\n    if (element.waypoints) {\n      var bbox = getBBox(element);\n      x = bbox.x;\n      y = bbox.y;\n    }\n\n    setPosition(html, x, y);\n\n    attr(container.html, 'data-container-id', element.id);\n  };\n\n\n  Overlays.prototype._updateOverlay = function(overlay) {\n\n    var position = overlay.position,\n        htmlContainer = overlay.htmlContainer,\n        element = overlay.element;\n\n    // update overlay html relative to shape because\n    // it is already positioned on the element\n\n    // update relative\n    var left = position.left,\n        top = position.top;\n\n    if (position.right !== undefined) {\n\n      var width;\n\n      if (element.waypoints) {\n        width = getBBox(element).width;\n      } else {\n        width = element.width;\n      }\n\n      left = position.right * -1 + width;\n    }\n\n    if (position.bottom !== undefined) {\n\n      var height;\n\n      if (element.waypoints) {\n        height = getBBox(element).height;\n      } else {\n        height = element.height;\n      }\n\n      top = position.bottom * -1 + height;\n    }\n\n    setPosition(htmlContainer, left || 0, top || 0);\n    this._updateOverlayVisibilty(overlay, this._canvas.viewbox());\n  };\n\n\n  Overlays.prototype._createOverlayContainer = function(element) {\n    var html = domify$1('<div class=\"djs-overlays\" />');\n    assign(html, { position: 'absolute' });\n\n    this._overlayRoot.appendChild(html);\n\n    var container = {\n      html: html,\n      element: element,\n      overlays: []\n    };\n\n    this._updateOverlayContainer(container);\n\n    this._overlayContainers.push(container);\n\n    return container;\n  };\n\n\n  Overlays.prototype._updateRoot = function(viewbox) {\n    var scale = viewbox.scale || 1;\n\n    var matrix = 'matrix(' +\n    [\n      scale,\n      0,\n      0,\n      scale,\n      -1 * viewbox.x * scale,\n      -1 * viewbox.y * scale\n    ].join(',') +\n    ')';\n\n    setTransform(this._overlayRoot, matrix);\n  };\n\n\n  Overlays.prototype._getOverlayContainer = function(element, raw) {\n    var container = find(this._overlayContainers, function(c) {\n      return c.element === element;\n    });\n\n\n    if (!container && !raw) {\n      return this._createOverlayContainer(element);\n    }\n\n    return container;\n  };\n\n\n  Overlays.prototype._addOverlay = function(overlay) {\n\n    var id = overlay.id,\n        element = overlay.element,\n        html = overlay.html,\n        htmlContainer,\n        overlayContainer;\n\n    // unwrap jquery (for those who need it)\n    if (html.get && html.constructor.prototype.jquery) {\n      html = html.get(0);\n    }\n\n    // create proper html elements from\n    // overlay HTML strings\n    if (isString(html)) {\n      html = domify$1(html);\n    }\n\n    overlayContainer = this._getOverlayContainer(element);\n\n    htmlContainer = domify$1('<div class=\"djs-overlay\" data-overlay-id=\"' + id + '\">');\n    assign(htmlContainer, { position: 'absolute' });\n\n    htmlContainer.appendChild(html);\n\n    if (overlay.type) {\n      classes(htmlContainer).add('djs-overlay-' + overlay.type);\n    }\n\n    var elementRoot = this._canvas.findRoot(element);\n    var activeRoot = this._canvas.getRootElement();\n\n    setVisible(htmlContainer, elementRoot === activeRoot);\n\n    overlay.htmlContainer = htmlContainer;\n\n    overlayContainer.overlays.push(overlay);\n    overlayContainer.html.appendChild(htmlContainer);\n\n    this._overlays[id] = overlay;\n\n    this._updateOverlay(overlay);\n    this._updateOverlayVisibilty(overlay, this._canvas.viewbox());\n  };\n\n\n  Overlays.prototype._updateOverlayVisibilty = function(overlay, viewbox) {\n    var show = overlay.show,\n        rootElement = this._canvas.findRoot(overlay.element),\n        minZoom = show && show.minZoom,\n        maxZoom = show && show.maxZoom,\n        htmlContainer = overlay.htmlContainer,\n        activeRootElement = this._canvas.getRootElement(),\n        visible = true;\n\n    if (rootElement !== activeRootElement) {\n      visible = false;\n    } else if (show) {\n      if (\n        (isDefined(minZoom) && minZoom > viewbox.scale) ||\n        (isDefined(maxZoom) && maxZoom < viewbox.scale)\n      ) {\n        visible = false;\n      }\n    }\n\n    setVisible(htmlContainer, visible);\n\n    this._updateOverlayScale(overlay, viewbox);\n  };\n\n\n  Overlays.prototype._updateOverlayScale = function(overlay, viewbox) {\n    var shouldScale = overlay.scale,\n        minScale,\n        maxScale,\n        htmlContainer = overlay.htmlContainer;\n\n    var scale, transform = '';\n\n    if (shouldScale !== true) {\n\n      if (shouldScale === false) {\n        minScale = 1;\n        maxScale = 1;\n      } else {\n        minScale = shouldScale.min;\n        maxScale = shouldScale.max;\n      }\n\n      if (isDefined(minScale) && viewbox.scale < minScale) {\n        scale = (1 / viewbox.scale || 1) * minScale;\n      }\n\n      if (isDefined(maxScale) && viewbox.scale > maxScale) {\n        scale = (1 / viewbox.scale || 1) * maxScale;\n      }\n    }\n\n    if (isDefined(scale)) {\n      transform = 'scale(' + scale + ',' + scale + ')';\n    }\n\n    setTransform(htmlContainer, transform);\n  };\n\n\n  Overlays.prototype._updateOverlaysVisibilty = function(viewbox) {\n\n    var self = this;\n\n    forEach$1(this._overlays, function(overlay) {\n      self._updateOverlayVisibilty(overlay, viewbox);\n    });\n  };\n\n\n  Overlays.prototype._init = function() {\n\n    var eventBus = this._eventBus;\n\n    var self = this;\n\n\n    // scroll/zoom integration\n\n    function updateViewbox(viewbox) {\n      self._updateRoot(viewbox);\n      self._updateOverlaysVisibilty(viewbox);\n\n      self.show();\n    }\n\n    eventBus.on('canvas.viewbox.changing', function(event) {\n      self.hide();\n    });\n\n    eventBus.on('canvas.viewbox.changed', function(event) {\n      updateViewbox(event.viewbox);\n    });\n\n\n    // remove integration\n\n    eventBus.on([ 'shape.remove', 'connection.remove' ], function(e) {\n      var element = e.element;\n      var overlays = self.get({ element: element });\n\n      forEach$1(overlays, function(o) {\n        self.remove(o.id);\n      });\n\n      var container = self._getOverlayContainer(element);\n\n      if (container) {\n        remove$1(container.html);\n        var i = self._overlayContainers.indexOf(container);\n        if (i !== -1) {\n          self._overlayContainers.splice(i, 1);\n        }\n      }\n    });\n\n\n    // move integration\n\n    eventBus.on('element.changed', LOW_PRIORITY$1, function(e) {\n      var element = e.element;\n\n      var container = self._getOverlayContainer(element, true);\n\n      if (container) {\n        forEach$1(container.overlays, function(overlay) {\n          self._updateOverlay(overlay);\n        });\n\n        self._updateOverlayContainer(container);\n      }\n    });\n\n\n    // marker integration, simply add them on the overlays as classes, too.\n\n    eventBus.on('element.marker.update', function(e) {\n      var container = self._getOverlayContainer(e.element, true);\n      if (container) {\n        classes(container.html)[e.add ? 'add' : 'remove'](e.marker);\n      }\n    });\n\n\n    eventBus.on('root.set', function() {\n      self._updateOverlaysVisibilty(self._canvas.viewbox());\n    });\n\n    // clear overlays with diagram\n\n    eventBus.on('diagram.clear', this.clear, this);\n  };\n\n\n\n  // helpers /////////////////////////////\n\n  function createRoot(parentNode) {\n    var root = domify$1(\n      '<div class=\"djs-overlay-container\" />'\n    );\n\n    assign(root, {\n      position: 'absolute',\n      width: 0,\n      height: 0\n    });\n\n    parentNode.insertBefore(root, parentNode.firstChild);\n\n    return root;\n  }\n\n  function setPosition(el, x, y) {\n    assign(el, { left: x + 'px', top: y + 'px' });\n  }\n\n  /**\n   * Set element visible\n   *\n   * @param {DOMElement} el\n   * @param {boolean} [visible=true]\n   */\n  function setVisible(el, visible) {\n    el.style.display = visible === false ? 'none' : '';\n  }\n\n  function setTransform(el, transform) {\n\n    el.style['transform-origin'] = 'top left';\n\n    [ '', '-ms-', '-webkit-' ].forEach(function(prefix) {\n      el.style[prefix + 'transform'] = transform;\n    });\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var OverlaysModule = {\n    __init__: [ 'overlays' ],\n    overlays: [ 'type', Overlays ]\n  };\n\n  /**\n   * @typedef {import('../../core/Canvas').default} Canvas\n   * @typedef {import('../../core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('../../core/EventBus').default} EventBus\n   * @typedef {import('../../core/GraphicsFactory').default} GraphicsFactory\n   */\n\n  /**\n   * Adds change support to the diagram, including\n   *\n   * <ul>\n   *   <li>redrawing shapes and connections on change</li>\n   * </ul>\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   * @param {ElementRegistry} elementRegistry\n   * @param {GraphicsFactory} graphicsFactory\n   */\n  function ChangeSupport(\n      eventBus, canvas, elementRegistry,\n      graphicsFactory) {\n\n\n    // redraw shapes / connections on change\n\n    eventBus.on('element.changed', function(event) {\n\n      var element = event.element;\n\n      // element might have been deleted and replaced by new element with same ID\n      // thus check for parent of element except for root element\n      if (element.parent || element === canvas.getRootElement()) {\n        event.gfx = elementRegistry.getGraphics(element);\n      }\n\n      // shape + gfx may have been deleted\n      if (!event.gfx) {\n        return;\n      }\n\n      eventBus.fire(getType(element) + '.changed', event);\n    });\n\n    eventBus.on('elements.changed', function(event) {\n\n      var elements = event.elements;\n\n      elements.forEach(function(e) {\n        eventBus.fire('element.changed', { element: e });\n      });\n\n      graphicsFactory.updateContainments(elements);\n    });\n\n    eventBus.on('shape.changed', function(event) {\n      graphicsFactory.update('shape', event.element, event.gfx);\n    });\n\n    eventBus.on('connection.changed', function(event) {\n      graphicsFactory.update('connection', event.element, event.gfx);\n    });\n  }\n\n  ChangeSupport.$inject = [\n    'eventBus',\n    'canvas',\n    'elementRegistry',\n    'graphicsFactory'\n  ];\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var ChangeSupportModule = {\n    __init__: [ 'changeSupport' ],\n    changeSupport: [ 'type', ChangeSupport ]\n  };\n\n  /**\n   * @typedef {import('../core/Types').ElementLike} ElementLike\n   * @typedef {import('../core/EventBus').default} EventBus\n   * @typedef {import('./CommandStack').CommandContext} CommandContext\n   *\n   * @typedef {string|string[]} Events\n   * @typedef { (context: CommandContext) => ElementLike[] | void } HandlerFunction\n   * @typedef { (context: CommandContext) => void } ComposeHandlerFunction\n   */\n\n  var DEFAULT_PRIORITY$1 = 1000;\n\n  /**\n   * A utility that can be used to plug into the command execution for\n   * extension and/or validation.\n   *\n   * @class\n   * @constructor\n   *\n   * @example\n   *\n   * ```javascript\n   * import CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n   *\n   * class CommandLogger extends CommandInterceptor {\n   *   constructor(eventBus) {\n   *     super(eventBus);\n   *\n   *   this.preExecute('shape.create', (event) => {\n   *     console.log('commandStack.shape-create.preExecute', event);\n   *   });\n   * }\n   * ```\n   *\n   * @param {EventBus} eventBus\n   */\n  function CommandInterceptor(eventBus) {\n\n    /**\n     * @type {EventBus}\n     */\n    this._eventBus = eventBus;\n  }\n\n  CommandInterceptor.$inject = [ 'eventBus' ];\n\n  function unwrapEvent(fn, that) {\n    return function(event) {\n      return fn.call(that || null, event.context, event.command, event);\n    };\n  }\n\n\n  /**\n   * Intercept a command during one of the phases.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {string} [hook] phase to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.on = function(events, hook, priority, handlerFn, unwrap, that) {\n\n    if (isFunction(hook) || isNumber(hook)) {\n      that = unwrap;\n      unwrap = handlerFn;\n      handlerFn = priority;\n      priority = hook;\n      hook = null;\n    }\n\n    if (isFunction(priority)) {\n      that = unwrap;\n      unwrap = handlerFn;\n      handlerFn = priority;\n      priority = DEFAULT_PRIORITY$1;\n    }\n\n    if (isObject(unwrap)) {\n      that = unwrap;\n      unwrap = false;\n    }\n\n    if (!isFunction(handlerFn)) {\n      throw new Error('handlerFn must be a function');\n    }\n\n    if (!isArray$2(events)) {\n      events = [ events ];\n    }\n\n    var eventBus = this._eventBus;\n\n    forEach$1(events, function(event) {\n\n      // concat commandStack(.event)?(.hook)?\n      var fullEvent = [ 'commandStack', event, hook ].filter(function(e) { return e; }).join('.');\n\n      eventBus.on(fullEvent, priority, unwrap ? unwrapEvent(handlerFn, that) : handlerFn, that);\n    });\n  };\n\n  /**\n   * Add a <canExecute> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.canExecute = createHook('canExecute');\n\n  /**\n   * Add a <preExecute> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.preExecute = createHook('preExecute');\n\n  /**\n   * Add a <preExecuted> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.preExecuted = createHook('preExecuted');\n\n  /**\n   * Add a <execute> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.execute = createHook('execute');\n\n  /**\n   * Add a <executed> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.executed = createHook('executed');\n\n  /**\n   * Add a <postExecute> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.postExecute = createHook('postExecute');\n\n  /**\n   * Add a <postExecuted> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.postExecuted = createHook('postExecuted');\n\n  /**\n   * Add a <revert> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.revert = createHook('revert');\n\n  /**\n   * Add a <reverted> phase of command interceptor.\n   *\n   * @param {Events} [events] command(s) to intercept\n   * @param {number} [priority]\n   * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n   * @param {boolean} [unwrap] whether the event should be unwrapped\n   * @param {any} [that]\n   */\n  CommandInterceptor.prototype.reverted = createHook('reverted');\n\n  /*\n   * Add prototype methods for each phase of command execution (e.g. execute,\n   * revert).\n   *\n   * @param {string} hook\n   *\n   * @return { (\n   *   events?: Events,\n   *   priority?: number,\n   *   handlerFn: ComposeHandlerFunction|HandlerFunction,\n   *   unwrap?: boolean\n   * ) => any }\n   */\n  function createHook(hook) {\n\n    /**\n     * @this {CommandInterceptor}\n     *\n     * @param {Events} [events]\n     * @param {number} [priority]\n     * @param {ComposeHandlerFunction|HandlerFunction} handlerFn\n     * @param {boolean} [unwrap]\n     * @param {any} [that]\n     */\n    const hookFn = function(events, priority, handlerFn, unwrap, that) {\n\n      if (isFunction(events) || isNumber(events)) {\n        that = unwrap;\n        unwrap = handlerFn;\n        handlerFn = priority;\n        priority = events;\n        events = null;\n      }\n\n      this.on(events, hook, priority, handlerFn, unwrap, that);\n    };\n\n    return hookFn;\n  }\n\n  /**\n   * @typedef {import('didi').Injector} Injector\n   *\n   * @typedef {import('../../core/Canvas').default} Canvas\n   */\n\n  /**\n   * A modeling behavior that ensures we set the correct root element\n   * as we undo and redo commands.\n   *\n   * @param {Canvas} canvas\n   * @param {Injector} injector\n   */\n  function RootElementsBehavior(canvas, injector) {\n\n    injector.invoke(CommandInterceptor, this);\n\n    this.executed(function(event) {\n      var context = event.context;\n\n      if (context.rootElement) {\n        canvas.setRootElement(context.rootElement);\n      } else {\n        context.rootElement = canvas.getRootElement();\n      }\n    });\n\n    this.revert(function(event) {\n      var context = event.context;\n\n      if (context.rootElement) {\n        canvas.setRootElement(context.rootElement);\n      }\n    });\n  }\n\n  e(RootElementsBehavior, CommandInterceptor);\n\n  RootElementsBehavior.$inject = [ 'canvas', 'injector' ];\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var RootElementsModule = {\n    __init__: [ 'rootElementsBehavior' ],\n    rootElementsBehavior: [ 'type', RootElementsBehavior ]\n  };\n\n  /**\n   * @param {string} str\n   *\n   * @return {string}\n   */\n\n  var HTML_ESCAPE_MAP = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    '\\'': '&#39;'\n  };\n\n  /**\n   * @param {string} str\n   *\n   * @return {string}\n   */\n  function escapeHTML(str) {\n    str = '' + str;\n\n    return str && str.replace(/[&<>\"']/g, function(match) {\n      return HTML_ESCAPE_MAP[match];\n    });\n  }\n\n  /**\n   * @typedef {import('../model/Types').Element} Element\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   */\n\n  var planeSuffix = '_plane';\n\n  /**\n   * Get plane ID for a primary shape.\n   *\n   * @param  {Element|ModdleElement} element\n   *\n   * @return {string}\n   */\n  function getPlaneIdFromShape(element) {\n    var id = element.id;\n\n    if (is$1(element, 'bpmn:SubProcess')) {\n      return addPlaneSuffix(id);\n    }\n\n    return id;\n  }\n\n  function addPlaneSuffix(id) {\n    return id + planeSuffix;\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Shape} Shape\n   */\n\n  var OPEN_CLASS = 'bjs-breadcrumbs-shown';\n\n\n  /**\n   * Adds overlays that allow switching planes on collapsed subprocesses.\n   *\n   * @param {EventBus} eventBus\n   * @param {ElementRegistry} elementRegistry\n   * @param {Canvas} canvas\n   */\n  function DrilldownBreadcrumbs(eventBus, elementRegistry, canvas) {\n    var breadcrumbs = domify$1('<ul class=\"bjs-breadcrumbs\"></ul>');\n    var container = canvas.getContainer();\n    var containerClasses = classes(container);\n    container.appendChild(breadcrumbs);\n\n    var businessObjectParents = [];\n\n    // update breadcrumbs if name or ID of the primary shape changes\n    eventBus.on('element.changed', function(event) {\n      var shape = event.element,\n          businessObject = getBusinessObject(shape);\n\n      var isPresent = find(businessObjectParents, function(element) {\n        return element === businessObject;\n      });\n\n      if (!isPresent) {\n        return;\n      }\n\n      updateBreadcrumbs();\n    });\n\n    /**\n     * Updates the displayed breadcrumbs. If no element is provided, only the\n     * labels are updated.\n     *\n     * @param {Element} [element]\n     */\n    function updateBreadcrumbs(element) {\n      if (element) {\n        businessObjectParents = getBusinessObjectParentChain(element);\n      }\n\n      var path = businessObjectParents.map(function(parent) {\n        var title = escapeHTML(parent.name || parent.id);\n        var link = domify$1('<li><span class=\"bjs-crumb\"><a title=\"' + title + '\">' + title + '</a></span></li>');\n\n        var parentPlane = canvas.findRoot(getPlaneIdFromShape(parent)) || canvas.findRoot(parent.id);\n\n        // when the root is a collaboration, the process does not have a corresponding\n        // element in the elementRegisty. Instead, we search for the corresponding participant\n        if (!parentPlane && is$1(parent, 'bpmn:Process')) {\n          var participant = elementRegistry.find(function(element) {\n            var businessObject = getBusinessObject(element);\n\n            return businessObject && businessObject.get('processRef') && businessObject.get('processRef') === parent;\n          });\n\n          parentPlane = canvas.findRoot(participant.id);\n        }\n\n        link.addEventListener('click', function() {\n          canvas.setRootElement(parentPlane);\n        });\n\n        return link;\n      });\n\n      breadcrumbs.innerHTML = '';\n\n      // show breadcrumbs and expose state to .djs-container\n      var visible = path.length > 1;\n\n      containerClasses.toggle(OPEN_CLASS, visible);\n\n      path.forEach(function(element) {\n        breadcrumbs.appendChild(element);\n      });\n    }\n\n    eventBus.on('root.set', function(event) {\n      updateBreadcrumbs(event.element);\n    });\n\n  }\n\n  DrilldownBreadcrumbs.$inject = [ 'eventBus', 'elementRegistry', 'canvas' ];\n\n\n  // helpers //////////\n\n  /**\n   * Returns the parents for the element using the business object chain,\n   * starting with the root element.\n   *\n   * @param {Shape} child\n   *\n   * @return {Shape}\n   */\n  function getBusinessObjectParentChain(child) {\n    var businessObject = getBusinessObject(child);\n\n    var parents = [];\n\n    for (var element = businessObject; element; element = element.$parent) {\n      if (is$1(element, 'bpmn:SubProcess') || is$1(element, 'bpmn:Process')) {\n        parents.push(element);\n      }\n    }\n\n    return parents.reverse();\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   */\n\n  /**\n   * Move collapsed subprocesses into view when drilling down.\n   *\n   * Zoom and scroll are saved in a session.\n   *\n   * @param {EventBus} eventBus\n   * @param {Canvas} canvas\n   */\n  function DrilldownCentering(eventBus, canvas) {\n\n    var currentRoot = null;\n    var positionMap = new Map();\n\n    eventBus.on('root.set', function(event) {\n      var newRoot = event.element;\n      var currentViewbox = canvas.viewbox();\n      var storedViewbox = positionMap.get(newRoot);\n\n      positionMap.set(currentRoot, {\n        x: currentViewbox.x,\n        y: currentViewbox.y,\n        zoom: currentViewbox.scale\n      });\n\n      currentRoot = newRoot;\n\n      // current root was replaced with a collaboration, we don't update the viewbox\n      if (is$1(newRoot, 'bpmn:Collaboration') && !storedViewbox) {\n        return;\n      }\n\n      storedViewbox = storedViewbox || { x: 0, y: 0, zoom: 1 };\n\n      var dx = (currentViewbox.x - storedViewbox.x) * currentViewbox.scale,\n          dy = (currentViewbox.y - storedViewbox.y) * currentViewbox.scale;\n\n      if (dx !== 0 || dy !== 0) {\n        canvas.scroll({\n          dx: dx,\n          dy: dy\n        });\n      }\n\n      if (storedViewbox.zoom !== currentViewbox.scale) {\n        canvas.zoom(storedViewbox.zoom, { x: 0, y: 0 });\n      }\n    });\n\n    eventBus.on('diagram.clear', function() {\n      positionMap.clear();\n      currentRoot = null;\n    });\n\n  }\n\n  DrilldownCentering.$inject = [ 'eventBus', 'canvas' ];\n\n\n  /**\n   * ES5 Map implementation. Works.\n   */\n  function Map() {\n\n    this._entries = [];\n\n    this.set = function(key, value) {\n\n      var found = false;\n\n      for (var k in this._entries) {\n        if (this._entries[k][0] === key) {\n          this._entries[k][1] = value;\n\n          found = true;\n\n          break;\n        }\n      }\n\n      if (!found) {\n        this._entries.push([ key, value ]);\n      }\n    };\n\n    this.get = function(key) {\n\n      for (var k in this._entries) {\n        if (this._entries[k][0] === key) {\n          return this._entries[k][1];\n        }\n      }\n\n      return null;\n    };\n\n    this.clear = function() {\n      this._entries.length = 0;\n    };\n\n    this.remove = function(key) {\n\n      var idx = -1;\n\n      for (var k in this._entries) {\n        if (this._entries[k][0] === key) {\n          idx = k;\n\n          break;\n        }\n      }\n\n      if (idx !== -1) {\n        this._entries.splice(idx, 1);\n      }\n    };\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('../../model/Types').Moddle} Moddle\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Shape} Shape\n   *\n   * @typedef {import('diagram-js/lib/core/Canvas').CanvasPlane} CanvasPlane\n   *\n   * @typedef {import('diagram-js/lib/util/Types').Rect} Rect\n   */\n\n  var DEFAULT_POSITION = {\n    x: 180,\n    y: 160\n  };\n\n  /**\n   * Hook into `import.render.start` and create new planes for diagrams with\n   * collapsed subprocesses and all DI elements on the same plane.\n   *\n   * @param {EventBus} eventBus\n   * @param {Moddle} moddle\n   */\n  function SubprocessCompatibility(eventBus, moddle) {\n    this._eventBus = eventBus;\n    this._moddle = moddle;\n\n    var self = this;\n\n    eventBus.on('import.render.start', 1500, function(e, context) {\n      self._handleImport(context.definitions);\n    });\n  }\n\n  /**\n   * @param {ModdleElement} definitions\n   */\n  SubprocessCompatibility.prototype._handleImport = function(definitions) {\n    if (!definitions.diagrams) {\n      return;\n    }\n\n    var self = this;\n    this._definitions = definitions;\n    this._processToDiagramMap = {};\n\n    definitions.diagrams.forEach(function(diagram) {\n      if (!diagram.plane || !diagram.plane.bpmnElement) {\n        return;\n      }\n\n      self._processToDiagramMap[diagram.plane.bpmnElement.id] = diagram;\n    });\n\n    var newDiagrams = [];\n    definitions.diagrams.forEach(function(diagram) {\n      var createdDiagrams = self._createNewDiagrams(diagram.plane);\n      Array.prototype.push.apply(newDiagrams, createdDiagrams);\n    });\n\n    newDiagrams.forEach(function(diagram) {\n      self._movePlaneElementsToOrigin(diagram.plane);\n    });\n  };\n\n\n  /**\n   * Moves all DI elements from collapsed subprocesses to a new plane.\n   *\n   * @param {CanvasPlane} plane\n   *\n   * @return {ModdleElement[]} new diagrams created for the collapsed subprocesses\n   */\n  SubprocessCompatibility.prototype._createNewDiagrams = function(plane) {\n    var self = this;\n\n    var collapsedElements = [];\n    var elementsToMove = [];\n\n    plane.get('planeElement').forEach(function(diElement) {\n      var businessObject = diElement.bpmnElement;\n\n      if (!businessObject) {\n        return;\n      }\n\n      var parent = businessObject.$parent;\n\n      if (is$1(businessObject, 'bpmn:SubProcess') && !diElement.isExpanded) {\n        collapsedElements.push(businessObject);\n      }\n\n      if (shouldMoveToPlane(businessObject, plane)) {\n\n        // don't change the array while we iterate over it\n        elementsToMove.push({ diElement: diElement, parent: parent });\n      }\n    });\n\n    var newDiagrams = [];\n\n    // create new planes for all collapsed subprocesses, even when they are empty\n    collapsedElements.forEach(function(element) {\n      if (!self._processToDiagramMap[ element.id ]) {\n        var diagram = self._createDiagram(element);\n\n        self._processToDiagramMap[element.id] = diagram;\n\n        newDiagrams.push(diagram);\n      }\n    });\n\n    elementsToMove.forEach(function(element) {\n      var diElement = element.diElement;\n      var parent = element.parent;\n\n      // parent is expanded, get nearest collapsed parent\n      while (parent && collapsedElements.indexOf(parent) === -1) {\n        parent = parent.$parent;\n      }\n\n      // false positive, all parents are expanded\n      if (!parent) {\n        return;\n      }\n\n      var diagram = self._processToDiagramMap[ parent.id ];\n\n      self._moveToDiPlane(diElement, diagram.plane);\n    });\n\n    return newDiagrams;\n  };\n\n  /**\n   * @param {CanvasPlane} plane\n   */\n  SubprocessCompatibility.prototype._movePlaneElementsToOrigin = function(plane) {\n    var elements = plane.get('planeElement');\n\n    // get bounding box of all elements\n    var planeBounds = getPlaneBounds(plane);\n\n    var offset = {\n      x: planeBounds.x - DEFAULT_POSITION.x,\n      y: planeBounds.y - DEFAULT_POSITION.y\n    };\n\n    elements.forEach(function(diElement) {\n      if (diElement.waypoint) {\n        diElement.waypoint.forEach(function(waypoint) {\n          waypoint.x = waypoint.x - offset.x;\n          waypoint.y = waypoint.y - offset.y;\n        });\n      } else if (diElement.bounds) {\n        diElement.bounds.x = diElement.bounds.x - offset.x;\n        diElement.bounds.y = diElement.bounds.y - offset.y;\n      }\n    });\n  };\n\n  /**\n   * @param {ModdleElement} diElement\n   * @param {CanvasPlane} newPlane\n   */\n  SubprocessCompatibility.prototype._moveToDiPlane = function(diElement, newPlane) {\n    var containingDiagram = findRootDiagram(diElement);\n\n    // remove DI from old Plane and add it to the new one\n    var parentPlaneElement = containingDiagram.plane.get('planeElement');\n\n    parentPlaneElement.splice(parentPlaneElement.indexOf(diElement), 1);\n\n    newPlane.get('planeElement').push(diElement);\n  };\n\n  /**\n   * @param {ModdleElement} businessObject\n   *\n   * @return {ModdleElement}\n   */\n  SubprocessCompatibility.prototype._createDiagram = function(businessObject) {\n    var plane = this._moddle.create('bpmndi:BPMNPlane', {\n      bpmnElement: businessObject\n    });\n\n    var diagram = this._moddle.create('bpmndi:BPMNDiagram', {\n      plane: plane\n    });\n\n    plane.$parent = diagram;\n\n    plane.bpmnElement = businessObject;\n\n    diagram.$parent = this._definitions;\n\n    this._definitions.diagrams.push(diagram);\n\n    return diagram;\n  };\n\n  SubprocessCompatibility.$inject = [ 'eventBus', 'moddle' ];\n\n\n  // helpers //////////\n\n  function findRootDiagram(element) {\n    if (is$1(element, 'bpmndi:BPMNDiagram')) {\n      return element;\n    } else {\n      return findRootDiagram(element.$parent);\n    }\n  }\n\n  /**\n   * @param {CanvasPlane} plane\n   *\n   * @return {Rect}\n   */\n  function getPlaneBounds(plane) {\n    var planeTrbl = {\n      top: Infinity,\n      right: -Infinity,\n      bottom: -Infinity,\n      left: Infinity\n    };\n\n    plane.planeElement.forEach(function(element) {\n      if (!element.bounds) {\n        return;\n      }\n\n      var trbl = asTRBL(element.bounds);\n\n      planeTrbl.top = Math.min(trbl.top, planeTrbl.top);\n      planeTrbl.left = Math.min(trbl.left, planeTrbl.left);\n    });\n\n    return asBounds(planeTrbl);\n  }\n\n  /**\n   * @param {ModdleElement} businessObject\n   * @param {CanvasPlane} plane\n   *\n   * @return {boolean}\n   */\n  function shouldMoveToPlane(businessObject, plane) {\n    var parent = businessObject.$parent;\n\n    // don't move elements that are already on the plane\n    if (!is$1(parent, 'bpmn:SubProcess') || parent === plane.bpmnElement) {\n      return false;\n    }\n\n    // dataAssociations are children of the subprocess but rendered on process level\n    // cf. https://github.com/bpmn-io/bpmn-js/issues/1619\n    if (isAny(businessObject, [ 'bpmn:DataInputAssociation', 'bpmn:DataOutputAssociation' ])) {\n      return false;\n    }\n\n    return true;\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n   * @typedef {import('diagram-js/lib/core/ElementRegistry').default} ElementRegistry\n   * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n   * @typedef {import('diagram-js/lib/features/overlays/Overlays').default} Overlays\n   *\n   * @typedef {import('../../model/Types').Element} Element\n   * @typedef {import('../../model/Types').Parent} Parent\n   * @typedef {import('../../model/Types').Shape} Shape\n   */\n\n  var LOW_PRIORITY = 250;\n  var ARROW_DOWN_SVG = '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 16 16\"><path fill-rule=\"evenodd\" d=\"M4.81801948,3.50735931 L10.4996894,9.1896894 L10.5,4 L12,4 L12,12 L4,12 L4,10.5 L9.6896894,10.4996894 L3.75735931,4.56801948 C3.46446609,4.27512627 3.46446609,3.80025253 3.75735931,3.50735931 C4.05025253,3.21446609 4.52512627,3.21446609 4.81801948,3.50735931 Z\"/></svg>';\n\n  var EMPTY_MARKER = 'bjs-drilldown-empty';\n\n  /**\n   * @param {Canvas} canvas\n   * @param {EventBus} eventBus\n   * @param {ElementRegistry} elementRegistry\n   * @param {Overlays} overlays\n   */\n  function DrilldownOverlayBehavior(\n      canvas, eventBus, elementRegistry, overlays\n  ) {\n    CommandInterceptor.call(this, eventBus);\n\n    this._canvas = canvas;\n    this._eventBus = eventBus;\n    this._elementRegistry = elementRegistry;\n    this._overlays = overlays;\n\n    var self = this;\n\n    this.executed('shape.toggleCollapse', LOW_PRIORITY, function(context) {\n      var shape = context.shape;\n\n      // Add overlay to the collapsed shape\n      if (self._canDrillDown(shape)) {\n        self._addOverlay(shape);\n      } else {\n        self._removeOverlay(shape);\n      }\n    }, true);\n\n\n    this.reverted('shape.toggleCollapse', LOW_PRIORITY, function(context) {\n      var shape = context.shape;\n\n      // Add overlay to the collapsed shape\n      if (self._canDrillDown(shape)) {\n        self._addOverlay(shape);\n      } else {\n        self._removeOverlay(shape);\n      }\n    }, true);\n\n\n    this.executed([ 'shape.create', 'shape.move', 'shape.delete' ], LOW_PRIORITY,\n      function(context) {\n        var oldParent = context.oldParent,\n            newParent = context.newParent || context.parent,\n            shape = context.shape;\n\n        // Add overlay to the collapsed shape\n        if (self._canDrillDown(shape)) {\n          self._addOverlay(shape);\n        }\n\n        self._updateDrilldownOverlay(oldParent);\n        self._updateDrilldownOverlay(newParent);\n        self._updateDrilldownOverlay(shape);\n      }, true);\n\n\n    this.reverted([ 'shape.create', 'shape.move', 'shape.delete' ], LOW_PRIORITY,\n      function(context) {\n        var oldParent = context.oldParent,\n            newParent = context.newParent || context.parent,\n            shape = context.shape;\n\n        // Add overlay to the collapsed shape\n        if (self._canDrillDown(shape)) {\n          self._addOverlay(shape);\n        }\n\n        self._updateDrilldownOverlay(oldParent);\n        self._updateDrilldownOverlay(newParent);\n        self._updateDrilldownOverlay(shape);\n      }, true);\n\n\n    eventBus.on('import.render.complete', function() {\n      elementRegistry.filter(function(e) {\n        return self._canDrillDown(e);\n      }).map(function(el) {\n        self._addOverlay(el);\n      });\n    });\n\n  }\n\n  e(DrilldownOverlayBehavior, CommandInterceptor);\n\n  /**\n   * @param {Shape} shape\n   */\n  DrilldownOverlayBehavior.prototype._updateDrilldownOverlay = function(shape) {\n    var canvas = this._canvas;\n\n    if (!shape) {\n      return;\n    }\n\n    var root = canvas.findRoot(shape);\n\n    if (root) {\n      this._updateOverlayVisibility(root);\n    }\n  };\n\n  /**\n   * @param {Element} element\n   *\n   * @return {boolean}\n   */\n  DrilldownOverlayBehavior.prototype._canDrillDown = function(element) {\n    var canvas = this._canvas;\n\n    return is$1(element, 'bpmn:SubProcess') && canvas.findRoot(getPlaneIdFromShape(element));\n  };\n\n  /**\n   * Update the visibility of the drilldown overlay. If the plane has no elements,\n   * the drilldown will only be shown when the element is selected.\n   *\n   * @param {Parent} element The collapsed root or shape.\n   */\n  DrilldownOverlayBehavior.prototype._updateOverlayVisibility = function(element) {\n    var overlays = this._overlays;\n\n    var businessObject = getBusinessObject(element);\n\n    var overlay = overlays.get({ element: businessObject.id, type: 'drilldown' })[0];\n\n    if (!overlay) {\n      return;\n    }\n\n    var hasFlowElements = businessObject\n      && businessObject.get('flowElements')\n      && businessObject.get('flowElements').length;\n\n    classes(overlay.html).toggle(EMPTY_MARKER, !hasFlowElements);\n  };\n\n  /**\n   * Add a drilldown button to the given element assuming the plane has the same\n   * ID as the element.\n   *\n   * @param {Shape} element The collapsed shape.\n   */\n  DrilldownOverlayBehavior.prototype._addOverlay = function(element) {\n    var canvas = this._canvas,\n        overlays = this._overlays;\n\n    var existingOverlays = overlays.get({ element: element, type: 'drilldown' });\n\n    if (existingOverlays.length) {\n      this._removeOverlay(element);\n    }\n\n    var button = domify$1('<button class=\"bjs-drilldown\">' + ARROW_DOWN_SVG + '</button>');\n\n    button.addEventListener('click', function() {\n      canvas.setRootElement(canvas.findRoot(getPlaneIdFromShape(element)));\n    });\n\n    overlays.add(element, 'drilldown', {\n      position: {\n        bottom: -7,\n        right: -8\n      },\n      html: button\n    });\n\n    this._updateOverlayVisibility(element);\n  };\n\n  DrilldownOverlayBehavior.prototype._removeOverlay = function(element) {\n    var overlays = this._overlays;\n\n    overlays.remove({\n      element: element,\n      type: 'drilldown'\n    });\n  };\n\n  DrilldownOverlayBehavior.$inject = [\n    'canvas',\n    'eventBus',\n    'elementRegistry',\n    'overlays'\n  ];\n\n  var DrilldownModdule = {\n    __depends__: [ OverlaysModule, ChangeSupportModule, RootElementsModule ],\n    __init__: [ 'drilldownBreadcrumbs', 'drilldownOverlayBehavior', 'drilldownCentering', 'subprocessCompatibility' ],\n    drilldownBreadcrumbs: [ 'type', DrilldownBreadcrumbs ],\n    drilldownCentering: [ 'type', DrilldownCentering ],\n    drilldownOverlayBehavior: [ 'type', DrilldownOverlayBehavior ],\n    subprocessCompatibility: [ 'type', SubprocessCompatibility ]\n  };\n\n  const CLASS_PATTERN = /^class[ {]/;\n\n\n  /**\n   * @param {function} fn\n   *\n   * @return {boolean}\n   */\n  function isClass(fn) {\n    return CLASS_PATTERN.test(fn.toString());\n  }\n\n  /**\n   * @param {any} obj\n   *\n   * @return {boolean}\n   */\n  function isArray(obj) {\n    return Array.isArray(obj);\n  }\n\n  /**\n   * @param {any} obj\n   * @param {string} prop\n   *\n   * @return {boolean}\n   */\n  function hasOwnProp(obj, prop) {\n    return Object.prototype.hasOwnProperty.call(obj, prop);\n  }\n\n  /**\n   * @typedef {import('./index').InjectAnnotated } InjectAnnotated\n   */\n\n  /**\n   * @template T\n   *\n   * @params {[...string[], T] | ...string[], T} args\n   *\n   * @return {T & InjectAnnotated}\n   */\n  function annotate(...args) {\n\n    if (args.length === 1 && isArray(args[0])) {\n      args = args[0];\n    }\n\n    args = [ ...args ];\n\n    const fn = args.pop();\n\n    fn.$inject = args;\n\n    return fn;\n  }\n\n\n  // Current limitations:\n  // - can't put into \"function arg\" comments\n  // function /* (no parenthesis like this) */ (){}\n  // function abc( /* xx (no parenthesis like this) */ a, b) {}\n  //\n  // Just put the comment before function or inside:\n  // /* (((this is fine))) */ function(a, b) {}\n  // function abc(a) { /* (((this is fine))) */}\n  //\n  // - can't reliably auto-annotate constructor; we'll match the\n  // first constructor(...) pattern found which may be the one\n  // of a nested class, too.\n\n  const CONSTRUCTOR_ARGS = /constructor\\s*[^(]*\\(\\s*([^)]*)\\)/m;\n  const FN_ARGS = /^(?:async\\s+)?(?:function\\s*[^(]*)?(?:\\(\\s*([^)]*)\\)|(\\w+))/m;\n  const FN_ARG = /\\/\\*([^*]*)\\*\\//m;\n\n  /**\n   * @param {unknown} fn\n   *\n   * @return {string[]}\n   */\n  function parseAnnotations(fn) {\n\n    if (typeof fn !== 'function') {\n      throw new Error(`Cannot annotate \"${fn}\". Expected a function!`);\n    }\n\n    const match = fn.toString().match(isClass(fn) ? CONSTRUCTOR_ARGS : FN_ARGS);\n\n    // may parse class without constructor\n    if (!match) {\n      return [];\n    }\n\n    const args = match[1] || match[2];\n\n    return args && args.split(',').map(arg => {\n      const argMatch = arg.match(FN_ARG);\n      return (argMatch && argMatch[1] || arg).trim();\n    }) || [];\n  }\n\n  /**\n   * @typedef { import('./index').ModuleDeclaration } ModuleDeclaration\n   * @typedef { import('./index').ModuleDefinition } ModuleDefinition\n   * @typedef { import('./index').InjectorContext } InjectorContext\n   */\n\n  /**\n   * Create a new injector with the given modules.\n   *\n   * @param {ModuleDefinition[]} modules\n   * @param {InjectorContext} [parent]\n   */\n  function Injector(modules, parent) {\n    parent = parent || {\n      get: function(name, strict) {\n        currentlyResolving.push(name);\n\n        if (strict === false) {\n          return null;\n        } else {\n          throw error(`No provider for \"${ name }\"!`);\n        }\n      }\n    };\n\n    const currentlyResolving = [];\n    const providers = this._providers = Object.create(parent._providers || null);\n    const instances = this._instances = Object.create(null);\n\n    const self = instances.injector = this;\n\n    const error = function(msg) {\n      const stack = currentlyResolving.join(' -> ');\n      currentlyResolving.length = 0;\n      return new Error(stack ? `${ msg } (Resolving: ${ stack })` : msg);\n    };\n\n    /**\n     * Return a named service.\n     *\n     * @param {string} name\n     * @param {boolean} [strict=true] if false, resolve missing services to null\n     *\n     * @return {any}\n     */\n    function get(name, strict) {\n      if (!providers[name] && name.indexOf('.') !== -1) {\n        const parts = name.split('.');\n        let pivot = get(parts.shift());\n\n        while (parts.length) {\n          pivot = pivot[parts.shift()];\n        }\n\n        return pivot;\n      }\n\n      if (hasOwnProp(instances, name)) {\n        return instances[name];\n      }\n\n      if (hasOwnProp(providers, name)) {\n        if (currentlyResolving.indexOf(name) !== -1) {\n          currentlyResolving.push(name);\n          throw error('Cannot resolve circular dependency!');\n        }\n\n        currentlyResolving.push(name);\n        instances[name] = providers[name][0](providers[name][1]);\n        currentlyResolving.pop();\n\n        return instances[name];\n      }\n\n      return parent.get(name, strict);\n    }\n\n    function fnDef(fn, locals) {\n\n      if (typeof locals === 'undefined') {\n        locals = {};\n      }\n\n      if (typeof fn !== 'function') {\n        if (isArray(fn)) {\n          fn = annotate(fn.slice());\n        } else {\n          throw error(`Cannot invoke \"${ fn }\". Expected a function!`);\n        }\n      }\n\n      const inject = fn.$inject || parseAnnotations(fn);\n      const dependencies = inject.map(dep => {\n        if (hasOwnProp(locals, dep)) {\n          return locals[dep];\n        } else {\n          return get(dep);\n        }\n      });\n\n      return {\n        fn: fn,\n        dependencies: dependencies\n      };\n    }\n\n    function instantiate(Type) {\n      const {\n        fn,\n        dependencies\n      } = fnDef(Type);\n\n      // instantiate var args constructor\n      const Constructor = Function.prototype.bind.apply(fn, [ null ].concat(dependencies));\n\n      return new Constructor();\n    }\n\n    function invoke(func, context, locals) {\n      const {\n        fn,\n        dependencies\n      } = fnDef(func, locals);\n\n      return fn.apply(context, dependencies);\n    }\n\n    /**\n     * @param {Injector} childInjector\n     *\n     * @return {Function}\n     */\n    function createPrivateInjectorFactory(childInjector) {\n      return annotate(key => childInjector.get(key));\n    }\n\n    /**\n     * @param {ModuleDefinition[]} modules\n     * @param {string[]} [forceNewInstances]\n     *\n     * @return {Injector}\n     */\n    function createChild(modules, forceNewInstances) {\n      if (forceNewInstances && forceNewInstances.length) {\n        const fromParentModule = Object.create(null);\n        const matchedScopes = Object.create(null);\n\n        const privateInjectorsCache = [];\n        const privateChildInjectors = [];\n        const privateChildFactories = [];\n\n        let provider;\n        let cacheIdx;\n        let privateChildInjector;\n        let privateChildInjectorFactory;\n\n        for (let name in providers) {\n          provider = providers[name];\n\n          if (forceNewInstances.indexOf(name) !== -1) {\n            if (provider[2] === 'private') {\n              cacheIdx = privateInjectorsCache.indexOf(provider[3]);\n              if (cacheIdx === -1) {\n                privateChildInjector = provider[3].createChild([], forceNewInstances);\n                privateChildInjectorFactory = createPrivateInjectorFactory(privateChildInjector);\n                privateInjectorsCache.push(provider[3]);\n                privateChildInjectors.push(privateChildInjector);\n                privateChildFactories.push(privateChildInjectorFactory);\n                fromParentModule[name] = [ privateChildInjectorFactory, name, 'private', privateChildInjector ];\n              } else {\n                fromParentModule[name] = [ privateChildFactories[cacheIdx], name, 'private', privateChildInjectors[cacheIdx] ];\n              }\n            } else {\n              fromParentModule[name] = [ provider[2], provider[1] ];\n            }\n            matchedScopes[name] = true;\n          }\n\n          if ((provider[2] === 'factory' || provider[2] === 'type') && provider[1].$scope) {\n            /* jshint -W083 */\n            forceNewInstances.forEach(scope => {\n              if (provider[1].$scope.indexOf(scope) !== -1) {\n                fromParentModule[name] = [ provider[2], provider[1] ];\n                matchedScopes[scope] = true;\n              }\n            });\n          }\n        }\n\n        forceNewInstances.forEach(scope => {\n          if (!matchedScopes[scope]) {\n            throw new Error('No provider for \"' + scope + '\". Cannot use provider from the parent!');\n          }\n        });\n\n        modules.unshift(fromParentModule);\n      }\n\n      return new Injector(modules, self);\n    }\n\n    const factoryMap = {\n      factory: invoke,\n      type: instantiate,\n      value: function(value) {\n        return value;\n      }\n    };\n\n    /**\n     * @param {ModuleDefinition} moduleDefinition\n     * @param {Injector} injector\n     */\n    function createInitializer(moduleDefinition, injector) {\n\n      const initializers = moduleDefinition.__init__ || [];\n\n      return function() {\n        initializers.forEach(initializer => {\n\n          // eagerly resolve component (fn or string)\n          if (typeof initializer === 'string') {\n            injector.get(initializer);\n          } else {\n            injector.invoke(initializer);\n          }\n        });\n      };\n    }\n\n    /**\n     * @param {ModuleDefinition} moduleDefinition\n     */\n    function loadModule(moduleDefinition) {\n\n      const moduleExports = moduleDefinition.__exports__;\n\n      // private module\n      if (moduleExports) {\n        const nestedModules = moduleDefinition.__modules__;\n\n        const clonedModule = Object.keys(moduleDefinition).reduce((clonedModule, key) => {\n\n          if (key !== '__exports__' && key !== '__modules__' && key !== '__init__' && key !== '__depends__') {\n            clonedModule[key] = moduleDefinition[key];\n          }\n\n          return clonedModule;\n        }, Object.create(null));\n\n        const childModules = (nestedModules || []).concat(clonedModule);\n\n        const privateInjector = createChild(childModules);\n        const getFromPrivateInjector = annotate(function(key) {\n          return privateInjector.get(key);\n        });\n\n        moduleExports.forEach(function(key) {\n          providers[key] = [ getFromPrivateInjector, key, 'private', privateInjector ];\n        });\n\n        // ensure child injector initializes\n        const initializers = (moduleDefinition.__init__ || []).slice();\n\n        initializers.unshift(function() {\n          privateInjector.init();\n        });\n\n        moduleDefinition = Object.assign({}, moduleDefinition, {\n          __init__: initializers\n        });\n\n        return createInitializer(moduleDefinition, privateInjector);\n      }\n\n      // normal module\n      Object.keys(moduleDefinition).forEach(function(key) {\n\n        if (key === '__init__' || key === '__depends__') {\n          return;\n        }\n\n        if (moduleDefinition[key][2] === 'private') {\n          providers[key] = moduleDefinition[key];\n          return;\n        }\n\n        const type = moduleDefinition[key][0];\n        const value = moduleDefinition[key][1];\n\n        providers[key] = [ factoryMap[type], arrayUnwrap(type, value), type ];\n      });\n\n      return createInitializer(moduleDefinition, self);\n    }\n\n    /**\n     * @param {ModuleDefinition[]} moduleDefinitions\n     * @param {ModuleDefinition} moduleDefinition\n     *\n     * @return {ModuleDefinition[]}\n     */\n    function resolveDependencies(moduleDefinitions, moduleDefinition) {\n\n      if (moduleDefinitions.indexOf(moduleDefinition) !== -1) {\n        return moduleDefinitions;\n      }\n\n      moduleDefinitions = (moduleDefinition.__depends__ || []).reduce(resolveDependencies, moduleDefinitions);\n\n      if (moduleDefinitions.indexOf(moduleDefinition) !== -1) {\n        return moduleDefinitions;\n      }\n\n      return moduleDefinitions.concat(moduleDefinition);\n    }\n\n    /**\n     * @param {ModuleDefinition[]} moduleDefinitions\n     *\n     * @return { () => void } initializerFn\n     */\n    function bootstrap(moduleDefinitions) {\n\n      const initializers = moduleDefinitions\n        .reduce(resolveDependencies, [])\n        .map(loadModule);\n\n      let initialized = false;\n\n      return function() {\n\n        if (initialized) {\n          return;\n        }\n\n        initialized = true;\n\n        initializers.forEach(initializer => initializer());\n      };\n    }\n\n    // public API\n    this.get = get;\n    this.invoke = invoke;\n    this.instantiate = instantiate;\n    this.createChild = createChild;\n\n    // setup\n    this.init = bootstrap(modules);\n  }\n\n\n  // helpers ///////////////\n\n  function arrayUnwrap(type, value) {\n    if (type !== 'value' && isArray(value)) {\n      value = annotate(value.slice());\n    }\n\n    return value;\n  }\n\n  /**\n   * @typedef {import('../core/EventBus').default} EventBus\n   * @typedef {import('./Styles').default} Styles\n   */\n\n  // apply default renderer with lowest possible priority\n  // so that it only kicks in if noone else could render\n  var DEFAULT_RENDER_PRIORITY = 1;\n\n  /**\n   * The default renderer used for shapes and connections.\n   *\n   * @param {EventBus} eventBus\n   * @param {Styles} styles\n   */\n  function DefaultRenderer(eventBus, styles) {\n\n    BaseRenderer.call(this, eventBus, DEFAULT_RENDER_PRIORITY);\n\n    this.CONNECTION_STYLE = styles.style([ 'no-fill' ], { strokeWidth: 5, stroke: 'fuchsia' });\n    this.SHAPE_STYLE = styles.style({ fill: 'white', stroke: 'fuchsia', strokeWidth: 2 });\n    this.FRAME_STYLE = styles.style([ 'no-fill' ], { stroke: 'fuchsia', strokeDasharray: 4, strokeWidth: 2 });\n  }\n\n  e(DefaultRenderer, BaseRenderer);\n\n\n  /**\n   * @private\n   */\n  DefaultRenderer.prototype.canRender = function() {\n    return true;\n  };\n\n  /**\n   * @private\n   */\n  DefaultRenderer.prototype.drawShape = function drawShape(visuals, element, attrs) {\n    var rect = create$1('rect');\n\n    attr$1(rect, {\n      x: 0,\n      y: 0,\n      width: element.width || 0,\n      height: element.height || 0\n    });\n\n    if (isFrameElement(element)) {\n      attr$1(rect, assign$1({}, this.FRAME_STYLE, attrs || {}));\n    } else {\n      attr$1(rect, assign$1({}, this.SHAPE_STYLE, attrs || {}));\n    }\n\n    append(visuals, rect);\n\n    return rect;\n  };\n\n  /**\n   * @private\n   */\n  DefaultRenderer.prototype.drawConnection = function drawConnection(visuals, connection, attrs) {\n\n    var line = createLine(connection.waypoints, assign$1({}, this.CONNECTION_STYLE, attrs || {}));\n    append(visuals, line);\n\n    return line;\n  };\n\n  /**\n   * @private\n   */\n  DefaultRenderer.prototype.getShapePath = function getShapePath(shape) {\n\n    var x = shape.x,\n        y = shape.y,\n        width = shape.width,\n        height = shape.height;\n\n    var shapePath = [\n      [ 'M', x, y ],\n      [ 'l', width, 0 ],\n      [ 'l', 0, height ],\n      [ 'l', -width, 0 ],\n      [ 'z' ]\n    ];\n\n    return componentsToPath(shapePath);\n  };\n\n  /**\n   * @private\n   */\n  DefaultRenderer.prototype.getConnectionPath = function getConnectionPath(connection) {\n    var waypoints = connection.waypoints;\n\n    var idx, point, connectionPath = [];\n\n    for (idx = 0; (point = waypoints[idx]); idx++) {\n\n      // take invisible docking into account\n      // when creating the path\n      point = point.original || point;\n\n      connectionPath.push([ idx === 0 ? 'M' : 'L', point.x, point.y ]);\n    }\n\n    return componentsToPath(connectionPath);\n  };\n\n  DefaultRenderer.$inject = [ 'eventBus', 'styles' ];\n\n  /**\n   * A component that manages shape styles\n   */\n  function Styles() {\n\n    var defaultTraits = {\n\n      'no-fill': {\n        fill: 'none'\n      },\n      'no-border': {\n        strokeOpacity: 0.0\n      },\n      'no-events': {\n        pointerEvents: 'none'\n      }\n    };\n\n    var self = this;\n\n    /**\n     * Builds a style definition from a className, a list of traits and an object\n     * of additional attributes.\n     *\n     * @param {string} className\n     * @param {string[]} [traits]\n     * @param {Object} [additionalAttrs]\n     *\n     * @return {Object} the style definition\n     */\n    this.cls = function(className, traits, additionalAttrs) {\n      var attrs = this.style(traits, additionalAttrs);\n\n      return assign$1(attrs, { 'class': className });\n    };\n\n    /**\n     * Builds a style definition from a list of traits and an object of additional\n     * attributes.\n     *\n     * @param {string[]} [traits]\n     * @param {Object} additionalAttrs\n     *\n     * @return {Object} the style definition\n     */\n    this.style = function(traits, additionalAttrs) {\n\n      if (!isArray$2(traits) && !additionalAttrs) {\n        additionalAttrs = traits;\n        traits = [];\n      }\n\n      var attrs = reduce(traits, function(attrs, t) {\n        return assign$1(attrs, defaultTraits[t] || {});\n      }, {});\n\n      return additionalAttrs ? assign$1(attrs, additionalAttrs) : attrs;\n    };\n\n\n    /**\n     * Computes a style definition from a list of traits and an object of\n     * additional attributes, with custom style definition object.\n     *\n     * @param {Object} custom\n     * @param {string[]} [traits]\n     * @param {Object} defaultStyles\n     *\n     * @return {Object} the style definition\n     */\n    this.computeStyle = function(custom, traits, defaultStyles) {\n      if (!isArray$2(traits)) {\n        defaultStyles = traits;\n        traits = [];\n      }\n\n      return self.style(traits || [], assign$1({}, defaultStyles, custom || {}));\n    };\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var DrawModule = {\n    __init__: [ 'defaultRenderer' ],\n    defaultRenderer: [ 'type', DefaultRenderer ],\n    styles: [ 'type', Styles ]\n  };\n\n  /**\n   * Failsafe remove an element from a collection\n   *\n   * @param {Array<Object>} [collection]\n   * @param {Object} [element]\n   *\n   * @return {number} the previous index of the element\n   */\n  function remove(collection, element) {\n\n    if (!collection || !element) {\n      return -1;\n    }\n\n    var idx = collection.indexOf(element);\n\n    if (idx !== -1) {\n      collection.splice(idx, 1);\n    }\n\n    return idx;\n  }\n\n  /**\n   * Fail save add an element to the given connection, ensuring\n   * it does not yet exist.\n   *\n   * @param {Array<Object>} collection\n   * @param {Object} element\n   * @param {number} [idx]\n   */\n  function add(collection, element, idx) {\n\n    if (!collection || !element) {\n      return;\n    }\n\n    if (typeof idx !== 'number') {\n      idx = -1;\n    }\n\n    var currentIdx = collection.indexOf(element);\n\n    if (currentIdx !== -1) {\n\n      if (currentIdx === idx) {\n\n        // nothing to do, position has not changed\n        return;\n      } else {\n\n        if (idx !== -1) {\n\n          // remove from current position\n          collection.splice(currentIdx, 1);\n        } else {\n\n          // already exists in collection\n          return;\n        }\n      }\n    }\n\n    if (idx !== -1) {\n\n      // insert at specified position\n      collection.splice(idx, 0, element);\n    } else {\n\n      // push to end\n      collection.push(element);\n    }\n  }\n\n  /**\n   * @typedef {import('./Types').ConnectionLike} ConnectionLike\n   * @typedef {import('./Types').RootLike} RootLike\n   * @typedef {import('./Types').ParentLike } ParentLike\n   * @typedef {import('./Types').ShapeLike} ShapeLike\n   *\n   * @typedef { {\n   *   container?: HTMLElement;\n   *   deferUpdate?: boolean;\n   *   width?: number;\n   *   height?: number;\n   * } } CanvasConfig\n   * @typedef { {\n   *   group: SVGElement;\n   *   index: number;\n   *   visible: boolean;\n   * } } CanvasLayer\n   * @typedef { {\n   *   [key: string]: CanvasLayer;\n   * } } CanvasLayers\n   * @typedef { {\n   *   rootElement: ShapeLike;\n   *   layer: CanvasLayer;\n   * } } CanvasPlane\n   * @typedef { {\n   *   scale: number;\n   *   inner: Rect;\n   *   outer: Dimensions;\n   * } & Rect } CanvasViewbox\n   *\n   * @typedef {import('./ElementRegistry').default} ElementRegistry\n   * @typedef {import('./EventBus').default} EventBus\n   * @typedef {import('./GraphicsFactory').default} GraphicsFactory\n   *\n   * @typedef {import('../util/Types').Dimensions} Dimensions\n   * @typedef {import('../util/Types').Point} Point\n   * @typedef {import('../util/Types').Rect} Rect\n   * @typedef {import('../util/Types').RectTRBL} RectTRBL\n   */\n\n  function round(number, resolution) {\n    return Math.round(number * resolution) / resolution;\n  }\n\n  function ensurePx(number) {\n    return isNumber(number) ? number + 'px' : number;\n  }\n\n  function findRoot(element) {\n    while (element.parent) {\n      element = element.parent;\n    }\n\n    return element;\n  }\n\n  /**\n   * Creates a HTML container element for a SVG element with\n   * the given configuration\n   *\n   * @param {CanvasConfig} options\n   *\n   * @return {HTMLElement} the container element\n   */\n  function createContainer(options) {\n\n    options = assign$1({}, { width: '100%', height: '100%' }, options);\n\n    const container = options.container || document.body;\n\n    // create a <div> around the svg element with the respective size\n    // this way we can always get the correct container size\n    // (this is impossible for <svg> elements at the moment)\n    const parent = document.createElement('div');\n    parent.setAttribute('class', 'djs-container djs-parent');\n\n    assign(parent, {\n      position: 'relative',\n      overflow: 'hidden',\n      width: ensurePx(options.width),\n      height: ensurePx(options.height)\n    });\n\n    container.appendChild(parent);\n\n    return parent;\n  }\n\n  function createGroup(parent, cls, childIndex) {\n    const group = create$1('g');\n    classes$1(group).add(cls);\n\n    const index = childIndex !== undefined ? childIndex : parent.childNodes.length - 1;\n\n    // must ensure second argument is node or _null_\n    // cf. https://developer.mozilla.org/en-US/docs/Web/API/Node/insertBefore\n    parent.insertBefore(group, parent.childNodes[index] || null);\n\n    return group;\n  }\n\n  const BASE_LAYER = 'base';\n\n  // render plane contents behind utility layers\n  const PLANE_LAYER_INDEX = 0;\n  const UTILITY_LAYER_INDEX = 1;\n\n\n  const REQUIRED_MODEL_ATTRS = {\n    shape: [ 'x', 'y', 'width', 'height' ],\n    connection: [ 'waypoints' ]\n  };\n\n  /**\n   * The main drawing canvas.\n   *\n   * @class\n   * @constructor\n   *\n   * @emits Canvas#canvas.init\n   *\n   * @param {CanvasConfig|null} config\n   * @param {EventBus} eventBus\n   * @param {GraphicsFactory} graphicsFactory\n   * @param {ElementRegistry} elementRegistry\n   */\n  function Canvas(config, eventBus, graphicsFactory, elementRegistry) {\n    this._eventBus = eventBus;\n    this._elementRegistry = elementRegistry;\n    this._graphicsFactory = graphicsFactory;\n\n    /**\n     * @type {number}\n     */\n    this._rootsIdx = 0;\n\n    /**\n     * @type {CanvasLayers}\n     */\n    this._layers = {};\n\n    /**\n     * @type {CanvasPlane[]}\n     */\n    this._planes = [];\n\n    /**\n     * @type {RootLike|null}\n     */\n    this._rootElement = null;\n\n    this._init(config || {});\n  }\n\n  Canvas.$inject = [\n    'config.canvas',\n    'eventBus',\n    'graphicsFactory',\n    'elementRegistry'\n  ];\n\n  /**\n   * Creates a <svg> element that is wrapped into a <div>.\n   * This way we are always able to correctly figure out the size of the svg element\n   * by querying the parent node.\n\n   * (It is not possible to get the size of a svg element cross browser @ 2014-04-01)\n\n   * <div class=\"djs-container\" style=\"width: {desired-width}, height: {desired-height}\">\n   *   <svg width=\"100%\" height=\"100%\">\n   *    ...\n   *   </svg>\n   * </div>\n   *\n   * @param {CanvasConfig} config\n   */\n  Canvas.prototype._init = function(config) {\n\n    const eventBus = this._eventBus;\n\n    // html container\n    const container = this._container = createContainer(config);\n\n    const svg = this._svg = create$1('svg');\n    attr$1(svg, { width: '100%', height: '100%' });\n\n    append(container, svg);\n\n    const viewport = this._viewport = createGroup(svg, 'viewport');\n\n    // debounce canvas.viewbox.changed events\n    // for smoother diagram interaction\n    if (config.deferUpdate !== false) {\n      this._viewboxChanged = debounce(bind$2(this._viewboxChanged, this), 300);\n    }\n\n    eventBus.on('diagram.init', () => {\n\n      /**\n       * An event indicating that the canvas is ready to be drawn on.\n       *\n       * @memberOf Canvas\n       *\n       * @event canvas.init\n       *\n       * @type {Object}\n       * @property {SVGElement} svg the created svg element\n       * @property {SVGElement} viewport the direct parent of diagram elements and shapes\n       */\n      eventBus.fire('canvas.init', {\n        svg: svg,\n        viewport: viewport\n      });\n\n    });\n\n    // reset viewbox on shape changes to\n    // recompute the viewbox\n    eventBus.on([\n      'shape.added',\n      'connection.added',\n      'shape.removed',\n      'connection.removed',\n      'elements.changed',\n      'root.set'\n    ], () => {\n      delete this._cachedViewbox;\n    });\n\n    eventBus.on('diagram.destroy', 500, this._destroy, this);\n    eventBus.on('diagram.clear', 500, this._clear, this);\n  };\n\n  Canvas.prototype._destroy = function() {\n    this._eventBus.fire('canvas.destroy', {\n      svg: this._svg,\n      viewport: this._viewport\n    });\n\n    const parent = this._container.parentNode;\n\n    if (parent) {\n      parent.removeChild(this._container);\n    }\n\n    delete this._svg;\n    delete this._container;\n    delete this._layers;\n    delete this._planes;\n    delete this._rootElement;\n    delete this._viewport;\n  };\n\n  Canvas.prototype._clear = function() {\n\n    const allElements = this._elementRegistry.getAll();\n\n    // remove all elements\n    allElements.forEach(element => {\n      const type = getType(element);\n\n      if (type === 'root') {\n        this.removeRootElement(element);\n      } else {\n        this._removeElement(element, type);\n      }\n    });\n\n    // remove all planes\n    this._planes = [];\n    this._rootElement = null;\n\n    // force recomputation of view box\n    delete this._cachedViewbox;\n  };\n\n  /**\n   * Returns the default layer on which\n   * all elements are drawn.\n   *\n   * @return {SVGElement}  The SVG element of the layer.\n   */\n  Canvas.prototype.getDefaultLayer = function() {\n    return this.getLayer(BASE_LAYER, PLANE_LAYER_INDEX);\n  };\n\n  /**\n   * Returns a layer that is used to draw elements\n   * or annotations on it.\n   *\n   * Non-existing layers retrieved through this method\n   * will be created. During creation, the optional index\n   * may be used to create layers below or above existing layers.\n   * A layer with a certain index is always created above all\n   * existing layers with the same index.\n   *\n   * @param {string} name The name of the layer.\n   * @param {number} [index] The index of the layer.\n   *\n   * @return {SVGElement} The SVG element of the layer.\n   */\n  Canvas.prototype.getLayer = function(name, index) {\n\n    if (!name) {\n      throw new Error('must specify a name');\n    }\n\n    let layer = this._layers[name];\n\n    if (!layer) {\n      layer = this._layers[name] = this._createLayer(name, index);\n    }\n\n    // throw an error if layer creation / retrival is\n    // requested on different index\n    if (typeof index !== 'undefined' && layer.index !== index) {\n      throw new Error('layer <' + name + '> already created at index <' + index + '>');\n    }\n\n    return layer.group;\n  };\n\n  /**\n   * For a given index, return the number of layers that have a higher index and\n   * are visible.\n   *\n   * This is used to determine the node a layer should be inserted at.\n   *\n   * @param {number} index\n   *\n   * @return {number}\n   */\n  Canvas.prototype._getChildIndex = function(index) {\n    return reduce(this._layers, function(childIndex, layer) {\n      if (layer.visible && index >= layer.index) {\n        childIndex++;\n      }\n\n      return childIndex;\n    }, 0);\n  };\n\n  /**\n   * Creates a given layer and returns it.\n   *\n   * @param {string} name\n   * @param {number} [index=0]\n   *\n   * @return {CanvasLayer}\n   */\n  Canvas.prototype._createLayer = function(name, index) {\n\n    if (typeof index === 'undefined') {\n      index = UTILITY_LAYER_INDEX;\n    }\n\n    const childIndex = this._getChildIndex(index);\n\n    return {\n      group: createGroup(this._viewport, 'layer-' + name, childIndex),\n      index: index,\n      visible: true\n    };\n  };\n\n\n  /**\n   * Shows a given layer.\n   *\n   * @param {string} name The name of the layer.\n   *\n   * @return {SVGElement} The SVG element of the layer.\n   */\n  Canvas.prototype.showLayer = function(name) {\n\n    if (!name) {\n      throw new Error('must specify a name');\n    }\n\n    const layer = this._layers[name];\n\n    if (!layer) {\n      throw new Error('layer <' + name + '> does not exist');\n    }\n\n    const viewport = this._viewport;\n    const group = layer.group;\n    const index = layer.index;\n\n    if (layer.visible) {\n      return group;\n    }\n\n    const childIndex = this._getChildIndex(index);\n\n    viewport.insertBefore(group, viewport.childNodes[childIndex] || null);\n\n    layer.visible = true;\n\n    return group;\n  };\n\n  /**\n   * Hides a given layer.\n   *\n   * @param {string} name The name of the layer.\n   *\n   * @return {SVGElement} The SVG element of the layer.\n   */\n  Canvas.prototype.hideLayer = function(name) {\n\n    if (!name) {\n      throw new Error('must specify a name');\n    }\n\n    const layer = this._layers[name];\n\n    if (!layer) {\n      throw new Error('layer <' + name + '> does not exist');\n    }\n\n    const group = layer.group;\n\n    if (!layer.visible) {\n      return group;\n    }\n\n    remove$2(group);\n\n    layer.visible = false;\n\n    return group;\n  };\n\n\n  Canvas.prototype._removeLayer = function(name) {\n\n    const layer = this._layers[name];\n\n    if (layer) {\n      delete this._layers[name];\n\n      remove$2(layer.group);\n    }\n  };\n\n  /**\n   * Returns the currently active layer. Can be null.\n   *\n   * @return {CanvasLayer|null} The active layer of `null`.\n   */\n  Canvas.prototype.getActiveLayer = function() {\n    const plane = this._findPlaneForRoot(this.getRootElement());\n\n    if (!plane) {\n      return null;\n    }\n\n    return plane.layer;\n  };\n\n\n  /**\n   * Returns the plane which contains the given element.\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element or its ID.\n   *\n   * @return {RootLike|undefined} The root of the element.\n   */\n  Canvas.prototype.findRoot = function(element) {\n    if (typeof element === 'string') {\n      element = this._elementRegistry.get(element);\n    }\n\n    if (!element) {\n      return;\n    }\n\n    const plane = this._findPlaneForRoot(\n      findRoot(element)\n    ) || {};\n\n    return plane.rootElement;\n  };\n\n  /**\n   * Return a list of all root elements on the diagram.\n   *\n   * @return {(RootLike)[]} The list of root elements.\n   */\n  Canvas.prototype.getRootElements = function() {\n    return this._planes.map(function(plane) {\n      return plane.rootElement;\n    });\n  };\n\n  Canvas.prototype._findPlaneForRoot = function(rootElement) {\n    return find(this._planes, function(plane) {\n      return plane.rootElement === rootElement;\n    });\n  };\n\n\n  /**\n   * Returns the html element that encloses the\n   * drawing canvas.\n   *\n   * @return {HTMLElement} The HTML element of the container.\n   */\n  Canvas.prototype.getContainer = function() {\n    return this._container;\n  };\n\n\n  // markers //////////////////////\n\n  Canvas.prototype._updateMarker = function(element, marker, add) {\n    let container;\n\n    if (!element.id) {\n      element = this._elementRegistry.get(element);\n    }\n\n    // we need to access all\n    container = this._elementRegistry._elements[element.id];\n\n    if (!container) {\n      return;\n    }\n\n    forEach$1([ container.gfx, container.secondaryGfx ], function(gfx) {\n      if (gfx) {\n\n        // invoke either addClass or removeClass based on mode\n        if (add) {\n          classes$1(gfx).add(marker);\n        } else {\n          classes$1(gfx).remove(marker);\n        }\n      }\n    });\n\n    /**\n     * An event indicating that a marker has been updated for an element\n     *\n     * @event element.marker.update\n     * @type {Object}\n     * @property {Element} element the shape\n     * @property {SVGElement} gfx the graphical representation of the shape\n     * @property {string} marker\n     * @property {boolean} add true if the marker was added, false if it got removed\n     */\n    this._eventBus.fire('element.marker.update', { element: element, gfx: container.gfx, marker: marker, add: !!add });\n  };\n\n\n  /**\n   * Adds a marker to an element (basically a css class).\n   *\n   * Fires the element.marker.update event, making it possible to\n   * integrate extension into the marker life-cycle, too.\n   *\n   * @example\n   *\n   * ```javascript\n   * canvas.addMarker('foo', 'some-marker');\n   *\n   * const fooGfx = canvas.getGraphics('foo');\n   *\n   * fooGfx; // <g class=\"... some-marker\"> ... </g>\n   * ```\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element or its ID.\n   * @param {string} marker The marker.\n   */\n  Canvas.prototype.addMarker = function(element, marker) {\n    this._updateMarker(element, marker, true);\n  };\n\n\n  /**\n   * Remove a marker from an element.\n   *\n   * Fires the element.marker.update event, making it possible to\n   * integrate extension into the marker life-cycle, too.\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element or its ID.\n   * @param {string} marker The marker.\n   */\n  Canvas.prototype.removeMarker = function(element, marker) {\n    this._updateMarker(element, marker, false);\n  };\n\n  /**\n   * Check whether an element has a given marker.\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element or its ID.\n   * @param {string} marker The marker.\n   */\n  Canvas.prototype.hasMarker = function(element, marker) {\n    if (!element.id) {\n      element = this._elementRegistry.get(element);\n    }\n\n    const gfx = this.getGraphics(element);\n\n    return classes$1(gfx).has(marker);\n  };\n\n  /**\n   * Toggles a marker on an element.\n   *\n   * Fires the element.marker.update event, making it possible to\n   * integrate extension into the marker life-cycle, too.\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element or its ID.\n   * @param {string} marker The marker.\n   */\n  Canvas.prototype.toggleMarker = function(element, marker) {\n    if (this.hasMarker(element, marker)) {\n      this.removeMarker(element, marker);\n    } else {\n      this.addMarker(element, marker);\n    }\n  };\n\n  /**\n   * Returns the current root element.\n   *\n   * Supports two different modes for handling root elements:\n   *\n   * 1. if no root element has been added before, an implicit root will be added\n   * and returned. This is used in applications that don't require explicit\n   * root elements.\n   *\n   * 2. when root elements have been added before calling `getRootElement`,\n   * root elements can be null. This is used for applications that want to manage\n   * root elements themselves.\n   *\n   * @return {RootLike} The current root element.\n   */\n  Canvas.prototype.getRootElement = function() {\n    const rootElement = this._rootElement;\n\n    // can return null if root elements are present but none was set yet\n    if (rootElement || this._planes.length) {\n      return rootElement;\n    }\n\n    return this.setRootElement(this.addRootElement(null));\n  };\n\n  /**\n   * Adds a given root element and returns it.\n   *\n   * @param {RootLike} [rootElement] The root element to be added.\n   *\n   * @return {RootLike} The added root element or an implicit root element.\n   */\n  Canvas.prototype.addRootElement = function(rootElement) {\n    const idx = this._rootsIdx++;\n\n    if (!rootElement) {\n      rootElement = {\n        id: '__implicitroot_' + idx,\n        children: [],\n        isImplicit: true\n      };\n    }\n\n    const layerName = rootElement.layer = 'root-' + idx;\n\n    this._ensureValid('root', rootElement);\n\n    const layer = this.getLayer(layerName, PLANE_LAYER_INDEX);\n\n    this.hideLayer(layerName);\n\n    this._addRoot(rootElement, layer);\n\n    this._planes.push({\n      rootElement: rootElement,\n      layer: layer\n    });\n\n    return rootElement;\n  };\n\n  /**\n   * Removes a given root element and returns it.\n   *\n   * @param {RootLike|string} rootElement element or element ID\n   *\n   * @return {RootLike|undefined} removed element\n   */\n  Canvas.prototype.removeRootElement = function(rootElement) {\n\n    if (typeof rootElement === 'string') {\n      rootElement = this._elementRegistry.get(rootElement);\n    }\n\n    const plane = this._findPlaneForRoot(rootElement);\n\n    if (!plane) {\n      return;\n    }\n\n    // hook up life-cycle events\n    this._removeRoot(rootElement);\n\n    // clean up layer\n    this._removeLayer(rootElement.layer);\n\n    // clean up plane\n    this._planes = this._planes.filter(function(plane) {\n      return plane.rootElement !== rootElement;\n    });\n\n    // clean up active root\n    if (this._rootElement === rootElement) {\n      this._rootElement = null;\n    }\n\n    return rootElement;\n  };\n\n\n  /**\n   * Sets a given element as the new root element for the canvas\n   * and returns the new root element.\n   *\n   * @param {RootLike} rootElement The root element to be set.\n   *\n   * @return {RootLike} The set root element.\n   */\n  Canvas.prototype.setRootElement = function(rootElement) {\n\n    if (rootElement === this._rootElement) {\n      return;\n    }\n\n    let plane;\n\n    if (!rootElement) {\n      throw new Error('rootElement required');\n    }\n\n    plane = this._findPlaneForRoot(rootElement);\n\n    // give set add semantics for backwards compatibility\n    if (!plane) {\n      rootElement = this.addRootElement(rootElement);\n    }\n\n    this._setRoot(rootElement);\n\n    return rootElement;\n  };\n\n\n  Canvas.prototype._removeRoot = function(element) {\n    const elementRegistry = this._elementRegistry,\n          eventBus = this._eventBus;\n\n    // simulate element remove event sequence\n    eventBus.fire('root.remove', { element: element });\n    eventBus.fire('root.removed', { element: element });\n\n    elementRegistry.remove(element);\n  };\n\n\n  Canvas.prototype._addRoot = function(element, gfx) {\n    const elementRegistry = this._elementRegistry,\n          eventBus = this._eventBus;\n\n    // resemble element add event sequence\n    eventBus.fire('root.add', { element: element });\n\n    elementRegistry.add(element, gfx);\n\n    eventBus.fire('root.added', { element: element, gfx: gfx });\n  };\n\n\n  Canvas.prototype._setRoot = function(rootElement, layer) {\n\n    const currentRoot = this._rootElement;\n\n    if (currentRoot) {\n\n      // un-associate previous root element <svg>\n      this._elementRegistry.updateGraphics(currentRoot, null, true);\n\n      // hide previous layer\n      this.hideLayer(currentRoot.layer);\n    }\n\n    if (rootElement) {\n\n      if (!layer) {\n        layer = this._findPlaneForRoot(rootElement).layer;\n      }\n\n      // associate element with <svg>\n      this._elementRegistry.updateGraphics(rootElement, this._svg, true);\n\n      // show root layer\n      this.showLayer(rootElement.layer);\n    }\n\n    this._rootElement = rootElement;\n\n    this._eventBus.fire('root.set', { element: rootElement });\n  };\n\n  Canvas.prototype._ensureValid = function(type, element) {\n    if (!element.id) {\n      throw new Error('element must have an id');\n    }\n\n    if (this._elementRegistry.get(element.id)) {\n      throw new Error('element <' + element.id + '> already exists');\n    }\n\n    const requiredAttrs = REQUIRED_MODEL_ATTRS[type];\n\n    const valid = every(requiredAttrs, function(attr) {\n      return typeof element[attr] !== 'undefined';\n    });\n\n    if (!valid) {\n      throw new Error(\n        'must supply { ' + requiredAttrs.join(', ') + ' } with ' + type);\n    }\n  };\n\n  Canvas.prototype._setParent = function(element, parent, parentIndex) {\n    add(parent.children, element, parentIndex);\n    element.parent = parent;\n  };\n\n  /**\n   * Adds an element to the canvas.\n   *\n   * This wires the parent <-> child relationship between the element and\n   * a explicitly specified parent or an implicit root element.\n   *\n   * During add it emits the events\n   *\n   *  * <{type}.add> (element, parent)\n   *  * <{type}.added> (element, gfx)\n   *\n   * Extensions may hook into these events to perform their magic.\n   *\n   * @param {string} type\n   * @param {ConnectionLike|ShapeLike} element\n   * @param {ShapeLike} [parent]\n   * @param {number} [parentIndex]\n   *\n   * @return {ConnectionLike|ShapeLike} The added element.\n   */\n  Canvas.prototype._addElement = function(type, element, parent, parentIndex) {\n\n    parent = parent || this.getRootElement();\n\n    const eventBus = this._eventBus,\n          graphicsFactory = this._graphicsFactory;\n\n    this._ensureValid(type, element);\n\n    eventBus.fire(type + '.add', { element: element, parent: parent });\n\n    this._setParent(element, parent, parentIndex);\n\n    // create graphics\n    const gfx = graphicsFactory.create(type, element, parentIndex);\n\n    this._elementRegistry.add(element, gfx);\n\n    // update its visual\n    graphicsFactory.update(type, element, gfx);\n\n    eventBus.fire(type + '.added', { element: element, gfx: gfx });\n\n    return element;\n  };\n\n  /**\n   * Adds a shape to the canvas.\n   *\n   * @param {ShapeLike} shape The shape to be added\n   * @param {ParentLike} [parent] The shape's parent.\n   * @param {number} [parentIndex] The index at which to add the shape to the parent's children.\n   *\n   * @return {ShapeLike} The added shape.\n   */\n  Canvas.prototype.addShape = function(shape, parent, parentIndex) {\n    return this._addElement('shape', shape, parent, parentIndex);\n  };\n\n  /**\n   * Adds a connection to the canvas.\n   *\n   * @param {ConnectionLike} connection The connection to be added.\n   * @param {ParentLike} [parent] The connection's parent.\n   * @param {number} [parentIndex] The index at which to add the connection to the parent's children.\n   *\n   * @return {ConnectionLike} The added connection.\n   */\n  Canvas.prototype.addConnection = function(connection, parent, parentIndex) {\n    return this._addElement('connection', connection, parent, parentIndex);\n  };\n\n\n  /**\n   * Internal remove element\n   */\n  Canvas.prototype._removeElement = function(element, type) {\n\n    const elementRegistry = this._elementRegistry,\n          graphicsFactory = this._graphicsFactory,\n          eventBus = this._eventBus;\n\n    element = elementRegistry.get(element.id || element);\n\n    if (!element) {\n\n      // element was removed already\n      return;\n    }\n\n    eventBus.fire(type + '.remove', { element: element });\n\n    graphicsFactory.remove(element);\n\n    // unset parent <-> child relationship\n    remove(element.parent && element.parent.children, element);\n    element.parent = null;\n\n    eventBus.fire(type + '.removed', { element: element });\n\n    elementRegistry.remove(element);\n\n    return element;\n  };\n\n\n  /**\n   * Removes a shape from the canvas.\n   *\n   * @fires ShapeRemoveEvent\n   * @fires ShapeRemovedEvent\n   *\n   * @param {ShapeLike|string} shape The shape or its ID.\n   *\n   * @return {ShapeLike} The removed shape.\n   */\n  Canvas.prototype.removeShape = function(shape) {\n\n    /**\n     * An event indicating that a shape is about to be removed from the canvas.\n     *\n     * @memberOf Canvas\n     *\n     * @event ShapeRemoveEvent\n     * @type {Object}\n     * @property {ShapeLike} element The shape.\n     * @property {SVGElement} gfx The graphical element.\n     */\n\n    /**\n     * An event indicating that a shape has been removed from the canvas.\n     *\n     * @memberOf Canvas\n     *\n     * @event ShapeRemovedEvent\n     * @type {Object}\n     * @property {ShapeLike} element The shape.\n     * @property {SVGElement} gfx The graphical element.\n     */\n    return this._removeElement(shape, 'shape');\n  };\n\n\n  /**\n   * Removes a connection from the canvas.\n   *\n   * @fires ConnectionRemoveEvent\n   * @fires ConnectionRemovedEvent\n   *\n   * @param {ConnectionLike|string} connection The connection or its ID.\n   *\n   * @return {ConnectionLike} The removed connection.\n   */\n  Canvas.prototype.removeConnection = function(connection) {\n\n    /**\n     * An event indicating that a connection is about to be removed from the canvas.\n     *\n     * @memberOf Canvas\n     *\n     * @event ConnectionRemoveEvent\n     * @type {Object}\n     * @property {ConnectionLike} element The connection.\n     * @property {SVGElement} gfx The graphical element.\n     */\n\n    /**\n     * An event indicating that a connection has been removed from the canvas.\n     *\n     * @memberOf Canvas\n     *\n     * @event ConnectionRemovedEvent\n     * @type {Object}\n     * @property {ConnectionLike} element The connection.\n     * @property {SVGElement} gfx The graphical element.\n     */\n    return this._removeElement(connection, 'connection');\n  };\n\n\n  /**\n   * Returns the graphical element of an element.\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element or its ID.\n   * @param {boolean} [secondary=false] Whether to return the secondary graphical element.\n   *\n   * @return {SVGElement} The graphical element.\n   */\n  Canvas.prototype.getGraphics = function(element, secondary) {\n    return this._elementRegistry.getGraphics(element, secondary);\n  };\n\n\n  /**\n   * Perform a viewbox update via a given change function.\n   *\n   * @param {Function} changeFn\n   */\n  Canvas.prototype._changeViewbox = function(changeFn) {\n\n    // notify others of the upcoming viewbox change\n    this._eventBus.fire('canvas.viewbox.changing');\n\n    // perform actual change\n    changeFn.apply(this);\n\n    // reset the cached viewbox so that\n    // a new get operation on viewbox or zoom\n    // triggers a viewbox re-computation\n    this._cachedViewbox = null;\n\n    // notify others of the change; this step\n    // may or may not be debounced\n    this._viewboxChanged();\n  };\n\n  Canvas.prototype._viewboxChanged = function() {\n    this._eventBus.fire('canvas.viewbox.changed', { viewbox: this.viewbox() });\n  };\n\n\n  /**\n   * Gets or sets the view box of the canvas, i.e. the\n   * area that is currently displayed.\n   *\n   * The getter may return a cached viewbox (if it is currently\n   * changing). To force a recomputation, pass `false` as the first argument.\n   *\n   * @example\n   *\n   * ```javascript\n   * canvas.viewbox({ x: 100, y: 100, width: 500, height: 500 })\n   *\n   * // sets the visible area of the diagram to (100|100) -> (600|100)\n   * // and and scales it according to the diagram width\n   *\n   * const viewbox = canvas.viewbox(); // pass `false` to force recomputing the box.\n   *\n   * console.log(viewbox);\n   * // {\n   * //   inner: Dimensions,\n   * //   outer: Dimensions,\n   * //   scale,\n   * //   x, y,\n   * //   width, height\n   * // }\n   *\n   * // if the current diagram is zoomed and scrolled, you may reset it to the\n   * // default zoom via this method, too:\n   *\n   * const zoomedAndScrolledViewbox = canvas.viewbox();\n   *\n   * canvas.viewbox({\n   *   x: 0,\n   *   y: 0,\n   *   width: zoomedAndScrolledViewbox.outer.width,\n   *   height: zoomedAndScrolledViewbox.outer.height\n   * });\n   * ```\n   *\n   * @param {Rect} [box] The viewbox to be set.\n   *\n   * @return {CanvasViewbox} The set viewbox.\n   */\n  Canvas.prototype.viewbox = function(box) {\n\n    if (box === undefined && this._cachedViewbox) {\n      return this._cachedViewbox;\n    }\n\n    const viewport = this._viewport,\n          outerBox = this.getSize();\n    let innerBox,\n        matrix,\n        activeLayer,\n        transform,\n        scale,\n        x, y;\n\n    if (!box) {\n\n      // compute the inner box based on the\n      // diagrams active layer. This allows us to exclude\n      // external components, such as overlays\n\n      activeLayer = this._rootElement ? this.getActiveLayer() : null;\n      innerBox = activeLayer && activeLayer.getBBox() || {};\n\n      transform = transform$1(viewport);\n      matrix = transform ? transform.matrix : createMatrix();\n      scale = round(matrix.a, 1000);\n\n      x = round(-matrix.e || 0, 1000);\n      y = round(-matrix.f || 0, 1000);\n\n      box = this._cachedViewbox = {\n        x: x ? x / scale : 0,\n        y: y ? y / scale : 0,\n        width: outerBox.width / scale,\n        height: outerBox.height / scale,\n        scale: scale,\n        inner: {\n          width: innerBox.width || 0,\n          height: innerBox.height || 0,\n          x: innerBox.x || 0,\n          y: innerBox.y || 0\n        },\n        outer: outerBox\n      };\n\n      return box;\n    } else {\n\n      this._changeViewbox(function() {\n        scale = Math.min(outerBox.width / box.width, outerBox.height / box.height);\n\n        const matrix = this._svg.createSVGMatrix()\n          .scale(scale)\n          .translate(-box.x, -box.y);\n\n        transform$1(viewport, matrix);\n      });\n    }\n\n    return box;\n  };\n\n\n  /**\n   * Gets or sets the scroll of the canvas.\n   *\n   * @param {Point} [delta] The scroll to be set.\n   *\n   * @return {Point}\n   */\n  Canvas.prototype.scroll = function(delta) {\n\n    const node = this._viewport;\n    let matrix = node.getCTM();\n\n    if (delta) {\n      this._changeViewbox(function() {\n        delta = assign$1({ dx: 0, dy: 0 }, delta || {});\n\n        matrix = this._svg.createSVGMatrix().translate(delta.dx, delta.dy).multiply(matrix);\n\n        setCTM(node, matrix);\n      });\n    }\n\n    return { x: matrix.e, y: matrix.f };\n  };\n\n  /**\n   * Scrolls the viewbox to contain the given element.\n   * Optionally specify a padding to be applied to the edges.\n   *\n   * @param {ShapeLike|ConnectionLike|string} element The element to scroll to or its ID.\n   * @param {RectTRBL|number} [padding=100] The padding to be applied. Can also specify top, bottom, left and right.\n   */\n  Canvas.prototype.scrollToElement = function(element, padding) {\n    let defaultPadding = 100;\n\n    if (typeof element === 'string') {\n      element = this._elementRegistry.get(element);\n    }\n\n    // set to correct rootElement\n    const rootElement = this.findRoot(element);\n\n    if (rootElement !== this.getRootElement()) {\n      this.setRootElement(rootElement);\n    }\n\n    if (!padding) {\n      padding = {};\n    }\n    if (typeof padding === 'number') {\n      defaultPadding = padding;\n    }\n\n    padding = {\n      top: padding.top || defaultPadding,\n      right: padding.right || defaultPadding,\n      bottom: padding.bottom || defaultPadding,\n      left: padding.left || defaultPadding\n    };\n\n    const elementBounds = getBBox(element),\n          elementTrbl = asTRBL(elementBounds),\n          viewboxBounds = this.viewbox(),\n          zoom = this.zoom();\n    let dx, dy;\n\n    // shrink viewboxBounds with padding\n    viewboxBounds.y += padding.top / zoom;\n    viewboxBounds.x += padding.left / zoom;\n    viewboxBounds.width -= (padding.right + padding.left) / zoom;\n    viewboxBounds.height -= (padding.bottom + padding.top) / zoom;\n\n    const viewboxTrbl = asTRBL(viewboxBounds);\n\n    const canFit = elementBounds.width < viewboxBounds.width && elementBounds.height < viewboxBounds.height;\n\n    if (!canFit) {\n\n      // top-left when element can't fit\n      dx = elementBounds.x - viewboxBounds.x;\n      dy = elementBounds.y - viewboxBounds.y;\n\n    } else {\n\n      const dRight = Math.max(0, elementTrbl.right - viewboxTrbl.right),\n            dLeft = Math.min(0, elementTrbl.left - viewboxTrbl.left),\n            dBottom = Math.max(0, elementTrbl.bottom - viewboxTrbl.bottom),\n            dTop = Math.min(0, elementTrbl.top - viewboxTrbl.top);\n\n      dx = dRight || dLeft;\n      dy = dBottom || dTop;\n\n    }\n\n    this.scroll({ dx: -dx * zoom, dy: -dy * zoom });\n  };\n\n  /**\n   * Gets or sets the current zoom of the canvas, optionally zooming to the\n   * specified position.\n   *\n   * The getter may return a cached zoom level. Call it with `false` as the first\n   * argument to force recomputation of the current level.\n   *\n   * @param {number|'fit-viewport'} [newScale] The new zoom level, either a number,\n   * i.e. 0.9, or `fit-viewport` to adjust the size to fit the current viewport.\n   * @param {Point} [center] The reference point { x: ..., y: ...} to zoom to.\n   *\n   * @return {number} The set zoom level.\n   */\n  Canvas.prototype.zoom = function(newScale, center) {\n\n    if (!newScale) {\n      return this.viewbox(newScale).scale;\n    }\n\n    if (newScale === 'fit-viewport') {\n      return this._fitViewport(center);\n    }\n\n    let outer,\n        matrix;\n\n    this._changeViewbox(function() {\n\n      if (typeof center !== 'object') {\n        outer = this.viewbox().outer;\n\n        center = {\n          x: outer.width / 2,\n          y: outer.height / 2\n        };\n      }\n\n      matrix = this._setZoom(newScale, center);\n    });\n\n    return round(matrix.a, 1000);\n  };\n\n  function setCTM(node, m) {\n    const mstr = 'matrix(' + m.a + ',' + m.b + ',' + m.c + ',' + m.d + ',' + m.e + ',' + m.f + ')';\n    node.setAttribute('transform', mstr);\n  }\n\n  Canvas.prototype._fitViewport = function(center) {\n\n    const vbox = this.viewbox(),\n          outer = vbox.outer,\n          inner = vbox.inner;\n    let newScale,\n        newViewbox;\n\n    // display the complete diagram without zooming in.\n    // instead of relying on internal zoom, we perform a\n    // hard reset on the canvas viewbox to realize this\n    //\n    // if diagram does not need to be zoomed in, we focus it around\n    // the diagram origin instead\n\n    if (inner.x >= 0 &&\n        inner.y >= 0 &&\n        inner.x + inner.width <= outer.width &&\n        inner.y + inner.height <= outer.height &&\n        !center) {\n\n      newViewbox = {\n        x: 0,\n        y: 0,\n        width: Math.max(inner.width + inner.x, outer.width),\n        height: Math.max(inner.height + inner.y, outer.height)\n      };\n    } else {\n\n      newScale = Math.min(1, outer.width / inner.width, outer.height / inner.height);\n      newViewbox = {\n        x: inner.x + (center ? inner.width / 2 - outer.width / newScale / 2 : 0),\n        y: inner.y + (center ? inner.height / 2 - outer.height / newScale / 2 : 0),\n        width: outer.width / newScale,\n        height: outer.height / newScale\n      };\n    }\n\n    this.viewbox(newViewbox);\n\n    return this.viewbox(false).scale;\n  };\n\n\n  Canvas.prototype._setZoom = function(scale, center) {\n\n    const svg = this._svg,\n          viewport = this._viewport;\n\n    const matrix = svg.createSVGMatrix();\n    const point = svg.createSVGPoint();\n\n    let centerPoint,\n        originalPoint,\n        currentMatrix,\n        scaleMatrix,\n        newMatrix;\n\n    currentMatrix = viewport.getCTM();\n\n    const currentScale = currentMatrix.a;\n\n    if (center) {\n      centerPoint = assign$1(point, center);\n\n      // revert applied viewport transformations\n      originalPoint = centerPoint.matrixTransform(currentMatrix.inverse());\n\n      // create scale matrix\n      scaleMatrix = matrix\n        .translate(originalPoint.x, originalPoint.y)\n        .scale(1 / currentScale * scale)\n        .translate(-originalPoint.x, -originalPoint.y);\n\n      newMatrix = currentMatrix.multiply(scaleMatrix);\n    } else {\n      newMatrix = matrix.scale(scale);\n    }\n\n    setCTM(this._viewport, newMatrix);\n\n    return newMatrix;\n  };\n\n\n  /**\n   * Returns the size of the canvas.\n   *\n   * @return {Dimensions} The size of the canvas.\n   */\n  Canvas.prototype.getSize = function() {\n    return {\n      width: this._container.clientWidth,\n      height: this._container.clientHeight\n    };\n  };\n\n\n  /**\n   * Returns the absolute bounding box of an element.\n   *\n   * The absolute bounding box may be used to display overlays in the callers\n   * (browser) coordinate system rather than the zoomed in/out canvas coordinates.\n   *\n   * @param {ShapeLike|ConnectionLike} element The element.\n   *\n   * @return {Rect} The element's absolute bounding box.\n   */\n  Canvas.prototype.getAbsoluteBBox = function(element) {\n    const vbox = this.viewbox();\n    let bbox;\n\n    // connection\n    // use svg bbox\n    if (element.waypoints) {\n      const gfx = this.getGraphics(element);\n\n      bbox = gfx.getBBox();\n    }\n\n    // shapes\n    // use data\n    else {\n      bbox = element;\n    }\n\n    const x = bbox.x * vbox.scale - vbox.x * vbox.scale;\n    const y = bbox.y * vbox.scale - vbox.y * vbox.scale;\n\n    const width = bbox.width * vbox.scale;\n    const height = bbox.height * vbox.scale;\n\n    return {\n      x: x,\n      y: y,\n      width: width,\n      height: height\n    };\n  };\n\n  /**\n   * Fires an event so other modules can react to the canvas resizing.\n   */\n  Canvas.prototype.resized = function() {\n\n    // force recomputation of view box\n    delete this._cachedViewbox;\n\n    this._eventBus.fire('canvas.resized');\n  };\n\n  var ELEMENT_ID = 'data-element-id';\n\n  /**\n   * @typedef {import('./Types').ElementLike} ElementLike\n   *\n   * @typedef {import('./EventBus').default} EventBus\n   *\n   * @typedef { (element: ElementLike, gfx: SVGElement) => boolean|any } ElementRegistryFilterCallback\n   * @typedef { (element: ElementLike, gfx: SVGElement) => any } ElementRegistryForEachCallback\n   */\n\n  /**\n   * A registry that keeps track of all shapes in the diagram.\n   *\n   * @class\n   * @constructor\n   *\n   * @param {EventBus} eventBus\n   */\n  function ElementRegistry(eventBus) {\n\n    /**\n     * @type { {\n     *   [id: string]: {\n     *     element: ElementLike;\n     *     gfx?: SVGElement;\n     *     secondaryGfx?: SVGElement;\n     *   }\n     * } }\n     */\n    this._elements = {};\n\n    this._eventBus = eventBus;\n  }\n\n  ElementRegistry.$inject = [ 'eventBus' ];\n\n  /**\n   * Add an element and its graphical representation(s) to the registry.\n   *\n   * @param {ElementLike} element The element to be added.\n   * @param {SVGElement} gfx The primary graphical representation.\n   * @param {SVGElement} [secondaryGfx] The secondary graphical representation.\n   */\n  ElementRegistry.prototype.add = function(element, gfx, secondaryGfx) {\n\n    var id = element.id;\n\n    this._validateId(id);\n\n    // associate dom node with element\n    attr$1(gfx, ELEMENT_ID, id);\n\n    if (secondaryGfx) {\n      attr$1(secondaryGfx, ELEMENT_ID, id);\n    }\n\n    this._elements[id] = { element: element, gfx: gfx, secondaryGfx: secondaryGfx };\n  };\n\n  /**\n   * Remove an element from the registry.\n   *\n   * @param {ElementLike|string} element\n   */\n  ElementRegistry.prototype.remove = function(element) {\n    var elements = this._elements,\n        id = element.id || element,\n        container = id && elements[id];\n\n    if (container) {\n\n      // unset element id on gfx\n      attr$1(container.gfx, ELEMENT_ID, '');\n\n      if (container.secondaryGfx) {\n        attr$1(container.secondaryGfx, ELEMENT_ID, '');\n      }\n\n      delete elements[id];\n    }\n  };\n\n  /**\n   * Update an elements ID.\n   *\n   * @param {ElementLike|string} element The element or its ID.\n   * @param {string} newId The new ID.\n   */\n  ElementRegistry.prototype.updateId = function(element, newId) {\n\n    this._validateId(newId);\n\n    if (typeof element === 'string') {\n      element = this.get(element);\n    }\n\n    this._eventBus.fire('element.updateId', {\n      element: element,\n      newId: newId\n    });\n\n    var gfx = this.getGraphics(element),\n        secondaryGfx = this.getGraphics(element, true);\n\n    this.remove(element);\n\n    element.id = newId;\n\n    this.add(element, gfx, secondaryGfx);\n  };\n\n  /**\n   * Update the graphical representation of an element.\n   *\n   * @param {ElementLike|string} filter The element or its ID.\n   * @param {SVGElement} gfx The new graphical representation.\n   * @param {boolean} [secondary=false] Whether to update the secondary graphical representation.\n   */\n  ElementRegistry.prototype.updateGraphics = function(filter, gfx, secondary) {\n    var id = filter.id || filter;\n\n    var container = this._elements[id];\n\n    if (secondary) {\n      container.secondaryGfx = gfx;\n    } else {\n      container.gfx = gfx;\n    }\n\n    if (gfx) {\n      attr$1(gfx, ELEMENT_ID, id);\n    }\n\n    return gfx;\n  };\n\n  /**\n   * Get the element with the given ID or graphical representation.\n   *\n   * @example\n   *\n   * ```javascript\n   * elementRegistry.get('SomeElementId_1');\n   *\n   * elementRegistry.get(gfx);\n   * ```\n   *\n   * @param {string|SVGElement} filter The elements ID or graphical representation.\n   *\n   * @return {ElementLike|undefined} The element.\n   */\n  ElementRegistry.prototype.get = function(filter) {\n    var id;\n\n    if (typeof filter === 'string') {\n      id = filter;\n    } else {\n      id = filter && attr$1(filter, ELEMENT_ID);\n    }\n\n    var container = this._elements[id];\n    return container && container.element;\n  };\n\n  /**\n   * Return all elements that match a given filter function.\n   *\n   * @param {ElementRegistryFilterCallback} fn The filter function.\n   *\n   * @return {ElementLike[]} The matching elements.\n   */\n  ElementRegistry.prototype.filter = function(fn) {\n\n    var filtered = [];\n\n    this.forEach(function(element, gfx) {\n      if (fn(element, gfx)) {\n        filtered.push(element);\n      }\n    });\n\n    return filtered;\n  };\n\n  /**\n   * Return the first element that matches the given filter function.\n   *\n   * @param {ElementRegistryFilterCallback} fn The filter function.\n   *\n   * @return {ElementLike|undefined} The matching element.\n   */\n  ElementRegistry.prototype.find = function(fn) {\n    var map = this._elements,\n        keys = Object.keys(map);\n\n    for (var i = 0; i < keys.length; i++) {\n      var id = keys[i],\n          container = map[id],\n          element = container.element,\n          gfx = container.gfx;\n\n      if (fn(element, gfx)) {\n        return element;\n      }\n    }\n  };\n\n  /**\n   * Get all elements.\n   *\n   * @return {ElementLike[]} All elements.\n   */\n  ElementRegistry.prototype.getAll = function() {\n    return this.filter(function(e) { return e; });\n  };\n\n  /**\n   * Execute a given function for each element.\n   *\n   * @param {ElementRegistryForEachCallback} fn The function to execute.\n   */\n  ElementRegistry.prototype.forEach = function(fn) {\n\n    var map = this._elements;\n\n    Object.keys(map).forEach(function(id) {\n      var container = map[id],\n          element = container.element,\n          gfx = container.gfx;\n\n      return fn(element, gfx);\n    });\n  };\n\n  /**\n   * Return the graphical representation of an element.\n   *\n   * @example\n   *\n   * ```javascript\n   * elementRegistry.getGraphics('SomeElementId_1');\n   *\n   * elementRegistry.getGraphics(rootElement); // <g ...>\n   *\n   * elementRegistry.getGraphics(rootElement, true); // <svg ...>\n   * ```\n   *\n   * @param {ElementLike|string} filter The element or its ID.\n   * @param {boolean} [secondary=false] Whether to return the secondary graphical representation.\n   *\n   * @return {SVGElement} The graphical representation.\n   */\n  ElementRegistry.prototype.getGraphics = function(filter, secondary) {\n    var id = filter.id || filter;\n\n    var container = this._elements[id];\n    return container && (secondary ? container.secondaryGfx : container.gfx);\n  };\n\n  /**\n   * Validate an ID and throw an error if invalid.\n   *\n   * @param {string} id\n   *\n   * @throws {Error} Error indicating that the ID is invalid or already assigned.\n   */\n  ElementRegistry.prototype._validateId = function(id) {\n    if (!id) {\n      throw new Error('element must have an id');\n    }\n\n    if (this._elements[id]) {\n      throw new Error('element with id ' + id + ' already added');\n    }\n  };\n\n  var objectRefs = {exports: {}};\n\n  var collection = {};\n\n  /**\n   * An empty collection stub. Use {@link RefsCollection.extend} to extend a\n   * collection with ref semantics.\n   *\n   * @class RefsCollection\n   */\n\n  /**\n   * Extends a collection with {@link Refs} aware methods\n   *\n   * @memberof RefsCollection\n   * @static\n   *\n   * @param  {Array<Object>} collection\n   * @param  {Refs} refs instance\n   * @param  {Object} property represented by the collection\n   * @param  {Object} target object the collection is attached to\n   *\n   * @return {RefsCollection<Object>} the extended array\n   */\n  function extend(collection, refs, property, target) {\n\n    var inverseProperty = property.inverse;\n\n    /**\n     * Removes the given element from the array and returns it.\n     *\n     * @method RefsCollection#remove\n     *\n     * @param {Object} element the element to remove\n     */\n    Object.defineProperty(collection, 'remove', {\n      value: function(element) {\n        var idx = this.indexOf(element);\n        if (idx !== -1) {\n          this.splice(idx, 1);\n\n          // unset inverse\n          refs.unset(element, inverseProperty, target);\n        }\n\n        return element;\n      }\n    });\n\n    /**\n     * Returns true if the collection contains the given element\n     *\n     * @method RefsCollection#contains\n     *\n     * @param {Object} element the element to check for\n     */\n    Object.defineProperty(collection, 'contains', {\n      value: function(element) {\n        return this.indexOf(element) !== -1;\n      }\n    });\n\n    /**\n     * Adds an element to the array, unless it exists already (set semantics).\n     *\n     * @method RefsCollection#add\n     *\n     * @param {Object} element the element to add\n     * @param {Number} optional index to add element to\n     *                 (possibly moving other elements around)\n     */\n    Object.defineProperty(collection, 'add', {\n      value: function(element, idx) {\n\n        var currentIdx = this.indexOf(element);\n\n        if (typeof idx === 'undefined') {\n\n          if (currentIdx !== -1) {\n            // element already in collection (!)\n            return;\n          }\n\n          // add to end of array, as no idx is specified\n          idx = this.length;\n        }\n\n        // handle already in collection\n        if (currentIdx !== -1) {\n\n          // remove element from currentIdx\n          this.splice(currentIdx, 1);\n        }\n\n        // add element at idx\n        this.splice(idx, 0, element);\n\n        if (currentIdx === -1) {\n          // set inverse, unless element was\n          // in collection already\n          refs.set(element, inverseProperty, target);\n        }\n      }\n    });\n\n    // a simple marker, identifying this element\n    // as being a refs collection\n    Object.defineProperty(collection, '__refs_collection', {\n      value: true\n    });\n\n    return collection;\n  }\n\n\n  function isExtended(collection) {\n    return collection.__refs_collection === true;\n  }\n\n  collection.extend = extend;\n\n  collection.isExtended = isExtended;\n\n  var Collection = collection;\n\n  function hasOwnProperty$1(e, property) {\n    return Object.prototype.hasOwnProperty.call(e, property.name || property);\n  }\n\n  function defineCollectionProperty(ref, property, target) {\n\n    var collection = Collection.extend(target[property.name] || [], ref, property, target);\n\n    Object.defineProperty(target, property.name, {\n      enumerable: property.enumerable,\n      value: collection\n    });\n\n    if (collection.length) {\n\n      collection.forEach(function(o) {\n        ref.set(o, property.inverse, target);\n      });\n    }\n  }\n\n\n  function defineProperty$1(ref, property, target) {\n\n    var inverseProperty = property.inverse;\n\n    var _value = target[property.name];\n\n    Object.defineProperty(target, property.name, {\n      configurable: property.configurable,\n      enumerable: property.enumerable,\n\n      get: function() {\n        return _value;\n      },\n\n      set: function(value) {\n\n        // return if we already performed all changes\n        if (value === _value) {\n          return;\n        }\n\n        var old = _value;\n\n        // temporary set null\n        _value = null;\n\n        if (old) {\n          ref.unset(old, inverseProperty, target);\n        }\n\n        // set new value\n        _value = value;\n\n        // set inverse value\n        ref.set(_value, inverseProperty, target);\n      }\n    });\n\n  }\n\n  /**\n   * Creates a new references object defining two inversly related\n   * attribute descriptors a and b.\n   *\n   * <p>\n   *   When bound to an object using {@link Refs#bind} the references\n   *   get activated and ensure that add and remove operations are applied\n   *   reversely, too.\n   * </p>\n   *\n   * <p>\n   *   For attributes represented as collections {@link Refs} provides the\n   *   {@link RefsCollection#add}, {@link RefsCollection#remove} and {@link RefsCollection#contains} extensions\n   *   that must be used to properly hook into the inverse change mechanism.\n   * </p>\n   *\n   * @class Refs\n   *\n   * @classdesc A bi-directional reference between two attributes.\n   *\n   * @param {Refs.AttributeDescriptor} a property descriptor\n   * @param {Refs.AttributeDescriptor} b property descriptor\n   *\n   * @example\n   *\n   * var refs = Refs({ name: 'wheels', collection: true, enumerable: true }, { name: 'car' });\n   *\n   * var car = { name: 'toyota' };\n   * var wheels = [{ pos: 'front-left' }, { pos: 'front-right' }];\n   *\n   * refs.bind(car, 'wheels');\n   *\n   * car.wheels // []\n   * car.wheels.add(wheels[0]);\n   * car.wheels.add(wheels[1]);\n   *\n   * car.wheels // [{ pos: 'front-left' }, { pos: 'front-right' }]\n   *\n   * wheels[0].car // { name: 'toyota' };\n   * car.wheels.remove(wheels[0]);\n   *\n   * wheels[0].car // undefined\n   */\n  function Refs$1(a, b) {\n\n    if (!(this instanceof Refs$1)) {\n      return new Refs$1(a, b);\n    }\n\n    // link\n    a.inverse = b;\n    b.inverse = a;\n\n    this.props = {};\n    this.props[a.name] = a;\n    this.props[b.name] = b;\n  }\n\n  /**\n   * Binds one side of a bi-directional reference to a\n   * target object.\n   *\n   * @memberOf Refs\n   *\n   * @param  {Object} target\n   * @param  {String} property\n   */\n  Refs$1.prototype.bind = function(target, property) {\n    if (typeof property === 'string') {\n      if (!this.props[property]) {\n        throw new Error('no property <' + property + '> in ref');\n      }\n      property = this.props[property];\n    }\n\n    if (property.collection) {\n      defineCollectionProperty(this, property, target);\n    } else {\n      defineProperty$1(this, property, target);\n    }\n  };\n\n  Refs$1.prototype.ensureRefsCollection = function(target, property) {\n\n    var collection = target[property.name];\n\n    if (!Collection.isExtended(collection)) {\n      defineCollectionProperty(this, property, target);\n    }\n\n    return collection;\n  };\n\n  Refs$1.prototype.ensureBound = function(target, property) {\n    if (!hasOwnProperty$1(target, property)) {\n      this.bind(target, property);\n    }\n  };\n\n  Refs$1.prototype.unset = function(target, property, value) {\n\n    if (target) {\n      this.ensureBound(target, property);\n\n      if (property.collection) {\n        this.ensureRefsCollection(target, property).remove(value);\n      } else {\n        target[property.name] = undefined;\n      }\n    }\n  };\n\n  Refs$1.prototype.set = function(target, property, value) {\n\n    if (target) {\n      this.ensureBound(target, property);\n\n      if (property.collection) {\n        this.ensureRefsCollection(target, property).add(value);\n      } else {\n        target[property.name] = value;\n      }\n    }\n  };\n\n  var refs = Refs$1;\n\n  objectRefs.exports = refs;\n\n  objectRefs.exports.Collection = collection;\n\n  var objectRefsExports = objectRefs.exports;\n  var Refs = /*@__PURE__*/getDefaultExportFromCjs(objectRefsExports);\n\n  var parentRefs = new Refs({ name: 'children', enumerable: true, collection: true }, { name: 'parent' }),\n      labelRefs = new Refs({ name: 'labels', enumerable: true, collection: true }, { name: 'labelTarget' }),\n      attacherRefs = new Refs({ name: 'attachers', collection: true }, { name: 'host' }),\n      outgoingRefs = new Refs({ name: 'outgoing', collection: true }, { name: 'source' }),\n      incomingRefs = new Refs({ name: 'incoming', collection: true }, { name: 'target' });\n\n  /**\n   * @typedef {import('./Types').Element} Element\n   * @typedef {import('./Types').Shape} Shape\n   * @typedef {import('./Types').Root} Root\n   * @typedef {import('./Types').Label} Label\n   * @typedef {import('./Types').Connection} Connection\n   */\n\n  /**\n   * The basic graphical representation\n   *\n   * @class\n   * @constructor\n   */\n  function ElementImpl() {\n\n    /**\n     * The object that backs up the shape\n     *\n     * @name Element#businessObject\n     * @type Object\n     */\n    Object.defineProperty(this, 'businessObject', {\n      writable: true\n    });\n\n\n    /**\n     * Single label support, will mapped to multi label array\n     *\n     * @name Element#label\n     * @type Object\n     */\n    Object.defineProperty(this, 'label', {\n      get: function() {\n        return this.labels[0];\n      },\n      set: function(newLabel) {\n\n        var label = this.label,\n            labels = this.labels;\n\n        if (!newLabel && label) {\n          labels.remove(label);\n        } else {\n          labels.add(newLabel, 0);\n        }\n      }\n    });\n\n    /**\n     * The parent shape\n     *\n     * @name Element#parent\n     * @type Shape\n     */\n    parentRefs.bind(this, 'parent');\n\n    /**\n     * The list of labels\n     *\n     * @name Element#labels\n     * @type Label\n     */\n    labelRefs.bind(this, 'labels');\n\n    /**\n     * The list of outgoing connections\n     *\n     * @name Element#outgoing\n     * @type Array<Connection>\n     */\n    outgoingRefs.bind(this, 'outgoing');\n\n    /**\n     * The list of incoming connections\n     *\n     * @name Element#incoming\n     * @type Array<Connection>\n     */\n    incomingRefs.bind(this, 'incoming');\n  }\n\n\n  /**\n   * A graphical object\n   *\n   * @class\n   * @constructor\n   *\n   * @extends ElementImpl\n   */\n  function ShapeImpl() {\n    ElementImpl.call(this);\n\n    /**\n     * Indicates frame shapes\n     *\n     * @name ShapeImpl#isFrame\n     * @type boolean\n     */\n\n    /**\n     * The list of children\n     *\n     * @name ShapeImpl#children\n     * @type Element[]\n     */\n    parentRefs.bind(this, 'children');\n\n    /**\n     * @name ShapeImpl#host\n     * @type Shape\n     */\n    attacherRefs.bind(this, 'host');\n\n    /**\n     * @name ShapeImpl#attachers\n     * @type Shape\n     */\n    attacherRefs.bind(this, 'attachers');\n  }\n\n  e(ShapeImpl, ElementImpl);\n\n\n  /**\n   * A root graphical object\n   *\n   * @class\n   * @constructor\n   *\n   * @extends ElementImpl\n   */\n  function RootImpl() {\n    ElementImpl.call(this);\n\n    /**\n     * The list of children\n     *\n     * @name RootImpl#children\n     * @type Element[]\n     */\n    parentRefs.bind(this, 'children');\n  }\n\n  e(RootImpl, ShapeImpl);\n\n\n  /**\n   * A label for an element\n   *\n   * @class\n   * @constructor\n   *\n   * @extends ShapeImpl\n   */\n  function LabelImpl() {\n    ShapeImpl.call(this);\n\n    /**\n     * The labeled element\n     *\n     * @name LabelImpl#labelTarget\n     * @type Element\n     */\n    labelRefs.bind(this, 'labelTarget');\n  }\n\n  e(LabelImpl, ShapeImpl);\n\n\n  /**\n   * A connection between two elements\n   *\n   * @class\n   * @constructor\n   *\n   * @extends ElementImpl\n   */\n  function ConnectionImpl() {\n    ElementImpl.call(this);\n\n    /**\n     * The element this connection originates from\n     *\n     * @name ConnectionImpl#source\n     * @type Element\n     */\n    outgoingRefs.bind(this, 'source');\n\n    /**\n     * The element this connection points to\n     *\n     * @name ConnectionImpl#target\n     * @type Element\n     */\n    incomingRefs.bind(this, 'target');\n  }\n\n  e(ConnectionImpl, ElementImpl);\n\n\n  var types$6 = {\n    connection: ConnectionImpl,\n    shape: ShapeImpl,\n    label: LabelImpl,\n    root: RootImpl\n  };\n\n  /**\n   * Creates a root element.\n   *\n   * @overlord\n   *\n   * @example\n   *\n   * ```javascript\n   * import * as Model from 'diagram-js/lib/model';\n   *\n   * const root = Model.create('root', {\n   *   x: 100,\n   *   y: 100,\n   *   width: 100,\n   *   height: 100\n   * });\n   * ```\n   *\n   * @param {'root'} type\n   * @param {any} [attrs]\n   *\n   * @return {Root}\n   */\n\n  /**\n   * Creates a connection.\n   *\n   * @overlord\n   *\n   * @example\n   *\n   * ```javascript\n   * import * as Model from 'diagram-js/lib/model';\n   *\n   * const connection = Model.create('connection', {\n   *   waypoints: [\n   *     { x: 100, y: 100 },\n   *     { x: 200, y: 100 }\n   *   ]\n   * });\n   * ```\n   *\n   * @param {'connection'} type\n   * @param {any} [attrs]\n   *\n   * @return {Connection}\n   */\n\n  /**\n   * Creates a shape.\n   *\n   * @overlord\n   *\n   * @example\n   *\n   * ```javascript\n   * import * as Model from 'diagram-js/lib/model';\n   *\n   * const shape = Model.create('shape', {\n   *   x: 100,\n   *   y: 100,\n   *   width: 100,\n   *   height: 100\n   * });\n   * ```\n   *\n   * @param {'shape'} type\n   * @param {any} [attrs]\n   *\n   * @return {Shape}\n   */\n\n  /**\n   * Creates a label.\n   *\n   * @example\n   *\n   * ```javascript\n   * import * as Model from 'diagram-js/lib/model';\n   *\n   * const label = Model.create('label', {\n   *   x: 100,\n   *   y: 100,\n   *   width: 100,\n   *   height: 100,\n   *   labelTarget: shape\n   * });\n   * ```\n   *\n   * @param {'label'} type\n   * @param {Object} [attrs]\n   *\n   * @return {Label}\n   */\n  function create(type, attrs) {\n    var Type = types$6[type];\n    if (!Type) {\n      throw new Error('unknown type: <' + type + '>');\n    }\n    return assign$1(new Type(), attrs);\n  }\n\n  /**\n   * @typedef {import('../model/Types').Element} Element\n   * @typedef {import('../model/Types').Connection} Connection\n   * @typedef {import('../model/Types').Label} Label\n   * @typedef {import('../model/Types').Root} Root\n   * @typedef {import('../model/Types').Shape} Shape\n   */\n\n  /**\n   * A factory for model elements.\n   *\n   * @template {Connection} [T=Connection]\n   * @template {Label} [U=Label]\n   * @template {Root} [V=Root]\n   * @template {Shape} [W=Shape]\n   */\n  function ElementFactory() {\n    this._uid = 12;\n  }\n\n  /**\n   * Create a root element.\n   *\n   * @param {Partial<Root>} [attrs]\n   *\n   * @return {V} The created root element.\n   */\n  ElementFactory.prototype.createRoot = function(attrs) {\n    return this.create('root', attrs);\n  };\n\n  /**\n   * Create a label.\n   *\n   * @param {Partial<Label>} [attrs]\n   *\n   * @return {U} The created label.\n   */\n  ElementFactory.prototype.createLabel = function(attrs) {\n    return this.create('label', attrs);\n  };\n\n  /**\n   * Create a shape.\n   *\n   * @param {Partial<Shape>} [attrs]\n   *\n   * @return {W} The created shape.\n   */\n  ElementFactory.prototype.createShape = function(attrs) {\n    return this.create('shape', attrs);\n  };\n\n  /**\n   * Create a connection.\n   *\n   * @param {Partial<Connection>} [attrs]\n   *\n   * @return {T} The created connection.\n   */\n  ElementFactory.prototype.createConnection = function(attrs) {\n    return this.create('connection', attrs);\n  };\n\n  /**\n   * Create a root element.\n   *\n   * @overlord\n   * @param {'root'} type\n   * @param {Partial<Root>} [attrs]\n   * @return {V}\n   */\n  /**\n   * Create a shape.\n   *\n   * @overlord\n   * @param {'shape'} type\n   * @param {Partial<Shape>} [attrs]\n   * @return {W}\n   */\n  /**\n   * Create a connection.\n   *\n   * @overlord\n   * @param {'connection'} type\n   * @param {Partial<Connection>} [attrs]\n   * @return {T}\n   */\n  /**\n   * Create a label.\n   *\n   * @param {'label'} type\n   * @param {Partial<Label>} [attrs]\n   * @return {U}\n   */\n  ElementFactory.prototype.create = function(type, attrs) {\n\n    attrs = assign$1({}, attrs || {});\n\n    if (!attrs.id) {\n      attrs.id = type + '_' + (this._uid++);\n    }\n\n    return create(type, attrs);\n  };\n\n  var FN_REF = '__fn';\n\n  var DEFAULT_PRIORITY = 1000;\n\n  var slice = Array.prototype.slice;\n\n  /**\n   * @typedef { {\n   *   stopPropagation(): void;\n   *   preventDefault(): void;\n   *   cancelBubble: boolean;\n   *   defaultPrevented: boolean;\n   *   returnValue: any;\n   * } } Event\n   */\n\n  /**\n   * @template E\n   *\n   * @typedef { (event: E & Event, ...any) => any } EventBusEventCallback\n   */\n\n  /**\n   * @typedef { {\n   *  priority: number;\n   *  next: EventBusListener | null;\n   *  callback: EventBusEventCallback<any>;\n   * } } EventBusListener\n   */\n\n  /**\n   * A general purpose event bus.\n   *\n   * This component is used to communicate across a diagram instance.\n   * Other parts of a diagram can use it to listen to and broadcast events.\n   *\n   *\n   * ## Registering for Events\n   *\n   * The event bus provides the {@link EventBus#on} and {@link EventBus#once}\n   * methods to register for events. {@link EventBus#off} can be used to\n   * remove event registrations. Listeners receive an instance of {@link Event}\n   * as the first argument. It allows them to hook into the event execution.\n   *\n   * ```javascript\n   *\n   * // listen for event\n   * eventBus.on('foo', function(event) {\n   *\n   *   // access event type\n   *   event.type; // 'foo'\n   *\n   *   // stop propagation to other listeners\n   *   event.stopPropagation();\n   *\n   *   // prevent event default\n   *   event.preventDefault();\n   * });\n   *\n   * // listen for event with custom payload\n   * eventBus.on('bar', function(event, payload) {\n   *   console.log(payload);\n   * });\n   *\n   * // listen for event returning value\n   * eventBus.on('foobar', function(event) {\n   *\n   *   // stop event propagation + prevent default\n   *   return false;\n   *\n   *   // stop event propagation + return custom result\n   *   return {\n   *     complex: 'listening result'\n   *   };\n   * });\n   *\n   *\n   * // listen with custom priority (default=1000, higher is better)\n   * eventBus.on('priorityfoo', 1500, function(event) {\n   *   console.log('invoked first!');\n   * });\n   *\n   *\n   * // listen for event and pass the context (`this`)\n   * eventBus.on('foobar', function(event) {\n   *   this.foo();\n   * }, this);\n   * ```\n   *\n   *\n   * ## Emitting Events\n   *\n   * Events can be emitted via the event bus using {@link EventBus#fire}.\n   *\n   * ```javascript\n   *\n   * // false indicates that the default action\n   * // was prevented by listeners\n   * if (eventBus.fire('foo') === false) {\n   *   console.log('default has been prevented!');\n   * };\n   *\n   *\n   * // custom args + return value listener\n   * eventBus.on('sum', function(event, a, b) {\n   *   return a + b;\n   * });\n   *\n   * // you can pass custom arguments + retrieve result values.\n   * var sum = eventBus.fire('sum', 1, 2);\n   * console.log(sum); // 3\n   * ```\n   */\n  function EventBus() {\n\n    /**\n     * @type { Record<string, EventBusListener> }\n     */\n    this._listeners = {};\n\n    // cleanup on destroy on lowest priority to allow\n    // message passing until the bitter end\n    this.on('diagram.destroy', 1, this._destroy, this);\n  }\n\n\n  /**\n   * Register an event listener for events with the given name.\n   *\n   * The callback will be invoked with `event, ...additionalArguments`\n   * that have been passed to {@link EventBus#fire}.\n   *\n   * Returning false from a listener will prevent the events default action\n   * (if any is specified). To stop an event from being processed further in\n   * other listeners execute {@link Event#stopPropagation}.\n   *\n   * Returning anything but `undefined` from a listener will stop the listener propagation.\n   *\n   * @template T\n   *\n   * @param {string|string[]} events to subscribe to\n   * @param {number} [priority=1000] listen priority\n   * @param {EventBusEventCallback<T>} callback\n   * @param {any} [that] callback context\n   */\n  EventBus.prototype.on = function(events, priority, callback, that) {\n\n    events = isArray$2(events) ? events : [ events ];\n\n    if (isFunction(priority)) {\n      that = callback;\n      callback = priority;\n      priority = DEFAULT_PRIORITY;\n    }\n\n    if (!isNumber(priority)) {\n      throw new Error('priority must be a number');\n    }\n\n    var actualCallback = callback;\n\n    if (that) {\n      actualCallback = bind$2(callback, that);\n\n      // make sure we remember and are able to remove\n      // bound callbacks via {@link #off} using the original\n      // callback\n      actualCallback[FN_REF] = callback[FN_REF] || callback;\n    }\n\n    var self = this;\n\n    events.forEach(function(e) {\n      self._addListener(e, {\n        priority: priority,\n        callback: actualCallback,\n        next: null\n      });\n    });\n  };\n\n  /**\n   * Register an event listener that is called only once.\n   *\n   * @template T\n   *\n   * @param {string|string[]} events to subscribe to\n   * @param {number} [priority=1000] the listen priority\n   * @param {EventBusEventCallback<T>} callback\n   * @param {any} [that] callback context\n   */\n  EventBus.prototype.once = function(events, priority, callback, that) {\n    var self = this;\n\n    if (isFunction(priority)) {\n      that = callback;\n      callback = priority;\n      priority = DEFAULT_PRIORITY;\n    }\n\n    if (!isNumber(priority)) {\n      throw new Error('priority must be a number');\n    }\n\n    function wrappedCallback() {\n      wrappedCallback.__isTomb = true;\n\n      var result = callback.apply(that, arguments);\n\n      self.off(events, wrappedCallback);\n\n      return result;\n    }\n\n    // make sure we remember and are able to remove\n    // bound callbacks via {@link #off} using the original\n    // callback\n    wrappedCallback[FN_REF] = callback;\n\n    this.on(events, priority, wrappedCallback);\n  };\n\n\n  /**\n   * Removes event listeners by event and callback.\n   *\n   * If no callback is given, all listeners for a given event name are being removed.\n   *\n   * @param {string|string[]} events\n   * @param {EventBusEventCallback} [callback]\n   */\n  EventBus.prototype.off = function(events, callback) {\n\n    events = isArray$2(events) ? events : [ events ];\n\n    var self = this;\n\n    events.forEach(function(event) {\n      self._removeListener(event, callback);\n    });\n\n  };\n\n\n  /**\n   * Create an event recognized be the event bus.\n   *\n   * @param {Object} data Event data.\n   *\n   * @return {Event} An event that will be recognized by the event bus.\n   */\n  EventBus.prototype.createEvent = function(data) {\n    var event = new InternalEvent();\n\n    event.init(data);\n\n    return event;\n  };\n\n\n  /**\n   * Fires an event.\n   *\n   * @example\n   *\n   * ```javascript\n   * // fire event by name\n   * events.fire('foo');\n   *\n   * // fire event object with nested type\n   * var event = { type: 'foo' };\n   * events.fire(event);\n   *\n   * // fire event with explicit type\n   * var event = { x: 10, y: 20 };\n   * events.fire('element.moved', event);\n   *\n   * // pass additional arguments to the event\n   * events.on('foo', function(event, bar) {\n   *   alert(bar);\n   * });\n   *\n   * events.fire({ type: 'foo' }, 'I am bar!');\n   * ```\n   *\n   * @param {string} [type] event type\n   * @param {Object} [data] event or event data\n   * @param {...any} [args] additional arguments the callback will be called with.\n   *\n   * @return {any} The return value. Will be set to `false` if the default was prevented.\n   */\n  EventBus.prototype.fire = function(type, data) {\n    var event,\n        firstListener,\n        returnValue,\n        args;\n\n    args = slice.call(arguments);\n\n    if (typeof type === 'object') {\n      data = type;\n      type = data.type;\n    }\n\n    if (!type) {\n      throw new Error('no event type specified');\n    }\n\n    firstListener = this._listeners[type];\n\n    if (!firstListener) {\n      return;\n    }\n\n    // we make sure we fire instances of our home made\n    // events here. We wrap them only once, though\n    if (data instanceof InternalEvent) {\n\n      // we are fine, we alread have an event\n      event = data;\n    } else {\n      event = this.createEvent(data);\n    }\n\n    // ensure we pass the event as the first parameter\n    args[0] = event;\n\n    // original event type (in case we delegate)\n    var originalType = event.type;\n\n    // update event type before delegation\n    if (type !== originalType) {\n      event.type = type;\n    }\n\n    try {\n      returnValue = this._invokeListeners(event, args, firstListener);\n    } finally {\n\n      // reset event type after delegation\n      if (type !== originalType) {\n        event.type = originalType;\n      }\n    }\n\n    // set the return value to false if the event default\n    // got prevented and no other return value exists\n    if (returnValue === undefined && event.defaultPrevented) {\n      returnValue = false;\n    }\n\n    return returnValue;\n  };\n\n  /**\n   * Handle an error by firing an event.\n   *\n   * @param {Error} error The error to be handled.\n   *\n   * @return {boolean} Whether the error was handled.\n   */\n  EventBus.prototype.handleError = function(error) {\n    return this.fire('error', { error: error }) === false;\n  };\n\n\n  EventBus.prototype._destroy = function() {\n    this._listeners = {};\n  };\n\n  /**\n   * @param {Event} event\n   * @param {any[]} args\n   * @param {EventBusListener} listener\n   *\n   * @return {any}\n   */\n  EventBus.prototype._invokeListeners = function(event, args, listener) {\n\n    var returnValue;\n\n    while (listener) {\n\n      // handle stopped propagation\n      if (event.cancelBubble) {\n        break;\n      }\n\n      returnValue = this._invokeListener(event, args, listener);\n\n      listener = listener.next;\n    }\n\n    return returnValue;\n  };\n\n  /**\n   * @param {Event} event\n   * @param {any[]} args\n   * @param {EventBusListener} listener\n   *\n   * @return {any}\n   */\n  EventBus.prototype._invokeListener = function(event, args, listener) {\n\n    var returnValue;\n\n    if (listener.callback.__isTomb) {\n      return returnValue;\n    }\n\n    try {\n\n      // returning false prevents the default action\n      returnValue = invokeFunction(listener.callback, args);\n\n      // stop propagation on return value\n      if (returnValue !== undefined) {\n        event.returnValue = returnValue;\n        event.stopPropagation();\n      }\n\n      // prevent default on return false\n      if (returnValue === false) {\n        event.preventDefault();\n      }\n    } catch (error) {\n      if (!this.handleError(error)) {\n        console.error('unhandled error in event listener', error);\n\n        throw error;\n      }\n    }\n\n    return returnValue;\n  };\n\n  /**\n   * Add new listener with a certain priority to the list\n   * of listeners (for the given event).\n   *\n   * The semantics of listener registration / listener execution are\n   * first register, first serve: New listeners will always be inserted\n   * after existing listeners with the same priority.\n   *\n   * Example: Inserting two listeners with priority 1000 and 1300\n   *\n   *    * before: [ 1500, 1500, 1000, 1000 ]\n   *    * after: [ 1500, 1500, (new=1300), 1000, 1000, (new=1000) ]\n   *\n   * @param {string} event\n   * @param {EventBusListener} newListener\n   */\n  EventBus.prototype._addListener = function(event, newListener) {\n\n    var listener = this._getListeners(event),\n        previousListener;\n\n    // no prior listeners\n    if (!listener) {\n      this._setListeners(event, newListener);\n\n      return;\n    }\n\n    // ensure we order listeners by priority from\n    // 0 (high) to n > 0 (low)\n    while (listener) {\n\n      if (listener.priority < newListener.priority) {\n\n        newListener.next = listener;\n\n        if (previousListener) {\n          previousListener.next = newListener;\n        } else {\n          this._setListeners(event, newListener);\n        }\n\n        return;\n      }\n\n      previousListener = listener;\n      listener = listener.next;\n    }\n\n    // add new listener to back\n    previousListener.next = newListener;\n  };\n\n\n  /**\n   * @param {string} name\n   *\n   * @return {EventBusListener}\n   */\n  EventBus.prototype._getListeners = function(name) {\n    return this._listeners[name];\n  };\n\n  /**\n   * @param {string} name\n   * @param {EventBusListener} listener\n   */\n  EventBus.prototype._setListeners = function(name, listener) {\n    this._listeners[name] = listener;\n  };\n\n  EventBus.prototype._removeListener = function(event, callback) {\n\n    var listener = this._getListeners(event),\n        nextListener,\n        previousListener,\n        listenerCallback;\n\n    if (!callback) {\n\n      // clear listeners\n      this._setListeners(event, null);\n\n      return;\n    }\n\n    while (listener) {\n\n      nextListener = listener.next;\n\n      listenerCallback = listener.callback;\n\n      if (listenerCallback === callback || listenerCallback[FN_REF] === callback) {\n        if (previousListener) {\n          previousListener.next = nextListener;\n        } else {\n\n          // new first listener\n          this._setListeners(event, nextListener);\n        }\n      }\n\n      previousListener = listener;\n      listener = nextListener;\n    }\n  };\n\n  /**\n   * A event that is emitted via the event bus.\n   */\n  function InternalEvent() { }\n\n  InternalEvent.prototype.stopPropagation = function() {\n    this.cancelBubble = true;\n  };\n\n  InternalEvent.prototype.preventDefault = function() {\n    this.defaultPrevented = true;\n  };\n\n  InternalEvent.prototype.init = function(data) {\n    assign$1(this, data || {});\n  };\n\n\n  /**\n   * Invoke function. Be fast...\n   *\n   * @param {Function} fn\n   * @param {any[]} args\n   *\n   * @return {any}\n   */\n  function invokeFunction(fn, args) {\n    return fn.apply(null, args);\n  }\n\n  /**\n   * SVGs for elements are generated by the {@link GraphicsFactory}.\n   *\n   * This utility gives quick access to the important semantic\n   * parts of an element.\n   */\n\n  /**\n   * Returns the visual part of a diagram element.\n   *\n   * @param {SVGElement} gfx\n   *\n   * @return {SVGElement}\n   */\n  function getVisual(gfx) {\n    return gfx.childNodes[0];\n  }\n\n  /**\n   * Returns the children for a given diagram element.\n   *\n   * @param {SVGElement} gfx\n   * @return {SVGElement}\n   */\n  function getChildren(gfx) {\n    return gfx.parentNode.childNodes[1];\n  }\n\n  /**\n   * @typedef {import('./Types').ConnectionLike} ConnectionLike\n   * @typedef {import('./Types').ElementLike} ElementLike\n   * @typedef {import('./Types').ShapeLike} ShapeLike\n   *\n   * @typedef {import('./ElementRegistry').default} ElementRegistry\n   * @typedef {import('./EventBus').default} EventBus\n   */\n\n  /**\n   * A factory that creates graphical elements.\n   *\n   * @param {EventBus} eventBus\n   * @param {ElementRegistry} elementRegistry\n   */\n  function GraphicsFactory(eventBus, elementRegistry) {\n    this._eventBus = eventBus;\n    this._elementRegistry = elementRegistry;\n  }\n\n  GraphicsFactory.$inject = [ 'eventBus' , 'elementRegistry' ];\n\n  /**\n   * @param { { parent?: any } } element\n   * @return {SVGElement}\n   */\n  GraphicsFactory.prototype._getChildrenContainer = function(element) {\n\n    var gfx = this._elementRegistry.getGraphics(element);\n\n    var childrenGfx;\n\n    // root element\n    if (!element.parent) {\n      childrenGfx = gfx;\n    } else {\n      childrenGfx = getChildren(gfx);\n      if (!childrenGfx) {\n        childrenGfx = create$1('g');\n        classes$1(childrenGfx).add('djs-children');\n\n        append(gfx.parentNode, childrenGfx);\n      }\n    }\n\n    return childrenGfx;\n  };\n\n  /**\n   * Clears the graphical representation of the element and returns the\n   * cleared visual (the <g class=\"djs-visual\" /> element).\n   */\n  GraphicsFactory.prototype._clear = function(gfx) {\n    var visual = getVisual(gfx);\n\n    clear(visual);\n\n    return visual;\n  };\n\n  /**\n   * Creates a gfx container for shapes and connections\n   *\n   * The layout is as follows:\n   *\n   * <g class=\"djs-group\">\n   *\n   *   <!-- the gfx -->\n   *   <g class=\"djs-element djs-(shape|connection|frame)\">\n   *     <g class=\"djs-visual\">\n   *       <!-- the renderer draws in here -->\n   *     </g>\n   *\n   *     <!-- extensions (overlays, click box, ...) goes here\n   *   </g>\n   *\n   *   <!-- the gfx child nodes -->\n   *   <g class=\"djs-children\"></g>\n   * </g>\n   *\n   * @param {string} type the type of the element, i.e. shape | connection\n   * @param {SVGElement} childrenGfx\n   * @param {number} [parentIndex] position to create container in parent\n   * @param {boolean} [isFrame] is frame element\n   *\n   * @return {SVGElement}\n   */\n  GraphicsFactory.prototype._createContainer = function(\n      type, childrenGfx, parentIndex, isFrame\n  ) {\n    var outerGfx = create$1('g');\n    classes$1(outerGfx).add('djs-group');\n\n    // insert node at position\n    if (typeof parentIndex !== 'undefined') {\n      prependTo(outerGfx, childrenGfx, childrenGfx.childNodes[parentIndex]);\n    } else {\n      append(childrenGfx, outerGfx);\n    }\n\n    var gfx = create$1('g');\n    classes$1(gfx).add('djs-element');\n    classes$1(gfx).add('djs-' + type);\n\n    if (isFrame) {\n      classes$1(gfx).add('djs-frame');\n    }\n\n    append(outerGfx, gfx);\n\n    // create visual\n    var visual = create$1('g');\n    classes$1(visual).add('djs-visual');\n\n    append(gfx, visual);\n\n    return gfx;\n  };\n\n  /**\n   * Create a graphical element.\n   *\n   * @param { 'shape' | 'connection' | 'label' | 'root' } type The type of the element.\n   * @param {ElementLike} element The element.\n   * @param {number} [parentIndex] The index at which to add the graphical element to its parent's children.\n   *\n   * @return {SVGElement} The graphical element.\n   */\n  GraphicsFactory.prototype.create = function(type, element, parentIndex) {\n    var childrenGfx = this._getChildrenContainer(element.parent);\n    return this._createContainer(type, childrenGfx, parentIndex, isFrameElement(element));\n  };\n\n  /**\n   * Update the containments of the given elements.\n   *\n   * @param {ElementLike[]} elements The elements.\n   */\n  GraphicsFactory.prototype.updateContainments = function(elements) {\n\n    var self = this,\n        elementRegistry = this._elementRegistry,\n        parents;\n\n    parents = reduce(elements, function(map, e) {\n\n      if (e.parent) {\n        map[e.parent.id] = e.parent;\n      }\n\n      return map;\n    }, {});\n\n    // update all parents of changed and reorganized their children\n    // in the correct order (as indicated in our model)\n    forEach$1(parents, function(parent) {\n\n      var children = parent.children;\n\n      if (!children) {\n        return;\n      }\n\n      var childrenGfx = self._getChildrenContainer(parent);\n\n      forEach$1(children.slice().reverse(), function(child) {\n        var childGfx = elementRegistry.getGraphics(child);\n\n        prependTo(childGfx.parentNode, childrenGfx);\n      });\n    });\n  };\n\n  /**\n   * Draw a shape.\n   *\n   * @param {SVGElement} visual The graphical element.\n   * @param {ShapeLike} element The shape.\n   *\n   * @return {SVGElement}\n   */\n  GraphicsFactory.prototype.drawShape = function(visual, element) {\n    var eventBus = this._eventBus;\n\n    return eventBus.fire('render.shape', { gfx: visual, element: element });\n  };\n\n  /**\n   * Get the path of a shape.\n   *\n   * @param {ShapeLike} element The shape.\n   *\n   * @return {string} The path of the shape.\n   */\n  GraphicsFactory.prototype.getShapePath = function(element) {\n    var eventBus = this._eventBus;\n\n    return eventBus.fire('render.getShapePath', element);\n  };\n\n  /**\n   * Draw a connection.\n   *\n   * @param {SVGElement} visual The graphical element.\n   * @param {ConnectionLike} element The connection.\n   *\n   * @return {SVGElement}\n   */\n  GraphicsFactory.prototype.drawConnection = function(visual, element) {\n    var eventBus = this._eventBus;\n\n    return eventBus.fire('render.connection', { gfx: visual, element: element });\n  };\n\n  /**\n   * Get the path of a connection.\n   *\n   * @param {ConnectionLike} connection The connection.\n   *\n   * @return {string} The path of the connection.\n   */\n  GraphicsFactory.prototype.getConnectionPath = function(connection) {\n    var eventBus = this._eventBus;\n\n    return eventBus.fire('render.getConnectionPath', connection);\n  };\n\n  /**\n   * Update an elements graphical representation.\n   *\n   * @param {'shape'|'connection'} type\n   * @param {ElementLike} element\n   * @param {SVGElement} gfx\n   */\n  GraphicsFactory.prototype.update = function(type, element, gfx) {\n\n    // do NOT update root element\n    if (!element.parent) {\n      return;\n    }\n\n    var visual = this._clear(gfx);\n\n    // redraw\n    if (type === 'shape') {\n      this.drawShape(visual, element);\n\n      // update positioning\n      translate$1(gfx, element.x, element.y);\n    } else\n    if (type === 'connection') {\n      this.drawConnection(visual, element);\n    } else {\n      throw new Error('unknown type: ' + type);\n    }\n\n    if (element.hidden) {\n      attr$1(gfx, 'display', 'none');\n    } else {\n      attr$1(gfx, 'display', 'block');\n    }\n  };\n\n  /**\n   * Remove a graphical element.\n   *\n   * @param {ElementLike} element The element.\n   */\n  GraphicsFactory.prototype.remove = function(element) {\n    var gfx = this._elementRegistry.getGraphics(element);\n\n    // remove\n    remove$2(gfx.parentNode);\n  };\n\n\n  // helpers //////////\n\n  function prependTo(newNode, parentNode, siblingNode) {\n    var node = siblingNode || parentNode.firstChild;\n\n    // do not prepend node to itself to prevent IE from crashing\n    // https://github.com/bpmn-io/bpmn-js/issues/746\n    if (newNode === node) {\n      return;\n    }\n\n    parentNode.insertBefore(newNode, node);\n  }\n\n  /**\n   * @type { import('didi').ModuleDeclaration }\n   */\n  var CoreModule = {\n    __depends__: [ DrawModule ],\n    __init__: [ 'canvas' ],\n    canvas: [ 'type', Canvas ],\n    elementRegistry: [ 'type', ElementRegistry ],\n    elementFactory: [ 'type', ElementFactory ],\n    eventBus: [ 'type', EventBus ],\n    graphicsFactory: [ 'type', GraphicsFactory ]\n  };\n\n  /**\n   * @typedef {import('didi').InjectionContext} InjectionContext\n   * @typedef {import('didi').LocalsMap} LocalsMap\n   * @typedef {import('didi').ModuleDeclaration} ModuleDeclaration\n   *\n   * @typedef { {\n   *   modules?: ModuleDeclaration[];\n   * } & Record<string, any> } DiagramOptions\n   */\n\n  /**\n   * Bootstrap an injector from a list of modules, instantiating a number of default components\n   *\n   * @param {ModuleDeclaration[]} modules\n   *\n   * @return {Injector} a injector to use to access the components\n   */\n  function bootstrap(modules) {\n    var injector = new Injector(modules);\n\n    injector.init();\n\n    return injector;\n  }\n\n  /**\n   * Creates an injector from passed options.\n   *\n   * @param {DiagramOptions} [options]\n   *\n   * @return {Injector}\n   */\n  function createInjector(options) {\n\n    options = options || {};\n\n    /**\n     * @type { ModuleDeclaration }\n     */\n    var configModule = {\n      'config': [ 'value', options ]\n    };\n\n    var modules = [ configModule, CoreModule ].concat(options.modules || []);\n\n    return bootstrap(modules);\n  }\n\n\n  /**\n   * The main diagram-js entry point that bootstraps the diagram with the given\n   * configuration.\n   *\n   * To register extensions with the diagram, pass them as Array<Module> to the constructor.\n   *\n   * @class\n   * @constructor\n   *\n   * @example Creating a plug-in that logs whenever a shape is added to the canvas.\n   *\n   * ```javascript\n   * // plug-in implementation\n   * function MyLoggingPlugin(eventBus) {\n   *   eventBus.on('shape.added', function(event) {\n   *     console.log('shape ', event.shape, ' was added to the diagram');\n   *   });\n   * }\n   *\n   * // export as module\n   * export default {\n   *   __init__: [ 'myLoggingPlugin' ],\n   *     myLoggingPlugin: [ 'type', MyLoggingPlugin ]\n   * };\n   * ```\n   *\n   * Use the plug-in in a Diagram instance:\n   *\n   * ```javascript\n   * import MyLoggingModule from 'path-to-my-logging-plugin';\n   *\n   * var diagram = new Diagram({\n   *   modules: [\n   *     MyLoggingModule\n   *   ]\n   * });\n   *\n   * diagram.invoke([ 'canvas', function(canvas) {\n   *   // add shape to drawing canvas\n   *   canvas.addShape({ x: 10, y: 10 });\n   * });\n   *\n   * // 'shape ... was added to the diagram' logged to console\n   * ```\n   *\n   * @param {DiagramOptions} [options]\n   * @param {Injector} [injector] An (optional) injector to bootstrap the diagram with.\n   */\n  function Diagram(options, injector) {\n\n    this._injector = injector = injector || createInjector(options);\n\n    // API\n\n    /**\n     * Resolves a diagram service.\n     *\n     * @template T\n     *\n     * @param {string} name The name of the service to get.\n     * @param {boolean} [strict=true] If false, resolve missing services to null.\n     *\n     * @return {T|null}\n     */\n    this.get = injector.get;\n\n    /**\n     * Executes a function with its dependencies injected.\n     *\n     * @template T\n     *\n     * @param {Function} func function to be invoked\n     * @param {InjectionContext} [context] context of the invocation\n     * @param {LocalsMap} [locals] locals provided\n     *\n     * @return {T|null}\n     */\n    this.invoke = injector.invoke;\n\n    // init\n\n    // indicate via event\n\n\n    /**\n     * An event indicating that all plug-ins are loaded.\n     *\n     * Use this event to fire other events to interested plug-ins\n     *\n     * @memberOf Diagram\n     *\n     * @event diagram.init\n     *\n     * @example\n     *\n     * ```javascript\n     * eventBus.on('diagram.init', function() {\n     *   eventBus.fire('my-custom-event', { foo: 'BAR' });\n     * });\n     * ```\n     *\n     * @type {Object}\n     */\n    this.get('eventBus').fire('diagram.init');\n  }\n\n\n  /**\n   * Destroys the diagram\n   */\n  Diagram.prototype.destroy = function() {\n    this.get('eventBus').fire('diagram.destroy');\n  };\n\n  /**\n   * Clear the diagram, removing all contents.\n   */\n  Diagram.prototype.clear = function() {\n    this.get('eventBus').fire('diagram.clear');\n  };\n\n  /**\n   * Moddle base element.\n   */\n  function Base() { }\n\n  Base.prototype.get = function(name) {\n    return this.$model.properties.get(this, name);\n  };\n\n  Base.prototype.set = function(name, value) {\n    this.$model.properties.set(this, name, value);\n  };\n\n  /**\n   * A model element factory.\n   *\n   * @param {Moddle} model\n   * @param {Properties} properties\n   */\n  function Factory(model, properties) {\n    this.model = model;\n    this.properties = properties;\n  }\n\n\n  Factory.prototype.createType = function(descriptor) {\n\n    var model = this.model;\n\n    var props = this.properties,\n        prototype = Object.create(Base.prototype);\n\n    // initialize default values\n    forEach$1(descriptor.properties, function(p) {\n      if (!p.isMany && p.default !== undefined) {\n        prototype[p.name] = p.default;\n      }\n    });\n\n    props.defineModel(prototype, model);\n    props.defineDescriptor(prototype, descriptor);\n\n    var name = descriptor.ns.name;\n\n    /**\n     * The new type constructor\n     */\n    function ModdleElement(attrs) {\n      props.define(this, '$type', { value: name, enumerable: true });\n      props.define(this, '$attrs', { value: {} });\n      props.define(this, '$parent', { writable: true });\n\n      forEach$1(attrs, bind$2(function(val, key) {\n        this.set(key, val);\n      }, this));\n    }\n\n    ModdleElement.prototype = prototype;\n\n    ModdleElement.hasType = prototype.$instanceOf = this.model.hasType;\n\n    // static links\n    props.defineModel(ModdleElement, model);\n    props.defineDescriptor(ModdleElement, descriptor);\n\n    return ModdleElement;\n  };\n\n  /**\n   * Built-in moddle types\n   */\n  var BUILTINS = {\n    String: true,\n    Boolean: true,\n    Integer: true,\n    Real: true,\n    Element: true\n  };\n\n  /**\n   * Converters for built in types from string representations\n   */\n  var TYPE_CONVERTERS = {\n    String: function(s) { return s; },\n    Boolean: function(s) { return s === 'true'; },\n    Integer: function(s) { return parseInt(s, 10); },\n    Real: function(s) { return parseFloat(s); }\n  };\n\n  /**\n   * Convert a type to its real representation\n   */\n  function coerceType(type, value) {\n\n    var converter = TYPE_CONVERTERS[type];\n\n    if (converter) {\n      return converter(value);\n    } else {\n      return value;\n    }\n  }\n\n  /**\n   * Return whether the given type is built-in\n   */\n  function isBuiltIn(type) {\n    return !!BUILTINS[type];\n  }\n\n  /**\n   * Return whether the given type is simple\n   */\n  function isSimple(type) {\n    return !!TYPE_CONVERTERS[type];\n  }\n\n  /**\n   * Parses a namespaced attribute name of the form (ns:)localName to an object,\n   * given a default prefix to assume in case no explicit namespace is given.\n   *\n   * @param {String} name\n   * @param {String} [defaultPrefix] the default prefix to take, if none is present.\n   *\n   * @return {Object} the parsed name\n   */\n  function parseName(name, defaultPrefix) {\n    var parts = name.split(/:/),\n        localName, prefix;\n\n    // no prefix (i.e. only local name)\n    if (parts.length === 1) {\n      localName = name;\n      prefix = defaultPrefix;\n    } else\n\n    // prefix + local name\n    if (parts.length === 2) {\n      localName = parts[1];\n      prefix = parts[0];\n    } else {\n      throw new Error('expected <prefix:localName> or <localName>, got ' + name);\n    }\n\n    name = (prefix ? prefix + ':' : '') + localName;\n\n    return {\n      name: name,\n      prefix: prefix,\n      localName: localName\n    };\n  }\n\n  /**\n   * A utility to build element descriptors.\n   */\n  function DescriptorBuilder(nameNs) {\n    this.ns = nameNs;\n    this.name = nameNs.name;\n    this.allTypes = [];\n    this.allTypesByName = {};\n    this.properties = [];\n    this.propertiesByName = {};\n  }\n\n\n  DescriptorBuilder.prototype.build = function() {\n    return pick(this, [\n      'ns',\n      'name',\n      'allTypes',\n      'allTypesByName',\n      'properties',\n      'propertiesByName',\n      'bodyProperty',\n      'idProperty'\n    ]);\n  };\n\n  /**\n   * Add property at given index.\n   *\n   * @param {Object} p\n   * @param {Number} [idx]\n   * @param {Boolean} [validate=true]\n   */\n  DescriptorBuilder.prototype.addProperty = function(p, idx, validate) {\n\n    if (typeof idx === 'boolean') {\n      validate = idx;\n      idx = undefined;\n    }\n\n    this.addNamedProperty(p, validate !== false);\n\n    var properties = this.properties;\n\n    if (idx !== undefined) {\n      properties.splice(idx, 0, p);\n    } else {\n      properties.push(p);\n    }\n  };\n\n\n  DescriptorBuilder.prototype.replaceProperty = function(oldProperty, newProperty, replace) {\n    var oldNameNs = oldProperty.ns;\n\n    var props = this.properties,\n        propertiesByName = this.propertiesByName,\n        rename = oldProperty.name !== newProperty.name;\n\n    if (oldProperty.isId) {\n      if (!newProperty.isId) {\n        throw new Error(\n          'property <' + newProperty.ns.name + '> must be id property ' +\n          'to refine <' + oldProperty.ns.name + '>');\n      }\n\n      this.setIdProperty(newProperty, false);\n    }\n\n    if (oldProperty.isBody) {\n\n      if (!newProperty.isBody) {\n        throw new Error(\n          'property <' + newProperty.ns.name + '> must be body property ' +\n          'to refine <' + oldProperty.ns.name + '>');\n      }\n\n      // TODO: Check compatibility\n      this.setBodyProperty(newProperty, false);\n    }\n\n    // validate existence and get location of old property\n    var idx = props.indexOf(oldProperty);\n    if (idx === -1) {\n      throw new Error('property <' + oldNameNs.name + '> not found in property list');\n    }\n\n    // remove old property\n    props.splice(idx, 1);\n\n    // replacing the named property is intentional\n    //\n    //  * validate only if this is a \"rename\" operation\n    //  * add at specific index unless we \"replace\"\n    //\n    this.addProperty(newProperty, replace ? undefined : idx, rename);\n\n    // make new property available under old name\n    propertiesByName[oldNameNs.name] = propertiesByName[oldNameNs.localName] = newProperty;\n  };\n\n\n  DescriptorBuilder.prototype.redefineProperty = function(p, targetPropertyName, replace) {\n\n    var nsPrefix = p.ns.prefix;\n    var parts = targetPropertyName.split('#');\n\n    var name = parseName(parts[0], nsPrefix);\n    var attrName = parseName(parts[1], name.prefix).name;\n\n    var redefinedProperty = this.propertiesByName[attrName];\n    if (!redefinedProperty) {\n      throw new Error('refined property <' + attrName + '> not found');\n    } else {\n      this.replaceProperty(redefinedProperty, p, replace);\n    }\n\n    delete p.redefines;\n  };\n\n  DescriptorBuilder.prototype.addNamedProperty = function(p, validate) {\n    var ns = p.ns,\n        propsByName = this.propertiesByName;\n\n    if (validate) {\n      this.assertNotDefined(p, ns.name);\n      this.assertNotDefined(p, ns.localName);\n    }\n\n    propsByName[ns.name] = propsByName[ns.localName] = p;\n  };\n\n  DescriptorBuilder.prototype.removeNamedProperty = function(p) {\n    var ns = p.ns,\n        propsByName = this.propertiesByName;\n\n    delete propsByName[ns.name];\n    delete propsByName[ns.localName];\n  };\n\n  DescriptorBuilder.prototype.setBodyProperty = function(p, validate) {\n\n    if (validate && this.bodyProperty) {\n      throw new Error(\n        'body property defined multiple times ' +\n        '(<' + this.bodyProperty.ns.name + '>, <' + p.ns.name + '>)');\n    }\n\n    this.bodyProperty = p;\n  };\n\n  DescriptorBuilder.prototype.setIdProperty = function(p, validate) {\n\n    if (validate && this.idProperty) {\n      throw new Error(\n        'id property defined multiple times ' +\n        '(<' + this.idProperty.ns.name + '>, <' + p.ns.name + '>)');\n    }\n\n    this.idProperty = p;\n  };\n\n  DescriptorBuilder.prototype.assertNotDefined = function(p, name) {\n    var propertyName = p.name,\n        definedProperty = this.propertiesByName[propertyName];\n\n    if (definedProperty) {\n      throw new Error(\n        'property <' + propertyName + '> already defined; ' +\n        'override of <' + definedProperty.definedBy.ns.name + '#' + definedProperty.ns.name + '> by ' +\n        '<' + p.definedBy.ns.name + '#' + p.ns.name + '> not allowed without redefines');\n    }\n  };\n\n  DescriptorBuilder.prototype.hasProperty = function(name) {\n    return this.propertiesByName[name];\n  };\n\n  DescriptorBuilder.prototype.addTrait = function(t, inherited) {\n\n    var typesByName = this.allTypesByName,\n        types = this.allTypes;\n\n    var typeName = t.name;\n\n    if (typeName in typesByName) {\n      return;\n    }\n\n    forEach$1(t.properties, bind$2(function(p) {\n\n      // clone property to allow extensions\n      p = assign$1({}, p, {\n        name: p.ns.localName,\n        inherited: inherited\n      });\n\n      Object.defineProperty(p, 'definedBy', {\n        value: t\n      });\n\n      var replaces = p.replaces,\n          redefines = p.redefines;\n\n      // add replace/redefine support\n      if (replaces || redefines) {\n        this.redefineProperty(p, replaces || redefines, replaces);\n      } else {\n        if (p.isBody) {\n          this.setBodyProperty(p);\n        }\n        if (p.isId) {\n          this.setIdProperty(p);\n        }\n        this.addProperty(p);\n      }\n    }, this));\n\n    types.push(t);\n    typesByName[typeName] = t;\n  };\n\n  /**\n   * A registry of Moddle packages.\n   *\n   * @param {Array<Package>} packages\n   * @param {Properties} properties\n   */\n  function Registry(packages, properties) {\n    this.packageMap = {};\n    this.typeMap = {};\n\n    this.packages = [];\n\n    this.properties = properties;\n\n    forEach$1(packages, bind$2(this.registerPackage, this));\n  }\n\n\n  Registry.prototype.getPackage = function(uriOrPrefix) {\n    return this.packageMap[uriOrPrefix];\n  };\n\n  Registry.prototype.getPackages = function() {\n    return this.packages;\n  };\n\n\n  Registry.prototype.registerPackage = function(pkg) {\n\n    // copy package\n    pkg = assign$1({}, pkg);\n\n    var pkgMap = this.packageMap;\n\n    ensureAvailable(pkgMap, pkg, 'prefix');\n    ensureAvailable(pkgMap, pkg, 'uri');\n\n    // register types\n    forEach$1(pkg.types, bind$2(function(descriptor) {\n      this.registerType(descriptor, pkg);\n    }, this));\n\n    pkgMap[pkg.uri] = pkgMap[pkg.prefix] = pkg;\n    this.packages.push(pkg);\n  };\n\n\n  /**\n   * Register a type from a specific package with us\n   */\n  Registry.prototype.registerType = function(type, pkg) {\n\n    type = assign$1({}, type, {\n      superClass: (type.superClass || []).slice(),\n      extends: (type.extends || []).slice(),\n      properties: (type.properties || []).slice(),\n      meta: assign$1((type.meta || {}))\n    });\n\n    var ns = parseName(type.name, pkg.prefix),\n        name = ns.name,\n        propertiesByName = {};\n\n    // parse properties\n    forEach$1(type.properties, bind$2(function(p) {\n\n      // namespace property names\n      var propertyNs = parseName(p.name, ns.prefix),\n          propertyName = propertyNs.name;\n\n      // namespace property types\n      if (!isBuiltIn(p.type)) {\n        p.type = parseName(p.type, propertyNs.prefix).name;\n      }\n\n      assign$1(p, {\n        ns: propertyNs,\n        name: propertyName\n      });\n\n      propertiesByName[propertyName] = p;\n    }, this));\n\n    // update ns + name\n    assign$1(type, {\n      ns: ns,\n      name: name,\n      propertiesByName: propertiesByName\n    });\n\n    forEach$1(type.extends, bind$2(function(extendsName) {\n      var extended = this.typeMap[extendsName];\n\n      extended.traits = extended.traits || [];\n      extended.traits.push(name);\n    }, this));\n\n    // link to package\n    this.definePackage(type, pkg);\n\n    // register\n    this.typeMap[name] = type;\n  };\n\n\n  /**\n   * Traverse the type hierarchy from bottom to top,\n   * calling iterator with (type, inherited) for all elements in\n   * the inheritance chain.\n   *\n   * @param {Object} nsName\n   * @param {Function} iterator\n   * @param {Boolean} [trait=false]\n   */\n  Registry.prototype.mapTypes = function(nsName, iterator, trait) {\n\n    var type = isBuiltIn(nsName.name) ? { name: nsName.name } : this.typeMap[nsName.name];\n\n    var self = this;\n\n    /**\n     * Traverse the selected trait.\n     *\n     * @param {String} cls\n     */\n    function traverseTrait(cls) {\n      return traverseSuper(cls, true);\n    }\n\n    /**\n     * Traverse the selected super type or trait\n     *\n     * @param {String} cls\n     * @param {Boolean} [trait=false]\n     */\n    function traverseSuper(cls, trait) {\n      var parentNs = parseName(cls, isBuiltIn(cls) ? '' : nsName.prefix);\n      self.mapTypes(parentNs, iterator, trait);\n    }\n\n    if (!type) {\n      throw new Error('unknown type <' + nsName.name + '>');\n    }\n\n    forEach$1(type.superClass, trait ? traverseTrait : traverseSuper);\n\n    // call iterator with (type, inherited=!trait)\n    iterator(type, !trait);\n\n    forEach$1(type.traits, traverseTrait);\n  };\n\n\n  /**\n   * Returns the effective descriptor for a type.\n   *\n   * @param  {String} type the namespaced name (ns:localName) of the type\n   *\n   * @return {Descriptor} the resulting effective descriptor\n   */\n  Registry.prototype.getEffectiveDescriptor = function(name) {\n\n    var nsName = parseName(name);\n\n    var builder = new DescriptorBuilder(nsName);\n\n    this.mapTypes(nsName, function(type, inherited) {\n      builder.addTrait(type, inherited);\n    });\n\n    var descriptor = builder.build();\n\n    // define package link\n    this.definePackage(descriptor, descriptor.allTypes[descriptor.allTypes.length - 1].$pkg);\n\n    return descriptor;\n  };\n\n\n  Registry.prototype.definePackage = function(target, pkg) {\n    this.properties.define(target, '$pkg', { value: pkg });\n  };\n\n\n\n  // helpers ////////////////////////////\n\n  function ensureAvailable(packageMap, pkg, identifierKey) {\n\n    var value = pkg[identifierKey];\n\n    if (value in packageMap) {\n      throw new Error('package with ' + identifierKey + ' <' + value + '> already defined');\n    }\n  }\n\n  /**\n   * A utility that gets and sets properties of model elements.\n   *\n   * @param {Model} model\n   */\n  function Properties(model) {\n    this.model = model;\n  }\n\n\n  /**\n   * Sets a named property on the target element.\n   * If the value is undefined, the property gets deleted.\n   *\n   * @param {Object} target\n   * @param {String} name\n   * @param {Object} value\n   */\n  Properties.prototype.set = function(target, name, value) {\n\n    if (!isString(name) || !name.length) {\n      throw new TypeError('property name must be a non-empty string');\n    }\n\n    var property = this.model.getPropertyDescriptor(target, name);\n\n    var propertyName = property && property.name;\n\n    if (isUndefined(value)) {\n\n      // unset the property, if the specified value is undefined;\n      // delete from $attrs (for extensions) or the target itself\n      if (property) {\n        delete target[propertyName];\n      } else {\n        delete target.$attrs[name];\n      }\n    } else {\n\n      // set the property, defining well defined properties on the fly\n      // or simply updating them in target.$attrs (for extensions)\n      if (property) {\n        if (propertyName in target) {\n          target[propertyName] = value;\n        } else {\n          defineProperty(target, property, value);\n        }\n      } else {\n        target.$attrs[name] = value;\n      }\n    }\n  };\n\n  /**\n   * Returns the named property of the given element\n   *\n   * @param  {Object} target\n   * @param  {String} name\n   *\n   * @return {Object}\n   */\n  Properties.prototype.get = function(target, name) {\n\n    var property = this.model.getPropertyDescriptor(target, name);\n\n    if (!property) {\n      return target.$attrs[name];\n    }\n\n    var propertyName = property.name;\n\n    // check if access to collection property and lazily initialize it\n    if (!target[propertyName] && property.isMany) {\n      defineProperty(target, property, []);\n    }\n\n    return target[propertyName];\n  };\n\n\n  /**\n   * Define a property on the target element\n   *\n   * @param  {Object} target\n   * @param  {String} name\n   * @param  {Object} options\n   */\n  Properties.prototype.define = function(target, name, options) {\n\n    if (!options.writable) {\n\n      var value = options.value;\n\n      // use getters for read-only variables to support ES6 proxies\n      // cf. https://github.com/bpmn-io/internal-docs/issues/386\n      options = assign$1({}, options, {\n        get: function() { return value; }\n      });\n\n      delete options.value;\n    }\n\n    Object.defineProperty(target, name, options);\n  };\n\n\n  /**\n   * Define the descriptor for an element\n   */\n  Properties.prototype.defineDescriptor = function(target, descriptor) {\n    this.define(target, '$descriptor', { value: descriptor });\n  };\n\n  /**\n   * Define the model for an element\n   */\n  Properties.prototype.defineModel = function(target, model) {\n    this.define(target, '$model', { value: model });\n  };\n\n\n  function isUndefined(val) {\n    return typeof val === 'undefined';\n  }\n\n  function defineProperty(target, property, value) {\n    Object.defineProperty(target, property.name, {\n      enumerable: !property.isReference,\n      writable: true,\n      value: value,\n      configurable: true\n    });\n  }\n\n  // Moddle implementation /////////////////////////////////////////////////\n\n  /**\n   * @class Moddle\n   *\n   * A model that can be used to create elements of a specific type.\n   *\n   * @example\n   *\n   * var Moddle = require('moddle');\n   *\n   * var pkg = {\n   *   name: 'mypackage',\n   *   prefix: 'my',\n   *   types: [\n   *     { name: 'Root' }\n   *   ]\n   * };\n   *\n   * var moddle = new Moddle([pkg]);\n   *\n   * @param {Array<Package>} packages the packages to contain\n   */\n  function Moddle(packages) {\n\n    this.properties = new Properties(this);\n\n    this.factory = new Factory(this, this.properties);\n    this.registry = new Registry(packages, this.properties);\n\n    this.typeCache = {};\n  }\n\n\n  /**\n   * Create an instance of the specified type.\n   *\n   * @method Moddle#create\n   *\n   * @example\n   *\n   * var foo = moddle.create('my:Foo');\n   * var bar = moddle.create('my:Bar', { id: 'BAR_1' });\n   *\n   * @param  {String|Object} descriptor the type descriptor or name know to the model\n   * @param  {Object} attrs   a number of attributes to initialize the model instance with\n   * @return {Object}         model instance\n   */\n  Moddle.prototype.create = function(descriptor, attrs) {\n    var Type = this.getType(descriptor);\n\n    if (!Type) {\n      throw new Error('unknown type <' + descriptor + '>');\n    }\n\n    return new Type(attrs);\n  };\n\n\n  /**\n   * Returns the type representing a given descriptor\n   *\n   * @method Moddle#getType\n   *\n   * @example\n   *\n   * var Foo = moddle.getType('my:Foo');\n   * var foo = new Foo({ 'id' : 'FOO_1' });\n   *\n   * @param  {String|Object} descriptor the type descriptor or name know to the model\n   * @return {Object}         the type representing the descriptor\n   */\n  Moddle.prototype.getType = function(descriptor) {\n\n    var cache = this.typeCache;\n\n    var name = isString(descriptor) ? descriptor : descriptor.ns.name;\n\n    var type = cache[name];\n\n    if (!type) {\n      descriptor = this.registry.getEffectiveDescriptor(name);\n      type = cache[name] = this.factory.createType(descriptor);\n    }\n\n    return type;\n  };\n\n\n  /**\n   * Creates an any-element type to be used within model instances.\n   *\n   * This can be used to create custom elements that lie outside the meta-model.\n   * The created element contains all the meta-data required to serialize it\n   * as part of meta-model elements.\n   *\n   * @method Moddle#createAny\n   *\n   * @example\n   *\n   * var foo = moddle.createAny('vendor:Foo', 'http://vendor', {\n   *   value: 'bar'\n   * });\n   *\n   * var container = moddle.create('my:Container', 'http://my', {\n   *   any: [ foo ]\n   * });\n   *\n   * // go ahead and serialize the stuff\n   *\n   *\n   * @param  {String} name  the name of the element\n   * @param  {String} nsUri the namespace uri of the element\n   * @param  {Object} [properties] a map of properties to initialize the instance with\n   * @return {Object} the any type instance\n   */\n  Moddle.prototype.createAny = function(name, nsUri, properties) {\n\n    var nameNs = parseName(name);\n\n    var element = {\n      $type: name,\n      $instanceOf: function(type) {\n        return type === this.$type;\n      }\n    };\n\n    var descriptor = {\n      name: name,\n      isGeneric: true,\n      ns: {\n        prefix: nameNs.prefix,\n        localName: nameNs.localName,\n        uri: nsUri\n      }\n    };\n\n    this.properties.defineDescriptor(element, descriptor);\n    this.properties.defineModel(element, this);\n    this.properties.define(element, '$parent', { enumerable: false, writable: true });\n    this.properties.define(element, '$instanceOf', { enumerable: false, writable: true });\n\n    forEach$1(properties, function(a, key) {\n      if (isObject(a) && a.value !== undefined) {\n        element[a.name] = a.value;\n      } else {\n        element[key] = a;\n      }\n    });\n\n    return element;\n  };\n\n  /**\n   * Returns a registered package by uri or prefix\n   *\n   * @return {Object} the package\n   */\n  Moddle.prototype.getPackage = function(uriOrPrefix) {\n    return this.registry.getPackage(uriOrPrefix);\n  };\n\n  /**\n   * Returns a snapshot of all known packages\n   *\n   * @return {Object} the package\n   */\n  Moddle.prototype.getPackages = function() {\n    return this.registry.getPackages();\n  };\n\n  /**\n   * Returns the descriptor for an element\n   */\n  Moddle.prototype.getElementDescriptor = function(element) {\n    return element.$descriptor;\n  };\n\n  /**\n   * Returns true if the given descriptor or instance\n   * represents the given type.\n   *\n   * May be applied to this, if element is omitted.\n   */\n  Moddle.prototype.hasType = function(element, type) {\n    if (type === undefined) {\n      type = element;\n      element = this;\n    }\n\n    var descriptor = element.$model.getElementDescriptor(element);\n\n    return (type in descriptor.allTypesByName);\n  };\n\n  /**\n   * Returns the descriptor of an elements named property\n   */\n  Moddle.prototype.getPropertyDescriptor = function(element, property) {\n    return this.getElementDescriptor(element).propertiesByName[property];\n  };\n\n  /**\n   * Returns a mapped type's descriptor\n   */\n  Moddle.prototype.getTypeDescriptor = function(type) {\n    return this.registry.typeMap[type];\n  };\n\n  var fromCharCode = String.fromCharCode;\n\n  var hasOwnProperty = Object.prototype.hasOwnProperty;\n\n  var ENTITY_PATTERN = /&#(\\d+);|&#x([0-9a-f]+);|&(\\w+);/ig;\n\n  var ENTITY_MAPPING = {\n    'amp': '&',\n    'apos': '\\'',\n    'gt': '>',\n    'lt': '<',\n    'quot': '\"'\n  };\n\n  // map UPPERCASE variants of supported special chars\n  Object.keys(ENTITY_MAPPING).forEach(function(k) {\n    ENTITY_MAPPING[k.toUpperCase()] = ENTITY_MAPPING[k];\n  });\n\n\n  function replaceEntities(_, d, x, z) {\n\n    // reserved names, i.e. &nbsp;\n    if (z) {\n      if (hasOwnProperty.call(ENTITY_MAPPING, z)) {\n        return ENTITY_MAPPING[z];\n      } else {\n\n        // fall back to original value\n        return '&' + z + ';';\n      }\n    }\n\n    // decimal encoded char\n    if (d) {\n      return fromCharCode(d);\n    }\n\n    // hex encoded char\n    return fromCharCode(parseInt(x, 16));\n  }\n\n\n  /**\n   * A basic entity decoder that can decode a minimal\n   * sub-set of reserved names (&amp;) as well as\n   * hex (&#xaaf;) and decimal (&#1231;) encoded characters.\n   *\n   * @param {string} str\n   *\n   * @return {string} decoded string\n   */\n  function decodeEntities(s) {\n    if (s.length > 3 && s.indexOf('&') !== -1) {\n      return s.replace(ENTITY_PATTERN, replaceEntities);\n    }\n\n    return s;\n  }\n\n  var XSI_URI = 'http://www.w3.org/2001/XMLSchema-instance';\n  var XSI_PREFIX = 'xsi';\n  var XSI_TYPE$1 = 'xsi:type';\n\n  var NON_WHITESPACE_OUTSIDE_ROOT_NODE = 'non-whitespace outside of root node';\n\n  function error$1(msg) {\n    return new Error(msg);\n  }\n\n  function missingNamespaceForPrefix(prefix) {\n    return 'missing namespace for prefix <' + prefix + '>';\n  }\n\n  function getter(getFn) {\n    return {\n      'get': getFn,\n      'enumerable': true\n    };\n  }\n\n  function cloneNsMatrix(nsMatrix) {\n    var clone = {}, key;\n    for (key in nsMatrix) {\n      clone[key] = nsMatrix[key];\n    }\n    return clone;\n  }\n\n  function uriPrefix(prefix) {\n    return prefix + '$uri';\n  }\n\n  function buildNsMatrix(nsUriToPrefix) {\n    var nsMatrix = {},\n        uri,\n        prefix;\n\n    for (uri in nsUriToPrefix) {\n      prefix = nsUriToPrefix[uri];\n      nsMatrix[prefix] = prefix;\n      nsMatrix[uriPrefix(prefix)] = uri;\n    }\n\n    return nsMatrix;\n  }\n\n  function noopGetContext() {\n    return { 'line': 0, 'column': 0 };\n  }\n\n  function throwFunc(err) {\n    throw err;\n  }\n\n  /**\n   * Creates a new parser with the given options.\n   *\n   * @constructor\n   *\n   * @param  {!Object<string, ?>=} options\n   */\n  function Parser(options) {\n\n    if (!this) {\n      return new Parser(options);\n    }\n\n    var proxy = options && options['proxy'];\n\n    var onText,\n        onOpenTag,\n        onCloseTag,\n        onCDATA,\n        onError = throwFunc,\n        onWarning,\n        onComment,\n        onQuestion,\n        onAttention;\n\n    var getContext = noopGetContext;\n\n    /**\n     * Do we need to parse the current elements attributes for namespaces?\n     *\n     * @type {boolean}\n     */\n    var maybeNS = false;\n\n    /**\n     * Do we process namespaces at all?\n     *\n     * @type {boolean}\n     */\n    var isNamespace = false;\n\n    /**\n     * The caught error returned on parse end\n     *\n     * @type {Error}\n     */\n    var returnError = null;\n\n    /**\n     * Should we stop parsing?\n     *\n     * @type {boolean}\n     */\n    var parseStop = false;\n\n    /**\n     * A map of { uri: prefix } used by the parser.\n     *\n     * This map will ensure we can normalize prefixes during processing;\n     * for each uri, only one prefix will be exposed to the handlers.\n     *\n     * @type {!Object<string, string>}}\n     */\n    var nsUriToPrefix;\n\n    /**\n     * Handle parse error.\n     *\n     * @param  {string|Error} err\n     */\n    function handleError(err) {\n      if (!(err instanceof Error)) {\n        err = error$1(err);\n      }\n\n      returnError = err;\n\n      onError(err, getContext);\n    }\n\n    /**\n     * Handle parse error.\n     *\n     * @param  {string|Error} err\n     */\n    function handleWarning(err) {\n\n      if (!onWarning) {\n        return;\n      }\n\n      if (!(err instanceof Error)) {\n        err = error$1(err);\n      }\n\n      onWarning(err, getContext);\n    }\n\n    /**\n     * Register parse listener.\n     *\n     * @param  {string}   name\n     * @param  {Function} cb\n     *\n     * @return {Parser}\n     */\n    this['on'] = function(name, cb) {\n\n      if (typeof cb !== 'function') {\n        throw error$1('required args <name, cb>');\n      }\n\n      switch (name) {\n      case 'openTag': onOpenTag = cb; break;\n      case 'text': onText = cb; break;\n      case 'closeTag': onCloseTag = cb; break;\n      case 'error': onError = cb; break;\n      case 'warn': onWarning = cb; break;\n      case 'cdata': onCDATA = cb; break;\n      case 'attention': onAttention = cb; break; // <!XXXXX zzzz=\"eeee\">\n      case 'question': onQuestion = cb; break; // <? ....  ?>\n      case 'comment': onComment = cb; break;\n      default:\n        throw error$1('unsupported event: ' + name);\n      }\n\n      return this;\n    };\n\n    /**\n     * Set the namespace to prefix mapping.\n     *\n     * @example\n     *\n     * parser.ns({\n     *   'http://foo': 'foo',\n     *   'http://bar': 'bar'\n     * });\n     *\n     * @param  {!Object<string, string>} nsMap\n     *\n     * @return {Parser}\n     */\n    this['ns'] = function(nsMap) {\n\n      if (typeof nsMap === 'undefined') {\n        nsMap = {};\n      }\n\n      if (typeof nsMap !== 'object') {\n        throw error$1('required args <nsMap={}>');\n      }\n\n      var _nsUriToPrefix = {}, k;\n\n      for (k in nsMap) {\n        _nsUriToPrefix[k] = nsMap[k];\n      }\n\n      // FORCE default mapping for schema instance\n      _nsUriToPrefix[XSI_URI] = XSI_PREFIX;\n\n      isNamespace = true;\n      nsUriToPrefix = _nsUriToPrefix;\n\n      return this;\n    };\n\n    /**\n     * Parse xml string.\n     *\n     * @param  {string} xml\n     *\n     * @return {Error} returnError, if not thrown\n     */\n    this['parse'] = function(xml) {\n      if (typeof xml !== 'string') {\n        throw error$1('required args <xml=string>');\n      }\n\n      returnError = null;\n\n      parse(xml);\n\n      getContext = noopGetContext;\n      parseStop = false;\n\n      return returnError;\n    };\n\n    /**\n     * Stop parsing.\n     */\n    this['stop'] = function() {\n      parseStop = true;\n    };\n\n    /**\n     * Parse string, invoking configured listeners on element.\n     *\n     * @param  {string} xml\n     */\n    function parse(xml) {\n      var nsMatrixStack = isNamespace ? [] : null,\n          nsMatrix = isNamespace ? buildNsMatrix(nsUriToPrefix) : null,\n          _nsMatrix,\n          nodeStack = [],\n          anonymousNsCount = 0,\n          tagStart = false,\n          tagEnd = false,\n          i = 0, j = 0,\n          x, y, q, w, v,\n          xmlns,\n          elementName,\n          _elementName,\n          elementProxy\n          ;\n\n      var attrsString = '',\n          attrsStart = 0,\n          cachedAttrs // false = parsed with errors, null = needs parsing\n          ;\n\n      /**\n       * Parse attributes on demand and returns the parsed attributes.\n       *\n       * Return semantics: (1) `false` on attribute parse error,\n       * (2) object hash on extracted attrs.\n       *\n       * @return {boolean|Object}\n       */\n      function getAttrs() {\n        if (cachedAttrs !== null) {\n          return cachedAttrs;\n        }\n\n        var nsUri,\n            nsUriPrefix,\n            nsName,\n            defaultAlias = isNamespace && nsMatrix['xmlns'],\n            attrList = isNamespace && maybeNS ? [] : null,\n            i = attrsStart,\n            s = attrsString,\n            l = s.length,\n            hasNewMatrix,\n            newalias,\n            value,\n            alias,\n            name,\n            attrs = {},\n            seenAttrs = {},\n            skipAttr,\n            w,\n            j;\n\n        parseAttr:\n        for (; i < l; i++) {\n          skipAttr = false;\n          w = s.charCodeAt(i);\n\n          if (w === 32 || (w < 14 && w > 8)) { // WHITESPACE={ \\f\\n\\r\\t\\v}\n            continue;\n          }\n\n          // wait for non whitespace character\n          if (w < 65 || w > 122 || (w > 90 && w < 97)) {\n            if (w !== 95 && w !== 58) { // char 95\"_\" 58\":\"\n              handleWarning('illegal first char attribute name');\n              skipAttr = true;\n            }\n          }\n\n          // parse attribute name\n          for (j = i + 1; j < l; j++) {\n            w = s.charCodeAt(j);\n\n            if (\n              w > 96 && w < 123 ||\n              w > 64 && w < 91 ||\n              w > 47 && w < 59 ||\n              w === 46 || // '.'\n              w === 45 || // '-'\n              w === 95 // '_'\n            ) {\n              continue;\n            }\n\n            // unexpected whitespace\n            if (w === 32 || (w < 14 && w > 8)) { // WHITESPACE\n              handleWarning('missing attribute value');\n              i = j;\n\n              continue parseAttr;\n            }\n\n            // expected \"=\"\n            if (w === 61) { // \"=\" == 61\n              break;\n            }\n\n            handleWarning('illegal attribute name char');\n            skipAttr = true;\n          }\n\n          name = s.substring(i, j);\n\n          if (name === 'xmlns:xmlns') {\n            handleWarning('illegal declaration of xmlns');\n            skipAttr = true;\n          }\n\n          w = s.charCodeAt(j + 1);\n\n          if (w === 34) { // '\"'\n            j = s.indexOf('\"', i = j + 2);\n\n            if (j === -1) {\n              j = s.indexOf('\\'', i);\n\n              if (j !== -1) {\n                handleWarning('attribute value quote missmatch');\n                skipAttr = true;\n              }\n            }\n\n          } else if (w === 39) { // \"'\"\n            j = s.indexOf('\\'', i = j + 2);\n\n            if (j === -1) {\n              j = s.indexOf('\"', i);\n\n              if (j !== -1) {\n                handleWarning('attribute value quote missmatch');\n                skipAttr = true;\n              }\n            }\n\n          } else {\n            handleWarning('missing attribute value quotes');\n            skipAttr = true;\n\n            // skip to next space\n            for (j = j + 1; j < l; j++) {\n              w = s.charCodeAt(j + 1);\n\n              if (w === 32 || (w < 14 && w > 8)) { // WHITESPACE\n                break;\n              }\n            }\n\n          }\n\n          if (j === -1) {\n            handleWarning('missing closing quotes');\n\n            j = l;\n            skipAttr = true;\n          }\n\n          if (!skipAttr) {\n            value = s.substring(i, j);\n          }\n\n          i = j;\n\n          // ensure SPACE follows attribute\n          // skip illegal content otherwise\n          // example a=\"b\"c\n          for (; j + 1 < l; j++) {\n            w = s.charCodeAt(j + 1);\n\n            if (w === 32 || (w < 14 && w > 8)) { // WHITESPACE\n              break;\n            }\n\n            // FIRST ILLEGAL CHAR\n            if (i === j) {\n              handleWarning('illegal character after attribute end');\n              skipAttr = true;\n            }\n          }\n\n          // advance cursor to next attribute\n          i = j + 1;\n\n          if (skipAttr) {\n            continue parseAttr;\n          }\n\n          // check attribute re-declaration\n          if (name in seenAttrs) {\n            handleWarning('attribute <' + name + '> already defined');\n            continue;\n          }\n\n          seenAttrs[name] = true;\n\n          if (!isNamespace) {\n            attrs[name] = value;\n            continue;\n          }\n\n          // try to extract namespace information\n          if (maybeNS) {\n            newalias = (\n              name === 'xmlns'\n                ? 'xmlns'\n                : (name.charCodeAt(0) === 120 && name.substr(0, 6) === 'xmlns:')\n                  ? name.substr(6)\n                  : null\n            );\n\n            // handle xmlns(:alias) assignment\n            if (newalias !== null) {\n              nsUri = decodeEntities(value);\n              nsUriPrefix = uriPrefix(newalias);\n\n              alias = nsUriToPrefix[nsUri];\n\n              if (!alias) {\n\n                // no prefix defined or prefix collision\n                if (\n                  (newalias === 'xmlns') ||\n                  (nsUriPrefix in nsMatrix && nsMatrix[nsUriPrefix] !== nsUri)\n                ) {\n\n                  // alocate free ns prefix\n                  do {\n                    alias = 'ns' + (anonymousNsCount++);\n                  } while (typeof nsMatrix[alias] !== 'undefined');\n                } else {\n                  alias = newalias;\n                }\n\n                nsUriToPrefix[nsUri] = alias;\n              }\n\n              if (nsMatrix[newalias] !== alias) {\n                if (!hasNewMatrix) {\n                  nsMatrix = cloneNsMatrix(nsMatrix);\n                  hasNewMatrix = true;\n                }\n\n                nsMatrix[newalias] = alias;\n                if (newalias === 'xmlns') {\n                  nsMatrix[uriPrefix(alias)] = nsUri;\n                  defaultAlias = alias;\n                }\n\n                nsMatrix[nsUriPrefix] = nsUri;\n              }\n\n              // expose xmlns(:asd)=\"...\" in attributes\n              attrs[name] = value;\n              continue;\n            }\n\n            // collect attributes until all namespace\n            // declarations are processed\n            attrList.push(name, value);\n            continue;\n\n          } /** end if (maybeNs) */\n\n          // handle attributes on element without\n          // namespace declarations\n          w = name.indexOf(':');\n          if (w === -1) {\n            attrs[name] = value;\n            continue;\n          }\n\n          // normalize ns attribute name\n          if (!(nsName = nsMatrix[name.substring(0, w)])) {\n            handleWarning(missingNamespaceForPrefix(name.substring(0, w)));\n            continue;\n          }\n\n          name = defaultAlias === nsName\n            ? name.substr(w + 1)\n            : nsName + name.substr(w);\n\n          // end: normalize ns attribute name\n\n          // normalize xsi:type ns attribute value\n          if (name === XSI_TYPE$1) {\n            w = value.indexOf(':');\n\n            if (w !== -1) {\n              nsName = value.substring(0, w);\n\n              // handle default prefixes, i.e. xs:String gracefully\n              nsName = nsMatrix[nsName] || nsName;\n              value = nsName + value.substring(w);\n            } else {\n              value = defaultAlias + ':' + value;\n            }\n          }\n\n          // end: normalize xsi:type ns attribute value\n\n          attrs[name] = value;\n        }\n\n\n        // handle deferred, possibly namespaced attributes\n        if (maybeNS) {\n\n          // normalize captured attributes\n          for (i = 0, l = attrList.length; i < l; i++) {\n\n            name = attrList[i++];\n            value = attrList[i];\n\n            w = name.indexOf(':');\n\n            if (w !== -1) {\n\n              // normalize ns attribute name\n              if (!(nsName = nsMatrix[name.substring(0, w)])) {\n                handleWarning(missingNamespaceForPrefix(name.substring(0, w)));\n                continue;\n              }\n\n              name = defaultAlias === nsName\n                ? name.substr(w + 1)\n                : nsName + name.substr(w);\n\n              // end: normalize ns attribute name\n\n              // normalize xsi:type ns attribute value\n              if (name === XSI_TYPE$1) {\n                w = value.indexOf(':');\n\n                if (w !== -1) {\n                  nsName = value.substring(0, w);\n\n                  // handle default prefixes, i.e. xs:String gracefully\n                  nsName = nsMatrix[nsName] || nsName;\n                  value = nsName + value.substring(w);\n                } else {\n                  value = defaultAlias + ':' + value;\n                }\n              }\n\n              // end: normalize xsi:type ns attribute value\n            }\n\n            attrs[name] = value;\n          }\n\n          // end: normalize captured attributes\n        }\n\n        return cachedAttrs = attrs;\n      }\n\n      /**\n       * Extract the parse context { line, column, part }\n       * from the current parser position.\n       *\n       * @return {Object} parse context\n       */\n      function getParseContext() {\n        var splitsRe = /(\\r\\n|\\r|\\n)/g;\n\n        var line = 0;\n        var column = 0;\n        var startOfLine = 0;\n        var endOfLine = j;\n        var match;\n        var data;\n\n        while (i >= startOfLine) {\n\n          match = splitsRe.exec(xml);\n\n          if (!match) {\n            break;\n          }\n\n          // end of line = (break idx + break chars)\n          endOfLine = match[0].length + match.index;\n\n          if (endOfLine > i) {\n            break;\n          }\n\n          // advance to next line\n          line += 1;\n\n          startOfLine = endOfLine;\n        }\n\n        // EOF errors\n        if (i == -1) {\n          column = endOfLine;\n          data = xml.substring(j);\n        } else\n\n        // start errors\n        if (j === 0) {\n          data = xml.substring(j, i);\n        }\n\n        // other errors\n        else {\n          column = i - startOfLine;\n          data = (j == -1 ? xml.substring(i) : xml.substring(i, j + 1));\n        }\n\n        return {\n          'data': data,\n          'line': line,\n          'column': column\n        };\n      }\n\n      getContext = getParseContext;\n\n\n      if (proxy) {\n        elementProxy = Object.create({}, {\n          'name': getter(function() {\n            return elementName;\n          }),\n          'originalName': getter(function() {\n            return _elementName;\n          }),\n          'attrs': getter(getAttrs),\n          'ns': getter(function() {\n            return nsMatrix;\n          })\n        });\n      }\n\n      // actual parse logic\n      while (j !== -1) {\n\n        if (xml.charCodeAt(j) === 60) { // \"<\"\n          i = j;\n        } else {\n          i = xml.indexOf('<', j);\n        }\n\n        // parse end\n        if (i === -1) {\n          if (nodeStack.length) {\n            return handleError('unexpected end of file');\n          }\n\n          if (j === 0) {\n            return handleError('missing start tag');\n          }\n\n          if (j < xml.length) {\n            if (xml.substring(j).trim()) {\n              handleWarning(NON_WHITESPACE_OUTSIDE_ROOT_NODE);\n            }\n          }\n\n          return;\n        }\n\n        // parse text\n        if (j !== i) {\n\n          if (nodeStack.length) {\n            if (onText) {\n              onText(xml.substring(j, i), decodeEntities, getContext);\n\n              if (parseStop) {\n                return;\n              }\n            }\n          } else {\n            if (xml.substring(j, i).trim()) {\n              handleWarning(NON_WHITESPACE_OUTSIDE_ROOT_NODE);\n\n              if (parseStop) {\n                return;\n              }\n            }\n          }\n        }\n\n        w = xml.charCodeAt(i+1);\n\n        // parse comments + CDATA\n        if (w === 33) { // \"!\"\n          q = xml.charCodeAt(i+2);\n\n          // CDATA section\n          if (q === 91 && xml.substr(i + 3, 6) === 'CDATA[') { // 91 == \"[\"\n            j = xml.indexOf(']]>', i);\n            if (j === -1) {\n              return handleError('unclosed cdata');\n            }\n\n            if (onCDATA) {\n              onCDATA(xml.substring(i + 9, j), getContext);\n              if (parseStop) {\n                return;\n              }\n            }\n\n            j += 3;\n            continue;\n          }\n\n          // comment\n          if (q === 45 && xml.charCodeAt(i + 3) === 45) { // 45 == \"-\"\n            j = xml.indexOf('-->', i);\n            if (j === -1) {\n              return handleError('unclosed comment');\n            }\n\n\n            if (onComment) {\n              onComment(xml.substring(i + 4, j), decodeEntities, getContext);\n              if (parseStop) {\n                return;\n              }\n            }\n\n            j += 3;\n            continue;\n          }\n        }\n\n        // parse question <? ... ?>\n        if (w === 63) { // \"?\"\n          j = xml.indexOf('?>', i);\n          if (j === -1) {\n            return handleError('unclosed question');\n          }\n\n          if (onQuestion) {\n            onQuestion(xml.substring(i, j + 2), getContext);\n            if (parseStop) {\n              return;\n            }\n          }\n\n          j += 2;\n          continue;\n        }\n\n        // find matching closing tag for attention or standard tags\n        // for that we must skip through attribute values\n        // (enclosed in single or double quotes)\n        for (x = i + 1; ; x++) {\n          v = xml.charCodeAt(x);\n          if (isNaN(v)) {\n            j = -1;\n            return handleError('unclosed tag');\n          }\n\n          // [10] AttValue ::= '\"' ([^<&\"] | Reference)* '\"' | \"'\" ([^<&'] | Reference)* \"'\"\n          // skips the quoted string\n          // (double quotes) does not appear in a literal enclosed by (double quotes)\n          // (single quote) does not appear in a literal enclosed by (single quote)\n          if (v === 34) { //  '\"'\n            q = xml.indexOf('\"', x + 1);\n            x = q !== -1 ? q : x;\n          } else if (v === 39) { // \"'\"\n            q = xml.indexOf(\"'\", x + 1);\n            x = q !== -1 ? q : x;\n          } else if (v === 62) { // '>'\n            j = x;\n            break;\n          }\n        }\n\n\n        // parse attention <! ...>\n        // previously comment and CDATA have already been parsed\n        if (w === 33) { // \"!\"\n\n          if (onAttention) {\n            onAttention(xml.substring(i, j + 1), decodeEntities, getContext);\n            if (parseStop) {\n              return;\n            }\n          }\n\n          j += 1;\n          continue;\n        }\n\n        // don't process attributes;\n        // there are none\n        cachedAttrs = {};\n\n        // if (xml.charCodeAt(i+1) === 47) { // </...\n        if (w === 47) { // </...\n          tagStart = false;\n          tagEnd = true;\n\n          if (!nodeStack.length) {\n            return handleError('missing open tag');\n          }\n\n          // verify open <-> close tag match\n          x = elementName = nodeStack.pop();\n          q = i + 2 + x.length;\n\n          if (xml.substring(i + 2, q) !== x) {\n            return handleError('closing tag mismatch');\n          }\n\n          // verify chars in close tag\n          for (; q < j; q++) {\n            w = xml.charCodeAt(q);\n\n            if (w === 32 || (w > 8 && w < 14)) { // \\f\\n\\r\\t\\v space\n              continue;\n            }\n\n            return handleError('close tag');\n          }\n\n        } else {\n          if (xml.charCodeAt(j - 1) === 47) { // .../>\n            x = elementName = xml.substring(i + 1, j - 1);\n\n            tagStart = true;\n            tagEnd = true;\n\n          } else {\n            x = elementName = xml.substring(i + 1, j);\n\n            tagStart = true;\n            tagEnd = false;\n          }\n\n          if (!(w > 96 && w < 123 || w > 64 && w < 91 || w === 95 || w === 58)) { // char 95\"_\" 58\":\"\n            return handleError('illegal first char nodeName');\n          }\n\n          for (q = 1, y = x.length; q < y; q++) {\n            w = x.charCodeAt(q);\n\n            if (w > 96 && w < 123 || w > 64 && w < 91 || w > 47 && w < 59 || w === 45 || w === 95 || w == 46) {\n              continue;\n            }\n\n            if (w === 32 || (w < 14 && w > 8)) { // \\f\\n\\r\\t\\v space\n              elementName = x.substring(0, q);\n\n              // maybe there are attributes\n              cachedAttrs = null;\n              break;\n            }\n\n            return handleError('invalid nodeName');\n          }\n\n          if (!tagEnd) {\n            nodeStack.push(elementName);\n          }\n        }\n\n        if (isNamespace) {\n\n          _nsMatrix = nsMatrix;\n\n          if (tagStart) {\n\n            // remember old namespace\n            // unless we're self-closing\n            if (!tagEnd) {\n              nsMatrixStack.push(_nsMatrix);\n            }\n\n            if (cachedAttrs === null) {\n\n              // quick check, whether there may be namespace\n              // declarations on the node; if that is the case\n              // we need to eagerly parse the node attributes\n              if ((maybeNS = x.indexOf('xmlns', q) !== -1)) {\n                attrsStart = q;\n                attrsString = x;\n\n                getAttrs();\n\n                maybeNS = false;\n              }\n            }\n          }\n\n          _elementName = elementName;\n\n          w = elementName.indexOf(':');\n          if (w !== -1) {\n            xmlns = nsMatrix[elementName.substring(0, w)];\n\n            // prefix given; namespace must exist\n            if (!xmlns) {\n              return handleError('missing namespace on <' + _elementName + '>');\n            }\n\n            elementName = elementName.substr(w + 1);\n          } else {\n            xmlns = nsMatrix['xmlns'];\n\n            // if no default namespace is defined,\n            // we'll import the element as anonymous.\n            //\n            // it is up to users to correct that to the document defined\n            // targetNamespace, or whatever their undersanding of the\n            // XML spec mandates.\n          }\n\n          // adjust namespace prefixs as configured\n          if (xmlns) {\n            elementName = xmlns + ':' + elementName;\n          }\n\n        }\n\n        if (tagStart) {\n          attrsStart = q;\n          attrsString = x;\n\n          if (onOpenTag) {\n            if (proxy) {\n              onOpenTag(elementProxy, decodeEntities, tagEnd, getContext);\n            } else {\n              onOpenTag(elementName, getAttrs, decodeEntities, tagEnd, getContext);\n            }\n\n            if (parseStop) {\n              return;\n            }\n          }\n\n        }\n\n        if (tagEnd) {\n\n          if (onCloseTag) {\n            onCloseTag(proxy ? elementProxy : elementName, decodeEntities, tagStart, getContext);\n\n            if (parseStop) {\n              return;\n            }\n          }\n\n          // restore old namespace\n          if (isNamespace) {\n            if (!tagStart) {\n              nsMatrix = nsMatrixStack.pop();\n            } else {\n              nsMatrix = _nsMatrix;\n            }\n          }\n        }\n\n        j += 1;\n      }\n    } /** end parse */\n\n  }\n\n  function hasLowerCaseAlias(pkg) {\n    return pkg.xml && pkg.xml.tagAlias === 'lowerCase';\n  }\n\n  var DEFAULT_NS_MAP = {\n    'xsi': 'http://www.w3.org/2001/XMLSchema-instance',\n    'xml': 'http://www.w3.org/XML/1998/namespace'\n  };\n\n  var XSI_TYPE = 'xsi:type';\n\n  function serializeFormat(element) {\n    return element.xml && element.xml.serialize;\n  }\n\n  function serializeAsType(element) {\n    return serializeFormat(element) === XSI_TYPE;\n  }\n\n  function serializeAsProperty(element) {\n    return serializeFormat(element) === 'property';\n  }\n\n  function capitalize(str) {\n    return str.charAt(0).toUpperCase() + str.slice(1);\n  }\n\n  function aliasToName(aliasNs, pkg) {\n\n    if (!hasLowerCaseAlias(pkg)) {\n      return aliasNs.name;\n    }\n\n    return aliasNs.prefix + ':' + capitalize(aliasNs.localName);\n  }\n\n  function prefixedToName(nameNs, pkg) {\n\n    var name = nameNs.name,\n        localName = nameNs.localName;\n\n    var typePrefix = pkg.xml && pkg.xml.typePrefix;\n\n    if (typePrefix && localName.indexOf(typePrefix) === 0) {\n      return nameNs.prefix + ':' + localName.slice(typePrefix.length);\n    } else {\n      return name;\n    }\n  }\n\n  function normalizeXsiTypeName(name, model) {\n\n    var nameNs = parseName(name);\n    var pkg = model.getPackage(nameNs.prefix);\n\n    return prefixedToName(nameNs, pkg);\n  }\n\n  function error(message) {\n    return new Error(message);\n  }\n\n  /**\n   * Get the moddle descriptor for a given instance or type.\n   *\n   * @param  {ModdleElement|Function} element\n   *\n   * @return {Object} the moddle descriptor\n   */\n  function getModdleDescriptor(element) {\n    return element.$descriptor;\n  }\n\n\n  /**\n   * A parse context.\n   *\n   * @class\n   *\n   * @param {Object} options\n   * @param {ElementHandler} options.rootHandler the root handler for parsing a document\n   * @param {boolean} [options.lax=false] whether or not to ignore invalid elements\n   */\n  function Context(options) {\n\n    /**\n     * @property {ElementHandler} rootHandler\n     */\n\n    /**\n     * @property {Boolean} lax\n     */\n\n    assign$1(this, options);\n\n    this.elementsById = {};\n    this.references = [];\n    this.warnings = [];\n\n    /**\n     * Add an unresolved reference.\n     *\n     * @param {Object} reference\n     */\n    this.addReference = function(reference) {\n      this.references.push(reference);\n    };\n\n    /**\n     * Add a processed element.\n     *\n     * @param {ModdleElement} element\n     */\n    this.addElement = function(element) {\n\n      if (!element) {\n        throw error('expected element');\n      }\n\n      var elementsById = this.elementsById;\n\n      var descriptor = getModdleDescriptor(element);\n\n      var idProperty = descriptor.idProperty,\n          id;\n\n      if (idProperty) {\n        id = element.get(idProperty.name);\n\n        if (id) {\n\n          // for QName validation as per http://www.w3.org/TR/REC-xml/#NT-NameChar\n          //if (!/^([a-z][\\w-.]*:)?[a-z_][\\w-.]*$/i.test(id)) {\n          //  throw new Error('illegal ID <' + id + '>');\n          //}\n\n          if (elementsById[id]) {\n            throw error('duplicate ID <' + id + '>');\n          }\n\n          elementsById[id] = element;\n        }\n      }\n    };\n\n    /**\n     * Add an import warning.\n     *\n     * @param {Object} warning\n     * @param {String} warning.message\n     * @param {Error} [warning.error]\n     */\n    this.addWarning = function(warning) {\n      this.warnings.push(warning);\n    };\n  }\n\n  function BaseHandler() {}\n\n  BaseHandler.prototype.handleEnd = function() {};\n  BaseHandler.prototype.handleText = function() {};\n  BaseHandler.prototype.handleNode = function() {};\n\n\n  /**\n   * A simple pass through handler that does nothing except for\n   * ignoring all input it receives.\n   *\n   * This is used to ignore unknown elements and\n   * attributes.\n   */\n  function NoopHandler() { }\n\n  NoopHandler.prototype = Object.create(BaseHandler.prototype);\n\n  NoopHandler.prototype.handleNode = function() {\n    return this;\n  };\n\n  function BodyHandler() {}\n\n  BodyHandler.prototype = Object.create(BaseHandler.prototype);\n\n  BodyHandler.prototype.handleText = function(text) {\n    this.body = (this.body || '') + text;\n  };\n\n  function ReferenceHandler(property, context) {\n    this.property = property;\n    this.context = context;\n  }\n\n  ReferenceHandler.prototype = Object.create(BodyHandler.prototype);\n\n  ReferenceHandler.prototype.handleNode = function(node) {\n\n    if (this.element) {\n      throw error('expected no sub nodes');\n    } else {\n      this.element = this.createReference(node);\n    }\n\n    return this;\n  };\n\n  ReferenceHandler.prototype.handleEnd = function() {\n    this.element.id = this.body;\n  };\n\n  ReferenceHandler.prototype.createReference = function(node) {\n    return {\n      property: this.property.ns.name,\n      id: ''\n    };\n  };\n\n  function ValueHandler(propertyDesc, element) {\n    this.element = element;\n    this.propertyDesc = propertyDesc;\n  }\n\n  ValueHandler.prototype = Object.create(BodyHandler.prototype);\n\n  ValueHandler.prototype.handleEnd = function() {\n\n    var value = this.body || '',\n        element = this.element,\n        propertyDesc = this.propertyDesc;\n\n    value = coerceType(propertyDesc.type, value);\n\n    if (propertyDesc.isMany) {\n      element.get(propertyDesc.name).push(value);\n    } else {\n      element.set(propertyDesc.name, value);\n    }\n  };\n\n\n  function BaseElementHandler() {}\n\n  BaseElementHandler.prototype = Object.create(BodyHandler.prototype);\n\n  BaseElementHandler.prototype.handleNode = function(node) {\n    var parser = this,\n        element = this.element;\n\n    if (!element) {\n      element = this.element = this.createElement(node);\n\n      this.context.addElement(element);\n    } else {\n      parser = this.handleChild(node);\n    }\n\n    return parser;\n  };\n\n  /**\n   * @class Reader.ElementHandler\n   *\n   */\n  function ElementHandler(model, typeName, context) {\n    this.model = model;\n    this.type = model.getType(typeName);\n    this.context = context;\n  }\n\n  ElementHandler.prototype = Object.create(BaseElementHandler.prototype);\n\n  ElementHandler.prototype.addReference = function(reference) {\n    this.context.addReference(reference);\n  };\n\n  ElementHandler.prototype.handleText = function(text) {\n\n    var element = this.element,\n        descriptor = getModdleDescriptor(element),\n        bodyProperty = descriptor.bodyProperty;\n\n    if (!bodyProperty) {\n      throw error('unexpected body text <' + text + '>');\n    }\n\n    BodyHandler.prototype.handleText.call(this, text);\n  };\n\n  ElementHandler.prototype.handleEnd = function() {\n\n    var value = this.body,\n        element = this.element,\n        descriptor = getModdleDescriptor(element),\n        bodyProperty = descriptor.bodyProperty;\n\n    if (bodyProperty && value !== undefined) {\n      value = coerceType(bodyProperty.type, value);\n      element.set(bodyProperty.name, value);\n    }\n  };\n\n  /**\n   * Create an instance of the model from the given node.\n   *\n   * @param  {Element} node the xml node\n   */\n  ElementHandler.prototype.createElement = function(node) {\n    var attributes = node.attributes,\n        Type = this.type,\n        descriptor = getModdleDescriptor(Type),\n        context = this.context,\n        instance = new Type({}),\n        model = this.model,\n        propNameNs;\n\n    forEach$1(attributes, function(value, name) {\n\n      var prop = descriptor.propertiesByName[name],\n          values;\n\n      if (prop && prop.isReference) {\n\n        if (!prop.isMany) {\n          context.addReference({\n            element: instance,\n            property: prop.ns.name,\n            id: value\n          });\n        } else {\n\n          // IDREFS: parse references as whitespace-separated list\n          values = value.split(' ');\n\n          forEach$1(values, function(v) {\n            context.addReference({\n              element: instance,\n              property: prop.ns.name,\n              id: v\n            });\n          });\n        }\n\n      } else {\n        if (prop) {\n          value = coerceType(prop.type, value);\n        } else\n        if (name !== 'xmlns') {\n          propNameNs = parseName(name, descriptor.ns.prefix);\n\n          // check whether attribute is defined in a well-known namespace\n          // if that is the case we emit a warning to indicate potential misuse\n          if (model.getPackage(propNameNs.prefix)) {\n\n            context.addWarning({\n              message: 'unknown attribute <' + name + '>',\n              element: instance,\n              property: name,\n              value: value\n            });\n          }\n        }\n\n        instance.set(name, value);\n      }\n    });\n\n    return instance;\n  };\n\n  ElementHandler.prototype.getPropertyForNode = function(node) {\n\n    var name = node.name;\n    var nameNs = parseName(name);\n\n    var type = this.type,\n        model = this.model,\n        descriptor = getModdleDescriptor(type);\n\n    var propertyName = nameNs.name,\n        property = descriptor.propertiesByName[propertyName],\n        elementTypeName,\n        elementType;\n\n    // search for properties by name first\n\n    if (property && !property.isAttr) {\n\n      if (serializeAsType(property)) {\n        elementTypeName = node.attributes[XSI_TYPE];\n\n        // xsi type is optional, if it does not exists the\n        // default type is assumed\n        if (elementTypeName) {\n\n          // take possible type prefixes from XML\n          // into account, i.e.: xsi:type=\"t{ActualType}\"\n          elementTypeName = normalizeXsiTypeName(elementTypeName, model);\n\n          elementType = model.getType(elementTypeName);\n\n          return assign$1({}, property, {\n            effectiveType: getModdleDescriptor(elementType).name\n          });\n        }\n      }\n\n      // search for properties by name first\n      return property;\n    }\n\n    var pkg = model.getPackage(nameNs.prefix);\n\n    if (pkg) {\n      elementTypeName = aliasToName(nameNs, pkg);\n      elementType = model.getType(elementTypeName);\n\n      // search for collection members later\n      property = find(descriptor.properties, function(p) {\n        return !p.isVirtual && !p.isReference && !p.isAttribute && elementType.hasType(p.type);\n      });\n\n      if (property) {\n        return assign$1({}, property, {\n          effectiveType: getModdleDescriptor(elementType).name\n        });\n      }\n    } else {\n\n      // parse unknown element (maybe extension)\n      property = find(descriptor.properties, function(p) {\n        return !p.isReference && !p.isAttribute && p.type === 'Element';\n      });\n\n      if (property) {\n        return property;\n      }\n    }\n\n    throw error('unrecognized element <' + nameNs.name + '>');\n  };\n\n  ElementHandler.prototype.toString = function() {\n    return 'ElementDescriptor[' + getModdleDescriptor(this.type).name + ']';\n  };\n\n  ElementHandler.prototype.valueHandler = function(propertyDesc, element) {\n    return new ValueHandler(propertyDesc, element);\n  };\n\n  ElementHandler.prototype.referenceHandler = function(propertyDesc) {\n    return new ReferenceHandler(propertyDesc, this.context);\n  };\n\n  ElementHandler.prototype.handler = function(type) {\n    if (type === 'Element') {\n      return new GenericElementHandler(this.model, type, this.context);\n    } else {\n      return new ElementHandler(this.model, type, this.context);\n    }\n  };\n\n  /**\n   * Handle the child element parsing\n   *\n   * @param  {Element} node the xml node\n   */\n  ElementHandler.prototype.handleChild = function(node) {\n    var propertyDesc, type, element, childHandler;\n\n    propertyDesc = this.getPropertyForNode(node);\n    element = this.element;\n\n    type = propertyDesc.effectiveType || propertyDesc.type;\n\n    if (isSimple(type)) {\n      return this.valueHandler(propertyDesc, element);\n    }\n\n    if (propertyDesc.isReference) {\n      childHandler = this.referenceHandler(propertyDesc).handleNode(node);\n    } else {\n      childHandler = this.handler(type).handleNode(node);\n    }\n\n    var newElement = childHandler.element;\n\n    // child handles may decide to skip elements\n    // by not returning anything\n    if (newElement !== undefined) {\n\n      if (propertyDesc.isMany) {\n        element.get(propertyDesc.name).push(newElement);\n      } else {\n        element.set(propertyDesc.name, newElement);\n      }\n\n      if (propertyDesc.isReference) {\n        assign$1(newElement, {\n          element: element\n        });\n\n        this.context.addReference(newElement);\n      } else {\n\n        // establish child -> parent relationship\n        newElement.$parent = element;\n      }\n    }\n\n    return childHandler;\n  };\n\n  /**\n   * An element handler that performs special validation\n   * to ensure the node it gets initialized with matches\n   * the handlers type (namespace wise).\n   *\n   * @param {Moddle} model\n   * @param {String} typeName\n   * @param {Context} context\n   */\n  function RootElementHandler(model, typeName, context) {\n    ElementHandler.call(this, model, typeName, context);\n  }\n\n  RootElementHandler.prototype = Object.create(ElementHandler.prototype);\n\n  RootElementHandler.prototype.createElement = function(node) {\n\n    var name = node.name,\n        nameNs = parseName(name),\n        model = this.model,\n        type = this.type,\n        pkg = model.getPackage(nameNs.prefix),\n        typeName = pkg && aliasToName(nameNs, pkg) || name;\n\n    // verify the correct namespace if we parse\n    // the first element in the handler tree\n    //\n    // this ensures we don't mistakenly import wrong namespace elements\n    if (!type.hasType(typeName)) {\n      throw error('unexpected element <' + node.originalName + '>');\n    }\n\n    return ElementHandler.prototype.createElement.call(this, node);\n  };\n\n\n  function GenericElementHandler(model, typeName, context) {\n    this.model = model;\n    this.context = context;\n  }\n\n  GenericElementHandler.prototype = Object.create(BaseElementHandler.prototype);\n\n  GenericElementHandler.prototype.createElement = function(node) {\n\n    var name = node.name,\n        ns = parseName(name),\n        prefix = ns.prefix,\n        uri = node.ns[prefix + '$uri'],\n        attributes = node.attributes;\n\n    return this.model.createAny(name, uri, attributes);\n  };\n\n  GenericElementHandler.prototype.handleChild = function(node) {\n\n    var handler = new GenericElementHandler(this.model, 'Element', this.context).handleNode(node),\n        element = this.element;\n\n    var newElement = handler.element,\n        children;\n\n    if (newElement !== undefined) {\n      children = element.$children = element.$children || [];\n      children.push(newElement);\n\n      // establish child -> parent relationship\n      newElement.$parent = element;\n    }\n\n    return handler;\n  };\n\n  GenericElementHandler.prototype.handleEnd = function() {\n    if (this.body) {\n      this.element.$body = this.body;\n    }\n  };\n\n  /**\n   * A reader for a meta-model\n   *\n   * @param {Object} options\n   * @param {Model} options.model used to read xml files\n   * @param {Boolean} options.lax whether to make parse errors warnings\n   */\n  function Reader(options) {\n\n    if (options instanceof Moddle) {\n      options = {\n        model: options\n      };\n    }\n\n    assign$1(this, { lax: false }, options);\n  }\n\n  /**\n   * The fromXML result.\n   *\n   * @typedef {Object} ParseResult\n   *\n   * @property {ModdleElement} rootElement\n   * @property {Array<Object>} references\n   * @property {Array<Error>} warnings\n   * @property {Object} elementsById - a mapping containing each ID -> ModdleElement\n   */\n\n  /**\n   * The fromXML result.\n   *\n   * @typedef {Error} ParseError\n   *\n   * @property {Array<Error>} warnings\n   */\n\n  /**\n   * Parse the given XML into a moddle document tree.\n   *\n   * @param {String} xml\n   * @param {ElementHandler|Object} options or rootHandler\n   *\n   * @returns {Promise<ParseResult, ParseError>}\n   */\n  Reader.prototype.fromXML = function(xml, options, done) {\n\n    var rootHandler = options.rootHandler;\n\n    if (options instanceof ElementHandler) {\n\n      // root handler passed via (xml, { rootHandler: ElementHandler }, ...)\n      rootHandler = options;\n      options = {};\n    } else {\n      if (typeof options === 'string') {\n\n        // rootHandler passed via (xml, 'someString', ...)\n        rootHandler = this.handler(options);\n        options = {};\n      } else if (typeof rootHandler === 'string') {\n\n        // rootHandler passed via (xml, { rootHandler: 'someString' }, ...)\n        rootHandler = this.handler(rootHandler);\n      }\n    }\n\n    var model = this.model,\n        lax = this.lax;\n\n    var context = new Context(assign$1({}, options, { rootHandler: rootHandler })),\n        parser = new Parser({ proxy: true }),\n        stack = createStack();\n\n    rootHandler.context = context;\n\n    // push root handler\n    stack.push(rootHandler);\n\n\n    /**\n     * Handle error.\n     *\n     * @param  {Error} err\n     * @param  {Function} getContext\n     * @param  {boolean} lax\n     *\n     * @return {boolean} true if handled\n     */\n    function handleError(err, getContext, lax) {\n\n      var ctx = getContext();\n\n      var line = ctx.line,\n          column = ctx.column,\n          data = ctx.data;\n\n      // we receive the full context data here,\n      // for elements trim down the information\n      // to the tag name, only\n      if (data.charAt(0) === '<' && data.indexOf(' ') !== -1) {\n        data = data.slice(0, data.indexOf(' ')) + '>';\n      }\n\n      var message =\n        'unparsable content ' + (data ? data + ' ' : '') + 'detected\\n\\t' +\n          'line: ' + line + '\\n\\t' +\n          'column: ' + column + '\\n\\t' +\n          'nested error: ' + err.message;\n\n      if (lax) {\n        context.addWarning({\n          message: message,\n          error: err\n        });\n\n        return true;\n      } else {\n        throw error(message);\n      }\n    }\n\n    function handleWarning(err, getContext) {\n\n      // just like handling errors in <lax=true> mode\n      return handleError(err, getContext, true);\n    }\n\n    /**\n     * Resolve collected references on parse end.\n     */\n    function resolveReferences() {\n\n      var elementsById = context.elementsById;\n      var references = context.references;\n\n      var i, r;\n\n      for (i = 0; (r = references[i]); i++) {\n        var element = r.element;\n        var reference = elementsById[r.id];\n        var property = getModdleDescriptor(element).propertiesByName[r.property];\n\n        if (!reference) {\n          context.addWarning({\n            message: 'unresolved reference <' + r.id + '>',\n            element: r.element,\n            property: r.property,\n            value: r.id\n          });\n        }\n\n        if (property.isMany) {\n          var collection = element.get(property.name),\n              idx = collection.indexOf(r);\n\n          // we replace an existing place holder (idx != -1) or\n          // append to the collection instead\n          if (idx === -1) {\n            idx = collection.length;\n          }\n\n          if (!reference) {\n\n            // remove unresolvable reference\n            collection.splice(idx, 1);\n          } else {\n\n            // add or update reference in collection\n            collection[idx] = reference;\n          }\n        } else {\n          element.set(property.name, reference);\n        }\n      }\n    }\n\n    function handleClose() {\n      stack.pop().handleEnd();\n    }\n\n    var PREAMBLE_START_PATTERN = /^<\\?xml /i;\n\n    var ENCODING_PATTERN = / encoding=\"([^\"]+)\"/i;\n\n    var UTF_8_PATTERN = /^utf-8$/i;\n\n    function handleQuestion(question) {\n\n      if (!PREAMBLE_START_PATTERN.test(question)) {\n        return;\n      }\n\n      var match = ENCODING_PATTERN.exec(question);\n      var encoding = match && match[1];\n\n      if (!encoding || UTF_8_PATTERN.test(encoding)) {\n        return;\n      }\n\n      context.addWarning({\n        message:\n          'unsupported document encoding <' + encoding + '>, ' +\n          'falling back to UTF-8'\n      });\n    }\n\n    function handleOpen(node, getContext) {\n      var handler = stack.peek();\n\n      try {\n        stack.push(handler.handleNode(node));\n      } catch (err) {\n\n        if (handleError(err, getContext, lax)) {\n          stack.push(new NoopHandler());\n        }\n      }\n    }\n\n    function handleCData(text, getContext) {\n\n      try {\n        stack.peek().handleText(text);\n      } catch (err) {\n        handleWarning(err, getContext);\n      }\n    }\n\n    function handleText(text, getContext) {\n\n      // strip whitespace only nodes, i.e. before\n      // <!CDATA[ ... ]> sections and in between tags\n\n      if (!text.trim()) {\n        return;\n      }\n\n      handleCData(text, getContext);\n    }\n\n    var uriMap = model.getPackages().reduce(function(uriMap, p) {\n      uriMap[p.uri] = p.prefix;\n\n      return uriMap;\n    }, {\n      'http://www.w3.org/XML/1998/namespace': 'xml' // add default xml ns\n    });\n    parser\n      .ns(uriMap)\n      .on('openTag', function(obj, decodeStr, selfClosing, getContext) {\n\n        // gracefully handle unparsable attributes (attrs=false)\n        var attrs = obj.attrs || {};\n\n        var decodedAttrs = Object.keys(attrs).reduce(function(d, key) {\n          var value = decodeStr(attrs[key]);\n\n          d[key] = value;\n\n          return d;\n        }, {});\n\n        var node = {\n          name: obj.name,\n          originalName: obj.originalName,\n          attributes: decodedAttrs,\n          ns: obj.ns\n        };\n\n        handleOpen(node, getContext);\n      })\n      .on('question', handleQuestion)\n      .on('closeTag', handleClose)\n      .on('cdata', handleCData)\n      .on('text', function(text, decodeEntities, getContext) {\n        handleText(decodeEntities(text), getContext);\n      })\n      .on('error', handleError)\n      .on('warn', handleWarning);\n\n    // async XML parsing to make sure the execution environment\n    // (node or brower) is kept responsive and that certain optimization\n    // strategies can kick in.\n    return new Promise(function(resolve, reject) {\n\n      var err;\n\n      try {\n        parser.parse(xml);\n\n        resolveReferences();\n      } catch (e) {\n        err = e;\n      }\n\n      var rootElement = rootHandler.element;\n\n      if (!err && !rootElement) {\n        err = error('failed to parse document as <' + rootHandler.type.$descriptor.name + '>');\n      }\n\n      var warnings = context.warnings;\n      var references = context.references;\n      var elementsById = context.elementsById;\n\n      if (err) {\n        err.warnings = warnings;\n\n        return reject(err);\n      } else {\n        return resolve({\n          rootElement: rootElement,\n          elementsById: elementsById,\n          references: references,\n          warnings: warnings\n        });\n      }\n    });\n  };\n\n  Reader.prototype.handler = function(name) {\n    return new RootElementHandler(this.model, name);\n  };\n\n\n  // helpers //////////////////////////\n\n  function createStack() {\n    var stack = [];\n\n    Object.defineProperty(stack, 'peek', {\n      value: function() {\n        return this[this.length - 1];\n      }\n    });\n\n    return stack;\n  }\n\n  var XML_PREAMBLE = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n';\n\n  var ESCAPE_ATTR_CHARS = /<|>|'|\"|&|\\n\\r|\\n/g;\n  var ESCAPE_CHARS = /<|>|&/g;\n\n\n  function Namespaces(parent) {\n\n    var prefixMap = {};\n    var uriMap = {};\n    var used = {};\n\n    var wellknown = [];\n    var custom = [];\n\n    // API\n\n    this.byUri = function(uri) {\n      return uriMap[uri] || (\n        parent && parent.byUri(uri)\n      );\n    };\n\n    this.add = function(ns, isWellknown) {\n\n      uriMap[ns.uri] = ns;\n\n      if (isWellknown) {\n        wellknown.push(ns);\n      } else {\n        custom.push(ns);\n      }\n\n      this.mapPrefix(ns.prefix, ns.uri);\n    };\n\n    this.uriByPrefix = function(prefix) {\n      return prefixMap[prefix || 'xmlns'];\n    };\n\n    this.mapPrefix = function(prefix, uri) {\n      prefixMap[prefix || 'xmlns'] = uri;\n    };\n\n    this.getNSKey = function(ns) {\n      return (ns.prefix !== undefined) ? (ns.uri + '|' + ns.prefix) : ns.uri;\n    };\n\n    this.logUsed = function(ns) {\n\n      var uri = ns.uri;\n      var nsKey = this.getNSKey(ns);\n\n      used[nsKey] = this.byUri(uri);\n\n      // Inform parent recursively about the usage of this NS\n      if (parent) {\n        parent.logUsed(ns);\n      }\n    };\n\n    this.getUsed = function(ns) {\n\n      function isUsed(ns) {\n        var nsKey = self.getNSKey(ns);\n\n        return used[nsKey];\n      }\n\n      var self = this;\n\n      var allNs = [].concat(wellknown, custom);\n\n      return allNs.filter(isUsed);\n    };\n\n  }\n\n  function lower(string) {\n    return string.charAt(0).toLowerCase() + string.slice(1);\n  }\n\n  function nameToAlias(name, pkg) {\n    if (hasLowerCaseAlias(pkg)) {\n      return lower(name);\n    } else {\n      return name;\n    }\n  }\n\n  function inherits(ctor, superCtor) {\n    ctor.super_ = superCtor;\n    ctor.prototype = Object.create(superCtor.prototype, {\n      constructor: {\n        value: ctor,\n        enumerable: false,\n        writable: true,\n        configurable: true\n      }\n    });\n  }\n\n  function nsName(ns) {\n    if (isString(ns)) {\n      return ns;\n    } else {\n      return (ns.prefix ? ns.prefix + ':' : '') + ns.localName;\n    }\n  }\n\n  function getNsAttrs(namespaces) {\n\n    return namespaces.getUsed().filter(function(ns) {\n\n      // do not serialize built in <xml> namespace\n      return ns.prefix !== 'xml';\n    }).map(function(ns) {\n      var name = 'xmlns' + (ns.prefix ? ':' + ns.prefix : '');\n      return { name: name, value: ns.uri };\n    });\n\n  }\n\n  function getElementNs(ns, descriptor) {\n    if (descriptor.isGeneric) {\n      return assign$1({ localName: descriptor.ns.localName }, ns);\n    } else {\n      return assign$1({ localName: nameToAlias(descriptor.ns.localName, descriptor.$pkg) }, ns);\n    }\n  }\n\n  function getPropertyNs(ns, descriptor) {\n    return assign$1({ localName: descriptor.ns.localName }, ns);\n  }\n\n  function getSerializableProperties(element) {\n    var descriptor = element.$descriptor;\n\n    return filter(descriptor.properties, function(p) {\n      var name = p.name;\n\n      if (p.isVirtual) {\n        return false;\n      }\n\n      // do not serialize defaults\n      if (!has$1(element, name)) {\n        return false;\n      }\n\n      var value = element[name];\n\n      // do not serialize default equals\n      if (value === p.default) {\n        return false;\n      }\n\n      // do not serialize null properties\n      if (value === null) {\n        return false;\n      }\n\n      return p.isMany ? value.length : true;\n    });\n  }\n\n  var ESCAPE_ATTR_MAP = {\n    '\\n': '#10',\n    '\\n\\r': '#10',\n    '\"': '#34',\n    '\\'': '#39',\n    '<': '#60',\n    '>': '#62',\n    '&': '#38'\n  };\n\n  var ESCAPE_MAP = {\n    '<': 'lt',\n    '>': 'gt',\n    '&': 'amp'\n  };\n\n  function escape(str, charPattern, replaceMap) {\n\n    // ensure we are handling strings here\n    str = isString(str) ? str : '' + str;\n\n    return str.replace(charPattern, function(s) {\n      return '&' + replaceMap[s] + ';';\n    });\n  }\n\n  /**\n   * Escape a string attribute to not contain any bad values (line breaks, '\"', ...)\n   *\n   * @param {String} str the string to escape\n   * @return {String} the escaped string\n   */\n  function escapeAttr(str) {\n    return escape(str, ESCAPE_ATTR_CHARS, ESCAPE_ATTR_MAP);\n  }\n\n  function escapeBody(str) {\n    return escape(str, ESCAPE_CHARS, ESCAPE_MAP);\n  }\n\n  function filterAttributes(props) {\n    return filter(props, function(p) { return p.isAttr; });\n  }\n\n  function filterContained(props) {\n    return filter(props, function(p) { return !p.isAttr; });\n  }\n\n\n  function ReferenceSerializer(tagName) {\n    this.tagName = tagName;\n  }\n\n  ReferenceSerializer.prototype.build = function(element) {\n    this.element = element;\n    return this;\n  };\n\n  ReferenceSerializer.prototype.serializeTo = function(writer) {\n    writer\n      .appendIndent()\n      .append('<' + this.tagName + '>' + this.element.id + '</' + this.tagName + '>')\n      .appendNewLine();\n  };\n\n  function BodySerializer() {}\n\n  BodySerializer.prototype.serializeValue =\n  BodySerializer.prototype.serializeTo = function(writer) {\n    writer.append(\n      this.escape\n        ? escapeBody(this.value)\n        : this.value\n    );\n  };\n\n  BodySerializer.prototype.build = function(prop, value) {\n    this.value = value;\n\n    if (prop.type === 'String' && value.search(ESCAPE_CHARS) !== -1) {\n      this.escape = true;\n    }\n\n    return this;\n  };\n\n  function ValueSerializer(tagName) {\n    this.tagName = tagName;\n  }\n\n  inherits(ValueSerializer, BodySerializer);\n\n  ValueSerializer.prototype.serializeTo = function(writer) {\n\n    writer\n      .appendIndent()\n      .append('<' + this.tagName + '>');\n\n    this.serializeValue(writer);\n\n    writer\n      .append('</' + this.tagName + '>')\n      .appendNewLine();\n  };\n\n  function ElementSerializer(parent, propertyDescriptor) {\n    this.body = [];\n    this.attrs = [];\n\n    this.parent = parent;\n    this.propertyDescriptor = propertyDescriptor;\n  }\n\n  ElementSerializer.prototype.build = function(element) {\n    this.element = element;\n\n    var elementDescriptor = element.$descriptor,\n        propertyDescriptor = this.propertyDescriptor;\n\n    var otherAttrs,\n        properties;\n\n    var isGeneric = elementDescriptor.isGeneric;\n\n    if (isGeneric) {\n      otherAttrs = this.parseGeneric(element);\n    } else {\n      otherAttrs = this.parseNsAttributes(element);\n    }\n\n    if (propertyDescriptor) {\n      this.ns = this.nsPropertyTagName(propertyDescriptor);\n    } else {\n      this.ns = this.nsTagName(elementDescriptor);\n    }\n\n    // compute tag name\n    this.tagName = this.addTagName(this.ns);\n\n    if (!isGeneric) {\n      properties = getSerializableProperties(element);\n\n      this.parseAttributes(filterAttributes(properties));\n      this.parseContainments(filterContained(properties));\n    }\n\n    this.parseGenericAttributes(element, otherAttrs);\n\n    return this;\n  };\n\n  ElementSerializer.prototype.nsTagName = function(descriptor) {\n    var effectiveNs = this.logNamespaceUsed(descriptor.ns);\n    return getElementNs(effectiveNs, descriptor);\n  };\n\n  ElementSerializer.prototype.nsPropertyTagName = function(descriptor) {\n    var effectiveNs = this.logNamespaceUsed(descriptor.ns);\n    return getPropertyNs(effectiveNs, descriptor);\n  };\n\n  ElementSerializer.prototype.isLocalNs = function(ns) {\n    return ns.uri === this.ns.uri;\n  };\n\n  /**\n   * Get the actual ns attribute name for the given element.\n   *\n   * @param {Object} element\n   * @param {Boolean} [element.inherited=false]\n   *\n   * @return {Object} nsName\n   */\n  ElementSerializer.prototype.nsAttributeName = function(element) {\n\n    var ns;\n\n    if (isString(element)) {\n      ns = parseName(element);\n    } else {\n      ns = element.ns;\n    }\n\n    // return just local name for inherited attributes\n    if (element.inherited) {\n      return { localName: ns.localName };\n    }\n\n    // parse + log effective ns\n    var effectiveNs = this.logNamespaceUsed(ns);\n\n    // LOG ACTUAL namespace use\n    this.getNamespaces().logUsed(effectiveNs);\n\n    // strip prefix if same namespace like parent\n    if (this.isLocalNs(effectiveNs)) {\n      return { localName: ns.localName };\n    } else {\n      return assign$1({ localName: ns.localName }, effectiveNs);\n    }\n  };\n\n  ElementSerializer.prototype.parseGeneric = function(element) {\n\n    var self = this,\n        body = this.body;\n\n    var attributes = [];\n\n    forEach$1(element, function(val, key) {\n\n      var nonNsAttr;\n\n      if (key === '$body') {\n        body.push(new BodySerializer().build({ type: 'String' }, val));\n      } else\n      if (key === '$children') {\n        forEach$1(val, function(child) {\n          body.push(new ElementSerializer(self).build(child));\n        });\n      } else\n      if (key.indexOf('$') !== 0) {\n        nonNsAttr = self.parseNsAttribute(element, key, val);\n\n        if (nonNsAttr) {\n          attributes.push({ name: key, value: val });\n        }\n      }\n    });\n\n    return attributes;\n  };\n\n  ElementSerializer.prototype.parseNsAttribute = function(element, name, value) {\n    var model = element.$model;\n\n    var nameNs = parseName(name);\n\n    var ns;\n\n    // parse xmlns:foo=\"http://foo.bar\"\n    if (nameNs.prefix === 'xmlns') {\n      ns = { prefix: nameNs.localName, uri: value };\n    }\n\n    // parse xmlns=\"http://foo.bar\"\n    if (!nameNs.prefix && nameNs.localName === 'xmlns') {\n      ns = { uri: value };\n    }\n\n    if (!ns) {\n      return {\n        name: name,\n        value: value\n      };\n    }\n\n    if (model && model.getPackage(value)) {\n\n      // register well known namespace\n      this.logNamespace(ns, true, true);\n    } else {\n\n      // log custom namespace directly as used\n      var actualNs = this.logNamespaceUsed(ns, true);\n\n      this.getNamespaces().logUsed(actualNs);\n    }\n  };\n\n\n  /**\n   * Parse namespaces and return a list of left over generic attributes\n   *\n   * @param  {Object} element\n   * @return {Array<Object>}\n   */\n  ElementSerializer.prototype.parseNsAttributes = function(element, attrs) {\n    var self = this;\n\n    var genericAttrs = element.$attrs;\n\n    var attributes = [];\n\n    // parse namespace attributes first\n    // and log them. push non namespace attributes to a list\n    // and process them later\n    forEach$1(genericAttrs, function(value, name) {\n\n      var nonNsAttr = self.parseNsAttribute(element, name, value);\n\n      if (nonNsAttr) {\n        attributes.push(nonNsAttr);\n      }\n    });\n\n    return attributes;\n  };\n\n  ElementSerializer.prototype.parseGenericAttributes = function(element, attributes) {\n\n    var self = this;\n\n    forEach$1(attributes, function(attr) {\n\n      // do not serialize xsi:type attribute\n      // it is set manually based on the actual implementation type\n      if (attr.name === XSI_TYPE) {\n        return;\n      }\n\n      try {\n        self.addAttribute(self.nsAttributeName(attr.name), attr.value);\n      } catch (e) {\n        /* global console */\n\n        console.warn(\n          'missing namespace information for ',\n          attr.name, '=', attr.value, 'on', element,\n          e);\n      }\n    });\n  };\n\n  ElementSerializer.prototype.parseContainments = function(properties) {\n\n    var self = this,\n        body = this.body,\n        element = this.element;\n\n    forEach$1(properties, function(p) {\n      var value = element.get(p.name),\n          isReference = p.isReference,\n          isMany = p.isMany;\n\n      if (!isMany) {\n        value = [ value ];\n      }\n\n      if (p.isBody) {\n        body.push(new BodySerializer().build(p, value[0]));\n      } else\n      if (isSimple(p.type)) {\n        forEach$1(value, function(v) {\n          body.push(new ValueSerializer(self.addTagName(self.nsPropertyTagName(p))).build(p, v));\n        });\n      } else\n      if (isReference) {\n        forEach$1(value, function(v) {\n          body.push(new ReferenceSerializer(self.addTagName(self.nsPropertyTagName(p))).build(v));\n        });\n      } else {\n\n        // allow serialization via type\n        // rather than element name\n        var asType = serializeAsType(p),\n            asProperty = serializeAsProperty(p);\n\n        forEach$1(value, function(v) {\n          var serializer;\n\n          if (asType) {\n            serializer = new TypeSerializer(self, p);\n          } else\n          if (asProperty) {\n            serializer = new ElementSerializer(self, p);\n          } else {\n            serializer = new ElementSerializer(self);\n          }\n\n          body.push(serializer.build(v));\n        });\n      }\n    });\n  };\n\n  ElementSerializer.prototype.getNamespaces = function(local) {\n\n    var namespaces = this.namespaces,\n        parent = this.parent,\n        parentNamespaces;\n\n    if (!namespaces) {\n      parentNamespaces = parent && parent.getNamespaces();\n\n      if (local || !parentNamespaces) {\n        this.namespaces = namespaces = new Namespaces(parentNamespaces);\n      } else {\n        namespaces = parentNamespaces;\n      }\n    }\n\n    return namespaces;\n  };\n\n  ElementSerializer.prototype.logNamespace = function(ns, wellknown, local) {\n    var namespaces = this.getNamespaces(local);\n\n    var nsUri = ns.uri,\n        nsPrefix = ns.prefix;\n\n    var existing = namespaces.byUri(nsUri);\n\n    if (!existing || local) {\n      namespaces.add(ns, wellknown);\n    }\n\n    namespaces.mapPrefix(nsPrefix, nsUri);\n\n    return ns;\n  };\n\n  ElementSerializer.prototype.logNamespaceUsed = function(ns, local) {\n    var element = this.element,\n        model = element.$model,\n        namespaces = this.getNamespaces(local);\n\n    // ns may be\n    //\n    //   * prefix only\n    //   * prefix:uri\n    //   * localName only\n\n    var prefix = ns.prefix,\n        uri = ns.uri,\n        newPrefix, idx,\n        wellknownUri;\n\n    // handle anonymous namespaces (elementForm=unqualified), cf. #23\n    if (!prefix && !uri) {\n      return { localName: ns.localName };\n    }\n\n    wellknownUri = DEFAULT_NS_MAP[prefix] || model && (model.getPackage(prefix) || {}).uri;\n\n    uri = uri || wellknownUri || namespaces.uriByPrefix(prefix);\n\n    if (!uri) {\n      throw new Error('no namespace uri given for prefix <' + prefix + '>');\n    }\n\n    ns = namespaces.byUri(uri);\n\n    if (!ns) {\n      newPrefix = prefix;\n      idx = 1;\n\n      // find a prefix that is not mapped yet\n      while (namespaces.uriByPrefix(newPrefix)) {\n        newPrefix = prefix + '_' + idx++;\n      }\n\n      ns = this.logNamespace({ prefix: newPrefix, uri: uri }, wellknownUri === uri);\n    }\n\n    if (prefix) {\n      namespaces.mapPrefix(prefix, uri);\n    }\n\n    return ns;\n  };\n\n  ElementSerializer.prototype.parseAttributes = function(properties) {\n    var self = this,\n        element = this.element;\n\n    forEach$1(properties, function(p) {\n\n      var value = element.get(p.name);\n\n      if (p.isReference) {\n\n        if (!p.isMany) {\n          value = value.id;\n        }\n        else {\n          var values = [];\n          forEach$1(value, function(v) {\n            values.push(v.id);\n          });\n\n          // IDREFS is a whitespace-separated list of references.\n          value = values.join(' ');\n        }\n\n      }\n\n      self.addAttribute(self.nsAttributeName(p), value);\n    });\n  };\n\n  ElementSerializer.prototype.addTagName = function(nsTagName) {\n    var actualNs = this.logNamespaceUsed(nsTagName);\n\n    this.getNamespaces().logUsed(actualNs);\n\n    return nsName(nsTagName);\n  };\n\n  ElementSerializer.prototype.addAttribute = function(name, value) {\n    var attrs = this.attrs;\n\n    if (isString(value)) {\n      value = escapeAttr(value);\n    }\n\n    // de-duplicate attributes\n    // https://github.com/bpmn-io/moddle-xml/issues/66\n    var idx = findIndex(attrs, function(element) {\n      return (\n        element.name.localName === name.localName &&\n        element.name.uri === name.uri &&\n        element.name.prefix === name.prefix\n      );\n    });\n\n    var attr = { name: name, value: value };\n\n    if (idx !== -1) {\n      attrs.splice(idx, 1, attr);\n    } else {\n      attrs.push(attr);\n    }\n  };\n\n  ElementSerializer.prototype.serializeAttributes = function(writer) {\n    var attrs = this.attrs,\n        namespaces = this.namespaces;\n\n    if (namespaces) {\n      attrs = getNsAttrs(namespaces).concat(attrs);\n    }\n\n    forEach$1(attrs, function(a) {\n      writer\n        .append(' ')\n        .append(nsName(a.name)).append('=\"').append(a.value).append('\"');\n    });\n  };\n\n  ElementSerializer.prototype.serializeTo = function(writer) {\n    var firstBody = this.body[0],\n        indent = firstBody && firstBody.constructor !== BodySerializer;\n\n    writer\n      .appendIndent()\n      .append('<' + this.tagName);\n\n    this.serializeAttributes(writer);\n\n    writer.append(firstBody ? '>' : ' />');\n\n    if (firstBody) {\n\n      if (indent) {\n        writer\n          .appendNewLine()\n          .indent();\n      }\n\n      forEach$1(this.body, function(b) {\n        b.serializeTo(writer);\n      });\n\n      if (indent) {\n        writer\n          .unindent()\n          .appendIndent();\n      }\n\n      writer.append('</' + this.tagName + '>');\n    }\n\n    writer.appendNewLine();\n  };\n\n  /**\n   * A serializer for types that handles serialization of data types\n   */\n  function TypeSerializer(parent, propertyDescriptor) {\n    ElementSerializer.call(this, parent, propertyDescriptor);\n  }\n\n  inherits(TypeSerializer, ElementSerializer);\n\n  TypeSerializer.prototype.parseNsAttributes = function(element) {\n\n    // extracted attributes\n    var attributes = ElementSerializer.prototype.parseNsAttributes.call(this, element);\n\n    var descriptor = element.$descriptor;\n\n    // only serialize xsi:type if necessary\n    if (descriptor.name === this.propertyDescriptor.type) {\n      return attributes;\n    }\n\n    var typeNs = this.typeNs = this.nsTagName(descriptor);\n    this.getNamespaces().logUsed(this.typeNs);\n\n    // add xsi:type attribute to represent the elements\n    // actual type\n\n    var pkg = element.$model.getPackage(typeNs.uri),\n        typePrefix = (pkg.xml && pkg.xml.typePrefix) || '';\n\n    this.addAttribute(\n      this.nsAttributeName(XSI_TYPE),\n      (typeNs.prefix ? typeNs.prefix + ':' : '') + typePrefix + descriptor.ns.localName\n    );\n\n    return attributes;\n  };\n\n  TypeSerializer.prototype.isLocalNs = function(ns) {\n    return ns.uri === (this.typeNs || this.ns).uri;\n  };\n\n  function SavingWriter() {\n    this.value = '';\n\n    this.write = function(str) {\n      this.value += str;\n    };\n  }\n\n  function FormatingWriter(out, format) {\n\n    var indent = [ '' ];\n\n    this.append = function(str) {\n      out.write(str);\n\n      return this;\n    };\n\n    this.appendNewLine = function() {\n      if (format) {\n        out.write('\\n');\n      }\n\n      return this;\n    };\n\n    this.appendIndent = function() {\n      if (format) {\n        out.write(indent.join('  '));\n      }\n\n      return this;\n    };\n\n    this.indent = function() {\n      indent.push('');\n      return this;\n    };\n\n    this.unindent = function() {\n      indent.pop();\n      return this;\n    };\n  }\n\n  /**\n   * A writer for meta-model backed document trees\n   *\n   * @param {Object} options output options to pass into the writer\n   */\n  function Writer(options) {\n\n    options = assign$1({ format: false, preamble: true }, options || {});\n\n    function toXML(tree, writer) {\n      var internalWriter = writer || new SavingWriter();\n      var formatingWriter = new FormatingWriter(internalWriter, options.format);\n\n      if (options.preamble) {\n        formatingWriter.append(XML_PREAMBLE);\n      }\n\n      new ElementSerializer().build(tree).serializeTo(formatingWriter);\n\n      if (!writer) {\n        return internalWriter.value;\n      }\n    }\n\n    return {\n      toXML: toXML\n    };\n  }\n\n  /**\n   * A sub class of {@link Moddle} with support for import and export of BPMN 2.0 xml files.\n   *\n   * @class BpmnModdle\n   * @extends Moddle\n   *\n   * @param {Object|Array} packages to use for instantiating the model\n   * @param {Object} [options] additional options to pass over\n   */\n  function BpmnModdle(packages, options) {\n    Moddle.call(this, packages, options);\n  }\n\n  BpmnModdle.prototype = Object.create(Moddle.prototype);\n\n  /**\n   * The fromXML result.\n   *\n   * @typedef {Object} ParseResult\n   *\n   * @property {ModdleElement} rootElement\n   * @property {Array<Object>} references\n   * @property {Array<Error>} warnings\n   * @property {Object} elementsById - a mapping containing each ID -> ModdleElement\n   */\n\n  /**\n   * The fromXML error.\n   *\n   * @typedef {Error} ParseError\n   *\n   * @property {Array<Error>} warnings\n   */\n\n  /**\n   * Instantiates a BPMN model tree from a given xml string.\n   *\n   * @param {String}   xmlStr\n   * @param {String}   [typeName='bpmn:Definitions'] name of the root element\n   * @param {Object}   [options]  options to pass to the underlying reader\n   *\n   * @returns {Promise<ParseResult, ParseError>}\n   */\n  BpmnModdle.prototype.fromXML = function(xmlStr, typeName, options) {\n\n    if (!isString(typeName)) {\n      options = typeName;\n      typeName = 'bpmn:Definitions';\n    }\n\n    var reader = new Reader(assign$1({ model: this, lax: true }, options));\n    var rootHandler = reader.handler(typeName);\n\n    return reader.fromXML(xmlStr, rootHandler);\n  };\n\n\n  /**\n   * The toXML result.\n   *\n   * @typedef {Object} SerializationResult\n   *\n   * @property {String} xml\n   */\n\n  /**\n   * Serializes a BPMN 2.0 object tree to XML.\n   *\n   * @param {String}   element    the root element, typically an instance of `bpmn:Definitions`\n   * @param {Object}   [options]  to pass to the underlying writer\n   *\n   * @returns {Promise<SerializationResult, Error>}\n   */\n  BpmnModdle.prototype.toXML = function(element, options) {\n\n    var writer = new Writer(options);\n\n    return new Promise(function(resolve, reject) {\n      try {\n        var result = writer.toXML(element);\n\n        return resolve({\n          xml: result\n        });\n      } catch (err) {\n        return reject(err);\n      }\n    });\n  };\n\n  var name$5 = \"BPMN20\";\n  var uri$5 = \"http://www.omg.org/spec/BPMN/20100524/MODEL\";\n  var prefix$5 = \"bpmn\";\n  var associations$5 = [\n  ];\n  var types$5 = [\n  \t{\n  \t\tname: \"Interface\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"operations\",\n  \t\t\t\ttype: \"Operation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"implementationRef\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Operation\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inMessageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outMessageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"errorRef\",\n  \t\t\t\ttype: \"Error\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"implementationRef\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"EndPoint\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Auditing\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalTask\",\n  \t\tsuperClass: [\n  \t\t\t\"CallableElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"resources\",\n  \t\t\t\ttype: \"ResourceRole\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Monitoring\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Performer\",\n  \t\tsuperClass: [\n  \t\t\t\"ResourceRole\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Process\",\n  \t\tsuperClass: [\n  \t\t\t\"FlowElementsContainer\",\n  \t\t\t\"CallableElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"processType\",\n  \t\t\t\ttype: \"ProcessType\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isClosed\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"auditing\",\n  \t\t\t\ttype: \"Auditing\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"monitoring\",\n  \t\t\t\ttype: \"Monitoring\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"properties\",\n  \t\t\t\ttype: \"Property\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"laneSets\",\n  \t\t\t\tisMany: true,\n  \t\t\t\treplaces: \"FlowElementsContainer#laneSets\",\n  \t\t\t\ttype: \"LaneSet\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"flowElements\",\n  \t\t\t\tisMany: true,\n  \t\t\t\treplaces: \"FlowElementsContainer#flowElements\",\n  \t\t\t\ttype: \"FlowElement\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"artifacts\",\n  \t\t\t\ttype: \"Artifact\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"resources\",\n  \t\t\t\ttype: \"ResourceRole\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"correlationSubscriptions\",\n  \t\t\t\ttype: \"CorrelationSubscription\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"supports\",\n  \t\t\t\ttype: \"Process\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"definitionalCollaborationRef\",\n  \t\t\t\ttype: \"Collaboration\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isExecutable\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"LaneSet\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"lanes\",\n  \t\t\t\ttype: \"Lane\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Lane\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"partitionElementRef\",\n  \t\t\t\ttype: \"BaseElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"partitionElement\",\n  \t\t\t\ttype: \"BaseElement\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"flowNodeRef\",\n  \t\t\t\ttype: \"FlowNode\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"childLaneSet\",\n  \t\t\t\ttype: \"LaneSet\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalManualTask\",\n  \t\tsuperClass: [\n  \t\t\t\"GlobalTask\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ManualTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"UserTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"renderings\",\n  \t\t\t\ttype: \"Rendering\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Rendering\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"HumanPerformer\",\n  \t\tsuperClass: [\n  \t\t\t\"Performer\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"PotentialOwner\",\n  \t\tsuperClass: [\n  \t\t\t\"HumanPerformer\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalUserTask\",\n  \t\tsuperClass: [\n  \t\t\t\"GlobalTask\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"renderings\",\n  \t\t\t\ttype: \"Rendering\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Gateway\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"FlowNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"gatewayDirection\",\n  \t\t\t\ttype: \"GatewayDirection\",\n  \t\t\t\t\"default\": \"Unspecified\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"EventBasedGateway\",\n  \t\tsuperClass: [\n  \t\t\t\"Gateway\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"instantiate\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"eventGatewayType\",\n  \t\t\t\ttype: \"EventBasedGatewayType\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\t\"default\": \"Exclusive\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ComplexGateway\",\n  \t\tsuperClass: [\n  \t\t\t\"Gateway\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"activationCondition\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"default\",\n  \t\t\t\ttype: \"SequenceFlow\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ExclusiveGateway\",\n  \t\tsuperClass: [\n  \t\t\t\"Gateway\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"default\",\n  \t\t\t\ttype: \"SequenceFlow\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"InclusiveGateway\",\n  \t\tsuperClass: [\n  \t\t\t\"Gateway\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"default\",\n  \t\t\t\ttype: \"SequenceFlow\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ParallelGateway\",\n  \t\tsuperClass: [\n  \t\t\t\"Gateway\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"RootElement\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Relationship\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"type\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"direction\",\n  \t\t\t\ttype: \"RelationshipDirection\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"source\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"Element\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"target\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"Element\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BaseElement\",\n  \t\tisAbstract: true,\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"id\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\",\n  \t\t\t\tisId: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"documentation\",\n  \t\t\t\ttype: \"Documentation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extensionDefinitions\",\n  \t\t\t\ttype: \"ExtensionDefinition\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extensionElements\",\n  \t\t\t\ttype: \"ExtensionElements\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Extension\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"mustUnderstand\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"definition\",\n  \t\t\t\ttype: \"ExtensionDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ExtensionDefinition\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extensionAttributeDefinitions\",\n  \t\t\t\ttype: \"ExtensionAttributeDefinition\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ExtensionAttributeDefinition\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"type\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isReference\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extensionDefinition\",\n  \t\t\t\ttype: \"ExtensionDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ExtensionElements\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"valueRef\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"Element\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"values\",\n  \t\t\t\ttype: \"Element\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extensionAttributeDefinition\",\n  \t\t\t\ttype: \"ExtensionAttributeDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Documentation\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"text\",\n  \t\t\t\ttype: \"String\",\n  \t\t\t\tisBody: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"textFormat\",\n  \t\t\t\t\"default\": \"text/plain\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Event\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"FlowNode\",\n  \t\t\t\"InteractionNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"properties\",\n  \t\t\t\ttype: \"Property\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"IntermediateCatchEvent\",\n  \t\tsuperClass: [\n  \t\t\t\"CatchEvent\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"IntermediateThrowEvent\",\n  \t\tsuperClass: [\n  \t\t\t\"ThrowEvent\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"EndEvent\",\n  \t\tsuperClass: [\n  \t\t\t\"ThrowEvent\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"StartEvent\",\n  \t\tsuperClass: [\n  \t\t\t\"CatchEvent\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"isInterrupting\",\n  \t\t\t\t\"default\": true,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ThrowEvent\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Event\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"dataInputs\",\n  \t\t\t\ttype: \"DataInput\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataInputAssociations\",\n  \t\t\t\ttype: \"DataInputAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputSet\",\n  \t\t\t\ttype: \"InputSet\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"eventDefinitions\",\n  \t\t\t\ttype: \"EventDefinition\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"eventDefinitionRef\",\n  \t\t\t\ttype: \"EventDefinition\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CatchEvent\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Event\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"parallelMultiple\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\",\n  \t\t\t\t\"default\": false\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataOutputs\",\n  \t\t\t\ttype: \"DataOutput\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataOutputAssociations\",\n  \t\t\t\ttype: \"DataOutputAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputSet\",\n  \t\t\t\ttype: \"OutputSet\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"eventDefinitions\",\n  \t\t\t\ttype: \"EventDefinition\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"eventDefinitionRef\",\n  \t\t\t\ttype: \"EventDefinition\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BoundaryEvent\",\n  \t\tsuperClass: [\n  \t\t\t\"CatchEvent\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"cancelActivity\",\n  \t\t\t\t\"default\": true,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"attachedToRef\",\n  \t\t\t\ttype: \"Activity\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"EventDefinition\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CancelEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ErrorEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"errorRef\",\n  \t\t\t\ttype: \"Error\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"TerminateEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"EscalationEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"escalationRef\",\n  \t\t\t\ttype: \"Escalation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Escalation\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"structureRef\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"escalationCode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CompensateEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"waitForCompletion\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\",\n  \t\t\t\t\"default\": true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"activityRef\",\n  \t\t\t\ttype: \"Activity\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"TimerEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"timeDate\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"timeCycle\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"timeDuration\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"LinkEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"target\",\n  \t\t\t\ttype: \"LinkEventDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"source\",\n  \t\t\t\ttype: \"LinkEventDefinition\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"MessageEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"messageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"operationRef\",\n  \t\t\t\ttype: \"Operation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ConditionalEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"condition\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"SignalEventDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"EventDefinition\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"signalRef\",\n  \t\t\t\ttype: \"Signal\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Signal\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"structureRef\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ImplicitThrowEvent\",\n  \t\tsuperClass: [\n  \t\t\t\"ThrowEvent\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataState\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ItemAwareElement\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"itemSubjectRef\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataState\",\n  \t\t\t\ttype: \"DataState\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataAssociation\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"sourceRef\",\n  \t\t\t\ttype: \"ItemAwareElement\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetRef\",\n  \t\t\t\ttype: \"ItemAwareElement\",\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"transformation\",\n  \t\t\t\ttype: \"FormalExpression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"property\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"assignment\",\n  \t\t\t\ttype: \"Assignment\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataInput\",\n  \t\tsuperClass: [\n  \t\t\t\"ItemAwareElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isCollection\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputSetRef\",\n  \t\t\t\ttype: \"InputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputSetWithOptional\",\n  \t\t\t\ttype: \"InputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputSetWithWhileExecuting\",\n  \t\t\t\ttype: \"InputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataOutput\",\n  \t\tsuperClass: [\n  \t\t\t\"ItemAwareElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isCollection\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputSetRef\",\n  \t\t\t\ttype: \"OutputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputSetWithOptional\",\n  \t\t\t\ttype: \"OutputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputSetWithWhileExecuting\",\n  \t\t\t\ttype: \"OutputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"InputSet\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataInputRefs\",\n  \t\t\t\ttype: \"DataInput\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"optionalInputRefs\",\n  \t\t\t\ttype: \"DataInput\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"whileExecutingInputRefs\",\n  \t\t\t\ttype: \"DataInput\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputSetRefs\",\n  \t\t\t\ttype: \"OutputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"OutputSet\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"dataOutputRefs\",\n  \t\t\t\ttype: \"DataOutput\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputSetRefs\",\n  \t\t\t\ttype: \"InputSet\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"optionalOutputRefs\",\n  \t\t\t\ttype: \"DataOutput\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"whileExecutingOutputRefs\",\n  \t\t\t\ttype: \"DataOutput\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Property\",\n  \t\tsuperClass: [\n  \t\t\t\"ItemAwareElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataInputAssociation\",\n  \t\tsuperClass: [\n  \t\t\t\"DataAssociation\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataOutputAssociation\",\n  \t\tsuperClass: [\n  \t\t\t\"DataAssociation\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"InputOutputSpecification\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"dataInputs\",\n  \t\t\t\ttype: \"DataInput\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataOutputs\",\n  \t\t\t\ttype: \"DataOutput\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputSets\",\n  \t\t\t\ttype: \"InputSet\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputSets\",\n  \t\t\t\ttype: \"OutputSet\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataObject\",\n  \t\tsuperClass: [\n  \t\t\t\"FlowElement\",\n  \t\t\t\"ItemAwareElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"isCollection\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"InputOutputBinding\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"inputDataRef\",\n  \t\t\t\ttype: \"InputSet\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputDataRef\",\n  \t\t\t\ttype: \"OutputSet\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"operationRef\",\n  \t\t\t\ttype: \"Operation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Assignment\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"from\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"to\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataStore\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\",\n  \t\t\t\"ItemAwareElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"capacity\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Integer\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isUnlimited\",\n  \t\t\t\t\"default\": true,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataStoreReference\",\n  \t\tsuperClass: [\n  \t\t\t\"ItemAwareElement\",\n  \t\t\t\"FlowElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"dataStoreRef\",\n  \t\t\t\ttype: \"DataStore\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"DataObjectReference\",\n  \t\tsuperClass: [\n  \t\t\t\"ItemAwareElement\",\n  \t\t\t\"FlowElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"dataObjectRef\",\n  \t\t\t\ttype: \"DataObject\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ConversationLink\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"sourceRef\",\n  \t\t\t\ttype: \"InteractionNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetRef\",\n  \t\t\t\ttype: \"InteractionNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ConversationAssociation\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"innerConversationNodeRef\",\n  \t\t\t\ttype: \"ConversationNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outerConversationNodeRef\",\n  \t\t\t\ttype: \"ConversationNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CallConversation\",\n  \t\tsuperClass: [\n  \t\t\t\"ConversationNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"calledCollaborationRef\",\n  \t\t\t\ttype: \"Collaboration\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantAssociations\",\n  \t\t\t\ttype: \"ParticipantAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Conversation\",\n  \t\tsuperClass: [\n  \t\t\t\"ConversationNode\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"SubConversation\",\n  \t\tsuperClass: [\n  \t\t\t\"ConversationNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"conversationNodes\",\n  \t\t\t\ttype: \"ConversationNode\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ConversationNode\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"InteractionNode\",\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageFlowRefs\",\n  \t\t\t\ttype: \"MessageFlow\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"correlationKeys\",\n  \t\t\t\ttype: \"CorrelationKey\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalConversation\",\n  \t\tsuperClass: [\n  \t\t\t\"Collaboration\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"PartnerEntity\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"PartnerRole\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CorrelationProperty\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"correlationPropertyRetrievalExpression\",\n  \t\t\t\ttype: \"CorrelationPropertyRetrievalExpression\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"type\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Error\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"structureRef\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"errorCode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CorrelationKey\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"correlationPropertyRef\",\n  \t\t\t\ttype: \"CorrelationProperty\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Expression\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tisAbstract: false,\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"body\",\n  \t\t\t\tisBody: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"FormalExpression\",\n  \t\tsuperClass: [\n  \t\t\t\"Expression\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"language\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"evaluatesToTypeRef\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Message\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"itemRef\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ItemDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"itemKind\",\n  \t\t\t\ttype: \"ItemKind\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"structureRef\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isCollection\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"import\",\n  \t\t\t\ttype: \"Import\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"FlowElement\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"auditing\",\n  \t\t\t\ttype: \"Auditing\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"monitoring\",\n  \t\t\t\ttype: \"Monitoring\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"categoryValueRef\",\n  \t\t\t\ttype: \"CategoryValue\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"SequenceFlow\",\n  \t\tsuperClass: [\n  \t\t\t\"FlowElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"isImmediate\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"conditionExpression\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"sourceRef\",\n  \t\t\t\ttype: \"FlowNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetRef\",\n  \t\t\t\ttype: \"FlowNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"FlowElementsContainer\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"laneSets\",\n  \t\t\t\ttype: \"LaneSet\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"flowElements\",\n  \t\t\t\ttype: \"FlowElement\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CallableElement\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"ioSpecification\",\n  \t\t\t\ttype: \"InputOutputSpecification\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"property\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"supportedInterfaceRef\",\n  \t\t\t\ttype: \"Interface\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"ioBinding\",\n  \t\t\t\ttype: \"InputOutputBinding\",\n  \t\t\t\tisMany: true,\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"property\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"FlowNode\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"FlowElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"incoming\",\n  \t\t\t\ttype: \"SequenceFlow\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outgoing\",\n  \t\t\t\ttype: \"SequenceFlow\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"lanes\",\n  \t\t\t\ttype: \"Lane\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CorrelationPropertyRetrievalExpression\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"messagePath\",\n  \t\t\t\ttype: \"FormalExpression\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CorrelationPropertyBinding\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"dataPath\",\n  \t\t\t\ttype: \"FormalExpression\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"correlationPropertyRef\",\n  \t\t\t\ttype: \"CorrelationProperty\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Resource\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"resourceParameters\",\n  \t\t\t\ttype: \"ResourceParameter\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ResourceParameter\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isRequired\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"type\",\n  \t\t\t\ttype: \"ItemDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CorrelationSubscription\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"correlationKeyRef\",\n  \t\t\t\ttype: \"CorrelationKey\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"correlationPropertyBinding\",\n  \t\t\t\ttype: \"CorrelationPropertyBinding\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"MessageFlow\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"sourceRef\",\n  \t\t\t\ttype: \"InteractionNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetRef\",\n  \t\t\t\ttype: \"InteractionNode\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"MessageFlowAssociation\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"innerMessageFlowRef\",\n  \t\t\t\ttype: \"MessageFlow\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outerMessageFlowRef\",\n  \t\t\t\ttype: \"MessageFlow\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"InteractionNode\",\n  \t\tisAbstract: true,\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"incomingConversationLinks\",\n  \t\t\t\ttype: \"ConversationLink\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outgoingConversationLinks\",\n  \t\t\t\ttype: \"ConversationLink\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Participant\",\n  \t\tsuperClass: [\n  \t\t\t\"InteractionNode\",\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"interfaceRef\",\n  \t\t\t\ttype: \"Interface\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantMultiplicity\",\n  \t\t\t\ttype: \"ParticipantMultiplicity\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"endPointRefs\",\n  \t\t\t\ttype: \"EndPoint\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"processRef\",\n  \t\t\t\ttype: \"Process\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ParticipantAssociation\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"innerParticipantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outerParticipantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ParticipantMultiplicity\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"minimum\",\n  \t\t\t\t\"default\": 0,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Integer\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"maximum\",\n  \t\t\t\t\"default\": 1,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Integer\"\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Collaboration\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isClosed\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participants\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageFlows\",\n  \t\t\t\ttype: \"MessageFlow\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"artifacts\",\n  \t\t\t\ttype: \"Artifact\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"conversations\",\n  \t\t\t\ttype: \"ConversationNode\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"conversationAssociations\",\n  \t\t\t\ttype: \"ConversationAssociation\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantAssociations\",\n  \t\t\t\ttype: \"ParticipantAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageFlowAssociations\",\n  \t\t\t\ttype: \"MessageFlowAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"correlationKeys\",\n  \t\t\t\ttype: \"CorrelationKey\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"choreographyRef\",\n  \t\t\t\ttype: \"Choreography\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"conversationLinks\",\n  \t\t\t\ttype: \"ConversationLink\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ChoreographyActivity\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"FlowNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"participantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"initiatingParticipantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"correlationKeys\",\n  \t\t\t\ttype: \"CorrelationKey\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopType\",\n  \t\t\t\ttype: \"ChoreographyLoopType\",\n  \t\t\t\t\"default\": \"None\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CallChoreography\",\n  \t\tsuperClass: [\n  \t\t\t\"ChoreographyActivity\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"calledChoreographyRef\",\n  \t\t\t\ttype: \"Choreography\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantAssociations\",\n  \t\t\t\ttype: \"ParticipantAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"SubChoreography\",\n  \t\tsuperClass: [\n  \t\t\t\"ChoreographyActivity\",\n  \t\t\t\"FlowElementsContainer\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"artifacts\",\n  \t\t\t\ttype: \"Artifact\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ChoreographyTask\",\n  \t\tsuperClass: [\n  \t\t\t\"ChoreographyActivity\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"messageFlowRef\",\n  \t\t\t\ttype: \"MessageFlow\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Choreography\",\n  \t\tsuperClass: [\n  \t\t\t\"Collaboration\",\n  \t\t\t\"FlowElementsContainer\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalChoreographyTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Choreography\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"initiatingParticipantRef\",\n  \t\t\t\ttype: \"Participant\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"TextAnnotation\",\n  \t\tsuperClass: [\n  \t\t\t\"Artifact\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"text\",\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"textFormat\",\n  \t\t\t\t\"default\": \"text/plain\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Group\",\n  \t\tsuperClass: [\n  \t\t\t\"Artifact\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"categoryValueRef\",\n  \t\t\t\ttype: \"CategoryValue\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Association\",\n  \t\tsuperClass: [\n  \t\t\t\"Artifact\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"associationDirection\",\n  \t\t\t\ttype: \"AssociationDirection\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"sourceRef\",\n  \t\t\t\ttype: \"BaseElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetRef\",\n  \t\t\t\ttype: \"BaseElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Category\",\n  \t\tsuperClass: [\n  \t\t\t\"RootElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"categoryValue\",\n  \t\t\t\ttype: \"CategoryValue\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Artifact\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CategoryValue\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"categorizedFlowElements\",\n  \t\t\t\ttype: \"FlowElement\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"value\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Activity\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"FlowNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"isForCompensation\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"default\",\n  \t\t\t\ttype: \"SequenceFlow\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"ioSpecification\",\n  \t\t\t\ttype: \"InputOutputSpecification\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"property\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"boundaryEventRefs\",\n  \t\t\t\ttype: \"BoundaryEvent\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"properties\",\n  \t\t\t\ttype: \"Property\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataInputAssociations\",\n  \t\t\t\ttype: \"DataInputAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"dataOutputAssociations\",\n  \t\t\t\ttype: \"DataOutputAssociation\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"startQuantity\",\n  \t\t\t\t\"default\": 1,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Integer\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"resources\",\n  \t\t\t\ttype: \"ResourceRole\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"completionQuantity\",\n  \t\t\t\t\"default\": 1,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Integer\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopCharacteristics\",\n  \t\t\t\ttype: \"LoopCharacteristics\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ServiceTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"operationRef\",\n  \t\t\t\ttype: \"Operation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"SubProcess\",\n  \t\tsuperClass: [\n  \t\t\t\"Activity\",\n  \t\t\t\"FlowElementsContainer\",\n  \t\t\t\"InteractionNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"triggeredByEvent\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"artifacts\",\n  \t\t\t\ttype: \"Artifact\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"LoopCharacteristics\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"MultiInstanceLoopCharacteristics\",\n  \t\tsuperClass: [\n  \t\t\t\"LoopCharacteristics\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"isSequential\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"behavior\",\n  \t\t\t\ttype: \"MultiInstanceBehavior\",\n  \t\t\t\t\"default\": \"All\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopCardinality\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopDataInputRef\",\n  \t\t\t\ttype: \"ItemAwareElement\",\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopDataOutputRef\",\n  \t\t\t\ttype: \"ItemAwareElement\",\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"inputDataItem\",\n  \t\t\t\ttype: \"DataInput\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"property\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"outputDataItem\",\n  \t\t\t\ttype: \"DataOutput\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"property\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"complexBehaviorDefinition\",\n  \t\t\t\ttype: \"ComplexBehaviorDefinition\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"completionCondition\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"oneBehaviorEventRef\",\n  \t\t\t\ttype: \"EventDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"noneBehaviorEventRef\",\n  \t\t\t\ttype: \"EventDefinition\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"StandardLoopCharacteristics\",\n  \t\tsuperClass: [\n  \t\t\t\"LoopCharacteristics\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"testBefore\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopCondition\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"loopMaximum\",\n  \t\t\t\ttype: \"Integer\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"CallActivity\",\n  \t\tsuperClass: [\n  \t\t\t\"Activity\",\n  \t\t\t\"InteractionNode\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"calledElement\",\n  \t\t\t\ttype: \"String\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Task\",\n  \t\tsuperClass: [\n  \t\t\t\"Activity\",\n  \t\t\t\"InteractionNode\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"SendTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"operationRef\",\n  \t\t\t\ttype: \"Operation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ReceiveTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"instantiate\",\n  \t\t\t\t\"default\": false,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"operationRef\",\n  \t\t\t\ttype: \"Operation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageRef\",\n  \t\t\t\ttype: \"Message\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ScriptTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"scriptFormat\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"script\",\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BusinessRuleTask\",\n  \t\tsuperClass: [\n  \t\t\t\"Task\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"AdHocSubProcess\",\n  \t\tsuperClass: [\n  \t\t\t\"SubProcess\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"completionCondition\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"ordering\",\n  \t\t\t\ttype: \"AdHocOrdering\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"cancelRemainingInstances\",\n  \t\t\t\t\"default\": true,\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Transaction\",\n  \t\tsuperClass: [\n  \t\t\t\"SubProcess\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"protocol\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"method\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalScriptTask\",\n  \t\tsuperClass: [\n  \t\t\t\"GlobalTask\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"scriptLanguage\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"script\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GlobalBusinessRuleTask\",\n  \t\tsuperClass: [\n  \t\t\t\"GlobalTask\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"implementation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ComplexBehaviorDefinition\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"condition\",\n  \t\t\t\ttype: \"FormalExpression\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"event\",\n  \t\t\t\ttype: \"ImplicitThrowEvent\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ResourceRole\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"resourceRef\",\n  \t\t\t\ttype: \"Resource\",\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"resourceParameterBindings\",\n  \t\t\t\ttype: \"ResourceParameterBinding\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"resourceAssignmentExpression\",\n  \t\t\t\ttype: \"ResourceAssignmentExpression\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ResourceParameterBinding\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"expression\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"parameterRef\",\n  \t\t\t\ttype: \"ResourceParameter\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ResourceAssignmentExpression\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"expression\",\n  \t\t\t\ttype: \"Expression\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Import\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"importType\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"location\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"namespace\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Definitions\",\n  \t\tsuperClass: [\n  \t\t\t\"BaseElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetNamespace\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"expressionLanguage\",\n  \t\t\t\t\"default\": \"http://www.w3.org/1999/XPath\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"typeLanguage\",\n  \t\t\t\t\"default\": \"http://www.w3.org/2001/XMLSchema\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"imports\",\n  \t\t\t\ttype: \"Import\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extensions\",\n  \t\t\t\ttype: \"Extension\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"rootElements\",\n  \t\t\t\ttype: \"RootElement\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"diagrams\",\n  \t\t\t\tisMany: true,\n  \t\t\t\ttype: \"bpmndi:BPMNDiagram\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"exporter\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"relationships\",\n  \t\t\t\ttype: \"Relationship\",\n  \t\t\t\tisMany: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"exporterVersion\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var enumerations$3 = [\n  \t{\n  \t\tname: \"ProcessType\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"None\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Public\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Private\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"GatewayDirection\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"Unspecified\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Converging\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Diverging\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Mixed\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"EventBasedGatewayType\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"Parallel\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Exclusive\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"RelationshipDirection\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"None\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Forward\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Backward\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Both\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ItemKind\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"Physical\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Information\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ChoreographyLoopType\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"None\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Standard\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"MultiInstanceSequential\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"MultiInstanceParallel\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"AssociationDirection\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"None\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"One\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Both\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"MultiInstanceBehavior\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"None\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"One\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"All\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Complex\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"AdHocOrdering\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"Parallel\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"Sequential\"\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var xml$1 = {\n  \ttagAlias: \"lowerCase\",\n  \ttypePrefix: \"t\"\n  };\n  var BpmnPackage = {\n  \tname: name$5,\n  \turi: uri$5,\n  \tprefix: prefix$5,\n  \tassociations: associations$5,\n  \ttypes: types$5,\n  \tenumerations: enumerations$3,\n  \txml: xml$1\n  };\n\n  var name$4 = \"BPMNDI\";\n  var uri$4 = \"http://www.omg.org/spec/BPMN/20100524/DI\";\n  var prefix$4 = \"bpmndi\";\n  var types$4 = [\n  \t{\n  \t\tname: \"BPMNDiagram\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"plane\",\n  \t\t\t\ttype: \"BPMNPlane\",\n  \t\t\t\tredefines: \"di:Diagram#rootElement\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"labelStyle\",\n  \t\t\t\ttype: \"BPMNLabelStyle\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"di:Diagram\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BPMNPlane\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"bpmnElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"bpmn:BaseElement\",\n  \t\t\t\tredefines: \"di:DiagramElement#modelElement\"\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"di:Plane\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BPMNShape\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"bpmnElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"bpmn:BaseElement\",\n  \t\t\t\tredefines: \"di:DiagramElement#modelElement\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isHorizontal\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isExpanded\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isMarkerVisible\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"label\",\n  \t\t\t\ttype: \"BPMNLabel\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isMessageVisible\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Boolean\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"participantBandKind\",\n  \t\t\t\ttype: \"ParticipantBandKind\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"choreographyActivityShape\",\n  \t\t\t\ttype: \"BPMNShape\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"di:LabeledShape\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BPMNEdge\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"label\",\n  \t\t\t\ttype: \"BPMNLabel\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"bpmnElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"bpmn:BaseElement\",\n  \t\t\t\tredefines: \"di:DiagramElement#modelElement\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"sourceElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"di:DiagramElement\",\n  \t\t\t\tredefines: \"di:Edge#source\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"targetElement\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"di:DiagramElement\",\n  \t\t\t\tredefines: \"di:Edge#target\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"messageVisibleKind\",\n  \t\t\t\ttype: \"MessageVisibleKind\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\t\"default\": \"initiating\"\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"di:LabeledEdge\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BPMNLabel\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"labelStyle\",\n  \t\t\t\ttype: \"BPMNLabelStyle\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\tredefines: \"di:DiagramElement#style\"\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"di:Label\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"BPMNLabelStyle\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"font\",\n  \t\t\t\ttype: \"dc:Font\"\n  \t\t\t}\n  \t\t],\n  \t\tsuperClass: [\n  \t\t\t\"di:Style\"\n  \t\t]\n  \t}\n  ];\n  var enumerations$2 = [\n  \t{\n  \t\tname: \"ParticipantBandKind\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"top_initiating\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"middle_initiating\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"bottom_initiating\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"top_non_initiating\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"middle_non_initiating\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"bottom_non_initiating\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"MessageVisibleKind\",\n  \t\tliteralValues: [\n  \t\t\t{\n  \t\t\t\tname: \"initiating\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"non_initiating\"\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var associations$4 = [\n  ];\n  var BpmnDiPackage = {\n  \tname: name$4,\n  \turi: uri$4,\n  \tprefix: prefix$4,\n  \ttypes: types$4,\n  \tenumerations: enumerations$2,\n  \tassociations: associations$4\n  };\n\n  var name$3 = \"DC\";\n  var uri$3 = \"http://www.omg.org/spec/DD/20100524/DC\";\n  var prefix$3 = \"dc\";\n  var types$3 = [\n  \t{\n  \t\tname: \"Boolean\"\n  \t},\n  \t{\n  \t\tname: \"Integer\"\n  \t},\n  \t{\n  \t\tname: \"Real\"\n  \t},\n  \t{\n  \t\tname: \"String\"\n  \t},\n  \t{\n  \t\tname: \"Font\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\ttype: \"String\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"size\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isBold\",\n  \t\t\t\ttype: \"Boolean\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isItalic\",\n  \t\t\t\ttype: \"Boolean\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isUnderline\",\n  \t\t\t\ttype: \"Boolean\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"isStrikeThrough\",\n  \t\t\t\ttype: \"Boolean\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Point\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"x\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\t\"default\": \"0\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"y\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\t\"default\": \"0\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Bounds\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"x\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\t\"default\": \"0\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"y\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\t\"default\": \"0\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"width\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\tisAttr: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"height\",\n  \t\t\t\ttype: \"Real\",\n  \t\t\t\tisAttr: true\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var associations$3 = [\n  ];\n  var DcPackage = {\n  \tname: name$3,\n  \turi: uri$3,\n  \tprefix: prefix$3,\n  \ttypes: types$3,\n  \tassociations: associations$3\n  };\n\n  var name$2 = \"DI\";\n  var uri$2 = \"http://www.omg.org/spec/DD/20100524/DI\";\n  var prefix$2 = \"di\";\n  var types$2 = [\n  \t{\n  \t\tname: \"DiagramElement\",\n  \t\tisAbstract: true,\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"id\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisId: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"extension\",\n  \t\t\t\ttype: \"Extension\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"owningDiagram\",\n  \t\t\t\ttype: \"Diagram\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"owningElement\",\n  \t\t\t\ttype: \"DiagramElement\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"modelElement\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true,\n  \t\t\t\ttype: \"Element\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"style\",\n  \t\t\t\ttype: \"Style\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"ownedElement\",\n  \t\t\t\ttype: \"DiagramElement\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Node\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"DiagramElement\"\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Edge\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"DiagramElement\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"source\",\n  \t\t\t\ttype: \"DiagramElement\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"target\",\n  \t\t\t\ttype: \"DiagramElement\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true,\n  \t\t\t\tisReference: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"waypoint\",\n  \t\t\t\tisUnique: false,\n  \t\t\t\tisMany: true,\n  \t\t\t\ttype: \"dc:Point\",\n  \t\t\t\txml: {\n  \t\t\t\t\tserialize: \"xsi:type\"\n  \t\t\t\t}\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Diagram\",\n  \t\tisAbstract: true,\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"id\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisId: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"rootElement\",\n  \t\t\t\ttype: \"DiagramElement\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisVirtual: true\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"name\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"documentation\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"resolution\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"Real\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"ownedStyle\",\n  \t\t\t\ttype: \"Style\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Shape\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Node\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"bounds\",\n  \t\t\t\ttype: \"dc:Bounds\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Plane\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Node\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"planeElement\",\n  \t\t\t\ttype: \"DiagramElement\",\n  \t\t\t\tsubsettedProperty: \"DiagramElement-ownedElement\",\n  \t\t\t\tisMany: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"LabeledEdge\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Edge\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"ownedLabel\",\n  \t\t\t\ttype: \"Label\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tsubsettedProperty: \"DiagramElement-ownedElement\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"LabeledShape\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Shape\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"ownedLabel\",\n  \t\t\t\ttype: \"Label\",\n  \t\t\t\tisReadOnly: true,\n  \t\t\t\tsubsettedProperty: \"DiagramElement-ownedElement\",\n  \t\t\t\tisMany: true,\n  \t\t\t\tisVirtual: true\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Label\",\n  \t\tisAbstract: true,\n  \t\tsuperClass: [\n  \t\t\t\"Node\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"bounds\",\n  \t\t\t\ttype: \"dc:Bounds\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Style\",\n  \t\tisAbstract: true,\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"id\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\tisId: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"Extension\",\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"values\",\n  \t\t\t\tisMany: true,\n  \t\t\t\ttype: \"Element\"\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var associations$2 = [\n  ];\n  var xml = {\n  \ttagAlias: \"lowerCase\"\n  };\n  var DiPackage = {\n  \tname: name$2,\n  \turi: uri$2,\n  \tprefix: prefix$2,\n  \ttypes: types$2,\n  \tassociations: associations$2,\n  \txml: xml\n  };\n\n  var name$1 = \"bpmn.io colors for BPMN\";\n  var uri$1 = \"http://bpmn.io/schema/bpmn/biocolor/1.0\";\n  var prefix$1 = \"bioc\";\n  var types$1 = [\n  \t{\n  \t\tname: \"ColoredShape\",\n  \t\t\"extends\": [\n  \t\t\t\"bpmndi:BPMNShape\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"stroke\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"fill\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ColoredEdge\",\n  \t\t\"extends\": [\n  \t\t\t\"bpmndi:BPMNEdge\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"stroke\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"fill\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var enumerations$1 = [\n  ];\n  var associations$1 = [\n  ];\n  var BiocPackage = {\n  \tname: name$1,\n  \turi: uri$1,\n  \tprefix: prefix$1,\n  \ttypes: types$1,\n  \tenumerations: enumerations$1,\n  \tassociations: associations$1\n  };\n\n  var name = \"BPMN in Color\";\n  var uri = \"http://www.omg.org/spec/BPMN/non-normative/color/1.0\";\n  var prefix = \"color\";\n  var types = [\n  \t{\n  \t\tname: \"ColoredLabel\",\n  \t\t\"extends\": [\n  \t\t\t\"bpmndi:BPMNLabel\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"color\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ColoredShape\",\n  \t\t\"extends\": [\n  \t\t\t\"bpmndi:BPMNShape\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"background-color\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t},\n  \t\t\t{\n  \t\t\t\tname: \"border-color\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t},\n  \t{\n  \t\tname: \"ColoredEdge\",\n  \t\t\"extends\": [\n  \t\t\t\"bpmndi:BPMNEdge\"\n  \t\t],\n  \t\tproperties: [\n  \t\t\t{\n  \t\t\t\tname: \"border-color\",\n  \t\t\t\tisAttr: true,\n  \t\t\t\ttype: \"String\"\n  \t\t\t}\n  \t\t]\n  \t}\n  ];\n  var enumerations = [\n  ];\n  var associations = [\n  ];\n  var BpmnInColorPackage = {\n  \tname: name,\n  \turi: uri,\n  \tprefix: prefix,\n  \ttypes: types,\n  \tenumerations: enumerations,\n  \tassociations: associations\n  };\n\n  var packages = {\n    bpmn: BpmnPackage,\n    bpmndi: BpmnDiPackage,\n    dc: DcPackage,\n    di: DiPackage,\n    bioc: BiocPackage,\n    color: BpmnInColorPackage\n  };\n\n  function simple(additionalPackages, options) {\n    var pks = assign$1({}, packages, additionalPackages);\n\n    return new BpmnModdle(pks, options);\n  }\n\n  /**\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   */\n\n  // TODO(nikku): remove with future bpmn-js version\n\n  /**\n   * Wraps APIs to check:\n   *\n   * 1) If a callback is passed -> Warn users about callback deprecation.\n   * 2) If Promise class is implemented in current environment.\n   *\n   * @private\n   *\n   * @param {Function} api\n   *\n   * @return {Function}\n   */\n  function wrapForCompatibility(api) {\n\n    return function() {\n\n      if (!window.Promise) {\n        throw new Error('Promises is not supported in this environment. Please polyfill Promise.');\n      }\n\n      var argLen = arguments.length;\n      if (argLen >= 1 && isFunction(arguments[argLen - 1])) {\n\n        var callback = arguments[argLen - 1];\n\n        console.warn(new Error(\n          'Passing callbacks to ' + api.name + ' is deprecated and will be removed in a future major release. ' +\n          'Please switch to promises: https://bpmn.io/l/moving-to-promises.html'\n        ));\n\n        var argsWithoutCallback = Array.prototype.slice.call(arguments, 0, -1);\n\n        api.apply(this, argsWithoutCallback).then(function(result) {\n\n          var firstKey = Object.keys(result)[0];\n\n          // The APIs we are wrapping all resolve a single item depending on the API.\n          // For instance, importXML resolves { warnings } and saveXML returns { xml }.\n          // That's why we can call the callback with the first item of result.\n          return callback(null, result[firstKey]);\n\n          // Passing a second paramter instead of catch because we don't want to\n          // catch errors thrown by callback().\n        }, function(err) {\n\n          return callback(err, err.warnings);\n        });\n      } else {\n\n        return api.apply(this, arguments);\n      }\n    };\n  }\n\n\n  // TODO(nikku): remove with future bpmn-js version\n\n  var DI_ERROR_MESSAGE = 'Tried to access di from the businessObject. The di is available through the diagram element only. For more information, see https://github.com/bpmn-io/bpmn-js/issues/1472';\n\n  /**\n   * @private\n   *\n   * @param {ModdleElement} businessObject\n   */\n  function ensureCompatDiRef(businessObject) {\n\n    // bpmnElement can have multiple independent DIs\n    if (!has$1(businessObject, 'di')) {\n      Object.defineProperty(businessObject, 'di', {\n        enumerable: false,\n        get: function() {\n          throw new Error(DI_ERROR_MESSAGE);\n        }\n      });\n    }\n  }\n\n  /**\n   * @typedef {import('diagram-js/lib/i18n/translate/translate').default} Translate\n   *\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   */\n\n  /**\n   * Returns true if an element is of the given meta-model type.\n   *\n   * @param {ModdleElement} element\n   * @param {string} type\n   *\n   * @return {boolean}\n   */\n  function is(element, type) {\n    return element.$instanceOf(type);\n  }\n\n\n  /**\n   * Find a suitable display candidate for definitions where the DI does not\n   * correctly specify one.\n   *\n   * @param {ModdleElement} definitions\n   *\n   * @return {ModdleElement}\n   */\n  function findDisplayCandidate(definitions) {\n    return find(definitions.rootElements, function(e) {\n      return is(e, 'bpmn:Process') || is(e, 'bpmn:Collaboration');\n    });\n  }\n\n  /**\n   * @param {Record<'element' | 'root' | 'error', Function>} handler\n   * @param {Translate} translate\n   */\n  function BpmnTreeWalker(handler, translate) {\n\n    // list of containers already walked\n    var handledElements = {};\n\n    // list of elements to handle deferred to ensure\n    // prerequisites are drawn\n    var deferred = [];\n\n    var diMap = {};\n\n    // Helpers //////////////////////\n\n    function contextual(fn, ctx) {\n      return function(e) {\n        fn(e, ctx);\n      };\n    }\n\n    function handled(element) {\n      handledElements[element.id] = element;\n    }\n\n    function isHandled(element) {\n      return handledElements[element.id];\n    }\n\n    function visit(element, ctx) {\n\n      var gfx = element.gfx;\n\n      // avoid multiple rendering of elements\n      if (gfx) {\n        throw new Error(\n          translate('already rendered {element}', { element: elementToString(element) })\n        );\n      }\n\n      // call handler\n      return handler.element(element, diMap[element.id], ctx);\n    }\n\n    function visitRoot(element, diagram) {\n      return handler.root(element, diMap[element.id], diagram);\n    }\n\n    function visitIfDi(element, ctx) {\n\n      try {\n        var gfx = diMap[element.id] && visit(element, ctx);\n\n        handled(element);\n\n        return gfx;\n      } catch (e) {\n        logError(e.message, { element: element, error: e });\n\n        console.error(translate('failed to import {element}', { element: elementToString(element) }));\n        console.error(e);\n      }\n    }\n\n    function logError(message, context) {\n      handler.error(message, context);\n    }\n\n    // DI handling //////////////////////\n\n    var registerDi = this.registerDi = function registerDi(di) {\n      var bpmnElement = di.bpmnElement;\n\n      if (bpmnElement) {\n        if (diMap[bpmnElement.id]) {\n          logError(\n            translate('multiple DI elements defined for {element}', {\n              element: elementToString(bpmnElement)\n            }),\n            { element: bpmnElement }\n          );\n        } else {\n          diMap[bpmnElement.id] = di;\n\n          ensureCompatDiRef(bpmnElement);\n        }\n      } else {\n        logError(\n          translate('no bpmnElement referenced in {element}', {\n            element: elementToString(di)\n          }),\n          { element: di }\n        );\n      }\n    };\n\n    function handleDiagram(diagram) {\n      handlePlane(diagram.plane);\n    }\n\n    function handlePlane(plane) {\n      registerDi(plane);\n\n      forEach$1(plane.planeElement, handlePlaneElement);\n    }\n\n    function handlePlaneElement(planeElement) {\n      registerDi(planeElement);\n    }\n\n\n    // Semantic handling //////////////////////\n\n    /**\n     * Handle definitions and return the rendered diagram (if any).\n     *\n     * @param {ModdleElement} definitions to walk and import\n     * @param {ModdleElement} [diagram] specific diagram to import and display\n     *\n     * @throws {Error} if no diagram to display could be found\n     */\n    this.handleDefinitions = function handleDefinitions(definitions, diagram) {\n\n      // make sure we walk the correct bpmnElement\n\n      var diagrams = definitions.diagrams;\n\n      if (diagram && diagrams.indexOf(diagram) === -1) {\n        throw new Error(translate('diagram not part of bpmn:Definitions'));\n      }\n\n      if (!diagram && diagrams && diagrams.length) {\n        diagram = diagrams[0];\n      }\n\n      // no diagram -> nothing to import\n      if (!diagram) {\n        throw new Error(translate('no diagram to display'));\n      }\n\n      // load DI from selected diagram only\n      diMap = {};\n      handleDiagram(diagram);\n\n\n      var plane = diagram.plane;\n\n      if (!plane) {\n        throw new Error(translate(\n          'no plane for {element}',\n          { element: elementToString(diagram) }\n        ));\n      }\n\n      var rootElement = plane.bpmnElement;\n\n      // ensure we default to a suitable display candidate (process or collaboration),\n      // even if non is specified in DI\n      if (!rootElement) {\n        rootElement = findDisplayCandidate(definitions);\n\n        if (!rootElement) {\n          throw new Error(translate('no process or collaboration to display'));\n        } else {\n\n          logError(\n            translate('correcting missing bpmnElement on {plane} to {rootElement}', {\n              plane: elementToString(plane),\n              rootElement: elementToString(rootElement)\n            })\n          );\n\n          // correct DI on the fly\n          plane.bpmnElement = rootElement;\n          registerDi(plane);\n        }\n      }\n\n\n      var ctx = visitRoot(rootElement, plane);\n\n      if (is(rootElement, 'bpmn:Process') || is(rootElement, 'bpmn:SubProcess')) {\n        handleProcess(rootElement, ctx);\n      } else if (is(rootElement, 'bpmn:Collaboration')) {\n        handleCollaboration(rootElement, ctx);\n\n        // force drawing of everything not yet drawn that is part of the target DI\n        handleUnhandledProcesses(definitions.rootElements, ctx);\n      } else {\n        throw new Error(\n          translate('unsupported bpmnElement for {plane}: {rootElement}', {\n            plane: elementToString(plane),\n            rootElement: elementToString(rootElement)\n          })\n        );\n      }\n\n      // handle all deferred elements\n      handleDeferred(deferred);\n    };\n\n    var handleDeferred = this.handleDeferred = function handleDeferred() {\n\n      var fn;\n\n      // drain deferred until empty\n      while (deferred.length) {\n        fn = deferred.shift();\n\n        fn();\n      }\n    };\n\n    function handleProcess(process, context) {\n      handleFlowElementsContainer(process, context);\n      handleIoSpecification(process.ioSpecification, context);\n\n      handleArtifacts(process.artifacts, context);\n\n      // log process handled\n      handled(process);\n    }\n\n    function handleUnhandledProcesses(rootElements, ctx) {\n\n      // walk through all processes that have not yet been drawn and draw them\n      // if they contain lanes with DI information.\n      // we do this to pass the free-floating lane test cases in the MIWG test suite\n      var processes = filter(rootElements, function(e) {\n        return !isHandled(e) && is(e, 'bpmn:Process') && e.laneSets;\n      });\n\n      processes.forEach(contextual(handleProcess, ctx));\n    }\n\n    function handleMessageFlow(messageFlow, context) {\n      visitIfDi(messageFlow, context);\n    }\n\n    function handleMessageFlows(messageFlows, context) {\n      forEach$1(messageFlows, contextual(handleMessageFlow, context));\n    }\n\n    function handleDataAssociation(association, context) {\n      visitIfDi(association, context);\n    }\n\n    function handleDataInput(dataInput, context) {\n      visitIfDi(dataInput, context);\n    }\n\n    function handleDataOutput(dataOutput, context) {\n      visitIfDi(dataOutput, context);\n    }\n\n    function handleArtifact(artifact, context) {\n\n      // bpmn:TextAnnotation\n      // bpmn:Group\n      // bpmn:Association\n\n      visitIfDi(artifact, context);\n    }\n\n    function handleArtifacts(artifacts, context) {\n\n      forEach$1(artifacts, function(e) {\n        if (is(e, 'bpmn:Association')) {\n          deferred.push(function() {\n            handleArtifact(e, context);\n          });\n        } else {\n          handleArtifact(e, context);\n        }\n      });\n    }\n\n    function handleIoSpecification(ioSpecification, context) {\n\n      if (!ioSpecification) {\n        return;\n      }\n\n      forEach$1(ioSpecification.dataInputs, contextual(handleDataInput, context));\n      forEach$1(ioSpecification.dataOutputs, contextual(handleDataOutput, context));\n    }\n\n    var handleSubProcess = this.handleSubProcess = function handleSubProcess(subProcess, context) {\n      handleFlowElementsContainer(subProcess, context);\n      handleArtifacts(subProcess.artifacts, context);\n    };\n\n    function handleFlowNode(flowNode, context) {\n      var childCtx = visitIfDi(flowNode, context);\n\n      if (is(flowNode, 'bpmn:SubProcess')) {\n        handleSubProcess(flowNode, childCtx || context);\n      }\n\n      if (is(flowNode, 'bpmn:Activity')) {\n        handleIoSpecification(flowNode.ioSpecification, context);\n      }\n\n      // defer handling of associations\n      // affected types:\n      //\n      //   * bpmn:Activity\n      //   * bpmn:ThrowEvent\n      //   * bpmn:CatchEvent\n      //\n      deferred.push(function() {\n        forEach$1(flowNode.dataInputAssociations, contextual(handleDataAssociation, context));\n        forEach$1(flowNode.dataOutputAssociations, contextual(handleDataAssociation, context));\n      });\n    }\n\n    function handleSequenceFlow(sequenceFlow, context) {\n      visitIfDi(sequenceFlow, context);\n    }\n\n    function handleDataElement(dataObject, context) {\n      visitIfDi(dataObject, context);\n    }\n\n    function handleLane(lane, context) {\n\n      deferred.push(function() {\n\n        var newContext = visitIfDi(lane, context);\n\n        if (lane.childLaneSet) {\n          handleLaneSet(lane.childLaneSet, newContext || context);\n        }\n\n        wireFlowNodeRefs(lane);\n      });\n    }\n\n    function handleLaneSet(laneSet, context) {\n      forEach$1(laneSet.lanes, contextual(handleLane, context));\n    }\n\n    function handleLaneSets(laneSets, context) {\n      forEach$1(laneSets, contextual(handleLaneSet, context));\n    }\n\n    function handleFlowElementsContainer(container, context) {\n      handleFlowElements(container.flowElements, context);\n\n      if (container.laneSets) {\n        handleLaneSets(container.laneSets, context);\n      }\n    }\n\n    function handleFlowElements(flowElements, context) {\n      forEach$1(flowElements, function(e) {\n        if (is(e, 'bpmn:SequenceFlow')) {\n          deferred.push(function() {\n            handleSequenceFlow(e, context);\n          });\n        } else if (is(e, 'bpmn:BoundaryEvent')) {\n          deferred.unshift(function() {\n            handleFlowNode(e, context);\n          });\n        } else if (is(e, 'bpmn:FlowNode')) {\n          handleFlowNode(e, context);\n        } else if (is(e, 'bpmn:DataObject')) ; else if (is(e, 'bpmn:DataStoreReference')) {\n          handleDataElement(e, context);\n        } else if (is(e, 'bpmn:DataObjectReference')) {\n          handleDataElement(e, context);\n        } else {\n          logError(\n            translate('unrecognized flowElement {element} in context {context}', {\n              element: elementToString(e),\n              context: (context ? elementToString(context.businessObject) : 'null')\n            }),\n            { element: e, context: context }\n          );\n        }\n      });\n    }\n\n    function handleParticipant(participant, context) {\n      var newCtx = visitIfDi(participant, context);\n\n      var process = participant.processRef;\n      if (process) {\n        handleProcess(process, newCtx || context);\n      }\n    }\n\n    function handleCollaboration(collaboration, context) {\n\n      forEach$1(collaboration.participants, contextual(handleParticipant, context));\n\n      handleArtifacts(collaboration.artifacts, context);\n\n      // handle message flows latest in the process\n      deferred.push(function() {\n        handleMessageFlows(collaboration.messageFlows, context);\n      });\n    }\n\n\n    function wireFlowNodeRefs(lane) {\n\n      // wire the virtual flowNodeRefs <-> relationship\n      forEach$1(lane.flowNodeRef, function(flowNode) {\n        var lanes = flowNode.get('lanes');\n\n        if (lanes) {\n          lanes.push(lane);\n        }\n      });\n    }\n  }\n\n  /**\n   * @typedef {import('../model/Types').ModdleElement} ModdleElement\n   *\n   * @typedef { {\n   *   warnings: string[];\n   * } } ImportBPMNDiagramResult\n   *\n   * @typedef {ImportBPMNDiagramResult & Error} ImportBPMNDiagramError\n   */\n\n  /**\n   * Import the definitions into a diagram.\n   *\n   * Errors and warnings are reported through the specified callback.\n   *\n   * @param {ModdleElement} diagram\n   * @param {ModdleElement} definitions\n   * @param {ModdleElement} [bpmnDiagram] The diagram to be rendered (if not\n   * provided, the first one will be rendered).\n   *\n   * @return {Promise<ImportBPMNDiagramResult>}\n   */\n  function importBpmnDiagram(diagram, definitions, bpmnDiagram) {\n\n    var importer,\n        eventBus,\n        translate,\n        canvas;\n\n    var error,\n        warnings = [];\n\n    /**\n     * Walk the diagram semantically, importing (=drawing)\n     * all elements you encounter.\n     *\n     * @param {ModdleElement} definitions\n     * @param {ModdleElement} bpmnDiagram\n     */\n    function render(definitions, bpmnDiagram) {\n\n      var visitor = {\n\n        root: function(element, di) {\n          return importer.add(element, di);\n        },\n\n        element: function(element, di, parentShape) {\n          return importer.add(element, di, parentShape);\n        },\n\n        error: function(message, context) {\n          warnings.push({ message: message, context: context });\n        }\n      };\n\n      var walker = new BpmnTreeWalker(visitor, translate);\n\n\n      bpmnDiagram = bpmnDiagram || (definitions.diagrams && definitions.diagrams[0]);\n\n      var diagramsToImport = getDiagramsToImport(definitions, bpmnDiagram);\n\n      if (!diagramsToImport) {\n        throw new Error(translate('no diagram to display'));\n      }\n\n      // traverse BPMN 2.0 document model,\n      // starting at definitions\n      forEach$1(diagramsToImport, function(diagram) {\n        walker.handleDefinitions(definitions, diagram);\n      });\n\n      var rootId = bpmnDiagram.plane.bpmnElement.id;\n\n      // we do need to account for different ways we create root elements\n      // each nested imported <root> do have the `_plane` suffix, while\n      // the root <root> is found under the business object ID\n      canvas.setRootElement(\n        canvas.findRoot(rootId + '_plane') || canvas.findRoot(rootId)\n      );\n    }\n\n    return new Promise(function(resolve, reject) {\n      try {\n        importer = diagram.get('bpmnImporter');\n        eventBus = diagram.get('eventBus');\n        translate = diagram.get('translate');\n        canvas = diagram.get('canvas');\n\n        eventBus.fire('import.render.start', { definitions: definitions });\n\n        render(definitions, bpmnDiagram);\n\n        eventBus.fire('import.render.complete', {\n          error: error,\n          warnings: warnings\n        });\n\n        return resolve({ warnings: warnings });\n      } catch (e) {\n\n        e.warnings = warnings;\n        return reject(e);\n      }\n    });\n  }\n\n  /**\n   * Returns all diagrams in the same hierarchy as the requested diagram.\n   * Includes all parent and sub process diagrams.\n   *\n   * @param {ModdleElement} definitions\n   * @param {ModdleElement} bpmnDiagram\n   *\n   * @return {ModdleElement[]}\n   */\n  function getDiagramsToImport(definitions, bpmnDiagram) {\n    if (!bpmnDiagram) {\n      return;\n    }\n\n    var bpmnElement = bpmnDiagram.plane.bpmnElement,\n        rootElement = bpmnElement;\n\n    if (!is$1(bpmnElement, 'bpmn:Process') && !is$1(bpmnElement, 'bpmn:Collaboration')) {\n      rootElement = findRootProcess(bpmnElement);\n    }\n\n    // in case the process is part of a collaboration, the plane references the\n    // collaboration, not the process\n    var collaboration;\n\n    if (is$1(rootElement, 'bpmn:Collaboration')) {\n      collaboration = rootElement;\n    } else {\n      collaboration = find(definitions.rootElements, function(element) {\n        if (!is$1(element, 'bpmn:Collaboration')) {\n          return;\n        }\n\n        return find(element.participants, function(participant) {\n          return participant.processRef === rootElement;\n        });\n      });\n    }\n\n    var rootElements = [ rootElement ];\n\n    // all collaboration processes can contain sub-diagrams\n    if (collaboration) {\n      rootElements = map$1(collaboration.participants, function(participant) {\n        return participant.processRef;\n      });\n\n      rootElements.push(collaboration);\n    }\n\n    var allChildren = selfAndAllFlowElements(rootElements);\n\n    // if we have multiple diagrams referencing the same element, we\n    // use the first in the file\n    var diagramsToImport = [ bpmnDiagram ];\n    var handledElements = [ bpmnElement ];\n\n    forEach$1(definitions.diagrams, function(diagram) {\n      var businessObject = diagram.plane.bpmnElement;\n\n      if (\n        allChildren.indexOf(businessObject) !== -1 &&\n        handledElements.indexOf(businessObject) === -1\n      ) {\n        diagramsToImport.push(diagram);\n        handledElements.push(businessObject);\n      }\n    });\n\n\n    return diagramsToImport;\n  }\n\n  function selfAndAllFlowElements(elements) {\n    var result = [];\n\n    forEach$1(elements, function(element) {\n      if (!element) {\n        return;\n      }\n\n      result.push(element);\n\n      result = result.concat(selfAndAllFlowElements(element.flowElements));\n    });\n\n    return result;\n  }\n\n  function findRootProcess(element) {\n    var parent = element;\n\n    while (parent) {\n      if (is$1(parent, 'bpmn:Process')) {\n        return parent;\n      }\n\n      parent = parent.$parent;\n    }\n  }\n\n  /**\n   * This file must not be changed or exchanged.\n   *\n   * @see http://bpmn.io/license for more information.\n   */\n\n\n  // inlined ../../resources/logo.svg\n  var BPMNIO_LOGO_SVG = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 14.02 5.57\" width=\"53\" height=\"21\"><path fill=\"currentColor\" d=\"M1.88.92v.14c0 .41-.13.68-.4.8.33.14.46.44.46.86v.33c0 .61-.33.95-.95.95H0V0h.95c.65 0 .93.3.93.92zM.63.57v1.06h.24c.24 0 .38-.1.38-.43V.98c0-.28-.1-.4-.32-.4zm0 1.63v1.22h.36c.2 0 .32-.1.32-.39v-.35c0-.37-.12-.48-.4-.48H.63zM4.18.99v.52c0 .64-.31.98-.94.98h-.3V4h-.62V0h.92c.63 0 .94.35.94.99zM2.94.57v1.35h.3c.2 0 .3-.09.3-.37v-.6c0-.29-.1-.38-.3-.38h-.3zm2.89 2.27L6.25 0h.88v4h-.6V1.12L6.1 3.99h-.6l-.46-2.82v2.82h-.55V0h.87zM8.14 1.1V4h-.56V0h.79L9 2.4V0h.56v4h-.64zm2.49 2.29v.6h-.6v-.6zM12.12 1c0-.63.33-1 .95-1 .61 0 .95.37.95 1v2.04c0 .64-.34 1-.95 1-.62 0-.95-.37-.95-1zm.62 2.08c0 .28.13.39.33.39s.32-.1.32-.4V.98c0-.29-.12-.4-.32-.4s-.33.11-.33.4z\"/><path fill=\"currentColor\" d=\"M0 4.53h14.02v1.04H0zM11.08 0h.63v.62h-.63zm.63 4V1h-.63v2.98z\"/></svg>';\n\n  var BPMNIO_IMG = BPMNIO_LOGO_SVG;\n\n  var LOGO_STYLES = {\n    verticalAlign: 'middle'\n  };\n\n  var LINK_STYLES = {\n    'color': '#404040'\n  };\n\n  var LIGHTBOX_STYLES = {\n    'zIndex': '1001',\n    'position': 'fixed',\n    'top': '0',\n    'left': '0',\n    'right': '0',\n    'bottom': '0'\n  };\n\n  var BACKDROP_STYLES = {\n    'width': '100%',\n    'height': '100%',\n    'background': 'rgba(40,40,40,0.2)'\n  };\n\n  var NOTICE_STYLES = {\n    'position': 'absolute',\n    'left': '50%',\n    'top': '40%',\n    'transform': 'translate(-50%)',\n    'width': '260px',\n    'padding': '10px',\n    'background': 'white',\n    'boxShadow': '0 1px 4px rgba(0,0,0,0.3)',\n    'fontFamily': 'Helvetica, Arial, sans-serif',\n    'fontSize': '14px',\n    'display': 'flex',\n    'lineHeight': '1.3'\n  };\n\n  var LIGHTBOX_MARKUP =\n    '<div class=\"bjs-powered-by-lightbox\">' +\n      '<div class=\"backdrop\"></div>' +\n      '<div class=\"notice\">' +\n        '<a href=\"https://bpmn.io\" target=\"_blank\" rel=\"noopener\" class=\"link\">' +\n          BPMNIO_IMG +\n        '</a>' +\n        '<span>' +\n          'Web-based tooling for BPMN, DMN and forms ' +\n          'powered by <a href=\"https://bpmn.io\" target=\"_blank\" rel=\"noopener\">bpmn.io</a>.' +\n        '</span>' +\n      '</div>' +\n    '</div>';\n\n\n  var lightbox;\n\n  function createLightbox() {\n    lightbox = domify$1(LIGHTBOX_MARKUP);\n\n    assign(lightbox, LIGHTBOX_STYLES);\n    assign(query('svg', lightbox), LOGO_STYLES);\n    assign(query('.backdrop', lightbox), BACKDROP_STYLES);\n    assign(query('.notice', lightbox), NOTICE_STYLES);\n    assign(query('.link', lightbox), LINK_STYLES, {\n      'margin': '15px 20px 15px 10px',\n      'alignSelf': 'center'\n    });\n  }\n\n  function open() {\n\n    if (!lightbox) {\n      createLightbox();\n\n      delegate.bind(lightbox, '.backdrop', 'click', function(event) {\n        document.body.removeChild(lightbox);\n      });\n    }\n\n    document.body.appendChild(lightbox);\n  }\n\n  /**\n   * The code in the <project-logo></project-logo> area\n   * must not be changed.\n   *\n   * @see http://bpmn.io/license for more information.\n   */\n\n  /**\n   * @template T\n   *\n   * @typedef {import('diagram-js/lib/core/EventBus').EventBusEventCallback<T>} EventBusEventCallback\n   */\n\n  /**\n   * @typedef {import('didi').ModuleDeclaration} ModuleDeclaration\n   *\n   * @typedef {import('./model/Types').Moddle} Moddle\n   * @typedef {import('./model/Types').ModdleElement} ModdleElement\n   * @typedef {import('./model/Types').ModdleExtension} ModdleExtension\n   *\n   * @typedef { {\n   *   width?: number|string;\n   *   height?: number|string;\n   *   position?: string;\n   *   container?: string|HTMLElement;\n   *   moddleExtensions?: ModdleExtensions;\n   *   additionalModules?: ModuleDeclaration[];\n   * } & Record<string, any> } BaseViewerOptions\n   *\n   * @typedef {Record<string, ModdleElement>} ModdleElementsById\n   *\n   * @typedef { {\n   *   [key: string]: ModdleExtension;\n   * } } ModdleExtensions\n   *\n   * @typedef { {\n   *   warnings: string[];\n   * } } ImportXMLResult\n   *\n   * @typedef {ImportXMLResult & Error} ImportXMLError\n   *\n   * @typedef {ImportXMLResult} ImportDefinitionsResult\n   *\n   * @typedef {ImportXMLError} ImportDefinitionsError\n   *\n   * @typedef {ImportXMLResult} OpenResult\n   *\n   * @typedef {ImportXMLError} OpenError\n   *\n   * @typedef { {\n   *   format?: boolean;\n   *   preamble?: boolean;\n   * } } SaveXMLOptions\n   *\n   * @typedef { {\n   *   xml?: string;\n   *   error?: Error;\n   * } } SaveXMLResult\n   *\n   * @typedef { {\n   *   svg: string;\n   * } } SaveSVGResult\n   *\n   * @typedef { {\n   *   xml: string;\n   * } } ImportParseStartEvent\n   *\n   * @typedef { {\n   *   error?: ImportXMLError;\n   *   definitions?: ModdleElement;\n   *   elementsById?: ModdleElementsById;\n   *   references?: ModdleElement[];\n   *   warnings: string[];\n   * } } ImportParseCompleteEvent\n   *\n   * @typedef { {\n   *   error?: ImportXMLError;\n   *   warnings: string[];\n   * } } ImportDoneEvent\n   *\n   * @typedef { {\n   *   definitions: ModdleElement;\n   * } } SaveXMLStartEvent\n   *\n   * @typedef {SaveXMLResult} SaveXMLDoneEvent\n   *\n   * @typedef { {\n   *   error?: Error;\n   *   svg: string;\n   * } } SaveSVGDoneEvent\n   */\n\n  /**\n   * A base viewer for BPMN 2.0 diagrams.\n   *\n   * Have a look at {@link Viewer}, {@link NavigatedViewer} or {@link Modeler} for\n   * bundles that include actual features.\n   *\n   * @param {BaseViewerOptions} [options] The options to configure the viewer.\n   */\n  function BaseViewer(options) {\n\n    /**\n     * @type {BaseViewerOptions}\n     */\n    options = assign$1({}, DEFAULT_OPTIONS, options);\n\n    /**\n     * @type {Moddle}\n     */\n    this._moddle = this._createModdle(options);\n\n    /**\n     * @type {HTMLElement}\n     */\n    this._container = this._createContainer(options);\n\n    /* <project-logo> */\n\n    addProjectLogo(this._container);\n\n    /* </project-logo> */\n\n    this._init(this._container, this._moddle, options);\n  }\n\n  e(BaseViewer, Diagram);\n\n  /**\n   * Parse and render a BPMN 2.0 diagram.\n   *\n   * Once finished the viewer reports back the result to the\n   * provided callback function with (err, warnings).\n   *\n   * ## Life-Cycle Events\n   *\n   * During import the viewer will fire life-cycle events:\n   *\n   *   * import.parse.start (about to read model from XML)\n   *   * import.parse.complete (model read; may have worked or not)\n   *   * import.render.start (graphical import start)\n   *   * import.render.complete (graphical import finished)\n   *   * import.done (everything done)\n   *\n   * You can use these events to hook into the life-cycle.\n   *\n   * @throws {ImportXMLError} An error thrown during the import of the XML.\n   *\n   * @fires BaseViewer#ImportParseStartEvent\n   * @fires BaseViewer#ImportParseCompleteEvent\n   * @fires Importer#ImportRenderStartEvent\n   * @fires Importer#ImportRenderCompleteEvent\n   * @fires BaseViewer#ImportDoneEvent\n   *\n   * @param {string} xml The BPMN 2.0 XML to be imported.\n   * @param {ModdleElement|string} [bpmnDiagram] The optional diagram or Id of the BPMN diagram to open.\n   *\n   * @return {Promise<ImportXMLResult>} A promise resolving with warnings that were produced during the import.\n   */\n  BaseViewer.prototype.importXML = async function importXML(xml, bpmnDiagram) {\n\n    const self = this;\n\n    function ParseCompleteEvent(data) {\n\n      const event = self.get('eventBus').createEvent(data);\n\n      // TODO(nikku): remove with future bpmn-js version\n      Object.defineProperty(event, 'context', {\n        enumerable: true,\n        get: function() {\n\n          console.warn(new Error(\n            'import.parse.complete <context> is deprecated ' +\n            'and will be removed in future library versions'\n          ));\n\n          return {\n            warnings: data.warnings,\n            references: data.references,\n            elementsById: data.elementsById\n          };\n        }\n      });\n\n      return event;\n    }\n\n    let aggregatedWarnings = [];\n    try {\n\n      // hook in pre-parse listeners +\n      // allow xml manipulation\n\n      /**\n       * A `import.parse.start` event.\n       *\n       * @event BaseViewer#ImportParseStartEvent\n       * @type {ImportParseStartEvent}\n       */\n      xml = this._emit('import.parse.start', { xml: xml }) || xml;\n\n      let parseResult;\n      try {\n        parseResult = await this._moddle.fromXML(xml, 'bpmn:Definitions');\n      } catch (error) {\n        this._emit('import.parse.complete', {\n          error\n        });\n\n        throw error;\n      }\n\n      let definitions = parseResult.rootElement;\n      const references = parseResult.references;\n      const parseWarnings = parseResult.warnings;\n      const elementsById = parseResult.elementsById;\n\n      aggregatedWarnings = aggregatedWarnings.concat(parseWarnings);\n\n      // hook in post parse listeners +\n      // allow definitions manipulation\n\n      /**\n       * A `import.parse.complete` event.\n       *\n       * @event BaseViewer#ImportParseCompleteEvent\n       * @type {ImportParseCompleteEvent}\n       */\n      definitions = this._emit('import.parse.complete', ParseCompleteEvent({\n        error: null,\n        definitions: definitions,\n        elementsById: elementsById,\n        references: references,\n        warnings: aggregatedWarnings\n      })) || definitions;\n\n      const importResult = await this.importDefinitions(definitions, bpmnDiagram);\n\n      aggregatedWarnings = aggregatedWarnings.concat(importResult.warnings);\n\n      /**\n       * A `import.parse.complete` event.\n       *\n       * @event BaseViewer#ImportDoneEvent\n       * @type {ImportDoneEvent}\n       */\n      this._emit('import.done', { error: null, warnings: aggregatedWarnings });\n\n      return { warnings: aggregatedWarnings };\n    } catch (err) {\n      let error = err;\n      aggregatedWarnings = aggregatedWarnings.concat(error.warnings || []);\n      addWarningsToError(error, aggregatedWarnings);\n\n      error = checkValidationError(error);\n\n      this._emit('import.done', { error, warnings: error.warnings });\n\n      throw error;\n    }\n  };\n\n  BaseViewer.prototype.importXML = wrapForCompatibility(BaseViewer.prototype.importXML);\n\n\n  /**\n   * Import parsed definitions and render a BPMN 2.0 diagram.\n   *\n   * Once finished the viewer reports back the result to the\n   * provided callback function with (err, warnings).\n   *\n   * ## Life-Cycle Events\n   *\n   * During import the viewer will fire life-cycle events:\n   *\n   *   * import.render.start (graphical import start)\n   *   * import.render.complete (graphical import finished)\n   *\n   * You can use these events to hook into the life-cycle.\n   *\n   * @throws {ImportDefinitionsError} An error thrown during the import of the definitions.\n   *\n   * @param {ModdleElement} definitions The definitions.\n   * @param {ModdleElement|string} [bpmnDiagram] The optional diagram or ID of the BPMN diagram to open.\n   *\n   * @return {Promise<ImportDefinitionsResult>} A promise resolving with warnings that were produced during the import.\n   */\n  BaseViewer.prototype.importDefinitions = async function importDefinitions(definitions, bpmnDiagram) {\n    this._setDefinitions(definitions);\n    const result = await this.open(bpmnDiagram);\n\n    return { warnings: result.warnings };\n  };\n\n  BaseViewer.prototype.importDefinitions = wrapForCompatibility(BaseViewer.prototype.importDefinitions);\n\n\n  /**\n   * Open diagram of previously imported XML.\n   *\n   * Once finished the viewer reports back the result to the\n   * provided callback function with (err, warnings).\n   *\n   * ## Life-Cycle Events\n   *\n   * During switch the viewer will fire life-cycle events:\n   *\n   *   * import.render.start (graphical import start)\n   *   * import.render.complete (graphical import finished)\n   *\n   * You can use these events to hook into the life-cycle.\n   *\n   * @throws {OpenError} An error thrown during opening.\n   *\n   * @param {ModdleElement|string} bpmnDiagramOrId The diagram or Id of the BPMN diagram to open.\n   *\n   * @return {Promise<OpenResult>} A promise resolving with warnings that were produced during opening.\n   */\n  BaseViewer.prototype.open = async function open(bpmnDiagramOrId) {\n\n    const definitions = this._definitions;\n    let bpmnDiagram = bpmnDiagramOrId;\n\n    if (!definitions) {\n      const error = new Error('no XML imported');\n      addWarningsToError(error, []);\n\n      throw error;\n    }\n\n    if (typeof bpmnDiagramOrId === 'string') {\n      bpmnDiagram = findBPMNDiagram(definitions, bpmnDiagramOrId);\n\n      if (!bpmnDiagram) {\n        const error = new Error('BPMNDiagram <' + bpmnDiagramOrId + '> not found');\n        addWarningsToError(error, []);\n\n        throw error;\n      }\n    }\n\n    // clear existing rendered diagram\n    // catch synchronous exceptions during #clear()\n    try {\n      this.clear();\n    } catch (error) {\n      addWarningsToError(error, []);\n\n      throw error;\n    }\n\n    // perform graphical import\n    const { warnings } = await importBpmnDiagram(this, definitions, bpmnDiagram);\n\n    return { warnings };\n  };\n\n  BaseViewer.prototype.open = wrapForCompatibility(BaseViewer.prototype.open);\n\n  /**\n   * Export the currently displayed BPMN 2.0 diagram as\n   * a BPMN 2.0 XML document.\n   *\n   * ## Life-Cycle Events\n   *\n   * During XML saving the viewer will fire life-cycle events:\n   *\n   *   * saveXML.start (before serialization)\n   *   * saveXML.serialized (after xml generation)\n   *   * saveXML.done (everything done)\n   *\n   * You can use these events to hook into the life-cycle.\n   *\n   * @throws {Error} An error thrown during export.\n   *\n   * @fires BaseViewer#SaveXMLStart\n   * @fires BaseViewer#SaveXMLDone\n   *\n   * @param {SaveXMLOptions} [options] The options.\n   *\n   * @return {Promise<SaveXMLResult>} A promise resolving with the XML.\n   */\n  BaseViewer.prototype.saveXML = async function saveXML(options) {\n\n    options = options || {};\n\n    let definitions = this._definitions,\n        error, xml;\n\n    try {\n      if (!definitions) {\n        throw new Error('no definitions loaded');\n      }\n\n      // allow to fiddle around with definitions\n\n      /**\n       * A `saveXML.start` event.\n       *\n       * @event BaseViewer#SaveXMLStartEvent\n       * @type {SaveXMLStartEvent}\n       */\n      definitions = this._emit('saveXML.start', {\n        definitions\n      }) || definitions;\n\n      const result = await this._moddle.toXML(definitions, options);\n      xml = result.xml;\n\n      xml = this._emit('saveXML.serialized', {\n        xml\n      }) || xml;\n    } catch (err) {\n      error = err;\n    }\n\n    const result = error ? { error } : { xml };\n\n    /**\n     * A `saveXML.done` event.\n     *\n     * @event BaseViewer#SaveXMLDoneEvent\n     * @type {SaveXMLDoneEvent}\n     */\n    this._emit('saveXML.done', result);\n\n    if (error) {\n      throw error;\n    }\n\n    return result;\n  };\n\n  BaseViewer.prototype.saveXML = wrapForCompatibility(BaseViewer.prototype.saveXML);\n\n\n  /**\n   * Export the currently displayed BPMN 2.0 diagram as\n   * an SVG image.\n   *\n   * ## Life-Cycle Events\n   *\n   * During SVG saving the viewer will fire life-cycle events:\n   *\n   *   * saveSVG.start (before serialization)\n   *   * saveSVG.done (everything done)\n   *\n   * You can use these events to hook into the life-cycle.\n   *\n   * @throws {Error} An error thrown during export.\n   *\n   * @fires BaseViewer#SaveSVGDone\n   *\n   * @return {Promise<SaveSVGResult>} A promise resolving with the SVG.\n   */\n  BaseViewer.prototype.saveSVG = async function saveSVG() {\n    this._emit('saveSVG.start');\n\n    let svg, err;\n\n    try {\n      const canvas = this.get('canvas');\n\n      const contentNode = canvas.getActiveLayer(),\n            defsNode = query('defs', canvas._svg);\n\n      const contents = innerSVG(contentNode),\n            defs = defsNode ? '<defs>' + innerSVG(defsNode) + '</defs>' : '';\n\n      const bbox = contentNode.getBBox();\n\n      svg =\n        '<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n' +\n        '<!-- created with bpmn-js / http://bpmn.io -->\\n' +\n        '<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n' +\n        '<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" ' +\n        'width=\"' + bbox.width + '\" height=\"' + bbox.height + '\" ' +\n        'viewBox=\"' + bbox.x + ' ' + bbox.y + ' ' + bbox.width + ' ' + bbox.height + '\" version=\"1.1\">' +\n        defs + contents +\n        '</svg>';\n    } catch (e) {\n      err = e;\n    }\n\n    /**\n     * A `saveSVG.done` event.\n     *\n     * @event BaseViewer#SaveSVGDoneEvent\n     * @type {SaveSVGDoneEvent}\n     */\n    this._emit('saveSVG.done', {\n      error: err,\n      svg: svg\n    });\n\n    if (err) {\n      throw err;\n    }\n\n    return { svg };\n  };\n\n  BaseViewer.prototype.saveSVG = wrapForCompatibility(BaseViewer.prototype.saveSVG);\n\n  /**\n   * Get a named diagram service.\n   *\n   * @example\n   *\n   * const elementRegistry = viewer.get('elementRegistry');\n   * const startEventShape = elementRegistry.get('StartEvent_1');\n   *\n   * @param {string} name\n   *\n   * @return {Object} diagram service instance\n   *\n   * @method BaseViewer#get\n   */\n\n  /**\n   * Invoke a function in the context of this viewer.\n   *\n   * @example\n   *\n   * viewer.invoke(function(elementRegistry) {\n   *   const startEventShape = elementRegistry.get('StartEvent_1');\n   * });\n   *\n   * @param {Function} fn to be invoked\n   *\n   * @return {Object} the functions return value\n   *\n   * @method BaseViewer#invoke\n   */\n\n\n  BaseViewer.prototype._setDefinitions = function(definitions) {\n    this._definitions = definitions;\n  };\n\n  /**\n   * Return modules to instantiate with.\n   *\n   * @return {ModuleDeclaration[]} The modules.\n   */\n  BaseViewer.prototype.getModules = function() {\n    return this._modules;\n  };\n\n  /**\n   * Remove all drawn elements from the viewer.\n   *\n   * After calling this method the viewer can still be reused for opening another\n   * diagram.\n   */\n  BaseViewer.prototype.clear = function() {\n    if (!this.getDefinitions()) {\n\n      // no diagram to clear\n      return;\n    }\n\n    // remove drawn elements\n    Diagram.prototype.clear.call(this);\n  };\n\n  /**\n   * Destroy the viewer instance and remove all its remainders from the document\n   * tree.\n   */\n  BaseViewer.prototype.destroy = function() {\n\n    // diagram destroy\n    Diagram.prototype.destroy.call(this);\n\n    // dom detach\n    remove$1(this._container);\n  };\n\n  /**\n   * Register an event listener.\n   *\n   * Remove an event listener via {@link BaseViewer#off}.\n   *\n   * @template T\n   *\n   * @param {string|string[]} events The event(s) to listen to.\n   * @param {number} [priority] The priority with which to listen.\n   * @param {EventBusEventCallback<T>} callback The callback.\n   * @param {any} [that] Value of `this` the callback will be called with.\n   */\n  BaseViewer.prototype.on = function(events, priority, callback, that) {\n    return this.get('eventBus').on(events, priority, callback, that);\n  };\n\n  /**\n   * Remove an event listener.\n   *\n   * @param {string|string[]} events The event(s).\n   * @param {Function} [callback] The callback.\n   */\n  BaseViewer.prototype.off = function(events, callback) {\n    this.get('eventBus').off(events, callback);\n  };\n\n  /**\n   * Attach the viewer to an HTML element.\n   *\n   * @param {HTMLElement} parentNode The parent node to attach to.\n   */\n  BaseViewer.prototype.attachTo = function(parentNode) {\n\n    if (!parentNode) {\n      throw new Error('parentNode required');\n    }\n\n    // ensure we detach from the\n    // previous, old parent\n    this.detach();\n\n    // unwrap jQuery if provided\n    if (parentNode.get && parentNode.constructor.prototype.jquery) {\n      parentNode = parentNode.get(0);\n    }\n\n    if (typeof parentNode === 'string') {\n      parentNode = query(parentNode);\n    }\n\n    parentNode.appendChild(this._container);\n\n    this._emit('attach', {});\n\n    this.get('canvas').resized();\n  };\n\n  /**\n   * Get the definitions model element.\n   *\n   * @return {ModdleElement} The definitions model element.\n   */\n  BaseViewer.prototype.getDefinitions = function() {\n    return this._definitions;\n  };\n\n  /**\n   * Detach the viewer.\n   *\n   * @fires BaseViewer#DetachEvent\n   */\n  BaseViewer.prototype.detach = function() {\n\n    const container = this._container,\n          parentNode = container.parentNode;\n\n    if (!parentNode) {\n      return;\n    }\n\n    /**\n     * A `detach` event.\n     *\n     * @event BaseViewer#DetachEvent\n     * @type {Object}\n     */\n    this._emit('detach', {});\n\n    parentNode.removeChild(container);\n  };\n\n  BaseViewer.prototype._init = function(container, moddle, options) {\n\n    const baseModules = options.modules || this.getModules(options),\n          additionalModules = options.additionalModules || [],\n          staticModules = [\n            {\n              bpmnjs: [ 'value', this ],\n              moddle: [ 'value', moddle ]\n            }\n          ];\n\n    const diagramModules = [].concat(staticModules, baseModules, additionalModules);\n\n    const diagramOptions = assign$1(omit(options, [ 'additionalModules' ]), {\n      canvas: assign$1({}, options.canvas, { container: container }),\n      modules: diagramModules\n    });\n\n    // invoke diagram constructor\n    Diagram.call(this, diagramOptions);\n\n    if (options && options.container) {\n      this.attachTo(options.container);\n    }\n  };\n\n  /**\n   * Emit an event on the underlying {@link EventBus}\n   *\n   * @param  {string} type\n   * @param  {Object} event\n   *\n   * @return {Object} The return value after calling all event listeners.\n   */\n  BaseViewer.prototype._emit = function(type, event) {\n    return this.get('eventBus').fire(type, event);\n  };\n\n  /**\n   * @param {BaseViewerOptions} options\n   *\n   * @return {HTMLElement}\n   */\n  BaseViewer.prototype._createContainer = function(options) {\n\n    const container = domify$1('<div class=\"bjs-container\"></div>');\n\n    assign(container, {\n      width: ensureUnit(options.width),\n      height: ensureUnit(options.height),\n      position: options.position\n    });\n\n    return container;\n  };\n\n  /**\n   * @param {BaseViewerOptions} options\n   *\n   * @return {Moddle}\n   */\n  BaseViewer.prototype._createModdle = function(options) {\n    const moddleOptions = assign$1({}, this._moddleExtensions, options.moddleExtensions);\n\n    return new simple(moddleOptions);\n  };\n\n  BaseViewer.prototype._modules = [];\n\n  // helpers ///////////////\n\n  function addWarningsToError(err, warningsAry) {\n    err.warnings = warningsAry;\n    return err;\n  }\n\n  function checkValidationError(err) {\n\n    // check if we can help the user by indicating wrong BPMN 2.0 xml\n    // (in case he or the exporting tool did not get that right)\n\n    const pattern = /unparsable content <([^>]+)> detected([\\s\\S]*)$/;\n    const match = pattern.exec(err.message);\n\n    if (match) {\n      err.message =\n        'unparsable content <' + match[1] + '> detected; ' +\n        'this may indicate an invalid BPMN 2.0 diagram file' + match[2];\n    }\n\n    return err;\n  }\n\n  const DEFAULT_OPTIONS = {\n    width: '100%',\n    height: '100%',\n    position: 'relative'\n  };\n\n\n  /**\n   * Ensure the passed argument is a proper unit (defaulting to px)\n   */\n  function ensureUnit(val) {\n    return val + (isNumber(val) ? 'px' : '');\n  }\n\n\n  /**\n   * Find BPMNDiagram in definitions by ID\n   *\n   * @param {ModdleElement<Definitions>} definitions\n   * @param {string} diagramId\n   *\n   * @return {ModdleElement<BPMNDiagram>|null}\n   */\n  function findBPMNDiagram(definitions, diagramId) {\n    if (!diagramId) {\n      return null;\n    }\n\n    return find(definitions.diagrams, function(element) {\n      return element.id === diagramId;\n    }) || null;\n  }\n\n  /**\n   * Adds the project logo to the diagram container as\n   * required by the bpmn.io license.\n   *\n   * @see http://bpmn.io/license\n   *\n   * @param {Element} container\n   */\n  function addProjectLogo(container) {\n    const img = BPMNIO_IMG;\n\n    const linkMarkup =\n      '<a href=\"http://bpmn.io\" ' +\n      'target=\"_blank\" ' +\n      'class=\"bjs-powered-by\" ' +\n      'title=\"Powered by bpmn.io\" ' +\n      '>' +\n      img +\n      '</a>';\n\n    const linkElement = domify$1(linkMarkup);\n\n    assign(query('svg', linkElement), LOGO_STYLES);\n    assign(linkElement, LINK_STYLES, {\n      position: 'absolute',\n      bottom: '15px',\n      right: '15px',\n      zIndex: '100'\n    });\n\n    container.appendChild(linkElement);\n\n    event.bind(linkElement, 'click', function(event) {\n      open();\n\n      event.preventDefault();\n    });\n  }\n\n  /* </project-logo> */\n\n  /**\n   * @typedef { import('./BaseViewer').BaseViewerOptions } BaseViewerOptions\n   */\n\n  /**\n   * A viewer for BPMN 2.0 diagrams.\n   *\n   * Have a look at {@link NavigatedViewer} or {@link Modeler} for bundles that include\n   * additional features.\n   *\n   *\n   * ## Extending the Viewer\n   *\n   * In order to extend the viewer pass extension modules to bootstrap via the\n   * `additionalModules` option. An extension module is an object that exposes\n   * named services.\n   *\n   * The following example depicts the integration of a simple\n   * logging component that integrates with interaction events:\n   *\n   *\n   * ```javascript\n   *\n   * // logging component\n   * function InteractionLogger(eventBus) {\n   *   eventBus.on('element.hover', function(event) {\n   *     console.log()\n   *   })\n   * }\n   *\n   * InteractionLogger.$inject = [ 'eventBus' ]; // minification save\n   *\n   * // extension module\n   * var extensionModule = {\n   *   __init__: [ 'interactionLogger' ],\n   *   interactionLogger: [ 'type', InteractionLogger ]\n   * };\n   *\n   * // extend the viewer\n   * var bpmnViewer = new Viewer({ additionalModules: [ extensionModule ] });\n   * bpmnViewer.importXML(...);\n   * ```\n   *\n   * @param {BaseViewerOptions} [options] The options to configure the viewer.\n   */\n  function Viewer(options) {\n    BaseViewer.call(this, options);\n  }\n\n  e(Viewer, BaseViewer);\n\n  // modules the viewer is composed of\n  Viewer.prototype._modules = [\n    CoreModule$1,\n    TranslateModule,\n    SelectionModule,\n    OverlaysModule,\n    DrilldownModdule\n  ];\n\n  // default moddle extensions the viewer is composed of\n  Viewer.prototype._moddleExtensions = {};\n\n  return Viewer;\n\n}));\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bpmnjs/bpmn-viewer.production.min.js",
    "content": "/*! bpmn-js - bpmn-viewer v13.2.1 | Copyright (c) 2014-present, camunda Services GmbH | bpmn.io/license */\n!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).BpmnViewer=t()}(this,(function(){\"use strict\";function e(e,t){t&&(e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}const t=Object.prototype.toString,n=Object.prototype.hasOwnProperty;function i(e){return void 0!==e}function r(e){return\"[object Array]\"===t.call(e)}function o(e){return\"[object Object]\"===t.call(e)}function a(e){return\"[object Number]\"===t.call(e)}function s(e){const n=t.call(e);return\"[object Function]\"===n||\"[object AsyncFunction]\"===n||\"[object GeneratorFunction]\"===n||\"[object AsyncGeneratorFunction]\"===n||\"[object Proxy]\"===n}function l(e){return\"[object String]\"===t.call(e)}function p(e,t){return n.call(e,t)}function c(e,t){const n=g(t);let i;return h(e,(function(e,t){if(n(e,t))return i=e,!1})),i}function u(e,t){const n=g(t);let i=[];return h(e,(function(e,t){n(e,t)&&i.push(e)})),i}function h(e,t){let n,i;if(void 0===e)return;const o=r(e)?x:v;for(let r in e)if(p(e,r)&&(n=e[r],i=t(n,o(r)),!1===i))return n}function m(e,t,n){return h(e,(function(e,i){n=t(n,e,i)})),n}function f(e,t){return!!m(e,(function(e,n,i){return e&&t(n,i)}),!0)}function d(e,t){return!!c(e,t)}function y(e){return function(t){return f(e,(function(e,n){return t[n]===e}))}}function g(e){return s(e)?e:t=>t===e}function v(e){return e}function x(e){return Number(e)}function b(e,t){return e.bind(t)}function E(e,...t){return Object.assign(e,...t)}var w=1e3;function _(e,t){var n=this;t=t||w,e.on([\"render.shape\",\"render.connection\"],t,(function(e,t){var i=e.type,r=t.element,o=t.gfx,a=t.attrs;if(n.canRender(r))return\"render.shape\"===i?n.drawShape(o,r,a):n.drawConnection(o,r,a)})),e.on([\"render.getShapePath\",\"render.getConnectionPath\"],t,(function(e,t){if(n.canRender(t))return\"render.getShapePath\"===e.type?n.getShapePath(t):n.getConnectionPath(t)}))}function A(e,t){var n=S(e);return n&&\"function\"==typeof n.$instanceOf&&n.$instanceOf(t)}function S(e){return e&&e.businessObject||e}function R(e){return e&&e.di}function C(e,t){return!A(e,\"bpmn:CallActivity\")&&(A(e,\"bpmn:SubProcess\")?!(!(t=t||R(e))||!A(t,\"bpmndi:BPMNPlane\"))||t&&!!t.isExpanded:!A(e,\"bpmn:Participant\")||!!S(e).processRef)}_.prototype.canRender=function(e){},_.prototype.drawShape=function(e,t){},_.prototype.drawConnection=function(e,t){},_.prototype.getShapePath=function(e){},_.prototype.getConnectionPath=function(e){};var M={width:90,height:20},k=15;function P(e){var t=e.length/2-1,n=e[Math.floor(t)],i=e[Math.ceil(t+.01)],r=function(e){var t=e.length/2-1,n=e[Math.floor(t)],i=e[Math.ceil(t+.01)];return{x:n.x+(i.x-n.x)/2,y:n.y+(i.y-n.y)/2}}(e),o=Math.atan((i.y-n.y)/(i.x-n.x)),a=r.x,s=r.y;return Math.abs(o)<Math.PI/2?s-=k:a+=k,{x:a,y:s}}function D(e,t){var n,i,r,o=e.label;return o&&o.bounds?(r=o.bounds,i={width:Math.max(M.width,r.width),height:r.height},n={x:r.x+r.width/2,y:r.y+r.height/2}):(n=function(e){return e.waypoints?P(e.waypoints):A(e,\"bpmn:Group\")?{x:e.x+e.width/2,y:e.y+M.height/2}:{x:e.x+e.width/2,y:e.y+e.height+M.height/2}}(t),i=M),E({x:n.x-i.width/2,y:n.y-i.height/2},i)}function T(e){var t=e.businessObject,n=function(e){return A(e,\"bpmn:FlowElement\")||A(e,\"bpmn:Participant\")||A(e,\"bpmn:Lane\")||A(e,\"bpmn:SequenceFlow\")||A(e,\"bpmn:MessageFlow\")||A(e,\"bpmn:DataInput\")||A(e,\"bpmn:DataOutput\")?\"name\":A(e,\"bpmn:TextAnnotation\")?\"text\":A(e,\"bpmn:Group\")?\"categoryValueRef\":void 0}(t);if(n)return\"categoryValueRef\"===n?function(e){var t=e.categoryValueRef;return t&&t.value||\"\"}(t):t[n]||\"\"}function O(e,t){return t.appendChild(function(e,t){if(e.ownerDocument!==t.ownerDocument)try{return t.ownerDocument.importNode(e,!0)}catch(e){}return e}(e,t))}function N(e,t){return O(t,e),e}var B=2,L={\"alignment-baseline\":1,\"baseline-shift\":1,clip:1,\"clip-path\":1,\"clip-rule\":1,color:1,\"color-interpolation\":1,\"color-interpolation-filters\":1,\"color-profile\":1,\"color-rendering\":1,cursor:1,direction:1,display:1,\"dominant-baseline\":1,\"enable-background\":1,fill:1,\"fill-opacity\":1,\"fill-rule\":1,filter:1,\"flood-color\":1,\"flood-opacity\":1,font:1,\"font-family\":1,\"font-size\":B,\"font-size-adjust\":1,\"font-stretch\":1,\"font-style\":1,\"font-variant\":1,\"font-weight\":1,\"glyph-orientation-horizontal\":1,\"glyph-orientation-vertical\":1,\"image-rendering\":1,kerning:1,\"letter-spacing\":1,\"lighting-color\":1,marker:1,\"marker-end\":1,\"marker-mid\":1,\"marker-start\":1,mask:1,opacity:1,overflow:1,\"pointer-events\":1,\"shape-rendering\":1,\"stop-color\":1,\"stop-opacity\":1,stroke:1,\"stroke-dasharray\":1,\"stroke-dashoffset\":1,\"stroke-linecap\":1,\"stroke-linejoin\":1,\"stroke-miterlimit\":1,\"stroke-opacity\":1,\"stroke-width\":B,\"text-anchor\":1,\"text-decoration\":1,\"text-rendering\":1,\"unicode-bidi\":1,visibility:1,\"word-spacing\":1,\"writing-mode\":1};function I(e,t,n){var i=t.replace(/([a-z])([A-Z])/g,\"$1-$2\").toLowerCase(),r=L[i];r?(r===B&&\"number\"==typeof n&&(n=String(n)+\"px\"),e.style[i]=n):e.setAttributeNS(null,t,n)}function j(e,t,n){if(\"string\"==typeof t){if(void 0===n)return function(e,t){return L[t]?e.style[t]:e.getAttributeNS(null,t)}(e,t);I(e,t,n)}else!function(e,t){var n,i,r=Object.keys(t);for(n=0;i=r[n];n++)I(e,i,t[i])}(e,t);return e}const F=Object.prototype.toString;function V(e){return new W(e)}function W(e){if(!e||!e.nodeType)throw new Error(\"A DOM element reference is required\");this.el=e,this.list=e.classList}function z(e){var t=e.parentNode;return t&&t.removeChild(e),e}function G(e){for(var t;t=e.firstChild;)z(t);return e}W.prototype.add=function(e){return this.list.add(e),this},W.prototype.remove=function(e){return\"[object RegExp]\"==F.call(e)?this.removeMatching(e):(this.list.remove(e),this)},W.prototype.removeMatching=function(e){const t=this.array();for(let n=0;n<t.length;n++)e.test(t[n])&&this.remove(t[n]);return this},W.prototype.toggle=function(e,t){return void 0!==t?t!==this.list.toggle(e,t)&&this.list.toggle(e):this.list.toggle(e),this},W.prototype.array=function(){return Array.from(this.list)},W.prototype.has=W.prototype.contains=function(e){return this.list.contains(e)};var $={svg:\"http://www.w3.org/2000/svg\"},H='<svg xmlns=\"'+$.svg+'\"';function K(e){var t=!1;\"<svg\"===e.substring(0,4)?-1===e.indexOf($.svg)&&(e=H+e.substring(4)):(e=H+\">\"+e+\"</svg>\",t=!0);var n=function(e){var t;return(t=new DOMParser).async=!1,t.parseFromString(e,\"text/xml\")}(e);if(!t)return n;for(var i=document.createDocumentFragment(),r=n.firstChild;r.firstChild;)i.appendChild(r.firstChild);return i}function U(e,t){var n;return\"<\"===e.charAt(0)?(n=K(e).firstChild,n=document.importNode(n,!0)):n=document.createElementNS($.svg,e),t&&j(n,t),n}var q=null;function Y(){return null===q&&(q=U(\"svg\")),q}function X(e,t){var n,i,r=Object.keys(t);for(n=0;i=r[n];n++)e[i]=t[i];return e}function Z(e){return e?Y().createSVGTransformFromMatrix(e):Y().createSVGTransform()}var J=/([&<>]{1})/g,Q=/([\\n\\r\"]{1})/g,ee={\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"'\"};function te(e,t){return e.replace(t,(function(e,t){return ee[t]||t}))}function ne(e,t){var n,i,r,o,a;switch(e.nodeType){case 3:t.push(te(e.textContent,J));break;case 1:if(t.push(\"<\",e.tagName),e.hasAttributes())for(n=0,i=(r=e.attributes).length;n<i;++n)o=r.item(n),t.push(\" \",o.name,'=\"',te(o.value,Q),'\"');if(e.hasChildNodes()){for(t.push(\">\"),n=0,i=(a=e.childNodes).length;n<i;++n)ne(a.item(n),t);t.push(\"</\",e.tagName,\">\")}else t.push(\"/>\");break;case 8:t.push(\"\\x3c!--\",te(e.nodeValue,J),\"--\\x3e\");break;case 4:t.push(\"<![CDATA[\",e.nodeValue,\"]]>\");break;default:throw new Error(\"unable to handle node \"+e.nodeType)}return t}function ie(e,t){var n=K(t);if(G(e),t){(function(e){return\"#document-fragment\"===e.nodeName})(n)||(n=n.documentElement);for(var i,r=(i=n.childNodes,Array.prototype.slice.call(i)),o=0;o<r.length;o++)O(r[o],e)}}function re(e,t){if(void 0!==t){try{ie(e,t)}catch(e){throw new Error(\"error parsing SVG: \"+e.message)}return e}return function(e){for(var t=e.firstChild,n=[];t;)ne(t,n),t=t.nextSibling;return n.join(\"\")}(e)}function oe(e,t){return t instanceof SVGMatrix?e.createSVGTransformFromMatrix(t):t}function ae(e,t){var n=e.transform.baseVal;return t&&(Array.isArray(t)||(t=[t]),function(e,t){var n,i;for(e.clear(),n=0;i=t[n];n++)e.appendItem(oe(e,i))}(n,t)),n.consolidate()}function se(e){return e.flat().join(\",\").replace(/,?([A-z]),?/g,\"$1\")}function le(e){return[\"L\",e.x,e.y]}function pe(e,t){const n=e.length,i=[(r=e[0],[\"M\",r.x,r.y])];var r,o,a,s;for(let r=1;r<n;r++){const n=e[r-1],l=e[r],p=e[r+1];if(!p||!t){i.push(le(l));continue}const c=Math.min(t,ue(l.x-n.x,l.y-n.y),ue(p.x-l.x,p.y-l.y));if(!c){i.push(le(l));continue}const u=ce(l,n,c),h=ce(l,n,.5*c),m=ce(l,p,c),f=ce(l,p,.5*c);i.push(le(u)),i.push((a=f,s=m,[\"C\",(o=h).x,o.y,a.x,a.y,s.x,s.y]))}return i}function ce(e,t,n){const i=t.x-e.x,r=t.y-e.y,o=n/ue(i,r);return{x:e.x+i*o,y:e.y+r*o}}function ue(e,t){return Math.sqrt(Math.pow(e,2)+Math.pow(t,2))}function he(e,t,n){a(t)&&(n=t,t=null),t||(t={});const i=U(\"path\",t);return a(n)&&(i.dataset.cornerRadius=String(n)),me(i,e)}function me(e,t){return j(e,{d:se(pe(t,parseInt(e.dataset.cornerRadius,10)||0))}),e}var fe=\"hsl(225, 10%, 15%)\";function de(e,t){return d(e.eventDefinitions,(function(e){return e.$type===t}))}function ye(e,t){var n=R(e);return n.get(\"color:background-color\")||n.get(\"bioc:fill\")||t||\"white\"}function ge(e,t){var n=R(e);return n.get(\"color:border-color\")||n.get(\"bioc:stroke\")||t||fe}function ve(e,t,n){var i=R(e).get(\"label\");return i&&i.get(\"color:color\")||t||ge(e,n)}function xe(e,t){return t.forEach((function(t){t&&\"string\"!=typeof t&&!Array.isArray(t)&&Object.keys(t).forEach((function(n){if(\"default\"!==n&&!(n in e)){var i=Object.getOwnPropertyDescriptor(t,n);Object.defineProperty(e,n,i.get?i:{enumerable:!0,get:function(){return t[n]}})}}))})),Object.freeze(e)}const be=Object.prototype.toString,Ee=Object.prototype.hasOwnProperty;function we(e,t){return Ee.call(e,t)}function _e(e,t){let n,i;if(void 0===e)return;const r=function(e){return\"[object Array]\"===be.call(e)}(e)?Se:Ae;for(let o in e)if(we(e,o)&&(n=e[o],i=t(n,r(o)),!1===i))return n}function Ae(e){return e}function Se(e){return Number(e)}function Re(e,...t){const n=e.style;return _e(t,(function(e){e&&_e(e,(function(e,t){n[t]=e}))})),e}const Ce=Object.prototype.toString;function Me(e){return new ke(e)}function ke(e){if(!e||!e.nodeType)throw new Error(\"A DOM element reference is required\");this.el=e,this.list=e.classList}function Pe(e){for(var t;e.childNodes.length;)t=e.childNodes[0],e.removeChild(t);return e}function De(e,t){return e&&\"function\"==typeof e.matches&&e.matches(t)}ke.prototype.add=function(e){return this.list.add(e),this},ke.prototype.remove=function(e){return\"[object RegExp]\"==Ce.call(e)?this.removeMatching(e):(this.list.remove(e),this)},ke.prototype.removeMatching=function(e){const t=this.array();for(let n=0;n<t.length;n++)e.test(t[n])&&this.remove(t[n]);return this},ke.prototype.toggle=function(e,t){return void 0!==t?t!==this.list.toggle(e,t)&&this.list.toggle(e):this.list.toggle(e),this},ke.prototype.array=function(){return Array.from(this.list)},ke.prototype.has=ke.prototype.contains=function(e){return this.list.contains(e)};var Te,Oe,Ne,Be={};function Le(){Te=window.addEventListener?\"addEventListener\":\"attachEvent\",Oe=window.removeEventListener?\"removeEventListener\":\"detachEvent\",Ne=\"addEventListener\"!==Te?\"on\":\"\"}var Ie=xe({__proto__:null,bind:Be.bind=function(e,t,n,i){return Te||Le(),e[Te](Ne+t,n,i||!1),n},unbind:Be.unbind=function(e,t,n,i){return Oe||Le(),e[Oe](Ne+t,n,i||!1),n},default:Be},[Be]),je=[\"focus\",\"blur\"];var Fe,Ve={bind:function(e,t,n,i,r){return-1!==je.indexOf(n)&&(r=!0),Ie.bind(e,n,(function(n){var r=n.target||n.srcElement;n.delegateTarget=function(e,t,n){for(var i=n?e:e.parentNode;i&&i.nodeType!==document.DOCUMENT_NODE&&i.nodeType!==document.DOCUMENT_FRAGMENT_NODE;){if(De(i,t))return i;i=i.parentNode}return De(i,t)?i:null}(r,t,!0),n.delegateTarget&&i.call(e,n)}),r)},unbind:function(e,t,n,i){return-1!==je.indexOf(t)&&(i=!0),Ie.unbind(e,t,n,i)}},We=function(e,t){if(\"string\"!=typeof e)throw new TypeError(\"String expected\");t||(t=document);var n=/<([\\w:]+)/.exec(e);if(!n)return t.createTextNode(e);e=e.replace(/^\\s+|\\s+$/g,\"\");var i=n[1];if(\"body\"==i){return(r=t.createElement(\"html\")).innerHTML=e,r.removeChild(r.lastChild)}var r,o=Object.prototype.hasOwnProperty.call(Ge,i)?Ge[i]:Ge._default,a=o[0],s=o[1],l=o[2];(r=t.createElement(\"div\")).innerHTML=s+e+l;for(;a--;)r=r.lastChild;if(r.firstChild==r.lastChild)return r.removeChild(r.firstChild);var p=t.createDocumentFragment();for(;r.firstChild;)p.appendChild(r.removeChild(r.firstChild));return p},ze=!1;\"undefined\"!=typeof document&&((Fe=document.createElement(\"div\")).innerHTML='  <link/><table></table><a href=\"/a\">a</a><input type=\"checkbox\"/>',ze=!Fe.getElementsByTagName(\"link\").length,Fe=void 0);var Ge={legend:[1,\"<fieldset>\",\"</fieldset>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],col:[2,\"<table><tbody></tbody><colgroup>\",\"</colgroup></table>\"],_default:ze?[1,\"X<div>\",\"</div>\"]:[0,\"\",\"\"]};Ge.td=Ge.th=[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],Ge.option=Ge.optgroup=[1,'<select multiple=\"multiple\">',\"</select>\"],Ge.thead=Ge.tbody=Ge.colgroup=Ge.caption=Ge.tfoot=[1,\"<table>\",\"</table>\"],Ge.polyline=Ge.ellipse=Ge.polygon=Ge.circle=Ge.text=Ge.line=Ge.path=Ge.rect=Ge.g=[1,'<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\">',\"</svg>\"];var $e=We;function He(e,t){return(t=t||document).querySelector(e)}function Ke(e){e.parentNode&&e.parentNode.removeChild(e)}function Ue(e,t,n,i,r){var o=Z();o.setTranslate(t,n);var a=Z();a.setRotate(i||0,0,0);var s=Z();s.setScale(r||1,r||1),ae(e,[o,a,s])}function qe(e,t,n){var i=Z();i.setTranslate(t,n),ae(e,i)}var Ye=function(e,t){return e(t={exports:{}},t.exports),t.exports}((function(e){var t=e.exports=function(e,n){if(n||(n=16),void 0===e&&(e=128),e<=0)return\"0\";for(var i=Math.log(Math.pow(2,e))/Math.log(n),r=2;i===1/0;r*=2)i=Math.log(Math.pow(2,e/r))/Math.log(n)*r;var o=i-Math.floor(i),a=\"\";for(r=0;r<Math.floor(i);r++){a=Math.floor(Math.random()*n).toString(n)+a}if(o){var s=Math.pow(n,o);a=Math.floor(Math.random()*s).toString(n)+a}var l=parseInt(a,n);return l!==1/0&&l>=Math.pow(2,e)?t(e,n):a};t.rack=function(e,n,i){var r=function(r){var a=0;do{if(a++>10){if(!i)throw new Error(\"too many ID collisions, use more bits\");e+=i}var s=t(e,n)}while(Object.hasOwnProperty.call(o,s));return o[s]=r,s},o=r.hats={};return r.get=function(e){return r.hats[e]},r.set=function(e,t){return r.hats[e]=t,r},r.bits=e||128,r.base=n||16,r}}));function Xe(e){if(!(this instanceof Xe))return new Xe(e);e=e||[128,36,1],this._seed=e.length?Ye.rack(e[0],e[1],e[2]):e}Xe.prototype.next=function(e){return this._seed(e||!0)},Xe.prototype.nextPrefixed=function(e,t){var n;do{n=e+this.next(!0)}while(this.assigned(n));return this.claim(n,t),n},Xe.prototype.claim=function(e,t){this._seed.set(e,t||!0)},Xe.prototype.assigned=function(e){return this._seed.get(e)||!1},Xe.prototype.unclaim=function(e){delete this._seed.hats[e]},Xe.prototype.clear=function(){var e,t=this._seed.hats;for(e in t)this.unclaim(e)};var Ze=new Xe,Je=.95;function Qe(e,t,n,i,r,a,s){_.call(this,t,s);var l=e&&e.defaultFillColor,p=e&&e.defaultStrokeColor,c=e&&e.defaultLabelColor,u=Ze.next(),m={};function f(e){return n.computeStyle(e,{strokeLinecap:\"round\",strokeLinejoin:\"round\",stroke:fe,strokeWidth:2,fill:\"white\"})}function d(e){return n.computeStyle(e,[\"no-fill\"],{strokeLinecap:\"round\",strokeLinejoin:\"round\",stroke:fe,strokeWidth:2})}function y(e,t){var{ref:n={x:0,y:0},scale:i=1,element:o}=t,a=U(\"marker\",{id:e,viewBox:\"0 0 20 20\",refX:n.x,refY:n.y,markerWidth:20*i,markerHeight:20*i,orient:\"auto\"});N(a,o);var s=He(\"defs\",r._svg);s||(s=U(\"defs\"),N(r._svg,s)),N(s,a),m[e]=a}function g(e){return e.replace(/[^0-9a-zA-Z]+/g,\"_\")}function v(e,t,n){var i=e+\"-\"+g(t)+\"-\"+g(n)+\"-\"+u;return m[i]||function(e,t,n,i){if(\"sequenceflow-end\"===t){y(e,{element:U(\"path\",{d:\"M 1 5 L 11 10 L 1 15 Z\",...f({fill:i,stroke:i,strokeWidth:1})}),ref:{x:11,y:10},scale:.5})}if(\"messageflow-start\"===t){y(e,{element:U(\"circle\",{cx:6,cy:6,r:3.5,...f({fill:n,stroke:i,strokeWidth:1,strokeDasharray:[1e4,1]})}),ref:{x:6,y:6}})}if(\"messageflow-end\"===t){y(e,{element:U(\"path\",{d:\"m 1 5 l 0 -3 l 7 3 l -7 3 z\",...f({fill:n,stroke:i,strokeWidth:1,strokeDasharray:[1e4,1]})}),ref:{x:8.5,y:5}})}if(\"association-start\"===t){y(e,{element:U(\"path\",{d:\"M 11 5 L 1 10 L 11 15\",...d({fill:\"none\",stroke:i,strokeWidth:1.5,strokeDasharray:[1e4,1]})}),ref:{x:1,y:10},scale:.5})}if(\"association-end\"===t){y(e,{element:U(\"path\",{d:\"M 1 5 L 11 10 L 1 15\",...d({fill:\"none\",stroke:i,strokeWidth:1.5,strokeDasharray:[1e4,1]})}),ref:{x:11,y:10},scale:.5})}if(\"conditional-flow-marker\"===t){y(e,{element:U(\"path\",{d:\"M 0 10 L 8 6 L 16 10 L 8 14 Z\",...f({fill:n,stroke:i})}),ref:{x:-1,y:10},scale:.5})}if(\"conditional-default-flow-marker\"===t){y(e,{element:U(\"path\",{d:\"M 6 4 L 10 16\",...f({stroke:i})}),ref:{x:0,y:10},scale:.5})}}(i,e,t,n),\"url(#\"+i+\")\"}function x(e,t,n,i,r){o(i)&&(r=i,i=0),i=i||0,\"none\"===(r=f(r)).fill&&delete r.fillOpacity;var a=U(\"circle\",{cx:t/2,cy:n/2,r:Math.round((t+n)/4-i),...r});return N(e,a),a}function b(e,t,n,i,r,a){o(r)&&(a=r,r=0),r=r||0,a=f(a);var s=U(\"rect\",{x:r,y:r,width:t-2*r,height:n-2*r,rx:i,ry:i,...a});return N(e,s),s}function w(e,t,n,i){var r=he(t,n=d(n),i);return N(e,r),r}function A(e,t,n){return w(e,t,n,5)}function M(e,t,n){n=d(n);var i=U(\"path\",{...n,d:t});return N(e,i),i}function k(e,t,n,i){return M(t,n,E({\"data-marker\":e},i))}function P(e){return F[e]}function D(e){return function(t,n,i){return P(e)(t,n,i)}}function O(e,t){var n=S(e),i=function(e){return\"bpmn:IntermediateThrowEvent\"===e.$type||\"bpmn:EndEvent\"===e.$type}(n);return n.eventDefinitions&&n.eventDefinitions.length>1?n.parallelMultiple?P(\"bpmn:ParallelMultipleEventDefinition\")(t,e,i):P(\"bpmn:MultipleEventDefinition\")(t,e,i):de(n,\"bpmn:MessageEventDefinition\")?P(\"bpmn:MessageEventDefinition\")(t,e,i):de(n,\"bpmn:TimerEventDefinition\")?P(\"bpmn:TimerEventDefinition\")(t,e,i):de(n,\"bpmn:ConditionalEventDefinition\")?P(\"bpmn:ConditionalEventDefinition\")(t,e):de(n,\"bpmn:SignalEventDefinition\")?P(\"bpmn:SignalEventDefinition\")(t,e,i):de(n,\"bpmn:EscalationEventDefinition\")?P(\"bpmn:EscalationEventDefinition\")(t,e,i):de(n,\"bpmn:LinkEventDefinition\")?P(\"bpmn:LinkEventDefinition\")(t,e,i):de(n,\"bpmn:ErrorEventDefinition\")?P(\"bpmn:ErrorEventDefinition\")(t,e,i):de(n,\"bpmn:CancelEventDefinition\")?P(\"bpmn:CancelEventDefinition\")(t,e,i):de(n,\"bpmn:CompensateEventDefinition\")?P(\"bpmn:CompensateEventDefinition\")(t,e,i):de(n,\"bpmn:TerminateEventDefinition\")?P(\"bpmn:TerminateEventDefinition\")(t,e,i):null}function B(e,t,n){n=E({size:{width:100}},n);var i=a.createText(t||\"\",n);return V(i).add(\"djs-label\"),N(e,i),i}function L(e,t,n){return B(e,S(t).name,{box:t,align:n,padding:7,style:{fill:ve(t,c,p)}})}function I(e,t,n){Ue(B(e,t,{box:{height:30,width:n.height},align:\"center-middle\",style:{fill:ve(n,c,p)}}),0,-(-1*n.height),270)}var F=this.handlers={\"bpmn:Event\":function(e,t,n){return\"fillOpacity\"in n||(n.fillOpacity=Je),x(e,t.width,t.height,n)},\"bpmn:StartEvent\":function(e,t,n){var i={fill:ye(t,l),stroke:ge(t,p)};S(t).isInterrupting||(i={strokeDasharray:\"6\",fill:ye(t,l),stroke:ge(t,p)});var r=P(\"bpmn:Event\")(e,t,i);return n&&!1===n.renderIcon||O(t,e),r},\"bpmn:MessageEventDefinition\":function(e,t,n){return M(e,i.getScaledPath(\"EVENT_MESSAGE\",{xScaleFactor:.9,yScaleFactor:.9,containerWidth:t.width,containerHeight:t.height,position:{mx:.235,my:.315}}),{strokeWidth:1,fill:n?ge(t,p):ye(t,l),stroke:n?ye(t,l):ge(t,p)})},\"bpmn:TimerEventDefinition\":function(e,t){var n=x(e,t.width,t.height,.2*t.height,{strokeWidth:2,fill:ye(t,l),stroke:ge(t,p)});M(e,i.getScaledPath(\"EVENT_TIMER_WH\",{xScaleFactor:.75,yScaleFactor:.75,containerWidth:t.width,containerHeight:t.height,position:{mx:.5,my:.5}}),{strokeWidth:2,stroke:ge(t,p)});for(var r=0;r<12;r++){var o=i.getScaledPath(\"EVENT_TIMER_LINE\",{xScaleFactor:.75,yScaleFactor:.75,containerWidth:t.width,containerHeight:t.height,position:{mx:.5,my:.5}}),a=t.width/2;M(e,o,{strokeWidth:1,transform:\"rotate(\"+30*r+\",\"+t.height/2+\",\"+a+\")\",stroke:ge(t,p)})}return n},\"bpmn:EscalationEventDefinition\":function(e,t,n){return M(e,i.getScaledPath(\"EVENT_ESCALATION\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:.5,my:.2}}),{strokeWidth:1,fill:n?ge(t,p):\"none\",stroke:ge(t,p)})},\"bpmn:ConditionalEventDefinition\":function(e,t){return M(e,i.getScaledPath(\"EVENT_CONDITIONAL\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:.5,my:.222}}),{strokeWidth:1,stroke:ge(t,p)})},\"bpmn:LinkEventDefinition\":function(e,t,n){return M(e,i.getScaledPath(\"EVENT_LINK\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:.57,my:.263}}),{strokeWidth:1,fill:n?ge(t,p):\"none\",stroke:ge(t,p)})},\"bpmn:ErrorEventDefinition\":function(e,t,n){return M(e,i.getScaledPath(\"EVENT_ERROR\",{xScaleFactor:1.1,yScaleFactor:1.1,containerWidth:t.width,containerHeight:t.height,position:{mx:.2,my:.722}}),{strokeWidth:1,fill:n?ge(t,p):\"none\",stroke:ge(t,p)})},\"bpmn:CancelEventDefinition\":function(e,t,n){var r=M(e,i.getScaledPath(\"EVENT_CANCEL_45\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:.638,my:-.055}}),{strokeWidth:1,fill:n?ge(t,p):\"none\",stroke:ge(t,p)});return function(e,t){var n=Z();n.setRotate(t,0,0),ae(e,n)}(r,45),r},\"bpmn:CompensateEventDefinition\":function(e,t,n){return M(e,i.getScaledPath(\"EVENT_COMPENSATION\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:.22,my:.5}}),{strokeWidth:1,fill:n?ge(t,p):\"none\",stroke:ge(t,p)})},\"bpmn:SignalEventDefinition\":function(e,t,n){return M(e,i.getScaledPath(\"EVENT_SIGNAL\",{xScaleFactor:.9,yScaleFactor:.9,containerWidth:t.width,containerHeight:t.height,position:{mx:.5,my:.2}}),{strokeWidth:1,fill:n?ge(t,p):\"none\",stroke:ge(t,p)})},\"bpmn:MultipleEventDefinition\":function(e,t,n){return M(e,i.getScaledPath(\"EVENT_MULTIPLE\",{xScaleFactor:1.1,yScaleFactor:1.1,containerWidth:t.width,containerHeight:t.height,position:{mx:.222,my:.36}}),{strokeWidth:1,fill:n?ge(t,p):\"none\"})},\"bpmn:ParallelMultipleEventDefinition\":function(e,t){return M(e,i.getScaledPath(\"EVENT_PARALLEL_MULTIPLE\",{xScaleFactor:1.2,yScaleFactor:1.2,containerWidth:t.width,containerHeight:t.height,position:{mx:.458,my:.194}}),{strokeWidth:1,fill:ge(t,p),stroke:ge(t,p)})},\"bpmn:EndEvent\":function(e,t,n){var i=P(\"bpmn:Event\")(e,t,{strokeWidth:4,fill:ye(t,l),stroke:ge(t,p)});return n&&!1===n.renderIcon||O(t,e),i},\"bpmn:TerminateEventDefinition\":function(e,t){return x(e,t.width,t.height,8,{strokeWidth:4,fill:ge(t,p),stroke:ge(t,p)})},\"bpmn:IntermediateEvent\":function(e,t,n){var i=P(\"bpmn:Event\")(e,t,{strokeWidth:1.5,fill:ye(t,l),stroke:ge(t,p)});return x(e,t.width,t.height,3,{strokeWidth:1.5,fill:ye(t,\"none\"),stroke:ge(t,p)}),n&&!1===n.renderIcon||O(t,e),i},\"bpmn:IntermediateCatchEvent\":D(\"bpmn:IntermediateEvent\"),\"bpmn:IntermediateThrowEvent\":D(\"bpmn:IntermediateEvent\"),\"bpmn:Activity\":function(e,t,n){return\"fillOpacity\"in(n=n||{})||(n.fillOpacity=Je),b(e,t.width,t.height,10,n)},\"bpmn:Task\":function(e,t){var n={fill:ye(t,l),stroke:ge(t,p)},i=P(\"bpmn:Activity\")(e,t,n);return L(e,t,\"center-middle\"),W(e,t),i},\"bpmn:ServiceTask\":function(e,t){var n=P(\"bpmn:Task\")(e,t);return M(e,i.getScaledPath(\"TASK_TYPE_SERVICE\",{abspos:{x:12,y:18}}),{strokeWidth:1,fill:ye(t,l),stroke:ge(t,p)}),M(e,i.getScaledPath(\"TASK_TYPE_SERVICE_FILL\",{abspos:{x:17.2,y:18}}),{strokeWidth:0,fill:ye(t,l)}),M(e,i.getScaledPath(\"TASK_TYPE_SERVICE\",{abspos:{x:17,y:22}}),{strokeWidth:1,fill:ye(t,l),stroke:ge(t,p)}),n},\"bpmn:UserTask\":function(e,t){var n=P(\"bpmn:Task\")(e,t);return M(e,i.getScaledPath(\"TASK_TYPE_USER_1\",{abspos:{x:15,y:12}}),{strokeWidth:.5,fill:ye(t,l),stroke:ge(t,p)}),M(e,i.getScaledPath(\"TASK_TYPE_USER_2\",{abspos:{x:15,y:12}}),{strokeWidth:.5,fill:ye(t,l),stroke:ge(t,p)}),M(e,i.getScaledPath(\"TASK_TYPE_USER_3\",{abspos:{x:15,y:12}}),{strokeWidth:.5,fill:ge(t,p),stroke:ge(t,p)}),n},\"bpmn:ManualTask\":function(e,t){var n=P(\"bpmn:Task\")(e,t);return M(e,i.getScaledPath(\"TASK_TYPE_MANUAL\",{abspos:{x:17,y:15}}),{strokeWidth:.5,fill:ye(t,l),stroke:ge(t,p)}),n},\"bpmn:SendTask\":function(e,t){var n=P(\"bpmn:Task\")(e,t);return M(e,i.getScaledPath(\"TASK_TYPE_SEND\",{xScaleFactor:1,yScaleFactor:1,containerWidth:21,containerHeight:14,position:{mx:.285,my:.357}}),{strokeWidth:1,fill:ge(t,p),stroke:ye(t,l)}),n},\"bpmn:ReceiveTask\":function(e,t){var n,r=S(t),o=P(\"bpmn:Task\")(e,t);return r.instantiate?(x(e,28,28,4.4,{strokeWidth:1}),n=i.getScaledPath(\"TASK_TYPE_INSTANTIATING_SEND\",{abspos:{x:7.77,y:9.52}})):n=i.getScaledPath(\"TASK_TYPE_SEND\",{xScaleFactor:.9,yScaleFactor:.9,containerWidth:21,containerHeight:14,position:{mx:.3,my:.4}}),M(e,n,{strokeWidth:1,fill:ye(t,l),stroke:ge(t,p)}),o},\"bpmn:ScriptTask\":function(e,t){var n=P(\"bpmn:Task\")(e,t);return M(e,i.getScaledPath(\"TASK_TYPE_SCRIPT\",{abspos:{x:15,y:20}}),{strokeWidth:1,stroke:ge(t,p)}),n},\"bpmn:BusinessRuleTask\":function(e,t){var n=P(\"bpmn:Task\")(e,t);return j(M(e,i.getScaledPath(\"TASK_TYPE_BUSINESS_RULE_HEADER\",{abspos:{x:8,y:8}})),{strokeWidth:1,fill:ye(t,\"#aaaaaa\"),stroke:ge(t,p)}),j(M(e,i.getScaledPath(\"TASK_TYPE_BUSINESS_RULE_MAIN\",{abspos:{x:8,y:8}})),{strokeWidth:1,stroke:ge(t,p)}),n},\"bpmn:SubProcess\":function(e,t,n){n={fill:ye(t,l),stroke:ge(t,p),...n};var i=P(\"bpmn:Activity\")(e,t,n),r=C(t);return function(e){return e&&!!S(e).triggeredByEvent}(t)&&j(i,{strokeDasharray:\"0, 5.5\",strokeWidth:2.5}),L(e,t,r?\"center-top\":\"center-middle\"),r?W(e,t):W(e,t,[\"SubProcessMarker\"]),i},\"bpmn:AdHocSubProcess\":function(e,t){return P(\"bpmn:SubProcess\")(e,t)},\"bpmn:Transaction\":function(e,t){var i=P(\"bpmn:SubProcess\")(e,t,{strokeWidth:1.5}),r=n.style([\"no-fill\",\"no-events\"],{stroke:ge(t,p),strokeWidth:1.5});return b(e,t.width,t.height,7,3,r),i},\"bpmn:CallActivity\":function(e,t){return P(\"bpmn:SubProcess\")(e,t,{strokeWidth:5})},\"bpmn:Participant\":function(e,t){var n={fillOpacity:Je,fill:ye(t,l),stroke:ge(t,p),strokeWidth:1.5},i=P(\"bpmn:Lane\")(e,t,n);C(t)?(w(e,[{x:30,y:0},{x:30,y:t.height}],{stroke:ge(t,p),strokeWidth:1.5}),I(e,S(t).name,t)):B(e,S(t).name,{box:t,align:\"center-middle\",style:{fill:ve(t,c,p)}});return!!S(t).participantMultiplicity&&P(\"ParticipantMultiplicityMarker\")(e,t),i},\"bpmn:Lane\":function(e,t,n){var i=b(e,t.width,t.height,0,{fill:ye(t,l),fillOpacity:.35,stroke:ge(t,p),strokeWidth:1.5,...n}),r=S(t);\"bpmn:Lane\"===r.$type&&I(e,r.name,t);return i},\"bpmn:InclusiveGateway\":function(e,t){var n=P(\"bpmn:Gateway\")(e,t);return x(e,t.width,t.height,.24*t.height,{strokeWidth:2.5,fill:ye(t,l),stroke:ge(t,p)}),n},\"bpmn:ExclusiveGateway\":function(e,t){var n=P(\"bpmn:Gateway\")(e,t),r=i.getScaledPath(\"GATEWAY_EXCLUSIVE\",{xScaleFactor:.4,yScaleFactor:.4,containerWidth:t.width,containerHeight:t.height,position:{mx:.32,my:.3}});return R(t).isMarkerVisible&&M(e,r,{strokeWidth:1,fill:ge(t,p),stroke:ge(t,p)}),n},\"bpmn:ComplexGateway\":function(e,t){var n=P(\"bpmn:Gateway\")(e,t);return M(e,i.getScaledPath(\"GATEWAY_COMPLEX\",{xScaleFactor:.5,yScaleFactor:.5,containerWidth:t.width,containerHeight:t.height,position:{mx:.46,my:.26}}),{strokeWidth:1,fill:ge(t,p),stroke:ge(t,p)}),n},\"bpmn:ParallelGateway\":function(e,t){var n=P(\"bpmn:Gateway\")(e,t);return M(e,i.getScaledPath(\"GATEWAY_PARALLEL\",{xScaleFactor:.6,yScaleFactor:.6,containerWidth:t.width,containerHeight:t.height,position:{mx:.46,my:.2}}),{strokeWidth:1,fill:ge(t,p),stroke:ge(t,p)}),n},\"bpmn:EventBasedGateway\":function(e,t){var n=S(t),r=P(\"bpmn:Gateway\")(e,t);x(e,t.width,t.height,.2*t.height,{strokeWidth:1,fill:\"none\",stroke:ge(t,p)});var o=n.eventGatewayType,a=!!n.instantiate;if(\"Parallel\"===o){var s=i.getScaledPath(\"GATEWAY_PARALLEL\",{xScaleFactor:.4,yScaleFactor:.4,containerWidth:t.width,containerHeight:t.height,position:{mx:.474,my:.296}});M(e,s,{strokeWidth:1,fill:\"none\"})}else\"Exclusive\"===o&&(a||x(e,t.width,t.height,.26*t.height,{strokeWidth:1,fill:\"none\",stroke:ge(t,p)}),function(){var n=i.getScaledPath(\"GATEWAY_EVENT_BASED\",{xScaleFactor:.18,yScaleFactor:.18,containerWidth:t.width,containerHeight:t.height,position:{mx:.36,my:.44}});M(e,n,{strokeWidth:2,fill:ye(t,\"none\"),stroke:ge(t,p)})}());return r},\"bpmn:Gateway\":function(e,t){return function(e,t,n,i){var r=t/2,o=n/2,a=[{x:r,y:0},{x:t,y:o},{x:r,y:n},{x:0,y:o}].map((function(e){return e.x+\",\"+e.y})).join(\" \");i=f(i);var s=U(\"polygon\",{...i,points:a});return N(e,s),s}(e,t.width,t.height,{fill:ye(t,l),fillOpacity:Je,stroke:ge(t,p)})},\"bpmn:SequenceFlow\":function(e,t){var n,i=ye(t,l),r=ge(t,p),o=A(e,t.waypoints,{markerEnd:v(\"sequenceflow-end\",i,r),stroke:ge(t,p)}),a=S(t);return t.source&&(n=t.source.businessObject,a.conditionExpression&&n.$instanceOf(\"bpmn:Activity\")&&j(o,{markerStart:v(\"conditional-flow-marker\",i,r)}),n.default&&(n.$instanceOf(\"bpmn:Gateway\")||n.$instanceOf(\"bpmn:Activity\"))&&n.default===a&&j(o,{markerStart:v(\"conditional-default-flow-marker\",i,r)})),o},\"bpmn:Association\":function(e,t,n){var i=S(t),r=ye(t,l),o=ge(t,p);return n={strokeDasharray:\"0, 5\",stroke:ge(t,p),...n},\"One\"!==i.associationDirection&&\"Both\"!==i.associationDirection||(n.markerEnd=v(\"association-end\",r,o)),\"Both\"===i.associationDirection&&(n.markerStart=v(\"association-start\",r,o)),A(e,t.waypoints,n)},\"bpmn:DataInputAssociation\":function(e,t){var n=ye(t,l),i=ge(t,p);return P(\"bpmn:Association\")(e,t,{markerEnd:v(\"association-end\",n,i)})},\"bpmn:DataOutputAssociation\":function(e,t){var n=ye(t,l),i=ge(t,p);return P(\"bpmn:Association\")(e,t,{markerEnd:v(\"association-end\",n,i)})},\"bpmn:MessageFlow\":function(e,t){var n=S(t),r=R(t),o=ye(t,l),a=ge(t,p),s=A(e,t.waypoints,{markerEnd:v(\"messageflow-end\",o,a),markerStart:v(\"messageflow-start\",o,a),strokeDasharray:\"10, 11\",strokeWidth:1.5,stroke:ge(t,p)});if(n.messageRef){var u=s.getPointAtLength(s.getTotalLength()/2),h=i.getScaledPath(\"MESSAGE_FLOW_MARKER\",{abspos:{x:u.x,y:u.y}}),m={strokeWidth:1};\"initiating\"===r.messageVisibleKind?(m.fill=\"white\",m.stroke=fe):(m.fill=\"#888\",m.stroke=\"white\");var f=M(e,h,m),d=B(e,n.messageRef.name,{align:\"center-top\",fitBox:!0,style:{fill:ge(t,c)}}),y=f.getBBox(),g=d.getBBox();Ue(d,u.x-g.width/2,u.y+y.height/2+10,0)}return s},\"bpmn:DataObject\":function(e,t){var n=M(e,i.getScaledPath(\"DATA_OBJECT_PATH\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:.474,my:.296}}),{fill:ye(t,l),fillOpacity:Je,stroke:ge(t,p)});return function(e){var t=e.dataObjectRef;return e.isCollection||t&&t.isCollection}(S(t))&&function(e,t){var n=(t.height-18)/t.height,r=i.getScaledPath(\"DATA_OBJECT_COLLECTION_PATH\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:.33,my:n}});M(e,r,{strokeWidth:2})}(e,t),n},\"bpmn:DataObjectReference\":D(\"bpmn:DataObject\"),\"bpmn:DataInput\":function(e,t){var n=i.getRawPath(\"DATA_ARROW\"),r=P(\"bpmn:DataObject\")(e,t);return M(e,n,{strokeWidth:1}),r},\"bpmn:DataOutput\":function(e,t){var n=i.getRawPath(\"DATA_ARROW\"),r=P(\"bpmn:DataObject\")(e,t);return M(e,n,{strokeWidth:1,fill:fe}),r},\"bpmn:DataStoreReference\":function(e,t){return M(e,i.getScaledPath(\"DATA_STORE\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:0,my:.133}}),{strokeWidth:2,fill:ye(t,l),fillOpacity:Je,stroke:ge(t,p)})},\"bpmn:BoundaryEvent\":function(e,t,n){var i=S(t).cancelActivity,r={strokeWidth:1.5,fill:ye(t,l),stroke:ge(t,p)};i||(r.strokeDasharray=\"6\");var o={...r,fillOpacity:1},a={...r,fill:\"none\"},s=P(\"bpmn:Event\")(e,t,o);return x(e,t.width,t.height,3,a),n&&!1===n.renderIcon||O(t,e),s},\"bpmn:Group\":function(e,t){return b(e,t.width,t.height,10,{stroke:ge(t,p),strokeWidth:1.5,strokeDasharray:\"10,6,0,6\",fill:\"none\",pointerEvents:\"none\"})},label:function(e,t){return function(e,t){var n={width:90,height:30,x:t.width/2+t.x,y:t.height/2+t.y};return B(e,T(t),{box:n,fitBox:!0,style:E({},a.getExternalStyle(),{fill:ve(t,c,p)})})}(e,t)},\"bpmn:TextAnnotation\":function(e,t){var n=b(e,t.width,t.height,0,0,{fill:\"none\",stroke:\"none\"});return M(e,i.getScaledPath(\"TEXT_ANNOTATION\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:0,my:0}}),{stroke:ge(t,p)}),B(e,S(t).text||\"\",{box:t,align:\"left-top\",padding:7,style:{fill:ve(t,c,p)}}),n},ParticipantMultiplicityMarker:function(e,t){k(\"participant-multiplicity\",e,i.getScaledPath(\"MARKER_PARALLEL\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:t.width/2/t.width,my:(t.height-15)/t.height}}),{strokeWidth:2,fill:ye(t,l),stroke:ge(t,p)})},SubProcessMarker:function(e,t){qe(b(e,14,14,0,{strokeWidth:1,fill:ye(t,l),stroke:ge(t,p)}),t.width/2-7.5,t.height-20),k(\"sub-process\",e,i.getScaledPath(\"MARKER_SUB_PROCESS\",{xScaleFactor:1.5,yScaleFactor:1.5,containerWidth:t.width,containerHeight:t.height,position:{mx:(t.width/2-7.5)/t.width,my:(t.height-20)/t.height}}),{fill:ye(t,l),stroke:ge(t,p)})},ParallelMarker:function(e,t,n){k(\"parallel\",e,i.getScaledPath(\"MARKER_PARALLEL\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:(t.width/2+n.parallel)/t.width,my:(t.height-20)/t.height}}),{fill:ye(t,l),stroke:ge(t,p)})},SequentialMarker:function(e,t,n){k(\"sequential\",e,i.getScaledPath(\"MARKER_SEQUENTIAL\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:(t.width/2+n.seq)/t.width,my:(t.height-19)/t.height}}),{fill:ye(t,l),stroke:ge(t,p)})},CompensationMarker:function(e,t,n){k(\"compensation\",e,i.getScaledPath(\"MARKER_COMPENSATION\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:(t.width/2+n.compensation)/t.width,my:(t.height-13)/t.height}}),{strokeWidth:1,fill:ye(t,l),stroke:ge(t,p)})},LoopMarker:function(e,t,n){k(\"loop\",e,i.getScaledPath(\"MARKER_LOOP\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:(t.width/2+n.loop)/t.width,my:(t.height-7)/t.height}}),{strokeWidth:1.5,fill:ye(t,l),stroke:ge(t,p),strokeMiterlimit:.5})},AdhocMarker:function(e,t,n){k(\"adhoc\",e,i.getScaledPath(\"MARKER_ADHOC\",{xScaleFactor:1,yScaleFactor:1,containerWidth:t.width,containerHeight:t.height,position:{mx:(t.width/2+n.adhoc)/t.width,my:(t.height-15)/t.height}}),{strokeWidth:1,fill:ge(t,p),stroke:ge(t,p)})}};function W(e,t,n){var i,r=S(t),o=n&&-1!==n.indexOf(\"SubProcessMarker\");i=o?{seq:-21,parallel:-22,compensation:-42,loop:-18,adhoc:10}:{seq:-3,parallel:-6,compensation:-27,loop:0,adhoc:10},h(n,(function(n){P(n)(e,t,i)})),r.isForCompensation&&P(\"CompensationMarker\")(e,t,i),\"bpmn:AdHocSubProcess\"===r.$type&&P(\"AdhocMarker\")(e,t,i);var a=r.loopCharacteristics,s=a&&a.isSequential;a&&(void 0===s&&P(\"LoopMarker\")(e,t,i),!1===s&&P(\"ParallelMarker\")(e,t,i),!0===s&&P(\"SequentialMarker\")(e,t,i))}this._drawPath=M,this._renderer=P}e(Qe,_),Qe.$inject=[\"config.bpmnRenderer\",\"eventBus\",\"styles\",\"pathMap\",\"canvas\",\"textRenderer\"],Qe.prototype.canRender=function(e){return A(e,\"bpmn:BaseElement\")},Qe.prototype.drawShape=function(e,t){var n=t.type;return this._renderer(n)(e,t)},Qe.prototype.drawConnection=function(e,t){var n=t.type;return this._renderer(n)(e,t)},Qe.prototype.getShapePath=function(e){return A(e,\"bpmn:Event\")?(n=(t=e).x+t.width/2,i=t.y+t.height/2,r=t.width/2,se([[\"M\",n,i],[\"m\",0,-r],[\"a\",r,r,0,1,1,0,2*r],[\"a\",r,r,0,1,1,0,-2*r],[\"z\"]])):A(e,\"bpmn:Activity\")?function(e,t){var n=e.x,i=e.y,r=e.width,o=e.height;return se([[\"M\",n+t,i],[\"l\",r-2*t,0],[\"a\",t,t,0,0,1,t,t],[\"l\",0,o-2*t],[\"a\",t,t,0,0,1,-t,t],[\"l\",2*t-r,0],[\"a\",t,t,0,0,1,-t,-t],[\"l\",0,2*t-o],[\"a\",t,t,0,0,1,t,-t],[\"z\"]])}(e,10):A(e,\"bpmn:Gateway\")?function(e){var t=e.width/2,n=e.height/2;return se([[\"M\",e.x+t,e.y],[\"l\",t,n],[\"l\",-t,n],[\"l\",-t,-n],[\"z\"]])}(e):function(e){var t=e.x,n=e.y,i=e.width;return se([[\"M\",t,n],[\"l\",i,0],[\"l\",0,e.height],[\"l\",-i,0],[\"z\"]])}(e);var t,n,i,r};var et=0,tt={width:150,height:50};function nt(e,t){var n;t.textContent=e;try{var i,r=\"\"===e;return t.textContent=r?\"dummy\":e,i={width:(n=t.getBBox()).width+2*n.x,height:n.height},r&&(i.width=0),i}catch(e){return{width:0,height:0}}}function it(e,t,n){for(var i,r=e.shift(),o=r;;){if((i=nt(o,n)).width=o?i.width:0,\" \"===o||\"\"===o||i.width<Math.round(t)||o.length<2)return rt(e,o,r,i);o=at(o,i.width,t)}}function rt(e,t,n,i){if(t.length<n.length){var r=n.slice(t.length).trim();e.unshift(r)}return{width:i.width,height:i.height,text:t}}var ot=\"­\";function at(e,t,n){var i=Math.max(e.length*(n/t),1),r=function(e,t){var n,i=e.split(/(\\s|-|\\u00AD)/g),r=[],o=0;if(i.length>1)for(;n=i.shift();){if(!(n.length+o<t)){\"-\"!==n&&n!==ot||r.pop();break}r.push(n),o+=n.length}var a=r[r.length-1];return a&&a===ot&&(r[r.length-1]=\"-\"),r.join(\"\")}(e,i);return r||(r=e.slice(0,Math.max(Math.round(i-1),1))),r}function st(e){this._config=E({},{size:tt,padding:et,style:{},align:\"center-top\"},e||{})}st.prototype.createText=function(e,t){return this.layoutText(e,t).element},st.prototype.getDimensions=function(e,t){return this.layoutText(e,t).dimensions},st.prototype.layoutText=function(e,t){var n=E({},this._config.size,t.box),i=E({},this._config.style,t.style),r=function(e){var t=e.split(\"-\");return{horizontal:t[0]||\"center\",vertical:t[1]||\"top\"}}(t.align||this._config.align),a=function(e){return o(e)?E({top:0,left:0,right:0,bottom:0},e):{top:e,left:e,right:e,bottom:e}}(void 0!==t.padding?t.padding:this._config.padding),s=t.fitBox||!1,l=function(e){if(\"fontSize\"in e&&\"lineHeight\"in e)return e.lineHeight*parseInt(e.fontSize,10)}(i),p=e.split(/\\u00AD?\\r?\\n/),c=[],u=n.width-a.left-a.right,f=U(\"text\");for(j(f,{x:0,y:0}),j(f,i),N(function(){var e=document.getElementById(\"helper-svg\");return e||(j(e=U(\"svg\"),{id:\"helper-svg\"}),Re(e,{visibility:\"hidden\",position:\"fixed\",width:0,height:0}),document.body.appendChild(e)),e}(),f);p.length;)c.push(it(p,u,f));\"middle\"===r.vertical&&(a.top=a.bottom=0);var d=m(c,(function(e,t,n){return e+(l||t.height)}),0)+a.top+a.bottom,y=m(c,(function(e,t,n){return t.width>e?t.width:e}),0),g=a.top;\"middle\"===r.vertical&&(g+=(n.height-d)/2),g-=(l||c[0].height)/4;var v=U(\"text\");return j(v,i),h(c,(function(e){var t;switch(g+=l||e.height,r.horizontal){case\"left\":t=a.left;break;case\"right\":t=(s?y:u)-a.right-e.width;break;default:t=Math.max(((s?y:u)-e.width)/2+a.left,0)}var n=U(\"tspan\");j(n,{x:t,y:g}),n.textContent=e.text,N(v,n)})),z(f),{dimensions:{width:y,height:d},element:v}};function lt(e){var t=E({fontFamily:\"Arial, sans-serif\",fontSize:12,fontWeight:\"normal\",lineHeight:1.2},e&&e.defaultStyle||{}),n=parseInt(t.fontSize,10)-1,i=E({},t,{fontSize:n},e&&e.externalStyle||{}),r=new st({style:t});this.getExternalLabelBounds=function(e,t){var n=r.getDimensions(t,{box:{width:90,height:30},style:i});return{x:Math.round(e.x+e.width/2-n.width/2),y:Math.round(e.y),width:Math.ceil(n.width),height:Math.ceil(n.height)}},this.getTextAnnotationBounds=function(e,n){var i=r.getDimensions(n,{box:e,style:t,align:\"left-top\",padding:5});return{x:e.x,y:e.y,width:e.width,height:Math.max(30,Math.round(i.height))}},this.createText=function(e,t){return r.createText(e,t||{})},this.getDefaultStyle=function(){return t},this.getExternalStyle=function(){return i}}lt.$inject=[\"config.textRenderer\"];var pt=/\\{([^{}]+)\\}/g,ct=/(?:(?:^|\\.)(.+?)(?=\\[|\\.|$|\\()|\\[('|\")(.+?)\\2\\])(\\(\\))?/g;var ut={__init__:[\"bpmnRenderer\"],bpmnRenderer:[\"type\",Qe],textRenderer:[\"type\",lt],pathMap:[\"type\",function(){this.pathMap={EVENT_MESSAGE:{d:\"m {mx},{my} l 0,{e.y1} l {e.x1},0 l 0,-{e.y1} z l {e.x0},{e.y0} l {e.x0},-{e.y0}\",height:36,width:36,heightElements:[6,14],widthElements:[10.5,21]},EVENT_SIGNAL:{d:\"M {mx},{my} l {e.x0},{e.y0} l -{e.x1},0 Z\",height:36,width:36,heightElements:[18],widthElements:[10,20]},EVENT_ESCALATION:{d:\"M {mx},{my} l {e.x0},{e.y0} l -{e.x0},-{e.y1} l -{e.x0},{e.y1} Z\",height:36,width:36,heightElements:[20,7],widthElements:[8]},EVENT_CONDITIONAL:{d:\"M {e.x0},{e.y0} l {e.x1},0 l 0,{e.y2} l -{e.x1},0 Z M {e.x2},{e.y3} l {e.x0},0 M {e.x2},{e.y4} l {e.x0},0 M {e.x2},{e.y5} l {e.x0},0 M {e.x2},{e.y6} l {e.x0},0 M {e.x2},{e.y7} l {e.x0},0 M {e.x2},{e.y8} l {e.x0},0 \",height:36,width:36,heightElements:[8.5,14.5,18,11.5,14.5,17.5,20.5,23.5,26.5],widthElements:[10.5,14.5,12.5]},EVENT_LINK:{d:\"m {mx},{my} 0,{e.y0} -{e.x1},0 0,{e.y1} {e.x1},0 0,{e.y0} {e.x0},-{e.y2} -{e.x0},-{e.y2} z\",height:36,width:36,heightElements:[4.4375,6.75,7.8125],widthElements:[9.84375,13.5]},EVENT_ERROR:{d:\"m {mx},{my} {e.x0},-{e.y0} {e.x1},-{e.y1} {e.x2},{e.y2} {e.x3},-{e.y3} -{e.x4},{e.y4} -{e.x5},-{e.y5} z\",height:36,width:36,heightElements:[.023,8.737,8.151,16.564,10.591,8.714],widthElements:[.085,6.672,6.97,4.273,5.337,6.636]},EVENT_CANCEL_45:{d:\"m {mx},{my} -{e.x1},0 0,{e.x0} {e.x1},0 0,{e.y1} {e.x0},0 0,-{e.y1} {e.x1},0 0,-{e.y0} -{e.x1},0 0,-{e.y1} -{e.x0},0 z\",height:36,width:36,heightElements:[4.75,8.5],widthElements:[4.75,8.5]},EVENT_COMPENSATION:{d:\"m {mx},{my} {e.x0},-{e.y0} 0,{e.y1} z m {e.x1},-{e.y2} {e.x2},-{e.y3} 0,{e.y1} -{e.x2},-{e.y3} z\",height:36,width:36,heightElements:[6.5,13,.4,6.1],widthElements:[9,9.3,8.7]},EVENT_TIMER_WH:{d:\"M {mx},{my} l {e.x0},-{e.y0} m -{e.x0},{e.y0} l {e.x1},{e.y1} \",height:36,width:36,heightElements:[10,2],widthElements:[3,7]},EVENT_TIMER_LINE:{d:\"M {mx},{my} m {e.x0},{e.y0} l -{e.x1},{e.y1} \",height:36,width:36,heightElements:[10,3],widthElements:[0,0]},EVENT_MULTIPLE:{d:\"m {mx},{my} {e.x1},-{e.y0} {e.x1},{e.y0} -{e.x0},{e.y1} -{e.x2},0 z\",height:36,width:36,heightElements:[6.28099,12.56199],widthElements:[3.1405,9.42149,12.56198]},EVENT_PARALLEL_MULTIPLE:{d:\"m {mx},{my} {e.x0},0 0,{e.y1} {e.x1},0 0,{e.y0} -{e.x1},0 0,{e.y1} -{e.x0},0 0,-{e.y1} -{e.x1},0 0,-{e.y0} {e.x1},0 z\",height:36,width:36,heightElements:[2.56228,7.68683],widthElements:[2.56228,7.68683]},GATEWAY_EXCLUSIVE:{d:\"m {mx},{my} {e.x0},{e.y0} {e.x1},{e.y0} {e.x2},0 {e.x4},{e.y2} {e.x4},{e.y1} {e.x2},0 {e.x1},{e.y3} {e.x0},{e.y3} {e.x3},0 {e.x5},{e.y1} {e.x5},{e.y2} {e.x3},0 z\",height:17.5,width:17.5,heightElements:[8.5,6.5312,-6.5312,-8.5],widthElements:[6.5,-6.5,3,-3,5,-5]},GATEWAY_PARALLEL:{d:\"m {mx},{my} 0,{e.y1} -{e.x1},0 0,{e.y0} {e.x1},0 0,{e.y1} {e.x0},0 0,-{e.y1} {e.x1},0 0,-{e.y0} -{e.x1},0 0,-{e.y1} -{e.x0},0 z\",height:30,width:30,heightElements:[5,12.5],widthElements:[5,12.5]},GATEWAY_EVENT_BASED:{d:\"m {mx},{my} {e.x0},{e.y0} {e.x0},{e.y1} {e.x1},{e.y2} {e.x2},0 z\",height:11,width:11,heightElements:[-6,6,12,-12],widthElements:[9,-3,-12]},GATEWAY_COMPLEX:{d:\"m {mx},{my} 0,{e.y0} -{e.x0},-{e.y1} -{e.x1},{e.y2} {e.x0},{e.y1} -{e.x2},0 0,{e.y3} {e.x2},0  -{e.x0},{e.y1} l {e.x1},{e.y2} {e.x0},-{e.y1} 0,{e.y0} {e.x3},0 0,-{e.y0} {e.x0},{e.y1} {e.x1},-{e.y2} -{e.x0},-{e.y1} {e.x2},0 0,-{e.y3} -{e.x2},0 {e.x0},-{e.y1} -{e.x1},-{e.y2} -{e.x0},{e.y1} 0,-{e.y0} -{e.x3},0 z\",height:17.125,width:17.125,heightElements:[4.875,3.4375,2.125,3],widthElements:[3.4375,2.125,4.875,3]},DATA_OBJECT_PATH:{d:\"m 0,0 {e.x1},0 {e.x0},{e.y0} 0,{e.y1} -{e.x2},0 0,-{e.y2} {e.x1},0 0,{e.y0} {e.x0},0\",height:61,width:51,heightElements:[10,50,60],widthElements:[10,40,50,60]},DATA_OBJECT_COLLECTION_PATH:{d:\"m{mx},{my} m 3,2 l 0,10 m 3,-10 l 0,10 m 3,-10 l 0,10\",height:10,width:10,heightElements:[],widthElements:[]},DATA_ARROW:{d:\"m 5,9 9,0 0,-3 5,5 -5,5 0,-3 -9,0 z\",height:61,width:51,heightElements:[],widthElements:[]},DATA_STORE:{d:\"m  {mx},{my} l  0,{e.y2} c  {e.x0},{e.y1} {e.x1},{e.y1}  {e.x2},0 l  0,-{e.y2} c -{e.x0},-{e.y1} -{e.x1},-{e.y1} -{e.x2},0c  {e.x0},{e.y1} {e.x1},{e.y1}  {e.x2},0 m  -{e.x2},{e.y0}c  {e.x0},{e.y1} {e.x1},{e.y1} {e.x2},0m  -{e.x2},{e.y0}c  {e.x0},{e.y1} {e.x1},{e.y1}  {e.x2},0\",height:61,width:61,heightElements:[7,10,45],widthElements:[2,58,60]},TEXT_ANNOTATION:{d:\"m {mx}, {my} m 10,0 l -10,0 l 0,{e.y0} l 10,0\",height:30,width:10,heightElements:[30],widthElements:[10]},MARKER_SUB_PROCESS:{d:\"m{mx},{my} m 7,2 l 0,10 m -5,-5 l 10,0\",height:10,width:10,heightElements:[],widthElements:[]},MARKER_PARALLEL:{d:\"m{mx},{my} m 3,2 l 0,10 m 3,-10 l 0,10 m 3,-10 l 0,10\",height:10,width:10,heightElements:[],widthElements:[]},MARKER_SEQUENTIAL:{d:\"m{mx},{my} m 0,3 l 10,0 m -10,3 l 10,0 m -10,3 l 10,0\",height:10,width:10,heightElements:[],widthElements:[]},MARKER_COMPENSATION:{d:\"m {mx},{my} 7,-5 0,10 z m 7.1,-0.3 6.9,-4.7 0,10 -6.9,-4.7 z\",height:10,width:21,heightElements:[],widthElements:[]},MARKER_LOOP:{d:\"m {mx},{my} c 3.526979,0 6.386161,-2.829858 6.386161,-6.320661 0,-3.490806 -2.859182,-6.320661 -6.386161,-6.320661 -3.526978,0 -6.38616,2.829855 -6.38616,6.320661 0,1.745402 0.714797,3.325567 1.870463,4.469381 0.577834,0.571908 1.265885,1.034728 2.029916,1.35457 l -0.718163,-3.909793 m 0.718163,3.909793 -3.885211,0.802902\",height:13.9,width:13.7,heightElements:[],widthElements:[]},MARKER_ADHOC:{d:\"m {mx},{my} m 0.84461,2.64411 c 1.05533,-1.23780996 2.64337,-2.07882 4.29653,-1.97997996 2.05163,0.0805 3.85579,1.15803 5.76082,1.79107 1.06385,0.34139996 2.24454,0.1438 3.18759,-0.43767 0.61743,-0.33642 1.2775,-0.64078 1.7542,-1.17511 0,0.56023 0,1.12046 0,1.6807 -0.98706,0.96237996 -2.29792,1.62393996 -3.6918,1.66181996 -1.24459,0.0927 -2.46671,-0.2491 -3.59505,-0.74812 -1.35789,-0.55965 -2.75133,-1.33436996 -4.27027,-1.18121996 -1.37741,0.14601 -2.41842,1.13685996 -3.44288,1.96782996 z\",height:4,width:15,heightElements:[],widthElements:[]},TASK_TYPE_SEND:{d:\"m {mx},{my} l 0,{e.y1} l {e.x1},0 l 0,-{e.y1} z l {e.x0},{e.y0} l {e.x0},-{e.y0}\",height:14,width:21,heightElements:[6,14],widthElements:[10.5,21]},TASK_TYPE_SCRIPT:{d:\"m {mx},{my} c 9.966553,-6.27276 -8.000926,-7.91932 2.968968,-14.938 l -8.802728,0 c -10.969894,7.01868 6.997585,8.66524 -2.968967,14.938 z m -7,-12 l 5,0 m -4.5,3 l 4.5,0 m -3,3 l 5,0m -4,3 l 5,0\",height:15,width:12.6,heightElements:[6,14],widthElements:[10.5,21]},TASK_TYPE_USER_1:{d:\"m {mx},{my} c 0.909,-0.845 1.594,-2.049 1.594,-3.385 0,-2.554 -1.805,-4.62199999 -4.357,-4.62199999 -2.55199998,0 -4.28799998,2.06799999 -4.28799998,4.62199999 0,1.348 0.974,2.562 1.89599998,3.405 -0.52899998,0.187 -5.669,2.097 -5.794,4.7560005 v 6.718 h 17 v -6.718 c 0,-2.2980005 -5.5279996,-4.5950005 -6.0509996,-4.7760005 zm -8,6 l 0,5.5 m 11,0 l 0,-5\"},TASK_TYPE_USER_2:{d:\"m {mx},{my} m 2.162,1.009 c 0,2.4470005 -2.158,4.4310005 -4.821,4.4310005 -2.66499998,0 -4.822,-1.981 -4.822,-4.4310005 \"},TASK_TYPE_USER_3:{d:\"m {mx},{my} m -6.9,-3.80 c 0,0 2.25099998,-2.358 4.27399998,-1.177 2.024,1.181 4.221,1.537 4.124,0.965 -0.098,-0.57 -0.117,-3.79099999 -4.191,-4.13599999 -3.57499998,0.001 -4.20799998,3.36699999 -4.20699998,4.34799999 z\"},TASK_TYPE_MANUAL:{d:\"m {mx},{my} c 0.234,-0.01 5.604,0.008 8.029,0.004 0.808,0 1.271,-0.172 1.417,-0.752 0.227,-0.898 -0.334,-1.314 -1.338,-1.316 -2.467,-0.01 -7.886,-0.004 -8.108,-0.004 -0.014,-0.079 0.016,-0.533 0,-0.61 0.195,-0.042 8.507,0.006 9.616,0.002 0.877,-0.007 1.35,-0.438 1.353,-1.208 0.003,-0.768 -0.479,-1.09 -1.35,-1.091 -2.968,-0.002 -9.619,-0.013 -9.619,-0.013 v -0.591 c 0,0 5.052,-0.016 7.225,-0.016 0.888,-0.002 1.354,-0.416 1.351,-1.193 -0.006,-0.761 -0.492,-1.196 -1.361,-1.196 -3.473,-0.005 -10.86,-0.003 -11.0829995,-0.003 -0.022,-0.047 -0.045,-0.094 -0.069,-0.139 0.3939995,-0.319 2.0409995,-1.626 2.4149995,-2.017 0.469,-0.4870005 0.519,-1.1650005 0.162,-1.6040005 -0.414,-0.511 -0.973,-0.5 -1.48,-0.236 -1.4609995,0.764 -6.5999995,3.6430005 -7.7329995,4.2710005 -0.9,0.499 -1.516,1.253 -1.882,2.19 -0.37000002,0.95 -0.17,2.01 -0.166,2.979 0.004,0.718 -0.27300002,1.345 -0.055,2.063 0.629,2.087 2.425,3.312 4.859,3.318 4.6179995,0.014 9.2379995,-0.139 13.8569995,-0.158 0.755,-0.004 1.171,-0.301 1.182,-1.033 0.012,-0.754 -0.423,-0.969 -1.183,-0.973 -1.778,-0.01 -5.824,-0.004 -6.04,-0.004 10e-4,-0.084 0.003,-0.586 10e-4,-0.67 z\"},TASK_TYPE_INSTANTIATING_SEND:{d:\"m {mx},{my} l 0,8.4 l 12.6,0 l 0,-8.4 z l 6.3,3.6 l 6.3,-3.6\"},TASK_TYPE_SERVICE:{d:\"m {mx},{my} v -1.71335 c 0.352326,-0.0705 0.703932,-0.17838 1.047628,-0.32133 0.344416,-0.14465 0.665822,-0.32133 0.966377,-0.52145 l 1.19431,1.18005 1.567487,-1.57688 -1.195028,-1.18014 c 0.403376,-0.61394 0.683079,-1.29908 0.825447,-2.01824 l 1.622133,-0.01 v -2.2196 l -1.636514,0.01 c -0.07333,-0.35153 -0.178319,-0.70024 -0.323564,-1.04372 -0.145244,-0.34406 -0.321407,-0.6644 -0.522735,-0.96217 l 1.131035,-1.13631 -1.583305,-1.56293 -1.129598,1.13589 c -0.614052,-0.40108 -1.302883,-0.68093 -2.022633,-0.82247 l 0.0093,-1.61852 h -2.241173 l 0.0042,1.63124 c -0.353763,0.0736 -0.705369,0.17977 -1.049785,0.32371 -0.344415,0.14437 -0.665102,0.32092 -0.9635006,0.52046 l -1.1698628,-1.15823 -1.5667691,1.5792 1.1684265,1.15669 c -0.4026573,0.61283 -0.68308,1.29797 -0.8247287,2.01713 l -1.6588041,0.003 v 2.22174 l 1.6724648,-0.006 c 0.073327,0.35077 0.1797598,0.70243 0.3242851,1.04472 0.1452428,0.34448 0.3214064,0.6644 0.5227339,0.96066 l -1.1993431,1.19723 1.5840256,1.56011 1.1964668,-1.19348 c 0.6140517,0.40346 1.3028827,0.68232 2.0233517,0.82331 l 7.19e-4,1.69892 h 2.226848 z m 0.221462,-3.9957 c -1.788948,0.7502 -3.8576,-0.0928 -4.6097055,-1.87438 -0.7521065,-1.78321 0.090598,-3.84627 1.8802645,-4.59604 1.78823,-0.74936 3.856881,0.0929 4.608987,1.87437 0.752106,1.78165 -0.0906,3.84612 -1.879546,4.59605 z\"},TASK_TYPE_SERVICE_FILL:{d:\"m {mx},{my} c -1.788948,0.7502 -3.8576,-0.0928 -4.6097055,-1.87438 -0.7521065,-1.78321 0.090598,-3.84627 1.8802645,-4.59604 1.78823,-0.74936 3.856881,0.0929 4.608987,1.87437 0.752106,1.78165 -0.0906,3.84612 -1.879546,4.59605 z\"},TASK_TYPE_BUSINESS_RULE_HEADER:{d:\"m {mx},{my} 0,4 20,0 0,-4 z\"},TASK_TYPE_BUSINESS_RULE_MAIN:{d:\"m {mx},{my} 0,12 20,0 0,-12 zm 0,8 l 20,0 m -13,-4 l 0,8\"},MESSAGE_FLOW_MARKER:{d:\"m {mx},{my} m -10.5 ,-7 l 0,14 l 21,0 l 0,-14 z l 10.5,6 l 10.5,-6\"}},this.getRawPath=function(e){return this.pathMap[e].d},this.getScaledPath=function(e,t){var n,i,r=this.pathMap[e];t.abspos?(n=t.abspos.x,i=t.abspos.y):(n=t.containerWidth*t.position.mx,i=t.containerHeight*t.position.my);var o={};if(t.position){for(var a=t.containerHeight/r.height*t.yScaleFactor,s=t.containerWidth/r.width*t.xScaleFactor,l=0;l<r.heightElements.length;l++)o[\"y\"+l]=r.heightElements[l]*a;for(var p=0;p<r.widthElements.length;p++)o[\"x\"+p]=r.widthElements[p]*s}var c,u,h=(c=r.d,u={mx:n,my:i,e:o},String(c).replace(pt,(function(e,t){return function(e,t,n){var i=n;return t.replace(ct,(function(e,t,n,r,o){t=t||r,i&&(t in i&&(i=i[t]),\"function\"==typeof i&&o&&(i=i()))})),i=(null==i||i==n?e:i)+\"\"}(e,t,u)})));return h}}]};var ht={translate:[\"value\",function(e,t){return t=t||{},e.replace(/{([^}]+)}/g,(function(e,n){return t[n]||\"{\"+n+\"}\"}))}]};function mt(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,\"default\")?e.default:e}function ft(e){return{top:e.y,right:e.x+(e.width||0),bottom:e.y+(e.height||0),left:e.x}}function dt(e){return t={x:e.x+(e.width||0)/2,y:e.y+(e.height||0)/2},{x:Math.round(t.x),y:Math.round(t.y)};var t}function yt(e){for(var t=e.waypoints,n=t.reduce((function(e,n,i){var r,o,a=t[i-1];if(a){var s=e[e.length-1],l=s&&s.endLength||0,p=(r=a,o=n,Math.sqrt(Math.pow(r.x-o.x,2)+Math.pow(r.y-o.y,2)));e.push({start:a,end:n,startLength:l,endLength:l+p,length:p})}return e}),[]),i=n.reduce((function(e,t){return e+t.length}),0)/2,r=0,o=n[r];o.endLength<i;)o=n[++r];var a=(i-o.startLength)/o.length;return{x:o.start.x+(o.end.x-o.start.x)*a,y:o.start.y+(o.end.y-o.start.y)*a}}function gt(e){return o(t=e)&&p(t,\"waypoints\")?yt(e):dt(e);var t}function vt(e){return e?\"<\"+e.$type+(e.id?' id=\"'+e.id:\"\")+'\" />':\"<null>\"}function xt(e,t,n){return E({id:e.id,type:e.$type,businessObject:e,di:t},n)}function bt(e,t,n){var i=e.waypoint;return!i||i.length<2?[gt(t),gt(n)]:i.map((function(e){return{x:e.x,y:e.y}}))}function Et(e,t,n,i){return new Error(e(\"element {element} referenced by {referenced}#{property} not yet drawn\",{element:vt(n),referenced:vt(t),property:i}))}function wt(e,t,n,i,r,o){this._eventBus=e,this._canvas=t,this._elementFactory=n,this._elementRegistry=i,this._translate=r,this._textRenderer=o}wt.$inject=[\"eventBus\",\"canvas\",\"elementFactory\",\"elementRegistry\",\"translate\",\"textRenderer\"],wt.prototype.add=function(e,t,n){var i,r,o,a,s,l,p,c=this._translate;if(A(t,\"bpmndi:BPMNPlane\")){var u=A(e,\"bpmn:SubProcess\")?{id:e.id+\"_plane\"}:{};i=this._elementFactory.createRoot(xt(e,t,u)),this._canvas.addRootElement(i)}else if(A(t,\"bpmndi:BPMNShape\")){var h=!C(e,t),m=function(e){return A(e,\"bpmn:Group\")}(e);r=n&&(n.hidden||n.collapsed);var f=t.bounds;i=this._elementFactory.createShape(xt(e,t,{collapsed:h,hidden:r,x:Math.round(f.x),y:Math.round(f.y),width:Math.round(f.width),height:Math.round(f.height),isFrame:m})),A(e,\"bpmn:BoundaryEvent\")&&this._attachBoundary(e,i),A(e,\"bpmn:Lane\")&&(o=0),A(e,\"bpmn:DataStoreReference\")&&(a=n,s=gt(f),l=s.x,p=s.y,l>=a.x&&l<=a.x+a.width&&p>=a.y&&p<=a.y+a.height||(n=this._canvas.findRoot(n))),this._canvas.addShape(i,n,o)}else{if(!A(t,\"bpmndi:BPMNEdge\"))throw new Error(c(\"unknown di {di} for element {semantic}\",{di:vt(t),semantic:vt(e)}));var d=this._getSource(e),y=this._getTarget(e);r=n&&(n.hidden||n.collapsed),i=this._elementFactory.createConnection(xt(e,t,{hidden:r,source:d,target:y,waypoints:bt(t,d,y)})),A(e,\"bpmn:DataAssociation\")&&(n=this._canvas.findRoot(n)),this._canvas.addConnection(i,n,o)}return function(e){return A(e,\"bpmn:Event\")||A(e,\"bpmn:Gateway\")||A(e,\"bpmn:DataStoreReference\")||A(e,\"bpmn:DataObjectReference\")||A(e,\"bpmn:DataInput\")||A(e,\"bpmn:DataOutput\")||A(e,\"bpmn:SequenceFlow\")||A(e,\"bpmn:MessageFlow\")||A(e,\"bpmn:Group\")}(e)&&T(i)&&this.addLabel(e,t,i),this._eventBus.fire(\"bpmnElement.added\",{element:i}),i},wt.prototype._attachBoundary=function(e,t){var n=this._translate,i=e.attachedToRef;if(!i)throw new Error(n(\"missing {semantic}#attachedToRef\",{semantic:vt(e)}));var r=this._elementRegistry.get(i.id),o=r&&r.attachers;if(!r)throw Et(n,e,i,\"attachedToRef\");t.host=r,o||(r.attachers=o=[]),-1===o.indexOf(t)&&o.push(t)},wt.prototype.addLabel=function(e,t,n){var i,r,o;return i=D(t,n),(r=T(n))&&(i=this._textRenderer.getExternalLabelBounds(i,r)),o=this._elementFactory.createLabel(xt(e,t,{id:e.id+\"_label\",labelTarget:n,type:\"label\",hidden:n.hidden||!T(n),x:Math.round(i.x),y:Math.round(i.y),width:Math.round(i.width),height:Math.round(i.height)})),this._canvas.addShape(o,n.parent)},wt.prototype._getConnectedElement=function(e,t){var n,i,r=e.$type,o=this._translate;if(i=e[t+\"Ref\"],\"source\"===t&&\"bpmn:DataInputAssociation\"===r&&(i=i&&i[0]),(\"source\"===t&&\"bpmn:DataOutputAssociation\"===r||\"target\"===t&&\"bpmn:DataInputAssociation\"===r)&&(i=e.$parent),n=i&&this._getElement(i))return n;throw i?Et(o,e,i,t+\"Ref\"):new Error(o(\"{semantic}#{side} Ref not specified\",{semantic:vt(e),side:t}))},wt.prototype._getSource=function(e){return this._getConnectedElement(e,\"source\")},wt.prototype._getTarget=function(e){return this._getConnectedElement(e,\"target\")},wt.prototype._getElement=function(e){return this._elementRegistry.get(e.id)};var _t={__depends__:[ut,{__depends__:[ht],bpmnImporter:[\"type\",wt]}]};function At(e){return e.originalEvent||e.srcEvent}function St(e,t){return(At(e)||e).button===t}function Rt(e){return St(e,0)}function Ct(e){var t=At(e)||e;return!!Rt(e)&&(/mac/i.test(navigator.platform)?t.metaKey:t.ctrlKey)}function Mt(e){return!0}function kt(e){return Rt(e)||function(e){return St(e,1)}(e)}function Pt(e,t,n){var i=this;function r(n,i,r){var o,a;(function(e,t){var n=l[e]||Rt;return!n(t)})(n,i)||(r?a=t.getGraphics(r):(o=i.delegateTarget||i.target)&&(a=o,r=t.get(a)),a&&r&&!1===e.fire(n,{element:r,gfx:a,originalEvent:i})&&(i.stopPropagation(),i.preventDefault()))}var o={};function a(e){return o[e]}var s={click:\"element.click\",contextmenu:\"element.contextmenu\",dblclick:\"element.dblclick\",mousedown:\"element.mousedown\",mousemove:\"element.mousemove\",mouseover:\"element.hover\",mouseout:\"element.out\",mouseup:\"element.mouseup\"},l={\"element.contextmenu\":Mt,\"element.mousedown\":kt,\"element.mouseup\":kt,\"element.click\":kt,\"element.dblclick\":kt};var p=\"svg, .djs-element\";function c(e,t,n,i){var a=o[n]=function(e){r(n,e)};i&&(l[n]=i),a.$delegate=Ve.bind(e,p,t,a)}function u(e,t,n){var i=a(n);i&&Ve.unbind(e,t,i.$delegate)}e.on(\"canvas.destroy\",(function(e){var t;t=e.svg,h(s,(function(e,n){u(t,n,e)}))})),e.on(\"canvas.init\",(function(e){var t;t=e.svg,h(s,(function(e,n){c(t,n,e)}))})),e.on([\"shape.added\",\"connection.added\"],(function(t){var n=t.element,i=t.gfx;e.fire(\"interactionEvents.createHit\",{element:n,gfx:i})})),e.on([\"shape.changed\",\"connection.changed\"],500,(function(t){var n=t.element,i=t.gfx;e.fire(\"interactionEvents.updateHit\",{element:n,gfx:i})})),e.on(\"interactionEvents.createHit\",500,(function(e){var t=e.element,n=e.gfx;i.createDefaultHit(t,n)})),e.on(\"interactionEvents.updateHit\",(function(e){var t=e.element,n=e.gfx;i.updateDefaultHit(t,n)}));var m=y(\"djs-hit djs-hit-stroke\"),f=y(\"djs-hit djs-hit-click-stroke\"),d={all:y(\"djs-hit djs-hit-all\"),\"click-stroke\":f,stroke:m,\"no-move\":y(\"djs-hit djs-hit-no-move\")};function y(e,t){return t=E({stroke:\"white\",strokeWidth:15},t||{}),n.cls(e,[\"no-fill\",\"no-border\"],t)}function g(e,t){var n=d[t];if(!n)throw new Error(\"invalid hit type <\"+t+\">\");return j(e,n),e}function v(e,t){N(e,t)}this.removeHits=function(e){var t;h((t=\".djs-hit\",(e||document).querySelectorAll(t)),z)},this.createDefaultHit=function(e,t){var n,i=e.waypoints,r=e.isFrame;return i?this.createWaypointsHit(t,i):(n=r?\"stroke\":\"all\",this.createBoxHit(t,n,{width:e.width,height:e.height}))},this.createWaypointsHit=function(e,t){var n=he(t);return g(n,\"stroke\"),v(e,n),n},this.createBoxHit=function(e,t,n){n=E({x:0,y:0},n);var i=U(\"rect\");return g(i,t),j(i,n),v(e,i),i},this.updateDefaultHit=function(e,t){var n=He(\".djs-hit\",t);if(n)return e.waypoints?me(n,e.waypoints):j(n,{width:e.width,height:e.height}),n},this.fire=r,this.triggerMouseEvent=function(e,t,n){var i=s[e];if(!i)throw new Error(\"unmapped DOM event name <\"+e+\">\");return r(i,t,n)},this.mouseHandler=a,this.registerEvent=c,this.unregisterEvent=u}Pt.$inject=[\"eventBus\",\"elementRegistry\",\"styles\"];var Dt={__init__:[\"interactionEvents\"],interactionEvents:[\"type\",Pt]};function Tt(e,t){var n,i,o,a;return t=!!t,r(e)||(e=[e]),h(e,(function(e){var r=e;e.waypoints&&!t&&(r=Tt(e.waypoints,!0));var s=r.x,l=r.y,p=r.height||0,c=r.width||0;(s<n||void 0===n)&&(n=s),(l<i||void 0===i)&&(i=l),(s+c>o||void 0===o)&&(o=s+c),(l+p>a||void 0===a)&&(a=l+p)})),{x:n,y:i,height:a-i,width:o-n}}function Ot(e){return\"waypoints\"in e?\"connection\":\"x\"in e?\"shape\":\"root\"}function Nt(e){return!(!e||!e.isFrame)}function Bt(e,t){this.offset=6;var n=t.cls(\"djs-outline\",[\"no-fill\"]),i=this;function r(e,t){var i=U(\"rect\");return j(i,E({x:10,y:10,rx:4,width:100,height:100},n)),N(e,i),i}e.on([\"shape.added\",\"shape.changed\"],500,(function(e){var t=e.element,n=e.gfx,o=He(\".djs-outline\",n);o||(o=r(n)),i.updateShapeOutline(o,t)})),e.on([\"connection.added\",\"connection.changed\"],(function(e){var t=e.element,n=e.gfx,o=He(\".djs-outline\",n);o||(o=r(n)),i.updateConnectionOutline(o,t)}))}Bt.prototype.updateShapeOutline=function(e,t){j(e,{x:-this.offset,y:-this.offset,width:t.width+2*this.offset,height:t.height+2*this.offset})},Bt.prototype.updateConnectionOutline=function(e,t){var n=Tt(t);j(e,{x:n.x-this.offset,y:n.y-this.offset,width:n.width+2*this.offset,height:n.height+2*this.offset})},Bt.$inject=[\"eventBus\",\"styles\",\"elementRegistry\"];var Lt={__init__:[\"outline\"],outline:[\"type\",Bt]};function It(e,t){this._eventBus=e,this._canvas=t,this._selectedElements=[];var n=this;e.on([\"shape.remove\",\"connection.remove\"],(function(e){var t=e.element;n.deselect(t)})),e.on([\"diagram.clear\",\"root.set\"],(function(e){n.select(null)}))}It.$inject=[\"eventBus\",\"canvas\"],It.prototype.deselect=function(e){var t=this._selectedElements,n=t.indexOf(e);if(-1!==n){var i=t.slice();t.splice(n,1),this._eventBus.fire(\"selection.changed\",{oldSelection:i,newSelection:t})}},It.prototype.get=function(){return this._selectedElements},It.prototype.isSelected=function(e){return-1!==this._selectedElements.indexOf(e)},It.prototype.select=function(e,t){var n=this._selectedElements,i=n.slice();r(e)||(e=e?[e]:[]);var o=this._canvas,a=o.getRootElement();e=e.filter((function(e){var t=o.findRoot(e);return a===t})),t?h(e,(function(e){-1===n.indexOf(e)&&n.push(e)})):this._selectedElements=n=e.slice(),this._eventBus.fire(\"selection.changed\",{oldSelection:i,newSelection:n})};var jt=\"hover\",Ft=\"selected\";function Vt(e,t,n){this._canvas=e;var i=this;function r(t,n){e.addMarker(t,n)}function o(t,n){e.removeMarker(t,n)}this._multiSelectionBox=null,t.on(\"element.hover\",(function(e){r(e.element,jt)})),t.on(\"element.out\",(function(e){o(e.element,jt)})),t.on(\"selection.changed\",(function(e){var t=e.oldSelection,n=e.newSelection;h(t,(function(e){-1===n.indexOf(e)&&o(e,Ft)})),h(n,(function(e){-1===t.indexOf(e)&&r(e,Ft)})),i._updateSelectionOutline(n)})),t.on(\"element.changed\",(function(e){n.isSelected(e.element)&&i._updateSelectionOutline(n.get())}))}function Wt(e,t,n,i){e.on(\"create.end\",500,(function(e){var n=e.context,i=n.canExecute,o=n.elements,a=(n.hints||{}).autoSelect;if(i){if(!1===a)return;r(a)?t.select(a):t.select(o.filter(zt))}})),e.on(\"connect.end\",500,(function(e){var n=e.context.connection;n&&t.select(n)})),e.on(\"shape.move.end\",500,(function(e){var n=e.previousSelection||[],r=i.get(e.context.shape.id);c(n,(function(e){return r.id===e.id}))||t.select(r)})),e.on(\"element.click\",(function(e){if(Rt(e)){var i=e.element;i===n.getRootElement()&&(i=null);var r=t.isSelected(i),o=t.get().length>1,a=Ct(e)||function(e){var t=At(e)||e;return Rt(e)&&t.shiftKey}(e);if(r&&o)return a?t.deselect(i):t.select(i);r?t.deselect(i):t.select(i,a)}}))}function zt(e){return!e.hidden}Vt.$inject=[\"canvas\",\"eventBus\",\"selection\"],Vt.prototype._updateSelectionOutline=function(e){var t=this._canvas.getLayer(\"selectionOutline\");G(t);var n=e.length>1;if(V(this._canvas.getContainer())[n?\"add\":\"remove\"](\"djs-multi-select\"),n){var i=function(e){return{x:e.x-6,y:e.y-6,width:e.width+12,height:e.height+12}}(Tt(e)),r=U(\"rect\");j(r,E({rx:3},i)),V(r).add(\"djs-selection-outline\"),N(t,r)}},Wt.$inject=[\"eventBus\",\"selection\",\"canvas\",\"elementRegistry\"];var Gt={__init__:[\"selectionVisuals\",\"selectionBehavior\"],__depends__:[Dt,Lt],selection:[\"type\",It],selectionVisuals:[\"type\",Vt],selectionBehavior:[\"type\",Wt]};function $t(e){this._counter=0,this._prefix=(e?e+\"-\":\"\")+Math.floor(1e9*Math.random())+\"-\"}$t.prototype.next=function(){return this._prefix+ ++this._counter};var Ht=new $t(\"ov\");function Kt(e,t,n,i){var r,o;this._eventBus=t,this._canvas=n,this._elementRegistry=i,this._ids=Ht,this._overlayDefaults=E({show:null,scale:!0},e&&e.defaults),this._overlays={},this._overlayContainers=[],this._overlayRoot=(r=n.getContainer(),Re(o=$e('<div class=\"djs-overlay-container\" />'),{position:\"absolute\",width:0,height:0}),r.insertBefore(o,r.firstChild),o),this._init()}function Ut(e,t,n){Re(e,{left:t+\"px\",top:n+\"px\"})}function qt(e,t){e.style.display=!1===t?\"none\":\"\"}function Yt(e,t){e.style[\"transform-origin\"]=\"top left\",[\"\",\"-ms-\",\"-webkit-\"].forEach((function(n){e.style[n+\"transform\"]=t}))}Kt.$inject=[\"config.overlays\",\"eventBus\",\"canvas\",\"elementRegistry\"],Kt.prototype.get=function(e){if(l(e)&&(e={id:e}),l(e.element)&&(e.element=this._elementRegistry.get(e.element)),e.element){var t=this._getOverlayContainer(e.element,!0);return t?e.type?u(t.overlays,y({type:e.type})):t.overlays.slice():[]}return e.type?u(this._overlays,y({type:e.type})):e.id?this._overlays[e.id]:null},Kt.prototype.add=function(e,t,n){if(o(t)&&(n=t,t=null),e.id||(e=this._elementRegistry.get(e)),!n.position)throw new Error(\"must specifiy overlay position\");if(!n.html)throw new Error(\"must specifiy overlay html\");if(!e)throw new Error(\"invalid element specified\");var i=this._ids.next();return n=E({},this._overlayDefaults,n,{id:i,type:t,element:e,html:n.html}),this._addOverlay(n),i},Kt.prototype.remove=function(e){var t=this.get(e)||[];r(t)||(t=[t]);var n=this;h(t,(function(e){var t=n._getOverlayContainer(e.element,!0);if(e&&(Ke(e.html),Ke(e.htmlContainer),delete e.htmlContainer,delete e.element,delete n._overlays[e.id]),t){var i=t.overlays.indexOf(e);-1!==i&&t.overlays.splice(i,1)}}))},Kt.prototype.isShown=function(){return\"none\"!==this._overlayRoot.style.display},Kt.prototype.show=function(){qt(this._overlayRoot)},Kt.prototype.hide=function(){qt(this._overlayRoot,!1)},Kt.prototype.clear=function(){this._overlays={},this._overlayContainers=[],Pe(this._overlayRoot)},Kt.prototype._updateOverlayContainer=function(e){var t=e.element,n=e.html,i=t.x,r=t.y;if(t.waypoints){var o=Tt(t);i=o.x,r=o.y}Ut(n,i,r),function(e,t,n){2==arguments.length?e.getAttribute(t):null===n?e.removeAttribute(t):e.setAttribute(t,n)}(e.html,\"data-container-id\",t.id)},Kt.prototype._updateOverlay=function(e){var t,n,i=e.position,r=e.htmlContainer,o=e.element,a=i.left,s=i.top;void 0!==i.right&&(t=o.waypoints?Tt(o).width:o.width,a=-1*i.right+t);void 0!==i.bottom&&(n=o.waypoints?Tt(o).height:o.height,s=-1*i.bottom+n);Ut(r,a||0,s||0),this._updateOverlayVisibilty(e,this._canvas.viewbox())},Kt.prototype._createOverlayContainer=function(e){var t=$e('<div class=\"djs-overlays\" />');Re(t,{position:\"absolute\"}),this._overlayRoot.appendChild(t);var n={html:t,element:e,overlays:[]};return this._updateOverlayContainer(n),this._overlayContainers.push(n),n},Kt.prototype._updateRoot=function(e){var t=e.scale||1,n=\"matrix(\"+[t,0,0,t,-1*e.x*t,-1*e.y*t].join(\",\")+\")\";Yt(this._overlayRoot,n)},Kt.prototype._getOverlayContainer=function(e,t){var n=c(this._overlayContainers,(function(t){return t.element===e}));return n||t?n:this._createOverlayContainer(e)},Kt.prototype._addOverlay=function(e){var t,n,i=e.id,r=e.element,o=e.html;o.get&&o.constructor.prototype.jquery&&(o=o.get(0)),l(o)&&(o=$e(o)),n=this._getOverlayContainer(r),Re(t=$e('<div class=\"djs-overlay\" data-overlay-id=\"'+i+'\">'),{position:\"absolute\"}),t.appendChild(o),e.type&&Me(t).add(\"djs-overlay-\"+e.type),qt(t,this._canvas.findRoot(r)===this._canvas.getRootElement()),e.htmlContainer=t,n.overlays.push(e),n.html.appendChild(t),this._overlays[i]=e,this._updateOverlay(e),this._updateOverlayVisibilty(e,this._canvas.viewbox())},Kt.prototype._updateOverlayVisibilty=function(e,t){var n=e.show,r=this._canvas.findRoot(e.element),o=n&&n.minZoom,a=n&&n.maxZoom,s=e.htmlContainer,l=!0;(r!==this._canvas.getRootElement()||n&&(i(o)&&o>t.scale||i(a)&&a<t.scale))&&(l=!1),qt(s,l),this._updateOverlayScale(e,t)},Kt.prototype._updateOverlayScale=function(e,t){var n,r,o,a=e.scale,s=e.htmlContainer,l=\"\";!0!==a&&(!1===a?(n=1,r=1):(n=a.min,r=a.max),i(n)&&t.scale<n&&(o=(1/t.scale||1)*n),i(r)&&t.scale>r&&(o=(1/t.scale||1)*r)),i(o)&&(l=\"scale(\"+o+\",\"+o+\")\"),Yt(s,l)},Kt.prototype._updateOverlaysVisibilty=function(e){var t=this;h(this._overlays,(function(n){t._updateOverlayVisibilty(n,e)}))},Kt.prototype._init=function(){var e=this._eventBus,t=this;e.on(\"canvas.viewbox.changing\",(function(e){t.hide()})),e.on(\"canvas.viewbox.changed\",(function(e){var n;n=e.viewbox,t._updateRoot(n),t._updateOverlaysVisibilty(n),t.show()})),e.on([\"shape.remove\",\"connection.remove\"],(function(e){var n=e.element;h(t.get({element:n}),(function(e){t.remove(e.id)}));var i=t._getOverlayContainer(n);if(i){Ke(i.html);var r=t._overlayContainers.indexOf(i);-1!==r&&t._overlayContainers.splice(r,1)}})),e.on(\"element.changed\",500,(function(e){var n=e.element,i=t._getOverlayContainer(n,!0);i&&(h(i.overlays,(function(e){t._updateOverlay(e)})),t._updateOverlayContainer(i))})),e.on(\"element.marker.update\",(function(e){var n=t._getOverlayContainer(e.element,!0);n&&Me(n.html)[e.add?\"add\":\"remove\"](e.marker)})),e.on(\"root.set\",(function(){t._updateOverlaysVisibilty(t._canvas.viewbox())})),e.on(\"diagram.clear\",this.clear,this)};var Xt={__init__:[\"overlays\"],overlays:[\"type\",Kt]};function Zt(e,t,n,i){e.on(\"element.changed\",(function(i){var r=i.element;(r.parent||r===t.getRootElement())&&(i.gfx=n.getGraphics(r)),i.gfx&&e.fire(Ot(r)+\".changed\",i)})),e.on(\"elements.changed\",(function(t){var n=t.elements;n.forEach((function(t){e.fire(\"element.changed\",{element:t})})),i.updateContainments(n)})),e.on(\"shape.changed\",(function(e){i.update(\"shape\",e.element,e.gfx)})),e.on(\"connection.changed\",(function(e){i.update(\"connection\",e.element,e.gfx)}))}Zt.$inject=[\"eventBus\",\"canvas\",\"elementRegistry\",\"graphicsFactory\"];var Jt={__init__:[\"changeSupport\"],changeSupport:[\"type\",Zt]};function Qt(e){this._eventBus=e}function en(e){return function(t,n,i,r,o){(s(t)||a(t))&&(o=r,r=i,i=n,n=t,t=null),this.on(t,e,n,i,r,o)}}function tn(e,t){t.invoke(Qt,this),this.executed((function(t){var n=t.context;n.rootElement?e.setRootElement(n.rootElement):n.rootElement=e.getRootElement()})),this.revert((function(t){var n=t.context;n.rootElement&&e.setRootElement(n.rootElement)}))}Qt.$inject=[\"eventBus\"],Qt.prototype.on=function(e,t,n,i,l,p){if((s(t)||a(t))&&(p=l,l=i,i=n,n=t,t=null),s(n)&&(p=l,l=i,i=n,n=1e3),o(l)&&(p=l,l=!1),!s(i))throw new Error(\"handlerFn must be a function\");r(e)||(e=[e]);var c=this._eventBus;h(e,(function(e){var r=[\"commandStack\",e,t].filter((function(e){return e})).join(\".\");c.on(r,n,l?function(e,t){return function(n){return e.call(t||null,n.context,n.command,n)}}(i,p):i,p)}))},Qt.prototype.canExecute=en(\"canExecute\"),Qt.prototype.preExecute=en(\"preExecute\"),Qt.prototype.preExecuted=en(\"preExecuted\"),Qt.prototype.execute=en(\"execute\"),Qt.prototype.executed=en(\"executed\"),Qt.prototype.postExecute=en(\"postExecute\"),Qt.prototype.postExecuted=en(\"postExecuted\"),Qt.prototype.revert=en(\"revert\"),Qt.prototype.reverted=en(\"reverted\"),e(tn,Qt),tn.$inject=[\"canvas\",\"injector\"];var nn={__init__:[\"rootElementsBehavior\"],rootElementsBehavior:[\"type\",tn]},rn={\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\"};var on=\"_plane\";function an(e){var t=e.id;return A(e,\"bpmn:SubProcess\")?function(e){return e+on}(t):t}function sn(e,t,n){var i=$e('<ul class=\"bjs-breadcrumbs\"></ul>'),r=n.getContainer(),o=Me(r);r.appendChild(i);var a=[];function s(e){e&&(a=function(e){for(var t=S(e),n=[],i=t;i;i=i.$parent)(A(i,\"bpmn:SubProcess\")||A(i,\"bpmn:Process\"))&&n.push(i);return n.reverse()}(e));var r=a.map((function(e){var i,r=(i=\"\"+(i=e.name||e.id))&&i.replace(/[&<>\"']/g,(function(e){return rn[e]})),o=$e('<li><span class=\"bjs-crumb\"><a title=\"'+r+'\">'+r+\"</a></span></li>\"),a=n.findRoot(an(e))||n.findRoot(e.id);if(!a&&A(e,\"bpmn:Process\")){var s=t.find((function(t){var n=S(t);return n&&n.get(\"processRef\")&&n.get(\"processRef\")===e}));a=n.findRoot(s.id)}return o.addEventListener(\"click\",(function(){n.setRootElement(a)})),o}));i.innerHTML=\"\";var s=r.length>1;o.toggle(\"bjs-breadcrumbs-shown\",s),r.forEach((function(e){i.appendChild(e)}))}e.on(\"element.changed\",(function(e){var t=S(e.element);c(a,(function(e){return e===t}))&&s()})),e.on(\"root.set\",(function(e){s(e.element)}))}function ln(e,t){var n=null,i=new pn;e.on(\"root.set\",(function(e){var r=e.element,o=t.viewbox(),a=i.get(r);if(i.set(n,{x:o.x,y:o.y,zoom:o.scale}),n=r,!A(r,\"bpmn:Collaboration\")||a){a=a||{x:0,y:0,zoom:1};var s=(o.x-a.x)*o.scale,l=(o.y-a.y)*o.scale;0===s&&0===l||t.scroll({dx:s,dy:l}),a.zoom!==o.scale&&t.zoom(a.zoom,{x:0,y:0})}})),e.on(\"diagram.clear\",(function(){i.clear(),n=null}))}function pn(){this._entries=[],this.set=function(e,t){var n=!1;for(var i in this._entries)if(this._entries[i][0]===e){this._entries[i][1]=t,n=!0;break}n||this._entries.push([e,t])},this.get=function(e){for(var t in this._entries)if(this._entries[t][0]===e)return this._entries[t][1];return null},this.clear=function(){this._entries.length=0},this.remove=function(e){var t=-1;for(var n in this._entries)if(this._entries[n][0]===e){t=n;break}-1!==t&&this._entries.splice(t,1)}}sn.$inject=[\"eventBus\",\"elementRegistry\",\"canvas\"],ln.$inject=[\"eventBus\",\"canvas\"];var cn=180,un=160;function hn(e,t){this._eventBus=e,this._moddle=t;var n=this;e.on(\"import.render.start\",1500,(function(e,t){n._handleImport(t.definitions)}))}function mn(e){return A(e,\"bpmndi:BPMNDiagram\")?e:mn(e.$parent)}hn.prototype._handleImport=function(e){if(e.diagrams){var t=this;this._definitions=e,this._processToDiagramMap={},e.diagrams.forEach((function(e){e.plane&&e.plane.bpmnElement&&(t._processToDiagramMap[e.plane.bpmnElement.id]=e)}));var n=[];e.diagrams.forEach((function(e){var i=t._createNewDiagrams(e.plane);Array.prototype.push.apply(n,i)})),n.forEach((function(e){t._movePlaneElementsToOrigin(e.plane)}))}},hn.prototype._createNewDiagrams=function(e){var t=this,n=[],i=[];e.get(\"planeElement\").forEach((function(t){var r=t.bpmnElement;if(r){var o=r.$parent;A(r,\"bpmn:SubProcess\")&&!t.isExpanded&&n.push(r),function(e,t){var n=e.$parent;if(!A(n,\"bpmn:SubProcess\")||n===t.bpmnElement)return!1;if(function(e,t){return d(t,(function(t){return A(e,t)}))}(e,[\"bpmn:DataInputAssociation\",\"bpmn:DataOutputAssociation\"]))return!1;return!0}(r,e)&&i.push({diElement:t,parent:o})}}));var r=[];return n.forEach((function(e){if(!t._processToDiagramMap[e.id]){var n=t._createDiagram(e);t._processToDiagramMap[e.id]=n,r.push(n)}})),i.forEach((function(e){for(var i=e.diElement,r=e.parent;r&&-1===n.indexOf(r);)r=r.$parent;if(r){var o=t._processToDiagramMap[r.id];t._moveToDiPlane(i,o.plane)}})),r},hn.prototype._movePlaneElementsToOrigin=function(e){var t=e.get(\"planeElement\"),n=function(e){var t={top:1/0,right:-1/0,bottom:-1/0,left:1/0};return e.planeElement.forEach((function(e){if(e.bounds){var n=ft(e.bounds);t.top=Math.min(n.top,t.top),t.left=Math.min(n.left,t.left)}})),function(e){return{x:e.left,y:e.top,width:e.right-e.left,height:e.bottom-e.top}}(t)}(e),i=n.x-cn,r=n.y-un;t.forEach((function(e){e.waypoint?e.waypoint.forEach((function(e){e.x=e.x-i,e.y=e.y-r})):e.bounds&&(e.bounds.x=e.bounds.x-i,e.bounds.y=e.bounds.y-r)}))},hn.prototype._moveToDiPlane=function(e,t){var n=mn(e).plane.get(\"planeElement\");n.splice(n.indexOf(e),1),t.get(\"planeElement\").push(e)},hn.prototype._createDiagram=function(e){var t=this._moddle.create(\"bpmndi:BPMNPlane\",{bpmnElement:e}),n=this._moddle.create(\"bpmndi:BPMNDiagram\",{plane:t});return t.$parent=n,t.bpmnElement=e,n.$parent=this._definitions,this._definitions.diagrams.push(n),n},hn.$inject=[\"eventBus\",\"moddle\"];var fn=250;function dn(e,t,n,i){Qt.call(this,t),this._canvas=e,this._eventBus=t,this._elementRegistry=n,this._overlays=i;var r=this;this.executed(\"shape.toggleCollapse\",fn,(function(e){var t=e.shape;r._canDrillDown(t)?r._addOverlay(t):r._removeOverlay(t)}),!0),this.reverted(\"shape.toggleCollapse\",fn,(function(e){var t=e.shape;r._canDrillDown(t)?r._addOverlay(t):r._removeOverlay(t)}),!0),this.executed([\"shape.create\",\"shape.move\",\"shape.delete\"],fn,(function(e){var t=e.oldParent,n=e.newParent||e.parent,i=e.shape;r._canDrillDown(i)&&r._addOverlay(i),r._updateDrilldownOverlay(t),r._updateDrilldownOverlay(n),r._updateDrilldownOverlay(i)}),!0),this.reverted([\"shape.create\",\"shape.move\",\"shape.delete\"],fn,(function(e){var t=e.oldParent,n=e.newParent||e.parent,i=e.shape;r._canDrillDown(i)&&r._addOverlay(i),r._updateDrilldownOverlay(t),r._updateDrilldownOverlay(n),r._updateDrilldownOverlay(i)}),!0),t.on(\"import.render.complete\",(function(){n.filter((function(e){return r._canDrillDown(e)})).map((function(e){r._addOverlay(e)}))}))}e(dn,Qt),dn.prototype._updateDrilldownOverlay=function(e){var t=this._canvas;if(e){var n=t.findRoot(e);n&&this._updateOverlayVisibility(n)}},dn.prototype._canDrillDown=function(e){var t=this._canvas;return A(e,\"bpmn:SubProcess\")&&t.findRoot(an(e))},dn.prototype._updateOverlayVisibility=function(e){var t=this._overlays,n=S(e),i=t.get({element:n.id,type:\"drilldown\"})[0];if(i){var r=n&&n.get(\"flowElements\")&&n.get(\"flowElements\").length;Me(i.html).toggle(\"bjs-drilldown-empty\",!r)}},dn.prototype._addOverlay=function(e){var t=this._canvas,n=this._overlays;n.get({element:e,type:\"drilldown\"}).length&&this._removeOverlay(e);var i=$e('<button class=\"bjs-drilldown\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 16 16\"><path fill-rule=\"evenodd\" d=\"M4.81801948,3.50735931 L10.4996894,9.1896894 L10.5,4 L12,4 L12,12 L4,12 L4,10.5 L9.6896894,10.4996894 L3.75735931,4.56801948 C3.46446609,4.27512627 3.46446609,3.80025253 3.75735931,3.50735931 C4.05025253,3.21446609 4.52512627,3.21446609 4.81801948,3.50735931 Z\"/></svg></button>');i.addEventListener(\"click\",(function(){t.setRootElement(t.findRoot(an(e)))})),n.add(e,\"drilldown\",{position:{bottom:-7,right:-8},html:i}),this._updateOverlayVisibility(e)},dn.prototype._removeOverlay=function(e){this._overlays.remove({element:e,type:\"drilldown\"})},dn.$inject=[\"canvas\",\"eventBus\",\"elementRegistry\",\"overlays\"];var yn={__depends__:[Xt,Jt,nn],__init__:[\"drilldownBreadcrumbs\",\"drilldownOverlayBehavior\",\"drilldownCentering\",\"subprocessCompatibility\"],drilldownBreadcrumbs:[\"type\",sn],drilldownCentering:[\"type\",ln],drilldownOverlayBehavior:[\"type\",dn],subprocessCompatibility:[\"type\",hn]};const gn=/^class[ {]/;function vn(e){return Array.isArray(e)}function xn(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function bn(...e){1===e.length&&vn(e[0])&&(e=e[0]);const t=(e=[...e]).pop();return t.$inject=e,t}const En=/constructor\\s*[^(]*\\(\\s*([^)]*)\\)/m,wn=/^(?:async\\s+)?(?:function\\s*[^(]*)?(?:\\(\\s*([^)]*)\\)|(\\w+))/m,_n=/\\/\\*([^*]*)\\*\\//m;function An(e){if(\"function\"!=typeof e)throw new Error(`Cannot annotate \"${e}\". Expected a function!`);const t=e.toString().match(function(e){return gn.test(e.toString())}(e)?En:wn);if(!t)return[];const n=t[1]||t[2];return n&&n.split(\",\").map((e=>{const t=e.match(_n);return(t&&t[1]||e).trim()}))||[]}function Sn(e,t){t=t||{get:function(e,t){if(n.push(e),!1===t)return null;throw a(`No provider for \"${e}\"!`)}};const n=[],i=this._providers=Object.create(t._providers||null),r=this._instances=Object.create(null),o=r.injector=this,a=function(e){const t=n.join(\" -> \");return n.length=0,new Error(t?`${e} (Resolving: ${t})`:e)};function s(e,o){if(!i[e]&&-1!==e.indexOf(\".\")){const t=e.split(\".\");let n=s(t.shift());for(;t.length;)n=n[t.shift()];return n}if(xn(r,e))return r[e];if(xn(i,e)){if(-1!==n.indexOf(e))throw n.push(e),a(\"Cannot resolve circular dependency!\");return n.push(e),r[e]=i[e][0](i[e][1]),n.pop(),r[e]}return t.get(e,o)}function l(e,t){if(void 0===t&&(t={}),\"function\"!=typeof e){if(!vn(e))throw a(`Cannot invoke \"${e}\". Expected a function!`);e=bn(e.slice())}return{fn:e,dependencies:(e.$inject||An(e)).map((e=>xn(t,e)?t[e]:s(e)))}}function p(e){const{fn:t,dependencies:n}=l(e);return new(Function.prototype.bind.apply(t,[null].concat(n)))}function c(e,t,n){const{fn:i,dependencies:r}=l(e,n);return i.apply(t,r)}function u(e){return bn((t=>e.get(t)))}function h(e,t){if(t&&t.length){const n=Object.create(null),r=Object.create(null),o=[],a=[],s=[];let l,p,c,h;for(let e in i)l=i[e],-1!==t.indexOf(e)&&(\"private\"===l[2]?(p=o.indexOf(l[3]),-1===p?(c=l[3].createChild([],t),h=u(c),o.push(l[3]),a.push(c),s.push(h),n[e]=[h,e,\"private\",c]):n[e]=[s[p],e,\"private\",a[p]]):n[e]=[l[2],l[1]],r[e]=!0),\"factory\"!==l[2]&&\"type\"!==l[2]||!l[1].$scope||t.forEach((t=>{-1!==l[1].$scope.indexOf(t)&&(n[e]=[l[2],l[1]],r[t]=!0)}));t.forEach((e=>{if(!r[e])throw new Error('No provider for \"'+e+'\". Cannot use provider from the parent!')})),e.unshift(n)}return new Sn(e,o)}const m={factory:c,type:p,value:function(e){return e}};function f(e,t){const n=e.__init__||[];return function(){n.forEach((e=>{\"string\"==typeof e?t.get(e):t.invoke(e)}))}}function d(e){const t=e.__exports__;if(t){const n=e.__modules__,r=Object.keys(e).reduce(((t,n)=>(\"__exports__\"!==n&&\"__modules__\"!==n&&\"__init__\"!==n&&\"__depends__\"!==n&&(t[n]=e[n]),t)),Object.create(null)),o=h((n||[]).concat(r)),a=bn((function(e){return o.get(e)}));t.forEach((function(e){i[e]=[a,e,\"private\",o]}));const s=(e.__init__||[]).slice();return s.unshift((function(){o.init()})),f(e=Object.assign({},e,{__init__:s}),o)}return Object.keys(e).forEach((function(t){if(\"__init__\"===t||\"__depends__\"===t)return;if(\"private\"===e[t][2])return void(i[t]=e[t]);const n=e[t][0],r=e[t][1];i[t]=[m[n],Rn(n,r),n]})),f(e,o)}function y(e,t){return-1!==e.indexOf(t)||-1!==(e=(t.__depends__||[]).reduce(y,e)).indexOf(t)?e:e.concat(t)}this.get=s,this.invoke=c,this.instantiate=p,this.createChild=h,this.init=function(e){const t=e.reduce(y,[]).map(d);let n=!1;return function(){n||(n=!0,t.forEach((e=>e())))}}(e)}function Rn(e,t){return\"value\"!==e&&vn(t)&&(t=bn(t.slice())),t}function Cn(e,t){_.call(this,e,1),this.CONNECTION_STYLE=t.style([\"no-fill\"],{strokeWidth:5,stroke:\"fuchsia\"}),this.SHAPE_STYLE=t.style({fill:\"white\",stroke:\"fuchsia\",strokeWidth:2}),this.FRAME_STYLE=t.style([\"no-fill\"],{stroke:\"fuchsia\",strokeDasharray:4,strokeWidth:2})}e(Cn,_),Cn.prototype.canRender=function(){return!0},Cn.prototype.drawShape=function(e,t,n){var i=U(\"rect\");return j(i,{x:0,y:0,width:t.width||0,height:t.height||0}),Nt(t)?j(i,E({},this.FRAME_STYLE,n||{})):j(i,E({},this.SHAPE_STYLE,n||{})),N(e,i),i},Cn.prototype.drawConnection=function(e,t,n){var i=he(t.waypoints,E({},this.CONNECTION_STYLE,n||{}));return N(e,i),i},Cn.prototype.getShapePath=function(e){var t=e.x,n=e.y,i=e.width;return se([[\"M\",t,n],[\"l\",i,0],[\"l\",0,e.height],[\"l\",-i,0],[\"z\"]])},Cn.prototype.getConnectionPath=function(e){var t,n,i=e.waypoints,r=[];for(t=0;n=i[t];t++)n=n.original||n,r.push([0===t?\"M\":\"L\",n.x,n.y]);return se(r)},Cn.$inject=[\"eventBus\",\"styles\"];var Mn={__init__:[\"defaultRenderer\"],defaultRenderer:[\"type\",Cn],styles:[\"type\",function(){var e={\"no-fill\":{fill:\"none\"},\"no-border\":{strokeOpacity:0},\"no-events\":{pointerEvents:\"none\"}},t=this;this.cls=function(e,t,n){return E(this.style(t,n),{class:e})},this.style=function(t,n){r(t)||n||(n=t,t=[]);var i=m(t,(function(t,n){return E(t,e[n]||{})}),{});return n?E(i,n):i},this.computeStyle=function(e,n,i){return r(n)||(i=n,n=[]),t.style(n||[],E({},i,e||{}))}}]};function kn(e,t){return Math.round(e*t)/t}function Pn(e){return a(e)?e+\"px\":e}function Dn(e,t,n){const i=U(\"g\");V(i).add(t);const r=void 0!==n?n:e.childNodes.length-1;return e.insertBefore(i,e.childNodes[r]||null),i}const Tn={shape:[\"x\",\"y\",\"width\",\"height\"],connection:[\"waypoints\"]};function On(e,t,n,i){this._eventBus=t,this._elementRegistry=i,this._graphicsFactory=n,this._rootsIdx=0,this._layers={},this._planes=[],this._rootElement=null,this._init(e||{})}function Nn(e,t){const n=\"matrix(\"+t.a+\",\"+t.b+\",\"+t.c+\",\"+t.d+\",\"+t.e+\",\"+t.f+\")\";e.setAttribute(\"transform\",n)}On.$inject=[\"config.canvas\",\"eventBus\",\"graphicsFactory\",\"elementRegistry\"],On.prototype._init=function(e){const t=this._eventBus,n=this._container=function(e){const t=(e=E({},{width:\"100%\",height:\"100%\"},e)).container||document.body,n=document.createElement(\"div\");return n.setAttribute(\"class\",\"djs-container djs-parent\"),Re(n,{position:\"relative\",overflow:\"hidden\",width:Pn(e.width),height:Pn(e.height)}),t.appendChild(n),n}(e),i=this._svg=U(\"svg\");j(i,{width:\"100%\",height:\"100%\"}),N(n,i);const r=this._viewport=Dn(i,\"viewport\");!1!==e.deferUpdate&&(this._viewboxChanged=function(e,t){let n,i,r,o;function a(n){let a=Date.now(),p=n?0:o+t-a;if(p>0)return s(p);e.apply(r,i),l()}function s(e){n=setTimeout(a,e)}function l(){n&&clearTimeout(n),n=o=i=r=void 0}function p(...e){o=Date.now(),i=e,r=this,n||s(t)}return p.flush=function(){n&&a(!0),l()},p.cancel=l,p}(b(this._viewboxChanged,this),300)),t.on(\"diagram.init\",(()=>{t.fire(\"canvas.init\",{svg:i,viewport:r})})),t.on([\"shape.added\",\"connection.added\",\"shape.removed\",\"connection.removed\",\"elements.changed\",\"root.set\"],(()=>{delete this._cachedViewbox})),t.on(\"diagram.destroy\",500,this._destroy,this),t.on(\"diagram.clear\",500,this._clear,this)},On.prototype._destroy=function(){this._eventBus.fire(\"canvas.destroy\",{svg:this._svg,viewport:this._viewport});const e=this._container.parentNode;e&&e.removeChild(this._container),delete this._svg,delete this._container,delete this._layers,delete this._planes,delete this._rootElement,delete this._viewport},On.prototype._clear=function(){this._elementRegistry.getAll().forEach((e=>{const t=Ot(e);\"root\"===t?this.removeRootElement(e):this._removeElement(e,t)})),this._planes=[],this._rootElement=null,delete this._cachedViewbox},On.prototype.getDefaultLayer=function(){return this.getLayer(\"base\",0)},On.prototype.getLayer=function(e,t){if(!e)throw new Error(\"must specify a name\");let n=this._layers[e];if(n||(n=this._layers[e]=this._createLayer(e,t)),void 0!==t&&n.index!==t)throw new Error(\"layer <\"+e+\"> already created at index <\"+t+\">\");return n.group},On.prototype._getChildIndex=function(e){return m(this._layers,(function(t,n){return n.visible&&e>=n.index&&t++,t}),0)},On.prototype._createLayer=function(e,t){void 0===t&&(t=1);const n=this._getChildIndex(t);return{group:Dn(this._viewport,\"layer-\"+e,n),index:t,visible:!0}},On.prototype.showLayer=function(e){if(!e)throw new Error(\"must specify a name\");const t=this._layers[e];if(!t)throw new Error(\"layer <\"+e+\"> does not exist\");const n=this._viewport,i=t.group,r=t.index;if(t.visible)return i;const o=this._getChildIndex(r);return n.insertBefore(i,n.childNodes[o]||null),t.visible=!0,i},On.prototype.hideLayer=function(e){if(!e)throw new Error(\"must specify a name\");const t=this._layers[e];if(!t)throw new Error(\"layer <\"+e+\"> does not exist\");const n=t.group;return t.visible?(z(n),t.visible=!1,n):n},On.prototype._removeLayer=function(e){const t=this._layers[e];t&&(delete this._layers[e],z(t.group))},On.prototype.getActiveLayer=function(){const e=this._findPlaneForRoot(this.getRootElement());return e?e.layer:null},On.prototype.findRoot=function(e){if(\"string\"==typeof e&&(e=this._elementRegistry.get(e)),!e)return;const t=this._findPlaneForRoot(function(e){for(;e.parent;)e=e.parent;return e}(e))||{};return t.rootElement},On.prototype.getRootElements=function(){return this._planes.map((function(e){return e.rootElement}))},On.prototype._findPlaneForRoot=function(e){return c(this._planes,(function(t){return t.rootElement===e}))},On.prototype.getContainer=function(){return this._container},On.prototype._updateMarker=function(e,t,n){let i;e.id||(e=this._elementRegistry.get(e)),i=this._elementRegistry._elements[e.id],i&&(h([i.gfx,i.secondaryGfx],(function(e){e&&(n?V(e).add(t):V(e).remove(t))})),this._eventBus.fire(\"element.marker.update\",{element:e,gfx:i.gfx,marker:t,add:!!n}))},On.prototype.addMarker=function(e,t){this._updateMarker(e,t,!0)},On.prototype.removeMarker=function(e,t){this._updateMarker(e,t,!1)},On.prototype.hasMarker=function(e,t){e.id||(e=this._elementRegistry.get(e));return V(this.getGraphics(e)).has(t)},On.prototype.toggleMarker=function(e,t){this.hasMarker(e,t)?this.removeMarker(e,t):this.addMarker(e,t)},On.prototype.getRootElement=function(){const e=this._rootElement;return e||this._planes.length?e:this.setRootElement(this.addRootElement(null))},On.prototype.addRootElement=function(e){const t=this._rootsIdx++;e||(e={id:\"__implicitroot_\"+t,children:[],isImplicit:!0});const n=e.layer=\"root-\"+t;this._ensureValid(\"root\",e);const i=this.getLayer(n,0);return this.hideLayer(n),this._addRoot(e,i),this._planes.push({rootElement:e,layer:i}),e},On.prototype.removeRootElement=function(e){\"string\"==typeof e&&(e=this._elementRegistry.get(e));if(this._findPlaneForRoot(e))return this._removeRoot(e),this._removeLayer(e.layer),this._planes=this._planes.filter((function(t){return t.rootElement!==e})),this._rootElement===e&&(this._rootElement=null),e},On.prototype.setRootElement=function(e){if(e===this._rootElement)return;let t;if(!e)throw new Error(\"rootElement required\");return t=this._findPlaneForRoot(e),t||(e=this.addRootElement(e)),this._setRoot(e),e},On.prototype._removeRoot=function(e){const t=this._elementRegistry,n=this._eventBus;n.fire(\"root.remove\",{element:e}),n.fire(\"root.removed\",{element:e}),t.remove(e)},On.prototype._addRoot=function(e,t){const n=this._elementRegistry,i=this._eventBus;i.fire(\"root.add\",{element:e}),n.add(e,t),i.fire(\"root.added\",{element:e,gfx:t})},On.prototype._setRoot=function(e,t){const n=this._rootElement;n&&(this._elementRegistry.updateGraphics(n,null,!0),this.hideLayer(n.layer)),e&&(t||(t=this._findPlaneForRoot(e).layer),this._elementRegistry.updateGraphics(e,this._svg,!0),this.showLayer(e.layer)),this._rootElement=e,this._eventBus.fire(\"root.set\",{element:e})},On.prototype._ensureValid=function(e,t){if(!t.id)throw new Error(\"element must have an id\");if(this._elementRegistry.get(t.id))throw new Error(\"element <\"+t.id+\"> already exists\");const n=Tn[e],i=f(n,(function(e){return void 0!==t[e]}));if(!i)throw new Error(\"must supply { \"+n.join(\", \")+\" } with \"+e)},On.prototype._setParent=function(e,t,n){!function(e,t,n){if(e&&t){\"number\"!=typeof n&&(n=-1);var i=e.indexOf(t);if(-1!==i){if(i===n)return;if(-1===n)return;e.splice(i,1)}-1!==n?e.splice(n,0,t):e.push(t)}}(t.children,e,n),e.parent=t},On.prototype._addElement=function(e,t,n,i){n=n||this.getRootElement();const r=this._eventBus,o=this._graphicsFactory;this._ensureValid(e,t),r.fire(e+\".add\",{element:t,parent:n}),this._setParent(t,n,i);const a=o.create(e,t,i);return this._elementRegistry.add(t,a),o.update(e,t,a),r.fire(e+\".added\",{element:t,gfx:a}),t},On.prototype.addShape=function(e,t,n){return this._addElement(\"shape\",e,t,n)},On.prototype.addConnection=function(e,t,n){return this._addElement(\"connection\",e,t,n)},On.prototype._removeElement=function(e,t){const n=this._elementRegistry,i=this._graphicsFactory,r=this._eventBus;if(e=n.get(e.id||e))return r.fire(t+\".remove\",{element:e}),i.remove(e),function(e,t){if(!e||!t)return-1;var n=e.indexOf(t);-1!==n&&e.splice(n,1)}(e.parent&&e.parent.children,e),e.parent=null,r.fire(t+\".removed\",{element:e}),n.remove(e),e},On.prototype.removeShape=function(e){return this._removeElement(e,\"shape\")},On.prototype.removeConnection=function(e){return this._removeElement(e,\"connection\")},On.prototype.getGraphics=function(e,t){return this._elementRegistry.getGraphics(e,t)},On.prototype._changeViewbox=function(e){this._eventBus.fire(\"canvas.viewbox.changing\"),e.apply(this),this._cachedViewbox=null,this._viewboxChanged()},On.prototype._viewboxChanged=function(){this._eventBus.fire(\"canvas.viewbox.changed\",{viewbox:this.viewbox()})},On.prototype.viewbox=function(e){if(void 0===e&&this._cachedViewbox)return this._cachedViewbox;const t=this._viewport,n=this.getSize();let i,r,o,a,s,l,p;return e?(this._changeViewbox((function(){s=Math.min(n.width/e.width,n.height/e.height);const i=this._svg.createSVGMatrix().scale(s).translate(-e.x,-e.y);ae(t,i)})),e):(o=this._rootElement?this.getActiveLayer():null,i=o&&o.getBBox()||{},a=ae(t),r=a?a.matrix:function(e,t,n,i,r,o){var a=Y().createSVGMatrix();switch(arguments.length){case 0:return a;case 1:return X(a,e);case 6:return X(a,{a:e,b:t,c:n,d:i,e:r,f:o})}}(),s=kn(r.a,1e3),l=kn(-r.e||0,1e3),p=kn(-r.f||0,1e3),e=this._cachedViewbox={x:l?l/s:0,y:p?p/s:0,width:n.width/s,height:n.height/s,scale:s,inner:{width:i.width||0,height:i.height||0,x:i.x||0,y:i.y||0},outer:n})},On.prototype.scroll=function(e){const t=this._viewport;let n=t.getCTM();return e&&this._changeViewbox((function(){e=E({dx:0,dy:0},e||{}),n=this._svg.createSVGMatrix().translate(e.dx,e.dy).multiply(n),Nn(t,n)})),{x:n.e,y:n.f}},On.prototype.scrollToElement=function(e,t){let n=100;\"string\"==typeof e&&(e=this._elementRegistry.get(e));const i=this.findRoot(e);i!==this.getRootElement()&&this.setRootElement(i),t||(t={}),\"number\"==typeof t&&(n=t),t={top:t.top||n,right:t.right||n,bottom:t.bottom||n,left:t.left||n};const r=Tt(e),o=ft(r),a=this.viewbox(),s=this.zoom();let l,p;a.y+=t.top/s,a.x+=t.left/s,a.width-=(t.right+t.left)/s,a.height-=(t.bottom+t.top)/s;const c=ft(a);if(r.width<a.width&&r.height<a.height){const e=Math.max(0,o.right-c.right),t=Math.min(0,o.left-c.left),n=Math.max(0,o.bottom-c.bottom),i=Math.min(0,o.top-c.top);l=e||t,p=n||i}else l=r.x-a.x,p=r.y-a.y;this.scroll({dx:-l*s,dy:-p*s})},On.prototype.zoom=function(e,t){if(!e)return this.viewbox(e).scale;if(\"fit-viewport\"===e)return this._fitViewport(t);let n,i;return this._changeViewbox((function(){\"object\"!=typeof t&&(n=this.viewbox().outer,t={x:n.width/2,y:n.height/2}),i=this._setZoom(e,t)})),kn(i.a,1e3)},On.prototype._fitViewport=function(e){const t=this.viewbox(),n=t.outer,i=t.inner;let r,o;return i.x>=0&&i.y>=0&&i.x+i.width<=n.width&&i.y+i.height<=n.height&&!e?o={x:0,y:0,width:Math.max(i.width+i.x,n.width),height:Math.max(i.height+i.y,n.height)}:(r=Math.min(1,n.width/i.width,n.height/i.height),o={x:i.x+(e?i.width/2-n.width/r/2:0),y:i.y+(e?i.height/2-n.height/r/2:0),width:n.width/r,height:n.height/r}),this.viewbox(o),this.viewbox(!1).scale},On.prototype._setZoom=function(e,t){const n=this._svg,i=this._viewport,r=n.createSVGMatrix(),o=n.createSVGPoint();let a,s,l,p,c;l=i.getCTM();const u=l.a;return t?(a=E(o,t),s=a.matrixTransform(l.inverse()),p=r.translate(s.x,s.y).scale(1/u*e).translate(-s.x,-s.y),c=l.multiply(p)):c=r.scale(e),Nn(this._viewport,c),c},On.prototype.getSize=function(){return{width:this._container.clientWidth,height:this._container.clientHeight}},On.prototype.getAbsoluteBBox=function(e){const t=this.viewbox();let n;if(e.waypoints){n=this.getGraphics(e).getBBox()}else n=e;return{x:n.x*t.scale-t.x*t.scale,y:n.y*t.scale-t.y*t.scale,width:n.width*t.scale,height:n.height*t.scale}},On.prototype.resized=function(){delete this._cachedViewbox,this._eventBus.fire(\"canvas.resized\")};var Bn=\"data-element-id\";function Ln(e){this._elements={},this._eventBus=e}Ln.$inject=[\"eventBus\"],Ln.prototype.add=function(e,t,n){var i=e.id;this._validateId(i),j(t,Bn,i),n&&j(n,Bn,i),this._elements[i]={element:e,gfx:t,secondaryGfx:n}},Ln.prototype.remove=function(e){var t=this._elements,n=e.id||e,i=n&&t[n];i&&(j(i.gfx,Bn,\"\"),i.secondaryGfx&&j(i.secondaryGfx,Bn,\"\"),delete t[n])},Ln.prototype.updateId=function(e,t){this._validateId(t),\"string\"==typeof e&&(e=this.get(e)),this._eventBus.fire(\"element.updateId\",{element:e,newId:t});var n=this.getGraphics(e),i=this.getGraphics(e,!0);this.remove(e),e.id=t,this.add(e,n,i)},Ln.prototype.updateGraphics=function(e,t,n){var i=e.id||e,r=this._elements[i];return n?r.secondaryGfx=t:r.gfx=t,t&&j(t,Bn,i),t},Ln.prototype.get=function(e){var t;t=\"string\"==typeof e?e:e&&j(e,Bn);var n=this._elements[t];return n&&n.element},Ln.prototype.filter=function(e){var t=[];return this.forEach((function(n,i){e(n,i)&&t.push(n)})),t},Ln.prototype.find=function(e){for(var t=this._elements,n=Object.keys(t),i=0;i<n.length;i++){var r=t[n[i]],o=r.element;if(e(o,r.gfx))return o}},Ln.prototype.getAll=function(){return this.filter((function(e){return e}))},Ln.prototype.forEach=function(e){var t=this._elements;Object.keys(t).forEach((function(n){var i=t[n],r=i.element,o=i.gfx;return e(r,o)}))},Ln.prototype.getGraphics=function(e,t){var n=e.id||e,i=this._elements[n];return i&&(t?i.secondaryGfx:i.gfx)},Ln.prototype._validateId=function(e){if(!e)throw new Error(\"element must have an id\");if(this._elements[e])throw new Error(\"element with id \"+e+\" already added\")};var In={exports:{}},jn={};jn.extend=function(e,t,n,i){var r=n.inverse;return Object.defineProperty(e,\"remove\",{value:function(e){var n=this.indexOf(e);return-1!==n&&(this.splice(n,1),t.unset(e,r,i)),e}}),Object.defineProperty(e,\"contains\",{value:function(e){return-1!==this.indexOf(e)}}),Object.defineProperty(e,\"add\",{value:function(e,n){var o=this.indexOf(e);if(void 0===n){if(-1!==o)return;n=this.length}-1!==o&&this.splice(o,1),this.splice(n,0,e),-1===o&&t.set(e,r,i)}}),Object.defineProperty(e,\"__refs_collection\",{value:!0}),e},jn.isExtended=function(e){return!0===e.__refs_collection};var Fn=jn;function Vn(e,t,n){var i=Fn.extend(n[t.name]||[],e,t,n);Object.defineProperty(n,t.name,{enumerable:t.enumerable,value:i}),i.length&&i.forEach((function(i){e.set(i,t.inverse,n)}))}function Wn(e,t){if(!(this instanceof Wn))return new Wn(e,t);e.inverse=t,t.inverse=e,this.props={},this.props[e.name]=e,this.props[t.name]=t}Wn.prototype.bind=function(e,t){if(\"string\"==typeof t){if(!this.props[t])throw new Error(\"no property <\"+t+\"> in ref\");t=this.props[t]}t.collection?Vn(this,t,e):function(e,t,n){var i=t.inverse,r=n[t.name];Object.defineProperty(n,t.name,{configurable:t.configurable,enumerable:t.enumerable,get:function(){return r},set:function(t){if(t!==r){var o=r;r=null,o&&e.unset(o,i,n),r=t,e.set(r,i,n)}}})}(this,t,e)},Wn.prototype.ensureRefsCollection=function(e,t){var n=e[t.name];return Fn.isExtended(n)||Vn(this,t,e),n},Wn.prototype.ensureBound=function(e,t){(function(e,t){return Object.prototype.hasOwnProperty.call(e,t.name||t)})(e,t)||this.bind(e,t)},Wn.prototype.unset=function(e,t,n){e&&(this.ensureBound(e,t),t.collection?this.ensureRefsCollection(e,t).remove(n):e[t.name]=void 0)},Wn.prototype.set=function(e,t,n){e&&(this.ensureBound(e,t),t.collection?this.ensureRefsCollection(e,t).add(n):e[t.name]=n)};var zn=Wn;In.exports=zn,In.exports.Collection=jn;var Gn=mt(In.exports),$n=new Gn({name:\"children\",enumerable:!0,collection:!0},{name:\"parent\"}),Hn=new Gn({name:\"labels\",enumerable:!0,collection:!0},{name:\"labelTarget\"}),Kn=new Gn({name:\"attachers\",collection:!0},{name:\"host\"}),Un=new Gn({name:\"outgoing\",collection:!0},{name:\"source\"}),qn=new Gn({name:\"incoming\",collection:!0},{name:\"target\"});function Yn(){Object.defineProperty(this,\"businessObject\",{writable:!0}),Object.defineProperty(this,\"label\",{get:function(){return this.labels[0]},set:function(e){var t=this.label,n=this.labels;!e&&t?n.remove(t):n.add(e,0)}}),$n.bind(this,\"parent\"),Hn.bind(this,\"labels\"),Un.bind(this,\"outgoing\"),qn.bind(this,\"incoming\")}function Xn(){Yn.call(this),$n.bind(this,\"children\"),Kn.bind(this,\"host\"),Kn.bind(this,\"attachers\")}function Zn(){Yn.call(this),$n.bind(this,\"children\")}function Jn(){Xn.call(this),Hn.bind(this,\"labelTarget\")}function Qn(){Yn.call(this),Un.bind(this,\"source\"),qn.bind(this,\"target\")}e(Xn,Yn),e(Zn,Xn),e(Jn,Xn),e(Qn,Yn);var ei={connection:Qn,shape:Xn,label:Jn,root:Zn};function ti(){this._uid=12}ti.prototype.createRoot=function(e){return this.create(\"root\",e)},ti.prototype.createLabel=function(e){return this.create(\"label\",e)},ti.prototype.createShape=function(e){return this.create(\"shape\",e)},ti.prototype.createConnection=function(e){return this.create(\"connection\",e)},ti.prototype.create=function(e,t){return(t=E({},t||{})).id||(t.id=e+\"_\"+this._uid++),function(e,t){var n=ei[e];if(!n)throw new Error(\"unknown type: <\"+e+\">\");return E(new n,t)}(e,t)};var ni=\"__fn\",ii=Array.prototype.slice;function ri(){this._listeners={},this.on(\"diagram.destroy\",1,this._destroy,this)}function oi(){}function ai(e,t){this._eventBus=e,this._elementRegistry=t}function si(e,t,n){var i=n||t.firstChild;e!==i&&t.insertBefore(e,i)}ri.prototype.on=function(e,t,n,i){if(e=r(e)?e:[e],s(t)&&(i=n,n=t,t=1e3),!a(t))throw new Error(\"priority must be a number\");var o=n;i&&((o=b(n,i))[ni]=n[ni]||n);var l=this;e.forEach((function(e){l._addListener(e,{priority:t,callback:o,next:null})}))},ri.prototype.once=function(e,t,n,i){var r=this;if(s(t)&&(i=n,n=t,t=1e3),!a(t))throw new Error(\"priority must be a number\");function o(){o.__isTomb=!0;var t=n.apply(i,arguments);return r.off(e,o),t}o[ni]=n,this.on(e,t,o)},ri.prototype.off=function(e,t){e=r(e)?e:[e];var n=this;e.forEach((function(e){n._removeListener(e,t)}))},ri.prototype.createEvent=function(e){var t=new oi;return t.init(e),t},ri.prototype.fire=function(e,t){var n,i,r,o;if(o=ii.call(arguments),\"object\"==typeof e&&(e=(t=e).type),!e)throw new Error(\"no event type specified\");if(i=this._listeners[e]){n=t instanceof oi?t:this.createEvent(t),o[0]=n;var a=n.type;e!==a&&(n.type=e);try{r=this._invokeListeners(n,o,i)}finally{e!==a&&(n.type=a)}return void 0===r&&n.defaultPrevented&&(r=!1),r}},ri.prototype.handleError=function(e){return!1===this.fire(\"error\",{error:e})},ri.prototype._destroy=function(){this._listeners={}},ri.prototype._invokeListeners=function(e,t,n){for(var i;n&&!e.cancelBubble;)i=this._invokeListener(e,t,n),n=n.next;return i},ri.prototype._invokeListener=function(e,t,n){var i;if(n.callback.__isTomb)return i;try{i=function(e,t){return e.apply(null,t)}(n.callback,t),void 0!==i&&(e.returnValue=i,e.stopPropagation()),!1===i&&e.preventDefault()}catch(e){if(!this.handleError(e))throw console.error(\"unhandled error in event listener\",e),e}return i},ri.prototype._addListener=function(e,t){var n,i=this._getListeners(e);if(i){for(;i;){if(i.priority<t.priority)return t.next=i,void(n?n.next=t:this._setListeners(e,t));n=i,i=i.next}n.next=t}else this._setListeners(e,t)},ri.prototype._getListeners=function(e){return this._listeners[e]},ri.prototype._setListeners=function(e,t){this._listeners[e]=t},ri.prototype._removeListener=function(e,t){var n,i,r,o=this._getListeners(e);if(t)for(;o;)n=o.next,(r=o.callback)!==t&&r[ni]!==t||(i?i.next=n:this._setListeners(e,n)),i=o,o=n;else this._setListeners(e,null)},oi.prototype.stopPropagation=function(){this.cancelBubble=!0},oi.prototype.preventDefault=function(){this.defaultPrevented=!0},oi.prototype.init=function(e){E(this,e||{})},ai.$inject=[\"eventBus\",\"elementRegistry\"],ai.prototype._getChildrenContainer=function(e){var t,n=this._elementRegistry.getGraphics(e);return e.parent?(t=function(e){return e.parentNode.childNodes[1]}(n),t||(V(t=U(\"g\")).add(\"djs-children\"),N(n.parentNode,t))):t=n,t},ai.prototype._clear=function(e){var t=function(e){return e.childNodes[0]}(e);return Pe(t),t},ai.prototype._createContainer=function(e,t,n,i){var r=U(\"g\");V(r).add(\"djs-group\"),void 0!==n?si(r,t,t.childNodes[n]):N(t,r);var o=U(\"g\");V(o).add(\"djs-element\"),V(o).add(\"djs-\"+e),i&&V(o).add(\"djs-frame\"),N(r,o);var a=U(\"g\");return V(a).add(\"djs-visual\"),N(o,a),o},ai.prototype.create=function(e,t,n){var i=this._getChildrenContainer(t.parent);return this._createContainer(e,i,n,Nt(t))},ai.prototype.updateContainments=function(e){var t,n=this,i=this._elementRegistry;t=m(e,(function(e,t){return t.parent&&(e[t.parent.id]=t.parent),e}),{}),h(t,(function(e){var t=e.children;if(t){var r=n._getChildrenContainer(e);h(t.slice().reverse(),(function(e){si(i.getGraphics(e).parentNode,r)}))}}))},ai.prototype.drawShape=function(e,t){return this._eventBus.fire(\"render.shape\",{gfx:e,element:t})},ai.prototype.getShapePath=function(e){return this._eventBus.fire(\"render.getShapePath\",e)},ai.prototype.drawConnection=function(e,t){return this._eventBus.fire(\"render.connection\",{gfx:e,element:t})},ai.prototype.getConnectionPath=function(e){return this._eventBus.fire(\"render.getConnectionPath\",e)},ai.prototype.update=function(e,t,n){if(t.parent){var i=this._clear(n);if(\"shape\"===e)this.drawShape(i,t),qe(n,t.x,t.y);else{if(\"connection\"!==e)throw new Error(\"unknown type: \"+e);this.drawConnection(i,t)}t.hidden?j(n,\"display\",\"none\"):j(n,\"display\",\"block\")}},ai.prototype.remove=function(e){z(this._elementRegistry.getGraphics(e).parentNode)};var li={__depends__:[Mn],__init__:[\"canvas\"],canvas:[\"type\",On],elementRegistry:[\"type\",Ln],elementFactory:[\"type\",ti],eventBus:[\"type\",ri],graphicsFactory:[\"type\",ai]};function pi(e){return function(e){var t=new Sn(e);return t.init(),t}([{config:[\"value\",e=e||{}]},li].concat(e.modules||[]))}function ci(e,t){this._injector=t=t||pi(e),this.get=t.get,this.invoke=t.invoke,this.get(\"eventBus\").fire(\"diagram.init\")}function ui(){}function hi(e,t){this.model=e,this.properties=t}ci.prototype.destroy=function(){this.get(\"eventBus\").fire(\"diagram.destroy\")},ci.prototype.clear=function(){this.get(\"eventBus\").fire(\"diagram.clear\")},ui.prototype.get=function(e){return this.$model.properties.get(this,e)},ui.prototype.set=function(e,t){this.$model.properties.set(this,e,t)},hi.prototype.createType=function(e){var t=this.model,n=this.properties,i=Object.create(ui.prototype);h(e.properties,(function(e){e.isMany||void 0===e.default||(i[e.name]=e.default)})),n.defineModel(i,t),n.defineDescriptor(i,e);var r=e.ns.name;function o(e){n.define(this,\"$type\",{value:r,enumerable:!0}),n.define(this,\"$attrs\",{value:{}}),n.define(this,\"$parent\",{writable:!0}),h(e,b((function(e,t){this.set(t,e)}),this))}return o.prototype=i,o.hasType=i.$instanceOf=this.model.hasType,n.defineModel(o,t),n.defineDescriptor(o,e),o};var mi={String:!0,Boolean:!0,Integer:!0,Real:!0,Element:!0},fi={String:function(e){return e},Boolean:function(e){return\"true\"===e},Integer:function(e){return parseInt(e,10)},Real:function(e){return parseFloat(e)}};function di(e,t){var n=fi[e];return n?n(t):t}function yi(e){return!!mi[e]}function gi(e){return!!fi[e]}function vi(e,t){var n,i,r=e.split(/:/);if(1===r.length)n=e,i=t;else{if(2!==r.length)throw new Error(\"expected <prefix:localName> or <localName>, got \"+e);n=r[1],i=r[0]}return{name:e=(i?i+\":\":\"\")+n,prefix:i,localName:n}}function xi(e){this.ns=e,this.name=e.name,this.allTypes=[],this.allTypesByName={},this.properties=[],this.propertiesByName={}}function bi(e,t){this.packageMap={},this.typeMap={},this.packages=[],this.properties=t,h(e,b(this.registerPackage,this))}function Ei(e,t,n){var i=t[n];if(i in e)throw new Error(\"package with \"+n+\" <\"+i+\"> already defined\")}function wi(e){this.model=e}function _i(e,t,n){Object.defineProperty(e,t.name,{enumerable:!t.isReference,writable:!0,value:n,configurable:!0})}function Ai(e){this.properties=new wi(this),this.factory=new hi(this,this.properties),this.registry=new bi(e,this.properties),this.typeCache={}}xi.prototype.build=function(){return function(e,t){let n={},i=Object(e);return h(t,(function(t){t in i&&(n[t]=e[t])})),n}(this,[\"ns\",\"name\",\"allTypes\",\"allTypesByName\",\"properties\",\"propertiesByName\",\"bodyProperty\",\"idProperty\"])},xi.prototype.addProperty=function(e,t,n){\"boolean\"==typeof t&&(n=t,t=void 0),this.addNamedProperty(e,!1!==n);var i=this.properties;void 0!==t?i.splice(t,0,e):i.push(e)},xi.prototype.replaceProperty=function(e,t,n){var i=e.ns,r=this.properties,o=this.propertiesByName,a=e.name!==t.name;if(e.isId){if(!t.isId)throw new Error(\"property <\"+t.ns.name+\"> must be id property to refine <\"+e.ns.name+\">\");this.setIdProperty(t,!1)}if(e.isBody){if(!t.isBody)throw new Error(\"property <\"+t.ns.name+\"> must be body property to refine <\"+e.ns.name+\">\");this.setBodyProperty(t,!1)}var s=r.indexOf(e);if(-1===s)throw new Error(\"property <\"+i.name+\"> not found in property list\");r.splice(s,1),this.addProperty(t,n?void 0:s,a),o[i.name]=o[i.localName]=t},xi.prototype.redefineProperty=function(e,t,n){var i=e.ns.prefix,r=t.split(\"#\"),o=vi(r[0],i),a=vi(r[1],o.prefix).name,s=this.propertiesByName[a];if(!s)throw new Error(\"refined property <\"+a+\"> not found\");this.replaceProperty(s,e,n),delete e.redefines},xi.prototype.addNamedProperty=function(e,t){var n=e.ns,i=this.propertiesByName;t&&(this.assertNotDefined(e,n.name),this.assertNotDefined(e,n.localName)),i[n.name]=i[n.localName]=e},xi.prototype.removeNamedProperty=function(e){var t=e.ns,n=this.propertiesByName;delete n[t.name],delete n[t.localName]},xi.prototype.setBodyProperty=function(e,t){if(t&&this.bodyProperty)throw new Error(\"body property defined multiple times (<\"+this.bodyProperty.ns.name+\">, <\"+e.ns.name+\">)\");this.bodyProperty=e},xi.prototype.setIdProperty=function(e,t){if(t&&this.idProperty)throw new Error(\"id property defined multiple times (<\"+this.idProperty.ns.name+\">, <\"+e.ns.name+\">)\");this.idProperty=e},xi.prototype.assertNotDefined=function(e,t){var n=e.name,i=this.propertiesByName[n];if(i)throw new Error(\"property <\"+n+\"> already defined; override of <\"+i.definedBy.ns.name+\"#\"+i.ns.name+\"> by <\"+e.definedBy.ns.name+\"#\"+e.ns.name+\"> not allowed without redefines\")},xi.prototype.hasProperty=function(e){return this.propertiesByName[e]},xi.prototype.addTrait=function(e,t){var n=this.allTypesByName,i=this.allTypes,r=e.name;r in n||(h(e.properties,b((function(n){n=E({},n,{name:n.ns.localName,inherited:t}),Object.defineProperty(n,\"definedBy\",{value:e});var i=n.replaces,r=n.redefines;i||r?this.redefineProperty(n,i||r,i):(n.isBody&&this.setBodyProperty(n),n.isId&&this.setIdProperty(n),this.addProperty(n))}),this)),i.push(e),n[r]=e)},bi.prototype.getPackage=function(e){return this.packageMap[e]},bi.prototype.getPackages=function(){return this.packages},bi.prototype.registerPackage=function(e){e=E({},e);var t=this.packageMap;Ei(t,e,\"prefix\"),Ei(t,e,\"uri\"),h(e.types,b((function(t){this.registerType(t,e)}),this)),t[e.uri]=t[e.prefix]=e,this.packages.push(e)},bi.prototype.registerType=function(e,t){var n=vi((e=E({},e,{superClass:(e.superClass||[]).slice(),extends:(e.extends||[]).slice(),properties:(e.properties||[]).slice(),meta:E(e.meta||{})})).name,t.prefix),i=n.name,r={};h(e.properties,b((function(e){var t=vi(e.name,n.prefix),i=t.name;yi(e.type)||(e.type=vi(e.type,t.prefix).name),E(e,{ns:t,name:i}),r[i]=e}),this)),E(e,{ns:n,name:i,propertiesByName:r}),h(e.extends,b((function(e){var t=this.typeMap[e];t.traits=t.traits||[],t.traits.push(i)}),this)),this.definePackage(e,t),this.typeMap[i]=e},bi.prototype.mapTypes=function(e,t,n){var i=yi(e.name)?{name:e.name}:this.typeMap[e.name],r=this;function o(e){return a(e,!0)}function a(n,i){var o=vi(n,yi(n)?\"\":e.prefix);r.mapTypes(o,t,i)}if(!i)throw new Error(\"unknown type <\"+e.name+\">\");h(i.superClass,n?o:a),t(i,!n),h(i.traits,o)},bi.prototype.getEffectiveDescriptor=function(e){var t=vi(e),n=new xi(t);this.mapTypes(t,(function(e,t){n.addTrait(e,t)}));var i=n.build();return this.definePackage(i,i.allTypes[i.allTypes.length-1].$pkg),i},bi.prototype.definePackage=function(e,t){this.properties.define(e,\"$pkg\",{value:t})},wi.prototype.set=function(e,t,n){if(!l(t)||!t.length)throw new TypeError(\"property name must be a non-empty string\");var i=this.model.getPropertyDescriptor(e,t),r=i&&i.name;void 0===n?i?delete e[r]:delete e.$attrs[t]:i?r in e?e[r]=n:_i(e,i,n):e.$attrs[t]=n},wi.prototype.get=function(e,t){var n=this.model.getPropertyDescriptor(e,t);if(!n)return e.$attrs[t];var i=n.name;return!e[i]&&n.isMany&&_i(e,n,[]),e[i]},wi.prototype.define=function(e,t,n){if(!n.writable){var i=n.value;delete(n=E({},n,{get:function(){return i}})).value}Object.defineProperty(e,t,n)},wi.prototype.defineDescriptor=function(e,t){this.define(e,\"$descriptor\",{value:t})},wi.prototype.defineModel=function(e,t){this.define(e,\"$model\",{value:t})},Ai.prototype.create=function(e,t){var n=this.getType(e);if(!n)throw new Error(\"unknown type <\"+e+\">\");return new n(t)},Ai.prototype.getType=function(e){var t=this.typeCache,n=l(e)?e:e.ns.name,i=t[n];return i||(e=this.registry.getEffectiveDescriptor(n),i=t[n]=this.factory.createType(e)),i},Ai.prototype.createAny=function(e,t,n){var i=vi(e),r={$type:e,$instanceOf:function(e){return e===this.$type}},a={name:e,isGeneric:!0,ns:{prefix:i.prefix,localName:i.localName,uri:t}};return this.properties.defineDescriptor(r,a),this.properties.defineModel(r,this),this.properties.define(r,\"$parent\",{enumerable:!1,writable:!0}),this.properties.define(r,\"$instanceOf\",{enumerable:!1,writable:!0}),h(n,(function(e,t){o(e)&&void 0!==e.value?r[e.name]=e.value:r[t]=e})),r},Ai.prototype.getPackage=function(e){return this.registry.getPackage(e)},Ai.prototype.getPackages=function(){return this.registry.getPackages()},Ai.prototype.getElementDescriptor=function(e){return e.$descriptor},Ai.prototype.hasType=function(e,t){return void 0===t&&(t=e,e=this),t in e.$model.getElementDescriptor(e).allTypesByName},Ai.prototype.getPropertyDescriptor=function(e,t){return this.getElementDescriptor(e).propertiesByName[t]},Ai.prototype.getTypeDescriptor=function(e){return this.registry.typeMap[e]};var Si=String.fromCharCode,Ri=Object.prototype.hasOwnProperty,Ci=/&#(\\d+);|&#x([0-9a-f]+);|&(\\w+);/gi,Mi={amp:\"&\",apos:\"'\",gt:\">\",lt:\"<\",quot:'\"'};function ki(e,t,n,i){return i?Ri.call(Mi,i)?Mi[i]:\"&\"+i+\";\":Si(t||parseInt(n,16))}function Pi(e){return e.length>3&&-1!==e.indexOf(\"&\")?e.replace(Ci,ki):e}Object.keys(Mi).forEach((function(e){Mi[e.toUpperCase()]=Mi[e]}));var Di=\"xsi:type\",Ti=\"non-whitespace outside of root node\";function Oi(e){return new Error(e)}function Ni(e){return\"missing namespace for prefix <\"+e+\">\"}function Bi(e){return{get:e,enumerable:!0}}function Li(e){var t,n={};for(t in e)n[t]=e[t];return n}function Ii(e){return e+\"$uri\"}function ji(){return{line:0,column:0}}function Fi(e){throw e}function Vi(e){if(!this)return new Vi(e);var t,n,i,r,o,a,s,l,p,c=e&&e.proxy,u=Fi,h=ji,m=!1,f=!1,d=null,y=!1;function g(e){e instanceof Error||(e=Oi(e)),d=e,u(e,h)}function v(e){o&&(e instanceof Error||(e=Oi(e)),o(e,h))}this.on=function(e,p){if(\"function\"!=typeof p)throw Oi(\"required args <name, cb>\");switch(e){case\"openTag\":n=p;break;case\"text\":t=p;break;case\"closeTag\":i=p;break;case\"error\":u=p;break;case\"warn\":o=p;break;case\"cdata\":r=p;break;case\"attention\":l=p;break;case\"question\":s=p;break;case\"comment\":a=p;break;default:throw Oi(\"unsupported event: \"+e)}return this},this.ns=function(e){if(void 0===e&&(e={}),\"object\"!=typeof e)throw Oi(\"required args <nsMap={}>\");var t,n={};for(t in e)n[t]=e[t];return n[\"http://www.w3.org/2001/XMLSchema-instance\"]=\"xsi\",f=!0,p=n,this},this.parse=function(e){if(\"string\"!=typeof e)throw Oi(\"required args <xml=string>\");return d=null,function(e){var o,u,d,x,b,E,w,_,A,S,R,C=f?[]:null,M=f?function(e){var t,n,i={};for(t in e)i[n=e[t]]=n,i[Ii(n)]=t;return i}(p):null,k=[],P=0,D=!1,T=!1,O=0,N=0,B=\"\",L=0;function I(){if(null!==R)return R;var e,t,n,i,r,o,a,s,l,c,u,h=f&&M.xmlns,d=f&&m?[]:null,y=L,g=B,x=g.length,b={},E={};e:for(;y<x;y++)if(l=!1,!(32===(c=g.charCodeAt(y))||c<14&&c>8)){for((c<65||c>122||c>90&&c<97)&&95!==c&&58!==c&&(v(\"illegal first char attribute name\"),l=!0),u=y+1;u<x;u++)if(!((c=g.charCodeAt(u))>96&&c<123||c>64&&c<91||c>47&&c<59||46===c||45===c||95===c)){if(32===c||c<14&&c>8){v(\"missing attribute value\"),y=u;continue e}if(61===c)break;v(\"illegal attribute name char\"),l=!0}if(\"xmlns:xmlns\"===(s=g.substring(y,u))&&(v(\"illegal declaration of xmlns\"),l=!0),34===(c=g.charCodeAt(u+1)))-1===(u=g.indexOf('\"',y=u+2))&&-1!==(u=g.indexOf(\"'\",y))&&(v(\"attribute value quote missmatch\"),l=!0);else if(39===c)-1===(u=g.indexOf(\"'\",y=u+2))&&-1!==(u=g.indexOf('\"',y))&&(v(\"attribute value quote missmatch\"),l=!0);else for(v(\"missing attribute value quotes\"),l=!0,u+=1;u<x&&!(32===(c=g.charCodeAt(u+1))||c<14&&c>8);u++);for(-1===u&&(v(\"missing closing quotes\"),u=x,l=!0),l||(o=g.substring(y,u)),y=u;u+1<x&&!(32===(c=g.charCodeAt(u+1))||c<14&&c>8);u++)y===u&&(v(\"illegal character after attribute end\"),l=!0);if(y=u+1,!l)if(s in E)v(\"attribute <\"+s+\"> already defined\");else if(E[s]=!0,f)if(m){if(null!==(r=\"xmlns\"===s?\"xmlns\":120===s.charCodeAt(0)&&\"xmlns:\"===s.substr(0,6)?s.substr(6):null)){if(e=Pi(o),t=Ii(r),!(a=p[e])){if(\"xmlns\"===r||t in M&&M[t]!==e)do{a=\"ns\"+P++}while(void 0!==M[a]);else a=r;p[e]=a}M[r]!==a&&(i||(M=Li(M),i=!0),M[r]=a,\"xmlns\"===r&&(M[Ii(a)]=e,h=a),M[t]=e),b[s]=o;continue}d.push(s,o)}else-1!==(c=s.indexOf(\":\"))?(n=M[s.substring(0,c)])?((s=h===n?s.substr(c+1):n+s.substr(c))===Di&&(-1!==(c=o.indexOf(\":\"))?(n=o.substring(0,c),o=(n=M[n]||n)+o.substring(c)):o=h+\":\"+o),b[s]=o):v(Ni(s.substring(0,c))):b[s]=o;else b[s]=o}if(m)for(y=0,x=d.length;y<x;y++){if(s=d[y++],o=d[y],-1!==(c=s.indexOf(\":\"))){if(!(n=M[s.substring(0,c)])){v(Ni(s.substring(0,c)));continue}(s=h===n?s.substr(c+1):n+s.substr(c))===Di&&(-1!==(c=o.indexOf(\":\"))?(n=o.substring(0,c),o=(n=M[n]||n)+o.substring(c)):o=h+\":\"+o)}b[s]=o}return R=b}function j(){for(var t,n,i=/(\\r\\n|\\r|\\n)/g,r=0,o=0,a=0,s=N;O>=a&&(t=i.exec(e))&&!((s=t[0].length+t.index)>O);)r+=1,a=s;return-1==O?(o=s,n=e.substring(N)):0===N?n=e.substring(N,O):(o=O-a,n=-1==N?e.substring(O):e.substring(O,N+1)),{data:n,line:r,column:o}}h=j,c&&(S=Object.create({},{name:Bi((function(){return _})),originalName:Bi((function(){return A})),attrs:Bi(I),ns:Bi((function(){return M}))}));for(;-1!==N;){if(-1===(O=60===e.charCodeAt(N)?N:e.indexOf(\"<\",N)))return k.length?g(\"unexpected end of file\"):0===N?g(\"missing start tag\"):void(N<e.length&&e.substring(N).trim()&&v(Ti));if(N!==O)if(k.length){if(t&&(t(e.substring(N,O),Pi,h),y))return}else if(e.substring(N,O).trim()&&(v(Ti),y))return;if(33===(b=e.charCodeAt(O+1))){if(91===(x=e.charCodeAt(O+2))&&\"CDATA[\"===e.substr(O+3,6)){if(-1===(N=e.indexOf(\"]]>\",O)))return g(\"unclosed cdata\");if(r&&(r(e.substring(O+9,N),h),y))return;N+=3;continue}if(45===x&&45===e.charCodeAt(O+3)){if(-1===(N=e.indexOf(\"--\\x3e\",O)))return g(\"unclosed comment\");if(a&&(a(e.substring(O+4,N),Pi,h),y))return;N+=3;continue}}if(63!==b){for(u=O+1;;u++){if(E=e.charCodeAt(u),isNaN(E))return N=-1,g(\"unclosed tag\");if(34===E)u=-1!==(x=e.indexOf('\"',u+1))?x:u;else if(39===E)u=-1!==(x=e.indexOf(\"'\",u+1))?x:u;else if(62===E){N=u;break}}if(33!==b){if(R={},47===b){if(D=!1,T=!0,!k.length)return g(\"missing open tag\");if(u=_=k.pop(),x=O+2+u.length,e.substring(O+2,x)!==u)return g(\"closing tag mismatch\");for(;x<N;x++)if(!(32===(b=e.charCodeAt(x))||b>8&&b<14))return g(\"close tag\")}else{if(47===e.charCodeAt(N-1)?(u=_=e.substring(O+1,N-1),D=!0,T=!0):(u=_=e.substring(O+1,N),D=!0,T=!1),!(b>96&&b<123||b>64&&b<91||95===b||58===b))return g(\"illegal first char nodeName\");for(x=1,d=u.length;x<d;x++)if(!((b=u.charCodeAt(x))>96&&b<123||b>64&&b<91||b>47&&b<59||45===b||95===b||46==b)){if(32===b||b<14&&b>8){_=u.substring(0,x),R=null;break}return g(\"invalid nodeName\")}T||k.push(_)}if(f){if(o=M,D&&(T||C.push(o),null===R&&(m=-1!==u.indexOf(\"xmlns\",x))&&(L=x,B=u,I(),m=!1)),A=_,-1!==(b=_.indexOf(\":\"))){if(!(w=M[_.substring(0,b)]))return g(\"missing namespace on <\"+A+\">\");_=_.substr(b+1)}else w=M.xmlns;w&&(_=w+\":\"+_)}if(D&&(L=x,B=u,n&&(c?n(S,Pi,T,h):n(_,I,Pi,T,h),y)))return;if(T){if(i&&(i(c?S:_,Pi,D,h),y))return;f&&(M=D?o:C.pop())}N+=1}else{if(l&&(l(e.substring(O,N+1),Pi,h),y))return;N+=1}}else{if(-1===(N=e.indexOf(\"?>\",O)))return g(\"unclosed question\");if(s&&(s(e.substring(O,N+2),h),y))return;N+=2}}}(e),h=ji,y=!1,d},this.stop=function(){y=!0}}function Wi(e){return e.xml&&\"lowerCase\"===e.xml.tagAlias}var zi={xsi:\"http://www.w3.org/2001/XMLSchema-instance\",xml:\"http://www.w3.org/XML/1998/namespace\"},Gi=\"xsi:type\";function $i(e){return e.xml&&e.xml.serialize}function Hi(e){return $i(e)===Gi}function Ki(e,t){return Wi(t)?e.prefix+\":\"+((n=e.localName).charAt(0).toUpperCase()+n.slice(1)):e.name;var n}function Ui(e){return new Error(e)}function qi(e){return e.$descriptor}function Yi(e){E(this,e),this.elementsById={},this.references=[],this.warnings=[],this.addReference=function(e){this.references.push(e)},this.addElement=function(e){if(!e)throw Ui(\"expected element\");var t,n=this.elementsById,i=qi(e).idProperty;if(i&&(t=e.get(i.name))){if(n[t])throw Ui(\"duplicate ID <\"+t+\">\");n[t]=e}},this.addWarning=function(e){this.warnings.push(e)}}function Xi(){}function Zi(){}function Ji(){}function Qi(e,t){this.property=e,this.context=t}function er(e,t){this.element=t,this.propertyDesc=e}function tr(){}function nr(e,t,n){this.model=e,this.type=e.getType(t),this.context=n}function ir(e,t,n){nr.call(this,e,t,n)}function rr(e,t,n){this.model=e,this.context=n}function or(e){e instanceof Ai&&(e={model:e}),E(this,{lax:!1},e)}Xi.prototype.handleEnd=function(){},Xi.prototype.handleText=function(){},Xi.prototype.handleNode=function(){},Zi.prototype=Object.create(Xi.prototype),Zi.prototype.handleNode=function(){return this},Ji.prototype=Object.create(Xi.prototype),Ji.prototype.handleText=function(e){this.body=(this.body||\"\")+e},Qi.prototype=Object.create(Ji.prototype),Qi.prototype.handleNode=function(e){if(this.element)throw Ui(\"expected no sub nodes\");return this.element=this.createReference(e),this},Qi.prototype.handleEnd=function(){this.element.id=this.body},Qi.prototype.createReference=function(e){return{property:this.property.ns.name,id:\"\"}},er.prototype=Object.create(Ji.prototype),er.prototype.handleEnd=function(){var e=this.body||\"\",t=this.element,n=this.propertyDesc;e=di(n.type,e),n.isMany?t.get(n.name).push(e):t.set(n.name,e)},tr.prototype=Object.create(Ji.prototype),tr.prototype.handleNode=function(e){var t=this,n=this.element;return n?t=this.handleChild(e):(n=this.element=this.createElement(e),this.context.addElement(n)),t},nr.prototype=Object.create(tr.prototype),nr.prototype.addReference=function(e){this.context.addReference(e)},nr.prototype.handleText=function(e){if(!qi(this.element).bodyProperty)throw Ui(\"unexpected body text <\"+e+\">\");Ji.prototype.handleText.call(this,e)},nr.prototype.handleEnd=function(){var e=this.body,t=this.element,n=qi(t).bodyProperty;n&&void 0!==e&&(e=di(n.type,e),t.set(n.name,e))},nr.prototype.createElement=function(e){var t,n=e.attributes,i=this.type,r=qi(i),o=this.context,a=new i({}),s=this.model;return h(n,(function(e,n){var i=r.propertiesByName[n];i&&i.isReference?i.isMany?h(e.split(\" \"),(function(e){o.addReference({element:a,property:i.ns.name,id:e})})):o.addReference({element:a,property:i.ns.name,id:e}):(i?e=di(i.type,e):\"xmlns\"!==n&&(t=vi(n,r.ns.prefix),s.getPackage(t.prefix)&&o.addWarning({message:\"unknown attribute <\"+n+\">\",element:a,property:n,value:e})),a.set(n,e))})),a},nr.prototype.getPropertyForNode=function(e){var t,n,i=vi(e.name),r=this.type,o=this.model,a=qi(r),s=i.name,l=a.propertiesByName[s];if(l&&!l.isAttr)return Hi(l)&&(t=e.attributes[Gi])?(t=function(e,t){var n=vi(e);return function(e,t){var n=e.name,i=e.localName,r=t.xml&&t.xml.typePrefix;return r&&0===i.indexOf(r)?e.prefix+\":\"+i.slice(r.length):n}(n,t.getPackage(n.prefix))}(t,o),E({},l,{effectiveType:qi(n=o.getType(t)).name})):l;var p=o.getPackage(i.prefix);if(p){if(t=Ki(i,p),n=o.getType(t),l=c(a.properties,(function(e){return!e.isVirtual&&!e.isReference&&!e.isAttribute&&n.hasType(e.type)})))return E({},l,{effectiveType:qi(n).name})}else if(l=c(a.properties,(function(e){return!e.isReference&&!e.isAttribute&&\"Element\"===e.type})))return l;throw Ui(\"unrecognized element <\"+i.name+\">\")},nr.prototype.toString=function(){return\"ElementDescriptor[\"+qi(this.type).name+\"]\"},nr.prototype.valueHandler=function(e,t){return new er(e,t)},nr.prototype.referenceHandler=function(e){return new Qi(e,this.context)},nr.prototype.handler=function(e){return\"Element\"===e?new rr(this.model,e,this.context):new nr(this.model,e,this.context)},nr.prototype.handleChild=function(e){var t,n,i,r;if(t=this.getPropertyForNode(e),i=this.element,gi(n=t.effectiveType||t.type))return this.valueHandler(t,i);var o=(r=t.isReference?this.referenceHandler(t).handleNode(e):this.handler(n).handleNode(e)).element;return void 0!==o&&(t.isMany?i.get(t.name).push(o):i.set(t.name,o),t.isReference?(E(o,{element:i}),this.context.addReference(o)):o.$parent=i),r},ir.prototype=Object.create(nr.prototype),ir.prototype.createElement=function(e){var t=e.name,n=vi(t),i=this.model,r=this.type,o=i.getPackage(n.prefix),a=o&&Ki(n,o)||t;if(!r.hasType(a))throw Ui(\"unexpected element <\"+e.originalName+\">\");return nr.prototype.createElement.call(this,e)},rr.prototype=Object.create(tr.prototype),rr.prototype.createElement=function(e){var t=e.name,n=vi(t).prefix,i=e.ns[n+\"$uri\"],r=e.attributes;return this.model.createAny(t,i,r)},rr.prototype.handleChild=function(e){var t=new rr(this.model,\"Element\",this.context).handleNode(e),n=this.element,i=t.element;return void 0!==i&&((n.$children=n.$children||[]).push(i),i.$parent=n),t},rr.prototype.handleEnd=function(){this.body&&(this.element.$body=this.body)},or.prototype.fromXML=function(e,t,n){var i=t.rootHandler;t instanceof nr?(i=t,t={}):\"string\"==typeof t?(i=this.handler(t),t={}):\"string\"==typeof i&&(i=this.handler(i));var r=this.model,o=this.lax,a=new Yi(E({},t,{rootHandler:i})),s=new Vi({proxy:!0}),l=function(){var e=[];return Object.defineProperty(e,\"peek\",{value:function(){return this[this.length-1]}}),e}();function p(e,t,n){var i=t(),r=i.line,o=i.column,s=i.data;\"<\"===s.charAt(0)&&-1!==s.indexOf(\" \")&&(s=s.slice(0,s.indexOf(\" \"))+\">\");var l=\"unparsable content \"+(s?s+\" \":\"\")+\"detected\\n\\tline: \"+r+\"\\n\\tcolumn: \"+o+\"\\n\\tnested error: \"+e.message;if(n)return a.addWarning({message:l,error:e}),!0;throw Ui(l)}function c(e,t){return p(e,t,!0)}i.context=a,l.push(i);var u=/^<\\?xml /i,h=/ encoding=\"([^\"]+)\"/i,m=/^utf-8$/i;function f(e,t){try{l.peek().handleText(e)}catch(e){c(e,t)}}var d=r.getPackages().reduce((function(e,t){return e[t.uri]=t.prefix,e}),{\"http://www.w3.org/XML/1998/namespace\":\"xml\"});return s.ns(d).on(\"openTag\",(function(e,t,n,i){var r=e.attrs||{},a=Object.keys(r).reduce((function(e,n){var i=t(r[n]);return e[n]=i,e}),{});!function(e,t){var n=l.peek();try{l.push(n.handleNode(e))}catch(e){p(e,t,o)&&l.push(new Zi)}}({name:e.name,originalName:e.originalName,attributes:a,ns:e.ns},i)})).on(\"question\",(function(e){if(u.test(e)){var t=h.exec(e),n=t&&t[1];n&&!m.test(n)&&a.addWarning({message:\"unsupported document encoding <\"+n+\">, falling back to UTF-8\"})}})).on(\"closeTag\",(function(){l.pop().handleEnd()})).on(\"cdata\",f).on(\"text\",(function(e,t,n){!function(e,t){e.trim()&&f(e,t)}(t(e),n)})).on(\"error\",p).on(\"warn\",c),new Promise((function(t,n){var r;try{s.parse(e),function(){var e,t,n=a.elementsById,i=a.references;for(e=0;t=i[e];e++){var r=t.element,o=n[t.id],s=qi(r).propertiesByName[t.property];if(o||a.addWarning({message:\"unresolved reference <\"+t.id+\">\",element:t.element,property:t.property,value:t.id}),s.isMany){var l=r.get(s.name),p=l.indexOf(t);-1===p&&(p=l.length),o?l[p]=o:l.splice(p,1)}else r.set(s.name,o)}}()}catch(e){r=e}var o=i.element;r||o||(r=Ui(\"failed to parse document as <\"+i.type.$descriptor.name+\">\"));var l=a.warnings,p=a.references,c=a.elementsById;return r?(r.warnings=l,n(r)):t({rootElement:o,elementsById:c,references:p,warnings:l})}))},or.prototype.handler=function(e){return new ir(this.model,e)};var ar=/<|>|'|\"|&|\\n\\r|\\n/g,sr=/<|>|&/g;function lr(e){var t={},n={},i={},r=[],o=[];this.byUri=function(t){return n[t]||e&&e.byUri(t)},this.add=function(e,t){n[e.uri]=e,t?r.push(e):o.push(e),this.mapPrefix(e.prefix,e.uri)},this.uriByPrefix=function(e){return t[e||\"xmlns\"]},this.mapPrefix=function(e,n){t[e||\"xmlns\"]=n},this.getNSKey=function(e){return void 0!==e.prefix?e.uri+\"|\"+e.prefix:e.uri},this.logUsed=function(t){var n=t.uri,r=this.getNSKey(t);i[r]=this.byUri(n),e&&e.logUsed(t)},this.getUsed=function(e){var t=this;return[].concat(r,o).filter((function(e){var n=t.getNSKey(e);return i[n]}))}}function pr(e,t){return Wi(t)?(n=e).charAt(0).toLowerCase()+n.slice(1):e;var n}function cr(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}function ur(e){return l(e)?e:(e.prefix?e.prefix+\":\":\"\")+e.localName}var hr={\"\\n\":\"#10\",\"\\n\\r\":\"#10\",'\"':\"#34\",\"'\":\"#39\",\"<\":\"#60\",\">\":\"#62\",\"&\":\"#38\"},mr={\"<\":\"lt\",\">\":\"gt\",\"&\":\"amp\"};function fr(e,t,n){return(e=l(e)?e:\"\"+e).replace(t,(function(e){return\"&\"+n[e]+\";\"}))}function dr(e){this.tagName=e}function yr(){}function gr(e){this.tagName=e}function vr(e,t){this.body=[],this.attrs=[],this.parent=e,this.propertyDescriptor=t}function xr(e,t){vr.call(this,e,t)}function br(){this.value=\"\",this.write=function(e){this.value+=e}}function Er(e,t){var n=[\"\"];this.append=function(t){return e.write(t),this},this.appendNewLine=function(){return t&&e.write(\"\\n\"),this},this.appendIndent=function(){return t&&e.write(n.join(\"  \")),this},this.indent=function(){return n.push(\"\"),this},this.unindent=function(){return n.pop(),this}}function wr(e){return e=E({format:!1,preamble:!0},e||{}),{toXML:function(t,n){var i=n||new br,r=new Er(i,e.format);if(e.preamble&&r.append('<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n'),(new vr).build(t).serializeTo(r),!n)return i.value}}}function _r(e,t){Ai.call(this,e,t)}dr.prototype.build=function(e){return this.element=e,this},dr.prototype.serializeTo=function(e){e.appendIndent().append(\"<\"+this.tagName+\">\"+this.element.id+\"</\"+this.tagName+\">\").appendNewLine()},yr.prototype.serializeValue=yr.prototype.serializeTo=function(e){e.append(this.escape?fr(this.value,sr,mr):this.value)},yr.prototype.build=function(e,t){return this.value=t,\"String\"===e.type&&-1!==t.search(sr)&&(this.escape=!0),this},cr(gr,yr),gr.prototype.serializeTo=function(e){e.appendIndent().append(\"<\"+this.tagName+\">\"),this.serializeValue(e),e.append(\"</\"+this.tagName+\">\").appendNewLine()},vr.prototype.build=function(e){this.element=e;var t,n,i=e.$descriptor,r=this.propertyDescriptor,o=i.isGeneric;return t=o?this.parseGeneric(e):this.parseNsAttributes(e),this.ns=r?this.nsPropertyTagName(r):this.nsTagName(i),this.tagName=this.addTagName(this.ns),o||(n=function(e){return u(e.$descriptor.properties,(function(t){var n=t.name;if(t.isVirtual)return!1;if(!p(e,n))return!1;var i=e[n];return i!==t.default&&null!==i&&(!t.isMany||i.length)}))}(e),this.parseAttributes(u(n,(function(e){return e.isAttr}))),this.parseContainments(function(e){return u(e,(function(e){return!e.isAttr}))}(n))),this.parseGenericAttributes(e,t),this},vr.prototype.nsTagName=function(e){return function(e,t){return t.isGeneric?E({localName:t.ns.localName},e):E({localName:pr(t.ns.localName,t.$pkg)},e)}(this.logNamespaceUsed(e.ns),e)},vr.prototype.nsPropertyTagName=function(e){return function(e,t){return E({localName:t.ns.localName},e)}(this.logNamespaceUsed(e.ns),e)},vr.prototype.isLocalNs=function(e){return e.uri===this.ns.uri},vr.prototype.nsAttributeName=function(e){var t;if(t=l(e)?vi(e):e.ns,e.inherited)return{localName:t.localName};var n=this.logNamespaceUsed(t);return this.getNamespaces().logUsed(n),this.isLocalNs(n)?{localName:t.localName}:E({localName:t.localName},n)},vr.prototype.parseGeneric=function(e){var t=this,n=this.body,i=[];return h(e,(function(r,o){\"$body\"===o?n.push((new yr).build({type:\"String\"},r)):\"$children\"===o?h(r,(function(e){n.push(new vr(t).build(e))})):0!==o.indexOf(\"$\")&&t.parseNsAttribute(e,o,r)&&i.push({name:o,value:r})})),i},vr.prototype.parseNsAttribute=function(e,t,n){var i,r=e.$model,o=vi(t);if(\"xmlns\"===o.prefix&&(i={prefix:o.localName,uri:n}),o.prefix||\"xmlns\"!==o.localName||(i={uri:n}),!i)return{name:t,value:n};if(r&&r.getPackage(n))this.logNamespace(i,!0,!0);else{var a=this.logNamespaceUsed(i,!0);this.getNamespaces().logUsed(a)}},vr.prototype.parseNsAttributes=function(e,t){var n=this,i=e.$attrs,r=[];return h(i,(function(t,i){var o=n.parseNsAttribute(e,i,t);o&&r.push(o)})),r},vr.prototype.parseGenericAttributes=function(e,t){var n=this;h(t,(function(t){if(t.name!==Gi)try{n.addAttribute(n.nsAttributeName(t.name),t.value)}catch(n){console.warn(\"missing namespace information for \",t.name,\"=\",t.value,\"on\",e,n)}}))},vr.prototype.parseContainments=function(e){var t=this,n=this.body,i=this.element;h(e,(function(e){var r=i.get(e.name),o=e.isReference;if(e.isMany||(r=[r]),e.isBody)n.push((new yr).build(e,r[0]));else if(gi(e.type))h(r,(function(i){n.push(new gr(t.addTagName(t.nsPropertyTagName(e))).build(e,i))}));else if(o)h(r,(function(i){n.push(new dr(t.addTagName(t.nsPropertyTagName(e))).build(i))}));else{var a=Hi(e),s=function(e){return\"property\"===$i(e)}(e);h(r,(function(i){var r;r=a?new xr(t,e):s?new vr(t,e):new vr(t),n.push(r.build(i))}))}}))},vr.prototype.getNamespaces=function(e){var t,n=this.namespaces,i=this.parent;return n||(t=i&&i.getNamespaces(),e||!t?this.namespaces=n=new lr(t):n=t),n},vr.prototype.logNamespace=function(e,t,n){var i=this.getNamespaces(n),r=e.uri,o=e.prefix;return i.byUri(r)&&!n||i.add(e,t),i.mapPrefix(o,r),e},vr.prototype.logNamespaceUsed=function(e,t){var n,i,r,o=this.element.$model,a=this.getNamespaces(t),s=e.prefix,l=e.uri;if(!s&&!l)return{localName:e.localName};if(r=zi[s]||o&&(o.getPackage(s)||{}).uri,!(l=l||r||a.uriByPrefix(s)))throw new Error(\"no namespace uri given for prefix <\"+s+\">\");if(!(e=a.byUri(l))){for(n=s,i=1;a.uriByPrefix(n);)n=s+\"_\"+i++;e=this.logNamespace({prefix:n,uri:l},r===l)}return s&&a.mapPrefix(s,l),e},vr.prototype.parseAttributes=function(e){var t=this,n=this.element;h(e,(function(e){var i=n.get(e.name);if(e.isReference)if(e.isMany){var r=[];h(i,(function(e){r.push(e.id)})),i=r.join(\" \")}else i=i.id;t.addAttribute(t.nsAttributeName(e),i)}))},vr.prototype.addTagName=function(e){var t=this.logNamespaceUsed(e);return this.getNamespaces().logUsed(t),ur(e)},vr.prototype.addAttribute=function(e,t){var n=this.attrs;l(t)&&(t=fr(t,ar,hr));var i=function(e,t){const n=g(t);let i=r(e)?-1:void 0;return h(e,(function(e,t){if(n(e,t))return i=t,!1})),i}(n,(function(t){return t.name.localName===e.localName&&t.name.uri===e.uri&&t.name.prefix===e.prefix})),o={name:e,value:t};-1!==i?n.splice(i,1,o):n.push(o)},vr.prototype.serializeAttributes=function(e){var t=this.attrs,n=this.namespaces;n&&(t=function(e){return e.getUsed().filter((function(e){return\"xml\"!==e.prefix})).map((function(e){return{name:\"xmlns\"+(e.prefix?\":\"+e.prefix:\"\"),value:e.uri}}))}(n).concat(t)),h(t,(function(t){e.append(\" \").append(ur(t.name)).append('=\"').append(t.value).append('\"')}))},vr.prototype.serializeTo=function(e){var t=this.body[0],n=t&&t.constructor!==yr;e.appendIndent().append(\"<\"+this.tagName),this.serializeAttributes(e),e.append(t?\">\":\" />\"),t&&(n&&e.appendNewLine().indent(),h(this.body,(function(t){t.serializeTo(e)})),n&&e.unindent().appendIndent(),e.append(\"</\"+this.tagName+\">\")),e.appendNewLine()},cr(xr,vr),xr.prototype.parseNsAttributes=function(e){var t=vr.prototype.parseNsAttributes.call(this,e),n=e.$descriptor;if(n.name===this.propertyDescriptor.type)return t;var i=this.typeNs=this.nsTagName(n);this.getNamespaces().logUsed(this.typeNs);var r=e.$model.getPackage(i.uri),o=r.xml&&r.xml.typePrefix||\"\";return this.addAttribute(this.nsAttributeName(Gi),(i.prefix?i.prefix+\":\":\"\")+o+n.ns.localName),t},xr.prototype.isLocalNs=function(e){return e.uri===(this.typeNs||this.ns).uri},_r.prototype=Object.create(Ai.prototype),_r.prototype.fromXML=function(e,t,n){l(t)||(n=t,t=\"bpmn:Definitions\");var i=new or(E({model:this,lax:!0},n)),r=i.handler(t);return i.fromXML(e,r)},_r.prototype.toXML=function(e,t){var n=new wr(t);return new Promise((function(t,i){try{return t({xml:n.toXML(e)})}catch(e){return i(e)}}))};var Ar={bpmn:{name:\"BPMN20\",uri:\"http://www.omg.org/spec/BPMN/20100524/MODEL\",prefix:\"bpmn\",associations:[],types:[{name:\"Interface\",superClass:[\"RootElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"operations\",type:\"Operation\",isMany:!0},{name:\"implementationRef\",isAttr:!0,type:\"String\"}]},{name:\"Operation\",superClass:[\"BaseElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"inMessageRef\",type:\"Message\",isReference:!0},{name:\"outMessageRef\",type:\"Message\",isReference:!0},{name:\"errorRef\",type:\"Error\",isMany:!0,isReference:!0},{name:\"implementationRef\",isAttr:!0,type:\"String\"}]},{name:\"EndPoint\",superClass:[\"RootElement\"]},{name:\"Auditing\",superClass:[\"BaseElement\"]},{name:\"GlobalTask\",superClass:[\"CallableElement\"],properties:[{name:\"resources\",type:\"ResourceRole\",isMany:!0}]},{name:\"Monitoring\",superClass:[\"BaseElement\"]},{name:\"Performer\",superClass:[\"ResourceRole\"]},{name:\"Process\",superClass:[\"FlowElementsContainer\",\"CallableElement\"],properties:[{name:\"processType\",type:\"ProcessType\",isAttr:!0},{name:\"isClosed\",isAttr:!0,type:\"Boolean\"},{name:\"auditing\",type:\"Auditing\"},{name:\"monitoring\",type:\"Monitoring\"},{name:\"properties\",type:\"Property\",isMany:!0},{name:\"laneSets\",isMany:!0,replaces:\"FlowElementsContainer#laneSets\",type:\"LaneSet\"},{name:\"flowElements\",isMany:!0,replaces:\"FlowElementsContainer#flowElements\",type:\"FlowElement\"},{name:\"artifacts\",type:\"Artifact\",isMany:!0},{name:\"resources\",type:\"ResourceRole\",isMany:!0},{name:\"correlationSubscriptions\",type:\"CorrelationSubscription\",isMany:!0},{name:\"supports\",type:\"Process\",isMany:!0,isReference:!0},{name:\"definitionalCollaborationRef\",type:\"Collaboration\",isAttr:!0,isReference:!0},{name:\"isExecutable\",isAttr:!0,type:\"Boolean\"}]},{name:\"LaneSet\",superClass:[\"BaseElement\"],properties:[{name:\"lanes\",type:\"Lane\",isMany:!0},{name:\"name\",isAttr:!0,type:\"String\"}]},{name:\"Lane\",superClass:[\"BaseElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"partitionElementRef\",type:\"BaseElement\",isAttr:!0,isReference:!0},{name:\"partitionElement\",type:\"BaseElement\"},{name:\"flowNodeRef\",type:\"FlowNode\",isMany:!0,isReference:!0},{name:\"childLaneSet\",type:\"LaneSet\",xml:{serialize:\"xsi:type\"}}]},{name:\"GlobalManualTask\",superClass:[\"GlobalTask\"]},{name:\"ManualTask\",superClass:[\"Task\"]},{name:\"UserTask\",superClass:[\"Task\"],properties:[{name:\"renderings\",type:\"Rendering\",isMany:!0},{name:\"implementation\",isAttr:!0,type:\"String\"}]},{name:\"Rendering\",superClass:[\"BaseElement\"]},{name:\"HumanPerformer\",superClass:[\"Performer\"]},{name:\"PotentialOwner\",superClass:[\"HumanPerformer\"]},{name:\"GlobalUserTask\",superClass:[\"GlobalTask\"],properties:[{name:\"implementation\",isAttr:!0,type:\"String\"},{name:\"renderings\",type:\"Rendering\",isMany:!0}]},{name:\"Gateway\",isAbstract:!0,superClass:[\"FlowNode\"],properties:[{name:\"gatewayDirection\",type:\"GatewayDirection\",default:\"Unspecified\",isAttr:!0}]},{name:\"EventBasedGateway\",superClass:[\"Gateway\"],properties:[{name:\"instantiate\",default:!1,isAttr:!0,type:\"Boolean\"},{name:\"eventGatewayType\",type:\"EventBasedGatewayType\",isAttr:!0,default:\"Exclusive\"}]},{name:\"ComplexGateway\",superClass:[\"Gateway\"],properties:[{name:\"activationCondition\",type:\"Expression\",xml:{serialize:\"xsi:type\"}},{name:\"default\",type:\"SequenceFlow\",isAttr:!0,isReference:!0}]},{name:\"ExclusiveGateway\",superClass:[\"Gateway\"],properties:[{name:\"default\",type:\"SequenceFlow\",isAttr:!0,isReference:!0}]},{name:\"InclusiveGateway\",superClass:[\"Gateway\"],properties:[{name:\"default\",type:\"SequenceFlow\",isAttr:!0,isReference:!0}]},{name:\"ParallelGateway\",superClass:[\"Gateway\"]},{name:\"RootElement\",isAbstract:!0,superClass:[\"BaseElement\"]},{name:\"Relationship\",superClass:[\"BaseElement\"],properties:[{name:\"type\",isAttr:!0,type:\"String\"},{name:\"direction\",type:\"RelationshipDirection\",isAttr:!0},{name:\"source\",isMany:!0,isReference:!0,type:\"Element\"},{name:\"target\",isMany:!0,isReference:!0,type:\"Element\"}]},{name:\"BaseElement\",isAbstract:!0,properties:[{name:\"id\",isAttr:!0,type:\"String\",isId:!0},{name:\"documentation\",type:\"Documentation\",isMany:!0},{name:\"extensionDefinitions\",type:\"ExtensionDefinition\",isMany:!0,isReference:!0},{name:\"extensionElements\",type:\"ExtensionElements\"}]},{name:\"Extension\",properties:[{name:\"mustUnderstand\",default:!1,isAttr:!0,type:\"Boolean\"},{name:\"definition\",type:\"ExtensionDefinition\",isAttr:!0,isReference:!0}]},{name:\"ExtensionDefinition\",properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"extensionAttributeDefinitions\",type:\"ExtensionAttributeDefinition\",isMany:!0}]},{name:\"ExtensionAttributeDefinition\",properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"type\",isAttr:!0,type:\"String\"},{name:\"isReference\",default:!1,isAttr:!0,type:\"Boolean\"},{name:\"extensionDefinition\",type:\"ExtensionDefinition\",isAttr:!0,isReference:!0}]},{name:\"ExtensionElements\",properties:[{name:\"valueRef\",isAttr:!0,isReference:!0,type:\"Element\"},{name:\"values\",type:\"Element\",isMany:!0},{name:\"extensionAttributeDefinition\",type:\"ExtensionAttributeDefinition\",isAttr:!0,isReference:!0}]},{name:\"Documentation\",superClass:[\"BaseElement\"],properties:[{name:\"text\",type:\"String\",isBody:!0},{name:\"textFormat\",default:\"text/plain\",isAttr:!0,type:\"String\"}]},{name:\"Event\",isAbstract:!0,superClass:[\"FlowNode\",\"InteractionNode\"],properties:[{name:\"properties\",type:\"Property\",isMany:!0}]},{name:\"IntermediateCatchEvent\",superClass:[\"CatchEvent\"]},{name:\"IntermediateThrowEvent\",superClass:[\"ThrowEvent\"]},{name:\"EndEvent\",superClass:[\"ThrowEvent\"]},{name:\"StartEvent\",superClass:[\"CatchEvent\"],properties:[{name:\"isInterrupting\",default:!0,isAttr:!0,type:\"Boolean\"}]},{name:\"ThrowEvent\",isAbstract:!0,superClass:[\"Event\"],properties:[{name:\"dataInputs\",type:\"DataInput\",isMany:!0},{name:\"dataInputAssociations\",type:\"DataInputAssociation\",isMany:!0},{name:\"inputSet\",type:\"InputSet\"},{name:\"eventDefinitions\",type:\"EventDefinition\",isMany:!0},{name:\"eventDefinitionRef\",type:\"EventDefinition\",isMany:!0,isReference:!0}]},{name:\"CatchEvent\",isAbstract:!0,superClass:[\"Event\"],properties:[{name:\"parallelMultiple\",isAttr:!0,type:\"Boolean\",default:!1},{name:\"dataOutputs\",type:\"DataOutput\",isMany:!0},{name:\"dataOutputAssociations\",type:\"DataOutputAssociation\",isMany:!0},{name:\"outputSet\",type:\"OutputSet\"},{name:\"eventDefinitions\",type:\"EventDefinition\",isMany:!0},{name:\"eventDefinitionRef\",type:\"EventDefinition\",isMany:!0,isReference:!0}]},{name:\"BoundaryEvent\",superClass:[\"CatchEvent\"],properties:[{name:\"cancelActivity\",default:!0,isAttr:!0,type:\"Boolean\"},{name:\"attachedToRef\",type:\"Activity\",isAttr:!0,isReference:!0}]},{name:\"EventDefinition\",isAbstract:!0,superClass:[\"RootElement\"]},{name:\"CancelEventDefinition\",superClass:[\"EventDefinition\"]},{name:\"ErrorEventDefinition\",superClass:[\"EventDefinition\"],properties:[{name:\"errorRef\",type:\"Error\",isAttr:!0,isReference:!0}]},{name:\"TerminateEventDefinition\",superClass:[\"EventDefinition\"]},{name:\"EscalationEventDefinition\",superClass:[\"EventDefinition\"],properties:[{name:\"escalationRef\",type:\"Escalation\",isAttr:!0,isReference:!0}]},{name:\"Escalation\",properties:[{name:\"structureRef\",type:\"ItemDefinition\",isAttr:!0,isReference:!0},{name:\"name\",isAttr:!0,type:\"String\"},{name:\"escalationCode\",isAttr:!0,type:\"String\"}],superClass:[\"RootElement\"]},{name:\"CompensateEventDefinition\",superClass:[\"EventDefinition\"],properties:[{name:\"waitForCompletion\",isAttr:!0,type:\"Boolean\",default:!0},{name:\"activityRef\",type:\"Activity\",isAttr:!0,isReference:!0}]},{name:\"TimerEventDefinition\",superClass:[\"EventDefinition\"],properties:[{name:\"timeDate\",type:\"Expression\",xml:{serialize:\"xsi:type\"}},{name:\"timeCycle\",type:\"Expression\",xml:{serialize:\"xsi:type\"}},{name:\"timeDuration\",type:\"Expression\",xml:{serialize:\"xsi:type\"}}]},{name:\"LinkEventDefinition\",superClass:[\"EventDefinition\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"target\",type:\"LinkEventDefinition\",isAttr:!0,isReference:!0},{name:\"source\",type:\"LinkEventDefinition\",isMany:!0,isReference:!0}]},{name:\"MessageEventDefinition\",superClass:[\"EventDefinition\"],properties:[{name:\"messageRef\",type:\"Message\",isAttr:!0,isReference:!0},{name:\"operationRef\",type:\"Operation\",isAttr:!0,isReference:!0}]},{name:\"ConditionalEventDefinition\",superClass:[\"EventDefinition\"],properties:[{name:\"condition\",type:\"Expression\",xml:{serialize:\"xsi:type\"}}]},{name:\"SignalEventDefinition\",superClass:[\"EventDefinition\"],properties:[{name:\"signalRef\",type:\"Signal\",isAttr:!0,isReference:!0}]},{name:\"Signal\",superClass:[\"RootElement\"],properties:[{name:\"structureRef\",type:\"ItemDefinition\",isAttr:!0,isReference:!0},{name:\"name\",isAttr:!0,type:\"String\"}]},{name:\"ImplicitThrowEvent\",superClass:[\"ThrowEvent\"]},{name:\"DataState\",superClass:[\"BaseElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"}]},{name:\"ItemAwareElement\",superClass:[\"BaseElement\"],properties:[{name:\"itemSubjectRef\",type:\"ItemDefinition\",isAttr:!0,isReference:!0},{name:\"dataState\",type:\"DataState\"}]},{name:\"DataAssociation\",superClass:[\"BaseElement\"],properties:[{name:\"sourceRef\",type:\"ItemAwareElement\",isMany:!0,isReference:!0},{name:\"targetRef\",type:\"ItemAwareElement\",isReference:!0},{name:\"transformation\",type:\"FormalExpression\",xml:{serialize:\"property\"}},{name:\"assignment\",type:\"Assignment\",isMany:!0}]},{name:\"DataInput\",superClass:[\"ItemAwareElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"isCollection\",default:!1,isAttr:!0,type:\"Boolean\"},{name:\"inputSetRef\",type:\"InputSet\",isMany:!0,isVirtual:!0,isReference:!0},{name:\"inputSetWithOptional\",type:\"InputSet\",isMany:!0,isVirtual:!0,isReference:!0},{name:\"inputSetWithWhileExecuting\",type:\"InputSet\",isMany:!0,isVirtual:!0,isReference:!0}]},{name:\"DataOutput\",superClass:[\"ItemAwareElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"isCollection\",default:!1,isAttr:!0,type:\"Boolean\"},{name:\"outputSetRef\",type:\"OutputSet\",isMany:!0,isVirtual:!0,isReference:!0},{name:\"outputSetWithOptional\",type:\"OutputSet\",isMany:!0,isVirtual:!0,isReference:!0},{name:\"outputSetWithWhileExecuting\",type:\"OutputSet\",isMany:!0,isVirtual:!0,isReference:!0}]},{name:\"InputSet\",superClass:[\"BaseElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"dataInputRefs\",type:\"DataInput\",isMany:!0,isReference:!0},{name:\"optionalInputRefs\",type:\"DataInput\",isMany:!0,isReference:!0},{name:\"whileExecutingInputRefs\",type:\"DataInput\",isMany:!0,isReference:!0},{name:\"outputSetRefs\",type:\"OutputSet\",isMany:!0,isReference:!0}]},{name:\"OutputSet\",superClass:[\"BaseElement\"],properties:[{name:\"dataOutputRefs\",type:\"DataOutput\",isMany:!0,isReference:!0},{name:\"name\",isAttr:!0,type:\"String\"},{name:\"inputSetRefs\",type:\"InputSet\",isMany:!0,isReference:!0},{name:\"optionalOutputRefs\",type:\"DataOutput\",isMany:!0,isReference:!0},{name:\"whileExecutingOutputRefs\",type:\"DataOutput\",isMany:!0,isReference:!0}]},{name:\"Property\",superClass:[\"ItemAwareElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"}]},{name:\"DataInputAssociation\",superClass:[\"DataAssociation\"]},{name:\"DataOutputAssociation\",superClass:[\"DataAssociation\"]},{name:\"InputOutputSpecification\",superClass:[\"BaseElement\"],properties:[{name:\"dataInputs\",type:\"DataInput\",isMany:!0},{name:\"dataOutputs\",type:\"DataOutput\",isMany:!0},{name:\"inputSets\",type:\"InputSet\",isMany:!0},{name:\"outputSets\",type:\"OutputSet\",isMany:!0}]},{name:\"DataObject\",superClass:[\"FlowElement\",\"ItemAwareElement\"],properties:[{name:\"isCollection\",default:!1,isAttr:!0,type:\"Boolean\"}]},{name:\"InputOutputBinding\",properties:[{name:\"inputDataRef\",type:\"InputSet\",isAttr:!0,isReference:!0},{name:\"outputDataRef\",type:\"OutputSet\",isAttr:!0,isReference:!0},{name:\"operationRef\",type:\"Operation\",isAttr:!0,isReference:!0}]},{name:\"Assignment\",superClass:[\"BaseElement\"],properties:[{name:\"from\",type:\"Expression\",xml:{serialize:\"xsi:type\"}},{name:\"to\",type:\"Expression\",xml:{serialize:\"xsi:type\"}}]},{name:\"DataStore\",superClass:[\"RootElement\",\"ItemAwareElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"capacity\",isAttr:!0,type:\"Integer\"},{name:\"isUnlimited\",default:!0,isAttr:!0,type:\"Boolean\"}]},{name:\"DataStoreReference\",superClass:[\"ItemAwareElement\",\"FlowElement\"],properties:[{name:\"dataStoreRef\",type:\"DataStore\",isAttr:!0,isReference:!0}]},{name:\"DataObjectReference\",superClass:[\"ItemAwareElement\",\"FlowElement\"],properties:[{name:\"dataObjectRef\",type:\"DataObject\",isAttr:!0,isReference:!0}]},{name:\"ConversationLink\",superClass:[\"BaseElement\"],properties:[{name:\"sourceRef\",type:\"InteractionNode\",isAttr:!0,isReference:!0},{name:\"targetRef\",type:\"InteractionNode\",isAttr:!0,isReference:!0},{name:\"name\",isAttr:!0,type:\"String\"}]},{name:\"ConversationAssociation\",superClass:[\"BaseElement\"],properties:[{name:\"innerConversationNodeRef\",type:\"ConversationNode\",isAttr:!0,isReference:!0},{name:\"outerConversationNodeRef\",type:\"ConversationNode\",isAttr:!0,isReference:!0}]},{name:\"CallConversation\",superClass:[\"ConversationNode\"],properties:[{name:\"calledCollaborationRef\",type:\"Collaboration\",isAttr:!0,isReference:!0},{name:\"participantAssociations\",type:\"ParticipantAssociation\",isMany:!0}]},{name:\"Conversation\",superClass:[\"ConversationNode\"]},{name:\"SubConversation\",superClass:[\"ConversationNode\"],properties:[{name:\"conversationNodes\",type:\"ConversationNode\",isMany:!0}]},{name:\"ConversationNode\",isAbstract:!0,superClass:[\"InteractionNode\",\"BaseElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"participantRef\",type:\"Participant\",isMany:!0,isReference:!0},{name:\"messageFlowRefs\",type:\"MessageFlow\",isMany:!0,isReference:!0},{name:\"correlationKeys\",type:\"CorrelationKey\",isMany:!0}]},{name:\"GlobalConversation\",superClass:[\"Collaboration\"]},{name:\"PartnerEntity\",superClass:[\"RootElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"participantRef\",type:\"Participant\",isMany:!0,isReference:!0}]},{name:\"PartnerRole\",superClass:[\"RootElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"participantRef\",type:\"Participant\",isMany:!0,isReference:!0}]},{name:\"CorrelationProperty\",superClass:[\"RootElement\"],properties:[{name:\"correlationPropertyRetrievalExpression\",type:\"CorrelationPropertyRetrievalExpression\",isMany:!0},{name:\"name\",isAttr:!0,type:\"String\"},{name:\"type\",type:\"ItemDefinition\",isAttr:!0,isReference:!0}]},{name:\"Error\",superClass:[\"RootElement\"],properties:[{name:\"structureRef\",type:\"ItemDefinition\",isAttr:!0,isReference:!0},{name:\"name\",isAttr:!0,type:\"String\"},{name:\"errorCode\",isAttr:!0,type:\"String\"}]},{name:\"CorrelationKey\",superClass:[\"BaseElement\"],properties:[{name:\"correlationPropertyRef\",type:\"CorrelationProperty\",isMany:!0,isReference:!0},{name:\"name\",isAttr:!0,type:\"String\"}]},{name:\"Expression\",superClass:[\"BaseElement\"],isAbstract:!1,properties:[{name:\"body\",isBody:!0,type:\"String\"}]},{name:\"FormalExpression\",superClass:[\"Expression\"],properties:[{name:\"language\",isAttr:!0,type:\"String\"},{name:\"evaluatesToTypeRef\",type:\"ItemDefinition\",isAttr:!0,isReference:!0}]},{name:\"Message\",superClass:[\"RootElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"itemRef\",type:\"ItemDefinition\",isAttr:!0,isReference:!0}]},{name:\"ItemDefinition\",superClass:[\"RootElement\"],properties:[{name:\"itemKind\",type:\"ItemKind\",isAttr:!0},{name:\"structureRef\",isAttr:!0,type:\"String\"},{name:\"isCollection\",default:!1,isAttr:!0,type:\"Boolean\"},{name:\"import\",type:\"Import\",isAttr:!0,isReference:!0}]},{name:\"FlowElement\",isAbstract:!0,superClass:[\"BaseElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"auditing\",type:\"Auditing\"},{name:\"monitoring\",type:\"Monitoring\"},{name:\"categoryValueRef\",type:\"CategoryValue\",isMany:!0,isReference:!0}]},{name:\"SequenceFlow\",superClass:[\"FlowElement\"],properties:[{name:\"isImmediate\",isAttr:!0,type:\"Boolean\"},{name:\"conditionExpression\",type:\"Expression\",xml:{serialize:\"xsi:type\"}},{name:\"sourceRef\",type:\"FlowNode\",isAttr:!0,isReference:!0},{name:\"targetRef\",type:\"FlowNode\",isAttr:!0,isReference:!0}]},{name:\"FlowElementsContainer\",isAbstract:!0,superClass:[\"BaseElement\"],properties:[{name:\"laneSets\",type:\"LaneSet\",isMany:!0},{name:\"flowElements\",type:\"FlowElement\",isMany:!0}]},{name:\"CallableElement\",isAbstract:!0,superClass:[\"RootElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"ioSpecification\",type:\"InputOutputSpecification\",xml:{serialize:\"property\"}},{name:\"supportedInterfaceRef\",type:\"Interface\",isMany:!0,isReference:!0},{name:\"ioBinding\",type:\"InputOutputBinding\",isMany:!0,xml:{serialize:\"property\"}}]},{name:\"FlowNode\",isAbstract:!0,superClass:[\"FlowElement\"],properties:[{name:\"incoming\",type:\"SequenceFlow\",isMany:!0,isReference:!0},{name:\"outgoing\",type:\"SequenceFlow\",isMany:!0,isReference:!0},{name:\"lanes\",type:\"Lane\",isMany:!0,isVirtual:!0,isReference:!0}]},{name:\"CorrelationPropertyRetrievalExpression\",superClass:[\"BaseElement\"],properties:[{name:\"messagePath\",type:\"FormalExpression\"},{name:\"messageRef\",type:\"Message\",isAttr:!0,isReference:!0}]},{name:\"CorrelationPropertyBinding\",superClass:[\"BaseElement\"],properties:[{name:\"dataPath\",type:\"FormalExpression\"},{name:\"correlationPropertyRef\",type:\"CorrelationProperty\",isAttr:!0,isReference:!0}]},{name:\"Resource\",superClass:[\"RootElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"resourceParameters\",type:\"ResourceParameter\",isMany:!0}]},{name:\"ResourceParameter\",superClass:[\"BaseElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"isRequired\",isAttr:!0,type:\"Boolean\"},{name:\"type\",type:\"ItemDefinition\",isAttr:!0,isReference:!0}]},{name:\"CorrelationSubscription\",superClass:[\"BaseElement\"],properties:[{name:\"correlationKeyRef\",type:\"CorrelationKey\",isAttr:!0,isReference:!0},{name:\"correlationPropertyBinding\",type:\"CorrelationPropertyBinding\",isMany:!0}]},{name:\"MessageFlow\",superClass:[\"BaseElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"sourceRef\",type:\"InteractionNode\",isAttr:!0,isReference:!0},{name:\"targetRef\",type:\"InteractionNode\",isAttr:!0,isReference:!0},{name:\"messageRef\",type:\"Message\",isAttr:!0,isReference:!0}]},{name:\"MessageFlowAssociation\",superClass:[\"BaseElement\"],properties:[{name:\"innerMessageFlowRef\",type:\"MessageFlow\",isAttr:!0,isReference:!0},{name:\"outerMessageFlowRef\",type:\"MessageFlow\",isAttr:!0,isReference:!0}]},{name:\"InteractionNode\",isAbstract:!0,properties:[{name:\"incomingConversationLinks\",type:\"ConversationLink\",isMany:!0,isVirtual:!0,isReference:!0},{name:\"outgoingConversationLinks\",type:\"ConversationLink\",isMany:!0,isVirtual:!0,isReference:!0}]},{name:\"Participant\",superClass:[\"InteractionNode\",\"BaseElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"interfaceRef\",type:\"Interface\",isMany:!0,isReference:!0},{name:\"participantMultiplicity\",type:\"ParticipantMultiplicity\"},{name:\"endPointRefs\",type:\"EndPoint\",isMany:!0,isReference:!0},{name:\"processRef\",type:\"Process\",isAttr:!0,isReference:!0}]},{name:\"ParticipantAssociation\",superClass:[\"BaseElement\"],properties:[{name:\"innerParticipantRef\",type:\"Participant\",isAttr:!0,isReference:!0},{name:\"outerParticipantRef\",type:\"Participant\",isAttr:!0,isReference:!0}]},{name:\"ParticipantMultiplicity\",properties:[{name:\"minimum\",default:0,isAttr:!0,type:\"Integer\"},{name:\"maximum\",default:1,isAttr:!0,type:\"Integer\"}],superClass:[\"BaseElement\"]},{name:\"Collaboration\",superClass:[\"RootElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"isClosed\",isAttr:!0,type:\"Boolean\"},{name:\"participants\",type:\"Participant\",isMany:!0},{name:\"messageFlows\",type:\"MessageFlow\",isMany:!0},{name:\"artifacts\",type:\"Artifact\",isMany:!0},{name:\"conversations\",type:\"ConversationNode\",isMany:!0},{name:\"conversationAssociations\",type:\"ConversationAssociation\"},{name:\"participantAssociations\",type:\"ParticipantAssociation\",isMany:!0},{name:\"messageFlowAssociations\",type:\"MessageFlowAssociation\",isMany:!0},{name:\"correlationKeys\",type:\"CorrelationKey\",isMany:!0},{name:\"choreographyRef\",type:\"Choreography\",isMany:!0,isReference:!0},{name:\"conversationLinks\",type:\"ConversationLink\",isMany:!0}]},{name:\"ChoreographyActivity\",isAbstract:!0,superClass:[\"FlowNode\"],properties:[{name:\"participantRef\",type:\"Participant\",isMany:!0,isReference:!0},{name:\"initiatingParticipantRef\",type:\"Participant\",isAttr:!0,isReference:!0},{name:\"correlationKeys\",type:\"CorrelationKey\",isMany:!0},{name:\"loopType\",type:\"ChoreographyLoopType\",default:\"None\",isAttr:!0}]},{name:\"CallChoreography\",superClass:[\"ChoreographyActivity\"],properties:[{name:\"calledChoreographyRef\",type:\"Choreography\",isAttr:!0,isReference:!0},{name:\"participantAssociations\",type:\"ParticipantAssociation\",isMany:!0}]},{name:\"SubChoreography\",superClass:[\"ChoreographyActivity\",\"FlowElementsContainer\"],properties:[{name:\"artifacts\",type:\"Artifact\",isMany:!0}]},{name:\"ChoreographyTask\",superClass:[\"ChoreographyActivity\"],properties:[{name:\"messageFlowRef\",type:\"MessageFlow\",isMany:!0,isReference:!0}]},{name:\"Choreography\",superClass:[\"Collaboration\",\"FlowElementsContainer\"]},{name:\"GlobalChoreographyTask\",superClass:[\"Choreography\"],properties:[{name:\"initiatingParticipantRef\",type:\"Participant\",isAttr:!0,isReference:!0}]},{name:\"TextAnnotation\",superClass:[\"Artifact\"],properties:[{name:\"text\",type:\"String\"},{name:\"textFormat\",default:\"text/plain\",isAttr:!0,type:\"String\"}]},{name:\"Group\",superClass:[\"Artifact\"],properties:[{name:\"categoryValueRef\",type:\"CategoryValue\",isAttr:!0,isReference:!0}]},{name:\"Association\",superClass:[\"Artifact\"],properties:[{name:\"associationDirection\",type:\"AssociationDirection\",isAttr:!0},{name:\"sourceRef\",type:\"BaseElement\",isAttr:!0,isReference:!0},{name:\"targetRef\",type:\"BaseElement\",isAttr:!0,isReference:!0}]},{name:\"Category\",superClass:[\"RootElement\"],properties:[{name:\"categoryValue\",type:\"CategoryValue\",isMany:!0},{name:\"name\",isAttr:!0,type:\"String\"}]},{name:\"Artifact\",isAbstract:!0,superClass:[\"BaseElement\"]},{name:\"CategoryValue\",superClass:[\"BaseElement\"],properties:[{name:\"categorizedFlowElements\",type:\"FlowElement\",isMany:!0,isVirtual:!0,isReference:!0},{name:\"value\",isAttr:!0,type:\"String\"}]},{name:\"Activity\",isAbstract:!0,superClass:[\"FlowNode\"],properties:[{name:\"isForCompensation\",default:!1,isAttr:!0,type:\"Boolean\"},{name:\"default\",type:\"SequenceFlow\",isAttr:!0,isReference:!0},{name:\"ioSpecification\",type:\"InputOutputSpecification\",xml:{serialize:\"property\"}},{name:\"boundaryEventRefs\",type:\"BoundaryEvent\",isMany:!0,isReference:!0},{name:\"properties\",type:\"Property\",isMany:!0},{name:\"dataInputAssociations\",type:\"DataInputAssociation\",isMany:!0},{name:\"dataOutputAssociations\",type:\"DataOutputAssociation\",isMany:!0},{name:\"startQuantity\",default:1,isAttr:!0,type:\"Integer\"},{name:\"resources\",type:\"ResourceRole\",isMany:!0},{name:\"completionQuantity\",default:1,isAttr:!0,type:\"Integer\"},{name:\"loopCharacteristics\",type:\"LoopCharacteristics\"}]},{name:\"ServiceTask\",superClass:[\"Task\"],properties:[{name:\"implementation\",isAttr:!0,type:\"String\"},{name:\"operationRef\",type:\"Operation\",isAttr:!0,isReference:!0}]},{name:\"SubProcess\",superClass:[\"Activity\",\"FlowElementsContainer\",\"InteractionNode\"],properties:[{name:\"triggeredByEvent\",default:!1,isAttr:!0,type:\"Boolean\"},{name:\"artifacts\",type:\"Artifact\",isMany:!0}]},{name:\"LoopCharacteristics\",isAbstract:!0,superClass:[\"BaseElement\"]},{name:\"MultiInstanceLoopCharacteristics\",superClass:[\"LoopCharacteristics\"],properties:[{name:\"isSequential\",default:!1,isAttr:!0,type:\"Boolean\"},{name:\"behavior\",type:\"MultiInstanceBehavior\",default:\"All\",isAttr:!0},{name:\"loopCardinality\",type:\"Expression\",xml:{serialize:\"xsi:type\"}},{name:\"loopDataInputRef\",type:\"ItemAwareElement\",isReference:!0},{name:\"loopDataOutputRef\",type:\"ItemAwareElement\",isReference:!0},{name:\"inputDataItem\",type:\"DataInput\",xml:{serialize:\"property\"}},{name:\"outputDataItem\",type:\"DataOutput\",xml:{serialize:\"property\"}},{name:\"complexBehaviorDefinition\",type:\"ComplexBehaviorDefinition\",isMany:!0},{name:\"completionCondition\",type:\"Expression\",xml:{serialize:\"xsi:type\"}},{name:\"oneBehaviorEventRef\",type:\"EventDefinition\",isAttr:!0,isReference:!0},{name:\"noneBehaviorEventRef\",type:\"EventDefinition\",isAttr:!0,isReference:!0}]},{name:\"StandardLoopCharacteristics\",superClass:[\"LoopCharacteristics\"],properties:[{name:\"testBefore\",default:!1,isAttr:!0,type:\"Boolean\"},{name:\"loopCondition\",type:\"Expression\",xml:{serialize:\"xsi:type\"}},{name:\"loopMaximum\",type:\"Integer\",isAttr:!0}]},{name:\"CallActivity\",superClass:[\"Activity\",\"InteractionNode\"],properties:[{name:\"calledElement\",type:\"String\",isAttr:!0}]},{name:\"Task\",superClass:[\"Activity\",\"InteractionNode\"]},{name:\"SendTask\",superClass:[\"Task\"],properties:[{name:\"implementation\",isAttr:!0,type:\"String\"},{name:\"operationRef\",type:\"Operation\",isAttr:!0,isReference:!0},{name:\"messageRef\",type:\"Message\",isAttr:!0,isReference:!0}]},{name:\"ReceiveTask\",superClass:[\"Task\"],properties:[{name:\"implementation\",isAttr:!0,type:\"String\"},{name:\"instantiate\",default:!1,isAttr:!0,type:\"Boolean\"},{name:\"operationRef\",type:\"Operation\",isAttr:!0,isReference:!0},{name:\"messageRef\",type:\"Message\",isAttr:!0,isReference:!0}]},{name:\"ScriptTask\",superClass:[\"Task\"],properties:[{name:\"scriptFormat\",isAttr:!0,type:\"String\"},{name:\"script\",type:\"String\"}]},{name:\"BusinessRuleTask\",superClass:[\"Task\"],properties:[{name:\"implementation\",isAttr:!0,type:\"String\"}]},{name:\"AdHocSubProcess\",superClass:[\"SubProcess\"],properties:[{name:\"completionCondition\",type:\"Expression\",xml:{serialize:\"xsi:type\"}},{name:\"ordering\",type:\"AdHocOrdering\",isAttr:!0},{name:\"cancelRemainingInstances\",default:!0,isAttr:!0,type:\"Boolean\"}]},{name:\"Transaction\",superClass:[\"SubProcess\"],properties:[{name:\"protocol\",isAttr:!0,type:\"String\"},{name:\"method\",isAttr:!0,type:\"String\"}]},{name:\"GlobalScriptTask\",superClass:[\"GlobalTask\"],properties:[{name:\"scriptLanguage\",isAttr:!0,type:\"String\"},{name:\"script\",isAttr:!0,type:\"String\"}]},{name:\"GlobalBusinessRuleTask\",superClass:[\"GlobalTask\"],properties:[{name:\"implementation\",isAttr:!0,type:\"String\"}]},{name:\"ComplexBehaviorDefinition\",superClass:[\"BaseElement\"],properties:[{name:\"condition\",type:\"FormalExpression\"},{name:\"event\",type:\"ImplicitThrowEvent\"}]},{name:\"ResourceRole\",superClass:[\"BaseElement\"],properties:[{name:\"resourceRef\",type:\"Resource\",isReference:!0},{name:\"resourceParameterBindings\",type:\"ResourceParameterBinding\",isMany:!0},{name:\"resourceAssignmentExpression\",type:\"ResourceAssignmentExpression\"},{name:\"name\",isAttr:!0,type:\"String\"}]},{name:\"ResourceParameterBinding\",properties:[{name:\"expression\",type:\"Expression\",xml:{serialize:\"xsi:type\"}},{name:\"parameterRef\",type:\"ResourceParameter\",isAttr:!0,isReference:!0}],superClass:[\"BaseElement\"]},{name:\"ResourceAssignmentExpression\",properties:[{name:\"expression\",type:\"Expression\",xml:{serialize:\"xsi:type\"}}],superClass:[\"BaseElement\"]},{name:\"Import\",properties:[{name:\"importType\",isAttr:!0,type:\"String\"},{name:\"location\",isAttr:!0,type:\"String\"},{name:\"namespace\",isAttr:!0,type:\"String\"}]},{name:\"Definitions\",superClass:[\"BaseElement\"],properties:[{name:\"name\",isAttr:!0,type:\"String\"},{name:\"targetNamespace\",isAttr:!0,type:\"String\"},{name:\"expressionLanguage\",default:\"http://www.w3.org/1999/XPath\",isAttr:!0,type:\"String\"},{name:\"typeLanguage\",default:\"http://www.w3.org/2001/XMLSchema\",isAttr:!0,type:\"String\"},{name:\"imports\",type:\"Import\",isMany:!0},{name:\"extensions\",type:\"Extension\",isMany:!0},{name:\"rootElements\",type:\"RootElement\",isMany:!0},{name:\"diagrams\",isMany:!0,type:\"bpmndi:BPMNDiagram\"},{name:\"exporter\",isAttr:!0,type:\"String\"},{name:\"relationships\",type:\"Relationship\",isMany:!0},{name:\"exporterVersion\",isAttr:!0,type:\"String\"}]}],enumerations:[{name:\"ProcessType\",literalValues:[{name:\"None\"},{name:\"Public\"},{name:\"Private\"}]},{name:\"GatewayDirection\",literalValues:[{name:\"Unspecified\"},{name:\"Converging\"},{name:\"Diverging\"},{name:\"Mixed\"}]},{name:\"EventBasedGatewayType\",literalValues:[{name:\"Parallel\"},{name:\"Exclusive\"}]},{name:\"RelationshipDirection\",literalValues:[{name:\"None\"},{name:\"Forward\"},{name:\"Backward\"},{name:\"Both\"}]},{name:\"ItemKind\",literalValues:[{name:\"Physical\"},{name:\"Information\"}]},{name:\"ChoreographyLoopType\",literalValues:[{name:\"None\"},{name:\"Standard\"},{name:\"MultiInstanceSequential\"},{name:\"MultiInstanceParallel\"}]},{name:\"AssociationDirection\",literalValues:[{name:\"None\"},{name:\"One\"},{name:\"Both\"}]},{name:\"MultiInstanceBehavior\",literalValues:[{name:\"None\"},{name:\"One\"},{name:\"All\"},{name:\"Complex\"}]},{name:\"AdHocOrdering\",literalValues:[{name:\"Parallel\"},{name:\"Sequential\"}]}],xml:{tagAlias:\"lowerCase\",typePrefix:\"t\"}},bpmndi:{name:\"BPMNDI\",uri:\"http://www.omg.org/spec/BPMN/20100524/DI\",prefix:\"bpmndi\",types:[{name:\"BPMNDiagram\",properties:[{name:\"plane\",type:\"BPMNPlane\",redefines:\"di:Diagram#rootElement\"},{name:\"labelStyle\",type:\"BPMNLabelStyle\",isMany:!0}],superClass:[\"di:Diagram\"]},{name:\"BPMNPlane\",properties:[{name:\"bpmnElement\",isAttr:!0,isReference:!0,type:\"bpmn:BaseElement\",redefines:\"di:DiagramElement#modelElement\"}],superClass:[\"di:Plane\"]},{name:\"BPMNShape\",properties:[{name:\"bpmnElement\",isAttr:!0,isReference:!0,type:\"bpmn:BaseElement\",redefines:\"di:DiagramElement#modelElement\"},{name:\"isHorizontal\",isAttr:!0,type:\"Boolean\"},{name:\"isExpanded\",isAttr:!0,type:\"Boolean\"},{name:\"isMarkerVisible\",isAttr:!0,type:\"Boolean\"},{name:\"label\",type:\"BPMNLabel\"},{name:\"isMessageVisible\",isAttr:!0,type:\"Boolean\"},{name:\"participantBandKind\",type:\"ParticipantBandKind\",isAttr:!0},{name:\"choreographyActivityShape\",type:\"BPMNShape\",isAttr:!0,isReference:!0}],superClass:[\"di:LabeledShape\"]},{name:\"BPMNEdge\",properties:[{name:\"label\",type:\"BPMNLabel\"},{name:\"bpmnElement\",isAttr:!0,isReference:!0,type:\"bpmn:BaseElement\",redefines:\"di:DiagramElement#modelElement\"},{name:\"sourceElement\",isAttr:!0,isReference:!0,type:\"di:DiagramElement\",redefines:\"di:Edge#source\"},{name:\"targetElement\",isAttr:!0,isReference:!0,type:\"di:DiagramElement\",redefines:\"di:Edge#target\"},{name:\"messageVisibleKind\",type:\"MessageVisibleKind\",isAttr:!0,default:\"initiating\"}],superClass:[\"di:LabeledEdge\"]},{name:\"BPMNLabel\",properties:[{name:\"labelStyle\",type:\"BPMNLabelStyle\",isAttr:!0,isReference:!0,redefines:\"di:DiagramElement#style\"}],superClass:[\"di:Label\"]},{name:\"BPMNLabelStyle\",properties:[{name:\"font\",type:\"dc:Font\"}],superClass:[\"di:Style\"]}],enumerations:[{name:\"ParticipantBandKind\",literalValues:[{name:\"top_initiating\"},{name:\"middle_initiating\"},{name:\"bottom_initiating\"},{name:\"top_non_initiating\"},{name:\"middle_non_initiating\"},{name:\"bottom_non_initiating\"}]},{name:\"MessageVisibleKind\",literalValues:[{name:\"initiating\"},{name:\"non_initiating\"}]}],associations:[]},dc:{name:\"DC\",uri:\"http://www.omg.org/spec/DD/20100524/DC\",prefix:\"dc\",types:[{name:\"Boolean\"},{name:\"Integer\"},{name:\"Real\"},{name:\"String\"},{name:\"Font\",properties:[{name:\"name\",type:\"String\",isAttr:!0},{name:\"size\",type:\"Real\",isAttr:!0},{name:\"isBold\",type:\"Boolean\",isAttr:!0},{name:\"isItalic\",type:\"Boolean\",isAttr:!0},{name:\"isUnderline\",type:\"Boolean\",isAttr:!0},{name:\"isStrikeThrough\",type:\"Boolean\",isAttr:!0}]},{name:\"Point\",properties:[{name:\"x\",type:\"Real\",default:\"0\",isAttr:!0},{name:\"y\",type:\"Real\",default:\"0\",isAttr:!0}]},{name:\"Bounds\",properties:[{name:\"x\",type:\"Real\",default:\"0\",isAttr:!0},{name:\"y\",type:\"Real\",default:\"0\",isAttr:!0},{name:\"width\",type:\"Real\",isAttr:!0},{name:\"height\",type:\"Real\",isAttr:!0}]}],associations:[]},di:{name:\"DI\",uri:\"http://www.omg.org/spec/DD/20100524/DI\",prefix:\"di\",types:[{name:\"DiagramElement\",isAbstract:!0,properties:[{name:\"id\",isAttr:!0,isId:!0,type:\"String\"},{name:\"extension\",type:\"Extension\"},{name:\"owningDiagram\",type:\"Diagram\",isReadOnly:!0,isVirtual:!0,isReference:!0},{name:\"owningElement\",type:\"DiagramElement\",isReadOnly:!0,isVirtual:!0,isReference:!0},{name:\"modelElement\",isReadOnly:!0,isVirtual:!0,isReference:!0,type:\"Element\"},{name:\"style\",type:\"Style\",isReadOnly:!0,isVirtual:!0,isReference:!0},{name:\"ownedElement\",type:\"DiagramElement\",isReadOnly:!0,isMany:!0,isVirtual:!0}]},{name:\"Node\",isAbstract:!0,superClass:[\"DiagramElement\"]},{name:\"Edge\",isAbstract:!0,superClass:[\"DiagramElement\"],properties:[{name:\"source\",type:\"DiagramElement\",isReadOnly:!0,isVirtual:!0,isReference:!0},{name:\"target\",type:\"DiagramElement\",isReadOnly:!0,isVirtual:!0,isReference:!0},{name:\"waypoint\",isUnique:!1,isMany:!0,type:\"dc:Point\",xml:{serialize:\"xsi:type\"}}]},{name:\"Diagram\",isAbstract:!0,properties:[{name:\"id\",isAttr:!0,isId:!0,type:\"String\"},{name:\"rootElement\",type:\"DiagramElement\",isReadOnly:!0,isVirtual:!0},{name:\"name\",isAttr:!0,type:\"String\"},{name:\"documentation\",isAttr:!0,type:\"String\"},{name:\"resolution\",isAttr:!0,type:\"Real\"},{name:\"ownedStyle\",type:\"Style\",isReadOnly:!0,isMany:!0,isVirtual:!0}]},{name:\"Shape\",isAbstract:!0,superClass:[\"Node\"],properties:[{name:\"bounds\",type:\"dc:Bounds\"}]},{name:\"Plane\",isAbstract:!0,superClass:[\"Node\"],properties:[{name:\"planeElement\",type:\"DiagramElement\",subsettedProperty:\"DiagramElement-ownedElement\",isMany:!0}]},{name:\"LabeledEdge\",isAbstract:!0,superClass:[\"Edge\"],properties:[{name:\"ownedLabel\",type:\"Label\",isReadOnly:!0,subsettedProperty:\"DiagramElement-ownedElement\",isMany:!0,isVirtual:!0}]},{name:\"LabeledShape\",isAbstract:!0,superClass:[\"Shape\"],properties:[{name:\"ownedLabel\",type:\"Label\",isReadOnly:!0,subsettedProperty:\"DiagramElement-ownedElement\",isMany:!0,isVirtual:!0}]},{name:\"Label\",isAbstract:!0,superClass:[\"Node\"],properties:[{name:\"bounds\",type:\"dc:Bounds\"}]},{name:\"Style\",isAbstract:!0,properties:[{name:\"id\",isAttr:!0,isId:!0,type:\"String\"}]},{name:\"Extension\",properties:[{name:\"values\",isMany:!0,type:\"Element\"}]}],associations:[],xml:{tagAlias:\"lowerCase\"}},bioc:{name:\"bpmn.io colors for BPMN\",uri:\"http://bpmn.io/schema/bpmn/biocolor/1.0\",prefix:\"bioc\",types:[{name:\"ColoredShape\",extends:[\"bpmndi:BPMNShape\"],properties:[{name:\"stroke\",isAttr:!0,type:\"String\"},{name:\"fill\",isAttr:!0,type:\"String\"}]},{name:\"ColoredEdge\",extends:[\"bpmndi:BPMNEdge\"],properties:[{name:\"stroke\",isAttr:!0,type:\"String\"},{name:\"fill\",isAttr:!0,type:\"String\"}]}],enumerations:[],associations:[]},color:{name:\"BPMN in Color\",uri:\"http://www.omg.org/spec/BPMN/non-normative/color/1.0\",prefix:\"color\",types:[{name:\"ColoredLabel\",extends:[\"bpmndi:BPMNLabel\"],properties:[{name:\"color\",isAttr:!0,type:\"String\"}]},{name:\"ColoredShape\",extends:[\"bpmndi:BPMNShape\"],properties:[{name:\"background-color\",isAttr:!0,type:\"String\"},{name:\"border-color\",isAttr:!0,type:\"String\"}]},{name:\"ColoredEdge\",extends:[\"bpmndi:BPMNEdge\"],properties:[{name:\"border-color\",isAttr:!0,type:\"String\"}]}],enumerations:[],associations:[]}};function Sr(e,t){return new _r(E({},Ar,e),t)}function Rr(e){return function(){if(!window.Promise)throw new Error(\"Promises is not supported in this environment. Please polyfill Promise.\");var t=arguments.length;if(!(t>=1&&s(arguments[t-1])))return e.apply(this,arguments);var n=arguments[t-1];console.warn(new Error(\"Passing callbacks to \"+e.name+\" is deprecated and will be removed in a future major release. Please switch to promises: https://bpmn.io/l/moving-to-promises.html\"));var i=Array.prototype.slice.call(arguments,0,-1);e.apply(this,i).then((function(e){var t=Object.keys(e)[0];return n(null,e[t])}),(function(e){return n(e,e.warnings)}))}}var Cr=\"Tried to access di from the businessObject. The di is available through the diagram element only. For more information, see https://github.com/bpmn-io/bpmn-js/issues/1472\";function Mr(e,t){return e.$instanceOf(t)}function kr(e,t){var n={},i=[],r={};function o(e,t){return function(n){e(n,t)}}function a(e){n[e.id]=e}function s(n,i){try{var o=r[n.id]&&function(n,i){if(n.gfx)throw new Error(t(\"already rendered {element}\",{element:vt(n)}));return e.element(n,r[n.id],i)}(n,i);return a(n),o}catch(e){l(e.message,{element:n,error:e}),console.error(t(\"failed to import {element}\",{element:vt(n)})),console.error(e)}}function l(t,n){e.error(t,n)}var m=this.registerDi=function(e){var n,i=e.bpmnElement;i?r[i.id]?l(t(\"multiple DI elements defined for {element}\",{element:vt(i)}),{element:i}):(r[i.id]=e,p(n=i,\"di\")||Object.defineProperty(n,\"di\",{enumerable:!1,get:function(){throw new Error(Cr)}})):l(t(\"no bpmnElement referenced in {element}\",{element:vt(e)}),{element:e})};function f(e){var t;t=e.plane,m(t),h(t.planeElement,d)}function d(e){m(e)}this.handleDefinitions=function(a,s){var p=a.diagrams;if(s&&-1===p.indexOf(s))throw new Error(t(\"diagram not part of bpmn:Definitions\"));if(!s&&p&&p.length&&(s=p[0]),!s)throw new Error(t(\"no diagram to display\"));r={},f(s);var d=s.plane;if(!d)throw new Error(t(\"no plane for {element}\",{element:vt(s)}));var x=d.bpmnElement;if(!x){if(x=function(e){return c(e.rootElements,(function(e){return Mr(e,\"bpmn:Process\")||Mr(e,\"bpmn:Collaboration\")}))}(a),!x)throw new Error(t(\"no process or collaboration to display\"));l(t(\"correcting missing bpmnElement on {plane} to {rootElement}\",{plane:vt(d),rootElement:vt(x)})),d.bpmnElement=x,m(d)}var b,E,w=function(t,n){return e.root(t,r[t.id],n)}(x,d);if(Mr(x,\"bpmn:Process\")||Mr(x,\"bpmn:SubProcess\"))g(x,w);else{if(!Mr(x,\"bpmn:Collaboration\"))throw new Error(t(\"unsupported bpmnElement for {plane}: {rootElement}\",{plane:vt(d),rootElement:vt(x)}));E=w,h((b=x).participants,o(D,E)),_(b.artifacts,E),i.push((function(){!function(e,t){h(e,o(v,t))}(b.messageFlows,E)})),function(e,t){var i=u(e,(function(e){return!n[e.id]&&Mr(e,\"bpmn:Process\")&&e.laneSets}));i.forEach(o(g,t))}(a.rootElements,w)}y(i)};var y=this.handleDeferred=function(){for(;i.length;)i.shift()()};function g(e,t){P(e,t),A(e.ioSpecification,t),_(e.artifacts,t),a(e)}function v(e,t){s(e,t)}function x(e,t){s(e,t)}function b(e,t){s(e,t)}function E(e,t){s(e,t)}function w(e,t){s(e,t)}function _(e,t){h(e,(function(e){Mr(e,\"bpmn:Association\")?i.push((function(){w(e,t)})):w(e,t)}))}function A(e,t){e&&(h(e.dataInputs,o(b,t)),h(e.dataOutputs,o(E,t)))}var S=this.handleSubProcess=function(e,t){P(e,t),_(e.artifacts,t)};function R(e,t){var n=s(e,t);Mr(e,\"bpmn:SubProcess\")&&S(e,n||t),Mr(e,\"bpmn:Activity\")&&A(e.ioSpecification,t),i.push((function(){h(e.dataInputAssociations,o(x,t)),h(e.dataOutputAssociations,o(x,t))}))}function C(e,t){s(e,t)}function M(e,t){i.push((function(){var n=s(e,t);e.childLaneSet&&k(e.childLaneSet,n||t),function(e){h(e.flowNodeRef,(function(t){var n=t.get(\"lanes\");n&&n.push(e)}))}(e)}))}function k(e,t){h(e.lanes,o(M,t))}function P(e,n){!function(e,n){h(e,(function(e){Mr(e,\"bpmn:SequenceFlow\")?i.push((function(){!function(e,t){s(e,t)}(e,n)})):Mr(e,\"bpmn:BoundaryEvent\")?i.unshift((function(){R(e,n)})):Mr(e,\"bpmn:FlowNode\")?R(e,n):Mr(e,\"bpmn:DataObject\")||(Mr(e,\"bpmn:DataStoreReference\")||Mr(e,\"bpmn:DataObjectReference\")?C(e,n):l(t(\"unrecognized flowElement {element} in context {context}\",{element:vt(e),context:n?vt(n.businessObject):\"null\"}),{element:e,context:n}))}))}(e.flowElements,n),e.laneSets&&function(e,t){h(e,o(k,t))}(e.laneSets,n)}function D(e,t){var n=s(e,t),i=e.processRef;i&&g(i,n||t)}}function Pr(e,t,n){var i,r,o,a,s=[];function l(e,t){var n=new kr({root:function(e,t){return i.add(e,t)},element:function(e,t,n){return i.add(e,t,n)},error:function(e,t){s.push({message:e,context:t})}},o);t=t||e.diagrams&&e.diagrams[0];var r=function(e,t){if(!t)return;var n,i=t.plane.bpmnElement,r=i;A(i,\"bpmn:Process\")||A(i,\"bpmn:Collaboration\")||(r=function(e){var t=e;for(;t;){if(A(t,\"bpmn:Process\"))return t;t=t.$parent}}\n/**\n   * This file must not be changed or exchanged.\n   *\n   * @see http://bpmn.io/license for more information.\n   */(i));n=A(r,\"bpmn:Collaboration\")?r:c(e.rootElements,(function(e){if(A(e,\"bpmn:Collaboration\"))return c(e.participants,(function(e){return e.processRef===r}))}));var o=[r];n&&(o=function(e,t){let n=[];return h(e,(function(e,i){n.push(t(e,i))})),n}(n.participants,(function(e){return e.processRef})),o.push(n));var a=Dr(o),s=[t],l=[i];return h(e.diagrams,(function(e){var t=e.plane.bpmnElement;-1!==a.indexOf(t)&&-1===l.indexOf(t)&&(s.push(e),l.push(t))})),s}(e,t);if(!r)throw new Error(o(\"no diagram to display\"));h(r,(function(t){n.handleDefinitions(e,t)}));var l=t.plane.bpmnElement.id;a.setRootElement(a.findRoot(l+\"_plane\")||a.findRoot(l))}return new Promise((function(p,c){try{return i=e.get(\"bpmnImporter\"),r=e.get(\"eventBus\"),o=e.get(\"translate\"),a=e.get(\"canvas\"),r.fire(\"import.render.start\",{definitions:t}),l(t,n),r.fire(\"import.render.complete\",{error:undefined,warnings:s}),p({warnings:s})}catch(e){return e.warnings=s,c(e)}}))}function Dr(e){var t=[];return h(e,(function(e){e&&(t.push(e),t=t.concat(Dr(e.flowElements)))})),t}var Tr,Or='<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 14.02 5.57\" width=\"53\" height=\"21\"><path fill=\"currentColor\" d=\"M1.88.92v.14c0 .41-.13.68-.4.8.33.14.46.44.46.86v.33c0 .61-.33.95-.95.95H0V0h.95c.65 0 .93.3.93.92zM.63.57v1.06h.24c.24 0 .38-.1.38-.43V.98c0-.28-.1-.4-.32-.4zm0 1.63v1.22h.36c.2 0 .32-.1.32-.39v-.35c0-.37-.12-.48-.4-.48H.63zM4.18.99v.52c0 .64-.31.98-.94.98h-.3V4h-.62V0h.92c.63 0 .94.35.94.99zM2.94.57v1.35h.3c.2 0 .3-.09.3-.37v-.6c0-.29-.1-.38-.3-.38h-.3zm2.89 2.27L6.25 0h.88v4h-.6V1.12L6.1 3.99h-.6l-.46-2.82v2.82h-.55V0h.87zM8.14 1.1V4h-.56V0h.79L9 2.4V0h.56v4h-.64zm2.49 2.29v.6h-.6v-.6zM12.12 1c0-.63.33-1 .95-1 .61 0 .95.37.95 1v2.04c0 .64-.34 1-.95 1-.62 0-.95-.37-.95-1zm.62 2.08c0 .28.13.39.33.39s.32-.1.32-.4V.98c0-.29-.12-.4-.32-.4s-.33.11-.33.4z\"/><path fill=\"currentColor\" d=\"M0 4.53h14.02v1.04H0zM11.08 0h.63v.62h-.63zm.63 4V1h-.63v2.98z\"/></svg>',Nr={verticalAlign:\"middle\"},Br={color:\"#404040\"},Lr={zIndex:\"1001\",position:\"fixed\",top:\"0\",left:\"0\",right:\"0\",bottom:\"0\"},Ir={width:\"100%\",height:\"100%\",background:\"rgba(40,40,40,0.2)\"},jr={position:\"absolute\",left:\"50%\",top:\"40%\",transform:\"translate(-50%)\",width:\"260px\",padding:\"10px\",background:\"white\",boxShadow:\"0 1px 4px rgba(0,0,0,0.3)\",fontFamily:\"Helvetica, Arial, sans-serif\",fontSize:\"14px\",display:\"flex\",lineHeight:\"1.3\"},Fr='<div class=\"bjs-powered-by-lightbox\"><div class=\"backdrop\"></div><div class=\"notice\"><a href=\"https://bpmn.io\" target=\"_blank\" rel=\"noopener\" class=\"link\">'+Or+'</a><span>Web-based tooling for BPMN, DMN and forms powered by <a href=\"https://bpmn.io\" target=\"_blank\" rel=\"noopener\">bpmn.io</a>.</span></div></div>';function Vr(){Tr||(Re(Tr=$e(Fr),Lr),Re(He(\"svg\",Tr),Nr),Re(He(\".backdrop\",Tr),Ir),Re(He(\".notice\",Tr),jr),Re(He(\".link\",Tr),Br,{margin:\"15px 20px 15px 10px\",alignSelf:\"center\"}),Ve.bind(Tr,\".backdrop\",\"click\",(function(e){document.body.removeChild(Tr)}))),document.body.appendChild(Tr)}\n/**\n   * The code in the <project-logo></project-logo> area\n   * must not be changed.\n   *\n   * @see http://bpmn.io/license for more information.\n   */function Wr(e){e=E({},Gr,e),this._moddle=this._createModdle(e),this._container=this._createContainer(e),\n/**\n   * Adds the project logo to the diagram container as\n   * required by the bpmn.io license.\n   *\n   * @see http://bpmn.io/license\n   *\n   * @param {Element} container\n   */\nfunction(e){const t=$e('<a href=\"http://bpmn.io\" target=\"_blank\" class=\"bjs-powered-by\" title=\"Powered by bpmn.io\" >'+Or+\"</a>\");Re(He(\"svg\",t),Nr),Re(t,Br,{position:\"absolute\",bottom:\"15px\",right:\"15px\",zIndex:\"100\"}),e.appendChild(t),Ie.bind(t,\"click\",(function(e){Vr(),e.preventDefault()}))}(this._container),this._init(this._container,this._moddle,e)}function zr(e,t){return e.warnings=t,e}e(Wr,ci),Wr.prototype.importXML=async function(e,t){const n=this;let i=[];try{let r;e=this._emit(\"import.parse.start\",{xml:e})||e;try{r=await this._moddle.fromXML(e,\"bpmn:Definitions\")}catch(e){throw this._emit(\"import.parse.complete\",{error:e}),e}let o=r.rootElement;const a=r.references,s=r.warnings,l=r.elementsById;i=i.concat(s),o=this._emit(\"import.parse.complete\",function(e){const t=n.get(\"eventBus\").createEvent(e);return Object.defineProperty(t,\"context\",{enumerable:!0,get:function(){return console.warn(new Error(\"import.parse.complete <context> is deprecated and will be removed in future library versions\")),{warnings:e.warnings,references:e.references,elementsById:e.elementsById}}}),t}({error:null,definitions:o,elementsById:l,references:a,warnings:i}))||o;const p=await this.importDefinitions(o,t);return i=i.concat(p.warnings),this._emit(\"import.done\",{error:null,warnings:i}),{warnings:i}}catch(e){let t=e;throw i=i.concat(t.warnings||[]),zr(t,i),t=function(e){const t=/unparsable content <([^>]+)> detected([\\s\\S]*)$/.exec(e.message);t&&(e.message=\"unparsable content <\"+t[1]+\"> detected; this may indicate an invalid BPMN 2.0 diagram file\"+t[2]);return e}(t),this._emit(\"import.done\",{error:t,warnings:t.warnings}),t}},Wr.prototype.importXML=Rr(Wr.prototype.importXML),Wr.prototype.importDefinitions=async function(e,t){this._setDefinitions(e);return{warnings:(await this.open(t)).warnings}},Wr.prototype.importDefinitions=Rr(Wr.prototype.importDefinitions),Wr.prototype.open=async function(e){const t=this._definitions;let n=e;if(!t){const e=new Error(\"no XML imported\");throw zr(e,[]),e}if(\"string\"==typeof e&&(n=function(e,t){if(!t)return null;return c(e.diagrams,(function(e){return e.id===t}))||null}(t,e),!n)){const t=new Error(\"BPMNDiagram <\"+e+\"> not found\");throw zr(t,[]),t}try{this.clear()}catch(e){throw zr(e,[]),e}const{warnings:i}=await Pr(this,t,n);return{warnings:i}},Wr.prototype.open=Rr(Wr.prototype.open),Wr.prototype.saveXML=async function(e){e=e||{};let t,n,i=this._definitions;try{if(!i)throw new Error(\"no definitions loaded\");i=this._emit(\"saveXML.start\",{definitions:i})||i;n=(await this._moddle.toXML(i,e)).xml,n=this._emit(\"saveXML.serialized\",{xml:n})||n}catch(e){t=e}const r=t?{error:t}:{xml:n};if(this._emit(\"saveXML.done\",r),t)throw t;return r},Wr.prototype.saveXML=Rr(Wr.prototype.saveXML),Wr.prototype.saveSVG=async function(){let e,t;this._emit(\"saveSVG.start\");try{const t=this.get(\"canvas\"),n=t.getActiveLayer(),i=He(\"defs\",t._svg),r=re(n),o=i?\"<defs>\"+re(i)+\"</defs>\":\"\",a=n.getBBox();e='<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n\\x3c!-- created with bpmn-js / http://bpmn.io --\\x3e\\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"'+a.width+'\" height=\"'+a.height+'\" viewBox=\"'+a.x+\" \"+a.y+\" \"+a.width+\" \"+a.height+'\" version=\"1.1\">'+o+r+\"</svg>\"}catch(e){t=e}if(this._emit(\"saveSVG.done\",{error:t,svg:e}),t)throw t;return{svg:e}},Wr.prototype.saveSVG=Rr(Wr.prototype.saveSVG),Wr.prototype._setDefinitions=function(e){this._definitions=e},Wr.prototype.getModules=function(){return this._modules},Wr.prototype.clear=function(){this.getDefinitions()&&ci.prototype.clear.call(this)},Wr.prototype.destroy=function(){ci.prototype.destroy.call(this),Ke(this._container)},Wr.prototype.on=function(e,t,n,i){return this.get(\"eventBus\").on(e,t,n,i)},Wr.prototype.off=function(e,t){this.get(\"eventBus\").off(e,t)},Wr.prototype.attachTo=function(e){if(!e)throw new Error(\"parentNode required\");this.detach(),e.get&&e.constructor.prototype.jquery&&(e=e.get(0)),\"string\"==typeof e&&(e=He(e)),e.appendChild(this._container),this._emit(\"attach\",{}),this.get(\"canvas\").resized()},Wr.prototype.getDefinitions=function(){return this._definitions},Wr.prototype.detach=function(){const e=this._container,t=e.parentNode;t&&(this._emit(\"detach\",{}),t.removeChild(e))},Wr.prototype._init=function(e,t,n){const i=n.modules||this.getModules(n),r=n.additionalModules||[],o=[].concat([{bpmnjs:[\"value\",this],moddle:[\"value\",t]}],i,r),a=E(function(e,t){let n={};return h(Object(e),(function(e,i){-1===t.indexOf(i)&&(n[i]=e)})),n}(n,[\"additionalModules\"]),{canvas:E({},n.canvas,{container:e}),modules:o});ci.call(this,a),n&&n.container&&this.attachTo(n.container)},Wr.prototype._emit=function(e,t){return this.get(\"eventBus\").fire(e,t)},Wr.prototype._createContainer=function(e){const t=$e('<div class=\"bjs-container\"></div>');return Re(t,{width:$r(e.width),height:$r(e.height),position:e.position}),t},Wr.prototype._createModdle=function(e){return new Sr(E({},this._moddleExtensions,e.moddleExtensions))},Wr.prototype._modules=[];const Gr={width:\"100%\",height:\"100%\",position:\"relative\"};function $r(e){return e+(a(e)?\"px\":\"\")}function Hr(e){Wr.call(this,e)}return e(Hr,Wr),Hr.prototype._modules=[_t,ht,Gt,Xt,yn],Hr.prototype._moddleExtensions={},Hr}));\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bpmnjs/changeForEasyflow/changelog.txt",
    "content": "bpmn js download url: git clone https://github.com/bpmn-io/bpmn-js.git -b v13.2.1 .\n\nWe made some changes for easyflow. Details are as follows:\n1.For the purpose of using Viewer and Modeler at the same time, we change rollup.config.js to export different control name.(see rollup.config.js)\n2.For the purpose of supporting other language of 'ID', we change node_modules\\moddle-xml\\dist\\index.js and node_modules\\moddle-xml\\dist\\index.esm.js, commenting the line `throw new Error('illegal ID <' + id + '>');`. \nAfter above change ,we can run 'npm run distro' command to build a new version of bpmn.js."
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/bpmnjs/changeForEasyflow/rollup.config.js",
    "content": "/* eslint-env node */\n\nimport terser from '@rollup/plugin-terser';\nimport nodeResolve from '@rollup/plugin-node-resolve';\nimport commonjs from '@rollup/plugin-commonjs';\nimport json from '@rollup/plugin-json';\nimport replace from '@rollup/plugin-replace';\nimport license from 'rollup-plugin-license';\n\nimport {\n  readFileSync\n} from 'fs';\n\nimport pkg from './package.json';\n\nconst outputDir = 'dist';\n\nconst distros = [\n  {\n    input: 'Viewer',\n    output: 'bpmn-viewer'\n  },\n  {\n    input: 'NavigatedViewer',\n    output: 'bpmn-navigated-viewer'\n  },\n  {\n    input: 'Modeler',\n    output: 'bpmn-modeler'\n  }\n];\n\nconst configs = distros.reduce(function(configs, distro) {\n  const {\n    input,\n    output\n  } = distro;\n\n  return [\n    ...configs,\n    {\n      input: `./lib/${input}.js`,\n      output: {\n        name: `Bpmn${input}`,\n        file: `${outputDir}/${output}.development.js`,\n        format: 'umd'\n      },\n      plugins: pgl([\n        banner(output)\n      ], 'development')\n    },\n    {\n      input: `./lib/${input}.js`,\n      output: {\n        name: `Bpmn${input}`,\n        file: `${outputDir}/${output}.production.min.js`,\n        format: 'umd'\n      },\n      plugins: pgl([\n        banner(output, true),\n        terser({\n          output: {\n            comments: /license|@preserve/\n          }\n        })\n      ], 'production')\n    }\n  ];\n}, []);\n\nexport default configs;\n\n\n// helpers //////////////////////\n\nfunction banner(bundleName, minified) {\n\n  const bannerName = (\n    minified\n      ? 'banner-min'\n      : 'banner'\n  );\n\n  const bannerTemplate = readFileSync(`${__dirname}/resources/${bannerName}.txt`, 'utf8');\n\n  const banner = processTemplate(bannerTemplate, {\n    version: pkg.version,\n    date: today(),\n    name: bundleName\n  });\n\n  return license({\n    banner\n  });\n}\n\nfunction pgl(plugins = [], env = 'production') {\n  return [\n    replace({\n      preventAssignment: true,\n      'process.env.NODE_ENV': JSON.stringify(env)\n    }),\n    nodeResolve(),\n    commonjs(),\n    json(),\n    ...plugins\n  ];\n}\n\nfunction pad(n) {\n  if (n < 10) {\n    return '0' + n;\n  } else {\n    return n;\n  }\n}\n\nfunction today() {\n  const d = new Date();\n\n  return [\n    d.getFullYear(),\n    pad(d.getMonth() + 1),\n    pad(d.getDate())\n  ].join('-');\n}\n\nfunction processTemplate(str, args) {\n  return str.replace(/\\{\\{\\s*([^\\s]+)\\s*\\}\\}/g, function(_, n) {\n\n    var replacement = args[n];\n\n    if (!replacement) {\n      throw new Error('unknown template {{ ' + n + '}}');\n    }\n\n    return replacement;\n  });\n}"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/dataview/dataview-app.js",
    "content": "(function (J) {\nJ.helperPlugin = function() {\n    \n    this.helperRender = function($container) {\n        if (this.cfg.helper && this.cfg.helper.show===false && window.location.search.indexOf(\"_pageHelper\")<0) {\n            return;\n        }\n        var toolBtnHtml = \n        '<div class=\"dropdown\" style=\"position:absolute;right:2px;bottom:2px\">' +\n          '<button class=\"btn btn-secondary dropdown-toggle\" type=\"button\" data-toggle=\"dropdown\"><i class=\"fas fa-tools\"></i></button>' +\n          '<div class=\"dropdown-menu\">' +\n             (this.cfg.templates && this.cfg.templates.length > 1 ? '<a class=\"dropdown-item j-view-change\" href=\"#\">'+J.msg['dataviewapp.viewChange']+'</a>':'') +\n             '<a class=\"dropdown-item j-data-view\" href=\"#\">'+J.msg['dataviewapp.dataView']+'</a>'+\n             '<a class=\"dropdown-item j-data-map\" href=\"#\">'+J.msg['dataviewapp.dataMap']+'</a>'+\n         '</div>' +\n       '</div>';\n        var $toolBtn = $(toolBtnHtml).appendTo($container);\n        var $viewChangeBtn = $toolBtn.find(\".j-view-change\");\n        var $dataViewBtn = $toolBtn.find(\".j-data-view\");\n        var $mapBtn = $toolBtn.find(\".j-data-map\");\n        var _self = this;\n\n        $mapBtn.click(function(){\n           var elementHtml = \"\";\n            var name = \"radioName_\" + $.jSequence.next();\n            var id1 = \"radioId_\" + $.jSequence.next();\n            var checked1=_self.ctx.mapSwitch==\"on\"?\" checked\":\"\";\n            elementHtml += '<div class=\"form-check\" style=\"font-size:16px\"><input type=\"radio\" name=\"' + name + '\" id=\"' + id1 + '\" class=\"form-check-input\" value=\"on\"' + checked1 + '><label class=\"form-check-label\" for=\"' + id1 + '\">'+J.msg['dataviewapp.enable']+'</label></div>';\n            var id2 = \"radioId_\" + $.jSequence.next();\n            var checked2=_self.ctx.mapSwitch!=\"on\"?\" checked\":\"\";\n            elementHtml += '<div class=\"form-check\" style=\"font-size:16px\"><input type=\"radio\" name=\"' + name + '\" id=\"' + id2 + '\" class=\"form-check-input\" value=\"off\"' + checked2 + '><label class=\"form-check-label\" for=\"' + id2 + '\">'+J.msg['dataviewapp.disable']+'</label></div>';\n            $.jDialog({\n                title:J.msg['dataviewapp.dataMapTitle'],\n                size: \"modal-sm\",\n                element:elementHtml,\n                action:function($dialog){\n                    $dialog.find(\"[name=\" + name + \"]\").click(function(){\n                        var mapSwitch = $(this).val();\n                        _self.ctx.mapSwitch=mapSwitch;\n                        if (mapSwitch == 'on') {\n                            _self.$container.find(\".dv-tooltip-label\").tooltip('enable');\n                        } else {\n                            _self.$container.find(\".dv-tooltip-label\").tooltip('disable');\n                        }\n                        $dialog.modal(\"hide\");\n                    });\n                }\n            });\n        });       \n\n        $viewChangeBtn.click(function(){\n            var elementHtml = \"\";\n            var name = \"radioName_\" + $.jSequence.next();\n            for (var i in _self.cfg.templates) {\n                var templateCode = _self.cfg.templates[i].code;\n                var checked = _self.currentTemplateCode == templateCode ? \" checked\" : \"\";\n                var id = \"radioId_\" + $.jSequence.next();\n                elementHtml += '<div class=\"form-check\" style=\"font-size:16px\"><input type=\"radio\" name=\"' + name + '\" id=\"' + id + '\" class=\"form-check-input\" value=\"' + templateCode + '\"' + checked + '><label class=\"form-check-label\" for=\"' + id + '\">' + _self.cfg.templates[i].name + '</label></div>';\n            }\n            $.jDialog({\n                title:J.msg['dataviewapp.viewChangeTitle'],\n                size: \"modal-sm\",\n                element:elementHtml,\n                action:function($dialog){\n                    $dialog.find(\"[name=\" + name + \"]\").click(function(){\n                        var templateCode = $(this).val();\n                        if (templateCode != _self.currentTemplateCode) {\n                            _self.loadAndRender(templateCode);\n                            $dialog.modal(\"hide\");\n                        }\n                    });\n                }\n            });\n        });\n\n        $dataViewBtn.click(function(){\n            var oldData = _self.originData;\n            _self.collect(_self.data);\n            var currentData = _self.data;\n            \n            var dataViewHtml = \n         '<div class=\"modal\" tabindex=\"-1\" role=\"dialog\" id=\"modal\">' + \n           '<div class=\"modal-dialog  modal-lg\" role=\"document\">' + \n            '<div class=\"modal-content\">' + \n              '<div class=\"modal-header\">' + \n                '<h5 class=\"modal-title\">'+J.msg['dataviewapp.dataView']+'</h5>' + \n                '<button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\">' + \n                  '<span aria-hidden=\"true\">&times;</span>' + \n                '</button>' + \n              '</div>' + \n              '<div class=\"modal-body\">' + \n                // tab start\n              '<ul class=\"nav nav-tabs\" role=\"tablist\">' + \n              '<li class=\"nav-item\" role=\"presentation\">' + \n                '<a class=\"nav-link active\" data-toggle=\"tab\" href=\"#jCurrentData\" role=\"tab\" >'+J.msg['dataviewapp.currentData']+'</a>' + \n              '</li>' + \n              '<li class=\"nav-item\" role=\"presentation\">' + \n                '<a class=\"nav-link\" data-toggle=\"tab\" href=\"#jOldData\" role=\"tab\">'+J.msg['dataviewapp.oldData']+'</a>' + \n              '</li>' + \n            '</ul>' + \n            '<div class=\"tab-content\" id=\"myTabContent\">' + \n              '<div class=\"tab-pane fade show active\" id=\"jCurrentData\" role=\"tabpanel\"><textarea id=\"currentJsonData\" class=\"form-control\" rows=\"30\"></textarea></div>' + \n              '<div class=\"tab-pane fade\" id=\"jOldData\" role=\"tabpanel\"><textarea id=\"oldJsonData\" class=\"form-control\" rows=\"30\" readonly=\"readonly\"></textarea></div>' + \n            '</div>' + \n                // tab end\n              '</div>' + \n              '<div class=\"modal-footer\">' + \n              '<button type=\"button\" class=\"btn btn-primary compare-data\">'+J.msg['dataviewapp.dataCompare']+'</button>' + \n              '<button type=\"button\" class=\"btn btn-primary input-data\">'+J.msg['dataviewapp.dataRender']+'</button>' + \n                (_self.cfg.saveAction ? '<button type=\"button\" class=\"btn btn-primary save-data\">'+J.msg['dataviewapp.save']+'</button>':'') + \n                '<button type=\"button\" class=\"btn btn-secondary\" data-dismiss=\"modal\">'+J.msg['dataviewapp.close']+'</button>' + \n              '</div>' +\n            '</div>' +\n          '</div>' +\n        '</div> ';\n        var $dialog = $(dataViewHtml).appendTo($(\"body\"));\n        $dialog.on(\"hidden.bs.modal\", function(){\n            $dialog.modal(\"dispose\");\n            $dialog.remove();\n          });\n       $dialog.on(\"click\", \".j-btn-cancel\", function(){\n           $dialog.modal(\"hide\");\n       });\n       $(\"#currentJsonData\").val(JSON.stringify(currentData, null, 2));\n       $(\"#oldJsonData\").val(JSON.stringify(oldData, null, 2));\n       $(\".compare-data\").click(function(){\n           var compareHtml = \n           '<div class=\"modal\" tabindex=\"-1\" role=\"dialog\" id=\"compareModal\" style=\"overflow:auto\">' +\n              '<div class=\"modal-dialog  modal-lg\" role=\"document\">' +\n                '<div class=\"modal-content\">' +\n                  '<div class=\"modal-header\">' +\n                    '<h5 class=\"modal-title\">'+J.msg['dataviewapp.newOldDataCompare']+'</h5>' +\n                    '<button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\">' +\n                      '<span aria-hidden=\"true\">&times;</span>' +\n                    '</button>' +\n                  '</div>' +\n                  '<div class=\"modal-body\">' +\n                  '<div style=\"overflow:auto\">' +\n                    '<table class=\"table table-bordered\">' +\n                        '<thead><tr><th scope=\"col\">'+J.msg['dataviewapp.dataItem']+'</th><th scope=\"col\">'+J.msg['dataviewapp.originalVal']+'</th><th scope=\"col\">'+J.msg['dataviewapp.afterVal']+'</th></tr></thead>' +\n                    '<tbody id=\"compareData\"></tbody>' +\n                    '</table>' +\n                 '</div>' +\n                '</div>' +\n               '</div>' +\n             '</div>' +\n          '</div>';\n           var $compare = $(compareHtml).appendTo($(\"body\"));\n           $compare.on(\"hidden.bs.modal\", function(){\n               $compare.modal(\"dispose\");\n               $compare.remove();\n             });\n           $compare.on(\"click\", \".j-btn-cancel\", function(){\n               $compare.modal(\"hide\");\n          }); \n            var result = [];\n            var originData = _self.originData;\n           var data;\n           try {\n              data = JSON.parse($(\"#currentJsonData\").val());\n           } catch (err) {\n               $.jMessage({msg:J.msg['dataviewapp.notJsonFormat']});\n               return;\n           }\n            for (var key in originData) {\n                var originVal = JSON.stringify(originData[key], null, 2);\n                var newVal = JSON.stringify(data[key], null, 2);\n                if (originVal !== newVal) {\n                    result.push({key:key, originVal:originVal, newVal:newVal});\n                }\n            }\n            for (var key in data) {\n                if (originData[key] === undefined) {\n                    var newVal = JSON.stringify(data[key], null, 2);\n                    result.push({key:key, originVal:JSON.stringify(undefined), newVal:newVal});\n                }\n            }\n            for (var i in result) {\n                $(\"#compareData\").append(\"<tr><td>\" + result[i].key + \"</td><td><pre>\"+result[i].originVal+\"</pre></td><td><pre>\"+ result[i].newVal+\"</pre></td></tr>\");\n            }\n           $compare.modal();\n       });\n\n       $(\".input-data\").click(function(){\n           var data;\n           try {\n              data = JSON.parse($(\"#currentJsonData\").val());\n           } catch (err) {\n               $.jMessage({msg:J.msg['dataviewapp.notJsonFormat']});\n               return;\n           }\n           for (var key in _self.cfg.data) {\n               delete _self.cfg.data[key];\n           }\n           $.extend(_self.cfg.data, data);\n           if (_self.cfg.allData !== _self.cfg.data) {\n                for (var key in _self.cfg.allData) {\n                   delete _self.cfg.allData[key];\n               }\n               $.extend(_self.cfg.allData, data);\n           }\n           \n           if (!_self.cfg.ctx) {\n               _self.cfg.ctx = {};\n           }\n\n           _self.cfg.ctx.parseValByValProcess=true;\n           _self.clear();\n           _self.init();\n            _self.render(_self.$container);\n            $dialog.modal(\"hide\");\n       });\n\n       $(\".save-data\").click(function(){\n          var data = $(\"#currentJsonData\").val();\n          try {\n              JSON.parse(data);\n          } catch(err) {\n              $.jMessage({msg:J.msg['dataviewapp.notJsonFormat']});\n              return;\n          }\n              _self.cfg.saveAction.call(this, data); \n              $dialog.modal(\"hide\");\n       });\n       $dialog.modal();\n            \n        });\n    }\n    this.loadAndRender = function(template) {\n        // Object type\n        if (template !== null && !Array.isArray(template) && typeof template === 'object') {\n            _renderByConf(this, template);\n            return;\n        }\n        // String type as template code\n        var templateCode = template;\n        if (! templateCode) {\n            if (this.cfg.templates && this.cfg.templates.length>0) {\n            templateCode = this.cfg.templates[0].code;\n            } else {\n                _renderByConf(this, J.jsonTemplateConfig);\n                return;\n            }\n        }\n        var _self = this;\n        var formTemplateUrl = J.formTemplateUrl ? J.formTemplateUrl :  \"/easyflow/formTemplate/ajax/getTemplate\";\n        $.get($.getBaseUrl() + formTemplateUrl + \"?templateCode=\" + templateCode, function(result) {\n            _self.currentTemplateCode = templateCode;\n            template = result.resultData;\n            var config = JSON.parse(template.config);\n\t\t\tif (config == null) {\n\t\t\t\t_renderByConf(_self, J.jsonTemplateConfig);\n\t\t\t} else {\n\t            try {\n\t            _renderByConf(_self, config);\n\t            } catch (error) {\n\t                console.dir(error);\n\t                _renderByConf(_self, J.jsonTemplateConfig);\n\t            }\n\t\t\t}\n        });\n\n    }\n\n    function _renderByConf(_self, config) {\n        if (_self.rendered) {\n            _self.collect(_self.data);\n        }\n        _self.clear();\n        _self.cfg.config = config;\n        _self.init();\n        _self.render(_self.$container);\n    };\n\n};\n\nJ.Page = J.Components['page'] = function(cfg) {\n    this.cfg = cfg;\n    J.helperPlugin.call(this);\n    if (!this.cfg.ctx) {\n        this.cfg.ctx = {};\n    }\n    if (this.cfg.ctx.op==\"modify\" || this.cfg.ctx.op==\"detail\") {\n        this.cfg.ctx.parseValByValProcess = true;\n    }\n    if (this.cfg.ctx.op==\"detail\") {\n        this.cfg.readonly = true;\n    }\n    if (cfg.init !== false) {\n        this.init();\n    }\n    this.init = function() {\n        var cfg = this.cfg;\n        cfg.allConfig = cfg.config;\n        cfg.allData = cfg.data;\n        if (! cfg.originData) {\n            cfg.originData = JSON.parse(JSON.stringify(cfg.data));\n        }\n        if (cfg.config && cfg.config.nullPolicy == 'IGNORE') {\n            cfg.ctx.nullPolicy = 'IGNORE';\n        }\n        J.BaseComponent.call(this, 'page', cfg);\n    }\n    this.clear = function() {\n        this.$container && this.$container.empty();\n        this.component = null;\n\n    }\n    this.render = function($container){\n         this.$container = $container;\n        _beforeRender.call(this, $container);\n        var $div = $('<div class=\"position-relative j-page-container\"></div>').appendTo($container);\n        if (this.config.topHtml) {\n            $div.append(this.config.topHtml);\n        }\n        var formHtml = '<form class=\"' + this.componentClass + '\" action=\"javascript:void(0)\"></form>';\n        this.$form = $(formHtml).appendTo($div);\n        this.$form.validate();\n        this.component.render(this.$form);\n        this.helperRender($div);\n        if (this.cfg.readonly) {\n            this.$form.find(\"input\").attr('readonly', true);\n            this.$form.find(\"textarea\").attr('readonly', true);\n            this.$form.find('select').attr('disabled', true);\n            this.$form.find(\"button.add\").attr(\"disabled\", true);\n            this.$form.find(\"button.insert\").attr(\"disabled\", true);\n            this.$form.find(\"button.remove\").attr(\"disabled\", true);\n        }\n        if (this.config.bottomHtml) {\n            $div.append($(this.config.bottomHtml));\n        }\n        _afterRender.call(this, $container);\n        this.rendered = true;\n    }\n\n}\n\nJ.Tabs = J.Components['tabs'] = function(cfg) {\n    J.BaseComponent.call(this, 'tabs', cfg);\n    this.render = function($container){\n        var tabsHtml = '<ul class=\"nav nav-tabs\" role=\"tablist\"></ul><div class=\"tab-content\"></div>';\n        $(tabsHtml).appendTo($container);\n        this.renderComponents($container);\n        var $tabs = $container.find(\".nav-tabs\");\n        $tabs.children(\"li\").first().children(\"a\").tab(\"show\");\n        if (this.components.length==1 && ! this.components[0].cfg.config.name) {\n            $tabs.hide();\n        }\n    }\n}\n    J.Tab = J.Components['tab'] = function(cfg) {\n        J.BaseComponent.call(this, 'tab', cfg);\n        this.render = function($container) {\n            this.$container = $container;\n            var _self = this;\n            var $tabs = $container.find(\".nav-tabs\");\n            var $contents = $container.find(\".tab-content\");\n            this.tabId = \"tab_\" + this.id;\n            this.panelId = \"panel_\" + this.id;\n            if (cfg.config.show !== false) {\n                var tabHtml = \"<li class='nav-item'><a class='nav-link' id='\" + this.tabId + \"' data-toggle='tab' href='#\" + this.panelId + \"' role='tab'>\" + cfg.config.name + \"</a></li>\";\n                this.$tab = $(tabHtml).appendTo($tabs);\n            }\n            if (!cfg.config.sider) {\n                var contentHtml = \"<div class='tab-pane' id='\" + this.panelId + \"' role='tabpanel'></div>\";\n                this.$content = $(contentHtml).appendTo($contents);\n                this.renderComponents(this.$content);\n            } else {\n                var contentHtml = \"<div class='tab-pane position-relative' id='\" + this.panelId + \"' role='tabpanel'>\" +\n                \"<div class='sider-control'><i class='far fa-minus-square'></i></div>\" +\n                \"<div class='row'><div class='contentSider'></div>\" +\n                \"<div class='contentContainer col' style='position:relative;height:600px;overflow-y:scroll'></div></div></div>\";\n                this.$content = $(contentHtml).appendTo($contents);\n                this.$siderControl = this.$content.find(\".sider-control\");\n                this.$contentSider = this.$content.find(\".contentSider\");\n                this.$contentContainer = this.$content.find(\".contentContainer\");\n                this.renderComponents(this.$contentContainer);\n                this.$siderControl.click(function() {\n                    _self.$contentSider.toggle();\n                    $(this).find(\"i\").toggleClass(\"fa-minus-square fa-plus-square\");\n                });\n\n                var navHtml = '<nav class=\"nav nav-pills flex-column\" style=\"margin-top:5px\">';\n                this.components && this.components.forEach(function(element) {\n                    var $container = element.$panel || element.$card;\n                    if ($container.css(\"display\")!='none') {\n                        $container.data(\"name\") && (navHtml+='<a class=\"nav-link\" href=\"#' + $container.attr(\"id\") + '\">' + $container.data(\"name\") + '</a>');\n                        if (cfg.config.siderLevel==2) {\n                            $container.css(\"position\", \"static\");\n                            navHtml += '<nav class=\"nav nav-pills flex-column\">';\n                            element.components && element.components.forEach(function(sub) {\n                                var $sub = sub.$panel || sub.$card;\n                              if ($sub.css(\"display\")!='none') {\n                                $sub.data(\"name\") && (navHtml += '<a class=\"nav-link ml-3\" href=\"#' + $sub.attr(\"id\") + '\">' + $sub.data(\"name\") + '</a>');\n                                }\n                            });\n                            navHtml += \"</nav>\"\n                        }\n                    }\n                });\n                navHtml+=\"</nav>\";\n               var $navList = $(navHtml).appendTo(this.$contentSider);\n               $navList.find(\"a\").click(function() {\n                var offsetTop = document.getElementById($(this).attr(\"href\").substr(1)).offsetTop;\n                _self.$contentContainer.scrollTop(offsetTop);\n                return false;\n            })\n            this.$contentContainer.scrollspy({ target: this.$contentSider});\n            }\n        }\n    }\n\nJ.Panel = J.Components['panel'] = function(cfg) {\n    J.BaseComponent.call(this, 'panel', cfg);\n    this.render = function($container){\n        this.$container = $container;\n        var header = cfg.config.name ?  '<div class=\"card-header\">' +\n                '<h4><button class=\"btn btn-link\" type=\"button\" data-toggle=\"collapse\" data-target=\"#collapse_' + this.id + '\">' + cfg.config.name + '</button></h4>' +\n             '</div>' : \"\";\n        var panelHtml =\n        '<div id=\"panel_'+ this.id + '\" class=\"j-panel card ' + (cfg.config.show!==false ? \"\":\" d-none\") + (cfg.config.name ? \"\" : \"border-0\") + '\" data-name=\"' + cfg.config.name + '\">' +\n            header +\n            '<div id=\"collapse_' + this.id + '\" class=\"collapse show\">' +\n                '<div class=\"j-card card-body\"></div>' +\n            '</div>' +\n        '</div>';\n        this.$panel = $(panelHtml).appendTo($container);\n        this.$cardBody = this.$panel.find(\".card-body\");\n        this.renderComponents(this.$cardBody);\n    }\n}\n\nJ.Card = J.Components['card'] = function(cfg) {\n    J.BaseComponent.call(this, 'card', cfg);\n    this.render = function($container){\n         this.$container = $container;\n        var header = this.config.name ? '<div class=\"card-header\">' + this.config.name + '</div>' : '';\n        var cardHtml =\n        '<div id=\"card_' + this.id + '\" class=\"j-card card' + (cfg.config.show!==false ? \"\" : \" d-none\") + (this.config.name?\"\":\" border-0\") + '\" data-name=\"' + cfg.config.name + '\">'+\n            header +\n            '<div class=\"card-body container-fluid' + (this.config.name?\"\":\" p-0\") + '\">'+\n            '</div>'+\n        '</div>';\n        this.$card = $(cardHtml).appendTo($container);\n        this.$cardBody = this.$card.find(\".card-body\");\n        var cols = this.config.cols;\n        if (! cols) {cols=1}\n        var $row = null;\n        var current = 0;\n        for (var i in this.components) {\n            if (current % cols == 0) {\n                $row = $('<div class=\"row\"></div>').appendTo(this.$cardBody);\n            }\n            this.components[i].render($row);\n            if (this.components[i].config.show !== false) {\n                current= this.components[i].config.newline ? 0 : current+1;\n            }\n        }\n    }\n}\n\nvar _commonCollect = J._commonCollect = function(val, data) {\n    if (val == \"\") {\n        val = null;\n    }\n    var valProcess = this.config.valProcess;\n    var cfgType = this.config.cfgType;\n    if (cfgType == \"json\") {\n        val = JSON.parse(val);\n    }\n    var ignoreNull = this.cfg.ctx.nullPolicy == 'IGNORE';\n    if (valProcess == \"key\") {\n        if ((val === null || val===undefined) && ignoreNull && data[this.config.cfgKey] === undefined) {\n            return;\n        }\n        data[this.config.cfgKey] = val;\n    } else if (valProcess == \"keyPath\") {\n        if ((val === null || val===undefined) && ignoreNull && J.jp.value(data[this.config.cfgKey], this.config.cfgPath) === undefined) {\n            return;\n        }\n        data[this.config.cfgKey] = J.jp.value(data[this.config.cfgKey], this.config.cfgPath, val);\n    } else if (valProcess == \"self\") {\n            try {\n        var selfFunc = eval(this.config.cfgSelf);\n        selfFunc.call(this, \"collect\");\n            } catch (err) {\n                console.log(\"eval Exception, js:\" + this.config.cfgSelf);\n                console.dir(err);\n                throw err;\n            }\n            \n    }\n}\n\nvar _parseVal = function() {\n    var val;\n    var parseValByValProcess = this.cfg.ctx.parseValByValProcess;\n    if (parseValByValProcess) {\n        val = _parseValByValProcess.call(this);\n    } else {\n        val = this.config.defaultVal;\n        if (this.config.valProcess==\"self\") {\n            try {\n            var selfFunc = eval(this.config.cfgSelf);\n            val = selfFunc.call(this, \"parse\");\n            } catch (err) {\n                console.log(\"eval Exception, js:\" + this.config.cfgSelf);\n                console.dir(err);\n                throw err;\n        }\n    }\n        }\n    if (val === undefined) {\n        val = null;\n    }\n    return val;\n}\nvar _parseValByValProcess = function() {\n    var val;\n    var data = this.allData;\n    var valProcess = this.config.valProcess;\n    if (! data) return val;\n    if (valProcess==\"key\") {\n        val = data[this.config.cfgKey];\n    } else if (valProcess==\"keyPath\") {\n        val = J.jp.value(data[this.config.cfgKey], this.config.cfgPath);\n    } else if (valProcess==\"self\") {\n            try {\n        var selfFunc = eval(this.config.cfgSelf);\n        val = selfFunc.call(this, \"parse\");\n            } catch (err) {\n                console.log(\"eval Exception, js:\" + this.config.cfgSelf);\n                console.dir(err);\n                throw err;\n            }\n    }\n    var cfgType = this.config.cfgType;\n    if (cfgType == \"json\") {\n        val = JSON.stringify(val,null, 2);\n    }\n    return val;\n}\n\nvar has = false;\nvar _addRules = function() {\n    if (this.config.required) {\n        this.$element.rules(\"add\", {required:true});\n    }\n    if (this.config.rule) {\n        for (var i in this.config.rule) {\n            var rule = this.config.rule[i];\n            var ruleInfo = {};\n            var ruleMessage = {};\n            ruleInfo[rule.type]=rule.value;\n            if (rule.message) {\n                ruleMessage[rule.type]=rule.message;\n                ruleInfo[\"messages\"] = ruleMessage;\n            }\n            this.$element.rules(\"add\",ruleInfo);\n        }\n    }\n}\n\nvar _beforeRender = function($container) {\n    var beforeRender = this.config.beforeRender;\n        if (beforeRender) {\n             try {\n                    eval(beforeRender)\n                } catch (err) {\n                    console.log(\"eval Exception, js:\" + beforeRender);\n                    console.dir(err);\n                    throw err;\n                }            \n        }\n}\nvar _afterRender = function($container) {\n    var afterRender = this.config.afterRender;\n        if (afterRender) {\n            try {\n                eval(afterRender);\n            } catch (err) {\n                console.log(\"eval Exception, js:\" + afterRender);\n                console.dir(err);\n                throw err;\n            }\n\n        }\n}\n\nvar _commonInit = J._commonInit = function() {\n    this.render = function($container){\n        this.$container = $container;\n        _beforeRender.call(this, $container);\n        this.col = (this.config.cols && this.config.cols!=-1) ? \"col-\" + this.config.cols : \"col\";\n        this.show = (this.config.show!==false) ? \"\":\" d-none\";\n        var inputHtml =\n        '<div class=\"form-group ' + this.col + this.show + '\">' +\n            '<label class=\"dv-tooltip-label l_' + this.componentClass + '\">' + (this.config.required ? '<span class=\"j-require\">*</span>':'') + this.config.name + ':</label>' +\n        '</div>';\n        this.$input = $(inputHtml).appendTo($container);\n        this.innerRender.call(this, $container);\n        this.$label = this.$label ? this.$label : this.$input.find(\".l_\" + this.componentClass);\n        this.$label.tooltip({\"trigger\":\"click\", \"title\":J.msg['dataviewapp.dataKey'] + this.config.cfgKey + (this.config.cfgPath ? \" \" + J.msg['dataviewapp.keyPath'] + this.config.cfgPath : \"\")}).tooltip('disable');\n        this.$element = this.$element ? this.$element : this.$input.find(\".\" + this.componentClass);\n        if (this.config.desc) {\n            this.$element.tooltip({\"html\":true, \"title\":this.config.desc});\n        }\n        if ((!this.ctx || this.ctx.op =='add') && ! this.config.modify0) {\n            this.$element.attr(\"readonly\", \"readonly\");\n        }\n        if (this.ctx && this.ctx.op =='modify' && ! this.config.modify) {\n            this.$element.attr(\"readonly\", \"readonly\");\n        }\n        _addRules.call(this);\n        if (this.innerVal) {\n            this.innerVal.call(this);\n        } else {\n            var val = _parseVal.call(this);\n            this.$element.val(val);\n            if (this.afterElementValInit) {\n                this.afterElementValInit.call(this);\n            }\n        }\n        _afterRender.call(this, $container);\n    }\n\n    this.collect = function(data) {\n        _commonCollect.call(this, this.$element.val(), data);\n    }\n}\n\nJ.InputText = J.Components['inputText'] = function(cfg) {\n    J.BaseComponent.call(this, 'inputText', cfg);\n    var _self = this;\n    _commonInit.call(this);\n    this.innerRender=function($container){\n        $('<input type=\"text\" class=\"form-control ' + this.componentClass + '\" name=\"' + this.name + '\"/>').appendTo(this.$input);\n    }\n}\n\nJ.Select = J.Components['select'] = function(cfg) {\n    J.BaseComponent.call(this, 'select', cfg);\n    var _self = this;\n    _commonInit.call(this);\n    this.collect = function(data) {\n        var cfgType = this.config.cfgType;\n        var val = this.$element.val();\n        if (this.config.selectType == 'single') {\n            if (val == \"\") {\n                val = null;\n            }\n            if (cfgType == \"json\") {\n                val = JSON.parse(val);\n            }\n        } else {\n            if (this.config.selectType == 'seqMultiple') {\n                val = this.selectVal;\n            }\n            if (val != null && val.length == 0) {\n                val = null;\n            }\n            if (val != null && cfgType == \"json\") {\n                for (var i in val) {\n                    val[i] = JSON.parse(val[i]);\n                }\n            }\n        }\n        if (val != null && this.config.selectValType == \"comma\") {\n            if (cfgType == \"json\") {\n                for (var i in val) {\n                    val[i] = JSON.stringify(val[i]);\n                }\n            }\n            val = val.join(',');\n\n        }\n        var valProcess = this.config.valProcess;\n        var ignoreNull = this.cfg.ctx.nullPolicy == 'IGNORE';\n        if (valProcess == \"key\") {\n            if ((val === null || val===undefined) && ignoreNull && data[this.config.cfgKey] === undefined) {\n                return;\n            }\n            data[this.config.cfgKey] = val;\n        } else if (valProcess == \"keyPath\") {\n            if ((val === null || val===undefined) && ignoreNull && J.jp.value(data[this.config.cfgKey], this.config.cfgPath) === undefined) {\n                return;\n            }\n            data[this.config.cfgKey] = J.jp.value(data[this.config.cfgKey], this.config.cfgPath, val);\n        } else if (valProcess == \"self\") {\n                try {\n                    var selfFunc = eval(this.config.cfgSelf);\n                    selfFunc.call(this, \"collect\");\n                } catch (err) {\n                    console.log(\"eval Exception, js:\" + this.config.cfgSelf);\n                    console.dir(err);\n                    throw err;\n                }\n            }\n    }\n\n    this.refreshSeqSelect = function($element) {\n        if (! this.selectVal) this.selectVal = [];\n        this.$element.find(\"option\").each(function(index){\n            var idx = _self.selectVal.indexOf($(this).val());\n            $(this).text((idx<0?'':(idx + 1) + \"-\") + _self.config.selectList[index].name);\n        });\n        _self.$element.multiselect(\"rebuild\");\n    }\n    this.innerRender=function($container){\n        $('<select class=\"form-control ' + this.componentClass + '\"' + (cfg.config.selectType=='single'?'':' multiple=\"multiple\"')+ ' name=\"' + this.name + '\"></select>').appendTo(this.$input);\n        this.$element = this.$input.find(\".\" + this.componentClass);\n        var selectList = this.config.selectList;\n        for (var i in selectList) {\n            this.$element.append(\"<option value='\"+selectList[i].value+\"'>\"+selectList[i].name+\"</option>\");\n        }\n        if (this.config.selectType == 'multiple') {\n            this.$element.multiselect();\n        } else if (this.config.selectType == 'seqMultiple') {\n            this.$element.multiselect({includeSelectAllOption:false,onChange:function(option, check) {\n                _self.selectVal = _self.selectVal || [];\n                if (check) {\n                    _self.selectVal.push($(option).val());\n                } else {\n                    _self.selectVal = _self.selectVal.filter(function(item){return item!=$(option).val();});\n                }\n                _self.refreshSeqSelect(_self.$element);\n            }});\n        }\n    }\n\n    this._checkSelect = function(val) {\n       var selectList = this.config.selectList;\n        for (var i in selectList) {\n            if (selectList[i].value == val) {\n                return;\n            }\n        }\n        var error = J.msg['dataviewapp.selectCheck1'] + this.config.name + \" \"+J.msg['dataviewapp.selectCheck2']+\":\" + this.config.cfgKey + \" \"+J.msg['dataviewapp.selectCheck3']+\":\" + JSON.stringify(this.config.selectList) + \" \"+J.msg['dataviewapp.selectCheck4']+\":\" + val;\n        console.log(error);\n        alert(error);\n        throw error;\n\n    }\n    this.innerVal = function($container) {\n        var val;\n        if (this.config.selectType == 'single') {\n            val = _parseVal.call(this);\n            if (val!==null && val !== \"null\") {\n                this._checkSelect(val);\n            }\n            this.$element.val(val);\n        } else {\n            var parseValByValProcess = this.cfg.ctx.parseValByValProcess;\n            var valProcess = this.config.valProcess;\n            if (parseValByValProcess) {\n                var data = this.allData;\n                if (! data) return;\n                if (valProcess==\"key\") {\n                    val = data[this.config.cfgKey];\n                } else if (valProcess==\"keyPath\") {\n                    val = J.jp.value(data[this.config.cfgKey], this.config.cfgPath);\n                } else if (valProcess==\"self\") {\n                        try {\n                    var selfFunc = eval(this.config.cfgSelf);\n                    val = selfFunc.call(this, \"parse\");\n                        } catch (err) {\n                            console.log(\"eval Exception, js:\" + this.config.cfgSelf);\n                            console.dir(err);\n                            throw err;\n                        }\n                    }\n            } else {\n                val = this.config.defaultVal && JSON.parse(this.config.defaultVal);\n            }\n            if (! val) {return;}\n            if (this.config.selectValType=='comma') {\n                val = val.split(\",\");\n            }\n            if (this.config.cfgType == 'json') {\n                for (var i in val) {\n                    val[i] = JSON.stringify(val[i]);\n                }\n            }\n            for (var i in val) {\n                this._checkSelect(val[i]);\n            }\n            this.$element.val(val);\n            if (this.config.selectType == 'seqMultiple') {\n                this.selectVal = val;\n                this.refreshSeqSelect(_self.$element);\n            } else {\n                this.$element.multiselect(\"refresh\");\n            }\n        }\n    }\n}\n\nJ.Textarea = J.Components['textarea'] = function(cfg) {\n    J.BaseComponent.call(this, 'textarea', cfg);\n    var _self = this;\n    _commonInit.call(this);\n    this.innerRender=function($container){\n        $('<textarea class=\"form-control ' + this.componentClass + '\" name=\"' + this.name + '\"></textarea>').appendTo(this.$input);\n    }\n}\n\nJ.Self = J.Components['self'] = function(cfg) {\n    J.BaseComponent.call(this, 'self', cfg);\n\tvar _self = this;\n    var selfScript = this.config.selfScript;\n        try {\n            this.selfFunc = eval(selfScript);\n            this.selfFunc.init(cfg);\n        } catch (err) {\n            console.log(\"eval Exception, js:\" + selfScript);\n            console.dir(err);\n            throw err;\n        }        \n\n    this.render=function($container){\n        this.selfFunc.render($container);\n    }\n\n    this.collect = function(data) {\n       this.selfFunc.collect(data);\n    }\n}\n\nJ.FixInput = J.Components['fixInput'] = function(cfg) {\n    J.BaseComponent.call(this, 'fixInput', cfg);\n    var _self = this;\n    _commonInit.call(this);\n    this.innerRender=function($container){\n        $('<input type=\"text\" class=\"form-control ' + this.componentClass + '\" name=\"' + this.name + '\" readonly=\"readonly\"/>').appendTo(this.$input);\n    }\n    this.innerVal = function($container) {\n        this.$element.val(this.config.defaultVal);\n    }\n    this.collect = function(data) {\n        // NOOP;\n    }\n}\n\nJ.TableSelect = J.Components['tableSelect'] = function(cfg) {\n    J.BaseComponent.call(this, 'tableSelect', cfg);\n    var _self = this;\n    _commonInit.call(this);\n    this.collect = function(data) {\n        var val = this.$tableSelect.data(\"jTableSelect\").$valueField.val();\n        _commonCollect.call(this, val, data);\n    }\n\n    this.innerRender=function($container){\n        $('<div id=\"tableSelect_' + this.id + '\" class=\"' + this.componentClass + '\"></div>').appendTo(this.$input);\n        this.$tableSelect = this.$input.find(\".\" + this.componentClass);\n        var val = _parseVal.call(this);\n        var conf = this.tableSelectConf;// computed from beforeRender\n        conf.initValue = val;\n        conf.name=\"elName_\" + this.id;\n        this.$tableSelect.jTableSelect(conf);\n        this.$element=this.$tableSelect.data(\"jTableSelect\").$valueField;\n    }\n    this.innerVal = function($container) {}\n}\n\nJ.ListSelect = J.Components['listSelect'] = function(cfg) {\n    J.BaseComponent.call(this, 'listSelect', cfg);\n    var _self = this;\n    _commonInit.call(this);\n    this.collect = function(data) {\n        var val = this.$listSelect.data(\"jListSelect\").$valueField.val();\n        _commonCollect.call(this, val, data);\n    }\n\n    this.innerRender=function($container){\n        $('<div id=\"listSelect_' + this.id + '\" class=\"' + this.componentClass + '\"></div>').appendTo(this.$input);\n        this.$listSelect = this.$input.find(\".\" + this.componentClass);\n        var val = _parseVal.call(this);\n        var conf = this.listSelectConf;// computed from beforeRender\n        conf.initValue = val;\n        conf.name=\"elName_\" + this.id;\n        this.$listSelect.jListSelect(conf);\n        this.$element=this.$listSelect.data(\"jListSelect\").$valueField;\n    }\n    this.innerVal = function($container) {}\n}\n\nJ.CardList = J.Components['cardList'] = function(cfg) {\n    J.List.call(this, cfg);\n    var _listRender = this.render;\n    this.render = function($container) {\n        _beforeRender.call(this, $container);\n        var dataStr = _parseValByValProcess.call(this);\n        if (dataStr) {\n            this.data = JSON.parse(dataStr);\n        }\n        _listRender.call(this, $container);\n        this.col = (this.config.cols && this.config.cols!=-1) ? \"col-\" + this.config.cols : \"col\";\n        this.$list.addClass(this.col);\n        _afterRender.call(this, $container);\n    }\n    var _listCollect = this.collect;\n    this.collect = function(data) {\n        var newListData = _listCollect.call(this, data);\n        _commonCollect.call(this, JSON.stringify(newListData), data);\n    }\n}\n\nJ.ElementsCard = J.Components['elementsCard'] = function(cfg) {\n\tJ.BaseComponent.call(this, 'elementsCard', cfg);\n\t_commonInit.call(this);\n\t\n    this.innerRender = function($container) {\n\t\tthis.$input.find(\"label\").remove();\n        this.component.render(this.$input);\n    }\n\t\n    this.collect = function(data) {\n\t\treturn this.component.collect(data);\n    }\n}\n\n    J.Table = J.Components['table'] = function(cfg) {\n        J.BaseComponent.call(this, 'table', cfg);\n        var _self = this;\n        _commonInit.call(this);\n        this.innerRender=function($container){\n            $('<input type=\"hidden\" class=\"form-control ' + this.componentClass + '\" name=\"' + this.name + '\"></input>').appendTo(this.$input);\n            this.$table = $(\"<table id='#\" + this.id + \"'></table>\").appendTo(this.$input);\n            var conf = this.tableConf;//computed from beforeRender\n            this.$table.bootstrapTable(conf);\n        }\n        this.afterElementValInit = function() {\n            var conf = this.tableConf;//computed from beforeRender\n            var val = this.$element.val();\n            if (val) {\n                conf.data = JSON.parse(this.$element.val());\n            }\n            this.$table.bootstrapTable(\"destroy\");\n            this.$table.bootstrapTable(conf);\n        }\n    }\n\n   })(window.J);\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/dataview/dataview-biz.js",
    "content": "(function (J) {\n\t\n\tJ.DataView.additionalConfigTypeList=[\n\t\t{value: \"dateInput\", \"text\":J.msg['dataviewcfg.dateType']},\n\t\t{value: \"fileInput\", \"text\":J.msg['dataviewcfg.fileType']},\n\t\t{value: \"mask\", \"text\":J.msg['dataviewcfg.maskInputType']},\n\t\t{value: \"flow\", \"text\":J.msg['dataviewcfg.flowType']},\n\t\t{value: \"fsm\", \"text\":J.msg['dataviewcfg.fsmType']}\n\t];\n\t\n\tJ.FlowConfig = J.Components['flowConfig'] = J.FsmConfig = J.Components['fsmConfig']=J.InputTextConfig;\n\tJ.Flow = J.Components['flow'] = function(cfg) {\n\t\tJ.BaseComponent.call(this, 'flow', cfg);\n\t\tvar _self = this;\t\n\t\tJ._commonInit.call(this);\n\t\tthis.innerRender=function($container){\n\t\t\tthis.$input.jFlowInput({name:this.name, clazz:this.componentClass});\n            this.$element = this.$input.data(\"jFlowInput\").jTableSelect.$inputField;\n\t\t}\n\t}\n\n\tJ.Fsm = J.Components['fsm'] = function(cfg) {\n\t\tJ.BaseComponent.call(this, 'fsm', cfg);\n\t\tvar _self = this;\t\n\t\tJ._commonInit.call(this);\n\t\tthis.innerRender=function($container){\n\t\t\tthis.$input.jFsmInput({name:this.name, clazz:this.componentClass});\n            this.$element = this.$input.data(\"jFsmInput\").jTableSelect.$inputField;\n\t\t}\n\t}\n\n    J.MaskConfig = J.Components['maskConfig'] = J.InputTextConfig;\n    J.Mask = J.Components['mask'] = function(cfg) {\n        J.BaseComponent.call(this, 'mask', cfg);\n        var _self = this;\n        J._commonInit.call(this);\n        this.innerRender=function($container){\n            var $element = $('<input type=\"text\" class=\"form-control ' + this.componentClass + '\" name=\"' + this.name + '\"/>').appendTo(this.$input);\n            $element.jMaskInput({\"plaintextFunc\":this.plaintextFunc});            \n        }\n    }   \n\t\n\t\n\tJ.DateInputConfig = J.Components['dateInputConfig'] = function(cfg) {\n\t\tJ.BaseComponent.call(this, 'dateInputConfig', cfg);\n\t\tvar _self = this;\n\t\tthis.render = function($container) {\n\t\t\tthis.$container = $container;\n\t\t\tJ._commonAddConfigBody.call(this, $container);\n\t\t\tJ._commonConfigRender.call(_self,this.$bodyContainer);\n\t\t}\n\t\tthis.collect = function(data) {\n\t\t\tvar collectData = _commonConfigCollect.call(_self, data);\n\t\t\treturn collectData;\n\t\t}\n\t}\n\t\n\tJ.DateInput = J.Components['dateInput'] = function(cfg) {\n\t    J.BaseComponent.call(this, 'dateInput', cfg);\n\t    var _self = this;\n\t    J._commonInit.call(this);\n\t    this.innerRender=function($container){\n\t        $('<input type=\"text\" class=\"form-control ' + this.componentClass + '\" name=\"' + this.name + '\" onchange=\"$(this).valid()\"/>').appendTo(this.$input);\n\t        this.$element=this.$input.find(\".\" + this.componentClass);\n\t        var readonly = false;\n\t        if ((!this.ctx || this.ctx.op =='add') && ! this.config.modify0) {\n\t            readonly = true;\n\t        }\n\t        if (this.ctx && this.ctx.op =='modify' && ! this.config.modify) {\n\t            readonly = true;\n\t        }\n\t        var conf = this.dateInputConf;//compute from beforeRender\n\t        if (! readonly) {\n\t            this.$element.datetimepicker(conf);\n\t        }\n\t    }\n\t}\n\t\n\tJ.FileInputConfig = J.Components['fileInputConfig'] = function(cfg) {\n\t\tJ.BaseComponent.call(this, 'fileInputConfig', cfg);\n\t\tvar _self = this;\n\t\tthis.render = function($container) {\n\t\t\tthis.$container = $container;\n\t\t\tJ._commonAddConfigBody.call(this, $container);\n\t\t\tvar multipleHtml = \n\t\t\t\t'<div class=\"form-group col-6\"><label>'+J.msg['dataviewcfg.fileCount']+':</label><select class=\"form-control c_multiple ' + this.componentClass + '\">' +\n\t            \t'<option value=\"single\" selected=\"selected\">'+J.msg['dataviewcfg.singleFile']+'</option>' +\n\t                '<option value=\"multiple\">'+J.msg['dataviewcfg.multipleFile']+'</option>' +\n\t            '</select></div>';\n\t\t\tvar $multiple = $(multipleHtml).appendTo(this.$bodyContainer).find(\"select\");\n\t\t\tthis.data && this.data.multiple && $multiple.val(this.data.multiple);\n\t\t\tJ._commonConfigRender.call(_self,this.$bodyContainer);\n\t\t}\n\t\tthis.collect = function(data) {\n\t\t\tvar collectData = _commonConfigCollect.call(_self, data);\n\t\t\tcollectData.multiple = this.$container.find(\".c_multiple.\" + this.componentClass).val();\n\t\t\treturn collectData;\n\t\t}\n\t}\n\t\n\tJ.FileInput = J.Components['fileInput'] = function(cfg) {\n\t    J.BaseComponent.call(this, 'fileInput', cfg);\n\t    var _self = this;\n\t    J._commonInit.call(this);\n\t    this.innerRender=function($container){\n\t        var multipleHtml = this.config.multiple == \"multiple\" ? ' multiple=\"multiple\"':\"\";\n\t        $('<input type=\"file\" class=\"form-control ' + this.componentClass + '\" name=\"' + this.name + '\"' + multipleHtml + '/>').appendTo(this.$input);\n\t        this.$element=this.$input.find(\".\" + this.componentClass);\n\t        if ((!this.ctx || this.ctx.op =='add') && ! this.config.modify0) {\n\t            this.$element.attr(\"readonly\", \"readonly\");\n\t        }\n\t        if (this.ctx && this.ctx.op =='modify' && ! this.config.modify) {\n\t            this.$element.attr(\"readonly\", \"readonly\");\n\t        }\n\n\t        var conf = this.fileInputConf;//computed from before render\n\t        this.$element.fileinput(conf);\n\t        // after\n\n\t    }\n\t    this.innerVal = function(){}\n\t    this.collect = function(data) {\n\t        var preview = this.$element.fileinput(\"getPreview\");\n\t        var previewConfig = preview.config;\n\t        var keys = [];\n\t        for (var i in previewConfig){\n\t            keys.push({key:previewConfig[i].key, caption:previewConfig[i].caption, size:previewConfig[i].size});\n\t        }\n\t        if (keys.length == 0){\n\t            keys = null;\n\t        }\n\t        J._commonCollect.call(this, JSON.stringify(keys), data);\n\t    }\n\t    }\t\n\t\n\t\t\n\t\n})(J);"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/dataview/dataview-config.js",
    "content": "(function (J) {\n\n\tJ.PageConfig = J.Components['pageConfig'] = function(cfg) {\n\t\tthis.componentData = cfg.data &&cfg.data.component;\n\t\tJ.BaseComponent.call(this, 'pageConfig', cfg);\n\t\tthis.render = function($container){\n           this.$container = $container;\n\t\t\tconsole.log(\"Render pageConfig\");\n\t\t\tvar formHtml = '<form class=\"j-form-horizontal j-page-config-form ' + this.componentClass + '\" action=\"javascript:void(0)\"></form>';\n\t\t\tthis.$form = $(formHtml).appendTo($container);\n\t\t\tthis.$form.validate();\n\t\t\tthis.component.render(this.$form);\n            \n            var formConfigHtml = '';\n\t\t\t\n\t\t\tvar pageConfigHtml0 = \n\t\t\t\t'<div class=\"row mt-1\">' +\n\t\t\t\t    '<div class=\"form-group col-2\">' +\n\t\t\t\t        '<label>NULL' + J.msg[\"dataviewcfg.collectPolicy\"] + ':</label><select class=\"form-control nullPolicy ' + this.componentClass + '\"><option value=\"KEEP\">'+J.msg['dataviewcfg.keep']+'</option><option value=\"IGNORE\">'+J.msg['dataviewcfg.ignore']+'</option></select>' +\n\t\t\t\t    '</div>' +\n\t\t\t\t '</div>' +\n\t\t\t '</div>';\n\t\t\t\n\t\t\tvar pageConfigHtml = \t\n                '<div class=\"row mt-1\">' +\n                    '<div class=\"form-group col\">' +\n                        '<label>'+J.msg['dataviewcfg.topHtml']+':</label> <textarea class=\"form-control topHtml ' + this.componentClass + '\"></textarea>' +\n                    '</div>' +                \n                    '<div class=\"form-group col\">' +\n                        '<label>' + J.msg['dataviewcfg.bottomHtml']+':</label> <textarea class=\"form-control bottomHtml ' + this.componentClass + '\"></textarea>' +\n                    '</div>' +\n                '</div>' +              \t\t\t\n\t\t\t\t'<div class=\"row mt-1\">' +\n\t\t\t\t    '<div class=\"form-group col\">' +\n\t\t\t\t        '<label>'+J.msg['dataviewcfg.pageBeforeRenderScript'] +':</label> <textarea class=\"form-control beforeRender ' + this.componentClass + '\"></textarea>' +\n\t\t\t\t    '</div>' +\n\t\t\t\t    '<div class=\"form-group col\">' +\n\t\t\t            '<label>'+J.msg['dataviewcfg.pageAfterRenderScript'] +':</label> <textarea class=\"form-control afterRender ' + this.componentClass + '\"></textarea>' +\n\t\t\t        '</div>' +\n\t\t\t    '</div>' +\t    \n\t\t\t\t'<div class=\"row mt-1\">' +\n\t\t\t\t    '<div class=\"form-group col\">' +\n\t\t\t            '<label>'+J.msg['dataviewcfg.pageBeforeCollectScript']+':</label> <textarea class=\"form-control beforeCollect ' + this.componentClass + '\"></textarea>' +\n\t\t\t        '</div>' +\n\t\t\t        '<div class=\"form-group col\">' +\n\t\t                '<label>'+J.msg['dataviewcfg.pageAfterCollectScript']+':</label> <textarea class=\"form-control afterCollect ' + this.componentClass + '\"></textarea>' +\n\t\t            '</div>' +\t\t\t        \n\t\t\t     '</div>';\n\t\t\t    this.$pageConfig0 = $(pageConfigHtml0).appendTo(this.$form);\n\t\t\t\tthis.$pageConfig = $(pageConfigHtml).appendTo(this.$form);\n\t\t\t\tthis.$nullPolicy = this.$pageConfig0.find(\".nullPolicy.\" + this.componentClass);\n\t\t\t\tthis.$nullPolicy.tooltip({title:J.msg['dataviewcfg.nullPolicyTooltip']})\n\t\t\t\tcfg.data && this.$nullPolicy.val(cfg.data.nullPolicy);\n\n                this.$topHtml = this.$pageConfig.find(\".topHtml.\" + this.componentClass);\n                cfg.data && this.$topHtml.val(cfg.data.topHtml);                \n                this.$bottomHtml = this.$pageConfig.find(\".bottomHtml.\" + this.componentClass);\n                cfg.data && this.$bottomHtml.val(cfg.data.bottomHtml);\n                \n\t\t\t\tthis.$beforeRender = this.$pageConfig.find(\".beforeRender.\" + this.componentClass);\n\t\t\t\tcfg.data && this.$beforeRender.val(cfg.data.beforeRender);\n\t\t\t\tthis.$afterRender = this.$pageConfig.find(\".afterRender.\" + this.componentClass);\n\t\t\t\tcfg.data && this.$afterRender.val(cfg.data.afterRender);\n\t\t\t\tthis.$beforeCollect = this.$pageConfig.find(\".beforeCollect.\" + this.componentClass);\n\t\t\t\tcfg.data && this.$beforeCollect.val(cfg.data.beforeCollect);\n\t\t\t\tthis.$afterCollect = this.$pageConfig.find(\".afterCollect.\" + this.componentClass);\n\t\t\t\tcfg.data && this.$afterCollect.val(cfg.data.afterCollect);\n              \n                \n                \n\t\t}\n\t\tthis.collect = function(data) {\n\t\t\tdata.type = \"page\";\n\t\t\tdata.component = this.component.collect();\n\t\t\tdata.nullPolicy = this.$nullPolicy.val();\n            data.topHtml = this.$topHtml.val();\n            data.bottomHtml = this.$bottomHtml.val();\n\t\t\tdata.beforeRender = this.$beforeRender.val();\n\t\t\tdata.afterRender = this.$afterRender.val();\n\t\t\tdata.beforeCollect = this.$beforeCollect.val();\n\t\t\tdata.afterCollect = this.$afterCollect.val();\n\t\t\treturn data;\n\t\t}\n\n\t}\n\tJ.TabsConfig = J.Components['tabsConfig'] = function(cfg) {\n\t\tthis.componentData = cfg.data &&cfg.data.components;\n\t\tJ.BaseComponent.call(this, 'tabsConfig', cfg);\n\t\tthis.render = function($container){\n            this.$container = $container;\n\t\t\tconsole.log(\"Render tabsConfig\");\n\t\t\tthis.component.render($container);\n\t\t}\n\t\tthis.collect = function(data) {\n\t\t\tvar tabsData = {};\n\t\t\ttabsData.type=\"tabs\";\n\t\t\ttabsData.components = this.component.collect();\n\t\t\treturn tabsData;\n\t\t}\n\n\t}\n\n\tJ.TabConfig = J.Components['tabConfig'] = function(cfg) {\n\t\tthis.componentData = cfg.data && cfg.data.components;\n\t\tJ.BaseComponent.call(this, 'tabConfig', cfg);\n\t\tthis.render = function($container) {\n            this.$container = $container;\n\t\t\tconsole.log(\"Render tabConfig\");\n\t\t\tvar tabConfigHtml = \n\t\t\t'<div class=\"j-tab-config card\">' +\n\t\t         '<div class=\"card-body\">' +\n\t\t\t        '<div class=\"row\">' +\n\t\t\t            '<div class=\"form-group col-8\">' +\n\t\t\t                '<label>'+J.msg['dataviewcfg.tabName']+':</label> <input type=\"text\" class=\"form-control tabName ' + this.componentClass + '\" value=\"\" />' +\n\t\t\t            '</div>' +\n                        '<div class=\"form-check col\">' +\n                            '<input type=\"checkbox\" class=\"form-check-input tabSider ' + this.componentClass + '\"/>' +\n                            '<label class=\"form-check-label\">'+J.msg['dataviewcfg.siderBar']+'</label>' + \n                        '</div>' +   \n                        '<div class=\"form-group col-2\"><label>'+J.msg['dataviewcfg.siderBarLevel']+':</label>' +\n                            '<select class=\"form-control tabSiderLevel ' + this.componentClass + '\"><option value=\"1\">1</option><option value=\"2\">2</option></select>' +\n                        '</div>' +                                                 \n                        '<div class=\"form-check col\">' +\n                            '<input type=\"checkbox\" class=\"form-check-input tabShow ' + this.componentClass + '\"/>' +\n                            '<label class=\"form-check-label\">'+J.msg['dataviewcfg.show']+'</label>' + \n                        '</div>' +                          \n\t\t\t        '</div>' +\n\t\t        '</div>' +\n\t        '</div>';\n\t\t\tthis.$tabConfig = $(tabConfigHtml).appendTo($container);\n\t\t\tcfg.data && this.$tabConfig.find(\".tabName.\" + this.componentClass).val(cfg.data.name);\n            this.$sider = this.$tabConfig.find(\".tabSider.\" + this.componentClass);\n            this.data && this.$sider.prop(\"checked\", this.data.sider);\n            this.$siderLevel = this.$tabConfig.find(\".tabSiderLevel.\" + this.componentClass);\n            cfg.data && this.$siderLevel.val(cfg.data.siderLevel);\n            this.$show = this.$tabConfig.find(\".tabShow.\" + this.componentClass);\n            this.$show.prop(\"checked\", !(this.data && this.data.show===false));\n\t\t\tvar $tabComponentContainer = this.$tabConfig.find(\".card-body\");\n\t\t\tthis.component.render($tabComponentContainer);\n\t\t}\n\t\tthis.collect = function(data) {\n\t\t\tvar tabData = {};\n\t\t\ttabData.type = \"tab\";\n\t\t\ttabData.name = this.$tabConfig.find(\".\" + this.componentClass).val();\n            (! this.$show.prop(\"checked\")) && (tabData.show=false);\n            tabData.sider = this.$sider.prop(\"checked\");\n            (this.$siderLevel.val()==2) && (tabData.siderLevel = 2);\n\t\t\ttabData.components = this.component.collect();\n\t\t\treturn tabData;\n\t\t}\t\n\t}\n\n\tJ.PanelConfig = J.Components['panelConfig'] = function(cfg) {\n\t\tthis.componentData = cfg.data && cfg.data.components;\n\t\tJ.BaseComponent.call(this, 'panelConfig', cfg);\n\t\tthis.render = function($container) {\n            this.$container = $container;\n\t\t\tconsole.log(\"Render panelConfig\");\n\t\t\tvar panelConfigHtml = \n\t\t\t'<div class=\"j-panel-config card\">' +\n\t\t         '<div class=\"card-body\">' +\n\t\t\t        '<div class=\"row\">' +\n\t\t\t            '<div class=\"form-group col-11\">' +\n\t\t\t                '<label><span class=\"j-require\"></span>'+J.msg['dataviewcfg.panelName']+':</label> <input type=\"text\" class=\"form-control panelName ' + this.componentClass + '\" value=\"\" />' +\n\t\t\t            '</div>' +\n                    '<div class=\"form-check col\">' +\n                    '<input type=\"checkbox\" class=\"form-check-input panelShow ' + this.componentClass + '\"/>' +\n                    '<label class=\"form-check-label\">'+J.msg['dataviewcfg.show']+'</label>' + \n                '</div>' +                           \n\t\t\t        '</div>' +\n\t\t        '</div>' +\n\t        '</div>';\n\t\t\tthis.$panelConfig = $(panelConfigHtml).appendTo($container);\n\t\t\tcfg.data && this.$panelConfig.find(\".panelName.\" + this.componentClass).val(cfg.data.name);\n            this.$show = this.$panelConfig.find(\".panelShow.\" + this.componentClass);\n            this.$show.prop(\"checked\", !(this.data && this.data.show===false));\n\t\t\tvar $panelComponentContainer = this.$panelConfig.find(\".card-body\");\n\t\t\tthis.component.render($panelComponentContainer);\n\t\t}\n\t\tthis.collect = function(data) {\n\t\t\tvar panelData = {};\n\t\t\tpanelData.type = \"panel\";\n\t\t\tpanelData.name = this.$panelConfig.find(\".\" + this.componentClass).val();\n            (! this.$show.prop(\"checked\")) && (panelData.show=false);\n\t\t\tpanelData.components = this.component.collect();\n\t\t\treturn panelData;\n\t\t}\n\t}\n\n\n\tJ.CardConfig = J.Components['cardConfig'] = function(cfg) {\n\t\tthis.componentData = cfg.data && cfg.data.components;\n\t\tJ.BaseComponent.call(this, 'cardConfig', cfg);\n\t\tthis.render = function($container) {\n            this.$container = $container;\n\t\t\tconsole.log(\"Render cardConfig\");\n\t\t\tvar cardConfigHtml = \n\t\t\t'<div class=\"j-card-config card\">' +\n\t\t         '<div class=\"card-body\">' +\n\t\t\t        '<div class=\"row\">' +\n\t\t\t            '<div class=\"form-group col-6\">' +\n\t\t\t                '<label>'+J.msg['dataviewcfg.cardName']+':</label> <input type=\"text\" class=\"form-control cardName ' + this.componentClass + '\" value=\"\" />' +\n\t\t\t            '</div>' +\n\t\t\t            '<div class=\"form-group col-4\">' +\n\t\t                '<label>'+J.msg['dataviewcfg.elementPerRow']+':</label> <input type=\"text\" class=\"form-control cardCols ' + this.componentClass + '\" value=\"\" ></input>' +\n\t\t            '</div>' +\t\n                    '<div class=\"form-check col\">' +\n                    '<input type=\"checkbox\" class=\"form-check-input cardShow ' + this.componentClass + '\"/>' +\n                    '<label class=\"form-check-label\">'+J.msg['dataviewcfg.show']+'</label>' + \n                '</div>' + \t            \n\t\t\t        '</div>' +\n\t\t        '</div>' +\n\t        '</div>';\n\t\t\tthis.$cardConfig = $(cardConfigHtml).appendTo($container);\n\t\t\tcfg.data && this.$cardConfig.find(\".cardName.\" + this.componentClass).val(cfg.data.name);\n\t\t\tcfg.data && this.$cardConfig.find(\".cardCols.\" + this.componentClass).val(cfg.data.cols);\n            this.$show = this.$cardConfig.find(\".cardShow.\" + this.componentClass);\n            this.$show.prop(\"checked\", !(this.data && this.data.show===false));\n\t\t\tvar $cardComponentContainer = this.$cardConfig.find(\".card-body\");\n\t\t\tthis.component.render($cardComponentContainer);\n\t\t}\n\t\tthis.collect = function(data) {\n\t\t\tvar cardData = {};\n\t\t\tcardData.type = \"card\";\n\t\t\tcardData.name = this.$cardConfig.find(\".cardName.\" + this.componentClass).val();\n\t\t\tcardData.cols = parseInt(this.$cardConfig.find(\".cardCols.\" + this.componentClass).val());\n            (! this.$show.prop(\"checked\")) && (cardData.show=false);\n\t\t\tcardData.components = this.component.collect();\n\t\t\treturn cardData;\n\t\t}\n\t}\n\n\tJ.ElementConfig = J.Components['elementConfig'] = function(cfg) {\n\t\tJ.BaseComponent.call(this, 'elementConfig', cfg);\n\t\tthis.render = function($container) {\n            this.$container = $container;\n\t\t\tconsole.log(\"Render elementConfig\");\n\t\t\tvar configTypeList = J.DataView.configTypeList;\n\t\t\tif (! configTypeList) {\n\t\t\t  configTypeList = [\n\t\t\t\t{value: \"inputText\", \"text\":J.msg['dataviewcfg.textType']},\n\t\t\t\t{value: \"select\", \"text\":J.msg['dataviewcfg.selectType']},\n\t\t\t\t{value: \"textarea\", \"text\":J.msg['dataviewcfg.areaType']},\n\t\t\t\t{value: \"fixInput\", \"text\":J.msg['dataviewcfg.fixTextType']},\n\t\t\t\t{value: \"tableSelect\", \"text\":J.msg['dataviewcfg.tableSelectType']},\n\t\t\t\t{value: \"listSelect\", \"text\":J.msg['dataviewcfg.listSelectType']},\n\t\t\t\t{value: \"self\", \"text\":J.msg['dataviewcfg.selfType']},\n\t\t\t\t{value: \"cardList\", \"text\":J.msg['dataviewcfg.cardListType']},\n\t\t\t\t{value: \"elementsCard\", \"text\":J.msg['dataviewcfg.elementsCardType']},\t\t\t\t\n\t\t\t\t{value: \"table\", \"text\":J.msg['dataviewcfg.tableType']},\n\t\t\t  ];\n\t\t\t}\n\t\t\tif (J.DataView.additionalConfigTypeList) {\n\t\t\t\tconfigTypeList=configTypeList.concat(J.DataView.additionalConfigTypeList);\n\t\t\t}\t\t\t\n\t\t\tvar configTypeListStr = \"\";\n\t\t\tfor (var i in configTypeList) {\n\t\t\t\tconfigTypeListStr +='<option value=\"' + configTypeList[i].value + '\">'+configTypeList[i].text + '</option>';\n\t\t\t}\n\t\t\t\n\t\t\tvar elementConfigHtml = \n\t        '<div class=\"row j-element-config\">' +\n\t\t        '<div class=\"form-group col\">' +\n\t\t            '<label>'+J.msg['dataviewcfg.configName']+':</label> <input type=\"text\" class=\"form-control j-el-name\" value=\"\" />' +\n\t\t        '</div>' +\n\t\t        '<div class=\"form-group col\">' +\n\t\t            '<label>'+J.msg['dataviewcfg.configType']+':</label>' +\n\t                '<select class=\"form-control j-el-type\">' +\n\t                    '<option value=\"\" selected=\"selected\">'+J.msg['dataviewcfg.selectTypeTip']+'</option>' +\n\t\t                configTypeListStr+\n\t                '</select>' +\n\t\t        '</div>' +\n\t\t        '<div class=\"form-group col\"><label>'+J.msg['dataviewcfg.gridColNum']+':</label>' +\n\t\t\t\t    '<select class=\"form-control c_cols ' + this.componentClass + '\">' +\n\t\t\t\t        '<option value=\"-1\" selected=\"selected\">'+J.msg['dataviewcfg.gridColAuto']+'</option>' +\n\t\t\t\t        '<option value=\"1\">1</option>' +\n\t\t\t\t        '<option value=\"2\">2</option>' +\n\t\t\t\t        '<option value=\"3\">3</option>' +\n\t\t\t\t        '<option value=\"4\">4</option>' +\n\t\t\t\t        '<option value=\"5\">5</option>' +\n\t\t\t\t        '<option value=\"6\">6</option>' +\n\t\t\t\t    '</select></div>'+\n\t\t\t\t'<div class=\"form-group col\"><label>'+J.msg['dataviewcfg.newLine']+':</label>' +\n\t\t\t\t    '<select class=\"form-control c_newline ' + this.componentClass + '\">' +\n\t\t    \t        '<option value=\"true\">'+J.msg['dataviewcfg.yes']+'</option>' +\n\t\t                '<option value=\"false\" selected=\"selected\">'+J.msg['dataviewcfg.no']+'</option>' +\n\t\t            '</select>' +\n\t\t\t    '</div>' +\n                '<div class=\"form-check col\">' +\n                    '<input type=\"checkbox\" class=\"form-check-input c_show ' + this.componentClass + '\"/>' +\n                    '<label class=\"form-check-label\">'+J.msg['dataviewcfg.show']+'</label>' + \n                '</div>' +                \n\t\t        '<div class=\"col j-el-info\">' +\n\t            '</div>' +\n\t        '</div>';\n\t\t\tthis.$elementConfig = $(elementConfigHtml).appendTo($container);\n\t\t\tthis.$elementName = this.$elementConfig.find(\".j-el-name\");\n\t\t\tthis.$elementInfo = this.$elementConfig.find(\".j-el-info\");\n\t\t\tthis.$elementExt = null;// Extend config, currently list element using. add one row after j-element-config\n\t\t\tthis.$elementType = this.$elementConfig.find(\".j-el-type\");\n\t\t\tthis.$elementName.val(cfg.data && cfg.data.name);\n\t\t\tvar _self = this;\n\t\t\tthis.$elementType.change(function(){\n\t\t\t\t_self.$elementInfo.empty();\n\t\t\t\t_self.$elementExt && _self.$elementExt.remove();\n\t\t\t\tvar val = $(this).val();\n\t\t\t\tif (val == \"\") {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t_self.component = new J.Components[val + \"Config\"](_self.cfg);\n\t\t\t\t_self.component.render(_self.$elementInfo);\n\t\t\t});\n\t\t\tcfg.data && cfg.data.type && this.$elementType.val(cfg.data.type).change();\n\t\t\t\n\t\t\tthis.$cols = this.$elementConfig.find(\".c_cols\");\n\t\t\tthis.$cols.tooltip({title:J.msg['dataviewcfg.colsTooltip']})\n\t\t\tthis.data && this.data.cols && this.$cols.val(this.data.cols);\n\t\t\tthis.$newline = this.$elementConfig.find(\".c_newline\");\n\t\t\tthis.$newline.tooltip({title:J.msg['dataviewcfg.newLineTooltip']});\n\t\t\tthis.data && this.$newline.val(this.data.newline?\"true\":\"false\");\n            this.$show = this.$elementConfig.find(\".c_show\");\n            var show = !(this.data && this.data.show===false);\n            this.$show.prop(\"checked\", show);\n\t\t}\n\t\t\n\t\tthis.collect = function(data) {\n\t\t\tvar elementType = this.$elementType.val();\n\t\t\tif (! elementType) {return;}\n\t\t\tvar elementName = this.$elementName.val();\n\t\t\tvar cols = parseInt(this.$cols.val());\n\t\t\tvar newline = this.$newline.val()=='true';\n\t\t\tvar elementInfo = this.component.collect();\n\t\t\tif (!elementInfo.type) {\n\t\t\t\telementInfo.type = elementType;\n\t\t\t}\n\t\t\telementInfo.name = elementName;\n\t\t\telementInfo.cols = cols;\n\t\t\telementInfo.newline = newline;\n            (! this.$show.prop(\"checked\")) && (elementInfo.show=false);\n\t\t\treturn elementInfo;\n\t\t}\n\t\t\n\t}\n\tvar _commonAddConfigBody = J._commonAddConfigBody = function($container) {\n\t\tvar bodyHtml = '<div><button type=\"button\" class=\"btn btn-primary j-param-config\">'+J.msg['dataviewcfg.paramConfig']+'</button></div>' +\n\t\t\t'<div class=\"modal modal\" tabindex=\"-1\" role=\"dialog\">'+\n\t\t\t  '<div class=\"modal-dialog  modal-xl\" role=\"document\">'+\n\t\t\t    '<div class=\"modal-content\">'+\n\t\t\t      '<div class=\"modal-header\">'+\n\t\t\t        '<h5 class=\"modal-title\">'+J.msg['dataviewcfg.config']+'</h5>'+\n\t\t\t        '<button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\">'+\n\t\t\t          '<span aria-hidden=\"true\">&times;</span>'+\n\t\t\t        '</button>'+\n\t\t\t      '</div>'+\n\t\t\t      '<div class=\"modal-body\"></div>'+\n\t\t\t      '<div class=\"modal-footer\">'+\n\t\t\t        '<button type=\"button\" class=\"btn btn-primary\" data-dismiss=\"modal\">'+J.msg['dataviewcfg.confirm']+'</button>'+\n\t\t\t      '</div>'+\n\t\t\t    '</div>'+\n\t\t\t  '</div>'+\n\t\t\t'</div>';\n\t\t$(bodyHtml).appendTo($container);\n\t\tvar _self = this;\n\t\tthis.$bodyContainer = $container.find(\".modal-body\");\n\t\tthis.$modal = $container.find(\".modal\");\n\t\tthis.$paramConfigBtn = $container.find(\".j-param-config\");\n\t\tthis.$paramConfigBtn.click(function(){\n\t\t\t_self.$modal.modal();\n\t\t});\n\t}\n\n\tvar _commonConfigRender = J._commonConfigRender = function($container) {\n\t\tvar _self = this;\n\t\tvar $row = $(\"<div class='row mt-2'></div>\").appendTo($container);\n\t\tvar requireHtml = \n\t\t\t'<div class=\"form-group col\"><label>'+J.msg['dataviewcfg.required']+':</label>' +\n\t\t\t'<select class=\"form-control c_require ' + this.componentClass + '\">' +\n\t    \t'<option value=\"true\">'+J.msg['dataviewcfg.yes']+'</option>' +\n\t        '<option value=\"false\" selected=\"selected\">'+J.msg['dataviewcfg.no']+'</option>' +\n\t    '</select></div>';\n\t\tvar $require = $(requireHtml).appendTo($row);\n\t\tthis.data && $require.find(\".\" + this.componentClass).val(this.data.required===false ? \"false\":\"true\");\n\t\tvar descHtml = \n\t\t\t'<div class=\"form-group col\"><label>'+J.msg['dataviewcfg.configDesc']+':</label>' +\n\t\t\t'<textarea class=\"form-control j-textarea-config c_desc ' + this.componentClass + '\"></textarea></div>';\t\n\t\tvar $desc = $(descHtml).appendTo($row);\n\t\t$desc.tooltip({title:J.msg['dataviewcfg.descTooltip']});\n\t\tthis.data && this.data.desc && $desc.find(\".\" + this.componentClass).val(this.data.desc);\n\t\t\n\t\t$row = $(\"<div class='row'></div>\").appendTo($container);\n\t\t// Modify flag\n\t\tvar modify0Html = \n\t\t\t'<div class=\"form-group col\"><label>'+J.msg['dataviewcfg.modifyOnAdd']+':</label>' +\n\t\t\t'<select class=\"form-control c_modify0 ' + this.componentClass + '\">' +\n\t    \t'<option value=\"true\" selected=\"selected\">'+J.msg['dataviewcfg.yes']+'</option>' +\n\t        '<option value=\"false\">'+J.msg['dataviewcfg.no']+'</option>';\n\t    '</select></div>';\n\t\tvar $modify0 = $(modify0Html).appendTo($row);\n\t\t$modify0.tooltip({title:J.msg['dataviewcfg.modifyOnAddTooltip']});\n\t\tthis.data && $modify0.find(\".\" + this.componentClass).val(this.data.modify0===false?\"false\":\"true\");\n\t\tvar modifyHtml = \n\t\t\t'<div class=\"form-group col\"><label>'+J.msg['dataviewcfg.modifyOnEdit']+':</label>' +\n\t\t\t'<select class=\"form-control c_modify ' + this.componentClass + '\">' +\n\t    \t'<option value=\"true\" selected=\"selected\">'+J.msg['dataviewcfg.yes']+'</option>' +\n\t        '<option value=\"false\">'+J.msg['dataviewcfg.no']+'</option>';\n\t    '</select></div>';\n\t\tvar $modify = $(modifyHtml).appendTo($row);\n\t\t$modify.tooltip({title:J.msg['dataviewcfg.modifyOnEditTooltip']});\n\t\tthis.data && $modify.find(\".\" + this.componentClass).val(this.data.modify===false?\"false\":\"true\");\n\t\t\n\t\t$row = $(\"<div class='row'></div>\").appendTo($container);\n\t\tvar cfgTypeHtml = \n\t\t\t'<div class=\"form-group col\"><label>'+J.msg['dataviewcfg.valType']+':</label>' +\n\t\t\t'<select class=\"form-control c_cfgType ' + this.componentClass + '\">' +\n\t    \t'<option value=\"string\" selected=\"selected\">string</option>' +\n\t        '<option value=\"json\">json</option>';\n\t    '</select></div>';\n\t\tvar $cfgType = $(cfgTypeHtml).appendTo($row);\n\t\t$cfgType.tooltip({title:J.msg['dataviewcfg.valTypeTooltip']});\n\t\tthis.data && this.data.cfgType && $cfgType.find(\".\" + this.componentClass).val(this.data.cfgType);\n\t\tvar defaultValHtml = \n\t\t\t'<div class=\"form-group col\"><label>'+J.msg['dataviewcfg.defaultVal']+':</label>' +\n\t\t\t'<textarea class=\"form-control j-textarea-config c_defaultVal ' + this.componentClass + '\"></textarea></div>';\t\n\t\tvar $defaultVal = $(defaultValHtml).appendTo($row);\n\t\t$defaultVal.tooltip({title:J.msg['dataviewcfg.defaultValTooltip']});\n\t\tthis.data && this.data.defaultVal && $defaultVal.find(\".\" + this.componentClass).val(this.data.defaultVal);\n\t\t\n\t\t$row = $(\"<div class='row'></div>\").appendTo($container);\n\t\tvar ruleHtml = \n\t\t\t'<div class=\"form-group col\"><label>'+J.msg['dataviewcfg.validateRule']+':</label>' +\n\t\t\t'<textarea class=\"form-control j-textarea-config c_rule ' + this.componentClass + '\"></textarea></div>';\t\n\t\tvar $rule = $(ruleHtml).appendTo($row);\n\t\t$rule.tooltip({title:J.msg['dataviewcfg.validateRuleTooltip']});\n\t\tthis.data && this.data.rule && $rule.find(\".\" + this.componentClass).val(JSON.stringify(this.data.rule, 2));\n\t\tvar sourceHtml = \n\t\t\t'<div class=\"form-group col\"><label>'+J.msg['dataviewcfg.source']+':</label>' +\n\t\t\t'<select class=\"form-control c_source ' + this.componentClass + '\">' +\n\t    \t'<option value=\"product\" selected=\"selected\">'+J.msg['dataviewcfg.sourcePm']+'</option>' +\n\t        '<option value=\"dev\">'+J.msg['dataviewcfg.sourceDev']+'</option>';\n\t    '</select></div>';\n\t\tvar $source = $(sourceHtml).appendTo($row);\n\t\t$source.tooltip({title:J.msg['dataviewcfg.sourceTooltip']});\n\t\tthis.data && this.data.source && $source.find(\".\" + this.componentClass).val(this.data.source);\n\t\t\n\t\t$row = $(\"<div class='row'></div>\").appendTo($container);\n\t\tvar valProcessHtml = \n\t\t\t'<div class=\"form-group col-6\"><label>'+J.msg['dataviewcfg.valProcess']+':</label>' +\n\t\t\t'<select class=\"form-control c_valProcess ' + this.componentClass + '\">' +\n\t    \t'<option value=\"key\">'+J.msg['dataviewcfg.key']+'</option>' +\n\t        '<option value=\"keyPath\">'+J.msg['dataviewcfg.keyPath']+'</option>' +\n\t        '<option value=\"self\">'+J.msg['dataviewcfg.self']+'</option>' +\n\t    '</select></div>';\n\t\tvar $valProcess = $(valProcessHtml).appendTo($row);\n\t\t$valProcess.tooltip({\"title\":J.msg['dataviewcfg.valProcessTooltip']});\n\t\tvar renderValue = function(val) {\n\t\t\t$container.find(\".data-conf\").remove();\n\t\t\tif (val == 'key') {\n\t\t\t\tvar html = '<div class=\"form-group col-6 data-conf\"><label>'+J.msg['dataviewcfg.key']+':</label><input type=\"text\" class=\"form-control c_cfgKey ' + this.componentClass + '\"/></div>';\n\t\t\t\t$(html).insertAfter($valProcess);\n\t\t\t} else if (val == 'keyPath') {\n\t\t\t\tvar html = '<div class=\"form-group col-3 data-conf\"><label>'+J.msg['dataviewcfg.key']+':</label><input type=\"text\" class=\"form-control c_cfgKey ' + this.componentClass + '\"/></div>'\n\t\t\t\t\t+ '<div class=\"form-group col-3 data-conf\"><label>'+J.msg['dataviewcfg.path']+':</label><input type=\"text\" class=\"form-control c_cfgPath ' + this.componentClass + '\"/></div>'\n\t\t\t\t$(html).insertAfter($valProcess);\n\t\t\t} else if (val == 'self') {\n\t\t\t\tvar html = '<div class=\"form-group col-6 data-conf\"><label>'+J.msg['dataviewcfg.script']+':</label><textarea class=\"form-control c_cfgSelf ' + this.componentClass + '\"></textarea></div>';\n\t\t\t\t$(html).insertAfter($valProcess);\n\t\t\t}\n\t\t\tvar $cfgKey = $container.find(\".c_cfgKey.\" + this.componentClass);\n\t\t\tthis.data && this.data.cfgKey && $cfgKey.val(this.data.cfgKey);\n\t\t\tvar $cfgPath = $container.find(\".c_cfgPath.\" + this.componentClass);\n\t\t\tthis.data && this.data.cfgPath && $cfgPath.val(this.data.cfgPath);\n\t\t\tvar $cfgSelf = $container.find(\".c_cfgSelf.\" + this.componentClass);\n\t\t\tthis.data && this.data.cfgSelf && $cfgSelf.val(this.data.cfgSelf);\n\t\t}\n\t\tvar $valProcessSelect = $valProcess.children(\"select\");\n\t\trenderValue.call(this, $valProcessSelect.val());\n\t\t$valProcessSelect.change(function(){\n\t\t\trenderValue.call(_self, $(this).val());\n\t\t});\n\t\tthis.data && this.data.valProcess && $valProcessSelect.val(this.data.valProcess).change();\n\n\t\t$row = $(\"<div class='row'></div>\").appendTo($container);\n\t\tvar beforeRenderHtml = \n\t\t\t'<div class=\"form-group col\"><label>'+J.msg['dataviewcfg.beforeRender']+':</label>' +\n\t\t\t'<textarea class=\"form-control j-textarea-config c_beforeRender ' + this.componentClass + '\"></textarea></div>';\t\n\t\tvar $beforeRender = $(beforeRenderHtml).appendTo($row);\n\t\t$beforeRender.tooltip({title:J.msg['dataviewcfg.beforeRenderTooltip']});\n\t\tthis.data && this.data.beforeRender && $beforeRender.find(\".\" + this.componentClass).val(this.data.beforeRender);\n\t\tvar afterRenderHtml = \n\t\t\t'<div class=\"form-group col\"><label>'+J.msg['dataviewcfg.afterRender']+':</label>' +\n\t\t\t'<textarea class=\"form-control j-textarea-config c_afterRender ' + this.componentClass + '\"></textarea></div>';\t\n\t\tvar $afterRender = $(afterRenderHtml).appendTo($row);\n\t\t$afterRender.tooltip({title:J.msg['dataviewcfg.afterRenderTooltip']});\n\t\tthis.data && this.data.afterRender && $afterRender.find(\".\" + this.componentClass).val(this.data.afterRender);\n\n\t\tvar extHtml = \n\t\t\t'<div class=\"form-group col\"><label>'+J.msg['dataviewcfg.extConfig']+':</label>' +\n\t\t\t'<textarea class=\"form-control j-textarea-config c_ext ' + this.componentClass + '\"></textarea></div>';\t\n\t\tvar $ext = $(extHtml).appendTo($row);\n\t\t$ext.tooltip({title:J.msg['dataviewcfg.extConfigTooltip']});\n\t\tthis.data && this.data.ext && $ext.find(\".\" + this.componentClass).val(this.data.ext);\t\t\n\t}\n\n\tvar _commonConfigCollect = function(data) {\n\t\tvar ruleStr = this.$container.find(\".c_rule.\" + this.componentClass).val();\n\t\tvar rules = ruleStr?JSON.parse(ruleStr):null;\n\t\tvar data = {required:this.$container.find(\".c_require.\" + this.componentClass).val() == 'true',\n\t\t\t\tcfgType:this.$container.find(\".c_cfgType.\" + this.componentClass).val(),\n\t\t\t\tdefaultVal: this.$container.find(\".c_defaultVal.\" + this.componentClass).val(),\n\t\t\t\tvalProcess:this.$container.find(\".c_valProcess.\" + this.componentClass).val(),\n\t\t\t\tcfgKey:this.$container.find(\".c_cfgKey.\" + this.componentClass).val(),\n\t\t\t\tcfgPath:this.$container.find(\".c_cfgPath.\" + this.componentClass).val(),\n\t\t\t\tcfgSelf:this.$container.find(\".c_cfgSelf.\" + this.componentClass).val(),\n\t\t\t\tsource:this.$container.find(\".c_source.\" + this.componentClass).val(),\n\t\t\t\tmodify0:this.$container.find(\".c_modify0.\" + this.componentClass).val() == 'true',\n\t\t\t\tmodify:this.$container.find(\".c_modify.\" + this.componentClass).val() == 'true',\n\t\t\t\tdesc:this.$container.find(\".c_desc.\" + this.componentClass).val(),\n\t\t\t\tbeforeRender:this.$container.find(\".c_beforeRender.\" + this.componentClass).val(),\n\t\t\t\tafterRender:this.$container.find(\".c_afterRender.\" + this.componentClass).val(),\n\t\t\t\text:this.$container.find(\".c_ext.\" + this.componentClass).val(),\n\t\t\t\trule:rules};\n        data.cfgKey && (data.cfgKey=data.cfgKey.trim());\n        data.cfgPath && (data.cfgPath=data.cfgPath.trim());\n        if (data.ext) {\n            try {\n                eval(data.ext);\n            } catch (err) {\n                console.log(\"eval Exception, js:\" + data.ext);\n                console.dir(err);\n                throw err;\n            }\n        }\n\t\tvar newData = {};\n\t\tfor (var key in data) {\n\t\t\tif (data[key] !== null && data[key] !== undefined && data[key] !== '') {\n\t\t\t\tnewData[key] = data[key];\n\t\t\t}\n\t\t}\n\t\treturn newData;\n\t}\n\n\tJ.InputTextConfig = J.Components['inputTextConfig'] = function(cfg) {\n\t\tJ.BaseComponent.call(this, 'inputTextConfig', cfg);\n\t\tvar _self = this;\n\t\tthis.render = function($container) {\n\t\t\tthis.$container = $container;\n\t\t\t_commonAddConfigBody.call(this, $container);\n\t\t\t_commonConfigRender.call(_self,this.$bodyContainer);\n\t\t}\n\t\tthis.collect = function(data) {\n\t\t\tvar collectData = _commonConfigCollect.call(_self, data);\n\t\t\treturn collectData;\n\t\t}\n\t}\n\tJ.TextAreaConfig = J.Components['textareaConfig'] = function(cfg) {\n\t\tJ.BaseComponent.call(this, 'textareaConfig', cfg);\n\t\tvar _self = this;\n\t\tthis.render = function($container) {\n\t\t\tthis.$container = $container;\n\t\t\t_commonAddConfigBody.call(this, $container);\n\t\t\t_commonConfigRender.call(_self,this.$bodyContainer);\n\t\t}\n\t\tthis.collect = function(data) {\n\t\t\tvar collectData = _commonConfigCollect.call(_self, data);\n\t\t\treturn collectData;\n\t\t}\n\t}\n\tJ.SelfConfig = J.Components['selfConfig'] = function(cfg) {\n\t\tJ.BaseComponent.call(this, 'selfConfig', cfg);\n\t\tvar _self = this;\n\t\tthis.render = function($container) {\n\t\t\tthis.$container = $container;\n\t\t\t_commonAddConfigBody.call(this, $container);\n\t\t\tvar selfHtml = \n\t\t\t\t'<div class=\"form-group col\"><label>'+J.msg['dataviewcfg.selfScript']+':</label>' +\n\t\t\t\t'<textarea class=\"form-control selfScript ' + this.componentClass + '\"></textarea></div>';\t\n\t\t\t$(selfHtml).appendTo(this.$bodyContainer);\n\t\t\tvar $selfScript = this.$bodyContainer.find(\".\" + this.componentClass);\n\t\t\tthis.data && this.data.selfScript && $selfScript.val(this.data.selfScript);\n\t\t}\n\t\tthis.collect = function(data) {\n\t\t\tvar collectData = {selfScript:_self.$bodyContainer.find(\".selfScript.\" + this.componentClass).val()};\n\t\t\treturn collectData;\n\t\t}\n\t}\n\n\tJ.FixInputConfig = J.Components['fixInputConfig'] = function(cfg) {\n\t\tJ.BaseComponent.call(this, 'fixInputConfig', cfg);\n\t\tvar _self = this;\n\t\tthis.render = function($container) {\n\t\t\tthis.$container = $container;\n\t\t\t_commonAddConfigBody.call(this, $container);\n\t\t\t_commonConfigRender.call(_self,this.$bodyContainer);\n\t\t}\n\t\tthis.collect = function(data) {\n\t\t\tvar collectData = _commonConfigCollect.call(_self, data);\n\t\t\treturn collectData;\n\t\t}\n\t}\n\n\tJ.SelectConfig = J.Components['selectConfig'] = function(cfg) {\n\t\tJ.BaseComponent.call(this, 'selectConfig', cfg);\n\t\tvar _self = this;\n\t\tthis.render = function($container) {\n\t\t\tthis.$container = $container;\n\t\t\t_commonAddConfigBody.call(this, $container);\n\t\t\tvar selectHtml = \n                '<div class=\"row\">' +\n\t\t\t\t'<div class=\"form-group col-6\"><label>'+J.msg['dataviewcfg.selectTypeSelect']+':</label><select class=\"form-control c_selectType ' + this.componentClass + '\">' +\n\t            \t'<option value=\"single\" selected=\"selected\">'+J.msg['dataviewcfg.single']+'</option>' +\n\t                '<option value=\"multiple\">'+J.msg['dataviewcfg.multiple']+'</option>' +\n\t                '<option value=\"seqMultiple\">'+J.msg['dataviewcfg.seqMultiple']+'</option>' +\n\t            '</select></div>' +\n                '<div class=\"form-group col-6\"><label>'+J.msg['dataviewcfg.selectValType']+':</label><select class=\"form-control c_selectValType ' + this.componentClass + '\">' +\n                    '<option value=\"\" selected=\"selected\">'+J.msg['dataviewcfg.default']+'</option>' +\n                    '<option value=\"comma\">'+J.msg['dataviewcfg.commaSep']+'</option>' +\n                '</select></div>' +\n                '</div>'              \n                ;\n                var $selectInfo = $(selectHtml).appendTo(this.$bodyContainer);\n\n\t\t\tvar $selectType = $selectInfo.find(\"select.c_selectType\");\n\t\t\tthis.data && this.data.selectType && $selectType.val(this.data.selectType);\n\n            var $selectValType = $selectInfo.find(\"select.c_selectValType\");\n            this.data && this.data.selectValType && $selectValType.val(this.data.selectValType); \n            \n\t\t\t\tvar selectListConfig = {\n\t\t\t\t\tconfig : {\n\t\t\t\t\t\tinsertRemovePosition:\"Right\",\n\t\t\t\t\t\tcomponent : {\n\t\t\t\t\t\t\ttype : function(cfg) {\n\t\t\t\t\t\t\t\tJ.BaseComponent.call(this, 'selectOption', cfg);\n\t\t\t\t\t\t\t\tthis.render=function($container){\n\t\t\t\t\t\t\t\t\tvar listHtml = \n\t\t\t\t\t                    '<div class=\"row c_option ' + _self.componentClass + '\">' +\n\t\t\t                                '<div class=\"form-group col\">' +\n\t\t\t                                     '<label>'+J.msg['dataviewcfg.optionName']+':</label><input type=\"text\" class=\"form-control c_optionName\" value=\"' + (this.data&&this.data.name?this.data.name:\"\")+'\"/>' +\n\t\t\t                                '</div>' +\n\t\t\t                                '<div class=\"form-group col\">' +\n\t\t\t                                    '<label>'+J.msg['dataviewcfg.optionValue']+':</label><input type=\"text\" class=\"form-control c_optionValue\"/>' +\n\t\t\t                                '</div>' +\n\t\t\t                            '</div>';\n\t\t\t\t\t\t\t\t\t\tvar $listHtml = $(listHtml).appendTo($container);\n\t\t\t\t\t\t\t\t\t\t$listHtml.find(\".c_optionValue\").val(this.data&&this.data.value?this.data.value:\"\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tallConfig:cfg.allConfig, data:_self.data.selectList, allData:cfg.allData\n\t\t\t\t};\n\t\t\tvar selectList = new J.List(selectListConfig);\n\t\t\tvar $selectListCol = $(\"<div class='col'></div>\").appendTo(this.$bodyContainer);\n\t\t\tselectList.render($selectListCol);\n\t\t\t_commonConfigRender.call(_self, this.$bodyContainer);\n\t\t}\n\t\tthis.collect = function(data) {\n\t\t\tvar collectData = _commonConfigCollect.call(_self, data);\n\t\t\tcollectData.selectType = this.$container.find(\".c_selectType.\" + this.componentClass).val();\n\t\t\tcollectData.selectValType = this.$container.find(\".c_selectValType.\" + this.componentClass).val();\n\t\t\tvar $options = this.$container.find(\".c_option.\" + this.componentClass);\n\t\t\tvar options = [];\n\t\t\t$options.each(function(){\n\t\t\t\tvar optionName = $(this).find(\".c_optionName\").val();\n\t\t\t\tvar optionValue = $(this).find(\".c_optionValue\").val();\n\t\t\t\toptions.push({name:optionName, value:optionValue});\n\t\t\t});\n\t\t\tcollectData.selectList = options;\n\t\t\treturn collectData;\n\t\t}\n\t}\n\n\tJ.TableSelectConfig = J.Components['tableSelectConfig'] = function(cfg) {\n\t\tJ.BaseComponent.call(this, 'tableSelectConfig', cfg);\n\t\tvar _self = this;\n\t\tthis.render = function($container) {\n\t\t\tthis.$container = $container;\n\t\t\t_commonAddConfigBody.call(this, $container);\n\t\t\t_commonConfigRender.call(_self,this.$bodyContainer);\n\t\t}\n\t\tthis.collect = function(data) {\n\t\t\tvar collectData = _commonConfigCollect.call(_self, data);\n\t\t\treturn collectData;\n\t\t}\n\t}\n\n\tJ.ListSelectConfig = J.Components['listSelectConfig'] = function(cfg) {\n\t\tJ.BaseComponent.call(this, 'listSelectConfig', cfg);\n\t\tvar _self = this;\n\t\tthis.render = function($container) {\n\t\t\tthis.$container = $container;\n\t\t\t_commonAddConfigBody.call(this, $container);\n\t\t\t_commonConfigRender.call(_self,this.$bodyContainer);\n\t\t}\n\t\tthis.collect = function(data) {\n\t\t\tvar collectData = _commonConfigCollect.call(_self, data);\n\t\t\treturn collectData;\n\t\t}\n\t}\n\n\tJ.CardListConfig = J.Components['cardListConfig'] = function(cfg) {\n\t\tJ.BaseComponent.call(this, 'cardListConfig', cfg);\n\t\tvar _self = this;\n\t\tthis.render = function($container) {\n\t\t\tthis.$container = $container;\n\t\t\t_commonAddConfigBody.call(this, $container);\n\t\t\t_commonConfigRender.call(_self,this.$bodyContainer);\n\t\t\tvar cardConfig = {\n\t                \"component\": {\n\t                    \"type\": \"list\",\n\t                    \"addText\":J.msg['dataviewcfg.addConfigItem'],\n\t                    \"insertRemovePosition\":\"Right\",\n\t                    \"component\": {\n\t                        \"type\": \"elementConfig\"\n\t                    }\n\t                }\n\t\t\t};\n\t\t\tthis.elementCard = new J.CardConfig({config:cardConfig,allConfig:cardConfig,data:cfg.data&&cfg.data.component,allData:cfg.allData,ctx:cfg.ctx});\n\t\t\tvar $extRow = $('<div class=\"row j-element-ext\"></div>').insertAfter($container.parent());\n\t\t\tthis.elementCard.render($extRow);\n\t\t\tthis.elementCard.$cardConfig.addClass(\"col\");\n\t\t\t\n\t    }\n\t\t\n\t\tthis.collect = function(data) {\n\t\t\tvar collectData = _commonConfigCollect.call(_self, data);\n\t\t\tcollectData.addText=collectData.addText ||J.msg['dataviewcfg.add'];\n\t\t\tcollectData.insertRemovePosition= collectData.insertRemovePosition || \"Right\";\n\t\t\tvar elementCardData = this.elementCard.collect({});\n\t\t\tcollectData.component = elementCardData;\n\t\t\treturn collectData;\n\t\t}\t\n\t}\n\t\n    J.TableConfig = J.Components['tableConfig'] = function(cfg) {\n        J.BaseComponent.call(this, 'tableConfig', cfg);\n        var _self = this;\n        this.render = function($container) {\n            this.$container = $container;\n            _commonAddConfigBody.call(this, $container);\n            _commonConfigRender.call(_self,this.$bodyContainer);\n        }\n        this.collect = function(data) {\n            var collectData = _commonConfigCollect.call(_self, data);\n            return collectData;\n        }\n    }\n\t\n\tJ.ElementsCardConfig = J.Components['elementsCardConfig'] = function(cfg) {\n\t\tJ.BaseComponent.call(this, 'elementsCardConfig', cfg);\n\t\tvar _self = this;\t\t\n\t\tthis.render = function($container) {\n\t\t\tthis.$container = $container;\n\t\t\t_commonAddConfigBody.call(this, $container);\n\t\t\t_commonConfigRender.call(_self,this.$bodyContainer);\n\t\t\tthis.$bodyContainer.find(\".row\").hide();\n\t\t\tthis.$bodyContainer.find(\".row:last\").show();\n\t\t\tvar cardConfig = {\n\t\t            \"component\": {\n\t\t                \"type\": \"list\",\n\t\t                \"addText\":J.msg['dataviewcfg.addConfigItem'],\n\t\t                \"insertRemovePosition\":\"Right\",\n\t\t                \"component\": {\n\t\t                    \"type\": \"elementConfig\"\n\t\t                }\n\t\t            }\n\t\t\t};\n\t\t\tthis.elementCard = new J.CardConfig({config:cardConfig,allConfig:cardConfig,data:cfg.data&&cfg.data.component,allData:cfg.allData,ctx:cfg.ctx});\n\t\t\tvar $extRow = $('<div class=\"row j-element-ext\"></div>').insertAfter($container.parent());\n\t\t\tthis.elementCard.render($extRow);\n\t\t\tthis.elementCard.$cardConfig.addClass(\"col\");\n\t\t\t\n\t\t}\n\t\t\n\t\tthis.collect = function(data) {\n\t\t\tvar collectData = _commonConfigCollect.call(_self, data);\n\t\t\tvar elementCardData = this.elementCard.collect({});\n\t\t\tcollectData.component = elementCardData;\n\t\t\treturn collectData;\n\t\t}\t\t\t\n\t}\n\n   })(J);\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/dataview/dataview-demo.html",
    "content": "<!DOCTYPE html>\n<html lang=\"zh-CN\" xmlns:sec=\"http://www.jd.com\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"Pragma\" content=\"no-cache\">\n    <meta http-equiv=\"Cache-Control\" content=\"no-cache\">\n    <meta http-equiv=\"Expires\" content=\"0\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"/>\n    <link rel=\"icon\" href=\"../../../static/images/favicon.ico\" type=\"image/x-icon\">\n    <title>Form template demo</title>\n    <link rel=\"stylesheet\" href=\"../../../static/plugins/bootstrap4/css/bootstrap.css\">\n    <link rel=\"stylesheet\" href=\"../../../static/plugins/bootstrap-table/bootstrap-table.css\">\n    <link rel=\"stylesheet\" href=\"../../../static/plugins/bootstrap-multiselect/css/bootstrap-multiselect.css\">\n    <link rel=\"stylesheet\" href=\"../../../static/plugins/fontawesome/css/all.css\">\n    <link rel=\"stylesheet\" href=\"../../../static/css/common.css\">\n    <link rel=\"stylesheet\" href=\"../../../static/plugins/dataview/dataview.css\">\n    \n    \n</head>\n\n<body>\n<div>\n    <h3>Form template configure tool</h3>\n    <div class=\"alert alert-info\" role=\"alert\">\n    Usage: Define form in \"Form template definition\" tab, Preview in \"Form template preview\" tab\n    </div>\n</div>\n<nav>\n  <div class=\"nav nav-tabs\" id=\"nav-tab\" role=\"tablist\">\n    <a class=\"nav-link active\" id=\"nav-template-tab\" data-toggle=\"tab\" href=\"#nav-template\" role=\"tab\" >Form template definition</a>\n    <a class=\"nav-link\" id=\"nav-demo-tab\" data-toggle=\"tab\" href=\"#nav-demo\" role=\"tab\" aria-controls=\"nav-profile\" aria-selected=\"false\">Form template preview</a>\n  </div>\n</nav>\n<div class=\"tab-content\" id=\"nav-tabContent\">\n  <div class=\"tab-pane fade show active\" id=\"nav-template\" role=\"tabpanel\">\n\n    <div class=\"row d-none\">\n        <div class=\"form-group col\">\n            <label><span class=\"j-require\">*</span>Template config for developer:</label>\n            <textarea rows=\"10\" cols=\"\" name=\"config\" class=\"form-control\"></textarea>\n        </div>\n    </div>    \n    <div id=\"pageConfig\"></div>  \n    <div class=\"row mt-2\">\n        <div class=\"col text-center\">\n            <button type=\"submit\" class=\"btn btn-primary j-btn-view\">View JSON config</button>  \n        </div>  \n    </div>\n      \n  </div>\n  <div class=\"tab-pane fade\" id=\"nav-demo\" role=\"tabpanel\">\n  <div class=\"container-fluid\">\n    <div class=\"row\">\n        <div class=\"col\">\n\t        <h6 class=\"mt-1\">Input data to render(JSON format, optional):</h6>\n\t        <form id=\"demoDataForm\">\n\t          <textarea class=\"form-control\" id=\"demoData\" name=\"demoData\"></textarea>\n\t        </form>\n\t        <button class=\"btn btn-primary mt-1 mb-1\" id=\"viewAddDemo\" data-op=\"add\">Add preview</button>\n\t        <button class=\"btn btn-primary mt-1 mb-1\" id=\"viewModifyDemo\" data-op=\"modify\">Modify preview</button>\n\t        <button class=\"btn btn-primary mt-1 mb-1\" id=\"viewDetailDemo\" data-op=\"detail\">View preview</button>\n\t        <button class=\"btn btn-info mt-1 mb-1\" id=\"validateDemo\" data-op=\"detail\">Validate preview</button>\n        </div>\n    </div>\n    <div>\n        <div id=\"page\"></div>\n    </div>\n    </div>\n  </div>\n</div>\n\n<div class=\"modal\" tabindex=\"-1\" role=\"dialog\" id=\"modal\">\n  <div class=\"modal-dialog  modal-lg\" role=\"document\">\n    <div class=\"modal-content\">\n      <div class=\"modal-header\">\n        <h5 class=\"modal-title\">View configuration</h5>\n        <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\">\n          <span aria-hidden=\"true\">&times;</span>\n        </button>\n      </div>\n      <div class=\"modal-body\">\n        <textarea id='jsonData' class=\"form-control\" rows=\"30\"></textarea>\n      </div>\n      <div class=\"modal-footer\">\n        <button type=\"button\" class=\"btn btn-primary input-config\">JSON Render</button>\n        <button type=\"button\" class=\"btn btn-secondary\" data-dismiss=\"modal\">Close</button>\n      </div>\n    </div>\n  </div>\n</div>  \n\n<script src=\"../../../static/plugins/jquery/jquery-3.6.0.js\" type=\"text/javascript\"></script>\n<script src=\"../../../static/plugins/bootstrap4/js/bootstrap.bundle.js\" type=\"text/javascript\"></script>\n<script src=\"../../../static/plugins/bootstrap-fileinput/js/locales/zh.js\" type=\"text/javascript\"></script>\n<script src=\"../../../static/plugins/bootstrap-fileinput/themes/fas/theme.min.js\" type=\"text/javascript\"></script>\n<script src=\"../../../static/plugins/bootstrap-fileinput/themes/explorer-fas/theme.min.js\"\n        type=\"text/javascript\"></script>\n<script src=\"../../../static/plugins/bootstrap-table/bootstrap-table.js\" type=\"text/javascript\"></script>\n<script src=\"../../../static/plugins/bootstrap-multiselect/js/bootstrap-multiselect.js\" type=\"text/javascript\"></script>\n<script src=\"../../../static/plugins/bootstrap-table/bootstrap-table-locale-all.js\" type=\"text/javascript\"></script>\n<script src=\"../../../static/plugins/jquery-validation/jquery.validate.js\" type=\"text/javascript\"></script>\n<script src=\"../../../static/plugins/jquery-validation/messages_zh.js\" type=\"text/javascript\"></script>\n<script src=\"../../../static/plugins/jquery.form/jquery.form.js\" type=\"text/javascript\"></script>\n<script src=\"../../../static/js/messages_default.js\" type=\"text/javascript\"></script>\n<script src=\"../../../static/js/messages_zh.js\" type=\"text/javascript\"></script>\n<script src=\"../../../static/js/common.js\" type=\"text/javascript\"></script>\n<script src=\"../../../static/js/biz.js\" type=\"text/javascript\"></script>\n<script src=\"../../../static/plugins/dataview/dataview.js\" type=\"text/javascript\"></script>\n<script src=\"../../../static/plugins/dataview/dataview-config.js\" type=\"text/javascript\"></script>\n<script src=\"../../../static/plugins/dataview/dataview-app.js\" type=\"text/javascript\"></script>\n\n\n<script type=\"text/javascript\" id=\"script\">\nvar config = {\n        \"type\": \"pageConfig\",\n        \"component\":{\n          \"type\":\"tabsConfig\",\n          \"component\": {    \n            \"type\":\"list\",\n            \"addText\":\"Add tab\",\n            \"component\":{\n                \"type\":\"tabConfig\",\n                \"component\": {\n                    \"type\": \"list\",\n                    \"addText\":\"Add panel\",\n                    \"component\": {\n                        \"type\": \"panelConfig\",\n                        \"component\": {\n                            \"type\": \"list\",\n                            \"addText\":\"Add card\",\n                            \"component\": {\n                                \"type\": \"cardConfig\",\n                                \"component\": {\n                                    \"type\": \"list\",\n                                    \"addText\":\"Add item\",\n                                    \"insertRemovePosition\":\"Right\",\n                                    \"component\": {\n                                        \"type\": \"elementConfig\"\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n          }\n        } \n        };\n\n$(\"#demoDataForm\").validate({\n    rules : {\n        \"demoData\":{json:true}\n        \n}});\n\nvar pageConfig = new J.PageConfig({config:config, allConfig:config, data:{}, allData:{}});\npageConfig.render($(\"#pageConfig\"));\n\n$(\".j-btn-view\").click(function(){\n    var data = pageConfig.collect({});\n    $(\"#jsonData\").val(JSON.stringify(data, null, 2));\n    $('#modal').modal();\n});\n\n$(\".input-config\").click(function(){\n    $(\"#pageConfig\").empty();\n    var newData = JSON.parse($(\"#jsonData\").val());\n    pageConfig = new J.PageConfig({config:config, allConfig:config, data:newData, allData:newData});\n    pageConfig.render($(\"#pageConfig\"));\n    $('#modal').modal('hide');\n})\nvar page;\n$(\"#viewAddDemo,#viewModifyDemo,#viewDetailDemo\").click(function(){\n\tvar op = $(this).data(\"op\");\n\tvar dataStr = $(\"#demoData\").val();\n\tvar data = dataStr ? JSON.parse(dataStr) : {};\n    var templateConfig = pageConfig.collect({});\n    $(\"#page\").empty();\n\tpage = new J.Page({data:data, ctx:{\"op\":op}, init:false, templates:null, $container:$(\"#page\")});\n\tpage.loadAndRender(templateConfig);\n});\n$(\"#validateDemo\").click(function(){\n\tif (! page) {\n\t\talert(\"Render form please\");\n\t\treturn;\n\t}\n\tif (! page.$form.valid()) {\n\t\talert(\"Form validate fail\");\n\t}\n\t\n});\n</script>\n\n</body>\n</html>"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/dataview/dataview.css",
    "content": "textarea.j-textarea-config {\n\theight:30px\n}\n\n.j-element-config .form-group {\n\tmargin-bottom:1px;\n}\n.j-element-config .form-group .form-control {\n\tpadding:0.375rem 0.375rem\n}\n\nh5.card-title {\n\tfont-size: 1.1rem;\n}\n\n#pageConfig .j-form-horizontal .form-group {\n    display: flex;\n    align-items:flex-start;\n    flex-wrap:nowrap;\n}\n\n.j-card {\n\tmargin-bottom:1rem;\n}"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/dataview/dataview.js",
    "content": "(function (J) {\n\tJ.DataView={};\n\tJ.Components={};\n\n\tvar _createComponent = function(type, config) {\n\t\tif (typeof type == 'string') {\n\t\t\treturn new J.Components[type](config);\n\t\t\t} else {\n\t\t\treturn new type(config);\n\t\t}\n\t}\n\tJ.BaseComponent = function(type, cfg) {\n\t\tconsole.log('Init component' + type);\n\t\tthis.type = type;\n\t\tthis.cfg = cfg;\n\t\tthis.config = cfg.config;\n\t\tthis.allConfig = cfg.allConfig;\n\t\tthis.data = cfg.data;\n\t\tthis.allData = cfg.allData;\n\t\tthis.originData = cfg.originData;\n\t\tthis.ctx = cfg.ctx;\n\t\tthis.$container = cfg.$container;\n\t\tthis.component = null;\n\t\tthis.id = $.jSequence.next();\n\t\tthis.name='n_' + this.id;\n\t\t\n\t\tthis.componentClass = \"c_\" + this.id;\n\t\tif (cfg.config && cfg.config.component && this.createComponent !== false) {\n\t\t\tvar config = {config:cfg.config.component, allConfig:cfg.allConfig, data:this.componentData, allData:cfg.allData, ctx:cfg.ctx};\n\t\t\tthis.component = _createComponent.call(this, cfg.config.component.type, config);\n\t\t}\n\t\tthis.components = [];\n\t\tif (cfg.config && cfg.config.components) {\n\t\t\tfor (var i in cfg.config.components) {\n\t\t\t\tvar config = {config:cfg.config.components[i], allConfig:cfg.allConfig, data:this.componentsData && this.componentsData[i], allData:cfg.allData, ctx:cfg.ctx};\n\t\t\t\tvar type = cfg.config.components[i].type;\n\t\t\t\t    this.components[i] = _createComponent.call(this, type, config);\n\t\t\t\t}\n\t\t}\n\n\t\tthis.renderComponents = function($container) {\n\t\t\tfor (var i in this.components) {\n\t\t\t\tthis.components[i].render($container);\n\t\t\t}\n\t\t}\n\t\tthis.collect = function(data){\n\t\t\tconsole.log(\"collect \" + this.type)\n\t\t\t_beforeCollect.call(this, data);\n\t\t\tif (this.component) {\n\t\t\t\tthis.component.collect(data);\n\t\t\t}\n\t\t\tfor (var i in this.components) {\n\t\t\t\tthis.components[i].collect(data);\n\t\t\t}\n\t\t\t_afterCollect.call(this, data);\n\t\t\treturn data;\n\t\t}\n\t\t\n\t\tvar _beforeCollect = function(data) {\n\t\t\tvar beforeCollect = this.config.beforeCollect;\n\t\t\tif (beforeCollect) {\n                try {\n\t\t\t\teval(beforeCollect);\n                } catch (err) {\n                    console.log(\"eval exception, js:\" + beforeCollect);\n                    console.dir(err);\n                    throw err;\n                }\n\t\t\t}\n\t\t}\n\t\tvar _afterCollect = function(data) {\n\t\t\tvar afterCollect = this.config.afterCollect;\n\t\t\tif (afterCollect) {\n                try {\n\t\t\t\teval(afterCollect);\n                } catch (err) {\n                    console.log(\"eval Exception, js:\" + afterCollect);\n                    console.dir(err);\n                    throw err;\n                }\t\t\t\t\n\t\t\t}\n\t\t}\n\t}\n\n\tJ.List = J.Components['list'] = function(cfg) {\n\t\tthis.createComponent = false;\n\t\tJ.BaseComponent.call(this, 'list', cfg);\n\t\tthis.render = function($container) {\n\t\t\tconsole.log(\"Render list\");\n\t\t\tvar addText = this.config.addText ? this.config.addText:J.msg['dataview.add'];\n\t\t\tvar listHeadHtml = this.config.name ? '<div class=\"alert alert-secondary\">'+this.config.name +'</div>':'';\n\t\t\tvar html = '<div class=\"j-list\">' +\n\t\t\tlistHeadHtml +\n\t        '<div class=\"j-list-body\">' +\n\t        '</div>' +\n\t        '<div class=\"j-list-footer mt-1\">' +\n\t        '<div class=\"row\"><div class=\"col\"><button type=\"button\" class=\"btn btn-secondary btn-block add\">' + addText + '</button></div></div>' +\n\t        '</div>' +\n\t        '</div>';\n\t\t\tvar $list = this.$list = $(html).appendTo($container);\n\t\t    var insertRemovePosition = this.config.insertRemovePosition ? this.config.insertRemovePosition : 'Bottom';\n\t\t    var elHtml = null;\n\t\t    if (insertRemovePosition == 'Bottom') {\n\t\t    \telHtml = '<div class=\"j-list-el\">' +\n\t\t        '        <div class=\"j-list-el-body ' + this.componentClass + '\"></div>' +\n\t\t        '        <div class=\"j-list-el-footer\">' +\n\t\t        '            <div class=\"row\"><div class=\"col\"><button type=\"button\" class=\"btn btn-light btn-block insert\">+</button></div><div class=\"col\"><button type=\"button\" class=\"btn btn-light btn-block remove\">-</button></div></div>' +\n\t\t        '        </div>' +\n\t\t        '    </div>';\t\n\t\t    } else if (insertRemovePosition == 'Right'){\n\t\t    \telHtml = '<div class=\"j-list-el row\">' +\n\t\t        '        <div class=\"j-list-el-body col ' + this.componentClass + '\"></div>' +\n\t\t        '        <div class=\"j-list-el-footer col-1\">' +\n\t\t        '            <div class=\"row\"><div class=\"col\"><button type=\"button\" class=\"btn  btn-light btn-block insert\"><i class=\"fa fa-plus\"></i></button></div><div class=\"col\"><button type=\"button\" class=\"btn  btn-light btn-block remove\"><i class=\"fa fa-trash\"></i></button></div></div>' +\n\t\t        '        </div>' +\n\t\t        '    </div>';\n\t\t    } else {\n\t\t    \telHtml = '<div class=\"j-list-el row\">' +\n\t\t        '        <div class=\"j-list-el-body col ' + this.componentClass + '\"></div>' +\n\t\t        '    </div>';\t\t    \t\n\t\t    }\n\t\t\tvar renderEl = function($el, data){\n\t\t\t\tvar component = _createComponent.call(this, cfg.config.component.type, {config:cfg.config.component, allConfig:cfg.allConfig, data:data, allData:data, ctx:cfg.ctx});\n\t\t\t\tcomponent.render($el);\n\t\t\t\t$el.data('component', component);\n\t\t\t};\n\t\t\t\n\t\t\t$list.on(\"click\",\".remove\", function(){\n\t\t\t\tif (!$list.is($(this).parents(\".j-list\")[0])) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t$($(this).parents('.j-list-el')[0]).remove();\n\t\t\t})\n\t\t\t.on(\"click\",\".insert\", function(){\n\t\t\t\tif (!$list.is($(this).parents(\".j-list\")[0])) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t$el = $(elHtml).insertAfter($(this).parents('.j-list-el')[0]).find(\".j-list-el-body\");\n\t\t\t\trenderEl($el,{});\n\t\t\t})\n\t\t\t.on(\"click\", \".add\", function(){\n\t\t\t\tif (!$list.is($(this).parents(\".j-list\")[0])) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t$el = $(elHtml).appendTo($list.children(\".j-list-body\")).find(\".j-list-el-body\");\n\t\t\t\trenderEl($el,{});\n\t\t\t});\n\t\t\tif (this.data) {\n\t\t\t\tfor (var i in this.data) {\n\t\t\t\t\t$el = $(elHtml).appendTo($list.children(\".j-list-body\")).find(\".j-list-el-body\");\n\t\t\t\t\trenderEl($el, this.data[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t}\n\t\tthis.collect = function(data) {\n\t\t\tvar listData = [];\n\t\t\tthis.$list.find(\".\" + this.componentClass).each(function(i){\n\t\t\t\tvar component = $(this).data(\"component\");\n\t\t\t\tvar subData = {};\n\t\t\t\tvar subData = component.collect(subData);\n\t\t\t\tlistData.push(subData);\n\t\t\t});\n\t\t\tif (listData.length == 0) {\n\t\t\t\tlistData = null;\n\t\t\t}\n\t\t\treturn listData;\n\t\t}\n\t}\n\n\nJ.jsonTemplateConfig = {\n\t\t  \"type\": \"page\",\n\t\t  \"component\": {\n\t\t            \"type\": \"panel\",\n\t\t            \"name\": J.msg[\"dataview.dataInfo\"],\n\t\t            \"components\": [\n\t\t              {\n\t\t                \"type\": \"card\",\n\t\t                \"name\": \"\",\n\t\t                \"cols\": 1,\n\t\t                \"components\": [\n\t\t                  {\n\t\t                    \"required\": true,\n\t\t                    \"cfgType\": \"json\",\n\t\t                    \"valProcess\": \"self\",\n\t\t                    \"cfgSelf\": \"function _selfFunc(type){\\nif (type=='parse'){\\nreturn this.allData;\\n} else {\\nvar val = this.$element.val();\\nvar valObj = JSON.parse(val);\\nfor(var key in data){delete data[key]};\\nObject.assign(data, valObj);\\n}\\n};\\n_selfFunc\",\n\t\t                    \"source\": \"product\",\n\t\t                    \"modify0\": true,\n\t\t                    \"modify\": true,\n\t\t                    \"type\": \"textarea\",\n\t\t                    \"name\": J.msg[\"dataview.originalData\"],\n\t\t                    \"cols\": -1,\n\t\t                    \"newline\": false\n\t\t                  }\n\t\t                ]\n\t\t              }\n\t\t            ]\n\t\t  },\n\t\t  \"beforeRender\": \"\",\n\t\t  \"afterRender\": \"\"\n\t\t};\n\n   })(J);\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/flow/bpmn.js",
    "content": "(function(J) {\n    /**\n     * Context pad\n     */\n    class EasyFlowContextPad {\n        constructor(config, contextPad, create, elementFactory, injector, translate) {\n            this.create = create;\n            this.elementFactory = elementFactory;\n            this.translate = translate;\n\n            if (config.autoPlace !== false) {\n                this.autoPlace = injector.get('autoPlace', false);\n            }\n\n            contextPad.registerProvider(this);\n        }\n\n        getContextPadEntries(element) {\n            const {\n                autoPlace,\n                create,\n                elementFactory,\n                translate\n            } = this;\n\n            function appendScriptTask(event, element) {\n                if (autoPlace) {\n                    const shape = elementFactory.createShape({ type: 'bpmn:ScriptTask' });\n\n                    autoPlace.append(element, shape);\n                } else {\n                    appendScriptTaskStart(event, element);\n                }\n            }\n\n            function appendScriptTaskStart(event) {\n                const shape = elementFactory.createShape({ type: 'bpmn:ScriptTask' });\n\n                create.start(event, shape, element);\n            }\n\n            function appendIntermediateCatchEvent(event, element) {\n                if (autoPlace) {\n                    const shape = elementFactory.createShape({ type: 'bpmn:IntermediateCatchEvent', eventDefinitionType: 'bpmn:MessageEventDefinition' });\n\n                    autoPlace.append(element, shape);\n                } else {\n                    appendIntermediateCatchEventStart(event, element);\n                }\n            }\n\n            function appendIntermediateCatchEventStart(event) {\n                const shape = elementFactory.createShape({ type: 'bpmn:IntermediateCatchEvent' });\n                create.start(event, shape, element);\n            }\n\n            return function(entries) {\n                if (entries['append.append-task']) {\n                    entries['append.append-task'].action.click = appendScriptTask;\n                    entries['append.append-task'].action.dragstart = appendScriptTaskStart;\n                }\n                if (entries['append.intermediate-event']) {\n                    entries['append.intermediate-event'].action.click = appendIntermediateCatchEvent;\n                    entries['append.intermediate-event'].action.dragstart = appendIntermediateCatchEventStart;\n                }\n\n                return entries;\n            }\n        }\n    }\n\n    EasyFlowContextPad.$inject = [\n        'config',\n        'contextPad',\n        'create',\n        'elementFactory',\n        'injector',\n        'translate'\n    ];\n    class EasyFlowPalette {\n        constructor(create, elementFactory, palette, translate) {\n            this.create = create;\n            this.elementFactory = elementFactory;\n            this.translate = translate;\n\n            palette.registerProvider(this);\n        }\n\n        getPaletteEntries(element) {\n            const {\n                create,\n                elementFactory,\n                translate\n            } = this;\n\n            function createScriptTask(event) {\n                const shape = elementFactory.createShape({ type: 'bpmn:ScriptTask' });\n\n                create.start(event, shape);\n            }\n\n\n            return function(entries) {\n                var newEntries = {\n                    \"create.start-event\": entries['create.start-event'],\n                    'create.script-task': {\n                        group: 'activity',\n                        className: 'bpmn-icon-script-task',\n                        title: translate('Create ScriptTask'),\n                        action: {\n                            dragstart: createScriptTask,\n                            click: createScriptTask\n                        }\n                    },\n                    'create.exclusive-gateway': entries['create.exclusive-gateway'],\n                    \"create.data-store\": entries['create.data-store'],\n                    \"create.participant-expanded\": entries['create.participant-expanded'],\n                    'create.group': entries['create.group'],\n                    \"lasso-tool\": entries['lasso-tool'],\n                }\n\n                return newEntries;\n            }\n        }\n\n\n    }\n\n    EasyFlowPalette.$inject = [\n        'create',\n        'elementFactory',\n        'palette',\n        'translate'\n    ];\n\n    /**\n     * Dropdown option\n     */\n    function EasyFlowReplaceMenuProvider(\n        bpmnFactory, popupMenu, modeling, moddle,\n        bpmnReplace, rules, translate) {\n\n        this._bpmnFactory = bpmnFactory;\n        this._popupMenu = popupMenu;\n        this._modeling = modeling;\n        this._moddle = moddle;\n        this._bpmnReplace = bpmnReplace;\n        this._rules = rules;\n        this._translate = translate;\n\n        this.register = function() {\n            this._popupMenu.registerProvider('bpmn-replace', this);\n        }\n\n        this.getPopupMenuEntries = function(element) {\n            return function(entries) {\n                return entries;\n            }\n        }\n        this.getPopupMenuHeaderEntries = function(element) {\n            return function(entries) {\n                return entries;\n            }\n        };\n        this.register();\n    }\n\n    EasyFlowReplaceMenuProvider.$inject = [\n        'bpmnFactory',\n        'popupMenu',\n        'modeling',\n        'moddle',\n        'bpmnReplace',\n        'rules',\n        'translate'\n    ];\n\n    /**\n     * Self define module\n     */\n    var easyFlowModule = {\n        __init__: ['easyFlowContextPad', 'easyFlowPalette', 'easyFlowReplaceMenuProvider'],\n        easyFlowContextPad: ['type', EasyFlowContextPad],\n        easyFlowPalette: ['type', EasyFlowPalette],\n        easyFlowReplaceMenuProvider: ['type', EasyFlowReplaceMenuProvider],\n        translate: ['value', easyFlowTranslate],\n        \"config.zoomScroll\": ['value', { enabled: false }]\n    }\n\n    var easyFlowViewModule = {\n        translate: ['value', easyFlowTranslate],\n        \"config.zoomScroll\": ['value', { enabled: false }]\n    }\n\n    /**\n     * Create BPMN Control\n     */\n    J.BpmnControl = function(cfg) {\n        this.init = function(cfg) {\n            this.cfg = cfg;\n            this.data = cfg.data ? cfg.data : {};\n            this.$bpmnContainer = cfg.$bpmnContainer;\n            this.originData = JSON.parse(JSON.stringify(this.data));\n            return this;\n        }\n        this.render = async function($bpmnContainer) {\n            var _self = this;\n            if ($bpmnContainer) { this.$bpmnContainer = $bpmnContainer };\n            $bpmnContainer = this.$bpmnContainer;\n            $bpmnContainer.append(this._html());\n            // Render control\n            var config = {\n                container: $bpmnContainer.find(\".j-flow-canvas\"),\n                keyboar: {\n                    bindTo: window\n                },\n                moddleExtensions: {\n                    easyflow: easyflowExtension\n                },\n                additionalModules: cfg.mode == 'view' ? [easyFlowViewModule] : [easyFlowModule]\n            };\n            this.bpmnModeler = this.cfg.mode == 'view' ? new BpmnNavigatedViewer(config) : new BpmnModeler(config);\n            // shrink\n            this.$bpmnContainer.find(\".j-bpmn-zoomin\").click(function() {\n                const zoomScroll = _self.bpmnModeler.get('zoomScroll');\n                zoomScroll.stepZoom(-1);\n            });\n            // enlarge\n            this.$bpmnContainer.find(\".j-bpmn-zoomout\").click(function() {\n                const zoomScroll = _self.bpmnModeler.get('zoomScroll');\n                zoomScroll.stepZoom(1);\n            });\n            // svg download\n            this.$bpmnContainer.find(\".j-bpmn-svgdownload\").click(function() {\n                _self.downloadSvg();\n            });\n            // fullscreen\n            this.$bpmnContainer.find(\".j-bpmn-fullscreen\").click(function() {\n                _self.$bpmnContainer.find(\".j-bpmn-panel\").toggleClass(\"j-bpmn-panel-normal j-bpmn-panel-fullscreen\");\n                $(this).find(\"i\").toggleClass(\"fa-expand fa-compress\");\n            });\n            // import\n            this.$bpmnContainer.find(\".j-bpmn-import\").click(function() {\n                $(this).find(\"i\").toggleClass(\"fa-info\");\n                _self.import();\n            });\n            // export\n            this.$bpmnContainer.find(\".j-bpmn-export\").click(function() {\n                _self.export();\n            });\n            // comment\n            this.$bpmnContainer.find(\".j-bpmn-comment-select\").multiselect({nonSelectedText:J.msg[\"bpmn.detailInfoType\"]});\n            this.$bpmnContainer.find(\".j-bpmn-comment-select\").change(function() {\n                _self._commentAll();\n            });\n            // min panel\n            this.$bpmnContainer.find(\".j-bpmn-info-switch\").click(function() {\n                _self.$bpmnContainer.find(\".j-bpmn-info-title\").toggle();\n                _self.$bpmnContainer.find(\".infoPanel>form\").toggle();\n                _self.$bpmnContainer.find(\".infoPanel\").toggleClass(\"infoPanel-up\");\n            })\n            if (this.cfg.mode == 'view') {\n                _self.$bpmnContainer.find(\".j-bpmn-info-title\").toggle();\n                _self.$bpmnContainer.find(\".infoPanel>form\").toggle();\n                _self.$bpmnContainer.find(\".infoPanel\").toggleClass(\"infoPanel-up\");\n            }\n            // event bind\n            var eventBus = this.bpmnModeler.get('eventBus');\n\n            var $infoPanel = this.$bpmnContainer.find(\".infoPanel\");\n            var $form = $infoPanel.find('form');\n            $form.validate();\n            eventBus.on(\"element.click\", function(e) {\n                var elementType = e.element.businessObject.$type;\n                console.log('click on ' + e.element.id + \" type:\" + e.element.businessObject.$type);\n                $form.empty();\n                if (_self._elementPanelRender[elementType]) {\n                    _self._elementPanelRender[elementType].call(_self, $form, e.element);\n                }\n            });\n            eventBus.on(\"selection.changed\", function(e) {\n                var selectedElements = e.newSelection;\n                if (!selectedElements || selectedElements.length!=1) {\n                    $form.empty();\n                    return;\n                }\n                var element = selectedElements[0];\n                var elementType = element.businessObject.$type;\n                console.log('click on ' + element.id + \" type:\" + element.businessObject.$type);\n                $form.empty();\n                if (_self._elementPanelRender[elementType]) {\n                    _self._elementPanelRender[elementType].call(_self, $form, element);\n                }\n            });            \n            eventBus.on(\"element.changed\", function(e) {\n                console.log(\"change\");\n                _self._comment(e.element);\n            });\n            // BPMN Definition View Panel\n            this.$bpmnContainer.find(\".j-bpmn-view\").click(function() {\n                _self.exportDiagram().then(function(result) {\n                    var elementHtml = _self._bpmnViewHtml();\n                    var bpmnXml = result.xml;\n                    $.jDialog({\n                        title: J.msg['bpmn.bpmnFlowDefinition'],\n                        size: \"modal-lg\",\n                        element: elementHtml,\n                        action: function($dialog) {\n                            $dialog.find(\".bpmnDef\").val(bpmnXml);\n                            // bind button action\n                            _self._bindDialogButtonAction($dialog);\n                        }\n                    });\n                });\n            });            \n            // open flow definition\n            var diagram = this.data.bpmnXmlData ? this.data.bpmnXmlData : this.initialDiagram;\n            await this.openDiagram(diagram);\n        }\n        this.collect = async function() {\n            // JSON data has been set\n            this.data.bpmnXmlData = (await this.exportDiagram()).xml;\n            return this.data.bpmnXmlData;\n        }\n        this.init(cfg);\n        return this;\n    }\n\n    /**\n     * Bind dialog action\n     */\n    J.BpmnControl.prototype._bindDialogButtonAction = function($dialog) {\n        var _self = this;\n        // render button\n        $dialog.find(\".j-btn-bpmn-render\").click(function() {\n            var bpmnXml = $dialog.find(\".bpmnDef\").val();\n            _self.openDiagram(bpmnXml).then(function() {\n                $dialog.modal(\"hide\");\n            });\n        });\n        // view JSON button\n        $dialog.find(\".j-btn-bpmn-json\").click(function() {\n            var bpmnXml = $dialog.find(\".bpmnDef\").val();\n            var bpmn2JsonUrl = window.bpmn2JsonUrl ? window.bpmn2JsonUrl : ($.getBaseUrl() && $.getBaseUrl().indexOf(\"http\")==0 ? $.getBaseUrl() + \"/public/ajax/bpmn2Json\": null);\n            $.post(bpmn2JsonUrl, { bpmnXmlData: bpmnXml }, function(result) {\n                // error tip\n                if (result.resultMsg) {\n                    $.jMessage({ msg: result.resultMsg });\n                    return;\n                }\n                // JSON content show\n                var html =\n                    '<div class=\"row\">        ' +\n    '<div class=\"form-group col\"> ' +\n        '<label><span class=\"j-require\">*</span>' + J.msg['bpmn.flowJsonDefinition'] + ':</label>' +\n        '<textarea class=\"jsonDef form-control\" rows=\"30\" readonly=\"readonly\"></textarea>' +\n    '</div>' +\n'</div>';\n                $.jDialog({\n                    \"title\": J.msg[\"bpmn.jsonContent\"], element: html, action: function($dialog) {\n                        $dialog.find(\"textarea\").val(result.resultData);\n                    }\n                })\n            }, \"json\").fail(function(){$.jMessage({ msg: J.msg['bpmn.convertErrorTip'] + bpmn2JsonUrl });});\n        });\n        // BPMN Compare\n        $dialog.find(\".j-btn-compare-bpmn\").click(function() {\n            var newVal = $dialog.find(\".bpmnDef\").val();\n            var oldVal = _self.originData.bpmnXmlData;\n            $.jDiffDialog({ left: { title: J.msg['bpmn.newFlowDefinition'], content: newVal }, right: { title: J.msg['bpmn.oldFlowDefinition'], content: oldVal } });\n        });\n        // EasyFlow Compare\n        $dialog.find(\".j-btn-compare-easyflow\").click(function() {\n            var oldVal = _self.originData.jsonData;\n            var bpmnXml = $dialog.find(\".bpmnDef\").val();\n            var bpmn2JsonUrl = window.bpmn2JsonUrl ? window.bpmn2JsonUrl : $.getBaseUrl() + \"/public/ajax/bpmn2Json\";\n            $.post(bpmn2JsonUrl, { bpmnXmlData: bpmnXml }, function(result) {\n                // Error tip\n                if (result.resultMsg) {\n                    $.jMessage({ msg: result.resultMsg });\n                    return;\n                }\n                $.jDiffDialog({ left: { title: J.msg['bpmn.newFlowDefinition'], content: result.resultData }, right: { title: J.msg['bpmn.oldFlowDefinition'], content: oldVal } });\n            });\n        });\n    }\n\n    /**\n     *Open BPMN\n      */\n    J.BpmnControl.prototype.openDiagram = async function(bpmnXML) {\n        // import diagram\n        var bpmnModeler = this.bpmnModeler;\n        await bpmnModeler.importXML(bpmnXML);\n        // access modeler components\n        var canvas = bpmnModeler.get('canvas');\n        var overlays = bpmnModeler.get('overlays');\n        // zoom to fit full viewport\n        canvas.zoom('fit-viewport');\n        this._initPropertiesPanel();\n        this._commentAll();\n        var processElements = _findProcessElement(bpmnModeler);\n        var callback = this.cfg.openDiagramCallBack;\n        callback && callback.call(this, processElements);\n    }\n\n    /**\n     * Export BPMN\n     */\n    J.BpmnControl.prototype.exportDiagram = async function() {\n        var result = await this.bpmnModeler.saveXML({\n            format: true\n        });\n        console.log('DIAGRAM', result.xml);\n        return result;\n    }\n\n    /**\n     * Download SVG\n     */\n    J.BpmnControl.prototype.downloadSvg = async function() {\n        var _self = this;\n        this.bpmnModeler.saveSVG({ format: true }).then(function(obj) {\n            var svg = obj.svg;\n            var encodedData = encodeURIComponent(svg);\n            var processId = _findProcessElement(_self.bpmnModeler)[0].businessObject.id;\n            var fileName = processId + \"-\" + J.getNowDatetime(\"\", \"-\", \"\") + '.svg';\n            var downloadLink = document.createElement('a');\n            downloadLink.download = fileName;\n            downloadLink.innerHTML = 'Get BPMN SVG';\n            downloadLink.href = 'data:application/bpmn20-xml;charset=UTF-8,' + encodedData;\n            downloadLink.onclick = function(event) {\n                document.body.removeChild(event.target);\n            };\n            downloadLink.style.visibility = 'hidden';\n            document.body.appendChild(downloadLink);\n            downloadLink.click();\n        });\n    }\n\n    /**\n    * Import\n    */\n    J.BpmnControl.prototype.import = function() {\n        var _self = this;\n        $(`<input type=\"file\" value=\"SelectFile\"></input>`)\n            .click()\n            .on('change', event => {\n                let file = event.target.files[0];\n                let file_reader = new FileReader();\n                file_reader.onload = () => {\n                    let fc = file_reader.result;\n                    _self.openDiagram(fc);\n                };\n                file_reader.readAsText(file, 'UTF-8');\n            });\n    }\n\n    /**\n     * Export\n     */\n    J.BpmnControl.prototype.export = async function() {\n        var _self = this;\n        this.bpmnModeler.saveXML({ format: true }).then(function(obj) {\n            var xml = obj.xml;\n            var encodedData = encodeURIComponent(xml);\n            var processId = _findProcessElement(_self.bpmnModeler)[0].businessObject.id;\n            var fileName = processId + \"-\" + J.getNowDatetime(\"\", \"-\", \"\") + '.bpmn';\n            var downloadLink = document.createElement('a');\n            downloadLink.download = fileName;\n            downloadLink.innerHTML = 'Get BPMN XML';\n            downloadLink.href = 'data:application/bpmn20-xml;charset=UTF-8,' + encodedData;\n            downloadLink.onclick = function(event) {\n                document.body.removeChild(event.target);\n            };\n            downloadLink.style.visibility = 'hidden';\n            document.body.appendChild(downloadLink);\n            downloadLink.click();\n        });\n    }\n    /**\n    *Init info panel\n    */\n    J.BpmnControl.prototype._initPropertiesPanel = function() {\n        // Show flow definition panel\n        var processElements = _findProcessElement(this.bpmnModeler);\n        if (processElements.length != 1) {\n            var $infoPanel = this.$bpmnContainer.find(\".infoPanel\");\n            var $form = $infoPanel.find('form');\n             $form.empty();\n            return;\n        }\n        this._elementPanelRender['bpmn:Process'].call(this, this.$bpmnContainer.find(\".infoPanel\").find(\"form\"), processElements[0]);\n    }\n\n    J.BpmnControl.prototype._elementPanelRender = {};\n    /**\n     * Basic element render\n     */\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:Element\"] = function($infoPanel, element, hasProperties) {\n        this.$bpmnContainer.find(\".infoPanel\").find(\"form\").empty();\n        const moddle = this.bpmnModeler.get('moddle');\n        var bo = element.businessObject;\n        var eventBus = this.bpmnModeler.get('eventBus');\n        var _self = this;\n        // ID\n        var elementId = bo.id;\n        var elementIdHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><span class=\"j-require\">*</span><label>ID:</label> <input type=\"text\" class=\"form-control j-elementId\" name=\"j-elementId\" value=\"' + elementId + '\"/></div>'\n            + '</div>';\n        var $elementIdElement = $(elementIdHtml).appendTo($infoPanel);\n        var $elementId = $elementIdElement.find(\".j-elementId\");\n        $elementId.tooltip({ title: J.msg['bpmn.idTooltip'] });\n        $elementId.rules('add', { required: true });\n        $elementId.blur(function() {\n            var newElementId = $elementId.val();\n            if (!newElementId) {\n                alert(J.msg['bpmn.idEmptyError']);\n                $elementId.val(elementId);\n                return;\n            }\n            if (newElementId == elementId) {\n                return;\n            }\n            var elementRegistry = _self.bpmnModeler.get('elementRegistry');\n            var exists = elementRegistry.find(function(element){\n                return element.businessObject.id==newElementId;\n            });\n            if (exists) {\n                alert(J.msg['bpmn.idExistsError']);\n                $elementId.val(elementId);\n                return; \n            }\n            \n            \n            bo.id = newElementId;\n            _self.cfg.onBpmnDefinitionChange && _self.cfg.onBpmnDefinitionChange.call(_self, bo, \"id\", newElementId, elementId);\n            _self._comment(element);\n\t\t\telementId = newElementId;\n        });\n        // Name\n        var elementName = bo.name;\n        var elementNameHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.name'] + ':</label> <input type=\"text\" class=\"form-control j-elementName\" name=\"j-elementName\" value=\"' + (elementName ? elementName : '') + '\"/></div>'\n            + '</div>';\n        var $elementNameElement = $(elementNameHtml).appendTo($infoPanel);\n        var $elementName = $elementNameElement.find(\".j-elementName\");\n        $elementName.tooltip({ title: J.msg['bpmn.nameTooltip'] })\n        $elementName.blur(function() {\n            var newElementName = $elementName.val();\n            bo.name = newElementName;\n            _self.cfg.onBpmnDefinitionChange && _self.cfg.onBpmnDefinitionChange.call(_self, bo, \"name\", newElementName, elementName);\n            eventBus.fire(\"element.changed\", { element: element });\n        });\n        // Documentation\n        var documentation = bo.documentation ? bo.documentation[0].text : '';\n        var documentationHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.documentation'] + ':</label> <textarea class=\"form-control j-documentation\" name=\"j-documentation\"></textarea></div>'\n            + '</div>';\n        var $documentationElement = $(documentationHtml).appendTo($infoPanel);\n        var $documentation = $documentationElement.find(\".j-documentation\");\n        $documentation.tooltip({ title: J.msg['bpmn.documentationTooltip'] })\n        $documentation.text(documentation);\n        $documentation.blur(function() {\n            var newDocumentation = $documentation.val();\n            if (!newDocumentation) {\n                delete bo.documentation;\n            } else {\n                if (!bo.documentation) {\n                    bo.documentation = [moddle.create('bpmn:Documentation')];\n                }\n                bo.documentation[0].text = newDocumentation;\n            }\n        });\n        \n        // Property\n        if (hasProperties === false) {\n            return;\n        }\n        var properties = getExtensionBody(bo, \"easyflow:Properties\");\n        var propertiesHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.property'] + '(<button type=\"button\" class=\"j-properties-mode btn btn-link p-0\">' + J.msg['bpmn.switchJsonMode'] + '</button>):</label> <textarea class=\"form-control j-properties\" name=\"j-properties\"></textarea></div>'\n            + '</div>';\n        var $propertiesElement = $(propertiesHtml).appendTo($infoPanel);\n        var $properties = $propertiesElement.find(\".j-properties\");\n        $properties.tooltip({ title: J.msg['bpmn.propertyTooltip'] });\n        $properties.rules('add', { json: true });\n        $properties.text(properties);\n        $properties.blur(function() {\n            var newProperties = $properties.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:Properties\", newProperties);\n            _self._comment(element);\n        });\n        \n        $properties.jJsonPropertyEditor({mode:\"ROW\"});\n        var $propertiesMode = $propertiesElement.find(\".j-properties-mode\");\n        $propertiesMode.click(function(){\n            if (!$(this).data('j-properties-mode') || $(this).data('j-properties-mode')=='ROW') {\n                $(this).text(J.msg['bpmn.switchRowMode']);\n                $properties.jJsonPropertyEditor(\"changeMode\", \"JSON\");\n                $(this).data('j-properties-mode', \"JSON\");\n            } else {\n                $(this).text(J.msg['bpmn.switchJsonMode']);\n                $properties.jJsonPropertyEditor(\"changeMode\", \"ROW\");     \n                $(this).data('j-properties-mode', \"ROW\");           \n            }\n        });\n\n    }\n\n    /**\n     * Condition type\n     */\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:ExtConditionType\"] = function($infoPanel, element) {\n        const moddle = this.bpmnModeler.get('moddle');\n        var bo = element.businessObject;\n        var eventBus = this.bpmnModeler.get('eventBus');\n        var _self = this;\n        // Property\n        var conditionType = getExtensionBody(bo, \"easyflow:ConditionType\");\n        var conditionTypeHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg[\"bpmn.conditionType\"] + ':</label> ' +\n            '<select class=\"form-control j-bpmn-conditionType\" name=\"j-conditionType\">' +\n                '<option value=\"\">' + J.msg['bpmn.conditionType.inclusive'] + '</option>' +\n                '<option value=\"exclusive\">' + J.msg['bpmn.conditionType.exclusive'] + '</option>' +\n            '</select>' +\n            '</div>' +\n           '</div>';\n        var $conditionTypeElement = $(conditionTypeHtml).appendTo($infoPanel);\n        var $conditionType = $conditionTypeElement.find(\".j-bpmn-conditionType\");\n        $conditionType.tooltip({ title: J.msg['bpmn.conditionTypeTooltip'] });\n        $conditionType.val(conditionType);\n        $conditionType.blur(function() {\n            var newConditionType = $conditionType.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:ConditionType\", newConditionType);\n            _self._comment(element);\n        });\n\n    }\n    \n     /**\n     * Start node\n     */\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:NodeStart\"] = function($infoPanel, element) {\n        const moddle = this.bpmnModeler.get('moddle');\n        var bo = element.businessObject;\n        var eventBus = this.bpmnModeler.get('eventBus');\n        var _self = this;\n        // Property\n        var start = getExtensionBody(bo, \"easyflow:Start\");\n        var startHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.startNode'] + ':</label> ' +\n            '<select class=\"form-control j-bpmn-start\" name=\"j-start\">' +\n                '<option value=\"\">' + J.msg['bpmn.startNode.false'] + '</option>' +\n                '<option value=\"true\">' + J.msg['bpmn.startNode.true'] + '</option>' +\n            '</select>' +\n            '</div>' +\n           '</div>';\n        var $startElement = $(startHtml).appendTo($infoPanel);\n        var $start = $startElement.find(\".j-bpmn-start\");\n        $start.tooltip({ title: J.msg['bpmn.startNodeTooltip'] });\n        $start.val(start);\n        $start.blur(function() {\n            var newStart = $start.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:Start\", newStart);\n            _self._comment(element);\n        });\n\n    }\n    \n    /**\n     * Pre\n     */\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:NodePre\"] = function($infoPanel, element) {\n        const moddle = this.bpmnModeler.get('moddle');\n        var bo = element.businessObject;\n        var eventBus = this.bpmnModeler.get('eventBus');\n        var _self = this;\n        // Property\n        var pre = getExtensionBody(bo, \"easyflow:Pre\");\n        var preHtml = '<div class=\"row\"><div class=\"form-group col\"><label>' + J.msg['bpmn.selfPre'] + ':</label> <textarea class=\"form-control j-bpmn-pre\" name=\"j-bpmn-pre\"></textarea></div></div>';\n        var $preElement = $(preHtml).appendTo($infoPanel);\n        var $pre = $preElement.find(\".j-bpmn-pre\");\n        $pre.tooltip({ title: J.msg['bpmn.selfPreTooltip'] });\n        $pre.val(pre);\n        $pre.blur(function() {\n            var newPre = $pre.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:Pre\", newPre);\n            _self._comment(element);\n        });\n\n    }\n    \n    /**\n     * Action\n     */\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:NodeAction\"] = function($infoPanel, element) {\n        const moddle = this.bpmnModeler.get('moddle');\n        var bo = element.businessObject;\n        var eventBus = this.bpmnModeler.get('eventBus');\n        var _self = this;\n        // Property\n        var action = getExtensionBody(bo, \"easyflow:Action\");\n        var actionHtml = '<div class=\"row\"><div class=\"form-group col\"><label>' + J.msg['bpmn.selfAction'] + ':</label> <textarea class=\"form-control j-bpmn-action\" name=\"j-bpmn-action\"></textarea></div></div>';\n        var $actionElement = $(actionHtml).appendTo($infoPanel);\n        var $action = $actionElement.find(\".j-bpmn-action\");\n        $action.tooltip({ title: J.msg['bpmn.selfActionTooltip'] });\n        $action.val(action);\n        $action.blur(function() {\n            var newAction = $action.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:Action\", newAction);\n            _self._comment(element);\n        });\n\n    }\n    \n    /**\n     * Post\n     */\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:NodePost\"] = function($infoPanel, element) {\n        const moddle = this.bpmnModeler.get('moddle');\n        var bo = element.businessObject;\n        var eventBus = this.bpmnModeler.get('eventBus');\n        var _self = this;\n        // Property\n        var post = getExtensionBody(bo, \"easyflow:Post\");\n        var postHtml = '<div class=\"row\"><div class=\"form-group col\"><label>' + J.msg['bpmn.selfPost'] + ':</label> <textarea class=\"form-control j-bpmn-post\" name=\"j-bpmn-post\"></textarea></div></div>';\n        var $postElement = $(postHtml).appendTo($infoPanel);\n        var $post = $postElement.find(\".j-bpmn-post\");\n        $post.tooltip({ title: J.msg['bpmn.selfPostTooltip'] });\n        $post.val(post);\n        $post.blur(function() {\n            var newPost = $post.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:Post\", newPost);\n            _self._comment(element);\n        });\n\n    }\n\n    // Collaboration\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:Collaboration\"] = function($infoPanel, element) {\n        var participants = element.businessObject.participants;\n        if (participants && participants.length == 1) {\n          var processBusinessObject= participants[0].processRef;\n          if (! processBusinessObject) {\n              return;\n          }\n          var processElement = {};\n          processElement.businessObject = processBusinessObject;\n          this._elementPanelRender[\"bpmn:Process\"].call(this, $infoPanel, processElement);\n        }\n    }\n    \n    // Participant\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:Participant\"] = function($infoPanel, element) {\n        var processBusinessObject = element.businessObject.processRef;\n        if (! processBusinessObject) {\n            return;\n        }\n        var processElement = {};\n        processElement.businessObject = processBusinessObject;\n        this._elementPanelRender[\"bpmn:Process\"].call(this, $infoPanel, processElement);\n    }\n\n    // Lane\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:Lane\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Participant\"].call(this, $infoPanel, element.parent);\n    }    \n\n    // Flow\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:Process\"] = function($infoPanel, element) {\n        var _self = this;\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        var bo = element.businessObject;\n        var eventBus = this.bpmnModeler.get('eventBus');\n        // Flow pre handler\n        var flowPreHandler = getExtensionBody(bo, \"easyflow:Pre\");\n        var flowPreHandlerHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.flowPreHandler'] + ':</label> <textarea class=\"form-control j-bpmn-flowprehandler\" name=\"j-bpmn-flowprehandler\"></textarea></div>'\n            + '</div>';\n        var $flowPreHandlerElement = $(flowPreHandlerHtml).appendTo($infoPanel);\n        var $flowPreHandler = $flowPreHandlerElement.find(\".j-bpmn-flowprehandler\");\n        $flowPreHandler.tooltip({ title: J.msg['bpmn.flowPreHandlerTooltip'] })\n        $flowPreHandler.rules('add', { json: true });\n        $flowPreHandler.text(flowPreHandler);\n        $flowPreHandler.blur(function() {\n            var newFlowPreHandler = $flowPreHandler.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:Pre\", newFlowPreHandler);\n        });\n        // Flow post handler\n        var flowPostHandler = getExtensionBody(bo, \"easyflow:Post\");\n        var flowPostHandlerHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.flowPostHandler'] + ':</label> <textarea class=\"form-control j-bpmn-flowposthandler\" name=\"j-bpmn-flowposthandler\"></textarea></div>'\n            + '</div>';\n        var $flowPostHandlerElement = $(flowPostHandlerHtml).appendTo($infoPanel);\n        var $flowPostHandler = $flowPostHandlerElement.find(\".j-bpmn-flowposthandler\");\n        $flowPostHandler.tooltip({ title: J.msg['bpmn.flowPostHandlerTooltip'] })\n        $flowPostHandler.rules('add', { json: true });\n        $flowPostHandler.text(flowPostHandler);\n        $flowPostHandler.blur(function() {\n            var newFlowPostHandler = $flowPostHandler.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:Post\", newFlowPostHandler);\n        });        \n        \n        // Listener\n        var listeners = getExtensionBody(bo, \"easyflow:Listeners\");\n        var listenersHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.listeners'] + ':</label> <textarea class=\"form-control j-listeners\" name=\"j-listeners\"></textarea></div>'\n            + '</div>';\n        var $listenersElement = $(listenersHtml).appendTo($infoPanel);\n        var $listeners = $listenersElement.find(\".j-listeners\");\n        $listeners.tooltip({ title: J.msg['bpmn.listenersTooltip'] })\n        $listeners.rules('add', { json: true });\n        $listeners.text(listeners);\n        $listeners.blur(function() {\n            var newListeners = $listeners.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:Listeners\", newListeners);\n        });\n        // Filter\n        var filters = getExtensionBody(bo, \"easyflow:Filters\");\n        var filtersHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.filters'] + ':</label> <textarea class=\"form-control j-filters\" name=\"j-filters\"></textarea></div>'\n            + '</div>';\n        var $filtersElement = $(filtersHtml).appendTo($infoPanel);\n        var $filters = $filtersElement.find(\".j-filters\");\n        $filters.tooltip({ title: J.msg['bpmn.filtersTooltip'] });\n        $filters.rules('add', { json: true });\n        $filters.text(filters);\n        $filters.blur(function() {\n            var newFilters = $filters.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:Filters\", newFilters);\n        });\n        // Node filter\n        var nodeFilters = getExtensionBody(bo, \"easyflow:NodeFilters\");\n        var nodeFiltersHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.nodeFilters'] + ':</label> <textarea class=\"form-control j-nodefilters\" name=\"j-nodefilters\"></textarea></div>'\n            + '</div>';\n        var $nodeFiltersElement = $(nodeFiltersHtml).appendTo($infoPanel);\n        var $nodeFilters = $nodeFiltersElement.find(\".j-nodefilters\");\n        $nodeFilters.tooltip({ title: J.msg['bpmn.nodeFiltersTooltip'] });\n        $nodeFilters.rules('add', { json: true });\n        $nodeFilters.text(nodeFilters);\n        $nodeFilters.blur(function() {\n            var newNodeFilters = $nodeFilters.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:NodeFilters\", newNodeFilters);\n        });\n        // Node pre handler filter\n        var nodePreHandlerFilters = getExtensionBody(bo, \"easyflow:NodePreHandlerFilters\");\n        var nodePreHandlerFiltersHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.nodePreHandlerFilters'] + ':</label> <textarea class=\"form-control j-nodeprehandlerfilters\" name=\"j-nodeprehandlerfilters\"></textarea></div>'\n            + '</div>';\n        var $nodePreHandlerFiltersElement = $(nodePreHandlerFiltersHtml).appendTo($infoPanel);\n        var $nodePreHandlerFilters = $nodePreHandlerFiltersElement.find(\".j-nodeprehandlerfilters\");\n        $nodePreHandlerFilters.tooltip({ title: J.msg['bpmn.nodePreHandlerFiltersTooltip'] })\n        $nodePreHandlerFilters.rules('add', { json: true });\n        $nodePreHandlerFilters.text(nodePreHandlerFilters);\n        $nodePreHandlerFilters.blur(function() {\n            var newNodePreHandlerFilters = $nodePreHandlerFilters.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:NodePreHandlerFilters\", newNodePreHandlerFilters);\n        });        \n        // Node action filter\n        var nodeActionFilters = getExtensionBody(bo, \"easyflow:NodeActionFilters\");\n        var nodeActionFiltersHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.nodeActionFilters'] + ':</label> <textarea class=\"form-control j-nodeactionfilters\" name=\"j-nodeactionfilters\"></textarea></div>'\n            + '</div>';\n        var $nodeActionFiltersElement = $(nodeActionFiltersHtml).appendTo($infoPanel);\n        var $nodeActionFilters = $nodeActionFiltersElement.find(\".j-nodeactionfilters\");\n        $nodeActionFilters.tooltip({ title: J.msg['bpmn.nodeActionFiltersTooltip'] })\n        $nodeActionFilters.rules('add', { json: true });\n        $nodeActionFilters.text(nodeActionFilters);\n        $nodeActionFilters.blur(function() {\n            var newNodeActionFilters = $nodeActionFilters.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:NodeActionFilters\", newNodeActionFilters);\n        });\n        // Node post handler filter\n        var nodePostHandlerFilters = getExtensionBody(bo, \"easyflow:NodePostHandlerFilters\");\n        var nodePostHandlerFiltersHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.nodePostHandlerFilters'] + ':</label> <textarea class=\"form-control j-nodeposthandlerfilters\" name=\"j-nodeposthandlerfilters\"></textarea></div>'\n            + '</div>';\n        var $nodePostHandlerFiltersElement = $(nodePostHandlerFiltersHtml).appendTo($infoPanel);\n        var $nodePostHandlerFilters = $nodePostHandlerFiltersElement.find(\".j-nodeposthandlerfilters\");\n        $nodePostHandlerFilters.tooltip({ title: J.msg['bpmn.nodePostHandlerFiltersTooltip'] })\n        $nodePostHandlerFilters.rules('add', { json: true });\n        $nodePostHandlerFilters.text(nodePostHandlerFilters);\n        $nodePostHandlerFilters.blur(function() {\n            var newNodePostHandlerFilters = $nodePostHandlerFilters.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:NodePostHandlerFilters\", newNodePostHandlerFilters);\n        });  \n        // Flow pre handler filter\n        var flowPreHandlerFilters = getExtensionBody(bo, \"easyflow:FlowPreHandlerFilters\");\n        var flowPreHandlerFiltersHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.flowPreHandlerFilters'] + ':</label> <textarea class=\"form-control j-flowprehandlerfilters\" name=\"j-flowprehandlerfilters\"></textarea></div>'\n            + '</div>';\n        var $flowPreHandlerFiltersElement = $(flowPreHandlerFiltersHtml).appendTo($infoPanel);\n        var $flowPreHandlerFilters = $flowPreHandlerFiltersElement.find(\".j-flowprehandlerfilters\");\n        $flowPreHandlerFilters.tooltip({ title: J.msg['bpmn.flowPreHandlerFiltersTooltip'] })\n        $flowPreHandlerFilters.rules('add', { json: true });\n        $flowPreHandlerFilters.text(flowPreHandlerFilters);\n        $flowPreHandlerFilters.blur(function() {\n            var newFlowPreHandlerFilters = $flowPreHandlerFilters.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:FlowPreHandlerFilters\", newFlowPreHandlerFilters);\n        }); \n        // Flow post handler filter\n        var flowPostHandlerFilters = getExtensionBody(bo, \"easyflow:FlowPostHandlerFilters\");\n        var flowPostHandlerFiltersHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.flowPostHandlerFilters'] + ':</label> <textarea class=\"form-control j-flowposthandlerfilters\" name=\"j-flowposthandlerfilters\"></textarea></div>'\n            + '</div>';\n        var $flowPostHandlerFiltersElement = $(flowPostHandlerFiltersHtml).appendTo($infoPanel);\n        var $flowPostHandlerFilters = $flowPostHandlerFiltersElement.find(\".j-flowposthandlerfilters\");\n        $flowPostHandlerFilters.tooltip({ title: J.msg['bpmn.flowPostHandlerFiltersTooltip'] })\n        $flowPostHandlerFilters.rules('add', { json: true });\n        $flowPostHandlerFilters.text(flowPostHandlerFilters);\n        $flowPostHandlerFilters.blur(function() {\n            var newFlowPostHandlerFilters = $flowPostHandlerFilters.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:FlowPostHandlerFilters\", newFlowPostHandlerFilters);\n        });                       \n        // Flow runner\n        var runner = getExtensionBody(bo, \"easyflow:Runner\");\n        var runnerHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.runner'] + ':</label> <textarea class=\"form-control j-bpmn-runner\" name=\"j-bpmn-runner\"></textarea></div>'\n            + '</div>';\n        var $runnerElement = $(runnerHtml).appendTo($infoPanel);\n        var $runner = $runnerElement.find(\".j-bpmn-runner\");\n        $runner.tooltip({ title: J.msg['bpmn.runnerTooltip'] })\n        $runner.rules('add', { json: true });\n        $runner.text(runner);\n        $runner.blur(function() {\n            var newRunner = $runner.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:Runner\", newRunner);\n        });\n        // Flow parse listeners \n        var parseListenersExp = getExtensionBody(bo, \"easyflow:ParseListeners\");\n        var parseListenersHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.parseListeners'] + ':</label> <textarea class=\"form-control j-bpmn-parselisteners\" name=\"j-bpmn-parselisteners\"></textarea></div>'\n            + '</div>';\n        var $parseListenersElement = $(parseListenersHtml).appendTo($infoPanel);\n        var $parseListeners = $parseListenersElement.find(\".j-bpmn-parselisteners\");\n        $parseListeners.tooltip({ title: J.msg['bpmn.parseListenersTooltip'] })\n        $parseListeners.rules('add', { json: true });\n        $parseListeners.text(parseListenersExp);\n        $parseListeners.blur(function() {\n            var newParseListeners = $parseListeners.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:ParseListeners\", newParseListeners);\n        });  \n        // Log flag\n        var logFlag = getExtensionBody(bo, \"easyflow:LogFlag\");\n        var logFlagHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.logFlag'] + ':</label> ' +\n               '<select class=\"form-control j-bpmn-logflag\">' +\n               '<option value=\"\">' + J.msg['bpmn.default'] + '</option>' +\n               '<option value=\"true\">' + J.msg['bpmn.true'] + '</option>' +\n               '<option value=\"false\">' + J.msg['bpmn.false'] + '</option>' +\n            '</select>' +\n            '</div>';\n        var $logFlagElement = $(logFlagHtml).appendTo($infoPanel);\n        $logFlagElement.tooltip({ title: J.msg['bpmn.logFlagTooltip'] });\n        var $logFlag = $logFlagElement.find(\".j-bpmn-logflag\");\n        $logFlag.val(logFlag);\n        $logFlag.blur(function() {\n            var newLogFlag = $logFlag.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:LogFlag\", newLogFlag);\n        });  \n    }\n    // Script task\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:ScriptTask\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        var bo = element.businessObject;\n        var _self = this;\n        // Script format\n        var scriptFormat = bo.scriptFormat;\n        var scriptFormatHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.scriptFormat'] + ':</label> ' +\n               '<select class=\"form-control j-bpmn-scriptformat\">' +\n               '<option value=\"exp\">' + J.msg['bpmn.scriptFormat.exp'] + '</option>' +\n               '<option value=\"createExp\">' + J.msg['bpmn.scriptFormat.createExp'] + '</option>' +\n            '</select>' +\n            '</div>';\n        var $scriptFormatElement = $(scriptFormatHtml).appendTo($infoPanel);\n        $scriptFormatElement.tooltip({ title: J.msg['bpmn.scriptFormatTooltip'] });\n        var $scriptFormat = $scriptFormatElement.find(\".j-bpmn-scriptformat\");\n        $scriptFormat.val(scriptFormat);\n        $scriptFormat.blur(function() {\n            var newScriptFormat = $scriptFormat.val();\n            if (newScriptFormat == 'exp') {\n                delete bo.scriptFormat;\n            } else {\n                bo.scriptFormat = newScriptFormat;\n            }\n        });\n        // task script\n        var script = bo.script;\n        var scriptHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.script'] + ':</label> <textarea class=\"form-control j-bpmn-script\" name=\"j-bpmn-script\"></textarea></div>'\n            + '</div>';\n        var $scriptElement = $(scriptHtml).appendTo($infoPanel);\n        $scriptElement.tooltip({ title: J.msg['bpmn.scriptTooltip'] });\n        var $script = $scriptElement.find(\".j-bpmn-script\");\n        $script.text(script);\n        $script.blur(function() {\n            var newScript = $script.val();\n            bo.script = newScript;\n            _self._comment(element);\n        });\n        \n        this._elementPanelRender[\"bpmn:ExtConditionType\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeStart\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePre\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePost\"].call(this, $infoPanel, element);\n    }\n    // User task\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:UserTask\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:ExtConditionType\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeStart\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePre\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePost\"].call(this, $infoPanel, element);\n    }\n    // Receive task\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:ReceiveTask\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:ExtConditionType\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeStart\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePre\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePost\"].call(this, $infoPanel, element);\n    }\n    // Task\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:Task\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:ExtConditionType\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeStart\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePre\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePost\"].call(this, $infoPanel, element);\n    }      \n    // Send task\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:SendTask\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:ExtConditionType\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeStart\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePre\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePost\"].call(this, $infoPanel, element);\n    }    \n    // Manual Task\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:ManualTask\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:ExtConditionType\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeStart\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePre\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePost\"].call(this, $infoPanel, element);\n    }   \n    // BusinessRuleTask Task\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:BusinessRuleTask\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:ExtConditionType\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeStart\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePre\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePost\"].call(this, $infoPanel, element);\n    }   \n    // Service Task\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:ServiceTask\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:ExtConditionType\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeStart\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePre\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePost\"].call(this, $infoPanel, element);\n    }             \n    // Call activity\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:CallActivity\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        var bo = element.businessObject;\n        var _self = this;\n        // Called element\n        var calledElement = bo.calledElement;\n        var calledElementHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><span class=\"j-require\">*</span><label>' + J.msg['bpmn.calledElement'] + ':</label> ' +\n               '<input class=\"form-control j-bpmn-calledelement\"/>' +\n            '</div>';\n        var $calledElementElement = $(calledElementHtml).appendTo($infoPanel);\n        $calledElementElement.tooltip({ title: J.msg['bpmn.calledElementTooltip'] });\n        var $calledElement = $calledElementElement.find(\".j-bpmn-calledelement\");\n        $calledElement.val(calledElement);\n        $calledElement.blur(function() {\n            var newCalledElement = $calledElement.val();\n                bo.calledElement = newCalledElement;\n        });\n        this._elementPanelRender[\"bpmn:ExtConditionType\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeStart\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePre\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePost\"].call(this, $infoPanel, element);\n    }\n    // Sub process\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:SubProcess\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        var bo = element.businessObject;\n        var _self = this;\n        // Flow\n        var flow = getExtensionBody(bo, \"easyflow:Flow\");\n        var flowHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.flow'] + ':</label> <textarea class=\"form-control j-bpmn-flow\" name=\"j-bpmn-flow\"></textarea></div>'\n            + '</div>';\n        var $flowElement = $(flowHtml).appendTo($infoPanel);\n        var $flow = $flowElement.find(\".j-bpmn-flow\");\n        $flow.tooltip({ title: J.msg['bpmn.flowTooltip'] })\n        $flow.rules('add', { json: true });\n        $flow.text(flow);\n        $flow.blur(function() {\n            var newFlow = $flow.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:Flow\", newFlow);\n        });\n        this._elementPanelRender[\"bpmn:ExtConditionType\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeStart\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePre\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePost\"].call(this, $infoPanel, element);\n    }    \n    // Transaction\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:Transaction\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        var bo = element.businessObject;\n        var _self = this;\n        // Flow\n        var flow = getExtensionBody(bo, \"easyflow:Flow\");\n        var flowHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.flow'] + ':</label> <textarea class=\"form-control j-bpmn-flow\" name=\"j-bpmn-flow\"></textarea></div>'\n            + '</div>';\n        var $flowElement = $(flowHtml).appendTo($infoPanel);\n        var $flow = $flowElement.find(\".j-bpmn-flow\");\n        $flow.tooltip({ title: J.msg['bpmn.flowTooltip'] })\n        $flow.rules('add', { json: true });\n        $flow.text(flow);\n        $flow.blur(function() {\n            var newFlow = $flow.val();\n            updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:Flow\", newFlow);\n        });\n        this._elementPanelRender[\"bpmn:ExtConditionType\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeStart\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePre\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePost\"].call(this, $infoPanel, element);\n    }        \n    // Start event\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:StartEvent\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:ExtConditionType\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePost\"].call(this, $infoPanel, element);\n    }\n    // End event\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:EndEvent\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePre\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n    }\n    // Catch event\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:IntermediateCatchEvent\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:ExtConditionType\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePre\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePost\"].call(this, $infoPanel, element);\n    }\n    // Throw event\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:IntermediateThrowEvent\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:ExtConditionType\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePre\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePost\"].call(this, $infoPanel, element);\n    }    \n    // Exclusive gateway\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:ExclusiveGateway\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePre\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePost\"].call(this, $infoPanel, element);\n    }\n    // Inclusive gateway\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:InclusiveGateway\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePre\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePost\"].call(this, $infoPanel, element);\n    }\n    // Parallel gateway\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:ParallelGateway\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePre\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePost\"].call(this, $infoPanel, element);\n    }\n    // Complex gateway\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:ComplexGateway\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePre\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePost\"].call(this, $infoPanel, element);\n    }  \n    // Event based gateway\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:EventBasedGateway\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePre\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodeAction\"].call(this, $infoPanel, element);\n        this._elementPanelRender[\"bpmn:NodePost\"].call(this, $infoPanel, element);\n    }       \n    // Sequence flow\n    J.BpmnControl.prototype._elementPanelRender[\"bpmn:SequenceFlow\"] = function($infoPanel, element) {\n        this._elementPanelRender[\"bpmn:Element\"].call(this, $infoPanel, element, false);\n        var bo = element.businessObject;\n        var _self = this;\n        // Conditional expression\n        var conditionExpression = bo.conditionExpression ? bo.conditionExpression.body : '';\n        var conditionExpressionHtml = '<div class=\"row\">' +\n            '<div class=\"form-group col\"><label>' + J.msg['bpmn.conditionExp'] + ':</label> <textarea class=\"form-control j-bpmn-conditionExpression\" name=\"j-bpmn-conditionExpression\"></textarea></div>'\n            + '</div>';\n        var $conditionExpressionElement = $(conditionExpressionHtml).appendTo($infoPanel);\n        $conditionExpressionElement.tooltip({ title: J.msg[\"bpmn.conditionExpTooltip\"] });\n        var $conditionExpression = $conditionExpressionElement.find(\".j-bpmn-conditionExpression\");\n        $conditionExpression.text(conditionExpression);\n        $conditionExpression.blur(function() {\n            var newConditionExpression = $conditionExpression.val();\n            if (!newConditionExpression) {\n                delete bo.conditionExpression;\n            } else {\n                const moddle = _self.bpmnModeler.get('moddle');\n                (!bo.conditionExpression) && (bo.conditionExpression = moddle.create('bpmn:FormalExpression'));\n                bo.conditionExpression.body = newConditionExpression;\n            }\n            var eventBus = _self.bpmnModeler.get('eventBus');\n            eventBus.fire(\"element.changed\", { element: element });\n            _self._comment(element);\n        });\n    }\n\n    J.BpmnControl.prototype._commentAll = function() {\n        var commentType = this.$bpmnContainer.find(\".j-bpmn-comment-select\").val();\n        var _self = this;\n        var elementRegistry = this.bpmnModeler.get('elementRegistry');\n        var commentTypes = [\"bpmn:StartEvent\", \"bpmn:EndEvent\", \"bpmn:IntermediateCatchEvent\",\"bpmn:IntermediateThrowEvent\",\n            \"bpmn:ExclusiveGateway\", \"bpmn:InclusiveGateway\", \"bpmn:ParallelGateway\", \"bpmn:ComplexGateway\",, \"bpmn:EventBasedGateway\",\n            \"bpmn:ScriptTask\", \"bpmn:ReceiveTask\", \"bpmn:UserTask\",\"bpmn:UserTask\",\"bpmn:CallActivity\",\"bpmn:SubProcess\",\"bpmn:Transaction\",\n            \"bpmn:Task\",\"bpmn:SendTask\",\"bpmn:ManualTask\",\"bpmn:BusinessRuleTask\",\"bpmn:ServiceTask\",\n            \"bpmn:SequenceFlow\"];\n        var commentElements = elementRegistry.filter(function(e) {\n            return commentTypes.indexOf(e.type) >= 0;\n        });\n        commentElements.forEach(function(element) {\n            _self._comment(element, commentType);\n        });\n    }\n\n    /**\n     * Comment\n     */\n    J.BpmnControl.prototype._comment = function(element, commentType) {\n        var commentTypes = [\"bpmn:StartEvent\", \"bpmn:EndEvent\", \"bpmn:IntermediateCatchEvent\",\"bpmn:IntermediateThrowEvent\",\n            \"bpmn:ExclusiveGateway\", \"bpmn:InclusiveGateway\", \"bpmn:ParallelGateway\", \"bpmn:ComplexGateway\",, \"bpmn:EventBasedGateway\",\n            \"bpmn:ScriptTask\", \"bpmn:ReceiveTask\", \"bpmn:UserTask\",\"bpmn:CallActivity\",\"bpmn:SubProcess\",\"bpmn:Transaction\",\n           \"bpmn:Task\", \"bpmn:SendTask\",\"bpmn:ManualTask\",\"bpmn:BusinessRuleTask\",\"bpmn:ServiceTask\",\n            \"bpmn:SequenceFlow\"];\n            if (! commentTypes.includes(element.type)) {\n                return;\n            }\n        if (commentType === undefined) {\n            commentType = this.$bpmnContainer.find(\".j-bpmn-comment-select\").val();\n        }\n        var _self = this;\n        var overlays = this.bpmnModeler.get('overlays');\n        var bo = element.businessObject;\n        overlays.remove({ element: element.id, type:\"easyflow-comment\"});\n        if (!commentType.includes(\"node\") && !commentType.includes(\"condition\")) {\n            return;\n        }\n        // Judge type\n        if (\"bpmn:SequenceFlow\" == element.type) {\n            if (!commentType.includes(\"condition\") || !bo.conditionExpression) {\n                return;\n            }\n        }\n        if ([\"bpmn:StartEvent\", \"bpmn:EndEvent\", \"bpmn:IntermediateCatchEvent\",\"bpmn:IntermediateThrowEvent\",\n            \"bpmn:ExclusiveGateway\", \"bpmn:InclusiveGateway\", \"bpmn:ParallelGateway\", \"bpmn:ComplexGateway\",, \"bpmn:EventBasedGateway\",\n            \"bpmn:ScriptTask\", \"bpmn:ReceiveTask\", \"bpmn:UserTask\",\"bpmn:CallActivity\",\"bpmn:SubProcess\",\"bpmn:Transaction\",\n            \"bpmn:Task\",\"bpmn:SendTask\",\"bpmn:ManualTask\",\"bpmn:BusinessRuleTask\",\"bpmn:ServiceTask\",\n            \"bpmn:SubProcess\",\"bpmn:Transaction\"].includes(element.type)) {\n            if (!commentType.includes(\"node\")) {\n                return;\n            }\n        }\n        \n        var elementRegistry = this.bpmnModeler.get('elementRegistry');\n        var element = elementRegistry.get(element.id);\n        if (! element) {\n            return;\n        }\n        \n        var commentId = \"comment_\" + $.jSequence.next();\n        var clazz = \"\";\n        if(\"bpmn:SequenceFlow\" == element.type) {\n            clazz = \" j-bpmn-comment-condition\";\n        }\n        var html = '<div class=\"j-bpmn-comment' + clazz + '\" id=\"' + commentId + '\"><dl>';\n            html += '<dt>ID:</dt><dd>' + bo.id + (bo.name?\"(\" + bo.name + \")\":\"\") + '</dd>';\n        if (element.type == \"bpmn:SequenceFlow\") {\n            html += '<dt>' + J.msg['bpmn.condition'] + ':</dt><dd>' + (bo.conditionExpression ? bo.conditionExpression.body : J.msg['bpmn.none']) + '</dd>'\n        }\n        if (element.type == 'bpmn:ScriptTask') {\n            html += '<dt>' + J.msg['bpmn.script'] + ':</dt><dd>' + (bo.script ? bo.script : J.msg['bpmn.none']) + '</dd>';\n        }\n        if (element.type=='bpmn:CallActivity') {\n            html += '<dt>' + J.msg['bpmn.calledElement'] + ':</dt><dd>' + (bo.calledElement ? bo.calledElement : J.msg['bpmn.none']) + '</dd>';\n        }\n            var properties = getExtensionBody(bo, \"easyflow:Properties\");\n            if (properties) {\n                html += '<dt>' + J.msg['bpmn.property'] + ':</dt><dd>' + properties + '</dd>';\n            }\n        if (element.type == 'bpmn:ScriptTask' || element.type=='bpmn:UserTask' || element.type=='bpmn:ReceiveTask') {\n           var conditionType = getExtensionBody(bo, \"easyflow:ConditionType\");\n            if (conditionType == 'exclusive') {\n                html += '<dt>' + J.msg['bpmn.branchType'] + ':</dt><dd>' + J.msg['bpmn.branchType.exclusive'] + '</dd>';\n            }\n            var start = getExtensionBody(bo, \"easyflow:Start\");\n            if (start == 'true') {\n                html += '<dt>' + J.msg['bpmn.startNode'] + ':</dt><dd>' + J.msg['bpmn.startNode.true'] + '</dd>';\n            }            \n        }\n        \n        var nodePre = getExtensionBody(bo, \"easyflow:Pre\");\n        if (nodePre) {\n            html += '<dt>' + J.msg['bpmn.selfPre'] + ':</dt><dd>' + nodePre + '</dd>';\n        }\n         var nodeAction = getExtensionBody(bo, \"easyflow:Action\");\n        if (nodeAction) {\n            html += '<dt>' + J.msg['bpmn.selfAction'] + ':</dt><dd>' + nodeAction + '</dd>';\n        }    \n         var nodePost = getExtensionBody(bo, \"easyflow:Post\");\n        if (nodePost) {\n            html += '<dt>' + J.msg['bpmn.selfPost'] + ':</dt><dd>' + nodePost + '</dd>';\n        }               \n \n        \n        html += '</dl></div>';\n        // attach an overlay to a node\n        var extPropertiesStr = getExtensionBody(bo, \"easyflow:ExtProperties\");\n        var extProperties = extPropertiesStr ? JSON.parse(extPropertiesStr) : {};\n        var pos = extProperties && extProperties.commentPosition ? extProperties.commentPosition : { top:3, left:20 };\n        overlays.add(element.id, \"easyflow-comment\", {\n            position: pos,\n            html: html,\n            scale:{max:1}\n        });\n        var $comment = $(\"#\" + commentId);\n        var $commentParent = $comment.parent();\n        var width = extProperties && extProperties.commentWidth ? extProperties.commentWidth : 110;\n        $comment.width(width);\n        // Drag event\n        $comment.on(\"mousemove\", function(e){\n            var offset = $comment.offset();\n            if ((offset.left + $comment.width() - e.pageX) < 5) {\n                $comment.css(\"cursor\", \"e-resize\");\n            } else if (e.pageX-offset.left < 5 || e.pageY-offset.top<5 || offset.top+$comment.height() - e.pageY < 5) {\n                $comment.css(\"cursor\", \"move\");\n            } else {\n                $comment.css(\"cursor\", \"auto\");\n            }  \n        });\n        $comment.on(\"mousedown\", function(e) {\n            $comment.pageX = e.pageX;\n            $comment.pageY = e.pageY;\n            var offset = $comment.offset();\n            if ((offset.left + $comment.width() - e.pageX) < 5) {\n                $comment.eventType = 'width';\n                $comment.css(\"cursor\", \"e-resize\");\n            } else if (e.pageX-offset.left < 5 || e.pageY-offset.top<5 || offset.top+$comment.height() - e.pageY < 5) {\n                $comment.eventType = \"drag\";\n                $comment.css(\"cursor\", \"move\");\n            } else {\n                $comment.eventType = null;\n                $comment.css(\"cursor\", \"auto\");\n            }\n            var mousemoveFunction = function(e) {\n                if ($comment.eventType == \"drag\") {\n                    var top = pos.top + (e.pageY - $comment.pageY);\n                    var left = pos.left + (e.pageX - $comment.pageX);\n                    $commentParent.css({ top: top + \"px\", left: left + \"px\" });\n                } else if ($comment.eventType == 'width') {\n                    var currentWidth = width + (e.pageX - $comment.pageX);\n                    $comment.width(currentWidth);\n                }\n            };\n            var mouseupFunction = function(e) {\n                $(document).off(\"mousemove\", mousemoveFunction).off(\"mouseup\", mouseupFunction);\n                var extPropertiesStr = getExtensionBody(bo, \"easyflow:ExtProperties\");\n                var extProperties = extPropertiesStr ? JSON.parse(extPropertiesStr) : {};\n                $comment.css(\"cursor\", \"auto\");\n                if ($comment.eventType == \"drag\") {\n                    pos.left += e.pageX - $comment.pageX;\n                    pos.top += e.pageY - $comment.pageY;                   \n                    extProperties.commentPosition = pos;\n                    updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:ExtProperties\", JSON.stringify(extProperties));\n                } else if ($comment.eventType=='width') {\n                    width += e.pageX - $comment.pageX;\n                    extProperties.commentWidth = width;\n                    updateExtensionBody(_self.bpmnModeler, bo, \"easyflow:ExtProperties\", JSON.stringify(extProperties));\n                }\n            }\n            if ($comment.eventType){\n                $(document).on(\"mousemove\", mousemoveFunction).on(\"mouseup\", mouseupFunction)\n            }\n        });\n    }\n    /**\n     * html of show\n     */\n    J.BpmnControl.prototype._html = function() {\n        return '<div class=\"j-bpmn-panel j-bpmn-panel-normal\">' +                                                           \n          '<div class=\"j-flow-canvas\"></div> ' +    \n          '<div class=\"text-left j-bpmn-btn-group\">     ' +                                                                   \n              '<button type=\"button\" class=\"btn btn-primary j-bpmn-view\">' + J.msg['bpmn.bpmnDefinition'] + '</button>\\n' +\n            (this.cfg.mode == 'view' ? '' : '<button type=\"button\" class=\"btn btn-secondary j-bpmn-import\">' + J.msg['bpmn.import'] + '</button>\\n') +\n              '<button type=\"button\" class=\"btn btn-secondary j-bpmn-export\">' + J.msg['bpmn.export'] + '</button>\\n' +\n              '<button type=\"button\" class=\"btn btn-secondary j-bpmn-svgdownload\">' + J.msg['bpmn.svg'] + '</button>\\n' +\n              '<button type=\"button\" class=\"btn btn-secondary j-bpmn-zoomin\" data-toggle=\"tooltip\" title=\"' + J.msg['bpmn.zoomIn'] + '\">-</button>\\n' +\n              '<button type=\"button\" class=\"btn btn-secondary j-bpmn-zoomout\" data-toggle=\"tooltip\" title=\"' + J.msg['bpmn.zoomOut'] + '\">+</button>\\n' +\n              '<button type=\"button\" class=\"btn btn-secondary j-bpmn-fullscreen\" data-toggle=\"tooltip\" title=\"' + J.msg['bpmn.fullScreen'] + '\"><i class=\"fas fa-expand\"></i></button>\\n' +\n              '<div class=\"j-bpmn-comment-select-container\"><select multiple=\"multiple\" class=\"j-bpmn-comment-select d-none\">' +\n                  '<option value=\"node\">' + J.msg['bpmn.node'] + '</option>' +\n                  '<option value=\"condition\">' + J.msg['bpmn.condition'] + '</option>' +\n              '</select></div> ' +\n          '</div>  ' +                                                \n         '<div class=\"infoPanel\"><div class=\"infoPanelHead\"><span class=\"j-bpmn-info-title\"><b>' + J.msg['bpmn.infoPanel'] + '</b></span><i class=\"fa fa-info-circle j-bpmn-info-switch\"></i><div style=\"clear:both\"></div></div><form class=\"container\"></form></div>  ' +                                          \n      '</div>    ';\n    }\n\n    J.BpmnControl.prototype._bpmnViewHtml = function() {\n        return '<div class=\"bpmnDefContainer\">                                                                                 ' +\n            '    <div class=\"row\">                                                                                          ' +\n            '        <div class=\"form-group col\">                                                                           ' +\n            '            <label><span class=\"j-require\">*</span>' + J.msg['bpmn.flowBpmnDefinition'] + ':</label>                                       ' +\n            '            <textarea class=\"bpmnDef form-control\" rows=\"30\"></textarea>                                       ' +\n            '        </div>                                                                                                 ' +\n            '    </div>                                                                                                     ' +\n            '    <div class=\"row\">                                                                                          ' +\n            '        <div class=\"col text-center\">                                                                          ' +\n            (this.cfg.mode == 'view' ? '' : '            <button type=\"button\" class=\"btn btn-primary j-btn-bpmn-render\">' + J.msg['bpmn.renderFlowDiagram'] +'</button>              ') +\n            '            <button type=\"button\" class=\"btn btn-secondary j-btn-primary j-btn-bpmn-json\">' + J.msg['bpmn.viewFlowDefinition'] + '</button>           ' +\n            (this.cfg.mode != 'edit' ? '' : '            <button type=\"button\" class=\"btn btn-secondary j-btn-compare-bpmn\">' + J.msg['bpmn.oldNewBpmnCompare'] + '</button>       ') +\n            (this.cfg.mode != 'edit' ? '' : '            <button type=\"button\" class=\"btn btn-secondary j-btn-compare-easyflow\">' + J.msg['bpmn.oldNewEasyFlowCompare'] + '</button>   ') +\n            '            <button type=\"button\" class=\"btn btn-secondary j-btn-cancel\">' + J.msg['bpmn.cancel'] + '</button>                         ' +\n            '        </div>                                                                                                 ' +\n            '    </div>                                                                                                     ' +\n            '</div>                                                                                                         ' +\n            '';\n    }\n\n    J.BpmnControl.prototype.initialDiagram = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>'\n        + '<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ' +\n        'xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" ' +\n        'xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" ' +\n        'xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" ' +\n        'targetNamespace=\"http://bpmn.io/schema/bpmn\" ' +\n        'id=\"Definitions_1\">'\n        + '<bpmn:process id=\"Process_1\" isExecutable=\"false\">'\n        + '<bpmn:startEvent id=\"StartEvent_1\"/>'\n        + '</bpmn:process>'\n        + '<bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">'\n        + '<bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"Process_1\">'\n        + '<bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"StartEvent_1\">'\n        + '<dc:Bounds height=\"36.0\" width=\"36.0\" x=\"173.0\" y=\"102.0\"/>'\n        + '</bpmndi:BPMNShape>' + '</bpmndi:BPMNPlane>'\n        + '</bpmndi:BPMNDiagram>' + '</bpmn:definitions>';\n\n/**\n* Find BPMN Element\n*/\n\tJ.BpmnControl.prototype.findProcessElements = function() {\n\t\tvar bpmnModeler = this.bpmnModeler;\n\t\treturn _findProcessElement(bpmnModeler);\n\t}\n    function _findProcessElement(bpmnModeler) {\n        var elementRegistry = bpmnModeler.get('elementRegistry');\n        var processes = elementRegistry.filter(function(element) {\n            return element.type == 'bpmn:Process';\n        });\n        if (processes.length>0) {\n            return processes;\n        }\n        var participants = elementRegistry.filter(function(element) {\n            return element.type == 'bpmn:Participant';\n        });\n        participants.forEach(function(element){\n            var processBusinessObject = element.businessObject.processRef;\n            if (processBusinessObject) {\n              processes.push({businessObject:processBusinessObject});\n            }\n        });\n        return processes;\n    }\n    \n\n    /**\n     * Read extension field\n     */\n    function getExtensionElement(element, type) {\n        if (!element.extensionElements || !element.extensionElements.values) {\n            return;\n        }\n        return element.extensionElements.values.filter((extensionElement) => {\n            return extensionElement.$instanceOf(type);\n        })[0];\n    }\n\n    function getExtensionBody(bo, type) {\n        var extensionElement = getExtensionElement(bo, type);\n        return extensionElement ? extensionElement.$body : null;\n    }\n\n    /**\n     * Update body of extension\n     */\n    function updateExtensionBody(bpmnModeler, bo, type, value) {\n        // Delete element\n        if (!value) {\n            if (!bo.extensionElements || !bo.extensionElements.values) {\n                return;\n            }\n            var values = [];\n            bo.extensionElements.values && bo.extensionElements.values.forEach(function(el) {\n                if (!el.$instanceOf(type)) {\n                    values.push(el);\n                }\n            });\n            if (values.length == 0) {\n                delete bo.extensionElements;\n            } else {\n                bo.extensionElements.values = values;\n            }\n        } else {\n            // Add or modify element\n            var element = getExtensionElement(bo, type);\n            if (element) {\n                // modify element\n                element.$body = value;\n            } else {\n                // add element\n                const moddle = bpmnModeler.get('moddle');\n                (!bo.extensionElements) && (bo.extensionElements = moddle.create('bpmn:ExtensionElements'));\n                var element = moddle.create(type);\n                element.$body = value;\n                bo.extensionElements.get('values').push(element);\n            }\n        }\n    }\n\n    var easyflowExtension =\n    {\n        \"name\": \"easyflow\",\n        \"uri\": \"http://jd.com/easyflow\",\n        \"prefix\": \"easyflow\",\n        \"xml\": {\n            \"tagAlias\": \"lowerCase\"\n        },\n        \"types\": [\n            {\n                \"name\": \"Properties\",\n                \"superClass\": [\"Element\"],\n                \"properties\": [\n                    {\n                        \"name\": \"$body\",\n                        \"isBody\": true,\n                        \"type\": \"String\"\n                    }\n                ]\n            },\n            {\n                \"name\": \"Listeners\",\n                \"superClass\": [\"Element\"],\n                \"properties\": [\n                    {\n                        \"name\": \"$body\",\n                        \"isBody\": true,\n                        \"type\": \"String\"\n                    }\n                ]\n            },\n            {\n                \"name\": \"Filters\",\n                \"superClass\": [\"Element\"],\n                \"properties\": [\n                    {\n                        \"name\": \"$body\",\n                        \"isBody\": true,\n                        \"type\": \"String\"\n                    }\n                ]\n            },\n            {\n                \"name\": \"NodeFilters\",\n                \"superClass\": [\"Element\"],\n                \"properties\": [\n                    {\n                        \"name\": \"$body\",\n                        \"isBody\": true,\n                        \"type\": \"String\"\n                    }\n                ]\n            },\n            {\n                \"name\": \"NodePreHandlerFilters\",\n                \"superClass\": [\"Element\"],\n                \"properties\": [\n                    {\n                        \"name\": \"$body\",\n                        \"isBody\": true,\n                        \"type\": \"String\"\n                    }\n                ]\n            },\n            {\n                \"name\": \"NodeActionFilters\",\n                \"superClass\": [\"Element\"],\n                \"properties\": [\n                    {\n                        \"name\": \"$body\",\n                        \"isBody\": true,\n                        \"type\": \"String\"\n                    }\n                ]\n            },\n            {\n                \"name\": \"NodePostHandlerFilters\",\n                \"superClass\": [\"Element\"],\n                \"properties\": [\n                    {\n                        \"name\": \"$body\",\n                        \"isBody\": true,\n                        \"type\": \"String\"\n                    }\n                ]\n            },   \n            {\n                \"name\": \"FlowPreHandlerFilters\",\n                \"superClass\": [\"Element\"],\n                \"properties\": [\n                    {\n                        \"name\": \"$body\",\n                        \"isBody\": true,\n                        \"type\": \"String\"\n                    }\n                ]\n            }, \n            {\n                \"name\": \"FlowPostHandlerFilters\",\n                \"superClass\": [\"Element\"],\n                \"properties\": [\n                    {\n                        \"name\": \"$body\",\n                        \"isBody\": true,\n                        \"type\": \"String\"\n                    }\n                ]\n            },                                              \n            {\n                \"name\": \"ConditionType\",\n                \"superClass\": [\"Element\"],\n                \"properties\": [\n                    {\n                        \"name\": \"$body\",\n                        \"isBody\": true,\n                        \"type\": \"String\"\n                    }\n                ]\n            },\n            {\n                \"name\": \"Start\",\n                \"superClass\": [\"Element\"],\n                \"properties\": [\n                    {\n                        \"name\": \"$body\",\n                        \"isBody\": true,\n                        \"type\": \"String\"\n                    }\n                ]\n            },   \n            {\n                \"name\": \"Pre\",\n                \"superClass\": [\"Element\"],\n                \"properties\": [\n                    {\n                        \"name\": \"$body\",\n                        \"isBody\": true,\n                        \"type\": \"String\"\n                    }\n                ]\n            }, \n            {\n                \"name\": \"Action\",\n                \"superClass\": [\"Element\"],\n                \"properties\": [\n                    {\n                        \"name\": \"$body\",\n                        \"isBody\": true,\n                        \"type\": \"String\"\n                    }\n                ]\n            },                         \n            {\n                \"name\": \"Post\",\n                \"superClass\": [\"Element\"],\n                \"properties\": [\n                    {\n                        \"name\": \"$body\",\n                        \"isBody\": true,\n                        \"type\": \"String\"\n                    }\n                ]\n            },   \t\t\t\n            {\n                \"name\": \"Runner\",\n                \"superClass\": [\"Element\"],\n                \"properties\": [\n                    {\n                        \"name\": \"$body\",\n                        \"isBody\": true,\n                        \"type\": \"String\"\n                    }\n                ]\n            },\n            {\n                \"name\": \"ParseListeners\",\n                \"superClass\": [\"Element\"],\n                \"properties\": [\n                    {\n                        \"name\": \"$body\",\n                        \"isBody\": true,\n                        \"type\": \"String\"\n                    }\n                ]\n            },                    \n            {\n                \"name\": \"ExtProperties\",\n                \"superClass\": [\"Element\"],\n                \"properties\": [\n                    {\n                        \"name\": \"$body\",\n                        \"isBody\": true,\n                        \"type\": \"String\"\n                    }\n                ]\n            },\n            {\n                \"name\": \"Flow\",\n                \"superClass\": [\"Element\"],\n                \"properties\": [\n                    {\n                        \"name\": \"$body\",\n                        \"isBody\": true,\n                        \"type\": \"String\"\n                    }\n                ]\n            },\n            {\n                \"name\": \"LogFlag\",\n                \"superClass\": [\"Element\"],\n                \"properties\": [\n                    {\n                        \"name\": \"$body\",\n                        \"isBody\": true,\n                        \"type\": \"String\"\n                    }\n                ]\n            }                                \n        ]\n    };\n\n\n\n    function easyFlowTranslate(template, replacements) {\n        replacements = replacements || {};\n\n        // Translate\n        template = J.bpmnIOTranslations[template] || template;\n\n        // Replace\n        return template.replace(/{([^}]+)}/g, function(_, key) {\n            return replacements[key] || '{' + key + '}';\n        });\n    }\n\n\n})(window.J);                "
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/flow/flow.css",
    "content": "/**BPMN panel*/\n.j-bpmn-panel {\n    background-color: white\n}\n\n.j-bpmn-panel-normal {\n    position:relative;\n    height:500px;   \n}\n\n.j-bpmn-panel-fullscreen {\n    position:fixed;\n    top:0;\n    bottom:0;\n    left:0;\n    right:0;\n    z-index:1000\n}\n\n.j-flow-canvas {\n    height: 100%\n}\n\n.j-bpmn-btn-group {\n    position:absolute;\n    left:10px;\n    bottom:0;\n\n}\n/**info panel*/\n.infoPanel {\n    padding:4px;\n    position: absolute;\n    right: 0;\n    top: 0;\n    bottom:50px;\n    overflow:scroll;\n    background: white;\n    border: 1px solid #ccc;\n}\n\n.infoPanel-up {\n\tbottom:auto;\n\toverflow:hidden;\n}\n\n.infoPanel form {\n\twidth:300px;\n}\n.infoPanel .col {\n    padding-left:0px;\n    padding-right: 0px;\n}\n\n.infoPanel textarea.form-control {\n    height:30px;\n}\n\n.j-bpmn-info-switch {\n    float:right;\n    cursor: pointer;\n}\n\n/**instance info style*/\n.j-bpmn-node-close:not(.djs-connection) .djs-visual>:nth-child(1) {\n    fill: #F0FFF0 !important; /* color elements as green */\n}\n\n.j-bpmn-node-active:not(.djs-connection) .djs-visual>:nth-child(1) {\n    fill: #FFFACD !important; /* color elements as green */\n}\n\n.j-bpmn-comment-select-container {\n\tdisplay: inline-block;\n}\n\n.j-bpmn-comment {\n    border-radius:2px;\n    background-color:#cf9;\n    opacity: 0.8\n}\n\n.j-bpmn-comment-condition {\n\t    background-color:#ff3;\n}\n\n/**Detail info style*/\n.j-bpmn-comment dl {\n    font-size: 10px;\n    margin:0;\n    padding:3px;\n}\n.j-bpmn-comment dt {\n    float:left\n}\n.j-bpmn-comment dd {\n    margin-bottom:1px;\n    word-break:break-all;\n}\n\nselect.j-bpmn-comment-btn {\n   display:inline;width:90px \n}\n\n.j-prop-key {\n    font-size: 11px;\n}\n\n.j-prop-type {\n    font-size: 11px;\n}\n\n.j-prop-val {\n   font-size: 11px; \n}"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/flow/flow.js",
    "content": "(function (J) {\n    /**\n     * Define panel control\n     */\n    J.FlowControl = function (cfg) {\n        /**\n         *Init\n         */\n        this.init = function (cfg) {\n            this.cfg = cfg;\n            this.data = cfg.data ? cfg.data : {};\n            this.originData = JSON.parse(JSON.stringify(this.data));\n            this.$container = cfg.$container;\n            var _self = this;\n            this.bpmnControl = new J.BpmnControl({\n                data: {bpmnXmlData: this.data.bpmnXmlData},\n                mode: cfg.mode,\n                openDiagramCallBack: function (processElements) {\n                    if (_self.$flowContainer.find(\"[name='format']\").val() != 'FLOW-bpmn') {\n                        return;\n                    }\n                    if (processElements.length==0) {\n                        return;\n                    }\n                    _self.$flowContainer.find(\"[name='defId']\").val(processElements[0].businessObject.id);\n                    _self.$flowContainer.find(\"[name='defName']\").val(processElements[0].businessObject.name);\n                },\n                onBpmnDefinitionChange: function (bo, key, newVal, oldVal) {\n                    if (_self.$flowContainer.find(\"[name='format']\").val()!='FLOW-bpmn') {\n                        return;\n                    }\n                    if (bo.$type == 'bpmn:Process') {\n\t\t\t\t\t\tif (key == 'id' || key == 'name') {\n\t\t\t\t\t\t\tvar processElements = this.findProcessElements();\n\t\t\t\t\t\t\tif (bo.id == processElements[0].businessObject.id) {\n\t\t                        if (key == 'id') {\n\t\t                            _self.$flowContainer.find(\"[name='defId']\").val(newVal);\n\t\t                        } else if (key == 'name') {\n\t\t                            _self.$flowContainer.find(\"[name='defName']\").val(newVal);\n\t\t                        }\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n                    }\n                }\n            });\n        }\n        /**\n         * Render\n         */\n        this.render = async function () {\n            var $flowContainer = this.$flowContainer = $(_html()).appendTo(this.$container);\n            $flowContainer.find(\"[name='defId']\").val(this.data.defId);\n            $flowContainer.find(\"[name='defName']\").val(this.data.defName);\n            this.data.format && $flowContainer.find(\"[name='format']\").val(this.data.format);\n            this.data.bizType && $flowContainer.find(\"[name='bizType']\").val(this.data.bizType);\n            this.data.category && $flowContainer.find(\"[name='category']\").val(this.data.category);\n            if (this.cfg.mode == 'view') {\n                $flowContainer.find(\"[name='format']\").attr(\"disabled\", true);\n                $flowContainer.find(\"[name='bizType']\").attr(\"disabled\", true);\n                $flowContainer.find(\"[name='category']\").attr(\"disabled\", true);\n            }\n\n            var _self = this;\n            // Define type select\n            $flowContainer.find('[name=\"format\"]').change(function () {\n                _self._renderTabs();\n            });\n\n            // Format select\n            $flowContainer.find('[name=\"format\"]').change(function() {_self._renderTabs();});\n            // Show tab\n            this._renderTabs();\n            // Render BPMN panel\n            await this._renderBpmnPanel();\n            $(function(){\n            $flowContainer.find(\".bpmnContainer\").addClass(\" tab-pane\");\n            });\n            // Render JSON Panel\n            this._renderJsonPanel();\n            return this;\n        }\n        this.init(cfg);\n        return this;\n    }\n\n    /**\n     * Render BPMN Panel\n     */\n    J.FlowControl.prototype._renderBpmnPanel = function () {\n        var $bpmnContainer = this.$flowContainer.find(\".bpmnContainer\");\n        this.bpmnControl.render($bpmnContainer);\n    }\n\n    /**\n     * Render JSON Panel\n     */\n    J.FlowControl.prototype._renderJsonPanel = function () {\n        this._renderJsonDataContainer();\n        var _self = this;\n        this.$flowContainer.find(\".jsonContainer\").find(\".j-json-def\").click(function () {\n            var elementHtml = _self._jsonViewHtml();\n            $.jDialog({\n                title: J.msg['flow.jsonDefTitle'],\n                size: \"modal-lg\",\n                element: elementHtml,\n                action: function ($dialog) {\n                    $dialog.find(\".jsonDef\").val(_self.data.jsonData);\n                    // Render buttons\n                    $dialog.find(\".j-btn-json-render\").click(function () {\n                        var dataStr = $dialog.find(\".jsonDef\").val();\n                        var data;\n                        try {\n                           data =  JSON.parse(dataStr);\n                        } catch (e) {\n                            $.jMessage({msg:J.msg['jqueryValidate.json']});\n                            return;\n                        }\n                        \n                        _self.data.jsonData = dataStr;\n                        _self._renderJsonDataContainer();\n                        if (data instanceof Array) {\n                            data = data[0];\n                        }\n                        _self.$flowContainer.find(\"[name='defId']\").val(data.id);\n                        _self.$flowContainer.find(\"[name='defName']\").val(data.name);\n                        $dialog.modal(\"hide\");\n                    });\n                    // Compare\n                    $dialog.find(\".j-btn-json-compare\").click(function () {\n                        var newData = $dialog.find(\".jsonDef\").val();\n                        var oldData = _self.originData.jsonData;\n                        $.jDiffDialog({\n                            left: {title: J.msg['flow.newFlowDef'] + \":\", content: newData},\n                            right: {title: J.msg['flow.oldFlowDef'] + \":\", content: oldData}\n                        });\n                    });\n                }\n            });\n        });\n\n    }\n\n    J.FlowControl.prototype._renderJsonDataContainer = function () {\n        var $jsonContainer = this.$jsonContainer = this.$flowContainer.find(\".jsonContainer\");\n        $jsonContainer.find(\".jsonDataContainer\").empty();\n        var jsonData = this.data.jsonData;\n        if (!jsonData) {\n            $jsonContainer.find(\".jsonDataContainer\").append(\"<div>\" + J.msg['flow.noJsonDataTip'] + \"</div>\");\n            return;\n        }\n        var def = JSON.parse(jsonData);\n        // Node panel\n        var table = '<table class=\"table table-striped table-bordered\"><thead><tr><th>' + J.msg['flow.id'] + '</th><th>' + J.msg['flow.nodeId'] + '</th><th>' + J.msg['flow.nodeName'] + '</th></tr></thead>';\n        var format = this.$flowContainer.find(\"[name='format']\").val();\n        ;\n        if (format == 'FSM-easy') {\n\t\t\tif (def.states) {\n\t            for (var i = 0; i < def.states.length; i++) {\n\t                table += \"<tr><td>\" + def.id + \"</td><td>\" + def.states[i].id + \"</td><td>\" + (def.states[i].name ? def.states[i].name : '') + \"</td></tr>\";\n\t            }\n\t\t\t}\n        } else {\n            if (def instanceof Array) {\n             for (var j in def) {\n\t\t\t\tif (def[j].nodes) {\n\t              for (var i = 0; i < def[j].nodes.length; i++) {\n\t                table += \"<tr><td>\" + def[j].id + \"</td><td>\" + def[j].nodes[i].id + \"</td><td>\" + (def[j].nodes[i].name ? def[j].nodes[i].name : '') + \"</td></tr>\";\n\t              }\n\t\t\t  }\n                }\n            } else {\n\t\t\t\tif (def.nodes) {\n\t            for (var i = 0; i < def.nodes.length; i++) {\n\t                table += \"<tr><td>\" + def.id + \"</td><td>\" + def.nodes[i].id + \"</td><td>\" + (def.nodes[i].name ? def.nodes[i].name : '') + \"</td></tr>\";\n\t            }\n\t\t\t}\n            }\n        }\n        table += \"</table>\";\n        $jsonContainer.find(\".jsonDataContainer\").append(table);\n    }\n\n\n    /**\n     * Render tab\n     */\n    J.FlowControl.prototype._renderTabs = function () {\n        var format = this.$flowContainer.find('[name=\"format\"]').val();\n        if (format == 'FLOW-bpmn') {\n            this.$flowContainer.find(\".nav-bpmnContainer\").show();\n            this.$flowContainer.find(\".nav-jsonContainer,.nav-plantUmlContainer\").hide();\n            this.$flowContainer.find(\".nav-bpmnContainer\").tab(\"show\");\n        } else {\n            this.$flowContainer.find(\".nav-bpmnContainer,.nav-jsonContainer\").show();\n            this.$flowContainer.find(\".nav-plantUmlContainer\").hide();\n            this.$flowContainer.find(\".nav-jsonContainer\").tab(\"show\");\n        }\n    };\n\n    /**\n     * Collect data\n     */\n    J.FlowControl.prototype.collect = async function () {\n        this.data.defId = this.$flowContainer.find(\"[name='defId']\").val();\n        this.data.defName = this.$flowContainer.find(\"[name='defName']\").val();\n        this.data.bizType = this.$flowContainer.find(\"[name='bizType']\").val();\n        this.data.category = this.$flowContainer.find(\"[name='category']\").val();\n        this.data.format = this.$flowContainer.find(\"[name='format']\").val();\n        // JSON Data has been set\n        this.data.bpmnXmlData = await this.bpmnControl.collect();\n        // hack! judge by length\n        if (this.data.bpmnXmlData.length < 1000) {\n            this.data.bpmnXmlData = null;\n        }\n        return this.data;\n    }\n\n\n    var _html = function () {\n        var bpmnContainerId = \"bpmnContainer\" + $.jSequence.next();\n        var jsonContainerId = \"jsonContainer\" + $.jSequence.next();\n        var bizTypeHtml = \"\";\n        if (window.flowBizType) {\n            for (var field in window.flowBizType) {\n                bizTypeHtml += \"<option value='\" + field + \"'>\" + window.flowBizType[field] + \"</option>\";\n            }\n        }\n        var categoryHtml = \"\";\n        if (window.flowCategory) {\n            for (var field in window.flowCategory) {\n                categoryHtml += \"<option value='\" + field + \"'>\" + window.flowCategory[field] + \"</option>\";\n            }\n        }\n            return  '    <div class=\" container-fluid\">                                                                   ' +\n                '        <div class=\"row\"> ' +\n                '            <div class=\"form-group col\">                                                             ' +\n                '                <label>' + J.msg['flow.flowDefId'] + ':</label><input type=\"text\" name=\"defId\"                            ' +\n                '                    class=\"form-control\" readonly=\"readonly\"/>                                                          ' +\n                '            </div>                                                                                   ' +\n                '            <div class=\"form-group col\">                                                             ' +\n                '                <label>' + J.msg['flow.flowDefName'] + ':</label><input type=\"text\" name=\"defName\"                            ' +\n                '                    class=\"form-control\" readonly=\"readonly\"/>                                                          ' +\n                '            </div>                                                                                   ' +\n                '            <div class=\"form-group col\">                                                             ' +\n                '                <label>' + J.msg['flow.flowDefType'] + ':</label> <select class=\"form-control\" name=\"format\"' +\n                '                         class=\"form-control\"> ' +\n                '                         <option value=\"FLOW-bpmn\">' + J.msg['flow.flowDefType.flowBpmn'] + '</option>          ' +\n                '                         <option value=\"FLOW-easy\">' + J.msg['flow.flowDefType.flowJson'] + '</option>          ' +\n                '                         <option value=\"FSM-easy\">' + J.msg['flow.flowDefType.fsmJson'] + '</option>             ' +\n                '                         </select>              ' +\n                '            </div>                                                                                   ' +\n                '            <div class=\"form-group col\">                                                             ' +\n                '                <label>' + J.msg['flow.bizType'] + ':</label> <select class=\"form-control\" name=\"bizType\"' +\n                '                         class=\"form-control\"/>                ' + bizTypeHtml +\n                '                         </select>              ' +\n                '            </div>                                                                                   ' +\n                '            <div class=\"form-group col\">                                                             ' +\n                '                <label>' + J.msg['flow.category'] + ':</label> <select class=\"form-control\" name=\"category\"' +\n                '                         class=\"form-control\"/>                ' + categoryHtml +\n                '                         </select>              ' +\n                '            </div>                                                                                   ' +\n                '        </div>                                                                                        '+\n                '        <div>                                                                                        ' +\n                '            <ul class=\"nav nav-tabs\">                                                                ' +\n                '                <li class=\"nav-item\"><a class=\"nav-link nav-jsonContainer\" data-toggle=\"tab\"  data-target=\"#' + jsonContainerId + '\">' + J.msg['flow.flowDefinition'] + '</a></li>          ' +\n                '                <li class=\"nav-item\"><a class=\"nav-link nav-bpmnContainer\" data-toggle=\"tab\" data-target=\"#' + bpmnContainerId + '\">' + J.msg['flow.flowDiagram'] + '</a></li>                                        ' +\n                '            </ul>                                                                                    ' +\n                '            <div class=\"tab-content\">                                                                ' +\n                // bpmnContainer\n                '                <div id=\"' + bpmnContainerId + '\" class=\"bpmnContainer\">                                       ' +\n                '                </div>                                                                               ' +\n                // jsonContainer\n                '        <div id=\"' + jsonContainerId + '\" class=\"jsonContainer tab-pane\">                                                ' +\n                '            <div class=\"row jsonDataContainer\">                                                                         ' +\n                '            </div>                                                                                    ' +\n                '            <div class=\"row\">                                                                         ' +\n                '                <button type=\"button\" class=\"btn btn-primary j-json-def\">'+J.msg['flow.jsonDefinition'] + '</button>          ' +\n                '            </div>                                                                                    ' +\n                '        </div>                                                                                        ' +\n\n                '            </div>                                                                                   ' +\n                '</div>                                                                                                ' +\n                '';\n    }\n\n    J.FlowControl.prototype._jsonViewHtml = function () {\n        return '<div class=\"jsonDefContainer\">                                                                                 ' +\n            '    <div class=\"row\">                                                                                          ' +\n            '        <div class=\"form-group col\">                                                                           ' +\n            '            <label><span class=\"j-require\">*</span>'+J.msg['flow.flowJsonDefinition'] + ':</label>                                       ' +\n            '            <textarea class=\"jsonDef form-control\" rows=\"30\"></textarea>                                       ' +\n            '        </div>                                                                                                 ' +\n            '    </div>                                                                                                     ' +\n            '    <div class=\"row\">                                                                                          ' +\n            '        <div class=\"col text-center\">                                                                          ' +\n            (this.cfg.mode == 'view' ? '' : '            <button type=\"button\" class=\"btn btn-primary j-btn-json-render\">'+J.msg['flow.update'] + '</button>              ') +\n            (this.cfg.mode != 'edit' ? '' : '            <button type=\"button\" class=\"btn btn-secondary j-btn-json-compare\">'+J.msg['flow.oldNewCompare'] + '</button>              ') +\n            '            <button type=\"button\" class=\"btn btn-secondary j-btn-cancel\">'+J.msg['flow.cancel'] + '</button>                         ' +\n            '        </div>                                                                                                 ' +\n            '    </div>                                                                                                     ' +\n            '</div>                                                                                                         ' +\n            '';\n    }\n})(window.J);    "
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/fontawesome/css/all.css",
    "content": ".fa,\n.fas,\n.far,\n.fal,\n.fab {\n  -moz-osx-font-smoothing: grayscale;\n  -webkit-font-smoothing: antialiased;\n  display: inline-block;\n  font-style: normal;\n  font-variant: normal;\n  text-rendering: auto;\n  line-height: 1; }\n\n.fa-lg {\n  font-size: 1.33333em;\n  line-height: 0.75em;\n  vertical-align: -.0667em; }\n\n.fa-xs {\n  font-size: .75em; }\n\n.fa-sm {\n  font-size: .875em; }\n\n.fa-1x {\n  font-size: 1em; }\n\n.fa-2x {\n  font-size: 2em; }\n\n.fa-3x {\n  font-size: 3em; }\n\n.fa-4x {\n  font-size: 4em; }\n\n.fa-5x {\n  font-size: 5em; }\n\n.fa-6x {\n  font-size: 6em; }\n\n.fa-7x {\n  font-size: 7em; }\n\n.fa-8x {\n  font-size: 8em; }\n\n.fa-9x {\n  font-size: 9em; }\n\n.fa-10x {\n  font-size: 10em; }\n\n.fa-fw {\n  text-align: center;\n  width: 1.25em; }\n\n.fa-ul {\n  list-style-type: none;\n  margin-left: 2.5em;\n  padding-left: 0; }\n  .fa-ul > li {\n    position: relative; }\n\n.fa-li {\n  left: -2em;\n  position: absolute;\n  text-align: center;\n  width: 2em;\n  line-height: inherit; }\n\n.fa-border {\n  border: solid 0.08em #eee;\n  border-radius: .1em;\n  padding: .2em .25em .15em; }\n\n.fa-pull-left {\n  float: left; }\n\n.fa-pull-right {\n  float: right; }\n\n.fa.fa-pull-left,\n.fas.fa-pull-left,\n.far.fa-pull-left,\n.fal.fa-pull-left,\n.fab.fa-pull-left {\n  margin-right: .3em; }\n\n.fa.fa-pull-right,\n.fas.fa-pull-right,\n.far.fa-pull-right,\n.fal.fa-pull-right,\n.fab.fa-pull-right {\n  margin-left: .3em; }\n\n.fa-spin {\n  -webkit-animation: fa-spin 2s infinite linear;\n          animation: fa-spin 2s infinite linear; }\n\n.fa-pulse {\n  -webkit-animation: fa-spin 1s infinite steps(8);\n          animation: fa-spin 1s infinite steps(8); }\n\n@-webkit-keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg); }\n  100% {\n    -webkit-transform: rotate(360deg);\n            transform: rotate(360deg); } }\n\n@keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg); }\n  100% {\n    -webkit-transform: rotate(360deg);\n            transform: rotate(360deg); } }\n\n.fa-rotate-90 {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)\";\n  -webkit-transform: rotate(90deg);\n          transform: rotate(90deg); }\n\n.fa-rotate-180 {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)\";\n  -webkit-transform: rotate(180deg);\n          transform: rotate(180deg); }\n\n.fa-rotate-270 {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)\";\n  -webkit-transform: rotate(270deg);\n          transform: rotate(270deg); }\n\n.fa-flip-horizontal {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)\";\n  -webkit-transform: scale(-1, 1);\n          transform: scale(-1, 1); }\n\n.fa-flip-vertical {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\";\n  -webkit-transform: scale(1, -1);\n          transform: scale(1, -1); }\n\n.fa-flip-horizontal.fa-flip-vertical {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\";\n  -webkit-transform: scale(-1, -1);\n          transform: scale(-1, -1); }\n\n:root .fa-rotate-90,\n:root .fa-rotate-180,\n:root .fa-rotate-270,\n:root .fa-flip-horizontal,\n:root .fa-flip-vertical {\n  -webkit-filter: none;\n          filter: none; }\n\n.fa-stack {\n  display: inline-block;\n  height: 2em;\n  line-height: 2em;\n  position: relative;\n  vertical-align: middle;\n  width: 2.5em; }\n\n.fa-stack-1x,\n.fa-stack-2x {\n  left: 0;\n  position: absolute;\n  text-align: center;\n  width: 100%; }\n\n.fa-stack-1x {\n  line-height: inherit; }\n\n.fa-stack-2x {\n  font-size: 2em; }\n\n.fa-inverse {\n  color: #fff; }\n\n/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\nreaders do not read off random characters that represent icons */\n.fa-500px:before {\n  content: \"\\f26e\"; }\n\n.fa-accessible-icon:before {\n  content: \"\\f368\"; }\n\n.fa-accusoft:before {\n  content: \"\\f369\"; }\n\n.fa-acquisitions-incorporated:before {\n  content: \"\\f6af\"; }\n\n.fa-ad:before {\n  content: \"\\f641\"; }\n\n.fa-address-book:before {\n  content: \"\\f2b9\"; }\n\n.fa-address-card:before {\n  content: \"\\f2bb\"; }\n\n.fa-adjust:before {\n  content: \"\\f042\"; }\n\n.fa-adn:before {\n  content: \"\\f170\"; }\n\n.fa-adobe:before {\n  content: \"\\f778\"; }\n\n.fa-adversal:before {\n  content: \"\\f36a\"; }\n\n.fa-affiliatetheme:before {\n  content: \"\\f36b\"; }\n\n.fa-air-freshener:before {\n  content: \"\\f5d0\"; }\n\n.fa-algolia:before {\n  content: \"\\f36c\"; }\n\n.fa-align-center:before {\n  content: \"\\f037\"; }\n\n.fa-align-justify:before {\n  content: \"\\f039\"; }\n\n.fa-align-left:before {\n  content: \"\\f036\"; }\n\n.fa-align-right:before {\n  content: \"\\f038\"; }\n\n.fa-alipay:before {\n  content: \"\\f642\"; }\n\n.fa-allergies:before {\n  content: \"\\f461\"; }\n\n.fa-amazon:before {\n  content: \"\\f270\"; }\n\n.fa-amazon-pay:before {\n  content: \"\\f42c\"; }\n\n.fa-ambulance:before {\n  content: \"\\f0f9\"; }\n\n.fa-american-sign-language-interpreting:before {\n  content: \"\\f2a3\"; }\n\n.fa-amilia:before {\n  content: \"\\f36d\"; }\n\n.fa-anchor:before {\n  content: \"\\f13d\"; }\n\n.fa-android:before {\n  content: \"\\f17b\"; }\n\n.fa-angellist:before {\n  content: \"\\f209\"; }\n\n.fa-angle-double-down:before {\n  content: \"\\f103\"; }\n\n.fa-angle-double-left:before {\n  content: \"\\f100\"; }\n\n.fa-angle-double-right:before {\n  content: \"\\f101\"; }\n\n.fa-angle-double-up:before {\n  content: \"\\f102\"; }\n\n.fa-angle-down:before {\n  content: \"\\f107\"; }\n\n.fa-angle-left:before {\n  content: \"\\f104\"; }\n\n.fa-angle-right:before {\n  content: \"\\f105\"; }\n\n.fa-angle-up:before {\n  content: \"\\f106\"; }\n\n.fa-angry:before {\n  content: \"\\f556\"; }\n\n.fa-angrycreative:before {\n  content: \"\\f36e\"; }\n\n.fa-angular:before {\n  content: \"\\f420\"; }\n\n.fa-ankh:before {\n  content: \"\\f644\"; }\n\n.fa-app-store:before {\n  content: \"\\f36f\"; }\n\n.fa-app-store-ios:before {\n  content: \"\\f370\"; }\n\n.fa-apper:before {\n  content: \"\\f371\"; }\n\n.fa-apple:before {\n  content: \"\\f179\"; }\n\n.fa-apple-alt:before {\n  content: \"\\f5d1\"; }\n\n.fa-apple-pay:before {\n  content: \"\\f415\"; }\n\n.fa-archive:before {\n  content: \"\\f187\"; }\n\n.fa-archway:before {\n  content: \"\\f557\"; }\n\n.fa-arrow-alt-circle-down:before {\n  content: \"\\f358\"; }\n\n.fa-arrow-alt-circle-left:before {\n  content: \"\\f359\"; }\n\n.fa-arrow-alt-circle-right:before {\n  content: \"\\f35a\"; }\n\n.fa-arrow-alt-circle-up:before {\n  content: \"\\f35b\"; }\n\n.fa-arrow-circle-down:before {\n  content: \"\\f0ab\"; }\n\n.fa-arrow-circle-left:before {\n  content: \"\\f0a8\"; }\n\n.fa-arrow-circle-right:before {\n  content: \"\\f0a9\"; }\n\n.fa-arrow-circle-up:before {\n  content: \"\\f0aa\"; }\n\n.fa-arrow-down:before {\n  content: \"\\f063\"; }\n\n.fa-arrow-left:before {\n  content: \"\\f060\"; }\n\n.fa-arrow-right:before {\n  content: \"\\f061\"; }\n\n.fa-arrow-up:before {\n  content: \"\\f062\"; }\n\n.fa-arrows-alt:before {\n  content: \"\\f0b2\"; }\n\n.fa-arrows-alt-h:before {\n  content: \"\\f337\"; }\n\n.fa-arrows-alt-v:before {\n  content: \"\\f338\"; }\n\n.fa-artstation:before {\n  content: \"\\f77a\"; }\n\n.fa-assistive-listening-systems:before {\n  content: \"\\f2a2\"; }\n\n.fa-asterisk:before {\n  content: \"\\f069\"; }\n\n.fa-asymmetrik:before {\n  content: \"\\f372\"; }\n\n.fa-at:before {\n  content: \"\\f1fa\"; }\n\n.fa-atlas:before {\n  content: \"\\f558\"; }\n\n.fa-atlassian:before {\n  content: \"\\f77b\"; }\n\n.fa-atom:before {\n  content: \"\\f5d2\"; }\n\n.fa-audible:before {\n  content: \"\\f373\"; }\n\n.fa-audio-description:before {\n  content: \"\\f29e\"; }\n\n.fa-autoprefixer:before {\n  content: \"\\f41c\"; }\n\n.fa-avianex:before {\n  content: \"\\f374\"; }\n\n.fa-aviato:before {\n  content: \"\\f421\"; }\n\n.fa-award:before {\n  content: \"\\f559\"; }\n\n.fa-aws:before {\n  content: \"\\f375\"; }\n\n.fa-baby:before {\n  content: \"\\f77c\"; }\n\n.fa-baby-carriage:before {\n  content: \"\\f77d\"; }\n\n.fa-backspace:before {\n  content: \"\\f55a\"; }\n\n.fa-backward:before {\n  content: \"\\f04a\"; }\n\n.fa-balance-scale:before {\n  content: \"\\f24e\"; }\n\n.fa-ban:before {\n  content: \"\\f05e\"; }\n\n.fa-band-aid:before {\n  content: \"\\f462\"; }\n\n.fa-bandcamp:before {\n  content: \"\\f2d5\"; }\n\n.fa-barcode:before {\n  content: \"\\f02a\"; }\n\n.fa-bars:before {\n  content: \"\\f0c9\"; }\n\n.fa-baseball-ball:before {\n  content: \"\\f433\"; }\n\n.fa-basketball-ball:before {\n  content: \"\\f434\"; }\n\n.fa-bath:before {\n  content: \"\\f2cd\"; }\n\n.fa-battery-empty:before {\n  content: \"\\f244\"; }\n\n.fa-battery-full:before {\n  content: \"\\f240\"; }\n\n.fa-battery-half:before {\n  content: \"\\f242\"; }\n\n.fa-battery-quarter:before {\n  content: \"\\f243\"; }\n\n.fa-battery-three-quarters:before {\n  content: \"\\f241\"; }\n\n.fa-bed:before {\n  content: \"\\f236\"; }\n\n.fa-beer:before {\n  content: \"\\f0fc\"; }\n\n.fa-behance:before {\n  content: \"\\f1b4\"; }\n\n.fa-behance-square:before {\n  content: \"\\f1b5\"; }\n\n.fa-bell:before {\n  content: \"\\f0f3\"; }\n\n.fa-bell-slash:before {\n  content: \"\\f1f6\"; }\n\n.fa-bezier-curve:before {\n  content: \"\\f55b\"; }\n\n.fa-bible:before {\n  content: \"\\f647\"; }\n\n.fa-bicycle:before {\n  content: \"\\f206\"; }\n\n.fa-bimobject:before {\n  content: \"\\f378\"; }\n\n.fa-binoculars:before {\n  content: \"\\f1e5\"; }\n\n.fa-biohazard:before {\n  content: \"\\f780\"; }\n\n.fa-birthday-cake:before {\n  content: \"\\f1fd\"; }\n\n.fa-bitbucket:before {\n  content: \"\\f171\"; }\n\n.fa-bitcoin:before {\n  content: \"\\f379\"; }\n\n.fa-bity:before {\n  content: \"\\f37a\"; }\n\n.fa-black-tie:before {\n  content: \"\\f27e\"; }\n\n.fa-blackberry:before {\n  content: \"\\f37b\"; }\n\n.fa-blender:before {\n  content: \"\\f517\"; }\n\n.fa-blender-phone:before {\n  content: \"\\f6b6\"; }\n\n.fa-blind:before {\n  content: \"\\f29d\"; }\n\n.fa-blog:before {\n  content: \"\\f781\"; }\n\n.fa-blogger:before {\n  content: \"\\f37c\"; }\n\n.fa-blogger-b:before {\n  content: \"\\f37d\"; }\n\n.fa-bluetooth:before {\n  content: \"\\f293\"; }\n\n.fa-bluetooth-b:before {\n  content: \"\\f294\"; }\n\n.fa-bold:before {\n  content: \"\\f032\"; }\n\n.fa-bolt:before {\n  content: \"\\f0e7\"; }\n\n.fa-bomb:before {\n  content: \"\\f1e2\"; }\n\n.fa-bone:before {\n  content: \"\\f5d7\"; }\n\n.fa-bong:before {\n  content: \"\\f55c\"; }\n\n.fa-book:before {\n  content: \"\\f02d\"; }\n\n.fa-book-dead:before {\n  content: \"\\f6b7\"; }\n\n.fa-book-open:before {\n  content: \"\\f518\"; }\n\n.fa-book-reader:before {\n  content: \"\\f5da\"; }\n\n.fa-bookmark:before {\n  content: \"\\f02e\"; }\n\n.fa-bowling-ball:before {\n  content: \"\\f436\"; }\n\n.fa-box:before {\n  content: \"\\f466\"; }\n\n.fa-box-open:before {\n  content: \"\\f49e\"; }\n\n.fa-boxes:before {\n  content: \"\\f468\"; }\n\n.fa-braille:before {\n  content: \"\\f2a1\"; }\n\n.fa-brain:before {\n  content: \"\\f5dc\"; }\n\n.fa-briefcase:before {\n  content: \"\\f0b1\"; }\n\n.fa-briefcase-medical:before {\n  content: \"\\f469\"; }\n\n.fa-broadcast-tower:before {\n  content: \"\\f519\"; }\n\n.fa-broom:before {\n  content: \"\\f51a\"; }\n\n.fa-brush:before {\n  content: \"\\f55d\"; }\n\n.fa-btc:before {\n  content: \"\\f15a\"; }\n\n.fa-bug:before {\n  content: \"\\f188\"; }\n\n.fa-building:before {\n  content: \"\\f1ad\"; }\n\n.fa-bullhorn:before {\n  content: \"\\f0a1\"; }\n\n.fa-bullseye:before {\n  content: \"\\f140\"; }\n\n.fa-burn:before {\n  content: \"\\f46a\"; }\n\n.fa-buromobelexperte:before {\n  content: \"\\f37f\"; }\n\n.fa-bus:before {\n  content: \"\\f207\"; }\n\n.fa-bus-alt:before {\n  content: \"\\f55e\"; }\n\n.fa-business-time:before {\n  content: \"\\f64a\"; }\n\n.fa-buysellads:before {\n  content: \"\\f20d\"; }\n\n.fa-calculator:before {\n  content: \"\\f1ec\"; }\n\n.fa-calendar:before {\n  content: \"\\f133\"; }\n\n.fa-calendar-alt:before {\n  content: \"\\f073\"; }\n\n.fa-calendar-check:before {\n  content: \"\\f274\"; }\n\n.fa-calendar-day:before {\n  content: \"\\f783\"; }\n\n.fa-calendar-minus:before {\n  content: \"\\f272\"; }\n\n.fa-calendar-plus:before {\n  content: \"\\f271\"; }\n\n.fa-calendar-times:before {\n  content: \"\\f273\"; }\n\n.fa-calendar-week:before {\n  content: \"\\f784\"; }\n\n.fa-camera:before {\n  content: \"\\f030\"; }\n\n.fa-camera-retro:before {\n  content: \"\\f083\"; }\n\n.fa-campground:before {\n  content: \"\\f6bb\"; }\n\n.fa-canadian-maple-leaf:before {\n  content: \"\\f785\"; }\n\n.fa-candy-cane:before {\n  content: \"\\f786\"; }\n\n.fa-cannabis:before {\n  content: \"\\f55f\"; }\n\n.fa-capsules:before {\n  content: \"\\f46b\"; }\n\n.fa-car:before {\n  content: \"\\f1b9\"; }\n\n.fa-car-alt:before {\n  content: \"\\f5de\"; }\n\n.fa-car-battery:before {\n  content: \"\\f5df\"; }\n\n.fa-car-crash:before {\n  content: \"\\f5e1\"; }\n\n.fa-car-side:before {\n  content: \"\\f5e4\"; }\n\n.fa-caret-down:before {\n  content: \"\\f0d7\"; }\n\n.fa-caret-left:before {\n  content: \"\\f0d9\"; }\n\n.fa-caret-right:before {\n  content: \"\\f0da\"; }\n\n.fa-caret-square-down:before {\n  content: \"\\f150\"; }\n\n.fa-caret-square-left:before {\n  content: \"\\f191\"; }\n\n.fa-caret-square-right:before {\n  content: \"\\f152\"; }\n\n.fa-caret-square-up:before {\n  content: \"\\f151\"; }\n\n.fa-caret-up:before {\n  content: \"\\f0d8\"; }\n\n.fa-carrot:before {\n  content: \"\\f787\"; }\n\n.fa-cart-arrow-down:before {\n  content: \"\\f218\"; }\n\n.fa-cart-plus:before {\n  content: \"\\f217\"; }\n\n.fa-cash-register:before {\n  content: \"\\f788\"; }\n\n.fa-cat:before {\n  content: \"\\f6be\"; }\n\n.fa-cc-amazon-pay:before {\n  content: \"\\f42d\"; }\n\n.fa-cc-amex:before {\n  content: \"\\f1f3\"; }\n\n.fa-cc-apple-pay:before {\n  content: \"\\f416\"; }\n\n.fa-cc-diners-club:before {\n  content: \"\\f24c\"; }\n\n.fa-cc-discover:before {\n  content: \"\\f1f2\"; }\n\n.fa-cc-jcb:before {\n  content: \"\\f24b\"; }\n\n.fa-cc-mastercard:before {\n  content: \"\\f1f1\"; }\n\n.fa-cc-paypal:before {\n  content: \"\\f1f4\"; }\n\n.fa-cc-stripe:before {\n  content: \"\\f1f5\"; }\n\n.fa-cc-visa:before {\n  content: \"\\f1f0\"; }\n\n.fa-centercode:before {\n  content: \"\\f380\"; }\n\n.fa-centos:before {\n  content: \"\\f789\"; }\n\n.fa-certificate:before {\n  content: \"\\f0a3\"; }\n\n.fa-chair:before {\n  content: \"\\f6c0\"; }\n\n.fa-chalkboard:before {\n  content: \"\\f51b\"; }\n\n.fa-chalkboard-teacher:before {\n  content: \"\\f51c\"; }\n\n.fa-charging-station:before {\n  content: \"\\f5e7\"; }\n\n.fa-chart-area:before {\n  content: \"\\f1fe\"; }\n\n.fa-chart-bar:before {\n  content: \"\\f080\"; }\n\n.fa-chart-line:before {\n  content: \"\\f201\"; }\n\n.fa-chart-pie:before {\n  content: \"\\f200\"; }\n\n.fa-check:before {\n  content: \"\\f00c\"; }\n\n.fa-check-circle:before {\n  content: \"\\f058\"; }\n\n.fa-check-double:before {\n  content: \"\\f560\"; }\n\n.fa-check-square:before {\n  content: \"\\f14a\"; }\n\n.fa-chess:before {\n  content: \"\\f439\"; }\n\n.fa-chess-bishop:before {\n  content: \"\\f43a\"; }\n\n.fa-chess-board:before {\n  content: \"\\f43c\"; }\n\n.fa-chess-king:before {\n  content: \"\\f43f\"; }\n\n.fa-chess-knight:before {\n  content: \"\\f441\"; }\n\n.fa-chess-pawn:before {\n  content: \"\\f443\"; }\n\n.fa-chess-queen:before {\n  content: \"\\f445\"; }\n\n.fa-chess-rook:before {\n  content: \"\\f447\"; }\n\n.fa-chevron-circle-down:before {\n  content: \"\\f13a\"; }\n\n.fa-chevron-circle-left:before {\n  content: \"\\f137\"; }\n\n.fa-chevron-circle-right:before {\n  content: \"\\f138\"; }\n\n.fa-chevron-circle-up:before {\n  content: \"\\f139\"; }\n\n.fa-chevron-down:before {\n  content: \"\\f078\"; }\n\n.fa-chevron-left:before {\n  content: \"\\f053\"; }\n\n.fa-chevron-right:before {\n  content: \"\\f054\"; }\n\n.fa-chevron-up:before {\n  content: \"\\f077\"; }\n\n.fa-child:before {\n  content: \"\\f1ae\"; }\n\n.fa-chrome:before {\n  content: \"\\f268\"; }\n\n.fa-church:before {\n  content: \"\\f51d\"; }\n\n.fa-circle:before {\n  content: \"\\f111\"; }\n\n.fa-circle-notch:before {\n  content: \"\\f1ce\"; }\n\n.fa-city:before {\n  content: \"\\f64f\"; }\n\n.fa-clipboard:before {\n  content: \"\\f328\"; }\n\n.fa-clipboard-check:before {\n  content: \"\\f46c\"; }\n\n.fa-clipboard-list:before {\n  content: \"\\f46d\"; }\n\n.fa-clock:before {\n  content: \"\\f017\"; }\n\n.fa-clone:before {\n  content: \"\\f24d\"; }\n\n.fa-closed-captioning:before {\n  content: \"\\f20a\"; }\n\n.fa-cloud:before {\n  content: \"\\f0c2\"; }\n\n.fa-cloud-download-alt:before {\n  content: \"\\f381\"; }\n\n.fa-cloud-meatball:before {\n  content: \"\\f73b\"; }\n\n.fa-cloud-moon:before {\n  content: \"\\f6c3\"; }\n\n.fa-cloud-moon-rain:before {\n  content: \"\\f73c\"; }\n\n.fa-cloud-rain:before {\n  content: \"\\f73d\"; }\n\n.fa-cloud-showers-heavy:before {\n  content: \"\\f740\"; }\n\n.fa-cloud-sun:before {\n  content: \"\\f6c4\"; }\n\n.fa-cloud-sun-rain:before {\n  content: \"\\f743\"; }\n\n.fa-cloud-upload-alt:before {\n  content: \"\\f382\"; }\n\n.fa-cloudscale:before {\n  content: \"\\f383\"; }\n\n.fa-cloudsmith:before {\n  content: \"\\f384\"; }\n\n.fa-cloudversify:before {\n  content: \"\\f385\"; }\n\n.fa-cocktail:before {\n  content: \"\\f561\"; }\n\n.fa-code:before {\n  content: \"\\f121\"; }\n\n.fa-code-branch:before {\n  content: \"\\f126\"; }\n\n.fa-codepen:before {\n  content: \"\\f1cb\"; }\n\n.fa-codiepie:before {\n  content: \"\\f284\"; }\n\n.fa-coffee:before {\n  content: \"\\f0f4\"; }\n\n.fa-cog:before {\n  content: \"\\f013\"; }\n\n.fa-cogs:before {\n  content: \"\\f085\"; }\n\n.fa-coins:before {\n  content: \"\\f51e\"; }\n\n.fa-columns:before {\n  content: \"\\f0db\"; }\n\n.fa-comment:before {\n  content: \"\\f075\"; }\n\n.fa-comment-alt:before {\n  content: \"\\f27a\"; }\n\n.fa-comment-dollar:before {\n  content: \"\\f651\"; }\n\n.fa-comment-dots:before {\n  content: \"\\f4ad\"; }\n\n.fa-comment-slash:before {\n  content: \"\\f4b3\"; }\n\n.fa-comments:before {\n  content: \"\\f086\"; }\n\n.fa-comments-dollar:before {\n  content: \"\\f653\"; }\n\n.fa-compact-disc:before {\n  content: \"\\f51f\"; }\n\n.fa-compass:before {\n  content: \"\\f14e\"; }\n\n.fa-compress:before {\n  content: \"\\f066\"; }\n\n.fa-compress-arrows-alt:before {\n  content: \"\\f78c\"; }\n\n.fa-concierge-bell:before {\n  content: \"\\f562\"; }\n\n.fa-confluence:before {\n  content: \"\\f78d\"; }\n\n.fa-connectdevelop:before {\n  content: \"\\f20e\"; }\n\n.fa-contao:before {\n  content: \"\\f26d\"; }\n\n.fa-cookie:before {\n  content: \"\\f563\"; }\n\n.fa-cookie-bite:before {\n  content: \"\\f564\"; }\n\n.fa-copy:before {\n  content: \"\\f0c5\"; }\n\n.fa-copyright:before {\n  content: \"\\f1f9\"; }\n\n.fa-couch:before {\n  content: \"\\f4b8\"; }\n\n.fa-cpanel:before {\n  content: \"\\f388\"; }\n\n.fa-creative-commons:before {\n  content: \"\\f25e\"; }\n\n.fa-creative-commons-by:before {\n  content: \"\\f4e7\"; }\n\n.fa-creative-commons-nc:before {\n  content: \"\\f4e8\"; }\n\n.fa-creative-commons-nc-eu:before {\n  content: \"\\f4e9\"; }\n\n.fa-creative-commons-nc-jp:before {\n  content: \"\\f4ea\"; }\n\n.fa-creative-commons-nd:before {\n  content: \"\\f4eb\"; }\n\n.fa-creative-commons-pd:before {\n  content: \"\\f4ec\"; }\n\n.fa-creative-commons-pd-alt:before {\n  content: \"\\f4ed\"; }\n\n.fa-creative-commons-remix:before {\n  content: \"\\f4ee\"; }\n\n.fa-creative-commons-sa:before {\n  content: \"\\f4ef\"; }\n\n.fa-creative-commons-sampling:before {\n  content: \"\\f4f0\"; }\n\n.fa-creative-commons-sampling-plus:before {\n  content: \"\\f4f1\"; }\n\n.fa-creative-commons-share:before {\n  content: \"\\f4f2\"; }\n\n.fa-creative-commons-zero:before {\n  content: \"\\f4f3\"; }\n\n.fa-credit-card:before {\n  content: \"\\f09d\"; }\n\n.fa-critical-role:before {\n  content: \"\\f6c9\"; }\n\n.fa-crop:before {\n  content: \"\\f125\"; }\n\n.fa-crop-alt:before {\n  content: \"\\f565\"; }\n\n.fa-cross:before {\n  content: \"\\f654\"; }\n\n.fa-crosshairs:before {\n  content: \"\\f05b\"; }\n\n.fa-crow:before {\n  content: \"\\f520\"; }\n\n.fa-crown:before {\n  content: \"\\f521\"; }\n\n.fa-css3:before {\n  content: \"\\f13c\"; }\n\n.fa-css3-alt:before {\n  content: \"\\f38b\"; }\n\n.fa-cube:before {\n  content: \"\\f1b2\"; }\n\n.fa-cubes:before {\n  content: \"\\f1b3\"; }\n\n.fa-cut:before {\n  content: \"\\f0c4\"; }\n\n.fa-cuttlefish:before {\n  content: \"\\f38c\"; }\n\n.fa-d-and-d:before {\n  content: \"\\f38d\"; }\n\n.fa-d-and-d-beyond:before {\n  content: \"\\f6ca\"; }\n\n.fa-dashcube:before {\n  content: \"\\f210\"; }\n\n.fa-database:before {\n  content: \"\\f1c0\"; }\n\n.fa-deaf:before {\n  content: \"\\f2a4\"; }\n\n.fa-delicious:before {\n  content: \"\\f1a5\"; }\n\n.fa-democrat:before {\n  content: \"\\f747\"; }\n\n.fa-deploydog:before {\n  content: \"\\f38e\"; }\n\n.fa-deskpro:before {\n  content: \"\\f38f\"; }\n\n.fa-desktop:before {\n  content: \"\\f108\"; }\n\n.fa-dev:before {\n  content: \"\\f6cc\"; }\n\n.fa-deviantart:before {\n  content: \"\\f1bd\"; }\n\n.fa-dharmachakra:before {\n  content: \"\\f655\"; }\n\n.fa-dhl:before {\n  content: \"\\f790\"; }\n\n.fa-diagnoses:before {\n  content: \"\\f470\"; }\n\n.fa-diaspora:before {\n  content: \"\\f791\"; }\n\n.fa-dice:before {\n  content: \"\\f522\"; }\n\n.fa-dice-d20:before {\n  content: \"\\f6cf\"; }\n\n.fa-dice-d6:before {\n  content: \"\\f6d1\"; }\n\n.fa-dice-five:before {\n  content: \"\\f523\"; }\n\n.fa-dice-four:before {\n  content: \"\\f524\"; }\n\n.fa-dice-one:before {\n  content: \"\\f525\"; }\n\n.fa-dice-six:before {\n  content: \"\\f526\"; }\n\n.fa-dice-three:before {\n  content: \"\\f527\"; }\n\n.fa-dice-two:before {\n  content: \"\\f528\"; }\n\n.fa-digg:before {\n  content: \"\\f1a6\"; }\n\n.fa-digital-ocean:before {\n  content: \"\\f391\"; }\n\n.fa-digital-tachograph:before {\n  content: \"\\f566\"; }\n\n.fa-directions:before {\n  content: \"\\f5eb\"; }\n\n.fa-discord:before {\n  content: \"\\f392\"; }\n\n.fa-discourse:before {\n  content: \"\\f393\"; }\n\n.fa-divide:before {\n  content: \"\\f529\"; }\n\n.fa-dizzy:before {\n  content: \"\\f567\"; }\n\n.fa-dna:before {\n  content: \"\\f471\"; }\n\n.fa-dochub:before {\n  content: \"\\f394\"; }\n\n.fa-docker:before {\n  content: \"\\f395\"; }\n\n.fa-dog:before {\n  content: \"\\f6d3\"; }\n\n.fa-dollar-sign:before {\n  content: \"\\f155\"; }\n\n.fa-dolly:before {\n  content: \"\\f472\"; }\n\n.fa-dolly-flatbed:before {\n  content: \"\\f474\"; }\n\n.fa-donate:before {\n  content: \"\\f4b9\"; }\n\n.fa-door-closed:before {\n  content: \"\\f52a\"; }\n\n.fa-door-open:before {\n  content: \"\\f52b\"; }\n\n.fa-dot-circle:before {\n  content: \"\\f192\"; }\n\n.fa-dove:before {\n  content: \"\\f4ba\"; }\n\n.fa-download:before {\n  content: \"\\f019\"; }\n\n.fa-draft2digital:before {\n  content: \"\\f396\"; }\n\n.fa-drafting-compass:before {\n  content: \"\\f568\"; }\n\n.fa-dragon:before {\n  content: \"\\f6d5\"; }\n\n.fa-draw-polygon:before {\n  content: \"\\f5ee\"; }\n\n.fa-dribbble:before {\n  content: \"\\f17d\"; }\n\n.fa-dribbble-square:before {\n  content: \"\\f397\"; }\n\n.fa-dropbox:before {\n  content: \"\\f16b\"; }\n\n.fa-drum:before {\n  content: \"\\f569\"; }\n\n.fa-drum-steelpan:before {\n  content: \"\\f56a\"; }\n\n.fa-drumstick-bite:before {\n  content: \"\\f6d7\"; }\n\n.fa-drupal:before {\n  content: \"\\f1a9\"; }\n\n.fa-dumbbell:before {\n  content: \"\\f44b\"; }\n\n.fa-dumpster:before {\n  content: \"\\f793\"; }\n\n.fa-dumpster-fire:before {\n  content: \"\\f794\"; }\n\n.fa-dungeon:before {\n  content: \"\\f6d9\"; }\n\n.fa-dyalog:before {\n  content: \"\\f399\"; }\n\n.fa-earlybirds:before {\n  content: \"\\f39a\"; }\n\n.fa-ebay:before {\n  content: \"\\f4f4\"; }\n\n.fa-edge:before {\n  content: \"\\f282\"; }\n\n.fa-edit:before {\n  content: \"\\f044\"; }\n\n.fa-eject:before {\n  content: \"\\f052\"; }\n\n.fa-elementor:before {\n  content: \"\\f430\"; }\n\n.fa-ellipsis-h:before {\n  content: \"\\f141\"; }\n\n.fa-ellipsis-v:before {\n  content: \"\\f142\"; }\n\n.fa-ello:before {\n  content: \"\\f5f1\"; }\n\n.fa-ember:before {\n  content: \"\\f423\"; }\n\n.fa-empire:before {\n  content: \"\\f1d1\"; }\n\n.fa-envelope:before {\n  content: \"\\f0e0\"; }\n\n.fa-envelope-open:before {\n  content: \"\\f2b6\"; }\n\n.fa-envelope-open-text:before {\n  content: \"\\f658\"; }\n\n.fa-envelope-square:before {\n  content: \"\\f199\"; }\n\n.fa-envira:before {\n  content: \"\\f299\"; }\n\n.fa-equals:before {\n  content: \"\\f52c\"; }\n\n.fa-eraser:before {\n  content: \"\\f12d\"; }\n\n.fa-erlang:before {\n  content: \"\\f39d\"; }\n\n.fa-ethereum:before {\n  content: \"\\f42e\"; }\n\n.fa-ethernet:before {\n  content: \"\\f796\"; }\n\n.fa-etsy:before {\n  content: \"\\f2d7\"; }\n\n.fa-euro-sign:before {\n  content: \"\\f153\"; }\n\n.fa-exchange-alt:before {\n  content: \"\\f362\"; }\n\n.fa-exclamation:before {\n  content: \"\\f12a\"; }\n\n.fa-exclamation-circle:before {\n  content: \"\\f06a\"; }\n\n.fa-exclamation-triangle:before {\n  content: \"\\f071\"; }\n\n.fa-expand:before {\n  content: \"\\f065\"; }\n\n.fa-expand-arrows-alt:before {\n  content: \"\\f31e\"; }\n\n.fa-expeditedssl:before {\n  content: \"\\f23e\"; }\n\n.fa-external-link-alt:before {\n  content: \"\\f35d\"; }\n\n.fa-external-link-square-alt:before {\n  content: \"\\f360\"; }\n\n.fa-eye:before {\n  content: \"\\f06e\"; }\n\n.fa-eye-dropper:before {\n  content: \"\\f1fb\"; }\n\n.fa-eye-slash:before {\n  content: \"\\f070\"; }\n\n.fa-facebook:before {\n  content: \"\\f09a\"; }\n\n.fa-facebook-f:before {\n  content: \"\\f39e\"; }\n\n.fa-facebook-messenger:before {\n  content: \"\\f39f\"; }\n\n.fa-facebook-square:before {\n  content: \"\\f082\"; }\n\n.fa-fantasy-flight-games:before {\n  content: \"\\f6dc\"; }\n\n.fa-fast-backward:before {\n  content: \"\\f049\"; }\n\n.fa-fast-forward:before {\n  content: \"\\f050\"; }\n\n.fa-fax:before {\n  content: \"\\f1ac\"; }\n\n.fa-feather:before {\n  content: \"\\f52d\"; }\n\n.fa-feather-alt:before {\n  content: \"\\f56b\"; }\n\n.fa-fedex:before {\n  content: \"\\f797\"; }\n\n.fa-fedora:before {\n  content: \"\\f798\"; }\n\n.fa-female:before {\n  content: \"\\f182\"; }\n\n.fa-fighter-jet:before {\n  content: \"\\f0fb\"; }\n\n.fa-figma:before {\n  content: \"\\f799\"; }\n\n.fa-file:before {\n  content: \"\\f15b\"; }\n\n.fa-file-alt:before {\n  content: \"\\f15c\"; }\n\n.fa-file-archive:before {\n  content: \"\\f1c6\"; }\n\n.fa-file-audio:before {\n  content: \"\\f1c7\"; }\n\n.fa-file-code:before {\n  content: \"\\f1c9\"; }\n\n.fa-file-contract:before {\n  content: \"\\f56c\"; }\n\n.fa-file-csv:before {\n  content: \"\\f6dd\"; }\n\n.fa-file-download:before {\n  content: \"\\f56d\"; }\n\n.fa-file-excel:before {\n  content: \"\\f1c3\"; }\n\n.fa-file-export:before {\n  content: \"\\f56e\"; }\n\n.fa-file-image:before {\n  content: \"\\f1c5\"; }\n\n.fa-file-import:before {\n  content: \"\\f56f\"; }\n\n.fa-file-invoice:before {\n  content: \"\\f570\"; }\n\n.fa-file-invoice-dollar:before {\n  content: \"\\f571\"; }\n\n.fa-file-medical:before {\n  content: \"\\f477\"; }\n\n.fa-file-medical-alt:before {\n  content: \"\\f478\"; }\n\n.fa-file-pdf:before {\n  content: \"\\f1c1\"; }\n\n.fa-file-powerpoint:before {\n  content: \"\\f1c4\"; }\n\n.fa-file-prescription:before {\n  content: \"\\f572\"; }\n\n.fa-file-signature:before {\n  content: \"\\f573\"; }\n\n.fa-file-upload:before {\n  content: \"\\f574\"; }\n\n.fa-file-video:before {\n  content: \"\\f1c8\"; }\n\n.fa-file-word:before {\n  content: \"\\f1c2\"; }\n\n.fa-fill:before {\n  content: \"\\f575\"; }\n\n.fa-fill-drip:before {\n  content: \"\\f576\"; }\n\n.fa-film:before {\n  content: \"\\f008\"; }\n\n.fa-filter:before {\n  content: \"\\f0b0\"; }\n\n.fa-fingerprint:before {\n  content: \"\\f577\"; }\n\n.fa-fire:before {\n  content: \"\\f06d\"; }\n\n.fa-fire-alt:before {\n  content: \"\\f7e4\"; }\n\n.fa-fire-extinguisher:before {\n  content: \"\\f134\"; }\n\n.fa-firefox:before {\n  content: \"\\f269\"; }\n\n.fa-first-aid:before {\n  content: \"\\f479\"; }\n\n.fa-first-order:before {\n  content: \"\\f2b0\"; }\n\n.fa-first-order-alt:before {\n  content: \"\\f50a\"; }\n\n.fa-firstdraft:before {\n  content: \"\\f3a1\"; }\n\n.fa-fish:before {\n  content: \"\\f578\"; }\n\n.fa-fist-raised:before {\n  content: \"\\f6de\"; }\n\n.fa-flag:before {\n  content: \"\\f024\"; }\n\n.fa-flag-checkered:before {\n  content: \"\\f11e\"; }\n\n.fa-flag-usa:before {\n  content: \"\\f74d\"; }\n\n.fa-flask:before {\n  content: \"\\f0c3\"; }\n\n.fa-flickr:before {\n  content: \"\\f16e\"; }\n\n.fa-flipboard:before {\n  content: \"\\f44d\"; }\n\n.fa-flushed:before {\n  content: \"\\f579\"; }\n\n.fa-fly:before {\n  content: \"\\f417\"; }\n\n.fa-folder:before {\n  content: \"\\f07b\"; }\n\n.fa-folder-minus:before {\n  content: \"\\f65d\"; }\n\n.fa-folder-open:before {\n  content: \"\\f07c\"; }\n\n.fa-folder-plus:before {\n  content: \"\\f65e\"; }\n\n.fa-font:before {\n  content: \"\\f031\"; }\n\n.fa-font-awesome:before {\n  content: \"\\f2b4\"; }\n\n.fa-font-awesome-alt:before {\n  content: \"\\f35c\"; }\n\n.fa-font-awesome-flag:before {\n  content: \"\\f425\"; }\n\n.fa-font-awesome-logo-full:before {\n  content: \"\\f4e6\"; }\n\n.fa-fonticons:before {\n  content: \"\\f280\"; }\n\n.fa-fonticons-fi:before {\n  content: \"\\f3a2\"; }\n\n.fa-football-ball:before {\n  content: \"\\f44e\"; }\n\n.fa-fort-awesome:before {\n  content: \"\\f286\"; }\n\n.fa-fort-awesome-alt:before {\n  content: \"\\f3a3\"; }\n\n.fa-forumbee:before {\n  content: \"\\f211\"; }\n\n.fa-forward:before {\n  content: \"\\f04e\"; }\n\n.fa-foursquare:before {\n  content: \"\\f180\"; }\n\n.fa-free-code-camp:before {\n  content: \"\\f2c5\"; }\n\n.fa-freebsd:before {\n  content: \"\\f3a4\"; }\n\n.fa-frog:before {\n  content: \"\\f52e\"; }\n\n.fa-frown:before {\n  content: \"\\f119\"; }\n\n.fa-frown-open:before {\n  content: \"\\f57a\"; }\n\n.fa-fulcrum:before {\n  content: \"\\f50b\"; }\n\n.fa-funnel-dollar:before {\n  content: \"\\f662\"; }\n\n.fa-futbol:before {\n  content: \"\\f1e3\"; }\n\n.fa-galactic-republic:before {\n  content: \"\\f50c\"; }\n\n.fa-galactic-senate:before {\n  content: \"\\f50d\"; }\n\n.fa-gamepad:before {\n  content: \"\\f11b\"; }\n\n.fa-gas-pump:before {\n  content: \"\\f52f\"; }\n\n.fa-gavel:before {\n  content: \"\\f0e3\"; }\n\n.fa-gem:before {\n  content: \"\\f3a5\"; }\n\n.fa-genderless:before {\n  content: \"\\f22d\"; }\n\n.fa-get-pocket:before {\n  content: \"\\f265\"; }\n\n.fa-gg:before {\n  content: \"\\f260\"; }\n\n.fa-gg-circle:before {\n  content: \"\\f261\"; }\n\n.fa-ghost:before {\n  content: \"\\f6e2\"; }\n\n.fa-gift:before {\n  content: \"\\f06b\"; }\n\n.fa-gifts:before {\n  content: \"\\f79c\"; }\n\n.fa-git:before {\n  content: \"\\f1d3\"; }\n\n.fa-git-square:before {\n  content: \"\\f1d2\"; }\n\n.fa-github:before {\n  content: \"\\f09b\"; }\n\n.fa-github-alt:before {\n  content: \"\\f113\"; }\n\n.fa-github-square:before {\n  content: \"\\f092\"; }\n\n.fa-gitkraken:before {\n  content: \"\\f3a6\"; }\n\n.fa-gitlab:before {\n  content: \"\\f296\"; }\n\n.fa-gitter:before {\n  content: \"\\f426\"; }\n\n.fa-glass-cheers:before {\n  content: \"\\f79f\"; }\n\n.fa-glass-martini:before {\n  content: \"\\f000\"; }\n\n.fa-glass-martini-alt:before {\n  content: \"\\f57b\"; }\n\n.fa-glass-whiskey:before {\n  content: \"\\f7a0\"; }\n\n.fa-glasses:before {\n  content: \"\\f530\"; }\n\n.fa-glide:before {\n  content: \"\\f2a5\"; }\n\n.fa-glide-g:before {\n  content: \"\\f2a6\"; }\n\n.fa-globe:before {\n  content: \"\\f0ac\"; }\n\n.fa-globe-africa:before {\n  content: \"\\f57c\"; }\n\n.fa-globe-americas:before {\n  content: \"\\f57d\"; }\n\n.fa-globe-asia:before {\n  content: \"\\f57e\"; }\n\n.fa-globe-europe:before {\n  content: \"\\f7a2\"; }\n\n.fa-gofore:before {\n  content: \"\\f3a7\"; }\n\n.fa-golf-ball:before {\n  content: \"\\f450\"; }\n\n.fa-goodreads:before {\n  content: \"\\f3a8\"; }\n\n.fa-goodreads-g:before {\n  content: \"\\f3a9\"; }\n\n.fa-google:before {\n  content: \"\\f1a0\"; }\n\n.fa-google-drive:before {\n  content: \"\\f3aa\"; }\n\n.fa-google-play:before {\n  content: \"\\f3ab\"; }\n\n.fa-google-plus:before {\n  content: \"\\f2b3\"; }\n\n.fa-google-plus-g:before {\n  content: \"\\f0d5\"; }\n\n.fa-google-plus-square:before {\n  content: \"\\f0d4\"; }\n\n.fa-google-wallet:before {\n  content: \"\\f1ee\"; }\n\n.fa-gopuram:before {\n  content: \"\\f664\"; }\n\n.fa-graduation-cap:before {\n  content: \"\\f19d\"; }\n\n.fa-gratipay:before {\n  content: \"\\f184\"; }\n\n.fa-grav:before {\n  content: \"\\f2d6\"; }\n\n.fa-greater-than:before {\n  content: \"\\f531\"; }\n\n.fa-greater-than-equal:before {\n  content: \"\\f532\"; }\n\n.fa-grimace:before {\n  content: \"\\f57f\"; }\n\n.fa-grin:before {\n  content: \"\\f580\"; }\n\n.fa-grin-alt:before {\n  content: \"\\f581\"; }\n\n.fa-grin-beam:before {\n  content: \"\\f582\"; }\n\n.fa-grin-beam-sweat:before {\n  content: \"\\f583\"; }\n\n.fa-grin-hearts:before {\n  content: \"\\f584\"; }\n\n.fa-grin-squint:before {\n  content: \"\\f585\"; }\n\n.fa-grin-squint-tears:before {\n  content: \"\\f586\"; }\n\n.fa-grin-stars:before {\n  content: \"\\f587\"; }\n\n.fa-grin-tears:before {\n  content: \"\\f588\"; }\n\n.fa-grin-tongue:before {\n  content: \"\\f589\"; }\n\n.fa-grin-tongue-squint:before {\n  content: \"\\f58a\"; }\n\n.fa-grin-tongue-wink:before {\n  content: \"\\f58b\"; }\n\n.fa-grin-wink:before {\n  content: \"\\f58c\"; }\n\n.fa-grip-horizontal:before {\n  content: \"\\f58d\"; }\n\n.fa-grip-lines:before {\n  content: \"\\f7a4\"; }\n\n.fa-grip-lines-vertical:before {\n  content: \"\\f7a5\"; }\n\n.fa-grip-vertical:before {\n  content: \"\\f58e\"; }\n\n.fa-gripfire:before {\n  content: \"\\f3ac\"; }\n\n.fa-grunt:before {\n  content: \"\\f3ad\"; }\n\n.fa-guitar:before {\n  content: \"\\f7a6\"; }\n\n.fa-gulp:before {\n  content: \"\\f3ae\"; }\n\n.fa-h-square:before {\n  content: \"\\f0fd\"; }\n\n.fa-hacker-news:before {\n  content: \"\\f1d4\"; }\n\n.fa-hacker-news-square:before {\n  content: \"\\f3af\"; }\n\n.fa-hackerrank:before {\n  content: \"\\f5f7\"; }\n\n.fa-hammer:before {\n  content: \"\\f6e3\"; }\n\n.fa-hamsa:before {\n  content: \"\\f665\"; }\n\n.fa-hand-holding:before {\n  content: \"\\f4bd\"; }\n\n.fa-hand-holding-heart:before {\n  content: \"\\f4be\"; }\n\n.fa-hand-holding-usd:before {\n  content: \"\\f4c0\"; }\n\n.fa-hand-lizard:before {\n  content: \"\\f258\"; }\n\n.fa-hand-paper:before {\n  content: \"\\f256\"; }\n\n.fa-hand-peace:before {\n  content: \"\\f25b\"; }\n\n.fa-hand-point-down:before {\n  content: \"\\f0a7\"; }\n\n.fa-hand-point-left:before {\n  content: \"\\f0a5\"; }\n\n.fa-hand-point-right:before {\n  content: \"\\f0a4\"; }\n\n.fa-hand-point-up:before {\n  content: \"\\f0a6\"; }\n\n.fa-hand-pointer:before {\n  content: \"\\f25a\"; }\n\n.fa-hand-rock:before {\n  content: \"\\f255\"; }\n\n.fa-hand-scissors:before {\n  content: \"\\f257\"; }\n\n.fa-hand-spock:before {\n  content: \"\\f259\"; }\n\n.fa-hands:before {\n  content: \"\\f4c2\"; }\n\n.fa-hands-helping:before {\n  content: \"\\f4c4\"; }\n\n.fa-handshake:before {\n  content: \"\\f2b5\"; }\n\n.fa-hanukiah:before {\n  content: \"\\f6e6\"; }\n\n.fa-hashtag:before {\n  content: \"\\f292\"; }\n\n.fa-hat-wizard:before {\n  content: \"\\f6e8\"; }\n\n.fa-haykal:before {\n  content: \"\\f666\"; }\n\n.fa-hdd:before {\n  content: \"\\f0a0\"; }\n\n.fa-heading:before {\n  content: \"\\f1dc\"; }\n\n.fa-headphones:before {\n  content: \"\\f025\"; }\n\n.fa-headphones-alt:before {\n  content: \"\\f58f\"; }\n\n.fa-headset:before {\n  content: \"\\f590\"; }\n\n.fa-heart:before {\n  content: \"\\f004\"; }\n\n.fa-heart-broken:before {\n  content: \"\\f7a9\"; }\n\n.fa-heartbeat:before {\n  content: \"\\f21e\"; }\n\n.fa-helicopter:before {\n  content: \"\\f533\"; }\n\n.fa-highlighter:before {\n  content: \"\\f591\"; }\n\n.fa-hiking:before {\n  content: \"\\f6ec\"; }\n\n.fa-hippo:before {\n  content: \"\\f6ed\"; }\n\n.fa-hips:before {\n  content: \"\\f452\"; }\n\n.fa-hire-a-helper:before {\n  content: \"\\f3b0\"; }\n\n.fa-history:before {\n  content: \"\\f1da\"; }\n\n.fa-hockey-puck:before {\n  content: \"\\f453\"; }\n\n.fa-holly-berry:before {\n  content: \"\\f7aa\"; }\n\n.fa-home:before {\n  content: \"\\f015\"; }\n\n.fa-hooli:before {\n  content: \"\\f427\"; }\n\n.fa-hornbill:before {\n  content: \"\\f592\"; }\n\n.fa-horse:before {\n  content: \"\\f6f0\"; }\n\n.fa-horse-head:before {\n  content: \"\\f7ab\"; }\n\n.fa-hospital:before {\n  content: \"\\f0f8\"; }\n\n.fa-hospital-alt:before {\n  content: \"\\f47d\"; }\n\n.fa-hospital-symbol:before {\n  content: \"\\f47e\"; }\n\n.fa-hot-tub:before {\n  content: \"\\f593\"; }\n\n.fa-hotel:before {\n  content: \"\\f594\"; }\n\n.fa-hotjar:before {\n  content: \"\\f3b1\"; }\n\n.fa-hourglass:before {\n  content: \"\\f254\"; }\n\n.fa-hourglass-end:before {\n  content: \"\\f253\"; }\n\n.fa-hourglass-half:before {\n  content: \"\\f252\"; }\n\n.fa-hourglass-start:before {\n  content: \"\\f251\"; }\n\n.fa-house-damage:before {\n  content: \"\\f6f1\"; }\n\n.fa-houzz:before {\n  content: \"\\f27c\"; }\n\n.fa-hryvnia:before {\n  content: \"\\f6f2\"; }\n\n.fa-html5:before {\n  content: \"\\f13b\"; }\n\n.fa-hubspot:before {\n  content: \"\\f3b2\"; }\n\n.fa-i-cursor:before {\n  content: \"\\f246\"; }\n\n.fa-icicles:before {\n  content: \"\\f7ad\"; }\n\n.fa-id-badge:before {\n  content: \"\\f2c1\"; }\n\n.fa-id-card:before {\n  content: \"\\f2c2\"; }\n\n.fa-id-card-alt:before {\n  content: \"\\f47f\"; }\n\n.fa-igloo:before {\n  content: \"\\f7ae\"; }\n\n.fa-image:before {\n  content: \"\\f03e\"; }\n\n.fa-images:before {\n  content: \"\\f302\"; }\n\n.fa-imdb:before {\n  content: \"\\f2d8\"; }\n\n.fa-inbox:before {\n  content: \"\\f01c\"; }\n\n.fa-indent:before {\n  content: \"\\f03c\"; }\n\n.fa-industry:before {\n  content: \"\\f275\"; }\n\n.fa-infinity:before {\n  content: \"\\f534\"; }\n\n.fa-info:before {\n  content: \"\\f129\"; }\n\n.fa-info-circle:before {\n  content: \"\\f05a\"; }\n\n.fa-instagram:before {\n  content: \"\\f16d\"; }\n\n.fa-intercom:before {\n  content: \"\\f7af\"; }\n\n.fa-internet-explorer:before {\n  content: \"\\f26b\"; }\n\n.fa-invision:before {\n  content: \"\\f7b0\"; }\n\n.fa-ioxhost:before {\n  content: \"\\f208\"; }\n\n.fa-italic:before {\n  content: \"\\f033\"; }\n\n.fa-itunes:before {\n  content: \"\\f3b4\"; }\n\n.fa-itunes-note:before {\n  content: \"\\f3b5\"; }\n\n.fa-java:before {\n  content: \"\\f4e4\"; }\n\n.fa-jedi:before {\n  content: \"\\f669\"; }\n\n.fa-jedi-order:before {\n  content: \"\\f50e\"; }\n\n.fa-jenkins:before {\n  content: \"\\f3b6\"; }\n\n.fa-jira:before {\n  content: \"\\f7b1\"; }\n\n.fa-joget:before {\n  content: \"\\f3b7\"; }\n\n.fa-joint:before {\n  content: \"\\f595\"; }\n\n.fa-joomla:before {\n  content: \"\\f1aa\"; }\n\n.fa-journal-whills:before {\n  content: \"\\f66a\"; }\n\n.fa-js:before {\n  content: \"\\f3b8\"; }\n\n.fa-js-square:before {\n  content: \"\\f3b9\"; }\n\n.fa-jsfiddle:before {\n  content: \"\\f1cc\"; }\n\n.fa-kaaba:before {\n  content: \"\\f66b\"; }\n\n.fa-kaggle:before {\n  content: \"\\f5fa\"; }\n\n.fa-key:before {\n  content: \"\\f084\"; }\n\n.fa-keybase:before {\n  content: \"\\f4f5\"; }\n\n.fa-keyboard:before {\n  content: \"\\f11c\"; }\n\n.fa-keycdn:before {\n  content: \"\\f3ba\"; }\n\n.fa-khanda:before {\n  content: \"\\f66d\"; }\n\n.fa-kickstarter:before {\n  content: \"\\f3bb\"; }\n\n.fa-kickstarter-k:before {\n  content: \"\\f3bc\"; }\n\n.fa-kiss:before {\n  content: \"\\f596\"; }\n\n.fa-kiss-beam:before {\n  content: \"\\f597\"; }\n\n.fa-kiss-wink-heart:before {\n  content: \"\\f598\"; }\n\n.fa-kiwi-bird:before {\n  content: \"\\f535\"; }\n\n.fa-korvue:before {\n  content: \"\\f42f\"; }\n\n.fa-landmark:before {\n  content: \"\\f66f\"; }\n\n.fa-language:before {\n  content: \"\\f1ab\"; }\n\n.fa-laptop:before {\n  content: \"\\f109\"; }\n\n.fa-laptop-code:before {\n  content: \"\\f5fc\"; }\n\n.fa-laravel:before {\n  content: \"\\f3bd\"; }\n\n.fa-lastfm:before {\n  content: \"\\f202\"; }\n\n.fa-lastfm-square:before {\n  content: \"\\f203\"; }\n\n.fa-laugh:before {\n  content: \"\\f599\"; }\n\n.fa-laugh-beam:before {\n  content: \"\\f59a\"; }\n\n.fa-laugh-squint:before {\n  content: \"\\f59b\"; }\n\n.fa-laugh-wink:before {\n  content: \"\\f59c\"; }\n\n.fa-layer-group:before {\n  content: \"\\f5fd\"; }\n\n.fa-leaf:before {\n  content: \"\\f06c\"; }\n\n.fa-leanpub:before {\n  content: \"\\f212\"; }\n\n.fa-lemon:before {\n  content: \"\\f094\"; }\n\n.fa-less:before {\n  content: \"\\f41d\"; }\n\n.fa-less-than:before {\n  content: \"\\f536\"; }\n\n.fa-less-than-equal:before {\n  content: \"\\f537\"; }\n\n.fa-level-down-alt:before {\n  content: \"\\f3be\"; }\n\n.fa-level-up-alt:before {\n  content: \"\\f3bf\"; }\n\n.fa-life-ring:before {\n  content: \"\\f1cd\"; }\n\n.fa-lightbulb:before {\n  content: \"\\f0eb\"; }\n\n.fa-line:before {\n  content: \"\\f3c0\"; }\n\n.fa-link:before {\n  content: \"\\f0c1\"; }\n\n.fa-linkedin:before {\n  content: \"\\f08c\"; }\n\n.fa-linkedin-in:before {\n  content: \"\\f0e1\"; }\n\n.fa-linode:before {\n  content: \"\\f2b8\"; }\n\n.fa-linux:before {\n  content: \"\\f17c\"; }\n\n.fa-lira-sign:before {\n  content: \"\\f195\"; }\n\n.fa-list:before {\n  content: \"\\f03a\"; }\n\n.fa-list-alt:before {\n  content: \"\\f022\"; }\n\n.fa-list-ol:before {\n  content: \"\\f0cb\"; }\n\n.fa-list-ul:before {\n  content: \"\\f0ca\"; }\n\n.fa-location-arrow:before {\n  content: \"\\f124\"; }\n\n.fa-lock:before {\n  content: \"\\f023\"; }\n\n.fa-lock-open:before {\n  content: \"\\f3c1\"; }\n\n.fa-long-arrow-alt-down:before {\n  content: \"\\f309\"; }\n\n.fa-long-arrow-alt-left:before {\n  content: \"\\f30a\"; }\n\n.fa-long-arrow-alt-right:before {\n  content: \"\\f30b\"; }\n\n.fa-long-arrow-alt-up:before {\n  content: \"\\f30c\"; }\n\n.fa-low-vision:before {\n  content: \"\\f2a8\"; }\n\n.fa-luggage-cart:before {\n  content: \"\\f59d\"; }\n\n.fa-lyft:before {\n  content: \"\\f3c3\"; }\n\n.fa-magento:before {\n  content: \"\\f3c4\"; }\n\n.fa-magic:before {\n  content: \"\\f0d0\"; }\n\n.fa-magnet:before {\n  content: \"\\f076\"; }\n\n.fa-mail-bulk:before {\n  content: \"\\f674\"; }\n\n.fa-mailchimp:before {\n  content: \"\\f59e\"; }\n\n.fa-male:before {\n  content: \"\\f183\"; }\n\n.fa-mandalorian:before {\n  content: \"\\f50f\"; }\n\n.fa-map:before {\n  content: \"\\f279\"; }\n\n.fa-map-marked:before {\n  content: \"\\f59f\"; }\n\n.fa-map-marked-alt:before {\n  content: \"\\f5a0\"; }\n\n.fa-map-marker:before {\n  content: \"\\f041\"; }\n\n.fa-map-marker-alt:before {\n  content: \"\\f3c5\"; }\n\n.fa-map-pin:before {\n  content: \"\\f276\"; }\n\n.fa-map-signs:before {\n  content: \"\\f277\"; }\n\n.fa-markdown:before {\n  content: \"\\f60f\"; }\n\n.fa-marker:before {\n  content: \"\\f5a1\"; }\n\n.fa-mars:before {\n  content: \"\\f222\"; }\n\n.fa-mars-double:before {\n  content: \"\\f227\"; }\n\n.fa-mars-stroke:before {\n  content: \"\\f229\"; }\n\n.fa-mars-stroke-h:before {\n  content: \"\\f22b\"; }\n\n.fa-mars-stroke-v:before {\n  content: \"\\f22a\"; }\n\n.fa-mask:before {\n  content: \"\\f6fa\"; }\n\n.fa-mastodon:before {\n  content: \"\\f4f6\"; }\n\n.fa-maxcdn:before {\n  content: \"\\f136\"; }\n\n.fa-medal:before {\n  content: \"\\f5a2\"; }\n\n.fa-medapps:before {\n  content: \"\\f3c6\"; }\n\n.fa-medium:before {\n  content: \"\\f23a\"; }\n\n.fa-medium-m:before {\n  content: \"\\f3c7\"; }\n\n.fa-medkit:before {\n  content: \"\\f0fa\"; }\n\n.fa-medrt:before {\n  content: \"\\f3c8\"; }\n\n.fa-meetup:before {\n  content: \"\\f2e0\"; }\n\n.fa-megaport:before {\n  content: \"\\f5a3\"; }\n\n.fa-meh:before {\n  content: \"\\f11a\"; }\n\n.fa-meh-blank:before {\n  content: \"\\f5a4\"; }\n\n.fa-meh-rolling-eyes:before {\n  content: \"\\f5a5\"; }\n\n.fa-memory:before {\n  content: \"\\f538\"; }\n\n.fa-mendeley:before {\n  content: \"\\f7b3\"; }\n\n.fa-menorah:before {\n  content: \"\\f676\"; }\n\n.fa-mercury:before {\n  content: \"\\f223\"; }\n\n.fa-meteor:before {\n  content: \"\\f753\"; }\n\n.fa-microchip:before {\n  content: \"\\f2db\"; }\n\n.fa-microphone:before {\n  content: \"\\f130\"; }\n\n.fa-microphone-alt:before {\n  content: \"\\f3c9\"; }\n\n.fa-microphone-alt-slash:before {\n  content: \"\\f539\"; }\n\n.fa-microphone-slash:before {\n  content: \"\\f131\"; }\n\n.fa-microscope:before {\n  content: \"\\f610\"; }\n\n.fa-microsoft:before {\n  content: \"\\f3ca\"; }\n\n.fa-minus:before {\n  content: \"\\f068\"; }\n\n.fa-minus-circle:before {\n  content: \"\\f056\"; }\n\n.fa-minus-square:before {\n  content: \"\\f146\"; }\n\n.fa-mitten:before {\n  content: \"\\f7b5\"; }\n\n.fa-mix:before {\n  content: \"\\f3cb\"; }\n\n.fa-mixcloud:before {\n  content: \"\\f289\"; }\n\n.fa-mizuni:before {\n  content: \"\\f3cc\"; }\n\n.fa-mobile:before {\n  content: \"\\f10b\"; }\n\n.fa-mobile-alt:before {\n  content: \"\\f3cd\"; }\n\n.fa-modx:before {\n  content: \"\\f285\"; }\n\n.fa-monero:before {\n  content: \"\\f3d0\"; }\n\n.fa-money-bill:before {\n  content: \"\\f0d6\"; }\n\n.fa-money-bill-alt:before {\n  content: \"\\f3d1\"; }\n\n.fa-money-bill-wave:before {\n  content: \"\\f53a\"; }\n\n.fa-money-bill-wave-alt:before {\n  content: \"\\f53b\"; }\n\n.fa-money-check:before {\n  content: \"\\f53c\"; }\n\n.fa-money-check-alt:before {\n  content: \"\\f53d\"; }\n\n.fa-monument:before {\n  content: \"\\f5a6\"; }\n\n.fa-moon:before {\n  content: \"\\f186\"; }\n\n.fa-mortar-pestle:before {\n  content: \"\\f5a7\"; }\n\n.fa-mosque:before {\n  content: \"\\f678\"; }\n\n.fa-motorcycle:before {\n  content: \"\\f21c\"; }\n\n.fa-mountain:before {\n  content: \"\\f6fc\"; }\n\n.fa-mouse-pointer:before {\n  content: \"\\f245\"; }\n\n.fa-mug-hot:before {\n  content: \"\\f7b6\"; }\n\n.fa-music:before {\n  content: \"\\f001\"; }\n\n.fa-napster:before {\n  content: \"\\f3d2\"; }\n\n.fa-neos:before {\n  content: \"\\f612\"; }\n\n.fa-network-wired:before {\n  content: \"\\f6ff\"; }\n\n.fa-neuter:before {\n  content: \"\\f22c\"; }\n\n.fa-newspaper:before {\n  content: \"\\f1ea\"; }\n\n.fa-nimblr:before {\n  content: \"\\f5a8\"; }\n\n.fa-nintendo-switch:before {\n  content: \"\\f418\"; }\n\n.fa-node:before {\n  content: \"\\f419\"; }\n\n.fa-node-js:before {\n  content: \"\\f3d3\"; }\n\n.fa-not-equal:before {\n  content: \"\\f53e\"; }\n\n.fa-notes-medical:before {\n  content: \"\\f481\"; }\n\n.fa-npm:before {\n  content: \"\\f3d4\"; }\n\n.fa-ns8:before {\n  content: \"\\f3d5\"; }\n\n.fa-nutritionix:before {\n  content: \"\\f3d6\"; }\n\n.fa-object-group:before {\n  content: \"\\f247\"; }\n\n.fa-object-ungroup:before {\n  content: \"\\f248\"; }\n\n.fa-odnoklassniki:before {\n  content: \"\\f263\"; }\n\n.fa-odnoklassniki-square:before {\n  content: \"\\f264\"; }\n\n.fa-oil-can:before {\n  content: \"\\f613\"; }\n\n.fa-old-republic:before {\n  content: \"\\f510\"; }\n\n.fa-om:before {\n  content: \"\\f679\"; }\n\n.fa-opencart:before {\n  content: \"\\f23d\"; }\n\n.fa-openid:before {\n  content: \"\\f19b\"; }\n\n.fa-opera:before {\n  content: \"\\f26a\"; }\n\n.fa-optin-monster:before {\n  content: \"\\f23c\"; }\n\n.fa-osi:before {\n  content: \"\\f41a\"; }\n\n.fa-otter:before {\n  content: \"\\f700\"; }\n\n.fa-outdent:before {\n  content: \"\\f03b\"; }\n\n.fa-page4:before {\n  content: \"\\f3d7\"; }\n\n.fa-pagelines:before {\n  content: \"\\f18c\"; }\n\n.fa-paint-brush:before {\n  content: \"\\f1fc\"; }\n\n.fa-paint-roller:before {\n  content: \"\\f5aa\"; }\n\n.fa-palette:before {\n  content: \"\\f53f\"; }\n\n.fa-palfed:before {\n  content: \"\\f3d8\"; }\n\n.fa-pallet:before {\n  content: \"\\f482\"; }\n\n.fa-paper-plane:before {\n  content: \"\\f1d8\"; }\n\n.fa-paperclip:before {\n  content: \"\\f0c6\"; }\n\n.fa-parachute-box:before {\n  content: \"\\f4cd\"; }\n\n.fa-paragraph:before {\n  content: \"\\f1dd\"; }\n\n.fa-parking:before {\n  content: \"\\f540\"; }\n\n.fa-passport:before {\n  content: \"\\f5ab\"; }\n\n.fa-pastafarianism:before {\n  content: \"\\f67b\"; }\n\n.fa-paste:before {\n  content: \"\\f0ea\"; }\n\n.fa-patreon:before {\n  content: \"\\f3d9\"; }\n\n.fa-pause:before {\n  content: \"\\f04c\"; }\n\n.fa-pause-circle:before {\n  content: \"\\f28b\"; }\n\n.fa-paw:before {\n  content: \"\\f1b0\"; }\n\n.fa-paypal:before {\n  content: \"\\f1ed\"; }\n\n.fa-peace:before {\n  content: \"\\f67c\"; }\n\n.fa-pen:before {\n  content: \"\\f304\"; }\n\n.fa-pen-alt:before {\n  content: \"\\f305\"; }\n\n.fa-pen-fancy:before {\n  content: \"\\f5ac\"; }\n\n.fa-pen-nib:before {\n  content: \"\\f5ad\"; }\n\n.fa-pen-square:before {\n  content: \"\\f14b\"; }\n\n.fa-pencil-alt:before {\n  content: \"\\f303\"; }\n\n.fa-pencil-ruler:before {\n  content: \"\\f5ae\"; }\n\n.fa-penny-arcade:before {\n  content: \"\\f704\"; }\n\n.fa-people-carry:before {\n  content: \"\\f4ce\"; }\n\n.fa-percent:before {\n  content: \"\\f295\"; }\n\n.fa-percentage:before {\n  content: \"\\f541\"; }\n\n.fa-periscope:before {\n  content: \"\\f3da\"; }\n\n.fa-person-booth:before {\n  content: \"\\f756\"; }\n\n.fa-phabricator:before {\n  content: \"\\f3db\"; }\n\n.fa-phoenix-framework:before {\n  content: \"\\f3dc\"; }\n\n.fa-phoenix-squadron:before {\n  content: \"\\f511\"; }\n\n.fa-phone:before {\n  content: \"\\f095\"; }\n\n.fa-phone-slash:before {\n  content: \"\\f3dd\"; }\n\n.fa-phone-square:before {\n  content: \"\\f098\"; }\n\n.fa-phone-volume:before {\n  content: \"\\f2a0\"; }\n\n.fa-php:before {\n  content: \"\\f457\"; }\n\n.fa-pied-piper:before {\n  content: \"\\f2ae\"; }\n\n.fa-pied-piper-alt:before {\n  content: \"\\f1a8\"; }\n\n.fa-pied-piper-hat:before {\n  content: \"\\f4e5\"; }\n\n.fa-pied-piper-pp:before {\n  content: \"\\f1a7\"; }\n\n.fa-piggy-bank:before {\n  content: \"\\f4d3\"; }\n\n.fa-pills:before {\n  content: \"\\f484\"; }\n\n.fa-pinterest:before {\n  content: \"\\f0d2\"; }\n\n.fa-pinterest-p:before {\n  content: \"\\f231\"; }\n\n.fa-pinterest-square:before {\n  content: \"\\f0d3\"; }\n\n.fa-place-of-worship:before {\n  content: \"\\f67f\"; }\n\n.fa-plane:before {\n  content: \"\\f072\"; }\n\n.fa-plane-arrival:before {\n  content: \"\\f5af\"; }\n\n.fa-plane-departure:before {\n  content: \"\\f5b0\"; }\n\n.fa-play:before {\n  content: \"\\f04b\"; }\n\n.fa-play-circle:before {\n  content: \"\\f144\"; }\n\n.fa-playstation:before {\n  content: \"\\f3df\"; }\n\n.fa-plug:before {\n  content: \"\\f1e6\"; }\n\n.fa-plus:before {\n  content: \"\\f067\"; }\n\n.fa-plus-circle:before {\n  content: \"\\f055\"; }\n\n.fa-plus-square:before {\n  content: \"\\f0fe\"; }\n\n.fa-podcast:before {\n  content: \"\\f2ce\"; }\n\n.fa-poll:before {\n  content: \"\\f681\"; }\n\n.fa-poll-h:before {\n  content: \"\\f682\"; }\n\n.fa-poo:before {\n  content: \"\\f2fe\"; }\n\n.fa-poo-storm:before {\n  content: \"\\f75a\"; }\n\n.fa-poop:before {\n  content: \"\\f619\"; }\n\n.fa-portrait:before {\n  content: \"\\f3e0\"; }\n\n.fa-pound-sign:before {\n  content: \"\\f154\"; }\n\n.fa-power-off:before {\n  content: \"\\f011\"; }\n\n.fa-pray:before {\n  content: \"\\f683\"; }\n\n.fa-praying-hands:before {\n  content: \"\\f684\"; }\n\n.fa-prescription:before {\n  content: \"\\f5b1\"; }\n\n.fa-prescription-bottle:before {\n  content: \"\\f485\"; }\n\n.fa-prescription-bottle-alt:before {\n  content: \"\\f486\"; }\n\n.fa-print:before {\n  content: \"\\f02f\"; }\n\n.fa-procedures:before {\n  content: \"\\f487\"; }\n\n.fa-product-hunt:before {\n  content: \"\\f288\"; }\n\n.fa-project-diagram:before {\n  content: \"\\f542\"; }\n\n.fa-pushed:before {\n  content: \"\\f3e1\"; }\n\n.fa-puzzle-piece:before {\n  content: \"\\f12e\"; }\n\n.fa-python:before {\n  content: \"\\f3e2\"; }\n\n.fa-qq:before {\n  content: \"\\f1d6\"; }\n\n.fa-qrcode:before {\n  content: \"\\f029\"; }\n\n.fa-question:before {\n  content: \"\\f128\"; }\n\n.fa-question-circle:before {\n  content: \"\\f059\"; }\n\n.fa-quidditch:before {\n  content: \"\\f458\"; }\n\n.fa-quinscape:before {\n  content: \"\\f459\"; }\n\n.fa-quora:before {\n  content: \"\\f2c4\"; }\n\n.fa-quote-left:before {\n  content: \"\\f10d\"; }\n\n.fa-quote-right:before {\n  content: \"\\f10e\"; }\n\n.fa-quran:before {\n  content: \"\\f687\"; }\n\n.fa-r-project:before {\n  content: \"\\f4f7\"; }\n\n.fa-radiation:before {\n  content: \"\\f7b9\"; }\n\n.fa-radiation-alt:before {\n  content: \"\\f7ba\"; }\n\n.fa-rainbow:before {\n  content: \"\\f75b\"; }\n\n.fa-random:before {\n  content: \"\\f074\"; }\n\n.fa-raspberry-pi:before {\n  content: \"\\f7bb\"; }\n\n.fa-ravelry:before {\n  content: \"\\f2d9\"; }\n\n.fa-react:before {\n  content: \"\\f41b\"; }\n\n.fa-reacteurope:before {\n  content: \"\\f75d\"; }\n\n.fa-readme:before {\n  content: \"\\f4d5\"; }\n\n.fa-rebel:before {\n  content: \"\\f1d0\"; }\n\n.fa-receipt:before {\n  content: \"\\f543\"; }\n\n.fa-recycle:before {\n  content: \"\\f1b8\"; }\n\n.fa-red-river:before {\n  content: \"\\f3e3\"; }\n\n.fa-reddit:before {\n  content: \"\\f1a1\"; }\n\n.fa-reddit-alien:before {\n  content: \"\\f281\"; }\n\n.fa-reddit-square:before {\n  content: \"\\f1a2\"; }\n\n.fa-redhat:before {\n  content: \"\\f7bc\"; }\n\n.fa-redo:before {\n  content: \"\\f01e\"; }\n\n.fa-redo-alt:before {\n  content: \"\\f2f9\"; }\n\n.fa-registered:before {\n  content: \"\\f25d\"; }\n\n.fa-renren:before {\n  content: \"\\f18b\"; }\n\n.fa-reply:before {\n  content: \"\\f3e5\"; }\n\n.fa-reply-all:before {\n  content: \"\\f122\"; }\n\n.fa-replyd:before {\n  content: \"\\f3e6\"; }\n\n.fa-republican:before {\n  content: \"\\f75e\"; }\n\n.fa-researchgate:before {\n  content: \"\\f4f8\"; }\n\n.fa-resolving:before {\n  content: \"\\f3e7\"; }\n\n.fa-restroom:before {\n  content: \"\\f7bd\"; }\n\n.fa-retweet:before {\n  content: \"\\f079\"; }\n\n.fa-rev:before {\n  content: \"\\f5b2\"; }\n\n.fa-ribbon:before {\n  content: \"\\f4d6\"; }\n\n.fa-ring:before {\n  content: \"\\f70b\"; }\n\n.fa-road:before {\n  content: \"\\f018\"; }\n\n.fa-robot:before {\n  content: \"\\f544\"; }\n\n.fa-rocket:before {\n  content: \"\\f135\"; }\n\n.fa-rocketchat:before {\n  content: \"\\f3e8\"; }\n\n.fa-rockrms:before {\n  content: \"\\f3e9\"; }\n\n.fa-route:before {\n  content: \"\\f4d7\"; }\n\n.fa-rss:before {\n  content: \"\\f09e\"; }\n\n.fa-rss-square:before {\n  content: \"\\f143\"; }\n\n.fa-ruble-sign:before {\n  content: \"\\f158\"; }\n\n.fa-ruler:before {\n  content: \"\\f545\"; }\n\n.fa-ruler-combined:before {\n  content: \"\\f546\"; }\n\n.fa-ruler-horizontal:before {\n  content: \"\\f547\"; }\n\n.fa-ruler-vertical:before {\n  content: \"\\f548\"; }\n\n.fa-running:before {\n  content: \"\\f70c\"; }\n\n.fa-rupee-sign:before {\n  content: \"\\f156\"; }\n\n.fa-sad-cry:before {\n  content: \"\\f5b3\"; }\n\n.fa-sad-tear:before {\n  content: \"\\f5b4\"; }\n\n.fa-safari:before {\n  content: \"\\f267\"; }\n\n.fa-sass:before {\n  content: \"\\f41e\"; }\n\n.fa-satellite:before {\n  content: \"\\f7bf\"; }\n\n.fa-satellite-dish:before {\n  content: \"\\f7c0\"; }\n\n.fa-save:before {\n  content: \"\\f0c7\"; }\n\n.fa-schlix:before {\n  content: \"\\f3ea\"; }\n\n.fa-school:before {\n  content: \"\\f549\"; }\n\n.fa-screwdriver:before {\n  content: \"\\f54a\"; }\n\n.fa-scribd:before {\n  content: \"\\f28a\"; }\n\n.fa-scroll:before {\n  content: \"\\f70e\"; }\n\n.fa-sd-card:before {\n  content: \"\\f7c2\"; }\n\n.fa-search:before {\n  content: \"\\f002\"; }\n\n.fa-search-dollar:before {\n  content: \"\\f688\"; }\n\n.fa-search-location:before {\n  content: \"\\f689\"; }\n\n.fa-search-minus:before {\n  content: \"\\f010\"; }\n\n.fa-search-plus:before {\n  content: \"\\f00e\"; }\n\n.fa-searchengin:before {\n  content: \"\\f3eb\"; }\n\n.fa-seedling:before {\n  content: \"\\f4d8\"; }\n\n.fa-sellcast:before {\n  content: \"\\f2da\"; }\n\n.fa-sellsy:before {\n  content: \"\\f213\"; }\n\n.fa-server:before {\n  content: \"\\f233\"; }\n\n.fa-servicestack:before {\n  content: \"\\f3ec\"; }\n\n.fa-shapes:before {\n  content: \"\\f61f\"; }\n\n.fa-share:before {\n  content: \"\\f064\"; }\n\n.fa-share-alt:before {\n  content: \"\\f1e0\"; }\n\n.fa-share-alt-square:before {\n  content: \"\\f1e1\"; }\n\n.fa-share-square:before {\n  content: \"\\f14d\"; }\n\n.fa-shekel-sign:before {\n  content: \"\\f20b\"; }\n\n.fa-shield-alt:before {\n  content: \"\\f3ed\"; }\n\n.fa-ship:before {\n  content: \"\\f21a\"; }\n\n.fa-shipping-fast:before {\n  content: \"\\f48b\"; }\n\n.fa-shirtsinbulk:before {\n  content: \"\\f214\"; }\n\n.fa-shoe-prints:before {\n  content: \"\\f54b\"; }\n\n.fa-shopping-bag:before {\n  content: \"\\f290\"; }\n\n.fa-shopping-basket:before {\n  content: \"\\f291\"; }\n\n.fa-shopping-cart:before {\n  content: \"\\f07a\"; }\n\n.fa-shopware:before {\n  content: \"\\f5b5\"; }\n\n.fa-shower:before {\n  content: \"\\f2cc\"; }\n\n.fa-shuttle-van:before {\n  content: \"\\f5b6\"; }\n\n.fa-sign:before {\n  content: \"\\f4d9\"; }\n\n.fa-sign-in-alt:before {\n  content: \"\\f2f6\"; }\n\n.fa-sign-language:before {\n  content: \"\\f2a7\"; }\n\n.fa-sign-out-alt:before {\n  content: \"\\f2f5\"; }\n\n.fa-signal:before {\n  content: \"\\f012\"; }\n\n.fa-signature:before {\n  content: \"\\f5b7\"; }\n\n.fa-sim-card:before {\n  content: \"\\f7c4\"; }\n\n.fa-simplybuilt:before {\n  content: \"\\f215\"; }\n\n.fa-sistrix:before {\n  content: \"\\f3ee\"; }\n\n.fa-sitemap:before {\n  content: \"\\f0e8\"; }\n\n.fa-sith:before {\n  content: \"\\f512\"; }\n\n.fa-skating:before {\n  content: \"\\f7c5\"; }\n\n.fa-sketch:before {\n  content: \"\\f7c6\"; }\n\n.fa-skiing:before {\n  content: \"\\f7c9\"; }\n\n.fa-skiing-nordic:before {\n  content: \"\\f7ca\"; }\n\n.fa-skull:before {\n  content: \"\\f54c\"; }\n\n.fa-skull-crossbones:before {\n  content: \"\\f714\"; }\n\n.fa-skyatlas:before {\n  content: \"\\f216\"; }\n\n.fa-skype:before {\n  content: \"\\f17e\"; }\n\n.fa-slack:before {\n  content: \"\\f198\"; }\n\n.fa-slack-hash:before {\n  content: \"\\f3ef\"; }\n\n.fa-slash:before {\n  content: \"\\f715\"; }\n\n.fa-sleigh:before {\n  content: \"\\f7cc\"; }\n\n.fa-sliders-h:before {\n  content: \"\\f1de\"; }\n\n.fa-slideshare:before {\n  content: \"\\f1e7\"; }\n\n.fa-smile:before {\n  content: \"\\f118\"; }\n\n.fa-smile-beam:before {\n  content: \"\\f5b8\"; }\n\n.fa-smile-wink:before {\n  content: \"\\f4da\"; }\n\n.fa-smog:before {\n  content: \"\\f75f\"; }\n\n.fa-smoking:before {\n  content: \"\\f48d\"; }\n\n.fa-smoking-ban:before {\n  content: \"\\f54d\"; }\n\n.fa-sms:before {\n  content: \"\\f7cd\"; }\n\n.fa-snapchat:before {\n  content: \"\\f2ab\"; }\n\n.fa-snapchat-ghost:before {\n  content: \"\\f2ac\"; }\n\n.fa-snapchat-square:before {\n  content: \"\\f2ad\"; }\n\n.fa-snowboarding:before {\n  content: \"\\f7ce\"; }\n\n.fa-snowflake:before {\n  content: \"\\f2dc\"; }\n\n.fa-snowman:before {\n  content: \"\\f7d0\"; }\n\n.fa-snowplow:before {\n  content: \"\\f7d2\"; }\n\n.fa-socks:before {\n  content: \"\\f696\"; }\n\n.fa-solar-panel:before {\n  content: \"\\f5ba\"; }\n\n.fa-sort:before {\n  content: \"\\f0dc\"; }\n\n.fa-sort-alpha-down:before {\n  content: \"\\f15d\"; }\n\n.fa-sort-alpha-up:before {\n  content: \"\\f15e\"; }\n\n.fa-sort-amount-down:before {\n  content: \"\\f160\"; }\n\n.fa-sort-amount-up:before {\n  content: \"\\f161\"; }\n\n.fa-sort-down:before {\n  content: \"\\f0dd\"; }\n\n.fa-sort-numeric-down:before {\n  content: \"\\f162\"; }\n\n.fa-sort-numeric-up:before {\n  content: \"\\f163\"; }\n\n.fa-sort-up:before {\n  content: \"\\f0de\"; }\n\n.fa-soundcloud:before {\n  content: \"\\f1be\"; }\n\n.fa-sourcetree:before {\n  content: \"\\f7d3\"; }\n\n.fa-spa:before {\n  content: \"\\f5bb\"; }\n\n.fa-space-shuttle:before {\n  content: \"\\f197\"; }\n\n.fa-speakap:before {\n  content: \"\\f3f3\"; }\n\n.fa-spider:before {\n  content: \"\\f717\"; }\n\n.fa-spinner:before {\n  content: \"\\f110\"; }\n\n.fa-splotch:before {\n  content: \"\\f5bc\"; }\n\n.fa-spotify:before {\n  content: \"\\f1bc\"; }\n\n.fa-spray-can:before {\n  content: \"\\f5bd\"; }\n\n.fa-square:before {\n  content: \"\\f0c8\"; }\n\n.fa-square-full:before {\n  content: \"\\f45c\"; }\n\n.fa-square-root-alt:before {\n  content: \"\\f698\"; }\n\n.fa-squarespace:before {\n  content: \"\\f5be\"; }\n\n.fa-stack-exchange:before {\n  content: \"\\f18d\"; }\n\n.fa-stack-overflow:before {\n  content: \"\\f16c\"; }\n\n.fa-stamp:before {\n  content: \"\\f5bf\"; }\n\n.fa-star:before {\n  content: \"\\f005\"; }\n\n.fa-star-and-crescent:before {\n  content: \"\\f699\"; }\n\n.fa-star-half:before {\n  content: \"\\f089\"; }\n\n.fa-star-half-alt:before {\n  content: \"\\f5c0\"; }\n\n.fa-star-of-david:before {\n  content: \"\\f69a\"; }\n\n.fa-star-of-life:before {\n  content: \"\\f621\"; }\n\n.fa-staylinked:before {\n  content: \"\\f3f5\"; }\n\n.fa-steam:before {\n  content: \"\\f1b6\"; }\n\n.fa-steam-square:before {\n  content: \"\\f1b7\"; }\n\n.fa-steam-symbol:before {\n  content: \"\\f3f6\"; }\n\n.fa-step-backward:before {\n  content: \"\\f048\"; }\n\n.fa-step-forward:before {\n  content: \"\\f051\"; }\n\n.fa-stethoscope:before {\n  content: \"\\f0f1\"; }\n\n.fa-sticker-mule:before {\n  content: \"\\f3f7\"; }\n\n.fa-sticky-note:before {\n  content: \"\\f249\"; }\n\n.fa-stop:before {\n  content: \"\\f04d\"; }\n\n.fa-stop-circle:before {\n  content: \"\\f28d\"; }\n\n.fa-stopwatch:before {\n  content: \"\\f2f2\"; }\n\n.fa-store:before {\n  content: \"\\f54e\"; }\n\n.fa-store-alt:before {\n  content: \"\\f54f\"; }\n\n.fa-strava:before {\n  content: \"\\f428\"; }\n\n.fa-stream:before {\n  content: \"\\f550\"; }\n\n.fa-street-view:before {\n  content: \"\\f21d\"; }\n\n.fa-strikethrough:before {\n  content: \"\\f0cc\"; }\n\n.fa-stripe:before {\n  content: \"\\f429\"; }\n\n.fa-stripe-s:before {\n  content: \"\\f42a\"; }\n\n.fa-stroopwafel:before {\n  content: \"\\f551\"; }\n\n.fa-studiovinari:before {\n  content: \"\\f3f8\"; }\n\n.fa-stumbleupon:before {\n  content: \"\\f1a4\"; }\n\n.fa-stumbleupon-circle:before {\n  content: \"\\f1a3\"; }\n\n.fa-subscript:before {\n  content: \"\\f12c\"; }\n\n.fa-subway:before {\n  content: \"\\f239\"; }\n\n.fa-suitcase:before {\n  content: \"\\f0f2\"; }\n\n.fa-suitcase-rolling:before {\n  content: \"\\f5c1\"; }\n\n.fa-sun:before {\n  content: \"\\f185\"; }\n\n.fa-superpowers:before {\n  content: \"\\f2dd\"; }\n\n.fa-superscript:before {\n  content: \"\\f12b\"; }\n\n.fa-supple:before {\n  content: \"\\f3f9\"; }\n\n.fa-surprise:before {\n  content: \"\\f5c2\"; }\n\n.fa-suse:before {\n  content: \"\\f7d6\"; }\n\n.fa-swatchbook:before {\n  content: \"\\f5c3\"; }\n\n.fa-swimmer:before {\n  content: \"\\f5c4\"; }\n\n.fa-swimming-pool:before {\n  content: \"\\f5c5\"; }\n\n.fa-synagogue:before {\n  content: \"\\f69b\"; }\n\n.fa-sync:before {\n  content: \"\\f021\"; }\n\n.fa-sync-alt:before {\n  content: \"\\f2f1\"; }\n\n.fa-syringe:before {\n  content: \"\\f48e\"; }\n\n.fa-table:before {\n  content: \"\\f0ce\"; }\n\n.fa-table-tennis:before {\n  content: \"\\f45d\"; }\n\n.fa-tablet:before {\n  content: \"\\f10a\"; }\n\n.fa-tablet-alt:before {\n  content: \"\\f3fa\"; }\n\n.fa-tablets:before {\n  content: \"\\f490\"; }\n\n.fa-tachometer-alt:before {\n  content: \"\\f3fd\"; }\n\n.fa-tag:before {\n  content: \"\\f02b\"; }\n\n.fa-tags:before {\n  content: \"\\f02c\"; }\n\n.fa-tape:before {\n  content: \"\\f4db\"; }\n\n.fa-tasks:before {\n  content: \"\\f0ae\"; }\n\n.fa-taxi:before {\n  content: \"\\f1ba\"; }\n\n.fa-teamspeak:before {\n  content: \"\\f4f9\"; }\n\n.fa-teeth:before {\n  content: \"\\f62e\"; }\n\n.fa-teeth-open:before {\n  content: \"\\f62f\"; }\n\n.fa-telegram:before {\n  content: \"\\f2c6\"; }\n\n.fa-telegram-plane:before {\n  content: \"\\f3fe\"; }\n\n.fa-temperature-high:before {\n  content: \"\\f769\"; }\n\n.fa-temperature-low:before {\n  content: \"\\f76b\"; }\n\n.fa-tencent-weibo:before {\n  content: \"\\f1d5\"; }\n\n.fa-tenge:before {\n  content: \"\\f7d7\"; }\n\n.fa-terminal:before {\n  content: \"\\f120\"; }\n\n.fa-text-height:before {\n  content: \"\\f034\"; }\n\n.fa-text-width:before {\n  content: \"\\f035\"; }\n\n.fa-th:before {\n  content: \"\\f00a\"; }\n\n.fa-th-large:before {\n  content: \"\\f009\"; }\n\n.fa-th-list:before {\n  content: \"\\f00b\"; }\n\n.fa-the-red-yeti:before {\n  content: \"\\f69d\"; }\n\n.fa-theater-masks:before {\n  content: \"\\f630\"; }\n\n.fa-themeco:before {\n  content: \"\\f5c6\"; }\n\n.fa-themeisle:before {\n  content: \"\\f2b2\"; }\n\n.fa-thermometer:before {\n  content: \"\\f491\"; }\n\n.fa-thermometer-empty:before {\n  content: \"\\f2cb\"; }\n\n.fa-thermometer-full:before {\n  content: \"\\f2c7\"; }\n\n.fa-thermometer-half:before {\n  content: \"\\f2c9\"; }\n\n.fa-thermometer-quarter:before {\n  content: \"\\f2ca\"; }\n\n.fa-thermometer-three-quarters:before {\n  content: \"\\f2c8\"; }\n\n.fa-think-peaks:before {\n  content: \"\\f731\"; }\n\n.fa-thumbs-down:before {\n  content: \"\\f165\"; }\n\n.fa-thumbs-up:before {\n  content: \"\\f164\"; }\n\n.fa-thumbtack:before {\n  content: \"\\f08d\"; }\n\n.fa-ticket-alt:before {\n  content: \"\\f3ff\"; }\n\n.fa-times:before {\n  content: \"\\f00d\"; }\n\n.fa-times-circle:before {\n  content: \"\\f057\"; }\n\n.fa-tint:before {\n  content: \"\\f043\"; }\n\n.fa-tint-slash:before {\n  content: \"\\f5c7\"; }\n\n.fa-tired:before {\n  content: \"\\f5c8\"; }\n\n.fa-toggle-off:before {\n  content: \"\\f204\"; }\n\n.fa-toggle-on:before {\n  content: \"\\f205\"; }\n\n.fa-toilet:before {\n  content: \"\\f7d8\"; }\n\n.fa-toilet-paper:before {\n  content: \"\\f71e\"; }\n\n.fa-toolbox:before {\n  content: \"\\f552\"; }\n\n.fa-tools:before {\n  content: \"\\f7d9\"; }\n\n.fa-tooth:before {\n  content: \"\\f5c9\"; }\n\n.fa-torah:before {\n  content: \"\\f6a0\"; }\n\n.fa-torii-gate:before {\n  content: \"\\f6a1\"; }\n\n.fa-tractor:before {\n  content: \"\\f722\"; }\n\n.fa-trade-federation:before {\n  content: \"\\f513\"; }\n\n.fa-trademark:before {\n  content: \"\\f25c\"; }\n\n.fa-traffic-light:before {\n  content: \"\\f637\"; }\n\n.fa-train:before {\n  content: \"\\f238\"; }\n\n.fa-tram:before {\n  content: \"\\f7da\"; }\n\n.fa-transgender:before {\n  content: \"\\f224\"; }\n\n.fa-transgender-alt:before {\n  content: \"\\f225\"; }\n\n.fa-trash:before {\n  content: \"\\f1f8\"; }\n\n.fa-trash-alt:before {\n  content: \"\\f2ed\"; }\n\n.fa-tree:before {\n  content: \"\\f1bb\"; }\n\n.fa-trello:before {\n  content: \"\\f181\"; }\n\n.fa-tripadvisor:before {\n  content: \"\\f262\"; }\n\n.fa-trophy:before {\n  content: \"\\f091\"; }\n\n.fa-truck:before {\n  content: \"\\f0d1\"; }\n\n.fa-truck-loading:before {\n  content: \"\\f4de\"; }\n\n.fa-truck-monster:before {\n  content: \"\\f63b\"; }\n\n.fa-truck-moving:before {\n  content: \"\\f4df\"; }\n\n.fa-truck-pickup:before {\n  content: \"\\f63c\"; }\n\n.fa-tshirt:before {\n  content: \"\\f553\"; }\n\n.fa-tty:before {\n  content: \"\\f1e4\"; }\n\n.fa-tumblr:before {\n  content: \"\\f173\"; }\n\n.fa-tumblr-square:before {\n  content: \"\\f174\"; }\n\n.fa-tv:before {\n  content: \"\\f26c\"; }\n\n.fa-twitch:before {\n  content: \"\\f1e8\"; }\n\n.fa-twitter:before {\n  content: \"\\f099\"; }\n\n.fa-twitter-square:before {\n  content: \"\\f081\"; }\n\n.fa-typo3:before {\n  content: \"\\f42b\"; }\n\n.fa-uber:before {\n  content: \"\\f402\"; }\n\n.fa-ubuntu:before {\n  content: \"\\f7df\"; }\n\n.fa-uikit:before {\n  content: \"\\f403\"; }\n\n.fa-umbrella:before {\n  content: \"\\f0e9\"; }\n\n.fa-umbrella-beach:before {\n  content: \"\\f5ca\"; }\n\n.fa-underline:before {\n  content: \"\\f0cd\"; }\n\n.fa-undo:before {\n  content: \"\\f0e2\"; }\n\n.fa-undo-alt:before {\n  content: \"\\f2ea\"; }\n\n.fa-uniregistry:before {\n  content: \"\\f404\"; }\n\n.fa-universal-access:before {\n  content: \"\\f29a\"; }\n\n.fa-university:before {\n  content: \"\\f19c\"; }\n\n.fa-unlink:before {\n  content: \"\\f127\"; }\n\n.fa-unlock:before {\n  content: \"\\f09c\"; }\n\n.fa-unlock-alt:before {\n  content: \"\\f13e\"; }\n\n.fa-untappd:before {\n  content: \"\\f405\"; }\n\n.fa-upload:before {\n  content: \"\\f093\"; }\n\n.fa-ups:before {\n  content: \"\\f7e0\"; }\n\n.fa-usb:before {\n  content: \"\\f287\"; }\n\n.fa-user:before {\n  content: \"\\f007\"; }\n\n.fa-user-alt:before {\n  content: \"\\f406\"; }\n\n.fa-user-alt-slash:before {\n  content: \"\\f4fa\"; }\n\n.fa-user-astronaut:before {\n  content: \"\\f4fb\"; }\n\n.fa-user-check:before {\n  content: \"\\f4fc\"; }\n\n.fa-user-circle:before {\n  content: \"\\f2bd\"; }\n\n.fa-user-clock:before {\n  content: \"\\f4fd\"; }\n\n.fa-user-cog:before {\n  content: \"\\f4fe\"; }\n\n.fa-user-edit:before {\n  content: \"\\f4ff\"; }\n\n.fa-user-friends:before {\n  content: \"\\f500\"; }\n\n.fa-user-graduate:before {\n  content: \"\\f501\"; }\n\n.fa-user-injured:before {\n  content: \"\\f728\"; }\n\n.fa-user-lock:before {\n  content: \"\\f502\"; }\n\n.fa-user-md:before {\n  content: \"\\f0f0\"; }\n\n.fa-user-minus:before {\n  content: \"\\f503\"; }\n\n.fa-user-ninja:before {\n  content: \"\\f504\"; }\n\n.fa-user-plus:before {\n  content: \"\\f234\"; }\n\n.fa-user-secret:before {\n  content: \"\\f21b\"; }\n\n.fa-user-shield:before {\n  content: \"\\f505\"; }\n\n.fa-user-slash:before {\n  content: \"\\f506\"; }\n\n.fa-user-tag:before {\n  content: \"\\f507\"; }\n\n.fa-user-tie:before {\n  content: \"\\f508\"; }\n\n.fa-user-times:before {\n  content: \"\\f235\"; }\n\n.fa-users:before {\n  content: \"\\f0c0\"; }\n\n.fa-users-cog:before {\n  content: \"\\f509\"; }\n\n.fa-usps:before {\n  content: \"\\f7e1\"; }\n\n.fa-ussunnah:before {\n  content: \"\\f407\"; }\n\n.fa-utensil-spoon:before {\n  content: \"\\f2e5\"; }\n\n.fa-utensils:before {\n  content: \"\\f2e7\"; }\n\n.fa-vaadin:before {\n  content: \"\\f408\"; }\n\n.fa-vector-square:before {\n  content: \"\\f5cb\"; }\n\n.fa-venus:before {\n  content: \"\\f221\"; }\n\n.fa-venus-double:before {\n  content: \"\\f226\"; }\n\n.fa-venus-mars:before {\n  content: \"\\f228\"; }\n\n.fa-viacoin:before {\n  content: \"\\f237\"; }\n\n.fa-viadeo:before {\n  content: \"\\f2a9\"; }\n\n.fa-viadeo-square:before {\n  content: \"\\f2aa\"; }\n\n.fa-vial:before {\n  content: \"\\f492\"; }\n\n.fa-vials:before {\n  content: \"\\f493\"; }\n\n.fa-viber:before {\n  content: \"\\f409\"; }\n\n.fa-video:before {\n  content: \"\\f03d\"; }\n\n.fa-video-slash:before {\n  content: \"\\f4e2\"; }\n\n.fa-vihara:before {\n  content: \"\\f6a7\"; }\n\n.fa-vimeo:before {\n  content: \"\\f40a\"; }\n\n.fa-vimeo-square:before {\n  content: \"\\f194\"; }\n\n.fa-vimeo-v:before {\n  content: \"\\f27d\"; }\n\n.fa-vine:before {\n  content: \"\\f1ca\"; }\n\n.fa-vk:before {\n  content: \"\\f189\"; }\n\n.fa-vnv:before {\n  content: \"\\f40b\"; }\n\n.fa-volleyball-ball:before {\n  content: \"\\f45f\"; }\n\n.fa-volume-down:before {\n  content: \"\\f027\"; }\n\n.fa-volume-mute:before {\n  content: \"\\f6a9\"; }\n\n.fa-volume-off:before {\n  content: \"\\f026\"; }\n\n.fa-volume-up:before {\n  content: \"\\f028\"; }\n\n.fa-vote-yea:before {\n  content: \"\\f772\"; }\n\n.fa-vr-cardboard:before {\n  content: \"\\f729\"; }\n\n.fa-vuejs:before {\n  content: \"\\f41f\"; }\n\n.fa-walking:before {\n  content: \"\\f554\"; }\n\n.fa-wallet:before {\n  content: \"\\f555\"; }\n\n.fa-warehouse:before {\n  content: \"\\f494\"; }\n\n.fa-water:before {\n  content: \"\\f773\"; }\n\n.fa-weebly:before {\n  content: \"\\f5cc\"; }\n\n.fa-weibo:before {\n  content: \"\\f18a\"; }\n\n.fa-weight:before {\n  content: \"\\f496\"; }\n\n.fa-weight-hanging:before {\n  content: \"\\f5cd\"; }\n\n.fa-weixin:before {\n  content: \"\\f1d7\"; }\n\n.fa-whatsapp:before {\n  content: \"\\f232\"; }\n\n.fa-whatsapp-square:before {\n  content: \"\\f40c\"; }\n\n.fa-wheelchair:before {\n  content: \"\\f193\"; }\n\n.fa-whmcs:before {\n  content: \"\\f40d\"; }\n\n.fa-wifi:before {\n  content: \"\\f1eb\"; }\n\n.fa-wikipedia-w:before {\n  content: \"\\f266\"; }\n\n.fa-wind:before {\n  content: \"\\f72e\"; }\n\n.fa-window-close:before {\n  content: \"\\f410\"; }\n\n.fa-window-maximize:before {\n  content: \"\\f2d0\"; }\n\n.fa-window-minimize:before {\n  content: \"\\f2d1\"; }\n\n.fa-window-restore:before {\n  content: \"\\f2d2\"; }\n\n.fa-windows:before {\n  content: \"\\f17a\"; }\n\n.fa-wine-bottle:before {\n  content: \"\\f72f\"; }\n\n.fa-wine-glass:before {\n  content: \"\\f4e3\"; }\n\n.fa-wine-glass-alt:before {\n  content: \"\\f5ce\"; }\n\n.fa-wix:before {\n  content: \"\\f5cf\"; }\n\n.fa-wizards-of-the-coast:before {\n  content: \"\\f730\"; }\n\n.fa-wolf-pack-battalion:before {\n  content: \"\\f514\"; }\n\n.fa-won-sign:before {\n  content: \"\\f159\"; }\n\n.fa-wordpress:before {\n  content: \"\\f19a\"; }\n\n.fa-wordpress-simple:before {\n  content: \"\\f411\"; }\n\n.fa-wpbeginner:before {\n  content: \"\\f297\"; }\n\n.fa-wpexplorer:before {\n  content: \"\\f2de\"; }\n\n.fa-wpforms:before {\n  content: \"\\f298\"; }\n\n.fa-wpressr:before {\n  content: \"\\f3e4\"; }\n\n.fa-wrench:before {\n  content: \"\\f0ad\"; }\n\n.fa-x-ray:before {\n  content: \"\\f497\"; }\n\n.fa-xbox:before {\n  content: \"\\f412\"; }\n\n.fa-xing:before {\n  content: \"\\f168\"; }\n\n.fa-xing-square:before {\n  content: \"\\f169\"; }\n\n.fa-y-combinator:before {\n  content: \"\\f23b\"; }\n\n.fa-yahoo:before {\n  content: \"\\f19e\"; }\n\n.fa-yandex:before {\n  content: \"\\f413\"; }\n\n.fa-yandex-international:before {\n  content: \"\\f414\"; }\n\n.fa-yarn:before {\n  content: \"\\f7e3\"; }\n\n.fa-yelp:before {\n  content: \"\\f1e9\"; }\n\n.fa-yen-sign:before {\n  content: \"\\f157\"; }\n\n.fa-yin-yang:before {\n  content: \"\\f6ad\"; }\n\n.fa-yoast:before {\n  content: \"\\f2b1\"; }\n\n.fa-youtube:before {\n  content: \"\\f167\"; }\n\n.fa-youtube-square:before {\n  content: \"\\f431\"; }\n\n.fa-zhihu:before {\n  content: \"\\f63f\"; }\n\n.sr-only {\n  border: 0;\n  clip: rect(0, 0, 0, 0);\n  height: 1px;\n  margin: -1px;\n  overflow: hidden;\n  padding: 0;\n  position: absolute;\n  width: 1px; }\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n  clip: auto;\n  height: auto;\n  margin: 0;\n  overflow: visible;\n  position: static;\n  width: auto; }\n@font-face {\n  font-family: 'Font Awesome 5 Brands';\n  font-style: normal;\n  font-weight: normal;\n  src: url(\"../webfonts/fa-brands-400.eot\");\n  src: url(\"../webfonts/fa-brands-400.eot?#iefix\") format(\"embedded-opentype\"), url(\"../webfonts/fa-brands-400.woff2\") format(\"woff2\"), url(\"../webfonts/fa-brands-400.woff\") format(\"woff\"), url(\"../webfonts/fa-brands-400.ttf\") format(\"truetype\"), url(\"../webfonts/fa-brands-400.svg#fontawesome\") format(\"svg\"); }\n\n.fab {\n  font-family: 'Font Awesome 5 Brands'; }\n@font-face {\n  font-family: 'Font Awesome 5 Free';\n  font-style: normal;\n  font-weight: 400;\n  src: url(\"../webfonts/fa-regular-400.eot\");\n  src: url(\"../webfonts/fa-regular-400.eot?#iefix\") format(\"embedded-opentype\"), url(\"../webfonts/fa-regular-400.woff2\") format(\"woff2\"), url(\"../webfonts/fa-regular-400.woff\") format(\"woff\"), url(\"../webfonts/fa-regular-400.ttf\") format(\"truetype\"), url(\"../webfonts/fa-regular-400.svg#fontawesome\") format(\"svg\"); }\n\n.far {\n  font-family: 'Font Awesome 5 Free';\n  font-weight: 400; }\n@font-face {\n  font-family: 'Font Awesome 5 Free';\n  font-style: normal;\n  font-weight: 900;\n  src: url(\"../webfonts/fa-solid-900.eot\");\n  src: url(\"../webfonts/fa-solid-900.eot?#iefix\") format(\"embedded-opentype\"), url(\"../webfonts/fa-solid-900.woff2\") format(\"woff2\"), url(\"../webfonts/fa-solid-900.woff\") format(\"woff\"), url(\"../webfonts/fa-solid-900.ttf\") format(\"truetype\"), url(\"../webfonts/fa-solid-900.svg#fontawesome\") format(\"svg\"); }\n\n.fa,\n.fas {\n  font-family: 'Font Awesome 5 Free';\n  font-weight: 900; }\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/fontawesome/css/all.min.css",
    "content": ".fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{animation:fa-spin 2s infinite linear}.fa-pulse{animation:fa-spin 1s infinite steps(8)}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:\"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)\";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)\";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:\"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)\";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:\"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)\";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\"}.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:\"\\f26e\"}.fa-accessible-icon:before{content:\"\\f368\"}.fa-accusoft:before{content:\"\\f369\"}.fa-acquisitions-incorporated:before{content:\"\\f6af\"}.fa-ad:before{content:\"\\f641\"}.fa-address-book:before{content:\"\\f2b9\"}.fa-address-card:before{content:\"\\f2bb\"}.fa-adjust:before{content:\"\\f042\"}.fa-adn:before{content:\"\\f170\"}.fa-adobe:before{content:\"\\f778\"}.fa-adversal:before{content:\"\\f36a\"}.fa-affiliatetheme:before{content:\"\\f36b\"}.fa-air-freshener:before{content:\"\\f5d0\"}.fa-algolia:before{content:\"\\f36c\"}.fa-align-center:before{content:\"\\f037\"}.fa-align-justify:before{content:\"\\f039\"}.fa-align-left:before{content:\"\\f036\"}.fa-align-right:before{content:\"\\f038\"}.fa-alipay:before{content:\"\\f642\"}.fa-allergies:before{content:\"\\f461\"}.fa-amazon:before{content:\"\\f270\"}.fa-amazon-pay:before{content:\"\\f42c\"}.fa-ambulance:before{content:\"\\f0f9\"}.fa-american-sign-language-interpreting:before{content:\"\\f2a3\"}.fa-amilia:before{content:\"\\f36d\"}.fa-anchor:before{content:\"\\f13d\"}.fa-android:before{content:\"\\f17b\"}.fa-angellist:before{content:\"\\f209\"}.fa-angle-double-down:before{content:\"\\f103\"}.fa-angle-double-left:before{content:\"\\f100\"}.fa-angle-double-right:before{content:\"\\f101\"}.fa-angle-double-up:before{content:\"\\f102\"}.fa-angle-down:before{content:\"\\f107\"}.fa-angle-left:before{content:\"\\f104\"}.fa-angle-right:before{content:\"\\f105\"}.fa-angle-up:before{content:\"\\f106\"}.fa-angry:before{content:\"\\f556\"}.fa-angrycreative:before{content:\"\\f36e\"}.fa-angular:before{content:\"\\f420\"}.fa-ankh:before{content:\"\\f644\"}.fa-app-store:before{content:\"\\f36f\"}.fa-app-store-ios:before{content:\"\\f370\"}.fa-apper:before{content:\"\\f371\"}.fa-apple:before{content:\"\\f179\"}.fa-apple-alt:before{content:\"\\f5d1\"}.fa-apple-pay:before{content:\"\\f415\"}.fa-archive:before{content:\"\\f187\"}.fa-archway:before{content:\"\\f557\"}.fa-arrow-alt-circle-down:before{content:\"\\f358\"}.fa-arrow-alt-circle-left:before{content:\"\\f359\"}.fa-arrow-alt-circle-right:before{content:\"\\f35a\"}.fa-arrow-alt-circle-up:before{content:\"\\f35b\"}.fa-arrow-circle-down:before{content:\"\\f0ab\"}.fa-arrow-circle-left:before{content:\"\\f0a8\"}.fa-arrow-circle-right:before{content:\"\\f0a9\"}.fa-arrow-circle-up:before{content:\"\\f0aa\"}.fa-arrow-down:before{content:\"\\f063\"}.fa-arrow-left:before{content:\"\\f060\"}.fa-arrow-right:before{content:\"\\f061\"}.fa-arrow-up:before{content:\"\\f062\"}.fa-arrows-alt:before{content:\"\\f0b2\"}.fa-arrows-alt-h:before{content:\"\\f337\"}.fa-arrows-alt-v:before{content:\"\\f338\"}.fa-artstation:before{content:\"\\f77a\"}.fa-assistive-listening-systems:before{content:\"\\f2a2\"}.fa-asterisk:before{content:\"\\f069\"}.fa-asymmetrik:before{content:\"\\f372\"}.fa-at:before{content:\"\\f1fa\"}.fa-atlas:before{content:\"\\f558\"}.fa-atlassian:before{content:\"\\f77b\"}.fa-atom:before{content:\"\\f5d2\"}.fa-audible:before{content:\"\\f373\"}.fa-audio-description:before{content:\"\\f29e\"}.fa-autoprefixer:before{content:\"\\f41c\"}.fa-avianex:before{content:\"\\f374\"}.fa-aviato:before{content:\"\\f421\"}.fa-award:before{content:\"\\f559\"}.fa-aws:before{content:\"\\f375\"}.fa-baby:before{content:\"\\f77c\"}.fa-baby-carriage:before{content:\"\\f77d\"}.fa-backspace:before{content:\"\\f55a\"}.fa-backward:before{content:\"\\f04a\"}.fa-balance-scale:before{content:\"\\f24e\"}.fa-ban:before{content:\"\\f05e\"}.fa-band-aid:before{content:\"\\f462\"}.fa-bandcamp:before{content:\"\\f2d5\"}.fa-barcode:before{content:\"\\f02a\"}.fa-bars:before{content:\"\\f0c9\"}.fa-baseball-ball:before{content:\"\\f433\"}.fa-basketball-ball:before{content:\"\\f434\"}.fa-bath:before{content:\"\\f2cd\"}.fa-battery-empty:before{content:\"\\f244\"}.fa-battery-full:before{content:\"\\f240\"}.fa-battery-half:before{content:\"\\f242\"}.fa-battery-quarter:before{content:\"\\f243\"}.fa-battery-three-quarters:before{content:\"\\f241\"}.fa-bed:before{content:\"\\f236\"}.fa-beer:before{content:\"\\f0fc\"}.fa-behance:before{content:\"\\f1b4\"}.fa-behance-square:before{content:\"\\f1b5\"}.fa-bell:before{content:\"\\f0f3\"}.fa-bell-slash:before{content:\"\\f1f6\"}.fa-bezier-curve:before{content:\"\\f55b\"}.fa-bible:before{content:\"\\f647\"}.fa-bicycle:before{content:\"\\f206\"}.fa-bimobject:before{content:\"\\f378\"}.fa-binoculars:before{content:\"\\f1e5\"}.fa-biohazard:before{content:\"\\f780\"}.fa-birthday-cake:before{content:\"\\f1fd\"}.fa-bitbucket:before{content:\"\\f171\"}.fa-bitcoin:before{content:\"\\f379\"}.fa-bity:before{content:\"\\f37a\"}.fa-black-tie:before{content:\"\\f27e\"}.fa-blackberry:before{content:\"\\f37b\"}.fa-blender:before{content:\"\\f517\"}.fa-blender-phone:before{content:\"\\f6b6\"}.fa-blind:before{content:\"\\f29d\"}.fa-blog:before{content:\"\\f781\"}.fa-blogger:before{content:\"\\f37c\"}.fa-blogger-b:before{content:\"\\f37d\"}.fa-bluetooth:before{content:\"\\f293\"}.fa-bluetooth-b:before{content:\"\\f294\"}.fa-bold:before{content:\"\\f032\"}.fa-bolt:before{content:\"\\f0e7\"}.fa-bomb:before{content:\"\\f1e2\"}.fa-bone:before{content:\"\\f5d7\"}.fa-bong:before{content:\"\\f55c\"}.fa-book:before{content:\"\\f02d\"}.fa-book-dead:before{content:\"\\f6b7\"}.fa-book-open:before{content:\"\\f518\"}.fa-book-reader:before{content:\"\\f5da\"}.fa-bookmark:before{content:\"\\f02e\"}.fa-bowling-ball:before{content:\"\\f436\"}.fa-box:before{content:\"\\f466\"}.fa-box-open:before{content:\"\\f49e\"}.fa-boxes:before{content:\"\\f468\"}.fa-braille:before{content:\"\\f2a1\"}.fa-brain:before{content:\"\\f5dc\"}.fa-briefcase:before{content:\"\\f0b1\"}.fa-briefcase-medical:before{content:\"\\f469\"}.fa-broadcast-tower:before{content:\"\\f519\"}.fa-broom:before{content:\"\\f51a\"}.fa-brush:before{content:\"\\f55d\"}.fa-btc:before{content:\"\\f15a\"}.fa-bug:before{content:\"\\f188\"}.fa-building:before{content:\"\\f1ad\"}.fa-bullhorn:before{content:\"\\f0a1\"}.fa-bullseye:before{content:\"\\f140\"}.fa-burn:before{content:\"\\f46a\"}.fa-buromobelexperte:before{content:\"\\f37f\"}.fa-bus:before{content:\"\\f207\"}.fa-bus-alt:before{content:\"\\f55e\"}.fa-business-time:before{content:\"\\f64a\"}.fa-buysellads:before{content:\"\\f20d\"}.fa-calculator:before{content:\"\\f1ec\"}.fa-calendar:before{content:\"\\f133\"}.fa-calendar-alt:before{content:\"\\f073\"}.fa-calendar-check:before{content:\"\\f274\"}.fa-calendar-day:before{content:\"\\f783\"}.fa-calendar-minus:before{content:\"\\f272\"}.fa-calendar-plus:before{content:\"\\f271\"}.fa-calendar-times:before{content:\"\\f273\"}.fa-calendar-week:before{content:\"\\f784\"}.fa-camera:before{content:\"\\f030\"}.fa-camera-retro:before{content:\"\\f083\"}.fa-campground:before{content:\"\\f6bb\"}.fa-canadian-maple-leaf:before{content:\"\\f785\"}.fa-candy-cane:before{content:\"\\f786\"}.fa-cannabis:before{content:\"\\f55f\"}.fa-capsules:before{content:\"\\f46b\"}.fa-car:before{content:\"\\f1b9\"}.fa-car-alt:before{content:\"\\f5de\"}.fa-car-battery:before{content:\"\\f5df\"}.fa-car-crash:before{content:\"\\f5e1\"}.fa-car-side:before{content:\"\\f5e4\"}.fa-caret-down:before{content:\"\\f0d7\"}.fa-caret-left:before{content:\"\\f0d9\"}.fa-caret-right:before{content:\"\\f0da\"}.fa-caret-square-down:before{content:\"\\f150\"}.fa-caret-square-left:before{content:\"\\f191\"}.fa-caret-square-right:before{content:\"\\f152\"}.fa-caret-square-up:before{content:\"\\f151\"}.fa-caret-up:before{content:\"\\f0d8\"}.fa-carrot:before{content:\"\\f787\"}.fa-cart-arrow-down:before{content:\"\\f218\"}.fa-cart-plus:before{content:\"\\f217\"}.fa-cash-register:before{content:\"\\f788\"}.fa-cat:before{content:\"\\f6be\"}.fa-cc-amazon-pay:before{content:\"\\f42d\"}.fa-cc-amex:before{content:\"\\f1f3\"}.fa-cc-apple-pay:before{content:\"\\f416\"}.fa-cc-diners-club:before{content:\"\\f24c\"}.fa-cc-discover:before{content:\"\\f1f2\"}.fa-cc-jcb:before{content:\"\\f24b\"}.fa-cc-mastercard:before{content:\"\\f1f1\"}.fa-cc-paypal:before{content:\"\\f1f4\"}.fa-cc-stripe:before{content:\"\\f1f5\"}.fa-cc-visa:before{content:\"\\f1f0\"}.fa-centercode:before{content:\"\\f380\"}.fa-centos:before{content:\"\\f789\"}.fa-certificate:before{content:\"\\f0a3\"}.fa-chair:before{content:\"\\f6c0\"}.fa-chalkboard:before{content:\"\\f51b\"}.fa-chalkboard-teacher:before{content:\"\\f51c\"}.fa-charging-station:before{content:\"\\f5e7\"}.fa-chart-area:before{content:\"\\f1fe\"}.fa-chart-bar:before{content:\"\\f080\"}.fa-chart-line:before{content:\"\\f201\"}.fa-chart-pie:before{content:\"\\f200\"}.fa-check:before{content:\"\\f00c\"}.fa-check-circle:before{content:\"\\f058\"}.fa-check-double:before{content:\"\\f560\"}.fa-check-square:before{content:\"\\f14a\"}.fa-chess:before{content:\"\\f439\"}.fa-chess-bishop:before{content:\"\\f43a\"}.fa-chess-board:before{content:\"\\f43c\"}.fa-chess-king:before{content:\"\\f43f\"}.fa-chess-knight:before{content:\"\\f441\"}.fa-chess-pawn:before{content:\"\\f443\"}.fa-chess-queen:before{content:\"\\f445\"}.fa-chess-rook:before{content:\"\\f447\"}.fa-chevron-circle-down:before{content:\"\\f13a\"}.fa-chevron-circle-left:before{content:\"\\f137\"}.fa-chevron-circle-right:before{content:\"\\f138\"}.fa-chevron-circle-up:before{content:\"\\f139\"}.fa-chevron-down:before{content:\"\\f078\"}.fa-chevron-left:before{content:\"\\f053\"}.fa-chevron-right:before{content:\"\\f054\"}.fa-chevron-up:before{content:\"\\f077\"}.fa-child:before{content:\"\\f1ae\"}.fa-chrome:before{content:\"\\f268\"}.fa-church:before{content:\"\\f51d\"}.fa-circle:before{content:\"\\f111\"}.fa-circle-notch:before{content:\"\\f1ce\"}.fa-city:before{content:\"\\f64f\"}.fa-clipboard:before{content:\"\\f328\"}.fa-clipboard-check:before{content:\"\\f46c\"}.fa-clipboard-list:before{content:\"\\f46d\"}.fa-clock:before{content:\"\\f017\"}.fa-clone:before{content:\"\\f24d\"}.fa-closed-captioning:before{content:\"\\f20a\"}.fa-cloud:before{content:\"\\f0c2\"}.fa-cloud-download-alt:before{content:\"\\f381\"}.fa-cloud-meatball:before{content:\"\\f73b\"}.fa-cloud-moon:before{content:\"\\f6c3\"}.fa-cloud-moon-rain:before{content:\"\\f73c\"}.fa-cloud-rain:before{content:\"\\f73d\"}.fa-cloud-showers-heavy:before{content:\"\\f740\"}.fa-cloud-sun:before{content:\"\\f6c4\"}.fa-cloud-sun-rain:before{content:\"\\f743\"}.fa-cloud-upload-alt:before{content:\"\\f382\"}.fa-cloudscale:before{content:\"\\f383\"}.fa-cloudsmith:before{content:\"\\f384\"}.fa-cloudversify:before{content:\"\\f385\"}.fa-cocktail:before{content:\"\\f561\"}.fa-code:before{content:\"\\f121\"}.fa-code-branch:before{content:\"\\f126\"}.fa-codepen:before{content:\"\\f1cb\"}.fa-codiepie:before{content:\"\\f284\"}.fa-coffee:before{content:\"\\f0f4\"}.fa-cog:before{content:\"\\f013\"}.fa-cogs:before{content:\"\\f085\"}.fa-coins:before{content:\"\\f51e\"}.fa-columns:before{content:\"\\f0db\"}.fa-comment:before{content:\"\\f075\"}.fa-comment-alt:before{content:\"\\f27a\"}.fa-comment-dollar:before{content:\"\\f651\"}.fa-comment-dots:before{content:\"\\f4ad\"}.fa-comment-slash:before{content:\"\\f4b3\"}.fa-comments:before{content:\"\\f086\"}.fa-comments-dollar:before{content:\"\\f653\"}.fa-compact-disc:before{content:\"\\f51f\"}.fa-compass:before{content:\"\\f14e\"}.fa-compress:before{content:\"\\f066\"}.fa-compress-arrows-alt:before{content:\"\\f78c\"}.fa-concierge-bell:before{content:\"\\f562\"}.fa-confluence:before{content:\"\\f78d\"}.fa-connectdevelop:before{content:\"\\f20e\"}.fa-contao:before{content:\"\\f26d\"}.fa-cookie:before{content:\"\\f563\"}.fa-cookie-bite:before{content:\"\\f564\"}.fa-copy:before{content:\"\\f0c5\"}.fa-copyright:before{content:\"\\f1f9\"}.fa-couch:before{content:\"\\f4b8\"}.fa-cpanel:before{content:\"\\f388\"}.fa-creative-commons:before{content:\"\\f25e\"}.fa-creative-commons-by:before{content:\"\\f4e7\"}.fa-creative-commons-nc:before{content:\"\\f4e8\"}.fa-creative-commons-nc-eu:before{content:\"\\f4e9\"}.fa-creative-commons-nc-jp:before{content:\"\\f4ea\"}.fa-creative-commons-nd:before{content:\"\\f4eb\"}.fa-creative-commons-pd:before{content:\"\\f4ec\"}.fa-creative-commons-pd-alt:before{content:\"\\f4ed\"}.fa-creative-commons-remix:before{content:\"\\f4ee\"}.fa-creative-commons-sa:before{content:\"\\f4ef\"}.fa-creative-commons-sampling:before{content:\"\\f4f0\"}.fa-creative-commons-sampling-plus:before{content:\"\\f4f1\"}.fa-creative-commons-share:before{content:\"\\f4f2\"}.fa-creative-commons-zero:before{content:\"\\f4f3\"}.fa-credit-card:before{content:\"\\f09d\"}.fa-critical-role:before{content:\"\\f6c9\"}.fa-crop:before{content:\"\\f125\"}.fa-crop-alt:before{content:\"\\f565\"}.fa-cross:before{content:\"\\f654\"}.fa-crosshairs:before{content:\"\\f05b\"}.fa-crow:before{content:\"\\f520\"}.fa-crown:before{content:\"\\f521\"}.fa-css3:before{content:\"\\f13c\"}.fa-css3-alt:before{content:\"\\f38b\"}.fa-cube:before{content:\"\\f1b2\"}.fa-cubes:before{content:\"\\f1b3\"}.fa-cut:before{content:\"\\f0c4\"}.fa-cuttlefish:before{content:\"\\f38c\"}.fa-d-and-d:before{content:\"\\f38d\"}.fa-d-and-d-beyond:before{content:\"\\f6ca\"}.fa-dashcube:before{content:\"\\f210\"}.fa-database:before{content:\"\\f1c0\"}.fa-deaf:before{content:\"\\f2a4\"}.fa-delicious:before{content:\"\\f1a5\"}.fa-democrat:before{content:\"\\f747\"}.fa-deploydog:before{content:\"\\f38e\"}.fa-deskpro:before{content:\"\\f38f\"}.fa-desktop:before{content:\"\\f108\"}.fa-dev:before{content:\"\\f6cc\"}.fa-deviantart:before{content:\"\\f1bd\"}.fa-dharmachakra:before{content:\"\\f655\"}.fa-dhl:before{content:\"\\f790\"}.fa-diagnoses:before{content:\"\\f470\"}.fa-diaspora:before{content:\"\\f791\"}.fa-dice:before{content:\"\\f522\"}.fa-dice-d20:before{content:\"\\f6cf\"}.fa-dice-d6:before{content:\"\\f6d1\"}.fa-dice-five:before{content:\"\\f523\"}.fa-dice-four:before{content:\"\\f524\"}.fa-dice-one:before{content:\"\\f525\"}.fa-dice-six:before{content:\"\\f526\"}.fa-dice-three:before{content:\"\\f527\"}.fa-dice-two:before{content:\"\\f528\"}.fa-digg:before{content:\"\\f1a6\"}.fa-digital-ocean:before{content:\"\\f391\"}.fa-digital-tachograph:before{content:\"\\f566\"}.fa-directions:before{content:\"\\f5eb\"}.fa-discord:before{content:\"\\f392\"}.fa-discourse:before{content:\"\\f393\"}.fa-divide:before{content:\"\\f529\"}.fa-dizzy:before{content:\"\\f567\"}.fa-dna:before{content:\"\\f471\"}.fa-dochub:before{content:\"\\f394\"}.fa-docker:before{content:\"\\f395\"}.fa-dog:before{content:\"\\f6d3\"}.fa-dollar-sign:before{content:\"\\f155\"}.fa-dolly:before{content:\"\\f472\"}.fa-dolly-flatbed:before{content:\"\\f474\"}.fa-donate:before{content:\"\\f4b9\"}.fa-door-closed:before{content:\"\\f52a\"}.fa-door-open:before{content:\"\\f52b\"}.fa-dot-circle:before{content:\"\\f192\"}.fa-dove:before{content:\"\\f4ba\"}.fa-download:before{content:\"\\f019\"}.fa-draft2digital:before{content:\"\\f396\"}.fa-drafting-compass:before{content:\"\\f568\"}.fa-dragon:before{content:\"\\f6d5\"}.fa-draw-polygon:before{content:\"\\f5ee\"}.fa-dribbble:before{content:\"\\f17d\"}.fa-dribbble-square:before{content:\"\\f397\"}.fa-dropbox:before{content:\"\\f16b\"}.fa-drum:before{content:\"\\f569\"}.fa-drum-steelpan:before{content:\"\\f56a\"}.fa-drumstick-bite:before{content:\"\\f6d7\"}.fa-drupal:before{content:\"\\f1a9\"}.fa-dumbbell:before{content:\"\\f44b\"}.fa-dumpster:before{content:\"\\f793\"}.fa-dumpster-fire:before{content:\"\\f794\"}.fa-dungeon:before{content:\"\\f6d9\"}.fa-dyalog:before{content:\"\\f399\"}.fa-earlybirds:before{content:\"\\f39a\"}.fa-ebay:before{content:\"\\f4f4\"}.fa-edge:before{content:\"\\f282\"}.fa-edit:before{content:\"\\f044\"}.fa-eject:before{content:\"\\f052\"}.fa-elementor:before{content:\"\\f430\"}.fa-ellipsis-h:before{content:\"\\f141\"}.fa-ellipsis-v:before{content:\"\\f142\"}.fa-ello:before{content:\"\\f5f1\"}.fa-ember:before{content:\"\\f423\"}.fa-empire:before{content:\"\\f1d1\"}.fa-envelope:before{content:\"\\f0e0\"}.fa-envelope-open:before{content:\"\\f2b6\"}.fa-envelope-open-text:before{content:\"\\f658\"}.fa-envelope-square:before{content:\"\\f199\"}.fa-envira:before{content:\"\\f299\"}.fa-equals:before{content:\"\\f52c\"}.fa-eraser:before{content:\"\\f12d\"}.fa-erlang:before{content:\"\\f39d\"}.fa-ethereum:before{content:\"\\f42e\"}.fa-ethernet:before{content:\"\\f796\"}.fa-etsy:before{content:\"\\f2d7\"}.fa-euro-sign:before{content:\"\\f153\"}.fa-exchange-alt:before{content:\"\\f362\"}.fa-exclamation:before{content:\"\\f12a\"}.fa-exclamation-circle:before{content:\"\\f06a\"}.fa-exclamation-triangle:before{content:\"\\f071\"}.fa-expand:before{content:\"\\f065\"}.fa-expand-arrows-alt:before{content:\"\\f31e\"}.fa-expeditedssl:before{content:\"\\f23e\"}.fa-external-link-alt:before{content:\"\\f35d\"}.fa-external-link-square-alt:before{content:\"\\f360\"}.fa-eye:before{content:\"\\f06e\"}.fa-eye-dropper:before{content:\"\\f1fb\"}.fa-eye-slash:before{content:\"\\f070\"}.fa-facebook:before{content:\"\\f09a\"}.fa-facebook-f:before{content:\"\\f39e\"}.fa-facebook-messenger:before{content:\"\\f39f\"}.fa-facebook-square:before{content:\"\\f082\"}.fa-fantasy-flight-games:before{content:\"\\f6dc\"}.fa-fast-backward:before{content:\"\\f049\"}.fa-fast-forward:before{content:\"\\f050\"}.fa-fax:before{content:\"\\f1ac\"}.fa-feather:before{content:\"\\f52d\"}.fa-feather-alt:before{content:\"\\f56b\"}.fa-fedex:before{content:\"\\f797\"}.fa-fedora:before{content:\"\\f798\"}.fa-female:before{content:\"\\f182\"}.fa-fighter-jet:before{content:\"\\f0fb\"}.fa-figma:before{content:\"\\f799\"}.fa-file:before{content:\"\\f15b\"}.fa-file-alt:before{content:\"\\f15c\"}.fa-file-archive:before{content:\"\\f1c6\"}.fa-file-audio:before{content:\"\\f1c7\"}.fa-file-code:before{content:\"\\f1c9\"}.fa-file-contract:before{content:\"\\f56c\"}.fa-file-csv:before{content:\"\\f6dd\"}.fa-file-download:before{content:\"\\f56d\"}.fa-file-excel:before{content:\"\\f1c3\"}.fa-file-export:before{content:\"\\f56e\"}.fa-file-image:before{content:\"\\f1c5\"}.fa-file-import:before{content:\"\\f56f\"}.fa-file-invoice:before{content:\"\\f570\"}.fa-file-invoice-dollar:before{content:\"\\f571\"}.fa-file-medical:before{content:\"\\f477\"}.fa-file-medical-alt:before{content:\"\\f478\"}.fa-file-pdf:before{content:\"\\f1c1\"}.fa-file-powerpoint:before{content:\"\\f1c4\"}.fa-file-prescription:before{content:\"\\f572\"}.fa-file-signature:before{content:\"\\f573\"}.fa-file-upload:before{content:\"\\f574\"}.fa-file-video:before{content:\"\\f1c8\"}.fa-file-word:before{content:\"\\f1c2\"}.fa-fill:before{content:\"\\f575\"}.fa-fill-drip:before{content:\"\\f576\"}.fa-film:before{content:\"\\f008\"}.fa-filter:before{content:\"\\f0b0\"}.fa-fingerprint:before{content:\"\\f577\"}.fa-fire:before{content:\"\\f06d\"}.fa-fire-alt:before{content:\"\\f7e4\"}.fa-fire-extinguisher:before{content:\"\\f134\"}.fa-firefox:before{content:\"\\f269\"}.fa-first-aid:before{content:\"\\f479\"}.fa-first-order:before{content:\"\\f2b0\"}.fa-first-order-alt:before{content:\"\\f50a\"}.fa-firstdraft:before{content:\"\\f3a1\"}.fa-fish:before{content:\"\\f578\"}.fa-fist-raised:before{content:\"\\f6de\"}.fa-flag:before{content:\"\\f024\"}.fa-flag-checkered:before{content:\"\\f11e\"}.fa-flag-usa:before{content:\"\\f74d\"}.fa-flask:before{content:\"\\f0c3\"}.fa-flickr:before{content:\"\\f16e\"}.fa-flipboard:before{content:\"\\f44d\"}.fa-flushed:before{content:\"\\f579\"}.fa-fly:before{content:\"\\f417\"}.fa-folder:before{content:\"\\f07b\"}.fa-folder-minus:before{content:\"\\f65d\"}.fa-folder-open:before{content:\"\\f07c\"}.fa-folder-plus:before{content:\"\\f65e\"}.fa-font:before{content:\"\\f031\"}.fa-font-awesome:before{content:\"\\f2b4\"}.fa-font-awesome-alt:before{content:\"\\f35c\"}.fa-font-awesome-flag:before{content:\"\\f425\"}.fa-font-awesome-logo-full:before{content:\"\\f4e6\"}.fa-fonticons:before{content:\"\\f280\"}.fa-fonticons-fi:before{content:\"\\f3a2\"}.fa-football-ball:before{content:\"\\f44e\"}.fa-fort-awesome:before{content:\"\\f286\"}.fa-fort-awesome-alt:before{content:\"\\f3a3\"}.fa-forumbee:before{content:\"\\f211\"}.fa-forward:before{content:\"\\f04e\"}.fa-foursquare:before{content:\"\\f180\"}.fa-free-code-camp:before{content:\"\\f2c5\"}.fa-freebsd:before{content:\"\\f3a4\"}.fa-frog:before{content:\"\\f52e\"}.fa-frown:before{content:\"\\f119\"}.fa-frown-open:before{content:\"\\f57a\"}.fa-fulcrum:before{content:\"\\f50b\"}.fa-funnel-dollar:before{content:\"\\f662\"}.fa-futbol:before{content:\"\\f1e3\"}.fa-galactic-republic:before{content:\"\\f50c\"}.fa-galactic-senate:before{content:\"\\f50d\"}.fa-gamepad:before{content:\"\\f11b\"}.fa-gas-pump:before{content:\"\\f52f\"}.fa-gavel:before{content:\"\\f0e3\"}.fa-gem:before{content:\"\\f3a5\"}.fa-genderless:before{content:\"\\f22d\"}.fa-get-pocket:before{content:\"\\f265\"}.fa-gg:before{content:\"\\f260\"}.fa-gg-circle:before{content:\"\\f261\"}.fa-ghost:before{content:\"\\f6e2\"}.fa-gift:before{content:\"\\f06b\"}.fa-gifts:before{content:\"\\f79c\"}.fa-git:before{content:\"\\f1d3\"}.fa-git-square:before{content:\"\\f1d2\"}.fa-github:before{content:\"\\f09b\"}.fa-github-alt:before{content:\"\\f113\"}.fa-github-square:before{content:\"\\f092\"}.fa-gitkraken:before{content:\"\\f3a6\"}.fa-gitlab:before{content:\"\\f296\"}.fa-gitter:before{content:\"\\f426\"}.fa-glass-cheers:before{content:\"\\f79f\"}.fa-glass-martini:before{content:\"\\f000\"}.fa-glass-martini-alt:before{content:\"\\f57b\"}.fa-glass-whiskey:before{content:\"\\f7a0\"}.fa-glasses:before{content:\"\\f530\"}.fa-glide:before{content:\"\\f2a5\"}.fa-glide-g:before{content:\"\\f2a6\"}.fa-globe:before{content:\"\\f0ac\"}.fa-globe-africa:before{content:\"\\f57c\"}.fa-globe-americas:before{content:\"\\f57d\"}.fa-globe-asia:before{content:\"\\f57e\"}.fa-globe-europe:before{content:\"\\f7a2\"}.fa-gofore:before{content:\"\\f3a7\"}.fa-golf-ball:before{content:\"\\f450\"}.fa-goodreads:before{content:\"\\f3a8\"}.fa-goodreads-g:before{content:\"\\f3a9\"}.fa-google:before{content:\"\\f1a0\"}.fa-google-drive:before{content:\"\\f3aa\"}.fa-google-play:before{content:\"\\f3ab\"}.fa-google-plus:before{content:\"\\f2b3\"}.fa-google-plus-g:before{content:\"\\f0d5\"}.fa-google-plus-square:before{content:\"\\f0d4\"}.fa-google-wallet:before{content:\"\\f1ee\"}.fa-gopuram:before{content:\"\\f664\"}.fa-graduation-cap:before{content:\"\\f19d\"}.fa-gratipay:before{content:\"\\f184\"}.fa-grav:before{content:\"\\f2d6\"}.fa-greater-than:before{content:\"\\f531\"}.fa-greater-than-equal:before{content:\"\\f532\"}.fa-grimace:before{content:\"\\f57f\"}.fa-grin:before{content:\"\\f580\"}.fa-grin-alt:before{content:\"\\f581\"}.fa-grin-beam:before{content:\"\\f582\"}.fa-grin-beam-sweat:before{content:\"\\f583\"}.fa-grin-hearts:before{content:\"\\f584\"}.fa-grin-squint:before{content:\"\\f585\"}.fa-grin-squint-tears:before{content:\"\\f586\"}.fa-grin-stars:before{content:\"\\f587\"}.fa-grin-tears:before{content:\"\\f588\"}.fa-grin-tongue:before{content:\"\\f589\"}.fa-grin-tongue-squint:before{content:\"\\f58a\"}.fa-grin-tongue-wink:before{content:\"\\f58b\"}.fa-grin-wink:before{content:\"\\f58c\"}.fa-grip-horizontal:before{content:\"\\f58d\"}.fa-grip-lines:before{content:\"\\f7a4\"}.fa-grip-lines-vertical:before{content:\"\\f7a5\"}.fa-grip-vertical:before{content:\"\\f58e\"}.fa-gripfire:before{content:\"\\f3ac\"}.fa-grunt:before{content:\"\\f3ad\"}.fa-guitar:before{content:\"\\f7a6\"}.fa-gulp:before{content:\"\\f3ae\"}.fa-h-square:before{content:\"\\f0fd\"}.fa-hacker-news:before{content:\"\\f1d4\"}.fa-hacker-news-square:before{content:\"\\f3af\"}.fa-hackerrank:before{content:\"\\f5f7\"}.fa-hammer:before{content:\"\\f6e3\"}.fa-hamsa:before{content:\"\\f665\"}.fa-hand-holding:before{content:\"\\f4bd\"}.fa-hand-holding-heart:before{content:\"\\f4be\"}.fa-hand-holding-usd:before{content:\"\\f4c0\"}.fa-hand-lizard:before{content:\"\\f258\"}.fa-hand-paper:before{content:\"\\f256\"}.fa-hand-peace:before{content:\"\\f25b\"}.fa-hand-point-down:before{content:\"\\f0a7\"}.fa-hand-point-left:before{content:\"\\f0a5\"}.fa-hand-point-right:before{content:\"\\f0a4\"}.fa-hand-point-up:before{content:\"\\f0a6\"}.fa-hand-pointer:before{content:\"\\f25a\"}.fa-hand-rock:before{content:\"\\f255\"}.fa-hand-scissors:before{content:\"\\f257\"}.fa-hand-spock:before{content:\"\\f259\"}.fa-hands:before{content:\"\\f4c2\"}.fa-hands-helping:before{content:\"\\f4c4\"}.fa-handshake:before{content:\"\\f2b5\"}.fa-hanukiah:before{content:\"\\f6e6\"}.fa-hashtag:before{content:\"\\f292\"}.fa-hat-wizard:before{content:\"\\f6e8\"}.fa-haykal:before{content:\"\\f666\"}.fa-hdd:before{content:\"\\f0a0\"}.fa-heading:before{content:\"\\f1dc\"}.fa-headphones:before{content:\"\\f025\"}.fa-headphones-alt:before{content:\"\\f58f\"}.fa-headset:before{content:\"\\f590\"}.fa-heart:before{content:\"\\f004\"}.fa-heart-broken:before{content:\"\\f7a9\"}.fa-heartbeat:before{content:\"\\f21e\"}.fa-helicopter:before{content:\"\\f533\"}.fa-highlighter:before{content:\"\\f591\"}.fa-hiking:before{content:\"\\f6ec\"}.fa-hippo:before{content:\"\\f6ed\"}.fa-hips:before{content:\"\\f452\"}.fa-hire-a-helper:before{content:\"\\f3b0\"}.fa-history:before{content:\"\\f1da\"}.fa-hockey-puck:before{content:\"\\f453\"}.fa-holly-berry:before{content:\"\\f7aa\"}.fa-home:before{content:\"\\f015\"}.fa-hooli:before{content:\"\\f427\"}.fa-hornbill:before{content:\"\\f592\"}.fa-horse:before{content:\"\\f6f0\"}.fa-horse-head:before{content:\"\\f7ab\"}.fa-hospital:before{content:\"\\f0f8\"}.fa-hospital-alt:before{content:\"\\f47d\"}.fa-hospital-symbol:before{content:\"\\f47e\"}.fa-hot-tub:before{content:\"\\f593\"}.fa-hotel:before{content:\"\\f594\"}.fa-hotjar:before{content:\"\\f3b1\"}.fa-hourglass:before{content:\"\\f254\"}.fa-hourglass-end:before{content:\"\\f253\"}.fa-hourglass-half:before{content:\"\\f252\"}.fa-hourglass-start:before{content:\"\\f251\"}.fa-house-damage:before{content:\"\\f6f1\"}.fa-houzz:before{content:\"\\f27c\"}.fa-hryvnia:before{content:\"\\f6f2\"}.fa-html5:before{content:\"\\f13b\"}.fa-hubspot:before{content:\"\\f3b2\"}.fa-i-cursor:before{content:\"\\f246\"}.fa-icicles:before{content:\"\\f7ad\"}.fa-id-badge:before{content:\"\\f2c1\"}.fa-id-card:before{content:\"\\f2c2\"}.fa-id-card-alt:before{content:\"\\f47f\"}.fa-igloo:before{content:\"\\f7ae\"}.fa-image:before{content:\"\\f03e\"}.fa-images:before{content:\"\\f302\"}.fa-imdb:before{content:\"\\f2d8\"}.fa-inbox:before{content:\"\\f01c\"}.fa-indent:before{content:\"\\f03c\"}.fa-industry:before{content:\"\\f275\"}.fa-infinity:before{content:\"\\f534\"}.fa-info:before{content:\"\\f129\"}.fa-info-circle:before{content:\"\\f05a\"}.fa-instagram:before{content:\"\\f16d\"}.fa-intercom:before{content:\"\\f7af\"}.fa-internet-explorer:before{content:\"\\f26b\"}.fa-invision:before{content:\"\\f7b0\"}.fa-ioxhost:before{content:\"\\f208\"}.fa-italic:before{content:\"\\f033\"}.fa-itunes:before{content:\"\\f3b4\"}.fa-itunes-note:before{content:\"\\f3b5\"}.fa-java:before{content:\"\\f4e4\"}.fa-jedi:before{content:\"\\f669\"}.fa-jedi-order:before{content:\"\\f50e\"}.fa-jenkins:before{content:\"\\f3b6\"}.fa-jira:before{content:\"\\f7b1\"}.fa-joget:before{content:\"\\f3b7\"}.fa-joint:before{content:\"\\f595\"}.fa-joomla:before{content:\"\\f1aa\"}.fa-journal-whills:before{content:\"\\f66a\"}.fa-js:before{content:\"\\f3b8\"}.fa-js-square:before{content:\"\\f3b9\"}.fa-jsfiddle:before{content:\"\\f1cc\"}.fa-kaaba:before{content:\"\\f66b\"}.fa-kaggle:before{content:\"\\f5fa\"}.fa-key:before{content:\"\\f084\"}.fa-keybase:before{content:\"\\f4f5\"}.fa-keyboard:before{content:\"\\f11c\"}.fa-keycdn:before{content:\"\\f3ba\"}.fa-khanda:before{content:\"\\f66d\"}.fa-kickstarter:before{content:\"\\f3bb\"}.fa-kickstarter-k:before{content:\"\\f3bc\"}.fa-kiss:before{content:\"\\f596\"}.fa-kiss-beam:before{content:\"\\f597\"}.fa-kiss-wink-heart:before{content:\"\\f598\"}.fa-kiwi-bird:before{content:\"\\f535\"}.fa-korvue:before{content:\"\\f42f\"}.fa-landmark:before{content:\"\\f66f\"}.fa-language:before{content:\"\\f1ab\"}.fa-laptop:before{content:\"\\f109\"}.fa-laptop-code:before{content:\"\\f5fc\"}.fa-laravel:before{content:\"\\f3bd\"}.fa-lastfm:before{content:\"\\f202\"}.fa-lastfm-square:before{content:\"\\f203\"}.fa-laugh:before{content:\"\\f599\"}.fa-laugh-beam:before{content:\"\\f59a\"}.fa-laugh-squint:before{content:\"\\f59b\"}.fa-laugh-wink:before{content:\"\\f59c\"}.fa-layer-group:before{content:\"\\f5fd\"}.fa-leaf:before{content:\"\\f06c\"}.fa-leanpub:before{content:\"\\f212\"}.fa-lemon:before{content:\"\\f094\"}.fa-less:before{content:\"\\f41d\"}.fa-less-than:before{content:\"\\f536\"}.fa-less-than-equal:before{content:\"\\f537\"}.fa-level-down-alt:before{content:\"\\f3be\"}.fa-level-up-alt:before{content:\"\\f3bf\"}.fa-life-ring:before{content:\"\\f1cd\"}.fa-lightbulb:before{content:\"\\f0eb\"}.fa-line:before{content:\"\\f3c0\"}.fa-link:before{content:\"\\f0c1\"}.fa-linkedin:before{content:\"\\f08c\"}.fa-linkedin-in:before{content:\"\\f0e1\"}.fa-linode:before{content:\"\\f2b8\"}.fa-linux:before{content:\"\\f17c\"}.fa-lira-sign:before{content:\"\\f195\"}.fa-list:before{content:\"\\f03a\"}.fa-list-alt:before{content:\"\\f022\"}.fa-list-ol:before{content:\"\\f0cb\"}.fa-list-ul:before{content:\"\\f0ca\"}.fa-location-arrow:before{content:\"\\f124\"}.fa-lock:before{content:\"\\f023\"}.fa-lock-open:before{content:\"\\f3c1\"}.fa-long-arrow-alt-down:before{content:\"\\f309\"}.fa-long-arrow-alt-left:before{content:\"\\f30a\"}.fa-long-arrow-alt-right:before{content:\"\\f30b\"}.fa-long-arrow-alt-up:before{content:\"\\f30c\"}.fa-low-vision:before{content:\"\\f2a8\"}.fa-luggage-cart:before{content:\"\\f59d\"}.fa-lyft:before{content:\"\\f3c3\"}.fa-magento:before{content:\"\\f3c4\"}.fa-magic:before{content:\"\\f0d0\"}.fa-magnet:before{content:\"\\f076\"}.fa-mail-bulk:before{content:\"\\f674\"}.fa-mailchimp:before{content:\"\\f59e\"}.fa-male:before{content:\"\\f183\"}.fa-mandalorian:before{content:\"\\f50f\"}.fa-map:before{content:\"\\f279\"}.fa-map-marked:before{content:\"\\f59f\"}.fa-map-marked-alt:before{content:\"\\f5a0\"}.fa-map-marker:before{content:\"\\f041\"}.fa-map-marker-alt:before{content:\"\\f3c5\"}.fa-map-pin:before{content:\"\\f276\"}.fa-map-signs:before{content:\"\\f277\"}.fa-markdown:before{content:\"\\f60f\"}.fa-marker:before{content:\"\\f5a1\"}.fa-mars:before{content:\"\\f222\"}.fa-mars-double:before{content:\"\\f227\"}.fa-mars-stroke:before{content:\"\\f229\"}.fa-mars-stroke-h:before{content:\"\\f22b\"}.fa-mars-stroke-v:before{content:\"\\f22a\"}.fa-mask:before{content:\"\\f6fa\"}.fa-mastodon:before{content:\"\\f4f6\"}.fa-maxcdn:before{content:\"\\f136\"}.fa-medal:before{content:\"\\f5a2\"}.fa-medapps:before{content:\"\\f3c6\"}.fa-medium:before{content:\"\\f23a\"}.fa-medium-m:before{content:\"\\f3c7\"}.fa-medkit:before{content:\"\\f0fa\"}.fa-medrt:before{content:\"\\f3c8\"}.fa-meetup:before{content:\"\\f2e0\"}.fa-megaport:before{content:\"\\f5a3\"}.fa-meh:before{content:\"\\f11a\"}.fa-meh-blank:before{content:\"\\f5a4\"}.fa-meh-rolling-eyes:before{content:\"\\f5a5\"}.fa-memory:before{content:\"\\f538\"}.fa-mendeley:before{content:\"\\f7b3\"}.fa-menorah:before{content:\"\\f676\"}.fa-mercury:before{content:\"\\f223\"}.fa-meteor:before{content:\"\\f753\"}.fa-microchip:before{content:\"\\f2db\"}.fa-microphone:before{content:\"\\f130\"}.fa-microphone-alt:before{content:\"\\f3c9\"}.fa-microphone-alt-slash:before{content:\"\\f539\"}.fa-microphone-slash:before{content:\"\\f131\"}.fa-microscope:before{content:\"\\f610\"}.fa-microsoft:before{content:\"\\f3ca\"}.fa-minus:before{content:\"\\f068\"}.fa-minus-circle:before{content:\"\\f056\"}.fa-minus-square:before{content:\"\\f146\"}.fa-mitten:before{content:\"\\f7b5\"}.fa-mix:before{content:\"\\f3cb\"}.fa-mixcloud:before{content:\"\\f289\"}.fa-mizuni:before{content:\"\\f3cc\"}.fa-mobile:before{content:\"\\f10b\"}.fa-mobile-alt:before{content:\"\\f3cd\"}.fa-modx:before{content:\"\\f285\"}.fa-monero:before{content:\"\\f3d0\"}.fa-money-bill:before{content:\"\\f0d6\"}.fa-money-bill-alt:before{content:\"\\f3d1\"}.fa-money-bill-wave:before{content:\"\\f53a\"}.fa-money-bill-wave-alt:before{content:\"\\f53b\"}.fa-money-check:before{content:\"\\f53c\"}.fa-money-check-alt:before{content:\"\\f53d\"}.fa-monument:before{content:\"\\f5a6\"}.fa-moon:before{content:\"\\f186\"}.fa-mortar-pestle:before{content:\"\\f5a7\"}.fa-mosque:before{content:\"\\f678\"}.fa-motorcycle:before{content:\"\\f21c\"}.fa-mountain:before{content:\"\\f6fc\"}.fa-mouse-pointer:before{content:\"\\f245\"}.fa-mug-hot:before{content:\"\\f7b6\"}.fa-music:before{content:\"\\f001\"}.fa-napster:before{content:\"\\f3d2\"}.fa-neos:before{content:\"\\f612\"}.fa-network-wired:before{content:\"\\f6ff\"}.fa-neuter:before{content:\"\\f22c\"}.fa-newspaper:before{content:\"\\f1ea\"}.fa-nimblr:before{content:\"\\f5a8\"}.fa-nintendo-switch:before{content:\"\\f418\"}.fa-node:before{content:\"\\f419\"}.fa-node-js:before{content:\"\\f3d3\"}.fa-not-equal:before{content:\"\\f53e\"}.fa-notes-medical:before{content:\"\\f481\"}.fa-npm:before{content:\"\\f3d4\"}.fa-ns8:before{content:\"\\f3d5\"}.fa-nutritionix:before{content:\"\\f3d6\"}.fa-object-group:before{content:\"\\f247\"}.fa-object-ungroup:before{content:\"\\f248\"}.fa-odnoklassniki:before{content:\"\\f263\"}.fa-odnoklassniki-square:before{content:\"\\f264\"}.fa-oil-can:before{content:\"\\f613\"}.fa-old-republic:before{content:\"\\f510\"}.fa-om:before{content:\"\\f679\"}.fa-opencart:before{content:\"\\f23d\"}.fa-openid:before{content:\"\\f19b\"}.fa-opera:before{content:\"\\f26a\"}.fa-optin-monster:before{content:\"\\f23c\"}.fa-osi:before{content:\"\\f41a\"}.fa-otter:before{content:\"\\f700\"}.fa-outdent:before{content:\"\\f03b\"}.fa-page4:before{content:\"\\f3d7\"}.fa-pagelines:before{content:\"\\f18c\"}.fa-paint-brush:before{content:\"\\f1fc\"}.fa-paint-roller:before{content:\"\\f5aa\"}.fa-palette:before{content:\"\\f53f\"}.fa-palfed:before{content:\"\\f3d8\"}.fa-pallet:before{content:\"\\f482\"}.fa-paper-plane:before{content:\"\\f1d8\"}.fa-paperclip:before{content:\"\\f0c6\"}.fa-parachute-box:before{content:\"\\f4cd\"}.fa-paragraph:before{content:\"\\f1dd\"}.fa-parking:before{content:\"\\f540\"}.fa-passport:before{content:\"\\f5ab\"}.fa-pastafarianism:before{content:\"\\f67b\"}.fa-paste:before{content:\"\\f0ea\"}.fa-patreon:before{content:\"\\f3d9\"}.fa-pause:before{content:\"\\f04c\"}.fa-pause-circle:before{content:\"\\f28b\"}.fa-paw:before{content:\"\\f1b0\"}.fa-paypal:before{content:\"\\f1ed\"}.fa-peace:before{content:\"\\f67c\"}.fa-pen:before{content:\"\\f304\"}.fa-pen-alt:before{content:\"\\f305\"}.fa-pen-fancy:before{content:\"\\f5ac\"}.fa-pen-nib:before{content:\"\\f5ad\"}.fa-pen-square:before{content:\"\\f14b\"}.fa-pencil-alt:before{content:\"\\f303\"}.fa-pencil-ruler:before{content:\"\\f5ae\"}.fa-penny-arcade:before{content:\"\\f704\"}.fa-people-carry:before{content:\"\\f4ce\"}.fa-percent:before{content:\"\\f295\"}.fa-percentage:before{content:\"\\f541\"}.fa-periscope:before{content:\"\\f3da\"}.fa-person-booth:before{content:\"\\f756\"}.fa-phabricator:before{content:\"\\f3db\"}.fa-phoenix-framework:before{content:\"\\f3dc\"}.fa-phoenix-squadron:before{content:\"\\f511\"}.fa-phone:before{content:\"\\f095\"}.fa-phone-slash:before{content:\"\\f3dd\"}.fa-phone-square:before{content:\"\\f098\"}.fa-phone-volume:before{content:\"\\f2a0\"}.fa-php:before{content:\"\\f457\"}.fa-pied-piper:before{content:\"\\f2ae\"}.fa-pied-piper-alt:before{content:\"\\f1a8\"}.fa-pied-piper-hat:before{content:\"\\f4e5\"}.fa-pied-piper-pp:before{content:\"\\f1a7\"}.fa-piggy-bank:before{content:\"\\f4d3\"}.fa-pills:before{content:\"\\f484\"}.fa-pinterest:before{content:\"\\f0d2\"}.fa-pinterest-p:before{content:\"\\f231\"}.fa-pinterest-square:before{content:\"\\f0d3\"}.fa-place-of-worship:before{content:\"\\f67f\"}.fa-plane:before{content:\"\\f072\"}.fa-plane-arrival:before{content:\"\\f5af\"}.fa-plane-departure:before{content:\"\\f5b0\"}.fa-play:before{content:\"\\f04b\"}.fa-play-circle:before{content:\"\\f144\"}.fa-playstation:before{content:\"\\f3df\"}.fa-plug:before{content:\"\\f1e6\"}.fa-plus:before{content:\"\\f067\"}.fa-plus-circle:before{content:\"\\f055\"}.fa-plus-square:before{content:\"\\f0fe\"}.fa-podcast:before{content:\"\\f2ce\"}.fa-poll:before{content:\"\\f681\"}.fa-poll-h:before{content:\"\\f682\"}.fa-poo:before{content:\"\\f2fe\"}.fa-poo-storm:before{content:\"\\f75a\"}.fa-poop:before{content:\"\\f619\"}.fa-portrait:before{content:\"\\f3e0\"}.fa-pound-sign:before{content:\"\\f154\"}.fa-power-off:before{content:\"\\f011\"}.fa-pray:before{content:\"\\f683\"}.fa-praying-hands:before{content:\"\\f684\"}.fa-prescription:before{content:\"\\f5b1\"}.fa-prescription-bottle:before{content:\"\\f485\"}.fa-prescription-bottle-alt:before{content:\"\\f486\"}.fa-print:before{content:\"\\f02f\"}.fa-procedures:before{content:\"\\f487\"}.fa-product-hunt:before{content:\"\\f288\"}.fa-project-diagram:before{content:\"\\f542\"}.fa-pushed:before{content:\"\\f3e1\"}.fa-puzzle-piece:before{content:\"\\f12e\"}.fa-python:before{content:\"\\f3e2\"}.fa-qq:before{content:\"\\f1d6\"}.fa-qrcode:before{content:\"\\f029\"}.fa-question:before{content:\"\\f128\"}.fa-question-circle:before{content:\"\\f059\"}.fa-quidditch:before{content:\"\\f458\"}.fa-quinscape:before{content:\"\\f459\"}.fa-quora:before{content:\"\\f2c4\"}.fa-quote-left:before{content:\"\\f10d\"}.fa-quote-right:before{content:\"\\f10e\"}.fa-quran:before{content:\"\\f687\"}.fa-r-project:before{content:\"\\f4f7\"}.fa-radiation:before{content:\"\\f7b9\"}.fa-radiation-alt:before{content:\"\\f7ba\"}.fa-rainbow:before{content:\"\\f75b\"}.fa-random:before{content:\"\\f074\"}.fa-raspberry-pi:before{content:\"\\f7bb\"}.fa-ravelry:before{content:\"\\f2d9\"}.fa-react:before{content:\"\\f41b\"}.fa-reacteurope:before{content:\"\\f75d\"}.fa-readme:before{content:\"\\f4d5\"}.fa-rebel:before{content:\"\\f1d0\"}.fa-receipt:before{content:\"\\f543\"}.fa-recycle:before{content:\"\\f1b8\"}.fa-red-river:before{content:\"\\f3e3\"}.fa-reddit:before{content:\"\\f1a1\"}.fa-reddit-alien:before{content:\"\\f281\"}.fa-reddit-square:before{content:\"\\f1a2\"}.fa-redhat:before{content:\"\\f7bc\"}.fa-redo:before{content:\"\\f01e\"}.fa-redo-alt:before{content:\"\\f2f9\"}.fa-registered:before{content:\"\\f25d\"}.fa-renren:before{content:\"\\f18b\"}.fa-reply:before{content:\"\\f3e5\"}.fa-reply-all:before{content:\"\\f122\"}.fa-replyd:before{content:\"\\f3e6\"}.fa-republican:before{content:\"\\f75e\"}.fa-researchgate:before{content:\"\\f4f8\"}.fa-resolving:before{content:\"\\f3e7\"}.fa-restroom:before{content:\"\\f7bd\"}.fa-retweet:before{content:\"\\f079\"}.fa-rev:before{content:\"\\f5b2\"}.fa-ribbon:before{content:\"\\f4d6\"}.fa-ring:before{content:\"\\f70b\"}.fa-road:before{content:\"\\f018\"}.fa-robot:before{content:\"\\f544\"}.fa-rocket:before{content:\"\\f135\"}.fa-rocketchat:before{content:\"\\f3e8\"}.fa-rockrms:before{content:\"\\f3e9\"}.fa-route:before{content:\"\\f4d7\"}.fa-rss:before{content:\"\\f09e\"}.fa-rss-square:before{content:\"\\f143\"}.fa-ruble-sign:before{content:\"\\f158\"}.fa-ruler:before{content:\"\\f545\"}.fa-ruler-combined:before{content:\"\\f546\"}.fa-ruler-horizontal:before{content:\"\\f547\"}.fa-ruler-vertical:before{content:\"\\f548\"}.fa-running:before{content:\"\\f70c\"}.fa-rupee-sign:before{content:\"\\f156\"}.fa-sad-cry:before{content:\"\\f5b3\"}.fa-sad-tear:before{content:\"\\f5b4\"}.fa-safari:before{content:\"\\f267\"}.fa-sass:before{content:\"\\f41e\"}.fa-satellite:before{content:\"\\f7bf\"}.fa-satellite-dish:before{content:\"\\f7c0\"}.fa-save:before{content:\"\\f0c7\"}.fa-schlix:before{content:\"\\f3ea\"}.fa-school:before{content:\"\\f549\"}.fa-screwdriver:before{content:\"\\f54a\"}.fa-scribd:before{content:\"\\f28a\"}.fa-scroll:before{content:\"\\f70e\"}.fa-sd-card:before{content:\"\\f7c2\"}.fa-search:before{content:\"\\f002\"}.fa-search-dollar:before{content:\"\\f688\"}.fa-search-location:before{content:\"\\f689\"}.fa-search-minus:before{content:\"\\f010\"}.fa-search-plus:before{content:\"\\f00e\"}.fa-searchengin:before{content:\"\\f3eb\"}.fa-seedling:before{content:\"\\f4d8\"}.fa-sellcast:before{content:\"\\f2da\"}.fa-sellsy:before{content:\"\\f213\"}.fa-server:before{content:\"\\f233\"}.fa-servicestack:before{content:\"\\f3ec\"}.fa-shapes:before{content:\"\\f61f\"}.fa-share:before{content:\"\\f064\"}.fa-share-alt:before{content:\"\\f1e0\"}.fa-share-alt-square:before{content:\"\\f1e1\"}.fa-share-square:before{content:\"\\f14d\"}.fa-shekel-sign:before{content:\"\\f20b\"}.fa-shield-alt:before{content:\"\\f3ed\"}.fa-ship:before{content:\"\\f21a\"}.fa-shipping-fast:before{content:\"\\f48b\"}.fa-shirtsinbulk:before{content:\"\\f214\"}.fa-shoe-prints:before{content:\"\\f54b\"}.fa-shopping-bag:before{content:\"\\f290\"}.fa-shopping-basket:before{content:\"\\f291\"}.fa-shopping-cart:before{content:\"\\f07a\"}.fa-shopware:before{content:\"\\f5b5\"}.fa-shower:before{content:\"\\f2cc\"}.fa-shuttle-van:before{content:\"\\f5b6\"}.fa-sign:before{content:\"\\f4d9\"}.fa-sign-in-alt:before{content:\"\\f2f6\"}.fa-sign-language:before{content:\"\\f2a7\"}.fa-sign-out-alt:before{content:\"\\f2f5\"}.fa-signal:before{content:\"\\f012\"}.fa-signature:before{content:\"\\f5b7\"}.fa-sim-card:before{content:\"\\f7c4\"}.fa-simplybuilt:before{content:\"\\f215\"}.fa-sistrix:before{content:\"\\f3ee\"}.fa-sitemap:before{content:\"\\f0e8\"}.fa-sith:before{content:\"\\f512\"}.fa-skating:before{content:\"\\f7c5\"}.fa-sketch:before{content:\"\\f7c6\"}.fa-skiing:before{content:\"\\f7c9\"}.fa-skiing-nordic:before{content:\"\\f7ca\"}.fa-skull:before{content:\"\\f54c\"}.fa-skull-crossbones:before{content:\"\\f714\"}.fa-skyatlas:before{content:\"\\f216\"}.fa-skype:before{content:\"\\f17e\"}.fa-slack:before{content:\"\\f198\"}.fa-slack-hash:before{content:\"\\f3ef\"}.fa-slash:before{content:\"\\f715\"}.fa-sleigh:before{content:\"\\f7cc\"}.fa-sliders-h:before{content:\"\\f1de\"}.fa-slideshare:before{content:\"\\f1e7\"}.fa-smile:before{content:\"\\f118\"}.fa-smile-beam:before{content:\"\\f5b8\"}.fa-smile-wink:before{content:\"\\f4da\"}.fa-smog:before{content:\"\\f75f\"}.fa-smoking:before{content:\"\\f48d\"}.fa-smoking-ban:before{content:\"\\f54d\"}.fa-sms:before{content:\"\\f7cd\"}.fa-snapchat:before{content:\"\\f2ab\"}.fa-snapchat-ghost:before{content:\"\\f2ac\"}.fa-snapchat-square:before{content:\"\\f2ad\"}.fa-snowboarding:before{content:\"\\f7ce\"}.fa-snowflake:before{content:\"\\f2dc\"}.fa-snowman:before{content:\"\\f7d0\"}.fa-snowplow:before{content:\"\\f7d2\"}.fa-socks:before{content:\"\\f696\"}.fa-solar-panel:before{content:\"\\f5ba\"}.fa-sort:before{content:\"\\f0dc\"}.fa-sort-alpha-down:before{content:\"\\f15d\"}.fa-sort-alpha-up:before{content:\"\\f15e\"}.fa-sort-amount-down:before{content:\"\\f160\"}.fa-sort-amount-up:before{content:\"\\f161\"}.fa-sort-down:before{content:\"\\f0dd\"}.fa-sort-numeric-down:before{content:\"\\f162\"}.fa-sort-numeric-up:before{content:\"\\f163\"}.fa-sort-up:before{content:\"\\f0de\"}.fa-soundcloud:before{content:\"\\f1be\"}.fa-sourcetree:before{content:\"\\f7d3\"}.fa-spa:before{content:\"\\f5bb\"}.fa-space-shuttle:before{content:\"\\f197\"}.fa-speakap:before{content:\"\\f3f3\"}.fa-spider:before{content:\"\\f717\"}.fa-spinner:before{content:\"\\f110\"}.fa-splotch:before{content:\"\\f5bc\"}.fa-spotify:before{content:\"\\f1bc\"}.fa-spray-can:before{content:\"\\f5bd\"}.fa-square:before{content:\"\\f0c8\"}.fa-square-full:before{content:\"\\f45c\"}.fa-square-root-alt:before{content:\"\\f698\"}.fa-squarespace:before{content:\"\\f5be\"}.fa-stack-exchange:before{content:\"\\f18d\"}.fa-stack-overflow:before{content:\"\\f16c\"}.fa-stamp:before{content:\"\\f5bf\"}.fa-star:before{content:\"\\f005\"}.fa-star-and-crescent:before{content:\"\\f699\"}.fa-star-half:before{content:\"\\f089\"}.fa-star-half-alt:before{content:\"\\f5c0\"}.fa-star-of-david:before{content:\"\\f69a\"}.fa-star-of-life:before{content:\"\\f621\"}.fa-staylinked:before{content:\"\\f3f5\"}.fa-steam:before{content:\"\\f1b6\"}.fa-steam-square:before{content:\"\\f1b7\"}.fa-steam-symbol:before{content:\"\\f3f6\"}.fa-step-backward:before{content:\"\\f048\"}.fa-step-forward:before{content:\"\\f051\"}.fa-stethoscope:before{content:\"\\f0f1\"}.fa-sticker-mule:before{content:\"\\f3f7\"}.fa-sticky-note:before{content:\"\\f249\"}.fa-stop:before{content:\"\\f04d\"}.fa-stop-circle:before{content:\"\\f28d\"}.fa-stopwatch:before{content:\"\\f2f2\"}.fa-store:before{content:\"\\f54e\"}.fa-store-alt:before{content:\"\\f54f\"}.fa-strava:before{content:\"\\f428\"}.fa-stream:before{content:\"\\f550\"}.fa-street-view:before{content:\"\\f21d\"}.fa-strikethrough:before{content:\"\\f0cc\"}.fa-stripe:before{content:\"\\f429\"}.fa-stripe-s:before{content:\"\\f42a\"}.fa-stroopwafel:before{content:\"\\f551\"}.fa-studiovinari:before{content:\"\\f3f8\"}.fa-stumbleupon:before{content:\"\\f1a4\"}.fa-stumbleupon-circle:before{content:\"\\f1a3\"}.fa-subscript:before{content:\"\\f12c\"}.fa-subway:before{content:\"\\f239\"}.fa-suitcase:before{content:\"\\f0f2\"}.fa-suitcase-rolling:before{content:\"\\f5c1\"}.fa-sun:before{content:\"\\f185\"}.fa-superpowers:before{content:\"\\f2dd\"}.fa-superscript:before{content:\"\\f12b\"}.fa-supple:before{content:\"\\f3f9\"}.fa-surprise:before{content:\"\\f5c2\"}.fa-suse:before{content:\"\\f7d6\"}.fa-swatchbook:before{content:\"\\f5c3\"}.fa-swimmer:before{content:\"\\f5c4\"}.fa-swimming-pool:before{content:\"\\f5c5\"}.fa-synagogue:before{content:\"\\f69b\"}.fa-sync:before{content:\"\\f021\"}.fa-sync-alt:before{content:\"\\f2f1\"}.fa-syringe:before{content:\"\\f48e\"}.fa-table:before{content:\"\\f0ce\"}.fa-table-tennis:before{content:\"\\f45d\"}.fa-tablet:before{content:\"\\f10a\"}.fa-tablet-alt:before{content:\"\\f3fa\"}.fa-tablets:before{content:\"\\f490\"}.fa-tachometer-alt:before{content:\"\\f3fd\"}.fa-tag:before{content:\"\\f02b\"}.fa-tags:before{content:\"\\f02c\"}.fa-tape:before{content:\"\\f4db\"}.fa-tasks:before{content:\"\\f0ae\"}.fa-taxi:before{content:\"\\f1ba\"}.fa-teamspeak:before{content:\"\\f4f9\"}.fa-teeth:before{content:\"\\f62e\"}.fa-teeth-open:before{content:\"\\f62f\"}.fa-telegram:before{content:\"\\f2c6\"}.fa-telegram-plane:before{content:\"\\f3fe\"}.fa-temperature-high:before{content:\"\\f769\"}.fa-temperature-low:before{content:\"\\f76b\"}.fa-tencent-weibo:before{content:\"\\f1d5\"}.fa-tenge:before{content:\"\\f7d7\"}.fa-terminal:before{content:\"\\f120\"}.fa-text-height:before{content:\"\\f034\"}.fa-text-width:before{content:\"\\f035\"}.fa-th:before{content:\"\\f00a\"}.fa-th-large:before{content:\"\\f009\"}.fa-th-list:before{content:\"\\f00b\"}.fa-the-red-yeti:before{content:\"\\f69d\"}.fa-theater-masks:before{content:\"\\f630\"}.fa-themeco:before{content:\"\\f5c6\"}.fa-themeisle:before{content:\"\\f2b2\"}.fa-thermometer:before{content:\"\\f491\"}.fa-thermometer-empty:before{content:\"\\f2cb\"}.fa-thermometer-full:before{content:\"\\f2c7\"}.fa-thermometer-half:before{content:\"\\f2c9\"}.fa-thermometer-quarter:before{content:\"\\f2ca\"}.fa-thermometer-three-quarters:before{content:\"\\f2c8\"}.fa-think-peaks:before{content:\"\\f731\"}.fa-thumbs-down:before{content:\"\\f165\"}.fa-thumbs-up:before{content:\"\\f164\"}.fa-thumbtack:before{content:\"\\f08d\"}.fa-ticket-alt:before{content:\"\\f3ff\"}.fa-times:before{content:\"\\f00d\"}.fa-times-circle:before{content:\"\\f057\"}.fa-tint:before{content:\"\\f043\"}.fa-tint-slash:before{content:\"\\f5c7\"}.fa-tired:before{content:\"\\f5c8\"}.fa-toggle-off:before{content:\"\\f204\"}.fa-toggle-on:before{content:\"\\f205\"}.fa-toilet:before{content:\"\\f7d8\"}.fa-toilet-paper:before{content:\"\\f71e\"}.fa-toolbox:before{content:\"\\f552\"}.fa-tools:before{content:\"\\f7d9\"}.fa-tooth:before{content:\"\\f5c9\"}.fa-torah:before{content:\"\\f6a0\"}.fa-torii-gate:before{content:\"\\f6a1\"}.fa-tractor:before{content:\"\\f722\"}.fa-trade-federation:before{content:\"\\f513\"}.fa-trademark:before{content:\"\\f25c\"}.fa-traffic-light:before{content:\"\\f637\"}.fa-train:before{content:\"\\f238\"}.fa-tram:before{content:\"\\f7da\"}.fa-transgender:before{content:\"\\f224\"}.fa-transgender-alt:before{content:\"\\f225\"}.fa-trash:before{content:\"\\f1f8\"}.fa-trash-alt:before{content:\"\\f2ed\"}.fa-tree:before{content:\"\\f1bb\"}.fa-trello:before{content:\"\\f181\"}.fa-tripadvisor:before{content:\"\\f262\"}.fa-trophy:before{content:\"\\f091\"}.fa-truck:before{content:\"\\f0d1\"}.fa-truck-loading:before{content:\"\\f4de\"}.fa-truck-monster:before{content:\"\\f63b\"}.fa-truck-moving:before{content:\"\\f4df\"}.fa-truck-pickup:before{content:\"\\f63c\"}.fa-tshirt:before{content:\"\\f553\"}.fa-tty:before{content:\"\\f1e4\"}.fa-tumblr:before{content:\"\\f173\"}.fa-tumblr-square:before{content:\"\\f174\"}.fa-tv:before{content:\"\\f26c\"}.fa-twitch:before{content:\"\\f1e8\"}.fa-twitter:before{content:\"\\f099\"}.fa-twitter-square:before{content:\"\\f081\"}.fa-typo3:before{content:\"\\f42b\"}.fa-uber:before{content:\"\\f402\"}.fa-ubuntu:before{content:\"\\f7df\"}.fa-uikit:before{content:\"\\f403\"}.fa-umbrella:before{content:\"\\f0e9\"}.fa-umbrella-beach:before{content:\"\\f5ca\"}.fa-underline:before{content:\"\\f0cd\"}.fa-undo:before{content:\"\\f0e2\"}.fa-undo-alt:before{content:\"\\f2ea\"}.fa-uniregistry:before{content:\"\\f404\"}.fa-universal-access:before{content:\"\\f29a\"}.fa-university:before{content:\"\\f19c\"}.fa-unlink:before{content:\"\\f127\"}.fa-unlock:before{content:\"\\f09c\"}.fa-unlock-alt:before{content:\"\\f13e\"}.fa-untappd:before{content:\"\\f405\"}.fa-upload:before{content:\"\\f093\"}.fa-ups:before{content:\"\\f7e0\"}.fa-usb:before{content:\"\\f287\"}.fa-user:before{content:\"\\f007\"}.fa-user-alt:before{content:\"\\f406\"}.fa-user-alt-slash:before{content:\"\\f4fa\"}.fa-user-astronaut:before{content:\"\\f4fb\"}.fa-user-check:before{content:\"\\f4fc\"}.fa-user-circle:before{content:\"\\f2bd\"}.fa-user-clock:before{content:\"\\f4fd\"}.fa-user-cog:before{content:\"\\f4fe\"}.fa-user-edit:before{content:\"\\f4ff\"}.fa-user-friends:before{content:\"\\f500\"}.fa-user-graduate:before{content:\"\\f501\"}.fa-user-injured:before{content:\"\\f728\"}.fa-user-lock:before{content:\"\\f502\"}.fa-user-md:before{content:\"\\f0f0\"}.fa-user-minus:before{content:\"\\f503\"}.fa-user-ninja:before{content:\"\\f504\"}.fa-user-plus:before{content:\"\\f234\"}.fa-user-secret:before{content:\"\\f21b\"}.fa-user-shield:before{content:\"\\f505\"}.fa-user-slash:before{content:\"\\f506\"}.fa-user-tag:before{content:\"\\f507\"}.fa-user-tie:before{content:\"\\f508\"}.fa-user-times:before{content:\"\\f235\"}.fa-users:before{content:\"\\f0c0\"}.fa-users-cog:before{content:\"\\f509\"}.fa-usps:before{content:\"\\f7e1\"}.fa-ussunnah:before{content:\"\\f407\"}.fa-utensil-spoon:before{content:\"\\f2e5\"}.fa-utensils:before{content:\"\\f2e7\"}.fa-vaadin:before{content:\"\\f408\"}.fa-vector-square:before{content:\"\\f5cb\"}.fa-venus:before{content:\"\\f221\"}.fa-venus-double:before{content:\"\\f226\"}.fa-venus-mars:before{content:\"\\f228\"}.fa-viacoin:before{content:\"\\f237\"}.fa-viadeo:before{content:\"\\f2a9\"}.fa-viadeo-square:before{content:\"\\f2aa\"}.fa-vial:before{content:\"\\f492\"}.fa-vials:before{content:\"\\f493\"}.fa-viber:before{content:\"\\f409\"}.fa-video:before{content:\"\\f03d\"}.fa-video-slash:before{content:\"\\f4e2\"}.fa-vihara:before{content:\"\\f6a7\"}.fa-vimeo:before{content:\"\\f40a\"}.fa-vimeo-square:before{content:\"\\f194\"}.fa-vimeo-v:before{content:\"\\f27d\"}.fa-vine:before{content:\"\\f1ca\"}.fa-vk:before{content:\"\\f189\"}.fa-vnv:before{content:\"\\f40b\"}.fa-volleyball-ball:before{content:\"\\f45f\"}.fa-volume-down:before{content:\"\\f027\"}.fa-volume-mute:before{content:\"\\f6a9\"}.fa-volume-off:before{content:\"\\f026\"}.fa-volume-up:before{content:\"\\f028\"}.fa-vote-yea:before{content:\"\\f772\"}.fa-vr-cardboard:before{content:\"\\f729\"}.fa-vuejs:before{content:\"\\f41f\"}.fa-walking:before{content:\"\\f554\"}.fa-wallet:before{content:\"\\f555\"}.fa-warehouse:before{content:\"\\f494\"}.fa-water:before{content:\"\\f773\"}.fa-weebly:before{content:\"\\f5cc\"}.fa-weibo:before{content:\"\\f18a\"}.fa-weight:before{content:\"\\f496\"}.fa-weight-hanging:before{content:\"\\f5cd\"}.fa-weixin:before{content:\"\\f1d7\"}.fa-whatsapp:before{content:\"\\f232\"}.fa-whatsapp-square:before{content:\"\\f40c\"}.fa-wheelchair:before{content:\"\\f193\"}.fa-whmcs:before{content:\"\\f40d\"}.fa-wifi:before{content:\"\\f1eb\"}.fa-wikipedia-w:before{content:\"\\f266\"}.fa-wind:before{content:\"\\f72e\"}.fa-window-close:before{content:\"\\f410\"}.fa-window-maximize:before{content:\"\\f2d0\"}.fa-window-minimize:before{content:\"\\f2d1\"}.fa-window-restore:before{content:\"\\f2d2\"}.fa-windows:before{content:\"\\f17a\"}.fa-wine-bottle:before{content:\"\\f72f\"}.fa-wine-glass:before{content:\"\\f4e3\"}.fa-wine-glass-alt:before{content:\"\\f5ce\"}.fa-wix:before{content:\"\\f5cf\"}.fa-wizards-of-the-coast:before{content:\"\\f730\"}.fa-wolf-pack-battalion:before{content:\"\\f514\"}.fa-won-sign:before{content:\"\\f159\"}.fa-wordpress:before{content:\"\\f19a\"}.fa-wordpress-simple:before{content:\"\\f411\"}.fa-wpbeginner:before{content:\"\\f297\"}.fa-wpexplorer:before{content:\"\\f2de\"}.fa-wpforms:before{content:\"\\f298\"}.fa-wpressr:before{content:\"\\f3e4\"}.fa-wrench:before{content:\"\\f0ad\"}.fa-x-ray:before{content:\"\\f497\"}.fa-xbox:before{content:\"\\f412\"}.fa-xing:before{content:\"\\f168\"}.fa-xing-square:before{content:\"\\f169\"}.fa-y-combinator:before{content:\"\\f23b\"}.fa-yahoo:before{content:\"\\f19e\"}.fa-yandex:before{content:\"\\f413\"}.fa-yandex-international:before{content:\"\\f414\"}.fa-yarn:before{content:\"\\f7e3\"}.fa-yelp:before{content:\"\\f1e9\"}.fa-yen-sign:before{content:\"\\f157\"}.fa-yin-yang:before{content:\"\\f6ad\"}.fa-yoast:before{content:\"\\f2b1\"}.fa-youtube:before{content:\"\\f167\"}.fa-youtube-square:before{content:\"\\f431\"}.fa-zhihu:before{content:\"\\f63f\"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:\"Font Awesome 5 Brands\";font-style:normal;font-weight:normal;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format(\"embedded-opentype\"),url(../webfonts/fa-brands-400.woff2) format(\"woff2\"),url(../webfonts/fa-brands-400.woff) format(\"woff\"),url(../webfonts/fa-brands-400.ttf) format(\"truetype\"),url(../webfonts/fa-brands-400.svg#fontawesome) format(\"svg\")}.fab{font-family:\"Font Awesome 5 Brands\"}@font-face{font-family:\"Font Awesome 5 Free\";font-style:normal;font-weight:400;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format(\"embedded-opentype\"),url(../webfonts/fa-regular-400.woff2) format(\"woff2\"),url(../webfonts/fa-regular-400.woff) format(\"woff\"),url(../webfonts/fa-regular-400.ttf) format(\"truetype\"),url(../webfonts/fa-regular-400.svg#fontawesome) format(\"svg\")}.far{font-weight:400}@font-face{font-family:\"Font Awesome 5 Free\";font-style:normal;font-weight:900;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format(\"embedded-opentype\"),url(../webfonts/fa-solid-900.woff2) format(\"woff2\"),url(../webfonts/fa-solid-900.woff) format(\"woff\"),url(../webfonts/fa-solid-900.ttf) format(\"truetype\"),url(../webfonts/fa-solid-900.svg#fontawesome) format(\"svg\")}.fa,.far,.fas{font-family:\"Font Awesome 5 Free\"}.fa,.fas{font-weight:900}"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/jquery/jquery-3.6.0.js",
    "content": "/*!\n * jQuery JavaScript Library v3.6.0\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * Copyright OpenJS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2021-03-02T17:08Z\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar flat = arr.flat ? function( array ) {\n\treturn arr.flat.call( array );\n} : function( array ) {\n\treturn arr.concat.apply( [], array );\n};\n\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\nvar isFunction = function isFunction( obj ) {\n\n\t\t// Support: Chrome <=57, Firefox <=52\n\t\t// In some browsers, typeof returns \"function\" for HTML <object> elements\n\t\t// (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n\t\t// We don't want to classify *any* DOM node as a function.\n\t\t// Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5\n\t\t// Plus for old WebKit, typeof returns \"function\" for HTML collections\n\t\t// (e.g., `typeof document.getElementsByTagName(\"div\") === \"function\"`). (gh-4756)\n\t\treturn typeof obj === \"function\" && typeof obj.nodeType !== \"number\" &&\n\t\t\ttypeof obj.item !== \"function\";\n\t};\n\n\nvar isWindow = function isWindow( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t};\n\n\nvar document = window.document;\n\n\n\n\tvar preservedScriptAttributes = {\n\t\ttype: true,\n\t\tsrc: true,\n\t\tnonce: true,\n\t\tnoModule: true\n\t};\n\n\tfunction DOMEval( code, node, doc ) {\n\t\tdoc = doc || document;\n\n\t\tvar i, val,\n\t\t\tscript = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tif ( node ) {\n\t\t\tfor ( i in preservedScriptAttributes ) {\n\n\t\t\t\t// Support: Firefox 64+, Edge 18+\n\t\t\t\t// Some browsers don't support the \"nonce\" property on scripts.\n\t\t\t\t// On the other hand, just using `getAttribute` is not enough as\n\t\t\t\t// the `nonce` attribute is reset to an empty string whenever it\n\t\t\t\t// becomes browsing-context connected.\n\t\t\t\t// See https://github.com/whatwg/html/issues/2369\n\t\t\t\t// See https://html.spec.whatwg.org/#nonce-attributes\n\t\t\t\t// The `node.getAttribute` check was added for the sake of\n\t\t\t\t// `jQuery.globalEval` so that it can fake a nonce-containing node\n\t\t\t\t// via an object.\n\t\t\t\tval = node[ i ] || node.getAttribute && node.getAttribute( i );\n\t\t\t\tif ( val ) {\n\t\t\t\t\tscript.setAttribute( i, val );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n\n\nfunction toType( obj ) {\n\tif ( obj == null ) {\n\t\treturn obj + \"\";\n\t}\n\n\t// Support: Android <=2.3 only (functionish RegExp)\n\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\ttypeof obj;\n}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar\n\tversion = \"3.6.0\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t};\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teven: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn ( i + 1 ) % 2;\n\t\t} ) );\n\t},\n\n\todd: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn i % 2;\n\t\t} ) );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent Object.prototype pollution\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( name === \"__proto__\" || target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) {\n\t\t\t\t\tsrc = target[ name ];\n\n\t\t\t\t\t// Ensure proper type for the source value\n\t\t\t\t\tif ( copyIsArray && !Array.isArray( src ) ) {\n\t\t\t\t\t\tclone = [];\n\t\t\t\t\t} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {\n\t\t\t\t\t\tclone = {};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src;\n\t\t\t\t\t}\n\t\t\t\t\tcopyIsArray = false;\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\t// Evaluates a script in a provided context; falls back to the global one\n\t// if not specified.\n\tglobalEval: function( code, options, doc ) {\n\t\tDOMEval( code, { nonce: options && options.nonce }, doc );\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn flat( ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\n\tfunction( _i, name ) {\n\t\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n\t} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = toType( obj );\n\n\tif ( isFunction( obj ) || isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.3.6\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://js.foundation/\n *\n * Date: 2021-02-16\n */\n( function( window ) {\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tnonnativeSelectorCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// Instance methods\n\thasOwn = ( {} ).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpushNative = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\n\t// Use a stripped-down indexOf as it's faster than native\n\t// https://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[ i ] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|\" +\n\t\t\"ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\n\t// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram\n\tidentifier = \"(?:\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace +\n\t\t\"?|\\\\\\\\[^\\\\r\\\\n\\\\f]|[\\\\w-]|[^\\0-\\\\x7f])+\",\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\n\t\t// \"Attribute values must be CSS identifiers [capture 5]\n\t\t// or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" +\n\t\twhitespace + \"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" +\n\t\twhitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace +\n\t\t\"*\" ),\n\trdescend = new RegExp( whitespace + \"|>\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" +\n\t\t\twhitespace + \"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" +\n\t\t\twhitespace + \"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace +\n\t\t\t\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" + whitespace +\n\t\t\t\"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trhtml = /HTML$/i,\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace + \"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\", \"g\" ),\n\tfunescape = function( escape, nonHex ) {\n\t\tvar high = \"0x\" + escape.slice( 1 ) - 0x10000;\n\n\t\treturn nonHex ?\n\n\t\t\t// Strip the backslash prefix from a non-hex escape sequence\n\t\t\tnonHex :\n\n\t\t\t// Replace a hexadecimal escape sequence with the encoded Unicode code point\n\t\t\t// Support: IE <=11+\n\t\t\t// For values outside the Basic Multilingual Plane (BMP), manually construct a\n\t\t\t// surrogate pair\n\t\t\thigh < 0 ?\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// CSS string/identifier serialization\n\t// https://drafts.csswg.org/cssom/#common-serializing-idioms\n\trcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,\n\tfcssescape = function( ch, asCodePoint ) {\n\t\tif ( asCodePoint ) {\n\n\t\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\t\tif ( ch === \"\\0\" ) {\n\t\t\t\treturn \"\\uFFFD\";\n\t\t\t}\n\n\t\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\t\treturn ch.slice( 0, -1 ) + \"\\\\\" +\n\t\t\t\tch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t\t}\n\n\t\t// Other potentially-special ASCII characters get backslash-escaped\n\t\treturn \"\\\\\" + ch;\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tinDisabledFieldset = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && elem.nodeName.toLowerCase() === \"fieldset\";\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t( arr = slice.call( preferredDoc.childNodes ) ),\n\t\tpreferredDoc.childNodes\n\t);\n\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\t// eslint-disable-next-line no-unused-expressions\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpushNative.apply( target, slice.call( els ) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( ( target[ j++ ] = els[ i++ ] ) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\t\tsetDocument( context );\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( ( m = match[ 1 ] ) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( ( elem = context.getElementById( m ) ) ) {\n\n\t\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && ( elem = newContext.getElementById( m ) ) &&\n\t\t\t\t\t\t\tcontains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[ 2 ] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&\n\t\t\t\t\tcontext.getElementsByClassName ) {\n\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( support.qsa &&\n\t\t\t\t!nonnativeSelectorCache[ selector + \" \" ] &&\n\t\t\t\t( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&\n\n\t\t\t\t// Support: IE 8 only\n\t\t\t\t// Exclude object elements\n\t\t\t\t( nodeType !== 1 || context.nodeName.toLowerCase() !== \"object\" ) ) {\n\n\t\t\t\tnewSelector = selector;\n\t\t\t\tnewContext = context;\n\n\t\t\t\t// qSA considers elements outside a scoping root when evaluating child or\n\t\t\t\t// descendant combinators, which is not what we want.\n\t\t\t\t// In such cases, we work around the behavior by prefixing every selector in the\n\t\t\t\t// list with an ID selector referencing the scope context.\n\t\t\t\t// The technique has to be used as well when a leading combinator is used\n\t\t\t\t// as such selectors are not recognized by querySelectorAll.\n\t\t\t\t// Thanks to Andrew Dupont for this technique.\n\t\t\t\tif ( nodeType === 1 &&\n\t\t\t\t\t( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\n\t\t\t\t\t// We can use :scope instead of the ID hack if the browser\n\t\t\t\t\t// supports it & if we're not changing the context.\n\t\t\t\t\tif ( newContext !== context || !support.scope ) {\n\n\t\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\t\tif ( ( nid = context.getAttribute( \"id\" ) ) ) {\n\t\t\t\t\t\t\tnid = nid.replace( rcssescape, fcssescape );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcontext.setAttribute( \"id\", ( nid = expando ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[ i ] = ( nid ? \"#\" + nid : \":scope\" ) + \" \" +\n\t\t\t\t\t\t\ttoSelector( groups[ i ] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\tnonnativeSelectorCache( selector, true );\n\t\t\t\t} finally {\n\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn ( cache[ key + \" \" ] = value );\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement( \"fieldset\" );\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch ( e ) {\n\t\treturn false;\n\t} finally {\n\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split( \"|\" ),\n\t\ti = arr.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[ i ] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\ta.sourceIndex - b.sourceIndex;\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( ( cur = cur.nextSibling ) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn ( name === \"input\" || name === \"button\" ) && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\t/* jshint -W018 */\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\tinDisabledFieldset( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction( function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction( function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ ( j = matchIndexes[ i ] ) ] ) {\n\t\t\t\t\tseed[ j ] = !( matches[ j ] = seed[ j ] );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t} );\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\tvar namespace = elem && elem.namespaceURI,\n\t\tdocElem = elem && ( elem.ownerDocument || elem ).documentElement;\n\n\t// Support: IE <=8\n\t// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes\n\t// https://bugs.jquery.com/ticket/4833\n\treturn !rhtml.test( namespace || docElem && docElem.nodeName || \"HTML\" );\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocElem = document.documentElement;\n\tdocumentIsHTML = !isXML( document );\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( preferredDoc != document &&\n\t\t( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 11, Edge\n\t\tif ( subWindow.addEventListener ) {\n\t\t\tsubWindow.addEventListener( \"unload\", unloadHandler, false );\n\n\t\t// Support: IE 9 - 10 only\n\t\t} else if ( subWindow.attachEvent ) {\n\t\t\tsubWindow.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t// Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,\n\t// Safari 4 - 5 only, Opera <=11.6 - 12.x only\n\t// IE/Edge & older browsers don't support the :scope pseudo-class.\n\t// Support: Safari 6.0 only\n\t// Safari 6.0 supports :scope but it's an alias of :root there.\n\tsupport.scope = assert( function( el ) {\n\t\tdocElem.appendChild( el ).appendChild( document.createElement( \"div\" ) );\n\t\treturn typeof el.querySelectorAll !== \"undefined\" &&\n\t\t\t!el.querySelectorAll( \":scope fieldset div\" ).length;\n\t} );\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert( function( el ) {\n\t\tel.className = \"i\";\n\t\treturn !el.getAttribute( \"className\" );\n\t} );\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert( function( el ) {\n\t\tel.appendChild( document.createComment( \"\" ) );\n\t\treturn !el.getElementsByTagName( \"*\" ).length;\n\t} );\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert( function( el ) {\n\t\tdocElem.appendChild( el ).id = expando;\n\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\n\t} );\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter[ \"ID\" ] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute( \"id\" ) === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find[ \"ID\" ] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter[ \"ID\" ] =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode( \"id\" );\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find[ \"ID\" ] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( ( elem = elems[ i++ ] ) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[ \"TAG\" ] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[ \"CLASS\" ] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See https://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {\n\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert( function( el ) {\n\n\t\t\tvar input;\n\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// https://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( el ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\r\\\\' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( el.querySelectorAll( \"[msallowcapture^='']\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !el.querySelectorAll( \"[selected]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n\t\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"~=\" );\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 15 - 18+\n\t\t\t// IE 11/Edge don't find elements on a `[name='']` query in some cases.\n\t\t\t// Adding a temporary attribute to the document before the selection works\n\t\t\t// around the issue.\n\t\t\t// Interestingly, IE 10 & older don't seem to have the issue.\n\t\t\tinput = document.createElement( \"input\" );\n\t\t\tinput.setAttribute( \"name\", \"\" );\n\t\t\tel.appendChild( input );\n\t\t\tif ( !el.querySelectorAll( \"[name='']\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*name\" + whitespace + \"*=\" +\n\t\t\t\t\twhitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !el.querySelectorAll( \":checked\" ).length ) {\n\t\t\t\trbuggyQSA.push( \":checked\" );\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push( \".#.+[+~]\" );\n\t\t\t}\n\n\t\t\t// Support: Firefox <=3.6 - 5 only\n\t\t\t// Old Firefox doesn't throw on a badly-escaped identifier.\n\t\t\tel.querySelectorAll( \"\\\\\\f\" );\n\t\t\trbuggyQSA.push( \"[\\\\r\\\\n\\\\f]\" );\n\t\t} );\n\n\t\tassert( function( el ) {\n\t\t\tel.innerHTML = \"<a href='' disabled='disabled'></a>\" +\n\t\t\t\t\"<select disabled='disabled'><option/></select>\";\n\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = document.createElement( \"input\" );\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( el.querySelectorAll( \"[name=d]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( el.querySelectorAll( \":enabled\" ).length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t\tdocElem.appendChild( el ).disabled = true;\n\t\t\tif ( el.querySelectorAll( \":disabled\" ).length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: Opera 10 - 11 only\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tel.querySelectorAll( \"*,:x\" );\n\t\t\trbuggyQSA.push( \",.*:\" );\n\t\t} );\n\t}\n\n\tif ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector ) ) ) ) {\n\n\t\tassert( function( el ) {\n\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( el, \"*\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( el, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t} );\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( \"|\" ) );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( \"|\" ) );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully self-exclusive\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t) );\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( ( b = b.parentNode ) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t// two documents; shallow comparisons work.\n\t\t// eslint-disable-next-line eqeqeq\n\t\tcompare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( a == document || a.ownerDocument == preferredDoc &&\n\t\t\t\tcontains( preferredDoc, a ) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( b == document || b.ownerDocument == preferredDoc &&\n\t\t\t\tcontains( preferredDoc, b ) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t/* eslint-disable eqeqeq */\n\t\t\treturn a == document ? -1 :\n\t\t\t\tb == document ? 1 :\n\t\t\t\t/* eslint-enable eqeqeq */\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( ( cur = cur.parentNode ) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( ( cur = cur.parentNode ) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[ i ] === bp[ i ] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[ i ], bp[ i ] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t/* eslint-disable eqeqeq */\n\t\t\tap[ i ] == preferredDoc ? -1 :\n\t\t\tbp[ i ] == preferredDoc ? 1 :\n\t\t\t/* eslint-enable eqeqeq */\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\tsetDocument( elem );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t!nonnativeSelectorCache[ expr + \" \" ] &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\n\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t// fragment in IE 9\n\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\tnonnativeSelectorCache( expr, true );\n\t\t}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( context.ownerDocument || context ) != document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( elem.ownerDocument || elem ) != document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t( val = elem.getAttributeNode( name ) ) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.escape = function( sel ) {\n\treturn ( sel + \"\" ).replace( rcssescape, fcssescape );\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( ( node = elem[ i++ ] ) ) {\n\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[ 1 ] = match[ 1 ].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[ 3 ] = ( match[ 3 ] || match[ 4 ] ||\n\t\t\t\tmatch[ 5 ] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[ 2 ] === \"~=\" ) {\n\t\t\t\tmatch[ 3 ] = \" \" + match[ 3 ] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[ 1 ] = match[ 1 ].toLowerCase();\n\n\t\t\tif ( match[ 1 ].slice( 0, 3 ) === \"nth\" ) {\n\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[ 3 ] ) {\n\t\t\t\t\tSizzle.error( match[ 0 ] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[ 4 ] = +( match[ 4 ] ?\n\t\t\t\t\tmatch[ 5 ] + ( match[ 6 ] || 1 ) :\n\t\t\t\t\t2 * ( match[ 3 ] === \"even\" || match[ 3 ] === \"odd\" ) );\n\t\t\t\tmatch[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === \"odd\" );\n\n\t\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[ 3 ] ) {\n\t\t\t\tSizzle.error( match[ 0 ] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[ 6 ] && match[ 2 ];\n\n\t\t\tif ( matchExpr[ \"CHILD\" ].test( match[ 0 ] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[ 3 ] ) {\n\t\t\t\tmatch[ 2 ] = match[ 4 ] || match[ 5 ] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t( excess = tokenize( unquoted, true ) ) &&\n\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t( excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length ) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[ 0 ] = match[ 0 ].slice( 0, excess );\n\t\t\t\tmatch[ 2 ] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() {\n\t\t\t\t\treturn true;\n\t\t\t\t} :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t( pattern = new RegExp( \"(^|\" + whitespace +\n\t\t\t\t\t\")\" + className + \"(\" + whitespace + \"|$)\" ) ) && classCache(\n\t\t\t\t\t\tclassName, function( elem ) {\n\t\t\t\t\t\t\treturn pattern.test(\n\t\t\t\t\t\t\t\ttypeof elem.className === \"string\" && elem.className ||\n\t\t\t\t\t\t\t\ttypeof elem.getAttribute !== \"undefined\" &&\n\t\t\t\t\t\t\t\t\telem.getAttribute( \"class\" ) ||\n\t\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t\t\t);\n\t\t\t\t} );\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\t/* eslint-disable max-len */\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t\t/* eslint-enable max-len */\n\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, _argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tvar cache, uniqueCache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( ( node = node[ dir ] ) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\n\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\tnode = parent;\n\t\t\t\t\t\t\touterCache = node[ expando ] || ( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\n\t\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\touterCache = node[ expando ] || ( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction( function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[ i ] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} ) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction( function( selector ) {\n\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction( function( seed, matches, _context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\t\t\t\t\tseed[ i ] = !( matches[ i ] = elem );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} ) :\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tinput[ 0 ] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[ 0 ] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t} ),\n\n\t\t\"has\": markFunction( function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t} ),\n\n\t\t\"contains\": markFunction( function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t} ),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test( lang || \"\" ) ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( ( elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute( \"xml:lang\" ) || elem.getAttribute( \"lang\" ) ) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t} ),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement &&\n\t\t\t\t( !document.hasFocus || document.hasFocus() ) &&\n\t\t\t\t!!( elem.type || elem.href || ~elem.tabIndex );\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": createDisabledPseudo( false ),\n\t\t\"disabled\": createDisabledPseudo( true ),\n\n\t\t\"checked\": function( elem ) {\n\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn ( nodeName === \"input\" && !!elem.checked ) ||\n\t\t\t\t( nodeName === \"option\" && !!elem.selected );\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\t// eslint-disable-next-line no-unused-expressions\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t//   but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[ \"empty\" ]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( ( attr = elem.getAttribute( \"type\" ) ) == null ||\n\t\t\t\t\tattr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo( function() {\n\t\t\treturn [ 0 ];\n\t\t} ),\n\n\t\t\"last\": createPositionalPseudo( function( _matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t} ),\n\n\t\t\"eq\": createPositionalPseudo( function( _matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t} ),\n\n\t\t\"even\": createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"odd\": createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"lt\": createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ?\n\t\t\t\targument + length :\n\t\t\t\targument > length ?\n\t\t\t\t\tlength :\n\t\t\t\t\targument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"gt\": createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} )\n\t}\n};\n\nExpr.pseudos[ \"nth\" ] = Expr.pseudos[ \"eq\" ];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || ( match = rcomma.exec( soFar ) ) ) {\n\t\t\tif ( match ) {\n\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[ 0 ].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( ( tokens = [] ) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( ( match = rcombinators.exec( soFar ) ) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push( {\n\t\t\t\tvalue: matched,\n\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[ 0 ].replace( rtrim, \" \" )\n\t\t\t} );\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||\n\t\t\t\t( match = preFilters[ type ]( match ) ) ) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push( {\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t} );\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[ i ].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tskip = combinator.next,\n\t\tkey = skip || dir,\n\t\tcheckNonElements = base && key === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, uniqueCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || ( elem[ expando ] = {} );\n\n\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\tuniqueCache = outerCache[ elem.uniqueID ] ||\n\t\t\t\t\t\t\t( outerCache[ elem.uniqueID ] = {} );\n\n\t\t\t\t\t\tif ( skip && skip === elem.nodeName.toLowerCase() ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( ( oldCache = uniqueCache[ key ] ) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn ( newCache[ 2 ] = oldCache[ 2 ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\tuniqueCache[ key ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[ i ]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[ 0 ];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[ i ], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction( function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts(\n\t\t\t\tselector || \"*\",\n\t\t\t\tcontext.nodeType ? [ context ] : context,\n\t\t\t\t[]\n\t\t\t),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( ( elem = temp[ i ] ) ) {\n\t\t\t\t\tmatcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) ) {\n\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( ( matcherIn[ i ] = elem ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, ( matcherOut = [] ), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) &&\n\t\t\t\t\t\t( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {\n\n\t\t\t\t\t\tseed[ temp ] = !( results[ temp ] = elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t} );\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[ 0 ].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[ \" \" ],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t( checkContext = context ).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {\n\t\t\tmatchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[ j ].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\n\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\ttokens\n\t\t\t\t\t\t.slice( 0, i - 1 )\n\t\t\t\t\t\t.concat( { value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" } )\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[ \"TAG\" ]( \"*\", outermost ),\n\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\n\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\toutermostContext = context == document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\n\t\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\t\tif ( !context && elem.ownerDocument != document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( ( matcher = elementMatchers[ j++ ] ) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( ( elem = !matcher && elem ) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( ( matcher = setMatchers[ j++ ] ) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !( unmatched[ i ] || setMatched[ i ] ) ) {\n\t\t\t\t\t\t\t\tsetMatched[ i ] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[ i ] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache(\n\t\t\tselector,\n\t\t\tmatcherFromGroupMatchers( elementMatchers, setMatchers )\n\t\t);\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n *  selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n *  selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( ( selector = compiled.selector || selector ) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[ 0 ] = match[ 0 ].slice( 0 );\n\t\tif ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === \"ID\" &&\n\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {\n\n\t\t\tcontext = ( Expr.find[ \"ID\" ]( token.matches[ 0 ]\n\t\t\t\t.replace( runescape, funescape ), context ) || [] )[ 0 ];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[ \"needsContext\" ].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[ i ];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ ( type = token.type ) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( ( find = Expr.find[ type ] ) ) {\n\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( ( seed = find(\n\t\t\t\t\ttoken.matches[ 0 ].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext\n\t\t\t\t) ) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split( \"\" ).sort( sortOrder ).join( \"\" ) === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert( function( el ) {\n\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement( \"fieldset\" ) ) & 1;\n} );\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert( function( el ) {\n\tel.innerHTML = \"<a href='#'></a>\";\n\treturn el.firstChild.getAttribute( \"href\" ) === \"#\";\n} ) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t} );\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert( function( el ) {\n\tel.innerHTML = \"<input/>\";\n\tel.firstChild.setAttribute( \"value\", \"\" );\n\treturn el.firstChild.getAttribute( \"value\" ) === \"\";\n} ) ) {\n\taddHandle( \"value\", function( elem, _name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t} );\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert( function( el ) {\n\treturn el.getAttribute( \"disabled\" ) == null;\n} ) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t( val = elem.getAttributeNode( name ) ) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\t\tnull;\n\t\t}\n\t} );\n}\n\nreturn Sizzle;\n\n} )( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\njQuery.escapeSelector = Sizzle.escape;\n\n\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\n\n\nfunction nodeName( elem, name ) {\n\n\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\n}\nvar rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\t}\n\n\t// Single element\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\t}\n\n\t// Arraylike of elements (jQuery, arguments, Array)\n\tif ( typeof qualifier !== \"string\" ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t\t} );\n\t}\n\n\t// Filtered directly for both simple and complex selectors\n\treturn jQuery.filter( qualifier, elements, not );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\tif ( elems.length === 1 && elem.nodeType === 1 ) {\n\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n\t}\n\n\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\treturn elem.nodeType === 1;\n\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i, ret,\n\t\t\tlen = this.length,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tret = this.pushStack( [] );\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\t// Shortcut simple #id case for speed\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\ttargets = typeof selectors !== \"string\" && jQuery( selectors );\n\n\t\t// Positional selectors never match, since there's no _selection_ context\n\t\tif ( !rneedsContext.test( selectors ) ) {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t\t// Always skip document fragments\n\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ?\n\t\t\t\t\t\ttargets.index( cur ) > -1 :\n\n\t\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\tif ( elem.contentDocument != null &&\n\n\t\t\t// Support: IE 11+\n\t\t\t// <object> elements with no `data` attribute has an object\n\t\t\t// `contentDocument` with a `null` prototype.\n\t\t\tgetProto( elem.contentDocument ) ) {\n\n\t\t\treturn elem.contentDocument;\n\t\t}\n\n\t\t// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n\t\t// Treat the template element as a regular one in browsers that\n\t\t// don't support it.\n\t\tif ( nodeName( elem, \"template\" ) ) {\n\t\t\telem = elem.content || elem;\n\t\t}\n\n\t\treturn jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = locked || options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && toType( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory && !firing ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\nfunction Identity( v ) {\n\treturn v;\n}\nfunction Thrower( ex ) {\n\tthrow ex;\n}\n\nfunction adoptValue( value, resolve, reject, noValue ) {\n\tvar method;\n\n\ttry {\n\n\t\t// Check for promise aspect first to privilege synchronous behavior\n\t\tif ( value && isFunction( ( method = value.promise ) ) ) {\n\t\t\tmethod.call( value ).done( resolve ).fail( reject );\n\n\t\t// Other thenables\n\t\t} else if ( value && isFunction( ( method = value.then ) ) ) {\n\t\t\tmethod.call( value, resolve, reject );\n\n\t\t// Other non-thenables\n\t\t} else {\n\n\t\t\t// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n\t\t\t// * false: [ value ].slice( 0 ) => resolve( value )\n\t\t\t// * true: [ value ].slice( 1 ) => resolve()\n\t\t\tresolve.apply( undefined, [ value ].slice( noValue ) );\n\t\t}\n\n\t// For Promises/A+, convert exceptions into rejections\n\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n\t// Deferred#then to conditionally suppress rejection.\n\t} catch ( value ) {\n\n\t\t// Support: Android 4.0 only\n\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\treject.apply( undefined, [ value ] );\n\t}\n}\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, callbacks,\n\t\t\t\t// ... .then handlers, argument index, [final state]\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"memory\" ), 2 ],\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\t\"catch\": function( fn ) {\n\t\t\t\t\treturn promise.then( null, fn );\n\t\t\t\t},\n\n\t\t\t\t// Keep pipe for back-compat\n\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( _i, tuple ) {\n\n\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress)\n\t\t\t\t\t\t\tvar fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify })\n\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve })\n\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject })\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) {\n\t\t\t\t\tvar maxDepth = 0;\n\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tvar that = this,\n\t\t\t\t\t\t\t\targs = arguments,\n\t\t\t\t\t\t\t\tmightThrow = function() {\n\t\t\t\t\t\t\t\t\tvar returned, then;\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59\n\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts\n\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args );\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48\n\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) {\n\t\t\t\t\t\t\t\t\t\tthrow new TypeError( \"Thenable self-resolution\" );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75\n\t\t\t\t\t\t\t\t\t// Retrieve `then` only once\n\t\t\t\t\t\t\t\t\tthen = returned &&\n\n\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4\n\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64\n\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability\n\t\t\t\t\t\t\t\t\t\t( typeof returned === \"object\" ||\n\t\t\t\t\t\t\t\t\t\t\ttypeof returned === \"function\" ) &&\n\t\t\t\t\t\t\t\t\t\treturned.then;\n\n\t\t\t\t\t\t\t\t\t// Handle a returned thenable\n\t\t\t\t\t\t\t\t\tif ( isFunction( then ) ) {\n\n\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution\n\t\t\t\t\t\t\t\t\t\tif ( special ) {\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special )\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values\n\t\t\t\t\t\t\t\t\t\t\tmaxDepth++;\n\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Handle all other returned values\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) {\n\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\targs = [ returned ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Process the value(s)\n\t\t\t\t\t\t\t\t\t\t// Default process is resolve\n\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions\n\t\t\t\t\t\t\t\tprocess = special ?\n\t\t\t\t\t\t\t\t\tmightThrow :\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tmightThrow();\n\t\t\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) {\n\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e,\n\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.stackTrace );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1\n\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61\n\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions\n\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1\n\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57\n\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from\n\t\t\t\t\t\t\t// subsequent errors\n\t\t\t\t\t\t\tif ( depth ) {\n\t\t\t\t\t\t\t\tprocess();\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Call an optional hook to record the stack, in case of exception\n\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async\n\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.stackTrace = jQuery.Deferred.getStackHook();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twindow.setTimeout( process );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\n\t\t\t\t\t\t// progress_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 0 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onProgress ) ?\n\t\t\t\t\t\t\t\t\tonProgress :\n\t\t\t\t\t\t\t\t\tIdentity,\n\t\t\t\t\t\t\t\tnewDefer.notifyWith\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// fulfilled_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 1 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onFulfilled ) ?\n\t\t\t\t\t\t\t\t\tonFulfilled :\n\t\t\t\t\t\t\t\t\tIdentity\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// rejected_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 2 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onRejected ) ?\n\t\t\t\t\t\t\t\t\tonRejected :\n\t\t\t\t\t\t\t\t\tThrower\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 5 ];\n\n\t\t\t// promise.progress = list.add\n\t\t\t// promise.done = list.add\n\t\t\t// promise.fail = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(\n\t\t\t\t\tfunction() {\n\n\t\t\t\t\t\t// state = \"resolved\" (i.e., fulfilled)\n\t\t\t\t\t\t// state = \"rejected\"\n\t\t\t\t\t\tstate = stateString;\n\t\t\t\t\t},\n\n\t\t\t\t\t// rejected_callbacks.disable\n\t\t\t\t\t// fulfilled_callbacks.disable\n\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable,\n\n\t\t\t\t\t// rejected_handlers.disable\n\t\t\t\t\t// fulfilled_handlers.disable\n\t\t\t\t\ttuples[ 3 - i ][ 3 ].disable,\n\n\t\t\t\t\t// progress_callbacks.lock\n\t\t\t\t\ttuples[ 0 ][ 2 ].lock,\n\n\t\t\t\t\t// progress_handlers.lock\n\t\t\t\t\ttuples[ 0 ][ 3 ].lock\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// progress_handlers.fire\n\t\t\t// fulfilled_handlers.fire\n\t\t\t// rejected_handlers.fire\n\t\t\tlist.add( tuple[ 3 ].fire );\n\n\t\t\t// deferred.notify = function() { deferred.notifyWith(...) }\n\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) }\n\t\t\t// deferred.reject = function() { deferred.rejectWith(...) }\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t// deferred.notifyWith = list.fireWith\n\t\t\t// deferred.resolveWith = list.fireWith\n\t\t\t// deferred.rejectWith = list.fireWith\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( singleValue ) {\n\t\tvar\n\n\t\t\t// count of uncompleted subordinates\n\t\t\tremaining = arguments.length,\n\n\t\t\t// count of unprocessed arguments\n\t\t\ti = remaining,\n\n\t\t\t// subordinate fulfillment data\n\t\t\tresolveContexts = Array( i ),\n\t\t\tresolveValues = slice.call( arguments ),\n\n\t\t\t// the primary Deferred\n\t\t\tprimary = jQuery.Deferred(),\n\n\t\t\t// subordinate callback factory\n\t\t\tupdateFunc = function( i ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tresolveContexts[ i ] = this;\n\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( !( --remaining ) ) {\n\t\t\t\t\t\tprimary.resolveWith( resolveContexts, resolveValues );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t// Single- and empty arguments are adopted like Promise.resolve\n\t\tif ( remaining <= 1 ) {\n\t\t\tadoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,\n\t\t\t\t!remaining );\n\n\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000)\n\t\t\tif ( primary.state() === \"pending\" ||\n\t\t\t\tisFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn primary.then();\n\t\t\t}\n\t\t}\n\n\t\t// Multiple arguments are aggregated like Promise.all array elements\n\t\twhile ( i-- ) {\n\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );\n\t\t}\n\n\t\treturn primary.promise();\n\t}\n} );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\nvar rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\njQuery.Deferred.exceptionHook = function( error, stack ) {\n\n\t// Support: IE 8 - 9 only\n\t// Console exists when dev tools are open, which can happen at any time\n\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n\t\twindow.console.warn( \"jQuery.Deferred exception: \" + error.message, error.stack, stack );\n\t}\n};\n\n\n\n\njQuery.readyException = function( error ) {\n\twindow.setTimeout( function() {\n\t\tthrow error;\n\t} );\n};\n\n\n\n\n// The deferred used on DOM ready\nvar readyList = jQuery.Deferred();\n\njQuery.fn.ready = function( fn ) {\n\n\treadyList\n\t\t.then( fn )\n\n\t\t// Wrap jQuery.readyException in a function so that the lookup\n\t\t// happens at the time of error handling instead of callback\n\t\t// registration.\n\t\t.catch( function( error ) {\n\t\t\tjQuery.readyException( error );\n\t\t} );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\t}\n} );\n\njQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\nif ( document.readyState === \"complete\" ||\n\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\twindow.setTimeout( jQuery.ready );\n\n} else {\n\n\t// Use the handy event callback\n\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t// A fallback to window.onload, that will always work\n\twindow.addEventListener( \"load\", completed );\n}\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( toType( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, _key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\t\tvalue :\n\t\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( chainable ) {\n\t\treturn elems;\n\t}\n\n\t// Gets\n\tif ( bulk ) {\n\t\treturn fn.call( elems );\n\t}\n\n\treturn len ? fn( elems[ 0 ], key ) : emptyGet;\n};\n\n\n// Matches dashed string for camelizing\nvar rmsPrefix = /^-ms-/,\n\trdashAlpha = /-([a-z])/g;\n\n// Used by camelCase as callback to replace()\nfunction fcamelCase( _all, letter ) {\n\treturn letter.toUpperCase();\n}\n\n// Convert dashed to camelCase; used by the css and data modules\n// Support: IE <=9 - 11, Edge 12 - 15\n// Microsoft forgot to hump their vendor prefix (#9572)\nfunction camelCase( string ) {\n\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n}\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t//  - Node\n\t//    - Node.ELEMENT_NODE\n\t//    - Node.DOCUMENT_NODE\n\t//  - Object\n\t//    - Any\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tcache: function( owner ) {\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see #8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\t// Always use camelCase key (gh-2257)\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ camelCase( data ) ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ camelCase( prop ) ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\n\t\t\t// Always use camelCase key (gh-2257)\n\t\t\towner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];\n\t},\n\taccess: function( owner, key, value ) {\n\n\t\t// In cases where either:\n\t\t//\n\t\t//   1. No key was specified\n\t\t//   2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t//   1. The entire cache object\n\t\t//   2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\treturn this.get( owner, key );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t//   1. An object of properties\n\t\t//   2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key !== undefined ) {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( Array.isArray( key ) ) {\n\n\t\t\t\t// If key is an array of keys...\n\t\t\t\t// We always set camelCase keys, so remove that.\n\t\t\t\tkey = key.map( camelCase );\n\t\t\t} else {\n\t\t\t\tkey = camelCase( key );\n\n\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\tkey = key in cache ?\n\t\t\t\t\t[ key ] :\n\t\t\t\t\t( key.match( rnothtmlwhite ) || [] );\n\t\t\t}\n\n\t\t\ti = key.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ key[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <=35 - 45\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction getData( data ) {\n\tif ( data === \"true\" ) {\n\t\treturn true;\n\t}\n\n\tif ( data === \"false\" ) {\n\t\treturn false;\n\t}\n\n\tif ( data === \"null\" ) {\n\t\treturn null;\n\t}\n\n\t// Only convert to a number if it doesn't change the string\n\tif ( data === +data + \"\" ) {\n\t\treturn +data;\n\t}\n\n\tif ( rbrace.test( data ) ) {\n\t\treturn JSON.parse( data );\n\t}\n\n\treturn data;\n}\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = getData( data );\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE 11 only\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// The key will always be camelCased in Data\n\t\t\t\tdata = dataUser.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each( function() {\n\n\t\t\t\t// We always store the camelCased key\n\t\t\t\tdataUser.set( this, key, value );\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || Array.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar documentElement = document.documentElement;\n\n\n\n\tvar isAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem );\n\t\t},\n\t\tcomposed = { composed: true };\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only\n\t// Check attachment across shadow DOM boundaries when possible (gh-3504)\n\t// Support: iOS 10.0-10.2 only\n\t// Early iOS 10 versions support `attachShadow` but not `getRootNode`,\n\t// leading to errors. We need to check for `getRootNode`.\n\tif ( documentElement.getRootNode ) {\n\t\tisAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem ) ||\n\t\t\t\telem.getRootNode( composed ) === elem.ownerDocument;\n\t\t};\n\t}\nvar isHiddenWithinTree = function( elem, el ) {\n\n\t\t// isHiddenWithinTree might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\n\t\t// Inline style trumps all\n\t\treturn elem.style.display === \"none\" ||\n\t\t\telem.style.display === \"\" &&\n\n\t\t\t// Otherwise, check computed style\n\t\t\t// Support: Firefox <=43 - 45\n\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is\n\t\t\t// in the document.\n\t\t\tisAttached( elem ) &&\n\n\t\t\tjQuery.css( elem, \"display\" ) === \"none\";\n\t};\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted, scale,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() {\n\t\t\t\treturn tween.cur();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\treturn jQuery.css( elem, prop, \"\" );\n\t\t\t},\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = elem.nodeType &&\n\t\t\t( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Support: Firefox <=54\n\t\t// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)\n\t\tinitial = initial / 2;\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\twhile ( maxIterations-- ) {\n\n\t\t\t// Evaluate and update our best guess (doubling guesses that zero out).\n\t\t\t// Finish if the scale equals or crosses 1 (making the old*new product non-positive).\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\t\t\tif ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {\n\t\t\t\tmaxIterations = 0;\n\t\t\t}\n\t\t\tinitialInUnit = initialInUnit / scale;\n\n\t\t}\n\n\t\tinitialInUnit = initialInUnit * 2;\n\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\nvar defaultDisplayMap = {};\n\nfunction getDefaultDisplay( elem ) {\n\tvar temp,\n\t\tdoc = elem.ownerDocument,\n\t\tnodeName = elem.nodeName,\n\t\tdisplay = defaultDisplayMap[ nodeName ];\n\n\tif ( display ) {\n\t\treturn display;\n\t}\n\n\ttemp = doc.body.appendChild( doc.createElement( nodeName ) );\n\tdisplay = jQuery.css( temp, \"display\" );\n\n\ttemp.parentNode.removeChild( temp );\n\n\tif ( display === \"none\" ) {\n\t\tdisplay = \"block\";\n\t}\n\tdefaultDisplayMap[ nodeName ] = display;\n\n\treturn display;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\t// Determine new display value for elements that need to change\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n\t\t\t// check is required in this first loop unless we have a nonempty display value (either\n\t\t\t// inline or about-to-be-restored)\n\t\t\tif ( display === \"none\" ) {\n\t\t\t\tvalues[ index ] = dataPriv.get( elem, \"display\" ) || null;\n\t\t\t\tif ( !values[ index ] ) {\n\t\t\t\t\telem.style.display = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n\t\t\t\tvalues[ index ] = getDefaultDisplay( elem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( display !== \"none\" ) {\n\t\t\t\tvalues[ index ] = \"none\";\n\n\t\t\t\t// Remember what we're overwriting\n\t\t\t\tdataPriv.set( elem, \"display\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of the elements in a second loop to avoid constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( values[ index ] != null ) {\n\t\t\telements[ index ].style.display = values[ index ];\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend( {\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHiddenWithinTree( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i );\n\nvar rscriptType = ( /^$|^module$|\\/(?:java|ecma)script/i );\n\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0 - 4.3 only\n\t// Check state lost if the name is set (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Android <=4.1 only\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE <=11 only\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n\n\t// Support: IE <=9 only\n\t// IE <=9 replaces <option> tags with their contents when inserted outside of\n\t// the select element.\n\tdiv.innerHTML = \"<option></option>\";\n\tsupport.option = !!div.lastChild;\n} )();\n\n\n// We have to close these tags to support XHTML (#13200)\nvar wrapMap = {\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting <tbody> or other required elements.\n\tthead: [ 1, \"<table>\", \"</table>\" ],\n\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// Support: IE <=9 only\nif ( !support.option ) {\n\twrapMap.optgroup = wrapMap.option = [ 1, \"<select multiple='multiple'>\", \"</select>\" ];\n}\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (#15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, attached, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( toType( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (#12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tattached = isAttached( elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( attached ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\nvar rtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE <=9 - 11+\n// focus() and blur() are asynchronous, except when they are no-op.\n// So expect focus to be synchronous when the element is already active,\n// and blur to be synchronous when the element is not already active.\n// (focus and blur are always synchronous in other supported browsers,\n// this just defines when we can count on it).\nfunction expectSync( elem, type ) {\n\treturn ( elem === safeActiveElement() ) === ( type === \"focus\" );\n}\n\n// Support: IE <=9 only\n// Accessing document.activeElement can throw unexpectedly\n// https://bugs.jquery.com/ticket/13393\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Only attach events to objects that accept data\n\t\tif ( !acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = Object.create( null );\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\n\t\t\t// Make a writable jQuery.Event from the native event object\n\t\t\tevent = jQuery.event.fix( nativeEvent ),\n\n\t\t\thandlers = (\n\t\t\t\tdataPriv.get( this, \"events\" ) || Object.create( null )\n\t\t\t)[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// If the event is namespaced, then each handler is only invoked if it is\n\t\t\t\t// specially universal or its namespaces are a superset of the event's.\n\t\t\t\tif ( !event.rnamespace || handleObj.namespace === false ||\n\t\t\t\t\tevent.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG <use> instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tclick: {\n\n\t\t\t// Utilize native event to ensure correct state for checkable inputs\n\t\t\tsetup: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Claim the first handler\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\t// dataPriv.set( el, \"click\", ... )\n\t\t\t\t\tleverageNative( el, \"click\", returnTrue );\n\t\t\t\t}\n\n\t\t\t\t// Return false to allow normal processing in the caller\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\ttrigger: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Force setup before triggering a click\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\tleverageNative( el, \"click\" );\n\t\t\t\t}\n\n\t\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, suppress native .click() on links\n\t\t\t// Also prevent it if we're currently inside a leveraged native-event stack\n\t\t\t_default: function( event ) {\n\t\t\t\tvar target = event.target;\n\t\t\t\treturn rcheckableType.test( target.type ) &&\n\t\t\t\t\ttarget.click && nodeName( target, \"input\" ) &&\n\t\t\t\t\tdataPriv.get( target, \"click\" ) ||\n\t\t\t\t\tnodeName( target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Ensure the presence of an event listener that handles manually-triggered\n// synthetic events by interrupting progress until reinvoked in response to\n// *native* events that it fires directly, ensuring that state changes have\n// already occurred before other listeners are invoked.\nfunction leverageNative( el, type, expectSync ) {\n\n\t// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add\n\tif ( !expectSync ) {\n\t\tif ( dataPriv.get( el, type ) === undefined ) {\n\t\t\tjQuery.event.add( el, type, returnTrue );\n\t\t}\n\t\treturn;\n\t}\n\n\t// Register the controller as a special universal handler for all event namespaces\n\tdataPriv.set( el, type, false );\n\tjQuery.event.add( el, type, {\n\t\tnamespace: false,\n\t\thandler: function( event ) {\n\t\t\tvar notAsync, result,\n\t\t\t\tsaved = dataPriv.get( this, type );\n\n\t\t\tif ( ( event.isTrigger & 1 ) && this[ type ] ) {\n\n\t\t\t\t// Interrupt processing of the outer synthetic .trigger()ed event\n\t\t\t\t// Saved data should be false in such cases, but might be a leftover capture object\n\t\t\t\t// from an async native handler (gh-4350)\n\t\t\t\tif ( !saved.length ) {\n\n\t\t\t\t\t// Store arguments for use when handling the inner native event\n\t\t\t\t\t// There will always be at least one argument (an event object), so this array\n\t\t\t\t\t// will not be confused with a leftover capture object.\n\t\t\t\t\tsaved = slice.call( arguments );\n\t\t\t\t\tdataPriv.set( this, type, saved );\n\n\t\t\t\t\t// Trigger the native event and capture its result\n\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t// focus() and blur() are asynchronous\n\t\t\t\t\tnotAsync = expectSync( this, type );\n\t\t\t\t\tthis[ type ]();\n\t\t\t\t\tresult = dataPriv.get( this, type );\n\t\t\t\t\tif ( saved !== result || notAsync ) {\n\t\t\t\t\t\tdataPriv.set( this, type, false );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult = {};\n\t\t\t\t\t}\n\t\t\t\t\tif ( saved !== result ) {\n\n\t\t\t\t\t\t// Cancel the outer synthetic event\n\t\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t\t// Support: Chrome 86+\n\t\t\t\t\t\t// In Chrome, if an element having a focusout handler is blurred by\n\t\t\t\t\t\t// clicking outside of it, it invokes the handler synchronously. If\n\t\t\t\t\t\t// that handler calls `.remove()` on the element, the data is cleared,\n\t\t\t\t\t\t// leaving `result` undefined. We need to guard against this.\n\t\t\t\t\t\treturn result && result.value;\n\t\t\t\t\t}\n\n\t\t\t\t// If this is an inner synthetic event for an event with a bubbling surrogate\n\t\t\t\t// (focus or blur), assume that the surrogate already propagated from triggering the\n\t\t\t\t// native event and prevent that from happening again here.\n\t\t\t\t// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the\n\t\t\t\t// bubbling surrogate propagates *after* the non-bubbling base), but that seems\n\t\t\t\t// less bad than duplication.\n\t\t\t\t} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t}\n\n\t\t\t// If this is a native event triggered above, everything is now in order\n\t\t\t// Fire an inner synthetic event with the original arguments\n\t\t\t} else if ( saved.length ) {\n\n\t\t\t\t// ...and capture the result\n\t\t\t\tdataPriv.set( this, type, {\n\t\t\t\t\tvalue: jQuery.event.trigger(\n\n\t\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t\t// Extend with the prototype to reset the above stopImmediatePropagation()\n\t\t\t\t\t\tjQuery.extend( saved[ 0 ], jQuery.Event.prototype ),\n\t\t\t\t\t\tsaved.slice( 1 ),\n\t\t\t\t\t\tthis\n\t\t\t\t\t)\n\t\t\t\t} );\n\n\t\t\t\t// Abort handling of the native event\n\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t}\n\t\t}\n\t} );\n}\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (#504, #13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || Date.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcode: true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\twhich: true\n}, jQuery.event.addProp );\n\njQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( type, delegateType ) {\n\tjQuery.event.special[ type ] = {\n\n\t\t// Utilize native event if possible so blur/focus sequence is correct\n\t\tsetup: function() {\n\n\t\t\t// Claim the first handler\n\t\t\t// dataPriv.set( this, \"focus\", ... )\n\t\t\t// dataPriv.set( this, \"blur\", ... )\n\t\t\tleverageNative( this, type, expectSync );\n\n\t\t\t// Return false to allow normal processing in the caller\n\t\t\treturn false;\n\t\t},\n\t\ttrigger: function() {\n\n\t\t\t// Force setup before trigger\n\t\t\tleverageNative( this, type );\n\n\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\treturn true;\n\t\t},\n\n\t\t// Suppress native focus or blur as it's already being fired\n\t\t// in leverageNative.\n\t\t_default: function() {\n\t\t\treturn true;\n\t\t},\n\n\t\tdelegateType: delegateType\n\t};\n} );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t// Support: IE <=10 - 11, Edge 12 - 13 only\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /<script|<style|<link/i,\n\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, \"table\" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn jQuery( elem ).children( \"tbody\" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tif ( ( elem.type || \"\" ).slice( 0, 5 ) === \"true/\" ) {\n\t\telem.type = elem.type.slice( 5 );\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.get( src );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdataPriv.remove( dest, \"handle events\" );\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = flat( args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tvalueIsFunction = isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( valueIsFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Reenable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src && ( node.type || \"\" ).toLowerCase()  !== \"module\" ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl && !node.noModule ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src, {\n\t\t\t\t\t\t\t\t\tnonce: node.nonce || node.getAttribute( \"nonce\" )\n\t\t\t\t\t\t\t\t}, doc );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), node, doc );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && isAttached( node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html;\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = isAttached( elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\nvar swap = function( elem, options, callback ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.call( elem );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\nvar rboxStyle = new RegExp( cssExpand.join( \"|\" ), \"i\" );\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.cssText = \"position:absolute;left:-11111px;width:60px;\" +\n\t\t\t\"margin-top:1px;padding:0;border:0\";\n\t\tdiv.style.cssText =\n\t\t\t\"position:relative;display:block;box-sizing:border-box;overflow:scroll;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"width:60%;top:1%\";\n\t\tdocumentElement.appendChild( container ).appendChild( div );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;\n\n\t\t// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.right = \"60%\";\n\t\tpixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;\n\n\t\t// Support: IE 9 - 11 only\n\t\t// Detect misreporting of content dimensions for box-sizing:border-box elements\n\t\tboxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;\n\n\t\t// Support: IE 9 only\n\t\t// Detect overflow:scroll screwiness (gh-3699)\n\t\t// Support: Chrome <=64\n\t\t// Don't get tricked when zoom affects offsetWidth (gh-4029)\n\t\tdiv.style.position = \"absolute\";\n\t\tscrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tfunction roundPixelMeasures( measure ) {\n\t\treturn Math.round( parseFloat( measure ) );\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,\n\t\treliableTrDimensionsVal, reliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (#8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tjQuery.extend( support, {\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelBoxStyles: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelBoxStylesVal;\n\t\t},\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t},\n\t\tscrollboxSize: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn scrollboxSizeVal;\n\t\t},\n\n\t\t// Support: IE 9 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Behavior in IE 9 is more subtle than in newer versions & it passes\n\t\t// some versions of this test; make sure not to make it pass there!\n\t\t//\n\t\t// Support: Firefox 70+\n\t\t// Only Firefox includes border widths\n\t\t// in computed dimensions. (gh-4529)\n\t\treliableTrDimensions: function() {\n\t\t\tvar table, tr, trChild, trStyle;\n\t\t\tif ( reliableTrDimensionsVal == null ) {\n\t\t\t\ttable = document.createElement( \"table\" );\n\t\t\t\ttr = document.createElement( \"tr\" );\n\t\t\t\ttrChild = document.createElement( \"div\" );\n\n\t\t\t\ttable.style.cssText = \"position:absolute;left:-11111px;border-collapse:separate\";\n\t\t\t\ttr.style.cssText = \"border:1px solid\";\n\n\t\t\t\t// Support: Chrome 86+\n\t\t\t\t// Height set through cssText does not get applied.\n\t\t\t\t// Computed height then comes back as 0.\n\t\t\t\ttr.style.height = \"1px\";\n\t\t\t\ttrChild.style.height = \"9px\";\n\n\t\t\t\t// Support: Android 8 Chrome 86+\n\t\t\t\t// In our bodyBackground.html iframe,\n\t\t\t\t// display for all div elements is set to \"inline\",\n\t\t\t\t// which causes a problem only in Android 8 Chrome 86.\n\t\t\t\t// Ensuring the div is display: block\n\t\t\t\t// gets around this issue.\n\t\t\t\ttrChild.style.display = \"block\";\n\n\t\t\t\tdocumentElement\n\t\t\t\t\t.appendChild( table )\n\t\t\t\t\t.appendChild( tr )\n\t\t\t\t\t.appendChild( trChild );\n\n\t\t\t\ttrStyle = window.getComputedStyle( tr );\n\t\t\t\treliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +\n\t\t\t\t\tparseInt( trStyle.borderTopWidth, 10 ) +\n\t\t\t\t\tparseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;\n\n\t\t\t\tdocumentElement.removeChild( table );\n\t\t\t}\n\t\t\treturn reliableTrDimensionsVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t//   .css('filter') (IE 9 only, #12537)\n\t//   .css('--customProperty) (#3144)\n\tif ( computed ) {\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( ret === \"\" && !isAttached( elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar cssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style,\n\tvendorProps = {};\n\n// Return a vendor-prefixed property or undefined\nfunction vendorPropName( name ) {\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a potentially-mapped jQuery.cssProps or vendor prefixed property\nfunction finalPropName( name ) {\n\tvar final = jQuery.cssProps[ name ] || vendorProps[ name ];\n\n\tif ( final ) {\n\t\treturn final;\n\t}\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\treturn vendorProps[ name ] = vendorPropName( name ) || name;\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trcustomProp = /^--/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t};\n\nfunction setPositiveNumber( _elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {\n\tvar i = dimension === \"width\" ? 1 : 0,\n\t\textra = 0,\n\t\tdelta = 0;\n\n\t// Adjustment may not be necessary\n\tif ( box === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\treturn 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin\n\t\tif ( box === \"margin\" ) {\n\t\t\tdelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\t// If we get here with a content-box, we're seeking \"padding\" or \"border\" or \"margin\"\n\t\tif ( !isBorderBox ) {\n\n\t\t\t// Add padding\n\t\t\tdelta += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// For \"border\" or \"margin\", add border\n\t\t\tif ( box !== \"padding\" ) {\n\t\t\t\tdelta += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\n\t\t\t// But still keep track of it otherwise\n\t\t\t} else {\n\t\t\t\textra += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\n\t\t// If we get here with a border-box (content + padding + border), we're seeking \"content\" or\n\t\t// \"padding\" or \"margin\"\n\t\t} else {\n\n\t\t\t// For \"content\", subtract padding\n\t\t\tif ( box === \"content\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// For \"content\" or \"padding\", subtract border\n\t\t\tif ( box !== \"margin\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Account for positive content-box scroll gutter when requested by providing computedVal\n\tif ( !isBorderBox && computedVal >= 0 ) {\n\n\t\t// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n\t\t// Assuming integer scroll gutter, subtract the rest and round down\n\t\tdelta += Math.max( 0, Math.ceil(\n\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\tcomputedVal -\n\t\t\tdelta -\n\t\t\textra -\n\t\t\t0.5\n\n\t\t// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter\n\t\t// Use an explicit zero to avoid NaN (gh-3964)\n\t\t) ) || 0;\n\t}\n\n\treturn delta;\n}\n\nfunction getWidthOrHeight( elem, dimension, extra ) {\n\n\t// Start with computed style\n\tvar styles = getStyles( elem ),\n\n\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).\n\t\t// Fake content-box until we know it's needed to know the true value.\n\t\tboxSizingNeeded = !support.boxSizingReliable() || extra,\n\t\tisBorderBox = boxSizingNeeded &&\n\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\tvalueIsBorderBox = isBorderBox,\n\n\t\tval = curCSS( elem, dimension, styles ),\n\t\toffsetProp = \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );\n\n\t// Support: Firefox <=54\n\t// Return a confounding non-pixel value or feign ignorance, as appropriate.\n\tif ( rnumnonpx.test( val ) ) {\n\t\tif ( !extra ) {\n\t\t\treturn val;\n\t\t}\n\t\tval = \"auto\";\n\t}\n\n\n\t// Support: IE 9 - 11 only\n\t// Use offsetWidth/offsetHeight for when box sizing is unreliable.\n\t// In those cases, the computed value can be trusted to be border-box.\n\tif ( ( !support.boxSizingReliable() && isBorderBox ||\n\n\t\t// Support: IE 10 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Interestingly, in some cases IE 9 doesn't suffer from this issue.\n\t\t!support.reliableTrDimensions() && nodeName( elem, \"tr\" ) ||\n\n\t\t// Fall back to offsetWidth/offsetHeight when value is \"auto\"\n\t\t// This happens for inline elements with no explicit setting (gh-3571)\n\t\tval === \"auto\" ||\n\n\t\t// Support: Android <=4.1 - 4.3 only\n\t\t// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n\t\t!parseFloat( val ) && jQuery.css( elem, \"display\", false, styles ) === \"inline\" ) &&\n\n\t\t// Make sure the element is visible & connected\n\t\telem.getClientRects().length ) {\n\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t\t// Where available, offsetWidth/offsetHeight approximate border box dimensions.\n\t\t// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the\n\t\t// retrieved value as a content box dimension.\n\t\tvalueIsBorderBox = offsetProp in elem;\n\t\tif ( valueIsBorderBox ) {\n\t\t\tval = elem[ offsetProp ];\n\t\t}\n\t}\n\n\t// Normalize \"\" and auto\n\tval = parseFloat( val ) || 0;\n\n\t// Adjust for the element's box model\n\treturn ( val +\n\t\tboxModelAdjustment(\n\t\t\telem,\n\t\t\tdimension,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles,\n\n\t\t\t// Provide the current computed size to request scroll gutter calculation (gh-3589)\n\t\t\tval\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"animationIterationCount\": true,\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"gridArea\": true,\n\t\t\"gridColumn\": true,\n\t\t\"gridColumnEnd\": true,\n\t\t\"gridColumnStart\": true,\n\t\t\"gridRow\": true,\n\t\t\"gridRowEnd\": true,\n\t\t\"gridRowStart\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (#7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (#7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\t// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append\n\t\t\t// \"px\" to a few hardcoded values.\n\t\t\tif ( type === \"number\" && !isCustomProp ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( _i, dimension ) {\n\tjQuery.cssHooks[ dimension ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, dimension, extra );\n\t\t\t\t\t} ) :\n\t\t\t\t\tgetWidthOrHeight( elem, dimension, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = getStyles( elem ),\n\n\t\t\t\t// Only read styles.position if the test has a chance to fail\n\t\t\t\t// to avoid forcing a reflow.\n\t\t\t\tscrollboxSizeBuggy = !support.scrollboxSize() &&\n\t\t\t\t\tstyles.position === \"absolute\",\n\n\t\t\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)\n\t\t\t\tboxSizingNeeded = scrollboxSizeBuggy || extra,\n\t\t\t\tisBorderBox = boxSizingNeeded &&\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\tsubtract = extra ?\n\t\t\t\t\tboxModelAdjustment(\n\t\t\t\t\t\telem,\n\t\t\t\t\t\tdimension,\n\t\t\t\t\t\textra,\n\t\t\t\t\t\tisBorderBox,\n\t\t\t\t\t\tstyles\n\t\t\t\t\t) :\n\t\t\t\t\t0;\n\n\t\t\t// Account for unreliable border-box dimensions by comparing offset* to computed and\n\t\t\t// faking a content-box to get border and padding (gh-3699)\n\t\t\tif ( isBorderBox && scrollboxSizeBuggy ) {\n\t\t\t\tsubtract -= Math.ceil(\n\t\t\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\t\t\tparseFloat( styles[ dimension ] ) -\n\t\t\t\t\tboxModelAdjustment( elem, dimension, \"border\", false, styles ) -\n\t\t\t\t\t0.5\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ dimension ] = value;\n\t\t\t\tvalue = jQuery.css( elem, dimension );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( prefix !== \"margin\" ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 && (\n\t\t\t\tjQuery.cssHooks[ tween.prop ] ||\n\t\t\t\t\ttween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, inProgress,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction schedule() {\n\tif ( inProgress ) {\n\t\tif ( document.hidden === false && window.requestAnimationFrame ) {\n\t\t\twindow.requestAnimationFrame( schedule );\n\t\t} else {\n\t\t\twindow.setTimeout( schedule, jQuery.fx.interval );\n\t\t}\n\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = Date.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 15\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY and Edge just mirrors\n\t\t// the overflowX value there.\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( Array.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\t// If there's more to do, yield\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t}\n\n\t\t\t// If this was an empty animation, synthesize a final progress notification\n\t\t\tif ( !length ) {\n\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t}\n\n\t\t\t// Resolve the animation and report its conclusion\n\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\treturn false;\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tresult.stop.bind( result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\t// Attach callbacks from options\n\tanimation\n\t\t.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\treturn animation;\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tisFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off\n\tif ( jQuery.fx.off ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\n\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( _i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = Date.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Run the timer and safely remove it when done (allowing for external removal)\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tjQuery.fx.start();\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( inProgress ) {\n\t\treturn;\n\t}\n\n\tinProgress = true;\n\tschedule();\n};\n\njQuery.fx.stop = function() {\n\tinProgress = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tnodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( _i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\nfunction classesToArray( value ) {\n\tif ( Array.isArray( value ) ) {\n\t\treturn value;\n\t}\n\tif ( typeof value === \"string\" ) {\n\t\treturn value.match( rnothtmlwhite ) || [];\n\t}\n\treturn [];\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value,\n\t\t\tisValidValue = type === \"string\" || Array.isArray( value );\n\n\t\tif ( typeof stateVal === \"boolean\" && isValidValue ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar className, i, self, classNames;\n\n\t\t\tif ( isValidValue ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\ti = 0;\n\t\t\t\tself = jQuery( this );\n\t\t\t\tclassNames = classesToArray( value );\n\n\t\t\t\twhile ( ( className = classNames[ i++ ] ) ) {\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, valueIsFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueIsFunction = isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( Array.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (#14686, #14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\nsupport.focusin = \"onfocusin\" in window;\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\tstopPropagationCallback = function( e ) {\n\t\te.stopPropagation();\n\t};\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special, lastElement,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = lastElement = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tlastElement = cur;\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( dataPriv.get( cur, \"events\" ) || Object.create( null ) )[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.addEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\telem[ type ]();\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.removeEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\n// Support: Firefox <=44\n// Firefox doesn't have focus(in | out) events\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n//\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n// focus(in | out) events fire after focus & blur events,\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\nif ( !support.focusin ) {\n\tjQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\n\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\n\t\t\t\t// Handle: regular nodes (via `this.ownerDocument`), window\n\t\t\t\t// (via `this.document`) & document (via `this`).\n\t\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdataPriv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\nvar location = window.location;\n\nvar nonce = { guid: Date.now() };\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml, parserErrorElem;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {}\n\n\tparserErrorElem = xml && xml.getElementsByTagName( \"parsererror\" )[ 0 ];\n\tif ( !xml || parserErrorElem ) {\n\t\tjQuery.error( \"Invalid XML: \" + (\n\t\t\tparserErrorElem ?\n\t\t\t\tjQuery.map( parserErrorElem.childNodes, function( el ) {\n\t\t\t\t\treturn el.textContent;\n\t\t\t\t} ).join( \"\\n\" ) :\n\t\t\t\tdata\n\t\t) );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && toType( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\tif ( a == null ) {\n\t\treturn \"\";\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} ).filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} ).map( function( _i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\noriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() + \" \" ] =\n\t\t\t\t\t\t\t\t\t( responseHeaders[ match[ 1 ].toLowerCase() + \" \" ] || [] )\n\t\t\t\t\t\t\t\t\t\t.concat( match[ 2 ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() + \" \" ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match.join( \", \" );\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 15\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available and should be processed, append data to url\n\t\t\tif ( s.data && ( s.processData || typeof s.data === \"string\" ) ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce.guid++ ) +\n\t\t\t\t\tuncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Use a noop converter for missing script but not if jsonp\n\t\t\tif ( !isSuccess &&\n\t\t\t\tjQuery.inArray( \"script\", s.dataTypes ) > -1 &&\n\t\t\t\tjQuery.inArray( \"json\", s.dataTypes ) < 0 ) {\n\t\t\t\ts.converters[ \"text script\" ] = function() {};\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( _i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\njQuery.ajaxPrefilter( function( s ) {\n\tvar i;\n\tfor ( i in s.headers ) {\n\t\tif ( i.toLowerCase() === \"content-type\" ) {\n\t\t\ts.contentType = s.headers[ i ] || \"\";\n\t\t}\n\t}\n} );\n\n\njQuery._evalUrl = function( url, options, doc ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (#11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\n\t\t// Only evaluate the response if it is successful (gh-4126)\n\t\t// dataFilter is not invoked for failure responses, so using it instead\n\t\t// of the default converter is kludgy but it works.\n\t\tconverters: {\n\t\t\t\"text script\": function() {}\n\t\t},\n\t\tdataFilter: function( response ) {\n\t\t\tjQuery.globalEval( response, options, doc );\n\t\t}\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar htmlIsFunction = isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// #1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.ontimeout =\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see #8605, #14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\"  ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = xhr.ontimeout = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// #14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain or forced-by-attrs requests\n\tif ( s.crossDomain || s.scriptAttrs ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"<script>\" )\n\t\t\t\t\t.attr( s.scriptAttrs || {} )\n\t\t\t\t\t.prop( { charset: s.scriptCharset, src: s.url } )\n\t\t\t\t\t.on( \"load error\", callback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup( {\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce.guid++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n} );\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" &&\n\t\t\t\t( s.contentType || \"\" )\n\t\t\t\t\t.indexOf( \"application/x-www-form-urlencoded\" ) === 0 &&\n\t\t\t\trjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[ \"script json\" ] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// Force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always( function() {\n\n\t\t\t// If previous value didn't exist - remove it\n\t\t\tif ( overwritten === undefined ) {\n\t\t\t\tjQuery( window ).removeProp( callbackName );\n\n\t\t\t// Otherwise restore preexisting value\n\t\t\t} else {\n\t\t\t\twindow[ callbackName ] = overwritten;\n\t\t\t}\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\n\t\t\t\t// Make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// Save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t} );\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n} );\n\n\n\n\n// Support: Safari 8 only\n// In Safari 8 documents created via document.implementation.createHTMLDocument\n// collapse sibling forms: the second one becomes a child of the first one.\n// Because of that, this security measure has to be disabled in Safari 8.\n// https://bugs.webkit.org/show_bug.cgi?id=137337\nsupport.createHTMLDocument = ( function() {\n\tvar body = document.implementation.createHTMLDocument( \"\" ).body;\n\tbody.innerHTML = \"<form></form><form></form>\";\n\treturn body.childNodes.length === 2;\n} )();\n\n\n// Argument \"data\" should be string of html\n// context (optional): If specified, the fragment will be created in this context,\n// defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( typeof data !== \"string\" ) {\n\t\treturn [];\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\n\tvar base, parsed, scripts;\n\n\tif ( !context ) {\n\n\t\t// Stop scripts or inline event handlers from being executed immediately\n\t\t// by using document.implementation\n\t\tif ( support.createHTMLDocument ) {\n\t\t\tcontext = document.implementation.createHTMLDocument( \"\" );\n\n\t\t\t// Set the base href for the created document\n\t\t\t// so any parsed elements with URLs\n\t\t\t// are based on the document's URL (gh-2965)\n\t\t\tbase = context.createElement( \"base\" );\n\t\t\tbase.href = document.location.href;\n\t\t\tcontext.head.appendChild( base );\n\t\t} else {\n\t\t\tcontext = document;\n\t\t}\n\t}\n\n\tparsed = rsingleTag.exec( data );\n\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[ 1 ] ) ];\n\t}\n\n\tparsed = buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf( \" \" );\n\n\tif ( off > -1 ) {\n\t\tselector = stripAndCollapse( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax( {\n\t\t\turl: url,\n\n\t\t\t// If \"type\" variable is undefined, then \"GET\" method will be used.\n\t\t\t// Make value of this field explicit since\n\t\t\t// user can override it through ajaxSetup method\n\t\t\ttype: type || \"GET\",\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t} ).done( function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery( \"<div>\" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t// If the request succeeds, this function gets \"data\", \"status\", \"jqXHR\"\n\t\t// but they are ignored because response was set above.\n\t\t// If it fails, this function gets \"jqXHR\", \"status\", \"error\"\n\t\t} ).always( callback && function( jqXHR, status ) {\n\t\t\tself.each( function() {\n\t\t\t\tcallback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t\t} );\n\t\t} );\n\t}\n\n\treturn this;\n};\n\n\n\n\njQuery.expr.pseudos.animated = function( elem ) {\n\treturn jQuery.grep( jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t} ).length;\n};\n\n\n\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf( \"auto\" ) > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( isFunction( options ) ) {\n\n\t\t\t// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n\t\t\toptions = options.call( elem, i, jQuery.extend( {}, curOffset ) );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend( {\n\n\t// offset() relates an element's border box to the document origin\n\toffset: function( options ) {\n\n\t\t// Preserve chaining for setter\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each( function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t} );\n\t\t}\n\n\t\tvar rect, win,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !elem ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Return zeros for disconnected and hidden (display: none) elements (gh-2310)\n\t\t// Support: IE <=11 only\n\t\t// Running getBoundingClientRect on a\n\t\t// disconnected node in IE throws an error\n\t\tif ( !elem.getClientRects().length ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\t// Get document-relative position by adding viewport scroll to viewport-relative gBCR\n\t\trect = elem.getBoundingClientRect();\n\t\twin = elem.ownerDocument.defaultView;\n\t\treturn {\n\t\t\ttop: rect.top + win.pageYOffset,\n\t\t\tleft: rect.left + win.pageXOffset\n\t\t};\n\t},\n\n\t// position() relates an element's margin box to its offset parent's padding box\n\t// This corresponds to the behavior of CSS absolute positioning\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset, doc,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// position:fixed elements are offset from the viewport, which itself always has zero offset\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\n\t\t\t// Assume position:fixed implies availability of getBoundingClientRect\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\t\t\toffset = this.offset();\n\n\t\t\t// Account for the *real* offset parent, which can be the document or its root element\n\t\t\t// when a statically positioned element is identified\n\t\t\tdoc = elem.ownerDocument;\n\t\t\toffsetParent = elem.offsetParent || doc.documentElement;\n\t\t\twhile ( offsetParent &&\n\t\t\t\t( offsetParent === doc.body || offsetParent === doc.documentElement ) &&\n\t\t\t\tjQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\n\t\t\t\toffsetParent = offsetParent.parentNode;\n\t\t\t}\n\t\t\tif ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {\n\n\t\t\t\t// Incorporate borders into its offset, since they are outside its content origin\n\t\t\t\tparentOffset = jQuery( offsetParent ).offset();\n\t\t\t\tparentOffset.top += jQuery.css( offsetParent, \"borderTopWidth\", true );\n\t\t\t\tparentOffset.left += jQuery.css( offsetParent, \"borderLeftWidth\", true );\n\t\t\t}\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\t// This method will return documentElement in the following cases:\n\t// 1) For the element inside the iframe without offsetParent, this method will return\n\t//    documentElement of the parent window\n\t// 2) For the hidden or detached element\n\t// 3) For body or html element, i.e. in case of the html node - it will return itself\n\t//\n\t// but those exceptions were never presented as a real life use-cases\n\t// and might be considered as more preferable results.\n\t//\n\t// This logic, however, is not guaranteed and can change at any point in the future\n\toffsetParent: function() {\n\t\treturn this.map( function() {\n\t\t\tvar offsetParent = this.offsetParent;\n\n\t\t\twhile ( offsetParent && jQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || documentElement;\n\t\t} );\n\t}\n} );\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\n\t\t\t// Coalesce documents and windows\n\t\t\tvar win;\n\t\t\tif ( isWindow( elem ) ) {\n\t\t\t\twin = elem;\n\t\t\t} else if ( elem.nodeType === 9 ) {\n\t\t\t\twin = elem.defaultView;\n\t\t\t}\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : win.pageXOffset,\n\t\t\t\t\ttop ? val : win.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length );\n\t};\n} );\n\n// Support: Safari <=7 - 9.1, Chrome <=37 - 49\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( _i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n} );\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( {\n\t\tpadding: \"inner\" + name,\n\t\tcontent: type,\n\t\t\"\": \"outer\" + name\n\t}, function( defaultExtra, funcName ) {\n\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( isWindow( elem ) ) {\n\n\t\t\t\t\t// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)\n\t\t\t\t\treturn funcName.indexOf( \"outer\" ) === 0 ?\n\t\t\t\t\t\telem[ \"inner\" + name ] :\n\t\t\t\t\t\telem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable );\n\t\t};\n\t} );\n} );\n\n\njQuery.each( [\n\t\"ajaxStart\",\n\t\"ajaxStop\",\n\t\"ajaxComplete\",\n\t\"ajaxError\",\n\t\"ajaxSuccess\",\n\t\"ajaxSend\"\n], function( _i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n} );\n\n\n\n\njQuery.fn.extend( {\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ?\n\t\t\tthis.off( selector, \"**\" ) :\n\t\t\tthis.off( types, selector || \"**\", fn );\n\t},\n\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n} );\n\njQuery.each(\n\t( \"blur focus focusin focusout resize scroll click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup contextmenu\" ).split( \" \" ),\n\tfunction( _i, name ) {\n\n\t\t// Handle event binding\n\t\tjQuery.fn[ name ] = function( data, fn ) {\n\t\t\treturn arguments.length > 0 ?\n\t\t\t\tthis.on( name, null, data, fn ) :\n\t\t\t\tthis.trigger( name );\n\t\t};\n\t}\n);\n\n\n\n\n// Support: Android <=4.0 only\n// Make sure we trim BOM and NBSP\nvar rtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n\n// Bind a function to a context, optionally partially applying any\n// arguments.\n// jQuery.proxy is deprecated to promote standards (specifically Function#bind)\n// However, it is not slated for removal any time soon\njQuery.proxy = function( fn, context ) {\n\tvar tmp, args, proxy;\n\n\tif ( typeof context === \"string\" ) {\n\t\ttmp = fn[ context ];\n\t\tcontext = fn;\n\t\tfn = tmp;\n\t}\n\n\t// Quick check to determine if target is callable, in the spec\n\t// this throws a TypeError, but we will just return undefined.\n\tif ( !isFunction( fn ) ) {\n\t\treturn undefined;\n\t}\n\n\t// Simulated bind\n\targs = slice.call( arguments, 2 );\n\tproxy = function() {\n\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t};\n\n\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\treturn proxy;\n};\n\njQuery.holdReady = function( hold ) {\n\tif ( hold ) {\n\t\tjQuery.readyWait++;\n\t} else {\n\t\tjQuery.ready( true );\n\t}\n};\njQuery.isArray = Array.isArray;\njQuery.parseJSON = JSON.parse;\njQuery.nodeName = nodeName;\njQuery.isFunction = isFunction;\njQuery.isWindow = isWindow;\njQuery.camelCase = camelCase;\njQuery.type = toType;\n\njQuery.now = Date.now;\n\njQuery.isNumeric = function( obj ) {\n\n\t// As of jQuery 3.0, isNumeric is limited to\n\t// strings and numbers (primitives or objects)\n\t// that can be coerced to finite numbers (gh-2662)\n\tvar type = jQuery.type( obj );\n\treturn ( type === \"number\" || type === \"string\" ) &&\n\n\t\t// parseFloat NaNs numeric-cast false positives (\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t!isNaN( obj - parseFloat( obj ) );\n};\n\njQuery.trim = function( text ) {\n\treturn text == null ?\n\t\t\"\" :\n\t\t( text + \"\" ).replace( rtrim, \"\" );\n};\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( \"jquery\", [], function() {\n\t\treturn jQuery;\n\t} );\n}\n\n\n\n\nvar\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\nif ( typeof noGlobal === \"undefined\" ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n} );\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/jquery/jquery-3.6.0.min.js",
    "content": "/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */\n!function(e,t){\"use strict\";\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error(\"jQuery requires a window with a document\");return t(e)}:t(e)}(\"undefined\"!=typeof window?window:this,function(C,e){\"use strict\";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return\"function\"==typeof e&&\"number\"!=typeof e.nodeType&&\"function\"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement(\"script\");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?n[o.call(e)]||\"object\":typeof e}var f=\"3.6.0\",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&\"length\"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&(\"array\"===n||0===t||\"number\"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for(\"boolean\"==typeof a&&(l=a,a=arguments[s]||{},s++),\"object\"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],\"__proto__\"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:\"jQuery\"+(f+Math.random()).replace(/\\D/g,\"\"),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||\"[object Object]\"!==o.call(e))&&(!(t=r(e))||\"function\"==typeof(n=v.call(t,\"constructor\")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,\"string\"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),\"function\"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each(\"Boolean Number String Function Array Date RegExp Object Error Symbol\".split(\" \"),function(e,t){n[\"[object \"+t+\"]\"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S=\"sizzle\"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),j=function(e,t){return e===t&&(l=!0),0},D={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R=\"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",M=\"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",I=\"(?:\\\\\\\\[\\\\da-fA-F]{1,6}\"+M+\"?|\\\\\\\\[^\\\\r\\\\n\\\\f]|[\\\\w-]|[^\\0-\\\\x7f])+\",W=\"\\\\[\"+M+\"*(\"+I+\")(?:\"+M+\"*([*^$|!~]?=)\"+M+\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\"+I+\"))|)\"+M+\"*\\\\]\",F=\":(\"+I+\")(?:\\\\((('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\"+W+\")*)|.*)\\\\)|)\",B=new RegExp(M+\"+\",\"g\"),$=new RegExp(\"^\"+M+\"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\"+M+\"+$\",\"g\"),_=new RegExp(\"^\"+M+\"*,\"+M+\"*\"),z=new RegExp(\"^\"+M+\"*([>+~]|\"+M+\")\"+M+\"*\"),U=new RegExp(M+\"|>\"),X=new RegExp(F),V=new RegExp(\"^\"+I+\"$\"),G={ID:new RegExp(\"^#(\"+I+\")\"),CLASS:new RegExp(\"^\\\\.(\"+I+\")\"),TAG:new RegExp(\"^(\"+I+\"|[*])\"),ATTR:new RegExp(\"^\"+W),PSEUDO:new RegExp(\"^\"+F),CHILD:new RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+M+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+M+\"*(?:([+-]|)\"+M+\"*(\\\\d+)|))\"+M+\"*\\\\)|)\",\"i\"),bool:new RegExp(\"^(?:\"+R+\")$\",\"i\"),needsContext:new RegExp(\"^\"+M+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+M+\"*((?:-\\\\d)?\\\\d*)\"+M+\"*\\\\)|)(?=[^-]|$)\",\"i\")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\\d$/i,K=/^[^{]+\\{\\s*\\[native \\w/,Z=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,ee=/[+~]/,te=new RegExp(\"\\\\\\\\[\\\\da-fA-F]{1,6}\"+M+\"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\",\"g\"),ne=function(e,t){var n=\"0x\"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,ie=function(e,t){return t?\"\\0\"===e?\"\\ufffd\":e.slice(0,-1)+\"\\\\\"+e.charCodeAt(e.length-1).toString(16)+\" \":\"\\\\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&\"fieldset\"===e.nodeName.toLowerCase()},{dir:\"parentNode\",next:\"legend\"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],\"string\"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+\" \"]&&(!v||!v.test(t))&&(1!==p||\"object\"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute(\"id\"))?s=s.replace(re,ie):e.setAttribute(\"id\",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?\"#\"+s:\":scope\")+\" \"+xe(l[o]);c=l.join(\",\")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute(\"id\")}}}return g(t.replace($,\"$1\"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+\" \")>b.cacheLength&&delete e[r.shift()],e[t+\" \"]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement(\"fieldset\");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split(\"|\"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return\"input\"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return(\"input\"===t||\"button\"===t)&&e.type===n}}function ge(t){return function(e){return\"form\"in e?e.parentNode&&!1===e.disabled?\"label\"in e?\"label\"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:\"label\"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&\"undefined\"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||\"HTML\")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener(\"unload\",oe,!1):n.attachEvent&&n.attachEvent(\"onunload\",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement(\"div\")),\"undefined\"!=typeof e.querySelectorAll&&!e.querySelectorAll(\":scope fieldset div\").length}),d.attributes=ce(function(e){return e.className=\"i\",!e.getAttribute(\"className\")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment(\"\")),!e.getElementsByTagName(\"*\").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute(\"id\")===t}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t=\"undefined\"!=typeof e.getAttributeNode&&e.getAttributeNode(\"id\");return t&&t.value===n}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return\"undefined\"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if(\"*\"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if(\"undefined\"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML=\"<a id='\"+S+\"'></a><select id='\"+S+\"-\\r\\\\' msallowcapture=''><option selected=''></option></select>\",e.querySelectorAll(\"[msallowcapture^='']\").length&&v.push(\"[*^$]=\"+M+\"*(?:''|\\\"\\\")\"),e.querySelectorAll(\"[selected]\").length||v.push(\"\\\\[\"+M+\"*(?:value|\"+R+\")\"),e.querySelectorAll(\"[id~=\"+S+\"-]\").length||v.push(\"~=\"),(t=C.createElement(\"input\")).setAttribute(\"name\",\"\"),e.appendChild(t),e.querySelectorAll(\"[name='']\").length||v.push(\"\\\\[\"+M+\"*name\"+M+\"*=\"+M+\"*(?:''|\\\"\\\")\"),e.querySelectorAll(\":checked\").length||v.push(\":checked\"),e.querySelectorAll(\"a#\"+S+\"+*\").length||v.push(\".#.+[+~]\"),e.querySelectorAll(\"\\\\\\f\"),v.push(\"[\\\\r\\\\n\\\\f]\")}),ce(function(e){e.innerHTML=\"<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>\";var t=C.createElement(\"input\");t.setAttribute(\"type\",\"hidden\"),e.appendChild(t).setAttribute(\"name\",\"D\"),e.querySelectorAll(\"[name=d]\").length&&v.push(\"name\"+M+\"*[*^$|!~]?=\"),2!==e.querySelectorAll(\":enabled\").length&&v.push(\":enabled\",\":disabled\"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(\":disabled\").length&&v.push(\":enabled\",\":disabled\"),e.querySelectorAll(\"*,:x\"),v.push(\",.*:\")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,\"*\"),c.call(e,\"[s!='']:x\"),s.push(\"!=\",F)}),v=v.length&&new RegExp(v.join(\"|\")),s=s.length&&new RegExp(s.join(\"|\")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+\" \"]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&D.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+\"\").replace(re,ie)},se.error=function(e){throw new Error(\"Syntax error, unrecognized expression: \"+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(j),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n=\"\",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if(\"string\"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{\">\":{dir:\"parentNode\",first:!0},\" \":{dir:\"parentNode\"},\"+\":{dir:\"previousSibling\",first:!0},\"~\":{dir:\"previousSibling\"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||\"\").replace(te,ne),\"~=\"===e[2]&&(e[3]=\" \"+e[3]+\" \"),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),\"nth\"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*(\"even\"===e[3]||\"odd\"===e[3])),e[5]=+(e[7]+e[8]||\"odd\"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||\"\":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(\")\",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return\"*\"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+\" \"];return t||(t=new RegExp(\"(^|\"+M+\")\"+e+\"(\"+M+\"|$)\"))&&m(e,function(e){return t.test(\"string\"==typeof e.className&&e.className||\"undefined\"!=typeof e.getAttribute&&e.getAttribute(\"class\")||\"\")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?\"!=\"===r:!r||(t+=\"\",\"=\"===r?t===i:\"!=\"===r?t!==i:\"^=\"===r?i&&0===t.indexOf(i):\"*=\"===r?i&&-1<t.indexOf(i):\"$=\"===r?i&&t.slice(-i.length)===i:\"~=\"===r?-1<(\" \"+t.replace(B,\" \")+\" \").indexOf(i):\"|=\"===r&&(t===i||t.slice(0,i.length+1)===i+\"-\"))}},CHILD:function(h,e,t,g,v){var y=\"nth\"!==h.slice(0,3),m=\"last\"!==h.slice(-4),x=\"of-type\"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?\"nextSibling\":\"previousSibling\",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l=\"only\"===h&&!u&&\"nextSibling\"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error(\"unsupported pseudo: \"+e);return a[S]?a(o):1<a.length?(t=[e,e,\"\",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,\"$1\"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||\"\")||se.error(\"unsupported lang: \"+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute(\"xml:lang\")||e.getAttribute(\"lang\"))return(t=t.toLowerCase())===n||0===t.indexOf(n+\"-\")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return\"input\"===t&&!!e.checked||\"option\"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return\"input\"===t&&\"button\"===e.type||\"button\"===t},text:function(e){var t;return\"input\"===e.nodeName.toLowerCase()&&\"text\"===e.type&&(null==(t=e.getAttribute(\"type\"))||\"text\"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r=\"\";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&\"parentNode\"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||\"*\",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[\" \"],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:\" \"===e[s-2].type?\"*\":\"\"})).replace($,\"$1\"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+\" \"];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($,\" \")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+\" \"];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l=\"0\",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG(\"*\",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l=\"function\"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&\"ID\"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split(\"\").sort(j).join(\"\")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement(\"fieldset\"))}),ce(function(e){return e.innerHTML=\"<a href='#'></a>\",\"#\"===e.firstChild.getAttribute(\"href\")})||fe(\"type|href|height|width\",function(e,t,n){if(!n)return e.getAttribute(t,\"type\"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML=\"<input/>\",e.firstChild.setAttribute(\"value\",\"\"),\"\"===e.firstChild.getAttribute(\"value\")})||fe(\"value\",function(e,t,n){if(!n&&\"input\"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute(\"disabled\")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[\":\"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):\"string\"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=\":not(\"+e+\")\"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if(\"string\"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,\"string\"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var D,q=/^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,\"string\"==typeof e){if(!(r=\"<\"===e[0]&&\">\"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a=\"string\"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?\"string\"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,\"parentNode\")},parentsUntil:function(e,t,n){return h(e,\"parentNode\",n)},next:function(e){return O(e,\"nextSibling\")},prev:function(e){return O(e,\"previousSibling\")},nextAll:function(e){return h(e,\"nextSibling\")},prevAll:function(e){return h(e,\"previousSibling\")},nextUntil:function(e,t,n){return h(e,\"nextSibling\",n)},prevUntil:function(e,t,n){return h(e,\"previousSibling\",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,\"template\")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return\"Until\"!==r.slice(-5)&&(t=e),t&&\"string\"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\\x20\\t\\r\\n\\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r=\"string\"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:\"\")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&\"string\"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t=\"\",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=\"\"),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[[\"notify\",\"progress\",S.Callbacks(\"memory\"),S.Callbacks(\"memory\"),2],[\"resolve\",\"done\",S.Callbacks(\"once memory\"),S.Callbacks(\"once memory\"),0,\"resolved\"],[\"reject\",\"fail\",S.Callbacks(\"once memory\"),S.Callbacks(\"once memory\"),1,\"rejected\"]],i=\"pending\",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},\"catch\":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+\"With\"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError(\"Thenable self-resolution\");t=e&&(\"object\"==typeof e||\"function\"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+\"With\"](this===s?void 0:this,arguments),this},s[t[0]+\"With\"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),\"pending\"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn(\"jQuery.Deferred exception: \"+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener(\"DOMContentLoaded\",B),C.removeEventListener(\"load\",B),S.ready()}S.fn.ready=function(e){return F.then(e)[\"catch\"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,\"complete\"===E.readyState||\"loading\"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener(\"DOMContentLoaded\",B),C.addEventListener(\"load\",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if(\"object\"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,\"ms-\").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if(\"string\"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&\"string\"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r=\"data-\"+t.replace(K,\"-$&\").toLowerCase(),\"string\"==typeof(n=e.getAttribute(r))){try{n=\"true\"===(i=n)||\"false\"!==i&&(\"null\"===i?null:i===+i+\"\"?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,\"hasDataAttrs\"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf(\"data-\")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,\"hasDataAttrs\",!0)}return i}return\"object\"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||\"fx\")+\"queue\",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||\"fx\";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);\"inprogress\"===i&&(i=n.shift(),r--),i&&(\"fx\"===t&&n.unshift(\"inprogress\"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+\"queueHooks\";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks(\"once memory\").add(function(){Y.remove(e,[t+\"queue\",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return\"string\"!=typeof t&&(n=t,t=\"fx\",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),\"fx\"===t&&\"inprogress\"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||\"fx\",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};\"string\"!=typeof e&&(t=e,e=void 0),e=e||\"fx\";while(a--)(n=Y.get(o[a],e+\"queueHooks\"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,te=new RegExp(\"^(?:([+-])=|)(\"+ee+\")([a-z%]*)$\",\"i\"),ne=[\"Top\",\"Right\",\"Bottom\",\"Left\"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return\"none\"===(e=t||e).style.display||\"\"===e.style.display&&ie(e)&&\"none\"===S.css(e,\"display\")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,\"\")},u=s(),l=n&&n[3]||(S.cssNumber[t]?\"\":\"px\"),c=e.nodeType&&(S.cssNumber[t]||\"px\"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?(\"none\"===n&&(l[c]=Y.get(r,\"display\")||null,l[c]||(r.style.display=\"\")),\"\"===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,\"display\"),o.parentNode.removeChild(o),\"none\"===u&&(u=\"block\"),ue[s]=u)))):\"none\"!==n&&(l[c]=\"none\",Y.set(r,\"display\",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return\"boolean\"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i,he=/^$|^module$|\\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement(\"div\")),(fe=E.createElement(\"input\")).setAttribute(\"type\",\"radio\"),fe.setAttribute(\"checked\",\"checked\"),fe.setAttribute(\"name\",\"t\"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML=\"<textarea>x</textarea>\",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML=\"<option></option>\",y.option=!!ce.lastChild;var ge={thead:[1,\"<table>\",\"</table>\"],col:[2,\"<table><colgroup>\",\"</colgroup></table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],td:[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],_default:[0,\"\",\"\"]};function ve(e,t){var n;return n=\"undefined\"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||\"*\"):\"undefined\"!=typeof e.querySelectorAll?e.querySelectorAll(t||\"*\"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],\"globalEval\",!t||Y.get(t[n],\"globalEval\"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,\"<select multiple='multiple'>\",\"</select>\"]);var me=/<|&#?\\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if(\"object\"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement(\"div\")),s=(de.exec(o)||[\"\",\"\"])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=\"\"}else p.push(t.createTextNode(o));f.textContent=\"\",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),\"script\"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||\"\")&&n.push(o)}return f}var be=/^([^.]*)(?:\\.(.+)|)/;function we(){return!0}function Te(){return!1}function Ce(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==(\"focus\"===t)}function Ee(e,t,n,r,i,o){var a,s;if(\"object\"==typeof t){for(s in\"string\"!=typeof n&&(r=r||n,n=void 0),t)Ee(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&(\"string\"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Te;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Se(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n&&n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,we)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return\"undefined\"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||\"\").match(P)||[\"\"]).length;while(l--)d=g=(s=be.exec(e[l])||[])[1],h=(s[2]||\"\").split(\".\").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(\".\")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||\"\").match(P)||[\"\"]).length;while(l--)if(d=g=(s=be.exec(t[l])||[])[1],h=(s[2]||\"\").split(\".\").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp(\"(^|\\\\.)\"+h.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&(\"**\"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,\"handle events\")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,\"events\")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!(\"click\"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&(\"click\"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+\" \"]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,\"input\")&&Se(t,\"click\",we),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,\"input\")&&Se(t,\"click\"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,\"input\")&&Y.get(t,\"click\")||A(t,\"a\")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?we:Te,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Te,isPropagationStopped:Te,isImmediatePropagationStopped:Te,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=we,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=we,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=we,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,\"char\":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},S.event.addProp),S.each({focus:\"focusin\",blur:\"focusout\"},function(e,t){S.event.special[e]={setup:function(){return Se(this,e,Ce),!1},trigger:function(){return Se(this,e),!0},_default:function(){return!0},delegateType:t}}),S.each({mouseenter:\"mouseover\",mouseleave:\"mouseout\",pointerenter:\"pointerover\",pointerleave:\"pointerout\"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return Ee(this,e,t,n,r)},one:function(e,t,n,r){return Ee(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+\".\"+r.namespace:r.origType,r.selector,r.handler),this;if(\"object\"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&\"function\"!=typeof t||(n=t,t=void 0),!1===n&&(n=Te),this.each(function(){S.event.remove(this,e,n,t)})}});var ke=/<script|<style|<link/i,Ae=/checked\\s*(?:[^=]|=\\s*.checked.)/i,Ne=/^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;function je(e,t){return A(e,\"table\")&&A(11!==t.nodeType?t:t.firstChild,\"tr\")&&S(e).children(\"tbody\")[0]||e}function De(e){return e.type=(null!==e.getAttribute(\"type\"))+\"/\"+e.type,e}function qe(e){return\"true/\"===(e.type||\"\").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute(\"type\"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,\"handle events\"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function He(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&\"string\"==typeof d&&!y.checkClone&&Ae.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),He(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,\"script\"),De)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,\"script\"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,qe),c=0;c<s;c++)u=a[c],he.test(u.type||\"\")&&!Y.access(u,\"globalEval\")&&S.contains(l,u)&&(u.src&&\"module\"!==(u.type||\"\").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute(\"nonce\")},l):b(u.textContent.replace(Ne,\"\"),u,l))}return n}function Oe(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,\"script\")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,\"input\"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:\"input\"!==l&&\"textarea\"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Le(o[r],a[r]);else Le(e,c);return 0<(a=ve(c,\"script\")).length&&ye(a,!f&&ve(e,\"script\")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Oe(this,e,!0)},remove:function(e){return Oe(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return He(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||je(this,e).appendChild(e)})},prepend:function(){return He(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=je(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent=\"\");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if(\"string\"==typeof e&&!ke.test(e)&&!ge[(de.exec(e)||[\"\",\"\"])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return He(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:\"append\",prependTo:\"prepend\",insertBefore:\"before\",insertAfter:\"after\",replaceAll:\"replaceWith\"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Pe=new RegExp(\"^(\"+ee+\")(?!px)[a-z%]+$\",\"i\"),Re=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Me=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ie=new RegExp(ne.join(\"|\"),\"i\");function We(e,t,n){var r,i,o,a,s=e.style;return(n=n||Re(e))&&(\"\"!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Pe.test(a)&&Ie.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+\"\":a}function Fe(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText=\"position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0\",l.style.cssText=\"position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%\",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n=\"1%\"!==e.top,s=12===t(e.marginLeft),l.style.right=\"60%\",o=36===t(e.right),r=36===t(e.width),l.style.position=\"absolute\",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement(\"div\"),l=E.createElement(\"div\");l.style&&(l.style.backgroundClip=\"content-box\",l.cloneNode(!0).style.backgroundClip=\"\",y.clearCloneStyle=\"content-box\"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement(\"table\"),t=E.createElement(\"tr\"),n=E.createElement(\"div\"),e.style.cssText=\"position:absolute;left:-11111px;border-collapse:separate\",t.style.cssText=\"border:1px solid\",t.style.height=\"1px\",n.style.height=\"9px\",n.style.display=\"block\",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,re.removeChild(e)),a}}))}();var Be=[\"Webkit\",\"Moz\",\"ms\"],$e=E.createElement(\"div\").style,_e={};function ze(e){var t=S.cssProps[e]||_e[e];return t||(e in $e?e:_e[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Be.length;while(n--)if((e=Be[n]+t)in $e)return e}(e)||e)}var Ue=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ve={position:\"absolute\",visibility:\"hidden\",display:\"block\"},Ge={letterSpacing:\"0\",fontWeight:\"400\"};function Ye(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||\"px\"):t}function Qe(e,t,n,r,i,o){var a=\"width\"===t?1:0,s=0,u=0;if(n===(r?\"border\":\"content\"))return 0;for(;a<4;a+=2)\"margin\"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?(\"content\"===n&&(u-=S.css(e,\"padding\"+ne[a],!0,i)),\"margin\"!==n&&(u-=S.css(e,\"border\"+ne[a]+\"Width\",!0,i))):(u+=S.css(e,\"padding\"+ne[a],!0,i),\"padding\"!==n?u+=S.css(e,\"border\"+ne[a]+\"Width\",!0,i):s+=S.css(e,\"border\"+ne[a]+\"Width\",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e[\"offset\"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Je(e,t,n){var r=Re(e),i=(!y.boxSizingReliable()||n)&&\"border-box\"===S.css(e,\"boxSizing\",!1,r),o=i,a=We(e,t,r),s=\"offset\"+t[0].toUpperCase()+t.slice(1);if(Pe.test(a)){if(!n)return a;a=\"auto\"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,\"tr\")||\"auto\"===a||!parseFloat(a)&&\"inline\"===S.css(e,\"display\",!1,r))&&e.getClientRects().length&&(i=\"border-box\"===S.css(e,\"boxSizing\",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Qe(e,t,n||(i?\"border\":\"content\"),o,r,a)+\"px\"}function Ke(e,t,n,r,i){return new Ke.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=We(e,\"opacity\");return\"\"===n?\"1\":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Xe.test(t),l=e.style;if(u||(t=ze(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&\"get\"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];\"string\"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o=\"number\"),null!=n&&n==n&&(\"number\"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?\"\":\"px\")),y.clearCloneStyle||\"\"!==n||0!==t.indexOf(\"background\")||(l[t]=\"inherit\"),a&&\"set\"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Xe.test(t)||(t=ze(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&\"get\"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=We(e,t,r)),\"normal\"===i&&t in Ge&&(i=Ge[t]),\"\"===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each([\"height\",\"width\"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ue.test(S.css(e,\"display\"))||e.getClientRects().length&&e.getBoundingClientRect().width?Je(e,u,n):Me(e,Ve,function(){return Je(e,u,n)})},set:function(e,t,n){var r,i=Re(e),o=!y.scrollboxSize()&&\"absolute\"===i.position,a=(o||n)&&\"border-box\"===S.css(e,\"boxSizing\",!1,i),s=n?Qe(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e[\"offset\"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Qe(e,u,\"border\",!1,i)-.5)),s&&(r=te.exec(t))&&\"px\"!==(r[3]||\"px\")&&(e.style[u]=t,t=S.css(e,u)),Ye(0,t,s)}}}),S.cssHooks.marginLeft=Fe(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(We(e,\"marginLeft\"))||e.getBoundingClientRect().left-Me(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+\"px\"}),S.each({margin:\"\",padding:\"\",border:\"Width\"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r=\"string\"==typeof e?e.split(\" \"):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},\"margin\"!==i&&(S.cssHooks[i+o].set=Ye)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Re(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=Ke).prototype={constructor:Ke,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?\"\":\"px\")},cur:function(){var e=Ke.propHooks[this.prop];return e&&e.get?e.get(this):Ke.propHooks._default.get(this)},run:function(e){var t,n=Ke.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ke.propHooks._default.set(this),this}}).init.prototype=Ke.prototype,(Ke.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,\"\"))&&\"auto\"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[ze(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=Ke.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:\"swing\"},S.fx=Ke.prototype.init,S.fx.step={};var Ze,et,tt,nt,rt=/^(?:toggle|show|hide)$/,it=/queueHooks$/;function ot(){et&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(ot):C.setTimeout(ot,S.fx.interval),S.fx.tick())}function at(){return C.setTimeout(function(){Ze=void 0}),Ze=Date.now()}function st(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i[\"margin\"+(n=ne[r])]=i[\"padding\"+n]=e;return t&&(i.opacity=i.width=e),i}function ut(e,t,n){for(var r,i=(lt.tweeners[t]||[]).concat(lt.tweeners[\"*\"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function lt(o,e,t){var n,a,r=0,i=lt.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=Ze||at(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:Ze||at(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&\"expand\"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=lt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ut,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(lt,{tweeners:{\"*\":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=[\"*\"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],lt.tweeners[n]=lt.tweeners[n]||[],lt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f=\"width\"in t||\"height\"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,\"fxshow\");for(r in n.queue||(null==(a=S._queueHooks(e,\"fx\")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,\"fx\").length||a.empty.fire()})})),t)if(i=t[r],rt.test(i)){if(delete t[r],o=o||\"toggle\"===i,i===(g?\"hide\":\"show\")){if(\"show\"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,\"display\")),\"none\"===(c=S.css(e,\"display\"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,\"display\"),le([e]))),(\"inline\"===c||\"inline-block\"===c&&null!=l)&&\"none\"===S.css(e,\"float\")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l=\"none\"===c?\"\":c)),h.display=\"inline-block\")),n.overflow&&(h.overflow=\"hidden\",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?\"hidden\"in v&&(g=v.hidden):v=Y.access(e,\"fxshow\",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,\"fxshow\"),d)S.style(e,r,d[r])})),u=ut(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?lt.prefilters.unshift(e):lt.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&\"object\"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:\"number\"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue=\"fx\"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css(\"opacity\",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=lt(this,S.extend({},t),o);(i||Y.get(this,\"finish\"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return\"string\"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||\"fx\",[]),this.each(function(){var e=!0,t=null!=i&&i+\"queueHooks\",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&it.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||\"fx\"),this.each(function(){var e,t=Y.get(this),n=t[a+\"queue\"],r=t[a+\"queueHooks\"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each([\"toggle\",\"show\",\"hide\"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||\"boolean\"==typeof e?i.apply(this,arguments):this.animate(st(r,!0),e,t,n)}}),S.each({slideDown:st(\"show\"),slideUp:st(\"hide\"),slideToggle:st(\"toggle\"),fadeIn:{opacity:\"show\"},fadeOut:{opacity:\"hide\"},fadeToggle:{opacity:\"toggle\"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(Ze=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),Ze=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){et||(et=!0,ot())},S.fx.stop=function(){et=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||\"fx\",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},tt=E.createElement(\"input\"),nt=E.createElement(\"select\").appendChild(E.createElement(\"option\")),tt.type=\"checkbox\",y.checkOn=\"\"!==tt.value,y.optSelected=nt.selected,(tt=E.createElement(\"input\")).value=\"t\",tt.type=\"radio\",y.radioValue=\"t\"===tt.value;var ct,ft=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return\"undefined\"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?ct:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&\"set\"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+\"\"),n):i&&\"get\"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&\"radio\"===t&&A(e,\"input\")){var n=e.value;return e.setAttribute(\"type\",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ct={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\\w+/g),function(e,t){var a=ft[t]||S.find.attr;ft[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=ft[o],ft[o]=r,r=null!=a(e,t,n)?o:null,ft[o]=i),r}});var pt=/^(?:input|select|textarea|button)$/i,dt=/^(?:a|area)$/i;function ht(e){return(e.match(P)||[]).join(\" \")}function gt(e){return e.getAttribute&&e.getAttribute(\"class\")||\"\"}function vt(e){return Array.isArray(e)?e:\"string\"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&\"set\"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&\"get\"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,\"tabindex\");return t?parseInt(t,10):pt.test(e.nodeName)||dt.test(e.nodeName)&&e.href?0:-1}}},propFix:{\"for\":\"htmlFor\",\"class\":\"className\"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each([\"tabIndex\",\"readOnly\",\"maxLength\",\"cellSpacing\",\"cellPadding\",\"rowSpan\",\"colSpan\",\"useMap\",\"frameBorder\",\"contentEditable\"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,gt(this)))});if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&\" \"+ht(i)+\" \"){a=0;while(o=e[a++])r.indexOf(\" \"+o+\" \")<0&&(r+=o+\" \");i!==(s=ht(r))&&n.setAttribute(\"class\",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,gt(this)))});if(!arguments.length)return this.attr(\"class\",\"\");if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&\" \"+ht(i)+\" \"){a=0;while(o=e[a++])while(-1<r.indexOf(\" \"+o+\" \"))r=r.replace(\" \"+o+\" \",\" \");i!==(s=ht(r))&&n.setAttribute(\"class\",s)}return this},toggleClass:function(i,t){var o=typeof i,a=\"string\"===o||Array.isArray(i);return\"boolean\"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,gt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=vt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&\"boolean\"!==o||((e=gt(this))&&Y.set(this,\"__className__\",e),this.setAttribute&&this.setAttribute(\"class\",e||!1===i?\"\":Y.get(this,\"__className__\")||\"\"))})},hasClass:function(e){var t,n,r=0;t=\" \"+e+\" \";while(n=this[r++])if(1===n.nodeType&&-1<(\" \"+ht(gt(n))+\" \").indexOf(t))return!0;return!1}});var yt=/\\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t=\"\":\"number\"==typeof t?t+=\"\":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?\"\":e+\"\"})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&\"set\"in r&&void 0!==r.set(this,t,\"value\")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&\"get\"in r&&void 0!==(e=r.get(t,\"value\"))?e:\"string\"==typeof(e=t.value)?e.replace(yt,\"\"):null==e?\"\":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,\"value\");return null!=t?t:ht(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a=\"select-one\"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,\"optgroup\"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each([\"radio\",\"checkbox\"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute(\"value\")?\"on\":e.value})}),y.focusin=\"onfocusin\"in C;var mt=/^(?:focusinfocus|focusoutblur)$/,xt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,\"type\")?e.type:e,h=v.call(e,\"namespace\")?e.namespace.split(\".\"):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!mt.test(d+S.event.triggered)&&(-1<d.indexOf(\".\")&&(d=(h=d.split(\".\")).shift(),h.sort()),u=d.indexOf(\":\")<0&&\"on\"+d,(e=e[S.expando]?e:new S.Event(d,\"object\"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join(\".\"),e.rnamespace=e.namespace?new RegExp(\"(^|\\\\.)\"+h.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,mt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,\"events\")||Object.create(null))[e.type]&&Y.get(o,\"handle\"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,xt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,xt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:\"focusin\",blur:\"focusout\"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var bt=C.location,wt={guid:Date.now()},Tt=/\\?/;S.parseXML=function(e){var t,n;if(!e||\"string\"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,\"text/xml\")}catch(e){}return n=t&&t.getElementsByTagName(\"parsererror\")[0],t&&!n||S.error(\"Invalid XML: \"+(n?S.map(n.childNodes,function(e){return e.textContent}).join(\"\\n\"):e)),t};var Ct=/\\[\\]$/,Et=/\\r?\\n/g,St=/^(?:submit|button|image|reset|file)$/i,kt=/^(?:input|select|textarea|keygen)/i;function At(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||Ct.test(n)?i(n,t):At(n+\"[\"+(\"object\"==typeof t&&null!=t?e:\"\")+\"]\",t,r,i)});else if(r||\"object\"!==w(e))i(n,e);else for(t in e)At(n+\"[\"+t+\"]\",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+\"=\"+encodeURIComponent(null==n?\"\":n)};if(null==e)return\"\";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)At(n,e[n],t,i);return r.join(\"&\")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,\"elements\");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(\":disabled\")&&kt.test(this.nodeName)&&!St.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(Et,\"\\r\\n\")}}):{name:t.name,value:n.replace(Et,\"\\r\\n\")}}).get()}});var Nt=/%20/g,jt=/#.*$/,Dt=/([?&])_=[^&]*/,qt=/^(.*?):[ \\t]*([^\\r\\n]*)$/gm,Lt=/^(?:GET|HEAD)$/,Ht=/^\\/\\//,Ot={},Pt={},Rt=\"*/\".concat(\"*\"),Mt=E.createElement(\"a\");function It(o){return function(e,t){\"string\"!=typeof e&&(t=e,e=\"*\");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])\"+\"===n[0]?(n=n.slice(1)||\"*\",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Wt(t,i,o,a){var s={},u=t===Pt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return\"string\"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s[\"*\"]&&l(\"*\")}function Ft(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Mt.href=bt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:bt.href,type:\"GET\",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(bt.protocol),global:!0,processData:!0,async:!0,contentType:\"application/x-www-form-urlencoded; charset=UTF-8\",accepts:{\"*\":Rt,text:\"text/plain\",html:\"text/html\",xml:\"application/xml, text/xml\",json:\"application/json, text/javascript\"},contents:{xml:/\\bxml\\b/,html:/\\bhtml/,json:/\\bjson\\b/},responseFields:{xml:\"responseXML\",text:\"responseText\",json:\"responseJSON\"},converters:{\"* text\":String,\"text html\":!0,\"text json\":JSON.parse,\"text xml\":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Ft(Ft(e,S.ajaxSettings),t):Ft(S.ajaxSettings,e)},ajaxPrefilter:It(Ot),ajaxTransport:It(Pt),ajax:function(e,t){\"object\"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks(\"once memory\"),w=v.statusCode||{},a={},s={},u=\"canceled\",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=qt.exec(p))n[t[1].toLowerCase()+\" \"]=(n[t[1].toLowerCase()+\" \"]||[]).concat(t[2])}t=n[e.toLowerCase()+\" \"]}return null==t?null:t.join(\", \")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||bt.href)+\"\").replace(Ht,bt.protocol+\"//\"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||\"*\").toLowerCase().match(P)||[\"\"],null==v.crossDomain){r=E.createElement(\"a\");try{r.href=v.url,r.href=r.href,v.crossDomain=Mt.protocol+\"//\"+Mt.host!=r.protocol+\"//\"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&\"string\"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Wt(Ot,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger(\"ajaxStart\"),v.type=v.type.toUpperCase(),v.hasContent=!Lt.test(v.type),f=v.url.replace(jt,\"\"),v.hasContent?v.data&&v.processData&&0===(v.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&(v.data=v.data.replace(Nt,\"+\")):(o=v.url.slice(f.length),v.data&&(v.processData||\"string\"==typeof v.data)&&(f+=(Tt.test(f)?\"&\":\"?\")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Dt,\"$1\"),o=(Tt.test(f)?\"&\":\"?\")+\"_=\"+wt.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader(\"If-Modified-Since\",S.lastModified[f]),S.etag[f]&&T.setRequestHeader(\"If-None-Match\",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader(\"Content-Type\",v.contentType),T.setRequestHeader(\"Accept\",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+(\"*\"!==v.dataTypes[0]?\", \"+Rt+\"; q=0.01\":\"\"):v.accepts[\"*\"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u=\"abort\",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Wt(Pt,v,t,T)){if(T.readyState=1,g&&m.trigger(\"ajaxSend\",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort(\"timeout\")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,\"No Transport\");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||\"\",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while(\"*\"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader(\"Content-Type\"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+\" \"+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray(\"script\",v.dataTypes)&&S.inArray(\"json\",v.dataTypes)<0&&(v.converters[\"text script\"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if(\"*\"===o)o=u;else if(\"*\"!==u&&u!==o){if(!(a=l[u+\" \"+o]||l[\"* \"+o]))for(i in l)if((s=i.split(\" \"))[1]===o&&(a=l[u+\" \"+s[0]]||l[\"* \"+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e[\"throws\"])t=a(t);else try{t=a(t)}catch(e){return{state:\"parsererror\",error:a?e:\"No conversion from \"+u+\" to \"+o}}}return{state:\"success\",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader(\"Last-Modified\"))&&(S.lastModified[f]=u),(u=T.getResponseHeader(\"etag\"))&&(S.etag[f]=u)),204===e||\"HEAD\"===v.type?l=\"nocontent\":304===e?l=\"notmodified\":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l=\"error\",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+\"\",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?\"ajaxSuccess\":\"ajaxError\",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger(\"ajaxComplete\",[T,v]),--S.active||S.event.trigger(\"ajaxStop\")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,\"json\")},getScript:function(e,t){return S.get(e,void 0,t,\"script\")}}),S.each([\"get\",\"post\"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)\"content-type\"===t.toLowerCase()&&(e.contentType=e.headers[t]||\"\")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:\"GET\",dataType:\"script\",cache:!0,async:!1,global:!1,converters:{\"text script\":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not(\"body\").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Bt={0:200,1223:204},$t=S.ajaxSettings.xhr();y.cors=!!$t&&\"withCredentials\"in $t,y.ajax=$t=!!$t,S.ajaxTransport(function(i){var o,a;if(y.cors||$t&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e[\"X-Requested-With\"]||(e[\"X-Requested-With\"]=\"XMLHttpRequest\"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,\"abort\"===e?r.abort():\"error\"===e?\"number\"!=typeof r.status?t(0,\"error\"):t(r.status,r.statusText):t(Bt[r.status]||r.status,r.statusText,\"text\"!==(r.responseType||\"text\")||\"string\"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o(\"error\"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o(\"abort\");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:\"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"},contents:{script:/\\b(?:java|ecma)script\\b/},converters:{\"text script\":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter(\"script\",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type=\"GET\")}),S.ajaxTransport(\"script\",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S(\"<script>\").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on(\"load error\",i=function(e){r.remove(),i=null,e&&t(\"error\"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\\?(?=&|$)|\\?\\?/;S.ajaxSetup({jsonp:\"callback\",jsonpCallback:function(){var e=zt.pop()||S.expando+\"_\"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter(\"json jsonp\",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?\"url\":\"string\"==typeof e.data&&0===(e.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&Ut.test(e.data)&&\"data\");if(a||\"jsonp\"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,\"$1\"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?\"&\":\"?\")+e.jsonp+\"=\"+r),e.converters[\"script json\"]=function(){return o||S.error(r+\" was not called\"),o[0]},e.dataTypes[0]=\"json\",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),\"script\"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument(\"\").body).innerHTML=\"<form></form><form></form>\",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return\"string\"!=typeof e?[]:(\"boolean\"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument(\"\")).createElement(\"base\")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(\" \");return-1<s&&(r=ht(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&\"object\"==typeof t&&(i=\"POST\"),0<a.length&&S.ajax({url:e,type:i||\"GET\",dataType:\"html\",data:t}).done(function(e){o=arguments,a.html(r?S(\"<div>\").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,\"position\"),c=S(e),f={};\"static\"===l&&(e.style.position=\"relative\"),s=c.offset(),o=S.css(e,\"top\"),u=S.css(e,\"left\"),(\"absolute\"===l||\"fixed\"===l)&&-1<(o+u).indexOf(\"auto\")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),\"using\"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if(\"fixed\"===S.css(r,\"position\"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&\"static\"===S.css(e,\"position\"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,\"borderTopWidth\",!0),i.left+=S.css(e,\"borderLeftWidth\",!0))}return{top:t.top-i.top-S.css(r,\"marginTop\",!0),left:t.left-i.left-S.css(r,\"marginLeft\",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&\"static\"===S.css(e,\"position\"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:\"pageXOffset\",scrollTop:\"pageYOffset\"},function(t,i){var o=\"pageYOffset\"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each([\"top\",\"left\"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+\"px\":t})}),S.each({Height:\"height\",Width:\"width\"},function(a,s){S.each({padding:\"inner\"+a,content:s,\"\":\"outer\"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||\"boolean\"!=typeof e),i=r||(!0===e||!0===t?\"margin\":\"border\");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf(\"outer\")?e[\"inner\"+a]:e.document.documentElement[\"client\"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body[\"scroll\"+a],r[\"scroll\"+a],e.body[\"offset\"+a],r[\"offset\"+a],r[\"client\"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each([\"ajaxStart\",\"ajaxStop\",\"ajaxComplete\",\"ajaxError\",\"ajaxSuccess\",\"ajaxSend\"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,\"**\"):this.off(t,e||\"**\",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each(\"blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu\".split(\" \"),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Xt=/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if(\"string\"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return(\"number\"===t||\"string\"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?\"\":(e+\"\").replace(Xt,\"\")},\"function\"==typeof define&&define.amd&&define(\"jquery\",[],function(){return S});var Vt=C.jQuery,Gt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Gt),e&&C.jQuery===S&&(C.jQuery=Vt),S},\"undefined\"==typeof e&&(C.jQuery=C.$=S),S});\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/jquery/jquery-3.6.0.min.map",
    "content": "{\"version\":3,\"sources\":[\"jquery-3.6.0.js\"],\"names\":[\"global\",\"factory\",\"module\",\"exports\",\"document\",\"w\",\"Error\",\"window\",\"this\",\"noGlobal\",\"arr\",\"getProto\",\"Object\",\"getPrototypeOf\",\"slice\",\"flat\",\"array\",\"call\",\"concat\",\"apply\",\"push\",\"indexOf\",\"class2type\",\"toString\",\"hasOwn\",\"hasOwnProperty\",\"fnToString\",\"ObjectFunctionString\",\"support\",\"isFunction\",\"obj\",\"nodeType\",\"item\",\"isWindow\",\"preservedScriptAttributes\",\"type\",\"src\",\"nonce\",\"noModule\",\"DOMEval\",\"code\",\"node\",\"doc\",\"i\",\"val\",\"script\",\"createElement\",\"text\",\"getAttribute\",\"setAttribute\",\"head\",\"appendChild\",\"parentNode\",\"removeChild\",\"toType\",\"version\",\"jQuery\",\"selector\",\"context\",\"fn\",\"init\",\"isArrayLike\",\"length\",\"prototype\",\"jquery\",\"constructor\",\"toArray\",\"get\",\"num\",\"pushStack\",\"elems\",\"ret\",\"merge\",\"prevObject\",\"each\",\"callback\",\"map\",\"elem\",\"arguments\",\"first\",\"eq\",\"last\",\"even\",\"grep\",\"_elem\",\"odd\",\"len\",\"j\",\"end\",\"sort\",\"splice\",\"extend\",\"options\",\"name\",\"copy\",\"copyIsArray\",\"clone\",\"target\",\"deep\",\"isPlainObject\",\"Array\",\"isArray\",\"undefined\",\"expando\",\"Math\",\"random\",\"replace\",\"isReady\",\"error\",\"msg\",\"noop\",\"proto\",\"Ctor\",\"isEmptyObject\",\"globalEval\",\"makeArray\",\"results\",\"inArray\",\"second\",\"invert\",\"matches\",\"callbackExpect\",\"arg\",\"value\",\"guid\",\"Symbol\",\"iterator\",\"split\",\"_i\",\"toLowerCase\",\"Sizzle\",\"Expr\",\"getText\",\"isXML\",\"tokenize\",\"compile\",\"select\",\"outermostContext\",\"sortInput\",\"hasDuplicate\",\"setDocument\",\"docElem\",\"documentIsHTML\",\"rbuggyQSA\",\"rbuggyMatches\",\"contains\",\"Date\",\"preferredDoc\",\"dirruns\",\"done\",\"classCache\",\"createCache\",\"tokenCache\",\"compilerCache\",\"nonnativeSelectorCache\",\"sortOrder\",\"a\",\"b\",\"pop\",\"pushNative\",\"list\",\"booleans\",\"whitespace\",\"identifier\",\"attributes\",\"pseudos\",\"rwhitespace\",\"RegExp\",\"rtrim\",\"rcomma\",\"rcombinators\",\"rdescend\",\"rpseudo\",\"ridentifier\",\"matchExpr\",\"ID\",\"CLASS\",\"TAG\",\"ATTR\",\"PSEUDO\",\"CHILD\",\"bool\",\"needsContext\",\"rhtml\",\"rinputs\",\"rheader\",\"rnative\",\"rquickExpr\",\"rsibling\",\"runescape\",\"funescape\",\"escape\",\"nonHex\",\"high\",\"String\",\"fromCharCode\",\"rcssescape\",\"fcssescape\",\"ch\",\"asCodePoint\",\"charCodeAt\",\"unloadHandler\",\"inDisabledFieldset\",\"addCombinator\",\"disabled\",\"nodeName\",\"dir\",\"next\",\"childNodes\",\"e\",\"els\",\"seed\",\"m\",\"nid\",\"match\",\"groups\",\"newSelector\",\"newContext\",\"ownerDocument\",\"exec\",\"getElementById\",\"id\",\"getElementsByTagName\",\"getElementsByClassName\",\"qsa\",\"test\",\"testContext\",\"scope\",\"toSelector\",\"join\",\"querySelectorAll\",\"qsaError\",\"removeAttribute\",\"keys\",\"cache\",\"key\",\"cacheLength\",\"shift\",\"markFunction\",\"assert\",\"el\",\"addHandle\",\"attrs\",\"handler\",\"attrHandle\",\"siblingCheck\",\"cur\",\"diff\",\"sourceIndex\",\"nextSibling\",\"createInputPseudo\",\"createButtonPseudo\",\"createDisabledPseudo\",\"isDisabled\",\"createPositionalPseudo\",\"argument\",\"matchIndexes\",\"namespace\",\"namespaceURI\",\"documentElement\",\"hasCompare\",\"subWindow\",\"defaultView\",\"top\",\"addEventListener\",\"attachEvent\",\"className\",\"createComment\",\"getById\",\"getElementsByName\",\"filter\",\"attrId\",\"find\",\"getAttributeNode\",\"tag\",\"tmp\",\"input\",\"innerHTML\",\"matchesSelector\",\"webkitMatchesSelector\",\"mozMatchesSelector\",\"oMatchesSelector\",\"msMatchesSelector\",\"disconnectedMatch\",\"compareDocumentPosition\",\"adown\",\"bup\",\"compare\",\"sortDetached\",\"aup\",\"ap\",\"bp\",\"unshift\",\"expr\",\"elements\",\"attr\",\"specified\",\"sel\",\"uniqueSort\",\"duplicates\",\"detectDuplicates\",\"sortStable\",\"textContent\",\"firstChild\",\"nodeValue\",\"selectors\",\"createPseudo\",\"relative\",\">\",\" \",\"+\",\"~\",\"preFilter\",\"excess\",\"unquoted\",\"nodeNameSelector\",\"pattern\",\"operator\",\"check\",\"result\",\"what\",\"_argument\",\"simple\",\"forward\",\"ofType\",\"_context\",\"xml\",\"uniqueCache\",\"outerCache\",\"nodeIndex\",\"start\",\"parent\",\"useCache\",\"lastChild\",\"uniqueID\",\"pseudo\",\"args\",\"setFilters\",\"idx\",\"matched\",\"not\",\"matcher\",\"unmatched\",\"has\",\"lang\",\"elemLang\",\"hash\",\"location\",\"root\",\"focus\",\"activeElement\",\"hasFocus\",\"href\",\"tabIndex\",\"enabled\",\"checked\",\"selected\",\"selectedIndex\",\"empty\",\"header\",\"button\",\"_matchIndexes\",\"lt\",\"gt\",\"radio\",\"checkbox\",\"file\",\"password\",\"image\",\"submit\",\"reset\",\"tokens\",\"combinator\",\"base\",\"skip\",\"checkNonElements\",\"doneName\",\"oldCache\",\"newCache\",\"elementMatcher\",\"matchers\",\"condense\",\"newUnmatched\",\"mapped\",\"setMatcher\",\"postFilter\",\"postFinder\",\"postSelector\",\"temp\",\"preMap\",\"postMap\",\"preexisting\",\"contexts\",\"multipleContexts\",\"matcherIn\",\"matcherOut\",\"matcherFromTokens\",\"checkContext\",\"leadingRelative\",\"implicitRelative\",\"matchContext\",\"matchAnyContext\",\"filters\",\"parseOnly\",\"soFar\",\"preFilters\",\"cached\",\"elementMatchers\",\"setMatchers\",\"bySet\",\"byElement\",\"superMatcher\",\"outermost\",\"matchedCount\",\"setMatched\",\"contextBackup\",\"dirrunsUnique\",\"token\",\"compiled\",\"_name\",\"defaultValue\",\"unique\",\"isXMLDoc\",\"escapeSelector\",\"until\",\"truncate\",\"is\",\"siblings\",\"n\",\"rneedsContext\",\"rsingleTag\",\"winnow\",\"qualifier\",\"self\",\"rootjQuery\",\"parseHTML\",\"ready\",\"rparentsprev\",\"guaranteedUnique\",\"children\",\"contents\",\"prev\",\"sibling\",\"targets\",\"l\",\"closest\",\"index\",\"prevAll\",\"add\",\"addBack\",\"parents\",\"parentsUntil\",\"nextAll\",\"nextUntil\",\"prevUntil\",\"contentDocument\",\"content\",\"reverse\",\"rnothtmlwhite\",\"Identity\",\"v\",\"Thrower\",\"ex\",\"adoptValue\",\"resolve\",\"reject\",\"noValue\",\"method\",\"promise\",\"fail\",\"then\",\"Callbacks\",\"object\",\"_\",\"flag\",\"firing\",\"memory\",\"fired\",\"locked\",\"queue\",\"firingIndex\",\"fire\",\"once\",\"stopOnFalse\",\"remove\",\"disable\",\"lock\",\"fireWith\",\"Deferred\",\"func\",\"tuples\",\"state\",\"always\",\"deferred\",\"catch\",\"pipe\",\"fns\",\"newDefer\",\"tuple\",\"returned\",\"progress\",\"notify\",\"onFulfilled\",\"onRejected\",\"onProgress\",\"maxDepth\",\"depth\",\"special\",\"that\",\"mightThrow\",\"TypeError\",\"notifyWith\",\"resolveWith\",\"process\",\"exceptionHook\",\"stackTrace\",\"rejectWith\",\"getStackHook\",\"setTimeout\",\"stateString\",\"when\",\"singleValue\",\"remaining\",\"resolveContexts\",\"resolveValues\",\"primary\",\"updateFunc\",\"rerrorNames\",\"stack\",\"console\",\"warn\",\"message\",\"readyException\",\"readyList\",\"completed\",\"removeEventListener\",\"readyWait\",\"wait\",\"readyState\",\"doScroll\",\"access\",\"chainable\",\"emptyGet\",\"raw\",\"bulk\",\"_key\",\"rmsPrefix\",\"rdashAlpha\",\"fcamelCase\",\"_all\",\"letter\",\"toUpperCase\",\"camelCase\",\"string\",\"acceptData\",\"owner\",\"Data\",\"uid\",\"defineProperty\",\"configurable\",\"set\",\"data\",\"prop\",\"hasData\",\"dataPriv\",\"dataUser\",\"rbrace\",\"rmultiDash\",\"dataAttr\",\"JSON\",\"parse\",\"removeData\",\"_data\",\"_removeData\",\"dequeue\",\"startLength\",\"hooks\",\"_queueHooks\",\"stop\",\"setter\",\"clearQueue\",\"count\",\"defer\",\"pnum\",\"source\",\"rcssNum\",\"cssExpand\",\"isAttached\",\"composed\",\"getRootNode\",\"isHiddenWithinTree\",\"style\",\"display\",\"css\",\"adjustCSS\",\"valueParts\",\"tween\",\"adjusted\",\"scale\",\"maxIterations\",\"currentValue\",\"initial\",\"unit\",\"cssNumber\",\"initialInUnit\",\"defaultDisplayMap\",\"showHide\",\"show\",\"values\",\"body\",\"hide\",\"toggle\",\"div\",\"rcheckableType\",\"rtagName\",\"rscriptType\",\"createDocumentFragment\",\"checkClone\",\"cloneNode\",\"noCloneChecked\",\"option\",\"wrapMap\",\"thead\",\"col\",\"tr\",\"td\",\"_default\",\"getAll\",\"setGlobalEval\",\"refElements\",\"tbody\",\"tfoot\",\"colgroup\",\"caption\",\"th\",\"optgroup\",\"buildFragment\",\"scripts\",\"selection\",\"ignored\",\"wrap\",\"attached\",\"fragment\",\"nodes\",\"htmlPrefilter\",\"createTextNode\",\"rtypenamespace\",\"returnTrue\",\"returnFalse\",\"expectSync\",\"err\",\"safeActiveElement\",\"on\",\"types\",\"one\",\"origFn\",\"event\",\"off\",\"leverageNative\",\"notAsync\",\"saved\",\"isTrigger\",\"delegateType\",\"stopPropagation\",\"stopImmediatePropagation\",\"preventDefault\",\"trigger\",\"Event\",\"handleObjIn\",\"eventHandle\",\"events\",\"t\",\"handleObj\",\"handlers\",\"namespaces\",\"origType\",\"elemData\",\"create\",\"handle\",\"triggered\",\"dispatch\",\"bindType\",\"delegateCount\",\"setup\",\"mappedTypes\",\"origCount\",\"teardown\",\"removeEvent\",\"nativeEvent\",\"handlerQueue\",\"fix\",\"delegateTarget\",\"preDispatch\",\"isPropagationStopped\",\"currentTarget\",\"isImmediatePropagationStopped\",\"rnamespace\",\"postDispatch\",\"matchedHandlers\",\"matchedSelectors\",\"addProp\",\"hook\",\"enumerable\",\"originalEvent\",\"writable\",\"load\",\"noBubble\",\"click\",\"beforeunload\",\"returnValue\",\"props\",\"isDefaultPrevented\",\"defaultPrevented\",\"relatedTarget\",\"timeStamp\",\"now\",\"isSimulated\",\"altKey\",\"bubbles\",\"cancelable\",\"changedTouches\",\"ctrlKey\",\"detail\",\"eventPhase\",\"metaKey\",\"pageX\",\"pageY\",\"shiftKey\",\"view\",\"char\",\"charCode\",\"keyCode\",\"buttons\",\"clientX\",\"clientY\",\"offsetX\",\"offsetY\",\"pointerId\",\"pointerType\",\"screenX\",\"screenY\",\"targetTouches\",\"toElement\",\"touches\",\"which\",\"blur\",\"mouseenter\",\"mouseleave\",\"pointerenter\",\"pointerleave\",\"orig\",\"related\",\"rnoInnerhtml\",\"rchecked\",\"rcleanScript\",\"manipulationTarget\",\"disableScript\",\"restoreScript\",\"cloneCopyEvent\",\"dest\",\"udataOld\",\"udataCur\",\"domManip\",\"collection\",\"hasScripts\",\"iNoClone\",\"valueIsFunction\",\"html\",\"_evalUrl\",\"keepData\",\"cleanData\",\"dataAndEvents\",\"deepDataAndEvents\",\"srcElements\",\"destElements\",\"inPage\",\"detach\",\"append\",\"prepend\",\"insertBefore\",\"before\",\"after\",\"replaceWith\",\"replaceChild\",\"appendTo\",\"prependTo\",\"insertAfter\",\"replaceAll\",\"original\",\"insert\",\"rnumnonpx\",\"getStyles\",\"opener\",\"getComputedStyle\",\"swap\",\"old\",\"rboxStyle\",\"curCSS\",\"computed\",\"width\",\"minWidth\",\"maxWidth\",\"getPropertyValue\",\"pixelBoxStyles\",\"addGetHookIf\",\"conditionFn\",\"hookFn\",\"computeStyleTests\",\"container\",\"cssText\",\"divStyle\",\"pixelPositionVal\",\"reliableMarginLeftVal\",\"roundPixelMeasures\",\"marginLeft\",\"right\",\"pixelBoxStylesVal\",\"boxSizingReliableVal\",\"position\",\"scrollboxSizeVal\",\"offsetWidth\",\"measure\",\"round\",\"parseFloat\",\"reliableTrDimensionsVal\",\"backgroundClip\",\"clearCloneStyle\",\"boxSizingReliable\",\"pixelPosition\",\"reliableMarginLeft\",\"scrollboxSize\",\"reliableTrDimensions\",\"table\",\"trChild\",\"trStyle\",\"height\",\"parseInt\",\"borderTopWidth\",\"borderBottomWidth\",\"offsetHeight\",\"cssPrefixes\",\"emptyStyle\",\"vendorProps\",\"finalPropName\",\"final\",\"cssProps\",\"capName\",\"vendorPropName\",\"rdisplayswap\",\"rcustomProp\",\"cssShow\",\"visibility\",\"cssNormalTransform\",\"letterSpacing\",\"fontWeight\",\"setPositiveNumber\",\"subtract\",\"max\",\"boxModelAdjustment\",\"dimension\",\"box\",\"isBorderBox\",\"styles\",\"computedVal\",\"extra\",\"delta\",\"ceil\",\"getWidthOrHeight\",\"valueIsBorderBox\",\"offsetProp\",\"getClientRects\",\"Tween\",\"easing\",\"cssHooks\",\"opacity\",\"animationIterationCount\",\"columnCount\",\"fillOpacity\",\"flexGrow\",\"flexShrink\",\"gridArea\",\"gridColumn\",\"gridColumnEnd\",\"gridColumnStart\",\"gridRow\",\"gridRowEnd\",\"gridRowStart\",\"lineHeight\",\"order\",\"orphans\",\"widows\",\"zIndex\",\"zoom\",\"origName\",\"isCustomProp\",\"setProperty\",\"isFinite\",\"getBoundingClientRect\",\"scrollboxSizeBuggy\",\"left\",\"margin\",\"padding\",\"border\",\"prefix\",\"suffix\",\"expand\",\"expanded\",\"parts\",\"propHooks\",\"run\",\"percent\",\"eased\",\"duration\",\"pos\",\"step\",\"fx\",\"scrollTop\",\"scrollLeft\",\"linear\",\"p\",\"swing\",\"cos\",\"PI\",\"fxNow\",\"inProgress\",\"opt\",\"rfxtypes\",\"rrun\",\"schedule\",\"hidden\",\"requestAnimationFrame\",\"interval\",\"tick\",\"createFxNow\",\"genFx\",\"includeWidth\",\"createTween\",\"animation\",\"Animation\",\"tweeners\",\"properties\",\"stopped\",\"prefilters\",\"currentTime\",\"startTime\",\"tweens\",\"opts\",\"specialEasing\",\"originalProperties\",\"originalOptions\",\"gotoEnd\",\"propFilter\",\"bind\",\"complete\",\"timer\",\"anim\",\"*\",\"tweener\",\"oldfire\",\"propTween\",\"restoreDisplay\",\"isBox\",\"dataShow\",\"unqueued\",\"overflow\",\"overflowX\",\"overflowY\",\"prefilter\",\"speed\",\"speeds\",\"fadeTo\",\"to\",\"animate\",\"optall\",\"doAnimation\",\"finish\",\"stopQueue\",\"timers\",\"cssFn\",\"slideDown\",\"slideUp\",\"slideToggle\",\"fadeIn\",\"fadeOut\",\"fadeToggle\",\"slow\",\"fast\",\"delay\",\"time\",\"timeout\",\"clearTimeout\",\"checkOn\",\"optSelected\",\"radioValue\",\"boolHook\",\"removeAttr\",\"nType\",\"attrHooks\",\"attrNames\",\"getter\",\"lowercaseName\",\"rfocusable\",\"rclickable\",\"stripAndCollapse\",\"getClass\",\"classesToArray\",\"removeProp\",\"propFix\",\"tabindex\",\"for\",\"class\",\"addClass\",\"classes\",\"curValue\",\"clazz\",\"finalValue\",\"removeClass\",\"toggleClass\",\"stateVal\",\"isValidValue\",\"classNames\",\"hasClass\",\"rreturn\",\"valHooks\",\"optionSet\",\"focusin\",\"rfocusMorph\",\"stopPropagationCallback\",\"onlyHandlers\",\"bubbleType\",\"ontype\",\"lastElement\",\"eventPath\",\"parentWindow\",\"simulate\",\"triggerHandler\",\"attaches\",\"rquery\",\"parseXML\",\"parserErrorElem\",\"DOMParser\",\"parseFromString\",\"rbracket\",\"rCRLF\",\"rsubmitterTypes\",\"rsubmittable\",\"buildParams\",\"traditional\",\"param\",\"s\",\"valueOrFunction\",\"encodeURIComponent\",\"serialize\",\"serializeArray\",\"r20\",\"rhash\",\"rantiCache\",\"rheaders\",\"rnoContent\",\"rprotocol\",\"transports\",\"allTypes\",\"originAnchor\",\"addToPrefiltersOrTransports\",\"structure\",\"dataTypeExpression\",\"dataType\",\"dataTypes\",\"inspectPrefiltersOrTransports\",\"jqXHR\",\"inspected\",\"seekingTransport\",\"inspect\",\"prefilterOrFactory\",\"dataTypeOrTransport\",\"ajaxExtend\",\"flatOptions\",\"ajaxSettings\",\"active\",\"lastModified\",\"etag\",\"url\",\"isLocal\",\"protocol\",\"processData\",\"async\",\"contentType\",\"accepts\",\"json\",\"responseFields\",\"converters\",\"* text\",\"text html\",\"text json\",\"text xml\",\"ajaxSetup\",\"settings\",\"ajaxPrefilter\",\"ajaxTransport\",\"ajax\",\"transport\",\"cacheURL\",\"responseHeadersString\",\"responseHeaders\",\"timeoutTimer\",\"urlAnchor\",\"fireGlobals\",\"uncached\",\"callbackContext\",\"globalEventContext\",\"completeDeferred\",\"statusCode\",\"requestHeaders\",\"requestHeadersNames\",\"strAbort\",\"getResponseHeader\",\"getAllResponseHeaders\",\"setRequestHeader\",\"overrideMimeType\",\"mimeType\",\"status\",\"abort\",\"statusText\",\"finalText\",\"crossDomain\",\"host\",\"hasContent\",\"ifModified\",\"headers\",\"beforeSend\",\"success\",\"send\",\"nativeStatusText\",\"responses\",\"isSuccess\",\"response\",\"modified\",\"ct\",\"finalDataType\",\"firstDataType\",\"ajaxHandleResponses\",\"conv2\",\"current\",\"conv\",\"dataFilter\",\"throws\",\"ajaxConvert\",\"getJSON\",\"getScript\",\"text script\",\"wrapAll\",\"firstElementChild\",\"wrapInner\",\"htmlIsFunction\",\"unwrap\",\"visible\",\"xhr\",\"XMLHttpRequest\",\"xhrSuccessStatus\",\"0\",\"1223\",\"xhrSupported\",\"cors\",\"errorCallback\",\"open\",\"username\",\"xhrFields\",\"onload\",\"onerror\",\"onabort\",\"ontimeout\",\"onreadystatechange\",\"responseType\",\"responseText\",\"binary\",\"scriptAttrs\",\"charset\",\"scriptCharset\",\"evt\",\"oldCallbacks\",\"rjsonp\",\"jsonp\",\"jsonpCallback\",\"originalSettings\",\"callbackName\",\"overwritten\",\"responseContainer\",\"jsonProp\",\"createHTMLDocument\",\"implementation\",\"keepScripts\",\"parsed\",\"params\",\"animated\",\"offset\",\"setOffset\",\"curPosition\",\"curLeft\",\"curCSSTop\",\"curTop\",\"curOffset\",\"curCSSLeft\",\"curElem\",\"using\",\"rect\",\"win\",\"pageYOffset\",\"pageXOffset\",\"offsetParent\",\"parentOffset\",\"scrollTo\",\"Height\",\"Width\",\"\",\"defaultExtra\",\"funcName\",\"unbind\",\"delegate\",\"undelegate\",\"hover\",\"fnOver\",\"fnOut\",\"proxy\",\"holdReady\",\"hold\",\"parseJSON\",\"isNumeric\",\"isNaN\",\"trim\",\"define\",\"amd\",\"_jQuery\",\"_$\",\"$\",\"noConflict\"],\"mappings\":\"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\",\"file\":\"jquery-3.6.0.min.js\"}"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/jquery-validation/custom.validate.js",
    "content": "/**\n * Created by fenghao1 on 2016/6/18.\n */\n$(function(){\n    function checkId(id) {\n        if(typeof id !== 'string') return {code:false,msg:'非字符串'};\n        var province = {11:\"北京\",12:\"天津\",13:\"河北\",14:\"山西\",15:\"内蒙古\",21:\"辽宁\",22:\"吉林\",23:\"黑龙江 \",31:\"上海\",32:\"江苏\",33:\"浙江\",34:\"安徽\",35:\"福建\",36:\"江西\",37:\"山东\",41:\"河南\",42:\"湖北 \",43:\"湖南\",44:\"广东\",45:\"广西\",46:\"海南\",50:\"重庆\",51:\"四川\",52:\"贵州\",53:\"云南\",54:\"西藏 \",61:\"陕西\",62:\"甘肃\",63:\"青海\",64:\"宁夏\",65:\"新疆\",71:\"台湾\",81:\"香港\",82:\"澳门\",91:\"国外\"};\n        var birthday = id.substr(6, 4) + '/' + Number(id.substr(10, 2)) + '/' + Number(id.substr(12, 2));\n        var d = new Date(birthday);\n        var newBirthday = d.getFullYear() + '/' + Number(d.getMonth() + 1) + '/' + Number(d.getDate());\n        var currentTime = new Date().getTime();\n        var time = d.getTime();\n        var arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];\n        var arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];\n        var sum = 0, i, residue;\n\n        if(!/^\\d{17}(\\d|x)$/i.test(id)) return {code:false,msg:'非法身份证'};\n        if(province[id.substr(0,2)] === undefined) return {code:false,msg:'非法地区'};\n        if(time >= currentTime || birthday !== newBirthday) return {code:false,msg:'非法生日'};\n        for(i=0; i<17; i++) {\n            sum += id.substr(i, 1) * arrInt[i];\n        }\n        residue = arrCh[sum % 11];\n        if (residue !== id.substr(17, 1)) return {code:false,msg:'非法身份证哦'};\n\n        return {code:true, msg:'身份证正确'};\n    }\n\n    $.validator.addMethod(\"valid16Code\", function(value, element) {\n        return this.optional(element) || /^[A-Za-z0-9\\-_\\u4E00-\\u9FA5]{1,16}$/.test(value);\n    }, \"只能包括中文、英文、数字、横线和下划线，最大长度16个字符\");\n    $.validator.addMethod(\"valid32Code\", function(value, element) {\n        return this.optional(element) || /^[A-Za-z0-9\\-_\\u4E00-\\u9FA5]{1,32}$/.test(value);\n    }, \"只能包括中文、英文、数字、横线和下划线，最大长度32个字符\");\n    $.validator.addMethod(\"valid64Desc\", function(value, element) {\n        return this.optional(element) || /^[A-Za-z0-9\\-_\\u4E00-\\u9FA5]{1,64}$/.test(value);\n    }, \"只能包括中文、英文、数字、横线和下划线，最大长度64个字符\");\n    $.validator.addMethod(\"valid128Desc\", function(value, element) {\n        return this.optional(element) || /^[A-Za-z0-9\\-_\\u4E00-\\u9FA5]{1,128}$/.test(value);\n    }, \"只能包括中文、英文、数字、横线和下划线，最大长度128个字符\");\n    $.validator.addMethod(\"valid\", function(value, element, params) {\n        var reg = new RegExp('^[A-Za-z0-9\\-_\\u4E00-\\u9FA5]{1,' + params + '}$');\n        return this.optional(element) || reg.test(value);\n    }, \"只能包括中文、英文、数字、横线和下划线，最大长度 {0} 个字符\");\n    $.validator.addMethod(\"minVal\", function(value, element, params) {\n        return this.optional(element) || value > params;\n    }, \"请输入大于 {0} 的数值\");\n    $.validator.addMethod(\"validPhone\", function(value, element) {\n        return this.optional(element) || /^1\\d{10}$/.test(value);\n    }, \"请输入合法的手机号码\");\n    $.validator.addMethod(\"validId\", function(value, element) {\n        var result = checkId(value);\n        return this.optional(element) || result.code;\n    }, \"请输入合法的身份证号码\");\n    $.validator.addMethod(\"notEqualsTo\", function(value, element, params) {\n        var otherVal = $(params[0]).val();\n        return this.optional(element) || otherVal != value;\n    }, \"不能和{1}相同\");\n    $.validator.addMethod(\"rangeRate\", function(value, element, params) {\n        var min = +($(params[0]).data('minRate'));\n        var max = +($(params[0]).data('maxRate'));\n        return this.optional(element) || value >= min && value <= max;\n    }, \"填写的利率不在范围内\");\n});\n"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/jquery-validation/jquery.validate.js",
    "content": "/*!\n * jQuery Validation Plugin v1.15.1\n *\n * http://jqueryvalidation.org/\n *\n * Copyright (c) 2016 Jörn Zaefferer\n * Released under the MIT license\n */\n(function( factory ) {\n\tif ( typeof define === \"function\" && define.amd ) {\n\t\tdefine( [\"jquery\"], factory );\n\t} else if (typeof module === \"object\" && module.exports) {\n\t\tmodule.exports = factory( require( \"jquery\" ) );\n\t} else {\n\t\tfactory( jQuery );\n\t}\n}(function( $ ) {\n\n$.extend( $.fn, {\n\n\t// http://jqueryvalidation.org/validate/\n\tvalidate: function( options ) {\n\n\t\t// If nothing is selected, return nothing; can't chain anyway\n\t\tif ( !this.length ) {\n\t\t\tif ( options && options.debug && window.console ) {\n\t\t\t\tconsole.warn( \"Nothing selected, can't validate, returning nothing.\" );\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Check if a validator for this form was already created\n\t\tvar validator = $.data( this[ 0 ], \"validator\" );\n\t\tif ( validator ) {\n\t\t\treturn validator;\n\t\t}\n\n\t\t// Add novalidate tag if HTML5.\n\t\tthis.attr( \"novalidate\", \"novalidate\" );\n\n\t\tvalidator = new $.validator( options, this[ 0 ] );\n\t\t$.data( this[ 0 ], \"validator\", validator );\n\n\t\tif ( validator.settings.onsubmit ) {\n\n\t\t\tthis.on( \"click.validate\", \":submit\", function( event ) {\n\t\t\t\tif ( validator.settings.submitHandler ) {\n\t\t\t\t\tvalidator.submitButton = event.target;\n\t\t\t\t}\n\n\t\t\t\t// Allow suppressing validation by adding a cancel class to the submit button\n\t\t\t\tif ( $( this ).hasClass( \"cancel\" ) ) {\n\t\t\t\t\tvalidator.cancelSubmit = true;\n\t\t\t\t}\n\n\t\t\t\t// Allow suppressing validation by adding the html5 formnovalidate attribute to the submit button\n\t\t\t\tif ( $( this ).attr( \"formnovalidate\" ) !== undefined ) {\n\t\t\t\t\tvalidator.cancelSubmit = true;\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Validate the form on submit\n\t\t\tthis.on( \"submit.validate\", function( event ) {\n\t\t\t\tif ( validator.settings.debug ) {\n\n\t\t\t\t\t// Prevent form submit to be able to see console output\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t\tfunction handle() {\n\t\t\t\t\tvar hidden, result;\n\t\t\t\t\tif ( validator.settings.submitHandler ) {\n\t\t\t\t\t\tif ( validator.submitButton ) {\n\n\t\t\t\t\t\t\t// Insert a hidden input as a replacement for the missing submit button\n\t\t\t\t\t\t\thidden = $( \"<input type='hidden'/>\" )\n\t\t\t\t\t\t\t\t.attr( \"name\", validator.submitButton.name )\n\t\t\t\t\t\t\t\t.val( $( validator.submitButton ).val() )\n\t\t\t\t\t\t\t\t.appendTo( validator.currentForm );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresult = validator.settings.submitHandler.call( validator, validator.currentForm, event );\n\t\t\t\t\t\tif ( validator.submitButton ) {\n\n\t\t\t\t\t\t\t// And clean up afterwards; thanks to no-block-scope, hidden can be referenced\n\t\t\t\t\t\t\thidden.remove();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( result !== undefined ) {\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\t// Prevent submit for invalid forms or custom submit handlers\n\t\t\t\tif ( validator.cancelSubmit ) {\n\t\t\t\t\tvalidator.cancelSubmit = false;\n\t\t\t\t\treturn handle();\n\t\t\t\t}\n\t\t\t\tif ( validator.form() ) {\n\t\t\t\t\tif ( validator.pendingRequest ) {\n\t\t\t\t\t\tvalidator.formSubmitted = true;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn handle();\n\t\t\t\t} else {\n\t\t\t\t\tvalidator.focusInvalid();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn validator;\n\t},\n\n\t// http://jqueryvalidation.org/valid/\n\tvalid: function() {\n\t\tvar valid, validator, errorList;\n\n\t\tif ( $( this[ 0 ] ).is( \"form\" ) ) {\n\t\t\tvalid = this.validate().form();\n\t\t} else {\n\t\t\terrorList = [];\n\t\t\tvalid = true;\n\t\t\tvalidator = $( this[ 0 ].form ).validate();\n\t\t\tthis.each( function() {\n\t\t\t\tvalid = validator.element( this ) && valid;\n\t\t\t\tif ( !valid ) {\n\t\t\t\t\terrorList = errorList.concat( validator.errorList );\n\t\t\t\t}\n\t\t\t} );\n\t\t\tvalidator.errorList = errorList;\n\t\t}\n\t\treturn valid;\n\t},\n\n\t// http://jqueryvalidation.org/rules/\n\trules: function( command, argument ) {\n\t\tvar element = this[ 0 ],\n\t\t\tsettings, staticRules, existingRules, data, param, filtered;\n\n\t\t// If nothing is selected, return empty object; can't chain anyway\n\t\tif ( element == null || element.form == null ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( command ) {\n\t\t\tsettings = $.data( element.form, \"validator\" ).settings;\n\t\t\tstaticRules = settings.rules;\n\t\t\texistingRules = $.validator.staticRules( element );\n\t\t\tswitch ( command ) {\n\t\t\tcase \"add\":\n\t\t\t\t$.extend( existingRules, $.validator.normalizeRule( argument ) );\n\n\t\t\t\t// Remove messages from rules, but allow them to be set separately\n\t\t\t\tdelete existingRules.messages;\n\t\t\t\tstaticRules[ element.name ] = existingRules;\n\t\t\t\tif ( argument.messages ) {\n\t\t\t\t\tsettings.messages[ element.name ] = $.extend( settings.messages[ element.name ], argument.messages );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"remove\":\n\t\t\t\tif ( !argument ) {\n\t\t\t\t\tdelete staticRules[ element.name ];\n\t\t\t\t\treturn existingRules;\n\t\t\t\t}\n\t\t\t\tfiltered = {};\n\t\t\t\t$.each( argument.split( /\\s/ ), function( index, method ) {\n\t\t\t\t\tfiltered[ method ] = existingRules[ method ];\n\t\t\t\t\tdelete existingRules[ method ];\n\t\t\t\t\tif ( method === \"required\" ) {\n\t\t\t\t\t\t$( element ).removeAttr( \"aria-required\" );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn filtered;\n\t\t\t}\n\t\t}\n\n\t\tdata = $.validator.normalizeRules(\n\t\t$.extend(\n\t\t\t{},\n\t\t\t$.validator.classRules( element ),\n\t\t\t$.validator.attributeRules( element ),\n\t\t\t$.validator.dataRules( element ),\n\t\t\t$.validator.staticRules( element )\n\t\t), element );\n\n\t\t// Make sure required is at front\n\t\tif ( data.required ) {\n\t\t\tparam = data.required;\n\t\t\tdelete data.required;\n\t\t\tdata = $.extend( { required: param }, data );\n\t\t\t$( element ).attr( \"aria-required\", \"true\" );\n\t\t}\n\n\t\t// Make sure remote is at back\n\t\tif ( data.remote ) {\n\t\t\tparam = data.remote;\n\t\t\tdelete data.remote;\n\t\t\tdata = $.extend( data, { remote: param } );\n\t\t}\n\n\t\treturn data;\n\t}\n} );\n\n// Custom selectors\n$.extend( $.expr[ \":\" ], {\n\n\t// http://jqueryvalidation.org/blank-selector/\n\tblank: function( a ) {\n\t\treturn !$.trim( \"\" + $( a ).val() );\n\t},\n\n\t// http://jqueryvalidation.org/filled-selector/\n\tfilled: function( a ) {\n\t\tvar val = $( a ).val();\n\t\treturn val !== null && !!$.trim( \"\" + val );\n\t},\n\n\t// http://jqueryvalidation.org/unchecked-selector/\n\tunchecked: function( a ) {\n\t\treturn !$( a ).prop( \"checked\" );\n\t}\n} );\n\n// Constructor for validator\n$.validator = function( options, form ) {\n\tthis.settings = $.extend( true, {}, $.validator.defaults, options );\n\tthis.currentForm = form;\n\tthis.init();\n};\n\n// http://jqueryvalidation.org/jQuery.validator.format/\n$.validator.format = function( source, params ) {\n\tif ( arguments.length === 1 ) {\n\t\treturn function() {\n\t\t\tvar args = $.makeArray( arguments );\n\t\t\targs.unshift( source );\n\t\t\treturn $.validator.format.apply( this, args );\n\t\t};\n\t}\n\tif ( params === undefined ) {\n\t\treturn source;\n\t}\n\tif ( arguments.length > 2 && params.constructor !== Array  ) {\n\t\tparams = $.makeArray( arguments ).slice( 1 );\n\t}\n\tif ( params.constructor !== Array ) {\n\t\tparams = [ params ];\n\t}\n\t$.each( params, function( i, n ) {\n\t\tsource = source.replace( new RegExp( \"\\\\{\" + i + \"\\\\}\", \"g\" ), function() {\n\t\t\treturn n;\n\t\t} );\n\t} );\n\treturn source;\n};\n\n$.extend( $.validator, {\n\n\tdefaults: {\n\t\tmessages: {},\n\t\tgroups: {},\n\t\trules: {},\n\t\terrorClass: \"error\",\n\t\tpendingClass: \"pending\",\n\t\tvalidClass: \"valid\",\n\t\terrorElement: \"label\",\n\t\tfocusCleanup: false,\n\t\tfocusInvalid: true,\n\t\terrorContainer: $( [] ),\n\t\terrorLabelContainer: $( [] ),\n\t\tonsubmit: true,\n\t\tignore: \":hidden\",\n\t\tignoreTitle: false,\n\t\tonfocusin: function( element ) {\n\t\t\tthis.lastActive = element;\n\n\t\t\t// Hide error label and remove error class on focus if enabled\n\t\t\tif ( this.settings.focusCleanup ) {\n\t\t\t\tif ( this.settings.unhighlight ) {\n\t\t\t\t\tthis.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );\n\t\t\t\t}\n\t\t\t\tthis.hideThese( this.errorsFor( element ) );\n\t\t\t}\n\t\t},\n\t\tonfocusout: function( element ) {\n\t\t\tif ( !this.checkable( element ) && ( element.name in this.submitted || !this.optional( element ) ) ) {\n\t\t\t\tthis.element( element );\n\t\t\t}\n\t\t},\n\t\tonkeyup: function( element, event ) {\n\n\t\t\t// Avoid revalidate the field when pressing one of the following keys\n\t\t\t// Shift       => 16\n\t\t\t// Ctrl        => 17\n\t\t\t// Alt         => 18\n\t\t\t// Caps lock   => 20\n\t\t\t// End         => 35\n\t\t\t// Home        => 36\n\t\t\t// Left arrow  => 37\n\t\t\t// Up arrow    => 38\n\t\t\t// Right arrow => 39\n\t\t\t// Down arrow  => 40\n\t\t\t// Insert      => 45\n\t\t\t// Num lock    => 144\n\t\t\t// AltGr key   => 225\n\t\t\tvar excludedKeys = [\n\t\t\t\t16, 17, 18, 20, 35, 36, 37,\n\t\t\t\t38, 39, 40, 45, 144, 225\n\t\t\t];\n\n\t\t\tif ( event.which === 9 && this.elementValue( element ) === \"\" || $.inArray( event.keyCode, excludedKeys ) !== -1 ) {\n\t\t\t\treturn;\n\t\t\t} else if ( element.name in this.submitted || element.name in this.invalid ) {\n\t\t\t\tthis.element( element );\n\t\t\t}\n\t\t},\n\t\tonclick: function( element ) {\n\n\t\t\t// Click on selects, radiobuttons and checkboxes\n\t\t\tif ( element.name in this.submitted ) {\n\t\t\t\tthis.element( element );\n\n\t\t\t// Or option elements, check parent select in that case\n\t\t\t} else if ( element.parentNode.name in this.submitted ) {\n\t\t\t\tthis.element( element.parentNode );\n\t\t\t}\n\t\t},\n\t\thighlight: function( element, errorClass, validClass ) {\n\t\t\tif ( element.type === \"radio\" ) {\n\t\t\t\tthis.findByName( element.name ).addClass( errorClass ).removeClass( validClass );\n\t\t\t} else {\n\t\t\t\t$( element ).addClass( errorClass ).removeClass( validClass );\n\t\t\t}\n\t\t},\n\t\tunhighlight: function( element, errorClass, validClass ) {\n\t\t\tif ( element.type === \"radio\" ) {\n\t\t\t\tthis.findByName( element.name ).removeClass( errorClass ).addClass( validClass );\n\t\t\t} else {\n\t\t\t\t$( element ).removeClass( errorClass ).addClass( validClass );\n\t\t\t}\n\t\t}\n\t},\n\n\t// http://jqueryvalidation.org/jQuery.validator.setDefaults/\n\tsetDefaults: function( settings ) {\n\t\t$.extend( $.validator.defaults, settings );\n\t},\n\n\tmessages: {\n\t\trequired: \"This field is required.\",\n\t\tremote: \"Please fix this field.\",\n\t\temail: \"Please enter a valid email address.\",\n\t\turl: \"Please enter a valid URL.\",\n\t\tdate: \"Please enter a valid date.\",\n\t\tdateISO: \"Please enter a valid date (ISO).\",\n\t\tnumber: \"Please enter a valid number.\",\n\t\tdigits: \"Please enter only digits.\",\n\t\tequalTo: \"Please enter the same value again.\",\n\t\tmaxlength: $.validator.format( \"Please enter no more than {0} characters.\" ),\n\t\tminlength: $.validator.format( \"Please enter at least {0} characters.\" ),\n\t\trangelength: $.validator.format( \"Please enter a value between {0} and {1} characters long.\" ),\n\t\trange: $.validator.format( \"Please enter a value between {0} and {1}.\" ),\n\t\tmax: $.validator.format( \"Please enter a value less than or equal to {0}.\" ),\n\t\tmin: $.validator.format( \"Please enter a value greater than or equal to {0}.\" ),\n\t\tstep: $.validator.format( \"Please enter a multiple of {0}.\" )\n\t},\n\n\tautoCreateRanges: false,\n\n\tprototype: {\n\n\t\tinit: function() {\n\t\t\tthis.labelContainer = $( this.settings.errorLabelContainer );\n\t\t\tthis.errorContext = this.labelContainer.length && this.labelContainer || $( this.currentForm );\n\t\t\tthis.containers = $( this.settings.errorContainer ).add( this.settings.errorLabelContainer );\n\t\t\tthis.submitted = {};\n\t\t\tthis.valueCache = {};\n\t\t\tthis.pendingRequest = 0;\n\t\t\tthis.pending = {};\n\t\t\tthis.invalid = {};\n\t\t\tthis.reset();\n\n\t\t\tvar groups = ( this.groups = {} ),\n\t\t\t\trules;\n\t\t\t$.each( this.settings.groups, function( key, value ) {\n\t\t\t\tif ( typeof value === \"string\" ) {\n\t\t\t\t\tvalue = value.split( /\\s/ );\n\t\t\t\t}\n\t\t\t\t$.each( value, function( index, name ) {\n\t\t\t\t\tgroups[ name ] = key;\n\t\t\t\t} );\n\t\t\t} );\n\t\t\trules = this.settings.rules;\n\t\t\t$.each( rules, function( key, value ) {\n\t\t\t\trules[ key ] = $.validator.normalizeRule( value );\n\t\t\t} );\n\n\t\t\tfunction delegate( event ) {\n\n\t\t\t\t// Set form expando on contenteditable\n\t\t\t\tif ( !this.form && this.hasAttribute( \"contenteditable\" ) ) {\n\t\t\t\t\tthis.form = $( this ).closest( \"form\" )[ 0 ];\n\t\t\t\t}\n\n\t\t\t\tvar validator = $.data( this.form, \"validator\" ),\n\t\t\t\t\teventType = \"on\" + event.type.replace( /^validate/, \"\" ),\n\t\t\t\t\tsettings = validator.settings;\n\t\t\t\tif ( settings[ eventType ] && !$( this ).is( settings.ignore ) ) {\n\t\t\t\t\tsettings[ eventType ].call( validator, this, event );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$( this.currentForm )\n\t\t\t\t.on( \"focusin.validate focusout.validate keyup.validate\",\n\t\t\t\t\t\":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], \" +\n\t\t\t\t\t\"[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], \" +\n\t\t\t\t\t\"[type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], \" +\n\t\t\t\t\t\"[type='radio'], [type='checkbox'], [contenteditable]\", delegate )\n\n\t\t\t\t// Support: Chrome, oldIE\n\t\t\t\t// \"select\" is provided as event.target when clicking a option\n\t\t\t\t.on( \"click.validate\", \"select, option, [type='radio'], [type='checkbox']\", delegate );\n\n\t\t\tif ( this.settings.invalidHandler ) {\n\t\t\t\t$( this.currentForm ).on( \"invalid-form.validate\", this.settings.invalidHandler );\n\t\t\t}\n\n\t\t\t// Add aria-required to any Static/Data/Class required fields before first validation\n\t\t\t// Screen readers require this attribute to be present before the initial submission http://www.w3.org/TR/WCAG-TECHS/ARIA2.html\n\t\t\t$( this.currentForm ).find( \"[required], [data-rule-required], .required\" ).attr( \"aria-required\", \"true\" );\n\t\t},\n\n\t\t// http://jqueryvalidation.org/Validator.form/\n\t\tform: function() {\n\t\t\tthis.checkForm();\n\t\t\t$.extend( this.submitted, this.errorMap );\n\t\t\tthis.invalid = $.extend( {}, this.errorMap );\n\t\t\tif ( !this.valid() ) {\n\t\t\t\t$( this.currentForm ).triggerHandler( \"invalid-form\", [ this ] );\n\t\t\t}\n\t\t\tthis.showErrors();\n\t\t\treturn this.valid();\n\t\t},\n\n\t\tcheckForm: function() {\n\t\t\tthis.prepareForm();\n\t\t\tfor ( var i = 0, elements = ( this.currentElements = this.elements() ); elements[ i ]; i++ ) {\n\t\t\t\tthis.check( elements[ i ] );\n\t\t\t}\n\t\t\treturn this.valid();\n\t\t},\n\n\t\t// http://jqueryvalidation.org/Validator.element/\n\t\telement: function( element ) {\n\t\t\tvar cleanElement = this.clean( element ),\n\t\t\t\tcheckElement = this.validationTargetFor( cleanElement ),\n\t\t\t\tv = this,\n\t\t\t\tresult = true,\n\t\t\t\trs, group;\n\n\t\t\tif ( checkElement === undefined ) {\n\t\t\t\tdelete this.invalid[ cleanElement.name ];\n\t\t\t} else {\n\t\t\t\tthis.prepareElement( checkElement );\n\t\t\t\tthis.currentElements = $( checkElement );\n\n\t\t\t\t// If this element is grouped, then validate all group elements already\n\t\t\t\t// containing a value\n\t\t\t\tgroup = this.groups[ checkElement.name ];\n\t\t\t\tif ( group ) {\n\t\t\t\t\t$.each( this.groups, function( name, testgroup ) {\n\t\t\t\t\t\tif ( testgroup === group && name !== checkElement.name ) {\n\t\t\t\t\t\t\tcleanElement = v.validationTargetFor( v.clean( v.findByName( name ) ) );\n\t\t\t\t\t\t\tif ( cleanElement && cleanElement.name in v.invalid ) {\n\t\t\t\t\t\t\t\tv.currentElements.push( cleanElement );\n\t\t\t\t\t\t\t\tresult = v.check( cleanElement ) && result;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\trs = this.check( checkElement ) !== false;\n\t\t\t\tresult = result && rs;\n\t\t\t\tif ( rs ) {\n\t\t\t\t\tthis.invalid[ checkElement.name ] = false;\n\t\t\t\t} else {\n\t\t\t\t\tthis.invalid[ checkElement.name ] = true;\n\t\t\t\t}\n\n\t\t\t\tif ( !this.numberOfInvalids() ) {\n\n\t\t\t\t\t// Hide error containers on last error\n\t\t\t\t\tthis.toHide = this.toHide.add( this.containers );\n\t\t\t\t}\n\t\t\t\tthis.showErrors();\n\n\t\t\t\t// Add aria-invalid status for screen readers\n\t\t\t\t$( element ).attr( \"aria-invalid\", !rs );\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\n\t\t// http://jqueryvalidation.org/Validator.showErrors/\n\t\tshowErrors: function( errors ) {\n\t\t\tif ( errors ) {\n\t\t\t\tvar validator = this;\n\n\t\t\t\t// Add items to error list and map\n\t\t\t\t$.extend( this.errorMap, errors );\n\t\t\t\tthis.errorList = $.map( this.errorMap, function( message, name ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tmessage: message,\n\t\t\t\t\t\telement: validator.findByName( name )[ 0 ]\n\t\t\t\t\t};\n\t\t\t\t} );\n\n\t\t\t\t// Remove items from success list\n\t\t\t\tthis.successList = $.grep( this.successList, function( element ) {\n\t\t\t\t\treturn !( element.name in errors );\n\t\t\t\t} );\n\t\t\t}\n\t\t\tif ( this.settings.showErrors ) {\n\t\t\t\tthis.settings.showErrors.call( this, this.errorMap, this.errorList );\n\t\t\t} else {\n\t\t\t\tthis.defaultShowErrors();\n\t\t\t}\n\t\t},\n\n\t\t// http://jqueryvalidation.org/Validator.resetForm/\n\t\tresetForm: function() {\n\t\t\tif ( $.fn.resetForm ) {\n\t\t\t\t$( this.currentForm ).resetForm();\n\t\t\t}\n\t\t\tthis.invalid = {};\n\t\t\tthis.submitted = {};\n\t\t\tthis.prepareForm();\n\t\t\tthis.hideErrors();\n\t\t\tvar elements = this.elements()\n\t\t\t\t.removeData( \"previousValue\" )\n\t\t\t\t.removeAttr( \"aria-invalid\" );\n\n\t\t\tthis.resetElements( elements );\n\t\t},\n\n\t\tresetElements: function( elements ) {\n\t\t\tvar i;\n\n\t\t\tif ( this.settings.unhighlight ) {\n\t\t\t\tfor ( i = 0; elements[ i ]; i++ ) {\n\t\t\t\t\tthis.settings.unhighlight.call( this, elements[ i ],\n\t\t\t\t\t\tthis.settings.errorClass, \"\" );\n\t\t\t\t\tthis.findByName( elements[ i ].name ).removeClass( this.settings.validClass );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\telements\n\t\t\t\t\t.removeClass( this.settings.errorClass )\n\t\t\t\t\t.removeClass( this.settings.validClass );\n\t\t\t}\n\t\t},\n\n\t\tnumberOfInvalids: function() {\n\t\t\treturn this.objectLength( this.invalid );\n\t\t},\n\n\t\tobjectLength: function( obj ) {\n\t\t\t/* jshint unused: false */\n\t\t\tvar count = 0,\n\t\t\t\ti;\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( obj[ i ] ) {\n\t\t\t\t\tcount++;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn count;\n\t\t},\n\n\t\thideErrors: function() {\n\t\t\tthis.hideThese( this.toHide );\n\t\t},\n\n\t\thideThese: function( errors ) {\n\t\t\terrors.not( this.containers ).text( \"\" );\n\t\t\tthis.addWrapper( errors ).hide();\n\t\t},\n\n\t\tvalid: function() {\n\t\t\treturn this.size() === 0;\n\t\t},\n\n\t\tsize: function() {\n\t\t\treturn this.errorList.length;\n\t\t},\n\n\t\tfocusInvalid: function() {\n\t\t\tif ( this.settings.focusInvalid ) {\n\t\t\t\ttry {\n\t\t\t\t\t$( this.findLastActive() || this.errorList.length && this.errorList[ 0 ].element || [] )\n\t\t\t\t\t.filter( \":visible\" )\n\t\t\t\t\t.focus()\n\n\t\t\t\t\t// Manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find\n\t\t\t\t\t.trigger( \"focusin\" );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// Ignore IE throwing errors when focusing hidden elements\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tfindLastActive: function() {\n\t\t\tvar lastActive = this.lastActive;\n\t\t\treturn lastActive && $.grep( this.errorList, function( n ) {\n\t\t\t\treturn n.element.name === lastActive.name;\n\t\t\t} ).length === 1 && lastActive;\n\t\t},\n\n\t\telements: function() {\n\t\t\tvar validator = this,\n\t\t\t\trulesCache = {};\n\n\t\t\t// Select all valid inputs inside the form (no submit or reset buttons)\n\t\t\treturn $( this.currentForm )\n\t\t\t.find( \"input, select, textarea, [contenteditable]\" )\n\t\t\t.not( \":submit, :reset, :image, :disabled\" )\n\t\t\t.not( this.settings.ignore )\n\t\t\t.filter( function() {\n\t\t\t\tvar name = this.name || $( this ).attr( \"name\" ); // For contenteditable\n\t\t\t\tif ( !name && validator.settings.debug && window.console ) {\n\t\t\t\t\tconsole.error( \"%o has no name assigned\", this );\n\t\t\t\t}\n\n\t\t\t\t// Set form expando on contenteditable\n\t\t\t\tif ( this.hasAttribute( \"contenteditable\" ) ) {\n\t\t\t\t\tthis.form = $( this ).closest( \"form\" )[ 0 ];\n\t\t\t\t}\n\n\t\t\t\t// Select only the first element for each name, and only those with rules specified\n\t\t\t\tif ( name in rulesCache || !validator.objectLength( $( this ).rules() ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\trulesCache[ name ] = true;\n\t\t\t\treturn true;\n\t\t\t} );\n\t\t},\n\n\t\tclean: function( selector ) {\n\t\t\treturn $( selector )[ 0 ];\n\t\t},\n\n\t\terrors: function() {\n\t\t\tvar errorClass = this.settings.errorClass.split( \" \" ).join( \".\" );\n\t\t\treturn $( this.settings.errorElement + \".\" + errorClass, this.errorContext );\n\t\t},\n\n\t\tresetInternals: function() {\n\t\t\tthis.successList = [];\n\t\t\tthis.errorList = [];\n\t\t\tthis.errorMap = {};\n\t\t\tthis.toShow = $( [] );\n\t\t\tthis.toHide = $( [] );\n\t\t},\n\n\t\treset: function() {\n\t\t\tthis.resetInternals();\n\t\t\tthis.currentElements = $( [] );\n\t\t},\n\n\t\tprepareForm: function() {\n\t\t\tthis.reset();\n\t\t\tthis.toHide = this.errors().add( this.containers );\n\t\t},\n\n\t\tprepareElement: function( element ) {\n\t\t\tthis.reset();\n\t\t\tthis.toHide = this.errorsFor( element );\n\t\t},\n\n\t\telementValue: function( element ) {\n\t\t\tvar $element = $( element ),\n\t\t\t\ttype = element.type,\n\t\t\t\tval, idx;\n\n\t\t\tif ( type === \"radio\" || type === \"checkbox\" ) {\n\t\t\t\treturn this.findByName( element.name ).filter( \":checked\" ).val();\n\t\t\t} else if ( type === \"number\" && typeof element.validity !== \"undefined\" ) {\n\t\t\t\treturn element.validity.badInput ? \"NaN\" : $element.val();\n\t\t\t}\n\n\t\t\tif ( element.hasAttribute( \"contenteditable\" ) ) {\n\t\t\t\tval = $element.text();\n\t\t\t} else {\n\t\t\t\tval = $element.val();\n\t\t\t}\n\n\t\t\tif ( type === \"file\" ) {\n\n\t\t\t\t// Modern browser (chrome & safari)\n\t\t\t\tif ( val.substr( 0, 12 ) === \"C:\\\\fakepath\\\\\" ) {\n\t\t\t\t\treturn val.substr( 12 );\n\t\t\t\t}\n\n\t\t\t\t// Legacy browsers\n\t\t\t\t// Unix-based path\n\t\t\t\tidx = val.lastIndexOf( \"/\" );\n\t\t\t\tif ( idx >= 0 ) {\n\t\t\t\t\treturn val.substr( idx + 1 );\n\t\t\t\t}\n\n\t\t\t\t// Windows-based path\n\t\t\t\tidx = val.lastIndexOf( \"\\\\\" );\n\t\t\t\tif ( idx >= 0 ) {\n\t\t\t\t\treturn val.substr( idx + 1 );\n\t\t\t\t}\n\n\t\t\t\t// Just the file name\n\t\t\t\treturn val;\n\t\t\t}\n\n\t\t\tif ( typeof val === \"string\" ) {\n\t\t\t\treturn val.replace( /\\r/g, \"\" );\n\t\t\t}\n\t\t\treturn val;\n\t\t},\n\n\t\tcheck: function( element ) {\n\t\t\telement = this.validationTargetFor( this.clean( element ) );\n\n\t\t\tvar rules = $( element ).rules(),\n\t\t\t\trulesCount = $.map( rules, function( n, i ) {\n\t\t\t\t\treturn i;\n\t\t\t\t} ).length,\n\t\t\t\tdependencyMismatch = false,\n\t\t\t\tval = this.elementValue( element ),\n\t\t\t\tresult, method, rule;\n\n\t\t\t// If a normalizer is defined for this element, then\n\t\t\t// call it to retreive the changed value instead\n\t\t\t// of using the real one.\n\t\t\t// Note that `this` in the normalizer is `element`.\n\t\t\tif ( typeof rules.normalizer === \"function\" ) {\n\t\t\t\tval = rules.normalizer.call( element, val );\n\n\t\t\t\tif ( typeof val !== \"string\" ) {\n\t\t\t\t\tthrow new TypeError( \"The normalizer should return a string value.\" );\n\t\t\t\t}\n\n\t\t\t\t// Delete the normalizer from rules to avoid treating\n\t\t\t\t// it as a pre-defined method.\n\t\t\t\tdelete rules.normalizer;\n\t\t\t}\n\n\t\t\tfor ( method in rules ) {\n\t\t\t\trule = { method: method, parameters: rules[ method ] };\n\t\t\t\ttry {\n\t\t\t\t\tresult = $.validator.methods[ method ].call( this, val, element, rule.parameters );\n\n\t\t\t\t\t// If a method indicates that the field is optional and therefore valid,\n\t\t\t\t\t// don't mark it as valid when there are no other rules\n\t\t\t\t\tif ( result === \"dependency-mismatch\" && rulesCount === 1 ) {\n\t\t\t\t\t\tdependencyMismatch = true;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tdependencyMismatch = false;\n\n\t\t\t\t\tif ( result === \"pending\" ) {\n\t\t\t\t\t\tthis.toHide = this.toHide.not( this.errorsFor( element ) );\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !result ) {\n\t\t\t\t\t\tthis.formatAndAdd( element, rule );\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} catch ( e ) {\n\t\t\t\t\tif ( this.settings.debug && window.console ) {\n\t\t\t\t\t\tconsole.log( \"Exception occurred when checking element \" + element.id + \", check the '\" + rule.method + \"' method.\", e );\n\t\t\t\t\t}\n\t\t\t\t\tif ( e instanceof TypeError ) {\n\t\t\t\t\t\te.message += \".  Exception occurred when checking element \" + element.id + \", check the '\" + rule.method + \"' method.\";\n\t\t\t\t\t}\n\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( dependencyMismatch ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( this.objectLength( rules ) ) {\n\t\t\t\tthis.successList.push( element );\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t// Return the custom message for the given element and validation method\n\t\t// specified in the element's HTML5 data attribute\n\t\t// return the generic message if present and no method specific message is present\n\t\tcustomDataMessage: function( element, method ) {\n\t\t\treturn $( element ).data( \"msg\" + method.charAt( 0 ).toUpperCase() +\n\t\t\t\tmethod.substring( 1 ).toLowerCase() ) || $( element ).data( \"msg\" );\n\t\t},\n\n\t\t// Return the custom message for the given element name and validation method\n\t\tcustomMessage: function( name, method ) {\n\t\t\tvar m = this.settings.messages[ name ];\n\t\t\treturn m && ( m.constructor === String ? m : m[ method ] );\n\t\t},\n\n\t\t// Return the first defined argument, allowing empty strings\n\t\tfindDefined: function() {\n\t\t\tfor ( var i = 0; i < arguments.length; i++ ) {\n\t\t\t\tif ( arguments[ i ] !== undefined ) {\n\t\t\t\t\treturn arguments[ i ];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\n\t\t// The second parameter 'rule' used to be a string, and extended to an object literal\n\t\t// of the following form:\n\t\t// rule = {\n\t\t//     method: \"method name\",\n\t\t//     parameters: \"the given method parameters\"\n\t\t// }\n\t\t//\n\t\t// The old behavior still supported, kept to maintain backward compatibility with\n\t\t// old code, and will be removed in the next major release.\n\t\tdefaultMessage: function( element, rule ) {\n\t\t\tif ( typeof rule === \"string\" ) {\n\t\t\t\trule = { method: rule };\n\t\t\t}\n\n\t\t\tvar message = this.findDefined(\n\t\t\t\t\tthis.customMessage( element.name, rule.method ),\n\t\t\t\t\tthis.customDataMessage( element, rule.method ),\n\n\t\t\t\t\t// 'title' is never undefined, so handle empty string as undefined\n\t\t\t\t\t!this.settings.ignoreTitle && element.title || undefined,\n\t\t\t\t\t$.validator.messages[ rule.method ],\n\t\t\t\t\t\"<strong>Warning: No message defined for \" + element.name + \"</strong>\"\n\t\t\t\t),\n\t\t\t\ttheregex = /\\$?\\{(\\d+)\\}/g;\n\t\t\tif ( typeof message === \"function\" ) {\n\t\t\t\tmessage = message.call( this, rule.parameters, element );\n\t\t\t} else if ( theregex.test( message ) ) {\n\t\t\t\tmessage = $.validator.format( message.replace( theregex, \"{$1}\" ), rule.parameters );\n\t\t\t}\n\n\t\t\treturn message;\n\t\t},\n\n\t\tformatAndAdd: function( element, rule ) {\n\t\t\tvar message = this.defaultMessage( element, rule );\n\n\t\t\tthis.errorList.push( {\n\t\t\t\tmessage: message,\n\t\t\t\telement: element,\n\t\t\t\tmethod: rule.method\n\t\t\t} );\n\n\t\t\tthis.errorMap[ element.name ] = message;\n\t\t\tthis.submitted[ element.name ] = message;\n\t\t},\n\n\t\taddWrapper: function( toToggle ) {\n\t\t\tif ( this.settings.wrapper ) {\n\t\t\t\ttoToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );\n\t\t\t}\n\t\t\treturn toToggle;\n\t\t},\n\n\t\tdefaultShowErrors: function() {\n\t\t\tvar i, elements, error;\n\t\t\tfor ( i = 0; this.errorList[ i ]; i++ ) {\n\t\t\t\terror = this.errorList[ i ];\n\t\t\t\tif ( this.settings.highlight ) {\n\t\t\t\t\tthis.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass );\n\t\t\t\t}\n\t\t\t\tthis.showLabel( error.element, error.message );\n\t\t\t}\n\t\t\tif ( this.errorList.length ) {\n\t\t\t\tthis.toShow = this.toShow.add( this.containers );\n\t\t\t}\n\t\t\tif ( this.settings.success ) {\n\t\t\t\tfor ( i = 0; this.successList[ i ]; i++ ) {\n\t\t\t\t\tthis.showLabel( this.successList[ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( this.settings.unhighlight ) {\n\t\t\t\tfor ( i = 0, elements = this.validElements(); elements[ i ]; i++ ) {\n\t\t\t\t\tthis.settings.unhighlight.call( this, elements[ i ], this.settings.errorClass, this.settings.validClass );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.toHide = this.toHide.not( this.toShow );\n\t\t\tthis.hideErrors();\n\t\t\tthis.addWrapper( this.toShow ).show();\n\t\t},\n\n\t\tvalidElements: function() {\n\t\t\treturn this.currentElements.not( this.invalidElements() );\n\t\t},\n\n\t\tinvalidElements: function() {\n\t\t\treturn $( this.errorList ).map( function() {\n\t\t\t\treturn this.element;\n\t\t\t} );\n\t\t},\n\n\t\tshowLabel: function( element, message ) {\n\t\t\tvar place, group, errorID, v,\n\t\t\t\terror = this.errorsFor( element ),\n\t\t\t\telementID = this.idOrName( element ),\n\t\t\t\tdescribedBy = $( element ).attr( \"aria-describedby\" );\n\n\t\t\tif ( error.length ) {\n\n\t\t\t\t// Refresh error/success class\n\t\t\t\terror.removeClass( this.settings.validClass ).addClass( this.settings.errorClass );\n\n\t\t\t\t// Replace message on existing label\n\t\t\t\terror.html( message );\n\t\t\t} else {\n\n\t\t\t\t// Create error element\n\t\t\t\terror = $( \"<\" + this.settings.errorElement + \">\" )\n\t\t\t\t\t.attr( \"id\", elementID + \"-error\" )\n\t\t\t\t\t.addClass( this.settings.errorClass )\n\t\t\t\t\t.html( message || \"\" );\n\n\t\t\t\t// Maintain reference to the element to be placed into the DOM\n\t\t\t\tplace = error;\n\t\t\t\tif ( this.settings.wrapper ) {\n\n\t\t\t\t\t// Make sure the element is visible, even in IE\n\t\t\t\t\t// actually showing the wrapped element is handled elsewhere\n\t\t\t\t\tplace = error.hide().show().wrap( \"<\" + this.settings.wrapper + \"/>\" ).parent();\n\t\t\t\t}\n\t\t\t\tif ( this.labelContainer.length ) {\n\t\t\t\t\tthis.labelContainer.append( place );\n\t\t\t\t} else if ( this.settings.errorPlacement ) {\n\t\t\t\t\tthis.settings.errorPlacement.call( this, place, $( element ) );\n\t\t\t\t} else {\n\t\t\t\t\tplace.insertAfter( element );\n\t\t\t\t}\n\n\t\t\t\t// Link error back to the element\n\t\t\t\tif ( error.is( \"label\" ) ) {\n\n\t\t\t\t\t// If the error is a label, then associate using 'for'\n\t\t\t\t\terror.attr( \"for\", elementID );\n\n\t\t\t\t\t// If the element is not a child of an associated label, then it's necessary\n\t\t\t\t\t// to explicitly apply aria-describedby\n\t\t\t\t} else if ( error.parents( \"label[for='\" + this.escapeCssMeta( elementID ) + \"']\" ).length === 0 ) {\n\t\t\t\t\terrorID = error.attr( \"id\" );\n\n\t\t\t\t\t// Respect existing non-error aria-describedby\n\t\t\t\t\tif ( !describedBy ) {\n\t\t\t\t\t\tdescribedBy = errorID;\n\t\t\t\t\t} else if ( !describedBy.match( new RegExp( \"\\\\b\" + this.escapeCssMeta( errorID ) + \"\\\\b\" ) ) ) {\n\n\t\t\t\t\t\t// Add to end of list if not already present\n\t\t\t\t\t\tdescribedBy += \" \" + errorID;\n\t\t\t\t\t}\n\t\t\t\t\t$( element ).attr( \"aria-describedby\", describedBy );\n\n\t\t\t\t\t// If this element is grouped, then assign to all elements in the same group\n\t\t\t\t\tgroup = this.groups[ element.name ];\n\t\t\t\t\tif ( group ) {\n\t\t\t\t\t\tv = this;\n\t\t\t\t\t\t$.each( v.groups, function( name, testgroup ) {\n\t\t\t\t\t\t\tif ( testgroup === group ) {\n\t\t\t\t\t\t\t\t$( \"[name='\" + v.escapeCssMeta( name ) + \"']\", v.currentForm )\n\t\t\t\t\t\t\t\t\t.attr( \"aria-describedby\", error.attr( \"id\" ) );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( !message && this.settings.success ) {\n\t\t\t\terror.text( \"\" );\n\t\t\t\tif ( typeof this.settings.success === \"string\" ) {\n\t\t\t\t\terror.addClass( this.settings.success );\n\t\t\t\t} else {\n\t\t\t\t\tthis.settings.success( error, element );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.toShow = this.toShow.add( error );\n\t\t},\n\n\t\terrorsFor: function( element ) {\n\t\t\tvar name = this.escapeCssMeta( this.idOrName( element ) ),\n\t\t\t\tdescriber = $( element ).attr( \"aria-describedby\" ),\n\t\t\t\tselector = \"label[for='\" + name + \"'], label[for='\" + name + \"'] *\";\n\n\t\t\t// 'aria-describedby' should directly reference the error element\n\t\t\tif ( describer ) {\n\t\t\t\tselector = selector + \", #\" + this.escapeCssMeta( describer )\n\t\t\t\t\t.replace( /\\s+/g, \", #\" );\n\t\t\t}\n\n\t\t\treturn this\n\t\t\t\t.errors()\n\t\t\t\t.filter( selector );\n\t\t},\n\n\t\t// See https://api.jquery.com/category/selectors/, for CSS\n\t\t// meta-characters that should be escaped in order to be used with JQuery\n\t\t// as a literal part of a name/id or any selector.\n\t\tescapeCssMeta: function( string ) {\n\t\t\treturn string.replace( /([\\\\!\"#$%&'()*+,./:;<=>?@\\[\\]^`{|}~])/g, \"\\\\$1\" );\n\t\t},\n\n\t\tidOrName: function( element ) {\n\t\t\treturn this.groups[ element.name ] || ( this.checkable( element ) ? element.name : element.id || element.name );\n\t\t},\n\n\t\tvalidationTargetFor: function( element ) {\n\n\t\t\t// If radio/checkbox, validate first element in group instead\n\t\t\tif ( this.checkable( element ) ) {\n\t\t\t\telement = this.findByName( element.name );\n\t\t\t}\n\n\t\t\t// Always apply ignore filter\n\t\t\treturn $( element ).not( this.settings.ignore )[ 0 ];\n\t\t},\n\n\t\tcheckable: function( element ) {\n\t\t\treturn ( /radio|checkbox/i ).test( element.type );\n\t\t},\n\n\t\tfindByName: function( name ) {\n\t\t\treturn $( this.currentForm ).find( \"[name='\" + this.escapeCssMeta( name ) + \"']\" );\n\t\t},\n\n\t\tgetLength: function( value, element ) {\n\t\t\tswitch ( element.nodeName.toLowerCase() ) {\n\t\t\tcase \"select\":\n\t\t\t\treturn $( \"option:selected\", element ).length;\n\t\t\tcase \"input\":\n\t\t\t\tif ( this.checkable( element ) ) {\n\t\t\t\t\treturn this.findByName( element.name ).filter( \":checked\" ).length;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn value.length;\n\t\t},\n\n\t\tdepend: function( param, element ) {\n\t\t\treturn this.dependTypes[ typeof param ] ? this.dependTypes[ typeof param ]( param, element ) : true;\n\t\t},\n\n\t\tdependTypes: {\n\t\t\t\"boolean\": function( param ) {\n\t\t\t\treturn param;\n\t\t\t},\n\t\t\t\"string\": function( param, element ) {\n\t\t\t\treturn !!$( param, element.form ).length;\n\t\t\t},\n\t\t\t\"function\": function( param, element ) {\n\t\t\t\treturn param( element );\n\t\t\t}\n\t\t},\n\n\t\toptional: function( element ) {\n\t\t\tvar val = this.elementValue( element );\n\t\t\treturn !$.validator.methods.required.call( this, val, element ) && \"dependency-mismatch\";\n\t\t},\n\n\t\tstartRequest: function( element ) {\n\t\t\tif ( !this.pending[ element.name ] ) {\n\t\t\t\tthis.pendingRequest++;\n\t\t\t\t$( element ).addClass( this.settings.pendingClass );\n\t\t\t\tthis.pending[ element.name ] = true;\n\t\t\t}\n\t\t},\n\n\t\tstopRequest: function( element, valid ) {\n\t\t\tthis.pendingRequest--;\n\n\t\t\t// Sometimes synchronization fails, make sure pendingRequest is never < 0\n\t\t\tif ( this.pendingRequest < 0 ) {\n\t\t\t\tthis.pendingRequest = 0;\n\t\t\t}\n\t\t\tdelete this.pending[ element.name ];\n\t\t\t$( element ).removeClass( this.settings.pendingClass );\n\t\t\tif ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() ) {\n\t\t\t\t$( this.currentForm ).submit();\n\t\t\t\tthis.formSubmitted = false;\n\t\t\t} else if ( !valid && this.pendingRequest === 0 && this.formSubmitted ) {\n\t\t\t\t$( this.currentForm ).triggerHandler( \"invalid-form\", [ this ] );\n\t\t\t\tthis.formSubmitted = false;\n\t\t\t}\n\t\t},\n\n\t\tpreviousValue: function( element, method ) {\n\t\t\tmethod = typeof method === \"string\" && method || \"remote\";\n\n\t\t\treturn $.data( element, \"previousValue\" ) || $.data( element, \"previousValue\", {\n\t\t\t\told: null,\n\t\t\t\tvalid: true,\n\t\t\t\tmessage: this.defaultMessage( element, { method: method } )\n\t\t\t} );\n\t\t},\n\n\t\t// Cleans up all forms and elements, removes validator-specific events\n\t\tdestroy: function() {\n\t\t\tthis.resetForm();\n\n\t\t\t$( this.currentForm )\n\t\t\t\t.off( \".validate\" )\n\t\t\t\t.removeData( \"validator\" )\n\t\t\t\t.find( \".validate-equalTo-blur\" )\n\t\t\t\t\t.off( \".validate-equalTo\" )\n\t\t\t\t\t.removeClass( \"validate-equalTo-blur\" );\n\t\t}\n\n\t},\n\n\tclassRuleSettings: {\n\t\trequired: { required: true },\n\t\temail: { email: true },\n\t\turl: { url: true },\n\t\tdate: { date: true },\n\t\tdateISO: { dateISO: true },\n\t\tnumber: { number: true },\n\t\tdigits: { digits: true },\n\t\tcreditcard: { creditcard: true }\n\t},\n\n\taddClassRules: function( className, rules ) {\n\t\tif ( className.constructor === String ) {\n\t\t\tthis.classRuleSettings[ className ] = rules;\n\t\t} else {\n\t\t\t$.extend( this.classRuleSettings, className );\n\t\t}\n\t},\n\n\tclassRules: function( element ) {\n\t\tvar rules = {},\n\t\t\tclasses = $( element ).attr( \"class\" );\n\n\t\tif ( classes ) {\n\t\t\t$.each( classes.split( \" \" ), function() {\n\t\t\t\tif ( this in $.validator.classRuleSettings ) {\n\t\t\t\t\t$.extend( rules, $.validator.classRuleSettings[ this ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t\treturn rules;\n\t},\n\n\tnormalizeAttributeRule: function( rules, type, method, value ) {\n\n\t\t// Convert the value to a number for number inputs, and for text for backwards compability\n\t\t// allows type=\"date\" and others to be compared as strings\n\t\tif ( /min|max|step/.test( method ) && ( type === null || /number|range|text/.test( type ) ) ) {\n\t\t\tvalue = Number( value );\n\n\t\t\t// Support Opera Mini, which returns NaN for undefined minlength\n\t\t\tif ( isNaN( value ) ) {\n\t\t\t\tvalue = undefined;\n\t\t\t}\n\t\t}\n\n\t\tif ( value || value === 0 ) {\n\t\t\trules[ method ] = value;\n\t\t} else if ( type === method && type !== \"range\" ) {\n\n\t\t\t// Exception: the jquery validate 'range' method\n\t\t\t// does not test for the html5 'range' type\n\t\t\trules[ method ] = true;\n\t\t}\n\t},\n\n\tattributeRules: function( element ) {\n\t\tvar rules = {},\n\t\t\t$element = $( element ),\n\t\t\ttype = element.getAttribute( \"type\" ),\n\t\t\tmethod, value;\n\n\t\tfor ( method in $.validator.methods ) {\n\n\t\t\t// Support for <input required> in both html5 and older browsers\n\t\t\tif ( method === \"required\" ) {\n\t\t\t\tvalue = element.getAttribute( method );\n\n\t\t\t\t// Some browsers return an empty string for the required attribute\n\t\t\t\t// and non-HTML5 browsers might have required=\"\" markup\n\t\t\t\tif ( value === \"\" ) {\n\t\t\t\t\tvalue = true;\n\t\t\t\t}\n\n\t\t\t\t// Force non-HTML5 browsers to return bool\n\t\t\t\tvalue = !!value;\n\t\t\t} else {\n\t\t\t\tvalue = $element.attr( method );\n\t\t\t}\n\n\t\t\tthis.normalizeAttributeRule( rules, type, method, value );\n\t\t}\n\n\t\t// 'maxlength' may be returned as -1, 2147483647 ( IE ) and 524288 ( safari ) for text inputs\n\t\tif ( rules.maxlength && /-1|2147483647|524288/.test( rules.maxlength ) ) {\n\t\t\tdelete rules.maxlength;\n\t\t}\n\n\t\treturn rules;\n\t},\n\n\tdataRules: function( element ) {\n\t\tvar rules = {},\n\t\t\t$element = $( element ),\n\t\t\ttype = element.getAttribute( \"type\" ),\n\t\t\tmethod, value;\n\n\t\tfor ( method in $.validator.methods ) {\n\t\t\tvalue = $element.data( \"rule\" + method.charAt( 0 ).toUpperCase() + method.substring( 1 ).toLowerCase() );\n\t\t\tthis.normalizeAttributeRule( rules, type, method, value );\n\t\t}\n\t\treturn rules;\n\t},\n\n\tstaticRules: function( element ) {\n\t\tvar rules = {},\n\t\t\tvalidator = $.data( element.form, \"validator\" );\n\n\t\tif ( validator.settings.rules ) {\n\t\t\trules = $.validator.normalizeRule( validator.settings.rules[ element.name ] ) || {};\n\t\t}\n\t\treturn rules;\n\t},\n\n\tnormalizeRules: function( rules, element ) {\n\n\t\t// Handle dependency check\n\t\t$.each( rules, function( prop, val ) {\n\n\t\t\t// Ignore rule when param is explicitly false, eg. required:false\n\t\t\tif ( val === false ) {\n\t\t\t\tdelete rules[ prop ];\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( val.param || val.depends ) {\n\t\t\t\tvar keepRule = true;\n\t\t\t\tswitch ( typeof val.depends ) {\n\t\t\t\tcase \"string\":\n\t\t\t\t\tkeepRule = !!$( val.depends, element.form ).length;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"function\":\n\t\t\t\t\tkeepRule = val.depends.call( element, element );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif ( keepRule ) {\n\t\t\t\t\trules[ prop ] = val.param !== undefined ? val.param : true;\n\t\t\t\t} else {\n\t\t\t\t\t$.data( element.form, \"validator\" ).resetElements( $( element ) );\n\t\t\t\t\tdelete rules[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\t// Evaluate parameters\n\t\t$.each( rules, function( rule, parameter ) {\n\t\t\trules[ rule ] = $.isFunction( parameter ) && rule !== \"normalizer\" ? parameter( element ) : parameter;\n\t\t} );\n\n\t\t// Clean number parameters\n\t\t$.each( [ \"minlength\", \"maxlength\" ], function() {\n\t\t\tif ( rules[ this ] ) {\n\t\t\t\trules[ this ] = Number( rules[ this ] );\n\t\t\t}\n\t\t} );\n\t\t$.each( [ \"rangelength\", \"range\" ], function() {\n\t\t\tvar parts;\n\t\t\tif ( rules[ this ] ) {\n\t\t\t\tif ( $.isArray( rules[ this ] ) ) {\n\t\t\t\t\trules[ this ] = [ Number( rules[ this ][ 0 ] ), Number( rules[ this ][ 1 ] ) ];\n\t\t\t\t} else if ( typeof rules[ this ] === \"string\" ) {\n\t\t\t\t\tparts = rules[ this ].replace( /[\\[\\]]/g, \"\" ).split( /[\\s,]+/ );\n\t\t\t\t\trules[ this ] = [ Number( parts[ 0 ] ), Number( parts[ 1 ] ) ];\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\tif ( $.validator.autoCreateRanges ) {\n\n\t\t\t// Auto-create ranges\n\t\t\tif ( rules.min != null && rules.max != null ) {\n\t\t\t\trules.range = [ rules.min, rules.max ];\n\t\t\t\tdelete rules.min;\n\t\t\t\tdelete rules.max;\n\t\t\t}\n\t\t\tif ( rules.minlength != null && rules.maxlength != null ) {\n\t\t\t\trules.rangelength = [ rules.minlength, rules.maxlength ];\n\t\t\t\tdelete rules.minlength;\n\t\t\t\tdelete rules.maxlength;\n\t\t\t}\n\t\t}\n\n\t\treturn rules;\n\t},\n\n\t// Converts a simple string to a {string: true} rule, e.g., \"required\" to {required:true}\n\tnormalizeRule: function( data ) {\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tvar transformed = {};\n\t\t\t$.each( data.split( /\\s/ ), function() {\n\t\t\t\ttransformed[ this ] = true;\n\t\t\t} );\n\t\t\tdata = transformed;\n\t\t}\n\t\treturn data;\n\t},\n\n\t// http://jqueryvalidation.org/jQuery.validator.addMethod/\n\taddMethod: function( name, method, message ) {\n\t\t$.validator.methods[ name ] = method;\n\t\t$.validator.messages[ name ] = message !== undefined ? message : $.validator.messages[ name ];\n\t\tif ( method.length < 3 ) {\n\t\t\t$.validator.addClassRules( name, $.validator.normalizeRule( name ) );\n\t\t}\n\t},\n\n\t// http://jqueryvalidation.org/jQuery.validator.methods/\n\tmethods: {\n\n\t\t// http://jqueryvalidation.org/required-method/\n\t\trequired: function( value, element, param ) {\n\n\t\t\t// Check if dependency is met\n\t\t\tif ( !this.depend( param, element ) ) {\n\t\t\t\treturn \"dependency-mismatch\";\n\t\t\t}\n\t\t\tif ( element.nodeName.toLowerCase() === \"select\" ) {\n\n\t\t\t\t// Could be an array for select-multiple or a string, both are fine this way\n\t\t\t\tvar val = $( element ).val();\n\t\t\t\treturn val && val.length > 0;\n\t\t\t}\n\t\t\tif ( this.checkable( element ) ) {\n\t\t\t\treturn this.getLength( value, element ) > 0;\n\t\t\t}\n\t\t\treturn value.length > 0;\n\t\t},\n\n\t\t// http://jqueryvalidation.org/email-method/\n\t\temail: function( value, element ) {\n\n\t\t\t// From https://html.spec.whatwg.org/multipage/forms.html#valid-e-mail-address\n\t\t\t// Retrieved 2014-01-14\n\t\t\t// If you have a problem with this implementation, report a bug against the above spec\n\t\t\t// Or use custom methods to implement your own email validation\n\t\t\treturn this.optional( element ) || /^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test( value );\n\t\t},\n\n\t\t// http://jqueryvalidation.org/url-method/\n\t\turl: function( value, element ) {\n\n\t\t\t// Copyright (c) 2010-2013 Diego Perini, MIT licensed\n\t\t\t// https://gist.github.com/dperini/729294\n\t\t\t// see also https://mathiasbynens.be/demo/url-regex\n\t\t\t// modified to allow protocol-relative URLs\n\t\t\treturn this.optional( element ) || /^(?:(?:(?:https?|ftp):)?\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})).?)(?::\\d{2,5})?(?:[/?#]\\S*)?$/i.test( value );\n\t\t},\n\n\t\t// http://jqueryvalidation.org/date-method/\n\t\tdate: function( value, element ) {\n\t\t\treturn this.optional( element ) || !/Invalid|NaN/.test( new Date( value ).toString() );\n\t\t},\n\n\t\t// http://jqueryvalidation.org/dateISO-method/\n\t\tdateISO: function( value, element ) {\n\t\t\treturn this.optional( element ) || /^\\d{4}[\\/\\-](0?[1-9]|1[012])[\\/\\-](0?[1-9]|[12][0-9]|3[01])$/.test( value );\n\t\t},\n\n\t\t// http://jqueryvalidation.org/number-method/\n\t\tnumber: function( value, element ) {\n\t\t\treturn this.optional( element ) || /^(?:-?\\d+|-?\\d{1,3}(?:,\\d{3})+)?(?:\\.\\d+)?$/.test( value );\n\t\t},\n\n\t\t// http://jqueryvalidation.org/digits-method/\n\t\tdigits: function( value, element ) {\n\t\t\treturn this.optional( element ) || /^\\d+$/.test( value );\n\t\t},\n\n\t\t// http://jqueryvalidation.org/minlength-method/\n\t\tminlength: function( value, element, param ) {\n\t\t\tvar length = $.isArray( value ) ? value.length : this.getLength( value, element );\n\t\t\treturn this.optional( element ) || length >= param;\n\t\t},\n\n\t\t// http://jqueryvalidation.org/maxlength-method/\n\t\tmaxlength: function( value, element, param ) {\n\t\t\tvar length = $.isArray( value ) ? value.length : this.getLength( value, element );\n\t\t\treturn this.optional( element ) || length <= param;\n\t\t},\n\n\t\t// http://jqueryvalidation.org/rangelength-method/\n\t\trangelength: function( value, element, param ) {\n\t\t\tvar length = $.isArray( value ) ? value.length : this.getLength( value, element );\n\t\t\treturn this.optional( element ) || ( length >= param[ 0 ] && length <= param[ 1 ] );\n\t\t},\n\n\t\t// http://jqueryvalidation.org/min-method/\n\t\tmin: function( value, element, param ) {\n\t\t\treturn this.optional( element ) || value >= param;\n\t\t},\n\n\t\t// http://jqueryvalidation.org/max-method/\n\t\tmax: function( value, element, param ) {\n\t\t\treturn this.optional( element ) || value <= param;\n\t\t},\n\n\t\t// http://jqueryvalidation.org/range-method/\n\t\trange: function( value, element, param ) {\n\t\t\treturn this.optional( element ) || ( value >= param[ 0 ] && value <= param[ 1 ] );\n\t\t},\n\n\t\t// http://jqueryvalidation.org/step-method/\n\t\tstep: function( value, element, param ) {\n\t\t\tvar type = $( element ).attr( \"type\" ),\n\t\t\t\terrorMessage = \"Step attribute on input type \" + type + \" is not supported.\",\n\t\t\t\tsupportedTypes = [ \"text\", \"number\", \"range\" ],\n\t\t\t\tre = new RegExp( \"\\\\b\" + type + \"\\\\b\" ),\n\t\t\t\tnotSupported = type && !re.test( supportedTypes.join() ),\n\t\t\t\tdecimalPlaces = function( num ) {\n\t\t\t\t\tvar match = ( \"\" + num ).match( /(?:\\.(\\d+))?$/ );\n\t\t\t\t\tif ( !match ) {\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Number of digits right of decimal point.\n\t\t\t\t\treturn match[ 1 ] ? match[ 1 ].length : 0;\n\t\t\t\t},\n\t\t\t\ttoInt = function( num ) {\n\t\t\t\t\treturn Math.round( num * Math.pow( 10, decimals ) );\n\t\t\t\t},\n\t\t\t\tvalid = true,\n\t\t\t\tdecimals;\n\n\t\t\t// Works only for text, number and range input types\n\t\t\t// TODO find a way to support input types date, datetime, datetime-local, month, time and week\n\t\t\tif ( notSupported ) {\n\t\t\t\tthrow new Error( errorMessage );\n\t\t\t}\n\n\t\t\tdecimals = decimalPlaces( param );\n\n\t\t\t// Value can't have too many decimals\n\t\t\tif ( decimalPlaces( value ) > decimals || toInt( value ) % toInt( param ) !== 0 ) {\n\t\t\t\tvalid = false;\n\t\t\t}\n\n\t\t\treturn this.optional( element ) || valid;\n\t\t},\n\n\t\t// http://jqueryvalidation.org/equalTo-method/\n\t\tequalTo: function( value, element, param ) {\n\n\t\t\t// Bind to the blur event of the target in order to revalidate whenever the target field is updated\n\t\t\tvar target = $( param );\n\t\t\tif ( this.settings.onfocusout && target.not( \".validate-equalTo-blur\" ).length ) {\n\t\t\t\ttarget.addClass( \"validate-equalTo-blur\" ).on( \"blur.validate-equalTo\", function() {\n\t\t\t\t\t$( element ).valid();\n\t\t\t\t} );\n\t\t\t}\n\t\t\treturn value === target.val();\n\t\t},\n\n\t\t// http://jqueryvalidation.org/remote-method/\n\t\tremote: function( value, element, param, method ) {\n\t\t\tif ( this.optional( element ) ) {\n\t\t\t\treturn \"dependency-mismatch\";\n\t\t\t}\n\n\t\t\tmethod = typeof method === \"string\" && method || \"remote\";\n\n\t\t\tvar previous = this.previousValue( element, method ),\n\t\t\t\tvalidator, data, optionDataString;\n\n\t\t\tif ( !this.settings.messages[ element.name ] ) {\n\t\t\t\tthis.settings.messages[ element.name ] = {};\n\t\t\t}\n\t\t\tprevious.originalMessage = previous.originalMessage || this.settings.messages[ element.name ][ method ];\n\t\t\tthis.settings.messages[ element.name ][ method ] = previous.message;\n\n\t\t\tparam = typeof param === \"string\" && { url: param } || param;\n\t\t\toptionDataString = $.param( $.extend( { data: value }, param.data ) );\n\t\t\tif ( previous.old === optionDataString ) {\n\t\t\t\treturn previous.valid;\n\t\t\t}\n\n\t\t\tprevious.old = optionDataString;\n\t\t\tvalidator = this;\n\t\t\tthis.startRequest( element );\n\t\t\tdata = {};\n\t\t\tdata[ element.name ] = value;\n\t\t\t$.ajax( $.extend( true, {\n\t\t\t\tmode: \"abort\",\n\t\t\t\tport: \"validate\" + element.name,\n\t\t\t\tdataType: \"json\",\n\t\t\t\tdata: data,\n\t\t\t\tcontext: validator.currentForm,\n\t\t\t\tsuccess: function( response ) {\n\t\t\t\t\tvar valid = response === true || response === \"true\",\n\t\t\t\t\t\terrors, message, submitted;\n\n\t\t\t\t\tvalidator.settings.messages[ element.name ][ method ] = previous.originalMessage;\n\t\t\t\t\tif ( valid ) {\n\t\t\t\t\t\tsubmitted = validator.formSubmitted;\n\t\t\t\t\t\tvalidator.resetInternals();\n\t\t\t\t\t\tvalidator.toHide = validator.errorsFor( element );\n\t\t\t\t\t\tvalidator.formSubmitted = submitted;\n\t\t\t\t\t\tvalidator.successList.push( element );\n\t\t\t\t\t\tvalidator.invalid[ element.name ] = false;\n\t\t\t\t\t\tvalidator.showErrors();\n\t\t\t\t\t} else {\n\t\t\t\t\t\terrors = {};\n\t\t\t\t\t\tmessage = response || validator.defaultMessage( element, { method: method, parameters: value } );\n\t\t\t\t\t\terrors[ element.name ] = previous.message = message;\n\t\t\t\t\t\tvalidator.invalid[ element.name ] = true;\n\t\t\t\t\t\tvalidator.showErrors( errors );\n\t\t\t\t\t}\n\t\t\t\t\tprevious.valid = valid;\n\t\t\t\t\tvalidator.stopRequest( element, valid );\n\t\t\t\t}\n\t\t\t}, param ) );\n\t\t\treturn \"pending\";\n\t\t}\n\t}\n\n} );\n\n// Ajax mode: abort\n// usage: $.ajax({ mode: \"abort\"[, port: \"uniqueport\"]});\n// if mode:\"abort\" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()\n\nvar pendingRequests = {},\n\tajax;\n\n// Use a prefilter if available (1.5+)\nif ( $.ajaxPrefilter ) {\n\t$.ajaxPrefilter( function( settings, _, xhr ) {\n\t\tvar port = settings.port;\n\t\tif ( settings.mode === \"abort\" ) {\n\t\t\tif ( pendingRequests[ port ] ) {\n\t\t\t\tpendingRequests[ port ].abort();\n\t\t\t}\n\t\t\tpendingRequests[ port ] = xhr;\n\t\t}\n\t} );\n} else {\n\n\t// Proxy ajax\n\tajax = $.ajax;\n\t$.ajax = function( settings ) {\n\t\tvar mode = ( \"mode\" in settings ? settings : $.ajaxSettings ).mode,\n\t\t\tport = ( \"port\" in settings ? settings : $.ajaxSettings ).port;\n\t\tif ( mode === \"abort\" ) {\n\t\t\tif ( pendingRequests[ port ] ) {\n\t\t\t\tpendingRequests[ port ].abort();\n\t\t\t}\n\t\t\tpendingRequests[ port ] = ajax.apply( this, arguments );\n\t\t\treturn pendingRequests[ port ];\n\t\t}\n\t\treturn ajax.apply( this, arguments );\n\t};\n}\n\n}));"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/jquery-validation/jquery.validate.min.js",
    "content": "/*! jQuery Validation Plugin - v1.15.1 - 7/22/2016\n * http://jqueryvalidation.org/\n * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */\n!function(a){\"function\"==typeof define&&define.amd?define([\"jquery\"],a):\"object\"==typeof module&&module.exports?module.exports=a(require(\"jquery\")):a(jQuery)}(function(a){a.extend(a.fn,{validate:function(b){if(!this.length)return void(b&&b.debug&&window.console&&console.warn(\"Nothing selected, can't validate, returning nothing.\"));var c=a.data(this[0],\"validator\");return c?c:(this.attr(\"novalidate\",\"novalidate\"),c=new a.validator(b,this[0]),a.data(this[0],\"validator\",c),c.settings.onsubmit&&(this.on(\"click.validate\",\":submit\",function(b){c.settings.submitHandler&&(c.submitButton=b.target),a(this).hasClass(\"cancel\")&&(c.cancelSubmit=!0),void 0!==a(this).attr(\"formnovalidate\")&&(c.cancelSubmit=!0)}),this.on(\"submit.validate\",function(b){function d(){var d,e;return!c.settings.submitHandler||(c.submitButton&&(d=a(\"<input type='hidden'/>\").attr(\"name\",c.submitButton.name).val(a(c.submitButton).val()).appendTo(c.currentForm)),e=c.settings.submitHandler.call(c,c.currentForm,b),c.submitButton&&d.remove(),void 0!==e&&e)}return c.settings.debug&&b.preventDefault(),c.cancelSubmit?(c.cancelSubmit=!1,d()):c.form()?c.pendingRequest?(c.formSubmitted=!0,!1):d():(c.focusInvalid(),!1)})),c)},valid:function(){var b,c,d;return a(this[0]).is(\"form\")?b=this.validate().form():(d=[],b=!0,c=a(this[0].form).validate(),this.each(function(){b=c.element(this)&&b,b||(d=d.concat(c.errorList))}),c.errorList=d),b},rules:function(b,c){var d,e,f,g,h,i,j=this[0];if(null!=j&&null!=j.form){if(b)switch(d=a.data(j.form,\"validator\").settings,e=d.rules,f=a.validator.staticRules(j),b){case\"add\":a.extend(f,a.validator.normalizeRule(c)),delete f.messages,e[j.name]=f,c.messages&&(d.messages[j.name]=a.extend(d.messages[j.name],c.messages));break;case\"remove\":return c?(i={},a.each(c.split(/\\s/),function(b,c){i[c]=f[c],delete f[c],\"required\"===c&&a(j).removeAttr(\"aria-required\")}),i):(delete e[j.name],f)}return g=a.validator.normalizeRules(a.extend({},a.validator.classRules(j),a.validator.attributeRules(j),a.validator.dataRules(j),a.validator.staticRules(j)),j),g.required&&(h=g.required,delete g.required,g=a.extend({required:h},g),a(j).attr(\"aria-required\",\"true\")),g.remote&&(h=g.remote,delete g.remote,g=a.extend(g,{remote:h})),g}}}),a.extend(a.expr[\":\"],{blank:function(b){return!a.trim(\"\"+a(b).val())},filled:function(b){var c=a(b).val();return null!==c&&!!a.trim(\"\"+c)},unchecked:function(b){return!a(b).prop(\"checked\")}}),a.validator=function(b,c){this.settings=a.extend(!0,{},a.validator.defaults,b),this.currentForm=c,this.init()},a.validator.format=function(b,c){return 1===arguments.length?function(){var c=a.makeArray(arguments);return c.unshift(b),a.validator.format.apply(this,c)}:void 0===c?b:(arguments.length>2&&c.constructor!==Array&&(c=a.makeArray(arguments).slice(1)),c.constructor!==Array&&(c=[c]),a.each(c,function(a,c){b=b.replace(new RegExp(\"\\\\{\"+a+\"\\\\}\",\"g\"),function(){return c})}),b)},a.extend(a.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:\"error\",pendingClass:\"pending\",validClass:\"valid\",errorElement:\"label\",focusCleanup:!1,focusInvalid:!0,errorContainer:a([]),errorLabelContainer:a([]),onsubmit:!0,ignore:\":hidden\",ignoreTitle:!1,onfocusin:function(a){this.lastActive=a,this.settings.focusCleanup&&(this.settings.unhighlight&&this.settings.unhighlight.call(this,a,this.settings.errorClass,this.settings.validClass),this.hideThese(this.errorsFor(a)))},onfocusout:function(a){this.checkable(a)||!(a.name in this.submitted)&&this.optional(a)||this.element(a)},onkeyup:function(b,c){var d=[16,17,18,20,35,36,37,38,39,40,45,144,225];9===c.which&&\"\"===this.elementValue(b)||a.inArray(c.keyCode,d)!==-1||(b.name in this.submitted||b.name in this.invalid)&&this.element(b)},onclick:function(a){a.name in this.submitted?this.element(a):a.parentNode.name in this.submitted&&this.element(a.parentNode)},highlight:function(b,c,d){\"radio\"===b.type?this.findByName(b.name).addClass(c).removeClass(d):a(b).addClass(c).removeClass(d)},unhighlight:function(b,c,d){\"radio\"===b.type?this.findByName(b.name).removeClass(c).addClass(d):a(b).removeClass(c).addClass(d)}},setDefaults:function(b){a.extend(a.validator.defaults,b)},messages:{required:\"This field is required.\",remote:\"Please fix this field.\",email:\"Please enter a valid email address.\",url:\"Please enter a valid URL.\",date:\"Please enter a valid date.\",dateISO:\"Please enter a valid date (ISO).\",number:\"Please enter a valid number.\",digits:\"Please enter only digits.\",equalTo:\"Please enter the same value again.\",maxlength:a.validator.format(\"Please enter no more than {0} characters.\"),minlength:a.validator.format(\"Please enter at least {0} characters.\"),rangelength:a.validator.format(\"Please enter a value between {0} and {1} characters long.\"),range:a.validator.format(\"Please enter a value between {0} and {1}.\"),max:a.validator.format(\"Please enter a value less than or equal to {0}.\"),min:a.validator.format(\"Please enter a value greater than or equal to {0}.\"),step:a.validator.format(\"Please enter a multiple of {0}.\")},autoCreateRanges:!1,prototype:{init:function(){function b(b){!this.form&&this.hasAttribute(\"contenteditable\")&&(this.form=a(this).closest(\"form\")[0]);var c=a.data(this.form,\"validator\"),d=\"on\"+b.type.replace(/^validate/,\"\"),e=c.settings;e[d]&&!a(this).is(e.ignore)&&e[d].call(c,this,b)}this.labelContainer=a(this.settings.errorLabelContainer),this.errorContext=this.labelContainer.length&&this.labelContainer||a(this.currentForm),this.containers=a(this.settings.errorContainer).add(this.settings.errorLabelContainer),this.submitted={},this.valueCache={},this.pendingRequest=0,this.pending={},this.invalid={},this.reset();var c,d=this.groups={};a.each(this.settings.groups,function(b,c){\"string\"==typeof c&&(c=c.split(/\\s/)),a.each(c,function(a,c){d[c]=b})}),c=this.settings.rules,a.each(c,function(b,d){c[b]=a.validator.normalizeRule(d)}),a(this.currentForm).on(\"focusin.validate focusout.validate keyup.validate\",\":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], [type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], [type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], [type='radio'], [type='checkbox'], [contenteditable]\",b).on(\"click.validate\",\"select, option, [type='radio'], [type='checkbox']\",b),this.settings.invalidHandler&&a(this.currentForm).on(\"invalid-form.validate\",this.settings.invalidHandler),a(this.currentForm).find(\"[required], [data-rule-required], .required\").attr(\"aria-required\",\"true\")},form:function(){return this.checkForm(),a.extend(this.submitted,this.errorMap),this.invalid=a.extend({},this.errorMap),this.valid()||a(this.currentForm).triggerHandler(\"invalid-form\",[this]),this.showErrors(),this.valid()},checkForm:function(){this.prepareForm();for(var a=0,b=this.currentElements=this.elements();b[a];a++)this.check(b[a]);return this.valid()},element:function(b){var c,d,e=this.clean(b),f=this.validationTargetFor(e),g=this,h=!0;return void 0===f?delete this.invalid[e.name]:(this.prepareElement(f),this.currentElements=a(f),d=this.groups[f.name],d&&a.each(this.groups,function(a,b){b===d&&a!==f.name&&(e=g.validationTargetFor(g.clean(g.findByName(a))),e&&e.name in g.invalid&&(g.currentElements.push(e),h=g.check(e)&&h))}),c=this.check(f)!==!1,h=h&&c,c?this.invalid[f.name]=!1:this.invalid[f.name]=!0,this.numberOfInvalids()||(this.toHide=this.toHide.add(this.containers)),this.showErrors(),a(b).attr(\"aria-invalid\",!c)),h},showErrors:function(b){if(b){var c=this;a.extend(this.errorMap,b),this.errorList=a.map(this.errorMap,function(a,b){return{message:a,element:c.findByName(b)[0]}}),this.successList=a.grep(this.successList,function(a){return!(a.name in b)})}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){a.fn.resetForm&&a(this.currentForm).resetForm(),this.invalid={},this.submitted={},this.prepareForm(),this.hideErrors();var b=this.elements().removeData(\"previousValue\").removeAttr(\"aria-invalid\");this.resetElements(b)},resetElements:function(a){var b;if(this.settings.unhighlight)for(b=0;a[b];b++)this.settings.unhighlight.call(this,a[b],this.settings.errorClass,\"\"),this.findByName(a[b].name).removeClass(this.settings.validClass);else a.removeClass(this.settings.errorClass).removeClass(this.settings.validClass)},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(a){var b,c=0;for(b in a)a[b]&&c++;return c},hideErrors:function(){this.hideThese(this.toHide)},hideThese:function(a){a.not(this.containers).text(\"\"),this.addWrapper(a).hide()},valid:function(){return 0===this.size()},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{a(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(\":visible\").focus().trigger(\"focusin\")}catch(a){}},findLastActive:function(){var b=this.lastActive;return b&&1===a.grep(this.errorList,function(a){return a.element.name===b.name}).length&&b},elements:function(){var b=this,c={};return a(this.currentForm).find(\"input, select, textarea, [contenteditable]\").not(\":submit, :reset, :image, :disabled\").not(this.settings.ignore).filter(function(){var d=this.name||a(this).attr(\"name\");return!d&&b.settings.debug&&window.console&&console.error(\"%o has no name assigned\",this),this.hasAttribute(\"contenteditable\")&&(this.form=a(this).closest(\"form\")[0]),!(d in c||!b.objectLength(a(this).rules()))&&(c[d]=!0,!0)})},clean:function(b){return a(b)[0]},errors:function(){var b=this.settings.errorClass.split(\" \").join(\".\");return a(this.settings.errorElement+\".\"+b,this.errorContext)},resetInternals:function(){this.successList=[],this.errorList=[],this.errorMap={},this.toShow=a([]),this.toHide=a([])},reset:function(){this.resetInternals(),this.currentElements=a([])},prepareForm:function(){this.reset(),this.toHide=this.errors().add(this.containers)},prepareElement:function(a){this.reset(),this.toHide=this.errorsFor(a)},elementValue:function(b){var c,d,e=a(b),f=b.type;return\"radio\"===f||\"checkbox\"===f?this.findByName(b.name).filter(\":checked\").val():\"number\"===f&&\"undefined\"!=typeof b.validity?b.validity.badInput?\"NaN\":e.val():(c=b.hasAttribute(\"contenteditable\")?e.text():e.val(),\"file\"===f?\"C:\\\\fakepath\\\\\"===c.substr(0,12)?c.substr(12):(d=c.lastIndexOf(\"/\"),d>=0?c.substr(d+1):(d=c.lastIndexOf(\"\\\\\"),d>=0?c.substr(d+1):c)):\"string\"==typeof c?c.replace(/\\r/g,\"\"):c)},check:function(b){b=this.validationTargetFor(this.clean(b));var c,d,e,f=a(b).rules(),g=a.map(f,function(a,b){return b}).length,h=!1,i=this.elementValue(b);if(\"function\"==typeof f.normalizer){if(i=f.normalizer.call(b,i),\"string\"!=typeof i)throw new TypeError(\"The normalizer should return a string value.\");delete f.normalizer}for(d in f){e={method:d,parameters:f[d]};try{if(c=a.validator.methods[d].call(this,i,b,e.parameters),\"dependency-mismatch\"===c&&1===g){h=!0;continue}if(h=!1,\"pending\"===c)return void(this.toHide=this.toHide.not(this.errorsFor(b)));if(!c)return this.formatAndAdd(b,e),!1}catch(a){throw this.settings.debug&&window.console&&console.log(\"Exception occurred when checking element \"+b.id+\", check the '\"+e.method+\"' method.\",a),a instanceof TypeError&&(a.message+=\".  Exception occurred when checking element \"+b.id+\", check the '\"+e.method+\"' method.\"),a}}if(!h)return this.objectLength(f)&&this.successList.push(b),!0},customDataMessage:function(b,c){return a(b).data(\"msg\"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase())||a(b).data(\"msg\")},customMessage:function(a,b){var c=this.settings.messages[a];return c&&(c.constructor===String?c:c[b])},findDefined:function(){for(var a=0;a<arguments.length;a++)if(void 0!==arguments[a])return arguments[a]},defaultMessage:function(b,c){\"string\"==typeof c&&(c={method:c});var d=this.findDefined(this.customMessage(b.name,c.method),this.customDataMessage(b,c.method),!this.settings.ignoreTitle&&b.title||void 0,a.validator.messages[c.method],\"<strong>Warning: No message defined for \"+b.name+\"</strong>\"),e=/\\$?\\{(\\d+)\\}/g;return\"function\"==typeof d?d=d.call(this,c.parameters,b):e.test(d)&&(d=a.validator.format(d.replace(e,\"{$1}\"),c.parameters)),d},formatAndAdd:function(a,b){var c=this.defaultMessage(a,b);this.errorList.push({message:c,element:a,method:b.method}),this.errorMap[a.name]=c,this.submitted[a.name]=c},addWrapper:function(a){return this.settings.wrapper&&(a=a.add(a.parent(this.settings.wrapper))),a},defaultShowErrors:function(){var a,b,c;for(a=0;this.errorList[a];a++)c=this.errorList[a],this.settings.highlight&&this.settings.highlight.call(this,c.element,this.settings.errorClass,this.settings.validClass),this.showLabel(c.element,c.message);if(this.errorList.length&&(this.toShow=this.toShow.add(this.containers)),this.settings.success)for(a=0;this.successList[a];a++)this.showLabel(this.successList[a]);if(this.settings.unhighlight)for(a=0,b=this.validElements();b[a];a++)this.settings.unhighlight.call(this,b[a],this.settings.errorClass,this.settings.validClass);this.toHide=this.toHide.not(this.toShow),this.hideErrors(),this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return a(this.errorList).map(function(){return this.element})},showLabel:function(b,c){var d,e,f,g,h=this.errorsFor(b),i=this.idOrName(b),j=a(b).attr(\"aria-describedby\");h.length?(h.removeClass(this.settings.validClass).addClass(this.settings.errorClass),h.html(c)):(h=a(\"<\"+this.settings.errorElement+\">\").attr(\"id\",i+\"-error\").addClass(this.settings.errorClass).html(c||\"\"),d=h,this.settings.wrapper&&(d=h.hide().show().wrap(\"<\"+this.settings.wrapper+\"/>\").parent()),this.labelContainer.length?this.labelContainer.append(d):this.settings.errorPlacement?this.settings.errorPlacement.call(this,d,a(b)):d.insertAfter(b),h.is(\"label\")?h.attr(\"for\",i):0===h.parents(\"label[for='\"+this.escapeCssMeta(i)+\"']\").length&&(f=h.attr(\"id\"),j?j.match(new RegExp(\"\\\\b\"+this.escapeCssMeta(f)+\"\\\\b\"))||(j+=\" \"+f):j=f,a(b).attr(\"aria-describedby\",j),e=this.groups[b.name],e&&(g=this,a.each(g.groups,function(b,c){c===e&&a(\"[name='\"+g.escapeCssMeta(b)+\"']\",g.currentForm).attr(\"aria-describedby\",h.attr(\"id\"))})))),!c&&this.settings.success&&(h.text(\"\"),\"string\"==typeof this.settings.success?h.addClass(this.settings.success):this.settings.success(h,b)),this.toShow=this.toShow.add(h)},errorsFor:function(b){var c=this.escapeCssMeta(this.idOrName(b)),d=a(b).attr(\"aria-describedby\"),e=\"label[for='\"+c+\"'], label[for='\"+c+\"'] *\";return d&&(e=e+\", #\"+this.escapeCssMeta(d).replace(/\\s+/g,\", #\")),this.errors().filter(e)},escapeCssMeta:function(a){return a.replace(/([\\\\!\"#$%&'()*+,./:;<=>?@\\[\\]^`{|}~])/g,\"\\\\$1\")},idOrName:function(a){return this.groups[a.name]||(this.checkable(a)?a.name:a.id||a.name)},validationTargetFor:function(b){return this.checkable(b)&&(b=this.findByName(b.name)),a(b).not(this.settings.ignore)[0]},checkable:function(a){return/radio|checkbox/i.test(a.type)},findByName:function(b){return a(this.currentForm).find(\"[name='\"+this.escapeCssMeta(b)+\"']\")},getLength:function(b,c){switch(c.nodeName.toLowerCase()){case\"select\":return a(\"option:selected\",c).length;case\"input\":if(this.checkable(c))return this.findByName(c.name).filter(\":checked\").length}return b.length},depend:function(a,b){return!this.dependTypes[typeof a]||this.dependTypes[typeof a](a,b)},dependTypes:{boolean:function(a){return a},string:function(b,c){return!!a(b,c.form).length},function:function(a,b){return a(b)}},optional:function(b){var c=this.elementValue(b);return!a.validator.methods.required.call(this,c,b)&&\"dependency-mismatch\"},startRequest:function(b){this.pending[b.name]||(this.pendingRequest++,a(b).addClass(this.settings.pendingClass),this.pending[b.name]=!0)},stopRequest:function(b,c){this.pendingRequest--,this.pendingRequest<0&&(this.pendingRequest=0),delete this.pending[b.name],a(b).removeClass(this.settings.pendingClass),c&&0===this.pendingRequest&&this.formSubmitted&&this.form()?(a(this.currentForm).submit(),this.formSubmitted=!1):!c&&0===this.pendingRequest&&this.formSubmitted&&(a(this.currentForm).triggerHandler(\"invalid-form\",[this]),this.formSubmitted=!1)},previousValue:function(b,c){return c=\"string\"==typeof c&&c||\"remote\",a.data(b,\"previousValue\")||a.data(b,\"previousValue\",{old:null,valid:!0,message:this.defaultMessage(b,{method:c})})},destroy:function(){this.resetForm(),a(this.currentForm).off(\".validate\").removeData(\"validator\").find(\".validate-equalTo-blur\").off(\".validate-equalTo\").removeClass(\"validate-equalTo-blur\")}},classRuleSettings:{required:{required:!0},email:{email:!0},url:{url:!0},date:{date:!0},dateISO:{dateISO:!0},number:{number:!0},digits:{digits:!0},creditcard:{creditcard:!0}},addClassRules:function(b,c){b.constructor===String?this.classRuleSettings[b]=c:a.extend(this.classRuleSettings,b)},classRules:function(b){var c={},d=a(b).attr(\"class\");return d&&a.each(d.split(\" \"),function(){this in a.validator.classRuleSettings&&a.extend(c,a.validator.classRuleSettings[this])}),c},normalizeAttributeRule:function(a,b,c,d){/min|max|step/.test(c)&&(null===b||/number|range|text/.test(b))&&(d=Number(d),isNaN(d)&&(d=void 0)),d||0===d?a[c]=d:b===c&&\"range\"!==b&&(a[c]=!0)},attributeRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute(\"type\");for(c in a.validator.methods)\"required\"===c?(d=b.getAttribute(c),\"\"===d&&(d=!0),d=!!d):d=f.attr(c),this.normalizeAttributeRule(e,g,c,d);return e.maxlength&&/-1|2147483647|524288/.test(e.maxlength)&&delete e.maxlength,e},dataRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute(\"type\");for(c in a.validator.methods)d=f.data(\"rule\"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase()),this.normalizeAttributeRule(e,g,c,d);return e},staticRules:function(b){var c={},d=a.data(b.form,\"validator\");return d.settings.rules&&(c=a.validator.normalizeRule(d.settings.rules[b.name])||{}),c},normalizeRules:function(b,c){return a.each(b,function(d,e){if(e===!1)return void delete b[d];if(e.param||e.depends){var f=!0;switch(typeof e.depends){case\"string\":f=!!a(e.depends,c.form).length;break;case\"function\":f=e.depends.call(c,c)}f?b[d]=void 0===e.param||e.param:(a.data(c.form,\"validator\").resetElements(a(c)),delete b[d])}}),a.each(b,function(d,e){b[d]=a.isFunction(e)&&\"normalizer\"!==d?e(c):e}),a.each([\"minlength\",\"maxlength\"],function(){b[this]&&(b[this]=Number(b[this]))}),a.each([\"rangelength\",\"range\"],function(){var c;b[this]&&(a.isArray(b[this])?b[this]=[Number(b[this][0]),Number(b[this][1])]:\"string\"==typeof b[this]&&(c=b[this].replace(/[\\[\\]]/g,\"\").split(/[\\s,]+/),b[this]=[Number(c[0]),Number(c[1])]))}),a.validator.autoCreateRanges&&(null!=b.min&&null!=b.max&&(b.range=[b.min,b.max],delete b.min,delete b.max),null!=b.minlength&&null!=b.maxlength&&(b.rangelength=[b.minlength,b.maxlength],delete b.minlength,delete b.maxlength)),b},normalizeRule:function(b){if(\"string\"==typeof b){var c={};a.each(b.split(/\\s/),function(){c[this]=!0}),b=c}return b},addMethod:function(b,c,d){a.validator.methods[b]=c,a.validator.messages[b]=void 0!==d?d:a.validator.messages[b],c.length<3&&a.validator.addClassRules(b,a.validator.normalizeRule(b))},methods:{required:function(b,c,d){if(!this.depend(d,c))return\"dependency-mismatch\";if(\"select\"===c.nodeName.toLowerCase()){var e=a(c).val();return e&&e.length>0}return this.checkable(c)?this.getLength(b,c)>0:b.length>0},email:function(a,b){return this.optional(b)||/^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(a)},url:function(a,b){return this.optional(b)||/^(?:(?:(?:https?|ftp):)?\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})).?)(?::\\d{2,5})?(?:[/?#]\\S*)?$/i.test(a)},date:function(a,b){return this.optional(b)||!/Invalid|NaN/.test(new Date(a).toString())},dateISO:function(a,b){return this.optional(b)||/^\\d{4}[\\/\\-](0?[1-9]|1[012])[\\/\\-](0?[1-9]|[12][0-9]|3[01])$/.test(a)},number:function(a,b){return this.optional(b)||/^(?:-?\\d+|-?\\d{1,3}(?:,\\d{3})+)?(?:\\.\\d+)?$/.test(a)},digits:function(a,b){return this.optional(b)||/^\\d+$/.test(a)},minlength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||e>=d},maxlength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||e<=d},rangelength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||e>=d[0]&&e<=d[1]},min:function(a,b,c){return this.optional(b)||a>=c},max:function(a,b,c){return this.optional(b)||a<=c},range:function(a,b,c){return this.optional(b)||a>=c[0]&&a<=c[1]},step:function(b,c,d){var e,f=a(c).attr(\"type\"),g=\"Step attribute on input type \"+f+\" is not supported.\",h=[\"text\",\"number\",\"range\"],i=new RegExp(\"\\\\b\"+f+\"\\\\b\"),j=f&&!i.test(h.join()),k=function(a){var b=(\"\"+a).match(/(?:\\.(\\d+))?$/);return b&&b[1]?b[1].length:0},l=function(a){return Math.round(a*Math.pow(10,e))},m=!0;if(j)throw new Error(g);return e=k(d),(k(b)>e||l(b)%l(d)!==0)&&(m=!1),this.optional(c)||m},equalTo:function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.not(\".validate-equalTo-blur\").length&&e.addClass(\"validate-equalTo-blur\").on(\"blur.validate-equalTo\",function(){a(c).valid()}),b===e.val()},remote:function(b,c,d,e){if(this.optional(c))return\"dependency-mismatch\";e=\"string\"==typeof e&&e||\"remote\";var f,g,h,i=this.previousValue(c,e);return this.settings.messages[c.name]||(this.settings.messages[c.name]={}),i.originalMessage=i.originalMessage||this.settings.messages[c.name][e],this.settings.messages[c.name][e]=i.message,d=\"string\"==typeof d&&{url:d}||d,h=a.param(a.extend({data:b},d.data)),i.old===h?i.valid:(i.old=h,f=this,this.startRequest(c),g={},g[c.name]=b,a.ajax(a.extend(!0,{mode:\"abort\",port:\"validate\"+c.name,dataType:\"json\",data:g,context:f.currentForm,success:function(a){var d,g,h,j=a===!0||\"true\"===a;f.settings.messages[c.name][e]=i.originalMessage,j?(h=f.formSubmitted,f.resetInternals(),f.toHide=f.errorsFor(c),f.formSubmitted=h,f.successList.push(c),f.invalid[c.name]=!1,f.showErrors()):(d={},g=a||f.defaultMessage(c,{method:e,parameters:b}),d[c.name]=i.message=g,f.invalid[c.name]=!0,f.showErrors(d)),i.valid=j,f.stopRequest(c,j)}},d)),\"pending\")}}});var b,c={};a.ajaxPrefilter?a.ajaxPrefilter(function(a,b,d){var e=a.port;\"abort\"===a.mode&&(c[e]&&c[e].abort(),c[e]=d)}):(b=a.ajax,a.ajax=function(d){var e=(\"mode\"in d?d:a.ajaxSettings).mode,f=(\"port\"in d?d:a.ajaxSettings).port;return\"abort\"===e?(c[f]&&c[f].abort(),c[f]=b.apply(this,arguments),c[f]):b.apply(this,arguments)})});"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/static/plugins/jquery-validation/messages_zh.js",
    "content": "(function( factory ) {\n\tif ( typeof define === \"function\" && define.amd ) {\n\t\tdefine( [\"jquery\", \"../jquery.validate\"], factory );\n\t} else if (typeof module === \"object\" && module.exports) {\n\t\tmodule.exports = factory( require( \"jquery\" ) );\n\t} else {\n\t\tfactory( jQuery );\n\t}\n}(function( $ ) {\n\n/*\n * Translated default messages for the jQuery validation plugin.\n * Locale: ZH (Chinese, 中文 (Zhōngwén), 汉语, 漢語)\n */\n$.extend( $.validator.messages, {\n\trequired: \"这是必填字段\",\n\tremote: \"请修正此字段\",\n\temail: \"请输入有效的电子邮件地址\",\n\turl: \"请输入有效的网址\",\n\tdate: \"请输入有效的日期\",\n\tdateISO: \"请输入有效的日期 (YYYY-MM-DD)\",\n\tnumber: \"请输入有效的数字\",\n\tdigits: \"只能输入整数\",\n\tcreditcard: \"请输入有效的信用卡号码\",\n\tequalTo: \"你的输入不相同\",\n\textension: \"请输入有效的后缀\",\n\tmaxlength: $.validator.format( \"最多可以输入 {0} 个字符\" ),\n\tminlength: $.validator.format( \"最少要输入 {0} 个字符\" ),\n\trangelength: $.validator.format( \"请输入长度在 {0} 到 {1} 之间的字符串\" ),\n\trange: $.validator.format( \"请输入范围在 {0} 到 {1} 之间的数值\" ),\n\tmax: $.validator.format( \"请输入不大于 {0} 的数值\" ),\n\tmin: $.validator.format( \"请输入不小于 {0} 的数值\" )\n} );\n\n}));"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/templates/easyflow/formtemplate/formTemplateAdd.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\"\n      th:replace=\"layout::html(#{easyflow.form.admin.page.formTemplateAdd.formTemplateAdd},~{},~{}, ~{::.breadcrumb-item},~{::#content},~{},~{::#script})\">\n<body>\n<ol class=\"breadcrumb\">\n    <li class=\"breadcrumb-item active\">[[#{easyflow.form.admin.page.formTemplateAdd.formTemplateAdd}]]</li>\n</ol>\n<div id=\"content\">\n    <nav>\n        <div class=\"nav nav-tabs\" id=\"nav-tab\" role=\"tablist\">\n            <a class=\"nav-link active\" id=\"nav-template-tab\" data-toggle=\"tab\" href=\"#nav-template\"\n               role=\"tab\">[[#{easyflow.form.admin.page.formTemplateAdd.formTemplateDef}]]</a>\n            <a class=\"nav-link\" id=\"nav-demo-tab\" data-toggle=\"tab\" href=\"#nav-demo\" role=\"tab\"\n               aria-controls=\"nav-profile\" aria-selected=\"false\">[[#{easyflow.form.admin.page.formTemplateAdd.formTemplatePreview}]]</a>\n        </div>\n    </nav>\n    <div class=\"tab-content\" id=\"nav-tabContent\">\n        <div class=\"tab-pane fade show active\" id=\"nav-template\" role=\"tabpanel\">\n            <form th:action=\"@{/easyflow/formTemplate/ajax/add}\" method=\"post\" id=\"addForm\"\n                  class=\"j-ajax-form j-form-container j-form-horizontal container-fluid\"\n                  th:data-success-url=\"@{/easyflow/formTemplate/formTemplateList}\">\n                <div class=\"row\">\n                    <div class=\"form-group col\">\n                        <label><span class=\"j-require\">*</span>[[#{easyflow.form.admin.page.formTemplateAdd.templateCode}]]:</label> <input\n                            type=\"text\" name=\"templateCode\" class=\"form-control\"/>\n                    </div>\n                    <div class=\"form-group col\">\n                        <label><span class=\"j-require\">*</span>[[#{easyflow.form.admin.page.formTemplateAdd.templateName}]]:</label>\n                        <input type=\"text\" name=\"templateName\" class=\"form-control\"/>\n\n                    </div>\n                    <div class=\"form-group col\">\n                        <label><span class=\"j-require\">*</span>[[#{easyflow.form.admin.page.formTemplateAdd.status}]]:</label>\n                        <select class=\"form-control\" name=\"status\">\n                            <option value=\"VALID\">[[#{easyflow.form.admin.page.formTemplateAdd.valid}]]</option>\n                            <option value=\"INVALID\">[[#{easyflow.form.admin.page.formTemplateAdd.invalid}]]</option>\n                        </select>\n                    </div>\n\n                </div>\n                <div class=\"row d-none\">\n                    <div class=\"form-group col\">\n                        <label><span class=\"j-require\">*</span>[[#{easyflow.form.admin.page.formTemplateAdd.templateConfigForDeveloper}]]:</label>\n                        <textarea rows=\"10\" cols=\"\" name=\"config\" class=\"form-control\"></textarea>\n                    </div>\n\n                </div>\n\n            </form>\n            <div id=\"pageConfig\"></div>\n            <div class=\"row mt-2\">\n                <div class=\"col text-center\">\n                    <button type=\"submit\" class=\"btn btn-primary j-btn-view\">[[#{easyflow.form.admin.page.formTemplateAdd.viewJsonConfig}]]</button>\n                    <button type=\"submit\" class=\"btn btn-primary j-btn-ok\">[[#{easyflow.form.admin.page.formTemplateAdd.save}]]</button>\n                    <button type=\"button\" class=\"btn btn-secondary j-btn-cancel\">[[#{easyflow.form.admin.page.formTemplateAdd.cancel}]]</button>\n                </div>\n            </div>\n            <div class=\"modal\" tabindex=\"-1\" role=\"dialog\" id=\"modal\">\n                <div class=\"modal-dialog  modal-lg\" role=\"document\">\n                    <div class=\"modal-content\">\n                        <div class=\"modal-header\">\n                            <h5 class=\"modal-title\">[[#{easyflow.form.admin.page.formTemplateAdd.viewConfig}]]</h5>\n                            <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\">\n                                <span aria-hidden=\"true\">&times;</span>\n                            </button>\n                        </div>\n                        <div class=\"modal-body\">\n                            <textarea id='jsonData' class=\"form-control\" rows=\"30\"></textarea>\n                        </div>\n                        <div class=\"modal-footer\">\n                            <button type=\"button\" class=\"btn btn-primary input-config\">[[#{easyflow.form.admin.page.formTemplateAdd.jsonRender}]]</button>\n                            <button type=\"button\" class=\"btn btn-primary save-config\">[[#{easyflow.form.admin.page.formTemplateAdd.save}]]</button>\n                            <button type=\"button\" class=\"btn btn-secondary\" data-dismiss=\"modal\">[[#{easyflow.form.admin.page.formTemplateAdd.close}]]</button>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n        <div class=\"tab-pane fade\" id=\"nav-demo\" role=\"tabpanel\">\n            <div class=\"container-fluid\">\n                <div class=\"row\">\n                    <div class=\"col\">\n                        <h6 class=\"mt-1\">[[#{easyflow.form.admin.page.formTemplateAdd.inputDataToRender}]]:</h6>\n                        <textarea class=\"form-control\" id=\"demoData\"></textarea>\n                        <button class=\"btn btn-primary mt-1 mb-1\" id=\"viewAddDemo\" data-op=\"add\">[[#{easyflow.form.admin.page.formTemplateAdd.addPreview}]]</button>\n                        <button class=\"btn btn-primary mt-1 mb-1\" id=\"viewModifyDemo\" data-op=\"modify\">[[#{easyflow.form.admin.page.formTemplateAdd.editPreview}]]</button>\n                        <button class=\"btn btn-primary mt-1 mb-1\" id=\"viewDetailDemo\" data-op=\"detail\">[[#{easyflow.form.admin.page.formTemplateAdd.viewPreview}]]</button>\n                    </div>\n                </div>\n                <div>\n                    <div id=\"page\"></div>\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n<script type=\"text/javascript\" id=\"script\" th:inline=\"javascript\">\n    activeMenu = \"FORM_TEMPLATE\";\n    var root = \"[(@{/easyflow/formTemplate})]\";\n    var config = {\n        \"type\": \"pageConfig\",\n        \"component\": {\n            \"type\": \"tabsConfig\",\n            \"component\": {\n                \"type\": \"list\",\n                \"addText\": \"[(#{easyflow.form.admin.page.formTemplateAdd.addTab})]\",\n                \"component\": {\n                    \"type\": \"tabConfig\",\n                    \"component\": {\n                        \"type\": \"list\",\n                        \"addText\": \"[(#{easyflow.form.admin.page.formTemplateAdd.addPanel})]\",\n                        \"component\": {\n                            \"type\": \"panelConfig\",\n                            \"component\": {\n                                \"type\": \"list\",\n                                \"addText\": \"[(#{easyflow.form.admin.page.formTemplateAdd.addCard})]\",\n                                \"component\": {\n                                    \"type\": \"cardConfig\",\n                                    \"component\": {\n                                        \"type\": \"list\",\n                                        \"addText\": \"[(#{easyflow.form.admin.page.formTemplateAdd.addItem})]\",\n                                        \"insertRemovePosition\": \"Right\",\n                                        \"component\": {\n                                            \"type\": \"elementConfig\"\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    };\n\n    var pageConfig = new J.PageConfig({config: config, allConfig: config, data: {}, allData: {}});\n    pageConfig.render($(\"#pageConfig\"));\n\n\n    $(\".j-btn-ok\").click(function () {\n        var data = pageConfig.collect({});\n        $(\"textarea[name='config']\").val(JSON.stringify(data));\n        $(\"#addForm\").submit();\n    });\n\n\n    $(\".j-btn-view\").click(function () {\n        var data = pageConfig.collect({});\n        $(\"#jsonData\").val(JSON.stringify(data, null, 2));\n        $('#modal').modal();\n    });\n\n    $(\".save-config\").click(function () {\n        var data = $(\"#jsonData\").val();\n        $(\"textarea[name='config']\").val(data);\n        $(\"#addForm\").submit();\n    });\n    $(\".input-config\").click(function () {\n        $(\"#pageConfig\").empty();\n        var newData = JSON.parse($(\"#jsonData\").val());\n        pageConfig = new J.PageConfig({config: config, allConfig: config, data: newData, allData: newData});\n        pageConfig.render($(\"#pageConfig\"));\n        $('#modal').modal('hide');\n    })\n\n    $(\".j-btn-cancel\").click(function () {\n        window.location.href = root + \"/formTemplateList\";\n    });\n    $(\"#viewAddDemo,#viewModifyDemo,#viewDetailDemo\").click(function () {\n        var op = $(this).data(\"op\");\n        var dataStr = $(\"#demoData\").val();\n        var data = dataStr ? JSON.parse(dataStr) : {};\n        var templateConfig = pageConfig.collect({});\n        $(\"#page\").empty();\n        var page = new J.Page({data: data, ctx: {\"op\": op}, init: false, templates: null, $container: $(\"#page\")});\n        page.loadAndRender(templateConfig);\n    });\n</script>\n</body>\n</html>"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/templates/easyflow/formtemplate/formTemplateDetail.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\"\n      th:replace=\"layout::html(#{easyflow.form.admin.page.formTemplateDetail.formTemplateDetail},~{},~{}, ~{::.breadcrumb-item},~{::#content},~{},~{::#script})\">\n<body>\n<ol class=\"breadcrumb\">\n    <li class=\"breadcrumb-item active\">[[#{easyflow.form.admin.page.formTemplateDetail.formTemplateDetail}]]</li>\n</ol>\n<div id=\"content\">\n    <nav>\n        <div class=\"nav nav-tabs\" id=\"nav-tab\" role=\"tablist\">\n            <a class=\"nav-link active\" id=\"nav-template-tab\" data-toggle=\"tab\" href=\"#nav-template\"\n               role=\"tab\">[[#{easyflow.form.admin.page.formTemplateDetail.formTemplateDef}]]</a>\n            <a class=\"nav-link\" id=\"nav-demo-tab\" data-toggle=\"tab\" href=\"#nav-demo\" role=\"tab\"\n               aria-controls=\"nav-profile\" aria-selected=\"false\">[[#{easyflow.form.admin.page.formTemplateDetail.formTemplatePreview}]]</a>\n        </div>\n    </nav>\n    <div class=\"tab-content\" id=\"nav-tabContent\">\n        <div class=\"tab-pane fade show active\" id=\"nav-template\" role=\"tabpanel\">\n            <form th:action=\"@{/easyflow/formTemplate/ajax/edit}\" method=\"post\" id=\"editForm\"\n                  class=\"j-ajax-form j-form-container j-form-horizontal container-fluid\"\n                  th:data-success-url=\"@{/easyflow/formTemplate/formTemplateList}\">\n                <div class=\"row\">\n                    <div class=\"form-group col\">\n                        <label><span class=\"j-require\">*</span>[[#{easyflow.form.admin.page.formTemplateDetail.templateCode}]]:</label> <input\n                            type=\"text\" name=\"templateCode\" class=\"form-control\" readonly=\"readonly\"\n                            th:value=\"${detail.templateCode}\"/>\n                    </div>\n                    <div class=\"form-group col\">\n                        <label><span class=\"j-require\">*</span>[[#{easyflow.form.admin.page.formTemplateDetail.templateName}]]:</label>\n                        <input type=\"text\" name=\"templateName\" class=\"form-control\" th:value=\"${detail.templateName}\"\n                               readonly=\"readonly\"/>\n\n                    </div>\n                    <div class=\"form-group col\">\n                        <label><span class=\"j-require\">*</span>[[#{easyflow.form.admin.page.formTemplateDetail.status}]]:</label>\n                        <select class=\"form-control\" name=\"status\">\n                            <option value=\"VALID\">[[#{easyflow.form.admin.page.formTemplateDetail.valid}]]</option>\n                            <option value=\"INVALID\">[[#{easyflow.form.admin.page.formTemplateDetail.invalid}]]</option>\n                        </select>\n                    </div>\n\n                </div>\n                <div class=\"row d-none\">\n                    <div class=\"form-group col\">\n                        <label><span class=\"j-require\">*</span>[[#{easyflow.form.admin.page.formTemplateDetail.templateConfigForDeveloper}]]:</label>\n                        <textarea rows=\"10\" cols=\"\" name=\"config\" class=\"form-control\"></textarea>\n                    </div>\n\n                </div>\n\n            </form>\n            <div id=\"pageConfig\"></div>\n            <div class=\"row mt-2\">\n                <div class=\"col text-center\">\n                    <button type=\"submit\" class=\"btn btn-primary j-btn-view\">[[#{easyflow.form.admin.page.formTemplateDetail.viewJsonConfig}]]</button>\n                    <button type=\"button\" class=\"btn btn-secondary j-btn-cancel\">[[#{easyflow.form.admin.page.formTemplateDetail.cancel}]]</button>\n                </div>\n            </div>\n            <div class=\"modal\" tabindex=\"-1\" role=\"dialog\" id=\"modal\">\n                <div class=\"modal-dialog  modal-lg\" role=\"document\">\n                    <div class=\"modal-content\">\n                        <div class=\"modal-header\">\n                            <h5 class=\"modal-title\">[[#{easyflow.form.admin.page.formTemplateDetail.viewConfig}]]</h5>\n                            <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\">\n                                <span aria-hidden=\"true\">&times;</span>\n                            </button>\n                        </div>\n                        <div class=\"modal-body\">\n                            <textarea id='jsonData' class=\"form-control\" rows=\"30\"></textarea>\n                        </div>\n                        <div class=\"modal-footer\">\n                            <button type=\"button\" class=\"btn btn-secondary\" data-dismiss=\"modal\">[[#{easyflow.form.admin.page.formTemplateDetail.close}]]</button>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n        <div class=\"tab-pane fade\" id=\"nav-demo\" role=\"tabpanel\">\n            <div class=\"container-fluid\">\n                <div class=\"row\">\n                    <div class=\"col\">\n                        <h6 class=\"mt-1\">[[#{easyflow.form.admin.page.formTemplateDetail.inputDataToRender}]]:</h6>\n                        <textarea class=\"form-control\" id=\"demoData\"></textarea>\n                        <button class=\"btn btn-primary mt-1 mb-1\" id=\"viewAddDemo\" data-op=\"add\">[[#{easyflow.form.admin.page.formTemplateDetail.addPreview}]]</button>\n                        <button class=\"btn btn-primary mt-1 mb-1\" id=\"viewModifyDemo\" data-op=\"modify\">[[#{easyflow.form.admin.page.formTemplateDetail.editPreview}]]</button>\n                        <button class=\"btn btn-primary mt-1 mb-1\" id=\"viewDetailDemo\" data-op=\"detail\">[[#{easyflow.form.admin.page.formTemplateDetail.viewPreview}]]</button>\n                    </div>\n                </div>\n                <div>\n                    <div id=\"page\"></div>\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n<script type=\"text/javascript\" id=\"script\" th:inline=\"javascript\">\n    activeMenu = \"FORM_TEMPLATE\";\n    var root = \"[(@{/easyflow/formTemplate})]\";\n    var config = {\n        \"type\": \"pageConfig\",\n        \"component\": {\n            \"type\": \"tabsConfig\",\n            \"component\": {\n                \"type\": \"list\",\n                \"addText\": \"[(#{easyflow.form.admin.page.formTemplateDetail.addTab})]\",\n                \"component\": {\n                    \"type\": \"tabConfig\",\n                    \"component\": {\n                        \"type\": \"list\",\n                        \"addText\": \"[(#{easyflow.form.admin.page.formTemplateDetail.addPanel})]\",\n                        \"component\": {\n                            \"type\": \"panelConfig\",\n                            \"component\": {\n                                \"type\": \"list\",\n                                \"addText\": \"[(#{easyflow.form.admin.page.formTemplateDetail.addCard})]\",\n                                \"component\": {\n                                    \"type\": \"cardConfig\",\n                                    \"component\": {\n                                        \"type\": \"list\",\n                                        \"addText\": \"[(#{easyflow.form.admin.page.formTemplateDetail.addItem})]\",\n                                        \"insertRemovePosition\": \"Right\",\n                                        \"component\": {\n                                            \"type\": \"elementConfig\"\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    };\n    var data =/*[(${detail.config})]*/ {};\n    var pageConfig = new J.PageConfig({config: config, allConfig: config, data: data, allData: data});\n    pageConfig.render($(\"#pageConfig\"));\n    $(\"#content input\").attr('readonly', true);\n    $(\"#ccontent textarea\").attr('readonly', true);\n    $('#content select').attr('disabled', true);\n\n    $(\".j-btn-ok\").click(function () {\n        var data = pageConfig.collect({});\n        $(\"textarea[name='config']\").val(JSON.stringify(data, null, 2));\n        $(\"form\").submit();\n    });\n\n    $(\".j-btn-view\").click(function () {\n        var data = pageConfig.collect({});\n        $(\"#jsonData\").val(JSON.stringify(data, null, 2));\n        $('#modal').modal();\n    });\n\n    $(\".save-config\").click(function () {\n        var data = $(\"#jsonData\").val();\n        $(\"textarea[name='config']\").val(data);\n        $(\"form\").submit();\n    });\n\n    $(\".j-btn-cancel\").click(function () {\n        window.location.href = root + \"/formTemplateList\";\n    });\n    $(\"#viewAddDemo,#viewModifyDemo,#viewDetailDemo\").click(function () {\n        var op = $(this).data(\"op\");\n        var dataStr = $(\"#demoData\").val();\n        var data = dataStr ? JSON.parse(dataStr) : {};\n        var templateConfig = pageConfig.collect({});\n        $(\"#page\").empty();\n        var page = new J.Page({data: data, ctx: {\"op\": op}, init: false, templates: null, $container: $(\"#page\")});\n        page.loadAndRender(templateConfig);\n    });\n</script>\n</body>\n</html>"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/templates/easyflow/formtemplate/formTemplateEdit.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\"\n      th:replace=\"layout::html(#{easyflow.form.admin.page.formTemplateEdit.formTemplateEdit},~{},~{}, ~{::.breadcrumb-item},~{::#content},~{},~{::#script})\">\n<body>\n<ol class=\"breadcrumb\">\n    <li class=\"breadcrumb-item active\">[[#{easyflow.form.admin.page.formTemplateEdit.formTemplateEdit}]]</li>\n</ol>\n<div id=\"content\">\n    <nav>\n        <div class=\"nav nav-tabs\" id=\"nav-tab\" role=\"tablist\">\n            <a class=\"nav-link active\" id=\"nav-template-tab\" data-toggle=\"tab\" href=\"#nav-template\"\n               role=\"tab\">[[#{easyflow.form.admin.page.formTemplateEdit.formTemplateDef}]]</a>\n            <a class=\"nav-link\" id=\"nav-demo-tab\" data-toggle=\"tab\" href=\"#nav-demo\" role=\"tab\"\n               aria-controls=\"nav-profile\" aria-selected=\"false\">[[#{easyflow.form.admin.page.formTemplateEdit.formTemplatePreview}]]</a>\n        </div>\n    </nav>\n    <div class=\"tab-content\" id=\"nav-tabContent\">\n        <div class=\"tab-pane fade show active\" id=\"nav-template\" role=\"tabpanel\">\n            <form th:action=\"@{/easyflow/formTemplate/ajax/edit}\" method=\"post\" id=\"editForm\"\n                  class=\"j-ajax-form j-form-container j-form-horizontal container-fluid\"\n                  th:data-success-url=\"@{/easyflow/formTemplate/formTemplateList}\">\n                <div class=\"row\">\n                    <div class=\"form-group col\">\n                        <label><span class=\"j-require\">*</span>[[#{easyflow.form.admin.page.formTemplateEdit.templateCode}]]:</label> <input\n                            type=\"text\" name=\"templateCode\" class=\"form-control\" readonly=\"readonly\"\n                            th:value=\"${detail.templateCode}\"/>\n                    </div>\n                    <div class=\"form-group col\">\n                        <label><span class=\"j-require\">*</span>[[#{easyflow.form.admin.page.formTemplateEdit.templateName}]]:</label>\n                        <input type=\"text\" name=\"templateName\" class=\"form-control\" th:value=\"${detail.templateName}\"/>\n\n                    </div>\n                    <div class=\"form-group col\">\n                        <label><span class=\"j-require\">*</span>[[#{easyflow.form.admin.page.formTemplateEdit.type}]]:</label>\n                        <select class=\"form-control\" name=\"type\">\n                            <option th:each=\"type:${types}\" th:value=\"${type.code}\" th:text=\"${type.desc}\"\n                                    th:selected=\"${detail.type.code == type.code}\"></option>\n                        </select>\n                    </div>\n                    <div class=\"form-group col\">\n                        <label><span class=\"j-require\">*</span>[[#{easyflow.form.admin.page.formTemplateEdit.status}]]:</label>\n                        <select class=\"form-control\" name=\"status\">\n                            <option value=\"VALID\">[[#{easyflow.form.admin.page.formTemplateEdit.valid}]]</option>\n                            <option value=\"INVALID\">[[#{easyflow.form.admin.page.formTemplateEdit.invalid}]]</option>\n                        </select>\n                    </div>\n\n                </div>\n                <div class=\"row d-none dev-config\">\n                    <div class=\"form-group col\">\n                        <label><span class=\"j-require\">*</span>[[#{easyflow.form.admin.page.formTemplateEdit.templateConfigForDeveloper}]]:</label>\n                        <textarea rows=\"10\" cols=\"\" name=\"config\" class=\"form-control\"\n                                  th:text=\"${detail.config}\"></textarea>\n                    </div>\n\n                </div>\n\n            </form>\n            <div id=\"pageConfig\"></div>\n            <div class=\"row mt-2\">\n                <div class=\"col text-center\">\n                    <button type=\"submit\" class=\"btn btn-primary j-btn-view\">[[#{easyflow.form.admin.page.formTemplateEdit.viewJsonConfig}]]</button>\n                    <button type=\"submit\" class=\"btn btn-primary j-btn-ok\">[[#{easyflow.form.admin.page.formTemplateEdit.save}]]</button>\n                    <button type=\"button\" class=\"btn btn-secondary j-btn-cancel\">[[#{easyflow.form.admin.page.formTemplateEdit.cancel}]]</button>\n                </div>\n            </div>\n            <div class=\"modal\" tabindex=\"-1\" role=\"dialog\" id=\"modal\">\n                <div class=\"modal-dialog  modal-lg\" role=\"document\">\n                    <div class=\"modal-content\">\n                        <div class=\"modal-header\">\n                            <h5 class=\"modal-title\">[[#{easyflow.form.admin.page.formTemplateEdit.viewConfig}]]</h5>\n                            <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\">\n                                <span aria-hidden=\"true\">&times;</span>\n                            </button>\n                        </div>\n                        <div class=\"modal-body\">\n                            <textarea id='jsonData' class=\"form-control\" rows=\"30\"></textarea>\n                        </div>\n                        <div class=\"modal-footer\">\n                            <button type=\"button\" class=\"btn btn-primary input-config\">[[#{easyflow.form.admin.page.formTemplateEdit.jsonRender}]]</button>\n                            <button type=\"button\" class=\"btn btn-primary save-config\">[[#{easyflow.form.admin.page.formTemplateEdit.save}]]</button>\n                            <button type=\"button\" class=\"btn btn-secondary\" data-dismiss=\"modal\">[[#{easyflow.form.admin.page.formTemplateEdit.close}]]</button>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n        <div class=\"tab-pane fade\" id=\"nav-demo\" role=\"tabpanel\">\n            <div class=\"container-fluid\">\n                <div class=\"row\">\n                    <div class=\"col\">\n                        <h6 class=\"mt-1\">[[#{easyflow.form.admin.page.formTemplateEdit.inputDataToRender}]]:</h6>\n                        <textarea class=\"form-control\" id=\"demoData\"></textarea>\n                        <button class=\"btn btn-primary mt-1 mb-1\" id=\"viewAddDemo\" data-op=\"add\">[[#{easyflow.form.admin.page.formTemplateEdit.addPreview}]]</button>\n                        <button class=\"btn btn-primary mt-1 mb-1\" id=\"viewModifyDemo\" data-op=\"modify\">[[#{easyflow.form.admin.page.formTemplateEdit.editPreview}]]</button>\n                        <button class=\"btn btn-primary mt-1 mb-1\" id=\"viewDetailDemo\" data-op=\"detail\">[[#{easyflow.form.admin.page.formTemplateEdit.viewPreview}]]</button>\n                    </div>\n                </div>\n                <div>\n                    <div id=\"page\"></div>\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n<script type=\"text/javascript\" id=\"script\" th:inline=\"javascript\">\n    activeMenu = \"FORM_TEMPLATE\";\n    var root = \"[(@{/easyflow/formTemplate})]\";\n    var config = {\n        \"type\": \"pageConfig\",\n        \"component\": {\n            \"type\": \"tabsConfig\",\n            \"component\": {\n                \"type\": \"list\",\n                \"addText\": \"[(#{easyflow.form.admin.page.formTemplateEdit.addTab})]\",\n                \"component\": {\n                    \"type\": \"tabConfig\",\n                    \"component\": {\n                        \"type\": \"list\",\n                        \"addText\": \"[(#{easyflow.form.admin.page.formTemplateEdit.addPanel})]\",\n                        \"component\": {\n                            \"type\": \"panelConfig\",\n                            \"component\": {\n                                \"type\": \"list\",\n                                \"addText\": \"[(#{easyflow.form.admin.page.formTemplateEdit.addCard})]\",\n                                \"component\": {\n                                    \"type\": \"cardConfig\",\n                                    \"component\": {\n                                        \"type\": \"list\",\n                                        \"addText\": \"[(#{easyflow.form.admin.page.formTemplateEdit.addItem})]\",\n                                        \"insertRemovePosition\": \"Right\",\n                                        \"component\": {\n                                            \"type\": \"elementConfig\"\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    };\n    var data =/*[(${detail.config})]*/ {};\n    var pageConfig = null;\n    var render = window.location.search.indexOf(\"_norender_\") < 0;\n    if (render) {\n        pageConfig = new J.PageConfig({config: config, allConfig: config, data: data, allData: data});\n        pageConfig.render($(\"#pageConfig\"));\n    } else {\n        $(\".j-btn-view\").hide();\n        $(\".dev-config\").removeClass(\"d-none\");\n    }\n\n    $(\".j-btn-ok\").click(function () {\n        if (render) {\n            var data = pageConfig.collect({});\n            $(\"textarea[name='config']\").val(JSON.stringify(data, null, 2));\n        }\n        $(\"#editForm\").submit();\n    });\n\n    $(\".j-btn-view\").click(function () {\n        var data = pageConfig.collect({});\n        $(\"#jsonData\").val(JSON.stringify(data, null, 2));\n        $('#modal').modal();\n    });\n\n    $(\".save-config\").click(function () {\n        var data = $(\"#jsonData\").val();\n        $(\"textarea[name='config']\").val(data);\n        $(\"#editForm\").submit();\n    });\n    $(\".input-config\").click(function () {\n        $(\"#pageConfig\").empty();\n        var newData = JSON.parse($(\"#jsonData\").val());\n        pageConfig = new J.PageConfig({config: config, allConfig: config, data: newData, allData: newData});\n        pageConfig.render($(\"#pageConfig\"));\n        $('#modal').modal('hide');\n    })\n\n    $(\".j-btn-cancel\").click(function () {\n        window.location.href = root + \"/formTemplateList\";\n    });\n    $(\"#viewAddDemo,#viewModifyDemo,#viewDetailDemo\").click(function () {\n        var op = $(this).data(\"op\");\n        var dataStr = $(\"#demoData\").val();\n        var data = dataStr ? JSON.parse(dataStr) : {};\n        var templateConfig = pageConfig.collect({});\n        $(\"#page\").empty();\n        var page = new J.Page({data: data, ctx: {\"op\": op}, init: false, templates: null, $container: $(\"#page\")});\n        page.loadAndRender(templateConfig);\n    });\n</script>\n</body>\n</html>"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/templates/easyflow/formtemplate/formTemplateList.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\"\n      th:replace=\"layout::html(#{easyflow.form.admin.page.formTemplateList.formTemplate},~{},~{}, ~{::.breadcrumb-item},~{::#content},~{},~{::#script})\">\n<body>\n<ol class=\"breadcrumb\">\n    <li class=\"breadcrumb-item active\">[[#{easyflow.form.admin.page.formTemplateList.formTemplate}]]</li>\n</ol>\n<div id=\"content\">\n    <div id=\"tabs\">\n        <div id=\"tableContainer\">\n            <!-- Search -->\n            <form id=\"search\" class=\"card j-form-horizontal\">\n                <div class=\"card-body\">\n                    <div class=\"form-row\">\n                        <div class=\"form-group col\">\n                            <label>[[#{easyflow.form.admin.page.formTemplateList.templateCode}]]:</label><input type=\"text\" class=\"form-control\" name=\"templateCode\"/>\n                        </div>                         \n                    </div>\n                    <div class=\"form-row\">\n                        <div class=\"col text-center\">\n                            <button id=\"query\" class=\"btn btn-primary\">[[#{easyflow.form.admin.page.formTemplateList.query}]]</button>\n                            <button id=\"reset\" class=\"btn btn-secondary\">[[#{easyflow.form.admin.page.formTemplateList.reset}]]</button>\n                        </div>\n                    </div>\n                </div>\n            </form>\n            <!-- Toolbar -->\n            <div id=\"toolbar\">\n                <div class=\"btn-group\" role=\"group\">\n                    <button type=\"button\" class=\"btn btn-secondary\" id=\"addBtn\">[[#{easyflow.form.admin.page.formTemplateList.add}]]</button>\n                </div>\n            </div>\n            <!-- Table -->\n            <table id=\"datatable\"></table>\n        </div>\n    </div>\n</div>\n<script type=\"text/javascript\" id=\"script\" th:inline=\"javascript\">\n    $(\"#tabs\").jTabs().jTabs(\"open\", {id: \"tab-table\", name: \"[(#{easyflow.form.admin.page.formTemplateList.formTemplateList})]\", element: $(\"#tableContainer\"), closeable: false});\n\n    var queryParam = {};\n\n    function reset() {\n        $(\"#search .form-control\").val(\"\");\n        queryParam = $(\"#search\").serializeObject();\n    };\n    reset();\n    $(\"#query\").click(function () {\n        queryParam = $(\"#search\").serializeObject();\n        $('#datatable').bootstrapTable(\"refresh\");\n        return false;\n    });\n    $(\"#reset\").click(function () {\n        reset();\n        return false;\n    });\n    var root = \"[(@{/easyflow/formTemplate})]\";\n    $('#datatable').bootstrapTable({\n        url: root + \"/ajax/getListData\",\n        toolbar: \"#toolbar\",\n        sortName: \"createdDate\",\n        sortOrder: \"desc\",\n        columns: [\n            {radio: true},\n            {\n                field: 'templateCode', title: '[(#{easyflow.form.admin.page.formTemplateList.templateCode})]', formatter: function (data, item) {\n                    return \"<button type='button' class='btn btn-link j-op detailBtn' data-record-id='\" + item.templateCode + \"'>\" + data + \"</button>\";\n                }\n            },\n            {field: 'templateName', title: '[(#{easyflow.form.admin.page.formTemplateList.templateName})]'},\n            {field: 'state', title: '[(#{easyflow.form.admin.page.formTemplateList.state})]', formatter:function(data){\n                return {\"VALID\":\"[(#{easyflow.form.admin.page.formTemplateList.valid})]\",\"INVALID\":\"[(#{easyflow.form.admin.page.formTemplateList.invalid})]\"}[data];\n            }},\n            {field: 'createdDate', title: '[(#{easyflow.form.admin.page.formTemplateList.createdDate})]', sortable: true},\n            {field: 'modifiedDate', title: '[(#{easyflow.form.admin.page.formTemplateList.modifiedDate})]', sortable: true},\n            {\n                field: 'op', title: '[(#{easyflow.form.admin.page.formTemplateList.op})]', formatter: function (data, item) {\n                    var content = ''\n                        + \"<button type='button' class='btn btn-link j-op editBtn' data-record-id='\" + item.templateCode + \"'>[(#{easyflow.form.admin.page.formTemplateList.edit})]</button>\"\n                    return content;\n                }\n            }\n        ],\n        queryParams: function (param) {\n            $.extend(param, queryParam);\n            return param;\n        }\n    });\n\n    $(\"#datatable\").on(\"click\", \".detailBtn\", function () {\n        var templateCode = $(this).text();\n        window.location.href = root + \"/formTemplateDetail?templateCode=\" + $(this).data(\"record-id\");\n        return false;\n    });\n    $(\"#addBtn\").on(\"click\", function () {\n    \t window.location.href = root + \"/formTemplateAdd\";\n    });\n\n    $(\"#datatable\").on(\"click\", \".editBtn\", function () {\n    \twindow.location.href = root + \"/formTemplateEdit?templateCode=\" + $(this).data(\"record-id\");\n    });\n\n</script>\n</body>\n</html>"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/templates/easyflow/process/processdefinition/processDefinitionAdd.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\"\n    xmlns:sec=\"http://www.thymeleaf.org/thymeleaf-extras-springsecurity5\"\n    th:replace=\"layout::html(#{easyflow.process.admin.page.processDefinitionAdd.processDefinition},~{::link},~{}, ~{::.breadcrumb-item},~{::#content},~{::.script},~{::#script})\">\n<head>\n    <link rel=\"stylesheet\" th:href=\"@{/static/plugins/bpmnjs/assets/diagram-js.css}\">\n    <link rel=\"stylesheet\" th:href=\"@{/static/plugins/bpmnjs/assets/bpmn-js.css}\">\n    <link rel=\"stylesheet\" th:href=\"@{/static/plugins/bpmnjs/assets/bpmn-font/css/bpmn.css}\">\n    <link rel=\"stylesheet\" th:href=\"@{/static/plugins/flow/flow.css}\">\n</head>\n<body>\n    <ol class=\"breadcrumb\">\n        <li class=\"breadcrumb-item active\" th:text=\"#{easyflow.process.admin.processDefinitionAdd}\"></li>\n    </ol>\n    <div id=\"content\">\n  <form th:action=\"@{/easyflow/processDefinition/ajax/add}\" method=\"post\" id=\"addForm\" class=\"j-ajax-form j-form-container j-form-horizontal container-fluid\"\n  th:data-success-url=\"@{/easyflow/processDefinition/list}\">\n  <input type=\"hidden\" name=\"defId\"/>\n  <input type=\"hidden\" name=\"defName\"/>\n  <input type=\"hidden\" name=\"bizType\"/>\n  <input type=\"hidden\" name=\"category\"/>\n  <input type=\"hidden\" name=\"format\"/>\n  <input type=\"hidden\" name=\"bpmnXmlData\"/>\n  <input type=\"hidden\" name=\"jsonData\"/>\n  <input type=\"hidden\" name=\"plantUmlData\"/>\n    </form>  \n    <div id=\"flowControl\"></div> \n    <div class=\"row mt-2\">\n        <div class=\"col text-center\">\n            <button type=\"submit\" class=\"btn btn-primary j-btn-ok j-btn-save-flow\">[[#{easyflow.process.admin.page.processDefinitionAdd.save}]]</button>\n            <button type=\"button\" class=\"btn btn-secondary j-btn-cancel\">[[#{easyflow.process.admin.page.processDefinitionAdd.cancel}]]</button>\n        </div>\n    </div>      \n    </div>\n    <script type=\"text/javascript\" th:src=\"@{/static/plugins/bpmnjs/bpmn-navigated-viewer.development.js}\" class=\"script\"></script>\n    <script type=\"text/javascript\" th:src=\"@{/static/plugins/bpmnjs/bpmn-modeler.development.js}\" class=\"script\"></script>\n    <script type=\"text/javascript\" th:src=\"@{/static/plugins/flow/bpmn.js}\" class=\"script\"></script>\n    <script type=\"text/javascript\" th:src=\"@{/static/plugins/flow/flow.js}\" class=\"script\"></script>\n    <script type=\"text/javascript\" id=\"script\" th:inline=\"javascript\">\n\n    var flowBizType={};\n    var flowCategory={};\n    var flowControl = new J.FlowControl({$container: $(\"#flowControl\")});\n    var root = \"[(@{/easyflow/processDefinition})]\";\n    flowControl.render();\n    $(\".j-btn-save-flow\").click(async function(){\n    \tvar controlData = await flowControl.collect();\n    \t    $(\"[name='defId']\").val(controlData.defId);\n    \t    $(\"[name='defName']\").val(controlData.defName);\n    \t    $(\"[name='format']\").val(controlData.format);\n    \t    $(\"[name='bizType']\").val(controlData.bizType);\n    \t    $(\"[name='category']\").val(controlData.category);\n    \t    $(\"[name='bpmnXmlData']\").val(controlData.bpmnXmlData);\n    \t    $(\"[name='jsonData']\").val(controlData.jsonData);\n            $(\"#addForm\").submit();\n    });\n    $(\".j-btn-cancel\").click(function(){\n        window.location.href=root + \"/list\";\n    });\n    </script>\n</body>\n</html>"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/templates/easyflow/process/processdefinition/processDefinitionDetail.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\"\n      xmlns:sec=\"http://www.thymeleaf.org/thymeleaf-extras-springsecurity5\"\n      th:replace=\"layout::html(#{easyflow.process.admin.page.processDefinitionDetail.processDefinition},~{::link},~{}, ~{::.breadcrumb-item},~{::#content},~{::.script},~{::#script})\">\n\n\n<head>\n    <link rel=\"stylesheet\" th:href=\"@{/static/plugins/bpmnjs/assets/diagram-js.css}\">\n    <link rel=\"stylesheet\" th:href=\"@{/static/plugins/bpmnjs/assets/bpmn-js.css}\">        \n    <link rel=\"stylesheet\" th:href=\"@{/static/plugins/bpmnjs/assets/bpmn-font/css/bpmn.css}\">\n    <link rel=\"stylesheet\" th:href=\"@{/static/plugins/flow/flow.css}\">\n</head>\n<body>\n<ol class=\"breadcrumb\">\n    <li class=\"breadcrumb-item active\">[[#{easyflow.process.admin.page.processDefinitionDetail.defView}]]</li>\n</ol>\n<div id=\"content\">\n    <form th:action=\"@{/processDefinition/ajax/edit}\" method=\"post\" id=\"addForm\"\n          class=\"j-ajax-form j-form-container j-form-horizontal container-fluid\"\n          th:data-success-url=\"@{/processDefinition/list}\">\n        <input type=\"hidden\" name=\"defId\"/>\n        <input type=\"hidden\" name=\"defName\"/>\n        <input type=\"hidden\" name=\"defType\"/>\n        <input type=\"hidden\" name=\"bizType\"/>\n        <input type=\"hidden\" name=\"category\"/>\n        <input type=\"hidden\" name=\"format\"/>\n        <input type=\"hidden\" name=\"bpmnXmlData\"/>\n        <input type=\"hidden\" name=\"jsonData\"/>\n        <input type=\"hidden\" name=\"plantUmlData\"/>\n    </form>\n    <div id=\"flowControl\"></div>\n    <div id=\"page\"></div>\n    <div class=\"row mt-2\">\n        <div class=\"col text-center\">\n            <button type=\"button\" class=\"btn btn-secondary j-btn-cancel\">[[#{easyflow.process.admin.page.processDefinitionDetail.return}]]</button>\n        </div>\n    </div>\n</div>\n<script type=\"text/javascript\" th:src=\"@{/static/plugins/bpmnjs/bpmn-navigated-viewer.development.js}\"\n        class=\"script\"></script>\n<script type=\"text/javascript\" th:src=\"@{/static/plugins/bpmnjs/bpmn-modeler.development.js}\"\n        class=\"script\"></script>\n<script type=\"text/javascript\" th:src=\"@{/static/plugins/flow/bpmn.js}\" class=\"script\"></script>\n<script type=\"text/javascript\" th:src=\"@{/static/plugins/flow/flow.js}\" class=\"script\"></script>\n<script type=\"text/javascript\" id=\"script\" th:inline=\"javascript\">\n    activeMenu = \"PROCESS_DEF\";\n    var defData = /*[(${defData})]*/ {};\n    var flowBizType = {};\n    var flowCategory={};\n    var flowControl = new J.FlowControl({$container: $(\"#flowControl\"), data: defData, mode: \"view\"});\n    flowControl.render();\n    var root = \"[(@{/easyflow/processDefinition})]\";\n    $(\".j-btn-ok\").click(async function () {\n        var controlData = await flowControl.collect();\n        $(\"[name='defId']\").val(controlData.defId);\n        $(\"[name='defName']\").val(controlData.defName);\n        $(\"[name='defType']\").val(controlData.defType);\n        $(\"[name='bizType']\").val(controlData.bizType);\n        $(\"[name='category']\").val(controlData.category);\n        $(\"[name='format']\").val(controlData.format);\n        $(\"[name='bpmnXmlData']\").val(controlData.bpmnXmlData);\n        $(\"[name='jsonData']\").val(controlData.jsonData);\n        $(\"#addForm\").submit();\n    });\n    $(\".j-btn-cancel\").click(function () {\n        window.location.href = root + \"/list\";\n    });\n</script>\n</body>\n</html>"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/templates/easyflow/process/processdefinition/processDefinitionEdit.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\"\n      xmlns:sec=\"http://www.thymeleaf.org/thymeleaf-extras-springsecurity5\"\n      th:replace=\"layout::html(#{easyflow.process.admin.page.processDefinitionEdit.processDefinition},~{::link},~{}, ~{::.breadcrumb-item},~{::#content},~{::.script},~{::#script})\">\n<head>\n    <link rel=\"stylesheet\" th:href=\"@{/static/plugins/bpmnjs/assets/diagram-js.css}\">\n    <link rel=\"stylesheet\" th:href=\"@{/static/plugins/bpmnjs/assets/bpmn-js.css}\">            \n    <link rel=\"stylesheet\" th:href=\"@{/static/plugins/bpmnjs/assets/bpmn-font/css/bpmn.css}\">\n    <link rel=\"stylesheet\" th:href=\"@{/static/plugins/flow/flow.css}\">\n</head>\n<body>\n<ol class=\"breadcrumb\">\n    <li class=\"breadcrumb-item active\">[[#{easyflow.process.admin.page.processDefinitionEdit.defEdit}]]</li>\n</ol>\n<div id=\"content\">\n    <form th:action=\"@{/easyflow/processDefinition/ajax/edit}\" method=\"post\" id=\"editForm\" class=\"j-ajax-form j-form-container j-form-horizontal container-fluid\"\n          th:data-success-url=\"@{/easyflow/processDefinition/list}\">\n        <input type=\"hidden\" name=\"defId\"/>\n        <input type=\"hidden\" name=\"defVersion\" th:value=\"${definition.defVersion}\"/>\n        <input type=\"hidden\" name=\"defName\"/>\n        <input type=\"hidden\" name=\"bizType\"/>\n        <input type=\"hidden\" name=\"category\"/>\n        <input type=\"hidden\" name=\"format\"/>\n        <input type=\"hidden\" name=\"bpmnXmlData\"/>\n        <input type=\"hidden\" name=\"jsonData\"/>\n        <input type=\"hidden\" name=\"plantUmlData\"/>\n    </form>\n    <div id=\"flowControl\"></div>\n    <div class=\"row mt-2\">\n        <div class=\"col text-center\">\n            <button type=\"submit\" class=\"btn btn-danger j j-btn-forceUpdate-flow\" data-toggle=\"tooltip\" th:title=\"#{easyflow.process.admin.page.processDefinitionEdit.forceUpdateTitle}\" >[[#{easyflow.process.admin.page.processDefinitionEdit.updateCurrentVersion}]]</button>\n            <button type=\"submit\" class=\"btn btn-primary j-btn-ok j-btn-save-flow\">[[#{easyflow.process.admin.page.processDefinitionEdit.save}]]</button>\n            <button type=\"button\" class=\"btn btn-secondary j-btn-cancel\">[[#{easyflow.process.admin.page.processDefinitionEdit.cancel}]]</button>\n        </div>\n    </div>\n</div>\n<script type=\"text/javascript\" th:src=\"@{/static/plugins/bpmnjs/bpmn-navigated-viewer.development.js}\" class=\"script\"></script>\n<script type=\"text/javascript\" th:src=\"@{/static/plugins/bpmnjs/bpmn-modeler.development.js}\" class=\"script\"></script>\n<script type=\"text/javascript\" th:src=\"@{/static/plugins/flow/bpmn.js}\" class=\"script\"></script>\n<script type=\"text/javascript\" th:src=\"@{/static/plugins/flow/flow.js}\" class=\"script\"></script>\n<script type=\"text/javascript\" id=\"script\" th:inline=\"javascript\">\n    var defData = /*[(${defData})]*/ {};\n    var originalDefId = defData.defId;\n    var flowBizType={};\n    var flowCategory={};\n    var flowControl = new J.FlowControl({$container: $(\"#flowControl\"), data:defData, mode:\"edit\"});\n    var root = \"[(@{/easyflow/processDefinition})]\";\n    flowControl.render();\n    $(\".j-btn-save-flow\").click(async function(){\n        var controlData = await flowControl.collect();\n        if (controlData.defId != originalDefId) {\n            alert(\"process id cannot change!\");\n            return;\n        }\n        $(\"[name='defId']\").val(controlData.defId);\n        $(\"[name='defName']\").val(controlData.defName);\n        $(\"[name='bizType']\").val(controlData.bizType);\n        $(\"[name='category']\").val(controlData.category);\n        $(\"[name='format']\").val(controlData.format);\n        $(\"[name='bpmnXmlData']\").val(controlData.bpmnXmlData);\n        $(\"[name='jsonData']\").val(controlData.jsonData);\n        var updateUrl = \"[(@{/easyflow/processDefinition/ajax/edit})]\";\n        $(\"#editForm\").attr('action', updateUrl); \n        $(\"#editForm\").submit();\n    });\n    $(\".j-btn-forceUpdate-flow\").click(async function(){\n        var controlData = await flowControl.collect();\n        $(\"[name='defId']\").val(controlData.defId);\n        if (controlData.defId != originalDefId) {\n            alert(\"process id cannot change!\");\n            return;\n        }     \n        $(\"[name='defName']\").val(controlData.defName);\n        $(\"[name='bizType']\").val(controlData.bizType);\n        $(\"[name='category']\").val(controlData.category);\n        $(\"[name='format']\").val(controlData.format);\n        $(\"[name='bpmnXmlData']\").val(controlData.bpmnXmlData);\n        $(\"[name='jsonData']\").val(controlData.jsonData);\n        var forceUpdateUrl = \"[(@{/easyflow/processDefinition/ajax/forceUpdate})]\";\n        $(\"#editForm\").attr('action', forceUpdateUrl); \n        $(\"#editForm\").submit();\n    });\n    $(\".j-btn-cancel\").click(function(){\n        window.location.href=root + \"/list\";\n    });\n</script>\n</body>\n</html>"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/templates/easyflow/process/processdefinition/processDefinitionList.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\"\n      th:replace=\"layout::html(#{easyflow.process.admin.page.processDefinitionList.processDefinition},~{},~{}, ~{::.breadcrumb-item},~{::#content},~{},~{::#script})\">\n<body>\n<ol class=\"breadcrumb\">\n    <li class=\"breadcrumb-item active\">[[#{easyflow.process.admin.page.processDefinitionList.processDefinition}]]</li>\n</ol>\n<div id=\"content\">\n    <div id=\"tabs\">\n        <div id=\"tableContainer\">\n            <!-- Search -->\n            <form id=\"search\" class=\"card j-form-horizontal\">\n                <div class=\"card-body\">\n                    <div class=\"form-row\">\n                        <div class=\"form-group col\">\n                            <label>[[#{easyflow.process.admin.page.processDefinitionList.defId}]]:</label><input name=\"defId\" class=\"form-control\"></input>\n                        </div>\n                        <div class=\"form-group col\">\n                            <label>[[#{easyflow.process.admin.page.processDefinitionList.bizType}]]:</label><input type=\"text\" name=\"bizType\" class=\"form-control\"/>\n                        </div>\n                        <div class=\"form-group col\">\n                            <label>[[#{easyflow.process.admin.page.processDefinitionList.category}]]:</label><input name=\"category\" class=\"form-control\"/>\n                        </div>                        \n                        <div class=\"form-group col\">\n                            <label>[[#{easyflow.process.admin.page.processDefinitionList.format}]]:</label><select name=\"format\" class=\"form-control\">\n                            <option value=\"\">[[#{easyflow.process.admin.page.processDefinitionList.formatAll}]]</option>\n                            <option value=\"FLOW-easy\">[[#{easyflow.process.admin.page.processDefinitionList.formatFlowEasy}]]</option>\n                            <option value=\"FLOW-bpmn\">[[#{easyflow.process.admin.page.processDefinitionList.formatFlowBpmn}]]</option>\n                            <option value=\"FSM-easy\">[[#{easyflow.process.admin.page.processDefinitionList.formatFsmEasy}]]</option>\n                        </select>\n                        </div>\n                        <div class=\"form-group col\">\n                            <label>[[#{easyflow.process.admin.page.processDefinitionList.latest}]]:</label><select name=\"latest\" class=\"form-control\">\n                            <option value=\"\">[[#{easyflow.process.admin.page.processDefinitionList.latestAll}]]</option>\n                            <option value=1>[[#{easyflow.process.admin.page.processDefinitionList.latestOnly}]]</option>\n                        </select>\n                        </div>\n                    </div>\n                    <div class=\"form-row\">\n                        <div class=\"col text-center\">\n                            <button id=\"query\" class=\"btn btn-primary\">[[#{easyflow.process.admin.page.processDefinitionList.query}]]</button>\n                            <button id=\"reset\" class=\"btn btn-secondary\">[[#{easyflow.process.admin.page.processDefinitionList.reset}]]</button>\n                        </div>\n                    </div>\n                </div>\n            </form>\n            <!-- Toolbar -->\n            <div id=\"toolbar\">\n                <div class=\"btn-group\" role=\"group\">\n                    <button type=\"button\" class=\"btn btn-secondary\" id=\"addBtn\">[[#{easyflow.process.admin.page.processDefinitionList.add}]]</button>\n                </div>\n            </div>\n            <!-- Table -->\n            <table id=\"datatable\"></table>\n        </div>\n    </div>\n\n</div>\n<script type=\"text/javascript\" id=\"script\" th:inline=\"javascript\">\n    $(\"#tabs\").jTabs().jTabs(\"open\", {id: \"tab-table\", name: \"[(#{easyflow.process.admin.page.processDefinitionList.processDefinitionList})]\", element: $(\"#tableContainer\"), closeable: false});\n    var queryParam = {};\n\n    function reset() {\n        $(\"#search .form-control\").val(\"\");\n        queryParam = $(\"#search\").serializeObject();\n    };\n    reset();\n    $(\"#query\").click(function () {\n        queryParam = $(\"#search\").serializeObject();\n        $('#datatable').bootstrapTable(\"refresh\");\n        return false;\n    });\n    $(\"#reset\").click(function () {\n        reset();\n        return false;\n    });\n    var root = \"[(@{/easyflow/processDefinition})]\";\n    $('#datatable').bootstrapTable({\n        url: root + \"/ajax/getListData\",\n        toolbar: \"#toolbar\",\n        sortName: \"createdDate\",\n        sortOrder: \"desc\",\n        columns: [\n            {radio: true},\n            {\n                field: 'defId', title: '[(#{easyflow.process.admin.page.processDefinitionList.defId})]', formatter: function (data, item) {\n                    return \"<a class='j-op detailBtn' data-def_id='\" + item.defId + \"' data-def_version='\" + item.defVersion + \"'>\" + data + \"</a>\";\n                }\n            },\n            {field: 'defName', title: '[(#{easyflow.process.admin.page.processDefinitionList.defName})]'},\n            {field: 'defVersion', title: '[(#{easyflow.process.admin.page.processDefinitionList.defVersion})]'},\n            {field: 'format', title: '[(#{easyflow.process.admin.page.processDefinitionList.defFormat})]', formatter:function(data){\n                    return {\"FLOW-bpmn\":\"[(#{easyflow.process.admin.page.processDefinitionList.formatFlowBpmn})]\",\"FLOW-easy\":\"[(#{easyflow.process.admin.page.processDefinitionList.formatFlowEasy})]\",\"FSM-easy\":\"[(#{easyflow.process.admin.page.processDefinitionList.formatFsmEasy})]\"}[data];\n                }},\n            {field: 'bizType', title: '[(#{easyflow.process.admin.page.processDefinitionList.bizType})]'},\n            {field: 'category', title: '[(#{easyflow.process.admin.page.processDefinitionList.category})]'},\n            {field: 'latest', title: '[(#{easyflow.process.admin.page.processDefinitionList.latest})]', formatter:function(data){\n                    return {\"true\":\"[(#{easyflow.process.admin.page.processDefinitionList.latestYes})]\",\"false\":\"[(#{easyflow.process.admin.page.processDefinitionList.latestNo})]\"}[data];\n                }},\n            {field: 'createdDate', title: '[(#{easyflow.process.admin.page.processDefinitionList.createdDate})]',sortable: true},\n            {field: 'modifiedDate', title: '[(#{easyflow.process.admin.page.processDefinitionList.modifiedDate})]',sortable: true},\n            {\n                field: 'op', title: '[(#{easyflow.process.admin.page.processDefinitionList.op})]', formatter: function (data, item) {\n                    var content = ''\n                            + \"<button type='button' class='btn btn-link j-op editBtn' data-def_id='\" + item.defId + \"' data-def_version='\" + (item.defVersion==undefined?\"null\":item.defVersion) + \"'>[(#{easyflow.process.admin.page.processDefinitionList.edit})]</button>\"\n                    return content;\n                }\n            }\n        ],\n        queryParams: function (param) {\n            $.extend(param, queryParam);\n            return param;\n        }\n    });\n\n    $(\"#datatable\").on(\"click\", \".detailBtn\", function () {\n        window.location.href = root + \"/detail?defId=\" + $(this).data(\"def_id\") +\"&defVersion=\" +($(this).data(\"def_version\") == null ? \"\" : $(this).data(\"def_version\"));\n        return false;\n    });\n    $(\"#addBtn\").on(\"click\", function () {\n        window.location.href = root + \"/add\";\n    });\n\n    $(\"#datatable\").on(\"click\", \".editBtn\", function () {\n        window.location.href = root + \"/edit?defId=\" + $(this).data(\"def_id\") +\"&defVersion=\" +($(this).data(\"def_version\") == null ? \"\" : $(this).data(\"def_version\"));\n    });\n\n</script>\n</body>\n</html>"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/templates/easyflow/process/processdefinition/processSelectFrame.html",
    "content": "<div th:id=\"'tableContainer'+${selectId }\">\n    <form th:id=\"'search'+${selectId }\" class=\"card j-form-horizontal\">\n        <div class=\"card-body\">\n            <div class=\"form-row\">\n                <div class=\"form-group col\">\n                    <label>[[#{easyflow.process.admin.page.processSelectFrame.defId}]]:</label><input type=\"text\" class=\"form-control\" name=\"defId\"/>\n                </div>\n                <div class=\"form-group col\">\n                    <label>[[#{easyflow.process.admin.page.processSelectFrame.format}]]:</label><select name=\"format\" class=\"form-control\">\n                    <option value=\"\">[[#{easyflow.process.admin.page.processSelectFrame.formatAll}]]</option>\n                    <option value=\"FLOW-easy\">[[#{easyflow.process.admin.page.processSelectFrame.formatFlowEasy}]]</option>\n                    <option value=\"FLOW-bpmn\">[[#{easyflow.process.admin.page.processSelectFrame.formatFlowBpmn}]]</option>\n                    <option value=\"FSM-easy\">[[#{easyflow.process.admin.page.processSelectFrame.formatFsmEasy}]]</option>\n                </select>\n                </div>\n                <div class=\"form-group col\">\n                    <label>[[#{easyflow.process.admin.page.processSelectFrame.latest}]]:</label><select name=\"latest\" class=\"form-control\">\n                    <option value=\"\">[[#{easyflow.process.admin.page.processSelectFrame.latestAll}]]</option>\n                    <option value=\"1\">[[#{easyflow.process.admin.page.processSelectFrame.latestOnly}]]</option>\n                </select>\n                    <div class=\"form-group col\">\n                        <label>[[#{easyflow.process.admin.page.processSelectFrame.bizType}]]:</label><select class=\"form-control\" name=\"memNoType\">\n                        <option value=\"\">[[#{easyflow.process.admin.page.processSelectFrame.bizTypeAll}]]</option>\n                    </select>\n                    </div>\n                </div>\n            </div>\n            <div class=\"form-row\">\n                <div class=\"col text-center\">\n                    <button th:id=\"'query'+${selectId }\" class=\"btn btn-primary\">[[#{easyflow.process.admin.page.processSelectFrame.query}]]</button>\n                    <button th:id=\"'reset'+${selectId }\" class=\"btn btn-secondary\">[[#{easyflow.process.admin.page.processSelectFrame.reset}]]</button>\n                </div>\n            </div>\n        </div>\n    </form>\n    <!-- Table -->\n    <table th:id=\"'datatable'+${selectId }\"></table>\n    <div class=\"row\">\n        <div class=\"col text-center\">\n            <button type=\"submit\" class=\"btn btn-primary j-btn-ok\">[[#{easyflow.process.admin.page.processSelectFrame.confirm}]]</button>\n            <button type=\"button\" class=\"btn btn-secondary j-btn-cancel\">[[#{easyflow.process.admin.page.processSelectFrame.cancel}]]</button>\n        </div>\n    </div>\n</div>\n<script type=\"text/javascript\">\n(function(){\n    var queryParam[(${selectId })] = {};\n  function reset[(${selectId })]() {\n      $(\"#search[(${selectId })] .form-control\").val(\"\");\n      queryParam[(${selectId })] = $(\"#search[(${selectId })]\").serializeObject();\n  };\n  reset[(${selectId })]();\n  $(\"#query[(${selectId })]\").click(function() {\n      queryParam[(${selectId })] = $(\"#search[(${selectId })]\").serializeObject();\n      $('#datatable[(${selectId })]').bootstrapTable(\"refresh\");\n      return false;\n  });\n  $(\"#reset[(${selectId })]\").click(function() {\n      reset[(${selectId })]();\n      return false;\n  });\n\n        var processDefSelect =\"[(@{/easyflow/processDefinition})]\";\n        $('#datatable[(${selectId })]').bootstrapTable({\n            url : processDefSelect + \"/ajax/getListData\",\n            pageSize:100,\n            pageList:[100],\n            sortName:\"createdDate\",\n            sortOrder:\"desc\",\n            columns: [\n                {radio: true,field:\"state\"},\n                {field: 'defId', title: '[(#{easyflow.process.admin.page.processSelectFrame.defId}]'},\n                {field: 'defName', title: '[(#{easyflow.process.admin.page.processSelectFrame.defName})]'},\n                {field: 'defVersion', title: '[(#{easyflow.process.admin.page.processSelectFrame.defVersion})]'},\n                {field: 'format', title: '[(#{easyflow.process.admin.page.processSelectFrame.defFormat}]', formatter:function(data){\n                        return {\"FLOW-bpmn\":\"[(#{easyflow.process.admin.page.processSelectFrame.formatFlowBpmn})]\",\"FLOW-easy\":\"[(#{easyflow.process.admin.page.processSelectFrame.formatFlowEasy})]\",\"FSM-easy\":\"[(#{easyflow.process.admin.page.processSelectFrame.formatFsmEasy})]\"}[data];\n                    }},\n                {field: 'bizType', title: '[(#{easyflow.process.admin.page.processSelectFrame.bizType}]', formatter:function(data){\n                        return data;\n                    }},\n                {field: 'latest', title: '[(#{easyflow.process.admin.page.processSelectFrame.latest}]', formatter:function(data){\n                        return {\"true\":\"[(#{easyflow.process.admin.page.processSelectFrame.latestYes})]\",\"false\":\"[(#{easyflow.process.admin.page.processSelectFrame.latestNo})]\"}[data];\n                    }}\n            ],\n        queryParams : function(param) {\n            $.extend(param, queryParam[(${selectId })]);\n            return param;\n        }\n        });\n})();\n    </script>"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/templates/easyflow/process/processinstance/commonTaskProcessInstanceAdd.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\"\n      th:replace=\"layout::html(#{easyflow.process.admin.page.commonTaskProcessInstanceAdd.processCreate},~{},~{}, ~{::.breadcrumb-item},~{::#content},~{},~{::#script})\">\n<body>\n<ol class=\"breadcrumb\">\n    <li class=\"breadcrumb-item active\">[[#{easyflow.process.admin.page.commonTaskProcessInstanceAdd.processCreate}]]</li>\n</ol>\n<div id=\"content\">\n<!-- Process definition and process instance info -->\n\t\t<div id=\"instance\" class=\"card\">\n\t\t\t<h5 class=\"card-header\">[[#{easyflow.process.admin.page.commonTaskProcessInstanceAdd.processInfo}]]</h5>\n\t\t\t<div class=\"card-body container-fluid\">\n\t\t\t\t<div class=\"row\">\n\t\t\t\t\t<div class=\"form-group col\">\n\t\t\t\t\t\t<label>[[#{easyflow.process.admin.page.commonTaskProcessInstanceAdd.processDefinition}]]:</label><a th:href=\"@{/easyflow/processDefinition/detail(defId=${param.processId},latest=true)}\" th:text=\"${processName}\" class=\"form-control-plaintext\" style=\"color:rgb(0, 123, 255)\" onclick=\"javascript:J.openWindow(this.href, '_blank','','');return false;\"></a></div>\n                    <div class=\"form-group col\">\n                        <label>[[#{easyflow.process.admin.page.commonTaskProcessInstanceAdd.processName}]]:</label><input type=\"text\" th:value=\"${processName}\" id=\"instanceName\" class=\"form-control\"></input></div>\n                    <div class=\"form-group col\">\n                        <label>[[#{easyflow.process.admin.page.commonTaskProcessInstanceAdd.processKeyField}]]:</label><input type=\"text\" th:value=\"${keyField}\" id=\"keyField\" class=\"form-control\"></input></div>\n                    <div class=\"form-group col\">\n                        <label>[[#{easyflow.process.admin.page.commonTaskProcessInstanceAdd.processKeyField2}]]:</label><input type=\"text\" th:value=\"${keyField2}\" id=\"keyField2\" class=\"form-control\"></input></div>\n                </div>\t\t\t\t\n\t\t\t</div>\n\t\t\t<div id=\"instanceForm\"></div>\n\t\t</div>\n<!-- task info -->\t\t\n\t\t<div id=\"task\" class=\"card\">\n        <h5 class=\"card-header\">[[#{easyflow.process.admin.page.commonTaskProcessInstanceAdd.formInfo}]]</h5>\n        <div class=\"card-body\">\n            <div id=\"taskForm\"></div>\n        </div>    \n    </div> \n<!-- submit form -->\n<form th:action=\"@{/easyflow/processInstance/ajax/commonTaskProcessInstanceAdd}\" method=\"post\" id=\"executeForm\" class=\"j-ajax-form\"\n          th:data-success-url=\"@{/easyflow/processInstance/list}\">\n                <input type=\"hidden\" name=\"processId\" th:value=\"${param.processId}\"> \n                <input type=\"hidden\" name=\"instanceName\"/> \n                <input type=\"hidden\" name=\"keyField\"/> \n                <input type=\"hidden\" name=\"keyField2\"/>\n                <textarea name=instanceBizData class=\"d-none\" ></textarea>\n                <textarea name=\"taskData\" class=\"d-none\" ></textarea>\n    <div class=\"row mt-2\">\n        <div class=\"col text-center\">\n            <button type=\"button\" class=\"btn btn-primary j-btn-ok\">[[#{easyflow.process.admin.page.commonTaskProcessInstanceAdd.createProcess}]]</button>\n        </div>\n    </div>                  \n        </form>    \n  \n</div>\n<script type=\"text/javascript\" id=\"script\" th:inline=\"javascript\">\nJ.formTemplateUrl = \"/easyflow/formTemplate/ajax/getTemplate\";\n// Process instance form\nvar instanceTemplateId = /*[[${instanceFormId}]]*/ \"formId\";\nvar instanceBizData,instancePage;\nif (instanceTemplateId) {\n\tinstanceBizData = {};\n\tinstancePage = new J.Page({data:instanceBizData, ctx:{\"op\":\"add\"}, init:false, templates:[{\"code\":instanceTemplateId}], $container:$(\"#instanceForm\"), saveAction:null});\n\tinstancePage.loadAndRender();\n}\n\n // Task form\nvar taskTemplateId = /*[[${taskFormId}]]*/ \"formId\";\n var taskData, taskPage;\n if (taskTemplateId) {\n\ttaskData = {};\n\t taskPage = new J.Page({data:taskData, ctx:{\"op\":\"add\"}, init:false, templates:[{\"code\":taskTemplateId}], $container:$(\"#taskForm\"), saveAction:null});\n\t taskPage.loadAndRender();\n } else {\n\t $(\"#task\").hide();\n }\n$(\".j-btn-ok\").click(function(){\n    $(\"input[name='instanceName']\").val($(\"#instanceName\").val());\n    $(\"input[name='keyField']\").val($(\"#keyField\").val());\n    $(\"input[name='keyField2']\").val($(\"#keyField2\").val());\n    if (instanceTemplateId) {\n        if (!instancePage.$form.valid()) {\n        \t$.jMessage({title:\"[(#{easyflow.process.admin.page.commonTaskProcessInstanceAdd.tip})]\", msg:\"[(#{easyflow.process.admin.page.commonTaskProcessInstanceAdd.instancerrorTip})]\"});\n        \treturn false;\n        }\n\t\tinstancePage.collect(instanceBizData);\n\t    $(\"textarea[name='instanceBizData']\").val(JSON.stringify(instanceBizData, null, 2));\n    }\n    if (taskTemplateId) {\n    \tif (! taskPage.$form.valid()) {\n    \t\t$.jMessage({title:\"[(#{easyflow.process.admin.page.commonTaskProcessInstanceAdd.tip})]\", msg:\"[(#{easyflow.process.admin.page.commonTaskProcessInstanceAdd.formErrorTip})]\"});\n    \t\treturn false;\n    \t}\n\t    taskPage.collect(taskData);\n\t    $(\"textarea[name='taskData']\").val(JSON.stringify(taskData, null, 2));\n    }\n\t    $(\"#executeForm\").submit();\n});\n</script>\n</body>\n</html>"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/templates/easyflow/process/processinstance/processInstanceCreate.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\"\n      th:replace=\"layout::html(#{easyflow.process.admin.page.processInstanceCreate.processCreate},~{},~{}, ~{::.breadcrumb-item},~{::#content},~{},~{::#script})\">\n<body>\n<ol class=\"breadcrumb\">\n    <li class=\"breadcrumb-item active\">[[#{easyflow.process.admin.page.processInstanceCreate.processCreate}]]</li>\n</ol>\n<div id=\"content\">\n    <div id=\"instance\" class=\"card\">\n        <h5 class=\"card-header\">[[#{easyflow.process.admin.page.processInstanceCreate.createProcess}]]</h5>\n        <div class=\"card-body\">\n            <label>[[#{easyflow.process.admin.page.processInstanceCreate.defId}]]:<span class=\"j-require\">*</span></label><input class=\"form-control\" id=\"defId\" value=\"flow_task_001_bpmn\"></input>\n          <button type=\"button\" class=\"btn btn-primary process-create mt-2\">[[#{easyflow.process.admin.page.processInstanceCreate.createProcess}]]</button>\n        </div>    \n    </div>\n</div>\n<script type=\"text/javascript\" id=\"script\" th:inline=\"javascript\">\nvar root = \"[(@{/easyflow/processInstance})]\";\n    $(\".process-create\").click(function(){\n        var processDefId = $(\"#defId\").val();\n        window.location.href=root + \"/add?processId=\" + processDefId;\n    });\n</script>\n</body>\n</html>"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/templates/easyflow/process/processinstance/processInstanceDetail.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\"\n    xmlns:sec=\"http://www.thymeleaf.org/thymeleaf-extras-springsecurity5\"\n    th:replace=\"layout::html(#{easyflow.process.admin.page.processInstanceDetail.process},~{::link},~{}, ~{::.breadcrumb-item},~{::#content},~{::.script},~{::#script})\">\n<head>\n<link rel=\"stylesheet\"\n    th:href=\"@{/static/plugins/bpmnjs/assets/diagram-js.css}\">\n<link rel=\"stylesheet\" th:href=\"@{/static/plugins/bpmnjs/assets/bpmn-js.css}\">        \n<link rel=\"stylesheet\"\n    th:href=\"@{/static/plugins/bpmnjs/assets/bpmn-font/css/bpmn.css}\">\n<link rel=\"stylesheet\" th:href=\"@{/static/plugins/flow/flow.css}\">\n</head>\n<body>\n    <ol class=\"breadcrumb\">\n        <li class=\"breadcrumb-item active\">[[#{easyflow.process.admin.page.processInstanceDetail.processView}]]</li>\n    </ol>\n    <div id=\"content\">\n        <div class=\" container-fluid\">\n            <div class=\"row\">\n                <div class=\"form-group col\">\n                    <label>[[#{easyflow.process.admin.page.processInstanceDetail.instanceNo}]]:</label><input type=\"text\" name=\"instanceNo\"\n                        class=\"form-control\" th:value=\"${processInstance.instanceNo}\" readonly=\"readonly\" />\n                </div>\n                <div class=\"form-group col\">\n                    <label>[[#{easyflow.process.admin.page.processInstanceDetail.instanceName}]]:</label><input type=\"text\" name=\"instanceName\"\n                        class=\"form-control\" th:value=\"${processInstance.instanceName}\" readonly=\"readonly\" />\n                </div>\n                <div class=\"form-group col\">\n                    <label>[[#{easyflow.process.admin.page.processInstanceDetail.productCode}]]:</label> <input class=\"form-control\"\n                        name=\"productCode\" th:value=\"${processInstance.productCode}\" disabled=\"disabled\" id=\"productCode\"/>\n                </div>\n                <div class=\"form-group col\">\n                    <label>[[#{easyflow.process.admin.page.processInstanceDetail.processType}]]:</label> <input type=\"text\" name=\"processType\" class=\"form-control\" th:value=\"${processInstance.processType}\" readonly=\"readonly\"></input>\n                </div>\n                <div class=\"form-group col\">\n                    <label>[[#{easyflow.process.admin.page.processInstanceDetail.bizNo}]]:</label><input type=\"text\" name=\"bizNo\"\n                        class=\"form-control\" th:value=\"${processInstance.bizNo}\" readonly=\"readonly\"/>\n                </div>\n                <div class=\"form-group col\">\n                    <label>[[#{easyflow.process.admin.page.processInstanceDetail.processStatus}]]:</label><select class=\"form-control\" disabled=\"disabled\">\n                       <option value=\"ACTIVE\" th:selected=\"${processInstance.status=='ACTIVE'}\">[[#{easyflow.process.admin.page.processInstanceDetail.processStatusActive}]]</option>\n                       <option value=\"CLOSE\" th:selected=\"${processInstance.status=='CLOSE'}\">[[#{easyflow.process.admin.page.processInstanceDetail.processStatusClose}]]</option>\n                       <option value=\"CANCELED\" th:selected=\"${processInstance.status=='CANCELED'}\">[[#{easyflow.process.admin.page.processInstanceDetail.processStatusCanceled}]]</option>\n                    </select>\n\n                </div>\n            </div>\n            <div class=\"row\">\n                <div class=\"form-group col\">\n                    <label>[[#{easyflow.process.admin.page.processInstanceDetail.keyField}]]:</label><input type=\"text\" name=\"keyField\"\n                        class=\"form-control\" th:value=\"${processInstance.keyField}\" readonly=\"readonly\" />\n                </div>\n                <div class=\"form-group col\">\n                    <label>[[#{easyflow.process.admin.page.processInstanceDetail.startTime}]]:</label><input type=\"text\" name=\"startTime\"\n                        class=\"form-control\" th:value=\"${#calendars.format(processInstance.startTime,'yyyy-MM-dd HH:mm:ss')}\" readonly=\"readonly\"/>\n                </div>\n                <div class=\"form-group col\">\n                    <label>[[#{easyflow.process.admin.page.processInstanceDetail.modifiedDate}]]:</label><input type=\"text\" name=\"modifiedDate\" th:value=\"${#calendars.format(processInstance.modifiedDate,'yyyy-MM-dd HH:mm:ss')}\"\n                        class=\"form-control\" readonly=\"readonly\"/>\n                </div>\n                <div class=\"form-group col\">\n                    <label>[[#{easyflow.process.admin.page.processInstanceDetail.currentNode}]]:</label><input type=\"text\" name=\"currentNodeIds\" th:value=\"${processInstance.currentNodeIds}\"\n                        class=\"form-control\" readonly=\"readonly\"/>\n                </div>\n                <div class=\"form-group col\">\n                    <label>[[#{easyflow.process.admin.page.processInstanceDetail.processVars}]]:</label><textarea name=\"vars\"\n                        class=\"form-control\" th:text=\"${processInstance.vars}\" style=\"height:27px\" readonly=\"readonly\"></textarea>\n                </div>\n                <div class=\"form-group col\">\n                    <label>[[#{easyflow.process.admin.page.processInstanceDetail.processDef}]]:</label>\n                    <a th:if=\"${processDef!=null}\" th:href=\"@{/easyflow/processDefinition/detail(defId=${processDef.defId},defVersion=${processDef.defVersion})}\" th:text=\"${processInstance.processDefId}\" class=\"form-control-plaintext\" style=\"color:rgb(0, 123, 255)\" onclick=\"javascript:J.openWindow(this.href, '_blank','','');return false;\"></a>\n                    <span th:if=\"${processDef==null}\" th:text=\"${processInstance.processDefId}\" class=\"form-control-plaintext\"></span>\n                </div>\n            </div>\n          <th:if test=\"${processInstance.parentInstanceNo!=null}\">\n          <div class=\"row\">\n                <div class=\"form-group col-2\">\n                    <label>[[#{easyflow.process.admin.page.processInstanceDetail.parentInstanceNo}]]:</label>\n                                        <a th:href=\"@{/easyflow/processInstance/detail(instanceNo=${processInstance.parentInstanceNo})}\" th:text=\"${processInstance.parentInstanceNo}\" class=\"form-control-plaintext\" style=\"color:rgb(0, 123, 255)\" onclick=\"javascript:J.openWindow(this.href, '_blank','','');return false;\"></a>\n                </div>\n          </div> \n          </th:if> \n            <div id=\"processBizDataDiv\" class=\"card\">\n                <h5 class=\"card-header\">[[#{easyflow.process.admin.page.processInstanceDetail.processBizData}]]</h5>\n                <div class=\"card-body\">\n                    <div id=\"instanceForm\"></div>\n                </div>\n            </div>\n\n            <div class=\"mt-2\">\n                <ul class=\"nav nav-tabs\">\n                    <li class=\"nav-item\"><a class=\"nav-link active\"  data-toggle=\"tab\"\n                        data-target=\"#bpmnContainer\" id=\"nav-bpmn\">[[#{easyflow.process.admin.page.processInstanceDetail.processNodeStatusGraph}]]</a></li>\n                    <li class=\"nav-item\"><a class=\"nav-link\"  data-toggle=\"tab\" data-target=\"#dataContainer\" id=\"nav-instance-data\">[[#{easyflow.process.admin.page.processInstanceDetail.processNodeData}]]</a></li>\n                </ul>\n                <div class=\"tab-content\">\n                    <div id=\"bpmnContainer\" class=\"bpmnContainer tab-pane active\">\n                    </div>\n                    <div id=\"dataContainer\" class=\"dataContainer tab-pane\">\n                        <div id=\"nodeInstanceTable\"></div>\n                    </div>\n                </div>\n            </div>\n        <!-- Task info -->\n            <div id=\"task\" class=\"card mt-2\">\n                <h5 class=\"card-header\">[[#{easyflow.process.admin.page.processInstanceDetail.taskList}]]</h5>\n                <div class=\"card-body\">\n                   <table id=\"taskTable\"></table>\n                </div>\n            </div> \n        </div>\n        <div class=\"row mt-2\">\n            <div class=\"col text-center\">\n                <button type=\"button\" class=\"btn btn-secondary j-btn-cancel\">[[#{easyflow.process.admin.page.processInstanceDetail.returnList}]]</button>\n            </div>\n        </div>\n    </div>\n    <script type=\"text/javascript\"\n        th:src=\"@{/static/plugins/bpmnjs/bpmn-navigated-viewer.development.js}\"\n        class=\"script\"></script>\n    <script type=\"text/javascript\"\n        th:src=\"@{/static/plugins/bpmnjs/bpmn-modeler.development.js}\"\n        class=\"script\"></script>\n    <script type=\"text/javascript\" th:src=\"@{/static/plugins/flow/bpmn.js}\" class=\"script\"></script>\n    <script type=\"text/javascript\" th:src=\"@{/static/plugins/flow/flow.js}\"\n        class=\"script\"></script>\n    <script type=\"text/javascript\" id=\"script\" th:inline=\"javascript\">\n    activeMenu = \"PROCESS_INSTANCE\";\n    var defData =/*[(${defData})]*/ {};\n    var nodeInstances =/*[(${nodeInstancesStr})]*/ {};\n    var tasks = /*[(${tasksStr})]*/ {};\n    var root = \"[(@{/easyflow/processInstance})]\";\n    var instanceTemplateId = /*[[${instanceFormId}]]*/ \"formId\";\n    var instanceData = /*[(${instanceBizData})]*/ {};\n    instancePage = new J.Page({data:instanceData, ctx:{\"op\":\"detail\"}, init:false, templates:[{\"code\":instanceTemplateId}], $container:$(\"#instanceForm\"), saveAction:null, helper:{show:false}});\n    instancePage.loadAndRender();\n// Graph view\nif (defData && defData.bpmnXmlData) {\n        var bpmnControl = new J.BpmnControl({\n            $bpmnContainer : $(\"#bpmnContainer\"),\n            data : {bpmnXmlData:defData.bpmnXmlData},\n            mode : \"view\"\n        });\n        bpmnControl.render().then(\n                function() {\n                    var modeler = bpmnControl.bpmnModeler;\n                    elementRegistry = modeler.get('elementRegistry');\n                    canvas = modeler.get('canvas');\n                    for ( var i in nodeInstances) {\n                        var nodeInstance = nodeInstances[i];\n                        var nodeId = nodeInstance.nodeId;\n                        var status = nodeInstance.status;\n                        var elementToColor = elementRegistry.get(nodeId);\n                        if (!elementToColor) {\n                            console.log(\"Node not found:\" + nodeId);\n                            continue;\n                        }\n                        if (status == 'CLOSE') {\n                              canvas.addMarker(nodeId, 'j-bpmn-node-close');\n                        } else if (status == 'INACTIVE' || status == 'ACTIVE') {\n                              canvas.addMarker(nodeId, 'j-bpmn-node-active');\n                        }\n                    }\n                })\n} else {\n    $(\"#nav-bpmn\").hide();\n    $(\"#nav-instance-data\").tab(\"show\");\n}\n// Node table view\n    $(\"#nodeInstanceTable\").bootstrapTable({\n        pagination:false,\n        showRefresh: false,\n        showColumns: false,\n        columns:[\n            {field:\"processInstanceNo\", title:\"[(#{easyflow.process.admin.page.processInstanceDetail.instanceNo})]\"},\n            {field:\"nodeInstanceNo\", title:\"[(#{easyflow.process.admin.page.processInstanceDetail.nodeInstanceNo})]\"},\n            {field:\"nodeId\", title:\"[(#{easyflow.process.admin.page.processInstanceDetail.nodeId})]\"},\n            {field:\"nodeName\", title:\"[(#{easyflow.process.admin.page.processInstanceDetail.nodeName})]\"},\n            {field:\"startTime\", title:\"[(#{easyflow.process.admin.page.processInstanceDetail.startTime})]\"},\n            {field:\"endTime\", title:\"[(#{easyflow.process.admin.page.processInstanceDetail.endTime})]\"},\n            {field:\"status\", title:\"[(#{easyflow.process.admin.page.processInstanceDetail.nodeStatus})]\", formatter: function (data) {\n                return {\"CLOSE\": \"<span style='color:green'>[(#{easyflow.process.admin.page.processInstanceDetail.nodeStatusEnd})]</span>\", \"INACTIVE\": \"[(#{easyflow.process.admin.page.processInstanceDetail.nodeStatusInactive})]\", \"ACTIVE\": \"[(#{easyflow.process.admin.page.processInstanceDetail.nodeStatusActive})]\"}[data];\n            }},\n            {field:\"previousNodeInstances\", title:\"[(#{easyflow.process.admin.page.processInstanceDetail.previousNodeInstances})]\"},\n            {field:\"nextNodeInstances\", title:\"[(#{easyflow.process.admin.page.processInstanceDetail.nextNodeInstances})]\"},\n            {field:\"extData\", title:\"[(#{easyflow.process.admin.page.processInstanceDetail.extData})]\"}\n        ],\n        data : nodeInstances\n    });\n\n// Task table view\n $('#taskTable').bootstrapTable({\n     pagination:false,\n     showRefresh: false,\n     showColumns: false,\n     columns: [\n         {field: 'taskNo', title: '[(#{easyflow.process.admin.page.processInstanceDetail.taskNo})]'},\n         {field: 'taskBizName', title: '[(#{easyflow.process.admin.page.processInstanceDetail.taskBizName})]'},\n         {field: 'createdDate', title: '[(#{easyflow.process.admin.page.processInstanceDetail.createdDate})]'},\n         {field: 'status', title: '[(#{easyflow.process.admin.page.processInstanceDetail.taskStatus})]',formatter: function (data) {\n                return {\"PENDING\":\"[(#{easyflow.process.admin.page.processInstanceDetail.taskStatusPending})]\", \"FINISH\":\"[(#{easyflow.process.admin.page.processInstanceDetail.taskStatusFinish})]\", \"CANCELED\":\"[(#{easyflow.process.admin.page.processInstanceDetail.taskStatusCanceled})]\", \"INVALID\":\"[(#{easyflow.process.admin.page.processInstanceDetail.taskStatusInvalid})]\"}[data];\n            }},\n         {field: 'assignInfo', title: '[(#{easyflow.process.admin.page.processInstanceDetail.assignInfo})]', formatter: function(data, item) {\n             if (item.status!='PENDING') {\n                 return \"\";\n             }\n             if (! item.assignInfo) {\n                 return \"\";\n             }\n             var dataObj = JSON.parse(item.assignInfo);\n             var info = \"\";\n             if (dataObj.user) {\n                 info += \" [(#{easyflow.process.admin.page.processInstanceDetail.user})]:\";\n                 for (var i in dataObj.user) {\n                     if (dataObj.excludeUser && dataObj.excludeUser.indexOf(dataObj.user[i])>0) {\n                         continue;\n                     }\n                     info += dataObj.user[i] + \",\";\n                 }\n                 info = info.substring(0, info.length - 1);\n             }\n             if (dataObj.group) {\n                 info += \" [(#{easyflow.process.admin.page.processInstanceDetail.userGroup})]:\";\n                 for (var i in dataObj.group) {\n                     info += dataObj.group[i] + \",\";\n                 }\n                 info = info.substring(0, info.length - 1);\n             }\n             if (dataObj.group2) {\n                 info += \"[(#{easyflow.process.admin.page.processInstanceDetail.userGroup2})]:\";\n                 for (var i in dataObj.group2) {\n                     info += dataObj.group2[i] + \",\";\n                 }\n                 info = info.substring(0, info.length - 1);\n             }             \n             return info;\n         }},\n         {field: 'executeBizResult', title: '[(#{easyflow.process.admin.page.processInstanceDetail.executeBizResult})]', formatter: function(data) {\n             if (data == 'PASS') {\n                 return \"[(#{easyflow.process.admin.page.processInstanceDetail.pass})]\";\n             }\n             if (data == 'REJECT') {\n                 return \"[(#{easyflow.process.admin.page.processInstanceDetail.reject})]\";\n             }\n             return data;\n         }},\n         {field: 'executor', title: '[(#{easyflow.process.admin.page.processInstanceDetail.handleUser})]'},\n         {field: 'executeTime', title: '[(#{easyflow.process.admin.page.processInstanceDetail.handleTime})]'},\n     ],\n     data : tasks\n });\n if (! tasks || tasks.length==0) {\n     $(\"#task\").hide();\n }\n    \n    $(\".j-btn-cancel\").click(function(){\n        window.location.href=root + \"/list\";\n    });\n    </script>\n</body>\n</html>"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/templates/easyflow/process/processinstance/processInstanceList.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\"\n      th:replace=\"layout::html(#{easyflow.process.admin.page.processInstanceList.process},~{},~{}, ~{::.breadcrumb-item},~{::#content},~{},~{::#script})\">\n<body>\n<ol class=\"breadcrumb\">\n    <li class=\"breadcrumb-item active\">[[#{easyflow.process.admin.page.processInstanceList.process}]]</li>\n</ol>\n<div id=\"content\">\n    <div id=\"tabs\">\n        <div id=\"tableContainer\">\n            <!-- Search -->\n            <form id=\"search\" class=\"card j-form-horizontal\">\n                <div class=\"card-body\">\n                    <div class=\"form-row\">\n                        <div class=\"form-group col\">\n                            <label>[[#{easyflow.process.admin.page.processInstanceList.instanceNo}]]:</label><input name=\"instanceNo\" class=\"form-control\"></input>\n                        </div>\n                        <div class=\"form-group col\">\n                            <label>[[#{easyflow.process.admin.page.processInstanceList.bizType}]]:</label><input type=\"text\" name=\"bizType\" class=\"form-control\"></input>\n                        </div>\n                        <div class=\"form-group col\">\n                            <label>[[#{easyflow.process.admin.page.processInstanceList.bizNo}]]:</label><input name=\"bizNo\" class=\"form-control\"></input>\n                        </div>\n                        <div class=\"form-group col\">\n                            <label>[[#{easyflow.process.admin.page.processInstanceList.productCode}]]:</label><input name=\"productCode\" class=\"form-control\"></input>\n                        </div>                        \n                    </div>\n                    <div class=\"form-row\">\n                        <div class=\"form-group col\">\n                            <label>[[#{easyflow.process.admin.page.processInstanceList.creator}]]:</label><input name=\"creator\" class=\"form-control\"></input>\n                        </div> \n                        <div class=\"form-group col\">\n                            <label>[[#{easyflow.process.admin.page.processInstanceList.processStatus}]]:</label>\n                            <select name=\"status\" class=\"form-control\" id=\"queryType\">\n                                <option value=\"\">[[#{easyflow.process.admin.page.processInstanceList.statusAll}]]</option>\n                                <option value=\"ACTIVE\">[[#{easyflow.process.admin.page.processInstanceList.statusActive}]]</option>\n                                <option value=\"CLOSE\">[[#{easyflow.process.admin.page.processInstanceList.statusClose}]]</option>\n                                <option value=\"CANCELED\">[[#{easyflow.process.admin.page.processInstanceList.statusCanceled}]]</option>\n                            </select>\n                        </div> \n                         <div class=\"form-group col\">\n                            <label>[[#{easyflow.process.admin.page.processInstanceList.keyField}]]:</label><input name=\"keyField\" class=\"form-control\"></input>\n                        </div>      \n                        <div class=\"form-group col\">\n                            <label>[[#{easyflow.process.admin.page.processInstanceList.queryType}]]:</label>                            \n                            <select name=\"queryType\" class=\"form-control\" id=\"queryType\">\n                                <option value=\"MY\">[[#{easyflow.process.admin.page.processInstanceList.queryTypeMy}]]</option>\n                                <option value=\"ALL\">[[#{easyflow.process.admin.page.processInstanceList.queryTypeAll}]]</option>\n                            </select>\n                        </div>                                                                      \n                    </div>                   \n                    <div class=\"form-row\">\n                        <div class=\"col text-center\">\n                            <button id=\"query\" class=\"btn btn-primary\">[[#{easyflow.process.admin.page.processInstanceList.query}]]</button>\n                            <button id=\"reset\" class=\"btn btn-secondary\">[[#{easyflow.process.admin.page.processInstanceList.reset}]]</button>\n                        </div>\n                    </div>\n                </div>\n            </form>\n            <!-- Toolbar-->\n            <div id=\"toolbar\">\n                <div class=\"btn-group\" role=\"group\">\n                    <button id=\"create\" class=\"btn btn-primary\">[[#{easyflow.process.admin.page.processInstanceList.createProces}]]</button> &nbsp;&nbsp;\n                </div>\n            </div>            \n            <!-- Table -->\n            <table id=\"datatable\"></table>\n        </div>\n    </div>\n\n</div>\n<script type=\"text/javascript\" id=\"script\" th:inline=\"javascript\">\n    $(\"#tabs\").jTabs().jTabs(\"open\", {id: \"tab-table\", name: \"[(#{easyflow.process.admin.page.processInstanceList.processList})]\", element: $(\"#tableContainer\"), closeable: false});\n    var queryParam = {};\n\n    function reset() {\n        $(\"#search .form-control\").val(\"\");\n        $(\"#queryType\").val(\"MY\");        \n        queryParam = $(\"#search\").serializeObject();\n    };\n    reset();\n    $(\"#query\").click(function () {\n        queryParam = $(\"#search\").serializeObject();\n        $('#datatable').bootstrapTable(\"refresh\");\n        return false;\n    });\n    $(\"#reset\").click(function () {\n        reset();\n        return false;\n    });\n    var root = \"[(@{/easyflow/processInstance})]\";\n    $('#datatable').bootstrapTable({\n        url: root + \"/ajax/getListData\",\n        toolbar: \"#toolbar\",\n        sortName: \"createdDate\",\n        sortOrder: \"desc\",\n        columns: [\n            {radio: true},\n            {\n                field: 'instanceNo', title: '[(#{easyflow.process.admin.page.processInstanceList.instanceNo})]', formatter: function (data, item) {\n                    return \"<a class='j-op detailBtn' data-record-id='\" + item.instanceNo + \"'>\" + data + \"</a>\";\n                }\n            },\n            {field: 'instanceName', title: '[(#{easyflow.process.admin.page.processInstanceList.instanceName})]'},\n            {field: 'processType', title: '[(#{easyflow.process.admin.page.processInstanceList.processType})]'},\n            {field: 'bizNo', title: '[(#{easyflow.process.admin.page.processInstanceList.processBizNo})]'},\n            {field: 'productCode', title: '[(#{easyflow.process.admin.page.processInstanceList.productCode})]'},\n            {field: 'creator', title: '[(#{easyflow.process.admin.page.processInstanceList.creator})]'},\n            {field: 'keyField', title: '[(#{easyflow.process.admin.page.processInstanceList.keyField})]'},\n            {field: 'processDefId', title: '[(#{easyflow.process.admin.page.processInstanceList.processDefId})]'},\n            {field: 'status', title: '[(#{easyflow.process.admin.page.processInstanceList.processStatus})]', formatter: function (data) {\n                return {\"ACTIVE\":\"[(#{easyflow.process.admin.page.processInstanceList.statusActive})]\", \"CLOSE\":\"[(#{easyflow.process.admin.page.processInstanceList.statusClose})]\", \"CANCELED\":\"[(#{easyflow.process.admin.page.processInstanceList.statusCanceled})]\"}[data];\n            }},\n            {field: 'startTime', title: '[(#{easyflow.process.admin.page.processInstanceList.processStartTime})]'},\n            {field: 'endTime', title: '[(#{easyflow.process.admin.page.processInstanceList.processEndTime})]'},\n            {field: 'currentNodeIds', title: '[(#{easyflow.process.admin.page.processInstanceList.currentNodeId})]'},\n            {field: 'createdDate', title: '[(#{easyflow.process.admin.page.processInstanceList.createdDate})]',sortable: true},\n            {field: 'modifiedDate', title: '[(#{easyflow.process.admin.page.processInstanceList.modifiedDate})]',sortable: true},\n            {\n                field: 'op', title: '[(#{easyflow.process.admin.page.processInstanceList.op})]', formatter: function (data,item) {\n                    let content = \"\";\n                    if (item.canCanCel) {\n                        content +=\"<button type='button' class='btn btn-link j-op canCelBtn' data-record-id='\" + item.instanceNo + \"'>[(#{easyflow.process.admin.page.processInstanceList.cancel})]</button>\";\n                    }\n                    return content;\n                }\n            }\n        ],\n        queryParams: function (param) {\n            $.extend(param, queryParam);\n            return param;\n        }\n    });\n\n    $(\"#datatable\").on(\"click\", \".detailBtn\", function () {\n        window.location.href = root + \"/detail?instanceNo=\" + $(this).data(\"record-id\");\n        return false;\n    });\n\n    $(\"#datatable\").on(\"click\", \".canCelBtn\", function () {\n        $.jAjax({confirm:\"[(#{easyflow.process.admin.page.processInstanceList.cancelConfirm})]\", url:root+\"/ajax/cancel?instanceNo=\" + $(this).data(\"record-id\")});\n    });\n    $(\"#create\").click(function(){\n        window.location.href=root + \"/create\";\n    });\n\n</script>\n</body>\n</html>"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/templates/easyflow/process/processtask/commonProcessTaskDetail.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\"\n      th:replace=\"layout::html(#{easyflow.process.admin.page.commonProcessTaskDetail.taskDetail},~{},~{}, ~{::.breadcrumb-item},~{::#content},~{},~{::#script})\">\n<body>\n<ol class=\"breadcrumb\">\n    <li class=\"breadcrumb-item active\">[[#{easyflow.process.admin.page.commonProcessTaskDetail.taskDetail}]]</li>\n</ol>\n<div id=\"content\">\n<!-- Process info -->\n    <div id=\"instance\" class=\"card\">\n        <h5 class=\"card-header\">[[#{easyflow.process.admin.page.commonProcessTaskDetail.processInfo}]]</h5>\n            <div class=\"card-body\">\n                <div class=\"row\">\n                    <div class=\"form-group col\">\n                        <label>[[#{easyflow.process.admin.page.commonProcessTaskDetail.processInstanceInfo}]]:</label><a\n                            th:href=\"@{/easyflow/processInstance/detail(instanceNo=${instance.instanceNo})}\"\n                            th:text=\"${instance.instanceName}==null ? #{easyflow.process.admin.page.commonProcessTaskDetail.processInstance}:${instance.instanceName}\" class=\"form-control-plaintext\"\n                            style=\"color: rgb(0, 123, 255)\" onclick=\"javascript:J.openWindow(this.href, '_blank','','');return false;\"></a>\n                    </div> \n                    <div class=\"form-group col\">\n                        <label>[[#{easyflow.process.admin.page.commonProcessTaskDetail.processDefinitionInfo}]]:</label><a\n                            th:href=\"@{/easyflow/processDefinition/detail(fullDefinitionId=${instance.processDefId})}\"\n                            th:text=\"${instance.processDefId}\" class=\"form-control-plaintext\"\n                            style=\"color: rgb(0, 123, 255)\" onclick=\"javascript:J.openWindow(this.href, '_blank','','');return false;\"></a>\n                    </div>  \n                    <div class=\"form-group col\">\n                        <label>[[#{easyflow.process.admin.page.commonProcessTaskDetail.bizType}]]:</label><input class=\"form-control\" th:value=\"${task.processType}\" readonly=\"readonly\"></input>\n                    </div> \n                    <div class=\"form-group col\">\n                        <label>[[#{easyflow.process.admin.page.commonProcessTaskDetail.bizNo}]]:</label><input class=\"form-control\" th:value=\"${task.bizNo}\" readonly=\"readonly\"></input>\n                    </div>    \n                    <div class=\"form-group col\">\n                        <label>[[#{easyflow.process.admin.page.commonProcessTaskDetail.productCode}]]:</label><input class=\"form-control\" th:value=\"${task.productCode}\" readonly=\"readonly\"></input>\n                    </div>\n                    <div class=\"form-group col\">\n                        <label>[[#{easyflow.process.admin.page.commonProcessTaskDetail.keyField}]]:</label><input class=\"form-control\" th:value=\"${instance.keyField}\" readonly=\"readonly\"></input>\n                    </div>\n                </div>\n            <div id=\"instanceForm\"></div>\n            </div>\n        </div>\n    <div id=\"taskAssign\" class=\"card\">\n        <h5 class=\"card-header\">[[#{easyflow.process.admin.page.commonProcessTaskDetail.taskInfo}]]</h5>\n        <div class=\"card-body\">\n            <div class=\"row\">\n                    <div class=\"form-group col-3\">\n                        <label>[[#{easyflow.process.admin.page.commonProcessTaskDetail.taskNo}]]:</label><input class=\"form-control\" th:value=\"${task.taskNo}\" readonly=\"readonly\"></input>\n                    </div> \n                    <div class=\"form-group col-3\">\n                        <label>[[#{easyflow.process.admin.page.commonProcessTaskDetail.taskCode}]]:</label><input class=\"form-control\" th:value=\"${task.taskBizCode}\" readonly=\"readonly\"></input>\n                    </div> \n                    <div class=\"form-group col-3\">\n                        <label>[[#{easyflow.process.admin.page.commonProcessTaskDetail.taskName}]]:</label><input class=\"form-control\" th:value=\"${task.taskBizName}\" readonly=\"readonly\"></input>\n                    </div> \n                    <div class=\"form-group col-3\">\n                        <label>[[#{easyflow.process.admin.page.commonProcessTaskDetail.taskNode}]]:</label><input class=\"form-control\" th:value=\"${task.nodeInstanceNo}\" readonly=\"readonly\"></input>\n                    </div>   \n                    <div class=\"form-group col-3\">\n                        <label>[[#{easyflow.process.admin.page.commonProcessTaskDetail.taskStatus}]]:</label><select class=\"form-control\" disabled=\"disabled\">\n                           <option value=\"PENDING\" th:selected=\"${task.status=='PENDING'}\">[[#{easyflow.process.admin.page.commonProcessTaskDetail.statusPending}]]</option>\n                           <option value=\"FINISH\" th:selected=\"${task.status=='FINISH'}\">[[#{easyflow.process.admin.page.commonProcessTaskDetail.statusFinish}]]</option>\n                        </select>\n                    </div>   \n                                                                                                \n                    <div class=\"form-group col-3\">\n                        <label>[[#{easyflow.process.admin.page.commonProcessTaskDetail.createTime}]]:</label><input class=\"form-control\" th:value=\"${#dates.format(task.createdDate, 'yyyy-MM-dd HH:mm:ss')}\" readonly=\"readonly\"></input>\n                    </div> \n                    <div class=\"form-group col-3\">\n                        <label>[[#{easyflow.process.admin.page.commonProcessTaskDetail.updateTime}]]:</label><input class=\"form-control\" th:value=\"${#dates.format(task.modifiedDate, 'yyyy-MM-dd HH:mm:ss')}\" readonly=\"readonly\"></input>\n                    </div> \n                    <div class=\"form-group col-3\">\n                        <label>[[#{easyflow.process.admin.page.commonProcessTaskDetail.creator}]]:</label><input class=\"form-control\" th:value=\"${task.creator}\" readonly=\"readonly\"></input>\n                    </div> \n                    <div class=\"form-group col-3\">\n                        <label>[[#{easyflow.process.admin.page.commonProcessTaskDetail.executor}]]:</label><input class=\"form-control\" th:value=\"${task.executor}\" readonly=\"readonly\"></input>\n                    </div>                          \n                    <div class=\"form-group col-3\">\n                        <label>[[#{easyflow.process.admin.page.commonProcessTaskDetail.executeResult}]]:</label><input class=\"form-control\" th:value=\"${task.executeBizResult}\" readonly=\"readonly\"></input>\n                    </div>\n                    <div class=\"form-group col-3\" th:if=\"${task.status=='PENDING'}\">\n                        <label>[[#{easyflow.process.admin.page.commonProcessTaskDetail.taskTodoUser}]]:</label><textarea class=\"form-control\" th:text=\"${assignInfoStr}\" readonly=\"readonly\"></textarea>\n                    </div> \n            </div>\n            <div id=\"taskExecuteDataForm\"></div>\n        </div>\n    </div>\n<!-- Task history -->\n    <div id=\"taskHistory\" class=\"card\">\n        <h5 class=\"card-header\">[[#{easyflow.process.admin.page.commonProcessTaskDetail.taskHandleHistory}]]</h5>\n        <div class=\"card-body\">\n           <table id=\"taskHistoryTable\"></table>\n        </div>\n    </div>  \n</div>\n<script type=\"text/javascript\" id=\"script\" th:inline=\"javascript\">\nvar pageData = /*[(${pageData})]*/ \"pageData\";\n\nvar instanceTemplateId = /*[[${instanceFormId}]]*/ \"formId\";\nif (instanceTemplateId) {\n\tinstanceData = pageData.instanceBizData ? pageData.instanceBizData : {};\n\tinstancePage = new J.Page({data:instanceData, ctx:{\"op\":\"detail\"}, init:false, templates:[{\"code\":instanceTemplateId}], $container:$(\"#instanceForm\"), saveAction:null, helper:{show:false}});\n\tinstancePage.loadAndRender();\n}\n\nvar taskDetailTemplateId = /*[[${taskDetailFormId}]]*/ \"taskDetailFormId\";\nif (taskDetailTemplateId) {\n\tvar executeBizData =  /*[(${taskExecuteBizData})]*/ \"taskExecuteBizData\";\n\ttaskExecuteDataPage = new J.Page({data:executeBizData, ctx:{\"op\":\"detail\"}, init:false, templates:[{\"code\":taskDetailTemplateId}], $container:$(\"#taskExecuteDataForm\"), saveAction:null, helper:{show:false}});\n\ttaskExecuteDataPage.loadAndRender();\n}\n\n var root = \"[(@{/easyflow/processTask})]\";\n $('#taskHistoryTable').bootstrapTable({\n     showRefresh: false,\n     showColumns: false,\n     url: root + \"/ajax/getTaskHistoryListData?taskNo=\" + pageData.taskNo,\n     sortName: \"createdDate\",\n     sortOrder: \"asc\",\n     columns: [\n         {field: 'taskNo', title: '[(#{easyflow.process.admin.page.commonProcessTaskDetail.taskNo})]'},\n         {field: 'taskBizName', title: '[(#{easyflow.process.admin.page.commonProcessTaskDetail.taskName})]'},\n         {field: 'createdDate', title: '[(#{easyflow.process.admin.page.commonProcessTaskDetail.createTime})]'},\n         {field: 'executeBizResult', title: '[(#{easyflow.process.admin.page.commonProcessTaskDetail.processResult})]'},\n         {field: 'executor', title: '[(#{easyflow.process.admin.page.commonProcessTaskDetail.taskHandledUser})]'},\n         {field: 'executeTime', title: '[(#{easyflow.process.admin.page.commonProcessTaskDetail.processTime})]'},\n     ]\n });\n \n $(\".j-btn-cancel\").click(function(){\n        window.location.href=root + \"/easyflow/processTask/list\";\n    });\n</script>\n</body>\n</html>"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/templates/easyflow/process/processtask/commonProcessTaskExecute.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\"\n      th:replace=\"layout::html(#{easyflow.process.admin.page.commonProcessTaskExecute.taskHandle},~{},~{}, ~{::.breadcrumb-item},~{::#content},~{},~{::#script})\">\n<body>\n<ol class=\"breadcrumb\">\n    <li class=\"breadcrumb-item active\">[[#{easyflow.process.admin.page.commonProcessTaskExecute.taskHandle}]]</li>\n</ol>\n<div id=\"content\">\n<!-- Process Info -->\n    <div id=\"instance\" class=\"card\">\n        <h5 class=\"card-header\">[[#{easyflow.process.admin.page.commonProcessTaskExecute.processInfo}]]</h5>\n\t\t\t<div class=\"card-body\">\n                <div class=\"row\">\n                    <div class=\"form-group col\">\n                        <label>[[#{easyflow.process.admin.page.commonProcessTaskExecute.processLink}]]:</label><a\n                            th:href=\"@{/easyflow/processInstance/detail(instanceNo=${instance.instanceNo})}\"\n                            th:text=\"${instance.instanceName}\" class=\"form-control-plaintext\"\n                            style=\"color: rgb(0, 123, 255)\" onclick=\"javascript:J.openWindow(this.href, '_blank','','');return false;\"></a>\n                    </div>\n                    <div class=\"form-group col\">\n                        <label>[[#{easyflow.process.admin.page.commonProcessTaskExecute.processKeyField}]]:</label><input class=\"form-control\" th:value=\"${instance.keyField}\" readonly=\"readonly\"></input>\n                    </div>\n            </div>\n            <div id=\"instanceForm\"></div>\n\t\t\t</div>\n\t\t</div>\n<!-- Task Info -->\n    <div id=\"task\" class=\"card\">\n        <h5 class=\"card-header\">[[#{easyflow.process.admin.page.commonProcessTaskExecute.taskHandle}]]</h5>\n        <div class=\"card-body\">\n            <th th:if=\"${createTask}\">\n                <button id=\"createTask\">[[#{easyflow.process.admin.page.commonProcessTaskExecute.addHandleUser}]]</button>\n            </th>\n            <div id=\"taskForm\"></div>               \n        </div>\n    </div>\n<!-- Task history -->\n    <div id=\"taskHistory\" class=\"card\">\n\t    <h5 class=\"card-header\">[[#{easyflow.process.admin.page.commonProcessTaskPassReject.taskHistory}]]</h5>\n\t    <div class=\"card-body\">\n\t       <table id=\"taskHistoryTable\"></table>\n\t    </div>\n    \n    </div>\n    <div id=\"createTaskDialog\" class=\"d-none\">\n        <div class=\"row\">\n            <div class=\"form-group col\">\n                <label>[[#{easyflow.process.admin.page.commonProcessTaskExecute.taskHandleUser}]]:</label>\n                <input class=\"assignUser\"></input>\n            </div>\n        </div>\n    <div class=\"row mt-2\">\n        <div class=\"col text-center\">\n            <button type=\"submit\" class=\"btn btn-primary submit\">[[#{easyflow.process.admin.page.commonProcessTaskExecute.confirm}]]</button>\n        </div>\n    </div>      \n    </div>    \n</div>\n\t<script type=\"text/javascript\" id=\"script\" th:inline=\"javascript\">\nvar pageData = /*[(${pageData})]*/ \"pageData\";\nvar instanceDataModify = /*[(${instanceDataModify})]*/ \"instanceDataModify\";\nvar instanceDataModifyOp = instanceDataModify==true?\"modify\":\"detail\";\n\nvar instanceTemplateId = /*[[${instanceFormId}]]*/ \"formId\";\nif (instanceTemplateId) {\n    instanceData = pageData.instanceBizData ? pageData.instanceBizData : {};\n    instancePage = new J.Page({data:instanceData, ctx:{\"op\":instanceDataModifyOp}, init:false, templates:[{\"code\":instanceTemplateId}], $container:$(\"#instanceForm\"), saveAction:null, helper:{show:false}});\n    instancePage.loadAndRender();\n}\n\nvar taskTemplateId = /*[[${taskFormId}]]*/ \"formId\";\nvar taskData = pageData.executeBizData ? pageData.executeBizData : {};\nvar op = pageData.executeBizData ? \"modify\" : \"add\";\nvar taskPage = new J.Page({data:taskData, ctx:{\"op\":op}, init:false, templates:[{\"code\":taskTemplateId}], $container:$(\"#taskForm\"), saveAction:null, helper:{show:false}});\n taskPage.loadAndRender();\n \n var root = \"[(@{/easyflow/processTask})]\";\n $('#taskHistoryTable').bootstrapTable({\n     showRefresh: false,\n     showColumns: false,\n     url: root + \"/ajax/getTaskHistoryListData?taskNo=\" + pageData.taskNo,\n     sortName: \"createdDate\",\n     sortOrder: \"asc\",\n     columns: [\n         {field: 'taskNo', title: '[(#{easyflow.process.admin.page.commonProcessTaskExecute.taskNo})]'},\n         {field: 'taskBizName', title: '[(#{easyflow.process.admin.page.commonProcessTaskExecute.taskName})]'},\n         {field: 'createdDate', title: '[(#{easyflow.process.admin.page.commonProcessTaskExecute.createdTime})]'},\n         {field: 'executeBizResult', title: '[(#{easyflow.process.admin.page.commonProcessTaskExecute.handleResult})]'},\n         {field: 'executor', title: '[(#{easyflow.process.admin.page.commonProcessTaskExecute.handleUser})]'},\n         {field: 'executeTime', title: '[(#{easyflow.process.admin.page.commonProcessTaskExecute.handleTime})]'},\n     ]\n });\n \n $(\"#createTask\").click(function(){\n\t $.jDialog({\"title\":\"[(#{easyflow.process.admin.page.commonProcessTaskExecute.addHandleUser})]\", \"element\":$(\"#createTaskDialog\"),  \"action\":function($dialog){\n\t\t $dialog.find(\".submit\").click(function(){\n\t\t\t var assignUser = $dialog.find(\".assignUser\").val();\n\t\t\t var assignInfo = {};\n\t\t\t assignInfo['user'] = assignUser.split(\",\");\n\t\t\t pageData.assignInfo = assignInfo;\n\t\t\t $dialog.modal(\"hide\");\n\t\t })\n\t }});\n });\n</script>\n</body>\n</html>"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/templates/easyflow/process/processtask/commonProcessTaskPassReject.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\"\n      th:replace=\"layout::html(#{easyflow.process.admin.page.commonProcessTaskPassReject.taskHandle},~{},~{}, ~{::.breadcrumb-item},~{::#content},~{},~{::#script})\">\n<body>\n<ol class=\"breadcrumb\">\n    <li class=\"breadcrumb-item active\">[[#{easyflow.process.admin.page.commonProcessTaskExecute.taskHandle}]]</li>\n</ol>\n<div id=\"content\">\n<!-- Process info -->\n    <div id=\"instance\" class=\"card\">\n        <h5 class=\"card-header\">[[#{easyflow.process.admin.page.commonProcessTaskPassReject.processInfo}]]</h5>\n\t\t\t<div class=\"card-body\">\n\t\t\t\t<div class=\"row\">\n                    <div class=\"form-group col\">\n                        <label>[[#{easyflow.process.admin.page.commonProcessTaskPassReject.processLink}]]:</label><a\n                            th:href=\"@{/easyflow/processInstance/detail(instanceNo=${instance.instanceNo})}\"\n                            th:text=\"${instance.instanceName}\" class=\"form-control-plaintext\"\n                            style=\"color: rgb(0, 123, 255)\" onclick=\"javascript:J.openWindow(this.href, '_blank','','');return false;\"></a>\n                    </div>\n                    <div class=\"form-group col\">\n                        <label>[[#{easyflow.process.admin.page.commonProcessTaskPassReject.processKeyField}]]:</label><input class=\"form-control\" th:value=\"${instance.keyField}\" readonly=\"readonly\"></input>\n                    </div>\n\t\t\t</div>\n\t\t\t<div id=\"instanceForm\"></div>\n\t\t</div>\n    </div>\n<!-- Task info -->\n    <div id=\"task\" class=\"card\">\n        <h5 class=\"card-header\">[[#{easyflow.process.admin.page.commonProcessTaskPassReject.taskHandle}]]</h5>\n        <div class=\"card-body\">\n                    <th th:if=\"${createTask}\">\n                <button id=\"createTask\">[[#{easyflow.process.admin.page.commonProcessTaskPassReject.addHandleUser}]]</button>\n                <span id=\"createTaskAssignee\"></span>\n            </th>\n            <div id=\"taskForm\"></div> \n            \n         <form method=\"post\" id=\"executeForm\" class=\"j-ajax-form\">\n                <input type=\"hidden\" name=\"instanceBizData\" id=\"instanceBizData\"/>\n                <input type=\"hidden\" name=\"taskNo\" id=\"taskNo\"/>\n                <input type=\"hidden\" name=\"executeBizResult\" id=\"executeBizResult\"/>\n                <input type=\"hidden\" name=\"assignUserList\" id=\"assignUserList\"/>\n                <textarea name=\"executeBizData\" id=\"executeBizData\" class=\"d-none\" ></textarea>\n          <div class=\"row mt-2\">\n            <div class=\"col text-center\">\n            <button type=\"button\" class=\"btn btn-primary j-btn-ok\" data-biz-result=\"PASS\">[[#{easyflow.process.admin.page.commonProcessTaskPassReject.pass}]]</button>\n            <button type=\"button\" class=\"btn btn-primary j-btn-ok\" data-biz-result=\"REJECT\">[[#{easyflow.process.admin.page.commonProcessTaskPassReject.reject}]]</button>\n         </div>\n    </div>              \n        </form> \n                                   \n        </div>\n    </div>\n<!-- Task history -->\n    <div id=\"taskHistory\" class=\"card\">\n        <h5 class=\"card-header\">[[#{easyflow.process.admin.page.commonProcessTaskPassReject.taskHistory}]]</h5>\n        <div class=\"card-body\">\n           <table id=\"taskHistoryTable\"></table>\n        </div>\n    \n    </div>\n    <div class=\"d-none\">\n    <div id=\"createTaskDialog\">\n        <div class=\"row\">\n            <div class=\"form-group col\">\n                <label>[[#{easyflow.process.admin.page.commonProcessTaskPassReject.taskHandleUser}]]:</label>\n                <input class=\"assignUser form-control\"></input>\n            </div>\n        </div>\n    <div class=\"row mt-2\">\n        <div class=\"col text-center\">\n            <button type=\"submit\" class=\"btn btn-primary submit\">[[#{easyflow.process.admin.page.commonProcessTaskPassReject.confirm}]]</button>\n        </div>\n    </div>      \n    </div>  \n    </div>  \n</div>\n<script type=\"text/javascript\" id=\"script\" th:inline=\"javascript\">\nJ.formTemplateUrl = \"/easyflow/formTemplate/ajax/getTemplate\";\nvar pageData = /*[(${pageData})]*/ \"pageData\";\n\nvar instanceDataModify = /*[(${instanceDataModify})]*/ \"instanceDataModify\";\nvar instanceDataModifyOp = instanceDataModify==true?\"modify\":\"detail\";\nvar instanceTemplateId = /*[[${instanceFormId}]]*/ \"formId\";\nvar instanceData, instancePage;\nif (instanceTemplateId) {\n\tinstanceData = pageData.instanceBizData ? pageData.instanceBizData : {};\n\tinstancePage = new J.Page({data:instanceData, ctx:{\"op\":instanceDataModifyOp}, init:false, templates:[{\"code\":instanceTemplateId}], $container:$(\"#instanceForm\"), saveAction:null, helper:{show:false}});\n\tinstancePage.loadAndRender();\n}\n\nvar taskData = {};\nvar taskTemplateId = /*[[${taskFormId}]]*/ \"formId\";\nif (taskTemplateId) {\n\tvar taskPage = new J.Page({data:taskData, ctx:{\"op\":\"add\"}, init:false, templates:[{\"code\":taskTemplateId}], $container:$(\"#taskForm\"), saveAction:null, helper:{show:false}});\n\ttaskPage.loadAndRender();\n}\n\nvar root = \"[(@{/easyflow/processTask})]\";\n$('#taskHistoryTable').bootstrapTable({\n    showRefresh: false,\n    showColumns: false,   \n    url: root + \"/ajax/getTaskHistoryListData?taskNo=\" + pageData.taskNo,\n    sortName: \"createdDate\",\n    sortOrder: \"asc\",\n    columns: [\n        {field: 'taskNo', title: '[(#{easyflow.process.admin.page.commonProcessTaskPassReject.taskNo})]'},\n        {field: 'taskBizName', title: '[(#{easyflow.process.admin.page.commonProcessTaskPassReject.taskName})]'},\n        {field: 'createdDate', title: '[(#{easyflow.process.admin.page.commonProcessTaskPassReject.createdTime})]'},\n        {field: 'executeBizResult', title: '[(#{easyflow.process.admin.page.commonProcessTaskPassReject.handleResult})]'},\n        {field: 'executor', title: '[(#{easyflow.process.admin.page.commonProcessTaskPassReject.handleUser})]'},\n        {field: 'executeTime', title: '[(#{easyflow.process.admin.page.commonProcessTaskPassReject.handleTime})]'},\n    ]\n});\n \n var $executeForm=$(\"#executeForm\");\n $executeForm.attr(\"action\",\"/easyflow/processTask/ajax/commonTaskExecute\");\n $executeForm.data(\"success-url\", \"/easyflow/processTask/list\");\n $executeForm.find(\".j-btn-ok\").click(function(){\n\t if (instanceTemplateId) {\n\t\t if (! instancePage.$form.valid()) {\n\t\t\t $.jMessage({title:\"[(#{easyflow.process.admin.page.commonProcessTaskPassReject.tip})]\", msg:\"[(#{easyflow.process.admin.page.commonProcessTaskPassReject.instanceErrorTip})]\"}); \n\t\t\t return false;\n\t\t } else {\n\t\t\t instancePage.collect(instanceData);\n\t\t\t $(\"#instanceBizData\").val(JSON.stringify(instanceData, null, 2));\n\t\t }\n\t }\n\t if (taskTemplateId) {\n\t\t if (! taskPage.$form.valid()) {\n\t\t\t $.jMessage({title:\"[(#{easyflow.process.admin.page.commonProcessTaskPassReject.tip})]\", msg:\"[(#{easyflow.process.admin.page.commonProcessTaskPassReject.instanceErrorTip})]\"});\n\t\t\t return false;\n\t\t }\n\t     taskPage.collect(taskData);\n\t     $(\"#executeBizData\").val(JSON.stringify(taskData, null, 2));\n\t }\n     $(\"#taskNo\").val(pageData.taskNo);\n     $(\"#executeBizResult\").val($(this).data(\"biz-result\"));\n     $executeForm.submit();\n }); \n\n $(\"#createTask\").click(function(){\n     $.jDialog({\"title\":\"[(#{easyflow.process.admin.page.commonProcessTaskPassReject.addHandleUser})]\", \"element\":$(\"#createTaskDialog\"),  \"action\":function($dialog){\n         $dialog.find(\".submit\").click(function(){\n             var assignUser = $dialog.find(\".assignUser\").val();\n             $(\"#createTaskAssignee\").text(assignUser);\n             $(\"#assignUserList\").val(assignUser);\n             $dialog.modal(\"hide\");\n         })\n     }});\n });\n</script>\n</body>\n</html>"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/templates/easyflow/process/processtask/processTaskList.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\"\n      th:replace=\"layout::html(#{easyflow.process.admin.page.processTaskList.todoTask},~{},~{}, ~{::.breadcrumb-item},~{::#content},~{},~{::#script})\">\n<body>\n<ol class=\"breadcrumb\">\n    <li class=\"breadcrumb-item active\">[[#{easyflow.process.admin.page.processTaskList.todoTask}]]</li>\n</ol>\n<div id=\"content\">\n    <div id=\"tabs\">\n        <div id=\"tableContainer\">\n            <!-- Search -->\n            <form id=\"search\" class=\"card j-form-horizontal\">\n                <div class=\"card-body\">\n                    <div class=\"form-row\">\n                        <div class=\"form-group col\">\n                            <label>[[#{easyflow.process.admin.page.processTaskList.queryType}]]:</label>\n                            <select name=\"queryType\" class=\"form-control\" id=\"queryType\">\n                                <option value=\"MY_TODO\">[[#{easyflow.process.admin.page.processTaskList.myTodo}]]</option>\n                                <option value=\"MY_DONE\">[[#{easyflow.process.admin.page.processTaskList.myDone}]]</option>\n                                <option value=\"ALL\">[[#{easyflow.process.admin.page.processTaskList.allTask}]]</option>\n                            </select>\n                        </div>\n                        <div class=\"form-group col\">\n                            <label>[[#{easyflow.process.admin.page.processTaskList.processType}]]:</label><input type=\"text\" name=\"processType\" class=\"form-control\"></input>\n                        </div>\n                        <div class=\"form-group col\">\n                            <label>[[#{easyflow.process.admin.page.processTaskList.bizNo}]]:</label><input name=\"bizNo\" class=\"form-control\"></input>\n                        </div>\n                        <div class=\"form-group col\">\n                            <label>[[#{easyflow.process.admin.page.processTaskList.productCode}]]:</label><input name=\"productCode\" class=\"form-control\"></input>\n                        </div>\n                    </div>\n                    <div class=\"form-row\">                        \n                        <div class=\"form-group col\">\n                            <label>[[#{easyflow.process.admin.page.processTaskList.taskNo}]]:</label><input name=\"taskNo\" class=\"form-control\"></input>\n                        </div>\n                        <div class=\"form-group col\">\n                            <label>[[#{easyflow.process.admin.page.processTaskList.nodeInstanceNo}]]:</label><input name=\"nodeInstanceNo\" class=\"form-control\"></input>\n                        </div>         \n                        <div class=\"form-group col\">\n                            <label>[[#{easyflow.process.admin.page.processTaskList.processInstanceNo}]]:</label><input name=\"processInstanceNo\" class=\"form-control\"></input>\n                        </div> \n                        <div class=\"form-group col\">\n                            <label>[[#{easyflow.process.admin.page.processTaskList.keyField}]]:</label><input name=\"processInstanceKeyField\" class=\"form-control\"></input>\n                        </div>                                                                                      \n                    </div>                  \n                    <div class=\"form-row\">\n                        <div class=\"col text-center\">\n                            <button id=\"query\" class=\"btn btn-primary\">[[#{easyflow.process.admin.page.processTaskList.query}]]</button>\n                            <button id=\"reset\" class=\"btn btn-secondary\">[[#{easyflow.process.admin.page.processTaskList.reset}]]</button>\n                        </div>\n                    </div>\n                </div>\n            </form>\n            <!-- Table -->\n            <table id=\"datatable\"></table>\n        </div>\n    </div>\n\n</div>\n<script type=\"text/javascript\" id=\"script\" th:inline=\"javascript\">\n    $(\"#tabs\").jTabs().jTabs(\"open\", {id: \"tab-table\", name: \"[(#{easyflow.process.admin.page.processTaskList.taskList})]\", element: $(\"#tableContainer\"), closeable: false});\n    var queryParam = {};\n\n    function reset() {\n        $(\"#search .form-control\").val(\"\");\n        $(\"#queryType\").val(\"MY_TODO\");\n        queryParam = $(\"#search\").serializeObject();\n    };\n    reset();\n    $(\"#query\").click(function () {\n        queryParam = $(\"#search\").serializeObject();\n        $('#datatable').bootstrapTable(\"refresh\");\n        return false;\n    });\n    $(\"#reset\").click(function () {\n        reset();\n        return false;\n    });\n    var root = \"[(@{/easyflow/processTask})]\";\n    var instanceRoot = \"[(@{/easyflow/processInstance})]\";\n    $('#datatable').bootstrapTable({\n        url: root + \"/ajax/getListData\",\n        toolbar: \"#toolbar\",\n        sortName: \"createdDate\",\n        sortOrder: \"desc\",\n        columns: [\n            {radio: true},\n            {\n                field: 'taskNo', title: '[(#{easyflow.process.admin.page.processTaskList.taskNo})]', formatter: function (data, item) {\n                    return \"<a class='j-op detailBtn' data-record-id='\" + item.taskNo + \"'>\" + data + \"</a>\";\n                }\n            },\n            {field: 'instanceName', title: '[(#{easyflow.process.admin.page.processTaskList.instanceName})]',formatter: function (data, item) {\n                return \"<button type='button' class='btn btn-link j-op instanceBtn' data-process-instance-no='\" + item.processInstanceNo + \"'>\" + (data?data : item.processInstanceNo) + \"</button>\";\n            }},\n            {field: 'taskBizName', title: '[(#{easyflow.process.admin.page.processTaskList.taskBizName})]'},\n            {field: 'processType', title: '[(#{easyflow.process.admin.page.processTaskList.processType})]'},\n            {field: 'bizNo', title: '[(#{easyflow.process.admin.page.processTaskList.processBizNo})]'},\n            {field: 'productCode', title: '[(#{easyflow.process.admin.page.processTaskList.productCode})]'},\n            {field: 'instanceStatus', title: '[(#{easyflow.process.admin.page.processTaskList.instanceStatus})]', formatter: function (data) {\n                return {\"ACTIVE\":\"[(#{easyflow.process.admin.page.processTaskList.instanceStatusActive})]\", \"CLOSE\":\"[(#{easyflow.process.admin.page.processTaskList.instanceStatusFinished})]\"}[data];\n            }},\n            {field: 'instanceCreator', title: '[(#{easyflow.process.admin.page.processTaskList.instanceCreator})]'},\n            {field: 'instanceKeyField', title: '[(#{easyflow.process.admin.page.processTaskList.keyField})]'},\n            {field: 'instanceCreatedDate', title: '[(#{easyflow.process.admin.page.processTaskList.instanceCreateTime})]',sortable: true},\n            {field: 'status', title: '[(#{easyflow.process.admin.page.processTaskList.taskStatus})]', formatter: function (data) {\n                return {\"PENDING\":\"[(#{easyflow.process.admin.page.processTaskList.taskStatusPending})]\", \"FINISH\":\"[(#{easyflow.process.admin.page.processTaskList.taskStatusFinish})]\", \"CANCELED\":\"[(#{easyflow.process.admin.page.processTaskList.taskStatusCanceled})]\", \"INVALID\":\"[(#{easyflow.process.admin.page.processTaskList.taskStatusInvalid})]\"}[data];\n            }},\n            {field: 'executor', title: '[(#{easyflow.process.admin.page.processTaskList.taskExecutor})]'},\n            {field: 'createdDate', title: '[(#{easyflow.process.admin.page.processTaskList.taskCreatedDate})]',sortable: true},\n            {\n                field: 'op', title: '[(#{easyflow.process.admin.page.processTaskList.op})]', formatter: function (data,item) {\n                    let content = \"\";\n                    if (item.canHandle) {\n                    content +=\"<button type='button' class='btn btn-link j-op handleBtn' data-record-id='\" + item.taskNo + \"'>[(#{easyflow.process.admin.page.processTaskList.opHandle})]</button>\";\n                    }\n                    if (item.canWithdraw) {\n                        content +=\"<button type='button' class='btn btn-link j-op withdrawBtn' data-record-id='\" + item.taskNo + \"'>[(#{easyflow.process.admin.page.processTaskList.opWithdraw})]</button>\";\n                    }\n                    content +=\"<button type='button' class='btn btn-link j-op detailBtn' data-record-id='\" + item.taskNo + \"'>[(#{easyflow.process.admin.page.processTaskList.opDetail})]</button>\";\n                    return content;\n                }\n            }\n        ],\n        queryParams: function (param) {\n            $.extend(param, queryParam);\n            return param;\n        }\n    });\n    \n    $(\"#datatable\").on(\"click\", \".detailBtn\", function () {\n        J.openWindow(root + \"/detail?taskNo=\" + $(this).data(\"record-id\"), \"_blank\", \"\", \"\");\n    });\n    $(\"#datatable\").on(\"click\", \".handleBtn\", function () {\n        J.openWindow(root + \"/handle?taskNo=\" + $(this).data(\"record-id\"), \"_self\", \"\", \"\");\n    });\n    $(\"#datatable\").on(\"click\", \".withdrawBtn\", function () {\n        $.jAjax({confirm:\"[(#{easyflow.process.admin.page.processTaskList.withDrawConfirm})]\", url:root+\"/ajax/withdraw?taskNo=\" + $(this).data(\"record-id\")});\n    });  \n    $(\"#datatable\").on(\"click\", \".instanceBtn\", function () {\n        J.openWindow(instanceRoot + \"/detail?instanceNo=\" + $(this).data(\"processInstanceNo\"), \"_blank\", \"\", \"\");\n    });   \n</script>\n</body>\n</html>"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/templates/easyflow/processunit/processUnitExecutionDetail.html",
    "content": "<div th:class=\"'container-fluid j-info-container frame-' + ${detail.executionNo}\">\n    <div class=\"card-header mb-3\">[[#{easyflow.process.admin.page.processUnitExecutionDetail.excutionDetailInfo}]]</div>\n    <div class=\"row\">\n        <dl class=\"j-info-group col\"><dt>[[#{easyflow.process.admin.page.processUnitExecutionDetail.executionNo}]]:</dt><dd th:text=\"${detail.executionNo}\"></dd></dl>\n        <dl class=\"j-info-group col\"><dt>[[#{easyflow.process.admin.page.processUnitExecutionDetail.requestNo}]]:</dt><dd th:text=\"${detail.requestNo}\"></dd></dl>\n        <dl class=\"j-info-group col\"><dt>[[#{easyflow.process.admin.page.processUnitExecutionDetail.processUnitCode}]]:</dt><dd th:text=\"${detail.processUnitCode}\"></dd></dl>\n        <dl class=\"j-info-group col\"><dt>[[#{easyflow.process.admin.page.processUnitExecutionDetail.bizNo}]]:</dt><dd th:text=\"${detail.bizNo}\"></dd></dl>\n     </div>\n    <div class=\"row\">\n        <dl class=\"j-info-group col\"><dt>[[#{easyflow.process.admin.page.processUnitExecutionDetail.productCode}]]:</dt><dd th:text=\"${detail.productCode}\"></dd></dl> \n        <dl class=\"j-info-group col\"><dt>[[#{easyflow.process.admin.page.processUnitExecutionDetail.result}]]:</dt>\n        <dd th:if=\"${detail.result=='SUCCESS'}\">SUCCESS-[[#{easyflow.process.admin.page.processUnitExecutionDetail.resultSuccess}]]</dd>\n        <dd th:if=\"${detail.result=='FAIL'}\">FAIL-[[#{easyflow.process.admin.page.processUnitExecutionDetail.resultFail}]]</dd>\n        <dd th:if=\"${detail.result=='DOING'}\">DOING-[[#{easyflow.process.admin.page.processUnitExecutionDetail.resultDoing}]]</dd>\n        <dd th:if=\"${detail.result=='EXCEPTION'}\">EXCEPTION-[[#{easyflow.process.admin.page.processUnitExecutionDetail.resultException}]]</dd>\n        </dl>        \n        <dl class=\"j-info-group col\"><dt>[[#{easyflow.process.admin.page.processUnitExecutionDetail.execType}]]:</dt>\n        <dd th:if=\"${detail.execType=='SYNC'}\">[[#{easyflow.process.admin.page.processUnitExecutionDetail.execTypeSync}]]</dd>\n        <dd th:if=\"${detail.execType=='MANUAL_ASYNC'}\">[[#{easyflow.process.admin.page.processUnitExecutionDetail.execTypeManual}]]</dd>\n        <dd th:if=\"${detail.execType=='TASK_ASYNC'}\">[[#{easyflow.process.admin.page.processUnitExecutionDetail.execTypeTask}]]</dd>\n        <dd th:if=\"${detail.execType=='MSG_ASYNC'}\">[[#{easyflow.process.admin.page.processUnitExecutionDetail.execTypeMsg}]]</dd>        \n        </dl>  \n        <dl class=\"j-info-group col\"><dt>[[#{easyflow.process.admin.page.processUnitExecutionDetail.elapseTime}]]:</dt><dd th:text=\"${detail.elaspeTime}\"></dd></dl>              \n    </div> \n   <div class=\"row\">     \n        <dl class=\"j-info-group col\"><dt>[[#{easyflow.process.admin.page.processUnitExecutionDetail.requestTime}]]:</dt><dd th:text=\"${#dates.format(detail.requestTime,'yyyy-MM-dd HH:mm:ss')}\"></dd></dl>               \n        <dl class=\"j-info-group col\"><dt>[[#{easyflow.process.admin.page.processUnitExecutionDetail.responseTime}]]:</dt><dd th:text=\"${#dates.format(detail.responseTime,'yyyy-MM-dd HH:mm:ss')}\"></dd></dl>\n        <dl class=\"j-info-group col\"><dt>[[#{easyflow.process.admin.page.processUnitExecutionDetail.createdDate}]]:</dt><dd th:text=\"${#dates.format(detail.createdDate,'yyyy-MM-dd HH:mm:ss')}\"></dd></dl>\n        <dl class=\"j-info-group col\"><dt>[[#{easyflow.process.admin.page.processUnitExecutionDetail.modifiedDate}]]:</dt><dd th:text=\"${#dates.format(detail.modifiedDate,'yyyy-MM-dd HH:mm:ss')}\"></dd></dl>        \n   </div>        \n    <div class=\"row\">     \n        <dl class=\"j-info-group col\"><dt>[[#{easyflow.process.admin.page.processUnitExecutionDetail.requestContent}]]:</dt><dd><pre th:text=\"${detail.requestContent}\"></pre></dd></dl>\n        <dl class=\"j-info-group col\"><dt>[[#{easyflow.process.admin.page.processUnitExecutionDetail.responseContent}]]:</dt><dd><pre th:text=\"${detail.responseContent}\"></pre></dd></dl>\n    </div>\n   <div class=\"row\">    \n        <dl class=\"j-info-group col\"><dt>[[#{easyflow.process.admin.page.processUnitExecutionDetail.extData}]]:</dt><dd><pre th:text=\"${detail.extData}\"></pre></dd></dl>\n  </div>\n    </div> \n</div>\n\n<script th:inline=\"javascript\">\n(function() {\n})();\n</script>"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/templates/easyflow/processunit/processUnitExecutionList.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\"\n      th:replace=\"layout::html(#{easyflow.process.admin.page.processUnitExecutionList.executionManagement},~{},~{::#style}, ~{::.breadcrumb-item},~{::#content},~{},~{::#script})\">\n<body>\n<ol class=\"breadcrumb\">\n    <li class=\"breadcrumb-item active\">[[#{easyflow.process.admin.page.processUnitExecutionList.executionManagement}]]</li>\n</ol>\n<div id=\"content\">\n    <div id=\"tabs\">\n        <div id=\"tableContainer\">\n            <form id=\"search\" class=\"card j-form-horizontal\" autocomplete=\"off\">\n                <div class=\"card-body\">\n                    <div class=\"form-row\">\n                        <div class=\"form-group col\">\n                            <label>[[#{easyflow.process.admin.page.processUnitExecutionList.queryType}]]:</label>\n                            <div class=\"form-check form-check-inline\">\n                              <input class=\"form-check-input\" type=\"radio\" name=\"queryType\" id=\"queryType-INSTANCE\" value=\"INSTANCE\" checked>\n                              <label class=\"form-check-label\" for=\"queryType-INSTANCE\"><b>[[#{easyflow.process.admin.page.processUnitExecutionList.queryByInstance}]]</b>([[#{easyflow.process.admin.page.processUnitExecutionList.queryByInstanceTip}]])</label>\n                            </div>\n                            <div class=\"form-check form-check-inline\">\n                              <input class=\"form-check-input\" type=\"radio\" name=\"queryType\" id=\"queryType-REQUEST_TIME_RANGE\" value=\"REQUEST_TIME_RANGE\">\n                              <label class=\"form-check-label\" for=\"queryType-REQUEST_TIME_RANGE\"><b>[[#{easyflow.process.admin.page.processUnitExecutionList.queryByTime}]]</b>([[#{easyflow.process.admin.page.processUnitExecutionList.queryByTimeTip}]]), <b>[[#{easyflow.process.admin.page.processUnitExecutionList.onlyFirstPageSupport}]]</b></label>\n                            </div>\n                        </div>\n                    </div>                    \n                   <div class=\"form-row\">                    \n                        <div class=\"form-group col\">\n                            <label><span class=\"required\">*</span>[[#{easyflow.process.admin.page.processUnitExecutionList.queryProcessUnitCode}]]:</label><select name=\"processUnitCode\" class=\"form-control\">\n                                <option value=\"\">--[[#{easyflow.process.admin.page.processUnitExecutionList.querySelect}]]--</option>\n                                <option th:each=\"item,itemStat:${processUnitList}\" th:value=\"${item.processUnitCode}\" th:text=\"${item.processUnitCode}+':'+${item.name}\"></option>\n                            </select>\n                        </div>\n                        <div class=\"form-group col\">\n                            <label>[[#{easyflow.process.admin.page.processUnitExecutionList.queryBizNo}]]</label><input name=\"bizNo\" id=\"bizNo\" class=\"form-control\"></input>\n                        </div>\n                       <div class=\"form-group col\">\n                            <label>[[#{easyflow.process.admin.page.processUnitExecutionList.queryInstanceNo}]]:</label><input name=\"instanceNo\" id=\"instanceNo\" class=\"form-control\"></input>\n                        </div>                            \n                        <div class=\"form-group col\">\n                            <label>[[#{easyflow.process.admin.page.processUnitExecutionList.queryResult}]]:</label>\n                            <select class=\"form-control d-none\" name=\"resultList\" id=\"resultList\"  multiple=\"multiple\">\n                                <option value=\"SUCCESS\">[[#{easyflow.process.admin.page.processUnitExecutionList.queryResultSuccess}]]</option>\n                                <option value=\"FAIL\">[[#{easyflow.process.admin.page.processUnitExecutionList.queryResultFail}]]</option>\n                                <option value=\"DOING\">[[#{easyflow.process.admin.page.processUnitExecutionList.queryResultDoing}]]</option>\n                                <option value=\"EXCEPTION\">[[#{easyflow.process.admin.page.processUnitExecutionList.queryResultException}]]</option>\n                        </select>\n                        </div>                                                                     \n                    </div>\n                    <div class=\"form-row\">\n                        <div class=\"form-group col\">\n                            <label>[[#{easyflow.process.admin.page.processUnitExecutionList.queryRequestTimeStart}]]:</label>\n                            <input type=\"text\" class=\"form-control\" name=\"requestTimeStart\" id=\"requestTimeStart\"/>\n                        </div>\n                        <div class=\"form-group col\">\n                            <label>[[#{easyflow.process.admin.page.processUnitExecutionList.queryRequestTimeEnd}]]:</label>\n                            <input type=\"text\" class=\"form-control\" name=\"requestTimeEnd\" id=\"requestTimeEnd\"/>\n                        </div>\n                        <div class=\"form-group col\">\n                            <label>[[#{easyflow.process.admin.page.processUnitExecutionList.queryElapseTimeStart}]](ms):</label>\n                            <input type=\"text\" class=\"form-control\" name=\"elapseTimeStart\" id=\"elapseTimeStart\"/>\n                        </div>\n                        <div class=\"form-group col\">\n                            <label>[[#{easyflow.process.admin.page.processUnitExecutionList.queryElapseTimeEnd}]](ms):</label>\n                            <input type=\"text\" class=\"form-control\" name=\"elapseTimeEnd\" id=\"elapseTimeEnd\"/>\n                        </div>                        \n                    </div>\n                    <div class=\"form-row\">\n                        <div class=\"col text-center\">\n                            <button id=\"query\" class=\"btn btn-primary\">[[#{easyflow.process.admin.page.processUnitExecutionList.queryBtn}]]</button>\n                        </div>\n                    </div>\n                </div>\n            </form>\n            <table id=\"datatable\"></table>\n        </div>\n    </div>\n\n</div>\n<style type=\"text/css\" id=\"style\">\n    .pagination {display: none !important}\n    /*.page-item {display: none}    \n    .page-next {display: block !important}*/\n</style>\n<script type=\"text/javascript\" id=\"script\" th:inline=\"javascript\">\n    $(\"#tabs\").jTabs().jTabs(\"open\", {id: \"tab-table\", name: \"[(#{easyflow.process.admin.page.processUnitExecutionList.executionList})]\", element: $(\"#tableContainer\"), closeable: false});\n    $.validator.addMethod(\"datetime\", function(value, element) {\nvar datetime = /^[0-9]{4}-(((0[13578]|(10|12))-(0[1-9]|[1-2][0-9]|3[0-1]))|(02-(0[1-9]|[1-2][0-9]))|((0[469]|11)-(0[1-9]|[1-2][0-9]|30)))\\s+([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$/;\nreturn this.optional(element) || (datetime.test(value));\n}, \"[(#{easyflow.process.admin.page.processUnitExecutionList.dateFormatInvalid})]\");   \n    $(\"#search\").validate({\n        rules: {\n            \"requestTimeStart\": {\"datetime\": true},\n            \"requestTimeEnd\": {\"datetime\": true}\n        }\n    });\n    if (\"datetimepicker\" in $.fn) {\n\t    $(\"#requestTimeStart\").datetimepicker({startView:2, minView:0, format:\"yyyy-mm-dd hh:ii:ss\"});    \n\t    $(\"#requestTimeEnd\").datetimepicker({startView:2, minView:0, format:\"yyyy-mm-dd hh:ii:ss\"});\n    }\n    var queryParam = {};\n    $(\"[name='processUnitCode']\").multiselect({\n       enableFiltering: true\n   });    \n   $(\"[name='resultList']\").multiselect({\n       enableFiltering: true,\n       includeSelectAllOption: true,\n   });\n    $(\"#query\").click(function (e) {\n        var currentQueryParam = $(\"#search\").serializeObject();\n        if (currentQueryParam.queryType=='INSTANCE') {\n            if (currentQueryParam.instanceNo=='' && (currentQueryParam.processUnitCode=='' || currentQueryParam.bizNo=='')) {\n                $.jMessage({msg: \"[(#{easyflow.process.admin.page.processUnitExecutionList.instanceInfoCannotNull})]\"});\n                e.preventDefault();\n                return false;\n            }\n        } else {\n            if (currentQueryParam.processUnitCode=='') {\n                $.jMessage({msg: \"[(#{easyflow.process.admin.page.processUnitExecutionList.processUnitCodeCannotNull})]\"});\n                e.preventDefault();\n                return false;                \n            }            \n            if (currentQueryParam.requestTimeStart == '' || currentQueryParam.requestTimeEnd == '') {\n                $.jMessage({msg: \"[(#{easyflow.process.admin.page.processUnitExecutionList.timeRangeCannotNull})]\"});\n                e.preventDefault();\n                return false;\n            }\n            if (currentQueryParam.requestTimeStart > currentQueryParam.requestTimeEnd) {\n                $.jMessage({msg: \"[(#{easyflow.process.admin.page.processUnitExecutionList.startTimeCannotGtEndTime})]\"});\n                e.preventDefault();\n                return false;\n            }\n            if(new Date(currentQueryParam.requestTimeEnd).getTime() - new Date(currentQueryParam.requestTimeStart).getTime() > 30 * 24 * 3600 * 1000) {\n                $.jMessage({msg: \"[(#{easyflow.process.admin.page.processUnitExecutionList.TimeRangeCannotGt30Days})]\"});\n                e.preventDefault();\n                return false;\n            }                        \n        }\n        queryParam = currentQueryParam;\n        $('#datatable').bootstrapTable(\"refresh\",{url: root + \"/ajax/getProcessUnitExecutionListData\"});\n        e.preventDefault();\n        return false;\n    });\n    var root = \"[(@{/easyflow/processUnit})]\";\n    $('#datatable').bootstrapTable({\n        columns: [\n        {radio: true},\n        {\n            field: 'executionNo', title: '[(#{easyflow.process.admin.page.processUnitExecutionList.executionNo})]', formatter: function (data, item) {\n                return \"<a class='j-op detailBtn' data-execution-no='\" + item.executionNo\n                + \"' data-instance-no='\" + item.instanceNo\n                + \"' data-unit-code='\" + item.processUnitCode + \"' data-biz-no='\" + item.bizNo + \"'>\" + data + \"</a>\";\n            }\n        },\n        {field: 'requestNo', title: '[(#{easyflow.process.admin.page.processUnitExecutionList.requestNo})]'},\n            {field: 'processUnitCode', title: '[(#{easyflow.process.admin.page.processUnitExecutionList.processUnitCode})]'},\n            {field: 'bizNo', title: '[(#{easyflow.process.admin.page.processUnitExecutionList.bizNo})]'},        \n            {field: 'result', title: '[(#{easyflow.process.admin.page.processUnitExecutionList.result})]', formatter: function (data) {\n                return {\"SUCCESS\":\"[(#{easyflow.process.admin.page.processUnitExecutionList.resultSuccess})]\", \"FAIL\":\"[(#{easyflow.process.admin.page.processUnitExecutionList.resultFail})]\", \"DOING\":\"[(#{easyflow.process.admin.page.processUnitExecutionList.resultDoing})]\", \"EXCEPTION\":\"[(#{easyflow.process.admin.page.processUnitExecutionList.resultException})]\"}[data];\n                }},\n        {field: 'requestContent', title: '[(#{easyflow.process.admin.page.processUnitExecutionList.requestContent})]'},\n        {field: 'responseContent', title: '[(#{easyflow.process.admin.page.processUnitExecutionList.responseContent})]'},                \n        {field: 'execType', title: '[(#{easyflow.process.admin.page.processUnitExecutionList.execType})]'},   \n        {field: 'requestTime', title: '[(#{easyflow.process.admin.page.processUnitExecutionList.requestTime})]'},\n        {field: 'responseTime', title: '[(#{easyflow.process.admin.page.processUnitExecutionList.responseTime})]'},    \n        {field: 'elapseTime', title: '[(#{easyflow.process.admin.page.processUnitExecutionList.elapseTime})](ms)'},                                              \n        {field: 'extData', title: '[(#{easyflow.process.admin.page.processUnitExecutionList.extData})]'},        \n            {field: 'createdDate', title: '[(#{easyflow.process.admin.page.processUnitExecutionList.createdDate})]'},\n            {field: 'modifiedDate', title: '[(#{easyflow.process.admin.page.processUnitExecutionList.modifiedDate})]'}\n        ],\n        queryParams: function (param) {\n            $.extend(param, queryParam);\n            return param;\n        },\n        pageList:[10, 50, 100, 500],\n        paginationNextText: \"[(#{easyflow.process.admin.page.processUnitExecutionList.nextPage})]\"        \n    });\n\n    $(\"#datatable\").on(\"click\", \".detailBtn\", function () {\n        $(\"#tabs\").jTabs(\"open\", {id:$(this).data(\"execution-no\"), url:root + \"/processUnitExecutionDetail?executionNo=\" + $(this).data(\"execution-no\") + \"&instanceNo=\" + $(this).data(\"instance-no\") + \"&processUnitCode=\" + $(this).data(\"unit-code\") + ($(this).data(\"biz-no\") == null ? \"\": \"&bizNo=\" + $(this).data(\"biz-no\"))});     \n        return false;\n    });\n    $(\"#queryType-INSTANCE\").click(function(){\n        $(\"#requestTimeStart\").val(\"\");\n        $(\"#requestTimeEnd\").val(\"\");\n        $(\"#elapseTimeStart\").val(\"\");\n        $(\"#elapseTimeEnd\").val(\"\");\n        $(\"#resultList\").multiselect('deselect',[\"SUCCESS\",\"FAIL\",\"DOING\",\"EXCEPTION\"]);\n    });\n    $(\"#queryType-REQUEST_TIME_RANGE\").click(function(){\n        $(\"#bizNo\").val(\"\");\n        $(\"#instanceNo\").val(\"\");\n        $(\"#requestTimeStart\").val(J.getNowDate()+\" 00:00:00\");\n        $(\"#requestTimeEnd\").val(J.getNowDate()+\" 23:59:59\");     \n    });    \n\n</script>\n</body>\n</html>"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/templates/easyflow/processunit/processUnitInstanceDetail.html",
    "content": "<div th:class=\"'container-fluid j-info-container frame-' + ${detail.instanceNo}\">\n    <div class=\"card j-form-horizontal\">\n        <div class=\"card-header mb-3\">[[#{easyflow.process.admin.page.processUnitInstanceDetail.instanceDetailInfo}]]</div>\n    <div class=\"row\">\n        <dl class=\"j-info-group col\"><dt>[[#{easyflow.process.admin.page.processUnitInstanceDetail.instanceNo}]]:</dt><dd th:text=\"${detail.instanceNo}\"></dd></dl>\n        <dl class=\"j-info-group col\"><dt>[[#{easyflow.process.admin.page.processUnitInstanceDetail.processUnitCode}]]:</dt><dd th:text=\"${detail.processUnitCode}\"></dd></dl>\n        <dl class=\"j-info-group col\"><dt>[[#{easyflow.process.admin.page.processUnitInstanceDetail.bizNo}]]:</dt><dd th:text=\"${detail.bizNo}\"></dd></dl>\n        <dl class=\"j-info-group col\"><dt>[[#{easyflow.process.admin.page.processUnitInstanceDetail.productCode}]]:</dt><dd th:text=\"${detail.productCode}\"></dd></dl>\n     </div>\n    <div class=\"row\">\n        <dl class=\"j-info-group col\"><dt>[[#{easyflow.process.admin.page.processUnitInstanceDetail.result}]]:</dt>\n        <dd th:if=\"${detail.result=='SUCCESS'}\">SUCCESS-[[#{easyflow.process.admin.page.processUnitInstanceDetail.resultSuccess}]]</dd>\n        <dd th:if=\"${detail.result=='FAIL'}\">FAIL-[[#{easyflow.process.admin.page.processUnitInstanceDetail.resultFail}]]</dd>\n        <dd th:if=\"${detail.result=='DOING'}\">DOING-[[#{easyflow.process.admin.page.processUnitInstanceDetail.resultDoing}]]</dd>\n        <dd th:if=\"${detail.result=='EXCEPTION'}\">EXCEPTION-[[#{easyflow.process.admin.page.processUnitInstanceDetail.resultException}]]</dd>\n        </dl>\n        <dl class=\"j-info-group col\"><dt>[[#{easyflow.process.admin.page.processUnitInstanceDetail.autoRunTimes}]]:</dt><dd th:text=\"${detail.autoRunTimes}\"></dd></dl>        \n        <dl class=\"j-info-group col\"><dt>[[#{easyflow.process.admin.page.processUnitInstanceDetail.autoRunFlag}]]:</dt><dd th:text=\"${detail.autoRunFlag}\"></dd></dl>\n        <dl class=\"j-info-group col\"><dt>[[#{easyflow.process.admin.page.processUnitInstanceDetail.nextAutoRunTime}]]:</dt><dd th:text=\"${#dates.format(detail.nextAutoRunTime,'yyyy-MM-dd HH:mm:ss')}\"></dd></dl>\n    </div>\n    <div class=\"row\">\n        <dl class=\"j-info-group col-3\"><dt>[[#{easyflow.process.admin.page.processUnitInstanceDetail.createdDate}]]:</dt><dd th:text=\"${#dates.format(detail.createdDate,'yyyy-MM-dd HH:mm:ss')}\"></dd></dl>\n        <dl class=\"j-info-group col-3\"><dt>[[#{easyflow.process.admin.page.processUnitInstanceDetail.modifiedDate}]]:</dt><dd th:text=\"${#dates.format(detail.modifiedDate,'yyyy-MM-dd HH:mm:ss')}\"></dd></dl>\n    </div>\n    <div class=\"row\">\n        <dl class=\"j-info-group col\"><dt>[[#{easyflow.process.admin.page.processUnitInstanceDetail.requestContent}]]:</dt><dd><pre th:text=\"${detail.requestContent}\"></pre></dd></dl>\n        <dl class=\"j-info-group col\"><dt>[[#{easyflow.process.admin.page.processUnitInstanceDetail.responseContent}]]:</dt><dd><pre th:text=\"${detail.responseContent}\"></pre></dd></dl>\n    </div>\n    <div class=\"row\">    \n        <dl class=\"j-info-group col\"><dt>[[#{easyflow.process.admin.page.processUnitInstanceDetail.vars}]]:</dt><dd><pre th:text=\"${detail.vars}\"></pre></dd></dl>\n        <dl class=\"j-info-group col\"><dt>[[#{easyflow.process.admin.page.processUnitInstanceDetail.extData}]]:</dt><dd><pre th:text=\"${detail.extData}\"></pre></dd></dl>\n    </div>\n        <div class=\"card-header  mb-3\">[[#{easyflow.process.admin.page.processUnitInstanceDetail.instanceShardInfo}]]</div>\n    <div class=\"row\">\n        <dl class=\"j-info-group col\"><dt>[[#{easyflow.process.admin.page.processUnitInstanceDetail.shard}]]:</dt><dd th:text=\"${shardInfo.shard}\"></dd></dl>\n        <dl class=\"j-info-group col\"><dt>[[#{easyflow.process.admin.page.processUnitInstanceDetail.db}]]:</dt><dd th:text=\"${shardInfo.db}\"></dd></dl>\n        <dl class=\"j-info-group col\"><dt>[[#{easyflow.process.admin.page.processUnitInstanceDetail.table}]]:</dt><dd th:text=\"${shardInfo.shard == null ? '' : 'process_unit_instance' + shardInfo.tableSuffix}\"></dd></dl>\n     </div> \n    <div class=\"row\">\n        <dl class=\"j-info-group col\"><dt>[[#{easyflow.process.admin.page.processUnitInstanceDetail.slaveShard}]]:</dt><dd th:text=\"${shardInfo.slaveShard}\"></dd></dl>\n        <dl class=\"j-info-group col\"><dt>[[#{easyflow.process.admin.page.processUnitInstanceDetail.slaveDb}]]:</dt><dd th:text=\"${shardInfo.slaveDb}\"></dd></dl>\n        <dl class=\"j-info-group col\"><dt>[[#{easyflow.process.admin.page.processUnitInstanceDetail.slaveTable}]]:</dt><dd th:text=\"${shardInfo.slaveShard == null ? '' : 'process_unit_instance' + shardInfo.slaveTableSuffix}\"></dd></dl>\n     </div>            \n    </div>\n    <table class=\"executionDatatable\"></table>\n</div>    \n\n<script th:inline=\"javascript\">\n(function() {\nvar executionRoot = \"[(@{/coffee/processUnit})]\";\nvar instanceNo = /*[[${detail.instanceNo}]]*/\"\";\nvar unitCode = /*[[${detail.processUnitCode}]]*/\"\";\nvar bizNo = /*[[${detail.bizNo}]]*/\"\";\n$(\".frame-\" + instanceNo).find('.executionDatatable').bootstrapTable({\n    url: root + \"/ajax/getProcessUnitExecutionListData?queryType=INSTANCE&instanceNo=\" + instanceNo + \"&processUnitCode=\" + unitCode + \"&bizNo=\" + bizNo,\n    columns: [\n        {\n            field: 'executionNo', title: '[(#{easyflow.process.admin.page.processUnitInstanceDetail.executionNo})]', formatter: function (data, item) {\n                return data;\n            }\n        },\n        {field: 'requestNo', title: '[(#{easyflow.process.admin.page.processUnitInstanceDetail.executionRequestNo})]'},\n            {field: 'result', title: '[(#{easyflow.process.admin.page.processUnitInstanceDetail.executionResult})]', formatter: function (data) {\n                return {\"SUCCESS\":\"[(#{easyflow.process.admin.page.processUnitInstanceDetail.executionResultSuccess})]\", \"FAIL\":\"[(#{easyflow.process.admin.page.processUnitInstanceDetail.executionResultFail})]\", \"DOING\":\"[(#{easyflow.process.admin.page.processUnitInstanceDetail.executionResultDoing})]\", \"EXCEPTION\":\"[(#{easyflow.process.admin.page.processUnitInstanceDetail.executionResultException})]\"}[data];\n                }},\n        {field: 'requestContent', title: '[(#{easyflow.process.admin.page.processUnitInstanceDetail.executionRequestContent})]'},\n        {field: 'responseContent', title: '[(#{easyflow.process.admin.page.processUnitInstanceDetail.executionResponseContent})]'},                \n        {field: 'execType', title: '[(#{easyflow.process.admin.page.processUnitInstanceDetail.executionExecType})]', formatter: function (data) {\n                return {\"SYNC\":\"[(#{easyflow.process.admin.page.processUnitInstanceDetail.executionExecTypeSync})]\", \"MANUAL_ASYNC\":\"[(#{easyflow.process.admin.page.processUnitInstanceDetail.executionExecTypeManual})]\", \"TASK_ASYNC\":\"[(#{easyflow.process.admin.page.processUnitInstanceDetail.executionExecTypeTask})]\", \"MSG_ASYNC\":\"[(#{easyflow.process.admin.page.processUnitInstanceDetail.executionExecTypeMsg})]\"}[data];\n                }}, \n        {field: 'requestTime', title: '[(#{easyflow.process.admin.page.processUnitInstanceDetail.executionRequestTime})]'},\n        {field: 'responseTime', title: '[(#{easyflow.process.admin.page.processUnitInstanceDetail.executionResponseTime})]'},    \n        {field: 'elaspeTime', title: '[(#{easyflow.process.admin.page.processUnitInstanceDetail.executionElapseTime})](ms)'},                                              \n        {field: 'extData', title: '[(#{easyflow.process.admin.page.processUnitInstanceDetail.executionExtData})]'},\n    ],\n     pageList:[10, 50, 100, 500]        \n});\n\n})();\n</script>"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/templates/easyflow/processunit/processUnitInstanceList.html",
    "content": "<!DOCTYPE html>\n<html xmlns:th=\"http://www.thymeleaf.org\"\n      th:replace=\"layout::html(#{easyflow.process.admin.page.processUnitInstanceList.instanceManagement},~{},~{::#style}, ~{::.breadcrumb-item},~{::#content},~{},~{::#script})\">\n<body>\n<ol class=\"breadcrumb\">\n    <li class=\"breadcrumb-item active\">[[#{easyflow.process.admin.page.processUnitInstanceList.instanceManagement}]]</li>\n</ol>\n<div id=\"content\">\n    <div id=\"tabs\">\n        <div id=\"tableContainer\">\n            <form id=\"search\" class=\"card j-form-horizontal\" autocomplete=\"off\">\n                <div class=\"card-body\">\n                    <div class=\"form-row\">\n                        <div class=\"form-group col\">\n                            <label>[[#{easyflow.process.admin.page.processUnitInstanceList.queryType}]]:</label>\n                            <div class=\"form-check form-check-inline\">\n                              <input class=\"form-check-input\" type=\"radio\" name=\"queryType\" id=\"queryType-SINGLE\" value=\"SINGLE\" checked>\n                              <label class=\"form-check-label\" for=\"queryType-SINGLE\"><b>[[#{easyflow.process.admin.page.processUnitInstanceList.queryByInstance}]]</b>([[#{easyflow.process.admin.page.processUnitInstanceList.queryByInstanceTip}]])</label>\n                            </div>\n                            <div class=\"form-check form-check-inline\">\n                              <input class=\"form-check-input\" type=\"radio\" name=\"queryType\" id=\"queryType-CREATED_DATE_RANGE\" value=\"CREATED_DATE_RANGE\">\n                              <label class=\"form-check-label\" for=\"queryType-CREATED_DATE_RANGE\"><b>[[#{easyflow.process.admin.page.processUnitInstanceList.queryByTime}]]</b>([[#{easyflow.process.admin.page.processUnitInstanceList.queryByTimeTip}]]), <b>[[#{easyflow.process.admin.page.processUnitInstanceList.onlyFirstPageSupport}]]</b></label>\n                            </div>\n                        </div>\n                    </div>\n                    <div class=\"form-row\">                    \n                        <div class=\"form-group col\">\n                            <label><span class=\"required\">*</span>[[#{easyflow.process.admin.page.processUnitInstanceList.queryProcessUnitCode}]]:</label><select name=\"processUnitCode\" class=\"form-control\">\n                                <option value=\"\">--[[#{easyflow.process.admin.page.processUnitInstanceList.querySelect}]]--</option>\n                                <option th:each=\"item,itemStat:${processUnitList}\" th:value=\"${item.processUnitCode}\" th:text=\"${item.processUnitCode}+':'+${item.name}\"></option>\n                            </select>\n                        </div>\n                        <div class=\"form-group col\">\n                            <label>[[#{easyflow.process.admin.page.processUnitInstanceList.queryBizNo}]]:</label><input name=\"bizNo\" id=\"bizNo\" class=\"form-control\"></input>\n                        </div>\n                        <div class=\"form-group col\">\n                            <label>[[#{easyflow.process.admin.page.processUnitInstanceList.queryInstanceNo}]]:</label><input name=\"instanceNo\" id=\"instanceNo\" class=\"form-control\"></input>\n                        </div>                        \n                    </div>\n                    <div class=\"form-row\">\n                        <div class=\"form-group col\">\n                            <label>[[#{easyflow.process.admin.page.processUnitInstanceList.queryCreatedDateStart}]]:</label>\n                            <input type=\"text\" class=\"form-control\" name=\"createdDateStart\" id=\"createdDateStart\"/>\n                        </div>\n                        <div class=\"form-group col\">\n                            <label>[[#{easyflow.process.admin.page.processUnitInstanceList.queryCreatedDateEnd}]]:</label>\n                            <input type=\"text\" class=\"form-control\" name=\"createdDateEnd\" id=\"createdDateEnd\"/>\n                        </div>\n                        <div class=\"form-group col\">\n                            <label>[[#{easyflow.process.admin.page.processUnitInstanceList.queryResult}]]:</label>\n                            <select class=\"form-control d-none\" name=\"resultList\" id=\"resultList\"  multiple=\"multiple\">\n                                <option value=\"SUCCESS\">[[#{easyflow.process.admin.page.processUnitInstanceList.queryResultSuccess}]]</option>\n                                <option value=\"FAIL\">[[#{easyflow.process.admin.page.processUnitInstanceList.queryResultFail}]]</option>\n                                <option value=\"DOING\">[[#{easyflow.process.admin.page.processUnitInstanceList.queryResultDoing}]]</option>\n                                <option value=\"EXCEPTION\">[[#{easyflow.process.admin.page.processUnitInstanceList.queryResultException}]]</option>\n                        </select>\n                        </div>                        \n                    </div>\n                    <div class=\"form-row\">\n                        <div class=\"col text-center\">\n                            <button id=\"query\" class=\"btn btn-primary\">[[#{easyflow.process.admin.page.processUnitInstanceList.queryBtn}]]</button>\n                        </div>\n                    </div>\n                </div>\n            </form>\n            <table id=\"datatable\"></table>\n        </div>\n    </div>\n\n</div>\n<style type=\"text/css\" id=\"style\">\n    .pagination {display: none !important}\n    /*.page-item {display: none}    \n    .page-next {display: block !important}*/\n</style>\n<script type=\"text/javascript\" id=\"script\" th:inline=\"javascript\">\n    $(\"#tabs\").jTabs().jTabs(\"open\", {id: \"tab-table\", name: \"[(#{easyflow.process.admin.page.processUnitInstanceList.instanceList})]\", element: $(\"#tableContainer\"), closeable: false});\n    $.validator.addMethod(\"datetime\", function(value, element) {\nvar datetime = /^[0-9]{4}-(((0[13578]|(10|12))-(0[1-9]|[1-2][0-9]|3[0-1]))|(02-(0[1-9]|[1-2][0-9]))|((0[469]|11)-(0[1-9]|[1-2][0-9]|30)))\\s+([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$/;\nreturn this.optional(element) || (datetime.test(value));\n}, \"[(#{easyflow.process.admin.page.processUnitInstanceList.dateFormatInvalid})]\");\n    \n    $(\"#search\").validate({\n        rules: {\n            \"createdDateStart\": {\"datetime\": true},\n            \"createdDateEnd\": {\"datetime\": true}\n        }\n    });\n    if (\"datetimepicker\" in $.fn) {\n\t    $(\"#createdDateStart\").datetimepicker({startView:2, minView:0, format:\"yyyy-mm-dd hh:ii:ss\"});    \n\t    $(\"#createdDateEnd\").datetimepicker({startView:2, minView:0, format:\"yyyy-mm-dd hh:ii:ss\"});  \n    }\n    var queryParam = {};\n    $(\"[name='processUnitCode']\").multiselect({\n       enableFiltering: true\n   });\n   $(\"[name='resultList']\").multiselect({\n       enableFiltering: true,\n       includeSelectAllOption: true,\n   });\n    $(\"#query\").click(function (e) {\n        var currentQueryParam = $(\"#search\").serializeObject(); \n        if (currentQueryParam.queryType=='SINGLE') {\n            if (currentQueryParam.instanceNo=='' && (currentQueryParam.processUnitCode=='' || currentQueryParam.bizNo=='')) {\n                $.jMessage({msg: \"[(#{easyflow.process.admin.page.processUnitInstanceList.instanceInfoCannotNull})]\"});\n                e.preventDefault();\n                return false;\n            }\n        } else {\n            if (currentQueryParam.processUnitCode=='') {\n                $.jMessage({msg: \"[(#{easyflow.process.admin.page.processUnitInstanceList.processUnitCodeCannotNull})]\"});\n                e.preventDefault();\n                return false;                \n            }\n            if (currentQueryParam.createdDateStart == '' || currentQueryParam.createdDateEnd == '') {\n                $.jMessage({msg: \"[(#{easyflow.process.admin.page.processUnitInstanceList.timeRangeCannotNull})]\"});\n                e.preventDefault();\n                return false;\n            }\n            if (currentQueryParam.createdDateStart > currentQueryParam.createdDateEnd) {\n                $.jMessage({msg: \"[(#{easyflow.process.admin.page.processUnitInstanceList.createdDateStartCannotGtEnd})]\"});\n                e.preventDefault();\n                return false;\n            }\n            if(new Date(currentQueryParam.createdDateEnd).getTime() - new Date(currentQueryParam.createdDateStart).getTime() > 30 * 24 * 3600 * 1000) {\n                $.jMessage({msg: \"[(#{easyflow.process.admin.page.processUnitInstanceList.TimeRangeCannotGt30Days})]\"});\n                e.preventDefault();\n                return false;\n            }            \n        }\n        queryParam = currentQueryParam;        \n        $('#datatable').bootstrapTable(\"refresh\",{url: root + \"/ajax/getProcessUnitInstanceListData\"});\n        e.preventDefault();\n        return false;\n    });\n    var root = \"[(@{/easyflow/processUnit})]\";\n    $('#datatable').bootstrapTable({\n        columns: [\n            {radio: true},\n            {\n                field: 'instanceNo', title: '[(#{easyflow.process.admin.page.processUnitInstanceList.instanceNo})]', formatter: function (data, item) {\n                    return \"<a class='j-op detailBtn' data-instance-no='\" + item.instanceNo \n                    + \"' data-unit-code='\" + item.processUnitCode \n                    + \"' data-biz-no='\" + item.bizNo + \"'>\" + data + \"</a>\";\n                }\n            },\n            {field: 'processUnitCode', title: '[(#{easyflow.process.admin.page.processUnitInstanceList.processUnitCode})]'},\n            {field: 'bizNo', title: '[(#{easyflow.process.admin.page.processUnitInstanceList.bizNo})]'},\n            {field: 'productCode', title: '[(#{easyflow.process.admin.page.processUnitInstanceList.productCode})]'},\n            {field: 'result', title: '[(#{easyflow.process.admin.page.processUnitInstanceList.result})]', formatter: function (data) {\n                return {\"SUCCESS\":\"[(#{easyflow.process.admin.page.processUnitInstanceList.resultSuccess})]\", \"FAIL\":\"[(#{easyflow.process.admin.page.processUnitInstanceList.resultFail})]\", \"DOING\":\"[(#{easyflow.process.admin.page.processUnitInstanceList.resultDoing})]\", \"EXCEPTION\":\"[(#{easyflow.process.admin.page.processUnitInstanceList.resultException})]\"}[data];\n                }},\n            {field: 'requestContent', title: '[(#{easyflow.process.admin.page.processUnitInstanceList.requestContent})]'},\n            {field: 'responseContent', title: '[(#{easyflow.process.admin.page.processUnitInstanceList.responseContent})]'},\n            {field: 'autoRunTimes', title: '[(#{easyflow.process.admin.page.processUnitInstanceList.autoRuntimes})]'},\n            {field: 'autoRunFlag', title: '[(#{easyflow.process.admin.page.processUnitInstanceList.autoRunFlag})]'},\n            {field: 'nextAutoRunTime', title: '[(#{easyflow.process.admin.page.processUnitInstanceList.nextAutoRunTime})]'},\n            {field: 'createdDate', title: '[(#{easyflow.process.admin.page.processUnitInstanceList.createdDate})]'},\n            {field: 'modifiedDate', title: '[(#{easyflow.process.admin.page.processUnitInstanceList.modifiedDate})]'},\n            {field: 'vars', title: '[(#{easyflow.process.admin.page.processUnitInstanceList.vars})]'},\n            {field: 'extData', title: '[(#{easyflow.process.admin.page.processUnitInstanceList.extData})]'}\n        ],\n        queryParams: function (param) {\n            //var data = $('#datatable').bootstrapTable(\"getData\", {});\n            $.extend(param, queryParam);\n            return param;\n        },\n        pageList:[10, 50, 100, 500],\n        paginationNextText: \"[(#{easyflow.process.admin.page.processUnitInstanceList.nextPage})]\"\n    });\n\n    $(\"#datatable\").on(\"click\", \".detailBtn\", function () {\n        $(\"#tabs\").jTabs(\"open\", {id:$(this).data(\"instance-no\"), url:root + \"/processUnitInstanceDetail?instanceNo=\" + $(this).data(\"instance-no\") + \"&processUnitCode=\" + $(this).data(\"unit-code\") + \"&bizNo=\" + $(this).data(\"biz-no\")});\n        return false;        \n    });\n    \n    $(\"#queryType-SINGLE\").click(function(){\n        $(\"#createdDateStart\").val(\"\");\n        $(\"#createdDateEnd\").val(\"\");\n        $(\"#resultList\").multiselect('deselect',[\"SUCCESS\",\"FAIL\",\"DOING\",\"EXCEPTION\"]);\n    });\n    $(\"#queryType-CREATED_DATE_RANGE\").click(function(){\n        $(\"#bizNo\").val(\"\");\n        $(\"#instanceNo\").val(\"\");\n        $(\"#createdDateStart\").val(J.getNowDate()+\" 00:00:00\");\n        $(\"#createdDateEnd\").val(J.getNowDate()+\" 23:59:59\");     \n    });\n\n</script>\n</body>\n</html>"
  },
  {
    "path": "easyflow-process/easyflow-process-admin/src/main/resources/templates/layout.html",
    "content": "<!DOCTYPE html>\n<html lang=\"zh-CN\" xmlns:th=\"http://www.thymeleaf.org\" xmlns:sec=\"http://www.jd.com\"\n      th:fragment=\"html(title, links,style, breadcrumb, content, script, js)\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"Pragma\" content=\"no-cache\">\n    <meta http-equiv=\"Cache-Control\" content=\"no-cache\">\n    <meta http-equiv=\"Expires\" content=\"0\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"/>\n    <link rel=\"icon\" th:href=\"@{/static/images/favicon.ico}\" type=\"image/x-icon\">\n    <title th:text=\"${title}?|#{easyflow.admin.framework.page.layout.adminPortal}-${title}|:#{easyflow.admin.framework.page.layout.adminPortal}\">Administrator Portal</title>\n    <link rel=\"stylesheet\" th:href=\"@{/static/plugins/bootstrap4/css/bootstrap.css}\">\n    <link rel=\"stylesheet\" th:href=\"@{/static/plugins/bootstrap-table/bootstrap-table.css}\">\n    <link rel=\"stylesheet\" th:href=\"@{/static/plugins/bootstrap-multiselect/css/bootstrap-multiselect.css}\">\n    <link rel=\"stylesheet\" th:href=\"@{/static/plugins/fontawesome/css/all.css}\">\n    <link rel=\"stylesheet\" th:href=\"@{/static/css/common.css}\">\n    <link rel=\"stylesheet\" th:href=\"@{/static/css/frame.css}\">\n    <link rel=\"stylesheet\" th:href=\"@{/static/plugins/dataview/dataview.css}\">\n    <th:block th:replace=\"${links}\"></th:block>\n    <style type=\"text/css\" th:replace=\"${style}\"></style>\n</head>\n<body>\n<div id=\"wrapper\">\n    <!-- Navigation -->\n    <nav class=\"navbar fixed-top\" id=\"navbar\">\n        <!-- Brand and toggle get grouped for better mobile display -->\n        <div class=\"navbar-header\">\n            <a class=\"navbar-brand\" href=\"/\"><img th:src=\"@{/static/images/logo.png}\" width=\"164\" height=\"36\"></a>\n        </div>\n                <!-- Top Menu Items -->\n        <ul class=\"nav top-nav\">\n            <li class=\"dropdown\">\n                <a href=\"#\" class=\"j-erp\"><i class=\"fa fa-user\"></i>[(${session.user})]</a>\n            </li>\n        </ul>\n\n        <!-- /.navbar-collapse -->\n    </nav>\n    <!-- Sidebar Menu Items - These collapse to the responsive navigation menu on small screens -->\n    <div>\n        <div class=\"navbar-sideholder\"></div>\n        <ul class=\"nav side-nav flex-column\" id=\"side-menu\">\n            <li class=\"nav-item\">\n                <a href=\"#m-flow\" data-toggle=\"collapse\" class=\"nav-link li-level-1\"><i class=\"fa fa-desktop fa-fw\"></i>[[#{easyflow.admin.framework.page.layout.menu.processAndTask}]]<span\n                        class=\"fa fa-angle-right\"></span></a>\n                <ul class=\"nav flex-column collapse show\" id=\"m-flow\">\n                     <li class=\"nav-item\"><a href=\"/easyflow/processInstance/list\" class=\"nav-link\" data-menu=\"PROCESS_INSTANCE\">[[#{easyflow.admin.framework.page.layout.menu.processInstance}]]</a></li>\n                    <li class=\"nav-item\"><a href=\"/easyflow/processTask/list\" class=\"nav-link\">[[#{easyflow.admin.framework.page.layout.menu.processTask}]]</a></li>\n                </ul>\n            </li>\n            <!-- \n            <li class=\"nav-item\">\n                <a href=\"#m-processunit\" data-toggle=\"collapse\" class=\"nav-link li-level-1\"><i class=\"fa fa-desktop fa-fw\"></i>[[#{easyflow.admin.framework.page.layout.menu.processUnit}]]<span\n                        class=\"fa fa-angle-right\"></span></a>\n                <ul class=\"nav flex-column collapse show\" id=\"m-processunit\">\n                     <li class=\"nav-item\"><a href=\"/easyflow/processUnit/processUnitInstanceList\" class=\"nav-link\" data-menu=\"PROCESS_UNIT_INSTANCE\">[[#{easyflow.admin.framework.page.layout.menu.processUnitInstance}]]</a></li>\n                     <li class=\"nav-item\"><a href=\"/easyflow/processUnit/processUnitExecutionList\" class=\"nav-link\" data-menu=\"PROCESS_UNIT_INSTANCE\">[[#{easyflow.admin.framework.page.layout.menu.processUnitExecution}]]</a></li>\n                </ul>\n            </li> \n             -->              \n            <li class=\"nav-item\">\n                <a href=\"#m-system\" data-toggle=\"collapse\" class=\"nav-link li-level-1\"><i\n                        class=\"fa fa-desktop fa-fw\"></i>[[#{easyflow.admin.framework.page.layout.menu.system}]]<span class=\"fa fa-angle-right\"></span></a>\n                <ul class=\"nav flex-column collapse show\" id=\"m-system\">\n                    <li class=\"nav-item\"><a href=\"/easyflow/processDefinition/list\" class=\"nav-link\" data-menu=\"PROCESS_DEF\">[[#{easyflow.admin.framework.page.layout.menu.processDefinition}]]</a></li>\n                    <li class=\"nav-item\"><a href=\"/easyflow/formTemplate/formTemplateList\" data-menu=\"FORM_TEMPLATE\"\n                                            class=\"nav-link\">[[#{easyflow.admin.framework.page.layout.menu.formTemplate}]]</a></li>\n                </ul>\n            </li>            \n        </ul>\n    </div>\n    <div id=\"page-wrapper\">\n\n        <div class=\"container-fluid\">\n            <!-- Page Heading -->\n            <div class=\"row\">\n                <div class=\"col-lg-12\">\n                    <nav>\n                        <ol class=\"breadcrumb\">\n                            <li class=\"breadcrumb-item\">\n                                <i class=\"fa fa-home\"></i> <a href=\"/\">[[#{easyflow.admin.framework.page.layout.home}]]</a>\n                            </li>\n                            <th:block th:insert=\"${breadcrumb}\"></th:block>\n                        </ol>\n                    </nav>\n                </div>\n            </div>\n            <!-- /.row -->\n            <div id=\"content\" th:replace=\"${content}\"></div>\n        </div>\n        <!-- /.container-fluid -->\n\n    </div>\n    <!-- /#page-wrapper -->\n\n</div>\n<script th:inline=\"javascript\">\nwindow.jLocale=[[${T(com.jd.easyflow.common.util.MessageUtil).locale()}]];\n</script>\n<!-- /#wrapper -->\n<script th:src=\"@{/static/plugins/jquery/jquery-3.6.0.js}\" type=\"text/javascript\"></script>\n<script th:src=\"@{/static/plugins/bootstrap4/js/bootstrap.bundle.js}\" type=\"text/javascript\"></script>\n<script th:src=\"@{/static/plugins/bootstrap-table/bootstrap-table.js}\" type=\"text/javascript\"></script>\n<script th:src=\"@{/static/plugins/bootstrap-multiselect/js/bootstrap-multiselect.js}\" type=\"text/javascript\"></script>\n<script th:src=\"@{/static/plugins/bootstrap-table/bootstrap-table-locale-all.js}\" type=\"text/javascript\"></script>\n<script th:src=\"@{/static/plugins/jquery-validation/jquery.validate.min.js}\" type=\"text/javascript\"></script>\n<script th:src=\"@{/static/plugins/jquery-validation/messages_zh.js}\" type=\"text/javascript\"  th:if=\"${T(com.jd.easyflow.common.util.MessageUtil).locale()=='zh_CN'}\"></script>\n<script th:src=\"@{/static/js/messages_default.js}\" type=\"text/javascript\"></script>\n<script th:src=\"@{/static/js/messages_zh.js}\" type=\"text/javascript\"  th:if=\"${T(com.jd.easyflow.common.util.MessageUtil).locale()=='zh_CN'}\"></script>\n<script th:src=\"@{/static/js/common.js}\" type=\"text/javascript\"></script>\n<script th:src=\"@{/static/js/biz.js}\" type=\"text/javascript\"></script>\n<script th:src=\"@{/static/plugins/dataview/dataview.js}\" type=\"text/javascript\"></script>\n<script th:src=\"@{/static/plugins/dataview/dataview-config.js}\" type=\"text/javascript\"></script>\n<script th:src=\"@{/static/plugins/dataview/dataview-app.js}\" type=\"text/javascript\"></script>\n<th:block th:replace=\"${script}\"></th:block>\n<script th:inline=\"javascript\" th:replace=\"${js}\"></script>\n\n</body>\n\n<script>\n\n</script>\n</html>"
  },
  {
    "path": "easyflow-process/easyflow-process-api/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n    xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>easyflow-process</artifactId>\n        <groupId>com.jd.easyflow</groupId>\n        <version>1.7.3</version>\n    </parent>\n    <artifactId>easyflow-process-api</artifactId>\n    <name>easyflow-process-api</name>\n    <packaging>jar</packaging>\n    <properties>\n    </properties>\n    <dependencies>\n    </dependencies>\n\n</project>"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/codegenerator/adapter/export/CodeGenerateExport.java",
    "content": "package com.jd.easyflow.codegenerator.adapter.export;\n\nimport com.jd.easyflow.codegenerator.adapter.export.dto.BatchGenerateParam;\nimport com.jd.easyflow.codegenerator.adapter.export.dto.BatchGenerateResult;\nimport com.jd.easyflow.codegenerator.adapter.export.dto.GenerateParam;\nimport com.jd.easyflow.codegenerator.adapter.export.dto.GenerateResult;\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponse;\n\n/**\n * @author liyuliang5\n *\n */\npublic interface CodeGenerateExport {\n\n    public ExportResponse<GenerateResult> generateUniqueCode(ExportRequest<GenerateParam> request);\n    \n    public ExportResponse<BatchGenerateResult> batchGenerateUniqueCode(ExportRequest<BatchGenerateParam> request);\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/codegenerator/adapter/export/dto/BatchGenerateParam.java",
    "content": "package com.jd.easyflow.codegenerator.adapter.export.dto;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n *\n */\npublic class BatchGenerateParam implements Serializable {\n\n\n    private static final long serialVersionUID = 2404501159595567936L;\n\n    private String typeId;\n\n    private String codePrefix;\n\n    private int batchSize;\n    \n    public BatchGenerateParam() {\n        \n    }\n    \n    public BatchGenerateParam(String typeId, String codePrefix, int batchSize) {\n        this.typeId = typeId;\n        this.codePrefix = codePrefix;\n        this.batchSize = batchSize;\n    }\n\n    public String getTypeId() {\n        return typeId;\n    }\n\n    public void setTypeId(String typeId) {\n        this.typeId = typeId;\n    }\n\n    public String getCodePrefix() {\n        return codePrefix;\n    }\n\n    public void setCodePrefix(String codePrefix) {\n        this.codePrefix = codePrefix;\n    }\n\n    public int getBatchSize() {\n        return batchSize;\n    }\n\n    public void setBatchSize(int batchSize) {\n        this.batchSize = batchSize;\n    }\n\n    @Override\n    public String toString() {\n        return \"BatchGenerateParam [typeId=\" + typeId + \", codePrefix=\" + codePrefix + \", batchSize=\" + batchSize + \"]\";\n    }\n    \n    public static BatchGenerateParam.BatchGenerateParamBuilder builder() {\n        return new BatchGenerateParam.BatchGenerateParamBuilder();\n    }\n\n    public static class BatchGenerateParamBuilder {\n        private String typeId;\n        private String codePrefix;\n        private int batchSize;\n\n        public BatchGenerateParam.BatchGenerateParamBuilder typeId(String typeId) {\n            this.typeId = typeId;\n            return this;\n        }\n\n        public BatchGenerateParam.BatchGenerateParamBuilder codePrefix(String codePrefix) {\n            this.codePrefix = codePrefix;\n            return this;\n        }\n\n        public BatchGenerateParam.BatchGenerateParamBuilder batchSize(int batchSize) {\n            this.batchSize = batchSize;\n            return this;\n        }\n\n        public BatchGenerateParam build() {\n            return new BatchGenerateParam(this.typeId, this.codePrefix, this.batchSize);\n        }\n\n        public String toString() {\n            return \"BatchGenerateParam.BatchGenerateParamBuilder(typeId=\" + this.typeId + \", codePrefix=\"\n                    + this.codePrefix + \", batchSize=\" + this.batchSize + \")\";\n        }\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/codegenerator/adapter/export/dto/BatchGenerateResult.java",
    "content": "package com.jd.easyflow.codegenerator.adapter.export.dto;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n *\n */\npublic class BatchGenerateResult implements Serializable {\n    private static final long serialVersionUID = 4964199112018029216L;\n\n    private String[] codes;\n    public String[] getCodes() {\n        return codes;\n    }\n    public void setCodes(String[] codes) {\n        this.codes = codes;\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/codegenerator/adapter/export/dto/GenerateParam.java",
    "content": "package com.jd.easyflow.codegenerator.adapter.export.dto;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n *\n */\npublic class GenerateParam implements Serializable {\n\n    private static final long serialVersionUID = 2404501159595567936L;\n\n    private String typeId;\n\n    private String codePrefix;\n    \n    public GenerateParam() {\n        \n    }\n    \n    public GenerateParam(String typeId, String codePrefix) {\n        this.typeId = typeId;\n        this.codePrefix = codePrefix;\n    }\n\n    public String getTypeId() {\n        return typeId;\n    }\n\n    public void setTypeId(String typeId) {\n        this.typeId = typeId;\n    }\n\n    public String getCodePrefix() {\n        return codePrefix;\n    }\n\n    public void setCodePrefix(String codePrefix) {\n        this.codePrefix = codePrefix;\n    }\n    \n    public static GenerateParam.GenerateParamBuilder builder() {\n        return new GenerateParam.GenerateParamBuilder();\n    }\n\n    public static class GenerateParamBuilder {\n        private String typeId;\n        private String codePrefix;\n\n        public GenerateParam.GenerateParamBuilder typeId(String typeId) {\n            this.typeId = typeId;\n            return this;\n        }\n\n        public GenerateParam.GenerateParamBuilder codePrefix(String codePrefix) {\n            this.codePrefix = codePrefix;\n            return this;\n        }\n\n        public GenerateParam build() {\n            return new GenerateParam(this.typeId, this.codePrefix);\n        }\n\n        public String toString() {\n            return \"GenerateParam.GenerateParamBuilder(typeId=\" + this.typeId + \", codePrefix=\" + this.codePrefix + \")\";\n        }\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/codegenerator/adapter/export/dto/GenerateResult.java",
    "content": "package com.jd.easyflow.codegenerator.adapter.export.dto;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n *\n */\npublic class GenerateResult implements Serializable {\n    private static final long serialVersionUID = 4964199112018029216L;\n\n    private String code;\n    public String getCode() {\n        return code;\n    }\n    public void setCode(String code) {\n        this.code = code;\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/common/adapter/export/dto/ExportRequest.java",
    "content": "package com.jd.easyflow.common.adapter.export.dto;\n\nimport java.io.Serializable;\nimport java.util.Map;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ExportRequest<T> implements Serializable {\n\n    private static final long serialVersionUID = 1L;\n\n    protected String reqNo;\n\n     protected Map<String, Object> ext;\n\n    protected String requestTime;\n\n    protected T data;\n    \n    public ExportRequest() {\n        \n    }\n    \n    public ExportRequest(T data) {\n        this.data = data;\n    }\n\n    public String getReqNo() {\n        return reqNo;\n    }\n\n    public void setReqNo(String reqNo) {\n        this.reqNo = reqNo;\n    }\n\n    public Map<String, Object> getExt() {\n        return ext;\n    }\n\n    public void setExt(Map<String, Object> ext) {\n        this.ext = ext;\n    }\n\n    public String getRequestTime() {\n        return requestTime;\n    }\n\n    public void setRequestTime(String requestTime) {\n        this.requestTime = requestTime;\n    }\n\n    public T getData() {\n        return data;\n    }\n\n    public void setData(T data) {\n        this.data = data;\n    }\n\n    @Override\n    public String toString() {\n        return \"ExportRequest [reqNo=\" + reqNo + \", ext=\" + ext + \", requestTime=\" + requestTime + \", data=\" + data\n                + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/common/adapter/export/dto/ExportResponse.java",
    "content": "package com.jd.easyflow.common.adapter.export.dto;\n\nimport java.io.Serializable;\nimport java.util.Map;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ExportResponse<T> implements Serializable {\n\tprivate static final long serialVersionUID = 1L;\n\n    private String resCode;\n\n    private String resDesc;\n\n    private Map<String, Object> ext;\n\n    private T data;\n\n    public ExportResponse() {\n    }\n\n    public ExportResponse(String resCode, String resDesc) {\n        this.resCode = resCode;\n        this.resDesc = resDesc;\n    }\n\n\n    public static ExportResponse build4Failed(String errorCode, String errorMessage) {\n        ExportResponse res = new ExportResponse();\n        res.setResCode(errorCode);\n        res.setResDesc(errorMessage);\n        return res;\n    }\n\n\n    public static ExportResponse build4Failed(ExportResponseCode error) {\n        return build4Failed(error.getCode(),error.getDesc());\n    }\n\n    public static ExportResponse build4Success() {\n        ExportResponse res = new ExportResponse();\n        res.setResCode(ExportResponseCode.SUCCESS.getCode());\n        res.setResDesc(ExportResponseCode.SUCCESS.getDesc());\n        return res;\n    }\n\n    public static  <T> ExportResponse build4Success(T data) {\n        ExportResponse res = new ExportResponse();\n        res.setResCode(ExportResponseCode.SUCCESS.getCode());\n        res.setResDesc(ExportResponseCode.SUCCESS.getDesc());\n        res.setData(data);\n        return res;\n    }\n\n    public boolean isSuccess() {\n        return ExportResponseCode.SUCCESS.getCode().equals(this.getResCode());\n    }\n\n    public String getResCode() {\n        return resCode;\n    }\n\n    public void setResCode(String resCode) {\n        this.resCode = resCode;\n    }\n\n    public String getResDesc() {\n        return resDesc;\n    }\n\n    public void setResDesc(String resDesc) {\n        this.resDesc = resDesc;\n    }\n\n    public Map<String, Object> getExt() {\n        return ext;\n    }\n\n    public void setExt(Map<String, Object> ext) {\n        this.ext = ext;\n    }\n\n    public T getData() {\n        return data;\n    }\n\n    public void setData(T data) {\n        this.data = data;\n    }\n\n    @Override\n    public String toString() {\n        return \"ExportResponse [resCode=\" + resCode + \", resDesc=\" + resDesc + \", ext=\" + ext + \", data=\" + data + \"]\";\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/common/adapter/export/dto/ExportResponseCode.java",
    "content": "package com.jd.easyflow.common.adapter.export.dto;\n\n/**\n * @author liyuliang5\n *\n */\npublic enum ExportResponseCode {\n    SUCCESS(\"0000000\",\"Success\"),\n\n    FAIL(\"0000001\",\"Fail\"),\n\n    DATA_EMPTY(\"0000004\",\"Data not exists\"),\n\n    FIELD_EMPTY(\"0000005\",\"Field empty\"),\n\n    INVALID(\"0000002\",\"Validate error\"),\n\n    EXCEPTION(\"9999999\",\"System exception\"),\n    ;\n\n    private String code;\n\n    private String desc;\n\n    ExportResponseCode(String code, String desc) {\n        this.code = code;\n        this.desc = desc;\n    }\n\n    public String getCode() {\n        return code;\n    }\n\n    public String getDesc() {\n        return desc;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/common/adapter/export/dto/pager/FieldEntry.java",
    "content": "package com.jd.easyflow.common.adapter.export.dto.pager;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n *\n */\npublic class FieldEntry implements Serializable {\n\n  private static final long serialVersionUID = 7553262335974337343L;\n\n  private String name;\n\n  private Object value;\n\n  public FieldEntry() {\n\n  }\n\n  public FieldEntry(String name, Object value) {\n    this.name = name;\n    this.value = value;\n  }\n\n  public String getName() {\n    return name;\n  }\n\n  public void setName(String name) {\n    this.name = name;\n  }\n\n  public Object getValue() {\n    return value;\n  }\n  \n  public String stringValue() {\n    return (String) value;\n  }\n\n  public void setValue(Object value) {\n    this.value = value;\n  }\n\n@Override\npublic String toString() {\n    return \"FieldEntry [name=\" + name + \", value=\" + value + \"]\";\n}\n  \n  \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/common/adapter/export/dto/pager/PagerCondition.java",
    "content": "package com.jd.easyflow.common.adapter.export.dto.pager;\n\nimport java.io.Serializable;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * @author liyuliang5\n *\n */\npublic class PagerCondition implements Serializable {\n\n    private static final long serialVersionUID = 7553262335974337343L;\n\n    private long start = -1;\n\n    private int pageSize = -1;\n\n    private long pageIndex = -1;\n\n    private List<FieldEntry> fieldList = new ArrayList<FieldEntry>();\n\n    private List<SortEntry> sortList = new ArrayList<SortEntry>();\n\n    private boolean count = true;\n\n    private Boolean page = true;\n    \n    private Map<String, Object> extData;\n\n    public PagerCondition() {\n\n    }\n\n    public PagerCondition(long pageIndex, int pageSize) {\n        this.pageIndex = pageIndex;\n        this.start = (pageIndex - 1) * pageSize;\n        this.pageSize = pageSize;\n    }\n\n    public void addSortField(String key, long seq, String order) {\n        if (sortList == null) {\n            sortList = new ArrayList<SortEntry>();\n        }\n        SortEntry sortEntry = new SortEntry(key, seq, order);\n        sortList.add(sortEntry);\n    }\n\n    public long getPageIndex() {\n        return pageIndex;\n    }\n\n    @Deprecated\n    public void setPageIndex(long pageIndex) {\n        this.pageIndex = pageIndex;\n    }\n\n    public FieldEntry field(String name) {\n        return getField(name);\n    }\n\n    public FieldEntry getField(String name) {\n        if (fieldList != null) {\n            for (FieldEntry entry : fieldList) {\n                if (name.equals(entry.getName())) {\n                    return entry;\n                }\n            }\n        }\n        return null;\n    }\n\n    public Map<String, FieldEntry> getFieldMap() {\n        Map<String, FieldEntry> map = new HashMap<String, FieldEntry>(fieldList.size());\n        fieldList.forEach(entry -> map.put(entry.getName(), entry));\n        return map;\n    }\n\n    public Map<String, SortEntry> getSortMap() {\n        Map<String, SortEntry> map = new HashMap<String, SortEntry>(sortList.size());\n        sortList.forEach(entry -> map.put(entry.getKey(), entry));\n        return map;\n    }\n\n    public void addField(FieldEntry entry) {\n        fieldList.add(entry);\n    }\n\n    public void addSort(SortEntry entry) {\n        sortList.add(entry);\n    }\n\n    public SortEntry sort(String name) {\n        return getSort(name);\n    }\n\n    public SortEntry getSort(String name) {\n        for (SortEntry entry : sortList) {\n            if (name.equals(entry.getKey())) {\n                return entry;\n            }\n        }\n        return null;\n    }\n\n    public long getStart() {\n        if (start == -1) {\n            start = (pageIndex - 1) * pageSize;\n        }\n        return start;\n    }\n\n    public Boolean getPage() {\n        return page;\n    }\n\n    public void setPage(Boolean page) {\n        this.page = page;\n    }\n\n    public List<FieldEntry> getFieldList() {\n        return fieldList;\n    }\n\n    public void setFieldList(List<FieldEntry> fieldList) {\n        this.fieldList = fieldList;\n    }\n\n    public void setStart(long start) {\n        this.start = start;\n    }\n\n    public int getPageSize() {\n        return pageSize;\n    }\n\n    public void setPageSize(int pageSize) {\n        this.pageSize = pageSize;\n    }\n\n    public List<SortEntry> getSortList() {\n        return sortList;\n    }\n\n    public void setSortList(List<SortEntry> sortList) {\n        this.sortList = sortList;\n    }\n\n    public boolean isCount() {\n        return count;\n    }\n\n    public void setCount(boolean count) {\n        this.count = count;\n    }\n    \n    public void putExtData(String key, Object value) {\n        if (extData == null) {\n            extData = new HashMap<>();\n        }\n        extData.put(key, value);\n    }\n    \n    public <T>T getExtData(String key) {\n        if (extData == null) {\n            return null;\n        }\n        return (T) extData.get(key);\n    }\n\n    public Map<String, Object> getExtData() {\n        return extData;\n    }\n\n    public void setExtData(Map<String, Object> extData) {\n        this.extData = extData;\n    }\n\n    @Override\n    public String toString() {\n        return \"PagerCondition [start=\" + start + \", pageSize=\" + pageSize + \", pageIndex=\" + pageIndex + \", fieldList=\"\n                + fieldList + \", sortList=\" + sortList + \", count=\" + count + \", page=\" + page + \", extData=\" + extData\n                + \"]\";\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/common/adapter/export/dto/pager/PagerConditionHelper.java",
    "content": "package com.jd.easyflow.common.adapter.export.dto.pager;\n\nimport java.util.Arrays;\nimport java.util.List;\n\n\n/**\n* \n* @author liyuliang5\n*/\n\npublic class PagerConditionHelper {\n\n    public static PagerCondition setValueType(PagerCondition condition, String fieldName, Class<?> clazz) {\n        FieldEntry fieldEntry = condition.getField(fieldName);\n        if (fieldEntry == null) {\n            return condition;\n        }\n        Object value = fieldEntry.getValue();\n        if (value == null) {\n            return condition;\n        }\n        if (clazz == String[].class) {\n           if (value instanceof String[]) {\n               return condition;\n           }\n           fieldEntry.setValue(new String[] {String.valueOf(value)});\n           return condition;\n        } else if (clazz == List.class) {\n            if (value instanceof List) {\n                return condition;\n            } else if (value instanceof String[]) {\n                List<String> list = Arrays.asList((String[]) value);\n                fieldEntry.setValue(list);\n            } else {\n                fieldEntry.setValue(Arrays.asList(value));\n            }\n            return condition;\n        }\n        throw new UnsupportedOperationException(\"Unsupported operation class:\" + clazz.getName());\n    }\n    \n    public static <T>T getValue(PagerCondition condition, String fieldName) {\n        FieldEntry entry = condition.getField(fieldName);\n        if (entry == null) {\n            return null;\n        }\n        return (T) entry.getValue();\n    }\n    \n    public static String getStringValue(PagerCondition condition, String fieldName) {\n        return (String) getValue(condition, fieldName);\n    }\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/common/adapter/export/dto/pager/PagerResult.java",
    "content": "package com.jd.easyflow.common.adapter.export.dto.pager;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * @author liyuliang5\n *\n */\npublic class PagerResult<T> implements Serializable {\n\n\tprivate static final long serialVersionUID = 1L;\n\n\tprivate Long count;\n\n    private List<T> list;\n\n    private int pageNum;\n\n    private int pageSize;\n\n    private int pages;\n\n\n    public PagerResult() {\n    }\n\n    public PagerResult(List<T> list) {\n        this.list = list;\n    }\n\n    public PagerResult(Long count, List<T> list) {\n        this.count = count;\n        this.list = list;\n    }\n\n    public PagerResult(Long count, List<T> list,int pageNum,int pageSize) {\n        this.count = count;\n        this.list = list;\n        this.pageNum = pageNum;\n        this.pageSize = pageSize;\n    }\n\n    public Long getCount() {\n        return count;\n    }\n\n    public void setCount(Long count) {\n        this.count = count;\n    }\n\n    public List<T> getList() {\n        return list;\n    }\n\n    public void setList(List<T> list) {\n        this.list = list;\n    }\n\n\n    public int getPageNum() {\n        return pageNum;\n    }\n\n    public void setPageNum(int pageNum) {\n        this.pageNum = pageNum;\n    }\n\n    public int getPageSize() {\n        return pageSize;\n    }\n\n    public void setPageSize(int pageSize) {\n        this.pageSize = pageSize;\n    }\n\n    public int getPages() {\n        if (count== null || pageSize < 1){\n            return 0;\n        }\n        int totalPages = (int) (count / pageSize);\n        if (count % pageSize != 0){\n            totalPages ++;\n        }\n        return totalPages;\n    }\n\n    @Override\n    public String toString() {\n        return \"PagerResult [count=\" + count + \", list=\" + list + \", pageNum=\" + pageNum + \", pageSize=\" + pageSize\n                + \", pages=\" + pages + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/common/adapter/export/dto/pager/SortEntry.java",
    "content": "package com.jd.easyflow.common.adapter.export.dto.pager;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n *\n */\npublic class SortEntry implements Comparable<SortEntry>, Serializable {\n\n    private static final long serialVersionUID = 9034251346323773481L;\n\n    /**\n     * ORDER ASC\n     */\n    public static final String ASC = \"asc\";\n\n    /**\n     * ORDER DESC\n     */\n    public static final String DESC = \"desc\";\n\n    /**\n     * Input key\n     */\n    private String key;\n\n    /**\n     * Input type\n     */\n    private String type = ASC;\n\n    private long seq;\n    \n    public SortEntry() {\n        \n    }\n\n    public SortEntry(String key, String type) {\n        this.key = key;\n        this.type = type;\n    }\n\n    public SortEntry(String key, long seq, String type) {\n        this.key = key;\n        this.type = type;\n        this.seq = seq;\n    }\n\n    public String getKey() {\n        return key;\n    }\n\n    public void setKey(String key) {\n        this.key = key;\n    }\n\n    public String getType() {\n        return type;\n    }\n\n    public void setType(String type) {\n        this.type = type;\n    }\n\n    public long getSeq() {\n        return seq;\n    }\n\n    public void setSeq(long seq) {\n        this.seq = seq;\n    }\n\n    @Override\n    public int compareTo(SortEntry o) {\n        if (o.getSeq() == this.getSeq()) {\n            return 0;\n        }\n        if (this.getSeq() > o.getSeq()) {\n            return 1;\n        }\n        return -1;\n    }\n\n    @Override\n    public int hashCode() {\n        return super.hashCode();\n    }\n\n    @Override\n    public boolean equals(Object obj) {\n        return super.equals(obj);\n    }\n\n    @Override\n    public String toString() {\n        return \"SortEntry [key=\" + key + \", type=\" + type + \", seq=\" + seq + \"]\";\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/common/adapter/export/util/ExportResponseUtil.java",
    "content": "package com.jd.easyflow.common.adapter.export.util;\n\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponse;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponseCode;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ExportResponseUtil {\n\n    public static <T> T unwrap(ExportResponse<T> response) {\n        if (ExportResponseCode.SUCCESS.getCode().equals(response.getResCode())) {\n            return response.getData();\n        }\n        throw new RuntimeException(\"Response exception, code:\" + response.getResCode() + \" desc:\" + response.getResDesc());\n    }\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/common/adapter/message/BaseMessage.java",
    "content": "package com.jd.easyflow.common.adapter.message;\n\nimport java.io.Serializable;\nimport java.util.Map;\n\n/**\n * @author liyuliang5\n *\n */\npublic class BaseMessage implements Serializable {\n\n    private Map<String, Object> ext;\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/common/client/dto/ClientRequest.java",
    "content": "package com.jd.easyflow.common.client.dto;\n\nimport java.io.Serializable;\nimport java.util.Map;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ClientRequest<T> implements Serializable {\n\n    private static final long serialVersionUID = 1L;\n\n    protected String reqNo;\n\n     protected Map<String, Object> ext;\n\n    protected String requestTime;\n\n    protected T data;\n    \n    public ClientRequest(T data) {\n        this.data = data;\n    }\n\n    public String getReqNo() {\n        return reqNo;\n    }\n\n    public void setReqNo(String reqNo) {\n        this.reqNo = reqNo;\n    }\n\n    public Map<String, Object> getExt() {\n        return ext;\n    }\n\n    public void setExt(Map<String, Object> ext) {\n        this.ext = ext;\n    }\n\n    public String getRequestTime() {\n        return requestTime;\n    }\n\n    public void setRequestTime(String requestTime) {\n        this.requestTime = requestTime;\n    }\n\n    public T getData() {\n        return data;\n    }\n\n    public void setData(T data) {\n        this.data = data;\n    }\n\n    @Override\n    public String toString() {\n        return \"ClientRequest [reqNo=\" + reqNo + \", ext=\" + ext + \", requestTime=\" + requestTime + \", data=\" + data\n                + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/common/client/dto/ClientResponse.java",
    "content": "package com.jd.easyflow.common.client.dto;\n\nimport java.io.Serializable;\nimport java.util.Map;\nimport java.util.Objects;\n\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponseCode;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ClientResponse<T> implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n    private String resCode;\n\n    private String resDesc;\n\n    private Map<String, Object> ext;\n\n    private T data;\n\n    public ClientResponse() {\n    }\n\n    public ClientResponse(String resCode, String resDesc) {\n        this.resCode = resCode;\n        this.resDesc = resDesc;\n    }\n\n    public static ClientResponse build4Failed(String errorCode, String errorMessage) {\n        return build4Failed(errorCode, errorMessage, null);\n    }\n\n    public static ClientResponse build4Failed(ExportResponseCode error) {\n        return build4Failed(error.getCode(), error.getDesc(), null);\n    }\n\n    public static ClientResponse build4Failed(String errorCode, String errorMessage, Map<String, Object> map) {\n        ClientResponse res = new ClientResponse();\n        res.setResCode(errorCode);\n        res.setResDesc(errorMessage);\n        if (!Objects.isNull(map) && map.size() > 0) {\n            res.setExt(map);\n        }\n        return res;\n    }\n\n    public static ClientResponse build4Success() {\n        ClientResponse res = new ClientResponse();\n        res.setResCode(ClientResponseCode.SUCCESS.getCode());\n        res.setResDesc(ClientResponseCode.SUCCESS.getDesc());\n        return res;\n    }\n\n    public static <T> ClientResponse build4Success(T data) {\n        ClientResponse res = new ClientResponse();\n        res.setResCode(ClientResponseCode.SUCCESS.getCode());\n        res.setResDesc(ClientResponseCode.SUCCESS.getDesc());\n        res.setData(data);\n        return res;\n    }\n\n    public boolean isSuccess() {\n        return ExportResponseCode.SUCCESS.getCode().equals(this.getResCode());\n    }\n\n    public String getResCode() {\n        return resCode;\n    }\n\n    public void setResCode(String resCode) {\n        this.resCode = resCode;\n    }\n\n    public String getResDesc() {\n        return resDesc;\n    }\n\n    public void setResDesc(String resDesc) {\n        this.resDesc = resDesc;\n    }\n\n    public Map<String, Object> getExt() {\n        return ext;\n    }\n\n    public void setExt(Map<String, Object> ext) {\n        this.ext = ext;\n    }\n\n    public T getData() {\n        return data;\n    }\n\n    public void setData(T data) {\n        this.data = data;\n    }\n\n    @Override\n    public String toString() {\n        return \"ClientResponse [resCode=\" + resCode + \", resDesc=\" + resDesc + \", ext=\" + ext + \", data=\" + data + \"]\";\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/common/client/dto/ClientResponseCode.java",
    "content": "package com.jd.easyflow.common.client.dto;\n\n/**\n * @author liyuliang5\n *\n */\npublic  enum ClientResponseCode {\n    \n    SUCCESS(\"0000000\",\"Success\"),\n\n    FAIL(\"0000001\",\"Fail\"),\n\n    DATA_EMPTY(\"0000004\",\"Data not exists\"),\n\n    FIELD_EMPTY(\"0000005\",\"Field empty\"),\n\n    INVALID(\"0000002\",\"Validate fail\"),\n\n    EXCEPTION(\"9999999\",\"System exception\"),\n    ;\n\n    private String code;\n\n    private String desc;\n\n    ClientResponseCode(String code, String desc) {\n        this.code = code;\n        this.desc = desc;\n    }\n\n    public String getCode() {\n        return code;\n    }\n\n    public String getDesc() {\n        return desc;\n    }\n\n}\n\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/form/adapter/export/FormTemplateExport.java",
    "content": "package com.jd.easyflow.form.adapter.export;\n\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponse;\nimport com.jd.easyflow.common.adapter.export.dto.pager.PagerCondition;\nimport com.jd.easyflow.common.adapter.export.dto.pager.PagerResult;\nimport com.jd.easyflow.form.adapter.export.dto.FormTemplateDTO;\n\n/**\n * @author liyuliang5\n *\n */\npublic interface FormTemplateExport {\n\n    ExportResponse<PagerResult> find(ExportRequest<PagerCondition> pagerCondition);\n    \n    ExportResponse<Void> add(ExportRequest<FormTemplateDTO> formTemplate);\n    \n    ExportResponse<Void> update(ExportRequest<FormTemplateDTO> formTemplate);\n        \n    ExportResponse<FormTemplateDTO> get(ExportRequest<String> templateCode);\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/form/adapter/export/dto/FormTemplateDTO.java",
    "content": "package com.jd.easyflow.form.adapter.export.dto;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\n/**\n * @author liyuliang5\n *\n */\npublic class FormTemplateDTO implements Serializable {\n\n\n    private Long id;\n\n    private Date createdDate;\n\n    private Date modifiedDate;\n\n    private String templateCode;\n\n    private String templateName;\n\n    private String config;\n\n    private String status;\n    \n    private String bizType;\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n\n    public String getTemplateCode() {\n        return templateCode;\n    }\n\n    public void setTemplateCode(String templateCode) {\n        this.templateCode = templateCode;\n    }\n\n    public String getTemplateName() {\n        return templateName;\n    }\n\n    public void setTemplateName(String templateName) {\n        this.templateName = templateName;\n    }\n\n    public String getConfig() {\n        return config;\n    }\n\n    public void setConfig(String config) {\n        this.config = config;\n    }\n\n    public String getStatus() {\n        return status;\n    }\n\n    public void setStatus(String status) {\n        this.status = status;\n    }\n\n    public String getBizType() {\n        return bizType;\n    }\n\n    public void setBizType(String bizType) {\n        this.bizType = bizType;\n    }\n\n    @Override\n    public String toString() {\n        return \"FormTemplateDTO [id=\" + id + \", createdDate=\" + createdDate + \", modifiedDate=\" + modifiedDate\n                + \", templateCode=\" + templateCode + \", templateName=\" + templateName + \", config=\" + config\n                + \", status=\" + status + \", bizType=\" + bizType + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/ProcessDefinitionExport.java",
    "content": "package com.jd.easyflow.process.adapter.export;\n\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponse;\nimport com.jd.easyflow.common.adapter.export.dto.pager.PagerCondition;\nimport com.jd.easyflow.common.adapter.export.dto.pager.PagerResult;\nimport com.jd.easyflow.process.adapter.export.dto.definition.NodeDTO;\nimport com.jd.easyflow.process.adapter.export.dto.definition.ProcessDTO;\nimport com.jd.easyflow.process.adapter.export.dto.definition.ProcessDefinitionDTO;\nimport com.jd.easyflow.process.adapter.export.dto.definition.QueryNodeReq;\nimport com.jd.easyflow.process.adapter.export.dto.definition.QueryProcessDefinitionReq;\n\n/**\n * @author liyuliang5\n *\n */\npublic interface ProcessDefinitionExport {\n    \n    public ExportResponse<ProcessDefinitionDTO> getLatestProcessDefinition(ExportRequest<String> req);\n\n    public ExportResponse<ProcessDefinitionDTO> getVersionedProcessDefinition(ExportRequest<String> req);\n\n    ExportResponse<ProcessDefinitionDTO> queryProcessDefinitionByVersion(ExportRequest<QueryProcessDefinitionReq> req);\n\n    ExportResponse<ProcessDefinitionDTO> getProcessDefinition(ExportRequest<String> req);\n\n    ExportResponse addProcessDefinition(ExportRequest<ProcessDefinitionDTO> processDefinitionReq);\n\n    ExportResponse updateProcessDefinition(ExportRequest<ProcessDefinitionDTO> processDefinitionReq);\n\n    ExportResponse<PagerResult<ProcessDefinitionDTO>> pageQueryProcessDefinition(ExportRequest<PagerCondition> pagerQueryReq);\n\n    ExportResponse<Integer> getLatestProcessDefVersionByDefId(ExportRequest<String> request);\n\n    ExportResponse reportProcessDef(ExportRequest<ProcessDefinitionDTO> processDefinitionReq);\n\n    ExportResponse forceUpdateCurrentVersionProcessDef(ExportRequest<ProcessDefinitionDTO> processDefinitionReq);\n\n    ExportResponse<ProcessDTO> getProcessProperties(ExportRequest<String> request);\n\n    ExportResponse<NodeDTO> getNodeProperties(ExportRequest<QueryNodeReq> request);\n\n    ExportResponse<ProcessDTO> getProcessAndNodeProperties(ExportRequest<String> request);\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/ProcessInstanceExport.java",
    "content": "package com.jd.easyflow.process.adapter.export;\n\nimport java.util.List;\n\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponse;\nimport com.jd.easyflow.common.adapter.export.dto.pager.PagerCondition;\nimport com.jd.easyflow.common.adapter.export.dto.pager.PagerResult;\nimport com.jd.easyflow.process.adapter.export.dto.instance.CanCancelProcessInstanceReq;\nimport com.jd.easyflow.process.adapter.export.dto.instance.CanCancelProcessInstanceRes;\nimport com.jd.easyflow.process.adapter.export.dto.instance.CancelProcessInstanceReq;\nimport com.jd.easyflow.process.adapter.export.dto.instance.CancelProcessInstanceRes;\nimport com.jd.easyflow.process.adapter.export.dto.instance.CreateProcessInstanceReq;\nimport com.jd.easyflow.process.adapter.export.dto.instance.CreateProcessInstanceRes;\nimport com.jd.easyflow.process.adapter.export.dto.instance.LockProcessInstanceReq;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessInstanceDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessNodeExecutionDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessNodeInstanceDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.QueryOpenNodeInstanceReq;\nimport com.jd.easyflow.process.adapter.export.dto.instance.QueryProcessInstanceReq;\nimport com.jd.easyflow.process.adapter.export.dto.instance.QueryProcessNodeReqDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.UnlockProcessInstanceReq;\nimport com.jd.easyflow.process.adapter.export.dto.instance.RollbackNodeReq;\nimport com.jd.easyflow.process.adapter.export.dto.instance.RollbackNodeRes;\n\n/**\n * @author liyuliang5\n *\n */\npublic interface ProcessInstanceExport {\n\n    public static final String TYPE_PROCESS = \"PROCESS\";\n    public static final String TYPE_NODE = \"NODE\";\n    public static final String TYPE_EXECUTION = \"EXECUTION\";\n\n    ExportResponse<CreateProcessInstanceRes> createProcessInstance(ExportRequest<CreateProcessInstanceReq> req);\n    \n    ExportResponse<String> lockProcessInstance(ExportRequest<LockProcessInstanceReq> req);\n\n    ExportResponse<Boolean> unLockProcessInstance(ExportRequest<UnlockProcessInstanceReq> req);\n    \n    ExportResponse updateProcessInstance(ExportRequest<ProcessInstanceDTO> request);\n\n    ExportResponse<CanCancelProcessInstanceRes> canCancel(ExportRequest<CanCancelProcessInstanceReq> request);\n\n    ExportResponse<CancelProcessInstanceRes> cancel(ExportRequest<CancelProcessInstanceReq> request);\n    \n    /* process instance query */\n    ExportResponse<PagerResult> pagerQueryProcessInstance(ExportRequest<PagerCondition> req);\n    \n    ExportResponse<ProcessInstanceDTO> getProcessInstance(ExportRequest<String> req);\n    \n    ExportResponse<ProcessInstanceDTO> queryProcessInstanceByProcessTypeAndBizNo(ExportRequest<QueryProcessInstanceReq> req);\n    \n    ExportResponse<ProcessInstanceDTO> queryActiveProcessInstanceByProcessTypeAndBizNo(ExportRequest<QueryProcessInstanceReq> req);\n    \n    ExportResponse<List<ProcessInstanceDTO>> queryInstanceByInstanceNos(ExportRequest<List<String>> request);\n    \n    ExportResponse<List<ProcessInstanceDTO>> queryProcessInstanceByParentInstanceNo(ExportRequest<String> request);\n\n    /*process node instance query*/\n    ExportResponse<List<ProcessNodeInstanceDTO>> queryProcessNodeInstanceByInstanceNo(ExportRequest<String> req);\n\n    ExportResponse<ProcessNodeInstanceDTO> queryOpenNodeInstance(ExportRequest<QueryOpenNodeInstanceReq> request);\n\n    ExportResponse<List<ProcessNodeInstanceDTO>> findNodeInstances(ExportRequest<QueryProcessNodeReqDTO> queryReq);\n\n    ExportResponse<ProcessNodeInstanceDTO> queryNodeInstanceByNo(ExportRequest<String> request);\n\n    ExportResponse<List<ProcessNodeInstanceDTO>> queryNodeInstanceByNos(ExportRequest<List<String>> request);\n\n    /*process execution query*/\n    ExportResponse<ProcessNodeExecutionDTO> queryNodeExecutionByNo(ExportRequest<String> request);\n    ExportResponse<PagerResult> pagerQueryNodeExecution(ExportRequest<PagerCondition> req);\n\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/ProcessScheduleExport.java",
    "content": "package com.jd.easyflow.process.adapter.export;\n\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponse;\nimport com.jd.easyflow.process.adapter.export.dto.schedule.ScheduleProcessReq;\nimport com.jd.easyflow.process.adapter.export.dto.schedule.ScheduleProcessRes;\n\n/**\n * @author liyuliang5\n *\n */\npublic interface ProcessScheduleExport {\n\n    /**\n     * @param req\n     * @return\n     */\n    ExportResponse<ScheduleProcessRes> schedule(ExportRequest<ScheduleProcessReq> req);\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/ProcessTaskExport.java",
    "content": "package com.jd.easyflow.process.adapter.export;\n\nimport java.util.List;\n\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponse;\nimport com.jd.easyflow.common.adapter.export.dto.pager.PagerCondition;\nimport com.jd.easyflow.common.adapter.export.dto.pager.PagerResult;\nimport com.jd.easyflow.process.adapter.export.dto.task.CanWithdrawTaskReq;\nimport com.jd.easyflow.process.adapter.export.dto.task.CanWithdrawTaskRes;\nimport com.jd.easyflow.process.adapter.export.dto.task.ExecuteTaskReq;\nimport com.jd.easyflow.process.adapter.export.dto.task.ExecuteTaskRes;\nimport com.jd.easyflow.process.adapter.export.dto.task.ProcessTaskAssignDTO;\nimport com.jd.easyflow.process.adapter.export.dto.task.ProcessTaskDTO;\nimport com.jd.easyflow.process.adapter.export.dto.task.QueryTaskReq;\nimport com.jd.easyflow.process.adapter.export.dto.task.TaskOperationsReq;\nimport com.jd.easyflow.process.adapter.export.dto.task.TaskOperationsRes;\nimport com.jd.easyflow.process.adapter.export.dto.task.WithdrawTaskReq;\nimport com.jd.easyflow.process.adapter.export.dto.task.WithdrawTaskRes;\n\n/**\n\n * @author liyuliang5\n *\n */\npublic interface ProcessTaskExport {\n    \n    ExportResponse<List<ProcessTaskDTO>> queryTask(ExportRequest<QueryTaskReq> req);\n    \n    ExportResponse<ExecuteTaskRes> executeTask(ExportRequest<ExecuteTaskReq> req);\n    \n    ExportResponse<PagerResult> pagerQueryTask(ExportRequest<PagerCondition> req);\n\n    ExportResponse<ProcessTaskDTO> getTask(ExportRequest<String> req);\n\n    ExportResponse<CanWithdrawTaskRes> canWithdraw(ExportRequest<CanWithdrawTaskReq> req);\n\n    ExportResponse<WithdrawTaskRes> withDraw(ExportRequest<WithdrawTaskReq> req);\n\n    ExportResponse<TaskOperationsRes> doExecuteOperations(ExportRequest<TaskOperationsReq> req);  \n\n    ExportResponse<List<ProcessTaskAssignDTO>> findTaskAssignListByTaskNo(ExportRequest<String> req);\n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/ProcessToolExport.java",
    "content": "package com.jd.easyflow.process.adapter.export;\n\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponse;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessInstanceDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessNodeInstanceDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.RollbackNodeReq;\nimport com.jd.easyflow.process.adapter.export.dto.instance.RollbackNodeRes;\n\n/**\n * @author liyuliang5\n */\npublic interface ProcessToolExport {\n\n    ExportResponse<RollbackNodeRes> rollbackNode(ExportRequest<RollbackNodeReq> request);\n    \n    ExportResponse updateProcessInstance(ExportRequest<ProcessInstanceDTO> request);\n    \n    ExportResponse updateProcessNodeInstance(ExportRequest<ProcessNodeInstanceDTO> request);\n    \n    ExportResponse deleteProcessNodeInstance(ExportRequest<String> request);\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/ProcessTransactionExport.java",
    "content": "package com.jd.easyflow.process.adapter.export;\n\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponse;\nimport com.jd.easyflow.process.adapter.export.dto.transaction.BatchObjectIdReq;\nimport com.jd.easyflow.process.adapter.export.dto.transaction.BatchObjectIdRes;\nimport com.jd.easyflow.process.adapter.export.dto.transaction.TxnReq;\nimport com.jd.easyflow.process.adapter.export.dto.transaction.TxnRes;\n\n/**\n * @author liyuliang5\n *\n */\npublic interface ProcessTransactionExport {\n    \n    ExportResponse<String> nextObjectId(ExportRequest<String> rquest);\n    \n    ExportResponse<BatchObjectIdRes> batchNextObjectId(ExportRequest<BatchObjectIdReq> request);\n\n    ExportResponse<TxnRes> doTransaction(ExportRequest<TxnReq> request);\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/constant/ProcessInstanceConstants.java",
    "content": "package com.jd.easyflow.process.adapter.export.constant;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessInstanceConstants {\n\n    public static final String STATUS_ACTIVE = \"ACTIVE\";\n    public static final String STATUS_CLOSE = \"CLOSE\";\n\n    public static final String STATUS_CANCELED = \"CANCELED\";\n\n    public static final String NODE_STATUS_ACTIVE = \"ACTIVE\";\n    public static final String NODE_STATUS_INACTIVE = \"INACTIVE\";\n    public static final String NODE_STATUS_CLOSE = \"CLOSE\";\n    public static final String NODE_STATUS_INVALID = \"INVALID\";\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/constant/ProcessTaskConstants.java",
    "content": "package com.jd.easyflow.process.adapter.export.constant;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessTaskConstants {\n\n    public static final String PARAM_TASK_EXECUTE_RESULT = \"task.executeBizResult\";\n    \n    public static final String PARAM_TASK_EXECUTE_DATA = \"task.executeBizData\";\n    \n    public static final String TASK_STATUS_PENDING = \"PENDING\";\n    public static final String TASK_STATUS_FINISH = \"FINISH\";\n    public static final String TASK_STATUS_CANCELED = \"CANCELED\";\n    public static final String TASK_STATUS_INVALID = \"INVALID\";\n    \n    public static final String PAGER_EXT_KEY_ASSIGN = \"assign\";\n    public static final String PAGER_EXT_ASSIGN_PENDING = \"PENDING\";\n    public static final String PAGER_EXT_KEY_PROCESS_INSTANCE = \"processInstance\";\n    public static final String PAGER_EXT_PROCESS_INSTANCE_ALL = \"ALL\";\n    public static final String PAGER_EXT_KEY_NODE_TASK_CONF = \"nodeTaskConf\";\n    public static final String PAGER_EXT_NODE_TASK_CONF_PENDING = \"PENDING\";\n    \n    public static final String ASSIGN_TYPE_USER = \"USER\";\n    \n    public static final String ASSIGN_TYPE_GROUP = \"GROUP\";\n    \n    public static final String CMD_TYPE_CREATE_TASK = \"createTask\";\n    \n    public static final String COMMAND_TYPE_CREATE_TASK = \"createTask\";\n    \n    public static final String COMMAND_TYPE_CREATE_MULTIPLE_TASK = \"createMultipleTask\";\n    \n    public static final String COMMAND_TYPE_EXECUTE_TASK = \"executeTask\";\n    \n    public static final String TASK_EVENT_CREATE = \"CREATE\";\n    public static final String TASK_EVENT_EXECUTE = \"EXECUTE\";\n    \n    public static final String WITHDRAW_INSTANCE_POLICY_NONE = \"NONE\";\n    public static final String WITHDRAW_INSTANCE_POLICY_HISTORY = \"HISTORY\";\n    public static final String WITHDRAW_INSTANCE_POLICY_CUSTOMIZE = \"CUSTOMIZE\";\n    \n    public static final String TASK_OP_EXECUTE = \"EXECUTE\";\n    public static final String TASK_OP_SAVE = \"SAVE\";\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/constant/ProcessTransactionConstants.java",
    "content": "package com.jd.easyflow.process.adapter.export.constant;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessTransactionConstants {\n    \n    public static final String TYPE_PROCESS = \"PROCESS\";\n    public static final String TYPE_NODE = \"NODE\";\n    public static final String TYPE_EXECUTION = \"EXECUTION\";\n    public static final String TYPE_TASK = \"TASK\";\n    public static final String TYPE_TASK_ASSIGN = \"TASK_ASSIGN\";\n    public static final String TYPE_TASK_EVENT = \"TASK_EVENT\";\n    \n    public static final int PERSIST_OP_NONE = 0;\n    public static final int PERSIST_OP_ADD = 1;\n    public static final int PERSIST_OP_UPDATE = 2;\n\n    public static final String TXN_COMMAND_BATCH_UPDATE = \"batchUpdate\";\n\n    public static final String TXN_COMMAND_INTERRUPT = \"interrupt\";\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/constant/ShardingConstants.java",
    "content": "package com.jd.easyflow.process.adapter.export.constant;\n\n/**\n * @author liyuliang5\n */\npublic class ShardingConstants {\n    \n    public static final String EXPORT_REQUEST_EXT_KEY_PROCESS_TYPE = \"_processType\";\n    public static final String EXPORT_REQUEST_EXT_KEY_BIZ_NO = \"_bizNo\";\n    public static final String EXPORT_REQUEST_EXT_KEY_SHARD = \"_shard\";\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/definition/NodeDTO.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.definition;\n\nimport java.io.Serializable;\nimport java.util.Map;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class NodeDTO implements Serializable {\n\n    private Map<String, Object> properties;\n\n    public Map<String, Object> getProperties() {\n        return properties;\n    }\n\n    public void setProperties(Map<String, Object> properties) {\n        this.properties = properties;\n    }\n\n    @Override\n    public String toString() {\n        return \"NodeDTO [properties=\" + properties + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/definition/ProcessDTO.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.definition;\n\nimport java.io.Serializable;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ProcessDTO implements Serializable {\n    \n    private List<NodeDTO> nodeList;\n\n    private Map<String, Object> properties;\n\n    public List<NodeDTO> getNodeList() {\n        return nodeList;\n    }\n\n    public void setNodeList(List<NodeDTO> nodeList) {\n        this.nodeList = nodeList;\n    }\n\n    public Map<String, Object> getProperties() {\n        return properties;\n    }\n\n    public void setProperties(Map<String, Object> properties) {\n        this.properties = properties;\n    }\n\n    @Override\n    public String toString() {\n        return \"ProcessDTO [nodeList=\" + nodeList + \", properties=\" + properties + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/definition/ProcessDefinitionDTO.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.definition;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessDefinitionDTO implements Serializable {\n\n    private Long id;\n\n    private String defId;\n\n    private Integer defVersion;\n\n    private String name;\n\n    private String format;\n\n    private String bizType;\n\n    private String jsonContent;\n\n    private Boolean latest;\n\n    private String defSource;\n\n    private String extData;\n\n    private Date createdDate;\n\n    private Date modifiedDate;\n\n    private String content;\n\n    private String category;\n\n    private String createdBy;\n\n    private String modifiedBy;\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getDefId() {\n        return defId;\n    }\n\n    public void setDefId(String defId) {\n        this.defId = defId;\n    }\n\n    public Integer getDefVersion() {\n        return defVersion;\n    }\n\n    public void setDefVersion(Integer defVersion) {\n        this.defVersion = defVersion;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getFormat() {\n        return format;\n    }\n\n    public void setFormat(String format) {\n        this.format = format;\n    }\n\n    public String getBizType() {\n        return bizType;\n    }\n\n    public void setBizType(String bizType) {\n        this.bizType = bizType;\n    }\n\n    public String getJsonContent() {\n        return jsonContent;\n    }\n\n    public void setJsonContent(String jsonContent) {\n        this.jsonContent = jsonContent;\n    }\n\n    public Boolean getLatest() {\n        return latest;\n    }\n\n    public void setLatest(Boolean latest) {\n        this.latest = latest;\n    }\n\n    public String getDefSource() {\n        return defSource;\n    }\n\n    public void setDefSource(String defSource) {\n        this.defSource = defSource;\n    }\n\n    public String getExtData() {\n        return extData;\n    }\n\n    public void setExtData(String extData) {\n        this.extData = extData;\n    }\n\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n\n    public String getContent() {\n        return content;\n    }\n\n    public void setContent(String content) {\n        this.content = content;\n    }\n\n    public String getCategory() {\n        return category;\n    }\n\n    public void setCategory(String category) {\n        this.category = category;\n    }\n\n    public String getCreatedBy() {\n        return createdBy;\n    }\n\n    public void setCreatedBy(String createdBy) {\n        this.createdBy = createdBy;\n    }\n\n    public String getModifiedBy() {\n        return modifiedBy;\n    }\n\n    public void setModifiedBy(String modifiedBy) {\n        this.modifiedBy = modifiedBy;\n    }\n\n    @Override\n    public String toString() {\n        return \"ProcessDefinitionDTO [id=\" + id + \", defId=\" + defId + \", defVersion=\" + defVersion + \", name=\" + name\n                + \", format=\" + format + \", bizType=\" + bizType + \", jsonContent=\" + jsonContent + \", latest=\" + latest\n                + \", defSource=\" + defSource + \", extData=\" + extData + \", createdDate=\" + createdDate\n                + \", modifiedDate=\" + modifiedDate + \", content=\" + content + \", category=\" + category + \", createdBy=\"\n                + createdBy + \", modifiedBy=\" + modifiedBy + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/definition/QueryNodeReq.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.definition;\n\nimport java.io.Serializable;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class QueryNodeReq implements Serializable {\n    \n\n    private String processId;\n    \n    private String nodeId;\n    \n    public QueryNodeReq() {\n        // NOOP\n    }\n    \n    public QueryNodeReq(String processId, String nodeId) {\n        this.processId = processId;\n        this.nodeId = nodeId;\n    }\n\n    public String getProcessId() {\n        return processId;\n    }\n\n    public void setProcessId(String processId) {\n        this.processId = processId;\n    }\n\n    public String getNodeId() {\n        return nodeId;\n    }\n\n    public void setNodeId(String nodeId) {\n        this.nodeId = nodeId;\n    }\n\n    @Override\n    public String toString() {\n        return \"QueryNodeReq [processId=\" + processId + \", nodeId=\" + nodeId + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/definition/QueryProcessDefinitionReq.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.definition;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n *\n */\npublic class QueryProcessDefinitionReq implements Serializable {\n\n    private String defId;\n    \n    private Integer defVersion;\n\n    public String getDefId() {\n        return defId;\n    }\n\n    public void setDefId(String defId) {\n        this.defId = defId;\n    }\n\n    public Integer getDefVersion() {\n        return defVersion;\n    }\n\n    public void setDefVersion(Integer defVersion) {\n        this.defVersion = defVersion;\n    }\n\n    @Override\n    public String toString() {\n        return \"QueryProcessDefinitionReq [defId=\" + defId + \", defVersion=\" + defVersion + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/instance/CanCancelProcessInstanceReq.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.instance;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n *\n */\npublic class CanCancelProcessInstanceReq implements Serializable {\n    private static final long serialVersionUID = 1853675006208281830L;\n\n    private String instanceNo;\n\n    private String cancelUser;\n\n    public String getInstanceNo() {\n        return instanceNo;\n    }\n\n    public void setInstanceNo(String instanceNo) {\n        this.instanceNo = instanceNo;\n    }\n\n    public String getCancelUser() {\n        return cancelUser;\n    }\n\n    public void setCancelUser(String cancelUser) {\n        this.cancelUser = cancelUser;\n    }\n\n    @Override\n    public String toString() {\n        return \"CanCancelProcessInstanceReq [instanceNo=\" + instanceNo + \", cancelUser=\" + cancelUser + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/instance/CanCancelProcessInstanceRes.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.instance;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n *\n */\npublic class CanCancelProcessInstanceRes implements Serializable {\n    private static final long serialVersionUID = 5517298115339740671L;\n\n    private boolean canCancel;\n\n    private String reason;\n    public boolean isCanCancel() {\n        return canCancel;\n    }\n    public void setCanCancel(boolean canCancel) {\n        this.canCancel = canCancel;\n    }\n    public String getReason() {\n        return reason;\n    }\n    public void setReason(String reason) {\n        this.reason = reason;\n    }\n    @Override\n    public String toString() {\n        return \"CanCancelProcessInstanceRes [canCancel=\" + canCancel + \", reason=\" + reason + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/instance/CancelProcessInstanceReq.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.instance;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\n/**\n * @author liyuliang5\n *\n */\npublic class CancelProcessInstanceReq implements Serializable {\n    private static final long serialVersionUID = -6341207830866532031L;\n\n    private String instanceNo;\n\n    private String cancelUser;\n\n    private Date cancelTime;\n\n    private String cancelReason;\n    public String getInstanceNo() {\n        return instanceNo;\n    }\n    public void setInstanceNo(String instanceNo) {\n        this.instanceNo = instanceNo;\n    }\n    public String getCancelUser() {\n        return cancelUser;\n    }\n    public void setCancelUser(String cancelUser) {\n        this.cancelUser = cancelUser;\n    }\n    public Date getCancelTime() {\n        return cancelTime;\n    }\n    public void setCancelTime(Date cancelTime) {\n        this.cancelTime = cancelTime;\n    }\n    public String getCancelReason() {\n        return cancelReason;\n    }\n    public void setCancelReason(String cancelReason) {\n        this.cancelReason = cancelReason;\n    }\n    @Override\n    public String toString() {\n        return \"CancelProcessInstanceReq [instanceNo=\" + instanceNo + \", cancelUser=\" + cancelUser + \", cancelTime=\"\n                + cancelTime + \", cancelReason=\" + cancelReason + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/instance/CancelProcessInstanceRes.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.instance;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n *\n */\npublic class CancelProcessInstanceRes implements Serializable {\n    private static final long serialVersionUID = -8382865143783625087L;\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/instance/CreateProcessInstanceReq.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.instance;\n\nimport java.io.Serializable;\nimport java.util.Map;\n\n/**\n * @author liyuliang5\n *\n */\npublic class CreateProcessInstanceReq implements Serializable {\n\n\n    private String processType;\n\n    private String bizNo;\n\n    private String processId;\n\n    private String instanceName;\n\n    private Object param;\n\n    private Map<String, Object> dataMap;\n\n    private String bizStatus;\n\n    private String bizData;\n\n    private String creator;\n\n    private String productCode;\n\n    private String keyField;\n\n    private String keyField2;\n    public String getProcessType() {\n        return processType;\n    }\n    public void setProcessType(String processType) {\n        this.processType = processType;\n    }\n    public String getBizNo() {\n        return bizNo;\n    }\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n    public String getProcessId() {\n        return processId;\n    }\n    public void setProcessId(String processId) {\n        this.processId = processId;\n    }\n    public String getInstanceName() {\n        return instanceName;\n    }\n    public void setInstanceName(String instanceName) {\n        this.instanceName = instanceName;\n    }\n    public Object getParam() {\n        return param;\n    }\n    public void setParam(Object param) {\n        this.param = param;\n    }\n    public Map<String, Object> getDataMap() {\n        return dataMap;\n    }\n    public void setDataMap(Map<String, Object> dataMap) {\n        this.dataMap = dataMap;\n    }\n    public String getBizStatus() {\n        return bizStatus;\n    }\n    public void setBizStatus(String bizStatus) {\n        this.bizStatus = bizStatus;\n    }\n    public String getBizData() {\n        return bizData;\n    }\n    public void setBizData(String bizData) {\n        this.bizData = bizData;\n    }\n    public String getCreator() {\n        return creator;\n    }\n    public void setCreator(String creator) {\n        this.creator = creator;\n    }\n    public String getProductCode() {\n        return productCode;\n    }\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n    public String getKeyField() {\n        return keyField;\n    }\n    public void setKeyField(String keyField) {\n        this.keyField = keyField;\n    }\n    public String getKeyField2() {\n        return keyField2;\n    }\n    public void setKeyField2(String keyField2) {\n        this.keyField2 = keyField2;\n    }\n    @Override\n    public String toString() {\n        return \"CreateProcessInstanceReq [processType=\" + processType + \", bizNo=\" + bizNo + \", processId=\" + processId\n                + \", instanceName=\" + instanceName + \", param=\" + param + \", dataMap=\" + dataMap + \", bizStatus=\"\n                + bizStatus + \", bizData=\" + bizData + \", creator=\" + creator + \", productCode=\" + productCode\n                + \", keyField=\" + keyField + \", keyField2=\" + keyField2 + \"]\";\n    }\n    \n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/instance/CreateProcessInstanceRes.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.instance;\n\nimport java.io.Serializable;\n\n/**\n * \n * @author liyuliang5\n */\npublic class CreateProcessInstanceRes implements Serializable {\n\n    private String processInstanceNo;\n\n    public String getProcessInstanceNo() {\n        return processInstanceNo;\n    }\n\n    public void setProcessInstanceNo(String processInstanceNo) {\n        this.processInstanceNo = processInstanceNo;\n    }\n\n    @Override\n    public String toString() {\n        return \"CreateProcessInstanceRes [processInstanceNo=\" + processInstanceNo + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/instance/LockProcessInstanceReq.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.instance;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n *\n */\npublic class LockProcessInstanceReq implements Serializable {\n\n    String processType;\n    \n    String bizNo;\n\n    public String getProcessType() {\n        return processType;\n    }\n\n    public void setProcessType(String processType) {\n        this.processType = processType;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    @Override\n    public String toString() {\n        return \"LockProcessInstanceReq [processType=\" + processType + \", bizNo=\" + bizNo + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/instance/PersistDTO.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.instance;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n *\n */\npublic class PersistDTO implements Serializable {\n\n    private int persistOp;\n    \n    private Object persistObject;\n\n    public int getPersistOp() {\n        return persistOp;\n    }\n\n    public void setPersistOp(int persistOp) {\n        this.persistOp = persistOp;\n    }\n\n    public Object getPersistObject() {\n        return persistObject;\n    }\n\n    public void setPersistObject(Object persistObject) {\n        this.persistObject = persistObject;\n    }\n\n    @Override\n    public String toString() {\n        return \"PersistDTO [persistOp=\" + persistOp + \", persistObject=\" + persistObject + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/instance/ProcessInstanceDTO.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.instance;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessInstanceDTO implements Serializable {\n\n\n    private String instanceNo;\n\n    private String instanceName;\n\n    private String processType;\n\n    private String bizNo;\n\n    private String productCode;\n\n    private String creator;\n\n    private String processDefId;\n\n    private Date startTime;\n\n    private Date endTime;\n\n    private String status;\n\n    private String currentNodeIds;\n    \n    private String parentInstanceNo;\n\n    private String parentNodeInstanceNo;\n\n    private String bizStatus;\n\n    private String bizData;\n\n    private String vars;\n\n    private String extData;\n\n    private Date createdDate;\n\n    private Date modifiedDate;\n\n    private String keyField;\n\n    private String keyField2;\n    public String getInstanceNo() {\n        return instanceNo;\n    }\n    public void setInstanceNo(String instanceNo) {\n        this.instanceNo = instanceNo;\n    }\n    public String getInstanceName() {\n        return instanceName;\n    }\n    public void setInstanceName(String instanceName) {\n        this.instanceName = instanceName;\n    }\n    public String getProcessType() {\n        return processType;\n    }\n    public void setProcessType(String processType) {\n        this.processType = processType;\n    }\n    public String getBizNo() {\n        return bizNo;\n    }\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n    public String getProductCode() {\n        return productCode;\n    }\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n    public String getCreator() {\n        return creator;\n    }\n    public void setCreator(String creator) {\n        this.creator = creator;\n    }\n    public String getProcessDefId() {\n        return processDefId;\n    }\n    public void setProcessDefId(String processDefId) {\n        this.processDefId = processDefId;\n    }\n    public Date getStartTime() {\n        return startTime;\n    }\n    public void setStartTime(Date startTime) {\n        this.startTime = startTime;\n    }\n    public Date getEndTime() {\n        return endTime;\n    }\n    public void setEndTime(Date endTime) {\n        this.endTime = endTime;\n    }\n    public String getStatus() {\n        return status;\n    }\n    public void setStatus(String status) {\n        this.status = status;\n    }\n    public String getCurrentNodeIds() {\n        return currentNodeIds;\n    }\n    public void setCurrentNodeIds(String currentNodeIds) {\n        this.currentNodeIds = currentNodeIds;\n    }\n    public String getParentInstanceNo() {\n        return parentInstanceNo;\n    }\n    public void setParentInstanceNo(String parentInstanceNo) {\n        this.parentInstanceNo = parentInstanceNo;\n    }\n    public String getParentNodeInstanceNo() {\n        return parentNodeInstanceNo;\n    }\n    public void setParentNodeInstanceNo(String parentNodeInstanceNo) {\n        this.parentNodeInstanceNo = parentNodeInstanceNo;\n    }\n    public String getBizStatus() {\n        return bizStatus;\n    }\n    public void setBizStatus(String bizStatus) {\n        this.bizStatus = bizStatus;\n    }\n    public String getBizData() {\n        return bizData;\n    }\n    public void setBizData(String bizData) {\n        this.bizData = bizData;\n    }\n    public String getVars() {\n        return vars;\n    }\n    public void setVars(String vars) {\n        this.vars = vars;\n    }\n    public String getExtData() {\n        return extData;\n    }\n    public void setExtData(String extData) {\n        this.extData = extData;\n    }\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n    public String getKeyField() {\n        return keyField;\n    }\n    public void setKeyField(String keyField) {\n        this.keyField = keyField;\n    }\n    public String getKeyField2() {\n        return keyField2;\n    }\n    public void setKeyField2(String keyField2) {\n        this.keyField2 = keyField2;\n    }\n    @Override\n    public String toString() {\n        return \"ProcessInstanceDTO [instanceNo=\" + instanceNo + \", instanceName=\" + instanceName + \", processType=\"\n                + processType + \", bizNo=\" + bizNo + \", productCode=\" + productCode + \", creator=\" + creator\n                + \", processDefId=\" + processDefId + \", startTime=\" + startTime + \", endTime=\" + endTime + \", status=\"\n                + status + \", currentNodeIds=\" + currentNodeIds + \", parentInstanceNo=\" + parentInstanceNo\n                + \", parentNodeInstanceNo=\" + parentNodeInstanceNo + \", bizStatus=\" + bizStatus + \", bizData=\" + bizData\n                + \", vars=\" + vars + \", extData=\" + extData + \", createdDate=\" + createdDate + \", modifiedDate=\"\n                + modifiedDate + \", keyField=\" + keyField + \", keyField2=\" + keyField2 + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/instance/ProcessNodeExecutionDTO.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.instance;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessNodeExecutionDTO implements Serializable {\n\n    private Long id;\n\n    private String nodeExecutionNo;\n\n    private String nodeInstanceNo;\n\n    private String eventId;\n\n    private String processDefId;\n\n    private String nodeId;\n\n    private Date startTime;\n\n    private Date endTime;\n\n    private String status;\n\n    private String productCode;\n\n    private String executor;\n\n    private String nextNodeInstances;\n\n    private String extData;\n\n    private Date createdDate;\n\n    private Date modifiedDate;\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getNodeExecutionNo() {\n        return nodeExecutionNo;\n    }\n\n    public void setNodeExecutionNo(String nodeExecutionNo) {\n        this.nodeExecutionNo = nodeExecutionNo;\n    }\n\n    public String getNodeInstanceNo() {\n        return nodeInstanceNo;\n    }\n\n    public void setNodeInstanceNo(String nodeInstanceNo) {\n        this.nodeInstanceNo = nodeInstanceNo;\n    }\n\n    public String getEventId() {\n        return eventId;\n    }\n\n    public void setEventId(String eventId) {\n        this.eventId = eventId;\n    }\n\n    public String getProcessDefId() {\n        return processDefId;\n    }\n\n    public void setProcessDefId(String processDefId) {\n        this.processDefId = processDefId;\n    }\n\n    public String getNodeId() {\n        return nodeId;\n    }\n\n    public void setNodeId(String nodeId) {\n        this.nodeId = nodeId;\n    }\n\n    public Date getStartTime() {\n        return startTime;\n    }\n\n    public void setStartTime(Date startTime) {\n        this.startTime = startTime;\n    }\n\n    public Date getEndTime() {\n        return endTime;\n    }\n\n    public void setEndTime(Date endTime) {\n        this.endTime = endTime;\n    }\n\n    public String getStatus() {\n        return status;\n    }\n\n    public void setStatus(String status) {\n        this.status = status;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n\n    public String getExecutor() {\n        return executor;\n    }\n\n    public void setExecutor(String executor) {\n        this.executor = executor;\n    }\n\n    public String getNextNodeInstances() {\n        return nextNodeInstances;\n    }\n\n    public void setNextNodeInstances(String nextNodeInstances) {\n        this.nextNodeInstances = nextNodeInstances;\n    }\n\n    public String getExtData() {\n        return extData;\n    }\n\n    public void setExtData(String extData) {\n        this.extData = extData;\n    }\n\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n\n    @Override\n    public String toString() {\n        return \"ProcessNodeExecutionDTO [id=\" + id + \", nodeExecutionNo=\" + nodeExecutionNo + \", nodeInstanceNo=\"\n                + nodeInstanceNo + \", eventId=\" + eventId + \", processDefId=\" + processDefId + \", nodeId=\" + nodeId\n                + \", startTime=\" + startTime + \", endTime=\" + endTime + \", status=\" + status + \", productCode=\"\n                + productCode + \", executor=\" + executor + \", nextNodeInstances=\" + nextNodeInstances + \", extData=\"\n                + extData + \", createdDate=\" + createdDate + \", modifiedDate=\" + modifiedDate + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/instance/ProcessNodeInstanceDTO.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.instance;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessNodeInstanceDTO implements Serializable {\n\n    private String nodeInstanceNo;\n\n    private String processInstanceNo;\n\n    private String processDefId;\n\n    private String nodeId;\n\n    private Date startTime;\n\n    private Date endTime;\n\n    private String status;\n\n    private String productCode;\n\n    private String executors;\n\n    private String previousNodeInstances;\n\n    private String nextNodeInstances;\n\n    private String vars;\n\n    private String extData;\n    \n    private String nodeName;\n\n    private Date createdDate;\n\n    private Date modifiedDate;\n\n    public String getNodeInstanceNo() {\n        return nodeInstanceNo;\n    }\n\n    public void setNodeInstanceNo(String nodeInstanceNo) {\n        this.nodeInstanceNo = nodeInstanceNo;\n    }\n\n    public String getProcessInstanceNo() {\n        return processInstanceNo;\n    }\n\n    public void setProcessInstanceNo(String processInstanceNo) {\n        this.processInstanceNo = processInstanceNo;\n    }\n\n    public String getProcessDefId() {\n        return processDefId;\n    }\n\n    public void setProcessDefId(String processDefId) {\n        this.processDefId = processDefId;\n    }\n\n    public String getNodeId() {\n        return nodeId;\n    }\n\n    public void setNodeId(String nodeId) {\n        this.nodeId = nodeId;\n    }\n\n    public Date getStartTime() {\n        return startTime;\n    }\n\n    public void setStartTime(Date startTime) {\n        this.startTime = startTime;\n    }\n\n    public Date getEndTime() {\n        return endTime;\n    }\n\n    public void setEndTime(Date endTime) {\n        this.endTime = endTime;\n    }\n\n    public String getStatus() {\n        return status;\n    }\n\n    public void setStatus(String status) {\n        this.status = status;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n\n    public String getExecutors() {\n        return executors;\n    }\n\n    public void setExecutors(String executors) {\n        this.executors = executors;\n    }\n\n    public String getPreviousNodeInstances() {\n        return previousNodeInstances;\n    }\n\n    public void setPreviousNodeInstances(String previousNodeInstances) {\n        this.previousNodeInstances = previousNodeInstances;\n    }\n\n    public String getNextNodeInstances() {\n        return nextNodeInstances;\n    }\n\n    public void setNextNodeInstances(String nextNodeInstances) {\n        this.nextNodeInstances = nextNodeInstances;\n    }\n\n    public String getVars() {\n        return vars;\n    }\n\n    public void setVars(String vars) {\n        this.vars = vars;\n    }\n\n    public String getExtData() {\n        return extData;\n    }\n\n    public void setExtData(String extData) {\n        this.extData = extData;\n    }\n\n    public String getNodeName() {\n        return nodeName;\n    }\n\n    public void setNodeName(String nodeName) {\n        this.nodeName = nodeName;\n    }\n\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n\n    @Override\n    public String toString() {\n        return \"ProcessNodeInstanceDTO [nodeInstanceNo=\" + nodeInstanceNo + \", processInstanceNo=\" + processInstanceNo\n                + \", processDefId=\" + processDefId + \", nodeId=\" + nodeId + \", startTime=\" + startTime + \", endTime=\"\n                + endTime + \", status=\" + status + \", productCode=\" + productCode + \", executors=\" + executors\n                + \", previousNodeInstances=\" + previousNodeInstances + \", nextNodeInstances=\" + nextNodeInstances\n                + \", vars=\" + vars + \", extData=\" + extData + \", nodeName=\" + nodeName + \", createdDate=\" + createdDate\n                + \", modifiedDate=\" + modifiedDate + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/instance/QueryOpenNodeInstanceReq.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.instance;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n *\n */\npublic class QueryOpenNodeInstanceReq implements Serializable {\n\n    private String instanceNo;\n\n    private String nodeId;\n    \n    public QueryOpenNodeInstanceReq() {\n        \n    }\n    \n    public QueryOpenNodeInstanceReq(String instanceNo, String nodeId) {\n        this.instanceNo = instanceNo;\n        this.nodeId = nodeId;\n    }\n\n    public String getInstanceNo() {\n        return instanceNo;\n    }\n\n    public void setInstanceNo(String instanceNo) {\n        this.instanceNo = instanceNo;\n    }\n\n    public String getNodeId() {\n        return nodeId;\n    }\n\n    public void setNodeId(String nodeId) {\n        this.nodeId = nodeId;\n    }\n\n    @Override\n    public String toString() {\n        return \"QueryOpenNodeInstanceReq [instanceNo=\" + instanceNo + \", nodeId=\" + nodeId + \"]\";\n    }\n    \n\n    public static QueryOpenNodeInstanceReq.QueryOpenNodeInstanceReqBuilder builder() {\n        return new QueryOpenNodeInstanceReq.QueryOpenNodeInstanceReqBuilder();\n    }\n    \n\n    public static class QueryOpenNodeInstanceReqBuilder {\n        private String instanceNo;\n        private String nodeId;\n\n        public QueryOpenNodeInstanceReq.QueryOpenNodeInstanceReqBuilder instanceNo(String instanceNo) {\n            this.instanceNo = instanceNo;\n            return this;\n        }\n\n        public QueryOpenNodeInstanceReq.QueryOpenNodeInstanceReqBuilder nodeId(String nodeId) {\n            this.nodeId = nodeId;\n            return this;\n        }\n\n        public QueryOpenNodeInstanceReq build() {\n            return new QueryOpenNodeInstanceReq(this.instanceNo, this.nodeId);\n        }\n\n        public String toString() {\n            return \"QueryOpenNodeInstanceReq.QueryOpenNodeInstanceReqBuilder(instanceNo=\" + this.instanceNo\n                    + \", nodeId=\" + this.nodeId + \")\";\n        }\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/instance/QueryProcessInstanceReq.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.instance;\n\nimport java.io.Serializable;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class QueryProcessInstanceReq implements Serializable {\n    \n    public QueryProcessInstanceReq() {\n        \n    }\n    \n    public QueryProcessInstanceReq(String processType, String bizNo) {\n        this.processType = processType;\n        this.bizNo = bizNo;\n        \n    }\n\n    private String processType;\n    \n    private String bizNo;\n\n    public String getProcessType() {\n        return processType;\n    }\n\n    public void setProcessType(String processType) {\n        this.processType = processType;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    @Override\n    public String toString() {\n        return \"QueryProcessInstanceReq [processType=\" + processType + \", bizNo=\" + bizNo + \"]\";\n    }\n    \n    public static QueryProcessInstanceReq.QueryProcessInstanceReqBuilder builder() {\n        return new QueryProcessInstanceReq.QueryProcessInstanceReqBuilder();\n    }\n    \n\n    public static class QueryProcessInstanceReqBuilder {\n        private String processType;\n        private String bizNo;\n\n        public QueryProcessInstanceReq.QueryProcessInstanceReqBuilder processType(String processType) {\n            this.processType = processType;\n            return this;\n        }\n\n        public QueryProcessInstanceReq.QueryProcessInstanceReqBuilder bizNo(String bizNo) {\n            this.bizNo = bizNo;\n            return this;\n        }\n\n        public QueryProcessInstanceReq build() {\n            return new QueryProcessInstanceReq(this.processType, this.bizNo);\n        }\n\n        public String toString() {\n            return \"QueryProcessInstanceReq.QueryProcessInstanceReqBuilder(processType=\" + this.processType + \", bizNo=\"\n                    + this.bizNo + \")\";\n        }\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/instance/QueryProcessNodeReqDTO.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.instance;\n\nimport java.io.Serializable;\nimport java.util.Set;\n\n/**\n * @author liyuliang5\n *\n */\npublic class QueryProcessNodeReqDTO implements Serializable {\n\n    private String processInstanceNo;\n\n    private String nodeId;\n\n    private Set<String> status;\n    \n    public QueryProcessNodeReqDTO() {\n        \n    }\n    \n    public QueryProcessNodeReqDTO(String processInstanceNo, String nodeId, Set<String> status) {\n        this.processInstanceNo = processInstanceNo;\n        this.nodeId = nodeId;\n        this.status = status;\n    }\n\n    public static QueryProcessNodeReqDTO.QueryProcessNodeReqDTOBuilder builder() {\n        return new QueryProcessNodeReqDTO.QueryProcessNodeReqDTOBuilder();\n    }\n\n    public String getProcessInstanceNo() {\n        return processInstanceNo;\n    }\n\n    public void setProcessInstanceNo(String processInstanceNo) {\n        this.processInstanceNo = processInstanceNo;\n    }\n\n    public String getNodeId() {\n        return nodeId;\n    }\n\n    public void setNodeId(String nodeId) {\n        this.nodeId = nodeId;\n    }\n\n    public Set<String> getStatus() {\n        return status;\n    }\n\n    public void setStatus(Set<String> status) {\n        this.status = status;\n    }\n\n    @Override\n    public String toString() {\n        return \"QueryProcessNodeReqDTO [processInstanceNo=\" + processInstanceNo + \", nodeId=\" + nodeId + \", status=\"\n                + status + \"]\";\n    }\n    \n\n    public static class QueryProcessNodeReqDTOBuilder {\n        private String processInstanceNo;\n        private String nodeId;\n        private Set<String> status;\n\n        public QueryProcessNodeReqDTO.QueryProcessNodeReqDTOBuilder processInstanceNo(String processInstanceNo) {\n            this.processInstanceNo = processInstanceNo;\n            return this;\n        }\n\n        public QueryProcessNodeReqDTO.QueryProcessNodeReqDTOBuilder nodeId(String nodeId) {\n            this.nodeId = nodeId;\n            return this;\n        }\n\n        public QueryProcessNodeReqDTO.QueryProcessNodeReqDTOBuilder status(Set<String> status) {\n            this.status = status;\n            return this;\n        }\n\n        public QueryProcessNodeReqDTO build() {\n            return new QueryProcessNodeReqDTO(this.processInstanceNo, this.nodeId, this.status);\n        }\n\n        public String toString() {\n            return \"QueryProcessNodeReqDTO.QueryProcessNodeReqDTOBuilder(processInstanceNo=\" + this.processInstanceNo\n                    + \", nodeId=\" + this.nodeId + \", status=\" + this.status + \")\";\n        }\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/instance/RollbackNodeReq.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.instance;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n */\npublic class RollbackNodeReq implements Serializable {\n\n    private String processInstanceNo;\n    \n    private String targetNodeId;\n    \n    private String targetNodeInstanceNo;\n    \n    private boolean rollbackSubProcess = true;\n    \n    private boolean rollbackTask = true;\n\n    public String getProcessInstanceNo() {\n        return processInstanceNo;\n    }\n\n    public void setProcessInstanceNo(String processInstanceNo) {\n        this.processInstanceNo = processInstanceNo;\n    }\n\n    public String getTargetNodeInstanceNo() {\n        return targetNodeInstanceNo;\n    }\n\n    public void setTargetNodeInstanceNo(String targetNodeInstanceNo) {\n        this.targetNodeInstanceNo = targetNodeInstanceNo;\n    }\n\n    public String getTargetNodeId() {\n        return targetNodeId;\n    }\n\n    public void setTargetNodeId(String targetNodeId) {\n        this.targetNodeId = targetNodeId;\n    }\n\n    public boolean isRollbackSubProcess() {\n        return rollbackSubProcess;\n    }\n\n    public void setRollbackSubProcess(boolean rollbackSubProcess) {\n        this.rollbackSubProcess = rollbackSubProcess;\n    }\n\n    public boolean isRollbackTask() {\n        return rollbackTask;\n    }\n\n    public void setRollbackTask(boolean rollbackTask) {\n        this.rollbackTask = rollbackTask;\n    }\n    \n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/instance/RollbackNodeRes.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.instance;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n */\npublic class RollbackNodeRes implements Serializable {\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/instance/StdProcessContextDTO.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.instance;\n\nimport java.io.Serializable;\nimport java.util.Map;\n\n/**\n * @author liyuliang5\n *\n */\npublic class StdProcessContextDTO implements Serializable {\n    \n    private Map<String, Object> processProperties;\n    \n    private StdProcessDTO process;\n\n    public Map<String, Object> getProcessProperties() {\n        return processProperties;\n    }\n\n    public void setProcessProperties(Map<String, Object> processProperties) {\n        this.processProperties = processProperties;\n    }\n\n    public StdProcessDTO getProcess() {\n        return process;\n    }\n\n    public void setProcess(StdProcessDTO process) {\n        this.process = process;\n    }\n\n    @Override\n    public String toString() {\n        return \"StdProcessContextDTO [processProperties=\" + processProperties + \", process=\" + process + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/instance/StdProcessDTO.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.instance;\n\nimport java.io.Serializable;\nimport java.util.Map;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class StdProcessDTO implements Serializable {\n\n    private Map<String, Object> processProperties;\n    \n    private Map<String, Object> extProperties;\n\n    public Map<String, Object> getProcessProperties() {\n        return processProperties;\n    }\n\n    public void setProcessProperties(Map<String, Object> processProperties) {\n        this.processProperties = processProperties;\n    }\n\n    public Map<String, Object> getExtProperties() {\n        return extProperties;\n    }\n\n    public void setExtProperties(Map<String, Object> extProperties) {\n        this.extProperties = extProperties;\n    }\n\n    @Override\n    public String toString() {\n        return \"StdProcessDTO [processProperties=\" + processProperties + \", extProperties=\" + extProperties + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/instance/UnlockProcessInstanceReq.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.instance;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n *\n */\npublic class UnlockProcessInstanceReq implements Serializable {\n\n    String processType;\n    \n    String bizNo;\n    \n    String lockRequestId;\n\n    public String getProcessType() {\n        return processType;\n    }\n\n    public void setProcessType(String processType) {\n        this.processType = processType;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    public String getLockRequestId() {\n        return lockRequestId;\n    }\n\n    public void setLockRequestId(String lockRequestId) {\n        this.lockRequestId = lockRequestId;\n    }\n\n    @Override\n    public String toString() {\n        return \"UnlockProcessInstanceReq [processType=\" + processType + \", bizNo=\" + bizNo + \", lockRequestId=\"\n                + lockRequestId + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/schedule/ScheduleProcessReq.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.schedule;\n\nimport java.io.Serializable;\nimport java.util.Arrays;\nimport java.util.Map;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ScheduleProcessReq implements Serializable {\n\n    private String processId;\n\n    private String[] nodeIds;\n\n    private Object param;\n\n    private Map<String, Object> dataMap;\n\n    public String getProcessId() {\n        return processId;\n    }\n\n    public void setProcessId(String processId) {\n        this.processId = processId;\n    }\n\n    public String[] getNodeIds() {\n        return nodeIds;\n    }\n\n    public void setNodeIds(String[] nodeIds) {\n        this.nodeIds = nodeIds;\n    }\n\n    public Object getParam() {\n        return param;\n    }\n\n    public void setParam(Object param) {\n        this.param = param;\n    }\n\n    public Map<String, Object> getDataMap() {\n        return dataMap;\n    }\n\n    public void setDataMap(Map<String, Object> dataMap) {\n        this.dataMap = dataMap;\n    }\n\n    @Override\n    public String toString() {\n        return \"ScheduleProcessReq [processId=\" + processId + \", nodeIds=\" + Arrays.toString(nodeIds) + \", param=\"\n                + param + \", dataMap=\" + dataMap + \"]\";\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/schedule/ScheduleProcessRes.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.schedule;\n\nimport java.io.Serializable;\nimport java.util.Map;\n\n/**\n * @author liyuliang5\n */\npublic class ScheduleProcessRes implements Serializable {\n    \n    private String processInstanceNo;\n    \n    private Object result;\n    \n    private Map<String, Object> dataMap;\n\n    public String getProcessInstanceNo() {\n        return processInstanceNo;\n    }\n\n    public void setProcessInstanceNo(String processInstanceNo) {\n        this.processInstanceNo = processInstanceNo;\n    }\n\n    public Object getResult() {\n        return result;\n    }\n\n    public void setResult(Object result) {\n        this.result = result;\n    }\n\n    public Map<String, Object> getDataMap() {\n        return dataMap;\n    }\n\n    public void setDataMap(Map<String, Object> dataMap) {\n        this.dataMap = dataMap;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/task/CanWithdrawTaskReq.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.task;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n *\n */\npublic class CanWithdrawTaskReq implements Serializable {\n\n    private String taskNo;\n\n    private String user;\n    public String getTaskNo() {\n        return taskNo;\n    }\n    public void setTaskNo(String taskNo) {\n        this.taskNo = taskNo;\n    }\n    public String getUser() {\n        return user;\n    }\n    public void setUser(String user) {\n        this.user = user;\n    }\n    @Override\n    public String toString() {\n        return \"CanWithdrawTaskReq [taskNo=\" + taskNo + \", user=\" + user + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/task/CanWithdrawTaskRes.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.task;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n *\n */\npublic class CanWithdrawTaskRes implements Serializable {\n\n    private boolean canWithDraw;\n    \n    private String reason;\n\n    public boolean isCanWithDraw() {\n        return canWithDraw;\n    }\n\n    public void setCanWithDraw(boolean canWithDraw) {\n        this.canWithDraw = canWithDraw;\n    }\n\n    public String getReason() {\n        return reason;\n    }\n\n    public void setReason(String reason) {\n        this.reason = reason;\n    }\n\n    @Override\n    public String toString() {\n        return \"CanWithdrawTaskRes [canWithDraw=\" + canWithDraw + \", reason=\" + reason + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/task/ExecuteTaskReq.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.task;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ExecuteTaskReq implements Serializable {\n    \n    private String taskNo;\n\n    private String user;\n\n    private List<String> groupList;\n\n    private List<String> group2List;\n\n    private String executeBizResult;\n\n    private String executeBizData;\n\n    private String instanceBizStatus;\n\n    private String instanceBizData;\n\n    List<TaskOperateCmd> cmdList;\n\n    private String operation;\n\n    private String taskExtData;\n    public String getTaskNo() {\n        return taskNo;\n    }\n    public void setTaskNo(String taskNo) {\n        this.taskNo = taskNo;\n    }\n    public String getUser() {\n        return user;\n    }\n    public void setUser(String user) {\n        this.user = user;\n    }\n    public List<String> getGroupList() {\n        return groupList;\n    }\n    public void setGroupList(List<String> groupList) {\n        this.groupList = groupList;\n    }\n    public List<String> getGroup2List() {\n        return group2List;\n    }\n    public void setGroup2List(List<String> group2List) {\n        this.group2List = group2List;\n    }\n    public String getExecuteBizResult() {\n        return executeBizResult;\n    }\n    public void setExecuteBizResult(String executeBizResult) {\n        this.executeBizResult = executeBizResult;\n    }\n    public String getExecuteBizData() {\n        return executeBizData;\n    }\n    public void setExecuteBizData(String executeBizData) {\n        this.executeBizData = executeBizData;\n    }\n    public String getInstanceBizStatus() {\n        return instanceBizStatus;\n    }\n    public void setInstanceBizStatus(String instanceBizStatus) {\n        this.instanceBizStatus = instanceBizStatus;\n    }\n    public String getInstanceBizData() {\n        return instanceBizData;\n    }\n    public void setInstanceBizData(String instanceBizData) {\n        this.instanceBizData = instanceBizData;\n    }\n    public List<TaskOperateCmd> getCmdList() {\n        return cmdList;\n    }\n    public void setCmdList(List<TaskOperateCmd> cmdList) {\n        this.cmdList = cmdList;\n    }\n    public String getOperation() {\n        return operation;\n    }\n    public void setOperation(String operation) {\n        this.operation = operation;\n    }\n    public String getTaskExtData() {\n        return taskExtData;\n    }\n    public void setTaskExtData(String taskExtData) {\n        this.taskExtData = taskExtData;\n    }\n    @Override\n    public String toString() {\n        return \"ExecuteTaskReq [taskNo=\" + taskNo + \", user=\" + user + \", groupList=\" + groupList + \", group2List=\"\n                + group2List + \", executeBizResult=\" + executeBizResult + \", executeBizData=\" + executeBizData\n                + \", instanceBizStatus=\" + instanceBizStatus + \", instanceBizData=\" + instanceBizData + \", cmdList=\"\n                + cmdList + \", operation=\" + operation + \", taskExtData=\" + taskExtData + \"]\";\n    }\n    \n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/task/ExecuteTaskRes.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.task;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ExecuteTaskRes implements Serializable {\n\n    private List<TaskOperateCmdResult> cmdResultList;\n\n    public List<TaskOperateCmdResult> getCmdResultList() {\n        return cmdResultList;\n    }\n\n    public void setCmdResultList(List<TaskOperateCmdResult> cmdResultList) {\n        this.cmdResultList = cmdResultList;\n    }\n\n    @Override\n    public String toString() {\n        return \"ExecuteTaskRes [cmdResultList=\" + cmdResultList + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/task/ProcessTaskAssignDTO.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.task;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessTaskAssignDTO implements Serializable {\n\n\n    private String assignType;\n    \n    private String assignUser;\n\n    private String assignGroup;\n    \n    private String assignGroup2;\n    \n    private String assignNo;\n    \n    private Date assignTime;\n    \n    private Date createdDate;\n    \n    private String extData;\n    \n    private String productCode;\n    \n    private Date modifiedDate;\n    \n    private String status;\n    \n    private String taskNo;\n\n    public String getAssignType() {\n        return assignType;\n    }\n\n    public void setAssignType(String assignType) {\n        this.assignType = assignType;\n    }\n\n    public String getAssignUser() {\n        return assignUser;\n    }\n\n    public void setAssignUser(String assignUser) {\n        this.assignUser = assignUser;\n    }\n\n    public String getAssignGroup() {\n        return assignGroup;\n    }\n\n    public void setAssignGroup(String assignGroup) {\n        this.assignGroup = assignGroup;\n    }\n\n    public String getAssignGroup2() {\n        return assignGroup2;\n    }\n\n    public void setAssignGroup2(String assignGroup2) {\n        this.assignGroup2 = assignGroup2;\n    }\n\n    public String getAssignNo() {\n        return assignNo;\n    }\n\n    public void setAssignNo(String assignNo) {\n        this.assignNo = assignNo;\n    }\n\n    public Date getAssignTime() {\n        return assignTime;\n    }\n\n    public void setAssignTime(Date assignTime) {\n        this.assignTime = assignTime;\n    }\n\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n\n    public String getExtData() {\n        return extData;\n    }\n\n    public void setExtData(String extData) {\n        this.extData = extData;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n\n    public String getStatus() {\n        return status;\n    }\n\n    public void setStatus(String status) {\n        this.status = status;\n    }\n\n    public String getTaskNo() {\n        return taskNo;\n    }\n\n    public void setTaskNo(String taskNo) {\n        this.taskNo = taskNo;\n    }\n\n    @Override\n    public String toString() {\n        return \"ProcessTaskAssignDTO [assignType=\" + assignType + \", assignUser=\" + assignUser + \", assignGroup=\"\n                + assignGroup + \", assignGroup2=\" + assignGroup2 + \", assignNo=\" + assignNo + \", assignTime=\"\n                + assignTime + \", createdDate=\" + createdDate + \", extData=\" + extData + \", productCode=\" + productCode\n                + \", modifiedDate=\" + modifiedDate + \", status=\" + status + \", taskNo=\" + taskNo + \"]\";\n    }\n    \n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/task/ProcessTaskDTO.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.task;\n\nimport java.io.Serializable;\nimport java.util.Date;\nimport java.util.List;\n\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessInstanceDTO;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessTaskDTO implements Serializable {\n    \n    private String taskNo;\n\n    private String processType;\n\n    private String bizNo;\n\n    private String taskBizCode;\n\n    private String taskBizName;\n\n    private String taskType;\n\n    private String processInstanceNo;\n\n    private String nodeInstanceNo;\n\n    private String nodeExecutionNo;\n\n    private Date assignTime;\n\n    private String executor;\n\n    private String executeBizResult;\n\n    private String executeBizData;\n\n    private Date executeTime;\n\n    private String productCode;\n\n    private String creator;\n\n    private String status;\n\n    private String extData;\n\n    private Date createdDate;\n\n    private Date modifiedDate;\n\n    private List<ProcessTaskAssignDTO> assignList;\n    \n    private ProcessInstanceDTO processInstance;\n\n    private String nodeTaskConf;\n    \n    private String assignInfo;\n    \n    private String assignType;\n\n    private String processInstanceKeyField;\n\n    private String processInstanceKeyField2;\n\n    public String getTaskNo() {\n        return taskNo;\n    }\n\n    public void setTaskNo(String taskNo) {\n        this.taskNo = taskNo;\n    }\n\n    public String getProcessType() {\n        return processType;\n    }\n\n    public void setProcessType(String processType) {\n        this.processType = processType;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    public String getTaskBizCode() {\n        return taskBizCode;\n    }\n\n    public void setTaskBizCode(String taskBizCode) {\n        this.taskBizCode = taskBizCode;\n    }\n\n    public String getTaskBizName() {\n        return taskBizName;\n    }\n\n    public void setTaskBizName(String taskBizName) {\n        this.taskBizName = taskBizName;\n    }\n\n    public String getTaskType() {\n        return taskType;\n    }\n\n    public void setTaskType(String taskType) {\n        this.taskType = taskType;\n    }\n\n    public String getProcessInstanceNo() {\n        return processInstanceNo;\n    }\n\n    public void setProcessInstanceNo(String processInstanceNo) {\n        this.processInstanceNo = processInstanceNo;\n    }\n\n    public String getNodeInstanceNo() {\n        return nodeInstanceNo;\n    }\n\n    public void setNodeInstanceNo(String nodeInstanceNo) {\n        this.nodeInstanceNo = nodeInstanceNo;\n    }\n\n    public String getNodeExecutionNo() {\n        return nodeExecutionNo;\n    }\n\n    public void setNodeExecutionNo(String nodeExecutionNo) {\n        this.nodeExecutionNo = nodeExecutionNo;\n    }\n\n    public Date getAssignTime() {\n        return assignTime;\n    }\n\n    public void setAssignTime(Date assignTime) {\n        this.assignTime = assignTime;\n    }\n\n    public String getExecutor() {\n        return executor;\n    }\n\n    public void setExecutor(String executor) {\n        this.executor = executor;\n    }\n\n    public String getExecuteBizResult() {\n        return executeBizResult;\n    }\n\n    public void setExecuteBizResult(String executeBizResult) {\n        this.executeBizResult = executeBizResult;\n    }\n\n    public String getExecuteBizData() {\n        return executeBizData;\n    }\n\n    public void setExecuteBizData(String executeBizData) {\n        this.executeBizData = executeBizData;\n    }\n\n    public Date getExecuteTime() {\n        return executeTime;\n    }\n\n    public void setExecuteTime(Date executeTime) {\n        this.executeTime = executeTime;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n\n    public String getCreator() {\n        return creator;\n    }\n\n    public void setCreator(String creator) {\n        this.creator = creator;\n    }\n\n    public String getStatus() {\n        return status;\n    }\n\n    public void setStatus(String status) {\n        this.status = status;\n    }\n\n    public String getExtData() {\n        return extData;\n    }\n\n    public void setExtData(String extData) {\n        this.extData = extData;\n    }\n\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n\n    public List<ProcessTaskAssignDTO> getAssignList() {\n        return assignList;\n    }\n\n    public void setAssignList(List<ProcessTaskAssignDTO> assignList) {\n        this.assignList = assignList;\n    }\n\n    public ProcessInstanceDTO getProcessInstance() {\n        return processInstance;\n    }\n\n    public void setProcessInstance(ProcessInstanceDTO processInstance) {\n        this.processInstance = processInstance;\n    }\n\n    public String getNodeTaskConf() {\n        return nodeTaskConf;\n    }\n\n    public void setNodeTaskConf(String nodeTaskConf) {\n        this.nodeTaskConf = nodeTaskConf;\n    }\n\n    public String getAssignInfo() {\n        return assignInfo;\n    }\n\n    public void setAssignInfo(String assignInfo) {\n        this.assignInfo = assignInfo;\n    }\n\n    public String getAssignType() {\n        return assignType;\n    }\n\n    public void setAssignType(String assignType) {\n        this.assignType = assignType;\n    }\n\n    public String getProcessInstanceKeyField() {\n        return processInstanceKeyField;\n    }\n\n    public void setProcessInstanceKeyField(String processInstanceKeyField) {\n        this.processInstanceKeyField = processInstanceKeyField;\n    }\n\n    public String getProcessInstanceKeyField2() {\n        return processInstanceKeyField2;\n    }\n\n    public void setProcessInstanceKeyField2(String processInstanceKeyField2) {\n        this.processInstanceKeyField2 = processInstanceKeyField2;\n    }\n\n    @Override\n    public String toString() {\n        return \"ProcessTaskDTO [taskNo=\" + taskNo + \", processType=\" + processType + \", bizNo=\" + bizNo\n                + \", taskBizCode=\" + taskBizCode + \", taskBizName=\" + taskBizName + \", taskType=\" + taskType\n                + \", processInstanceNo=\" + processInstanceNo + \", nodeInstanceNo=\" + nodeInstanceNo\n                + \", nodeExecutionNo=\" + nodeExecutionNo + \", assignTime=\" + assignTime + \", executor=\" + executor\n                + \", executeBizResult=\" + executeBizResult + \", executeBizData=\" + executeBizData + \", executeTime=\"\n                + executeTime + \", productCode=\" + productCode + \", creator=\" + creator + \", status=\" + status\n                + \", extData=\" + extData + \", createdDate=\" + createdDate + \", modifiedDate=\" + modifiedDate\n                + \", assignList=\" + assignList + \", processInstance=\" + processInstance + \", nodeTaskConf=\"\n                + nodeTaskConf + \", assignInfo=\" + assignInfo + \", assignType=\" + assignType\n                + \", processInstanceKeyField=\" + processInstanceKeyField + \", processInstanceKeyField2=\"\n                + processInstanceKeyField2 + \"]\";\n    }\n    \n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/task/ProcessTaskEventDTO.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.task;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessTaskEventDTO implements Serializable {\n\n    private String eventNo;\n\n    private String taskNo;\n\n    private String eventType;\n\n    private String eventUser;\n\n    private Date eventTime;\n\n    private String eventBizResult;\n\n    private String eventBizData;\n    \n    private String instanceBizStatus;\n\n    private String instanceBizData;    \n\n    private String productCode;\n\n    private String extData;\n\n    private Date createdDate;\n\n    private Date modifiedDate;\n\n    public String getEventNo() {\n        return eventNo;\n    }\n\n    public void setEventNo(String eventNo) {\n        this.eventNo = eventNo;\n    }\n\n    public String getTaskNo() {\n        return taskNo;\n    }\n\n    public void setTaskNo(String taskNo) {\n        this.taskNo = taskNo;\n    }\n\n    public String getEventType() {\n        return eventType;\n    }\n\n    public void setEventType(String eventType) {\n        this.eventType = eventType;\n    }\n\n    public String getEventUser() {\n        return eventUser;\n    }\n\n    public void setEventUser(String eventUser) {\n        this.eventUser = eventUser;\n    }\n\n    public Date getEventTime() {\n        return eventTime;\n    }\n\n    public void setEventTime(Date eventTime) {\n        this.eventTime = eventTime;\n    }\n\n    public String getEventBizResult() {\n        return eventBizResult;\n    }\n\n    public void setEventBizResult(String eventBizResult) {\n        this.eventBizResult = eventBizResult;\n    }\n\n    public String getEventBizData() {\n        return eventBizData;\n    }\n\n    public void setEventBizData(String eventBizData) {\n        this.eventBizData = eventBizData;\n    }\n\n    public String getInstanceBizStatus() {\n        return instanceBizStatus;\n    }\n\n    public void setInstanceBizStatus(String instanceBizStatus) {\n        this.instanceBizStatus = instanceBizStatus;\n    }\n\n    public String getInstanceBizData() {\n        return instanceBizData;\n    }\n\n    public void setInstanceBizData(String instanceBizData) {\n        this.instanceBizData = instanceBizData;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n\n    public String getExtData() {\n        return extData;\n    }\n\n    public void setExtData(String extData) {\n        this.extData = extData;\n    }\n\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n\n    @Override\n    public String toString() {\n        return \"ProcessTaskEventDTO [eventNo=\" + eventNo + \", taskNo=\" + taskNo + \", eventType=\" + eventType\n                + \", eventUser=\" + eventUser + \", eventTime=\" + eventTime + \", eventBizResult=\" + eventBizResult\n                + \", eventBizData=\" + eventBizData + \", instanceBizStatus=\" + instanceBizStatus + \", instanceBizData=\"\n                + instanceBizData + \", productCode=\" + productCode + \", extData=\" + extData + \", createdDate=\"\n                + createdDate + \", modifiedDate=\" + modifiedDate + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/task/QueryTaskReq.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.task;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n *\n */\npublic class QueryTaskReq implements Serializable {\n\n    private String processType;\n    \n    private String bizNo;\n    \n    private String processInstanceNo;\n    \n    private String taskBizCode;\n    \n    private String nodeInstanceNo;\n    \n    private String status;\n\n    public String getProcessType() {\n        return processType;\n    }\n\n    public void setProcessType(String processType) {\n        this.processType = processType;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    public String getProcessInstanceNo() {\n        return processInstanceNo;\n    }\n\n    public void setProcessInstanceNo(String processInstanceNo) {\n        this.processInstanceNo = processInstanceNo;\n    }\n\n    public String getTaskBizCode() {\n        return taskBizCode;\n    }\n\n    public void setTaskBizCode(String taskBizCode) {\n        this.taskBizCode = taskBizCode;\n    }\n\n    public String getNodeInstanceNo() {\n        return nodeInstanceNo;\n    }\n\n    public void setNodeInstanceNo(String nodeInstanceNo) {\n        this.nodeInstanceNo = nodeInstanceNo;\n    }\n\n    public String getStatus() {\n        return status;\n    }\n\n    public void setStatus(String status) {\n        this.status = status;\n    }\n\n    @Override\n    public String toString() {\n        return \"QueryTaskReq [processType=\" + processType + \", bizNo=\" + bizNo + \", processInstanceNo=\"\n                + processInstanceNo + \", taskBizCode=\" + taskBizCode + \", nodeInstanceNo=\" + nodeInstanceNo\n                + \", status=\" + status + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/task/TaskOperateCmd.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.task;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n *\n */\npublic class TaskOperateCmd implements Serializable {\n\n    protected String cmdType;\n\n    public String getCmdType() {\n        return cmdType;\n    }\n\n    public void setCmdType(String cmdType) {\n        this.cmdType = cmdType;\n    }\n\n    @Override\n    public String toString() {\n        return \"TaskOperateCmd [cmdType=\" + cmdType + \"]\";\n    }\n    \n    \n       \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/task/TaskOperateCmdResult.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.task;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n *\n */\npublic class TaskOperateCmdResult implements Serializable {\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/task/TaskOperateCommand.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.task;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n *\n */\npublic class TaskOperateCommand implements Serializable {\n\n    protected String commandType;\n\n    public String getCommandType() {\n        return commandType;\n    }\n\n    public void setCommandType(String commandType) {\n        this.commandType = commandType;\n    }\n\n    @Override\n    public String toString() {\n        return \"TaskOperateCommand [commandType=\" + commandType + \"]\";\n    }\n    \n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/task/TaskOperateCommandResult.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.task;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n *\n */\npublic class TaskOperateCommandResult implements Serializable {\n\n    protected String commandType;\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/task/TaskOperationsReq.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.task;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * @author liyuliang5\n *\n */\npublic class TaskOperationsReq implements Serializable {\n    \n    public TaskOperationsReq() {\n        \n    }\n    \n    public TaskOperationsReq(List<TaskOperateCommand> commandList) {\n        this.commandList = commandList;\n    }\n\n    private List<TaskOperateCommand> commandList;\n\n    public List<TaskOperateCommand> getCommandList() {\n        return commandList;\n    }\n\n    public void setCommandList(List<TaskOperateCommand> commandList) {\n        this.commandList = commandList;\n    }\n\n    @Override\n    public String toString() {\n        return \"TaskOperationsReq [commandList=\" + commandList + \"]\";\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/task/TaskOperationsRes.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.task;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * @author liyuliang5\n *\n */\npublic class TaskOperationsRes implements Serializable {\n    \n    public TaskOperationsRes() {\n        \n    }\n    \n    public TaskOperationsRes(List<TaskOperateCommandResult> resultList) {\n        this.resultList = resultList;\n    }\n\n    private List<TaskOperateCommandResult> resultList;\n\n    public List<TaskOperateCommandResult> getResultList() {\n        return resultList;\n    }\n\n    public void setResultList(List<TaskOperateCommandResult> resultList) {\n        this.resultList = resultList;\n    }\n\n    @Override\n    public String toString() {\n        return \"TaskOperationsRes [resultList=\" + resultList + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/task/WithdrawTaskReq.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.task;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n *\n */\npublic class WithdrawTaskReq implements Serializable {\n\n    private String taskNo;\n\n    private String user;\n    \n    private String withdrawInstancePolicy;\n\n    private String instanceBizStatus;\n\n    private String instanceBizData;\n\n    public String getTaskNo() {\n        return taskNo;\n    }\n\n    public void setTaskNo(String taskNo) {\n        this.taskNo = taskNo;\n    }\n\n    public String getUser() {\n        return user;\n    }\n\n    public void setUser(String user) {\n        this.user = user;\n    }\n\n    public String getWithdrawInstancePolicy() {\n        return withdrawInstancePolicy;\n    }\n\n    public void setWithdrawInstancePolicy(String withdrawInstancePolicy) {\n        this.withdrawInstancePolicy = withdrawInstancePolicy;\n    }\n\n    public String getInstanceBizStatus() {\n        return instanceBizStatus;\n    }\n\n    public void setInstanceBizStatus(String instanceBizStatus) {\n        this.instanceBizStatus = instanceBizStatus;\n    }\n\n    public String getInstanceBizData() {\n        return instanceBizData;\n    }\n\n    public void setInstanceBizData(String instanceBizData) {\n        this.instanceBizData = instanceBizData;\n    }\n\n    @Override\n    public String toString() {\n        return \"WithdrawTaskReq [taskNo=\" + taskNo + \", user=\" + user + \", withdrawInstancePolicy=\"\n                + withdrawInstancePolicy + \", instanceBizStatus=\" + instanceBizStatus + \", instanceBizData=\"\n                + instanceBizData + \"]\";\n    }\n    \n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/task/WithdrawTaskRes.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.task;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n *\n */\npublic class WithdrawTaskRes implements Serializable {\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/task/cmd/TaskCreateCmd.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.task.cmd;\n\nimport java.util.Map;\n\nimport com.jd.easyflow.process.adapter.export.constant.ProcessTaskConstants;\nimport com.jd.easyflow.process.adapter.export.dto.task.TaskOperateCmd;\n\n/**\n * @author liyuliang5\n *\n */\npublic class TaskCreateCmd extends TaskOperateCmd {\n    \n    public TaskCreateCmd() {\n        this.cmdType = ProcessTaskConstants.CMD_TYPE_CREATE_TASK;\n    }\n   \n    private Map<String, Object> assignInfo;\n\n    public Map<String, Object> getAssignInfo() {\n        return assignInfo;\n    }\n\n    public void setAssignInfo(Map<String, Object> assignInfo) {\n        this.assignInfo = assignInfo;\n    }\n\n    @Override\n    public String toString() {\n        return \"TaskCreateCmd [assignInfo=\" + assignInfo + \"]\";\n    }\n    \n    \n        \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/task/cmd/TaskExecuteCmd.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.task.cmd;\n\nimport com.jd.easyflow.process.adapter.export.dto.task.TaskOperateCmd;\n\n/**\n * @author liyuliang5\n *\n */\npublic class TaskExecuteCmd extends TaskOperateCmd {\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/task/command/MultipleTaskCreateCommand.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.task.command;\n\nimport java.util.List;\n\nimport com.jd.easyflow.process.adapter.export.constant.ProcessTaskConstants;\nimport com.jd.easyflow.process.adapter.export.dto.task.TaskOperateCommand;\n\n/**\n * @author liyuliang5\n *\n */\npublic class MultipleTaskCreateCommand extends TaskOperateCommand {\n\n    public MultipleTaskCreateCommand() {\n        this.commandType = ProcessTaskConstants.COMMAND_TYPE_CREATE_MULTIPLE_TASK;\n    }\n    \n    private List<TaskCreateCommand> createCommandList;\n    \n    public MultipleTaskCreateCommand(List<TaskCreateCommand> createCommandList) {\n        this();\n        this.createCommandList = createCommandList;\n    }\n\n    public List<TaskCreateCommand> getCreateCommandList() {\n        return createCommandList;\n    }\n\n    public void setCreateCommandList(List<TaskCreateCommand> createCommandList) {\n        this.createCommandList = createCommandList;\n    }\n\n    @Override\n    public String toString() {\n        return \"MultipleTaskCreateCommand [createCommandList=\" + createCommandList + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/task/command/MultipleTaskCreateCommandResult.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.task.command;\n\nimport java.util.List;\n\nimport com.jd.easyflow.process.adapter.export.constant.ProcessTaskConstants;\nimport com.jd.easyflow.process.adapter.export.dto.task.TaskOperateCommandResult;\n\n/**\n * @author liyuliang5\n *\n */\npublic class MultipleTaskCreateCommandResult extends TaskOperateCommandResult {\n\n    public MultipleTaskCreateCommandResult() {\n        this.commandType = ProcessTaskConstants.COMMAND_TYPE_CREATE_MULTIPLE_TASK;\n    }\n    \n    private List<TaskCreateCommandResult> createResultList;\n    \n    public MultipleTaskCreateCommandResult(List<TaskCreateCommandResult> createResultList) {\n        this();\n        this.createResultList = createResultList;\n    }\n\n    public List<TaskCreateCommandResult> getCreateResultList() {\n        return createResultList;\n    }\n\n    public void setCreateResultList(List<TaskCreateCommandResult> createResultList) {\n        this.createResultList = createResultList;\n    }\n\n    @Override\n    public String toString() {\n        return \"MultipleTaskCreateCommandResult [createResultList=\" + createResultList + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/task/command/TaskCreateCommand.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.task.command;\n\nimport java.util.Map;\n\nimport com.jd.easyflow.process.adapter.export.constant.ProcessTaskConstants;\nimport com.jd.easyflow.process.adapter.export.dto.task.TaskOperateCommand;\n\n/**\n * @author liyuliang5\n *\n */\npublic class TaskCreateCommand extends TaskOperateCommand {\n    \n    public TaskCreateCommand() {\n        this.commandType = ProcessTaskConstants.COMMAND_TYPE_CREATE_TASK;\n    }\n\n    private String processType;\n    \n    private String bizNo;\n    \n    private String taskType;\n    \n    private String taskBizCode;\n    \n    private String taskBizName;\n    \n    private String processInstanceNo;\n    \n    private String nodeInstanceNo;\n    \n    private String assignType;\n    \n    private Map<String, Object> assignInfo;\n    \n    private String creator;\n    \n    private String productCode;\n    \n    private Object extData;\n\n    public String getProcessType() {\n        return processType;\n    }\n\n    public void setProcessType(String processType) {\n        this.processType = processType;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    public String getTaskType() {\n        return taskType;\n    }\n\n    public void setTaskType(String taskType) {\n        this.taskType = taskType;\n    }\n\n    public String getTaskBizCode() {\n        return taskBizCode;\n    }\n\n    public void setTaskBizCode(String taskBizCode) {\n        this.taskBizCode = taskBizCode;\n    }\n\n    public String getTaskBizName() {\n        return taskBizName;\n    }\n\n    public void setTaskBizName(String taskBizName) {\n        this.taskBizName = taskBizName;\n    }\n\n    public String getProcessInstanceNo() {\n        return processInstanceNo;\n    }\n\n    public void setProcessInstanceNo(String processInstanceNo) {\n        this.processInstanceNo = processInstanceNo;\n    }\n\n    public String getNodeInstanceNo() {\n        return nodeInstanceNo;\n    }\n\n    public void setNodeInstanceNo(String nodeInstanceNo) {\n        this.nodeInstanceNo = nodeInstanceNo;\n    }\n\n    public String getAssignType() {\n        return assignType;\n    }\n\n    public void setAssignType(String assignType) {\n        this.assignType = assignType;\n    }\n\n    public Map<String, Object> getAssignInfo() {\n        return assignInfo;\n    }\n\n    public void setAssignInfo(Map<String, Object> assignInfo) {\n        this.assignInfo = assignInfo;\n    }\n\n    public String getCreator() {\n        return creator;\n    }\n\n    public void setCreator(String creator) {\n        this.creator = creator;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n\n    public Object getExtData() {\n        return extData;\n    }\n\n    public void setExtData(Object extData) {\n        this.extData = extData;\n    }\n\n    @Override\n    public String toString() {\n        return \"TaskCreateCommand [processType=\" + processType + \", bizNo=\" + bizNo + \", taskType=\" + taskType\n                + \", taskBizCode=\" + taskBizCode + \", taskBizName=\" + taskBizName + \", processInstanceNo=\"\n                + processInstanceNo + \", nodeInstanceNo=\" + nodeInstanceNo + \", assignType=\" + assignType\n                + \", assignInfo=\" + assignInfo + \", creator=\" + creator + \", productCode=\" + productCode + \", extData=\"\n                + extData + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/task/command/TaskCreateCommandResult.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.task.command;\n\nimport com.jd.easyflow.process.adapter.export.constant.ProcessTaskConstants;\nimport com.jd.easyflow.process.adapter.export.dto.task.TaskOperateCommandResult;\n\n/**\n * @author liyuliang5\n *\n */\npublic class TaskCreateCommandResult extends TaskOperateCommandResult {\n    \n    public TaskCreateCommandResult() {\n        this.commandType = ProcessTaskConstants.COMMAND_TYPE_CREATE_TASK;\n    }\n\n    private String taskNo;\n\n    public String getTaskNo() {\n        return taskNo;\n    }\n\n    public void setTaskNo(String taskNo) {\n        this.taskNo = taskNo;\n    }\n\n    @Override\n    public String toString() {\n        return \"TaskCreateCommandResult [taskNo=\" + taskNo + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/task/command/TaskExecuteCommand.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.task.command;\n\nimport java.util.List;\n\nimport com.jd.easyflow.process.adapter.export.constant.ProcessTaskConstants;\nimport com.jd.easyflow.process.adapter.export.dto.task.TaskOperateCommand;\n\n/**\n * @author liyuliang5\n *\n */\npublic class TaskExecuteCommand extends TaskOperateCommand {\n    \n    public TaskExecuteCommand() {\n        this.commandType = ProcessTaskConstants.COMMAND_TYPE_EXECUTE_TASK;\n    }\n    \n    private String taskNo;\n    \n    private List<String> groupList;\n    \n    private List<String> group2List;\n    \n    private String executor;\n    \n    private String executeBizResult;\n    \n    private String executeBizData;\n    \n    private String instanceBizData;\n    \n    private String instanceBizStatus;\n    \n    private List<TaskOperateCommand> subCommandList;\n    \n    private String operation;\n    \n    private String taskExtData;\n\n    public String getTaskNo() {\n        return taskNo;\n    }\n\n    public void setTaskNo(String taskNo) {\n        this.taskNo = taskNo;\n    }\n\n    public List<String> getGroupList() {\n        return groupList;\n    }\n\n    public void setGroupList(List<String> groupList) {\n        this.groupList = groupList;\n    }\n\n    public List<String> getGroup2List() {\n        return group2List;\n    }\n\n    public void setGroup2List(List<String> group2List) {\n        this.group2List = group2List;\n    }\n\n    public String getExecutor() {\n        return executor;\n    }\n\n    public void setExecutor(String executor) {\n        this.executor = executor;\n    }\n\n    public String getExecuteBizResult() {\n        return executeBizResult;\n    }\n\n    public void setExecuteBizResult(String executeBizResult) {\n        this.executeBizResult = executeBizResult;\n    }\n\n    public String getExecuteBizData() {\n        return executeBizData;\n    }\n\n    public void setExecuteBizData(String executeBizData) {\n        this.executeBizData = executeBizData;\n    }\n\n    public String getInstanceBizData() {\n        return instanceBizData;\n    }\n\n    public void setInstanceBizData(String instanceBizData) {\n        this.instanceBizData = instanceBizData;\n    }\n\n    public String getInstanceBizStatus() {\n        return instanceBizStatus;\n    }\n\n    public void setInstanceBizStatus(String instanceBizStatus) {\n        this.instanceBizStatus = instanceBizStatus;\n    }\n\n    public List<TaskOperateCommand> getSubCommandList() {\n        return subCommandList;\n    }\n\n    public void setSubCommandList(List<TaskOperateCommand> subCommandList) {\n        this.subCommandList = subCommandList;\n    }\n\n    public String getOperation() {\n        return operation;\n    }\n\n    public void setOperation(String operation) {\n        this.operation = operation;\n    }\n\n    public String getTaskExtData() {\n        return taskExtData;\n    }\n\n    public void setTaskExtData(String taskExtData) {\n        this.taskExtData = taskExtData;\n    }\n\n    @Override\n    public String toString() {\n        return \"TaskExecuteCommand [taskNo=\" + taskNo + \", groupList=\" + groupList + \", group2List=\" + group2List\n                + \", executor=\" + executor + \", executeBizResult=\" + executeBizResult + \", executeBizData=\"\n                + executeBizData + \", instanceBizData=\" + instanceBizData + \", instanceBizStatus=\" + instanceBizStatus\n                + \", subCommandList=\" + subCommandList + \", operation=\" + operation + \", taskExtData=\" + taskExtData\n                + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/task/command/TaskExecuteCommandResult.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.task.command;\n\nimport java.util.List;\n\nimport com.jd.easyflow.process.adapter.export.constant.ProcessTaskConstants;\nimport com.jd.easyflow.process.adapter.export.dto.task.TaskOperateCommandResult;\n\n/**\n * @author liyuliang5\n *\n */\npublic class TaskExecuteCommandResult extends TaskOperateCommandResult {\n    \n    public TaskExecuteCommandResult() {\n        this.commandType = ProcessTaskConstants.COMMAND_TYPE_EXECUTE_TASK;\n    }\n\n    private List<TaskOperateCommandResult> subResultList;\n\n    public List<TaskOperateCommandResult> getSubResultList() {\n        return subResultList;\n    }\n\n    public void setSubResultList(List<TaskOperateCommandResult> subResultList) {\n        this.subResultList = subResultList;\n    }\n\n    @Override\n    public String toString() {\n        return \"TaskExecuteCommandResult [subResultList=\" + subResultList + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/transaction/BatchObjectIdReq.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.transaction;\n\nimport java.io.Serializable;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class BatchObjectIdReq implements Serializable {\n\n    private String type;\n\n    private int num;\n\n    public String getType() {\n        return type;\n    }\n\n    public void setType(String type) {\n        this.type = type;\n    }\n\n    public int getNum() {\n        return num;\n    }\n\n    public void setNum(int num) {\n        this.num = num;\n    }\n\n    @Override\n    public String toString() {\n        return \"BatchObjectIdReq [type=\" + type + \", num=\" + num + \"]\";\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/transaction/BatchObjectIdRes.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.transaction;\n\nimport java.io.Serializable;\nimport java.util.Arrays;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class BatchObjectIdRes implements Serializable {\n\n    String[] ids;\n\n    public String[] getIds() {\n        return ids;\n    }\n\n    public void setIds(String[] ids) {\n        this.ids = ids;\n    }\n\n    @Override\n    public String toString() {\n        return \"BatchObjectIdRes [ids=\" + Arrays.toString(ids) + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/transaction/TxnCommand.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.transaction;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n *\n */\npublic class TxnCommand implements Serializable {\n\n    protected String commandType;\n\n    public String getCommandType() {\n        return commandType;\n    }\n\n    public void setCommandType(String commandType) {\n        this.commandType = commandType;\n    }\n\n    @Override\n    public String toString() {\n        return \"TxnCommand [commandType=\" + commandType + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/transaction/TxnCommandResult.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.transaction;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n *\n */\npublic class TxnCommandResult implements Serializable {\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/transaction/TxnReq.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.transaction;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * @author liyuliang5\n *\n */\npublic class TxnReq implements Serializable {\n\n    private List<TxnCommand> commandList;\n\n    public List<TxnCommand> getCommandList() {\n        return commandList;\n    }\n\n    public void setCommandList(List<TxnCommand> commandList) {\n        this.commandList = commandList;\n    }\n\n    @Override\n    public String toString() {\n        return \"TxnReq [commandList=\" + commandList + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/transaction/TxnRes.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.transaction;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * @author liyuliang5\n *\n */\npublic class TxnRes implements Serializable {\n\n    private List<TxnCommandResult> resultList;\n\n    public List<TxnCommandResult> getResultList() {\n        return resultList;\n    }\n\n    public void setResultList(List<TxnCommandResult> resultList) {\n        this.resultList = resultList;\n    }\n\n    @Override\n    public String toString() {\n        return \"TxnRes [resultList=\" + resultList + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/transaction/command/BatchUpdateTxnCommand.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.transaction.command;\n\nimport java.util.List;\n\nimport com.jd.easyflow.process.adapter.export.constant.ProcessTransactionConstants;\nimport com.jd.easyflow.process.adapter.export.dto.instance.StdProcessContextDTO;\nimport com.jd.easyflow.process.adapter.export.dto.transaction.TxnCommand;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class BatchUpdateTxnCommand extends TxnCommand {\n\n    private List<Object> objects;\n\n    private StdProcessContextDTO processContext;\n\n    public BatchUpdateTxnCommand() {\n        this.commandType = ProcessTransactionConstants.TXN_COMMAND_BATCH_UPDATE;\n    }\n\n    public List<Object> getObjects() {\n        return objects;\n    }\n\n    public void setObjects(List<Object> objects) {\n        this.objects = objects;\n    }\n\n    public StdProcessContextDTO getProcessContext() {\n        return processContext;\n    }\n\n    public void setProcessContext(StdProcessContextDTO processContext) {\n        this.processContext = processContext;\n    }\n\n    @Override\n    public String toString() {\n        return \"BatchUpdateTxnCommand [objects=\" + objects + \", processContext=\" + processContext + \"]\";\n    }\n    \n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/transaction/command/BatchUpdateTxnCommandResult.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.transaction.command;\n\nimport com.jd.easyflow.process.adapter.export.dto.transaction.TxnCommandResult;\n\n/**\n * @author liyuliang5\n *\n */\npublic class BatchUpdateTxnCommandResult extends TxnCommandResult {\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/transaction/command/InterruptTxnCommand.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.transaction.command;\n\nimport java.util.Date;\n\nimport com.jd.easyflow.process.adapter.export.constant.ProcessTransactionConstants;\nimport com.jd.easyflow.process.adapter.export.dto.instance.StdProcessContextDTO;\nimport com.jd.easyflow.process.adapter.export.dto.transaction.TxnCommand;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class InterruptTxnCommand extends TxnCommand {\n    \n    private String processInstanceNo;\n    \n    private StdProcessContextDTO processContext;\n    \n    private String interruptUser;\n    \n    private Date interruptTime;\n\n    public InterruptTxnCommand() {\n        this.commandType = ProcessTransactionConstants.TXN_COMMAND_INTERRUPT;\n    }\n\n    public String getProcessInstanceNo() {\n        return processInstanceNo;\n    }\n\n    public void setProcessInstanceNo(String processInstanceNo) {\n        this.processInstanceNo = processInstanceNo;\n    }\n\n    public StdProcessContextDTO getProcessContext() {\n        return processContext;\n    }\n\n    public void setProcessContext(StdProcessContextDTO processContext) {\n        this.processContext = processContext;\n    }\n\n    public String getInterruptUser() {\n        return interruptUser;\n    }\n\n    public void setInterruptUser(String interruptUser) {\n        this.interruptUser = interruptUser;\n    }\n\n    public Date getInterruptTime() {\n        return interruptTime;\n    }\n\n    public void setInterruptTime(Date interruptTime) {\n        this.interruptTime = interruptTime;\n    }\n\n    @Override\n    public String toString() {\n        return \"InterruptTxnCommand [processInstanceNo=\" + processInstanceNo + \", processContext=\" + processContext\n                + \", interruptUser=\" + interruptUser + \", interruptTime=\" + interruptTime + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/dto/transaction/command/InterruptTxnCommandResult.java",
    "content": "package com.jd.easyflow.process.adapter.export.dto.transaction.command;\n\nimport com.jd.easyflow.process.adapter.export.dto.transaction.TxnCommandResult;\n\n/**\n * @author liyuliang5\n *\n */\npublic class InterruptTxnCommandResult extends TxnCommandResult {\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/export/enums/ProcessExportResponseCode.java",
    "content": "package com.jd.easyflow.process.adapter.export.enums;\n\n/**\n * @author liyuliang5\n *\n */\npublic enum ProcessExportResponseCode {\n\n    PROCESS_INSTANCE_EXISTS(\"0100001\",\"Process instance exists\");\n\n    private String code;\n\n    private String desc;\n\n    ProcessExportResponseCode(String code, String desc) {\n        this.code = code;\n        this.desc = desc;\n    }\n\n    public String getCode() {\n        return code;\n    }\n\n    public String getDesc() {\n        return desc;\n    }\n\n}\n\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/message/ProcessInstanceStatusMessage.java",
    "content": "package com.jd.easyflow.process.adapter.message;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\nimport com.jd.easyflow.common.adapter.message.BaseMessage;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessInstanceStatusMessage extends BaseMessage implements Serializable {\n\n    private String instanceNo;\n    \n    private String instanceName;\n\n    private String processType;\n\n    private String bizNo;\n\n    private String productCode;\n\n    private String creator;\n\n    private String processDefId;\n\n    private Date startTime;\n\n    private Date endTime;\n\n    private String status;\n    \n    private String currentNodeIds;\n    \n    private String parentInstanceNo;\n\n    private String parentNodeInstanceNo;\n    \n    private String bizStatus;\n    \n    private String bizData;\n\n    private String vars;\n\n    private String extData;\n\n    private Date createdDate;\n\n    private Date modifiedDate;\n\n    public String getInstanceNo() {\n        return instanceNo;\n    }\n\n    public void setInstanceNo(String instanceNo) {\n        this.instanceNo = instanceNo;\n    }\n\n    public String getInstanceName() {\n        return instanceName;\n    }\n\n    public void setInstanceName(String instanceName) {\n        this.instanceName = instanceName;\n    }\n\n    public String getProcessType() {\n        return processType;\n    }\n\n    public void setProcessType(String processType) {\n        this.processType = processType;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n\n    public String getCreator() {\n        return creator;\n    }\n\n    public void setCreator(String creator) {\n        this.creator = creator;\n    }\n\n    public String getProcessDefId() {\n        return processDefId;\n    }\n\n    public void setProcessDefId(String processDefId) {\n        this.processDefId = processDefId;\n    }\n\n    public Date getStartTime() {\n        return startTime;\n    }\n\n    public void setStartTime(Date startTime) {\n        this.startTime = startTime;\n    }\n\n    public Date getEndTime() {\n        return endTime;\n    }\n\n    public void setEndTime(Date endTime) {\n        this.endTime = endTime;\n    }\n\n    public String getStatus() {\n        return status;\n    }\n\n    public void setStatus(String status) {\n        this.status = status;\n    }\n\n    public String getCurrentNodeIds() {\n        return currentNodeIds;\n    }\n\n    public void setCurrentNodeIds(String currentNodeIds) {\n        this.currentNodeIds = currentNodeIds;\n    }\n\n    public String getParentInstanceNo() {\n        return parentInstanceNo;\n    }\n\n    public void setParentInstanceNo(String parentInstanceNo) {\n        this.parentInstanceNo = parentInstanceNo;\n    }\n\n    public String getParentNodeInstanceNo() {\n        return parentNodeInstanceNo;\n    }\n\n    public void setParentNodeInstanceNo(String parentNodeInstanceNo) {\n        this.parentNodeInstanceNo = parentNodeInstanceNo;\n    }\n\n    public String getBizStatus() {\n        return bizStatus;\n    }\n\n    public void setBizStatus(String bizStatus) {\n        this.bizStatus = bizStatus;\n    }\n\n    public String getBizData() {\n        return bizData;\n    }\n\n    public void setBizData(String bizData) {\n        this.bizData = bizData;\n    }\n\n    public String getVars() {\n        return vars;\n    }\n\n    public void setVars(String vars) {\n        this.vars = vars;\n    }\n\n    public String getExtData() {\n        return extData;\n    }\n\n    public void setExtData(String extData) {\n        this.extData = extData;\n    }\n\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n\n    @Override\n    public String toString() {\n        return \"ProcessInstanceStatusMessage [instanceNo=\" + instanceNo + \", instanceName=\" + instanceName\n                + \", processType=\" + processType + \", bizNo=\" + bizNo + \", productCode=\" + productCode + \", creator=\"\n                + creator + \", processDefId=\" + processDefId + \", startTime=\" + startTime + \", endTime=\" + endTime\n                + \", status=\" + status + \", currentNodeIds=\" + currentNodeIds + \", parentInstanceNo=\" + parentInstanceNo\n                + \", parentNodeInstanceNo=\" + parentNodeInstanceNo + \", bizStatus=\" + bizStatus + \", bizData=\" + bizData\n                + \", vars=\" + vars + \", extData=\" + extData + \", createdDate=\" + createdDate + \", modifiedDate=\"\n                + modifiedDate + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/message/ProcessNodeInstanceStatusMessage.java",
    "content": "package com.jd.easyflow.process.adapter.message;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\nimport com.jd.easyflow.common.adapter.message.BaseMessage;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessNodeInstanceStatusMessage extends BaseMessage implements Serializable {\n    \n\n    private String nodeInstanceNo;\n\n    private String processInstanceNo;\n\n    private String processDefId;\n\n    private String nodeId;\n\n    private Date startTime;\n\n    private Date endTime;\n\n    private String status;\n\n    private String productCode;\n\n    private String executors;\n\n    private String previousNodeInstances;\n\n    private String nextNodeInstances;\n\n    private String vars;\n\n    private String extData;\n    \n    private Date createdDate;\n\n    private Date modifiedDate;\n\n    public String getNodeInstanceNo() {\n        return nodeInstanceNo;\n    }\n\n    public void setNodeInstanceNo(String nodeInstanceNo) {\n        this.nodeInstanceNo = nodeInstanceNo;\n    }\n\n    public String getProcessInstanceNo() {\n        return processInstanceNo;\n    }\n\n    public void setProcessInstanceNo(String processInstanceNo) {\n        this.processInstanceNo = processInstanceNo;\n    }\n\n    public String getProcessDefId() {\n        return processDefId;\n    }\n\n    public void setProcessDefId(String processDefId) {\n        this.processDefId = processDefId;\n    }\n\n    public String getNodeId() {\n        return nodeId;\n    }\n\n    public void setNodeId(String nodeId) {\n        this.nodeId = nodeId;\n    }\n\n    public Date getStartTime() {\n        return startTime;\n    }\n\n    public void setStartTime(Date startTime) {\n        this.startTime = startTime;\n    }\n\n    public Date getEndTime() {\n        return endTime;\n    }\n\n    public void setEndTime(Date endTime) {\n        this.endTime = endTime;\n    }\n\n    public String getStatus() {\n        return status;\n    }\n\n    public void setStatus(String status) {\n        this.status = status;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n\n    public String getExecutors() {\n        return executors;\n    }\n\n    public void setExecutors(String executors) {\n        this.executors = executors;\n    }\n\n    public String getPreviousNodeInstances() {\n        return previousNodeInstances;\n    }\n\n    public void setPreviousNodeInstances(String previousNodeInstances) {\n        this.previousNodeInstances = previousNodeInstances;\n    }\n\n    public String getNextNodeInstances() {\n        return nextNodeInstances;\n    }\n\n    public void setNextNodeInstances(String nextNodeInstances) {\n        this.nextNodeInstances = nextNodeInstances;\n    }\n\n    public String getVars() {\n        return vars;\n    }\n\n    public void setVars(String vars) {\n        this.vars = vars;\n    }\n\n    public String getExtData() {\n        return extData;\n    }\n\n    public void setExtData(String extData) {\n        this.extData = extData;\n    }\n\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n\n    @Override\n    public String toString() {\n        return \"ProcessNodeInstanceStatusMessage [nodeInstanceNo=\" + nodeInstanceNo + \", processInstanceNo=\"\n                + processInstanceNo + \", processDefId=\" + processDefId + \", nodeId=\" + nodeId + \", startTime=\"\n                + startTime + \", endTime=\" + endTime + \", status=\" + status + \", productCode=\" + productCode\n                + \", executors=\" + executors + \", previousNodeInstances=\" + previousNodeInstances\n                + \", nextNodeInstances=\" + nextNodeInstances + \", vars=\" + vars + \", extData=\" + extData\n                + \", createdDate=\" + createdDate + \", modifiedDate=\" + modifiedDate + \"]\";\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/adapter/message/ProcessTaskStatusMessage.java",
    "content": "package com.jd.easyflow.process.adapter.message;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\nimport com.jd.easyflow.common.adapter.message.BaseMessage;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ProcessTaskStatusMessage extends BaseMessage implements Serializable {\n\n    private String taskNo;\n\n    private String processType;\n\n    private String bizNo;\n\n    private String taskBizCode;\n\n    private String taskBizName;\n    \n    private String taskType;\n\n    private String processInstanceNo;\n    \n    private String nodeInstanceNo;\n    \n    private String nodeExecutionNo;\n    \n    private String assignType;\n    \n    private String assignInfo;\n    \n    private Date assignTime;\n\n    private String executor;\n\n    private Date executeTime;\n\n    private String executeBizResult;\n\n    private String executeBizData;\n    \n    private String productCode;\n    \n    private String creator;\n\n    private String status;\n        \n    private String extData;\n    \n    private Date createdDate;\n    \n    private Date modifiedDate;\n\n    public String getTaskNo() {\n        return taskNo;\n    }\n\n    public void setTaskNo(String taskNo) {\n        this.taskNo = taskNo;\n    }\n\n    public String getProcessType() {\n        return processType;\n    }\n\n    public void setProcessType(String processType) {\n        this.processType = processType;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    public String getTaskBizCode() {\n        return taskBizCode;\n    }\n\n    public void setTaskBizCode(String taskBizCode) {\n        this.taskBizCode = taskBizCode;\n    }\n\n    public String getTaskBizName() {\n        return taskBizName;\n    }\n\n    public void setTaskBizName(String taskBizName) {\n        this.taskBizName = taskBizName;\n    }\n\n    public String getTaskType() {\n        return taskType;\n    }\n\n    public void setTaskType(String taskType) {\n        this.taskType = taskType;\n    }\n\n    public String getProcessInstanceNo() {\n        return processInstanceNo;\n    }\n\n    public void setProcessInstanceNo(String processInstanceNo) {\n        this.processInstanceNo = processInstanceNo;\n    }\n\n    public String getNodeInstanceNo() {\n        return nodeInstanceNo;\n    }\n\n    public void setNodeInstanceNo(String nodeInstanceNo) {\n        this.nodeInstanceNo = nodeInstanceNo;\n    }\n\n    public String getNodeExecutionNo() {\n        return nodeExecutionNo;\n    }\n\n    public void setNodeExecutionNo(String nodeExecutionNo) {\n        this.nodeExecutionNo = nodeExecutionNo;\n    }\n\n    public String getAssignType() {\n        return assignType;\n    }\n\n    public void setAssignType(String assignType) {\n        this.assignType = assignType;\n    }\n\n    public String getAssignInfo() {\n        return assignInfo;\n    }\n\n    public void setAssignInfo(String assignInfo) {\n        this.assignInfo = assignInfo;\n    }\n\n    public Date getAssignTime() {\n        return assignTime;\n    }\n\n    public void setAssignTime(Date assignTime) {\n        this.assignTime = assignTime;\n    }\n\n    public String getExecutor() {\n        return executor;\n    }\n\n    public void setExecutor(String executor) {\n        this.executor = executor;\n    }\n\n    public Date getExecuteTime() {\n        return executeTime;\n    }\n\n    public void setExecuteTime(Date executeTime) {\n        this.executeTime = executeTime;\n    }\n\n    public String getExecuteBizResult() {\n        return executeBizResult;\n    }\n\n    public void setExecuteBizResult(String executeBizResult) {\n        this.executeBizResult = executeBizResult;\n    }\n\n    public String getExecuteBizData() {\n        return executeBizData;\n    }\n\n    public void setExecuteBizData(String executeBizData) {\n        this.executeBizData = executeBizData;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n\n    public String getCreator() {\n        return creator;\n    }\n\n    public void setCreator(String creator) {\n        this.creator = creator;\n    }\n\n    public String getStatus() {\n        return status;\n    }\n\n    public void setStatus(String status) {\n        this.status = status;\n    }\n\n    public String getExtData() {\n        return extData;\n    }\n\n    public void setExtData(String extData) {\n        this.extData = extData;\n    }\n\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n\n    @Override\n    public String toString() {\n        return \"ProcessTaskStatusMessage [taskNo=\" + taskNo + \", processType=\" + processType + \", bizNo=\" + bizNo\n                + \", taskBizCode=\" + taskBizCode + \", taskBizName=\" + taskBizName + \", taskType=\" + taskType\n                + \", processInstanceNo=\" + processInstanceNo + \", nodeInstanceNo=\" + nodeInstanceNo\n                + \", nodeExecutionNo=\" + nodeExecutionNo + \", assignType=\" + assignType + \", assignInfo=\" + assignInfo\n                + \", assignTime=\" + assignTime + \", executor=\" + executor + \", executeTime=\" + executeTime\n                + \", executeBizResult=\" + executeBizResult + \", executeBizData=\" + executeBizData + \", productCode=\"\n                + productCode + \", creator=\" + creator + \", status=\" + status + \", extData=\" + extData\n                + \", createdDate=\" + createdDate + \", modifiedDate=\" + modifiedDate + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/spi/client/ProcessScheduleClientService.java",
    "content": "package com.jd.easyflow.process.spi.client;\n\nimport com.jd.easyflow.common.client.dto.ClientRequest;\nimport com.jd.easyflow.common.client.dto.ClientResponse;\nimport com.jd.easyflow.process.spi.client.dto.ProcessExecuteReq;\nimport com.jd.easyflow.process.spi.client.dto.ProcessExecuteRes;\n\n/**\n * @author liyuliang5\n *\n */\npublic interface ProcessScheduleClientService {\n\n    ClientResponse<ProcessExecuteRes> execute(ClientRequest<ProcessExecuteReq> req);\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/spi/client/ProcessTaskClientService.java",
    "content": "package com.jd.easyflow.process.spi.client;\n\nimport com.jd.easyflow.common.client.dto.ClientRequest;\nimport com.jd.easyflow.common.client.dto.ClientResponse;\nimport com.jd.easyflow.process.spi.client.dto.ProcessTaskCallReq;\nimport com.jd.easyflow.process.spi.client.dto.ProcessTaskCallRes;\n\n/**\n * @author liyuliang5\n *\n */\npublic interface ProcessTaskClientService {\n\n    ClientResponse<ProcessTaskCallRes> call(ClientRequest<ProcessTaskCallReq> req);\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/spi/client/dto/ProcessExecuteReq.java",
    "content": "package com.jd.easyflow.process.spi.client.dto;\n\nimport java.io.Serializable;\nimport java.util.Arrays;\nimport java.util.Map;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessExecuteReq implements Serializable {\n\n    private String processId;\n    \n    private String[] nodeIds;\n    \n    private Object param;\n    \n    private Map<String, Object> dataMap;\n\n    public String getProcessId() {\n        return processId;\n    }\n\n    public void setProcessId(String processId) {\n        this.processId = processId;\n    }\n\n    public String[] getNodeIds() {\n        return nodeIds;\n    }\n\n    public void setNodeIds(String[] nodeIds) {\n        this.nodeIds = nodeIds;\n    }\n\n    public Object getParam() {\n        return param;\n    }\n\n    public void setParam(Object param) {\n        this.param = param;\n    }\n\n    public Map<String, Object> getDataMap() {\n        return dataMap;\n    }\n\n    public void setDataMap(Map<String, Object> dataMap) {\n        this.dataMap = dataMap;\n    }\n\n    @Override\n    public String toString() {\n        return \"ProcessExecuteReq [processId=\" + processId + \", nodeIds=\" + Arrays.toString(nodeIds) + \", param=\"\n                + param + \", dataMap=\" + dataMap + \"]\";\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/spi/client/dto/ProcessExecuteRes.java",
    "content": "package com.jd.easyflow.process.spi.client.dto;\n\nimport java.io.Serializable;\nimport java.util.Map;\n\n/**\n * \n * @author liyuliang5\n */\npublic class ProcessExecuteRes implements Serializable {\n\n    private String processInstanceNo;\n    \n    private Object result;\n    \n    private Map<String, Object> dataMap;\n\n\n    public String getProcessInstanceNo() {\n        return processInstanceNo;\n    }\n\n    public void setProcessInstanceNo(String processInstanceNo) {\n        this.processInstanceNo = processInstanceNo;\n    }\n    \n\n    public Object getResult() {\n        return result;\n    }\n\n    public void setResult(Object result) {\n        this.result = result;\n    }\n\n    public Map<String, Object> getDataMap() {\n        return dataMap;\n    }\n\n    public void setDataMap(Map<String, Object> dataMap) {\n        this.dataMap = dataMap;\n    }\n\n    @Override\n    public String toString() {\n        return \"ProcessExecuteRes [processInstanceNo=\" + processInstanceNo + \", result=\" + result + \", dataMap=\"\n                + dataMap + \"]\";\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/spi/client/dto/ProcessTaskCallReq.java",
    "content": "package com.jd.easyflow.process.spi.client.dto;\n\nimport java.io.Serializable;\nimport java.util.Map;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessTaskCallReq implements Serializable {\n\n    private String processType;\n    \n    private String bizNo;\n    \n    private String taskBizCode;\n    \n    private String processInstanceNo;\n    \n    private String instanceBizData;\n    \n    private String instanceBizStatus;\n    \n    private String event;\n    \n    private String taskNo;\n\n    private Map<String, Object> callParam;\n\n    public String getProcessType() {\n        return processType;\n    }\n\n    public void setProcessType(String processType) {\n        this.processType = processType;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    public String getTaskBizCode() {\n        return taskBizCode;\n    }\n\n    public void setTaskBizCode(String taskBizCode) {\n        this.taskBizCode = taskBizCode;\n    }\n\n    public String getProcessInstanceNo() {\n        return processInstanceNo;\n    }\n\n    public void setProcessInstanceNo(String processInstanceNo) {\n        this.processInstanceNo = processInstanceNo;\n    }\n\n    public String getInstanceBizData() {\n        return instanceBizData;\n    }\n\n    public void setInstanceBizData(String instanceBizData) {\n        this.instanceBizData = instanceBizData;\n    }\n\n    public String getInstanceBizStatus() {\n        return instanceBizStatus;\n    }\n\n    public void setInstanceBizStatus(String instanceBizStatus) {\n        this.instanceBizStatus = instanceBizStatus;\n    }\n\n    public String getEvent() {\n        return event;\n    }\n\n    public void setEvent(String event) {\n        this.event = event;\n    }\n\n    public String getTaskNo() {\n        return taskNo;\n    }\n\n    public void setTaskNo(String taskNo) {\n        this.taskNo = taskNo;\n    }\n\n    public Map<String, Object> getCallParam() {\n        return callParam;\n    }\n\n    public void setCallParam(Map<String, Object> callParam) {\n        this.callParam = callParam;\n    }\n\n    @Override\n    public String toString() {\n        return \"ProcessTaskCallReq [processType=\" + processType + \", bizNo=\" + bizNo + \", taskBizCode=\" + taskBizCode\n                + \", processInstanceNo=\" + processInstanceNo + \", instanceBizData=\" + instanceBizData\n                + \", instanceBizStatus=\" + instanceBizStatus + \", event=\" + event + \", taskNo=\" + taskNo\n                + \", callParam=\" + callParam + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/spi/client/dto/ProcessTaskCallRes.java",
    "content": "package com.jd.easyflow.process.spi.client.dto;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessTaskCallRes implements Serializable {\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/process/spi/client/enums/ProcessClientResponseCode.java",
    "content": "package com.jd.easyflow.process.spi.client.enums;\n\n/**\n * @author liyuliang5\n *\n */\npublic enum ProcessClientResponseCode {\n\n    SUCCESS(\"0000000\",\"SUCCESS\"),\n    PROCESS_INSTANCE_EXISTS(\"0100001\",\"Process instance exists\");\n\n    private String code;\n\n    private String desc;\n\n    ProcessClientResponseCode(String code, String desc) {\n        this.code = code;\n        this.desc = desc;\n    }\n\n    public String getCode() {\n        return code;\n    }\n\n    public String getDesc() {\n        return desc;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/processunit/adapter/export/ProcessUnitExport.java",
    "content": "package com.jd.easyflow.processunit.adapter.export;\n\nimport java.util.List;\nimport java.util.Map;\n\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponse;\nimport com.jd.easyflow.common.adapter.export.dto.pager.PagerCondition;\nimport com.jd.easyflow.common.adapter.export.dto.pager.PagerResult;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitCreateReq;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitCreateRes;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitDTO;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitExecuteReq;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitExecuteRes;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitExecutionDTO;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitExecutionQueryReq;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitInstanceDTO;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitInstanceQueryReq;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitQueryReq;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitUpdateReq;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitUpdateRes;\nimport com.jd.easyflow.processunit.adapter.export.dto.ShardingInfoDTO;\nimport com.jd.easyflow.processunit.adapter.export.dto.ShardingInfoQueryReq;\nimport com.jd.easyflow.processunit.adapter.export.dto.ShutdownReq;\nimport com.jd.easyflow.processunit.adapter.export.dto.ShutdownRes;\nimport com.jd.easyflow.processunit.adapter.export.dto.SyncAfterCallReq;\nimport com.jd.easyflow.processunit.adapter.export.dto.SyncAfterCallRes;\nimport com.jd.easyflow.processunit.adapter.export.dto.SyncBeforeCallReq;\nimport com.jd.easyflow.processunit.adapter.export.dto.SyncBeforeCallRes;\n\n/**\n * @author liyuliang5\n *\n */\npublic interface ProcessUnitExport {\n    \n    // tx\n\n    public ExportResponse<SyncBeforeCallRes> syncBeforeCall(ExportRequest<SyncBeforeCallReq> req);\n    \n    public ExportResponse<SyncAfterCallRes> syncAfterCall(ExportRequest<SyncAfterCallReq> req);\n    \n    public ExportResponse<ProcessUnitCreateRes> create(ExportRequest<ProcessUnitCreateReq> req); \n    \n    public ExportResponse<ProcessUnitExecuteRes> execute(ExportRequest<ProcessUnitExecuteReq> req);\n    \n    public ExportResponse<Void> batchExecute(ExportRequest<Map<String, String>> req);\n    \n    public ExportResponse<Object> updateProcessUnitInstanceByInstanceNoSelective(ExportRequest<ProcessUnitInstanceDTO> req);\n    \n    public ExportResponse<ProcessUnitUpdateRes> update(ExportRequest<ProcessUnitUpdateReq> req); \n    \n    // read\n\n    public ExportResponse<ProcessUnitInstanceDTO> getByProcessInstanceNo(ExportRequest<String> req);\n    \n    public ExportResponse<ProcessUnitInstanceDTO> getByBizNoAndProcessUnitCode(ExportRequest<ProcessUnitInstanceQueryReq> req);\n    \n    ExportResponse<List<ProcessUnitInstanceDTO>> queryByUnitCodeAndBizNoPrefix(\n            ExportRequest<ProcessUnitInstanceQueryReq> req);\n    \n    public ExportResponse<PagerResult> pagerQueryProcessUnitInstance(ExportRequest<PagerCondition> req);\n\n    public ExportResponse<PagerResult> pagerQueryProcessUnitExecution(ExportRequest<PagerCondition> req);\n\n    public ExportResponse<ProcessUnitExecutionDTO> getExecutionByExecutionNo(ExportRequest<ProcessUnitExecutionQueryReq> req);\n    \n    public ExportResponse<List<ProcessUnitDTO>> queryProcessUnitList(ExportRequest<ProcessUnitQueryReq> req);\n\n    public ExportResponse<ShardingInfoDTO> queryShardingInfo(ExportRequest<ShardingInfoQueryReq> req);\n    \n    public ExportResponse<ShutdownRes> shutdown(ExportRequest<ShutdownReq> req);\n\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/processunit/adapter/export/dto/ExecPolicyDTO.java",
    "content": " package com.jd.easyflow.processunit.adapter.export.dto;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n *\n */\n public class ExecPolicyDTO implements Serializable {\n\n     private String policyType;\n     \n     private String policyData;\n     private String result;\n     private String requestContent;\n     private String responseContent;\n    public String getPolicyType() {\n        return policyType;\n    }\n    public void setPolicyType(String policyType) {\n        this.policyType = policyType;\n    }\n    public String getPolicyData() {\n        return policyData;\n    }\n    public void setPolicyData(String policyData) {\n        this.policyData = policyData;\n    }\n    public String getResult() {\n        return result;\n    }\n    public void setResult(String result) {\n        this.result = result;\n    }\n    public String getRequestContent() {\n        return requestContent;\n    }\n    public void setRequestContent(String requestContent) {\n        this.requestContent = requestContent;\n    }\n    public String getResponseContent() {\n        return responseContent;\n    }\n    public void setResponseContent(String responseContent) {\n        this.responseContent = responseContent;\n    }\n    @Override\n    public String toString() {\n        return \"ExecPolicyDTO [policyType=\" + policyType + \", policyData=\" + policyData + \", result=\" + result\n                + \", requestContent=\" + requestContent + \", responseContent=\" + responseContent + \"]\";\n    }\n     \n     \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/processunit/adapter/export/dto/ProcessUnitCreateReq.java",
    "content": "package com.jd.easyflow.processunit.adapter.export.dto;\n\nimport java.io.Serializable;\nimport java.util.Date;\nimport java.util.Map;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessUnitCreateReq implements Serializable {\n\tprivate static final long serialVersionUID = 1L;\n\n\tprivate String unitCode;\n    \n    private String bizNo;\n    \n    private String requestNo;\n    \n    private String requestContent;\n    \n    private String productCode;\n    \n    private String parentNo;\n    \n    private Boolean autoRunFlag;\n    \n    private Date nextAutoRunTime;\n    \n    private Map<String, String> variables;\n    \n    private Map<String, String> clientInfo;\n    \n    public ProcessUnitCreateReq() {\n        \n    }\n    \n    public ProcessUnitCreateReq(String unitCode, String bizNo, String requestContent) {\n        this.unitCode = unitCode;\n        this.bizNo = bizNo;\n        this.requestContent = requestContent;\n    }\n\n    public String getUnitCode() {\n        return unitCode;\n    }\n\n    public void setUnitCode(String unitCode) {\n        this.unitCode = unitCode;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    public String getRequestNo() {\n        return requestNo;\n    }\n\n    public void setRequestNo(String requestNo) {\n        this.requestNo = requestNo;\n    }\n\n    public String getRequestContent() {\n        return requestContent;\n    }\n\n    public void setRequestContent(String requestContent) {\n        this.requestContent = requestContent;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n\n    public String getParentNo() {\n        return parentNo;\n    }\n\n    public void setParentNo(String parentNo) {\n        this.parentNo = parentNo;\n    }\n\n    public Boolean getAutoRunFlag() {\n        return autoRunFlag;\n    }\n\n    public void setAutoRunFlag(Boolean autoRunFlag) {\n        this.autoRunFlag = autoRunFlag;\n    }\n\n    public Date getNextAutoRunTime() {\n        return nextAutoRunTime;\n    }\n\n    public void setNextAutoRunTime(Date nextAutoRunTime) {\n        this.nextAutoRunTime = nextAutoRunTime;\n    }\n    \n    public Map<String, String> getVariables() {\n        return variables;\n    }\n\n    public void setVariables(Map<String, String> variables) {\n        this.variables = variables;\n    }\n    \n    public Map<String, String> getClientInfo() {\n        return clientInfo;\n    }\n\n    public void setClientInfo(Map<String, String> clientInfo) {\n        this.clientInfo = clientInfo;\n    }\n\n    @Override\n    public String toString() {\n        return \"ProcessUnitCreateReq [unitCode=\" + unitCode + \", bizNo=\" + bizNo + \", requestNo=\" + requestNo\n                + \", requestContent=\" + requestContent + \", productCode=\" + productCode + \", parentNo=\" + parentNo\n                + \", autoRunFlag=\" + autoRunFlag + \", nextAutoRunTime=\" + nextAutoRunTime + \", variables=\" + variables\n                + \", clientInfo=\" + clientInfo + \"]\";\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/processunit/adapter/export/dto/ProcessUnitCreateRes.java",
    "content": "package com.jd.easyflow.processunit.adapter.export.dto;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessUnitCreateRes implements Serializable {\n    \n    String processUnitInstanceNo;\n\n    public String getProcessUnitInstanceNo() {\n        return processUnitInstanceNo;\n    }\n\n    public void setProcessUnitInstanceNo(String processUnitInstanceNo) {\n        this.processUnitInstanceNo = processUnitInstanceNo;\n    }\n\n    @Override\n    public String toString() {\n        return \"ProcessUnitCreateRes [processUnitInstanceNo=\" + processUnitInstanceNo + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/processunit/adapter/export/dto/ProcessUnitDTO.java",
    "content": "package com.jd.easyflow.processunit.adapter.export.dto;\n\nimport java.io.Serializable;\n\n/**\n * \n * @author liyuliang5\n */\npublic class ProcessUnitDTO implements Serializable {\n\n    private String processUnitCode;\n\n    private String parentCode;\n\n    private String name;\n\n    private String config;\n\n    private String status;\n\n    public String getProcessUnitCode() {\n        return processUnitCode;\n    }\n\n    public void setProcessUnitCode(String processUnitCode) {\n        this.processUnitCode = processUnitCode;\n    }\n\n    public String getParentCode() {\n        return parentCode;\n    }\n\n    public void setParentCode(String parentCode) {\n        this.parentCode = parentCode;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getStatus() {\n        return status;\n    }\n\n    public void setStatus(String status) {\n        this.status = status;\n    }\n\n    public String getConfig() {\n        return config;\n    }\n\n    public void setConfig(String config) {\n        this.config = config;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/processunit/adapter/export/dto/ProcessUnitExecuteReq.java",
    "content": "package com.jd.easyflow.processunit.adapter.export.dto;\n\nimport java.io.Serializable;\nimport java.util.Map;\n\n/**\n * \n * @author liyuliang5\n */\npublic class ProcessUnitExecuteReq implements Serializable {\n\n    String processUnitInstanceNo;\n    \n    String unitCode;\n    \n    String bizNo;\n    \n    private Map<String, String> clientInfo;\n\n    public String getProcessUnitInstanceNo() {\n        return processUnitInstanceNo;\n    }\n\n    public void setProcessUnitInstanceNo(String processUnitInstanceNo) {\n        this.processUnitInstanceNo = processUnitInstanceNo;\n    }\n    \n    public String getUnitCode() {\n        return unitCode;\n    }\n\n    public void setUnitCode(String unitCode) {\n        this.unitCode = unitCode;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n    \n    public Map<String, String> getClientInfo() {\n        return clientInfo;\n    }\n\n    public void setClientInfo(Map<String, String> clientInfo) {\n        this.clientInfo = clientInfo;\n    }\n\n    @Override\n    public String toString() {\n        return \"ProcessUnitExecuteReq [processUnitInstanceNo=\" + processUnitInstanceNo + \", unitCode=\" + unitCode\n                + \", bizNo=\" + bizNo + \"]\";\n    }\n\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/processunit/adapter/export/dto/ProcessUnitExecuteRes.java",
    "content": "package com.jd.easyflow.processunit.adapter.export.dto;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n */\npublic class ProcessUnitExecuteRes implements Serializable {\n\n    private String result;\n    \n    private String responseContent;\n\n    public String getResult() {\n        return result;\n    }\n\n    public void setResult(String result) {\n        this.result = result;\n    }\n\n    public String getResponseContent() {\n        return responseContent;\n    }\n\n    public void setResponseContent(String responseContent) {\n        this.responseContent = responseContent;\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/processunit/adapter/export/dto/ProcessUnitExecutionDTO.java",
    "content": "package com.jd.easyflow.processunit.adapter.export.dto;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\n/**\n * @author liyuliang5\n */\npublic class ProcessUnitExecutionDTO implements Serializable {\n\n\n    private String executionNo;\n    \n    private String requestNo;\n    \n    private String parentNo;\n    \n    private String instanceNo;\n    \n    private String processUnitCode;\n    \n    private String bizNo;\n    \n    private String productCode;\n    \n    private String result;\n\n    private String requestContent;\n    \n    private String responseContent;\n    \n    private String execType;\n         \n    private String extData;\n         \n    private Date requestTime;\n    \n    private Date responseTime;\n    \n    private int elaspeTime;\n    \n    private Date createdDate;\n    \n    private Date modifiedDate;\n    \n    private Long id;\n\n   public String getExecutionNo() {\n       return executionNo;\n   }\n\n   public void setExecutionNo(String executionNo) {\n       this.executionNo = executionNo;\n   }\n\n   public String getRequestNo() {\n       return requestNo;\n   }\n\n   public void setRequestNo(String requestNo) {\n       this.requestNo = requestNo;\n   }\n\n   public String getParentNo() {\n       return parentNo;\n   }\n\n   public void setParentNo(String parentNo) {\n       this.parentNo = parentNo;\n   }\n\n   public String getInstanceNo() {\n       return instanceNo;\n   }\n\n   public void setInstanceNo(String instanceNo) {\n       this.instanceNo = instanceNo;\n   }\n\n   public String getProcessUnitCode() {\n       return processUnitCode;\n   }\n\n   public void setProcessUnitCode(String processUnitCode) {\n       this.processUnitCode = processUnitCode;\n   }\n\n   public String getBizNo() {\n       return bizNo;\n   }\n\n   public void setBizNo(String bizNo) {\n       this.bizNo = bizNo;\n   }\n\n   public String getProductCode() {\n       return productCode;\n   }\n\n   public void setProductCode(String productCode) {\n       this.productCode = productCode;\n   }\n\n   public String getResult() {\n       return result;\n   }\n\n   public void setResult(String result) {\n       this.result = result;\n   }\n\n   public String getRequestContent() {\n       return requestContent;\n   }\n\n   public void setRequestContent(String requestContent) {\n       this.requestContent = requestContent;\n   }\n\n   public String getResponseContent() {\n       return responseContent;\n   }\n\n   public void setResponseContent(String responseContent) {\n       this.responseContent = responseContent;\n   }\n\n   public String getExecType() {\n       return execType;\n   }\n\n   public void setExecType(String execType) {\n       this.execType = execType;\n   }\n\n   public String getExtData() {\n       return extData;\n   }\n\n   public void setExtData(String extData) {\n       this.extData = extData;\n   }\n\n   public Date getRequestTime() {\n       return requestTime;\n   }\n\n   public void setRequestTime(Date requestTime) {\n       this.requestTime = requestTime;\n   }\n\n   public Date getResponseTime() {\n       return responseTime;\n   }\n\n   public void setResponseTime(Date responseTime) {\n       this.responseTime = responseTime;\n   }\n\n   public int getElaspeTime() {\n       return elaspeTime;\n   }\n\n   public void setElaspeTime(int elaspeTime) {\n       this.elaspeTime = elaspeTime;\n   }\n\n   public Date getCreatedDate() {\n       return createdDate;\n   }\n\n   public void setCreatedDate(Date createdDate) {\n       this.createdDate = createdDate;\n   }\n\n   public Date getModifiedDate() {\n       return modifiedDate;\n   }\n\n   public void setModifiedDate(Date modifiedDate) {\n       this.modifiedDate = modifiedDate;\n   }\n   \n   public Long getId() {\n       return id;\n   }\n\n   public void setId(Long id) {\n       this.id = id;\n   }\n\n@Override\n   public String toString() {\n       return \"ProcessUnitExecutionEntity [executionNo=\" + executionNo + \", requestNo=\" + requestNo\n               + \", parentNo=\" + parentNo + \", instanceNo=\" + instanceNo + \", processUnitCode=\" + processUnitCode + \", bizNo=\" + bizNo\n               + \", productCode=\" + productCode + \", result=\" + result + \", requestContent=\" + requestContent\n               + \", responseContent=\" + responseContent + \", execType=\" + execType + \", extData=\" + extData\n               + \", requestTime=\" + requestTime + \", responseTime=\" + responseTime + \", elaspeTime=\" + elaspeTime\n               + \", createdDate=\" + createdDate + \", modifiedDate=\" + modifiedDate +\", id=\" + id + \"]\";\n   }\n    \n    \n  \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/processunit/adapter/export/dto/ProcessUnitExecutionQueryReq.java",
    "content": "package com.jd.easyflow.processunit.adapter.export.dto;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessUnitExecutionQueryReq implements Serializable {\n    \n    private String executionNo;\n    \n    private String instanceNo;\n\n    private String bizNo;\n    \n    private String processUnitCode;\n    \n    public String getExecutionNo() {\n        return executionNo;\n    }\n\n    public void setExecutionNo(String executionNo) {\n        this.executionNo = executionNo;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    public String getProcessUnitCode() {\n        return processUnitCode;\n    }\n\n    public void setProcessUnitCode(String processUnitCode) {\n        this.processUnitCode = processUnitCode;\n    }\n\n    public String getInstanceNo() {\n        return instanceNo;\n    }\n\n    public void setInstanceNo(String instanceNo) {\n        this.instanceNo = instanceNo;\n    }\n\n    @Override\n    public String toString() {\n        return \"ProcessUnitExecutionQueryReq [executionNo=\" + executionNo + \", instanceNo=\" + instanceNo + \", bizNo=\"\n                + bizNo + \", processUnitCode=\" + processUnitCode + \"]\";\n    }\n\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/processunit/adapter/export/dto/ProcessUnitInstanceDTO.java",
    "content": "package com.jd.easyflow.processunit.adapter.export.dto;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessUnitInstanceDTO implements Serializable {\n\n    private String instanceNo;\n    \n    private String bizNo;\n    \n    private String parentNo;\n    \n    private String processUnitCode;\n    \n    private String productCode;\n    \n    private String result;\n    \n    private String requestContent;\n    \n    private String responseContent;\n    \n    private String vars;\n    \n    private String extData;\n    \n    private Date createdDate;\n    \n    private Date modifiedDate;\n\n    private Boolean autoRunFlag;\n    \n\n    private Integer autoRunTimes;\n\n    private Date nextAutoRunTime;\n    \n    private Long id;\n    \n    public String getInstanceNo() {\n        return instanceNo;\n    }\n    public void setInstanceNo(String instanceNo) {\n        this.instanceNo = instanceNo;\n    }\n    public String getBizNo() {\n        return bizNo;\n    }\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n    public String getParentNo() {\n        return parentNo;\n    }\n    public void setParentNo(String parentNo) {\n        this.parentNo = parentNo;\n    }\n    public String getProcessUnitCode() {\n        return processUnitCode;\n    }\n    public void setProcessUnitCode(String processUnitCode) {\n        this.processUnitCode = processUnitCode;\n    }\n    public String getProductCode() {\n        return productCode;\n    }\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n    public String getResult() {\n        return result;\n    }\n    public void setResult(String result) {\n        this.result = result;\n    }\n    public String getRequestContent() {\n        return requestContent;\n    }\n    public void setRequestContent(String requestContent) {\n        this.requestContent = requestContent;\n    }\n    public String getResponseContent() {\n        return responseContent;\n    }\n    public void setResponseContent(String responseContent) {\n        this.responseContent = responseContent;\n    }\n    public String getExtData() {\n        return extData;\n    }\n    public void setExtData(String extData) {\n        this.extData = extData;\n    }\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n    public Boolean getAutoRunFlag() {\n        return autoRunFlag;\n    }\n    public void setAutoRunFlag(Boolean autoRunFlag) {\n        this.autoRunFlag = autoRunFlag;\n    }\n    public Integer getAutoRunTimes() {\n        return autoRunTimes;\n    }\n    public void setAutoRunTimes(Integer autoRunTimes) {\n        this.autoRunTimes = autoRunTimes;\n    }\n    public Date getNextAutoRunTime() {\n        return nextAutoRunTime;\n    }\n    public void setNextAutoRunTime(Date nextAutoRunTime) {\n        this.nextAutoRunTime = nextAutoRunTime;\n    }\n    \n    public Long getId() {\n        return id;\n    }\n    public void setId(Long id) {\n        this.id = id;\n    }\n    \n    public String getVars() {\n        return vars;\n    }\n    public void setVars(String vars) {\n        this.vars = vars;\n    }\n    @Override\n    public String toString() {\n        return \"ProcessUnitInstanceDTO [instanceNo=\" + instanceNo + \", bizNo=\" + bizNo + \", parentNo=\" + parentNo\n                + \", processUnitCode=\" + processUnitCode + \", productCode=\" + productCode + \", result=\" + result\n                + \", requestContent=\" + requestContent + \", responseContent=\" + responseContent + \",vars=\" + vars+ \", extData=\" + extData\n                + \", createdDate=\" + createdDate + \", modifiedDate=\" + modifiedDate + \", autoRunFlag=\" + autoRunFlag\n                + \", autoRunTimes=\" + autoRunTimes + \", nextAutoRunTime=\" + nextAutoRunTime + \",id=\" + id + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/processunit/adapter/export/dto/ProcessUnitInstanceQueryReq.java",
    "content": "package com.jd.easyflow.processunit.adapter.export.dto;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessUnitInstanceQueryReq implements Serializable {\n\n    private String bizNo;\n    \n    private String processUnitCode;\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    public String getProcessUnitCode() {\n        return processUnitCode;\n    }\n\n    public void setProcessUnitCode(String processUnitCode) {\n        this.processUnitCode = processUnitCode;\n    }\n\n    @Override\n    public String toString() {\n        return \"ProcessUnitInstanceQueryReq [bizNo=\" + bizNo + \", processUnitCode=\" + processUnitCode + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/processunit/adapter/export/dto/ProcessUnitQueryReq.java",
    "content": "package com.jd.easyflow.processunit.adapter.export.dto;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n */\npublic class ProcessUnitQueryReq implements Serializable {\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/processunit/adapter/export/dto/ProcessUnitUpdateReq.java",
    "content": "package com.jd.easyflow.processunit.adapter.export.dto;\n\nimport java.io.Serializable;\nimport java.util.Date;\nimport java.util.Map;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ProcessUnitUpdateReq implements Serializable {\n    \n    public static final String UPDATE_TYPE_VARIABLES = \"VARIABLES\";\n    \n    public static final String UPDATE_TYPE_REQUEST_CONTENT = \"REQUEST_CONTENT\";\n    \n    private String instanceNo;\n    \n    private String unitCode;\n    \n    private String bizNo;\n    \n    private String result;\n    \n    private String responseContent;\n    \n    private Map<String, String> variables;\n    \n    private String requestContent;\n    \n    private Date requestTime;\n    \n    private Date responseTime;\n    \n    private String requestNo;\n    \n    private String execType;\n    \n    private Map<String, String> requestContext;\n    \n    private String productCode;\n    \n    private Boolean autoRunFlag;\n    \n    private Date nextAutoRunTime;\n    \n    private String updateType;\n    private Boolean lock;\n    \n    private Map<String, String> clientInfo;\n    \n    public String getInstanceNo() {\n        return instanceNo;\n    }\n\n    public void setInstanceNo(String instanceNo) {\n        this.instanceNo = instanceNo;\n    }\n\n    public String getUnitCode() {\n        return unitCode;\n    }\n\n    public void setUnitCode(String unitCode) {\n        this.unitCode = unitCode;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    public String getResult() {\n        return result;\n    }\n\n    public void setResult(String result) {\n        this.result = result;\n    }\n\n    public String getResponseContent() {\n        return responseContent;\n    }\n\n    public void setResponseContent(String responseContent) {\n        this.responseContent = responseContent;\n    }\n\n    public Map<String, String> getVariables() {\n        return variables;\n    }\n\n    public void setVariables(Map<String, String> variables) {\n        this.variables = variables;\n    }\n\n    public String getRequestContent() {\n        return requestContent;\n    }\n\n    public void setRequestContent(String requestContent) {\n        this.requestContent = requestContent;\n    }\n\n    public Date getRequestTime() {\n        return requestTime;\n    }\n\n    public void setRequestTime(Date requestTime) {\n        this.requestTime = requestTime;\n    }\n\n    public Date getResponseTime() {\n        return responseTime;\n    }\n\n    public void setResponseTime(Date responseTime) {\n        this.responseTime = responseTime;\n    }\n\n    public String getRequestNo() {\n        return requestNo;\n    }\n\n    public void setRequestNo(String requestNo) {\n        this.requestNo = requestNo;\n    }\n\n    public String getExecType() {\n        return execType;\n    }\n\n    public void setExecType(String execType) {\n        this.execType = execType;\n    }\n\n    public Map<String, String> getRequestContext() {\n        return requestContext;\n    }\n\n    public void setRequestContext(Map<String, String> requestContext) {\n        this.requestContext = requestContext;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n    \n\n    public Boolean getAutoRunFlag() {\n        return autoRunFlag;\n    }\n\n    public void setAutoRunFlag(Boolean autoRunFlag) {\n        this.autoRunFlag = autoRunFlag;\n    }\n\n    public Date getNextAutoRunTime() {\n        return nextAutoRunTime;\n    }\n\n    public void setNextAutoRunTime(Date nextAutoRunTime) {\n        this.nextAutoRunTime = nextAutoRunTime;\n    }\n    \n    public String getUpdateType() {\n        return updateType;\n    }\n\n    public void setUpdateType(String updateType) {\n        this.updateType = updateType;\n    }\n    \n\n    public Boolean getLock() {\n        return lock;\n    }\n\n    public void setLock(Boolean lock) {\n        this.lock = lock;\n    }\n    \n    public Map<String, String> getClientInfo() {\n        return clientInfo;\n    }\n\n    public void setClientInfo(Map<String, String> clientInfo) {\n        this.clientInfo = clientInfo;\n    }\n\n    @Override\n    public String toString() {\n        return \"ProcessUnitUpdateReq [instanceNo=\" + instanceNo + \", unitCode=\" + unitCode + \", bizNo=\" + bizNo\n                + \", result=\" + result + \", responseContent=\" + responseContent + \", variables=\" + variables\n                + \", requestContent=\" + requestContent + \", requestTime=\" + requestTime + \", responseTime=\"\n                + responseTime + \", requestNo=\" + requestNo + \", execType=\" + execType + \", requestContext=\"\n                + requestContext + \", productCode=\" + productCode + \", autoRunFlag=\" + autoRunFlag\n                + \", nextAutoRunTime=\" + nextAutoRunTime + \", updateType=\" + updateType +  \", clientInfo=\" + clientInfo + \"]\";\n    }\n    \n    \n\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/processunit/adapter/export/dto/ProcessUnitUpdateRes.java",
    "content": "package com.jd.easyflow.processunit.adapter.export.dto;\n\nimport java.io.Serializable;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ProcessUnitUpdateRes implements Serializable {\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/processunit/adapter/export/dto/ShardingInfoDTO.java",
    "content": "package com.jd.easyflow.processunit.adapter.export.dto;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n */\npublic class ShardingInfoDTO implements Serializable {\n\n    private String shard;\n    \n    private String db;\n    \n    private String tableSuffix;\n    \n    private String slaveShard;\n    \n    private String slaveDb;\n    \n    private String slaveTableSuffix;\n\n    public String getShard() {\n        return shard;\n    }\n\n    public void setShard(String shard) {\n        this.shard = shard;\n    }\n\n    public String getDb() {\n        return db;\n    }\n\n    public void setDb(String db) {\n        this.db = db;\n    }\n\n    public String getTableSuffix() {\n        return tableSuffix;\n    }\n\n    public void setTableSuffix(String tableSuffix) {\n        this.tableSuffix = tableSuffix;\n    }\n\n    public String getSlaveDb() {\n        return slaveDb;\n    }\n\n    public void setSlaveDb(String slaveDb) {\n        this.slaveDb = slaveDb;\n    }\n\n    public String getSlaveTableSuffix() {\n        return slaveTableSuffix;\n    }\n\n    public void setSlaveTableSuffix(String slaveTableSuffix) {\n        this.slaveTableSuffix = slaveTableSuffix;\n    }\n\n    public String getSlaveShard() {\n        return slaveShard;\n    }\n\n    public void setSlaveShard(String slaveShard) {\n        this.slaveShard = slaveShard;\n    }\n\n    @Override\n    public String toString() {\n        return \"ShardingInfoVO [shard=\" + shard + \", db=\" + db + \", tableSuffix=\" + tableSuffix + \", slaveShard=\"\n                + slaveShard + \", slaveDb=\" + slaveDb + \", slaveTableSuffix=\" + slaveTableSuffix + \"]\";\n    }\n\n\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/processunit/adapter/export/dto/ShardingInfoQueryReq.java",
    "content": "package com.jd.easyflow.processunit.adapter.export.dto;\n\nimport java.io.Serializable;\n\n/**\n * \n * @author liyuliang5\n */\npublic class ShardingInfoQueryReq implements Serializable {\n\n    private String unitCode;\n    \n    private String bizNo;\n\n    public String getUnitCode() {\n        return unitCode;\n    }\n\n    public void setUnitCode(String unitCode) {\n        this.unitCode = unitCode;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    @Override\n    public String toString() {\n        return \"ShardingInfoQueryReq [unitCode=\" + unitCode + \", bizNo=\" + bizNo + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/processunit/adapter/export/dto/ShutdownReq.java",
    "content": "package com.jd.easyflow.processunit.adapter.export.dto;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n */\npublic class ShutdownReq implements Serializable {\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/processunit/adapter/export/dto/ShutdownRes.java",
    "content": "package com.jd.easyflow.processunit.adapter.export.dto;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n */\npublic class ShutdownRes implements Serializable {\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/processunit/adapter/export/dto/SyncAfterCallReq.java",
    "content": "package com.jd.easyflow.processunit.adapter.export.dto;\n\nimport java.io.Serializable;\nimport java.util.Date;\nimport java.util.Map;\n\n/**\n * @author liyuliang5\n *\n */\npublic class SyncAfterCallReq implements Serializable {\n\n    private String executionNo;\n\n    private String result;\n\n    private String responseContent;\n\n    private String instanceNo;\n\n    private String bizNo;\n\n    private String unitCode;\n\n    private Map<String, String> contextData;\n    \n    private Map<String, String> variables;\n    \n    private Boolean autoRunFlag;\n    \n    private Date nextAutoRunTime;\n\n    public String getExecutionNo() {\n        return executionNo;\n    }\n\n    public void setExecutionNo(String executionNo) {\n        this.executionNo = executionNo;\n    }\n\n    public String getResult() {\n        return result;\n    }\n\n    public void setResult(String result) {\n        this.result = result;\n    }\n\n    public String getResponseContent() {\n        return responseContent;\n    }\n\n    public void setResponseContent(String responseContent) {\n        this.responseContent = responseContent;\n    }\n\n    public String getInstanceNo() {\n        return instanceNo;\n    }\n\n    public void setInstanceNo(String instanceNo) {\n        this.instanceNo = instanceNo;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    public String getUnitCode() {\n        return unitCode;\n    }\n\n    public void setUnitCode(String unitCode) {\n        this.unitCode = unitCode;\n    }\n\n    public Map<String, String> getContextData() {\n        return contextData;\n    }\n\n    public void setContextData(Map<String, String> contextData) {\n        this.contextData = contextData;\n    }\n\n    public Map<String, String> getVariables() {\n        return variables;\n    }\n\n    public void setVariables(Map<String, String> variables) {\n        this.variables = variables;\n    }\n    \n\n    public Boolean getAutoRunFlag() {\n        return autoRunFlag;\n    }\n\n    public void setAutoRunFlag(Boolean autoRunFlag) {\n        this.autoRunFlag = autoRunFlag;\n    }\n\n    public Date getNextAutoRunTime() {\n        return nextAutoRunTime;\n    }\n\n    public void setNextAutoRunTime(Date nextAutoRunTime) {\n        this.nextAutoRunTime = nextAutoRunTime;\n    }\n\n    @Override\n    public String toString() {\n        return \"SyncAfterCallReq [executionNo=\" + executionNo + \", result=\" + result + \", responseContent=\"\n                + responseContent + \", instanceNo=\" + instanceNo + \", bizNo=\" + bizNo + \", unitCode=\" + unitCode\n                + \", contextData=\" + contextData + \", variables=\" + variables  + \", autoRunFlag=\" + autoRunFlag + \", nextAutoRunTime=\" + nextAutoRunTime + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/processunit/adapter/export/dto/SyncAfterCallRes.java",
    "content": " package com.jd.easyflow.processunit.adapter.export.dto;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n *\n */\n public class SyncAfterCallRes implements Serializable {\n\n    @Override\n    public String toString() {\n        return \"SyncAfterCallRes []\";\n    }\n     \n     \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/processunit/adapter/export/dto/SyncBeforeCallReq.java",
    "content": " package com.jd.easyflow.processunit.adapter.export.dto;\n\nimport java.io.Serializable;\nimport java.util.Map;\n\n/**\n  * @author liyuliang5\n  * \n  */\n public class SyncBeforeCallReq implements Serializable {\n\n     private String unitCode;\n     \n     private String bizNo;\n     \n     private String requestNo;\n     \n     private String requestContent;\n\n     private String version = \"1.0.0\";\n     \n     private String productCode;\n     \n     private String parentNo;\n     \n     private Map<String, String> clientInfo;\n\n    public String getUnitCode() {\n        return unitCode;\n    }\n\n    public void setUnitCode(String unitCode) {\n        this.unitCode = unitCode;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    public String getRequestNo() {\n        return requestNo;\n    }\n\n    public void setRequestNo(String requestNo) {\n        this.requestNo = requestNo;\n    }\n\n    public String getRequestContent() {\n        return requestContent;\n    }\n\n    public void setRequestContent(String requestContent) {\n        this.requestContent = requestContent;\n    }\n\n    public String getVersion() {\n        return version;\n    }\n\n    public void setVersion(String version) {\n        this.version = version;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n\n    public String getParentNo() {\n        return parentNo;\n    }\n\n    public void setParentNo(String parentNo) {\n        this.parentNo = parentNo;\n    }\n    \n    public Map<String, String> getClientInfo() {\n        return clientInfo;\n    }\n\n    public void setClientInfo(Map<String, String> clientInfo) {\n        this.clientInfo = clientInfo;\n    }\n\n    @Override\n    public String toString() {\n        return \"SyncBeforeCallReq [unitCode=\" + unitCode + \", bizNo=\" + bizNo + \", requestNo=\" + requestNo\n                + \", requestContent=\" + requestContent + \", version=\" + version + \", productCode=\" + productCode\n                + \", parentNo=\" + parentNo + \", clientInfo=\" + clientInfo + \"]\";\n    }\n     \n     \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/processunit/adapter/export/dto/SyncBeforeCallRes.java",
    "content": "package com.jd.easyflow.processunit.adapter.export.dto;\n\nimport java.io.Serializable;\nimport java.util.Map;\n\n/**\n * @author liyuliang5\n *\n */\npublic class SyncBeforeCallRes implements Serializable {\n\n    private ExecPolicyDTO execPolicy;\n\n    private String executionNo;\n\n    private String instanceNo;\n\n    private Map<String, Object> unitConf;\n\n    private Map<String, String> contextData;\n    \n    private Map<String, String> variables;\n\n    public ExecPolicyDTO getExecPolicy() {\n        return execPolicy;\n    }\n\n    public void setExecPolicy(ExecPolicyDTO execPolicy) {\n        this.execPolicy = execPolicy;\n    }\n\n    public String getExecutionNo() {\n        return executionNo;\n    }\n\n    public void setExecutionNo(String executionNo) {\n        this.executionNo = executionNo;\n    }\n\n    public String getInstanceNo() {\n        return instanceNo;\n    }\n\n    public void setInstanceNo(String instanceNo) {\n        this.instanceNo = instanceNo;\n    }\n\n    public Map<String, Object> getUnitConf() {\n        return unitConf;\n    }\n\n    public void setUnitConf(Map<String, Object> unitConf) {\n        this.unitConf = unitConf;\n    }\n\n    public Map<String, String> getContextData() {\n        return contextData;\n    }\n\n    public void setContextData(Map<String, String> contextData) {\n        this.contextData = contextData;\n    }\n\n    public Map<String, String> getVariables() {\n        return variables;\n    }\n\n    public void setVariables(Map<String, String> variables) {\n        this.variables = variables;\n    }\n\n    @Override\n    public String toString() {\n        return \"SyncBeforeCallRes [execPolicy=\" + execPolicy + \", executionNo=\" + executionNo + \", instanceNo=\"\n                + instanceNo + \", unitConf=\" + unitConf + \", contextData=\" + contextData + \", variables=\" + variables\n                + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/processunit/spi/client/ProcessUnitClientService.java",
    "content": "package com.jd.easyflow.processunit.spi.client;\n\nimport com.jd.easyflow.processunit.spi.client.dto.AsyncCallRealReq;\nimport com.jd.easyflow.processunit.spi.client.dto.AsyncCallRealRes;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic interface ProcessUnitClientService {\n\n    AsyncCallRealRes asyncCallReal(AsyncCallRealReq req);\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/processunit/spi/client/dto/AsyncCallRealReq.java",
    "content": " package com.jd.easyflow.processunit.spi.client.dto;\n\nimport java.io.Serializable;\nimport java.util.Map;\n\n/**\n * @author liyuliang5\n *\n */\n public class AsyncCallRealReq implements Serializable {\n\n     private String executeExp;\n     \n     private String requestContent;\n     \n     private String executionNo;\n     \n     private Map<String, Object> requestContext;\n     \n     private String instanceNo;\n     \n     private String unitCode;\n     \n     private String bizNo;\n     \n     private String lastResult;\n     \n     private Map<String, String> variables;\n     \n     private Map<String, Object> serviceConf;\n\n    public String getExecuteExp() {\n        return executeExp;\n    }\n\n    public void setExecuteExp(String executeExp) {\n        this.executeExp = executeExp;\n    }\n\n    public String getRequestContent() {\n        return requestContent;\n    }\n\n    public void setRequestContent(String requestContent) {\n        this.requestContent = requestContent;\n    }\n\n    public String getExecutionNo() {\n        return executionNo;\n    }\n\n    public void setExecutionNo(String executionNo) {\n        this.executionNo = executionNo;\n    }\n\n    public Map<String, Object> getRequestContext() {\n        return requestContext;\n    }\n\n    public void setRequestContext(Map<String, Object> requestContext) {\n        this.requestContext = requestContext;\n    }\n\n    public String getInstanceNo() {\n        return instanceNo;\n    }\n\n    public void setInstanceNo(String instanceNo) {\n        this.instanceNo = instanceNo;\n    }\n\n    public String getUnitCode() {\n        return unitCode;\n    }\n\n    public void setUnitCode(String unitCode) {\n        this.unitCode = unitCode;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    public String getLastResult() {\n        return lastResult;\n    }\n\n    public void setLastResult(String lastResult) {\n        this.lastResult = lastResult;\n    }\n\n    public Map<String, String> getVariables() {\n        return variables;\n    }\n\n    public void setVariables(Map<String, String> variables) {\n        this.variables = variables;\n    }\n\n    public Map<String, Object> getServiceConf() {\n        return serviceConf;\n    }\n\n    public void setServiceConf(Map<String, Object> serviceConf) {\n        this.serviceConf = serviceConf;\n    }\n\n    @Override\n    public String toString() {\n        return \"AsyncCallRealReq [executeExp=\" + executeExp + \", requestContent=\" + requestContent + \", executionNo=\"\n                + executionNo + \", requestContext=\" + requestContext + \", instanceNo=\" + instanceNo + \", unitCode=\"\n                + unitCode + \", bizNo=\" + bizNo + \", lastResult=\" + lastResult + \", variables=\" + variables\n                + \", serviceConf=\" + serviceConf + \"]\";\n    }\n     \n     \n     \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-api/src/main/java/com/jd/easyflow/processunit/spi/client/dto/AsyncCallRealRes.java",
    "content": " package com.jd.easyflow.processunit.spi.client.dto;\n\nimport java.io.Serializable;\nimport java.util.Date;\nimport java.util.Map;\n\n/**\n * @author liyuliang5\n *\n */\n public class AsyncCallRealRes implements Serializable {\n\n     private String result;\n     \n     private String responseContent;\n     \n     private Map<String, String> variables;\n     \n     private Boolean autoRunFlag;\n     \n     private Date nextAutoRunTime;\n     \n     private Map<String, String> clientInfo;\n\n    public String getResult() {\n        return result;\n    }\n\n    public void setResult(String result) {\n        this.result = result;\n    }\n\n    public String getResponseContent() {\n        return responseContent;\n    }\n\n    public void setResponseContent(String responseContent) {\n        this.responseContent = responseContent;\n    }\n\n    public Map<String, String> getVariables() {\n        return variables;\n    }\n\n    public void setVariables(Map<String, String> variables) {\n        this.variables = variables;\n    }\n\n    public Boolean getAutoRunFlag() {\n        return autoRunFlag;\n    }\n\n    public void setAutoRunFlag(Boolean autoRunFlag) {\n        this.autoRunFlag = autoRunFlag;\n    }\n\n    public Date getNextAutoRunTime() {\n        return nextAutoRunTime;\n    }\n\n    public void setNextAutoRunTime(Date nextAutoRunTime) {\n        this.nextAutoRunTime = nextAutoRunTime;\n    }\n    \n    public Map<String, String> getClientInfo() {\n        return clientInfo;\n    }\n\n    public void setClientInfo(Map<String, String> clientInfo) {\n        this.clientInfo = clientInfo;\n    }\n\n    @Override\n    public String toString() {\n        return \"AsyncCallRealRes [result=\" + result + \", responseContent=\" + responseContent + \", variables=\"\n                + variables + \", autoRunFlag=\" + autoRunFlag + \", nextAutoRunTime=\" + nextAutoRunTime + \n                 \", clientInfo=\" + clientInfo + \"]\";\n    }\n\n\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n    xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>easyflow-process</artifactId>\n        <groupId>com.jd.easyflow</groupId>\n        <version>1.7.3</version>\n    </parent>\n    <artifactId>easyflow-process-client</artifactId>\n    <name>easyflow-process-client</name>\n    <packaging>jar</packaging>\n    <properties>\n    </properties>\n    <dependencies>\n            <dependency>\n                <groupId>org.slf4j</groupId>\n                <artifactId>slf4j-api</artifactId>\n            </dependency>    \n            <dependency>\n                <groupId>com.jd.easyflow</groupId>\n                <artifactId>easyflow-flow</artifactId>\n            </dependency>  \n            <dependency>\n                <groupId>com.jd.easyflow</groupId>\n                <artifactId>easyflow-fsm</artifactId>\n            </dependency>               \n            <dependency>\n                <groupId>com.jd.easyflow</groupId>\n                <artifactId>easyflow-flow-bpmn</artifactId>\n            </dependency>     \n            <dependency>\n                <groupId>com.jd.easyflow</groupId>\n                <artifactId>easyflow-flow-extension</artifactId>\n            </dependency>              \n            <dependency>\n                <groupId>com.jd.easyflow</groupId>\n                <artifactId>easyflow-process-api</artifactId>\n            </dependency>  \n\t        <dependency>\n\t            <groupId>com.jd.easyflow</groupId>\n\t            <artifactId>easyflow-process-common</artifactId>\n\t        </dependency>                \n            <dependency>\n                <groupId>com.jd.easyflow</groupId>\n                <artifactId>easyflow-process-common</artifactId>\n            </dependency>    \n\t        <dependency>\n\t            <groupId>org.springframework</groupId>\n\t            <artifactId>spring-tx</artifactId>\n\t            <scope>provided</scope>\n\t        </dependency>                          \n    </dependencies>\n\n</project>"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/codegenerator/client/CodeGenerateHelper.java",
    "content": "package com.jd.easyflow.codegenerator.client;\n\nimport java.time.LocalDate;\nimport java.time.ZoneId;\nimport java.util.Arrays;\nimport java.util.LinkedList;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.codegenerator.adapter.export.CodeGenerateExport;\nimport com.jd.easyflow.codegenerator.adapter.export.dto.BatchGenerateParam;\nimport com.jd.easyflow.codegenerator.adapter.export.dto.BatchGenerateResult;\nimport com.jd.easyflow.codegenerator.adapter.export.dto.GenerateParam;\nimport com.jd.easyflow.codegenerator.adapter.export.dto.GenerateResult;\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponse;\nimport com.jd.easyflow.common.adapter.export.util.ExportResponseUtil;\nimport com.jd.easyflow.objects.factory.ObjectFactorys;\n\n/**\n * @author liyuliang5\n *\n */\npublic class CodeGenerateHelper {\n\n    private static final Logger logger = LoggerFactory.getLogger(CodeGenerateHelper.class);\n\n    public static boolean cache = true;\n\n    public static int batchRequestSize = 100;\n\n    private static Map<String, ObjectIdCache> objectIdCacheMap = new ConcurrentHashMap<>();\n    \n    public static boolean clearByDay = true;\n    \n    private static volatile long currentDayMills = 0;\n    \n    private static final long ONE_DAY_MILLS = 24L * 60 * 60 * 1000;\n\n    public static long clearByDayDelayMills = 10;\n\n    public static String generateCode(String typeId, String codePrefix) {\n        CodeGenerateParam codeGenerator = CodeGenerateParam.builder().typeId(typeId).codePrefix(codePrefix).build();\n        return generateCode(codeGenerator);\n    }\n\n    private static String generateCode(CodeGenerateParam codeGenerator) {\n        if (logger.isDebugEnabled()) {\n            logger.debug(\"Get ID, type:\" + codeGenerator.getTypeId());\n        }\n        if (!cache) {\n            GenerateParam generateParam = GenerateParam.builder().typeId(codeGenerator.getTypeId())\n                    .codePrefix(codeGenerator.getCodePrefix()).build();\n            ExportResponse<GenerateResult> generateRes = ObjectFactorys.getDefault().getObject(CodeGenerateExport.class)\n                    .generateUniqueCode(new ExportRequest<GenerateParam>(generateParam));\n            GenerateResult result = ExportResponseUtil.unwrap(generateRes);\n            return result.getCode();\n        }\n\n        ObjectIdCache cache = objectIdCacheMap.get(codeGenerator.getTypeId());\n        if (cache == null) {\n            cache = new ObjectIdCache();\n            objectIdCacheMap.put(codeGenerator.getTypeId(), cache);\n        }\n        \n        if (clearByDay) {\n            if (System.currentTimeMillis() - currentDayMills >= ONE_DAY_MILLS + clearByDayDelayMills) {\n                if (logger.isDebugEnabled()) {\n                    logger.debug(\"Date change, clear cache\");\n                }\n                currentDayMills = LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant().toEpochMilli();\n                for (ObjectIdCache objectIdCache : objectIdCacheMap.values()) {\n                    objectIdCache.clear();\n                }\n            }\n        }\n        \n        String id = cache.getNext();\n        if (id != null) {\n            if (logger.isDebugEnabled()) {\n                logger.debug(\"Return ID:\" + id);\n            }\n            return id;\n        }\n\n        BatchGenerateParam generateParam = BatchGenerateParam.builder().typeId(codeGenerator.getTypeId())\n                .codePrefix(codeGenerator.getCodePrefix()).batchSize(batchRequestSize).build();\n        ExportResponse<BatchGenerateResult> generateRes = ObjectFactorys.getDefault()\n                .getObject(CodeGenerateExport.class)\n                .batchGenerateUniqueCode(new ExportRequest<BatchGenerateParam>(generateParam));\n        BatchGenerateResult result = ExportResponseUtil.unwrap(generateRes);\n        String[] results = result.getCodes();\n        id = cache.addIdsAndGetNext(results);\n        if (logger.isDebugEnabled()) {\n            logger.debug(\"Return ID:\" + id);\n        }\n        return id;\n\n    }\n\n    public static String[] batchGenerateCode(String typeId, String codePrefix, int batchSize) {\n        CodeGenerateParam codeGenerator = CodeGenerateParam.builder().typeId(typeId).codePrefix(codePrefix)\n                .batchSize(batchSize).build();\n        return batchGenerateCode(codeGenerator);\n    }\n\n    private static String[] batchGenerateCode(CodeGenerateParam codeGenerator) {\n        BatchGenerateParam generateParam = BatchGenerateParam.builder().typeId(codeGenerator.getTypeId())\n                .codePrefix(codeGenerator.getCodePrefix()).batchSize(codeGenerator.getBatchSize()).build();\n        ExportResponse<BatchGenerateResult> generateRes = ObjectFactorys.getDefault()\n                .getObject(CodeGenerateExport.class)\n                .batchGenerateUniqueCode(new ExportRequest<BatchGenerateParam>(generateParam));\n        BatchGenerateResult result = ExportResponseUtil.unwrap(generateRes);\n        return result.getCodes();\n    }\n\n    private static class ObjectIdCache {\n\n        LinkedList<String> cacheList = new LinkedList<>();\n\n        public synchronized String getNext() {\n            return cacheList.poll();\n        }\n\n        public synchronized String addIdsAndGetNext(String[] ids) {\n            cacheList.addAll(Arrays.asList(ids));\n            return cacheList.pop();\n        }\n        \n        public synchronized void clear() {\n            cacheList.clear();\n        }\n\n    }\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/codegenerator/client/CodeGenerateParam.java",
    "content": "package com.jd.easyflow.codegenerator.client;\n\n/**\n * @author liyuliang5\n *\n */\npublic class CodeGenerateParam {\n    \n    public CodeGenerateParam() {\n        \n    }\n    \n    public CodeGenerateParam(String typeId, String codePrefix, int batchSize) {\n        this.typeId = typeId;\n        this.codePrefix = codePrefix;\n        this.batchSize = batchSize;\n    }\n\n    private String typeId;\n\n    private String codePrefix;\n\n    private int batchSize;\n\n    public String getTypeId() {\n        return typeId;\n    }\n\n    public void setTypeId(String typeId) {\n        this.typeId = typeId;\n    }\n\n    public String getCodePrefix() {\n        return codePrefix;\n    }\n\n    public void setCodePrefix(String codePrefix) {\n        this.codePrefix = codePrefix;\n    }\n\n    public int getBatchSize() {\n        return batchSize;\n    }\n\n    public void setBatchSize(int batchSize) {\n        this.batchSize = batchSize;\n    }\n    \n    public static CodeGenerateParam.CodeGenerateParamBuilder builder() {\n        return new CodeGenerateParam.CodeGenerateParamBuilder();\n    }\n    \n\n    public static class CodeGenerateParamBuilder {\n        private String typeId;\n        private String codePrefix;\n        private int batchSize;\n\n        public CodeGenerateParam.CodeGenerateParamBuilder typeId(String typeId) {\n            this.typeId = typeId;\n            return this;\n        }\n\n        public CodeGenerateParam.CodeGenerateParamBuilder codePrefix(String codePrefix) {\n            this.codePrefix = codePrefix;\n            return this;\n        }\n\n        public CodeGenerateParam.CodeGenerateParamBuilder batchSize(int batchSize) {\n            this.batchSize = batchSize;\n            return this;\n        }\n\n        public CodeGenerateParam build() {\n            return new CodeGenerateParam(this.typeId, this.codePrefix, this.batchSize);\n        }\n\n        public String toString() {\n            return \"CodeGenerateParam.CodeGenerateParamBuilder(typeId=\" + this.typeId + \", codePrefix=\"\n                    + this.codePrefix + \", batchSize=\" + this.batchSize + \")\";\n        }\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/common/PropertiesUtil.java",
    "content": "package com.jd.easyflow.process.client.common;\n\nimport java.util.Map;\n\nimport com.jd.easyflow.process.client.runtime.StdNode;\nimport com.jd.easyflow.process.client.runtime.StdNodeContext;\nimport com.jd.easyflow.process.client.runtime.StdProcess;\nimport com.jd.easyflow.process.client.runtime.StdProcessContext;\n\n/**\n * \n * @author liyuliang5\n * \n */\npublic class PropertiesUtil {\n\n    public static <T> T get(Map<String, Object> properties, String key) {\n        if (properties == null) {\n            return null;\n        }\n        return (T) properties.get(key);\n    }\n\n    public static void put(Map<String, Object> properties, String key, Object value) {\n        if (value == null) {\n            properties.remove(key);\n        } else {\n            properties.put(key, value);\n        }\n    }\n\n    /**\n     * \n     * @param <T>\n     * @param key\n     * @param propertiesList\n     * @return\n     */\n    public static <T> T get(String key, Map<String, Object>... propertiesList) {\n        if (propertiesList == null || propertiesList.length == 0) {\n            return null;\n        }\n        for (Map<String, Object> properties : propertiesList) {\n            if (properties != null) {\n                Object value = properties.get(key);\n                if (value != null) {\n                    return (T) value;\n                }\n            }\n        }\n        return null;\n    }\n\n    /**\n     * @param <T>\n     * @param key\n     * @param context\n     * @return\n     */\n    public static <T> T getProcessProperty(String key, StdProcessContext context) {\n        return get(key, context.getProcessProperties(), context.getProcessParamProperties(),\n                context.getProcess() == null ? null : ((StdProcess) context.getProcess()).getProcessProperties());\n    }\n\n    /**\n     * @param <T>\n     * @param key\n     * @param context\n     * @return\n     */\n    public static <T> T getNodeProperty(String key, StdNodeContext context) {\n        return get(key, context.getProcessProperties(), context.getProcessParamProperties(),\n                context.getNode() == null ? null : ((StdNode) context.getNode()).getProcessProperties());\n    }\n\n    /**\n     * @param <T>\n     * @param key\n     * @param nodeContext\n     * @param processContext\n     * @return\n     */\n    public static <T> T getProperty(String key, StdNodeContext nodeContext, StdProcessContext processContext) {\n        Object nodeValue = getNodeProperty(key, nodeContext);\n        if (nodeValue != null) {\n            return (T) nodeValue;\n        }\n        return (T) getProcessProperty(key, processContext);\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/flow/StdFlowEngineImpl.java",
    "content": "package com.jd.easyflow.process.client.flow;\n\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.Objects;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponse;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponseCode;\nimport com.jd.easyflow.common.adapter.export.util.ExportResponseUtil;\nimport com.jd.easyflow.common.exception.EasyFlowException;\nimport com.jd.easyflow.flow.bpmn.BpmnFlowParser;\nimport com.jd.easyflow.flow.engine.impl.FlowEngineImpl;\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.objects.factory.ObjectFactorys;\nimport com.jd.easyflow.process.adapter.export.ProcessDefinitionExport;\nimport com.jd.easyflow.process.adapter.export.dto.definition.ProcessDefinitionDTO;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n * @author liyuliang5\n *\n */\npublic class StdFlowEngineImpl extends FlowEngineImpl {\n    \n    private static final Logger log = LoggerFactory.getLogger(StdFlowEngineImpl.class);\n\n    private static final String AUTO_REPORT = \"AUTO_REPORT\";\n\n    private static final String FLOW_EASY = \"FLOW-easy\";\n    private static final String FLOW_BPMN = \"FLOW-bpmn\";\n\n    /**\n     * key:category\n     */\n    private static final String PROPERTY_KEY_CATEGORY = \"category\";\n    /**\n     * key:bizType\n     */\n    private static final String PROPERTY_KEY_BIZTYPE= \"bizType\";\n\n    private ProcessDefinitionExport processDefinitionExport;\n\n    private boolean localLoad = true;\n    \n    private boolean localPush = false;\n    \n    @Override\n    protected void loadFlow() {\n        if (localLoad) {\n            super.loadFlow();\n            localFlowVersioned();\n        }\n        if (localPush) {\n            localFlowPush();\n        }\n    }\n\n    @Override\n    public Flow getFlow(String flowId) {\n        String wrapperFlowId = null;\n        if (flowId.contains(StdFlowProcessConstants.VERSION_PREFIX)) {\n            wrapperFlowId = flowId;\n        } else {\n             ExportResponse<Integer> response = getProcessDefinitionExport().getLatestProcessDefVersionByDefId(new ExportRequest<>(flowId));\n             if (ExportResponseCode.DATA_EMPTY.getCode().equals(response.getResCode())) {\n                 wrapperFlowId = flowId + StdFlowProcessConstants.VERSION_PREFIX;\n                 if (flowMap.containsKey(wrapperFlowId)) {\n                     return flowMap.get(wrapperFlowId);\n                 } else {\n                     throw new RuntimeException(\"Flow definition \" + flowId + \" not exists\");\n                 }\n             }\n             \n             Integer latestProcessDefVersion = ExportResponseUtil.unwrap(response);\n             wrapperFlowId = wrapperFlowId(flowId, latestProcessDefVersion);\n        }\n        if (flowMap.containsKey(wrapperFlowId)) {\n            return flowMap.get(wrapperFlowId);\n        }\n\n        ProcessDefinitionDTO processDef = ExportResponseUtil\n                .unwrap(getProcessDefinitionExport().getVersionedProcessDefinition(new ExportRequest<>(wrapperFlowId)));\n        if (processDef == null) {\n            log.error(\"Flow definition not exists, flowId:{}\", flowId);\n            throw new RuntimeException(\"Flow definition \" + flowId + \" not exists\");\n        }\n        List<Flow> flowList = getFlowParser().parse(processDef.getJsonContent());\n        for (Flow flow : flowList) {\n            String wrapperId = wrapperFlowId(flow.getId(), processDef.getDefVersion());\n            flow.setId(wrapperId);\n            flowMap.putIfAbsent(wrapperId, flow);\n        }\n        Flow flow = flowList.get(0);\n        return flow;\n    }\n    \n    private void localFlowVersioned() {\n        Map<String, Flow> versionedFlowMap = new HashMap<>();\n        for (Flow flow : flowMap.values()) {\n            if (flow.getId().contains(StdFlowProcessConstants.VERSION_PREFIX)) {\n                throw new EasyFlowException(\"Flow ID:\" + flow.getId() + \" must not contain \" + StdFlowProcessConstants.VERSION_PREFIX);\n            }\n            versionedFlowMap.put(flow.getId() + StdFlowProcessConstants.VERSION_PREFIX, flow);\n        }\n        flowMap.putAll(versionedFlowMap);\n    }\n\n    protected void localFlowPush() {\n        for (Entry<String, Flow> entry : flowMap.entrySet()) {\n            if (! entry.getKey().endsWith(StdFlowProcessConstants.VERSION_PREFIX)) {\n                continue;\n            }\n            Flow flow = entry.getValue();\n            boolean report = processDefReport(flow);\n            if (!report) {\n                if (log.isDebugEnabled()) {\n                    log.debug(\"Flow {} has been reported\", flow.getId());\n                }\n                continue;\n            }\n            String content = flowDefinitionMap.get(flow.getId());\n            if (content == null || content.isEmpty()) {\n                if (log.isDebugEnabled()) {\n                    log.debug(\"Flow definition content is blank:{}\", flow.getId());\n                }\n                continue;\n            }\n            ProcessDefinitionDTO processDef = new ProcessDefinitionDTO();\n            String bpmnString = BpmnFlowParser.bpmnStringify(flow);\n            if (bpmnString != null && ! bpmnString.isEmpty()) {\n                processDef.setContent(bpmnString);\n                processDef.setJsonContent(flow.stringify());\n                processDef.setFormat(FLOW_BPMN);\n            } else {\n                processDef.setContent(content);\n                processDef.setJsonContent(content);\n                processDef.setFormat(FLOW_EASY);\n            }\n            processDef.setCategory(flow.getProperty(PROPERTY_KEY_CATEGORY));\n            processDef.setBizType(flow.getProperty(PROPERTY_KEY_BIZTYPE));\n            processDef.setDefId(flow.getId());\n            processDef.setName(flow.getName());\n            processDef.setContent(content);\n            processDef.setDefSource(AUTO_REPORT);\n            log.info(\"Start report flow definition:{}\", processDef.getDefId());\n            ExportResponse response = getProcessDefinitionExport().reportProcessDef(new ExportRequest<>(processDef));\n            if (!response.isSuccess()) {\n                log.error(\"Report local flow {} exception {}\", processDef.getDefId(), JSON.toJSONString(response));\n                throw new EasyFlowException(\"Report local flow exception\");\n            }\n        }\n    }\n\n    private boolean processDefReport(Flow flow) {\n        ProcessDefinitionDTO processDef = ExportResponseUtil\n                .unwrap(getProcessDefinitionExport().getProcessDefinition(new ExportRequest<>(flow.getId())));\n        if (processDef == null) {\n            return true;\n        }\n        String definitionData = flowDefinitionMap.get(flow.getId());\n        return !Objects.equals(definitionData, processDef.getContent());\n    }\n\n    private String wrapperFlowId(String flowId, Integer latestVersion) {\n        if (latestVersion == null) {\n            return flowId + StdFlowProcessConstants.VERSION_PREFIX;\n        }\n        return flowId + StdFlowProcessConstants.VERSION_PREFIX + latestVersion;\n    }\n\n    private ProcessDefinitionExport getProcessDefinitionExport() {\n        if (processDefinitionExport == null) {\n            processDefinitionExport = ObjectFactorys.getDefault().getObject(ProcessDefinitionExport.class);\n        }\n        return processDefinitionExport;\n    }\n\n    public void setProcessDefinitionService(ProcessDefinitionExport processDefinitionExport) {\n        this.processDefinitionExport = processDefinitionExport;\n    }\n\n    public boolean isLocalLoad() {\n        return localLoad;\n    }\n\n    public void setLocalLoad(boolean localLoad) {\n        this.localLoad = localLoad;\n    }\n\n    public boolean isLocalPush() {\n        return localPush;\n    }\n\n    public void setLocalPush(boolean localPush) {\n        this.localPush = localPush;\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/flow/StdFlowProcessConstants.java",
    "content": "package com.jd.easyflow.process.client.flow;\n\n/**\n * @author liyuliang5\n *\n */\npublic class StdFlowProcessConstants {\n\n    \n    public static final String FLOW_PARAM_INSTANCENO = \"_PROCESS_INSTANCE_NO\";\n    public static final String FLOW_PARAM_INSTANCE_NAME = \"_PROCESS_INSTANCE_NAME\";\n    public static final String FLOW_PARAM_BIZNO = \"_BIZNO\";\n    public static final String FLOW_PARAM_PROCESS_TYPE = \"_PROCESS_TYPE\";\n    public static final String FLOW_PARAM_USER = \"_USER\";\n    public static final String FLOW_PARAM_PRODUCT_CODE = \"_PRODUCT_CODE\";\n    public static final String FLOW_PARAM_KEY_FIELD = \"_KEY_FIELD\";\n\n    public static final String FLOW_PARAM_KEY_FIELD2 = \"_KEY_FIELD2\";\n    public static final String FLOW_PARAM_OP_TYPE = \"_PROCESS_OP_TYPE\";\n    public static final String FLOW_PARAM_BIZ_DATA = \"_PROCESS_BIZ_DATA\";\n    public static final String FLOW_PARAM_BIZ_STATUS = \"_PROCESS_BIZ_STATUS\";\n    \n    public static final String FLOW_PARAM_PROCESS = \"_process\";\n    \n    public static final String FLOW_CTX_PROCESS_CTX = \"_PROCESS_CTX\";\n    public static final String FLOW_CTX_INSTANCENO = \"_PROCESS_INSTANCE_NO\";\n    public static final String FLOW_CTX_INSTANCE_NAME = \"_PROCESS_INSTANCE_NAME\";\n    public static final String FLOW_CTX_BIZNO = \"_BIZNO\";\n    public static final String FLOW_CTX_BIZ_DATA = \"_PROCESS_BIZ_DATA\";\n    public static final String FLOW_CTX_BIZ_STATUS = \"_PROCESS_BIZ_STATUS\";\n    public static final String FLOW_CTX_PROCESS_TYPE = \"_PROCESS_TYPE\";\n    public static final String FLOW_CTX_USER = \"_USER\";\n    public static final String FLOW_CTX_PRODUCT_CODE = \"_PRODUCT_CODE\";\n    public static final String FLOW_CTX_KEY_FIELD = \"_KEY_FIELD\";\n    public static final String FLOW_CTX_KEY_FIELD2 = \"_KEY_FIELD2\";\n    public static final String FLOW_CTX_INSTANCE = \"_PROCESS_INSTANCE\";\n    public static final String FLOW_CTX_OP_TYPE = \"_PROCESS_OP_TYPE\";\n    public static final String FLOW_CTX_PROCESS_EVENT_INFO_CACHE = \"_PROCESS_EVENT_INFO_CACHE\";\n    public static final String FLOW_CTX_PARENT_INSTANCE_NO = \"_PARENT_INSTANCE_NO\";\n    public static final String FLOW_CTX_PARENT_NODE_INSTANCE_NO = \"_PARENT_NODE_INSTANCE_NO\";\n    public static final String FLOW_CTX_IS_SUB_PROCESS = \"_IS_SUB_PROCESS\";\n    public static final String FLOW_CTX_PARENT_CTX = \"_PARENT_CTX\";\n    public static final String FLOW_CTX_PROCESS = \"_process\";\n    public static final String FLOW_NODE_CTX_NODE_CTX = \"_NODE_CTX\";\n    public static final String FLOW_DATA_FLUSH_POLICY = \"dataFlushPolicy\";\n\n    public static final String FLOW_NODE_CTX_PROCESS_EXT_DATA = \"_PROCESS_EXT_DATA\";\n    public static final String FLOW_NODE_CTX_PROCESS_PRE_CHECK_TYPE = \"_PROCESS_PRE_CHECK_TYPE\";\n    public static final String FLOW_NODE_CTX_PROCESS_PRE_CHECK_TYPE_NONE = \"\";\n    public static final String FLOW_NODE_CTX_PROCESS_PRE_CHECK_NODES = \"_PROCESS_PRE_CHECK_NODES\";\n    \n    public static final String FLOW_NODE_CTX_PRE_RESULT = \"_preResult\";\n\n    \n    public static final String FLOW_PROP_PROCESS = \"process\";\n    \n    public static final String OP_TYPE_CREATE = \"CREATE\";\n    public static final String OP_TYPE_EXECUTE = \"EXECUTE\";\n    public static final String OP_TYPE_CREATE_OR_EXECUTE = \"CREATE_OR_EXECUTE\";\n    \n    public static final String VERSION_PREFIX = \"--V_\";\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/flow/StdProcessFlowEngineFilter.java",
    "content": "package com.jd.easyflow.process.client.flow;\n\nimport java.util.Map;\n\nimport com.jd.easyflow.flow.engine.FlowEngine;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.filter.Filter;\nimport com.jd.easyflow.flow.filter.FilterChain;\nimport com.jd.easyflow.flow.util.Pair;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class StdProcessFlowEngineFilter extends StdProcessFlowListener implements Filter<Pair<FlowParam, FlowEngine>, FlowResult> {\n    \n\n\n    @Override\n    public FlowResult doFilter(Pair<FlowParam, FlowEngine> param, FilterChain<Pair<FlowParam, FlowEngine>, FlowResult> chain) {\n        super.onFlowEngineStart(param.getLeft(), param.getRight());\n        return chain.doFilter(param);\n    }\n    \n    protected int order;\n    \n    @Override\n    public int getOrder() {\n        return order;\n    }\n    \n    public void setOrder(int order) {\n        this.order = order;\n    }\n\n    @Override\n    public void postConstruct(Map<String, Object> definition, Map<String, Object> context) {\n        if (definition == null) {\n            return;\n        }\n        Integer order = (Integer) definition.get(\"order\");\n        if (order != null) {\n            this.order = order;\n        }\n    }\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/flow/StdProcessFlowFilter.java",
    "content": "package com.jd.easyflow.process.client.flow;\n\nimport java.util.Map;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.filter.Filter;\nimport com.jd.easyflow.flow.filter.FilterChain;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class StdProcessFlowFilter extends StdProcessFlowListener implements Filter<FlowContext, FlowResult> {\n\n    @Override\n    public FlowResult doFilter(FlowContext context, FilterChain<FlowContext, FlowResult> chain) {\n        super.onFlowStart(context);\n        try {\n            FlowResult result = chain.doFilter(context);\n            context.setResult(result);\n            super.onFlowEnd(context);\n            return context.getResult();\n        } finally {\n            super.onFlowComplete(context);\n        }\n    }\n    \n    protected int order;\n    \n    @Override\n    public int getOrder() {\n        return order;\n    }\n    \n    public void setOrder(int order) {\n        this.order = order;\n    }\n\n    @Override\n    public void postConstruct(Map<String, Object> definition, Map<String, Object> context) {\n        if (definition == null) {\n            return;\n        }\n        Integer order = (Integer) definition.get(\"order\");\n        if (order != null) {\n            this.order = order;\n        }\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/flow/StdProcessFlowListener.java",
    "content": "package com.jd.easyflow.process.client.flow;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Date;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Optional;\nimport java.util.Set;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.adapter.export.util.ExportResponseUtil;\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowEngine;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.event.BaseFlowEventListener;\nimport com.jd.easyflow.flow.engine.event.FlowEvent;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.InitContext;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.NodePreHandler;\nimport com.jd.easyflow.flow.model.node.NodeImpl;\nimport com.jd.easyflow.flow.model.pre.NodePrePropertyGetter;\nimport com.jd.easyflow.flow.util.FlowConstants;\nimport com.jd.easyflow.flow.util.FlowEventTypes;\nimport com.jd.easyflow.flow.util.FlowNodeLinkUtil;\nimport com.jd.easyflow.flow.util.FlowUtil;\nimport com.jd.easyflow.flow.util.Pair;\nimport com.jd.easyflow.fsm.FsmContext;\nimport com.jd.easyflow.fsm.model.TransitionContext;\nimport com.jd.easyflow.fsm.util.FsmConstants;\nimport com.jd.easyflow.objects.factory.ObjectFactorys;\nimport com.jd.easyflow.process.adapter.export.ProcessInstanceExport;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessInstanceDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.QueryProcessInstanceReq;\nimport com.jd.easyflow.process.client.common.PropertiesUtil;\nimport com.jd.easyflow.process.client.fsm.StdFsmProcessConstants;\nimport com.jd.easyflow.process.client.runtime.ProcessRuntimeService;\nimport com.jd.easyflow.process.client.runtime.StdNode;\nimport com.jd.easyflow.process.client.runtime.StdNodeContext;\nimport com.jd.easyflow.process.client.runtime.StdProcess;\nimport com.jd.easyflow.process.client.runtime.StdProcessConstants;\nimport com.jd.easyflow.process.client.runtime.StdProcessContext;\n\n/**\n * \n * @author liyuliang5\n * \n */\npublic class StdProcessFlowListener extends BaseFlowEventListener {\n    \n    private static final Logger log = LoggerFactory.getLogger(StdProcessFlowListener.class);\n\n\n    private static final Pair<String, Integer>[] DEFAULT_ACCEPTED_EVENTS = new Pair[] {\n            Pair.of(FlowEventTypes.FLOW_ENGINE_START, FlowConstants.EVENT_ORDER_START + 100),\n            Pair.of(FlowEventTypes.FLOW_START, FlowConstants.EVENT_ORDER_START + 100),\n            Pair.of(FlowEventTypes.NODE_START, FlowConstants.EVENT_ORDER_START + 100),\n            Pair.of(FlowEventTypes.NODE_END, -FlowConstants.EVENT_ORDER_START - 100),\n            Pair.of(FlowEventTypes.FLOW_END, -FlowConstants.EVENT_ORDER_START - 100),\n            Pair.of(FlowEventTypes.FLOW_COMPLETE, -FlowConstants.EVENT_ORDER_START - 100) };\n   \n\n    private ProcessRuntimeService processRuntimeService;\n\n    private ProcessInstanceExport processInstanceExport;\n    \n    public StdProcessFlowListener() {\n        acceptedEvents = DEFAULT_ACCEPTED_EVENTS;\n    }\n    \n    @Override\n    public void on(FlowEvent flowEvent) {\n        switch (flowEvent.getType()) {\n        case FlowEventTypes.FLOW_ENGINE_START: {\n            onFlowEngineStart(flowEvent);\n            break;\n        }\n        case FlowEventTypes.FLOW_START: {\n            onFlowStart(flowEvent);\n            break;\n        }\n        case FlowEventTypes.NODE_START: {\n            onNodeStart(flowEvent);\n            break;\n        }\n        case FlowEventTypes.NODE_END: {\n            onNodeEnd(flowEvent);\n            break;\n        }\n        case FlowEventTypes.FLOW_END: {\n            onFlowEnd(flowEvent);\n            break;\n        }\n        case FlowEventTypes.FLOW_COMPLETE: {\n            onFlowComplete(flowEvent);\n            break;\n        }\n        default:\n            break;\n        }\n\n    }\n\n    public void onFlowEngineStart(FlowEvent event) {\n        FlowParam param = event.getMapData(\"param\");\n        FlowEngine flowEngine = (FlowEngine) event.getMapData(\"flowEngine\");\n        onFlowEngineStart(param, flowEngine);\n    }\n\n    public void onFlowEngineStart(FlowParam param, FlowEngine flowEngine) {\n        if (param != null && param.getFlowId() == null) {\n            String processType = param.get(StdFlowProcessConstants.FLOW_PARAM_PROCESS_TYPE);\n            String bizNo = param.get(StdFlowProcessConstants.FLOW_PARAM_BIZNO);\n            String instanceNo = param.get(StdFlowProcessConstants.FLOW_PARAM_INSTANCENO);\n            ProcessInstanceDTO processInstanceDto = null;\n            if (instanceNo != null) {\n                processInstanceDto = ExportResponseUtil\n                        .unwrap(getProcessInstanceExport().getProcessInstance(new ExportRequest<>(instanceNo)));\n            } else if (processType != null && bizNo != null) {\n                QueryProcessInstanceReq instanceReq = QueryProcessInstanceReq.builder().processType(processType)\n                        .bizNo(bizNo).build();\n                processInstanceDto = ExportResponseUtil.unwrap(getProcessInstanceExport()\n                        .queryProcessInstanceByProcessTypeAndBizNo(new ExportRequest<>(instanceReq)));\n            }\n            if (processInstanceDto != null) {\n                String flowId = processInstanceDto.getProcessDefId().substring(\"FLOW-\".length());\n                if (flowEngine != null && (flowEngine instanceof StdFlowEngineImpl)) {\n                    if (!flowId.contains(StdFlowProcessConstants.VERSION_PREFIX)) {\n                        flowId = flowId + StdFlowProcessConstants.VERSION_PREFIX;\n                    }\n                }\n                param.setFlowId(flowId);\n            }\n        }\n\n        \n    }\n\n    public void onFlowStart(FlowEvent event) {\n        onFlowStart(event.getContext());\n    }\n\n    public void onFlowStart(FlowContext context) {\n        StdProcessContext processContext = new StdProcessContext();\n        context.put(StdFlowProcessConstants.FLOW_CTX_PROCESS_CTX, processContext);\n        processContext.setEngineProcessContext(context);\n        \n        processContext.setProcessParamProperties(context.getParam().get(StdFlowProcessConstants.FLOW_PROP_PROCESS));\n        StdProcess process = new StdProcess();\n        process.setProcessProperties(context.getFlow().getProperty(StdFlowProcessConstants.FLOW_PROP_PROCESS));\n        process.putExtProperty(StdProcessConstants.EXT_PROP_ENGINE, StdProcessConstants.ENGINE_FLOW);\n        processContext.setProcess(process);\n        fillProcessContextData(context);\n        processContext.setSubProcess(Boolean.TRUE.equals(context.get(StdFlowProcessConstants.FLOW_CTX_IS_SUB_PROCESS)));\n        if (processContext.isSubProcess() && Boolean.TRUE.equals(PropertiesUtil\n                .get(processContext.getProcess().getProcessProperties(), StdProcessConstants.PROP_DATA_FLUSH_BY_PARENT))) {\n            StdProcessContext parentProcessContext = context.get(StdFlowProcessConstants.FLOW_CTX_PARENT_CTX);\n            processContext.setCache(parentProcessContext.getCache());\n        }\n        processContext.setOpType(context.get(StdFlowProcessConstants.FLOW_CTX_OP_TYPE));\n        ProcessInstanceDTO instance = new ProcessInstanceDTO();\n        fillProcessInstanceField(instance, context);\n        processContext.setProcessType(instance.getProcessType());\n        processContext.setBizNo(instance.getBizNo());\n        String requestId = processRuntimeService.lockProcessInstance(instance.getProcessType(), instance.getBizNo());\n        processContext.setLockRequestId(requestId);\n        Boolean checkStartNode = PropertiesUtil.get(StdProcessConstants.PROP_CHECK_START_NODE,\n                context.get(StdFlowProcessConstants.FLOW_CTX_PROCESS),\n                context.getParam().get(StdFlowProcessConstants.FLOW_PARAM_PROCESS),\n                context.getFlow().getProperty(StdFlowProcessConstants.FLOW_PROP_PROCESS));\n        checkStartNode = checkStartNode == null || checkStartNode;\n        processContext.setCheckStartNode(checkStartNode);\n        \n        processContext.setProcessProperties(assembleProcessProperties(context));\n        \n        String processDefId = StdProcessConstants.PROCESS_DEF_FLOW + context.getFlowId();\n        if (context.getFlowEngine() instanceof StdFlowEngineImpl) {\n            if (processDefId.endsWith(StdFlowProcessConstants.VERSION_PREFIX)) {\n                processDefId = processDefId.substring(0,\n                        processDefId.length() - StdFlowProcessConstants.VERSION_PREFIX.length());\n            }\n        }\n        instance.setProcessDefId(processDefId);\n        processContext.setNodeFunction(nodeId -> {\n            StdNode node = new StdNode();\n            node.setProcessProperties(\n                    context.getFlow().getNode(nodeId).getProperty(StdFlowProcessConstants.FLOW_PROP_PROCESS));\n            return node;\n        });\n\n        processContext.setStartNodesFunction(processInstance -> {\n            if (processInstance != null && StdProcessConstants.STATUS_CLOSE.equals(processInstance.getStatus())) {\n                String exeucteClosePoliy = PropertiesUtil.get(\n                        context.getFlow().getProperty(StdFlowProcessConstants.FLOW_PROP_PROCESS),\n                        StdProcessConstants.PROP_EXECUTE_CLOSE_POLICY);\n                if (StdProcessConstants.POLICY_EMPTY_RUN.equals(exeucteClosePoliy)) {\n                    log.info(\"Process instance finish, empty run\");\n                    context.getParam().setNodeIds(new String[] {});\n                    return new ArrayList<String>();\n                }\n            }\n            if (context.getParam().getNodeIds() != null) {\n                return Arrays.asList(context.getParam().getNodeIds());\n            } else if (processInstance != null) {\n                Set<String> openNodeIds = processRuntimeService.getManager().findOpenNodeIds(processContext);\n                if (openNodeIds.size() > 0) {\n                    context.getParam().setNodeIds(openNodeIds.toArray(new String[] {}));\n                    return new ArrayList<String>(openNodeIds);\n                } else {\n                    List<String> startNodeList = (List<String>) processContext.getProcessProperties()\n                            .get(StdProcessConstants.PROP_START_NODE_IDS);\n                    if (startNodeList != null && ! startNodeList.isEmpty()) {\n                        context.getParam().setNodeIds(startNodeList.toArray(new String[] {}));\n                    }\n                    return startNodeList;\n                }\n            } else {\n                List<String> startNodeList = (List<String>) processContext.getProcessProperties()\n                        .get(StdProcessConstants.PROP_START_NODE_IDS);\n                if (startNodeList != null && ! startNodeList.isEmpty()) {\n                    context.getParam().setNodeIds(startNodeList.toArray(new String[] {}));\n                }\n                return startNodeList;\n            }\n        });\n        processContext.setVariableSetter(variables -> {\n            context.put(StdProcessConstants.CTX_VARIABLES, variables);\n        });\n        processContext.setVariableGetter(() -> {\n            return (Map<String, String>) context.get(StdProcessConstants.CTX_VARIABLES);\n        });\n        processContext.setNodeVariableGetter(stdNodeContext -> {\n            NodeContext nodeContext = stdNodeContext.getEngineNodeContext();\n            return nodeContext.get(StdProcessConstants.NODE_CTX_VARIABLES);\n        });\n        processContext.setNodeVariableSetter(pair -> {\n            StdNodeContext stdNodeContext = pair.getLeft();\n            NodeContext nodeContext = stdNodeContext.getEngineNodeContext();\n            nodeContext.put(StdProcessConstants.NODE_CTX_VARIABLES, pair.getRight());\n        });\n        processContext.setEventTriggerFunction(param -> {\n            Object[] params = (Object[]) param;\n            context.getFlow().triggerEvent((String) params[0], params[1], context, false);\n            return null;\n        });\n        processContext.setNodeStartEventPolicy(StdProcessConstants.NODE_START_EVENT_POLICY_ACTIVE);\n        processRuntimeService.processStartExec(instance, processContext);\n        ProcessInstanceDTO processInstance = processRuntimeService.getProcessInstance(processContext);\n        context.put(StdFlowProcessConstants.FLOW_CTX_INSTANCE, processInstance);\n    }\n\n    private void fillProcessContextData(FlowContext context) {\n        FlowParam param = context.getParam();\n        if (context.get(StdFlowProcessConstants.FLOW_CTX_INSTANCENO) == null\n                && param.get(StdFlowProcessConstants.FLOW_PARAM_INSTANCENO) != null) {\n            context.put(StdFlowProcessConstants.FLOW_CTX_INSTANCENO,\n                    param.get(StdFlowProcessConstants.FLOW_PARAM_INSTANCENO));\n        }\n        if (context.get(StdFlowProcessConstants.FLOW_CTX_INSTANCE_NAME) == null\n                && param.get(StdFlowProcessConstants.FLOW_PARAM_INSTANCE_NAME) != null) {\n            context.put(StdFlowProcessConstants.FLOW_CTX_INSTANCE_NAME,\n                    param.get(StdFlowProcessConstants.FLOW_PARAM_INSTANCE_NAME));\n        }\n        if (context.get(StdFlowProcessConstants.FLOW_CTX_BIZNO) == null\n                && param.get(StdFlowProcessConstants.FLOW_PARAM_BIZNO) != null) {\n            context.put(StdFlowProcessConstants.FLOW_CTX_BIZNO, param.get(StdFlowProcessConstants.FLOW_PARAM_BIZNO));\n        }\n        if (context.get(StdFlowProcessConstants.FLOW_CTX_PROCESS_TYPE) == null\n                && param.get(StdFlowProcessConstants.FLOW_PARAM_PROCESS_TYPE) != null) {\n            context.put(StdFlowProcessConstants.FLOW_CTX_PROCESS_TYPE,\n                    param.get(StdFlowProcessConstants.FLOW_PARAM_PROCESS_TYPE));\n        }\n        if (context.get(StdFlowProcessConstants.FLOW_CTX_USER) == null\n                && param.get(StdFlowProcessConstants.FLOW_PARAM_USER) != null) {\n            context.put(StdFlowProcessConstants.FLOW_CTX_USER, param.get(StdFlowProcessConstants.FLOW_PARAM_USER));\n        }\n        if (context.get(StdFlowProcessConstants.FLOW_CTX_PRODUCT_CODE) == null\n                && param.get(StdFlowProcessConstants.FLOW_PARAM_PRODUCT_CODE) != null) {\n            context.put(StdFlowProcessConstants.FLOW_CTX_PRODUCT_CODE,\n                    param.get(StdFlowProcessConstants.FLOW_PARAM_PRODUCT_CODE));\n        }\n        if (context.get(StdFlowProcessConstants.FLOW_CTX_KEY_FIELD) == null\n                && param.get(StdFlowProcessConstants.FLOW_PARAM_KEY_FIELD) != null) {\n            context.put(StdFlowProcessConstants.FLOW_CTX_KEY_FIELD,\n                    param.get(StdFlowProcessConstants.FLOW_PARAM_KEY_FIELD));\n        }\n        if (context.get(StdFlowProcessConstants.FLOW_CTX_KEY_FIELD2) == null\n                && param.get(StdFlowProcessConstants.FLOW_PARAM_KEY_FIELD2) != null) {\n            context.put(StdFlowProcessConstants.FLOW_CTX_KEY_FIELD2,\n                    param.get(StdFlowProcessConstants.FLOW_PARAM_KEY_FIELD2));\n        }\n        if (context.get(StdFlowProcessConstants.FLOW_CTX_BIZ_DATA) == null\n                && param.get(StdFlowProcessConstants.FLOW_PARAM_BIZ_DATA) != null) {\n            context.put(StdFlowProcessConstants.FLOW_CTX_BIZ_DATA,\n                    param.get(StdFlowProcessConstants.FLOW_PARAM_BIZ_DATA));\n        }\n        if (context.get(StdFlowProcessConstants.FLOW_CTX_BIZ_STATUS) == null\n                && param.get(StdFlowProcessConstants.FLOW_PARAM_BIZ_STATUS) != null) {\n            context.put(StdFlowProcessConstants.FLOW_CTX_BIZ_STATUS,\n                    param.get(StdFlowProcessConstants.FLOW_PARAM_BIZ_STATUS));\n        }\n        if (context.get(StdFlowProcessConstants.FLOW_CTX_OP_TYPE) == null\n                && param.get(StdFlowProcessConstants.FLOW_PARAM_OP_TYPE) != null) {\n            context.put(StdFlowProcessConstants.FLOW_CTX_OP_TYPE,\n                    param.get(StdFlowProcessConstants.FLOW_PARAM_OP_TYPE));\n        }\n        if (context.get(StdFlowProcessConstants.FLOW_CTX_PARENT_INSTANCE_NO) == null) {\n            String parentInstanceNoOfParam = param.get(StdFlowProcessConstants.FLOW_CTX_PARENT_INSTANCE_NO);\n            if (parentInstanceNoOfParam != null) {\n                context.put(StdFlowProcessConstants.FLOW_CTX_PARENT_INSTANCE_NO, parentInstanceNoOfParam);\n            } else if (context.getParentContext() != null) {\n                StdProcessContext stdProcessContext = context.getParentContext().get(StdFlowProcessConstants.FLOW_CTX_PROCESS_CTX);\n                if (stdProcessContext != null) {\n                    context.put(StdFlowProcessConstants.FLOW_CTX_PARENT_INSTANCE_NO,\n                            stdProcessContext.getInstanceNo());\n                    context.put(StdFlowProcessConstants.FLOW_CTX_IS_SUB_PROCESS, true);\n                    context.put(StdFlowProcessConstants.FLOW_CTX_PARENT_CTX, stdProcessContext);\n                }\n            }    else {\n                Object parentContext = context.get(FlowConstants.CTX_PARENT_CONTEXT);\n                if (parentContext != null) {\n                    if (parentContext instanceof FlowContext) {\n                        StdProcessContext stdProcessContext = ((FlowContext) parentContext)\n                                .get(StdFlowProcessConstants.FLOW_CTX_PROCESS_CTX);\n                        if (stdProcessContext != null) {\n                            context.put(StdFlowProcessConstants.FLOW_CTX_PARENT_INSTANCE_NO,\n                                    stdProcessContext.getInstanceNo());\n                            context.put(StdFlowProcessConstants.FLOW_CTX_IS_SUB_PROCESS, true);\n                            context.put(StdFlowProcessConstants.FLOW_CTX_PARENT_CTX, stdProcessContext);\n                        }\n                    } else if (parentContext instanceof FsmContext) {\n                        StdProcessContext stdProcessContext = ((FsmContext) parentContext)\n                                .getData(StdFsmProcessConstants.FSM_CTX_PROCESS_CTX);\n                        if (stdProcessContext != null) {\n                            context.put(StdFlowProcessConstants.FLOW_CTX_PARENT_INSTANCE_NO,\n                                    stdProcessContext.getInstanceNo());\n                            context.put(StdFlowProcessConstants.FLOW_CTX_IS_SUB_PROCESS, true);\n                            context.put(StdFlowProcessConstants.FLOW_CTX_PARENT_CTX, stdProcessContext);\n                        }\n                    } else {\n                        throw new IllegalArgumentException(\"Parent context class type error,\" + parentContext.getClass());\n                    }\n                }\n            }\n        }\n        if (context.get(StdFlowProcessConstants.FLOW_CTX_PARENT_NODE_INSTANCE_NO) == null) {\n            String parentNodeInstanceNoOfParam = param.get(StdFlowProcessConstants.FLOW_CTX_PARENT_NODE_INSTANCE_NO);\n            if (parentNodeInstanceNoOfParam != null) {\n                context.put(StdFlowProcessConstants.FLOW_CTX_PARENT_NODE_INSTANCE_NO, parentNodeInstanceNoOfParam);\n            } else if (context.getParentNodeContext() != null) {\n                NodeContext parentNodeContext = context.getParentNodeContext();\n                StdNodeContext stdNodeContext = parentNodeContext.get(StdFlowProcessConstants.FLOW_NODE_CTX_NODE_CTX);\n                if (stdNodeContext != null) {\n                    context.put(StdFlowProcessConstants.FLOW_CTX_PARENT_NODE_INSTANCE_NO,\n                            stdNodeContext.getNodeInstanceNo());\n                }\n            } else {\n                NodeContext parentNodeContext = context.get(FlowConstants.CTX_PARENT_NODE_CONTEXT);\n                if (parentNodeContext != null) {\n                    StdNodeContext stdNodeContext = parentNodeContext\n                            .get(StdFlowProcessConstants.FLOW_NODE_CTX_NODE_CTX);\n                    if (stdNodeContext != null) {\n                        context.put(StdFlowProcessConstants.FLOW_CTX_PARENT_NODE_INSTANCE_NO,\n                                stdNodeContext.getNodeInstanceNo());\n                    }\n                } else {\n                    TransitionContext fsmParentTransitionContext = context.get(FsmConstants.CTX_PARENT_TRANSITION_CONTEXT);\n                    if (fsmParentTransitionContext != null) {\n                        StdNodeContext stdNodeContext = fsmParentTransitionContext\n                                .get(StdFsmProcessConstants.FSM_TST_CTX_NODE_CTX);\n                        if (stdNodeContext != null) {\n                            context.put(StdFlowProcessConstants.FLOW_CTX_PARENT_NODE_INSTANCE_NO,\n                                    stdNodeContext.getNodeInstanceNo());\n                        }\n                    }\n                }\n            }\n        }\n        \n\n        \n    }\n\n    private void fillProcessInstanceField(ProcessInstanceDTO instance, FlowContext context) {\n        instance.setInstanceNo(context.get(StdFlowProcessConstants.FLOW_CTX_INSTANCENO));\n        instance.setInstanceName(context.get(StdFlowProcessConstants.FLOW_CTX_INSTANCE_NAME));\n        instance.setBizNo(context.get(StdFlowProcessConstants.FLOW_CTX_BIZNO));\n        instance.setProcessType(context.get(StdFlowProcessConstants.FLOW_CTX_PROCESS_TYPE));\n        instance.setCreator(context.get(StdFlowProcessConstants.FLOW_CTX_USER));\n        instance.setProductCode(context.get(StdFlowProcessConstants.FLOW_CTX_PRODUCT_CODE));\n        instance.setKeyField(context.get(StdFlowProcessConstants.FLOW_CTX_KEY_FIELD));\n        instance.setKeyField2(context.get(StdFlowProcessConstants.FLOW_CTX_KEY_FIELD2));\n        instance.setBizData(context.get(StdFlowProcessConstants.FLOW_CTX_BIZ_DATA));\n        instance.setBizStatus(context.get(StdFlowProcessConstants.FLOW_CTX_BIZ_STATUS));\n        instance.setParentInstanceNo(context.get(StdFlowProcessConstants.FLOW_CTX_PARENT_INSTANCE_NO));\n        instance.setParentNodeInstanceNo(context.get(StdFlowProcessConstants.FLOW_CTX_PARENT_NODE_INSTANCE_NO));\n    }\n\n    public void onNodeStart(FlowEvent event) {\n        com.jd.easyflow.flow.model.NodeContext flowNodeContext = (com.jd.easyflow.flow.model.NodeContext) event\n                .getData();\n        onNodeStart(flowNodeContext, event.getContext());\n    }\n\n    public void onNodeStart(NodeContext flowNodeContext, FlowContext context) {\n        StdProcessContext processContext = context.get(StdFlowProcessConstants.FLOW_CTX_PROCESS_CTX);\n        String currentNodeId = flowNodeContext.getNodeId();\n        FlowNode currentNode = context.getFlow().getNode(currentNodeId);\n        NodeContext previousNodeCtx = flowNodeContext.getPreviousNode();\n        StdNodeContext nodeContext = new StdNodeContext();\n        nodeContext.setStdProcessContext(processContext);\n        nodeContext.setNodeId(currentNodeId);\n        String event = flowNodeContext.get(FlowConstants.NODE_CONTEXT_DATA_EVENT);\n        nodeContext.setEventId(event);\n        nodeContext.setEngineNodeContext(flowNodeContext);\n        flowNodeContext.put(StdFlowProcessConstants.FLOW_NODE_CTX_NODE_CTX, nodeContext);\n        StdNode node = new StdNode();\n        node.setProcessProperties(currentNode.getProperty(StdFlowProcessConstants.FLOW_PROP_PROCESS));\n        nodeContext.setNode(node);\n\n        nodeContext\n                .setPreviousNodeId(previousNodeCtx == null || previousNodeCtx.getNodeId().equals(currentNodeId) ? null\n                        : previousNodeCtx.getNodeId());\n        nodeContext.setExecutionStartTime(new Date());\n        nodeContext.setExtData(flowNodeContext.get(StdFlowProcessConstants.FLOW_NODE_CTX_PROCESS_EXT_DATA));\n\n        List<String> configPreNodes = flowNodeContext.get(StdFlowProcessConstants.FLOW_NODE_CTX_PROCESS_PRE_CHECK_NODES);\n        if (configPreNodes == null) {\n            if (currentNode instanceof NodeImpl) {\n                NodePreHandler preHandler = ((NodeImpl) currentNode).getPreHandler();\n                if (preHandler != null && preHandler instanceof NodePrePropertyGetter) {\n                    configPreNodes = ((NodePrePropertyGetter) preHandler).getPreNodes(flowNodeContext, context);\n                }\n            }\n        }\n        if (configPreNodes == null) {\n            configPreNodes = FlowNodeLinkUtil.getPreCheckNodes(currentNode, context.getFlow());\n        }\n        String preCheckType = flowNodeContext.get(StdFlowProcessConstants.FLOW_NODE_CTX_PROCESS_PRE_CHECK_TYPE);\n        if (preCheckType == null) {\n            preCheckType = FlowNodeLinkUtil.getPreCheckType(flowNodeContext.getNodeId(), context.getFlow());\n        }\n        if (configPreNodes != null && configPreNodes.size() > 0 && (preCheckType == null || FlowNodeLinkUtil.NODE_PRE_CHECK_TYPE_UNKNOWN.equals(preCheckType))) {\n            preCheckType = FlowConstants.NODE_PRE_CHECK_TYPE_MULTICHECK;\n        }\n        preCheckType = StdFlowProcessConstants.FLOW_NODE_CTX_PROCESS_PRE_CHECK_TYPE_NONE.equals(preCheckType) ? null : preCheckType;\n        \n        nodeContext.setConfigPreNodeIds(configPreNodes);\n        nodeContext.setPreCheckType(preCheckType);\n        processRuntimeService.nodeStartExec(nodeContext, processContext);\n        if (preCheckType != null) {\n            flowNodeContext.put(StdFlowProcessConstants.FLOW_NODE_CTX_PRE_RESULT, nodeContext.getPreResult());\n        }\n    }\n\n    public void onNodeEnd(FlowEvent event) {\n        com.jd.easyflow.flow.model.NodeContext flowNodeContext = (com.jd.easyflow.flow.model.NodeContext) event\n                .getData();\n        onNodeEnd(flowNodeContext, event.getContext());\n    }\n\n    public void onNodeEnd(NodeContext nodeCtx, FlowContext context) {\n        StdProcessContext processContext = context.get(StdFlowProcessConstants.FLOW_CTX_PROCESS_CTX);\n        StdNodeContext nodeContext = nodeCtx.get(StdFlowProcessConstants.FLOW_NODE_CTX_NODE_CTX);\n        com.jd.easyflow.flow.model.NodeContext[] nextNodes = nodeCtx.getNextNodes();\n        String[] nextNodeIds = null;\n        if (nextNodes != null && nextNodes.length > 0) {\n            nextNodeIds = new String[nextNodes.length];\n            for (int i = 0; i < nextNodes.length; i++) {\n                nextNodeIds[i] = nextNodes[i].getNodeId();\n            }\n        }\n        nodeContext.setActionResult(nodeCtx.getActionResult());\n        nodeContext.setNextNodeIds(nextNodeIds);\n        if (processContext.getBizNo() == null) {\n            processContext.setBizNo(context.get(StdFlowProcessConstants.FLOW_CTX_BIZNO));\n        }\n        if (context.isInterrupted()) {\n            processContext.setInterrupted();\n        }\n        processRuntimeService.nodeEndExec(nodeContext, processContext);\n    }\n\n    public void onFlowEnd(FlowEvent event) {\n        onFlowEnd(event.getContext());\n    }\n\n    public void onFlowEnd(FlowContext context) {\n        StdProcessContext processContext = context.get(StdFlowProcessConstants.FLOW_CTX_PROCESS_CTX);\n        if (context.isInterrupted()) {\n            processContext.setInterrupted();\n        }\n        processRuntimeService.processEndExec(processContext);\n    }\n\n    public void onFlowComplete(FlowEvent event) {\n        onFlowComplete(event.getContext());\n    }\n\n    public void onFlowComplete(FlowContext context) {\n        StdProcessContext processContext = context.get(StdFlowProcessConstants.FLOW_CTX_PROCESS_CTX);\n        processRuntimeService.processCompleteExec(processContext);\n    }\n\n    private Map<String, Object> assembleProcessProperties(FlowContext context) {\n        Map<String, Object> properties = new ConcurrentHashMap<String, Object>();\n        Map<String, Object> ctxProperties = context.get(StdFlowProcessConstants.FLOW_CTX_PROCESS);\n        if (ctxProperties != null) {\n            properties.putAll(ctxProperties);\n        }\n        String dataFlushPolicy = initDataFlushPolicy(context);\n        properties.put(StdProcessConstants.PROP_DATA_FLUSH_POLICY, dataFlushPolicy);\n\n        boolean checkFlushNodes = Boolean.TRUE\n                .equals(PropertiesUtil.get(context.getFlow().getProperty(StdFlowProcessConstants.FLOW_PROP_PROCESS),\n                        StdProcessConstants.PROP_CHECK_FLUSH_NODES));\n        properties.put(StdProcessConstants.PROP_CHECK_FLUSH_NODES, checkFlushNodes);\n        if (checkFlushNodes) {\n            String[] flushNodes = initFlushNodes(context);\n            PropertiesUtil.put(properties, StdProcessConstants.PROP_FLUSH_NODES, flushNodes);\n        }\n        initStartAndEndNodeIds(context, properties);\n\n        Map<String, Object> processInstanceStatusMessage = PropertiesUtil.get(\n                context.getFlow().getProperty(StdFlowProcessConstants.FLOW_PROP_PROCESS),\n                StdProcessConstants.PROP_PROCESS_INSTANCE_STATUS_MESSAGE);\n        if (processInstanceStatusMessage != null) {\n            properties.put(StdProcessConstants.PROP_PROCESS_INSTANCE_STATUS_MESSAGE, processInstanceStatusMessage);\n        }\n        Map<String, Object> nodeInstanceStatusMessage = PropertiesUtil.get(\n                context.getFlow().getProperty(StdFlowProcessConstants.FLOW_PROP_PROCESS),\n                StdProcessConstants.PROP_NODE_INSTANCE_STATUS_MESSAGE);\n        if (nodeInstanceStatusMessage != null) {\n            properties.put(StdProcessConstants.PROP_NODE_INSTANCE_STATUS_MESSAGE, nodeInstanceStatusMessage);\n        }\n        if (log.isDebugEnabled()) {\n            log.debug(\"Assemble process context properties:\" + properties);\n        }\n        return properties;\n    }\n\n    private String initDataFlushPolicy(FlowContext context) {\n        String flushPolicy = PropertiesUtil.get(StdProcessConstants.PROP_DATA_FLUSH_POLICY,\n                context.get(StdFlowProcessConstants.FLOW_CTX_PROCESS),\n                context.getParam().get(StdFlowProcessConstants.FLOW_PARAM_PROCESS),\n                context.getFlow().getProperty(StdFlowProcessConstants.FLOW_PROP_PROCESS));\n        if (flushPolicy == null) {\n            flushPolicy = StdProcessConstants.FLUSH_AFTER_PROCESS;\n        }\n        return flushPolicy;\n    }\n\n    private String[] initFlushNodes(FlowContext context) {\n        List<String> list = new ArrayList<String>();\n        context.getFlow().getNodeList().forEach(node -> {\n            if (Boolean.TRUE.equals(PropertiesUtil.get(node.getProperty(StdFlowProcessConstants.FLOW_PROP_PROCESS),\n                    StdProcessConstants.PROP_FLUSH))) {\n                list.add(node.getId());\n            }\n        });\n        return list.toArray(new String[] {});\n    }\n\n    private void initStartAndEndNodeIds(FlowContext context, Map<String, Object> properties) {\n        List<String> startNodeIds = Optional.ofNullable(context.getFlow().getStartNodeIds())\n                .map(ids -> Arrays.asList(ids)).orElse(new ArrayList<>());\n        List<String> endNodeIds = new ArrayList<String>();\n        context.getFlow().getNodeList().forEach(node -> {\n            if (Boolean.TRUE.equals(node.getProperty(StdProcessConstants.PROP_END))) {\n                endNodeIds.add(node.getId());\n            }\n        });\n        properties.put(StdProcessConstants.PROP_START_NODE_IDS, startNodeIds);\n        properties.put(StdProcessConstants.PROP_END_NODE_IDS, endNodeIds);\n    }\n\n    public ProcessRuntimeService getProcessRuntimeService() {\n        return processRuntimeService;\n    }\n\n    public void setProcessRuntimeService(ProcessRuntimeService processRuntimeService) {\n        this.processRuntimeService = processRuntimeService;\n    }\n\n    private ProcessInstanceExport getProcessInstanceExport() {\n        if (processInstanceExport == null) {\n            processInstanceExport = ObjectFactorys.getDefault().getObject(ProcessInstanceExport.class);\n        }\n        return processInstanceExport;\n    }\n    \n    \n    @Override\n    public void init(InitContext initContext, Object parent) {}\n    \n    @Override\n    public void postConstruct(Map<String, Object> definition, Map<String, Object> context) {}\n    \n    @Override\n    public void destroy() {}\n\n    public void setProcessInstanceExport(ProcessInstanceExport processInstanceExport) {\n        this.processInstanceExport = processInstanceExport;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/flow/StdProcessFlowNodeFilter.java",
    "content": "package com.jd.easyflow.process.client.flow;\n\nimport java.util.Map;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.filter.Filter;\nimport com.jd.easyflow.flow.filter.FilterChain;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.util.Triple;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class StdProcessFlowNodeFilter extends StdProcessFlowListener\n        implements Filter<Triple<FlowNode, NodeContext, FlowContext>, NodeContext> {\n\n    @Override\n    public NodeContext doFilter(Triple<FlowNode, NodeContext, FlowContext> request,\n            FilterChain<Triple<FlowNode, NodeContext, FlowContext>, NodeContext> chain) {\n        super.onNodeStart(request.getMiddle(), request.getRight());\n        NodeContext nodeContext = chain.doFilter(request);\n        super.onNodeEnd(request.getMiddle(), request.getRight());\n        return nodeContext;\n    }\n    \n    protected int order;\n    \n    @Override\n    public int getOrder() {\n        return order;\n    }\n    \n    public void setOrder(int order) {\n        this.order = order;\n    }\n\n    @Override\n    public void postConstruct(Map<String, Object> definition, Map<String, Object> context) {\n        if (definition == null) {\n            return;\n        }\n        Integer order = (Integer) definition.get(\"order\");\n        if (order != null) {\n            this.order = order;\n        }\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/flow/asyncnode/CreateAsyncProcessUnitNodeAction.java",
    "content": "package com.jd.easyflow.process.client.flow.asyncnode;\n\nimport java.text.ParseException;\nimport java.text.SimpleDateFormat;\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.UUID;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.ext.serialize.FlowParamAssembleData;\nimport com.jd.easyflow.flow.ext.serialize.FlowParamAssembleManager;\nimport com.jd.easyflow.flow.ext.serialize.FlowParamSerializeManager;\nimport com.jd.easyflow.flow.ext.serialize.impl.DefaultFlowParamAssembler;\nimport com.jd.easyflow.flow.ext.serialize.impl.JsonFlowParamSerializer;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.util.FlowConstants;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessInstanceDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessNodeInstanceDTO;\nimport com.jd.easyflow.process.client.common.PropertiesUtil;\nimport com.jd.easyflow.process.client.flow.StdFlowProcessConstants;\nimport com.jd.easyflow.process.client.flow.util.StdProcessFlowUtil;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitCreateReq;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitCreateRes;\nimport com.jd.easyflow.processunit.client.ProcessUnitHelper;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n * \n */\npublic class CreateAsyncProcessUnitNodeAction implements NodeAction {\n    \n    private static final String DEFAULT_UNIT_CODE = \"EASYFLOW_NODE_ASYNC\";\n    \n    private static final String NEXT_AUTO_RUN_TIME_NOW = \"-1\";\n    \n    private String defaultFlowParamSerializerClass = JsonFlowParamSerializer.class.getName();\n    \n    @Override\n    public ProcessUnitCreateRes execute(NodeContext nodeContext, FlowContext context) {\n        Map<String, Object> nodeProperties =  context.getFlow().getNode(nodeContext.getNodeId()).getProperties();\n        Map<String, Object> nodeAsyncConfig = (Map<String, Object>) nodeProperties.get(\"async\");\n        Map<String, Object> flowAsyncConfig = (Map<String, Object>) context.getFlow().getProperty(\"async\");\n        \n        ProcessUnitCreateReq req = new ProcessUnitCreateReq();\n        // unitCode\n        String unitCode = PropertiesUtil.get(\"unitCode\", nodeAsyncConfig, flowAsyncConfig);\n        if (unitCode == null) {\n            unitCode = DEFAULT_UNIT_CODE;\n        }\n        req.setUnitCode(unitCode);\n        req.setAutoRunFlag(true);\n        req.setRequestNo(UUID.randomUUID().toString());\n        // nextAutoRunTime\n        Date nextAutoRunTime = null;\n        String nextAutoRunTimeStr = (String) PropertiesUtil.get(\"nextAutoRuntime\", nodeAsyncConfig, flowAsyncConfig);\n        if (nextAutoRunTimeStr != null) {\n            if (nextAutoRunTimeStr.equals(NEXT_AUTO_RUN_TIME_NOW)) {\n                nextAutoRunTime = new Date();\n            } else {\n                try {\n                    nextAutoRunTime = new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\").parse(nextAutoRunTimeStr);\n                } catch (ParseException e) {\n                    throw new IllegalArgumentException(\"nextAutoRunTime illegal \" + nextAutoRunTimeStr);\n                }\n            }\n        }\n        if (nextAutoRunTime == null) {\n            Integer nextAutoRunTimeDelaySeconds = PropertiesUtil.get(\"nextAutoRunTimeDelaySeconds\", nodeAsyncConfig, flowAsyncConfig);\n            if (nextAutoRunTimeDelaySeconds != null) {\n                nextAutoRunTime = new Date(System.currentTimeMillis() + nextAutoRunTimeDelaySeconds);\n            }\n        }\n        if (nextAutoRunTime == null) {\n            String nextAutoRunTimeExp = PropertiesUtil.get(\"nextAutoRunTimeExp\", nodeAsyncConfig, flowAsyncConfig);\n            nextAutoRunTime = context.getElEvaluator().eval(nextAutoRunTimeExp, nodeContext, context, null);\n        }\n        if (nextAutoRunTime == null) {\n            throw new IllegalArgumentException(\"nextAutoRunTime is null\");\n        }\n        // productCode\n        ProcessInstanceDTO processInstance = StdProcessFlowUtil.getCachedProcessInstance(context);\n        if (processInstance != null) {\n            req.setProductCode(processInstance.getProductCode());\n        } else {\n            req.setProductCode(context.get(StdFlowProcessConstants.FLOW_CTX_PRODUCT_CODE));\n        }\n        // bizNo\n        String bizNo = null;\n        String bizNoExp = PropertiesUtil.get(\"bizNoExp\", nodeAsyncConfig, flowAsyncConfig);\n        if (bizNoExp != null) {\n            bizNo = context.getElEvaluator().eval(bizNoExp, nodeContext, context, null);\n        } else {\n           ProcessNodeInstanceDTO processNodeInstance = StdProcessFlowUtil.getCachedNodeInstance(nodeContext, context);\n           if (processNodeInstance != null) {\n               bizNo = processNodeInstance.getNodeInstanceNo();\n           } else {\n               bizNo = req.getRequestNo();\n           }\n        }\n        req.setBizNo(bizNo);\n        // requestContent.\n        Map<String, Object> contentMap = new HashMap<String, Object>();\n        if (processInstance != null) {\n            contentMap.put(\"instanceNo\", processInstance.getInstanceNo());\n            contentMap.put(\"processType\", processInstance.getProcessType());\n            contentMap.put(\"bizNo\", processInstance.getBizNo());\n        }\n        \n        contentMap.put(\"nodeId\", nodeContext.getNodeId());\n        contentMap.put(\"flowId\", context.getFlowId());\n        \n        \n        \n        String flowParamAssemblerClass = PropertiesUtil.get(\"flowParamAssemblerClass\", nodeAsyncConfig, flowAsyncConfig);\n        if (flowParamAssemblerClass == null) {\n            flowParamAssemblerClass = DefaultFlowParamAssembler.class.getName();\n        }\n        Map<String, Object> assembleConfig = PropertiesUtil.get(\"flowParamAssembleConfig\", nodeAsyncConfig, flowAsyncConfig);\n        FlowParamAssembleData data = new FlowParamAssembleData();\n        data.setFlowContext(context);\n        data.setNodeContext(nodeContext);\n        FlowParam flowParam = FlowParamAssembleManager.getInstance().assemble(flowParamAssemblerClass, data, assembleConfig);\n        flowParam.put(FlowConstants.PARAM_DATA_EVENT, \"ASYNC\");\n\n        \n        String flowParamSerializerClass = PropertiesUtil.get(\"flowParamSerializerClass\", nodeAsyncConfig, flowAsyncConfig);\n        if (flowParamSerializerClass == null) {\n            flowParamSerializerClass = defaultFlowParamSerializerClass;\n        }\n        Map<String, Object> serializeConfig = PropertiesUtil.get(\"flowParamSerializeConfig\", nodeAsyncConfig, flowAsyncConfig);\n        String flowParamStr = FlowParamSerializeManager.getInstance().serialize(flowParamSerializerClass, flowParam, serializeConfig);\n        contentMap.put(\"flowParamStr\", flowParamStr);\n        contentMap.put(\"flowParamSerializerClass\", flowParamSerializerClass);\n        contentMap.put(\"flowParamSerializeConfig\", serializeConfig);\n        \n        req.setRequestContent(JSON.toJSONString(contentMap));\n        req.setParentNo(null);\n        req.setVariables(null);\n        ProcessUnitCreateRes res = ProcessUnitHelper.create(req);\n        return res;\n    }\n\n    public String getDefaultFlowParamSerializerClass() {\n        return defaultFlowParamSerializerClass;\n    }\n\n    public void setDefaultFlowParamSerializerClass(String defaultFlowParamSerializerClass) {\n        this.defaultFlowParamSerializerClass = defaultFlowParamSerializerClass;\n    }\n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/flow/asyncnode/ExecuteAsyncProcessUnitNodeEl.java",
    "content": "package com.jd.easyflow.process.client.flow.asyncnode;\n\nimport java.util.Map;\n\nimport com.jd.easyflow.flow.engine.FlowEngine;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.ext.serialize.FlowParamSerializeManager;\nimport com.jd.easyflow.processunit.client.bean.ExecParam;\nimport com.jd.easyflow.processunit.client.bean.ExecResult;\nimport com.jd.easyflow.processunit.client.util.ProcessUnitConstants;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n * @author liyuliang5\n */\npublic class ExecuteAsyncProcessUnitNodeEl {\n    \n    private FlowEngine flowEngine;\n\n    public ExecResult execute(ExecParam param) {\n        Map<String, Object> contentMap = JSON.parseObject(param.getRequestContent(), Map.class);\n        String flowParamStr = (String) contentMap.get(\"flowParamStr\");\n        String flowParamSerializeClas = (String) contentMap.get(\"flowParamSerializerClass\");\n        Map<String, Object> serializeConfig = (Map<String, Object>) contentMap.get(\"flowParamSerializeConfig\");\n        FlowParam flowParam = FlowParamSerializeManager.getInstance().deserialize(flowParamSerializeClas, flowParamStr, serializeConfig);\n        FlowResult flowResult = flowEngine.execute(flowParam);\n        ExecResult result = new ExecResult();\n        result.setResult(ProcessUnitConstants.RESULT_SUCCESS);\n        return result;\n    }\n\n    public FlowEngine getFlowEngine() {\n        return flowEngine;\n    }\n\n    public void setFlowEngine(FlowEngine flowEngine) {\n        this.flowEngine = flowEngine;\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/flow/compensate/StdProcessCompensateFlowFilter.java",
    "content": "package com.jd.easyflow.process.client.flow.compensate;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.filter.FilterChain;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.action.compensate.CompensateFlowFilter;\nimport com.jd.easyflow.flow.model.action.compensate.CompensateHelper;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessNodeInstanceDTO;\nimport com.jd.easyflow.process.client.flow.util.StdProcessFlowUtil;\nimport com.jd.easyflow.process.client.runtime.ProcessRuntimeManager;\nimport com.jd.easyflow.process.client.runtime.StdProcessConstants;\nimport com.jd.easyflow.process.client.runtime.StdProcessContext;\nimport com.jd.easyflow.process.client.util.StdProcessUtil;\n\n/**\n * @author liyuliang5\n */\npublic class StdProcessCompensateFlowFilter extends CompensateFlowFilter {\n    \n    private ProcessRuntimeManager processRuntimeManager;\n\n    public StdProcessCompensateFlowFilter() {\n        \n    }\n    \n    public StdProcessCompensateFlowFilter(int order) {\n        this.order = order;\n    }\n\n    @Override\n    public FlowResult doFilter(FlowContext context, FilterChain<FlowContext, FlowResult> chain) {\n        StdProcessContext processContext = StdProcessFlowUtil.getStdProcessContext(context);\n        if (Boolean.TRUE.toString().equals(processContext.getVariable(StdProcessConstants.PROCESS_VAR_COMPENSATE_FLAG))) {\n            CompensateHelper.compensate(context);\n        } else if (CompensateHelper.isCompensating(context)) {\n            processContext.putVariable(StdProcessConstants.PROCESS_VAR_COMPENSATE_FLAG, Boolean.TRUE.toString());\n            List<ProcessNodeInstanceDTO> openNodeInstances = processRuntimeManager.findOpenNodeInstances(processContext);\n            List<NodeContext> startNodes = new ArrayList<NodeContext>(openNodeInstances.size());\n            for (ProcessNodeInstanceDTO openNodeInstance : openNodeInstances) {\n                NodeContext nodeContext = StdProcessCompensateHelper.createCompensateNode(openNodeInstance.getNodeInstanceNo(), processContext, processRuntimeManager);\n                startNodes.add(nodeContext);\n            }\n            context.setStartNodes(startNodes);\n            \n        }\n        FlowResult result = chain.doFilter(context);\n        if (CompensateHelper.isCompensating(context)) {\n            List<ProcessNodeInstanceDTO> list = processRuntimeManager.findAllNodeInstances(processContext);\n            boolean allCompensated = true;\n            for (ProcessNodeInstanceDTO nodeInstance : list) {\n                boolean compenateNodeFlag = Boolean.TRUE.toString().equals(StdProcessUtil.getNodeInstanceVar(StdProcessConstants.NODE_VAR_COMPENSATE_NODE_FLAG, nodeInstance));\n                boolean compensatedFlag = Boolean.TRUE.toString().equals(StdProcessUtil.getNodeInstanceVar(StdProcessConstants.NODE_VAR_COMPENSATED_FLAG, nodeInstance));\n                if (! compenateNodeFlag && ! compensatedFlag) {\n                    allCompensated = false;\n                    break;\n                }\n            }\n            if (allCompensated) {\n                processContext.putVariable(StdProcessConstants.PROCESS_VAR_COMPENSATED_FLAG, Boolean.TRUE.toString());\n            }\n        }\n        return result;\n    }\n\n    public ProcessRuntimeManager getProcessRuntimeManager() {\n        return processRuntimeManager;\n    }\n\n    public void setProcessRuntimeManager(ProcessRuntimeManager processRuntimeManager) {\n        this.processRuntimeManager = processRuntimeManager;\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/flow/compensate/StdProcessCompensateHelper.java",
    "content": "package com.jd.easyflow.process.client.flow.compensate;\n\nimport java.util.ArrayList;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.action.compensate.CompensateHelper;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessNodeInstanceDTO;\nimport com.jd.easyflow.process.client.flow.StdFlowProcessConstants;\nimport com.jd.easyflow.process.client.flow.util.StdProcessFlowUtil;\nimport com.jd.easyflow.process.client.runtime.ProcessRuntimeManager;\nimport com.jd.easyflow.process.client.runtime.StdNodeContext;\nimport com.jd.easyflow.process.client.runtime.StdProcessContext;\n\n/**\n * @author liyuliang5\n */\npublic class StdProcessCompensateHelper {\n\n    static final String FLOW_CONTEXT_COMPENSATE_END_NODES_FLAG = \"_PROCESS_COMPENSATE_END_NODES_FLAG\";\n\n    \n    static final String NODE_CONTEXT_COMPENSATE_NODE_FLAG = \"_PROCESS_COMPENSATE_NODE_FLAG\";\n    static final String NODE_CONTEXT_COMPENSATE_FOR = \"_PROCESS_COMPENSATE_FOR\";\n\n    public static NodeContext createCompensateNode(NodeContext nodeContext, ProcessRuntimeManager manager) {\n         StdNodeContext stdNodeContext = StdProcessFlowUtil.getStdNodeContext(nodeContext);\n         return createCompensateNode(stdNodeContext.getNodeInstanceNo(), stdNodeContext.getStdProcessContext(), manager);\n    }\n    \n    \n    public static NodeContext createCompensateNode(String nodeInstanceNo, StdProcessContext processContext, ProcessRuntimeManager manager) {\n        ProcessNodeInstanceDTO nodeInstance = manager.getNodeInstance(nodeInstanceNo, processContext);\n        NodeContext nodeCtx = new NodeContext(nodeInstance.getNodeId());\n        nodeCtx.put(NODE_CONTEXT_COMPENSATE_NODE_FLAG, true);\n        nodeCtx.put(NODE_CONTEXT_COMPENSATE_FOR, nodeInstanceNo);\n        nodeCtx.put(StdFlowProcessConstants.FLOW_NODE_CTX_PROCESS_PRE_CHECK_TYPE, StdFlowProcessConstants.FLOW_NODE_CTX_PROCESS_PRE_CHECK_TYPE_NONE);\n        nodeCtx.put(StdFlowProcessConstants.FLOW_NODE_CTX_PROCESS_PRE_CHECK_NODES, new ArrayList(0));\n        \n        return nodeCtx;\n    }\n    \n    public static FlowResult compensateFlow(FlowContext context) {\n        FlowParam compensateParam = new FlowParam();\n        CompensateHelper.compensate(context);\n        compensateParam.setContext(context);\n        FlowResult compensateResult = context.getFlowEngine().execute(compensateParam);\n        return compensateResult;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/flow/compensate/StdProcessCompensateNodeFilter.java",
    "content": "package com.jd.easyflow.process.client.flow.compensate;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.filter.FilterChain;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.NodeContextAccessor;\nimport com.jd.easyflow.flow.model.action.compensate.CompensateAction;\nimport com.jd.easyflow.flow.model.action.compensate.CompensateHelper;\nimport com.jd.easyflow.flow.model.action.compensate.CompensateNodeFilter;\nimport com.jd.easyflow.flow.model.node.NodeImpl;\nimport com.jd.easyflow.flow.util.FlowConstants;\nimport com.jd.easyflow.flow.util.LockUtil;\nimport com.jd.easyflow.flow.util.Triple;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessNodeInstanceDTO;\nimport com.jd.easyflow.process.client.flow.util.StdProcessFlowUtil;\nimport com.jd.easyflow.process.client.runtime.ProcessRuntimeManager;\nimport com.jd.easyflow.process.client.runtime.StdNodeContext;\nimport com.jd.easyflow.process.client.runtime.StdProcessConstants;\nimport com.jd.easyflow.process.client.runtime.StdProcessContext;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n * \n */\npublic class StdProcessCompensateNodeFilter extends CompensateNodeFilter {\n\n    private static final Logger logger = LoggerFactory.getLogger(StdProcessCompensateNodeFilter.class);\n    \n    private ProcessRuntimeManager processRuntimeManager;\n    \n    public StdProcessCompensateNodeFilter() {\n        \n    }\n    \n    public StdProcessCompensateNodeFilter(int order) {\n        this.order = order;\n    }\n\n    @Override\n    public NodeContext doFilter(Triple<FlowNode, NodeContext, FlowContext> request,\n            FilterChain<Triple<FlowNode, NodeContext, FlowContext>, NodeContext> chain) {\n        FlowContext context = request.getRight();\n        NodeContext nodeContext = request.getMiddle();\n        if (! Boolean.TRUE.equals(nodeContext.get(StdProcessCompensateHelper.NODE_CONTEXT_COMPENSATE_NODE_FLAG))) {\n            // Normal scenario.\n            NodeContext newNodeContext = chain.doFilter(request);\n            newNodeContext.put(StdProcessCompensateNodeFilter.class.getName(), true);\n            if (CompensateHelper.isCompensating(context)) {\n                Object lockObj = LockUtil.getFlowContextLock(\"_std_process_compensate_end_nodes_lock\", context);\n                synchronized (lockObj) {\n                    StdNodeContext stdNodeContext = StdProcessFlowUtil.getStdNodeContext(newNodeContext);\n                    StdProcessContext processContext = StdProcessFlowUtil.getStdProcessContext(context);\n                    // post to previous node.\n                    List<NodeContext> compensatedNextNodes = new ArrayList<NodeContext>();\n                    // current node previous nodes.\n                    compensatedNextNodes.add(StdProcessCompensateHelper.createCompensateNode(newNodeContext, processRuntimeManager));\n                    // add end nodes.\n                    if (!Boolean.TRUE.equals(context.get(StdProcessCompensateHelper.FLOW_CONTEXT_COMPENSATE_END_NODES_FLAG))) {\n                        processContext.putVariable(StdProcessConstants.PROCESS_VAR_COMPENSATE_FLAG, Boolean.TRUE.toString());\n                        List<String> processNodeInstanceList = getEndNodes(context, processRuntimeManager);\n                        for (String nodeInstanceNo : processNodeInstanceList) {\n                            if (!nodeInstanceNo.equals(stdNodeContext.getNodeInstanceNo())) {\n                                compensatedNextNodes.add(StdProcessCompensateHelper.createCompensateNode(nodeInstanceNo, processContext, processRuntimeManager));\n                            }\n                        }\n                        context.put(StdProcessCompensateHelper.FLOW_CONTEXT_COMPENSATE_END_NODES_FLAG, true);\n                    }\n                    NodeContextAccessor.setNextNodes(newNodeContext, compensatedNextNodes.toArray(new NodeContext[compensatedNextNodes.size()]));\n                }\n            }\n            return newNodeContext; \n            \n        } else {\n            // Compensate scenario.\n            NodeImpl nodeImpl = (NodeImpl) context.getFlow().getNode(nodeContext.getNodeId());\n            StdProcessContext processContext = StdProcessFlowUtil.getStdProcessContext(context);\n            String originalNodeInstanceNo = nodeContext.get(StdProcessCompensateHelper.NODE_CONTEXT_COMPENSATE_FOR);\n            StdNodeContext stdNodeContext = StdProcessFlowUtil.getStdNodeContext(nodeContext);\n            stdNodeContext.putVariable(StdProcessConstants.NODE_VAR_COMPENSATE_NODE_FLAG, Boolean.TRUE.toString());\n            stdNodeContext.putVariable(StdProcessConstants.NODE_VAR_COMPENSATE_FOR, originalNodeInstanceNo);\n            ProcessNodeInstanceDTO originProcessNodeInstance = processRuntimeManager.getNodeInstance(originalNodeInstanceNo, processContext);\n            \n            Object lockObj = LockUtil.getFlowContextLock(\"_node_instance_no_lock_\" + originalNodeInstanceNo, context);\n            synchronized (lockObj) {\n                boolean compensatedFlag = Boolean.TRUE.toString().equals(getVar(StdProcessConstants.NODE_VAR_COMPENSATED_FLAG, originProcessNodeInstance));\n                if (compensatedFlag) {\n                    return nodeContext;\n                }\n                // Judge compensate\n                String nextNodeInstancesStr = originProcessNodeInstance.getNextNodeInstances();\n                String[] nextNodeInstanceNos = nextNodeInstancesStr == null ? null : nextNodeInstancesStr.split(\",\");\n    \n                if (nextNodeInstanceNos != null && nextNodeInstanceNos.length > 0) {\n                    String notCompensated = null;\n                    for (String nextNodeInstanceNo : nextNodeInstanceNos) {\n                        if (nextNodeInstanceNo.equals(stdNodeContext.getNodeInstanceNo())) {\n                            continue;\n                        }\n                        ProcessNodeInstanceDTO processNodeInstance = processRuntimeManager.getNodeInstance(nextNodeInstanceNo, processContext);\n                        boolean flag = Boolean.TRUE.toString().equals(getVar(StdProcessConstants.NODE_VAR_COMPENSATED_FLAG, processNodeInstance));\n                        if (!flag) {\n                            notCompensated = nextNodeInstanceNo;\n                            break;\n                        }\n                    }\n                    if (notCompensated != null) {\n                        if (context.isLogOn() && logger.isInfoEnabled()) {\n                            logger.info(\"Next nodes of \" + originalNodeInstanceNo + \":\" + nodeContext.getNodeId() + \" not all compensated:\" + notCompensated);\n                        }\n                        return nodeContext;\n                    }\n                }\n                \n                // Execute compensate action\n\n                    // NOOP\n                if (StdProcessConstants.NODE_STATUS_INACTIVE.equals(originProcessNodeInstance.getStatus())) {\n                    putVar(StdProcessConstants.NODE_VAR_COMPENSATED_BY, stdNodeContext.getNodeInstanceNo(), originProcessNodeInstance, processContext);\n                    putVar(StdProcessConstants.NODE_VAR_COMPENSATED_FLAG, Boolean.TRUE.toString(), originProcessNodeInstance, processContext);\n                } else {\n                    NodeAction nodeAction = nodeImpl.getAction();\n                    Object compensateResult = null;\n                    NodeAction compensateNodeAction = (NodeAction) nodeImpl.getProperty(FlowConstants.PROP_RUNTIME_COMPENSATE_ACTION);\n                    if (compensateNodeAction != null) {\n                        if (context.isLogOn() && logger.isInfoEnabled()) {\n                            logger.info(\"compensate using NodeAction:\" + compensateNodeAction.getClass());\n                        }\n                        compensateResult = compensateNodeAction.execute(nodeContext, context);\n                    } else if (nodeAction instanceof CompensateAction) {\n                        if (context.isLogOn() && logger.isInfoEnabled()) {\n                            logger.info(\"compensate using CompensateAction\");\n                        }\n                        compensateResult = ((CompensateAction) nodeAction).compensate(nodeContext, context);\n                    }\n                    NodeContextAccessor.setActionResult(nodeContext, compensateResult);\n                    putVar(StdProcessConstants.NODE_VAR_COMPENSATED_BY, stdNodeContext.getNodeInstanceNo(), originProcessNodeInstance, processContext);\n                    putVar(StdProcessConstants.NODE_VAR_COMPENSATED_FLAG, Boolean.TRUE.toString(), originProcessNodeInstance, processContext);\n                }\n                \n                // post to previous node.\n                String previousNodeInstancesStr = originProcessNodeInstance.getPreviousNodeInstances();\n                String[] previousNodeInstances = previousNodeInstancesStr == null ? null : previousNodeInstancesStr.split(\",\");\n                if (previousNodeInstances == null) {\n                    NodeContextAccessor.setNextNodes(nodeContext, null);\n                } else {\n                    NodeContext[] previouses = new NodeContext[previousNodeInstances.length];\n                    for (int i = 0; i < previousNodeInstances.length; i++) {\n                        previouses[i] = StdProcessCompensateHelper.createCompensateNode(previousNodeInstances[i], processContext, processRuntimeManager);\n                    }\n                    NodeContextAccessor.setNextNodes(nodeContext, previouses);\n    \n                    \n                }\n                return nodeContext;\n            }\n        } \n    }\n\n\n    private List<String> getEndNodes(FlowContext context, ProcessRuntimeManager manager) {\n        \n        StdProcessContext processContext = StdProcessFlowUtil.getStdProcessContext(context);\n        List<ProcessNodeInstanceDTO> openNodeInstances = manager.findOpenNodeInstances(processContext);\n        Set<String> nodeInstanceNos = new HashSet<String>();\n        for (ProcessNodeInstanceDTO nodeInstance : openNodeInstances) {\n            nodeInstanceNos.add(nodeInstance.getNodeInstanceNo());\n        }\n        excludeRunningNode(nodeInstanceNos, context);\n        return new ArrayList(nodeInstanceNos);\n    }\n    \n    private void excludeRunningNode(Set<String> nodeInstanceNos, FlowContext context) {\n        for (NodeContext startNodeContext : context.getStartNodes()) {\n            excludeRunningNode(nodeInstanceNos, startNodeContext);\n        }\n    }\n    \n   private void excludeRunningNode(Set<String> nodeInstanceNos, NodeContext nodeContext) {\n        StdNodeContext stdNodeContext = StdProcessFlowUtil.getStdNodeContext(nodeContext);\n        nodeInstanceNos.remove(stdNodeContext.getNodeInstanceNo());\n        if (nodeContext.getNextNodes() != null && nodeContext.getNextNodes().length > 0) {\n            for (NodeContext nodeCtx : nodeContext.getNextNodes()) {\n                excludeRunningNode(nodeInstanceNos, nodeCtx);\n            }\n        }\n    }\n    \n    private String getVar(String key, ProcessNodeInstanceDTO processNodeInstance) {\n        String varsString = processNodeInstance.getVars();\n        if (varsString == null) {\n            return null;\n        }\n        Map<String, String> vars = JSON.parseObject(varsString, Map.class);\n        return vars.get(key);\n     }\n    \n    private void putVar(String key, String value, ProcessNodeInstanceDTO processNodeInstanceDTO, StdProcessContext processContext) {\n        Map<String, String> vars = JSON.parseObject(processNodeInstanceDTO.getVars(), Map.class);\n        if (vars == null) {\n            vars = new HashMap<String, String>();\n        }\n        vars.put(key, value);\n        processNodeInstanceDTO.setVars(JSON.toJSONString(vars));\n        processRuntimeManager.updateNodeInstance(processNodeInstanceDTO, processContext);\n    }\n\n    public ProcessRuntimeManager getProcessRuntimeManager() {\n        return processRuntimeManager;\n    }\n\n    public void setProcessRuntimeManager(ProcessRuntimeManager processRuntimeManager) {\n        this.processRuntimeManager = processRuntimeManager;\n    }\n    \n     \n}\n  \n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/flow/eventinfo/StdFlowProcessEventInfoListener.java",
    "content": "package com.jd.easyflow.process.client.flow.eventinfo;\n\nimport com.jd.easyflow.flow.engine.event.BaseFlowEventListener;\nimport com.jd.easyflow.flow.engine.event.FlowEvent;\nimport com.jd.easyflow.flow.util.FlowConstants;\nimport com.jd.easyflow.flow.util.Pair;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessInstanceDTO;\nimport com.jd.easyflow.process.client.flow.StdFlowProcessConstants;\nimport com.jd.easyflow.process.client.runtime.StdProcessConstants;\nimport com.jd.easyflow.process.client.runtime.eventinfo.ProcessEventInfoCache;\nimport com.jd.easyflow.process.client.runtime.eventinfo.ProcessEventInfoListener;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class StdFlowProcessEventInfoListener extends BaseFlowEventListener {\n\n    private ProcessEventInfoListener processEventInfoListener;\n\n    private static final Pair<String, Integer>[] DEFAULT_ACCEPTED_EVENTS = new Pair[] {\n            Pair.of(StdProcessConstants.EVENT_PROCESS_INSTANCE_START, FlowConstants.EVENT_ORDER_START),\n            Pair.of(StdProcessConstants.EVENT_PROCESS_INSTANCE_END, -FlowConstants.EVENT_ORDER_START),\n            Pair.of(StdProcessConstants.EVENT_NODE_INSTANCE_START, FlowConstants.EVENT_ORDER_START),\n            Pair.of(StdProcessConstants.EVENT_NODE_INSTANCE_END, -FlowConstants.EVENT_ORDER_START),\n            Pair.of(StdProcessConstants.EVENT_TXN_FLUSH_START, FlowConstants.EVENT_ORDER_START),\n            Pair.of(StdProcessConstants.EVENT_TXN_FLUSH_END, -FlowConstants.EVENT_ORDER_START) };\n\n    \n    public StdFlowProcessEventInfoListener() {\n        this.processEventInfoListener = new ProcessEventInfoListener();\n        acceptedEvents = DEFAULT_ACCEPTED_EVENTS;\n    }\n    \n    public StdFlowProcessEventInfoListener(ProcessEventInfoListener processEventInfoListener) {\n        this.processEventInfoListener = processEventInfoListener;\n    }\n\n    @Override\n    public void on(FlowEvent flowEvent) {\n        switch (flowEvent.getType()) {\n        case StdProcessConstants.EVENT_PROCESS_INSTANCE_START: {\n            ProcessEventInfoCache cache = getEventInfoCache(flowEvent);\n            processEventInfoListener.onProcessInstanceStart((ProcessInstanceDTO) flowEvent.getData(), cache);\n            break;\n        }\n        case StdProcessConstants.EVENT_PROCESS_INSTANCE_END: {\n            ProcessEventInfoCache cache = getEventInfoCache(flowEvent);\n            processEventInfoListener.onProcessInstanceEnd((ProcessInstanceDTO) flowEvent.getData(), cache);\n            break;\n        }\n        case StdProcessConstants.EVENT_NODE_INSTANCE_START: {\n            ProcessEventInfoCache cache = getEventInfoCache(flowEvent);\n            processEventInfoListener.onNodeInstanceStart((Object[]) flowEvent.getData(), cache);\n            break;\n        }\n        case StdProcessConstants.EVENT_NODE_INSTANCE_END: {\n            ProcessEventInfoCache cache = getEventInfoCache(flowEvent);\n            processEventInfoListener.onNodeInstanceEnd((Object[]) flowEvent.getData(), cache);\n            break;\n        }\n        case StdProcessConstants.EVENT_TXN_FLUSH_START: {\n            ProcessEventInfoCache cache = getEventInfoCache(flowEvent);\n            processEventInfoListener.onTxnFlushStart(cache);\n            break;\n        }\n        case StdProcessConstants.EVENT_TXN_FLUSH_END: {\n            ProcessEventInfoCache container = getEventInfoCache(flowEvent);\n            processEventInfoListener.onTxnFlushEnd(container);\n            break;\n        }\n        default:\n            break;\n        }\n\n    }\n\n    private ProcessEventInfoCache getEventInfoCache(FlowEvent event) {\n        ProcessEventInfoCache cache = event.getContext().get(StdFlowProcessConstants.FLOW_CTX_PROCESS_EVENT_INFO_CACHE);\n        if (cache == null) {\n            synchronized (event.getContext()) {\n                cache = event.getContext().get(StdFlowProcessConstants.FLOW_CTX_PROCESS_EVENT_INFO_CACHE);\n                if (cache == null) {\n                    cache = new ProcessEventInfoCache();\n                    event.getContext().put(StdFlowProcessConstants.FLOW_CTX_PROCESS_EVENT_INFO_CACHE, cache);\n                }\n            }\n\n        }\n        return cache;\n    }\n\n    public ProcessEventInfoListener getNodeInstanceStatusListener() {\n        return processEventInfoListener;\n    }\n\n    public void setNodeInstanceStatusListener(ProcessEventInfoListener nodeInstanceStatusListener) {\n        this.processEventInfoListener = nodeInstanceStatusListener;\n    }\n\n    public void setAcceptedEvents(Pair<String, Integer>[] acceptedEvents) {\n        this.acceptedEvents = acceptedEvents;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/flow/flowretry/FlowRetryEl.java",
    "content": "package com.jd.easyflow.process.client.flow.flowretry;\n\nimport java.util.Map;\n\nimport com.jd.easyflow.flow.engine.FlowEngine;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.ext.serialize.FlowParamSerializeManager;\nimport com.jd.easyflow.processunit.client.bean.ExecParam;\nimport com.jd.easyflow.processunit.client.bean.ExecResult;\nimport com.jd.easyflow.processunit.client.util.ProcessUnitConstants;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n * @author liyuliang5\n */\npublic class FlowRetryEl {\n\n    private FlowEngine flowEngine;\n\n    public ExecResult execute(ExecParam param) {\n        Map<String, Object> contentMap = JSON.parseObject(param.getRequestContent(), Map.class);\n        String flowParamStr = (String) contentMap.get(\"flowParamStr\");\n        String flowParamSerializeClas = (String) contentMap.get(\"flowParamSerializerClass\");\n        Map<String, Object> serializeConfig = (Map<String, Object>) contentMap.get(\"flowParamSerializeConfig\");\n        FlowParam flowParam = FlowParamSerializeManager.getInstance().deserialize(flowParamSerializeClas, flowParamStr, serializeConfig);\n        flowParam.put(\"_retry\", true);\n        FlowResult flowResult = flowEngine.execute(flowParam);\n        ExecResult result = new ExecResult();\n        result.setResult(ProcessUnitConstants.RESULT_SUCCESS);\n        return result;\n    }\n\n    public FlowEngine getFlowEngine() {\n        return flowEngine;\n    }\n\n    public void setFlowEngine(FlowEngine flowEngine) {\n        this.flowEngine = flowEngine;\n    }\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/flow/flowretry/FlowRetryFilter.java",
    "content": "package com.jd.easyflow.process.client.flow.flowretry;\n\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.UUID;\nimport java.util.function.Function;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.ext.serialize.FlowParamSerializeManager;\nimport com.jd.easyflow.flow.ext.serialize.impl.JsonFlowParamSerializer;\nimport com.jd.easyflow.flow.filter.FilterChain;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.filter.impl.BaseFlowFilter;\nimport com.jd.easyflow.flow.util.JsonUtil;\nimport com.jd.easyflow.process.client.flow.StdFlowProcessConstants;\nimport com.jd.easyflow.process.client.runtime.StdProcessConstants;\nimport com.jd.easyflow.processunit.client.ProcessUnitHelper;\nimport com.jd.easyflow.processunit.client.bean.ExecContext;\nimport com.jd.easyflow.processunit.client.bean.ExecParam;\nimport com.jd.easyflow.processunit.client.bean.ExecResult;\nimport com.jd.easyflow.processunit.client.util.ProcessUnitConstants;\n\n/**\n * @author liyuliang5\n */\npublic class FlowRetryFilter extends BaseFlowFilter {\n    \n    private String defaultFlowParamSerializerClass = JsonFlowParamSerializer.class.getName();\n    \n    @Override\n    public FlowResult doFilter(FlowContext context, FilterChain<FlowContext, FlowResult> chain) {\n        if (Boolean.TRUE.equals(context.getParam().get(\"_retry\"))) {\n            return chain.doFilter(context);\n        }\n        Map<String, Object> requestContent = new HashMap<String, Object>();\n        Map<String, Object> retryConfig = context.getFlow().getProperty(\"retry\");\n        String flowParamSerializerClass = (String) retryConfig.get(\"flowParamSerializerClass\");\n        if (flowParamSerializerClass == null) {\n            flowParamSerializerClass = defaultFlowParamSerializerClass;\n        }\n        Map<String, Object> serializeConfig = (Map<String, Object>) retryConfig.get(\"flowParamSerializeConfig\");\n        String flowParamStr = FlowParamSerializeManager.getInstance().serialize(flowParamSerializerClass, context.getParam(), serializeConfig);\n        requestContent.put(\"flowParamStr\", flowParamStr);\n        requestContent.put(\"flowParamSerializerClass\", flowParamSerializerClass);\n        requestContent.put(\"flowParamSerializeConfig\", serializeConfig);\n        \n        Function invoker = ctx -> {\n            return chain.doFilter(context);\n        };\n        Function<ExecContext, String> resultFunction = ctx -> {\n            if (! ctx.isExecuted()) {\n                return ProcessUnitConstants.RESULT_EXCEPTION;\n            }\n            if (ctx.getResult().getExecException() != null) {\n                return ProcessUnitConstants.RESULT_EXCEPTION;\n            }\n            FlowResult flowResult = (FlowResult) ctx.getResult().getExecResult();\n            boolean end = false;\n            List<NodeContext> list = flowResult.getContext().getEndNodes();\n            for (NodeContext nc : list) {\n                if (Boolean.TRUE.equals(flowResult.getContext().getFlow().getNode(nc.getNodeId())\n                        .getProperty(StdProcessConstants.PROP_END))) {\n                    end = true;\n                    break;\n                }\n            }\n            return end ? ProcessUnitConstants.RESULT_SUCCESS : ProcessUnitConstants.RESULT_DOING;\n        };\n\n        String unitCode = (String) retryConfig.get(\"unitCode\");\n        String bizNo = null;\n        String bizNoExp = (String) retryConfig.get(\"bizNoExp\");\n        if (bizNoExp != null) {\n            bizNo = context.getElEvaluator().eval(bizNoExp, null, context, null);\n        } else {\n            bizNo = context.get(StdFlowProcessConstants.FLOW_CTX_BIZNO);\n        }\n        if (bizNo == null) {\n            bizNo = UUID.randomUUID().toString();\n        }\n        String productCode = context.get(StdFlowProcessConstants.FLOW_CTX_PRODUCT_CODE);\n        \n        ExecParam param = new ExecParam();\n        param.setBizNo(bizNo);\n        param.setInvoker(invoker);\n        param.setProductCode(productCode);\n        param.setRequestContent(JsonUtil.toJsonString(requestContent));\n        param.setRequestNo(UUID.randomUUID().toString());\n        param.setUnitCode(unitCode);\n        param.setResultFunction(resultFunction);\n        param.setResponseContentFunction(ctx -> {return null;});\n        \n        ExecResult result = ProcessUnitHelper.call(param);\n        return (FlowResult) result.getExecResult();\n    }\n\n    public String getDefaultFlowParamSerializerClass() {\n        return defaultFlowParamSerializerClass;\n    }\n\n    public void setDefaultFlowParamSerializerClass(String defaultFlowParamSerializerClass) {\n        this.defaultFlowParamSerializerClass = defaultFlowParamSerializerClass;\n    }\n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/flow/noderetry/NodeActionRetryFilter.java",
    "content": "package com.jd.easyflow.process.client.flow.noderetry;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.UUID;\nimport java.util.function.Function;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.flow.filter.FilterChain;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.NodeContextAccessor;\nimport com.jd.easyflow.flow.model.filter.impl.BaseNodeActionFilter;\nimport com.jd.easyflow.flow.util.FlowUtil;\nimport com.jd.easyflow.flow.util.JsonUtil;\nimport com.jd.easyflow.flow.util.Pair;\nimport com.jd.easyflow.process.client.flow.StdFlowProcessConstants;\nimport com.jd.easyflow.process.client.runtime.StdProcessConstants;\nimport com.jd.easyflow.processunit.client.ProcessUnitHelper;\nimport com.jd.easyflow.processunit.client.bean.ExecContext;\nimport com.jd.easyflow.processunit.client.bean.ExecParam;\nimport com.jd.easyflow.processunit.client.bean.ExecResult;\nimport com.jd.easyflow.processunit.client.util.ProcessUnitConstants;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n * @author liyuliang5\n */\npublic class NodeActionRetryFilter extends BaseNodeActionFilter {\n\n    @Override\n    public Object doFilter(Pair<NodeContext, FlowContext> request,\n                           FilterChain<Pair<NodeContext, FlowContext>, Object> chain) {\n        FlowContext context = request.getRight();\n        Map<String, Object> flowRetryConfig = context.getFlow().getProperty(\"nodeRetry\");\n        Map<String, Object> nodeRetryConfig = FlowUtil.nodeProperty(\"nodeRetry\", request.getLeft(), context);\n        \n        if (nodeRetryConfig == null || !Boolean.TRUE.equals(nodeRetryConfig.get(\"skipWhenFinish\"))) {\n            return chain.doFilter(request);\n        }\n        Map<String, Object> requestContent = new HashMap<>();\n        String processType = context.get(StdProcessConstants.PROP_PROCESS_TYPE);\n        String flowBizNo = context.get(StdProcessConstants.PROP_BIZNO);\n        String bizNo = processType + \"-\" + flowBizNo + \"-\" + request.getLeft().getNodeId();\n        Function invoker = ctx -> {\n            return chain.doFilter(request);\n        };\n        Function<ExecContext, String> resultFunction = ctx -> {\n            if (!ctx.isExecuted()) {\n                return ProcessUnitConstants.RESULT_EXCEPTION;\n            }\n            if (ctx.getResult().getExecException() != null) {\n                return ProcessUnitConstants.RESULT_EXCEPTION;\n            }\n            Object result = ctx.getResult().getExecResult();\n            if (result == null) {\n                return ProcessUnitConstants.RESULT_DOING;\n            }\n            return ProcessUnitConstants.RESULT_SUCCESS;\n        };\n        Function<ExecContext, String> responseContentFunction = ctx -> {\n            Map<String, Object> response = new HashMap<>();\n            Object result = ctx.getResult().getExecResult();\n            response.put(\"actionResult\", result);\n            return JSON.toJSONString(response);\n        };\n        Function<ExecContext, ?> oldResultFunction = ctx -> {\n           Map<String, Object> response = JSON.parseObject(ctx.getPolicy().getResponseContent(), Map.class);\n           Object actionResult = response.get(\"actionResult\");\n           NodeContextAccessor.setActionResult(request.getLeft(), actionResult);\n            return actionResult;\n        };\n        ExecParam param = new ExecParam();\n        param.setBizNo(bizNo);\n        param.setInvoker(invoker);\n        String productCode = context.get(StdFlowProcessConstants.FLOW_CTX_PRODUCT_CODE);\n        param.setProductCode(productCode);\n        param.setRequestContent(JsonUtil.toJsonString(requestContent));\n        param.setRequestNo(UUID.randomUUID().toString());\n        String unitCode = (String) flowRetryConfig.get(\"unitCode\");\n        param.setUnitCode(unitCode);\n        param.setResultFunction(resultFunction);\n        param.setResponseContentFunction(responseContentFunction);\n        \n        ExecResult result = ProcessUnitHelper.call(param);\n        return (FlowResult) result.getExecResult();\n\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/flow/util/StdFlowEl.java",
    "content": "package com.jd.easyflow.process.client.flow.util;\n\nimport java.util.Map;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessInstanceDTO;\nimport com.jd.easyflow.process.client.flow.StdFlowProcessConstants;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n * @author liyuliang5\n *\n */\npublic class StdFlowEl {\n    \n    public static Object instance(FlowContext context) {\n        ProcessInstanceDTO instance = context.get(StdFlowProcessConstants.FLOW_CTX_INSTANCE);\n        return instance;\n    }\n\n    public static Object bizData(FlowContext context, String key) {\n        ProcessInstanceDTO instance = context.get(StdFlowProcessConstants.FLOW_CTX_INSTANCE);\n        String bizData = instance.getBizData();\n        Map<String, Object> map = JSON.parseObject(bizData, Map.class);\n        if (map == null) {\n            return null;\n        }\n        return map.get(key);\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/flow/util/StdProcessFlowUtil.java",
    "content": "package com.jd.easyflow.process.client.flow.util;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessInstanceDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessNodeInstanceDTO;\nimport com.jd.easyflow.process.client.flow.StdFlowProcessConstants;\nimport com.jd.easyflow.process.client.runtime.StdNodeContext;\nimport com.jd.easyflow.process.client.runtime.StdProcessContext;\n\n/**\n * @author liyuliang5\n */\npublic class StdProcessFlowUtil {\n    \n    public static StdProcessContext getStdProcessContext(FlowContext flowContext) {\n        return flowContext.get(StdFlowProcessConstants.FLOW_CTX_PROCESS_CTX);\n    }\n    \n    public static StdNodeContext getStdNodeContext(NodeContext nodeContext) {\n        return nodeContext.get(StdFlowProcessConstants.FLOW_NODE_CTX_NODE_CTX);\n    }\n    \n    public static ProcessInstanceDTO getCachedProcessInstance(FlowContext flowContext) {\n        StdProcessContext processContext = getStdProcessContext(flowContext);\n        if (processContext == null) {\n            return null;\n        }\n        ProcessInstanceDTO instance = processContext.getCache().get(ProcessInstanceDTO.class, processContext.getInstanceNo());\n        return instance;\n    }\n    \n    public static ProcessNodeInstanceDTO getCachedNodeInstance(NodeContext nodeContext, FlowContext flowContext) {\n        StdProcessContext processContext = getStdProcessContext(flowContext);\n        if (processContext == null) {\n            return null;\n        }\n        StdNodeContext stdNodeContext = getStdNodeContext(nodeContext);\n        if (stdNodeContext == null) {\n            return null;\n        }\n        ProcessNodeInstanceDTO nodeInstance = processContext.getCache().get(ProcessNodeInstanceDTO.class, stdNodeContext.getNodeInstanceNo());\n        return nodeInstance;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/fsm/StdFsmManager.java",
    "content": "package com.jd.easyflow.process.client.fsm;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.Objects;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponse;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponseCode;\nimport com.jd.easyflow.common.adapter.export.util.ExportResponseUtil;\nimport com.jd.easyflow.common.exception.EasyFlowException;\nimport com.jd.easyflow.fsm.Fsm;\nimport com.jd.easyflow.fsm.FsmManager;\nimport com.jd.easyflow.fsm.parser.FsmParser;\nimport com.jd.easyflow.objects.factory.ObjectFactorys;\nimport com.jd.easyflow.process.adapter.export.ProcessDefinitionExport;\nimport com.jd.easyflow.process.adapter.export.dto.definition.ProcessDefinitionDTO;\nimport com.jd.easyflow.process.client.flow.StdFlowProcessConstants;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n * @author liyuliang5\n *\n */\npublic class StdFsmManager extends FsmManager {\n    \n    private static final Logger log = LoggerFactory.getLogger(StdFsmManager.class);\n\n    private static final String AUTO_REPORT = \"AUTO_REPORT\";\n\n    private static final String FSM_EASY = \"FSM-easy\";\n\n    /**\n     * key:category\n     */\n    private static final String PROPERTY_KEY_CATEGORY = \"category\";\n    /**\n     * key:bizType\n     */\n    private static final String PROPERTY_KEY_BIZTYPE= \"bizType\";\n\n\n    private ProcessDefinitionExport processDefinitionExport;\n\n    private boolean localLoad = true;\n\n    private boolean localPush = false;\n\n    @Override\n    protected void loadFsm() {\n        if (localLoad) {\n            super.loadFsm();\n            localFsmVersioned();\n        }\n        if (localPush){\n            localFsmPush();\n        }\n    }\n\n    @Override\n    public Fsm getFsm(String fsmId) {\n        String wrapperFsmId = null;\n        if (fsmId.contains(StdFlowProcessConstants.VERSION_PREFIX)) {\n            wrapperFsmId = fsmId;\n        } else {\n            ExportResponse<Integer> response = getProcessDefinitionExport().getLatestProcessDefVersionByDefId(new ExportRequest<>(fsmId));\n            if (ExportResponseCode.DATA_EMPTY.getCode().equals(response.getResCode())) {\n                wrapperFsmId = fsmId + StdFlowProcessConstants.VERSION_PREFIX;\n                if (fsmMap.containsKey(wrapperFsmId)) {\n                    return fsmMap.get(wrapperFsmId);\n                } else {\n                    throw new RuntimeException(\"Fsm definition \" + fsmId + \" not exists\");\n                }\n            }\n            Integer latestProcessDefVersion = ExportResponseUtil.unwrap(response);\n            wrapperFsmId = wrapperFsmId(fsmId, latestProcessDefVersion);\n        }\n        \n        if (fsmMap.containsKey(wrapperFsmId)){\n            return fsmMap.get(wrapperFsmId);\n        }\n        ProcessDefinitionDTO latestProcessDef = ExportResponseUtil.unwrap(getProcessDefinitionExport()\n                .getVersionedProcessDefinition(new ExportRequest<>(wrapperFsmId)));\n        if (latestProcessDef == null){\n            log.error(\"Fsm definition not exists:{}\", fsmId);\n            throw new RuntimeException(\"Fsm definition not exists\");\n        }\n        wrapperFsmId = wrapperFsmId(latestProcessDef.getDefId(),latestProcessDef.getDefVersion());\n        Fsm fsm = FsmParser.parse(latestProcessDef.getJsonContent());\n        fsm.setId(wrapperFsmId);\n        fsmMap.put(wrapperFsmId,fsm);\n        return fsm;\n    }\n    \n    private void localFsmVersioned() {\n        Map<String, Fsm> versionedFsmMap = new HashMap<>();\n        for (Fsm fsm : fsmMap.values()) {\n            if (fsm.getId().contains(StdFlowProcessConstants.VERSION_PREFIX)) {\n                throw new EasyFlowException(\"Fsm ID:\" + fsm.getId() + \" must not contain \" + StdFlowProcessConstants.VERSION_PREFIX);\n            }\n            versionedFsmMap.put(fsm.getId() + StdFlowProcessConstants.VERSION_PREFIX, fsm);\n        }\n        fsmMap.putAll(versionedFsmMap);\n    }\n\n    protected void localFsmPush(){\n        for (Entry<String, Fsm> entry : fsmMap.entrySet()){\n            if (!entry.getKey().endsWith(StdFlowProcessConstants.VERSION_PREFIX)) {\n                continue;\n            }\n            Fsm fsm = entry.getValue();\n            boolean report = processDefReport(fsm);\n            if (!report){\n                log.warn(\"Current fsm definition has been reported:{}\",fsm.getId());\n                continue;\n            }\n            String content = fsmDefinitionMap.get(fsm.getId());\n            if (content == null || content.isEmpty()){\n                log.warn(\"Fsm definition content is blank:{}\",fsm.getId());\n                continue;\n            }\n            ProcessDefinitionDTO processDef = new ProcessDefinitionDTO();\n            processDef.setDefId(fsm.getId());\n            processDef.setName(fsm.getName());\n            processDef.setContent(content);\n            processDef.setJsonContent(content);\n            processDef.setCategory(fsm.getProperty(PROPERTY_KEY_CATEGORY));\n            processDef.setBizType(fsm.getProperty(PROPERTY_KEY_BIZTYPE));\n            processDef.setDefSource(AUTO_REPORT);\n            processDef.setFormat(FSM_EASY);\n            log.info(\"Fsm definition start report:{}\", processDef.getDefId());\n            ExportResponse response = getProcessDefinitionExport().reportProcessDef(new ExportRequest<>(processDef));\n            if (!response.isSuccess()){\n                log.error(\"Local fsm definition {} report exception {}\",processDef.getDefId(), JSON.toJSONString(response));\n                throw new EasyFlowException(\"Local fsm definition report exception\");\n            }\n        }\n    }\n\n    private boolean processDefReport(Fsm fsm){\n        ProcessDefinitionDTO processDef = ExportResponseUtil.unwrap(getProcessDefinitionExport()\n                .getProcessDefinition(new ExportRequest<>(fsm.getId())));\n        if (processDef == null){\n            return true;\n        }\n        String jsonData = fsmDefinitionMap.get(fsm.getId());\n        return !Objects.equals(jsonData,processDef.getContent());\n    }\n\n\n    private String wrapperFsmId(String fsmId,Integer latestVersion){\n        if (latestVersion == null){\n            return fsmId + StdFlowProcessConstants.VERSION_PREFIX;\n        }\n        return fsmId + StdFlowProcessConstants.VERSION_PREFIX + latestVersion;\n    }\n\n    public ProcessDefinitionExport getProcessDefinitionExport() {\n        if (processDefinitionExport == null) {\n            processDefinitionExport = ObjectFactorys.getDefault().getObject(ProcessDefinitionExport.class);\n        }\n        return processDefinitionExport;\n    }\n\n\n    public void setProcessDefinitionExport(ProcessDefinitionExport processDefinitionExport) {\n        this.processDefinitionExport = processDefinitionExport;\n    }\n\n    public boolean isLocalLoad() {\n        return localLoad;\n    }\n\n    public void setLocalLoad(boolean localLoad) {\n        this.localLoad = localLoad;\n    }\n\n    public boolean isLocalPush() {\n        return localPush;\n    }\n\n    public void setLocalPush(boolean localPush) {\n        this.localPush = localPush;\n    }\n    \n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/fsm/StdFsmProcessConstants.java",
    "content": "package com.jd.easyflow.process.client.fsm;\n\n/**\n * @author liyuliang5\n *\n */\npublic class StdFsmProcessConstants {\n\n    public static final String FSM_PARAM_INSTANCENO = \"_PROCESS_INSTANCE_NO\";\n    public static final String FSM_PARAM_INSTANCE_NAME = \"_PROCESS_INSTANCE_NAME\";\n    public static final String FSM_PARAM_USER = \"_USER\";\n    public static final String FSM_PARAM_PRODUCT_CODE = \"_PRODUCT_CODE\";\n    public static final String FSM_PARAM_BIZ_DATA = \"_PROCESS_BIZ_DATA\";\n    public static final String FSM_PARAM_BIZ_STATUS = \"_PROCESS_BIZ_STATUS\";\n    public static final String FSM_PARAM_OP_TYPE = \"_PROCESS_OP_TYPE\";\n    public static final String FSM_PARAM_PROCESS = \"_process\";\n\n    public static final String FSM_CTX_PROCESS_CTX = \"_PROCESS_CTX\";\n    public static final String FSM_CTX_INSTANCENO = \"_PROCESS_INSTANCE_NO\";\n    public static final String FSM_CTX_INSTANCE_NAME = \"_PROCESS_INSTANCE_NAME\";\n    public static final String FSM_CTX_USER = \"_USER\";\n    public static final String FSM_CTX_PRODUCT_CODE = \"_PRODUCT_CODE\";\n    public static final String FSM_TST_CTX_NODE_CTX = \"_NODE_CTX\";\n    public static final String FSM_CTX_INSTANCE = \"_PROCESS_INSTANCE\";\n    public static final String FSM_CTX_BIZ_DATA = \"_PROCESS_BIZ_DATA\";\n    public static final String FSM_CTX_BIZ_STATUS = \"_PROCESS_BIZ_STATUS\";\n    public static final String FSM_CTX_OP_TYPE = \"_PROCESS_OP_TYPE\";\n    public static final String FSM_CTX_PROCESS_EVENT_INFO_CACHE = \"_PROCESS_EVENT_INFO_CACHE\";\n    public static final String FSM_CTX_PARENT_INSTANCE_NO = \"_PARENT_INSTANCE_NO\";\n    public static final String FSM_CTX_PARENT_NODE_INSTANCE_NO = \"_PARENT_NODE_INSTANCE_NO\";   \n    public static final String FSM_CTX_IS_SUB_PROCESS = \"_IS_SUB_PROCESS\";\n    public static final String FSM_CTX_PARENT_CTX = \"_PARENT_CTX\";\n    public static final String FSM_CTX_PROCESS = \"_process\";\n    public static final String FSM_DATA_FLUSH_POLICY = \"dataFlushPolicy\";\n\n    public static final String FSM_TST_CTX_PROCESS_EXT_DATA = \"_PROCESS_EXT_DATA\";\n    \n\n    public static final String FSM_PROP_PROCESS = \"process\";\n    \n    public static final String EVENT_NONE_FOR_CLOSE = \"NONE_FOR_CLOSE\";\n    \n    public static final String VERSION_PREFIX = \"--V_\";\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/fsm/StdProcessFsmFilter.java",
    "content": "package com.jd.easyflow.process.client.fsm;\n\nimport com.jd.easyflow.fsm.FsmContext;\nimport com.jd.easyflow.fsm.FsmResult;\nimport com.jd.easyflow.fsm.filter.Filter;\nimport com.jd.easyflow.fsm.filter.FilterChain;\n\n/**\n * \n * @author liyuliang5\n */\npublic class StdProcessFsmFilter extends StdProcessFsmListener implements Filter<FsmContext, FsmResult> {\n\n    @Override\n    public FsmResult doFilter(FsmContext context, FilterChain<FsmContext, FsmResult> chain) {\n        super.onFsmStart(context);\n        try {\n            FsmResult result = chain.doFilter(context);\n            context.setResult(result);\n            super.onFsmEnd(context);\n            return context.getResult();\n        } finally {\n            super.onFsmComplete(context);\n        }\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/fsm/StdProcessFsmListener.java",
    "content": "package com.jd.easyflow.process.client.fsm;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Date;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Objects;\nimport java.util.Set;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.adapter.export.util.ExportResponseUtil;\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.util.FlowConstants;\nimport com.jd.easyflow.fsm.FsmContext;\nimport com.jd.easyflow.fsm.FsmManager;\nimport com.jd.easyflow.fsm.FsmParam;\nimport com.jd.easyflow.fsm.event.FsmEvent;\nimport com.jd.easyflow.fsm.event.FsmEventListener;\nimport com.jd.easyflow.fsm.model.InitContext;\nimport com.jd.easyflow.fsm.model.State;\nimport com.jd.easyflow.fsm.model.TransitionContext;\nimport com.jd.easyflow.fsm.util.FsmConstants;\nimport com.jd.easyflow.fsm.util.FsmEventTypes;\nimport com.jd.easyflow.fsm.util.Pair;\nimport com.jd.easyflow.objects.factory.ObjectFactorys;\nimport com.jd.easyflow.process.adapter.export.ProcessInstanceExport;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessInstanceDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.QueryProcessInstanceReq;\nimport com.jd.easyflow.process.client.common.PropertiesUtil;\nimport com.jd.easyflow.process.client.flow.StdFlowProcessConstants;\nimport com.jd.easyflow.process.client.runtime.ProcessRuntimeService;\nimport com.jd.easyflow.process.client.runtime.StdNode;\nimport com.jd.easyflow.process.client.runtime.StdNodeContext;\nimport com.jd.easyflow.process.client.runtime.StdProcess;\nimport com.jd.easyflow.process.client.runtime.StdProcessConstants;\nimport com.jd.easyflow.process.client.runtime.StdProcessContext;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n *\n * @author liyuliang5\n * \n */\npublic class StdProcessFsmListener implements FsmEventListener {\n    \n    private static final Logger log = LoggerFactory.getLogger(StdProcessFsmListener.class);\n\n    private ProcessRuntimeService processRuntimeService;\n\n    private ProcessInstanceExport processInstanceExport;\n\n    @Override\n    public Pair<String, Integer>[] getAcceptedEvents() {\n        return new Pair[] { Pair.of(FsmEventTypes.FSM_MANAGER_START, FsmConstants.EVENT_ORDER_START),\n                Pair.of(FsmEventTypes.FSM_START, FsmConstants.EVENT_ORDER_START + 100),\n                Pair.of(FsmEventTypes.FSM_END, -FsmConstants.EVENT_ORDER_START - 100),\n                Pair.of(FsmEventTypes.FSM_COMPLETE, -FsmConstants.EVENT_ORDER_START - 100),\n                Pair.of(FsmEventTypes.TST_START, FsmConstants.EVENT_ORDER_START + 100),\n                Pair.of(FsmEventTypes.TST_END, -FsmConstants.EVENT_ORDER_START - 100) };\n    }\n\n    @Override\n    public void on(FsmEvent event) {\n        switch (event.getType()) {\n        case FsmEventTypes.FSM_MANAGER_START: {\n            onFsmManagerStart(event);\n            break;\n        }\n        case FsmEventTypes.FSM_START: {\n            onFsmStart(event);\n            break;\n        }\n        case FsmEventTypes.TST_START: {\n            onTstStart(event);\n            break;\n        }\n        case FsmEventTypes.TST_END: {\n            onTstEnd(event);\n            break;\n        }\n        case FsmEventTypes.FSM_END: {\n            onFsmEnd(event);\n            break;\n        }\n        case FsmEventTypes.FSM_COMPLETE: {\n            onFsmComplete(event);\n            break;\n        }\n        default:\n            break;\n        }\n\n    }\n    \n    private void onFsmStart(FsmEvent event) {\n        onFsmStart(event.getContext());\n    }\n\n    protected void onFsmStart(FsmContext context) {\n        StdProcessContext processContext = new StdProcessContext();\n        context.putData(StdFsmProcessConstants.FSM_CTX_PROCESS_CTX, processContext);\n        processContext.setEngineProcessContext(context);\n\n        processContext.setProcessParamProperties(context.getParam().get(StdFsmProcessConstants.FSM_PROP_PROCESS));\n        StdProcess process = new StdProcess();\n        process.setProcessProperties(context.getFsm().getProperty(StdFsmProcessConstants.FSM_PROP_PROCESS));\n        process.putExtProperty(StdProcessConstants.EXT_PROP_ENGINE, StdProcessConstants.ENGINE_FSM);\n        processContext.setProcess(process);\n        fillFsmContextData(context);\n        processContext.setSubProcess(Boolean.TRUE.equals(context.getData(StdFsmProcessConstants.FSM_CTX_IS_SUB_PROCESS)));\n        if (processContext.isSubProcess() && Boolean.TRUE.equals(PropertiesUtil\n                .get(processContext.getProcess().getProcessProperties(), StdProcessConstants.PROP_DATA_FLUSH_BY_PARENT))) {\n            StdProcessContext parentProcessContext = context.getData(StdFsmProcessConstants.FSM_CTX_PARENT_CTX);\n            processContext.setCache(parentProcessContext.getCache());\n        }\n        processContext.setOpType(context.getData(StdFsmProcessConstants.FSM_CTX_OP_TYPE));\n        ProcessInstanceDTO instance = new ProcessInstanceDTO();\n        instance.setInstanceNo(context.getData(StdFsmProcessConstants.FSM_CTX_INSTANCENO));\n        instance.setInstanceName(context.getData(StdFsmProcessConstants.FSM_CTX_INSTANCE_NAME));\n        instance.setBizNo(context.getParam().getInstanceId());\n        instance.setProcessType(context.getParam().getBizType());\n        instance.setCreator(context.getData(StdFsmProcessConstants.FSM_CTX_USER));\n        instance.setProductCode(context.getData(StdFsmProcessConstants.FSM_CTX_PRODUCT_CODE));\n        instance.setParentInstanceNo(context.getData(StdFsmProcessConstants.FSM_CTX_PARENT_INSTANCE_NO));\n        instance.setParentNodeInstanceNo(context.getData(StdFsmProcessConstants.FSM_CTX_PARENT_NODE_INSTANCE_NO));\n        String processDefId = StdProcessConstants.PROCESS_DEF_FSM + context.getFsm().getId();\n        if (processDefId.endsWith(StdFsmProcessConstants.VERSION_PREFIX)) {\n            processDefId = processDefId.substring(0, processDefId.length() - StdFsmProcessConstants.VERSION_PREFIX.length());\n        }\n        instance.setProcessDefId(processDefId);      \n        instance.setBizData(context.getData(StdFsmProcessConstants.FSM_CTX_BIZ_DATA));\n        instance.setBizStatus(context.getData(StdFsmProcessConstants.FSM_CTX_BIZ_STATUS));\n        processContext.setProcessType(instance.getProcessType());\n        processContext.setBizNo(instance.getBizNo());\n\n        String requestId = processRuntimeService.lockProcessInstance(instance.getProcessType(), instance.getBizNo());\n        processContext.setLockRequestId(requestId);\n\n        processContext.setProcessProperties(assembleProcessProperties(context));\n\n        Boolean checkStartNode = PropertiesUtil.get(StdProcessConstants.PROP_CHECK_START_NODE,\n                context.getData(StdFsmProcessConstants.FSM_PROP_PROCESS),\n                context.getParam().get(StdFsmProcessConstants.FSM_PROP_PROCESS),\n                context.getFsm().getProperty(StdFsmProcessConstants.FSM_PROP_PROCESS)\n                );\n        checkStartNode = checkStartNode != null && checkStartNode;\n        processContext.setCheckStartNode(checkStartNode);\n\n        processContext.setNodeFunction(nodeId -> {\n            StdNode node = new StdNode();\n            node.setProcessProperties(\n                    context.getFsm().getState(nodeId).getProperty(StdFsmProcessConstants.FSM_PROP_PROCESS));\n            return node;\n        });\n\n        processContext.setStartNodesFunction((processInstance -> {\n            if (processInstance != null && StdProcessConstants.STATUS_CLOSE.equals(processInstance.getStatus())) {\n                String exeucteClosePoliy = PropertiesUtil.get(\n                        context.getFsm().getProperty(StdFsmProcessConstants.FSM_PROP_PROCESS),\n                        StdProcessConstants.PROP_EXECUTE_CLOSE_POLICY);\n                if (StdProcessConstants.POLICY_EMPTY_RUN.equals(exeucteClosePoliy)) {\n                    log.info(\"Process instance finish, empty run.\");\n                    context.getParam().setEventId(StdFsmProcessConstants.EVENT_NONE_FOR_CLOSE);\n                }\n            }\n            \n            if (context.getCurrentEvent() == null) {\n                if (processInstance == null || processInstance.getCurrentNodeIds() == null || processInstance.getCurrentNodeIds().isEmpty()) {\n                    context.setCurrentEvent(FsmConstants.COMMON_ENTER_EVENT);\n                } else {\n                    context.setCurrentEvent(FsmConstants.COMMON_CHECK_EVENT);\n                }\n            }\n            \n            if (context.getCurrentState() != null) {\n                return Arrays.asList(context.getCurrentState().getId());\n            }\n            if (context.getParam().getCurrentStateId() != null) {\n                return Arrays.asList(context.getCurrentState().getId());\n            }\n            if (processInstance == null) {\n                return context.getFsm().getStartStateId() == null ? new ArrayList<String>() : Arrays.asList(context.getFsm().getStartStateId());\n            } else {\n                Set<String> activeNodeIds = processRuntimeService.getManager().findOpenNodeIds(processContext);\n                if (activeNodeIds != null && ! activeNodeIds.isEmpty()) {\n                    if (activeNodeIds.size() > 1) {\n                        throw new IllegalStateException(\"Fsm can only have one active node, \" + activeNodeIds);\n                    } else {\n                        String currentStateId = activeNodeIds.iterator().next();\n                        context.setCurrentState(context.getFsm().getState(currentStateId));\n                        log.info(\"Start node of fsm set to:{}\", currentStateId);\n                        return Arrays.asList(currentStateId);\n                    }\n                } else {\n                    return context.getFsm().getStartStateId() == null ? new ArrayList<String>() : Arrays.asList(context.getFsm().getStartStateId());\n                }\n            }\n\n        }));\n\n        processContext.setEventTriggerFunction(param -> {\n            Object[] params = (Object[]) param;\n            context.getFsm().getEventTrigger().triggerEvent((String) params[0], params[1], context, false);\n            return null;\n        });\n\n        processContext.setVariableSetter(variables -> {\n            context.putData(StdProcessConstants.CTX_VARIABLES, variables);\n        });\n        processContext.setVariableGetter(() -> {\n            return (Map<String, String>) context.getData(StdProcessConstants.CTX_VARIABLES);\n        });\n        processContext.setNodeVariableGetter(stdNodeContext -> {\n            TransitionContext nodeContext = stdNodeContext.getEngineNodeContext();\n            return nodeContext.get(StdProcessConstants.NODE_CTX_VARIABLES);\n        });\n        processContext.setNodeVariableSetter(pair -> {\n            StdNodeContext stdNodeContext = pair.getLeft();\n            TransitionContext nodeContext = stdNodeContext.getEngineNodeContext();\n            nodeContext.put(StdProcessConstants.NODE_CTX_VARIABLES, pair.getRight());\n        });\n        \n        processContext.setNodeStartEventPolicy(StdProcessConstants.NODE_START_EVENT_POLICY_CREATE);\n        processRuntimeService.processStartExec(instance, processContext);\n        ProcessInstanceDTO processInstance = processRuntimeService.getProcessInstance(processContext);\n        context.putData(StdFsmProcessConstants.FSM_CTX_INSTANCE, processInstance);\n    }\n\n    private void fillFsmContextData(FsmContext context) {\n        FsmParam param = context.getParam();\n        if (context.getData(StdFsmProcessConstants.FSM_CTX_INSTANCENO) == null\n                && param.get(StdFsmProcessConstants.FSM_PARAM_INSTANCENO) != null) {\n            context.putData(StdFsmProcessConstants.FSM_CTX_INSTANCENO,\n                    param.get(StdFsmProcessConstants.FSM_PARAM_INSTANCENO));\n        }\n        if (context.getData(StdFsmProcessConstants.FSM_CTX_INSTANCE_NAME) == null\n                && param.get(StdFsmProcessConstants.FSM_PARAM_INSTANCE_NAME) != null) {\n            context.putData(StdFsmProcessConstants.FSM_CTX_INSTANCE_NAME,\n                    param.get(StdFsmProcessConstants.FSM_PARAM_INSTANCE_NAME));\n        }\n        if (context.getData(StdFsmProcessConstants.FSM_CTX_USER) == null\n                && param.get(StdFsmProcessConstants.FSM_PARAM_USER) != null) {\n            context.putData(StdFsmProcessConstants.FSM_CTX_USER, param.get(StdFsmProcessConstants.FSM_PARAM_USER));\n        }\n        if (context.getData(StdFsmProcessConstants.FSM_CTX_PRODUCT_CODE) == null\n                && param.get(StdFsmProcessConstants.FSM_PARAM_PRODUCT_CODE) != null) {\n            context.putData(StdFsmProcessConstants.FSM_CTX_PRODUCT_CODE,\n                    param.get(StdFsmProcessConstants.FSM_PARAM_PRODUCT_CODE));\n        }\n        if (context.getData(StdFsmProcessConstants.FSM_CTX_OP_TYPE) == null\n                && param.get(StdFsmProcessConstants.FSM_PARAM_OP_TYPE) != null) {\n            context.putData(StdFsmProcessConstants.FSM_CTX_OP_TYPE,\n                    param.get(StdFsmProcessConstants.FSM_PARAM_OP_TYPE));\n        }\n        if (context.getData(StdFsmProcessConstants.FSM_CTX_BIZ_DATA) == null\n                && param.get(StdFsmProcessConstants.FSM_PARAM_BIZ_DATA) != null) {\n            context.putData(StdFsmProcessConstants.FSM_CTX_BIZ_DATA,\n                    param.get(StdFsmProcessConstants.FSM_PARAM_BIZ_DATA));\n        }\n        if (context.getData(StdFsmProcessConstants.FSM_CTX_BIZ_STATUS) == null\n                && param.get(StdFsmProcessConstants.FSM_PARAM_BIZ_STATUS) != null) {\n            context.putData(StdFsmProcessConstants.FSM_CTX_BIZ_STATUS,\n                    param.get(StdFsmProcessConstants.FSM_PARAM_BIZ_STATUS));\n        }\n        if (context.getData(StdFsmProcessConstants.FSM_CTX_PARENT_INSTANCE_NO) == null) {\n            String parentInstanceNoOfParam = param.get(StdFsmProcessConstants.FSM_CTX_PARENT_INSTANCE_NO);\n            if (parentInstanceNoOfParam != null) {\n                context.putData(StdFsmProcessConstants.FSM_CTX_PARENT_INSTANCE_NO, parentInstanceNoOfParam);\n            } else {\n                Object parentContext = context.getData(FsmConstants.CTX_PARENT_CONTEXT);\n                if (parentContext != null) {\n                    if (parentContext instanceof FsmContext) {\n                        StdProcessContext stdProcessContext = ((FsmContext) parentContext)\n                                .getData(StdFsmProcessConstants.FSM_CTX_PROCESS_CTX);\n                        if (stdProcessContext != null) {\n                            context.putData(StdFsmProcessConstants.FSM_CTX_PARENT_INSTANCE_NO,\n                                    stdProcessContext.getInstanceNo());\n                            context.putData(StdFsmProcessConstants.FSM_CTX_IS_SUB_PROCESS, true);\n                            context.putData(StdFsmProcessConstants.FSM_CTX_PARENT_CTX, stdProcessContext);\n                        }\n                    } else if (parentContext instanceof FlowContext) {\n                        StdProcessContext stdProcessContext = ((FlowContext) parentContext)\n                                .get(StdFlowProcessConstants.FLOW_CTX_PROCESS_CTX);\n                        if (stdProcessContext != null) {\n                            context.putData(StdFsmProcessConstants.FSM_CTX_PARENT_INSTANCE_NO,\n                                    stdProcessContext.getInstanceNo());\n                            context.putData(StdFsmProcessConstants.FSM_CTX_IS_SUB_PROCESS, true);\n                            context.putData(StdFsmProcessConstants.FSM_CTX_PARENT_CTX, stdProcessContext);\n                        }\n                    }  else {\n                        throw new IllegalArgumentException(\"Parent context class type illegal,\" + parentContext.getClass());\n                    }\n                }\n            }\n        }\n        if (context.getData(StdFsmProcessConstants.FSM_CTX_PARENT_NODE_INSTANCE_NO) == null) {\n            String parentNodeInstanceNoOfParam = param.get(StdFsmProcessConstants.FSM_CTX_PARENT_NODE_INSTANCE_NO);\n            if (parentNodeInstanceNoOfParam != null) {\n                context.putData(StdFsmProcessConstants.FSM_CTX_PARENT_NODE_INSTANCE_NO, parentNodeInstanceNoOfParam);\n            } else {\n                TransitionContext fsmParentTransitionContext = context\n                        .getData(FsmConstants.CTX_PARENT_TRANSITION_CONTEXT);\n                if (fsmParentTransitionContext != null) {\n                    StdNodeContext stdNodeContext = fsmParentTransitionContext\n                            .get(StdFsmProcessConstants.FSM_TST_CTX_NODE_CTX);\n                    if (stdNodeContext != null) {\n                        context.putData(StdFlowProcessConstants.FLOW_CTX_PARENT_NODE_INSTANCE_NO,\n                                stdNodeContext.getNodeInstanceNo());\n                    }\n                } else {\n                    NodeContext parentNodeContext = context.getData(FlowConstants.CTX_PARENT_NODE_CONTEXT);\n                    if (parentNodeContext != null) {\n                        StdNodeContext stdNodeContext = parentNodeContext\n                                .get(StdFlowProcessConstants.FLOW_NODE_CTX_NODE_CTX);\n                        if (stdNodeContext != null) {\n                            context.putData(StdFlowProcessConstants.FLOW_CTX_PARENT_NODE_INSTANCE_NO,\n                                    stdNodeContext.getNodeInstanceNo());\n                        }\n                    }\n                }\n            }\n\n        }\n    }\n    \n    private void onTstStart(FsmEvent event) {\n        TransitionContext tstContext = (TransitionContext) event.getData();\n        onTstStart(tstContext, event.getContext());\n    }\n\n    protected void onTstStart(TransitionContext tstContext, FsmContext context) {\n        StdProcessContext processContext = context.getData(StdFsmProcessConstants.FSM_CTX_PROCESS_CTX);\n        String currentStateId = context.getCurrentState().getId();\n        String currentEventId = context.getCurrentEvent().getId();\n        State previousState = context.getPreviousState();\n        StdNodeContext nodeContext = new StdNodeContext();\n        nodeContext.setStdProcessContext(processContext);\n        nodeContext.setNodeId(currentStateId);\n        nodeContext.setEventId(currentEventId);\n        State state = context.getFsm().getState(currentStateId);\n        StdNode node = new StdNode();\n        node.setProcessProperties(state.getProperty(StdFsmProcessConstants.FSM_PROP_PROCESS));\n        nodeContext.setNode(node);\n\n        nodeContext.setPreviousNodeId(\n                previousState == null || previousState.getId().equals(currentStateId) ? null : previousState.getId());\n        nodeContext.setExecutionStartTime(new Date());\n        nodeContext.setEngineNodeContext(tstContext);\n        tstContext.put(StdFsmProcessConstants.FSM_TST_CTX_NODE_CTX, nodeContext);\n        Map<String, Object> processExtData = tstContext.get(StdFsmProcessConstants.FSM_TST_CTX_PROCESS_EXT_DATA);\n        nodeContext.setExtData(processExtData);\n        processRuntimeService.nodeStartExec(nodeContext, processContext);\n    }\n    \n    private void onTstEnd(FsmEvent event) {\n        TransitionContext tstContext = (TransitionContext) event.getData();\n        onTstEnd(tstContext, event.getContext());        \n    }\n\n    protected void onTstEnd(TransitionContext tstContext, FsmContext context) {\n        StdProcessContext processContext = context.getData(StdFsmProcessConstants.FSM_CTX_PROCESS_CTX);\n        StdNodeContext nodeContext = tstContext.get(StdFsmProcessConstants.FSM_TST_CTX_NODE_CTX);\n        String currentStateId = context.getCurrentState().getId();\n        nodeContext.setNextNodeIds(\n                Objects.equals(currentStateId, nodeContext.getNodeId()) ? null : new String[] { currentStateId });\n        nodeContext.setActionResult(tstContext.getActionResult());\n        if (processContext.getBizNo() == null) {\n            processContext.setBizNo(context.getStateInstanceId());\n        }\n        if (context.isInterrupted()) {\n            processContext.setInterrupted();\n        }\n        processRuntimeService.nodeEndExec(nodeContext, processContext);\n    }\n    \n    private void onFsmEnd(FsmEvent event) {\n        onFsmEnd(event.getContext());\n    }\n\n    protected void onFsmEnd(FsmContext context) {\n        StdProcessContext processContext = context.getData(StdFsmProcessConstants.FSM_CTX_PROCESS_CTX);\n        if (context.isInterrupted()) {\n            processContext.setInterrupted();\n        }\n        processRuntimeService.processEndExec(processContext);\n    }\n    \n    private void onFsmComplete(FsmEvent event) {\n        onFsmComplete(event.getContext());\n    }\n\n    protected void onFsmComplete(FsmContext context) {\n        StdProcessContext processContext = context.getData(StdFsmProcessConstants.FSM_CTX_PROCESS_CTX);\n        processRuntimeService.processCompleteExec(processContext);\n    }\n\n    private Map<String, Object> assembleProcessProperties(FsmContext context) {\n        Map<String, Object> properties = new ConcurrentHashMap<String, Object>();\n        Map<String, Object> ctxProperties = context.getData(StdFsmProcessConstants.FSM_PROP_PROCESS);\n        if (ctxProperties != null) {\n            properties.putAll(ctxProperties);\n        }\n        String dataFlushPolicy = initDataFlushPolicy(context);\n        properties.put(StdProcessConstants.PROP_DATA_FLUSH_POLICY, dataFlushPolicy);\n\n        boolean checkFlushNodes = Boolean.TRUE\n                .equals(PropertiesUtil.get(context.getFsm().getProperty(StdFsmProcessConstants.FSM_PROP_PROCESS),\n                        StdProcessConstants.PROP_CHECK_FLUSH_NODES));\n        properties.put(StdProcessConstants.PROP_CHECK_FLUSH_NODES, checkFlushNodes);\n        if (checkFlushNodes) {\n            String[] flushNodes = initFlushNodes(context);\n            PropertiesUtil.put(properties, StdProcessConstants.PROP_FLUSH_NODES, flushNodes);\n        }\n        initStartAndEndNodeIds(context, properties);\n        \n        Map<String, Object> processInstanceStatusMessage = PropertiesUtil.get(\n                context.getFsm().getProperty(StdFsmProcessConstants.FSM_PROP_PROCESS),\n                StdProcessConstants.PROP_PROCESS_INSTANCE_STATUS_MESSAGE);\n        if (processInstanceStatusMessage != null) {\n            properties.put(StdProcessConstants.PROP_PROCESS_INSTANCE_STATUS_MESSAGE, processInstanceStatusMessage);\n        }\n        Map<String, Object> nodeInstanceStatusMessage = PropertiesUtil.get(\n                context.getFsm().getProperty(StdFsmProcessConstants.FSM_PROP_PROCESS),\n                StdProcessConstants.PROP_NODE_INSTANCE_STATUS_MESSAGE);\n        if (nodeInstanceStatusMessage != null) {\n            properties.put(StdProcessConstants.PROP_NODE_INSTANCE_STATUS_MESSAGE, nodeInstanceStatusMessage);\n        }\n        \n        if (log.isDebugEnabled()) {\n            log.debug(\"Assembled process context properties:\" + JSON.toJSONString(properties));\n        }\n        return properties;\n    }\n\n    private String initDataFlushPolicy(FsmContext context) {\n        String flushPolicy = PropertiesUtil.get(StdProcessConstants.PROP_DATA_FLUSH_POLICY,\n                context.getData(StdFsmProcessConstants.FSM_PROP_PROCESS),\n                context.getParam().get(StdFsmProcessConstants.FSM_PROP_PROCESS),\n                context.getFsm().getProperty(StdFsmProcessConstants.FSM_PROP_PROCESS)\n                );\n        if (flushPolicy == null) {\n            flushPolicy = StdProcessConstants.FLUSH_AFTER_PROCESS;\n        }\n        return flushPolicy;\n\n    }\n\n    private String[] initFlushNodes(FsmContext context) {\n        List<String> list = new ArrayList<String>();\n        context.getFsm().getStateList().forEach(node -> {\n            if (!Boolean.FALSE.equals(PropertiesUtil.get(node.getProperty(StdFsmProcessConstants.FSM_PROP_PROCESS),\n                    StdProcessConstants.PROP_FLUSH))) {\n                list.add(node.getId());\n            }\n        });\n        return list.toArray(new String[] {});\n    }\n\n    private void initStartAndEndNodeIds(FsmContext context, Map<String, Object> properties) {\n        List<String> startNodeIds = new ArrayList<String>();\n        String startStateId = context.getFsm().getStartStateId();\n        if (startStateId != null) {\n            startNodeIds.add(startStateId);\n        }\n        properties.put(StdProcessConstants.PROP_START_NODE_IDS, startNodeIds);\n\n        List<String> endStateIds = new ArrayList<String>();\n        context.getFsm().getStateList().forEach(state -> {\n            if (Boolean.TRUE.equals(state.getProperty(StdProcessConstants.PROP_END))) {\n                endStateIds.add(state.getId());\n            }\n        });\n        properties.put(StdProcessConstants.PROP_END_NODE_IDS, endStateIds);\n\n    }\n    \n    private void onFsmManagerStart(FsmEvent event) {\n        FsmParam param = (FsmParam) ((Map<String, Object>) event.getData()).get(\"param\");\n        FsmManager fsmManager = (FsmManager) ((Map<String, Object>) event.getData()).get(\"fsmManager\");\n        onFsmManagerStart(param, fsmManager);\n    }\n\n    protected void onFsmManagerStart(FsmParam param, FsmManager fsmManager) {\n        if (param != null && param.getFsmId() == null) {\n            String processType = param.get(StdFlowProcessConstants.FLOW_PARAM_PROCESS_TYPE);\n            String bizNo = param.get(StdFlowProcessConstants.FLOW_PARAM_BIZNO);\n            String instanceNo = param.get(StdFlowProcessConstants.FLOW_PARAM_INSTANCENO);\n            ProcessInstanceDTO processInstanceDto = null;\n            if (instanceNo != null) {\n                processInstanceDto = ExportResponseUtil\n                        .unwrap(getProcessInstanceExport().getProcessInstance(new ExportRequest<>(instanceNo)));\n            } else if (processType != null && bizNo != null) {\n                QueryProcessInstanceReq instanceReq = QueryProcessInstanceReq.builder().processType(processType)\n                        .bizNo(bizNo).build();\n                processInstanceDto = ExportResponseUtil.unwrap(getProcessInstanceExport()\n                        .queryProcessInstanceByProcessTypeAndBizNo(new ExportRequest<>(instanceReq)));\n            }\n            if (processInstanceDto != null) {\n                String fsmId = processInstanceDto.getProcessDefId().substring(\"FSM-\".length());\n                if (fsmManager != null && (fsmManager instanceof StdFsmManager)) {\n                    if (!fsmId.contains(StdFsmProcessConstants.VERSION_PREFIX)) {\n                        fsmId = fsmId + StdFsmProcessConstants.VERSION_PREFIX;\n                    }\n                    param.setFsmId(fsmId);\n                }\n            }\n        }\n    }\n\n    private String getLockKey(String processType, String bizNo) {\n        return processType + \"_\" + bizNo;\n    }\n\n    public ProcessRuntimeService getProcessRuntimeService() {\n        return processRuntimeService;\n    }\n\n    public void setProcessRuntimeService(ProcessRuntimeService processRuntimeService) {\n        this.processRuntimeService = processRuntimeService;\n    }\n\n    private ProcessInstanceExport getProcessInstanceExport() {\n        if (processInstanceExport == null) {\n            processInstanceExport = ObjectFactorys.getDefault().getObject(ProcessInstanceExport.class);\n        }\n        return processInstanceExport;\n    }\n    \n    @Override\n    public void postConstruct(Map<String, Object> definition, Map<String, Object> context) {}\n    \n    @Override\n    public void init(InitContext initContext, Object parent) {}\n\n    @Override\n    public void destroy() {}\n\n    public void setProcessInstanceExport(ProcessInstanceExport processInstanceExport) {\n        this.processInstanceExport = processInstanceExport;\n    }\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/fsm/StdProcessFsmManagerFilter.java",
    "content": "package com.jd.easyflow.process.client.fsm;\n\nimport com.jd.easyflow.fsm.FsmManager;\nimport com.jd.easyflow.fsm.FsmParam;\nimport com.jd.easyflow.fsm.FsmResult;\nimport com.jd.easyflow.fsm.filter.Filter;\nimport com.jd.easyflow.fsm.filter.FilterChain;\nimport com.jd.easyflow.fsm.util.Pair;\n\n/**\n * \n * @author liyuliang5\n */\npublic class StdProcessFsmManagerFilter extends StdProcessFsmListener implements Filter<Pair<FsmParam, FsmManager>, FsmResult> {\n\n    @Override\n    public FsmResult doFilter(Pair<FsmParam, FsmManager> param, FilterChain<Pair<FsmParam, FsmManager>, FsmResult> chain) {\n        super.onFsmManagerStart(param.getLeft(), param.getRight());\n        return chain.doFilter(param);\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/fsm/StdProcessFsmTransitionFilter.java",
    "content": "package com.jd.easyflow.process.client.fsm;\n\nimport com.jd.easyflow.fsm.FsmContext;\nimport com.jd.easyflow.fsm.filter.Filter;\nimport com.jd.easyflow.fsm.filter.FilterChain;\nimport com.jd.easyflow.fsm.model.Transition;\nimport com.jd.easyflow.fsm.model.TransitionContext;\nimport com.jd.easyflow.fsm.util.Triple;\n\n/**\n * \n * @author liyuliang5\n */\npublic class StdProcessFsmTransitionFilter extends StdProcessFsmListener implements Filter<Triple<Transition, TransitionContext, FsmContext>, Void> {\n\n    @Override\n    public Void doFilter(Triple<Transition, TransitionContext, FsmContext> request,\n            FilterChain<Triple<Transition, TransitionContext, FsmContext>, Void> chain) {\n        super.onTstStart(request.getMiddle(), request.getRight());\n        chain.doFilter(request);\n        super.onTstEnd(request.getMiddle(), request.getRight());\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/fsm/eventinfo/StdFsmProcessEventInfoListener.java",
    "content": "package com.jd.easyflow.process.client.fsm.eventinfo;\n\nimport com.jd.easyflow.fsm.event.FsmEvent;\nimport com.jd.easyflow.fsm.event.FsmEventListener;\nimport com.jd.easyflow.fsm.util.FsmConstants;\nimport com.jd.easyflow.fsm.util.Pair;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessInstanceDTO;\nimport com.jd.easyflow.process.client.fsm.StdFsmProcessConstants;\nimport com.jd.easyflow.process.client.runtime.StdProcessConstants;\nimport com.jd.easyflow.process.client.runtime.eventinfo.ProcessEventInfoCache;\nimport com.jd.easyflow.process.client.runtime.eventinfo.ProcessEventInfoListener;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class StdFsmProcessEventInfoListener implements FsmEventListener {\n\n    private ProcessEventInfoListener processEventInfoListener;\n\n    private static final Pair<String, Integer>[] DEFAULT_ACCEPTED_EVENTS = new Pair[] {\n            Pair.of(StdProcessConstants.EVENT_PROCESS_INSTANCE_START, FsmConstants.EVENT_ORDER_START),\n            Pair.of(StdProcessConstants.EVENT_PROCESS_INSTANCE_END, -FsmConstants.EVENT_ORDER_START),\n            Pair.of(StdProcessConstants.EVENT_NODE_INSTANCE_START, FsmConstants.EVENT_ORDER_START),\n            Pair.of(StdProcessConstants.EVENT_NODE_INSTANCE_END, -FsmConstants.EVENT_ORDER_START),\n            Pair.of(StdProcessConstants.EVENT_TXN_FLUSH_START, FsmConstants.EVENT_ORDER_START),\n            Pair.of(StdProcessConstants.EVENT_TXN_FLUSH_END, -FsmConstants.EVENT_ORDER_START) };\n\n    private Pair<String, Integer>[] acceptedEvents = DEFAULT_ACCEPTED_EVENTS;\n    \n    public StdFsmProcessEventInfoListener() {\n        this.processEventInfoListener = new ProcessEventInfoListener();\n    }\n    \n    public StdFsmProcessEventInfoListener(ProcessEventInfoListener processEventInfoListener) {\n        this.processEventInfoListener = processEventInfoListener;\n    }\n\n    @Override\n    public Pair<String, Integer>[] getAcceptedEvents() {\n        return acceptedEvents;\n    }\n\n    @Override\n    public void on(FsmEvent fsmEvent) {\n        switch (fsmEvent.getType()) {\n        case StdProcessConstants.EVENT_PROCESS_INSTANCE_START: {\n            ProcessEventInfoCache cache = getEventInfoCache(fsmEvent);\n            processEventInfoListener.onProcessInstanceStart((ProcessInstanceDTO) fsmEvent.getData(), cache);\n            break;\n        }\n        case StdProcessConstants.EVENT_PROCESS_INSTANCE_END: {\n            ProcessEventInfoCache cache = getEventInfoCache(fsmEvent);\n            processEventInfoListener.onProcessInstanceEnd((ProcessInstanceDTO) fsmEvent.getData(), cache);\n            break;\n        }\n        case StdProcessConstants.EVENT_NODE_INSTANCE_START: {\n            ProcessEventInfoCache cache = getEventInfoCache(fsmEvent);\n            processEventInfoListener.onNodeInstanceStart((Object[]) fsmEvent.getData(), cache);\n            break;\n        }\n        case StdProcessConstants.EVENT_NODE_INSTANCE_END: {\n            ProcessEventInfoCache cache = getEventInfoCache(fsmEvent);\n            processEventInfoListener.onNodeInstanceEnd((Object[]) fsmEvent.getData(), cache);\n            break;\n        }\n        case StdProcessConstants.EVENT_TXN_FLUSH_START: {\n            ProcessEventInfoCache cache = getEventInfoCache(fsmEvent);\n            processEventInfoListener.onTxnFlushStart(cache);\n            break;\n        }\n        case StdProcessConstants.EVENT_TXN_FLUSH_END: {\n            ProcessEventInfoCache container = getEventInfoCache(fsmEvent);\n            processEventInfoListener.onTxnFlushEnd(container);\n            break;\n        }\n        default:\n            break;\n        }\n\n    }\n\n    private ProcessEventInfoCache getEventInfoCache(FsmEvent event) {\n        ProcessEventInfoCache cache = event.getContext().getData(StdFsmProcessConstants.FSM_CTX_PROCESS_EVENT_INFO_CACHE);\n        if (cache == null) {\n            synchronized (event.getContext()) {\n                cache = event.getContext().getData(StdFsmProcessConstants.FSM_CTX_PROCESS_EVENT_INFO_CACHE);\n                if (cache == null) {\n                    cache = new ProcessEventInfoCache();\n                    event.getContext().putData(StdFsmProcessConstants.FSM_CTX_PROCESS_EVENT_INFO_CACHE, cache);\n                }\n            }\n\n        }\n        return cache;\n    }\n\n    public ProcessEventInfoListener getNodeInstanceStatusListener() {\n        return processEventInfoListener;\n    }\n\n    public void setNodeInstanceStatusListener(ProcessEventInfoListener nodeInstanceStatusListener) {\n        this.processEventInfoListener = nodeInstanceStatusListener;\n    }\n\n    public void setAcceptedEvents(Pair<String, Integer>[] acceptedEvents) {\n        this.acceptedEvents = acceptedEvents;\n    }\n\n}\n\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/runtime/CacheObject.java",
    "content": "package com.jd.easyflow.process.client.runtime;\n\n/**\n * @author liyuliang5\n *\n */\npublic class CacheObject<T> {\n\n    boolean dirty;\n\n    Object id;\n\n    T object;\n\n    int persistOp;\n\n    public boolean isDirty() {\n        return dirty;\n    }\n\n    public void setDirty(boolean dirty) {\n        this.dirty = dirty;\n    }\n\n    public Object getId() {\n        return id;\n    }\n\n    public void setId(Object id) {\n        this.id = id;\n    }\n\n    public T getObject() {\n        return object;\n    }\n\n    public void setObject(T object) {\n        this.object = object;\n    }\n\n    public int getPersistOp() {\n        return persistOp;\n    }\n\n    public void setPersistOp(int persistOp) {\n        this.persistOp = persistOp;\n    }\n\n    @Override\n    public String toString() {\n        return \"CacheObject [dirty=\" + dirty + \", id=\" + id + \", object=\" + object + \", persistOp=\" + persistOp + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/runtime/ObjectIdManager.java",
    "content": "package com.jd.easyflow.process.client.runtime;\n\nimport java.util.Arrays;\nimport java.util.HashMap;\nimport java.util.LinkedList;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponse;\nimport com.jd.easyflow.common.adapter.export.util.ExportResponseUtil;\nimport com.jd.easyflow.objects.factory.ObjectFactorys;\nimport com.jd.easyflow.process.adapter.export.ProcessTransactionExport;\nimport com.jd.easyflow.process.adapter.export.constant.ProcessTransactionConstants;\nimport com.jd.easyflow.process.adapter.export.dto.transaction.BatchObjectIdReq;\nimport com.jd.easyflow.process.adapter.export.dto.transaction.BatchObjectIdRes;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ObjectIdManager {\n    \n    private static final Logger logger = LoggerFactory.getLogger(ObjectIdManager.class);\n\n    public static final ObjectIdManager INSTANCE = new ObjectIdManager();\n\n    private Map<String, Integer> cacheSizeMap = new HashMap<>();\n\n    private Map<String, ObjectIdCache> objectIdCacheMap = new ConcurrentHashMap<>();\n\n    private ProcessTransactionExport processTransactionExport;\n\n    {\n        cacheSizeMap.put(ProcessTransactionConstants.TYPE_PROCESS, 20);\n        cacheSizeMap.put(ProcessTransactionConstants.TYPE_NODE, 50);\n        cacheSizeMap.put(ProcessTransactionConstants.TYPE_EXECUTION, 50);\n        cacheSizeMap.put(ProcessTransactionConstants.TYPE_TASK, 50);\n        cacheSizeMap.put(ProcessTransactionConstants.TYPE_TASK_ASSIGN, 50);\n        cacheSizeMap.put(ProcessTransactionConstants.TYPE_TASK_EVENT, 50);\n\n        objectIdCacheMap.put(ProcessTransactionConstants.TYPE_PROCESS, new ObjectIdCache());\n        objectIdCacheMap.put(ProcessTransactionConstants.TYPE_NODE, new ObjectIdCache());\n        objectIdCacheMap.put(ProcessTransactionConstants.TYPE_EXECUTION, new ObjectIdCache());\n        objectIdCacheMap.put(ProcessTransactionConstants.TYPE_TASK, new ObjectIdCache());\n        objectIdCacheMap.put(ProcessTransactionConstants.TYPE_TASK_ASSIGN, new ObjectIdCache());\n        objectIdCacheMap.put(ProcessTransactionConstants.TYPE_TASK_EVENT, new ObjectIdCache());\n\n    }\n\n    public String nextObjectId(String type) {\n        if (logger.isDebugEnabled()) {\n            logger.debug(\"Get ID, type:\" + type);\n        }\n        ObjectIdCache cache = objectIdCacheMap.get(type);\n        String id = cache.getNext();\n        if (id != null) {\n            if (logger.isDebugEnabled()) {\n                logger.debug(\"Return ID:\" + id);\n            }\n            return id;\n        }\n        BatchObjectIdReq req = new BatchObjectIdReq();\n        req.setType(type);\n        req.setNum(cacheSizeMap.get(type));\n        ExportResponse<BatchObjectIdRes> response = getProcessTransactionExport()\n                .batchNextObjectId(new ExportRequest(req));\n        BatchObjectIdRes res = ExportResponseUtil.unwrap(response);\n        id = cache.addIdsAndGetNext(res.getIds());\n        if (logger.isDebugEnabled()) {\n            logger.debug(\"Return ID:\" + id);\n        }\n        return id;\n    }\n\n    private ProcessTransactionExport getProcessTransactionExport() {\n        if (processTransactionExport != null) {\n            return processTransactionExport;\n        }\n        processTransactionExport = ObjectFactorys.getDefault().getObject(ProcessTransactionExport.class);\n        return processTransactionExport;\n    }\n\n    public Map<String, Integer> getCacheSizeMap() {\n        return cacheSizeMap;\n    }\n\n    public void setCacheSizeMap(Map<String, Integer> cacheSizeMap) {\n        this.cacheSizeMap = cacheSizeMap;\n    }\n\n    private static class ObjectIdCache {\n\n        LinkedList<String> cacheList = new LinkedList<>();\n\n        public synchronized String getNext() {\n            return cacheList.poll();\n        }\n\n        public synchronized String addIdsAndGetNext(String[] ids) {\n            cacheList.addAll(Arrays.asList(ids));\n            return cacheList.pop();\n        }\n\n    }\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/runtime/ProcessCache.java",
    "content": "package com.jd.easyflow.process.client.runtime;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.Iterator;\nimport java.util.LinkedHashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport com.jd.easyflow.process.adapter.export.constant.ProcessTransactionConstants;\nimport com.jd.easyflow.process.adapter.export.dto.transaction.TxnCommand;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessCache {\n\n    private Map<Class, Map<Object, CacheObject<?>>> cacheObjectMap = new ConcurrentHashMap<Class, Map<Object, CacheObject<?>>>();\n\n    private List<TxnCommand> commandList = Collections.synchronizedList(new ArrayList<TxnCommand>());\n\n    public <T> Iterable<T> objects(Class<T> clazz) {\n        return new ObjectIterator<T>(clazz);\n    }\n\n    public <T> T get(Class<T> clazz, Object id) {\n        Map<Object, CacheObject<?>> objectMap = cacheObjectMap.get(clazz);\n        if (objectMap == null) {\n            return null;\n        }\n        CacheObject<T> cacheObject = (CacheObject<T>) objectMap.get(id);\n        if (cacheObject == null) {\n            return null;\n        }\n        return cacheObject.getObject();\n    }\n    \n    public <T>CacheObject<T> getCacheObject(Class<T> clazz, Object id) {\n        Map<Object, CacheObject<?>> objectMap = cacheObjectMap.get(clazz);\n        if (objectMap == null) {\n            return null;\n        }\n        CacheObject<T> cacheObject = (CacheObject<T>) objectMap.get(id);\n        return cacheObject;\n    }\n\n    public void put(Object id, Object o, boolean dirty) {\n        Map<Object, CacheObject<?>> objectMap = cacheObjectMap.get(o.getClass());\n        if (objectMap == null) {\n            objectMap = Collections.synchronizedMap(new LinkedHashMap<>());\n            cacheObjectMap.put(o.getClass(), objectMap);\n        }\n        CacheObject cacheObject = (CacheObject) objectMap.get(id);\n        if (cacheObject == null) {\n            cacheObject = new CacheObject<>();\n            cacheObject.setId(id);\n            cacheObject.setObject(o);\n            cacheObject.setDirty(dirty);\n            if (dirty) {\n                cacheObject.setPersistOp(ProcessTransactionConstants.PERSIST_OP_ADD);\n            } else {\n                cacheObject.setPersistOp(ProcessTransactionConstants.PERSIST_OP_NONE);\n            }\n            objectMap.put(id, cacheObject);\n        } else {\n            cacheObject.setObject(o);\n            cacheObject.setDirty(dirty);\n            if (dirty) {\n                if (ProcessTransactionConstants.PERSIST_OP_NONE == cacheObject.getPersistOp()) {\n                    cacheObject.setPersistOp(ProcessTransactionConstants.PERSIST_OP_UPDATE);\n                }\n            } else {\n                cacheObject.setPersistOp(ProcessTransactionConstants.PERSIST_OP_NONE);\n            }\n        }\n    }\n\n    public void addTxnCommand(TxnCommand command) {\n        commandList.add(command);\n    }\n\n    public void addTxnCommand(int index, TxnCommand command) {\n        commandList.add(index, command);\n    }\n\n    public void clearTxnCommand() {\n        commandList.clear();\n    }\n\n    class ObjectIterator<T> implements Iterator<T>, Iterable<T> {\n        Map<Object, CacheObject<?>> objectMap;\n        Iterator<Entry<Object, CacheObject<?>>> entryIterator;\n\n        public ObjectIterator(Class clazz) {\n            objectMap = cacheObjectMap.get(clazz);\n            if (objectMap != null) {\n                entryIterator = objectMap.entrySet().iterator();\n            }\n        }\n\n        @Override\n        public boolean hasNext() {\n            return entryIterator != null && entryIterator.hasNext();\n        }\n\n        @Override\n        public T next() {\n            return (T) entryIterator.next().getValue().getObject();\n        }\n\n        @Override\n        public Iterator<T> iterator() {\n            return this;\n        }\n    }\n\n    public Map<Class, Map<Object, CacheObject<?>>> getCacheObjectMap() {\n        return cacheObjectMap;\n    }\n\n    public void setCacheObjectMap(Map<Class, Map<Object, CacheObject<?>>> cacheObjectMap) {\n        this.cacheObjectMap = cacheObjectMap;\n    }\n\n    public List<TxnCommand> getCommandList() {\n        return commandList;\n    }\n\n    public void setCommandList(List<TxnCommand> commandList) {\n        this.commandList = commandList;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/runtime/ProcessConverter.java",
    "content": "package com.jd.easyflow.process.client.runtime;\n\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessInstanceDTO;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessConverter {\n    \n    public static ProcessConverter INSTANCE = new ProcessConverter();\n\n    public void copy(ProcessInstanceDTO source, ProcessInstanceDTO target) {\n        if ( source == null ) {\n            return;\n        }\n\n        target.setBizData( source.getBizData() );\n        target.setBizNo( source.getBizNo() );\n        target.setBizStatus( source.getBizStatus() );\n        target.setCreatedDate( source.getCreatedDate() );\n        target.setCreator( source.getCreator() );\n        target.setCurrentNodeIds( source.getCurrentNodeIds() );\n        target.setEndTime( source.getEndTime() );\n        target.setExtData( source.getExtData() );\n        target.setInstanceName( source.getInstanceName() );\n        target.setInstanceNo( source.getInstanceNo() );\n        target.setKeyField( source.getKeyField() );\n        target.setKeyField2( source.getKeyField2() );\n        target.setModifiedDate( source.getModifiedDate() );\n        target.setParentInstanceNo( source.getParentInstanceNo() );\n        target.setParentNodeInstanceNo( source.getParentNodeInstanceNo() );\n        target.setProcessDefId( source.getProcessDefId() );\n        target.setProcessType( source.getProcessType() );\n        target.setProductCode( source.getProductCode() );\n        target.setStartTime( source.getStartTime() );\n        target.setStatus( source.getStatus() );\n        target.setVars( source.getVars() );\n    }}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/runtime/ProcessInclusiveCheckHelper.java",
    "content": "package com.jd.easyflow.process.client.runtime;\n\nimport java.util.ArrayList;\nimport java.util.Date;\nimport java.util.HashSet;\nimport java.util.Iterator;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.model.NodeContextAccessor;\nimport com.jd.easyflow.flow.util.FlowConstants;\nimport com.jd.easyflow.flow.util.FlowNodeLinkUtil;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessNodeInstanceDTO;\n\n/**\n * Inner process inclusive check helper.\n */\nclass ProcessInclusiveCheckHelper  {\n    \n    private static final Logger log = LoggerFactory.getLogger(ProcessInclusiveCheckHelper.class);\n    \n    static final String CTX_WAITING_NODE_MAP = \"_WAITING_NODE_MAP\";\n    \n    static void nodeStartExec(StdNodeContext nodeContext, StdProcessContext context, ProcessNodeInstanceDTO nodeInstance, ProcessRuntimeManager manager) {\n        if (StdProcessConstants.NODE_STATUS_ACTIVE.equals(nodeInstance.getStatus())) {\n            log.info(\"Node \" + nodeContext + \" finish precheck\");\n            nodeContext.setPreResult(false);\n        } else if (StdProcessConstants.NODE_STATUS_INACTIVE.equals(nodeInstance.getStatus())) {\n            boolean preResult = false;\n            FlowContext flowContext = context.getEngineProcessContext();\n            Map<String, WaitingNodeInfo> map = getWaitingNodeInfoMap(context, manager);\n            WaitingNodeInfo waitingNodeInfo = map.get(nodeContext.getNodeId());\n            if (waitingNodeInfo == null) {\n                waitingNodeInfo = createWaitingNodeInfo(nodeContext.getNodeId(), nodeContext.getConfigPreNodeIds(), flowContext.getFlow());\n                map.put(nodeContext.getNodeId(), waitingNodeInfo);\n            }\n            boolean active = false;\n            String previousNodeId = nodeContext.getPreviousNodeId();\n            if (waitingNodeInfo.unknownPreNodes.contains(previousNodeId)) {\n                waitingNodeInfo.finishedPreNodes.add(previousNodeId);\n                waitingNodeInfo.unknownPreNodes.remove(previousNodeId);\n            }\n            if (waitingNodeInfo.unknownPreNodes.size() == 0) {\n                log.info(\"Node:\" + nodeContext.getNodeId() + \" is activated\");\n                map.remove(nodeContext.getNodeId());\n                active = true;\n            } else {\n                ProcessInclusiveCheckHelper.judgeOneWaitingNode(waitingNodeInfo, context, manager);\n                if (waitingNodeInfo.unknownPreNodes.size() == 0) {\n                        log.info(\"Node:\" + nodeContext.getNodeId() + \" is activated\");\n                    map.remove(nodeContext.getNodeId());\n                    active = true;\n                } else {\n                    if (log.isDebugEnabled()) {\n                        log.debug(\"Finish nodes:\" + waitingNodeInfo.finishedPreNodes + \" Unreachable nodes:\" + waitingNodeInfo.unreachablePreNodes + \" Unknown nodes:\" + waitingNodeInfo.unknownPreNodes);\n                    }\n                    active = false;\n                }\n            }\n\n            if (active) {\n                log.info(nodeInstance.getNodeInstanceNo() + \" \" + nodeInstance.getNodeId() + \" node is active\");\n                nodeInstance.setStatus(StdProcessConstants.NODE_STATUS_ACTIVE);\n                manager.updateNodeInstance(nodeInstance, context);\n                if (context.getNodeStartEventPolicy() == StdProcessConstants.NODE_START_EVENT_POLICY_ACTIVE) {\n                    nodeInstance.setStartTime(new Date());\n                    context.getEventTriggerFunction().apply(new Object[] { StdProcessConstants.EVENT_NODE_INSTANCE_START, new Object[] {nodeInstance, nodeContext} });\n                }\n                preResult = true;\n            }\n            nodeContext.setPreResult(preResult);\n        } else {\n            throw new IllegalStateException(\"Illegal node status:\" + nodeInstance);\n        }\n    \n    }\n    \n    private static Map<String, WaitingNodeInfo> getWaitingNodeInfoMap(StdProcessContext context, ProcessRuntimeManager manager) {\n        Map<String, WaitingNodeInfo> map = context.get(CTX_WAITING_NODE_MAP);\n        if (map == null) {\n            map = new ConcurrentHashMap<String, WaitingNodeInfo>();\n            context.put(ProcessInclusiveCheckHelper.CTX_WAITING_NODE_MAP, map);\n            List<ProcessNodeInstanceDTO> openNodeInstances = manager.findOpenNodeInstances(context);\n            FlowContext flowContext = (FlowContext) context.getEngineProcessContext();\n            Flow flow = flowContext.getFlow();\n            for (ProcessNodeInstanceDTO nodeInstance : openNodeInstances) {\n                if (! StdProcessConstants.NODE_STATUS_INACTIVE.equals(nodeInstance.getStatus())) {\n                    continue;\n                }\n                \n                String nodeId = nodeInstance.getNodeId();\n                String preCheckType = FlowNodeLinkUtil.getPreCheckType(nodeId, flow);\n                if (FlowConstants.NODE_PRE_CHECK_TYPE_INCLUSIVECHECK.equals(preCheckType)) {\n                    List<String> preNodes = FlowNodeLinkUtil.getPreCheckNodes(nodeId, flow);\n                    WaitingNodeInfo waitingNodeInfo = createWaitingNodeInfo(nodeId, preNodes, flow);\n                    List<ProcessNodeInstanceDTO> previousNodeInstances = getPreviousNodeInstances(nodeInstance, context, manager);\n                    for (ProcessNodeInstanceDTO previousNodeInstance : previousNodeInstances) {\n                        waitingNodeInfo.finishedPreNodes.add(previousNodeInstance.getNodeId());\n                        waitingNodeInfo.unknownPreNodes.remove(previousNodeInstance.getNodeId());\n                    }\n                    map.put(nodeId, waitingNodeInfo);\n                }\n            }\n        }\n        return map;\n    }\n    \n    private static WaitingNodeInfo createWaitingNodeInfo(String nodeId, List<String> configPreNodes, Flow flow) {\n        WaitingNodeInfo waitingNodeInfo = new WaitingNodeInfo();\n        waitingNodeInfo.waitNodeId = nodeId;\n        waitingNodeInfo.unknownPreNodes = new HashSet<String>();\n        waitingNodeInfo.finishedPreNodes = new HashSet<String>();\n        waitingNodeInfo.unreachablePreNodes = new HashSet<String>();\n        \n        for (String preNode : configPreNodes) {\n            if (FlowNodeLinkUtil.isReachable(preNode, nodeId, flow)) {\n                waitingNodeInfo.unknownPreNodes.add(preNode);\n            } else {\n                waitingNodeInfo.unreachablePreNodes.add(preNode);\n            }\n        }\n        return waitingNodeInfo;\n    }\n    \n    static void nodeEndExec(StdNodeContext nodeContext, StdProcessContext context, ProcessRuntimeManager manager) {\n        if (! (context.getEngineProcessContext() instanceof FlowContext)) {\n            return;\n        }\n        Map<String, WaitingNodeInfo> map = getWaitingNodeInfoMap(context, manager);\n        if (map != null && !map.isEmpty()) {\n            List<NodeContext> additionalNextNodes = null;\n            NodeContext nodeCtx = nodeContext.getEngineNodeContext();\n            for (WaitingNodeInfo info : map.values()) {\n                if (info.waitNodeId.equals(nodeContext.getNodeId())) {\n                    continue;\n                }\n                ProcessInclusiveCheckHelper.judgeOneWaitingNode(info, context, manager);\n                if (info.unknownPreNodes.isEmpty()) {\n                        log.info(\"Node:\" + info.waitNodeId + \" is activated in node end exec\");\n                    if (additionalNextNodes == null) {\n                        additionalNextNodes = new ArrayList<NodeContext>();\n                        if (nodeCtx.getNextNodes() != null) {\n                            for (NodeContext nc : nodeCtx.getNextNodes()) {\n                                additionalNextNodes.add(nc);\n                            }\n                        }\n                    }\n                    NodeContext additionNode = new NodeContext(info.waitNodeId);\n                    additionalNextNodes.add(additionNode);\n                }\n            }\n            if (additionalNextNodes != null) {\n                NodeContextAccessor.setNextNodes(nodeCtx, additionalNextNodes.toArray(new NodeContext[additionalNextNodes.size()]));\n                String[] nextNodeIds = new String[additionalNextNodes.size()];\n                for (int i = 0; i < additionalNextNodes.size(); i++) {\n                    nextNodeIds[i] = additionalNextNodes.get(i).getNodeId();\n                }\n                nodeContext.setNextNodeIds(nextNodeIds);\n            }\n        }\n    }\n\n    static void judgeOneWaitingNode(WaitingNodeInfo info, StdProcessContext processContext, ProcessRuntimeManager manager) {\n        FlowContext context = (FlowContext) processContext.getEngineProcessContext();\n        List<ProcessNodeInstanceDTO> openNodeInstances = manager.findOpenNodeInstances(processContext);\n        List<String> endNodeIds = processContext.getProcessProperty(StdProcessConstants.PROP_END_NODE_IDS);\n\n        Iterator<String> iterator = info.unknownPreNodes.iterator();\n        while (iterator.hasNext()) {\n            String unknownPreNode = iterator.next();\n            boolean reachable = false;\n            for (ProcessNodeInstanceDTO nodeInstance : openNodeInstances) {\n                if (endNodeIds != null && endNodeIds.contains(nodeInstance.getNodeId())) {\n                    continue;\n                }\n                if (nodeInstance.getNodeId().equals(unknownPreNode)) {\n                    reachable = true;\n                    break;\n                }\n                if (nodeInstance.getNodeId().equals(info.waitNodeId)) {\n                    if (previousNodesContainsNodeId(nodeInstance, unknownPreNode, processContext, manager)) {\n                        reachable = true;\n                        break;\n                    } else {\n                        continue;\n                    }\n                }\n                if (FlowNodeLinkUtil.isReachable(nodeInstance.getNodeId(), unknownPreNode, context.getFlow())) {\n                    reachable = true;\n                    break;\n                }\n            }\n            if (! reachable) {\n                info.unreachablePreNodes.add(unknownPreNode);\n                iterator.remove();\n\n            }\n        }\n    }\n    \n    private static boolean previousNodesContainsNodeId(ProcessNodeInstanceDTO nodeInstance, String nodeId,\n            StdProcessContext context, ProcessRuntimeManager manager) {\n        List<ProcessNodeInstanceDTO> previousNodeInstances = getPreviousNodeInstances(nodeInstance, context, manager);\n        for (ProcessNodeInstanceDTO previousNodeInstance : previousNodeInstances) {\n            if (previousNodeInstance.getNodeId().equals(nodeId)) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    private static List<ProcessNodeInstanceDTO> getPreviousNodeInstances(ProcessNodeInstanceDTO nodeInstance, StdProcessContext context, ProcessRuntimeManager manager) {\n        List<ProcessNodeInstanceDTO> previousNodeInstances = new ArrayList<ProcessNodeInstanceDTO>();\n        String previousNodeInstanceStr = nodeInstance.getPreviousNodeInstances();\n        if (previousNodeInstanceStr != null && ! previousNodeInstanceStr.isEmpty()) {\n            String[] previousNodeInstanceNos = previousNodeInstanceStr.split(\",\");\n            for (String nodeInstanceNo : previousNodeInstanceNos) {\n                ProcessNodeInstanceDTO previousNodeInstance = manager.getNodeInstance(nodeInstanceNo, context);\n                previousNodeInstances.add(previousNodeInstance);\n            }\n        }\n        return previousNodeInstances;\n    }\n    \n\n}\n\n\n\nclass WaitingNodeInfo {\n    \n    String waitNodeId;\n    \n    Set<String> finishedPreNodes;\n    Set<String> unreachablePreNodes;\n    Set<String> unknownPreNodes;\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/runtime/ProcessRuntimeErrorCode.java",
    "content": "package com.jd.easyflow.process.client.runtime;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic enum ProcessRuntimeErrorCode {\n\n    PR_0101(\"Start node close, can not execute\"),\n    PR_0102(\"Not start node or open node, can not execute\"),\n    PR_0103(\"Process instance is closed, can not execute\"),\n    PR_0104(\"Process instance is canncelled, can not execute\");\n\n    private String desc;\n\n    ProcessRuntimeErrorCode(String desc) {\n        this.desc = desc;\n    }\n\n    public String getDesc() {\n        return desc;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/runtime/ProcessRuntimeManager.java",
    "content": "package com.jd.easyflow.process.client.runtime;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.Objects;\nimport java.util.Set;\nimport java.util.function.Supplier;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.adapter.export.util.ExportResponseUtil;\nimport com.jd.easyflow.objects.factory.ObjectFactorys;\nimport com.jd.easyflow.process.adapter.export.ProcessInstanceExport;\nimport com.jd.easyflow.process.adapter.export.ProcessTransactionExport;\nimport com.jd.easyflow.process.adapter.export.constant.ProcessTransactionConstants;\nimport com.jd.easyflow.process.adapter.export.dto.instance.LockProcessInstanceReq;\nimport com.jd.easyflow.process.adapter.export.dto.instance.PersistDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessInstanceDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessNodeExecutionDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessNodeInstanceDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.QueryProcessInstanceReq;\nimport com.jd.easyflow.process.adapter.export.dto.instance.QueryProcessNodeReqDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.StdProcessContextDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.StdProcessDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.UnlockProcessInstanceReq;\nimport com.jd.easyflow.process.adapter.export.dto.transaction.TxnCommand;\nimport com.jd.easyflow.process.adapter.export.dto.transaction.TxnReq;\nimport com.jd.easyflow.process.adapter.export.dto.transaction.TxnRes;\nimport com.jd.easyflow.process.adapter.export.dto.transaction.command.BatchUpdateTxnCommand;\nimport com.jd.easyflow.process.adapter.export.dto.transaction.command.InterruptTxnCommand;\nimport com.jd.easyflow.process.client.common.PropertiesUtil;\nimport com.jd.easyflow.process.client.runtime.core.ProcessException;\nimport com.jd.easyflow.process.client.util.ExportRequestBuilder;\nimport com.jd.easyflow.process.client.util.Pair;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n * \n * @author liyuliang5\n * \n */\npublic class ProcessRuntimeManager {\n    \n    private static final Logger log = LoggerFactory.getLogger(ProcessRuntimeManager.class);\n\n\n    private ProcessInstanceExport processInstanceExport;\n\n    private ProcessTransactionExport processTransactionExport;\n\n    private ObjectIdManager objectIdManager = ObjectIdManager.INSTANCE;\n    \n    public static final String EXECUTION_PERSIST_TYPE_ALL = \"ALL\";\n    public static final String EXECUTION_PERSIST_TYPE_NEXT = \"NEXT\";\n    public static final String EXECUTION_PERSIST_TYPE_EVENT_AND_NEXT = \"EVENT_AND_NEXT\";\n    public static final String EXECUTION_PERSIST_TYPE_NONE = \"NONE\";\n    \n    private String executionPersistType = EXECUTION_PERSIST_TYPE_NEXT;\n    \n    private boolean executionPersistActionResult = false;\n    \n    private ExportRequestBuilder exportRequestBuilder = ExportRequestBuilder.getInstance();\n\n\n    /**\n     * \n     * @param processType\n     * @param bizNo\n     * @param context\n     * @return\n     */\n    public ProcessInstanceDTO getProcessInstanceByProcessTypeAndBizNo(String processType, String bizNo,\n            StdProcessContext context) {\n        return op(context, () -> {\n            ProcessCache cache = context.getCache();\n            for (ProcessInstanceDTO dto : cache.objects(ProcessInstanceDTO.class)) {\n                if (Objects.equals(dto.getProcessType(), processType)\n                        && Objects.equals(dto.getBizNo(), bizNo)) {\n                    return dto;\n                }\n            }\n            QueryProcessInstanceReq queryReq = QueryProcessInstanceReq.builder().processType(processType).bizNo(bizNo)\n                    .build();\n            ExportRequest<QueryProcessInstanceReq> request =  exportRequestBuilder.build(queryReq, context);\n            ProcessInstanceDTO instance = ExportResponseUtil\n                    .unwrap(getProcessInstanceExport().queryProcessInstanceByProcessTypeAndBizNo(request));\n            if (instance != null) {\n                cache.put(instance.getInstanceNo(), instance, false);\n            }\n            return instance;\n        });\n    }\n\n    /**\n     * \n     * @param processType\n     * @param bizNo\n     * @param context\n     * @return\n     */\n    public ProcessInstanceDTO getActiveProcessInstanceByProcessTypeAndBizNo(String processType, String bizNo,\n            StdProcessContext context) {\n        return op(context, () -> {\n            ProcessCache cache = context.getCache();\n            for (ProcessInstanceDTO dto : cache.objects(ProcessInstanceDTO.class)) {\n                if (Objects.equals(dto.getProcessType(), dto.getProcessType())\n                        && Objects.equals(dto.getBizNo(), bizNo)\n                        && StdProcessConstants.STATUS_ACTIVE.equals(dto.getStatus())) {\n                    return dto;\n                }\n            }\n            QueryProcessInstanceReq queryReq = QueryProcessInstanceReq.builder().processType(processType).bizNo(bizNo)\n                    .build();\n            ExportRequest<QueryProcessInstanceReq> request = exportRequestBuilder.build(queryReq, context);\n            ProcessInstanceDTO instance = ExportResponseUtil\n                    .unwrap(getProcessInstanceExport().queryActiveProcessInstanceByProcessTypeAndBizNo(request));\n            if (instance != null) {\n                cache.put(instance.getInstanceNo(), instance, false);\n            }\n            return instance;\n        });\n    }\n\n    public ProcessInstanceDTO createProcessInstance(ProcessInstanceDTO instanceInfo, StdProcessContext context) {\n        ProcessInstanceDTO instance = new ProcessInstanceDTO();\n        ProcessConverter.INSTANCE.copy(instanceInfo, instance);\n        String instanceNo = instanceInfo.getInstanceNo();\n        if (instanceNo == null) {\n            instanceNo = objectIdManager.nextObjectId(ProcessTransactionConstants.TYPE_PROCESS);\n        }\n        instance.setInstanceNo(instanceNo);\n        instance.setStartTime(new Date());\n        instance.setStatus(StdProcessConstants.STATUS_ACTIVE);\n        instance.setCreatedDate(new Date());\n        context.getCache().put(instance.getInstanceNo(), instance, true);\n        return instance;\n    }\n\n    public ProcessNodeInstanceDTO getNodeInstance(String nodeInstanceNo, StdProcessContext context) {\n        return op(context, () -> {\n            ProcessNodeInstanceDTO instance = context.getCache().get(ProcessNodeInstanceDTO.class, nodeInstanceNo);\n            if (instance != null) {\n                return instance;\n            }\n            instance = ExportResponseUtil\n                    .unwrap(getProcessInstanceExport().queryNodeInstanceByNo(exportRequestBuilder.build(nodeInstanceNo, context)));\n            context.getCache().put(instance.getNodeInstanceNo(), instance, false);\n            return instance;\n        });\n    }\n\n    public List<ProcessNodeInstanceDTO> getNodeInstances(List<String> nodeInstanceNoList, StdProcessContext context) {\n        return op(context, () -> {\n            Map<String, ProcessNodeInstanceDTO> resultMap = new HashMap<>();\n            List<String> queryList = new ArrayList<>();\n            for (String nodeInstanceNo : nodeInstanceNoList) {\n                ProcessNodeInstanceDTO nodeInstance = context.getCache().get(ProcessNodeInstanceDTO.class,\n                        nodeInstanceNo);\n                if (nodeInstance != null) {\n                    resultMap.put(nodeInstanceNo, nodeInstance);\n                } else {\n                    queryList.add(nodeInstanceNo);\n                }\n            }\n            if (queryList.size() > 0) {\n                List<ProcessNodeInstanceDTO> nodeInstanceList = ExportResponseUtil\n                        .unwrap(getProcessInstanceExport().queryNodeInstanceByNos(exportRequestBuilder.build(queryList, context)));\n                for (ProcessNodeInstanceDTO nodeInstance : nodeInstanceList) {\n                    context.getCache().put(nodeInstance.getNodeInstanceNo(), context, false);\n                    resultMap.put(nodeInstance.getNodeInstanceNo(), nodeInstance);\n                }\n            }\n            List<ProcessNodeInstanceDTO> result = new ArrayList<>();\n            for (String nodeInstanceNo : nodeInstanceNoList) {\n                ProcessNodeInstanceDTO nodeInstance = resultMap.get(nodeInstanceNo);\n                if (nodeInstance == null) {\n                    throw new ProcessException(\"Node:\" + nodeInstanceNo + \" not exists\");\n                }\n                result.add(nodeInstance);\n            }\n            return result;\n        });\n    }\n\n    public ProcessInstanceDTO getProcessInstance(StdProcessContext context) {\n        return op(context, () -> {\n            ProcessInstanceDTO instance = context.getCache().get(ProcessInstanceDTO.class, context.getInstanceNo());\n            if (instance != null) {\n                return instance;\n            }\n            instance = ExportResponseUtil.unwrap(\n                    getProcessInstanceExport().getProcessInstance(exportRequestBuilder.build(context.getInstanceNo(), context)));\n            if (instance != null) {\n                context.getCache().put(instance.getInstanceNo(), instance, false);\n            }\n            return instance;\n        });\n    }\n\n    /**\n     * \n     * @param nodeId\n     * @param context\n     * @return\n     */\n    public ProcessNodeInstanceDTO getOpenNodeInstance(String nodeId, StdProcessContext context) {\n        if (log.isDebugEnabled()) {\n            log.debug(\"Query node:{} active instances\", nodeId);\n        }\n        return op(context, () -> {\n            String instanceNo = context.getInstanceNo();\n            for (ProcessNodeInstanceDTO nodeInstance : context.getCache().objects(ProcessNodeInstanceDTO.class)) {\n                if (Objects.equals(nodeInstance.getProcessInstanceNo(), instanceNo)\n                        && Objects.equals(nodeId, nodeInstance.getNodeId())\n                        && !Objects.equals(nodeInstance.getStatus(), StdProcessConstants.NODE_STATUS_CLOSE)\n                        && !Objects.equals(nodeInstance.getStatus(), StdProcessConstants.NODE_STATUS_INVALID)) {\n                    if (log.isDebugEnabled()) {\n                        log.debug(\"cache return:{}\", nodeInstance);\n                    }\n                    return nodeInstance;\n                }\n            }\n            return null;\n        });\n    }\n\n    public ProcessNodeInstanceDTO getOneNodeInstance(String nodeId, StdProcessContext context) {\n        if (log.isDebugEnabled()) {\n            log.debug(\"Query one instance of node:{}\", nodeId);\n        }\n        return op(context, () -> {\n            String instanceNo = context.getInstanceNo();\n            for (ProcessNodeInstanceDTO nodeInstance : context.getCache().objects(ProcessNodeInstanceDTO.class)) {\n                if (Objects.equals(nodeInstance.getProcessInstanceNo(), instanceNo)\n                        && Objects.equals(nodeId, nodeInstance.getNodeId())) {\n                    if (log.isDebugEnabled()) {\n                        log.debug(\"Cache return:{}\", nodeInstance);\n                    }\n                    return nodeInstance;\n                }\n            }\n            QueryProcessNodeReqDTO queryProcessNodeReq = QueryProcessNodeReqDTO.builder().nodeId(nodeId)\n                    .processInstanceNo(instanceNo).build();\n            List<ProcessNodeInstanceDTO> nodeInstanceList = ExportResponseUtil\n                    .unwrap(getProcessInstanceExport().findNodeInstances(exportRequestBuilder.build(queryProcessNodeReq, context)));\n            if (log.isDebugEnabled()) {\n                log.debug(\"Database return:{}\", nodeInstanceList);\n            }\n            if (nodeInstanceList != null && ! nodeInstanceList.isEmpty()) {\n                nodeInstanceList.forEach(\n                        nodeInstance -> context.getCache().put(nodeInstance.getNodeInstanceNo(), nodeInstance, false));\n                for (ProcessNodeInstanceDTO instance : nodeInstanceList) {\n                    if (!StdProcessConstants.NODE_STATUS_INVALID.equals(instance.getStatus())) {\n                        return instance;\n                    }\n                }\n            }\n            return null;\n        });\n    }\n\n    public ProcessNodeInstanceDTO getOrCreateOpenNodeInstance(String nodeId, StdProcessContext context) {\n        return op(context, () -> {\n            ProcessNodeInstanceDTO nodeInstance = getOpenNodeInstance(nodeId, context);\n            if (nodeInstance == null) {\n                nodeInstance = createNodeInstance(nodeId, context);\n                if (log.isInfoEnabled()) {\n                    log.info(\"Create node instance,node id:{},node instance id:{}\", nodeInstance.getNodeId(), nodeInstance.getNodeInstanceNo());\n                } else if (log.isDebugEnabled()) {\n                    log.debug(\"Create node instance:{}\", nodeInstance);\n                }\n            }\n            return nodeInstance;\n        });\n    }\n    \n    public Pair<ProcessNodeInstanceDTO, Boolean> getOrCreateOpenNodeInstanceWithCreateFlag(String nodeId, StdProcessContext context) {\n        return op(context, () -> {\n            ProcessNodeInstanceDTO nodeInstance = getOpenNodeInstance(nodeId, context);\n            boolean create = false;\n            if (nodeInstance == null) {\n                create = true;\n                nodeInstance = createNodeInstance(nodeId, context);\n                if (log.isInfoEnabled()) {\n                    log.info(\"Create node instance,node id:{},node instance id:{}\", nodeInstance.getNodeId(), nodeInstance.getNodeInstanceNo());\n                } else if (log.isDebugEnabled()) {\n                    log.debug(\"Create node instance:{}\", nodeInstance);\n                }\n            }\n            return Pair.of(nodeInstance, create);\n        });\n    }\n    \n    public void updateProcessExtData(Map<String, Object> extData, StdProcessContext context) {\n        op(context, () -> {\n            ProcessInstanceDTO processInstance = getProcessInstance(context);\n            if (extData != null && extData.size() > 0) {\n                String currentExtDataStr = processInstance.getExtData();\n                Map<String, Object> currentExtData = JSON.parseObject(currentExtDataStr, Map.class);\n                if (currentExtData == null) {\n                    currentExtData = new HashMap<>();\n                }\n                for (Entry<String, Object> entry : extData.entrySet()) {\n                    currentExtData.put(entry.getKey(), entry.getValue());\n                }\n                String newExtDataStr = JSON.toJSONString(currentExtData);\n                if (!Objects.equals(currentExtDataStr, newExtDataStr)) {\n                    processInstance.setExtData(newExtDataStr);\n                    updateProcessInstance(processInstance, context);\n                }\n            }\n            return null;\n        });\n    }\n\n    /**\n     * \n     * @param nodeInstance\n     * @param context\n     */\n    public void updateNodeExtData(ProcessNodeInstanceDTO nodeInstance, Map<String, Object> extData,\n            StdProcessContext context) {\n        op(context, () -> {\n            if (extData != null && extData.size() > 0) {\n                String currentExtDataStr = nodeInstance.getExtData();\n                Map<String, Object> currentExtData = JSON.parseObject(currentExtDataStr, Map.class);\n                if (currentExtData == null) {\n                    currentExtData = new HashMap<>();\n                }\n                for (Entry<String, Object> entry : extData.entrySet()) {\n                    currentExtData.put(entry.getKey(), entry.getValue());\n                }\n                String newExtDataStr = JSON.toJSONString(currentExtData);\n                if (!Objects.equals(currentExtDataStr, newExtDataStr)) {\n                    nodeInstance.setExtData(newExtDataStr);\n                    updateNodeInstance(nodeInstance, context);\n                }\n            }\n            return null;\n        });\n    }\n\n    /**\n     * \n     * @param instance\n     * @param context\n     */\n    public void updateNodeInstance(ProcessNodeInstanceDTO instance, StdProcessContext context) {\n        op(context, () -> {\n            context.getCache().put(instance.getNodeInstanceNo(), instance, true);\n            return null;\n        });\n    }\n\n    public void updateProcessInstance(ProcessInstanceDTO instance, StdProcessContext context) {\n        op(context, () -> {\n            context.getCache().put(instance.getInstanceNo(), instance, true);\n            return null;\n        });\n    }\n    \n    public void flushProcess(StdProcessContext context) {\n        flushProcess(null, context, null);\n    }\n\n    public void flushProcess(String flushPoint, StdProcessContext context, StdNodeContext nodeContext) {\n        op(context, () -> {\n            Set<String> openNodeIds = findOpenNodeIds(context);\n            String[] flushNodes = context.getProcessProperty(StdProcessConstants.PROP_FLUSH_NODES);\n            if (flushNodes != null) {\n                for (String openNode : openNodeIds) {\n                    boolean contains = false;\n                    for (String  s : flushNodes) {\n                        if (openNode.equals(s)) {\n                            contains = true;\n                            break;\n                        }\n                    }\n                    if (! contains) {\n                        log.info(\"Node:\" + openNode + \" not in persist node list, No persist\");\n                        return null;\n                    }\n                }\n            }\n            ProcessInstanceDTO processInstance = getProcessInstance(context);\n            if (processInstance.getBizNo() == null && context.getBizNo() != null) {\n                processInstance.setBizNo(context.getBizNo());\n                context.getCache().put(processInstance.getInstanceNo(), processInstance, true);\n            }\n\n            String currentNodeIds = String.join(\",\", openNodeIds);\n            if (!Objects.equals(currentNodeIds, processInstance.getCurrentNodeIds())) {\n                if (log.isDebugEnabled()) {\n                    log.debug(\"Update process instance current node IDS:\" + currentNodeIds);\n                }\n                processInstance.setCurrentNodeIds(currentNodeIds);\n\n                Boolean end = context.getEnd();\n                boolean processInstanceToEnd = false;\n                if (end == null) {\n                    end = false;\n                    List<String> endNodeIds = context.getProcessProperty(StdProcessConstants.PROP_END_NODE_IDS);\n                    if ((endNodeIds != null && !endNodeIds.isEmpty())\n                            && (openNodeIds != null && !openNodeIds.isEmpty())) {\n                        end = true;\n                        for (String activeNodeId : openNodeIds) {\n                            if (!endNodeIds.contains(activeNodeId)) {\n                                end = false;\n                                break;\n                            }\n                        }\n                    }\n                    if (end && StdProcessConstants.STATUS_ACTIVE.equals(processInstance.getStatus())) {\n                        processInstance.setStatus(StdProcessConstants.STATUS_CLOSE);\n                        processInstance.setEndTime(new Date());\n                        processInstanceToEnd = true;\n                    }\n                }\n                context.getCache().put(processInstance.getInstanceNo(), processInstance, true);\n                if (processInstanceToEnd) {\n                context.getEventTriggerFunction().apply(\n                        new Object[] { StdProcessConstants.EVENT_PROCESS_INSTANCE_END, processInstance });\n                }\n            }\n            flushTxn(flushPoint, context, nodeContext);\n            return null;\n        });\n    }\n\n    public Set<String> findActiveNodeIds(StdProcessContext context) {\n        if (log.isDebugEnabled()) {\n            log.debug(\"Query active node\");\n        }\n        return op(context, () -> {\n            String instanceNo = context.getInstanceNo();\n            Set<String> status = new HashSet<>();\n            status.add(StdProcessConstants.STATUS_ACTIVE);\n            QueryProcessNodeReqDTO queryProcessNodeReq = QueryProcessNodeReqDTO.builder().processInstanceNo(instanceNo)\n                    .status(status).build();\n            List<ProcessNodeInstanceDTO> activeNodeInstances = ExportResponseUtil\n                    .unwrap(getProcessInstanceExport().findNodeInstances(exportRequestBuilder.build(queryProcessNodeReq, context)));\n            for (ProcessNodeInstanceDTO activeNodeInstance : activeNodeInstances) {\n                if (context.getCache().get(ProcessNodeInstanceDTO.class,\n                        activeNodeInstance.getNodeInstanceNo()) == null) {\n                    context.getCache().put(activeNodeInstance.getNodeInstanceNo(), activeNodeInstance, false);\n                }\n            }\n            Set<String> activeNodeIds = new HashSet<String>();\n            for (ProcessNodeInstanceDTO nodeInstance : context.getCache().objects(ProcessNodeInstanceDTO.class)) {\n                if (Objects.equals(instanceNo, nodeInstance.getProcessInstanceNo())\n                        && StdProcessConstants.STATUS_ACTIVE.equals(nodeInstance.getStatus())) {\n                    activeNodeIds.add(nodeInstance.getNodeId());\n                }\n            }\n            if (log.isDebugEnabled()) {\n                log.debug(\"Active node is\" + activeNodeIds);\n            }\n            return activeNodeIds;\n        });\n    }\n\n    public Set<String> loadOpenNodes(StdProcessContext context) {\n        if (log.isDebugEnabled()) {\n            log.debug(\"Query OPEN node\");\n        }\n        return op(context, () -> {\n            String instanceNo = context.getInstanceNo();\n            Set<String> status = new HashSet<>(\n                    Arrays.asList(StdProcessConstants.NODE_STATUS_ACTIVE, StdProcessConstants.NODE_STATUS_INACTIVE));\n            QueryProcessNodeReqDTO queryProcessNodeReq = QueryProcessNodeReqDTO.builder().processInstanceNo(instanceNo)\n                    .status(status).build();\n            List<ProcessNodeInstanceDTO> openNodeInstances = ExportResponseUtil\n                    .unwrap(getProcessInstanceExport().findNodeInstances(exportRequestBuilder.build(queryProcessNodeReq, context)));\n            for (ProcessNodeInstanceDTO openNodeInstance : openNodeInstances) {\n                if (context.getCache().get(ProcessNodeInstanceDTO.class,\n                        openNodeInstance.getNodeInstanceNo()) == null) {\n                    context.getCache().put(openNodeInstance.getNodeInstanceNo(), openNodeInstance, false);\n                }\n            }\n            Set<String> openNodeIds = new HashSet<String>();\n            for (ProcessNodeInstanceDTO nodeInstance : context.getCache().objects(ProcessNodeInstanceDTO.class)) {\n                if (Objects.equals(instanceNo, nodeInstance.getProcessInstanceNo())\n                        && (StdProcessConstants.NODE_STATUS_ACTIVE.equals(nodeInstance.getStatus())\n                                || StdProcessConstants.NODE_STATUS_INACTIVE.equals(nodeInstance.getStatus()))) {\n                    openNodeIds.add(nodeInstance.getNodeId());\n                }\n            }\n            if (log.isDebugEnabled()) {\n                log.debug(\"OPEN node is \" + openNodeIds);\n            }\n            return openNodeIds;\n        });\n    }\n\n    public Set<String> findOpenNodeIds(StdProcessContext context) {\n        if (log.isDebugEnabled()) {\n            log.debug(\"Query OPEN node in cache\");\n        }\n        return op(context, () -> {\n            String instanceNo = context.getInstanceNo();\n            Set<String> openNodeIds = new HashSet<String>();\n            for (ProcessNodeInstanceDTO nodeInstance : context.getCache().objects(ProcessNodeInstanceDTO.class)) {\n                if (Objects.equals(instanceNo, nodeInstance.getProcessInstanceNo())\n                        && (StdProcessConstants.NODE_STATUS_ACTIVE.equals(nodeInstance.getStatus())\n                                || StdProcessConstants.NODE_STATUS_INACTIVE.equals(nodeInstance.getStatus()))) {\n                    openNodeIds.add(nodeInstance.getNodeId());\n                }\n            }\n            if (log.isDebugEnabled()) {\n                log.debug(\"Open node in cache is \" + openNodeIds);\n            }\n            return openNodeIds;\n        });\n    }\n    \n    public List<ProcessNodeInstanceDTO> findOpenNodeInstances(StdProcessContext context) {\n        if (log.isDebugEnabled()) {\n            log.debug(\"Query OPEN node instances in cache\");\n        }\n        return op(context, () -> {\n            List<ProcessNodeInstanceDTO> openNodeInstances = new ArrayList<ProcessNodeInstanceDTO>();\n            String instanceNo = context.getInstanceNo();\n            for (ProcessNodeInstanceDTO nodeInstance : context.getCache().objects(ProcessNodeInstanceDTO.class)) {\n                if (Objects.equals(instanceNo, nodeInstance.getProcessInstanceNo())\n                        && (StdProcessConstants.NODE_STATUS_ACTIVE.equals(nodeInstance.getStatus())\n                                || StdProcessConstants.NODE_STATUS_INACTIVE.equals(nodeInstance.getStatus()))) {\n                    openNodeInstances.add(nodeInstance);\n                }\n            }\n            if (log.isDebugEnabled()) {\n                log.debug(\"Open node instances in cache are \" + openNodeInstances);\n            }\n            return openNodeInstances;\n        });\n    }\n    \n    public List<ProcessNodeInstanceDTO> findAllNodeInstances(StdProcessContext context) {\n        if (log.isDebugEnabled()) {\n            log.debug(\"Find all nodes\");\n        }\n        return op(context, () -> {\n            String instanceNo = context.getInstanceNo();\n            QueryProcessNodeReqDTO queryProcessNodeReq = QueryProcessNodeReqDTO.builder().processInstanceNo(instanceNo).build();\n            List<ProcessNodeInstanceDTO> nodeInstances = ExportResponseUtil\n                    .unwrap(getProcessInstanceExport().findNodeInstances(exportRequestBuilder.build(queryProcessNodeReq, context)));\n            for (ProcessNodeInstanceDTO nodeInstance : nodeInstances) {\n                if (context.getCache().get(ProcessNodeInstanceDTO.class,\n                        nodeInstance.getNodeInstanceNo()) == null) {\n                    context.getCache().put(nodeInstance.getNodeInstanceNo(), nodeInstance, false);\n                }\n            }\n            List<ProcessNodeInstanceDTO> result = new ArrayList<ProcessNodeInstanceDTO>();\n            for (ProcessNodeInstanceDTO nodeInstance : context.getCache().objects(ProcessNodeInstanceDTO.class)) {\n                    result.add(nodeInstance);\n                }\n            if (log.isDebugEnabled()) {\n                log.debug(\"All nodes are\" + result);\n            }\n            return result;\n        });\n    }\n    \n    \n    /**\n     * \n     * @param context\n     */\n    private void flushTxn(String flushPoint, StdProcessContext context, StdNodeContext nodeContext) {\n        op(context, () -> {\n            beforeFlushTxn(context);\n            if (context.isSubProcess() && Boolean.TRUE.equals(PropertiesUtil\n                    .get(context.getProcess().getProcessProperties(), StdProcessConstants.PROP_DATA_FLUSH_BY_PARENT))) {\n                if (log.isDebugEnabled()) {\n                    log.debug(\"Sub flow not flush data\");\n                }\n                return null;\n            }\n            if (context.getCache().getCommandList().size() > 0) {\n                TxnReq txnReq = new TxnReq();\n                txnReq.setCommandList(context.getCache().getCommandList());\n                context.getEventTriggerFunction().apply(new Object[] { StdProcessConstants.EVENT_TXN_FLUSH_START, new Object[] {txnReq, flushPoint, context, nodeContext}});\n                TxnRes txnRes = ExportResponseUtil\n                        .unwrap(getProcessTransactionExport().doTransaction(exportRequestBuilder.build(txnReq, context)));\n                context.getEventTriggerFunction().apply(new Object[] { StdProcessConstants.EVENT_TXN_FLUSH_END, new Object[] {txnReq, txnRes, flushPoint, context, nodeContext}});\n                context.getCache().clearTxnCommand();\n            }\n            return null;\n        });\n    }\n\n    private void beforeFlushTxn(StdProcessContext context) {\n        List<Object> list = new ArrayList<Object>();\n        for (Map<Object, CacheObject<?>> map : context.getCache().getCacheObjectMap().values()) {\n            for (CacheObject<?> o : map.values()) {\n                if (o.isDirty()) {\n                    PersistDTO persistDto = new PersistDTO();\n                    persistDto.setPersistObject(o.getObject());\n                    persistDto.setPersistOp(o.getPersistOp());\n                    list.add(persistDto);\n                    o.setDirty(false);\n                    o.setPersistOp(ProcessTransactionConstants.PERSIST_OP_NONE);\n                }\n            }\n        }\n        if (log.isDebugEnabled()) {\n            log.debug(\"Data to flush is :{}\", list);\n        }\n        if (list.size() > 0) {\n            StdProcessContextDTO stdProcessContext = new StdProcessContextDTO();\n            stdProcessContext.setProcessProperties(context.getProcessProperties());\n            StdProcessDTO stdProcess = new StdProcessDTO();\n            stdProcess.setExtProperties(((StdProcess) context.getProcess()).getExtProperties());\n            stdProcess.setProcessProperties(((StdProcess) context.getProcess()).getProcessProperties());\n            stdProcessContext.setProcess(stdProcess);\n            BatchUpdateTxnCommand batchUpdateTxnCommand = new BatchUpdateTxnCommand();\n            batchUpdateTxnCommand.setObjects(list);\n            batchUpdateTxnCommand.setProcessContext(stdProcessContext);\n            context.getCache().addTxnCommand(batchUpdateTxnCommand);\n        }\n        if (context.isInterrupted()) {\n            log.info(\"Process instance interrupt\");\n            InterruptTxnCommand command = new InterruptTxnCommand();\n            StdProcessContextDTO stdProcessContext = new StdProcessContextDTO();\n            stdProcessContext.setProcessProperties(context.getProcessProperties());\n            command.setProcessInstanceNo(context.getInstanceNo());\n            command.setProcessContext(stdProcessContext);\n            command.setInterruptTime(new Date());\n            command.setInterruptUser(null);\n            context.getCache().addTxnCommand(command);\n        }\n    }\n\n    /**\n     * \n     * @return\n     */\n    private ProcessNodeInstanceDTO createNodeInstance(String nodeId, StdProcessContext context) {\n        if (log.isDebugEnabled()) {\n            log.debug(\"Create node instance:{}\", nodeId);\n        }\n        ProcessNodeInstanceDTO nodeInstance = new ProcessNodeInstanceDTO();\n        ProcessInstanceDTO instance = getProcessInstance(context);\n        nodeInstance.setNodeId(nodeId);\n        nodeInstance.setNodeInstanceNo(objectIdManager.nextObjectId(ProcessTransactionConstants.TYPE_NODE));\n        nodeInstance.setProcessDefId(instance.getProcessDefId());\n        nodeInstance.setProcessInstanceNo(instance.getInstanceNo());\n        nodeInstance.setProductCode(instance.getProductCode());\n        nodeInstance.setStartTime(new Date());\n        nodeInstance.setStatus(StdProcessConstants.NODE_STATUS_INACTIVE);\n        nodeInstance.setCreatedDate(new Date());\n        context.getCache().put(nodeInstance.getNodeInstanceNo(), nodeInstance, true);\n        return nodeInstance;\n    }\n\n    /**\n     * \n     * @param nodeContext\n     * @param context\n     * @return\n     */\n    public ProcessNodeExecutionDTO createNodeExecution(StdNodeContext nodeContext, StdProcessContext context) {\n        return op(context, () -> {\n            String persistType = getExecutionPersistType(nodeContext, context);\n            if (log.isDebugEnabled()) {\n                log.debug(\"persist type is \" + persistType);\n            }\n            if (EXECUTION_PERSIST_TYPE_NONE.equals(persistType)) {\n                return null;\n            }\n            ProcessNodeInstanceDTO nodeInstance = getNodeInstance(nodeContext.getNodeInstanceNo(), context);\n            if (EXECUTION_PERSIST_TYPE_NEXT.equals(persistType)) {\n                if (nodeInstance.getNextNodeInstances() == null || nodeInstance.getNextNodeInstances().isEmpty()) {\n                    return null;\n                }\n            } else if (EXECUTION_PERSIST_TYPE_EVENT_AND_NEXT.equals(persistType)) {\n                if ((nodeInstance.getNextNodeInstances() == null || nodeInstance.getNextNodeInstances().isEmpty()) &&  nodeContext.getEventId() == null) {\n                    return null;\n                }\n            }\n            \n            ProcessNodeExecutionDTO execution = new ProcessNodeExecutionDTO();\n            execution.setEndTime(new Date());\n            execution.setEventId(nodeContext.getEventId());\n            if (nodeContext.getNextNodeInstanceNos() != null) {\n                execution.setNextNodeInstances(String.join(\",\", nodeContext.getNextNodeInstanceNos()));\n            }\n            execution.setNodeExecutionNo(objectIdManager.nextObjectId(ProcessTransactionConstants.TYPE_EXECUTION));\n            execution.setNodeId(nodeContext.getNodeId());\n            execution.setNodeInstanceNo(nodeInstance.getNodeInstanceNo());\n            execution.setProcessDefId(nodeInstance.getProcessDefId());\n            execution.setProductCode(nodeInstance.getProductCode());\n            execution.setStartTime(nodeContext.getExecutionStartTime());\n            execution.setStatus(nodeInstance.getStatus());\n            execution.setCreatedDate(new Date());\n            boolean persistActionResult = getExecutionPersistActionResult(nodeContext, context);\n            if (persistActionResult) {\n                try {\n                    Map<String, Object> extData = new HashMap<String, Object>();\n                    extData.put(\"actionResult\", nodeContext.getActionResult());\n                    String extDataStr = JSON.toJSONString(extData);\n                    execution.setExtData(extDataStr);\n                } catch (Exception e) {\n                    log.error(\"extData populate exception,\" + e.getMessage(), e);\n                }\n            }\n            context.getCache().put(execution.getNodeExecutionNo(), execution, true);\n            return execution;\n        });\n    }\n    \n    private String getExecutionPersistType(StdNodeContext nodeContext, StdProcessContext context) {\n        String persistType = PropertiesUtil.getProperty(\"executionPersistType\", nodeContext, context);\n        return persistType == null ? this.executionPersistType : persistType;\n    }\n    \n    private boolean getExecutionPersistActionResult(StdNodeContext nodeContext, StdProcessContext context) {\n        Boolean persistActionResult = PropertiesUtil.getProperty(\"executionPersistActionResult\", nodeContext, context);\n        return persistActionResult == null ? this.executionPersistActionResult : persistActionResult;\n    }\n\n    public <T> T op(StdProcessContext context, Supplier<T> supplier) {\n        synchronized (context.getLock()) {\n            return (T) supplier.get();\n        }\n    }\n\n    public String lockProcessInstance(String processType, String bizNo) {\n        LockProcessInstanceReq req = new LockProcessInstanceReq();\n        req.setProcessType(processType);\n        req.setBizNo(bizNo);\n        return ExportResponseUtil\n                .unwrap(getProcessInstanceExport().lockProcessInstance(new ExportRequest<LockProcessInstanceReq>(req)));\n    }\n\n    public Boolean unLockProcessInstance(String processType, String bizNo, String lockRequestId) {\n        UnlockProcessInstanceReq req = new UnlockProcessInstanceReq();\n        req.setProcessType(processType);\n        req.setBizNo(bizNo);\n        req.setLockRequestId(lockRequestId);\n        return ExportResponseUtil.unwrap(\n                getProcessInstanceExport().unLockProcessInstance(new ExportRequest<UnlockProcessInstanceReq>(req)));\n    }\n\n    public void addTxn(TxnCommand txnCommand, StdProcessContext context) {\n        op(context, () -> {\n            context.getCache().addTxnCommand(txnCommand);\n            return null;\n        });\n    }\n\n    private ProcessInstanceExport getProcessInstanceExport() {\n        if (processInstanceExport != null) {\n            return processInstanceExport;\n        }\n        processInstanceExport = ObjectFactorys.getDefault().getObject(ProcessInstanceExport.class);\n        return processInstanceExport;\n    }\n\n    private ProcessTransactionExport getProcessTransactionExport() {\n        if (processTransactionExport != null) {\n            return processTransactionExport;\n        }\n        processTransactionExport = ObjectFactorys.getDefault().getObject(ProcessTransactionExport.class);\n        return processTransactionExport;\n    }\n\n    public ObjectIdManager getObjectIdManager() {\n        return objectIdManager;\n    }\n\n    public void setObjectIdManager(ObjectIdManager objectIdManager) {\n        this.objectIdManager = objectIdManager;\n    }\n\n    public String getExecutionPersistType() {\n        return executionPersistType;\n    }\n\n    public void setExecutionPersistType(String executionPersistType) {\n        this.executionPersistType = executionPersistType;\n    }\n\n    public boolean isExecutionPersistActionResult() {\n        return executionPersistActionResult;\n    }\n\n    public void setExecutionPersistActionResult(boolean executionPersistActionResult) {\n        this.executionPersistActionResult = executionPersistActionResult;\n    }\n\n    public void setProcessInstanceExport(ProcessInstanceExport processInstanceExport) {\n        this.processInstanceExport = processInstanceExport;\n    }\n\n    public void setProcessTransactionExport(ProcessTransactionExport processTransactionExport) {\n        this.processTransactionExport = processTransactionExport;\n    }\n\n    public ExportRequestBuilder getExportRequestBuilder() {\n        return exportRequestBuilder;\n    }\n\n    public void setExportRequestBuilder(ExportRequestBuilder exportRequestBuilder) {\n        this.exportRequestBuilder = exportRequestBuilder;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/runtime/ProcessRuntimeService.java",
    "content": "package com.jd.easyflow.process.client.runtime;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Objects;\nimport java.util.Set;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.util.FlowConstants;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessInstanceDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessNodeExecutionDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessNodeInstanceDTO;\nimport com.jd.easyflow.process.client.common.PropertiesUtil;\nimport com.jd.easyflow.process.client.runtime.core.ProcessException;\nimport com.jd.easyflow.process.client.util.Pair;\nimport com.jd.easyflow.process.spi.client.enums.ProcessClientResponseCode;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n * \n * @author liyuliang5\n * \n */\npublic class ProcessRuntimeService {\n    \n    private static final Logger log = LoggerFactory.getLogger(ProcessRuntimeService.class);\n\n\n    private ProcessRuntimeManager manager;\n\n    public void processStartExec(ProcessInstanceDTO instance, StdProcessContext context) {\n        log.info(\"Start process execute, processType:{}, bizNo:{}\", instance.getProcessType(), instance.getBizNo());\n\n        ProcessInstanceDTO processInstance = null;\n        Map<String, Object> processProperties = ((StdProcess) context.getProcess()).getProcessProperties();\n        if (!Boolean.TRUE\n                .equals(PropertiesUtil.get(processProperties, StdProcessConstants.PROP_CREATE_INSTANCE_EVERY_TIME))) {\n            String bizRelation = PropertiesUtil.get(processProperties, StdProcessConstants.PROP_BIZ_RELATION);\n            if (bizRelation == null || StdProcessConstants.BIZ_RELATION_ONE_ONE.equals(bizRelation)) {\n                processInstance = manager.getProcessInstanceByProcessTypeAndBizNo(instance.getProcessType(),\n                        instance.getBizNo(), context);\n\n                if (processInstance != null\n                        && StdProcessConstants.STATUS_CANCELED.equals(processInstance.getStatus())) {\n                    Map<String, Object> data = new HashMap<>();\n                    data.put(\"instanceNo\", context.getInstanceNo());\n                    ProcessException exception = new ProcessException(ProcessRuntimeErrorCode.PR_0104.name(),\n                            ProcessRuntimeErrorCode.PR_0104.getDesc());\n                    exception.setData(data);\n                    throw exception;\n                }\n\n            }  else if (StdProcessConstants.BIZ_RELATION_MANY_ONE.equals(bizRelation)) {\n                processInstance = manager.getActiveProcessInstanceByProcessTypeAndBizNo(instance.getProcessType(),\n                        instance.getBizNo(), context);\n            } else {\n                throw new IllegalArgumentException(\"Illegal bizRelation:\" + bizRelation);\n            }\n\n            if (StdProcessConstants.OP_TYPE_CREATE.equals(context.getOpType())) {\n                if (processInstance != null) {\n                    throw new ProcessException(ProcessClientResponseCode.PROCESS_INSTANCE_EXISTS.getCode(),\n                            \"Process instance exists:\" + processInstance.getInstanceNo());\n                }\n\n            } else if (StdProcessConstants.OP_TYPE_EXECUTE.equals(context.getOpType())) {\n                if (processInstance == null) {\n                    throw new ProcessException(\n                            \"Process instance not exists, processType:\" + instance.getProcessType() + \" bizNo:\" + instance.getBizNo());\n                }\n            }\n\n            if (processInstance != null && StdProcessConstants.STATUS_CLOSE.equals(processInstance.getStatus())) {\n                String exeucteClosePoliy = PropertiesUtil.get(processProperties,\n                        StdProcessConstants.PROP_EXECUTE_CLOSE_POLICY);\n\n                if (StdProcessConstants.POLICY_EXCEPTION.equals(exeucteClosePoliy)) {\n                    Map<String, Object> data = new HashMap<>();\n                    data.put(\"instanceNo\", context.getInstanceNo());\n                    ProcessException exception = new ProcessException(ProcessRuntimeErrorCode.PR_0103.name(),\n                            ProcessRuntimeErrorCode.PR_0103.getDesc());\n                    exception.setData(data);\n                    throw exception;\n                }\n            }\n        }\n\n        List<String> startNodeIds = new ArrayList<>();\n        if (processInstance != null) {\n            context.setInstanceNo(processInstance.getInstanceNo());\n            manager.loadOpenNodes(context);\n        }\n        startNodeIds = context.getStartNodesFunction().apply(processInstance);\n        context.setStartNodeIds(startNodeIds);\n        boolean newProcessInstance = false;\n        if (processInstance == null) {\n            processInstance = tryCreateProcessInstance(instance, context);\n            context.setInstanceNo(processInstance.getInstanceNo());\n            newProcessInstance = true;\n        }\n\n        boolean update = false;\n        if (!Objects.equals(processInstance.getProcessDefId(), instance.getProcessDefId())) {\n            processInstance.setProcessDefId(instance.getProcessDefId());\n            update = true;\n        }\n        if (instance.getBizStatus() != null\n                && !Objects.equals(processInstance.getBizStatus(), instance.getBizStatus())) {\n            processInstance.setBizStatus(instance.getBizStatus());\n            update = true;\n        }\n        if (instance.getBizData() != null && !Objects.equals(processInstance.getBizData(), instance.getBizData())) {\n            processInstance.setBizData(instance.getBizData());\n            update = true;\n        }\n        if (instance.getParentInstanceNo() != null && !Objects.equals(processInstance.getParentInstanceNo(), instance.getParentInstanceNo())) {\n            processInstance.setParentInstanceNo(instance.getParentInstanceNo());\n            update = true;\n        }\n        if (instance.getParentNodeInstanceNo() != null && !Objects.equals(processInstance.getParentNodeInstanceNo(), instance.getParentNodeInstanceNo())) {\n            processInstance.setParentNodeInstanceNo(instance.getParentNodeInstanceNo());\n            update = true;\n        }\n        if (update) {\n            manager.updateProcessInstance(processInstance, context);\n        }\n\n        checkStartNodes(context);\n\n        String variablesStr = processInstance.getVars();\n        if (variablesStr != null && ! variablesStr.isEmpty()) {\n            Map<String, String> variables = JSON.parseObject(variablesStr, Map.class);\n            context.getVariableSetter().accept(variables);\n        }\n        \n        context.getEventTriggerFunction().apply(\n                new Object[] { StdProcessConstants.EVENT_PROCESS_INSTANCE_EXEC_START, processInstance });\n        \n        if ((newProcessInstance && Boolean.TRUE.equals(PropertiesUtil.get(processProperties, StdProcessConstants.PROP_DATA_FLUSH_AFTER_CREATE)))) {\n            syncVariable(context);\n            manager.flushProcess(StdProcessConstants.FLUSH_POINT_AFTER_CREATE, context, null);\n        }\n        if (Boolean.TRUE.equals(PropertiesUtil.get(processProperties, StdProcessConstants.PROP_DATA_FLUSH_BEFORE_PROCESS))) {\n            syncVariable(context);\n            manager.flushProcess(StdProcessConstants.FLUSH_POINT_BEFORE_PROCESS, context, null);\n        }\n    }\n\n    public void nodeStartExec(StdNodeContext nodeContext, StdProcessContext context) {\n        if (log.isDebugEnabled()) {\n            log.debug(\"Node start exec, nodeContext:{}\", nodeContext);\n        }\n        manager.op(context, () -> {\n            ProcessNodeInstanceDTO nodeInstance;\n            boolean nodeNewCreate;\n            if (FlowConstants.NODE_PRE_CHECK_TYPE_MULTICHECK.equals(nodeContext.getPreCheckType()) || FlowConstants.NODE_PRE_CHECK_TYPE_INCLUSIVECHECK.equals(nodeContext.getPreCheckType())) {\n                // can only be created on previous node end.\n                nodeInstance = manager.getOpenNodeInstance(nodeContext.getNodeId(), context);\n                if (nodeInstance == null) {\n                    log.info(\"Open node instance is null,\" + nodeContext );\n                    nodeContext.setPreResult(false);\n                    return null;\n                }\n                nodeNewCreate = false;\n            } else {\n                Pair<ProcessNodeInstanceDTO, Boolean> nodeInstanceInfo = manager.getOrCreateOpenNodeInstanceWithCreateFlag(nodeContext.getNodeId(), context);\n                nodeInstance = nodeInstanceInfo.getLeft();\n                nodeNewCreate = nodeInstanceInfo.getRight();\n            }\n            \n            if (nodeInstance.getVars() != null && ! nodeInstance.getVars().isEmpty()) {\n                context.getNodeVariableSetter().accept(Pair.of(nodeContext, JSON.parseObject(nodeInstance.getVars(), Map.class)));\n            }\n            if (nodeNewCreate && context.getNodeStartEventPolicy() == StdProcessConstants.NODE_START_EVENT_POLICY_CREATE) {\n                context.getEventTriggerFunction().apply(new Object[] { StdProcessConstants.EVENT_NODE_INSTANCE_START, new Object[] {nodeInstance, nodeContext} });\n            }\n            if (FlowConstants.NODE_PRE_CHECK_TYPE_MULTICHECK.equals(nodeContext.getPreCheckType())) {\n                if (StdProcessConstants.NODE_STATUS_ACTIVE.equals(nodeInstance.getStatus())) {\n                    log.info(\"Node \" + nodeContext + \" finish precheck\");\n                    nodeContext.setPreResult(true);\n                } else if (StdProcessConstants.NODE_STATUS_INACTIVE.equals(nodeInstance.getStatus())) {\n                    boolean preResult = false;\n                    String previousNodeInstanceNos = nodeInstance.getPreviousNodeInstances();\n                    List<String> previousNodeInstanceNoList = Arrays.asList(previousNodeInstanceNos.split(\",\"));\n                    List<ProcessNodeInstanceDTO> previousNodeInstanceList = manager\n                            .getNodeInstances(previousNodeInstanceNoList, context);\n                    Set<String> previousNodeIds = new HashSet<>();\n                    previousNodeInstanceList.forEach(element -> previousNodeIds.add(element.getNodeId()));\n                    boolean active = true;\n                    if (nodeContext.getConfigPreNodeIds() != null && ! nodeContext.getConfigPreNodeIds().isEmpty()) {\n                        for (String confNodeId : nodeContext.getConfigPreNodeIds()) {\n                            if (!previousNodeIds.contains(confNodeId)) {\n                                active = false;\n                                break;\n                            }\n                        }\n                    }\n                    if (active) {\n                        log.info(nodeInstance.getNodeInstanceNo() + \" \" + nodeInstance.getNodeId() + \" node is active.\");\n                        nodeInstance.setStatus(StdProcessConstants.NODE_STATUS_ACTIVE);\n                        manager.updateNodeInstance(nodeInstance, context);\n                        if (context.getNodeStartEventPolicy() == StdProcessConstants.NODE_START_EVENT_POLICY_ACTIVE) {\n                            nodeInstance.setStartTime(new Date());\n                            context.getEventTriggerFunction().apply(new Object[] { StdProcessConstants.EVENT_NODE_INSTANCE_START, new Object[] {nodeInstance, nodeContext} });\n                        }\n                        preResult = true;\n                    }\n                    nodeContext.setPreResult(preResult);\n                } else {\n                    throw new IllegalStateException(\"Illegal node status:\" + nodeInstance);\n                }\n                \n            } else if (FlowConstants.NODE_PRE_CHECK_TYPE_INCLUSIVECHECK.equals(nodeContext.getPreCheckType())) {\n                ProcessInclusiveCheckHelper.nodeStartExec(nodeContext, context, nodeInstance, manager);\n            } else {\n                if (StdProcessConstants.NODE_STATUS_INACTIVE.equals(nodeInstance.getStatus())) {\n                    nodeInstance.setStatus(StdProcessConstants.NODE_STATUS_ACTIVE);\n                    manager.updateNodeInstance(nodeInstance, context);\n                    if (context.getNodeStartEventPolicy() == StdProcessConstants.NODE_START_EVENT_POLICY_ACTIVE) {\n                        nodeInstance.setStartTime(new Date());\n                        context.getEventTriggerFunction().apply(new Object[] { StdProcessConstants.EVENT_NODE_INSTANCE_START, new Object[] {nodeInstance, nodeContext}});\n                    }\n                }\n            }\n            manager.updateNodeExtData(nodeInstance, nodeContext.getExtData(), context);\n            nodeContext.setNodeInstanceNo(nodeInstance.getNodeInstanceNo());\n            \n            context.getEventTriggerFunction()\n            .apply(new Object[] { StdProcessConstants.EVENT_NODE_INSTANCE_EXEC_START,\n                    new Object[] { nodeInstance, nodeContext } });\n            \n            String dataFlushPolicy = PropertiesUtil.getProperty(StdProcessConstants.PROP_DATA_FLUSH_POLICY, nodeContext,\n                    context);\n            if (StdProcessConstants.FLUSH_BEFORE_NODE.equals(dataFlushPolicy)\n                    || StdProcessConstants.FLUSH_BEFORE_AND_AFTER_NODE.equals(dataFlushPolicy)) {\n                syncVariable(context);\n                manager.flushProcess(StdProcessConstants.FLUSH_POINT_BEFORE_NODE, context, nodeContext);\n            }\n            return null;\n        });\n    }\n\n    public void nodeEndExec(StdNodeContext nodeContext, StdProcessContext context) {\n        if (log.isDebugEnabled()) {\n            log.debug(\"Node end exec, nodeContext:{}\", nodeContext);\n        }\n\n        manager.op(context, () -> {\n            if (nodeContext.getNodeInstanceNo() == null) {\n                log.info(\"node instance no is null, \" + nodeContext);\n                return null;\n            }\n            ProcessNodeInstanceDTO instance = manager.getNodeInstance(nodeContext.getNodeInstanceNo(), context);\n\n            Map<String, String> nodeVariables = context.getNodeVariableGetter().apply(nodeContext);\n            String currentVariableStr = instance.getVars();\n            String newVariablesStr = null;\n            if (!((currentVariableStr == null || currentVariableStr.isEmpty()) && (nodeVariables == null || nodeVariables.isEmpty()))) {\n                newVariablesStr = JSON.toJSONString(nodeVariables);\n                if (!Objects.equals(newVariablesStr, currentVariableStr)) {\n                    instance.setVars(newVariablesStr);\n                    manager.updateNodeInstance(instance, context);\n                }\n            }\n            \n            if (nodeContext.getNextNodeIds() != null) {\n                \n                instance.setEndTime(new Date());\n                instance.setStatus(StdProcessConstants.NODE_STATUS_CLOSE);\n                manager.updateNodeInstance(instance, context);\n\n                List<String> nextNodeInstanceNos = new ArrayList<>();\n                List<ProcessNodeInstanceDTO> createdNextNodeList = new ArrayList<>();\n                for (String nodeId : nodeContext.getNextNodeIds()) {\n                    Pair<ProcessNodeInstanceDTO, Boolean> nodeInstanceInfo = manager\n                            .getOrCreateOpenNodeInstanceWithCreateFlag(nodeId, context);\n                    ProcessNodeInstanceDTO nodeInstance = nodeInstanceInfo.getLeft();\n                    if (nodeInstanceInfo.getRight()) {\n                        createdNextNodeList.add(nodeInstance);\n                    }\n                    nextNodeInstanceNos.add(nodeInstance.getNodeInstanceNo());\n\n                    String savePreviousPolicy = PropertiesUtil.get(\n                            ((StdNode) nodeContext.getNode()).getProcessProperties(),\n                            StdProcessConstants.PROP_SAVE_PREVIOUS_POLICY);\n                    if (!StdProcessConstants.SAVE_PREVIOUS_POLICY_NONE.equals(savePreviousPolicy)) {\n                        String previousStr = nodeInstance.getPreviousNodeInstances();\n                        if (previousStr == null || previousStr.isEmpty()) {\n                            previousStr = nodeContext.getNodeInstanceNo();\n                            nodeInstance.setPreviousNodeInstances(previousStr);\n                            manager.updateNodeInstance(nodeInstance, context);\n                        } else {\n                            String[] previousNodeInstanceNos = previousStr.split(\",\");\n                            boolean contains = false;\n                            for (String no : previousNodeInstanceNos) {\n                                if (no.equals(nodeContext.getNodeInstanceNo())) {\n                                    contains = true;\n                                    break;\n                                }\n                            }\n                            if (! contains) {\n                                previousStr += \",\" + nodeContext.getNodeInstanceNo();\n                                nodeInstance.setPreviousNodeInstances(previousStr);\n                                manager.updateNodeInstance(nodeInstance, context);\n                            }\n                        }\n                    }\n                }\n\n                nodeContext.setNextNodeInstanceNos(nextNodeInstanceNos.toArray(new String[] {}));\n\n                instance.setNextNodeInstances(String.join(\",\", nextNodeInstanceNos));\n                manager.updateNodeInstance(instance, context);\n                context.getEventTriggerFunction().apply(new Object[] { StdProcessConstants.EVENT_NODE_INSTANCE_END,\n                        new Object[] { instance, nodeContext } });\n                if (context.getNodeStartEventPolicy() == StdProcessConstants.NODE_START_EVENT_POLICY_CREATE) {\n                    for (ProcessNodeInstanceDTO nextNodeInstance : createdNextNodeList) {\n                        context.getEventTriggerFunction()\n                                .apply(new Object[] { StdProcessConstants.EVENT_NODE_INSTANCE_START,\n                                        new Object[] { nextNodeInstance, nodeContext } });\n                    }\n                }\n            }\n            \n            if (StdProcessConstants.NODE_STATUS_ACTIVE.equals(instance.getStatus()) || StdProcessConstants.STATUS_CLOSE.equals(instance.getStatus())) {\n                ProcessNodeExecutionDTO execution = manager.createNodeExecution(nodeContext, context);\n                if (log.isDebugEnabled()) {\n                    log.debug(\"Create node execution:{}\", execution);\n                } \n            }\n            \n            context.getEventTriggerFunction().apply(new Object[] { StdProcessConstants.EVENT_NODE_INSTANCE_EXEC_END,\n                    new Object[] { instance, nodeContext } });\n                        \n            String dataFlushPolicy = PropertiesUtil.getProperty(StdProcessConstants.PROP_DATA_FLUSH_POLICY, nodeContext,\n                    context);\n            if (StdProcessConstants.FLUSH_AFTER_NODE.equals(dataFlushPolicy)\n                    || StdProcessConstants.FLUSH_BEFORE_AND_AFTER_NODE.equals(dataFlushPolicy)) {\n                syncVariable(context);\n                manager.flushProcess(StdProcessConstants.FLUSH_POINT_AFTER_PROCESS, context, nodeContext);\n            }\n            \n            ProcessInclusiveCheckHelper.nodeEndExec(nodeContext, context, manager);\n            return null;\n        });\n    }\n\n    public void processEndExec(StdProcessContext context) {\n        log.info(\"process end exec\");\n        ProcessInstanceDTO processInstance = getProcessInstance(context);\n        context.getEventTriggerFunction().apply(\n                new Object[] { StdProcessConstants.EVENT_PROCESS_INSTANCE_EXEC_END, processInstance });\n        syncVariable(context);\n        manager.flushProcess(StdProcessConstants.FLUSH_POINT_AFTER_NODE, context, null);\n    }\n\n    private void syncVariable(StdProcessContext context) {\n        Map<String, String> variables = context.getVariableGetter().get();\n        ProcessInstanceDTO instance = manager.getProcessInstance(context);\n        String currentVariableStr = instance.getVars();\n        if ((currentVariableStr == null || currentVariableStr.isEmpty()) && (variables == null || variables.isEmpty())) {\n            return;\n        }\n        String newVariables = JSON.toJSONString(variables);\n        if (!Objects.equals(instance.getVars(), newVariables)) {\n            instance.setVars(newVariables);\n            manager.updateProcessInstance(instance, context);\n        }\n    }\n\n    public void processCompleteExec(StdProcessContext context) {\n        if (context != null) {\n            manager.unLockProcessInstance(context.getProcessType(), context.getBizNo(), context.getLockRequestId());\n        } else {\n            log.warn(\"ProcessRuntimeService-processCompleteExec-stdProcessContext is null. please to check it\");\n        }\n    }\n\n    private ProcessInstanceDTO tryCreateProcessInstance(ProcessInstanceDTO instance, StdProcessContext context) {\n        if (context.isCheckStartNode()) {\n            Boolean start = context.getStart();\n            if (start == null) {\n                start = true;\n                List<String> startNodeIds = context.getProcessProperty(StdProcessConstants.PROP_START_NODE_IDS);\n                if (context.getStartNodeIds() != null && ! context.getStartNodeIds().isEmpty()) {\n                    if (startNodeIds == null || startNodeIds.isEmpty()) {\n                        start = false;\n                    } else {\n                        for (String startNodeId : context.getStartNodeIds()) {\n                            if (!startNodeIds.contains(startNodeId)) {\n                                start = false;\n                            }\n                        }\n                    }\n                }\n            }\n            if (!start) {\n                log.info(\"Not start node, can not create process instance.\");\n                throw new ProcessException(\n                        \"Not start node, can not create process instance. Configured start node:\" + context.getProcessProperty(StdProcessConstants.PROP_START_NODE_IDS)\n                                + \", input start node:\" + context.getStartNodeIds() + \", process instance:\" + instance);\n            }\n        }\n        ProcessInstanceDTO processInstance = manager.createProcessInstance(instance, context);\n        context.getEventTriggerFunction()\n        .apply(new Object[] { StdProcessConstants.EVENT_PROCESS_INSTANCE_START, instance });\n        log.info(\"Create process instance:\" + JSON.toJSONString(processInstance));\n        return processInstance;\n    }\n\n    private void checkStartNodes(StdProcessContext context) {\n        if (!context.isCheckStartNode()) {\n            return;\n        }\n        List<String> startNodeIds = context.getStartNodeIds();\n        List<String> configStartNodeIds = context.getProcessProperty(StdProcessConstants.PROP_START_NODE_IDS);\n        Set<String> currentOpenNodeIds = manager.findOpenNodeIds(context);\n        if (startNodeIds != null) {\n            for (String startNodeId : startNodeIds) {\n                if (currentOpenNodeIds.contains(startNodeId)) {\n                    continue;\n                }\n                \n                if (configStartNodeIds != null && configStartNodeIds.contains(startNodeId)) {\n                    StdNode node = context.getNodeFunction().apply(startNodeId);\n                    String startCheckPolicy = PropertiesUtil.get(node.getProcessProperties(),\n                            StdProcessConstants.PROP_START_CHECK_POLICY);\n                    if (StdProcessConstants.START_CHECK_POLICY_UNLIMIT.equals(startCheckPolicy)) {\n                        continue;\n                    }\n                    if (StdProcessConstants.START_CHECK_POLICY_NO_OPENING.equals(startCheckPolicy)) {\n                        if (currentOpenNodeIds.size() > 0) {\n                            Map<String, Object> data = new HashMap<>();\n                            data.put(\"instanceNo\", context.getInstanceNo());\n                            data.put(\"errorNodeId\", startNodeId);\n                            data.put(\"startNodeIds\", startNodeIds);\n                            data.put(\"currentOpenNodeIds\", currentOpenNodeIds);\n                            ProcessException exception = new ProcessException(ProcessRuntimeErrorCode.PR_0101.name(),\n                                    \"Process instance has opened nodes, can not start exec:\" + startNodeId);\n                            exception.setData(data);\n                            throw exception;\n                        }\n                        continue;\n                    }\n                    ProcessNodeInstanceDTO instance = manager.getOneNodeInstance(startNodeId, context);\n                    if (instance != null && StdProcessConstants.NODE_STATUS_CLOSE.equals(instance.getStatus())) {\n                        Map<String, Object> data = new HashMap<>();\n                        data.put(\"instanceNo\", context.getInstanceNo());\n                        data.put(\"errorNodeId\", startNodeId);\n                        data.put(\"startNodeIds\", startNodeIds);\n                        data.put(\"currentOpenNodeIds\", currentOpenNodeIds);\n                        ProcessException exception = new ProcessException(ProcessRuntimeErrorCode.PR_0101.name(),\n                                \"Start node close, can not start exec:\" + startNodeId);\n                        exception.setData(data);\n                        throw exception;\n                    } else {\n                        continue;\n                    }\n                }\n                Map<String, Object> data = new HashMap<>();\n                data.put(\"instanceNo\", context.getInstanceNo());\n                data.put(\"errorNodeId\", startNodeId);\n                data.put(\"startNodeIds\", startNodeIds);\n                data.put(\"currentOpenNodeIds\", currentOpenNodeIds);\n                ProcessException exception = new ProcessException(ProcessRuntimeErrorCode.PR_0102.name(),\n                        \"Not start node or open node, cannot start exec:\" + startNodeId + \" current active node:\" + currentOpenNodeIds);\n                exception.setData(data);\n                throw exception;\n            }\n        }\n    }\n\n    public ProcessInstanceDTO getProcessInstance(StdProcessContext context) {\n        return manager.getProcessInstance(context);\n    }\n\n    public String lockProcessInstance(String processType, String bizNo) {\n        return manager.lockProcessInstance(processType, bizNo);\n    }\n\n    public ProcessRuntimeManager getManager() {\n        return manager;\n    }\n\n    public void setManager(ProcessRuntimeManager manager) {\n        this.manager = manager;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/runtime/StdNode.java",
    "content": "package com.jd.easyflow.process.client.runtime;\n\nimport java.util.Map;\n\nimport com.jd.easyflow.process.client.runtime.core.Node;\n\n/**\n * @author liyuliang5\n * \n */\npublic class StdNode implements Node {\n    \n    private Map<String, Object> processProperties;\n\n    public Map<String, Object> getProcessProperties() {\n        return processProperties;\n    }\n\n    public void setProcessProperties(Map<String, Object> processProperties) {\n        this.processProperties = processProperties;\n    }\n\n    @Override\n    public String toString() {\n        return \"StdNode [processProperties=\" + processProperties + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/runtime/StdNodeContext.java",
    "content": "package com.jd.easyflow.process.client.runtime;\n\nimport java.util.Arrays;\nimport java.util.Date;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport com.fasterxml.jackson.annotation.JsonIgnore;\nimport com.jd.easyflow.process.client.runtime.core.Node;\nimport com.jd.easyflow.process.client.runtime.core.NodeContext;\nimport com.jd.easyflow.process.client.util.Pair;\n\n/**\n * @author liyuliang5\n *\n */\npublic class StdNodeContext implements NodeContext {\n    \n    private Node node;\n        \n    private String nodeInstanceNo;\n\n    private String previousNodeId;\n    \n    private String nodeId;\n    \n    private String[] nextNodeIds;\n    \n    private String[] nextNodeInstanceNos;\n    \n    private String eventId;\n    \n    private Date executionStartTime;\n    \n    private Map<String, Object> extData;\n\n    private List<String> configPreNodeIds;\n\n    private String preCheckType;\n    \n    private Boolean preResult = true;\n    \n    private Map<String, Object> processProperties;\n\n    private Map<String, Object> processParamProperties;\n    \n    private Map<String, Object> dataMap;\n    \n    @JsonIgnore\n    private StdProcessContext stdProcessContext;\n    \n    @JsonIgnore\n    private Object engineNodeContext;\n    \n    private Object actionResult;\n    \n    public Node getNode() {\n        return node;\n    }\n    public void setNode(Node node) {\n        this.node = node;\n    }\n    public String getNodeInstanceNo() {\n        return nodeInstanceNo;\n    }\n    public void setNodeInstanceNo(String nodeInstanceNo) {\n        this.nodeInstanceNo = nodeInstanceNo;\n    }\n    public String getPreviousNodeId() {\n        return previousNodeId;\n    }\n    public void setPreviousNodeId(String previousNodeId) {\n        this.previousNodeId = previousNodeId;\n    }\n    public String getNodeId() {\n        return nodeId;\n    }\n    public void setNodeId(String nodeId) {\n        this.nodeId = nodeId;\n    }\n    public String[] getNextNodeIds() {\n        return nextNodeIds;\n    }\n    public void setNextNodeIds(String[] nextNodeIds) {\n        this.nextNodeIds = nextNodeIds;\n    }\n    public String[] getNextNodeInstanceNos() {\n        return nextNodeInstanceNos;\n    }\n    public void setNextNodeInstanceNos(String[] nextNodeInstanceNos) {\n        this.nextNodeInstanceNos = nextNodeInstanceNos;\n    }\n    public String getEventId() {\n        return eventId;\n    }\n    public void setEventId(String eventId) {\n        this.eventId = eventId;\n    }\n    public Date getExecutionStartTime() {\n        return executionStartTime;\n    }\n    public void setExecutionStartTime(Date executionStartTime) {\n        this.executionStartTime = executionStartTime;\n    }\n    public Map<String, Object> getExtData() {\n        return extData;\n    }\n    public void setExtData(Map<String, Object> extData) {\n        this.extData = extData;\n    }\n    public List<String> getConfigPreNodeIds() {\n        return configPreNodeIds;\n    }\n    public void setConfigPreNodeIds(List<String> configPreNodeIds) {\n        this.configPreNodeIds = configPreNodeIds;\n    }\n    \n    public Map<String, Object> getProcessProperties() {\n        return processProperties;\n    }\n    public void setProcessProperties(Map<String, Object> processProperties) {\n        this.processProperties = processProperties;\n    }\n    public Map<String, Object> getProcessParamProperties() {\n        return processParamProperties;\n    }\n    public void setProcessParamProperties(Map<String, Object> processParamProperties) {\n        this.processParamProperties = processParamProperties;\n    }\n    public String getPreCheckType() {\n        return preCheckType;\n    }\n    public void setPreCheckType(String preCheckType) {\n        this.preCheckType = preCheckType;\n    }\n    public Boolean getPreResult() {\n        return preResult;\n    }\n    public void setPreResult(Boolean preResult) {\n        this.preResult = preResult;\n    }\n    \n    public Map<String, Object> getDataMap() {\n        return dataMap;\n    }\n\n    public void setDataMap(Map<String, Object> dataMap) {\n        this.dataMap = dataMap;\n    }\n\n    public void put(String key, Object value) {\n        if (dataMap == null) {\n            dataMap = new ConcurrentHashMap<String, Object>();\n        }\n        if (value == null) {\n            dataMap.remove(key);\n        } else {\n            dataMap.put(key, value);\n        }\n    }\n\n    public <T> T get(String key) {\n        if (dataMap == null) {\n            return null;\n        }\n        return (T) dataMap.get(key);\n    }\n\n    public void remove(String key) {\n        dataMap.remove(key);\n    }\n    public StdProcessContext getStdProcessContext() {\n        return stdProcessContext;\n    }\n    public void setStdProcessContext(StdProcessContext stdProcessContext) {\n        this.stdProcessContext = stdProcessContext;\n    }\n  \n    public Map<String, String> getVariables() {\n        return this.stdProcessContext.getNodeVariableGetter().apply(this);\n    }\n    \n    public void setVariables(Map<String, String> variables) {\n        this.stdProcessContext.getNodeVariableSetter().accept(Pair.of(this, variables));\n    }\n    \n    public void putVariable(String key, String value) {\n        Map<String, String> variables = getVariables();\n        if (variables == null) {\n            synchronized (stdProcessContext.getLock()) {\n                variables = getVariables();\n                if (variables == null) {\n                    variables = new ConcurrentHashMap<String, String>();\n                    this.setVariables(variables);\n                }\n            }\n        }\n        variables.put(key, value);\n    }\n    \n    public String getVariable(String key) {\n        Map<String, String> variables = this.getVariables();\n        if (variables == null) {\n            return null;\n        }\n        return variables.get(key);\n    }\n    \n    public <T>T getEngineNodeContext() {\n        return (T) engineNodeContext;\n    }\n    public void setEngineNodeContext(Object engineNodeContext) {\n        this.engineNodeContext = engineNodeContext;\n    }\n    \n    public Object getActionResult() {\n        return actionResult;\n    }\n    public void setActionResult(Object actionResult) {\n        this.actionResult = actionResult;\n    }\n    @Override\n    public String toString() {\n        return \"StdNodeContext [nodeInstanceNo=\" + nodeInstanceNo + \", previousNodeId=\" + previousNodeId + \", nodeId=\"\n                + nodeId + \", nextNodeIds=\" + Arrays.toString(nextNodeIds) + \", nextNodeInstanceNos=\"\n                + Arrays.toString(nextNodeInstanceNos) + \", eventId=\" + eventId + \", executionStartTime=\"\n                + executionStartTime + \", extData=\" + extData + \", configPreNodeIds=\" + configPreNodeIds\n                + \", preCheckType=\" + preCheckType + \", preResult=\" + preResult + \", processProperties=\"\n                + processProperties + \", processParamProperties=\" + processParamProperties + \", dataMap=\" + dataMap\n                + \"]\";\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/runtime/StdProcess.java",
    "content": "package com.jd.easyflow.process.client.runtime;\n\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport com.jd.easyflow.process.client.runtime.core.Process;\n\n/**\n * @author liyuliang5\n * \n */\npublic class StdProcess implements Process {\n        \n    private Map<String, Object> processProperties;\n    \n    private Map<String, Object> extProperties;\n\n    public Map<String, Object> getProcessProperties() {\n        return processProperties;\n    }\n\n    public void setProcessProperties(Map<String, Object> processProperties) {\n        this.processProperties = processProperties;\n    }\n\n    public Map<String, Object> getExtProperties() {\n        return extProperties;\n    }\n\n    public void setExtProperties(Map<String, Object> extProperties) {\n        this.extProperties = extProperties;\n    }\n    \n    public void putExtProperty(String key, Object value) {\n        if (extProperties == null) {\n            extProperties = new ConcurrentHashMap<>();\n        }\n        extProperties.put(key, value);\n    }\n    \n    public <T>T getExtProperty(String key) {\n        if (extProperties == null) {\n            return null;\n        }\n        return (T) extProperties.get(key);\n    }\n\n    @Override\n    public String toString() {\n        return \"StdProcess [processProperties=\" + processProperties + \", extProperties=\" + extProperties + \"]\";\n    }\n    \n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/runtime/StdProcessConstants.java",
    "content": "package com.jd.easyflow.process.client.runtime;\n\n/**\n * @author liyuliang5\n * \n */\npublic class StdProcessConstants {\n    \n    public static final String NS_SEP = \":\";\n    public static final String NS_EASYFLOW = \"easyflow\";\n\n    public static final String FLUSH_AFTER_PROCESS = \"AFTER_PROCESS\";\n    public static final String FLUSH_BEFORE_NODE = \"BEFORE_NODE\";\n    public static final String FLUSH_AFTER_NODE = \"AFTER_NODE\";\n    public static final String FLUSH_BEFORE_AND_AFTER_NODE = \"BEFORE_AND_AFTER_NODE\";\n    \n    public static final String STATUS_ACTIVE = \"ACTIVE\";\n    public static final String STATUS_CLOSE = \"CLOSE\";\n    public static final String STATUS_CANCELED = \"CANCELED\";\n    \n    public static final String NODE_STATUS_ACTIVE = \"ACTIVE\";\n    public static final String NODE_STATUS_INACTIVE = \"INACTIVE\";\n    public static final String NODE_STATUS_CLOSE = \"CLOSE\";\n    public static final String NODE_STATUS_INVALID = \"INVALID\";\n    \n    public static final String EXECUTION_STATUS_CLOSE = \"CLOSE\";\n    \n    public static final String CTX_VARIABLES = \"_VARIABLES\";\n    \n    public static final String NODE_CTX_VARIABLES = \"_VARIABLES\";\n\n    \n    public static final String PROP_START = \"start\";\n    public static final String PROP_END = \"end\";\n    \n    public static final String PROCESS_DEF_FSM = \"FSM-\";\n    public static final String PROCESS_DEF_FLOW = \"FLOW-\";\n    \n    public static final String PROP_DATA_FLUSH_POLICY = \"dataFlushPolicy\";\n    public static final String PROP_CHECK_FLUSH_NODES = \"checkFlushNodes\";\n    public static final String PROP_FLUSH = \"flush\";\n    public static final String PROP_FLUSH_NODES = \"flushNodes\";\n    public static final String PROP_START_NODE_IDS = \"startNodeIds\";\n    public static final String PROP_END_NODE_IDS = \"endNodeIds\";\n    public static final String PROP_CHECK_START_NODE = \"checkStartNode\";\n    public static final String PROP_PROCESS_INSTANCE_STATUS_MESSAGE = \"processInstanceStatusMessage\";\n    public static final String PROP_NODE_INSTANCE_STATUS_MESSAGE = \"nodeInstanceStatusMessage\";\n    public static final String PROP_TASK = \"task\";\n    \n    public static final String EXT_PROP_ENGINE = \"_engine\";\n    public static final String ENGINE_FLOW = \"flow\";\n    public static final String ENGINE_FSM = \"fsm\";\n    \n    public static final String PROP_CREATE_INSTANCE_EVERY_TIME = \"createInstanceEveryTime\";\n    public static final String PROP_SAVE_PREVIOUS_POLICY = \"savePreviousPolicy\";\n    public static final String PROP_START_CHECK_POLICY = \"startCheckPolicy\";\n    public static final String PROP_BIZ_RELATION = \"bizRelation\";\n    public static final String PROP_EXECUTE_CLOSE_POLICY = \"executeClosePolicy\";\n    public static final String PROP_DATA_FLUSH_AFTER_CREATE = \"dataFlushAfterCreate\";\n    public static final String PROP_DATA_FLUSH_BEFORE_PROCESS = \"dataFlushBeforeProcess\";\n    \n    public static final String PROP_DATA_FLUSH_BY_PARENT = \"dataFlushByParent\";\n    \n    public static final String BIZ_RELATION_ONE_ONE = \"ONE_ONE\";\n    public static final String BIZ_RELATION_MANY_ONE = \"MANY_ONE\";\n    \n    public static final String POLICY_EXCEPTION = \"EXCEPTION\";\n    public static final String POLICY_EMPTY_RUN = \"EMPTY_RUN\";\n    public static final String POLICY_NORMAL = \"NORMAL\";\n        \n    public static final String PROP_BIZNO = \"bizNo\";\n    public static final String PROP_PROCESS_TYPE = \"processType\";\n    \n    public static final String SAVE_PREVIOUS_POLICY_ALL = \"ALL\";\n    public static final String SAVE_PREVIOUS_POLICY_NONE = \"NONE\";\n    public static final String SAVE_PREVIOUS_POLICY_DISTINCT = \"DISTINCT\";\n\n    public static final String START_CHECK_POLICY_ONCE = \"ONCE\";\n    public static final String START_CHECK_POLICY_UNLIMIT = \"UNLIMIT\";\n    public static final String START_CHECK_POLICY_NO_OPENING = \"NO_OPENING\";\n    \n\n    public static final String OP_TYPE_CREATE = \"CREATE\";\n    public static final String OP_TYPE_EXECUTE = \"EXECUTE\";\n    public static final String OP_TYPE_CREATE_OR_EXECUTE = \"CREATE_OR_EXECUTE\";\n    \n    public static final String EVENT_PROCESS_INSTANCE_START = \"PROCESS_INSTANCE_START\";\n    public static final String EVENT_PROCESS_INSTANCE_END = \"PROCESS_INSTANCE_END\";\n    \n    public static final String EVENT_NODE_INSTANCE_START = \"NODE_INSTANCE_START\";\n    public static final String EVENT_NODE_INSTANCE_END = \"NODE_INSTANCE_END\";\n    \n    public static final String EVENT_TXN_FLUSH_START = \"TXN_FLUSH_START\";\n    public static final String EVENT_TXN_FLUSH_END = \"TXN_FLUSH_END\";\n    \n    public static final String EVENT_PROCESS_INSTANCE_EXEC_START = \"PROCESS_INSTANCE_EXEC_START\";\n    public static final String EVENT_PROCESS_INSTANCE_EXEC_END = \"PROCESS_INSTANCE_EXEC_END\";\n    \n    public static final String EVENT_NODE_INSTANCE_EXEC_START = \"NODE_INSTANCE_EXEC_START\";\n    public static final String EVENT_NODE_INSTANCE_EXEC_END = \"NODE_INSTANCE_EXEC_END\";\n    \n    public static final int NODE_START_EVENT_POLICY_ACTIVE = 1;\n    public static final int NODE_START_EVENT_POLICY_CREATE = 2;\n    \n    public static final String PROCESS_VAR_COMPENSATE_FLAG = \"_COMPENSATE_FLAG\";\n    public static final String PROCESS_VAR_COMPENSATED_FLAG = \"_COMPENSATED_FLAG\";\n    public static final String NODE_VAR_COMPENSATED_FLAG = \"_COMPENSATED_FLAG\";\n    public static final String NODE_VAR_COMPENSATE_NODE_FLAG = \"_COMPENSATE_NODE_FLAG\";\n    public static final String NODE_VAR_COMPENSATE_FOR = \"_COMPENSATE_FOR\";\n    public static final String NODE_VAR_COMPENSATED_BY = \"_COMPENSATED_BY\";\n    \n    public static final String FLUSH_POINT_AFTER_CREATE = \"AFTER_CREATE\";\n    public static final String FLUSH_POINT_BEFORE_PROCESS = \"BEFORE_PROCESS\";\n    public static final String FLUSH_POINT_BEFORE_NODE = \"BEFORE_NODE\";\n    public static final String FLUSH_POINT_AFTER_NODE = \"AFTER_NODE\";\n    public static final String FLUSH_POINT_AFTER_PROCESS = \"AFTER_PROCESS\";\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/runtime/StdProcessContext.java",
    "content": "package com.jd.easyflow.process.client.runtime;\n\nimport java.util.List;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.function.Consumer;\nimport java.util.function.Function;\nimport java.util.function.Supplier;\n\nimport com.fasterxml.jackson.annotation.JsonIgnore;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessInstanceDTO;\nimport com.jd.easyflow.process.client.runtime.core.ProcessContext;\nimport com.jd.easyflow.process.client.util.Pair;\n\n/**\n * @author liyuliang5\n * \n */\npublic class StdProcessContext implements ProcessContext {\n    \n    private StdProcess process;\n\n    private String instanceNo;\n\n    private Map<String, Object> processProperties;\n\n    private Map<String, Object> processParamProperties;\n    \n    private List<String> startNodeIds;\n    \n    private Object lock = new Object();\n    \n    private String lockRequestId;\n    \n    private ProcessCache cache = new ProcessCache();\n\n    private Consumer<Map<String, String>> variableSetter;\n    \n    private Supplier<Map<String, String>> variableGetter;\n    \n    private Consumer<Pair<StdNodeContext, Map<String, String>>> nodeVariableSetter;\n    \n    private Function<StdNodeContext, Map<String, String>> nodeVariableGetter;\n    \n    private Function<String, StdNode> nodeFunction;\n    \n    private Function<ProcessInstanceDTO, List<String>> startNodesFunction;\n\n    private Function<Object, Object> eventTriggerFunction;\n    \n    private Boolean start;\n    \n    private Boolean end;\n    \n    private boolean checkStartNode = true;\n    \n    private String bizLockKey;\n\n    private String bizLockRequestId;\n\n    private String instanceLockKey;\n    private String instanceLockRequestId;\n\n    private String processType;\n\n    private String bizNo;\n    \n    private String opType;\n    \n    /**\n     * interrupted\n     */\n    private volatile boolean interrupted = false;\n    \n    private int nodeStartEventPolicy;\n    \n    /**\n     * Common data map.\n     */\n    private Map<String, Object> data = new ConcurrentHashMap<String, Object>();\n    \n    @JsonIgnore\n    private Object engineProcessContext;\n    \n    private boolean subProcess;\n    \n    public void put(String key, Object value) {\n        if (value == null) {\n            data.remove(key);\n        } else {\n            data.put(key, value);\n        }\n    }\n\n    public <T> T get(String key) {\n        return (T) data.get(key);\n    }\n    \n    public <T>T getProcessProperty(String key) {\n        if (processProperties == null) {\n            return null;\n        }\n        return (T) processProperties.get(key);\n    }\n\n    public StdProcess getProcess() {\n        return process;\n    }\n\n    public String getInstanceNo() {\n        return instanceNo;\n    }\n\n    public void setInstanceNo(String instanceNo) {\n        this.instanceNo = instanceNo;\n    }\n\n    public Map<String, Object> getProcessProperties() {\n        return processProperties;\n    }\n\n    public void setProcessProperties(Map<String, Object> processProperties) {\n        this.processProperties = processProperties;\n    }\n\n    public Map<String, Object> getProcessParamProperties() {\n        return processParamProperties;\n    }\n\n    public void setProcessParamProperties(Map<String, Object> processParamProperties) {\n        this.processParamProperties = processParamProperties;\n    }\n\n    public List<String> getStartNodeIds() {\n        return startNodeIds;\n    }\n\n    public void setStartNodeIds(List<String> startNodeIds) {\n        this.startNodeIds = startNodeIds;\n    }\n\n    public Object getLock() {\n        return lock;\n    }\n\n    public void setLock(Object lock) {\n        this.lock = lock;\n    }\n\n    public String getLockRequestId() {\n        return lockRequestId;\n    }\n\n    public void setLockRequestId(String lockRequestId) {\n        this.lockRequestId = lockRequestId;\n    }\n\n    public ProcessCache getCache() {\n        return cache;\n    }\n\n    public void setCache(ProcessCache cache) {\n        this.cache = cache;\n    }\n\n    public Consumer<Map<String, String>> getVariableSetter() {\n        return variableSetter;\n    }\n\n    public void setVariableSetter(Consumer<Map<String, String>> variableSetter) {\n        this.variableSetter = variableSetter;\n    }\n\n    public Supplier<Map<String, String>> getVariableGetter() {\n        return variableGetter;\n    }\n\n    public void setVariableGetter(Supplier<Map<String, String>> variableGetter) {\n        this.variableGetter = variableGetter;\n    }\n\n    public Function<String, StdNode> getNodeFunction() {\n        return nodeFunction;\n    }\n\n    public void setNodeFunction(Function<String, StdNode> nodeFunction) {\n        this.nodeFunction = nodeFunction;\n    }\n\n    public Function<ProcessInstanceDTO, List<String>> getStartNodesFunction() {\n        return startNodesFunction;\n    }\n\n    public void setStartNodesFunction(Function<ProcessInstanceDTO, List<String>> startNodesFunction) {\n        this.startNodesFunction = startNodesFunction;\n    }\n\n    public Boolean getStart() {\n        return start;\n    }\n\n    public void setStart(Boolean start) {\n        this.start = start;\n    }\n\n    public Boolean getEnd() {\n        return end;\n    }\n\n    public void setEnd(Boolean end) {\n        this.end = end;\n    }\n\n    public boolean isCheckStartNode() {\n        return checkStartNode;\n    }\n\n    public void setCheckStartNode(boolean checkStartNode) {\n        this.checkStartNode = checkStartNode;\n    }\n\n    public String getBizLockKey() {\n        return bizLockKey;\n    }\n\n    public void setBizLockKey(String bizLockKey) {\n        this.bizLockKey = bizLockKey;\n    }\n\n    public String getBizLockRequestId() {\n        return bizLockRequestId;\n    }\n\n    public void setBizLockRequestId(String bizLockRequestId) {\n        this.bizLockRequestId = bizLockRequestId;\n    }\n\n    public String getInstanceLockKey() {\n        return instanceLockKey;\n    }\n\n    public void setInstanceLockKey(String instanceLockKey) {\n        this.instanceLockKey = instanceLockKey;\n    }\n\n    public String getInstanceLockRequestId() {\n        return instanceLockRequestId;\n    }\n\n    public void setInstanceLockRequestId(String instanceLockRequestId) {\n        this.instanceLockRequestId = instanceLockRequestId;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    public String getOpType() {\n        return opType;\n    }\n\n    public void setOpType(String opType) {\n        this.opType = opType;\n    }\n\n    public String getProcessType() {\n        return processType;\n    }\n\n    public void setProcessType(String processType) {\n        this.processType = processType;\n    }\n\n    public void setProcess(StdProcess process) {\n        this.process = process;\n    }\n\n    public Function<Object, Object> getEventTriggerFunction() {\n        return eventTriggerFunction;\n    }\n\n    public void setEventTriggerFunction(Function<Object, Object> eventTriggerFunction) {\n        this.eventTriggerFunction = eventTriggerFunction;\n    }\n\n    public boolean isInterrupted() {\n        return interrupted;\n    }\n\n    public void setInterrupted() {\n        this.interrupted = true;\n    }\n\n    public Map<String, Object> getData() {\n        return data;\n    }\n\n    public void setData(Map<String, Object> data) {\n        this.data = data;\n    }\n\n    public int getNodeStartEventPolicy() {\n        return nodeStartEventPolicy;\n    }\n\n    public void setNodeStartEventPolicy(int nodeStartEventPolicy) {\n        this.nodeStartEventPolicy = nodeStartEventPolicy;\n    }\n    \n    public Map<String, String> getVariables() {\n        return this.variableGetter.get();\n    }\n    \n    public void setVariables(Map<String, String> variables) {\n        this.variableSetter.accept(variables);\n    }\n    \n    public void putVariable(String key, String value) {\n        Map<String, String> variables = this.variableGetter.get();\n        if (variables == null) {\n            synchronized (this.getLock()) {\n                variables = this.variableGetter.get();\n                if (variables == null) {\n                    variables = new ConcurrentHashMap<String, String>();\n                    this.variableSetter.accept(variables);\n                }\n            }\n        }\n        variables.put(key, value);\n    }\n    \n    public String getVariable(String key) {\n        Map<String, String> variables = this.variableGetter.get();\n        if (variables == null) {\n            return null;\n        }\n        return variables.get(key);\n    }\n\n    public Consumer<Pair<StdNodeContext, Map<String, String>>> getNodeVariableSetter() {\n        return nodeVariableSetter;\n    }\n\n    public void setNodeVariableSetter(Consumer<Pair<StdNodeContext, Map<String, String>>> nodeVariableSetter) {\n        this.nodeVariableSetter = nodeVariableSetter;\n    }\n\n    public Function<StdNodeContext, Map<String, String>> getNodeVariableGetter() {\n        return nodeVariableGetter;\n    }\n\n    public void setNodeVariableGetter(Function<StdNodeContext, Map<String, String>> nodeVariableGetter) {\n        this.nodeVariableGetter = nodeVariableGetter;\n    }\n\n    public <T>T getEngineProcessContext() {\n        return (T) engineProcessContext;\n    }\n\n    public void setEngineProcessContext(Object engineProcessContext) {\n        this.engineProcessContext = engineProcessContext;\n    }\n\n    public boolean isSubProcess() {\n        return subProcess;\n    }\n\n    public void setSubProcess(boolean subProcess) {\n        this.subProcess = subProcess;\n    }\n\n    @Override\n    public String toString() {\n        return \"StdProcessContext [instanceNo=\" + instanceNo + \", processProperties=\" + processProperties\n                + \", processParamProperties=\" + processParamProperties + \", startNodeIds=\" + startNodeIds\n                + \", lockRequestId=\" + lockRequestId + \", cache=\" + cache + \", start=\" + start + \", end=\" + end\n                + \", checkStartNode=\" + checkStartNode + \", bizLockKey=\" + bizLockKey + \", bizLockRequestId=\"\n                + bizLockRequestId + \", instanceLockKey=\" + instanceLockKey + \", instanceLockRequestId=\"\n                + instanceLockRequestId + \", processType=\" + processType + \", bizNo=\" + bizNo + \", opType=\" + opType\n                + \", interrupted=\" + interrupted + \", nodeStartEventPolicy=\" + nodeStartEventPolicy + \", data=\" + data\n                + \", subProcess=\" + subProcess + \"]\";\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/runtime/core/Node.java",
    "content": "package com.jd.easyflow.process.client.runtime.core;\n\n/**\n * @author liyuliang5\n *\n */\npublic interface Node {\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/runtime/core/NodeContext.java",
    "content": "package com.jd.easyflow.process.client.runtime.core;\n\n/**\n * @author liyuliang5\n *\n */\npublic interface NodeContext {\n\n    Node getNode();\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/runtime/core/Process.java",
    "content": "package com.jd.easyflow.process.client.runtime.core;\n\n/**\n * @author liyuliang5\n *\n */\npublic interface Process {\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/runtime/core/ProcessContext.java",
    "content": "package com.jd.easyflow.process.client.runtime.core;\n\n/**\n * @author liyuliang5\n *\n */\npublic interface ProcessContext {\n\n    Process getProcess();\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/runtime/core/ProcessEngine.java",
    "content": "package com.jd.easyflow.process.client.runtime.core;\n\n/**\n * @author liyuliang5\n *\n */\npublic interface ProcessEngine {\n\n    ProcessResult execute(ProcessParam param);\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/runtime/core/ProcessEngineImpl.java",
    "content": "package com.jd.easyflow.process.client.runtime.core;\n\nimport com.jd.easyflow.flow.engine.FlowEngine;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.engine.FlowResult;\nimport com.jd.easyflow.fsm.FsmManager;\nimport com.jd.easyflow.process.client.flow.StdFlowProcessConstants;\nimport com.jd.easyflow.process.client.runtime.StdProcessContext;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessEngineImpl implements ProcessEngine {\n\n    private FlowEngine flowEngine;\n\n    private FsmManager fsmManager;\n\n    @Override\n    public ProcessResult execute(ProcessParam param) {\n        FlowParam flowParam = new FlowParam(param.getProcessId(), param.getNodeIds(), param.getParam(), param.getDataMap());\n        FlowResult result = flowEngine.execute(flowParam);\n        ProcessResult processResult = new ProcessResult();\n        processResult.setResult(result.getResult());\n        processResult.setDataMap(result.getDataMap());\n        if (result.getContext() != null) {\n            StdProcessContext processContext = result.getContext().get(StdFlowProcessConstants.FLOW_CTX_PROCESS_CTX);\n            if (processContext != null) {\n                processResult.setProcessInstanceNo(processContext.getInstanceNo());\n            }\n        }\n        \n        return processResult;\n    }\n\n    public FlowEngine getFlowEngine() {\n        return flowEngine;\n    }\n\n    public void setFlowEngine(FlowEngine flowEngine) {\n        this.flowEngine = flowEngine;\n    }\n\n    public FsmManager getFsmManager() {\n        return fsmManager;\n    }\n\n    public void setFsmManager(FsmManager fsmManager) {\n        this.fsmManager = fsmManager;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/runtime/core/ProcessException.java",
    "content": "package com.jd.easyflow.process.client.runtime.core;\n\n/**\n * \n * @author liyuliang5\n * \n */\npublic class ProcessException extends RuntimeException {\n\n    private String code;\n\n    private String info;\n\n    private Object data;\n\n    public String getCode() {\n        return code;\n    }\n\n    public void setCode(String code) {\n        this.code = code;\n    }\n\n    public ProcessException(Throwable cause, String code, String info, Object... objects) {\n        super((code == null ? \"\" : code + \" \")\n                + (info != null && objects != null && objects.length > 0 ? String.format(info, objects) : info), cause);\n        this.code = code;\n        this.info = info != null && objects != null && objects.length > 0 ? String.format(info, objects) : info;\n    }\n\n    public ProcessException(String code, String info) {\n        this(null, code, info);\n    }\n\n    public ProcessException(String info) {\n        this(null, info);\n    }\n\n    public ProcessException(Throwable cause) {\n        this(cause, null, null);\n    }\n\n    public ProcessException(String info, Throwable cause) {\n        this(cause, null, info);\n    }\n\n    public ProcessException(String code, String info, Throwable cause) {\n        this(cause, code, info);\n    }\n\n    public String getInfo() {\n        return info;\n    }\n\n    public void setInfo(String info) {\n        this.info = info;\n    }\n\n    public Object getData() {\n        return data;\n    }\n\n    public void setData(Object data) {\n        this.data = data;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/runtime/core/ProcessParam.java",
    "content": "package com.jd.easyflow.process.client.runtime.core;\n\nimport java.util.List;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessParam {\n\n\n    public ProcessParam() {\n        // NOOP\n    }\n    \n    public ProcessParam(String processId) {\n        this.processId = processId;\n    }\n    \n    public ProcessParam(String processId, Object param) {\n        this.processId = processId;\n        this.param = param;\n    }\n    \n    public ProcessParam(String processId, String[] nodeIds, Object param) {\n        this.processId = processId;\n        this.nodeIds = nodeIds;\n        this.param = param;\n    }\n    \n    public ProcessParam(String processId, String nodeId, Object param) {\n        this.processId = processId;\n        this.nodeIds = new String[] {nodeId};\n        this.param = param;\n    }\n\n    private String processId;\n\n    private String[] nodeIds;\n    /**\n     * business param.\n     */\n    private Object param;\n\n    /**\n     * common param data.\n     */\n    private Map<String, Object> dataMap;\n\n    public String getProcessId() {\n        return processId;\n    }\n\n    public void setProcessId(String processId) {\n        this.processId = processId;\n    }\n\n    public String[] getNodeIds() {\n        return nodeIds;\n    }\n\n    public void setNodeIds(String[] nodeIds) {\n        this.nodeIds = nodeIds;\n    }\n\n    public void setNodeId(String nodeId) {\n        if (nodeId == null) {\n            return;\n        }\n        this.nodeIds = new String[] { nodeId };\n    }\n\n    public <T> T getParam() {\n        return (T) param;\n    }\n\n    /**\n     * param should be Object[] or List\n     * \n     * @param <T>\n     * @param index\n     * @return\n     */\n    public <T> T getParam(int index) {\n        if (param == null) {\n            return null;\n        }\n        if (param instanceof Object[]) {\n            return (T) ((Object[]) param)[index];\n        } else if (param instanceof List) {\n            return (T) ((List) param).get(index);\n        }\n        throw new IllegalStateException(\"Param:\" + param + \" is not index type\");\n    }\n\n    /**\n     * param should be Map\n     * \n     * @param <T>\n     * @param key\n     * @return\n     */\n    public <T> T getParam(String key) {\n        if (param == null) {\n            return null;\n        }\n        return (T) ((Map<String, Object>) param).get(key);\n    }\n\n    public void setParam(Object param) {\n        this.param = param;\n    }\n\n    public Map<String, Object> getDataMap() {\n        return dataMap;\n    }\n\n    public void put(String key, Object value) {\n        if (dataMap == null) {\n            dataMap = new ConcurrentHashMap<>();\n        }\n        dataMap.put(key, value);\n    }\n\n    public <T> T get(String key) {\n        if (dataMap == null) {\n            return null;\n        }\n        return (T) dataMap.get(key);\n    }\n\n    public void setDataMap(Map<String, Object> dataMap) {\n        this.dataMap = dataMap;\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/runtime/core/ProcessResult.java",
    "content": "package com.jd.easyflow.process.client.runtime.core;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport com.fasterxml.jackson.annotation.JsonIgnore;\nimport com.jd.easyflow.process.client.runtime.StdProcess;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessResult {\n\n\n    @JsonIgnore\n    private StdProcess context;\n\n    private Object result;\n    \n    private String processInstanceNo;\n    \n    private Map<String, Object> dataMap;\n\n    public StdProcess getContext() {\n        return context;\n    }\n\n    public void setContext(StdProcess context) {\n        this.context = context;\n    }\n\n    public synchronized <T>T getResult() {\n        return (T) result;\n    }\n\n    public synchronized void setResult(Object result) {\n        this.result = result;\n    }\n\n    /**\n     * \n     * Put result. putResult or addResult should use only one.\n     *\n     * @param key\n     * @param value\n     */\n    public synchronized void putResult(String key, Object value) {\n        if (result == null) {\n            result = new ConcurrentHashMap<>();\n        }\n        ((Map<String, Object>) result).put(key, value);\n    }\n    /**\n     * \n     * Add result. putResult or addResult should use only one.\n     *\n     * @param value\n     */\n    public synchronized void addResult(Object value) {\n        if (result == null) {\n            result = new ArrayList<Object>();\n        }\n        ((List<Object>) result).add(value);\n    }\n    \n    public synchronized <T>T getResult(String key) {\n        if (result == null) {\n            return null;\n        }\n        return (T) ((Map<String, Object>) result).get(key);\n    }\n    \n    public synchronized <T>T getResult(int index) {\n        if (result == null) {\n            return null;\n        }\n        return (T) ((List<Object>) result).get(index);\n    }\n\n    public String getProcessInstanceNo() {\n        return processInstanceNo;\n    }\n\n    public void setProcessInstanceNo(String processInstanceNo) {\n        this.processInstanceNo = processInstanceNo;\n    }\n\n    public Map<String, Object> getDataMap() {\n        return dataMap;\n    }\n\n    public void setDataMap(Map<String, Object> dataMap) {\n        this.dataMap = dataMap;\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/runtime/eventinfo/NodeInstanceEventInfo.java",
    "content": "package com.jd.easyflow.process.client.runtime.eventinfo;\n\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessNodeInstanceDTO;\nimport com.jd.easyflow.process.client.runtime.StdNodeContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class NodeInstanceEventInfo {\n\n    private ProcessNodeInstanceDTO nodeInstance;\n    \n    private StdNodeContext stdNodeContext;\n    \n    private String event;\n\n\n    public String getEvent() {\n        return event;\n    }\n\n    public void setEvent(String event) {\n        this.event = event;\n    }\n\n    public ProcessNodeInstanceDTO getNodeInstance() {\n        return nodeInstance;\n    }\n\n    public void setNodeInstance(ProcessNodeInstanceDTO nodeInstance) {\n        this.nodeInstance = nodeInstance;\n    }\n\n    public StdNodeContext getStdNodeContext() {\n        return stdNodeContext;\n    }\n\n    public void setStdNodeContext(StdNodeContext stdNodeContext) {\n        this.stdNodeContext = stdNodeContext;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/runtime/eventinfo/ProcessEventInfoCache.java",
    "content": "package com.jd.easyflow.process.client.runtime.eventinfo;\n\nimport java.util.List;\nimport java.util.Vector;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ProcessEventInfoCache {\n\n    private List<ProcessInstanceEventInfo> flushedProcessInstanceEventInfoList = new Vector<>();\n\n    private List<ProcessInstanceEventInfo> unflushedProcessInstanceEventInfoList = new Vector<>();\n\n    private List<NodeInstanceEventInfo> flushedNodeInstanceEventInfoList = new Vector<>();\n\n    private List<NodeInstanceEventInfo> unflushedNodeInstanceEventInfoList = new Vector<>();\n\n    public void addUnflushProcessInstanceEventInfo(ProcessInstanceEventInfo event) {\n        unflushedProcessInstanceEventInfoList.add(event);\n    }\n\n    public void addUnflushNodeInstanceEventInfo(NodeInstanceEventInfo event) {\n        unflushedNodeInstanceEventInfoList.add(event);\n    }\n\n    public void eventFlush() {\n        flushedProcessInstanceEventInfoList.addAll(unflushedProcessInstanceEventInfoList);\n        unflushedProcessInstanceEventInfoList.clear();\n        flushedNodeInstanceEventInfoList.addAll(unflushedNodeInstanceEventInfoList);\n        unflushedNodeInstanceEventInfoList.clear();\n    }\n\n    public List<ProcessInstanceEventInfo> getFlushedProcessInstanceEventInfoList() {\n        return flushedProcessInstanceEventInfoList;\n    }\n\n    public List<ProcessInstanceEventInfo> getUnflushedProcessInstanceEventInfoList() {\n        return unflushedProcessInstanceEventInfoList;\n    }\n\n    public List<NodeInstanceEventInfo> getFlushedNodeInstanceEventInfoList() {\n        return flushedNodeInstanceEventInfoList;\n    }\n\n    public List<NodeInstanceEventInfo> getUnflushedNodeInstanceEventInfoList() {\n        return unflushedNodeInstanceEventInfoList;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/runtime/eventinfo/ProcessEventInfoListener.java",
    "content": "package com.jd.easyflow.process.client.runtime.eventinfo;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessInstanceDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessNodeInstanceDTO;\nimport com.jd.easyflow.process.client.runtime.StdNodeContext;\nimport com.jd.easyflow.process.client.runtime.StdProcessConstants;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ProcessEventInfoListener {\n    \n    private static final Logger log = LoggerFactory.getLogger(ProcessEventInfoListener.class);\n\n\n    public void onProcessInstanceStart(ProcessInstanceDTO processInstance, ProcessEventInfoCache eventCache) {\n        if (log.isDebugEnabled()) {\n            log.debug(\"process instance start.\" + processInstance);\n        }\n        ProcessInstanceEventInfo event = new ProcessInstanceEventInfo();\n        event.setEvent(StdProcessConstants.EVENT_PROCESS_INSTANCE_START);\n        event.setProcessInstance(processInstance);\n        eventCache.addUnflushProcessInstanceEventInfo(event);\n    }\n\n    public void onProcessInstanceEnd(ProcessInstanceDTO processInstance, ProcessEventInfoCache eventCache) {\n        if (log.isDebugEnabled()) {\n            log.debug(\"process instance end.\" + processInstance);\n        }\n        ProcessInstanceEventInfo event = new ProcessInstanceEventInfo();\n        event.setEvent(StdProcessConstants.EVENT_PROCESS_INSTANCE_END);\n        event.setProcessInstance(processInstance);\n        eventCache.addUnflushProcessInstanceEventInfo(event);\n    }\n\n    public void onNodeInstanceStart(Object[] eventData, ProcessEventInfoCache eventCache) {\n        if (log.isDebugEnabled()) {\n            log.debug(\"node instance start.\" + eventData);\n        }\n        ProcessNodeInstanceDTO nodeInstance = (ProcessNodeInstanceDTO) eventData[0];\n        StdNodeContext nodeContext = (StdNodeContext) eventData[1];\n        NodeInstanceEventInfo event = new NodeInstanceEventInfo();\n        event.setEvent(StdProcessConstants.EVENT_NODE_INSTANCE_START);\n        event.setNodeInstance(nodeInstance);\n        event.setStdNodeContext(nodeContext);\n        eventCache.addUnflushNodeInstanceEventInfo(event);\n    }\n\n    public void onNodeInstanceEnd(Object[] eventData, ProcessEventInfoCache eventCache) {\n        if (log.isDebugEnabled()) {\n            log.debug(\"node instance end.\" + eventData);\n        }\n        ProcessNodeInstanceDTO nodeInstance = (ProcessNodeInstanceDTO) eventData[0];\n        StdNodeContext nodeContext = (StdNodeContext) eventData[1];\n        NodeInstanceEventInfo event = new NodeInstanceEventInfo();\n        event.setEvent(StdProcessConstants.EVENT_NODE_INSTANCE_END);\n        event.setNodeInstance(nodeInstance);\n        event.setStdNodeContext(nodeContext);;\n        eventCache.addUnflushNodeInstanceEventInfo(event);\n    }\n\n    public void onTxnFlushStart(ProcessEventInfoCache eventCache) {\n\n    }\n\n    public void onTxnFlushEnd(ProcessEventInfoCache eventCache) {\n        eventCache.eventFlush();\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/runtime/eventinfo/ProcessInstanceEventInfo.java",
    "content": "package com.jd.easyflow.process.client.runtime.eventinfo;\n\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessInstanceDTO;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ProcessInstanceEventInfo {\n\n    private ProcessInstanceDTO processInstance;\n    \n    private String event;\n\n    public ProcessInstanceDTO getProcessInstance() {\n        return processInstance;\n    }\n\n    public void setProcessInstance(ProcessInstanceDTO processInstance) {\n        this.processInstance = processInstance;\n    }\n\n    public String getEvent() {\n        return event;\n    }\n\n    public void setEvent(String event) {\n        this.event = event;\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/schedule/ProcessScheduleClientServiceImpl.java",
    "content": "package com.jd.easyflow.process.client.schedule;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.common.client.dto.ClientRequest;\nimport com.jd.easyflow.common.client.dto.ClientResponse;\nimport com.jd.easyflow.common.client.dto.ClientResponseCode;\nimport com.jd.easyflow.process.client.runtime.core.ProcessEngine;\nimport com.jd.easyflow.process.client.runtime.core.ProcessException;\nimport com.jd.easyflow.process.client.runtime.core.ProcessParam;\nimport com.jd.easyflow.process.client.runtime.core.ProcessResult;\nimport com.jd.easyflow.process.spi.client.ProcessScheduleClientService;\nimport com.jd.easyflow.process.spi.client.dto.ProcessExecuteReq;\nimport com.jd.easyflow.process.spi.client.dto.ProcessExecuteRes;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessScheduleClientServiceImpl implements ProcessScheduleClientService {\n    \n    private static final Logger log = LoggerFactory.getLogger(ProcessScheduleClientServiceImpl.class);\n\n\n    private ProcessEngine processEngine;\n\n    @Override\n    public ClientResponse execute(ClientRequest<ProcessExecuteReq> request) {\n        log.info(\"Start process schedule client execute, req:{}\", request);\n        ProcessExecuteReq req = request.getData();\n        ProcessParam processParam = new ProcessParam();\n        processParam.setProcessId(req.getProcessId());\n        processParam.setNodeIds(req.getNodeIds());\n        processParam.setParam(req.getParam());\n        processParam.setDataMap(req.getDataMap());\n        try {\n            ProcessResult processResult = processEngine.execute(processParam);\n            log.info(\"End process schedule client execute\");\n            ProcessExecuteRes res = new ProcessExecuteRes();\n            res.setProcessInstanceNo(processResult.getProcessInstanceNo());\n            res.setResult(processResult.getResult());\n            res.setDataMap(processResult.getDataMap());\n            return ClientResponse.build4Success(res);\n        } catch (Exception e) {\n            log.error(\"Process schedule client exception, \" + e.getMessage(), e);\n            String code = ClientResponseCode.EXCEPTION.getCode();\n            String message = \"Flow engine execute exception,\" + e.getMessage();\n            Map<String, Object> ext = null;\n            if (e instanceof ProcessException) {\n                ProcessException processException = (ProcessException) e;\n                if (processException.getCode() != null) {\n                    code = processException.getCode();\n                }\n                message = ((ProcessException) e).getMessage();\n                if (processException.getData() != null) {\n                    ext = new HashMap<>();\n                    ext.put(\"errorData\", processException.getData());\n                }\n            }\n            return ClientResponse.build4Failed(code, message, ext);\n        }\n    }\n\n    public ProcessEngine getProcessEngine() {\n        return processEngine;\n    }\n\n    public void setProcessEngine(ProcessEngine processEngine) {\n        this.processEngine = processEngine;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/task/TaskConstants.java",
    "content": "package com.jd.easyflow.process.client.task;\n\n/**\n * @author liyuliang5\n *\n */\npublic class TaskConstants {\n\n    public static final String NODE_PROP_TASK_KEY = \"task\";\n    public static final String PROCESS_PROP_TASK_KEY = \"task\";\n    \n    public static final String TASK_PROP_CREATE = \"create\";\n    public static final String TASK_PROP_EXECUTE = \"execute\";\n    public static final String TASK_PROP_ASIGNEE = \"assignee\";\n    public static final String TASK_PROP_ASIGNEE_LIST = \"assigneeList\";\n    public static final String TASK_PROP_BIZ_SERVICE = \"bizService\";\n    public static final String TASK_PROP_MULTIPLE = \"multiple\";\n    \n    public static final String TASK_PROP_BIZ_SERVICE_PARAM = \"bizServiceParam\";\n    public static final String TASK_BIZ_SERVICE_PARAM_CALL = \"callService\";\n    \n    public static final String TASK_TYPE_MANUAL = \"MANUAL\";\n    \n    public static final String PARAM_TASK_TASKNO = \"task.taskNo\";\n    \n    public static final String PARAM_TASK_EXECUTE_RESULT = \"task.executeBizResult\";\n    \n    public static final String PARAM_TASK_EXECUTE_DATA = \"task.executeBizData\";\n    public static final String PARAM_TASK_GROUP_LIST = \"task.groupList\";\n    public static final String PARAM_TASK_GROUP2_LIST = \"task.group2List\";\n    public static final String PARAM_TASK_INSTANCE_BIZ_DATA = \"task.instanceBizData\";\n    public static final String PARAM_TASK_INSTANCE_BIZ_STATUS = \"task.instanceBizStatus\";\n    public static final String PARAM_TASK_EXECUTE_CMDLIST_STR = \"task.executeCmdListStr\";\n    public static final String PARAM_TASK_OPERATION = \"task.operation\";\n    public static final String PARAM_TASK_EXT_DATA = \"task.extData\";\n    \n\n    \n    public static final String TASK_EVENT_CREATE = \"CREATE\";\n    \n    public static final String TASK_EVENT_EXECUTE = \"EXECUTE\";\n    \n    public static final String EXEC_MODE = \"execMode\";\n    \n    public static final String EXEC_MODE_SERVER = \"server\";\n    \n    public static final String EXEC_MODE_CLIENT = \"client\";\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/task/TaskErrorCode.java",
    "content": "package com.jd.easyflow.process.client.task;\n\n/**\n * @author liyuliang5\n *\n */\npublic enum TaskErrorCode {\n\n    PTC_0101(\"Call biz client execption\");\n\n    private String desc;\n\n    TaskErrorCode(String desc) {\n        this.desc = desc;\n    }\n\n    public String getDesc() {\n        return desc;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/task/biz/TaskBizService.java",
    "content": "package com.jd.easyflow.process.client.task.biz;\n\nimport com.jd.easyflow.process.client.task.biz.dto.TaskBizParam;\nimport com.jd.easyflow.process.client.task.biz.dto.TaskBizResult;\n\n/**\n * @author liyuliang5\n *\n */\npublic interface TaskBizService {\n\n    TaskBizResult execute(TaskBizParam param);\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/task/biz/dto/TaskBizParam.java",
    "content": "package com.jd.easyflow.process.client.task.biz.dto;\n\nimport java.util.Map;\n\n/**\n * @author liyuliang5\n *\n */\npublic class TaskBizParam {\n    \n    private String processType;\n    \n    private String bizNo;\n    \n    private String taskBizCode;\n    \n    private String processInstanceNo;\n    \n    private String instanceBizData;\n    \n    private String instanceBizStatus;\n    \n    private String event;\n\n    private Map<String, Object> bizServiceParam;\n    \n    private String taskNo;\n    \n    private String operation;\n\n    public String getProcessType() {\n        return processType;\n    }\n\n    public void setProcessType(String processType) {\n        this.processType = processType;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    public String getTaskBizCode() {\n        return taskBizCode;\n    }\n\n    public void setTaskBizCode(String taskBizCode) {\n        this.taskBizCode = taskBizCode;\n    }\n\n    public String getProcessInstanceNo() {\n        return processInstanceNo;\n    }\n\n    public void setProcessInstanceNo(String processInstanceNo) {\n        this.processInstanceNo = processInstanceNo;\n    }\n\n    public String getInstanceBizData() {\n        return instanceBizData;\n    }\n\n    public void setInstanceBizData(String instanceBizData) {\n        this.instanceBizData = instanceBizData;\n    }\n\n    public String getInstanceBizStatus() {\n        return instanceBizStatus;\n    }\n\n    public void setInstanceBizStatus(String instanceBizStatus) {\n        this.instanceBizStatus = instanceBizStatus;\n    }\n\n    public String getEvent() {\n        return event;\n    }\n\n    public void setEvent(String event) {\n        this.event = event;\n    }\n\n    public Map<String, Object> getBizServiceParam() {\n        return bizServiceParam;\n    }\n\n    public void setBizServiceParam(Map<String, Object> bizServiceParam) {\n        this.bizServiceParam = bizServiceParam;\n    }\n\n    public String getTaskNo() {\n        return taskNo;\n    }\n\n    public void setTaskNo(String taskNo) {\n        this.taskNo = taskNo;\n    }\n\n    public String getOperation() {\n        return operation;\n    }\n\n    public void setOperation(String operation) {\n        this.operation = operation;\n    }\n\n    @Override\n    public String toString() {\n        return \"TaskBizParam [processType=\" + processType + \", bizNo=\" + bizNo + \", taskBizCode=\" + taskBizCode\n                + \", processInstanceNo=\" + processInstanceNo + \", instanceBizData=\" + instanceBizData\n                + \", instanceBizStatus=\" + instanceBizStatus + \", event=\" + event + \", bizServiceParam=\"\n                + bizServiceParam + \", taskNo=\" + taskNo + \", operation=\" + operation + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/task/biz/dto/TaskBizResult.java",
    "content": "package com.jd.easyflow.process.client.task.biz.dto;\n\n/**\n * @author liyuliang5\n *\n */\npublic class TaskBizResult {\n\n    private String code;\n    \n    private String msg;\n\n    public String getCode() {\n        return code;\n    }\n\n    public void setCode(String code) {\n        this.code = code;\n    }\n\n    public String getMsg() {\n        return msg;\n    }\n\n    public void setMsg(String msg) {\n        this.msg = msg;\n    }\n\n    @Override\n    public String toString() {\n        return \"TaskBizResult [code=\" + code + \", msg=\" + msg + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/task/biz/impl/CallTaskBizService.java",
    "content": "package com.jd.easyflow.process.client.task.biz.impl;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport com.jd.easyflow.common.client.dto.ClientRequest;\nimport com.jd.easyflow.common.client.dto.ClientResponse;\nimport com.jd.easyflow.objects.factory.ObjectFactorys;\nimport com.jd.easyflow.process.client.runtime.core.ProcessException;\nimport com.jd.easyflow.process.client.task.TaskConstants;\nimport com.jd.easyflow.process.client.task.TaskErrorCode;\nimport com.jd.easyflow.process.client.task.biz.TaskBizService;\nimport com.jd.easyflow.process.client.task.biz.dto.TaskBizParam;\nimport com.jd.easyflow.process.client.task.biz.dto.TaskBizResult;\nimport com.jd.easyflow.process.spi.client.ProcessTaskClientService;\nimport com.jd.easyflow.process.spi.client.dto.ProcessTaskCallReq;\nimport com.jd.easyflow.process.spi.client.dto.ProcessTaskCallRes;\nimport com.jd.easyflow.process.spi.client.enums.ProcessClientResponseCode;\n\n/**\n * @author liyuliang5\n *\n */\npublic class CallTaskBizService implements TaskBizService {\n\n    @Override\n    public TaskBizResult execute(TaskBizParam param) {\n        String callService = (String) param.getBizServiceParam().get(TaskConstants.TASK_BIZ_SERVICE_PARAM_CALL);\n        String[] callServiceInfo = callService.split(\":\");\n        String providerId = callServiceInfo.length == 1 ? null : callServiceInfo[0];\n        String serviceId = callServiceInfo.length == 1 ? callServiceInfo[0] : callServiceInfo[1];\n        ProcessTaskClientService processTaskClientService = ObjectFactorys.getDefault()\n                .getObject(ProcessTaskClientService.class, providerId, serviceId);\n        ProcessTaskCallReq req = convert(param);\n        ClientResponse<ProcessTaskCallRes> response = processTaskClientService\n                .call(new ClientRequest<ProcessTaskCallReq>(req));\n        if (response.getResCode() != null\n                && !ProcessClientResponseCode.SUCCESS.getCode().equals(response.getResCode())) {\n            Map<String, Object> data = new HashMap<>();\n            data.put(\"bizResCode\", response.getResCode());\n            data.put(\"bizResDesc\", response.getResDesc());\n            ProcessException exception = new ProcessException(TaskErrorCode.PTC_0101.name(),\n                    TaskErrorCode.PTC_0101.getDesc());\n            exception.setData(data);\n            throw exception;\n        }\n        return null;\n    }\n\n    private ProcessTaskCallReq convert(TaskBizParam param) {\n        ProcessTaskCallReq req = new ProcessTaskCallReq();\n        req.setBizNo(param.getBizNo());\n        Map<String, Object> bizServiceParam = param.getBizServiceParam();\n        Map<String, Object> callParam = bizServiceParam == null ? null : (Map<String, Object>) bizServiceParam.get(\"callParam\");\n        req.setCallParam(callParam);\n        req.setEvent(param.getEvent());\n        req.setInstanceBizData(param.getInstanceBizData());\n        req.setInstanceBizStatus(param.getInstanceBizStatus());\n        req.setProcessInstanceNo(param.getProcessInstanceNo());\n        req.setProcessType(param.getProcessType());\n        req.setTaskBizCode(param.getTaskBizCode());\n        return req;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/task/biz/impl/FlowTaskBizService.java",
    "content": "package com.jd.easyflow.process.client.task.biz.impl;\n\n/**\n * @author liyuliang5\n *\n */\npublic class FlowTaskBizService {\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/task/biz/impl/RuleAndCallTaskBizService.java",
    "content": "package com.jd.easyflow.process.client.task.biz.impl;\n\n/**\n * @author liyuliang5\n *\n */\npublic class RuleAndCallTaskBizService {\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/task/biz/impl/RuleTaskBizService.java",
    "content": "package com.jd.easyflow.process.client.task.biz.impl;\n\n/**\n * @author liyuliang5\n *\n */\npublic class RuleTaskBizService {\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/task/flow/BaseTaskNodeAction.java",
    "content": "package com.jd.easyflow.process.client.task.flow;\n\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.NodeAction;\nimport com.jd.easyflow.flow.model.NodeContext;\nimport com.jd.easyflow.flow.util.FlowStringUtil;\nimport com.jd.easyflow.objects.factory.ObjectFactorys;\nimport com.jd.easyflow.process.adapter.export.ProcessTaskExport;\nimport com.jd.easyflow.process.adapter.export.constant.ProcessTaskConstants;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessInstanceDTO;\nimport com.jd.easyflow.process.adapter.export.dto.task.ProcessTaskDTO;\nimport com.jd.easyflow.process.client.flow.StdFlowProcessConstants;\nimport com.jd.easyflow.process.client.runtime.ProcessRuntimeManager;\nimport com.jd.easyflow.process.client.runtime.StdNodeContext;\nimport com.jd.easyflow.process.client.runtime.StdProcessContext;\nimport com.jd.easyflow.process.client.task.TaskConstants;\nimport com.jd.easyflow.process.client.task.service.TaskClientService;\nimport com.jd.easyflow.process.client.task.service.dto.TaskCreateParam;\nimport com.jd.easyflow.process.client.task.service.dto.TaskExecuteParam;\n\n/**\n * @author liyuliang5\n *\n */\npublic abstract class BaseTaskNodeAction implements NodeAction {\n    \n    private static final Logger log = LoggerFactory.getLogger(BaseTaskNodeAction.class);\n\n    private ProcessTaskExport processTaskExport;\n\n    private ProcessRuntimeManager processRuntimeManager;\n\n    private TaskClientService taskClientService;\n\n    public <T> T createTask(NodeContext nodeContext, FlowContext context) {\n        FlowParam param = context.getParam();\n        Map<String, Object> paramMap = (Map<String, Object>) param.getParam();\n        if (paramMap == null) {\n            paramMap = new HashMap<>();\n            context.getParam().setParam(paramMap);\n        }\n        FlowNode flowNode = context.getFlow().getNode(nodeContext.getNodeId());\n        String instanceBizStatus = context.get(StdFlowProcessConstants.FLOW_CTX_BIZ_STATUS);\n        String instanceBizData = context.get(StdFlowProcessConstants.FLOW_CTX_BIZ_DATA);\n\n        TaskCreateParam taskCreateParam = new TaskCreateParam();\n        taskCreateParam.setBizNo(context.get(StdFlowProcessConstants.FLOW_CTX_BIZNO));\n        taskCreateParam.setInstanceBizStatus(instanceBizStatus);\n        taskCreateParam.setInstanceBizData(instanceBizData);\n        Map dataMap = new HashMap();\n        StdProcessContext processContext = context.get(StdFlowProcessConstants.FLOW_CTX_PROCESS_CTX);\n        ProcessInstanceDTO processInstance = processRuntimeManager.getProcessInstance(processContext);\n        dataMap.put(\"processInstanceData\", processInstance);\n        taskCreateParam.setElFunction(exp -> context.getElEvaluator().eval(exp, nodeContext, context, dataMap));\n        taskCreateParam.setFlowTaskProperties(\n                (Map<String, Object>) context.getFlow().getProperty(TaskConstants.PROCESS_PROP_TASK_KEY));\n        taskCreateParam.setNodeContext(nodeContext.get(StdFlowProcessConstants.FLOW_NODE_CTX_NODE_CTX));\n        taskCreateParam.setProcessContext(context.get(StdFlowProcessConstants.FLOW_CTX_PROCESS_CTX));\n        taskCreateParam.setProcessType(context.get(StdFlowProcessConstants.FLOW_CTX_PROCESS_TYPE));\n        taskCreateParam.setProductCode(context.get(StdFlowProcessConstants.FLOW_CTX_PRODUCT_CODE));\n        taskCreateParam.setTaskBizCode(flowNode.getId());\n        taskCreateParam.setTaskBizName(flowNode.getName());\n        taskCreateParam.setTaskProperties((Map<String, Object>) flowNode.getProperty(TaskConstants.NODE_PROP_TASK_KEY));\n        taskCreateParam.setUser(context.get(StdFlowProcessConstants.FLOW_CTX_USER));\n\n        String taskNo = taskClientService.createTask(taskCreateParam);\n        paramMap.put(TaskConstants.PARAM_TASK_TASKNO, taskNo);\n        return null;\n    }\n    \n    /**\n     * \n     * @param <T>\n     * @param nodeContext\n     * @param context\n     * @return\n     */\n    public <T> T executeTask(NodeContext nodeContext, FlowContext context) {\n        FlowParam param = context.getParam();\n        FlowNode flowNode = context.getFlow().getNode(nodeContext.getNodeId());\n        Map<String, Object> taskProperties = (Map<String, Object>) flowNode.getProperty(TaskConstants.NODE_PROP_TASK_KEY);\n        Map<String, Object> executeConf = taskProperties == null ? null : (Map<String, Object>) taskProperties.get(\"execute\");\n        Map<String, Object> executeParamConf = executeConf == null ? null : (Map<String, Object>) executeConf.get(\"param\");\n        TaskExecuteParam taskExecuteParam = new TaskExecuteParam();\n        String instanceBizStatus = null;\n        String instanceBizData = null;\n        String executeBizResult = null;\n        String user = null;\n        String executeBizData = null;\n        if (executeParamConf != null) {\n            String executeBizResultExp = (String) executeParamConf.get(\"executeBizResult\");\n            String executeBizDataExp = (String) executeParamConf.get(\"executeBizData\");\n            String instanceBizStatusExp = (String) executeParamConf.get(\"instanceBizStatus\");\n            String instanceBizDataExp = (String) executeParamConf.get(\"instanceBizData\");\n            String userExp = (String) executeParamConf.get(\"user\");\n            Map<String, Object> dataMap = new HashMap<>();\n            if (FlowStringUtil.isNotEmpty(executeBizResultExp)) {\n                executeBizResult = context.getElEvaluator().eval(executeBizResultExp, nodeContext, context, dataMap);\n            }\n            if (FlowStringUtil.isNotEmpty(executeBizDataExp)) {\n                executeBizData = context.getElEvaluator().eval(executeBizDataExp, nodeContext, context, dataMap);\n            }       \n            if (FlowStringUtil.isNotEmpty(instanceBizStatusExp)) {\n                instanceBizStatus = context.getElEvaluator().eval(instanceBizStatusExp, nodeContext, context, dataMap);\n            } \n            if (FlowStringUtil.isNotEmpty(instanceBizDataExp)) {\n                instanceBizData = context.getElEvaluator().eval(instanceBizDataExp, nodeContext, context, dataMap);\n            } \n            if (FlowStringUtil.isNotEmpty(userExp)) {\n                user = context.getElEvaluator().eval(userExp, nodeContext, context, dataMap);\n            }             \n        } else {\n            instanceBizStatus = context.get(StdFlowProcessConstants.FLOW_CTX_BIZ_STATUS);\n            instanceBizData = context.get(StdFlowProcessConstants.FLOW_CTX_BIZ_DATA);\n            executeBizResult = param.getParam(TaskConstants.PARAM_TASK_EXECUTE_RESULT);\n            executeBizData = param.getParam(TaskConstants.PARAM_TASK_EXECUTE_DATA);\n            user = context.get(StdFlowProcessConstants.FLOW_CTX_USER);\n            taskExecuteParam.setCmdListStr(param.getParam(TaskConstants.PARAM_TASK_EXECUTE_CMDLIST_STR));\n            taskExecuteParam.setGroup2List(param.getParam(TaskConstants.PARAM_TASK_GROUP2_LIST));\n            taskExecuteParam.setGroupList(param.getParam(TaskConstants.PARAM_TASK_GROUP_LIST));\n            taskExecuteParam.setOperation(param.getParam(TaskConstants.PARAM_TASK_OPERATION));\n            taskExecuteParam.setTaskExtData(param.getParam(TaskConstants.PARAM_TASK_EXT_DATA));\n        }\n        taskExecuteParam.setExecuteBizResult(executeBizResult);\n        taskExecuteParam.setExecuteBizData(executeBizData);\n        taskExecuteParam.setUser(user);\n        taskExecuteParam.setBizNo(context.get(StdFlowProcessConstants.FLOW_CTX_BIZNO));\n        taskExecuteParam.setProcessType(context.get(StdFlowProcessConstants.FLOW_CTX_PROCESS_TYPE));\n        taskExecuteParam.setInstanceBizData(instanceBizData);\n        taskExecuteParam.setInstanceBizStatus(instanceBizStatus); \n        taskExecuteParam.setProcessContext(context.get(StdFlowProcessConstants.FLOW_CTX_PROCESS_CTX));\n        taskExecuteParam.setNodeContext(nodeContext.get(StdFlowProcessConstants.FLOW_NODE_CTX_NODE_CTX));\n        taskExecuteParam.setTaskBizCode(flowNode.getId());\n\n        taskExecuteParam.setTaskNo(param.getParam(TaskConstants.PARAM_TASK_TASKNO));\n        taskExecuteParam.setFlowTaskProperties(\n                (Map<String, Object>) context.getFlow().getProperty(TaskConstants.PROCESS_PROP_TASK_KEY));\n        taskExecuteParam\n                .setTaskProperties((Map<String, Object>) flowNode.getProperty(TaskConstants.NODE_PROP_TASK_KEY));\n        executeTask(nodeContext, context, taskExecuteParam, instanceBizStatus, instanceBizData);\n        return (T) executeBizResult;\n    }\n\n    public void executeTask(NodeContext nodeContext, FlowContext context, TaskExecuteParam taskExecuteParam, String instanceBizStatus, String instanceBizData) {\n        StdProcessContext processContext = context.get(StdFlowProcessConstants.FLOW_CTX_PROCESS_CTX);\n        taskClientService.executeTask(taskExecuteParam);\n        if (instanceBizStatus != null) {\n            processRuntimeManager.op(processContext, () -> {\n                ProcessInstanceDTO processInstance = processRuntimeManager.getProcessInstance(processContext);\n                processInstance.setBizStatus(instanceBizStatus);\n                processRuntimeManager.updateProcessInstance(processInstance, processContext);\n                return null;\n            });            \n        }\n        if (instanceBizData != null) {\n            processRuntimeManager.op(processContext, () -> {\n                ProcessInstanceDTO processInstance = processRuntimeManager.getProcessInstance(processContext);\n                processInstance.setBizData(instanceBizData);\n                processRuntimeManager.updateProcessInstance(processInstance, processContext);\n                return null;\n            });\n        }\n        StdNodeContext processNodeContext = nodeContext.get(StdFlowProcessConstants.FLOW_NODE_CTX_NODE_CTX);\n        List<ProcessTaskDTO> taskList = taskClientService.findTaskByNodeInstanceNo(\n                processNodeContext.getNodeInstanceNo(),\n                (Map<String, Object>) context.getFlow().getProperty(TaskConstants.PROCESS_PROP_TASK_KEY),\n                processContext);\n        int pendingTaskCount = 0;\n        int finishTaskCount = 0;\n        Map<String, Integer> bizResultMap = new HashMap<>();\n        for (ProcessTaskDTO task : taskList) {\n            if (ProcessTaskConstants.TASK_STATUS_FINISH.equals(task.getStatus())) {\n                finishTaskCount++;\n                String bizResult = task.getExecuteBizResult();\n                if (FlowStringUtil.isNotEmpty(bizResult)) {\n                    Integer count = bizResultMap.get(bizResult);\n                    if (count == null) {\n                        count = 1;\n                    } else {\n                        count++;\n                    }\n                    bizResultMap.put(bizResult, count);\n                }\n            } else if (ProcessTaskConstants.TASK_STATUS_PENDING.equals(task.getStatus())) {\n                pendingTaskCount++;\n            }\n        }\n        nodeContext.put(\"task.pendingCount\", pendingTaskCount);\n        nodeContext.put(\"task.finishCount\", finishTaskCount);\n        nodeContext.put(\"task.allFinish\", pendingTaskCount == 0);\n        nodeContext.put(\"task.bizResults\", bizResultMap);\n        nodeContext.put(\"task.all\", taskList);\n    }\n    \n    private ProcessTaskExport getProcessTaskExport() {\n        if (processTaskExport == null) {\n            processTaskExport = ObjectFactorys.getDefault().getObject(ProcessTaskExport.class);\n        }\n        return processTaskExport;\n    }\n\n    public ProcessRuntimeManager getProcessRuntimeManager() {\n        return processRuntimeManager;\n    }\n\n    public void setProcessRuntimeManager(ProcessRuntimeManager processRuntimeManager) {\n        this.processRuntimeManager = processRuntimeManager;\n    }\n\n    public TaskClientService getTaskClientService() {\n        return taskClientService;\n    }\n\n    public void setTaskClientService(TaskClientService taskClientService) {\n        this.taskClientService = taskClientService;\n    }\n\n    public void setProcessTaskExport(ProcessTaskExport processTaskExport) {\n        this.processTaskExport = processTaskExport;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/task/flow/TaskCreateAndExecuteNodeAction.java",
    "content": "package com.jd.easyflow.process.client.task.flow;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * @author liyuliang5\n *\n */\npublic class TaskCreateAndExecuteNodeAction extends BaseTaskNodeAction {\n\n    @Override\n    public <T> T execute(NodeContext nodeContext, FlowContext context) {\n        super.createTask(nodeContext, context);\n        return super.executeTask(nodeContext, context);\n    }\n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/task/flow/TaskCreateNodeAction.java",
    "content": "package com.jd.easyflow.process.client.task.flow;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * \n *\n * @author liyuliang5\n *\n */\npublic class TaskCreateNodeAction extends BaseTaskNodeAction {\n    \n    private static final Logger log = LoggerFactory.getLogger(TaskCreateNodeAction.class);\n\n\n    @Override\n    public <T> T execute(NodeContext nodeContext, FlowContext context) {\n        return super.createTask(nodeContext, context);\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/task/flow/TaskExecuteNodeAction.java",
    "content": "package com.jd.easyflow.process.client.task.flow;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.model.NodeContext;\n\n/**\n * @author liyuliang5\n *\n */\npublic class TaskExecuteNodeAction extends BaseTaskNodeAction {\n    \n    private static final Logger log = LoggerFactory.getLogger(TaskExecuteNodeAction.class);\n\n    \n    @Override\n    public <T> T execute(NodeContext nodeContext, FlowContext context) {\n        return super.executeTask(nodeContext, context);\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/task/flow/TaskFlowListener.java",
    "content": "package com.jd.easyflow.process.client.task.flow;\n\nimport com.jd.easyflow.flow.engine.FlowContext;\nimport com.jd.easyflow.flow.engine.event.BaseFlowEventListener;\nimport com.jd.easyflow.flow.engine.event.FlowEvent;\nimport com.jd.easyflow.flow.util.FlowConstants;\nimport com.jd.easyflow.flow.util.FlowEventTypes;\nimport com.jd.easyflow.flow.util.Pair;\nimport com.jd.easyflow.process.client.flow.StdFlowProcessConstants;\nimport com.jd.easyflow.process.client.runtime.StdProcess;\nimport com.jd.easyflow.process.client.runtime.StdProcessConstants;\nimport com.jd.easyflow.process.client.runtime.StdProcessContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class TaskFlowListener extends BaseFlowEventListener {\n\n    private static final Pair<String, Integer>[] DEFAULT_ACCEPTED_EVENTS = new Pair[] {\n            Pair.of(FlowEventTypes.FLOW_START, FlowConstants.EVENT_ORDER_START + 90),\n            Pair.of(FlowEventTypes.NODE_START, FlowConstants.EVENT_ORDER_START + 100) };\n\n    \n    public TaskFlowListener() {\n        acceptedEvents = DEFAULT_ACCEPTED_EVENTS;\n    }\n\n    @Override\n    public void on(FlowEvent flowEvent) {\n        switch (flowEvent.getType()) {\n        case FlowEventTypes.FLOW_START: {\n            onFlowStart(flowEvent);\n            break;\n        }\n        case FlowEventTypes.NODE_START: {\n            onNodeStart(flowEvent);\n            break;\n        }\n        default:\n            break;\n        }\n\n    }\n\n    public void onFlowStart(FlowEvent event) {\n        FlowContext context = event.getContext();\n        StdProcessContext processContext = context.get(StdFlowProcessConstants.FLOW_CTX_PROCESS_CTX);\n        StdProcess process = (StdProcess) processContext.getProcess();\n        process.putExtProperty(StdProcessConstants.PROP_TASK,\n                event.getContext().getFlow().getProperty(StdProcessConstants.PROP_TASK));\n    }\n\n    public void onNodeStart(FlowEvent event) {\n\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/task/service/TaskClientManager.java",
    "content": "package com.jd.easyflow.process.client.task.service;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Objects;\n\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponse;\nimport com.jd.easyflow.common.adapter.export.util.ExportResponseUtil;\nimport com.jd.easyflow.objects.factory.ObjectFactorys;\nimport com.jd.easyflow.process.adapter.export.ProcessTaskExport;\nimport com.jd.easyflow.process.adapter.export.constant.ProcessTaskConstants;\nimport com.jd.easyflow.process.adapter.export.dto.task.ProcessTaskAssignDTO;\nimport com.jd.easyflow.process.adapter.export.dto.task.ProcessTaskDTO;\nimport com.jd.easyflow.process.adapter.export.dto.task.ProcessTaskEventDTO;\nimport com.jd.easyflow.process.adapter.export.dto.task.QueryTaskReq;\nimport com.jd.easyflow.process.client.runtime.ProcessCache;\nimport com.jd.easyflow.process.client.runtime.ProcessRuntimeManager;\nimport com.jd.easyflow.process.client.runtime.StdProcessContext;\nimport com.jd.easyflow.process.client.util.ExportRequestBuilder;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class TaskClientManager {\n\n    ProcessRuntimeManager processRuntimeManager;\n\n    ProcessTaskExport processTaskExport;\n    \n    private ExportRequestBuilder exportRequestBuilder = ExportRequestBuilder.getInstance();\n\n    public ProcessTaskDTO getTask(String taskNo, StdProcessContext context) {\n        return processRuntimeManager.op(context, () -> {\n            ProcessCache cache = context.getCache();\n            ProcessTaskDTO task = cache.get(ProcessTaskDTO.class, taskNo);\n            if (task != null) {\n                return task;\n            }\n            ExportResponse<ProcessTaskDTO> response = getProcessTaskExport().getTask(exportRequestBuilder.build(taskNo, context));\n            task = ExportResponseUtil.unwrap(response);\n            context.getCache().put(taskNo, task, false);\n            return task;\n        });\n    }\n    \n    public List<ProcessTaskDTO> findPendingTask(String processInstanceNo, String taskBizCode,\n            StdProcessContext context) {\n        return processRuntimeManager.op(context, () -> {\n            ProcessCache cache = context.getCache();\n            QueryTaskReq query = new QueryTaskReq();\n            query.setProcessInstanceNo(processInstanceNo);\n            query.setTaskBizCode(taskBizCode);\n            query.setStatus(ProcessTaskConstants.TASK_STATUS_PENDING);\n            ExportResponse<List<ProcessTaskDTO>> response = getProcessTaskExport()\n                    .queryTask(exportRequestBuilder.build(query, context));\n            List<ProcessTaskDTO> taskList = ExportResponseUtil.unwrap(response);\n            for (ProcessTaskDTO task : taskList) {\n                cache.put(task.getTaskNo(), task, false);\n            }\n            return taskList;\n        });\n    }\n\n    public List<ProcessTaskDTO> findTaskByNodeInstanceNo(String nodeInstanceNo, StdProcessContext context) {\n        return processRuntimeManager.op(context, () -> {\n            ProcessCache cache = context.getCache();\n            QueryTaskReq query = new QueryTaskReq();\n            query.setNodeInstanceNo(nodeInstanceNo);\n            List<ProcessTaskDTO> taskList = ExportResponseUtil\n                    .unwrap(getProcessTaskExport().queryTask(exportRequestBuilder.build(query, context)));\n            for (ProcessTaskDTO task : taskList) {\n                if (cache.get(ProcessTaskDTO.class, task.getTaskNo()) == null) {\n                    cache.put(task.getTaskNo(), task, false);\n                }\n            }\n            List<ProcessTaskDTO> result = new ArrayList<>();\n            for (ProcessTaskDTO task : cache.objects(ProcessTaskDTO.class)) {\n                if (Objects.equals(nodeInstanceNo, task.getNodeInstanceNo())) {\n                    result.add(task);\n                }\n            }\n            return result;\n        });\n    }\n\n    public List<ProcessTaskAssignDTO> findTaskAssignListByTaskNo(String taskNo, StdProcessContext context) {\n        return processRuntimeManager.op(context, () -> {\n            ProcessCache cache = context.getCache();\n            ExportResponse<List<ProcessTaskAssignDTO>> response = getProcessTaskExport()\n                    .findTaskAssignListByTaskNo(exportRequestBuilder.build(taskNo, context));\n            List<ProcessTaskAssignDTO> assignList = ExportResponseUtil.unwrap(response);\n            for (ProcessTaskAssignDTO assign : assignList) {\n                if (cache.get(ProcessTaskAssignDTO.class, assign.getAssignNo()) == null) {\n                    cache.put(assign.getAssignNo(), assign, false);\n                }\n            }\n            List<ProcessTaskAssignDTO> result = new ArrayList<>();\n            for (ProcessTaskAssignDTO assign : cache.objects(ProcessTaskAssignDTO.class)) {\n                if (assign.getTaskNo().equals(taskNo)) {\n                    result.add(assign);\n                }\n            }\n            return result;\n        });\n    }\n\n    public void updateObjects(List<Object> objects, StdProcessContext context) {\n        processRuntimeManager.op(context, () -> {\n            ProcessCache cache = context.getCache();\n            for (Object o : objects) {\n                if (o instanceof ProcessTaskDTO) {\n                    cache.put(((ProcessTaskDTO) o).getTaskNo(), o, true);\n                } else if (o instanceof ProcessTaskAssignDTO) {\n                    cache.put(((ProcessTaskAssignDTO) o).getAssignNo(), o, true);\n                } else if (o instanceof ProcessTaskEventDTO) {\n                    cache.put(((ProcessTaskEventDTO) o).getEventNo(), o, true);\n                } else {\n                    throw new UnsupportedOperationException(\"Unsupported operation type:\" + o.getClass());\n                }\n            }\n            return null;\n        });\n    }\n\n    private ProcessTaskExport getProcessTaskExport() {\n        if (processTaskExport == null) {\n            processTaskExport = ObjectFactorys.getDefault().getObject(ProcessTaskExport.class);\n        }\n        return processTaskExport;\n    }\n\n    public ProcessRuntimeManager getProcessRuntimeManager() {\n        return processRuntimeManager;\n    }\n\n    public void setProcessRuntimeManager(ProcessRuntimeManager processRuntimeManager) {\n        this.processRuntimeManager = processRuntimeManager;\n    }\n\n    public void setProcessTaskExport(ProcessTaskExport processTaskExport) {\n        this.processTaskExport = processTaskExport;\n    }\n\n    public ExportRequestBuilder getExportRequestBuilder() {\n        return exportRequestBuilder;\n    }\n\n    public void setExportRequestBuilder(ExportRequestBuilder exportRequestBuilder) {\n        this.exportRequestBuilder = exportRequestBuilder;\n    }\n    \n    \n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/task/service/TaskClientOperation.java",
    "content": "package com.jd.easyflow.process.client.task.service;\n\n/**\n * @author liyuliang5\n *\n */\npublic interface TaskClientOperation<P,R> {\n    \n    public R operate(P param);\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/task/service/TaskClientService.java",
    "content": "package com.jd.easyflow.process.client.task.service;\n\nimport java.util.Arrays;\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.function.Function;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponse;\nimport com.jd.easyflow.common.adapter.export.util.ExportResponseUtil;\nimport com.jd.easyflow.objects.factory.ObjectFactorys;\nimport com.jd.easyflow.process.adapter.export.ProcessTaskExport;\nimport com.jd.easyflow.process.adapter.export.ProcessTransactionExport;\nimport com.jd.easyflow.process.adapter.export.constant.ProcessTaskConstants;\nimport com.jd.easyflow.process.adapter.export.constant.ProcessTransactionConstants;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessInstanceDTO;\nimport com.jd.easyflow.process.adapter.export.dto.task.ProcessTaskAssignDTO;\nimport com.jd.easyflow.process.adapter.export.dto.task.ProcessTaskDTO;\nimport com.jd.easyflow.process.adapter.export.dto.task.ProcessTaskEventDTO;\nimport com.jd.easyflow.process.adapter.export.dto.task.QueryTaskReq;\nimport com.jd.easyflow.process.client.runtime.ObjectIdManager;\nimport com.jd.easyflow.process.client.runtime.ProcessCache;\nimport com.jd.easyflow.process.client.runtime.ProcessRuntimeManager;\nimport com.jd.easyflow.process.client.runtime.StdProcessContext;\nimport com.jd.easyflow.process.client.runtime.core.ProcessContext;\nimport com.jd.easyflow.process.client.runtime.core.ProcessException;\nimport com.jd.easyflow.process.client.task.TaskConstants;\nimport com.jd.easyflow.process.client.task.TaskErrorCode;\nimport com.jd.easyflow.process.client.task.biz.TaskBizService;\nimport com.jd.easyflow.process.client.task.biz.dto.TaskBizParam;\nimport com.jd.easyflow.process.client.task.biz.dto.TaskBizResult;\nimport com.jd.easyflow.process.client.task.service.dto.TaskCreateParam;\nimport com.jd.easyflow.process.client.task.service.dto.TaskExecuteParam;\nimport com.jd.easyflow.process.client.task.service.operation.ExecuteTaskOperation;\nimport com.jd.easyflow.process.client.task.service.operation.SaveTaskOperation;\nimport com.jd.easyflow.process.client.util.ExportRequestBuilder;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class TaskClientService {\n    \n    private static final Logger log = LoggerFactory.getLogger(TaskClientService.class);\n\n\n    public static final String OP_EXECUTE = \"EXECUTE\";\n    public static final String OP_CREATE = \"CREATE\";\n    public static final String OP_SAVE = \"SAVE\";\n\n    private ProcessTaskExport processTaskExport;\n\n    private ProcessRuntimeManager processRuntimeManager;\n\n    private ProcessTransactionExport processTransactionExport;\n\n    private TaskClientManager taskClientManager;\n\n    private Map<String, TaskClientOperation> clientOperationMap;\n\n    private ObjectIdManager objectIdManager = ObjectIdManager.INSTANCE;\n    \n    private ExportRequestBuilder exportRequestBuilder = ExportRequestBuilder.getInstance();\n\n    public void init() {\n        clientOperationMap = new ConcurrentHashMap<>();\n\n        ExecuteTaskOperation executeTaskOperation = new ExecuteTaskOperation();\n        executeTaskOperation.setTaskClientManager(taskClientManager);\n        clientOperationMap.put(OP_EXECUTE, executeTaskOperation);\n\n        SaveTaskOperation saveTaskOperation = new SaveTaskOperation();\n        saveTaskOperation.setTaskClientManager(taskClientManager);\n        clientOperationMap.put(OP_SAVE, saveTaskOperation);\n    }\n\n    public ProcessRuntimeManager getProcessRuntimeManager() {\n        return processRuntimeManager;\n    }\n\n    public void setProcessRuntimeManager(ProcessRuntimeManager processRuntimeManager) {\n        this.processRuntimeManager = processRuntimeManager;\n    }\n\n    public String createTask(TaskCreateParam param) {\n        StdProcessContext processContext = param.getProcessContext();\n        return processRuntimeManager.op(processContext, () -> {\n            List<ProcessTaskDTO> taskList = taskClientManager.findPendingTask(processContext.getInstanceNo(),\n                    param.getTaskBizCode(), processContext);\n            if (taskList.size() == 0) {\n                log.info(\"PENDING task not exists, create new task.\");\n                invokeCreateBizService(param);\n                return doCreateTaskInClientMode(param);\n            } else {\n                log.info(\"PENDING task exists\");\n                if (taskList.size() == 1) {\n                    return taskList.get(0).getTaskNo();\n                }\n                return null;\n            }\n        });\n    }\n\n    /**\n     * \n     * @param param\n     */\n    private void invokeCreateBizService(TaskCreateParam param) {\n        Map<String, Object> createProperties = param.getTaskProperties() == null ? null\n                : ((Map<String, Object>) param.getTaskProperties().get(\"create\"));\n        String bizService = createProperties == null ? null\n                : (String) createProperties.get(TaskConstants.TASK_PROP_BIZ_SERVICE);\n        if (bizService != null) {\n            String[] bizServiceInfo = bizService.split(\":\");\n            String providerId = bizServiceInfo.length == 1 ? null : bizServiceInfo[0];\n            String serviceId = bizServiceInfo.length == 1 ? bizServiceInfo[0] : bizServiceInfo[1];\n            TaskBizService taskBizService = ObjectFactorys.getDefault().getObject(TaskBizService.class, providerId,\n                    serviceId);\n            Map<String, Object> bizParam = (Map<String, Object>) createProperties\n                    .get(TaskConstants.TASK_PROP_BIZ_SERVICE_PARAM);\n\n            TaskBizParam taskCreateParam = new TaskBizParam();\n            taskCreateParam.setProcessType(param.getProcessType());\n            taskCreateParam.setBizNo(param.getBizNo());\n            taskCreateParam.setTaskBizCode(param.getTaskBizCode());\n            taskCreateParam.setProcessInstanceNo(param.getProcessContext().getInstanceNo());\n            taskCreateParam.setInstanceBizData(param.getInstanceBizData());\n            taskCreateParam.setInstanceBizStatus(param.getInstanceBizStatus());\n            taskCreateParam.setEvent(TaskConstants.TASK_EVENT_CREATE);\n            taskCreateParam.setBizServiceParam(bizParam);\n\n            TaskBizResult result = taskBizService.execute(taskCreateParam);\n            if (result != null && result.getCode() != null) {\n                Map<String, Object> data = new HashMap<>();\n                data.put(\"bizResCode\", result.getCode());\n                data.put(\"bizResDesc\", result.getMsg());\n                ProcessException exception = new ProcessException(TaskErrorCode.PTC_0101.name(),\n                        TaskErrorCode.PTC_0101.getDesc());\n                exception.setData(data);\n                log.error(\"Task biz process return fail, fail code:\" + result.getCode() + \"; reason:\" + result.getMsg());\n                throw exception;\n            }\n        }\n    }\n\n\n    private String doCreateTaskInClientMode(TaskCreateParam param) {\n        Map<String, Object> createInfoConf = (Map<String, Object>) param.getTaskProperties()\n                .get(TaskConstants.TASK_PROP_CREATE);\n        Boolean multiple = (Boolean) createInfoConf.get(TaskConstants.TASK_PROP_MULTIPLE);\n        if (Boolean.TRUE.equals(multiple)) {\n            List<Map<String, Object>> assignInfoConfList = (List<Map<String, Object>>) createInfoConf\n                    .get(TaskConstants.TASK_PROP_ASIGNEE_LIST);\n            for (Map<String, Object> assignInfoConf : assignInfoConfList) {\n                createTaskObject(param, assignInfoConf);\n            }\n            return null;\n        } else {\n            Map<String, Object> assignInfoConf = (Map<String, Object>) createInfoConf\n                    .get(TaskConstants.TASK_PROP_ASIGNEE);\n            ProcessTaskDTO processTask = createTaskObject(param, assignInfoConf);\n            return processTask.getTaskNo();\n        }\n    }\n\n\n    public ProcessTaskDTO createTaskObject(TaskCreateParam param, Map<String, Object> assignInfoConf) {\n        Map<String, Object> assignInfo = computeAssignee(assignInfoConf, param.getElFunction());\n        return createTaskObjectForAssignInfo(param, assignInfo);\n    }\n\n    public ProcessTaskDTO createTaskObjectForAssignInfo(TaskCreateParam param, Map<String, Object> assignInfo) {\n        ProcessCache cache = param.getProcessContext().getCache();\n        ProcessTaskDTO task = new ProcessTaskDTO();\n        String taskNo = objectIdManager.nextObjectId(ProcessTransactionConstants.TYPE_TASK);\n        task.setTaskNo(taskNo);\n        Date assignTime = new Date();\n        task.setAssignTime(assignTime);\n        task.setBizNo(param.getBizNo());\n        task.setProcessInstanceNo(param.getProcessContext().getInstanceNo());\n        task.setNodeInstanceNo(param.getNodeContext().getNodeInstanceNo());\n        task.setProcessType(param.getProcessType());\n        task.setProductCode(param.getProductCode());\n        task.setTaskType(TaskConstants.TASK_TYPE_MANUAL);\n        task.setStatus(ProcessTaskConstants.TASK_STATUS_PENDING);\n        task.setTaskBizCode(param.getTaskBizCode());\n        task.setTaskBizName(param.getTaskBizName());\n        task.setCreator(param.getUser());\n        task.setAssignInfo(JSON.toJSONString(assignInfo));\n        task.setCreatedDate(new Date());\n        \n        ProcessInstanceDTO processInstance = processRuntimeManager.getProcessInstance(param.getProcessContext());\n        task.setProcessInstanceKeyField(processInstance.getKeyField());\n        task.setProcessInstanceKeyField2(processInstance.getKeyField2());\n\n        processRuntimeManager.op(param.getProcessContext(), () -> {\n            cache.put(task.getTaskNo(), task, true);\n            return null;\n        });\n\n        List<String> userList = assignInfo == null ? null : (List<String>) assignInfo.get(\"user\");\n        List<Object> groupList = assignInfo == null ? null : (List<Object>) assignInfo.get(\"group\");\n        List<String> excludeUserList = assignInfo == null ? null : (List<String>) assignInfo.get(\"excludeUser\");        \n        if (userList != null && ! userList.isEmpty()) {\n            for (String assignUser : userList) {\n                if (excludeUserList != null && excludeUserList.contains(assignUser)) {\n                    log.info(assignUser + \" in excludeUserList\");\n                    continue;\n                }\n                ProcessTaskAssignDTO assign = new ProcessTaskAssignDTO();\n                String assignNo = objectIdManager.nextObjectId(ProcessTransactionConstants.TYPE_TASK_ASSIGN);\n                assign.setAssignNo(assignNo);\n                assign.setAssignTime(assignTime);\n                assign.setAssignType(ProcessTaskConstants.ASSIGN_TYPE_USER);\n                assign.setAssignUser(assignUser);\n                assign.setProductCode(param.getProductCode());\n                assign.setStatus(ProcessTaskConstants.TASK_STATUS_PENDING);\n                assign.setTaskNo(taskNo);\n                assign.setCreatedDate(new Date());\n                cache.put(assign.getAssignNo(), assign, true);\n            }\n        }\n\n        if (groupList != null && ! groupList.isEmpty()) {\n            for (Object group : groupList) {\n                ProcessTaskAssignDTO assign = new ProcessTaskAssignDTO();\n                String assignNo = objectIdManager.nextObjectId(ProcessTransactionConstants.TYPE_TASK_ASSIGN);\n                assign.setAssignNo(assignNo);\n                assign.setAssignTime(assignTime);\n                assign.setAssignType(ProcessTaskConstants.ASSIGN_TYPE_GROUP);\n                if (group instanceof String) {\n                    assign.setAssignGroup((String) group);\n                } else {\n                    Map<String, String> groupInfo = (Map<String, String>) group;\n                    assign.setAssignGroup(groupInfo.get(\"group\"));\n                    assign.setAssignGroup2(groupInfo.get(\"group2\"));\n                }\n                assign.setProductCode(param.getProductCode());\n                assign.setStatus(ProcessTaskConstants.TASK_STATUS_PENDING);\n                assign.setTaskNo(taskNo);\n                assign.setCreatedDate(new Date());\n                cache.put(assign.getAssignNo(), assign, true);\n            }\n        }\n\n        ProcessTaskEventDTO event = new ProcessTaskEventDTO();\n        event.setTaskNo(taskNo);\n        event.setEventNo(objectIdManager.nextObjectId(ProcessTransactionConstants.TYPE_TASK_EVENT));\n        event.setEventTime(assignTime);\n        event.setProductCode(param.getProductCode());\n        event.setEventType(ProcessTaskConstants.TASK_EVENT_CREATE);\n        event.setEventBizData(JSON.toJSONString(task));\n        event.setEventUser(param.getUser());\n        event.setCreatedDate(new Date());\n        cache.put(event.getEventNo(), event, true);\n        return task;\n    }\n\n    protected Map<String, Object> computeAssignee(Map<String, Object> assignInfoConf,\n            Function<String, Object> elFunction) {\n        if (assignInfoConf == null) {\n            log.info(\"assign info conf is null\");\n            return null;\n        }\n\n        Map<String, Object> assignInfo = new HashMap<>();\n        String userExp = (String) assignInfoConf.get(\"user\");\n        if (userExp != null) {\n            Object o = elFunction.apply(userExp);\n            List<String> userList = null;\n            if (o instanceof String) {\n                userList = Arrays.asList((String) o);\n            } else {\n                userList = (List<String>) o;\n            }\n            if (userList != null && ! userList.isEmpty()) {\n                assignInfo.put(\"user\", userList);\n            }\n        }\n\n        String groupExp = (String) assignInfoConf.get(\"group\");\n        if (groupExp != null) {\n            Object o = elFunction.apply(groupExp);\n            List<Object> groupList = null;\n            if (o instanceof String) {\n                groupList = Arrays.asList((String) o);\n            } else {\n                groupList = (List<Object>) o;\n            }\n            if (groupList != null && ! groupList.isEmpty()) {\n                assignInfo.put(\"group\", groupList);\n            }\n        }\n\n        String excludeUserExp = (String) assignInfoConf.get(\"excludeUser\");\n        if (excludeUserExp != null) {\n            Object o = elFunction.apply(excludeUserExp);\n            List<String> excludeUserList = null;\n            if (o instanceof String) {\n                excludeUserList = Arrays.asList((String) o);\n            } else {\n                excludeUserList = (List<String>) o;\n            }\n            if (excludeUserList != null && ! excludeUserList.isEmpty()) {\n                assignInfo.put(\"excludeUser\", excludeUserList);\n            }\n        }\n\n        return assignInfo;\n    }\n\n    public void executeTask(TaskExecuteParam param) {\n        invokeExecuteBizService(param);\n        doExecuteTaskInClientMode(param);\n\n    }\n\n    private void invokeExecuteBizService(TaskExecuteParam param) {\n        Map<String, Object> executeProperties = param.getTaskProperties() == null ? null\n                : ((Map<String, Object>) param.getTaskProperties().get(\"execute\"));\n        String bizService = executeProperties == null ? null\n                : (String) executeProperties.get(TaskConstants.TASK_PROP_BIZ_SERVICE);\n        if (bizService != null) {\n            String[] bizServiceInfo = bizService.split(\":\");\n            String providerId = bizServiceInfo.length == 1 ? null : bizServiceInfo[0];\n            String serviceId = bizServiceInfo.length == 1 ? bizServiceInfo[0] : bizServiceInfo[1];\n            TaskBizService taskBizService = ObjectFactorys.getDefault().getObject(TaskBizService.class, providerId,\n                    serviceId);\n            Map<String, Object> bizParam = (Map<String, Object>) executeProperties\n                    .get(TaskConstants.TASK_PROP_BIZ_SERVICE_PARAM);\n            TaskBizParam taskExecuteParam = new TaskBizParam();\n            taskExecuteParam.setProcessType(param.getProcessType());\n            taskExecuteParam.setBizNo(param.getBizNo());\n            taskExecuteParam.setTaskBizCode(param.getTaskBizCode());\n            taskExecuteParam.setProcessInstanceNo(param.getProcessContext().getInstanceNo());\n            taskExecuteParam.setInstanceBizData(param.getInstanceBizData());\n            taskExecuteParam.setInstanceBizStatus(param.getInstanceBizStatus());\n            taskExecuteParam.setEvent(TaskConstants.TASK_EVENT_EXECUTE);\n            taskExecuteParam.setBizServiceParam(bizParam);\n            taskExecuteParam.setOperation(param.getOperation());\n            TaskBizResult result = taskBizService.execute(taskExecuteParam);\n            if (result != null && result.getCode() != null) {\n                Map<String, Object> data = new HashMap<>();\n                data.put(\"bizResCode\", result.getCode());\n                data.put(\"bizResDesc\", result.getMsg());\n                ProcessException exception = new ProcessException(TaskErrorCode.PTC_0101.name(),\n                        TaskErrorCode.PTC_0101.getDesc());\n                exception.setData(data);\n                log.error(\"Task biz process return fail, fail code:\" + result.getCode() + \"; reason:\" + result.getMsg());\n                throw exception;\n            }\n        }\n    }\n\n    public void doExecuteTaskInClientMode(TaskExecuteParam param) {\n        String operationId = param.getOperation() == null ? OP_EXECUTE : param.getOperation();\n        TaskClientOperation<TaskExecuteParam, Object> operation = clientOperationMap.get(operationId);\n        operation.operate(param);\n    }\n\n    public List<ProcessTaskDTO> findTaskByNodeInstanceNo(String nodeInstanceNo, Map<String, Object> flowTaskPropertyes,\n            StdProcessContext context) {\n        return taskClientManager.findTaskByNodeInstanceNo(nodeInstanceNo, context);\n    }\n\n    private ProcessTransactionExport getProcessTransactionExport() {\n        if (processTransactionExport != null) {\n            return processTransactionExport;\n        }\n        processTransactionExport = ObjectFactorys.getDefault().getObject(ProcessTransactionExport.class);\n        return processTransactionExport;\n    }\n\n    private ProcessTaskExport getProcessTaskExport() {\n        if (processTaskExport == null) {\n            processTaskExport = ObjectFactorys.getDefault().getObject(ProcessTaskExport.class);\n        }\n        return processTaskExport;\n    }\n\n    public TaskClientManager getTaskClientManager() {\n        return taskClientManager;\n    }\n\n    public void setTaskClientManager(TaskClientManager taskClientManager) {\n        this.taskClientManager = taskClientManager;\n    }\n\n    public void setProcessTaskExport(ProcessTaskExport processTaskExport) {\n        this.processTaskExport = processTaskExport;\n    }\n\n    public void setProcessTransactionExport(ProcessTransactionExport processTransactionExport) {\n        this.processTransactionExport = processTransactionExport;\n    }\n\n    public ObjectIdManager getObjectIdManager() {\n        return objectIdManager;\n    }\n\n    public void setObjectIdManager(ObjectIdManager objectIdManager) {\n        this.objectIdManager = objectIdManager;\n    }\n\n    public ExportRequestBuilder getExportRequestBuilder() {\n        return exportRequestBuilder;\n    }\n\n    public void setExportRequestBuilder(ExportRequestBuilder exportRequestBuilder) {\n        this.exportRequestBuilder = exportRequestBuilder;\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/task/service/dto/TaskCreateParam.java",
    "content": "package com.jd.easyflow.process.client.task.service.dto;\n\nimport java.util.Map;\nimport java.util.function.Function;\n\nimport com.jd.easyflow.process.client.runtime.StdNodeContext;\nimport com.jd.easyflow.process.client.runtime.StdProcessContext;\n\n/**\n * @author liyuliang5\n *\n */\npublic class TaskCreateParam {\n    \n    private String user;\n\n    private String productCode;\n    \n    private String processType;\n    \n    private String bizNo;\n    \n    private String taskBizCode;\n    \n    private String taskBizName;\n    \n    private Map<String, Object> taskProperties;\n    \n    private Map<String, Object> flowTaskProperties;\n    \n    private StdProcessContext processContext; \n    \n    private StdNodeContext nodeContext;\n    \n    private Function<String, Object> elFunction;\n    \n    private String instanceBizStatus;\n    \n    private String instanceBizData;\n\n    public String getUser() {\n        return user;\n    }\n\n    public void setUser(String user) {\n        this.user = user;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n\n    public String getProcessType() {\n        return processType;\n    }\n\n    public void setProcessType(String processType) {\n        this.processType = processType;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    public String getTaskBizCode() {\n        return taskBizCode;\n    }\n\n    public void setTaskBizCode(String taskBizCode) {\n        this.taskBizCode = taskBizCode;\n    }\n\n    public String getTaskBizName() {\n        return taskBizName;\n    }\n\n    public void setTaskBizName(String taskBizName) {\n        this.taskBizName = taskBizName;\n    }\n\n    public Map<String, Object> getTaskProperties() {\n        return taskProperties;\n    }\n\n    public void setTaskProperties(Map<String, Object> taskProperties) {\n        this.taskProperties = taskProperties;\n    }\n\n    public Map<String, Object> getFlowTaskProperties() {\n        return flowTaskProperties;\n    }\n\n    public void setFlowTaskProperties(Map<String, Object> flowTaskProperties) {\n        this.flowTaskProperties = flowTaskProperties;\n    }\n\n    public StdProcessContext getProcessContext() {\n        return processContext;\n    }\n\n    public void setProcessContext(StdProcessContext processContext) {\n        this.processContext = processContext;\n    }\n\n    public StdNodeContext getNodeContext() {\n        return nodeContext;\n    }\n\n    public void setNodeContext(StdNodeContext nodeContext) {\n        this.nodeContext = nodeContext;\n    }\n\n    public Function<String, Object> getElFunction() {\n        return elFunction;\n    }\n\n    public void setElFunction(Function<String, Object> elFunction) {\n        this.elFunction = elFunction;\n    }\n\n    public String getInstanceBizStatus() {\n        return instanceBizStatus;\n    }\n\n    public void setInstanceBizStatus(String instanceBizStatus) {\n        this.instanceBizStatus = instanceBizStatus;\n    }\n\n    public String getInstanceBizData() {\n        return instanceBizData;\n    }\n\n    public void setInstanceBizData(String instanceBizData) {\n        this.instanceBizData = instanceBizData;\n    }\n\n    @Override\n    public String toString() {\n        return \"TaskCreateParam [user=\" + user + \", productCode=\" + productCode + \", processType=\" + processType\n                + \", bizNo=\" + bizNo + \", taskBizCode=\" + taskBizCode + \", taskBizName=\" + taskBizName\n                + \", taskProperties=\" + taskProperties + \", flowTaskProperties=\" + flowTaskProperties\n                + \", processContext=\" + processContext + \", nodeContext=\" + nodeContext + \", elFunction=\" + elFunction\n                + \", instanceBizStatus=\" + instanceBizStatus + \", instanceBizData=\" + instanceBizData + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/task/service/dto/TaskExecuteParam.java",
    "content": "package com.jd.easyflow.process.client.task.service.dto;\n\nimport java.util.List;\nimport java.util.Map;\n\nimport com.jd.easyflow.process.client.runtime.StdNodeContext;\nimport com.jd.easyflow.process.client.runtime.StdProcessContext;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class TaskExecuteParam {\n\n    private String user;\n\n    private String taskNo;\n\n    private String executeBizResult;\n\n    private String executeBizData;\n\n    private String instanceBizStatus;\n    \n    private String instanceBizData;\n\n    private List<String> groupList;\n    private List<String> group2List;\n    private String cmdListStr;\n    private StdProcessContext processContext;\n    private StdNodeContext nodeContext;\n    \n    private Map<String, Object> flowTaskProperties;\n    \n    private Map<String, Object> taskProperties;\n    \n    private String taskBizCode;\n    \n    private String bizNo;\n    \n    private String processType;\n    \n    private String operation;\n    \n    private String taskExtData;\n\n    public String getUser() {\n        return user;\n    }\n\n    public void setUser(String user) {\n        this.user = user;\n    }\n\n    public String getTaskNo() {\n        return taskNo;\n    }\n\n    public void setTaskNo(String taskNo) {\n        this.taskNo = taskNo;\n    }\n\n    public String getExecuteBizResult() {\n        return executeBizResult;\n    }\n\n    public void setExecuteBizResult(String executeBizResult) {\n        this.executeBizResult = executeBizResult;\n    }\n\n    public String getExecuteBizData() {\n        return executeBizData;\n    }\n\n    public void setExecuteBizData(String executeBizData) {\n        this.executeBizData = executeBizData;\n    }\n\n    public String getInstanceBizStatus() {\n        return instanceBizStatus;\n    }\n\n    public void setInstanceBizStatus(String instanceBizStatus) {\n        this.instanceBizStatus = instanceBizStatus;\n    }\n\n    public String getInstanceBizData() {\n        return instanceBizData;\n    }\n\n    public void setInstanceBizData(String instanceBizData) {\n        this.instanceBizData = instanceBizData;\n    }\n\n    public List<String> getGroupList() {\n        return groupList;\n    }\n\n    public void setGroupList(List<String> groupList) {\n        this.groupList = groupList;\n    }\n\n    public List<String> getGroup2List() {\n        return group2List;\n    }\n\n    public void setGroup2List(List<String> group2List) {\n        this.group2List = group2List;\n    }\n\n    public String getCmdListStr() {\n        return cmdListStr;\n    }\n\n    public void setCmdListStr(String cmdListStr) {\n        this.cmdListStr = cmdListStr;\n    }\n\n    public StdProcessContext getProcessContext() {\n        return processContext;\n    }\n\n    public void setProcessContext(StdProcessContext processContext) {\n        this.processContext = processContext;\n    }\n\n    public StdNodeContext getNodeContext() {\n        return nodeContext;\n    }\n\n    public void setNodeContext(StdNodeContext nodeContext) {\n        this.nodeContext = nodeContext;\n    }\n\n    public Map<String, Object> getFlowTaskProperties() {\n        return flowTaskProperties;\n    }\n\n    public void setFlowTaskProperties(Map<String, Object> flowTaskProperties) {\n        this.flowTaskProperties = flowTaskProperties;\n    }\n\n    public Map<String, Object> getTaskProperties() {\n        return taskProperties;\n    }\n\n    public void setTaskProperties(Map<String, Object> taskProperties) {\n        this.taskProperties = taskProperties;\n    }\n\n    public String getTaskBizCode() {\n        return taskBizCode;\n    }\n\n    public void setTaskBizCode(String taskBizCode) {\n        this.taskBizCode = taskBizCode;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    public String getProcessType() {\n        return processType;\n    }\n\n    public void setProcessType(String processType) {\n        this.processType = processType;\n    }\n\n    public String getOperation() {\n        return operation;\n    }\n\n    public void setOperation(String operation) {\n        this.operation = operation;\n    }\n\n    public String getTaskExtData() {\n        return taskExtData;\n    }\n\n    public void setTaskExtData(String taskExtData) {\n        this.taskExtData = taskExtData;\n    }\n\n    @Override\n    public String toString() {\n        return \"TaskExecuteParam [user=\" + user + \", taskNo=\" + taskNo + \", executeBizResult=\" + executeBizResult\n                + \", executeBizData=\" + executeBizData + \", instanceBizStatus=\" + instanceBizStatus\n                + \", instanceBizData=\" + instanceBizData + \", groupList=\" + groupList + \", group2List=\" + group2List\n                + \", cmdListStr=\" + cmdListStr + \", processContext=\" + processContext + \", nodeContext=\" + nodeContext\n                + \", flowTaskProperties=\" + flowTaskProperties + \", taskProperties=\" + taskProperties + \", taskBizCode=\"\n                + taskBizCode + \", bizNo=\" + bizNo + \", processType=\" + processType + \", operation=\" + operation\n                + \", taskExtData=\" + taskExtData + \"]\";\n    }\n    \n    \n\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/task/service/operation/BaseTaskOperation.java",
    "content": "package com.jd.easyflow.process.client.task.service.operation;\n\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Objects;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.common.exception.EasyFlowException;\nimport com.jd.easyflow.objects.factory.ObjectFactorys;\nimport com.jd.easyflow.process.adapter.export.ProcessTransactionExport;\nimport com.jd.easyflow.process.adapter.export.constant.ProcessTaskConstants;\nimport com.jd.easyflow.process.adapter.export.constant.ProcessTransactionConstants;\nimport com.jd.easyflow.process.adapter.export.dto.task.ProcessTaskAssignDTO;\nimport com.jd.easyflow.process.adapter.export.dto.task.ProcessTaskDTO;\nimport com.jd.easyflow.process.adapter.export.dto.task.ProcessTaskEventDTO;\nimport com.jd.easyflow.process.client.runtime.ObjectIdManager;\nimport com.jd.easyflow.process.client.runtime.ProcessCache;\nimport com.jd.easyflow.process.client.task.TaskConstants;\nimport com.jd.easyflow.process.client.task.service.TaskClientManager;\nimport com.jd.easyflow.process.client.task.service.TaskClientOperation;\nimport com.jd.easyflow.process.client.task.service.dto.TaskCreateParam;\nimport com.jd.easyflow.process.client.task.service.dto.TaskExecuteParam;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic abstract class BaseTaskOperation<P, R> implements TaskClientOperation<P, R> {\n    \n    private static final Logger log = LoggerFactory.getLogger(BaseTaskOperation.class);\n\n\n    protected TaskClientManager taskClientManager;\n\n    private ProcessTransactionExport processTransactionExport;\n\n    private ObjectIdManager objectIdManager = ObjectIdManager.INSTANCE;\n\n\n    protected ProcessTaskDTO createTaskObjectForAssignInfo(TaskCreateParam param, Map<String, Object> assignInfo) {\n        ProcessCache cache = param.getProcessContext().getCache();\n        ProcessTaskDTO task = new ProcessTaskDTO();\n        String taskNo = objectIdManager.nextObjectId(ProcessTransactionConstants.TYPE_TASK);\n        task.setTaskNo(taskNo);\n        Date assignTime = new Date();\n        task.setAssignTime(assignTime);\n        task.setBizNo(param.getBizNo());\n        task.setNodeInstanceNo(task.getNodeInstanceNo());\n        task.setProcessInstanceNo(param.getProcessContext().getInstanceNo());\n        task.setNodeInstanceNo(param.getNodeContext().getNodeInstanceNo());\n        task.setProcessType(param.getProcessType());\n        task.setProductCode(param.getProductCode());\n        task.setTaskType(TaskConstants.TASK_TYPE_MANUAL);\n        task.setStatus(ProcessTaskConstants.TASK_STATUS_PENDING);\n        task.setTaskBizCode(param.getTaskBizCode());\n        task.setTaskBizName(param.getTaskBizName());\n        task.setCreator(param.getUser());\n        task.setAssignInfo(JSON.toJSONString(assignInfo));\n        task.setCreatedDate(new Date());\n        taskClientManager.getProcessRuntimeManager().op(param.getProcessContext(), () -> { \n            cache.put(task.getTaskNo(), task, true);\n        return null;\n        });\n        \n\n        List<String> userList = assignInfo == null ? null : (List<String>) assignInfo.get(\"user\");\n        List<Object> groupList = assignInfo == null ? null : (List<Object>) assignInfo.get(\"group\");\n        List<String> excludeUserList = assignInfo == null ? null : (List<String>) assignInfo.get(\"excludeUser\");\n        if (userList != null && ! userList.isEmpty()) {\n            for (String assignUser : userList) {\n                if (excludeUserList != null && excludeUserList.contains(assignUser)) {\n                    log.info(assignUser + \" in exclude user list\");\n                    continue;\n                }\n                ProcessTaskAssignDTO assign = new ProcessTaskAssignDTO();\n                String assignNo = objectIdManager.nextObjectId(ProcessTransactionConstants.TYPE_TASK_ASSIGN);\n                assign.setAssignNo(assignNo);\n                assign.setAssignTime(assignTime);\n                assign.setAssignType(ProcessTaskConstants.ASSIGN_TYPE_USER);\n                assign.setAssignUser(assignUser);\n                assign.setProductCode(param.getProductCode());\n                assign.setStatus(ProcessTaskConstants.TASK_STATUS_PENDING);\n                assign.setTaskNo(taskNo);\n                assign.setCreatedDate(new Date());\n                cache.put(assign.getAssignNo(), assign, true);\n            }\n        }\n\n        if (groupList != null && ! groupList.isEmpty()) {\n            for (Object group : groupList) {\n                ProcessTaskAssignDTO assign = new ProcessTaskAssignDTO();\n                String assignNo = objectIdManager.nextObjectId(ProcessTransactionConstants.TYPE_TASK_ASSIGN);\n                assign.setAssignNo(assignNo);\n                assign.setAssignTime(assignTime);\n                assign.setAssignType(ProcessTaskConstants.ASSIGN_TYPE_GROUP);\n                if (group instanceof String) {\n                    assign.setAssignGroup((String) group);\n                } else {\n                    Map<String, String> groupInfo = (Map<String, String>) group;\n                    assign.setAssignGroup(groupInfo.get(\"group\"));\n                    assign.setAssignGroup2(groupInfo.get(\"group2\"));\n                }\n                assign.setProductCode(param.getProductCode());\n                assign.setStatus(ProcessTaskConstants.TASK_STATUS_PENDING);\n                assign.setTaskNo(taskNo);\n                assign.setCreatedDate(new Date());\n                cache.put(assign.getAssignNo(), assign, true);\n            }\n        }\n\n        ProcessTaskEventDTO event = new ProcessTaskEventDTO();\n        event.setTaskNo(taskNo);\n        event.setEventNo(objectIdManager.nextObjectId(ProcessTransactionConstants.TYPE_TASK_EVENT));\n        event.setEventTime(assignTime);\n        event.setProductCode(param.getProductCode());\n        event.setEventType(ProcessTaskConstants.TASK_EVENT_CREATE);\n        event.setEventBizData(JSON.toJSONString(task));\n        event.setEventUser(param.getUser());\n        event.setCreatedDate(new Date());\n        cache.put(event.getEventNo(), event, true);\n        return task;\n    }\n\n    protected void validateTaskExecuteAuth(TaskExecuteParam param, ProcessTaskDTO task) {\n        String executor = param.getUser();\n        List<ProcessTaskAssignDTO> assignList = taskClientManager.findTaskAssignListByTaskNo(param.getTaskNo(),\n                param.getProcessContext());\n        boolean pass = false;\n        for (ProcessTaskAssignDTO assign : assignList) {\n            if (ProcessTaskConstants.ASSIGN_TYPE_USER.equals(assign.getAssignType())) {\n                if (Objects.equals(assign.getAssignUser(), executor)) {\n                    pass = true;\n                    break;\n                }\n            } else {\n                if ((assign.getAssignGroup() == null\n                        || param.getGroupList() != null && param.getGroupList().contains(assign.getAssignGroup()))\n                        && ((assign.getAssignGroup2() == null || param.getGroup2List() != null\n                                && param.getGroup2List().contains(assign.getAssignGroup2())))) {\n                    pass = true;\n                    break;\n                }\n            }\n        }\n        String assignInfo = task.getAssignInfo();\n        Map<String, Object> assignInfoMap = JSON.parseObject(assignInfo, Map.class);\n        List<String> excludeUser = (List<String>) assignInfoMap.get(\"excludeUser\");\n        if (excludeUser != null && excludeUser.contains(executor)) {\n            log.warn(\"use {} in excludeUser\", executor);\n            pass = false;\n        }\n\n        if (!pass) {\n            throw new EasyFlowException(\"Auth validate fail\");\n        }\n\n    }\n\n    protected void createTaskExecuteEvent(TaskExecuteParam param, ProcessTaskDTO task) {\n        ProcessCache cache = param.getProcessContext().getCache();\n        ProcessTaskEventDTO event = new ProcessTaskEventDTO();\n        event.setTaskNo(param.getTaskNo());\n        event.setEventNo(objectIdManager.nextObjectId(ProcessTransactionConstants.TYPE_TASK_EVENT));\n        event.setEventTime(new Date());\n        event.setEventUser(param.getUser());\n        event.setEventType(ProcessTaskConstants.TASK_EVENT_EXECUTE);\n        event.setProductCode(task.getProductCode());\n        event.setEventBizResult(param.getExecuteBizResult());\n        Map<String, Object> bizData = new HashMap<>();\n        bizData.put(\"executor\", param.getUser());\n        bizData.put(\"groupList\", param.getGroupList());\n        bizData.put(\"group2List\", param.getGroup2List());\n        bizData.put(\"executeBizResult\", param.getExecuteBizResult());\n        bizData.put(\"executeBizData\", param.getExecuteBizData());\n        bizData.put(\"newTaskExtData\", task.getExtData());\n        bizData.put(\"taskExtData\", param.getTaskExtData());\n        bizData.put(\"instanceBizStatus\", param.getInstanceBizStatus());\n        bizData.put(\"instanceBizData\", param.getInstanceBizData());\n        bizData.put(\"cmdListStr\", param.getCmdListStr());\n        bizData.put(\"operation\", param.getOperation());\n        event.setEventBizData(JSON.toJSONString(bizData));\n        event.setInstanceBizStatus(param.getInstanceBizStatus());\n        event.setInstanceBizData(param.getInstanceBizData());\n        event.setCreatedDate(new Date());\n        taskClientManager.getProcessRuntimeManager().op(param.getProcessContext(), () -> { \n        cache.put(event.getEventNo(), event, true);\n        return null;\n        });\n    }\n\n    protected ProcessTransactionExport getProcessTransactionExport() {\n        if (processTransactionExport != null) {\n            return processTransactionExport;\n        }\n        processTransactionExport = ObjectFactorys.getDefault().getObject(ProcessTransactionExport.class);\n        return processTransactionExport;\n    }\n\n    public TaskClientManager getTaskClientManager() {\n        return taskClientManager;\n    }\n\n    public void setTaskClientManager(TaskClientManager taskClientManager) {\n        this.taskClientManager = taskClientManager;\n    }\n\n    public ObjectIdManager getObjectIdManager() {\n        return objectIdManager;\n    }\n\n    public void setObjectIdManager(ObjectIdManager objectIdManager) {\n        this.objectIdManager = objectIdManager;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/task/service/operation/ExecuteTaskOperation.java",
    "content": "package com.jd.easyflow.process.client.task.service.operation;\n\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.common.exception.EasyFlowException;\nimport com.jd.easyflow.process.adapter.export.constant.ProcessTaskConstants;\nimport com.jd.easyflow.process.adapter.export.dto.task.ProcessTaskDTO;\nimport com.jd.easyflow.process.adapter.export.dto.task.cmd.TaskCreateCmd;\nimport com.jd.easyflow.process.client.runtime.ProcessCache;\nimport com.jd.easyflow.process.client.task.service.dto.TaskCreateParam;\nimport com.jd.easyflow.process.client.task.service.dto.TaskExecuteParam;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ExecuteTaskOperation extends BaseTaskOperation<TaskExecuteParam, Object> {\n    \n    private static final Logger log = LoggerFactory.getLogger(ExecuteTaskOperation.class);\n\n    \n    @Override\n    public Object operate(TaskExecuteParam param) {\n        ProcessCache cache = param.getProcessContext().getCache();\n        Date eventTime = new Date();\n        ProcessTaskDTO task = taskClientManager.getTask(param.getTaskNo(), param.getProcessContext());\n        if (!ProcessTaskConstants.TASK_STATUS_PENDING.equals(task.getStatus())) {\n            throw new EasyFlowException(\"Task \" + param.getTaskNo() + \" not PENDING status\");\n        }\n        validateTaskExecuteAuth(param, task);\n        String executor = param.getUser();\n        task.setExecutor(executor);\n        task.setExecuteTime(eventTime);\n        task.setExecuteBizResult(param.getExecuteBizResult());\n        task.setExecuteBizData(param.getExecuteBizData());\n        task.setStatus(ProcessTaskConstants.TASK_STATUS_FINISH);\n        if (param.getTaskExtData() != null) {\n            String originalTaskExtData = task.getExtData();\n            Map<String, Object> currentTaskExtData = JSON.parseObject(originalTaskExtData, Map.class);\n            Map<String, Object> taskExtData = JSON.parseObject(param.getTaskExtData(), Map.class);\n            if (currentTaskExtData == null) {\n                currentTaskExtData = new HashMap<>();\n            }\n            currentTaskExtData.putAll(taskExtData);\n            task.setExtData(JSON.toJSONString(currentTaskExtData));\n        }\n        taskClientManager.getProcessRuntimeManager().op(param.getProcessContext(), () -> { \n            cache.put(task.getTaskNo(), task, true);\n        return null;\n        });\n        \n        createTaskExecuteEvent(param, task);\n\n        List<Map<String, Object>> cmdMapList = JSON.parseObject(param.getCmdListStr(), List.class);\n\n        if (cmdMapList != null) {\n            for (Map<String, Object> cmdMap : cmdMapList) {\n                String cmdType = (String) cmdMap.get(\"cmdType\");\n                if (ProcessTaskConstants.CMD_TYPE_CREATE_TASK.equals(cmdType)) {\n                    TaskCreateCmd createCmd = JSON.parseObject(cmdMap, TaskCreateCmd.class);\n                    Map<String, Object> createAssignInfo = createCmd.getAssignInfo();\n                    TaskCreateParam createParam = new TaskCreateParam();\n                    createParam.setBizNo(task.getBizNo());\n                    createParam.setProcessContext(param.getProcessContext());\n                    createParam.setProcessType(task.getProcessType());\n                    createParam.setProductCode(task.getProductCode());\n                    createParam.setTaskBizCode(task.getTaskBizCode());\n                    createParam.setTaskBizName(task.getTaskBizName());\n                    createParam.setUser(param.getUser());\n                    createParam.setProcessContext(param.getProcessContext());\n                    createParam.setNodeContext(param.getNodeContext());\n                    createTaskObjectForAssignInfo(createParam, createAssignInfo);\n                } else {\n                    throw new UnsupportedOperationException(\"Unsupported operation type:\" + cmdType);\n                }\n            }\n        }\n        return null;\n    }\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/task/service/operation/SaveTaskOperation.java",
    "content": "package com.jd.easyflow.process.client.task.service.operation;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport com.jd.easyflow.common.exception.EasyFlowException;\nimport com.jd.easyflow.process.adapter.export.constant.ProcessTaskConstants;\nimport com.jd.easyflow.process.adapter.export.dto.task.ProcessTaskDTO;\nimport com.jd.easyflow.process.client.runtime.ProcessCache;\nimport com.jd.easyflow.process.client.task.service.dto.TaskExecuteParam;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class SaveTaskOperation extends BaseTaskOperation<TaskExecuteParam, Object> {\n\n    @Override\n    public Object operate(TaskExecuteParam param) {\n        ProcessCache cache = param.getProcessContext().getCache();\n        ProcessTaskDTO task = taskClientManager.getTask(param.getTaskNo(), param.getProcessContext());\n\n        if (!ProcessTaskConstants.TASK_STATUS_PENDING.equals(task.getStatus())) {\n            throw new EasyFlowException(\"Task \" + param.getTaskNo() + \" not PENDING status\");\n        }\n\n        validateTaskExecuteAuth(param, task);\n\n        task.setExecuteBizResult(param.getExecuteBizResult());\n        task.setExecuteBizData(param.getExecuteBizData());\n        if (param.getTaskExtData() != null) {\n            String originalTaskExtData = task.getExtData();\n            Map<String, Object> currentTaskExtData = JSON.parseObject(originalTaskExtData, Map.class);\n            Map<String, Object> taskExtData = JSON.parseObject(param.getTaskExtData(), Map.class);\n            if (currentTaskExtData == null) {\n                currentTaskExtData = new HashMap<>();\n            }\n            currentTaskExtData.putAll(taskExtData);\n            task.setExtData(JSON.toJSONString(currentTaskExtData));\n        }\n\n        taskClientManager.getProcessRuntimeManager().op(param.getProcessContext(), () -> {\n            cache.put(task.getTaskNo(), task, true);\n            return null;\n        });\n        createTaskExecuteEvent(param, task);\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/task/util/TaskEl.java",
    "content": "package com.jd.easyflow.process.client.task.util;\n\nimport java.util.Map;\n\nimport com.jd.easyflow.flow.engine.FlowParam;\nimport com.jd.easyflow.process.client.task.TaskConstants;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class TaskEl {\n\n    /**\n     * \n     * @param param\n     * @param key\n     * @return\n     */\n    public static Object bizData(FlowParam param, String key) {\n        String executeData = param.getParam(TaskConstants.PARAM_TASK_EXECUTE_DATA);\n        Map<String, Object> map = JSON.parseObject(executeData, Map.class);\n        if (map == null) {\n            return null;\n        }\n        return map.get(key);\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/util/ElUtil.java",
    "content": "package com.jd.easyflow.process.client.util;\n\nimport java.util.Map;\n\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ElUtil {\n\n    /**\n     * @param json\n     * @return\n     */\n    public static Object json2Map(String json) {\n        return JSON.parseObject(json, Map.class);\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/util/ExportRequestBuilder.java",
    "content": "package com.jd.easyflow.process.client.util;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.process.adapter.export.constant.ShardingConstants;\nimport com.jd.easyflow.process.client.runtime.StdProcessContext;\n\n/**\n * @author liyuliang5\n */\npublic class ExportRequestBuilder {\n\n    private static ExportRequestBuilder instance = new ExportRequestBuilder();\n    \n    private boolean shardingEnabled = false;\n    \n    public static ExportRequestBuilder getInstance() {\n        return instance;\n    }\n    \n    public static void setInstance(ExportRequestBuilder instance) {\n        ExportRequestBuilder.instance = instance;\n    }\n\n    public <T> ExportRequest<T> build(T data, StdProcessContext processContext) {\n        ExportRequest<T> request = new ExportRequest<T>(data);\n        if (shardingEnabled) {\n            if (processContext != null) {\n                Map<String, Object> ext = new HashMap<>();\n                if (processContext.getProcessType() != null) {\n                    ext.put(ShardingConstants.EXPORT_REQUEST_EXT_KEY_PROCESS_TYPE, processContext.getProcessType());\n                    ext.put(ShardingConstants.EXPORT_REQUEST_EXT_KEY_BIZ_NO, processContext.getBizNo());\n                }\n                request.setExt(ext);\n            }\n        }\n        return request;\n    }\n\n    public boolean isShardingEnabled() {\n        return shardingEnabled;\n    }\n\n    public void setShardingEnabled(boolean shardingEnabled) {\n        this.shardingEnabled = shardingEnabled;\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/util/Pair.java",
    "content": "package com.jd.easyflow.process.client.util;\n\n/**\n * \n * @author liyuliang5\n */\npublic class Pair<L, R> {\n\n    private L left;\n\n    private R right;\n\n    private Pair(L left, R right) {\n        this.left = left;\n        this.right = right;\n    }\n\n    public static <L, R> Pair<L, R> of(L left, R right) {\n        return new Pair<L, R>(left, right);\n    }\n\n    public L getLeft() {\n        return left;\n    }\n\n    public void setLeft(L left) {\n        this.left = left;\n    }\n\n    public R getRight() {\n        return right;\n    }\n\n    public void setRight(R right) {\n        this.right = right;\n    }\n\n    @Override\n    public String toString() {\n        return \"Pair [left=\" + left + \", right=\" + right + \"]\";\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/util/ProcessConstants.java",
    "content": "package com.jd.easyflow.process.client.util;\n\n/**\n * \n * @author liyuliang5\n */\npublic class ProcessConstants {\n\n    \n    public static final String NS_SEP = \":\";\n    \n    public static final String NS_EASYFLOW = \"easyflow\";\n    \n    public static final String EASYFLOW_NS_PREFIX = NS_EASYFLOW + NS_SEP;\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/util/ProcessUtil.java",
    "content": "package com.jd.easyflow.process.client.util;\n\n/**\n * \n * @author liyuliang5\n */\npublic class ProcessUtil {\n\n    public static String nsKey(String key) {\n        return ProcessConstants.NS_SEP + key;\n    }\n    \n    public static String nsKey(String ns, String key) {\n        return ns + ProcessConstants.NS_SEP + key;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/process/client/util/StdProcessUtil.java",
    "content": "package com.jd.easyflow.process.client.util;\n\nimport java.util.Map;\n\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessNodeInstanceDTO;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n * @author liyuliang5\n */\npublic class StdProcessUtil {\n\n    public static String getNodeInstanceVar(String key, ProcessNodeInstanceDTO processNodeInstance) {\n        String varsString = processNodeInstance.getVars();\n        if (varsString == null) {\n            return null;\n        }\n        Map<String, String> vars = JSON.parseObject(varsString, Map.class);\n        return vars.get(key);\n     }\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/processunit/client/ProcessUnitClient.java",
    "content": "package com.jd.easyflow.processunit.client;\n\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.UUID;\nimport java.util.function.Function;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.transaction.support.TransactionSynchronization;\nimport org.springframework.transaction.support.TransactionSynchronizationManager;\n\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponse;\nimport com.jd.easyflow.common.adapter.export.util.ExportResponseUtil;\nimport com.jd.easyflow.common.util.UUIDUtil;\nimport com.jd.easyflow.message.MessageSendService;\nimport com.jd.easyflow.net.NetUtils;\nimport com.jd.easyflow.objects.factory.ObjectFactorys;\nimport com.jd.easyflow.processunit.adapter.export.ProcessUnitExport;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitCreateReq;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitCreateRes;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitExecuteReq;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitExecuteRes;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitUpdateReq;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitUpdateRes;\nimport com.jd.easyflow.processunit.client.bean.ExecContext;\nimport com.jd.easyflow.processunit.client.bean.ExecParam;\nimport com.jd.easyflow.processunit.client.bean.ExecResult;\nimport com.jd.easyflow.processunit.client.bean.ProcessUnitCreateAndExecuteReq;\nimport com.jd.easyflow.processunit.client.bean.ProcessUnitCreateAndExecuteRes;\nimport com.jd.easyflow.processunit.client.service.impl.SyncClientProcessUnitExecutor;\nimport com.jd.easyflow.processunit.client.util.ProcessUnitConstants;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n * \n * @author liyuliang5\n */\npublic class ProcessUnitClient {\n    \n    private static final Logger log = LoggerFactory.getLogger(ProcessUnitClient.class);\n\n\n    private SyncClientProcessUnitExecutor executor;\n\n    private ProcessUnitExport processUnitExport;\n    \n    private MessageSendService messageSendService;\n    \n    private String createMessageTopic;\n    \n    private String executeMessageTopic;\n    \n    public <T> T call(String unitCode, String requestContent, Function<ExecContext, T> invoker) {\n        String bizNo = UUIDUtil.getSimpleUUID();\n        String requestNo = UUIDUtil.getSimpleUUID();\n        return call(unitCode, bizNo, requestNo, requestContent, invoker, ctx -> {\n            if (!ctx.isExecuted()) {\n                return ProcessUnitConstants.RESULT_EXCEPTION;\n            }\n            if (ctx.getResult().getExecException() != null) {\n                return ProcessUnitConstants.RESULT_EXCEPTION;\n            }\n            return ProcessUnitConstants.RESULT_SUCCESS;\n        }, ctx -> {\n            return JSON.toJSONString(ctx.getResult().getExecResult());\n        }, ctx -> {\n            return null;\n        });\n    }\n\n    public <T> T call(String unitCode, String bizNo, String requestContent, Function<ExecContext, T> invoker) {\n        String requestNo = UUIDUtil.getSimpleUUID();\n        return call(unitCode, bizNo, requestNo, requestContent, invoker, ctx -> {\n            if (!ctx.isExecuted()) {\n                return ProcessUnitConstants.RESULT_EXCEPTION;\n            }\n            if (ctx.getResult().getExecException() != null) {\n                return ProcessUnitConstants.RESULT_EXCEPTION;\n            }\n            return ProcessUnitConstants.RESULT_SUCCESS;\n        }, ctx -> {\n            return JSON.toJSONString(ctx.getResult().getExecResult());\n        }, ctx -> {\n            return null;\n        });\n    }\n\n    public <T> T call(String unitCode, String bizNo, String requestContent, Function<ExecContext, T> invoker,\n            Function<ExecContext, String> resultFunction) {\n        String requestNo = UUIDUtil.getSimpleUUID();\n        return call(unitCode, bizNo, requestNo, requestContent, invoker, resultFunction, ctx -> {\n            return JSON.toJSONString(ctx.getResult().getExecResult());\n        }, ctx -> {\n            return null;\n        });\n    }\n\n    public <T> T call(String unitCode, String bizNo, String requestContent, String productCode,  Function<ExecContext, T> invoker,\n                      Function<ExecContext, String> resultFunction) {\n        String requestNo = UUIDUtil.getSimpleUUID();\n        return call(unitCode, bizNo, requestNo, requestContent, productCode, invoker, resultFunction, ctx -> {\n            return JSON.toJSONString(ctx.getResult().getExecResult());\n        }, ctx -> {\n            return null;\n        });\n    }\n\n    public <T> T call(String unitCode, String bizNo, String requestNo, String requestContent,\n            Function<ExecContext, T> invoker, Function<ExecContext, String> resultFunction,\n            Function<ExecContext, String> responseContentFunction, Function<ExecContext, ?> oldResultFunction) {\n        return call(unitCode, bizNo, requestNo, requestContent, null, invoker, resultFunction, responseContentFunction, oldResultFunction);\n    }\n    \n    public <T> T call(String unitCode, String bizNo, String requestNo, String requestContent, String productCode,\n            Function<ExecContext, T> invoker, Function<ExecContext, String> resultFunction,\n            Function<ExecContext, String> responseContentFunction, Function<ExecContext, ?> oldResultFunction) {\n        return call(unitCode, bizNo, requestNo, requestContent, productCode, null, invoker, resultFunction, responseContentFunction, oldResultFunction);\n    }\n    \n    public <T> T call(String unitCode, String bizNo, String requestNo, String requestContent, String productCode, String parentNo,\n            Function<ExecContext, T> invoker, Function<ExecContext, String> resultFunction,\n            Function<ExecContext, String> responseContentFunction, Function<ExecContext, ?> oldResultFunction) {\n        ExecParam param = new ExecParam();\n        param.setUnitCode(unitCode);\n        param.setBizNo(bizNo);\n        param.setRequestNo(requestNo);\n        param.setRequestContent(requestContent);\n        param.setProductCode(productCode);\n        param.setInvoker(invoker);\n        param.setResultFunction(resultFunction);\n        param.setResponseContentFunction(responseContentFunction);\n        param.setOldResultFunction(oldResultFunction);\n        param.setParentNo(parentNo);\n        ExecResult result = executor.execute(param);\n        return (T) result.getExecResult();\n    }\n    \n    public ExecResult call(ExecParam param) {\n        return executor.execute(param);\n    }\n\n    public SyncClientProcessUnitExecutor getExecutor() {\n        return executor;\n    }\n\n    public void setExecutor(SyncClientProcessUnitExecutor executor) {\n        this.executor = executor;\n    }\n\n    public ProcessUnitCreateRes create(String unitCode, String bizNo) {\n        return create(unitCode, bizNo, UUIDUtil.getSimpleUUID(), null, null);\n    }\n\n    public ProcessUnitCreateRes create(String unitCode, String bizNo,\n            String requestContent) {\n        return create(unitCode, bizNo, UUIDUtil.getSimpleUUID(), requestContent, null);\n    }\n    \n    \n    public ProcessUnitCreateRes create(String unitCode, String bizNo,\n            String requestNo, String requestContent) {\n        return this.create(unitCode, bizNo, requestNo, requestContent, null);\n    }\n    \n    public ProcessUnitCreateRes create(String unitCode, String bizNo,\n            String requestNo, String requestContent, String productCode) {\n        return create(unitCode, bizNo, requestNo, requestContent, productCode, null);\n    }\n\n    public ProcessUnitCreateRes create(String unitCode, String bizNo,\n            String requestNo, String requestContent, String productCode, String parentNo) {\n        ProcessUnitCreateReq req = new ProcessUnitCreateReq();\n        req.setUnitCode(unitCode);\n        req.setBizNo(bizNo);\n        req.setRequestNo(requestNo);\n        req.setRequestContent(requestContent);\n        req.setParentNo(parentNo);\n        req.setProductCode(productCode);\n        return create(req);\n    }\n    \n    public ProcessUnitCreateRes create(ProcessUnitCreateReq req) {\n        if (req.getClientInfo() == null) {\n            Map<String, String> clientInfo = new HashMap<String, String>();\n            clientInfo.put(\"ip\", NetUtils.getSysIp());\n            req.setClientInfo(clientInfo);\n        }        \n        log.info(\"Create process unit request, {}\", req);\n        ExportResponse<ProcessUnitCreateRes> response = getProcessUnitExport().create(new ExportRequest(req));\n        log.info(\"Create process unit response:{}\", response);\n        ProcessUnitCreateRes res = ExportResponseUtil.unwrap(response);\n        return res;\n    }\n    \n    public void sendCreateMessage(String unitCode, String bizNo, String requestContent) {\n        sendCreateMessage(unitCode, bizNo, UUIDUtil.getSimpleUUID(), requestContent);\n    }\n    \n    public void sendCreateMessage(String unitCode, String bizNo, String requestNo, String requestContent) {\n        this.sendCreateMessage(unitCode, bizNo, requestNo, requestContent, null);\n    }\n    \n    public void sendCreateMessage(String unitCode, String bizNo, String requestNo, String requestContent, String productCode) {\n        sendCreateMessage(unitCode, bizNo, requestNo, requestContent, productCode, null);\n    }\n    \n    public void sendCreateMessage(String unitCode, String bizNo, String requestNo, String requestContent, String productCode, String parentNo) {\n        ProcessUnitCreateReq req = new ProcessUnitCreateReq();\n        req.setUnitCode(unitCode);\n        req.setBizNo(bizNo);\n        req.setRequestNo(requestNo);\n        req.setRequestContent(requestContent);\n        req.setProductCode(productCode);\n        sendCreateMessage(req);\n    }\n    \n    public void sendCreateMessage(ProcessUnitCreateReq req) {\n        log.info(\"Create process unit message, {}\", req);\n        if (req.getClientInfo() == null) {\n            Map<String, String> clientInfo = new HashMap<String, String>();\n            clientInfo.put(\"ip\", NetUtils.getSysIp());\n            req.setClientInfo(clientInfo);\n        }           \n        getMessageSendService().sendMessage(req.getRequestNo(), createMessageTopic, JSON.toJSONString(req));\n    }\n    \n    public ProcessUnitExecuteRes execute(ProcessUnitExecuteReq req) {\n        if (req.getClientInfo() == null) {\n            Map<String, String> clientInfo = new HashMap<String, String>();\n            clientInfo.put(\"ip\", NetUtils.getSysIp());\n            req.setClientInfo(clientInfo);\n        }        \n        log.info(\"Execute process unit request, {}\", req);\n        ExportResponse<ProcessUnitExecuteRes> response = getProcessUnitExport().execute(new ExportRequest(req));\n        log.info(\"Execute process unit response:{}\", response);\n        ProcessUnitExecuteRes res = ExportResponseUtil.unwrap(response);\n        return res; \n    }\n    \n    public void sendExecuteMessage(String instanceNo) {\n        ProcessUnitExecuteReq req = new ProcessUnitExecuteReq();\n        req.setProcessUnitInstanceNo(instanceNo);\n        sendExecuteMessage(req);\n    }\n    \n    public void sendExecuteMessage(String unitCode, String bizNo) {\n        ProcessUnitExecuteReq req = new ProcessUnitExecuteReq();\n        req.setUnitCode(unitCode);\n        req.setBizNo(bizNo);\n        sendExecuteMessage(req);\n    }\n    \n    public void sendExecuteMessage(ProcessUnitExecuteReq req) {\n        log.info(\"Execute process unit message, {}\", req);\n        getMessageSendService().sendMessage(req.getProcessUnitInstanceNo() + \"-\" + req.getUnitCode() + \"-\" + req.getBizNo() + \"-\" + UUID.randomUUID().toString(), executeMessageTopic, JSON.toJSONString(req));\n    }\n    \n    public ProcessUnitUpdateRes update(String unitCode, String bizNo, String result, String responseContent) {\n        return update(unitCode, bizNo, result, responseContent, null);\n    }\n    \n    public ProcessUnitUpdateRes update(String unitCode, String bizNo, String result, String responseContent, Map<String, String> variables) {\n        ProcessUnitUpdateReq req = new ProcessUnitUpdateReq();\n        req.setUnitCode(unitCode);\n        req.setBizNo(bizNo);\n        req.setResult(result);\n        req.setResponseContent(responseContent);\n        req.setVariables(variables);\n        String requestNo = UUIDUtil.getSimpleUUID();\n        req.setRequestNo(requestNo);\n        req.setResponseTime(new Date());\n        req.setExecType(ProcessUnitConstants.EXEC_TYPE_SYNC);\n        return update(req);\n    }\n    \n    public ProcessUnitUpdateRes update(ProcessUnitUpdateReq req) {\n        if (req.getClientInfo() == null) {\n            Map<String, String> clientInfo = new HashMap<String, String>();\n            clientInfo.put(\"ip\", NetUtils.getSysIp());\n            req.setClientInfo(clientInfo);\n        }\n        log.info(\"Update process unit request, {}\", req);\n        ExportResponse<ProcessUnitUpdateRes> response = getProcessUnitExport()\n                .update(new ExportRequest<ProcessUnitUpdateReq>(req));\n        log.info(\"Update process unit response, {}\", req);\n        ProcessUnitUpdateRes res = ExportResponseUtil.unwrap(response);\n        return res;\n    }\n    \n    public ProcessUnitCreateAndExecuteRes createAndExecuteAfterCommit(ProcessUnitCreateAndExecuteReq req) {\n        ProcessUnitCreateAndExecuteRes res = new ProcessUnitCreateAndExecuteRes();\n        ProcessUnitCreateRes createRes =create(req.getCreateReq());\n        res.setCreateRes(createRes);\n        req.getExecParam().setUnitCode(req.getCreateReq().getUnitCode());\n        req.getExecParam().setBizNo(req.getCreateReq().getBizNo());\n        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {\n            @Override\n            public void afterCommit() {\n                ExecResult result = executor.execute(req.getExecParam());\n                res.setExecResult(result);\n            }\n        });\n        return res;\n    }\n    \n    \n    \n\n    private ProcessUnitExport getProcessUnitExport() {\n        if (processUnitExport == null) {\n            processUnitExport = ObjectFactorys.getDefault().getObject(ProcessUnitExport.class);\n        }\n        return processUnitExport;\n    }\n\n    public MessageSendService getMessageSendService() {\n        return messageSendService;\n    }\n\n    public void setMessageSendService(MessageSendService messageSendService) {\n        this.messageSendService = messageSendService;\n    }\n\n    public String getCreateMessageTopic() {\n        return createMessageTopic;\n    }\n\n    public void setCreateMessageTopic(String createMessageTopic) {\n        this.createMessageTopic = createMessageTopic;\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/processunit/client/ProcessUnitHelper.java",
    "content": "package com.jd.easyflow.processunit.client;\n\nimport java.util.Map;\nimport java.util.function.Function;\n\nimport com.jd.easyflow.objects.factory.ObjectFactorys;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitCreateReq;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitCreateRes;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitExecuteReq;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitExecuteRes;\nimport com.jd.easyflow.processunit.client.bean.ExecContext;\nimport com.jd.easyflow.processunit.client.bean.ExecParam;\nimport com.jd.easyflow.processunit.client.bean.ExecResult;\nimport com.jd.easyflow.processunit.client.bean.ProcessUnitCreateAndExecuteReq;\nimport com.jd.easyflow.processunit.client.bean.ProcessUnitCreateAndExecuteRes;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ProcessUnitHelper {\n\n    private static ProcessUnitClient processUnitClient;\n\n    public static <T> T call(String unitCode, String requestContent, Function<ExecContext, T> invoker) {\n        return getProcessUnitClient().call(unitCode, requestContent, invoker);\n    }\n\n    public static <T> T call(String unitCode, String bizNo, String requestContent, Function<ExecContext, T> invoker) {\n        return getProcessUnitClient().call(unitCode, bizNo, requestContent, invoker);\n    }\n\n    public static <T> T call(String unitCode, String bizNo, String requestContent, Function<ExecContext, T> invoker,\n            Function<ExecContext, String> resultFunction) {\n        return getProcessUnitClient().call(unitCode, bizNo, requestContent, invoker, resultFunction);\n    }\n\n    public static <T> T call(String unitCode, String bizNo, String requestNo, String requestContent,\n            Function<ExecContext, T> invoker, Function<ExecContext, String> resultFunction,\n            Function<ExecContext, String> responseContentFunction, Function<ExecContext, ?> oldResultFunction) {\n        return getProcessUnitClient().call(unitCode, bizNo, requestNo, requestContent, invoker, resultFunction,\n                responseContentFunction, oldResultFunction);\n    }\n\n\n    public static <T> T call(String unitCode, String bizNo, String requestNo, String requestContent, String productCode,\n            Function<ExecContext, T> invoker, Function<ExecContext, String> resultFunction,\n            Function<ExecContext, String> responseContentFunction, Function<ExecContext, ?> oldResultFunction) {\n        return getProcessUnitClient().call(unitCode, bizNo, requestNo, requestContent, productCode, invoker,\n                resultFunction, responseContentFunction, oldResultFunction);\n    }\n    \n    public static ExecResult call(ExecParam param) {\n        return getProcessUnitClient().call(param);\n    }\n\n    public static ProcessUnitCreateRes create(String unitCode, String bizNo) {\n        return getProcessUnitClient().create(unitCode, bizNo);\n    }\n\n    public static ProcessUnitCreateRes create(String unitCode, String bizNo, String requestContent) {\n        return getProcessUnitClient().create(unitCode, bizNo, requestContent);\n    }\n\n    public static ProcessUnitCreateRes create(String unitCode, String bizNo, String requestNo, String requestContent) {\n        return getProcessUnitClient().create(unitCode, bizNo, requestNo, requestContent);\n    }\n\n\n    public static ProcessUnitCreateRes create(String unitCode, String bizNo, String requestNo, String requestContent,\n            String productCode) {\n        return getProcessUnitClient().create(unitCode, bizNo, requestNo, requestContent, productCode);\n    }\n    \n    public  static ProcessUnitCreateRes create(ProcessUnitCreateReq req) {\n        return getProcessUnitClient().create(req);\n    }\n\n\n    public static void sendCreateMessage(String unitCode, String bizNo, String requestContent) {\n        getProcessUnitClient().sendCreateMessage(unitCode, bizNo, requestContent);\n    }\n\n\n    public static void sendCreateMessage(String unitCode, String bizNo, String requestNo, String requestContent) {\n        getProcessUnitClient().sendCreateMessage(unitCode, bizNo, requestNo, requestContent);\n    }\n\n    public static void sendCreateMessage(String unitCode, String bizNo, String requestNo, String requestContent,\n            String productCode) {\n        getProcessUnitClient().sendCreateMessage(unitCode, bizNo, requestNo, requestContent, productCode);\n    }\n    \n    public static void update(String unitCode, String bizNo, String result, String responseContent) {\n        getProcessUnitClient().update(unitCode, bizNo, result, responseContent);\n    }\n    \n    public static void update(String unitCode, String bizNo, String result, String responseContent, Map<String, String> variables) {\n        getProcessUnitClient().update(unitCode, bizNo, result, responseContent, variables);\n    }\n    \n    public static ProcessUnitExecuteRes execute(ProcessUnitExecuteReq req) {\n        return getProcessUnitClient().execute(req);\n    }\n    \n    \n    \n    public static ProcessUnitCreateAndExecuteRes createAndExecuteAfterCommit(ProcessUnitCreateAndExecuteReq req) {\n        return getProcessUnitClient().createAndExecuteAfterCommit(req);\n    }\n\n    public static ProcessUnitClient getProcessUnitClient() {\n        if (processUnitClient == null) {\n            processUnitClient = ObjectFactorys.getDefault().getObject(ProcessUnitClient.class);\n        }\n        return processUnitClient;\n    }\n\n    public static void setProcessUnitClient(ProcessUnitClient processUnitClient) {\n        ProcessUnitHelper.processUnitClient = processUnitClient;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/processunit/client/bean/ExecContext.java",
    "content": "package com.jd.easyflow.processunit.client.bean;\n\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ExecContext {\n    \n    public ExecContext() {\n        // NOOP\n    }\n    \n    public ExecContext(ExecParam param) {\n        this.param = param;\n        this.result = new ExecResult();\n    }\n    \n    private String unitCode;\n    \n    private String bizNo;\n\n    private String instanceNo;\n    \n    private Map<String, Object> unitConf;\n    \n    private String executionNo;\n    \n    private ExecParam param;\n    \n    private ExecResult result;\n    \n    private ExecPolicy policy;\n        \n    private boolean executed;\n\n    private Map<String, String> serverContextData;\n    \n    private Map<String, String> variables;\n\n    public Object getUnitConf(String key) {\n        if (unitConf == null) {\n            return null;\n        }\n        return unitConf.get(key);\n    }\n    \n    public String getVariable(String key) {\n        if (variables == null) {\n            return null;\n        }\n        return variables.get(key);\n    }\n    \n    public void putVariable(String key, String value) {\n        if (variables == null) {\n            variables = new ConcurrentHashMap<>();\n        }\n        if (value == null) {\n            variables.remove(key);\n        } else {\n            variables.put(key, value);\n        }\n    }\n\n    public String getUnitCode() {\n        return unitCode;\n    }\n\n    public void setUnitCode(String unitCode) {\n        this.unitCode = unitCode;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    public String getInstanceNo() {\n        return instanceNo;\n    }\n\n    public void setInstanceNo(String instanceNo) {\n        this.instanceNo = instanceNo;\n    }\n\n    public Map<String, Object> getUnitConf() {\n        return unitConf;\n    }\n\n    public void setUnitConf(Map<String, Object> unitConf) {\n        this.unitConf = unitConf;\n    }\n\n    public String getExecutionNo() {\n        return executionNo;\n    }\n\n    public void setExecutionNo(String executionNo) {\n        this.executionNo = executionNo;\n    }\n\n    public ExecParam getParam() {\n        return param;\n    }\n\n    public void setParam(ExecParam param) {\n        this.param = param;\n    }\n\n    public ExecResult getResult() {\n        return result;\n    }\n\n    public void setResult(ExecResult result) {\n        this.result = result;\n    }\n\n    public ExecPolicy getPolicy() {\n        return policy;\n    }\n\n    public void setPolicy(ExecPolicy policy) {\n        this.policy = policy;\n    }\n\n    public boolean isExecuted() {\n        return executed;\n    }\n\n    public void setExecuted(boolean executed) {\n        this.executed = executed;\n    }\n\n    public Map<String, String> getServerContextData() {\n        return serverContextData;\n    }\n\n    public void setServerContextData(Map<String, String> serverContextData) {\n        this.serverContextData = serverContextData;\n    }\n\n    public Map<String, String> getVariables() {\n        return variables;\n    }\n\n    public void setVariables(Map<String, String> variables) {\n        this.variables = variables;\n    }\n\n    @Override\n    public String toString() {\n        return \"ExecContext [unitCode=\" + unitCode + \", bizNo=\" + bizNo + \", instanceNo=\" + instanceNo + \", unitConf=\"\n                + unitConf + \", executionNo=\" + executionNo + \", param=\" + param + \", result=\" + result + \", policy=\"\n                + policy + \", executed=\" + executed + \", serverContextData=\" + serverContextData + \", variables=\"\n                + variables + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/processunit/client/bean/ExecParam.java",
    "content": "package com.jd.easyflow.processunit.client.bean;\n\nimport java.util.Map;\nimport java.util.function.Function;\n\nimport com.fasterxml.jackson.annotation.JsonIgnore;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ExecParam {\n\n    private String unitCode;\n    \n    private String bizNo;\n    \n    private String requestNo;\n    private Function<ExecContext, ?> invoker;\n    private Function<ExecContext, String> resultFunction;\n    private Function<ExecContext, String> responseContentFunction;\n    private Function<ExecContext, ?> oldResultFunction;\n    \n    private String instanceNo;\n    \n    private String executeExp;\n\n    private String requestContent;\n\n    private Map<String, Object> requestContext;\n    \n    private String executionNo;\n    \n    private String productCode;\n    \n    private String parentNo;\n    \n    @JsonIgnore\n    private ExecContext execContext;\n    \n    public String getUnitCode() {\n        return unitCode;\n    }\n\n    public void setUnitCode(String unitCode) {\n        this.unitCode = unitCode;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    public String getRequestNo() {\n        return requestNo;\n    }\n\n    public void setRequestNo(String requestNo) {\n        this.requestNo = requestNo;\n    }\n\n    public Function<ExecContext, ?> getInvoker() {\n        return invoker;\n    }\n\n    public void setInvoker(Function<ExecContext, ?> invoker) {\n        this.invoker = invoker;\n    }\n\n    public Function<ExecContext, String> getResultFunction() {\n        return resultFunction;\n    }\n\n    public void setResultFunction(Function<ExecContext, String> resultFunction) {\n        this.resultFunction = resultFunction;\n    }\n\n    public Function<ExecContext, String> getResponseContentFunction() {\n        return responseContentFunction;\n    }\n\n    public void setResponseContentFunction(Function<ExecContext, String> responseContentFunction) {\n        this.responseContentFunction = responseContentFunction;\n    }\n\n    public Function<ExecContext, ?> getOldResultFunction() {\n        return oldResultFunction;\n    }\n\n    public void setOldResultFunction(Function<ExecContext, ?> oldResultFunction) {\n        this.oldResultFunction = oldResultFunction;\n    }\n\n    public String getInstanceNo() {\n        return instanceNo;\n    }\n\n    public void setInstanceNo(String instanceNo) {\n        this.instanceNo = instanceNo;\n    }\n\n    public String getExecuteExp() {\n        return executeExp;\n    }\n\n    public void setExecuteExp(String executeExp) {\n        this.executeExp = executeExp;\n    }\n\n    public String getRequestContent() {\n        return requestContent;\n    }\n\n    public void setRequestContent(String requestContent) {\n        this.requestContent = requestContent;\n    }\n\n    public Map<String, Object> getRequestContext() {\n        return requestContext;\n    }\n\n    public void setRequestContext(Map<String, Object> requestContext) {\n        this.requestContext = requestContext;\n    }\n\n    public String getExecutionNo() {\n        return executionNo;\n    }\n\n    public void setExecutionNo(String executionNo) {\n        this.executionNo = executionNo;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n\n    public String getParentNo() {\n        return parentNo;\n    }\n\n    public void setParentNo(String parentNo) {\n        this.parentNo = parentNo;\n    }\n\n    public ExecContext getExecContext() {\n        return execContext;\n    }\n\n    public void setExecContext(ExecContext execContext) {\n        this.execContext = execContext;\n    }\n\n    @Override\n    public String toString() {\n        return \"ExecParam [unitCode=\" + unitCode + \", bizNo=\" + bizNo + \", requestNo=\" + requestNo + \", instanceNo=\"\n                + instanceNo + \", executeExp=\" + executeExp + \", requestContent=\" + requestContent + \", requestContext=\"\n                + requestContext + \", executionNo=\" + executionNo + \", productCode=\" + productCode + \", parentNo=\"\n                + parentNo + \"]\";\n    }\n\n\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/processunit/client/bean/ExecPolicy.java",
    "content": "package com.jd.easyflow.processunit.client.bean;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ExecPolicy {\n\n    private String policyType;\n    \n    private String policyData;\n    \n    private String result;\n    private String requestContent;\n    private String responseContent;\n    \n    public ExecPolicy() {\n        // NOOP\n    }\n    \n    public ExecPolicy(String policyType) {\n        this.policyType = policyType;\n    }\n    \n    public ExecPolicy(String policyType, String policyData) {\n        this.policyType = policyType;\n        this.policyData = policyData;\n    }\n\n    public String getPolicyType() {\n        return policyType;\n    }\n\n    public void setPolicyType(String policyType) {\n        this.policyType = policyType;\n    }\n\n    public String getPolicyData() {\n        return policyData;\n    }\n\n    public void setPolicyData(String policyData) {\n        this.policyData = policyData;\n    }\n\n    public String getResult() {\n        return result;\n    }\n\n    public void setResult(String result) {\n        this.result = result;\n    }\n\n    public String getRequestContent() {\n        return requestContent;\n    }\n\n    public void setRequestContent(String requestContent) {\n        this.requestContent = requestContent;\n    }\n\n    public String getResponseContent() {\n        return responseContent;\n    }\n\n    public void setResponseContent(String responseContent) {\n        this.responseContent = responseContent;\n    }\n\n    @Override\n    public String toString() {\n        return \"ExecPolicy [policyType=\" + policyType + \", policyData=\" + policyData + \", result=\" + result\n                + \", requestContent=\" + requestContent + \", responseContent=\" + responseContent + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/processunit/client/bean/ExecResult.java",
    "content": "package com.jd.easyflow.processunit.client.bean;\n\nimport java.util.Date;\n\nimport com.fasterxml.jackson.annotation.JsonIgnore;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ExecResult {\n    \n    public ExecResult() {\n        \n    }\n    \n    public ExecResult(String result, String responseContent) {\n        this.result = result;\n        this.responseContent = responseContent;\n    }\n    \n    public ExecResult(String result, String responseContent, Object execResult, Throwable execException, String instanceNo, ExecContext execContext) {\n        this.result = result;\n        this.responseContent = responseContent;\n        this.execResult = execResult;\n        this.execException = execException;\n        this.instanceNo = instanceNo;\n        this.execContext = execContext;\n    }\n    \n    private String result;\n    \n    private String responseContent;\n    \n    private Object execResult;\n    \n    private Throwable execException;\n    \n    private String instanceNo;\n    \n    @JsonIgnore\n    private ExecContext execContext;\n    \n    private Boolean autoRunFlag;\n    \n    private Date nextAutoRunTime;\n\n    public String getResult() {\n        return result;\n    }\n\n    public void setResult(String result) {\n        this.result = result;\n    }\n\n    public String getResponseContent() {\n        return responseContent;\n    }\n\n    public void setResponseContent(String responseContent) {\n        this.responseContent = responseContent;\n    }\n\n    public Object getExecResult() {\n        return execResult;\n    }\n\n    public void setExecResult(Object execResult) {\n        this.execResult = execResult;\n    }\n\n    public Throwable getExecException() {\n        return execException;\n    }\n\n    public void setExecException(Throwable execException) {\n        this.execException = execException;\n    }\n\n    public String getInstanceNo() {\n        return instanceNo;\n    }\n\n    public void setInstanceNo(String instanceNo) {\n        this.instanceNo = instanceNo;\n    }\n\n    public ExecContext getExecContext() {\n        return execContext;\n    }\n\n    public void setExecContext(ExecContext execContext) {\n        this.execContext = execContext;\n    }\n    \n\n    public Boolean getAutoRunFlag() {\n        return autoRunFlag;\n    }\n\n    public void setAutoRunFlag(Boolean autoRunFlag) {\n        this.autoRunFlag = autoRunFlag;\n    }\n\n    public Date getNextAutoRunTime() {\n        return nextAutoRunTime;\n    }\n\n    public void setNextAutoRunTime(Date nextAutoRunTime) {\n        this.nextAutoRunTime = nextAutoRunTime;\n    }\n\n    @Override\n    public String toString() {\n        return \"ExecResult [result=\" + result + \", responseContent=\" + responseContent + \", execResult=\" + execResult\n                + \", execException=\" + execException + \", instanceNo=\" + instanceNo + \", autoRunFlag=\" + autoRunFlag\n                + \", nextAutoRunTime=\" + nextAutoRunTime + \"]\";\n    }\n\n\n\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/processunit/client/bean/ProcessUnit.java",
    "content": "package com.jd.easyflow.processunit.client.bean;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessUnit {\n    \n    private String processUnitCode;\n    \n    private String parentNo;\n    \n    private String name;\n    \n    private String config;\n    \n    private String status;\n\n    public String getProcessUnitCode() {\n        return processUnitCode;\n    }\n\n    public void setProcessUnitCode(String processUnitCode) {\n        this.processUnitCode = processUnitCode;\n    }\n\n    public String getParentNo() {\n        return parentNo;\n    }\n\n    public void setParentNo(String parentNo) {\n        this.parentNo = parentNo;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getConfig() {\n        return config;\n    }\n\n    public void setConfig(String config) {\n        this.config = config;\n    }\n\n    public String getStatus() {\n        return status;\n    }\n\n    public void setStatus(String status) {\n        this.status = status;\n    }\n\n    @Override\n    public String toString() {\n        return \"ProcessUnit [processUnitCode=\" + processUnitCode + \", parentNo=\" + parentNo + \", name=\" + name\n                + \", config=\" + config + \", status=\" + status + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/processunit/client/bean/ProcessUnitCreateAndExecuteReq.java",
    "content": "package com.jd.easyflow.processunit.client.bean;\n\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitCreateReq;\n\n/**\n * @author liyuliang5\n */\npublic class ProcessUnitCreateAndExecuteReq {\n\n    private ProcessUnitCreateReq createReq;\n    \n    private ExecParam execParam;\n    \n    public ProcessUnitCreateAndExecuteReq() {\n        \n    }\n    \n    public ProcessUnitCreateAndExecuteReq(ProcessUnitCreateReq createReq, ExecParam execParam) {\n        this.createReq = createReq;\n        this.execParam = execParam;\n    }\n\n    public ProcessUnitCreateReq getCreateReq() {\n        return createReq;\n    }\n\n    public void setCreateReq(ProcessUnitCreateReq createReq) {\n        this.createReq = createReq;\n    }\n\n    public ExecParam getExecParam() {\n        return execParam;\n    }\n\n    public void setExecParam(ExecParam execParam) {\n        this.execParam = execParam;\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/processunit/client/bean/ProcessUnitCreateAndExecuteRes.java",
    "content": "package com.jd.easyflow.processunit.client.bean;\n\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitCreateRes;\n\n/**\n * @author liyuliang5\n */\npublic class ProcessUnitCreateAndExecuteRes {\n    \n    private ProcessUnitCreateRes createRes;\n    \n    private ExecResult execResult;\n\n    public ProcessUnitCreateRes getCreateRes() {\n        return createRes;\n    }\n\n    public void setCreateRes(ProcessUnitCreateRes createRes) {\n        this.createRes = createRes;\n    }\n\n    public ExecResult getExecResult() {\n        return execResult;\n    }\n\n    public void setExecResult(ExecResult execResult) {\n        this.execResult = execResult;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/processunit/client/bean/ProcessUnitExecution.java",
    "content": "package com.jd.easyflow.processunit.client.bean;\n\nimport java.util.Date;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessUnitExecution {\n\n    private String executionNo;\n    \n    private String requestNo;\n    \n    private String parentNo;\n    \n    private String instanceNo;\n    \n    private String processUnitCode;\n    \n    private String productCode;\n    \n    private String result;\n \n    private String requestContent;\n\n    private String responseContent;\n    \n    private String responseCode;\n    \n    private Date requestTime;\n    \n    private Date responseTime;\n    \n    private long elaspeTime;\n\n    private String extData;\n    \n    private Date createdDate;\n    \n    private Date modifiedDate;\n\n    public String getExecutionNo() {\n        return executionNo;\n    }\n\n    public void setExecutionNo(String executionNo) {\n        this.executionNo = executionNo;\n    }\n\n    public String getRequestNo() {\n        return requestNo;\n    }\n\n    public void setRequestNo(String requestNo) {\n        this.requestNo = requestNo;\n    }\n\n    public String getParentNo() {\n        return parentNo;\n    }\n\n    public void setParentNo(String parentNo) {\n        this.parentNo = parentNo;\n    }\n\n    public String getInstanceNo() {\n        return instanceNo;\n    }\n\n    public void setInstanceNo(String instanceNo) {\n        this.instanceNo = instanceNo;\n    }\n\n    public String getProcessUnitCode() {\n        return processUnitCode;\n    }\n\n    public void setProcessUnitCode(String processUnitCode) {\n        this.processUnitCode = processUnitCode;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n\n    public String getResult() {\n        return result;\n    }\n\n    public void setResult(String result) {\n        this.result = result;\n    }\n\n    public String getRequestContent() {\n        return requestContent;\n    }\n\n    public void setRequestContent(String requestContent) {\n        this.requestContent = requestContent;\n    }\n\n    public String getResponseContent() {\n        return responseContent;\n    }\n\n    public void setResponseContent(String responseContent) {\n        this.responseContent = responseContent;\n    }\n\n    public String getResponseCode() {\n        return responseCode;\n    }\n\n    public void setResponseCode(String responseCode) {\n        this.responseCode = responseCode;\n    }\n\n    public Date getRequestTime() {\n        return requestTime;\n    }\n\n    public void setRequestTime(Date requestTime) {\n        this.requestTime = requestTime;\n    }\n\n    public Date getResponseTime() {\n        return responseTime;\n    }\n\n    public void setResponseTime(Date responseTime) {\n        this.responseTime = responseTime;\n    }\n\n    public long getElaspeTime() {\n        return elaspeTime;\n    }\n\n    public void setElaspeTime(long elaspeTime) {\n        this.elaspeTime = elaspeTime;\n    }\n\n    public String getExtData() {\n        return extData;\n    }\n\n    public void setExtData(String extData) {\n        this.extData = extData;\n    }\n\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n\n    @Override\n    public String toString() {\n        return \"ProcessUnitExecution [executionNo=\" + executionNo + \", requestNo=\" + requestNo + \", parentNo=\"\n                + parentNo + \", instanceNo=\" + instanceNo + \", processUnitCode=\" + processUnitCode + \", productCode=\"\n                + productCode + \", result=\" + result + \", requestContent=\" + requestContent + \", responseContent=\"\n                + responseContent + \", responseCode=\" + responseCode + \", requestTime=\" + requestTime\n                + \", responseTime=\" + responseTime + \", elaspeTime=\" + elaspeTime + \", extData=\" + extData\n                + \", createdDate=\" + createdDate + \", modifiedDate=\" + modifiedDate + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/processunit/client/bean/ProcessUnitInstance.java",
    "content": "package com.jd.easyflow.processunit.client.bean;\n\nimport java.util.Date;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessUnitInstance {\n\n    private String instanceNo;\n\n    private String bizNo;\n    \n    private String parentNo;\n    \n    private String processUnitCode;\n    \n    private String productCode;\n\n    private String result;\n\n    private String requestContent;\n\n    private String responseContent;\n    \n    private String vars;\n        \n    private String extData;\n    \n    private Date createdDate;\n    \n    private Date modifiedDate;\n\n    private boolean autoRunFlag;\n\n    private int asyncRunTimes;\n    private Date nextAsyncRunTime;\n    public String getInstanceNo() {\n        return instanceNo;\n    }\n    public void setInstanceNo(String instanceNo) {\n        this.instanceNo = instanceNo;\n    }\n    public String getBizNo() {\n        return bizNo;\n    }\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n    public String getParentNo() {\n        return parentNo;\n    }\n    public void setParentNo(String parentNo) {\n        this.parentNo = parentNo;\n    }\n    public String getProcessUnitCode() {\n        return processUnitCode;\n    }\n    public void setProcessUnitCode(String processUnitCode) {\n        this.processUnitCode = processUnitCode;\n    }\n    public String getProductCode() {\n        return productCode;\n    }\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n    public String getResult() {\n        return result;\n    }\n    public void setResult(String result) {\n        this.result = result;\n    }\n    public String getRequestContent() {\n        return requestContent;\n    }\n    public void setRequestContent(String requestContent) {\n        this.requestContent = requestContent;\n    }\n    public String getResponseContent() {\n        return responseContent;\n    }\n    public void setResponseContent(String responseContent) {\n        this.responseContent = responseContent;\n    }\n    public String getExtData() {\n        return extData;\n    }\n    public void setExtData(String extData) {\n        this.extData = extData;\n    }\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n    public boolean isAutoRunFlag() {\n        return autoRunFlag;\n    }\n    public void setAutoRunFlag(boolean autoRunFlag) {\n        this.autoRunFlag = autoRunFlag;\n    }\n    public int getAsyncRunTimes() {\n        return asyncRunTimes;\n    }\n    public void setAsyncRunTimes(int asyncRunTimes) {\n        this.asyncRunTimes = asyncRunTimes;\n    }\n    public Date getNextAsyncRunTime() {\n        return nextAsyncRunTime;\n    }\n    public void setNextAsyncRunTime(Date nextAsyncRunTime) {\n        this.nextAsyncRunTime = nextAsyncRunTime;\n    }\n    public String getVars() {\n        return vars;\n    }\n    public void setVars(String vars) {\n        this.vars = vars;\n    }\n    @Override\n    public String toString() {\n        return \"ProcessUnitInstance [instanceNo=\" + instanceNo + \", bizNo=\" + bizNo + \", parentNo=\" + parentNo\n                + \", processUnitCode=\" + processUnitCode + \", productCode=\" + productCode + \", result=\" + result\n                + \", requestContent=\" + requestContent + \", responseContent=\" + responseContent +\",vars=\" + vars + \", extData=\" + extData\n                + \", createdDate=\" + createdDate + \", modifiedDate=\" + modifiedDate + \", autoRunFlag=\" + autoRunFlag\n                + \", asyncRunTimes=\" + asyncRunTimes + \", nextAsyncRunTime=\" + nextAsyncRunTime + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/processunit/client/converter/ProcessUnitConverter.java",
    "content": "package com.jd.easyflow.processunit.client.converter;\n\nimport com.jd.easyflow.processunit.adapter.export.dto.ExecPolicyDTO;\nimport com.jd.easyflow.processunit.client.bean.ExecPolicy;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessUnitConverter {\n\n    public static ProcessUnitConverter INSTANCE = new ProcessUnitConverter();\n    \n\n    public ExecPolicy convert(ExecPolicyDTO execPolicy) {\n        if ( execPolicy == null ) {\n            return null;\n        }\n\n        ExecPolicy execPolicy1 = new ExecPolicy();\n\n        execPolicy1.setPolicyData( execPolicy.getPolicyData() );\n        execPolicy1.setPolicyType( execPolicy.getPolicyType() );\n        execPolicy1.setRequestContent( execPolicy.getRequestContent() );\n        execPolicy1.setResponseContent( execPolicy.getResponseContent() );\n        execPolicy1.setResult( execPolicy.getResult() );\n\n        return execPolicy1;\n    }\n\n}\n\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/processunit/client/gateway/ProcessUnitServerGateway.java",
    "content": "package com.jd.easyflow.processunit.client.gateway;\n\nimport com.jd.easyflow.processunit.client.bean.ExecContext;\nimport com.jd.easyflow.processunit.client.bean.ExecPolicy;\n\n/**\n * @author liyuliang5\n *\n */\npublic interface ProcessUnitServerGateway {\n\n    public ExecPolicy syncBeforeCall(ExecContext context);\n    \n    public void syncAfterCall(ExecContext context);\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/processunit/client/message/ProcessUnitClientServiceMessageListener.java",
    "content": "package com.jd.easyflow.processunit.client.message;\n\nimport java.util.List;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.message.BaseMessageListener;\nimport com.jd.easyflow.message.Message;\nimport com.jd.easyflow.processunit.client.ProcessUnitClient;\nimport com.jd.easyflow.processunit.client.bean.ExecParam;\nimport com.jd.easyflow.processunit.spi.client.ProcessUnitClientService;\nimport com.jd.easyflow.processunit.spi.client.dto.AsyncCallRealReq;\nimport com.jd.easyflow.processunit.spi.client.dto.AsyncCallRealRes;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ProcessUnitClientServiceMessageListener extends BaseMessageListener<AsyncCallRealReq> {\n    \n    private static final Logger log = LoggerFactory.getLogger(ProcessUnitClientServiceMessageListener.class);\n\n    \n    private List<String> unitCodeList;\n    \n    private ProcessUnitClientService processUnitClientService;\n    \n    private ProcessUnitClient processUnitClient;\n\n    @Override\n    public boolean validate(AsyncCallRealReq req, Message message) {\n        if (unitCodeList == null || !unitCodeList.contains(req.getUnitCode())) {\n            return false;\n        }\n        return true;\n    }\n\n    @Override\n    public void process(AsyncCallRealReq req, Message message) {\n        log.info(\"Process unit client receive async call real message:{}\", req);\n        ExecParam param = new ExecParam();\n        param.setUnitCode(req.getUnitCode());\n        param.setBizNo(req.getBizNo());\n        param.setRequestNo(\"_E_\" + req.getExecutionNo());\n        param.setRequestContent(req.getRequestContent());\n        param.setInvoker(context -> {\n            AsyncCallRealRes res = processUnitClientService.asyncCallReal(req);\n            context.setVariables(res.getVariables());\n            context.getResult().setAutoRunFlag(res.getAutoRunFlag());\n            context.getResult().setNextAutoRunTime(res.getNextAutoRunTime());\n            return res;\n        });\n        param.setResultFunction(context -> {\n            AsyncCallRealRes res = (AsyncCallRealRes) context.getResult().getExecResult();\n            return res.getResult();\n        });\n        param.setResponseContentFunction(context -> {\n            AsyncCallRealRes res = (AsyncCallRealRes) context.getResult().getExecResult();\n            return res.getResponseContent();\n        });\n        processUnitClient.call(param);\n    }\n\n    public ProcessUnitClientService getProcessUnitClientService() {\n        return processUnitClientService;\n    }\n\n    public void setProcessUnitClientService(ProcessUnitClientService processUnitClientService) {\n        this.processUnitClientService = processUnitClientService;\n    }\n\n    public ProcessUnitClient getProcessUnitClient() {\n        return processUnitClient;\n    }\n\n    public void setProcessUnitClient(ProcessUnitClient processUnitClient) {\n        this.processUnitClient = processUnitClient;\n    }\n\n    public List<String> getUnitCodeList() {\n        return unitCodeList;\n    }\n\n    public void setUnitCodeList(List<String> unitCodeList) {\n        this.unitCodeList = unitCodeList;\n    }\n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/processunit/client/service/ProcessUnitExecutor.java",
    "content": "package com.jd.easyflow.processunit.client.service;\n\nimport com.jd.easyflow.processunit.client.bean.ExecParam;\nimport com.jd.easyflow.processunit.client.bean.ExecResult;\n\npublic interface ProcessUnitExecutor {\n\n    ExecResult execute(ExecParam param);\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/processunit/client/service/impl/AsyncClientProcessUnitExecutor.java",
    "content": "package com.jd.easyflow.processunit.client.service.impl;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport com.jd.easyflow.el.ElFactory;\nimport com.jd.easyflow.processunit.client.bean.ExecParam;\nimport com.jd.easyflow.processunit.client.bean.ExecResult;\n\n/**\n * @author liyuliang5\n *\n */\npublic class AsyncClientProcessUnitExecutor extends BaseProcessUnitExecutor {\n\n    @Override\n    public ExecResult execute(ExecParam param) {\n        Map<String, Object> spelContext = new HashMap<String, Object>();\n        spelContext.put(\"param\", param);\n        return ElFactory.get().evalWithDefaultContext(param.getExecuteExp(), spelContext, false);\n    }\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/processunit/client/service/impl/BaseProcessUnitExecutor.java",
    "content": "package com.jd.easyflow.processunit.client.service.impl;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.processunit.client.bean.ExecContext;\nimport com.jd.easyflow.processunit.client.bean.ExecParam;\nimport com.jd.easyflow.processunit.client.bean.ExecPolicy;\nimport com.jd.easyflow.processunit.client.bean.ExecResult;\nimport com.jd.easyflow.processunit.client.service.ProcessUnitExecutor;\n\n/**\n * @author liyuliang5\n *\n */\npublic abstract class BaseProcessUnitExecutor implements ProcessUnitExecutor {\n    \n    private static final Logger log = LoggerFactory.getLogger(BaseProcessUnitExecutor.class);\n\n    @Override\n    public ExecResult execute(ExecParam param) {\n        ExecContext context = new ExecContext(param);\n        try {\n            ExecPolicy policy = beforeCall(context);\n            log.info(\"Return exec policy:{}\", (policy == null ? null : policy.getPolicyType()));\n            context.setPolicy(policy);\n            call(policy, context);\n        } finally {\n            afterCall(context);\n        }\n        return context.getResult();\n    }\n\n    public void afterCall(ExecContext context) {\n        throw new UnsupportedOperationException();\n    }\n\n    public void call(ExecPolicy policy, ExecContext context) {\n        throw new UnsupportedOperationException();\n    }\n\n    public ExecPolicy beforeCall(ExecContext context) {\n        throw new UnsupportedOperationException();\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/processunit/client/service/impl/ProcessUnitClientAsyncExecuteSpel.java",
    "content": "package com.jd.easyflow.processunit.client.service.impl;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.concurrent.Executor;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.el.ElFactory;\nimport com.jd.easyflow.processunit.client.ProcessUnitClient;\nimport com.jd.easyflow.processunit.client.bean.ExecParam;\nimport com.jd.easyflow.processunit.client.bean.ExecResult;\nimport com.jd.easyflow.processunit.client.util.ProcessUnitConstants;\nimport com.jd.easyflow.spel.SpelHelper;\n\n/**\n * \n * @author liyuliang5\n */\npublic class ProcessUnitClientAsyncExecuteSpel {\n    \n    private static final Logger log = LoggerFactory.getLogger(ProcessUnitClientAsyncExecuteSpel.class);\n    \n    private Executor executor;\n    \n    private ProcessUnitClient processUnitClient;\n    \n    public ExecResult execute(String executeExp, ExecParam param) {\n        Executor executor = getExecutor(param);\n        executor.execute(() -> {\n            log.info(\"Process unit client async exec start:{},{}\", executeExp, param);\n            ExecParam execParam = new ExecParam();\n            execParam.setUnitCode(param.getUnitCode());\n            execParam.setBizNo(param.getBizNo());\n            execParam.setRequestNo(\"_E_\" + param.getExecutionNo());\n            param.setRequestContent(param.getRequestContent());\n            param.setInvoker(context -> {\n                Map<String, Object> spelContext = new HashMap<String, Object>();\n                spelContext.put(\"param\", param);\n                ExecResult result = ElFactory.get().evalWithDefaultContext(executeExp, spelContext, false);\n                context.getResult().setAutoRunFlag(result.getAutoRunFlag());\n                context.getResult().setNextAutoRunTime(result.getNextAutoRunTime());\n                return result;\n            });\n            param.setResultFunction(context -> {\n                ExecResult res = (ExecResult) context.getResult().getExecResult();\n                return res.getResult();\n            });\n            param.setResponseContentFunction(context -> {\n                ExecResult res = (ExecResult) context.getResult().getExecResult();\n                return res.getResponseContent();\n            });\n            try {\n                processUnitClient.call(param);\n                log.info(\"Process unit client async exec end\");\n            } catch (Throwable t) {\n                log.error(\"Process unit client async execute excetpion:{},{}\", executeExp, param, t);\n            }\n        });\n        ExecResult result = new ExecResult();\n        result.setResult(ProcessUnitConstants.RESULT_UNKNOWN);\n        return result;\n    }\n    \n    protected Executor getExecutor(ExecParam param) {\n        return executor;\n    }\n\n\n\n    public ProcessUnitClient getProcessUnitClient() {\n        return processUnitClient;\n    }\n\n    public void setProcessUnitClient(ProcessUnitClient processUnitClient) {\n        this.processUnitClient = processUnitClient;\n    }\n\n    public Executor getExecutor() {\n        return executor;\n    }\n\n    public void setExecutor(Executor executor) {\n        this.executor = executor;\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/processunit/client/service/impl/ProcessUnitClientServiceImpl.java",
    "content": "package com.jd.easyflow.processunit.client.service.impl;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.common.exception.EasyFlowException;\nimport com.jd.easyflow.net.NetUtils;\nimport com.jd.easyflow.processunit.client.bean.ExecContext;\nimport com.jd.easyflow.processunit.client.bean.ExecParam;\nimport com.jd.easyflow.processunit.client.bean.ExecResult;\nimport com.jd.easyflow.processunit.client.util.ProcessUnitConstants;\nimport com.jd.easyflow.processunit.spi.client.ProcessUnitClientService;\nimport com.jd.easyflow.processunit.spi.client.dto.AsyncCallRealReq;\nimport com.jd.easyflow.processunit.spi.client.dto.AsyncCallRealRes;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n * @author liyuliang5\n * \n */\npublic class ProcessUnitClientServiceImpl implements ProcessUnitClientService {\n    \n    private static final Logger log = LoggerFactory.getLogger(ProcessUnitClientServiceImpl.class);\n\n\n    private static final String[] RESULTS = new String[] { ProcessUnitConstants.RESULT_DOING,\n            ProcessUnitConstants.RESULT_EXCEPTION, ProcessUnitConstants.RESULT_FAIL,\n            ProcessUnitConstants.RESULT_SUCCESS };\n\n    private AsyncClientProcessUnitExecutor asyncClientProcessUnitExecutor;\n\n    @Override\n    public AsyncCallRealRes asyncCallReal(AsyncCallRealReq req) {\n        log.info(\"Process unit client receive SPI request:\" + req);\n        ExecParam param = new ExecParam();\n        param.setExecuteExp(req.getExecuteExp());\n        param.setRequestContent(req.getRequestContent());\n        param.setExecutionNo(req.getExecutionNo());\n        param.setRequestContext(req.getRequestContext());\n        param.setInstanceNo(req.getInstanceNo());\n        param.setUnitCode(req.getUnitCode());\n        param.setBizNo(req.getBizNo());\n        ExecContext context = new ExecContext(param);\n        context.setVariables(req.getVariables());\n        param.setExecContext(context);\n        AsyncCallRealRes res = new AsyncCallRealRes();\n        try {\n            ExecResult result = asyncClientProcessUnitExecutor.execute(param);\n            log.info(\"Process unit client execute result:\" + result);\n            boolean contains = false;\n            for (String s : RESULTS) {\n                if (s.equals(result.getResult())) {\n                    contains = true;\n                    break;\n                }\n            }\n            if (! contains) {\n                throw new EasyFlowException(\"Process unit client result illegal\");\n            }\n            res.setResult(result.getResult());\n            res.setResponseContent(result.getResponseContent());\n            Map<String, String> variables = null;\n            if (result.getExecContext() != null) {\n                variables = result.getExecContext().getVariables();\n            } else {\n                variables = context.getVariables();\n            }\n            res.setVariables(variables);\n            res.setAutoRunFlag(result.getAutoRunFlag());\n            res.setNextAutoRunTime(result.getNextAutoRunTime());\n            res.setClientInfo(getClientInfo(context));\n        } catch (Throwable t) {\n            log.error(\"Process unit client execute exception, \" + t.getMessage(), t);\n            res.setResult(ProcessUnitConstants.RESULT_EXCEPTION);\n            res.setVariables(context.getVariables());\n            Map<String, Object> exceptionInfo = new HashMap<>();\n            exceptionInfo.put(\"pu_exception\", t.getClass());\n            if (t.getMessage() != null) {\n                exceptionInfo.put(\"pu_message\",\n                        t.getMessage().length() < 2000 ? t.getMessage() : t.getMessage().substring(0, 2000));\n            }\n            res.setResponseContent(JSON.toJSONString(exceptionInfo));\n            res.setClientInfo(getClientInfo(context));\n        }\n        return res;\n    }\n    \n    protected Map<String, String> getClientInfo(ExecContext context) {\n        Map<String, String> clientInfo = new HashMap<String, String>();\n        clientInfo.put(\"ip\", NetUtils.getSysIp());\n        return clientInfo;\n    }\n\n    public AsyncClientProcessUnitExecutor getAsyncClientProcessUnitExecutor() {\n        return asyncClientProcessUnitExecutor;\n    }\n\n    public void setAsyncClientProcessUnitExecutor(AsyncClientProcessUnitExecutor asyncClientProcessUnitExecutor) {\n        this.asyncClientProcessUnitExecutor = asyncClientProcessUnitExecutor;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/processunit/client/service/impl/SyncClientProcessUnitExecutor.java",
    "content": "package com.jd.easyflow.processunit.client.service.impl;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponse;\nimport com.jd.easyflow.common.adapter.export.util.ExportResponseUtil;\nimport com.jd.easyflow.net.NetUtils;\nimport com.jd.easyflow.objects.factory.ObjectFactorys;\nimport com.jd.easyflow.processunit.adapter.export.ProcessUnitExport;\nimport com.jd.easyflow.processunit.adapter.export.dto.ExecPolicyDTO;\nimport com.jd.easyflow.processunit.adapter.export.dto.SyncAfterCallReq;\nimport com.jd.easyflow.processunit.adapter.export.dto.SyncAfterCallRes;\nimport com.jd.easyflow.processunit.adapter.export.dto.SyncBeforeCallReq;\nimport com.jd.easyflow.processunit.adapter.export.dto.SyncBeforeCallRes;\nimport com.jd.easyflow.processunit.client.bean.ExecContext;\nimport com.jd.easyflow.processunit.client.bean.ExecPolicy;\nimport com.jd.easyflow.processunit.client.util.ProcessUnitConstants;\n\n/**\n *\n * @author liyuliang5\n * \n */\npublic class SyncClientProcessUnitExecutor extends BaseProcessUnitExecutor {\n    \n    private static final Logger log = LoggerFactory.getLogger(SyncClientProcessUnitExecutor.class);\n\n\n    protected boolean disable = false;\n\n    private ProcessUnitExport processUnitExport;\n\n    @Override\n    public ExecPolicy beforeCall(ExecContext context) {\n        if (log.isDebugEnabled()) {\n            log.debug(\"Start before call\");\n        }\n        if (disable) {\n            return new ExecPolicy(ProcessUnitConstants.POLICY_REQUEST);\n        }\n        SyncBeforeCallReq req = new SyncBeforeCallReq();\n        req.setUnitCode(context.getParam().getUnitCode());\n        req.setBizNo(context.getParam().getBizNo());\n        req.setRequestNo(context.getParam().getRequestNo());\n        req.setRequestContent(context.getParam().getRequestContent());\n        req.setProductCode(context.getParam().getProductCode());\n        req.setParentNo(context.getParam().getParentNo());\n        req.setClientInfo(getClientInfo(context));\n        log.info(\"Sync before call request:{}\", req);\n        ExportResponse<SyncBeforeCallRes> response = getProcessUnitExport().syncBeforeCall(new ExportRequest(req));\n        log.info(\"Sync before call response:{}\", response);\n        SyncBeforeCallRes res = ExportResponseUtil.unwrap(response);\n        ExecPolicyDTO policyDto = res.getExecPolicy();\n        ExecPolicy policy = new ExecPolicy();\n        policy.setPolicyType(policyDto.getPolicyType());\n        policy.setPolicyData(policyDto.getPolicyData());\n        policy.setResult(policyDto.getResult());\n        policy.setRequestContent(policyDto.getRequestContent());\n        policy.setResponseContent(policyDto.getResponseContent());\n        context.setUnitConf(res.getUnitConf());\n        context.setExecutionNo(res.getExecutionNo());\n        context.setBizNo(context.getParam().getBizNo());\n        context.setInstanceNo(res.getInstanceNo());\n        context.setServerContextData(res.getContextData());\n        context.setUnitCode(context.getParam().getUnitCode());\n        context.getResult().setInstanceNo(res.getInstanceNo());\n        if (res.getVariables() != null) {\n            context.setVariables(new ConcurrentHashMap<String, String>(res.getVariables()));\n        }\n        return policy;\n    }\n    \n    protected Map<String, String> getClientInfo(ExecContext context) {\n        Map<String, String> clientInfo = new HashMap<String, String>();\n        clientInfo.put(\"ip\", NetUtils.getSysIp());\n        return clientInfo;\n    }\n\n    @Override\n    public void call(ExecPolicy policy, ExecContext context) {\n        if (log.isDebugEnabled()) {\n            log.debug(\"Start execute\");\n        }\n        switch (policy.getPolicyType()) {\n            case ProcessUnitConstants.POLICY_EXCEPTION: {\n                throw new UnsupportedOperationException();\n            }\n            case ProcessUnitConstants.POLICY_OLD: {\n                returnOldResult(context);\n                break;\n            }\n            case ProcessUnitConstants.POLICY_REQUEST: {\n                callReal(context);\n                break;\n            }\n            default:\n                throw new IllegalArgumentException(\"policy illegal:\" + policy);\n        }\n        context.setExecuted(true);\n        if (context.getResult().getExecException() != null\n                && Boolean.FALSE.equals(context.getUnitConf(ProcessUnitConstants.CONF_CATCH_EXCEPTION))) {\n            Throwable t = context.getResult().getExecException();\n            sneakyThrow(t);\n        }\n    }\n\n    @Override\n    public void afterCall(ExecContext context) {\n        if (log.isDebugEnabled()) {\n            log.debug(\"Start after call\");\n        }\n        if (disable) {\n            return;\n        }\n        if (context.getExecutionNo() == null) {\n            log.warn(\"Execution no is null, return\");\n            return;\n        }\n        context.getResult().setResponseContent(context.getParam().getResponseContentFunction().apply(context));\n        context.getResult().setResult(context.getParam().getResultFunction().apply(context));\n        SyncAfterCallReq req = new SyncAfterCallReq();\n        req.setExecutionNo(context.getExecutionNo());\n        req.setResult(context.getResult().getResult());\n        req.setResponseContent(context.getResult().getResponseContent());\n        req.setInstanceNo(context.getInstanceNo());\n        req.setBizNo(context.getBizNo());\n        req.setUnitCode(context.getUnitCode());\n        req.setContextData(context.getServerContextData());\n        req.setVariables(context.getVariables());\n        req.setAutoRunFlag(context.getResult().getAutoRunFlag());\n        req.setNextAutoRunTime(context.getResult().getNextAutoRunTime());\n        log.info(\"Sync after call request:{}\", req);\n        ExportResponse<SyncAfterCallRes> response = getProcessUnitExport().syncAfterCall(new ExportRequest(req));\n        log.info(\"Sync after call response:{}\", response);\n        ExportResponseUtil.unwrap(response);\n\n    }\n    \n    protected void callReal(ExecContext context) {\n        if (log.isDebugEnabled()) {\n            log.debug(\"Start call real\");\n        }\n        try {\n            Object result = context.getParam().getInvoker().apply(context);\n            context.getResult().setExecResult(result);\n            if (log.isDebugEnabled()) {\n                log.debug(\"Call real result:{}\", result);\n            }\n        } catch (Throwable t) {//NOSONAR\n            log.error(\"Call real exception:\" + t.getMessage(), t);\n            context.getResult().setExecException(t);\n        }\n    }\n\n    protected void returnOldResult(ExecContext context) {\n        log.info(\"Start return old result\");\n        try {\n            Object result = context.getParam().getOldResultFunction().apply(context);\n            context.getResult().setExecResult(result);\n            log.info(\"return old result:\" + result);\n        } catch (Throwable t) {//NOSONAR\n            log.error(\"return old result exception\" + t.getMessage(), t);\n            context.getResult().setExecException(t);\n        }\n    }\n    \n    private ProcessUnitExport getProcessUnitExport() {\n        if (processUnitExport == null) {\n            processUnitExport = ObjectFactorys.getDefault().getObject(ProcessUnitExport.class);\n        }\n        return processUnitExport;\n    }\n\n    public static RuntimeException sneakyThrow(Throwable t) {\n        if (t == null) {\n            throw new NullPointerException(\"t\");\n        }\n        return SyncClientProcessUnitExecutor.<RuntimeException>sneakyThrow0(t);\n    }\n\n    private static <T extends Throwable> T sneakyThrow0(Throwable t) throws T {\n        throw (T) t;\n    }\n\n    public void setProcessUnitExport(ProcessUnitExport processUnitExport) {\n        this.processUnitExport = processUnitExport;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/java/com/jd/easyflow/processunit/client/util/ProcessUnitConstants.java",
    "content": "package com.jd.easyflow.processunit.client.util;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ProcessUnitConstants {\n\n    public static final String RESULT_SUCCESS = \"SUCCESS\";\n    \n    public static final String RESULT_FAIL = \"FAIL\";\n\n    public static final String RESULT_DOING = \"DOING\";\n    \n    public static final String RESULT_EXCEPTION = \"EXCEPTION\";\n    \n    public static final String RESULT_UNKNOWN = \"UNKNOWN\";\n    \n\n    public static final String POLICY_OLD = \"OLD\";\n\n    public static final String POLICY_REQUEST = \"REQUEST\";\n\n    public static final String POLICY_EXCEPTION = \"EXCEPTION\";\n    \n    public static final String REQ_TYPE_NEW = \"NEW\";\n    \n    public static final String REQ_TYPE_SUCCESS = \"SUCCESS\";\n    \n    public static final String REQ_TYPE_FAIL = \"FAIL\";\n    \n    public static final String REQ_TYPE_EXCEPTION = \"EXCEPTION\";\n    \n    public static final String CONF_CATCH_EXCEPTION = \"catchException\";\n    \n    public static final String STATUS_VALID = \"VALID\";\n    public static final String STATUS_INVALID = \"INVALID\";\n    \n    public static final String LOCK_PREFIX = \"PU_\";\n    \n    public static final String EXEC_TYPE_SYNC = \"SYNC\";\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/resources/easyflow/easyflow-spring-process-client-processunit.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:aop=\"http://www.springframework.org/schema/aop\"\n       xmlns:context=\"http://www.springframework.org/schema/context\"\n       xmlns:util=\"http://www.springframework.org/schema/util\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd\n       http://www.springframework.org/schema/aop  http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd\">\n\t<bean id=\"easyflow-process-createAsyncProcessUnitNodeAction\" class=\"com.jd.easyflow.process.client.flow.asyncnode.CreateAsyncProcessUnitNodeAction\"></bean>\n\t<bean id=\"easyflow-process-executeAsyncProcessUnitNodeEl\" class=\"com.jd.easyflow.process.client.flow.asyncnode.ExecuteAsyncProcessUnitNodeEl\">\n\t\t<property name=\"flowEngine\" ref=\"easyflow-flowEngine\"></property>\n\t</bean>\n\t\n\t<bean id=\"easyflow-process-flowRetryFilter\" class=\"com.jd.easyflow.process.client.flow.flowretry.FlowRetryFilter\"></bean>\n\t<bean id=\"easyflow-process-flowRetryEl\" class=\"com.jd.easyflow.process.client.flow.flowretry.FlowRetryEl\">\n\t\t<property name=\"flowEngine\" ref=\"easyflow-flowEngine\"></property>\n\t</bean>\n\t\n\t<bean id=\"easyflow-process-nodeActionRetryFilter\" class=\"com.jd.easyflow.process.client.flow.noderetry.NodeActionRetryFilter\"></bean>\n\n</beans>"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/resources/easyflow/easyflow-spring-process-client.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:aop=\"http://www.springframework.org/schema/aop\"\n       xmlns:context=\"http://www.springframework.org/schema/context\"\n       xmlns:util=\"http://www.springframework.org/schema/util\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd\n       http://www.springframework.org/schema/aop  http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd\">\n\t<bean id=\"easyflow-process-exportRequestBuilder\" class=\"com.jd.easyflow.process.client.util.ExportRequestBuilder\">\n\t\t<property name=\"shardingEnabled\" value=\"${easyflow.process.shardingEnabled:false}\"></property>\n\t</bean>\n\n    <bean id=\"easyflow-process-processFlowListener\" class=\"com.jd.easyflow.process.client.flow.StdProcessFlowListener\">\n        <property name=\"processRuntimeService\" ref=\"easyflow-process-processRuntimeService\"></property>\n    </bean>\n    <bean id=\"easyflow-process-processFlowEngineFilter\" class=\"com.jd.easyflow.process.client.flow.StdProcessFlowEngineFilter\">\n        <property name=\"processRuntimeService\" ref=\"easyflow-process-processRuntimeService\"></property>\n    </bean>\n    <bean id=\"easyflow-process-processFlowFilter\" class=\"com.jd.easyflow.process.client.flow.StdProcessFlowFilter\">\n        <property name=\"processRuntimeService\" ref=\"easyflow-process-processRuntimeService\"></property>\n    </bean>\n    <bean id=\"easyflow-process-processFlowNodeFilter\" class=\"com.jd.easyflow.process.client.flow.StdProcessFlowNodeFilter\">\n        <property name=\"processRuntimeService\" ref=\"easyflow-process-processRuntimeService\"></property>\n    </bean>            \n    <bean id=\"easyflow-process-processFsmListener\" class=\"com.jd.easyflow.process.client.fsm.StdProcessFsmListener\">\n        <property name=\"processRuntimeService\" ref=\"easyflow-process-processRuntimeService\"></property>\n    </bean>\n    <bean id=\"easyflow-process-processFsmManagerFilter\" class=\"com.jd.easyflow.process.client.fsm.StdProcessFsmManagerFilter\">\n        <property name=\"processRuntimeService\" ref=\"easyflow-process-processRuntimeService\"></property>\n    </bean>\n    <bean id=\"easyflow-process-processFsmFilter\" class=\"com.jd.easyflow.process.client.fsm.StdProcessFsmFilter\">\n        <property name=\"processRuntimeService\" ref=\"easyflow-process-processRuntimeService\"></property>\n    </bean>\n    <bean id=\"easyflow-process-processFsmTransitionFilter\" class=\"com.jd.easyflow.process.client.fsm.StdProcessFsmTransitionFilter\">\n        <property name=\"processRuntimeService\" ref=\"easyflow-process-processRuntimeService\"></property>\n    </bean>        \n    <bean id=\"easyflow-process-processRuntimeService\" class=\"com.jd.easyflow.process.client.runtime.ProcessRuntimeService\">\n        <property name=\"manager\" ref=\"easyflow-process-processRuntimeManager\"></property>\n    </bean>\n    <bean id=\"easyflow-process-processRuntimeManager\" class=\"com.jd.easyflow.process.client.runtime.ProcessRuntimeManager\">\n    \t<property name=\"executionPersistType\" value=\"${easyflow.process.executionPersistType:NEXT}\"></property>\n    \t<property name=\"executionPersistActionResult\" value=\"${easyflow.process.executionPersistActionResult:false}\"></property>\n    \t<property name=\"exportRequestBuilder\" ref=\"easyflow-process-exportRequestBuilder\"></property>\n    </bean>\n    \n    <bean id=\"easyflow-process-processScheduleClientService\" class=\"com.jd.easyflow.process.client.schedule.ProcessScheduleClientServiceImpl\">\n        <property name=\"processEngine\">\n            <bean class=\"com.jd.easyflow.process.client.runtime.core.ProcessEngineImpl\">\n                <property name=\"flowEngine\" ref=\"easyflow-flowEngine\"></property>\n            </bean>\n        </property>\n    </bean>\n    \n    <bean id=\"easyflow-eventFlowListener\" class=\"com.jd.easyflow.flow.engine.event.impl.EventFlowListener\"/>\n    <bean id=\"easyflow-eventNodeAction\" class=\"com.jd.easyflow.flow.model.action.EventNodeAction\"/>\n    <bean id=\"easyflow-eventPostHandler\" class=\"com.jd.easyflow.flow.model.post.EventPostHandler\"/>\n    \n    <bean id=\"easyflow-process-taskFlowListener\" class=\"com.jd.easyflow.process.client.task.flow.TaskFlowListener\">\n    </bean>    \n    \n    <bean id=\"easyflow-task-taskClientManager\" class=\"com.jd.easyflow.process.client.task.service.TaskClientManager\">\n        <property name=\"processRuntimeManager\" ref=\"easyflow-process-processRuntimeManager\"></property>  \n        <property name=\"exportRequestBuilder\" ref=\"easyflow-process-exportRequestBuilder\"></property>\n    </bean>\n    \n    <bean id=\"easyflow-task-taskClientService\" class=\"com.jd.easyflow.process.client.task.service.TaskClientService\" init-method=\"init\">\n        <property name=\"processRuntimeManager\" ref=\"easyflow-process-processRuntimeManager\"></property>\n        <property name=\"taskClientManager\" ref=\"easyflow-task-taskClientManager\"></property>\n    \t<property name=\"exportRequestBuilder\" ref=\"easyflow-process-exportRequestBuilder\"></property>        \n    </bean>\n    \n    <bean id=\"easyflow-task-taskCreateNodeAction\" class=\"com.jd.easyflow.process.client.task.flow.TaskCreateNodeAction\">\n        <property name=\"processRuntimeManager\" ref=\"easyflow-process-processRuntimeManager\"></property>\n        <property name=\"taskClientService\" ref=\"easyflow-task-taskClientService\"></property>\n    </bean>\n    <bean id=\"easyflow-task-taskExecuteNodeAction\" class=\"com.jd.easyflow.process.client.task.flow.TaskExecuteNodeAction\">\n        <property name=\"processRuntimeManager\" ref=\"easyflow-process-processRuntimeManager\"></property>\n        <property name=\"taskClientService\" ref=\"easyflow-task-taskClientService\"></property>\n    </bean>\n    <bean id=\"easyflow-task-taskCreateAndExecuteNodeAction\" class=\"com.jd.easyflow.process.client.task.flow.TaskCreateAndExecuteNodeAction\">\n        <property name=\"processRuntimeManager\" ref=\"easyflow-process-processRuntimeManager\"></property>\n         <property name=\"taskClientService\" ref=\"easyflow-task-taskClientService\"></property>\n    </bean>\n    \n    <bean id=\"easyflow-task-taskEl\" class=\"com.jd.easyflow.process.client.task.util.TaskEl\"></bean>\n    <bean id=\"easyflow-process-stdFlowEl\" class=\"com.jd.easyflow.process.client.flow.util.StdFlowEl\"></bean>\n    <bean id=\"easyflow-process-elUtil\" class=\"com.jd.easyflow.process.client.util.ElUtil\"></bean>\n    \n    <bean id=\"easyflow-taskbizservice-call\" class=\"com.jd.easyflow.process.client.task.biz.impl.CallTaskBizService\"/>\n    <!-- compensate -->\n    <bean id=\"easyflow-process-compensateNodeFilter\" class=\"com.jd.easyflow.process.client.flow.compensate.StdProcessCompensateNodeFilter\">\n    \t<property name=\"processRuntimeManager\" ref=\"easyflow-process-processRuntimeManager\"></property>\n    </bean>  \n    <bean id=\"easyflow-process-compensateFlowFilter\" class=\"com.jd.easyflow.process.client.flow.compensate.StdProcessCompensateFlowFilter\">\n    \t<property name=\"processRuntimeManager\" ref=\"easyflow-process-processRuntimeManager\"></property>\n    </bean>   \n   \n</beans>"
  },
  {
    "path": "easyflow-process/easyflow-process-client/src/main/resources/easyflow/easyflow-spring-processunit-client.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:aop=\"http://www.springframework.org/schema/aop\"\n       xmlns:context=\"http://www.springframework.org/schema/context\"\n       xmlns:util=\"http://www.springframework.org/schema/util\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd\n       http://www.springframework.org/schema/aop  http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd\">\n\n    <bean id=\"easyflow-processunit-client-processUnitClient\" class=\"com.jd.easyflow.processunit.client.ProcessUnitClient\">\n        <property name=\"executor\">\n            <bean class=\"com.jd.easyflow.processunit.client.service.impl.SyncClientProcessUnitExecutor\"></bean>\n        </property>\n    </bean>\n    \n    <bean id=\"easyflow-processunit-client-processUnitClientService\" class=\"com.jd.easyflow.processunit.client.service.impl.ProcessUnitClientServiceImpl\">\n        <property name=\"asyncClientProcessUnitExecutor\">\n            <bean class=\"com.jd.easyflow.processunit.client.service.impl.AsyncClientProcessUnitExecutor\"></bean>\n        </property>\n    </bean>\n</beans>"
  },
  {
    "path": "easyflow-process/easyflow-process-common/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n    xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>easyflow-process</artifactId>\n        <groupId>com.jd.easyflow</groupId>\n        <version>1.7.3</version>\n    </parent>\n    <artifactId>easyflow-process-common</artifactId>\n    <name>easyflow-process-common</name>\n    <packaging>jar</packaging>\n    <properties>\n    </properties>\n    <dependencies>\n            <!-- Jackson -->\n        <dependency>\n            <groupId>com.fasterxml.jackson.core</groupId>\n            <artifactId>jackson-databind</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.fasterxml.jackson.core</groupId>\n            <artifactId>jackson-core</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.fasterxml.jackson.core</groupId>\n            <artifactId>jackson-annotations</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n        </dependency>   \n        <dependency>\n            <groupId>org.springframework</groupId>\n            <artifactId>spring-context</artifactId>\n        </dependency>                        \n    </dependencies>\n\n</project>"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/common/dto/BaseRequest.java",
    "content": "package com.jd.easyflow.common.dto;\n\nimport java.io.Serializable;\n\n/**\n* \n* @author liyuliang5\n*/\npublic class BaseRequest implements Serializable {\n\n    private static final long serialVersionUID = 1L;\n\n    private String reqNo;\n\n    private String operator;\n\n    public String getReqNo() {\n        return reqNo;\n    }\n\n    public void setReqNo(String reqNo) {\n        this.reqNo = reqNo;\n    }\n\n    public String getOperator() {\n        return operator;\n    }\n\n    public void setOperator(String operator) {\n        this.operator = operator;\n    }\n\n    @Override\n    public String toString() {\n        return \"BaseRequest [reqNo=\" + reqNo + \", operator=\" + operator + \"]\";\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/common/dto/BaseResponse.java",
    "content": "package com.jd.easyflow.common.dto;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n *\n */\npublic class BaseResponse implements Serializable {\n\n\n    protected String resultCode;\n\n    protected String resultMsg;\n    \n    public BaseResponse() {\n    }\n    \n    public BaseResponse(String resultCode, String resultMsg) {\n        this.resultCode = resultCode;\n        this.resultMsg = resultMsg;\n    }\n\n    public String getResultCode() {\n        return resultCode;\n    }\n\n    public void setResultCode(String resultCode) {\n        this.resultCode = resultCode;\n    }\n\n    public String getResultMsg() {\n        return resultMsg;\n    }\n\n    public void setResultMsg(String resultMsg) {\n        this.resultMsg = resultMsg;\n    }\n\n    @Override\n    public String toString() {\n        return \"BaseResponse [resultCode=\" + resultCode + \", resultMsg=\" + resultMsg + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/common/dto/DataRequest.java",
    "content": "package com.jd.easyflow.common.dto;\n\nimport java.util.Map;\n\n/**\n* \n* @author liyuliang5\n*/\npublic class DataRequest<T> extends BaseRequest {\n\n    private T requestData;\n    \n    private Map<String, Object> extData;\n\n    public T getRequestData() {\n        return requestData;\n    }\n\n    public void setRequestData(T requestData) {\n        this.requestData = requestData;\n    }\n\n    public Map<String, Object> getExtData() {\n        return extData;\n    }\n\n    public void setExtData(Map<String, Object> extData) {\n        this.extData = extData;\n    }\n\n    @Override\n    public String toString() {\n        return \"DataRequest [requestData=\" + requestData + \", extData=\" + extData + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/common/dto/DataResponse.java",
    "content": "package com.jd.easyflow.common.dto;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport com.jd.easyflow.common.util.CommonErrorCode;\n\n/**\n * \n * \n * @author liyuliang5\n */\npublic class DataResponse<T> extends BaseResponse {\n    private T resultData;\n    private Map<String, Object> extData;\n    \n    public DataResponse() {\n        \n    }\n\n    public DataResponse(String resultCode, String resultMsg, T resultData) {\n        this.resultCode = resultCode;\n        this.resultMsg = resultMsg;\n        this.resultData = resultData;\n    }\n\n    public DataResponse(T resultData) {\n        this.resultData = resultData;\n    }\n\n    public static <T> DataResponse buildSuccessResponse(T t) {\n        return new DataResponse(CommonErrorCode.E0000000.getCode(), \"SUCCESS\", t);\n    }\n    \n    public void addExtData(String key, Object value) {\n        if (extData == null) {\n            extData = new HashMap<>();\n        }\n        extData.put(key, value);\n    }\n    \n    public <T>T getExtData(String key) {\n        if (extData == null) {\n            return null;\n        }\n        return (T) extData.get(key);\n    }\n\n    public T getResultData() {\n        return resultData;\n    }\n\n    public void setResultData(T resultData) {\n        this.resultData = resultData;\n    }\n\n    public Map<String, Object> getExtData() {\n        return extData;\n    }\n\n    public void setExtData(Map<String, Object> extData) {\n        this.extData = extData;\n    }\n\n    @Override\n    public String toString() {\n        return \"DataResponse [resultData=\" + resultData + \", extData=\" + extData + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/common/dto/pager/FieldEntry.java",
    "content": "package com.jd.easyflow.common.dto.pager;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n *\n */\npublic class FieldEntry implements Serializable {\n\n    private static final long serialVersionUID = 7553262335974337343L;\n\n    private String name;\n\n    private Object value;\n\n    public FieldEntry() {\n\n    }\n\n    public FieldEntry(String name, Object value) {\n        this.name = name;\n        this.value = value;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public Object getValue() {\n        return value;\n    }\n\n    public String stringValue() {\n        return (String) value;\n    }\n\n    public void setValue(Object value) {\n        this.value = value;\n    }\n\n    @Override\n    public String toString() {\n        return \"FieldEntry [name=\" + name + \", value=\" + value + \"]\";\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/common/dto/pager/PagerCondition.java",
    "content": "package com.jd.easyflow.common.dto.pager;\n\nimport java.io.Serializable;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * @author liyuliang5\n *\n */\npublic class PagerCondition implements Serializable {\n\n    private static final long serialVersionUID = 7553262335974337343L;\n\n    private long start = -1;\n\n    private int pageSize = -1;\n\n    private long pageIndex = -1;\n\n    private List<FieldEntry> fieldList = new ArrayList<FieldEntry>();\n\n    private List<SortEntry> sortList = new ArrayList<SortEntry>();\n\n    private boolean count = true;\n\n    private Boolean page = true;\n    \n    private Map<String, Object> extData;\n\n    public PagerCondition() {\n\n    }\n\n    public PagerCondition(long pageIndex, int pageSize) {\n        this.pageIndex = pageIndex;\n        this.start = (pageIndex - 1) * pageSize;\n        this.pageSize = pageSize;\n    }\n\n    public void addSortField(String key, long seq, String order) {\n        if (sortList == null) {\n            sortList = new ArrayList<SortEntry>();\n        }\n        SortEntry sortEntry = new SortEntry(key, seq, order);\n        sortList.add(sortEntry);\n    }\n\n    public long getPageIndex() {\n        return pageIndex;\n    }\n\n    @Deprecated\n    public void setPageIndex(long pageIndex) {\n        this.pageIndex = pageIndex;\n    }\n\n    public FieldEntry field(String name) {\n        return getField(name);\n    }\n\n    public FieldEntry getField(String name) {\n        if (fieldList != null) {\n            for (FieldEntry entry : fieldList) {\n                if (name.equals(entry.getName())) {\n                    return entry;\n                }\n            }\n        }\n        return null;\n    }\n\n\n    public Map<String, FieldEntry> getFieldMap() {\n        Map<String, FieldEntry> map = new HashMap<String, FieldEntry>(fieldList.size());\n        fieldList.forEach(entry -> map.put(entry.getName(), entry));\n        return map;\n    }\n\n    public Map<String, SortEntry> getSortMap() {\n        Map<String, SortEntry> map = new HashMap<String, SortEntry>(sortList.size());\n        sortList.forEach(entry -> map.put(entry.getKey(), entry));\n        return map;\n    }\n\n    public void addField(FieldEntry entry) {\n        fieldList.add(entry);\n    }\n\n    public void addSort(SortEntry entry) {\n        sortList.add(entry);\n    }\n\n    public SortEntry sort(String name) {\n        return getSort(name);\n    }\n\n    public SortEntry getSort(String name) {\n        for (SortEntry entry : sortList) {\n            if (name.equals(entry.getKey())) {\n                return entry;\n            }\n        }\n        return null;\n    }\n\n    public long getStart() {\n        if (start == -1) {\n            start = (pageIndex - 1) * pageSize;\n        }\n        return start;\n    }\n\n    public Boolean getPage() {\n        return page;\n    }\n\n    public void setPage(Boolean page) {\n        this.page = page;\n    }\n\n    public List<FieldEntry> getFieldList() {\n        return fieldList;\n    }\n\n    public void setFieldList(List<FieldEntry> fieldList) {\n        this.fieldList = fieldList;\n    }\n\n    public void setStart(long start) {\n        this.start = start;\n    }\n\n    public int getPageSize() {\n        return pageSize;\n    }\n\n    public void setPageSize(int pageSize) {\n        this.pageSize = pageSize;\n    }\n\n    public List<SortEntry> getSortList() {\n        return sortList;\n    }\n\n    public void setSortList(List<SortEntry> sortList) {\n        this.sortList = sortList;\n    }\n\n    public boolean isCount() {\n        return count;\n    }\n\n    public void setCount(boolean count) {\n        this.count = count;\n    }\n    \n    public void putExtData(String key, Object value) {\n        if (extData == null) {\n            extData = new HashMap<>();\n        }\n        extData.put(key, value);\n    }\n    \n    public <T>T getExtData(String key) {\n        if (extData == null) {\n            return null;\n        }\n        return (T) extData.get(key);\n    }\n\n    public Map<String, Object> getExtData() {\n        return extData;\n    }\n\n    public void setExtData(Map<String, Object> extData) {\n        this.extData = extData;\n    }\n\n    @Override\n    public String toString() {\n        return \"PagerCondition [start=\" + start + \", pageSize=\" + pageSize + \", pageIndex=\" + pageIndex + \", fieldList=\"\n                + fieldList + \", sortList=\" + sortList + \", count=\" + count + \", page=\" + page + \", extData=\" + extData\n                + \"]\";\n    }\n    \n    \n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/common/dto/pager/PagerConditionHelper.java",
    "content": "package com.jd.easyflow.common.dto.pager;\n\nimport java.util.Arrays;\nimport java.util.List;\n\n/**\n * @author liyuliang5\n *\n */\npublic class PagerConditionHelper {\n\n    public static PagerCondition setValueType(PagerCondition condition, String fieldName, Class<?> clazz) {\n        FieldEntry fieldEntry = condition.getField(fieldName);\n        if (fieldEntry == null) {\n            return condition;\n        }\n        Object value = fieldEntry.getValue();\n        if (value == null) {\n            return condition;\n        }\n        if (clazz == String[].class) {\n           if (value instanceof String[]) {\n               return condition;\n           }\n           fieldEntry.setValue(new String[] {String.valueOf(value)});\n           return condition;\n        } else if (clazz == List.class) {\n            if (value instanceof List) {\n                return condition;\n            } else if (value instanceof String[]) {\n                List<String> list = Arrays.asList((String[]) value);\n                fieldEntry.setValue(list);\n            } else {\n                fieldEntry.setValue(Arrays.asList(value));\n            }\n            return condition;\n        }\n        throw new UnsupportedOperationException(\"Unsupported class:\" + clazz.getName());\n    }\n    \n    public static <T>T getValue(PagerCondition condition, String fieldName) {\n        FieldEntry entry = condition.getField(fieldName);\n        if (entry == null) {\n            return null;\n        }\n        return (T) entry.getValue();\n    }\n    \n    public static String getStringValue(PagerCondition condition, String fieldName) {\n        return (String) getValue(condition, fieldName);\n    }\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/common/dto/pager/PagerResult.java",
    "content": "package com.jd.easyflow.common.dto.pager;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * @author liyuliang5\n *\n */\npublic class PagerResult<T> implements Serializable {\n\n\tprivate static final long serialVersionUID = 1L;\n\n\tprivate Long count;\n\n    private List<T> list;\n\n    private int pageNum;\n\n    private int pageSize;\n\n    private int pages;\n\n\n    public PagerResult() {\n    }\n\n    public PagerResult(List<T> list) {\n        this.list = list;\n    }\n\n    public PagerResult(Long count, List<T> list) {\n        this.count = count;\n        this.list = list;\n    }\n\n    public PagerResult(Long count, List<T> list,int pageNum,int pageSize) {\n        this.count = count;\n        this.list = list;\n        this.pageNum = pageNum;\n        this.pageSize = pageSize;\n    }\n\n    public Long getCount() {\n        return count;\n    }\n\n    public void setCount(Long count) {\n        this.count = count;\n    }\n\n    public List<T> getList() {\n        return list;\n    }\n\n    public void setList(List<T> list) {\n        this.list = list;\n    }\n\n\n    public int getPageNum() {\n        return pageNum;\n    }\n\n    public void setPageNum(int pageNum) {\n        this.pageNum = pageNum;\n    }\n\n    public int getPageSize() {\n        return pageSize;\n    }\n\n    public void setPageSize(int pageSize) {\n        this.pageSize = pageSize;\n    }\n\n    public int getPages() {\n        if (count== null || pageSize < 1){\n            return 0;\n        }\n        int totalPages = (int) (count / pageSize);\n        if (count % pageSize != 0){\n            totalPages ++;\n        }\n        return totalPages;\n    }\n\n    @Override\n    public String toString() {\n        return \"PagerResult [count=\" + count + \", list=\" + list + \", pageNum=\" + pageNum + \", pageSize=\" + pageSize\n                + \", pages=\" + pages + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/common/dto/pager/SortEntry.java",
    "content": "package com.jd.easyflow.common.dto.pager;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n *\n */\npublic class SortEntry implements Comparable<SortEntry>, Serializable {\n\n    private static final long serialVersionUID = 9034251346323773481L;\n\n    /**\n     * ORDER ASC\n     */\n    public static final String ASC = \"asc\";\n\n    /**\n     * ORDER DESC\n     */\n    public static final String DESC = \"desc\";\n\n    /**\n     * Input key\n     */\n    private String key;\n\n    /**\n     * Input type\n     */\n    private String type = ASC;\n\n    private long seq;\n    \n    public SortEntry() {\n        \n    }\n\n    public SortEntry(String key, String type) {\n        this.key = key;\n        this.type = type;\n    }\n\n    public SortEntry(String key, long seq, String type) {\n        this.key = key;\n        this.type = type;\n        this.seq = seq;\n    }\n\n    public String getKey() {\n        return key;\n    }\n\n    public void setKey(String key) {\n        this.key = key;\n    }\n\n    public String getType() {\n        return type;\n    }\n\n    public void setType(String type) {\n        this.type = type;\n    }\n\n    public long getSeq() {\n        return seq;\n    }\n\n    public void setSeq(long seq) {\n        this.seq = seq;\n    }\n\n    @Override\n    public int compareTo(SortEntry o) {\n        if (o.getSeq() == this.getSeq()) {\n            return 0;\n        }\n        if (this.getSeq() > o.getSeq()) {\n            return 1;\n        }\n        return -1;\n    }\n\n    @Override\n    public int hashCode() {\n        return super.hashCode();\n    }\n\n    @Override\n    public boolean equals(Object obj) {\n        return super.equals(obj);\n    }\n\n    @Override\n    public String toString() {\n        return \"SortEntry [key=\" + key + \", type=\" + type + \", seq=\" + seq + \"]\";\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/common/exception/EasyFlowException.java",
    "content": "package com.jd.easyflow.common.exception;\n\n/**\n * @author liyuliang5\n *\n */\npublic class EasyFlowException extends RuntimeException {\n    \n    private static final long serialVersionUID = 3772032165336446312L;\n\n    private static final String DEFAULT_ERROR_CODE = \"9999999\";\n\n    private String code;\n\n    private String info;\n    \n    private Object data;\n\n    public String getCode() {\n        return code;\n    }\n\n    public void setCode(String code) {\n        this.code = code;\n    }\n\n    public EasyFlowException(Throwable cause, String code, String info, Object... objects) {\n        super((code == null ? DEFAULT_ERROR_CODE : code + \" \")\n                + (info != null && objects != null && objects.length > 0 ? String.format(info, objects) : info), cause);\n        this.code = code == null ? DEFAULT_ERROR_CODE : code;\n        this.info = info != null && objects != null && objects.length > 0 ? String.format(info, objects) : info;\n    }\n\n    public EasyFlowException(String code, String info) {\n        this(null, code, info);\n    }\n\n    public EasyFlowException(String info) {\n        this(null, info);\n    }\n\n    public EasyFlowException(Throwable cause) {\n        this(cause, null, null);\n    }\n\n    public EasyFlowException(String info, Throwable cause) {\n        this(cause, null, info);\n    }\n\n    public EasyFlowException(String code, String info, Throwable cause) {\n        this(cause, code, info);\n    }\n\n    public String getInfo() {\n        return info;\n    }\n\n    public void setInfo(String info) {\n        this.info = info;\n    }\n\n    public Object getData() {\n        return data;\n    }\n\n    public void setData(Object data) {\n        this.data = data;\n    }\n    \n    \n\n}\n\n\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/common/exception/UserException.java",
    "content": "package com.jd.easyflow.common.exception;\n\nimport com.jd.easyflow.common.util.CommonErrorCode;\n\n/**\n * @author liyuliang5\n *\n */\npublic class UserException extends EasyFlowException {\n\n    public UserException(Throwable cause, String code, String info, Object... objects) {\n        super(cause, null == code ? CommonErrorCode.E0000001.getCode() : code, info, objects);\n    }\n\n    public UserException(String code, String info) {\n        this(null, code, info);\n    }\n\n    public UserException(String info) {\n        this(CommonErrorCode.E0000001.getCode(), info);\n    }\n\n    public UserException(Throwable cause) {\n        this(cause, null, null);\n    }\n\n    public UserException(String info, Throwable cause) {\n        this(cause, null, info);\n    }\n\n    public UserException(String code, String info, Throwable cause) {\n        this(cause, code, info);\n    }\n\n}"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/common/exception/util/ExceptionUtil.java",
    "content": "package com.jd.easyflow.common.exception.util;\n\n/**\n * @author liyuliang5\n */\npublic class ExceptionUtil {\n\n    /**\n     * @param t\n     * @return\n     */\n    public static RuntimeException throwException(Throwable t) {\n        if (t == null) {\n            throw new NullPointerException(\"Exception is null\");\n        }\n        return throw0(t);\n    }\n\n    private static <T extends Throwable> T throw0(Throwable t) throws T {\n        throw (T) t;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/common/util/AssertUtils.java",
    "content": "package com.jd.easyflow.common.util;\n\nimport org.slf4j.helpers.MessageFormatter;\n\nimport com.jd.easyflow.common.exception.UserException;\n\npublic class AssertUtils {\n\n    public static IAssertUtils TIPS = (e, p) ->{\n        throw new UserException(CommonErrorCode.E0000001.getCode(), MessageFormatter.arrayFormat(e, p).getMessage());\n    };\n\n    public static void isTrue(boolean expression, String message, Object... params) {\n        IAssertUtils.DEFAULT.isTrue(expression, message, params);\n    }\n\n    public static void isTrue(boolean expression) {\n        IAssertUtils.DEFAULT.isTrue(expression);\n    }\n\n    public static void isFalse(boolean expression, String message, Object... params) {\n        IAssertUtils.DEFAULT.isFalse(expression, message, params);\n    }\n\n    public static void isFalse(boolean expression) {\n        IAssertUtils.DEFAULT.isFalse(expression);\n    }\n\n    public static void isNull(Object object, String message, Object... params) {\n        IAssertUtils.DEFAULT.isNull(object, message, params);\n    }\n\n    public static void isNull(Object object) {\n        IAssertUtils.DEFAULT.isNull(object);\n    }\n\n    public static void isNotNull(Object object, String message, Object... params) {\n        IAssertUtils.DEFAULT.isNotNull(object, message, params);\n    }\n\n    public static void isNotNull(Object object) {\n        IAssertUtils.DEFAULT.isNotNull(object);\n    }\n\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/common/util/CommonErrorCode.java",
    "content": "package com.jd.easyflow.common.util;\n\n/**\n *\n * @author liyuliang5\n */\npublic enum CommonErrorCode {\n    E0000000(\"Success\"),\n    E0000001(\"Fail\"),\n    E0000002(\"Validate not pass\"),\n    E0000003(\"Record exists\"),\n    E0000004(\"Record not exists\"),\n    E0000005(\"Field is empty\"),\n    E0000006(\"Not login\"),\n    E0000007(\"RPC invoke exception\"),\n    E0000008(\"Field validate unpass\"),\n    E0000010(\"Enum validate exception\"),\n    E0000009(\"Cache service exception\"),\n    E0000012(\"No auth\"),\n\n    E9999999(\"System exception\");\n\n    private String desc;\n    private String showMessage;\n\n    CommonErrorCode(String desc) {\n        this.desc = desc;\n        this.showMessage = desc;\n    }\n\n    CommonErrorCode(String desc, String showMessage) {\n        this.desc = desc;\n        this.showMessage = showMessage;\n    }\n\n    public static CommonErrorCode getEnum(String code) {\n        for (CommonErrorCode a : CommonErrorCode.values()) {\n            if (a.name().substring(1).equals(code)) {\n                return a;\n            }\n        }\n        throw new IllegalArgumentException(\"No enum code '\" + code + \"'. \" + CommonErrorCode.class);\n    }\n\n    public String getCode() {\n        return name().substring(1);\n    }\n\n    public String getDesc() {\n        return desc;\n    }\n\n    public String getShowMessage() {\n        return showMessage == null ? desc : showMessage;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/common/util/IAssertUtils.java",
    "content": "package com.jd.easyflow.common.util;\n\nimport org.slf4j.helpers.MessageFormatter;\n\nimport com.jd.easyflow.common.exception.EasyFlowException;\n\n@FunctionalInterface\npublic interface IAssertUtils {\n\n    IAssertUtils DEFAULT = (e, p) ->{\n        throw new EasyFlowException(CommonErrorCode.E0000001.getCode(), MessageFormatter.arrayFormat(e, p).getMessage());\n    };\n\n    void error(String message, Object... params);\n\n    default void isTrue(boolean expression, String message, Object... params) {\n        if (!expression) {\n            error(message, params);\n        }\n    }\n\n    default void isTrue(boolean expression) {\n        isTrue(expression, \"this expression must be true\");\n    }\n\n    default void isFalse(boolean expression, String message, Object... params) {\n        if (expression) {\n            error(message, params);\n        }\n    }\n\n    default void isFalse(boolean expression) {\n        isFalse(expression, \"this expression must be true\");\n    }\n\n    default void isNull(Object object, String message, Object... params) {\n        if (object != null) {\n            error(message, params);\n        }\n    }\n\n    default void isNull(Object object) {\n        isNull(object, \"the object argument must be null\");\n    }\n\n    default void isNotNull(Object object, String message, Object... params) {\n        if (object == null) {\n            error(message, params);\n        }\n    }\n\n    default void isNotNull(Object object) {\n        isNotNull(object, \"this argument is required; it must not be null\");\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/common/util/MessageUtil.java",
    "content": "package com.jd.easyflow.common.util;\n\nimport java.util.Locale;\n\nimport org.springframework.context.MessageSource;\nimport org.springframework.context.i18n.LocaleContextHolder;\n\nimport com.jd.easyflow.objects.factory.ObjectFactorys;\n\n/**\n * \n * @author liyuliang5\n */\npublic class MessageUtil {\n\n    private static MessageSource messageSource;\n\n    public static String getMessage(String code) {\n        return getMessageSource().getMessage(code, null, null);\n    }\n    \n    public static String getMessage(String code, Object[] args) {\n        return getMessageSource().getMessage(code, args, LocaleContextHolder.getLocale());\n    }\n\n    private static MessageSource getMessageSource() {\n        if (messageSource == null) {\n            messageSource = ObjectFactorys.getDefault().getObject(MessageSource.class);\n        }\n        return messageSource;\n    }\n    \n    public static String locale() {\n        Locale locale = LocaleContextHolder.getLocale();\n        if (locale == null) {\n            return null;\n        }\n        return locale.toString();\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/common/util/UUIDUtil.java",
    "content": "package com.jd.easyflow.common.util;\n\nimport java.util.UUID;\n\n/**\n * @author liyuliang5\n *\n */\npublic class UUIDUtil {\n\n\n    public static String getUUID() {\n        return UUID.randomUUID().toString().trim();\n    }\n\n    public static String getSimpleUUID() {\n        return UUID.randomUUID().toString().trim().replaceAll(\"-\", \"\");\n    }\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/el/ElEvaluator.java",
    "content": "package com.jd.easyflow.el;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic interface ElEvaluator {\n\n    /**\n     * Evaluate with default context.\n     * \n     * @param <T>\n     * @param exp\n     * @param root\n     * @param cache\n     * @return\n     */\n    <T> T evalWithDefaultContext(String exp, Object root, boolean cache);\n\n    default String evalTemplateWithDefaultContext(String template, Object root, boolean cache) {\n        return evalWithDefaultContext(template, root, cache);\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/el/ElFactory.java",
    "content": "package com.jd.easyflow.el;\n\nimport java.util.Map;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ElFactory {\n    \n    private static Map<String, ElEvaluator> evaluatorMap;\n    \n    private static ElEvaluator defaultEvaluator = new SpelEvaluator();\n    \n    public static ElEvaluator get() {\n        return defaultEvaluator;\n    }\n\n    public static ElEvaluator get(String type) {\n        if (type == null) {\n            return defaultEvaluator;\n        }\n        return evaluatorMap.get(type);\n    }\n    \n    public static void setDefaultEvaluator(ElEvaluator evaluator) {\n        defaultEvaluator = evaluator;\n    }\n    \n    \n    public static Map<String, ElEvaluator> getEvaluatorMap() {\n        return evaluatorMap;\n    }\n\n    public static void setEvaluatorMap(Map<String, ElEvaluator> evaluatorMap) {\n        ElFactory.evaluatorMap = evaluatorMap;\n    }\n\n    public void setDefault(ElEvaluator evaluator) {\n        ElFactory.defaultEvaluator = evaluator;\n    }\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/el/SpelEvaluator.java",
    "content": "package com.jd.easyflow.el;\n\nimport com.jd.easyflow.spel.SpelHelper;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class SpelEvaluator implements ElEvaluator {\n    \n    @Override\n    public <T> T evalWithDefaultContext(String exp, Object root, boolean cache) {\n        return SpelHelper.evalWithDefaultContext(exp, root, cache);\n    }\n    \n    @Override\n    public String evalTemplateWithDefaultContext(String template, Object context, boolean cache) {\n        return SpelHelper.evalTemplateWithDefaultContext(template, context, cache);\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/message/BaseMessageListener.java",
    "content": "package com.jd.easyflow.message;\n\nimport java.lang.reflect.ParameterizedType;\nimport java.util.List;\nimport java.util.Optional;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.common.exception.EasyFlowException;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic abstract class BaseMessageListener<T> implements MessageListener {\n    \n    private Logger logger = LoggerFactory.getLogger(this.getClass());\n\n    private boolean exceptionConsume;\n    \n    @Override\n    public void onMessage(List<Message> messages) {\n        for (Message message : messages) {\n            onMessage(message);\n        }\n    }\n    \n    public void onMessage(Message message) {\n        T request = null;\n        try {\n            Optional<ParameterizedType> genericSuperclass = Optional\n                    .ofNullable(((ParameterizedType) getClass().getGenericSuperclass()));\n            if (genericSuperclass.isPresent()) {\n                request = JSON.parseObject(message.getText(),\n                        (Class<T>) (genericSuperclass.get().getActualTypeArguments()[0]));\n            } else {\n                throw new EasyFlowException(\"Message JSON parse exception\");\n            }\n        } catch (Exception e) {\n            logger.error(\"Message JSON parse exception, content:\" + message.getText(), e);\n            return;\n        }\n\n        if (!validate(request, message)) {\n            return;\n        }\n        logger.info(\"Start process message,topic:{}, bizId:{}, content:{}\", message.getMsgTopic(), message.getMsgTopic(), message.getText());\n        try {\n            process(request, message);\n        } catch (Exception e) {\n            logger.error(\"message[\" + message.getText() + \"] process exception, \" + e.getMessage(), e);\n            if (exceptionConsume) {\n                logger.warn(\"Message process exception, exceptionConsume is true, no retry\");\n            } else {\n                throw e;\n            }\n        }\n    }\n    \n    public abstract boolean validate( T obj, Message message);\n\n    public abstract void process(T obj, Message message);\n\n    public boolean isExceptionConsume() {\n        return exceptionConsume;\n    }\n\n    public void setExceptionConsume(boolean exceptionConsume) {\n        this.exceptionConsume = exceptionConsume;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/message/Message.java",
    "content": "package com.jd.easyflow.message;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class Message {\n    \n    String bizId;\n    \n    String msgTopic;\n    \n    String text;\n    \n    public Message() {\n        // NOOP\n    }\n    \n    public Message(String bizId, String msgTopic, String text) {\n        this.bizId = bizId;\n        this.msgTopic = msgTopic;\n        this.text = text;\n    }\n\n    public String getBizId() {\n        return bizId;\n    }\n\n    public void setBizId(String bizId) {\n        this.bizId = bizId;\n    }\n\n    public String getMsgTopic() {\n        return msgTopic;\n    }\n\n    public void setMsgTopic(String msgTopic) {\n        this.msgTopic = msgTopic;\n    }\n\n    public String getText() {\n        return text;\n    }\n\n    public void setText(String text) {\n        this.text = text;\n    }\n    \n    \n \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/message/MessageListener.java",
    "content": "package com.jd.easyflow.message;\n\nimport java.util.List;\n\n/**\n * @author liyuliang5\n *\n */\npublic interface MessageListener {\n    \n    void onMessage(List<Message> message);\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/message/MessageSendService.java",
    "content": "package com.jd.easyflow.message;\n\n/**\n * @author liyuliang5\n *\n */\npublic interface MessageSendService {\n    \n    void sendMessage(Message message);\n    \n    void sendMessage(Message message, int timeoutMillis);\n    \n    default void sendMessage(String bizId, String msgTopic, String text) {\n        sendMessage(new Message(bizId, msgTopic, text));\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/message/impl/NoopMessageSendServiceImpl.java",
    "content": "package com.jd.easyflow.message.impl;\n\nimport com.jd.easyflow.message.Message;\nimport com.jd.easyflow.message.MessageSendService;\n\n/**\n * @author liyuliang5\n *\n */\npublic class NoopMessageSendServiceImpl implements MessageSendService {\n\n    @Override\n    public void sendMessage(Message message) {\n        // NOOP\n    }\n\n    @Override\n    public void sendMessage(Message message, int timeoutMillis) {\n        // NOOP\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/message/spring/EventMessage.java",
    "content": "package com.jd.easyflow.message.spring;\n\nimport org.springframework.context.ApplicationEvent;\n\n/**\n * @author liyuliang5\n *\n */\npublic class EventMessage extends ApplicationEvent {\n    \n    private String bizId;\n    \n    private String messageTopic;\n    \n    private String text;\n\n    public EventMessage(Object source) {\n        super(source);\n    }\n\n    public String getBizId() {\n        return bizId;\n    }\n\n    public void setBizId(String bizId) {\n        this.bizId = bizId;\n    }\n\n    public String getMessageTopic() {\n        return messageTopic;\n    }\n\n    public void setMessageTopic(String messageTopic) {\n        this.messageTopic = messageTopic;\n    }\n\n    public String getText() {\n        return text;\n    }\n\n    public void setText(String text) {\n        this.text = text;\n    }\n\n    @Override\n    public String toString() {\n        return \"EventMessage [bizId=\" + bizId + \", messageTopic=\" + messageTopic + \", text=\" + text + \"]\";\n    }\n    \n    \n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/message/spring/EventMessageListener.java",
    "content": "package com.jd.easyflow.message.spring;\n\nimport java.util.Arrays;\nimport java.util.Map;\nimport java.util.concurrent.Executor;\nimport java.util.concurrent.Executors;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.context.ApplicationListener;\n\nimport com.jd.easyflow.message.Message;\nimport com.jd.easyflow.message.MessageListener;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class EventMessageListener implements ApplicationListener<EventMessage> {\n\n    protected Logger logger = LoggerFactory.getLogger(this.getClass());\n\n    private Map<String, com.jd.easyflow.message.MessageListener> messageListenerMap;\n\n    private Executor executor = Executors.newCachedThreadPool();\n\n    @Override\n    public void onApplicationEvent(EventMessage event) {\n        MessageListener messageListener = messageListenerMap.get(event.getMessageTopic());\n        if (messageListener == null) {\n            logger.warn(\"topic:\" + event.getMessageTopic() + \" has no listener\");\n            return;\n        }\n        executor.execute(() -> {\n            messageListener\n                    .onMessage(Arrays.asList(new Message(event.getBizId(), event.getMessageTopic(), event.getText())));\n        });\n    }\n\n    public Map<String, com.jd.easyflow.message.MessageListener> getMessageListenerMap() {\n        return messageListenerMap;\n    }\n\n    public void setMessageListenerMap(Map<String, com.jd.easyflow.message.MessageListener> messageListenerMap) {\n        this.messageListenerMap = messageListenerMap;\n    }\n\n    public Executor getExecutor() {\n        return executor;\n    }\n\n    public void setExecutor(Executor executor) {\n        this.executor = executor;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/message/spring/SpringMessageSendServiceImpl.java",
    "content": "package com.jd.easyflow.message.spring;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.context.ApplicationEventPublisher;\nimport org.springframework.context.ApplicationEventPublisherAware;\n\nimport com.jd.easyflow.message.Message;\nimport com.jd.easyflow.message.MessageSendService;\n\n/**\n * @author liyuliang5\n *\n */\npublic class SpringMessageSendServiceImpl implements MessageSendService,ApplicationEventPublisherAware  {\n    \n    private static final Logger log = LoggerFactory.getLogger(SpringMessageSendServiceImpl.class);\n\n\n    private ApplicationEventPublisher applicationEventPublisher;\n\n    @Override\n    public void sendMessage(Message message) {\n        EventMessage eventMessage = new EventMessage(message.getMsgTopic());\n        eventMessage.setBizId(message.getBizId());\n        eventMessage.setMessageTopic(message.getMsgTopic());\n        eventMessage.setText(message.getText());\n        log.info(\"Spring send message messageTopic:{},bizId:{},text:{}\", message.getMsgTopic(), message.getBizId(),\n                message.getText());\n        applicationEventPublisher.publishEvent(eventMessage);\n        log.info(\"Spring send message end\");\n    }\n\n    @Override\n    public void sendMessage(Message message, int timeoutMillis) {\n        log.info(\"spring send message has no timeout\");\n        sendMessage(message);\n    }\n\n    @Override\n    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {\n        this.applicationEventPublisher = applicationEventPublisher;\n    }\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/message/util/MsgBizIdWrapper.java",
    "content": "package com.jd.easyflow.message.util;\n\nimport java.util.Set;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class MsgBizIdWrapper {\n\n    private static MsgBizIdWrapper DEFAULT_INSTANCE = new MsgBizIdWrapper();\n\n    private Set<String> wrapTopics;\n\n    private String bizIdPrefix;\n\n    public static MsgBizIdWrapper getDefaultInstance() {\n        return DEFAULT_INSTANCE;\n    }\n\n    public String wrap(String bizId, String topic) {\n        if (bizId == null) {\n            return null;\n        }\n        if (bizIdPrefix != null && bizIdPrefix.length() > 0 && wrapTopics != null && wrapTopics.contains(topic)) {\n            return bizIdPrefix + bizId;\n        }\n        return bizId;\n    }\n\n    public boolean wrapCheck(String bizId, String topic) {\n        if (bizId == null) {\n            return true;\n        }\n        if (bizIdPrefix != null && bizIdPrefix.length() > 0 && wrapTopics != null && wrapTopics.contains(topic)) {\n            if (!bizId.startsWith(bizIdPrefix)) {\n                return false;\n            }\n        }\n        return true;\n\n    }\n\n    public String unwrap(String bizId, String topic) {\n        if (bizId == null) {\n            return null;\n        }\n        if (bizIdPrefix != null && bizIdPrefix.length() > 0 && wrapTopics != null && wrapTopics.contains(topic)) {\n            if (!bizId.startsWith(bizIdPrefix)) {\n                return null;\n            }\n            return bizId.substring(bizIdPrefix.length());\n        }\n        return bizId;\n\n    }\n\n    public Set<String> getWrapTopics() {\n        return wrapTopics;\n    }\n\n    public void setWrapTopics(Set<String> wrapTopics) {\n        this.wrapTopics = wrapTopics;\n    }\n\n    public String getBizIdPrefix() {\n        return bizIdPrefix;\n    }\n\n    public void setBizIdPrefix(String bizIdPrefix) {\n        this.bizIdPrefix = bizIdPrefix;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/net/NetUtils.java",
    "content": "package com.jd.easyflow.net;\n\nimport java.net.InetAddress;\nimport java.net.NetworkInterface;\nimport java.net.SocketException;\nimport java.util.ArrayList;\nimport java.util.Enumeration;\nimport java.util.List;\nimport java.util.regex.Pattern;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class NetUtils {\n\n    private static final Logger log = LoggerFactory.getLogger(NetUtils.class);\n\n    private static final String SYSTEM_PROPERTY_KEY = \"easyflow.host.address\";\n\n    private static final String SYSTEM_ENV_KEY = \"EASYFLOW_HOST_ADDRESS\";\n\n    public static final String ANYHOST = \"0.0.0.0\";\n    private static final Pattern LOCAL_IP_PATTERN = Pattern.compile(\"127(\\\\.\\\\d{1,3}){3}$\");\n    public static final Pattern IPV4_PATTERN = Pattern\n            .compile(\"^(25[0-5]|2[0-4]\\\\d|[0-1]?\\\\d?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|[0-1]?\\\\d?\\\\d)){3}$\");\n    \n    private static String sysIp;\n\n    static {\n        sysIp = NetUtils.getLocalHost();\n    }\n\n    public static String getSysIp() {\n        return sysIp;\n    }\n\n    public static boolean isLocalHost(String host) {\n        return isNotEmpty(host)\n                && (LOCAL_IP_PATTERN.matcher(host).matches() || \"localhost\".equalsIgnoreCase(host));\n    }\n\n    public static boolean isAnyHost(String host) {\n        return \"0.0.0.0\".equals(host);\n    }\n\n    public static boolean isIPv4Host(String host) {\n        return isNotEmpty(host) && IPV4_PATTERN.matcher(host).matches();\n    }\n\n    private static boolean isValidAddress(InetAddress address) {\n        if (address != null && !address.isLoopbackAddress()) {\n            String name = address.getHostAddress();\n            return name != null && !isAnyHost(name) && !isLocalHost(name) && isIPv4Host(name);\n        } else {\n            return false;\n        }\n    }\n\n    public static String getLocalHost() {\n        List<String> ipList = getLocalIpList();\n        String sysIp = getLocalIpFromSystemProperty(ipList);\n        if (isNotEmpty(sysIp)) {\n            return sysIp;\n        }\n        sysIp = getLocalIpFromSystemEnv(ipList);\n        if (isNotEmpty(sysIp)) {\n            return sysIp;\n        }\n        sysIp = getLocalIpFromLocalHost();\n        if (isNotEmpty(sysIp)) {\n            return sysIp;\n        }\n        if (ipList.size() > 0) {\n            log.info(\"local machine IP:\" + ipList.get(0));\n            return ipList.get(0);\n        } else {\n            log.warn(\"local machine ip is empty\");\n            return \"\";\n        }\n    }\n\n    /**\n     * \n     * @return\n     */\n    private static List<String> getLocalIpList() {\n        List<String> ipList = new ArrayList<>();\n        Enumeration<NetworkInterface> netInterfaces = null;\n        try {\n            InetAddress ip = null;\n            netInterfaces = NetworkInterface.getNetworkInterfaces();\n            if (netInterfaces != null) {\n                while (netInterfaces.hasMoreElements()) {\n                    NetworkInterface ni = netInterfaces.nextElement();\n                    Enumeration<InetAddress> ips = ni.getInetAddresses();\n                    while (ips.hasMoreElements()) {\n                        ip = ips.nextElement();\n                        if (isValidAddress(ip)) {\n                            ipList.add(ip.getHostAddress());\n                        }\n                    }\n                }\n\n            }\n            if (log.isDebugEnabled()) {\n                log.debug(\"Local machine ip list:\" + ipList);\n            }\n        } catch (SocketException e) {\n            log.error(\"Get ip of local machine exception\", e);\n        }\n        return ipList;\n    }\n\n    /**\n     * \n     * @param localIpList\n     * @return\n     */\n    private static String getLocalIpFromSystemProperty(List<String> localIpList) {\n        String ipInSystemProperty = System.getProperty(SYSTEM_PROPERTY_KEY);\n        if (isNotEmpty(ipInSystemProperty)) {\n            if (localIpList.contains(ipInSystemProperty)) {\n                log.info(\"System config local IP:\" + ipInSystemProperty);\n                return ipInSystemProperty;\n            } else {\n                throw new IllegalArgumentException(\"System config IP\" + ipInSystemProperty + \" not in ip list, ipList:\" + localIpList);\n            }\n        }\n        return null;\n    }\n\n    /**\n     * \n     * @param localIpList\n     * @return\n     */\n    private static String getLocalIpFromSystemEnv(List<String> localIpList) {\n        String ipInEnv = System.getenv(SYSTEM_ENV_KEY);\n        if (isNotEmpty(ipInEnv)) {\n            if (localIpList.contains(ipInEnv)) {\n                log.info(\"env local IP:\" + ipInEnv);\n                return ipInEnv;\n            } else {\n                throw new IllegalArgumentException(\"env local IP\" + ipInEnv + \" not in ip list, ipList:\" + localIpList);\n            }\n        }\n        return null;\n    }\n\n    /**\n     * \n     * @param localIpList\n     * @return\n     */\n    private static String getLocalIpFromLocalHost() {\n        InetAddress localAddress = null;\n        try {\n            localAddress = InetAddress.getLocalHost();\n            if (isValidAddress(localAddress)) {\n                log.info(\"LocalHost IP is:\" + localAddress.getHostAddress());\n                return localAddress.getHostAddress();\n            }\n            return null;\n        } catch (Throwable t) {\n            log.warn(\"Get local ip exception: \" + t.getMessage(), t);\n            return null;\n        }\n    }\n    \n    private static boolean isNotEmpty(String cs) {\n        return cs != null && cs.length() > 0;\n    }\n}"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/objects/factory/DefaultObjectFactory.java",
    "content": "package com.jd.easyflow.objects.factory;\n\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.common.exception.EasyFlowException;\nimport com.jd.easyflow.properties.PropertiesAccessor;\nimport com.jd.easyflow.properties.classpath.ClassPathPropertiesAccessor;\n\n/**\n * @author liyuliang5\n *\n */\npublic class DefaultObjectFactory implements ObjectFactory {\n    \n    private static final Logger log = LoggerFactory.getLogger(DefaultObjectFactory.class);\n\n    private static final String KEY_SEPERATOR = \" \";\n\n    private String configPath = \"/config/objectProvider.properties\";\n\n    /**\n     * key: objectClassName--providerId--serviceId\n     */\n    private ConcurrentHashMap<String, Object> cache = new ConcurrentHashMap<>();\n\n    private Map<String, ObjectProvider> providerMap = new ConcurrentHashMap<>();\n    \n    private PropertiesAccessor propertiesAccessor;\n\n    public void init() {\n        if (propertiesAccessor == null) {\n            propertiesAccessor = new ClassPathPropertiesAccessor(configPath);\n            ((ClassPathPropertiesAccessor) propertiesAccessor).init();\n        }\n    }\n\n    @Override\n    public <T> T getObject(Class<T> clazz) {\n        return getObject(clazz, null, null);\n\n    }\n\n    @Override\n    public <T> T getObject(Class<T> clazz, String objectIdInProvider) {\n        return getObject(clazz, null, objectIdInProvider);\n    }\n\n    @Override\n    public <T> T getObject(Class<T> clazz, String providerId, String objectIdInProvider) {\n        String key = clazz.getName();\n        if (providerId != null || objectIdInProvider != null) {\n            key += KEY_SEPERATOR + (providerId == null ? \"\" : providerId) + KEY_SEPERATOR\n                    + (objectIdInProvider == null ? \"\" : objectIdInProvider);\n        }\n        Object o = cache.get(key);\n        if (o != null) {\n            return (T) o;\n        }\n        synchronized (clazz) {\n            o = cache.get(key);\n            if (o != null) {\n                return (T) o;\n            }\n            ObjectProvider provider = null;\n            if (providerId != null) {\n                provider = providerMap.get(providerId);\n                if (provider == null) {\n                    throw new EasyFlowException(\"class:\" + clazz.getName() + \" providerId:\" + providerId + \" service provider not found\");\n                }\n            } else {\n                String serviceProviderKey = propertiesAccessor\n                        .getProperty(\"provider-\" + clazz.getName() + \"-\" + objectIdInProvider);\n                if (serviceProviderKey != null) {\n                    provider = providerMap.get(serviceProviderKey);\n                    if (provider == null) {\n                        throw new EasyFlowException(\"object provider of \" + serviceProviderKey + \" not exists\");\n                    }\n                    log.info(\"Found \" + clazz.getName() + \" provider type:\" + serviceProviderKey + \" provider:\"\n                            + provider.getClass().getName());\n                }\n                if (providerId == null) {\n                    serviceProviderKey = propertiesAccessor.getProperty(\"provider-\" + clazz.getName());\n                    if (serviceProviderKey != null) {\n                        provider = providerMap.get(serviceProviderKey);\n                        if (provider == null) {\n                            throw new EasyFlowException(\"Object provider \" + serviceProviderKey + \" not exists\");\n                        }\n                        log.info(\"Found \" + clazz.getName() + \" provider type:\" + serviceProviderKey + \" provider:\"\n                                + provider.getClass().getName());\n                    }\n                }\n                if (provider == null) {\n                    String globalProviderKey = propertiesAccessor.getProperty(\"global-provider\");\n                    if (globalProviderKey != null) {\n                        provider = providerMap.get(globalProviderKey);\n                        if (provider == null) {\n                            throw new EasyFlowException(\"Object provider \" + globalProviderKey + \" not exists\");\n                        }\n                        log.info(\"Found global provider:\" + globalProviderKey + \" provider:\" + provider.getClass().getName());\n\n                    }\n                }\n                if (provider == null && providerMap.size() == 1) {\n                    provider = providerMap.entrySet().iterator().next().getValue();\n                    log.info(\"Use unique object provider:\" + provider.getClass().getName());\n                }\n\n                if (provider == null) {\n                    throw new EasyFlowException(\"Not found \" + clazz.getName() + \" service provider\");\n                }\n            }\n            o = provider.getObject(clazz, objectIdInProvider);\n            cache.put(key, o);\n            return (T) o;\n        }\n    }\n\n    public String getConfigPath() {\n        return configPath;\n    }\n\n    public void setConfigPath(String configPath) {\n        this.configPath = configPath;\n    }\n\n    public Map<String, Object> getCache() {\n        return cache;\n    }\n\n    public void setCache(ConcurrentHashMap<String, Object> cache) {\n        this.cache = cache;\n    }\n\n    public Map<String, ObjectProvider> getProviderMap() {\n        return providerMap;\n    }\n\n    public void setProviderMap(Map<String, ObjectProvider> providerMap) {\n        this.providerMap = providerMap;\n    }\n    \n\n\n\n    public PropertiesAccessor getPropertiesAccessor() {\n        return propertiesAccessor;\n    }\n\n    public void setPropertiesAccessor(PropertiesAccessor propertiesAccessor) {\n        this.propertiesAccessor = propertiesAccessor;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/objects/factory/ObjectFactory.java",
    "content": "package com.jd.easyflow.objects.factory;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic interface ObjectFactory {\n    \n    /**\n     * Find object by class with default provider.\n     * @param <T>\n     * @param clazz\n     * @return\n     */\n    <T> T getObject(Class<T> clazz);\n    \n    /**\n     * Find object by class and object id.\n     * @param <T>\n     * @param clazz\n     * @param serviceIdInProvider\n     * @return\n     */\n    <T> T getObject(Class<T> clazz, String objectIdInProvider);\n    \n    /**\n     * Find object by class,providerId and objectIdInProvider.\n     * @param <T>\n     * @param clazz\n     * @param provider\n     * @param objectIdInProvider\n     * @return\n     */\n    <T> T getObject(Class<T> clazz, String providerId, String objectIdInProvider);\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/objects/factory/ObjectFactorys.java",
    "content": "package com.jd.easyflow.objects.factory;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ObjectFactorys {\n\n    private static ObjectFactory defaultObjectFactory;\n\n    public static ObjectFactory getDefault() {\n        return defaultObjectFactory;\n    }\n    \n    public void setDefaultObjectFactory(ObjectFactory objectFactory) {\n        ObjectFactorys.defaultObjectFactory = objectFactory;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/objects/factory/ObjectProvider.java",
    "content": "package com.jd.easyflow.objects.factory;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic interface ObjectProvider {\n    \n    <T>T getObject(Class<T> clazz, String id);\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/objects/factory/spring/SpringObjectProvider.java",
    "content": "package com.jd.easyflow.objects.factory.spring;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.BeansException;\nimport org.springframework.context.ApplicationContext;\nimport org.springframework.context.ApplicationContextAware;\n\nimport com.jd.easyflow.common.exception.EasyFlowException;\nimport com.jd.easyflow.objects.factory.ObjectProvider;\nimport com.jd.easyflow.properties.PropertiesAccessor;\nimport com.jd.easyflow.properties.classpath.ClassPathPropertiesAccessor;\n\n/**\n * @author liyuliang5\n *\n */\npublic class SpringObjectProvider implements ObjectProvider, ApplicationContextAware {\n    \n    private static final Logger log = LoggerFactory.getLogger(SpringObjectProvider.class);\n\n\n    private String configPath = \"/config/objectProvider.properties\";\n\n    private ApplicationContext context;\n\n    private static final String BEAN_ID_PREFIX = \"spring.bean.id.\";\n\n    private PropertiesAccessor propertiesAccessor;\n\n    public void init() {\n        if (propertiesAccessor == null) {\n            propertiesAccessor = new ClassPathPropertiesAccessor(configPath);\n            ((ClassPathPropertiesAccessor) propertiesAccessor).init();\n        }\n    }\n\n    @Override\n    public <T> T getObject(Class<T> clazz, String serviceId) {\n        if (serviceId == null) {\n            serviceId = propertiesAccessor.getProperty(BEAN_ID_PREFIX + clazz.getName());\n        }\n        if (serviceId == null) {\n            return context.getBean(clazz);\n        } else {\n            Object result = context.getBean(serviceId);\n            if (result != null && clazz != null) {\n                if (!(clazz.isAssignableFrom(result.getClass()))) {\n                    throw new EasyFlowException(\n                            \"bean:\" + serviceId + \" real type:\" + result.getClass().getName() + \" expected type:\" + clazz.getName());\n                }\n            }\n            return (T) result;\n        }\n    }\n\n    @Override\n    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {\n        this.context = applicationContext;\n    }\n\n    public String getConfigPath() {\n        return configPath;\n    }\n\n    public void setConfigPath(String configPath) {\n        this.configPath = configPath;\n    }\n\n    public PropertiesAccessor getPropertiesAccessor() {\n        return propertiesAccessor;\n    }\n\n    public void setPropertiesAccessor(PropertiesAccessor propertiesAccessor) {\n        this.propertiesAccessor = propertiesAccessor;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/properties/PropertiesAccessor.java",
    "content": "package com.jd.easyflow.properties;\n\n/**\n * @author liyuliang5\n *\n */\npublic interface PropertiesAccessor {\n\n    public String getProperty(String key);\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/properties/PropertyUtil.java",
    "content": "package com.jd.easyflow.properties;\n\nimport com.jd.easyflow.objects.factory.ObjectFactorys;\n\n/**\n * @author liyuliang5\n */\npublic class PropertyUtil {\n    \n    private static PropertiesAccessor propertiesAccessor;\n\n    public static String get(String key) {\n        return getPropertiesAccessor().getProperty(key);\n    }\n\n    public static PropertiesAccessor getPropertiesAccessor() {\n        if (propertiesAccessor == null) {\n            propertiesAccessor = ObjectFactorys.getDefault().getObject(PropertiesAccessor.class);\n        }\n        return propertiesAccessor;\n    }\n\n    public static void setPropertiesAccessor(PropertiesAccessor propertiesAccessor) {\n        PropertyUtil.propertiesAccessor = propertiesAccessor;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/properties/classpath/ClassPathPropertiesAccessor.java",
    "content": "package com.jd.easyflow.properties.classpath;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.util.Properties;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.common.exception.EasyFlowException;\nimport com.jd.easyflow.properties.PropertiesAccessor;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ClassPathPropertiesAccessor implements PropertiesAccessor {\n    \n    private static final Logger log = LoggerFactory.getLogger(ClassPathPropertiesAccessor.class);\n\n    \n    private String path;\n    \n    private Properties properties;\n    \n    public ClassPathPropertiesAccessor() {\n        // NOOP\n    }\n    \n    public ClassPathPropertiesAccessor(String path) {\n        this.path = path;\n    }\n    \n    public void init() {\n        properties = new Properties();\n        try {\n            InputStream inputStream = this.getClass().getResourceAsStream(path);\n            if (inputStream == null) {\n                log.warn(\"Config file \" + path +\" not exists\");\n            } else {\n                properties.load(inputStream);\n            }\n        } catch (IOException e) {\n            throw new EasyFlowException(\"Config file \" + path + \" load exception\", e);\n        }\n    }\n\n    @Override\n    public String getProperty(String key) {\n        return (String) properties.getProperty(key);\n    }\n\n    public String getPath() {\n        return path;\n    }\n\n    public void setPath(String path) {\n        this.path = path;\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/properties/spring/SpringEnvPropertiesAccessor.java",
    "content": "package com.jd.easyflow.properties.spring;\n\nimport java.util.Iterator;\nimport java.util.Set;\nimport java.util.TreeSet;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.context.EnvironmentAware;\nimport org.springframework.core.env.ConfigurableEnvironment;\nimport org.springframework.core.env.EnumerablePropertySource;\nimport org.springframework.core.env.Environment;\nimport org.springframework.core.env.PropertySource;\nimport org.springframework.core.env.SystemEnvironmentPropertySource;\n\nimport com.jd.easyflow.properties.PropertiesAccessor;\n\n/**\n * @author liyuliang5\n *\n */\npublic class SpringEnvPropertiesAccessor implements PropertiesAccessor, EnvironmentAware {\n    \n    private static final Logger log = LoggerFactory.getLogger(SpringEnvPropertiesAccessor.class);\n\n    \n\n    private Environment env;\n\n    public void setEnvironment(Environment env) {\n      this.env = env;\n      StringBuilder builder = new StringBuilder(\"\\nConfig sources:\");\n      // print all\n      Set<String> keys = new TreeSet<>();\n      for (Iterator it = ((ConfigurableEnvironment) env).getPropertySources().iterator(); it\n          .hasNext();) {\n        PropertySource propertySource = (PropertySource) it.next();\n        builder.append(propertySource.getName() + \"\\n\");\n        if (propertySource instanceof EnumerablePropertySource) {\n          if (propertySource instanceof SystemEnvironmentPropertySource\n              || \"systemProperties\".equals(propertySource.getName())) {\n            continue;\n          }\n          for (String key : ((EnumerablePropertySource) propertySource).getPropertyNames()) {\n            keys.add(key);\n          }\n        }\n      }\n      builder.append(\"\\nConfig info:\\n\");\n      for (String key : keys) {\n        String value = env.getProperty(key);\n        builder.append(key + \"=\" + value + \"\\n\");\n      }\n      log.info(builder.toString());\n\n    }\n\n    @Override\n    public String getProperty(String key) {\n        return env.getProperty(key);\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/properties/spring/SpringPropertySourcesPropertiesAccessor.java",
    "content": "package com.jd.easyflow.properties.spring;\n\nimport org.springframework.context.support.PropertySourcesPlaceholderConfigurer;\nimport org.springframework.core.env.PropertySources;\nimport org.springframework.core.env.PropertySourcesPropertyResolver;\n\nimport com.jd.easyflow.properties.PropertiesAccessor;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class SpringPropertySourcesPropertiesAccessor implements PropertiesAccessor {\n\n    private PropertySourcesPlaceholderConfigurer configurer;\n\n    private PropertySourcesPropertyResolver resolver;\n\n    public void init() {\n        PropertySources sources = configurer.getAppliedPropertySources();\n        resolver = new PropertySourcesPropertyResolver(sources);\n    }\n\n    @Override\n    public String getProperty(String key) {\n        return resolver.getProperty(key);\n    }\n\n    public PropertySourcesPlaceholderConfigurer getConfigurer() {\n        return configurer;\n    }\n\n    public void setConfigurer(PropertySourcesPlaceholderConfigurer configurer) {\n        this.configurer = configurer;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/spel/SpelHelper.java",
    "content": "package com.jd.easyflow.spel;\n\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.context.ApplicationContext;\nimport org.springframework.context.ApplicationContextAware;\nimport org.springframework.context.expression.BeanFactoryResolver;\nimport org.springframework.context.expression.MapAccessor;\nimport org.springframework.expression.EvaluationContext;\nimport org.springframework.expression.Expression;\nimport org.springframework.expression.ExpressionParser;\nimport org.springframework.expression.ParserContext;\nimport org.springframework.expression.spel.standard.SpelExpressionParser;\nimport org.springframework.expression.spel.support.StandardEvaluationContext;\n\n/**\n * Helper class used to evaluate SpEL expression.\n * \n * @author liyuliang5\n * \n */\npublic class SpelHelper implements ApplicationContextAware {\n\n    private static final Logger logger = LoggerFactory.getLogger(SpelHelper.class);\n\n    public static StandardEvaluationContext context = new StandardEvaluationContext();\n\n    private static Map<String, Expression> cacheMap = new ConcurrentHashMap();\n\n    private static Map<String, Expression> tmpCacheMap = new ConcurrentHashMap();\n\n    private static ExpressionParser parser = new SpelExpressionParser();\n\n    private static ApplicationContext applicationContext;\n\n    static {\n        context.addPropertyAccessor(new MapAccessor());\n    }\n\n    public static StandardEvaluationContext getDefaultContext() {\n        return context;\n    }\n\n    public static Expression parse(String exp) {\n        return parser.parseExpression(exp);\n    }\n\n    public static <T> T eval(Expression exp, Object context) {\n        Object value = exp.getValue(context);\n        return (T) value;\n    }\n\n    public static <T> T eval(String exp, Object context) {\n        return (T) eval(exp, context, true);\n    }\n\n    public static <T> T eval(String exp, Object context, boolean cache) {\n        try {\n            Expression expression;\n            if (cache) {\n                expression = cacheMap.get(exp);\n                if (expression == null) {\n                    expression = parse(exp);\n                    cacheMap.put(exp, expression);\n                }\n            } else {\n                expression = parse(exp);\n            }\n\n            Object value = null;\n            if (context instanceof EvaluationContext) {\n                value = expression.getValue((EvaluationContext) context);\n            } else {\n                value = expression.getValue(context);\n            }\n            return (T) value;\n        } catch (Exception e) {\n            logger.error(\"SPEL eval exception, exp:\" + exp, e);\n            throw e;\n        }\n    }\n\n    public static <T> T evalWithDefaultContext(String exp, Object root, boolean cache) {\n        return eval(exp, context, root, cache);\n    }\n\n    public static <T> T eval(String exp, EvaluationContext context, Object root, boolean cache) {\n        try {\n            Expression expression;\n            if (cache) {\n                expression = cacheMap.get(exp);\n                if (expression == null) {\n                    expression = parse(exp);\n                    cacheMap.put(exp, expression);\n                }\n            } else {\n                expression = parse(exp);\n            }\n\n            Object value = expression.getValue(context, root);\n            return (T) value;\n        } catch (Exception e) {\n            logger.error(\"SPEL eval exception, exp:\" + exp, e);\n            throw e;\n        }\n    }\n\n    public static Expression parseTemplate(String template) {\n        return parser.parseExpression(template, ParserContext.TEMPLATE_EXPRESSION);\n    }\n\n    public static String evalTemplate(Expression template, Object context) {\n        return (String) template.getValue(context);\n    }\n\n    public static String evalTemplate(String template, Object context) {\n        return evalTemplate(template, context, true);\n    }\n\n    public static String evalTemplate(String template, Object context, boolean cache) {\n        try {\n            Expression expression;\n            if (cache) {\n                expression = tmpCacheMap.get(template);\n                if (expression == null) {\n                    expression = parseTemplate(template);\n                    tmpCacheMap.put(template, expression);\n                }\n            } else {\n                expression = parseTemplate(template);\n            }\n            Object result = null;\n            if (context instanceof EvaluationContext) {\n                result = expression.getValue((EvaluationContext) context);\n            } else {\n                result = expression.getValue(context);\n            }\n            if (result == null) {\n                return null;\n            }\n            return result.toString();\n        } catch (Exception e) {\n            logger.error(\"SPEL template eval exception, template:\" + template, e);\n            throw e;\n        }\n    }\n\n    public static String evalTemplateWithDefaultContext(String template, Object root, boolean cache) {\n        return evalTemplate(template, context, root, cache);\n    }\n\n    public static String evalTemplate(String template, EvaluationContext context, Object root, boolean cache) {\n        try {\n            Expression expression;\n            if (cache) {\n                expression = tmpCacheMap.get(template);\n                if (expression == null) {\n                    expression = parseTemplate(template);\n                    tmpCacheMap.put(template, expression);\n                }\n            } else {\n                expression = parseTemplate(template);\n            }\n            Object result = null;\n            result = expression.getValue(context, root);\n            if (result == null) {\n                return null;\n            }\n            return result.toString();\n        } catch (Exception e) {\n            logger.error(\"SPEL template eval exception, template:\" + template, e);\n            throw e;\n        }\n    }\n    \n    public static void setSpringApplicationContext(ApplicationContext applicationContext) {\n        SpelHelper.applicationContext = applicationContext;\n        context.setBeanResolver(new BeanFactoryResolver(applicationContext));\n    }\n\n    public static ApplicationContext getApplicationContext() {\n        return applicationContext;\n    }\n    \n    public void setApplicationContext(ApplicationContext applicationContext) {\n        setSpringApplicationContext(applicationContext);\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/utils/json/JSON.java",
    "content": "package com.jd.easyflow.utils.json;\n\nimport java.util.List;\n\nimport com.fasterxml.jackson.core.type.TypeReference;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class JSON {\n    \n    private static JsonFacade jsonFacade;\n\n    public static String toJSONString(Object o) {\n        return jsonFacade().toJSONString(o);\n    }\n\t\n    public static <T> T parseObject(Object object, Class<T> clazz) {\n        return jsonFacade().parseObject(object, clazz);\n    }\n\n    public static <T> List<T> parseArray(Object object, Class<T> clazz) {\n        return jsonFacade().parseArray(object, clazz);\n    }\n\n\tpublic static String toJSONString(Object o, JsonSerializeConfig config) {\n\t\treturn jsonFacade().toJSONString(o, config);\n\t}\n\t\n\tpublic static <T> T parseObject(Object src, TypeReference<T> typeReference) {\n\t\treturn jsonFacade().parseObject(src, typeReference);\n\t}\n\t\n\tprivate static JsonFacade jsonFacade() {\n\t    if (jsonFacade == null) {\n\t        jsonFacade = new JsonFacadeJacksonImpl();\n\t    }\n\t    return jsonFacade;\n\t}\n\n    public static JsonFacade getJsonFacade() {\n        return jsonFacade;\n    }\n\n    public static void setJsonFacade(JsonFacade jsonFacade) {\n        JSON.jsonFacade = jsonFacade;\n    }\n\t\n\t\n\n}"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/utils/json/JsonFacade.java",
    "content": "package com.jd.easyflow.utils.json;\n\nimport java.util.List;\n\nimport com.fasterxml.jackson.core.type.TypeReference;\n\n/**\n * @author liyuliang5\n */\npublic interface JsonFacade {\n\n    public String toJSONString(Object o);\n    \n    public String toJSONString(Object o, JsonSerializeConfig config);\n\n    public <T> T parseObject(Object object, Class<T> clazz);\n\n    public <T> List<T> parseArray(Object object, Class<T> clazz);\n\n    public <T> T parseObject(Object src, TypeReference<T> typeReference);\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/utils/json/JsonFacadeJacksonImpl.java",
    "content": "package com.jd.easyflow.utils.json;\n\nimport java.io.IOException;\nimport java.util.List;\n\nimport com.fasterxml.jackson.annotation.JsonInclude.Include;\nimport com.fasterxml.jackson.core.JsonProcessingException;\nimport com.fasterxml.jackson.core.type.TypeReference;\nimport com.fasterxml.jackson.databind.DeserializationFeature;\nimport com.fasterxml.jackson.databind.JavaType;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackson.databind.SerializationFeature;\n\n/**\n * @author liyuliang5\n */\npublic class JsonFacadeJacksonImpl implements JsonFacade {\n\n\n    private ObjectMapper mapper = new ObjectMapper();\n\n    {\n        mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);\n        mapper.setSerializationInclusion(Include.NON_NULL);\n        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);\n    }\n    \n    @Override\n    public String toJSONString(Object o) {\n        try {\n            return mapper.writeValueAsString(o);\n        } catch (JsonProcessingException e) {\n            throw new RuntimeException(e);\n        }\n    }\n    \n    @Override\n    public <T> T parseObject(Object object, Class<T> clazz) {\n        String s = null;\n        if (object instanceof String) {\n            s = (String) object;\n        } else {\n            s = toJSONString(object);\n        }\n        try {\n            return mapper.readValue(s, clazz);\n        } catch (Exception e) {\n            throw new RuntimeException(e);\n        }\n    }\n\n    @Override\n    public <T> List<T> parseArray(Object object, Class<T> clazz) {\n        try {\n            String src;\n            if(object instanceof String) {\n                src = (String) object;\n            } else {\n                src = toJSONString(object);\n            }\n            JavaType javaType = mapper.getTypeFactory().constructCollectionType(List.class, clazz);\n\n            return mapper.readValue(src, javaType);\n        } catch (IOException e) {\n            throw new RuntimeException(e);\n        }\n    }\n\n    @Override\n    public String toJSONString(Object o, JsonSerializeConfig config) {\n        ObjectMapper mapper = new ObjectMapper();\n        mapper.setDateFormat(config.getDateFormat());\n        try {\n            return mapper.writeValueAsString(o);\n        } catch (JsonProcessingException e) {\n            throw new RuntimeException(e);\n        }\n    }\n    \n    @Override \n    public <T> T parseObject(Object src, TypeReference<T> typeReference) {\n        try {\n            if(src instanceof String) {\n                return mapper.readValue((String)src, typeReference);\n            } else {\n                return mapper.readValue(toJSONString(src), typeReference);\n            }\n        } catch (Exception e) {\n            throw new RuntimeException(e);\n        }\n    }\n\n    public ObjectMapper getMapper() {\n        return mapper;\n    }\n\n    public void setMapper(ObjectMapper mapper) {\n        this.mapper = mapper;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/java/com/jd/easyflow/utils/json/JsonSerializeConfig.java",
    "content": "package com.jd.easyflow.utils.json;\n\nimport java.text.DateFormat;\n\n/**\n * @author liyuliang5\n */\npublic class JsonSerializeConfig {\n    \n    private DateFormat dateFormat;\n\n    public DateFormat getDateFormat() {\n        return dateFormat;\n    }\n\n    public void setDateFormat(DateFormat dateFormat) {\n        this.dateFormat = dateFormat;\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-common/src/main/resources/easyflow/easyflow-spring-message-spring.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:aop=\"http://www.springframework.org/schema/aop\"\n       xmlns:context=\"http://www.springframework.org/schema/context\"\n       xmlns:util=\"http://www.springframework.org/schema/util\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd\n       http://www.springframework.org/schema/aop  http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd\">\n    <bean name=\"easyflow-message-springMessageSendService\" class=\"com.jd.easyflow.message.spring.SpringMessageSendServiceImpl\">\n    </bean>\n</beans>"
  },
  {
    "path": "easyflow-process/easyflow-process-sample/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n    xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>easyflow-process</artifactId>\n        <groupId>com.jd.easyflow</groupId>\n        <version>1.7.3</version>\n    </parent>\n    <artifactId>easyflow-process-sample</artifactId>\n    <name>easyflow-process-sample</name>\n    <packaging>jar</packaging>\n    <properties>\n    </properties>\n    <dependencies>\n            <dependency>\n                <groupId>com.jd.easyflow</groupId>\n                <artifactId>easyflow-process-server</artifactId>\n            </dependency>\n            <dependency>\n                <groupId>com.jd.easyflow</groupId>\n                <artifactId>easyflow-process-admin</artifactId>\n            </dependency>    \n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-thymeleaf</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.mybatis.spring.boot</groupId>\n            <artifactId>mybatis-spring-boot-starter</artifactId>            \n        </dependency>\n        <dependency>\n            <groupId>javax.servlet</groupId>\n            <artifactId>javax.servlet-api</artifactId>\n        </dependency>        \n\t\t<dependency>\n\t\t    <groupId>jakarta.servlet</groupId>\n\t\t    <artifactId>jakarta.servlet-api</artifactId>\n\t\t</dependency>          \n        <dependency>\n            <groupId>org.springframework</groupId>\n            <artifactId>spring-jdbc</artifactId>\n        </dependency>   \n        <!-- ! configure the jdbc driver of your database here. bellow is mysql demo. -->\n        <!--! If you use mysql or other database, you should obey their license. -->\n        <!--\n        <dependency>\n            <groupId>mysql</groupId>\n            <artifactId>mysql-connector-java</artifactId>\n            <version>8.0.23</version>\n        </dependency>\n         -->                                                            \n    </dependencies>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-deploy-plugin</artifactId>\n                <configuration>\n                    <skip>true</skip>\n                </configuration>\n            </plugin>\n        </plugins>    \n    </build>    \n</project>"
  },
  {
    "path": "easyflow-process/easyflow-process-sample/src/main/java/com/jd/easyflow/integration/all/admin/IndexController.java",
    "content": "package com.jd.easyflow.integration.all.admin;\n\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.RequestMapping;\n\n/**\n * @author liyuliang5\n *\n */\n@Controller\npublic class IndexController {\n\n\n    @RequestMapping(\"/\")\n    public String index() {\n        return \"redirect:/easyflow/processInstance/list\";\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-sample/src/main/java/com/jd/easyflow/integration/all/admin/filter/JakartaSampleAuthFilter.java",
    "content": "package com.jd.easyflow.integration.all.admin.filter;\n\nimport java.io.IOException;\n\nimport org.springframework.stereotype.Service;\n\nimport com.jd.easyflow.integration.all.admin.sample.SampleUserHolder;\n\nimport jakarta.servlet.Filter;\nimport jakarta.servlet.FilterChain;\nimport jakarta.servlet.ServletException;\nimport jakarta.servlet.ServletRequest;\nimport jakarta.servlet.ServletResponse;\nimport jakarta.servlet.http.HttpServletRequest;\n\n/**\n * @author liyuliang5\n *\n */\n@Service\npublic class JakartaSampleAuthFilter implements Filter {\n    \n    @Override\n    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)\n            throws IOException, ServletException {\n        String user = request.getParameter(\"user\");\n        if (user != null) {\n            ((HttpServletRequest) request).getSession().setAttribute(\"user\", user);\n        }\n        user = (String) ((HttpServletRequest) request).getSession().getAttribute(\"user\");\n        if (user == null) {\n            user = \"zhangsan\";\n            ((HttpServletRequest) request).getSession().setAttribute(\"user\", user);;\n        }\n        try {\n            SampleUserHolder.set(user);\n        chain.doFilter(request, response);\n        } finally {\n            SampleUserHolder.remove();\n        }\n        \n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-sample/src/main/java/com/jd/easyflow/integration/all/admin/filter/SampleAuthFilter.java",
    "content": "package com.jd.easyflow.integration.all.admin.filter;\n\nimport java.io.IOException;\n\nimport javax.servlet.Filter;\nimport javax.servlet.FilterChain;\nimport javax.servlet.ServletException;\nimport javax.servlet.ServletRequest;\nimport javax.servlet.ServletResponse;\nimport javax.servlet.http.HttpServletRequest;\n\nimport org.springframework.stereotype.Service;\n\nimport com.jd.easyflow.integration.all.admin.sample.SampleUserHolder;\n\n/**\n * @author liyuliang5\n *\n */\n@Service\npublic class SampleAuthFilter implements Filter {\n    \n    @Override\n    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)\n            throws IOException, ServletException {\n        String user = request.getParameter(\"user\");\n        if (user != null) {\n            ((HttpServletRequest) request).getSession().setAttribute(\"user\", user);\n        }\n        user = (String) ((HttpServletRequest) request).getSession().getAttribute(\"user\");\n        if (user == null) {\n            user = \"zhangsan\";\n            ((HttpServletRequest) request).getSession().setAttribute(\"user\", user);;\n        }\n        try {\n            SampleUserHolder.set(user);\n        chain.doFilter(request, response);\n        } finally {\n            SampleUserHolder.remove();\n        }\n        \n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-sample/src/main/java/com/jd/easyflow/integration/all/admin/process/SampleUserGroupAdminExtensionImpl.java",
    "content": "package com.jd.easyflow.integration.all.admin.process;\n\nimport java.util.List;\nimport java.util.Map;\n\nimport org.springframework.stereotype.Service;\n\nimport com.jd.easyflow.admin.process.adapter.page.extension.UserGroupAdminExtension;\nimport com.jd.easyflow.flow.util.FlowIOUtil;\nimport com.jd.easyflow.integration.all.admin.sample.SampleUserHolder;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n * @author liyuliang5\n *\n */\n@Service\npublic class SampleUserGroupAdminExtensionImpl implements UserGroupAdminExtension {\n\n    private Map<String, Object> userGroupData;\n\n    public void SampleUserGroupAdminExtensionImpl() throws Exception {\n        String content = FlowIOUtil.toString(this.getClass().getResourceAsStream(\"/config/sampleUserGroup.json\"));\n        userGroupData = JSON.parseObject(content, Map.class);\n    }\n\n    @Override\n    public String getCurrentUser(Map<String, Object> extData) {\n        String user = SampleUserHolder.get();\n        return user;\n    }\n\n    @Override\n    public List<String> getUserGroupList(String user, Map<String, Object> extData) {\n        if (userGroupData != null) {\n            List<Map<String, Object>> users = (List<Map<String, Object>>) userGroupData.get(\"userList\");\n            if (users != null) {\n                for (Map<String, Object> u : users) {\n                    if (user.equals(u.get(\"user\"))) {\n                        return (List<String>) u.get(\"groupList\");\n                    }\n                }\n            }\n        }\n        return null;\n    }\n\n    @Override\n    public List<String> getUserGroup2List(String user, Map<String, Object> extData) {\n        if (userGroupData != null) {\n            List<Map<String, Object>> users = (List<Map<String, Object>>) userGroupData.get(\"userList\");\n            if (users != null) {\n                for (Map<String, Object> u : users) {\n                    if (user.equals(u.get(\"user\"))) {\n                        return (List<String>) u.get(\"group2List\");\n                    }\n                }\n            }\n        }\n        return null;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-sample/src/main/java/com/jd/easyflow/integration/all/admin/sample/SampleUserHolder.java",
    "content": "package com.jd.easyflow.integration.all.admin.sample;\n\n/**\n * @author liyuliang5\n */\npublic class SampleUserHolder {\n\n    private static ThreadLocal<String> userThreadLocal = new ThreadLocal<String>();\n    \n    public static void set(String user) {\n        userThreadLocal.set(user);\n    }\n    \n    public static String get() {\n        return userThreadLocal.get();\n    }\n    \n    public static void remove() {\n        userThreadLocal.remove();\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-sample/src/main/java/com/jd/easyflow/integration/open/IntegrationOpenApplication.java",
    "content": "package com.jd.easyflow.integration.open;\n\nimport java.time.LocalDateTime;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.boot.CommandLineRunner;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.boot.builder.SpringApplicationBuilder;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.ComponentScan;\nimport org.springframework.context.annotation.ImportResource;\nimport org.springframework.scheduling.annotation.EnableScheduling;\nimport org.springframework.web.servlet.DispatcherServlet;\nimport org.springframework.web.servlet.config.annotation.InterceptorRegistry;\nimport org.springframework.web.servlet.config.annotation.WebMvcConfigurer;\nimport org.springframework.web.servlet.i18n.LocaleChangeInterceptor;\nimport org.springframework.web.servlet.i18n.SessionLocaleResolver;\n\n/**\n * @author liyuliang5\n *\n */\n@SpringBootApplication\n@ImportResource(\"classpath:spring/open/easyflow-spring-open-all.xml\")\n@ComponentScan(basePackages = {\"com.jd.easyflow.integration.all.**\", \"com.jd.easyflow.admin.**\"})\n@EnableScheduling\npublic class IntegrationOpenApplication implements WebMvcConfigurer, CommandLineRunner {\n    \n    private static final Logger log = LoggerFactory.getLogger(IntegrationOpenApplication.class);\n\n\n    private static final String CLIENT_NAME = \"IntegrationOpenApplication\";\n    \n    /**\n     *\n     * @param args\n     */\n    public static void main(String[] args) {\n        //Locale.setDefault(Locale.US);\n        log.info(CLIENT_NAME + \"start boot,Start time:\" + LocalDateTime.now());\n        new SpringApplicationBuilder(IntegrationOpenApplication.class)\n        .properties(\"spring.config.location=classpath:application-open-all.yml\").run(args);\n        log.info(CLIENT_NAME + \" start success,End time:\" + LocalDateTime.now());\n    }\n    \n    @Override\n    public void run(String... args) throws Exception {\n       log.info(\"Start\");\n    }\n    \n    @Override\n    public void addInterceptors(InterceptorRegistry registry) {\n        LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();\n        registry.addInterceptor(localeChangeInterceptor);\n    }\n    \n    @Bean(DispatcherServlet.LOCALE_RESOLVER_BEAN_NAME)\n    public SessionLocaleResolver SessionLocaleResolver() {\n        return new SessionLocaleResolver();\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-sample/src/main/resources/application-open-all.yml",
    "content": "spring:\n  application:\n    name: jd-easyflow\n  jackson:\n    date-format: yyyy-MM-dd HH:mm:ss\n    joda-date-time-format: yyyy-MM-dd HH:mm:ss\n    time-zone: GMT+8\t#replace to your time-zone\n  mvc:\n    static-path-pattern: /static/**\n  messages:\n    basename: easyflow.messages.easyflow-process-admin,easyflow.messages.easyflow-process-server,easyflow.messages.easyflow-admin-framework,easyflow.messages.easyflow-form-admin,easyflow.messages.easyflow-processunit-admin       \n \nserver:\n  port: 9888\n  \nflow.local.push: true  \nfsm.local.push: true \ndb:\n  #import jdbc driver jar of your database in pom.xml and configue the correct jdbcUrl bellow.\n  #jdbcUrl: jdbc:mysql://localhost:3306/easyflow?characterEncoding=UTF-8 \n  username: root\n  password: 12345678\n   \nglobal-provider: spring\n\n"
  },
  {
    "path": "easyflow-process/easyflow-process-sample/src/main/resources/config/sampleUserGroup.json",
    "content": "{\n\"userList\":[\n{\"user\":\"zhangsan\", \"groupList\":[\"groupA\", \"groupB\"], \"group2List\":[\"group2A\"], \"erp\":\"zhangsan1\"},\n{\"user\":\"lisi\", \"groupList\":[\"groupA\", \"groupC\"], \"group2List\":[\"group2C\"], \"erp\":\"lisi1\"}\n]\n}"
  },
  {
    "path": "easyflow-process/easyflow-process-sample/src/main/resources/flow/client/flow_empty.json",
    "content": "{\n    \"id\": \"flow_empty\"\n}"
  },
  {
    "path": "easyflow-process/easyflow-process-sample/src/main/resources/flow/server/flow_task_001.bpmn",
    "content": "{\n\"id\":\"flow_task_001\",\n\"name\":\"task flow 001\",\n\"nodes\":[\n{\"id\":\"task_start\", \"start\":true, \"name\":\"Flow create\", \"action\":{\"createExp\":\"@eventNodeAction\"}, \"post\":{\"createExp\":\"@eventPostHandler\"}, \n  \"properties\":{\n      \"events\":{\n          \"PROCESS_INSTANCE_CREATE\":{\"action\":{\"createExp\":\"@taskCreateAndExecuteNodeAction\"}, \"post\":{\"to\":\"task_node_001\"}},\n          \"NONE\":{\"action\":{\"createExp\":\"@taskCreateNodeAction\"}}\n      },\n      \"task\":{\n          \"create\":{\"formId\":\"PROCESS_TEST_TASK_CREATE_001\",\"processor\":\"\", \"processService\":\"\", \"assignee\":{\"user\":\"paramData['_USER']\"}},\n          \"execute\":{}, \n          \"detail\":{ \"formId\":null}\n      }\n  }},\n{\"id\":\"task_node_001\", \"name\":\"001 task node\", \"action\":{\"createExp\":\"@eventNodeAction\"}, \"post\":{\"createExp\":\"@eventPostHandler\"}, \n  \"properties\":{\n      \"events\":{\n          \"NONE\":{\"action\":{\"createExp\":\"@taskCreateNodeAction\"}},\n          \"EXECUTE\":{\"action\":{\"createExp\":\"@taskExecuteNodeAction\"}, \"post\":{\"when\":\"actionResult=='PASS'\", \"to\":\"task_node_002\"}}\n      },\n      \"task\":{\n          \"create\":{\"processor\":\"\", \"processService\":\"\", \"assignee\":{\"user\":\"{'zhangsan'}\"}},\n          \"execute\":{\"formId\":\"PROCESS_TEST_TASK_EXECUTE_001\"}, \n          \"detail\":{\"pageId\":null, \"formId\":null}\n      }\n  }\n},\n{\"id\":\"task_node_002\", \"name\":\"002 task node\", \"action\":{\"createExp\":\"@eventNodeAction\"}, \"post\":{\"createExp\":\"@eventPostHandler\"}, \n  \"properties\":{\n      \"events\":{\n          \"NONE\":{\"action\":{\"createExp\":\"@taskCreateNodeAction\"}},\n          \"EXECUTE\":{\"action\":{\"createExp\":\"@taskExecuteNodeAction\"}, \"post\":{\"when\":\"@taskEl.bizData(param,'select')=='b'\", \"to\":\"task_node_001\", \"defaultTo\":\"end\"}}\n      },\n      \"task\":{\n          \"create\":{\"processor\":\"\", \"processService\":\"\", \"assignee\":{\"user\":\"{'lisi'}\"}},\n          \"execute\":{\"pageId\":\"commonProcessTaskExecute\", \"formId\":\"PROCESS_TEST_TASK_EXECUTE_002\"}\n      }\n  }\n},\n{\"id\":\"end\", \"name\":\"End node\", \"properties\":{\"end\":true}}\n],\n\n\"listeners\":[{\"createExp\":\"@'easyflow-process-processFlowListener'\"},\n{\"createExp\":\"@'easyflow-process-taskFlowListener'\"},\n{\"createExp\":\"@eventFlowListener\"}],\n\"properties\":{\n    \"process\":{\n        \"processType\":\"TEST_FLOW\",\n        \"formId\":\"PROCESS_TEST_001\",\n        \"instanceCreate\":{\"pageId\":\"commonTaskProcessInstanceAdd\"},\n        \"processInstanceStatusMessage\":{\"enable\":true}\n    },\n    \"task\":{\n        \"taskExecute\":{\"formId\":null}, \n        \"taskDetail\":{\"pageId\":null, \"formId\":null}\n    }\n}\n}"
  },
  {
    "path": "easyflow-process/easyflow-process-sample/src/main/resources/flow/server/flow_task_001.json",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bpmn:definitions xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:bpmn=\"http://www.omg.org/spec/BPMN/20100524/MODEL\" xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\" xmlns:dc=\"http://www.omg.org/spec/DD/20100524/DC\" xmlns:easyflow=\"http://jd.com/easyflow\" xmlns:di=\"http://www.omg.org/spec/DD/20100524/DI\" id=\"Definitions_1\" targetNamespace=\"http://bpmn.io/schema/bpmn\">\n  <bpmn:process id=\"flow_task_001_bpmn\" name=\"task flow 001_bpmn\" isExecutable=\"false\">\n    <bpmn:extensionElements>\n      <easyflow:listeners>[{\"createExp\":\"@'easyflow-process-processFlowListener'\"},\n{\"createExp\":\"@'easyflow-process-taskFlowListener'\"},\n{\"createExp\":\"@eventFlowListener\"}]</easyflow:listeners>\n      <easyflow:properties>{\n    \"process\":{\n        \"processType\":\"TEST_FLOW\",\n        \"formId\":\"PROCESS_TEST_001\",\n        \"instanceCreate\":{\"pageId\":\"commonTaskProcessInstanceAdd\"},\n        \"processInstanceStatusMessage\":{\"enable\":true}\n    },\n    \"task\":{\n        \"taskExecute\":{\"formId\":null}, \n        \"taskDetail\":{\"pageId\":null, \"formId\":null}\n    }\n}</easyflow:properties>\n    </bpmn:extensionElements>\n    <bpmn:startEvent id=\"task_start\" name=\"Flow create\">\n      <bpmn:extensionElements>\n        <easyflow:action>{\"createExp\":\"@eventNodeAction\"}</easyflow:action>\n        <easyflow:properties>{\n  \"events\": {\n    \"PROCESS_INSTANCE_CREATE\": {\n      \"action\": {\n        \"createExp\": \"@taskCreateAndExecuteNodeAction\"\n      }\n    }\n  },\n  \"task\": {\n    \"create\": {\n      \"formId\": \"PROCESS_TEST_TASK_CREATE_001\",\n      \"processor\": \"\",\n      \"processService\": \"\",\n      \"assignee\": {\n        \"user\": \"paramData['_USER']\"\n      }\n    },\n    \"execute\": {},\n    \"detail\": {\n      \"formId\": null\n    }\n  }\n}</easyflow:properties>\n        <easyflow:extProperties>{\"commentPosition\":{\"top\":-128,\"left\":-165},\"commentWidth\":273}</easyflow:extProperties>\n      </bpmn:extensionElements>\n      <bpmn:outgoing>Flow_1wgcqok</bpmn:outgoing>\n    </bpmn:startEvent>\n    <bpmn:scriptTask id=\"task_node_001\" name=\"001 task node\" scriptFormat=\"createExp\">\n      <bpmn:extensionElements>\n        <easyflow:properties>{\n  \"events\": {\n    \"NONE\": {\n      \"action\": {\n        \"createExp\": \"@taskCreateNodeAction\"\n      }\n    },\n    \"EXECUTE\": {\n      \"action\": {\n        \"createExp\": \"@taskExecuteNodeAction\"\n      }\n    }\n  },\n  \"task\": {\n    \"create\": {\n      \"processor\": \"\",\n      \"processService\": \"\",\n      \"assignee\": {\n        \"user\": \"{'zhangsan'}\"\n      }\n    },\n    \"execute\": {\n      \"formId\": \"PROCESS_TEST_TASK_EXECUTE_001\"\n    },\n    \"detail\": {\n      \"pageId\": null,\n      \"formId\": null\n    }\n  }\n}</easyflow:properties>\n        <easyflow:extProperties>{\"commentWidth\":249,\"commentPosition\":{\"top\":91,\"left\":-95}}</easyflow:extProperties>\n      </bpmn:extensionElements>\n      <bpmn:incoming>Flow_1wgcqok</bpmn:incoming>\n      <bpmn:outgoing>Flow_0wm09xx</bpmn:outgoing>\n      <bpmn:outgoing>Flow_110e40i</bpmn:outgoing>\n      <bpmn:script>@eventNodeAction</bpmn:script>\n    </bpmn:scriptTask>\n    <bpmn:sequenceFlow id=\"Flow_1wgcqok\" sourceRef=\"task_start\" targetRef=\"task_node_001\" />\n    <bpmn:scriptTask id=\"task_node_002\" name=\"002 task node\" scriptFormat=\"createExp\">\n      <bpmn:extensionElements>\n        <easyflow:properties>{\n  \"events\": {\n    \"NONE\": {\n      \"action\": {\n        \"createExp\": \"@taskCreateNodeAction\"\n      }\n    },\n    \"EXECUTE\": {\n      \"action\": {\n        \"createExp\": \"@taskExecuteNodeAction\"\n      }\n    }\n  },\n  \"task\": {\n    \"create\": {\n      \"processor\": \"\",\n      \"processService\": \"\",\n      \"assignee\": {\n        \"user\": \"{'lisi'}\"\n      }\n    },\n    \"execute\": {\n      \"pageId\": \"commonProcessTaskExecute\",\n      \"formId\": \"PROCESS_TEST_TASK_EXECUTE_002\"\n    }\n  }\n}</easyflow:properties>\n        <easyflow:extProperties>{\"commentWidth\":237,\"commentPosition\":{\"top\":90,\"left\":4}}</easyflow:extProperties>\n      </bpmn:extensionElements>\n      <bpmn:incoming>Flow_0wm09xx</bpmn:incoming>\n      <bpmn:outgoing>Flow_1urqgl5</bpmn:outgoing>\n      <bpmn:outgoing>Flow_1femzw7</bpmn:outgoing>\n      <bpmn:script>@eventNodeAction</bpmn:script>\n    </bpmn:scriptTask>\n    <bpmn:sequenceFlow id=\"Flow_0wm09xx\" name=\"Pass\" sourceRef=\"task_node_001\" targetRef=\"task_node_002\">\n      <bpmn:extensionElements>\n        <easyflow:extProperties>{\"commentWidth\":125,\"commentPosition\":{\"top\":2,\"left\":-8}}</easyflow:extProperties>\n      </bpmn:extensionElements>\n      <bpmn:conditionExpression xsi:type=\"bpmn:tFormalExpression\">actionResult=='PASS'</bpmn:conditionExpression>\n    </bpmn:sequenceFlow>\n    <bpmn:endEvent id=\"end\" name=\"End node\">\n      <bpmn:extensionElements>\n        <easyflow:extProperties>{\"commentPosition\":{\"top\":3,\"left\":45}}</easyflow:extProperties>\n      </bpmn:extensionElements>\n      <bpmn:incoming>Flow_1urqgl5</bpmn:incoming>\n      <bpmn:incoming>Flow_1femzw7</bpmn:incoming>\n      <bpmn:incoming>Flow_110e40i</bpmn:incoming>\n    </bpmn:endEvent>\n    <bpmn:sequenceFlow id=\"Flow_1urqgl5\" name=\"Pass\" sourceRef=\"task_node_002\" targetRef=\"end\">\n      <bpmn:extensionElements>\n        <easyflow:extProperties>{\"commentWidth\":133}</easyflow:extProperties>\n      </bpmn:extensionElements>\n      <bpmn:conditionExpression xsi:type=\"bpmn:tFormalExpression\">actionResult=='PASS'</bpmn:conditionExpression>\n    </bpmn:sequenceFlow>\n    <bpmn:sequenceFlow id=\"Flow_1femzw7\" name=\"Reject\" sourceRef=\"task_node_002\" targetRef=\"end\">\n      <bpmn:extensionElements>\n        <easyflow:extProperties>{\"commentWidth\":142,\"commentPosition\":{\"top\":2,\"left\":44}}</easyflow:extProperties>\n      </bpmn:extensionElements>\n      <bpmn:conditionExpression xsi:type=\"bpmn:tFormalExpression\">actionResult=='REJECT'</bpmn:conditionExpression>\n    </bpmn:sequenceFlow>\n    <bpmn:sequenceFlow id=\"Flow_110e40i\" name=\"Reject\" sourceRef=\"task_node_001\" targetRef=\"end\">\n      <bpmn:extensionElements>\n        <easyflow:extProperties>{\"commentWidth\":140,\"commentPosition\":{\"top\":-42,\"left\":-15}}</easyflow:extProperties>\n      </bpmn:extensionElements>\n      <bpmn:conditionExpression xsi:type=\"bpmn:tFormalExpression\">actionResult=='REJECT'</bpmn:conditionExpression>\n    </bpmn:sequenceFlow>\n  </bpmn:process>\n  <bpmndi:BPMNDiagram id=\"BPMNDiagram_1\">\n    <bpmndi:BPMNPlane id=\"BPMNPlane_1\" bpmnElement=\"flow_task_001_bpmn\">\n      <bpmndi:BPMNShape id=\"_BPMNShape_StartEvent_2\" bpmnElement=\"task_start\">\n        <dc:Bounds x=\"173\" y=\"102\" width=\"36\" height=\"36\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_01hbn41_di\" bpmnElement=\"task_node_001\">\n        <dc:Bounds x=\"260\" y=\"80\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Event_0v34e47_di\" bpmnElement=\"end\">\n        <dc:Bounds x=\"692\" y=\"102\" width=\"36\" height=\"36\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"738\" y=\"113\" width=\"48\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNShape id=\"Activity_1jtizd2_di\" bpmnElement=\"task_node_002\">\n        <dc:Bounds x=\"460\" y=\"80\" width=\"100\" height=\"80\" />\n      </bpmndi:BPMNShape>\n      <bpmndi:BPMNEdge id=\"Flow_1wgcqok_di\" bpmnElement=\"Flow_1wgcqok\">\n        <di:waypoint x=\"209\" y=\"120\" />\n        <di:waypoint x=\"260\" y=\"120\" />\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_0wm09xx_di\" bpmnElement=\"Flow_0wm09xx\">\n        <di:waypoint x=\"360\" y=\"120\" />\n        <di:waypoint x=\"460\" y=\"120\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"399\" y=\"102\" width=\"25\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_1urqgl5_di\" bpmnElement=\"Flow_1urqgl5\">\n        <di:waypoint x=\"560\" y=\"120\" />\n        <di:waypoint x=\"692\" y=\"120\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"616\" y=\"102\" width=\"25\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_1femzw7_di\" bpmnElement=\"Flow_1femzw7\">\n        <di:waypoint x=\"510\" y=\"80\" />\n        <di:waypoint x=\"510\" y=\"60\" />\n        <di:waypoint x=\"710\" y=\"60\" />\n        <di:waypoint x=\"710\" y=\"102\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"594\" y=\"42\" width=\"32\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n      <bpmndi:BPMNEdge id=\"Flow_110e40i_di\" bpmnElement=\"Flow_110e40i\">\n        <di:waypoint x=\"310\" y=\"80\" />\n        <di:waypoint x=\"310\" y=\"30\" />\n        <di:waypoint x=\"710\" y=\"30\" />\n        <di:waypoint x=\"710\" y=\"102\" />\n        <bpmndi:BPMNLabel>\n          <dc:Bounds x=\"494\" y=\"12\" width=\"32\" height=\"14\" />\n        </bpmndi:BPMNLabel>\n      </bpmndi:BPMNEdge>\n    </bpmndi:BPMNPlane>\n  </bpmndi:BPMNDiagram>\n</bpmn:definitions>\n"
  },
  {
    "path": "easyflow-process/easyflow-process-sample/src/main/resources/fsm/client/fsm_empty.json",
    "content": "{\"id\":\"fsm_empty\"}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-sample/src/main/resources/logback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<configuration scan=\"true\">\n    <appender name=\"CONSOLE\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%d{yy-MM-dd.HH:mm:ss.SSS} [%-16t] %-5p %-22c{0} - %m%n</pattern>\n        </encoder>\n    </appender>\n    <root level=\"INFO\">\n        <appender-ref ref=\"CONSOLE\"/>\n    </root>\n</configuration>\n"
  },
  {
    "path": "easyflow-process/easyflow-process-sample/src/main/resources/spring/open/easyflow-spring-open-all.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:aop=\"http://www.springframework.org/schema/aop\"\n       xmlns:context=\"http://www.springframework.org/schema/context\"\n       xmlns:util=\"http://www.springframework.org/schema/util\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd\n       http://www.springframework.org/schema/aop  http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd\">\n<!-- For server, admin and client -->\n    <bean id=\"springEnvPropertiesAccessor\" class=\"com.jd.easyflow.properties.spring.SpringEnvPropertiesAccessor\"/>\n\t<bean id=\"defaultObjectFactory\" class=\"com.jd.easyflow.objects.factory.DefaultObjectFactory\" init-method=\"init\">\n\t   <property name=\"propertiesAccessor\" ref=\"springEnvPropertiesAccessor\"></property>\n\t\t<property name=\"providerMap\">\n\t\t\t<map>\n\t\t\t\t<entry key=\"spring\">\n\t\t\t\t\t<bean\n\t\t\t\t\t\tclass=\"com.jd.easyflow.objects.factory.spring.SpringObjectProvider\" init-method=\"init\">\n\t\t\t\t\t\t     <property name=\"propertiesAccessor\" ref=\"springEnvPropertiesAccessor\"></property>\n\t\t\t\t\t\t</bean>\n\t\t\t\t</entry>\n\t\t\t</map>\n\t\t</property>\n\t</bean>\n\t<bean class=\"com.jd.easyflow.objects.factory.ObjectFactorys\">\n\t   <property name=\"defaultObjectFactory\" ref=\"defaultObjectFactory\"></property>\n\t</bean>\n\t<bean class=\"com.jd.easyflow.spel.SpelHelper\"/>\n<!-- For client and server -->    \n    <bean id=\"flowEngine\" class=\"com.jd.easyflow.process.client.flow.StdFlowEngineImpl\">\n        <property name=\"flowPath\" value=\"classpath:flow/server/*.json,classpath:flow/client/*.json,classpath:flow/server/*.bpmn,classpath:flow/client/*.bpmn\"></property>\n        <property name=\"flowParser\">\n            <bean class=\"com.jd.easyflow.flow.bpmn.BpmnFlowParser\"></bean>\n        </property>\n        <property name=\"listeners\">\n            <list>\n                <ref bean=\"easyflow-process-processFlowListener\"/>\n            </list>\n        </property>\n        <property name=\"filters\">\n            <list>\n                <ref bean=\"easyflow-process-processFlowEngineFilter\"/>\n            </list>\n        </property>\n        <property name=\"localLoad\" value=\"${flow.local.load:true}\"></property>\n        <property name=\"localPush\" value=\"${flow.local.push:false}\"></property>        \n    </bean>\n    <alias name=\"flowEngine\" alias=\"easyflow-flowEngine\"/>\n     <bean id=\"fsmManager\" class=\"com.jd.easyflow.process.client.fsm.StdFsmManager\">\n        <property name=\"fsmPath\" value=\"classpath:fsm/client/*.json\"></property>\n        <property name=\"listeners\">\n            <list>\n                <ref bean=\"easyflow-process-processFsmListener\"/>\n            </list>\n        </property>\n        <property name=\"localLoad\" value=\"${flow.local.load:true}\"></property>\n        <property name=\"localPush\" value=\"${flow.local.push:false}\"></property>        \n    </bean>   \n    \n    <bean id=\"eventFlowListener\" class=\"com.jd.easyflow.flow.engine.event.impl.EventFlowListener\"/>\n    <bean id=\"interruptFlowListener\" class=\"com.jd.easyflow.flow.engine.event.impl.InterruptFlowListener\"/>\n    <bean id=\"eventNodeAction\" class=\"com.jd.easyflow.flow.model.action.EventNodeAction\"/>\n    <bean id=\"eventPostHandler\" class=\"com.jd.easyflow.flow.model.post.EventPostHandler\"/>    \n    <alias name=\"easyflow-task-taskCreateNodeAction\" alias=\"taskCreateNodeAction\"/>\n    <alias name=\"easyflow-task-taskExecuteNodeAction\" alias=\"taskExecuteNodeAction\"/>\n    <alias name=\"easyflow-task-taskCreateAndExecuteNodeAction\" alias=\"taskCreateAndExecuteNodeAction\"/>\n    <alias name=\"easyflow-task-taskEl\" alias=\"taskEl\"/>\n    \n    <!-- for client -->\n    <import resource=\"classpath:easyflow/easyflow-spring-processunit-client.xml\"/>\n    <import resource=\"classpath:easyflow/easyflow-spring-process-client.xml\"/>\n    <import resource=\"classpath:easyflow/easyflow-spring-process-client-processunit.xml\"/>\n\t\n<!-- For server -->\n    <import resource=\"spring-datasource.xml\"/>\n\t<alias name=\"dataSource\" alias=\"easyflow-lock-dataSource\"/>\n    <import resource=\"classpath:easyflow/easyflow-spring-lock-db.xml\"/>\n    <alias name=\"easyflow-lock-dbLocker\" alias=\"easyflow-process-locker\"/>\n    <alias name=\"easyflow-lock-dbLocker\" alias=\"easyflow-codegenerator-locker\"/>\n    <import resource=\"classpath:easyflow/easyflow-spring-message-spring.xml\"/>\n    <alias name=\"dataSource\" alias=\"easyflow-codegenerator-dataSource\"/>\n    <import resource=\"classpath:easyflow/easyflow-spring-codegenerator-server.xml\" />\n    <alias name=\"easyflow-lock-dbLocker\" alias=\"easyflow-processunit-lockService\"/>\n    <alias name=\"dataSource\" alias=\"easyflow-processunit-dataSource\"/>\n    <import resource=\"classpath:easyflow/easyflow-spring-processunit-server.xml\"/>    \n    <import resource=\"classpath:easyflow/easyflow-spring-form-server.xml\" />\n    <alias name=\"dataSource\" alias=\"easyflow-process-dataSource\"/>    \n    <import resource=\"classpath:easyflow/easyflow-spring-process-server.xml\"/>\n    \n    <bean id=\"easyflow-cache-localCacheServiceImpl\" class=\"com.jd.easyflow.cache.impl.LocalCacheServiceImpl\"></bean>\n    <alias name=\"easyflow-cache-localCacheServiceImpl\" alias=\"easyflow-process-cacheService\"/>\n    <alias name=\"easyflow-message-springMessageSendService\" alias=\"easyflow-process-messageSendService\"/>\n\n    <bean class=\"com.jd.easyflow.message.spring.EventMessageListener\">\n        <property name=\"messageListenerMap\">\n            <map>\n            </map>\n        </property>\n    </bean>\n    \n    <alias name=\"easyflow-message-springMessageSendService\" alias=\"easyflow-processunit-messageSendService\"></alias>\n        \n     <bean id=\"easyflow-action-actionAspect\" class=\"com.jd.easyflow.action.ActionAspect\">\n        <property name=\"function\">\n            <bean class=\"com.jd.easyflow.action.SimpleExportAopFunction\"></bean>\n        </property>\n    </bean>\n    \n     <aop:config>\n         <aop:aspect ref=\"easyflow-action-actionAspect\" order=\"200\">\n             <aop:pointcut id=\"easyflow-action-pointcut\" expression=\"@annotation(com.jd.easyflow.action.Action)\"/>\n             <aop:around pointcut-ref=\"easyflow-action-pointcut\" method=\"process\"/>\n         </aop:aspect>\n     </aop:config>         \n    \n</beans>"
  },
  {
    "path": "easyflow-process/easyflow-process-sample/src/main/resources/spring/open/spring-datasource-sharding.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t   xmlns=\"http://www.springframework.org/schema/beans\"\n\t   xmlns:bean=\"http://www.springframework.org/schema/util\"\n\t   xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n                        http://www.springframework.org/schema/beans/spring-beans.xsd\n                        http://www.springframework.org/schema/util\n                        http://www.springframework.org/schema/util/spring-util.xsd\">\n\n\t<bean id=\"dataSource\" class=\"com.zaxxer.hikari.HikariDataSource\">\n\t\t<property name=\"jdbcUrl\" value=\"${db.jdbcUrl}\"/>\n\t\t<property name=\"username\" value=\"${db.username}\" />\n\t\t<property name=\"password\" value=\"${db.password}\" />\n\t</bean>\n\t\n\t    <bean id=\"processUnitShardingDataSource\" class=\"com.jd.easyflow.sharding.datasource.ShardingDataSource\">\n        <property name=\"shardingConfigManager\" ref=\"easyflow-processunit-shardingConfigManager\"></property>\n        <property name=\"shardingTargetDataSources\">\n            <map key-type=\"java.lang.String\">\n            \t<entry key=\"appDataSource\" value-ref=\"dataSource\"></entry>\n            </map>\n        </property>\n        <property name=\"defaultTargetDataSource\" ref=\"dataSource\"></property>\n    </bean>\n    \n    <bean id=\"processShardingDataSource\" class=\"com.jd.easyflow.sharding.datasource.ShardingDataSource\">\n        <property name=\"shardingConfigManager\" ref=\"easyflow-process-shardingConfigManager\"></property>\n        <property name=\"shardingTargetDataSources\">\n            <map key-type=\"java.lang.String\">\n            \t<entry key=\"appDataSource\" value-ref=\"dataSource\"></entry>\n            </map>\n        </property>\n        <property name=\"defaultTargetDataSource\" ref=\"dataSource\"></property>\n    </bean>\n   \n\n\t<bean id=\"sqlSessionFactory\" class=\"org.mybatis.spring.SqlSessionFactoryBean\">\n\t\t<property name=\"dataSource\" ref=\"dataSource\" />\n\t\t<property name=\"mapperLocations\">\n\t\t\t<array>\n\t\t      <value>classpath*:easyflow/mapper/SequenceMapper.xml</value>\n\t\t      <value>classpath*:easyflow/mapper/FormTemplateMapper.xml</value>\n\t\t      <value>classpath*:easyflow/mapper/ProcessDefinitionMapper.xml</value>\n\t\t  </array>\n\t\t</property>\n\t</bean>\n\t\n    <bean id=\"puSqlSessionFactory\" class=\"org.mybatis.spring.SqlSessionFactoryBean\">\n        <property name=\"dataSource\" ref=\"processUnitShardingDataSource\" />\n\t<property name=\"mapperLocations\">\n\t\t<array>\n\t\t\t<value>classpath*:easyflow/shardingmapper/ProcessUnitExecutionMapper.xml</value>\n\t\t\t<value>classpath*:easyflow/shardingmapper/ProcessUnitInstanceMapper.xml</value>\n\t\t</array>\n\t</property>\n\t\t<property name=\"transactionFactory\">\n\t\t\t<bean class=\"com.jd.easyflow.sharding.transaction.ShardingSpringManagedTransactionFactory\">\n\t\t\t</bean>\n\t\t</property>        \n    </bean>  \n    \n     <bean id=\"processSqlSessionFactory\" class=\"org.mybatis.spring.SqlSessionFactoryBean\">\n        <property name=\"dataSource\" ref=\"processShardingDataSource\" />\n\t\t<property name=\"mapperLocations\">\n\t\t\t<array>\n\t\t      <value>classpath*:easyflow/shardingmapper/ProcessInstanceMapper.xml</value>\n\t\t      <value>classpath*:easyflow/shardingmapper/ProcessNodeInstanceMapper.xml</value>\n\t\t      <value>classpath*:easyflow/shardingmapper/ProcessNodeExecutionMapper.xml</value>\n\t\t      <value>classpath*:easyflow/shardingmapper/ProcessTaskAssignMapper.xml</value>\n\t\t      <value>classpath*:easyflow/shardingmapper/ProcessTaskEventMapper.xml</value>\n\t\t      <value>classpath*:easyflow/shardingmapper/ProcessTaskMapper.xml</value>\n\t\t\t</array>\n\t\t</property>        \n\t\t<property name=\"transactionFactory\">\n\t\t\t<bean class=\"com.jd.easyflow.sharding.transaction.ShardingSpringManagedTransactionFactory\">\n\t\t\t</bean>\n\t\t</property>        \n    </bean>    \n    \t\n\n\t<bean class=\"org.mybatis.spring.mapper.MapperScannerConfigurer\">\n\t\t<property name=\"sqlSessionFactoryBeanName\" value=\"sqlSessionFactory\" />\n\t\t<property name=\"basePackage\" value=\"\n\t\tcom.jd.easyflow.codegenerator.infrastructure.persistence.mapper,\n\t\tcom.jd.easyflow.form.infrastructure.persistence.mapper\"\n\t\t/>\n\t</bean>\n\t<bean id=\"processDefinitionMapperScannerConfigurer\" class=\"org.mybatis.spring.mapper.MapperScannerConfigurer\">\n\t\t<property name=\"sqlSessionFactoryBeanName\" value=\"sqlSessionFactory\" />\n\t\t<property name=\"basePackage\" value=\"com.jd.easyflow.process.infrastructure.persistence.mapper\"/>\n\t\t<property name=\"annotationClass\" value=\"com.jd.easyflow.sharding.mybatis.ShardingNotSupportedMapper\"></property>\n\t</bean>\t\n\t\n    <bean id=\"puMapperScannerConfigurer\" class=\"org.mybatis.spring.mapper.MapperScannerConfigurer\">\n        <property name=\"sqlSessionFactoryBeanName\" value=\"puSqlSessionFactory\" />\n        <property name=\"basePackage\" value=\"com.jd.easyflow.processunit.infrastructure.persistence.mapper\"\n        />\n    </bean>\n    \n    <bean id=\"processShardingMapperScannerConfigurer\" class=\"org.mybatis.spring.mapper.MapperScannerConfigurer\">\n\t\t<property name=\"sqlSessionFactoryBeanName\" value=\"processSqlSessionFactory\" />\n\t\t<property name=\"basePackage\" value=\"com.jd.easyflow.process.infrastructure.persistence.mapper\"/>\n\t\t<property name=\"annotationClass\" value=\"com.jd.easyflow.sharding.mybatis.ShardingSupportedMapper\"></property>\n\t</bean>\n \n</beans>"
  },
  {
    "path": "easyflow-process/easyflow-process-sample/src/main/resources/spring/open/spring-datasource.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t   xmlns=\"http://www.springframework.org/schema/beans\"\n\t   xmlns:bean=\"http://www.springframework.org/schema/util\"\n\t   xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n                        http://www.springframework.org/schema/beans/spring-beans.xsd\n                        http://www.springframework.org/schema/util\n                        http://www.springframework.org/schema/util/spring-util.xsd\">\n\n\t<bean id=\"dataSource\" class=\"com.zaxxer.hikari.HikariDataSource\">\n\t\t<property name=\"jdbcUrl\" value=\"${db.jdbcUrl}\"/>\n\t\t<property name=\"username\" value=\"${db.username}\" />\n\t\t<property name=\"password\" value=\"${db.password}\" />\n\t</bean>\n\n\t<bean id=\"sqlSessionFactory\" class=\"org.mybatis.spring.SqlSessionFactoryBean\">\n\t\t<property name=\"dataSource\" ref=\"dataSource\" />\n\t\t<property name=\"mapperLocations\">\n\t\t  <array>\n\t\t      <value>classpath*:easyflow/mapper/*Mapper.xml</value>\n\t\t  </array>\n\t\t </property>\n\t</bean>\n\n\t<bean class=\"org.mybatis.spring.mapper.MapperScannerConfigurer\">\n\t\t<property name=\"sqlSessionFactoryBeanName\" value=\"sqlSessionFactory\" />\n\t\t<property name=\"basePackage\" value=\"com.jd.easyflow.process.infrastructure.persistence.mapper,\n\t\tcom.jd.easyflow.codegenerator.infrastructure.persistence.mapper,\n\t\tcom.jd.easyflow.form.infrastructure.persistence.mapper,\n\t\tcom.jd.easyflow.processunit.infrastructure.persistence.mapper\"\n\t\t/>\n\t</bean>\n\t\n</beans>"
  },
  {
    "path": "easyflow-process/easyflow-process-sample/src/main/script/sql/create_all_table.sql",
    "content": "-- -- This is mysql database schema, if you use other database, please adjust ondemand.\n\nCREATE TABLE `form_template` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'primary key',\n  `template_code` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'template code',\n  `template_name` varchar(128) DEFAULT NULL COMMENT 'template name',\n  `biz_type` varchar(64)  DEFAULT NULL COMMENT 'biz type',\n  `config` json DEFAULT NULL COMMENT 'config',\n  `status` varchar(32)  DEFAULT NULL COMMENT 'status',\n  `created_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created date',\n  `modified_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified date',\n  `deleted` tinyint(4) NOT NULL DEFAULT '0' COMMENT 'delete flag',\n  PRIMARY KEY (`id`),\n  KEY `idx_template_code` (`template_code`)\n) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='form template';\n\n-- -- This is mysql database schema, if you use other database, please adjust ondemand.\n\nCREATE TABLE `lock_record` (\n`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'Primary key',\n`lock_key` varchar(256) DEFAULT NULL COMMENT 'lock key',\n`lock_flag` char(1) DEFAULT NULL COMMENT 'lock flag',\n`request_id` varchar(64) DEFAULT NULL COMMENT 'request id',\n`expired_time` bigint(20) DEFAULT NULL COMMENT 'expire timestamp',\n`created_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created date',\n`modified_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified date',\n`deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'delete flag',\nPRIMARY KEY (`id`),\nUNIQUE KEY `uni_idx_lock_key` (`lock_key`)\n) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='lock table';\n\n-- -- This is mysql database schema, if you use other database, please adjust ondemand.\n\nCREATE TABLE `sequence` (\n`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'Primary key',\n`seq_key` varchar(32) DEFAULT NULL COMMENT 'sequence key',\n`seq_sub_key` varchar(32) DEFAULT NULL COMMENT 'sequence subkey',\n`seq_value` bigint(20) DEFAULT NULL COMMENT 'sequence value',\n`created_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created date',\n`modified_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified date',\n`deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'delete flag',\nPRIMARY KEY (`id`),\nUNIQUE INDEX `unq_idx_seqkeysubkey` (`seq_key`,`seq_sub_key`)\n) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='sequence table';\n\n-- -- This is mysql database schema, if you use other database, please adjust ondemand.\n\n-- process definition\nCREATE TABLE `process_definition` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'primary key',\n  `def_id` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'definition ID',\n  `def_version` int(11) DEFAULT NULL COMMENT 'definition version',\n  `name` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'definition name',\n  `format` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'definition format',\n  `biz_type` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'definition biz type',\n  `category` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'definition category',\n  `content` mediumtext COLLATE utf8mb4_bin COMMENT 'definition content',\n  `json_content` mediumtext COLLATE utf8mb4_bin COMMENT 'json definition content',\n  `latest` tinyint(4) DEFAULT NULL COMMENT 'latest flag, 1 is latest',\n  `def_source` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'definition source',\n  `ext_data` json DEFAULT NULL COMMENT 'extension data',\n  `created_by` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'definition created by',\n  `modified_by` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'definition modified by',\n  `created_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created date',\n  `modified_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified date',\n  `deleted` tinyint(4) NOT NULL DEFAULT '0' COMMENT 'delete flag',\n  PRIMARY KEY (`id`),\n  INDEX `idx_defId_defVersion` (`def_id`,`def_version`),\n  INDEX `idx_category` (`category`)\n) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='process definition table';\n-- process instance\nCREATE TABLE `process_instance` (\n  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'primary key',\n  `instance_no` VARCHAR(64) NULL COMMENT 'instance no',\n  `instance_name` VARCHAR(128) NULL COMMENT 'instance name',\n  `process_type` VARCHAR(32) NULL COMMENT 'process type',\n  `biz_no` VARCHAR(128) NULL COMMENT 'biz no',\n  `product_code` VARCHAR(64) NULL COMMENT 'product code',\n  `creator` VARCHAR(64) NULL COMMENT 'instance creator',\n  `process_def_id` VARCHAR(128) NULL COMMENT 'definition ID',\n  `start_time` datetime NULL COMMENT 'instance start time',\n  `end_time` datetime NULL COMMENT 'instance end time',\n  `status` VARCHAR(32) NULL COMMENT 'instance status',\n  `parent_instance_no` VARCHAR(64) NULL COMMENT 'parent instance no',\n  `parent_node_instance_no` VARCHAR(64) NULL COMMENT 'parent node instance no',\n  `current_node_ids` VARCHAR(512) NULL COMMENT 'current node id list',\n  `biz_status` VARCHAR(64) NULL COMMENT 'instance biz status',\n  `biz_data` TEXT NULL COMMENT 'instance biz data',\n  `key_field` VARCHAR(128) NULL COMMENT 'key field',\n  `key_field2` VARCHAR(128) NULL COMMENT 'key field2',\n  `vars` JSON NULL COMMENT 'instance variables',\n  `ext_data` JSON NULL COMMENT 'extension data',\n  `created_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created date',\n  `modified_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified date',\n  `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'deleted flag',\n  PRIMARY KEY (`id`),\n  INDEX `idx_instanceNo` (`instance_no`),\n  INDEX `idx_bizNo_processType` (`biz_no`, process_type),\n  INDEX `idx_startTime` (`start_time`),\n  INDEX `idx_creator` (`creator`),\n  INDEX `idx_productCode` (`product_code`),\n  INDEX `idx_keyField` (`key_field`),\n  INDEX `idx_parentInstanceNo`(`parent_instance_no`))\nENGINE = InnoDB\nAUTO_INCREMENT = 1\nDEFAULT CHARSET= utf8mb4\nCOLLATE = utf8mb4_bin\nCOMMENT = 'process instance table';\n\n-- process node instance\nCREATE TABLE `process_node_instance` (\n  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'primary key',\n  `node_instance_no` VARCHAR(64) NULL COMMENT 'node instance no',\n  `process_instance_no` VARCHAR(64) NULL COMMENT 'process instance no',\n  `process_def_id` VARCHAR(128) NULL COMMENT 'definition ID',\n  `node_id` VARCHAR(128) NULL COMMENT 'node ID',\n  `start_time` DATETIME NULL COMMENT 'node instance start time',\n  `end_time` DATETIME NULL COMMENT 'node instance end time',\n  `status` VARCHAR(32) NULL COMMENT 'node instance status',\n  `product_code` VARCHAR(64) NULL COMMENT 'product code',\n  `executors` VARCHAR(1024) NULL COMMENT 'node executor',\n  `previous_node_instances` VARCHAR(512) NULL COMMENT 'previous node instances',  \n  `next_node_instances` VARCHAR(512) NULL COMMENT 'next node instances',\n  `vars` JSON NULL COMMENT 'node instance variables',\n  `ext_data` JSON NULL COMMENT 'extension data',\n  `created_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created date',\n  `modified_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified date',\n  `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'deleted flag',\n  PRIMARY KEY (`id`),\n  INDEX `idx_nodeInstanceNo` (`node_instance_no`),\n  INDEX `idx_processInstanceNo` (`process_instance_no`),\n  INDEX `idx_startTime` (`start_time`))\nENGINE = InnoDB\nAUTO_INCREMENT = 1\nDEFAULT CHARSET = utf8mb4\nCOLLATE = utf8mb4_bin\nCOMMENT = 'process node instance table';\n\n-- process node execution\nCREATE TABLE `process_node_execution` (\n  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'primary key',\n  `node_execution_no` VARCHAR(64) NULL COMMENT 'node execution no',\n  `node_instance_no` VARCHAR(64) NULL COMMENT 'node instance no',\n  `event_id` VARCHAR(128) NULL COMMENT 'event ID',\n  `process_def_id` VARCHAR(128) NULL COMMENT 'definition ID',\n  `node_id` VARCHAR(128) NULL COMMENT 'node ID',\n  `start_time` DATETIME NULL COMMENT 'start time',\n  `end_time` DATETIME NULL COMMENT 'end time',\n  `status` VARCHAR(32) NULL COMMENT 'status',\n  `product_code` VARCHAR(64) NULL COMMENT 'product code',\n  `executor` VARCHAR(64) NULL COMMENT 'executor',\n  `next_node_instances` VARCHAR(512) NULL COMMENT 'next node instances',\n  `ext_data` JSON NULL COMMENT 'extension data',\n  `created_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created date',\n  `modified_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified date',\n  `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'delete flag',\n  PRIMARY KEY (`id`),\n  INDEX `idx_executionNo` (`node_execution_no`),\n  INDEX `idx_nodeInstanceNo` (`node_instance_no`),\n  INDEX `idx_startTime` (`start_time`))\nENGINE = InnoDB\nAUTO_INCREMENT = 1\nDEFAULT CHARSET = utf8mb4\nCOLLATE = utf8mb4_bin\nCOMMENT = 'process node execution table';\n\n-- process task\nCREATE TABLE `process_task` (\n  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'primary key',\n  `task_no` VARCHAR(64)  NULL COMMENT 'task no',\n  `process_type` VARCHAR(32) NULL COMMENT 'process type',\n  `biz_no` VARCHAR(128) NULL COMMENT 'biz no',\n  `task_biz_code` VARCHAR(64)  NULL COMMENT 'task biz code',\n  `task_biz_name` VARCHAR(128)  NULL COMMENT 'task biz name',\n  `task_type` VARCHAR(64)  NULL COMMENT 'task type',\n  `process_instance_no` VARCHAR(64) NULL COMMENT 'process instance no',  \n  `node_instance_no` VARCHAR(64) NULL COMMENT 'node instance no',\n  `node_execution_no` VARCHAR(64) NULL COMMENT 'node execution no',\n  `assign_type`  VARCHAR(64) NULL COMMENT 'assign type',\n  `assign_info`  JSON NULL COMMENT 'assign info',\n  `assign_time`  DATETIME NULL COMMENT 'assign time',\n  `executor`  VARCHAR(64) NULL COMMENT 'executor',\n  `execute_biz_result` VARCHAR(64) COMMENT 'execute biz result',\n  `execute_biz_data` TEXT NULL COMMENT 'execute biz data',\n  `execute_time` DATETIME NULL COMMENT 'execute time',\n  `product_code`  VARCHAR(64) NULL COMMENT 'product code',\n  `creator` VARCHAR(64) NULL COMMENT 'creator',\n  `status` VARCHAR(32) NULL COMMENT 'task status',\n  `ext_data` JSON NULL COMMENT 'extension data',\n  `process_instance_key_field` VARCHAR(128) NULL COMMENT 'process instance key field',\n  `process_instance_key_field2` VARCHAR(128) NULL COMMENT 'process instance key field2',\n  `created_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created date',\n  `modified_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified date',\n  `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'delete flag',\n  PRIMARY KEY (`id`),\n  INDEX `idx_taskNo` (`task_no`),\n  INDEX `idx_bizNoProcessType` (`biz_no`, process_type),\n  INDEX `idx_processInstanceNo` (`process_instance_no`),\n  INDEX `idx_nodeInstanceNo` (`node_instance_no`),\n  INDEX `idx_executeTime` (`execute_time`),\n  INDEX `idx_assignTime` (`assign_time`),\n  INDEX `idx_executor` (`executor`),\n  INDEX `idx_processInstanceKeyField` (`process_instance_key_field`),\n  INDEX `idx_processInstanceKeyField2` (`process_instance_key_field2`))\nENGINE = InnoDB\nAUTO_INCREMENT = 1\nDEFAULT CHARSET = utf8mb4\nCOLLATE = utf8mb4_bin\nCOMMENT = 'process task table';\n\n-- process task assign\nCREATE TABLE `process_task_assign` (\n  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'primary key',\n  `assign_no` VARCHAR(64)  NULL COMMENT 'assign no',\n  `task_no` VARCHAR(64) NULL COMMENT 'task no',\n  `assign_type` VARCHAR(32) NULL COMMENT 'assign type',\n  `assign_group` VARCHAR(64) NULL COMMENT 'assign group',\n  `assign_group2` VARCHAR(64) NULL COMMENT 'assign group2',\n  `assign_user` VARCHAR(32) NULL COMMENT 'assign user',\n  `operation`   VARCHAR(32) NULL COMMENT 'operation',\n  `status` VARCHAR(32) NULL COMMENT 'status',\n  `assign_time`  DATETIME NULL COMMENT 'assign time',\n  `product_code`  VARCHAR(64) NULL COMMENT 'product code',\n  `ext_data` JSON NULL COMMENT 'extension data',\n  `created_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created date',\n  `modified_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified date',\n  `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'delete flag',\n  PRIMARY KEY (`id`),\n  INDEX `idx_assignNo` (`assign_no`), \n  INDEX `idx_taskNo` (`task_no`),\n  INDEX `idx_assignGroup` (`assign_group`),\n  INDEX `idx_assignGroup2` (`assign_group2`),\n  INDEX `idx_assignUser` (`assign_user`),\n  INDEX `idx_assignTime` (`assign_time`))\nENGINE = InnoDB\nAUTO_INCREMENT = 1\nDEFAULT CHARSET = utf8mb4\nCOLLATE = utf8mb4_bin\nCOMMENT = 'process task assign table';\n\n-- process task event.\nCREATE TABLE `process_task_event` (\n  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'primary key',\n  `event_no` VARCHAR(64)  NULL COMMENT 'event no',\n  `task_no` VARCHAR(64) NULL COMMENT 'task no',\n  `event_type` VARCHAR(32) NULL COMMENT 'event type',\n  `event_user` VARCHAR(64) NULL COMMENT 'event user',\n  `event_time` DATETIME NULL COMMENT 'event time',\n  `event_biz_result` VARCHAR(64) COMMENT 'event biz result',\n  `event_biz_data` TEXT NULL COMMENT 'event biz data',\n  `instance_biz_status` VARCHAR(64) COMMENT 'instance biz status',\n  `instance_biz_data` TEXT NULL COMMENT 'instance biz data',  \n  `product_code`  VARCHAR(64) NULL COMMENT 'product code',\n  `ext_data` JSON NULL COMMENT 'extension data',\n  `created_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created date',\n  `modified_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified date',\n  `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'delete flag',\n  PRIMARY KEY (`id`),\n  INDEX `idx_eventNo` (`event_no`), \n  INDEX `idx_taskNo` (`task_no`),\n  INDEX `idx_eventUser` (`event_user`),\n  INDEX `idx_eventTime` (`event_time`))\nENGINE = InnoDB\nAUTO_INCREMENT = 1\nDEFAULT CHARSET = utf8mb4\nCOLLATE = utf8mb4_bin\nCOMMENT = 'process task event table';\nCREATE TABLE `process_unit_instance` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'primark key',\n  `instance_no` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'instance no',\n  `biz_no` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'biz no',\n  `parent_no` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'parent instance no',\n  `process_unit_code` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'process unit code',\n  `product_code` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'product code',\n  `result` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'execute result',\n  `request_content` mediumtext COLLATE utf8mb4_bin COMMENT 'request content',\n  `response_content` mediumtext COLLATE utf8mb4_bin COMMENT 'response content',\n  `auto_run_flag` tinyint(1) DEFAULT NULL COMMENT 'auto run flag',\n  `auto_run_times` int(11) DEFAULT NULL COMMENT 'auto run times',\n  `next_auto_run_time` datetime DEFAULT NULL COMMENT 'next auto run time',\n  `vars` JSON NULL COMMENT 'instance variables',\n  `ext_data` json DEFAULT NULL COMMENT 'ext data',\n  `created_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created date',\n  `modified_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified date',\n  `deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'delete flag',\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `idx_instance_no` (`instance_no`),\n  UNIQUE KEY `idx_bizNo_unitCode` (`biz_no`,`process_unit_code`),\n  KEY `idx_autorun` (`auto_run_flag`,`next_auto_run_time`),\n  KEY `idx_createdDate` (`created_date`)\n) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='Process unit instance';\n\nCREATE TABLE `process_unit_execution` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'primark key',\n  `execution_no` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'execution no',\n  `request_no` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'request no',\n  `parent_no` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'parent instance no',\n  `process_unit_code` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'process unit code',\n  `biz_no` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'biz no',  \n  `instance_no` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'instance no',\n  `product_code` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'product code',\n  `result` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'execute result',\n  `request_content` mediumtext COLLATE utf8mb4_bin COMMENT 'request content',\n  `response_content` mediumtext COLLATE utf8mb4_bin COMMENT 'response content',\n  `request_time` datetime DEFAULT NULL COMMENT 'request time',\n  `response_time` datetime DEFAULT NULL COMMENT 'response time',\n  `elaspe_time` int(11) DEFAULT NULL COMMENT 'elaspe time',\n  `exec_type` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'exec type',\n  `ext_data` json DEFAULT NULL COMMENT 'ext data',\n  `created_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created date',\n  `modified_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified date',\n  `deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'deleted',\n  PRIMARY KEY (`id`),\n  KEY  `idx_execution_no` (`execution_no`),\n  KEY `idx_instance_no` (`instance_no`),\n  KEY `idx_request_time` (`request_time`),\n  KEY `idx_bizNo_unitCode` (`biz_no`,`process_unit_code`)\n) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='Process unit execution';"
  },
  {
    "path": "easyflow-process/easyflow-process-sample/src/main/script/sql/drop_all_table.sql",
    "content": "drop table `form_template`;\ndrop table `lock_record`;\ndrop table `sequence`;\ndrop table `process_definition`;\ndrop table `process_instance`;\ndrop table `process_node_instance`;\ndrop table `process_node_execution`;\ndrop table `process_task`;\ndrop table `process_task_assign`;\ndrop table `process_task_event`;\ndrop table `process_unit_instance`;\ndrop table `process_unit_execution`;"
  },
  {
    "path": "easyflow-process/easyflow-process-sample/src/main/script/sql/sample_form_template.sql",
    "content": "INSERT INTO `form_template` (`id`,`template_code`,`template_name`,`biz_type`,`config`,`status`,`created_date`,`modified_date`,`deleted`) VALUES (222,'PROCESS_TEST_TASK_EXECUTE_001','Test task execute',NULL,'{\\\"type\\\": \\\"page\\\", \\\"component\\\": {\\\"type\\\": \\\"tabs\\\", \\\"components\\\": [{\\\"name\\\": \\\"\\\", \\\"type\\\": \\\"tab\\\", \\\"sider\\\": false, \\\"components\\\": [{\\\"name\\\": \\\"\\\", \\\"type\\\": \\\"panel\\\", \\\"components\\\": [{\\\"cols\\\": 4, \\\"name\\\": \\\"\\\", \\\"type\\\": \\\"card\\\", \\\"components\\\": [{\\\"cols\\\": -1, \\\"name\\\": \\\"Approval opinions\\\", \\\"type\\\": \\\"textarea\\\", \\\"cfgKey\\\": \\\"auditInfo\\\", \\\"modify\\\": true, \\\"source\\\": \\\"product\\\", \\\"cfgType\\\": \\\"string\\\", \\\"modify0\\\": true, \\\"newline\\\": false, \\\"required\\\": false, \\\"valProcess\\\": \\\"key\\\"}]}]}]}]}, \\\"nullPolicy\\\": null, \\\"afterRender\\\": \\\"\\\", \\\"afterCollect\\\": \\\"\\\", \\\"beforeRender\\\": \\\"\\\", \\\"beforeCollect\\\": \\\"\\\"}','VALID','2022-01-15 07:26:54','2022-01-15 07:26:54',0);\nINSERT INTO `form_template` (`id`,`template_code`,`template_name`,`biz_type`,`config`,`status`,`created_date`,`modified_date`,`deleted`) VALUES (234,'PROCESS_TEST_TASK_CREATE_001','test task create',NULL,'{\\\"type\\\": \\\"page\\\", \\\"topHtml\\\": \\\"\\\", \\\"component\\\": {\\\"type\\\": \\\"tabs\\\", \\\"components\\\": [{\\\"name\\\": \\\"\\\", \\\"type\\\": \\\"tab\\\", \\\"sider\\\": false, \\\"components\\\": [{\\\"name\\\": \\\"\\\", \\\"type\\\": \\\"panel\\\", \\\"components\\\": [{\\\"cols\\\": null, \\\"name\\\": \\\"Test1\\\", \\\"type\\\": \\\"card\\\", \\\"components\\\": [{\\\"cols\\\": -1, \\\"name\\\": \\\"Test1\\\", \\\"type\\\": \\\"inputText\\\", \\\"cfgKey\\\": \\\"test\\\", \\\"modify\\\": true, \\\"source\\\": \\\"product\\\", \\\"cfgType\\\": \\\"string\\\", \\\"modify0\\\": true, \\\"newline\\\": false, \\\"required\\\": false, \\\"valProcess\\\": \\\"key\\\"}]}]}]}]}, \\\"bottomHtml\\\": \\\"\\\", \\\"nullPolicy\\\": null, \\\"afterRender\\\": \\\"\\\", \\\"afterCollect\\\": \\\"\\\", \\\"beforeRender\\\": \\\"\\\", \\\"beforeCollect\\\": \\\"\\\"}','VALID','2022-01-18 14:32:07','2022-01-18 14:32:07',0);\nINSERT INTO `form_template` (`id`,`template_code`,`template_name`,`biz_type`,`config`,`status`,`created_date`,`modified_date`,`deleted`) VALUES (239,'PROCESS_TEST_TASK_EXECUTE_002','test 002 node template',NULL,'{\\\"type\\\": \\\"page\\\", \\\"topHtml\\\": \\\"\\\", \\\"component\\\": {\\\"type\\\": \\\"tabs\\\", \\\"components\\\": [{\\\"name\\\": \\\"\\\", \\\"type\\\": \\\"tab\\\", \\\"sider\\\": false, \\\"components\\\": [{\\\"name\\\": \\\"\\\", \\\"type\\\": \\\"panel\\\", \\\"components\\\": [{\\\"cols\\\": 4, \\\"name\\\": \\\"\\\", \\\"type\\\": \\\"card\\\", \\\"components\\\": [{\\\"cols\\\": -1, \\\"name\\\": \\\"Approval opinions\\\", \\\"type\\\": \\\"inputText\\\", \\\"cfgKey\\\": \\\"auditInfo\\\", \\\"modify\\\": true, \\\"source\\\": \\\"product\\\", \\\"cfgType\\\": \\\"string\\\", \\\"modify0\\\": true, \\\"newline\\\": false, \\\"required\\\": true, \\\"valProcess\\\": \\\"key\\\"}, {\\\"cols\\\": -1, \\\"name\\\": \\\"Additional info\\\", \\\"type\\\": \\\"select\\\", \\\"cfgKey\\\": \\\"select\\\", \\\"modify\\\": true, \\\"source\\\": \\\"product\\\", \\\"cfgType\\\": \\\"string\\\", \\\"modify0\\\": true, \\\"newline\\\": false, \\\"required\\\": false, \\\"selectList\\\": [{\\\"name\\\": \\\"a\\\", \\\"value\\\": \\\"a\\\"}, {\\\"name\\\": \\\"b\\\", \\\"value\\\": \\\"b\\\"}], \\\"selectType\\\": \\\"single\\\", \\\"valProcess\\\": \\\"key\\\", \\\"selectValType\\\": \\\"\\\"}]}]}]}]}, \\\"bottomHtml\\\": \\\"         <form method=\\\\\\\"post\\\\\\\" id=\\\\\\\"executeForm\\\\\\\" class=\\\\\\\"j-ajax-form\\\\\\\">\\\\n\\\\t\\\\t        <input type=\\\\\\\"hidden\\\\\\\" name=\\\\\\\"taskNo\\\\\\\" id=\\\\\\\"taskNo\\\\\\\"/>\\\\n\\\\t\\\\t        <input type=\\\\\\\"hidden\\\\\\\" name=\\\\\\\"executeBizResult\\\\\\\" id=\\\\\\\"executeBizResult\\\\\\\"/>\\\\n                <textarea name=\\\\\\\"executeBizData\\\\\\\" id=\\\\\\\"executeBizData\\\\\\\" class=\\\\\\\"d-none\\\\\\\" ></textarea>\\\\n          <div class=\\\\\\\"row mt-2\\\\\\\">\\\\n            <div class=\\\\\\\"col text-center\\\\\\\">\\\\n            <button type=\\\\\\\"submit\\\\\\\" class=\\\\\\\"btn btn-primary j-btn-ok\\\\\\\" data-biz-result=\\\\\\\"PASS\\\\\\\">Pass2</button>\\\\n\\\\t\\\\t\\\\t<button type=\\\\\\\"submit\\\\\\\" class=\\\\\\\"btn btn-primary j-btn-ok\\\\\\\" data-biz-result=\\\\\\\"REJECT\\\\\\\">Reject2</button>\\\\n\\\\t\\\\t\\\\t<button type=\\\\\\\"submit\\\\\\\" class=\\\\\\\"btn btn-primary j-btn-ok\\\\\\\" data-biz-result=\\\\\\\"BACK\\\\\\\">Back to start node</button>\\\\n         </div>\\\\n    </div> \\\\t\\\\t\\\\t\\\\t\\\\n        </form> \\\", \\\"nullPolicy\\\": null, \\\"afterRender\\\": \\\"var $executeForm=$(\\\\\\\"#executeForm\\\\\\\");\\\\n$executeForm.attr(\\\\\\\"action\\\\\\\",\\\\\\\"/easyflow/processTask/ajax/commonTaskExecute\\\\\\\");\\\\n$executeForm.data(\\\\\\\"success-url\\\\\\\", \\\\\\\"/easyflow/processTask/list\\\\\\\");\\\\n$executeForm.find(\\\\\\\".j-btn-ok\\\\\\\").click(function(){\\\\n    taskPage.collect(taskData);\\\\n     $(\\\\\\\"#taskNo\\\\\\\").val(pageData.taskNo);\\\\n     $(\\\\\\\"#executeBizResult\\\\\\\").val($(this).data(\\\\\\\"biz-result\\\\\\\"));\\\\n     $(\\\\\\\"#executeBizData\\\\\\\").val(JSON.stringify(taskData, null, 2));\\\\n    if (page.$form.valid()) {\\\\n        $executeForm.submit();\\\\n         return false;\\\\n    } else {\\\\n        $.jMessage({title:\\\\\\\"Tips\\\\\\\", msg:\\\\\\\"Input error, please check\\\\\\\"});\\\\n    }\\\\n}); \\\", \\\"afterCollect\\\": \\\"\\\", \\\"beforeRender\\\": \\\"\\\", \\\"beforeCollect\\\": \\\"\\\"}','VALID','2022-02-22 23:18:39','2022-02-22 23:18:39',0);\nINSERT INTO `form_template` (`id`,`template_code`,`template_name`,`biz_type`,`config`,`status`,`created_date`,`modified_date`,`deleted`) VALUES (244,'PROCESS_TEST_001','PT-001',NULL,'{\\\"type\\\": \\\"page\\\", \\\"topHtml\\\": \\\"\\\", \\\"component\\\": {\\\"type\\\": \\\"tabs\\\", \\\"components\\\": [{\\\"name\\\": \\\"\\\", \\\"type\\\": \\\"tab\\\", \\\"sider\\\": false, \\\"components\\\": [{\\\"name\\\": \\\"\\\", \\\"type\\\": \\\"panel\\\", \\\"components\\\": [{\\\"cols\\\": null, \\\"name\\\": \\\"\\\", \\\"type\\\": \\\"card\\\", \\\"components\\\": [{\\\"cols\\\": -1, \\\"name\\\": \\\"Leave information\\\", \\\"type\\\": \\\"textarea\\\", \\\"cfgKey\\\": \\\"myData\\\", \\\"modify\\\": true, \\\"source\\\": \\\"product\\\", \\\"cfgType\\\": \\\"string\\\", \\\"modify0\\\": true, \\\"newline\\\": false, \\\"required\\\": false, \\\"valProcess\\\": \\\"key\\\"}]}]}]}]}, \\\"bottomHtml\\\": \\\"\\\", \\\"nullPolicy\\\": null, \\\"afterRender\\\": \\\"\\\", \\\"afterCollect\\\": \\\"\\\", \\\"beforeRender\\\": \\\"\\\", \\\"beforeCollect\\\": \\\"\\\"}','VALID','2022-08-14 14:01:32','2022-08-14 14:01:32',0);\n"
  },
  {
    "path": "easyflow-process/easyflow-process-sample/src/main/script/sql/sample_form_template_zh_CN.sql",
    "content": "INSERT INTO `form_template` (`id`,`template_code`,`template_name`,`biz_type`,`config`,`status`,`created_date`,`modified_date`,`deleted`) VALUES (222,'PROCESS_TEST_TASK_EXECUTE_001','Test task execute',NULL,'{\\\"type\\\": \\\"page\\\", \\\"component\\\": {\\\"type\\\": \\\"tabs\\\", \\\"components\\\": [{\\\"name\\\": \\\"\\\", \\\"type\\\": \\\"tab\\\", \\\"sider\\\": false, \\\"components\\\": [{\\\"name\\\": \\\"\\\", \\\"type\\\": \\\"panel\\\", \\\"components\\\": [{\\\"cols\\\": 4, \\\"name\\\": \\\"\\\", \\\"type\\\": \\\"card\\\", \\\"components\\\": [{\\\"cols\\\": -1, \\\"name\\\": \\\"审批意见\\\", \\\"type\\\": \\\"textarea\\\", \\\"cfgKey\\\": \\\"auditInfo\\\", \\\"modify\\\": true, \\\"source\\\": \\\"product\\\", \\\"cfgType\\\": \\\"string\\\", \\\"modify0\\\": true, \\\"newline\\\": false, \\\"required\\\": false, \\\"valProcess\\\": \\\"key\\\"}]}]}]}]}, \\\"nullPolicy\\\": null, \\\"afterRender\\\": \\\"\\\", \\\"afterCollect\\\": \\\"\\\", \\\"beforeRender\\\": \\\"\\\", \\\"beforeCollect\\\": \\\"\\\"}','VALID','2022-01-15 07:26:54','2022-01-15 07:26:54',0);\nINSERT INTO `form_template` (`id`,`template_code`,`template_name`,`biz_type`,`config`,`status`,`created_date`,`modified_date`,`deleted`) VALUES (234,'PROCESS_TEST_TASK_CREATE_001','test task create',NULL,'{\\\"type\\\": \\\"page\\\", \\\"topHtml\\\": \\\"\\\", \\\"component\\\": {\\\"type\\\": \\\"tabs\\\", \\\"components\\\": [{\\\"name\\\": \\\"\\\", \\\"type\\\": \\\"tab\\\", \\\"sider\\\": false, \\\"components\\\": [{\\\"name\\\": \\\"\\\", \\\"type\\\": \\\"panel\\\", \\\"components\\\": [{\\\"cols\\\": null, \\\"name\\\": \\\"测试1\\\", \\\"type\\\": \\\"card\\\", \\\"components\\\": [{\\\"cols\\\": -1, \\\"name\\\": \\\"测试1\\\", \\\"type\\\": \\\"inputText\\\", \\\"cfgKey\\\": \\\"test\\\", \\\"modify\\\": true, \\\"source\\\": \\\"product\\\", \\\"cfgType\\\": \\\"string\\\", \\\"modify0\\\": true, \\\"newline\\\": false, \\\"required\\\": false, \\\"valProcess\\\": \\\"key\\\"}]}]}]}]}, \\\"bottomHtml\\\": \\\"\\\", \\\"nullPolicy\\\": null, \\\"afterRender\\\": \\\"\\\", \\\"afterCollect\\\": \\\"\\\", \\\"beforeRender\\\": \\\"\\\", \\\"beforeCollect\\\": \\\"\\\"}','VALID','2022-01-18 14:32:07','2022-01-18 14:32:07',0);\nINSERT INTO `form_template` (`id`,`template_code`,`template_name`,`biz_type`,`config`,`status`,`created_date`,`modified_date`,`deleted`) VALUES (239,'PROCESS_TEST_TASK_EXECUTE_002','test 002 node template',NULL,'{\\\"type\\\": \\\"page\\\", \\\"topHtml\\\": \\\"\\\", \\\"component\\\": {\\\"type\\\": \\\"tabs\\\", \\\"components\\\": [{\\\"name\\\": \\\"\\\", \\\"type\\\": \\\"tab\\\", \\\"sider\\\": false, \\\"components\\\": [{\\\"name\\\": \\\"\\\", \\\"type\\\": \\\"panel\\\", \\\"components\\\": [{\\\"cols\\\": 4, \\\"name\\\": \\\"\\\", \\\"type\\\": \\\"card\\\", \\\"components\\\": [{\\\"cols\\\": -1, \\\"name\\\": \\\"审批意见\\\", \\\"type\\\": \\\"inputText\\\", \\\"cfgKey\\\": \\\"auditInfo\\\", \\\"modify\\\": true, \\\"source\\\": \\\"product\\\", \\\"cfgType\\\": \\\"string\\\", \\\"modify0\\\": true, \\\"newline\\\": false, \\\"required\\\": true, \\\"valProcess\\\": \\\"key\\\"}, {\\\"cols\\\": -1, \\\"name\\\": \\\"补充信息\\\", \\\"type\\\": \\\"select\\\", \\\"cfgKey\\\": \\\"select\\\", \\\"modify\\\": true, \\\"source\\\": \\\"product\\\", \\\"cfgType\\\": \\\"string\\\", \\\"modify0\\\": true, \\\"newline\\\": false, \\\"required\\\": false, \\\"selectList\\\": [{\\\"name\\\": \\\"a\\\", \\\"value\\\": \\\"a\\\"}, {\\\"name\\\": \\\"b\\\", \\\"value\\\": \\\"b\\\"}], \\\"selectType\\\": \\\"single\\\", \\\"valProcess\\\": \\\"key\\\", \\\"selectValType\\\": \\\"\\\"}]}]}]}]}, \\\"bottomHtml\\\": \\\"         <form method=\\\\\\\"post\\\\\\\" id=\\\\\\\"executeForm\\\\\\\" class=\\\\\\\"j-ajax-form\\\\\\\">\\\\n\\\\t\\\\t        <input type=\\\\\\\"hidden\\\\\\\" name=\\\\\\\"taskNo\\\\\\\" id=\\\\\\\"taskNo\\\\\\\"/>\\\\n\\\\t\\\\t        <input type=\\\\\\\"hidden\\\\\\\" name=\\\\\\\"executeBizResult\\\\\\\" id=\\\\\\\"executeBizResult\\\\\\\"/>\\\\n                <textarea name=\\\\\\\"executeBizData\\\\\\\" id=\\\\\\\"executeBizData\\\\\\\" class=\\\\\\\"d-none\\\\\\\" ></textarea>\\\\n          <div class=\\\\\\\"row mt-2\\\\\\\">\\\\n            <div class=\\\\\\\"col text-center\\\\\\\">\\\\n            <button type=\\\\\\\"submit\\\\\\\" class=\\\\\\\"btn btn-primary j-btn-ok\\\\\\\" data-biz-result=\\\\\\\"PASS\\\\\\\">通过2</button>\\\\n\\\\t\\\\t\\\\t<button type=\\\\\\\"submit\\\\\\\" class=\\\\\\\"btn btn-primary j-btn-ok\\\\\\\" data-biz-result=\\\\\\\"REJECT\\\\\\\">拒绝2</button>\\\\n\\\\t\\\\t\\\\t<button type=\\\\\\\"submit\\\\\\\" class=\\\\\\\"btn btn-primary j-btn-ok\\\\\\\" data-biz-result=\\\\\\\"BACK\\\\\\\">退回到开始节点</button>\\\\n         </div>\\\\n    </div> \\\\t\\\\t\\\\t\\\\t\\\\n        </form> \\\", \\\"nullPolicy\\\": null, \\\"afterRender\\\": \\\"var $executeForm=$(\\\\\\\"#executeForm\\\\\\\");\\\\n$executeForm.attr(\\\\\\\"action\\\\\\\",\\\\\\\"/easyflow/processTask/ajax/commonTaskExecute\\\\\\\");\\\\n$executeForm.data(\\\\\\\"success-url\\\\\\\", \\\\\\\"/easyflow/processTask/list\\\\\\\");\\\\n$executeForm.find(\\\\\\\".j-btn-ok\\\\\\\").click(function(){\\\\n    taskPage.collect(taskData);\\\\n     $(\\\\\\\"#taskNo\\\\\\\").val(pageData.taskNo);\\\\n     $(\\\\\\\"#executeBizResult\\\\\\\").val($(this).data(\\\\\\\"biz-result\\\\\\\"));\\\\n     $(\\\\\\\"#executeBizData\\\\\\\").val(JSON.stringify(taskData, null, 2));\\\\n    if (page.$form.valid()) {\\\\n        $executeForm.submit();\\\\n         return false;\\\\n    } else {\\\\n        $.jMessage({title:\\\\\\\"提示\\\\\\\", msg:\\\\\\\"信息录入有误，请检查\\\\\\\"});\\\\n    }\\\\n}); \\\", \\\"afterCollect\\\": \\\"\\\", \\\"beforeRender\\\": \\\"\\\", \\\"beforeCollect\\\": \\\"\\\"}','VALID','2022-02-22 23:18:39','2022-02-22 23:18:39',0);\nINSERT INTO `form_template` (`id`,`template_code`,`template_name`,`biz_type`,`config`,`status`,`created_date`,`modified_date`,`deleted`) VALUES (240,NULL,NULL,NULL,'{\\\"type\\\": \\\"page\\\", \\\"topHtml\\\": \\\"\\\", \\\"component\\\": {\\\"type\\\": \\\"tabs\\\", \\\"components\\\": [{\\\"name\\\": \\\"\\\", \\\"type\\\": \\\"tab\\\", \\\"sider\\\": false, \\\"components\\\": [{\\\"name\\\": \\\"\\\", \\\"type\\\": \\\"panel\\\", \\\"components\\\": [{\\\"cols\\\": 4, \\\"name\\\": \\\"\\\", \\\"type\\\": \\\"card\\\", \\\"components\\\": [{\\\"cols\\\": -1, \\\"name\\\": \\\"测试1\\\", \\\"type\\\": \\\"table\\\", \\\"cfgKey\\\": \\\"aaa\\\", \\\"modify\\\": true, \\\"source\\\": \\\"product\\\", \\\"cfgType\\\": \\\"string\\\", \\\"modify0\\\": true, \\\"newline\\\": false, \\\"required\\\": true, \\\"valProcess\\\": \\\"key\\\"}]}]}]}]}, \\\"bottomHtml\\\": \\\"\\\", \\\"nullPolicy\\\": null, \\\"afterRender\\\": \\\"\\\", \\\"afterCollect\\\": \\\"\\\", \\\"beforeRender\\\": \\\"\\\", \\\"beforeCollect\\\": \\\"\\\"}','VALID','2022-08-13 15:47:29','2022-08-13 15:47:29',0);\nINSERT INTO `form_template` (`id`,`template_code`,`template_name`,`biz_type`,`config`,`status`,`created_date`,`modified_date`,`deleted`) VALUES (244,'PROCESS_TEST_001','PT-001',NULL,'{\\\"type\\\": \\\"page\\\", \\\"topHtml\\\": \\\"\\\", \\\"component\\\": {\\\"type\\\": \\\"tabs\\\", \\\"components\\\": [{\\\"name\\\": \\\"\\\", \\\"type\\\": \\\"tab\\\", \\\"sider\\\": false, \\\"components\\\": [{\\\"name\\\": \\\"\\\", \\\"type\\\": \\\"panel\\\", \\\"components\\\": [{\\\"cols\\\": null, \\\"name\\\": \\\"\\\", \\\"type\\\": \\\"card\\\", \\\"components\\\": [{\\\"cols\\\": -1, \\\"name\\\": \\\"请假说明\\\", \\\"type\\\": \\\"textarea\\\", \\\"cfgKey\\\": \\\"myData\\\", \\\"modify\\\": true, \\\"source\\\": \\\"product\\\", \\\"cfgType\\\": \\\"string\\\", \\\"modify0\\\": true, \\\"newline\\\": false, \\\"required\\\": false, \\\"valProcess\\\": \\\"key\\\"}]}]}]}]}, \\\"bottomHtml\\\": \\\"\\\", \\\"nullPolicy\\\": null, \\\"afterRender\\\": \\\"\\\", \\\"afterCollect\\\": \\\"\\\", \\\"beforeRender\\\": \\\"\\\", \\\"beforeCollect\\\": \\\"\\\"}','VALID','2022-08-14 14:01:32','2022-08-14 14:01:32',0);\nINSERT INTO `form_template` (`id`,`template_code`,`template_name`,`biz_type`,`config`,`status`,`created_date`,`modified_date`,`deleted`) VALUES (245,'TABLE_TEST','table test',NULL,'{\\\"type\\\": \\\"page\\\", \\\"topHtml\\\": \\\"\\\", \\\"component\\\": {\\\"type\\\": \\\"tabs\\\", \\\"components\\\": [{\\\"name\\\": \\\"\\\", \\\"type\\\": \\\"tab\\\", \\\"sider\\\": false, \\\"components\\\": [{\\\"name\\\": \\\"\\\", \\\"type\\\": \\\"panel\\\", \\\"components\\\": [{\\\"cols\\\": 1, \\\"name\\\": \\\"\\\", \\\"type\\\": \\\"card\\\", \\\"components\\\": [{\\\"cols\\\": -1, \\\"name\\\": \\\"表格\\\", \\\"type\\\": \\\"table\\\", \\\"cfgKey\\\": \\\"abc\\\", \\\"modify\\\": true, \\\"source\\\": \\\"product\\\", \\\"cfgType\\\": \\\"json\\\", \\\"modify0\\\": true, \\\"newline\\\": false, \\\"required\\\": true, \\\"valProcess\\\": \\\"key\\\", \\\"beforeRender\\\": \\\"this.tableConf={\\\\ncolumns: [\\\\n            {radio: true},\\\\n            {field: \\'instanceName\\', title: \\'流程名称\\'},\\\\n            {field: \\'processType\\', title: \\'业务类型\\'}\\\\n        ]\\\\n}\\\"}]}]}]}]}, \\\"bottomHtml\\\": \\\"\\\", \\\"nullPolicy\\\": null, \\\"afterRender\\\": \\\"\\\", \\\"afterCollect\\\": \\\"\\\", \\\"beforeRender\\\": \\\"\\\", \\\"beforeCollect\\\": \\\"\\\"}','VALID','2022-08-15 11:26:45','2022-08-15 11:26:45',0);\nINSERT INTO `form_template` (`id`,`template_code`,`template_name`,`biz_type`,`config`,`status`,`created_date`,`modified_date`,`deleted`) VALUES (252,'PROCESS_TEST_TMP_SAVE_001','form instance-tmp save',NULL,'{\\\"type\\\": \\\"page\\\", \\\"topHtml\\\": \\\"\\\", \\\"component\\\": {\\\"type\\\": \\\"tabs\\\", \\\"components\\\": [{\\\"name\\\": \\\"\\\", \\\"type\\\": \\\"tab\\\", \\\"sider\\\": false, \\\"components\\\": [{\\\"name\\\": \\\"\\\", \\\"type\\\": \\\"panel\\\", \\\"components\\\": [{\\\"cols\\\": null, \\\"name\\\": \\\"\\\", \\\"type\\\": \\\"card\\\", \\\"components\\\": [{\\\"cols\\\": -1, \\\"name\\\": \\\"请假说明\\\", \\\"type\\\": \\\"textarea\\\", \\\"cfgKey\\\": \\\"myData\\\", \\\"modify\\\": true, \\\"source\\\": \\\"product\\\", \\\"cfgType\\\": \\\"string\\\", \\\"modify0\\\": true, \\\"newline\\\": false, \\\"required\\\": false, \\\"valProcess\\\": \\\"key\\\"}]}]}]}]}, \\\"bottomHtml\\\": \\\"\\\", \\\"nullPolicy\\\": null, \\\"afterRender\\\": \\\"\\\", \\\"afterCollect\\\": \\\"\\\", \\\"beforeRender\\\": \\\"\\\", \\\"beforeCollect\\\": \\\"\\\"}','VALID','2023-02-04 20:02:31','2023-02-04 20:02:31',0);\nINSERT INTO `form_template` (`id`,`template_code`,`template_name`,`biz_type`,`config`,`status`,`created_date`,`modified_date`,`deleted`) VALUES (255,'PROCESS_TEST_TASK_EXECUTE_TMP_SAVE_002','tmp save form',NULL,'{\\\"type\\\": \\\"page\\\", \\\"topHtml\\\": \\\"\\\", \\\"component\\\": {\\\"type\\\": \\\"tabs\\\", \\\"components\\\": [{\\\"name\\\": \\\"\\\", \\\"type\\\": \\\"tab\\\", \\\"sider\\\": false, \\\"components\\\": [{\\\"name\\\": \\\"\\\", \\\"type\\\": \\\"panel\\\", \\\"components\\\": [{\\\"cols\\\": 4, \\\"name\\\": \\\"\\\", \\\"type\\\": \\\"card\\\", \\\"components\\\": [{\\\"cols\\\": -1, \\\"name\\\": \\\"审批意见\\\", \\\"type\\\": \\\"inputText\\\", \\\"cfgKey\\\": \\\"auditInfo\\\", \\\"modify\\\": true, \\\"source\\\": \\\"product\\\", \\\"cfgType\\\": \\\"string\\\", \\\"modify0\\\": true, \\\"newline\\\": false, \\\"required\\\": true, \\\"valProcess\\\": \\\"key\\\"}, {\\\"cols\\\": -1, \\\"name\\\": \\\"补充信息\\\", \\\"type\\\": \\\"select\\\", \\\"cfgKey\\\": \\\"select\\\", \\\"modify\\\": true, \\\"source\\\": \\\"product\\\", \\\"cfgType\\\": \\\"string\\\", \\\"modify0\\\": true, \\\"newline\\\": false, \\\"required\\\": false, \\\"selectList\\\": [{\\\"name\\\": \\\"a\\\", \\\"value\\\": \\\"a\\\"}, {\\\"name\\\": \\\"b\\\", \\\"value\\\": \\\"b\\\"}], \\\"selectType\\\": \\\"single\\\", \\\"valProcess\\\": \\\"key\\\", \\\"selectValType\\\": \\\"\\\"}]}]}]}]}, \\\"bottomHtml\\\": \\\"         <form method=\\\\\\\"post\\\\\\\" id=\\\\\\\"executeForm\\\\\\\" class=\\\\\\\"j-ajax-form\\\\\\\">\\\\n\\\\t\\\\t        <input type=\\\\\\\"hidden\\\\\\\" name=\\\\\\\"taskNo\\\\\\\" id=\\\\\\\"taskNo\\\\\\\"/>\\\\n                        <input type=\\\\\\\"hidden\\\\\\\" name=\\\\\\\"instanceBizData\\\\\\\" id=\\\\\\\"instanceBizData\\\\\\\"/>\\\\n\\\\t\\\\t        <input type=\\\\\\\"hidden\\\\\\\" name=\\\\\\\"executeBizResult\\\\\\\" id=\\\\\\\"executeBizResult\\\\\\\"/>\\\\n\\\\t\\\\t        <input type=\\\\\\\"hidden\\\\\\\" name=\\\\\\\"operation\\\\\\\" id=\\\\\\\"operation\\\\\\\"/>\\\\n\\\\t\\\\t        <input type=\\\\\\\"hidden\\\\\\\" name=\\\\\\\"version\\\\\\\" id=\\\\\\\"version\\\\\\\"/>\\\\n                <textarea name=\\\\\\\"executeBizData\\\\\\\" id=\\\\\\\"executeBizData\\\\\\\" class=\\\\\\\"d-none\\\\\\\" ></textarea>\\\\n          <div class=\\\\\\\"row mt-2\\\\\\\">\\\\n            <div class=\\\\\\\"col text-center\\\\\\\">\\\\n           <button type=\\\\\\\"submit\\\\\\\" class=\\\\\\\"btn btn-primary j-btn-ok\\\\\\\" data-operation=\\\\\\\"SAVE\\\\\\\">暂存</button>\\\\n            <button type=\\\\\\\"submit\\\\\\\" class=\\\\\\\"btn btn-primary j-btn-ok\\\\\\\" data-biz-result=\\\\\\\"PASS\\\\\\\">通过2</button>\\\\n\\\\t\\\\t\\\\t<button type=\\\\\\\"submit\\\\\\\" class=\\\\\\\"btn btn-primary j-btn-ok\\\\\\\" data-biz-result=\\\\\\\"REJECT\\\\\\\">拒绝2</button>\\\\n\\\\t\\\\t\\\\t<button type=\\\\\\\"submit\\\\\\\" class=\\\\\\\"btn btn-primary j-btn-ok\\\\\\\" data-biz-result=\\\\\\\"BACK\\\\\\\">退回到开始节点</button>\\\\n         </div>\\\\n    </div> \\\\t\\\\t\\\\t\\\\t\\\\n        </form> \\\", \\\"nullPolicy\\\": null, \\\"afterRender\\\": \\\"var $executeForm=$(\\\\\\\"#executeForm\\\\\\\");\\\\n$executeForm.attr(\\\\\\\"action\\\\\\\",\\\\\\\"/easyflow/processTask/ajax/commonTaskExecute\\\\\\\");\\\\n$executeForm.data(\\\\\\\"success-url\\\\\\\", \\\\\\\"/easyflow/processTask/list\\\\\\\");\\\\n$executeForm.find(\\\\\\\".j-btn-ok\\\\\\\").click(function(){\\\\n\\\\t\\\\t if (! instancePage.$form.valid()) {\\\\n\\\\t\\\\t\\\\t $.jMessage({title:\\\\\\\"提示\\\\\\\", msg:\\\\\\\"流程实例信息录入有误，请检查\\\\\\\"}); \\\\n\\\\t\\\\t\\\\t return false;\\\\n\\\\t\\\\t } else {\\\\n\\\\t\\\\t\\\\t instancePage.collect(instanceData);\\\\n\\\\t\\\\t\\\\t $(\\\\\\\"#instanceBizData\\\\\\\").val(JSON.stringify(instanceData, null, 2));\\\\n\\\\t\\\\t }\\\\n    taskPage.collect(taskData);\\\\n     $(\\\\\\\"#taskNo\\\\\\\").val(pageData.taskNo);\\\\n     $(\\\\\\\"#version\\\\\\\").val(pageData.version);\\\\n     $(\\\\\\\"#executeBizResult\\\\\\\").val($(this).data(\\\\\\\"biz-result\\\\\\\"));\\\\n     $(\\\\\\\"#operation\\\\\\\").val($(this).data(\\\\\\\"operation\\\\\\\"));\\\\n     $(\\\\\\\"#executeBizData\\\\\\\").val(JSON.stringify(taskData, null, 2));\\\\n    if (page.$form.valid()) {\\\\n        $executeForm.submit();\\\\n         return false;\\\\n    } else {\\\\n        $.jMessage({title:\\\\\\\"提示\\\\\\\", msg:\\\\\\\"信息录入有误，请检查\\\\\\\"});\\\\n    }\\\\n}); \\\", \\\"afterCollect\\\": \\\"\\\", \\\"beforeRender\\\": \\\"\\\", \\\"beforeCollect\\\": \\\"\\\"}','VALID','2023-02-18 18:13:28','2023-02-18 18:13:28',0);\nINSERT INTO `form_template` (`id`,`template_code`,`template_name`,`biz_type`,`config`,`status`,`created_date`,`modified_date`,`deleted`) VALUES (256,'PROCESS_SHELL_001','SHELL flow instance',NULL,'{\\\"type\\\": \\\"page\\\", \\\"topHtml\\\": \\\"\\\", \\\"component\\\": {\\\"type\\\": \\\"tabs\\\", \\\"components\\\": [{\\\"name\\\": \\\"\\\", \\\"type\\\": \\\"tab\\\", \\\"sider\\\": false, \\\"components\\\": [{\\\"name\\\": \\\"\\\", \\\"type\\\": \\\"panel\\\", \\\"components\\\": [{\\\"cols\\\": null, \\\"name\\\": \\\"\\\", \\\"type\\\": \\\"card\\\", \\\"components\\\": [{\\\"cols\\\": -1, \\\"name\\\": \\\"申请信息\\\", \\\"type\\\": \\\"textarea\\\", \\\"cfgKey\\\": \\\"applyData\\\", \\\"modify\\\": true, \\\"source\\\": \\\"product\\\", \\\"cfgType\\\": \\\"string\\\", \\\"modify0\\\": true, \\\"newline\\\": false, \\\"required\\\": true, \\\"valProcess\\\": \\\"key\\\"}]}]}]}]}, \\\"bottomHtml\\\": \\\"\\\", \\\"nullPolicy\\\": null, \\\"afterRender\\\": \\\"\\\", \\\"afterCollect\\\": \\\"\\\", \\\"beforeRender\\\": \\\"\\\", \\\"beforeCollect\\\": \\\"\\\"}','VALID','2023-03-22 21:42:18','2023-03-22 21:42:18',0);\nINSERT INTO `form_template` (`id`,`template_code`,`template_name`,`biz_type`,`config`,`status`,`created_date`,`modified_date`,`deleted`) VALUES (257,'PROCESS_SHELL_TASK_AUDIT_001','SHELL task audit template',NULL,'{\\\"type\\\": \\\"page\\\", \\\"topHtml\\\": \\\"\\\", \\\"component\\\": {\\\"type\\\": \\\"tabs\\\", \\\"components\\\": [{\\\"name\\\": \\\"\\\", \\\"type\\\": \\\"tab\\\", \\\"sider\\\": false, \\\"components\\\": [{\\\"name\\\": \\\"\\\", \\\"type\\\": \\\"panel\\\", \\\"components\\\": [{\\\"cols\\\": 4, \\\"name\\\": \\\"\\\", \\\"type\\\": \\\"card\\\", \\\"components\\\": [{\\\"cols\\\": -1, \\\"name\\\": \\\"审批意见\\\", \\\"type\\\": \\\"textarea\\\", \\\"cfgKey\\\": \\\"auditInfo\\\", \\\"modify\\\": true, \\\"source\\\": \\\"product\\\", \\\"cfgType\\\": \\\"string\\\", \\\"modify0\\\": true, \\\"newline\\\": false, \\\"required\\\": false, \\\"valProcess\\\": \\\"key\\\"}]}]}]}]}, \\\"bottomHtml\\\": \\\"\\\", \\\"nullPolicy\\\": null, \\\"afterRender\\\": \\\"\\\", \\\"afterCollect\\\": \\\"\\\", \\\"beforeRender\\\": \\\"\\\", \\\"beforeCollect\\\": \\\"\\\"}','VALID','2023-03-22 23:09:16','2023-03-22 23:09:16',0);\n\n"
  },
  {
    "path": "easyflow-process/easyflow-process-sample/src/main/script/sql/sample_sharding.sql",
    "content": "drop table `process_instance_001`;\ndrop table `process_node_instance_001`;\ndrop table `process_node_execution_001`;\ndrop table `process_task_001`;\ndrop table `process_task_assign_001`;\ndrop table `process_task_event_001`;\ndrop table `process_instance_002`;\ndrop table `process_node_instance_002`;\ndrop table `process_node_execution_002`;\ndrop table `process_task_002`;\ndrop table `process_task_assign_002`;\ndrop table `process_task_event_002`;\n\ndrop table `process_unit_instance_001`;\ndrop table `process_unit_execution_001`;\ndrop table `process_unit_instance_002`;\ndrop table `process_unit_execution_002`;\n\n-- process instance\nCREATE TABLE `process_instance_001` (\n  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'primary key',\n  `instance_no` VARCHAR(64) NULL COMMENT 'instance no',\n  `instance_name` VARCHAR(128) NULL COMMENT 'instance name',\n  `process_type` VARCHAR(32) NULL COMMENT 'process type',\n  `biz_no` VARCHAR(128) NULL COMMENT 'biz no',\n  `product_code` VARCHAR(64) NULL COMMENT 'product code',\n  `creator` VARCHAR(64) NULL COMMENT 'instance creator',\n  `process_def_id` VARCHAR(128) NULL COMMENT 'definition ID',\n  `start_time` datetime NULL COMMENT 'instance start time',\n  `end_time` datetime NULL COMMENT 'instance end time',\n  `status` VARCHAR(32) NULL COMMENT 'instance status',\n  `parent_instance_no` VARCHAR(64) NULL COMMENT 'parent instance no',\n  `parent_node_instance_no` VARCHAR(64) NULL COMMENT 'parent node instance no',\n  `current_node_ids` VARCHAR(512) NULL COMMENT 'current node id list',\n  `biz_status` VARCHAR(64) NULL COMMENT 'instance biz status',\n  `biz_data` TEXT NULL COMMENT 'instance biz data',\n  `key_field` VARCHAR(128) NULL COMMENT 'key field',\n  `key_field2` VARCHAR(128) NULL COMMENT 'key field2',\n  `vars` JSON NULL COMMENT 'instance variables',\n  `ext_data` JSON NULL COMMENT 'extension data',\n  `created_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created date',\n  `modified_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified date',\n  `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'deleted flag',\n  PRIMARY KEY (`id`),\n  INDEX `idx_instanceNo` (`instance_no`),\n  INDEX `idx_bizNo_processType` (`biz_no`, process_type),\n  INDEX `idx_startTime` (`start_time`),\n  INDEX `idx_creator` (`creator`),\n  INDEX `idx_productCode` (`product_code`))\nENGINE = InnoDB\nAUTO_INCREMENT = 1\nDEFAULT CHARSET= utf8mb4\nCOLLATE = utf8mb4_bin\nCOMMENT = 'process instance table';\n\n-- process node instance\nCREATE TABLE `process_node_instance_001` (\n  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'primary key',\n  `node_instance_no` VARCHAR(64) NULL COMMENT 'node instance no',\n  `process_instance_no` VARCHAR(64) NULL COMMENT 'process instance no',\n  `process_def_id` VARCHAR(128) NULL COMMENT 'definition ID',\n  `node_id` VARCHAR(128) NULL COMMENT 'node ID',\n  `start_time` DATETIME NULL COMMENT 'node instance start time',\n  `end_time` DATETIME NULL COMMENT 'node instance end time',\n  `status` VARCHAR(32) NULL COMMENT 'node instance status',\n  `product_code` VARCHAR(64) NULL COMMENT 'product code',\n  `executors` VARCHAR(1024) NULL COMMENT 'node executor',\n  `previous_node_instances` VARCHAR(512) NULL COMMENT 'previous node instances',  \n  `next_node_instances` VARCHAR(512) NULL COMMENT 'next node instances',\n  `vars` JSON NULL COMMENT 'node instance variables',\n  `ext_data` JSON NULL COMMENT 'extension data',\n  `created_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created date',\n  `modified_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified date',\n  `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'deleted flag',\n  PRIMARY KEY (`id`),\n  INDEX `idx_nodeInstanceNo` (`node_instance_no`),\n  INDEX `idx_processInstanceNo` (`process_instance_no`),\n  INDEX `idx_startTime` (`start_time`))\nENGINE = InnoDB\nAUTO_INCREMENT = 1\nDEFAULT CHARSET = utf8mb4\nCOLLATE = utf8mb4_bin\nCOMMENT = 'process node instance table';\n\n-- process node execution\nCREATE TABLE `process_node_execution_001` (\n  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'primary key',\n  `node_execution_no` VARCHAR(64) NULL COMMENT 'node execution no',\n  `node_instance_no` VARCHAR(64) NULL COMMENT 'node instance no',\n  `event_id` VARCHAR(128) NULL COMMENT 'event ID',\n  `process_def_id` VARCHAR(128) NULL COMMENT 'definition ID',\n  `node_id` VARCHAR(128) NULL COMMENT 'node ID',\n  `start_time` DATETIME NULL COMMENT 'start time',\n  `end_time` DATETIME NULL COMMENT 'end time',\n  `status` VARCHAR(32) NULL COMMENT 'status',\n  `product_code` VARCHAR(64) NULL COMMENT 'product code',\n  `executor` VARCHAR(64) NULL COMMENT 'executor',\n  `next_node_instances` VARCHAR(512) NULL COMMENT 'next node instances',\n  `ext_data` JSON NULL COMMENT 'extension data',\n  `created_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created date',\n  `modified_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified date',\n  `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'delete flag',\n  PRIMARY KEY (`id`),\n  INDEX `idx_executionNo` (`node_execution_no`),\n  INDEX `idx_nodeInstanceNo` (`node_instance_no`),\n  INDEX `idx_startTime` (`start_time`))\nENGINE = InnoDB\nAUTO_INCREMENT = 1\nDEFAULT CHARSET = utf8mb4\nCOLLATE = utf8mb4_bin\nCOMMENT = 'process node execution table';\n\n-- process task\nCREATE TABLE `process_task_001` (\n  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'primary key',\n  `task_no` VARCHAR(64)  NULL COMMENT 'task no',\n  `process_type` VARCHAR(32) NULL COMMENT 'process type',\n  `biz_no` VARCHAR(128) NULL COMMENT 'biz no',\n  `task_biz_code` VARCHAR(64)  NULL COMMENT 'task biz code',\n  `task_biz_name` VARCHAR(128)  NULL COMMENT 'task biz name',\n  `task_type` VARCHAR(64)  NULL COMMENT 'task type',\n  `process_instance_no` VARCHAR(64) NULL COMMENT 'process instance no',  \n  `node_instance_no` VARCHAR(64) NULL COMMENT 'node instance no',\n  `node_execution_no` VARCHAR(64) NULL COMMENT 'node execution no',\n  `assign_type`  VARCHAR(64) NULL COMMENT 'assign type',\n  `assign_info`  JSON NULL COMMENT 'assign info',\n  `assign_time`  DATETIME NULL COMMENT 'assign time',\n  `executor`  VARCHAR(64) NULL COMMENT 'executor',\n  `execute_biz_result` VARCHAR(64) COMMENT 'execute biz result',\n  `execute_biz_data` TEXT NULL COMMENT 'execute biz data',\n  `execute_time` DATETIME NULL COMMENT 'execute time',\n  `product_code`  VARCHAR(64) NULL COMMENT 'product code',\n  `creator` VARCHAR(64) NULL COMMENT 'creator',\n  `status` VARCHAR(32) NULL COMMENT 'task status',\n  `ext_data` JSON NULL COMMENT 'extension data',\n  `process_instance_key_field` VARCHAR(128) NULL COMMENT 'process instance key field',\n  `process_instance_key_field2` VARCHAR(128) NULL COMMENT 'process instance key field2',\n  `created_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created date',\n  `modified_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified date',\n  `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'delete flag',\n  PRIMARY KEY (`id`),\n  INDEX `idx_taskNo` (`task_no`),\n  INDEX `idx_bizNoProcessType` (`biz_no`, process_type),\n  INDEX `idx_executeTime` (`execute_time`),\n  INDEX `idx_assignTime` (`assign_time`),\n  INDEX `idx_executor` (`executor`),\n  INDEX `idx_processInstanceKeyField` (`process_instance_key_field`),\n  INDEX `idx_processInstanceKeyField2` (`process_instance_key_field2`))\nENGINE = InnoDB\nAUTO_INCREMENT = 1\nDEFAULT CHARSET = utf8mb4\nCOLLATE = utf8mb4_bin\nCOMMENT = 'process task table';\n\n-- process task assign\nCREATE TABLE `process_task_assign_001` (\n  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'primary key',\n  `assign_no` VARCHAR(64)  NULL COMMENT 'assign no',\n  `task_no` VARCHAR(64) NULL COMMENT 'task no',\n  `assign_type` VARCHAR(32) NULL COMMENT 'assign type',\n  `assign_group` VARCHAR(64) NULL COMMENT 'assign group',\n  `assign_group2` VARCHAR(64) NULL COMMENT 'assign group2',\n  `assign_user` VARCHAR(32) NULL COMMENT 'assign user',\n  `operation`   VARCHAR(32) NULL COMMENT 'operation',\n  `status` VARCHAR(32) NULL COMMENT 'status',\n  `assign_time`  DATETIME NULL COMMENT 'assign time',\n  `product_code`  VARCHAR(64) NULL COMMENT 'product code',\n  `ext_data` JSON NULL COMMENT 'extension data',\n  `created_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created date',\n  `modified_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified date',\n  `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'delete flag',\n  PRIMARY KEY (`id`),\n  INDEX `idx_assignNo` (`assign_no`), \n  INDEX `idx_taskNo` (`task_no`),\n  INDEX `idx_assignGroup` (`assign_group`),\n  INDEX `idx_assignGroup2` (`assign_group2`),\n  INDEX `idx_assignUser` (`assign_user`),\n  INDEX `idx_assignTime` (`assign_time`))\nENGINE = InnoDB\nAUTO_INCREMENT = 1\nDEFAULT CHARSET = utf8mb4\nCOLLATE = utf8mb4_bin\nCOMMENT = 'process task assign table';\n\n-- process task event.\nCREATE TABLE `process_task_event_001` (\n  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'primary key',\n  `event_no` VARCHAR(64)  NULL COMMENT 'event no',\n  `task_no` VARCHAR(64) NULL COMMENT 'task no',\n  `event_type` VARCHAR(32) NULL COMMENT 'event type',\n  `event_user` VARCHAR(64) NULL COMMENT 'event user',\n  `event_time` DATETIME NULL COMMENT 'event time',\n  `event_biz_result` VARCHAR(64) COMMENT 'event biz result',\n  `event_biz_data` TEXT NULL COMMENT 'event biz data',\n  `instance_biz_status` VARCHAR(64) COMMENT 'instance biz status',\n  `instance_biz_data` TEXT NULL COMMENT 'instance biz data',  \n  `product_code`  VARCHAR(64) NULL COMMENT 'product code',\n  `ext_data` JSON NULL COMMENT 'extension data',\n  `created_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created date',\n  `modified_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified date',\n  `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'delete flag',\n  PRIMARY KEY (`id`),\n  INDEX `idx_eventNo` (`event_no`), \n  INDEX `idx_taskNo` (`task_no`),\n  INDEX `idx_eventUser` (`event_user`),\n  INDEX `idx_eventTime` (`event_time`))\nENGINE = InnoDB\nAUTO_INCREMENT = 1\nDEFAULT CHARSET = utf8mb4\nCOLLATE = utf8mb4_bin\nCOMMENT = 'process task event table';\n\n-- process instance\nCREATE TABLE `process_instance_002` (\n  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'primary key',\n  `instance_no` VARCHAR(64) NULL COMMENT 'instance no',\n  `instance_name` VARCHAR(128) NULL COMMENT 'instance name',\n  `process_type` VARCHAR(32) NULL COMMENT 'process type',\n  `biz_no` VARCHAR(128) NULL COMMENT 'biz no',\n  `product_code` VARCHAR(64) NULL COMMENT 'product code',\n  `creator` VARCHAR(64) NULL COMMENT 'instance creator',\n  `process_def_id` VARCHAR(128) NULL COMMENT 'definition ID',\n  `start_time` datetime NULL COMMENT 'instance start time',\n  `end_time` datetime NULL COMMENT 'instance end time',\n  `status` VARCHAR(32) NULL COMMENT 'instance status',\n  `parent_instance_no` VARCHAR(64) NULL COMMENT 'parent instance no',\n  `parent_node_instance_no` VARCHAR(64) NULL COMMENT 'parent node instance no',\n  `current_node_ids` VARCHAR(512) NULL COMMENT 'current node id list',\n  `biz_status` VARCHAR(64) NULL COMMENT 'instance biz status',\n  `biz_data` TEXT NULL COMMENT 'instance biz data',\n  `key_field` VARCHAR(128) NULL COMMENT 'key field',\n  `key_field2` VARCHAR(128) NULL COMMENT 'key field2',\n  `vars` JSON NULL COMMENT 'instance variables',\n  `ext_data` JSON NULL COMMENT 'extension data',\n  `created_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created date',\n  `modified_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified date',\n  `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'deleted flag',\n  PRIMARY KEY (`id`),\n  INDEX `idx_instanceNo` (`instance_no`),\n  INDEX `idx_bizNo_processType` (`biz_no`, process_type),\n  INDEX `idx_startTime` (`start_time`),\n  INDEX `idx_creator` (`creator`),\n  INDEX `idx_productCode` (`product_code`))\nENGINE = InnoDB\nAUTO_INCREMENT = 1\nDEFAULT CHARSET= utf8mb4\nCOLLATE = utf8mb4_bin\nCOMMENT = 'process instance table';\n\n-- process node instance\nCREATE TABLE `process_node_instance_002` (\n  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'primary key',\n  `node_instance_no` VARCHAR(64) NULL COMMENT 'node instance no',\n  `process_instance_no` VARCHAR(64) NULL COMMENT 'process instance no',\n  `process_def_id` VARCHAR(128) NULL COMMENT 'definition ID',\n  `node_id` VARCHAR(128) NULL COMMENT 'node ID',\n  `start_time` DATETIME NULL COMMENT 'node instance start time',\n  `end_time` DATETIME NULL COMMENT 'node instance end time',\n  `status` VARCHAR(32) NULL COMMENT 'node instance status',\n  `product_code` VARCHAR(64) NULL COMMENT 'product code',\n  `executors` VARCHAR(1024) NULL COMMENT 'node executor',\n  `previous_node_instances` VARCHAR(512) NULL COMMENT 'previous node instances',  \n  `next_node_instances` VARCHAR(512) NULL COMMENT 'next node instances',\n  `vars` JSON NULL COMMENT 'node instance variables',\n  `ext_data` JSON NULL COMMENT 'extension data',\n  `created_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created date',\n  `modified_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified date',\n  `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'deleted flag',\n  PRIMARY KEY (`id`),\n  INDEX `idx_nodeInstanceNo` (`node_instance_no`),\n  INDEX `idx_processInstanceNo` (`process_instance_no`),\n  INDEX `idx_startTime` (`start_time`))\nENGINE = InnoDB\nAUTO_INCREMENT = 1\nDEFAULT CHARSET = utf8mb4\nCOLLATE = utf8mb4_bin\nCOMMENT = 'process node instance table';\n\n-- process node execution\nCREATE TABLE `process_node_execution_002` (\n  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'primary key',\n  `node_execution_no` VARCHAR(64) NULL COMMENT 'node execution no',\n  `node_instance_no` VARCHAR(64) NULL COMMENT 'node instance no',\n  `event_id` VARCHAR(128) NULL COMMENT 'event ID',\n  `process_def_id` VARCHAR(128) NULL COMMENT 'definition ID',\n  `node_id` VARCHAR(128) NULL COMMENT 'node ID',\n  `start_time` DATETIME NULL COMMENT 'start time',\n  `end_time` DATETIME NULL COMMENT 'end time',\n  `status` VARCHAR(32) NULL COMMENT 'status',\n  `product_code` VARCHAR(64) NULL COMMENT 'product code',\n  `executor` VARCHAR(64) NULL COMMENT 'executor',\n  `next_node_instances` VARCHAR(512) NULL COMMENT 'next node instances',\n  `ext_data` JSON NULL COMMENT 'extension data',\n  `created_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created date',\n  `modified_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified date',\n  `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'delete flag',\n  PRIMARY KEY (`id`),\n  INDEX `idx_executionNo` (`node_execution_no`),\n  INDEX `idx_nodeInstanceNo` (`node_instance_no`),\n  INDEX `idx_startTime` (`start_time`))\nENGINE = InnoDB\nAUTO_INCREMENT = 1\nDEFAULT CHARSET = utf8mb4\nCOLLATE = utf8mb4_bin\nCOMMENT = 'process node execution table';\n\n-- process task\nCREATE TABLE `process_task_002` (\n  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'primary key',\n  `task_no` VARCHAR(64)  NULL COMMENT 'task no',\n  `process_type` VARCHAR(32) NULL COMMENT 'process type',\n  `biz_no` VARCHAR(128) NULL COMMENT 'biz no',\n  `task_biz_code` VARCHAR(64)  NULL COMMENT 'task biz code',\n  `task_biz_name` VARCHAR(128)  NULL COMMENT 'task biz name',\n  `task_type` VARCHAR(64)  NULL COMMENT 'task type',\n  `process_instance_no` VARCHAR(64) NULL COMMENT 'process instance no',  \n  `node_instance_no` VARCHAR(64) NULL COMMENT 'node instance no',\n  `node_execution_no` VARCHAR(64) NULL COMMENT 'node execution no',\n  `assign_type`  VARCHAR(64) NULL COMMENT 'assign type',\n  `assign_info`  JSON NULL COMMENT 'assign info',\n  `assign_time`  DATETIME NULL COMMENT 'assign time',\n  `executor`  VARCHAR(64) NULL COMMENT 'executor',\n  `execute_biz_result` VARCHAR(64) COMMENT 'execute biz result',\n  `execute_biz_data` TEXT NULL COMMENT 'execute biz data',\n  `execute_time` DATETIME NULL COMMENT 'execute time',\n  `product_code`  VARCHAR(64) NULL COMMENT 'product code',\n  `creator` VARCHAR(64) NULL COMMENT 'creator',\n  `status` VARCHAR(32) NULL COMMENT 'task status',\n  `ext_data` JSON NULL COMMENT 'extension data',\n  `process_instance_key_field` VARCHAR(128) NULL COMMENT 'process instance key field',\n  `process_instance_key_field2` VARCHAR(128) NULL COMMENT 'process instance key field2',\n  `created_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created date',\n  `modified_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified date',\n  `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'delete flag',\n  PRIMARY KEY (`id`),\n  INDEX `idx_taskNo` (`task_no`),\n  INDEX `idx_bizNoProcessType` (`biz_no`, process_type),\n  INDEX `idx_executeTime` (`execute_time`),\n  INDEX `idx_assignTime` (`assign_time`),\n  INDEX `idx_executor` (`executor`),\n  INDEX `idx_processInstanceKeyField` (`process_instance_key_field`),\n  INDEX `idx_processInstanceKeyField2` (`process_instance_key_field2`))\nENGINE = InnoDB\nAUTO_INCREMENT = 1\nDEFAULT CHARSET = utf8mb4\nCOLLATE = utf8mb4_bin\nCOMMENT = 'process task table';\n\n-- process task assign\nCREATE TABLE `process_task_assign_002` (\n  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'primary key',\n  `assign_no` VARCHAR(64)  NULL COMMENT 'assign no',\n  `task_no` VARCHAR(64) NULL COMMENT 'task no',\n  `assign_type` VARCHAR(32) NULL COMMENT 'assign type',\n  `assign_group` VARCHAR(64) NULL COMMENT 'assign group',\n  `assign_group2` VARCHAR(64) NULL COMMENT 'assign group2',\n  `assign_user` VARCHAR(32) NULL COMMENT 'assign user',\n  `operation`   VARCHAR(32) NULL COMMENT 'operation',\n  `status` VARCHAR(32) NULL COMMENT 'status',\n  `assign_time`  DATETIME NULL COMMENT 'assign time',\n  `product_code`  VARCHAR(64) NULL COMMENT 'product code',\n  `ext_data` JSON NULL COMMENT 'extension data',\n  `created_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created date',\n  `modified_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified date',\n  `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'delete flag',\n  PRIMARY KEY (`id`),\n  INDEX `idx_assignNo` (`assign_no`), \n  INDEX `idx_taskNo` (`task_no`),\n  INDEX `idx_assignGroup` (`assign_group`),\n  INDEX `idx_assignGroup2` (`assign_group2`),\n  INDEX `idx_assignUser` (`assign_user`),\n  INDEX `idx_assignTime` (`assign_time`))\nENGINE = InnoDB\nAUTO_INCREMENT = 1\nDEFAULT CHARSET = utf8mb4\nCOLLATE = utf8mb4_bin\nCOMMENT = 'process task assign table';\n\n-- process task event.\nCREATE TABLE `process_task_event_002` (\n  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'primary key',\n  `event_no` VARCHAR(64)  NULL COMMENT 'event no',\n  `task_no` VARCHAR(64) NULL COMMENT 'task no',\n  `event_type` VARCHAR(32) NULL COMMENT 'event type',\n  `event_user` VARCHAR(64) NULL COMMENT 'event user',\n  `event_time` DATETIME NULL COMMENT 'event time',\n  `event_biz_result` VARCHAR(64) COMMENT 'event biz result',\n  `event_biz_data` TEXT NULL COMMENT 'event biz data',\n  `instance_biz_status` VARCHAR(64) COMMENT 'instance biz status',\n  `instance_biz_data` TEXT NULL COMMENT 'instance biz data',  \n  `product_code`  VARCHAR(64) NULL COMMENT 'product code',\n  `ext_data` JSON NULL COMMENT 'extension data',\n  `created_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created date',\n  `modified_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified date',\n  `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'delete flag',\n  PRIMARY KEY (`id`),\n  INDEX `idx_eventNo` (`event_no`), \n  INDEX `idx_taskNo` (`task_no`),\n  INDEX `idx_eventUser` (`event_user`),\n  INDEX `idx_eventTime` (`event_time`))\nENGINE = InnoDB\nAUTO_INCREMENT = 1\nDEFAULT CHARSET = utf8mb4\nCOLLATE = utf8mb4_bin\nCOMMENT = 'process task event table';\n\nCREATE TABLE `process_unit_instance_001` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'primark key',\n  `instance_no` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'instance no',\n  `biz_no` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'biz no',\n  `parent_no` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'parent instance no',\n  `process_unit_code` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'process unit code',\n  `product_code` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'product code',\n  `result` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'execute result',\n  `request_content` mediumtext COLLATE utf8mb4_bin COMMENT 'request content',\n  `response_content` mediumtext COLLATE utf8mb4_bin COMMENT 'response content',\n  `auto_run_flag` tinyint(1) DEFAULT NULL COMMENT 'auto run flag',\n  `auto_run_times` int(11) DEFAULT NULL COMMENT 'auto run times',\n  `next_auto_run_time` datetime DEFAULT NULL COMMENT 'next auto run time',\n  `ext_data` json DEFAULT NULL COMMENT 'ext data',\n  `created_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created date',\n  `modified_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified date',\n  `deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'delete flag',\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `idx_instance_no` (`instance_no`),\n  UNIQUE KEY `idx_bizNo_unitCode` (`biz_no`,`process_unit_code`),\n  KEY `idx_autorun` (`auto_run_flag`,`next_auto_run_time`),\n  KEY `idx_createdDate` (`created_date`)\n) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='Process unit instance';\n\nCREATE TABLE `process_unit_execution_001` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'primark key',\n  `execution_no` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'execution no',\n  `request_no` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'request no',\n  `parent_no` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'parent instance no',\n  `process_unit_code` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'process unit code',\n  `biz_no` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'biz no',  \n  `instance_no` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'instance no',\n  `product_code` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'product code',\n  `result` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'execute result',\n  `request_content` mediumtext COLLATE utf8mb4_bin COMMENT 'request content',\n  `response_content` mediumtext COLLATE utf8mb4_bin COMMENT 'response content',\n  `request_time` datetime DEFAULT NULL COMMENT 'request time',\n  `response_time` datetime DEFAULT NULL COMMENT 'response time',\n  `elaspe_time` int(11) DEFAULT NULL COMMENT 'elaspe time',\n  `exec_type` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'exec type',\n  `ext_data` json DEFAULT NULL COMMENT 'ext data',\n  `created_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created date',\n  `modified_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified date',\n  `deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'deleted',\n  PRIMARY KEY (`id`),\n  KEY  `idx_execution_no` (`execution_no`),\n  KEY `idx_instance_no` (`instance_no`),\n  KEY `idx_request_time` (`request_time`),\n  KEY `idx_bizNo_unitCode` (`biz_no`,`process_unit_code`)\n) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='Process unit execution';\n\nCREATE TABLE `process_unit_instance_002` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'primark key',\n  `instance_no` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'instance no',\n  `biz_no` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'biz no',\n  `parent_no` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'parent instance no',\n  `process_unit_code` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'process unit code',\n  `product_code` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'product code',\n  `result` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'execute result',\n  `request_content` mediumtext COLLATE utf8mb4_bin COMMENT 'request content',\n  `response_content` mediumtext COLLATE utf8mb4_bin COMMENT 'response content',\n  `auto_run_flag` tinyint(1) DEFAULT NULL COMMENT 'auto run flag',\n  `auto_run_times` int(11) DEFAULT NULL COMMENT 'auto run times',\n  `next_auto_run_time` datetime DEFAULT NULL COMMENT 'next auto run time',\n  `ext_data` json DEFAULT NULL COMMENT 'ext data',\n  `created_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created date',\n  `modified_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified date',\n  `deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'delete flag',\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `idx_instance_no` (`instance_no`),\n  UNIQUE KEY `idx_bizNo_unitCode` (`biz_no`,`process_unit_code`),\n  KEY `idx_autorun` (`auto_run_flag`,`next_auto_run_time`),\n  KEY `idx_createdDate` (`created_date`)\n) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='Process unit instance';\n\nCREATE TABLE `process_unit_execution_002` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'primark key',\n  `execution_no` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'execution no',\n  `request_no` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'request no',\n  `parent_no` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'parent instance no',\n  `process_unit_code` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'process unit code',\n  `biz_no` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'biz no',  \n  `instance_no` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'instance no',\n  `product_code` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'product code',\n  `result` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'execute result',\n  `request_content` mediumtext COLLATE utf8mb4_bin COMMENT 'request content',\n  `response_content` mediumtext COLLATE utf8mb4_bin COMMENT 'response content',\n  `request_time` datetime DEFAULT NULL COMMENT 'request time',\n  `response_time` datetime DEFAULT NULL COMMENT 'response time',\n  `elaspe_time` int(11) DEFAULT NULL COMMENT 'elaspe time',\n  `exec_type` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'exec type',\n  `ext_data` json DEFAULT NULL COMMENT 'ext data',\n  `created_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created date',\n  `modified_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified date',\n  `deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'deleted',\n  PRIMARY KEY (`id`),\n  KEY  `idx_execution_no` (`execution_no`),\n  KEY `idx_instance_no` (`instance_no`),\n  KEY `idx_request_time` (`request_time`),\n  KEY `idx_bizNo_unitCode` (`biz_no`,`process_unit_code`)\n) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='Process unit execution';"
  },
  {
    "path": "easyflow-process/easyflow-process-server/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n    xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <artifactId>easyflow-process</artifactId>\n        <groupId>com.jd.easyflow</groupId>\n        <version>1.7.3</version>\n    </parent>\n    <artifactId>easyflow-process-server</artifactId>\n    <name>easyflow-process-server</name>\n    <packaging>jar</packaging>\n    <properties>\n    </properties>\n    <dependencies>\n        <dependency>\n            <groupId>com.jd.easyflow</groupId>\n            <artifactId>easyflow-process-common</artifactId>\n        </dependency>      \n        <dependency>\n            <groupId>com.jd.easyflow</groupId>\n            <artifactId>easyflow-process-client</artifactId>\n        </dependency>                       \n        <dependency>\n            <groupId>com.jd.easyflow</groupId>\n            <artifactId>easyflow-flow</artifactId>\n        </dependency>   \n        <dependency>\n            <groupId>com.jd.easyflow</groupId>\n            <artifactId>easyflow-fsm</artifactId>\n        </dependency>                 \n        <dependency>\n            <groupId>com.jd.easyflow</groupId>\n            <artifactId>easyflow-process-api</artifactId>\n        </dependency>                                             \n        <dependency>\n            <groupId>org.springframework</groupId>\n            <artifactId>spring-tx</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.mybatis</groupId>\n            <artifactId>mybatis</artifactId>\n        </dependency>   \n        <dependency>\n            <groupId>org.springframework</groupId>\n            <artifactId>spring-jdbc</artifactId>\n        </dependency>    \n        <dependency>\n            <groupId>org.springframework</groupId>\n            <artifactId>spring-tx</artifactId>\n        </dependency> \n        <dependency>\n            <groupId>org.aspectj</groupId>\n            <artifactId>aspectjrt</artifactId>\n        </dependency>  \n        <dependency>\n            <groupId>org.aspectj</groupId>\n            <artifactId>aspectjweaver</artifactId>\n        </dependency>        \n       <dependency>\n           <groupId>com.zaxxer</groupId>\n           <artifactId>HikariCP</artifactId>\n           <scope>provided</scope>\n        </dependency>  \n       <dependency>\n            <groupId>org.mybatis</groupId>\n            <artifactId>mybatis-spring</artifactId>\n            <scope>provided</scope>\n        </dependency>                                                              \n    </dependencies>\n</project>"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/action/Action.java",
    "content": "package com.jd.easyflow.action;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * @author liyuliang5\n *\n */\n@Target(ElementType.METHOD)\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface Action {\n\n    String code();\n    \n    String name();\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/action/ActionAspect.java",
    "content": "package com.jd.easyflow.action;\n\nimport java.util.function.Function;\n\nimport org.aspectj.lang.ProceedingJoinPoint;\nimport org.aspectj.lang.reflect.MethodSignature;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ActionAspect {\n    \n    private static final Logger log = LoggerFactory.getLogger(ActionAspect.class);\n\n    private Function<Object, ActionInfo<Object[], Object>> function;\n\n    public Object process(ProceedingJoinPoint point) throws Throwable {\n        Action action = getAction(point);\n        if (log.isDebugEnabled()) {\n            log.debug(\"Request:\" + action.code() + \" \" + action.name());\n        }\n        ActionInfo<Object[], Object> actionInfo = new ActionInfo<>();\n        actionInfo.setParam(point.getArgs());\n        actionInfo.put(ActionConstants.CTX_JOIN_POINT, point);\n        actionInfo.setActionCode(action.code());\n        function.apply(actionInfo);\n        return actionInfo.getResult();\n    }\n\n    private Action getAction(ProceedingJoinPoint point) throws NoSuchMethodException, SecurityException {\n        Action action = ((MethodSignature) point.getSignature()).getMethod().getAnnotation(Action.class);\n        return action;\n    }\n\n\n    public Function<Object, ActionInfo<Object[], Object>> getFunction() {\n        return function;\n    }\n\n    public void setFunction(Function<Object, ActionInfo<Object[], Object>> function) {\n        this.function = function;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/action/ActionConstants.java",
    "content": "package com.jd.easyflow.action;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ActionConstants {\n\n    public static final String CTX_JOIN_POINT = \"JOIN_POINT\";\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/action/ActionInfo.java",
    "content": "package com.jd.easyflow.action;\n\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ActionInfo<P, R> {\n\n\n    private P param;\n\n\n    private R result;\n    \n\n    private String actionCode;\n\n\n    private Map<String, Object> contextData = new ConcurrentHashMap<>();\n\n    public P getParam() {\n        return param;\n    }\n\n    public void setParam(P param) {\n        this.param = param;\n    }\n\n    public R getResult() {\n        return result;\n    }\n\n    public void setResult(R result) {\n        this.result = result;\n    }\n\n    public void put(String key, Object value) {\n        contextData.put(key, value);\n    }\n\n    public <T> T get(String key) {\n        return (T) contextData.get(key);\n    }\n\n    public String getActionCode() {\n        return actionCode;\n    }\n\n    public void setActionCode(String actionCode) {\n        this.actionCode = actionCode;\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/action/SimpleExportAopFunction.java",
    "content": "package com.jd.easyflow.action;\n\nimport java.util.Arrays;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.function.Function;\n\nimport org.aspectj.lang.ProceedingJoinPoint;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponse;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponseCode;\nimport com.jd.easyflow.common.exception.EasyFlowException;\nimport com.jd.easyflow.common.exception.UserException;\nimport com.jd.easyflow.utils.json.JSON;\n\npublic class SimpleExportAopFunction implements Function<ActionInfo<?, ?>, Void> {\n\n    private static final Logger log = LoggerFactory.getLogger(SimpleExportAopFunction.class);\n\n    private static final String FORMAT_JSON = \"json\";\n\n    private String format;\n\n    @Override\n    public Void apply(ActionInfo actionInfo) {\n        try {\n            // log param\n            Object param = actionInfo.getParam();\n            String paramStr = null;\n            if (format == null) {\n                paramStr = toString(param);\n            } else if (FORMAT_JSON.equals(format)) {\n                paramStr = JSON.toJSONString(actionInfo.getParam());\n            }\n            if (log.isInfoEnabled()) {\n                log.info(actionInfo.getActionCode() + \" param:\" + paramStr);\n            }\n\n            // invoke\n            ProceedingJoinPoint point = (ProceedingJoinPoint) actionInfo.get(ActionConstants.CTX_JOIN_POINT);\n            Object result = point.proceed();\n            actionInfo.setResult(result);\n\n            // log result\n            String resultStr = null;\n            if (format == null) {\n                resultStr = toString(result);\n            } else {\n                resultStr = JSON.toJSONString(result);\n            }\n            if (log.isInfoEnabled()) {\n                log.info(\"result:\" + resultStr);\n            }\n        } catch (Throwable t) {\n            log.error(\"Process exception, \" + t.getMessage(), t);\n            ExportResponse<Object> response = new ExportResponse<>();\n            String code = ExportResponseCode.EXCEPTION.getCode();\n            String msg = ExportResponseCode.EXCEPTION.getDesc();\n            if (t instanceof UserException) {\n                code = ((UserException) t).getCode();\n                if (code == null) {\n                    code = ExportResponseCode.FAIL.getCode();\n                }\n                msg = ((EasyFlowException) t).getInfo();\n                Object errorData = ((UserException) t).getData();\n                if (errorData != null) {\n                    Map<String, Object> ext = new HashMap<>();\n                    ext.put(\"errorData\", errorData);\n                    response.setExt(ext);\n                }\n            }\n            response.setResCode(code);\n            response.setResDesc(msg);\n            actionInfo.setResult(response);\n        }\n        return null;\n    }\n\n    public String getFormat() {\n        return format;\n    }\n\n    public void setFormat(String format) {\n        this.format = format;\n    }\n    \n    private String toString(Object o) {\n        if (o == null) {\n            return \"null\";\n        }\n        if (o instanceof Object[]) {\n            return Arrays.toString((Object[]) o);\n        }\n        return o.toString();\n    }\n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/alert/AlertClient.java",
    "content": "package com.jd.easyflow.alert;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic interface AlertClient {\n\n    void alert(AlertParam alertParam);\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/alert/AlertParam.java",
    "content": "package com.jd.easyflow.alert;\n\nimport java.util.Map;\n\n/**\n * @author liyuliang5\n *\n */\npublic class AlertParam {\n\n    private String alertCode;\n    \n    private String[] alertKeys;\n    \n    private String message;\n    \n    private String productCode;\n    \n    private Throwable throwable;\n    \n    private Object alertObject;\n    \n    private Map<String, Object> data;\n\n    public String getAlertCode() {\n        return alertCode;\n    }\n\n    public void setAlertCode(String alertCode) {\n        this.alertCode = alertCode;\n    }\n\n    public String getMessage() {\n        return message;\n    }\n\n    public void setMessage(String message) {\n        this.message = message;\n    }\n\n    public Throwable getThrowable() {\n        return throwable;\n    }\n\n    public void setThrowable(Throwable throwable) {\n        this.throwable = throwable;\n    }\n\n    public Object getAlertObject() {\n        return alertObject;\n    }\n\n    public void setAlertObject(Object alertObject) {\n        this.alertObject = alertObject;\n    }\n\n    public Map<String, Object> getData() {\n        return data;\n    }\n\n    public void setData(Map<String, Object> data) {\n        this.data = data;\n    }\n\n    public String[] getAlertKeys() {\n        return alertKeys;\n    }\n\n    public void setAlertKeys(String[] alertKeys) {\n        this.alertKeys = alertKeys;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/alert/AlertUtil.java",
    "content": "package com.jd.easyflow.alert;\n\nimport java.util.Map;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * @author liyuliang5\n * \n */\npublic class AlertUtil {\n\n    private static final Logger logger = LoggerFactory.getLogger(AlertUtil.class);\n\n    private static AlertClient alertClient;\n\n    public static void alert(Object... objects) {\n        AlertParam param = new AlertParam();\n        String message = concat(objects);\n        param.setMessage(message);\n        if (objects[objects.length - 1] instanceof Throwable) {\n            Throwable t = (Throwable) objects[objects.length - 1];\n            param.setThrowable(t);\n        }\n        getAlertClient().alert(param);\n    }\n\n    public static void doAlert(String alertCode, String message, Throwable t) {\n        doAlert(alertCode, null, message, t, null, null, null);\n    }\n    \n    public static void doAlert(String alertCode, String message, Throwable t, Object alertObject) {\n        doAlert(alertCode, null, message, t, alertObject, null, null);\n    }\n    \n    public static void doAlert(String alertCode, String message, Throwable t, Object alertObject, String productCode) {\n        doAlert(alertCode, null, message, t, alertObject, null, productCode);\n    }\n\n    public static void doAlert(String alertCode, String[] alertKeys, String message, Throwable t, Object alertObject,\n            Map<String, Object> data, String productCode) {\n        AlertParam alertParam = new AlertParam();\n        alertParam.setAlertCode(alertCode);\n        alertParam.setMessage(message);\n        alertParam.setAlertKeys(alertKeys);\n        alertParam.setAlertObject(alertObject);\n        alertParam.setProductCode(productCode);\n        alertParam.setData(data);\n        alertParam.setThrowable(t);\n        getAlertClient().alert(alertParam);\n    }\n\n    private static String concat(Object... objects) {\n        StringBuilder sb = new StringBuilder();\n        concat(sb, objects);\n        return sb.toString();\n    }\n\n    private static void concat(StringBuilder sb, Object... objects) {\n        for (int i = 0; i < objects.length; i++) {\n            if ((i + 1) == objects.length && objects[i] instanceof Throwable) {\n                sb.append(\" Exception info: \" + ((Throwable) objects[i]).getMessage() + \";Exception: \"\n                        + ((Throwable) objects[i]).getClass().getName());\n                break;\n            }\n            if (objects[i] != null && objects[i].getClass().isArray()) {\n                concat(sb, (Object[]) objects[i]);\n            } else {\n                sb.append(objects[i]);\n            }\n        }\n    }\n\n    public static AlertClient getAlertClient() {\n        if (alertClient == null) {\n            alertClient = new LogAlertClient();\n        }\n        return alertClient;\n    }\n\n    /**\n     * \n     * @param alertClient\n     */\n    public void setAlertClient(AlertClient alertClient) {\n        AlertUtil.alertClient = alertClient;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/alert/LogAlertClient.java",
    "content": "package com.jd.easyflow.alert;\n\nimport java.util.Arrays;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class LogAlertClient implements AlertClient {\n\n    private static final Logger logger = LoggerFactory.getLogger(AlertUtil.class);\n\n    @Override\n    public void alert(AlertParam alertParam) {\n        StringBuilder builder = new StringBuilder(\"LogAlert: \");\n        if (alertParam != null) {\n            if (alertParam.getAlertCode() != null) {\n                builder.append(\" AlertCode:\").append(alertParam.getAlertCode());\n            }\n            if (alertParam.getAlertKeys() != null) {\n                builder.append(\" AlertKeys:\").append(Arrays.toString(alertParam.getAlertKeys()));\n            }\n            if (alertParam.getMessage() != null) {\n                builder.append(\"AlertMessage:\" + alertParam.getMessage());\n            }\n            if (alertParam.getAlertObject() != null) {\n                builder.append(\" AlertObject:\").append(alertParam.getAlertObject());\n            }\n            if (alertParam.getData() != null) {\n                builder.append(\" AlertData:\").append(alertParam.getData());\n            }\n            if (alertParam.getProductCode() != null) {\n                builder.append(\" AlertProductCode\").append(alertParam.getProductCode());\n            }\n        }\n        logger.error(builder.toString());\n        if (alertParam.getThrowable() != null) {\n            Throwable t = alertParam.getThrowable();\n            logger.error(\"ExceptionAlert:\" + t.getMessage(), t);\n        }\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/cache/CacheService.java",
    "content": "package com.jd.easyflow.cache;\n\n/**\n * @author liyuliang5\n *\n */\npublic interface CacheService {\n\n    String set(final String key, final String value);\n    \n    String get(final String key);\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/cache/impl/LocalCacheServiceImpl.java",
    "content": "package com.jd.easyflow.cache.impl;\n\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport com.jd.easyflow.cache.CacheService;\n\n/**\n * @author liyuliang5\n */\npublic class LocalCacheServiceImpl implements CacheService {\n    \n    private long setTimeoutMillis = 60 * 1000;\n    \n    private boolean alwaysGetReturnNull = false;\n    \n    private Map<String, Value> map = new ConcurrentHashMap<String, Value>();\n\n    @Override\n    public String get(String key) {\n        if (alwaysGetReturnNull) {\n            return null;\n        }\n        Value value = map.get(key);\n        if (value == null) {\n            return null;\n        }\n        if (System.currentTimeMillis() - value.createdMillis <= setTimeoutMillis) {\n            return value.value;\n        } else {\n            map.remove(key);\n            return null;\n        }\n    }\n    \n    @Override\n    public String set(String key, String value) {\n        if (alwaysGetReturnNull) {\n            return null;\n        }\n        map.put(key, new Value(value));\n        return null;\n    }\n    \n    private static class Value {\n        \n        public Value(String value) {\n            this.value = value;\n            this.createdMillis = System.currentTimeMillis();\n        }\n        private String value;\n        \n        private long createdMillis;\n    }\n\n    public long getSetTimeoutMillis() {\n        return setTimeoutMillis;\n    }\n\n    public void setSetTimeoutMillis(long setTimeoutMillis) {\n        this.setTimeoutMillis = setTimeoutMillis;\n    }\n\n    public boolean isAlwaysGetReturnNull() {\n        return alwaysGetReturnNull;\n    }\n\n    public void setAlwaysGetReturnNull(boolean alwaysGetReturnNull) {\n        this.alwaysGetReturnNull = alwaysGetReturnNull;\n    }\n\n\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/cache/impl/NoopCacheServiceImpl.java",
    "content": "package com.jd.easyflow.cache.impl;\n\nimport com.jd.easyflow.cache.CacheService;\n\n/**\n * No Operation Cache Service\n * @author liyuliang5\n *\n */\npublic class NoopCacheServiceImpl implements CacheService {\n\n\n    @Override\n    public String set(String key, String value) {\n        // NOOP\n        return null;\n    }\n\n    @Override\n    public String get(String key) {\n        // NOOP\n        return null;\n    }\n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/cache/impl/UnsupportedCacheServiceImpl.java",
    "content": "package com.jd.easyflow.cache.impl;\n\nimport com.jd.easyflow.cache.CacheService;\n\n/**\n * @author liyuliang5\n *\n */\npublic class UnsupportedCacheServiceImpl implements CacheService {\n\n\n    @Override\n    public String set(String key, String value) {\n        throw new UnsupportedOperationException();\n    }\n\n    @Override\n    public String get(String key) {\n        throw new UnsupportedOperationException();\n        \n    }\n\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/codegenerator/adapter/export/CodeGenerateExportImpl.java",
    "content": "package com.jd.easyflow.codegenerator.adapter.export;\n\nimport org.springframework.beans.factory.annotation.Autowired;\n\nimport com.jd.easyflow.codegenerator.adapter.export.CodeGenerateExport;\nimport com.jd.easyflow.codegenerator.adapter.export.dto.BatchGenerateParam;\nimport com.jd.easyflow.codegenerator.adapter.export.dto.BatchGenerateResult;\nimport com.jd.easyflow.codegenerator.adapter.export.dto.GenerateParam;\nimport com.jd.easyflow.codegenerator.adapter.export.dto.GenerateResult;\nimport com.jd.easyflow.codegenerator.domain.model.vo.CodeGenerateReq;\nimport com.jd.easyflow.codegenerator.domain.service.CodeGenerateDomainService;\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponse;\n\n/**\n * @author liyuliang5\n *\n */\npublic class CodeGenerateExportImpl implements CodeGenerateExport {\n    \n    @Autowired\n    private CodeGenerateDomainService codeGenerateDomainService;\n\n    @Override\n    public ExportResponse<GenerateResult> generateUniqueCode(ExportRequest<GenerateParam> request) {\n        GenerateParam param = request.getData();\n        CodeGenerateReq codeGenerateReq = new CodeGenerateReq(param.getTypeId(), param.getCodePrefix());\n        String code = codeGenerateDomainService.next(codeGenerateReq);\n        GenerateResult result = new GenerateResult();\n        result.setCode(code);\n        return ExportResponse.build4Success(result);\n    }\n\n    @Override\n    public ExportResponse<BatchGenerateResult> batchGenerateUniqueCode(ExportRequest<BatchGenerateParam> request) {\n        BatchGenerateParam param = request.getData();\n        CodeGenerateReq codeGenerateReq = new CodeGenerateReq(param.getTypeId(), param.getCodePrefix(),\n                param.getBatchSize());\n        String[] codes = codeGenerateDomainService.nextBatch(codeGenerateReq);\n        BatchGenerateResult result = new BatchGenerateResult();\n        result.setCodes(codes);\n        return ExportResponse.build4Success(result);\n    }\n\n    public CodeGenerateDomainService getCodeGenerateDomainService() {\n        return codeGenerateDomainService;\n    }\n\n    public void setCodeGenerateDomainService(CodeGenerateDomainService codeGenerateDomainService) {\n        this.codeGenerateDomainService = codeGenerateDomainService;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/codegenerator/domain/constant/CodeGeneratorConstants.java",
    "content": "package com.jd.easyflow.codegenerator.domain.constant;\n\n/**\n * @author liyuliang5\n *\n */\npublic class CodeGeneratorConstants {\n    \n    public static final String BEAN_LOCKER = \"easyflow-codegenerator-locker\";\n    public static final String BEAN_NEW_TX_TEMPLATE = \"easyflow-codegenerator-newTransactionTemplate\";\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/codegenerator/domain/model/entity/SequenceEntity.java",
    "content": "package com.jd.easyflow.codegenerator.domain.model.entity;\n\nimport java.util.Date;\n\n/**\n * @author liyuliang5\n *\n */\npublic class SequenceEntity {\n\n    private Long id;\n\n    private String seqKey;\n\n    private String seqSubKey;\n\n    private Long seqValue;\n\n    private Date createdDate;\n\n    private Date modifiedDate;\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getSeqKey() {\n        return seqKey;\n    }\n\n    public void setSeqKey(String seqKey) {\n        this.seqKey = seqKey;\n    }\n\n    public String getSeqSubKey() {\n        return seqSubKey;\n    }\n\n    public void setSeqSubKey(String seqSubKey) {\n        this.seqSubKey = seqSubKey;\n    }\n\n    public Long getSeqValue() {\n        return seqValue;\n    }\n\n    public void setSeqValue(Long seqValue) {\n        this.seqValue = seqValue;\n    }\n\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n\n    @Override\n    public String toString() {\n        StringBuilder sb = new StringBuilder();\n        sb.append(getClass().getSimpleName());\n        sb.append(\" [\");\n        sb.append(\"Hash = \").append(hashCode());\n        sb.append(\", id=\").append(id);\n        sb.append(\", seqKey=\").append(seqKey);\n        sb.append(\", seqSubKey=\").append(seqSubKey);\n        sb.append(\", seqValue=\").append(seqValue);\n        sb.append(\", createdDate=\").append(createdDate);\n        sb.append(\", modifiedDate=\").append(modifiedDate);\n        sb.append(\"]\");\n        return sb.toString();\n    }\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/codegenerator/domain/model/vo/CodeGenerateReq.java",
    "content": "package com.jd.easyflow.codegenerator.domain.model.vo;\n\n/**\n * @author liyuliang5\n *\n */\npublic class CodeGenerateReq {\n\n    public CodeGenerateReq(String typeId) {\n        this.typeId = typeId;\n    }\n\n    public CodeGenerateReq(String typeId,String codePrefix) {\n        this.typeId = typeId;\n        this.codePrefix = codePrefix;\n    }\n    \n    public CodeGenerateReq(String typeId,String codePrefix, int batchSize) {\n        this.typeId = typeId;\n        this.codePrefix = codePrefix;\n        this.batchSize = batchSize;\n    }\n\n    public static final int ROLLING_TYPE_NONE = 0;\n\n    public static final int ROLLING_TYPE_DAY = 1;\n\n    String typeId;\n\n    String codePrefix = \"\";\n\n    int rollingType = ROLLING_TYPE_DAY;\n\n    long start = 1000000;\n\n    int startRandomRange = 0;\n\n    int step = 1;\n\n    int stepRandomRange = 0;\n\n    int numLength = 8;\n\n    int cacheSize = 1000;\n\n    private String separator1 = \"\";\n\n    private String separator2 = \"\";\n    \n    private int batchSize;\n\n    public String getTypeId() {\n        return typeId;\n    }\n\n    public void setTypeId(String typeId) {\n        this.typeId = typeId;\n    }\n\n    public String getCodePrefix() {\n        return codePrefix;\n    }\n\n    public void setCodePrefix(String codePrefix) {\n        this.codePrefix = codePrefix;\n    }\n\n    public int getRollingType() {\n        return rollingType;\n    }\n\n    public void setRollingType(int rollingType) {\n        this.rollingType = rollingType;\n    }\n\n    public long getStart() {\n        return start;\n    }\n\n    public void setStart(long start) {\n        this.start = start;\n    }\n\n    public int getStartRandomRange() {\n        return startRandomRange;\n    }\n\n    public void setStartRandomRange(int startRandomRange) {\n        this.startRandomRange = startRandomRange;\n    }\n\n    public int getStep() {\n        return step;\n    }\n\n    public void setStep(int step) {\n        this.step = step;\n    }\n\n    public int getStepRandomRange() {\n        return stepRandomRange;\n    }\n\n    public void setStepRandomRange(int stepRandomRange) {\n        this.stepRandomRange = stepRandomRange;\n    }\n\n    public int getNumLength() {\n        return numLength;\n    }\n\n    public void setNumLength(int numLength) {\n        this.numLength = numLength;\n    }\n\n    public int getCacheSize() {\n        return cacheSize;\n    }\n\n    public void setCacheSize(int cacheSize) {\n        this.cacheSize = cacheSize;\n    }\n\n    public String getSeparator1() {\n        return separator1;\n    }\n\n    public void setSeparator1(String separator1) {\n        this.separator1 = separator1;\n    }\n\n    public String getSeparator2() {\n        return separator2;\n    }\n\n    public void setSeparator2(String separator2) {\n        this.separator2 = separator2;\n    }\n\n    public int getBatchSize() {\n        return batchSize;\n    }\n\n    public void setBatchSize(int batchSize) {\n        this.batchSize = batchSize;\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/codegenerator/domain/repository/SequenceRepository.java",
    "content": "package com.jd.easyflow.codegenerator.domain.repository;\n\nimport com.jd.easyflow.codegenerator.domain.model.entity.SequenceEntity;\n\n/**\n * @author liyuliang5\n *\n */\npublic interface SequenceRepository {\n\n    SequenceEntity queryWithLock(String key, String subKey);\n\n    int addSequence(SequenceEntity entity);\n\n    int updateSeqValueById(Long id, long seqValue);\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/codegenerator/domain/service/CodeGenerateDomainService.java",
    "content": "package com.jd.easyflow.codegenerator.domain.service;\n\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.transaction.support.TransactionTemplate;\n\nimport com.jd.easyflow.codegenerator.domain.model.vo.CodeGenerateReq;\nimport com.jd.easyflow.codegenerator.domain.repository.SequenceRepository;\nimport com.jd.easyflow.common.util.AssertUtils;\nimport com.jd.easyflow.lock.Locker;\n\n/**\n * @author liyuliang5\n *\n */\npublic class CodeGenerateDomainService {\n    \n    private static final int DEFAULT_CACHE_SIZE = 1000;\n    private static final int DEFAULT_NUM_LENGTH = 8;\n    \n    private int maxBatchSize = 10000;\n\n    private ConcurrentHashMap<String, CodeGenerator> generatorMap = new ConcurrentHashMap<>();\n    \n    private Map<String, CodeGenerator> configuredGeneratorMap;\n    \n    @Autowired\n    private SequenceRepository sequenceRepository;\n    private TransactionTemplate newTransactionTemplate;\n    private Locker locker;\n    \n    public void init() {\n        if (configuredGeneratorMap != null) {\n            for (Entry<String, CodeGenerator> entry : configuredGeneratorMap.entrySet()) {\n                CodeGenerator generator = entry.getValue();\n                if (generator.getCacheSize() == 0) {\n                    generator.setCacheSize(DEFAULT_CACHE_SIZE);\n                } else if (generator.getCacheSize() == -1) {\n                    generator.setCacheSize(0);\n                }\n                if (generator.getKey() == null) {\n                    generator.setKey(entry.getKey());\n                }\n                if (generator.getNumLength() == 0) {\n                    generator.setNumLength(DEFAULT_NUM_LENGTH);\n                }\n                if (generator.getRollingType() == 0) {\n                    generator.setRollingType(CodeGenerateReq.ROLLING_TYPE_DAY);\n                } else if (generator.getRollingType() == -1) {\n                    generator.setRollingType(CodeGenerateReq.ROLLING_TYPE_NONE);\n                }\n                if (generator.getStep() == 0) {\n                    generator.setStep(1);\n                }\n                if (generator.getSequenceRepository() == null) {\n                    generator.setSequenceRepository(sequenceRepository);\n                }\n                if (generator.getLocker() == null) {\n                    generator.setLocker(locker);\n                }\n                if (generator.getNewTransactionTemplate() == null) {\n                    generator.setNewTransactionTemplate(newTransactionTemplate);\n                }\n            }\n            generatorMap.putAll(configuredGeneratorMap);\n        }\n    }\n    \n    \n    public String next(CodeGenerateReq codeGenerateReq) {\n        AssertUtils.isNotNull(codeGenerateReq, \"codeGenerateReq must not be null\");\n        AssertUtils.isNotNull(codeGenerateReq.getTypeId(), \"CodeGenerateReq typeId must not be blank\");\n        CodeGenerator generator = generatorMap.get(codeGenerateReq.getTypeId());\n        if (generator == null) {\n            generator = createCodeGenerator(codeGenerateReq);\n        }\n        return generator.next();\n    }\n\n    public String[] nextBatch(CodeGenerateReq codeGenerateReq) {\n        AssertUtils.isNotNull(codeGenerateReq, \"codeGenerateReq must not be null\");\n        AssertUtils.isNotNull(codeGenerateReq.getTypeId(), \"CodeGenerateReq typeId must not be blank\");\n        AssertUtils.isTrue(codeGenerateReq.getBatchSize() > 0, \"batchSize should be greater than 0\");\n        AssertUtils.isTrue(codeGenerateReq.getBatchSize() <= maxBatchSize, \"batchSize exceed limit\");\n        CodeGenerator generator = generatorMap.get(codeGenerateReq.getTypeId());\n        if (generator == null) {\n            generator = createCodeGenerator(codeGenerateReq);\n        }\n        String[] result = new String[codeGenerateReq.getBatchSize()];\n        for (int i = 0; i < codeGenerateReq.getBatchSize(); i++) {\n            result[i] = generator.next();\n        }\n        return result;\n    }\n\n    private synchronized CodeGenerator createCodeGenerator(CodeGenerateReq request) {\n        CodeGenerator generator = generatorMap.get(request.getTypeId());\n        if (generator != null) {\n            return generator;\n        }\n        generator = new CodeGenerator();\n        generator.setCacheSize(request.getCacheSize());\n        generator.setCodePrefix(request.getCodePrefix());\n        generator.setKey(request.getTypeId());\n        generator.setNumLength(request.getNumLength());\n        generator.setRollingType(request.getRollingType());\n        generator.setSeparator1(request.getSeparator1());\n        generator.setSeparator2(request.getSeparator2());\n        generator.setStart(request.getStart());\n        generator.setStartRandomRange(request.getStartRandomRange());\n        generator.setStep(request.getStep());\n        generator.setStepRandomRange(request.getStepRandomRange());\n        generator.setSequenceRepository(sequenceRepository);\n        generator.setNewTransactionTemplate(newTransactionTemplate);\n        generator.setLocker(locker);\n        generatorMap.put(request.getTypeId(), generator);\n        return generator;\n    }\n\n    public int getMaxBatchSize() {\n        return maxBatchSize;\n    }\n\n    public void setMaxBatchSize(int maxBatchSize) {\n        this.maxBatchSize = maxBatchSize;\n    }\n\n    public Map<String, CodeGenerator> getConfiguredGeneratorMap() {\n        return configuredGeneratorMap;\n    }\n\n    public void setConfiguredGeneratorMap(Map<String, CodeGenerator> configuredGeneratorMap) {\n        this.configuredGeneratorMap = configuredGeneratorMap;\n    }\n\n\n    public TransactionTemplate getNewTransactionTemplate() {\n        return newTransactionTemplate;\n    }\n\n\n    public void setNewTransactionTemplate(TransactionTemplate newTransactionTemplate) {\n        this.newTransactionTemplate = newTransactionTemplate;\n    }\n\n    public Locker getLocker() {\n        return locker;\n    }\n\n    public void setLocker(Locker locker) {\n        this.locker = locker;\n    }\n\n\n    public ConcurrentHashMap<String, CodeGenerator> getGeneratorMap() {\n        return generatorMap;\n    }\n\n\n    public void setGeneratorMap(ConcurrentHashMap<String, CodeGenerator> generatorMap) {\n        this.generatorMap = generatorMap;\n    }\n\n\n    public SequenceRepository getSequenceRepository() {\n        return sequenceRepository;\n    }\n\n\n    public void setSequenceRepository(SequenceRepository sequenceRepository) {\n        this.sequenceRepository = sequenceRepository;\n    }\n    \n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/codegenerator/domain/service/CodeGenerator.java",
    "content": "package com.jd.easyflow.codegenerator.domain.service;\n\nimport java.text.SimpleDateFormat;\nimport java.util.Random;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.dao.DuplicateKeyException;\nimport org.springframework.transaction.TransactionStatus;\nimport org.springframework.transaction.support.TransactionCallback;\nimport org.springframework.transaction.support.TransactionTemplate;\n\nimport com.jd.easyflow.codegenerator.domain.model.entity.SequenceEntity;\nimport com.jd.easyflow.codegenerator.domain.repository.SequenceRepository;\nimport com.jd.easyflow.lock.Locker;\nimport com.jd.easyflow.properties.PropertyUtil;\n\n/**\n * @author liyuliang5\n *\n */\npublic class CodeGenerator {\n    public static final Logger logger = LoggerFactory.getLogger(CodeGenerator.class);\n\n    private static final String LOCK_BIZ_TYPE = \"_sequence\";\n    \n    private static final String EASYFLOW_CODE_PREFIX_KEY = \"easyflow.codeGenerator.prefix\";\n\n    public static final int ROLLING_TYPE_NONE = 0;\n    public static final int ROLLING_TYPE_DAY = 1;\n\n    private String codePrefix;\n\n    private String key;\n\n    private String subKey;\n\n    private int rollingType = 0;\n\n    private long start;\n\n    private int startRandomRange;\n\n    private int step;\n\n    private int stepRandomRange;\n\n    private int cacheSize;\n\n    private int currentStep;\n\n    private volatile Long currentValue;\n\n    private volatile Long maxCachedValue;\n\n    private int numLength;\n\n    private String separator1 = \"\";\n\n    private String separator2 = \"\";\n\n    private long lastSubKeyCheckTime;\n\n    private long subKeyCheckInterval = 60L * 1000;\n\n    private SequenceRepository sequenceRepository;\n\n    private Locker locker;\n\n    private TransactionTemplate newTransactionTemplate;\n\n    private Random random = new Random();\n    \n    public static class SimpleDateFormatThreadLocal extends ThreadLocal<SimpleDateFormat> {\n        @Override\n        protected SimpleDateFormat initialValue() {\n            return new SimpleDateFormat(\"yyyyMMdd\");\n        }\n    }\n    public static SimpleDateFormatThreadLocal sdfThreadLocal = new SimpleDateFormatThreadLocal();\n\n    \n    public CodeGenerator() {\n    }\n\n\n    public synchronized String next() {\n        long nextNumVal = nextNum();\n        String nextNumStr = leftPad(nextNumVal + \"\", numLength, '0');\n        String codePrefixKey = PropertyUtil.get(EASYFLOW_CODE_PREFIX_KEY);\n        String coffeeCodePrefix = codePrefixKey == null ? \"\" : codePrefixKey;\n        return coffeeCodePrefix + (codePrefix == null ? \"\" : codePrefix) + separator1 + (subKey == null ? \"\" : subKey + separator2) + nextNumStr;\n    }\n    \n    private static String leftPad(String str, int size, char ch) {\n        int pads = size - str.length();\n        if (pads <= 0) {\n            return str; \n        }\n        final char[] buf = new char[pads];\n        for (int i = 0; i < pads; i++) {\n            buf[i] = ch;\n        }\n        return new String(buf).concat(str);\n    }\n\n    public synchronized long nextNum() {\n        if (ROLLING_TYPE_DAY == rollingType) {\n            long currentTime = System.currentTimeMillis();\n            boolean needCheckDate = subKey == null || currentTime - lastSubKeyCheckTime > subKeyCheckInterval;\n            if (needCheckDate) {\n                String currentSubKey = sdfThreadLocal.get().format(currentTime);\n                if (! currentSubKey.equals(subKey)) {\n                    logger.info(\"subkey change, old:{} new:{}\", subKey, currentSubKey);\n                    subKey = currentSubKey;\n                    currentValue = null;\n                }\n                lastSubKeyCheckTime = currentTime;\n            }\n        }\n\n        currentStep = this.step + (stepRandomRange == 0 ? 0 : (int) (Math.random() * stepRandomRange));\n        if (currentValue == null || currentValue + currentStep > maxCachedValue) {\n            loadNextBatch();\n        }\n        currentValue = currentValue + currentStep;\n        return currentValue;\n    }\n\n    protected synchronized void loadNextBatch() {\n        logger.info(\"Load new batch from database, key:\" + key);\n        boolean result = loadIfPresent();\n        if (!result) {\n            insertIfAbsent();\n            loadIfPresent();\n        }\n    }\n\n    protected synchronized boolean loadIfPresent() {\n        return newTransactionTemplate.execute(new TransactionCallback<Boolean>() {\n            @Override\n            public Boolean doInTransaction(TransactionStatus status) {\n\n                SequenceEntity sequence;\n                sequence = sequenceRepository.queryWithLock(key, subKey);\n                if (sequence == null) {\n                    return false;\n                }\n                Long currentValue = sequence.getSeqValue();\n\n                boolean startFlag = currentValue == null;\n                if (startFlag) {\n                    currentValue = start - currentStep + (startRandomRange == 0 ? 0 : random.nextInt(startRandomRange));\n                }\n                long maxValue = currentValue + (cacheSize == 0 ? currentStep : cacheSize);\n                logger.info(\"current value:{}  maxValue:{}\", currentValue, maxValue);\n                sequenceRepository.updateSeqValueById(sequence.getId(), maxValue);\n                CodeGenerator.this.currentValue = currentValue;\n                CodeGenerator.this.maxCachedValue = maxValue;\n                return true;\n            }\n\n        });\n\n    }\n\n    protected synchronized void insertIfAbsent() {\n        logger.info(\"Insert new record into database, key:{}, subkey:{}\", key, subKey);\n        newTransactionTemplate.execute(new TransactionCallback<Object>() {\n            @Override\n            public Object doInTransaction(TransactionStatus status) {\n                return locker.doInLock(LOCK_BIZ_TYPE, key, () -> {\n                    SequenceEntity sequence = sequenceRepository.queryWithLock(key, subKey);\n                    if (sequence == null) {\n                        logger.info(\"Record not exists\");\n                        sequence = new SequenceEntity();\n                        sequence.setSeqKey(key);\n                        sequence.setSeqSubKey(subKey);\n                        try {\n                            sequenceRepository.addSequence(sequence);\n                        } catch (DuplicateKeyException e) {\n                            logger.warn(\"Sequence duplicate,\" + sequence + \", Ignore error.\", e);\n                        }\n                    }\n                    return null;\n                });\n\n            }\n        });\n    }\n    \n\n    public String getCodePrefix() {\n        return codePrefix;\n    }\n\n    public void setCodePrefix(String codePrefix) {\n        this.codePrefix = codePrefix;\n    }\n\n    public String getKey() {\n        return key;\n    }\n\n    public void setKey(String key) {\n        this.key = key;\n    }\n\n    public String getSubKey() {\n        return subKey;\n    }\n\n    public void setSubKey(String subKey) {\n        this.subKey = subKey;\n    }\n\n    public int getRollingType() {\n        return rollingType;\n    }\n\n    public void setRollingType(int rollingType) {\n        this.rollingType = rollingType;\n    }\n\n\n    /**\n     * @return the start\n     */\n    public long getStart() {\n        return start;\n    }\n\n    /**\n     * @param start the start to set\n     */\n    public void setStart(long start) {\n        this.start = start;\n    }\n\n    public int getStartRandomRange() {\n        return startRandomRange;\n    }\n\n    public void setStartRandomRange(int startRandomRange) {\n        this.startRandomRange = startRandomRange;\n    }\n\n    public int getStep() {\n        return step;\n    }\n\n    public void setStep(int step) {\n        this.step = step;\n    }\n\n    public int getStepRandomRange() {\n        return stepRandomRange;\n    }\n\n    public void setStepRandomRange(int stepRandomRange) {\n        this.stepRandomRange = stepRandomRange;\n    }\n\n    public int getCacheSize() {\n        return cacheSize;\n    }\n\n    public void setCacheSize(int cacheSize) {\n        this.cacheSize = cacheSize;\n    }\n\n    public int getNumLength() {\n        return numLength;\n    }\n\n    public void setNumLength(int numLength) {\n        this.numLength = numLength;\n    }\n\n\n\n    public String getSeparator1() {\n        return separator1;\n    }\n\n\n    public void setSeparator1(String separator1) {\n        this.separator1 = separator1;\n    }\n\n\n    public String getSeparator2() {\n        return separator2;\n    }\n\n\n    public void setSeparator2(String separator2) {\n        this.separator2 = separator2;\n    }\n\n\n    public long getSubKeyCheckInterval() {\n        return subKeyCheckInterval;\n    }\n\n    public void setSubKeyCheckInterval(long subKeyCheckInterval) {\n        this.subKeyCheckInterval = subKeyCheckInterval;\n    }\n\n    public SequenceRepository getSequenceRepository() {\n        return sequenceRepository;\n    }\n\n    public void setSequenceRepository(SequenceRepository sequenceRepository) {\n        this.sequenceRepository = sequenceRepository;\n    }\n\n    public TransactionTemplate getNewTransactionTemplate() {\n        return newTransactionTemplate;\n    }\n\n    public void setNewTransactionTemplate(TransactionTemplate newTransactionTemplate) {\n        this.newTransactionTemplate = newTransactionTemplate;\n    }\n\n    public Locker getLocker() {\n        return locker;\n    }\n\n    public void setLocker(Locker locker) {\n        this.locker = locker;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/codegenerator/infrastructure/converter/SequenceConverter.java",
    "content": "package com.jd.easyflow.codegenerator.infrastructure.converter;\n\nimport com.jd.easyflow.codegenerator.domain.model.entity.SequenceEntity;\nimport com.jd.easyflow.codegenerator.infrastructure.persistence.po.Sequence;\n\n/**\n * @author liyuliang5\n *\n */\npublic class SequenceConverter {\n\n    public static SequenceConverter INSTANCE = new SequenceConverter();\n    \n    private SequenceConverter() {\n        \n    }\n\n\n    public SequenceEntity convert(Sequence sequence) {\n        if ( sequence == null ) {\n            return null;\n        }\n\n        SequenceEntity sequenceEntity = new SequenceEntity();\n\n        sequenceEntity.setId( sequence.getId() );\n        sequenceEntity.setSeqKey( sequence.getSeqKey() );\n        sequenceEntity.setSeqSubKey( sequence.getSeqSubKey() );\n        sequenceEntity.setSeqValue( sequence.getSeqValue() );\n        sequenceEntity.setCreatedDate( sequence.getCreatedDate() );\n        sequenceEntity.setModifiedDate( sequence.getModifiedDate() );\n\n        return sequenceEntity;\n    }\n\n    public Sequence convert(SequenceEntity entity) {\n        if ( entity == null ) {\n            return null;\n        }\n\n        Sequence sequence = new Sequence();\n\n        sequence.setId( entity.getId() );\n        sequence.setSeqKey( entity.getSeqKey() );\n        sequence.setSeqSubKey( entity.getSeqSubKey() );\n        sequence.setSeqValue( entity.getSeqValue() );\n        sequence.setCreatedDate( entity.getCreatedDate() );\n        sequence.setModifiedDate( entity.getModifiedDate() );\n\n        return sequence;\n    }\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/codegenerator/infrastructure/persistence/mapper/SequenceMapper.java",
    "content": "package com.jd.easyflow.codegenerator.infrastructure.persistence.mapper;\n\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\n\nimport com.jd.easyflow.codegenerator.infrastructure.persistence.po.Sequence;\n\n/**\n * @author liyuliang5\n *\n */\n@Mapper\npublic interface SequenceMapper {\n    int deleteByPrimaryKey(Long id);\n\n    int insert(Sequence record);\n\n    int insertSelective(Sequence record);\n\n    Sequence selectByPrimaryKey(Long id);\n\n    int updateByPrimaryKeySelective(Sequence record);\n\n    int updateByPrimaryKey(Sequence record);\n    \n    Sequence selectForUpdate(@Param(\"key\") String key, @Param(\"subKey\") String subKey);\n    \n    int updateValueByPrimaryKey(@Param(\"id\")long id, @Param(\"seqValue\") long seqValue);\n}"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/codegenerator/infrastructure/persistence/po/Sequence.java",
    "content": "package com.jd.easyflow.codegenerator.infrastructure.persistence.po;\n\nimport java.util.Date;\n\n/**\n * @author liyuliang5\n *\n */\npublic class Sequence {\n    private Long id;\n\n    private String seqKey;\n\n    private String seqSubKey;\n\n    private Long seqValue;\n\n    private Date createdDate;\n\n    private Date modifiedDate;\n\n    private boolean deleted;\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getSeqKey() {\n        return seqKey;\n    }\n\n    public void setSeqKey(String seqKey) {\n        this.seqKey = seqKey;\n    }\n\n    public String getSeqSubKey() {\n        return seqSubKey;\n    }\n\n    public void setSeqSubKey(String seqSubKey) {\n        this.seqSubKey = seqSubKey;\n    }\n\n    public Long getSeqValue() {\n        return seqValue;\n    }\n\n    public void setSeqValue(Long seqValue) {\n        this.seqValue = seqValue;\n    }\n\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n\n    public boolean isDeleted() {\n        return deleted;\n    }\n\n    public void setDeleted(boolean deleted) {\n        this.deleted = deleted;\n    }\n\n    @Override\n    public String toString() {\n        StringBuilder sb = new StringBuilder();\n        sb.append(getClass().getSimpleName());\n        sb.append(\" [\");\n        sb.append(\"Hash = \").append(hashCode());\n        sb.append(\", id=\").append(id);\n        sb.append(\", seqKey=\").append(seqKey);\n        sb.append(\", seqSubKey=\").append(seqSubKey);\n        sb.append(\", seqValue=\").append(seqValue);\n        sb.append(\", createdDate=\").append(createdDate);\n        sb.append(\", modifiedDate=\").append(modifiedDate);\n        sb.append(\", deleted=\").append(deleted);\n        sb.append(\"]\");\n        return sb.toString();\n    }\n}"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/codegenerator/infrastructure/repository/SequenceRepositoryImpl.java",
    "content": "package com.jd.easyflow.codegenerator.infrastructure.repository;\n\nimport org.springframework.beans.factory.annotation.Autowired;\n\nimport com.jd.easyflow.codegenerator.domain.model.entity.SequenceEntity;\nimport com.jd.easyflow.codegenerator.domain.repository.SequenceRepository;\nimport com.jd.easyflow.codegenerator.infrastructure.converter.SequenceConverter;\nimport com.jd.easyflow.codegenerator.infrastructure.persistence.mapper.SequenceMapper;\nimport com.jd.easyflow.codegenerator.infrastructure.persistence.po.Sequence;\nimport com.jd.easyflow.common.util.AssertUtils;\n\n/**\n * @author liyuliang5\n *\n */\npublic class SequenceRepositoryImpl implements SequenceRepository {\n\n\n    @Autowired\n    private SequenceMapper sequenceMapper;\n\n\n    @Override\n    public SequenceEntity queryWithLock(String key, String subKey) {\n        Sequence sequence = sequenceMapper.selectForUpdate(key, subKey);\n        return SequenceConverter.INSTANCE.convert(sequence);\n    }\n\n    @Override\n    public int addSequence(SequenceEntity entity) {\n        AssertUtils.isNotNull(entity);\n        AssertUtils.isNotNull(entity.getSeqKey());\n        Sequence sequence = SequenceConverter.INSTANCE.convert(entity);\n        return sequenceMapper.insert(sequence);\n    }\n\n    @Override\n    public int updateSeqValueById(Long id, long seqValue) {\n        return sequenceMapper.updateValueByPrimaryKey(id, seqValue);\n    }\n\n    public SequenceMapper getSequenceMapper() {\n        return sequenceMapper;\n    }\n\n    public void setSequenceMapper(SequenceMapper sequenceMapper) {\n        this.sequenceMapper = sequenceMapper;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/common/app/AppResponseTransformer.java",
    "content": "package com.jd.easyflow.common.app;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport com.jd.easyflow.common.app.dto.AppResponse;\nimport com.jd.easyflow.common.util.CommonErrorCode;\n\n/**\n * @author liyuliang5\n *\n */\npublic class AppResponseTransformer {\n\n    public static <T> AppResponse<T> buildResponse4Fail(CommonErrorCode code) {\n        return buildResponse(code.getCode(), code.getDesc(), null);\n    }\n\n    public static <T> AppResponse<T> buildResponse4Fail(String resCode, String info) {\n        return buildResponse(resCode, info, null);\n    }\n\n    public static <T> AppResponse<T> buildResponse(String resCode, String info, T resData) {\n\n        AppResponse<T> response = new AppResponse<T>();\n\n        response.setResultMsg(info);\n        response.setResultCode(resCode);\n        response.setResultData(resData);\n        return response;\n    }\n\n\n    public static <T> AppResponse<T> buildResponseNoLogin(String resCode, String info, String loginUrl) {\n\n        AppResponse<T> response = new AppResponse<T>();\n\n        response.setResultMsg(info);\n        response.setResultCode(resCode);\n        response.setExtData(loginUrl);\n        return response;\n    }\n\n    public static <T> AppResponse<T> buildResponse4Succ(T resData) {\n        return buildResponse(CommonErrorCode.E0000000.getCode(), CommonErrorCode.E0000000.getDesc(), resData);\n    }\n\n    public static boolean isSuccess(AppResponse response) {\n        return response != null && CommonErrorCode.E0000000.getCode().equals(response.getResultCode());\n    }\n\n    public static AppResponse buildResponseNoLogin(String loginUrl) {\n        return buildResponseNoLogin(CommonErrorCode.E0000006.getCode(), CommonErrorCode.E0000006.getDesc(), loginUrl);\n    }\n\n    public static AppResponse buildResponse4FieldError(String field, String errDesc) {\n        Map<String,String> fieldError = new HashMap<>();\n        fieldError.put(field, errDesc);\n        return buildResponse4FieldError(fieldError);\n    }\n    \n    public static AppResponse buildResponse4FieldError(Map<String,String> fieldError) {\n        AppResponse appResponse = new AppResponse(CommonErrorCode.E0000008.getCode(),CommonErrorCode.E0000008.getDesc());\n        appResponse.setExtData(fieldError);\n        return appResponse;\n    }\n\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/common/app/dto/AppRequest.java",
    "content": "package com.jd.easyflow.common.app.dto;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n * \n */\npublic class AppRequest implements Serializable {\n\n}"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/common/app/dto/AppResponse.java",
    "content": " package com.jd.easyflow.common.app.dto;\n\nimport java.io.Serializable;\n\n/**\n * @author liyuliang5\n * \n */\npublic class AppResponse <T> implements Serializable {\n\n    private static final long serialVersionUID = -4256209410226007408L;\n\n    private String resultCode;\n\n    private String resultMsg;\n\n    private T resultData;\n\n    private Object extData;\n\n    public AppResponse() {\n    }\n\n    public AppResponse(String resultCode, String resultMsg) {\n        this.resultCode = resultCode;\n        this.resultMsg = resultMsg;\n    }\n\n    public String getResultCode() {\n        return resultCode;\n    }\n\n    public void setResultCode(String resultCode) {\n        this.resultCode = resultCode;\n    }\n\n    public String getResultMsg() {\n        return resultMsg;\n    }\n\n    public void setResultMsg(String resultMsg) {\n        this.resultMsg = resultMsg;\n    }\n\n    public T getResultData() {\n        return resultData;\n    }\n\n    public void setResultData(T resultData) {\n        this.resultData = resultData;\n    }\n\n    public Object getExtData() {\n        return extData;\n    }\n\n    public void setExtData(Object extData) {\n        this.extData = extData;\n    }\n\n    @Override\n    public String toString() {\n        return \"AppResponse [resultCode=\" + resultCode + \", resultMsg=\" + resultMsg + \", resultData=\" + resultData\n                + \", extData=\" + extData + \"]\";\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/form/adapter/export/FormTemplateExportImpl.java",
    "content": "package com.jd.easyflow.form.adapter.export;\n\nimport org.springframework.beans.factory.annotation.Autowired;\n\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponse;\nimport com.jd.easyflow.common.adapter.export.dto.pager.PagerCondition;\nimport com.jd.easyflow.common.adapter.export.dto.pager.PagerResult;\nimport com.jd.easyflow.form.adapter.export.converter.FormTemplateConverter;\nimport com.jd.easyflow.form.adapter.export.converter.PagerConverter;\nimport com.jd.easyflow.form.adapter.export.dto.FormTemplateDTO;\nimport com.jd.easyflow.form.domain.model.entity.FormTemplateEntity;\nimport com.jd.easyflow.form.domain.repository.FormTemplateRepository;\nimport com.jd.easyflow.form.domain.service.FormTemplateDomainService;\n\n/**\n * @author liyuliang5\n *\n */\npublic class FormTemplateExportImpl implements FormTemplateExport {\n\n    @Autowired\n    private FormTemplateDomainService formTemplateDomainService;\n    @Autowired\n    private FormTemplateRepository formTemplateRepository;\n\n    @Override\n    public ExportResponse<PagerResult> find(ExportRequest<PagerCondition> req) {\n        com.jd.easyflow.common.dto.pager.PagerResult<FormTemplateEntity> pagerResult = formTemplateRepository\n                .find(PagerConverter.INSTANCE.convert(req.getData()));\n        return ExportResponse.build4Success(new PagerResult<>(pagerResult.getCount(),\n                FormTemplateConverter.INSTANCE.convert(pagerResult.getList())));\n\n    }\n\n    @Override\n    public ExportResponse<Void> add(ExportRequest<FormTemplateDTO> req) {\n        FormTemplateEntity entity = FormTemplateConverter.INSTANCE.convert(req.getData());\n        formTemplateRepository.add(entity);\n        return ExportResponse.build4Success();\n    }\n\n    @Override\n    public ExportResponse<Void> update(ExportRequest<FormTemplateDTO> req) {\n        formTemplateDomainService.update(FormTemplateConverter.INSTANCE.convert(req.getData()));\n        return ExportResponse.build4Success();\n    }\n\n    @Override\n    public ExportResponse<FormTemplateDTO> get(ExportRequest<String> req) {\n        String templateCode = req.getData();\n        FormTemplateEntity entity = formTemplateRepository.get(templateCode);\n        return ExportResponse.build4Success(FormTemplateConverter.INSTANCE.convert(entity));\n    }\n\n    public FormTemplateDomainService getFormTemplateDomainService() {\n        return formTemplateDomainService;\n    }\n\n    public void setFormTemplateDomainService(FormTemplateDomainService formTemplateDomainService) {\n        this.formTemplateDomainService = formTemplateDomainService;\n    }\n\n    public FormTemplateRepository getFormTemplateRepository() {\n        return formTemplateRepository;\n    }\n\n    public void setFormTemplateRepository(FormTemplateRepository formTemplateRepository) {\n        this.formTemplateRepository = formTemplateRepository;\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/form/adapter/export/converter/FormTemplateConverter.java",
    "content": "package com.jd.easyflow.form.adapter.export.converter;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport com.jd.easyflow.form.adapter.export.dto.FormTemplateDTO;\nimport com.jd.easyflow.form.domain.model.entity.FormTemplateEntity;\n\n/**\n * @author liyuliang5\n *\n */\npublic class FormTemplateConverter {\n    \n    public static FormTemplateConverter INSTANCE = new FormTemplateConverter();\n\n    public FormTemplateDTO convert(FormTemplateEntity entity) {\n        if ( entity == null ) {\n            return null;\n        }\n\n        FormTemplateDTO formTemplateDTO = new FormTemplateDTO();\n\n        formTemplateDTO.setBizType( entity.getBizType() );\n        formTemplateDTO.setConfig( entity.getConfig() );\n        formTemplateDTO.setCreatedDate( entity.getCreatedDate() );\n        formTemplateDTO.setId( entity.getId() );\n        formTemplateDTO.setModifiedDate( entity.getModifiedDate() );\n        formTemplateDTO.setStatus( entity.getStatus() );\n        formTemplateDTO.setTemplateCode( entity.getTemplateCode() );\n        formTemplateDTO.setTemplateName( entity.getTemplateName() );\n\n        return formTemplateDTO;\n    }\n\n    public FormTemplateEntity convert(FormTemplateDTO dto) {\n        if ( dto == null ) {\n            return null;\n        }\n\n        FormTemplateEntity formTemplateEntity = new FormTemplateEntity();\n\n        formTemplateEntity.setBizType( dto.getBizType() );\n        formTemplateEntity.setConfig( dto.getConfig() );\n        formTemplateEntity.setCreatedDate( dto.getCreatedDate() );\n        formTemplateEntity.setId( dto.getId() );\n        formTemplateEntity.setModifiedDate( dto.getModifiedDate() );\n        formTemplateEntity.setStatus( dto.getStatus() );\n        formTemplateEntity.setTemplateCode( dto.getTemplateCode() );\n        formTemplateEntity.setTemplateName( dto.getTemplateName() );\n\n        return formTemplateEntity;\n    }\n\n    public List<FormTemplateDTO> convert(List<FormTemplateEntity> list) {\n        if ( list == null ) {\n            return null;\n        }\n\n        List<FormTemplateDTO> list1 = new ArrayList<FormTemplateDTO>( list.size() );\n        for ( FormTemplateEntity formTemplateEntity : list ) {\n            list1.add( convert( formTemplateEntity ) );\n        }\n\n        return list1;\n    }\n}"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/form/adapter/export/converter/PagerConverter.java",
    "content": "package com.jd.easyflow.form.adapter.export.converter;\n\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport com.jd.easyflow.common.dto.pager.FieldEntry;\nimport com.jd.easyflow.common.dto.pager.PagerCondition;\nimport com.jd.easyflow.common.dto.pager.SortEntry;\n\n/**\n * @author liyuliang5\n *\n */\npublic class PagerConverter {\n    \n    public static PagerConverter INSTANCE = new PagerConverter();\n\n    public PagerCondition convert(com.jd.easyflow.common.adapter.export.dto.pager.PagerCondition condition) {\n        if ( condition == null ) {\n            return null;\n        }\n\n        PagerCondition pagerCondition = new PagerCondition();\n\n        pagerCondition.setCount( condition.isCount() );\n        Map<String, Object> map = condition.getExtData();\n        if ( map != null ) {\n            pagerCondition.setExtData( new HashMap<String, Object>( map ) );\n        }\n        pagerCondition.setFieldList( fieldEntryListToFieldEntryList( condition.getFieldList() ) );\n        pagerCondition.setPage( condition.getPage() );\n        pagerCondition.setPageIndex( condition.getPageIndex() );\n        pagerCondition.setPageSize( condition.getPageSize() );\n        pagerCondition.setSortList( sortEntryListToSortEntryList( condition.getSortList() ) );\n        pagerCondition.setStart( condition.getStart() );\n        if ( pagerCondition.getFieldMap() != null ) {\n            Map<String, FieldEntry> map1 = stringFieldEntryMapToStringFieldEntryMap( condition.getFieldMap() );\n            if ( map1 != null ) {\n                pagerCondition.getFieldMap().putAll( map1 );\n            }\n        }\n        if ( pagerCondition.getSortMap() != null ) {\n            Map<String, SortEntry> map2 = stringSortEntryMapToStringSortEntryMap( condition.getSortMap() );\n            if ( map2 != null ) {\n                pagerCondition.getSortMap().putAll( map2 );\n            }\n        }\n\n        return pagerCondition;\n    }\n\n    protected FieldEntry fieldEntryToFieldEntry(com.jd.easyflow.common.adapter.export.dto.pager.FieldEntry fieldEntry) {\n        if ( fieldEntry == null ) {\n            return null;\n        }\n\n        FieldEntry fieldEntry1 = new FieldEntry();\n\n        fieldEntry1.setName( fieldEntry.getName() );\n        fieldEntry1.setValue( fieldEntry.getValue() );\n\n        return fieldEntry1;\n    }\n\n    protected List<FieldEntry> fieldEntryListToFieldEntryList(List<com.jd.easyflow.common.adapter.export.dto.pager.FieldEntry> list) {\n        if ( list == null ) {\n            return null;\n        }\n\n        List<FieldEntry> list1 = new ArrayList<FieldEntry>( list.size() );\n        for ( com.jd.easyflow.common.adapter.export.dto.pager.FieldEntry fieldEntry : list ) {\n            list1.add( fieldEntryToFieldEntry( fieldEntry ) );\n        }\n\n        return list1;\n    }\n\n    protected SortEntry sortEntryToSortEntry(com.jd.easyflow.common.adapter.export.dto.pager.SortEntry sortEntry) {\n        if ( sortEntry == null ) {\n            return null;\n        }\n\n        SortEntry sortEntry1 = new SortEntry();\n\n        sortEntry1.setKey( sortEntry.getKey() );\n        sortEntry1.setSeq( sortEntry.getSeq() );\n        sortEntry1.setType( sortEntry.getType() );\n\n        return sortEntry1;\n    }\n\n    protected List<SortEntry> sortEntryListToSortEntryList(List<com.jd.easyflow.common.adapter.export.dto.pager.SortEntry> list) {\n        if ( list == null ) {\n            return null;\n        }\n\n        List<SortEntry> list1 = new ArrayList<SortEntry>( list.size() );\n        for ( com.jd.easyflow.common.adapter.export.dto.pager.SortEntry sortEntry : list ) {\n            list1.add( sortEntryToSortEntry( sortEntry ) );\n        }\n\n        return list1;\n    }\n\n    protected Map<String, FieldEntry> stringFieldEntryMapToStringFieldEntryMap(Map<String, com.jd.easyflow.common.adapter.export.dto.pager.FieldEntry> map) {\n        if ( map == null ) {\n            return null;\n        }\n\n        Map<String, FieldEntry> map1 = new HashMap<String, FieldEntry>( Math.max( (int) ( map.size() / .75f ) + 1, 16 ) );\n\n        for ( java.util.Map.Entry<String, com.jd.easyflow.common.adapter.export.dto.pager.FieldEntry> entry : map.entrySet() ) {\n            String key = entry.getKey();\n            FieldEntry value = fieldEntryToFieldEntry( entry.getValue() );\n            map1.put( key, value );\n        }\n\n        return map1;\n    }\n\n    protected Map<String, SortEntry> stringSortEntryMapToStringSortEntryMap(Map<String, com.jd.easyflow.common.adapter.export.dto.pager.SortEntry> map) {\n        if ( map == null ) {\n            return null;\n        }\n\n        Map<String, SortEntry> map1 = new HashMap<String, SortEntry>( Math.max( (int) ( map.size() / .75f ) + 1, 16 ) );\n\n        for ( java.util.Map.Entry<String, com.jd.easyflow.common.adapter.export.dto.pager.SortEntry> entry : map.entrySet() ) {\n            String key = entry.getKey();\n            SortEntry value = sortEntryToSortEntry( entry.getValue() );\n            map1.put( key, value );\n        }\n\n        return map1;\n    }\n}\n\n\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/form/domain/model/entity/FormTemplateEntity.java",
    "content": "package com.jd.easyflow.form.domain.model.entity;\n\nimport java.util.Date;\n\n/**\n * @author liyuliang5\n *\n */\npublic class FormTemplateEntity {\n\n    private Long id;\n\n    private Date createdDate;\n\n    private Date modifiedDate;\n\n    private String templateCode;\n\n    private String templateName;\n\n    private String config;\n\n    private String status;\n    \n    private String bizType;\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n\n    public String getTemplateCode() {\n        return templateCode;\n    }\n\n    public void setTemplateCode(String templateCode) {\n        this.templateCode = templateCode;\n    }\n\n    public String getTemplateName() {\n        return templateName;\n    }\n\n    public void setTemplateName(String templateName) {\n        this.templateName = templateName;\n    }\n\n    public String getConfig() {\n        return config;\n    }\n\n    public void setConfig(String config) {\n        this.config = config;\n    }\n\n    public String getStatus() {\n        return status;\n    }\n\n    public void setStatus(String status) {\n        this.status = status;\n    }\n\n    public String getBizType() {\n        return bizType;\n    }\n\n    public void setBizType(String bizType) {\n        this.bizType = bizType;\n    }\n\n    @Override\n    public String toString() {\n        return \"FormTemplateEntity [id=\" + id + \", createdDate=\" + createdDate + \", modifiedDate=\" + modifiedDate\n                + \", templateCode=\" + templateCode + \", templateName=\" + templateName + \", config=\" + config\n                + \", status=\" + status + \", bizType=\" + bizType + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/form/domain/repository/FormTemplateRepository.java",
    "content": "package com.jd.easyflow.form.domain.repository;\n\nimport com.jd.easyflow.common.dto.pager.PagerCondition;\nimport com.jd.easyflow.common.dto.pager.PagerResult;\nimport com.jd.easyflow.form.domain.model.entity.FormTemplateEntity;\n\n/**\n * @author liyuliang5\n *\n */\npublic interface FormTemplateRepository {\n\n    PagerResult find(PagerCondition pagerCondition);\n    \n    void add(FormTemplateEntity formTemplate);\n    \n    void update(FormTemplateEntity formTemplate);\n    \n    void delete(long id);\n    \n    FormTemplateEntity get(String templateCode);\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/form/domain/service/FormTemplateDomainService.java",
    "content": "package com.jd.easyflow.form.domain.service;\n\nimport org.springframework.beans.factory.annotation.Autowired;\n\nimport com.jd.easyflow.form.domain.model.entity.FormTemplateEntity;\nimport com.jd.easyflow.form.domain.repository.FormTemplateRepository;\n\n/**\n * @author liyuliang5\n *\n */\npublic class FormTemplateDomainService {\n    \n    @Autowired\n    FormTemplateRepository formTemplateRepository;\n\n    public void update(FormTemplateEntity entity) {\n        FormTemplateEntity formTemplate = formTemplateRepository.get(entity.getTemplateCode());\n        formTemplateRepository.delete(formTemplate.getId());\n        formTemplateRepository.add(entity);\n    }\n\n    public FormTemplateRepository getFormTemplateRepository() {\n        return formTemplateRepository;\n    }\n\n    public void setFormTemplateRepository(FormTemplateRepository formTemplateRepository) {\n        this.formTemplateRepository = formTemplateRepository;\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/form/infrastructure/converter/FormTemplateConverter.java",
    "content": "package com.jd.easyflow.form.infrastructure.converter;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport com.jd.easyflow.form.domain.model.entity.FormTemplateEntity;\nimport com.jd.easyflow.form.infrastructure.persistence.po.FormTemplate;\n\n/**\n * @author liyuliang5\n *\n */\npublic class FormTemplateConverter {\n    \n    public static FormTemplateConverter INSTANCE = new FormTemplateConverter();\n\n\n    public FormTemplateEntity convert(FormTemplate formTemplate) {\n        if ( formTemplate == null ) {\n            return null;\n        }\n\n        FormTemplateEntity formTemplateEntity = new FormTemplateEntity();\n\n        formTemplateEntity.setBizType( formTemplate.getBizType() );\n        formTemplateEntity.setConfig( formTemplate.getConfig() );\n        formTemplateEntity.setCreatedDate( formTemplate.getCreatedDate() );\n        formTemplateEntity.setId( formTemplate.getId() );\n        formTemplateEntity.setModifiedDate( formTemplate.getModifiedDate() );\n        formTemplateEntity.setStatus( formTemplate.getStatus() );\n        formTemplateEntity.setTemplateCode( formTemplate.getTemplateCode() );\n        formTemplateEntity.setTemplateName( formTemplate.getTemplateName() );\n\n        return formTemplateEntity;\n    }\n\n    public FormTemplate convert(FormTemplateEntity entity) {\n        if ( entity == null ) {\n            return null;\n        }\n\n        FormTemplate formTemplate = new FormTemplate();\n\n        formTemplate.setBizType( entity.getBizType() );\n        formTemplate.setConfig( entity.getConfig() );\n        formTemplate.setCreatedDate( entity.getCreatedDate() );\n        formTemplate.setId( entity.getId() );\n        formTemplate.setModifiedDate( entity.getModifiedDate() );\n        formTemplate.setStatus( entity.getStatus() );\n        formTemplate.setTemplateCode( entity.getTemplateCode() );\n        formTemplate.setTemplateName( entity.getTemplateName() );\n\n        return formTemplate;\n    }\n\n    public List<FormTemplateEntity> convert(List<FormTemplate> list) {\n        if ( list == null ) {\n            return null;\n        }\n\n        List<FormTemplateEntity> list1 = new ArrayList<FormTemplateEntity>( list.size() );\n        for ( FormTemplate formTemplate : list ) {\n            list1.add( convert( formTemplate ) );\n        }\n\n        return list1;\n    }\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/form/infrastructure/persistence/mapper/FormTemplateMapper.java",
    "content": "package com.jd.easyflow.form.infrastructure.persistence.mapper;\n\nimport java.util.List;\n\nimport com.jd.easyflow.common.dto.pager.PagerCondition;\nimport com.jd.easyflow.form.infrastructure.persistence.po.FormTemplate;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic interface FormTemplateMapper {\n    \n    FormTemplate selectByTemplateCode(String templateCode);\n    \n    int deleteByPrimaryKey(Long id);\n\n    int insert(FormTemplate record);\n\n    int insertSelective(FormTemplate record);\n\n    FormTemplate selectByPrimaryKey(Long id);\n\n    int updateByPrimaryKeySelective(FormTemplate record);\n\n    int updateByPrimaryKey(FormTemplate record);\n    \n    long countByPagerCondition(PagerCondition condition);\n\n    List<FormTemplate> selectByPagerCondition(PagerCondition condition);\n}"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/form/infrastructure/persistence/po/FormTemplate.java",
    "content": "package com.jd.easyflow.form.infrastructure.persistence.po;\n\nimport java.util.Date;\n\n/**\n * @author liyuliang5\n *\n */\npublic class FormTemplate {\n\n\n    private Long id;\n\n    private Date createdDate;\n\n    private Date modifiedDate;\n\n    private Integer deleted;\n\n    private String templateCode;\n\n    private String templateName;\n\n    private String config;\n\n    private String status;\n\n    private String bizType;\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n\n    public Integer getDeleted() {\n        return deleted;\n    }\n\n    public void setDeleted(Integer deleted) {\n        this.deleted = deleted;\n    }\n\n    public String getTemplateCode() {\n        return templateCode;\n    }\n\n    public void setTemplateCode(String templateCode) {\n        this.templateCode = templateCode;\n    }\n\n    public String getTemplateName() {\n        return templateName;\n    }\n\n    public void setTemplateName(String templateName) {\n        this.templateName = templateName;\n    }\n\n    public String getConfig() {\n        return config;\n    }\n\n    public void setConfig(String config) {\n        this.config = config;\n    }\n\n    public String getStatus() {\n        return status;\n    }\n\n    public void setStatus(String status) {\n        this.status = status;\n    }\n\n    public String getBizType() {\n        return bizType;\n    }\n\n    public void setBizType(String bizType) {\n        this.bizType = bizType;\n    }\n\n    @Override\n    public String toString() {\n        return \"FormTemplate [id=\" + id + \", createdDate=\" + createdDate + \", modifiedDate=\" + modifiedDate\n                + \", deleted=\" + deleted + \", templateCode=\" + templateCode + \", templateName=\" + templateName\n                + \", config=\" + config + \", status=\" + status + \", bizType=\" + bizType + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/form/infrastructure/repository/FormTemplateRepositoryImpl.java",
    "content": "package com.jd.easyflow.form.infrastructure.repository;\n\nimport java.util.List;\n\nimport org.springframework.beans.factory.annotation.Autowired;\n\nimport com.jd.easyflow.common.dto.pager.PagerCondition;\nimport com.jd.easyflow.common.dto.pager.PagerResult;\nimport com.jd.easyflow.form.domain.model.entity.FormTemplateEntity;\nimport com.jd.easyflow.form.domain.repository.FormTemplateRepository;\nimport com.jd.easyflow.form.infrastructure.converter.FormTemplateConverter;\nimport com.jd.easyflow.form.infrastructure.persistence.mapper.FormTemplateMapper;\nimport com.jd.easyflow.form.infrastructure.persistence.po.FormTemplate;\n\n/**\n * @author liyuliang5\n *\n */\npublic class FormTemplateRepositoryImpl implements FormTemplateRepository {\n    \n    @Autowired\n    private FormTemplateMapper formTemplateMapper;\n\n    @Override\n    public PagerResult find(PagerCondition pagerCondition) {\n        long count = formTemplateMapper.countByPagerCondition(pagerCondition);\n        List<FormTemplate> list = formTemplateMapper.selectByPagerCondition(pagerCondition);\n        return new PagerResult<>(count, FormTemplateConverter.INSTANCE.convert(list));\n    }\n\n    @Override\n    public void add(FormTemplateEntity formTemplate) {\n        FormTemplate po = FormTemplateConverter.INSTANCE.convert(formTemplate);\n        formTemplateMapper.insert(po);\n        \n    }\n\n    @Override\n    public void update(FormTemplateEntity formTemplate) {\n        FormTemplate po = FormTemplateConverter.INSTANCE.convert(formTemplate);\n        formTemplateMapper.updateByPrimaryKey(po);\n    }\n\n    @Override\n    public void delete(long id) {\n        formTemplateMapper.deleteByPrimaryKey(id);\n        \n    }\n\n    @Override\n    public FormTemplateEntity get(String templateCode) {\n        FormTemplate po = formTemplateMapper.selectByTemplateCode(templateCode);\n        return FormTemplateConverter.INSTANCE.convert(po);\n    }\n\n    public FormTemplateMapper getFormTemplateMapper() {\n        return formTemplateMapper;\n    }\n\n    public void setFormTemplateMapper(FormTemplateMapper formTemplateMapper) {\n        this.formTemplateMapper = formTemplateMapper;\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/lock/LockService.java",
    "content": "package com.jd.easyflow.lock;\n\nimport java.time.Duration;\nimport java.util.function.Supplier;\n\npublic interface LockService {\n\n    \n    public String lock(String lockBizType, String bizKey);\n\n    public String lock(String lockBizType, String bizKey, int lockSecond, int waitSecond);\n\n    public String lock(String lockBizType, String bizKey, boolean throwExceptionOnLock);\n    \n    public String lock(String lockBizType, String bizKey, int lockSecond, int waitSecond, boolean throwExceptionOnLock);\n    \n    public String lock(String lockBizType, String bizKey, int lockSeconds, int waitSeconds, int sleepMills, String requestId,\n            boolean throwExceptionOnLock);\n \n    public String lockWithKey(String key, int lockSeconds, Duration waitDuration, int sleepMills,\n            boolean throwExceptionOnLock);\n    \n    public String lockWithKey(String key, int lockSeconds, Duration waitDuration, int sleepMills, String requestId,\n                       boolean throwExceptionOnLock);\n    \n    public boolean unlock(String lockBizType, String bizKey, String requestId);\n\n    public boolean unlockWithKey(String key, String requestId);\n    \n    public <T>T doInLock(String lockBizType, String bizKey, Supplier<T> repeatableAction);\n    \n    public <T>T doInlock(String lockBizType, String bizKey, int lockSecond, int waitSecond, Supplier<T> repeatableAction);\n      \n    public <T> T doInLockWithKey(String lockKey, int lockSeconds, Duration waitDuration, int sleepMills,\n            String requestId, boolean throwExceptionOnLock, Supplier<T> repeatableAction);\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/lock/LockUtil.java",
    "content": "package com.jd.easyflow.lock;\n\nimport java.util.function.Supplier;\n\nimport com.jd.easyflow.objects.factory.ObjectFactorys;\n\n/**\n * @author liyuliang5\n *\n */\npublic class LockUtil {\n\n    public static String lock(String lockBizType, String bizKey) {\n        return ObjectFactorys.getDefault().getObject(Locker.class).lock(lockBizType, bizKey);\n    }\n    \n    public static String lock(String lockBizType, String bizKey, int lockSecond, int waitSecond) {\n        return ObjectFactorys.getDefault().getObject(Locker.class).lock(lockBizType, bizKey, lockSecond, waitSecond);\n    }\n    \n    public static String lock(String lockBizType, String bizKey, boolean throwExceptionOnLock) {\n        return ObjectFactorys.getDefault().getObject(Locker.class).lock(lockBizType, bizKey, throwExceptionOnLock);\n    }\n    \n    public static String lock(String lockBizType, String bizKey, int lockSecond, int waitSecond, boolean throwExceptionOnLock) {\n        return ObjectFactorys.getDefault().getObject(Locker.class).lock(lockBizType, bizKey, lockSecond, waitSecond, throwExceptionOnLock);\n    }\n    \n    public static boolean unlock(String lockBizType, String bizKey, String requestId) {\n        return ObjectFactorys.getDefault().getObject(Locker.class).unlock(lockBizType, bizKey, requestId);\n    }\n    \n    public static <T>T doInLock(String lockBizType, String bizKey, Supplier<T> repeatableAction) {\n        return ObjectFactorys.getDefault().getObject(Locker.class).doInLock(lockBizType, bizKey, repeatableAction);\n    }\n    \n    public static <T>T doInlock(String lockBizType, String bizKey, int lockSecond, int waitSecond, Supplier<T> repeatableAction) {\n        return ObjectFactorys.getDefault().getObject(Locker.class).doInlock(lockBizType, bizKey, lockSecond, waitSecond, repeatableAction);\n    }\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/lock/Locker.java",
    "content": "package com.jd.easyflow.lock;\n\nimport java.time.Duration;\nimport java.util.function.Supplier;\n\n/**\n * @author liyuliang5\n *\n */\npublic interface Locker {\n\n    public String lock(String lockBizType, String bizKey);\n    \n    public String lock(String lockBizType, String bizKey, int lockSecond, int waitSecond);\n    \n    public String lock(String lockBizType, String bizKey, boolean throwExceptionOnLock);\n    \n    public String lock(String lockBizType, String bizKey, int lockSecond, int waitSecond, boolean throwExceptionOnLock);\n    \n    public String lockWithKey(String lockKey, int lockSecond, Duration waitDuration, int sleepMills, boolean throwExceptionOnLock);\n    \n    public String lockWithKey(String lockKey, int lockSecond, Duration waitDuration, int sleepMills, String requestId, boolean throwExceptionOnLock);\n\n    public boolean unlock(String lockBizType, String bizKey, String requestId);\n    \n    public boolean unlockWithKey(String lockKey, String requestId);\n    \n    public <T>T doInLock(String lockBizType, String bizKey, Supplier<T> repeatableAction);\n    \n    public <T>T doInlock(String lockBizType, String bizKey, int lockSecond, int waitSecond, Supplier<T> repeatableAction);\n    \n    public <T> T doInlockWithKey(String lockKey, int lockSecond, Duration waitDuration, int sleepMills, Supplier<T> repeatableAction);\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/lock/db/DbLockService.java",
    "content": "package com.jd.easyflow.lock.db;\n\nimport java.util.List;\nimport java.util.Map;\n\nimport javax.sql.DataSource;\n\nimport org.springframework.dao.DuplicateKeyException;\nimport org.springframework.jdbc.core.JdbcTemplate;\nimport org.springframework.jdbc.datasource.DataSourceTransactionManager;\nimport org.springframework.transaction.TransactionDefinition;\nimport org.springframework.transaction.support.TransactionTemplate;\n\nimport com.jd.easyflow.lock.impl.BaseLockService;\n\n\n/**\n * @author liyuliang5\n */\npublic class DbLockService extends BaseLockService {\n\n    private static final String LOCK_ON = \"1\";\n    private static final String LOCK_OFF = \"0\";\n\n    private JdbcTemplate jdbcTemplate;\n    \n    private TransactionTemplate transactionTemplate;\n\n    private DataSource dataSource;\n    \n    private String selectForUpdateSql = \"select request_id,lock_flag,expired_time from lock_record where lock_key=? for update\";\n    \n    private String insertSql = \"insert into lock_record(lock_key, lock_flag, request_id, expired_time) values(?,?,?,?)\";\n    \n    private String lockUpdateSql = \"update lock_record set lock_flag='1',request_id=?,expired_time=? where lock_key=?\";\n    \n    private String unlockUpdateSql = \"update lock_record set lock_flag='0' where lock_key=? and request_id=? and lock_flag='1'\";\n    \n    private String renewSql = \"update lock_record set expired_time=? where lock_key=? and request_id=? and lock_flag='1'\";\n    \n    public void init() {\n        jdbcTemplate = new JdbcTemplate(dataSource);\n        DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(dataSource);\n        transactionTemplate = new TransactionTemplate(transactionManager);\n        transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);\n    }\n    \n    /**\n     * \n     * @param key\n     * @param requestId\n     * @param lockSeconds. not use.\n     * @return\n     */\n    @Override\n    protected boolean accquireLock(String key, String requestId, int lockSeconds) {\n        return transactionTemplate.execute(status -> {\n            List<Map<String, Object>> lockRecordList = jdbcTemplate.queryForList(selectForUpdateSql, key);\n            long currentTime = System.currentTimeMillis();\n            long expiredTime = currentTime + lockSeconds * 1000;\n            if (lockRecordList.size() == 0) {\n                try {\n                    jdbcTemplate.update(insertSql, key, LOCK_ON, requestId, expiredTime);\n                    return true;\n                } catch (DuplicateKeyException e) {\n                    logger.error(\"key duplicate \" + e.getMessage(), e);\n                    lockRecordList = jdbcTemplate.queryForList(selectForUpdateSql, key);\n                }\n            }\n            Map<String, Object> lockRecord = lockRecordList.get(0);\n            String lockFlag = (String) lockRecord.get(\"lock_flag\");\n            Number currentExpiredTime = (Number) lockRecord.get(\"expired_time\");\n            long expireTime = currentExpiredTime == null ? 0 : currentExpiredTime.longValue();\n            if (LOCK_ON.equals(lockFlag) && expireTime > currentTime) {\n                return false;\n            }\n            int count = jdbcTemplate.update(lockUpdateSql, requestId, expiredTime, key);\n            return count == 1;\n        });\n    }\n    \n    @Override\n    protected boolean releaseLock(String key, String requestId) {\n        return transactionTemplate.execute(status -> {\n            int count = jdbcTemplate.update(unlockUpdateSql, key, requestId);\n            return count == 1;\n        });\n    }\n    \n    @Override\n    protected String queryLock(String key) {\n        return transactionTemplate.execute(status -> {\n            List<Map<String, Object>> lockRecordList = jdbcTemplate.queryForList(selectForUpdateSql, key);\n            return lockRecordList.size() == 0 ? null : (String) lockRecordList.get(0).get(\"request_id\");\n        });\n    }\n    \n    protected boolean renewLock(String key, String requestId, int renewSeconds) {\n        return transactionTemplate.execute(status -> {\n            long expiredTime = System.currentTimeMillis() + renewSeconds * 1000;\n            int count = jdbcTemplate.update(renewSql, expiredTime, key, requestId);\n            return count == 1;\n        });\n    }\n\n\n    public DataSource getDataSource() {\n        return dataSource;\n    }\n\n\n    public void setDataSource(DataSource dataSource) {\n        this.dataSource = dataSource;\n    }\n\n    public String getSelectForUpdateSql() {\n        return selectForUpdateSql;\n    }\n\n    public void setSelectForUpdateSql(String selectForUpdateSql) {\n        this.selectForUpdateSql = selectForUpdateSql;\n    }\n\n    public String getInsertSql() {\n        return insertSql;\n    }\n\n    public void setInsertSql(String insertSql) {\n        this.insertSql = insertSql;\n    }\n\n    public String getLockUpdateSql() {\n        return lockUpdateSql;\n    }\n\n    public void setLockUpdateSql(String lockUpdateSql) {\n        this.lockUpdateSql = lockUpdateSql;\n    }\n\n    public String getUnlockUpdateSql() {\n        return unlockUpdateSql;\n    }\n\n    public void setUnlockUpdateSql(String unlockUpdateSql) {\n        this.unlockUpdateSql = unlockUpdateSql;\n    }\n\n    public JdbcTemplate getJdbcTemplate() {\n        return jdbcTemplate;\n    }\n\n    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {\n        this.jdbcTemplate = jdbcTemplate;\n    }\n\n    public TransactionTemplate getTransactionTemplate() {\n        return transactionTemplate;\n    }\n\n    public void setTransactionTemplate(TransactionTemplate transactionTemplate) {\n        this.transactionTemplate = transactionTemplate;\n    }\n\n    public String getRenewSql() {\n        return renewSql;\n    }\n\n    public void setRenewSql(String renewSql) {\n        this.renewSql = renewSql;\n    }\n\n\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/lock/impl/BaseLockService.java",
    "content": "package com.jd.easyflow.lock.impl;\n\nimport java.time.Duration;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.UUID;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.function.Supplier;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.common.exception.EasyFlowException;\nimport com.jd.easyflow.lock.LockService;\n\n/**\n * @author liyuliang5\n */\npublic abstract class BaseLockService implements LockService {\n    \n    public static final int RENEW_LOCK_SECONDS = -1;\n\n    protected Logger logger = LoggerFactory.getLogger(this.getClass());\n\n    private int defaultLockSeconds = 60 * 60 * 24;\n\n    private int defaultWaitSeconds = 10;\n    private int defaultSleepMillis = 50;\n\n    private static final String KEY_PREFIX = \"_lock_\";\n    \n    private static final String KEY_SEP = \"__\";\n    \n    \n    private boolean optimizeByLocalSync = true;\n    \n    private int retryTimesOnAccquireLockException = 1;\n    \n    private int retryTimesOnReleaseLockException = 1;\n    \n    private boolean renewEnabled = false;\n    \n    private int renewLockSeconds = 60;\n    \n    private int renewBeforeExpiredSeconds = 40;\n    \n    private int renewLoopIntervalSeconds = 10;\n    \n    private Map<String, RenewLockInfo> renewLockMap = new ConcurrentHashMap<String, RenewLockInfo>();\n    \n        \n    public BaseLockService() {\n    }\n    \n    public void init() {\n        if (renewEnabled) {\n            Thread renewThread = new Thread(() -> {\n                loopRenewLocks();\n            });\n            renewThread.setDaemon(true);\n            renewThread.start();\n        }\n    }\n\n    \n    public String lock(String lockBizType, String bizKey) {\n        return lock(lockBizType, bizKey, defaultLockSeconds, defaultWaitSeconds, defaultSleepMillis, generateRequestId(), true);\n    }\n\n    public String lock(String lockBizType, String bizKey, int lockSecond, int waitSecond) {\n        return lock(lockBizType, bizKey, lockSecond, waitSecond, defaultSleepMillis, generateRequestId(), true);\n    }\n\n    public String lock(String lockBizType, String bizKey, boolean throwExceptionOnLock) {\n        return lock(lockBizType, bizKey, defaultLockSeconds, defaultWaitSeconds, defaultSleepMillis, generateRequestId(), throwExceptionOnLock);\n    }\n    \n    public String lock(String lockBizType, String bizKey, int lockSecond, int waitSecond, boolean throwExceptionOnLock) {\n        return lock(lockBizType, bizKey, lockSecond, waitSecond, defaultSleepMillis, generateRequestId(), throwExceptionOnLock);\n    }\n    \n    public String lock(String lockBizType, String bizKey, int lockSeconds, int waitSeconds, int sleepMills, String requestId,\n            boolean throwExceptionOnLock) {\n        String key = buildLockKey(lockBizType, bizKey);\n        return lockWithKey(key, lockSeconds, Duration.ofSeconds(waitSeconds), sleepMills, requestId, throwExceptionOnLock);\n    }\n    \n    public String lockWithKey(String lockKey, int lockSecond, Duration waitDuration, int sleepMills,\n            boolean throwExceptionOnLock) {\n        return lockWithKey(lockKey, lockSecond, waitDuration, sleepMills,\n                generateRequestId(), throwExceptionOnLock);\n    }\n    \n    public String lockWithKey(String key, int lockSeconds, Duration waitDuration, int sleepMills, String requestId,\n                       boolean throwExceptionOnLock) {\n        if (lockSeconds < 0) {\n            if (lockSeconds == RENEW_LOCK_SECONDS) {\n                if (! renewEnabled) {\n                    lockSeconds = defaultLockSeconds;\n                }\n            }\n        }\n        \n        boolean renew = false;\n        if (renewEnabled && lockSeconds == RENEW_LOCK_SECONDS) {\n            lockSeconds = renewLockSeconds;\n            renew = true;\n        }\n        if (logger.isDebugEnabled()) {\n            logger.debug(\"Start lock, key:\" + key);\n        }\n        if (sleepMills < 5) {\n            sleepMills = 5;\n        }\n        long waitMills = waitDuration.toMillis();\n        if (requestId == null) {\n            requestId = generateRequestId();\n        }\n        if (optimizeByLocalSync) {\n            addLockThreads(key);\n        }\n        try {\n        while (true) {\n            if (!optimizeByLocalSync || isLockAccquireThread(key)) {\n                boolean result = accquireLockWithRetry(key, requestId, lockSeconds);\n                logger.info(\"Accquire lock \" + result + \" key:\" + key);\n                if (result) {\n                    if (renew) {\n                        RenewLockInfo lockInfo = new RenewLockInfo(key, requestId, System.currentTimeMillis() + lockSeconds * 1000L, Thread.currentThread().getId(), true);\n                        synchronized (renewLockMap) {\n                            renewLockMap.put(key, lockInfo);\n                        }\n                    }\n                    break;\n                }\n            }\n            if (waitMills > 0) {\n                try {\n                    Thread.sleep(sleepMills);\n                } catch (InterruptedException e) {\n                    throw new EasyFlowException(e);\n                }\n                waitMills -= sleepMills;\n            } else {\n                if (throwExceptionOnLock) {\n                    throw new EasyFlowException(\"Lock fail,key:\"+ key);\n                } else {\n                    logger.warn(\"Lock fail, key:\" + key);\n                    return null;\n                }\n            }\n        }\n        } finally {\n            if (optimizeByLocalSync) {\n                removeLockThread(key);\n            }\n        }\n        if (logger.isDebugEnabled()) {\n            logger.debug(\"Lock success, requestId:\" + requestId);\n        }\n        return requestId;\n\n    }\n    \n    protected boolean accquireLockWithRetry(String key, String requestId, int lockSeconds) {\n        try {\n            boolean result = accquireLock(key, requestId, lockSeconds);\n            return result;\n        } catch (Exception e) {\n            if (retryTimesOnAccquireLockException < 1) {\n                throw e;\n            }\n            logger.warn(\"accquire lock exception:\" + e.getMessage() + \",start retry\", e);\n            int retryTimes = 0;\n            while (true) {\n                retryTimes++;\n                try {\n                    String currentRequestId = queryLock(key);\n                    logger.info(\"retry success, currentRequestId:\" + currentRequestId + \" requestId:\" + requestId);\n                    return requestId.equals(currentRequestId);\n                } catch (Exception e2) {\n                    logger.warn(\"accquire lock retry exception:\" + e.getMessage(), e);\n                    if (retryTimes >= retryTimesOnAccquireLockException) {\n                        throw e2;\n                    }\n                }\n            }\n        }\n\n    }\n    \n    protected abstract boolean accquireLock(String key, String requestId, int lockSeconds);\n    \n    protected boolean releaseLockWithRetry(String key, String requestId) {\n        try {\n            boolean result = releaseLock(key, requestId);\n            return result;\n        } catch (Exception e) {\n            if (retryTimesOnReleaseLockException < 1) {\n                throw e;\n            }\n            logger.warn(\"release lock exception:\" + e.getMessage() + \", start retry\", e);\n            int retryTimes = 0;\n            while (true) {\n                retryTimes++;\n                try {\n                    boolean result = releaseLock(key, requestId);\n                    logger.info(\"retry success, result:\" + result);\n                    return result;\n                } catch (Exception e2) {\n                    logger.warn(\"release lock retry exception,\" + e.getMessage(), e);\n                    if (retryTimes >= retryTimesOnReleaseLockException) {\n                        throw e2;\n                    }\n                }\n\n            }\n        }\n    }\n    \n    protected abstract boolean releaseLock(String key, String requestId);\n    \n    protected abstract String queryLock(String key);\n    \n    protected abstract boolean renewLock(String key, String requestId, int renewSeconds);\n    \n    \n    private volatile Map<String, List<Long>> localLockMap = new ConcurrentHashMap<String, List<Long>>();\n    \n    private void addLockThreads(String lockKey) {\n        long threadId = Thread.currentThread().getId();\n        localLockMap.compute(lockKey, (key, value) -> {\n            if (value == null) {\n                value = Collections.synchronizedList(new ArrayList<Long>(1));\n            }\n            value.add(threadId);\n            return value;\n        });\n    }\n    \n    private boolean isLockAccquireThread(String lockKey) {\n        List<Long> lockThreadList = localLockMap.get(lockKey);\n        return lockThreadList.get(0) == Thread.currentThread().getId();\n    }\n\n    private void removeLockThread(String lockKey) {\n        long threadId = Thread.currentThread().getId();\n        localLockMap.compute(lockKey, (key, value) -> {\n            value.remove(threadId);\n            return value.size() == 0 ? null : value;\n        });\n    }\n    \n    protected String generateRequestId() {\n        return UUID.randomUUID().toString() + \"|\" + System.currentTimeMillis();\n    }\n\n    public boolean unlock(String lockBizType, String bizKey, String requestId) {\n        String key = buildLockKey(lockBizType, bizKey);\n        return unlockWithKey(key, requestId);\n    }\n\n    public boolean unlockWithKey(String key, String requestId) {\n        if (requestId == null) {\n            logger.info(\"lock key:\" + key + \"requestId is null, return\");\n            return false;\n        }\n        logger.info(\"Unlock:key:\" + key + \" requestId:\" + requestId);\n        if (renewEnabled) {\n            synchronized (renewLockMap) {\n                renewLockMap.computeIfPresent(key, (k, v) -> {\n                    v.valid = false;\n                    return null;\n                });\n            }\n        }\n        boolean result = releaseLockWithRetry(key, requestId);\n        if (! result) {\n            logger.warn(\"Unlock fail, may unlocked or lock not exists, key:\" + key, \" requestId\" + requestId);\n            return false;\n        }\n        return true;\n    }\n    \n    public <T>T doInLock(String lockBizType, String bizKey, Supplier<T> repeatableAction) {\n        return doInLock(lockBizType, bizKey, defaultLockSeconds, defaultWaitSeconds, defaultSleepMillis, generateRequestId(), true, repeatableAction);\n    }\n    \n    public <T>T doInlock(String lockBizType, String bizKey, int lockSecond, int waitSecond, Supplier<T> repeatableAction) {\n        return doInLock(lockBizType, bizKey, lockSecond, waitSecond, defaultSleepMillis, generateRequestId(), true, repeatableAction);\n    }\n    \n    private <T> T doInLock(String lockBizType, String bizKey, int lockSeconds, int waitSeconds, int sleepMills,\n            String requestId, boolean throwExceptionOnLock, Supplier<T> repeatableAction) {\n        requestId = lock(lockBizType, bizKey, lockSeconds, waitSeconds, sleepMills, requestId, throwExceptionOnLock);\n        if (requestId == null) {\n            return null;\n        }\n        try {\n            return repeatableAction.get();\n        } finally {\n            unlock(lockBizType, bizKey, requestId);\n        }\n    }\n    \n    \n    public <T> T doInLockWithKey(String lockKey, int lockSeconds, Duration waitDuration, int sleepMills,\n            String requestId, boolean throwExceptionOnLock, Supplier<T> repeatableAction) {\n        requestId = lockWithKey(lockKey, lockSeconds, waitDuration, sleepMills, requestId, throwExceptionOnLock);\n        if (requestId == null) {\n            return null;\n        }\n        try {\n            return repeatableAction.get();\n        } finally {\n            unlockWithKey(lockKey, requestId);\n        }\n    }\n    \n    private void loopRenewLocks() {\n        logger.info(\"start loop renew locks\");\n        while (true) {\n            try {\n                renewLocks();\n                Thread.sleep(renewLoopIntervalSeconds * 1000);\n            } catch (Throwable t) {\n                logger.error(\"loop renew locks exception \" + t.getMessage(), t);\n            }\n        }\n    }\n\n    private void renewLocks() {\n        List<RenewLockInfo> renewLockInfoList = new ArrayList<RenewLockInfo>(renewLockMap.size());\n        synchronized(renewLockMap) {\n            renewLockInfoList.addAll(renewLockMap.values());\n        }\n        boolean loggerDebug = logger.isDebugEnabled();\n        if (loggerDebug) {\n            logger.debug(\"renew lock size:\" + renewLockInfoList.size());\n        }\n        for (RenewLockInfo lockInfo : renewLockInfoList) {\n            if (loggerDebug) {\n                logger.debug(\"renew lock:\" + lockInfo);\n            }\n            if (!lockInfo.valid) {\n                continue;\n            }\n            long currentTime = System.currentTimeMillis();\n            if (lockInfo.expireTime - renewBeforeExpiredSeconds * 1000L < currentTime) {\n                try {\n                    renewLock(lockInfo.key, lockInfo.requestId, renewLockSeconds);\n                    lockInfo.renewTimes++;\n                } catch (Exception e) {\n                    logger.warn(\"renewlock exception, key:\" +lockInfo.key + \",\" + e.getMessage(), e);\n                }\n            }\n        }\n\n    }\n    \n    private String buildLockKey(String lockBizType, String bizKey) {\n        return KEY_PREFIX + lockBizType + KEY_SEP + bizKey;\n    }\n\n    public boolean isOptimizeByLocalSync() {\n        return optimizeByLocalSync;\n    }\n\n    public void setOptimizeByLocalSync(boolean optimizeByLocalSync) {\n        this.optimizeByLocalSync = optimizeByLocalSync;\n    }\n\n    \n    public int getRetryTimesOnAccquireLockException() {\n        return retryTimesOnAccquireLockException;\n    }\n\n    public void setRetryTimesOnAccquireLockException(int retryTimesOnAccquireLockException) {\n        this.retryTimesOnAccquireLockException = retryTimesOnAccquireLockException;\n    }\n\n    public int getRetryTimesOnReleaseLockException() {\n        return retryTimesOnReleaseLockException;\n    }\n\n    public void setRetryTimesOnReleaseLockException(int retryTimesOnReleaseLockException) {\n        this.retryTimesOnReleaseLockException = retryTimesOnReleaseLockException;\n    }\n\n    public boolean isRenewEnabled() {\n        return renewEnabled;\n    }\n\n\n    public void setRenewEnabled(boolean renewEnabled) {\n        this.renewEnabled = renewEnabled;\n    }\n\n\n    public int getRenewLockSeconds() {\n        return renewLockSeconds;\n    }\n\n\n    public void setRenewLockSeconds(int renewLockSeconds) {\n        this.renewLockSeconds = renewLockSeconds;\n    }\n\n\n    public int getRenewBeforeExpiredSeconds() {\n        return renewBeforeExpiredSeconds;\n    }\n\n\n    public void setRenewBeforeExpiredSeconds(int renewBeforeExpiredSeconds) {\n        this.renewBeforeExpiredSeconds = renewBeforeExpiredSeconds;\n    }\n\n\n    public int getRenewLoopIntervalSeconds() {\n        return renewLoopIntervalSeconds;\n    }\n\n\n    public void setRenewLoopIntervalSeconds(int renewLoopIntervalSeconds) {\n        this.renewLoopIntervalSeconds = renewLoopIntervalSeconds;\n    }\n\n\n    public Map<String, RenewLockInfo> getRenewLockMap() {\n        return renewLockMap;\n    }\n\n\n    public void setRenewLockMap(Map<String, RenewLockInfo> renewLockMap) {\n        this.renewLockMap = renewLockMap;\n    }\n    \n\n    public int getDefaultLockSeconds() {\n        return defaultLockSeconds;\n    }\n\n\n    public void setDefaultLockSeconds(int defaultLockSeconds) {\n        this.defaultLockSeconds = defaultLockSeconds;\n    }\n\n\n    public int getDefaultWaitSeconds() {\n        return defaultWaitSeconds;\n    }\n\n\n    public void setDefaultWaitSeconds(int defaultWaitSeconds) {\n        this.defaultWaitSeconds = defaultWaitSeconds;\n    }\n\n\n    public int getDefaultSleepMillis() {\n        return defaultSleepMillis;\n    }\n\n\n    public void setDefaultSleepMillis(int defaultSleepMillis) {\n        this.defaultSleepMillis = defaultSleepMillis;\n    }\n\n\n\n\n\n    private static class RenewLockInfo {\n\n        private String key;\n        \n        private String requestId;\n        \n        private long expireTime;\n        \n        private long lockThreadId;\n        \n        private boolean valid;\n        \n        private int renewTimes;\n        \n        public RenewLockInfo() {\n            \n        }\n        \n        \n        public RenewLockInfo(String key, String requestId, long expireTime, long lockThreadId, boolean valid) {\n            this.key = key;\n            this.requestId = requestId;\n            this.expireTime = expireTime;\n            this.lockThreadId = lockThreadId;\n            this.valid = valid;\n        }\n\n\n        @Override\n        public String toString() {\n            return \"RenewLockInfo [key=\" + key + \", requestId=\" + requestId + \", expireTime=\" + expireTime\n                    + \", lockThreadId=\" + lockThreadId + \", valid=\" + valid + \", renewTimes=\" + renewTimes + \"]\";\n        }\n        \n    }\n\n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/lock/impl/LockerImpl.java",
    "content": "package com.jd.easyflow.lock.impl;\n\nimport java.time.Duration;\nimport java.util.UUID;\nimport java.util.function.Supplier;\n\nimport com.jd.easyflow.lock.LockService;\nimport com.jd.easyflow.lock.Locker;\n\n/**\n * \n */\npublic class LockerImpl implements Locker {\n    \n    private LockService lockService;\n\n    @Override\n    public String lock(String lockBizType, String bizKey) {\n        return lockService.lock(lockBizType, bizKey);\n    }\n\n    @Override\n    public String lock(String lockBizType, String bizKey, int lockSecond, int waitSecond) {\n        return lockService.lock(lockBizType, bizKey, lockSecond, waitSecond);\n    }\n\n    @Override\n    public String lock(String lockBizType, String bizKey, boolean throwExceptionOnLock) {\n        return lockService.lock(lockBizType, bizKey, throwExceptionOnLock);\n    }\n\n    @Override\n    public String lock(String lockBizType, String bizKey, int lockSecond, int waitSecond,\n            boolean throwExceptionOnLock) {\n        return lockService.lock(lockBizType, bizKey, lockSecond, waitSecond, throwExceptionOnLock);\n    }\n    \n    \n    @Override\n    public String lockWithKey(String lockKey, int lockSecond, Duration waitDuration, int sleepMills,\n            boolean throwExceptionOnLock) {\n        return lockService.lockWithKey(lockKey, lockSecond, waitDuration, sleepMills , throwExceptionOnLock);\n    }\n    \n    @Override\n    public String lockWithKey(String lockKey, int lockSecond, Duration waitDuration, int sleepMills, String requestId,\n            boolean throwExceptionOnLock) {\n        return lockService.lockWithKey(lockKey, lockSecond, waitDuration, sleepMills, requestId, throwExceptionOnLock);\n    }\n\n    @Override\n    public boolean unlock(String lockBizType, String bizKey, String requestId) {\n        return lockService.unlock(lockBizType, bizKey, requestId);\n    }\n    \n    @Override\n    public boolean unlockWithKey(String lockKey, String requestId) {\n        return lockService.unlockWithKey(lockKey, requestId);\n    }\n\n    @Override\n    public <T> T doInLock(String lockBizType, String bizKey, Supplier<T> repeatableAction) {\n        return lockService.doInLock(lockBizType, bizKey, repeatableAction);\n    }\n\n    @Override\n    public <T> T doInlock(String lockBizType, String bizKey, int lockSecond, int waitSecond,\n            Supplier<T> repeatableAction) {\n        return lockService.doInlock(lockBizType, bizKey, lockSecond, waitSecond, repeatableAction);\n    }\n    \n    @Override\n    public <T> T doInlockWithKey(String lockKey, int lockSecond, Duration waitDuration, int sleepMills,\n            Supplier<T> repeatableAction) {\n        return lockService.doInLockWithKey(lockKey, lockSecond, waitDuration, sleepMills,\n                UUID.randomUUID().toString() + \"|\" + System.currentTimeMillis(), true, repeatableAction);\n    }\n\n    public LockService getLockService() {\n        return lockService;\n    }\n\n    public void setLockService(LockService lockService) {\n        this.lockService = lockService;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/lock/impl/NoopLocker.java",
    "content": "package com.jd.easyflow.lock.impl;\n\nimport java.time.Duration;\nimport java.util.function.Supplier;\n\nimport com.jd.easyflow.lock.Locker;\n\n/**\n * @author liyuliang5\n */\npublic class NoopLocker implements Locker {\n    \n\n    @Override\n    public String lock(String lockBizType, String bizKey) {\n        return null;\n    }\n\n    @Override\n    public String lock(String lockBizType, String bizKey, int lockSecond, int waitSecond) {\n        return null;\n    }\n\n    @Override\n    public String lock(String lockBizType, String bizKey, boolean throwExceptionOnLock) {\n        return null;\n    }\n\n    @Override\n    public String lock(String lockBizType, String bizKey, int lockSecond, int waitSecond,\n            boolean throwExceptionOnLock) {\n        return null;\n    }\n\n    @Override\n    public String lockWithKey(String lockKey, int lockSecond, Duration waitDuration, int sleepMills,\n            boolean throwExceptionOnLock) {\n        return null;\n    }\n\n    @Override\n    public String lockWithKey(String lockKey, int lockSecond, Duration waitDuration, int sleepMills, String requestId,\n            boolean throwExceptionOnLock) {\n        return null;\n    }\n\n    @Override\n    public boolean unlock(String lockBizType, String bizKey, String requestId) {\n        return true;\n    }\n\n    @Override\n    public boolean unlockWithKey(String lockKey, String requestId) {\n        return true;\n    }\n\n    @Override\n    public <T> T doInLock(String lockBizType, String bizKey, Supplier<T> repeatableAction) {\n        return repeatableAction.get();\n    }\n\n    @Override\n    public <T> T doInlock(String lockBizType, String bizKey, int lockSecond, int waitSecond,\n            Supplier<T> repeatableAction) {\n        return repeatableAction.get();\n    }\n\n    @Override\n    public <T> T doInlockWithKey(String lockKey, int lockSecond, Duration waitDuration, int sleepMills,\n            Supplier<T> repeatableAction) {\n        return repeatableAction.get();\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/adapter/export/ProcessDefinitionExportImpl.java",
    "content": "package com.jd.easyflow.process.adapter.export;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\n\nimport com.jd.easyflow.action.Action;\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponse;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponseCode;\nimport com.jd.easyflow.common.adapter.export.dto.pager.PagerCondition;\nimport com.jd.easyflow.common.adapter.export.dto.pager.PagerResult;\nimport com.jd.easyflow.process.adapter.export.converter.PagerConverter;\nimport com.jd.easyflow.process.adapter.export.converter.ProcessDefinitionConverter;\nimport com.jd.easyflow.process.adapter.export.dto.definition.NodeDTO;\nimport com.jd.easyflow.process.adapter.export.dto.definition.ProcessDTO;\nimport com.jd.easyflow.process.adapter.export.dto.definition.ProcessDefinitionDTO;\nimport com.jd.easyflow.process.adapter.export.dto.definition.QueryNodeReq;\nimport com.jd.easyflow.process.adapter.export.dto.definition.QueryProcessDefinitionReq;\nimport com.jd.easyflow.process.domain.model.entity.ProcessDefinitionEntity;\nimport com.jd.easyflow.process.domain.model.vo.ProcessDefinitionForListVO;\nimport com.jd.easyflow.process.domain.service.ProcessDefinitionDomainService;\nimport com.jd.easyflow.common.util.MessageUtil;\n\n/**\n *\n * @author liyuliang5\n */\npublic class ProcessDefinitionExportImpl implements ProcessDefinitionExport {\n    \n    private static final Logger log = LoggerFactory.getLogger(ProcessDefinitionExportImpl.class);\n\n\n    @Autowired\n    private ProcessDefinitionDomainService processDefinitionDomainService;\n\n    /**\n     *\n     * @param req\n     */\n    @Action(code = \"easyflow-process-getLatestProcessDefinition\", name = \"getLatestProcessDefinition\")\n    @Override\n    public ExportResponse<ProcessDefinitionDTO> getLatestProcessDefinition(ExportRequest<String> req) {\n        String definitionId = req.getData();\n        ProcessDefinitionEntity entity = processDefinitionDomainService.getLatestProcessDefinition(definitionId);\n        ProcessDefinitionDTO dto = ProcessDefinitionConverter.INSTANCE.convert(entity);\n        return ExportResponse.build4Success(dto);\n    }\n\n    @Override\n    @Action(code = \"easyflow-process-getVersionedProcessDefinition\", name = \"getVersionedProcessDefinition\")\n    public ExportResponse<ProcessDefinitionDTO> getVersionedProcessDefinition(ExportRequest<String> req) {\n        String definitionId = req.getData();\n        ProcessDefinitionEntity entity = processDefinitionDomainService.getVersionedProcessDefinition(definitionId);\n        ProcessDefinitionDTO dto = ProcessDefinitionConverter.INSTANCE.convert(entity);\n        return ExportResponse.build4Success(dto);\n    }\n\n    /**\n     *\n     * @param req Flow ID(May contains version). format: {FLOW-|FSM-}{Flow ID}--V_{Version}\n     */\n    @Action(code = \"easyflow-process-getProcessDefinition\", name = \"getProcessDefinition\")\n    @Override\n    public ExportResponse<ProcessDefinitionDTO> getProcessDefinition(ExportRequest<String> req) {\n        String definitionId = req.getData();\n        ProcessDefinitionEntity processDefinitionVO = processDefinitionDomainService.getProcessDefinition(definitionId);\n        ProcessDefinitionDTO dto = ProcessDefinitionConverter.INSTANCE.convert(processDefinitionVO);\n        return ExportResponse.build4Success(dto);\n    }\n\n    @Action(code = \"easyflow-process-addProcessDefinition\", name = \"addProcessDefinition\")\n    @Override\n    public ExportResponse addProcessDefinition(ExportRequest<ProcessDefinitionDTO> processDefinitionReq) {\n        ProcessDefinitionDTO definitionDTO = processDefinitionReq.getData();\n        boolean exist = processDefinitionDomainService.existProcessDefinition(definitionDTO.getDefId());\n        if (exist) {\n            return ExportResponse.build4Failed(ExportResponseCode.FAIL.getCode(), MessageUtil.getMessage(\"easyflow.process.server.tip.processDefinitionExists\"));\n        }\n        ProcessDefinitionEntity processDefinitionVO = ProcessDefinitionConverter.INSTANCE.convert(definitionDTO);\n        processDefinitionDomainService.addProcessDefinition(processDefinitionVO);\n        return ExportResponse.build4Success();\n    }\n\n    @Action(code = \"easyflow-process-updateProcessDefinition\", name = \"updateProcessDefinition\")\n    @Override\n    public ExportResponse updateProcessDefinition(ExportRequest<ProcessDefinitionDTO> processDefinitionReq) {\n        ProcessDefinitionDTO definitionDTO = processDefinitionReq.getData();\n        boolean exist = processDefinitionDomainService.existProcessDefinition(definitionDTO.getDefId());\n        if (!exist) {\n            return ExportResponse.build4Failed(ExportResponseCode.DATA_EMPTY.getCode(), MessageUtil.getMessage(\"easyflow.process.server.tip.processDefinitionNotExists\"));\n        }\n        ProcessDefinitionEntity processDefinitionEntity = ProcessDefinitionConverter.INSTANCE.convert(definitionDTO);\n        processDefinitionDomainService.updateProcessDefinition(processDefinitionEntity);\n        return ExportResponse.build4Success();\n    }\n\n\n    @Action(code = \"easyflow-process-pageQueryProcessDefinition\", name = \"pageQueryProcessDefinition\")\n    @Override\n    public ExportResponse<PagerResult<ProcessDefinitionDTO>> pageQueryProcessDefinition(ExportRequest<PagerCondition> pagerQueryReq) {\n        com.jd.easyflow.common.dto.pager.PagerCondition condition = PagerConverter.INSTANCE.convert(pagerQueryReq.getData());\n        com.jd.easyflow.common.dto.pager.PagerResult<ProcessDefinitionForListVO> pagerResult = processDefinitionDomainService.pageQueryProcessDefinition(condition);\n        PagerResult<ProcessDefinitionDTO> result = ProcessDefinitionConverter.INSTANCE.convert(pagerResult);\n        return ExportResponse.build4Success(result);\n    }\n\n\n    @Action(code = \"easyflow-process-queryProcessDefinitionByVersion\", name = \"queryProcessDefinitionByVersion\")\n    @Override\n    public ExportResponse<ProcessDefinitionDTO> queryProcessDefinitionByVersion(\n            ExportRequest<QueryProcessDefinitionReq> req) {\n        QueryProcessDefinitionReq query = req.getData();\n        ExportResponse response;\n        ProcessDefinitionEntity processDefinitionEntity = processDefinitionDomainService.findProcessDefinitionByIdAndVersion(query.getDefId(), query.getDefVersion());\n        return ExportResponse.build4Success(ProcessDefinitionConverter.INSTANCE.convert(processDefinitionEntity));\n    }\n\n\n    @Action(code = \"easyflow-process-getLatestProcessDefVersionByDefId\", name = \"getLatestProcessDefVersionByDefId\")\n    @Override\n    public ExportResponse<Integer> getLatestProcessDefVersionByDefId(ExportRequest<String> request) {\n        String definitionId = request.getData();\n        if (definitionId == null || definitionId.isEmpty()){\n            return ExportResponse.build4Failed(ExportResponseCode.FIELD_EMPTY);\n        }\n        Integer latestDefVersion = processDefinitionDomainService.getLatestProcessDefVersionByDefId(definitionId);\n        if (latestDefVersion != null && latestDefVersion == -1) {\n            ExportResponse response = new ExportResponse<>();\n            response.setResCode(ExportResponseCode.DATA_EMPTY.getCode());\n            response.setResDesc(MessageUtil.getMessage(\"easyflow.process.server.tip.processDefinitionNotExists\"));\n            return response;\n        }\n        return ExportResponse.build4Success(latestDefVersion);\n    }\n\n\n    @Action(code = \"easyflow-process-reportProcessDef\", name = \"reportProcessDef\")\n    @Override\n    public ExportResponse reportProcessDef(ExportRequest<ProcessDefinitionDTO> processDefinitionReq) {\n        ProcessDefinitionDTO processDefDTO = processDefinitionReq.getData();\n        ProcessDefinitionEntity processDefinitionEntity = ProcessDefinitionConverter.INSTANCE.convert(processDefDTO);\n        try {\n            processDefinitionDomainService.reportProcessDef(processDefinitionEntity);\n            return ExportResponse.build4Success();\n        }catch (Exception e){\n            log.error(\"Process definition report error,\" + processDefDTO.getDefId() + \",\" + e.getMessage(), e);\n        }\n        return ExportResponse.build4Failed(ExportResponseCode.FAIL);\n    }\n\n\n    @Action(code = \"easyflow-process-forceUpdateCurrentVersionProcessDef\", name = \"forceUpdateCurrentVersionProcessDef\")\n    @Override\n    public ExportResponse forceUpdateCurrentVersionProcessDef(ExportRequest<ProcessDefinitionDTO> processDefinitionReq) {\n        ProcessDefinitionDTO definitionDTO = processDefinitionReq.getData();\n        boolean exist = processDefinitionDomainService.existProcessDefinition(definitionDTO.getDefId());\n        if (!exist) {\n            return ExportResponse.build4Failed(ExportResponseCode.DATA_EMPTY.getCode(), MessageUtil.getMessage(\"easyflow.process.server.tip.processDefinitionNotExists\"));\n        }\n        ProcessDefinitionEntity processDefinitionEntity = ProcessDefinitionConverter.INSTANCE.convert(definitionDTO);\n        processDefinitionDomainService.forceUpdateProcessDefinition(processDefinitionEntity);\n        return ExportResponse.build4Success();\n    }\n\n    @Action(code = \"easyflow-process-getProcessProperties\", name = \"getProcessProperties\")\n    @Override\n    public ExportResponse<ProcessDTO> getProcessProperties(ExportRequest<String> request) {\n        ProcessDTO processDto = processDefinitionDomainService.getProcessProperties(request.getData());\n        return ExportResponse.build4Success(processDto);\n    }\n\n    @Action(code = \"easyflow-process-getNodeProperties\", name = \"getNodeProperties\")\n    @Override\n    public ExportResponse<NodeDTO> getNodeProperties(ExportRequest<QueryNodeReq> request) {\n        NodeDTO nodeDto = processDefinitionDomainService.getNodeProperties(request.getData());\n        return ExportResponse.build4Success(nodeDto);\n    }\n\n    @Action(code = \"easyflow-process-getProcessAndNodeProperties\", name = \"getProcessAndNodeProperties\")\n    @Override\n    public ExportResponse<ProcessDTO> getProcessAndNodeProperties(ExportRequest<String> request) {\n        ProcessDTO processDto = processDefinitionDomainService.getProcessAndNodeProperties(request.getData());\n        return ExportResponse.build4Success(processDto);\n    }\n\n    public ProcessDefinitionDomainService getProcessDefinitionDomainService() {\n        return processDefinitionDomainService;\n    }\n\n    public void setProcessDefinitionDomainService(ProcessDefinitionDomainService processDefinitionDomainService) {\n        this.processDefinitionDomainService = processDefinitionDomainService;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/adapter/export/ProcessInstanceExportImpl.java",
    "content": "package com.jd.easyflow.process.adapter.export;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.transaction.support.TransactionTemplate;\n\nimport com.jd.easyflow.action.Action;\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponse;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponseCode;\nimport com.jd.easyflow.common.adapter.export.dto.pager.PagerCondition;\nimport com.jd.easyflow.common.adapter.export.dto.pager.PagerResult;\nimport com.jd.easyflow.common.util.AssertUtils;\nimport com.jd.easyflow.process.adapter.export.converter.PagerConverter;\nimport com.jd.easyflow.process.adapter.export.converter.ProcessInstanceConverter;\nimport com.jd.easyflow.process.adapter.export.dto.instance.CanCancelProcessInstanceReq;\nimport com.jd.easyflow.process.adapter.export.dto.instance.CanCancelProcessInstanceRes;\nimport com.jd.easyflow.process.adapter.export.dto.instance.CancelProcessInstanceReq;\nimport com.jd.easyflow.process.adapter.export.dto.instance.CancelProcessInstanceRes;\nimport com.jd.easyflow.process.adapter.export.dto.instance.CreateProcessInstanceReq;\nimport com.jd.easyflow.process.adapter.export.dto.instance.CreateProcessInstanceRes;\nimport com.jd.easyflow.process.adapter.export.dto.instance.LockProcessInstanceReq;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessInstanceDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessNodeExecutionDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessNodeInstanceDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.QueryOpenNodeInstanceReq;\nimport com.jd.easyflow.process.adapter.export.dto.instance.QueryProcessInstanceReq;\nimport com.jd.easyflow.process.adapter.export.dto.instance.QueryProcessNodeReqDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.UnlockProcessInstanceReq;\nimport com.jd.easyflow.process.adapter.export.dto.instance.RollbackNodeReq;\nimport com.jd.easyflow.process.adapter.export.dto.instance.RollbackNodeRes;\nimport com.jd.easyflow.process.domain.model.entity.ProcessInstanceEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessNodeExecutionEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessNodeInstanceEntity;\nimport com.jd.easyflow.process.domain.model.vo.CreateProcessInstanceReqVO;\nimport com.jd.easyflow.process.domain.model.vo.CreateProcessInstanceResVO;\nimport com.jd.easyflow.process.domain.model.vo.QueryProcessNodeReq;\nimport com.jd.easyflow.process.domain.repository.ProcessRepository;\nimport com.jd.easyflow.process.domain.service.ProcessInstanceDomainService;\n\n/**\n * @author liyuliang5\n */\npublic class ProcessInstanceExportImpl implements ProcessInstanceExport {\n    \n    private static final Logger log = LoggerFactory.getLogger(ProcessInstanceExportImpl.class);\n\n\n    @Autowired\n    private ProcessInstanceDomainService processInstanceDomainService;\n\n    @Autowired\n    private ProcessRepository processRepository;\n\n    @Action(code = \"easyflow-process-createProcessInstance\", name = \"createProcessInstance\")\n    public ExportResponse<CreateProcessInstanceRes> createProcessInstance(ExportRequest<CreateProcessInstanceReq> req) {\n        log.info(\"Start create process instance , req:{}\", req);\n        CreateProcessInstanceReqVO vo = ProcessInstanceConverter.INSTANCE.convert(req.getData());\n        CreateProcessInstanceResVO resVo = processInstanceDomainService.createProcessInstance(vo);\n        log.info(\"End create process instance\");\n        CreateProcessInstanceRes res = new CreateProcessInstanceRes();\n        res.setProcessInstanceNo(resVo.getProcessInstanceNo());\n        return ExportResponse.build4Success(res);\n    }\n\n\n    @Action(code = \"easyflow-process-getProcessInstance\", name = \"getProcessInstance\")\n    @Override\n    public ExportResponse<ProcessInstanceDTO> getProcessInstance(ExportRequest<String> req) {\n        ProcessInstanceEntity entity = getTransactionTemplate().execute(status -> {\n            return processInstanceDomainService.queryProcessInstance(req.getData());\n        });\n        ProcessInstanceDTO dto = ProcessInstanceConverter.INSTANCE.convert(entity);\n        return ExportResponse.build4Success(dto);\n    }\n\n    @Action(code = \"easyflow-process-pagerQueryProcessInstance\", name = \"pagerQueryProcessInstance\")\n    @Override\n    public ExportResponse<PagerResult> pagerQueryProcessInstance(ExportRequest<PagerCondition> req) {\n        com.jd.easyflow.common.dto.pager.PagerCondition condition = PagerConverter.INSTANCE.convert(req.getData());\n        com.jd.easyflow.common.dto.pager.PagerResult result = getTransactionTemplate().execute(status -> {\n            return processInstanceDomainService.pageQueryProcessInstance(condition);\n        });\n        PagerResult exportResult = new PagerResult<>();\n        exportResult.setCount(result.getCount());\n        exportResult.setList(ProcessInstanceConverter.INSTANCE.convert(result.getList()));\n        return ExportResponse.build4Success(exportResult);\n    }\n\n    @Action(code = \"easyflow-process-queryProcessNodeInstanceByInstanceNo\", name = \"queryProcessNodeInstanceByInstanceNo\")\n    @Override\n    public ExportResponse<List<ProcessNodeInstanceDTO>> queryProcessNodeInstanceByInstanceNo(\n            ExportRequest<String> req) {\n        ExportResponse response;\n        String instanceNo = req.getData();\n        if (instanceNo == null || instanceNo.isEmpty()) {\n            response = ExportResponse.build4Failed(ExportResponseCode.INVALID);\n            return response;\n        }\n        List<ProcessNodeInstanceEntity> processNodeInstanceList = getTransactionTemplate().execute(status -> {\n            return processInstanceDomainService.queryProcessInstanceNode(instanceNo);\n        });\n        return ExportResponse.build4Success(ProcessInstanceConverter.INSTANCE.convertDTOList(processNodeInstanceList));\n    }\n\n    @Action(code = \"easyflow-process-queryProcessInstanceByProcessTypeAndBizNo\", name = \"queryProcessInstanceByProcessTypeAndBizNo\")\n    @Override\n    public ExportResponse<ProcessInstanceDTO> queryProcessInstanceByProcessTypeAndBizNo(\n            ExportRequest<QueryProcessInstanceReq> req) {\n        QueryProcessInstanceReq query = req.getData();\n        String processType = query.getProcessType();\n        String bizNo = query.getBizNo();\n        ExportResponse response;\n        if (processType == null || bizNo == null) {\n            response = ExportResponse.build4Failed(ExportResponseCode.INVALID);\n            return response;\n        }\n        ProcessInstanceEntity processInstance = getTransactionTemplate().execute(status -> {\n            return processRepository.getProcessInstanceByProcessTypeAndBizNo(processType, bizNo);\n        });\n        if (processInstance == null) {\n            return ExportResponse.build4Success(null);\n        }\n        return ExportResponse.build4Success(ProcessInstanceConverter.INSTANCE.convert(processInstance));\n    }\n\n    @Action(code = \"easyflow-process-lockProcessInstance\", name = \"lockProcessInstance\")\n    @Override\n    public ExportResponse<String> lockProcessInstance(ExportRequest<LockProcessInstanceReq> req) {\n        String requestId = processInstanceDomainService.lockProcessInstance(req.getData().getProcessType(),\n                req.getData().getBizNo());\n        return ExportResponse.build4Success(requestId);\n    }\n\n    @Action(code = \"easyflow-process-unLockProcessInstance\", name = \"unLockProcessInstance\")\n    @Override\n    public ExportResponse<Boolean> unLockProcessInstance(ExportRequest<UnlockProcessInstanceReq> req) {\n        Boolean result = processInstanceDomainService.unLockProcessInstance(req.getData().getProcessType(),\n                req.getData().getBizNo(), req.getData().getLockRequestId());\n        return ExportResponse.build4Success(result);\n    }\n\n    @Action(code = \"easyflow-process-queryOpenNodeInstance\", name = \"queryOpenNodeInstance\")\n    @Override\n    public ExportResponse<ProcessNodeInstanceDTO> queryOpenNodeInstance(\n            ExportRequest<QueryOpenNodeInstanceReq> request) {\n        QueryOpenNodeInstanceReq queryReq = request.getData();\n        if (queryReq.getInstanceNo() == null || queryReq.getNodeId() == null) {\n            return ExportResponse.build4Failed(ExportResponseCode.FIELD_EMPTY);\n        }\n        ProcessNodeInstanceEntity nodeInstance = getTransactionTemplate().execute(status -> {\n            return processRepository.getOpenNodeInstance(queryReq.getInstanceNo(), queryReq.getNodeId());\n        });\n        ProcessNodeInstanceDTO nodeInstanceDTO = ProcessInstanceConverter.INSTANCE.convert(nodeInstance);\n        return ExportResponse.build4Success(nodeInstanceDTO);\n    }\n\n    @Action(code = \"easyflow-process-findNodeInstances\", name = \"findNodeInstances\")\n    @Override\n    public ExportResponse<List<ProcessNodeInstanceDTO>> findNodeInstances(\n            ExportRequest<QueryProcessNodeReqDTO> queryReq) {\n        QueryProcessNodeReqDTO reqDTO = queryReq.getData();\n        if (reqDTO.getProcessInstanceNo() == null) {\n            return ExportResponse.build4Failed(ExportResponseCode.FIELD_EMPTY);\n        }\n        QueryProcessNodeReq queryProcessNodeReq = ProcessInstanceConverter.INSTANCE.convert(reqDTO);\n        List<ProcessNodeInstanceEntity> nodeInstances = getTransactionTemplate().execute(status -> {\n            return processRepository.findNodeInstances(queryProcessNodeReq);\n        });\n        List<ProcessNodeInstanceDTO> instanceDTOList = ProcessInstanceConverter.INSTANCE.convertDTOList(nodeInstances);\n        return ExportResponse.build4Success(instanceDTOList);\n    }\n\n    @Action(code = \"easyflow-process-queryNodeInstanceByNo\", name = \"queryNodeInstanceByNo\")\n    @Override\n    public ExportResponse<ProcessNodeInstanceDTO> queryNodeInstanceByNo(ExportRequest<String> request) {\n        if (request.getData() == null || request.getData().isEmpty()) {\n            return ExportResponse.build4Failed(ExportResponseCode.FIELD_EMPTY);\n        }\n        ProcessNodeInstanceEntity nodeInstanceEntity = getTransactionTemplate().execute(status -> {\n            return processRepository.getByNodeInstanceNo(request.getData());\n        });\n        ProcessNodeInstanceDTO nodeInstanceDTO = ProcessInstanceConverter.INSTANCE.convert(nodeInstanceEntity);\n        return ExportResponse.build4Success(nodeInstanceDTO);\n    }\n\n    @Action(code = \"easyflow-process-queryNodeExecutionByNo\", name = \"queryNodeExecutionByNo\")\n    @Override\n    public ExportResponse<ProcessNodeExecutionDTO> queryNodeExecutionByNo(ExportRequest<String> request) {\n        if (request.getData() == null || request.getData().isEmpty()) {\n            return ExportResponse.build4Failed(ExportResponseCode.FIELD_EMPTY);\n        }\n        ProcessNodeExecutionEntity executionEntity = getTransactionTemplate().execute(status -> {\n            return processRepository.getByNodeExecutionNo(request.getData());\n        });\n        ProcessNodeExecutionDTO executionDTO = ProcessInstanceConverter.INSTANCE.convert(executionEntity);\n        return ExportResponse.build4Success(executionDTO);\n    }\n\n    @Action(code = \"easyflow-process-updateProcessInstance\", name = \"updateProcessInstance\")\n    @Override\n    public ExportResponse<Object> updateProcessInstance(ExportRequest<ProcessInstanceDTO> request) {\n        ProcessInstanceEntity entity = ProcessInstanceConverter.INSTANCE.convert(request.getData());\n        getTransactionTemplate().executeWithoutResult(status -> {\n            processInstanceDomainService.updateProcessInstanceExtData(entity);\n        });\n        return ExportResponse.build4Success();\n    }\n\n    @Action(code = \"easyflow-process-queryActiveProcessInstanceByProcessTypeAndBizNo\", name = \"queryActiveProcessInstanceByProcessTypeAndBizNo\")\n    @Override\n    public ExportResponse<ProcessInstanceDTO> queryActiveProcessInstanceByProcessTypeAndBizNo(\n            ExportRequest<QueryProcessInstanceReq> req) {\n        QueryProcessInstanceReq query = req.getData();\n        String processType = query.getProcessType();\n        String bizNo = query.getBizNo();\n        ExportResponse response;\n        if (processType == null || bizNo == null) {\n            response = ExportResponse.build4Failed(ExportResponseCode.INVALID);\n            return response;\n        }\n        ProcessInstanceEntity processInstance = getTransactionTemplate().execute(status ->{\n            return processRepository.getActiveProcessInstanceByProcessTypeAndBizNo(processType, bizNo);\n        });\n        if (processInstance == null) {\n            return ExportResponse.build4Success(null);\n        }\n        return ExportResponse.build4Success(ProcessInstanceConverter.INSTANCE.convert(processInstance));\n    }\n\n    @Action(code = \"easyflow-process-canCancel\", name = \"canCancel\")\n    @Override\n    public ExportResponse<CanCancelProcessInstanceRes> canCancel(ExportRequest<CanCancelProcessInstanceReq> request) {\n        CanCancelProcessInstanceReq canCancelProcessInstanceReq = request.getData();\n        if (canCancelProcessInstanceReq.getInstanceNo() == null || canCancelProcessInstanceReq.getCancelUser() == null) {\n            return ExportResponse.build4Failed(ExportResponseCode.FIELD_EMPTY);\n        }\n        CanCancelProcessInstanceRes canCancelProcessInstanceRes = getTransactionTemplate().execute(status -> {\n            return processInstanceDomainService.canCancel(canCancelProcessInstanceReq);\n        });\n        return ExportResponse.build4Success(canCancelProcessInstanceRes);\n    }\n\n    @Action(code = \"easyflow-process-cancel\", name = \"cancel\")\n    @Override\n    public ExportResponse<CancelProcessInstanceRes> cancel(ExportRequest<CancelProcessInstanceReq> request) {\n        CancelProcessInstanceReq cancelProcessInstanceReq = request.getData();\n        if (cancelProcessInstanceReq.getInstanceNo() == null ||  cancelProcessInstanceReq.getCancelUser() == null) {\n            return ExportResponse.build4Failed(ExportResponseCode.FIELD_EMPTY);\n        }\n        processInstanceDomainService.cancel(cancelProcessInstanceReq);\n        return ExportResponse.build4Success(new CancelProcessInstanceRes());\n    }\n\n    @Override\n    @Action(code = \"easyflow-process-queryInstanceByInstanceNos\", name = \"queryInstanceByInstanceNos\")\n    public ExportResponse<List<ProcessInstanceDTO>> queryInstanceByInstanceNos(ExportRequest<List<String>> request) {\n        List<String> instanceNos = request.getData();\n        if (instanceNos == null || instanceNos.isEmpty()) {\n            return ExportResponse.build4Failed(ExportResponseCode.FIELD_EMPTY);\n        }\n        List<ProcessInstanceDTO> processInstanceDTOS = getTransactionTemplate().execute(status -> {\n            List<ProcessInstanceEntity> processInstances = processRepository.queryProcessInstanceByInstanceNos(instanceNos);\n            return ProcessInstanceConverter.INSTANCE.convert(processInstances);\n        });\n        return ExportResponse.build4Success(processInstanceDTOS);\n    }\n\n    @Action(code = \"easyflow-process-queryNodeInstanceByNos\", name = \"queryNodeInstanceByNos\")\n    @Override\n    public ExportResponse<List<ProcessNodeInstanceDTO>> queryNodeInstanceByNos(ExportRequest<List<String>> request) {\n        if (request.getData() == null) {\n            return ExportResponse.build4Success(new ArrayList<>());\n        }\n        List<ProcessNodeInstanceEntity> nodeInstanceEntityList = getTransactionTemplate().execute(status -> {\n            return processRepository.queryNodeInstanceByNos(request.getData());\n        });\n        List<ProcessNodeInstanceDTO> nodeInstanceDTO = ProcessInstanceConverter.INSTANCE.convertNodeInstanceList(nodeInstanceEntityList);\n        return ExportResponse.build4Success(nodeInstanceDTO);\n    }\n    \n    @Action(code = \"easyflow-process-queryProcessInstanceByParentInstanceNo\", name = \"queryProcessInstanceByParentInstanceNo\")\n    @Override\n    public ExportResponse<List<ProcessInstanceDTO>> queryProcessInstanceByParentInstanceNo(ExportRequest<String> request) {\n        if (request.getData() == null) {\n            return ExportResponse.build4Failed(ExportResponseCode.FIELD_EMPTY.getCode(), \" parent instance no cannot be null\");\n        }\n        List<ProcessInstanceDTO> processInstances = getTransactionTemplate().execute(status -> {\n            List<ProcessInstanceEntity> instances =  processRepository.queryProcessInstanceByParentInstanceNo(request.getData());\n            return ProcessInstanceConverter.INSTANCE.convert(instances);\n        });\n        return ExportResponse.build4Success(processInstances);\n    }\n    \n    @Action(code = \"easyflow-process-pagerQueryNodeExecution\", name = \"pagerQueryNodeExecution\")\n    @Override\n    public ExportResponse<PagerResult> pagerQueryNodeExecution(ExportRequest<PagerCondition> req) {\n        if (req.getData() == null) {\n            return ExportResponse.build4Failed(ExportResponseCode.FIELD_EMPTY.getCode(), \" pager condition cannot be null\");\n        }\n        com.jd.easyflow.common.dto.pager.PagerCondition condition = PagerConverter.INSTANCE.convert(req.getData());\n        com.jd.easyflow.common.dto.pager.PagerResult result = getTransactionTemplate().execute(status -> {\n            return processInstanceDomainService.pagerQueryNodeExecution(condition);\n        });\n        PagerResult exportResult = new PagerResult<>();\n        exportResult.setCount(result.getCount());\n        exportResult.setList(ProcessInstanceConverter.INSTANCE.convertNodeExecutionList(result.getList()));\n        return ExportResponse.build4Success(exportResult);\n    }\n    \n\n    private TransactionTemplate getTransactionTemplate() {\n        return processInstanceDomainService.getTransactionTemplate();\n    }\n\n    public ProcessInstanceDomainService getProcessInstanceDomainService() {\n        return processInstanceDomainService;\n    }\n\n    public void setProcessInstanceDomainService(ProcessInstanceDomainService processInstanceDomainService) {\n        this.processInstanceDomainService = processInstanceDomainService;\n    }\n\n    public ProcessRepository getProcessRepository() {\n        return processRepository;\n    }\n\n    public void setProcessRepository(ProcessRepository processRepository) {\n        this.processRepository = processRepository;\n    }\n\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/adapter/export/ProcessScheduleExportImpl.java",
    "content": "package com.jd.easyflow.process.adapter.export;\n\nimport org.springframework.beans.factory.annotation.Autowired;\n\nimport com.jd.easyflow.action.Action;\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponse;\nimport com.jd.easyflow.process.adapter.export.converter.ProcessScheduleConverter;\nimport com.jd.easyflow.process.adapter.export.dto.schedule.ScheduleProcessReq;\nimport com.jd.easyflow.process.adapter.export.dto.schedule.ScheduleProcessRes;\nimport com.jd.easyflow.process.domain.model.vo.ScheduleProcessReqVO;\nimport com.jd.easyflow.process.domain.model.vo.ScheduleProcessResVO;\nimport com.jd.easyflow.process.domain.service.ProcessScheduleDomainService;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ProcessScheduleExportImpl implements ProcessScheduleExport {\n    \n    @Autowired\n    private ProcessScheduleDomainService processScheduleDomainService;\n\n    @Action(code = \"easyflow-process-schedule\", name = \"schedule\")\n    @Override\n    public ExportResponse<ScheduleProcessRes> schedule(ExportRequest<ScheduleProcessReq> req) {\n        ScheduleProcessReqVO reqVo = ProcessScheduleConverter.INSTANCE.convert(req.getData());\n        ScheduleProcessResVO resVo = processScheduleDomainService.schedule(reqVo);\n        ScheduleProcessRes res = ProcessScheduleConverter.INSTANCE.convert(resVo);\n        return ExportResponse.build4Success(res);\n    }\n\n    public ProcessScheduleDomainService getProcessScheduleDomainService() {\n        return processScheduleDomainService;\n    }\n\n    public void setProcessScheduleDomainService(ProcessScheduleDomainService processScheduleDomainService) {\n        this.processScheduleDomainService = processScheduleDomainService;\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/adapter/export/ProcessTaskExportImpl.java",
    "content": "package com.jd.easyflow.process.adapter.export;\n\nimport java.util.List;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.transaction.support.TransactionTemplate;\n\nimport com.jd.easyflow.action.Action;\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponse;\nimport com.jd.easyflow.common.adapter.export.dto.pager.PagerCondition;\nimport com.jd.easyflow.common.adapter.export.dto.pager.PagerResult;\nimport com.jd.easyflow.process.adapter.export.converter.PagerConverter;\nimport com.jd.easyflow.process.adapter.export.converter.ProcessTaskConverter;\nimport com.jd.easyflow.process.adapter.export.dto.task.CanWithdrawTaskReq;\nimport com.jd.easyflow.process.adapter.export.dto.task.CanWithdrawTaskRes;\nimport com.jd.easyflow.process.adapter.export.dto.task.ExecuteTaskReq;\nimport com.jd.easyflow.process.adapter.export.dto.task.ExecuteTaskRes;\nimport com.jd.easyflow.process.adapter.export.dto.task.ProcessTaskAssignDTO;\nimport com.jd.easyflow.process.adapter.export.dto.task.ProcessTaskDTO;\nimport com.jd.easyflow.process.adapter.export.dto.task.QueryTaskReq;\nimport com.jd.easyflow.process.adapter.export.dto.task.TaskOperationsReq;\nimport com.jd.easyflow.process.adapter.export.dto.task.TaskOperationsRes;\nimport com.jd.easyflow.process.adapter.export.dto.task.WithdrawTaskReq;\nimport com.jd.easyflow.process.adapter.export.dto.task.WithdrawTaskRes;\nimport com.jd.easyflow.process.domain.model.entity.ProcessTaskAssignEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessTaskEntity;\nimport com.jd.easyflow.process.domain.model.vo.ExecuteProcessTaskReqVO;\nimport com.jd.easyflow.process.domain.model.vo.QueryTaskReqVO;\nimport com.jd.easyflow.process.domain.repository.ProcessTaskRepository;\nimport com.jd.easyflow.process.domain.service.ProcessTaskDomainService;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ProcessTaskExportImpl implements ProcessTaskExport {\n\n    @Autowired\n    private ProcessTaskDomainService processTaskDomainService;\n    @Autowired\n    private ProcessTaskRepository processTaskRepository;\n\n    @Action(code = \"easyflow-process-executeTask\", name = \"executeTask\")\n    @Override\n    public ExportResponse<ExecuteTaskRes> executeTask(ExportRequest<ExecuteTaskReq> req) {\n        ExecuteProcessTaskReqVO vo = ProcessTaskConverter.INSTANCE.convert(req.getData());\n        processTaskDomainService.executeTask(vo);\n        ExecuteTaskRes res = new ExecuteTaskRes();\n        return ExportResponse.build4Success(res);\n    }\n\n    @Action(code = \"easyflow-process-pagerQueryTask\", name = \"pagerQueryTask\")\n    @Override\n    public ExportResponse<PagerResult> pagerQueryTask(ExportRequest<PagerCondition> req) {\n        com.jd.easyflow.common.dto.pager.PagerCondition condition = PagerConverter.INSTANCE.convert(req.getData());\n        com.jd.easyflow.common.dto.pager.PagerResult result = getTransactionTemplate().execute(status -> {\n            return processTaskDomainService.pagerQueryTask(condition);\n        });\n\n        return ExportResponse.build4Success(PagerConverter.INSTANCE.convert(result));\n    }\n\n    @Action(code = \"easyflow-process-getTask\", name = \"getTask\")\n    @Override\n    public ExportResponse<ProcessTaskDTO> getTask(ExportRequest<String> req) {\n        ProcessTaskDTO processTask = getTransactionTemplate().execute(status -> {\n            return processTaskDomainService.getTask(req.getData());\n        });\n        return ExportResponse.build4Success(processTask);\n    }\n\n    @Action(code = \"easyflow-process-queryTask\", name = \"queryTask\")\n    @Override\n    public ExportResponse<List<ProcessTaskDTO>> queryTask(ExportRequest<QueryTaskReq> req) {\n        QueryTaskReqVO query = ProcessTaskConverter.INSTANCE.convert(req.getData());\n        List<ProcessTaskEntity> list = getTransactionTemplate().execute(status -> {\n            return processTaskDomainService.queryTask(query);\n        });\n        return ExportResponse.build4Success(ProcessTaskConverter.INSTANCE.convertEntityList(list));\n    }\n\n    @Action(code = \"easyflow-process-canWithdraw\", name = \"canWithdraw\")\n    @Override\n    public ExportResponse<CanWithdrawTaskRes> canWithdraw(ExportRequest<CanWithdrawTaskReq> req) {\n        CanWithdrawTaskRes res = getTransactionTemplate().execute(status -> {\n            return processTaskDomainService.canWithdrawTask(req.getData().getTaskNo(), req.getData().getUser());\n        });\n        return ExportResponse.build4Success(res);\n    }\n\n    @Action(code = \"easyflow-process-withDraw\", name = \"withDraw\")\n    @Override\n    public ExportResponse<WithdrawTaskRes> withDraw(ExportRequest<WithdrawTaskReq> req) {\n        processTaskDomainService.withdrawTask(req.getData().getTaskNo(), req.getData().getUser(),\n                req.getData().getWithdrawInstancePolicy(), req.getData().getInstanceBizStatus(),\n                req.getData().getInstanceBizData());\n        return ExportResponse.build4Success(new WithdrawTaskRes());\n    }\n\n    @Action(code = \"easyflow-process-doExecuteOperations\", name = \"doExecuteOperations\")\n    @Override\n    public ExportResponse<TaskOperationsRes> doExecuteOperations(ExportRequest<TaskOperationsReq> req) {\n        throw new UnsupportedOperationException();\n    }\n\n    @Action(code = \"easyflow-process-findTaskAssignListByTaskNo\", name = \"findTaskAssignListByTaskNo\")\n    @Override\n    public ExportResponse<List<ProcessTaskAssignDTO>> findTaskAssignListByTaskNo(ExportRequest<String> req) {\n        List<ProcessTaskAssignEntity> assignList = getTransactionTemplate().execute(status -> {\n            return processTaskRepository.findTaskAssignListByTaskNo(req.getData());\n        });\n        return ExportResponse.build4Success(ProcessTaskConverter.INSTANCE.convertAssignList(assignList));\n    }\n    \n    private TransactionTemplate getTransactionTemplate() {\n        return processTaskDomainService.getTransactionTemplate();\n    }\n\n    public ProcessTaskDomainService getProcessTaskDomainService() {\n        return processTaskDomainService;\n    }\n\n    public void setProcessTaskDomainService(ProcessTaskDomainService processTaskDomainService) {\n        this.processTaskDomainService = processTaskDomainService;\n    }\n\n    public ProcessTaskRepository getProcessTaskRepository() {\n        return processTaskRepository;\n    }\n\n    public void setProcessTaskRepository(ProcessTaskRepository processTaskRepository) {\n        this.processTaskRepository = processTaskRepository;\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/adapter/export/ProcessToolExportImpl.java",
    "content": "package com.jd.easyflow.process.adapter.export;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.transaction.support.TransactionTemplate;\n\nimport com.jd.easyflow.action.Action;\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponse;\nimport com.jd.easyflow.common.util.AssertUtils;\nimport com.jd.easyflow.process.adapter.export.converter.ProcessInstanceConverter;\nimport com.jd.easyflow.process.adapter.export.converter.ProcessToolConverter;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessInstanceDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessNodeInstanceDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.RollbackNodeReq;\nimport com.jd.easyflow.process.adapter.export.dto.instance.RollbackNodeRes;\nimport com.jd.easyflow.process.domain.model.entity.ProcessInstanceEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessNodeInstanceEntity;\nimport com.jd.easyflow.process.domain.repository.ProcessRepository;\nimport com.jd.easyflow.process.domain.service.ProcessToolDomainService;\n\n/**\n * @author liyuliang5\n */\npublic class ProcessToolExportImpl implements ProcessToolExport {\n    \n    @Autowired\n    private ProcessRepository processRepository;\n    @Autowired\n    private ProcessToolDomainService processToolDomainService;\n    \n    @Action(code = \"easyflow-process-rollbackNode\", name = \"rollbackNode\")\n    @Override\n    public ExportResponse<RollbackNodeRes> rollbackNode(ExportRequest<RollbackNodeReq> request) {\n        AssertUtils.isNotNull(request);\n        AssertUtils.isNotNull(request.getData());\n        AssertUtils.isNotNull(request.getData().getProcessInstanceNo());\n        processToolDomainService.rollbackNode(ProcessToolConverter.INSTANCE.convert(request.getData()));\n        return ExportResponse.build4Success(new RollbackNodeRes());\n    }\n    \n    @Action(code = \"easyflow-process-updateProcessInstance\", name = \"updateProcessInstance\")\n    @Override\n    public ExportResponse updateProcessInstance(ExportRequest<ProcessInstanceDTO> request) {\n        ProcessInstanceEntity entity = ProcessInstanceConverter.INSTANCE.convert(request.getData());\n        getTransactionTemplate().executeWithoutResult(status -> {\n            processRepository.updateProcessInstanceByNo(entity);\n        });\n        return ExportResponse.build4Success();\n    }\n\n\n    @Action(code = \"easyflow-process-updateProcessNodeInstance\", name = \"updateProcessNodeInstance\")\n    @Override\n    public ExportResponse updateProcessNodeInstance(ExportRequest<ProcessNodeInstanceDTO> request) {\n        ProcessNodeInstanceEntity entity = ProcessInstanceConverter.INSTANCE.convert(request.getData());\n        getTransactionTemplate().executeWithoutResult(status -> {\n            processRepository.updateProcessNodeInstanceByNo(entity);\n        });\n        return ExportResponse.build4Success();\n    }\n\n    @Action(code = \"easyflow-process-deleteProcessNodeInstance\", name = \"deleteProcessNodeInstance\")\n    @Override\n    public ExportResponse deleteProcessNodeInstance(ExportRequest<String> request) {\n        AssertUtils.isNotNull(request);\n        AssertUtils.isNotNull(request.getData());\n        getTransactionTemplate().executeWithoutResult(status -> {\n            processRepository.deleteProcessNodeInstanceByNo(request.getData());\n        });\n        return ExportResponse.build4Success();\n    }\n    \n    private TransactionTemplate getTransactionTemplate() {\n        return processToolDomainService.getTransactionTemplate();\n    }\n\n    public ProcessRepository getProcessRepository() {\n        return processRepository;\n    }\n\n    public void setProcessRepository(ProcessRepository processRepository) {\n        this.processRepository = processRepository;\n    }\n\n    public ProcessToolDomainService getProcessToolDomainService() {\n        return processToolDomainService;\n    }\n\n    public void setProcessToolDomainService(ProcessToolDomainService processToolDomainService) {\n        this.processToolDomainService = processToolDomainService;\n    }\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/adapter/export/ProcessTransactionExportImpl.java",
    "content": "package com.jd.easyflow.process.adapter.export;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.UUID;\nimport java.util.concurrent.ThreadPoolExecutor;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.context.ApplicationEvent;\nimport org.springframework.context.event.ContextClosedEvent;\nimport org.springframework.context.event.SmartApplicationListener;\nimport org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;\nimport org.springframework.transaction.support.TransactionTemplate;\n\nimport com.jd.easyflow.action.Action;\nimport com.jd.easyflow.alert.AlertUtil;\nimport com.jd.easyflow.codegenerator.client.CodeGenerateHelper;\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponse;\nimport com.jd.easyflow.message.MessageSendService;\nimport com.jd.easyflow.process.adapter.export.constant.ProcessTransactionConstants;\nimport com.jd.easyflow.process.adapter.export.dto.instance.PersistDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessInstanceDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessNodeExecutionDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessNodeInstanceDTO;\nimport com.jd.easyflow.process.adapter.export.dto.task.ProcessTaskAssignDTO;\nimport com.jd.easyflow.process.adapter.export.dto.task.ProcessTaskDTO;\nimport com.jd.easyflow.process.adapter.export.dto.task.ProcessTaskEventDTO;\nimport com.jd.easyflow.process.adapter.export.dto.transaction.BatchObjectIdReq;\nimport com.jd.easyflow.process.adapter.export.dto.transaction.BatchObjectIdRes;\nimport com.jd.easyflow.process.adapter.export.dto.transaction.TxnCommand;\nimport com.jd.easyflow.process.adapter.export.dto.transaction.TxnCommandResult;\nimport com.jd.easyflow.process.adapter.export.dto.transaction.TxnReq;\nimport com.jd.easyflow.process.adapter.export.dto.transaction.TxnRes;\nimport com.jd.easyflow.process.adapter.export.dto.transaction.command.BatchUpdateTxnCommand;\nimport com.jd.easyflow.process.adapter.export.dto.transaction.command.InterruptTxnCommand;\nimport com.jd.easyflow.process.domain.constant.ProcessConstants;\nimport com.jd.easyflow.process.domain.service.ProcessInstanceDomainService;\nimport com.jd.easyflow.process.domain.service.ProcessTaskDomainService;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ProcessTransactionExportImpl implements ProcessTransactionExport, SmartApplicationListener {\n    \n    private static final Logger log = LoggerFactory.getLogger(ProcessTransactionExportImpl.class);\n\n\n    protected TransactionTemplate transactionTemplate;\n\n    protected MessageSendService messageSendService;\n    @Autowired\n    private ProcessInstanceDomainService processInstanceDomainService;\n    @Autowired\n    private ProcessTaskDomainService processTaskDomainService;\n\n    protected ThreadPoolTaskExecutor executor;\n\n    private Boolean isSelfInitial;\n\n\n    @Action(code = \"easyflow-process-nextObjectId\", name = \"nextObjectId\")\n    @Override\n    public ExportResponse<String> nextObjectId(ExportRequest<String> request) {\n        String type = request.getData();\n        String objectId = nextObjectId(type);\n        return ExportResponse.build4Success(objectId);\n    }\n\n    @Action(code = \"easyflow-process-batchNextObjectId\", name = \"batchNextObjectId\")\n    @Override\n    public ExportResponse<BatchObjectIdRes> batchNextObjectId(ExportRequest<BatchObjectIdReq> request) {\n        String type = request.getData().getType();\n        int batchSize = request.getData().getNum();\n        String[] objectIds = batchNextObjectId(type, batchSize);\n        BatchObjectIdRes res = new BatchObjectIdRes();\n        res.setIds(objectIds);\n        return ExportResponse.build4Success(res);\n    }\n\n    private String nextObjectId(String type) {\n        String objectId = null;\n        switch (type) {\n        case ProcessTransactionConstants.TYPE_PROCESS: {\n            objectId = CodeGenerateHelper.generateCode(\"PROCESS_INSTANCE\", \"PI\");\n            break;\n        }\n        case ProcessTransactionConstants.TYPE_NODE: {\n            objectId = CodeGenerateHelper.generateCode(\"NODE_INSTANCE\", \"NI\");\n            break;\n        }\n        case ProcessTransactionConstants.TYPE_EXECUTION: {\n            objectId = CodeGenerateHelper.generateCode(\"EXECUTION_INSTANCE\", \"NE\");\n            break;\n        }\n        case ProcessTransactionConstants.TYPE_TASK: {\n            objectId = CodeGenerateHelper.generateCode(\"PROCESS_TASK\", \"PT\");\n            break;\n        }\n        case ProcessTransactionConstants.TYPE_TASK_ASSIGN: {\n            objectId = CodeGenerateHelper.generateCode(\"PROCESS_TASK_ASSIGN\", \"PTA\");\n            break;\n        }\n        case ProcessTransactionConstants.TYPE_TASK_EVENT: {\n            objectId = CodeGenerateHelper.generateCode(\"PROCESS_TASK_EVENT\", \"PTE\");\n            break;\n        }\n        default: {\n            throw new IllegalArgumentException(\"Illegal param:\" + type);\n        }\n        }\n        return objectId;\n    }\n    \n    private String[] batchNextObjectId(String type, int batchSize) {\n        String[] objectIds = null;\n        switch (type) {\n        case ProcessTransactionConstants.TYPE_PROCESS: {\n            objectIds = CodeGenerateHelper.batchGenerateCode(\"PROCESS_INSTANCE\", \"PI\", batchSize);\n            break;\n        }\n        case ProcessTransactionConstants.TYPE_NODE: {\n            objectIds = CodeGenerateHelper.batchGenerateCode(\"NODE_INSTANCE\", \"NI\", batchSize);\n            break;\n        }\n        case ProcessTransactionConstants.TYPE_EXECUTION: {\n            objectIds = CodeGenerateHelper.batchGenerateCode(\"EXECUTION_INSTANCE\", \"NE\", batchSize);\n            break;\n        }\n        case ProcessTransactionConstants.TYPE_TASK: {\n            objectIds = CodeGenerateHelper.batchGenerateCode(\"PROCESS_TASK\", \"PT\", batchSize);\n            break;\n        }\n        case ProcessTransactionConstants.TYPE_TASK_ASSIGN: {\n            objectIds = CodeGenerateHelper.batchGenerateCode(\"PROCESS_TASK_ASSIGN\", \"PTA\", batchSize);\n            break;\n        }\n        case ProcessTransactionConstants.TYPE_TASK_EVENT: {\n            objectIds = CodeGenerateHelper.batchGenerateCode(\"PROCESS_TASK_EVENT\", \"PTE\", batchSize);\n            break;\n        }\n        default: {\n            throw new IllegalArgumentException(\"Illegal param:\" + type);\n        }\n        }\n        return objectIds;\n    }\n\n    @Action(code = \"easyflow-process-doTransaction\", name = \"doTransaction\")\n    @Override\n    public ExportResponse<TxnRes> doTransaction(ExportRequest<TxnReq> request) {\n        List<Map<String, Object>> postActionList = new ArrayList<>();\n        TxnRes response = transactionTemplate.execute(status -> {\n            return executeTransaction(request.getData(), postActionList);\n        });\n        for (Map<String, Object> action : postActionList) {\n            String type = (String) action.get(\"type\");\n            if (ProcessConstants.TXN_ACTION_MERGE_ASYNC.equals(type)) {\n                List<Runnable> tasks = (List<Runnable>) action.get(\"tasks\");\n                executor.execute(() -> {\n                    if (log.isDebugEnabled()) {\n                        log.debug(\"Start async process\");\n                    }\n                    try {\n                        tasks.forEach(task -> task.run());\n                        if (log.isDebugEnabled()) {\n                            log.debug(\"End async process\");\n                        }\n                    } catch (Exception e) {\n                        AlertUtil.alert(\"Async process exception\", e);\n                    }\n                });\n            } else {\n                String topic = (String) action.get(\"topic\");\n                String bizData = (String) action.get(\"bizData\");\n                messageSendService.sendMessage(UUID.randomUUID().toString(), topic, bizData);\n            }\n        }\n        return ExportResponse.build4Success(response);\n    }\n    \n    \n\n    public TxnRes executeTransaction(TxnReq request, List<Map<String, Object>> postActionList) {\n        List<TxnCommand> commandList = request.getCommandList();\n        TxnRes res = new TxnRes();\n        List<TxnCommandResult> resultList = new ArrayList<>();\n        res.setResultList(resultList);\n        for (TxnCommand command : commandList) {\n            if (ProcessTransactionConstants.TXN_COMMAND_BATCH_UPDATE.equals(command.getCommandType())) {\n                BatchUpdateTxnCommand batchUpdateCommand = (BatchUpdateTxnCommand) command;\n                for (Object o : batchUpdateCommand.getObjects()) {\n                    Object persistObj = o;\n                    Integer persistOp = null;\n                    if (o instanceof PersistDTO) {\n                        persistObj = ((PersistDTO) o).getPersistObject();\n                        persistOp = ((PersistDTO) o).getPersistOp();\n                    }\n                    if (persistObj instanceof ProcessInstanceDTO || persistObj instanceof ProcessNodeInstanceDTO\n                            || persistObj instanceof ProcessNodeExecutionDTO) {\n                        processInstanceDomainService.updateProcessObject(persistOp, persistObj,\n                                batchUpdateCommand.getProcessContext(), postActionList);\n                    } else if (persistObj instanceof ProcessTaskDTO || persistObj instanceof ProcessTaskAssignDTO\n                            || persistObj instanceof ProcessTaskEventDTO) {\n                        processTaskDomainService.updateTaskObject(persistOp, persistObj,\n                                batchUpdateCommand.getProcessContext(), postActionList);\n                    } else {\n                        throw new UnsupportedOperationException(\"Unsupported object type:\" + o.getClass().getName());\n                    }\n                }\n\n            } else if (ProcessTransactionConstants.TXN_COMMAND_INTERRUPT.equals(command.getCommandType())) {\n                InterruptTxnCommand interruptCommand = (InterruptTxnCommand) command;\n                processInstanceDomainService.interruptOnRuntime(interruptCommand.getProcessInstanceNo(),\n                        interruptCommand.getInterruptUser(), interruptCommand.getInterruptTime(),\n                        interruptCommand.getProcessContext(), postActionList);\n            } else {\n                throw new UnsupportedOperationException(\"Unsupported operation type:\" + command.getCommandType());\n            }\n        }\n        return res;\n    }\n\n    public MessageSendService getMessageSendService() {\n        return messageSendService;\n    }\n\n    public void setMessageSendService(MessageSendService messageSendService) {\n        this.messageSendService = messageSendService;\n    }\n\n    public ThreadPoolTaskExecutor getExecutor() {\n        return executor;\n    }\n\n    public void setExecutor(ThreadPoolTaskExecutor executor) {\n        this.executor = executor;\n    }\n\n    @Override\n    public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {\n        return ContextClosedEvent.class.isAssignableFrom(eventType);\n    }\n\n    @Override\n    public void onApplicationEvent(ApplicationEvent event) {\n        if (executor != null && Boolean.TRUE.equals(isSelfInitial)) {\n            executor.shutdown();\n        }\n    }\n\n    public void init(){\n        if(executor == null){\n            log.info(\"ProcessTransactionExportImpl set none thread pool, load default.\");\n            executor = initDefaultThreadPool();\n        }\n    }\n\n    public ThreadPoolTaskExecutor initDefaultThreadPool() {\n        ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();\n        threadPoolTaskExecutor.setCorePoolSize(Runtime.getRuntime().availableProcessors() / 8 + 1);\n        threadPoolTaskExecutor.setMaxPoolSize(100);\n        threadPoolTaskExecutor.setQueueCapacity(500);\n        threadPoolTaskExecutor.setKeepAliveSeconds(100);\n        threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());\n        threadPoolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true);\n        threadPoolTaskExecutor.setAllowCoreThreadTimeOut(false);\n        threadPoolTaskExecutor.setAwaitTerminationSeconds(3);\n        threadPoolTaskExecutor.initialize();\n        this.isSelfInitial = true;\n        return threadPoolTaskExecutor;\n    }\n\n    public TransactionTemplate getTransactionTemplate() {\n        return transactionTemplate;\n    }\n\n    public void setTransactionTemplate(TransactionTemplate transactionTemplate) {\n        this.transactionTemplate = transactionTemplate;\n    }\n\n    public ProcessInstanceDomainService getProcessInstanceDomainService() {\n        return processInstanceDomainService;\n    }\n\n    public void setProcessInstanceDomainService(ProcessInstanceDomainService processInstanceDomainService) {\n        this.processInstanceDomainService = processInstanceDomainService;\n    }\n\n    public ProcessTaskDomainService getProcessTaskDomainService() {\n        return processTaskDomainService;\n    }\n\n    public void setProcessTaskDomainService(ProcessTaskDomainService processTaskDomainService) {\n        this.processTaskDomainService = processTaskDomainService;\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/adapter/export/converter/PagerConverter.java",
    "content": "package com.jd.easyflow.process.adapter.export.converter;\n\n\nimport com.jd.easyflow.common.adapter.export.dto.pager.PagerResult;\nimport com.jd.easyflow.common.dto.pager.FieldEntry;\nimport com.jd.easyflow.common.dto.pager.PagerCondition;\nimport com.jd.easyflow.common.dto.pager.SortEntry;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * @author liyuliang5\n *\n */\npublic class PagerConverter {\n    \n    public static PagerConverter INSTANCE = new PagerConverter();\n\n    public PagerCondition convert(com.jd.easyflow.common.adapter.export.dto.pager.PagerCondition condition) {\n        if ( condition == null ) {\n            return null;\n        }\n\n        PagerCondition pagerCondition = new PagerCondition();\n\n        pagerCondition.setCount( condition.isCount() );\n        Map<String, Object> map = condition.getExtData();\n        if ( map != null ) {\n            pagerCondition.setExtData( new HashMap<String, Object>( map ) );\n        }\n        pagerCondition.setFieldList( fieldEntryListToFieldEntryList( condition.getFieldList() ) );\n        pagerCondition.setPage( condition.getPage() );\n        pagerCondition.setPageIndex( condition.getPageIndex() );\n        pagerCondition.setPageSize( condition.getPageSize() );\n        pagerCondition.setSortList( sortEntryListToSortEntryList( condition.getSortList() ) );\n        pagerCondition.setStart( condition.getStart() );\n        if ( pagerCondition.getFieldMap() != null ) {\n            Map<String, FieldEntry> map1 = stringFieldEntryMapToStringFieldEntryMap( condition.getFieldMap() );\n            if ( map1 != null ) {\n                pagerCondition.getFieldMap().putAll( map1 );\n            }\n        }\n        if ( pagerCondition.getSortMap() != null ) {\n            Map<String, SortEntry> map2 = stringSortEntryMapToStringSortEntryMap( condition.getSortMap() );\n            if ( map2 != null ) {\n                pagerCondition.getSortMap().putAll( map2 );\n            }\n        }\n\n        return pagerCondition;\n    }\n\n    public PagerResult convert(com.jd.easyflow.common.dto.pager.PagerResult result) {\n        if ( result == null ) {\n            return null;\n        }\n\n        PagerResult pagerResult = new PagerResult();\n\n        pagerResult.setCount( result.getCount() );\n        List list = result.getList();\n        if ( list != null ) {\n            pagerResult.setList( new ArrayList( list ) );\n        }\n        pagerResult.setPageNum( result.getPageNum() );\n        pagerResult.setPageSize( result.getPageSize() );\n\n        return pagerResult;\n    }\n\n    protected FieldEntry fieldEntryToFieldEntry(com.jd.easyflow.common.adapter.export.dto.pager.FieldEntry fieldEntry) {\n        if ( fieldEntry == null ) {\n            return null;\n        }\n\n        FieldEntry fieldEntry1 = new FieldEntry();\n\n        fieldEntry1.setName( fieldEntry.getName() );\n        fieldEntry1.setValue( fieldEntry.getValue() );\n\n        return fieldEntry1;\n    }\n\n    protected List<FieldEntry> fieldEntryListToFieldEntryList(List<com.jd.easyflow.common.adapter.export.dto.pager.FieldEntry> list) {\n        if ( list == null ) {\n            return null;\n        }\n\n        List<FieldEntry> list1 = new ArrayList<FieldEntry>( list.size() );\n        for ( com.jd.easyflow.common.adapter.export.dto.pager.FieldEntry fieldEntry : list ) {\n            list1.add( fieldEntryToFieldEntry( fieldEntry ) );\n        }\n\n        return list1;\n    }\n\n    protected SortEntry sortEntryToSortEntry(com.jd.easyflow.common.adapter.export.dto.pager.SortEntry sortEntry) {\n        if ( sortEntry == null ) {\n            return null;\n        }\n\n        SortEntry sortEntry1 = new SortEntry();\n\n        sortEntry1.setKey( sortEntry.getKey() );\n        sortEntry1.setSeq( sortEntry.getSeq() );\n        sortEntry1.setType( sortEntry.getType() );\n\n        return sortEntry1;\n    }\n\n    protected List<SortEntry> sortEntryListToSortEntryList(List<com.jd.easyflow.common.adapter.export.dto.pager.SortEntry> list) {\n        if ( list == null ) {\n            return null;\n        }\n\n        List<SortEntry> list1 = new ArrayList<SortEntry>( list.size() );\n        for ( com.jd.easyflow.common.adapter.export.dto.pager.SortEntry sortEntry : list ) {\n            list1.add( sortEntryToSortEntry( sortEntry ) );\n        }\n\n        return list1;\n    }\n\n    protected Map<String, FieldEntry> stringFieldEntryMapToStringFieldEntryMap(Map<String, com.jd.easyflow.common.adapter.export.dto.pager.FieldEntry> map) {\n        if ( map == null ) {\n            return null;\n        }\n\n        Map<String, FieldEntry> map1 = new HashMap<String, FieldEntry>( Math.max( (int) ( map.size() / .75f ) + 1, 16 ) );\n\n        for ( java.util.Map.Entry<String, com.jd.easyflow.common.adapter.export.dto.pager.FieldEntry> entry : map.entrySet() ) {\n            String key = entry.getKey();\n            FieldEntry value = fieldEntryToFieldEntry( entry.getValue() );\n            map1.put( key, value );\n        }\n\n        return map1;\n    }\n\n    protected Map<String, SortEntry> stringSortEntryMapToStringSortEntryMap(Map<String, com.jd.easyflow.common.adapter.export.dto.pager.SortEntry> map) {\n        if ( map == null ) {\n            return null;\n        }\n\n        Map<String, SortEntry> map1 = new HashMap<String, SortEntry>( Math.max( (int) ( map.size() / .75f ) + 1, 16 ) );\n\n        for ( java.util.Map.Entry<String, com.jd.easyflow.common.adapter.export.dto.pager.SortEntry> entry : map.entrySet() ) {\n            String key = entry.getKey();\n            SortEntry value = sortEntryToSortEntry( entry.getValue() );\n            map1.put( key, value );\n        }\n\n        return map1;\n    }\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/adapter/export/converter/ProcessDefinitionConverter.java",
    "content": "package com.jd.easyflow.process.adapter.export.converter;\n\nimport com.jd.easyflow.common.adapter.export.dto.pager.PagerResult;\nimport com.jd.easyflow.process.adapter.export.dto.definition.ProcessDefinitionDTO;\nimport com.jd.easyflow.process.domain.model.entity.ProcessDefinitionEntity;\nimport com.jd.easyflow.process.domain.model.vo.ProcessDefinitionForListVO;\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessDefinitionConverter {\n    \n    public static ProcessDefinitionConverter INSTANCE = new ProcessDefinitionConverter();\n\n    public ProcessDefinitionDTO convert(ProcessDefinitionEntity entity) {\n        if ( entity == null ) {\n            return null;\n        }\n\n        ProcessDefinitionDTO processDefinitionDTO = new ProcessDefinitionDTO();\n\n        processDefinitionDTO.setBizType( entity.getBizType() );\n        processDefinitionDTO.setCategory( entity.getCategory() );\n        processDefinitionDTO.setContent( entity.getContent() );\n        processDefinitionDTO.setCreatedBy( entity.getCreatedBy() );\n        processDefinitionDTO.setCreatedDate( entity.getCreatedDate() );\n        processDefinitionDTO.setDefId( entity.getDefId() );\n        processDefinitionDTO.setDefSource( entity.getDefSource() );\n        processDefinitionDTO.setDefVersion( entity.getDefVersion() );\n        processDefinitionDTO.setExtData( entity.getExtData() );\n        processDefinitionDTO.setFormat( entity.getFormat() );\n        processDefinitionDTO.setId( entity.getId() );\n        processDefinitionDTO.setJsonContent( entity.getJsonContent() );\n        processDefinitionDTO.setLatest( entity.getLatest() );\n        processDefinitionDTO.setModifiedBy( entity.getModifiedBy() );\n        processDefinitionDTO.setModifiedDate( entity.getModifiedDate() );\n        processDefinitionDTO.setName( entity.getName() );\n\n        return processDefinitionDTO;\n    }\n\n    public ProcessDefinitionEntity convert(ProcessDefinitionDTO dto) {\n        if ( dto == null ) {\n            return null;\n        }\n\n        ProcessDefinitionEntity processDefinitionEntity = new ProcessDefinitionEntity();\n\n        processDefinitionEntity.setBizType( dto.getBizType() );\n        processDefinitionEntity.setCategory( dto.getCategory() );\n        processDefinitionEntity.setContent( dto.getContent() );\n        processDefinitionEntity.setCreatedBy( dto.getCreatedBy() );\n        processDefinitionEntity.setCreatedDate( dto.getCreatedDate() );\n        processDefinitionEntity.setDefId( dto.getDefId() );\n        processDefinitionEntity.setDefSource( dto.getDefSource() );\n        processDefinitionEntity.setDefVersion( dto.getDefVersion() );\n        processDefinitionEntity.setExtData( dto.getExtData() );\n        processDefinitionEntity.setFormat( dto.getFormat() );\n        processDefinitionEntity.setId( dto.getId() );\n        processDefinitionEntity.setJsonContent( dto.getJsonContent() );\n        processDefinitionEntity.setLatest( dto.getLatest() );\n        processDefinitionEntity.setModifiedBy( dto.getModifiedBy() );\n        processDefinitionEntity.setModifiedDate( dto.getModifiedDate() );\n        processDefinitionEntity.setName( dto.getName() );\n\n        return processDefinitionEntity;\n    }\n\n    public PagerResult<ProcessDefinitionDTO> convert(com.jd.easyflow.common.dto.pager.PagerResult<ProcessDefinitionForListVO> pagerResult) {\n        if ( pagerResult == null ) {\n            return null;\n        }\n\n        PagerResult<ProcessDefinitionDTO> pagerResult1 = new PagerResult<ProcessDefinitionDTO>();\n\n        pagerResult1.setCount( pagerResult.getCount() );\n        pagerResult1.setPageNum( pagerResult.getPageNum() );\n        pagerResult1.setPageSize( pagerResult.getPageSize() );\n\n        pagerResult1.setList( convertList(pagerResult.getList()) );\n\n        return pagerResult1;\n    }\n\n    public List<ProcessDefinitionDTO> convertList(List<ProcessDefinitionForListVO> processDefinitionListDTOS) {\n        if ( processDefinitionListDTOS == null ) {\n            return null;\n        }\n\n        List<ProcessDefinitionDTO> list = new ArrayList<ProcessDefinitionDTO>( processDefinitionListDTOS.size() );\n        for ( ProcessDefinitionForListVO processDefinitionForListVO : processDefinitionListDTOS ) {\n            list.add( processDefinitionForListVOToProcessDefinitionDTO( processDefinitionForListVO ) );\n        }\n\n        return list;\n    }\n\n    protected ProcessDefinitionDTO processDefinitionForListVOToProcessDefinitionDTO(ProcessDefinitionForListVO processDefinitionForListVO) {\n        if ( processDefinitionForListVO == null ) {\n            return null;\n        }\n\n        ProcessDefinitionDTO processDefinitionDTO = new ProcessDefinitionDTO();\n\n        processDefinitionDTO.setBizType( processDefinitionForListVO.getBizType() );\n        processDefinitionDTO.setCategory( processDefinitionForListVO.getCategory() );\n        processDefinitionDTO.setCreatedBy( processDefinitionForListVO.getCreatedBy() );\n        processDefinitionDTO.setCreatedDate( processDefinitionForListVO.getCreatedDate() );\n        processDefinitionDTO.setDefId( processDefinitionForListVO.getDefId() );\n        processDefinitionDTO.setDefSource( processDefinitionForListVO.getDefSource() );\n        processDefinitionDTO.setDefVersion( processDefinitionForListVO.getDefVersion() );\n        processDefinitionDTO.setFormat( processDefinitionForListVO.getFormat() );\n        processDefinitionDTO.setId( processDefinitionForListVO.getId() );\n        processDefinitionDTO.setLatest( processDefinitionForListVO.getLatest() );\n        processDefinitionDTO.setModifiedBy( processDefinitionForListVO.getModifiedBy() );\n        processDefinitionDTO.setModifiedDate( processDefinitionForListVO.getModifiedDate() );\n        processDefinitionDTO.setName( processDefinitionForListVO.getName() );\n\n        return processDefinitionDTO;\n    }\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/adapter/export/converter/ProcessInstanceConverter.java",
    "content": "package com.jd.easyflow.process.adapter.export.converter;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\n\nimport com.jd.easyflow.process.adapter.export.dto.instance.CreateProcessInstanceReq;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessInstanceDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessNodeExecutionDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessNodeInstanceDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.QueryProcessNodeReqDTO;\nimport com.jd.easyflow.process.domain.model.entity.ProcessInstanceEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessNodeExecutionEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessNodeInstanceEntity;\nimport com.jd.easyflow.process.domain.model.vo.CreateProcessInstanceReqVO;\nimport com.jd.easyflow.process.domain.model.vo.QueryProcessNodeReq;\nimport com.jd.easyflow.process.domain.model.vo.QueryProcessNodeReq.QueryProcessNodeReqBuilder;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessInstanceConverter {\n\n    public static final ProcessInstanceConverter INSTANCE = new ProcessInstanceConverter();\n    \n\n    public CreateProcessInstanceReqVO convert(CreateProcessInstanceReq req) {\n        if ( req == null ) {\n            return null;\n        }\n\n        CreateProcessInstanceReqVO createProcessInstanceReqVO = new CreateProcessInstanceReqVO();\n\n        createProcessInstanceReqVO.setBizData( req.getBizData() );\n        createProcessInstanceReqVO.setBizNo( req.getBizNo() );\n        createProcessInstanceReqVO.setBizStatus( req.getBizStatus() );\n        createProcessInstanceReqVO.setCreator( req.getCreator() );\n        Map<String, Object> map = req.getDataMap();\n        if ( map != null ) {\n            createProcessInstanceReqVO.setDataMap( new HashMap<String, Object>( map ) );\n        }\n        createProcessInstanceReqVO.setInstanceName( req.getInstanceName() );\n        createProcessInstanceReqVO.setKeyField( req.getKeyField() );\n        createProcessInstanceReqVO.setKeyField2( req.getKeyField2() );\n        createProcessInstanceReqVO.setParam( req.getParam() );\n        createProcessInstanceReqVO.setProcessId( req.getProcessId() );\n        createProcessInstanceReqVO.setProcessType( req.getProcessType() );\n        createProcessInstanceReqVO.setProductCode( req.getProductCode() );\n\n        return createProcessInstanceReqVO;\n    }\n\n    public ProcessInstanceDTO convert(ProcessInstanceEntity entity) {\n        if ( entity == null ) {\n            return null;\n        }\n\n        ProcessInstanceDTO processInstanceDTO = new ProcessInstanceDTO();\n\n        processInstanceDTO.setBizData( entity.getBizData() );\n        processInstanceDTO.setBizNo( entity.getBizNo() );\n        processInstanceDTO.setBizStatus( entity.getBizStatus() );\n        processInstanceDTO.setCreatedDate( entity.getCreatedDate() );\n        processInstanceDTO.setCreator( entity.getCreator() );\n        processInstanceDTO.setCurrentNodeIds( entity.getCurrentNodeIds() );\n        processInstanceDTO.setEndTime( entity.getEndTime() );\n        processInstanceDTO.setExtData( entity.getExtData() );\n        processInstanceDTO.setInstanceName( entity.getInstanceName() );\n        processInstanceDTO.setInstanceNo( entity.getInstanceNo() );\n        processInstanceDTO.setKeyField( entity.getKeyField() );\n        processInstanceDTO.setKeyField2( entity.getKeyField2() );\n        processInstanceDTO.setModifiedDate( entity.getModifiedDate() );\n        processInstanceDTO.setParentInstanceNo( entity.getParentInstanceNo() );\n        processInstanceDTO.setParentNodeInstanceNo( entity.getParentNodeInstanceNo() );\n        processInstanceDTO.setProcessDefId( entity.getProcessDefId() );\n        processInstanceDTO.setProcessType( entity.getProcessType() );\n        processInstanceDTO.setProductCode( entity.getProductCode() );\n        processInstanceDTO.setStartTime( entity.getStartTime() );\n        processInstanceDTO.setStatus( entity.getStatus() );\n        processInstanceDTO.setVars( entity.getVars() );\n\n        return processInstanceDTO;\n    }\n\n    public List<ProcessInstanceDTO> convert(List<ProcessInstanceEntity> list) {\n        if ( list == null ) {\n            return null;\n        }\n\n        List<ProcessInstanceDTO> list1 = new ArrayList<ProcessInstanceDTO>( list.size() );\n        for ( ProcessInstanceEntity processInstanceEntity : list ) {\n            list1.add( convert( processInstanceEntity ) );\n        }\n\n        return list1;\n    }\n\n    public ProcessInstanceEntity convert(ProcessInstanceDTO dto) {\n        if ( dto == null ) {\n            return null;\n        }\n\n        ProcessInstanceEntity processInstanceEntity = new ProcessInstanceEntity();\n\n        processInstanceEntity.setBizData( dto.getBizData() );\n        processInstanceEntity.setBizNo( dto.getBizNo() );\n        processInstanceEntity.setBizStatus( dto.getBizStatus() );\n        processInstanceEntity.setCreatedDate( dto.getCreatedDate() );\n        processInstanceEntity.setCreator( dto.getCreator() );\n        processInstanceEntity.setCurrentNodeIds( dto.getCurrentNodeIds() );\n        processInstanceEntity.setEndTime( dto.getEndTime() );\n        processInstanceEntity.setExtData( dto.getExtData() );\n        processInstanceEntity.setInstanceName( dto.getInstanceName() );\n        processInstanceEntity.setInstanceNo( dto.getInstanceNo() );\n        processInstanceEntity.setKeyField( dto.getKeyField() );\n        processInstanceEntity.setKeyField2( dto.getKeyField2() );\n        processInstanceEntity.setModifiedDate( dto.getModifiedDate() );\n        processInstanceEntity.setParentInstanceNo( dto.getParentInstanceNo() );\n        processInstanceEntity.setParentNodeInstanceNo( dto.getParentNodeInstanceNo() );\n        processInstanceEntity.setProcessDefId( dto.getProcessDefId() );\n        processInstanceEntity.setProcessType( dto.getProcessType() );\n        processInstanceEntity.setProductCode( dto.getProductCode() );\n        processInstanceEntity.setStartTime( dto.getStartTime() );\n        processInstanceEntity.setStatus( dto.getStatus() );\n        processInstanceEntity.setVars( dto.getVars() );\n\n        return processInstanceEntity;\n    }\n\n    public ProcessNodeInstanceDTO convert(ProcessNodeInstanceEntity entity) {\n        if ( entity == null ) {\n            return null;\n        }\n\n        ProcessNodeInstanceDTO processNodeInstanceDTO = new ProcessNodeInstanceDTO();\n\n        processNodeInstanceDTO.setCreatedDate( entity.getCreatedDate() );\n        processNodeInstanceDTO.setEndTime( entity.getEndTime() );\n        processNodeInstanceDTO.setExecutors( entity.getExecutors() );\n        processNodeInstanceDTO.setExtData( entity.getExtData() );\n        processNodeInstanceDTO.setModifiedDate( entity.getModifiedDate() );\n        processNodeInstanceDTO.setNextNodeInstances( entity.getNextNodeInstances() );\n        processNodeInstanceDTO.setNodeId( entity.getNodeId() );\n        processNodeInstanceDTO.setNodeInstanceNo( entity.getNodeInstanceNo() );\n        processNodeInstanceDTO.setPreviousNodeInstances( entity.getPreviousNodeInstances() );\n        processNodeInstanceDTO.setProcessDefId( entity.getProcessDefId() );\n        processNodeInstanceDTO.setProcessInstanceNo( entity.getProcessInstanceNo() );\n        processNodeInstanceDTO.setProductCode( entity.getProductCode() );\n        processNodeInstanceDTO.setStartTime( entity.getStartTime() );\n        processNodeInstanceDTO.setStatus( entity.getStatus() );\n        processNodeInstanceDTO.setVars( entity.getVars() );\n\n        return processNodeInstanceDTO;\n    }\n    \n    public ProcessNodeInstanceEntity convert(ProcessNodeInstanceDTO dto) {\n        if ( dto == null ) {\n            return null;\n        }\n\n        ProcessNodeInstanceEntity entity = new ProcessNodeInstanceEntity();\n\n        entity.setCreatedDate( dto.getCreatedDate() );\n        entity.setEndTime( dto.getEndTime() );\n        entity.setExecutors( dto.getExecutors() );\n        entity.setExtData( dto.getExtData() );\n        entity.setModifiedDate( dto.getModifiedDate() );\n        entity.setNextNodeInstances( dto.getNextNodeInstances() );\n        entity.setNodeId( dto.getNodeId() );\n        entity.setNodeInstanceNo( dto.getNodeInstanceNo() );\n        entity.setPreviousNodeInstances( dto.getPreviousNodeInstances() );\n        entity.setProcessDefId( dto.getProcessDefId() );\n        entity.setProcessInstanceNo( dto.getProcessInstanceNo() );\n        entity.setProductCode( dto.getProductCode() );\n        entity.setStartTime( dto.getStartTime() );\n        entity.setStatus( dto.getStatus() );\n        entity.setVars( dto.getVars() );\n\n        return entity;\n    }\n\n    public List<ProcessNodeInstanceDTO> convertNodeInstanceList(List<ProcessNodeInstanceEntity> entity) {\n        if ( entity == null ) {\n            return null;\n        }\n\n        List<ProcessNodeInstanceDTO> list = new ArrayList<ProcessNodeInstanceDTO>( entity.size() );\n        for ( ProcessNodeInstanceEntity processNodeInstanceEntity : entity ) {\n            list.add( convert( processNodeInstanceEntity ) );\n        }\n\n        return list;\n    }\n    \n    public List<ProcessNodeExecutionDTO> convertNodeExecutionList(List<ProcessNodeExecutionEntity> entity) {\n        if ( entity == null ) {\n            return null;\n        }\n\n        List<ProcessNodeExecutionDTO> list = new ArrayList<ProcessNodeExecutionDTO>( entity.size() );\n        for ( ProcessNodeExecutionEntity processNodeExecutionEntity : entity ) {\n            list.add( convert( processNodeExecutionEntity ) );\n        }\n\n        return list;\n    }\n\n    public ProcessNodeExecutionDTO convert(ProcessNodeExecutionEntity entity) {\n        if ( entity == null ) {\n            return null;\n        }\n\n        ProcessNodeExecutionDTO processNodeExecutionDTO = new ProcessNodeExecutionDTO();\n\n        processNodeExecutionDTO.setCreatedDate( entity.getCreatedDate() );\n        processNodeExecutionDTO.setEndTime( entity.getEndTime() );\n        processNodeExecutionDTO.setEventId( entity.getEventId() );\n        processNodeExecutionDTO.setExecutor( entity.getExecutor() );\n        processNodeExecutionDTO.setExtData( entity.getExtData() );\n        processNodeExecutionDTO.setId( entity.getId() );\n        processNodeExecutionDTO.setModifiedDate( entity.getModifiedDate() );\n        processNodeExecutionDTO.setNextNodeInstances( entity.getNextNodeInstances() );\n        processNodeExecutionDTO.setNodeExecutionNo( entity.getNodeExecutionNo() );\n        processNodeExecutionDTO.setNodeId( entity.getNodeId() );\n        processNodeExecutionDTO.setNodeInstanceNo( entity.getNodeInstanceNo() );\n        processNodeExecutionDTO.setProcessDefId( entity.getProcessDefId() );\n        processNodeExecutionDTO.setProductCode( entity.getProductCode() );\n        processNodeExecutionDTO.setStartTime( entity.getStartTime() );\n        processNodeExecutionDTO.setStatus( entity.getStatus() );\n\n        return processNodeExecutionDTO;\n    }\n\n    public QueryProcessNodeReq convert(QueryProcessNodeReqDTO reqDTO) {\n        if ( reqDTO == null ) {\n            return null;\n        }\n\n        QueryProcessNodeReqBuilder queryProcessNodeReq = QueryProcessNodeReq.builder();\n\n        queryProcessNodeReq.nodeId( reqDTO.getNodeId() );\n        queryProcessNodeReq.processInstanceNo( reqDTO.getProcessInstanceNo() );\n        Set<String> set = reqDTO.getStatus();\n        if ( set != null ) {\n            queryProcessNodeReq.status( new HashSet<String>( set ) );\n        }\n\n        return queryProcessNodeReq.build();\n    }\n\n    public List<ProcessNodeInstanceDTO> convertDTOList(List<ProcessNodeInstanceEntity> entityList) {\n        if ( entityList == null ) {\n            return null;\n        }\n\n        List<ProcessNodeInstanceDTO> list = new ArrayList<ProcessNodeInstanceDTO>( entityList.size() );\n        for ( ProcessNodeInstanceEntity processNodeInstanceEntity : entityList ) {\n            list.add( convert( processNodeInstanceEntity ) );\n        }\n\n        return list;\n    }\n}\n\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/adapter/export/converter/ProcessScheduleConverter.java",
    "content": "package com.jd.easyflow.process.adapter.export.converter;\n\nimport java.util.Arrays;\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport com.jd.easyflow.process.adapter.export.dto.schedule.ScheduleProcessReq;\nimport com.jd.easyflow.process.adapter.export.dto.schedule.ScheduleProcessRes;\nimport com.jd.easyflow.process.domain.model.vo.ScheduleProcessReqVO;\nimport com.jd.easyflow.process.domain.model.vo.ScheduleProcessResVO;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessScheduleConverter {\n\n    public static final ProcessScheduleConverter INSTANCE = new ProcessScheduleConverter();\n\n\n    public ScheduleProcessReqVO convert(ScheduleProcessReq req) {\n        if ( req == null ) {\n            return null;\n        }\n\n        ScheduleProcessReqVO scheduleProcessReqVO = new ScheduleProcessReqVO();\n\n        Map<String, Object> map = req.getDataMap();\n        if ( map != null ) {\n            scheduleProcessReqVO.setDataMap(req.getDataMap());\n        }\n        String[] nodeIds = req.getNodeIds();\n        if ( nodeIds != null ) {\n            scheduleProcessReqVO.setNodeIds( Arrays.copyOf( nodeIds, nodeIds.length ) );\n        }\n        scheduleProcessReqVO.setParam( req.getParam() );\n        scheduleProcessReqVO.setProcessId( req.getProcessId() );\n\n        return scheduleProcessReqVO;\n    }\n    \n    public ScheduleProcessRes convert(ScheduleProcessResVO resVo) {\n        if (resVo == null) {\n            return null;\n        }\n        ScheduleProcessRes res = new ScheduleProcessRes();\n        res.setProcessInstanceNo(resVo.getProcessInstanceNo());\n        res.setResult(resVo.getResult());\n        Map<String, Object> map = resVo.getDataMap();\n        if ( map != null ) {\n            res.setDataMap( new HashMap<String, Object>( map ) );\n        }\n        return res;\n    }\n}"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/adapter/export/converter/ProcessTaskConverter.java",
    "content": "package com.jd.easyflow.process.adapter.export.converter;\n\nimport java.text.ParseException;\nimport java.text.SimpleDateFormat;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport com.jd.easyflow.process.adapter.export.dto.task.ExecuteTaskReq;\nimport com.jd.easyflow.process.adapter.export.dto.task.ProcessTaskAssignDTO;\nimport com.jd.easyflow.process.adapter.export.dto.task.ProcessTaskDTO;\nimport com.jd.easyflow.process.adapter.export.dto.task.ProcessTaskEventDTO;\nimport com.jd.easyflow.process.adapter.export.dto.task.QueryTaskReq;\nimport com.jd.easyflow.process.adapter.export.dto.task.TaskOperateCmd;\nimport com.jd.easyflow.process.adapter.export.dto.task.TaskOperateCommand;\nimport com.jd.easyflow.process.adapter.export.dto.task.command.TaskCreateCommand;\nimport com.jd.easyflow.process.adapter.export.dto.task.command.TaskExecuteCommand;\nimport com.jd.easyflow.process.domain.model.entity.ProcessTaskAssignEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessTaskEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessTaskEventEntity;\nimport com.jd.easyflow.process.domain.model.vo.CreateProcessTaskVO;\nimport com.jd.easyflow.process.domain.model.vo.DoExecuteProcessTaskReqVO;\nimport com.jd.easyflow.process.domain.model.vo.ExecuteProcessTaskReqVO;\nimport com.jd.easyflow.process.domain.model.vo.QueryTaskReqVO;\nimport com.jd.easyflow.process.domain.model.vo.TaskInfoForPagerVO;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessTaskConverter {\n\n    public static ProcessTaskConverter INSTANCE = new ProcessTaskConverter();\n\n    public ExecuteProcessTaskReqVO convert(ExecuteTaskReq req) {\n        if ( req == null ) {\n            return null;\n        }\n\n        ExecuteProcessTaskReqVO executeProcessTaskReqVO = new ExecuteProcessTaskReqVO();\n\n        List<TaskOperateCmd> list = req.getCmdList();\n        if ( list != null ) {\n            executeProcessTaskReqVO.setCmdList( new ArrayList<TaskOperateCmd>( list ) );\n        }\n        executeProcessTaskReqVO.setExecuteBizData( req.getExecuteBizData() );\n        executeProcessTaskReqVO.setExecuteBizResult( req.getExecuteBizResult() );\n        List<String> list1 = req.getGroup2List();\n        if ( list1 != null ) {\n            executeProcessTaskReqVO.setGroup2List( new ArrayList<String>( list1 ) );\n        }\n        List<String> list2 = req.getGroupList();\n        if ( list2 != null ) {\n            executeProcessTaskReqVO.setGroupList( new ArrayList<String>( list2 ) );\n        }\n        executeProcessTaskReqVO.setInstanceBizData( req.getInstanceBizData() );\n        executeProcessTaskReqVO.setInstanceBizStatus( req.getInstanceBizStatus() );\n        executeProcessTaskReqVO.setOperation( req.getOperation() );\n        executeProcessTaskReqVO.setTaskExtData( req.getTaskExtData() );\n        executeProcessTaskReqVO.setTaskNo( req.getTaskNo() );\n        executeProcessTaskReqVO.setUser( req.getUser() );\n\n        return executeProcessTaskReqVO;\n    }\n\n    public List<ProcessTaskDTO> convert(List<TaskInfoForPagerVO> list) {\n        if ( list == null ) {\n            return null;\n        }\n\n        List<ProcessTaskDTO> list1 = new ArrayList<ProcessTaskDTO>( list.size() );\n        for ( TaskInfoForPagerVO taskInfoForPagerVO : list ) {\n            try {\n                list1.add( taskInfoForPagerVOToProcessTaskDTO( taskInfoForPagerVO ) );\n            }\n            catch ( ParseException e ) {\n                throw new RuntimeException( e );\n            }\n        }\n\n        return list1;\n    }\n\n    public ProcessTaskDTO convert(ProcessTaskEntity entity) {\n        if ( entity == null ) {\n            return null;\n        }\n\n        ProcessTaskDTO processTaskDTO = new ProcessTaskDTO();\n\n        processTaskDTO.setAssignInfo( entity.getAssignInfo() );\n        processTaskDTO.setAssignTime( entity.getAssignTime() );\n        processTaskDTO.setAssignType( entity.getAssignType() );\n        processTaskDTO.setBizNo( entity.getBizNo() );\n        processTaskDTO.setCreatedDate( entity.getCreatedDate() );\n        processTaskDTO.setCreator( entity.getCreator() );\n        processTaskDTO.setExecuteBizData( entity.getExecuteBizData() );\n        processTaskDTO.setExecuteBizResult( entity.getExecuteBizResult() );\n        processTaskDTO.setExecuteTime( entity.getExecuteTime() );\n        processTaskDTO.setExecutor( entity.getExecutor() );\n        processTaskDTO.setExtData( entity.getExtData() );\n        processTaskDTO.setModifiedDate( entity.getModifiedDate() );\n        processTaskDTO.setNodeExecutionNo( entity.getNodeExecutionNo() );\n        processTaskDTO.setNodeInstanceNo( entity.getNodeInstanceNo() );\n        processTaskDTO.setProcessInstanceKeyField( entity.getProcessInstanceKeyField() );\n        processTaskDTO.setProcessInstanceKeyField2( entity.getProcessInstanceKeyField2() );\n        processTaskDTO.setProcessInstanceNo( entity.getProcessInstanceNo() );\n        processTaskDTO.setProcessType( entity.getProcessType() );\n        processTaskDTO.setProductCode( entity.getProductCode() );\n        processTaskDTO.setStatus( entity.getStatus() );\n        processTaskDTO.setTaskBizCode( entity.getTaskBizCode() );\n        processTaskDTO.setTaskBizName( entity.getTaskBizName() );\n        processTaskDTO.setTaskNo( entity.getTaskNo() );\n        processTaskDTO.setTaskType( entity.getTaskType() );\n\n        return processTaskDTO;\n    }\n\n    public ProcessTaskEntity convert(ProcessTaskDTO dto) {\n        if ( dto == null ) {\n            return null;\n        }\n\n        ProcessTaskEntity processTaskEntity = new ProcessTaskEntity();\n\n        processTaskEntity.setAssignInfo( dto.getAssignInfo() );\n        processTaskEntity.setAssignTime( dto.getAssignTime() );\n        processTaskEntity.setAssignType( dto.getAssignType() );\n        processTaskEntity.setBizNo( dto.getBizNo() );\n        processTaskEntity.setCreatedDate( dto.getCreatedDate() );\n        processTaskEntity.setCreator( dto.getCreator() );\n        processTaskEntity.setExecuteBizData( dto.getExecuteBizData() );\n        processTaskEntity.setExecuteBizResult( dto.getExecuteBizResult() );\n        processTaskEntity.setExecuteTime( dto.getExecuteTime() );\n        processTaskEntity.setExecutor( dto.getExecutor() );\n        processTaskEntity.setExtData( dto.getExtData() );\n        processTaskEntity.setModifiedDate( dto.getModifiedDate() );\n        processTaskEntity.setNodeExecutionNo( dto.getNodeExecutionNo() );\n        processTaskEntity.setNodeInstanceNo( dto.getNodeInstanceNo() );\n        processTaskEntity.setProcessInstanceKeyField( dto.getProcessInstanceKeyField() );\n        processTaskEntity.setProcessInstanceKeyField2( dto.getProcessInstanceKeyField2() );\n        processTaskEntity.setProcessInstanceNo( dto.getProcessInstanceNo() );\n        processTaskEntity.setProcessType( dto.getProcessType() );\n        processTaskEntity.setProductCode( dto.getProductCode() );\n        processTaskEntity.setStatus( dto.getStatus() );\n        processTaskEntity.setTaskBizCode( dto.getTaskBizCode() );\n        processTaskEntity.setTaskBizName( dto.getTaskBizName() );\n        processTaskEntity.setTaskNo( dto.getTaskNo() );\n        processTaskEntity.setTaskType( dto.getTaskType() );\n\n        return processTaskEntity;\n    }\n\n    public ProcessTaskAssignEntity convert(ProcessTaskAssignDTO dto) {\n        if ( dto == null ) {\n            return null;\n        }\n\n        ProcessTaskAssignEntity processTaskAssignEntity = new ProcessTaskAssignEntity();\n\n        processTaskAssignEntity.setAssignGroup( dto.getAssignGroup() );\n        processTaskAssignEntity.setAssignGroup2( dto.getAssignGroup2() );\n        processTaskAssignEntity.setAssignNo( dto.getAssignNo() );\n        processTaskAssignEntity.setAssignTime( dto.getAssignTime() );\n        processTaskAssignEntity.setAssignType( dto.getAssignType() );\n        processTaskAssignEntity.setAssignUser( dto.getAssignUser() );\n        processTaskAssignEntity.setCreatedDate( dto.getCreatedDate() );\n        processTaskAssignEntity.setExtData( dto.getExtData() );\n        processTaskAssignEntity.setModifiedDate( dto.getModifiedDate() );\n        processTaskAssignEntity.setProductCode( dto.getProductCode() );\n        processTaskAssignEntity.setStatus( dto.getStatus() );\n        processTaskAssignEntity.setTaskNo( dto.getTaskNo() );\n\n        return processTaskAssignEntity;\n    }\n\n    public ProcessTaskEventEntity convert(ProcessTaskEventDTO dto) {\n        if ( dto == null ) {\n            return null;\n        }\n\n        ProcessTaskEventEntity processTaskEventEntity = new ProcessTaskEventEntity();\n\n        processTaskEventEntity.setCreatedDate( dto.getCreatedDate() );\n        processTaskEventEntity.setEventBizData( dto.getEventBizData() );\n        processTaskEventEntity.setEventBizResult( dto.getEventBizResult() );\n        processTaskEventEntity.setEventNo( dto.getEventNo() );\n        processTaskEventEntity.setEventTime( dto.getEventTime() );\n        processTaskEventEntity.setEventType( dto.getEventType() );\n        processTaskEventEntity.setEventUser( dto.getEventUser() );\n        processTaskEventEntity.setExtData( dto.getExtData() );\n        processTaskEventEntity.setInstanceBizData( dto.getInstanceBizData() );\n        processTaskEventEntity.setInstanceBizStatus( dto.getInstanceBizStatus() );\n        processTaskEventEntity.setModifiedDate( dto.getModifiedDate() );\n        processTaskEventEntity.setProductCode( dto.getProductCode() );\n        processTaskEventEntity.setTaskNo( dto.getTaskNo() );\n\n        return processTaskEventEntity;\n    }\n\n    public List<ProcessTaskAssignDTO> convertAssignList(List<ProcessTaskAssignEntity> entity) {\n        if ( entity == null ) {\n            return null;\n        }\n\n        List<ProcessTaskAssignDTO> list = new ArrayList<ProcessTaskAssignDTO>( entity.size() );\n        for ( ProcessTaskAssignEntity processTaskAssignEntity : entity ) {\n            list.add( processTaskAssignEntityToProcessTaskAssignDTO( processTaskAssignEntity ) );\n        }\n\n        return list;\n    }\n\n    public QueryTaskReqVO convert(QueryTaskReq req) {\n        if ( req == null ) {\n            return null;\n        }\n\n        QueryTaskReqVO queryTaskReqVO = new QueryTaskReqVO();\n\n        queryTaskReqVO.setBizNo( req.getBizNo() );\n        queryTaskReqVO.setNodeInstanceNo( req.getNodeInstanceNo() );\n        queryTaskReqVO.setProcessInstanceNo( req.getProcessInstanceNo() );\n        queryTaskReqVO.setProcessType( req.getProcessType() );\n        queryTaskReqVO.setStatus( req.getStatus() );\n        queryTaskReqVO.setTaskBizCode( req.getTaskBizCode() );\n\n        return queryTaskReqVO;\n    }\n\n    public List<ProcessTaskDTO> convertEntityList(List<ProcessTaskEntity> entity) {\n        if ( entity == null ) {\n            return null;\n        }\n\n        List<ProcessTaskDTO> list = new ArrayList<ProcessTaskDTO>( entity.size() );\n        for ( ProcessTaskEntity processTaskEntity : entity ) {\n            list.add( convert( processTaskEntity ) );\n        }\n\n        return list;\n    }\n\n    public CreateProcessTaskVO convert(TaskCreateCommand command) {\n        if ( command == null ) {\n            return null;\n        }\n\n        CreateProcessTaskVO createProcessTaskVO = new CreateProcessTaskVO();\n\n        Map<String, Object> map = command.getAssignInfo();\n        if ( map != null ) {\n            createProcessTaskVO.setAssignInfo( new HashMap<String, Object>( map ) );\n        }\n        createProcessTaskVO.setAssignType( command.getAssignType() );\n        createProcessTaskVO.setBizNo( command.getBizNo() );\n        createProcessTaskVO.setCreator( command.getCreator() );\n        createProcessTaskVO.setExtData( command.getExtData() );\n        createProcessTaskVO.setNodeInstanceNo( command.getNodeInstanceNo() );\n        createProcessTaskVO.setProcessInstanceNo( command.getProcessInstanceNo() );\n        createProcessTaskVO.setProcessType( command.getProcessType() );\n        createProcessTaskVO.setProductCode( command.getProductCode() );\n        createProcessTaskVO.setTaskBizCode( command.getTaskBizCode() );\n        createProcessTaskVO.setTaskBizName( command.getTaskBizName() );\n        createProcessTaskVO.setTaskType( command.getTaskType() );\n\n        return createProcessTaskVO;\n    }\n\n    public DoExecuteProcessTaskReqVO convert(TaskExecuteCommand command) {\n        if ( command == null ) {\n            return null;\n        }\n\n        DoExecuteProcessTaskReqVO doExecuteProcessTaskReqVO = new DoExecuteProcessTaskReqVO();\n\n        doExecuteProcessTaskReqVO.setExecuteBizData( command.getExecuteBizData() );\n        doExecuteProcessTaskReqVO.setExecuteBizResult( command.getExecuteBizResult() );\n        doExecuteProcessTaskReqVO.setExecutor( command.getExecutor() );\n        List<String> list = command.getGroup2List();\n        if ( list != null ) {\n            doExecuteProcessTaskReqVO.setGroup2List( new ArrayList<String>( list ) );\n        }\n        List<String> list1 = command.getGroupList();\n        if ( list1 != null ) {\n            doExecuteProcessTaskReqVO.setGroupList( new ArrayList<String>( list1 ) );\n        }\n        doExecuteProcessTaskReqVO.setInstanceBizData( command.getInstanceBizData() );\n        doExecuteProcessTaskReqVO.setInstanceBizStatus( command.getInstanceBizStatus() );\n        doExecuteProcessTaskReqVO.setOperation( command.getOperation() );\n        List<TaskOperateCommand> list2 = command.getSubCommandList();\n        if ( list2 != null ) {\n            doExecuteProcessTaskReqVO.setSubCommandList( new ArrayList<TaskOperateCommand>( list2 ) );\n        }\n        doExecuteProcessTaskReqVO.setTaskExtData( command.getTaskExtData() );\n        doExecuteProcessTaskReqVO.setTaskNo( command.getTaskNo() );\n\n        return doExecuteProcessTaskReqVO;\n    }\n\n    protected ProcessTaskDTO taskInfoForPagerVOToProcessTaskDTO(TaskInfoForPagerVO taskInfoForPagerVO) throws ParseException {\n        if ( taskInfoForPagerVO == null ) {\n            return null;\n        }\n\n        ProcessTaskDTO processTaskDTO = new ProcessTaskDTO();\n\n        processTaskDTO.setBizNo( taskInfoForPagerVO.getBizNo() );\n        if ( taskInfoForPagerVO.getCreatedDate() != null ) {\n            processTaskDTO.setCreatedDate( new SimpleDateFormat().parse( taskInfoForPagerVO.getCreatedDate() ) );\n        }\n        processTaskDTO.setCreator( taskInfoForPagerVO.getCreator() );\n        processTaskDTO.setExecuteBizData( taskInfoForPagerVO.getExecuteBizData() );\n        processTaskDTO.setExecuteBizResult( taskInfoForPagerVO.getExecuteBizResult() );\n        if ( taskInfoForPagerVO.getExecuteTime() != null ) {\n            processTaskDTO.setExecuteTime( new SimpleDateFormat().parse( taskInfoForPagerVO.getExecuteTime() ) );\n        }\n        processTaskDTO.setExecutor( taskInfoForPagerVO.getExecutor() );\n        if ( taskInfoForPagerVO.getModifiedDate() != null ) {\n            processTaskDTO.setModifiedDate( new SimpleDateFormat().parse( taskInfoForPagerVO.getModifiedDate() ) );\n        }\n        processTaskDTO.setNodeInstanceNo( taskInfoForPagerVO.getNodeInstanceNo() );\n        processTaskDTO.setProcessInstanceNo( taskInfoForPagerVO.getProcessInstanceNo() );\n        processTaskDTO.setProcessType( taskInfoForPagerVO.getProcessType() );\n        processTaskDTO.setProductCode( taskInfoForPagerVO.getProductCode() );\n        processTaskDTO.setStatus( taskInfoForPagerVO.getStatus() );\n        processTaskDTO.setTaskBizCode( taskInfoForPagerVO.getTaskBizCode() );\n        processTaskDTO.setTaskBizName( taskInfoForPagerVO.getTaskBizName() );\n        processTaskDTO.setTaskNo( taskInfoForPagerVO.getTaskNo() );\n\n        return processTaskDTO;\n    }\n\n    protected ProcessTaskAssignDTO processTaskAssignEntityToProcessTaskAssignDTO(ProcessTaskAssignEntity processTaskAssignEntity) {\n        if ( processTaskAssignEntity == null ) {\n            return null;\n        }\n\n        ProcessTaskAssignDTO processTaskAssignDTO = new ProcessTaskAssignDTO();\n\n        processTaskAssignDTO.setAssignGroup( processTaskAssignEntity.getAssignGroup() );\n        processTaskAssignDTO.setAssignGroup2( processTaskAssignEntity.getAssignGroup2() );\n        processTaskAssignDTO.setAssignNo( processTaskAssignEntity.getAssignNo() );\n        processTaskAssignDTO.setAssignTime( processTaskAssignEntity.getAssignTime() );\n        processTaskAssignDTO.setAssignType( processTaskAssignEntity.getAssignType() );\n        processTaskAssignDTO.setAssignUser( processTaskAssignEntity.getAssignUser() );\n        processTaskAssignDTO.setCreatedDate( processTaskAssignEntity.getCreatedDate() );\n        processTaskAssignDTO.setExtData( processTaskAssignEntity.getExtData() );\n        processTaskAssignDTO.setModifiedDate( processTaskAssignEntity.getModifiedDate() );\n        processTaskAssignDTO.setProductCode( processTaskAssignEntity.getProductCode() );\n        processTaskAssignDTO.setStatus( processTaskAssignEntity.getStatus() );\n        processTaskAssignDTO.setTaskNo( processTaskAssignEntity.getTaskNo() );\n\n        return processTaskAssignDTO;\n    }\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/adapter/export/converter/ProcessToolConverter.java",
    "content": "package com.jd.easyflow.process.adapter.export.converter;\n\nimport com.jd.easyflow.process.adapter.export.dto.instance.RollbackNodeReq;\nimport com.jd.easyflow.process.domain.model.vo.RollbackNodeReqVO;\n\n/**\n * @author liyuliang5\n */\npublic class ProcessToolConverter {\n    \n    public static final ProcessToolConverter INSTANCE = new ProcessToolConverter();\n    \n    public RollbackNodeReqVO convert(RollbackNodeReq req) {\n        if (req == null) {\n            return null;\n        }\n        RollbackNodeReqVO vo = new RollbackNodeReqVO();\n        vo.setProcessInstanceNo(req.getProcessInstanceNo());\n        vo.setRollbackSubProcess(req.isRollbackSubProcess());\n        vo.setRollbackTask(req.isRollbackTask());\n        vo.setTargetNodeId(req.getTargetNodeId());\n        vo.setTargetNodeInstanceNo(req.getTargetNodeInstanceNo());\n        return vo;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/adapter/export/sharding/ProcessInstanceExportShardingImpl.java",
    "content": "package com.jd.easyflow.process.adapter.export.sharding;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.action.Action;\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponse;\nimport com.jd.easyflow.common.adapter.export.dto.pager.PagerCondition;\nimport com.jd.easyflow.common.adapter.export.dto.pager.PagerResult;\nimport com.jd.easyflow.common.adapter.export.util.ExportResponseUtil;\nimport com.jd.easyflow.common.util.AssertUtils;\nimport com.jd.easyflow.process.adapter.export.ProcessInstanceExportImpl;\nimport com.jd.easyflow.process.adapter.export.dto.instance.CanCancelProcessInstanceReq;\nimport com.jd.easyflow.process.adapter.export.dto.instance.CanCancelProcessInstanceRes;\nimport com.jd.easyflow.process.adapter.export.dto.instance.CancelProcessInstanceReq;\nimport com.jd.easyflow.process.adapter.export.dto.instance.CancelProcessInstanceRes;\nimport com.jd.easyflow.process.adapter.export.dto.instance.CreateProcessInstanceReq;\nimport com.jd.easyflow.process.adapter.export.dto.instance.CreateProcessInstanceRes;\nimport com.jd.easyflow.process.adapter.export.dto.instance.LockProcessInstanceReq;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessInstanceDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessNodeExecutionDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessNodeInstanceDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.QueryOpenNodeInstanceReq;\nimport com.jd.easyflow.process.adapter.export.dto.instance.QueryProcessInstanceReq;\nimport com.jd.easyflow.process.adapter.export.dto.instance.QueryProcessNodeReqDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.UnlockProcessInstanceReq;\nimport com.jd.easyflow.process.infrastructure.sharding.ProcessShardingDataQuerier;\nimport com.jd.easyflow.sharding.CurrentShardInfo;\nimport com.jd.easyflow.sharding.service.ExportRequestShardComputer;\nimport com.jd.easyflow.sharding.service.ShardingService;\n\n/**\n * @author liyuliang5\n */\npublic class ProcessInstanceExportShardingImpl extends ProcessInstanceExportImpl {\n    \n    private static final Logger log = LoggerFactory.getLogger(ProcessInstanceExportShardingImpl.class);\n\n    \n    private ProcessShardingDataQuerier shardingDataQuerier;\n    \n    private ShardingService shardingService;\n    \n    private ExportRequestShardComputer shardComputer;\n\n    @Action(code = \"easyflow-process-createProcessInstance\", name = \"createProcessInstance\")\n    public ExportResponse<CreateProcessInstanceRes> createProcessInstance(ExportRequest<CreateProcessInstanceReq> req) {\n        return super.createProcessInstance(req);\n    }\n\n    @Action(code = \"easyflow-process-getProcessInstance\", name = \"getProcessInstance\")\n    @Override\n    public ExportResponse<ProcessInstanceDTO> getProcessInstance(ExportRequest<String> req) {\n        return shardingService.executeInShard(() -> {\n            return shardComputer.computeExportRequestShard(req,  shardingData->{\n                String instanceNo = req.getData();\n                AssertUtils.isNotNull(instanceNo);\n                shardingDataQuerier.fillByProcessInstanceNo(instanceNo, shardingData);\n            });\n        }, () -> {\n            return ExportResponse.build4Success();\n        }, shard -> {\n            return super.getProcessInstance(req);\n        });\n    }\n\n    @Action(code = \"easyflow-process-pagerQueryProcessInstance\", name = \"pagerQueryProcessInstance\")\n    @Override\n    public ExportResponse<PagerResult> pagerQueryProcessInstance(ExportRequest<PagerCondition> req) {\n        if (! shardingService.isShardingEnabled()) {\n            return super.pagerQueryProcessInstance(req);\n        }\n        CurrentShardInfo shardInfo = shardComputer.computeExportRequestShard(req,  shardingData->{\n            PagerCondition condition = req.getData();\n            String processType = condition.getField(\"processType\") == null ? null : (String) condition.getField(\"processType\").getValue();\n            String bizNo = condition.getField(\"bizNo\") == null ? null : (String) condition.getField(\"bizNo\").getValue();\n            String processInstanceNo = condition.getField(\"instanceNo\") == null ? null : (String) condition.getField(\"instanceNo\").getValue();\n            if (processType != null && bizNo != null) {\n                shardingData.setGroup(processType);\n                shardingData.setBizNo(bizNo);\n            } else if (processInstanceNo != null) {\n                shardingDataQuerier.fillByProcessInstanceNo(processInstanceNo, shardingData);\n            } else if (processType != null) {\n               if (shardingService.getShardListOfGroup(processType).size() == 1) {\n                   shardingData.setGroup(processType);\n               }\n            }               \n        });\n        if (shardInfo != null) {\n            req.getData().addSortField(\"instanceNo\", 0, \"desc\");\n            return shardingService.executeInShard(shardInfo, info -> {\n                return super.pagerQueryProcessInstance(req);\n            });\n        } else {\n            return shardingService.parallelExecuteInAllShard(false, shard -> {\n                return super.pagerQueryProcessInstance(req);\n            }, subList -> {\n                long count = 0;\n                List<ProcessInstanceDTO> result = new ArrayList<>();\n                for (ExportResponse<PagerResult> res : subList) {\n                    PagerResult pagerResult = ExportResponseUtil.unwrap(res);\n                    count += pagerResult.getCount() == null ? 0 : pagerResult.getCount();\n                    result.addAll(pagerResult.getList());\n                }\n                Collections.sort(result, (instance1, instance2) -> {\n                    return -instance1.getInstanceNo().compareTo(instance2.getInstanceNo());\n                });\n                PagerResult pagerResult = new PagerResult<>();\n                pagerResult.setCount(count);\n                if (result.size() > req.getData().getPageSize()) {\n                    result = result.subList(0, req.getData().getPageSize());\n                }\n                pagerResult.setList(result);\n                return ExportResponse.build4Success(pagerResult);\n            });\n        }\n    }\n\n    @Action(code = \"easyflow-process-queryProcessNodeInstanceByInstanceNo\", name = \"queryProcessNodeInstanceByInstanceNo\")\n    @Override\n    public ExportResponse<List<ProcessNodeInstanceDTO>> queryProcessNodeInstanceByInstanceNo(\n            ExportRequest<String> req) {\n        return shardingService.executeInShard(() -> {\n            return shardComputer.computeExportRequestShard(req,  shardingData->{\n                String processInstanceNo = req.getData();\n                AssertUtils.isNotNull(processInstanceNo);\n                shardingDataQuerier.fillByProcessInstanceNo(processInstanceNo, shardingData);\n            });\n        }, () -> {\n            return ExportResponse.build4Success(new ArrayList());\n        }, shard -> {\n            return super.queryProcessNodeInstanceByInstanceNo(req);\n        });\n    }\n\n    @Action(code = \"easyflow-process-queryProcessInstanceByProcessTypeAndBizNo\", name = \"queryProcessInstanceByProcessTypeAndBizNo\")\n    @Override\n    public ExportResponse<ProcessInstanceDTO> queryProcessInstanceByProcessTypeAndBizNo(\n            ExportRequest<QueryProcessInstanceReq> req) {\n        return shardingService.executeInShard(() -> {\n            return shardComputer.computeExportRequestShard(req,  shardingData->{\n                String processType = req.getData().getProcessType();\n                String bizNo = req.getData().getBizNo();\n                shardingData.setGroup(processType);\n                shardingData.setBizNo(bizNo);\n            });\n        }, shard -> {\n            return super.queryProcessInstanceByProcessTypeAndBizNo(req);\n        });\n    }\n\n    @Action(code = \"easyflow-process-lockProcessInstance\", name = \"lockProcessInstance\")\n    @Override\n    public ExportResponse<String> lockProcessInstance(ExportRequest<LockProcessInstanceReq> req) {\n        return super.lockProcessInstance(req);\n    }\n\n    @Action(code = \"easyflow-process-unLockProcessInstance\", name = \"unLockProcessInstance\")\n    @Override\n    public ExportResponse<Boolean> unLockProcessInstance(ExportRequest<UnlockProcessInstanceReq> req) {\n        return super.unLockProcessInstance(req);\n    }\n\n    @Action(code = \"easyflow-process-queryOpenNodeInstance\", name = \"queryOpenNodeInstance\")\n    @Override\n    public ExportResponse<ProcessNodeInstanceDTO> queryOpenNodeInstance(\n            ExportRequest<QueryOpenNodeInstanceReq> req) {\n        return shardingService.executeInShard(() -> {\n            return shardComputer.computeExportRequestShard(req,  shardingData->{\n                String instanceNo = req.getData().getInstanceNo();\n                AssertUtils.isNotNull(instanceNo);\n                shardingDataQuerier.fillByProcessInstanceNo(instanceNo, shardingData);\n            });\n        }, ()-> {\n            return ExportResponse.build4Success(null);\n        }, shard -> {\n            return super.queryOpenNodeInstance(req);\n        });\n    }\n\n    @Action(code = \"easyflow-process-findNodeInstances\", name = \"findNodeInstances\")\n    @Override\n    public ExportResponse<List<ProcessNodeInstanceDTO>> findNodeInstances(\n            ExportRequest<QueryProcessNodeReqDTO> req) {\n        return shardingService.executeInShard(() -> {\n            return shardComputer.computeExportRequestShard(req,  shardingData->{\n                String instanceNo = req.getData().getProcessInstanceNo();\n                AssertUtils.isNotNull(instanceNo);\n                shardingDataQuerier.fillByProcessInstanceNo(instanceNo, shardingData);\n            });\n        }, ()-> {\n            return ExportResponse.build4Success(new ArrayList());\n        }, shard -> {\n            return super.findNodeInstances(req);\n        });\n    }\n\n    @Action(code = \"easyflow-process-queryNodeInstanceByNo\", name = \"queryNodeInstanceByNo\")\n    @Override\n    public ExportResponse<ProcessNodeInstanceDTO> queryNodeInstanceByNo(ExportRequest<String> req) {\n        return shardingService.executeInShard(() -> {\n            return shardComputer.computeExportRequestShard(req,  shardingData->{\n                String nodeInstanceNo = req.getData();\n                AssertUtils.isNotNull(nodeInstanceNo);\n                shardingDataQuerier.fillByProcessNodeInstanceNo(nodeInstanceNo, shardingData);\n            });\n        }, ()-> {\n            return ExportResponse.build4Success(null);\n        }, shard -> {\n            return super.queryNodeInstanceByNo(req);\n        });\n    }\n\n    @Action(code = \"easyflow-process-queryNodeExecutionByNo\", name = \"queryNodeExecutionByNo\")\n    @Override\n    public ExportResponse<ProcessNodeExecutionDTO> queryNodeExecutionByNo(ExportRequest<String> req) {\n        return shardingService.executeInShard(() -> {\n            return shardComputer.computeExportRequestShard(req,  shardingData->{\n                String nodeInstanceNo = req.getData();\n                AssertUtils.isNotNull(nodeInstanceNo);\n                shardingDataQuerier.fillByProcessNodeInstanceNo(nodeInstanceNo, shardingData);\n            });\n        }, ()-> {\n            return ExportResponse.build4Success(null);\n        }, shard -> {\n            return super.queryNodeExecutionByNo(req);\n        });\n    }\n\n    @Action(code = \"easyflow-process-updateProcessInstance\", name = \"updateProcessInstance\")\n    @Override\n    public ExportResponse<Object> updateProcessInstance(ExportRequest<ProcessInstanceDTO> req) {\n        return shardingService.executeInShard(() -> {\n            return shardComputer.computeExportRequestShard(req,  shardingData->{\n                String processInstanceNo = req.getData().getInstanceNo();\n                AssertUtils.isNotNull(processInstanceNo);\n                shardingDataQuerier.fillByProcessInstanceNo(processInstanceNo, shardingData);\n            });\n        }, ()-> {\n            throw new IllegalArgumentException(\"instance not exists\");\n        }, shard -> {\n            return super.updateProcessInstance(req);\n        });\n    }\n\n    @Action(code = \"easyflow-process-queryActiveProcessInstanceByProcessTypeAndBizNo\", name = \"queryActiveProcessInstanceByProcessTypeAndBizNo\")\n    @Override\n    public ExportResponse<ProcessInstanceDTO> queryActiveProcessInstanceByProcessTypeAndBizNo(\n            ExportRequest<QueryProcessInstanceReq> req) {\n        return shardingService.executeInShard(() -> {\n            return shardComputer.computeExportRequestShard(req,  shardingData->{\n                shardingData.setGroup(req.getData().getProcessType());\n                shardingData.setBizNo(req.getData().getBizNo());\n            });\n        }, shard -> {\n            return super.queryActiveProcessInstanceByProcessTypeAndBizNo(req);\n        });\n    }\n\n    @Action(code = \"easyflow-process-canCancel\", name = \"canCancel\")\n    @Override\n    public ExportResponse<CanCancelProcessInstanceRes> canCancel(ExportRequest<CanCancelProcessInstanceReq> req) {\n        return shardingService.executeInShard(() -> {\n            return shardComputer.computeExportRequestShard(req,  shardingData->{\n                String instanceNo = req.getData().getInstanceNo();\n                AssertUtils.isNotNull(instanceNo);\n                shardingDataQuerier.fillByProcessInstanceNo(instanceNo, shardingData);\n            });\n        }, shard -> {\n            return super.canCancel(req);\n        });\n    }\n\n    @Action(code = \"easyflow-process-cancel\", name = \"cancel\")\n    @Override\n    public ExportResponse<CancelProcessInstanceRes> cancel(ExportRequest<CancelProcessInstanceReq> req) {\n        return shardingService.executeInShard(() -> {\n            return shardComputer.computeExportRequestShard(req,  shardingData->{\n                String instanceNo = req.getData().getInstanceNo();\n                AssertUtils.isNotNull(instanceNo);\n                shardingDataQuerier.fillByProcessInstanceNo(instanceNo, shardingData);\n            });\n        }, shard -> {\n            return super.cancel(req);\n        });\n    }\n\n    @Override\n    @Action(code = \"easyflow-process-queryInstanceByInstanceNos\", name = \"queryInstanceByInstanceNos\")\n    public ExportResponse<List<ProcessInstanceDTO>> queryInstanceByInstanceNos(ExportRequest<List<String>> request) {\n        if (! shardingService.isShardingEnabled()) {\n            return super.queryInstanceByInstanceNos(request);\n        }\n        CurrentShardInfo shard =shardComputer.computeExportRequestShard(request,  shardingData->{\n            if (request.getData().size() == 1) {\n            shardingDataQuerier.fillByProcessInstanceNo(request.getData().get(0), shardingData);\n            }\n        });\n        if (shard != null) {\n            return shardingService.executeInShard(shard, info -> {\n                return super.queryInstanceByInstanceNos(request);\n            });\n        } else {\n            return shardingService.parallelExecuteInAllShard(false, shardInfo -> {\n                return super.queryInstanceByInstanceNos(request);\n            }, subList -> {\n                List<ProcessInstanceDTO> result = new ArrayList<ProcessInstanceDTO>();\n                for (ExportResponse<List<ProcessInstanceDTO>> res : subList) {\n                    result.addAll(res.getData());\n                }\n                return ExportResponse.build4Success(result);\n            });\n        }\n    }\n\n    @Action(code = \"easyflow-process-queryNodeInstanceByNos\", name = \"queryNodeInstanceByNos\")\n    @Override\n    public ExportResponse<List<ProcessNodeInstanceDTO>> queryNodeInstanceByNos(ExportRequest<List<String>> request) {\n        if (! shardingService.isShardingEnabled()) {\n            return super.queryNodeInstanceByNos(request);\n        }\n        CurrentShardInfo shard =shardComputer.computeExportRequestShard(request,  shardingData->{\n            if (request.getData().size() == 1) {\n            shardingDataQuerier.fillByProcessNodeInstanceNo(request.getData().get(0), shardingData);\n            }\n        });\n        if (shard != null) {\n            return shardingService.executeInShard(shard, info -> {\n                return super.queryNodeInstanceByNos(request);\n            });\n        } else {\n            return shardingService.parallelExecuteInAllShard(false, shardInfo -> {\n                return super.queryNodeInstanceByNos(request);\n            }, subList -> {\n                List<ProcessNodeInstanceDTO> result = new ArrayList<ProcessNodeInstanceDTO>();\n                for (ExportResponse<List<ProcessNodeInstanceDTO>> res : subList) {\n                    result.addAll(res.getData());\n                }\n                return ExportResponse.build4Success(result);\n            });\n        }\n    }\n    \n    @Action(code = \"easyflow-process-queryProcessInstanceByParentInstanceNo\", name = \"queryProcessInstanceByParentInstanceNo\")\n    @Override\n    public ExportResponse<List<ProcessInstanceDTO>> queryProcessInstanceByParentInstanceNo(ExportRequest<String> request) {\n        if (! shardingService.isShardingEnabled()) {\n            return super.queryProcessInstanceByParentInstanceNo(request);\n        }\n        CurrentShardInfo shard =shardComputer.computeExportRequestShard(request,  shardingData->{\n        });\n        if (shard != null) {\n            return shardingService.executeInShard(shard, info -> {\n                return super.queryProcessInstanceByParentInstanceNo(request);\n            });\n        } else {\n            return shardingService.parallelExecuteInAllShard(false, shardInfo -> {\n                return super.queryProcessInstanceByParentInstanceNo(request);\n            }, subList -> {\n                List<ProcessInstanceDTO> result = new ArrayList<ProcessInstanceDTO>();\n                for (ExportResponse<List<ProcessInstanceDTO>> res : subList) {\n                    result.addAll(res.getData());\n                }\n                return ExportResponse.build4Success(result);\n            });\n        }\n    }\n    \n    @Action(code = \"easyflow-process-pagerQueryNodeExecution\", name = \"pagerQueryNodeExecution\")\n    @Override\n    public ExportResponse<PagerResult> pagerQueryNodeExecution(ExportRequest<PagerCondition> req) {\n        if (! shardingService.isShardingEnabled()) {\n            return super.pagerQueryNodeExecution(req);\n        }\n        CurrentShardInfo shard =shardComputer.computeExportRequestShard(req,  shardingData->{\n            PagerCondition condition = req.getData();\n            List<String> nodeInstanceNoList = condition.getField(\"nodeInstanceNoList\") == null ? null : (List<String>) condition.getField(\"nodeInstanceNoList\").getValue();\n            String nodeExecutionNo = condition.getField(\"nodeExecutionNo\") == null ? null : (String) condition.getField(\"nodeExecutionNo\").getValue();\n            if (nodeInstanceNoList != null && nodeInstanceNoList.size() == 1) {\n                shardingDataQuerier.fillByProcessNodeInstanceNo(nodeInstanceNoList.get(0), shardingData);\n            } else if (nodeExecutionNo != null) {\n                shardingDataQuerier.fillByProcessNodeExecutionNo(nodeExecutionNo, shardingData);\n            } else {\n                throw new UnsupportedOperationException();\n            }\n        });\n        if (shard != null) {\n            return shardingService.executeInShard(shard, info -> {\n                return super.pagerQueryNodeExecution(req);\n            });\n        }\n        throw new UnsupportedOperationException();\n    }\n\n    public ProcessShardingDataQuerier getShardingDataQuerier() {\n        return shardingDataQuerier;\n    }\n\n\n    public void setShardingDataQuerier(ProcessShardingDataQuerier shardingDataQuerier) {\n        this.shardingDataQuerier = shardingDataQuerier;\n    }\n\n    public ShardingService getShardingService() {\n        return shardingService;\n    }\n\n    public void setShardingService(ShardingService shardingService) {\n        this.shardingService = shardingService;\n    }\n\n    public ExportRequestShardComputer getShardComputer() {\n        return shardComputer;\n    }\n\n    public void setShardComputer(ExportRequestShardComputer shardComputer) {\n        this.shardComputer = shardComputer;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/adapter/export/sharding/ProcessTaskExportShardingImpl.java",
    "content": "package com.jd.easyflow.process.adapter.export.sharding;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\n\nimport com.jd.easyflow.action.Action;\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponse;\nimport com.jd.easyflow.common.adapter.export.dto.pager.PagerCondition;\nimport com.jd.easyflow.common.adapter.export.dto.pager.PagerResult;\nimport com.jd.easyflow.common.adapter.export.util.ExportResponseUtil;\nimport com.jd.easyflow.common.util.AssertUtils;\nimport com.jd.easyflow.process.adapter.export.ProcessTaskExportImpl;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessInstanceDTO;\nimport com.jd.easyflow.process.adapter.export.dto.task.CanWithdrawTaskReq;\nimport com.jd.easyflow.process.adapter.export.dto.task.CanWithdrawTaskRes;\nimport com.jd.easyflow.process.adapter.export.dto.task.ExecuteTaskReq;\nimport com.jd.easyflow.process.adapter.export.dto.task.ExecuteTaskRes;\nimport com.jd.easyflow.process.adapter.export.dto.task.ProcessTaskAssignDTO;\nimport com.jd.easyflow.process.adapter.export.dto.task.ProcessTaskDTO;\nimport com.jd.easyflow.process.adapter.export.dto.task.QueryTaskReq;\nimport com.jd.easyflow.process.adapter.export.dto.task.TaskOperationsReq;\nimport com.jd.easyflow.process.adapter.export.dto.task.TaskOperationsRes;\nimport com.jd.easyflow.process.adapter.export.dto.task.WithdrawTaskReq;\nimport com.jd.easyflow.process.adapter.export.dto.task.WithdrawTaskRes;\nimport com.jd.easyflow.process.infrastructure.sharding.ProcessShardingDataQuerier;\nimport com.jd.easyflow.sharding.CurrentShardInfo;\nimport com.jd.easyflow.sharding.service.ExportRequestShardComputer;\nimport com.jd.easyflow.sharding.service.ShardingService;\n\n/**\n * @author liyuliang5\n */\npublic class ProcessTaskExportShardingImpl extends ProcessTaskExportImpl {\n    \n    \n    private ProcessShardingDataQuerier shardingDataQuerier;\n    \n    private ShardingService shardingService;\n    \n    private ExportRequestShardComputer shardComputer;\n    \n    @Action(code = \"easyflow-process-executeTask\", name = \"executeTask\")\n    @Override\n    public ExportResponse<ExecuteTaskRes> executeTask(ExportRequest<ExecuteTaskReq> req) {\n        return shardingService.executeInShard(() -> {\n            return shardComputer.computeExportRequestShard(req,  shardingData->{\n                String taskNo = req.getData().getTaskNo();\n                AssertUtils.isNotNull(taskNo);\n                shardingDataQuerier.fillByTaskNo(taskNo, shardingData);\n            });\n        }, shard -> {\n            return super.executeTask(req);\n        });\n    }\n\n    @Action(code = \"easyflow-process-pagerQueryTask\", name = \"pagerQueryTask\")\n    @Override\n    public ExportResponse<PagerResult> pagerQueryTask(ExportRequest<PagerCondition> req) {\n        if (! shardingService.isShardingEnabled()) {\n            return super.pagerQueryTask(req);\n        }\n        CurrentShardInfo shardInfo = shardComputer.computeExportRequestShard(req,  shardingData->{\n            PagerCondition condition = req.getData();\n            String processType = condition.getField(\"processType\") == null ? null : (String) condition.getField(\"processType\").getValue();\n            String bizNo = condition.getField(\"bizNo\") == null ? null : (String) condition.getField(\"bizNo\").getValue();\n            String processInstanceNo = condition.getField(\"processInstanceNo\") == null ? null : (String) condition.getField(\"processInstanceNo\").getValue();\n            String nodeInstanceNo = condition.getField(\"nodeInstanceNo\") == null ? null : (String) condition.getField(\"nodeInstanceNo\").getValue();\n            if (processType != null && bizNo != null) {\n                shardingData.setGroup(processType);\n                shardingData.setBizNo(bizNo);\n            } else if (processInstanceNo != null) {\n                shardingDataQuerier.fillByProcessInstanceNo(processInstanceNo, shardingData);\n            } else if (nodeInstanceNo != null) {\n                shardingDataQuerier.fillByProcessNodeInstanceNo(nodeInstanceNo, shardingData);\n            } else if (processType != null) {\n               if (shardingService.getShardListOfGroup(processType).size() == 1) {\n                   shardingData.setGroup(processType);\n               }\n            } \n        });\n        if (shardInfo != null ) {\n            return shardingService.executeInShard(shardInfo, shard -> {\n                return super.pagerQueryTask(req);\n            });\n        } else {\n            req.getData().addSortField(\"taskNo\", 0, \"desc\");\n            return shardingService.parallelExecuteInAllShard(false, info -> {\n                return super.pagerQueryTask(req);\n            }, subList -> {\n                long count = 0;\n                List<ProcessTaskDTO> result = new ArrayList<>();\n                for (ExportResponse<PagerResult> res : subList) {\n                    PagerResult pagerResult = ExportResponseUtil.unwrap(res);\n                    count += pagerResult.getCount() == null ? 0 : pagerResult.getCount();\n                    result.addAll(pagerResult.getList());\n                }\n                Collections.sort(result, (task1, task2) -> {\n                    return -task1.getTaskNo().compareTo(task2.getTaskNo());\n                });\n                PagerResult pagerResult = new PagerResult<>();\n                pagerResult.setCount(count);\n                if (result.size() > req.getData().getPageSize()) {\n                    result = result.subList(0, req.getData().getPageSize());\n                }\n                pagerResult.setList(result);\n\n                return ExportResponse.build4Success(pagerResult);\n            });\n        }\n    }\n\n    @Action(code = \"easyflow-process-getTask\", name = \"getTask\")\n    @Override\n    public ExportResponse<ProcessTaskDTO> getTask(ExportRequest<String> req) {\n        return shardingService.executeInShard(() -> {\n            return shardComputer.computeExportRequestShard(req,  shardingData->{\n                String taskNo = req.getData();\n                AssertUtils.isNotNull(taskNo);\n                shardingDataQuerier.fillByTaskNo(taskNo, shardingData);\n            });\n        }, ()-> {\n            return ExportResponse.build4Success();\n        }, shard -> {\n            return super.getTask(req);\n        });\n    }\n\n    @Action(code = \"easyflow-process-queryTask\", name = \"queryTask\")\n    @Override\n    public ExportResponse<List<ProcessTaskDTO>> queryTask(ExportRequest<QueryTaskReq> req) {\n        return shardingService.executeInShard(() -> {\n            return shardComputer.computeExportRequestShard(req,  shardingData->{\n                QueryTaskReq query = req.getData();\n                if (query.getProcessType() != null && query.getBizNo() != null) {\n                    shardingData.setGroup(query.getProcessType());\n                    shardingData.setBizNo(query.getBizNo());\n                } else if (query.getProcessInstanceNo() != null) {\n                    shardingDataQuerier.fillByProcessInstanceNo(query.getProcessInstanceNo(), shardingData);\n                } else if (query.getNodeInstanceNo() != null) {\n                    shardingDataQuerier.fillByProcessNodeInstanceNo(query.getNodeInstanceNo(), shardingData);\n                } else if (query.getProcessType() != null) {\n                   if (shardingService.getShardListOfGroup(query.getProcessType()).size() == 1) {\n                       shardingData.setGroup(query.getProcessType());\n                   } \n                }\n            });\n        }, shard -> {\n            return super.queryTask(req);\n        });\n    }\n\n    @Action(code = \"easyflow-process-canWithdraw\", name = \"canWithdraw\")\n    @Override\n    public ExportResponse<CanWithdrawTaskRes> canWithdraw(ExportRequest<CanWithdrawTaskReq> req) {\n        return shardingService.executeInShard(() -> {\n            return shardComputer.computeExportRequestShard(req,  shardingData->{\n                String taskNo = req.getData().getTaskNo();\n                AssertUtils.isNotNull(taskNo);\n                shardingDataQuerier.fillByTaskNo(taskNo, shardingData);\n            });\n        }, shard -> {\n            return super.canWithdraw(req);\n        });\n    }\n\n    @Action(code = \"easyflow-process-withDraw\", name = \"withDraw\")\n    @Override\n    public ExportResponse<WithdrawTaskRes> withDraw(ExportRequest<WithdrawTaskReq> req) {\n        return shardingService.executeInShard(() -> {\n            return shardComputer.computeExportRequestShard(req,  shardingData->{\n                String taskNo = req.getData().getTaskNo();\n                AssertUtils.isNotNull(taskNo);\n                shardingDataQuerier.fillByTaskNo(taskNo, shardingData);\n            });\n        }, shard -> {\n            return super.withDraw(req);\n        });\n    }\n\n    @Action(code = \"easyflow-process-doExecuteOperations\", name = \"doExecuteOperations\")\n    @Override\n    public ExportResponse<TaskOperationsRes> doExecuteOperations(ExportRequest<TaskOperationsReq> req) {\n        return super.doExecuteOperations(req);\n    }\n\n    @Action(code = \"easyflow-process-findTaskAssignListByTaskNo\", name = \"findTaskAssignListByTaskNo\")\n    @Override\n    public ExportResponse<List<ProcessTaskAssignDTO>> findTaskAssignListByTaskNo(ExportRequest<String> req) {\n        return shardingService.executeInShard(() -> {\n            return shardComputer.computeExportRequestShard(req,  shardingData->{\n                String taskNo = req.getData();\n                AssertUtils.isNotNull(taskNo);\n                shardingDataQuerier.fillByTaskNo(taskNo, shardingData);\n            });\n        }, shard -> {\n            return super.findTaskAssignListByTaskNo(req);\n        });\n    }\n\n    public ProcessShardingDataQuerier getShardingDataQuerier() {\n        return shardingDataQuerier;\n    }\n\n    public void setShardingDataQuerier(ProcessShardingDataQuerier shardingDataQuerier) {\n        this.shardingDataQuerier = shardingDataQuerier;\n    }\n\n    public ShardingService getShardingService() {\n        return shardingService;\n    }\n\n    public void setShardingService(ShardingService shardingService) {\n        this.shardingService = shardingService;\n    }\n\n    public ExportRequestShardComputer getShardComputer() {\n        return shardComputer;\n    }\n\n    public void setShardComputer(ExportRequestShardComputer shardComputer) {\n        this.shardComputer = shardComputer;\n    }\n    \n\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/adapter/export/sharding/ProcessToolExportShardingImpl.java",
    "content": "package com.jd.easyflow.process.adapter.export.sharding;\n\nimport com.jd.easyflow.action.Action;\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponse;\nimport com.jd.easyflow.common.util.AssertUtils;\nimport com.jd.easyflow.process.adapter.export.ProcessToolExportImpl;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessInstanceDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessNodeInstanceDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.RollbackNodeReq;\nimport com.jd.easyflow.process.adapter.export.dto.instance.RollbackNodeRes;\nimport com.jd.easyflow.process.infrastructure.sharding.ProcessShardingDataQuerier;\nimport com.jd.easyflow.sharding.service.ExportRequestShardComputer;\nimport com.jd.easyflow.sharding.service.ShardingService;\n\n/**\n * @author liyuliang5\n */\npublic class ProcessToolExportShardingImpl extends ProcessToolExportImpl {\n    \n    private ProcessShardingDataQuerier shardingDataQuerier;\n    \n    private ShardingService shardingService;\n    \n    private ExportRequestShardComputer shardComputer;\n    \n    @Action(code = \"easyflow-process-rollbackNode\", name = \"rollbackNode\")\n    @Override\n    public ExportResponse<RollbackNodeRes> rollbackNode(ExportRequest<RollbackNodeReq> request) {\n        return shardingService.executeInShard(() -> {\n            return shardComputer.computeExportRequestShard(request,  shardingData->{\n                String processInstanceNo = request.getData().getProcessInstanceNo();\n                AssertUtils.isNotNull(processInstanceNo);\n                shardingDataQuerier.fillByProcessInstanceNo(processInstanceNo, shardingData);\n            });\n        }, shard -> {\n            return super.rollbackNode(request);\n        });\n    }\n    \n    @Action(code = \"easyflow-process-updateProcessInstance\", name = \"updateProcessInstance\")\n    @Override\n    public ExportResponse updateProcessInstance(ExportRequest<ProcessInstanceDTO> request) {\n        return shardingService.executeInShard(() -> {\n            return shardComputer.computeExportRequestShard(request,  shardingData->{\n                String processInstanceNo = request.getData().getInstanceNo();\n                AssertUtils.isNotNull(processInstanceNo);\n                shardingDataQuerier.fillByProcessInstanceNo(processInstanceNo, shardingData);\n            });\n        }, shard -> {\n            return super.updateProcessInstance(request);\n        });\n    }\n\n\n    @Action(code = \"easyflow-process-updateProcessNodeInstance\", name = \"updateProcessNodeInstance\")\n    @Override\n    public ExportResponse updateProcessNodeInstance(ExportRequest<ProcessNodeInstanceDTO> request) {\n        return shardingService.executeInShard(() -> {\n            return shardComputer.computeExportRequestShard(request,  shardingData->{\n                String nodeInstanceNo = request.getData().getNodeInstanceNo();\n                AssertUtils.isNotNull(nodeInstanceNo);\n                shardingDataQuerier.fillByProcessNodeInstanceNo(nodeInstanceNo, shardingData);\n            });\n        }, shard -> {\n            return super.updateProcessNodeInstance(request);\n        });\n    }\n\n    @Action(code = \"easyflow-process-deleteProcessNodeInstance\", name = \"deleteProcessNodeInstance\")\n    @Override\n    public ExportResponse deleteProcessNodeInstance(ExportRequest<String> request) {\n        return shardingService.executeInShard(() -> {\n            return shardComputer.computeExportRequestShard(request,  shardingData->{\n                String nodeInstanceNo = request.getData();\n                AssertUtils.isNotNull(nodeInstanceNo);\n                shardingDataQuerier.fillByProcessNodeInstanceNo(nodeInstanceNo, shardingData);\n            });\n        }, shard -> {\n            return super.deleteProcessNodeInstance(request);\n        });\n    }\n\n    public ProcessShardingDataQuerier getShardingDataQuerier() {\n        return shardingDataQuerier;\n    }\n\n    public void setShardingDataQuerier(ProcessShardingDataQuerier shardingDataQuerier) {\n        this.shardingDataQuerier = shardingDataQuerier;\n    }\n\n\n    public ExportRequestShardComputer getShardComputer() {\n        return shardComputer;\n    }\n\n    public void setShardComputer(ExportRequestShardComputer shardComputer) {\n        this.shardComputer = shardComputer;\n    }\n\n    public ShardingService getShardingService() {\n        return shardingService;\n    }\n\n    public void setShardingService(ShardingService shardingService) {\n        this.shardingService = shardingService;\n    }\n    \n    \n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/adapter/export/sharding/ProcessTransactionExportShardingImpl.java",
    "content": "package com.jd.easyflow.process.adapter.export.sharding;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.UUID;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.action.Action;\nimport com.jd.easyflow.alert.AlertUtil;\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponse;\nimport com.jd.easyflow.process.adapter.export.ProcessTransactionExportImpl;\nimport com.jd.easyflow.process.adapter.export.dto.transaction.BatchObjectIdReq;\nimport com.jd.easyflow.process.adapter.export.dto.transaction.BatchObjectIdRes;\nimport com.jd.easyflow.process.adapter.export.dto.transaction.TxnReq;\nimport com.jd.easyflow.process.adapter.export.dto.transaction.TxnRes;\nimport com.jd.easyflow.process.domain.constant.ProcessConstants;\nimport com.jd.easyflow.process.infrastructure.sharding.ProcessShardingDataQuerier;\nimport com.jd.easyflow.sharding.service.ExportRequestShardComputer;\nimport com.jd.easyflow.sharding.service.ShardingService;\n\n/**\n * @author liyuliang5\n */\npublic class ProcessTransactionExportShardingImpl extends ProcessTransactionExportImpl {\n\n    private static final Logger log = LoggerFactory.getLogger(ProcessTransactionExportShardingImpl.class);\n\n    private ProcessShardingDataQuerier shardingDataQuerier;\n\n    private ShardingService shardingService;\n\n    private ExportRequestShardComputer shardComputer;\n\n    @Action(code = \"easyflow-process-nextObjectId\", name = \"nextObjectId\")\n    @Override\n    public ExportResponse<String> nextObjectId(ExportRequest<String> request) {\n        return super.nextObjectId(request);\n    }\n\n    @Action(code = \"easyflow-process-batchNextObjectId\", name = \"batchNextObjectId\")\n    @Override\n    public ExportResponse<BatchObjectIdRes> batchNextObjectId(ExportRequest<BatchObjectIdReq> request) {\n        return super.batchNextObjectId(request);\n    }\n\n    @Action(code = \"easyflow-process-doTransaction\", name = \"doTransaction\")\n    @Override\n    public ExportResponse<TxnRes> doTransaction(ExportRequest<TxnReq> req) {\n        return shardingService.executeInShard(() -> {\n            return shardComputer.computeExportRequestShard(req, shardingData -> {\n                throw new IllegalArgumentException(\"no shard info\");\n            });\n        }, shard -> {\n            List<Map<String, Object>> postActionList = new ArrayList<>();\n            TxnRes response = transactionTemplate.execute(status -> {\n                return executeTransaction(req.getData(), postActionList);\n            });\n            for (Map<String, Object> action : postActionList) {\n                String type = (String) action.get(\"type\");\n                if (ProcessConstants.TXN_ACTION_MERGE_ASYNC.equals(type)) {\n                    List<Runnable> tasks = (List<Runnable>) action.get(\"tasks\");\n                    executor.execute(() -> {\n                        shardingService.executeInShard(shard, shardInfo -> {\n                            if (log.isDebugEnabled()) {\n                                log.debug(\"Start async process\");\n                            }\n                            try {\n                                tasks.forEach(task -> task.run());\n                                if (log.isDebugEnabled()) {\n                                    log.debug(\"End async process\");\n                                }\n                            } catch (Exception e) {\n                                AlertUtil.alert(\"Async process exception\", e);\n                            }\n                            return null;\n                        });\n                    });\n                } else {\n                    String topic = (String) action.get(\"topic\");\n                    String bizData = (String) action.get(\"bizData\");\n                    messageSendService.sendMessage(UUID.randomUUID().toString(), topic, bizData);\n                }\n            }\n            return ExportResponse.build4Success(response);\n        });\n\n    }\n\n    public ProcessShardingDataQuerier getShardingDataQuerier() {\n        return shardingDataQuerier;\n    }\n\n    public void setShardingDataQuerier(ProcessShardingDataQuerier shardingDataQuerier) {\n        this.shardingDataQuerier = shardingDataQuerier;\n    }\n\n    public ExportRequestShardComputer getShardComputer() {\n        return shardComputer;\n    }\n\n    public void setShardComputer(ExportRequestShardComputer shardComputer) {\n        this.shardComputer = shardComputer;\n    }\n\n    public ShardingService getShardingService() {\n        return shardingService;\n    }\n\n    public void setShardingService(ShardingService shardingService) {\n        this.shardingService = shardingService;\n    }\n\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/domain/constant/ProcessConstants.java",
    "content": "package com.jd.easyflow.process.domain.constant;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessConstants {\n\n    public static final String BEAN_LOCKER = \"easyflow-process-locker\";\n    public static final String BEAN_CACHE_SERVICE = \"easyflow-process-cacheService\";\n    public static final String BEAN_NEW_TX_TEMPLATE = \"easyflow-process-newTransactionTemplate\";\n    public static final String BEAN_TX_MANAGER = \"easyflow-process-transactionManager\";\n    public static final String BEAN_MESSAGE_SERVICE = \"easyflow-process-messageSendService\";\n    public static final String TOPIC_PROCESS_INSTANCE_STATUS = \"${easyflow.process.processInstanceStatusTopic:easyflow_process_processInstanceStatus}\";\n    public static final String TOPIC_NODE_INSTANCE_STATUS = \"${easyflow.process.nodeInstanceStatusTopic:easyflow_process_nodeInstanceStatus}\";\n    public static final String CREATED_DATE_POLICY = \"${easyflow.process.createdDatePolicy:client}\";\n    \n    public static final String CREATED_DATE_POLICY_CLIENT = \"client\";\n    public static final String CREATED_DATE_POLICY_SERVER = \"server\";\n    public static final String CREATED_DATE_POLICY_DB = \"db\";\n    \n    public static final String TXN_ACTION_MSG = \"msg\";\n    public static final String TXN_ACTION_MERGE_ASYNC = \"mergeAsync\";\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/domain/constant/ProcessDefinitionConstants.java",
    "content": "package com.jd.easyflow.process.domain.constant;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessDefinitionConstants {\n\n    public static final String VERSION_SEP = \"--V_\";\n    \n    public static final String FLOW_PREFIX = \"FLOW-\";\n    \n    public static final String FSM_PREFIX = \"FSM-\";\n    \n    public static final String PROCESS_FORMAT_FLOW_EASY = \"FLOW-easy\";\n    \n    public static final String PROCESS_FORMAT_FLOW_BPMN = \"FLOW-bpmn\";\n    \n    public static final String PROCESS_FORMAT_FSM_EASY = \"FSM-easy\";\n    \n    public static final String EXT_DATA_KEY_MAIN_PROCESS_ID = \"mainProcessId\";\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/domain/constant/ProcessTaskConstants.java",
    "content": "package com.jd.easyflow.process.domain.constant;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessTaskConstants {\n\n    public static final String ASSIGN_TYPE_USER = \"USER\";\n    \n    public static final String ASSIGN_TYPE_GROUP = \"GROUP\";\n    \n    public static final String ASSIGN_STATUS_PENDING = \"PENDING\";\n    \n    public static final String ASSIGN_STATUS_FINISH = \"FINISH\";\n    \n    public static final String TASK_STATUS_PENDING = \"PENDING\";\n    \n    public static final String TASK_STATUS_INVALID = \"INVALID\";\n    \n    public static final String TASK_STATUS_FINISH = \"FINISH\";\n\n    public static final String TASK_STATUS_CANCELED = \"CANCELED\";\n\n    public static final String PARAM_TASK_TASKNO = \"task.taskNo\";\n    public static final String PARAM_TASK_GROUP_LIST = \"task.groupList\";\n    public static final String PARAM_TASK_GROUP2_LIST = \"task.group2List\";\n    \n    public static final String PARAM_TASK_EXECUTE_RESULT = \"task.executeBizResult\";\n    \n    public static final String PARAM_TASK_EXECUTE_DATA = \"task.executeBizData\";\n    \n    public static final String PARAM_TASK_INSTANCE_BIZ_DATA = \"task.instanceBizData\";\n    \n    public static final String PARAM_TASK_INSTANCE_BIZ_STATUS = \"task.instanceBizStatus\";\n    \n    public static final String PARAM_TASK_EXECUTE_CMDLIST_STR = \"task.executeCmdListStr\";\n    \n    public static final String PARAM_TASK_OPERATION = \"task.operation\";\n    public static final String PARAM_TASK_EXT_DATA = \"task.extData\";\n    \n    \n    /*EventType*/\n    public static final String TASK_EVENT_CREATE = \"CREATE\";\n    \n    public static final String TASK_EVENT_EXECUTE = \"EXECUTE\";\n    \n    public static final String TASK_EVENT_INVALID_FOR_WITHDRAW = \"INVALID_FOR_WITHDRAW\";\n    \n    public static final String TASK_EVENT_WITHDRAW = \"WITHDRAW\";\n\n    public static final String TASK_EVENT_CANCELED = \"CANCELED\";\n\n\n    public static final String NODE_PROP_TASK_KEY = \"task\";\n\n    public static final String TASK_PROP_WITHDRAW = \"withdraw\";\n    public static final String TASK_PROP_WITHDRAW_ENABLE = \"enable\";\n    \n    public static final String COMMAND_TYPE_CREATE_TASK = \"createTask\";\n    \n    public static final String COMMAND_TYPE_CREATE_MULTIPLE_TASK = \"createMultipleTask\";\n    \n    public static final String COMMAND_TYPE_EXECUTE_TASK = \"executeTask\";\n    \n    public static final String TOPIC_TASK_STATUS = \"${easyflow.task.taskStatusTopic:easyflow_task_taskStatus}\";\n\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/domain/constant/StdProcessConstants.java",
    "content": "package com.jd.easyflow.process.domain.constant;\n\n/**\n * @author liyuliang5\n *\n */\npublic class StdProcessConstants {\n\n\n    public static final String PARAM_INSTANCENO = \"_PROCESS_INSTANCE_NO\";\n    public static final String PARAM_INSTANCE_NAME = \"_PROCESS_INSTANCE_NAME\";\n    public static final String PARAM_BIZ_STATUS = \"_PROCESS_BIZ_STATUS\";\n    public static final String PARAM_BIZ_DATA = \"_PROCESS_BIZ_DATA\";\n    public static final String PARAM_OP_TYPE = \"_PROCESS_OP_TYPE\";\n    public static final String PARAM_BIZNO = \"_BIZNO\";\n    public static final String PARAM_PROCESS_TYPE = \"_PROCESS_TYPE\";\n    public static final String PARAM_USER = \"_USER\";\n    public static final String PARAM_PRODUCT_CODE = \"_PRODUCT_CODE\";\n    public static final String PARAM_KEY_FIELD = \"_KEY_FIELD\";\n\n    public static final String PARAM_KEY_FIELD2 = \"_KEY_FIELD2\";\n    public static final String PARAM_EXT_DATA = \"_EXT_DATA\";\n    \n    public static final String OP_TYPE_CREATE = \"CREATE\";\n    public static final String OP_TYPE_EXECUTE = \"EXECUTE\";\n    public static final String OP_TYPE_CREATE_OR_EXECUTE = \"CREATE_OR_EXECUTE\";\n   \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/domain/converter/ProcessInstanceDomainConverter.java",
    "content": "package com.jd.easyflow.process.domain.converter;\n\nimport com.jd.easyflow.process.adapter.export.dto.instance.CanCancelProcessInstanceReq;\nimport com.jd.easyflow.process.adapter.export.dto.instance.CancelProcessInstanceReq;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessInstanceDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessNodeExecutionDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessNodeInstanceDTO;\nimport com.jd.easyflow.process.adapter.message.ProcessInstanceStatusMessage;\nimport com.jd.easyflow.process.adapter.message.ProcessNodeInstanceStatusMessage;\nimport com.jd.easyflow.process.domain.model.entity.ProcessInstanceEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessNodeExecutionEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessNodeInstanceEntity;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessInstanceDomainConverter {\n\n    public static ProcessInstanceDomainConverter INSTANCE = new ProcessInstanceDomainConverter();\n\n\n    public ProcessInstanceEntity convert(ProcessInstanceDTO dto) {\n        if ( dto == null ) {\n            return null;\n        }\n\n        ProcessInstanceEntity processInstanceEntity = new ProcessInstanceEntity();\n\n        processInstanceEntity.setBizData( dto.getBizData() );\n        processInstanceEntity.setBizNo( dto.getBizNo() );\n        processInstanceEntity.setBizStatus( dto.getBizStatus() );\n        processInstanceEntity.setCreatedDate( dto.getCreatedDate() );\n        processInstanceEntity.setCreator( dto.getCreator() );\n        processInstanceEntity.setCurrentNodeIds( dto.getCurrentNodeIds() );\n        processInstanceEntity.setEndTime( dto.getEndTime() );\n        processInstanceEntity.setExtData( dto.getExtData() );\n        processInstanceEntity.setInstanceName( dto.getInstanceName() );\n        processInstanceEntity.setInstanceNo( dto.getInstanceNo() );\n        processInstanceEntity.setKeyField( dto.getKeyField() );\n        processInstanceEntity.setKeyField2( dto.getKeyField2() );\n        processInstanceEntity.setModifiedDate( dto.getModifiedDate() );\n        processInstanceEntity.setParentInstanceNo( dto.getParentInstanceNo() );\n        processInstanceEntity.setParentNodeInstanceNo( dto.getParentNodeInstanceNo() );\n        processInstanceEntity.setProcessDefId( dto.getProcessDefId() );\n        processInstanceEntity.setProcessType( dto.getProcessType() );\n        processInstanceEntity.setProductCode( dto.getProductCode() );\n        processInstanceEntity.setStartTime( dto.getStartTime() );\n        processInstanceEntity.setStatus( dto.getStatus() );\n        processInstanceEntity.setVars( dto.getVars() );\n\n        return processInstanceEntity;\n    }\n\n    public ProcessNodeInstanceEntity convert(ProcessNodeInstanceDTO dto) {\n        if ( dto == null ) {\n            return null;\n        }\n\n        ProcessNodeInstanceEntity processNodeInstanceEntity = new ProcessNodeInstanceEntity();\n\n        processNodeInstanceEntity.setCreatedDate( dto.getCreatedDate() );\n        processNodeInstanceEntity.setEndTime( dto.getEndTime() );\n        processNodeInstanceEntity.setExecutors( dto.getExecutors() );\n        processNodeInstanceEntity.setExtData( dto.getExtData() );\n        processNodeInstanceEntity.setModifiedDate( dto.getModifiedDate() );\n        processNodeInstanceEntity.setNextNodeInstances( dto.getNextNodeInstances() );\n        processNodeInstanceEntity.setNodeId( dto.getNodeId() );\n        processNodeInstanceEntity.setNodeInstanceNo( dto.getNodeInstanceNo() );\n        processNodeInstanceEntity.setPreviousNodeInstances( dto.getPreviousNodeInstances() );\n        processNodeInstanceEntity.setProcessDefId( dto.getProcessDefId() );\n        processNodeInstanceEntity.setProcessInstanceNo( dto.getProcessInstanceNo() );\n        processNodeInstanceEntity.setProductCode( dto.getProductCode() );\n        processNodeInstanceEntity.setStartTime( dto.getStartTime() );\n        processNodeInstanceEntity.setStatus( dto.getStatus() );\n        processNodeInstanceEntity.setVars( dto.getVars() );\n\n        return processNodeInstanceEntity;\n    }\n\n    public ProcessNodeExecutionEntity convert(ProcessNodeExecutionDTO dto) {\n        if ( dto == null ) {\n            return null;\n        }\n\n        ProcessNodeExecutionEntity processNodeExecutionEntity = new ProcessNodeExecutionEntity();\n\n        processNodeExecutionEntity.setCreatedDate( dto.getCreatedDate() );\n        processNodeExecutionEntity.setEndTime( dto.getEndTime() );\n        processNodeExecutionEntity.setEventId( dto.getEventId() );\n        processNodeExecutionEntity.setExecutor( dto.getExecutor() );\n        processNodeExecutionEntity.setExtData( dto.getExtData() );\n        processNodeExecutionEntity.setId( dto.getId() );\n        processNodeExecutionEntity.setModifiedDate( dto.getModifiedDate() );\n        processNodeExecutionEntity.setNextNodeInstances( dto.getNextNodeInstances() );\n        processNodeExecutionEntity.setNodeExecutionNo( dto.getNodeExecutionNo() );\n        processNodeExecutionEntity.setNodeId( dto.getNodeId() );\n        processNodeExecutionEntity.setNodeInstanceNo( dto.getNodeInstanceNo() );\n        processNodeExecutionEntity.setProcessDefId( dto.getProcessDefId() );\n        processNodeExecutionEntity.setProductCode( dto.getProductCode() );\n        processNodeExecutionEntity.setStartTime( dto.getStartTime() );\n        processNodeExecutionEntity.setStatus( dto.getStatus() );\n\n        return processNodeExecutionEntity;\n    }\n\n    public ProcessInstanceStatusMessage convert2Msg(ProcessInstanceEntity entity) {\n        if ( entity == null ) {\n            return null;\n        }\n\n        ProcessInstanceStatusMessage processInstanceStatusMessage = new ProcessInstanceStatusMessage();\n\n        processInstanceStatusMessage.setBizData( entity.getBizData() );\n        processInstanceStatusMessage.setBizNo( entity.getBizNo() );\n        processInstanceStatusMessage.setBizStatus( entity.getBizStatus() );\n        processInstanceStatusMessage.setCreatedDate( entity.getCreatedDate() );\n        processInstanceStatusMessage.setCreator( entity.getCreator() );\n        processInstanceStatusMessage.setCurrentNodeIds( entity.getCurrentNodeIds() );\n        processInstanceStatusMessage.setEndTime( entity.getEndTime() );\n        processInstanceStatusMessage.setExtData( entity.getExtData() );\n        processInstanceStatusMessage.setInstanceName( entity.getInstanceName() );\n        processInstanceStatusMessage.setInstanceNo( entity.getInstanceNo() );\n        processInstanceStatusMessage.setModifiedDate( entity.getModifiedDate() );\n        processInstanceStatusMessage.setParentInstanceNo( entity.getParentInstanceNo() );\n        processInstanceStatusMessage.setParentNodeInstanceNo( entity.getParentNodeInstanceNo() );\n        processInstanceStatusMessage.setProcessDefId( entity.getProcessDefId() );\n        processInstanceStatusMessage.setProcessType( entity.getProcessType() );\n        processInstanceStatusMessage.setProductCode( entity.getProductCode() );\n        processInstanceStatusMessage.setStartTime( entity.getStartTime() );\n        processInstanceStatusMessage.setStatus( entity.getStatus() );\n        processInstanceStatusMessage.setVars( entity.getVars() );\n\n        return processInstanceStatusMessage;\n    }\n\n    public ProcessNodeInstanceStatusMessage convert2Msg(ProcessNodeInstanceEntity entity) {\n        if ( entity == null ) {\n            return null;\n        }\n\n        ProcessNodeInstanceStatusMessage processNodeInstanceStatusMessage = new ProcessNodeInstanceStatusMessage();\n\n        processNodeInstanceStatusMessage.setCreatedDate( entity.getCreatedDate() );\n        processNodeInstanceStatusMessage.setEndTime( entity.getEndTime() );\n        processNodeInstanceStatusMessage.setExecutors( entity.getExecutors() );\n        processNodeInstanceStatusMessage.setExtData( entity.getExtData() );\n        processNodeInstanceStatusMessage.setModifiedDate( entity.getModifiedDate() );\n        processNodeInstanceStatusMessage.setNextNodeInstances( entity.getNextNodeInstances() );\n        processNodeInstanceStatusMessage.setNodeId( entity.getNodeId() );\n        processNodeInstanceStatusMessage.setNodeInstanceNo( entity.getNodeInstanceNo() );\n        processNodeInstanceStatusMessage.setPreviousNodeInstances( entity.getPreviousNodeInstances() );\n        processNodeInstanceStatusMessage.setProcessDefId( entity.getProcessDefId() );\n        processNodeInstanceStatusMessage.setProcessInstanceNo( entity.getProcessInstanceNo() );\n        processNodeInstanceStatusMessage.setProductCode( entity.getProductCode() );\n        processNodeInstanceStatusMessage.setStartTime( entity.getStartTime() );\n        processNodeInstanceStatusMessage.setStatus( entity.getStatus() );\n        processNodeInstanceStatusMessage.setVars( entity.getVars() );\n\n        return processNodeInstanceStatusMessage;\n    }\n\n    public CanCancelProcessInstanceReq convert(CancelProcessInstanceReq req) {\n        if ( req == null ) {\n            return null;\n        }\n\n        CanCancelProcessInstanceReq canCancelProcessInstanceReq = new CanCancelProcessInstanceReq();\n\n        canCancelProcessInstanceReq.setCancelUser( req.getCancelUser() );\n        canCancelProcessInstanceReq.setInstanceNo( req.getInstanceNo() );\n\n        return canCancelProcessInstanceReq;\n    }\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/domain/converter/ProcessTaskDomainConverter.java",
    "content": "package com.jd.easyflow.process.domain.converter;\n\nimport com.jd.easyflow.process.adapter.message.ProcessTaskStatusMessage;\nimport com.jd.easyflow.process.domain.model.entity.ProcessTaskEntity;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ProcessTaskDomainConverter {\n    \n    public static ProcessTaskDomainConverter INSTANCE = new ProcessTaskDomainConverter();\n    \n\n    public ProcessTaskStatusMessage convert2Msg(ProcessTaskEntity entity) {\n        if ( entity == null ) {\n            return null;\n        }\n\n        ProcessTaskStatusMessage processTaskStatusMessage = new ProcessTaskStatusMessage();\n\n        processTaskStatusMessage.setAssignInfo( entity.getAssignInfo() );\n        processTaskStatusMessage.setAssignTime( entity.getAssignTime() );\n        processTaskStatusMessage.setAssignType( entity.getAssignType() );\n        processTaskStatusMessage.setBizNo( entity.getBizNo() );\n        processTaskStatusMessage.setCreatedDate( entity.getCreatedDate() );\n        processTaskStatusMessage.setCreator( entity.getCreator() );\n        processTaskStatusMessage.setExecuteBizData( entity.getExecuteBizData() );\n        processTaskStatusMessage.setExecuteBizResult( entity.getExecuteBizResult() );\n        processTaskStatusMessage.setExecuteTime( entity.getExecuteTime() );\n        processTaskStatusMessage.setExecutor( entity.getExecutor() );\n        processTaskStatusMessage.setExtData( entity.getExtData() );\n        processTaskStatusMessage.setModifiedDate( entity.getModifiedDate() );\n        processTaskStatusMessage.setNodeExecutionNo( entity.getNodeExecutionNo() );\n        processTaskStatusMessage.setNodeInstanceNo( entity.getNodeInstanceNo() );\n        processTaskStatusMessage.setProcessInstanceNo( entity.getProcessInstanceNo() );\n        processTaskStatusMessage.setProcessType( entity.getProcessType() );\n        processTaskStatusMessage.setProductCode( entity.getProductCode() );\n        processTaskStatusMessage.setStatus( entity.getStatus() );\n        processTaskStatusMessage.setTaskBizCode( entity.getTaskBizCode() );\n        processTaskStatusMessage.setTaskBizName( entity.getTaskBizName() );\n        processTaskStatusMessage.setTaskNo( entity.getTaskNo() );\n        processTaskStatusMessage.setTaskType( entity.getTaskType() );\n\n        return processTaskStatusMessage;\n    }\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/domain/model/entity/ProcessDefinitionEntity.java",
    "content": "package com.jd.easyflow.process.domain.model.entity;\n\nimport java.util.Date;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessDefinitionEntity {\n    private Long id;\n\n    private String defId;\n\n    private Integer defVersion;\n\n    private String name;\n\n    private String format;\n\n    private String bizType;\n\n    private String category;\n\n    private String jsonContent;\n\n    private Boolean latest;\n\n    private String defSource;\n\n    private String extData;\n\n    private Date createdDate;\n\n    private Date modifiedDate;\n\n    private String content;\n\n    private String createdBy;\n\n    private String modifiedBy;\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getDefId() {\n        return defId;\n    }\n\n    public void setDefId(String defId) {\n        this.defId = defId;\n    }\n\n    public Integer getDefVersion() {\n        return defVersion;\n    }\n\n    public void setDefVersion(Integer defVersion) {\n        this.defVersion = defVersion;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getFormat() {\n        return format;\n    }\n\n    public void setFormat(String format) {\n        this.format = format;\n    }\n\n    public String getBizType() {\n        return bizType;\n    }\n\n    public void setBizType(String bizType) {\n        this.bizType = bizType;\n    }\n\n    public String getCategory() {\n        return category;\n    }\n\n    public void setCategory(String category) {\n        this.category = category;\n    }\n\n    public String getJsonContent() {\n        return jsonContent;\n    }\n\n    public void setJsonContent(String jsonContent) {\n        this.jsonContent = jsonContent;\n    }\n\n    public Boolean getLatest() {\n        return latest;\n    }\n\n    public void setLatest(Boolean latest) {\n        this.latest = latest;\n    }\n\n    public String getDefSource() {\n        return defSource;\n    }\n\n    public void setDefSource(String defSource) {\n        this.defSource = defSource;\n    }\n\n    public String getExtData() {\n        return extData;\n    }\n\n    public void setExtData(String extData) {\n        this.extData = extData;\n    }\n\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n\n    public String getContent() {\n        return content;\n    }\n\n    public void setContent(String content) {\n        this.content = content;\n    }\n\n    public String getCreatedBy() {\n        return createdBy;\n    }\n\n    public void setCreatedBy(String createdBy) {\n        this.createdBy = createdBy;\n    }\n\n    public String getModifiedBy() {\n        return modifiedBy;\n    }\n\n    public void setModifiedBy(String modifiedBy) {\n        this.modifiedBy = modifiedBy;\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/domain/model/entity/ProcessInstanceEntity.java",
    "content": "package com.jd.easyflow.process.domain.model.entity;\n\nimport java.util.Date;\n\n/**\n * @author liyuliang5\n * \n */\npublic class ProcessInstanceEntity {\n    \n    private Long id;\n\n    private String instanceNo;\n    \n    private String instanceName;\n\n    private String processType;\n\n    private String bizNo;\n\n    private String productCode;\n    \n    private String keyField;\n\n    private String keyField2;\n\n    private String creator;\n\n    private String processDefId;\n\n    private Date startTime;\n\n    private Date endTime;\n\n    private String status;\n    \n    private String currentNodeIds;\n    \n    private String parentInstanceNo;\n\n    private String parentNodeInstanceNo;\n    \n    private String bizStatus;\n    \n    private String bizData;\n\n    private String vars;\n\n    private String extData;\n\n    private Date createdDate;\n\n    private Date modifiedDate;\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getInstanceNo() {\n        return instanceNo;\n    }\n\n    public void setInstanceNo(String instanceNo) {\n        this.instanceNo = instanceNo;\n    }\n\n    public String getInstanceName() {\n        return instanceName;\n    }\n\n    public void setInstanceName(String instanceName) {\n        this.instanceName = instanceName;\n    }\n\n    public String getProcessType() {\n        return processType;\n    }\n\n    public void setProcessType(String processType) {\n        this.processType = processType;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n\n    public String getKeyField() {\n        return keyField;\n    }\n\n    public void setKeyField(String keyField) {\n        this.keyField = keyField;\n    }\n\n    public String getKeyField2() {\n        return keyField2;\n    }\n\n    public void setKeyField2(String keyField2) {\n        this.keyField2 = keyField2;\n    }\n\n    public String getCreator() {\n        return creator;\n    }\n\n    public void setCreator(String creator) {\n        this.creator = creator;\n    }\n\n    public String getProcessDefId() {\n        return processDefId;\n    }\n\n    public void setProcessDefId(String processDefId) {\n        this.processDefId = processDefId;\n    }\n\n    public Date getStartTime() {\n        return startTime;\n    }\n\n    public void setStartTime(Date startTime) {\n        this.startTime = startTime;\n    }\n\n    public Date getEndTime() {\n        return endTime;\n    }\n\n    public void setEndTime(Date endTime) {\n        this.endTime = endTime;\n    }\n\n    public String getStatus() {\n        return status;\n    }\n\n    public void setStatus(String status) {\n        this.status = status;\n    }\n\n    public String getCurrentNodeIds() {\n        return currentNodeIds;\n    }\n\n    public void setCurrentNodeIds(String currentNodeIds) {\n        this.currentNodeIds = currentNodeIds;\n    }\n\n    public String getParentInstanceNo() {\n        return parentInstanceNo;\n    }\n\n    public void setParentInstanceNo(String parentInstanceNo) {\n        this.parentInstanceNo = parentInstanceNo;\n    }\n\n    public String getParentNodeInstanceNo() {\n        return parentNodeInstanceNo;\n    }\n\n    public void setParentNodeInstanceNo(String parentNodeInstanceNo) {\n        this.parentNodeInstanceNo = parentNodeInstanceNo;\n    }\n\n    public String getBizStatus() {\n        return bizStatus;\n    }\n\n    public void setBizStatus(String bizStatus) {\n        this.bizStatus = bizStatus;\n    }\n\n    public String getBizData() {\n        return bizData;\n    }\n\n    public void setBizData(String bizData) {\n        this.bizData = bizData;\n    }\n\n    public String getVars() {\n        return vars;\n    }\n\n    public void setVars(String vars) {\n        this.vars = vars;\n    }\n\n    public String getExtData() {\n        return extData;\n    }\n\n    public void setExtData(String extData) {\n        this.extData = extData;\n    }\n\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n\n    @Override\n    public String toString() {\n        return \"ProcessInstanceEntity [id=\" + id + \", instanceNo=\" + instanceNo + \", instanceName=\" + instanceName\n                + \", processType=\" + processType + \", bizNo=\" + bizNo + \", productCode=\" + productCode + \", keyField=\"\n                + keyField + \", keyField2=\" + keyField2 + \", creator=\" + creator + \", processDefId=\" + processDefId\n                + \", startTime=\" + startTime + \", endTime=\" + endTime + \", status=\" + status + \", currentNodeIds=\"\n                + currentNodeIds + \", parentInstanceNo=\" + parentInstanceNo + \", parentNodeInstanceNo=\"\n                + parentNodeInstanceNo + \", bizStatus=\" + bizStatus + \", bizData=\" + bizData + \", vars=\" + vars\n                + \", extData=\" + extData + \", createdDate=\" + createdDate + \", modifiedDate=\" + modifiedDate + \"]\";\n    }\n    \n    \n}"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/domain/model/entity/ProcessNodeExecutionEntity.java",
    "content": "package com.jd.easyflow.process.domain.model.entity;\n\nimport java.util.Date;\n\n/**\n * @author liyuliang5\n * \n */\npublic class ProcessNodeExecutionEntity {\n    \n    private Long id;\n\n    private String nodeExecutionNo;\n\n    private String nodeInstanceNo;\n\n    private String eventId;\n\n    private String processDefId;\n\n    private String nodeId;\n\n    private Date startTime;\n\n    private Date endTime;\n\n    private String status;\n\n    private String productCode;\n\n    private String executor;\n\n    private String nextNodeInstances;\n\n    private String extData;\n\n    private Date createdDate;\n\n    private Date modifiedDate;\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getNodeExecutionNo() {\n        return nodeExecutionNo;\n    }\n\n    public void setNodeExecutionNo(String nodeExecutionNo) {\n        this.nodeExecutionNo = nodeExecutionNo;\n    }\n\n    public String getNodeInstanceNo() {\n        return nodeInstanceNo;\n    }\n\n    public void setNodeInstanceNo(String nodeInstanceNo) {\n        this.nodeInstanceNo = nodeInstanceNo;\n    }\n\n    public String getEventId() {\n        return eventId;\n    }\n\n    public void setEventId(String eventId) {\n        this.eventId = eventId;\n    }\n\n    public String getProcessDefId() {\n        return processDefId;\n    }\n\n    public void setProcessDefId(String processDefId) {\n        this.processDefId = processDefId;\n    }\n\n    public String getNodeId() {\n        return nodeId;\n    }\n\n    public void setNodeId(String nodeId) {\n        this.nodeId = nodeId;\n    }\n\n    public Date getStartTime() {\n        return startTime;\n    }\n\n    public void setStartTime(Date startTime) {\n        this.startTime = startTime;\n    }\n\n    public Date getEndTime() {\n        return endTime;\n    }\n\n    public void setEndTime(Date endTime) {\n        this.endTime = endTime;\n    }\n\n    public String getStatus() {\n        return status;\n    }\n\n    public void setStatus(String status) {\n        this.status = status;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n\n    public String getExecutor() {\n        return executor;\n    }\n\n    public void setExecutor(String executor) {\n        this.executor = executor;\n    }\n\n    public String getNextNodeInstances() {\n        return nextNodeInstances;\n    }\n\n    public void setNextNodeInstances(String nextNodeInstances) {\n        this.nextNodeInstances = nextNodeInstances;\n    }\n\n    public String getExtData() {\n        return extData;\n    }\n\n    public void setExtData(String extData) {\n        this.extData = extData;\n    }\n\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n\n    @Override\n    public String toString() {\n        StringBuilder sb = new StringBuilder();\n        sb.append(getClass().getSimpleName());\n        sb.append(\" [\");\n        sb.append(\"Hash = \").append(hashCode());\n        sb.append(\", id=\").append(id);\n        sb.append(\", nodeExecutionNo=\").append(nodeExecutionNo);\n        sb.append(\", nodeInstanceNo=\").append(nodeInstanceNo);\n        sb.append(\", eventId=\").append(eventId);\n        sb.append(\", processDefId=\").append(processDefId);\n        sb.append(\", nodeId=\").append(nodeId);\n        sb.append(\", startTime=\").append(startTime);\n        sb.append(\", endTime=\").append(endTime);\n        sb.append(\", status=\").append(status);\n        sb.append(\", productCode=\").append(productCode);\n        sb.append(\", executor=\").append(executor);\n        sb.append(\", nextNodeInstances=\").append(nextNodeInstances);\n        sb.append(\", extData=\").append(extData);\n        sb.append(\", createdDate=\").append(createdDate);\n        sb.append(\", modifiedDate=\").append(modifiedDate);\n        sb.append(\"]\");\n        return sb.toString();\n    }\n}"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/domain/model/entity/ProcessNodeInstanceEntity.java",
    "content": "package com.jd.easyflow.process.domain.model.entity;\n\nimport java.util.Date;\n\n/**\n * @author liyuliang5\n * \n */\npublic class ProcessNodeInstanceEntity {\n    \n    private Long id;\n\n    private String nodeInstanceNo;\n\n    private String processInstanceNo;\n\n    private String processDefId;\n\n    private String nodeId;\n\n    private Date startTime;\n\n    private Date endTime;\n\n    private String status;\n\n    private String productCode;\n\n    private String executors;\n    \n    private String previousNodeInstances;\n\n    private String nextNodeInstances;\n\n    private String vars;\n\n    private String extData;\n\n    private Date createdDate;\n\n    private Date modifiedDate;\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getNodeInstanceNo() {\n        return nodeInstanceNo;\n    }\n\n    public void setNodeInstanceNo(String nodeInstanceNo) {\n        this.nodeInstanceNo = nodeInstanceNo;\n    }\n\n    public String getProcessInstanceNo() {\n        return processInstanceNo;\n    }\n\n    public void setProcessInstanceNo(String processInstanceNo) {\n        this.processInstanceNo = processInstanceNo;\n    }\n\n    public String getProcessDefId() {\n        return processDefId;\n    }\n\n    public void setProcessDefId(String processDefId) {\n        this.processDefId = processDefId;\n    }\n\n    public String getNodeId() {\n        return nodeId;\n    }\n\n    public void setNodeId(String nodeId) {\n        this.nodeId = nodeId;\n    }\n\n    public Date getStartTime() {\n        return startTime;\n    }\n\n    public void setStartTime(Date startTime) {\n        this.startTime = startTime;\n    }\n\n    public Date getEndTime() {\n        return endTime;\n    }\n\n    public void setEndTime(Date endTime) {\n        this.endTime = endTime;\n    }\n\n    public String getStatus() {\n        return status;\n    }\n\n    public void setStatus(String status) {\n        this.status = status;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n\n    public String getExecutors() {\n        return executors;\n    }\n\n    public void setExecutors(String executors) {\n        this.executors = executors;\n    }\n\n    public String getPreviousNodeInstances() {\n        return previousNodeInstances;\n    }\n\n    public void setPreviousNodeInstances(String previousNodeInstances) {\n        this.previousNodeInstances = previousNodeInstances;\n    }\n\n    public String getNextNodeInstances() {\n        return nextNodeInstances;\n    }\n\n    public void setNextNodeInstances(String nextNodeInstances) {\n        this.nextNodeInstances = nextNodeInstances;\n    }\n\n    public String getVars() {\n        return vars;\n    }\n\n    public void setVars(String vars) {\n        this.vars = vars;\n    }\n\n    public String getExtData() {\n        return extData;\n    }\n\n    public void setExtData(String extData) {\n        this.extData = extData;\n    }\n\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n\n    @Override\n    public String toString() {\n        return \"ProcessNodeInstanceEntity [id=\" + id + \", nodeInstanceNo=\" + nodeInstanceNo + \", processInstanceNo=\"\n                + processInstanceNo + \", processDefId=\" + processDefId + \", nodeId=\" + nodeId + \", startTime=\"\n                + startTime + \", endTime=\" + endTime + \", status=\" + status + \", productCode=\" + productCode\n                + \", executors=\" + executors + \", previousNodeInstances=\" + previousNodeInstances\n                + \", nextNodeInstances=\" + nextNodeInstances + \", vars=\" + vars + \", extData=\" + extData\n                + \", createdDate=\" + createdDate + \", modifiedDate=\" + modifiedDate + \"]\";\n    }\n    \n    \n}"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/domain/model/entity/ProcessTaskAssignEntity.java",
    "content": "package com.jd.easyflow.process.domain.model.entity;\n\nimport java.util.Date;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ProcessTaskAssignEntity {\n    \n    private Long id;\n\n    private String assignNo;\n\n    private String taskNo;\n\n    private String assignType;\n\n    private String assignGroup;\n    \n    private String assignGroup2;\n\n    private String assignUser;\n\n    private String status;\n\n    private Date assignTime;\n\n    private String productCode;\n\n    private String extData;\n\n    private Date createdDate;\n\n    private Date modifiedDate;\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getAssignNo() {\n        return assignNo;\n    }\n\n    public void setAssignNo(String assignNo) {\n        this.assignNo = assignNo;\n    }\n\n    public String getTaskNo() {\n        return taskNo;\n    }\n\n    public void setTaskNo(String taskNo) {\n        this.taskNo = taskNo;\n    }\n\n    public String getAssignType() {\n        return assignType;\n    }\n\n    public void setAssignType(String assignType) {\n        this.assignType = assignType;\n    }\n\n    public String getAssignGroup() {\n        return assignGroup;\n    }\n\n    public void setAssignGroup(String assignGroup) {\n        this.assignGroup = assignGroup;\n    }\n\n    public String getAssignGroup2() {\n        return assignGroup2;\n    }\n\n    public void setAssignGroup2(String assignGroup2) {\n        this.assignGroup2 = assignGroup2;\n    }\n\n    public String getAssignUser() {\n        return assignUser;\n    }\n\n    public void setAssignUser(String assignUser) {\n        this.assignUser = assignUser;\n    }\n\n    public String getStatus() {\n        return status;\n    }\n\n    public void setStatus(String status) {\n        this.status = status;\n    }\n\n    public Date getAssignTime() {\n        return assignTime;\n    }\n\n    public void setAssignTime(Date assignTime) {\n        this.assignTime = assignTime;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n\n    public String getExtData() {\n        return extData;\n    }\n\n    public void setExtData(String extData) {\n        this.extData = extData;\n    }\n\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n\n    @Override\n    public String toString() {\n        return \"ProcessTaskAssignEntity [id=\" + id + \", assignNo=\" + assignNo + \", taskNo=\" + taskNo + \", assignType=\"\n                + assignType + \", assignGroup=\" + assignGroup + \", assignGroup2=\" + assignGroup2 + \", assignUser=\"\n                + assignUser + \", status=\" + status + \", assignTime=\" + assignTime + \", productCode=\" + productCode\n                + \", extData=\" + extData + \", createdDate=\" + createdDate + \", modifiedDate=\" + modifiedDate + \"]\";\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/domain/model/entity/ProcessTaskEntity.java",
    "content": "package com.jd.easyflow.process.domain.model.entity;\n\nimport java.util.Date;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ProcessTaskEntity {\n\n    private Long id;\n    \n    private String taskNo;\n    \n    private String processType;\n    \n    private String bizNo;\n    \n    private String taskBizCode;\n    \n    private String taskBizName;\n    \n    private String taskType;\n    \n    private String processInstanceNo;\n    \n    private String nodeInstanceNo;\n    \n    private String nodeExecutionNo;\n    \n    private String assignType;\n    \n    private String assignInfo;\n    \n    private Date assignTime;\n    \n    private String executor;\n    \n    private Date executeTime;\n    \n    private String executeBizResult;\n    \n    private String executeBizData;\n    \n    private String productCode;\n    \n    private String creator;\n    \n    private String status;\n        \n    private String extData;\n    \n    private Date createdDate;\n    \n    private Date modifiedDate;\n    \n    private String processInstanceKeyField;\n\n    private String processInstanceKeyField2;\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getTaskNo() {\n        return taskNo;\n    }\n\n    public void setTaskNo(String taskNo) {\n        this.taskNo = taskNo;\n    }\n\n    public String getProcessType() {\n        return processType;\n    }\n\n    public void setProcessType(String processType) {\n        this.processType = processType;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    public String getTaskBizCode() {\n        return taskBizCode;\n    }\n\n    public void setTaskBizCode(String taskBizCode) {\n        this.taskBizCode = taskBizCode;\n    }\n\n    public String getTaskBizName() {\n        return taskBizName;\n    }\n\n    public void setTaskBizName(String taskBizName) {\n        this.taskBizName = taskBizName;\n    }\n\n    public String getTaskType() {\n        return taskType;\n    }\n\n    public void setTaskType(String taskType) {\n        this.taskType = taskType;\n    }\n\n    public String getProcessInstanceNo() {\n        return processInstanceNo;\n    }\n\n    public void setProcessInstanceNo(String processInstanceNo) {\n        this.processInstanceNo = processInstanceNo;\n    }\n\n    public String getNodeInstanceNo() {\n        return nodeInstanceNo;\n    }\n\n    public void setNodeInstanceNo(String nodeInstanceNo) {\n        this.nodeInstanceNo = nodeInstanceNo;\n    }\n\n    public String getNodeExecutionNo() {\n        return nodeExecutionNo;\n    }\n\n    public void setNodeExecutionNo(String nodeExecutionNo) {\n        this.nodeExecutionNo = nodeExecutionNo;\n    }\n\n    public String getAssignType() {\n        return assignType;\n    }\n\n    public void setAssignType(String assignType) {\n        this.assignType = assignType;\n    }\n\n    public String getAssignInfo() {\n        return assignInfo;\n    }\n\n    public void setAssignInfo(String assignInfo) {\n        this.assignInfo = assignInfo;\n    }\n\n    public Date getAssignTime() {\n        return assignTime;\n    }\n\n    public void setAssignTime(Date assignTime) {\n        this.assignTime = assignTime;\n    }\n\n    public String getExecutor() {\n        return executor;\n    }\n\n    public void setExecutor(String executor) {\n        this.executor = executor;\n    }\n\n    public Date getExecuteTime() {\n        return executeTime;\n    }\n\n    public void setExecuteTime(Date executeTime) {\n        this.executeTime = executeTime;\n    }\n\n    public String getExecuteBizResult() {\n        return executeBizResult;\n    }\n\n    public void setExecuteBizResult(String executeBizResult) {\n        this.executeBizResult = executeBizResult;\n    }\n\n    public String getExecuteBizData() {\n        return executeBizData;\n    }\n\n    public void setExecuteBizData(String executeBizData) {\n        this.executeBizData = executeBizData;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n\n    public String getCreator() {\n        return creator;\n    }\n\n    public void setCreator(String creator) {\n        this.creator = creator;\n    }\n\n    public String getStatus() {\n        return status;\n    }\n\n    public void setStatus(String status) {\n        this.status = status;\n    }\n\n    public String getExtData() {\n        return extData;\n    }\n\n    public void setExtData(String extData) {\n        this.extData = extData;\n    }\n\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n\n    public String getProcessInstanceKeyField() {\n        return processInstanceKeyField;\n    }\n\n    public void setProcessInstanceKeyField(String processInstanceKeyField) {\n        this.processInstanceKeyField = processInstanceKeyField;\n    }\n\n    public String getProcessInstanceKeyField2() {\n        return processInstanceKeyField2;\n    }\n\n    public void setProcessInstanceKeyField2(String processInstanceKeyField2) {\n        this.processInstanceKeyField2 = processInstanceKeyField2;\n    }\n\n    @Override\n    public String toString() {\n        return \"ProcessTaskEntity [id=\" + id + \", taskNo=\" + taskNo + \", processType=\" + processType + \", bizNo=\"\n                + bizNo + \", taskBizCode=\" + taskBizCode + \", taskBizName=\" + taskBizName + \", taskType=\" + taskType\n                + \", processInstanceNo=\" + processInstanceNo + \", nodeInstanceNo=\" + nodeInstanceNo\n                + \", nodeExecutionNo=\" + nodeExecutionNo + \", assignType=\" + assignType + \", assignInfo=\" + assignInfo\n                + \", assignTime=\" + assignTime + \", executor=\" + executor + \", executeTime=\" + executeTime\n                + \", executeBizResult=\" + executeBizResult + \", executeBizData=\" + executeBizData + \", productCode=\"\n                + productCode + \", creator=\" + creator + \", status=\" + status + \", extData=\" + extData\n                + \", createdDate=\" + createdDate + \", modifiedDate=\" + modifiedDate + \", processInstanceKeyField=\"\n                + processInstanceKeyField + \", processInstanceKeyField2=\" + processInstanceKeyField2 + \"]\";\n    }\n    \n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/domain/model/entity/ProcessTaskEventEntity.java",
    "content": "package com.jd.easyflow.process.domain.model.entity;\n\nimport java.util.Date;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessTaskEventEntity {\n\n    private Long id;\n\n    private String eventNo;\n\n    private String taskNo;\n\n    private String eventType;\n\n    private String eventUser;\n\n    private Date eventTime;\n\n    private String eventBizResult;\n\n    private String eventBizData;\n    \n    private String instanceBizStatus;\n\n    private String instanceBizData;    \n\n    private String productCode;\n\n    private String extData;\n\n    private Date createdDate;\n\n    private Date modifiedDate;\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getEventNo() {\n        return eventNo;\n    }\n\n    public void setEventNo(String eventNo) {\n        this.eventNo = eventNo;\n    }\n\n    public String getTaskNo() {\n        return taskNo;\n    }\n\n    public void setTaskNo(String taskNo) {\n        this.taskNo = taskNo;\n    }\n\n    public String getEventType() {\n        return eventType;\n    }\n\n    public void setEventType(String eventType) {\n        this.eventType = eventType;\n    }\n\n    public String getEventUser() {\n        return eventUser;\n    }\n\n    public void setEventUser(String eventUser) {\n        this.eventUser = eventUser;\n    }\n\n    public Date getEventTime() {\n        return eventTime;\n    }\n\n    public void setEventTime(Date eventTime) {\n        this.eventTime = eventTime;\n    }\n\n    public String getEventBizResult() {\n        return eventBizResult;\n    }\n\n    public void setEventBizResult(String eventBizResult) {\n        this.eventBizResult = eventBizResult;\n    }\n\n    public String getEventBizData() {\n        return eventBizData;\n    }\n\n    public void setEventBizData(String eventBizData) {\n        this.eventBizData = eventBizData;\n    }\n\n    public String getInstanceBizStatus() {\n        return instanceBizStatus;\n    }\n\n    public void setInstanceBizStatus(String instanceBizStatus) {\n        this.instanceBizStatus = instanceBizStatus;\n    }\n\n    public String getInstanceBizData() {\n        return instanceBizData;\n    }\n\n    public void setInstanceBizData(String instanceBizData) {\n        this.instanceBizData = instanceBizData;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n\n    public String getExtData() {\n        return extData;\n    }\n\n    public void setExtData(String extData) {\n        this.extData = extData;\n    }\n\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n\n    @Override\n    public String toString() {\n        return \"ProcessTaskEventEntity [id=\" + id + \", eventNo=\" + eventNo + \", taskNo=\" + taskNo + \", eventType=\"\n                + eventType + \", eventUser=\" + eventUser + \", eventTime=\" + eventTime + \", eventBizResult=\"\n                + eventBizResult + \", eventBizData=\" + eventBizData + \", instanceBizStatus=\" + instanceBizStatus\n                + \", instanceBizData=\" + instanceBizData + \", productCode=\" + productCode + \", extData=\" + extData\n                + \", createdDate=\" + createdDate + \", modifiedDate=\" + modifiedDate + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/domain/model/enums/ProcessResponseCode.java",
    "content": "package com.jd.easyflow.process.domain.model.enums;\n\nimport com.jd.easyflow.common.util.MessageUtil;\n\n/**\n * @author liyuliang5\n *\n */\npublic enum ProcessResponseCode {\n\n    PROCESS_INSTANCE_EXISTS(\"0100001\",MessageUtil.getMessage(\"easyflow.process.server.tip.processInstanceExists\"));\n\n    private String code;\n\n    private String desc;\n\n    ProcessResponseCode(String code, String desc) {\n        this.code = code;\n        this.desc = desc;\n    }\n\n    public String getCode() {\n        return code;\n    }\n\n    public String getDesc() {\n        return desc;\n    }\n\n}\n\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/domain/model/vo/CreateProcessInstanceReqVO.java",
    "content": "package com.jd.easyflow.process.domain.model.vo;\n\nimport java.util.Arrays;\nimport java.util.Map;\n\n/**\n * @author liyuliang5\n *\n */\npublic class CreateProcessInstanceReqVO {\n    /**\n     * common|std\n     */\n    private String type;\n    \n    /**\n     * required.\n     */\n    private String processId;\n    \n    /**\n     * optional.\n     * Start node id list.\n     */\n    private String[] nodeIds;\n    \n    /**\n     * optional.\n     * Json format.\n     */\n    private Object param;\n    \n    /**\n     * optional.\n     * CollectionType.\n     */\n    private Map<String, Object> dataMap;\n\n    /**\n     * required.\n     */\n    private String processType;\n    /**\n     * required.\n     */\n    private String bizNo;\n    \n    /**\n     */\n    private String bizStatus;\n    \n    /**\n     * JSON Format. optional.\n     */\n    private String bizData;\n    \n    /**\n     * optional\n     */\n    private String creator;\n    /**\n     * optional\n     */\n    private String productCode;\n    /**\n     * optional\n     */\n    private String keyField;\n    /**\n     * optional\n     */\n    private String keyField2;\n    /**\n     * optional\n     */\n    private String instanceName;\n    public String getType() {\n        return type;\n    }\n    public void setType(String type) {\n        this.type = type;\n    }\n    public String getProcessId() {\n        return processId;\n    }\n    public void setProcessId(String processId) {\n        this.processId = processId;\n    }\n    public String[] getNodeIds() {\n        return nodeIds;\n    }\n    public void setNodeIds(String[] nodeIds) {\n        this.nodeIds = nodeIds;\n    }\n    public Object getParam() {\n        return param;\n    }\n    public void setParam(Object param) {\n        this.param = param;\n    }\n    public Map<String, Object> getDataMap() {\n        return dataMap;\n    }\n    public void setDataMap(Map<String, Object> dataMap) {\n        this.dataMap = dataMap;\n    }\n    public String getProcessType() {\n        return processType;\n    }\n    public void setProcessType(String processType) {\n        this.processType = processType;\n    }\n    public String getBizNo() {\n        return bizNo;\n    }\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n    public String getBizStatus() {\n        return bizStatus;\n    }\n    public void setBizStatus(String bizStatus) {\n        this.bizStatus = bizStatus;\n    }\n    public String getBizData() {\n        return bizData;\n    }\n    public void setBizData(String bizData) {\n        this.bizData = bizData;\n    }\n    public String getCreator() {\n        return creator;\n    }\n    public void setCreator(String creator) {\n        this.creator = creator;\n    }\n    public String getProductCode() {\n        return productCode;\n    }\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n    public String getKeyField() {\n        return keyField;\n    }\n    public void setKeyField(String keyField) {\n        this.keyField = keyField;\n    }\n    public String getKeyField2() {\n        return keyField2;\n    }\n    public void setKeyField2(String keyField2) {\n        this.keyField2 = keyField2;\n    }\n    public String getInstanceName() {\n        return instanceName;\n    }\n    public void setInstanceName(String instanceName) {\n        this.instanceName = instanceName;\n    }\n    @Override\n    public String toString() {\n        return \"CreateProcessInstanceReqVO [type=\" + type + \", processId=\" + processId + \", nodeIds=\"\n                + Arrays.toString(nodeIds) + \", param=\" + param + \", dataMap=\" + dataMap + \", processType=\"\n                + processType + \", bizNo=\" + bizNo + \", bizStatus=\" + bizStatus + \", bizData=\" + bizData + \", creator=\"\n                + creator + \", productCode=\" + productCode + \", keyField=\" + keyField + \", keyField2=\" + keyField2\n                + \", instanceName=\" + instanceName + \"]\";\n    }\n    \n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/domain/model/vo/CreateProcessInstanceResVO.java",
    "content": "package com.jd.easyflow.process.domain.model.vo;\n\n/**\n * \n * @author liyuliang5\n */\npublic class CreateProcessInstanceResVO {\n\n    private String processInstanceNo;\n\n    public String getProcessInstanceNo() {\n        return processInstanceNo;\n    }\n\n    public void setProcessInstanceNo(String processInstanceNo) {\n        this.processInstanceNo = processInstanceNo;\n    }\n\n    @Override\n    public String toString() {\n        return \"CreateProcessInstanceResVO [processInstanceNo=\" + processInstanceNo + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/domain/model/vo/CreateProcessTaskVO.java",
    "content": "package com.jd.easyflow.process.domain.model.vo;\n\nimport java.util.Map;\n\n/**\n * @author liyuliang5\n *\n */\npublic class CreateProcessTaskVO {\n\n    private String processType;\n    \n    private String bizNo;\n    \n    private String taskType;\n    \n    private String taskBizCode;\n    \n    private String taskBizName;\n    \n    private String processInstanceNo;\n    \n    private String nodeInstanceNo;\n    \n    private String assignType;\n    \n    private Map<String, Object> assignInfo;\n    \n    private String creator;\n    \n    private String productCode;\n        \n    private Object extData;\n\n    public String getProcessType() {\n        return processType;\n    }\n\n    public void setProcessType(String processType) {\n        this.processType = processType;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    public String getTaskType() {\n        return taskType;\n    }\n\n    public void setTaskType(String taskType) {\n        this.taskType = taskType;\n    }\n\n    public String getTaskBizCode() {\n        return taskBizCode;\n    }\n\n    public void setTaskBizCode(String taskBizCode) {\n        this.taskBizCode = taskBizCode;\n    }\n\n    public String getTaskBizName() {\n        return taskBizName;\n    }\n\n    public void setTaskBizName(String taskBizName) {\n        this.taskBizName = taskBizName;\n    }\n\n    public String getProcessInstanceNo() {\n        return processInstanceNo;\n    }\n\n    public void setProcessInstanceNo(String processInstanceNo) {\n        this.processInstanceNo = processInstanceNo;\n    }\n\n    public String getNodeInstanceNo() {\n        return nodeInstanceNo;\n    }\n\n    public void setNodeInstanceNo(String nodeInstanceNo) {\n        this.nodeInstanceNo = nodeInstanceNo;\n    }\n\n    public String getAssignType() {\n        return assignType;\n    }\n\n    public void setAssignType(String assignType) {\n        this.assignType = assignType;\n    }\n\n    public Map<String, Object> getAssignInfo() {\n        return assignInfo;\n    }\n\n    public void setAssignInfo(Map<String, Object> assignInfo) {\n        this.assignInfo = assignInfo;\n    }\n\n    public String getCreator() {\n        return creator;\n    }\n\n    public void setCreator(String creator) {\n        this.creator = creator;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n\n    public Object getExtData() {\n        return extData;\n    }\n\n    public void setExtData(Object extData) {\n        this.extData = extData;\n    }\n\n    @Override\n    public String toString() {\n        return \"CreateProcessTaskVO [processType=\" + processType + \", bizNo=\" + bizNo + \", taskType=\" + taskType\n                + \", taskBizCode=\" + taskBizCode + \", taskBizName=\" + taskBizName + \", processInstanceNo=\"\n                + processInstanceNo + \", nodeInstanceNo=\" + nodeInstanceNo + \", assignType=\" + assignType\n                + \", assignInfo=\" + assignInfo + \", creator=\" + creator + \", productCode=\" + productCode + \", extData=\"\n                + extData + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/domain/model/vo/DoExecuteProcessTaskReqVO.java",
    "content": "package com.jd.easyflow.process.domain.model.vo;\n\nimport java.util.List;\n\nimport com.jd.easyflow.process.adapter.export.dto.task.TaskOperateCommand;\n\n/**\n * @author liyuliang5\n *\n */\npublic class DoExecuteProcessTaskReqVO {\n    \n    private String taskNo;\n    \n    private String executor;\n    \n    private List<String> groupList;\n    \n    private List<String> group2List;\n    \n    private String executeBizResult;\n    \n    private String executeBizData;\n    \n    private String instanceBizStatus;\n    \n    private String instanceBizData;\n    \n    private List<TaskOperateCommand> subCommandList;\n    \n    private String operation;\n    \n    private String taskExtData;\n\n    public String getTaskNo() {\n        return taskNo;\n    }\n\n    public void setTaskNo(String taskNo) {\n        this.taskNo = taskNo;\n    }\n\n    public String getExecutor() {\n        return executor;\n    }\n\n    public void setExecutor(String executor) {\n        this.executor = executor;\n    }\n\n    public List<String> getGroupList() {\n        return groupList;\n    }\n\n    public void setGroupList(List<String> groupList) {\n        this.groupList = groupList;\n    }\n\n    public List<String> getGroup2List() {\n        return group2List;\n    }\n\n    public void setGroup2List(List<String> group2List) {\n        this.group2List = group2List;\n    }\n\n    public String getExecuteBizResult() {\n        return executeBizResult;\n    }\n\n    public void setExecuteBizResult(String executeBizResult) {\n        this.executeBizResult = executeBizResult;\n    }\n\n    public String getExecuteBizData() {\n        return executeBizData;\n    }\n\n    public void setExecuteBizData(String executeBizData) {\n        this.executeBizData = executeBizData;\n    }\n\n    public String getInstanceBizStatus() {\n        return instanceBizStatus;\n    }\n\n    public void setInstanceBizStatus(String instanceBizStatus) {\n        this.instanceBizStatus = instanceBizStatus;\n    }\n\n    public String getInstanceBizData() {\n        return instanceBizData;\n    }\n\n    public void setInstanceBizData(String instanceBizData) {\n        this.instanceBizData = instanceBizData;\n    }\n\n    public List<TaskOperateCommand> getSubCommandList() {\n        return subCommandList;\n    }\n\n    public void setSubCommandList(List<TaskOperateCommand> subCommandList) {\n        this.subCommandList = subCommandList;\n    }\n\n    public String getOperation() {\n        return operation;\n    }\n\n    public void setOperation(String operation) {\n        this.operation = operation;\n    }\n\n    public String getTaskExtData() {\n        return taskExtData;\n    }\n\n    public void setTaskExtData(String taskExtData) {\n        this.taskExtData = taskExtData;\n    }\n\n    @Override\n    public String toString() {\n        return \"DoExecuteProcessTaskReqVO [taskNo=\" + taskNo + \", executor=\" + executor + \", groupList=\" + groupList\n                + \", group2List=\" + group2List + \", executeBizResult=\" + executeBizResult + \", executeBizData=\"\n                + executeBizData + \", instanceBizStatus=\" + instanceBizStatus + \", instanceBizData=\" + instanceBizData\n                + \", subCommandList=\" + subCommandList + \", operation=\" + operation + \", taskExtData=\" + taskExtData\n                + \"]\";\n    }\n\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/domain/model/vo/ExecuteProcessTaskReqVO.java",
    "content": "package com.jd.easyflow.process.domain.model.vo;\n\nimport java.util.List;\n\nimport com.jd.easyflow.process.adapter.export.dto.task.TaskOperateCmd;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ExecuteProcessTaskReqVO {\n\n    private String taskNo;\n    \n    private String user;\n    \n    private List<String> groupList;\n    \n    private List<String> group2List;\n        \n    private String executeBizResult;\n    \n    private String executeBizData;\n    \n    private String instanceBizStatus;\n    \n    private String instanceBizData;\n    \n    List<TaskOperateCmd> cmdList;\n    \n    private String operation;\n    \n    private String taskExtData;\n\n    public String getTaskNo() {\n        return taskNo;\n    }\n\n    public void setTaskNo(String taskNo) {\n        this.taskNo = taskNo;\n    }\n\n    public String getUser() {\n        return user;\n    }\n\n    public void setUser(String user) {\n        this.user = user;\n    }\n\n    public List<String> getGroupList() {\n        return groupList;\n    }\n\n    public void setGroupList(List<String> groupList) {\n        this.groupList = groupList;\n    }\n\n    public List<String> getGroup2List() {\n        return group2List;\n    }\n\n    public void setGroup2List(List<String> group2List) {\n        this.group2List = group2List;\n    }\n\n    public String getExecuteBizResult() {\n        return executeBizResult;\n    }\n\n    public void setExecuteBizResult(String executeBizResult) {\n        this.executeBizResult = executeBizResult;\n    }\n\n    public String getExecuteBizData() {\n        return executeBizData;\n    }\n\n    public void setExecuteBizData(String executeBizData) {\n        this.executeBizData = executeBizData;\n    }\n\n    public String getInstanceBizStatus() {\n        return instanceBizStatus;\n    }\n\n    public void setInstanceBizStatus(String instanceBizStatus) {\n        this.instanceBizStatus = instanceBizStatus;\n    }\n\n    public String getInstanceBizData() {\n        return instanceBizData;\n    }\n\n    public void setInstanceBizData(String instanceBizData) {\n        this.instanceBizData = instanceBizData;\n    }\n\n    public List<TaskOperateCmd> getCmdList() {\n        return cmdList;\n    }\n\n    public void setCmdList(List<TaskOperateCmd> cmdList) {\n        this.cmdList = cmdList;\n    }\n\n    public String getOperation() {\n        return operation;\n    }\n\n    public void setOperation(String operation) {\n        this.operation = operation;\n    }\n\n    public String getTaskExtData() {\n        return taskExtData;\n    }\n\n    public void setTaskExtData(String taskExtData) {\n        this.taskExtData = taskExtData;\n    }\n\n    @Override\n    public String toString() {\n        return \"ExecuteProcessTaskReqVO [taskNo=\" + taskNo + \", user=\" + user + \", groupList=\" + groupList\n                + \", group2List=\" + group2List + \", executeBizResult=\" + executeBizResult + \", executeBizData=\"\n                + executeBizData + \", instanceBizStatus=\" + instanceBizStatus + \", instanceBizData=\" + instanceBizData\n                + \", cmdList=\" + cmdList + \", operation=\" + operation + \", taskExtData=\" + taskExtData + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/domain/model/vo/ProcessDefinitionForListVO.java",
    "content": "package com.jd.easyflow.process.domain.model.vo;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessDefinitionForListVO implements Serializable {\n\n    private Long id;\n\n    private String defId;\n\n    private Integer defVersion;\n\n    private String name;\n\n    private String format;\n\n    private String bizType;\n\n    private String category;\n\n    private Boolean latest;\n\n    private String defSource;\n\n    private Date createdDate;\n\n    private Date modifiedDate;\n\n    private String createdBy;\n\n    private String modifiedBy;\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getDefId() {\n        return defId;\n    }\n\n    public void setDefId(String defId) {\n        this.defId = defId;\n    }\n\n    public Integer getDefVersion() {\n        return defVersion;\n    }\n\n    public void setDefVersion(Integer defVersion) {\n        this.defVersion = defVersion;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getFormat() {\n        return format;\n    }\n\n    public void setFormat(String format) {\n        this.format = format;\n    }\n\n    public String getBizType() {\n        return bizType;\n    }\n\n    public void setBizType(String bizType) {\n        this.bizType = bizType;\n    }\n\n    public String getCategory() {\n        return category;\n    }\n\n    public void setCategory(String category) {\n        this.category = category;\n    }\n\n    public Boolean getLatest() {\n        return latest;\n    }\n\n    public void setLatest(Boolean latest) {\n        this.latest = latest;\n    }\n\n    public String getDefSource() {\n        return defSource;\n    }\n\n    public void setDefSource(String defSource) {\n        this.defSource = defSource;\n    }\n\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n\n    public String getCreatedBy() {\n        return createdBy;\n    }\n\n    public void setCreatedBy(String createdBy) {\n        this.createdBy = createdBy;\n    }\n\n    public String getModifiedBy() {\n        return modifiedBy;\n    }\n\n    public void setModifiedBy(String modifiedBy) {\n        this.modifiedBy = modifiedBy;\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/domain/model/vo/QueryProcessNodeReq.java",
    "content": "package com.jd.easyflow.process.domain.model.vo;\n\nimport java.io.Serializable;\nimport java.util.Set;\n\n/**\n * @author liyuliang5\n *\n */\npublic class QueryProcessNodeReq implements Serializable {\n\n    private static final long serialVersionUID = -1229795408236692680L;\n    \n    public QueryProcessNodeReq() {\n        \n    }\n    \n    public QueryProcessNodeReq(String processInstanceNo, String nodeId, Set<String> status) {\n        this.processInstanceNo = processInstanceNo;\n        this.nodeId = nodeId;\n        this.status = status;\n    }\n\n    private String processInstanceNo;\n\n    private String nodeId;\n\n    private Set<String> status;\n\n    public String getProcessInstanceNo() {\n        return processInstanceNo;\n    }\n\n    public void setProcessInstanceNo(String processInstanceNo) {\n        this.processInstanceNo = processInstanceNo;\n    }\n\n    public String getNodeId() {\n        return nodeId;\n    }\n\n    public void setNodeId(String nodeId) {\n        this.nodeId = nodeId;\n    }\n\n    public Set<String> getStatus() {\n        return status;\n    }\n\n    public void setStatus(Set<String> status) {\n        this.status = status;\n    }\n\n    @Override\n    public String toString() {\n        return \"QueryProcessNodeReq [processInstanceNo=\" + processInstanceNo + \", nodeId=\" + nodeId + \", status=\"\n                + status + \"]\";\n    }\n    \n    public static QueryProcessNodeReq.QueryProcessNodeReqBuilder builder() {\n        return new QueryProcessNodeReq.QueryProcessNodeReqBuilder();\n    }\n    \n\n    public static class QueryProcessNodeReqBuilder {\n        private String processInstanceNo;\n        private String nodeId;\n        private Set<String> status;\n\n        public QueryProcessNodeReq.QueryProcessNodeReqBuilder processInstanceNo(String processInstanceNo) {\n            this.processInstanceNo = processInstanceNo;\n            return this;\n        }\n\n        public QueryProcessNodeReq.QueryProcessNodeReqBuilder nodeId(String nodeId) {\n            this.nodeId = nodeId;\n            return this;\n        }\n\n        public QueryProcessNodeReq.QueryProcessNodeReqBuilder status(Set<String> status) {\n            this.status = status;\n            return this;\n        }\n\n        public QueryProcessNodeReq build() {\n            return new QueryProcessNodeReq(this.processInstanceNo, this.nodeId, this.status);\n        }\n\n        public String toString() {\n            return \"QueryProcessNodeReq.QueryProcessNodeReqBuilder(processInstanceNo=\" + this.processInstanceNo\n                    + \", nodeId=\" + this.nodeId + \", status=\" + this.status + \")\";\n        }\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/domain/model/vo/QueryTaskAssignReqVO.java",
    "content": "package com.jd.easyflow.process.domain.model.vo;\n\nimport java.util.Date;\n\n/**\n * @author liyuliang5\n *\n */\npublic class QueryTaskAssignReqVO {\n\n    private Long id;\n\n    private String assignNo;\n\n    private String taskNo;\n\n    private String assignType;\n\n    private String assignGroup;\n    \n    private String assignGroup2;\n\n    private String assignUser;\n\n    private String status;\n\n    private String assignTimeStart;\n    private String assignTimeEnd;\n    \n    private String productCode;\n\n    private String extData;\n\n    private Date createdDate;\n\n    private Date modifiedDate;\n    \n    private String createdDateStart;\n    \n    private String createdDateEnd;\n    \n    private String modifiedDateStart;\n    \n    private String modifiedDateEnd;\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getAssignNo() {\n        return assignNo;\n    }\n\n    public void setAssignNo(String assignNo) {\n        this.assignNo = assignNo;\n    }\n\n    public String getTaskNo() {\n        return taskNo;\n    }\n\n    public void setTaskNo(String taskNo) {\n        this.taskNo = taskNo;\n    }\n\n    public String getAssignType() {\n        return assignType;\n    }\n\n    public void setAssignType(String assignType) {\n        this.assignType = assignType;\n    }\n\n    public String getAssignGroup() {\n        return assignGroup;\n    }\n\n    public void setAssignGroup(String assignGroup) {\n        this.assignGroup = assignGroup;\n    }\n\n    public String getAssignGroup2() {\n        return assignGroup2;\n    }\n\n    public void setAssignGroup2(String assignGroup2) {\n        this.assignGroup2 = assignGroup2;\n    }\n\n    public String getAssignUser() {\n        return assignUser;\n    }\n\n    public void setAssignUser(String assignUser) {\n        this.assignUser = assignUser;\n    }\n\n    public String getStatus() {\n        return status;\n    }\n\n    public void setStatus(String status) {\n        this.status = status;\n    }\n\n    public String getAssignTimeStart() {\n        return assignTimeStart;\n    }\n\n    public void setAssignTimeStart(String assignTimeStart) {\n        this.assignTimeStart = assignTimeStart;\n    }\n\n    public String getAssignTimeEnd() {\n        return assignTimeEnd;\n    }\n\n    public void setAssignTimeEnd(String assignTimeEnd) {\n        this.assignTimeEnd = assignTimeEnd;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n\n    public String getExtData() {\n        return extData;\n    }\n\n    public void setExtData(String extData) {\n        this.extData = extData;\n    }\n\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n\n    public String getCreatedDateStart() {\n        return createdDateStart;\n    }\n\n    public void setCreatedDateStart(String createdDateStart) {\n        this.createdDateStart = createdDateStart;\n    }\n\n    public String getCreatedDateEnd() {\n        return createdDateEnd;\n    }\n\n    public void setCreatedDateEnd(String createdDateEnd) {\n        this.createdDateEnd = createdDateEnd;\n    }\n\n    public String getModifiedDateStart() {\n        return modifiedDateStart;\n    }\n\n    public void setModifiedDateStart(String modifiedDateStart) {\n        this.modifiedDateStart = modifiedDateStart;\n    }\n\n    public String getModifiedDateEnd() {\n        return modifiedDateEnd;\n    }\n\n    public void setModifiedDateEnd(String modifiedDateEnd) {\n        this.modifiedDateEnd = modifiedDateEnd;\n    }\n\n    @Override\n    public String toString() {\n        return \"QueryTaskAssignReqVO [id=\" + id + \", assignNo=\" + assignNo + \", taskNo=\" + taskNo + \", assignType=\"\n                + assignType + \", assignGroup=\" + assignGroup + \", assignGroup2=\" + assignGroup2 + \", assignUser=\"\n                + assignUser + \", status=\" + status + \", assignTimeStart=\" + assignTimeStart + \", assignTimeEnd=\"\n                + assignTimeEnd + \", productCode=\" + productCode + \", extData=\" + extData + \", createdDate=\"\n                + createdDate + \", modifiedDate=\" + modifiedDate + \", createdDateStart=\" + createdDateStart\n                + \", createdDateEnd=\" + createdDateEnd + \", modifiedDateStart=\" + modifiedDateStart\n                + \", modifiedDateEnd=\" + modifiedDateEnd + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/domain/model/vo/QueryTaskEventReqVO.java",
    "content": "package com.jd.easyflow.process.domain.model.vo;\n\n/**\n * @author liyuliang5\n *\n */\npublic class QueryTaskEventReqVO {\n\n    private Long id;\n\n    private String eventNo;\n\n    private String taskNo;\n\n    private String eventType;\n\n    private String eventUser;\n\n    private String eventTimeStart;\n    \n    private String eventTimeEnd;\n\n    private String eventBizResult;\n\n    private Object eventBizData;\n\n    private String productCode;\n\n    private Object extData;\n\n    private String createdDateStart;\n    \n    private String createdDateEnd;\n\n    private String modifiedDateStart;\n    \n    private String modifiedDateEnd;\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getEventNo() {\n        return eventNo;\n    }\n\n    public void setEventNo(String eventNo) {\n        this.eventNo = eventNo;\n    }\n\n    public String getTaskNo() {\n        return taskNo;\n    }\n\n    public void setTaskNo(String taskNo) {\n        this.taskNo = taskNo;\n    }\n\n    public String getEventType() {\n        return eventType;\n    }\n\n    public void setEventType(String eventType) {\n        this.eventType = eventType;\n    }\n\n    public String getEventUser() {\n        return eventUser;\n    }\n\n    public void setEventUser(String eventUser) {\n        this.eventUser = eventUser;\n    }\n\n    public String getEventTimeStart() {\n        return eventTimeStart;\n    }\n\n    public void setEventTimeStart(String eventTimeStart) {\n        this.eventTimeStart = eventTimeStart;\n    }\n\n    public String getEventTimeEnd() {\n        return eventTimeEnd;\n    }\n\n    public void setEventTimeEnd(String eventTimeEnd) {\n        this.eventTimeEnd = eventTimeEnd;\n    }\n\n    public String getEventBizResult() {\n        return eventBizResult;\n    }\n\n    public void setEventBizResult(String eventBizResult) {\n        this.eventBizResult = eventBizResult;\n    }\n\n    public Object getEventBizData() {\n        return eventBizData;\n    }\n\n    public void setEventBizData(Object eventBizData) {\n        this.eventBizData = eventBizData;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n\n    public Object getExtData() {\n        return extData;\n    }\n\n    public void setExtData(Object extData) {\n        this.extData = extData;\n    }\n\n    public String getCreatedDateStart() {\n        return createdDateStart;\n    }\n\n    public void setCreatedDateStart(String createdDateStart) {\n        this.createdDateStart = createdDateStart;\n    }\n\n    public String getCreatedDateEnd() {\n        return createdDateEnd;\n    }\n\n    public void setCreatedDateEnd(String createdDateEnd) {\n        this.createdDateEnd = createdDateEnd;\n    }\n\n    public String getModifiedDateStart() {\n        return modifiedDateStart;\n    }\n\n    public void setModifiedDateStart(String modifiedDateStart) {\n        this.modifiedDateStart = modifiedDateStart;\n    }\n\n    public String getModifiedDateEnd() {\n        return modifiedDateEnd;\n    }\n\n    public void setModifiedDateEnd(String modifiedDateEnd) {\n        this.modifiedDateEnd = modifiedDateEnd;\n    }\n\n    @Override\n    public String toString() {\n        return \"QueryTaskEventReqVO [id=\" + id + \", eventNo=\" + eventNo + \", taskNo=\" + taskNo + \", eventType=\"\n                + eventType + \", eventUser=\" + eventUser + \", eventTimeStart=\" + eventTimeStart + \", eventTimeEnd=\"\n                + eventTimeEnd + \", eventBizResult=\" + eventBizResult + \", eventBizData=\" + eventBizData\n                + \", productCode=\" + productCode + \", extData=\" + extData + \", createdDateStart=\" + createdDateStart\n                + \", createdDateEnd=\" + createdDateEnd + \", modifiedDateStart=\" + modifiedDateStart\n                + \", modifiedDateEnd=\" + modifiedDateEnd + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/domain/model/vo/QueryTaskReqVO.java",
    "content": "package com.jd.easyflow.process.domain.model.vo;\n\n/**\n * @author liyuliang5\n *\n */\npublic class QueryTaskReqVO {\n\n    private Long id;\n    \n    private String taskNo;\n    \n    private String processType;\n    \n    private String bizNo;\n    \n    private String taskBizCode;\n    \n    private String taskType;\n    \n    private String processInstanceNo;\n    \n    private String nodeInstanceNo;\n    \n    private String assignType;\n    \n    private String assignTimeStart;\n    private String assignTimeEnd;\n    \n    private String executor;\n    \n    private String executeTimeStart;\n    \n    private String executeTimeEnd;\n    \n    private String productCode;\n    \n    private String creator;\n    \n    private String status;\n    \n    private String createdDateStart;\n    \n    private String createdDateEnd;\n    \n    private String modifiedDateStart;\n    \n    private String modifiedDateEnd;\n    \n    private String processInstanceKeyField;\n\n    private String processInstanceKeyField2;\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getTaskNo() {\n        return taskNo;\n    }\n\n    public void setTaskNo(String taskNo) {\n        this.taskNo = taskNo;\n    }\n\n    public String getProcessType() {\n        return processType;\n    }\n\n    public void setProcessType(String processType) {\n        this.processType = processType;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    public String getTaskBizCode() {\n        return taskBizCode;\n    }\n\n    public void setTaskBizCode(String taskBizCode) {\n        this.taskBizCode = taskBizCode;\n    }\n\n    public String getTaskType() {\n        return taskType;\n    }\n\n    public void setTaskType(String taskType) {\n        this.taskType = taskType;\n    }\n\n    public String getProcessInstanceNo() {\n        return processInstanceNo;\n    }\n\n    public void setProcessInstanceNo(String processInstanceNo) {\n        this.processInstanceNo = processInstanceNo;\n    }\n\n    public String getNodeInstanceNo() {\n        return nodeInstanceNo;\n    }\n\n    public void setNodeInstanceNo(String nodeInstanceNo) {\n        this.nodeInstanceNo = nodeInstanceNo;\n    }\n\n    public String getAssignType() {\n        return assignType;\n    }\n\n    public void setAssignType(String assignType) {\n        this.assignType = assignType;\n    }\n\n    public String getAssignTimeStart() {\n        return assignTimeStart;\n    }\n\n    public void setAssignTimeStart(String assignTimeStart) {\n        this.assignTimeStart = assignTimeStart;\n    }\n\n    public String getAssignTimeEnd() {\n        return assignTimeEnd;\n    }\n\n    public void setAssignTimeEnd(String assignTimeEnd) {\n        this.assignTimeEnd = assignTimeEnd;\n    }\n\n    public String getExecutor() {\n        return executor;\n    }\n\n    public void setExecutor(String executor) {\n        this.executor = executor;\n    }\n\n    public String getExecuteTimeStart() {\n        return executeTimeStart;\n    }\n\n    public void setExecuteTimeStart(String executeTimeStart) {\n        this.executeTimeStart = executeTimeStart;\n    }\n\n    public String getExecuteTimeEnd() {\n        return executeTimeEnd;\n    }\n\n    public void setExecuteTimeEnd(String executeTimeEnd) {\n        this.executeTimeEnd = executeTimeEnd;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n\n    public String getCreator() {\n        return creator;\n    }\n\n    public void setCreator(String creator) {\n        this.creator = creator;\n    }\n\n    public String getStatus() {\n        return status;\n    }\n\n    public void setStatus(String status) {\n        this.status = status;\n    }\n\n    public String getCreatedDateStart() {\n        return createdDateStart;\n    }\n\n    public void setCreatedDateStart(String createdDateStart) {\n        this.createdDateStart = createdDateStart;\n    }\n\n    public String getCreatedDateEnd() {\n        return createdDateEnd;\n    }\n\n    public void setCreatedDateEnd(String createdDateEnd) {\n        this.createdDateEnd = createdDateEnd;\n    }\n\n    public String getModifiedDateStart() {\n        return modifiedDateStart;\n    }\n\n    public void setModifiedDateStart(String modifiedDateStart) {\n        this.modifiedDateStart = modifiedDateStart;\n    }\n\n    public String getModifiedDateEnd() {\n        return modifiedDateEnd;\n    }\n\n    public void setModifiedDateEnd(String modifiedDateEnd) {\n        this.modifiedDateEnd = modifiedDateEnd;\n    }\n\n    public String getProcessInstanceKeyField() {\n        return processInstanceKeyField;\n    }\n\n    public void setProcessInstanceKeyField(String processInstanceKeyField) {\n        this.processInstanceKeyField = processInstanceKeyField;\n    }\n\n    public String getProcessInstanceKeyField2() {\n        return processInstanceKeyField2;\n    }\n\n    public void setProcessInstanceKeyField2(String processInstanceKeyField2) {\n        this.processInstanceKeyField2 = processInstanceKeyField2;\n    }\n\n    @Override\n    public String toString() {\n        return \"QueryTaskReqVO [id=\" + id + \", taskNo=\" + taskNo + \", processType=\" + processType + \", bizNo=\" + bizNo\n                + \", taskBizCode=\" + taskBizCode + \", taskType=\" + taskType + \", processInstanceNo=\" + processInstanceNo\n                + \", nodeInstanceNo=\" + nodeInstanceNo + \", assignType=\" + assignType + \", assignTimeStart=\"\n                + assignTimeStart + \", assignTimeEnd=\" + assignTimeEnd + \", executor=\" + executor\n                + \", executeTimeStart=\" + executeTimeStart + \", executeTimeEnd=\" + executeTimeEnd + \", productCode=\"\n                + productCode + \", creator=\" + creator + \", status=\" + status + \", createdDateStart=\" + createdDateStart\n                + \", createdDateEnd=\" + createdDateEnd + \", modifiedDateStart=\" + modifiedDateStart\n                + \", modifiedDateEnd=\" + modifiedDateEnd + \", processInstanceKeyField=\" + processInstanceKeyField\n                + \", processInstanceKeyField2=\" + processInstanceKeyField2 + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/domain/model/vo/RollbackNodeReqVO.java",
    "content": "package com.jd.easyflow.process.domain.model.vo;\n\n/**\n * @author liyuliang5\n */\npublic class RollbackNodeReqVO {\n\n    private String processInstanceNo;\n    \n    private String targetNodeId;\n    \n    private String targetNodeInstanceNo;\n    \n    private boolean rollbackSubProcess = true;\n    \n    private boolean rollbackTask = true;\n\n    public String getProcessInstanceNo() {\n        return processInstanceNo;\n    }\n\n    public void setProcessInstanceNo(String processInstanceNo) {\n        this.processInstanceNo = processInstanceNo;\n    }\n\n    public String getTargetNodeInstanceNo() {\n        return targetNodeInstanceNo;\n    }\n\n    public void setTargetNodeInstanceNo(String targetNodeInstanceNo) {\n        this.targetNodeInstanceNo = targetNodeInstanceNo;\n    }\n\n    public String getTargetNodeId() {\n        return targetNodeId;\n    }\n\n    public void setTargetNodeId(String targetNodeId) {\n        this.targetNodeId = targetNodeId;\n    }\n\n    public boolean isRollbackSubProcess() {\n        return rollbackSubProcess;\n    }\n\n    public void setRollbackSubProcess(boolean rollbackSubProcess) {\n        this.rollbackSubProcess = rollbackSubProcess;\n    }\n\n    public boolean isRollbackTask() {\n        return rollbackTask;\n    }\n\n    public void setRollbackTask(boolean rollbackTask) {\n        this.rollbackTask = rollbackTask;\n    }\n    \n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/domain/model/vo/ScheduleProcessReqVO.java",
    "content": "package com.jd.easyflow.process.domain.model.vo;\n\nimport java.util.Arrays;\nimport java.util.Map;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ScheduleProcessReqVO {\n\n    private String processId;\n    \n    private String[] nodeIds;\n    \n    private Object param;\n    \n    private Map<String, Object> dataMap;\n    \n    private String processType;\n    \n    private String bizNo;\n    \n    private String processInstanceNo;\n    \n    private String productCode;\n\n    public String getProcessId() {\n        return processId;\n    }\n\n    public void setProcessId(String processId) {\n        this.processId = processId;\n    }\n\n    public String[] getNodeIds() {\n        return nodeIds;\n    }\n\n    public void setNodeIds(String[] nodeIds) {\n        this.nodeIds = nodeIds;\n    }\n\n    public Object getParam() {\n        return param;\n    }\n\n    public void setParam(Object param) {\n        this.param = param;\n    }\n\n    public Map<String, Object> getDataMap() {\n        return dataMap;\n    }\n\n    public void setDataMap(Map<String, Object> dataMap) {\n        this.dataMap = dataMap;\n    }\n\n    public String getProcessType() {\n        return processType;\n    }\n\n    public void setProcessType(String processType) {\n        this.processType = processType;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    public String getProcessInstanceNo() {\n        return processInstanceNo;\n    }\n\n    public void setProcessInstanceNo(String processInstanceNo) {\n        this.processInstanceNo = processInstanceNo;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n\n    @Override\n    public String toString() {\n        return \"ScheduleProcessReqVO [processId=\" + processId + \", nodeIds=\" + Arrays.toString(nodeIds) + \", param=\"\n                + param + \", dataMap=\" + dataMap + \", processType=\" + processType + \", bizNo=\" + bizNo\n                + \", processInstanceNo=\" + processInstanceNo + \", productCode=\" + productCode + \"]\";\n    }\n    \n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/domain/model/vo/ScheduleProcessResVO.java",
    "content": "package com.jd.easyflow.process.domain.model.vo;\n\nimport java.util.Map;\n\n/**\n * \n * @author liyuliang5\n */\npublic class ScheduleProcessResVO {\n\n    private String processInstanceNo;\n    \n    private Object result;\n    \n    private Map<String, Object> dataMap;\n\n    public String getProcessInstanceNo() {\n        return processInstanceNo;\n    }\n\n    public void setProcessInstanceNo(String processInstanceNo) {\n        this.processInstanceNo = processInstanceNo;\n    }\n\n    public Object getResult() {\n        return result;\n    }\n\n    public void setResult(Object result) {\n        this.result = result;\n    }\n\n    public Map<String, Object> getDataMap() {\n        return dataMap;\n    }\n\n    public void setDataMap(Map<String, Object> dataMap) {\n        this.dataMap = dataMap;\n    }\n\n    @Override\n    public String toString() {\n        return \"ScheduleProcessResVO [processInstanceNo=\" + processInstanceNo + \", result=\" + result + \", dataMap=\"\n                + dataMap + \"]\";\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/domain/model/vo/TaskInfoForPagerVO.java",
    "content": "package com.jd.easyflow.process.domain.model.vo;\n\n/**\n * @author liyuliang5\n *\n */\npublic class TaskInfoForPagerVO {\n\n    private String taskNo;\n    \n    private String processType;\n    \n    private String taskBizCode;\n    \n    private String taskBizName;\n    \n    private String bizNo;\n    \n    private String productCode;\n    \n    private String processInstanceNo;\n    \n    private String nodeInstanceNo;\n    \n    private String creator;\n    \n    private String status;\n    \n    private String executor;\n    \n    private String executeBizResult;\n    \n    private String executeBizData;\n    \n    private String executeTime;\n    \n    private String createdDate;\n    \n    private String modifiedDate;\n\n    public String getTaskNo() {\n        return taskNo;\n    }\n\n    public void setTaskNo(String taskNo) {\n        this.taskNo = taskNo;\n    }\n\n    public String getProcessType() {\n        return processType;\n    }\n\n    public void setProcessType(String processType) {\n        this.processType = processType;\n    }\n\n    public String getTaskBizCode() {\n        return taskBizCode;\n    }\n\n    public void setTaskBizCode(String taskBizCode) {\n        this.taskBizCode = taskBizCode;\n    }\n\n    public String getTaskBizName() {\n        return taskBizName;\n    }\n\n    public void setTaskBizName(String taskBizName) {\n        this.taskBizName = taskBizName;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n\n    public String getProcessInstanceNo() {\n        return processInstanceNo;\n    }\n\n    public void setProcessInstanceNo(String processInstanceNo) {\n        this.processInstanceNo = processInstanceNo;\n    }\n\n    public String getNodeInstanceNo() {\n        return nodeInstanceNo;\n    }\n\n    public void setNodeInstanceNo(String nodeInstanceNo) {\n        this.nodeInstanceNo = nodeInstanceNo;\n    }\n\n    public String getCreator() {\n        return creator;\n    }\n\n    public void setCreator(String creator) {\n        this.creator = creator;\n    }\n\n    public String getStatus() {\n        return status;\n    }\n\n    public void setStatus(String status) {\n        this.status = status;\n    }\n\n    public String getExecutor() {\n        return executor;\n    }\n\n    public void setExecutor(String executor) {\n        this.executor = executor;\n    }\n\n    public String getExecuteBizResult() {\n        return executeBizResult;\n    }\n\n    public void setExecuteBizResult(String executeBizResult) {\n        this.executeBizResult = executeBizResult;\n    }\n\n    public String getExecuteBizData() {\n        return executeBizData;\n    }\n\n    public void setExecuteBizData(String executeBizData) {\n        this.executeBizData = executeBizData;\n    }\n\n    public String getExecuteTime() {\n        return executeTime;\n    }\n\n    public void setExecuteTime(String executeTime) {\n        this.executeTime = executeTime;\n    }\n\n    public String getCreatedDate() {\n        return createdDate;\n    }\n\n    public void setCreatedDate(String createdDate) {\n        this.createdDate = createdDate;\n    }\n\n    public String getModifiedDate() {\n        return modifiedDate;\n    }\n\n    public void setModifiedDate(String modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n\n    @Override\n    public String toString() {\n        return \"TaskInfoForPagerVO [taskNo=\" + taskNo + \", processType=\" + processType + \", taskBizCode=\" + taskBizCode\n                + \", taskBizName=\" + taskBizName + \", bizNo=\" + bizNo + \", productCode=\" + productCode\n                + \", processInstanceNo=\" + processInstanceNo + \", nodeInstanceNo=\" + nodeInstanceNo + \", creator=\"\n                + creator + \", status=\" + status + \", executor=\" + executor + \", executeBizResult=\" + executeBizResult\n                + \", executeBizData=\" + executeBizData + \", executeTime=\" + executeTime + \", createdDate=\" + createdDate\n                + \", modifiedDate=\" + modifiedDate + \"]\";\n    }\n    \n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/domain/repository/ProcessRepository.java",
    "content": "package com.jd.easyflow.process.domain.repository;\n\nimport java.util.List;\n\nimport com.jd.easyflow.common.dto.pager.PagerCondition;\nimport com.jd.easyflow.common.dto.pager.PagerResult;\nimport com.jd.easyflow.process.domain.model.entity.ProcessDefinitionEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessInstanceEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessNodeExecutionEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessNodeInstanceEntity;\nimport com.jd.easyflow.process.domain.model.vo.ProcessDefinitionForListVO;\nimport com.jd.easyflow.process.domain.model.vo.QueryProcessNodeReq;\n\n/**\n * \n * @author liyuliang5\n * \n */\npublic interface ProcessRepository {\n    \n    /*ProcessInstance*/\n    \n    void saveProcessInstance(ProcessInstanceEntity entity);\n    \n    void saveProcessInstanceWithCreatedDate(ProcessInstanceEntity entity);\n    \n    void updateProcessInstanceById(ProcessInstanceEntity entity);\n    \n    void updateProcessInstanceByNo(ProcessInstanceEntity entity);\n    \n    void deleteProcessInstanceByNo(String processInstanceNo);\n\n    ProcessInstanceEntity getProcessInstanceByProcessTypeAndBizNo(String processType, String bizNo);\n\n    ProcessInstanceEntity getActiveProcessInstanceByProcessTypeAndBizNo(String processType, String bizNo);\n    \n    ProcessInstanceEntity getByProcessInstanceNo(String processInstanceNo);\n    \n    PagerResult<ProcessInstanceEntity> pageQueryProcessInstance(PagerCondition pagerQueryReq);\n    \n    List<ProcessInstanceEntity> queryProcessInstanceByInstanceNos(List<String> processInstanceNos);\n    \n    List<ProcessInstanceEntity> queryProcessInstanceByParentInstanceNo(String parentProcessInstanceNo);\n    List<ProcessInstanceEntity> queryProcessInstanceByParentNodeInstanceNo(String parentInstanceNo, String parentNodeInstanceNo);\n\n    /*NodeInstance*/\n    \n    void saveProcessNodeInstance(ProcessNodeInstanceEntity entity);\n    \n    void saveProcessNodeInstanceWithCreatedDate(ProcessNodeInstanceEntity entity);\n\n    void updateProcessNodeInstanceById(ProcessNodeInstanceEntity entity);\n    \n    void updateProcessNodeInstanceByNo(ProcessNodeInstanceEntity entity);\n    \n    void deleteProcessNodeInstanceByNo(String processNodeInstanceNo);\n    \n    ProcessNodeInstanceEntity getOpenNodeInstance(String processInstanceNo, String nodeId);\n    \n    List<ProcessNodeInstanceEntity> findNodeInstances(QueryProcessNodeReq queryReq);\n    \n    ProcessNodeInstanceEntity getByNodeInstanceNo(String nodeInstanceNo);\n    \n   List<ProcessNodeInstanceEntity> findActiveNodeInstances(String processInstanceNo);\n    \n    List<ProcessNodeInstanceEntity> findOpenNodeInstances(String processInstanceNo);\n    \n    List<ProcessNodeInstanceEntity> queryNodeInstanceByNos(List<String> nodeInstanceNos);\n    \n    /*NodeExecution*/\n    \n    ProcessNodeExecutionEntity getByNodeExecutionNo(String nodeExecutionNo);\n    \n    PagerResult<ProcessNodeExecutionEntity> pagerQueryNodeExecution(PagerCondition pagerQueryReq);\n    \n    void saveProcessNodeExecution(ProcessNodeExecutionEntity entity);\n    \n    void saveProcessNodeExecutionWithCreatedDate(ProcessNodeExecutionEntity entity);\n\n    void updateProcessNodeExecutionById(ProcessNodeExecutionEntity entity);\n    \n    void updateProcessNodeExecutionByNo(ProcessNodeExecutionEntity entity);\n    \n \n    /*ProcessDefinition*/\n\n    void saveProcessDefinition(ProcessDefinitionEntity entity);\n\n    int updateProcessDefinitionLatestById(long id);\n\n    int updateProcessDefinitionById(ProcessDefinitionEntity processDefinition);\n\n    PagerResult<ProcessDefinitionForListVO> pageQueryProcessDefinition(PagerCondition pagerQueryReq);\n\n    ProcessDefinitionEntity findProcessDefinitionByDefIdAndVersion(String defId, Integer defVersion);\n\n    ProcessDefinitionEntity findLatestProcessDefinition(String defId);\n\n    boolean existProcessDefinition(String defId);\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/domain/repository/ProcessTaskRepository.java",
    "content": "package com.jd.easyflow.process.domain.repository;\n\nimport java.util.List;\n\nimport com.jd.easyflow.common.dto.pager.PagerCondition;\nimport com.jd.easyflow.common.dto.pager.PagerResult;\nimport com.jd.easyflow.process.domain.model.entity.ProcessTaskAssignEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessTaskEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessTaskEventEntity;\nimport com.jd.easyflow.process.domain.model.vo.QueryTaskReqVO;\nimport com.jd.easyflow.process.domain.model.vo.TaskInfoForPagerVO;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic interface ProcessTaskRepository {\n\n    \n    void saveOrUpdate(ProcessTaskEntity taskEntity, List<ProcessTaskEventEntity> eventList, List<ProcessTaskAssignEntity> assignEntityList);\n    \n    void save(ProcessTaskEntity taskEntity);\n    \n    void saveWithCreatedDate(ProcessTaskEntity taskEntity);\n    \n    void updateById(ProcessTaskEntity taskEntity);\n    \n    void updateByTaskNo(ProcessTaskEntity taskEntity);\n    \n    void save(ProcessTaskAssignEntity assignEntity);\n    \n    void saveWithCreatedDate(ProcessTaskAssignEntity assignEntity);\n    \n    void updateById(ProcessTaskAssignEntity assignEntity);\n    \n    void updateByTaskAssignNo(ProcessTaskAssignEntity assignEntity);\n    \n    void save(ProcessTaskEventEntity eventEntity);\n    \n    void saveWithCreatedDate(ProcessTaskEventEntity eventEntity);\n    \n    void updateById(ProcessTaskEventEntity eventEntity);\n    \n    void updateByTaskEventNo(ProcessTaskEventEntity eventEntity);\n    \n    void deleteTaskByTaskNo(String taskNo);\n    \n    void deleteTaskAssignByAssignNo(String assignNo);\n    \n    \n    \n\n    List<ProcessTaskEntity> queryTask(QueryTaskReqVO query);\n    \n    ProcessTaskEntity getTask(String taskNo);\n    \n    ProcessTaskAssignEntity getTaskAssign(String taskAssignNo);\n    \n    ProcessTaskEventEntity getTaskEvent(String taskEventNo);\n\n    List<ProcessTaskAssignEntity> findTaskAssignListByTaskNo(String taskNo);\n    \n    List<ProcessTaskAssignEntity> findTaskAssignListByTaskNoList(List<String> taskNoList);\n    \n    List<ProcessTaskEventEntity> findTaskEventListByTaskNo(String taskNo);\n    \n    PagerResult<TaskInfoForPagerVO> pagerQueryTask(PagerCondition condition);\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/domain/service/ProcessDefinitionDomainService.java",
    "content": "package com.jd.easyflow.process.domain.service;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Objects;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.transaction.support.TransactionSynchronization;\nimport org.springframework.transaction.support.TransactionSynchronizationManager;\nimport org.springframework.transaction.support.TransactionTemplate;\n\nimport com.jd.easyflow.cache.CacheService;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponseCode;\nimport com.jd.easyflow.common.dto.pager.PagerCondition;\nimport com.jd.easyflow.common.dto.pager.PagerResult;\nimport com.jd.easyflow.common.exception.UserException;\nimport com.jd.easyflow.common.util.AssertUtils;\nimport com.jd.easyflow.common.util.CommonErrorCode;\nimport com.jd.easyflow.common.util.MessageUtil;\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.parser.FlowParser;\nimport com.jd.easyflow.flow.model.parser.FlowParserImpl;\nimport com.jd.easyflow.fsm.Fsm;\nimport com.jd.easyflow.fsm.model.State;\nimport com.jd.easyflow.fsm.parser.FsmParser;\nimport com.jd.easyflow.lock.Locker;\nimport com.jd.easyflow.process.adapter.export.dto.definition.NodeDTO;\nimport com.jd.easyflow.process.adapter.export.dto.definition.ProcessDTO;\nimport com.jd.easyflow.process.adapter.export.dto.definition.QueryNodeReq;\nimport com.jd.easyflow.process.domain.constant.ProcessDefinitionConstants;\nimport com.jd.easyflow.process.domain.model.entity.ProcessDefinitionEntity;\nimport com.jd.easyflow.process.domain.model.vo.ProcessDefinitionForListVO;\nimport com.jd.easyflow.process.domain.repository.ProcessRepository;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessDefinitionDomainService {\n    \n    private static final Logger log = LoggerFactory.getLogger(ProcessDefinitionDomainService.class);\n\n\n    private static final int MAX_PAGE_SIZE = 10000;\n\n    public static final String CACHE_KEY_PREFIX = \"PROCESS_DEF_VERSION_\";\n\n    private static final Integer INIT_VERSION = 0;\n\n    public static final String PROCESS_DEFINITION_LOCK = \"_MODIFY_PROCESS_DEFINITION_\";\n    \n    private static final String DEF_VERSION_NONE = \"none\";\n\n    private static final String DEF_VERSION_NULL = \"null\";\n    \n    @Autowired\n    private ProcessRepository processRepository;\n    private CacheService cacheService;\n    private Locker locker;\n    private TransactionTemplate transactionTemplate;\n\n    private Map<String, Object> processMap = new ConcurrentHashMap<>();\n\n    private FlowParser flowParser = new FlowParserImpl();\n    \n    // default false. true is for old version compatible. if set to true, sub flow is not reported.\n    private boolean onlyProcessListAttachedProcess = false;\n\n    public ProcessDefinitionEntity findLatestProcessDefinitionDetail(String defId) {\n        return processRepository.findLatestProcessDefinition(defId);\n    }\n\n    public boolean existProcessDefinition(String defId) {\n        AssertUtils.isNotNull(defId, \"defId must not be null\");\n        return processRepository.existProcessDefinition(defId);\n    }\n\n    public boolean existProcessDefinition(String defId, Integer defVersion) {\n        AssertUtils.isNotNull(defId, \"defId must not be null\");\n        AssertUtils.isNotNull(defVersion, \"defVersion must not be null\");\n        ProcessDefinitionEntity processDef = processRepository.findProcessDefinitionByDefIdAndVersion(defId,\n                defVersion);\n        return processDef != null;\n    }\n\n    private void innerAddProcessDefinition(ProcessDefinitionEntity entity) {\n        processRepository.saveProcessDefinition(entity);\n        if (entity.getLatest()) {\n            updateDefLatestCacheVersion(entity.getDefId(), entity.getDefVersion());\n        }\n    }\n\n    public void addProcessDefinition(ProcessDefinitionEntity processDefinition) {\n        AssertUtils.isNotNull(processDefinition, \"processDefinitionVO must not be null\");\n        AssertUtils.isNotNull(processDefinition.getDefId(), \"processDefinitionVO defId must not be null\");\n        AssertUtils.isNotNull(processDefinition.getFormat(), \"processDefinitionVO format must not be null\");\n        AssertUtils.isNotNull(processDefinition.getContent(), \"processDefinitionVO content must not be null\");\n        AssertUtils.isNotNull(processDefinition.getJsonContent(), \"processDefinitionVO jsonContent must not be null\");\n        checkMainProcessIdConsistent(processDefinition);\n        locker.doInLock(PROCESS_DEFINITION_LOCK, processDefinition.getDefId(), () -> {\n            boolean exist = existProcessDefinition(processDefinition.getDefId());\n            if (exist) {\n                log.error(\"exists process definition:{}\", processDefinition.getDefId());\n                throw new UserException(CommonErrorCode.E0000003.getCode(), CommonErrorCode.E0000003.getDesc());\n            }\n            processDefinition.setDefVersion(INIT_VERSION);\n            processDefinition.setLatest(true);\n            transactionTemplate.executeWithoutResult(transactionStatus -> {\n                innerAddProcessDefinition(processDefinition);\n                addOrUpdateAttachedProcesses(processDefinition);\n            });\n            return null;\n        });\n    }\n\n    public void reportProcessDef(ProcessDefinitionEntity processDefinitionEntity) {\n        AssertUtils.isNotNull(processDefinitionEntity, \"processDefinitionVO must not be null\");\n        AssertUtils.isNotNull(processDefinitionEntity.getDefId(), \"ProcessDefinition defId must not be null\");\n        AssertUtils.isNotNull(processDefinitionEntity.getFormat(), \"ProcessDefinition format must not be null\");\n        AssertUtils.isNotNull(processDefinitionEntity.getContent(), \"ProcessDefinition content must not be null\");\n        AssertUtils.isNotNull(processDefinitionEntity.getJsonContent(), \"ProcessDefinition jsonContent must not be null\");\n        ProcessDefinitionEntity processDefinition = processRepository.findProcessDefinitionByDefIdAndVersion(\n                processDefinitionEntity.getDefId(), processDefinitionEntity.getDefVersion());\n        if (processDefinition != null) {\n            transactionTemplate.executeWithoutResult(transactionStatus -> {\n                processDefinitionEntity.setId(processDefinition.getId());\n                updateReportProcessDefinitionById(processDefinition, processDefinitionEntity);\n                processDefinitionEntity.setLatest(processDefinition.getLatest());\n                addOrUpdateAttachedProcesses(processDefinitionEntity);\n            });\n        } else {\n            locker.doInLock(PROCESS_DEFINITION_LOCK, processDefinitionEntity.getDefId(), () -> {\n                transactionTemplate.executeWithoutResult(transactionStatus -> {\n                    String defId = processDefinitionEntity.getDefId();\n                    ProcessDefinitionEntity processDefEntity = processRepository\n                            .findProcessDefinitionByDefIdAndVersion(defId, processDefinitionEntity.getDefVersion());\n                    if (processDefEntity != null) {\n                        processDefinitionEntity.setId(processDefEntity.getId());\n                        updateReportProcessDefinitionById(processDefEntity, processDefinitionEntity);\n                        processDefinitionEntity.setLatest(processDefEntity.getLatest());\n                    } else {\n                        addReportProcessDefinition(processDefinitionEntity);\n                    }\n                    addOrUpdateAttachedProcesses(processDefinitionEntity);\n                });\n                return null;\n            });\n        }\n\n    }\n    \n    private void addReportProcessDefinition(ProcessDefinitionEntity processDefinitionEntity) {\n\n        ProcessDefinitionEntity latestProcessDefinition = processRepository\n                .findLatestProcessDefinition(processDefinitionEntity.getDefId());\n        processDefinitionEntity.setLatest(true);\n        if (null != latestProcessDefinition && null != latestProcessDefinition.getDefVersion()) {\n            processDefinitionEntity.setLatest(false);\n        }\n        innerAddProcessDefinition(processDefinitionEntity);\n    }\n    \n    private void updateReportProcessDefinitionById(ProcessDefinitionEntity originProcessDef,ProcessDefinitionEntity targetProcessDef) {\n        fixBizTypeAndCategory(originProcessDef,targetProcessDef);\n        updateProcessDefinitionById(targetProcessDef);\n    }\n\n    private void fixBizTypeAndCategory(ProcessDefinitionEntity originProcessDef,ProcessDefinitionEntity targetProcessDef){\n        if(null == originProcessDef){\n            return;\n        }\n        if(originProcessDef.getBizType() != null){\n            targetProcessDef.setBizType(originProcessDef.getBizType());\n        }\n        if(originProcessDef.getCategory() != null){\n            targetProcessDef.setCategory(originProcessDef.getCategory());\n        }\n\n    }\n    \n    private void updateDefLatestCacheVersion(String defId, Integer latestVersion) {\n        TransactionSynchronization synchronization = new TransactionSynchronization() {\n            @Override\n            public void afterCommit() {\n                doUpdateDefLatestCacheVersion(defId, latestVersion);\n            }\n        };\n        TransactionSynchronizationManager.registerSynchronization(synchronization);\n    }\n\n    private void doUpdateDefLatestCacheVersion(String defId, Integer latestVersion) {\n        String latestVersionStr = null == latestVersion ? \"null\" : latestVersion.toString();\n        String cacheKey = CACHE_KEY_PREFIX.concat(defId);\n        cacheService.set(cacheKey, latestVersionStr);\n    }\n\n    public void updateProcessDefinition(ProcessDefinitionEntity processDefinition) {\n        AssertUtils.isNotNull(processDefinition, \"processDefinition must not be null\");\n        AssertUtils.isNotNull(processDefinition.getDefId(), \"ProcessDefinition defId must not be null\");\n        checkMainProcessIdConsistent(processDefinition);\n        \n        locker.doInLock(PROCESS_DEFINITION_LOCK, processDefinition.getDefId(), () -> {\n            transactionTemplate.executeWithoutResult(transactionStatus -> {\n                ProcessDefinitionEntity currentProcessDefinition = processRepository.findProcessDefinitionByDefIdAndVersion(\n                        processDefinition.getDefId(), processDefinition.getDefVersion());\n                if (currentProcessDefinition == null) {\n                    log.error(\"find none process definition, defId:{}, defVersion:{}\", processDefinition.getDefId(),\n                            processDefinition.getDefVersion());\n                    throw new UserException(MessageUtil.getMessage(\"easyflow.process.server.tip.latestDefinitionNotFound\"));\n                }\n                String extDataStr = currentProcessDefinition.getExtData();\n                if (extDataStr != null && ! extDataStr.isEmpty()) {\n                    Map<String, Object> extData = JSON.parseObject(extDataStr, Map.class);\n                    if (extData != null && extData.get(ProcessDefinitionConstants.EXT_DATA_KEY_MAIN_PROCESS_ID) != null) {\n                        throw new UserException(MessageUtil.getMessage(\"easyflow.process.server.tip.attachedProcessDefinitionCannotUpdate\", new Object[] { extData.get(ProcessDefinitionConstants.EXT_DATA_KEY_MAIN_PROCESS_ID)}));\n                    }\n                }\n    \n                if (Objects.equals(currentProcessDefinition.getContent(), processDefinition.getContent())) {\n                    processDefinition.setId(currentProcessDefinition.getId());                \n                    updateProcessDefinitionById(processDefinition);\n                } else {\n                    processDefinition.setCreatedBy(processDefinition.getModifiedBy());\n                    addProcessDefinition4Update(processDefinition);\n                    addOrUpdateAttachedProcesses(processDefinition);\n                }\n            });\n            return null;\n        });\n    }\n    \n    private void checkMainProcessIdConsistent(ProcessDefinitionEntity definition) {\n        String mainId = null;\n        if (ProcessDefinitionConstants.PROCESS_FORMAT_FSM_EASY.equals(definition.getFormat())) {\n            Fsm fsm = FsmParser.parse(definition.getJsonContent(), false);\n            mainId = fsm.getId();\n        } else {\n            Flow flow = flowParser.parse(definition.getJsonContent(), false).get(0);\n            mainId = flow.getId();\n        }\n        if (! Objects.equals(mainId, definition.getDefId())) {\n            throw new UserException(MessageUtil.getMessage(\"easyflow.process.server.tip.processIdInconsistent\"));\n        }\n    }\n\n    public void updateProcessDefinitionById(ProcessDefinitionEntity processDefinition) {\n        processRepository.updateProcessDefinitionById(processDefinition);\n    }\n\n    public void addProcessDefinition4Update(ProcessDefinitionEntity processDefinition) {\n        ProcessDefinitionEntity latestProcessDefinition = processRepository\n                .findLatestProcessDefinition(processDefinition.getDefId());\n        processRepository.updateProcessDefinitionLatestById(latestProcessDefinition.getId());\n        processDefinition.setDefVersion(latestProcessDefinition.getDefVersion() == null ? 0\n                : latestProcessDefinition.getDefVersion() + 1);\n        processDefinition.setLatest(true);\n        innerAddProcessDefinition(processDefinition);\n\n    }\n    \n    public void forceUpdateProcessDefinition(ProcessDefinitionEntity processDefinition) {\n        AssertUtils.isNotNull(processDefinition, \"processDefinition must not be null\");\n        AssertUtils.isNotNull(processDefinition.getDefId(), \"ProcessDefinition defId must not be empty\");\n        checkMainProcessIdConsistent(processDefinition);\n        locker.doInLock(PROCESS_DEFINITION_LOCK, processDefinition.getDefId(), () -> {\n            transactionTemplate.executeWithoutResult(transactionStatus -> {\n            ProcessDefinitionEntity processDefEntity = processRepository.findProcessDefinitionByDefIdAndVersion(\n                    processDefinition.getDefId(), processDefinition.getDefVersion());\n            if (processDefEntity == null) {\n                log.error(\"process definiton {} not found\", processDefinition.getDefId());\n                throw new UserException(MessageUtil.getMessage(\"easyflow.process.server.tip.matchedDefinitionNotFound\"));\n            }\n            String extDataStr = processDefEntity.getExtData();\n            if (extDataStr != null && ! extDataStr.isEmpty()) {\n                Map<String, Object> extData = JSON.parseObject(extDataStr, Map.class);\n                if (extData != null &&  extData.get(ProcessDefinitionConstants.EXT_DATA_KEY_MAIN_PROCESS_ID) != null) {\n                    throw new UserException(MessageUtil.getMessage(\"easyflow.process.server.tip.AttachedProcessDefinitionCannotUpdate\", new Object[] { extData.get(ProcessDefinitionConstants.EXT_DATA_KEY_MAIN_PROCESS_ID)}));\n                }\n            }\n            processDefinition.setId(processDefEntity.getId());\n            processRepository.updateProcessDefinitionById(processDefinition);\n            processDefinition.setLatest(processDefEntity.getLatest());\n            addOrUpdateAttachedProcesses(processDefinition);\n            });\n            return null;\n        });\n    }\n\n    public ProcessDefinitionEntity findLatestProcessDefinition(String defId) {\n        return processRepository.findLatestProcessDefinition(defId);\n    }\n\n    public ProcessDefinitionEntity getLatestProcessDefinition(String defIdWithVersion) {\n        Object[] info = parseDefId(defIdWithVersion);\n        String defId = (String) info[0];\n        return processRepository.findLatestProcessDefinition(defId);\n    }\n\n    public ProcessDefinitionEntity getVersionedProcessDefinition(String defIdWithVersion) {\n        Object[] info = parseDefId(defIdWithVersion);\n        String defId = (String) info[0];\n        Integer version = (Integer) info[1];\n        if (version == null) {\n            return processRepository.findLatestProcessDefinition(defId);\n        } else {\n            if (version == -1) {\n                version = null;\n            }\n            return processRepository.findProcessDefinitionByDefIdAndVersion(defId, version);\n        }\n    }\n\n    public ProcessDefinitionEntity getProcessDefinition(String defIdWithVersion) {\n        Object[] info = parseDefId(defIdWithVersion);\n        String defId = (String) info[0];\n        Integer version = (Integer) info[1];\n        if (null != version && version == -1) {\n            version = null;\n        }\n        return findProcessDefinitionByIdAndVersion(defId, version);\n    }\n\n    public Object[] parseDefId(String defIdWithVersion) {\n        if (defIdWithVersion.startsWith(ProcessDefinitionConstants.FLOW_PREFIX)) {\n            defIdWithVersion = defIdWithVersion.substring(ProcessDefinitionConstants.FLOW_PREFIX.length());\n        } else if (defIdWithVersion.startsWith(ProcessDefinitionConstants.FSM_PREFIX)) {\n            defIdWithVersion = defIdWithVersion.substring(ProcessDefinitionConstants.FSM_PREFIX.length());\n        }\n        String defId = null;\n        Integer version = null;\n        int pos = defIdWithVersion.indexOf(ProcessDefinitionConstants.VERSION_SEP);\n        if (pos == -1) {\n            defId = defIdWithVersion;\n        } else {\n            defId = defIdWithVersion.substring(0, pos);\n            String versionStr = defIdWithVersion.substring(pos + ProcessDefinitionConstants.VERSION_SEP.length());\n            if (versionStr.length() == 0) {\n                version = -1;\n            } else {\n                version = Integer.valueOf(versionStr);\n            }\n        }\n        return new Object[] { defId, version };\n    }\n\n    public String generateDefIdWithVersion(String defId, Integer version) {\n        if (version == null) {\n            return defId;\n        }\n        if (version == -1) {\n            return defId + ProcessDefinitionConstants.VERSION_SEP;\n        }\n        return defId + ProcessDefinitionConstants.VERSION_SEP + version;\n    }\n\n    public PagerResult<ProcessDefinitionForListVO> pageQueryProcessDefinition(PagerCondition pagerQueryReq) {\n        if (pagerQueryReq.getPageSize() > MAX_PAGE_SIZE) {\n            throw new UserException(\"The max page size is \" + MAX_PAGE_SIZE);\n        }\n        return processRepository.pageQueryProcessDefinition(pagerQueryReq);\n    }\n\n    public ProcessDefinitionEntity findProcessDefinitionByIdAndVersion(String defId, Integer defVersion) {\n        return processRepository.findProcessDefinitionByDefIdAndVersion(defId, defVersion);\n    }\n\n    public Integer getLatestProcessDefVersionByDefId(String defId) {\n        String cacheKey = CACHE_KEY_PREFIX.concat(defId);\n        String defVersion = cacheService.get(cacheKey);\n        if (defVersion == null) {\n            ProcessDefinitionEntity latestProcessDef = processRepository.findLatestProcessDefinition(defId);\n            if (latestProcessDef == null) {\n                log.info(\"Process definition ID {} not exists\", defId);\n                defVersion = DEF_VERSION_NONE;\n            } else {\n                defVersion = latestProcessDef.getDefVersion() == null ? DEF_VERSION_NULL\n                        : latestProcessDef.getDefVersion().toString();\n            }\n            cacheService.set(cacheKey, defVersion);\n        }\n        if (Objects.equals(defVersion, DEF_VERSION_NONE)) {\n            return -1;\n        }\n        return Objects.equals(DEF_VERSION_NULL, defVersion) ? null : Integer.parseInt(defVersion);\n    }\n\n    public ProcessDTO getProcessProperties(String processId) {\n        Object process = getProcess(processId);\n        if (process instanceof Flow) {\n            Flow flow = (Flow) process;\n            ProcessDTO processDto = new ProcessDTO();\n            processDto.setProperties(flow.getProperties());\n            return processDto;\n        } else {\n            Fsm fsm = (Fsm) process;\n            ProcessDTO processDto = new ProcessDTO();\n            processDto.setProperties(fsm.getProperties());\n            return processDto;\n        }\n    }\n\n    public NodeDTO getNodeProperties(QueryNodeReq request) {\n        Object process = getProcess(request.getProcessId());\n        if (process instanceof Flow) {\n            Flow flow = (Flow) process;\n            FlowNode node = flow.getNode(request.getNodeId());\n            NodeDTO nodeDto = new NodeDTO();\n            nodeDto.setProperties(node.getProperties());\n            return nodeDto;\n        } else {\n            Fsm fsm = (Fsm) process;\n            State state = fsm.getState(request.getNodeId());\n            NodeDTO nodeDto = new NodeDTO();\n            nodeDto.setProperties(state.getProperties());\n            return nodeDto;\n        }\n    }\n\n    public ProcessDTO getProcessAndNodeProperties(String processId) {\n        Object process = getProcess(processId);\n        if (process instanceof Flow) {\n            Flow flow = (Flow) process;\n            ProcessDTO processDto = new ProcessDTO();\n            processDto.setProperties(flow.getProperties());\n            if (flow.getNodeList() != null) {\n                List<NodeDTO> nodeList = new ArrayList<>(flow.getNodeList().size());\n                for (FlowNode flowNode : flow.getNodeList()) {\n                    NodeDTO node = new NodeDTO();\n                    node.setProperties(flowNode.getProperties());\n                    nodeList.add(node);\n                }\n                processDto.setNodeList(nodeList);\n            }\n            return processDto;\n        } else {\n            Fsm fsm = (Fsm) process;\n            ProcessDTO processDto = new ProcessDTO();\n            processDto.setProperties(fsm.getProperties());\n            if (fsm.getStateList() != null) {\n                List<NodeDTO> nodeList = new ArrayList<>(fsm.getStateList().size());\n                for (State state : fsm.getStateList()) {\n                    NodeDTO node = new NodeDTO();\n                    node.setProperties(state.getProperties());\n                    nodeList.add(node);\n                }\n                processDto.setNodeList(nodeList);\n            }\n            return processDto;\n        }\n    }\n\n    private Object getProcess(String processId) {\n        if (processId.endsWith(ProcessDefinitionConstants.VERSION_SEP)) {\n            processId = processId.substring(0, processId.length() - ProcessDefinitionConstants.VERSION_SEP.length());\n        }\n        Object process = processMap.get(processId);\n        if (process == null) {\n            ProcessDefinitionEntity definition = getProcessDefinition(processId);\n            if (definition == null) {\n                log.warn(\"process definition :\" + processId + \" not exists\");\n                throw new UserException(MessageUtil.getMessage(\"easyflow.process.server.tip.processDefinitionNotExistsWithId\", new Object[] {processId}));\n            }\n            if (ProcessDefinitionConstants.PROCESS_FORMAT_FSM_EASY.equals(definition.getFormat())) {\n                process = FsmParser.parse(definition.getJsonContent(), false);\n                processMap.put(processId, process);\n            } else {\n                process = flowParser.parse(definition.getJsonContent(), false).get(0);\n                processMap.put(processId, process);\n            }\n        }\n        return process;\n    }\n\n    private void addOrUpdateAttachedProcesses(ProcessDefinitionEntity definition) {\n        if (onlyProcessListAttachedProcess) {\n            String jsonContent = definition.getJsonContent();\n            if (! jsonContent.trim().startsWith(\"[\")) {\n                return;\n            }\n            List<Map<String, Object>> list = JSON.parseObject(jsonContent, List.class);\n            for (int i = 1; i < list.size(); i++) {\n                Map<String, Object> def = list.get(i);\n                String flowId = (String) def.get(\"id\");\n                String flowName = (String) def.get(\"name\");\n                String flowJsonStr = JSON.toJSONString(def);\n                addOrUpdateOneRemainProcess(definition, flowId, flowName, flowJsonStr);\n            }\n        } else {\n            String jsonContent = definition.getJsonContent();\n            List<Flow> flowList = flowParser.parse(jsonContent, false);\n            if (flowList.size() == 1) {\n                return;\n            }\n            for (int i = 1; i < flowList.size(); i++) {\n                Flow flow = flowList.get(i);\n                String flowId = flow.getId();\n                String flowName = flow.getName();\n                String flowStr = flow.stringify();\n                addOrUpdateOneRemainProcess(definition, flowId, flowName, flowStr);\n            }\n        }\n    }\n\n    private void addOrUpdateOneRemainProcess(ProcessDefinitionEntity definition, String flowId, String flowName,\n            String flowJsonStr) {\n\n        Integer defVersion = definition.getDefVersion();\n        Boolean latest = definition.getLatest();\n        ProcessDefinitionEntity existsDefinition = processRepository.findProcessDefinitionByDefIdAndVersion(flowId,\n                defVersion);\n        ProcessDefinitionEntity latestDefinition = processRepository.findLatestProcessDefinition(flowId);\n        if (latestDefinition != null) {\n            Map<String, Object> extDataMap = JSON.parseObject(latestDefinition.getExtData(), Map.class);\n            String mainProcessId = extDataMap == null ? null : (String) extDataMap.get(ProcessDefinitionConstants.EXT_DATA_KEY_MAIN_PROCESS_ID);\n            if (mainProcessId == null || ! mainProcessId.equals(definition.getDefId())) {\n                log.error(\"remain process \" + flowId + \" exists!\");\n                throw new UserException(ExportResponseCode.FAIL.getCode(), MessageUtil.getMessage(\"easyflow.process.server.tip.processDefinitionExists\"));\n            }\n        }\n        \n        if (existsDefinition == null) {\n            ProcessDefinitionEntity entity = new ProcessDefinitionEntity();\n            entity.setBizType(definition.getBizType());\n            entity.setContent(flowJsonStr);\n            entity.setDefId(flowId);\n            entity.setDefSource(definition.getDefSource());\n            entity.setDefVersion(defVersion);\n            entity.setFormat(ProcessDefinitionConstants.PROCESS_FORMAT_FLOW_EASY);\n            entity.setJsonContent(flowJsonStr);\n            entity.setLatest(latest);\n            entity.setName(flowName);\n            entity.setCreatedBy(definition.getCreatedBy());\n            entity.setModifiedBy(definition.getModifiedBy());\n            Map<String, Object> extData = new HashMap<String, Object>();\n            extData.put(ProcessDefinitionConstants.EXT_DATA_KEY_MAIN_PROCESS_ID, definition.getDefId());\n            entity.setExtData(JSON.toJSONString(extData));\n            processRepository.saveProcessDefinition(entity);\n            if (Boolean.TRUE.equals(latest) && latestDefinition != null) {\n                processRepository.updateProcessDefinitionLatestById(latestDefinition.getId());\n            }\n        } else {\n            existsDefinition.setBizType(definition.getBizType());\n            existsDefinition.setContent(flowJsonStr);\n            existsDefinition.setDefId(flowId);\n            existsDefinition.setDefSource(definition.getDefSource());\n            existsDefinition.setDefVersion(defVersion);\n            existsDefinition.setFormat(ProcessDefinitionConstants.PROCESS_FORMAT_FLOW_EASY);\n            existsDefinition.setJsonContent(flowJsonStr);\n            existsDefinition.setLatest(latest);\n            existsDefinition.setName(flowName);\n            existsDefinition.setCreatedBy(definition.getCreatedBy());\n            existsDefinition.setModifiedBy(definition.getModifiedBy());\n            processRepository.updateProcessDefinitionById(existsDefinition);\n            if (Boolean.TRUE.equals(latest) && latestDefinition != null\n                    && !latestDefinition.getId().equals(existsDefinition.getId())) {\n                processRepository.updateProcessDefinitionLatestById(latestDefinition.getId());\n\n            }\n        }\n        if (latest) {\n            updateDefLatestCacheVersion(flowId, definition.getDefVersion());\n        }\n    }\n\n    public CacheService getCacheService() {\n        return cacheService;\n    }\n\n    public void setCacheService(CacheService cacheService) {\n        this.cacheService = cacheService;\n    }\n\n    public Locker getLocker() {\n        return locker;\n    }\n\n    public void setLocker(Locker locker) {\n        this.locker = locker;\n    }\n\n    public TransactionTemplate getTransactionTemplate() {\n        return transactionTemplate;\n    }\n\n    public void setTransactionTemplate(TransactionTemplate transactionTemplate) {\n        this.transactionTemplate = transactionTemplate;\n    }\n\n    public FlowParser getFlowParser() {\n        return flowParser;\n    }\n\n    public void setFlowParser(FlowParser flowParser) {\n        this.flowParser = flowParser;\n    }\n\n    public ProcessRepository getProcessRepository() {\n        return processRepository;\n    }\n\n    public void setProcessRepository(ProcessRepository processRepository) {\n        this.processRepository = processRepository;\n    }\n\n    public boolean isOnlyProcessListAttachedProcess() {\n        return onlyProcessListAttachedProcess;\n    }\n\n    public void setOnlyProcessListAttachedProcess(boolean onlyProcessListAttachedProcess) {\n        this.onlyProcessListAttachedProcess = onlyProcessListAttachedProcess;\n    }\n    \n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/domain/service/ProcessInstanceDomainService.java",
    "content": "package com.jd.easyflow.process.domain.service;\n\nimport static com.jd.easyflow.process.adapter.export.constant.ProcessInstanceConstants.STATUS_CANCELED;\nimport static com.jd.easyflow.process.adapter.export.constant.ProcessInstanceConstants.STATUS_CLOSE;\nimport static com.jd.easyflow.process.domain.constant.ProcessTaskConstants.TASK_STATUS_CANCELED;\nimport static com.jd.easyflow.process.domain.constant.ProcessTaskConstants.TASK_STATUS_PENDING;\n\nimport java.util.ArrayList;\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Objects;\nimport java.util.UUID;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.transaction.support.TransactionTemplate;\nimport org.springframework.util.ObjectUtils;\n\nimport com.jd.easyflow.codegenerator.client.CodeGenerateHelper;\nimport com.jd.easyflow.common.dto.pager.PagerCondition;\nimport com.jd.easyflow.common.dto.pager.PagerResult;\nimport com.jd.easyflow.common.exception.UserException;\nimport com.jd.easyflow.common.util.MessageUtil;\nimport com.jd.easyflow.flow.util.FlowConstants;\nimport com.jd.easyflow.lock.Locker;\nimport com.jd.easyflow.message.MessageSendService;\nimport com.jd.easyflow.process.adapter.export.constant.ProcessInstanceConstants;\nimport com.jd.easyflow.process.adapter.export.constant.ProcessTransactionConstants;\nimport com.jd.easyflow.process.adapter.export.dto.definition.ProcessDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.CanCancelProcessInstanceReq;\nimport com.jd.easyflow.process.adapter.export.dto.instance.CanCancelProcessInstanceRes;\nimport com.jd.easyflow.process.adapter.export.dto.instance.CancelProcessInstanceReq;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessInstanceDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessNodeExecutionDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessNodeInstanceDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.StdProcessContextDTO;\nimport com.jd.easyflow.process.adapter.message.ProcessInstanceStatusMessage;\nimport com.jd.easyflow.process.adapter.message.ProcessNodeInstanceStatusMessage;\nimport com.jd.easyflow.process.adapter.message.ProcessTaskStatusMessage;\nimport com.jd.easyflow.process.domain.constant.ProcessConstants;\nimport com.jd.easyflow.process.domain.constant.ProcessTaskConstants;\nimport com.jd.easyflow.process.domain.constant.StdProcessConstants;\nimport com.jd.easyflow.process.domain.converter.ProcessInstanceDomainConverter;\nimport com.jd.easyflow.process.domain.converter.ProcessTaskDomainConverter;\nimport com.jd.easyflow.process.domain.model.entity.ProcessInstanceEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessNodeExecutionEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessNodeInstanceEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessTaskEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessTaskEventEntity;\nimport com.jd.easyflow.process.domain.model.vo.CreateProcessInstanceReqVO;\nimport com.jd.easyflow.process.domain.model.vo.CreateProcessInstanceResVO;\nimport com.jd.easyflow.process.domain.model.vo.ProcessDefinitionForListVO;\nimport com.jd.easyflow.process.domain.model.vo.QueryProcessNodeReq;\nimport com.jd.easyflow.process.domain.model.vo.QueryTaskReqVO;\nimport com.jd.easyflow.process.domain.model.vo.ScheduleProcessReqVO;\nimport com.jd.easyflow.process.domain.model.vo.ScheduleProcessResVO;\nimport com.jd.easyflow.process.domain.repository.ProcessRepository;\nimport com.jd.easyflow.process.domain.repository.ProcessTaskRepository;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessInstanceDomainService {\n    \n    private static final Logger log = LoggerFactory.getLogger(ProcessInstanceDomainService.class);\n\n\n    private static final int MAX_PAGE_SIZE = 10000;\n\n    @Autowired\n    private ProcessRepository processRepository;\n    private Locker locker;\n    private TransactionTemplate transactionTemplate;\n\n    @Value(ProcessConstants.TOPIC_PROCESS_INSTANCE_STATUS)\n    private String processInstanceStatusTopic;\n    \n    @Value(ProcessConstants.TOPIC_NODE_INSTANCE_STATUS)\n    private String nodeInstanceStatusTopic;\n\n    @Value(ProcessTaskConstants.TOPIC_TASK_STATUS)\n    private String taskStatusTopic;\n\n    @Value(ProcessConstants.CREATED_DATE_POLICY)\n    private String createdDatePolicy;\n\n    private MessageSendService messageSendService;\n\n    @Autowired\n    private ProcessScheduleDomainService processScheduleDomainService;\n\n    @Autowired\n    private ProcessDefinitionDomainService processDefinitionDomainService;\n\n    @Autowired\n    private ProcessTaskRepository processTaskRepository;\n\n    public static final String CACHE_KEY_PREFIX = \"PROCESS_DEF_VERSION_\";\n\n    private static final Integer INIT_VERSION = 0;\n\n    public static final String PROCESS_DEFINITION_LOCK = \"_MODIFY_PROCESS_DEFINITION_\";\n\n    public static final String EXECUTION_PERSIST_POLICY_SYNC = \"SYNC\";\n    public static final String EXECUTION_PERSIST_POLICY_ASYNC = \"ASYNC\";\n\n    private String executionPersistPolicy = EXECUTION_PERSIST_POLICY_ASYNC;\n    \n    public static final String EXECUTION_PERSIST_TYPE_ALL = \"ALL\";\n    public static final String EXECUTION_PERSIST_TYPE_NEXT = \"NEXT\";\n    public static final String EXECUTION_PERSIST_TYPE_EVENT_AND_NEXT = \"EVENT_AND_NEXT\";\n    public static final String EXECUTION_PERSIST_TYPE_NONE = \"NONE\";\n    \n    private String executionPeristType = EXECUTION_PERSIST_TYPE_ALL;\n\n    public PagerResult<ProcessDefinitionForListVO> pageQueryProcessDefinition(PagerCondition pagerQueryReq) {\n        return processRepository.pageQueryProcessDefinition(pagerQueryReq);\n    }\n\n    public PagerResult<ProcessInstanceEntity> pageQueryProcessInstance(PagerCondition pagerQueryReq) {\n        if (pagerQueryReq.getPageSize() > MAX_PAGE_SIZE) {\n            throw new UserException(\"The max page size is \" + MAX_PAGE_SIZE);\n        }\n            return processRepository.pageQueryProcessInstance(pagerQueryReq);\n    }\n\n    public ProcessInstanceEntity queryProcessInstance(String instanceNo) {\n            return processRepository.getByProcessInstanceNo(instanceNo);\n    }\n\n    public List<ProcessNodeInstanceEntity> queryProcessInstanceNode(String instanceNo) {\n        QueryProcessNodeReq queryProcessNodeReq = QueryProcessNodeReq.builder().processInstanceNo(instanceNo).build();\n        List<ProcessNodeInstanceEntity> nodeInstanceEntities = processRepository.findNodeInstances(queryProcessNodeReq);\n        return nodeInstanceEntities;\n    }\n\n    public CreateProcessInstanceResVO createProcessInstance(CreateProcessInstanceReqVO vo) {\n        ScheduleProcessReqVO req = new ScheduleProcessReqVO();\n        req.setProcessId(vo.getProcessId());\n        req.setNodeIds(vo.getNodeIds());\n        req.setParam(vo.getParam());\n        Map<String, Object> dataMap = vo.getDataMap();\n        if (dataMap == null) {\n            dataMap = new HashMap<>();\n        }\n        req.setDataMap(dataMap);\n        if (vo.getProcessType() != null) {\n            dataMap.put(StdProcessConstants.PARAM_PROCESS_TYPE, vo.getProcessType());\n        }\n        if (vo.getProductCode() != null) {\n            dataMap.put(StdProcessConstants.PARAM_PRODUCT_CODE, vo.getProductCode());\n        }\n        if (vo.getCreator() != null) {\n            dataMap.put(StdProcessConstants.PARAM_USER, vo.getCreator());\n        }\n        if (vo.getBizNo() != null) {\n            dataMap.put(StdProcessConstants.PARAM_BIZNO, vo.getBizNo());\n        }\n        if (vo.getInstanceName() != null) {\n            dataMap.put(StdProcessConstants.PARAM_INSTANCE_NAME, vo.getInstanceName());\n        }\n        if (vo.getBizStatus() != null) {\n            dataMap.put(StdProcessConstants.PARAM_BIZ_STATUS, vo.getBizStatus());\n        }\n        if (vo.getBizData() != null) {\n            dataMap.put(StdProcessConstants.PARAM_BIZ_DATA, vo.getBizData());\n        }\n        if (vo.getKeyField() != null) {\n            dataMap.put(StdProcessConstants.PARAM_KEY_FIELD, vo.getKeyField());\n        }\n        if (vo.getKeyField2() != null) {\n            dataMap.put(StdProcessConstants.PARAM_KEY_FIELD2, vo.getKeyField2());\n        }\n        dataMap.put(StdProcessConstants.PARAM_OP_TYPE, StdProcessConstants.OP_TYPE_CREATE);\n        if (!dataMap.containsKey(FlowConstants.PARAM_DATA_EVENT)) {\n            dataMap.put(FlowConstants.PARAM_DATA_EVENT, \"PROCESS_INSTANCE_CREATE\");\n        }\n        ScheduleProcessResVO res = processScheduleDomainService.schedule(req);\n        CreateProcessInstanceResVO createRes = new CreateProcessInstanceResVO();\n        createRes.setProcessInstanceNo(res.getProcessInstanceNo());\n        return createRes;\n    }\n\n    public void updateProcessObject(Integer persistOp, Object o, StdProcessContextDTO process,\n            List<Map<String, Object>> actionList) {\n        \n        boolean sendNodeInstanceStatusMessage = false;\n        String nodeInstanceStatusTopic = null;\n        if (process.getProcessProperties() != null\n                && process.getProcessProperties().get(\"nodeInstanceStatusMessage\") != null) {\n            Map<String, Object> messageConfig = (Map<String, Object>) process.getProcessProperties()\n                    .get(\"nodeInstanceStatusMessage\");\n            sendNodeInstanceStatusMessage = Boolean.TRUE.equals(messageConfig.get(\"enable\"));\n            if (sendNodeInstanceStatusMessage) {\n                nodeInstanceStatusTopic = (String) messageConfig.getOrDefault(\"topic\", this.nodeInstanceStatusTopic);\n            }\n        }\n        String engine = (process.getProcess() == null || process.getProcess().getExtProperties() == null) ? null\n                : (String) process.getProcess().getExtProperties().get(\"engine\");\n        \n        if (o instanceof ProcessInstanceDTO) {\n            ProcessInstanceEntity entity = ProcessInstanceDomainConverter.INSTANCE.convert((ProcessInstanceDTO) o);\n            if (persistOp == null) {\n                ProcessInstanceEntity currentEntity = processRepository.getByProcessInstanceNo(entity.getInstanceNo());\n                persistOp = currentEntity == null ? ProcessTransactionConstants.PERSIST_OP_ADD\n                        : ProcessTransactionConstants.PERSIST_OP_UPDATE;\n            }\n            if (persistOp == ProcessTransactionConstants.PERSIST_OP_ADD) {\n                if (log.isDebugEnabled()) {\n                    log.debug(\"Add \" + entity.getInstanceNo());\n                }\n                switch (createdDatePolicy) {\n                case ProcessConstants.CREATED_DATE_POLICY_CLIENT: {\n                    processRepository.saveProcessInstanceWithCreatedDate(entity);\n                    break;\n                }\n                case ProcessConstants.CREATED_DATE_POLICY_SERVER: {\n                    entity.setCreatedDate(new Date());\n                    processRepository.saveProcessInstanceWithCreatedDate(entity);\n                    break;\n                }\n                case ProcessConstants.CREATED_DATE_POLICY_DB: {\n                    entity.setCreatedDate(null);\n                    processRepository.saveProcessInstance(entity);\n                    break;\n                }\n                default: {\n                    throw new IllegalArgumentException(\"Illegal policy:\" + createdDatePolicy);\n                }\n                }\n                addMessageOfInstanceCreate(entity, process, actionList);\n            } else {\n                if (log.isDebugEnabled()) {\n                    log.debug(\"Update \" + entity.getInstanceNo());\n                }\n                processRepository.updateProcessInstanceByNo(entity);\n                addMessageOfInstanceUpdate(entity, process, actionList);\n            }\n        } else if (o instanceof ProcessNodeInstanceDTO) {\n            ProcessNodeInstanceEntity entity = ProcessInstanceDomainConverter.INSTANCE\n                    .convert((ProcessNodeInstanceDTO) o);\n            if (persistOp == null) {\n                ProcessNodeInstanceEntity currentEntity = processRepository\n                        .getByNodeInstanceNo(entity.getNodeInstanceNo());\n                persistOp = currentEntity == null ? ProcessTransactionConstants.PERSIST_OP_ADD\n                        : ProcessTransactionConstants.PERSIST_OP_UPDATE;\n            }\n            if (persistOp == ProcessTransactionConstants.PERSIST_OP_ADD) {\n                if (log.isDebugEnabled()) {\n                    log.debug(\"Add \" + entity.getNodeInstanceNo());\n                }\n                switch (createdDatePolicy) {\n                case ProcessConstants.CREATED_DATE_POLICY_CLIENT: {\n                    processRepository.saveProcessNodeInstanceWithCreatedDate(entity);\n                    break;\n                }\n                case ProcessConstants.CREATED_DATE_POLICY_SERVER: {\n                    entity.setCreatedDate(new Date());\n                    processRepository.saveProcessNodeInstanceWithCreatedDate(entity);\n                    break;\n                }\n                case ProcessConstants.CREATED_DATE_POLICY_DB: {\n                    entity.setCreatedDate(null);\n                    processRepository.saveProcessNodeInstance(entity);\n                    break;\n                }\n                default: {\n                    throw new IllegalArgumentException(\"Illegal policy:\" + createdDatePolicy);\n                }\n                }\n                addMessageOfNodeInstanceCreate(entity, process, actionList, sendNodeInstanceStatusMessage, nodeInstanceStatusTopic, engine);\n            } else {\n                if (log.isDebugEnabled()) {\n                    log.debug(\"Update \" + entity.getNodeInstanceNo());\n                }\n                addMessageOfNodeInstanceUpdate(entity, process, actionList, sendNodeInstanceStatusMessage, nodeInstanceStatusTopic, engine);\n                processRepository.updateProcessNodeInstanceByNo(entity);\n            }\n        } else if (o instanceof ProcessNodeExecutionDTO) {\n            if (EXECUTION_PERSIST_TYPE_NONE.equals(executionPeristType)) {\n                if (log.isDebugEnabled()) {\n                    log.debug(\"Execution persist type is none, no persist\");\n                }\n                return;\n            }\n            if (EXECUTION_PERSIST_TYPE_NEXT.equals(executionPeristType)) {\n                ProcessNodeExecutionDTO dto = (ProcessNodeExecutionDTO) o;\n                if (dto.getNextNodeInstances() == null || dto.getNextNodeInstances().length() == 0) {\n                    if (log.isDebugEnabled()) {\n                        log.debug(\"Execution persist type is next, no persist\");\n                    }\n                    return;\n                }\n            } else if (EXECUTION_PERSIST_TYPE_EVENT_AND_NEXT.equals(executionPeristType)) {\n                ProcessNodeExecutionDTO dto = (ProcessNodeExecutionDTO) o;\n                if ((dto.getNextNodeInstances() == null || dto.getNextNodeInstances().length() == 0) && dto.getEventId() == null) {\n                    if (log.isDebugEnabled()) {\n                        log.debug(\"Execution persist type is event and next, no persist\");\n                    }\n                    return;\n                }\n            }\n            \n            Integer finalPersistOp = persistOp;\n            Runnable runnable = () -> {\n                Integer finalPersistOp2 = finalPersistOp;\n                ProcessNodeExecutionEntity entity = ProcessInstanceDomainConverter.INSTANCE\n                        .convert((ProcessNodeExecutionDTO) o);\n                if (finalPersistOp2 == null) {\n                    ProcessNodeExecutionEntity currentEntity = processRepository\n                            .getByNodeExecutionNo(entity.getNodeExecutionNo());\n                    finalPersistOp2 = currentEntity == null ? ProcessTransactionConstants.PERSIST_OP_ADD\n                            : ProcessTransactionConstants.PERSIST_OP_UPDATE;\n                }\n                if (finalPersistOp2 == ProcessTransactionConstants.PERSIST_OP_ADD) {\n                    if (log.isDebugEnabled()) {\n                        log.debug(\"Add \" + entity.getNodeExecutionNo());\n                    }\n                    switch (createdDatePolicy) {\n                    case ProcessConstants.CREATED_DATE_POLICY_CLIENT: {\n                        processRepository.saveProcessNodeExecutionWithCreatedDate(entity);\n                        break;\n                    }\n                    case ProcessConstants.CREATED_DATE_POLICY_SERVER: {\n                        entity.setCreatedDate(new Date());\n                        processRepository.saveProcessNodeExecutionWithCreatedDate(entity);\n                        break;\n                    }\n                    case ProcessConstants.CREATED_DATE_POLICY_DB: {\n                        entity.setCreatedDate(null);\n                        processRepository.saveProcessNodeExecution(entity);\n                        break;\n                    }\n                    default: {\n                        throw new IllegalArgumentException(\"Illegal policy:\" + createdDatePolicy);\n                    }\n                    }\n                } else {\n                    if (log.isDebugEnabled()) {\n                        log.info(\"Update \" + entity.getNodeExecutionNo());\n                    }\n                    processRepository.updateProcessNodeExecutionByNo(entity);\n                }\n            };\n            if (EXECUTION_PERSIST_POLICY_SYNC.equals(executionPersistPolicy)) {\n                runnable.run();\n            } else {\n                boolean contains = false;\n                for (Map<String, Object> action : actionList) {\n                    if (ProcessConstants.TXN_ACTION_MERGE_ASYNC.equals(action.get(\"type\"))) {\n                        List<Runnable> runnableList = (List<Runnable>) action.get(\"tasks\");\n                        if (runnableList != null) {\n                            runnableList.add(runnable);\n                            contains = true;\n                            break;\n                        }\n                    }\n                }\n                if (!contains) {\n                    Map<String, Object> action = new HashMap<>();\n                    action.put(\"type\", ProcessConstants.TXN_ACTION_MERGE_ASYNC);\n                    List<Runnable> runnableList = new ArrayList<>();\n                    runnableList.add(runnable);\n                    action.put(\"tasks\", runnableList);\n                    actionList.add(action);\n                }\n            }\n        } else {\n            throw new IllegalArgumentException(\"Illegal object class:\" + o.getClass());\n        }\n    }\n\n    private void addMessageOfInstanceCreate(ProcessInstanceEntity entity, StdProcessContextDTO processContext,\n            List<Map<String, Object>> actionList) {\n        if (processContext.getProcessProperties() != null\n                && processContext.getProcessProperties().get(\"processInstanceStatusMessage\") != null) {\n            Map<String, Object> messageConfig = (Map<String, Object>) processContext.getProcessProperties()\n                    .get(\"processInstanceStatusMessage\");\n            if (Boolean.TRUE.equals(messageConfig.get(\"enable\"))) {\n                Map<String, Object> createProcessInstanceAction = new HashMap<>();\n                createProcessInstanceAction.put(\"topic\",\n                        messageConfig.getOrDefault(\"topic\", processInstanceStatusTopic));\n                ProcessInstanceStatusMessage message = ProcessInstanceDomainConverter.INSTANCE.convert2Msg(entity);\n                message.setStatus(\"ACTIVE\");\n                createProcessInstanceAction.put(\"bizData\", JSON.toJSONString(message));\n                createProcessInstanceAction.put(\"type\", ProcessConstants.TXN_ACTION_MSG);\n                actionList.add(createProcessInstanceAction);\n                if (\"CLOSE\".equals(entity.getStatus())) {\n                    Map<String, Object> closeProcessInstanceAction = new HashMap<>();\n                    closeProcessInstanceAction.put(\"topic\",\n                            messageConfig.getOrDefault(\"topic\", processInstanceStatusTopic));\n                    message = ProcessInstanceDomainConverter.INSTANCE.convert2Msg(entity);\n                    closeProcessInstanceAction.put(\"bizData\", JSON.toJSONString(message));\n                    closeProcessInstanceAction.put(\"type\", ProcessConstants.TXN_ACTION_MSG);\n                    actionList.add(closeProcessInstanceAction);\n                }\n            }\n        }\n    }\n\n    private void addMessageOfInstanceUpdate(ProcessInstanceEntity newEntity, StdProcessContextDTO processContext,\n            List<Map<String, Object>> actionList) {\n        if (processContext.getProcessProperties() != null\n                && processContext.getProcessProperties().get(\"processInstanceStatusMessage\") != null) {\n            Map<String, Object> messageSendConfig = (Map<String, Object>) processContext.getProcessProperties()\n                    .get(\"processInstanceStatusMessage\");\n            if (Boolean.TRUE.equals(messageSendConfig.get(\"enable\")) && \"CLOSE\".equals(newEntity.getStatus())) {\n                Map<String, Object> closeProcessInstanceAction = new HashMap<>();\n                closeProcessInstanceAction.put(\"type\", ProcessConstants.TXN_ACTION_MSG);\n                closeProcessInstanceAction.put(\"topic\",\n                        messageSendConfig.getOrDefault(\"topic\", processInstanceStatusTopic));\n                ProcessInstanceStatusMessage message = ProcessInstanceDomainConverter.INSTANCE.convert2Msg(newEntity);\n                closeProcessInstanceAction.put(\"bizData\", JSON.toJSONString(message));\n                actionList.add(closeProcessInstanceAction);\n            }\n        }\n    }\n    \n  \n    private void addMessageOfNodeInstanceCreate(ProcessNodeInstanceEntity entity, StdProcessContextDTO processContext,\n            List<Map<String, Object>> actionList, boolean sendNodeInstanceStatusMessage,\n            String nodeInstanceStatusTopic, String engine) {\n        if (sendNodeInstanceStatusMessage) {\n            if (\"CLOSE\".equals(entity.getStatus())) {\n                Map<String, Object> createNodeInstanceAction = new HashMap<>();\n                createNodeInstanceAction.put(\"topic\", nodeInstanceStatusTopic);\n                ProcessNodeInstanceStatusMessage message = ProcessInstanceDomainConverter.INSTANCE.convert2Msg(entity);\n                String status = \"fsm\".equals(engine) ? \"INACTIVE\" : \"ACTIVE\";\n                message.setStatus(status);\n                createNodeInstanceAction.put(\"bizData\", JSON.toJSONString(message));\n                createNodeInstanceAction.put(\"type\", ProcessConstants.TXN_ACTION_MSG);\n                actionList.add(createNodeInstanceAction);\n\n                Map<String, Object> closeProcessInstanceAction = new HashMap<>();\n                closeProcessInstanceAction.put(\"topic\", nodeInstanceStatusTopic);\n                message = ProcessInstanceDomainConverter.INSTANCE.convert2Msg(entity);\n                closeProcessInstanceAction.put(\"bizData\", JSON.toJSONString(message));\n                closeProcessInstanceAction.put(\"type\", ProcessConstants.TXN_ACTION_MSG);\n                actionList.add(closeProcessInstanceAction);\n            } else if (\"ACTIVE\".equals(entity.getStatus()) && \"fsm\".equals(engine)) {\n                Map<String, Object> inactiveNodeInstanceAction = new HashMap<>();\n                inactiveNodeInstanceAction.put(\"topic\", nodeInstanceStatusTopic);\n                ProcessNodeInstanceStatusMessage message = ProcessInstanceDomainConverter.INSTANCE.convert2Msg(entity);\n                message.setStatus(\"INACTIVE\");\n                inactiveNodeInstanceAction.put(\"bizData\", JSON.toJSONString(message));\n                inactiveNodeInstanceAction.put(\"type\", ProcessConstants.TXN_ACTION_MSG);\n                actionList.add(inactiveNodeInstanceAction);\n\n                Map<String, Object> activeProcessInstanceAction = new HashMap<>();\n                activeProcessInstanceAction.put(\"topic\", nodeInstanceStatusTopic);\n                message = ProcessInstanceDomainConverter.INSTANCE.convert2Msg(entity);\n                activeProcessInstanceAction.put(\"bizData\", JSON.toJSONString(message));\n                activeProcessInstanceAction.put(\"type\", ProcessConstants.TXN_ACTION_MSG);\n                actionList.add(activeProcessInstanceAction);                \n            }  else {\n                Map<String, Object> createNodeInstanceAction = new HashMap<>();\n                createNodeInstanceAction.put(\"topic\", nodeInstanceStatusTopic);\n                ProcessNodeInstanceStatusMessage message = ProcessInstanceDomainConverter.INSTANCE.convert2Msg(entity);\n                message.setStatus(entity.getStatus());\n                createNodeInstanceAction.put(\"bizData\", JSON.toJSONString(message));\n                createNodeInstanceAction.put(\"type\", ProcessConstants.TXN_ACTION_MSG);\n                actionList.add(createNodeInstanceAction);\n            }\n        }\n    }\n\n    private void addMessageOfNodeInstanceUpdate(ProcessNodeInstanceEntity newEntity,\n            StdProcessContextDTO processContext, List<Map<String, Object>> actionList,\n            boolean sendNodeInstanceStatusMessage, String nodeInstanceStatusTopic, String engine) {\n        if (sendNodeInstanceStatusMessage) {\n            ProcessNodeInstanceEntity oldEntity = processRepository.getByNodeInstanceNo(newEntity.getNodeInstanceNo());\n            if (Objects.equals(oldEntity.getStatus(), newEntity.getStatus())) {\n                return;\n            }\n            if (\"CLOSE\".equals(newEntity.getStatus()) && \"INACTIVE\".equals(oldEntity.getStatus()) && \"flow\".equals(engine)) {\n                Map<String, Object> activeNodeInstanceAction = new HashMap<>();\n                activeNodeInstanceAction.put(\"type\", ProcessConstants.TXN_ACTION_MSG);\n                activeNodeInstanceAction.put(\"topic\", nodeInstanceStatusTopic);\n                ProcessNodeInstanceStatusMessage message = ProcessInstanceDomainConverter.INSTANCE\n                        .convert2Msg(newEntity);\n                message.setStatus(\"ACTIVE\");\n                activeNodeInstanceAction.put(\"bizData\", JSON.toJSONString(message));\n                actionList.add(activeNodeInstanceAction);\n                \n                Map<String, Object> closeNodeInstanceAction = new HashMap<>();\n                closeNodeInstanceAction.put(\"type\", ProcessConstants.TXN_ACTION_MSG);\n                closeNodeInstanceAction.put(\"topic\", nodeInstanceStatusTopic);\n                message = ProcessInstanceDomainConverter.INSTANCE\n                        .convert2Msg(newEntity);\n                closeNodeInstanceAction.put(\"bizData\", JSON.toJSONString(message));\n                actionList.add(closeNodeInstanceAction);\n                \n            } else {\n                Map<String, Object> processNodeInstanceAction = new HashMap<>();\n                processNodeInstanceAction.put(\"type\", ProcessConstants.TXN_ACTION_MSG);\n                processNodeInstanceAction.put(\"topic\", nodeInstanceStatusTopic);\n                ProcessNodeInstanceStatusMessage message = ProcessInstanceDomainConverter.INSTANCE\n                        .convert2Msg(newEntity);\n                processNodeInstanceAction.put(\"bizData\", JSON.toJSONString(message));\n                actionList.add(processNodeInstanceAction);\n            }\n        }\n    }\n\n    public void updateProcessInstanceExtData(ProcessInstanceEntity processInstance) {\n        ProcessInstanceEntity currentEntity = processRepository.getByProcessInstanceNo(processInstance.getInstanceNo());\n        currentEntity.setExtData(processInstance.getExtData());\n        processRepository.updateProcessInstanceById(currentEntity);\n    }\n\n    public void cancel(CancelProcessInstanceReq cancelProcessInstanceReq) {\n        String instanceNo = cancelProcessInstanceReq.getInstanceNo();\n        ProcessInstanceEntity processInstance = processRepository.getByProcessInstanceNo(instanceNo);\n        String processType = processInstance.getProcessType();\n        String bizNo = processInstance.getBizNo();\n        String lockProcessId = lockProcessInstance(processType, bizNo);\n        try {\n            List<Map<String, Object>> postActionList = new ArrayList<>();\n            transactionTemplate.executeWithoutResult((status) -> {\n                ProcessInstanceEntity processInstanceEntity = processRepository.getByProcessInstanceNo(instanceNo);\n                CanCancelProcessInstanceRes canRes = canCancel(\n                        ProcessInstanceDomainConverter.INSTANCE.convert(cancelProcessInstanceReq));\n                if (!canRes.isCanCancel()) {\n                    throw new UserException(MessageUtil.getMessage(\"easyflow.process.server.tip.cannotCancelForReason\", new Object[] {instanceNo, canRes.getReason()}));\n                }\n                doCancelInstanceTask(processInstanceEntity, cancelProcessInstanceReq, postActionList);\n            });\n            for (Map<String, Object> action : postActionList) {\n                String topic = (String) action.get(\"topic\");\n                String bizData = (String) action.get(\"bizData\");\n                messageSendService.sendMessage(UUID.randomUUID().toString(), topic, bizData);\n            }\n        } finally {\n            unLockProcessInstance(processType, bizNo, lockProcessId);\n        }\n\n    }\n\n    public void interruptOnRuntime(String instanceNo, String interruptUser, Date interruptTime,\n            StdProcessContextDTO context, List<Map<String, Object>> postActionList) {\n        ProcessInstanceEntity processInstanceEntity = processRepository.getByProcessInstanceNo(instanceNo);\n        if (ProcessInstanceConstants.STATUS_CLOSE.equals(processInstanceEntity.getStatus())\n                || ProcessInstanceConstants.STATUS_CANCELED.equals(processInstanceEntity.getStatus())) {\n            log.info(\"Process instance end, can not execute interrupt\");\n            return;\n        }\n            String extData = appendInterruptInfo2ExtData(processInstanceEntity.getExtData());\n            processInstanceEntity.setExtData(extData);\n            processInstanceEntity.setStatus(STATUS_CLOSE);\n            processRepository.updateProcessInstanceById(processInstanceEntity);\n            \n            ProcessInstanceStatusMessage processInstanceStatusMessage = ProcessInstanceDomainConverter.INSTANCE\n                    .convert2Msg(processInstanceEntity);\n            Map<String, Object> createInstanceAction = new HashMap<>(3);\n            Map<String, Object> properties = context.getProcessProperties();\n            if (properties != null && properties.get(\"processInstanceStatusMessage\") != null) {\n                Map<String, Object> processInstanceStatusMessageConf = (Map<String, Object>) properties.get(\"processInstanceStatusMessage\");\n                Boolean enabled = (Boolean) processInstanceStatusMessageConf.getOrDefault(\"enable\", false);\n                if (Boolean.TRUE.equals(enabled)) {\n                    String processInstanceMessageTopic = (String) processInstanceStatusMessageConf.getOrDefault(\"topic\", processInstanceStatusTopic);\n                    createInstanceAction.put(\"topic\", processInstanceMessageTopic);\n                    createInstanceAction.put(\"type\", ProcessConstants.TXN_ACTION_MSG);\n                    createInstanceAction.put(\"bizData\", JSON.toJSONString(processInstanceStatusMessage));\n                    postActionList.add(createInstanceAction);\n                }\n            }\n\n            QueryTaskReqVO queryTaskReqVO = new QueryTaskReqVO();\n            queryTaskReqVO.setProcessInstanceNo(instanceNo);\n            queryTaskReqVO.setStatus(TASK_STATUS_PENDING);\n            List<ProcessTaskEntity> processTaskEntities = processTaskRepository.queryTask(queryTaskReqVO);\n            if (processTaskEntities != null) {\n                log.info(\"Executing task num:{}\", processTaskEntities.size());\n                for (ProcessTaskEntity processTaskEntity : processTaskEntities) {\n                    processTaskEntity.setStatus(TASK_STATUS_CANCELED);\n                    processTaskEntity.setExecuteBizResult(TASK_STATUS_CANCELED);\n                    processTaskEntity.setExecutor(interruptUser);\n                    processTaskRepository.updateById(processTaskEntity);\n                    ProcessTaskEventEntity event = new ProcessTaskEventEntity();\n                    event.setTaskNo(processTaskEntity.getTaskNo());\n                    event.setEventNo(CodeGenerateHelper.generateCode(\"PROCESS_TASK_EVENT\", \"PTE\"));\n                    event.setEventTime(interruptTime);\n                    event.setEventUser(interruptUser);\n                    event.setEventTime(new Date());\n                    event.setEventType(ProcessTaskConstants.TASK_EVENT_CANCELED);\n                    processTaskRepository.save(event);\n                    ProcessTaskStatusMessage processTaskStatusMessage = ProcessTaskDomainConverter.INSTANCE\n                            .convert2Msg(processTaskEntity);\n                    Map<String, Object> createTaskAction = new HashMap<>(3);\n                    createTaskAction.put(\"type\", ProcessConstants.TXN_ACTION_MSG);\n                    createTaskAction.put(\"topic\", taskStatusTopic);\n                    createTaskAction.put(\"bizData\", JSON.toJSONString(processTaskStatusMessage));\n                    postActionList.add(createTaskAction);\n                }\n            } else {\n                log.error(\"Process instance {} has no executing task\", instanceNo);\n            }\n    }\n\n    private void doCancelInstanceTask(ProcessInstanceEntity processInstanceEntity,\n            CancelProcessInstanceReq cancelProcessInstanceReq, List<Map<String, Object>> postActionList) {\n        String instanceNo = processInstanceEntity.getInstanceNo();\n        String extData = appendCancelInfo2ExtData(processInstanceEntity.getExtData(), cancelProcessInstanceReq);\n        processInstanceEntity.setExtData(extData);\n        processInstanceEntity.setStatus(STATUS_CANCELED);\n        processRepository.updateProcessInstanceById(processInstanceEntity);\n        ProcessInstanceStatusMessage processInstanceStatusMessage = ProcessInstanceDomainConverter.INSTANCE\n                .convert2Msg(processInstanceEntity);\n        Map<String, Object> createInstanceAction = new HashMap<>(3);\n        ProcessDTO process = processDefinitionDomainService\n                .getProcessProperties(processInstanceEntity.getProcessDefId());\n        Map<String, Object> properties = process.getProperties();\n        Map<String, Object> taskProperties = properties == null ? null : (Map<String, Object>) properties.get(\"task\");\n        Map<String, Object> processProperties = properties == null ? null : (Map<String, Object>) properties.get(\"process\");        \n        \n        if (processProperties != null && processProperties.get(\"processInstanceStatusMessage\") != null) {\n            Map<String, Object> processInstanceStatusMessageConf = (Map<String, Object>) processProperties\n                    .get(\"processInstanceStatusMessage\");\n            Boolean enabled = (Boolean) processInstanceStatusMessageConf.getOrDefault(\"enable\", false);\n            if (Boolean.TRUE.equals(enabled)) {\n                String processInstanceMessageTopic = (String) processInstanceStatusMessageConf.getOrDefault(\"topic\",\n                        processInstanceStatusTopic);\n                createInstanceAction.put(\"topic\", processInstanceMessageTopic);\n                createInstanceAction.put(\"type\", ProcessConstants.TXN_ACTION_MSG);\n                createInstanceAction.put(\"bizData\", JSON.toJSONString(processInstanceStatusMessage));\n                postActionList.add(createInstanceAction);\n            }\n        }\n\n        QueryTaskReqVO queryTaskReqVO = new QueryTaskReqVO();\n        queryTaskReqVO.setProcessInstanceNo(instanceNo);\n        queryTaskReqVO.setStatus(TASK_STATUS_PENDING);\n        List<ProcessTaskEntity> processTaskEntities = processTaskRepository.queryTask(queryTaskReqVO);\n        if (processTaskEntities != null) {\n            log.info(\"Executing task num:{}\", processTaskEntities.size());\n            for (ProcessTaskEntity processTaskEntity : processTaskEntities) {\n                processTaskEntity.setStatus(TASK_STATUS_CANCELED);\n                processTaskEntity.setExecuteBizResult(TASK_STATUS_CANCELED);\n                processTaskEntity.setExecutor(cancelProcessInstanceReq.getCancelUser());\n                processTaskRepository.updateById(processTaskEntity);\n                ProcessTaskEventEntity event = new ProcessTaskEventEntity();\n                event.setTaskNo(processTaskEntity.getTaskNo());\n                event.setEventNo(CodeGenerateHelper.generateCode(\"PROCESS_TASK_EVENT\", \"PTE\"));\n                event.setEventTime(cancelProcessInstanceReq.getCancelTime());\n                event.setEventUser(cancelProcessInstanceReq.getCancelUser());\n                event.setEventTime(new Date());\n                event.setEventType(ProcessTaskConstants.TASK_EVENT_CANCELED);\n                processTaskRepository.save(event);\n                if (taskProperties != null && taskProperties.get(\"taskStatusMessage\") != null) {\n                    Map<String, Object> messageConfig = (Map<String, Object>) taskProperties.get(\"taskStatusMessage\");\n                    if (Boolean.TRUE.equals(messageConfig.get(\"enable\"))) {\n                        ProcessTaskStatusMessage processTaskStatusMessage = ProcessTaskDomainConverter.INSTANCE\n                                .convert2Msg(processTaskEntity);\n                        Map<String, Object> createTaskAction = new HashMap<>(3);\n                        createTaskAction.put(\"type\", ProcessConstants.TXN_ACTION_MSG);\n                        createTaskAction.put(\"topic\", taskStatusTopic);\n                        createTaskAction.put(\"bizData\", JSON.toJSONString(processTaskStatusMessage));\n                        postActionList.add(createTaskAction);\n                    }\n                }\n            }\n        } else {\n            log.info(\"Process instance {} has no executing task\", instanceNo);\n        }\n    }\n\n    private String appendCancelInfo2ExtData(String extData, CancelProcessInstanceReq cancelProcessInstanceReq) {\n        Map<String, Object> extDataMap = null;\n        try {\n            extDataMap = JSON.parseObject(extData, Map.class);\n        } catch (Exception e) {\n            log.error(\"JSON.parseObject parse extData:{} exception\", extData);\n        }\n        if (null == extDataMap) {\n            extDataMap = new HashMap<>(1);\n        }\n        Map<String, Object> cancelInfoMap = new HashMap(4);\n        cancelInfoMap.put(\"cancelUser\", cancelProcessInstanceReq.getCancelUser());\n        cancelInfoMap.put(\"cancelTime\", cancelProcessInstanceReq.getCancelTime());\n        cancelInfoMap.put(\"reqCancelTime\", new Date());\n        cancelInfoMap.put(\"cancelReason\", cancelProcessInstanceReq.getCancelReason());\n        extDataMap.put(\"cancelInfo\", cancelInfoMap);\n        return JSON.toJSONString(extDataMap);\n    }\n    \n    private String appendInterruptInfo2ExtData(String extData) {\n        Map<String, Object> extDataMap = null;\n        try {\n            extDataMap = JSON.parseObject(extData, Map.class);\n        } catch (Exception e) {\n            log.error(\"JSON.parseObject parse extData:{} exception\", extData);\n        }\n        if (null == extDataMap) {\n            extDataMap = new HashMap<>(1);\n        }\n        Map<String, Object> interruptInfoMap = new HashMap(1);\n        interruptInfoMap.put(\"interruptOnRuntime\", true);\n        extDataMap.put(\"interruptInfo\", interruptInfoMap);\n        return JSON.toJSONString(extDataMap);\n    }\n    \n    public CanCancelProcessInstanceRes canCancel(CanCancelProcessInstanceReq canCancelProcessInstanceReq) {\n        CanCancelProcessInstanceRes res = new CanCancelProcessInstanceRes();\n        res.setCanCancel(false);\n        String instanceNo = canCancelProcessInstanceReq.getInstanceNo();\n        ProcessInstanceEntity currentEntity = queryProcessInstance(instanceNo);\n        if (ObjectUtils.isEmpty(currentEntity)) {\n            log.error(\"Process instance not found:{}\", instanceNo);\n            res.setReason(MessageUtil.getMessage(\"easyflow.process.server.tip.cannotCancelForInstanceNotExists\"));\n            return res;\n        }\n        String status = currentEntity.getStatus();\n        if (STATUS_CANCELED.equals(status)) {\n            log.error(\"Process instance is canceled status:{}\", instanceNo);\n            res.setReason(MessageUtil.getMessage(\"easyflow.process.server.tip.cannotCancelForCanncelStatus\"));\n            return res;\n        }\n        if (!STATUS_CLOSE.equals(status)) {\n            ProcessDTO process = processDefinitionDomainService.getProcessProperties(currentEntity.getProcessDefId());\n            Map<String, Object> properties = process.getProperties();\n            Map<String, Object> processProperties = properties == null ? null\n                    : (Map<String, Object>) properties.get(\"process\");\n            Map<String, Object> instanceCancelProperties = processProperties == null ? null\n                    : (Map<String, Object>) processProperties.get(\"instanceCancel\");\n            boolean instanceCancelEnable = instanceCancelProperties == null ? false\n                    : Boolean.TRUE.equals(instanceCancelProperties.get(\"enable\"));\n            if (!instanceCancelEnable) {\n                if (log.isDebugEnabled()) {\n                    log.debug(\"Process definition {} not config cancellable\", currentEntity.getProcessDefId());\n                }\n                res.setReason(MessageUtil.getMessage(\"easyflow.process.server.tip.cannotCancelForNotConfigCancel\"));\n                return res;\n            }\n            String cancelUser = canCancelProcessInstanceReq.getCancelUser();\n            if (!cancelUser.equals(currentEntity.getCreator())) {\n                log.error(\"Creator {} and cancle user {} inconsistent\", currentEntity.getCreator(), cancelUser);\n                res.setReason(MessageUtil.getMessage(\"easyflow.process.server.tip.cannotCancelForUserInconsistent\"));\n                return res;\n            }\n        } else {\n            log.error(\"Process instance:{} end, can not cancel\", instanceNo);\n            res.setReason(MessageUtil.getMessage(\"easyflow.process.server.tip.cannotCancelForInstanceFinish\"));\n            return res;\n        }\n        res.setCanCancel(true);\n        return res;\n    }\n    \n    public PagerResult<ProcessNodeExecutionEntity> pagerQueryNodeExecution(PagerCondition pagerQueryReq) {\n        if (pagerQueryReq.getPageSize() > MAX_PAGE_SIZE) {\n            throw new UserException(\"The max page size is \" + MAX_PAGE_SIZE);\n        }\n        \n         return processRepository.pagerQueryNodeExecution(pagerQueryReq);\n    }\n    \n    \n    public ProcessRepository getProcessRepository() {\n        return processRepository;\n    }\n\n    public void setProcessRepository(ProcessRepository processRepository) {\n        this.processRepository = processRepository;\n    }\n\n    public Locker getLocker() {\n        return locker;\n    }\n\n    public void setLocker(Locker locker) {\n        this.locker = locker;\n    }\n\n\n    public TransactionTemplate getTransactionTemplate() {\n        return transactionTemplate;\n    }\n\n    public void setTransactionTemplate(TransactionTemplate transactionTemplate) {\n        this.transactionTemplate = transactionTemplate;\n    }\n\n    public String lockProcessInstance(String processType, String bizNo) {\n        return locker.lock(\"_PROCESS_INSTANCE\", getLockKey(processType, bizNo));\n    }\n\n    public Boolean unLockProcessInstance(String processType, String bizNo, String lockRequestId) {\n        return locker.unlock(\"_PROCESS_INSTANCE\", getLockKey(processType, bizNo), lockRequestId);\n    }\n\n    private String getLockKey(String processType, String bizNo) {\n        return processType + \"__\" + bizNo;\n    }\n\n    public String getExecutionPersistPolicy() {\n        return executionPersistPolicy;\n    }\n\n    public void setExecutionPersistPolicy(String executionPersistPolicy) {\n        this.executionPersistPolicy = executionPersistPolicy;\n    }\n\n    public String getExecutionPeristType() {\n        return executionPeristType;\n    }\n\n    public void setExecutionPeristType(String executionPeristType) {\n        this.executionPeristType = executionPeristType;\n    }\n\n    public String getProcessInstanceStatusTopic() {\n        return processInstanceStatusTopic;\n    }\n\n    public void setProcessInstanceStatusTopic(String processInstanceStatusTopic) {\n        this.processInstanceStatusTopic = processInstanceStatusTopic;\n    }\n\n    public String getNodeInstanceStatusTopic() {\n        return nodeInstanceStatusTopic;\n    }\n\n    public void setNodeInstanceStatusTopic(String nodeInstanceStatusTopic) {\n        this.nodeInstanceStatusTopic = nodeInstanceStatusTopic;\n    }\n\n    public String getTaskStatusTopic() {\n        return taskStatusTopic;\n    }\n\n    public void setTaskStatusTopic(String taskStatusTopic) {\n        this.taskStatusTopic = taskStatusTopic;\n    }\n\n    public String getCreatedDatePolicy() {\n        return createdDatePolicy;\n    }\n\n    public void setCreatedDatePolicy(String createdDatePolicy) {\n        this.createdDatePolicy = createdDatePolicy;\n    }\n\n    public MessageSendService getMessageSendService() {\n        return messageSendService;\n    }\n\n    public void setMessageSendService(MessageSendService messageSendService) {\n        this.messageSendService = messageSendService;\n    }\n\n    public ProcessScheduleDomainService getProcessScheduleDomainService() {\n        return processScheduleDomainService;\n    }\n\n    public void setProcessScheduleDomainService(ProcessScheduleDomainService processScheduleDomainService) {\n        this.processScheduleDomainService = processScheduleDomainService;\n    }\n\n    public ProcessDefinitionDomainService getProcessDefinitionDomainService() {\n        return processDefinitionDomainService;\n    }\n\n    public void setProcessDefinitionDomainService(ProcessDefinitionDomainService processDefinitionDomainService) {\n        this.processDefinitionDomainService = processDefinitionDomainService;\n    }\n\n    public ProcessTaskRepository getProcessTaskRepository() {\n        return processTaskRepository;\n    }\n\n    public void setProcessTaskRepository(ProcessTaskRepository processTaskRepository) {\n        this.processTaskRepository = processTaskRepository;\n    }\n    \n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/domain/service/ProcessScheduleDomainService.java",
    "content": "package com.jd.easyflow.process.domain.service;\n\nimport org.springframework.beans.factory.annotation.Autowired;\n\nimport com.jd.easyflow.process.domain.model.vo.ScheduleProcessReqVO;\nimport com.jd.easyflow.process.domain.model.vo.ScheduleProcessResVO;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ProcessScheduleDomainService {\n\n    @Autowired\n    private ProcessScheduleInvoker invoker;\n\n    public ScheduleProcessResVO schedule(ScheduleProcessReqVO vo) {\n        return invoker.invoke(vo);\n    }\n\n    public ProcessScheduleInvoker getInvoker() {\n        return invoker;\n    }\n\n    public void setInvoker(ProcessScheduleInvoker invoker) {\n        this.invoker = invoker;\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/domain/service/ProcessScheduleInvoker.java",
    "content": "package com.jd.easyflow.process.domain.service;\n\nimport com.jd.easyflow.process.domain.model.vo.ScheduleProcessReqVO;\nimport com.jd.easyflow.process.domain.model.vo.ScheduleProcessResVO;\n\n/**\n * @author liyuliang5\n *\n */\npublic interface ProcessScheduleInvoker {\n\n    ScheduleProcessResVO invoke(ScheduleProcessReqVO vo);\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/domain/service/ProcessTaskDomainService.java",
    "content": "package com.jd.easyflow.process.domain.service;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Objects;\nimport java.util.Set;\nimport java.util.UUID;\nimport java.util.stream.Collectors;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.transaction.support.TransactionTemplate;\n\nimport com.jd.easyflow.codegenerator.client.CodeGenerateHelper;\nimport com.jd.easyflow.common.dto.pager.FieldEntry;\nimport com.jd.easyflow.common.dto.pager.PagerCondition;\nimport com.jd.easyflow.common.dto.pager.PagerResult;\nimport com.jd.easyflow.common.exception.UserException;\nimport com.jd.easyflow.common.util.AssertUtils;\nimport com.jd.easyflow.common.util.MessageUtil;\nimport com.jd.easyflow.flow.model.Flow;\nimport com.jd.easyflow.flow.model.FlowNode;\nimport com.jd.easyflow.flow.model.parser.FlowParser;\nimport com.jd.easyflow.flow.model.parser.FlowParserImpl;\nimport com.jd.easyflow.flow.util.FlowConstants;\nimport com.jd.easyflow.message.MessageSendService;\nimport com.jd.easyflow.process.adapter.export.constant.ProcessInstanceConstants;\nimport com.jd.easyflow.process.adapter.export.constant.ProcessTransactionConstants;\nimport com.jd.easyflow.process.adapter.export.converter.ProcessInstanceConverter;\nimport com.jd.easyflow.process.adapter.export.converter.ProcessTaskConverter;\nimport com.jd.easyflow.process.adapter.export.dto.instance.StdProcessContextDTO;\nimport com.jd.easyflow.process.adapter.export.dto.instance.StdProcessDTO;\nimport com.jd.easyflow.process.adapter.export.dto.task.CanWithdrawTaskRes;\nimport com.jd.easyflow.process.adapter.export.dto.task.ProcessTaskAssignDTO;\nimport com.jd.easyflow.process.adapter.export.dto.task.ProcessTaskDTO;\nimport com.jd.easyflow.process.adapter.export.dto.task.ProcessTaskEventDTO;\nimport com.jd.easyflow.process.adapter.message.ProcessNodeInstanceStatusMessage;\nimport com.jd.easyflow.process.adapter.message.ProcessTaskStatusMessage;\nimport com.jd.easyflow.process.domain.constant.ProcessConstants;\nimport com.jd.easyflow.process.domain.constant.ProcessTaskConstants;\nimport com.jd.easyflow.process.domain.constant.StdProcessConstants;\nimport com.jd.easyflow.process.domain.converter.ProcessInstanceDomainConverter;\nimport com.jd.easyflow.process.domain.converter.ProcessTaskDomainConverter;\nimport com.jd.easyflow.process.domain.model.entity.ProcessDefinitionEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessInstanceEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessNodeInstanceEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessTaskAssignEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessTaskEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessTaskEventEntity;\nimport com.jd.easyflow.process.domain.model.vo.ExecuteProcessTaskReqVO;\nimport com.jd.easyflow.process.domain.model.vo.QueryTaskReqVO;\nimport com.jd.easyflow.process.domain.model.vo.ScheduleProcessReqVO;\nimport com.jd.easyflow.process.domain.repository.ProcessRepository;\nimport com.jd.easyflow.process.domain.repository.ProcessTaskRepository;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ProcessTaskDomainService {\n    \n    private static final Logger log = LoggerFactory.getLogger(ProcessTaskDomainService.class);\n\n\n    private static final int MAX_PAGE_SIZE = 10000;\n\n    private MessageSendService messageSendService;\n    @Autowired\n    private ProcessScheduleDomainService processScheduleDomainService;\n    @Autowired\n    private ProcessTaskRepository processTaskRepository;\n    @Autowired\n    private ProcessInstanceDomainService processInstanceDomainService;\n\n    @Autowired\n    private ProcessRepository processRepository;\n    @Autowired\n    private ProcessDefinitionDomainService processDefinitionDomainService;\n    private TransactionTemplate transactionTemplate;\n\n    @Value(ProcessConstants.CREATED_DATE_POLICY)\n    private String createdDatePolicy;\n\n    @Value(ProcessTaskConstants.TOPIC_TASK_STATUS)\n    private String taskStatusTopic;\n    \n    @Value(ProcessConstants.TOPIC_NODE_INSTANCE_STATUS)\n    private String nodeInstanceStatusTopic;\n\n    public static final String EVENT_PERSIST_POLICY_SYNC = \"SYNC\";\n    public static final String EVENT_PERSIST_POLICY_ASYNC = \"ASYNC\";\n\n    public String eventPersistPolicy = EVENT_PERSIST_POLICY_ASYNC;\n\n    private FlowParser flowParser = new FlowParserImpl();\n\n    public List<ProcessTaskEntity> queryTask(QueryTaskReqVO query) {\n            return processTaskRepository.queryTask(query);\n    }\n\n    public void executeTask(ExecuteProcessTaskReqVO req) {\n        AssertUtils.isNotNull(req.getUser(), \"User must not be null\");\n\n        ProcessTaskEntity processTask = transactionTemplate.execute(status -> {\n            return processTaskRepository.getTask(req.getTaskNo());\n        });\n        ScheduleProcessReqVO scheduleReq = new ScheduleProcessReqVO();\n        scheduleReq.setProcessId(null);\n\n        Map<String, Object> param = new HashMap<>();\n        param.put(ProcessTaskConstants.PARAM_TASK_EXECUTE_RESULT, req.getExecuteBizResult());\n        param.put(ProcessTaskConstants.PARAM_TASK_EXECUTE_DATA, req.getExecuteBizData());\n        param.put(ProcessTaskConstants.PARAM_TASK_TASKNO, req.getTaskNo());\n        param.put(ProcessTaskConstants.PARAM_TASK_GROUP_LIST, req.getGroupList());\n        param.put(ProcessTaskConstants.PARAM_TASK_GROUP2_LIST, req.getGroup2List());\n        param.put(ProcessTaskConstants.PARAM_TASK_EXECUTE_CMDLIST_STR, JSON.toJSONString(req.getCmdList()));\n        param.put(ProcessTaskConstants.PARAM_TASK_OPERATION, req.getOperation());\n        param.put(ProcessTaskConstants.PARAM_TASK_EXT_DATA, req.getTaskExtData());\n        scheduleReq.setParam(param);\n\n        Map<String, Object> dataMap = new HashMap<>();\n        dataMap.put(StdProcessConstants.PARAM_INSTANCENO, processTask.getProcessInstanceNo());\n        dataMap.put(StdProcessConstants.PARAM_PROCESS_TYPE, processTask.getProcessType());\n        dataMap.put(StdProcessConstants.PARAM_BIZNO, processTask.getBizNo());\n        dataMap.put(StdProcessConstants.PARAM_USER, req.getUser());\n        dataMap.put(StdProcessConstants.PARAM_PRODUCT_CODE, processTask.getProductCode());\n        dataMap.put(StdProcessConstants.PARAM_BIZ_DATA, req.getInstanceBizData());\n        dataMap.put(StdProcessConstants.PARAM_BIZ_STATUS, req.getInstanceBizStatus());\n        dataMap.put(FlowConstants.PARAM_DATA_EVENT, \"EXECUTE\");\n        scheduleReq.setDataMap(dataMap);\n\n        scheduleReq.setNodeIds(new String[] { processTask.getTaskBizCode() });\n        scheduleReq.setProcessType(processTask.getProcessType());\n        scheduleReq.setBizNo(processTask.getBizNo());\n        scheduleReq.setProductCode(processTask.getProductCode());\n        scheduleReq.setProcessInstanceNo(processTask.getProcessInstanceNo());\n        processScheduleDomainService.schedule(scheduleReq);\n    }\n    \n    public CanWithdrawTaskRes canWithdrawTask(String taskNo, String user) {\n        CanWithdrawTaskRes res = new CanWithdrawTaskRes();\n        res.setCanWithDraw(false);\n        ProcessTaskEntity taskEntity = processTaskRepository.getTask(taskNo);\n        if (!Objects.equals(taskEntity.getExecutor(), user)) {\n            res.setReason(MessageUtil.getMessage(\"easyflow.process.server.tip.taskExecuteUserAndWithdrawUserInconsistent\",  new Object[] {taskEntity.getExecutor(), user}));\n            return res;\n        }\n        if (!com.jd.easyflow.process.adapter.export.constant.ProcessTaskConstants.TASK_STATUS_FINISH\n                .equals(taskEntity.getStatus())) {\n            res.setReason(MessageUtil.getMessage(\"easyflow.process.server.tip.cannotWithdrawForTaskNotEnd\"));\n            return res;\n        }\n        ProcessInstanceEntity processInstance = processInstanceDomainService\n                .queryProcessInstance(taskEntity.getProcessInstanceNo());\n        if (ProcessInstanceConstants.STATUS_CLOSE.equals(processInstance.getStatus())) {\n            res.setReason(MessageUtil.getMessage(\"easyflow.process.server.tip.cannotWithdrawForInstanceClose\"));\n            return res;\n        }\n\n        ProcessNodeInstanceEntity nodeInstance = processRepository.getByNodeInstanceNo(taskEntity.getNodeInstanceNo());\n        String nodeId = nodeInstance.getNodeId();\n        ProcessDefinitionEntity processDefinition = processDefinitionDomainService\n                .getProcessDefinition(processInstance.getProcessDefId());\n        Flow flow = flowParser.parse(processDefinition.getJsonContent(), false).get(0);\n        FlowNode flowNode = flow.getNode(nodeId);\n        Map<String, Object> taskConfig = flowNode.getProperty(ProcessTaskConstants.NODE_PROP_TASK_KEY);\n        Map<String, Object> withdrawConfig = (Map<String, Object>) taskConfig\n                .get(ProcessTaskConstants.TASK_PROP_WITHDRAW);\n        if (withdrawConfig == null || Boolean.FALSE.equals(withdrawConfig.get(ProcessTaskConstants.TASK_PROP_WITHDRAW_ENABLE))) {\n            res.setReason(MessageUtil.getMessage(\"easyflow.process.server.tip.cannotWithdrawForNoConfig\", new Object[] {nodeId}));\n            return res;\n        }\n        if (ProcessInstanceConstants.NODE_STATUS_CLOSE.equals(nodeInstance.getStatus())) {\n            String[] nextNodeInstances = nodeInstance.getNextNodeInstances() == null ? null\n                    : nodeInstance.getNextNodeInstances().split(\",\");\n            if (nextNodeInstances != null && nextNodeInstances.length > 0) {\n                for (String nextNodeInstanceNo : nextNodeInstances) {\n                    ProcessNodeInstanceEntity nextNodeInstance = processRepository\n                            .getByNodeInstanceNo(nextNodeInstanceNo);\n                    if (ProcessInstanceConstants.NODE_STATUS_CLOSE.equals(nextNodeInstance.getStatus())) {\n                        res.setReason(MessageUtil.getMessage(\"easyflow.process.server.tip.cannotWithdrawForPostNodeClose\", new Object[] {nextNodeInstance.getNodeInstanceNo()}));\n                        return res;\n                    }\n                    if (nextNodeInstance.getPreviousNodeInstances().contains(\",\")) {\n                        res.setReason(MessageUtil.getMessage(\"easyflow.process.server.tip.cannotWithdrawForMultiplePreNodes\", new Object[] {nextNodeInstance.getNodeInstanceNo()}));\n                        return res;\n                    }\n                    QueryTaskReqVO query = new QueryTaskReqVO();\n                    query.setNodeInstanceNo(nextNodeInstanceNo);\n                    List<ProcessTaskEntity> nextNodeTaskList = processTaskRepository.queryTask(query);\n                    for (ProcessTaskEntity nextNodeTask : nextNodeTaskList) {\n                        if (!ProcessTaskConstants.TASK_STATUS_PENDING.equals(nextNodeTask.getStatus())) {\n                            res.setReason(MessageUtil.getMessage(\"easyflow.process.server.tip.cannotWithdrawForTaskProcessed\", new Object[] {nextNodeTask.getTaskNo()}));\n                            return res;\n                        }\n                    }\n                }\n            }\n        }\n        res.setCanWithDraw(true);\n        return res;\n    }\n\n    public void withdrawTask(String taskNo, String user, String withdrawInstancePolicy, String instanceBizStatus,\n            String instanceBizData) {\n        ProcessTaskEntity task = processTaskRepository.getTask(taskNo);\n        String requestId = processInstanceDomainService.lockProcessInstance(task.getProcessType(),\n                task.getBizNo());\n        try {\n            List<Map<String, Object>> postActionList = new ArrayList<>();\n            transactionTemplate.executeWithoutResult((status) -> {\n                ProcessTaskEntity taskEntity = processTaskRepository.getTask(taskNo);\n                CanWithdrawTaskRes canRes = canWithdrawTask(taskNo, user);\n                if (!canRes.isCanWithDraw()) {\n                    throw new UserException(MessageUtil.getMessage(\"easyflow.process.server.tip.cannotWithdrawForReason\", new Object[] {taskNo, canRes.getReason()}));\n                }\n                doWithDrawTask(taskEntity, user, withdrawInstancePolicy, instanceBizStatus, instanceBizData,\n                        postActionList);\n            });\n            for (Map<String, Object> action : postActionList) {\n                String topic = (String) action.get(\"topic\");\n                String bizData = (String) action.get(\"bizData\");\n                messageSendService.sendMessage(UUID.randomUUID().toString(), topic, bizData);\n            }\n        } finally {\n            processInstanceDomainService.unLockProcessInstance(task.getProcessType(), task.getBizNo(),\n                    requestId);\n        }\n\n    }\n\n    private void doWithDrawTask(ProcessTaskEntity taskEntity, String user, String withdrawInstancePolicy,\n            String instanceBizStatus, String instanceBizData, List<Map<String, Object>> postActionList) {\n        Date actionTime = new Date();\n        ProcessInstanceEntity processInstance = processRepository\n                .getByProcessInstanceNo(taskEntity.getProcessInstanceNo());\n        ProcessDefinitionEntity processDefinition = processDefinitionDomainService\n                .getProcessDefinition(processInstance.getProcessDefId());\n        Flow flow = flowParser.parse(processDefinition.getJsonContent(), false).get(0);\n        Map<String, Object> taskProperties = (Map<String, Object>) flow.getProperty(\"task\");\n        Map<String, Object> processProperties = (Map<String, Object>) flow.getProperty(\"process\");\n        ProcessNodeInstanceEntity nodeInstance = processRepository.getByNodeInstanceNo(taskEntity.getNodeInstanceNo());\n        if (ProcessInstanceConstants.NODE_STATUS_CLOSE.equals(nodeInstance.getStatus())) {\n            String[] nextNodeInstances = nodeInstance.getNextNodeInstances() == null ? null\n                    : nodeInstance.getNextNodeInstances().split(\",\");\n            if (nextNodeInstances != null && nextNodeInstances.length > 0) {\n                for (String nextNodeInstanceNo : nextNodeInstances) {\n                    ProcessNodeInstanceEntity nextNodeInstance = processRepository\n                            .getByNodeInstanceNo(nextNodeInstanceNo);\n                    nextNodeInstance.setStatus(ProcessInstanceConstants.NODE_STATUS_INVALID);\n                    processRepository.updateProcessNodeInstanceById(nextNodeInstance);\n                    if (processProperties != null && processProperties.get(\"processNodeInstanceStatusMessage\") != null) {\n                        Map<String, Object> messageConfig = (Map<String, Object>) processProperties.get(\"processNodeInstanceStatusMessage\");\n                        if (Boolean.TRUE.equals(messageConfig.get(\"enable\"))) {\n                            Map<String, Object> invalidNodeAction = new HashMap<>();\n                            invalidNodeAction.put(\"type\", ProcessConstants.TXN_ACTION_MSG);\n                            invalidNodeAction.put(\"topic\", messageConfig.getOrDefault(\"topic\", nodeInstanceStatusTopic));\n                            ProcessNodeInstanceStatusMessage message = ProcessInstanceDomainConverter.INSTANCE.convert2Msg(nextNodeInstance);\n                            invalidNodeAction.put(\"bizData\", JSON.toJSONString(message));\n                            postActionList.add(invalidNodeAction);\n                        }\n                    }\n                    QueryTaskReqVO query = new QueryTaskReqVO();\n                    query.setNodeInstanceNo(nextNodeInstanceNo);\n                    List<ProcessTaskEntity> nextNodeTaskList = processTaskRepository.queryTask(query);\n                    for (ProcessTaskEntity nextNodeTask : nextNodeTaskList) {\n                        nextNodeTask.setStatus(ProcessTaskConstants.TASK_STATUS_INVALID);\n                        processTaskRepository.updateById(nextNodeTask);\n                        ProcessTaskEventEntity event = new ProcessTaskEventEntity();\n                        event.setTaskNo(nextNodeTask.getTaskNo());\n                        event.setEventNo(CodeGenerateHelper.generateCode(\"PROCESS_TASK_EVENT\", \"PTE\"));\n                        event.setEventTime(actionTime);\n                        event.setEventUser(user);\n                        event.setEventType(ProcessTaskConstants.TASK_EVENT_INVALID_FOR_WITHDRAW);\n                        event.setProductCode(taskEntity.getProductCode());\n                        processTaskRepository.save(event);\n\n                        if (taskProperties != null && taskProperties.get(\"taskStatusMessage\") != null) {\n                            Map<String, Object> messageConfig = (Map<String, Object>) taskProperties\n                                    .get(\"taskStatusMessage\");\n                            if (Boolean.TRUE.equals(messageConfig.get(\"enable\"))) {\n                                Map<String, Object> createTaskAction = new HashMap<>();\n                                createTaskAction.put(\"type\", ProcessConstants.TXN_ACTION_MSG);\n                                createTaskAction.put(\"topic\", messageConfig.getOrDefault(\"topic\", taskStatusTopic));\n                                ProcessTaskStatusMessage message = ProcessTaskDomainConverter.INSTANCE\n                                        .convert2Msg(nextNodeTask);\n                                createTaskAction.put(\"bizData\", JSON.toJSONString(message));\n                                postActionList.add(createTaskAction);\n                            }\n                        }\n\n                    }\n\n                }\n            }\n            nodeInstance.setStatus(ProcessInstanceConstants.NODE_STATUS_ACTIVE);\n            nodeInstance.setEndTime(null);\n            nodeInstance.setExecutors(null);\n            nodeInstance.setNextNodeInstances(null);\n            processRepository.updateProcessNodeInstanceById(nodeInstance);\n            if (processProperties != null && processProperties.get(\"processNodeInstanceStatusMessage\") != null) {\n                Map<String, Object> messageConfig = (Map<String, Object>) processProperties.get(\"processNodeInstanceStatusMessage\");\n                if (Boolean.TRUE.equals(messageConfig.get(\"enable\"))) {\n                    Map<String, Object> activeNodeAction = new HashMap<>();\n                    activeNodeAction.put(\"type\", ProcessConstants.TXN_ACTION_MSG);\n                    activeNodeAction.put(\"topic\", messageConfig.getOrDefault(\"topic\", nodeInstanceStatusTopic));\n                    ProcessNodeInstanceStatusMessage message = ProcessInstanceDomainConverter.INSTANCE.convert2Msg(nodeInstance);\n                    activeNodeAction.put(\"bizData\", JSON.toJSONString(message));\n                    postActionList.add(activeNodeAction);\n                }\n            }\n        }\n        taskEntity.setStatus(ProcessTaskConstants.TASK_STATUS_PENDING);\n        taskEntity.setExecutor(null);\n        taskEntity.setExecuteBizResult(null);\n        taskEntity.setExecuteBizData(null);\n        taskEntity.setExecuteTime(null);\n        processTaskRepository.updateById(taskEntity);\n        if (taskProperties != null && taskProperties.get(\"taskStatusMessage\") != null) {\n            Map<String, Object> messageConfig = (Map<String, Object>) taskProperties.get(\"taskStatusMessage\");\n            if (Boolean.TRUE.equals(messageConfig.get(\"enable\"))) {\n                Map<String, Object> createTaskAction = new HashMap<>();\n                createTaskAction.put(\"topic\", messageConfig.getOrDefault(\"topic\", taskStatusTopic));\n                createTaskAction.put(\"type\", ProcessConstants.TXN_ACTION_MSG);\n                ProcessTaskStatusMessage message = ProcessTaskDomainConverter.INSTANCE.convert2Msg(taskEntity);\n                createTaskAction.put(\"bizData\", JSON.toJSONString(message));\n                postActionList.add(createTaskAction);\n            }\n        }\n\n        ProcessTaskEventEntity event = new ProcessTaskEventEntity();\n        event.setTaskNo(taskEntity.getTaskNo());\n        event.setEventNo(CodeGenerateHelper.generateCode(\"PROCESS_TASK_EVENT\", \"PTE\"));\n        event.setEventTime(actionTime);\n        event.setEventUser(user);\n        event.setEventType(ProcessTaskConstants.TASK_EVENT_WITHDRAW);\n        event.setProductCode(taskEntity.getProductCode());\n        event.setInstanceBizStatus(instanceBizStatus);\n        event.setInstanceBizData(instanceBizData);\n        Map<String, Object> eventBizData = new HashMap<>();\n        eventBizData.put(\"withdrawInstancePolicy\", withdrawInstancePolicy);\n        event.setEventBizData(JSON.toJSONString(eventBizData));\n        processTaskRepository.save(event);\n        if (com.jd.easyflow.process.adapter.export.constant.ProcessTaskConstants.WITHDRAW_INSTANCE_POLICY_CUSTOMIZE\n                .equals(withdrawInstancePolicy)) {\n            processInstance.setBizStatus(instanceBizStatus);\n            processInstance.setBizData(instanceBizData);\n        } else if (withdrawInstancePolicy == null\n                || com.jd.easyflow.process.adapter.export.constant.ProcessTaskConstants.WITHDRAW_INSTANCE_POLICY_HISTORY\n                        .equals(withdrawInstancePolicy)) {\n            List<ProcessTaskEventEntity> eventList = processTaskRepository\n                    .findTaskEventListByTaskNo(taskEntity.getTaskNo());\n            Collections.sort(eventList, (e1, e2) -> e1.getCreatedDate().compareTo(e2.getCreatedDate()));\n            for (int i = 0; i < eventList.size(); i++) {\n                ProcessTaskEventEntity eventEntity = eventList.get(eventList.size() - 1 - i);\n                if (ProcessTaskConstants.TASK_EVENT_EXECUTE.equals(eventEntity.getEventType())) {\n                    String eventInstanceBizStatus = eventEntity.getInstanceBizStatus();\n                    String eventInstanceBizData = eventEntity.getInstanceBizData();\n                    log.info(\"Withdraw process instance data, instanceBizStatus:\" + eventInstanceBizStatus + \" instanceBizData:\"\n                            + eventInstanceBizData);\n                    if (eventInstanceBizStatus != null && ! eventInstanceBizStatus.isEmpty()) {\n                        processInstance.setBizStatus(eventInstanceBizStatus);\n                    }\n                    if (eventInstanceBizData != null && ! eventInstanceBizData.isEmpty()) {\n                        processInstance.setBizData(eventInstanceBizData);\n                    }\n                }\n            }\n        } else if (withdrawInstancePolicy.equals(\n                com.jd.easyflow.process.adapter.export.constant.ProcessTaskConstants.WITHDRAW_INSTANCE_POLICY_NONE)) {\n            // NOOP\n        } else {\n            throw new UnsupportedOperationException(\"Unsupported instance withdraw policy:\" + withdrawInstancePolicy);\n        }\n        List<ProcessNodeInstanceEntity> nodeInstanceList = processRepository\n                .findOpenNodeInstances(taskEntity.getProcessInstanceNo());\n        Set<String> openNodeIds = new HashSet<String>();\n        for (ProcessNodeInstanceEntity node : nodeInstanceList) {\n            openNodeIds.add(node.getNodeId());\n        }\n        processInstance.setCurrentNodeIds(String.join( \",\", openNodeIds));\n        log.info(\"Process instance info after withdraw:\" + processInstance);\n        processRepository.updateProcessInstanceById(processInstance);\n\n    }\n    \n    public PagerResult<ProcessTaskDTO> pagerQueryTask(PagerCondition condition) {\n        if (condition.getPageSize() > MAX_PAGE_SIZE) {\n            throw new UserException(\"The max page size is \" + MAX_PAGE_SIZE);\n        }\n        FieldEntry statusListEntry = condition.getField(\"statusList\");\n        FieldEntry statusFieldEntry = condition.getField(\"status\");\n        if (statusListEntry == null && statusFieldEntry == null) {\n            condition.addField(new FieldEntry(\"statusList\",\n                    Arrays.asList(ProcessTaskConstants.TASK_STATUS_FINISH, ProcessTaskConstants.TASK_STATUS_PENDING)));\n        }\n        PagerResult pagerResult = processTaskRepository.pagerQueryTask(condition);\n        List<ProcessTaskDTO> list = ProcessTaskConverter.INSTANCE.convert(pagerResult.getList());\n        pagerResult.setList(list);\n        if (com.jd.easyflow.process.adapter.export.constant.ProcessTaskConstants.PAGER_EXT_ASSIGN_PENDING\n                .equals(condition.getExtData(\n                        com.jd.easyflow.process.adapter.export.constant.ProcessTaskConstants.PAGER_EXT_KEY_ASSIGN))) {\n            List<String> taskNoList = list.stream()\n                    .filter(dto -> ProcessTaskConstants.TASK_STATUS_PENDING.equals(dto.getStatus()))\n                    .map(dto -> dto.getTaskNo()).collect(Collectors.toList());\n            if (taskNoList != null && ! taskNoList.isEmpty()) {\n                List<ProcessTaskAssignEntity> assignList = processTaskRepository\n                        .findTaskAssignListByTaskNoList(taskNoList);\n                Map<String, List<ProcessTaskAssignEntity>> map = assignList.stream()\n                        .collect(Collectors.groupingBy(ProcessTaskAssignEntity::getTaskNo));\n                list.forEach(task -> task\n                        .setAssignList(ProcessTaskConverter.INSTANCE.convertAssignList(map.get(task.getTaskNo()))));\n            }\n        }\n        if (com.jd.easyflow.process.adapter.export.constant.ProcessTaskConstants.PAGER_EXT_NODE_TASK_CONF_PENDING\n                .equals(condition.getExtData(\n                        com.jd.easyflow.process.adapter.export.constant.ProcessTaskConstants.PAGER_EXT_KEY_NODE_TASK_CONF))) {\n            for (ProcessTaskDTO task : list) {\n                if (ProcessTaskConstants.TASK_STATUS_PENDING.equals(task.getStatus())) {\n                    task.setNodeTaskConf(getTaskConf(task));\n                }\n            }\n        }\n        if (com.jd.easyflow.process.adapter.export.constant.ProcessTaskConstants.PAGER_EXT_PROCESS_INSTANCE_ALL\n                .equals(condition.getExtData(\n                        com.jd.easyflow.process.adapter.export.constant.ProcessTaskConstants.PAGER_EXT_KEY_PROCESS_INSTANCE))) {\n            for (ProcessTaskDTO task : list) {\n                ProcessInstanceEntity processInstance = processInstanceDomainService\n                        .queryProcessInstance(task.getProcessInstanceNo());\n                task.setProcessInstance(ProcessInstanceConverter.INSTANCE.convert(processInstance));\n            }\n        }\n        return pagerResult;\n    }\n\n    private String getTaskConf(ProcessTaskDTO task) {\n        String processInstanceNo = task.getProcessInstanceNo();\n        ProcessInstanceEntity processInstance = processInstanceDomainService.queryProcessInstance(processInstanceNo);\n        ProcessNodeInstanceEntity processNodeInstance = processRepository.getByNodeInstanceNo(task.getNodeInstanceNo());\n        ProcessDefinitionEntity processDefinitionEntity = processDefinitionDomainService\n                .getProcessDefinition(processInstance.getProcessDefId());\n        if (processDefinitionEntity == null) {\n            log.warn(\"process:\" + processInstance.getProcessDefId() + \" is null\");\n            return null;\n        }\n        Flow flow = flowParser.parse(processDefinitionEntity.getJsonContent(), false).get(0);\n        FlowNode flowNode = flow.getNode(processNodeInstance.getNodeId());\n        Map<String, Object> taskConf = flowNode.getProperty(\"task\");\n        return JSON.toJSONString(taskConf);\n    }\n\n    public ProcessTaskDTO getTask(String taskNo) {\n        AssertUtils.isNotNull(taskNo, \"Task no must not be null\");\n        ProcessTaskEntity taskEntity = processTaskRepository.getTask(taskNo);\n        if (taskEntity == null) {\n            return null;\n        }\n        List<ProcessTaskAssignEntity> taskAssignList = processTaskRepository.findTaskAssignListByTaskNo(taskNo);\n        List<ProcessTaskAssignDTO> assignDtoList = ProcessTaskConverter.INSTANCE.convertAssignList(taskAssignList);\n        ProcessTaskDTO dto = ProcessTaskConverter.INSTANCE.convert(taskEntity);\n        dto.setAssignList(assignDtoList);\n        ProcessInstanceEntity processInstance = processInstanceDomainService\n                .queryProcessInstance(dto.getProcessInstanceNo());\n        dto.setProcessInstance(ProcessInstanceConverter.INSTANCE.convert(processInstance));\n        return dto;\n    }\n\n    public void updateTaskObject(Integer persistOp, Object o, StdProcessContextDTO process,\n            List<Map<String, Object>> actionList) {\n        if (o instanceof ProcessTaskDTO) {\n            ProcessTaskEntity entity = ProcessTaskConverter.INSTANCE.convert((ProcessTaskDTO) o);\n            if (persistOp == null) {\n                ProcessTaskEntity currentEntity = processTaskRepository.getTask(entity.getTaskNo());\n                persistOp = currentEntity == null ? ProcessTransactionConstants.PERSIST_OP_ADD\n                        : ProcessTransactionConstants.PERSIST_OP_UPDATE;\n            }\n            if (persistOp == ProcessTransactionConstants.PERSIST_OP_ADD) {\n                if (log.isDebugEnabled()) {\n                    log.debug(\"Add \" + entity.getTaskNo());\n                }\n                switch (createdDatePolicy) {\n                case ProcessConstants.CREATED_DATE_POLICY_CLIENT: {\n                    processTaskRepository.saveWithCreatedDate(entity);\n                    break;\n                }\n                case ProcessConstants.CREATED_DATE_POLICY_SERVER: {\n                    entity.setCreatedDate(new Date());\n                    processTaskRepository.saveWithCreatedDate(entity);\n                    break;\n                }\n                case ProcessConstants.CREATED_DATE_POLICY_DB: {\n                    entity.setCreatedDate(null);\n                    processTaskRepository.save(entity);\n                    break;\n                }\n                default: {\n                    throw new IllegalArgumentException(\"Illegal policy \" + createdDatePolicy);\n                }\n                }\n                addMessageOfTaskCreate(entity, process, actionList);\n            } else {\n                if (log.isDebugEnabled()) {\n                    log.debug(\"Update \" + entity.getTaskNo());\n                }\n                processTaskRepository.updateByTaskNo(entity);\n                addMessageOfTaskUpdate(entity, process, actionList);\n            }\n        } else if (o instanceof ProcessTaskAssignDTO) {\n            ProcessTaskAssignEntity entity = ProcessTaskConverter.INSTANCE.convert((ProcessTaskAssignDTO) o);\n            if (persistOp == null) {\n                ProcessTaskAssignEntity currentEntity = processTaskRepository.getTaskAssign(entity.getAssignNo());\n                persistOp = currentEntity == null ? ProcessTransactionConstants.PERSIST_OP_ADD\n                        : ProcessTransactionConstants.PERSIST_OP_UPDATE;\n            }\n            if (persistOp == ProcessTransactionConstants.PERSIST_OP_ADD) {\n                if (log.isDebugEnabled()) {\n                    log.debug(\"Add \" + entity.getAssignNo());\n                }\n                switch (createdDatePolicy) {\n                case ProcessConstants.CREATED_DATE_POLICY_CLIENT: {\n                    processTaskRepository.saveWithCreatedDate(entity);\n                    break;\n                }\n                case ProcessConstants.CREATED_DATE_POLICY_SERVER: {\n                    entity.setCreatedDate(new Date());\n                    processTaskRepository.saveWithCreatedDate(entity);\n                    break;\n                }\n                case ProcessConstants.CREATED_DATE_POLICY_DB: {\n                    entity.setCreatedDate(null);\n                    processTaskRepository.save(entity);\n                    break;\n                }\n                default: {\n                    throw new IllegalArgumentException(\"Illegal policy:\" + createdDatePolicy);\n                }\n                }\n            } else {\n                if (log.isDebugEnabled()) {\n                    log.debug(\"Update\" + entity.getAssignNo());\n                }\n                processTaskRepository.updateByTaskAssignNo(entity);\n            }\n        } else if (o instanceof ProcessTaskEventDTO) {\n            Integer finalPersistOp = persistOp;\n            Runnable runnable = () -> {\n                Integer finalPersistOp2 = finalPersistOp;\n                ProcessTaskEventEntity entity = ProcessTaskConverter.INSTANCE.convert((ProcessTaskEventDTO) o);\n                if (finalPersistOp2 == null) {\n                    ProcessTaskEventEntity currentEntity = processTaskRepository.getTaskEvent(entity.getEventNo());\n                    finalPersistOp2 = currentEntity == null ? ProcessTransactionConstants.PERSIST_OP_ADD\n                            : ProcessTransactionConstants.PERSIST_OP_UPDATE;\n                }\n                if (finalPersistOp2 == ProcessTransactionConstants.PERSIST_OP_ADD) {\n                    if (log.isDebugEnabled()) {\n                        log.debug(\"Add \" + entity.getEventNo());\n                    }\n                    switch (createdDatePolicy) {\n                    case ProcessConstants.CREATED_DATE_POLICY_CLIENT: {\n                        processTaskRepository.saveWithCreatedDate(entity);\n                        break;\n                    }\n                    case ProcessConstants.CREATED_DATE_POLICY_SERVER: {\n                        entity.setCreatedDate(new Date());\n                        processTaskRepository.saveWithCreatedDate(entity);\n                        break;\n                    }\n                    case ProcessConstants.CREATED_DATE_POLICY_DB: {\n                        entity.setCreatedDate(null);\n                        processTaskRepository.save(entity);\n                        break;\n                    }\n                    default: {\n                        throw new IllegalArgumentException(\"Illegal policy:\" + createdDatePolicy);\n                    }\n                    }\n                } else {\n                    if (log.isDebugEnabled()) {\n                        log.debug(\"Update \" + entity.getEventNo());\n                    }\n                    processTaskRepository.updateByTaskEventNo(entity);\n                }\n            };\n\n            if (EVENT_PERSIST_POLICY_SYNC.equals(eventPersistPolicy)) {\n                runnable.run();\n            } else {\n                boolean contains = false;\n                for (Map<String, Object> action : actionList) {\n                    if (ProcessConstants.TXN_ACTION_MERGE_ASYNC.equals(action.get(\"type\"))) {\n                        List<Runnable> runnableList = (List<Runnable>) action.get(\"tasks\");\n                        if (runnableList != null) {\n                            runnableList.add(runnable);\n                            contains = true;\n                            break;\n                        }\n                    }\n                }\n                if (!contains) {\n                    Map<String, Object> action = new HashMap<>();\n                    action.put(\"type\", ProcessConstants.TXN_ACTION_MERGE_ASYNC);\n                    List<Runnable> runnableList = new ArrayList<>();\n                    runnableList.add(runnable);\n                    action.put(\"tasks\", runnableList);\n                    actionList.add(action);\n                }\n            }\n\n        } else {\n            throw new IllegalArgumentException(\"Illegal object class:\" + o.getClass());\n        }\n    }\n\n    private void addMessageOfTaskCreate(ProcessTaskEntity entity, StdProcessContextDTO processContext,\n            List<Map<String, Object>> actionList) {\n        Map<String, Object> taskProperties = null;\n        StdProcessDTO process = processContext.getProcess();\n        if (process != null && process.getExtProperties() != null) {\n            taskProperties = (Map<String, Object>) process.getExtProperties().get(\"task\");\n        }\n        if (taskProperties != null && taskProperties.get(\"taskStatusMessage\") != null) {\n            Map<String, Object> messageConfig = (Map<String, Object>) taskProperties.get(\"taskStatusMessage\");\n            if (Boolean.TRUE.equals(messageConfig.get(\"enable\"))) {\n                Map<String, Object> createTaskAction = new HashMap<>();\n                createTaskAction.put(\"type\", ProcessConstants.TXN_ACTION_MSG);\n                createTaskAction.put(\"topic\", messageConfig.getOrDefault(\"topic\", taskStatusTopic));\n                ProcessTaskStatusMessage message = ProcessTaskDomainConverter.INSTANCE.convert2Msg(entity);\n                message.setStatus(ProcessTaskConstants.TASK_STATUS_PENDING);\n                createTaskAction.put(\"bizData\", JSON.toJSONString(message));\n                actionList.add(createTaskAction);\n                if (ProcessTaskConstants.TASK_STATUS_FINISH.equals(entity.getStatus())\n                        || ProcessTaskConstants.TASK_STATUS_INVALID.equals(entity.getStatus())) {\n                    Map<String, Object> endTaskAction = new HashMap<>();\n                    endTaskAction.put(\"type\", ProcessConstants.TXN_ACTION_MSG);\n                    endTaskAction.put(\"topic\", messageConfig.getOrDefault(\"topic\", taskStatusTopic));\n                    message = ProcessTaskDomainConverter.INSTANCE.convert2Msg(entity);\n                    endTaskAction.put(\"bizData\", JSON.toJSONString(message));\n                    actionList.add(endTaskAction);\n                }\n            }\n        }\n    }\n\n    private void addMessageOfTaskUpdate(ProcessTaskEntity entity, StdProcessContextDTO processContext,\n            List<Map<String, Object>> actionList) {\n        Map<String, Object> taskProperties = null;\n        StdProcessDTO process = processContext.getProcess();\n        if (process != null && process.getExtProperties() != null) {\n            taskProperties = (Map<String, Object>) process.getExtProperties().get(\"task\");\n        }\n        if (taskProperties != null && taskProperties.get(\"taskStatusMessage\") != null) {\n            Map<String, Object> messageConfig = (Map<String, Object>) taskProperties.get(\"taskStatusMessage\");\n            if (Boolean.TRUE.equals(messageConfig.get(\"enable\"))) {\n                Map<String, Object> createTaskAction = new HashMap<>();\n                createTaskAction.put(\"type\", ProcessConstants.TXN_ACTION_MSG);\n                createTaskAction.put(\"topic\", messageConfig.getOrDefault(\"topic\", taskStatusTopic));\n                ProcessTaskStatusMessage message = ProcessTaskDomainConverter.INSTANCE.convert2Msg(entity);\n                createTaskAction.put(\"bizData\", JSON.toJSONString(message));\n                actionList.add(createTaskAction);\n            }\n        }\n    }\n    \n    public TransactionTemplate getTransactionTemplate() {\n        return transactionTemplate;\n    }\n\n    public void setTransactionTemplate(TransactionTemplate transactionTemplate) {\n        this.transactionTemplate = transactionTemplate;\n    }\n\n    public MessageSendService getMessageSendService() {\n        return messageSendService;\n    }\n\n    public void setMessageSendService(MessageSendService messageSendService) {\n        this.messageSendService = messageSendService;\n    }\n\n    public String getTaskStatusTopic() {\n        return taskStatusTopic;\n    }\n\n    public void setTaskStatusTopic(String taskStatusTopic) {\n        this.taskStatusTopic = taskStatusTopic;\n    }\n\n    public String getEventPersistPolicy() {\n        return eventPersistPolicy;\n    }\n\n    public void setEventPersistPolicy(String eventPersistPolicy) {\n        this.eventPersistPolicy = eventPersistPolicy;\n    }\n\n    public String getNodeInstanceStatusTopic() {\n        return nodeInstanceStatusTopic;\n    }\n\n    public void setNodeInstanceStatusTopic(String nodeInstanceStatusTopic) {\n        this.nodeInstanceStatusTopic = nodeInstanceStatusTopic;\n    }\n\n    public ProcessScheduleDomainService getProcessScheduleDomainService() {\n        return processScheduleDomainService;\n    }\n\n    public void setProcessScheduleDomainService(ProcessScheduleDomainService processScheduleDomainService) {\n        this.processScheduleDomainService = processScheduleDomainService;\n    }\n\n    public ProcessTaskRepository getProcessTaskRepository() {\n        return processTaskRepository;\n    }\n\n    public void setProcessTaskRepository(ProcessTaskRepository processTaskRepository) {\n        this.processTaskRepository = processTaskRepository;\n    }\n\n    public ProcessInstanceDomainService getProcessInstanceDomainService() {\n        return processInstanceDomainService;\n    }\n\n    public void setProcessInstanceDomainService(ProcessInstanceDomainService processInstanceDomainService) {\n        this.processInstanceDomainService = processInstanceDomainService;\n    }\n\n    public ProcessRepository getProcessRepository() {\n        return processRepository;\n    }\n\n    public void setProcessRepository(ProcessRepository processRepository) {\n        this.processRepository = processRepository;\n    }\n\n    public ProcessDefinitionDomainService getProcessDefinitionDomainService() {\n        return processDefinitionDomainService;\n    }\n\n    public void setProcessDefinitionDomainService(ProcessDefinitionDomainService processDefinitionDomainService) {\n        this.processDefinitionDomainService = processDefinitionDomainService;\n    }\n\n    public String getCreatedDatePolicy() {\n        return createdDatePolicy;\n    }\n\n    public void setCreatedDatePolicy(String createdDatePolicy) {\n        this.createdDatePolicy = createdDatePolicy;\n    }\n\n    public FlowParser getFlowParser() {\n        return flowParser;\n    }\n\n    public void setFlowParser(FlowParser flowParser) {\n        this.flowParser = flowParser;\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/domain/service/ProcessToolDomainService.java",
    "content": "package com.jd.easyflow.process.domain.service;\n\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Set;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.transaction.support.TransactionTemplate;\n\nimport com.jd.easyflow.common.exception.UserException;\nimport com.jd.easyflow.common.util.AssertUtils;\nimport com.jd.easyflow.process.adapter.export.constant.ProcessInstanceConstants;\nimport com.jd.easyflow.process.domain.model.entity.ProcessInstanceEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessNodeInstanceEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessTaskAssignEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessTaskEntity;\nimport com.jd.easyflow.process.domain.model.vo.QueryProcessNodeReq;\nimport com.jd.easyflow.process.domain.model.vo.QueryTaskReqVO;\nimport com.jd.easyflow.process.domain.model.vo.RollbackNodeReqVO;\nimport com.jd.easyflow.process.domain.repository.ProcessRepository;\nimport com.jd.easyflow.process.domain.repository.ProcessTaskRepository;\n\n/**\n * @author liyuliang5\n */\npublic class ProcessToolDomainService {\n    \n    private static final Logger log = LoggerFactory.getLogger(ProcessToolDomainService.class);\n    \n    @Autowired\n    private ProcessRepository processRepository;\n    @Autowired\n    private ProcessTaskRepository processTaskRepository;\n    @Autowired\n    private ProcessInstanceDomainService processInstanceDomainService;\n    \n    private TransactionTemplate transactionTemplate;\n\n    public void rollbackNode(RollbackNodeReqVO req) {\n        String processInstanceNo = req.getProcessInstanceNo();\n        String targetNodeId = req.getTargetNodeId();\n        String targetNodeInstanceNo = req.getTargetNodeInstanceNo();\n        ProcessInstanceEntity processInstance = processRepository.getByProcessInstanceNo(processInstanceNo);\n        AssertUtils.TIPS.isNotNull(processInstance, \"instance \" + processInstanceNo + \" not exists\");\n        String lockProcessId = processInstanceDomainService.lockProcessInstance(processInstance.getProcessType(), processInstance.getBizNo());\n        try {\n            transactionTemplate.executeWithoutResult((status) -> {\n                // query\n                ProcessNodeInstanceEntity processNodeInstance = null;\n                if (targetNodeId != null) {\n                    QueryProcessNodeReq query = new QueryProcessNodeReq();\n                    query.setProcessInstanceNo(processInstanceNo);\n                    query.setNodeId(targetNodeId);\n                    List<ProcessNodeInstanceEntity> nodeInstances = processRepository.findNodeInstances(query);\n                    log.info(\"nodeInstances:\" + nodeInstances);\n                    if (nodeInstances.size() == 0) {\n                        throw new UserException(\"nodeId:\" + targetNodeId + \" not exists in process instance \" + processInstanceNo);\n                    } \n                    if (targetNodeInstanceNo == null) {\n                        if (nodeInstances.size() == 1) {\n                            processNodeInstance = nodeInstances.get(0);\n                        } else {\n                            throw new UserException(\"nodeId:\" + targetNodeId + \"  has more than one node instances, please set targetNodeInstanceNo. \" + nodeInstances);\n\n                        }\n                    } else {\n                       for (ProcessNodeInstanceEntity entity : nodeInstances) {\n                           if (entity.getNodeInstanceNo().equals(targetNodeInstanceNo)) {\n                               processNodeInstance = entity;\n                               break;\n                           }\n                       }\n                       if (processNodeInstance == null) {\n                           throw new UserException(\"nodeId:\" + targetNodeId + \"  has no targetNodeInstanceNo \" + targetNodeInstanceNo);\n                       }\n                    }\n                } else {\n                    processNodeInstance = processRepository.getByNodeInstanceNo(targetNodeInstanceNo);\n                    AssertUtils.TIPS.isNotNull(processNodeInstance, \"node instance \" + targetNodeInstanceNo + \" not exists\");\n                }\n                \n                log.info(\"start rollback processInstance:[\" + processInstance + \"], nodeInstance:[\" + processNodeInstance + \"]\");\n                // check\n                AssertUtils.isTrue(processInstanceNo.equals(processNodeInstance.getProcessInstanceNo()),\n                        \"process instance not same,\" + processNodeInstance.getProcessInstanceNo());\n                if (!ProcessInstanceConstants.NODE_STATUS_CLOSE.equals(processNodeInstance.getStatus())) {\n                    throw new UserException(\"Node instance status is not CLOSE, \" + processNodeInstance.getNodeInstanceNo());\n                }\n                if (ProcessInstanceConstants.STATUS_CANCELED.equals(processInstance.getStatus())) {\n                    throw new UserException(\"Process instance status is CANCELED, \" + processNodeInstance.getNodeInstanceNo());\n                }\n                \n                \n                \n                String nextNodeInstancesStr = processNodeInstance.getNextNodeInstances();\n                if (nextNodeInstancesStr != null && ! nextNodeInstancesStr.isEmpty()) {\n                    String[] nextNodeInstanceNos = nextNodeInstancesStr.split(\",\");\n                    for (String nextNodeInstanceNo : nextNodeInstanceNos) {\n                        rollbackNodeLink(nextNodeInstanceNo, processNodeInstance.getNodeInstanceNo(), req);\n                    }\n                }\n                \n                // update target node instance.\n                processNodeInstance.setNextNodeInstances(null);\n                processNodeInstance.setStatus(ProcessInstanceConstants.NODE_STATUS_ACTIVE);\n                log.info(\"process node instance \" + processNodeInstance.getNodeInstanceNo() + \" updated, [\" + processNodeInstance + \"]\");\n                processRepository.updateProcessNodeInstanceByNo(processNodeInstance);\n                // update process instance.\n                List<ProcessNodeInstanceEntity> processNodeInstances = processRepository.findOpenNodeInstances(processInstanceNo);\n                Set<String> currentNodeIds = new HashSet<>();\n                for (ProcessNodeInstanceEntity node : processNodeInstances) {\n                    currentNodeIds.add(node.getNodeInstanceNo());\n                }\n                ProcessInstanceEntity currentProcessInstance = processRepository.getByProcessInstanceNo(processInstanceNo);\n                currentProcessInstance.setStatus(ProcessInstanceConstants.STATUS_ACTIVE);\n                currentProcessInstance.setCurrentNodeIds(String.join(\",\", currentNodeIds));\n                log.info(\"process instance \" + processInstanceNo + \" updated,[\" + currentProcessInstance);\n                processRepository.updateProcessInstanceByNo(currentProcessInstance);\n            });\n        } finally {\n            processInstanceDomainService.unLockProcessInstance(processInstance.getProcessType(), processInstance.getBizNo(), lockProcessId);\n        }\n    }\n    \n    private void rollbackNodeLink(String nodeInstanceNo, String previousNodeInstanceNo, RollbackNodeReqVO req) {\n        ProcessNodeInstanceEntity processNodeInstance = processRepository\n                .getByNodeInstanceNo(nodeInstanceNo);\n        if (processNodeInstance == null) {\n            log.info(\"node:\" + nodeInstanceNo + \" not exists, may has been rollback\");\n            return;\n        }\n        log.info(\"start rollback node \" + processNodeInstance.getNodeId() + \":\"  + nodeInstanceNo + \"[\" + processNodeInstance + \"]\");\n        String nextNodeInstancesStr = processNodeInstance.getNextNodeInstances();\n        if (nextNodeInstancesStr != null && ! nextNodeInstancesStr.isEmpty()) {\n            String[] nextNodeInstanceNos = nextNodeInstancesStr.split(\",\");\n            for (String nextNodeInstanceNo : nextNodeInstanceNos) {\n                rollbackNodeLink(nextNodeInstanceNo, nodeInstanceNo, req);\n            }\n        }\n        log.info(\"start do rollback node \" + processNodeInstance.getNodeId() + \":\" + nodeInstanceNo);\n        // rollback node\n        String previousNodeInstanceNoStr = processNodeInstance.getPreviousNodeInstances();\n        if (previousNodeInstanceNoStr.equals(previousNodeInstanceNo)) {\n            log.info(\"node instance:\" + nodeInstanceNo + \" previous nodes is \" + previousNodeInstanceNo + \", DELETE node instance,[\" + processNodeInstance + \"]\");\n            deleteNodeInstance(req.getProcessInstanceNo(), nodeInstanceNo, req.isRollbackSubProcess(), req.isRollbackTask());\n        } else {\n            String[] previousNodeInstanceNos = previousNodeInstanceNoStr.split(\",\");\n            StringBuilder builder = new StringBuilder();\n            for (String nodeInstance : previousNodeInstanceNos) {\n                if (! nodeInstance.equals(previousNodeInstanceNo)) {\n                    builder.append(nodeInstance).append(\",\");\n                }\n            }\n            String newPreviousNodeInstanceNoStr = builder.substring(0, builder.length() - 1);\n            processNodeInstance.setPreviousNodeInstances(newPreviousNodeInstanceNoStr);\n            processNodeInstance.setStatus(ProcessInstanceConstants.NODE_STATUS_INACTIVE);\n            processNodeInstance.setNextNodeInstances(null);\n            log.info(\"node instance:\" + nodeInstanceNo + \" previousnodes is \" + previousNodeInstanceNoStr + \", remove \"\n                    + previousNodeInstanceNo + \", left:\" + newPreviousNodeInstanceNoStr + \", INVACTIVE node instance,[\" + processNodeInstance + \"]\");\n            processRepository.updateProcessNodeInstanceByNo(processNodeInstance);\n            deleteTaskByNodeInstanceNo(nodeInstanceNo);\n            deleteSubProcessInstanceByNodeInstanceNo(req.getProcessInstanceNo(), nodeInstanceNo, req.isRollbackSubProcess(), req.isRollbackTask());\n        }\n        log.info(\"end do rollback node \" + processNodeInstance.getNodeId() + \":\" + nodeInstanceNo);\n    }\n    \n    private void deleteTaskByNodeInstanceNo(String nodeInstanceNo) {\n        QueryTaskReqVO query = new QueryTaskReqVO();\n        query.setNodeInstanceNo(nodeInstanceNo);\n        List<ProcessTaskEntity> list = processTaskRepository.queryTask(query);\n        for (ProcessTaskEntity task : list) {\n            deleteOneTask(task.getTaskNo());\n        }\n    }\n    \n    private void deleteOneTask(String taskNo) {\n        log.info(\"delete task:\" + taskNo);\n        processTaskRepository.deleteTaskByTaskNo(taskNo);\n        List<ProcessTaskAssignEntity> assignList = processTaskRepository.findTaskAssignListByTaskNo(taskNo);\n        for (ProcessTaskAssignEntity assign: assignList) {\n            processTaskRepository.deleteTaskAssignByAssignNo(assign.getAssignNo());\n        }\n    }\n    \n    private void deleteSubProcessInstanceByNodeInstanceNo(String processInstanceNo, String nodeInstanceNo, boolean deleteSubProcess,\n            boolean deleteTask) {\n        List<ProcessInstanceEntity> processInstances = processRepository.queryProcessInstanceByParentNodeInstanceNo(processInstanceNo, nodeInstanceNo);\n        for (ProcessInstanceEntity processInstance : processInstances) {\n            deleteProcessInstance(processInstance.getInstanceNo(), deleteSubProcess, deleteTask);\n        }\n    }\n    \n    private void deleteProcessInstance(String processInstanceNo, boolean deleteSubProcess, boolean deleteTask) {\n        AssertUtils.isNotNull(processInstanceNo);\n        // delete nodes\n        QueryProcessNodeReq req = new QueryProcessNodeReq();\n        req.setProcessInstanceNo(processInstanceNo);\n        List<ProcessNodeInstanceEntity> nodeList = processRepository.findNodeInstances(req);\n        for (ProcessNodeInstanceEntity node : nodeList) {\n            deleteNodeInstance(processInstanceNo, node.getNodeInstanceNo(), deleteSubProcess, deleteTask);\n        }\n        // delete process\n        log.info(\"delete process instance:\" + processInstanceNo);\n        processRepository.deleteProcessInstanceByNo(processInstanceNo);\n    }\n    \n    private void deleteNodeInstance(String processInstanceNo, String nodeInstanceNo, boolean deleteSubProcess,\n            boolean deleteTask) {\n        if (deleteTask) {\n            // delete task\n            deleteTaskByNodeInstanceNo(nodeInstanceNo);\n        }\n        if (deleteSubProcess) {\n            // delete subflow\n            deleteSubProcessInstanceByNodeInstanceNo(processInstanceNo, nodeInstanceNo, deleteSubProcess, deleteTask);\n        }\n        // delete node\n        log.info(\"delete node instance:\" + nodeInstanceNo);\n        processRepository.deleteProcessNodeInstanceByNo(nodeInstanceNo);\n    }\n\n    public ProcessRepository getProcessRepository() {\n        return processRepository;\n    }\n\n    public void setProcessRepository(ProcessRepository processRepository) {\n        this.processRepository = processRepository;\n    }\n\n    public ProcessTaskRepository getProcessTaskRepository() {\n        return processTaskRepository;\n    }\n\n    public void setProcessTaskRepository(ProcessTaskRepository processTaskRepository) {\n        this.processTaskRepository = processTaskRepository;\n    }\n\n    public ProcessInstanceDomainService getProcessInstanceDomainService() {\n        return processInstanceDomainService;\n    }\n\n    public void setProcessInstanceDomainService(ProcessInstanceDomainService processInstanceDomainService) {\n        this.processInstanceDomainService = processInstanceDomainService;\n    }\n\n    public TransactionTemplate getTransactionTemplate() {\n        return transactionTemplate;\n    }\n\n    public void setTransactionTemplate(TransactionTemplate transactionTemplate) {\n        this.transactionTemplate = transactionTemplate;\n    }\n    \n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/domain/service/TaskOperateDomainService.java",
    "content": "package com.jd.easyflow.process.domain.service;\n\n/**\n * @author liyuliang5\n *\n */\npublic class TaskOperateDomainService {\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/domain/service/impl/ProcessScheduleSpiInvoker.java",
    "content": "package com.jd.easyflow.process.domain.service.impl;\n\nimport java.util.Map;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\n\nimport com.jd.easyflow.common.client.dto.ClientRequest;\nimport com.jd.easyflow.common.client.dto.ClientResponse;\nimport com.jd.easyflow.common.client.dto.ClientResponseCode;\nimport com.jd.easyflow.common.exception.UserException;\nimport com.jd.easyflow.objects.factory.ObjectFactorys;\nimport com.jd.easyflow.process.adapter.export.dto.definition.ProcessDTO;\nimport com.jd.easyflow.process.domain.model.entity.ProcessDefinitionEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessInstanceEntity;\nimport com.jd.easyflow.process.domain.model.vo.ScheduleProcessReqVO;\nimport com.jd.easyflow.process.domain.model.vo.ScheduleProcessResVO;\nimport com.jd.easyflow.process.domain.repository.ProcessRepository;\nimport com.jd.easyflow.process.domain.service.ProcessDefinitionDomainService;\nimport com.jd.easyflow.process.domain.service.ProcessScheduleInvoker;\nimport com.jd.easyflow.process.spi.client.ProcessScheduleClientService;\nimport com.jd.easyflow.process.spi.client.dto.ProcessExecuteReq;\nimport com.jd.easyflow.process.spi.client.dto.ProcessExecuteRes;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessScheduleSpiInvoker implements ProcessScheduleInvoker {\n    \n    private static final Logger log = LoggerFactory.getLogger(ProcessScheduleSpiInvoker.class);\n\n\n    @Autowired\n    private ProcessDefinitionDomainService processDefinitionDomainService;\n    @Autowired\n    private ProcessRepository processRepository;\n\n    @Override\n    public ScheduleProcessResVO invoke(ScheduleProcessReqVO vo) {\n        log.info(\"Start invoke by SPI, req:{}\", vo);\n        String runtimeService = getRuntimeService(vo);\n        log.info(\"Runtime Service:\" + runtimeService);\n        ProcessScheduleClientService processScheduleClientService = null;\n        if (runtimeService == null || runtimeService.isEmpty()) {\n            processScheduleClientService = ObjectFactorys.getDefault().getObject(ProcessScheduleClientService.class);\n        } else {\n            String[] serviceInfo = runtimeService.split(\":\");\n            String providerId = serviceInfo.length == 1 ? null : serviceInfo[0];\n            String serviceId = serviceInfo.length == 1 ? serviceInfo[0] : serviceInfo[1];\n            processScheduleClientService = ObjectFactorys.getDefault().getObject(ProcessScheduleClientService.class,\n                    providerId, serviceId);\n        }\n        ProcessExecuteReq req = new ProcessExecuteReq();\n        req.setProcessId(vo.getProcessId());\n        req.setNodeIds(vo.getNodeIds());\n        req.setParam(vo.getParam());\n        req.setDataMap(vo.getDataMap());\n        log.info(\"Invoke biz client request:\" + req);\n        ClientResponse<ProcessExecuteRes> clientResponse = processScheduleClientService.execute(new ClientRequest(req));\n        log.info(\"Invoke biz client response:\" + clientResponse);\n        if (!ClientResponseCode.SUCCESS.getCode().equals(clientResponse.getResCode())) {\n            log.error(\"Invoke biz client exception:\" + clientResponse);\n            UserException userException = new UserException(clientResponse.getResCode(), clientResponse.getResDesc());\n            if (clientResponse.getExt() != null) {\n                userException.setData(clientResponse.getExt().get(\"errorData\"));\n            }\n            throw userException;\n        }\n        log.info(\"End invoke by SPI\");\n        ScheduleProcessResVO res = new ScheduleProcessResVO();\n        ProcessExecuteRes executeRes = clientResponse.getData();\n        res.setProcessInstanceNo(executeRes == null ? null : executeRes.getProcessInstanceNo()); \n        res.setResult(executeRes == null ? null : executeRes.getResult()); \n        res.setDataMap(executeRes == null ? null : executeRes.getDataMap()); \n        return res;\n    }\n\n    /**\n     * \n     * @param vo\n     * @return\n     */\n    private String getRuntimeService(ScheduleProcessReqVO vo) {\n        String processId = vo.getProcessId();\n        if ((processId == null || processId.isEmpty()) && (vo.getProcessInstanceNo() != null && ! vo.getProcessInstanceNo().isEmpty())) {\n            ProcessInstanceEntity entity = processRepository.getByProcessInstanceNo(vo.getProcessInstanceNo());\n            processId = entity.getProcessDefId();\n        }\n\n        if (processId != null && ! processId.isEmpty()) {\n            ProcessDefinitionEntity entity = processDefinitionDomainService.getLatestProcessDefinition(processId);\n            String latestProcessId = processDefinitionDomainService.generateDefIdWithVersion(entity.getDefId(),\n                    entity.getDefVersion());\n            ProcessDTO process = processDefinitionDomainService.getProcessProperties(latestProcessId);\n            if (process != null && process.getProperties() != null) {\n                Map<String, Object> processProperties = (Map<String, Object>) process.getProperties().get(\"process\");\n                if (processProperties != null) {\n                    return (String) processProperties.get(\"runtimeService\");\n                }\n                return null;\n            }\n        }\n        return null;\n    }\n\n    public ProcessDefinitionDomainService getProcessDefinitionDomainService() {\n        return processDefinitionDomainService;\n    }\n\n    public void setProcessDefinitionDomainService(ProcessDefinitionDomainService processDefinitionDomainService) {\n        this.processDefinitionDomainService = processDefinitionDomainService;\n    }\n\n    public ProcessRepository getProcessRepository() {\n        return processRepository;\n    }\n\n    public void setProcessRepository(ProcessRepository processRepository) {\n        this.processRepository = processRepository;\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/infrastructure/converter/ProcessConverter.java",
    "content": "package com.jd.easyflow.process.infrastructure.converter;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport com.jd.easyflow.process.adapter.export.dto.instance.ProcessInstanceDTO;\nimport com.jd.easyflow.process.domain.model.entity.ProcessDefinitionEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessInstanceEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessNodeExecutionEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessNodeInstanceEntity;\nimport com.jd.easyflow.process.domain.model.vo.ProcessDefinitionForListVO;\nimport com.jd.easyflow.process.infrastructure.persistence.po.ProcessDefinition;\nimport com.jd.easyflow.process.infrastructure.persistence.po.ProcessInstance;\nimport com.jd.easyflow.process.infrastructure.persistence.po.ProcessNodeExecution;\nimport com.jd.easyflow.process.infrastructure.persistence.po.ProcessNodeInstance;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessConverter {\n\n    public static ProcessConverter INSTANCE = new ProcessConverter();\n\n    public ProcessInstanceEntity convert(ProcessInstance po) {\n        if ( po == null ) {\n            return null;\n        }\n\n        ProcessInstanceEntity processInstanceEntity = new ProcessInstanceEntity();\n\n        processInstanceEntity.setBizData( po.getBizData() );\n        processInstanceEntity.setBizNo( po.getBizNo() );\n        processInstanceEntity.setBizStatus( po.getBizStatus() );\n        processInstanceEntity.setCreatedDate( po.getCreatedDate() );\n        processInstanceEntity.setCreator( po.getCreator() );\n        processInstanceEntity.setCurrentNodeIds( po.getCurrentNodeIds() );\n        processInstanceEntity.setEndTime( po.getEndTime() );\n        processInstanceEntity.setExtData( po.getExtData() );\n        processInstanceEntity.setId( po.getId() );\n        processInstanceEntity.setInstanceName( po.getInstanceName() );\n        processInstanceEntity.setInstanceNo( po.getInstanceNo() );\n        processInstanceEntity.setKeyField( po.getKeyField() );\n        processInstanceEntity.setKeyField2( po.getKeyField2() );\n        processInstanceEntity.setModifiedDate( po.getModifiedDate() );\n        processInstanceEntity.setParentInstanceNo( po.getParentInstanceNo() );\n        processInstanceEntity.setParentNodeInstanceNo( po.getParentNodeInstanceNo() );\n        processInstanceEntity.setProcessDefId( po.getProcessDefId() );\n        processInstanceEntity.setProcessType( po.getProcessType() );\n        processInstanceEntity.setProductCode( po.getProductCode() );\n        processInstanceEntity.setStartTime( po.getStartTime() );\n        processInstanceEntity.setStatus( po.getStatus() );\n        processInstanceEntity.setVars( po.getVars() );\n\n        return processInstanceEntity;\n    }\n\n    public ProcessInstance convert(ProcessInstanceEntity entity) {\n        if ( entity == null ) {\n            return null;\n        }\n\n        ProcessInstance processInstance = new ProcessInstance();\n\n        processInstance.setBizData( entity.getBizData() );\n        processInstance.setBizNo( entity.getBizNo() );\n        processInstance.setBizStatus( entity.getBizStatus() );\n        processInstance.setCreatedDate( entity.getCreatedDate() );\n        processInstance.setCreator( entity.getCreator() );\n        processInstance.setCurrentNodeIds( entity.getCurrentNodeIds() );\n        processInstance.setEndTime( entity.getEndTime() );\n        processInstance.setExtData( entity.getExtData() );\n        processInstance.setId( entity.getId() );\n        processInstance.setInstanceName( entity.getInstanceName() );\n        processInstance.setInstanceNo( entity.getInstanceNo() );\n        processInstance.setKeyField( entity.getKeyField() );\n        processInstance.setKeyField2( entity.getKeyField2() );\n        processInstance.setModifiedDate( entity.getModifiedDate() );\n        processInstance.setParentInstanceNo( entity.getParentInstanceNo() );\n        processInstance.setParentNodeInstanceNo( entity.getParentNodeInstanceNo() );\n        processInstance.setProcessDefId( entity.getProcessDefId() );\n        processInstance.setProcessType( entity.getProcessType() );\n        processInstance.setProductCode( entity.getProductCode() );\n        processInstance.setStartTime( entity.getStartTime() );\n        processInstance.setStatus( entity.getStatus() );\n        processInstance.setVars( entity.getVars() );\n\n        return processInstance;\n    }\n\n    public ProcessNodeInstanceEntity convert(ProcessNodeInstance po) {\n        if ( po == null ) {\n            return null;\n        }\n\n        ProcessNodeInstanceEntity processNodeInstanceEntity = new ProcessNodeInstanceEntity();\n\n        processNodeInstanceEntity.setCreatedDate( po.getCreatedDate() );\n        processNodeInstanceEntity.setEndTime( po.getEndTime() );\n        processNodeInstanceEntity.setExecutors( po.getExecutors() );\n        processNodeInstanceEntity.setExtData( po.getExtData() );\n        processNodeInstanceEntity.setId( po.getId() );\n        processNodeInstanceEntity.setModifiedDate( po.getModifiedDate() );\n        processNodeInstanceEntity.setNextNodeInstances( po.getNextNodeInstances() );\n        processNodeInstanceEntity.setNodeId( po.getNodeId() );\n        processNodeInstanceEntity.setNodeInstanceNo( po.getNodeInstanceNo() );\n        processNodeInstanceEntity.setPreviousNodeInstances( po.getPreviousNodeInstances() );\n        processNodeInstanceEntity.setProcessDefId( po.getProcessDefId() );\n        processNodeInstanceEntity.setProcessInstanceNo( po.getProcessInstanceNo() );\n        processNodeInstanceEntity.setProductCode( po.getProductCode() );\n        processNodeInstanceEntity.setStartTime( po.getStartTime() );\n        processNodeInstanceEntity.setStatus( po.getStatus() );\n        processNodeInstanceEntity.setVars( po.getVars() );\n\n        return processNodeInstanceEntity;\n    }\n\n    public ProcessNodeInstance convert(ProcessNodeInstanceEntity entity) {\n        if ( entity == null ) {\n            return null;\n        }\n\n        ProcessNodeInstance processNodeInstance = new ProcessNodeInstance();\n\n        processNodeInstance.setCreatedDate( entity.getCreatedDate() );\n        processNodeInstance.setEndTime( entity.getEndTime() );\n        processNodeInstance.setExecutors( entity.getExecutors() );\n        processNodeInstance.setExtData( entity.getExtData() );\n        processNodeInstance.setId( entity.getId() );\n        processNodeInstance.setModifiedDate( entity.getModifiedDate() );\n        processNodeInstance.setNextNodeInstances( entity.getNextNodeInstances() );\n        processNodeInstance.setNodeId( entity.getNodeId() );\n        processNodeInstance.setNodeInstanceNo( entity.getNodeInstanceNo() );\n        processNodeInstance.setPreviousNodeInstances( entity.getPreviousNodeInstances() );\n        processNodeInstance.setProcessDefId( entity.getProcessDefId() );\n        processNodeInstance.setProcessInstanceNo( entity.getProcessInstanceNo() );\n        processNodeInstance.setProductCode( entity.getProductCode() );\n        processNodeInstance.setStartTime( entity.getStartTime() );\n        processNodeInstance.setStatus( entity.getStatus() );\n        processNodeInstance.setVars( entity.getVars() );\n\n        return processNodeInstance;\n    }\n\n    public ProcessNodeExecutionEntity convert(ProcessNodeExecution po) {\n        if ( po == null ) {\n            return null;\n        }\n\n        ProcessNodeExecutionEntity processNodeExecutionEntity = new ProcessNodeExecutionEntity();\n\n        processNodeExecutionEntity.setCreatedDate( po.getCreatedDate() );\n        processNodeExecutionEntity.setEndTime( po.getEndTime() );\n        processNodeExecutionEntity.setEventId( po.getEventId() );\n        processNodeExecutionEntity.setExecutor( po.getExecutor() );\n        processNodeExecutionEntity.setExtData( po.getExtData() );\n        processNodeExecutionEntity.setId( po.getId() );\n        processNodeExecutionEntity.setModifiedDate( po.getModifiedDate() );\n        processNodeExecutionEntity.setNextNodeInstances( po.getNextNodeInstances() );\n        processNodeExecutionEntity.setNodeExecutionNo( po.getNodeExecutionNo() );\n        processNodeExecutionEntity.setNodeId( po.getNodeId() );\n        processNodeExecutionEntity.setNodeInstanceNo( po.getNodeInstanceNo() );\n        processNodeExecutionEntity.setProcessDefId( po.getProcessDefId() );\n        processNodeExecutionEntity.setProductCode( po.getProductCode() );\n        processNodeExecutionEntity.setStartTime( po.getStartTime() );\n        processNodeExecutionEntity.setStatus( po.getStatus() );\n\n        return processNodeExecutionEntity;\n    }\n\n    public ProcessNodeExecution convert(ProcessNodeExecutionEntity entity) {\n        if ( entity == null ) {\n            return null;\n        }\n\n        ProcessNodeExecution processNodeExecution = new ProcessNodeExecution();\n\n        processNodeExecution.setCreatedDate( entity.getCreatedDate() );\n        processNodeExecution.setEndTime( entity.getEndTime() );\n        processNodeExecution.setEventId( entity.getEventId() );\n        processNodeExecution.setExecutor( entity.getExecutor() );\n        processNodeExecution.setExtData( entity.getExtData() );\n        processNodeExecution.setId( entity.getId() );\n        processNodeExecution.setModifiedDate( entity.getModifiedDate() );\n        processNodeExecution.setNextNodeInstances( entity.getNextNodeInstances() );\n        processNodeExecution.setNodeExecutionNo( entity.getNodeExecutionNo() );\n        processNodeExecution.setNodeId( entity.getNodeId() );\n        processNodeExecution.setNodeInstanceNo( entity.getNodeInstanceNo() );\n        processNodeExecution.setProcessDefId( entity.getProcessDefId() );\n        processNodeExecution.setProductCode( entity.getProductCode() );\n        processNodeExecution.setStartTime( entity.getStartTime() );\n        processNodeExecution.setStatus( entity.getStatus() );\n\n        return processNodeExecution;\n    }\n\n    public List<ProcessNodeInstanceEntity> convertToList(List<ProcessNodeInstance> po) {\n        if ( po == null ) {\n            return null;\n        }\n\n        List<ProcessNodeInstanceEntity> list = new ArrayList<ProcessNodeInstanceEntity>( po.size() );\n        for ( ProcessNodeInstance processNodeInstance : po ) {\n            list.add( convert( processNodeInstance ) );\n        }\n\n        return list;\n    }\n\n    public ProcessDefinition convert(ProcessDefinitionEntity entity) {\n        if ( entity == null ) {\n            return null;\n        }\n\n        ProcessDefinition processDefinition = new ProcessDefinition();\n\n        processDefinition.setBizType( entity.getBizType() );\n        processDefinition.setCategory( entity.getCategory() );\n        processDefinition.setContent( entity.getContent() );\n        processDefinition.setCreatedBy( entity.getCreatedBy() );\n        processDefinition.setCreatedDate( entity.getCreatedDate() );\n        processDefinition.setDefId( entity.getDefId() );\n        processDefinition.setDefSource( entity.getDefSource() );\n        processDefinition.setDefVersion( entity.getDefVersion() );\n        processDefinition.setExtData( entity.getExtData() );\n        processDefinition.setFormat( entity.getFormat() );\n        processDefinition.setId( entity.getId() );\n        processDefinition.setJsonContent( entity.getJsonContent() );\n        processDefinition.setLatest( entity.getLatest() );\n        processDefinition.setModifiedBy( entity.getModifiedBy() );\n        processDefinition.setModifiedDate( entity.getModifiedDate() );\n        processDefinition.setName( entity.getName() );\n\n        return processDefinition;\n    }\n\n    public ProcessDefinitionEntity convert(ProcessDefinition processDefinition) {\n        if ( processDefinition == null ) {\n            return null;\n        }\n\n        ProcessDefinitionEntity processDefinitionEntity = new ProcessDefinitionEntity();\n\n        processDefinitionEntity.setBizType( processDefinition.getBizType() );\n        processDefinitionEntity.setCategory( processDefinition.getCategory() );\n        processDefinitionEntity.setContent( processDefinition.getContent() );\n        processDefinitionEntity.setCreatedBy( processDefinition.getCreatedBy() );\n        processDefinitionEntity.setCreatedDate( processDefinition.getCreatedDate() );\n        processDefinitionEntity.setDefId( processDefinition.getDefId() );\n        processDefinitionEntity.setDefSource( processDefinition.getDefSource() );\n        processDefinitionEntity.setDefVersion( processDefinition.getDefVersion() );\n        processDefinitionEntity.setExtData( processDefinition.getExtData() );\n        processDefinitionEntity.setFormat( processDefinition.getFormat() );\n        processDefinitionEntity.setId( processDefinition.getId() );\n        processDefinitionEntity.setJsonContent( processDefinition.getJsonContent() );\n        processDefinitionEntity.setLatest( processDefinition.getLatest() );\n        processDefinitionEntity.setModifiedBy( processDefinition.getModifiedBy() );\n        processDefinitionEntity.setModifiedDate( processDefinition.getModifiedDate() );\n        processDefinitionEntity.setName( processDefinition.getName() );\n\n        return processDefinitionEntity;\n    }\n\n    public List<ProcessDefinitionForListVO> convertProcessDefinitionInfo(List<ProcessDefinition> processDefinitionList) {\n        if ( processDefinitionList == null ) {\n            return null;\n        }\n\n        List<ProcessDefinitionForListVO> list = new ArrayList<ProcessDefinitionForListVO>( processDefinitionList.size() );\n        for ( ProcessDefinition processDefinition : processDefinitionList ) {\n            list.add( processDefinitionToProcessDefinitionForListVO( processDefinition ) );\n        }\n\n        return list;\n    }\n\n    public List<ProcessInstanceEntity> convertProcessInstanceList(List<ProcessInstance> processInstanceList) {\n        if ( processInstanceList == null ) {\n            return null;\n        }\n\n        List<ProcessInstanceEntity> list = new ArrayList<ProcessInstanceEntity>( processInstanceList.size() );\n        for ( ProcessInstance processInstance : processInstanceList ) {\n            list.add( convert( processInstance ) );\n        }\n\n        return list;\n    }\n\n    public List<ProcessNodeInstanceEntity> convertProcessNodeInstanceList(List<ProcessNodeInstance> processNodeInstances) {\n        if ( processNodeInstances == null ) {\n            return null;\n        }\n\n        List<ProcessNodeInstanceEntity> list = new ArrayList<ProcessNodeInstanceEntity>( processNodeInstances.size() );\n        for ( ProcessNodeInstance processNodeInstance : processNodeInstances ) {\n            list.add( convert( processNodeInstance ) );\n        }\n\n        return list;\n    }\n\n    public List<ProcessNodeExecutionEntity> convertProcessNodeExecutionList(List<ProcessNodeExecution> processNodeExecutions) {\n        if ( processNodeExecutions == null ) {\n            return null;\n        }\n\n        List<ProcessNodeExecutionEntity> list = new ArrayList<ProcessNodeExecutionEntity>( processNodeExecutions.size() );\n        for ( ProcessNodeExecution processNodeExecution : processNodeExecutions ) {\n            list.add( convert( processNodeExecution ) );\n        }\n\n        return list;\n    }\n\n    public List<ProcessNodeInstanceEntity> convertNodeInstanceList(List<ProcessNodeInstance> processInstanceList) {\n        if ( processInstanceList == null ) {\n            return null;\n        }\n\n        List<ProcessNodeInstanceEntity> list = new ArrayList<ProcessNodeInstanceEntity>( processInstanceList.size() );\n        for ( ProcessNodeInstance processNodeInstance : processInstanceList ) {\n            list.add( convert( processNodeInstance ) );\n        }\n\n        return list;\n    }\n\n    protected ProcessDefinitionForListVO processDefinitionToProcessDefinitionForListVO(ProcessDefinition processDefinition) {\n        if ( processDefinition == null ) {\n            return null;\n        }\n\n        ProcessDefinitionForListVO processDefinitionForListVO = new ProcessDefinitionForListVO();\n\n        processDefinitionForListVO.setBizType( processDefinition.getBizType() );\n        processDefinitionForListVO.setCategory( processDefinition.getCategory() );\n        processDefinitionForListVO.setCreatedBy( processDefinition.getCreatedBy() );\n        processDefinitionForListVO.setCreatedDate( processDefinition.getCreatedDate() );\n        processDefinitionForListVO.setDefId( processDefinition.getDefId() );\n        processDefinitionForListVO.setDefSource( processDefinition.getDefSource() );\n        processDefinitionForListVO.setDefVersion( processDefinition.getDefVersion() );\n        processDefinitionForListVO.setFormat( processDefinition.getFormat() );\n        processDefinitionForListVO.setId( processDefinition.getId() );\n        processDefinitionForListVO.setLatest( processDefinition.getLatest() );\n        processDefinitionForListVO.setModifiedBy( processDefinition.getModifiedBy() );\n        processDefinitionForListVO.setModifiedDate( processDefinition.getModifiedDate() );\n        processDefinitionForListVO.setName( processDefinition.getName() );\n\n        return processDefinitionForListVO;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/infrastructure/converter/ProcessTaskConverter.java",
    "content": "package com.jd.easyflow.process.infrastructure.converter;\n\nimport java.text.SimpleDateFormat;\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport com.jd.easyflow.process.domain.model.entity.ProcessTaskAssignEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessTaskEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessTaskEventEntity;\nimport com.jd.easyflow.process.domain.model.vo.TaskInfoForPagerVO;\nimport com.jd.easyflow.process.infrastructure.persistence.po.ProcessTask;\nimport com.jd.easyflow.process.infrastructure.persistence.po.ProcessTaskAssign;\nimport com.jd.easyflow.process.infrastructure.persistence.po.ProcessTaskEvent;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessTaskConverter {\n\n    public static ProcessTaskConverter INSTANCE = new ProcessTaskConverter();\n    \n    public List<ProcessTaskEntity> convert(List<ProcessTask> list) {\n        if ( list == null ) {\n            return null;\n        }\n\n        List<ProcessTaskEntity> list1 = new ArrayList<ProcessTaskEntity>( list.size() );\n        for ( ProcessTask processTask : list ) {\n            list1.add( convert( processTask ) );\n        }\n\n        return list1;\n    }\n\n    public ProcessTask convert(ProcessTaskEntity entity) {\n        if ( entity == null ) {\n            return null;\n        }\n\n        ProcessTask processTask = new ProcessTask();\n\n        processTask.setAssignInfo( entity.getAssignInfo() );\n        processTask.setAssignTime( entity.getAssignTime() );\n        processTask.setAssignType( entity.getAssignType() );\n        processTask.setBizNo( entity.getBizNo() );\n        processTask.setCreatedDate( entity.getCreatedDate() );\n        processTask.setCreator( entity.getCreator() );\n        processTask.setExecuteBizData( entity.getExecuteBizData() );\n        processTask.setExecuteBizResult( entity.getExecuteBizResult() );\n        processTask.setExecuteTime( entity.getExecuteTime() );\n        processTask.setExecutor( entity.getExecutor() );\n        processTask.setExtData( entity.getExtData() );\n        processTask.setId( entity.getId() );\n        processTask.setModifiedDate( entity.getModifiedDate() );\n        processTask.setNodeExecutionNo( entity.getNodeExecutionNo() );\n        processTask.setNodeInstanceNo( entity.getNodeInstanceNo() );\n        processTask.setProcessInstanceKeyField( entity.getProcessInstanceKeyField() );\n        processTask.setProcessInstanceKeyField2( entity.getProcessInstanceKeyField2() );\n        processTask.setProcessInstanceNo( entity.getProcessInstanceNo() );\n        processTask.setProcessType( entity.getProcessType() );\n        processTask.setProductCode( entity.getProductCode() );\n        processTask.setStatus( entity.getStatus() );\n        processTask.setTaskBizCode( entity.getTaskBizCode() );\n        processTask.setTaskBizName( entity.getTaskBizName() );\n        processTask.setTaskNo( entity.getTaskNo() );\n        processTask.setTaskType( entity.getTaskType() );\n\n        return processTask;\n    }\n\n    public ProcessTaskEntity convert(ProcessTask entity) {\n        if ( entity == null ) {\n            return null;\n        }\n\n        ProcessTaskEntity processTaskEntity = new ProcessTaskEntity();\n\n        processTaskEntity.setAssignInfo( entity.getAssignInfo() );\n        processTaskEntity.setAssignTime( entity.getAssignTime() );\n        processTaskEntity.setAssignType( entity.getAssignType() );\n        processTaskEntity.setBizNo( entity.getBizNo() );\n        processTaskEntity.setCreatedDate( entity.getCreatedDate() );\n        processTaskEntity.setCreator( entity.getCreator() );\n        processTaskEntity.setExecuteBizData( entity.getExecuteBizData() );\n        processTaskEntity.setExecuteBizResult( entity.getExecuteBizResult() );\n        processTaskEntity.setExecuteTime( entity.getExecuteTime() );\n        processTaskEntity.setExecutor( entity.getExecutor() );\n        processTaskEntity.setExtData( entity.getExtData() );\n        processTaskEntity.setId( entity.getId() );\n        processTaskEntity.setModifiedDate( entity.getModifiedDate() );\n        processTaskEntity.setNodeExecutionNo( entity.getNodeExecutionNo() );\n        processTaskEntity.setNodeInstanceNo( entity.getNodeInstanceNo() );\n        processTaskEntity.setProcessInstanceKeyField( entity.getProcessInstanceKeyField() );\n        processTaskEntity.setProcessInstanceKeyField2( entity.getProcessInstanceKeyField2() );\n        processTaskEntity.setProcessInstanceNo( entity.getProcessInstanceNo() );\n        processTaskEntity.setProcessType( entity.getProcessType() );\n        processTaskEntity.setProductCode( entity.getProductCode() );\n        processTaskEntity.setStatus( entity.getStatus() );\n        processTaskEntity.setTaskBizCode( entity.getTaskBizCode() );\n        processTaskEntity.setTaskBizName( entity.getTaskBizName() );\n        processTaskEntity.setTaskNo( entity.getTaskNo() );\n        processTaskEntity.setTaskType( entity.getTaskType() );\n\n        return processTaskEntity;\n    }\n\n    public ProcessTaskAssign convert(ProcessTaskAssignEntity assignEntity) {\n        if ( assignEntity == null ) {\n            return null;\n        }\n\n        ProcessTaskAssign processTaskAssign = new ProcessTaskAssign();\n\n        processTaskAssign.setAssignGroup( assignEntity.getAssignGroup() );\n        processTaskAssign.setAssignGroup2( assignEntity.getAssignGroup2() );\n        processTaskAssign.setAssignNo( assignEntity.getAssignNo() );\n        processTaskAssign.setAssignTime( assignEntity.getAssignTime() );\n        processTaskAssign.setAssignType( assignEntity.getAssignType() );\n        processTaskAssign.setAssignUser( assignEntity.getAssignUser() );\n        processTaskAssign.setCreatedDate( assignEntity.getCreatedDate() );\n        processTaskAssign.setExtData( assignEntity.getExtData() );\n        processTaskAssign.setId( assignEntity.getId() );\n        processTaskAssign.setModifiedDate( assignEntity.getModifiedDate() );\n        processTaskAssign.setProductCode( assignEntity.getProductCode() );\n        processTaskAssign.setStatus( assignEntity.getStatus() );\n        processTaskAssign.setTaskNo( assignEntity.getTaskNo() );\n\n        return processTaskAssign;\n    }\n\n    public ProcessTaskAssignEntity convert(ProcessTaskAssign assign) {\n        if ( assign == null ) {\n            return null;\n        }\n\n        ProcessTaskAssignEntity processTaskAssignEntity = new ProcessTaskAssignEntity();\n\n        processTaskAssignEntity.setAssignGroup( assign.getAssignGroup() );\n        processTaskAssignEntity.setAssignGroup2( assign.getAssignGroup2() );\n        processTaskAssignEntity.setAssignNo( assign.getAssignNo() );\n        processTaskAssignEntity.setAssignTime( assign.getAssignTime() );\n        processTaskAssignEntity.setAssignType( assign.getAssignType() );\n        processTaskAssignEntity.setAssignUser( assign.getAssignUser() );\n        processTaskAssignEntity.setCreatedDate( assign.getCreatedDate() );\n        processTaskAssignEntity.setExtData( assign.getExtData() );\n        processTaskAssignEntity.setId( assign.getId() );\n        processTaskAssignEntity.setModifiedDate( assign.getModifiedDate() );\n        processTaskAssignEntity.setProductCode( assign.getProductCode() );\n        processTaskAssignEntity.setStatus( assign.getStatus() );\n        processTaskAssignEntity.setTaskNo( assign.getTaskNo() );\n\n        return processTaskAssignEntity;\n    }\n\n    public List<ProcessTaskAssign> convertAssignList(List<ProcessTaskAssignEntity> entityList) {\n        if ( entityList == null ) {\n            return null;\n        }\n\n        List<ProcessTaskAssign> list = new ArrayList<ProcessTaskAssign>( entityList.size() );\n        for ( ProcessTaskAssignEntity processTaskAssignEntity : entityList ) {\n            list.add( convert( processTaskAssignEntity ) );\n        }\n\n        return list;\n    }\n\n    public List<ProcessTaskAssignEntity> convertAssignPoList(List<ProcessTaskAssign> assignList) {\n        if ( assignList == null ) {\n            return null;\n        }\n\n        List<ProcessTaskAssignEntity> list = new ArrayList<ProcessTaskAssignEntity>( assignList.size() );\n        for ( ProcessTaskAssign processTaskAssign : assignList ) {\n            list.add( convert( processTaskAssign ) );\n        }\n\n        return list;\n    }\n\n    public ProcessTaskEvent convert(ProcessTaskEventEntity entity) {\n        if ( entity == null ) {\n            return null;\n        }\n\n        ProcessTaskEvent processTaskEvent = new ProcessTaskEvent();\n\n        processTaskEvent.setCreatedDate( entity.getCreatedDate() );\n        processTaskEvent.setEventBizData( entity.getEventBizData() );\n        processTaskEvent.setEventBizResult( entity.getEventBizResult() );\n        processTaskEvent.setEventNo( entity.getEventNo() );\n        processTaskEvent.setEventTime( entity.getEventTime() );\n        processTaskEvent.setEventType( entity.getEventType() );\n        processTaskEvent.setEventUser( entity.getEventUser() );\n        processTaskEvent.setExtData( entity.getExtData() );\n        processTaskEvent.setId( entity.getId() );\n        processTaskEvent.setInstanceBizData( entity.getInstanceBizData() );\n        processTaskEvent.setInstanceBizStatus( entity.getInstanceBizStatus() );\n        processTaskEvent.setModifiedDate( entity.getModifiedDate() );\n        processTaskEvent.setProductCode( entity.getProductCode() );\n        processTaskEvent.setTaskNo( entity.getTaskNo() );\n\n        return processTaskEvent;\n    }\n\n    public ProcessTaskEventEntity convert(ProcessTaskEvent event) {\n        if ( event == null ) {\n            return null;\n        }\n\n        ProcessTaskEventEntity processTaskEventEntity = new ProcessTaskEventEntity();\n\n        processTaskEventEntity.setCreatedDate( event.getCreatedDate() );\n        processTaskEventEntity.setEventBizData( event.getEventBizData() );\n        processTaskEventEntity.setEventBizResult( event.getEventBizResult() );\n        processTaskEventEntity.setEventNo( event.getEventNo() );\n        processTaskEventEntity.setEventTime( event.getEventTime() );\n        processTaskEventEntity.setEventType( event.getEventType() );\n        processTaskEventEntity.setEventUser( event.getEventUser() );\n        processTaskEventEntity.setExtData( event.getExtData() );\n        processTaskEventEntity.setId( event.getId() );\n        processTaskEventEntity.setInstanceBizData( event.getInstanceBizData() );\n        processTaskEventEntity.setInstanceBizStatus( event.getInstanceBizStatus() );\n        processTaskEventEntity.setModifiedDate( event.getModifiedDate() );\n        processTaskEventEntity.setProductCode( event.getProductCode() );\n        processTaskEventEntity.setTaskNo( event.getTaskNo() );\n\n        return processTaskEventEntity;\n    }\n\n    public List<ProcessTaskEvent> convertEventEntityList(List<ProcessTaskEventEntity> entityList) {\n        if ( entityList == null ) {\n            return null;\n        }\n\n        List<ProcessTaskEvent> list = new ArrayList<ProcessTaskEvent>( entityList.size() );\n        for ( ProcessTaskEventEntity processTaskEventEntity : entityList ) {\n            list.add( convert( processTaskEventEntity ) );\n        }\n\n        return list;\n    }\n\n    public List<ProcessTaskEventEntity> convertEventPoList(List<ProcessTaskEvent> eventList) {\n        if ( eventList == null ) {\n            return null;\n        }\n\n        List<ProcessTaskEventEntity> list = new ArrayList<ProcessTaskEventEntity>( eventList.size() );\n        for ( ProcessTaskEvent processTaskEvent : eventList ) {\n            list.add( convert( processTaskEvent ) );\n        }\n\n        return list;\n    }\n\n    public List<TaskInfoForPagerVO> convertPagerList(List<ProcessTask> list) {\n        if ( list == null ) {\n            return null;\n        }\n\n        List<TaskInfoForPagerVO> list1 = new ArrayList<TaskInfoForPagerVO>( list.size() );\n        for ( ProcessTask processTask : list ) {\n            list1.add( processTaskToTaskInfoForPagerVO( processTask ) );\n        }\n\n        return list1;\n    }\n\n    protected TaskInfoForPagerVO processTaskToTaskInfoForPagerVO(ProcessTask processTask) {\n        if ( processTask == null ) {\n            return null;\n        }\n\n        TaskInfoForPagerVO taskInfoForPagerVO = new TaskInfoForPagerVO();\n\n        taskInfoForPagerVO.setBizNo( processTask.getBizNo() );\n        if ( processTask.getCreatedDate() != null ) {\n            taskInfoForPagerVO.setCreatedDate( new SimpleDateFormat().format( processTask.getCreatedDate() ) );\n        }\n        taskInfoForPagerVO.setCreator( processTask.getCreator() );\n        taskInfoForPagerVO.setExecuteBizData( processTask.getExecuteBizData() );\n        taskInfoForPagerVO.setExecuteBizResult( processTask.getExecuteBizResult() );\n        if ( processTask.getExecuteTime() != null ) {\n            taskInfoForPagerVO.setExecuteTime( new SimpleDateFormat().format( processTask.getExecuteTime() ) );\n        }\n        taskInfoForPagerVO.setExecutor( processTask.getExecutor() );\n        if ( processTask.getModifiedDate() != null ) {\n            taskInfoForPagerVO.setModifiedDate( new SimpleDateFormat().format( processTask.getModifiedDate() ) );\n        }\n        taskInfoForPagerVO.setNodeInstanceNo( processTask.getNodeInstanceNo() );\n        taskInfoForPagerVO.setProcessInstanceNo( processTask.getProcessInstanceNo() );\n        taskInfoForPagerVO.setProcessType( processTask.getProcessType() );\n        taskInfoForPagerVO.setProductCode( processTask.getProductCode() );\n        taskInfoForPagerVO.setStatus( processTask.getStatus() );\n        taskInfoForPagerVO.setTaskBizCode( processTask.getTaskBizCode() );\n        taskInfoForPagerVO.setTaskBizName( processTask.getTaskBizName() );\n        taskInfoForPagerVO.setTaskNo( processTask.getTaskNo() );\n\n        return taskInfoForPagerVO;\n    }\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/infrastructure/persistence/mapper/ProcessDefinitionMapper.java",
    "content": "package com.jd.easyflow.process.infrastructure.persistence.mapper;\n\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Param;\n\nimport com.jd.easyflow.common.dto.pager.PagerCondition;\nimport com.jd.easyflow.process.infrastructure.persistence.po.ProcessDefinition;\nimport com.jd.easyflow.sharding.mybatis.ShardingNotSupportedMapper;\n\n/**\n * @author liyuliang5\n *\n */\n@ShardingNotSupportedMapper\npublic interface ProcessDefinitionMapper {\n\n\n    int insert(ProcessDefinition record);\n\n\n    ProcessDefinition selectByPrimaryKey(Long id);\n\n    ProcessDefinition selectByDefIdAndVersion(@Param(\"defId\") String defId, @Param(\"defVersion\")Integer defVersion);\n\n    int updateByPrimaryKeySelective(ProcessDefinition record);\n\n    int updateProcessDefinitionLatestStatus(long id);\n\n    long countProcessDefByPageCondition(PagerCondition pagerQueryReq);\n\n    List<ProcessDefinition> selectProcessDefByPageCondition(PagerCondition pagerQueryReq);\n\n    ProcessDefinition findLatestDefinition(String defId);\n\n    boolean existProcessDefinition(String defId);\n\n}"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/infrastructure/persistence/mapper/ProcessInstanceMapper.java",
    "content": "package com.jd.easyflow.process.infrastructure.persistence.mapper;\n\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Param;\n\nimport com.jd.easyflow.common.dto.pager.PagerCondition;\nimport com.jd.easyflow.process.infrastructure.persistence.po.ProcessInstance;\nimport com.jd.easyflow.sharding.mybatis.ShardingSupportedMapper;\n\n/**\n * @author liyuliang5\n *\n */\n@ShardingSupportedMapper\npublic interface ProcessInstanceMapper {\n    \n    int deleteByPrimaryKey(Long id);\n\n    int insert(ProcessInstance record);\n    \n    int insertWithCreatedDate(ProcessInstance record);\n\n    ProcessInstance selectByPrimaryKey(Long id);\n\n    int updateByPrimaryKeySelective(ProcessInstance record);\n\n    int updateByPrimaryKey(ProcessInstance record);\n    \n    int updateByProcessInstanceNo(ProcessInstance record);\n    \n    int deleteByProcessInstanceNo(String processInstanceNo);\n    \n    ProcessInstance getProcessInstanceByProcessTypeAndBizNo(@Param(\"processType\") String processType, @Param(\"bizNo\") String bizNo);\n    \n    ProcessInstance getActiveProcessInstanceByProcessTypeAndBizNo(@Param(\"processType\") String processType, @Param(\"bizNo\") String bizNo);\n    \n    ProcessInstance selectByInstanceNo(String instanceNo);\n\n    long countProcessInstanceByPagerCondition(PagerCondition pagerQueryReq);\n\n    List<ProcessInstance> selectProcessInstanceByPageCondition(PagerCondition pagerQueryReq);\n    List<ProcessInstance> queryProcessInstanceByInstanceNos(@Param(\"processInstanceNos\") List<String> processInstanceNos);\n    List<ProcessInstance> selectProcessInstanceByParentInstanceNo(String parentInstanceNo);\n    List<ProcessInstance> selectProcessInstanceByParentNodeInstanceNo(@Param(\"parentInstanceNo\") String parentInstanceNo, @Param(\"parentNodeInstanceNo\") String parentNodeInstanceNo);\n\n}"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/infrastructure/persistence/mapper/ProcessNodeExecutionMapper.java",
    "content": "package com.jd.easyflow.process.infrastructure.persistence.mapper;\n\nimport java.util.List;\n\nimport com.jd.easyflow.common.dto.pager.PagerCondition;\nimport com.jd.easyflow.process.infrastructure.persistence.po.ProcessNodeExecution;\nimport com.jd.easyflow.sharding.mybatis.ShardingSupportedMapper;\n\n/**\n * @author liyuliang5\n *\n */\n@ShardingSupportedMapper\npublic interface ProcessNodeExecutionMapper {\n    int deleteByPrimaryKey(Long id);\n\n    int insert(ProcessNodeExecution record);\n    \n    int insertWithCreatedDate(ProcessNodeExecution record);\n\n    ProcessNodeExecution selectByPrimaryKey(Long id);\n\n    int updateByPrimaryKeySelective(ProcessNodeExecution record);\n\n    int updateByPrimaryKey(ProcessNodeExecution record);\n    \n    int updateByProcessNodeExecutionNo(ProcessNodeExecution record);\n    \n    ProcessNodeExecution selectByNodeExecutionNo(String nodeExecutionNo);\n    \n    long countByPagerCondition(PagerCondition pagerQueryReq);\n\n    List<ProcessNodeExecution> selectByPageCondition(PagerCondition pagerQueryReq);\n\n}"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/infrastructure/persistence/mapper/ProcessNodeInstanceMapper.java",
    "content": "package com.jd.easyflow.process.infrastructure.persistence.mapper;\n\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Param;\n\nimport com.jd.easyflow.process.domain.model.vo.QueryProcessNodeReq;\nimport com.jd.easyflow.process.infrastructure.persistence.po.ProcessNodeInstance;\nimport com.jd.easyflow.sharding.mybatis.ShardingSupportedMapper;\n\n/**\n * @author liyuliang5\n *\n */\n@ShardingSupportedMapper\npublic interface ProcessNodeInstanceMapper {\n    int deleteByPrimaryKey(Long id);\n\n    int insert(ProcessNodeInstance record);\n    \n    int insertWithCreatedDate(ProcessNodeInstance record);\n\n    int updateByPrimaryKeySelective(ProcessNodeInstance record);\n\n    int updateByPrimaryKey(ProcessNodeInstance record);\n    \n    int updateByProcessNodeInstanceNo(ProcessNodeInstance record);\n    \n    int deleteByProcessNodeInstanceNo(String processNodeInstanceNo);\n    \n    ProcessNodeInstance selectByPrimaryKey(Long id);\n    \n    ProcessNodeInstance getOpenNodeInstance(@Param(\"processInstanceNo\") String processInstanceNo, @Param(\"nodeId\") String nodeId);\n    \n    List<ProcessNodeInstance> findNodeInstances(QueryProcessNodeReq queryReq);\n    \n    ProcessNodeInstance selectByNodeInstanceNo(String nodeInstanceNo);\n    \n    List<ProcessNodeInstance> findActiveNodeInstances(String processInstanceNo);\n    \n    List<ProcessNodeInstance> findOpenNodeInstances(String processInstanceNo);\n    \n    List<ProcessNodeInstance> queryNodeInstanceByNos(@Param(\"nodeInstanceNos\") List<String> nodeInstanceNos);\n\n}"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/infrastructure/persistence/mapper/ProcessTaskAssignMapper.java",
    "content": "package com.jd.easyflow.process.infrastructure.persistence.mapper;\n\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Param;\n\nimport com.jd.easyflow.process.domain.model.vo.QueryTaskAssignReqVO;\nimport com.jd.easyflow.process.infrastructure.persistence.po.ProcessTaskAssign;\nimport com.jd.easyflow.sharding.mybatis.ShardingSupportedMapper;\n\n/**\n * \n * @author liyuliang5\n *\n */\n@ShardingSupportedMapper\npublic interface ProcessTaskAssignMapper {\n    \n    int deleteByPrimaryKey(Long id);\n\n    int insert(ProcessTaskAssign record);\n    \n    int insertWithCreatedDate(ProcessTaskAssign record);\n\n    ProcessTaskAssign selectByPrimaryKey(Long id);\n    \n    List<ProcessTaskAssign> list(QueryTaskAssignReqVO vo);\n    \n    List<ProcessTaskAssign> listByTaskNoList(@Param(\"taskNoList\") List<String> taskNoList);\n\n    int updateByPrimaryKeySelective(ProcessTaskAssign record);\n\n    int updateByPrimaryKey(ProcessTaskAssign record);\n    \n    int updateByTaskAssignNo(ProcessTaskAssign record);\n    \n    int deleteTaskAssignByAssignNo(String assignNo);\n}"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/infrastructure/persistence/mapper/ProcessTaskEventMapper.java",
    "content": "package com.jd.easyflow.process.infrastructure.persistence.mapper;\n\nimport java.util.List;\n\nimport com.jd.easyflow.process.domain.model.vo.QueryTaskEventReqVO;\nimport com.jd.easyflow.process.infrastructure.persistence.po.ProcessTaskEvent;\nimport com.jd.easyflow.sharding.mybatis.ShardingSupportedMapper;\n\n/**\n * \n * @author liyuliang5\n *\n */\n@ShardingSupportedMapper\npublic interface ProcessTaskEventMapper {\n    \n    int deleteByPrimaryKey(Long id);\n\n    int insert(ProcessTaskEvent record);\n    \n    int insertWithCreatedDate(ProcessTaskEvent record);\n\n    ProcessTaskEvent selectByPrimaryKey(Long id);\n\n    int updateByPrimaryKeySelective(ProcessTaskEvent record);\n\n    int updateByPrimaryKey(ProcessTaskEvent record);\n    \n    int updateByTaskEventNo(ProcessTaskEvent record);\n    \n    List<ProcessTaskEvent> list(QueryTaskEventReqVO query);\n    \n}"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/infrastructure/persistence/mapper/ProcessTaskMapper.java",
    "content": "package com.jd.easyflow.process.infrastructure.persistence.mapper;\n\nimport java.util.List;\n\nimport com.jd.easyflow.common.dto.pager.PagerCondition;\nimport com.jd.easyflow.process.domain.model.vo.QueryTaskReqVO;\nimport com.jd.easyflow.process.infrastructure.persistence.po.ProcessTask;\nimport com.jd.easyflow.sharding.mybatis.ShardingSupportedMapper;\n\n/**\n * \n * @author liyuliang5\n *\n */\n@ShardingSupportedMapper\npublic interface ProcessTaskMapper {\n\n    int insert(ProcessTask record);\n    \n    int insertWithCreatedDate(ProcessTask record);\n\n    int updateByPrimaryKeySelective(ProcessTask record);\n\n    int updateByPrimaryKey(ProcessTask record);\n    \n    int updateByTaskNo(ProcessTask record);\n    \n    int deleteByPrimaryKey(Long id);\n    \n    int deleteByTaskNo(String taskNo);\n    \n    long countTaskAndAssignByPagerCondition(PagerCondition condition);\n    \n    List<ProcessTask> selectTaskAndAssignByPagerCondition(PagerCondition condition);\n    \n    long countTaskByPagerCondition(PagerCondition condition);\n    \n    List<ProcessTask> selectTaskByPagerCondition(PagerCondition condition);\n    \n    ProcessTask selectByPrimaryKey(Long id);\n    \n    List<ProcessTask> list(QueryTaskReqVO query);\n}"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/infrastructure/persistence/po/ProcessDefinition.java",
    "content": "package com.jd.easyflow.process.infrastructure.persistence.po;\n\nimport java.util.Date;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessDefinition {\n\n    private Long id;\n\n    private String defId;\n\n    private Integer defVersion;\n\n    private String name;\n\n    private String format;\n\n    private String bizType;\n\n    private String category;\n\n    private String jsonContent;\n\n    private Boolean latest;\n\n    private String defSource;\n\n    private String extData;\n\n    private Date createdDate;\n\n    private Date modifiedDate;\n\n    private boolean deleted;\n\n    private String content;\n\n    private String createdBy;\n\n    private String modifiedBy;\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getDefId() {\n        return defId;\n    }\n\n    public void setDefId(String defId) {\n        this.defId = defId;\n    }\n\n    public Integer getDefVersion() {\n        return defVersion;\n    }\n\n    public void setDefVersion(Integer defVersion) {\n        this.defVersion = defVersion;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getFormat() {\n        return format;\n    }\n\n    public void setFormat(String format) {\n        this.format = format;\n    }\n\n    public String getBizType() {\n        return bizType;\n    }\n\n    public void setBizType(String bizType) {\n        this.bizType = bizType;\n    }\n\n    public String getCategory() {\n        return category;\n    }\n\n    public void setCategory(String category) {\n        this.category = category;\n    }\n\n    public String getJsonContent() {\n        return jsonContent;\n    }\n\n    public void setJsonContent(String jsonContent) {\n        this.jsonContent = jsonContent;\n    }\n\n    public Boolean getLatest() {\n        return latest;\n    }\n\n    public void setLatest(Boolean latest) {\n        this.latest = latest;\n    }\n\n    public String getDefSource() {\n        return defSource;\n    }\n\n    public void setDefSource(String defSource) {\n        this.defSource = defSource;\n    }\n\n    public String getExtData() {\n        return extData;\n    }\n\n    public void setExtData(String extData) {\n        this.extData = extData;\n    }\n\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n\n    public boolean isDeleted() {\n        return deleted;\n    }\n\n    public void setDeleted(boolean deleted) {\n        this.deleted = deleted;\n    }\n\n    public String getContent() {\n        return content;\n    }\n\n    public void setContent(String content) {\n        this.content = content;\n    }\n\n    public String getCreatedBy() {\n        return createdBy;\n    }\n\n    public void setCreatedBy(String createdBy) {\n        this.createdBy = createdBy;\n    }\n\n    public String getModifiedBy() {\n        return modifiedBy;\n    }\n\n    public void setModifiedBy(String modifiedBy) {\n        this.modifiedBy = modifiedBy;\n    }\n\n    @Override\n    public String toString() {\n        return \"ProcessDefinition [id=\" + id + \", defId=\" + defId + \", defVersion=\" + defVersion + \", name=\" + name\n                + \", format=\" + format + \", bizType=\" + bizType + \", category=\" + category + \", jsonContent=\"\n                + jsonContent + \", latest=\" + latest + \", defSource=\" + defSource + \", extData=\" + extData\n                + \", createdDate=\" + createdDate + \", modifiedDate=\" + modifiedDate + \", deleted=\" + deleted\n                + \", content=\" + content + \", createdBy=\" + createdBy + \", modifiedBy=\" + modifiedBy + \"]\";\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/infrastructure/persistence/po/ProcessInstance.java",
    "content": "package com.jd.easyflow.process.infrastructure.persistence.po;\n\nimport java.util.Date;\n\n/**\n * @author liyuliang5\n * \n */\npublic class ProcessInstance {\n    \n    private Long id;\n\n    private String instanceNo;\n    \n    private String instanceName;\n\n    private String processType;\n\n    private String bizNo;\n\n    private String productCode;\n    \n    private String keyField;\n\n    private String keyField2;\n\n    private String creator;\n\n    private String processDefId;\n\n    private Date startTime;\n\n    private Date endTime;\n\n    private String status;\n\n    private String parentInstanceNo;\n    \n    private String parentNodeInstanceNo;\n    \n    private String currentNodeIds;\n    \n    private String bizStatus;\n    \n    private String bizData;\n\n    private String vars;\n\n    private String extData;\n\n    private Date createdDate;\n\n    private Date modifiedDate;\n\n    private boolean deleted;\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getInstanceNo() {\n        return instanceNo;\n    }\n\n    public void setInstanceNo(String instanceNo) {\n        this.instanceNo = instanceNo;\n    }\n\n    public String getProcessType() {\n        return processType;\n    }\n\n    public void setProcessType(String processType) {\n        this.processType = processType;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n\n    public String getCreator() {\n        return creator;\n    }\n\n    public void setCreator(String creator) {\n        this.creator = creator;\n    }\n\n    public String getProcessDefId() {\n        return processDefId;\n    }\n\n    public void setProcessDefId(String processDefId) {\n        this.processDefId = processDefId;\n    }\n\n    public Date getStartTime() {\n        return startTime;\n    }\n\n    public void setStartTime(Date startTime) {\n        this.startTime = startTime;\n    }\n\n    public Date getEndTime() {\n        return endTime;\n    }\n\n    public void setEndTime(Date endTime) {\n        this.endTime = endTime;\n    }\n\n    public String getStatus() {\n        return status;\n    }\n\n    public void setStatus(String status) {\n        this.status = status;\n    }\n\n    public String getParentNodeInstanceNo() {\n        return parentNodeInstanceNo;\n    }\n\n    public void setParentNodeInstanceNo(String parentNodeInstanceNo) {\n        this.parentNodeInstanceNo = parentNodeInstanceNo;\n    }\n\n    public String getVars() {\n        return vars;\n    }\n\n    public void setVars(String vars) {\n        this.vars = vars;\n    }\n\n    public String getExtData() {\n        return extData;\n    }\n\n    public void setExtData(String extData) {\n        this.extData = extData;\n    }\n\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n\n    public boolean isDeleted() {\n        return deleted;\n    }\n\n    public void setDeleted(boolean deleted) {\n        this.deleted = deleted;\n    }\n    \n\n    public String getParentInstanceNo() {\n        return parentInstanceNo;\n    }\n\n    public void setParentInstanceNo(String parentInstanceNo) {\n        this.parentInstanceNo = parentInstanceNo;\n    }\n\n    public String getCurrentNodeIds() {\n        return currentNodeIds;\n    }\n\n    public void setCurrentNodeIds(String currentNodeIds) {\n        this.currentNodeIds = currentNodeIds;\n    }\n    \n    public String getInstanceName() {\n        return instanceName;\n    }\n\n    public void setInstanceName(String instanceName) {\n        this.instanceName = instanceName;\n    }\n    \n    public String getBizStatus() {\n        return bizStatus;\n    }\n\n    public void setBizStatus(String bizStatus) {\n        this.bizStatus = bizStatus;\n    }\n\n    public String getBizData() {\n        return bizData;\n    }\n\n    public void setBizData(String bizData) {\n        this.bizData = bizData;\n    }\n    \n    public String getKeyField() {\n        return keyField;\n    }\n\n    public void setKeyField(String keyField) {\n        this.keyField = keyField;\n    }\n\n    public String getKeyField2() {\n        return keyField2;\n    }\n\n    public void setKeyField2(String keyField2) {\n        this.keyField2 = keyField2;\n    }\n\n    @Override\n    public String toString() {\n        StringBuilder sb = new StringBuilder();\n        sb.append(getClass().getSimpleName());\n        sb.append(\" [\");\n        sb.append(\"Hash = \").append(hashCode());\n        sb.append(\", id=\").append(id);\n        sb.append(\", instanceNo=\").append(instanceNo);\n        sb.append(\", instanceName=\").append(instanceName);\n        sb.append(\", processType=\").append(processType);\n        sb.append(\", bizNo=\").append(bizNo);\n        sb.append(\", productCode=\").append(productCode);\n        sb.append(\", keyField=\").append(keyField);\n        sb.append(\", keyField2=\").append(keyField2);\n        sb.append(\", creator=\").append(creator);\n        sb.append(\", processDefId=\").append(processDefId);\n        sb.append(\", startTime=\").append(startTime);\n        sb.append(\", endTime=\").append(endTime);\n        sb.append(\", status=\").append(status);\n        sb.append(\", parentInstanceNo=\").append(parentInstanceNo);\n        sb.append(\", parentNodeInstanceNo=\").append(parentNodeInstanceNo);\n        sb.append(\", currentNodeIds=\").append(currentNodeIds);\n        sb.append(\", bizStatus=\").append(bizStatus);\n        sb.append(\", bizData=\").append(bizData);\n        sb.append(\", vars=\").append(vars);\n        sb.append(\", extData=\").append(extData);\n        sb.append(\", createdDate=\").append(createdDate);\n        sb.append(\", modifiedDate=\").append(modifiedDate);\n        sb.append(\", deleted=\").append(deleted);\n        sb.append(\"]\");\n        return sb.toString();\n    }\n}"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/infrastructure/persistence/po/ProcessNodeExecution.java",
    "content": "package com.jd.easyflow.process.infrastructure.persistence.po;\n\nimport java.util.Date;\n\n/**\n * @author liyuliang5\n * \n */\npublic class ProcessNodeExecution {\n    \n    private Long id;\n\n    private String nodeExecutionNo;\n\n    private String nodeInstanceNo;\n\n    private String eventId;\n\n    private String processDefId;\n\n    private String nodeId;\n\n    private Date startTime;\n\n    private Date endTime;\n\n    private String status;\n\n    private String productCode;\n\n    private String executor;\n\n    private String nextNodeInstances;\n\n    private String extData;\n\n    private Date createdDate;\n\n    private Date modifiedDate;\n\n    private boolean deleted;\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getNodeExecutionNo() {\n        return nodeExecutionNo;\n    }\n\n    public void setNodeExecutionNo(String nodeExecutionNo) {\n        this.nodeExecutionNo = nodeExecutionNo;\n    }\n\n    public String getNodeInstanceNo() {\n        return nodeInstanceNo;\n    }\n\n    public void setNodeInstanceNo(String nodeInstanceNo) {\n        this.nodeInstanceNo = nodeInstanceNo;\n    }\n\n    public String getEventId() {\n        return eventId;\n    }\n\n    public void setEventId(String eventId) {\n        this.eventId = eventId;\n    }\n\n    public String getProcessDefId() {\n        return processDefId;\n    }\n\n    public void setProcessDefId(String processDefId) {\n        this.processDefId = processDefId;\n    }\n\n    public String getNodeId() {\n        return nodeId;\n    }\n\n    public void setNodeId(String nodeId) {\n        this.nodeId = nodeId;\n    }\n\n    public Date getStartTime() {\n        return startTime;\n    }\n\n    public void setStartTime(Date startTime) {\n        this.startTime = startTime;\n    }\n\n    public Date getEndTime() {\n        return endTime;\n    }\n\n    public void setEndTime(Date endTime) {\n        this.endTime = endTime;\n    }\n\n    public String getStatus() {\n        return status;\n    }\n\n    public void setStatus(String status) {\n        this.status = status;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n\n    public String getExecutor() {\n        return executor;\n    }\n\n    public void setExecutor(String executor) {\n        this.executor = executor;\n    }\n\n    public String getNextNodeInstances() {\n        return nextNodeInstances;\n    }\n\n    public void setNextNodeInstances(String nextNodeInstances) {\n        this.nextNodeInstances = nextNodeInstances;\n    }\n\n    public String getExtData() {\n        return extData;\n    }\n\n    public void setExtData(String extData) {\n        this.extData = extData;\n    }\n\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n\n    public boolean isDeleted() {\n        return deleted;\n    }\n\n    public void setDeleted(boolean deleted) {\n        this.deleted = deleted;\n    }\n\n    @Override\n    public String toString() {\n        StringBuilder sb = new StringBuilder();\n        sb.append(getClass().getSimpleName());\n        sb.append(\" [\");\n        sb.append(\"Hash = \").append(hashCode());\n        sb.append(\", id=\").append(id);\n        sb.append(\", nodeExecutionNo=\").append(nodeExecutionNo);\n        sb.append(\", nodeInstanceNo=\").append(nodeInstanceNo);\n        sb.append(\", eventId=\").append(eventId);\n        sb.append(\", processDefId=\").append(processDefId);\n        sb.append(\", nodeId=\").append(nodeId);\n        sb.append(\", startTime=\").append(startTime);\n        sb.append(\", endTime=\").append(endTime);\n        sb.append(\", status=\").append(status);\n        sb.append(\", productCode=\").append(productCode);\n        sb.append(\", executor=\").append(executor);\n        sb.append(\", nextNodeInstances=\").append(nextNodeInstances);\n        sb.append(\", extData=\").append(extData);\n        sb.append(\", createdDate=\").append(createdDate);\n        sb.append(\", modifiedDate=\").append(modifiedDate);\n        sb.append(\", deleted=\").append(deleted);\n        sb.append(\"]\");\n        return sb.toString();\n    }\n}"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/infrastructure/persistence/po/ProcessNodeInstance.java",
    "content": "package com.jd.easyflow.process.infrastructure.persistence.po;\n\nimport java.util.Date;\n\n/**\n * @author liyuliang5\n * \n */\npublic class ProcessNodeInstance {\n    \n    private Long id;\n\n    private String nodeInstanceNo;\n\n    private String processInstanceNo;\n\n    private String processDefId;\n\n    private String nodeId;\n\n    private Date startTime;\n\n    private Date endTime;\n\n    private String status;\n\n    private String productCode;\n\n    private String executors;\n    \n    private String previousNodeInstances;\n\n    private String nextNodeInstances;\n\n    private String vars;\n\n    private String extData;\n\n    private Date createdDate;\n\n    private Date modifiedDate;\n\n    private boolean deleted;\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getNodeInstanceNo() {\n        return nodeInstanceNo;\n    }\n\n    public void setNodeInstanceNo(String nodeInstanceNo) {\n        this.nodeInstanceNo = nodeInstanceNo;\n    }\n\n    public String getProcessInstanceNo() {\n        return processInstanceNo;\n    }\n\n    public void setProcessInstanceNo(String processInstanceNo) {\n        this.processInstanceNo = processInstanceNo;\n    }\n\n    public String getProcessDefId() {\n        return processDefId;\n    }\n\n    public void setProcessDefId(String processDefId) {\n        this.processDefId = processDefId;\n    }\n\n    public String getNodeId() {\n        return nodeId;\n    }\n\n    public void setNodeId(String nodeId) {\n        this.nodeId = nodeId;\n    }\n\n    public Date getStartTime() {\n        return startTime;\n    }\n\n    public void setStartTime(Date startTime) {\n        this.startTime = startTime;\n    }\n\n    public Date getEndTime() {\n        return endTime;\n    }\n\n    public void setEndTime(Date endTime) {\n        this.endTime = endTime;\n    }\n\n    public String getStatus() {\n        return status;\n    }\n\n    public void setStatus(String status) {\n        this.status = status;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n\n    public String getExecutors() {\n        return executors;\n    }\n\n    public void setExecutors(String executors) {\n        this.executors = executors;\n    }\n\n    public String getNextNodeInstances() {\n        return nextNodeInstances;\n    }\n\n    public void setNextNodeInstances(String nextNodeInstances) {\n        this.nextNodeInstances = nextNodeInstances;\n    }\n\n    public String getVars() {\n        return vars;\n    }\n\n    public void setVars(String vars) {\n        this.vars = vars;\n    }\n\n    public String getExtData() {\n        return extData;\n    }\n\n    public void setExtData(String extData) {\n        this.extData = extData;\n    }\n\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n\n    public boolean isDeleted() {\n        return deleted;\n    }\n\n    public void setDeleted(boolean deleted) {\n        this.deleted = deleted;\n    }\n    \n    \n\n    public String getPreviousNodeInstances() {\n        return previousNodeInstances;\n    }\n\n    public void setPreviousNodeInstances(String previousNodeInstances) {\n        this.previousNodeInstances = previousNodeInstances;\n    }\n\n    @Override\n    public String toString() {\n        StringBuilder sb = new StringBuilder();\n        sb.append(getClass().getSimpleName());\n        sb.append(\" [\");\n        sb.append(\"Hash = \").append(hashCode());\n        sb.append(\", id=\").append(id);\n        sb.append(\", nodeInstanceNo=\").append(nodeInstanceNo);\n        sb.append(\", processInstanceNo=\").append(processInstanceNo);\n        sb.append(\", processDefId=\").append(processDefId);\n        sb.append(\", nodeId=\").append(nodeId);\n        sb.append(\", startTime=\").append(startTime);\n        sb.append(\", endTime=\").append(endTime);\n        sb.append(\", status=\").append(status);\n        sb.append(\", productCode=\").append(productCode);\n        sb.append(\", executors=\").append(executors);\n        sb.append(\", previousNodeInstances=\").append(previousNodeInstances);\n        sb.append(\", nextNodeInstances=\").append(nextNodeInstances);\n        sb.append(\", vars=\").append(vars);\n        sb.append(\", extData=\").append(extData);\n        sb.append(\", createdDate=\").append(createdDate);\n        sb.append(\", modifiedDate=\").append(modifiedDate);\n        sb.append(\", deleted=\").append(deleted);\n        sb.append(\"]\");\n        return sb.toString();\n    }\n}"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/infrastructure/persistence/po/ProcessTask.java",
    "content": "package com.jd.easyflow.process.infrastructure.persistence.po;\n\nimport java.util.Date;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ProcessTask {\n    \n    private Long id;\n\n    private String taskNo;\n\n    private String processType;\n\n    private String bizNo;\n\n    private String taskBizCode;\n    \n    private String taskBizName;\n\n    private String taskType;\n\n    private String processInstanceNo;\n\n    private String nodeInstanceNo;\n\n    private String nodeExecutionNo;\n\n    private String assignType;\n\n    private String assignInfo;\n\n    private Date assignTime;\n\n    private String executor;\n\n    private String executeBizResult;\n\n    private String executeBizData;\n\n    private Date executeTime;\n\n    private String productCode;\n    \n    private String creator;\n\n    private String status;\n    \n    private String extData;\n\n    private Date createdDate;\n\n    private Date modifiedDate;\n\n    private boolean deleted;\n    \n    private String processInstanceKeyField;\n\n    private String processInstanceKeyField2;\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getTaskNo() {\n        return taskNo;\n    }\n\n    public void setTaskNo(String taskNo) {\n        this.taskNo = taskNo;\n    }\n\n    public String getProcessType() {\n        return processType;\n    }\n\n    public void setProcessType(String processType) {\n        this.processType = processType;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    public String getTaskBizCode() {\n        return taskBizCode;\n    }\n\n    public void setTaskBizCode(String taskBizCode) {\n        this.taskBizCode = taskBizCode;\n    }\n\n    public String getTaskBizName() {\n        return taskBizName;\n    }\n\n    public void setTaskBizName(String taskBizName) {\n        this.taskBizName = taskBizName;\n    }\n\n    public String getTaskType() {\n        return taskType;\n    }\n\n    public void setTaskType(String taskType) {\n        this.taskType = taskType;\n    }\n\n    public String getProcessInstanceNo() {\n        return processInstanceNo;\n    }\n\n    public void setProcessInstanceNo(String processInstanceNo) {\n        this.processInstanceNo = processInstanceNo;\n    }\n\n    public String getNodeInstanceNo() {\n        return nodeInstanceNo;\n    }\n\n    public void setNodeInstanceNo(String nodeInstanceNo) {\n        this.nodeInstanceNo = nodeInstanceNo;\n    }\n\n    public String getNodeExecutionNo() {\n        return nodeExecutionNo;\n    }\n\n    public void setNodeExecutionNo(String nodeExecutionNo) {\n        this.nodeExecutionNo = nodeExecutionNo;\n    }\n\n    public String getAssignType() {\n        return assignType;\n    }\n\n    public void setAssignType(String assignType) {\n        this.assignType = assignType;\n    }\n\n    public String getAssignInfo() {\n        return assignInfo;\n    }\n\n    public void setAssignInfo(String assignInfo) {\n        this.assignInfo = assignInfo;\n    }\n\n    public Date getAssignTime() {\n        return assignTime;\n    }\n\n    public void setAssignTime(Date assignTime) {\n        this.assignTime = assignTime;\n    }\n\n    public String getExecutor() {\n        return executor;\n    }\n\n    public void setExecutor(String executor) {\n        this.executor = executor;\n    }\n\n    public String getExecuteBizResult() {\n        return executeBizResult;\n    }\n\n    public void setExecuteBizResult(String executeBizResult) {\n        this.executeBizResult = executeBizResult;\n    }\n\n    public String getExecuteBizData() {\n        return executeBizData;\n    }\n\n    public void setExecuteBizData(String executeBizData) {\n        this.executeBizData = executeBizData;\n    }\n\n    public Date getExecuteTime() {\n        return executeTime;\n    }\n\n    public void setExecuteTime(Date executeTime) {\n        this.executeTime = executeTime;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n\n    public String getStatus() {\n        return status;\n    }\n\n    public void setStatus(String status) {\n        this.status = status;\n    }\n\n    public String getExtData() {\n        return extData;\n    }\n\n    public void setExtData(String extData) {\n        this.extData = extData;\n    }\n\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n\n    public boolean isDeleted() {\n        return deleted;\n    }\n\n    public void setDeleted(boolean deleted) {\n        this.deleted = deleted;\n    }\n    \n    \n    \n    public String getCreator() {\n        return creator;\n    }\n\n    public void setCreator(String creator) {\n        this.creator = creator;\n    }\n\n    public String getProcessInstanceKeyField() {\n        return processInstanceKeyField;\n    }\n\n    public void setProcessInstanceKeyField(String processInstanceKeyField) {\n        this.processInstanceKeyField = processInstanceKeyField;\n    }\n\n    public String getProcessInstanceKeyField2() {\n        return processInstanceKeyField2;\n    }\n\n    public void setProcessInstanceKeyField2(String processInstanceKeyField2) {\n        this.processInstanceKeyField2 = processInstanceKeyField2;\n    }\n\n    @Override\n    public String toString() {\n        StringBuilder sb = new StringBuilder();\n        sb.append(getClass().getSimpleName());\n        sb.append(\" [\");\n        sb.append(\"Hash = \").append(hashCode());\n        sb.append(\", id=\").append(id);\n        sb.append(\", taskNo=\").append(taskNo);\n        sb.append(\", processType=\").append(processType);\n        sb.append(\", bizNo=\").append(bizNo);\n        sb.append(\", taskBizCode=\").append(taskBizCode);\n        sb.append(\", taskBizName=\").append(taskBizName);\n        sb.append(\", taskType=\").append(taskType);\n        sb.append(\", processInstanceNo=\").append(processInstanceNo);\n        sb.append(\", nodeInstanceNo=\").append(nodeInstanceNo);\n        sb.append(\", nodeExecutionNo=\").append(nodeExecutionNo);\n        sb.append(\", assignType=\").append(assignType);\n        sb.append(\", assignInfo=\").append(assignInfo);\n        sb.append(\", assignTime=\").append(assignTime);\n        sb.append(\", executor=\").append(executor);\n        sb.append(\", executeBizResult=\").append(executeBizResult);\n        sb.append(\", executeBizData=\").append(executeBizData);\n        sb.append(\", executeTime=\").append(executeTime);\n        sb.append(\", productCode=\").append(productCode);\n        sb.append(\", creator=\").append(creator);\n        sb.append(\", status=\").append(status);\n        sb.append(\", extData=\").append(extData);\n        sb.append(\", createdDate=\").append(createdDate);\n        sb.append(\", modifiedDate=\").append(modifiedDate);\n        sb.append(\", deleted=\").append(deleted);\n        sb.append(\", processInstanceKeyField=\").append(processInstanceKeyField);\n        sb.append(\", processInstanceKeyField2=\").append(processInstanceKeyField2);\n        sb.append(\"]\");\n        return sb.toString();\n    }\n}"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/infrastructure/persistence/po/ProcessTaskAssign.java",
    "content": "package com.jd.easyflow.process.infrastructure.persistence.po;\n\nimport java.util.Date;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ProcessTaskAssign {\n    \n    private Long id;\n\n    private String assignNo;\n\n    private String taskNo;\n\n    private String assignType;\n\n    private String assignGroup;\n    \n    private String assignGroup2;\n\n    private String assignUser;\n\n    private String status;\n\n    private Date assignTime;\n\n    private String productCode;\n\n    private String extData;\n\n    private Date createdDate;\n\n    private Date modifiedDate;\n\n    private boolean deleted;\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getAssignNo() {\n        return assignNo;\n    }\n\n    public void setAssignNo(String assignNo) {\n        this.assignNo = assignNo;\n    }\n\n    public String getTaskNo() {\n        return taskNo;\n    }\n\n    public void setTaskNo(String taskNo) {\n        this.taskNo = taskNo;\n    }\n\n    public String getAssignType() {\n        return assignType;\n    }\n\n    public void setAssignType(String assignType) {\n        this.assignType = assignType;\n    }\n\n    public String getAssignGroup() {\n        return assignGroup;\n    }\n\n    public void setAssignGroup(String assignGroup) {\n        this.assignGroup = assignGroup;\n    }\n\n    public String getAssignUser() {\n        return assignUser;\n    }\n\n    public void setAssignUser(String assignUser) {\n        this.assignUser = assignUser;\n    }\n\n    public String getStatus() {\n        return status;\n    }\n\n    public void setStatus(String status) {\n        this.status = status;\n    }\n\n    public Date getAssignTime() {\n        return assignTime;\n    }\n\n    public void setAssignTime(Date assignTime) {\n        this.assignTime = assignTime;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n\n    public String getExtData() {\n        return extData;\n    }\n\n    public void setExtData(String extData) {\n        this.extData = extData;\n    }\n\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n\n    public boolean isDeleted() {\n        return deleted;\n    }\n\n    public void setDeleted(boolean deleted) {\n        this.deleted = deleted;\n    }\n    \n    public String getAssignGroup2() {\n        return assignGroup2;\n    }\n\n    public void setAssignGroup2(String assignGroup2) {\n        this.assignGroup2 = assignGroup2;\n    }\n\n    @Override\n    public String toString() {\n        StringBuilder sb = new StringBuilder();\n        sb.append(getClass().getSimpleName());\n        sb.append(\" [\");\n        sb.append(\"Hash = \").append(hashCode());\n        sb.append(\", id=\").append(id);\n        sb.append(\", assignNo=\").append(assignNo);\n        sb.append(\", taskNo=\").append(taskNo);\n        sb.append(\", assignType=\").append(assignType);\n        sb.append(\", assignGroup=\").append(assignGroup);\n        sb.append(\", assignGroup2=\").append(assignGroup2);\n        sb.append(\", assignUser=\").append(assignUser);\n        sb.append(\", status=\").append(status);\n        sb.append(\", assignTime=\").append(assignTime);\n        sb.append(\", productCode=\").append(productCode);\n        sb.append(\", extData=\").append(extData);\n        sb.append(\", createdDate=\").append(createdDate);\n        sb.append(\", modifiedDate=\").append(modifiedDate);\n        sb.append(\", deleted=\").append(deleted);\n        sb.append(\"]\");\n        return sb.toString();\n    }\n}"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/infrastructure/persistence/po/ProcessTaskEvent.java",
    "content": "package com.jd.easyflow.process.infrastructure.persistence.po;\n\nimport java.util.Date;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ProcessTaskEvent {\n    \n    private Long id;\n\n    private String eventNo;\n\n    private String taskNo;\n\n    private String eventType;\n\n    private String eventUser;\n\n    private Date eventTime;\n\n    private String eventBizResult;\n\n    private String eventBizData;\n    \n    private String instanceBizStatus;\n\n    private String instanceBizData;    \n\n    private String productCode;\n\n    private String extData;\n\n    private Date createdDate;\n\n    private Date modifiedDate;\n\n    private boolean deleted;\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getEventNo() {\n        return eventNo;\n    }\n\n    public void setEventNo(String eventNo) {\n        this.eventNo = eventNo;\n    }\n\n    public String getTaskNo() {\n        return taskNo;\n    }\n\n    public void setTaskNo(String taskNo) {\n        this.taskNo = taskNo;\n    }\n\n    public String getEventType() {\n        return eventType;\n    }\n\n    public void setEventType(String eventType) {\n        this.eventType = eventType;\n    }\n\n    public String getEventUser() {\n        return eventUser;\n    }\n\n    public void setEventUser(String eventUser) {\n        this.eventUser = eventUser;\n    }\n\n    public Date getEventTime() {\n        return eventTime;\n    }\n\n    public void setEventTime(Date eventTime) {\n        this.eventTime = eventTime;\n    }\n\n    public String getEventBizResult() {\n        return eventBizResult;\n    }\n\n    public void setEventBizResult(String eventBizResult) {\n        this.eventBizResult = eventBizResult;\n    }\n\n    public String getEventBizData() {\n        return eventBizData;\n    }\n\n    public void setEventBizData(String eventBizData) {\n        this.eventBizData = eventBizData;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n\n    public String getExtData() {\n        return extData;\n    }\n\n    public void setExtData(String extData) {\n        this.extData = extData;\n    }\n\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n\n    public boolean isDeleted() {\n        return deleted;\n    }\n\n    public void setDeleted(boolean deleted) {\n        this.deleted = deleted;\n    }\n    \n    \n\n    public String getInstanceBizStatus() {\n        return instanceBizStatus;\n    }\n\n    public void setInstanceBizStatus(String instanceBizStatus) {\n        this.instanceBizStatus = instanceBizStatus;\n    }\n\n    public String getInstanceBizData() {\n        return instanceBizData;\n    }\n\n    public void setInstanceBizData(String instanceBizData) {\n        this.instanceBizData = instanceBizData;\n    }\n\n    @Override\n    public String toString() {\n        StringBuilder sb = new StringBuilder();\n        sb.append(getClass().getSimpleName());\n        sb.append(\" [\");\n        sb.append(\"Hash = \").append(hashCode());\n        sb.append(\", id=\").append(id);\n        sb.append(\", eventNo=\").append(eventNo);\n        sb.append(\", taskNo=\").append(taskNo);\n        sb.append(\", eventType=\").append(eventType);\n        sb.append(\", eventUser=\").append(eventUser);\n        sb.append(\", eventTime=\").append(eventTime);\n        sb.append(\", eventBizResult=\").append(eventBizResult);\n        sb.append(\", eventBizData=\").append(eventBizData);\n        sb.append(\", instanceBizStatus=\").append(instanceBizStatus);\n        sb.append(\", instanceBizData=\").append(instanceBizData);        \n        sb.append(\", productCode=\").append(productCode);\n        sb.append(\", extData=\").append(extData);\n        sb.append(\", createdDate=\").append(createdDate);\n        sb.append(\", modifiedDate=\").append(modifiedDate);\n        sb.append(\", deleted=\").append(deleted);\n        sb.append(\"]\");\n        return sb.toString();\n    }\n}"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/infrastructure/repository/ProcessRepositoryImpl.java",
    "content": "package com.jd.easyflow.process.infrastructure.repository;\n\nimport java.util.List;\n\nimport org.springframework.beans.factory.annotation.Autowired;\n\nimport com.jd.easyflow.codegenerator.client.CodeGenerateHelper;\nimport com.jd.easyflow.common.dto.pager.PagerCondition;\nimport com.jd.easyflow.common.dto.pager.PagerResult;\nimport com.jd.easyflow.common.util.AssertUtils;\nimport com.jd.easyflow.process.domain.model.entity.ProcessDefinitionEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessInstanceEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessNodeExecutionEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessNodeInstanceEntity;\nimport com.jd.easyflow.process.domain.model.vo.ProcessDefinitionForListVO;\nimport com.jd.easyflow.process.domain.model.vo.QueryProcessNodeReq;\nimport com.jd.easyflow.process.domain.repository.ProcessRepository;\nimport com.jd.easyflow.process.infrastructure.converter.ProcessConverter;\nimport com.jd.easyflow.process.infrastructure.persistence.mapper.ProcessDefinitionMapper;\nimport com.jd.easyflow.process.infrastructure.persistence.mapper.ProcessInstanceMapper;\nimport com.jd.easyflow.process.infrastructure.persistence.mapper.ProcessNodeExecutionMapper;\nimport com.jd.easyflow.process.infrastructure.persistence.mapper.ProcessNodeInstanceMapper;\nimport com.jd.easyflow.process.infrastructure.persistence.po.ProcessDefinition;\nimport com.jd.easyflow.process.infrastructure.persistence.po.ProcessInstance;\nimport com.jd.easyflow.process.infrastructure.persistence.po.ProcessNodeExecution;\nimport com.jd.easyflow.process.infrastructure.persistence.po.ProcessNodeInstance;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessRepositoryImpl implements ProcessRepository {\n\n    @Autowired\n    private ProcessInstanceMapper processInstanceMapper;\n\n    @Autowired\n    private ProcessNodeInstanceMapper processNodeInstanceMapper;\n\n    @Autowired\n    private ProcessNodeExecutionMapper processNodeExecutionMapper;\n\n    @Autowired\n    private ProcessDefinitionMapper processDefinitionMapper;\n\n    private static final Integer MAX_QUERY_INSTANCENOS_NUM = 1000;\n    \n    protected boolean sharding = false;\n\n\n    /* ProcessInstance */\n\n    @Override\n    public void saveProcessInstance(ProcessInstanceEntity entity) {\n        if (sharding) {\n            String idStr = CodeGenerateHelper.generateCode(\"PROCESS-ID\", \"\");\n            entity.setId(Long.parseLong(idStr));\n        }\n        ProcessInstance instance = ProcessConverter.INSTANCE.convert(entity);\n        processInstanceMapper.insert(instance);\n        entity.setId(instance.getId());\n    }\n\n    @Override\n    public void saveProcessInstanceWithCreatedDate(ProcessInstanceEntity entity) {\n        if (sharding) {\n            String idStr = CodeGenerateHelper.generateCode(\"PROCESS-ID\", \"\");\n            entity.setId(Long.parseLong(idStr));\n        }\n        ProcessInstance instance = ProcessConverter.INSTANCE.convert(entity);\n        processInstanceMapper.insertWithCreatedDate(instance);\n        entity.setId(instance.getId());\n    }\n\n    @Override\n    public void saveProcessNodeInstanceWithCreatedDate(ProcessNodeInstanceEntity entity) {\n        if (sharding) {\n            String idStr = CodeGenerateHelper.generateCode(\"PROCESS-ID\", \"\");\n            entity.setId(Long.parseLong(idStr));\n        }\n        ProcessNodeInstance instance = ProcessConverter.INSTANCE.convert(entity);\n        processNodeInstanceMapper.insertWithCreatedDate(instance);\n        entity.setId(instance.getId());\n    }\n\n    @Override\n    public void updateProcessInstanceById(ProcessInstanceEntity entity) {\n        ProcessInstance instance = ProcessConverter.INSTANCE.convert(entity);\n        processInstanceMapper.updateByPrimaryKey(instance);\n    }\n\n    @Override\n    public void updateProcessInstanceByNo(ProcessInstanceEntity entity) {\n        ProcessInstance instance = ProcessConverter.INSTANCE.convert(entity);\n        processInstanceMapper.updateByProcessInstanceNo(instance);\n    }\n    \n    @Override\n    public void deleteProcessInstanceByNo(String processInstanceNo) {\n        processInstanceMapper.deleteByProcessInstanceNo(processInstanceNo);\n    }\n\n    @Override\n    public ProcessInstanceEntity getProcessInstanceByProcessTypeAndBizNo(String processType, String bizNo) {\n        ProcessInstance processInstance = processInstanceMapper.getProcessInstanceByProcessTypeAndBizNo(processType,\n                bizNo);\n        return ProcessConverter.INSTANCE.convert(processInstance);\n    }\n\n    @Override\n    public ProcessInstanceEntity getActiveProcessInstanceByProcessTypeAndBizNo(String processType, String bizNo) {\n        ProcessInstance processInstance = processInstanceMapper\n                .getActiveProcessInstanceByProcessTypeAndBizNo(processType, bizNo);\n        return ProcessConverter.INSTANCE.convert(processInstance);\n    }\n\n    @Override\n    public ProcessInstanceEntity getByProcessInstanceNo(String processInstanceNo) {\n        ProcessInstance instance = processInstanceMapper.selectByInstanceNo(processInstanceNo);\n        return ProcessConverter.INSTANCE.convert(instance);\n    }\n\n    @Override\n    public PagerResult<ProcessInstanceEntity> pageQueryProcessInstance(PagerCondition pagerQueryReq) {\n        PagerResult<ProcessInstanceEntity> result = new PagerResult<>();\n        if (pagerQueryReq.isCount()) {\n            long count = processInstanceMapper.countProcessInstanceByPagerCondition(pagerQueryReq);\n            result.setCount(count);\n        }\n        List<ProcessInstance> processInstances = processInstanceMapper\n                .selectProcessInstanceByPageCondition(pagerQueryReq);\n        result.setPageSize(pagerQueryReq.getPageSize());\n        result.setPageNum((int) pagerQueryReq.getPageIndex());\n        List<ProcessInstanceEntity> entityList = ProcessConverter.INSTANCE.convertProcessInstanceList(processInstances);\n        result.setList(entityList);\n        return result;\n    }\n\n    @Override\n    public List<ProcessInstanceEntity> queryProcessInstanceByInstanceNos(List<String> processInstanceNos) {\n        if (0 == processInstanceNos.size() || processInstanceNos.size() > MAX_QUERY_INSTANCENOS_NUM) {\n            throw new IllegalArgumentException(\n                    \"queryProcessInstanceByInstanceNos range is 1-\" + MAX_QUERY_INSTANCENOS_NUM + \"\");\n        }\n        List<ProcessInstance> processInstances = processInstanceMapper\n                .queryProcessInstanceByInstanceNos(processInstanceNos);\n        return ProcessConverter.INSTANCE.convertProcessInstanceList(processInstances);\n    }\n\n    @Override\n    public List<ProcessInstanceEntity> queryProcessInstanceByParentInstanceNo(String parentInstanceNo) {\n        List<ProcessInstance> processInstances = processInstanceMapper\n                .selectProcessInstanceByParentInstanceNo(parentInstanceNo);\n        return ProcessConverter.INSTANCE.convertProcessInstanceList(processInstances);\n    }\n    \n\n    @Override\n    public List<ProcessInstanceEntity> queryProcessInstanceByParentNodeInstanceNo(String parentInstanceNo,\n            String parentNodeInstanceNo) {\n        List<ProcessInstance> processInstances = processInstanceMapper\n                .selectProcessInstanceByParentNodeInstanceNo(parentInstanceNo, parentNodeInstanceNo);\n        return ProcessConverter.INSTANCE.convertProcessInstanceList(processInstances);\n    }\n\n\n    /* ProcessNodeInstance */\n\n    @Override\n    public void deleteProcessNodeInstanceByNo(String processNodeInstanceNo) {\n        processNodeInstanceMapper.deleteByProcessNodeInstanceNo(processNodeInstanceNo);\n    }\n\n    @Override\n    public ProcessNodeInstanceEntity getOpenNodeInstance(String processInstanceNo, String nodeId) {\n        ProcessNodeInstance instance = processNodeInstanceMapper.getOpenNodeInstance(processInstanceNo, nodeId);\n        return ProcessConverter.INSTANCE.convert(instance);\n    }\n\n    @Override\n    public List<ProcessNodeInstanceEntity> findNodeInstances(QueryProcessNodeReq queryReq) {\n        List<ProcessNodeInstance> instanceList = processNodeInstanceMapper.findNodeInstances(queryReq);\n        return ProcessConverter.INSTANCE.convertToList(instanceList);\n    }\n\n    @Override\n    public void saveProcessNodeInstance(ProcessNodeInstanceEntity entity) {\n        if (sharding) {\n            String idStr = CodeGenerateHelper.generateCode(\"PROCESS-ID\", \"\");\n            entity.setId(Long.parseLong(idStr));\n        }\n        ProcessNodeInstance instance = ProcessConverter.INSTANCE.convert(entity);\n        processNodeInstanceMapper.insert(instance);\n        entity.setId(instance.getId());\n    }\n\n    @Override\n    public void updateProcessNodeInstanceById(ProcessNodeInstanceEntity entity) {\n        ProcessNodeInstance instance = ProcessConverter.INSTANCE.convert(entity);\n        processNodeInstanceMapper.updateByPrimaryKey(instance);\n    }\n\n    @Override\n    public void updateProcessNodeInstanceByNo(ProcessNodeInstanceEntity entity) {\n        ProcessNodeInstance instance = ProcessConverter.INSTANCE.convert(entity);\n        processNodeInstanceMapper.updateByProcessNodeInstanceNo(instance);\n    }\n\n    @Override\n    public ProcessNodeInstanceEntity getByNodeInstanceNo(String nodeInstanceNo) {\n        ProcessNodeInstance instance = processNodeInstanceMapper.selectByNodeInstanceNo(nodeInstanceNo);\n        return ProcessConverter.INSTANCE.convert(instance);\n    }\n\n    @Override\n    public List<ProcessNodeInstanceEntity> findActiveNodeInstances(String processInstanceNo) {\n        List<ProcessNodeInstance> instances = processNodeInstanceMapper.findActiveNodeInstances(processInstanceNo);\n        return ProcessConverter.INSTANCE.convertToList(instances);\n    }\n\n    @Override\n    public List<ProcessNodeInstanceEntity> findOpenNodeInstances(String processInstanceNo) {\n        List<ProcessNodeInstance> instances = processNodeInstanceMapper.findOpenNodeInstances(processInstanceNo);\n        return ProcessConverter.INSTANCE.convertToList(instances);\n    }\n\n    @Override\n    public List<ProcessNodeInstanceEntity> queryNodeInstanceByNos(List<String> nodeInstanceNos) {\n        List<ProcessNodeInstance> processNodeInstances = processNodeInstanceMapper\n                .queryNodeInstanceByNos(nodeInstanceNos);\n        return ProcessConverter.INSTANCE.convertNodeInstanceList(processNodeInstances);\n    }\n\n    /* NodeExecution */\n\n    @Override\n    public void saveProcessNodeExecution(ProcessNodeExecutionEntity entity) {\n        if (sharding) {\n            String idStr = CodeGenerateHelper.generateCode(\"PROCESS-ID\", \"\");\n            entity.setId(Long.parseLong(idStr));\n        }\n        ProcessNodeExecution execution = ProcessConverter.INSTANCE.convert(entity);\n        processNodeExecutionMapper.insert(execution);\n        entity.setId(execution.getId());\n    }\n    \n    @Override\n    public PagerResult<ProcessNodeExecutionEntity> pagerQueryNodeExecution(PagerCondition pagerQueryReq) {\n        PagerResult<ProcessNodeExecutionEntity> result = new PagerResult<>();\n        if (Boolean.TRUE.equals(pagerQueryReq.isCount())) {\n            long count = processNodeExecutionMapper.countByPagerCondition(pagerQueryReq);\n            result.setCount(count);\n        }\n        List<ProcessNodeExecution> list = processNodeExecutionMapper.selectByPageCondition(pagerQueryReq);\n        result.setPageSize(pagerQueryReq.getPageSize());\n        result.setPageNum((int) pagerQueryReq.getPageIndex());\n        List<ProcessNodeExecutionEntity> entityList = ProcessConverter.INSTANCE.convertProcessNodeExecutionList(list);\n        result.setList(entityList);\n        return result;\n    }\n\n\n    @Override\n    public void updateProcessNodeExecutionById(ProcessNodeExecutionEntity entity) {\n        ProcessNodeExecution execution = ProcessConverter.INSTANCE.convert(entity);\n        processNodeExecutionMapper.updateByPrimaryKey(execution);\n\n    }\n\n    public void updateProcessNodeExecutionByNo(ProcessNodeExecutionEntity entity) {\n        ProcessNodeExecution execution = ProcessConverter.INSTANCE.convert(entity);\n        processNodeExecutionMapper.updateByProcessNodeExecutionNo(execution);\n\n    }\n\n    @Override\n    public void saveProcessNodeExecutionWithCreatedDate(ProcessNodeExecutionEntity entity) {\n        if (sharding) {\n            String idStr = CodeGenerateHelper.generateCode(\"PROCESS-ID\", \"\");\n            entity.setId(Long.parseLong(idStr));\n        }\n        ProcessNodeExecution execution = ProcessConverter.INSTANCE.convert(entity);\n        processNodeExecutionMapper.insertWithCreatedDate(execution);\n        entity.setId(execution.getId());\n    }\n\n    @Override\n    public ProcessNodeExecutionEntity getByNodeExecutionNo(String nodeExecutionNo) {\n        ProcessNodeExecution execution = processNodeExecutionMapper.selectByNodeExecutionNo(nodeExecutionNo);\n        return ProcessConverter.INSTANCE.convert(execution);\n    }\n\n    /* ProcessDefinition */\n\n    @Override\n    public void saveProcessDefinition(ProcessDefinitionEntity entity) {\n        ProcessDefinition processDefinition = ProcessConverter.INSTANCE.convert(entity);\n        processDefinitionMapper.insert(processDefinition);\n    }\n\n    @Override\n    public int updateProcessDefinitionLatestById(long id) {\n        return processDefinitionMapper.updateProcessDefinitionLatestStatus(id);\n    }\n\n    @Override\n    public int updateProcessDefinitionById(ProcessDefinitionEntity entity) {\n        ProcessDefinition processDefinition = ProcessConverter.INSTANCE.convert(entity);\n        return processDefinitionMapper.updateByPrimaryKeySelective(processDefinition);\n    }\n\n    @Override\n    public PagerResult<ProcessDefinitionForListVO> pageQueryProcessDefinition(PagerCondition pagerQueryReq) {\n        PagerResult<ProcessDefinitionForListVO> result = new PagerResult<>();\n        if (pagerQueryReq.isCount()) {\n            long count = processDefinitionMapper.countProcessDefByPageCondition(pagerQueryReq);\n            result.setCount(count);\n        }\n        List<ProcessDefinition> processDefinitionList = processDefinitionMapper\n                .selectProcessDefByPageCondition(pagerQueryReq);\n        result.setPageSize(pagerQueryReq.getPageSize());\n        result.setPageNum((int) pagerQueryReq.getPageIndex());\n        List<ProcessDefinitionForListVO> entityList = ProcessConverter.INSTANCE\n                .convertProcessDefinitionInfo(processDefinitionList);\n        result.setList(entityList);\n        return result;\n    }\n\n    @Override\n    public ProcessDefinitionEntity findProcessDefinitionByDefIdAndVersion(String defId, Integer defVersion) {\n        AssertUtils.isNotNull(defId);\n        ProcessDefinition processDefinition = processDefinitionMapper.selectByDefIdAndVersion(defId, defVersion);\n        return ProcessConverter.INSTANCE.convert(processDefinition);\n    }\n\n    @Override\n    public ProcessDefinitionEntity findLatestProcessDefinition(String defId) {\n        ProcessDefinition latestDefinition = processDefinitionMapper.findLatestDefinition(defId);\n        return ProcessConverter.INSTANCE.convert(latestDefinition);\n    }\n\n    @Override\n    public boolean existProcessDefinition(String defId) {\n        AssertUtils.isNotNull(defId);\n        return processDefinitionMapper.existProcessDefinition(defId);\n    }\n\n    public ProcessInstanceMapper getProcessInstanceMapper() {\n        return processInstanceMapper;\n    }\n\n    public void setProcessInstanceMapper(ProcessInstanceMapper processInstanceMapper) {\n        this.processInstanceMapper = processInstanceMapper;\n    }\n\n    public ProcessNodeInstanceMapper getProcessNodeInstanceMapper() {\n        return processNodeInstanceMapper;\n    }\n\n    public void setProcessNodeInstanceMapper(ProcessNodeInstanceMapper processNodeInstanceMapper) {\n        this.processNodeInstanceMapper = processNodeInstanceMapper;\n    }\n\n    public ProcessNodeExecutionMapper getProcessNodeExecutionMapper() {\n        return processNodeExecutionMapper;\n    }\n\n    public void setProcessNodeExecutionMapper(ProcessNodeExecutionMapper processNodeExecutionMapper) {\n        this.processNodeExecutionMapper = processNodeExecutionMapper;\n    }\n\n    public ProcessDefinitionMapper getProcessDefinitionMapper() {\n        return processDefinitionMapper;\n    }\n\n    public void setProcessDefinitionMapper(ProcessDefinitionMapper processDefinitionMapper) {\n        this.processDefinitionMapper = processDefinitionMapper;\n    }\n    \n    \n\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/infrastructure/repository/ProcessTaskRepositoryImpl.java",
    "content": "package com.jd.easyflow.process.infrastructure.repository;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Objects;\nimport java.util.stream.Collectors;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport com.jd.easyflow.codegenerator.client.CodeGenerateHelper;\nimport com.jd.easyflow.common.dto.pager.FieldEntry;\nimport com.jd.easyflow.common.dto.pager.PagerCondition;\nimport com.jd.easyflow.common.dto.pager.PagerResult;\nimport com.jd.easyflow.common.util.AssertUtils;\nimport com.jd.easyflow.process.domain.constant.ProcessConstants;\nimport com.jd.easyflow.process.domain.model.entity.ProcessTaskAssignEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessTaskEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessTaskEventEntity;\nimport com.jd.easyflow.process.domain.model.vo.QueryTaskAssignReqVO;\nimport com.jd.easyflow.process.domain.model.vo.QueryTaskEventReqVO;\nimport com.jd.easyflow.process.domain.model.vo.QueryTaskReqVO;\nimport com.jd.easyflow.process.domain.model.vo.TaskInfoForPagerVO;\nimport com.jd.easyflow.process.domain.repository.ProcessTaskRepository;\nimport com.jd.easyflow.process.infrastructure.converter.ProcessTaskConverter;\nimport com.jd.easyflow.process.infrastructure.persistence.mapper.ProcessTaskAssignMapper;\nimport com.jd.easyflow.process.infrastructure.persistence.mapper.ProcessTaskEventMapper;\nimport com.jd.easyflow.process.infrastructure.persistence.mapper.ProcessTaskMapper;\nimport com.jd.easyflow.process.infrastructure.persistence.po.ProcessTask;\nimport com.jd.easyflow.process.infrastructure.persistence.po.ProcessTaskAssign;\nimport com.jd.easyflow.process.infrastructure.persistence.po.ProcessTaskEvent;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessTaskRepositoryImpl implements ProcessTaskRepository {\n\n    @Autowired\n    private ProcessTaskMapper processTaskMapper;\n    @Autowired\n    private ProcessTaskAssignMapper processTaskAssignMapper;\n    @Autowired\n    private ProcessTaskEventMapper processTaskEventMapper;\n    \n    private boolean sharding = false;\n\n    @Override\n    public List<ProcessTaskEntity> queryTask(QueryTaskReqVO query) {\n        List<ProcessTask> list = processTaskMapper.list(query);\n        return ProcessTaskConverter.INSTANCE.convert(list);\n    }\n\n    @Transactional(transactionManager = ProcessConstants.BEAN_TX_MANAGER)\n    @Override\n    public void saveOrUpdate(ProcessTaskEntity taskEntity, List<ProcessTaskEventEntity> eventEntityList,\n            List<ProcessTaskAssignEntity> assignEntityList) {\n        if (taskEntity != null) {\n            ProcessTask processTask = ProcessTaskConverter.INSTANCE.convert(taskEntity);\n            if (processTask.getId() == null) {\n                if (sharding) {\n                    String idStr = CodeGenerateHelper.generateCode(\"PROCESS-ID\", \"\");\n                    processTask.setId(Long.parseLong(idStr));\n                }\n                processTaskMapper.insert(processTask);\n                taskEntity.setId(processTask.getId());\n            } else {\n                processTaskMapper.updateByPrimaryKey(processTask);\n            }\n        }\n\n        if (assignEntityList != null) {\n            for (ProcessTaskAssignEntity assignEntity : assignEntityList) {\n                ProcessTaskAssign assign = ProcessTaskConverter.INSTANCE.convert(assignEntity);\n                if (assign.getId() == null) {\n                    if (sharding) {\n                        String idStr = CodeGenerateHelper.generateCode(\"PROCESS-ID\", \"\");\n                        assign.setId(Long.parseLong(idStr));\n                    }\n                    processTaskAssignMapper.insert(assign);\n                    assignEntity.setId(assign.getId());\n                } else {\n                    processTaskAssignMapper.updateByPrimaryKey(assign);\n                }\n            }\n        }\n\n        if (eventEntityList != null) {\n            for (ProcessTaskEventEntity eventEntity : eventEntityList) {\n                ProcessTaskEvent event = ProcessTaskConverter.INSTANCE.convert(eventEntity);\n                if (event.getId() == null) {\n                    if (sharding) {\n                        String idStr = CodeGenerateHelper.generateCode(\"PROCESS-ID\", \"\");\n                        event.setId(Long.parseLong(idStr));\n                    }\n                    processTaskEventMapper.insert(event);\n                    eventEntity.setId(event.getId());\n                } else {\n                    processTaskEventMapper.updateByPrimaryKey(event);\n                }\n            }\n        }\n\n    }\n\n    @Override\n    public ProcessTaskEntity getTask(String taskNo) {\n        QueryTaskReqVO query = new QueryTaskReqVO();\n        query.setTaskNo(taskNo);\n        List<ProcessTask> list = processTaskMapper.list(query);\n        if (list.size() == 0) {\n            return null;\n        }\n        if (list.size() > 1) {\n            throw new IllegalStateException(\"result size > 1, list:\" + list);\n        }\n        return ProcessTaskConverter.INSTANCE.convert(list.get(0));\n    }\n\n    @Override\n    public List<ProcessTaskAssignEntity> findTaskAssignListByTaskNo(String taskNo) {\n        AssertUtils.isNotNull(taskNo, \"Task no can not be null\");\n        QueryTaskAssignReqVO query = new QueryTaskAssignReqVO();\n        query.setTaskNo(taskNo);\n        List<ProcessTaskAssign> list = processTaskAssignMapper.list(query);\n        return ProcessTaskConverter.INSTANCE.convertAssignPoList(list);\n    }\n\n    /**\n     * Pager query process task. condition:\n     * taskNo, processType, bizNo, productCode, executor\n     * createdDateStart, createdDateEnd, taskStatus\n     * assignUser, assignGroupList:, assignGroup2List,\n     * assignStatus\n     * \n     */\n    @Override\n    public PagerResult<TaskInfoForPagerVO> pagerQueryTask(PagerCondition condition) {\n        FieldEntry assignUserEntry = condition.getField(\"assignUser\");\n        FieldEntry assignGroupListEntry = condition.getField(\"assignGroupList\");\n        FieldEntry assignGroup2ListEntry = condition.getField(\"assignGroup2List\");\n        Long count = null;\n        List<ProcessTask> list = null;\n        if (assignUserEntry == null && assignGroupListEntry == null && assignGroup2ListEntry == null) {\n            if (condition.isCount()) {\n                count = processTaskMapper.countTaskByPagerCondition(condition);\n            }\n            list = processTaskMapper.selectTaskByPagerCondition(condition);\n        } else {\n            if (condition.isCount()) {\n                count = processTaskMapper.countTaskAndAssignByPagerCondition(condition);\n            }\n            List<ProcessTask> taskNoList = processTaskMapper.selectTaskAndAssignByPagerCondition(condition);\n            if (taskNoList.size() == 0) {\n                list = new ArrayList<>();\n            } else {\n                PagerCondition taskCondition = new PagerCondition(1, taskNoList.size());\n                taskCondition.addField(new FieldEntry(\"taskNoList\", taskNoList.stream().map(task -> task.getTaskNo()).collect(Collectors.toList())));\n                List<ProcessTask> noOrderList = processTaskMapper.selectTaskByPagerCondition(taskCondition);\n                list = new ArrayList<>();\n                for (ProcessTask taskNo : taskNoList) {\n                    for (ProcessTask task : noOrderList) {\n                        if (Objects.equals(taskNo.getTaskNo(), task.getTaskNo())) {\n                            list.add(task);\n                            break;\n                        }\n                    }\n                }\n\n            }\n        }\n        List<TaskInfoForPagerVO> voList = ProcessTaskConverter.INSTANCE.convertPagerList(list);\n        return new PagerResult<>(count, voList);\n    }\n\n    @Override\n    public List<ProcessTaskAssignEntity> findTaskAssignListByTaskNoList(List<String> taskNoList) {\n        List<ProcessTaskAssign> assignList = processTaskAssignMapper.listByTaskNoList(taskNoList);\n        return ProcessTaskConverter.INSTANCE.convertAssignPoList(assignList);\n    }\n\n    @Override\n    public void save(ProcessTaskEntity taskEntity) {\n        if (sharding) {\n            String idStr = CodeGenerateHelper.generateCode(\"PROCESS-ID\", \"\");\n            taskEntity.setId(Long.parseLong(idStr));\n        }\n        ProcessTask processTask = ProcessTaskConverter.INSTANCE.convert(taskEntity);\n        processTaskMapper.insert(processTask);\n        taskEntity.setId(processTask.getId());\n\n    }\n\n    @Override\n    public void updateById(ProcessTaskEntity taskEntity) {\n        ProcessTask processTask = ProcessTaskConverter.INSTANCE.convert(taskEntity);\n        processTaskMapper.updateByPrimaryKey(processTask);\n    }\n    \n    @Override\n    public void updateByTaskNo(ProcessTaskEntity taskEntity) {\n        ProcessTask processTask = ProcessTaskConverter.INSTANCE.convert(taskEntity);\n        processTaskMapper.updateByTaskNo(processTask);\n    }\n\n    @Override\n    public void save(ProcessTaskAssignEntity assignEntity) {\n        if (sharding) {\n            String idStr = CodeGenerateHelper.generateCode(\"PROCESS-ID\", \"\");\n            assignEntity.setId(Long.parseLong(idStr));\n        }\n        ProcessTaskAssign assign = ProcessTaskConverter.INSTANCE.convert(assignEntity);\n        processTaskAssignMapper.insert(assign);\n        assignEntity.setId(assign.getId());\n    }\n\n    @Override\n    public void updateById(ProcessTaskAssignEntity assignEntity) {\n        ProcessTaskAssign assign = ProcessTaskConverter.INSTANCE.convert(assignEntity);\n        processTaskAssignMapper.updateByPrimaryKey(assign);\n    }\n    \n    @Override\n    public void updateByTaskAssignNo(ProcessTaskAssignEntity assignEntity) {\n        ProcessTaskAssign assign = ProcessTaskConverter.INSTANCE.convert(assignEntity);\n        processTaskAssignMapper.updateByTaskAssignNo(assign);\n    }\n\n    @Override\n    public void save(ProcessTaskEventEntity eventEntity) {\n        if (sharding) {\n            String idStr = CodeGenerateHelper.generateCode(\"PROCESS-ID\", \"\");\n            eventEntity.setId(Long.parseLong(idStr));\n        }\n        ProcessTaskEvent event = ProcessTaskConverter.INSTANCE.convert(eventEntity);\n        processTaskEventMapper.insert(event);\n        eventEntity.setId(event.getId());\n    }\n    \n    @Override\n    public void deleteTaskByTaskNo(String taskNo) {\n        processTaskMapper.deleteByTaskNo(taskNo);\n    }\n    \n    @Override\n    public void deleteTaskAssignByAssignNo(String assignNo) {\n        processTaskAssignMapper.deleteTaskAssignByAssignNo(assignNo);\n    }\n\n    @Override\n    public ProcessTaskAssignEntity getTaskAssign(String taskAssignNo) {\n        QueryTaskAssignReqVO req = new QueryTaskAssignReqVO();\n        req.setAssignNo(taskAssignNo);\n        List<ProcessTaskAssign> list = processTaskAssignMapper.list(req);\n        if (list.size() == 0) {\n            return null;\n        }\n        if (list.size() > 1) {\n            throw new IllegalStateException(\"result size > 1, list:\" + list);\n        }\n        return ProcessTaskConverter.INSTANCE.convert(list.get(0));\n    }\n\n    @Override\n    public ProcessTaskEventEntity getTaskEvent(String taskEventNo) {\n        QueryTaskEventReqVO req = new QueryTaskEventReqVO();\n        req.setEventNo(taskEventNo);\n        List<ProcessTaskEvent> list = processTaskEventMapper.list(req);\n        if (list.size() == 0) {\n            return null;\n        }\n        if (list.size() > 1) {\n            throw new IllegalStateException(\"result size > 1, list:\" + list);\n        }\n        return ProcessTaskConverter.INSTANCE.convert(list.get(0));\n    }\n\n    @Override\n    public void updateById(ProcessTaskEventEntity eventEntity) {\n        ProcessTaskEvent processTaskEvent = ProcessTaskConverter.INSTANCE.convert(eventEntity);\n        processTaskEventMapper.updateByPrimaryKey(processTaskEvent);\n    }\n    \n    @Override\n    public void updateByTaskEventNo(ProcessTaskEventEntity eventEntity) {\n        ProcessTaskEvent processTaskEvent = ProcessTaskConverter.INSTANCE.convert(eventEntity);\n        processTaskEventMapper.updateByTaskEventNo(processTaskEvent);\n    }\n\n    @Override\n    public List<ProcessTaskEventEntity> findTaskEventListByTaskNo(String taskNo) {\n        QueryTaskEventReqVO query = new QueryTaskEventReqVO();\n        query.setTaskNo(taskNo);\n        List<ProcessTaskEvent> list = processTaskEventMapper.list(query);\n        return ProcessTaskConverter.INSTANCE.convertEventPoList(list);\n    }\n\n    @Override\n    public void saveWithCreatedDate(ProcessTaskEntity taskEntity) {\n        if (sharding) {\n            String idStr = CodeGenerateHelper.generateCode(\"PROCESS-ID\", \"\");\n            taskEntity.setId(Long.parseLong(idStr));\n        }\n        ProcessTask processTask = ProcessTaskConverter.INSTANCE.convert(taskEntity);\n        processTaskMapper.insertWithCreatedDate(processTask);\n        taskEntity.setId(processTask.getId());\n    }\n\n    @Override\n    public void saveWithCreatedDate(ProcessTaskAssignEntity assignEntity) {\n        if (sharding) {\n            String idStr = CodeGenerateHelper.generateCode(\"PROCESS-ID\", \"\");\n            assignEntity.setId(Long.parseLong(idStr));\n        }\n        ProcessTaskAssign assign = ProcessTaskConverter.INSTANCE.convert(assignEntity);\n        processTaskAssignMapper.insertWithCreatedDate(assign);\n        assignEntity.setId(assign.getId());\n    }\n\n    @Override\n    public void saveWithCreatedDate(ProcessTaskEventEntity eventEntity) {\n        if (sharding) {\n            String idStr = CodeGenerateHelper.generateCode(\"PROCESS-ID\", \"\");\n            eventEntity.setId(Long.parseLong(idStr));\n        }\n        ProcessTaskEvent event = ProcessTaskConverter.INSTANCE.convert(eventEntity);\n        processTaskEventMapper.insertWithCreatedDate(event);\n        eventEntity.setId(event.getId());\n        \n    }\n\n    public ProcessTaskMapper getProcessTaskMapper() {\n        return processTaskMapper;\n    }\n\n    public void setProcessTaskMapper(ProcessTaskMapper processTaskMapper) {\n        this.processTaskMapper = processTaskMapper;\n    }\n\n    public ProcessTaskAssignMapper getProcessTaskAssignMapper() {\n        return processTaskAssignMapper;\n    }\n\n    public void setProcessTaskAssignMapper(ProcessTaskAssignMapper processTaskAssignMapper) {\n        this.processTaskAssignMapper = processTaskAssignMapper;\n    }\n\n    public ProcessTaskEventMapper getProcessTaskEventMapper() {\n        return processTaskEventMapper;\n    }\n\n    public void setProcessTaskEventMapper(ProcessTaskEventMapper processTaskEventMapper) {\n        this.processTaskEventMapper = processTaskEventMapper;\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/process/infrastructure/sharding/ProcessShardingDataQuerier.java",
    "content": "package com.jd.easyflow.process.infrastructure.sharding;\n\nimport org.springframework.beans.factory.annotation.Autowired;\n\nimport com.jd.easyflow.process.domain.model.entity.ProcessInstanceEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessNodeExecutionEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessNodeInstanceEntity;\nimport com.jd.easyflow.process.domain.model.entity.ProcessTaskEntity;\nimport com.jd.easyflow.process.domain.repository.ProcessRepository;\nimport com.jd.easyflow.process.domain.repository.ProcessTaskRepository;\nimport com.jd.easyflow.sharding.service.ShardingData;\nimport com.jd.easyflow.sharding.service.ShardingDataQueryer;\n\n/**\n * @author liyuliang5\n */\npublic class ProcessShardingDataQuerier extends ShardingDataQueryer {\n\n    @Autowired\n    private ProcessRepository processRepository;\n    @Autowired\n    private ProcessTaskRepository processTaskRepository;\n\n    public void fillByProcessInstanceNo(String processInstanceNo, ShardingData shardingData) {\n        ProcessInstanceEntity instance = shardingService.parallelExecute(shardingData.getGroup(),\n                shardInfo -> processRepository.getByProcessInstanceNo(processInstanceNo),\n                list -> list.stream().filter(entity -> entity != null).findFirst().orElse(null));\n        if (instance != null) {\n            shardingData.setGroup(instance.getProcessType());\n            shardingData.setBizNo(instance.getBizNo());\n        }\n    }\n    \n    public void fillByProcessNodeInstanceNo(String processNodeInstanceNo, ShardingData shardingData) {\n        ProcessNodeInstanceEntity instance = shardingService.parallelExecute(shardingData.getGroup(),\n                shardInfo -> processRepository.getByNodeInstanceNo(processNodeInstanceNo),\n                list -> list.stream().filter(entity -> entity != null).findFirst().orElse(null));\n        if (instance != null) {\n            fillByProcessInstanceNo(instance.getProcessInstanceNo(), shardingData);;\n        }\n    }\n    \n    public void fillByProcessNodeExecutionNo(String processNodeExecutionNo, ShardingData shardingData) {\n        ProcessNodeExecutionEntity instance = shardingService.parallelExecute(shardingData.getGroup(),\n                shardInfo -> processRepository.getByNodeExecutionNo(processNodeExecutionNo),\n                list -> list.stream().filter(entity -> entity != null).findFirst().orElse(null));\n        if (instance != null) {\n            fillByProcessNodeInstanceNo(instance.getNodeExecutionNo(), shardingData);;\n        }\n    }\n    \n    public void fillByTaskNo(String taskNo, ShardingData shardingData) {\n        ProcessTaskEntity task = shardingService.parallelExecute(shardingData.getGroup(),\n                shardInfo -> processTaskRepository.getTask(taskNo),\n                list -> list.stream().filter(entity -> entity != null).findFirst().orElse(null));\n        if (task != null) {\n            shardingData.setGroup(task.getProcessType());\n            shardingData.setBizNo(task.getBizNo());\n        }\n    }\n    \n\n    public ProcessRepository getProcessRepository() {\n        return processRepository;\n    }\n\n    public void setProcessRepository(ProcessRepository processRepository) {\n        this.processRepository = processRepository;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/adapter/export/ProcessUnitExportImpl.java",
    "content": "package com.jd.easyflow.processunit.adapter.export;\n\nimport java.text.ParseException;\nimport java.text.SimpleDateFormat;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.stream.Collectors;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\n\nimport com.fasterxml.jackson.core.type.TypeReference;\nimport com.jd.easyflow.action.Action;\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponse;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponseCode;\nimport com.jd.easyflow.common.adapter.export.dto.pager.PagerCondition;\nimport com.jd.easyflow.common.adapter.export.dto.pager.PagerResult;\nimport com.jd.easyflow.common.util.AssertUtils;\nimport com.jd.easyflow.processunit.adapter.export.converter.PagerConverter;\nimport com.jd.easyflow.processunit.adapter.export.converter.ProcessUnitConverter;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitCreateReq;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitCreateRes;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitDTO;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitExecuteReq;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitExecuteRes;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitExecutionDTO;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitExecutionQueryReq;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitInstanceDTO;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitInstanceQueryReq;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitQueryReq;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitUpdateReq;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitUpdateRes;\nimport com.jd.easyflow.processunit.adapter.export.dto.ShardingInfoDTO;\nimport com.jd.easyflow.processunit.adapter.export.dto.ShardingInfoQueryReq;\nimport com.jd.easyflow.processunit.adapter.export.dto.ShutdownReq;\nimport com.jd.easyflow.processunit.adapter.export.dto.ShutdownRes;\nimport com.jd.easyflow.processunit.domain.model.entity.ProcessUnitEntity;\nimport com.jd.easyflow.processunit.domain.model.entity.ProcessUnitExecutionEntity;\nimport com.jd.easyflow.processunit.domain.model.entity.ProcessUnitInstanceEntity;\nimport com.jd.easyflow.processunit.domain.model.vo.BatchExecuteReq;\nimport com.jd.easyflow.processunit.domain.model.vo.SyncAfterCallRes;\nimport com.jd.easyflow.processunit.domain.model.vo.SyncBeforeCallRes;\nimport com.jd.easyflow.processunit.domain.model.vo.BatchExecuteReq.VariableEntry;\nimport com.jd.easyflow.processunit.domain.model.vo.ExecuteReq;\nimport com.jd.easyflow.processunit.domain.model.vo.ExecuteRes;\nimport com.jd.easyflow.processunit.domain.repository.ProcessUnitRepository;\nimport com.jd.easyflow.processunit.domain.service.ProcessUnitService;\nimport com.jd.easyflow.sharding.service.ShardingComputeResult;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n * @author liyuliang5\n *\n */\npublic class ProcessUnitExportImpl implements ProcessUnitExport {\n    \n    private static final Logger log = LoggerFactory.getLogger(ProcessUnitExportImpl.class);\n\n\n    @Autowired\n    private ProcessUnitService processUnitService;\n    @Autowired\n    private ProcessUnitRepository processUnitRepository;\n    \n    @Action(code = \"easyflow-processunit-syncBeforeCall\", name = \"syncBeforeCall\")\n    @Override\n    public ExportResponse<com.jd.easyflow.processunit.adapter.export.dto.SyncBeforeCallRes> syncBeforeCall(\n            ExportRequest<com.jd.easyflow.processunit.adapter.export.dto.SyncBeforeCallReq> request) {\n        SyncBeforeCallRes res = processUnitService\n                .syncBeforeCall(ProcessUnitConverter.INSTANCE.convert(request.getData()));\n        return ExportResponse.build4Success(ProcessUnitConverter.INSTANCE.convert(res));\n    }\n\n    @Action(code = \"easyflow-processunit-syncAfterCall\", name = \"syncAfterCall\")\n    @Override\n    public ExportResponse<com.jd.easyflow.processunit.adapter.export.dto.SyncAfterCallRes> syncAfterCall(\n            ExportRequest<com.jd.easyflow.processunit.adapter.export.dto.SyncAfterCallReq> request) {\n        SyncAfterCallRes res = processUnitService\n                .syncAfterCall(ProcessUnitConverter.INSTANCE.convert(request.getData()));\n        return ExportResponse.build4Success(ProcessUnitConverter.INSTANCE.convert(res));\n    }\n    \n    @Action(code = \"easyflow-processunit-execute\", name = \"execute\")\n    @Override\n    public ExportResponse<ProcessUnitExecuteRes> execute(ExportRequest<ProcessUnitExecuteReq> request) {\n        ProcessUnitExecuteReq req = request.getData();\n        if (req.getProcessUnitInstanceNo() == null && (req.getBizNo() == null || req.getUnitCode() == null)) {\n            return ExportResponse.build4Failed(ExportResponseCode.INVALID);\n        }\n        ExecuteReq executeReq = new ExecuteReq();\n        executeReq.setUnitInstanceNo(req.getProcessUnitInstanceNo());\n        executeReq.setUnitCode(req.getUnitCode());\n        executeReq.setBizNo(req.getBizNo());\n        ExecuteRes executeRes = processUnitService.execute(executeReq);\n        ProcessUnitExecuteRes res = new ProcessUnitExecuteRes();\n        res.setResult(executeRes.getResult());\n        res.setResponseContent(executeRes.getResponseContent());\n        return ExportResponse.build4Success(res);\n    }\n\n    @Action(code = \"easyflow-processunit-batchExecute\", name = \"batchExecute\")\n    @Override\n    public ExportResponse<Void> batchExecute(ExportRequest<Map<String, String>> request) {\n        Map<String, String> params = request.getData();\n        log.info(\"Process unit batch execute start:{}\", params);\n        List<BatchExecuteReq> reqList = new ArrayList<>();\n        BatchExecuteReq sharedExecuteReq = buildExecutionReq(params);\n        reqList.add(sharedExecuteReq);\n\n        List<Map<String, Object>> instanceContextList = JSON.parseObject(params.get(\"instanceContextList\"),\n                new TypeReference<List<Map<String, Object>>>() {\n                });\n        if (instanceContextList == null) {\n            instanceContextList = new ArrayList<>();\n        }\n        for (Map<String, Object> map : instanceContextList) {\n            BatchExecuteReq exclusiveExecuteReq = buildExecutionReq(map);\n            reqList.add(exclusiveExecuteReq);\n        }\n        for (BatchExecuteReq batchExecuteReq : reqList) {\n            processUnitService.batchExecute(batchExecuteReq);\n        }\n        log.info(\"Process unit batch execute end\");\n        return ExportResponse.build4Success();\n    }\n\n    @Action(code = \"easyflow-processunit-create\", name = \"create\")\n    @Override\n    public ExportResponse<ProcessUnitCreateRes> create(ExportRequest<ProcessUnitCreateReq> req) {\n        log.info(\"Process unit create start, {}\", JSON.toJSONString(req));\n        ProcessUnitCreateRes res = new ProcessUnitCreateRes();\n        String instanceNo = processUnitService.create(req.getData());\n        res.setProcessUnitInstanceNo(instanceNo);\n        log.info(\"Process unit create end\");\n        return ExportResponse.build4Success(res);\n\n    }\n\n    @Action(code = \"easyflow-processunit-getByProcessInstanceNo\", name = \"getByProcessInstanceNo\")\n    @Override\n    public ExportResponse<ProcessUnitInstanceDTO> getByProcessInstanceNo(ExportRequest<String> req) {\n        ProcessUnitInstanceEntity entity = processUnitRepository.getInstance(req.getData());\n        ProcessUnitInstanceDTO dto = ProcessUnitConverter.INSTANCE.convert(entity);\n        return ExportResponse.build4Success(dto);\n    }\n\n    @Action(code = \"easyflow-processunit-getByBizNoAndProcessUnitCode\", name = \"getByBizNoAndProcessUnitCode\")\n    @Override\n    public ExportResponse<ProcessUnitInstanceDTO> getByBizNoAndProcessUnitCode(\n            ExportRequest<ProcessUnitInstanceQueryReq> req) {\n        ProcessUnitInstanceQueryReq query = req.getData();\n        ProcessUnitInstanceEntity entity = processUnitRepository\n                .getInstanceByUnitCodeAndBizNo(query.getProcessUnitCode(), query.getBizNo());\n        ProcessUnitInstanceDTO dto = ProcessUnitConverter.INSTANCE.convert(entity);\n        return ExportResponse.build4Success(dto);\n    }\n\n    @Action(code = \"easyflow-processunit-updateProcessUnitInstanceByInstanceNoSelective\", name = \"updateProcessUnitInstanceByInstanceNoSelective\")\n    @Override\n    public ExportResponse<Object> updateProcessUnitInstanceByInstanceNoSelective(ExportRequest<ProcessUnitInstanceDTO> req) {\n        ProcessUnitInstanceEntity entity = processUnitRepository.getInstance(req.getData().getInstanceNo(),\n                req.getData().getProcessUnitCode(), req.getData().getBizNo());\n        if (entity == null) {\n            return ExportResponse.build4Failed(ExportResponseCode.DATA_EMPTY);\n        }\n        req.getData().setProcessUnitCode(entity.getProcessUnitCode());\n        req.getData().setBizNo(entity.getBizNo());\n        processUnitRepository.updateInstanceByInstanceNoSelective(ProcessUnitConverter.INSTANCE.convert(req.getData()));\n        return ExportResponse.build4Success();\n    }\n\n    @Action(code = \"easyflow-processunit-update\", name = \"update\")\n    @Override\n    public ExportResponse<ProcessUnitUpdateRes> update(ExportRequest<ProcessUnitUpdateReq> req) {\n        log.info(\"Process unit update start, {}\", JSON.toJSONString(req));\n        ProcessUnitUpdateRes res = new ProcessUnitUpdateRes();\n        processUnitService.update(req.getData());\n        log.info(\"Process unit update end\");\n        return ExportResponse.build4Success(res);\n    }\n    \n    private BatchExecuteReq buildExecutionReq(Map params) {\n        BatchExecuteReq req = new BatchExecuteReq();\n        req.setType((String) params.get(\"type\"));\n        Object requestContext = params.get(\"context\");\n        req.setRequestContext(JSON.parseObject(requestContext, Map.class));\n        if (params.get(\"instanceNoList\") != null) {\n            req.setInstanceNoList(Arrays.asList(((String) params.get(\"instanceNoList\")).split(\",\")));\n        }\n        if (params.get(\"bizNoList\") != null) {\n            req.setBizNoList(Arrays.asList(((String) params.get(\"bizNoList\")).split(\",\")));\n        }\n        if (params.get(\"processUnitCodeList\") != null) {\n            req.setProcessUnitCodeList(Arrays.asList(((String) params.get(\"processUnitCodeList\")).split(\",\")));\n        }\n        if (params.get(\"excludeProcessUnitCodeList\") != null) {\n            req.setExcludeProcessUnitCodeList(Arrays.asList(((String) params.get(\"excludeProcessUnitCodeList\")).split(\",\")));\n        }\n        if (params.get(\"productCodeList\") != null) {\n            req.setProductCodeList(Arrays.asList(((String) params.get(\"productCodeList\")).split(\",\")));\n        }\n        if (params.get(\"excludeProductCodeList\") != null) {\n            req.setExcludeProductCodeList(Arrays.asList(((String) params.get(\"excludeProductCodeList\")).split(\",\")));\n        }\n        if (params.get(\"resultList\") != null) {\n            req.setResultList(Arrays.asList(((String) params.get(\"resultList\")).split(\",\")));\n        }       \n        if (params.get(\"nextAutoRunTimeStart\") != null) {\n            try {\n                req.setNextAutoRunTimeStart(\n                        new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\").parse((String) params.get(\"nextAutoRunTimeStart\")));\n            } catch (ParseException e) {\n                throw new RuntimeException(\"Date parse error\", e);\n            }\n        }\n        if (params.get(\"nextAutoRunTimeMaxInterval\") != null) {\n            req.setNextAutoRunTimeMaxInterval(Integer.parseInt((String) params.get(\"nextAutoRunTimeMaxInterval\")));\n        }\n        if (params.get(\"variableList\") != null) {\n            List<VariableEntry> variableList = JSON.parseArray(params.get(\"variableList\"), VariableEntry.class);\n            req.setVariableList(variableList);\n        }\n        return req;\n    }\n    \n    @Action(code = \"coffee-processunit-queryByUnitCodeAndBizNoPrefix\", name = \"queryByUnitCodeAndBizNoPrefix\")\n    @Override\n    public ExportResponse<List<ProcessUnitInstanceDTO>> queryByUnitCodeAndBizNoPrefix(\n            ExportRequest<ProcessUnitInstanceQueryReq> req) {\n        ProcessUnitInstanceQueryReq query = req.getData();\n        AssertUtils.isNotNull(query.getBizNo(),\"bizNo is empty\");\n        String bizNo = query.getBizNo();\n        int length = bizNo.length();\n        if (length < 20) {\n            throw new RuntimeException(\"queryByUnitCodeAndBizNoPrefix.bizNo length illegal\" + bizNo);\n        }\n        List<ProcessUnitInstanceEntity> list = processUnitRepository\n                .queryByUnitCodeAndBizNoPrefix(query.getProcessUnitCode(), query.getBizNo());\n        List<ProcessUnitInstanceDTO> result = list.stream().map(entity -> ProcessUnitConverter.INSTANCE.convert(entity)).collect(Collectors.toList());\n        return ExportResponse.build4Success(result);\n    }\n    \n    \n    @Action(code = \"easyflow-processunit-pagerQueryProcessUnitExecution\", name = \"pagerQueryProcessUnitExecution\")\n    @Override\n    public ExportResponse<PagerResult> pagerQueryProcessUnitExecution(ExportRequest<PagerCondition> req) {\n        com.jd.easyflow.common.dto.pager.PagerCondition condition = PagerConverter.INSTANCE.convert(req.getData());\n        com.jd.easyflow.common.dto.pager.PagerResult result = processUnitService\n                .pagerQueryProcessUnitExecution(condition);\n        PagerResult exportResult = new PagerResult();\n        exportResult.setCount(result.getCount());\n        exportResult.setList(ProcessUnitConverter.INSTANCE.convertExecutionList(result.getList()));\n        return ExportResponse.build4Success(exportResult);\n    }\n\n    @Action(code = \"easyflow-processunit-getExecutionByExecutionNo\", name = \"getExecutionByExecutionNo\")\n    @Override\n    public ExportResponse<ProcessUnitExecutionDTO> getExecutionByExecutionNo(\n            ExportRequest<ProcessUnitExecutionQueryReq> req) {\n        ProcessUnitExecutionQueryReq query = req.getData();\n        ProcessUnitExecutionEntity execution = processUnitRepository.getExecution(query.getExecutionNo(), query.getProcessUnitCode(), query.getBizNo());\n        ProcessUnitExecutionDTO dto = ProcessUnitConverter.INSTANCE.convert(execution);\n        return ExportResponse.build4Success(dto);\n    }\n\n    @Action(code = \"easyflow-processunit-queryProcessUnitList\", name = \"queryProcessUnitList\")\n    @Override\n    public ExportResponse<List<ProcessUnitDTO>> queryProcessUnitList(ExportRequest<ProcessUnitQueryReq> req) {\n        AssertUtils.isNotNull(req.getData());\n        List<ProcessUnitEntity> processUnitList = processUnitRepository.findAllProcessUnitList();\n        List<ProcessUnitDTO> dtoList = ProcessUnitConverter.INSTANCE.convertProcessUnitList(processUnitList);\n        return ExportResponse.build4Success(dtoList);\n    }\n    \n    @Action(code = \"easyflow-processunit-getProcessUnit\", name = \"getProcessUnit\")\n    public ExportResponse<ProcessUnitDTO> getProcessUnit(ExportRequest<String> req) {\n        AssertUtils.isNotNull(req.getData());\n        ProcessUnitEntity entity = processUnitRepository.getProcessUnitByCode(req.getData());\n        ProcessUnitDTO dto = ProcessUnitConverter.INSTANCE.convert(entity);\n        if (dto != null) {\n            dto.setConfig(JSON.toJSONString(entity.getConfigMap()));\n        }\n        return ExportResponse.build4Success(dto);\n    }\n    \n    @Action(code = \"easyflow-processunit-queryShardingInfo\", name = \"queryShardingInfo\")\n    public ExportResponse<ShardingInfoDTO> queryShardingInfo(ExportRequest<ShardingInfoQueryReq> req) {\n        AssertUtils.isNotNull(req.getData());\n        ShardingInfoQueryReq query = req.getData();\n        AssertUtils.isNotNull(query.getUnitCode());\n        AssertUtils.isNotNull(query.getBizNo());\n        ShardingComputeResult info = processUnitRepository.computeShardInfo(query.getUnitCode(), query.getBizNo());\n        return ExportResponse.build4Success(ProcessUnitConverter.INSTANCE.convert(info));\n    }\n    \n    @Action(code = \"easyflow-processunit-pagerQueryProcessUnitInstance\", name = \"pagerQueryProcessUnitInstance\")\n    @Override\n    public ExportResponse<PagerResult> pagerQueryProcessUnitInstance(ExportRequest<PagerCondition> req) {\n        com.jd.easyflow.common.dto.pager.PagerCondition condition = PagerConverter.INSTANCE.convert(req.getData());\n        com.jd.easyflow.common.dto.pager.PagerResult result = processUnitService\n                .pagerQueryProcessUnitInstance(condition);\n        PagerResult exportResult = new PagerResult();\n        exportResult.setCount(result.getCount());\n        exportResult.setList(ProcessUnitConverter.INSTANCE.convertInstanceList(result.getList()));\n        return ExportResponse.build4Success(exportResult);\n    }\n\n    @Action(code = \"coffee-processunit-shutdown\", name = \"shutdown\")\n    @Override\n    public ExportResponse<ShutdownRes> shutdown(ExportRequest<ShutdownReq> req) {\n        processUnitService.shutdown();\n        return ExportResponse.build4Success();\n    }\n\n    public ProcessUnitService getProcessUnitService() {\n        return processUnitService;\n    }\n\n    public void setProcessUnitService(ProcessUnitService processUnitService) {\n        this.processUnitService = processUnitService;\n    }\n\n    public ProcessUnitRepository getProcessUnitRepository() {\n        return processUnitRepository;\n    }\n\n    public void setProcessUnitRepository(ProcessUnitRepository processUnitRepository) {\n        this.processUnitRepository = processUnitRepository;\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/adapter/export/converter/PagerConverter.java",
    "content": "package com.jd.easyflow.processunit.adapter.export.converter;\n\n\nimport com.jd.easyflow.common.adapter.export.dto.pager.PagerResult;\nimport com.jd.easyflow.common.dto.pager.FieldEntry;\nimport com.jd.easyflow.common.dto.pager.PagerCondition;\nimport com.jd.easyflow.common.dto.pager.SortEntry;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * @author liyuliang5\n * \n */\npublic class PagerConverter {\n    \n    public static PagerConverter INSTANCE = new PagerConverter();\n\n    public PagerCondition convert(com.jd.easyflow.common.adapter.export.dto.pager.PagerCondition condition) {\n        if ( condition == null ) {\n            return null;\n        }\n\n        PagerCondition pagerCondition = new PagerCondition();\n\n        pagerCondition.setCount( condition.isCount() );\n        Map<String, Object> map = condition.getExtData();\n        if ( map != null ) {\n            pagerCondition.setExtData( new HashMap<String, Object>( map ) );\n        }\n        pagerCondition.setFieldList( fieldEntryListToFieldEntryList( condition.getFieldList() ) );\n        pagerCondition.setPage( condition.getPage() );\n        pagerCondition.setPageIndex( condition.getPageIndex() );\n        pagerCondition.setPageSize( condition.getPageSize() );\n        pagerCondition.setSortList( sortEntryListToSortEntryList( condition.getSortList() ) );\n        pagerCondition.setStart( condition.getStart() );\n        if ( pagerCondition.getFieldMap() != null ) {\n            Map<String, FieldEntry> map1 = stringFieldEntryMapToStringFieldEntryMap( condition.getFieldMap() );\n            if ( map1 != null ) {\n                pagerCondition.getFieldMap().putAll( map1 );\n            }\n        }\n        if ( pagerCondition.getSortMap() != null ) {\n            Map<String, SortEntry> map2 = stringSortEntryMapToStringSortEntryMap( condition.getSortMap() );\n            if ( map2 != null ) {\n                pagerCondition.getSortMap().putAll( map2 );\n            }\n        }\n\n        return pagerCondition;\n    }\n\n    public PagerResult convert(com.jd.easyflow.common.dto.pager.PagerResult result) {\n        if ( result == null ) {\n            return null;\n        }\n\n        PagerResult pagerResult = new PagerResult();\n\n        pagerResult.setCount( result.getCount() );\n        List list = result.getList();\n        if ( list != null ) {\n            pagerResult.setList( new ArrayList( list ) );\n        }\n        pagerResult.setPageNum( result.getPageNum() );\n        pagerResult.setPageSize( result.getPageSize() );\n\n        return pagerResult;\n    }\n\n    protected FieldEntry fieldEntryToFieldEntry(com.jd.easyflow.common.adapter.export.dto.pager.FieldEntry fieldEntry) {\n        if ( fieldEntry == null ) {\n            return null;\n        }\n\n        FieldEntry fieldEntry1 = new FieldEntry();\n\n        fieldEntry1.setName( fieldEntry.getName() );\n        fieldEntry1.setValue( fieldEntry.getValue() );\n\n        return fieldEntry1;\n    }\n\n    protected List<FieldEntry> fieldEntryListToFieldEntryList(List<com.jd.easyflow.common.adapter.export.dto.pager.FieldEntry> list) {\n        if ( list == null ) {\n            return null;\n        }\n\n        List<FieldEntry> list1 = new ArrayList<FieldEntry>( list.size() );\n        for ( com.jd.easyflow.common.adapter.export.dto.pager.FieldEntry fieldEntry : list ) {\n            list1.add( fieldEntryToFieldEntry( fieldEntry ) );\n        }\n\n        return list1;\n    }\n\n    protected SortEntry sortEntryToSortEntry(com.jd.easyflow.common.adapter.export.dto.pager.SortEntry sortEntry) {\n        if ( sortEntry == null ) {\n            return null;\n        }\n\n        SortEntry sortEntry1 = new SortEntry();\n\n        sortEntry1.setKey( sortEntry.getKey() );\n        sortEntry1.setSeq( sortEntry.getSeq() );\n        sortEntry1.setType( sortEntry.getType() );\n\n        return sortEntry1;\n    }\n\n    protected List<SortEntry> sortEntryListToSortEntryList(List<com.jd.easyflow.common.adapter.export.dto.pager.SortEntry> list) {\n        if ( list == null ) {\n            return null;\n        }\n\n        List<SortEntry> list1 = new ArrayList<SortEntry>( list.size() );\n        for ( com.jd.easyflow.common.adapter.export.dto.pager.SortEntry sortEntry : list ) {\n            list1.add( sortEntryToSortEntry( sortEntry ) );\n        }\n\n        return list1;\n    }\n\n    protected Map<String, FieldEntry> stringFieldEntryMapToStringFieldEntryMap(Map<String, com.jd.easyflow.common.adapter.export.dto.pager.FieldEntry> map) {\n        if ( map == null ) {\n            return null;\n        }\n\n        Map<String, FieldEntry> map1 = new HashMap<String, FieldEntry>( Math.max( (int) ( map.size() / .75f ) + 1, 16 ) );\n\n        for ( java.util.Map.Entry<String, com.jd.easyflow.common.adapter.export.dto.pager.FieldEntry> entry : map.entrySet() ) {\n            String key = entry.getKey();\n            FieldEntry value = fieldEntryToFieldEntry( entry.getValue() );\n            map1.put( key, value );\n        }\n\n        return map1;\n    }\n\n    protected Map<String, SortEntry> stringSortEntryMapToStringSortEntryMap(Map<String, com.jd.easyflow.common.adapter.export.dto.pager.SortEntry> map) {\n        if ( map == null ) {\n            return null;\n        }\n\n        Map<String, SortEntry> map1 = new HashMap<String, SortEntry>( Math.max( (int) ( map.size() / .75f ) + 1, 16 ) );\n\n        for ( java.util.Map.Entry<String, com.jd.easyflow.common.adapter.export.dto.pager.SortEntry> entry : map.entrySet() ) {\n            String key = entry.getKey();\n            SortEntry value = sortEntryToSortEntry( entry.getValue() );\n            map1.put( key, value );\n        }\n\n        return map1;\n    }\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/adapter/export/converter/ProcessUnitConverter.java",
    "content": "package com.jd.easyflow.processunit.adapter.export.converter;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport com.jd.easyflow.processunit.adapter.export.dto.ExecPolicyDTO;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitDTO;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitExecutionDTO;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitInstanceDTO;\nimport com.jd.easyflow.processunit.adapter.export.dto.ShardingInfoDTO;\nimport com.jd.easyflow.processunit.adapter.export.dto.SyncAfterCallReq;\nimport com.jd.easyflow.processunit.domain.model.entity.ProcessUnitEntity;\nimport com.jd.easyflow.processunit.domain.model.entity.ProcessUnitExecutionEntity;\nimport com.jd.easyflow.processunit.domain.model.entity.ProcessUnitInstanceEntity;\nimport com.jd.easyflow.processunit.domain.model.vo.ExecPolicy;\nimport com.jd.easyflow.processunit.domain.model.vo.SyncAfterCallRes;\nimport com.jd.easyflow.processunit.domain.model.vo.SyncBeforeCallReq;\nimport com.jd.easyflow.processunit.domain.model.vo.SyncBeforeCallRes;\nimport com.jd.easyflow.sharding.service.ShardingComputeResult;\n\n/**\n * @author liyuliang5\n * \n */\npublic class ProcessUnitConverter {\n\n    public static ProcessUnitConverter INSTANCE = new ProcessUnitConverter();\n    \n\n    public SyncBeforeCallReq convert(com.jd.easyflow.processunit.adapter.export.dto.SyncBeforeCallReq req) {\n        if ( req == null ) {\n            return null;\n        }\n\n        SyncBeforeCallReq syncBeforeCallReq = new SyncBeforeCallReq();\n\n        syncBeforeCallReq.setBizNo( req.getBizNo() );\n        syncBeforeCallReq.setProductCode( req.getProductCode() );\n        syncBeforeCallReq.setRequestContent( req.getRequestContent() );\n        syncBeforeCallReq.setRequestNo( req.getRequestNo() );\n        syncBeforeCallReq.setUnitCode( req.getUnitCode() );\n        syncBeforeCallReq.setVersion( req.getVersion() );\n        syncBeforeCallReq.setClientInfo(req.getClientInfo());\n        return syncBeforeCallReq;\n    }\n\n    public com.jd.easyflow.processunit.adapter.export.dto.SyncBeforeCallRes convert(SyncBeforeCallRes res) {\n        if ( res == null ) {\n            return null;\n        }\n\n        com.jd.easyflow.processunit.adapter.export.dto.SyncBeforeCallRes syncBeforeCallRes = new com.jd.easyflow.processunit.adapter.export.dto.SyncBeforeCallRes();\n\n        Map<String, String> map = res.getContextData();\n        if ( map != null ) {\n            syncBeforeCallRes.setContextData( new HashMap<String, String>( map ) );\n        }\n        syncBeforeCallRes.setExecPolicy( execPolicyToExecPolicyDTO( res.getExecPolicy() ) );\n        syncBeforeCallRes.setExecutionNo( res.getExecutionNo() );\n        syncBeforeCallRes.setInstanceNo( res.getInstanceNo() );\n        Map<String, Object> map1 = res.getUnitConf();\n        if ( map1 != null ) {\n            syncBeforeCallRes.setUnitConf( new HashMap<String, Object>( map1 ) );\n        }\n        Map<String, String> map2 = res.getVariables();\n        if ( map2 != null ) {\n            syncBeforeCallRes.setVariables( new HashMap<String, String>( map2 ) );\n        }\n\n        return syncBeforeCallRes;\n    }\n\n    public com.jd.easyflow.processunit.domain.model.vo.SyncAfterCallReq convert(SyncAfterCallReq req) {\n        if ( req == null ) {\n            return null;\n        }\n\n        com.jd.easyflow.processunit.domain.model.vo.SyncAfterCallReq syncAfterCallReq = new com.jd.easyflow.processunit.domain.model.vo.SyncAfterCallReq();\n\n        syncAfterCallReq.setBizNo( req.getBizNo() );\n        Map<String, String> map = req.getContextData();\n        if ( map != null ) {\n            syncAfterCallReq.setContextData( new HashMap<String, String>( map ) );\n        }\n        syncAfterCallReq.setExecutionNo( req.getExecutionNo() );\n        syncAfterCallReq.setInstanceNo( req.getInstanceNo() );\n        syncAfterCallReq.setResponseContent( req.getResponseContent() );\n        syncAfterCallReq.setResult( req.getResult() );\n        syncAfterCallReq.setUnitCode( req.getUnitCode() );\n        Map<String, String> map1 = req.getVariables();\n        if ( map1 != null ) {\n            syncAfterCallReq.setVariables( new HashMap<String, String>( map1 ) );\n        }\n        syncAfterCallReq.setAutoRunFlag(req.getAutoRunFlag());\n        syncAfterCallReq.setNextAutoRunTime(req.getNextAutoRunTime());\n        return syncAfterCallReq;\n    }\n\n    public com.jd.easyflow.processunit.adapter.export.dto.SyncAfterCallRes convert(SyncAfterCallRes res) {\n        if ( res == null ) {\n            return null;\n        }\n\n        com.jd.easyflow.processunit.adapter.export.dto.SyncAfterCallRes syncAfterCallRes = new com.jd.easyflow.processunit.adapter.export.dto.SyncAfterCallRes();\n\n        return syncAfterCallRes;\n    }\n\n    public ProcessUnitInstanceDTO convert(ProcessUnitInstanceEntity entity) {\n        if ( entity == null ) {\n            return null;\n        }\n\n        ProcessUnitInstanceDTO processUnitInstanceDTO = new ProcessUnitInstanceDTO();\n\n        processUnitInstanceDTO.setAutoRunFlag( entity.getAutoRunFlag() );\n        processUnitInstanceDTO.setAutoRunTimes( entity.getAutoRunTimes() );\n        processUnitInstanceDTO.setBizNo( entity.getBizNo() );\n        processUnitInstanceDTO.setCreatedDate( entity.getCreatedDate() );\n        processUnitInstanceDTO.setVars(entity.getVars());\n        processUnitInstanceDTO.setExtData( entity.getExtData() );\n        processUnitInstanceDTO.setInstanceNo( entity.getInstanceNo() );\n        processUnitInstanceDTO.setModifiedDate( entity.getModifiedDate() );\n        processUnitInstanceDTO.setNextAutoRunTime( entity.getNextAutoRunTime() );\n        processUnitInstanceDTO.setParentNo( entity.getParentNo() );\n        processUnitInstanceDTO.setProcessUnitCode( entity.getProcessUnitCode() );\n        processUnitInstanceDTO.setProductCode( entity.getProductCode() );\n        processUnitInstanceDTO.setRequestContent( entity.getRequestContent() );\n        processUnitInstanceDTO.setResponseContent( entity.getResponseContent() );\n        processUnitInstanceDTO.setResult( entity.getResult() );\n        processUnitInstanceDTO.setId(entity.getId());\n        return processUnitInstanceDTO;\n    }\n\n    public ProcessUnitInstanceEntity convert(ProcessUnitInstanceDTO dto) {\n        if ( dto == null ) {\n            return null;\n        }\n\n        ProcessUnitInstanceEntity processUnitInstanceEntity = new ProcessUnitInstanceEntity();\n\n        processUnitInstanceEntity.setAutoRunFlag( dto.getAutoRunFlag() );\n        processUnitInstanceEntity.setAutoRunTimes( dto.getAutoRunTimes() );\n        processUnitInstanceEntity.setBizNo( dto.getBizNo() );\n        processUnitInstanceEntity.setCreatedDate( dto.getCreatedDate() );\n        processUnitInstanceEntity.setVars(dto.getVars());\n        processUnitInstanceEntity.setExtData( dto.getExtData() );\n        processUnitInstanceEntity.setInstanceNo( dto.getInstanceNo() );\n        processUnitInstanceEntity.setModifiedDate( dto.getModifiedDate() );\n        processUnitInstanceEntity.setNextAutoRunTime( dto.getNextAutoRunTime() );\n        processUnitInstanceEntity.setParentNo( dto.getParentNo() );\n        processUnitInstanceEntity.setProcessUnitCode( dto.getProcessUnitCode() );\n        processUnitInstanceEntity.setProductCode( dto.getProductCode() );\n        processUnitInstanceEntity.setRequestContent( dto.getRequestContent() );\n        processUnitInstanceEntity.setResponseContent( dto.getResponseContent() );\n        processUnitInstanceEntity.setResult( dto.getResult() );\n\n        return processUnitInstanceEntity;\n    }\n\n    protected ExecPolicyDTO execPolicyToExecPolicyDTO(ExecPolicy execPolicy) {\n        if ( execPolicy == null ) {\n            return null;\n        }\n\n        ExecPolicyDTO execPolicyDTO1 = new ExecPolicyDTO();\n\n        execPolicyDTO1.setPolicyData( execPolicy.getPolicyData() );\n        execPolicyDTO1.setPolicyType( execPolicy.getPolicyType() );\n        execPolicyDTO1.setRequestContent( execPolicy.getRequestContent() );\n        execPolicyDTO1.setResponseContent( execPolicy.getResponseContent() );\n        execPolicyDTO1.setResult( execPolicy.getResult() );\n\n        return execPolicyDTO1;\n    }\n    \n    public List<ProcessUnitInstanceDTO> convertInstanceList(List<ProcessUnitInstanceEntity> entityList) {\n        if (entityList == null) {\n            return null;\n        }\n        List<ProcessUnitInstanceDTO> list = new ArrayList<ProcessUnitInstanceDTO>();\n        entityList.forEach(entity -> list.add(convert(entity)));\n        return list;\n    }\n    \n    public List<ProcessUnitExecutionDTO> convertExecutionList(List<ProcessUnitExecutionEntity> entityList) {\n        if (entityList == null) {\n            return null;\n        }\n        List<ProcessUnitExecutionDTO> list = new ArrayList<ProcessUnitExecutionDTO>();\n        entityList.forEach(entity -> list.add(convert(entity)));\n        return list;\n    }\n    \n    public ProcessUnitExecutionDTO convert(ProcessUnitExecutionEntity entity) {\n        if ( entity == null ) {\n            return null;\n        }\n\n        ProcessUnitExecutionDTO processUnitExecutionDTO = new ProcessUnitExecutionDTO();\n\n        processUnitExecutionDTO.setExecutionNo( entity.getExecutionNo() );\n        processUnitExecutionDTO.setRequestNo( entity.getRequestNo() );\n        processUnitExecutionDTO.setParentNo( entity.getParentNo() );\n        processUnitExecutionDTO.setCreatedDate( entity.getCreatedDate() );\n        processUnitExecutionDTO.setExtData( entity.getExtData() );\n        processUnitExecutionDTO.setInstanceNo( entity.getInstanceNo() );\n        processUnitExecutionDTO.setModifiedDate( entity.getModifiedDate() );\n        processUnitExecutionDTO.setResult( entity.getResult() );\n        processUnitExecutionDTO.setParentNo( entity.getParentNo() );\n        processUnitExecutionDTO.setProcessUnitCode( entity.getProcessUnitCode() );\n        processUnitExecutionDTO.setBizNo( entity.getBizNo() );\n        processUnitExecutionDTO.setProductCode( entity.getProductCode() );\n        processUnitExecutionDTO.setRequestContent( entity.getRequestContent() );\n        processUnitExecutionDTO.setResponseContent( entity.getResponseContent() );\n        processUnitExecutionDTO.setExecType( entity.getExecType() );\n        processUnitExecutionDTO.setRequestTime( entity.getRequestTime() );\n        processUnitExecutionDTO.setResponseTime( entity.getResponseTime() );\n        processUnitExecutionDTO.setElaspeTime( entity.getElaspeTime() );\n\n        return processUnitExecutionDTO;\n    }\n    \n    public ProcessUnitDTO convert(ProcessUnitEntity entity) {\n        if (entity == null) {\n            return null;\n        }\n        ProcessUnitDTO processUnitDTO = new ProcessUnitDTO();\n        processUnitDTO.setName(entity.getName());\n        processUnitDTO.setParentCode(entity.getParentCode());\n        processUnitDTO.setProcessUnitCode(entity.getProcessUnitCode());\n        processUnitDTO.setStatus(entity.getStatus());\n        return processUnitDTO;\n    }\n    \n    public List<ProcessUnitDTO> convertProcessUnitList(List<ProcessUnitEntity> entityList) {\n        if (entityList == null) {\n            return null;\n        }\n        List<ProcessUnitDTO> dtoList = new ArrayList<ProcessUnitDTO>();\n        for (ProcessUnitEntity entity : entityList) {\n            dtoList.add(convert(entity));\n        }\n        return dtoList;\n    }\n    \n    public ShardingInfoDTO convert(ShardingComputeResult info) {\n        if (info == null) {\n            return null;\n        }\n        ShardingInfoDTO dto = new ShardingInfoDTO();\n        dto.setTableSuffix(info.getTableSuffix());\n        dto.setDb(info.getDb());\n        dto.setShard(info.getShard());\n        \n        dto.setSlaveDb(info.getSlaveDb());\n        dto.setSlaveTableSuffix(info.getSlaveTableSuffix());\n        dto.setSlaveShard(info.getSlaveShard());\n        return dto;\n    }\n    \n}\n\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/adapter/message/ProcessUnitCreateMessageListener.java",
    "content": "package com.jd.easyflow.processunit.adapter.message;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\n\nimport com.jd.easyflow.alert.AlertUtil;\nimport com.jd.easyflow.message.BaseMessageListener;\nimport com.jd.easyflow.message.Message;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitCreateReq;\nimport com.jd.easyflow.processunit.domain.service.ProcessUnitService;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n * @author liyuliang5\n * \n */\npublic class ProcessUnitCreateMessageListener extends BaseMessageListener<ProcessUnitCreateReq> {\n    \n    private static final Logger log = LoggerFactory.getLogger(ProcessUnitCreateMessageListener.class);\n\n\n    @Autowired\n    private ProcessUnitService processUnitService;\n\n    @Override\n    public boolean validate(ProcessUnitCreateReq obj, Message message) {\n        return true;\n    }\n\n    @Override\n    public void process(ProcessUnitCreateReq obj, Message message) {\n        log.info(\"Process unit client receive create message:{}\", JSON.toJSONString(obj));\n        try {\n            processUnitService.syncCreate(obj, null);\n        } catch (Exception e) {\n            AlertUtil.doAlert(\"processUnit-createMessage\", \"create process unit exception,\", e, obj, obj.getProductCode());\n            throw e;\n        }\n    }\n\n    public ProcessUnitService getProcessUnitService() {\n        return processUnitService;\n    }\n\n    public void setProcessUnitService(ProcessUnitService processUnitService) {\n        this.processUnitService = processUnitService;\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/adapter/message/ProcessUnitExecuteMessageListener.java",
    "content": "package com.jd.easyflow.processunit.adapter.message;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\n\nimport com.jd.easyflow.message.BaseMessageListener;\nimport com.jd.easyflow.message.Message;\nimport com.jd.easyflow.processunit.domain.model.vo.ProcessUnitExecuteMessage;\nimport com.jd.easyflow.processunit.domain.service.ProcessUnitService;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n/**\n * @author liyuliang5\n * \n */\npublic class ProcessUnitExecuteMessageListener extends BaseMessageListener<ProcessUnitExecuteMessage> {\n    \n    private static final Logger log = LoggerFactory.getLogger(ProcessUnitExecuteMessageListener.class);\n\n\n    @Autowired\n    private ProcessUnitService processUnitService;\n\n    @Override\n    public boolean validate(ProcessUnitExecuteMessage obj, Message message) {\n        return true;\n    }\n\n    @Override\n    public void process(ProcessUnitExecuteMessage obj, Message message) {\n        log.info(\"Process unit receive execute message:{}\", JSON.toJSONString(obj));\n        processUnitService.executeMessage(obj.getInstanceNo(), obj.getUnitCode(), obj.getBizNo());\n    }\n\n    public ProcessUnitService getProcessUnitService() {\n        return processUnitService;\n    }\n\n    public void setProcessUnitService(ProcessUnitService processUnitService) {\n        this.processUnitService = processUnitService;\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/adapter/message/ProcessUnitUpdateMessageListener.java",
    "content": "package com.jd.easyflow.processunit.adapter.message;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\n\nimport com.jd.easyflow.alert.AlertUtil;\nimport com.jd.easyflow.message.BaseMessageListener;\nimport com.jd.easyflow.message.Message;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitUpdateReq;\nimport com.jd.easyflow.processunit.domain.service.ProcessUnitService;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n * @author liyuliang5\n * \n */\npublic class ProcessUnitUpdateMessageListener extends BaseMessageListener<ProcessUnitUpdateReq> {\n    \n    private static final Logger log = LoggerFactory.getLogger(ProcessUnitUpdateMessageListener.class);\n\n\n    @Autowired\n    private ProcessUnitService processUnitService;\n\n    @Override\n    public boolean validate(ProcessUnitUpdateReq obj, Message message) {\n        return true;\n    }\n\n    @Override\n    public void process(ProcessUnitUpdateReq obj, Message message) {\n        log.info(\"Process unit receive update message:{}\", JSON.toJSONString(obj));\n        try {\n            processUnitService.doUpdate(obj);\n        } catch (Exception e) {\n            AlertUtil.doAlert(\"processUnit-updateMessage\", \"process unit update exception,\", e, obj, obj.getProductCode());\n            throw e;\n        }\n    }\n\n    public ProcessUnitService getProcessUnitService() {\n        return processUnitService;\n    }\n\n    public void setProcessUnitService(ProcessUnitService processUnitService) {\n        this.processUnitService = processUnitService;\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/adapter/task/ProcessUnitAutoRunFlagUpdateTask.java",
    "content": "package com.jd.easyflow.processunit.adapter.task;\n\n\nimport java.text.ParseException;\nimport java.text.SimpleDateFormat;\nimport java.util.Arrays;\nimport java.util.Map;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\n\nimport com.jd.easyflow.processunit.domain.model.vo.BatchExecuteReq;\nimport com.jd.easyflow.processunit.domain.service.ProcessUnitService;\n\n/**\n * @author liyuliang5\n */\npublic class ProcessUnitAutoRunFlagUpdateTask {\n\n    private static final Logger log = LoggerFactory.getLogger(ProcessUnitAutoRunFlagUpdateTask.class);\n    \n    @Autowired\n    private ProcessUnitService processUnitService;\n\n    /**\n     * when type batch : processUnitCodeList,bizNoList,instanceNoList\n     * when type auto : processUnitCodeList,nextAutoRunTimeStart,nextAutoRunTimEnd\n     * @param params\n     */\n    public void execute(Map<String, String> params) {\n        log.info(\"Process unit autoRunFlag update start, param:{}\", params);\n        BatchExecuteReq req = new BatchExecuteReq();\n        req.setType(params.get(\"type\"));\n        if (params.get(\"processUnitCodeList\") != null) {\n            req.setProcessUnitCodeList(Arrays.asList(((String) params.get(\"processUnitCodeList\")).split(\",\")));\n        }\n        if (params.get(\"nextAutoRunTimeStart\") != null) {\n            try {\n                req.setNextAutoRunTimeStart(\n                        new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\").parse((String) params.get(\"nextAutoRunTimeStart\")));\n            } catch (ParseException e) {\n                throw new RuntimeException(\"Date parse error\", e);\n            }\n        }\n        if (params.get(\"nextAutoRunTimeEnd\") != null) {\n            try {\n                req.setNextAutoRunTimeEnd(\n                        new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\").parse((String) params.get(\"nextAutoRunTimeEnd\")));\n            } catch (ParseException e) {\n                throw new RuntimeException(\"Date parse error\", e);\n            }\n        }\n        if (params.get(\"instanceNoList\") != null) {\n            req.setInstanceNoList(Arrays.asList(((String) params.get(\"instanceNoList\")).split(\",\")));\n        }\n        if (params.get(\"bizNoList\") != null) {\n            req.setBizNoList(Arrays.asList(((String) params.get(\"bizNoList\")).split(\",\")));\n        }\n        \n        processUnitService.updateAutoRunFlag(req);\n        log.info(\"Process unit autoRunFlag update end\");\n    }\n\n    public ProcessUnitService getProcessUnitService() {\n        return processUnitService;\n    }\n\n    public void setProcessUnitService(ProcessUnitService processUnitService) {\n        this.processUnitService = processUnitService;\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/adapter/task/ProcessUnitAutoRunTask.java",
    "content": "package com.jd.easyflow.processunit.adapter.task;\n\nimport java.text.ParseException;\nimport java.text.SimpleDateFormat;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Map;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\n\nimport com.fasterxml.jackson.core.type.TypeReference;\nimport com.jd.easyflow.processunit.domain.model.vo.BatchExecuteReq;\nimport com.jd.easyflow.processunit.domain.model.vo.BatchExecuteReq.VariableEntry;\nimport com.jd.easyflow.processunit.domain.service.ProcessUnitService;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n * \n * @author liyuliang5\n * \n */\npublic class ProcessUnitAutoRunTask {\n    \n    private static final Logger log = LoggerFactory.getLogger(ProcessUnitAutoRunTask.class);\n\n\n    @Autowired\n    private ProcessUnitService processUnitService;\n\n    public void execute(Map<String, String> params) {\n        log.info(\"Process unit batch execute start:{}\", params);\n        List<BatchExecuteReq> reqList = new ArrayList<>();\n        BatchExecuteReq sharedExecuteReq = buildExecutionReq(params);\n        reqList.add(sharedExecuteReq);\n\n        List<Map<String, Object>> instanceContextList = JSON.parseObject(params.get(\"instanceContextList\"),\n                new TypeReference<List<Map<String, Object>>>() {\n                });\n        if (instanceContextList == null) {\n            instanceContextList = new ArrayList<>();\n        }\n        for (Map<String, Object> map : instanceContextList) {\n            BatchExecuteReq exclusiveExecuteReq = buildExecutionReq(map);\n            reqList.add(exclusiveExecuteReq);\n        }\n        for (BatchExecuteReq batchExecuteReq : reqList) {\n            processUnitService.batchExecute(batchExecuteReq);\n        }\n        log.info(\"Process unit batch execute end\");\n    }\n\n    private BatchExecuteReq buildExecutionReq(Map params) {\n        BatchExecuteReq req = new BatchExecuteReq();\n        req.setType((String) params.get(\"type\"));\n        Object requestContext = params.get(\"context\");\n        req.setRequestContext(JSON.parseObject(requestContext, Map.class));\n        if (params.get(\"instanceNoList\") != null) {\n            req.setInstanceNoList(Arrays.asList(((String) params.get(\"instanceNoList\")).split(\",\")));\n        }\n        if (params.get(\"bizNoList\") != null) {\n            req.setBizNoList(Arrays.asList(((String) params.get(\"bizNoList\")).split(\",\")));\n        }\n        if (params.get(\"processUnitCodeList\") != null) {\n            req.setProcessUnitCodeList(Arrays.asList(((String) params.get(\"processUnitCodeList\")).split(\",\")));\n        }\n        if (params.get(\"excludeProcessUnitCodeList\") != null) {\n            req.setExcludeProcessUnitCodeList(Arrays.asList(((String) params.get(\"excludeProcessUnitCodeList\")).split(\",\")));\n        }\n        if (params.get(\"productCodeList\") != null) {\n            req.setProductCodeList(Arrays.asList(((String) params.get(\"productCodeList\")).split(\",\")));\n        }\n        if (params.get(\"excludeProductCodeList\") != null) {\n            req.setExcludeProductCodeList(Arrays.asList(((String) params.get(\"excludeProductCodeList\")).split(\",\")));\n        }\n        if (params.get(\"resultList\") != null) {\n            req.setResultList(Arrays.asList(((String) params.get(\"resultList\")).split(\",\")));\n        }       \n        if (params.get(\"nextAutoRunTimeStart\") != null) {\n            try {\n                req.setNextAutoRunTimeStart(\n                        new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\").parse((String) params.get(\"nextAutoRunTimeStart\")));\n            } catch (ParseException e) {\n                throw new RuntimeException(\"Date parse error\", e);\n            }\n        }\n        if (params.get(\"nextAutoRunTimeEnd\") != null) {\n            try {\n                req.setNextAutoRunTimeEnd(\n                        new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\").parse((String) params.get(\"nextAutoRunTimeEnd\")));\n            } catch (ParseException e) {\n                throw new RuntimeException(\"Date parse error\", e);\n            }\n        }        \n        if (params.get(\"nextAutoRunTimeMaxInterval\") != null) {\n            req.setNextAutoRunTimeMaxInterval(Integer.parseInt((String) params.get(\"nextAutoRunTimeMaxInterval\")));\n        }\n        if (params.get(\"variableList\") != null) {\n            List<VariableEntry> variableList = JSON.parseArray(params.get(\"variableList\"), VariableEntry.class);\n            req.setVariableList(variableList);\n        }\n        \n        req.setBatchRunPolicy((String) params.get(\"batchRunPolicy\")); \n        if (params.get(\"threadNum\") != null) {\n            req.setThreadNum(Integer.parseInt((String) params.get(\"threadNum\")));\n        }\n        \n        \n        return req;\n    }\n\n    public ProcessUnitService getProcessUnitService() {\n        return processUnitService;\n    }\n\n    public void setProcessUnitService(ProcessUnitService processUnitService) {\n        this.processUnitService = processUnitService;\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/adapter/task/ProcessUnitShardingCompareTask.java",
    "content": "package com.jd.easyflow.processunit.adapter.task;\n\nimport java.text.SimpleDateFormat;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Map;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\n\nimport com.jd.easyflow.common.exception.EasyFlowException;\nimport com.jd.easyflow.processunit.domain.model.vo.ShardingCompareContext;\nimport com.jd.easyflow.processunit.domain.service.ProcessUnitShardingToolService;\n\n/**\n * @author liyuliang5\n */\npublic class ProcessUnitShardingCompareTask {\n    \n    private static final Logger log = LoggerFactory.getLogger(ProcessUnitShardingCompareTask.class);\n\n    @Autowired\n    private ProcessUnitShardingToolService shardingToolService;\n\n    public void execute(Map<String, String> params) {\n        log.info(\"Input param:\" + params);\n        ShardingCompareContext context = new ShardingCompareContext();\n        String unitCodeListStr = params.get(\"unitCodeList\");\n        if (unitCodeListStr == null || unitCodeListStr.isEmpty()) {\n            log.error(\"unitCodeList must not be null\");\n            return;\n        }\n        context.setUnitCodeList(Arrays.asList(unitCodeListStr.split(\",\")));\n        String createdDateStartStr = params.get(\"createdDateStart\");\n        String createdDateEndStr = params.get(\"createdDateEnd\");\n        try {\n            if (createdDateStartStr != null) {\n                context.setCreatedDateStart(new SimpleDateFormat(\"yyyyMMddHHmmss\").parse(createdDateStartStr));\n            }\n            if (createdDateEndStr != null) {\n                context.setCreatedDateEnd(new SimpleDateFormat(\"yyyyMMddHHmmss\").parse(createdDateEndStr));\n            }\n        } catch (Exception e) {\n            throw new EasyFlowException(\"createdDateStart or createdDateEnd format error, should be yyyyMMddHHmmss\", e);\n        }\n        String threadCountStr = params.get(\"threadCount\");\n        context.setThreadCount(threadCountStr == null ? 1 : Integer.parseInt(threadCountStr));\n        context.setLock(! Boolean.FALSE.toString().equals(params.get(\"lock\")));\n        context.setInstanceNo(params.get(\"instanceNo\"));\n        String resultListStr = params.get(\"resultList\");\n        if (resultListStr != null) {\n            List<String> resultList = Arrays.asList(resultListStr.split(\",\"));\n            context.setResultList(resultList);\n        }\n        try {\n            shardingToolService.compare(context);\n            log.info(\"Compare fail count is:\" + context.getFailCount().get());\n        } catch (Exception e) {\n            log.error(\"Compare exception,\" + e.getMessage(), e);\n            throw e;\n        }\n    }\n\n    public ProcessUnitShardingToolService getShardingToolService() {\n        return shardingToolService;\n    }\n\n    public void setShardingToolService(ProcessUnitShardingToolService shardingToolService) {\n        this.shardingToolService = shardingToolService;\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/adapter/task/ProcessUnitShardingMigrateTask.java",
    "content": "package com.jd.easyflow.processunit.adapter.task;\n\nimport java.text.SimpleDateFormat;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Map;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\n\nimport com.jd.easyflow.common.exception.EasyFlowException;\nimport com.jd.easyflow.processunit.domain.model.vo.ShardingMigrateContext;\nimport com.jd.easyflow.processunit.domain.service.ProcessUnitShardingToolService;\n\n/**\n * \n * @author liyuliang5\n */\npublic class ProcessUnitShardingMigrateTask {\n\n    private static final Logger log = LoggerFactory.getLogger(ProcessUnitShardingMigrateTask.class);\n\n    @Autowired\n    private ProcessUnitShardingToolService shardingToolService;\n\n    public void execute(Map<String, String> params) {\n        log.info(\"Input param:\" + params);\n        ShardingMigrateContext context = new ShardingMigrateContext();\n        String unitCodeListStr = params.get(\"unitCodeList\");\n        if (unitCodeListStr == null || unitCodeListStr.isEmpty()) {\n            log.error(\"unitCodeList must not be null\");\n            return;\n        }\n        context.setUnitCodeList(Arrays.asList(unitCodeListStr.split(\",\")));\n        String createdDateStartStr = params.get(\"createdDateStart\");\n        String createdDateEndStr = params.get(\"createdDateEnd\");\n        try {\n            if (createdDateStartStr != null) {\n                context.setCreatedDateStart(new SimpleDateFormat(\"yyyyMMddHHmmss\").parse(createdDateStartStr));\n            }\n            if (createdDateEndStr != null) {\n                context.setCreatedDateEnd(new SimpleDateFormat(\"yyyyMMddHHmmss\").parse(createdDateEndStr));\n            }\n        } catch (Exception e) {\n            throw new EasyFlowException(\"createdDateStart or createdDateEnd format error, should be yyyyMMddHHmmss\", e);\n        }\n        context.setMigrateExecution(! Boolean.FALSE.toString().equals(params.get(\"migrateExecution\")));\n        String threadCountStr = params.get(\"threadCount\");\n        context.setThreadCount(threadCountStr == null ? 1 : Integer.parseInt(threadCountStr));\n        context.setLock(! Boolean.FALSE.toString().equals(params.get(\"lock\")));\n        context.setInstanceNo(params.get(\"instanceNo\"));\n        context.setNewId(Boolean.TRUE.toString().equals(params.get(\"newId\")));\n        String resultListStr = params.get(\"resultList\");\n        if (resultListStr != null) {\n            List<String> resultList = Arrays.asList(resultListStr.split(\",\"));\n            context.setResultList(resultList);\n        }\n        \n        shardingToolService.migrate(context);\n    }\n\n    public ProcessUnitShardingToolService getShardingToolService() {\n        return shardingToolService;\n    }\n\n    public void setShardingToolService(ProcessUnitShardingToolService shardingToolService) {\n        this.shardingToolService = shardingToolService;\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/constant/ContextDataKeys.java",
    "content": "package com.jd.easyflow.processunit.domain.constant;\n\n/**\n * @author liyuliang5\n * \n */\npublic class ContextDataKeys {\n    public static final String EXECUTION_EXT_DATA_LOCK_REQUEST_ID = \"_lockRequestId\";\n    public static final String EXECUTION_START_TIME = \"_executionStartTime\";\n    public static final String PROCESS_UNIT_INVALID = \"_processUnitInvalid\";\n    public static final String INSTANCE_EXT_DATA = \"_instanceExtData\";\n\n\n}\n\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/constant/ProcessUnitConstants.java",
    "content": "package com.jd.easyflow.processunit.domain.constant;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ProcessUnitConstants {\n\n    public static final String RESULT_SUCCESS = \"SUCCESS\";\n    \n    public static final String RESULT_FAIL = \"FAIL\";\n    \n    public static final String RESULT_DOING = \"DOING\";\n    \n    public static final String RESULT_EXCEPTION = \"EXCEPTION\";\n    \n    public static final String RESULT_UNKNOWN = \"UNKNOWN\";\n    \n    public static final String RESULT_NONE = \"NONE\";\n    \n    public static final String POLICY_OLD = \"OLD\";\n    public static final String POLICY_REQUEST = \"REQUEST\";\n    public static final String POLICY_EXCEPTION = \"EXCEPTION\";\n    \n    public static final String REQ_TYPE_NEW = \"NEW\";\n    \n    public static final String REQ_TYPE_SUCCESS = \"SUCCESS\";\n    \n    public static final String REQ_TYPE_FAIL = \"FAIL\";\n    \n    public static final String REQ_TYPE_DOING = \"DOING\";\n    \n    public static final String REQ_TYPE_EXCEPTION = \"EXCEPTION\";\n    \n    public static final String CONF_SYNC_EXEC_POLICY = \"syncExecPolicy\";\n    public static final String CONF_ASYNC_EXEC_POLICY = \"asyncExecPolicy\";\n    public static final String CONF_CATCH_EXCEPTION = \"catchException\";\n    public static final String CONF_AUTO_ASYNC_RUN = \"autoAsyncRun\";\n    public static final String CONF_AUTO_ASYNC_RUN_PERIOD = \"autoAsyncRunPeriod\";\n    public static final String CONF_AUTO_ASYNC_RUN_PERIOD_POWER_MAX_TIME = \"autoAsyncRunPeriodPowerMaxTime\";\n    public static final String CONF_AUTO_ASYNC_MAX_TIMES = \"autoAsyncMaxTimes\";\n    public static final String CONF_AUTO_RUN_POLICY = \"autoRunPolicy\";\n    public static final String CONF_AUTO_RUN_DELAY_SECONDS = \"autoRunDelaySeconds\";\n\n    \n    public static final String CONF_ASYNC_RUN_EXP = \"asyncRunExp\";\n    \n    public static final String CONF_ASYNC_PROVIDER_ID = \"asyncProviderId\";\n    public static final String CONF_ASYNC_SERVICE_ID = \"asyncServiceId\";\n    public static final String CONF_ASYNC_SERVICE_CONF = \"asyncServiceConf\";\n    \n    public static final String CONF_LOCK_SECONDS = \"lockSeconds\";\n    \n    public static final String CONF_TX_POLICY = \"txPolicy\";\n    \n    public static final String CONF_SHARDING = \"sharding\";\n    \n    public static final String CONF_SHARDING_LIST = \"list\";\n    \n    public static final String CONF_SHARDING_SLAVE_LIST = \"slaveList\";\n    public static final String CONF_SHARDING_DOUBLE_WRITE = \"doubleWrite\";\n    public static final String CONF_SHARDING_IGNORE_SLAVE_ERROR = \"ignoreSlaveError\";\n    \n    public static final String CONF_ALERT_RULES = \"alertRules\";\n    \n    public static final String TX_POLICY_NONE = \"none\";\n    \n    public static final String TX_POLICY_NEW = \"new\";\n    \n    public static final int DEFAULT_LOCK_SECONDS = 60 * 60 * 24;\n    public static final int DEFAULT_WAIT_SECONDS = 10;\n    \n    public static final String STATUS_VALID = \"VALID\";\n    public static final String STATUS_INVALID = \"INVALID\";\n    \n    public static final String LOCK_PREFIX = \"PU_\";\n    \n\n    public static final String EXEC_TYPE_SYNC = \"SYNC\";\n    public static final String EXEC_TYPE_MANUAL_ASYNC = \"MANUAL_ASYNC\";\n    public static final String EXEC_TYPE_TASK_ASYNC = \"TASK_ASYNC\";\n    public static final String EXEC_TYPE_MSG_ASYNC = \"MSG_ASYNC\";\n    public static final String EXEC_TYPE_AFTER_CREATE = \"AFTER_CREATE\";\n    \n    public static final String EXECUTION_EXT_DATA_LOCK_REQUEST_ID = \"_lockRequestId\";\n    public static final String EXECUTION_EXT_DATA_POLICY_TYPE = \"_policyType\";\n    public static final String EXECUTION_EXT_DATA_CLIENT_INFO = \"_clientInfo\";\n    public static final String EXECUTION_EXT_DATA_CALL_TYPE = \"_reqType\";\n    public static final String EXECUTION_EXT_DATA_BEFORE_VARS = \"_before_vars\";\n    public static final String EXECUTION_EXT_DATA_AFTER_VARS = \"_after_vars\";\n    \n    public static final String CALL_TYPE_UPDATE = \"UPDATE\";\n    \n    public static final String EXECUTION_REQUEST_CONTEXT = \"_requestContext\";\n    \n    public static final String INSTANCE_EXT_DATA_CREATE_CLIENT_INFO = \"_createClientInfo\";\n    \n    public static final String INSTANCE_EXT_DATA_UPDATE_AUTO_RUN_TIME = \"_updateAutoRunTime\";\n\n    \n    public static final String CONF_CREATE_EXEC_POLICY = \"createExecPolicy\";\n    public static final String CONF_CREATE_EXEC_MQ_TOPIC = \"PU_CREATE_MESSAGE\";\n \n    public static final String CONF_UPDATE_EXEC_POLICY = \"updateExecPolicy\";\n    public static final String CONF_UPDATE_EXEC_MQ_TOPIC = \"PU_UPDATE_MESSAGE\";\n    \n    public static final String CONF_EXECUTE_MESSAGE_TOPIC = \"executeMessageTopic\";\n    \n    public static final String LOCK_BIZ_TYPE = \"_PU\";\n    \n    public static final String LOCK_KEY_SEP = \"--\";\n\n    public static final String EXECUTION_PERSIST_POLICY = \"executionPersistPolicy\";\n\n    public static final String PU_PERSIST_HANDLER = \"handler\";\n    \n    public static final String EXECUTION_PERSIST_TYPE_DEFAULT = \"DEFAULT\";\n\n    public static final String DUMMY_PERSIST_HANDLER_NAME = \"dummyPersistHandler\";\n    public static final String SYNC_PERSIST_HANDLER_NAME = \"syncPersistHandler\";\n    public static final String THREAD_POOL_ASYNC_PERSIST_HANDLER_NAME = \"threadPoolAsyncPersistHandler\";\n    \n    public static final String BATCH_RUN_POLICY = \"batchRunPolicy\";\n    public static final String BATCH_RUN_POLICY_CONF = \"batchRunPolicyConf\";\n    public static final String BATCH_RUN_POLICY_MULTIPLE_THREAD = \"multipleThread\";\n    \n    public static final String BEAN_NEW_TX_TEMPLATE = \"easyflow-processunit-newTransactionTemplate\";\n    \n    public static final String BEAN_PU_TX_TEMPLATE = \"easyflow-processunit-puTransactionTemplate\";\n    \n    public static final String INSTANCE_QUERY_TYPE_SINGLE = \"SINGLE\";\n    \n    public static final String INSTANCE_QUERY_TYPE_CREATED_DATE_RANGE = \"CREATED_DATE_RANGE\";\n    \n    public static final String EXECUTION_QUERY_TYPE_INSTANCE = \"INSTANCE\";\n    \n    public static final String EXECUTION_QUERY_TYPE_REQUEST_TIME_RANGE = \"REQUEST_TIME_RANGE\";\n\n    public static final String ALERT_CODE_ASYNC_RESULT = \"processunit-async\";\n    public static final String ALERT_CODE_ASYNC_MAX_TIMES = \"processUnit-asyncExceptionExceedMaxTimes\";\n    \n    public static final String SCENE_CREATE = \"CREATE\";\n    public static final String SCENE_SYNC = \"SYNC\";\n    public static final String SCENE_ASYNC = \"ASYNC\";\n    public static final String SCENE_EXECUTE = \"EXECUTE\";\n    public static final String SCENE_UPDATE = \"UPDATE\";\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/gateway/ProcessUnitClientGateway.java",
    "content": " package com.jd.easyflow.processunit.domain.gateway;\n\nimport com.jd.easyflow.processunit.domain.model.vo.ExecContext;\n\n/**\n  * @author liyuliang5\n  * \n  */\n public interface ProcessUnitClientGateway {\n\n     void asyncCallReal(ExecContext context);\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/model/converter/ProcessUnitExecuteConverter.java",
    "content": "package com.jd.easyflow.processunit.domain.model.converter;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitCreateReq;\nimport com.jd.easyflow.processunit.domain.model.vo.ExecParam;\nimport com.jd.easyflow.processunit.domain.model.vo.SyncBeforeCallReq;\nimport com.jd.easyflow.processunit.domain.model.vo.BatchExecuteReq.VariableEntry;\n\n/**\n * @author liyuliang5\n * \n */\npublic class ProcessUnitExecuteConverter {\n\n    public static ProcessUnitExecuteConverter INSTANCE = new ProcessUnitExecuteConverter();\n\n\n    public ExecParam convert(SyncBeforeCallReq param) {\n        if ( param == null ) {\n            return null;\n        }\n\n        ExecParam execParam = new ExecParam();\n\n        execParam.setBizNo( param.getBizNo() );\n        execParam.setProductCode( param.getProductCode() );\n        execParam.setRequestContent( param.getRequestContent() );\n        execParam.setRequestNo( param.getRequestNo() );\n        execParam.setUnitCode( param.getUnitCode() );\n        execParam.setVersion( param.getVersion() );\n        execParam.setClientInfo(param.getClientInfo());\n        return execParam;\n    }\n\n    public ExecParam convert(ProcessUnitCreateReq param) {\n        if ( param == null ) {\n            return null;\n        }\n\n        ExecParam execParam = new ExecParam();\n\n        execParam.setBizNo( param.getBizNo() );\n        execParam.setProductCode( param.getProductCode() );\n        execParam.setRequestContent( param.getRequestContent() );\n        execParam.setRequestNo( param.getRequestNo() );\n        execParam.setUnitCode( param.getUnitCode() );\n        execParam.setAutoRunFlag(param.getAutoRunFlag());\n        execParam.setNextAutoRunTime(param.getNextAutoRunTime());\n        execParam.setVariables(param.getVariables());\n        execParam.setClientInfo(param.getClientInfo());\n        return execParam;\n    }\n\n    public List<com.jd.easyflow.processunit.domain.model.vo.QueryAsyncInstanceVO.VariableEntry> convertVariableList(List<VariableEntry> list) {\n        if ( list == null ) {\n            return null;\n        }\n\n        List<com.jd.easyflow.processunit.domain.model.vo.QueryAsyncInstanceVO.VariableEntry> list1 = new ArrayList<com.jd.easyflow.processunit.domain.model.vo.QueryAsyncInstanceVO.VariableEntry>( list.size() );\n        for ( VariableEntry variableEntry : list ) {\n            list1.add( variableEntryToVariableEntry( variableEntry ) );\n        }\n\n        return list1;\n    }\n\n    protected com.jd.easyflow.processunit.domain.model.vo.QueryAsyncInstanceVO.VariableEntry variableEntryToVariableEntry(VariableEntry variableEntry) {\n        if ( variableEntry == null ) {\n            return null;\n        }\n\n        com.jd.easyflow.processunit.domain.model.vo.QueryAsyncInstanceVO.VariableEntry variableEntry1 = new com.jd.easyflow.processunit.domain.model.vo.QueryAsyncInstanceVO.VariableEntry();\n\n        variableEntry1.setName( variableEntry.getName() );\n        variableEntry1.setOperator( variableEntry.getOperator() );\n        variableEntry1.setValue( variableEntry.getValue() );\n\n        return variableEntry1;\n    }\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/model/entity/ProcessUnitEntity.java",
    "content": "package com.jd.easyflow.processunit.domain.model.entity;\n\nimport java.util.Map;\n\n/**\n * \n * @author liyuliang5\n * \n */\npublic class ProcessUnitEntity {\n\n    private String processUnitCode;\n\n    private String parentCode;\n\n    private String name;\n\n    private Map<String, Object> configMap;\n\n    private String status;\n\n\n    public Object getConfig(String key) {\n        if (configMap == null) {\n            return null;\n        }\n        return configMap.get(key);\n    }\n\n\n    public String getProcessUnitCode() {\n        return processUnitCode;\n    }\n\n\n    public void setProcessUnitCode(String processUnitCode) {\n        this.processUnitCode = processUnitCode;\n    }\n\n\n    public String getParentCode() {\n        return parentCode;\n    }\n\n\n    public void setParentCode(String parentCode) {\n        this.parentCode = parentCode;\n    }\n\n\n    public String getName() {\n        return name;\n    }\n\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n\n    public Map<String, Object> getConfigMap() {\n        return configMap;\n    }\n\n\n    public void setConfigMap(Map<String, Object> configMap) {\n        this.configMap = configMap;\n    }\n\n\n    public String getStatus() {\n        return status;\n    }\n\n\n    public void setStatus(String status) {\n        this.status = status;\n    }\n\n\n    @Override\n    public String toString() {\n        return \"ProcessUnitEntity [processUnitCode=\" + processUnitCode + \", parentCode=\" + parentCode + \", name=\" + name\n                + \", configMap=\" + configMap + \", status=\" + status + \"]\";\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/model/entity/ProcessUnitExecutionEntity.java",
    "content": " package com.jd.easyflow.processunit.domain.model.entity;\n\nimport java.util.Date;\n\n/**\n  * @author liyuliang5\n  * \n  */\n public class ProcessUnitExecutionEntity {\n     \n     private Long id;\n\n     private String executionNo;\n     \n     private String requestNo;\n     \n     private String parentNo;\n     \n     private String instanceNo;\n     \n     private String processUnitCode;\n     \n     private String bizNo;\n     \n     private String productCode;\n     \n     private String result;\n\n     private String requestContent;\n     \n     private String responseContent;\n     \n     private String execType;\n          \n     private String extData;\n          \n     private Date requestTime;\n     \n     private Date responseTime;\n     \n     private int elaspeTime;\n     \n     private Date createdDate;\n     \n     private Date modifiedDate;\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getExecutionNo() {\n        return executionNo;\n    }\n\n    public void setExecutionNo(String executionNo) {\n        this.executionNo = executionNo;\n    }\n\n    public String getRequestNo() {\n        return requestNo;\n    }\n\n    public void setRequestNo(String requestNo) {\n        this.requestNo = requestNo;\n    }\n\n    public String getParentNo() {\n        return parentNo;\n    }\n\n    public void setParentNo(String parentNo) {\n        this.parentNo = parentNo;\n    }\n\n    public String getInstanceNo() {\n        return instanceNo;\n    }\n\n    public void setInstanceNo(String instanceNo) {\n        this.instanceNo = instanceNo;\n    }\n\n    public String getProcessUnitCode() {\n        return processUnitCode;\n    }\n\n    public void setProcessUnitCode(String processUnitCode) {\n        this.processUnitCode = processUnitCode;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n\n    public String getResult() {\n        return result;\n    }\n\n    public void setResult(String result) {\n        this.result = result;\n    }\n\n    public String getRequestContent() {\n        return requestContent;\n    }\n\n    public void setRequestContent(String requestContent) {\n        this.requestContent = requestContent;\n    }\n\n    public String getResponseContent() {\n        return responseContent;\n    }\n\n    public void setResponseContent(String responseContent) {\n        this.responseContent = responseContent;\n    }\n\n    public String getExecType() {\n        return execType;\n    }\n\n    public void setExecType(String execType) {\n        this.execType = execType;\n    }\n\n    public String getExtData() {\n        return extData;\n    }\n\n    public void setExtData(String extData) {\n        this.extData = extData;\n    }\n\n    public Date getRequestTime() {\n        return requestTime;\n    }\n\n    public void setRequestTime(Date requestTime) {\n        this.requestTime = requestTime;\n    }\n\n    public Date getResponseTime() {\n        return responseTime;\n    }\n\n    public void setResponseTime(Date responseTime) {\n        this.responseTime = responseTime;\n    }\n\n    public int getElaspeTime() {\n        return elaspeTime;\n    }\n\n    public void setElaspeTime(int elaspeTime) {\n        this.elaspeTime = elaspeTime;\n    }\n\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n\n    @Override\n    public String toString() {\n        return \"ProcessUnitExecutionEntity [id=\" + id + \", executionNo=\" + executionNo + \", requestNo=\" + requestNo\n                + \", parentNo=\" + parentNo + \", instanceNo=\" + instanceNo + \", processUnitCode=\" + processUnitCode + \", bizNo=\" + bizNo\n                + \", productCode=\" + productCode + \", result=\" + result + \", requestContent=\" + requestContent\n                + \", responseContent=\" + responseContent + \", execType=\" + execType + \", extData=\" + extData\n                + \", requestTime=\" + requestTime + \", responseTime=\" + responseTime + \", elaspeTime=\" + elaspeTime\n                + \", createdDate=\" + createdDate + \", modifiedDate=\" + modifiedDate + \"]\";\n    }\n     \n     \n     \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/model/entity/ProcessUnitInstanceEntity.java",
    "content": " package com.jd.easyflow.processunit.domain.model.entity;\n\nimport java.util.Date;\n\n/**\n  * @author liyuliang5\n  * \n  */\n public class ProcessUnitInstanceEntity {\n     \n     private Long id;\n\n     private String instanceNo;\n     \n     private String bizNo;\n     \n     private String parentNo;\n     \n     private String processUnitCode;\n     \n     private String productCode;\n     \n     private String result;\n     \n     private String requestContent;\n     \n     private String responseContent;\n     \n     private String vars;\n     \n     private String extData;\n     \n     private Date createdDate;\n     \n     private Date modifiedDate;\n\n     private Boolean autoRunFlag;\n\n     private Integer autoRunTimes;\n\n     private Date nextAutoRunTime;\n    public Long getId() {\n        return id;\n    }\n    public void setId(Long id) {\n        this.id = id;\n    }\n    public String getInstanceNo() {\n        return instanceNo;\n    }\n    public void setInstanceNo(String instanceNo) {\n        this.instanceNo = instanceNo;\n    }\n    public String getBizNo() {\n        return bizNo;\n    }\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n    public String getParentNo() {\n        return parentNo;\n    }\n    public void setParentNo(String parentNo) {\n        this.parentNo = parentNo;\n    }\n    public String getProcessUnitCode() {\n        return processUnitCode;\n    }\n    public void setProcessUnitCode(String processUnitCode) {\n        this.processUnitCode = processUnitCode;\n    }\n    public String getProductCode() {\n        return productCode;\n    }\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n    public String getResult() {\n        return result;\n    }\n    public void setResult(String result) {\n        this.result = result;\n    }\n    public String getRequestContent() {\n        return requestContent;\n    }\n    public void setRequestContent(String requestContent) {\n        this.requestContent = requestContent;\n    }\n    public String getResponseContent() {\n        return responseContent;\n    }\n    public void setResponseContent(String responseContent) {\n        this.responseContent = responseContent;\n    }\n    public String getExtData() {\n        return extData;\n    }\n    public void setExtData(String extData) {\n        this.extData = extData;\n    }\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n    public Boolean getAutoRunFlag() {\n        return autoRunFlag;\n    }\n    public void setAutoRunFlag(Boolean autoRunFlag) {\n        this.autoRunFlag = autoRunFlag;\n    }\n    public Integer getAutoRunTimes() {\n        return autoRunTimes;\n    }\n    public void setAutoRunTimes(Integer autoRunTimes) {\n        this.autoRunTimes = autoRunTimes;\n    }\n    public Date getNextAutoRunTime() {\n        return nextAutoRunTime;\n    }\n    public void setNextAutoRunTime(Date nextAutoRunTime) {\n        this.nextAutoRunTime = nextAutoRunTime;\n    }\n    public String getVars() {\n        return vars;\n    }\n    public void setVars(String vars) {\n        this.vars = vars;\n    }\n    @Override\n    public String toString() {\n        return \"ProcessUnitInstanceEntity [id=\" + id + \", instanceNo=\" + instanceNo + \", bizNo=\" + bizNo + \", parentNo=\"\n                + parentNo + \", processUnitCode=\" + processUnitCode + \", productCode=\" + productCode + \", result=\"\n                + result + \", requestContent=\" + requestContent + \", responseContent=\" + responseContent + \",vars=\" + vars + \", extData=\"\n                + extData + \", createdDate=\" + createdDate + \", modifiedDate=\" + modifiedDate + \", autoRunFlag=\"\n                + autoRunFlag + \", autoRunTimes=\" + autoRunTimes + \", nextAutoRunTime=\" + nextAutoRunTime + \"]\";\n    }\n     \n     \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/model/enums/ProcessUnitErrorCodeEnum.java",
    "content": "package com.jd.easyflow.processunit.domain.model.enums;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic enum ProcessUnitErrorCodeEnum {\n\n    PU_0101(\"Process unit server stopped\");\n\n    private String desc;\n\n    ProcessUnitErrorCodeEnum(String desc) {\n        this.desc = desc;\n    }\n\n    public String getDesc() {\n        return desc;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/model/vo/BatchExecuteReq.java",
    "content": " package com.jd.easyflow.processunit.domain.model.vo;\n\nimport java.util.Date;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n  * @author liyuliang5\n  * \n  */\n public class BatchExecuteReq {\n     \n\n     public static final String TYPE_BATCH = \"batch\";\n\n     public static final String TYPE_AUTO = \"auto\";\n\n\n     private String type;\n     \n     private List<String> bizNoList;\n     \n     private List<String> instanceNoList;\n     \n     private Map<String, Object> requestContext;\n     \n     private List<String> processUnitCodeList;\n\n     private List<String> excludeProcessUnitCodeList;\n\n     private List<String> productCodeList;\n\n     private List<String> excludeProductCodeList;\n     \n\n     private List<String> resultList;\n\n     private Date nextAutoRunTimeStart;\n     \n     private Date nextAutoRunTimeEnd;\n\n     private Integer nextAutoRunTimeMaxInterval;\n     \n     private List<VariableEntry> variableList;\n     \n     private String batchRunPolicy;\n     \n     private Integer threadNum;\n     \n     \n     public String getType() {\n        return type;\n    }\n\n\n\n    public void setType(String type) {\n        this.type = type;\n    }\n\n\n\n    public List<String> getInstanceNoList() {\n        return instanceNoList;\n    }\n\n\n\n    public void setInstanceNoList(List<String> instanceNoList) {\n        this.instanceNoList = instanceNoList;\n    }\n\n\n\n    public Map<String, Object> getRequestContext() {\n        return requestContext;\n    }\n\n\n\n    public void setRequestContext(Map<String, Object> requestContext) {\n        this.requestContext = requestContext;\n    }\n\n\n\n    public List<String> getProcessUnitCodeList() {\n        return processUnitCodeList;\n    }\n\n\n\n    public void setProcessUnitCodeList(List<String> processUnitCodeList) {\n        this.processUnitCodeList = processUnitCodeList;\n    }\n\n\n\n    public List<String> getExcludeProcessUnitCodeList() {\n        return excludeProcessUnitCodeList;\n    }\n\n\n\n    public void setExcludeProcessUnitCodeList(List<String> excludeProcessUnitCodeList) {\n        this.excludeProcessUnitCodeList = excludeProcessUnitCodeList;\n    }\n\n\n\n    public List<String> getProductCodeList() {\n        return productCodeList;\n    }\n\n\n\n    public void setProductCodeList(List<String> productCodeList) {\n        this.productCodeList = productCodeList;\n    }\n\n\n\n    public List<String> getExcludeProductCodeList() {\n        return excludeProductCodeList;\n    }\n\n\n\n    public void setExcludeProductCodeList(List<String> excludeProductCodeList) {\n        this.excludeProductCodeList = excludeProductCodeList;\n    }\n\n\n\n    public List<String> getResultList() {\n        return resultList;\n    }\n\n\n\n    public void setResultList(List<String> resultList) {\n        this.resultList = resultList;\n    }\n\n\n\n    public Date getNextAutoRunTimeStart() {\n        return nextAutoRunTimeStart;\n    }\n\n\n\n    public void setNextAutoRunTimeStart(Date nextAutoRunTimeStart) {\n        this.nextAutoRunTimeStart = nextAutoRunTimeStart;\n    }\n\n\n\n    public Integer getNextAutoRunTimeMaxInterval() {\n        return nextAutoRunTimeMaxInterval;\n    }\n\n\n\n    public void setNextAutoRunTimeMaxInterval(Integer nextAutoRunTimeMaxInterval) {\n        this.nextAutoRunTimeMaxInterval = nextAutoRunTimeMaxInterval;\n    }\n\n\n\n    public List<VariableEntry> getVariableList() {\n        return variableList;\n    }\n\n\n\n    public void setVariableList(List<VariableEntry> variableList) {\n        this.variableList = variableList;\n    }\n\n    public List<String> getBizNoList() {\n        return bizNoList;\n    }\n\n\n\n    public void setBizNoList(List<String> bizNoList) {\n        this.bizNoList = bizNoList;\n    }\n\n\n    public String getBatchRunPolicy() {\n        return batchRunPolicy;\n    }\n\n\n\n    public void setBatchRunPolicy(String batchRunPolicy) {\n        this.batchRunPolicy = batchRunPolicy;\n    }\n\n\n\n    public Integer getThreadNum() {\n        return threadNum;\n    }\n\n\n\n    public void setThreadNum(Integer threadNum) {\n        this.threadNum = threadNum;\n    }\n    \n    public Date getNextAutoRunTimeEnd() {\n        return nextAutoRunTimeEnd;\n    }\n\n\n\n    public void setNextAutoRunTimeEnd(Date nextAutoRunTimeEnd) {\n        this.nextAutoRunTimeEnd = nextAutoRunTimeEnd;\n    }\n\n\n\n    @Override\n    public String toString() {\n        return \"BatchExecuteReq [type=\" + type + \", instanceNoList=\" + instanceNoList + \", requestContext=\"\n                + requestContext + \", bizNoList=\" + bizNoList\n                + \", processUnitCodeList=\" + processUnitCodeList + \", excludeProcessUnitCodeList=\"\n                + excludeProcessUnitCodeList + \", productCodeList=\" + productCodeList + \", excludeProductCodeList=\"\n                + excludeProductCodeList + \", resultList=\" + resultList + \", nextAutoRunTimeStart=\"\n                + nextAutoRunTimeStart+ \", nextAutoRunTimeEnd=\" + nextAutoRunTimeEnd + \", nextAutoRunTimeMaxInterval=\" + nextAutoRunTimeMaxInterval\n                + \", variableList=\" + variableList + \", batchRunPolicy=\" + batchRunPolicy + \", threadNum=\" + threadNum + \"]\";\n    }\n\n\n\n     public static class VariableEntry {\n         private String name;\n         private String operator;\n         private String value;\n        public String getName() {\n            return name;\n        }\n        public void setName(String name) {\n            this.name = name;\n        }\n        public String getOperator() {\n            return operator;\n        }\n        public void setOperator(String operator) {\n            this.operator = operator;\n        }\n        public String getValue() {\n            return value;\n        }\n        public void setValue(String value) {\n            this.value = value;\n        }\n        @Override\n        public String toString() {\n            return \"VariableEntry [name=\" + name + \", operator=\" + operator + \", value=\" + value + \"]\";\n        }\n         \n         \n     }\n     \n}\n\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/model/vo/BatchExecuteRes.java",
    "content": " package com.jd.easyflow.processunit.domain.model.vo;\n\n /**\n  * @author liyuliang5\n  * \n  */\n public class BatchExecuteRes {\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/model/vo/ExecContext.java",
    "content": "package com.jd.easyflow.processunit.domain.model.vo;\n\nimport java.util.Map;\n\nimport com.jd.easyflow.processunit.domain.model.entity.ProcessUnitEntity;\nimport com.jd.easyflow.processunit.domain.model.entity.ProcessUnitExecutionEntity;\nimport com.jd.easyflow.processunit.domain.model.entity.ProcessUnitInstanceEntity;\n\n/**\n * @author liyuliang5\n * \n */\npublic class ExecContext {\n    \n    public ExecContext() {\n        // NOOP\n    }\n    \n    public ExecContext(ExecParam param) {\n        this.param = param;\n        this.result = new ExecResult();\n    }\n    \n    private String unitCode;\n    \n    private String bizNo;\n    \n    private ProcessUnitEntity processUnit;\n    \n    private boolean newInstance;\n    \n    private ProcessUnitInstanceEntity instance;\n    \n    private ProcessUnitExecutionEntity execution;\n    \n    private ExecParam param;\n    \n    private ExecResult result;\n    \n    private boolean locked;\n    \n    private String lockRequestId;\n    \n    private boolean executed;\n\n    private boolean realCall;\n\n    private ExecPolicy policy;\n\n    private String executionNo;\n\n    private String instanceNo;\n\n    private String lastResult;\n\n    private String lastRequestContent;\n\n    private String lastResponseContent;\n\n    private long requestTime = 0;\n    \n    private String parentNo;\n    \n    private Map<String, String> variables;\n    \n    private Map<String, String> clientInfo;\n    \n    private String extDataStr;    \n\n    public String getUnitCode() {\n        return unitCode;\n    }\n\n    public void setUnitCode(String unitCode) {\n        this.unitCode = unitCode;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    public ProcessUnitEntity getProcessUnit() {\n        return processUnit;\n    }\n\n    public void setProcessUnit(ProcessUnitEntity processUnit) {\n        this.processUnit = processUnit;\n    }\n\n    public boolean isNewInstance() {\n        return newInstance;\n    }\n\n    public void setNewInstance(boolean newInstance) {\n        this.newInstance = newInstance;\n    }\n\n    public ProcessUnitInstanceEntity getInstance() {\n        return instance;\n    }\n\n    public void setInstance(ProcessUnitInstanceEntity instance) {\n        this.instance = instance;\n    }\n\n    public ProcessUnitExecutionEntity getExecution() {\n        return execution;\n    }\n\n    public void setExecution(ProcessUnitExecutionEntity execution) {\n        this.execution = execution;\n    }\n\n    public ExecParam getParam() {\n        return param;\n    }\n\n    public void setParam(ExecParam param) {\n        this.param = param;\n    }\n\n    public ExecResult getResult() {\n        return result;\n    }\n\n    public void setResult(ExecResult result) {\n        this.result = result;\n    }\n\n    public boolean isLocked() {\n        return locked;\n    }\n\n    public void setLocked(boolean locked) {\n        this.locked = locked;\n    }\n\n    public String getLockRequestId() {\n        return lockRequestId;\n    }\n\n    public void setLockRequestId(String lockRequestId) {\n        this.lockRequestId = lockRequestId;\n    }\n\n    public boolean isExecuted() {\n        return executed;\n    }\n\n    public void setExecuted(boolean executed) {\n        this.executed = executed;\n    }\n\n    public boolean isRealCall() {\n        return realCall;\n    }\n\n    public void setRealCall(boolean realCall) {\n        this.realCall = realCall;\n    }\n\n    public ExecPolicy getPolicy() {\n        return policy;\n    }\n\n    public void setPolicy(ExecPolicy policy) {\n        this.policy = policy;\n    }\n\n    public String getExecutionNo() {\n        return executionNo;\n    }\n\n    public void setExecutionNo(String executionNo) {\n        this.executionNo = executionNo;\n    }\n\n    public String getInstanceNo() {\n        return instanceNo;\n    }\n\n    public void setInstanceNo(String instanceNo) {\n        this.instanceNo = instanceNo;\n    }\n\n    public String getLastResult() {\n        return lastResult;\n    }\n\n    public void setLastResult(String lastResult) {\n        this.lastResult = lastResult;\n    }\n\n    public String getLastRequestContent() {\n        return lastRequestContent;\n    }\n\n    public void setLastRequestContent(String lastRequestContent) {\n        this.lastRequestContent = lastRequestContent;\n    }\n\n    public String getLastResponseContent() {\n        return lastResponseContent;\n    }\n\n    public void setLastResponseContent(String lastResponseContent) {\n        this.lastResponseContent = lastResponseContent;\n    }\n\n    public long getRequestTime() {\n        return requestTime;\n    }\n\n    public void setRequestTime(long requestTime) {\n        this.requestTime = requestTime;\n    }\n\n    public String getParentNo() {\n        return parentNo;\n    }\n\n    public void setParentNo(String parentNo) {\n        this.parentNo = parentNo;\n    }\n\n    public Map<String, String> getVariables() {\n        return variables;\n    }\n\n    public void setVariables(Map<String, String> variables) {\n        this.variables = variables;\n    }\n    \n    public Map<String, String> getClientInfo() {\n        return clientInfo;\n    }\n\n    public void setClientInfo(Map<String, String> clientInfo) {\n        this.clientInfo = clientInfo;\n    }\n    \n    public String getExtDataStr() {\n        return extDataStr;\n    }\n\n    public void setExtDataStr(String extDataStr) {\n        this.extDataStr = extDataStr;\n    }\n\n\n    @Override\n    public String toString() {\n        return \"ExecContext [unitCode=\" + unitCode + \", bizNo=\" + bizNo + \", processUnit=\" + processUnit\n                + \", newInstance=\" + newInstance + \", instance=\" + instance + \", execution=\" + execution + \", param=\"\n                + param + \", result=\" + result + \", locked=\" + locked + \", lockRequestId=\" + lockRequestId\n                + \", executed=\" + executed + \", realCall=\" + realCall + \", policy=\" + policy + \", executionNo=\"\n                + executionNo + \", instanceNo=\" + instanceNo + \", lastResult=\" + lastResult + \", lastRequestContent=\"\n                + lastRequestContent + \", lastResponseContent=\" + lastResponseContent + \", requestTime=\" + requestTime\n                + \", parentNo=\" + parentNo + \", variables=\" + variables + \", clientInfo=\" + clientInfo  + \", extDataStr=\" + extDataStr + \"]\";\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/model/vo/ExecParam.java",
    "content": "package com.jd.easyflow.processunit.domain.model.vo;\n\nimport java.util.Date;\nimport java.util.Map;\n\n/**\n * @author liyuliang5\n * \n */\npublic class ExecParam {\n\n    private String unitCode;\n    \n    private String bizNo;\n    \n    private String requestNo;\n                \n    private String requestContent;\n    \n    private String instanceNo;\n    \n    private String executionNo;\n\n    private String execType;\n\n    private Map<String, Object> requestContext;\n    \n    private String productCode;\n\n    private String version;\n\n    private Boolean autoRunFlag;\n\n    private Date nextAutoRunTime;\n    \n    private Map<String, String> variables;\n    \n    private Map<String, String> clientInfo;\n\n    public String getUnitCode() {\n        return unitCode;\n    }\n\n    public void setUnitCode(String unitCode) {\n        this.unitCode = unitCode;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    public String getRequestNo() {\n        return requestNo;\n    }\n\n    public void setRequestNo(String requestNo) {\n        this.requestNo = requestNo;\n    }\n\n    public String getRequestContent() {\n        return requestContent;\n    }\n\n    public void setRequestContent(String requestContent) {\n        this.requestContent = requestContent;\n    }\n\n    public String getInstanceNo() {\n        return instanceNo;\n    }\n\n    public void setInstanceNo(String instanceNo) {\n        this.instanceNo = instanceNo;\n    }\n\n    public String getExecutionNo() {\n        return executionNo;\n    }\n\n    public void setExecutionNo(String executionNo) {\n        this.executionNo = executionNo;\n    }\n\n    public String getExecType() {\n        return execType;\n    }\n\n    public void setExecType(String execType) {\n        this.execType = execType;\n    }\n\n    public Map<String, Object> getRequestContext() {\n        return requestContext;\n    }\n\n    public void setRequestContext(Map<String, Object> requestContext) {\n        this.requestContext = requestContext;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n\n    public String getVersion() {\n        return version;\n    }\n\n    public void setVersion(String version) {\n        this.version = version;\n    }\n    \n    \n\n    public Boolean getAutoRunFlag() {\n        return autoRunFlag;\n    }\n\n    public void setAutoRunFlag(Boolean autoRunFlag) {\n        this.autoRunFlag = autoRunFlag;\n    }\n\n    public Date getNextAutoRunTime() {\n        return nextAutoRunTime;\n    }\n\n    public void setNextAutoRunTime(Date nextAutoRunTime) {\n        this.nextAutoRunTime = nextAutoRunTime;\n    }\n\n    public Map<String, String> getVariables() {\n        return variables;\n    }\n\n    public void setVariables(Map<String, String> variables) {\n        this.variables = variables;\n    }\n    \n    public Map<String, String> getClientInfo() {\n        return clientInfo;\n    }\n\n    public void setClientInfo(Map<String, String> clientInfo) {\n        this.clientInfo = clientInfo;\n    }\n\n    @Override\n    public String toString() {\n        return \"ExecParam [unitCode=\" + unitCode + \", bizNo=\" + bizNo + \", requestNo=\" + requestNo + \", requestContent=\"\n                + requestContent + \", instanceNo=\" + instanceNo + \", executionNo=\" + executionNo + \", execType=\"\n                + execType + \", requestContext=\" + requestContext + \", productCode=\" + productCode + \", version=\"\n                + version + \", autoRunFlag=\" + autoRunFlag + \", nextAutoRunTime=\" + nextAutoRunTime + \", variables=\"\n                + variables + \", clientInfo=\" + clientInfo + \"]\";\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/model/vo/ExecPolicy.java",
    "content": "package com.jd.easyflow.processunit.domain.model.vo;\n\n/**\n * @author liyuliang5\n * \n */\npublic class ExecPolicy {\n\n    private String policyType;\n    \n    private String policyData;\n    \n    private String result;\n\n    private String requestContent;\n\n    private String responseContent;\n    \n    public ExecPolicy() {\n        // NOOP\n    }\n    \n    public ExecPolicy(String policyType) {\n        this.policyType = policyType;\n    }\n\n    public String getPolicyType() {\n        return policyType;\n    }\n\n    public void setPolicyType(String policyType) {\n        this.policyType = policyType;\n    }\n\n    public String getPolicyData() {\n        return policyData;\n    }\n\n    public void setPolicyData(String policyData) {\n        this.policyData = policyData;\n    }\n\n    public String getResult() {\n        return result;\n    }\n\n    public void setResult(String result) {\n        this.result = result;\n    }\n\n    public String getRequestContent() {\n        return requestContent;\n    }\n\n    public void setRequestContent(String requestContent) {\n        this.requestContent = requestContent;\n    }\n\n    public String getResponseContent() {\n        return responseContent;\n    }\n\n    public void setResponseContent(String responseContent) {\n        this.responseContent = responseContent;\n    }\n\n    @Override\n    public String toString() {\n        return \"ExecPolicy [policyType=\" + policyType + \", policyData=\" + policyData + \", result=\" + result\n                + \", requestContent=\" + requestContent + \", responseContent=\" + responseContent + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/model/vo/ExecResult.java",
    "content": "package com.jd.easyflow.processunit.domain.model.vo;\n\nimport java.util.Date;\nimport java.util.Map;\n\n/**\n * @author liyuliang5\n * \n */\npublic class ExecResult {\n    \n    public ExecResult() {\n        \n    }\n    \n    public ExecResult(String result, String responseContent, Map<String, String> variables) {\n        this.result = result;\n        this.responseContent = responseContent;\n        this.variables = variables;\n    }\n    \n    private String result;\n    \n    private String responseContent;\n    \n    private Map<String, String> variables;\n    \n    private Boolean autoRunFlag;\n    \n    private Date nextAutoRunTime;\n\n    public String getResult() {\n        return result;\n    }\n\n    public void setResult(String result) {\n        this.result = result;\n    }\n\n    public String getResponseContent() {\n        return responseContent;\n    }\n\n    public void setResponseContent(String responseContent) {\n        this.responseContent = responseContent;\n    }\n\n    public Map<String, String> getVariables() {\n        return variables;\n    }\n\n    public void setVariables(Map<String, String> variables) {\n        this.variables = variables;\n    }\n    \n\n    public Boolean getAutoRunFlag() {\n        return autoRunFlag;\n    }\n\n    public void setAutoRunFlag(Boolean autoRunFlag) {\n        this.autoRunFlag = autoRunFlag;\n    }\n\n    public Date getNextAutoRunTime() {\n        return nextAutoRunTime;\n    }\n\n    public void setNextAutoRunTime(Date nextAutoRunTime) {\n        this.nextAutoRunTime = nextAutoRunTime;\n    }\n\n    @Override\n    public String toString() {\n        return \"ExecResult [result=\" + result + \", responseContent=\" + responseContent + \", variables=\" + variables\n                + \", autoRunFlag=\" + autoRunFlag + \", nextAutoRunTime=\" + nextAutoRunTime + \"]\";\n    }\n\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/model/vo/ExecuteReq.java",
    "content": " package com.jd.easyflow.processunit.domain.model.vo;\n\n /**\n  * @author liyuliang5\n  * \n  */\npublic class ExecuteReq {\n\n    private String unitInstanceNo;\n    \n    private String unitCode;\n    \n    private String bizNo;\n\n    public String getUnitInstanceNo() {\n        return unitInstanceNo;\n    }\n\n    public void setUnitInstanceNo(String unitInstanceNo) {\n        this.unitInstanceNo = unitInstanceNo;\n    }\n    \n    public String getUnitCode() {\n        return unitCode;\n    }\n\n    public void setUnitCode(String unitCode) {\n        this.unitCode = unitCode;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    @Override\n    public String toString() {\n        return \"ExecuteReq [unitInstanceNo=\" + unitInstanceNo + \", unitCode=\" + unitCode + \", bizNo=\" + bizNo + \"]\";\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/model/vo/ExecuteRes.java",
    "content": " package com.jd.easyflow.processunit.domain.model.vo;\n\n /**\n  * @author liyuliang5\n  * \n  */\npublic class ExecuteRes {\n    \n    public ExecuteRes() {\n        \n    }\n    \n    public ExecuteRes(String result, String responseContent) {\n        this.result = result;\n        this.responseContent = responseContent;\n    }\n\n     private String result;\n     \n     private String responseContent;\n\n    public String getResult() {\n        return result;\n    }\n\n    public void setResult(String result) {\n        this.result = result;\n    }\n\n    public String getResponseContent() {\n        return responseContent;\n    }\n\n    public void setResponseContent(String responseContent) {\n        this.responseContent = responseContent;\n    }\n\n    @Override\n    public String toString() {\n        return \"ExecuteRes [result=\" + result + \", responseContent=\" + responseContent + \"]\";\n    }\n     \n     \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/model/vo/ProcessUnitExecuteMessage.java",
    "content": "package com.jd.easyflow.processunit.domain.model.vo;\n\n/**\n * @author liyuliang5\n * \n */\npublic class ProcessUnitExecuteMessage {\n\n\tprivate String instanceNo;\n\t\n\tprivate String unitCode;\n\t\n\tprivate String bizNo;\n\n    public String getInstanceNo() {\n        return instanceNo;\n    }\n\n    public void setInstanceNo(String instanceNo) {\n        this.instanceNo = instanceNo;\n    }\n    \n    public String getUnitCode() {\n        return unitCode;\n    }\n\n    public void setUnitCode(String unitCode) {\n        this.unitCode = unitCode;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    @Override\n    public String toString() {\n        return \"ProcessUnitExecuteMessage [instanceNo=\" + instanceNo + \", unitCode=\" + unitCode + \", bizNo=\" + bizNo\n                + \"]\";\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/model/vo/ProcessUnitInstanceKey.java",
    "content": "package com.jd.easyflow.processunit.domain.model.vo;\n\n/**\n * \n * @author liyuliang5\n */\npublic class ProcessUnitInstanceKey {\n\n    private String instanceNo;\n    \n    private String unitCode;\n    \n    private String bizNo;\n    \n    public ProcessUnitInstanceKey() {\n        \n    }\n    \n    public ProcessUnitInstanceKey(String instanceNo) {\n        this.instanceNo = instanceNo;\n    }\n    \n    public ProcessUnitInstanceKey(String unitCode, String bizNo) {\n        this.unitCode = unitCode;\n        this.bizNo = bizNo;\n    }\n    \n    public ProcessUnitInstanceKey(String instanceNo, String unitCode, String bizNo) {\n        this.instanceNo = instanceNo;\n        this.unitCode = unitCode;\n        this.bizNo = bizNo;\n    }\n\n    public String getInstanceNo() {\n        return instanceNo;\n    }\n\n    public void setInstanceNo(String instanceNo) {\n        this.instanceNo = instanceNo;\n    }\n\n    public String getUnitCode() {\n        return unitCode;\n    }\n\n    public void setUnitCode(String unitCode) {\n        this.unitCode = unitCode;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    @Override\n    public String toString() {\n        return \"ProcessUnitInstanceKey [instanceNo=\" + instanceNo + \", unitCode=\" + unitCode + \", bizNo=\" + bizNo + \"]\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/model/vo/QueryAsyncInstanceVO.java",
    "content": " package com.jd.easyflow.processunit.domain.model.vo;\n\n import java.util.Date;\nimport java.util.List;\n\n/**\n  * @author liyuliang5\n  * \n  */\n public class QueryAsyncInstanceVO {\n\n     private String unitCode;\n     \n     private Date nextAutoRunTime;\n     \n     private Date nextAutoRunTimeStart;\n\n     private List<String> productCodeList;\n     \n     private List<String> excludeProductCodeList;\n     \n     private List<String> resultList;\n\n     private List<VariableEntry> variableList;\n     \n     private Integer maxCount;\n     \n     \n     \n     public String getUnitCode() {\n        return unitCode;\n    }\n\n\n\n    public void setUnitCode(String unitCode) {\n        this.unitCode = unitCode;\n    }\n\n\n\n    public Date getNextAutoRunTime() {\n        return nextAutoRunTime;\n    }\n\n\n\n    public void setNextAutoRunTime(Date nextAutoRunTime) {\n        this.nextAutoRunTime = nextAutoRunTime;\n    }\n\n\n\n    public Date getNextAutoRunTimeStart() {\n        return nextAutoRunTimeStart;\n    }\n\n\n\n    public void setNextAutoRunTimeStart(Date nextAutoRunTimeStart) {\n        this.nextAutoRunTimeStart = nextAutoRunTimeStart;\n    }\n\n\n\n    public List<String> getProductCodeList() {\n        return productCodeList;\n    }\n\n\n\n    public void setProductCodeList(List<String> productCodeList) {\n        this.productCodeList = productCodeList;\n    }\n\n\n\n    public List<String> getExcludeProductCodeList() {\n        return excludeProductCodeList;\n    }\n\n\n\n    public void setExcludeProductCodeList(List<String> excludeProductCodeList) {\n        this.excludeProductCodeList = excludeProductCodeList;\n    }\n\n\n\n    public List<String> getResultList() {\n        return resultList;\n    }\n\n\n\n    public void setResultList(List<String> resultList) {\n        this.resultList = resultList;\n    }\n\n\n\n    public List<VariableEntry> getVariableList() {\n        return variableList;\n    }\n\n\n\n    public void setVariableList(List<VariableEntry> variableList) {\n        this.variableList = variableList;\n    }\n    \n\n    public Integer getMaxCount() {\n        return maxCount;\n    }\n\n\n\n    public void setMaxCount(Integer maxCount) {\n        this.maxCount = maxCount;\n    }\n\n\n\n    @Override\n    public String toString() {\n        return \"QueryAsyncInstanceVO [unitCode=\" + unitCode + \", nextAutoRunTime=\" + nextAutoRunTime\n                + \", nextAutoRunTimeStart=\" + nextAutoRunTimeStart + \", productCodeList=\" + productCodeList\n                + \", excludeProductCodeList=\" + excludeProductCodeList + \", resultList=\" + resultList + \", maxCount=\" + maxCount\n                + \", variableList=\" + variableList + \"]\";\n    }\n\n\n\n     public static class VariableEntry {\n         private String name;\n         private String operator;\n         private String value;\n        public String getName() {\n            return name;\n        }\n        public void setName(String name) {\n            this.name = name;\n        }\n        public String getOperator() {\n            return operator;\n        }\n        public void setOperator(String operator) {\n            this.operator = operator;\n        }\n        public String getValue() {\n            return value;\n        }\n        public void setValue(String value) {\n            this.value = value;\n        }\n        @Override\n        public String toString() {\n            return \"VariableEntry [name=\" + name + \", operator=\" + operator + \", value=\" + value + \"]\";\n        }\n         \n         \n     }\n     \n}\n\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/model/vo/ShardingCompareContext.java",
    "content": "package com.jd.easyflow.processunit.domain.model.vo;\n\nimport java.util.Date;\nimport java.util.List;\nimport java.util.concurrent.atomic.AtomicLong;\n\n/**\n * \n * @author liyuliang5\n */\npublic class ShardingCompareContext {\n\n    private List<String> unitCodeList;\n    private Date createdDateStart = null;\n    private Date createdDateEnd = null;\n    private int pageSize = 1000;\n    private int threadCount = 1;\n    private boolean lock;\n    private AtomicLong failCount = new AtomicLong();\n    private List<String> resultList;\n    private String instanceNo;\n    public List<String> getUnitCodeList() {\n        return unitCodeList;\n    }\n    public void setUnitCodeList(List<String> unitCodeList) {\n        this.unitCodeList = unitCodeList;\n    }\n    public Date getCreatedDateStart() {\n        return createdDateStart;\n    }\n    public void setCreatedDateStart(Date createdDateStart) {\n        this.createdDateStart = createdDateStart;\n    }\n    public Date getCreatedDateEnd() {\n        return createdDateEnd;\n    }\n    public void setCreatedDateEnd(Date createdDateEnd) {\n        this.createdDateEnd = createdDateEnd;\n    }\n    public int getPageSize() {\n        return pageSize;\n    }\n    public void setPageSize(int pageSize) {\n        this.pageSize = pageSize;\n    }\n    public int getThreadCount() {\n        return threadCount;\n    }\n    public void setThreadCount(int threadCount) {\n        this.threadCount = threadCount;\n    }\n    public boolean isLock() {\n        return lock;\n    }\n    public void setLock(boolean lock) {\n        this.lock = lock;\n    }\n    public AtomicLong getFailCount() {\n        return failCount;\n    }\n    public void setFailCount(AtomicLong failCount) {\n        this.failCount = failCount;\n    }\n    public String getInstanceNo() {\n        return instanceNo;\n    }\n    public void setInstanceNo(String instanceNo) {\n        this.instanceNo = instanceNo;\n    }\n    public List<String> getResultList() {\n        return resultList;\n    }\n    public void setResultList(List<String> resultList) {\n        this.resultList = resultList;\n    }\n    \n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/model/vo/ShardingMigrateContext.java",
    "content": "package com.jd.easyflow.processunit.domain.model.vo;\n\nimport java.util.Date;\nimport java.util.List;\n\n/**\n * \n * @author liyuliang5\n */\npublic class ShardingMigrateContext {\n    \n    private List<String> unitCodeList;\n    private Date createdDateStart = null;\n    private Date createdDateEnd = null;\n    private int pageSize = 1000;\n    private int threadCount = 1;\n    private boolean lock;\n    private boolean migrateExecution;\n    private String instanceNo;\n    private List<String> resultList;\n    private boolean newId;\n    \n    public List<String> getUnitCodeList() {\n        return unitCodeList;\n    }\n    public void setUnitCodeList(List<String> unitCodeList) {\n        this.unitCodeList = unitCodeList;\n    }\n    public Date getCreatedDateStart() {\n        return createdDateStart;\n    }\n    public void setCreatedDateStart(Date createdDateStart) {\n        this.createdDateStart = createdDateStart;\n    }\n    public Date getCreatedDateEnd() {\n        return createdDateEnd;\n    }\n    public void setCreatedDateEnd(Date createdDateEnd) {\n        this.createdDateEnd = createdDateEnd;\n    }\n    public int getPageSize() {\n        return pageSize;\n    }\n    public void setPageSize(int pageSize) {\n        this.pageSize = pageSize;\n    }\n    public int getThreadCount() {\n        return threadCount;\n    }\n    public void setThreadCount(int threadCount) {\n        this.threadCount = threadCount;\n    }\n    public boolean isLock() {\n        return lock;\n    }\n    public void setLock(boolean lock) {\n        this.lock = lock;\n    }\n    public boolean isMigrateExecution() {\n        return migrateExecution;\n    }\n    public void setMigrateExecution(boolean migrateExecution) {\n        this.migrateExecution = migrateExecution;\n    }\n    public String getInstanceNo() {\n        return instanceNo;\n    }\n    public void setInstanceNo(String instanceNo) {\n        this.instanceNo = instanceNo;\n    }\n    public boolean isNewId() {\n        return newId;\n    }\n    public void setNewId(boolean newId) {\n        this.newId = newId;\n    }\n    public List<String> getResultList() {\n        return resultList;\n    }\n    public void setResultList(List<String> resultList) {\n        this.resultList = resultList;\n    }\n    \n    \n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/model/vo/SyncAfterCallReq.java",
    "content": "package com.jd.easyflow.processunit.domain.model.vo;\n\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Objects;\n\n/**\n * @author liyuliang5\n * \n */\npublic class SyncAfterCallReq {\n\n    private String executionNo;\n\n    private String result;\n\n    private String responseContent;\n\n    private String instanceNo;\n\n    private String bizNo;\n\n    private String unitCode;\n\n    private Map<String, String> contextData;\n    \n    private Map<String, String> variables;\n    \n    private Boolean autoRunFlag;\n    \n    private Date nextAutoRunTime;\n\n    public void putData(String key, String value) {\n        initContextData();\n        contextData.put(key, value);\n    }\n\n    public <T> T getData(String key) {\n       if (Objects.isNull(contextData)) {\n          return null;\n       }\n        return (T) contextData.get(key);\n    }\n\n    private void initContextData() {\n        if (Objects.isNull(contextData)) {\n            synchronized (this) {\n                if (Objects.isNull(contextData)) {\n                    contextData = new HashMap<>();\n                }\n            }\n        }\n    }\n\n    public String getExecutionNo() {\n        return executionNo;\n    }\n\n    public void setExecutionNo(String executionNo) {\n        this.executionNo = executionNo;\n    }\n\n    public String getResult() {\n        return result;\n    }\n\n    public void setResult(String result) {\n        this.result = result;\n    }\n\n    public String getResponseContent() {\n        return responseContent;\n    }\n\n    public void setResponseContent(String responseContent) {\n        this.responseContent = responseContent;\n    }\n\n    public String getInstanceNo() {\n        return instanceNo;\n    }\n\n    public void setInstanceNo(String instanceNo) {\n        this.instanceNo = instanceNo;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    public String getUnitCode() {\n        return unitCode;\n    }\n\n    public void setUnitCode(String unitCode) {\n        this.unitCode = unitCode;\n    }\n\n    public Map<String, String> getContextData() {\n        return contextData;\n    }\n\n    public void setContextData(Map<String, String> contextData) {\n        this.contextData = contextData;\n    }\n\n    public Map<String, String> getVariables() {\n        return variables;\n    }\n\n    public void setVariables(Map<String, String> variables) {\n        this.variables = variables;\n    }\n    \n\n    public Boolean getAutoRunFlag() {\n        return autoRunFlag;\n    }\n\n    public void setAutoRunFlag(Boolean autoRunFlag) {\n        this.autoRunFlag = autoRunFlag;\n    }\n\n    public Date getNextAutoRunTime() {\n        return nextAutoRunTime;\n    }\n\n    public void setNextAutoRunTime(Date nextAutoRunTime) {\n        this.nextAutoRunTime = nextAutoRunTime;\n    }\n\n    @Override\n    public String toString() {\n        return \"SyncAfterCallReq [executionNo=\" + executionNo + \", result=\" + result + \", responseContent=\"\n                + responseContent + \", instanceNo=\" + instanceNo + \", bizNo=\" + bizNo + \", unitCode=\" + unitCode\n                + \", contextData=\" + contextData + \", variables=\" + variables + \", autoRunFlag=\" + autoRunFlag + \", nextAutoRunTime=\" + nextAutoRunTime + \"]\";\n    }\n    \n    \n\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/model/vo/SyncAfterCallRes.java",
    "content": " package com.jd.easyflow.processunit.domain.model.vo;\n\n /**\n  * @author liyuliang5\n  * \n  */\npublic class SyncAfterCallRes {\n\n    @Override\n    public String toString() {\n        return \"SyncAfterCallRes []\";\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/model/vo/SyncBeforeCallReq.java",
    "content": " package com.jd.easyflow.processunit.domain.model.vo;\n\nimport java.util.Map;\n\n/**\n  * @author liyuliang5\n  * \n  */\n public class SyncBeforeCallReq {\n\n     private String unitCode;\n     \n     private String bizNo;\n     \n     private String requestNo;\n     \n     private String requestContent;\n\n     private String version;\n     \n     private String productCode;\n     \n     private Map<String, String> clientInfo;\n\n    public String getUnitCode() {\n        return unitCode;\n    }\n\n    public void setUnitCode(String unitCode) {\n        this.unitCode = unitCode;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    public String getRequestNo() {\n        return requestNo;\n    }\n\n    public void setRequestNo(String requestNo) {\n        this.requestNo = requestNo;\n    }\n\n    public String getRequestContent() {\n        return requestContent;\n    }\n\n    public void setRequestContent(String requestContent) {\n        this.requestContent = requestContent;\n    }\n\n    public String getVersion() {\n        return version;\n    }\n\n    public void setVersion(String version) {\n        this.version = version;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n    \n    public Map<String, String> getClientInfo() {\n        return clientInfo;\n    }\n\n    public void setClientInfo(Map<String, String> clientInfo) {\n        this.clientInfo = clientInfo;\n    }\n\n    @Override\n    public String toString() {\n        return \"SyncBeforeCallReq [unitCode=\" + unitCode + \", bizNo=\" + bizNo + \", requestNo=\" + requestNo\n                + \", requestContent=\" + requestContent + \", version=\" + version + \", productCode=\" + productCode\n                + \", clientInfo=\" + clientInfo + \"]\";\n    }\n     \n     \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/model/vo/SyncBeforeCallRes.java",
    "content": "package com.jd.easyflow.processunit.domain.model.vo;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * @author liyuliang5\n * \n */\npublic class SyncBeforeCallRes {\n\n    private ExecPolicy execPolicy;\n\n    private String executionNo;\n\n    private String instanceNo;\n\n    private Map<String, Object> unitConf;\n\n    private Map<String, String> contextData;\n    \n    private Map<String, String> variables;\n\n    public void putData(String key, String value) {\n        if (contextData == null) {\n          contextData = new HashMap();  \n        }\n        contextData.put(key,value);\n    }\n\n    public <T> T getData(String key){\n        if(contextData == null){\n            return null;\n        }\n        return (T) contextData.get(key);\n    }\n\n\n    public ExecPolicy getExecPolicy() {\n        return execPolicy;\n    }\n\n    public void setExecPolicy(ExecPolicy execPolicy) {\n        this.execPolicy = execPolicy;\n    }\n\n    public String getExecutionNo() {\n        return executionNo;\n    }\n\n    public void setExecutionNo(String executionNo) {\n        this.executionNo = executionNo;\n    }\n\n    public String getInstanceNo() {\n        return instanceNo;\n    }\n\n    public void setInstanceNo(String instanceNo) {\n        this.instanceNo = instanceNo;\n    }\n\n    public Map<String, Object> getUnitConf() {\n        return unitConf;\n    }\n\n    public void setUnitConf(Map<String, Object> unitConf) {\n        this.unitConf = unitConf;\n    }\n\n    public Map<String, String> getContextData() {\n        return contextData;\n    }\n\n    public void setContextData(Map<String, String> contextData) {\n        this.contextData = contextData;\n    }\n\n    public Map<String, String> getVariables() {\n        return variables;\n    }\n\n    public void setVariables(Map<String, String> variables) {\n        this.variables = variables;\n    }\n\n    @Override\n    public String toString() {\n        return \"SyncBeforeCallRes [execPolicy=\" + execPolicy + \", executionNo=\" + executionNo + \", instanceNo=\"\n                + instanceNo + \", unitConf=\" + unitConf + \", contextData=\" + contextData + \", variables=\" + variables\n                + \"]\";\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/repository/ProcessUnitRepository.java",
    "content": " package com.jd.easyflow.processunit.domain.repository;\n\nimport java.util.List;\n\nimport com.jd.easyflow.common.dto.pager.PagerCondition;\nimport com.jd.easyflow.common.dto.pager.PagerResult;\nimport com.jd.easyflow.processunit.domain.model.entity.ProcessUnitEntity;\nimport com.jd.easyflow.processunit.domain.model.entity.ProcessUnitExecutionEntity;\nimport com.jd.easyflow.processunit.domain.model.entity.ProcessUnitInstanceEntity;\nimport com.jd.easyflow.processunit.domain.model.vo.ProcessUnitInstanceKey;\nimport com.jd.easyflow.processunit.domain.model.vo.QueryAsyncInstanceVO;\nimport com.jd.easyflow.sharding.service.ShardingComputeResult;\n\n/**\n  * @author liyuliang5\n  * \n  */\n public interface ProcessUnitRepository {\n     \n     ProcessUnitEntity getProcessUnitByCode(String processUnitCode);\n     \n     ProcessUnitInstanceEntity getInstanceByUnitCodeAndBizNo(String unitCode, String bizNo);\n     \n     List<ProcessUnitInstanceEntity> queryByUnitCodeAndBizNoPrefix(String unitCode, String bizNo);\n     \n     ProcessUnitInstanceEntity getInstance(String instanceNo);\n     \n     ProcessUnitInstanceEntity getInstance(String instanceNo, String unitCode, String bizNo);\n     \n     void saveInstance(ProcessUnitInstanceEntity instance);\n     \n     void updateInstance(ProcessUnitInstanceEntity instance);\n     \n     void updateInstanceByInstanceNoSelective(ProcessUnitInstanceEntity instance);\n     \n     ProcessUnitExecutionEntity getExecution(String executionNo);\n     \n     ProcessUnitExecutionEntity getExecution(String executionNo, String unitCode, String bizNo);\n     \n     void saveExecution(ProcessUnitExecutionEntity execution);\n     \n     void updateExecution(ProcessUnitExecutionEntity execution);\n\n    void updateExecutionByExecutionNo(ProcessUnitExecutionEntity execution);\n     \n     List<String> findAsyncInstanceList(QueryAsyncInstanceVO query);\n     \n     List<ProcessUnitInstanceKey> findAsyncInstanceKeyList(QueryAsyncInstanceVO query);\n     \n     List<ProcessUnitEntity> findAllProcessUnitList();\n     \n     PagerResult pagerQueryProcessUnitInstance(PagerCondition pagerQueryReq);\n     \n     PagerResult pagerQueryProcessUnitExecution(PagerCondition pagerQueryReq);\n     \n     ShardingComputeResult computeShardInfo(String unitCode, String bizNo);\n     \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/service/ProcessUnitExecutionPersistHandler.java",
    "content": "package com.jd.easyflow.processunit.domain.service;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.processunit.domain.model.entity.ProcessUnitExecutionEntity;\nimport com.jd.easyflow.processunit.domain.model.vo.ExecContext;\n\n/**\n * @author: chenzhenghao1\n */\n\npublic interface ProcessUnitExecutionPersistHandler {\n\n    Logger logger = LoggerFactory.getLogger(ProcessUnitExecutionPersistHandler.class);\n\n    void persistBeforeCall(ExecContext context, ProcessUnitExecutionEntity processUnitExecution);\n\n    void persistAfterCall(ExecContext context, ProcessUnitExecutionEntity processUnitExecution);\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/service/ProcessUnitExecutor.java",
    "content": "package com.jd.easyflow.processunit.domain.service;\n\nimport com.jd.easyflow.processunit.domain.model.vo.ExecParam;\nimport com.jd.easyflow.processunit.domain.model.vo.ExecResult;\n\n/**\n * @author liyuliang5\n * \n */\npublic interface ProcessUnitExecutor {\n\n    ExecResult execute(ExecParam param);\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/service/ProcessUnitService.java",
    "content": "package com.jd.easyflow.processunit.domain.service;\n\nimport java.text.SimpleDateFormat;\nimport java.util.ArrayList;\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.concurrent.CountDownLatch;\nimport java.util.concurrent.atomic.AtomicInteger;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.transaction.support.TransactionSynchronization;\nimport org.springframework.transaction.support.TransactionSynchronizationManager;\n\nimport com.jd.easyflow.alert.AlertUtil;\nimport com.jd.easyflow.codegenerator.client.CodeGenerateHelper;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponseCode;\nimport com.jd.easyflow.common.dto.pager.FieldEntry;\nimport com.jd.easyflow.common.dto.pager.PagerCondition;\nimport com.jd.easyflow.common.dto.pager.PagerResult;\nimport com.jd.easyflow.common.exception.EasyFlowException;\nimport com.jd.easyflow.common.exception.UserException;\nimport com.jd.easyflow.common.util.UUIDUtil;\nimport com.jd.easyflow.lock.Locker;\nimport com.jd.easyflow.message.MessageSendService;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitCreateReq;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitInstanceDTO;\nimport com.jd.easyflow.processunit.adapter.export.dto.ProcessUnitUpdateReq;\nimport com.jd.easyflow.processunit.domain.constant.ContextDataKeys;\nimport com.jd.easyflow.processunit.domain.constant.ProcessUnitConstants;\nimport com.jd.easyflow.processunit.domain.model.converter.ProcessUnitExecuteConverter;\nimport com.jd.easyflow.processunit.domain.model.entity.ProcessUnitEntity;\nimport com.jd.easyflow.processunit.domain.model.entity.ProcessUnitExecutionEntity;\nimport com.jd.easyflow.processunit.domain.model.entity.ProcessUnitInstanceEntity;\nimport com.jd.easyflow.processunit.domain.model.enums.ProcessUnitErrorCodeEnum;\nimport com.jd.easyflow.processunit.domain.model.vo.BatchExecuteReq;\nimport com.jd.easyflow.processunit.domain.model.vo.BatchExecuteRes;\nimport com.jd.easyflow.processunit.domain.model.vo.ExecContext;\nimport com.jd.easyflow.processunit.domain.model.vo.ExecParam;\nimport com.jd.easyflow.processunit.domain.model.vo.ExecPolicy;\nimport com.jd.easyflow.processunit.domain.model.vo.ExecResult;\nimport com.jd.easyflow.processunit.domain.model.vo.ExecuteReq;\nimport com.jd.easyflow.processunit.domain.model.vo.ExecuteRes;\nimport com.jd.easyflow.processunit.domain.model.vo.ProcessUnitExecuteMessage;\nimport com.jd.easyflow.processunit.domain.model.vo.ProcessUnitInstanceKey;\nimport com.jd.easyflow.processunit.domain.model.vo.QueryAsyncInstanceVO;\nimport com.jd.easyflow.processunit.domain.model.vo.SyncAfterCallReq;\nimport com.jd.easyflow.processunit.domain.model.vo.SyncAfterCallRes;\nimport com.jd.easyflow.processunit.domain.model.vo.SyncBeforeCallReq;\nimport com.jd.easyflow.processunit.domain.model.vo.SyncBeforeCallRes;\nimport com.jd.easyflow.processunit.domain.repository.ProcessUnitRepository;\nimport com.jd.easyflow.processunit.domain.service.impl.AsyncServerProcessUnitExecutor;\nimport com.jd.easyflow.processunit.domain.service.impl.SyncServerProcessUnitExecutor;\nimport com.jd.easyflow.processunit.domain.support.LockManager;\nimport com.jd.easyflow.processunit.domain.support.PuTransactionTemplate;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n * @author liyuliang5\n * \n */\npublic class ProcessUnitService {\n    \n    private static final Logger log = LoggerFactory.getLogger(ProcessUnitService.class);\n\n\n    private static final String PU_EXECUTION = \"PE\";\n\n    private String executeMessageTopic;\n\n    private String createMessageTopic;\n\n    private String updateMessageTopic;\n    @Autowired\n    private AsyncServerProcessUnitExecutor asyncServerProcessUnitExecutor;\n    @Autowired\n    private ProcessUnitRepository processUnitRepository;\n    private MessageSendService messageSendService;\n    @Autowired\n    private SyncServerProcessUnitExecutor syncServerProcessUnitExecutor;\n    \n    private LockManager lockManager;\n    \n    private int asyncMaxCount = 100000;\n    \n    private int pagerQueryTimeRangeDays = 30;\n    \n    private int pagerQueryMaxPageSize = 10000;\n    \n    private int maxThreadNumPerUnitCode = 1000;\n    \n    \n    @Autowired(required = false)\n    @Qualifier(ProcessUnitConstants.BEAN_PU_TX_TEMPLATE)\n    private PuTransactionTemplate puTransactionTemplate = new PuTransactionTemplate();\n    \n    private volatile boolean stop = false;\n    \n\n    public String create(ProcessUnitCreateReq req) {\n        ProcessUnitEntity unit = processUnitRepository.getProcessUnitByCode(req.getUnitCode());\n        Map<String, Object> createExecPolicy = (Map<String, Object>) unit\n                .getConfig(ProcessUnitConstants.CONF_CREATE_EXEC_POLICY);\n        Boolean asyncCreate =createExecPolicy == null ? false : (Boolean) createExecPolicy.get(\"asyncCreate\");\n        if (!Boolean.TRUE.equals(asyncCreate)) {\n            return syncCreate(req, unit);\n        } else {\n            asyncCreate(req, unit);\n        }\n        return null;\n    }\n\n    public String syncCreate(ProcessUnitCreateReq req, ProcessUnitEntity unit) {\n        log.info(\"Sync create:{}\", JSON.toJSONString(req));\n        if (unit == null) {\n            unit = processUnitRepository.getProcessUnitByCode(req.getUnitCode());\n        }\n        ExecParam param = ProcessUnitExecuteConverter.INSTANCE.convert(req);\n        ExecContext context = new ExecContext(param);\n        context.setUnitCode(param.getUnitCode());\n        context.setBizNo(param.getBizNo());\n        context.setProcessUnit(unit);\n        context.setClientInfo(req.getClientInfo());\n\n        createIfNotExists(context);\n        afterCreate(context);\n        return context.getInstance().getInstanceNo();\n    }\n\n    private void asyncCreate(ProcessUnitCreateReq req, ProcessUnitEntity unit) {\n        String reqString = JSON.toJSONString(req);\n        log.info(\"asyncCreate:{}\", reqString);\n        messageSendService.sendMessage(UUIDUtil.getSimpleUUID(), createMessageTopic, reqString);\n    }\n\n    private void afterCreate(ExecContext context) {\n        Map<String, Object> createExecPolicy = (Map<String, Object>) context.getProcessUnit()\n                .getConfig(ProcessUnitConstants.CONF_CREATE_EXEC_POLICY);\n        String policy = createExecPolicy == null ? null : (String) createExecPolicy.get(\"policy\");\n        if (policy == null) {\n            return;\n        }\n        if (\"asyncExecAfterSave\".equals(policy) || \"asyncExecAfterCommit\".equals(policy)) {\n            ProcessUnitExecuteMessage msg = new ProcessUnitExecuteMessage();\n            msg.setInstanceNo(context.getInstance().getInstanceNo());\n            msg.setUnitCode(context.getInstance().getProcessUnitCode());\n            msg.setBizNo(context.getInstance().getBizNo());\n            log.info(\"process unit send create MQ:{}\", JSON.toJSONString(msg));\n            String puExecuteMessageTopic = (String) context.getProcessUnit()\n                    .getConfig(ProcessUnitConstants.CONF_EXECUTE_MESSAGE_TOPIC);\n            if (puExecuteMessageTopic == null) {\n                puExecuteMessageTopic = executeMessageTopic;\n            }\n            if (\"asyncExecAfterSave\".equals(policy)) {\n                messageSendService.sendMessage(context.getBizNo(), puExecuteMessageTopic, JSON.toJSONString(msg));\n            } else {\n                String finalPuExecuteMessageTopic = puExecuteMessageTopic;\n                TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {\n                    @Override\n                    public void afterCommit() {\n                        messageSendService.sendMessage(context.getBizNo(), finalPuExecuteMessageTopic, JSON.toJSONString(msg));\n                    }\n                });\n            }\n        } else if (\"syncExecAfterSave\".equals(policy) || \"syncExecAfterCommit\".equals(policy)) {\n            ExecParam param = new ExecParam();\n            param.setInstanceNo(context.getInstance().getInstanceNo());\n            param.setUnitCode(context.getInstance().getProcessUnitCode());\n            param.setBizNo(context.getInstance().getBizNo());\n            param.setExecType(ProcessUnitConstants.EXEC_TYPE_AFTER_CREATE);\n            if (\"syncExecAfterSave\".equals(policy)) {\n                log.info(\"Process unit execute start\");\n                ExecResult result = asyncServerProcessUnitExecutor.execute(param);\n                ExecuteRes res = new ExecuteRes(result.getResult(), result.getResponseContent());\n                log.info(\"Process unit execute end:{}\", res);\n            } else {\n                TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {\n                    @Override\n                    public void afterCommit() {\n                        log.info(\"Process unit execute start\");\n                        ExecResult result = asyncServerProcessUnitExecutor.execute(param);\n                        ExecuteRes res = new ExecuteRes(result.getResult(), result.getResponseContent());\n                        log.info(\"Process unit execute end:{}\", res);\n                    }\n                }); \n            }\n        } else {\n            throw new IllegalArgumentException(policy);\n        }\n    }\n\n    public void update(ProcessUnitUpdateReq req) {\n        ProcessUnitEntity unit = processUnitRepository.getProcessUnitByCode(req.getUnitCode());\n        Map<String, Object> updateExecPolicy = (Map<String, Object>) unit\n                .getConfig(ProcessUnitConstants.CONF_UPDATE_EXEC_POLICY);\n        Boolean asyncUpdate = updateExecPolicy == null ? false : (Boolean) updateExecPolicy.get(\"asyncUpdate\");\n        if (!Boolean.TRUE.equals(asyncUpdate)) {\n            doUpdate(req);\n        } else {\n            String reqString = JSON.toJSONString(req);\n            log.info(\"Process unit send update message:{}\", reqString);\n            messageSendService.sendMessage(UUIDUtil.getSimpleUUID(), updateMessageTopic, reqString);\n        }\n    }\n\n    public void doUpdate(ProcessUnitUpdateReq req) {\n        if (req.getInstanceNo() == null && (req.getUnitCode() == null || req.getBizNo() == null)) {\n            throw new EasyFlowException(\"Both bizNo and instanceNo are null\");\n        }\n        String bizNo = req.getBizNo();\n        String unitCode = req.getUnitCode();\n        ProcessUnitInstanceEntity instance = null;\n        if (bizNo == null || unitCode == null) {\n            instance = processUnitRepository.getInstance(req.getInstanceNo(), unitCode, bizNo);\n            bizNo = instance.getBizNo();\n            unitCode = instance.getProcessUnitCode();\n        }\n        final String finalUnitCode = unitCode;\n        final String finalBizNo = bizNo;\n        ProcessUnitEntity unit = processUnitRepository.getProcessUnitByCode(req.getUnitCode());\n        if (ProcessUnitConstants.STATUS_INVALID.equals(unit.getStatus())) {\n            return;\n        }\n        if (Boolean.FALSE.equals(req.getLock())) {\n            puTransactionTemplate.doInTransaction(unit, finalBizNo, ProcessUnitConstants.SCENE_UPDATE, null, () -> {\n                doUpdateOperation(req, unit, finalUnitCode, finalBizNo);\n                return null;\n            });\n        } else {\n            lockManager.doInlock(unitCode, bizNo, ProcessUnitConstants.SCENE_UPDATE, () -> {\n                        puTransactionTemplate.doInTransaction(unit, finalBizNo, null, null, () -> {\n                            doUpdateOperation(req, unit, finalUnitCode, finalBizNo);\n                            return null;\n                        });\n                        return null;\n                    });\n        }\n    }\n    \n    private void doUpdateOperation(ProcessUnitUpdateReq req, ProcessUnitEntity unit, String unitCode, String bizNo) {\n        ProcessUnitInstanceEntity processUnitInstance = processUnitRepository\n                .getInstanceByUnitCodeAndBizNo(unitCode, bizNo);\n        String beforeVars = processUnitInstance.getVars();\n        Map<String, String> variables = req.getVariables();\n        if (ProcessUnitUpdateReq.UPDATE_TYPE_VARIABLES.equals(req.getUpdateType())) {\n            processUnitInstance.setVars(JSON.toJSONString(req.getVariables()));\n        } else if (ProcessUnitUpdateReq.UPDATE_TYPE_REQUEST_CONTENT.equals(req.getUpdateType())) {\n            processUnitInstance.setRequestContent(req.getRequestContent());\n        } else {\n\n            processUnitInstance.setResult(req.getResult());\n            processUnitInstance.setResponseContent(req.getResponseContent());\n\n            Boolean autoRunFlag = req.getAutoRunFlag();\n            if (autoRunFlag == null) {\n                autoRunFlag = false;\n                Map<String, Object> autoRunPolicy = (Map<String, Object>) unit\n                        .getConfig(ProcessUnitConstants.CONF_AUTO_RUN_POLICY);\n                if (autoRunPolicy != null) {\n                    autoRunFlag = (Boolean) autoRunPolicy.get(processUnitInstance.getResult());\n                    if (autoRunFlag == null) {\n                        autoRunFlag = false;\n                    }\n                }\n            }\n            processUnitInstance.setAutoRunFlag(autoRunFlag);\n\n            if (autoRunFlag) {\n                if (req.getNextAutoRunTime() != null) {\n                    processUnitInstance.setNextAutoRunTime(req.getNextAutoRunTime());\n                } else {\n                    if (processUnitInstance.getNextAutoRunTime() == null) {\n                        Date nextAutoRunTime = null;\n                        Integer autoRunDelaySeconds = (Integer) unit\n                                .getConfig(ProcessUnitConstants.CONF_AUTO_RUN_DELAY_SECONDS);\n                        if (autoRunDelaySeconds == null) {\n                            nextAutoRunTime = new Date();\n                        } else {\n                            nextAutoRunTime = new Date(System.currentTimeMillis() + autoRunDelaySeconds * 1000);\n                        }\n                        processUnitInstance.setNextAutoRunTime(nextAutoRunTime);\n                    }\n                }\n            }\n            processUnitInstance.setVars(JSON.toJSONString(variables));\n        }\n        log.info(\"Process unit update result :{}\", processUnitInstance);\n        processUnitRepository.updateInstance(processUnitInstance);\n\n        ProcessUnitExecutionEntity execution = new ProcessUnitExecutionEntity();\n        execution.setInstanceNo(processUnitInstance.getInstanceNo());\n        execution.setProductCode(processUnitInstance.getProductCode());\n        execution.setRequestContent(req.getRequestContent() != null ? req.getRequestContent()\n                : processUnitInstance.getRequestContent());\n        execution.setRequestTime(req.getRequestTime());\n        execution.setResponseTime(req.getResponseTime());\n        if (req.getRequestTime() != null && req.getResponseTime() != null) {\n            execution.setElaspeTime(\n                    (int) (req.getResponseTime().getTime() - req.getRequestTime().getTime()));\n        }\n        execution.setRequestNo(req.getRequestNo());\n        execution.setProcessUnitCode(unit.getProcessUnitCode());\n        execution.setBizNo(bizNo);\n        execution.setExecutionNo(CodeGenerateHelper.generateCode(\"PU_EXECUTION\", PU_EXECUTION));\n        execution.setExecType(req.getExecType());\n        execution.setResult(req.getResult());\n        execution.setResponseContent(req.getResponseContent());\n        Map<String, Object> extData = new HashMap<String, Object>();\n        extData.put(ProcessUnitConstants.EXECUTION_EXT_DATA_POLICY_TYPE,\n                ProcessUnitConstants.POLICY_REQUEST);\n        if (req.getRequestContext() != null) {\n            extData.put(ProcessUnitConstants.EXECUTION_REQUEST_CONTEXT, req.getRequestContext());\n        }\n        extData.put(ProcessUnitConstants.EXECUTION_EXT_DATA_CALL_TYPE,\n                ProcessUnitConstants.CALL_TYPE_UPDATE);\n        extData.put(ProcessUnitConstants.EXECUTION_EXT_DATA_BEFORE_VARS, JSON.parseObject(beforeVars, Map.class));\n        extData.put(ProcessUnitConstants.EXECUTION_EXT_DATA_AFTER_VARS, variables);\n        extData.put(ProcessUnitConstants.EXECUTION_EXT_DATA_CLIENT_INFO, req.getClientInfo());\n        execution.setExtData(JSON.toJSONString(extData));\n        processUnitRepository.saveExecution(execution);\n        log.info(\"Execuiton saved is :\" + execution.getExecutionNo());\n    }\n\n    private void createIfNotExists(ExecContext context) {\n        lockManager.doInlock(context.getUnitCode(), context.getBizNo(), ProcessUnitConstants.SCENE_CREATE, () -> {\n                    puTransactionTemplate.doInTransaction(context.getProcessUnit(), context.getBizNo(), ProcessUnitConstants.SCENE_CREATE, null, () -> {\n                        createIfNotExistsOperation(context);\n                        return null;\n                    });\n            return null;\n        });\n    }\n    \n    private void createIfNotExistsOperation(ExecContext context) {\n        ProcessUnitInstanceEntity instance = processUnitRepository\n                .getInstanceByUnitCodeAndBizNo(context.getProcessUnit().getProcessUnitCode(), context.getBizNo());\n        if (instance == null) {\n            instance = new ProcessUnitInstanceEntity();\n            instance.setBizNo(context.getBizNo());\n            instance.setInstanceNo(CodeGenerateHelper.generateCode(\"PU_INSTANCE\", \"PI\"));\n            instance.setParentNo(context.getParentNo());\n            instance.setProcessUnitCode(context.getProcessUnit().getProcessUnitCode());\n            instance.setRequestContent(context.getParam().getRequestContent());\n            instance.setProductCode(context.getParam().getProductCode());\n            instance.setResult(ProcessUnitConstants.RESULT_NONE);\n            Map<String, Object> autoRunPolicy = (Map<String, Object>) context.getProcessUnit()\n                    .getConfig(ProcessUnitConstants.CONF_AUTO_RUN_POLICY);\n            Boolean autoRunFlag = context.getParam().getAutoRunFlag();\n            if (autoRunFlag == null) {\n                autoRunFlag = autoRunPolicy != null && Boolean.TRUE.equals(autoRunPolicy.get(ProcessUnitConstants.RESULT_NONE));\n            }\n            instance.setAutoRunFlag(autoRunFlag);\n            if (autoRunFlag) {\n                Date nextAutoRunTime = context.getParam().getNextAutoRunTime();\n                if (nextAutoRunTime == null) {\n                    Integer autoRunDelaySeconds = (Integer) context.getProcessUnit()\n                            .getConfig(ProcessUnitConstants.CONF_AUTO_RUN_DELAY_SECONDS);\n                    if (autoRunDelaySeconds == null) {\n                        nextAutoRunTime = new Date();\n                    } else {\n                        nextAutoRunTime = new Date(System.currentTimeMillis() + autoRunDelaySeconds * 1000);\n                    }\n                }\n                instance.setNextAutoRunTime(nextAutoRunTime);\n            }\n\n            context.setNewInstance(true);\n            Map<String, Object> extDataMap = new HashMap<>();\n            Map<String, String> clientInfo = context.getClientInfo();\n            if (clientInfo != null) {\n                extDataMap.put(ProcessUnitConstants.INSTANCE_EXT_DATA_CREATE_CLIENT_INFO, clientInfo);\n            }\n            Map<String, String> variables = context.getParam().getVariables();\n            if (variables != null) {\n                instance.setVars(JSON.toJSONString(variables));\n            }\n            if (extDataMap.size() > 0) {\n                instance.setExtData(JSON.toJSONString(extDataMap));\n            }\n            processUnitRepository.saveInstance(instance);\n            if (log.isDebugEnabled()) {\n                log.debug(\"New process unit instance created:{}\", instance);\n            } else if (log.isInfoEnabled()) {\n                log.info(\"New process unit instance created, instance no:\" + instance.getInstanceNo());\n            }\n            context.setNewInstance(true);\n        }\n        context.setInstance(instance);\n    }\n    \n    public void executeMessage(String instanceNo) {\n        executeMessage(instanceNo, null, null);\n    }\n\n    public void executeMessage(String instanceNo, String unitCode, String bizNo) {\n        ProcessUnitInstanceEntity instance = processUnitRepository.getInstance(instanceNo, unitCode, bizNo);\n        if (instance == null) {\n            log.warn(\"Process unit instance \" + instanceNo + \" not exists\");\n            return;\n        }\n        ExecParam param = new ExecParam();\n        param.setInstanceNo(instanceNo);\n        param.setBizNo(instance.getBizNo());\n        param.setUnitCode(instance.getProcessUnitCode());\n        param.setExecType(ProcessUnitConstants.EXEC_TYPE_MSG_ASYNC);\n        try {\n            asyncServerProcessUnitExecutor.execute(param);\n        } catch (Exception e) {\n            AlertUtil.doAlert(\"processUnit-executeMessage\", \"Process unit execute exception,\", e, instance, instance.getProductCode());\n            throw e;\n        }\n    }\n\n    public SyncBeforeCallRes syncBeforeCall(SyncBeforeCallReq req) {\n        ExecParam param = ProcessUnitExecuteConverter.INSTANCE.convert(req);\n        param.setExecType(ProcessUnitConstants.EXEC_TYPE_SYNC);\n        ExecContext context = new ExecContext(param);\n        context.setUnitCode(param.getUnitCode());\n        context.setBizNo(param.getBizNo());\n        context.setClientInfo(param.getClientInfo());\n        ExecPolicy policy = syncServerProcessUnitExecutor.beforeCall(context);\n        SyncBeforeCallRes res = new SyncBeforeCallRes();\n        res.setExecPolicy(policy);\n        Map<String, Object> configMap = context.getProcessUnit().getConfigMap();\n        if (configMap != null) {\n            Map<String, Object> clientConfigMap = new HashMap<>(1);\n            clientConfigMap.put(ProcessUnitConstants.CONF_CATCH_EXCEPTION,\n                    configMap.get(ProcessUnitConstants.CONF_CATCH_EXCEPTION));\n            res.setUnitConf(context.getProcessUnit().getConfigMap());\n        }\n        res.setExecutionNo(context.getExecutionNo());\n        res.setInstanceNo(context.getInstanceNo());\n        res.putData(ContextDataKeys.EXECUTION_EXT_DATA_LOCK_REQUEST_ID, context.getLockRequestId());\n        res.putData(ContextDataKeys.EXECUTION_START_TIME, System.currentTimeMillis() + \"\");\n        res.putData(ContextDataKeys.PROCESS_UNIT_INVALID,\n                (context.getProcessUnit().getStatus() == ProcessUnitConstants.STATUS_INVALID) + \"\");\n        if (context.getInstance() != null && context.getInstance().getVars() != null) {\n            Map<String, String> varsMap = JSON.parseObject(context.getInstance().getVars(), Map.class);\n            res.setVariables(varsMap);\n        }\n        if (context.getInstance() != null && context.getInstance().getExtData() != null) {\n            Map<String, Object> extDataMap = JSON.parseObject(context.getInstance().getExtData(), Map.class);\n            res.putData(ContextDataKeys.INSTANCE_EXT_DATA, context.getInstance().getExtData());\n        }\n        return res;\n    }\n\n    public SyncAfterCallRes syncAfterCall(SyncAfterCallReq req) {\n        if (req.getContextData() != null\n                && \"true\".equals(req.getContextData().get(ContextDataKeys.PROCESS_UNIT_INVALID))) {\n            log.info(\"process unit invalid.\");\n            return new SyncAfterCallRes();\n        }\n        ExecContext context = buildAfterCallContext(req);\n        syncServerProcessUnitExecutor.afterCall(context);\n        return new SyncAfterCallRes();\n    }\n\n    public ExecuteRes execute(ExecuteReq req) {\n        log.info(\"Process unit execute start:{}\", req);\n        ExecParam param = new ExecParam();\n        param.setInstanceNo(req.getUnitInstanceNo());\n        param.setUnitCode(req.getUnitCode());\n        param.setBizNo(req.getBizNo());\n        param.setExecType(ProcessUnitConstants.EXEC_TYPE_MANUAL_ASYNC);\n        ExecResult result = asyncServerProcessUnitExecutor.execute(param);\n        ExecuteRes res = new ExecuteRes(result.getResult(), result.getResponseContent());\n        log.info(\"Process unit execute end:{}\", res);\n        return res;\n    }\n\n    public BatchExecuteRes batchExecute(BatchExecuteReq req) {\n        log.info(\"Batch execute req:{}\", req);\n        if (BatchExecuteReq.TYPE_BATCH.equals(req.getType())) {\n            List<ProcessUnitInstanceKey> keyList = new ArrayList<ProcessUnitInstanceKey>();\n            ProcessUnitEntity unit = null;\n            if (req.getInstanceNoList() != null) {\n                String unitCode = null;\n                if (req.getProcessUnitCodeList() != null) {\n                    if (req.getProcessUnitCodeList().size() > 1) {\n                        throw new EasyFlowException(\"processUnitCodeList more than 1\");\n                    } else {\n                        unitCode = req.getProcessUnitCodeList().get(0);\n                        unit = processUnitRepository.getProcessUnitByCode(unitCode);\n                    }\n                }\n                String finalUnitCode = unitCode;\n                req.getInstanceNoList().forEach(instanceNo -> keyList.add(new ProcessUnitInstanceKey(instanceNo, finalUnitCode, null)));\n            } else if (req.getBizNoList() != null) {\n                if (req.getProcessUnitCodeList() == null || req.getProcessUnitCodeList().size() != 1) {\n                    throw new EasyFlowException(\"processUnitCodeList should be only 1\");\n                }\n                req.getBizNoList().forEach(bizNo -> keyList.add(new ProcessUnitInstanceKey(req.getProcessUnitCodeList().get(0), bizNo)));\n            } else {\n                throw new EasyFlowException(\"Param illegal:\" + req);\n            }\n            runOneBatch(unit, keyList, req.getRequestContext(), req);\n        } else {\n            List<ProcessUnitEntity> unitList = null;\n            if (req.getProcessUnitCodeList() != null && !req.getProcessUnitCodeList().isEmpty()) {\n                unitList = new ArrayList<>();\n                for (String code : req.getProcessUnitCodeList()) {\n                    unitList.add(processUnitRepository.getProcessUnitByCode(code));\n                }\n            } else {\n                unitList = processUnitRepository.findAllProcessUnitList();\n            }\n            for (ProcessUnitEntity unit : unitList) {\n                if (ProcessUnitConstants.STATUS_INVALID.equals(unit.getStatus())\n                        || Boolean.FALSE.equals(unit.getConfig(ProcessUnitConstants.CONF_AUTO_ASYNC_RUN))) {\n                    continue;\n                }\n                if (!processUnitCodeMatch(unit.getProcessUnitCode(), req.getProcessUnitCodeList(),\n                        req.getExcludeProcessUnitCodeList())) {\n                    continue;\n                }\n                log.info(\"Start process unit:\" + unit.getProcessUnitCode());\n                QueryAsyncInstanceVO query = new QueryAsyncInstanceVO();\n                query.setMaxCount(asyncMaxCount);\n                query.setUnitCode(unit.getProcessUnitCode());\n\n                Date currentDate = new Date();\n                if (req.getNextAutoRunTimeEnd() != null) {\n                    query.setNextAutoRunTime(req.getNextAutoRunTimeEnd());\n                } else {\n                    query.setNextAutoRunTime(currentDate);\n                }\n                if (req.getNextAutoRunTimeStart() != null) {\n                    query.setNextAutoRunTimeStart(req.getNextAutoRunTimeStart());\n                } else if (req.getNextAutoRunTimeMaxInterval() != null) {\n                    \n                    Date nextAutoRunTimeStart = new Date(currentDate.getTime() - req.getNextAutoRunTimeMaxInterval() * 1000);\n                    query.setNextAutoRunTimeStart(nextAutoRunTimeStart);\n                }\n                if (req.getProductCodeList() != null && ! req.getProductCodeList().isEmpty()) {\n                    query.setProductCodeList(req.getProductCodeList());\n                }\n                if (req.getExcludeProductCodeList() != null && ! req.getExcludeProductCodeList().isEmpty()) {\n                    query.setExcludeProductCodeList(req.getExcludeProductCodeList());\n                }\n                if (req.getResultList() != null && ! req.getResultList().isEmpty()) {\n                    query.setResultList(req.getResultList());\n                }\n                query.setVariableList(ProcessUnitExecuteConverter.INSTANCE.convertVariableList(req.getVariableList()));\n                List<ProcessUnitInstanceKey> instanceKeyList = processUnitRepository.findAsyncInstanceKeyList(query);\n                runOneBatch(unit, instanceKeyList, req.getRequestContext(), req);\n\n            }\n        }\n        BatchExecuteRes res = new BatchExecuteRes();\n        return res;\n    }\n\n    private boolean processUnitCodeMatch(String processUnitCode, List<String> processUnitCodeList,\n            List<String> excludeProcessUnitCodeList) {\n        if (processUnitCodeList != null && !processUnitCodeList.contains(processUnitCode)) {\n            return false;\n        }\n        if (excludeProcessUnitCodeList != null && excludeProcessUnitCodeList.contains(processUnitCode)) {\n            return false;\n        }\n        return true;\n    }\n\n    private void runOneBatch(ProcessUnitEntity entity, List<ProcessUnitInstanceKey> instanceKeyList,\n            Map<String, Object> requestContext, BatchExecuteReq req) {\n        log.info(\"Execute process unit instance list:{}\", instanceKeyList);\n        if (instanceKeyList.size() == 0) {\n            return;\n        }\n        String batchRunPolicy = req.getBatchRunPolicy();\n        if (batchRunPolicy == null && entity != null) {\n            batchRunPolicy = (String) entity.getConfig(ProcessUnitConstants.BATCH_RUN_POLICY);\n        }\n        if (ProcessUnitConstants.BATCH_RUN_POLICY_MULTIPLE_THREAD.equals(batchRunPolicy)) {\n            Integer threadNum = req.getThreadNum();\n            if (threadNum == null) {\n            Map<String, Object> policyConf = (Map<String, Object>) entity\n                    .getConfig(ProcessUnitConstants.BATCH_RUN_POLICY_CONF);\n                threadNum = policyConf == null ? null : (Integer) policyConf.get(\"threadNum\");\n            }\n            if (threadNum == null) {\n                throw new IllegalArgumentException(\"Thread num is null, unitCode:\" + entity.getProcessUnitCode());\n            }\n            runOneBatchWithMultipleThread(entity, instanceKeyList, requestContext, threadNum);\n        } else {\n            runOneBatchWithSingleThread(instanceKeyList, requestContext);\n        }\n    }\n\n    private void runOneBatchWithSingleThread(List<ProcessUnitInstanceKey> instanceKeyList, Map<String, Object> requestContext) {\n        for (ProcessUnitInstanceKey key : instanceKeyList) {\n            if (stop) {\n                log.warn(\"Process unit shutdown, instanceNo:{}\", key.getInstanceNo());\n                throw new UserException(ProcessUnitErrorCodeEnum.PU_0101.name(), ProcessUnitErrorCodeEnum.PU_0101.getDesc());\n            }            \n            runOneInstance(key.getInstanceNo(), key.getUnitCode(), key.getBizNo(), requestContext);\n        }\n    }\n\n    private void runOneBatchWithMultipleThread(ProcessUnitEntity entity, List<ProcessUnitInstanceKey> instanceKeyList,\n            Map<String, Object> requestContext, int threadNum) {\n        if (threadNum > maxThreadNumPerUnitCode) {\n            log.warn(\"Thread num:{} is greater than max num {}, default to max num\", threadNum, maxThreadNumPerUnitCode);\n            threadNum = maxThreadNumPerUnitCode;\n        }\n        CountDownLatch countDownLatch = new CountDownLatch(instanceKeyList.size());\n        AtomicInteger count = new AtomicInteger(-1);\n        for (int i = 0; i < threadNum; i++) {\n            createThread(() -> {\n                log.info(\"Thread start \" + entity.getProcessUnitCode() + \" batch process\");\n                while (true) {\n                    int index = count.addAndGet(1);\n                    if (index < instanceKeyList.size()) {\n                        ProcessUnitInstanceKey key = instanceKeyList.get(index);\n                        try {\n                            if (stop) {\n                                log.warn(\"Process unit server shutdown, not execute instance:{}\", key.getInstanceNo());\n                                continue;\n                            }\n                            runOneInstance(key.getInstanceNo(), key.getUnitCode(), key.getBizNo(), requestContext);\n                        } catch (Throwable t) {\n                            log.error(\"Process unit instance:\" + key.getInstanceNo() + \" execute exception:\" + t.getMessage(), t);\n                        } finally {\n                            countDownLatch.countDown();\n                        }\n                    } else {\n                        break;\n                    }\n                }\n                log.info(\"Thread end \" + entity.getProcessUnitCode() + \" batch process\");\n            }, \"processunit-\" + entity.getProcessUnitCode() + \"-\" + i).start();\n        }\n        try {\n            countDownLatch.await();\n        } catch (InterruptedException e) {\n            throw new RuntimeException(e);\n        }\n        if (stop) {\n            log.warn(\"Process unit server shutdown, stop exeucte\");\n            throw new UserException(ProcessUnitErrorCodeEnum.PU_0101.name(), ProcessUnitErrorCodeEnum.PU_0101.getDesc());\n        }\n    }\n    \n    protected Thread createThread(Runnable target, String name) {\n        return new Thread(target, name);\n    }\n\n    private void runOneInstance(String instanceNo, String unitCode, String bizNo, Map<String, Object> requestContext) {\n        log.info(\"Start execute instance:{} unitCode:{} bizNo:{}\", instanceNo, unitCode, bizNo);\n        ExecParam param = new ExecParam();\n        param.setInstanceNo(instanceNo);\n        param.setExecType(ProcessUnitConstants.EXEC_TYPE_TASK_ASYNC);\n        param.setRequestContext(requestContext);\n        ProcessUnitInstanceEntity instance = processUnitRepository.getInstance(instanceNo, unitCode, bizNo);\n        if (instance == null) {\n            throw new UserException(\"Process unit instance:\" + instanceNo + \" \" + unitCode + \" \" + bizNo + \" not exists\");\n        }\n        param.setBizNo(instance.getBizNo());\n        param.setUnitCode(instance.getProcessUnitCode());\n        try {\n            asyncServerProcessUnitExecutor.execute(param);\n            log.info(\"End execute instance:{} unitCode:{} bizNo:{}\", instanceNo, unitCode, bizNo);\n        } catch (Exception e) {\n            log.error(\"Process unit instance execute exception:{} unitCode:{} bizNo:{} message:{}\", instanceNo, unitCode, bizNo, e.getMessage(), e);\n            AlertUtil.doAlert(\"processUnit-runOneBatch\", \"Process unit instance execute exception,\", e, param, instance.getProductCode());\n        }\n    }\n\n    private ExecContext buildAfterCallContext(SyncAfterCallReq req) {\n        String unitCode = req.getUnitCode();\n        String executionNo = req.getExecutionNo();\n        String instanceNo = req.getInstanceNo();\n        String bizNo = req.getBizNo();\n        ExecParam param = new ExecParam();\n        param.setExecType(ProcessUnitConstants.EXEC_TYPE_SYNC);\n        ExecContext context = new ExecContext(param);\n        ProcessUnitEntity processUnit = processUnitRepository.getProcessUnitByCode(unitCode);\n        context.setBizNo(bizNo);\n        context.setUnitCode(unitCode);\n        context.setInstanceNo(instanceNo);\n        context.setExecutionNo(executionNo);\n        context.setProcessUnit(processUnit);\n        context.getResult().setResult(req.getResult());\n        context.getResult().setResponseContent(req.getResponseContent());\n        context.setLockRequestId(req.getData(ContextDataKeys.EXECUTION_EXT_DATA_LOCK_REQUEST_ID));\n        String requestTimeStr = req.getData(ContextDataKeys.EXECUTION_START_TIME);\n        if (requestTimeStr != null && ! requestTimeStr.isEmpty()) {\n            context.setRequestTime(Long.parseLong(requestTimeStr));\n        }\n        context.setVariables(req.getVariables());\n        context.getResult().setAutoRunFlag(req.getAutoRunFlag());\n        context.getResult().setNextAutoRunTime(req.getNextAutoRunTime());\n        String extDataStr = req.getData(ContextDataKeys.INSTANCE_EXT_DATA);\n        context.setExtDataStr(extDataStr);        \n        return context;\n    }\n\n\n    public void updateInstance(ProcessUnitInstanceDTO dto) {\n        ProcessUnitInstanceEntity entity = null;\n        if (dto.getInstanceNo() != null) {\n            entity = processUnitRepository.getInstance(dto.getInstanceNo(), dto.getProcessUnitCode(), dto.getBizNo());\n        } else if (dto.getProcessUnitCode() != null && dto.getBizNo() != null) {\n            entity = processUnitRepository.getInstanceByUnitCodeAndBizNo(dto.getProcessUnitCode(), dto.getBizNo());\n        }\n        if (entity == null) {\n            throw new UserException(\"process unit instance is null\");\n        }\n        if (dto.getAutoRunFlag() != null) {\n            entity.setAutoRunFlag(dto.getAutoRunFlag());\n        }\n        if (dto.getNextAutoRunTime() != null) {\n            entity.setNextAutoRunTime(dto.getNextAutoRunTime());\n        }\n        if (dto.getAutoRunTimes() != null) {\n            entity.setAutoRunTimes(dto.getAutoRunTimes());\n        }\n        if (dto.getRequestContent() != null) {\n            entity.setRequestContent(dto.getRequestContent());\n        }\n        if (dto.getResponseContent() != null) {\n            entity.setResponseContent(dto.getResponseContent());\n        }\n        if (dto.getResult() != null) {\n            entity.setResult(dto.getResult());\n        }\n        processUnitRepository.updateInstance(entity);\n    }\n    \n    public PagerResult pagerQueryProcessUnitInstance(PagerCondition pagerQueryReq) {\n        FieldEntry unitCodeField = pagerQueryReq.getField(\"unitCode\");\n        String unitCode = unitCodeField == null ? null : (String) unitCodeField.getValue();\n        if (unitCode != null && ! unitCode.isEmpty()) {\n            ProcessUnitEntity processUnit = processUnitRepository.getProcessUnitByCode(unitCode);\n            if (processUnit == null) {\n                throw new UserException(\"Process unit \" + unitCode + \" not exists\");\n            }\n        }\n        FieldEntry queryTypeField = pagerQueryReq.getField(\"queryType\");\n        String queryType = queryTypeField.stringValue();\n        int pageSize = pagerQueryReq.getPageSize();\n        if (pageSize > pagerQueryMaxPageSize) {\n            throw new UserException(ExportResponseCode.INVALID.getCode(), \" page record num should less than \" + pagerQueryMaxPageSize);\n        }\n        if (ProcessUnitConstants.INSTANCE_QUERY_TYPE_SINGLE.equals(queryType)) {\n            \n        } else if (ProcessUnitConstants.INSTANCE_QUERY_TYPE_CREATED_DATE_RANGE.equals(queryType)) {\n            FieldEntry createdDateStartField = pagerQueryReq.getField(\"createdDateStart\");\n            FieldEntry createdDateEndField = pagerQueryReq.getField(\"createdDateEnd\");\n            String createdDateStartStr = createdDateStartField == null ? null : (String) createdDateStartField.getValue();\n            String createdDateEndStr = createdDateEndField == null ? null : (String) createdDateEndField.getValue();\n            Date createdDateStart = null;\n            try {\n                createdDateStart = new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\").parse(createdDateStartStr);\n            } catch (Exception e) {\n                throw new UserException(ExportResponseCode.INVALID.getCode(), \"date \" + createdDateStartStr + \" illegal\");\n            }\n            Date createdDateEnd = null;\n            try { \n                createdDateEnd = new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\").parse(createdDateEndStr);\n            } catch (Exception e) {\n                throw new UserException(ExportResponseCode.INVALID.getCode(), \"date \" + createdDateEndStr + \" illegal\");\n            }\n            if (createdDateEnd.getTime() - createdDateStart.getTime() > pagerQueryTimeRangeDays * 24L * 3600 * 1000) {\n                throw new UserException(ExportResponseCode.INVALID.getCode(), \"date range greater than\" + pagerQueryTimeRangeDays + \" days\");\n            }\n            \n        }\n        return processUnitRepository.pagerQueryProcessUnitInstance(pagerQueryReq);\n    }\n    \n    public PagerResult pagerQueryProcessUnitExecution(PagerCondition pagerQueryReq) {\n        FieldEntry unitCodeField = pagerQueryReq.getField(\"unitCode\");\n        String unitCode = unitCodeField == null ? null : (String) unitCodeField.getValue();\n        if (unitCode != null && !unitCode.isEmpty()) {\n            ProcessUnitEntity processUnit = processUnitRepository.getProcessUnitByCode(unitCode);\n            if (processUnit == null) {\n                throw new UserException(ExportResponseCode.INVALID.getCode(), \"process unit \" + unitCode + \" not exists\");\n            }\n        }\n        int pageSize = pagerQueryReq.getPageSize();\n        if (pageSize > pagerQueryMaxPageSize) {\n            throw new UserException(ExportResponseCode.INVALID.getCode(), \"page record num should not greater than \" + pagerQueryMaxPageSize);\n        }\n        FieldEntry queryTypeField = pagerQueryReq.getField(\"queryType\");\n        String queryType = queryTypeField.stringValue();\n        if (ProcessUnitConstants.EXECUTION_QUERY_TYPE_INSTANCE.equals(queryType)) {\n            \n        } else if (ProcessUnitConstants.EXECUTION_QUERY_TYPE_REQUEST_TIME_RANGE.equals(queryType)) {\n            FieldEntry requestTimeStartField = pagerQueryReq.getField(\"requestTimeStart\");\n            FieldEntry requestTimeEndField = pagerQueryReq.getField(\"requestTimeEnd\");\n            String requestTimeStartStr = requestTimeStartField == null ? null : (String) requestTimeStartField.getValue();\n            String requestTimeEndStr = requestTimeEndField == null ? null : (String) requestTimeEndField.getValue();\n            Date requestTimeStart = null;\n            try {\n                requestTimeStart = new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\").parse(requestTimeStartStr);\n            } catch (Exception e) {\n                throw new UserException(ExportResponseCode.INVALID.getCode(), \"date \" + requestTimeStartStr + \" illegal\");\n            }\n            Date requestTimeEnd = null;\n            try { \n                requestTimeEnd = new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\").parse(requestTimeEndStr);\n            } catch (Exception e) {\n                throw new UserException(ExportResponseCode.INVALID.getCode(), \"date \" + requestTimeEndStr + \" illegal\");\n            }\n            if (requestTimeEnd.getTime() - requestTimeStart.getTime() > pagerQueryTimeRangeDays * 24L * 3600 * 1000) {\n                throw new UserException(ExportResponseCode.INVALID.getCode(), \"date range should not greater than \" + pagerQueryTimeRangeDays + \" days\");\n            }\n            \n        }       \n        \n        return processUnitRepository.pagerQueryProcessUnitExecution(pagerQueryReq);\n    }\n    \n    public BatchExecuteRes updateAutoRunFlag(BatchExecuteReq req) {\n        log.info(\"Update auto run flag ,request:{}\", req);\n        if (BatchExecuteReq.TYPE_BATCH.equals(req.getType())) {\n            List<ProcessUnitInstanceKey> keyList = new ArrayList<ProcessUnitInstanceKey>();\n            ProcessUnitEntity unit = null;\n            if (req.getInstanceNoList() != null) {\n                String unitCode = null;\n                if (req.getProcessUnitCodeList() != null) {\n                    if (req.getProcessUnitCodeList().size() > 1) {\n                        throw new UserException(\"processUnitCodeList at most has one\");\n                    } else {\n                        unitCode = req.getProcessUnitCodeList().get(0);\n                        unit = processUnitRepository.getProcessUnitByCode(unitCode);\n                    }\n                }\n                String finalUnitCode = unitCode;\n                req.getInstanceNoList().forEach(instanceNo -> keyList.add(new ProcessUnitInstanceKey(instanceNo, finalUnitCode, null)));\n            } else if (req.getBizNoList() != null) {\n                if (req.getProcessUnitCodeList() == null || req.getProcessUnitCodeList().size() != 1) {\n                    throw new UserException(\"processUnitCodeList should only one\");\n                }\n                req.getBizNoList().forEach(bizNo -> keyList.add(new ProcessUnitInstanceKey(req.getProcessUnitCodeList().get(0), bizNo)));\n            } else {\n                throw new UserException(\"Param illegal:\" + req);\n            }\n            updateOneBatchAutoRunFlag(unit, keyList, req);\n        } else {\n            if (req.getNextAutoRunTimeEnd() == null) {\n                throw new UserException(\"nextAutoRunTimeEnd is null\");\n            }\n            List<ProcessUnitEntity> unitList = null;\n            if (req.getProcessUnitCodeList() != null && !req.getProcessUnitCodeList().isEmpty()) {\n                unitList = new ArrayList<>();\n                for (String code : req.getProcessUnitCodeList()) {\n                    unitList.add(processUnitRepository.getProcessUnitByCode(code));\n                }\n            } else {\n                unitList = processUnitRepository.findAllProcessUnitList();\n            }\n            for (ProcessUnitEntity unit : unitList) {\n                log.info(\"Start process unit:\" + unit.getProcessUnitCode());\n                QueryAsyncInstanceVO query = new QueryAsyncInstanceVO();\n                query.setMaxCount(asyncMaxCount);\n                query.setUnitCode(unit.getProcessUnitCode());\n\n                query.setNextAutoRunTimeStart(req.getNextAutoRunTimeStart());\n                query.setNextAutoRunTime(req.getNextAutoRunTimeEnd());\n                List<ProcessUnitInstanceKey> instanceKeyList = processUnitRepository.findAsyncInstanceKeyList(query);\n                updateOneBatchAutoRunFlag(unit, instanceKeyList, req);\n\n            }\n        }\n        return new BatchExecuteRes();\n    }\n    \n    private void updateOneBatchAutoRunFlag(ProcessUnitEntity entity, List<ProcessUnitInstanceKey> instanceKeyList,\n            BatchExecuteReq req) {\n        log.info(\"Update autoRunFlag list:{}\", instanceKeyList);\n        if (instanceKeyList.size() == 0) {\n            return;\n        }\n        for (ProcessUnitInstanceKey key : instanceKeyList) {\n            if (stop) {\n                log.warn(\"Process unit server shutdown, stop update AutoRunFlag:{}\", key.getInstanceNo());\n                throw new UserException(ProcessUnitErrorCodeEnum.PU_0101.name(),\n                        ProcessUnitErrorCodeEnum.PU_0101.getDesc());\n            }\n            ProcessUnitInstanceEntity instance = processUnitRepository.getInstance(key.getInstanceNo(),\n                    key.getUnitCode(), key.getBizNo());\n            if (instance == null) {\n                throw new UserException(\"instance:\" + key.getInstanceNo() + \" \" + key.getUnitCode() + \" \" + key.getBizNo() + \" not exits\");\n            }    \n            if (entity == null) {\n                entity = processUnitRepository.getProcessUnitByCode(instance.getProcessUnitCode());\n            }\n            ProcessUnitEntity finalEntity = entity;            \n            lockManager.doInlock(instance.getProcessUnitCode(), instance.getBizNo(), null, () -> {\n                        puTransactionTemplate.doInTransaction(finalEntity, instance.getBizNo(), null, null, () -> {\n                            ProcessUnitInstanceEntity unitInstance = processUnitRepository.getInstance(instance.getInstanceNo(),\n                                    instance.getProcessUnitCode(), instance.getBizNo());\n                            if (! Boolean.TRUE.equals(unitInstance.getAutoRunFlag())) {\n                                log.warn(\"instance:\" + unitInstance.getInstanceNo() + \" \" + unitInstance.getProcessUnitCode() + \" \" + unitInstance.getBizNo() + \" autoRun is not true, skipped\");\n                                return null;\n                            }\n                            unitInstance.setAutoRunFlag(false);\n                            String extData = unitInstance.getExtData();\n                            Map<String, Object> extDataMap = JSON.parseObject(extData, Map.class);\n                            if (extDataMap == null) {\n                                extDataMap = new HashMap<String, Object>();\n                            }\n                            extDataMap.put(ProcessUnitConstants.INSTANCE_EXT_DATA_UPDATE_AUTO_RUN_TIME, System.currentTimeMillis());\n                            unitInstance.setExtData(JSON.toJSONString(extDataMap));\n                            log.warn(\"instance:\" + unitInstance.getInstanceNo() + \" \" + unitInstance.getProcessUnitCode() + \" \" + unitInstance.getBizNo() + \" autoRun is updated to false\");\n                            processUnitRepository.updateInstance(unitInstance);\n                            return null;\n                        });\n                        return null;\n                    });\n        }\n\n    }    \n    \n    public void shutdown() {\n        stop = true;\n    }\n    \n    public String getExecuteMessageTopic() {\n        return executeMessageTopic;\n    }\n\n    public void setExecuteMessageTopic(String executeMessageTopic) {\n        this.executeMessageTopic = executeMessageTopic;\n    }\n\n    public AsyncServerProcessUnitExecutor getAsyncServerProcessUnitExecutor() {\n        return asyncServerProcessUnitExecutor;\n    }\n\n    public void setAsyncServerProcessUnitExecutor(AsyncServerProcessUnitExecutor asyncServerProcessUnitExecutor) {\n        this.asyncServerProcessUnitExecutor = asyncServerProcessUnitExecutor;\n    }\n\n    public ProcessUnitRepository getProcessUnitRepository() {\n        return processUnitRepository;\n    }\n\n    public void setProcessUnitRepository(ProcessUnitRepository processUnitRepository) {\n        this.processUnitRepository = processUnitRepository;\n    }\n\n    public MessageSendService getMessageSendService() {\n        return messageSendService;\n    }\n\n    public void setMessageSendService(MessageSendService messageSendService) {\n        this.messageSendService = messageSendService;\n    }\n\n    public String getCreateMessageTopic() {\n        return createMessageTopic;\n    }\n\n    public void setCreateMessageTopic(String createMessageTopic) {\n        this.createMessageTopic = createMessageTopic;\n    }\n\n    public String getUpdateMessageTopic() {\n        return updateMessageTopic;\n    }\n\n    public void setUpdateMessageTopic(String updateMessageTopic) {\n        this.updateMessageTopic = updateMessageTopic;\n    }\n\n    public int getAsyncMaxCount() {\n        return asyncMaxCount;\n    }\n\n    public void setAsyncMaxCount(int asyncMaxCount) {\n        this.asyncMaxCount = asyncMaxCount;\n    }\n\n    public int getPagerQueryTimeRangeDays() {\n        return pagerQueryTimeRangeDays;\n    }\n\n    public void setPagerQueryTimeRangeDays(int pagerQueryTimeRangeDays) {\n        this.pagerQueryTimeRangeDays = pagerQueryTimeRangeDays;\n    }\n\n    public int getPagerQueryMaxPageSize() {\n        return pagerQueryMaxPageSize;\n    }\n\n    public void setPagerQueryMaxPageSize(int pagerQueryMaxPageSize) {\n        this.pagerQueryMaxPageSize = pagerQueryMaxPageSize;\n    }\n\n    public int getMaxThreadNumPerUnitCode() {\n        return maxThreadNumPerUnitCode;\n    }\n\n    public void setMaxThreadNumPerUnitCode(int maxThreadNumPerUnitCode) {\n        this.maxThreadNumPerUnitCode = maxThreadNumPerUnitCode;\n    }\n\n    public SyncServerProcessUnitExecutor getSyncServerProcessUnitExecutor() {\n        return syncServerProcessUnitExecutor;\n    }\n\n    public void setSyncServerProcessUnitExecutor(SyncServerProcessUnitExecutor syncServerProcessUnitExecutor) {\n        this.syncServerProcessUnitExecutor = syncServerProcessUnitExecutor;\n    }\n\n    public PuTransactionTemplate getPuTransactionTemplate() {\n        return puTransactionTemplate;\n    }\n\n    public void setPuTransactionTemplate(PuTransactionTemplate puTransactionTemplate) {\n        this.puTransactionTemplate = puTransactionTemplate;\n    }\n\n    public LockManager getLockManager() {\n        return lockManager;\n    }\n\n    public void setLockManager(LockManager lockManager) {\n        this.lockManager = lockManager;\n    }\n    \n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/service/ProcessUnitShardingToolService.java",
    "content": "package com.jd.easyflow.processunit.domain.service;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Objects;\nimport java.util.concurrent.ExecutionException;\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.Future;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.dao.DuplicateKeyException;\n\nimport com.jd.easyflow.codegenerator.client.CodeGenerateHelper;\nimport com.jd.easyflow.common.dto.pager.FieldEntry;\nimport com.jd.easyflow.common.dto.pager.PagerCondition;\nimport com.jd.easyflow.common.exception.EasyFlowException;\nimport com.jd.easyflow.lock.Locker;\nimport com.jd.easyflow.processunit.domain.constant.ProcessUnitConstants;\nimport com.jd.easyflow.processunit.domain.model.entity.ProcessUnitEntity;\nimport com.jd.easyflow.processunit.domain.model.vo.ShardingCompareContext;\nimport com.jd.easyflow.processunit.domain.model.vo.ShardingMigrateContext;\nimport com.jd.easyflow.processunit.domain.repository.ProcessUnitRepository;\nimport com.jd.easyflow.processunit.infrastructure.persistence.mapper.ProcessUnitExecutionMapper;\nimport com.jd.easyflow.processunit.infrastructure.persistence.mapper.ProcessUnitInstanceMapper;\nimport com.jd.easyflow.processunit.infrastructure.persistence.po.ProcessUnitExecution;\nimport com.jd.easyflow.processunit.infrastructure.persistence.po.ProcessUnitInstance;\nimport com.jd.easyflow.sharding.config.ShardGroupInfo;\nimport com.jd.easyflow.sharding.config.ShardingConfigManager;\nimport com.jd.easyflow.sharding.service.ShardingService;\n\n/**\n * \n * \n * @author liyuliang5\n */\npublic class ProcessUnitShardingToolService {\n\n    private static final Logger log = LoggerFactory.getLogger(ProcessUnitShardingToolService.class);\n\n    @Autowired\n    private ProcessUnitInstanceMapper processUnitInstanceMapper;\n    @Autowired\n    private ProcessUnitExecutionMapper processUnitExecutionMapper;\n    @Autowired\n    private ProcessUnitRepository processUnitRepository;\n\n    private ShardingService shardingService;\n\n    private ShardingConfigManager shardingConfigManager;\n\n    private Locker lockService;\n\n    protected boolean migrateStopFlag;\n\n    protected boolean compareStopFlag;\n\n    public void migrate(ShardingMigrateContext context) {\n        for (String unitCode : context.getUnitCodeList()) {\n            log.info(\"Start migrate process unit:{}\", unitCode);\n            try {\n                migrateOneUnit(unitCode, context);\n                log.info(\"Process unit:{} migrate end\", unitCode);\n            } catch (Exception e) {\n                log.error(\"Process unit:\" + unitCode + \" migrate exception \" + e.getMessage(), e);\n            }\n        }\n    }\n\n\n    private void migrateOneUnit(String unitCode, ShardingMigrateContext context) {\n        ProcessUnitEntity processUnit = processUnitRepository.getProcessUnitByCode(unitCode);\n        ShardGroupInfo shardGroup = shardingConfigManager.getShardGroupMap().get(unitCode);\n        List<String> shardList = shardGroup.getShardList();\n        log.info(\"{} migrate shard list are:{}\", unitCode, shardList);\n        ExecutorService service = Executors.newFixedThreadPool(context.getThreadCount());\n        List<Future> resultList = new ArrayList<Future>();\n        shardList.forEach(shard -> {\n            resultList.add(service.submit(() -> {\n                migrateOneShard(unitCode, shard, shardGroup, context);\n            }));\n        });\n        for (Future<Boolean> future : resultList) {\n            try {\n                future.get();\n            } catch (InterruptedException | ExecutionException e) {\n                log.error(\"Migrate task execution exception:\" + e.getMessage(), e);\n            }\n        }\n    }\n\n    private void migrateOneShard(String unitCode, String shard, ShardGroupInfo shardGroup, ShardingMigrateContext context) {\n        log.info(\"Start migrate unitCode:{} shard:{}\", unitCode, shard);\n        try {\n            PagerCondition condition = new PagerCondition();\n            condition.addField(new FieldEntry(\"processUnitCode\", unitCode));\n            if (context.getCreatedDateStart() != null) {\n                condition.addField(new FieldEntry(\"createdDateStart\", context.getCreatedDateStart()));\n            }\n            if (context.getCreatedDateEnd() != null) {\n                condition.addField(new FieldEntry(\"createdDateEnd\", context.getCreatedDateEnd()));\n            }\n            if (context.getInstanceNo() != null) {\n                condition.addField(new FieldEntry(\"instanceNo\", context.getInstanceNo()));\n            }\n            if (context.getResultList() != null) {\n                condition.addField(new FieldEntry(\"resultList\", context.getResultList()));\n            }\n            condition.addSortField(\"id\", 0, \"asc\");\n            condition.setPageSize(context.getPageSize());\n            condition.setStart(-2);\n            shardingService.executeInShard(shard, (shardInfo) -> {\n                FieldEntry idStartEntry = new FieldEntry(\"idStart\", -1);\n                condition.addField(idStartEntry);\n                int count = 0;\n                while (true) {\n                    List<ProcessUnitInstance> list = processUnitInstanceMapper\n                            .selectProcessUnitInstanceByPageCondition(condition);\n                    long lastId = list.size() == 0 ? -1 : list.get(list.size() - 1).getId();\n                    for (ProcessUnitInstance instance : list) {\n                        migrateOneInstance(instance, shardGroup, context);\n                        if (migrateStopFlag) {\n                            log.info(\"Migrate end\");\n                            return null;\n                        }\n                    }\n                    count += list.size();\n                    log.info(\"shard:{} migrate finished count:{}\", shard, count);\n                    if (list.size() == 0) {\n                        return null;\n                    }\n                    idStartEntry.setValue(lastId);\n                }\n            });\n        } catch (Exception e) {\n            log.error(\"Migrate shard:\" + shard + \" exception\", e);\n            throw e;\n        }\n    }\n\n    private void migrateOneInstance(ProcessUnitInstance instance, ShardGroupInfo shardGroup, ShardingMigrateContext context) {\n        Runnable runnable = () -> {\n                String slaveShard = shardingService.computeSlaveShard(instance.getProcessUnitCode(), instance.getBizNo(),\n                        shardGroup);\n            if (slaveShard == null) {\n                throw new EasyFlowException(instance.getProcessUnitCode() + \" slaveShard not configured\");\n            }\n            shardingService.executeInShard(slaveShard, (shardInfo) -> {\n                try {\n                    if (context.isNewId()) {\n                        String idStr = CodeGenerateHelper.generateCode(\"PU-INSTANCE-ID\", \"\");\n                        instance.setId(Long.parseLong(idStr));\n                    }\n                    processUnitInstanceMapper.insertForMigration(instance);\n                } catch (DuplicateKeyException e) {\n                    log.warn(instance.getId() + \"-\" + instance.getInstanceNo() + \"-\" + instance.getProcessUnitCode()\n                            + \"-\" + instance.getBizNo() + \" insert duplicate exception\");\n                    processUnitInstanceMapper.updateForMigration(instance);\n                    \n                }\n                return null;\n            });\n            if (context.isMigrateExecution()) {\n                List<ProcessUnitExecution> executionList = processUnitExecutionMapper\n                        .selectProcessUnitExecution(Arrays.asList(instance.getInstanceNo()));\n                for (ProcessUnitExecution execution : executionList) {\n                    shardingService.executeInShard(slaveShard, (shardInfo) -> {\n                        if (context.isNewId()) {\n                            String idStr = CodeGenerateHelper.generateCode(\"PU-EXECUTION-ID\", \"\");\n                            execution.setId(Long.parseLong(idStr));\n                        }\n                        try {\n                            processUnitExecutionMapper.insertForMigration(execution);\n                        } catch (DuplicateKeyException e) {\n                            log.warn(execution.getId() + \"-\" + execution.getExecutionNo() + \" insert duplicate exception\");\n                            processUnitExecutionMapper.updateForMigration(execution);\n                        }\n                        return null;\n                    });\n                }\n            }\n        };\n        if (!context.isLock()) {\n            runnable.run();\n        } else {\n            lockService.doInlock(ProcessUnitConstants.LOCK_BIZ_TYPE,\n                    instance.getProcessUnitCode() + ProcessUnitConstants.LOCK_KEY_SEP + instance.getBizNo(), 10,\n                    ProcessUnitConstants.DEFAULT_WAIT_SECONDS, () -> {\n                        runnable.run();\n                        return null;\n                    });\n        }\n    }\n\n    public void compare(ShardingCompareContext context) {\n        for (String unitCode : context.getUnitCodeList()) {\n            compareOneUnit(unitCode, context);\n        }\n    }\n\n    public void compareOneUnit(String unitCode, ShardingCompareContext context) {\n        ProcessUnitEntity processUnit = processUnitRepository.getProcessUnitByCode(unitCode);\n        ShardGroupInfo shardGroup = shardingConfigManager.getShardGroupMap().get(unitCode);\n        List<String> shardList = shardGroup.getShardList();\n        for (String shard : shardList) {\n            compareOneShard(unitCode, shard, shardGroup, context);\n        }\n    }\n\n    private void compareOneShard(String unitCode, String shard, ShardGroupInfo shardGroup, ShardingCompareContext context) {\n        log.info(\"Start compare unitCode:{} shard:{}\", unitCode, shard);\n        try {\n            PagerCondition condition = new PagerCondition();\n            condition.addField(new FieldEntry(\"processUnitCode\", unitCode));\n            if (context.getCreatedDateStart() != null) {\n                condition.addField(new FieldEntry(\"createdDateStart\", context.getCreatedDateStart()));\n            }\n            if (context.getCreatedDateEnd() != null) {\n                condition.addField(new FieldEntry(\"createdDateEnd\", context.getCreatedDateEnd()));\n            }\n            if (context.getInstanceNo() != null) {\n                condition.addField(new FieldEntry(\"instanceNo\", context.getInstanceNo()));\n            }\n            if (context.getResultList() != null) {\n                condition.addField(new FieldEntry(\"resultList\", context.getResultList()));\n            }\n            condition.addSortField(\"id\", 0, \"asc\");\n            condition.setPageSize(context.getPageSize());\n            condition.setStart(-2);\n            List<String> failList = new ArrayList<String>();\n            shardingService.executeInShard(shard, (shardInfo) -> {\n                FieldEntry idStartEntry = new FieldEntry(\"idStart\", -1);\n                condition.addField(idStartEntry);\n                int count = 0;\n                while (true) {\n                    List<ProcessUnitInstance> list = processUnitInstanceMapper\n                            .selectProcessUnitInstanceByPageCondition(condition);\n                    long lastId = list.size() == 0 ? -1 : list.get(list.size() - 1).getId();\n                    for (ProcessUnitInstance instance : list) {\n                        compareOneInstance(instance, shardGroup, failList, context);\n                        if (compareStopFlag) {\n                            log.info(\"Compare terminal\");\n                            return null;\n                        }\n                        if (failList.size() > 1000) {\n                            log.info(\"Compare fail list:\" + failList);\n                            failList.clear();\n                        }\n                    }\n                    count += list.size();\n                    log.info(\"shard{} compare finished count {}\", shard, count);\n                    if (list.size() == 0) {\n                        return null;\n                    }\n                    idStartEntry.setValue(lastId);\n                }\n            });\n            if (failList.size() > 0) {\n                log.info(\"Compare fail list:\" + failList);\n            }\n        } catch (Exception e) {\n            log.error(\"Compare shard\" + shard + \" exception\", e);\n            throw e;\n        }\n    }\n\n    private void compareOneInstance(ProcessUnitInstance instance, \n            ShardGroupInfo shardGroup, List<String> failList, ShardingCompareContext context) {\n        Runnable runnable = () -> {\n            String slaveShard = shardingService.computeSlaveShard(instance.getProcessUnitCode(), instance.getBizNo(),\n                    shardGroup);\n            if (slaveShard == null) {\n                throw new EasyFlowException(instance.getProcessUnitCode() + \" slaveShard not configured\");\n            }\n            shardingService.executeInShard(slaveShard, (shardInfo) -> {\n                ProcessUnitInstance newInstance = processUnitInstanceMapper.getByInstanceNo(instance.getInstanceNo());\n                if (newInstance == null) {\n                    log.info(\"{} compare fail, record in new shard not exists\", instance.getInstanceNo());\n                    failList.add(instance.getInstanceNo());\n                    context.getFailCount().incrementAndGet();\n                } else {\n                    if (!Objects.equals(instance.getResult(), newInstance.getResult()) \n                            || !Objects.equals(instance.getProcessUnitCode(), newInstance.getProcessUnitCode())\n                            || !Objects.equals(instance.getBizNo(), newInstance.getBizNo())\n                            || !Objects.equals(instance.getRequestContent(), newInstance.getRequestContent())\n                            || !Objects.equals(instance.getResponseContent(), newInstance.getResponseContent())\n                            || !Objects.equals(instance.getExtData(), newInstance.getExtData())\n                            || !Objects.equals(instance.getAutoRunFlag(), newInstance.getAutoRunFlag())\n                            || !Objects.equals(instance.getAutoRunTimes(), newInstance.getAutoRunTimes())\n                            || !Objects.equals(instance.getNextAutoRunTime(), newInstance.getNextAutoRunTime())\n                            || !Objects.equals(instance.getParentNo(), newInstance.getParentNo())\n                            || !Objects.equals(instance.getProductCode(), newInstance.getProductCode())) {\n                        log.info(\"{} compare fail, old data:{} new data:{}\", instance.getInstanceNo(), instance,\n                                newInstance);\n                        failList.add(instance.getInstanceNo());\n                        context.getFailCount().incrementAndGet();\n                    }\n                }\n                return null;\n            });\n        };\n        if (!context.isLock()) {\n            runnable.run();\n        } else {\n            lockService.doInlock(ProcessUnitConstants.LOCK_BIZ_TYPE,\n                    instance.getProcessUnitCode() + ProcessUnitConstants.LOCK_KEY_SEP + instance.getBizNo(), 10,\n                    ProcessUnitConstants.DEFAULT_WAIT_SECONDS, () -> {\n                        runnable.run();\n                        return null;\n                    });\n        }\n    }\n\n    public ProcessUnitInstanceMapper getProcessUnitInstanceMapper() {\n        return processUnitInstanceMapper;\n    }\n\n    public void setProcessUnitInstanceMapper(ProcessUnitInstanceMapper processUnitInstanceMapper) {\n        this.processUnitInstanceMapper = processUnitInstanceMapper;\n    }\n\n    public ProcessUnitRepository getProcessUnitRepository() {\n        return processUnitRepository;\n    }\n\n    public void setProcessUnitRepository(ProcessUnitRepository processUnitRepository) {\n        this.processUnitRepository = processUnitRepository;\n    }\n\n    public Locker getLockService() {\n        return lockService;\n    }\n\n    public void setLockService(Locker lockService) {\n        this.lockService = lockService;\n    }\n\n    public boolean isMigrateStopFlag() {\n        return migrateStopFlag;\n    }\n\n    public void setMigrateStopFlag(boolean migrateStopFlag) {\n        this.migrateStopFlag = migrateStopFlag;\n    }\n\n    public boolean isCompareStopFlag() {\n        return compareStopFlag;\n    }\n\n    public void setCompareStopFlag(boolean compareStopFlag) {\n        this.compareStopFlag = compareStopFlag;\n    }\n\n\n    public ProcessUnitExecutionMapper getProcessUnitExecutionMapper() {\n        return processUnitExecutionMapper;\n    }\n\n\n    public void setProcessUnitExecutionMapper(ProcessUnitExecutionMapper processUnitExecutionMapper) {\n        this.processUnitExecutionMapper = processUnitExecutionMapper;\n    }\n\n\n    public ShardingService getShardingService() {\n        return shardingService;\n    }\n\n\n    public void setShardingService(ShardingService shardingService) {\n        this.shardingService = shardingService;\n    }\n\n\n    public ShardingConfigManager getShardingConfigManager() {\n        return shardingConfigManager;\n    }\n\n\n    public void setShardingConfigManager(ShardingConfigManager shardingConfigManager) {\n        this.shardingConfigManager = shardingConfigManager;\n    }\n    \n    \n\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/service/impl/AsyncServerProcessUnitExecutor.java",
    "content": "package com.jd.easyflow.processunit.domain.service.impl;\n\nimport java.util.Arrays;\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Qualifier;\n\nimport com.jd.easyflow.alert.AlertUtil;\nimport com.jd.easyflow.codegenerator.client.CodeGenerateHelper;\nimport com.jd.easyflow.common.exception.EasyFlowException;\nimport com.jd.easyflow.common.util.UUIDUtil;\nimport com.jd.easyflow.lock.Locker;\nimport com.jd.easyflow.processunit.domain.constant.ProcessUnitConstants;\nimport com.jd.easyflow.processunit.domain.gateway.ProcessUnitClientGateway;\nimport com.jd.easyflow.processunit.domain.model.entity.ProcessUnitEntity;\nimport com.jd.easyflow.processunit.domain.model.entity.ProcessUnitExecutionEntity;\nimport com.jd.easyflow.processunit.domain.model.entity.ProcessUnitInstanceEntity;\nimport com.jd.easyflow.processunit.domain.model.vo.ExecContext;\nimport com.jd.easyflow.processunit.domain.model.vo.ExecPolicy;\nimport com.jd.easyflow.processunit.domain.repository.ProcessUnitRepository;\nimport com.jd.easyflow.processunit.domain.support.LockManager;\nimport com.jd.easyflow.processunit.domain.support.PuTransactionTemplate;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n * @author liyuliang5\n * \n */\npublic class AsyncServerProcessUnitExecutor extends BaseProcessUnitExecutor {\n    \n    private static final Logger log = LoggerFactory.getLogger(AsyncServerProcessUnitExecutor.class);\n\n\n    private static final String PU_EXECUTION = \"PE\";\n\n    private LockManager lockManager;\n    @Autowired\n    private ProcessUnitRepository processUnitRepository;\n    @Autowired\n    private ProcessUnitClientGateway processUnitClientGateway;\n    \n    @Autowired(required = false)\n    @Qualifier(ProcessUnitConstants.BEAN_PU_TX_TEMPLATE)\n    private PuTransactionTemplate puTransactionTemplate = new PuTransactionTemplate();\n    \n    \n    private Map<String, Object> defaultAlertRules;\n    \n    {\n        defaultAlertRules = new HashMap<String, Object>();\n        Map<String, Object> asyncResultConf = new HashMap<String, Object>();\n        asyncResultConf.put(\"resultList\", Arrays.asList(ProcessUnitConstants.RESULT_EXCEPTION, ProcessUnitConstants.RESULT_FAIL));\n        defaultAlertRules.put(ProcessUnitConstants.ALERT_CODE_ASYNC_RESULT, asyncResultConf);\n        Map<String, Object> asyncMaxTimesConf = new HashMap<String, Object>();\n        asyncMaxTimesConf.put(\"resultList\", Arrays.asList(ProcessUnitConstants.RESULT_EXCEPTION));\n        defaultAlertRules.put(ProcessUnitConstants.ALERT_CODE_ASYNC_MAX_TIMES, asyncMaxTimesConf);        \n    }\n    \n    \n    @Override\n    public ExecPolicy beforeCall(ExecContext context) {\n        log.info(\"Start async before call\");\n\n        String instanceNo = context.getParam().getInstanceNo();\n        String bizNo = context.getParam().getBizNo();\n        String unitCode = context.getParam().getUnitCode();\n        if (bizNo == null || unitCode == null) {\n            ProcessUnitInstanceEntity instance = processUnitRepository.getInstance(instanceNo, null, null);\n            bizNo = instance.getBizNo();\n            unitCode = instance.getProcessUnitCode();\n        }\n        ProcessUnitEntity unit = processUnitRepository.getProcessUnitByCode(unitCode);\n        Integer lockSeconds = (Integer) unit.getConfig(ProcessUnitConstants.CONF_LOCK_SECONDS);\n        if (lockSeconds == null) {\n            lockSeconds = ProcessUnitConstants.DEFAULT_LOCK_SECONDS;\n        }\n        String requestId = lockManager.lock(unitCode, bizNo, ProcessUnitConstants.SCENE_ASYNC);\n        String finalBizNo = bizNo;\n        String finalUnitCode = unitCode ;\n        return puTransactionTemplate.doInTransaction(context.getProcessUnit(), context.getBizNo(), ProcessUnitConstants.SCENE_ASYNC, null, () -> {\n        ProcessUnitInstanceEntity instance = processUnitRepository.getInstance(instanceNo, finalUnitCode, finalBizNo);\n        context.setProcessUnit(unit);\n        context.setInstance(instance);\n        context.setLastResult(instance.getResult());\n        context.setLastRequestContent(instance.getRequestContent());\n        context.setLastResponseContent(instance.getResponseContent());\n        context.setUnitCode(unit.getProcessUnitCode());\n        context.setBizNo(instance.getBizNo());\n        log.info(\"Unit code:{}, biz no:{}\", context.getUnitCode(), context.getBizNo());\n        context.setLocked(true);\n        context.setLockRequestId(requestId);\n        ExecPolicy policy = getExecPolicy(context);\n        context.setPolicy(policy);\n        saveBeforeCall(context);\n        return policy;\n        });\n    }\n\n    @Override\n    public void call(ExecPolicy policy, ExecContext context) {\n        switch (policy.getPolicyType()) {\n        case ProcessUnitConstants.POLICY_EXCEPTION: {\n            throw new UnsupportedOperationException();\n        }\n        case ProcessUnitConstants.POLICY_OLD: {\n            throw new UnsupportedOperationException();\n        }\n        case ProcessUnitConstants.POLICY_REQUEST: {\n            processUnitClientGateway.asyncCallReal(context);\n            break;\n        }\n        default:\n            throw new RuntimeException(\"policy illegal:\" + policy);\n        }\n        List<String> alertResultList = getAlertResultList(ProcessUnitConstants.ALERT_CODE_ASYNC_RESULT, context.getProcessUnit());\n        if (alertResultList != null && alertResultList.contains(context.getResult().getResult())) {\n            AlertUtil.doAlert(ProcessUnitConstants.ALERT_CODE_ASYNC_RESULT,\n                    \"Process unit:\" + context.getUnitCode() + \" instance:\" + context.getInstance().getInstanceNo() + \"Async result trigger alert, Exec result:\"\n                            + context.getResult().getResult() + \"Response content:\" + context.getResult().getResponseContent(),\n                    null, context.getInstance(), context.getInstance().getProductCode());\n        }\n        context.setExecuted(true);\n    }\n    \n    \n    private List<String> getAlertResultList(String alertCode, ProcessUnitEntity processUnit) {\n        List<String> alertResultList = null;\n        Map<String, Object> alertRules = processUnit == null ? null : (Map<String, Object>) processUnit.getConfig(ProcessUnitConstants.CONF_ALERT_RULES);\n       if (alertRules != null) {\n           Map<String, Object> alertConfig = (Map<String, Object>) alertRules.get(alertCode);\n           if (alertConfig != null) {\n               List<String> configResultList = (List<String>) alertConfig.get(\"resultList\");\n               if (configResultList != null) {\n                   alertResultList = configResultList;\n               }\n           }\n       }\n       if (alertResultList == null && defaultAlertRules != null) {\n               Map<String, Object> defaultAlertConfig = (Map<String, Object>) defaultAlertRules.get(alertCode);\n               if (defaultAlertConfig != null) {\n                   alertResultList = (List<String>) defaultAlertConfig.get(\"resultList\");\n               }\n       }\n       return alertResultList;\n    }\n\n    @Override\n    public void afterCall(ExecContext context) {\n        if (context.isExecuted()) {\n            puTransactionTemplate.doInTransaction(context.getProcessUnit(), context.getBizNo(), ProcessUnitConstants.SCENE_ASYNC, null, () -> {\n            ProcessUnitExecutionEntity execution = context.getExecution();\n            execution.setResult(context.getResult().getResult());\n            execution.setResponseContent(context.getResult().getResponseContent());\n            execution.setResponseTime(new Date());\n            execution.setElaspeTime(\n                    (int) (execution.getResponseTime().getTime() - execution.getRequestTime().getTime()));\n            String extData = execution.getExtData();\n            Map<String, Object> executionExtDataMap = JSON.parseObject(extData, Map.class);\n            if (executionExtDataMap == null) {\n                executionExtDataMap = new HashMap<>();\n            }\n            executionExtDataMap.put(ProcessUnitConstants.EXECUTION_EXT_DATA_AFTER_VARS, context.getVariables());\n            executionExtDataMap.put(ProcessUnitConstants.EXECUTION_EXT_DATA_CLIENT_INFO, context.getClientInfo());\n            execution.setExtData(JSON.toJSONString(executionExtDataMap));\n            processUnitRepository.updateExecution(execution);\n            ProcessUnitInstanceEntity instance = context.getInstance();\n            instance.setResult(context.getResult().getResult());\n            instance.setResponseContent(context.getResult().getResponseContent());\n            instance.setAutoRunTimes(instance.getAutoRunTimes() == null ? 1 : instance.getAutoRunTimes() + 1);\n\n            Boolean autoRunFlag = context.getResult().getAutoRunFlag();\n            if (autoRunFlag == null) {\n                autoRunFlag = false;\n                Integer maxTimes = (Integer) context.getProcessUnit()\n                        .getConfig(ProcessUnitConstants.CONF_AUTO_ASYNC_MAX_TIMES);\n                if (maxTimes == null || instance.getAutoRunTimes() >= maxTimes) {\n                    autoRunFlag = false;\n                    List<String> alertResultList = getAlertResultList(ProcessUnitConstants.ALERT_CODE_ASYNC_MAX_TIMES, context.getProcessUnit());\n                    if (alertResultList != null && alertResultList.contains(context.getResult().getResult())) {\n                        AlertUtil.doAlert(ProcessUnitConstants.ALERT_CODE_ASYNC_MAX_TIMES,\n                                \"Process unit:\" + context.getUnitCode() + \" instance:\" + instance.getInstanceNo()\n                                        + \"retry to max times!!!, exec result:\" + context.getResult().getResult() + \"response content:\"\n                                        + context.getResult().getResponseContent(),\n                                null, instance, instance.getProductCode());\n                    }\n                } else {\n                    Map<String, Object> autoRunPolicy = (Map<String, Object>) context.getProcessUnit()\n                            .getConfig(ProcessUnitConstants.CONF_AUTO_RUN_POLICY);\n                    if (autoRunPolicy != null) {\n                        autoRunFlag = (Boolean) autoRunPolicy.get(context.getResult().getResult());\n                        if (autoRunFlag == null) {\n                            autoRunFlag = false;\n                        }\n                    }\n                }\n            }\n            instance.setAutoRunFlag(autoRunFlag);\n            \n            if (context.getResult().getNextAutoRunTime() != null) {\n                instance.setNextAutoRunTime(context.getResult().getNextAutoRunTime());\n            } else {\n                Integer autoAsyncRunPeriod = (Integer) context.getProcessUnit()\n                        .getConfig(ProcessUnitConstants.CONF_AUTO_ASYNC_RUN_PERIOD);\n                if (autoAsyncRunPeriod == null) {\n                    throw new EasyFlowException(\"autoAsyncRunPeriod is null\");\n                }\n                if (Boolean.TRUE.equals(instance.getAutoRunFlag())) {\n                    Integer powerMaxTime = (Integer) context.getProcessUnit()\n                            .getConfig(ProcessUnitConstants.CONF_AUTO_ASYNC_RUN_PERIOD_POWER_MAX_TIME);\n                    if (powerMaxTime == null) {\n                        instance.setNextAutoRunTime(new Date(System.currentTimeMillis() + autoAsyncRunPeriod * 1000L));\n                    } else {\n                        int autoRunTimes = instance.getAutoRunTimes();\n                        int powerTime = powerMaxTime < autoRunTimes ? powerMaxTime : autoRunTimes;\n                        int currentPeriod = (int) (autoAsyncRunPeriod * Math.pow(2, powerTime));\n                        if (log.isDebugEnabled()) {\n                            log.debug(\"autoRunTimes:{} powerMaxTime:{} powerTime:{} currentPeriod:{}\",\n                                    instance.getAutoRunTimes(), powerMaxTime, powerTime, currentPeriod);\n                        }\n                        instance.setNextAutoRunTime(new Date(System.currentTimeMillis() + currentPeriod * 1000L));\n                    }\n                }\n            }\n            Map<String, String> variables = context.getVariables();\n            instance.setVars(JSON.toJSONString(variables));\n            log.info(\"Instance update result:{}\", instance);\n            processUnitRepository.updateInstance(instance);\n            return null;\n            });\n        }\n        if (context.isLocked()) {\n            lockManager.unlock(context.getProcessUnit().getProcessUnitCode(), context.getBizNo(), ProcessUnitConstants.SCENE_ASYNC, context.getLockRequestId());\n        }\n    }\n\n    protected void saveBeforeCall(ExecContext context) {\n        ProcessUnitInstanceEntity instance = context.getInstance();\n        instance.setResult(ProcessUnitConstants.RESULT_UNKNOWN);\n        instance.setResponseContent(null);\n        processUnitRepository.updateInstance(instance);\n        ProcessUnitExecutionEntity execution = new ProcessUnitExecutionEntity();\n        execution.setInstanceNo(context.getInstance().getInstanceNo());\n        execution.setRequestContent(context.getInstance().getRequestContent());\n        execution.setRequestTime(new Date());\n        execution.setRequestNo(UUIDUtil.getSimpleUUID());\n        execution.setProcessUnitCode(context.getUnitCode());\n        execution.setBizNo(context.getInstance().getBizNo());\n        execution.setExecutionNo(CodeGenerateHelper.generateCode(\"PU_EXECUTION\", PU_EXECUTION));\n        execution.setExecType(context.getParam().getExecType());\n        execution.setProductCode(instance.getProductCode());\n        Map<String, Object> extData = new HashMap<String, Object>();\n        extData.put(ProcessUnitConstants.EXECUTION_EXT_DATA_POLICY_TYPE, context.getPolicy().getPolicyType());\n        Map<String, Object> requestContext = context.getParam().getRequestContext();\n        if (requestContext != null && ! requestContext.isEmpty()) {\n            extData.put(ProcessUnitConstants.EXECUTION_REQUEST_CONTEXT, requestContext);\n        }\n        if (instance.getExtData() != null) {\n            Map<String, Object> extDataMap = JSON.parseObject(instance.getExtData(), Map.class);\n            extData.put(ProcessUnitConstants.EXECUTION_EXT_DATA_BEFORE_VARS,\n                    JSON.parseObject(instance.getVars(), Map.class));\n        }\n        execution.setExtData(JSON.toJSONString(extData));\n        processUnitRepository.saveExecution(execution);\n        context.setExecution(execution);\n        log.info(\"Execution saved, executionNo:\" + execution.getExecutionNo());\n    }\n\n    protected ExecPolicy getExecPolicy(ExecContext context) {\n        ExecPolicy policy = new ExecPolicy();\n        String result = context.getLastResult();\n        Map<String, String> execPolicy = (Map<String, String>) context.getProcessUnit()\n                .getConfig(ProcessUnitConstants.CONF_ASYNC_EXEC_POLICY);\n        String policyType = null;\n        if (ProcessUnitConstants.RESULT_SUCCESS.equals(result)) {\n            policyType = execPolicy != null ? execPolicy.get(ProcessUnitConstants.REQ_TYPE_SUCCESS)\n                    : ProcessUnitConstants.POLICY_EXCEPTION;\n        } else if (ProcessUnitConstants.RESULT_FAIL.equals(result)) {\n            policyType = execPolicy != null ? execPolicy.get(ProcessUnitConstants.REQ_TYPE_FAIL)\n                    : ProcessUnitConstants.POLICY_EXCEPTION;\n        } else if (ProcessUnitConstants.RESULT_DOING.equals(result)) {\n            policyType = execPolicy != null ? execPolicy.get(ProcessUnitConstants.REQ_TYPE_DOING)\n                    : ProcessUnitConstants.POLICY_EXCEPTION;\n        } else {\n            if (ProcessUnitConstants.RESULT_NONE.equals(result) && execPolicy != null) {\n                policyType = execPolicy.get(ProcessUnitConstants.RESULT_NONE);\n            } else if (ProcessUnitConstants.RESULT_UNKNOWN.equals(result) && execPolicy != null) {\n                policyType = execPolicy.get(ProcessUnitConstants.RESULT_UNKNOWN);\n            }\n            if (policyType == null) {\n                policyType = execPolicy != null ? execPolicy.get(ProcessUnitConstants.REQ_TYPE_EXCEPTION)\n                        : ProcessUnitConstants.POLICY_EXCEPTION;\n                log.info(\"Exception policy:\" + policyType);\n            }\n        }\n        policy.setPolicyType(policyType);\n        return policy;\n    }\n    \n    public Map<String, Object> getDefaultAlertRules() {\n        return defaultAlertRules;\n    }\n\n    public void setDefaultAlertRules(Map<String, Object> defaultAlertRules) {\n        this.defaultAlertRules = defaultAlertRules;\n    }\n\n    public ProcessUnitRepository getProcessUnitRepository() {\n        return processUnitRepository;\n    }\n\n    public void setProcessUnitRepository(ProcessUnitRepository processUnitRepository) {\n        this.processUnitRepository = processUnitRepository;\n    }\n\n    public ProcessUnitClientGateway getProcessUnitClientGateway() {\n        return processUnitClientGateway;\n    }\n\n    public void setProcessUnitClientGateway(ProcessUnitClientGateway processUnitClientGateway) {\n        this.processUnitClientGateway = processUnitClientGateway;\n    }\n\n    public LockManager getLockManager() {\n        return lockManager;\n    }\n\n    public void setLockManager(LockManager lockManager) {\n        this.lockManager = lockManager;\n    }\n\n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/service/impl/BaseProcessUnitExecutor.java",
    "content": "package com.jd.easyflow.processunit.domain.service.impl;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.processunit.domain.model.vo.ExecContext;\nimport com.jd.easyflow.processunit.domain.model.vo.ExecParam;\nimport com.jd.easyflow.processunit.domain.model.vo.ExecPolicy;\nimport com.jd.easyflow.processunit.domain.model.vo.ExecResult;\nimport com.jd.easyflow.processunit.domain.service.ProcessUnitExecutor;\n\n/**\n * @author liyuliang5\n * \n */\npublic abstract class BaseProcessUnitExecutor implements ProcessUnitExecutor {\n    \n    private static final Logger log = LoggerFactory.getLogger(BaseProcessUnitExecutor.class);\n\n    @Override\n    public ExecResult execute(ExecParam param) {\n        ExecContext context = new ExecContext(param);\n        try {\n            ExecPolicy policy = beforeCall(context);\n            log.info(\"Return exec policy:{}\" + (policy == null ? null : policy.getPolicyType()));\n            call(policy, context);\n        } finally {\n            afterCall(context);\n        }\n        return context.getResult();\n    }\n\n    public void afterCall(ExecContext context) {\n        throw new UnsupportedOperationException();\n    }\n\n    public void call(ExecPolicy policy, ExecContext context) {\n        throw new UnsupportedOperationException();\n    }\n\n    public ExecPolicy beforeCall(ExecContext context) {\n        throw new UnsupportedOperationException();\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/service/impl/SyncServerProcessUnitExecutor.java",
    "content": "package com.jd.easyflow.processunit.domain.service.impl;\n\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Qualifier;\n\nimport com.jd.easyflow.codegenerator.client.CodeGenerateHelper;\nimport com.jd.easyflow.processunit.domain.constant.ProcessUnitConstants;\nimport com.jd.easyflow.processunit.domain.model.entity.ProcessUnitEntity;\nimport com.jd.easyflow.processunit.domain.model.entity.ProcessUnitExecutionEntity;\nimport com.jd.easyflow.processunit.domain.model.entity.ProcessUnitInstanceEntity;\nimport com.jd.easyflow.processunit.domain.model.vo.ExecContext;\nimport com.jd.easyflow.processunit.domain.model.vo.ExecPolicy;\nimport com.jd.easyflow.processunit.domain.model.vo.ExecResult;\nimport com.jd.easyflow.processunit.domain.repository.ProcessUnitRepository;\nimport com.jd.easyflow.processunit.domain.service.impl.execution.ExecutionPersister;\nimport com.jd.easyflow.processunit.domain.support.LockManager;\nimport com.jd.easyflow.processunit.domain.support.PuTransactionTemplate;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n *\n * @author liyuliang5\n *\n */\npublic class SyncServerProcessUnitExecutor extends BaseProcessUnitExecutor {\n    \n    private static final Logger log = LoggerFactory.getLogger(SyncServerProcessUnitExecutor.class);\n\n\n    private static final String PU_EXECUTION = \"PE\";\n    private static final String PU_INSTANCE = \"PI\";\n\n    private LockManager lockManager;\n    @Autowired\n    private ProcessUnitRepository processUnitRepository;\n\n    @Autowired\n    private ExecutionPersister executionPersister;\n\n    private int syncAutoRunDelaySeconds = 10;\n    \n    @Autowired(required = false)\n    @Qualifier(ProcessUnitConstants.BEAN_PU_TX_TEMPLATE)\n    private PuTransactionTemplate puTransactionTemplate = new PuTransactionTemplate();\n\n    @Override\n    public ExecPolicy beforeCall(ExecContext context) {\n        ProcessUnitEntity unit = processUnitRepository.getProcessUnitByCode(context.getUnitCode());\n        context.setProcessUnit(unit);\n        if (ProcessUnitConstants.STATUS_INVALID.equals(unit.getStatus())) {\n            log.info(\" unit illegal, return REQUEST\");\n            return new ExecPolicy(ProcessUnitConstants.POLICY_REQUEST);\n        }\n        ExecPolicy policy = null;\n        String requestId = lockManager.lock(unit.getProcessUnitCode(), context.getBizNo(), ProcessUnitConstants.SCENE_SYNC);\n        try {\n            context.setLockRequestId(requestId);\n            saveInstanceBeforeCall(context);\n            policy = getExecPolicy(context);\n            context.setPolicy(policy);\n            saveExecutionBeforeCall(context);\n        } catch (Exception exception) {\n            log.error(\"Process unit sync before call exception, \" + exception.getMessage(), exception);\n            lockManager.unlock(unit.getProcessUnitCode(), context.getBizNo(), ProcessUnitConstants.SCENE_SYNC, requestId);\n            throw exception;\n        }\n        return policy;\n    }\n\n    @Override\n    public void afterCall(ExecContext context) {\n        if (ProcessUnitConstants.STATUS_INVALID.equals(context.getProcessUnit().getStatus())) {\n            return;\n        }\n        puTransactionTemplate.doInTransaction(context.getProcessUnit(), context.getBizNo(), ProcessUnitConstants.SCENE_SYNC, null, () -> {\n            afterCallOperation(context);\n            return null;\n        });\n    }\n    \n    private void afterCallOperation(ExecContext context) {\n        ExecResult result = context.getResult();\n        String executionNo = context.getExecutionNo();\n        ProcessUnitExecutionEntity execution = new ProcessUnitExecutionEntity();\n        execution.setExecutionNo(executionNo);\n        execution.setResult(result.getResult());\n        execution.setResponseContent(result.getResponseContent());\n        execution.setResponseTime(new Date());\n        if (context.getRequestTime() != 0) {\n            execution.setElaspeTime((int) (System.currentTimeMillis() - context.getRequestTime()));\n        }\n        execution.setProcessUnitCode(context.getUnitCode());\n        execution.setBizNo(context.getBizNo());\n        execution.setInstanceNo(context.getInstanceNo());\n        executionPersister.persistAfterCall(context, execution);\n        String instanceNo = context.getInstanceNo();\n        ProcessUnitInstanceEntity instance = new ProcessUnitInstanceEntity();\n        instance.setInstanceNo(instanceNo);\n        instance.setProcessUnitCode(context.getUnitCode());\n        instance.setBizNo(context.getBizNo());\n        instance.setResult(result.getResult());\n        instance.setResponseContent(result.getResponseContent());\n        Map<String, Object> autoRunPolicy = (Map<String, Object>) context.getProcessUnit()\n                .getConfig(ProcessUnitConstants.CONF_AUTO_RUN_POLICY);\n        Boolean autoRunFlag = context.getResult().getAutoRunFlag();\n        if (autoRunFlag == null) {\n            autoRunFlag = false;\n            if (autoRunPolicy != null) {\n                autoRunFlag = Boolean.TRUE.equals(autoRunPolicy.get(context.getResult().getResult()));\n            }\n        }\n        instance.setAutoRunFlag(autoRunFlag);\n        if (result.getNextAutoRunTime() != null) {\n           instance.setNextAutoRunTime(result.getNextAutoRunTime());\n        }\n        if (autoRunFlag && instance.getNextAutoRunTime() == null) {\n            instance.setNextAutoRunTime(new Date());\n        }\n        instance.setVars(JSON.toJSONString(context.getVariables()));\n        instance.setExtData(context.getExtDataStr());\n        processUnitRepository.updateInstanceByInstanceNoSelective(instance);\n        if (log.isDebugEnabled()) {\n            log.debug(\"Process unit instance update success:{}\", instance);\n        }\n\n        String lockRequestId = context.getLockRequestId();\n        if (lockRequestId == null) {\n            ProcessUnitExecutionEntity contextExecution = context.getExecution();\n            Map<String, Object> extData = JSON.parseObject(contextExecution.getExtData(), Map.class);\n            lockRequestId = (String) extData.get(ProcessUnitConstants.EXECUTION_EXT_DATA_LOCK_REQUEST_ID);\n        }\n        lockManager.unlock(context.getProcessUnit().getProcessUnitCode(), context.getBizNo(), ProcessUnitConstants.SCENE_SYNC,lockRequestId);\n    }\n\n    protected ExecPolicy getExecPolicy(ExecContext context) {\n        ExecPolicy policy = new ExecPolicy();\n        String result = context.getLastResult();\n        Map<String, String> execPolicy = (Map<String, String>) context.getProcessUnit()\n                .getConfig(ProcessUnitConstants.CONF_SYNC_EXEC_POLICY);\n        String policyType = null;\n        if (context.isNewInstance()) {\n            policyType = execPolicy != null ? execPolicy.get(ProcessUnitConstants.REQ_TYPE_NEW)\n                    : ProcessUnitConstants.POLICY_REQUEST;\n        } else {\n            if (ProcessUnitConstants.RESULT_SUCCESS.equals(result)) {\n                policyType = execPolicy != null ? execPolicy.get(ProcessUnitConstants.REQ_TYPE_SUCCESS)\n                        : ProcessUnitConstants.POLICY_EXCEPTION;\n            } else if (ProcessUnitConstants.RESULT_FAIL.equals(result)) {\n                policyType = execPolicy != null ? execPolicy.get(ProcessUnitConstants.REQ_TYPE_FAIL)\n                        : ProcessUnitConstants.POLICY_EXCEPTION;\n            } else if (ProcessUnitConstants.RESULT_DOING.equals(result)) {\n                policyType = execPolicy != null ? execPolicy.get(ProcessUnitConstants.REQ_TYPE_DOING)\n                        : ProcessUnitConstants.POLICY_EXCEPTION;\n            } else {\n                if (ProcessUnitConstants.RESULT_NONE.equals(result) && execPolicy != null) {\n                    policyType = execPolicy.get(ProcessUnitConstants.RESULT_NONE);\n                } else if (ProcessUnitConstants.RESULT_UNKNOWN.equals(result) && execPolicy != null) {\n                    policyType = execPolicy.get(ProcessUnitConstants.RESULT_UNKNOWN);\n                }\n                if (policyType == null) {\n                    policyType = execPolicy != null ? execPolicy.get(ProcessUnitConstants.REQ_TYPE_EXCEPTION)\n                            : ProcessUnitConstants.POLICY_EXCEPTION;\n                    log.info(\"Exception policy:\" + policyType);\n                }\n            }\n            policy.setResult(context.getLastResult());\n            policy.setRequestContent(context.getLastRequestContent());\n            policy.setResponseContent(context.getLastResponseContent());\n        }\n        policy.setPolicyType(policyType);\n        return policy;\n    }\n\n    protected void saveInstanceBeforeCall(ExecContext context) {\n        puTransactionTemplate.doInTransaction(context.getProcessUnit(), context.getBizNo(), ProcessUnitConstants.SCENE_SYNC, null, () -> {\n            saveInstanceBeforeCallOperation(context);\n            return null;\n        });\n    }\n    \n    private void saveInstanceBeforeCallOperation(ExecContext context) {\n        ProcessUnitInstanceEntity instance = processUnitRepository\n                .getInstanceByUnitCodeAndBizNo(context.getProcessUnit().getProcessUnitCode(), context.getBizNo());\n\n        if (instance == null) {\n            context.setLastResult(null);\n            context.setLastRequestContent(null);\n            context.setLastResponseContent(null);\n            instance = new ProcessUnitInstanceEntity();\n            instance.setBizNo(context.getBizNo());\n            instance.setInstanceNo(CodeGenerateHelper.generateCode(\"PU_INSTANCE\", \"PI\"));\n            instance.setProcessUnitCode(context.getProcessUnit().getProcessUnitCode());\n            instance.setRequestContent(context.getParam().getRequestContent());\n            instance.setResult(ProcessUnitConstants.RESULT_UNKNOWN);\n            instance.setProductCode(context.getParam().getProductCode());\n            instance.setParentNo(context.getParentNo());\n            context.setNewInstance(true);\n            Map<String, Object> autoRunPolicy = (Map<String, Object>) context.getProcessUnit()\n                    .getConfig(ProcessUnitConstants.CONF_AUTO_RUN_POLICY);\n            Boolean autoRunFlag = false;\n            if (autoRunPolicy != null) {\n                autoRunFlag = (Boolean) autoRunPolicy.get(ProcessUnitConstants.RESULT_UNKNOWN);\n                if (autoRunFlag == null) {\n                    autoRunFlag = false;\n                }\n            }\n            instance.setAutoRunFlag(autoRunFlag);\n            if (autoRunFlag) {\n                Integer autoRunDelaySeconds = (Integer) context.getProcessUnit()\n                        .getConfig(ProcessUnitConstants.CONF_AUTO_RUN_DELAY_SECONDS);\n                int delaySeconds = autoRunDelaySeconds == null ? syncAutoRunDelaySeconds : autoRunDelaySeconds;\n                instance.setNextAutoRunTime(new Date(System.currentTimeMillis() + delaySeconds * 1000));\n            }\n            Map<String, Object> extDataMap = new HashMap<>();\n            Map<String, String> clientInfo = context.getClientInfo();\n            if (clientInfo != null) {\n                extDataMap.put(ProcessUnitConstants.INSTANCE_EXT_DATA_CREATE_CLIENT_INFO, clientInfo);\n            }\n            if (extDataMap.size() > 0) {\n                instance.setExtData(JSON.toJSONString(extDataMap));\n            }\n            processUnitRepository.saveInstance(instance);\n            if (log.isDebugEnabled()) {\n                log.debug(\"New process unit instance created:{}\", instance);\n            } else if (log.isInfoEnabled()) {\n                log.info(\"New process unit instance created, instanceNo:\" + instance.getInstanceNo());\n            }\n\n        } else {\n            context.setLastResult(instance.getResult());\n            context.setLastRequestContent(instance.getRequestContent());\n            context.setLastResponseContent(instance.getResponseContent());\n            Map<String, Object> autoRunPolicy = (Map<String, Object>) context.getProcessUnit()\n                    .getConfig(ProcessUnitConstants.CONF_AUTO_RUN_POLICY);\n            Boolean autoRunFlag = false;\n            if (autoRunPolicy != null) {\n                autoRunFlag = (Boolean) autoRunPolicy.get(ProcessUnitConstants.RESULT_UNKNOWN);\n                if (autoRunFlag == null) {\n                    autoRunFlag = false;\n                }\n            }\n            instance.setAutoRunFlag(autoRunFlag);\n            if (autoRunFlag) {\n                Integer autoRunDelaySeconds = (Integer) context.getProcessUnit()\n                        .getConfig(ProcessUnitConstants.CONF_AUTO_RUN_DELAY_SECONDS);\n                int delaySeconds = autoRunDelaySeconds == null ? syncAutoRunDelaySeconds : autoRunDelaySeconds;\n                instance.setNextAutoRunTime(new Date(System.currentTimeMillis() + delaySeconds * 1000L));\n            }\n            instance.setResult(ProcessUnitConstants.RESULT_UNKNOWN);\n            instance.setResponseContent(null);\n            instance.setRequestContent(context.getParam().getRequestContent());\n            processUnitRepository.updateInstance(instance);\n\n        }\n        context.setInstanceNo(instance.getInstanceNo());\n        context.setInstance(instance);\n    }\n\n    protected void saveExecutionBeforeCall(ExecContext context) {\n        String executionNo = CodeGenerateHelper.generateCode(\"PU_EXECUTION\", PU_EXECUTION);\n        context.setExecutionNo(executionNo);\n        ProcessUnitExecutionEntity execution = new ProcessUnitExecutionEntity();\n        execution.setExecutionNo(executionNo);\n        execution.setInstanceNo(context.getInstance().getInstanceNo());\n        execution.setProductCode(context.getInstance().getProductCode());\n        execution.setProcessUnitCode(context.getProcessUnit().getProcessUnitCode());\n        execution.setBizNo(context.getInstance().getBizNo());\n        execution.setRequestNo(context.getParam().getRequestNo());\n        execution.setRequestContent(context.getParam().getRequestContent());\n        execution.setExecType(ProcessUnitConstants.EXEC_TYPE_SYNC);\n        execution.setRequestTime(new Date());\n        Map<String, Object> extData = new HashMap<String, Object>();\n        extData.put(ProcessUnitConstants.EXECUTION_EXT_DATA_LOCK_REQUEST_ID, context.getLockRequestId());\n        extData.put(ProcessUnitConstants.EXECUTION_EXT_DATA_POLICY_TYPE, context.getPolicy().getPolicyType());\n        extData.put(ProcessUnitConstants.EXECUTION_EXT_DATA_CLIENT_INFO, context.getClientInfo());\n        extData.put(ProcessUnitConstants.EXECUTION_EXT_DATA_BEFORE_VARS, JSON.parseObject(context.getInstance().getVars(), Map.class));\n        execution.setExtData(JSON.toJSONString(extData));\n        executionPersister.persistBeforeCall(context, execution);\n        context.setExecution(execution);\n    }\n\n    public int getSyncAutoRunDelaySeconds() {\n        return syncAutoRunDelaySeconds;\n    }\n\n    public void setSyncAutoRunDelaySeconds(int syncAutoRunDelaySeconds) {\n        this.syncAutoRunDelaySeconds = syncAutoRunDelaySeconds;\n    }\n\n    public ProcessUnitRepository getProcessUnitRepository() {\n        return processUnitRepository;\n    }\n\n    public void setProcessUnitRepository(ProcessUnitRepository processUnitRepository) {\n        this.processUnitRepository = processUnitRepository;\n    }\n\n    public ExecutionPersister getExecutionPersister() {\n        return executionPersister;\n    }\n\n    public void setExecutionPersister(ExecutionPersister executionPersister) {\n        this.executionPersister = executionPersister;\n    }\n\n    public PuTransactionTemplate getPuTransactionTemplate() {\n        return puTransactionTemplate;\n    }\n\n    public void setPuTransactionTemplate(PuTransactionTemplate puTransactionTemplate) {\n        this.puTransactionTemplate = puTransactionTemplate;\n    }\n\n    public LockManager getLockManager() {\n        return lockManager;\n    }\n\n    public void setLockManager(LockManager lockManager) {\n        this.lockManager = lockManager;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/service/impl/execution/DummyPersistHandler.java",
    "content": "package com.jd.easyflow.processunit.domain.service.impl.execution;\n\nimport com.jd.easyflow.processunit.domain.model.entity.ProcessUnitExecutionEntity;\nimport com.jd.easyflow.processunit.domain.model.vo.ExecContext;\nimport com.jd.easyflow.processunit.domain.service.ProcessUnitExecutionPersistHandler;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class DummyPersistHandler implements ProcessUnitExecutionPersistHandler {\n\n    @Override\n    public void persistBeforeCall(ExecContext context, ProcessUnitExecutionEntity processUnitExecution) {\n        logger.info(\"DummyPersistHandler not persist.\");\n    }\n    @Override\n    public void persistAfterCall(ExecContext context, ProcessUnitExecutionEntity processUnitExecution) {\n        logger.info(\"DummyPersistHandler not persist.\");\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/service/impl/execution/ExecutionPersister.java",
    "content": "package com.jd.easyflow.processunit.domain.service.impl.execution;\n\nimport java.util.Map;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.processunit.domain.constant.ProcessUnitConstants;\nimport com.jd.easyflow.processunit.domain.model.entity.ProcessUnitEntity;\nimport com.jd.easyflow.processunit.domain.model.entity.ProcessUnitExecutionEntity;\nimport com.jd.easyflow.processunit.domain.model.vo.ExecContext;\nimport com.jd.easyflow.processunit.domain.service.ProcessUnitExecutionPersistHandler;\n\n/**\n * @author: chenzhenghao1\n */\npublic class ExecutionPersister implements ProcessUnitExecutionPersistHandler {\n    \n    private static final Logger log = LoggerFactory.getLogger(ExecutionPersister.class);\n\n\n    private String defaultHandlerName = ProcessUnitConstants.THREAD_POOL_ASYNC_PERSIST_HANDLER_NAME;\n\n    private Map<String, ProcessUnitExecutionPersistHandler> handlerMap;\n\n    @Override\n    public void persistBeforeCall(ExecContext context, ProcessUnitExecutionEntity processUnitExecution) {\n        ProcessUnitExecutionPersistHandler handler = getHandler(context);\n        if (handler == null) {\n            log.warn(\"Execution Persist Handler not exists\");\n            return;\n        }\n        handler.persistBeforeCall(context, processUnitExecution);\n    }\n\n    @Override\n    public void persistAfterCall(ExecContext context, ProcessUnitExecutionEntity processUnitExecution) {\n        ProcessUnitExecutionPersistHandler handler = getHandler(context);\n        if (handler == null) {\n            log.warn(\"Execution Persist Handler not exists\");\n            return;\n        }\n        handler.persistAfterCall(context, processUnitExecution);\n    }\n\n    private ProcessUnitExecutionPersistHandler getHandler(ExecContext context) {\n        if (handlerMap == null) {\n            return null;\n        }\n        ProcessUnitEntity processUnit = context.getProcessUnit();\n        String execType = context.getParam().getExecType();\n        Map<String, Object> policyMap = (Map<String, Object>) processUnit\n                .getConfig(ProcessUnitConstants.EXECUTION_PERSIST_POLICY);\n        Map<String, Object> handlerConf = null;\n        if (policyMap != null) {\n            handlerConf = (Map<String, Object>) policyMap.get(execType);\n            if (handlerConf == null) {\n                handlerConf = (Map<String, Object>) policyMap.get(ProcessUnitConstants.EXECUTION_PERSIST_TYPE_DEFAULT);\n            }\n        }\n        String handlerName = null;\n        if (handlerConf != null) {\n            handlerName = (String) handlerConf.get(ProcessUnitConstants.PU_PERSIST_HANDLER);\n        }\n        if (handlerName == null) {\n            handlerName = defaultHandlerName;\n        }\n\n        return handlerMap.get(handlerName);\n    }\n\n    public String getDefaultHandlerName() {\n        return defaultHandlerName;\n    }\n\n    public void setDefaultHandlerName(String defaultHandlerName) {\n        this.defaultHandlerName = defaultHandlerName;\n    }\n\n    public Map<String, ProcessUnitExecutionPersistHandler> getHandlerMap() {\n        return handlerMap;\n    }\n\n    public void setHandlerMap(Map<String, ProcessUnitExecutionPersistHandler> handlerMap) {\n        this.handlerMap = handlerMap;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/service/impl/execution/SyncPersistHandler.java",
    "content": "package com.jd.easyflow.processunit.domain.service.impl.execution;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\n\nimport com.jd.easyflow.processunit.domain.model.entity.ProcessUnitExecutionEntity;\nimport com.jd.easyflow.processunit.domain.model.vo.ExecContext;\nimport com.jd.easyflow.processunit.domain.repository.ProcessUnitRepository;\nimport com.jd.easyflow.processunit.domain.service.ProcessUnitExecutionPersistHandler;\n\n/**\n * @author: chenzhenghao1\n */\npublic class SyncPersistHandler implements ProcessUnitExecutionPersistHandler {\n    \n    private static final Logger log = LoggerFactory.getLogger(SyncPersistHandler.class);\n\n\n    @Autowired\n    private ProcessUnitRepository processUnitRepository;\n\n    @Override\n    public void persistBeforeCall(ExecContext context, ProcessUnitExecutionEntity processUnitExecution) {\n        if (log.isDebugEnabled()) {\n            log.debug(\"Sync save execution instance:\" + processUnitExecution);\n        }\n        processUnitRepository.saveExecution(processUnitExecution);\n    }\n\n    @Override\n    public void persistAfterCall(ExecContext context, ProcessUnitExecutionEntity processUnitExecution) {\n        if (log.isDebugEnabled()) {\n            log.debug(\"Sync update execution instance:\" + processUnitExecution);\n        }\n        processUnitRepository.updateExecutionByExecutionNo(processUnitExecution);\n    }\n\n    public ProcessUnitRepository getProcessUnitRepository() {\n        return processUnitRepository;\n    }\n\n    public void setProcessUnitRepository(ProcessUnitRepository processUnitRepository) {\n        this.processUnitRepository = processUnitRepository;\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/service/impl/execution/ThreadPoolAsyncPersistHandler.java",
    "content": "package com.jd.easyflow.processunit.domain.service.impl.execution;\n\nimport java.util.Objects;\nimport java.util.concurrent.CompletableFuture;\nimport java.util.concurrent.Executor;\nimport java.util.concurrent.TimeUnit;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\n\nimport com.jd.easyflow.processunit.domain.model.entity.ProcessUnitExecutionEntity;\nimport com.jd.easyflow.processunit.domain.model.vo.ExecContext;\nimport com.jd.easyflow.processunit.domain.repository.ProcessUnitRepository;\nimport com.jd.easyflow.processunit.domain.service.ProcessUnitExecutionPersistHandler;\n\n/**\n * @author: chenzhenghao1\n */\n\npublic class ThreadPoolAsyncPersistHandler implements ProcessUnitExecutionPersistHandler {\n    \n    private static final Logger log = LoggerFactory.getLogger(ThreadPoolAsyncPersistHandler.class);\n\n\n    @Autowired\n    private ProcessUnitRepository processUnitRepository;\n\n    private Executor threadPoolExecutor;\n\n\n    @Override\n    public void persistBeforeCall(ExecContext context, ProcessUnitExecutionEntity processUnitExecution) {\n        if (log.isDebugEnabled()) {\n            log.debug(\"Async persist before call:\" + processUnitExecution);\n        }\n        String version = context.getParam().getVersion();\n        if (null == version) {\n            if (log.isDebugEnabled()) {\n                log.debug(\"Save execution instance\");\n            }\n            processUnitRepository.saveExecution(processUnitExecution);\n        } else {\n            CompletableFuture.runAsync(() -> {\n                if (log.isDebugEnabled()) {\n                    log.debug(\"Save execution instance\");\n                }\n                try {\n                    processUnitRepository.saveExecution(processUnitExecution);\n                } catch (Exception e) {\n                    log.error(\"Save execution instance exception,\" + processUnitExecution + \" \" + e.getMessage(), e);\n                }\n            }, threadPoolExecutor);\n        }\n    }\n\n    @Override\n    public void persistAfterCall(ExecContext context, ProcessUnitExecutionEntity processUnitExecution) {\n        if (log.isDebugEnabled()) {\n            log.debug(\"Async persist after call:\" + processUnitExecution);\n        }\n        CompletableFuture.runAsync(() -> {\n            try {\n                updateOrInsert(processUnitExecution);\n            } catch (Exception e) {\n                log.error(\"Execution instance update exception,\" + processUnitExecution + \" \" + e.getMessage(), e);\n            }\n        }, threadPoolExecutor);\n    }\n\n    private void updateOrInsert(ProcessUnitExecutionEntity processUnitExecution) {\n        if (log.isDebugEnabled()) {\n            log.debug(\"Update or insert execution instance:\" + processUnitExecution);\n        }\n        ProcessUnitExecutionEntity execution = null;\n        int count = 5;\n        while (Objects.isNull(execution) && count > 0) {\n            execution = processUnitRepository.getExecution(processUnitExecution.getExecutionNo(), processUnitExecution.getProcessUnitCode(), processUnitExecution.getBizNo());\n            try {\n                TimeUnit.MILLISECONDS.sleep(200);\n            } catch (InterruptedException e) {\n                log.info(\"Async persist thread {} interrupted\", Thread.currentThread().getName(), e);\n            }\n            count--;\n        }\n        if (Objects.isNull(execution)) {\n            log.info(\"Processunit execution {} spin timeout, insert record{}\", processUnitExecution.getExecutionNo(), processUnitExecution);\n            processUnitRepository.saveExecution(processUnitExecution);\n        } else {\n            processUnitRepository.updateExecutionByExecutionNo(processUnitExecution);\n        }\n    }\n\n    public void setThreadPoolExecutor(Executor threadPoolExecutor) {\n        this.threadPoolExecutor = threadPoolExecutor;\n    }\n\n    public ProcessUnitRepository getProcessUnitRepository() {\n        return processUnitRepository;\n    }\n\n    public void setProcessUnitRepository(ProcessUnitRepository processUnitRepository) {\n        this.processUnitRepository = processUnitRepository;\n    }\n\n    public Executor getThreadPoolExecutor() {\n        return threadPoolExecutor;\n    }\n    \n    \n\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/support/LockManager.java",
    "content": "package com.jd.easyflow.processunit.domain.support;\n\nimport java.util.function.Supplier;\n\nimport org.springframework.beans.factory.annotation.Autowired;\n\nimport com.jd.easyflow.lock.Locker;\nimport com.jd.easyflow.processunit.domain.constant.ProcessUnitConstants;\nimport com.jd.easyflow.processunit.domain.model.entity.ProcessUnitEntity;\nimport com.jd.easyflow.processunit.domain.repository.ProcessUnitRepository;\n\n/**\n * @author liyuliang5\n */\npublic class LockManager {\n    \n    @Autowired\n    private ProcessUnitRepository processUnitRepository;\n    \n    private Locker locker;\n    \n    public <T> T doInlock(String unitCode, String bizNo, String scene, Supplier<T> repeatableAction) {\n        ProcessUnitEntity unit = processUnitRepository.getProcessUnitByCode(unitCode);\n        Integer lockSeconds = (Integer) unit.getConfig(ProcessUnitConstants.CONF_LOCK_SECONDS);\n        if (lockSeconds == null) {\n            lockSeconds = ProcessUnitConstants.DEFAULT_LOCK_SECONDS;\n        }\n        return locker.doInlock(ProcessUnitConstants.LOCK_BIZ_TYPE, unitCode + ProcessUnitConstants.LOCK_KEY_SEP + bizNo,\n                lockSeconds, ProcessUnitConstants.DEFAULT_WAIT_SECONDS, () -> {\n                    return repeatableAction.get();\n                });\n    }\n    \n    public String lock(String unitCode, String bizNo, String scene) {\n        ProcessUnitEntity unit = processUnitRepository.getProcessUnitByCode(unitCode);\n        Integer lockSeconds = (Integer) unit.getConfig(ProcessUnitConstants.CONF_LOCK_SECONDS);\n        if (lockSeconds == null) {\n            lockSeconds = ProcessUnitConstants.DEFAULT_LOCK_SECONDS;\n        }\n        return locker.lock(ProcessUnitConstants.LOCK_BIZ_TYPE,\n                unitCode + ProcessUnitConstants.LOCK_KEY_SEP + bizNo, lockSeconds,\n                ProcessUnitConstants.DEFAULT_WAIT_SECONDS);\n    }\n\n\n\n    public Locker getLocker() {\n        return locker;\n    }\n\n    public void setLocker(Locker locker) {\n        this.locker = locker;\n    }\n\n    public ProcessUnitRepository getProcessUnitRepository() {\n        return processUnitRepository;\n    }\n\n    public void setProcessUnitRepository(ProcessUnitRepository processUnitRepository) {\n        this.processUnitRepository = processUnitRepository;\n    }\n    \n    public boolean unlock(String unitCode, String bizNo, String scene, String requestId) {\n        return locker.unlock(ProcessUnitConstants.LOCK_BIZ_TYPE, unitCode\n                + ProcessUnitConstants.LOCK_KEY_SEP + bizNo, requestId);\n    }\n\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/domain/support/PuTransactionTemplate.java",
    "content": "package com.jd.easyflow.processunit.domain.support;\n\nimport java.util.Map;\nimport java.util.function.Supplier;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.transaction.support.TransactionTemplate;\n\nimport com.jd.easyflow.processunit.domain.constant.ProcessUnitConstants;\nimport com.jd.easyflow.processunit.domain.model.entity.ProcessUnitEntity;\nimport com.jd.easyflow.processunit.domain.repository.ProcessUnitRepository;\nimport com.jd.easyflow.sharding.service.ShardingService;\n\n/**\n * \n * @author liyuliang5\n */\npublic class PuTransactionTemplate {\n\n    private static final Logger log = LoggerFactory.getLogger(PuTransactionTemplate.class);\n\n    @Autowired(required = false)\n    @Qualifier(ProcessUnitConstants.BEAN_NEW_TX_TEMPLATE)\n    protected TransactionTemplate transactionTemplate;\n    @Autowired\n    private ProcessUnitRepository processUnitRepository;\n    \n    private ShardingService shardingService;\n\n    public <T> T doInTransaction(ProcessUnitEntity unit, String bizNo, String scene, Map<String, Object> extData,\n            Supplier<T> supplier) {\n        String txPolicy = null;\n        Map<String, String> configSceneTxPolicy = (Map<String, String>) unit.getConfig(ProcessUnitConstants.CONF_TX_POLICY);\n        if (scene != null && configSceneTxPolicy != null) {\n            txPolicy = configSceneTxPolicy.get(scene);\n        }\n        txPolicy = txPolicy == null ? ProcessUnitConstants.TX_POLICY_NEW : txPolicy;\n        if (transactionTemplate == null) {\n            txPolicy = ProcessUnitConstants.TX_POLICY_NONE;\n        }\n        if (log.isDebugEnabled()) {\n            log.debug(\"transactionTemplate:{}  final policy is {}\", \n                    transactionTemplate, txPolicy);\n        }\n        if (ProcessUnitConstants.TX_POLICY_NEW.equals(txPolicy)) {\n            if (shardingService == null || ! shardingService.isShardingEnabled()) {\n                return transactionTemplate.execute((status) -> {\n                    return supplier.get();\n                });\n            } else {\n                if (unit == null || unit.getProcessUnitCode() == null || bizNo == null) {\n                    log.error(\"unitCode and bizNo can not be null \" + \"unitCode:\" + (unit == null ? null : unit.getProcessUnitCode()) + \", bizNo:\" + bizNo);\n                    return supplier.get();\n                }\n                return shardingService.execute(ShardingService.OP_TYPE_WRITE, unit.getProcessUnitCode(), bizNo, false, shard -> {\n                    return transactionTemplate.execute((status) -> {\n                        return supplier.get();\n                    });\n                });\n\n            }\n        } else {\n            return supplier.get();\n        }\n    }\n\n    public TransactionTemplate getTransactionTemplate() {\n        return transactionTemplate;\n    }\n\n    public void setTransactionTemplate(TransactionTemplate transactionTemplate) {\n        this.transactionTemplate = transactionTemplate;\n    }\n\n    public ProcessUnitRepository getProcessUnitRepository() {\n        return processUnitRepository;\n    }\n\n    public void setProcessUnitRepository(ProcessUnitRepository processUnitRepository) {\n        this.processUnitRepository = processUnitRepository;\n    }\n\n    public ShardingService getShardingService() {\n        return shardingService;\n    }\n\n    public void setShardingService(ShardingService shardingService) {\n        this.shardingService = shardingService;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/infrastructure/converter/ProcessUnitConverter.java",
    "content": " package com.jd.easyflow.processunit.infrastructure.converter;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport com.jd.easyflow.processunit.domain.model.entity.ProcessUnitExecutionEntity;\nimport com.jd.easyflow.processunit.domain.model.entity.ProcessUnitInstanceEntity;\nimport com.jd.easyflow.processunit.infrastructure.persistence.po.ProcessUnitExecution;\nimport com.jd.easyflow.processunit.infrastructure.persistence.po.ProcessUnitInstance;\n\n/**\n * @author liyuliang5\n * \n */\npublic class ProcessUnitConverter {\n    \n    public static ProcessUnitConverter INSTANCE = new ProcessUnitConverter();\n    \n    public ProcessUnitInstanceEntity po2Entity(ProcessUnitInstance instance) {\n        if ( instance == null ) {\n            return null;\n        }\n\n        ProcessUnitInstanceEntity processUnitInstanceEntity = new ProcessUnitInstanceEntity();\n\n        processUnitInstanceEntity.setAutoRunFlag( instance.getAutoRunFlag() );\n        processUnitInstanceEntity.setAutoRunTimes( instance.getAutoRunTimes() );\n        processUnitInstanceEntity.setBizNo( instance.getBizNo() );\n        processUnitInstanceEntity.setCreatedDate( instance.getCreatedDate() );\n        processUnitInstanceEntity.setVars(instance.getVars());\n        processUnitInstanceEntity.setExtData( instance.getExtData() );\n        processUnitInstanceEntity.setId( instance.getId() );\n        processUnitInstanceEntity.setInstanceNo( instance.getInstanceNo() );\n        processUnitInstanceEntity.setModifiedDate( instance.getModifiedDate() );\n        processUnitInstanceEntity.setNextAutoRunTime( instance.getNextAutoRunTime() );\n        processUnitInstanceEntity.setParentNo( instance.getParentNo() );\n        processUnitInstanceEntity.setProcessUnitCode( instance.getProcessUnitCode() );\n        processUnitInstanceEntity.setProductCode( instance.getProductCode() );\n        processUnitInstanceEntity.setRequestContent( instance.getRequestContent() );\n        processUnitInstanceEntity.setResponseContent( instance.getResponseContent() );\n        processUnitInstanceEntity.setResult( instance.getResult() );\n        processUnitInstanceEntity.setId(instance.getId());\n        return processUnitInstanceEntity;\n    }\n\n    public ProcessUnitInstance entity2Po(ProcessUnitInstanceEntity entity) {\n        if ( entity == null ) {\n            return null;\n        }\n\n        ProcessUnitInstance processUnitInstance = new ProcessUnitInstance();\n\n        processUnitInstance.setAutoRunFlag( entity.getAutoRunFlag() );\n        processUnitInstance.setAutoRunTimes( entity.getAutoRunTimes() );\n        processUnitInstance.setBizNo( entity.getBizNo() );\n        processUnitInstance.setCreatedDate( entity.getCreatedDate() );\n        processUnitInstance.setVars(entity.getVars());\n        processUnitInstance.setExtData( entity.getExtData() );\n        processUnitInstance.setId( entity.getId() );\n        processUnitInstance.setInstanceNo( entity.getInstanceNo() );\n        processUnitInstance.setModifiedDate( entity.getModifiedDate() );\n        processUnitInstance.setNextAutoRunTime( entity.getNextAutoRunTime() );\n        processUnitInstance.setParentNo( entity.getParentNo() );\n        processUnitInstance.setProcessUnitCode( entity.getProcessUnitCode() );\n        processUnitInstance.setProductCode( entity.getProductCode() );\n        processUnitInstance.setRequestContent( entity.getRequestContent() );\n        processUnitInstance.setResponseContent( entity.getResponseContent() );\n        processUnitInstance.setResult( entity.getResult() );\n\n        return processUnitInstance;\n    }\n\n    public ProcessUnitExecutionEntity po2Entity(ProcessUnitExecution execution) {\n        if ( execution == null ) {\n            return null;\n        }\n\n        ProcessUnitExecutionEntity processUnitExecutionEntity = new ProcessUnitExecutionEntity();\n\n        processUnitExecutionEntity.setCreatedDate( execution.getCreatedDate() );\n        if ( execution.getElaspeTime() != null ) {\n            processUnitExecutionEntity.setElaspeTime( execution.getElaspeTime() );\n        }\n        processUnitExecutionEntity.setExecType( execution.getExecType() );\n        processUnitExecutionEntity.setExecutionNo( execution.getExecutionNo() );\n        processUnitExecutionEntity.setExtData( execution.getExtData() );\n        processUnitExecutionEntity.setId( execution.getId() );\n        processUnitExecutionEntity.setInstanceNo( execution.getInstanceNo() );\n        processUnitExecutionEntity.setModifiedDate( execution.getModifiedDate() );\n        processUnitExecutionEntity.setParentNo( execution.getParentNo() );\n        processUnitExecutionEntity.setProcessUnitCode( execution.getProcessUnitCode() );\n        processUnitExecutionEntity.setBizNo(execution.getBizNo());\n        processUnitExecutionEntity.setProductCode( execution.getProductCode() );\n        processUnitExecutionEntity.setRequestContent( execution.getRequestContent() );\n        processUnitExecutionEntity.setRequestNo( execution.getRequestNo() );\n        processUnitExecutionEntity.setRequestTime( execution.getRequestTime() );\n        processUnitExecutionEntity.setResponseContent( execution.getResponseContent() );\n        processUnitExecutionEntity.setResponseTime( execution.getResponseTime() );\n        processUnitExecutionEntity.setResult( execution.getResult() );\n\n        return processUnitExecutionEntity;\n    }\n\n    public ProcessUnitExecution entity2Po(ProcessUnitExecutionEntity entity) {\n        if ( entity == null ) {\n            return null;\n        }\n\n        ProcessUnitExecution processUnitExecution = new ProcessUnitExecution();\n\n        processUnitExecution.setCreatedDate( entity.getCreatedDate() );\n        processUnitExecution.setElaspeTime( entity.getElaspeTime() );\n        processUnitExecution.setExecType( entity.getExecType() );\n        processUnitExecution.setExecutionNo( entity.getExecutionNo() );\n        processUnitExecution.setExtData( entity.getExtData() );\n        processUnitExecution.setId( entity.getId() );\n        processUnitExecution.setInstanceNo( entity.getInstanceNo() );\n        processUnitExecution.setModifiedDate( entity.getModifiedDate() );\n        processUnitExecution.setParentNo( entity.getParentNo() );\n        processUnitExecution.setProcessUnitCode( entity.getProcessUnitCode() );\n        processUnitExecution.setBizNo(entity.getBizNo());\n        processUnitExecution.setProductCode( entity.getProductCode() );\n        processUnitExecution.setRequestContent( entity.getRequestContent() );\n        processUnitExecution.setRequestNo( entity.getRequestNo() );\n        processUnitExecution.setRequestTime( entity.getRequestTime() );\n        processUnitExecution.setResponseContent( entity.getResponseContent() );\n        processUnitExecution.setResponseTime( entity.getResponseTime() );\n        processUnitExecution.setResult( entity.getResult() );\n\n        return processUnitExecution;\n    }\n    \n    public List<ProcessUnitExecutionEntity> executionPoList2EntityList(List<ProcessUnitExecution> poList) {\n        if (poList == null) {\n            return null;\n        }\n        List<ProcessUnitExecutionEntity> entityList = new ArrayList<ProcessUnitExecutionEntity>();\n        poList.forEach(po -> entityList.add(po2Entity(po)));\n        return entityList;\n    }\n    \n    public List<ProcessUnitInstanceEntity> instancePoList2EntityList(List<ProcessUnitInstance> poList) {\n        if (poList == null) {\n            return null;\n        }\n        List<ProcessUnitInstanceEntity> entityList = new ArrayList<ProcessUnitInstanceEntity>();\n        poList.forEach(po -> entityList.add(po2Entity(po)));\n        return entityList;\n    }\n    \n}\n\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/infrastructure/gateway/ProcessUnitClientGatewayImpl.java",
    "content": "package com.jd.easyflow.processunit.infrastructure.gateway;\n\nimport java.util.Map;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.objects.factory.ObjectFactorys;\nimport com.jd.easyflow.processunit.domain.constant.ProcessUnitConstants;\nimport com.jd.easyflow.processunit.domain.gateway.ProcessUnitClientGateway;\nimport com.jd.easyflow.processunit.domain.model.vo.ExecContext;\nimport com.jd.easyflow.processunit.spi.client.ProcessUnitClientService;\nimport com.jd.easyflow.processunit.spi.client.dto.AsyncCallRealReq;\nimport com.jd.easyflow.processunit.spi.client.dto.AsyncCallRealRes;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n * @author liyuliang5\n * \n */\npublic class ProcessUnitClientGatewayImpl implements ProcessUnitClientGateway {\n    \n    private static final Logger log = LoggerFactory.getLogger(ProcessUnitClientGatewayImpl.class);\n\n\n    @Override\n    public void asyncCallReal(ExecContext context) {\n        AsyncCallRealReq req = new AsyncCallRealReq();\n        req.setExecuteExp((String) context.getProcessUnit().getConfig(ProcessUnitConstants.CONF_ASYNC_RUN_EXP));\n        req.setExecutionNo(context.getExecution().getExecutionNo());\n        req.setRequestContent(context.getInstance().getRequestContent());\n        req.setRequestContext(context.getParam().getRequestContext());\n        req.setInstanceNo(context.getInstance().getInstanceNo());\n        req.setUnitCode(context.getUnitCode());\n        req.setBizNo(context.getBizNo());\n        \n        Map<String, String> variables = JSON.parseObject(context.getInstance().getVars(), Map.class);\n        context.setVariables(variables);\n        req.setVariables(variables);\n        \n        String serviceId = (String) context.getProcessUnit().getConfig(ProcessUnitConstants.CONF_ASYNC_SERVICE_ID);\n        Map<String, Object> serviceConf = (Map<String, Object>) context.getProcessUnit().getConfig(ProcessUnitConstants.CONF_ASYNC_SERVICE_CONF);\n        req.setServiceConf(serviceConf);\n        log.info(\"Invoke client request is:{}, serviceId:{}\", req, serviceId);\n        try {\n            ProcessUnitClientService processUnitClientService = getProcessUnitClientService(serviceId, context);\n            AsyncCallRealRes res = processUnitClientService.asyncCallReal(req);\n            log.info(\"Invoke client response :{}\", res);\n            context.getResult().setResult(res.getResult());\n            context.getResult().setResponseContent(res.getResponseContent());\n            context.setVariables(res.getVariables());\n            context.getResult().setAutoRunFlag(res.getAutoRunFlag());\n            context.getResult().setNextAutoRunTime(res.getNextAutoRunTime());\n            context.setClientInfo(res.getClientInfo());\n        } catch (Exception e) {\n            log.error(\"Invoke client exception,\" + e.getMessage(), e);\n            context.getResult().setResult(ProcessUnitConstants.RESULT_EXCEPTION);\n            context.getResult().setResponseContent(null);\n        }\n    }\n    \n    protected ProcessUnitClientService getProcessUnitClientService(String serviceId, ExecContext context) {\n        return ObjectFactorys.getDefault()\n                .getObject(ProcessUnitClientService.class, serviceId);\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/infrastructure/gateway/ProcessUnitClientServiceMessageImpl.java",
    "content": "package com.jd.easyflow.processunit.infrastructure.gateway;\n\nimport org.springframework.beans.factory.annotation.Value;\n\nimport com.jd.easyflow.message.MessageSendService;\nimport com.jd.easyflow.processunit.domain.constant.ProcessUnitConstants;\nimport com.jd.easyflow.processunit.spi.client.ProcessUnitClientService;\nimport com.jd.easyflow.processunit.spi.client.dto.AsyncCallRealReq;\nimport com.jd.easyflow.processunit.spi.client.dto.AsyncCallRealRes;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n * \n * @author liyuliang5\n *\n */\npublic class ProcessUnitClientServiceMessageImpl implements ProcessUnitClientService {\n\n    private MessageSendService messageSendService;\n\n    @Value(\"${easyflow.processunit.clientExecuteMessageTopic:PROCESS_UNIT_CLIENT_EXECUTE}\")\n    private String defaultMessageTopic;\n\n    @Override\n    public AsyncCallRealRes asyncCallReal(AsyncCallRealReq req) {\n        String topic = req.getServiceConf() == null ? null : (String) req.getServiceConf().get(\"messageTopic\");\n        if (topic == null) {\n            topic = defaultMessageTopic;\n        }\n        messageSendService.sendMessage(req.getExecutionNo() + \"-\" + req.getInstanceNo() + \"-\" + req.getBizNo(), topic,\n                JSON.toJSONString(req));\n        AsyncCallRealRes res = new AsyncCallRealRes();\n        res.setResult(ProcessUnitConstants.RESULT_UNKNOWN);\n        res.setVariables(req.getVariables());\n        return res;\n    }\n\n    public MessageSendService getMessageSendService() {\n        return messageSendService;\n    }\n\n    public void setMessageSendService(MessageSendService messageSendService) {\n        this.messageSendService = messageSendService;\n    }\n\n    public String getDefaultMessageTopic() {\n        return defaultMessageTopic;\n    }\n\n    public void setDefaultMessageTopic(String defaultMessageTopic) {\n        this.defaultMessageTopic = defaultMessageTopic;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/infrastructure/persistence/mapper/ProcessUnitExecutionMapper.java",
    "content": "package com.jd.easyflow.processunit.infrastructure.persistence.mapper;\n\nimport java.util.Collection;\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\n\nimport com.jd.easyflow.common.dto.pager.PagerCondition;\nimport com.jd.easyflow.processunit.infrastructure.persistence.po.ProcessUnitExecution;\n\n/**\n * @author liyuliang5\n * \n */\n@Mapper\npublic interface ProcessUnitExecutionMapper {\n\n    int insert(ProcessUnitExecution record);\n\n    ProcessUnitExecution selectByPrimaryKey(Long id);\n\n    int updateByPrimaryKeySelective(ProcessUnitExecution record);\n\n    int updateByPrimaryKey(ProcessUnitExecution record);\n\n    int updateByExecutionNo(ProcessUnitExecution record);\n\n    ProcessUnitExecution getByExecutionNo(String executionNo);\n\n    List<ProcessUnitExecution> selectProcessUnitExecution(@Param(\"instanceNos\") Collection<String> instanceNos);\n\n\n    int physicsDeleteProcessUnitExecution(@Param(\"ids\") Collection<Long> ids);\n\n    List<ProcessUnitExecution> selectProcessUnitExecutionByPageCondition(PagerCondition pagerQueryReq);\n\n    long countProcessUnitExecutionByPageCondition(PagerCondition pagerQueryReq);\n    \n    int insertForMigration(ProcessUnitExecution record);\n    \n    int updateForMigration(ProcessUnitExecution record);\n\n\n}"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/infrastructure/persistence/mapper/ProcessUnitInstanceMapper.java",
    "content": "package com.jd.easyflow.processunit.infrastructure.persistence.mapper;\n\nimport java.util.Collection;\nimport java.util.Date;\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\n\nimport com.jd.easyflow.common.dto.pager.PagerCondition;\nimport com.jd.easyflow.processunit.domain.model.vo.ProcessUnitInstanceKey;\nimport com.jd.easyflow.processunit.domain.model.vo.QueryAsyncInstanceVO;\nimport com.jd.easyflow.processunit.infrastructure.persistence.po.ProcessUnitInstance;\n\n/**\n * @author liyuliang5\n * \n */\n@Mapper\npublic interface ProcessUnitInstanceMapper {\n\n    int insert(ProcessUnitInstance record);\n\n    ProcessUnitInstance selectByPrimaryKey(Long id);\n\n    int updateByPrimaryKey(ProcessUnitInstance record);\n    \n    int updateByInstanceNo(ProcessUnitInstance record);\n    \n    int updateByInstanceNoSelective(ProcessUnitInstance record);\n\n    ProcessUnitInstance getByUnitCodeAndBizNo(@Param(\"unitCode\") String unitCode, @Param(\"bizNo\") String bizNo);\n\n    ProcessUnitInstance getByInstanceNo(String instanceNo);\n    \n    List<ProcessUnitInstance> selectListByUnitCodeAndBizNoPrefix(@Param(\"unitCode\") String unitCode, @Param(\"bizNoPrefix\") String bizNoPrefix);\n\n    List<String> findAsyncInstanceList(QueryAsyncInstanceVO vo);\n    \n    List<ProcessUnitInstanceKey> findAsyncInstanceKeyList(QueryAsyncInstanceVO vo);\n\n    List<ProcessUnitInstance> selectProcessUnitInstanceByPageCondition(PagerCondition pagerQueryReq);\n\n    long countProcessUnitInstanceByPageCondition(PagerCondition pagerQueryReq);\n\n    List<ProcessUnitInstance> selectProcessUnitInstance(@Param(\"createdDate\") Date createdDate, @Param(\"result\") String result);\n\n    int physicsDeleteProcessUnitInstance(@Param(\"ids\") Collection<Long> ids);\n    \n    int insertForMigration(ProcessUnitInstance record);\n\n    int updateForMigration(ProcessUnitInstance record);\n\n}"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/infrastructure/persistence/po/ProcessUnitExecution.java",
    "content": "package com.jd.easyflow.processunit.infrastructure.persistence.po;\n\nimport java.util.Date;\n\n/**\n * @author liyuliang5\n * \n */\npublic class ProcessUnitExecution {\n    private Long id;\n\n    private String executionNo;\n\n    private String requestNo;\n\n    private String parentNo;\n\n    private String processUnitCode;\n\n    private String bizNo;\n\n    private String instanceNo;\n\n    private String productCode;\n\n    private String result;\n\n    private Date requestTime;\n\n    private Date responseTime;\n\n    private Integer elaspeTime;\n\n    private String execType;\n    \n    private String requestContent;\n    \n    private String responseContent;\n\n    private String extData;\n\n    private Date createdDate;\n\n    private Date modifiedDate;\n\n    private boolean deleted;\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getExecutionNo() {\n        return executionNo;\n    }\n\n    public void setExecutionNo(String executionNo) {\n        this.executionNo = executionNo;\n    }\n\n    public String getRequestNo() {\n        return requestNo;\n    }\n\n    public void setRequestNo(String requestNo) {\n        this.requestNo = requestNo;\n    }\n\n    public String getParentNo() {\n        return parentNo;\n    }\n\n    public void setParentNo(String parentNo) {\n        this.parentNo = parentNo;\n    }\n\n    public String getProcessUnitCode() {\n        return processUnitCode;\n    }\n\n    public void setProcessUnitCode(String processUnitCode) {\n        this.processUnitCode = processUnitCode;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    public String getInstanceNo() {\n        return instanceNo;\n    }\n\n    public void setInstanceNo(String instanceNo) {\n        this.instanceNo = instanceNo;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n\n    public String getResult() {\n        return result;\n    }\n\n    public void setResult(String result) {\n        this.result = result;\n    }\n\n    public Date getRequestTime() {\n        return requestTime;\n    }\n\n    public void setRequestTime(Date requestTime) {\n        this.requestTime = requestTime;\n    }\n\n    public Date getResponseTime() {\n        return responseTime;\n    }\n\n    public void setResponseTime(Date responseTime) {\n        this.responseTime = responseTime;\n    }\n\n    public Integer getElaspeTime() {\n        return elaspeTime;\n    }\n\n    public void setElaspeTime(Integer elaspeTime) {\n        this.elaspeTime = elaspeTime;\n    }\n\n    public String getExecType() {\n        return execType;\n    }\n\n    public void setExecType(String execType) {\n        this.execType = execType;\n    }\n\n    public String getRequestContent() {\n        return requestContent;\n    }\n\n    public void setRequestContent(String requestContent) {\n        this.requestContent = requestContent;\n    }\n\n    public String getResponseContent() {\n        return responseContent;\n    }\n\n    public void setResponseContent(String responseContent) {\n        this.responseContent = responseContent;\n    }\n\n    public String getExtData() {\n        return extData;\n    }\n\n    public void setExtData(String extData) {\n        this.extData = extData;\n    }\n\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n\n    public boolean isDeleted() {\n        return deleted;\n    }\n\n    public void setDeleted(boolean deleted) {\n        this.deleted = deleted;\n    }\n\n    @Override\n    public String toString() {\n        return \"ProcessUnitExecution [id=\" + id + \", executionNo=\" + executionNo + \", requestNo=\" + requestNo\n                + \", parentNo=\" + parentNo + \", processUnitCode=\" + processUnitCode + \", bizNo=\" + bizNo + \", instanceNo=\" + instanceNo\n                + \", productCode=\" + productCode + \", result=\" + result + \", requestTime=\" + requestTime\n                + \", responseTime=\" + responseTime + \", elaspeTime=\" + elaspeTime + \", execType=\" + execType\n                + \", requestContent=\" + requestContent + \", responseContent=\" + responseContent + \", extData=\" + extData\n                + \", createdDate=\" + createdDate + \", modifiedDate=\" + modifiedDate + \", deleted=\" + deleted + \"]\";\n    }\n    \n    \n\n}"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/infrastructure/persistence/po/ProcessUnitInstance.java",
    "content": "package com.jd.easyflow.processunit.infrastructure.persistence.po;\n\nimport java.util.Date;\n\n/**\n * @author liyuliang5\n * \n */\npublic class ProcessUnitInstance {\n    private Long id;\n\n    private String instanceNo;\n\n    private String bizNo;\n\n    private String parentNo;\n\n    private String processUnitCode;\n\n    private String productCode;\n\n    private String result;\n\n    private Boolean autoRunFlag;\n\n    private Integer autoRunTimes;\n\n    private Date nextAutoRunTime;\n    \n    private String requestContent;\n    \n    private String responseContent;\n    \n    private String vars;\n\n    private String extData;\n\n    private Date createdDate;\n\n    private Date modifiedDate;\n\n    private boolean deleted;\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getInstanceNo() {\n        return instanceNo;\n    }\n\n    public void setInstanceNo(String instanceNo) {\n        this.instanceNo = instanceNo;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n\n    public String getParentNo() {\n        return parentNo;\n    }\n\n    public void setParentNo(String parentNo) {\n        this.parentNo = parentNo;\n    }\n\n    public String getProcessUnitCode() {\n        return processUnitCode;\n    }\n\n    public void setProcessUnitCode(String processUnitCode) {\n        this.processUnitCode = processUnitCode;\n    }\n\n    public String getProductCode() {\n        return productCode;\n    }\n\n    public void setProductCode(String productCode) {\n        this.productCode = productCode;\n    }\n\n    public String getResult() {\n        return result;\n    }\n\n    public void setResult(String result) {\n        this.result = result;\n    }\n\n    public Boolean getAutoRunFlag() {\n        return autoRunFlag;\n    }\n\n    public void setAutoRunFlag(Boolean autoRunFlag) {\n        this.autoRunFlag = autoRunFlag;\n    }\n\n    public Integer getAutoRunTimes() {\n        return autoRunTimes;\n    }\n\n    public void setAutoRunTimes(Integer autoRunTimes) {\n        this.autoRunTimes = autoRunTimes;\n    }\n\n    public Date getNextAutoRunTime() {\n        return nextAutoRunTime;\n    }\n\n    public void setNextAutoRunTime(Date nextAutoRunTime) {\n        this.nextAutoRunTime = nextAutoRunTime;\n    }\n\n    public String getRequestContent() {\n        return requestContent;\n    }\n\n    public void setRequestContent(String requestContent) {\n        this.requestContent = requestContent;\n    }\n\n    public String getResponseContent() {\n        return responseContent;\n    }\n\n    public void setResponseContent(String responseContent) {\n        this.responseContent = responseContent;\n    }\n    \n    public String getVars() {\n        return vars;\n    }\n\n    public void setVars(String vars) {\n        this.vars = vars;\n    }\n\n    public String getExtData() {\n        return extData;\n    }\n\n    public void setExtData(String extData) {\n        this.extData = extData;\n    }\n\n    public Date getCreatedDate() {\n        return createdDate;\n    }\n\n    public void setCreatedDate(Date createdDate) {\n        this.createdDate = createdDate;\n    }\n\n    public Date getModifiedDate() {\n        return modifiedDate;\n    }\n\n    public void setModifiedDate(Date modifiedDate) {\n        this.modifiedDate = modifiedDate;\n    }\n\n    public boolean isDeleted() {\n        return deleted;\n    }\n\n    public void setDeleted(boolean deleted) {\n        this.deleted = deleted;\n    }\n\n    @Override\n    public String toString() {\n        return \"ProcessUnitInstance [id=\" + id + \", instanceNo=\" + instanceNo + \", bizNo=\" + bizNo + \", parentNo=\"\n                + parentNo + \", processUnitCode=\" + processUnitCode + \", productCode=\" + productCode + \", result=\"\n                + result + \", autoRunFlag=\" + autoRunFlag + \", autoRunTimes=\" + autoRunTimes + \", nextAutoRunTime=\"\n                + nextAutoRunTime + \", requestContent=\" + requestContent + \", responseContent=\" + responseContent\n                + \",vars=\" + vars + \", extData=\" + extData + \", createdDate=\" + createdDate + \", modifiedDate=\" + modifiedDate\n                + \", deleted=\" + deleted + \"]\";\n    }\n    \n    \n}"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/infrastructure/repository/ProcessUnitConfigCache.java",
    "content": "package com.jd.easyflow.processunit.infrastructure.repository;\n\nimport java.util.List;\n\nimport com.jd.easyflow.processunit.domain.model.entity.ProcessUnitEntity;\n\n/**\n * \n * @author liyuliang5\n */\npublic interface ProcessUnitConfigCache {\n\n    public ProcessUnitEntity getProcessUnit(String key);\n    \n    public List<ProcessUnitEntity> getAllProcessUnitList();\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/infrastructure/repository/ProcessUnitConfigFileCache.java",
    "content": "package com.jd.easyflow.processunit.infrastructure.repository;\n\nimport java.io.ByteArrayOutputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.nio.charset.StandardCharsets;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.fasterxml.jackson.core.type.TypeReference;\nimport com.jd.easyflow.common.exception.EasyFlowException;\nimport com.jd.easyflow.processunit.domain.model.entity.ProcessUnitEntity;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n * \n * @author liyuliang5\n */\npublic class ProcessUnitConfigFileCache implements ProcessUnitConfigCache {\n\n    private static final Logger log = LoggerFactory.getLogger(ProcessUnitConfigFileCache.class);\n\n    protected String processUnitConfigPath = \"/config/processUnitConfig.json\";\n\n    protected volatile Map<String, ProcessUnitEntity> processUnitConfigMap;\n\n\n    public void init() {\n        if (processUnitConfigPath != null && ! processUnitConfigPath.isEmpty()) {\n            try {\n                processUnitConfigMap = JSON.parseObject(\n                        toString(this.getClass().getResourceAsStream(processUnitConfigPath)),\n                        new TypeReference<Map<String, ProcessUnitEntity>>() {\n                        });\n                processUnitConfigMap.entrySet().forEach(entry -> {\n                    entry.getValue().setParentCode(entry.getKey());\n                });\n            } catch (IOException e) {\n                throw new EasyFlowException(\"processUnit read exception\");\n            }\n        } else {\n            processUnitConfigMap = new ConcurrentHashMap<>();\n        }\n    }\n\n    public String getProcessUnitConfigPath() {\n        return processUnitConfigPath;\n    }\n\n    public void setProcessUnitConfigPath(String processUnitConfigPath) {\n        this.processUnitConfigPath = processUnitConfigPath;\n    }\n\n    @Override\n    public ProcessUnitEntity getProcessUnit(String key) {\n        ProcessUnitEntity processUnit = processUnitConfigMap.get(key);\n        return processUnit;\n    }\n\n    @Override\n    public List<ProcessUnitEntity> getAllProcessUnitList() {\n        return new ArrayList<>(processUnitConfigMap.values());\n\n    }\n\n    private static String toString(InputStream inputStream) throws IOException {\n        ByteArrayOutputStream result = new ByteArrayOutputStream();\n        byte[] buffer = new byte[1024];\n        int length;\n        while ((length = inputStream.read(buffer)) != -1) {\n            result.write(buffer, 0, length);\n        }\n        String str = result.toString(StandardCharsets.UTF_8.name());\n        return str;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/processunit/infrastructure/repository/ProcessUnitRepositoryImpl.java",
    "content": "package com.jd.easyflow.processunit.infrastructure.repository;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Objects;\nimport java.util.function.Function;\nimport java.util.stream.Collectors;\n\nimport javax.sql.DataSource;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.dao.DuplicateKeyException;\nimport org.springframework.jdbc.core.JdbcTemplate;\n\nimport com.jd.easyflow.codegenerator.client.CodeGenerateHelper;\nimport com.jd.easyflow.common.adapter.export.dto.ExportResponseCode;\nimport com.jd.easyflow.common.dto.pager.FieldEntry;\nimport com.jd.easyflow.common.dto.pager.PagerCondition;\nimport com.jd.easyflow.common.dto.pager.PagerResult;\nimport com.jd.easyflow.common.exception.UserException;\nimport com.jd.easyflow.processunit.domain.constant.ProcessUnitConstants;\nimport com.jd.easyflow.processunit.domain.model.entity.ProcessUnitEntity;\nimport com.jd.easyflow.processunit.domain.model.entity.ProcessUnitExecutionEntity;\nimport com.jd.easyflow.processunit.domain.model.entity.ProcessUnitInstanceEntity;\nimport com.jd.easyflow.processunit.domain.model.vo.ProcessUnitInstanceKey;\nimport com.jd.easyflow.processunit.domain.model.vo.QueryAsyncInstanceVO;\nimport com.jd.easyflow.processunit.domain.repository.ProcessUnitRepository;\nimport com.jd.easyflow.processunit.infrastructure.converter.ProcessUnitConverter;\nimport com.jd.easyflow.processunit.infrastructure.persistence.mapper.ProcessUnitExecutionMapper;\nimport com.jd.easyflow.processunit.infrastructure.persistence.mapper.ProcessUnitInstanceMapper;\nimport com.jd.easyflow.processunit.infrastructure.persistence.po.ProcessUnitExecution;\nimport com.jd.easyflow.processunit.infrastructure.persistence.po.ProcessUnitInstance;\nimport com.jd.easyflow.sharding.CurrentShardInfo;\nimport com.jd.easyflow.sharding.config.ShardingConfigManager;\nimport com.jd.easyflow.sharding.service.ShardingComputeResult;\nimport com.jd.easyflow.sharding.service.ShardingService;\n\n/**\n *\n * @author liyuliang5\n * \n */\npublic class ProcessUnitRepositoryImpl implements ProcessUnitRepository {\n\n    private static final Logger log = LoggerFactory.getLogger(ProcessUnitRepositoryImpl.class);\n\n    @Autowired\n    protected ProcessUnitInstanceMapper processUnitInstanceMapper;\n    @Autowired\n    protected ProcessUnitExecutionMapper processUnitExecutionMapper;\n    @Autowired\n    private ProcessUnitConfigCache localCache;\n\n    protected boolean shardingEnabled = false;\n\n    protected ShardingService shardingService;\n    \n    protected DataSource dataSource;\n    \n    protected ShardingConfigManager shardingConfigManager;\n    \n    private int insertDuplicateIdLoopTimes = 500;\n    \n    private int insertDuplicateRetryTimes = 3;\n    \n    public void init() {\n\n    }\n\n    @Override\n    public ProcessUnitEntity getProcessUnitByCode(String processUnitCode) {\n        ProcessUnitEntity processUnit = localCache.getProcessUnit(processUnitCode);\n        return processUnit;\n    }\n\n    @Override\n    public List<ProcessUnitEntity> findAllProcessUnitList() {\n        return localCache.getAllProcessUnitList();\n    }\n\n    @Override\n    public ProcessUnitInstanceEntity getInstanceByUnitCodeAndBizNo(String unitCode, String bizNo) {\n        if (!shardingEnabled) {\n            ProcessUnitInstance instance = processUnitInstanceMapper.getByUnitCodeAndBizNo(unitCode, bizNo);\n            return ProcessUnitConverter.INSTANCE.po2Entity(instance);\n        }\n        if (shardingConfigManager.isFixDefaultShard()) {\n            return shardingService.executeInDefaultShard(shard -> {\n                ProcessUnitInstance instance = processUnitInstanceMapper.getByUnitCodeAndBizNo(unitCode, bizNo);\n                return ProcessUnitConverter.INSTANCE.po2Entity(instance);\n            });\n        }\n        if (unitCode == null || bizNo == null) {\n            log.warn(\"getInstanceByUnitCodeAndBizNo:unitCode and bizNo can not both null, unitCode:{} bizNo:{}\", unitCode, bizNo);\n            return null;\n        }\n        return shardingService.execute(ShardingService.OP_TYPE_READ, unitCode, bizNo, (shard) -> {\n            ProcessUnitInstance instance = processUnitInstanceMapper.getByUnitCodeAndBizNo(unitCode, bizNo);\n            return ProcessUnitConverter.INSTANCE.po2Entity(instance);\n        });\n    }\n    \n    \n    @Override\n    public List<ProcessUnitInstanceEntity> queryByUnitCodeAndBizNoPrefix(String unitCode, String bizNo) {\n        int length = bizNo.length();\n        if (length < 20) {\n            throw new RuntimeException(\"queryByUnitCodeAndBizNoPrefix.bizNo length illegal\" + bizNo);\n        }\n        Function<CurrentShardInfo, List> function = shard -> {\n            List<ProcessUnitInstance> instanceList = processUnitInstanceMapper.selectListByUnitCodeAndBizNoPrefix(unitCode, bizNo);\n            List<ProcessUnitInstanceEntity> list = instanceList.stream().map(processUnitInstance -> ProcessUnitConverter.INSTANCE.po2Entity(processUnitInstance)).collect(Collectors.toList());\n            return list;\n        };\n        \n        if (! shardingEnabled) {\n            return function.apply(null);\n        }\n        if (shardingConfigManager.isFixDefaultShard()) {\n            return shardingService.executeInDefaultShard(function);\n        }\n        if (unitCode != null) {\n            return shardingService.findListInShardsOfGroup(unitCode, false, function);\n        } else {\n            return shardingService.findListInAllShards(function);\n        }\n        \n    }\n\n    @Override\n    public ProcessUnitInstanceEntity getInstance(String instanceNo) {\n        return getInstance(instanceNo, null, null);\n    }\n\n    @Override\n    public ProcessUnitInstanceEntity getInstance(String instanceNo, String unitCode, String bizNo) {\n        Function<CurrentShardInfo, ProcessUnitInstanceEntity> function = (shard) -> {\n            if (instanceNo != null) {\n                ProcessUnitInstance instance = processUnitInstanceMapper.getByInstanceNo(instanceNo);\n                if (instance == null) {\n                    return null;\n                }\n                if ((unitCode != null && !unitCode.equals(instance.getProcessUnitCode()))\n                        || (bizNo != null && !bizNo.equals(instance.getBizNo()))) {\n                    log.warn(\"instanceNo:{} unitCode:{} bizNo:{} state inconsistent\", instanceNo, unitCode, bizNo);\n                    return null;\n                }\n                return ProcessUnitConverter.INSTANCE.po2Entity(instance);\n            } else if (unitCode != null && bizNo != null) {\n                ProcessUnitInstance instance = processUnitInstanceMapper.getByUnitCodeAndBizNo(unitCode, bizNo);\n                if (instance == null) {\n                    return null;\n                }\n                return ProcessUnitConverter.INSTANCE.po2Entity(instance);\n            } else {\n                throw new IllegalArgumentException(\n                        \"Param illegal:instanceNo:\" + instanceNo + \" unitCode:\" + unitCode + \" bizNo:\" + bizNo);\n            }\n        };\n        if (!shardingEnabled) {\n            return function.apply(null);\n        }\n        if (shardingConfigManager.isFixDefaultShard()) {\n            return shardingService.executeInDefaultShard(function);\n        }\n        if (unitCode != null && bizNo != null) {\n            return shardingService.execute(shardingService.OP_TYPE_READ, unitCode, bizNo, function);\n        }\n        if (unitCode != null) {\n            return shardingService.getOneInShardsOfGroup(unitCode, function);\n        }\n        return shardingService.getOneInAllShards(function);\n    }\n\n    @Override\n    public void saveInstance(ProcessUnitInstanceEntity entity) {\n        if (!shardingEnabled) {\n            ProcessUnitInstance instance = ProcessUnitConverter.INSTANCE.entity2Po(entity);\n            processUnitInstanceMapper.insert(instance);\n            entity.setId(instance.getId());\n            return;\n        }\n        if (shardingConfigManager.isFixDefaultShard()) {\n            shardingService.executeInDefaultShard(shard -> {\n                ProcessUnitInstance instance = ProcessUnitConverter.INSTANCE.entity2Po(entity);\n                processUnitInstanceMapper.insert(instance);\n                entity.setId(instance.getId());\n                return null;\n            });\n            return;\n        }\n        String idStr = CodeGenerateHelper.generateCode(\"PU-INSTANCE-ID\", \"\");\n        long id = Long.parseLong(idStr);\n        try {\n            shardingService.execute(ShardingService.OP_TYPE_WRITE, entity.getProcessUnitCode(), entity.getBizNo(),\n                    shard -> {\n                        ProcessUnitInstance instance = ProcessUnitConverter.INSTANCE.entity2Po(entity);\n                        instance.setId(id);\n                        processUnitInstanceMapper.insert(instance);\n                        entity.setId(instance.getId());\n                        return null;\n                    });\n        } catch (DuplicateKeyException e) {\n            log.error(\"Instance \" + entity + \" id \" + idStr + \" insert duplicate exception,\" + e.getMessage(), e);\n            if (insertDuplicateRetryTimes < 1) {\n                throw e;\n            }\n            int retryTimes = 0;\n            while (true) {\n                retryTimes++;\n                for (int j = 0; j < insertDuplicateIdLoopTimes; j++) {\n                    idStr = CodeGenerateHelper.generateCode(\"PU-INSTANCE-ID\", \"\");\n                }\n                long newId = Long.parseLong(idStr);\n                try {\n                    shardingService.execute(ShardingService.OP_TYPE_WRITE, entity.getProcessUnitCode(), entity.getBizNo(),\n                            shard -> {\n                                ProcessUnitInstance instance = ProcessUnitConverter.INSTANCE.entity2Po(entity);\n                                instance.setId(newId);\n                                processUnitInstanceMapper.insert(instance);\n                                entity.setId(instance.getId());\n                                return null;\n                            });\n                    log.info(\"Regenerated id:\" + idStr + \" retry insert success\");\n                    break;\n                } catch (DuplicateKeyException e2) {\n                    log.error(\"Record \" + entity + \" id \" + idStr + \" retry insert exception,\" + e.getMessage(), e);\n                    if (retryTimes == insertDuplicateRetryTimes) {\n                        throw e2;\n                    }\n                }\n            }\n        }\n    }\n\n    @Override\n    public void updateInstance(ProcessUnitInstanceEntity entity) {\n        if (!shardingEnabled) {\n            ProcessUnitInstance instance = ProcessUnitConverter.INSTANCE.entity2Po(entity);\n            processUnitInstanceMapper.updateByPrimaryKey(instance);\n            return;\n        }\n        if (shardingConfigManager.isFixDefaultShard()) {\n            shardingService.executeInDefaultShard(shard -> {\n                ProcessUnitInstance instance = ProcessUnitConverter.INSTANCE.entity2Po(entity);\n                processUnitInstanceMapper.updateByPrimaryKey(instance);\n                return null;\n            });\n            return;\n        }\n        shardingService.execute(ShardingService.OP_TYPE_WRITE, entity.getProcessUnitCode(), entity.getBizNo(),\n                (shard) -> {\n                    ProcessUnitInstance instance = ProcessUnitConverter.INSTANCE.entity2Po(entity);\n                    processUnitInstanceMapper.updateByInstanceNo(instance);\n                    return null;\n                });\n    }\n\n    \n    @Override\n    public void updateInstanceByInstanceNoSelective(ProcessUnitInstanceEntity entity) {\n        if (!shardingEnabled) {\n            ProcessUnitInstance instance = ProcessUnitConverter.INSTANCE.entity2Po(entity);\n            processUnitInstanceMapper.updateByInstanceNoSelective(instance);\n            return;\n        }\n        if (shardingConfigManager.isFixDefaultShard()) {\n            shardingService.executeInDefaultShard(shard -> {\n                ProcessUnitInstance instance = ProcessUnitConverter.INSTANCE.entity2Po(entity);\n                processUnitInstanceMapper.updateByInstanceNoSelective(instance);\n                return null;\n            });\n            return;\n        }\n        shardingService.execute(shardingService.OP_TYPE_WRITE, entity.getProcessUnitCode(), entity.getBizNo(),\n                (shard) -> {\n                    ProcessUnitInstance instance = ProcessUnitConverter.INSTANCE.entity2Po(entity);\n                    processUnitInstanceMapper.updateByInstanceNoSelective(instance);\n                    return null;\n                });\n    }\n\n    @Override\n    public List<String> findAsyncInstanceList(QueryAsyncInstanceVO query) {\n        if (!shardingEnabled) {\n            return processUnitInstanceMapper.findAsyncInstanceList(query);\n        }\n        if (shardingConfigManager.isFixDefaultShard()) {\n            return shardingService.executeInDefaultShard(shard -> {\n                return processUnitInstanceMapper.findAsyncInstanceList(query);\n            });\n        }\n        List<ProcessUnitInstanceKey> list = findAsyncInstanceKeyList(query);\n        return list.stream().map(key -> key.getInstanceNo()).collect(Collectors.toList());\n    }\n\n    @Override\n    public List<ProcessUnitInstanceKey> findAsyncInstanceKeyList(QueryAsyncInstanceVO query) {\n        if (!shardingEnabled) {\n            List<ProcessUnitInstanceKey> list = processUnitInstanceMapper.findAsyncInstanceKeyList(query);\n            return list;\n        }\n        if (shardingConfigManager.isFixDefaultShard()) {\n            return shardingService.executeInDefaultShard(shard -> {\n                List<ProcessUnitInstanceKey> list = processUnitInstanceMapper.findAsyncInstanceKeyList(query);\n                return list;\n            });\n        }\n        if (query.getUnitCode() != null) {\n            return shardingService.findListLoopShardsOfGroup(query.getUnitCode(), query.getMaxCount(), false, (shard) -> {\n                List<ProcessUnitInstanceKey> list = processUnitInstanceMapper.findAsyncInstanceKeyList(query);\n                return list; \n            });\n        }\n        return shardingService.findListLoopAllShards(query.getMaxCount(), (shard) -> {\n            List<ProcessUnitInstanceKey> list = processUnitInstanceMapper.findAsyncInstanceKeyList(query);\n            return list; \n        });\n    }\n\n    public ProcessUnitExecutionEntity getExecution(String executionNo) {\n        return getExecution(executionNo, null, null);\n    }\n\n    @Override\n    public ProcessUnitExecutionEntity getExecution(String executionNo, String unitCode, String bizNo) {\n        Function<CurrentShardInfo, ProcessUnitExecutionEntity> function = shard -> {\n            ProcessUnitExecution execution = processUnitExecutionMapper.getByExecutionNo(executionNo);\n            if (execution == null) {\n                return null;\n            }\n            if ((unitCode != null && !unitCode.equals(execution.getProcessUnitCode()))\n                    || (bizNo != null && execution.getBizNo() != null && !bizNo.equals(execution.getBizNo()))) {\n                log.warn(\"executionNo:{} unitCode:{} bizNo:{} state inconsistent\", executionNo, unitCode, bizNo);\n                return null;\n            }\n            return ProcessUnitConverter.INSTANCE.po2Entity(execution);\n        };\n        \n        if (!shardingEnabled) {\n            return function.apply(null);\n        }\n        if (shardingConfigManager.isFixDefaultShard()) {\n            return shardingService.executeInDefaultShard(function);\n        }\n        if (unitCode != null && bizNo != null) {\n            return shardingService.execute(shardingService.OP_TYPE_READ, unitCode, bizNo, function);\n        } \n        if (unitCode != null) {\n            return shardingService.getOneInShardsOfGroup(unitCode, function);\n        }\n        return shardingService.getOneInAllShards(function);\n    }\n\n    @Override\n    public void saveExecution(ProcessUnitExecutionEntity entity) {\n        if (!shardingEnabled) {\n            ProcessUnitExecution execution = ProcessUnitConverter.INSTANCE.entity2Po(entity);\n            processUnitExecutionMapper.insert(execution);\n            entity.setId(execution.getId());\n            return;\n        }\n        if (shardingConfigManager.isFixDefaultShard()) {\n            shardingService.executeInDefaultShard(shard -> {\n                ProcessUnitExecution execution = ProcessUnitConverter.INSTANCE.entity2Po(entity);\n                processUnitExecutionMapper.insert(execution);\n                entity.setId(execution.getId());\n                return null;\n            });\n            return;\n        }\n\n        if (entity.getBizNo() == null) {\n            entity.setBizNo(\"\");\n        }\n        String idStr = CodeGenerateHelper.generateCode(\"PU-EXECUTION-ID\", \"\");\n        long id = Long.parseLong(idStr);\n        try {\n            shardingService.execute(shardingService.OP_TYPE_WRITE, entity.getProcessUnitCode(), entity.getBizNo(),\n                    (shard) -> {\n                        ProcessUnitExecution execution = ProcessUnitConverter.INSTANCE.entity2Po(entity);\n                        execution.setId(id);\n                        processUnitExecutionMapper.insert(execution);\n                        entity.setId(execution.getId());\n                        return null;\n                    });\n        } catch (DuplicateKeyException e) {\n            log.error(\"Execution \" + entity + \" id \" + idStr + \" insert duplicate exception,\" + e.getMessage(), e);\n            if (insertDuplicateRetryTimes < 1) {\n                throw e;\n            }\n            int retryTimes = 0;\n            while (true) {\n                retryTimes++;\n                for (int j = 0; j < insertDuplicateIdLoopTimes; j++) {\n                    idStr = CodeGenerateHelper.generateCode(\"PU-EXECUTION-ID\", \"\");\n                }\n                long newId = Long.parseLong(idStr);\n                try {\n                    shardingService.execute(shardingService.OP_TYPE_WRITE, entity.getProcessUnitCode(), entity.getBizNo(),\n                            shard -> {\n                                ProcessUnitExecution execution = ProcessUnitConverter.INSTANCE.entity2Po(entity);\n                                execution.setId(newId);\n                                processUnitExecutionMapper.insert(execution);\n                                entity.setId(execution.getId());\n                                return null;\n                            });\n                    log.info(\"Execution regenerateted id:\" + idStr + \" retry insert success\");\n                    break;\n                } catch (DuplicateKeyException e2) {\n                    log.error(\"Execution \" + entity + \" id \" + idStr + \" retry insert exception,\" + e.getMessage(), e);\n                    if (retryTimes == insertDuplicateRetryTimes) {\n                        throw e2;\n                    }\n                }\n            }\n        }\n    }\n\n    @Override\n    public void updateExecution(ProcessUnitExecutionEntity entity) {\n        if (!shardingEnabled) {\n            ProcessUnitExecution execution = ProcessUnitConverter.INSTANCE.entity2Po(entity);\n            processUnitExecutionMapper.updateByPrimaryKey(execution);\n            return;\n        }\n        if (shardingConfigManager.isFixDefaultShard()) {\n            shardingService.executeInDefaultShard(shard -> {\n                ProcessUnitExecution execution = ProcessUnitConverter.INSTANCE.entity2Po(entity);\n                processUnitExecutionMapper.updateByPrimaryKey(execution);\n                return null;\n            });\n            return;\n        }\n        if (entity.getBizNo() == null) {\n            entity.setBizNo(\"\");\n        }\n        shardingService.execute(shardingService.OP_TYPE_WRITE, entity.getProcessUnitCode(), entity.getBizNo(),\n                (shard) -> {\n                    ProcessUnitExecution execution = ProcessUnitConverter.INSTANCE.entity2Po(entity);\n                    processUnitExecutionMapper.updateByExecutionNo(execution);\n                    return null;\n                });\n    }\n\n    @Override\n    public void updateExecutionByExecutionNo(ProcessUnitExecutionEntity entity) {\n        if (!shardingEnabled) {\n            ProcessUnitExecution execution = ProcessUnitConverter.INSTANCE.entity2Po(entity);\n            processUnitExecutionMapper.updateByExecutionNo(execution);\n            return;\n        }\n        if (shardingConfigManager.isFixDefaultShard()) {\n            shardingService.executeInDefaultShard(shard -> {\n                ProcessUnitExecution execution = ProcessUnitConverter.INSTANCE.entity2Po(entity);\n                processUnitExecutionMapper.updateByExecutionNo(execution);\n                return null;\n            });\n            return;\n        }\n\n        if (entity.getBizNo() == null) {\n            entity.setBizNo(\"\");\n        }\n        shardingService.execute(shardingService.OP_TYPE_WRITE, entity.getProcessUnitCode(), entity.getBizNo(),\n                (shard) -> {\n                    ProcessUnitExecution execution = ProcessUnitConverter.INSTANCE.entity2Po(entity);\n                    processUnitExecutionMapper.updateByExecutionNo(execution);\n                    return null;\n                });\n    }\n\n    @Override\n    public PagerResult pagerQueryProcessUnitInstance(PagerCondition pagerQueryReq) {\n        FieldEntry queryTypeField = pagerQueryReq.getField(\"queryType\");\n        FieldEntry instanceNoField = pagerQueryReq.getField(\"instanceNo\");\n        FieldEntry unitCodeField = pagerQueryReq.getField(\"processUnitCode\");\n        FieldEntry bizNoField = pagerQueryReq.getField(\"bizNo\");\n        FieldEntry createdDateStartField = pagerQueryReq.getField(\"createdDateStart\");\n        FieldEntry createdDateEndField = pagerQueryReq.getField(\"createdDateEnd\");\n        FieldEntry resultListField = pagerQueryReq.getField(\"resultList\");\n        boolean usingSlaveDb = Boolean.TRUE.equals(pagerQueryReq.getExtData(\"_usingSlaveDb\"));        \n\n        String queryType = queryTypeField == null ? null : (String) queryTypeField.getValue();\n        String instanceNo = instanceNoField == null ? null : (String) instanceNoField.getValue();\n        String unitCode = unitCodeField == null ? null : (String) unitCodeField.getValue();\n        String bizNo = bizNoField == null ? null : (String) bizNoField.getValue();\n        String createdDateStart = createdDateStartField == null ? null : (String) createdDateStartField.getValue();\n        String createdDateEnd = createdDateEndField == null ? null : (String) createdDateEndField.getValue();\n        String[] resultList = resultListField == null ? null : (String[]) resultListField.getValue();\n\n        PagerResult result = new PagerResult<>();\n        if (ProcessUnitConstants.INSTANCE_QUERY_TYPE_SINGLE.equals(queryType)) {\n\n            if (instanceNo == null && (unitCode == null || bizNo == null)) {\n                throw new UserException(ExportResponseCode.INVALID.getCode(), \" param illegal, instanceNo is null and unitCode or bizNo is null\");\n            }\n            ProcessUnitInstanceEntity entity = null;\n            if (instanceNo != null) {\n                entity = getInstance(instanceNo, unitCode, bizNo);\n            } else {\n                entity = getInstanceByUnitCodeAndBizNo(unitCode, bizNo);\n            }\n            if (entity != null) {\n                if ((instanceNo != null && !instanceNo.equals(entity.getInstanceNo()))\n                        || (unitCode != null && !unitCode.equals(entity.getProcessUnitCode()))\n                        || (bizNo != null && !bizNo.equals(entity.getBizNo()))) {\n                    entity = null;\n                }\n            }\n            if (entity == null) {\n                result.setList(new ArrayList<>());\n                result.setCount(0L);\n            } else {\n                result.setList(Arrays.asList(entity));\n                result.setCount(1L);\n            }\n        } else if (ProcessUnitConstants.INSTANCE_QUERY_TYPE_CREATED_DATE_RANGE.equals(queryType)) {\n            if (createdDateStart == null || createdDateEnd == null) {\n                throw new UserException(ExportResponseCode.INVALID.getCode(), \" Param illegal, both createdDateStart and createdDateEnd are null\");\n            }\n            if (!shardingEnabled) {\n                List<ProcessUnitInstance> list = processUnitInstanceMapper\n                        .selectProcessUnitInstanceByPageCondition(pagerQueryReq);\n                long count = processUnitInstanceMapper.countProcessUnitInstanceByPageCondition(pagerQueryReq);\n                result.setList(ProcessUnitConverter.INSTANCE.instancePoList2EntityList(list));\n                result.setCount(count);\n                return result;\n            }\n            if (shardingConfigManager.isFixDefaultShard()) {\n                return shardingService.executeInDefaultShard(shard -> {\n                    List<ProcessUnitInstance> list = processUnitInstanceMapper\n                            .selectProcessUnitInstanceByPageCondition(pagerQueryReq);\n                    long count = processUnitInstanceMapper.countProcessUnitInstanceByPageCondition(pagerQueryReq);\n                    result.setList(ProcessUnitConverter.INSTANCE.instancePoList2EntityList(list));\n                    result.setCount(count);\n                    return result;\n                });\n            }\n            pagerQueryReq.addSortField(\"id\", 1, \"asc\");\n\n            long count = 0;\n            List<ProcessUnitInstance> list = null;\n            if (unitCode != null) {\n                count = shardingService.countInShardsOfGroup(unitCode, usingSlaveDb,shard -> {\n                    long countOfShard = processUnitInstanceMapper\n                            .countProcessUnitInstanceByPageCondition(pagerQueryReq);\n                    return countOfShard;\n                });\n                list = shardingService.findListInShardsOfGroup(unitCode, usingSlaveDb, shard -> {\n                    List<ProcessUnitInstance> listOfShard = processUnitInstanceMapper\n                            .selectProcessUnitInstanceByPageCondition(pagerQueryReq);\n                    return listOfShard;\n                });\n            } else {\n                count = shardingService.countInAllShards(usingSlaveDb, shard -> {\n                    long countOfShard = processUnitInstanceMapper\n                            .countProcessUnitInstanceByPageCondition(pagerQueryReq);\n                    return countOfShard;\n                });\n                list = shardingService.findListInAllShards(usingSlaveDb, shard -> {\n                    List<ProcessUnitInstance> listOfShard = processUnitInstanceMapper\n                            .selectProcessUnitInstanceByPageCondition(pagerQueryReq);\n                    return listOfShard;\n                });\n            }\n            Collections.sort(list, (instance1, instance2) -> {\n                return instance1.getId().compareTo(instance2.getId());\n            });\n            if (list.size() > pagerQueryReq.getPageSize()) {\n                list = list.subList(0, pagerQueryReq.getPageSize());\n            }\n            result.setList(ProcessUnitConverter.INSTANCE.instancePoList2EntityList(list));\n            result.setCount(count);\n        } else {\n            throw new UnsupportedOperationException(\"Unsupported query type:\" + queryType);\n        }\n        return result;\n    }\n\n    @Override\n    public PagerResult pagerQueryProcessUnitExecution(PagerCondition pagerQueryReq) {\n        FieldEntry queryTypeField = pagerQueryReq.getField(\"queryType\");\n        FieldEntry unitCodeField = pagerQueryReq.getField(\"processUnitCode\");\n        FieldEntry bizNoField = pagerQueryReq.getField(\"bizNo\");\n        FieldEntry instanceNoField = pagerQueryReq.getField(\"instanceNo\");\n        FieldEntry requestTimeStartField = pagerQueryReq.getField(\"requestTimeStart\");\n        FieldEntry requestTimeEndField = pagerQueryReq.getField(\"requestTimeEnd\");\n        FieldEntry elapseTimeStartField = pagerQueryReq.getField(\"elapseTimeStart\");\n        FieldEntry elapseTimeEndField = pagerQueryReq.getField(\"elapseTimeEnd\");\n        FieldEntry resultListField = pagerQueryReq.getField(\"resultList\");\n        \n        boolean usingSlaveDb = Boolean.TRUE.equals(pagerQueryReq.getExtData(\"_usingSlaveDb\"));        \n\n        String queryType = queryTypeField == null ? null : (String) queryTypeField.getValue();\n        String instanceNo = instanceNoField == null ? null : (String) instanceNoField.getValue();\n        String unitCode = unitCodeField == null ? null : (String) unitCodeField.getValue();\n        String bizNo = bizNoField == null ? null : (String) bizNoField.getValue();\n        String requestTimeStart = requestTimeStartField == null ? null : (String) requestTimeStartField.getValue();\n        String requestTimeEnd = requestTimeEndField == null ? null : (String) requestTimeEndField.getValue();\n        List<String> resultList = resultListField == null ? null : (List<String>) resultListField.getValue();\n\n        PagerResult result = new PagerResult<>();\n        if (ProcessUnitConstants.EXECUTION_QUERY_TYPE_INSTANCE.equals(queryType)) {\n            if (instanceNo == null && (unitCode == null || bizNo == null)) {\n                throw new UserException(ExportResponseCode.INVALID.getCode(), \"param illegal, instanceNo is null and unitCode or bizNo is null\");\n            }\n            if (!shardingEnabled) {\n                List<ProcessUnitExecution> list = processUnitExecutionMapper\n                        .selectProcessUnitExecutionByPageCondition(pagerQueryReq);\n                long count = processUnitExecutionMapper.countProcessUnitExecutionByPageCondition(pagerQueryReq);\n                result.setList(ProcessUnitConverter.INSTANCE.executionPoList2EntityList(list));\n                result.setCount(count);\n            } else if (shardingConfigManager.isFixDefaultShard()) {\n                shardingService.executeInDefaultShard(shard -> {\n                    List<ProcessUnitExecution> list = processUnitExecutionMapper\n                            .selectProcessUnitExecutionByPageCondition(pagerQueryReq);\n                    long count = processUnitExecutionMapper.countProcessUnitExecutionByPageCondition(pagerQueryReq);\n                    result.setList(ProcessUnitConverter.INSTANCE.executionPoList2EntityList(list));\n                    result.setCount(count);\n                    return result;\n                });\n            } else {\n                if (unitCode == null || bizNo == null) {\n                    ProcessUnitInstanceEntity instance = getInstance(instanceNo);\n                    if (instance == null) {\n                        log.warn(\"instance:\" + instanceNo + \" not exists\");\n                        return new PagerResult(0L, new ArrayList());\n                    }\n                    if (unitCode == null) {\n                        unitCode = instance.getProcessUnitCode();\n                    } else if (!Objects.equals(unitCode, instance.getProcessUnitCode())) {\n                        log.warn(\"unitCode:\" + unitCode + \" and instance \" + instance + \" unitCode not equals\");\n                        return new PagerResult(0L, new ArrayList());\n                    }\n                    if (bizNo == null) {\n                        bizNo = instance.getBizNo();\n                    } else if (!Objects.equals(bizNo, instance.getBizNo())) {\n                        log.warn(\"bizNo:\" + bizNo + \" and instance \" + instance + \" bizNo not equals\");\n                        return new PagerResult(0L, new ArrayList());\n                    }\n                }\n                shardingService.execute(shardingService.OP_TYPE_READ, unitCode, bizNo, usingSlaveDb, (shard) -> {\n                    List<ProcessUnitExecution> list = processUnitExecutionMapper\n                            .selectProcessUnitExecutionByPageCondition(pagerQueryReq);\n                    long count = processUnitExecutionMapper.countProcessUnitExecutionByPageCondition(pagerQueryReq);\n                    result.setList(ProcessUnitConverter.INSTANCE.executionPoList2EntityList(list));\n                    result.setCount(count);\n                    return null;\n                });\n            }\n        } else if (ProcessUnitConstants.EXECUTION_QUERY_TYPE_REQUEST_TIME_RANGE.equals(queryType)) {\n            if (requestTimeStart == null || requestTimeEnd == null) {\n                throw new UserException(ExportResponseCode.INVALID.getCode(), \"  Param illegal, both createdDateStart and createdDateEnd are null\");\n            }\n            if (!shardingEnabled) {\n                List<ProcessUnitExecution> list = processUnitExecutionMapper\n                        .selectProcessUnitExecutionByPageCondition(pagerQueryReq);\n                long count = processUnitExecutionMapper.countProcessUnitExecutionByPageCondition(pagerQueryReq);\n                result.setList(ProcessUnitConverter.INSTANCE.executionPoList2EntityList(list));\n                result.setCount(count);\n            } else if (shardingConfigManager.isFixDefaultShard()) {\n                shardingService.executeInDefaultShard(shard -> {\n                    List<ProcessUnitExecution> list = processUnitExecutionMapper\n                            .selectProcessUnitExecutionByPageCondition(pagerQueryReq);\n                    long count = processUnitExecutionMapper.countProcessUnitExecutionByPageCondition(pagerQueryReq);\n                    result.setList(ProcessUnitConverter.INSTANCE.executionPoList2EntityList(list));\n                    result.setCount(count);\n                    return null;\n                });\n            } else {\n                pagerQueryReq.addSortField(\"id\", 1, \"asc\");\n\n                long count = 0;\n                List<ProcessUnitExecution> list = null;\n                if (unitCode != null) {\n                    count = shardingService.countInShardsOfGroup(unitCode, usingSlaveDb, shard -> {\n                        long countOfShard = processUnitExecutionMapper\n                                .countProcessUnitExecutionByPageCondition(pagerQueryReq);\n                        return countOfShard;\n                    });\n                    list = shardingService.findListInShardsOfGroup(unitCode, usingSlaveDb, shard -> {\n                        List<ProcessUnitExecution> listOfShard = processUnitExecutionMapper\n                                .selectProcessUnitExecutionByPageCondition(pagerQueryReq);\n                        return listOfShard;\n                    });\n                } else {\n                    count = shardingService.countInAllShards(usingSlaveDb, shard -> {\n                        long countOfShard = processUnitExecutionMapper\n                                .countProcessUnitExecutionByPageCondition(pagerQueryReq);\n                        return countOfShard;\n                    });\n                    list = shardingService.findListInAllShards(usingSlaveDb, shard -> {\n                        List<ProcessUnitExecution> listOfShard = processUnitExecutionMapper\n                                .selectProcessUnitExecutionByPageCondition(pagerQueryReq);\n                        return listOfShard;\n                    });\n                }\n                Collections.sort(list, (instance1, instance2) -> {\n                    return instance1.getId().compareTo(instance2.getId());\n                });\n                if (list.size() > pagerQueryReq.getPageSize()) {\n                    list = list.subList(0, pagerQueryReq.getPageSize());\n                }\n                result.setList(ProcessUnitConverter.INSTANCE.executionPoList2EntityList(list));\n                result.setCount(count);\n            }\n\n        }\n        return result;\n    }\n    \n    private List<Object[]> loopUpdateSqlInAllShard(String sql) {\n        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);\n        return shardingService.loopExecuteInAllShards(CurrentShardInfo -> {\n            Integer count = jdbcTemplate.update(sql);\n            return new Object[] {CurrentShardInfo, count};\n        }, list -> {\n            return list;\n        });\n    }\n    \n    private List<Object[]> loopQuerySqlInAllShard(String sql) {\n        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);\n        return shardingService.loopExecuteInAllShards(CurrentShardInfo -> {\n            List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);\n            return new Object[] {CurrentShardInfo, list};\n        }, list -> {\n            return list;\n        });\n    }\n    \n    public boolean isShardingEnabled() {\n        return shardingEnabled;\n    }\n\n    public void setShardingEnabled(boolean shardingEnabled) {\n        this.shardingEnabled = shardingEnabled;\n    }\n\n\n    @Override\n    public ShardingComputeResult computeShardInfo(String unitCode, String bizNo) {\n        return shardingService.computeShardInfo(unitCode, bizNo);\n    }\n    \n    public DataSource getDataSource() {\n        return dataSource;\n    }\n\n    public void setDataSource(DataSource dataSource) {\n        this.dataSource = dataSource;\n    }\n\n    public ProcessUnitInstanceMapper getProcessUnitInstanceMapper() {\n        return processUnitInstanceMapper;\n    }\n\n    public void setProcessUnitInstanceMapper(ProcessUnitInstanceMapper processUnitInstanceMapper) {\n        this.processUnitInstanceMapper = processUnitInstanceMapper;\n    }\n\n    public ProcessUnitExecutionMapper getProcessUnitExecutionMapper() {\n        return processUnitExecutionMapper;\n    }\n\n    public void setProcessUnitExecutionMapper(ProcessUnitExecutionMapper processUnitExecutionMapper) {\n        this.processUnitExecutionMapper = processUnitExecutionMapper;\n    }\n\n    public ProcessUnitConfigCache getLocalCache() {\n        return localCache;\n    }\n\n    public void setLocalCache(ProcessUnitConfigCache localCache) {\n        this.localCache = localCache;\n    }\n\n    public ShardingConfigManager getShardingConfigManager() {\n        return shardingConfigManager;\n    }\n\n    public void setShardingConfigManager(ShardingConfigManager shardingConfigManager) {\n        this.shardingConfigManager = shardingConfigManager;\n    }\n\n    public int getInsertDuplicateIdLoopTimes() {\n        return insertDuplicateIdLoopTimes;\n    }\n\n    public void setInsertDuplicateIdLoopTimes(int insertDuplicateIdLoopTimes) {\n        this.insertDuplicateIdLoopTimes = insertDuplicateIdLoopTimes;\n    }\n\n    public int getInsertDuplicateRetryTimes() {\n        return insertDuplicateRetryTimes;\n    }\n\n    public void setInsertDuplicateRetryTimes(int insertDuplicateRetryTimes) {\n        this.insertDuplicateRetryTimes = insertDuplicateRetryTimes;\n    }\n\n    public ShardingService getShardingService() {\n        return shardingService;\n    }\n\n    public void setShardingService(ShardingService shardingService) {\n        this.shardingService = shardingService;\n    }\n    \n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/sharding/CurrentShardInfo.java",
    "content": "package com.jd.easyflow.sharding;\n\n/**\n * @author liyuliang5\n */\npublic class CurrentShardInfo {\n\n\n    String shard;\n    boolean usingSlaveDb;\n    \n    String db;\n    String tableSuffix = \"\";\n\n    public CurrentShardInfo() {\n\n    }\n\n    public String getDb() {\n        return db;\n    }\n\n    public void setDb(String db) {\n        this.db = db;\n    }\n\n    public String getTableSuffix() {\n        return tableSuffix;\n    }\n\n    public void setTableSuffix(String tableSuffix) {\n        this.tableSuffix = tableSuffix;\n    }\n\n    public String getShard() {\n        return shard;\n    }\n\n    public void setShard(String shard) {\n        this.shard = shard;\n    }\n\n    public boolean isUsingSlaveDb() {\n        return usingSlaveDb;\n    }\n\n    public void setUsingSlaveDb(boolean usingSlaveDb) {\n        this.usingSlaveDb = usingSlaveDb;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/sharding/ShardingHolder.java",
    "content": "package com.jd.easyflow.sharding;\n\n/**\n * \n * @author liyuliang5\n */\npublic class ShardingHolder {\n        \n    private static final ThreadLocal<CurrentShardInfo> shardingInfo = new ThreadLocal<>();\n    \n    public static CurrentShardInfo getCurrentShardInfo() {\n        return shardingInfo.get();\n    }\n    \n    public static void setCurrentShardInfo(CurrentShardInfo info) {\n        if (info == null) {\n            shardingInfo.remove();\n        } else {\n            shardingInfo.set(info);\n        }\n    }\n    \n    public static String getDataSourceKey() {\n        CurrentShardInfo info = getCurrentShardInfo();\n        return info == null ? null : info.getDb();\n    }\n    \n    public static String getTableSuffix() {\n        CurrentShardInfo info = getCurrentShardInfo();\n        return info == null ? null : info.getTableSuffix();\n    }\n    \n\n }\n\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/sharding/config/DataSourceInfo.java",
    "content": "package com.jd.easyflow.sharding.config;\n\nimport java.util.Properties;\n\n/**\n * @author liyuliang5\n */\npublic class DataSourceInfo {\n    \n    private String id;\n\n    private Properties properties;\n\n    public String getId() {\n        return id;\n    }\n\n    public void setId(String id) {\n        this.id = id;\n    }\n\n    public Properties getProperties() {\n        return properties;\n    }\n\n    public void setProperties(Properties properties) {\n        this.properties = properties;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/sharding/config/ShardGroupInfo.java",
    "content": "package com.jd.easyflow.sharding.config;\n\nimport java.util.List;\n\n/**\n * @author liyuliang5\n */\npublic class ShardGroupInfo {\n\n    private List<String> shardList;\n    \n    private Boolean doubleWrite;\n    \n    private Boolean ignoreSlaveError;\n    \n    private List<String> slaveShardList;\n\n    public List<String> getShardList() {\n        return shardList;\n    }\n\n    public void setShardList(List<String> shardList) {\n        this.shardList = shardList;\n    }\n\n    public Boolean getDoubleWrite() {\n        return doubleWrite;\n    }\n\n    public void setDoubleWrite(Boolean doubleWrite) {\n        this.doubleWrite = doubleWrite;\n    }\n\n    public Boolean getIgnoreSlaveError() {\n        return ignoreSlaveError;\n    }\n\n    public void setIgnoreSlaveError(Boolean ignoreSlaveError) {\n        this.ignoreSlaveError = ignoreSlaveError;\n    }\n\n    public List<String> getSlaveShardList() {\n        return slaveShardList;\n    }\n\n    public void setSlaveShardList(List<String> slaveShardList) {\n        this.slaveShardList = slaveShardList;\n    }\n    \n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/sharding/config/ShardInfo.java",
    "content": "package com.jd.easyflow.sharding.config;\n\n/**\n * \n * @author liyuliang5\n */\npublic class ShardInfo {\n    \n    String shard;\n    \n    String db;\n    String slaveDb;\n    String tableSuffix = \"\";\n    \n    boolean master = true;\n\n    public ShardInfo() {\n\n    }\n\n    public String getShard() {\n        return shard;\n    }\n\n    public void setShard(String shard) {\n        this.shard = shard;\n    }\n\n    public String getDb() {\n        return db;\n    }\n\n    public void setDb(String db) {\n        this.db = db;\n    }\n\n    public String getTableSuffix() {\n        return tableSuffix;\n    }\n\n    public void setTableSuffix(String tableSuffix) {\n        this.tableSuffix = tableSuffix;\n    }\n\n    public String getSlaveDb() {\n        return slaveDb;\n    }\n\n    public void setSlaveDb(String slaveDb) {\n        this.slaveDb = slaveDb;\n    }\n\n    public boolean isMaster() {\n        return master;\n    }\n\n    public void setMaster(boolean master) {\n        this.master = master;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/sharding/config/ShardingConfig.java",
    "content": "package com.jd.easyflow.sharding.config;\n\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * @author liyuliang5\n */\npublic class ShardingConfig {\n    \n    private boolean fixDefaultShard;\n\n    private ShardGroupInfo defaultShardGroup;\n    \n    private List<ShardInfo> shardList;\n    \n    private List<DataSourceInfo> dataSourceList;\n        \n    private Map<String, ShardGroupInfo> shardGroupMap;\n    \n    private Map<String, ShardInfo> shardMap;\n\n\n    public boolean isFixDefaultShard() {\n        return fixDefaultShard;\n    }\n\n    public void setFixDefaultShard(boolean fixDefaultShard) {\n        this.fixDefaultShard = fixDefaultShard;\n    }\n\n    public ShardGroupInfo getDefaultShardGroup() {\n        return defaultShardGroup;\n    }\n\n    public void setDefaultShardGroup(ShardGroupInfo defaultShardGroup) {\n        this.defaultShardGroup = defaultShardGroup;\n    }\n\n    public List<DataSourceInfo> getDataSourceList() {\n        return dataSourceList;\n    }\n\n    public void setDataSourceList(List<DataSourceInfo> dataSourceList) {\n        this.dataSourceList = dataSourceList;\n    }\n\n    public Map<String, ShardGroupInfo> getShardGroupMap() {\n        return shardGroupMap;\n    }\n\n    public void setShardGroupMap(Map<String, ShardGroupInfo> shardGroupMap) {\n        this.shardGroupMap = shardGroupMap;\n    }\n\n    public List<ShardInfo> getShardList() {\n        return shardList;\n    }\n\n    public void setShardList(List<ShardInfo> shardList) {\n        this.shardList = shardList;\n    }\n\n    public Map<String, ShardInfo> getShardMap() {\n        return shardMap;\n    }\n\n    public void setShardMap(Map<String, ShardInfo> shardMap) {\n        this.shardMap = shardMap;\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/sharding/config/ShardingConfigManager.java",
    "content": "package com.jd.easyflow.sharding.config;\n\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * \n * @author liyuliang5\n */\npublic interface ShardingConfigManager {\n\n    public boolean isFixDefaultShard();\n\n    public ShardGroupInfo getDefaultShardGroup();\n\n    public List<ShardInfo> getShardList();\n    \n    public Map<String, ShardInfo> getShardMap();\n\n    public List<DataSourceInfo> getDataSourceList();\n\n    public Map<String, ShardGroupInfo> getShardGroupMap();\n    \n    public ShardingConfig getShardingConfig();\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/sharding/config/impl/ShardingConfigManagerFileImpl.java",
    "content": "package com.jd.easyflow.sharding.config.impl;\n\nimport java.io.ByteArrayOutputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.nio.charset.StandardCharsets;\nimport java.util.LinkedHashMap;\nimport java.util.Map;\n\nimport com.jd.easyflow.common.exception.EasyFlowException;\nimport com.jd.easyflow.sharding.config.ShardInfo;\nimport com.jd.easyflow.sharding.config.ShardingConfig;\nimport com.jd.easyflow.utils.json.JSON;\n\n/**\n * @author liyuliang5\n */\npublic class ShardingConfigManagerFileImpl extends ShardingConfigManagerImpl {\n    \n        protected String shardingConfigPath;\n\n        public void init() {\n            if (shardingConfigPath != null && !shardingConfigPath.isEmpty()) {\n                try {\n                    String shardingConfigStr = toString(this.getClass().getResourceAsStream(shardingConfigPath));\n                    ShardingConfig shardingConfig = JSON.parseObject(shardingConfigStr, ShardingConfig.class);\n                    Map<String, ShardInfo> map = new LinkedHashMap<String, ShardInfo>();\n                    if (shardingConfig.getShardList() != null) {\n                        shardingConfig.getShardList().forEach(info -> {\n                            map.put(info.getShard(), info);\n                        });\n                    }\n                    shardingConfig.setShardMap(map);\n                    this.shardingConfig = shardingConfig;\n                } catch (IOException e) {\n                    throw new EasyFlowException(\"sharding config read exception, path:\" + shardingConfigPath, e);\n                }\n            }\n        }\n\n        private static String toString(InputStream inputStream) throws IOException {\n            ByteArrayOutputStream result = new ByteArrayOutputStream();\n            byte[] buffer = new byte[1024];\n            int length;\n            while ((length = inputStream.read(buffer)) != -1) {\n                result.write(buffer, 0, length);\n            }\n            String str = result.toString(StandardCharsets.UTF_8.name());\n            return str;\n        }\n\n        public String getShardingConfigPath() {\n            return shardingConfigPath;\n        }\n\n        public void setShardingConfigPath(String shardingConfigPath) {\n            this.shardingConfigPath = shardingConfigPath;\n        }\n\n        \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/sharding/config/impl/ShardingConfigManagerImpl.java",
    "content": "package com.jd.easyflow.sharding.config.impl;\n\nimport java.util.List;\nimport java.util.Map;\n\nimport com.jd.easyflow.sharding.config.DataSourceInfo;\nimport com.jd.easyflow.sharding.config.ShardGroupInfo;\nimport com.jd.easyflow.sharding.config.ShardInfo;\nimport com.jd.easyflow.sharding.config.ShardingConfig;\nimport com.jd.easyflow.sharding.config.ShardingConfigManager;\n\n/**\n * @author liyuliang5\n */\npublic  class ShardingConfigManagerImpl implements ShardingConfigManager {\n    \n    protected volatile ShardingConfig shardingConfig;\n\n    @Override\n    public boolean isFixDefaultShard() {\n        return shardingConfig.isFixDefaultShard();\n    }\n\n    @Override\n    public ShardGroupInfo getDefaultShardGroup() {\n        return shardingConfig.getDefaultShardGroup();\n    }\n\n    @Override\n    public List<ShardInfo> getShardList() {\n        return shardingConfig.getShardList();\n    }\n    \n    @Override\n    public Map<String, ShardInfo> getShardMap() {\n        return shardingConfig.getShardMap();\n    }\n\n    @Override\n    public List<DataSourceInfo> getDataSourceList() {\n        return shardingConfig.getDataSourceList();\n    }\n\n    @Override\n    public Map<String, ShardGroupInfo> getShardGroupMap() {\n        return shardingConfig.getShardGroupMap();\n    }\n\n    @Override\n    public ShardingConfig getShardingConfig() {\n        return shardingConfig;\n    }\n\n    public void setShardingConfig(ShardingConfig shardingConfig) {\n        this.shardingConfig = shardingConfig;\n    }\n    \n\n\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/sharding/datasource/DataSourceFactory.java",
    "content": "package com.jd.easyflow.sharding.datasource;\n\nimport javax.sql.DataSource;\n\nimport com.jd.easyflow.sharding.config.DataSourceInfo;\n\n/**\n * \n * @author liyuliang5\n */\npublic interface DataSourceFactory {\n\n    DataSource createDataSource(DataSourceInfo info);\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/sharding/datasource/ShardingDataSource.java",
    "content": "package com.jd.easyflow.sharding.datasource;\n\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport javax.sql.DataSource;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;\n\nimport com.jd.easyflow.sharding.ShardingHolder;\nimport com.jd.easyflow.sharding.config.DataSourceInfo;\nimport com.jd.easyflow.sharding.config.ShardingConfigManager;\nimport com.jd.easyflow.sharding.datasource.impl.HikariDataSourceFactory;\n\n/**\n * \n * @author liyuliang5\n */\npublic class ShardingDataSource extends AbstractRoutingDataSource {\n    \n    private static final Logger logger = LoggerFactory.getLogger(ShardingDataSource.class);\n    \n    private boolean warnOnNoLookupKey = true;\n    \n    private ShardingConfigManager shardingConfigManager;\n    \n    private DataSourceFactory dataSourceFactory;\n    \n    public void setShardingTargetDataSources(Map<Object, Object> targetDataSources) {\n        Map<Object, Object> configuredDataSources = getConfiguredDataSources();\n        if (configuredDataSources != null) {\n            if (targetDataSources == null) {\n                targetDataSources = new HashMap<Object, Object>();\n            }\n            targetDataSources.putAll(configuredDataSources);\n        }\n        super.setTargetDataSources(targetDataSources);\n    }\n    \n    protected Map<Object, Object> getConfiguredDataSources() {\n        if (shardingConfigManager == null) {\n            return null;\n        }\n        List<DataSourceInfo> dataSourceList = shardingConfigManager.getDataSourceList();\n        if (dataSourceList == null) {\n            return null;\n        }\n        if (dataSourceFactory == null) {\n            dataSourceFactory = new HikariDataSourceFactory();\n        }\n        Map<Object, Object> dataSources = new HashMap<Object, Object>();\n        for (DataSourceInfo info : dataSourceList) {\n            DataSource dataSource = dataSourceFactory.createDataSource(info);\n            dataSources.put(info.getId(), dataSource);\n        }\n        return dataSources;\n    }\n    \n        \n\n    @Override\n    protected Object determineCurrentLookupKey() {\n        String dataSourceKey = ShardingHolder.getDataSourceKey();\n        if (dataSourceKey == null && warnOnNoLookupKey) {\n            logger.warn(\"process unit dataSourceKey is null\");\n        }\n        return dataSourceKey;\n    }\n\n    public DataSource determineTargetDataSourceInner() {\n        return super.determineTargetDataSource();\n    }\n\n    public boolean isWarnOnNoLookupKey() {\n        return warnOnNoLookupKey;\n    }\n\n\n    public void setWarnOnNoLookupKey(boolean warnOnNoLookupKey) {\n        this.warnOnNoLookupKey = warnOnNoLookupKey;\n    }\n\n    public ShardingConfigManager getShardingConfigManager() {\n        return shardingConfigManager;\n    }\n\n    public void setShardingConfigManager(ShardingConfigManager shardingConfigManager) {\n        this.shardingConfigManager = shardingConfigManager;\n    }\n\n    public DataSourceFactory getDataSourceFactory() {\n        return dataSourceFactory;\n    }\n\n    public void setDataSourceFactory(DataSourceFactory dataSourceFactory) {\n        this.dataSourceFactory = dataSourceFactory;\n    }\n    \n    \n    \n}\n\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/sharding/datasource/impl/HikariDataSourceFactory.java",
    "content": "package com.jd.easyflow.sharding.datasource.impl;\n\nimport javax.sql.DataSource;\n\nimport com.jd.easyflow.sharding.config.DataSourceInfo;\nimport com.jd.easyflow.sharding.datasource.DataSourceFactory;\nimport com.zaxxer.hikari.HikariConfig;\nimport com.zaxxer.hikari.HikariDataSource;\n\n/**\n * @author liyuliang5\n */\npublic class HikariDataSourceFactory implements DataSourceFactory {\n\n    @Override\n    public DataSource createDataSource(DataSourceInfo info) {\n        HikariConfig config = new HikariConfig(info.getProperties());\n        HikariDataSource dataSource = new HikariDataSource(config);\n        return dataSource;\n    }\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/sharding/mybatis/ShardingNotSupportedMapper.java",
    "content": "package com.jd.easyflow.sharding.mybatis;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Target(ElementType.TYPE)\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface ShardingNotSupportedMapper {\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/sharding/mybatis/ShardingSupportedMapper.java",
    "content": "package com.jd.easyflow.sharding.mybatis;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * @author liyuliang5\n */\n@Target(ElementType.TYPE)\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface ShardingSupportedMapper {\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/sharding/service/ExportRequestShardComputer.java",
    "content": "package com.jd.easyflow.sharding.service;\n\nimport java.util.function.Consumer;\n\nimport com.jd.easyflow.common.adapter.export.dto.ExportRequest;\nimport com.jd.easyflow.common.exception.EasyFlowException;\nimport com.jd.easyflow.sharding.CurrentShardInfo;\nimport com.jd.easyflow.sharding.config.ShardingConfig;\nimport com.jd.easyflow.sharding.config.ShardingConfigManager;\n\n/**\n * @author liyuliang5\n */\npublic class ExportRequestShardComputer {\n    \n    private String groupKey = \"_group\";\n    \n    private String bizNoKey = \"_bizNo\";\n    \n    private ShardingService shardingService;\n    \n    private ShardingConfigManager shardingConfigManager;\n    \n    private boolean shardingEnabled;\n    \n    public CurrentShardInfo computeExportRequestShard(ExportRequest req, Consumer<ShardingData> consumer) {\n        if (! shardingEnabled) {\n            return null;\n        }\n        ShardingConfig shardingConfig = shardingConfigManager.getShardingConfig();\n        if (shardingConfig.getShardList().size() == 1) {\n            Boolean usingSlave = getExt(\"_usingSlave\", req);\n            return shardingService.buildCurrentShardInfo(shardingConfigManager.getShardList().get(0).getShard(), Boolean.TRUE.equals(usingSlave));\n        }\n        if (shardingConfig.isFixDefaultShard() && shardingConfig.getDefaultShardGroup().getShardList().size() == 1) {\n            Boolean usingSlave = getExt(\"_usingSlave\", req);\n            return shardingService.buildCurrentShardInfo(shardingConfig.getDefaultShardGroup().getShardList().get(0), Boolean.TRUE.equals(usingSlave));\n        }\n        ShardingData shardingData = extractShardingData(req);\n        String shard = shardingService.getShard(shardingData);\n        if (shard == null && consumer != null) {\n            consumer.accept(shardingData);\n            shard = shardingService.getShard(shardingData);\n        }\n        if (shard == null) {\n            return null;\n        }\n        CurrentShardInfo info = shardingService.buildCurrentShardInfo(shard, Boolean.TRUE.equals(shardingData.getUsingSlave()));\n        return info;\n    }\n    \n\n    public ShardingData extractShardingData(ExportRequest req) {\n        String shard = getExt(\"_shard\", req);\n        Boolean usingSlave = getExt(\"_usingSlave\", req);\n        String processType = getExt(groupKey, req);\n        String bizNo = getExt(bizNoKey, req);\n        ShardingData data = new ShardingData();\n        data.setShard(shard);\n        data.setUsingSlave(usingSlave);\n        data.setGroup(processType);\n        data.setBizNo(bizNo);\n        return data;\n    }\n\n    \n    private static <T> T getExt(String key, ExportRequest req) {\n        if (req == null) {\n            return null;\n        }\n        if (req.getExt() == null) {\n            return null;\n        }\n        return (T) req.getExt().get(key);\n    }\n\n\n    public ShardingService getShardingService() {\n        return shardingService;\n    }\n\n\n    public void setShardingService(ShardingService shardingService) {\n        this.shardingService = shardingService;\n    }\n\n\n    public String getGroupKey() {\n        return groupKey;\n    }\n\n\n    public void setGroupKey(String groupKey) {\n        this.groupKey = groupKey;\n    }\n\n\n    public String getBizNoKey() {\n        return bizNoKey;\n    }\n\n\n    public void setBizNoKey(String bizNoKey) {\n        this.bizNoKey = bizNoKey;\n    }\n\n\n    public ShardingConfigManager getShardingConfigManager() {\n        return shardingConfigManager;\n    }\n\n\n    public void setShardingConfigManager(ShardingConfigManager shardingConfigManager) {\n        this.shardingConfigManager = shardingConfigManager;\n    }\n\n\n    public boolean isShardingEnabled() {\n        return shardingEnabled;\n    }\n\n\n    public void setShardingEnabled(boolean shardingEnabled) {\n        this.shardingEnabled = shardingEnabled;\n    }\n    \n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/sharding/service/ShardingComputeResult.java",
    "content": "package com.jd.easyflow.sharding.service;\n\nimport java.io.Serializable;\n\npublic class ShardingComputeResult implements Serializable {\n\n    private String shard;\n\n    private String db;\n\n    private String tableSuffix;\n\n    private String slaveShard;\n\n    private String slaveDb;\n\n    private String slaveTableSuffix;\n\n    public String getShard() {\n        return shard;\n    }\n\n    public void setShard(String shard) {\n        this.shard = shard;\n    }\n\n    public String getDb() {\n        return db;\n    }\n\n    public void setDb(String db) {\n        this.db = db;\n    }\n\n    public String getTableSuffix() {\n        return tableSuffix;\n    }\n\n    public void setTableSuffix(String tableSuffix) {\n        this.tableSuffix = tableSuffix;\n    }\n\n    public String getSlaveDb() {\n        return slaveDb;\n    }\n\n    public void setSlaveDb(String slaveDb) {\n        this.slaveDb = slaveDb;\n    }\n\n    public String getSlaveTableSuffix() {\n        return slaveTableSuffix;\n    }\n\n    public void setSlaveTableSuffix(String slaveTableSuffix) {\n        this.slaveTableSuffix = slaveTableSuffix;\n    }\n\n    public String getSlaveShard() {\n        return slaveShard;\n    }\n\n    public void setSlaveShard(String slaveShard) {\n        this.slaveShard = slaveShard;\n    }\n\n    @Override\n    public String toString() {\n        return \"ShardingInfoVO [shard=\" + shard + \", db=\" + db + \", tableSuffix=\" + tableSuffix + \", slaveShard=\"\n                + slaveShard + \", slaveDb=\" + slaveDb + \", slaveTableSuffix=\" + slaveTableSuffix + \"]\";\n    }\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/sharding/service/ShardingData.java",
    "content": "package com.jd.easyflow.sharding.service;\n\n/**\n * @author liyuliang5\n */\npublic class ShardingData {\n    \n    private String shard;\n    \n    private Boolean usingSlave;\n    \n    private String group;\n    \n    private String bizNo;\n\n    public String getShard() {\n        return shard;\n    }\n\n    public void setShard(String shard) {\n        this.shard = shard;\n    }\n\n\n    public Boolean getUsingSlave() {\n        return usingSlave;\n    }\n\n    public void setUsingSlave(Boolean usingSlave) {\n        this.usingSlave = usingSlave;\n    }\n\n    public String getGroup() {\n        return group;\n    }\n\n    public void setGroup(String group) {\n        this.group = group;\n    }\n\n    public String getBizNo() {\n        return bizNo;\n    }\n\n    public void setBizNo(String bizNo) {\n        this.bizNo = bizNo;\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/sharding/service/ShardingDataQueryer.java",
    "content": "package com.jd.easyflow.sharding.service;\n\n/**\n * @author liyuliang5\n */\npublic abstract class ShardingDataQueryer {\n    \n    protected ShardingService shardingService;\n\n    public ShardingService getShardingService() {\n        return shardingService;\n    }\n\n    public void setShardingService(ShardingService shardingService) {\n        this.shardingService = shardingService;\n    }\n    \n    \n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/sharding/service/ShardingService.java",
    "content": "package com.jd.easyflow.sharding.service;\n\nimport java.util.List;\nimport java.util.function.Function;\nimport java.util.function.Supplier;\n\nimport com.jd.easyflow.sharding.CurrentShardInfo;\nimport com.jd.easyflow.sharding.config.ShardGroupInfo;\nimport com.jd.easyflow.sharding.config.ShardInfo;\n\n/**\n * @author liyuliang5\n */\npublic interface ShardingService {\n    \n    public static final int OP_TYPE_READ = 1;\n    public static final int OP_TYPE_WRITE = 2;\n    \n    public <T> T execute(int opType, String group, String bizNo, Function<CurrentShardInfo, T> function);\n    public <T> T execute(int opType, String group, String bizNo, boolean usingSlaveDb, Function<CurrentShardInfo, T> function);\n    \n    // == get One ==\n    \n    public <T> T getOneInShardsOfGroup(String group, Function<CurrentShardInfo, T> function);\n    \n    public <T> T getOneInShardsOfGroup(String group, boolean usingSlaveDb, Function<CurrentShardInfo, T> function);\n    \n    public <T> T  getOneInAllShards(Function<CurrentShardInfo, T> function);\n    \n    public <T> T getOneInAllShards(boolean usingSlaveDb, Function<CurrentShardInfo, T> function);\n\n  // == find list ==\n    \n    public List findListInAllShards(Function<CurrentShardInfo, List> function);\n    \n    public List findListInAllShards(boolean usingSlaveDb, Function<CurrentShardInfo, List> function);\n    \n    public List findListInShardsOfGroup(String group, boolean usingSlaveDb,  Function<CurrentShardInfo, List> function);\n    \n    public List findListLoopShardsOfGroup(String group, int maxCount, boolean usingSlaveDb, Function<CurrentShardInfo, List> function);\n    \n    public List findListLoopAllShards(int maxCount, Function<CurrentShardInfo, List> function);\n    \n    public List findListLoopAllShards(int maxCount, boolean usingSlaveDb, Function<CurrentShardInfo, List> function);\n    \n    // == count ==\n    \n    public long countInAllShards(boolean usingSlaveDb, Function<CurrentShardInfo, Long> function);\n    \n    public long countInShardsOfGroup(String group, boolean usingSlaveDb, Function<CurrentShardInfo, Long> function);\n    \n    // == loop execute ==\n    \n    public <R, SR> R loopExecuteInAllShards(Function<CurrentShardInfo, SR> function, Function<List<SR>, R> resultCollector);\n    \n    // == parallel execute ==\n    public <R, SR> R parallelExecute(String group, Function<CurrentShardInfo, SR> shardFunction,\n            Function<List<SR>, R> resultCollector);\n    \n    public <R, SR> R parallelExecute(String group, boolean usingSlaveDb, Function<CurrentShardInfo, SR> shardFunction,\n            Function<List<SR>, R> resultCollector);\n    \n    \n    public <R, SR> R parallelExecuteInGroup(String group, boolean usingSlaveDb, Function<CurrentShardInfo, SR> shardFunction,\n            Function<List<SR>, R> resultCollector) ;\n    \n    public <R, SR> R parallelExecuteInAllShard(boolean usingSlaveDb, Function<CurrentShardInfo, SR> shardFunction,\n            Function<List<SR>, R> resultCollector);\n    \n    \n    // == execute in shard ==\n    public <T> T executeInDefaultShard(Function<CurrentShardInfo, T> function);\n    \n    public <T> T executeInShard(String shard, Function<CurrentShardInfo, T> function);\n    \n    public <T> T executeInShard(String shard, boolean usingSlaveDb, Function<CurrentShardInfo, T> function);\n    \n    public <T> T executeInShard(ShardInfo info, boolean usingSlaveDb, Function<CurrentShardInfo, T> function);\n    \n    public <T>T executeInShard(Supplier<CurrentShardInfo> shardComputer, Function<CurrentShardInfo, T> function);\n    \n    public <T>T executeInShard(Supplier<CurrentShardInfo> shardComputer, Supplier<T> noShardFunction, Function<CurrentShardInfo, T> function);\n\n    \n    public <T> T executeInShard(CurrentShardInfo currentShardingInfo, Function<CurrentShardInfo, T> function);\n    \n    //== shard compute ==\n    \n    public String computeShardOfGroupAndBizNo(String group, String bizNo);\n    \n    public ShardingComputeResult computeShardInfo(String group, String bizNo);\n    \n    public String getShard(ShardingData shardingData);\n    \n    public String computeSlaveShard(String group, String bizNo, ShardGroupInfo shardGroup);\n \n    public List<String> getShardListOfGroup(String group);\n   \n    public CurrentShardInfo buildCurrentShardInfo(String shard, boolean usingSlaveDb);\n    \n    // == other ==\n    public ShardGroupInfo getGroupShardConfig(String group);\n    \n    public boolean isShardingEnabled();\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/sharding/service/impl/ShardingServiceImpl.java",
    "content": "package com.jd.easyflow.sharding.service.impl;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collection;\nimport java.util.Iterator;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.concurrent.CompletableFuture;\nimport java.util.concurrent.ExecutionException;\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.TimeUnit;\nimport java.util.concurrent.TimeoutException;\nimport java.util.function.Function;\nimport java.util.function.Supplier;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.common.exception.EasyFlowException;\nimport com.jd.easyflow.common.util.AssertUtils;\nimport com.jd.easyflow.sharding.CurrentShardInfo;\nimport com.jd.easyflow.sharding.ShardingHolder;\nimport com.jd.easyflow.sharding.config.ShardGroupInfo;\nimport com.jd.easyflow.sharding.config.ShardInfo;\nimport com.jd.easyflow.sharding.config.ShardingConfigManager;\nimport com.jd.easyflow.sharding.service.ShardingComputeResult;\nimport com.jd.easyflow.sharding.service.ShardingData;\nimport com.jd.easyflow.sharding.service.ShardingService;\n\n/**\n * @author liyuliang5\n */\npublic class ShardingServiceImpl implements ShardingService  {\n\n    private static final Logger logger = LoggerFactory.getLogger(ShardingServiceImpl.class);\n    \n    protected boolean shardingEnabled;\n    \n    protected boolean parallelQuery = true;\n    \n    protected int parallelQueryMaxThreadCount = 10;\n    \n    protected ExecutorService parallelQueryThreadPool = Executors.newCachedThreadPool();\n    \n    protected int parallelTimeoutMillis = 30000;\n    \n    protected ShardingConfigManager shardingConfigManager;\n\n    public <T> T execute(int opType, String group, String bizNo, Function<CurrentShardInfo, T> function) {\n        return execute(opType, group, bizNo, false, function);\n    }\n    public <T> T execute(int opType, String group, String bizNo, boolean usingSlaveDb, Function<CurrentShardInfo, T> function) {\n        if (! shardingEnabled) {\n            return function.apply(null);\n        }\n        AssertUtils.isNotNull(group);\n        AssertUtils.isNotNull(bizNo);\n        ShardGroupInfo shardGroup = getGroupShardConfig(group);\n        // master db\n        String shard = computeShard(group, bizNo, shardGroup);\n        if (shard == null) {\n            throw new EasyFlowException(\"group:\" + group + \" bizNo:\" + bizNo + \" shard is null\");\n        }\n        T result = executeInShard(shard, usingSlaveDb, function);\n\n        // slave db on double write\n        if (OP_TYPE_WRITE == opType) {\n            boolean doubleWrite = Boolean.TRUE.equals(shardGroup.getDoubleWrite());\n            if (doubleWrite) {\n                boolean ignoreSlaveError = Boolean.TRUE\n                        .equals(shardGroup.getIgnoreSlaveError());\n                String slaveShard = computeSlaveShard(group, bizNo, shardGroup);\n                if (slaveShard == null) {\n                    logger.warn(\"group:{} bizNo:{} slave shard not config\", group, bizNo);\n                } else {\n                    try {\n                        executeInShard(slaveShard, usingSlaveDb, function);\n                    } catch (Throwable t) {\n                        logger.error(\"group:\" + group + \" bizNo:\" + bizNo + \" write slave exception\", t);\n                        if (!ignoreSlaveError) {\n                            throw t;\n                        }\n                    }\n                }\n            }\n        }\n        return result;\n    }\n    \n    // == get One ==\n    \n    public <T> T getOneInShardsOfGroup(String group, Function<CurrentShardInfo, T> function) {\n        return getOneInShardsOfGroup(group, false, function);\n    }\n    \n    public <T> T getOneInShardsOfGroup(String group, boolean usingSlaveDb, Function<CurrentShardInfo, T> function) {\n        if (! shardingEnabled) {\n            return function.apply(null);\n        }\n        List<String> shardList = this.getShardListOfGroup(group);\n        return parallelExecute(shardList, usingSlaveDb, shardInfo -> {\n            T t = executeInShard(shardInfo, function);\n            if (t != null) {\n                if (logger.isDebugEnabled()) {\n                    logger.debug(\"found result in shard {}\", shardInfo);\n                }\n            }\n            return t;\n        }, shardingResultList -> {\n            T result = null;\n            for (T shardResult : shardingResultList) {\n                if (shardResult != null) {\n                    if (result != null) {\n                        throw new EasyFlowException(\"result count more than 2,\" + shardResult + \",\" + result);\n                    } else {\n                        result = shardResult;\n                    }\n                }\n            }\n            return result;\n        });\n    }\n    \n    public <T> T  getOneInAllShards(Function<CurrentShardInfo, T> function) {\n        return getOneInAllShards(false, function);\n    }\n    \n    public <T> T getOneInAllShards(boolean usingSlaveDb, Function<CurrentShardInfo, T> function) {\n        if (! shardingEnabled) {\n            return function.apply(null);\n        }\n        Collection<ShardInfo> shardList = shardingConfigManager.getShardMap().values();\n        Collection<ShardInfo> masterShardList = filterMasterShard(shardList);\n        return parallelExecuteInShardList(masterShardList, usingSlaveDb, shardingInfo -> {\n            T t = executeInShard(shardingInfo, function);\n            if (t != null) {\n                if (logger.isDebugEnabled()) {\n                    logger.debug(\"found result in shard {}\", shardingInfo);\n                }\n            }\n            return t;\n        }, shardingResultList -> {\n            T result = null;\n            for (T shardResult : shardingResultList) {\n                if (shardResult != null) {\n                    if (result != null) {\n                        throw new EasyFlowException(\"result count more than 2,\" + shardResult + \",\" + result);\n                    } else {\n                        result = shardResult;\n                    }\n                }\n            }\n            return result;\n        });\n    }\n\n  // == find list ==\n    \n    public List findListInAllShards(Function<CurrentShardInfo, List> function) {\n        return findListInAllShards(false, function);\n    }\n    \n    public List findListInAllShards(boolean usingSlaveDb, Function<CurrentShardInfo, List> function) {\n        if (! shardingEnabled) {\n            return function.apply(null);\n        }\n        Collection<ShardInfo> shardList = shardingConfigManager.getShardList();\n        Collection<ShardInfo> masterShardList = filterMasterShard(shardList);\n        return parallelExecuteInShardList(masterShardList,usingSlaveDb, shardingInfo -> {\n            List listOfShard = executeInShard(shardingInfo, function);\n            return listOfShard;\n        }, shardingResultList -> {\n            List result = new ArrayList<>();\n            for (List shardResult : shardingResultList) {\n                result.addAll(shardResult);\n            }\n            return result;\n        });\n\n    }\n    \n\n    public List findListInShardsOfGroup(String group, boolean usingSlaveDb,\n            Function<CurrentShardInfo, List> function) {\n        if (! shardingEnabled) {\n            return function.apply(null);\n        }\n        List<String> shardList = getShardListOfGroup(group);\n        return parallelExecute(shardList, usingSlaveDb, shardingInfo -> {\n            List listOfShard = executeInShard(shardingInfo, function);\n            return listOfShard;\n        }, shardResultList -> {\n            List result = new ArrayList<>();\n            for (List shardResult : shardResultList) {\n                result.addAll(shardResult);\n            }\n            return result;\n        });\n    }\n    \n    public List findListLoopShardsOfGroup(String group, int maxCount, boolean usingSlaveDb, Function<CurrentShardInfo, List> function) {\n        if (! shardingEnabled) {\n            return function.apply(null);\n        }\n        List<String> shardList = getShardListOfGroup(group);\n        Map<String, ShardInfo> shardingInfoMap = shardingConfigManager.getShardMap();\n        List result = new ArrayList();\n        for (String shard : shardList) {\n            ShardInfo info = shardingInfoMap.get(shard);\n            if (! info.isMaster()) {\n                continue;\n            }\n                CurrentShardInfo currentShardingInfo = buildCurrentShardInfo(info, usingSlaveDb);\n                List list = executeInShard(currentShardingInfo, function);\n                if (list != null && list.size() > 0) {\n                    result.addAll(list);\n                    if (result.size() >= maxCount) {\n                        return result;\n                    }\n                }\n        }\n        return result;\n    }\n    \n    public List findListLoopAllShards(int maxCount, Function<CurrentShardInfo, List> function) {\n        return findListLoopAllShards(maxCount, false, function);\n    }\n    \n    public List findListLoopAllShards(int maxCount, boolean usingSlaveDb, Function<CurrentShardInfo, List> function) {\n        if (! shardingEnabled) {\n            return function.apply(null);\n        }\n        List result = new ArrayList();\n        for (ShardInfo info : shardingConfigManager.getShardMap().values()) {\n            if (!info.isMaster()) {\n                continue;\n            }\n            CurrentShardInfo currentShardInfo = buildCurrentShardInfo(info, usingSlaveDb);\n            List list = executeInShard(currentShardInfo, function);\n            if (list != null && list.size() > 0) {\n                result.addAll(list);\n                if (result.size() >= maxCount) {\n                    return result;\n                }\n            }\n        }\n        return result;\n    }\n    \n    // == count ==\n    \n    public long countInAllShards(boolean usingSlaveDb, Function<CurrentShardInfo, Long> function) {\n        if (! shardingEnabled) {\n            return function.apply(null);\n        }\n        Collection<ShardInfo> shardList = shardingConfigManager.getShardList();\n        Collection<ShardInfo> masterShardList = filterMasterShard(shardList);\n        return parallelExecuteInShardList(masterShardList, usingSlaveDb, shardingInfo -> {\n            Long countOfShard = executeInShard(shardingInfo, function);\n            return countOfShard;\n        }, shardingResultList -> {\n            long count = 0;\n            for (Long countInShard : shardingResultList) {\n                count += countInShard;\n            }\n            return count;\n        });\n    }\n    \n    \n    \n    public long countInShardsOfGroup(String group, boolean usingSlaveDb,\n            Function<CurrentShardInfo, Long> function) {\n        if (! shardingEnabled) {\n            return function.apply(null);\n        }\n        List<String> shardList = getShardListOfGroup(group);\n        return parallelExecute(shardList, usingSlaveDb, shardingInfo -> {\n            Long countInShard = executeInShard(shardingInfo, function);\n            return countInShard;\n        }, shardResultList -> {\n            long count = 0;\n            for (Long countInShard : shardResultList) {\n                count += countInShard;\n            }\n            return count;\n        });\n    }\n    \n    // == loop execute ==\n    \n    public <R, SR> R loopExecuteInAllShards(Function<CurrentShardInfo, SR> function, Function<List<SR>, R> resultCollector) {\n        if (! shardingEnabled) {\n            return resultCollector.apply(Arrays.asList(function.apply(null)));\n        }\n        Collection<ShardInfo> shardingList = shardingConfigManager.getShardList();\n        return loopExecuteInShardList(shardingList, shardInfo -> {\n            CurrentShardInfo currentShardInfo = buildCurrentShardInfo(shardInfo, false);\n            SR shardingResult = function.apply(currentShardInfo);\n            return shardingResult;\n        }, resultCollector);\n    }\n    \n    private <R, SR> R loopExecuteInShardList(Collection<ShardInfo> shardInfoList,\n            Function<ShardInfo, SR> shardFunction, Function<List<SR>, R> resultCollector) {\n        if (! shardingEnabled) {\n            return resultCollector.apply(Arrays.asList(shardFunction.apply(null)));\n        }\n        List<SR> resultList = new ArrayList<SR>();\n        for (ShardInfo info : shardInfoList) {\n            SR shardResult = shardFunction.apply(info);\n            resultList.add(shardResult);\n        }\n        R result = resultCollector.apply(resultList);\n        return result;\n    }\n\n    // == parallel execute ==\n    \n    public <R, SR> R parallelExecute(String group, Function<CurrentShardInfo, SR> shardFunction,\n            Function<List<SR>, R> resultCollector) {\n        return this.parallelExecute(group, false, shardFunction, resultCollector);\n    }\n    \n    public <R, SR> R parallelExecute(String group, boolean usingSlaveDb, Function<CurrentShardInfo, SR> shardFunction,\n            Function<List<SR>, R> resultCollector) {\n        if (! shardingEnabled) {\n            return resultCollector.apply(Arrays.asList(shardFunction.apply(null)));\n        }\n        if (group == null) {\n            return parallelExecuteInAllShard(usingSlaveDb, shardFunction, resultCollector);\n        } else {\n            return parallelExecuteInGroup(group, usingSlaveDb, shardFunction, resultCollector);\n        }\n    }\n    \n    \n    public <R, SR> R parallelExecuteInGroup(String group, boolean usingSlaveDb, Function<CurrentShardInfo, SR> shardFunction,\n            Function<List<SR>, R> resultCollector) {\n        if (! shardingEnabled) {\n            return resultCollector.apply(Arrays.asList(shardFunction.apply(null)));\n        }\n            List<String> shardList = shardingConfigManager.getShardGroupMap().get(group).getShardList();\n            return parallelExecute(shardList, usingSlaveDb, shardFunction, resultCollector);\n    }\n    \n    public <R, SR> R parallelExecuteInAllShard(boolean usingSlaveDb, Function<CurrentShardInfo, SR> shardFunction,\n            Function<List<SR>, R> resultCollector) {\n        if (! shardingEnabled) {\n            return resultCollector.apply(Arrays.asList(shardFunction.apply(null)));\n        }\n            List<ShardInfo> shardList = shardingConfigManager.getShardList();\n            return parallelExecuteInShardList(shardList, usingSlaveDb, shardFunction, resultCollector);\n    }\n    \n    private <R, SR> R parallelExecute(List<String> shardList, boolean usingSlaveDb, Function<CurrentShardInfo, SR> shardFunction,\n            Function<List<SR>, R> resultCollector) {\n        if (! shardingEnabled) {\n            return resultCollector.apply(Arrays.asList(shardFunction.apply(null)));\n        }\n        R result = null;\n        List<SR> shardResultList = new ArrayList<SR>();\n        Map<String, ShardInfo> shardingInfoMap = shardingConfigManager.getShardMap();\n        if (!parallelQuery || shardList.size() <= 1) {\n            for (String shard : shardList) {\n                ShardInfo shardingInfo = shardingInfoMap.get(shard);\n                \n                SR shardResult = executeInShard(shardingInfo, usingSlaveDb, currentShardingInfo -> shardFunction.apply(currentShardingInfo));\n                shardResultList.add(shardResult);\n            }\n        } else {\n            int executedShardCount = 0;\n            int totalShardCount = shardList.size();\n            while (executedShardCount < totalShardCount) {\n                List<CompletableFuture<SR>> futureList = new ArrayList<CompletableFuture<SR>>();\n                for (int i = 0; i < parallelQueryMaxThreadCount; i++) {\n                    ShardInfo shardingInfo = shardingConfigManager.getShardMap().get(shardList.get(executedShardCount));\n                    CompletableFuture<SR> future = CompletableFuture.supplyAsync(() -> {\n                        SR shardResult = executeInShard(shardingInfo, usingSlaveDb, currentShardInfo -> {\n                            return shardFunction.apply(currentShardInfo);\n                        });\n                        return shardResult;\n                    }, parallelQueryThreadPool);\n                    futureList.add(future);\n                    executedShardCount++;\n                    if (executedShardCount == totalShardCount) {\n                        break;\n                    }\n                }\n                for (CompletableFuture<SR> future : futureList) {\n                    try {\n                        SR shardResult = future.get(parallelTimeoutMillis, TimeUnit.MILLISECONDS);\n                        shardResultList.add(shardResult);\n                    } catch (InterruptedException | ExecutionException | TimeoutException e) {\n                        throw new EasyFlowException(\"multiple thread shard query exception\", e);\n                    }\n                }\n            }\n        }\n        result = resultCollector.apply(shardResultList);\n\n        return result;\n    }\n    \n    private <R, SR> R parallelExecuteInShardList(Collection<ShardInfo> shardList, boolean usingSlaveDb,\n            Function<CurrentShardInfo, SR> shardFunction, Function<List<SR>, R> resultCollector) {\n        if (! shardingEnabled) {\n            return resultCollector.apply(Arrays.asList(shardFunction.apply(null)));\n        }\n        R result = null;\n        List<SR> shardResultList = new ArrayList<SR>();\n        if (!parallelQuery || shardList.size() <= 1) {\n            for (ShardInfo shard : shardList) {\n                SR shardResult = executeInShard(shard, usingSlaveDb, currentShardingInfo -> shardFunction.apply(currentShardingInfo));\n                shardResultList.add(shardResult);\n            }\n        } else {\n            int executedShardCount = 0;\n            Iterator<ShardInfo> iterator = shardList.iterator();\n            int totalShardCount = shardList.size();\n            while (executedShardCount < totalShardCount) {\n                List<CompletableFuture<SR>> futureList = new ArrayList<CompletableFuture<SR>>();\n                for (int i = 0; i < parallelQueryMaxThreadCount; i++) {\n                    ShardInfo shardingInfo = iterator.next();\n                    CompletableFuture<SR> future = CompletableFuture.supplyAsync(() -> {\n                        SR shardResult = executeInShard(shardingInfo, usingSlaveDb, currentShardInfo -> {\n                            return shardFunction.apply(currentShardInfo);\n                        });\n                        return shardResult;\n                    }, parallelQueryThreadPool);\n                    futureList.add(future);\n                    executedShardCount++;\n                    if (executedShardCount == totalShardCount) {\n                        break;\n                    }\n                }\n                for (CompletableFuture<SR> future : futureList) {\n                    try {\n                        SR shardResult = future.get(parallelTimeoutMillis, TimeUnit.MILLISECONDS);\n                        shardResultList.add(shardResult);\n                    } catch (InterruptedException | ExecutionException | TimeoutException e) {\n                        throw new EasyFlowException(\"multiple thread shard query exception\", e);\n                    }\n                }\n            }\n        }\n        result = resultCollector.apply(shardResultList);\n\n        return result;\n    }\n    \n    \n    \n    // == execute in shard ==\n    public <T> T executeInDefaultShard(Function<CurrentShardInfo, T> function) {\n        if (! shardingEnabled) {\n            return function.apply(null);\n        }\n        ShardGroupInfo shardGroup = shardingConfigManager.getDefaultShardGroup();\n        if (shardGroup == null) {\n            throw new EasyFlowException(\"default shard group is null\");\n        }        \n        if (shardGroup.getShardList().size() != 1) {\n            throw new EasyFlowException(\"default shard group size is not 1\");\n        }\n        ShardInfo info = shardingConfigManager.getShardMap().get(shardGroup.getShardList().get(0));\n        if (info == null) {\n            throw new EasyFlowException(\"default shard:\" + shardGroup.getShardList().get(0) + \" shard info is null\");\n        }\n        return executeInShard(info, false, function);\n    }\n    \n    @Override\n    public <T> T executeInShard(String shard, Function<CurrentShardInfo, T> function) {\n        return executeInShard(shard, false, function);\n    }\n    public <T> T executeInShard(String shard, boolean usingSlaveDb, Function<CurrentShardInfo, T> function) {\n        if (! shardingEnabled) {\n            return function.apply(null);\n        }       \n        ShardInfo info = shardingConfigManager.getShardMap().get(shard);\n        if (info == null) {\n            throw new EasyFlowException(\"shard:\" + shard+ \" shard info is null\");\n        }\n        return executeInShard(info, usingSlaveDb, function);\n    }\n    \n    public <T> T executeInShard(ShardInfo info, boolean usingSlaveDb, Function<CurrentShardInfo, T> function) {\n        if (! shardingEnabled) {\n            return function.apply(null);\n        }\n        if (info == null) {\n            throw new EasyFlowException(\" shard info is null\");\n        }\n        CurrentShardInfo old = ShardingHolder.getCurrentShardInfo();\n        try {\n            CurrentShardInfo currentShardingInfo = buildCurrentShardInfo(info, usingSlaveDb);\n            ShardingHolder.setCurrentShardInfo(currentShardingInfo);\n            T result = function.apply(currentShardingInfo);\n            return result;\n        } finally {\n            ShardingHolder.setCurrentShardInfo(old);\n        }\n    }\n    \n    public <T>T executeInShard(Supplier<CurrentShardInfo> shardComputer, Function<CurrentShardInfo, T> function) {\n        return executeInShard(shardComputer, null, function);\n    }\n    \n    public <T>T executeInShard(Supplier<CurrentShardInfo> shardComputer, Supplier<T> noShardFunction, Function<CurrentShardInfo, T> function) {\n        if (! shardingEnabled) {\n            return function.apply(null);\n        }\n        CurrentShardInfo info = shardComputer.get();\n        if (info == null) {\n            if (noShardFunction == null) {\n                throw new EasyFlowException(\" shard info is null\");\n            } else {\n                return noShardFunction.get();\n            }\n        }\n        CurrentShardInfo old = ShardingHolder.getCurrentShardInfo();\n        try {\n            ShardingHolder.setCurrentShardInfo(info);\n            return function.apply(info);\n        } finally {\n            ShardingHolder.setCurrentShardInfo(old);\n        }\n    }\n    \n    \n    public <T> T executeInShard(CurrentShardInfo currentShardingInfo, Function<CurrentShardInfo, T> function) {\n        if (! shardingEnabled) {\n            return function.apply(null);\n        }\n        if (currentShardingInfo == null) {\n            throw new EasyFlowException(\" shard info is null\");\n        }\n        CurrentShardInfo old = ShardingHolder.getCurrentShardInfo();\n        try {\n            ShardingHolder.setCurrentShardInfo(currentShardingInfo);\n            T result = function.apply(currentShardingInfo);\n            return result;\n        } finally {\n            ShardingHolder.setCurrentShardInfo(old);\n        }\n    }\n    \n    \n    //== shard compute ==\n    \n    public String computeShardOfGroupAndBizNo(String group, String bizNo) {\n        if (! shardingEnabled) {\n            return null;\n        }\n        ShardGroupInfo shardGroupInfo = getGroupShardConfig(group);\n        String shard = computeShard(group, bizNo, shardGroupInfo);\n        return shard;\n    }\n    \n    public ShardingComputeResult computeShardInfo(String group, String bizNo) {\n        if (! shardingEnabled) {\n            return null;\n        }\n        ShardingComputeResult shardingInfo = new ShardingComputeResult();\n        ShardGroupInfo shardGroup = shardingConfigManager.getShardGroupMap().get(group);\n        String shard = computeShard(group, bizNo, shardGroup);\n        ShardInfo info = shardingConfigManager.getShardMap().get(shard);\n        if (info != null) {\n            shardingInfo.setDb(info.getDb());\n            shardingInfo.setTableSuffix(info.getTableSuffix());\n            shardingInfo.setShard(shard);\n        }\n        String slaveShard = computeSlaveShard(group, bizNo, shardGroup);\n        ShardInfo slaveInfo = shardingConfigManager.getShardMap().get(slaveShard);\n        if (slaveInfo != null) {\n            shardingInfo.setSlaveShard(slaveShard);\n            shardingInfo.setSlaveDb(slaveInfo.getDb());\n            shardingInfo.setSlaveTableSuffix(slaveInfo.getTableSuffix());\n        }\n        return shardingInfo;\n    }\n    \n    \n    private String computeShardByHashMode(String group, String bizNo, List<String> shardList) {\n        if (shardList == null || shardList.size() == 0) {\n            return null;\n        }\n        int hash = Math.abs(bizNo.hashCode());\n        int shardIndex = hash % shardList.size();\n        String shard = shardList.get(shardIndex);\n        return shard;\n    }\n    \n    public String getShard(ShardingData shardingData) {\n        if (! shardingEnabled) {\n            return null;\n        }\n        String shard = null;\n        if (shardingData.getShard() != null) {\n            shard = shardingData.getShard();\n        } else if (shardingData.getGroup() != null && shardingData.getBizNo() != null) {\n            shard = computeShardOfGroupAndBizNo(shardingData.getGroup(), shardingData.getBizNo());\n        } else if (shardingData.getGroup() != null) {\n            List<String> shardList = getShardListOfGroup(shardingData.getGroup());\n            if (shardList.size() == 1) {\n                shard = shardList.get(0);\n            }\n        }\n        return shard;\n    }\n\n    \n    \n    private String computeShard(String group, String bizNo, ShardGroupInfo shardGroup) {\n        List<String> shardList = shardGroup.getShardList();\n        String shard = null;\n        shard = computeShardByHashMode(group, bizNo, shardList);\n        if (logger.isDebugEnabled()) {\n            logger.debug(\"group:{} bizNo:{} use shard:{}\", group, bizNo, shard);\n        }\n        return shard;\n    }\n    \n    public String computeSlaveShard(String group, String bizNo, ShardGroupInfo shardGroup) {\n        if (! shardingEnabled) {\n            return null;\n        }\n        List<String> shardList = shardGroup.getSlaveShardList();\n        String shard = null;\n            shard = computeShardByHashMode(group, bizNo, shardList);\n            if (logger.isDebugEnabled()) {\n                logger.debug(\"group:{} bizNo:{} use slave shard:{}\", group, bizNo, shard);\n            }\n        return shard;\n    }\n    \n    \n    // == shard filter ==\n    \n    private Collection<ShardInfo> filterMasterShard(Collection<ShardInfo> shardList) {\n        if (! shardingEnabled) {\n            return null;\n        }\n        boolean containsSlave = false;\n        for (ShardInfo info : shardList) {\n            if (! info.isMaster()) {\n                containsSlave = true;\n                break;\n            }\n        }\n        if (! containsSlave) {\n            return shardList;\n        }\n        List<ShardInfo> result = new ArrayList<ShardInfo>(shardList.size());\n        for (ShardInfo info : shardList) {\n            if (info.isMaster()) {\n                result.add(info);\n            }\n        }\n        return result;\n    }\n    \n    private Collection<ShardInfo> filterSlaveShard(Collection<ShardInfo> shardList) {\n        List<ShardInfo> result = new ArrayList<ShardInfo>(shardList.size());\n        for (ShardInfo info : shardList) {\n            if (! info.isMaster()) {\n                result.add(info);\n            }\n        }\n        return result;\n    }\n    \n    @Override\n    public ShardGroupInfo getGroupShardConfig(String group) {\n        if (! shardingEnabled) {\n            return null;\n        }\n        if (shardingConfigManager.isFixDefaultShard()) {\n            return shardingConfigManager.getDefaultShardGroup();\n        }\n        ShardGroupInfo shardGroupInfo = shardingConfigManager.getShardGroupMap().get(group);\n        if (shardGroupInfo != null) {\n            return shardGroupInfo;\n        }\n        return shardingConfigManager.getDefaultShardGroup();\n    }\n    \n    public List<String> getShardListOfGroup(String group) {\n        if (! shardingEnabled) {\n            return null;\n        }\n        ShardGroupInfo processShardConfig = getGroupShardConfig(group);\n        return processShardConfig.getShardList();\n    }\n    \n   \n    \n    public CurrentShardInfo buildCurrentShardInfo(String shard, boolean usingSlaveDb) {\n        if (! shardingEnabled) {\n            return null;\n        }\n        ShardInfo info = shardingConfigManager.getShardMap().get(shard);\n        return buildCurrentShardInfo(info, usingSlaveDb);\n    }\n    \n\n    private CurrentShardInfo buildCurrentShardInfo(ShardInfo shardInfo, boolean usingSlaveDb) {\n        CurrentShardInfo info = new CurrentShardInfo();\n        info.setTableSuffix(shardInfo.getTableSuffix());\n        info.setShard(shardInfo.getShard());\n        if (! usingSlaveDb) {\n            info.setDb(shardInfo.getDb());\n        } else {\n            String slaveDb = shardInfo.getSlaveDb();\n            if (slaveDb == null) {\n                if (logger.isDebugEnabled()) {\n                    logger.debug(\"slaveDb is null, use master db \" + shardInfo.getDb());\n                }\n                info.setDb(shardInfo.getDb());\n            } else {\n                info.setDb(slaveDb);\n            }\n        }\n        return info;\n    }\n    \n    \n    \n    \n    \n    \n\n    public boolean isParallelQuery() {\n        return parallelQuery;\n    }\n\n    public void setParallelQuery(boolean parallelQuery) {\n        this.parallelQuery = parallelQuery;\n    }\n\n    public int getParallelQueryMaxThreadCount() {\n        return parallelQueryMaxThreadCount;\n    }\n\n    public void setParallelQueryMaxThreadCount(int parallelQueryMaxThreadCount) {\n        this.parallelQueryMaxThreadCount = parallelQueryMaxThreadCount;\n    }\n\n    public ExecutorService getParallelQueryThreadPool() {\n        return parallelQueryThreadPool;\n    }\n\n    public void setParallelQueryThreadPool(ExecutorService parallelQueryThreadPool) {\n        this.parallelQueryThreadPool = parallelQueryThreadPool;\n    }\n\n    public int getParallelTimeoutMillis() {\n        return parallelTimeoutMillis;\n    }\n\n    public void setParallelTimeoutMillis(int parallelTimeoutMillis) {\n        this.parallelTimeoutMillis = parallelTimeoutMillis;\n    }\n\n    public ShardingConfigManager getShardingConfigManager() {\n        return shardingConfigManager;\n    }\n\n    public void setShardingConfigManager(ShardingConfigManager shardingConfigManager) {\n        this.shardingConfigManager = shardingConfigManager;\n    }\n    public boolean isShardingEnabled() {\n        return shardingEnabled;\n    }\n    public void setShardingEnabled(boolean shardingEnabled) {\n        this.shardingEnabled = shardingEnabled;\n    }\n    \n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/java/com/jd/easyflow/sharding/transaction/ShardingSpringManagedTransactionFactory.java",
    "content": "package com.jd.easyflow.sharding.transaction;\n\nimport javax.sql.DataSource;\n\nimport org.apache.ibatis.session.TransactionIsolationLevel;\nimport org.apache.ibatis.transaction.Transaction;\nimport org.mybatis.spring.transaction.SpringManagedTransactionFactory;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport com.jd.easyflow.sharding.datasource.ShardingDataSource;\n\n/**\n * @author liyuliang5\n */\npublic class ShardingSpringManagedTransactionFactory extends SpringManagedTransactionFactory {\n    \n    private static final Logger logger = LoggerFactory.getLogger(ShardingSpringManagedTransactionFactory.class);\n    \n    private boolean sharding = true;\n    \n    @Override\n    public Transaction newTransaction(DataSource dataSource, TransactionIsolationLevel level, boolean autoCommit) {\n        if (sharding) {\n            if (dataSource instanceof ShardingDataSource) {\n                ShardingDataSource shardingDataSource = (ShardingDataSource) dataSource;\n                DataSource targetDataSource = shardingDataSource.determineTargetDataSourceInner();\n                if (targetDataSource != null) {\n                    dataSource = targetDataSource;\n                } else {\n                    if (logger.isWarnEnabled()) {\n                        logger.warn(\"sharding targetDataSource is null,\" + dataSource.getClass());\n                    }\n                }\n            } \n        }\n        return super.newTransaction(dataSource, level, autoCommit);\n    }\n\n}\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/resources/easyflow/easyflow-spring-codegenerator-server.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:aop=\"http://www.springframework.org/schema/aop\"\n       xmlns:context=\"http://www.springframework.org/schema/context\"\n       xmlns:util=\"http://www.springframework.org/schema/util\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd\n       http://www.springframework.org/schema/aop  http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd\">\n    <bean id=\"easyflow-codegenerator-transactionManager\" class=\"org.springframework.jdbc.datasource.DataSourceTransactionManager\">\n        <property name=\"dataSource\" ref=\"easyflow-codegenerator-dataSource\" />\n    </bean>    \n    <bean id=\"easyflow-codegenerator-newTransactionTemplate\" class=\"org.springframework.transaction.support.TransactionTemplate\">\n       <property name=\"transactionManager\" ref=\"easyflow-codegenerator-transactionManager\"></property>\n       <property name=\"propagationBehavior\" value=\"3\"></property>\n    </bean>\n    <bean id=\"easyflow-codegenerator-adapter-export-codeGenerateExport\" class=\"com.jd.easyflow.codegenerator.adapter.export.CodeGenerateExportImpl\"></bean>\n    <bean class=\"com.jd.easyflow.codegenerator.domain.service.CodeGenerateDomainService\" init-method=\"init\">\n    \t<property name=\"newTransactionTemplate\" ref=\"easyflow-codegenerator-newTransactionTemplate\"></property>\n    \t<property name=\"locker\" ref=\"easyflow-codegenerator-locker\"></property>\n    \n        <property name=\"configuredGeneratorMap\">\n            <map>\n                <entry key=\"demo_code\">\n                    <bean class=\"com.jd.easyflow.codegenerator.domain.service.CodeGenerator\">\n                    </bean>\n                </entry>\n                <entry key=\"demo_code2\">\n                    <bean class=\"com.jd.easyflow.codegenerator.domain.service.CodeGenerator\">\n                        <property name=\"codePrefix\" value=\"T\"></property>\n                        <property name=\"rollingType\" value=\"1\"></property>\n                        <property name=\"start\" value=\"1000000\"></property>\n                        <property name=\"startRandomRange\" value=\"0\"></property>\n                        <property name=\"step\" value=\"1\"></property>\n                        <property name=\"stepRandomRange\" value=\"0\"></property>\n                        <property name=\"numLength\" value=\"8\"></property>\n                        <property name=\"cacheSize\" value=\"1000\"></property>\n                        <property name=\"separator1\" value=\"\"></property>\n                        <property name=\"separator2\" value=\"\"></property>\n                    </bean>\n                </entry>\n                <entry key=\"PU-INSTANCE-ID\">\n                    <bean class=\"com.jd.easyflow.codegenerator.domain.service.CodeGenerator\">\n                        <property name=\"rollingType\" value=\"-1\"></property>\n                        <property name=\"start\" value=\"1000000000\"></property>\n                        <property name=\"numLength\" value=\"12\"></property>\n                        <property name=\"cacheSize\" value=\"10000\"></property>\n                    </bean>\n                </entry>\n                <entry key=\"PU-EXECUTION-ID\">\n                    <bean class=\"com.jd.easyflow.codegenerator.domain.service.CodeGenerator\">\n                        <property name=\"rollingType\" value=\"-1\"></property>\n                        <property name=\"start\" value=\"1000000000\"></property>\n                        <property name=\"numLength\" value=\"12\"></property>\n                        <property name=\"cacheSize\" value=\"10000\"></property>\n                    </bean>\n                </entry> \n                <entry key=\"PROCESS-ID\">\n                    <bean class=\"com.jd.easyflow.codegenerator.domain.service.CodeGenerator\">\n                        <property name=\"rollingType\" value=\"-1\"></property>\n                        <property name=\"start\" value=\"1000000000\"></property>\n                        <property name=\"numLength\" value=\"12\"></property>\n                        <property name=\"cacheSize\" value=\"10000\"></property>\n                    </bean>\n                </entry>                                                   \n            </map>\n        </property>    \n    </bean>\n    <bean class=\"com.jd.easyflow.codegenerator.infrastructure.repository.SequenceRepositoryImpl\"></bean>\n</beans>"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/resources/easyflow/easyflow-spring-form-server.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:aop=\"http://www.springframework.org/schema/aop\"\n       xmlns:context=\"http://www.springframework.org/schema/context\"\n       xmlns:util=\"http://www.springframework.org/schema/util\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd\n       http://www.springframework.org/schema/aop  http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd\">\n    \n    <bean id=\"easyflow-form-adapter-export-formTemplateExport\" class=\"com.jd.easyflow.form.adapter.export.FormTemplateExportImpl\"/>\n    <bean class=\"com.jd.easyflow.form.domain.service.FormTemplateDomainService\"/>\n    <bean class=\"com.jd.easyflow.form.infrastructure.repository.FormTemplateRepositoryImpl\"/>\n \n</beans>"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/resources/easyflow/easyflow-spring-lock-db.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:aop=\"http://www.springframework.org/schema/aop\"\n       xmlns:context=\"http://www.springframework.org/schema/context\"\n       xmlns:util=\"http://www.springframework.org/schema/util\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd\n       http://www.springframework.org/schema/aop  http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd\">\n    <bean name=\"easyflow-lock-dbLocker\" class=\"com.jd.easyflow.lock.impl.LockerImpl\">\n        <property name=\"lockService\">\n            <bean class=\"com.jd.easyflow.lock.db.DbLockService\" init-method=\"init\">\n                <property name=\"dataSource\" ref=\"easyflow-lock-dataSource\"></property>\n            </bean>\n        </property>\n    </bean>\n\n</beans>"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/resources/easyflow/easyflow-spring-process-server-sharding.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:aop=\"http://www.springframework.org/schema/aop\"\n       xmlns:context=\"http://www.springframework.org/schema/context\"\n       xmlns:util=\"http://www.springframework.org/schema/util\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd\n       http://www.springframework.org/schema/aop  http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd\">\n\t<bean id=\"easyflow-process-shardingConfigManager\" class=\"com.jd.easyflow.sharding.config.impl.ShardingConfigManagerFileImpl\" init-method=\"init\">\n\t\t<property name=\"shardingConfigPath\" value=\"${easyflow.process.shardingConfigPath:}\"></property>\n\t</bean>\n\t<bean id=\"easyflow-process-shardingService\" class=\"com.jd.easyflow.sharding.service.impl.ShardingServiceImpl\">\n\t\t<property name=\"shardingConfigManager\" ref=\"easyflow-process-shardingConfigManager\"></property>\n\t\t<property name=\"shardingEnabled\" value=\"${easyflow.process.shardingEnabled:false}\"></property>\n\t</bean>\n\t<bean id=\"easyflow-process-exportRequestShardComputer\" class=\"com.jd.easyflow.sharding.service.ExportRequestShardComputer\">\n\t\t<property name=\"shardingService\" ref=\"easyflow-process-shardingService\"></property>\n\t\t<property name=\"shardingConfigManager\" ref=\"easyflow-process-shardingConfigManager\"></property>\n\t\t<property name=\"groupKey\" value=\"_processType\"></property>\n\t\t<property name=\"shardingEnabled\" value=\"${easyflow.process.shardingEnabled:false}\"></property>\n\t</bean>\n\t<bean id =\"easyflow-process-processShardingDataQuerier\" class=\"com.jd.easyflow.process.infrastructure.sharding.ProcessShardingDataQuerier\">\n\t\t<property name=\"shardingService\" ref=\"easyflow-process-shardingService\"></property>\n\t</bean>\n\n    <bean id=\"easyflow-process-transactionManager\" class=\"org.springframework.jdbc.datasource.DataSourceTransactionManager\">\n        <property name=\"dataSource\" ref=\"easyflow-process-dataSource\" />\n    </bean>\n    <bean id=\"easyflow-process-newTransactionTemplate\" class=\"org.springframework.transaction.support.TransactionTemplate\">\n       <property name=\"transactionManager\" ref=\"easyflow-process-transactionManager\"></property>\n       <property name=\"propagationBehavior\" value=\"3\"></property>\n    </bean>\n    \n   <bean id=\"easyflow-process-sharding-transactionManager\" class=\"org.springframework.jdbc.datasource.DataSourceTransactionManager\">\n        <property name=\"dataSource\" ref=\"easyflow-process-sharding-dataSource\" />\n    </bean>\n    <bean id=\"easyflow-process-sharding-newTransactionTemplate\" class=\"org.springframework.transaction.support.TransactionTemplate\">\n       <property name=\"transactionManager\" ref=\"easyflow-process-sharding-transactionManager\"></property>\n       <property name=\"propagationBehavior\" value=\"3\"></property>\n    </bean>\n    \n    <bean class=\"com.jd.easyflow.process.infrastructure.repository.ProcessRepositoryImpl\"></bean>\n    <!-- ProcessInstance -->\n    <bean id=\"easyflow-process-adapter-export-processInstanceExport\" class=\"com.jd.easyflow.process.adapter.export.sharding.ProcessInstanceExportShardingImpl\">\n    \t<property name=\"shardingService\" ref=\"easyflow-process-shardingService\"></property>\n    \t<property name=\"shardingDataQuerier\" ref=\"easyflow-process-processShardingDataQuerier\"></property>\n    \t<property name=\"shardComputer\" ref=\"easyflow-process-exportRequestShardComputer\"></property>\n    </bean>\n    <bean class=\"com.jd.easyflow.process.domain.service.ProcessInstanceDomainService\" >\n    \t<property name=\"locker\" ref=\"easyflow-process-locker\"></property>\n    \t<property name=\"transactionTemplate\" ref=\"easyflow-process-sharding-newTransactionTemplate\"></property>\n    \t<property name=\"messageSendService\" ref=\"easyflow-process-messageSendService\"></property>\n    </bean>\n    \n    <!-- ProcessDefinition -->\n    <bean id=\"easyflow-process-adapter-export-processDefinitionExport\" class=\"com.jd.easyflow.process.adapter.export.ProcessDefinitionExportImpl\"></bean>\n    <bean class=\"com.jd.easyflow.process.domain.service.ProcessDefinitionDomainService\">\n    \t<property name=\"cacheService\" ref=\"easyflow-process-cacheService\"></property>\n    \t<property name=\"locker\" ref=\"easyflow-process-locker\"></property>\n    \t<property name=\"transactionTemplate\" ref=\"easyflow-process-newTransactionTemplate\"></property>\n    </bean>\n    \n    <!-- ProcessSchedule -->\n    <bean id=\"easyflow-process-adapter-export-processScheduleExport\" class=\"com.jd.easyflow.process.adapter.export.ProcessScheduleExportImpl\">\n    </bean>\n    <bean class=\"com.jd.easyflow.process.domain.service.ProcessScheduleDomainService\"></bean>\n    <bean class=\"com.jd.easyflow.process.domain.service.impl.ProcessScheduleSpiInvoker\"/>\n    \n    <!-- ProcessTask -->\n    <bean id=\"easyflow-process-adapter-export-processTaskExport\" class=\"com.jd.easyflow.process.adapter.export.sharding.ProcessTaskExportShardingImpl\">\n       \t<property name=\"shardingService\" ref=\"easyflow-process-shardingService\"></property>\n    \t<property name=\"shardingDataQuerier\" ref=\"easyflow-process-processShardingDataQuerier\"></property>\n    \t<property name=\"shardComputer\" ref=\"easyflow-process-exportRequestShardComputer\"></property>\n    </bean>\n    <bean class=\"com.jd.easyflow.process.domain.service.ProcessTaskDomainService\">\n    \t<property name=\"messageSendService\" ref=\"easyflow-process-messageSendService\"></property>\n    \t<property name=\"transactionTemplate\" ref=\"easyflow-process-sharding-newTransactionTemplate\"></property>\n    </bean>\n    <bean class=\"com.jd.easyflow.process.infrastructure.repository.ProcessTaskRepositoryImpl\"></bean>\n    <!-- ProcessTransaction -->\n    <bean id=\"easyflow-process-adapter-export-processTransactionExport\" class=\"com.jd.easyflow.process.adapter.export.sharding.ProcessTransactionExportShardingImpl\" init-method=\"init\">\n    \t<property name=\"shardingService\" ref=\"easyflow-process-shardingService\"></property>\n    \t<property name=\"shardingDataQuerier\" ref=\"easyflow-process-processShardingDataQuerier\"></property>\n    \t<property name=\"shardComputer\" ref=\"easyflow-process-exportRequestShardComputer\"></property>\n    \t<property name=\"transactionTemplate\" ref=\"easyflow-process-sharding-newTransactionTemplate\"></property>\n    \t<property name=\"messageSendService\" ref=\"easyflow-process-messageSendService\"></property>\n    </bean>\n    <!-- ProcessTool -->\n    <bean class=\"com.jd.easyflow.process.domain.service.ProcessToolDomainService\">\n    \t<property name=\"transactionTemplate\" ref=\"easyflow-process-sharding-newTransactionTemplate\"></property>\n    </bean>\n    <bean id=\"easyflow-process-adapter-export-processToolExport\" class=\"com.jd.easyflow.process.adapter.export.sharding.ProcessToolExportShardingImpl\">\n    \t<property name=\"shardingService\" ref=\"easyflow-process-shardingService\"></property>\n    \t<property name=\"shardingDataQuerier\" ref=\"easyflow-process-processShardingDataQuerier\"></property>\n    \t<property name=\"shardComputer\" ref=\"easyflow-process-exportRequestShardComputer\"></property>    \n    </bean>    \n</beans>"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/resources/easyflow/easyflow-spring-process-server.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:aop=\"http://www.springframework.org/schema/aop\"\n       xmlns:context=\"http://www.springframework.org/schema/context\"\n       xmlns:util=\"http://www.springframework.org/schema/util\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd\n       http://www.springframework.org/schema/aop  http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd\">\n    <bean id=\"easyflow-process-transactionManager\" class=\"org.springframework.jdbc.datasource.DataSourceTransactionManager\">\n        <property name=\"dataSource\" ref=\"easyflow-process-dataSource\" />\n    </bean>\n    <bean id=\"easyflow-process-newTransactionTemplate\" class=\"org.springframework.transaction.support.TransactionTemplate\">\n       <property name=\"transactionManager\" ref=\"easyflow-process-transactionManager\"></property>\n       <property name=\"propagationBehavior\" value=\"3\"></property>\n    </bean>\n    \n    <bean class=\"com.jd.easyflow.process.infrastructure.repository.ProcessRepositoryImpl\"></bean>\n    <!-- ProcessInstance -->\n    <bean id=\"easyflow-process-adapter-export-processInstanceExport\" class=\"com.jd.easyflow.process.adapter.export.ProcessInstanceExportImpl\"/>\n    <bean class=\"com.jd.easyflow.process.domain.service.ProcessInstanceDomainService\" >\n    \t<property name=\"locker\" ref=\"easyflow-process-locker\"></property>\n    \t<property name=\"transactionTemplate\" ref=\"easyflow-process-newTransactionTemplate\"></property>\n    \t<property name=\"messageSendService\" ref=\"easyflow-process-messageSendService\"></property>\n    </bean>\n    \n    <!-- ProcessDefinition -->\n    <bean id=\"easyflow-process-adapter-export-processDefinitionExport\" class=\"com.jd.easyflow.process.adapter.export.ProcessDefinitionExportImpl\"></bean>\n    <bean class=\"com.jd.easyflow.process.domain.service.ProcessDefinitionDomainService\">\n    \t<property name=\"cacheService\" ref=\"easyflow-process-cacheService\"></property>\n    \t<property name=\"locker\" ref=\"easyflow-process-locker\"></property>\n    \t<property name=\"transactionTemplate\" ref=\"easyflow-process-newTransactionTemplate\"></property>\n    </bean>\n    \n    <!-- ProcessSchedule -->\n    <bean id=\"easyflow-process-adapter-export-processScheduleExport\" class=\"com.jd.easyflow.process.adapter.export.ProcessScheduleExportImpl\">\n    </bean>\n    <bean class=\"com.jd.easyflow.process.domain.service.ProcessScheduleDomainService\"></bean>\n    <bean class=\"com.jd.easyflow.process.domain.service.impl.ProcessScheduleSpiInvoker\"/>\n    \n    <!-- ProcessTask -->\n    <bean id=\"easyflow-process-adapter-export-processTaskExport\" class=\"com.jd.easyflow.process.adapter.export.ProcessTaskExportImpl\"></bean>\n    <bean class=\"com.jd.easyflow.process.domain.service.ProcessTaskDomainService\">\n    \t<property name=\"messageSendService\" ref=\"easyflow-process-messageSendService\"></property>\n    \t<property name=\"transactionTemplate\" ref=\"easyflow-process-newTransactionTemplate\"></property>\n    </bean>\n    <bean class=\"com.jd.easyflow.process.infrastructure.repository.ProcessTaskRepositoryImpl\"></bean>\n    <!-- ProcessTransaction -->\n    <bean id=\"easyflow-process-adapter-export-processTransactionExport\" class=\"com.jd.easyflow.process.adapter.export.ProcessTransactionExportImpl\" init-method=\"init\">\n    \t<property name=\"transactionTemplate\" ref=\"easyflow-process-newTransactionTemplate\"></property>\n    \t<property name=\"messageSendService\" ref=\"easyflow-process-messageSendService\"></property>\n    </bean>\n    <!-- ProcessTool -->\n    <bean class=\"com.jd.easyflow.process.domain.service.ProcessToolDomainService\">\n    \t<property name=\"transactionTemplate\" ref=\"easyflow-process-newTransactionTemplate\"></property>\n    </bean>\n    <bean id=\"easyflow-process-adapter-export-processToolExport\" class=\"com.jd.easyflow.process.adapter.export.ProcessToolExportImpl\"></bean>    \n</beans>"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/resources/easyflow/easyflow-spring-processunit-server-sharding.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:aop=\"http://www.springframework.org/schema/aop\"\n       xmlns:context=\"http://www.springframework.org/schema/context\"\n       xmlns:util=\"http://www.springframework.org/schema/util\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd\n       http://www.springframework.org/schema/aop  http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd\">\n\t<bean id=\"easyflow-processunit-shardingConfigManager\" class=\"com.jd.easyflow.sharding.config.impl.ShardingConfigManagerFileImpl\" init-method=\"init\">\n\t\t<property name=\"shardingConfigPath\" value=\"${easyflow.processunit.shardingConfigPath:}\"></property>\n\t</bean>\n\t<bean id=\"easyflow-processunit-shardingService\" class=\"com.jd.easyflow.sharding.service.impl.ShardingServiceImpl\">\n\t\t<property name=\"shardingConfigManager\" ref=\"easyflow-processunit-shardingConfigManager\"></property>\n\t\t<property name=\"shardingEnabled\" value=\"${easyflow.processunit.shardingEnabled:false}\"></property>\n\t</bean>\t\n    <bean id=\"easyflow-processunit-newTransactionTemplate\" class=\"org.springframework.transaction.support.TransactionTemplate\">\n       <property name=\"transactionManager\">\n    <bean class=\"org.springframework.jdbc.datasource.DataSourceTransactionManager\">\n        <property name=\"dataSource\" ref=\"easyflow-processunit-dataSource\" />\n    </bean>      \n       </property>\n       <property name=\"propagationBehavior\" value=\"3\"></property>\n    </bean>   \n    <bean id=\"easyflow-processunit-lockManager\" class=\"com.jd.easyflow.processunit.domain.support.LockManager\">\n    \t<property name=\"locker\" ref=\"easyflow-processunit-lockService\"></property>\n    </bean>      \n    <bean class=\"com.jd.easyflow.processunit.infrastructure.gateway.ProcessUnitClientGatewayImpl\"/>\n    <bean class=\"com.jd.easyflow.processunit.infrastructure.repository.ProcessUnitRepositoryImpl\" init-method=\"init\">\n        <property name=\"shardingEnabled\" value=\"${easyflow.processunit.shardingEnabled:false}\"></property>    \n        <property name=\"shardingService\" ref=\"easyflow-processunit-shardingService\"></property>\n        <property name=\"shardingConfigManager\" ref=\"easyflow-processunit-shardingConfigManager\"></property>\n    </bean>\n    <bean id=\"easyflow-processunit-puTransactionTemplate\" class=\"com.jd.easyflow.processunit.domain.support.PuTransactionTemplate\">\n    \t    <property name=\"shardingService\" ref=\"easyflow-processunit-shardingService\"></property>\n    </bean>\n    <bean class=\"com.jd.easyflow.processunit.domain.service.impl.SyncServerProcessUnitExecutor\">\n    \t<property name=\"lockManager\" ref=\"easyflow-processunit-lockManager\"></property>\n    </bean>\n    <bean class=\"com.jd.easyflow.processunit.domain.service.impl.AsyncServerProcessUnitExecutor\">\n    \t<property name=\"lockManager\" ref=\"easyflow-processunit-lockManager\"></property>\n    </bean>\n    <bean class=\"com.jd.easyflow.processunit.domain.service.ProcessUnitService\">\n    \t<property name=\"messageSendService\" ref=\"easyflow-processunit-messageSendService\"></property>\n    \t<property name=\"lockManager\" ref=\"easyflow-processunit-lockManager\"></property>\n   \t\t<property name=\"executeMessageTopic\" value=\"${easyflow.processunit.executeMessageTopic:}\"></property>\n    \t<property name=\"createMessageTopic\" value=\"${easyflow.processunit.createMessageTopic:}\"></property>\n    \t<property name=\"updateMessageTopic\" value=\"${easyflow.processunit.updateMessageTopic:}\"></property>    \t\n    </bean>\n    <bean id=\"easyflow-processunit-server-processUnitExportImpl\" class=\"com.jd.easyflow.processunit.adapter.export.ProcessUnitExportImpl\"/>\n    <bean id=\"easyflow-processunit-server-processUnitExecuteMessageListener\" class=\"com.jd.easyflow.processunit.adapter.message.ProcessUnitExecuteMessageListener\"/>\n    \n    <bean class=\"com.jd.easyflow.processunit.infrastructure.repository.ProcessUnitConfigFileCache\" init-method=\"init\">\n    \t<property name=\"processUnitConfigPath\" value=\"${easyflow.processunit.configPath:}\"></property>\n    </bean>\n    <bean id=\"easyflow-processunit-server-executionPersistThreadPool\" class=\"org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor\">\n        <property name=\"corePoolSize\" value=\"2\"/>\n        <property name=\"maxPoolSize\" value=\"100\"/>\n        <property name=\"queueCapacity\" value=\"500\"/>\n        <property name=\"keepAliveSeconds\" value=\"100\"/>\n        <property name=\"rejectedExecutionHandler\">\n            <bean class=\"java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy\"/>\n        </property>\n        <property name=\"waitForTasksToCompleteOnShutdown\" value=\"true\"/>\n        <property name=\"awaitTerminationSeconds\" value=\"3\"/>\n    </bean>    \n    <bean class=\"com.jd.easyflow.processunit.domain.service.impl.execution.ExecutionPersister\">\n        <property name=\"handlerMap\">\n            <map>\n                <entry key=\"dummyPersistHandler\"><bean class=\"com.jd.easyflow.processunit.domain.service.impl.execution.DummyPersistHandler\"/></entry>\n                <entry key=\"syncPersistHandler\"><bean class=\"com.jd.easyflow.processunit.domain.service.impl.execution.SyncPersistHandler\"/></entry>\n                <entry key=\"threadPoolAsyncPersistHandler\"><bean class=\"com.jd.easyflow.processunit.domain.service.impl.execution.ThreadPoolAsyncPersistHandler\">\n                \t<property name=\"threadPoolExecutor\" ref=\"easyflow-processunit-server-executionPersistThreadPool\"></property>\n                </bean></entry>\n            </map>\n        </property>\n    </bean>\n    <bean id=\"easyflow-processunit-server-processUnitClientServiceMessageImpl\" class=\"com.jd.easyflow.processunit.infrastructure.gateway.ProcessUnitClientServiceMessageImpl\">\n    \t<property name=\"messageSendService\" ref=\"easyflow-processunit-messageSendService\"></property>\n    </bean>\n    \n    <bean class=\"com.jd.easyflow.processunit.domain.service.ProcessUnitShardingToolService\">\n    \t<property name=\"lockService\" ref=\"easyflow-processunit-lockService\"></property>\n    \t<property name=\"shardingService\" ref=\"easyflow-processunit-shardingService\"></property>\n    \t<property name=\"shardingConfigManager\" ref=\"easyflow-processunit-shardingConfigManager\"></property>\n    </bean>    \n</beans>"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/resources/easyflow/easyflow-spring-processunit-server.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:aop=\"http://www.springframework.org/schema/aop\"\n       xmlns:context=\"http://www.springframework.org/schema/context\"\n       xmlns:util=\"http://www.springframework.org/schema/util\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd\n       http://www.springframework.org/schema/aop  http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd\">\n    <bean id=\"easyflow-processunit-newTransactionTemplate\" class=\"org.springframework.transaction.support.TransactionTemplate\">\n       <property name=\"transactionManager\">\n    <bean class=\"org.springframework.jdbc.datasource.DataSourceTransactionManager\">\n        <property name=\"dataSource\" ref=\"easyflow-processunit-dataSource\" />\n    </bean>      \n       </property>\n       <property name=\"propagationBehavior\" value=\"3\"></property>\n    </bean>   \n    <bean class=\"com.jd.easyflow.processunit.infrastructure.gateway.ProcessUnitClientGatewayImpl\"/>\n    <bean class=\"com.jd.easyflow.processunit.infrastructure.repository.ProcessUnitRepositoryImpl\" init-method=\"init\">\n    </bean>\n    <bean id=\"easyflow-processunit-lockManager\" class=\"com.jd.easyflow.processunit.domain.support.LockManager\">\n    \t<property name=\"locker\" ref=\"easyflow-processunit-lockService\"></property>\n    </bean>     \n    <bean id=\"easyflow-processunit-puTransactionTemplate\" class=\"com.jd.easyflow.processunit.domain.support.PuTransactionTemplate\">\n    </bean>\n    <bean class=\"com.jd.easyflow.processunit.domain.service.impl.SyncServerProcessUnitExecutor\">\n    \t<property name=\"lockManager\" ref=\"easyflow-processunit-lockManager\"></property>\n    </bean>\n    <bean class=\"com.jd.easyflow.processunit.domain.service.impl.AsyncServerProcessUnitExecutor\">\n    \t<property name=\"lockManager\" ref=\"easyflow-processunit-lockManager\"></property>\n    </bean>\n    <bean class=\"com.jd.easyflow.processunit.domain.service.ProcessUnitService\">\n    \t<property name=\"messageSendService\" ref=\"easyflow-processunit-messageSendService\"></property>\n    \t<property name=\"lockManager\" ref=\"easyflow-processunit-lockManager\"></property>\n    \t<property name=\"executeMessageTopic\" value=\"${easyflow.processunit.executeMessageTopic:}\"></property>\n    \t<property name=\"createMessageTopic\" value=\"${easyflow.processunit.createMessageTopic:}\"></property>\n    \t<property name=\"updateMessageTopic\" value=\"${easyflow.processunit.updateMessageTopic:}\"></property>\n    </bean>\n    <bean id=\"easyflow-processunit-server-processUnitExportImpl\" class=\"com.jd.easyflow.processunit.adapter.export.ProcessUnitExportImpl\"/>\n    <bean id=\"easyflow-processunit-server-processUnitExecuteMessageListener\" class=\"com.jd.easyflow.processunit.adapter.message.ProcessUnitExecuteMessageListener\"/>\n    \n    <bean class=\"com.jd.easyflow.processunit.infrastructure.repository.ProcessUnitConfigFileCache\" init-method=\"init\">\n    \t<property name=\"processUnitConfigPath\" value=\"${easyflow.processunit.configPath:}\"></property>\n    </bean>\n    <bean id=\"easyflow-processunit-server-executionPersistThreadPool\" class=\"org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor\">\n        <property name=\"corePoolSize\" value=\"2\"/>\n        <property name=\"maxPoolSize\" value=\"100\"/>\n        <property name=\"queueCapacity\" value=\"500\"/>\n        <property name=\"keepAliveSeconds\" value=\"100\"/>\n        <property name=\"rejectedExecutionHandler\">\n            <bean class=\"java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy\"/>\n        </property>\n        <property name=\"waitForTasksToCompleteOnShutdown\" value=\"true\"/>\n        <property name=\"awaitTerminationSeconds\" value=\"3\"/>\n    </bean>    \n    <bean class=\"com.jd.easyflow.processunit.domain.service.impl.execution.ExecutionPersister\">\n        <property name=\"handlerMap\">\n            <map>\n                <entry key=\"dummyPersistHandler\"><bean class=\"com.jd.easyflow.processunit.domain.service.impl.execution.DummyPersistHandler\"/></entry>\n                <entry key=\"syncPersistHandler\"><bean class=\"com.jd.easyflow.processunit.domain.service.impl.execution.SyncPersistHandler\"/></entry>\n                <entry key=\"threadPoolAsyncPersistHandler\"><bean class=\"com.jd.easyflow.processunit.domain.service.impl.execution.ThreadPoolAsyncPersistHandler\">\n                \t<property name=\"threadPoolExecutor\" ref=\"easyflow-processunit-server-executionPersistThreadPool\"></property>\n                </bean></entry>\n            </map>\n        </property>\n    </bean>\n    <bean id=\"easyflow-processunit-server-processUnitClientServiceMessageImpl\" class=\"com.jd.easyflow.processunit.infrastructure.gateway.ProcessUnitClientServiceMessageImpl\">\n    \t<property name=\"messageSendService\" ref=\"easyflow-processunit-messageSendService\"></property>\n    </bean>\n    \n</beans>"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/resources/easyflow/mapper/FormTemplateMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.jd.easyflow.form.infrastructure.persistence.mapper.FormTemplateMapper\">\n  <resultMap id=\"BaseResultMap\" type=\"com.jd.easyflow.form.infrastructure.persistence.po.FormTemplate\">\n    <id column=\"id\" jdbcType=\"BIGINT\" property=\"id\" />\n    <result column=\"template_code\" jdbcType=\"VARCHAR\" property=\"templateCode\" />\n    <result column=\"template_name\" jdbcType=\"INTEGER\" property=\"templateName\" />\n    <result column=\"biz_type\" jdbcType=\"VARCHAR\" property=\"bizType\" />\n    <result column=\"config\" jdbcType=\"OTHER\" property=\"config\" />\n    <result column=\"status\" jdbcType=\"VARCHAR\" property=\"status\" />\n    <result column=\"created_date\" jdbcType=\"TIMESTAMP\" property=\"createdDate\" />\n    <result column=\"modified_date\" jdbcType=\"TIMESTAMP\" property=\"modifiedDate\" />\n    <result column=\"deleted\" jdbcType=\"TINYINT\" property=\"deleted\" />\n  </resultMap>\n  <sql id=\"Base_Column_List\">\n    id, template_code, template_name, biz_type, config, status, created_date, modified_date, \n    deleted\n  </sql>\n  <select id=\"selectByPrimaryKey\" parameterType=\"java.lang.Long\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from form_template\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </select>\n  <delete id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Long\">\n    update form_template set deleted=1\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </delete>\n  <insert id=\"insert\" keyColumn=\"id\" keyProperty=\"id\" parameterType=\"com.jd.easyflow.form.infrastructure.persistence.po.FormTemplate\" useGeneratedKeys=\"true\">\n    insert into form_template (template_code, template_name, biz_type, \n      config, status)\n    values (#{templateCode,jdbcType=VARCHAR}, #{templateName,jdbcType=INTEGER}, #{bizType,jdbcType=VARCHAR}, \n      #{config,jdbcType=OTHER}, #{status,jdbcType=VARCHAR})\n  </insert>\n  <insert id=\"insertSelective\" keyColumn=\"id\" keyProperty=\"id\" parameterType=\"com.jd.easyflow.form.infrastructure.persistence.po.FormTemplate\" useGeneratedKeys=\"true\">\n    insert into form_template\n    <trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">\n      <if test=\"templateCode != null\">\n        template_code,\n      </if>\n      <if test=\"templateName != null\">\n        template_name,\n      </if>\n      <if test=\"bizType != null\">\n        biz_type,\n      </if>\n      <if test=\"config != null\">\n        config,\n      </if>\n      <if test=\"status != null\">\n        status,\n      </if>\n    </trim>\n    <trim prefix=\"values (\" suffix=\")\" suffixOverrides=\",\">\n      <if test=\"templateCode != null\">\n        #{templateCode,jdbcType=VARCHAR},\n      </if>\n      <if test=\"templateName != null\">\n        #{templateName,jdbcType=INTEGER},\n      </if>\n      <if test=\"bizType != null\">\n        #{bizType,jdbcType=VARCHAR},\n      </if>\n      <if test=\"config != null\">\n        #{config,jdbcType=OTHER},\n      </if>\n      <if test=\"status != null\">\n        #{status,jdbcType=VARCHAR},\n      </if>\n    </trim>\n  </insert>\n  <update id=\"updateByPrimaryKeySelective\" parameterType=\"com.jd.easyflow.form.infrastructure.persistence.po.FormTemplate\">\n    update form_template\n    <set>\n      <if test=\"templateCode != null\">\n        template_code = #{templateCode,jdbcType=VARCHAR},\n      </if>\n      <if test=\"templateName != null\">\n        template_name = #{templateName,jdbcType=INTEGER},\n      </if>\n      <if test=\"bizType != null\">\n        biz_type = #{bizType,jdbcType=VARCHAR},\n      </if>\n      <if test=\"config != null\">\n        config = #{config,jdbcType=OTHER},\n      </if>\n      <if test=\"status != null\">\n        status = #{status,jdbcType=VARCHAR},\n      </if>\n    </set>\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </update>\n  <update id=\"updateByPrimaryKey\" parameterType=\"com.jd.easyflow.form.infrastructure.persistence.po.FormTemplate\">\n    update form_template\n    set template_code = #{templateCode,jdbcType=VARCHAR},\n      template_name = #{templateName,jdbcType=INTEGER},\n      biz_type = #{bizType,jdbcType=VARCHAR},\n      config = #{config,jdbcType=OTHER},\n      status = #{status,jdbcType=VARCHAR}\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </update>\n \n   <select id=\"selectByTemplateCode\" parameterType=\"string\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from form_template\n    where template_code=#{templateCode} and deleted=0\n  </select> \n  \n\n  <sql id=\"pagerWhere\">\n    <where>\n    deleted=0\n\n    <if test=\"fieldMap.templateCode != null\">\n    and template_code=#{fieldMap.templateCode.value}\n    </if>\n    <if test=\"fieldMap.templateName != null\">\n    and template_name=#{fieldMap.templateName.value}\n    </if>\n    <if test=\"fieldMap.status != null\">\n    and status=#{fieldMap.status.value}\n    </if>\n    </where>\n  </sql>\n  \n  <select id=\"countByPagerCondition\" resultType=\"long\">\n    select count(*) from form_template\n    <include refid=\"pagerWhere\"/>\n  </select>\n\n    <select id=\"selectByPagerCondition\" resultMap=\"BaseResultMap\">\n        select\n        <include refid=\"Base_Column_List\" />\n        from form_template\n        <include refid=\"pagerWhere\" />\n        <if test=\"sortMap.createdDate != null\">\n            order by created_date ${sortMap.createdDate.type}\n        </if>\n        <if test=\"sortMap.modifiedDate != null\">\n            order by modified_date ${sortMap.modifiedDate.type}\n        </if>\n      <if test=\"page\">\n        limit #{start},#{pageSize}\n      </if>\n    </select>  \n</mapper>"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/resources/easyflow/mapper/ProcessDefinitionMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.jd.easyflow.process.infrastructure.persistence.mapper.ProcessDefinitionMapper\">\n  <resultMap id=\"BaseResultMap\" type=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessDefinition\">\n    <id column=\"id\" jdbcType=\"BIGINT\" property=\"id\" />\n    <result column=\"def_id\" jdbcType=\"VARCHAR\" property=\"defId\" />\n    <result column=\"def_version\" jdbcType=\"INTEGER\" property=\"defVersion\" />\n    <result column=\"name\" jdbcType=\"VARCHAR\" property=\"name\" />\n    <result column=\"format\" jdbcType=\"VARCHAR\" property=\"format\" />\n    <result column=\"biz_type\" jdbcType=\"VARCHAR\" property=\"bizType\" />\n    <result column=\"category\" jdbcType=\"VARCHAR\" property=\"category\" />\n    <result column=\"content\" jdbcType=\"LONGVARCHAR\" property=\"content\" />\n    <result column=\"json_content\" jdbcType=\"LONGVARCHAR\" property=\"jsonContent\" />\n    <result column=\"latest\" jdbcType=\"TINYINT\" property=\"latest\" />\n    <result column=\"def_source\" jdbcType=\"VARCHAR\" property=\"defSource\" />\n    <result column=\"ext_data\" jdbcType=\"OTHER\" property=\"extData\" />\n    <result column=\"created_date\" jdbcType=\"TIMESTAMP\" property=\"createdDate\" />\n    <result column=\"modified_date\" jdbcType=\"TIMESTAMP\" property=\"modifiedDate\" />\n    <result column=\"created_by\" jdbcType=\"VARCHAR\" property=\"createdBy\" />\n    <result column=\"modified_by\" jdbcType=\"VARCHAR\" property=\"modifiedBy\" />\n    <result column=\"deleted\" jdbcType=\"TINYINT\" property=\"deleted\" />\n  </resultMap>\n  <sql id=\"Base_Column_List\">\n    id, def_id, def_version, name, format, biz_type,category, content,json_content, latest, def_source, ext_data,\n    created_date, modified_date,created_by,modified_by, deleted\n  </sql>\n  <select id=\"selectByPrimaryKey\" parameterType=\"java.lang.Long\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_definition\n    where id = #{id,jdbcType=BIGINT} and deleted = 0\n  </select>\n\n  <insert id=\"insert\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessDefinition\">\n    insert into process_definition(def_id, def_version,\n      name, format, biz_type, category, content,\n      json_content, latest, def_source,ext_data,created_by,modified_by)\n    values (#{defId,jdbcType=VARCHAR}, #{defVersion,jdbcType=INTEGER},\n      #{name,jdbcType=VARCHAR}, #{format,jdbcType=VARCHAR}, #{bizType,jdbcType=VARCHAR},#{category,jdbcType=VARCHAR}, #{content,jdbcType=LONGVARCHAR},\n      #{jsonContent,jdbcType=LONGVARCHAR}, #{latest,jdbcType=TINYINT}, #{defSource,jdbcType=VARCHAR}, #{extData,jdbcType=OTHER}, #{createdBy,jdbcType=VARCHAR}, #{modifiedBy,jdbcType=VARCHAR})\n  </insert>\n\n  <update id=\"updateByPrimaryKeySelective\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessDefinition\">\n    update process_definition\n    <set>\n      <if test=\"name != null\">\n        name = #{name,jdbcType=VARCHAR},\n      </if>\n        biz_type = #{bizType,jdbcType=VARCHAR},    \n        category = #{category,jdbcType=VARCHAR},\n      <if test=\"jsonContent != null\">\n        json_content = #{jsonContent,jdbcType=LONGVARCHAR},\n      </if>\n      <if test=\"content != null\">\n        content = #{content,jdbcType=LONGVARCHAR},\n      </if>\n      <if test=\"extData != null\">\n        ext_data = #{extData,jdbcType=LONGVARCHAR},\n      </if>   \n      <if test=\"format != null\">\n        format = #{format,jdbcType=VARCHAR},\n      </if>  \n      <if test=\"defSource != null\">\n        def_source = #{defSource,jdbcType=LONGVARCHAR},\n      </if>\n      <if test=\"createdBy != null\">\n        created_by = #{createdBy,jdbcType=VARCHAR},\n      </if>\n      <if test=\"modifiedBy != null\">\n        modified_by = #{modifiedBy,jdbcType=VARCHAR},\n      </if>\n    </set>\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </update>\n\n  <select id=\"countProcessDefByPageCondition\" parameterType=\"com.jd.easyflow.common.dto.pager.PagerCondition\" resultType=\"long\">\n    select count(def_id)\n    from process_definition\n    <include refid=\"pagerWhere\"/>\n  </select>\n\n  <select id=\"selectProcessDefByPageCondition\" parameterType=\"com.jd.easyflow.common.dto.pager.PagerCondition\" resultMap=\"BaseResultMap\">\n    select\n    id, def_id, def_version, name, format, biz_type,category, latest, def_source,\n    created_date, modified_date,created_by,modified_by\n    from process_definition\n    <include refid=\"pagerWhere\"/>\n    <if test=\"sortMap.createdDate != null\">\n      order by created_date ${sortMap.createdDate.type}\n    </if>\n    <if test=\"sortMap.modifiedDate != null\">\n      order by modified_date ${sortMap.modifiedDate.type}\n    </if>\n    limit #{start},#{pageSize}\n  </select>\n\n  <sql id=\"pagerWhere\">\n    <where> deleted = 0\n      <if test=\"fieldMap.defId != null\">\n        and def_id=#{fieldMap.defId.value}\n      </if>\n      <if test=\"fieldMap.name != null\">\n        and name=#{fieldMap.name.value}\n      </if>\n      <if test=\"fieldMap.format != null\">\n        and format=#{fieldMap.format.value}\n      </if>\n      <if test=\"fieldMap.bizType != null\">\n        and biz_type=#{fieldMap.bizType.value}\n      </if>\n      <if test=\"fieldMap.category != null\">\n        and category=#{fieldMap.category.value}\n      </if>\n      <if test=\"fieldMap.latest != null\">\n        and latest=#{fieldMap.latest.value}\n      </if>\n      <if test=\"fieldMap.createdBy != null\">\n        and created_by=#{fieldMap.createdBy.value}\n      </if>\n      <if test=\"fieldMap.modifiedBy != null\">\n        and modified_by=#{fieldMap.modifiedBy.value}\n      </if>\n    </where>\n  </sql>\n\n  <select id=\"selectByDefIdAndVersion\" resultMap=\"BaseResultMap\">\n    select\n    <include refid=\"Base_Column_List\" />\n    from process_definition\n   where def_id = #{defId}\n    <if test=\"defVersion == null\">\n      and def_version is null\n    </if>\n    <if test=\"defVersion != null\">\n      and def_version = #{defVersion}\n    </if>\n     and deleted=0\n  </select>\n\n  <select id=\"findLatestDefinition\" parameterType=\"java.lang.String\" resultMap=\"BaseResultMap\">\n    select\n    <include refid=\"Base_Column_List\" />\n    from process_definition\n    where def_id = #{defId}  and latest = 1  and deleted=0\n  </select>\n\n  <update id=\"updateProcessDefinitionLatestStatus\" parameterType=\"java.lang.Long\">\n    update process_definition\n    set\n    latest = 0\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </update>\n\n  <select id=\"existProcessDefinition\" parameterType=\"java.lang.String\" resultType=\"boolean\">\n    select count(1)\n    from process_definition\n    where def_id = #{defId} and deleted=0 limit 1;\n  </select>\n\n</mapper>"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/resources/easyflow/mapper/ProcessInstanceMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.jd.easyflow.process.infrastructure.persistence.mapper.ProcessInstanceMapper\">\n  <resultMap id=\"BaseResultMap\" type=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessInstance\">\n    <id column=\"id\" jdbcType=\"BIGINT\" property=\"id\" />\n    <result column=\"instance_no\" jdbcType=\"VARCHAR\" property=\"instanceNo\" />\n    <result column=\"instance_name\" jdbcType=\"VARCHAR\" property=\"instanceName\" />\n    <result column=\"instance_no\" jdbcType=\"VARCHAR\" property=\"instanceNo\" />\n    <result column=\"process_type\" jdbcType=\"VARCHAR\" property=\"processType\" />\n    <result column=\"biz_no\" jdbcType=\"VARCHAR\" property=\"bizNo\" />\n    <result column=\"product_code\" jdbcType=\"VARCHAR\" property=\"productCode\" />\n    <result column=\"creator\" jdbcType=\"VARCHAR\" property=\"creator\" />\n    <result column=\"process_def_id\" jdbcType=\"VARCHAR\" property=\"processDefId\" />\n    <result column=\"start_time\" jdbcType=\"TIMESTAMP\" property=\"startTime\" />\n    <result column=\"end_time\" jdbcType=\"TIMESTAMP\" property=\"endTime\" />\n    <result column=\"status\" jdbcType=\"VARCHAR\" property=\"status\" />\n    <result column=\"parent_instance_no\" jdbcType=\"VARCHAR\" property=\"parentInstanceNo\" />\n    <result column=\"parent_node_instance_no\" jdbcType=\"VARCHAR\" property=\"parentNodeInstanceNo\" />\n    <result column=\"current_node_ids\" jdbcType=\"VARCHAR\" property=\"currentNodeIds\" />\n    <result column=\"biz_status\" jdbcType=\"VARCHAR\" property=\"bizStatus\" />\n    <result column=\"biz_data\" jdbcType=\"OTHER\" property=\"bizData\" />\n    <result column=\"vars\" jdbcType=\"OTHER\" property=\"vars\" />\n    <result column=\"ext_data\" jdbcType=\"OTHER\" property=\"extData\" />\n    <result column=\"key_field\" jdbcType=\"VARCHAR\" property=\"keyField\" />\n    <result column=\"key_field2\" jdbcType=\"VARCHAR\" property=\"keyField2\" />\n    <result column=\"created_date\" jdbcType=\"TIMESTAMP\" property=\"createdDate\" />\n    <result column=\"modified_date\" jdbcType=\"TIMESTAMP\" property=\"modifiedDate\" />\n    <result column=\"deleted\" jdbcType=\"BIT\" property=\"deleted\" />\n  </resultMap>\n  <sql id=\"Base_Column_List\">\n    id, instance_no, instance_name, process_type, biz_no, product_code, creator, process_def_id, start_time, \n    end_time, status, parent_instance_no, parent_node_instance_no, current_node_ids, biz_status, biz_data, vars, ext_data, key_field,key_field2, created_date, modified_date,\n    deleted\n  </sql>\n  <select id=\"selectByPrimaryKey\" parameterType=\"java.lang.Long\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_instance\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </select>\n  <delete id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Long\">\n    update process_instance set deleted=1\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </delete>\n  <insert id=\"insert\" keyColumn=\"id\" keyProperty=\"id\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessInstance\" useGeneratedKeys=\"true\">\n    insert into process_instance (instance_no, instance_name, process_type, biz_no, \n      product_code, creator, process_def_id, \n      start_time, end_time, status, \n      parent_instance_no, parent_node_instance_no, current_node_ids,biz_status, biz_data, vars, ext_data, key_field, key_field2\n      )\n    values (#{instanceNo,jdbcType=VARCHAR}, #{instanceName,jdbcType=VARCHAR}, #{processType,jdbcType=VARCHAR}, #{bizNo,jdbcType=VARCHAR}, \n      #{productCode,jdbcType=VARCHAR}, #{creator,jdbcType=VARCHAR}, #{processDefId,jdbcType=VARCHAR}, \n      #{startTime,jdbcType=TIMESTAMP}, #{endTime,jdbcType=TIMESTAMP}, #{status,jdbcType=VARCHAR}, #{parentInstanceNo,jdbcType=VARCHAR},\n      #{parentNodeInstanceNo,jdbcType=VARCHAR},#{currentNodeIds,jdbcType=VARCHAR},#{bizStatus,jdbcType=VARCHAR},#{bizData,jdbcType=OTHER}, #{vars,jdbcType=OTHER}, #{extData,jdbcType=OTHER},\n      #{keyField,jdbcType=VARCHAR}, #{keyField2,jdbcType=VARCHAR})\n  </insert>\n  <insert id=\"insertWithCreatedDate\" keyColumn=\"id\" keyProperty=\"id\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessInstance\" useGeneratedKeys=\"true\">\n    insert into process_instance (instance_no, instance_name, process_type, biz_no, \n      product_code, creator, process_def_id, \n      start_time, end_time, status, \n      parent_instance_no, parent_node_instance_no, current_node_ids,biz_status, biz_data, vars, ext_data,key_field,key_field2, created_date\n      )\n    values (#{instanceNo,jdbcType=VARCHAR}, #{instanceName,jdbcType=VARCHAR}, #{processType,jdbcType=VARCHAR}, #{bizNo,jdbcType=VARCHAR}, \n      #{productCode,jdbcType=VARCHAR}, #{creator,jdbcType=VARCHAR}, #{processDefId,jdbcType=VARCHAR}, \n      #{startTime,jdbcType=TIMESTAMP}, #{endTime,jdbcType=TIMESTAMP}, #{status,jdbcType=VARCHAR}, #{parentInstanceNo,jdbcType=VARCHAR},\n      #{parentNodeInstanceNo,jdbcType=VARCHAR},#{currentNodeIds,jdbcType=VARCHAR},#{bizStatus,jdbcType=VARCHAR},#{bizData,jdbcType=OTHER}, #{vars,jdbcType=OTHER}, #{extData,jdbcType=OTHER},\n      #{keyField,jdbcType=VARCHAR}, #{keyField2,jdbcType=VARCHAR}, #{createdDate,jdbcType=TIMESTAMP})\n  </insert>  \n\n  <update id=\"updateByPrimaryKeySelective\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessInstance\">\n    update process_instance\n    <set>\n      <if test=\"instanceNo != null\">\n        instance_no = #{instanceNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"instanceName != null\">\n        instance_name = #{instanceName,jdbcType=VARCHAR},\n      </if>      \n      <if test=\"processType != null\">\n        process_type = #{processType,jdbcType=VARCHAR},\n      </if>\n      <if test=\"bizNo != null\">\n        biz_no = #{bizNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"productCode != null\">\n        product_code = #{productCode,jdbcType=VARCHAR},\n      </if>\n      <if test=\"creator != null\">\n        creator = #{creator,jdbcType=VARCHAR},\n      </if>\n      <if test=\"processDefId != null\">\n        process_def_id = #{processDefId,jdbcType=VARCHAR},\n      </if>\n      <if test=\"startTime != null\">\n        start_time = #{startTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"endTime != null\">\n        end_time = #{endTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"status != null\">\n        status = #{status,jdbcType=VARCHAR},\n      </if>\n      <if test=\"parentInstanceNo != null\">\n        parent_instance_no = #{parentInstanceNo,jdbcType=VARCHAR},\n      </if>      \n      <if test=\"parentNodeInstanceNo != null\">\n        parent_node_instance_no = #{parentNodeInstanceNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"currentNodeIds != null\">\n        current_node_ids = #{currentNodeIds,jdbcType=VARCHAR},\n      </if> \n      <if test=\"bizStatus != null\">\n        biz_status = #{bizStatus,jdbcType=VARCHAR},\n      </if>\n      <if test=\"bizData != null\">\n        biz_data = #{bizData,jdbcType=OTHER},\n      </if>                 \n      <if test=\"vars != null\">\n        vars = #{vars,jdbcType=OTHER},\n      </if>\n      <if test=\"extData != null\">\n        ext_data = #{extData,jdbcType=OTHER},\n      </if>\n      <if test=\"keyField != null\">\n        key_field = #{keyField,jdbcType=VARCHAR},\n      </if>\n      <if test=\"keyField2 != null\">\n        key_field2 = #{keyField2,jdbcType=VARCHAR},\n      </if>\n    </set>\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </update>\n  <update id=\"updateByPrimaryKey\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessInstance\">\n    update process_instance\n    set instance_no = #{instanceNo,jdbcType=VARCHAR},\n      instance_name = #{instanceName,jdbcType=VARCHAR},\n      process_type = #{processType,jdbcType=VARCHAR},\n      biz_no = #{bizNo,jdbcType=VARCHAR},\n      product_code = #{productCode,jdbcType=VARCHAR},\n      creator = #{creator,jdbcType=VARCHAR},\n      process_def_id = #{processDefId,jdbcType=VARCHAR},\n      start_time = #{startTime,jdbcType=TIMESTAMP},\n      end_time = #{endTime,jdbcType=TIMESTAMP},\n      status = #{status,jdbcType=VARCHAR},\n      parent_instance_no = #{parentInstanceNo,jdbcType=VARCHAR},\n      parent_node_instance_no = #{parentNodeInstanceNo,jdbcType=VARCHAR},\n      current_node_ids = #{currentNodeIds,jdbcType=VARCHAR},\n      biz_status = #{bizStatus,jdbcType=VARCHAR},\n      biz_data = #{bizData,jdbcType=OTHER},\n      vars = #{vars,jdbcType=OTHER},\n      ext_data = #{extData,jdbcType=OTHER},\n      key_field = #{keyField,jdbcType=OTHER},\n      key_field2 = #{keyField2,jdbcType=OTHER}\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </update>\n  \n    <update id=\"updateByProcessInstanceNo\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessInstance\">\n    update process_instance\n    set \n      instance_name = #{instanceName,jdbcType=VARCHAR},\n      process_type = #{processType,jdbcType=VARCHAR},\n      biz_no = #{bizNo,jdbcType=VARCHAR},\n      product_code = #{productCode,jdbcType=VARCHAR},\n      creator = #{creator,jdbcType=VARCHAR},\n      process_def_id = #{processDefId,jdbcType=VARCHAR},\n      start_time = #{startTime,jdbcType=TIMESTAMP},\n      end_time = #{endTime,jdbcType=TIMESTAMP},\n      status = #{status,jdbcType=VARCHAR},\n      parent_instance_no = #{parentInstanceNo,jdbcType=VARCHAR},\n      parent_node_instance_no = #{parentNodeInstanceNo,jdbcType=VARCHAR},\n      current_node_ids = #{currentNodeIds,jdbcType=VARCHAR},\n      biz_status = #{bizStatus,jdbcType=VARCHAR},\n      biz_data = #{bizData,jdbcType=OTHER},\n      vars = #{vars,jdbcType=OTHER},\n      ext_data = #{extData,jdbcType=OTHER},\n      key_field = #{keyField,jdbcType=OTHER},\n      key_field2 = #{keyField2,jdbcType=OTHER}\n    where instance_no = #{instanceNo,jdbcType=VARCHAR} and deleted=0\n  </update>\n  \n  <update id=\"deleteByProcessInstanceNo\" parameterType=\"java.lang.String\">\n    update process_instance\n    set \n      deleted=1\n    where instance_no = #{instanceNo,jdbcType=VARCHAR} and deleted=0\n  </update>\n  \n  <select id=\"getProcessInstanceByProcessTypeAndBizNo\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_instance\n    where process_type=#{processType} and biz_no=#{bizNo} and deleted=0 order by id desc limit 1\n  </select>\n  <select id=\"selectByInstanceNo\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_instance\n    where instance_no=#{instanceNo} and deleted=0\n  </select>\n\n  <select id=\"getActiveProcessInstanceByProcessTypeAndBizNo\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_instance\n    where process_type=#{processType} and biz_no=#{bizNo} and status='ACTIVE' and deleted=0 order by id desc\n  </select>\n\n  <select id=\"countProcessInstanceByPagerCondition\" parameterType=\"com.jd.easyflow.common.dto.pager.PagerCondition\" resultType=\"long\">\n    select\n    count(instance_no)\n    from process_instance\n    <include refid=\"pagerWhere\" />\n  </select>\n\n  <select id=\"selectProcessInstanceByPageCondition\" parameterType=\"com.jd.easyflow.common.dto.pager.PagerCondition\" resultMap=\"BaseResultMap\">\n    select\n    <include refid=\"Base_Column_List\" />\n    from process_instance\n    <include refid=\"pagerWhere\" />\n    <if test=\"sortMap.createdDate != null\">\n      order by created_date ${sortMap.createdDate.type},id  ${sortMap.createdDate.type}\n    </if>  \n    <if test=\"sortMap.modifiedDate != null\">\n      order by modified_date ${sortMap.modifiedDate.type}\n    </if>\n    limit #{start},#{pageSize}\n  </select>\n  <select id=\"queryProcessInstanceByInstanceNos\" resultMap=\"BaseResultMap\">\n    select\n    <include refid=\"Base_Column_List\"/>\n    from process_instance\n    <where>\n      deleted = 0 and instance_no in\n      <foreach collection=\"processInstanceNos\" item=\"processInstanceNo\" open=\"(\" separator=\",\" close=\")\">\n        #{processInstanceNo}\n      </foreach>\n    </where>\n  </select>\n  <select id=\"selectProcessInstanceByParentInstanceNo\" resultMap=\"BaseResultMap\">\n    select\n    <include refid=\"Base_Column_List\"/>\n    from process_instance\n    <where>\n      deleted = 0 and parent_instance_no=#{parentInstanceNo}\n    </where>\n  </select>\n  <select id=\"selectProcessInstanceByParentNodeInstanceNo\" resultMap=\"BaseResultMap\">\n    select\n    <include refid=\"Base_Column_List\"/>\n    from process_instance\n    <where>\n      deleted = 0 and parent_instance_no=#{parentInstanceNo} and parent_node_instance_no=#{parentNodeInstanceNo}\n    </where>\n  </select>  \n  <sql id=\"pagerWhere\">\n    <where> deleted = 0\n      <if test=\"fieldMap.instanceNo != null\">\n        and instance_no=#{fieldMap.instanceNo.value}\n      </if>\n      <if test=\"fieldMap.processType != null\">\n        and process_type=#{fieldMap.processType.value}\n      </if>\n      <if test=\"fieldMap.bizNo != null\">\n        and biz_no=#{fieldMap.bizNo.value}\n      </if>\n      <if test=\"fieldMap.productCode != null\">\n        and product_code=#{fieldMap.productCode.value}\n      </if>\n      <if test=\"fieldMap.productCodeList != null\">\n        and (product_code is null or product_code in\n        <foreach collection=\"fieldMap.productCodeList.value\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n          #{item}\n        </foreach>\n        )\n      </if>\n      <if test=\"fieldMap.processDefId != null\">\n        and process_def_id=#{fieldMap.processDefId.value}\n      </if>\n      <if test=\"fieldMap.bizStatus != null\">\n        and biz_status=#{fieldMap.bizStatus.value}\n      </if> \n      <if test=\"fieldMap.status != null\">\n        and status=#{fieldMap.status.value}\n      </if>       \n      <if test=\"fieldMap.creator != null\">\n        and creator=#{fieldMap.creator.value}\n      </if>\n      <if test=\"fieldMap.createdDateStart != null\">\n        and created_date &gt;=#{fieldMap.createdDateStart.value}\n      </if> \n      <if test=\"fieldMap.createdDateEnd != null\">\n        and created_date &lt;=#{fieldMap.createdDateEnd.value}\n      </if>  \n      <if test=\"fieldMap.keyField != null\">\n        and key_field =#{fieldMap.keyField.value}\n      </if>\n      <if test=\"fieldMap.keyField2 != null\">\n        and key_field2 like CONCAT(#{fieldMap.keyField2.value},'%')\n      </if>\n    </where>\n  </sql>\n</mapper>"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/resources/easyflow/mapper/ProcessNodeExecutionMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.jd.easyflow.process.infrastructure.persistence.mapper.ProcessNodeExecutionMapper\">\n  <resultMap id=\"BaseResultMap\" type=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessNodeExecution\">\n    <id column=\"id\" jdbcType=\"BIGINT\" property=\"id\" />\n    <result column=\"node_execution_no\" jdbcType=\"VARCHAR\" property=\"nodeExecutionNo\" />\n    <result column=\"node_instance_no\" jdbcType=\"VARCHAR\" property=\"nodeInstanceNo\" />\n    <result column=\"event_id\" jdbcType=\"VARCHAR\" property=\"eventId\" />\n    <result column=\"process_def_id\" jdbcType=\"VARCHAR\" property=\"processDefId\" />\n    <result column=\"node_id\" jdbcType=\"VARCHAR\" property=\"nodeId\" />\n    <result column=\"start_time\" jdbcType=\"TIMESTAMP\" property=\"startTime\" />\n    <result column=\"end_time\" jdbcType=\"TIMESTAMP\" property=\"endTime\" />\n    <result column=\"status\" jdbcType=\"VARCHAR\" property=\"status\" />\n    <result column=\"product_code\" jdbcType=\"VARCHAR\" property=\"productCode\" />\n    <result column=\"executor\" jdbcType=\"VARCHAR\" property=\"executor\" />\n    <result column=\"next_node_instances\" jdbcType=\"VARCHAR\" property=\"nextNodeInstances\" />\n    <result column=\"ext_data\" jdbcType=\"OTHER\" property=\"extData\" />\n    <result column=\"created_date\" jdbcType=\"TIMESTAMP\" property=\"createdDate\" />\n    <result column=\"modified_date\" jdbcType=\"TIMESTAMP\" property=\"modifiedDate\" />\n    <result column=\"deleted\" jdbcType=\"BIT\" property=\"deleted\" />\n  </resultMap>\n  <sql id=\"Base_Column_List\">\n    id, node_execution_no, node_instance_no, event_id, process_def_id, node_id, start_time, \n    end_time, status, product_code, executor, next_node_instances, ext_data, created_date, \n    modified_date, deleted\n  </sql>\n  <select id=\"selectByPrimaryKey\" parameterType=\"java.lang.Long\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_node_execution\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </select>\n  <delete id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Long\">\n    update process_node_execution set deleted=1\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </delete>\n  <insert id=\"insert\" keyColumn=\"id\" keyProperty=\"id\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessNodeExecution\" useGeneratedKeys=\"true\">\n    insert into process_node_execution (node_execution_no, node_instance_no, \n      event_id, process_def_id, node_id, \n      start_time, end_time, status, \n      product_code, executor, next_node_instances, \n      ext_data)\n    values (#{nodeExecutionNo,jdbcType=VARCHAR}, #{nodeInstanceNo,jdbcType=VARCHAR}, \n      #{eventId,jdbcType=VARCHAR}, #{processDefId,jdbcType=VARCHAR}, #{nodeId,jdbcType=VARCHAR}, \n      #{startTime,jdbcType=TIMESTAMP}, #{endTime,jdbcType=TIMESTAMP}, #{status,jdbcType=VARCHAR}, \n      #{productCode,jdbcType=VARCHAR}, #{executor,jdbcType=VARCHAR}, #{nextNodeInstances,jdbcType=VARCHAR}, \n      #{extData,jdbcType=OTHER})\n  </insert>\n  <insert id=\"insertWithCreatedDate\" keyColumn=\"id\" keyProperty=\"id\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessNodeExecution\" useGeneratedKeys=\"true\">\n    insert into process_node_execution (node_execution_no, node_instance_no, \n      event_id, process_def_id, node_id, \n      start_time, end_time, status, \n      product_code, executor, next_node_instances, \n      ext_data, created_date)\n    values (#{nodeExecutionNo,jdbcType=VARCHAR}, #{nodeInstanceNo,jdbcType=VARCHAR}, \n      #{eventId,jdbcType=VARCHAR}, #{processDefId,jdbcType=VARCHAR}, #{nodeId,jdbcType=VARCHAR}, \n      #{startTime,jdbcType=TIMESTAMP}, #{endTime,jdbcType=TIMESTAMP}, #{status,jdbcType=VARCHAR}, \n      #{productCode,jdbcType=VARCHAR}, #{executor,jdbcType=VARCHAR}, #{nextNodeInstances,jdbcType=VARCHAR}, \n      #{extData,jdbcType=OTHER}, #{createdDate,jdbcType=TIMESTAMP})\n  </insert>  \n  <update id=\"updateByPrimaryKeySelective\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessNodeExecution\">\n    update process_node_execution\n    <set>\n      <if test=\"nodeExecutionNo != null\">\n        node_execution_no = #{nodeExecutionNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"nodeInstanceNo != null\">\n        node_instance_no = #{nodeInstanceNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"eventId != null\">\n        event_id = #{eventId,jdbcType=VARCHAR},\n      </if>\n      <if test=\"processDefId != null\">\n        process_def_id = #{processDefId,jdbcType=VARCHAR},\n      </if>\n      <if test=\"nodeId != null\">\n        node_id = #{nodeId,jdbcType=VARCHAR},\n      </if>\n      <if test=\"startTime != null\">\n        start_time = #{startTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"endTime != null\">\n        end_time = #{endTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"status != null\">\n        status = #{status,jdbcType=VARCHAR},\n      </if>\n      <if test=\"productCode != null\">\n        product_code = #{productCode,jdbcType=VARCHAR},\n      </if>\n      <if test=\"executor != null\">\n        executor = #{executor,jdbcType=VARCHAR},\n      </if>\n      <if test=\"nextNodeInstances != null\">\n        next_node_instances = #{nextNodeInstances,jdbcType=VARCHAR},\n      </if>\n      <if test=\"extData != null\">\n        ext_data = #{extData,jdbcType=OTHER},\n      </if>\n    </set>\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </update>\n  <update id=\"updateByPrimaryKey\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessNodeExecution\">\n    update process_node_execution\n    set node_execution_no = #{nodeExecutionNo,jdbcType=VARCHAR},\n      node_instance_no = #{nodeInstanceNo,jdbcType=VARCHAR},\n      event_id = #{eventId,jdbcType=VARCHAR},\n      process_def_id = #{processDefId,jdbcType=VARCHAR},\n      node_id = #{nodeId,jdbcType=VARCHAR},\n      start_time = #{startTime,jdbcType=TIMESTAMP},\n      end_time = #{endTime,jdbcType=TIMESTAMP},\n      status = #{status,jdbcType=VARCHAR},\n      product_code = #{productCode,jdbcType=VARCHAR},\n      executor = #{executor,jdbcType=VARCHAR},\n      next_node_instances = #{nextNodeInstances,jdbcType=VARCHAR},\n      ext_data = #{extData,jdbcType=OTHER}\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </update>\n  \n  <update id=\"updateByProcessNodeExecutionNo\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessNodeExecution\">\n    update process_node_execution\n    set \n      node_instance_no = #{nodeInstanceNo,jdbcType=VARCHAR},\n      event_id = #{eventId,jdbcType=VARCHAR},\n      process_def_id = #{processDefId,jdbcType=VARCHAR},\n      node_id = #{nodeId,jdbcType=VARCHAR},\n      start_time = #{startTime,jdbcType=TIMESTAMP},\n      end_time = #{endTime,jdbcType=TIMESTAMP},\n      status = #{status,jdbcType=VARCHAR},\n      product_code = #{productCode,jdbcType=VARCHAR},\n      executor = #{executor,jdbcType=VARCHAR},\n      next_node_instances = #{nextNodeInstances,jdbcType=VARCHAR},\n      ext_data = #{extData,jdbcType=OTHER}\n    where node_execution_no = #{nodeExecutionNo,jdbcType=VARCHAR} and deleted=0\n  </update>  \n  \n  <select id=\"selectByNodeExecutionNo\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_node_execution\n    where node_execution_no = #{nodeExecutionNo} and deleted=0\n  </select>\n  <select id=\"countByPagerCondition\" parameterType=\"com.jd.easyflow.common.dto.pager.PagerCondition\" resultType=\"long\">\n    select\n    count(node_execution_no)\n    from process_node_execution\n    <include refid=\"pagerWhere\" />\n  </select>\n\n  <select id=\"selectByPageCondition\" parameterType=\"com.jd.easyflow.common.dto.pager.PagerCondition\" resultMap=\"BaseResultMap\">\n    select\n    <include refid=\"Base_Column_List\" />\n    from process_node_execution\n    <include refid=\"pagerWhere\" />\n    <if test=\"sortMap.startTime != null\">\n      order by start_time ${sortMap.startTime.type},id  ${sortMap.startTime.type}\n    </if>  \n    limit #{start},#{pageSize}\n  </select>\n  <sql id=\"pagerWhere\">\n    <where> deleted = 0\n      <if test=\"fieldMap.nodeInstanceNoList != null\">\n        and node_instance_no in\n        <foreach collection=\"fieldMap.nodeInstanceNoList.value\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n          #{item}\n        </foreach>\n      </if>\n      <if test=\"fieldMap.nodeExecutionNo != null\">\n        and node_execution_no=#{fieldMap.nodeExecutionNo.value}\n      </if>\n      <if test=\"fieldMap.eventId != null\">\n        and event_id=#{fieldMap.eventId.value}\n      </if>\n      <if test=\"fieldMap.eventIdIsNull!=null\">\n        and event_id is null\n      </if>\n      <if test=\"fieldMap.processDefId != null\">\n        and process_def_id=#{fieldMap.processDefId.value}\n      </if>\n      <if test=\"fieldMap.nodeId != null\">\n        and node_id=#{fieldMap.nodeId.value}\n      </if> \n      <if test=\"fieldMap.startTimeStart != null\">\n        and start_time &gt;=#{fieldMap.startTimeStart.value}\n      </if> \n      <if test=\"fieldMap.startTimeEnd != null\">\n        and start_time &lt;=#{fieldMap.startTimeEnd.value}\n      </if>  \n      <if test=\"fieldMap.productCode != null\">\n        and product_code =#{fieldMap.productCode.value}\n      </if>\n    </where>\n  </sql>  \n  \n</mapper>"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/resources/easyflow/mapper/ProcessNodeInstanceMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.jd.easyflow.process.infrastructure.persistence.mapper.ProcessNodeInstanceMapper\">\n  <resultMap id=\"BaseResultMap\" type=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessNodeInstance\">\n    <id column=\"id\" jdbcType=\"BIGINT\" property=\"id\" />\n    <result column=\"node_instance_no\" jdbcType=\"VARCHAR\" property=\"nodeInstanceNo\" />\n    <result column=\"process_instance_no\" jdbcType=\"VARCHAR\" property=\"processInstanceNo\" />\n    <result column=\"process_def_id\" jdbcType=\"VARCHAR\" property=\"processDefId\" />\n    <result column=\"node_id\" jdbcType=\"VARCHAR\" property=\"nodeId\" />\n    <result column=\"start_time\" jdbcType=\"TIMESTAMP\" property=\"startTime\" />\n    <result column=\"end_time\" jdbcType=\"TIMESTAMP\" property=\"endTime\" />\n    <result column=\"status\" jdbcType=\"VARCHAR\" property=\"status\" />\n    <result column=\"product_code\" jdbcType=\"VARCHAR\" property=\"productCode\" />\n    <result column=\"executors\" jdbcType=\"VARCHAR\" property=\"executors\" />\n    <result column=\"previous_node_instances\" jdbcType=\"VARCHAR\" property=\"previousNodeInstances\" />\n    <result column=\"next_node_instances\" jdbcType=\"VARCHAR\" property=\"nextNodeInstances\" />\n    <result column=\"vars\" jdbcType=\"OTHER\" property=\"vars\" />\n    <result column=\"ext_data\" jdbcType=\"OTHER\" property=\"extData\" />\n    <result column=\"created_date\" jdbcType=\"TIMESTAMP\" property=\"createdDate\" />\n    <result column=\"modified_date\" jdbcType=\"TIMESTAMP\" property=\"modifiedDate\" />\n    <result column=\"deleted\" jdbcType=\"BIT\" property=\"deleted\" />\n  </resultMap>\n  <sql id=\"Base_Column_List\">\n    id, node_instance_no, process_instance_no, process_def_id, node_id, start_time, end_time, \n    status, product_code, executors, previous_node_instances, next_node_instances, vars, ext_data, created_date, \n    modified_date, deleted\n  </sql>\n  <select id=\"selectByPrimaryKey\" parameterType=\"java.lang.Long\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_node_instance\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </select>\n  <delete id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Long\">\n    update process_node_instance set deleted=1\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </delete>\n  <insert id=\"insert\" keyColumn=\"id\" keyProperty=\"id\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessNodeInstance\" useGeneratedKeys=\"true\">\n    insert into process_node_instance (node_instance_no, process_instance_no, \n      process_def_id, node_id, start_time, \n      end_time, status, product_code, \n      executors, previous_node_instances, next_node_instances, vars, \n      ext_data)\n    values (#{nodeInstanceNo,jdbcType=VARCHAR}, #{processInstanceNo,jdbcType=VARCHAR}, \n      #{processDefId,jdbcType=VARCHAR}, #{nodeId,jdbcType=VARCHAR}, #{startTime,jdbcType=TIMESTAMP}, \n      #{endTime,jdbcType=TIMESTAMP}, #{status,jdbcType=VARCHAR}, #{productCode,jdbcType=VARCHAR}, \n      #{executors,jdbcType=VARCHAR}, #{previousNodeInstances,jdbcType=VARCHAR}, #{nextNodeInstances,jdbcType=VARCHAR}, #{vars,jdbcType=OTHER}, \n      #{extData,jdbcType=OTHER})\n  </insert>\n  <insert id=\"insertWithCreatedDate\" keyColumn=\"id\" keyProperty=\"id\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessNodeInstance\" useGeneratedKeys=\"true\">\n    insert into process_node_instance (node_instance_no, process_instance_no, \n      process_def_id, node_id, start_time, \n      end_time, status, product_code, \n      executors, previous_node_instances, next_node_instances, vars, \n      ext_data, created_date)\n    values (#{nodeInstanceNo,jdbcType=VARCHAR}, #{processInstanceNo,jdbcType=VARCHAR}, \n      #{processDefId,jdbcType=VARCHAR}, #{nodeId,jdbcType=VARCHAR}, #{startTime,jdbcType=TIMESTAMP}, \n      #{endTime,jdbcType=TIMESTAMP}, #{status,jdbcType=VARCHAR}, #{productCode,jdbcType=VARCHAR}, \n      #{executors,jdbcType=VARCHAR}, #{previousNodeInstances,jdbcType=VARCHAR}, #{nextNodeInstances,jdbcType=VARCHAR}, #{vars,jdbcType=OTHER}, \n      #{extData,jdbcType=OTHER}, #{createdDate,jdbcType=TIMESTAMP})\n  </insert>  \n  <update id=\"updateByPrimaryKeySelective\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessNodeInstance\">\n    update process_node_instance\n    <set>\n      <if test=\"nodeInstanceNo != null\">\n        node_instance_no = #{nodeInstanceNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"processInstanceNo != null\">\n        process_instance_no = #{processInstanceNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"processDefId != null\">\n        process_def_id = #{processDefId,jdbcType=VARCHAR},\n      </if>\n      <if test=\"nodeId != null\">\n        node_id = #{nodeId,jdbcType=VARCHAR},\n      </if>\n      <if test=\"startTime != null\">\n        start_time = #{startTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"endTime != null\">\n        end_time = #{endTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"status != null\">\n        status = #{status,jdbcType=VARCHAR},\n      </if>\n      <if test=\"productCode != null\">\n        product_code = #{productCode,jdbcType=VARCHAR},\n      </if>\n      <if test=\"executors != null\">\n        executors = #{executors,jdbcType=VARCHAR},\n      </if>\n      <if test=\"previousNodeInstances != null\">\n        previous_node_instances = #{previousNodeInstances,jdbcType=VARCHAR},\n      </if>      \n      <if test=\"nextNodeInstances != null\">\n        next_node_instances = #{nextNodeInstances,jdbcType=VARCHAR},\n      </if>\n      <if test=\"vars != null\">\n        vars = #{vars,jdbcType=OTHER},\n      </if>\n      <if test=\"extData != null\">\n        ext_data = #{extData,jdbcType=OTHER},\n      </if>\n    </set>\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </update>\n  <update id=\"updateByPrimaryKey\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessNodeInstance\">\n    update process_node_instance\n    set node_instance_no = #{nodeInstanceNo,jdbcType=VARCHAR},\n      process_instance_no = #{processInstanceNo,jdbcType=VARCHAR},\n      process_def_id = #{processDefId,jdbcType=VARCHAR},\n      node_id = #{nodeId,jdbcType=VARCHAR},\n      start_time = #{startTime,jdbcType=TIMESTAMP},\n      end_time = #{endTime,jdbcType=TIMESTAMP},\n      status = #{status,jdbcType=VARCHAR},\n      product_code = #{productCode,jdbcType=VARCHAR},\n      executors = #{executors,jdbcType=VARCHAR},\n      previous_node_instances = #{previousNodeInstances,jdbcType=VARCHAR},\n      next_node_instances = #{nextNodeInstances,jdbcType=VARCHAR},\n      vars = #{vars,jdbcType=OTHER},\n      ext_data = #{extData,jdbcType=OTHER}\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </update>\n  \n  <update id=\"updateByProcessNodeInstanceNo\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessNodeInstance\">\n    update process_node_instance\n    set \n      process_instance_no = #{processInstanceNo,jdbcType=VARCHAR},\n      process_def_id = #{processDefId,jdbcType=VARCHAR},\n      node_id = #{nodeId,jdbcType=VARCHAR},\n      start_time = #{startTime,jdbcType=TIMESTAMP},\n      end_time = #{endTime,jdbcType=TIMESTAMP},\n      status = #{status,jdbcType=VARCHAR},\n      product_code = #{productCode,jdbcType=VARCHAR},\n      executors = #{executors,jdbcType=VARCHAR},\n      previous_node_instances = #{previousNodeInstances,jdbcType=VARCHAR},\n      next_node_instances = #{nextNodeInstances,jdbcType=VARCHAR},\n      vars = #{vars,jdbcType=OTHER},\n      ext_data = #{extData,jdbcType=OTHER}\n    where node_instance_no = #{nodeInstanceNo,jdbcType=VARCHAR} and deleted=0\n  </update>  \n  \n    <update id=\"deleteByProcessNodeInstanceNo\" parameterType=\"java.lang.String\">\n    update process_node_instance\n    set \n      deleted=1\n    where node_instance_no = #{nodeInstanceNo,jdbcType=VARCHAR} and deleted=0\n  </update>  \n  \n  <select id=\"getOpenNodeInstance\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_node_instance\n    where process_instance_no=#{processInstanceNo} and node_id=#{nodeId} and status in ('ACTIVE','INACTIVE') and deleted=0\n  </select>  \n  \n  <select id=\"findNodeInstances\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_node_instance\n    <where> deleted=0\n      <if test=\"processInstanceNo != null\">\n         and process_instance_no = #{processInstanceNo,jdbcType=VARCHAR}\n      </if>\n      <if test=\"nodeId != null\">\n        and node_id = #{nodeId}\n      </if>\n      <if test=\"status != null and status.size>0\">\n        AND `status` IN\n        <foreach collection=\"status\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n          #{item}\n        </foreach>\n      </if>\n    </where>\n  </select>  \n  \n    <select id=\"selectByNodeInstanceNo\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_node_instance\n    where node_instance_no=#{nodeInstanceNo} and deleted=0\n  </select>  \n  <select id=\"findActiveNodeInstances\"  resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_node_instance\n    where process_instance_no=#{processInstanceNo} and status='ACTIVE' and deleted=0\n  </select>  \n  \n  <select id=\"findOpenNodeInstances\"  resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_node_instance\n    where process_instance_no=#{processInstanceNo} and status!='CLOSE' and status!='INVALID' and deleted=0\n  </select>\n  \n    <select id=\"queryNodeInstanceByNos\" resultMap=\"BaseResultMap\">\n    select\n    <include refid=\"Base_Column_List\"/>\n    from process_node_instance\n    <where>\n      deleted = 0 and node_instance_no in\n      <foreach collection=\"nodeInstanceNos\" item=\"nodeInstanceNo\" open=\"(\" separator=\",\" close=\")\">\n        #{nodeInstanceNo}\n      </foreach>\n    </where>\n  </select>\n\n</mapper>"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/resources/easyflow/mapper/ProcessTaskAssignMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.jd.easyflow.process.infrastructure.persistence.mapper.ProcessTaskAssignMapper\">\n  <resultMap id=\"BaseResultMap\" type=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessTaskAssign\">\n    <id column=\"id\" jdbcType=\"BIGINT\" property=\"id\" />\n    <result column=\"assign_no\" jdbcType=\"VARCHAR\" property=\"assignNo\" />\n    <result column=\"task_no\" jdbcType=\"VARCHAR\" property=\"taskNo\" />\n    <result column=\"assign_type\" jdbcType=\"VARCHAR\" property=\"assignType\" />\n    <result column=\"assign_group\" jdbcType=\"VARCHAR\" property=\"assignGroup\" />\n    <result column=\"assign_group2\" jdbcType=\"VARCHAR\" property=\"assignGroup2\" />\n    <result column=\"assign_user\" jdbcType=\"VARCHAR\" property=\"assignUser\" />\n    <result column=\"status\" jdbcType=\"VARCHAR\" property=\"status\" />\n    <result column=\"assign_time\" jdbcType=\"TIMESTAMP\" property=\"assignTime\" />\n    <result column=\"product_code\" jdbcType=\"VARCHAR\" property=\"productCode\" />\n    <result column=\"ext_data\" jdbcType=\"OTHER\" property=\"extData\" />\n    <result column=\"created_date\" jdbcType=\"TIMESTAMP\" property=\"createdDate\" />\n    <result column=\"modified_date\" jdbcType=\"TIMESTAMP\" property=\"modifiedDate\" />\n    <result column=\"deleted\" jdbcType=\"BIT\" property=\"deleted\" />\n  </resultMap>\n  <sql id=\"Base_Column_List\">\n    id, assign_no, task_no, assign_type, assign_group,assign_group2, assign_user, status, assign_time, \n    product_code, ext_data, created_date, modified_date, deleted\n  </sql>\n  <select id=\"selectByPrimaryKey\" parameterType=\"java.lang.Long\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_task_assign\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </select>\n  <delete id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Long\">\n    update process_task_assign set deleted=1\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </delete>\n  <insert id=\"insert\" keyColumn=\"id\" keyProperty=\"id\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessTaskAssign\" useGeneratedKeys=\"true\">\n    insert into process_task_assign (assign_no, task_no, assign_type, \n      assign_group, assign_group2, assign_user, status, \n      assign_time,\n      product_code, ext_data)\n    values (#{assignNo,jdbcType=VARCHAR}, #{taskNo,jdbcType=VARCHAR}, #{assignType,jdbcType=VARCHAR}, \n      #{assignGroup,jdbcType=VARCHAR},#{assignGroup2,jdbcType=VARCHAR}, #{assignUser,jdbcType=VARCHAR}, #{status,jdbcType=VARCHAR}, \n      #{assignTime,jdbcType=TIMESTAMP}, \n      #{productCode,jdbcType=VARCHAR}, #{extData,jdbcType=OTHER})\n  </insert>\n  <insert id=\"insertWithCreatedDate\" keyColumn=\"id\" keyProperty=\"id\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessTaskAssign\" useGeneratedKeys=\"true\">\n    insert into process_task_assign (assign_no, task_no, assign_type, \n      assign_group, assign_group2, assign_user, status, \n      assign_time,\n      product_code, ext_data, created_date)\n    values (#{assignNo,jdbcType=VARCHAR}, #{taskNo,jdbcType=VARCHAR}, #{assignType,jdbcType=VARCHAR}, \n      #{assignGroup,jdbcType=VARCHAR},#{assignGroup2,jdbcType=VARCHAR}, #{assignUser,jdbcType=VARCHAR}, #{status,jdbcType=VARCHAR}, \n      #{assignTime,jdbcType=TIMESTAMP}, \n      #{productCode,jdbcType=VARCHAR}, #{extData,jdbcType=OTHER}, #{createdDate,jdbcType=TIMESTAMP})\n  </insert>  \n  <update id=\"updateByPrimaryKeySelective\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessTaskAssign\">\n    update process_task_assign\n    <set>\n      <if test=\"assignNo != null\">\n        assign_no = #{assignNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"taskNo != null\">\n        task_no = #{taskNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"assignType != null\">\n        assign_type = #{assignType,jdbcType=VARCHAR},\n      </if>\n      <if test=\"assignGroup != null\">\n        assign_group = #{assignGroup,jdbcType=VARCHAR},\n      </if>\n      <if test=\"assignGroup2 != null\">\n        assign_group2 = #{assignGroup2,jdbcType=VARCHAR},\n      </if>      \n      <if test=\"assignUser != null\">\n        assign_user = #{assignUser,jdbcType=VARCHAR},\n      </if>\n      <if test=\"status != null\">\n        status = #{status,jdbcType=VARCHAR},\n      </if>\n      <if test=\"assignTime != null\">\n        assign_time = #{assignTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"productCode != null\">\n        product_code = #{productCode,jdbcType=VARCHAR},\n      </if>\n      <if test=\"extData != null\">\n        ext_data = #{extData,jdbcType=OTHER},\n      </if>\n    </set>\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </update>\n  <update id=\"updateByPrimaryKey\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessTaskAssign\">\n    update process_task_assign\n    set assign_no = #{assignNo,jdbcType=VARCHAR},\n      task_no = #{taskNo,jdbcType=VARCHAR},\n      assign_type = #{assignType,jdbcType=VARCHAR},\n      assign_group = #{assignGroup,jdbcType=VARCHAR},\n      assign_group2 = #{assignGroup2,jdbcType=VARCHAR},\n      assign_user = #{assignUser,jdbcType=VARCHAR},\n      status = #{status,jdbcType=VARCHAR},\n      assign_time = #{assignTime,jdbcType=TIMESTAMP},\n      product_code = #{productCode,jdbcType=VARCHAR},\n      ext_data = #{extData,jdbcType=OTHER}\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </update>\n  <update id=\"updateByTaskAssignNo\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessTaskAssign\">\n    update process_task_assign\n    set \n      task_no = #{taskNo,jdbcType=VARCHAR},\n      assign_type = #{assignType,jdbcType=VARCHAR},\n      assign_group = #{assignGroup,jdbcType=VARCHAR},\n      assign_group2 = #{assignGroup2,jdbcType=VARCHAR},\n      assign_user = #{assignUser,jdbcType=VARCHAR},\n      status = #{status,jdbcType=VARCHAR},\n      assign_time = #{assignTime,jdbcType=TIMESTAMP},\n      product_code = #{productCode,jdbcType=VARCHAR},\n      ext_data = #{extData,jdbcType=OTHER}\n    where assign_no = #{assignNo,jdbcType=VARCHAR} and deleted=0\n  </update>\n  <update id=\"deleteTaskAssignByAssignNo\" parameterType=\"java.lang.String\">\n    update process_task_assign\n    set \n      deleted=1\n    where assign_no = #{assignNo,jdbcType=VARCHAR} and deleted=0\n  </update>  \n  \n    \n    <select id=\"list\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_task_assign\n    <where> deleted=0\n      <if test=\"id != null\">\n         and id = #{id}\n      </if>\n      <if test=\"assignNo != null\">\n        and assign_no = #{assignNo}\n      </if>\n      <if test=\"taskNo != null\">\n        and task_no = #{taskNo}\n      </if>      \n      <if test=\"assignType != null\">\n        and assign_type = #{assignType}\n      </if>\n      <if test=\"assignGroup != null\">\n        and assign_group = #{assignGroup}\n      </if>   \n      <if test=\"assignGroup2 != null\">\n        and assign_group2 = #{assignGroup2}\n      </if>            \n      <if test=\"assignUser != null\">\n        and assign_user = #{assignUser}\n      </if>  \n      <if test=\"status != null\">\n        and status = #{status}\n      </if>    \n      <if test=\"assignTimeStart != null\">\n        and assign_time &gt;= #{assignTimeStart}\n      </if>  \n      <if test=\"assignTimeEnd != null\">\n        and assign_time &lt;= #{assignTimeEnd}\n      </if>  \n      <if test=\"createdDateStart != null\">\n        and created_date &gt;= #{createdDateStart}\n      </if>  \n      <if test=\"createdDateEnd != null\">\n        and created_date &lt;= #{createdDateEnd}\n      </if> \n      <if test=\"modifiedDateStart != null\">\n        and modifiedDate &gt;= #{modifiedDateStart}\n      </if>  \n      <if test=\"modifiedDateEnd != null\">\n        and modifiedDate &lt;= #{modifiedDateEnd}\n      </if>   \n    </where>\n  </select>\n\t<select id=\"listByTaskNoList\" resultMap=\"BaseResultMap\">\n\t\tselect\n\t\t<include refid=\"Base_Column_List\" />\n\t\tfrom process_task_assign\n\t\t<where>\n\t\t\tdeleted=0 and task_no in\n\t\t\t<foreach collection=\"taskNoList\" item=\"item\"\n\t\t\t\tindex=\"index\" open=\"(\" separator=\",\" close=\")\">\n\t\t\t\t#{item}\n\t\t\t</foreach>\n\t\t</where>\n\t</select>    \n</mapper>"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/resources/easyflow/mapper/ProcessTaskEventMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.jd.easyflow.process.infrastructure.persistence.mapper.ProcessTaskEventMapper\">\n  <resultMap id=\"BaseResultMap\" type=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessTaskEvent\">\n    <id column=\"id\" jdbcType=\"BIGINT\" property=\"id\" />\n    <result column=\"event_no\" jdbcType=\"VARCHAR\" property=\"eventNo\" />\n    <result column=\"task_no\" jdbcType=\"VARCHAR\" property=\"taskNo\" />\n    <result column=\"event_type\" jdbcType=\"VARCHAR\" property=\"eventType\" />\n    <result column=\"event_user\" jdbcType=\"VARCHAR\" property=\"eventUser\" />\n    <result column=\"event_time\" jdbcType=\"TIMESTAMP\" property=\"eventTime\" />\n    <result column=\"event_biz_result\" jdbcType=\"VARCHAR\" property=\"eventBizResult\" />\n    <result column=\"event_biz_data\" jdbcType=\"OTHER\" property=\"eventBizData\" />\n    <result column=\"instance_biz_status\" jdbcType=\"VARCHAR\" property=\"instanceBizStatus\" />\n    <result column=\"instance_biz_data\" jdbcType=\"OTHER\" property=\"instanceBizData\" />    \n    <result column=\"product_code\" jdbcType=\"VARCHAR\" property=\"productCode\" />\n    <result column=\"ext_data\" jdbcType=\"OTHER\" property=\"extData\" />\n    <result column=\"created_date\" jdbcType=\"TIMESTAMP\" property=\"createdDate\" />\n    <result column=\"modified_date\" jdbcType=\"TIMESTAMP\" property=\"modifiedDate\" />\n    <result column=\"deleted\" jdbcType=\"BIT\" property=\"deleted\" />\n  </resultMap>\n  <sql id=\"Base_Column_List\">\n    id, event_no, task_no, event_type, event_user, event_time, event_biz_result, event_biz_data, instance_biz_status, instance_biz_data, \n    product_code, ext_data, created_date, modified_date, deleted\n  </sql>\n  <select id=\"selectByPrimaryKey\" parameterType=\"java.lang.Long\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_task_event\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </select>\n  <delete id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Long\">\n    update process_task_event set deleted=1\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </delete>\n  <insert id=\"insert\" keyColumn=\"id\" keyProperty=\"id\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessTaskEvent\" useGeneratedKeys=\"true\">\n    insert into process_task_event (event_no, task_no, event_type, \n      event_user, event_time, event_biz_result, \n      event_biz_data, instance_biz_status,instance_biz_data, product_code, ext_data\n      )\n    values (#{eventNo,jdbcType=VARCHAR}, #{taskNo,jdbcType=VARCHAR}, #{eventType,jdbcType=VARCHAR}, \n      #{eventUser,jdbcType=VARCHAR}, #{eventTime,jdbcType=TIMESTAMP}, #{eventBizResult,jdbcType=VARCHAR}, \n      #{eventBizData,jdbcType=OTHER},#{instanceBizStatus,jdbcType=VARCHAR},#{instanceBizData,jdbcType=OTHER},  #{productCode,jdbcType=VARCHAR}, #{extData,jdbcType=OTHER}\n      )\n  </insert>\n  <insert id=\"insertWithCreatedDate\" keyColumn=\"id\" keyProperty=\"id\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessTaskEvent\" useGeneratedKeys=\"true\">\n    insert into process_task_event (event_no, task_no, event_type, \n      event_user, event_time, event_biz_result, \n      event_biz_data, instance_biz_status,instance_biz_data, product_code, ext_data, created_date\n      )\n    values (#{eventNo,jdbcType=VARCHAR}, #{taskNo,jdbcType=VARCHAR}, #{eventType,jdbcType=VARCHAR}, \n      #{eventUser,jdbcType=VARCHAR}, #{eventTime,jdbcType=TIMESTAMP}, #{eventBizResult,jdbcType=VARCHAR}, \n      #{eventBizData,jdbcType=OTHER},#{instanceBizStatus,jdbcType=VARCHAR},#{instanceBizData,jdbcType=OTHER},  #{productCode,jdbcType=VARCHAR}, #{extData,jdbcType=OTHER}, #{createdDate,jdbcType=TIMESTAMP}\n      )\n  </insert>  \n  <update id=\"updateByPrimaryKeySelective\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessTaskEvent\">\n    update process_task_event\n    <set>\n      <if test=\"eventNo != null\">\n        event_no = #{eventNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"taskNo != null\">\n        task_no = #{taskNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"eventType != null\">\n        event_type = #{eventType,jdbcType=VARCHAR},\n      </if>\n      <if test=\"eventUser != null\">\n        event_user = #{eventUser,jdbcType=VARCHAR},\n      </if>\n      <if test=\"eventTime != null\">\n        event_time = #{eventTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"eventBizResult != null\">\n        event_biz_result = #{eventBizResult,jdbcType=VARCHAR},\n      </if>\n      <if test=\"eventBizData != null\">\n        event_biz_data = #{eventBizData,jdbcType=OTHER},\n      </if>\n      <if test=\"instanceBizStatus != null\">\n        instance_biz_status = #{instanceBizStatus,jdbcType=VARCHAR},\n      </if>\n      <if test=\"instanceBizData != null\">\n        instance_biz_data = #{instanceBizData,jdbcType=OTHER},\n      </if>      \n      <if test=\"productCode != null\">\n        product_code = #{productCode,jdbcType=VARCHAR},\n      </if>\n      <if test=\"extData != null\">\n        ext_data = #{extData,jdbcType=OTHER},\n      </if>\n    </set>\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </update>\n  <update id=\"updateByPrimaryKey\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessTaskEvent\">\n    update process_task_event\n    set event_no = #{eventNo,jdbcType=VARCHAR},\n      task_no = #{taskNo,jdbcType=VARCHAR},\n      event_type = #{eventType,jdbcType=VARCHAR},\n      event_user = #{eventUser,jdbcType=VARCHAR},\n      event_time = #{eventTime,jdbcType=TIMESTAMP},\n      event_biz_result = #{eventBizResult,jdbcType=VARCHAR},\n      event_biz_data = #{eventBizData,jdbcType=OTHER},\n      instance_biz_status = #{instanceBizStatus,jdbcType=VARCHAR},\n      instance_biz_data = #{instanceBizData,jdbcType=OTHER},      \n      product_code = #{productCode,jdbcType=VARCHAR},\n      ext_data = #{extData,jdbcType=OTHER}\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </update>\n  <update id=\"updateByTaskEventNo\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessTaskEvent\">\n    update process_task_event\n    set \n      task_no = #{taskNo,jdbcType=VARCHAR},\n      event_type = #{eventType,jdbcType=VARCHAR},\n      event_user = #{eventUser,jdbcType=VARCHAR},\n      event_time = #{eventTime,jdbcType=TIMESTAMP},\n      event_biz_result = #{eventBizResult,jdbcType=VARCHAR},\n      event_biz_data = #{eventBizData,jdbcType=OTHER},\n      instance_biz_status = #{instanceBizStatus,jdbcType=VARCHAR},\n      instance_biz_data = #{instanceBizData,jdbcType=OTHER},      \n      product_code = #{productCode,jdbcType=VARCHAR},\n      ext_data = #{extData,jdbcType=OTHER}\n    where event_no = #{eventNo,jdbcType=VARCHAR} and deleted=0\n  </update>  \n  \n  <select id=\"list\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_task_event\n    <where> deleted=0\n      <if test=\"id != null\">\n         and id = #{id}\n      </if>\n      <if test=\"eventNo != null\">\n        and event_no = #{eventNo}\n      </if>      \n      <if test=\"taskNo != null\">\n        and task_no = #{taskNo}\n      </if> \n      <if test=\"eventType != null\">\n        and event_type = #{eventType}\n      </if>  \n      <if test=\"eventUser != null\">\n        and event_user = #{eventUser}\n      </if>    \n\n      <if test=\"productCode != null\">\n        and product_code = #{productCode}\n      </if>    \n      <if test=\"eventTimeStart != null\">\n        and event_time &gt;= #{eventTimeStart}\n      </if>  \n      <if test=\"eventTimeEnd != null\">\n        and event_time &lt;= #{eventTimeEnd}\n      </if>  \n      <if test=\"createdDateStart != null\">\n        and created_date &gt;= #{createdDateStart}\n      </if>  \n      <if test=\"createdDateEnd != null\">\n        and created_date &lt;= #{createdDateEnd}\n      </if> \n      <if test=\"modifiedDateStart != null\">\n        and modifiedDate &gt;= #{modifiedDateStart}\n      </if>  \n      <if test=\"modifiedDateEnd != null\">\n        and modifiedDate &lt;= #{modifiedDateEnd}\n      </if>                                                                                 \n    </where>\n  </select>  \n</mapper>"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/resources/easyflow/mapper/ProcessTaskMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.jd.easyflow.process.infrastructure.persistence.mapper.ProcessTaskMapper\">\n  <resultMap id=\"BaseResultMap\" type=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessTask\">\n    <id column=\"id\" jdbcType=\"BIGINT\" property=\"id\" />\n    <result column=\"task_no\" jdbcType=\"VARCHAR\" property=\"taskNo\" />\n    <result column=\"process_type\" jdbcType=\"VARCHAR\" property=\"processType\" />\n    <result column=\"biz_no\" jdbcType=\"VARCHAR\" property=\"bizNo\" />\n    <result column=\"task_biz_code\" jdbcType=\"VARCHAR\" property=\"taskBizCode\" />\n    <result column=\"task_biz_name\" jdbcType=\"VARCHAR\" property=\"taskBizName\" />\n    <result column=\"task_type\" jdbcType=\"VARCHAR\" property=\"taskType\" />\n    <result column=\"process_instance_no\" jdbcType=\"VARCHAR\" property=\"processInstanceNo\" />\n    <result column=\"node_instance_no\" jdbcType=\"VARCHAR\" property=\"nodeInstanceNo\" />\n    <result column=\"node_execution_no\" jdbcType=\"VARCHAR\" property=\"nodeExecutionNo\" />\n    <result column=\"assign_type\" jdbcType=\"VARCHAR\" property=\"assignType\" />\n    <result column=\"assign_info\" jdbcType=\"OTHER\" property=\"assignInfo\" />\n    <result column=\"assign_time\" jdbcType=\"TIMESTAMP\" property=\"assignTime\" />\n    <result column=\"executor\" jdbcType=\"VARCHAR\" property=\"executor\" />\n    <result column=\"execute_biz_result\" jdbcType=\"VARCHAR\" property=\"executeBizResult\" />\n    <result column=\"execute_biz_data\" jdbcType=\"OTHER\" property=\"executeBizData\" />\n    <result column=\"execute_time\" jdbcType=\"TIMESTAMP\" property=\"executeTime\" />\n    <result column=\"product_code\" jdbcType=\"VARCHAR\" property=\"productCode\" />\n    <result column=\"creator\" jdbcType=\"VARCHAR\" property=\"creator\" />\n    <result column=\"status\" jdbcType=\"VARCHAR\" property=\"status\" />\n    <result column=\"ext_data\" jdbcType=\"OTHER\" property=\"extData\" />\n    <result column=\"process_instance_key_field\" jdbcType=\"VARCHAR\" property=\"processInstanceKeyField\" />\n    <result column=\"process_instance_key_field2\" jdbcType=\"VARCHAR\" property=\"processInstanceKeyField2\" />\n    <result column=\"created_date\" jdbcType=\"TIMESTAMP\" property=\"createdDate\" />\n    <result column=\"modified_date\" jdbcType=\"TIMESTAMP\" property=\"modifiedDate\" />\n    <result column=\"deleted\" jdbcType=\"BIT\" property=\"deleted\" />\n  </resultMap>\n  <sql id=\"Base_Column_List\">\n    id, task_no, process_type, biz_no, task_biz_code, task_biz_name, task_type, process_instance_no, \n    node_instance_no, node_execution_no, assign_type, assign_info, assign_time, executor, \n    execute_biz_result, execute_biz_data, execute_time, product_code, creator, status, ext_data, process_instance_key_field,process_instance_key_field2,\n    created_date, modified_date, deleted\n  </sql>\n  <select id=\"selectByPrimaryKey\" parameterType=\"java.lang.Long\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_task\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </select>\n  <delete id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Long\">\n    update process_task set deleted=1\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </delete>\n  <insert id=\"insert\" keyColumn=\"id\" keyProperty=\"id\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessTask\" useGeneratedKeys=\"true\">\n    insert into process_task (task_no, process_type, biz_no, \n      task_biz_code, task_biz_name, task_type, process_instance_no, \n      node_instance_no, node_execution_no, assign_type, \n      assign_info, assign_time, executor, \n      execute_biz_result, execute_biz_data, execute_time, \n      product_code, creator, status, ext_data, process_instance_key_field, process_instance_key_field2\n      )\n    values (#{taskNo,jdbcType=VARCHAR}, #{processType,jdbcType=VARCHAR}, #{bizNo,jdbcType=VARCHAR}, \n      #{taskBizCode,jdbcType=VARCHAR},#{taskBizName,jdbcType=VARCHAR}, #{taskType,jdbcType=VARCHAR}, #{processInstanceNo,jdbcType=VARCHAR}, \n      #{nodeInstanceNo,jdbcType=VARCHAR}, #{nodeExecutionNo,jdbcType=VARCHAR}, #{assignType,jdbcType=VARCHAR}, \n      #{assignInfo,jdbcType=OTHER}, #{assignTime,jdbcType=TIMESTAMP}, #{executor,jdbcType=VARCHAR}, \n      #{executeBizResult,jdbcType=VARCHAR}, #{executeBizData,jdbcType=OTHER}, #{executeTime,jdbcType=TIMESTAMP}, \n      #{productCode,jdbcType=VARCHAR},#{creator,jdbcType=VARCHAR}, #{status,jdbcType=VARCHAR}, #{extData,jdbcType=OTHER}, #{processInstanceKeyField,jdbcType=VARCHAR}, #{processInstanceKeyField2,jdbcType=VARCHAR}\n      )\n  </insert>\n  <insert id=\"insertWithCreatedDate\" keyColumn=\"id\" keyProperty=\"id\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessTask\" useGeneratedKeys=\"true\">\n    insert into process_task (task_no, process_type, biz_no, \n      task_biz_code, task_biz_name, task_type, process_instance_no, \n      node_instance_no, node_execution_no, assign_type, \n      assign_info, assign_time, executor, \n      execute_biz_result, execute_biz_data, execute_time, \n      product_code, creator, status, ext_data, process_instance_key_field,process_instance_key_field2, created_date\n      )\n    values (#{taskNo,jdbcType=VARCHAR}, #{processType,jdbcType=VARCHAR}, #{bizNo,jdbcType=VARCHAR}, \n      #{taskBizCode,jdbcType=VARCHAR},#{taskBizName,jdbcType=VARCHAR}, #{taskType,jdbcType=VARCHAR}, #{processInstanceNo,jdbcType=VARCHAR}, \n      #{nodeInstanceNo,jdbcType=VARCHAR}, #{nodeExecutionNo,jdbcType=VARCHAR}, #{assignType,jdbcType=VARCHAR}, \n      #{assignInfo,jdbcType=OTHER}, #{assignTime,jdbcType=TIMESTAMP}, #{executor,jdbcType=VARCHAR}, \n      #{executeBizResult,jdbcType=VARCHAR}, #{executeBizData,jdbcType=OTHER}, #{executeTime,jdbcType=TIMESTAMP}, \n      #{productCode,jdbcType=VARCHAR},#{creator,jdbcType=VARCHAR}, #{status,jdbcType=VARCHAR}, #{extData,jdbcType=OTHER} , #{processInstanceKeyField,jdbcType=VARCHAR},#{processInstanceKeyField2,jdbcType=VARCHAR}, #{createdDate,jdbcType=TIMESTAMP}\n      )\n  </insert>  \n  <update id=\"updateByPrimaryKeySelective\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessTask\">\n    update process_task\n    <set>\n      <if test=\"taskNo != null\">\n        task_no = #{taskNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"processType != null\">\n        process_type = #{processType,jdbcType=VARCHAR},\n      </if>\n      <if test=\"bizNo != null\">\n        biz_no = #{bizNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"taskBizCode != null\">\n        task_biz_code = #{taskBizCode,jdbcType=VARCHAR},\n      </if>\n      <if test=\"taskBizName != null\">\n        task_biz_name = #{taskBizName,jdbcType=VARCHAR},\n      </if>      \n      <if test=\"taskType != null\">\n        task_type = #{taskType,jdbcType=VARCHAR},\n      </if>\n      <if test=\"processInstanceNo != null\">\n        process_instance_no = #{processInstanceNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"nodeInstanceNo != null\">\n        node_instance_no = #{nodeInstanceNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"nodeExecutionNo != null\">\n        node_execution_no = #{nodeExecutionNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"assignType != null\">\n        assign_type = #{assignType,jdbcType=VARCHAR},\n      </if>\n      <if test=\"assignInfo != null\">\n        assign_info = #{assignInfo,jdbcType=OTHER},\n      </if>\n      <if test=\"assignTime != null\">\n        assign_time = #{assignTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"executor != null\">\n        executor = #{executor,jdbcType=VARCHAR},\n      </if>\n      <if test=\"executeBizResult != null\">\n        execute_biz_result = #{executeBizResult,jdbcType=VARCHAR},\n      </if>\n      <if test=\"executeBizData != null\">\n        execute_biz_data = #{executeBizData,jdbcType=OTHER},\n      </if>\n      <if test=\"executeTime != null\">\n        execute_time = #{executeTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"productCode != null\">\n        product_code = #{productCode,jdbcType=VARCHAR},\n      </if>\n      <if test=\"creator != null\">\n        creator = #{creator,jdbcType=VARCHAR},\n      </if>      \n      <if test=\"status != null\">\n        status = #{status,jdbcType=VARCHAR},\n      </if>     \n      <if test=\"extData != null\">\n        ext_data = #{extData,jdbcType=OTHER},\n      </if>\n      <if test=\"processInstanceKeyField != null\">\n        process_instance_key_field = #{processInstanceKeyField,jdbcType=OTHER},\n      </if>\n      <if test=\"processInstanceKeyField2 != null\">\n        process_instance_key_field2 = #{processInstanceKeyField2,jdbcType=OTHER},\n      </if>\n    </set>\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </update>\n  <update id=\"updateByPrimaryKey\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessTask\">\n    update process_task\n    set task_no = #{taskNo,jdbcType=VARCHAR},\n      process_type = #{processType,jdbcType=VARCHAR},\n      biz_no = #{bizNo,jdbcType=VARCHAR},\n      task_biz_code = #{taskBizCode,jdbcType=VARCHAR},\n      task_biz_name = #{taskBizName,jdbcType=VARCHAR},\n      task_type = #{taskType,jdbcType=VARCHAR},\n      process_instance_no = #{processInstanceNo,jdbcType=VARCHAR},\n      node_instance_no = #{nodeInstanceNo,jdbcType=VARCHAR},\n      node_execution_no = #{nodeExecutionNo,jdbcType=VARCHAR},\n      assign_type = #{assignType,jdbcType=VARCHAR},\n      assign_info = #{assignInfo,jdbcType=OTHER},\n      assign_time = #{assignTime,jdbcType=TIMESTAMP},\n      executor = #{executor,jdbcType=VARCHAR},\n      execute_biz_result = #{executeBizResult,jdbcType=VARCHAR},\n      execute_biz_data = #{executeBizData,jdbcType=OTHER},\n      execute_time = #{executeTime,jdbcType=TIMESTAMP},\n      product_code = #{productCode,jdbcType=VARCHAR},\n      creator = #{creator,jdbcType=VARCHAR},\n      status = #{status,jdbcType=VARCHAR},\n      ext_data = #{extData,jdbcType=OTHER},\n      process_instance_key_field = #{processInstanceKeyField,jdbcType=OTHER},\n      process_instance_key_field2 = #{processInstanceKeyField2,jdbcType=OTHER}\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </update>\n  \n    <update id=\"updateByTaskNo\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessTask\">\n    update process_task\n    set\n      process_type = #{processType,jdbcType=VARCHAR},\n      biz_no = #{bizNo,jdbcType=VARCHAR},\n      task_biz_code = #{taskBizCode,jdbcType=VARCHAR},\n      task_biz_name = #{taskBizName,jdbcType=VARCHAR},\n      task_type = #{taskType,jdbcType=VARCHAR},\n      process_instance_no = #{processInstanceNo,jdbcType=VARCHAR},\n      node_instance_no = #{nodeInstanceNo,jdbcType=VARCHAR},\n      node_execution_no = #{nodeExecutionNo,jdbcType=VARCHAR},\n      assign_type = #{assignType,jdbcType=VARCHAR},\n      assign_info = #{assignInfo,jdbcType=OTHER},\n      assign_time = #{assignTime,jdbcType=TIMESTAMP},\n      executor = #{executor,jdbcType=VARCHAR},\n      execute_biz_result = #{executeBizResult,jdbcType=VARCHAR},\n      execute_biz_data = #{executeBizData,jdbcType=OTHER},\n      execute_time = #{executeTime,jdbcType=TIMESTAMP},\n      product_code = #{productCode,jdbcType=VARCHAR},\n      creator = #{creator,jdbcType=VARCHAR},\n      status = #{status,jdbcType=VARCHAR},\n      ext_data = #{extData,jdbcType=OTHER},\n      process_instance_key_field = #{processInstanceKeyField,jdbcType=OTHER},\n      process_instance_key_field2 = #{processInstanceKeyField2,jdbcType=OTHER}\n    where task_no = #{taskNo,jdbcType=VARCHAR} and deleted=0\n  </update>\n  \n <update id=\"deleteByTaskNo\" parameterType=\"java.lang.String\">\n    update process_task\n    set\n      deleted=1\n    where task_no = #{taskNo,jdbcType=VARCHAR} and deleted=0\n  </update>\n  \n    <select id=\"list\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_task\n    <where> deleted=0\n      <if test=\"id != null\">\n         and id = #{id}\n      </if>\n      <if test=\"taskNo != null\">\n        and task_no = #{taskNo}\n      </if>\n      <if test=\"processType != null\">\n        and process_type = #{processType}\n      </if>\n      <if test=\"bizNo != null\">\n        and biz_no = #{bizNo}\n      </if>      \n      <if test=\"taskBizCode != null\">\n        and task_biz_code = #{taskBizCode}\n      </if>  \n      <if test=\"taskType != null\">\n        and task_type = #{taskType}\n      </if>    \n      <if test=\"processInstanceNo != null\">\n        and process_instance_no = #{processInstanceNo}\n      </if> \n      <if test=\"nodeInstanceNo != null\">\n        and node_instance_no = #{nodeInstanceNo}\n      </if> \n      <if test=\"assignType != null\">\n        and assign_type = #{assignType}\n      </if>  \n      <if test=\"executor != null\">\n        and executor = #{executor}\n      </if>   \n      <if test=\"productCode != null\">\n        and product_code = #{productCode}\n      </if>  \n      <if test=\"creator != null\">\n        and creator = #{creator}\n      </if>        \n      <if test=\"status != null\">\n        and status = #{status}\n      </if>  \n      <if test=\"assignTimeStart != null\">\n        and assign_time &gt;= #{assignTimeStart}\n      </if>  \n      <if test=\"assignTimeEnd != null\">\n        and assign_time &lt;= #{assignTimeEnd}\n      </if>  \n      <if test=\"executeTimeStart != null\">\n        and execute_time &gt;= #{executeTimeStart}\n      </if>  \n      <if test=\"executeTimeEnd != null\">\n        and execute_time &lt;= #{executeTimeEnd}\n      </if> \n      <if test=\"createdDateStart != null\">\n        and created_date &gt;= #{createdDateStart}\n      </if>  \n      <if test=\"createdDateEnd != null\">\n        and created_date &lt;= #{createdDateEnd}\n      </if> \n      <if test=\"modifiedDateStart != null\">\n        and modified_date &gt;= #{modifiedDateStart}\n      </if>  \n      <if test=\"modifiedDateEnd != null\">\n        and modified_date &lt;= #{modifiedDateEnd}\n      </if>  \n      <if test=\"processInstanceKeyField != null\">\n        and process_instance_key_field = #{processInstanceKeyField}\n      </if>\n      <if test=\"processInstanceKeyField2 != null\">\n        and process_instance_key_field2 like CONCAT(#{processInstanceKeyField2},'%')\n      </if>\n    </where>\n  </select>  \n\n  <select id=\"countTaskByPagerCondition\" parameterType=\"com.jd.easyflow.common.dto.pager.PagerCondition\" resultType=\"long\">\n    select\n    count(1)\n    from process_task\n    <include refid=\"pagerQueryTaskWhere\" />\n  </select>\n\n  <select id=\"selectTaskByPagerCondition\" parameterType=\"com.jd.easyflow.common.dto.pager.PagerCondition\" resultMap=\"BaseResultMap\">\n    select\n    <include refid=\"Base_Column_List\" />\n    from process_task\n    <include refid=\"pagerQueryTaskWhere\" />\n\t<if test=\"sortMap.createdDate != null\">\n\t\torder by created_date ${sortMap.createdDate.type}, id  ${sortMap.createdDate.type}\n\t</if>\n    limit #{start},#{pageSize}\n  </select>\n\n  <sql id=\"pagerQueryTaskWhere\">\n    <where> deleted = 0\n      <if test=\"fieldMap.taskNo != null\">\n        and task_no=#{fieldMap.taskNo.value}\n      </if>\n      <if test=\"fieldMap.taskNoList != null\">\n        and task_no in \n        <foreach collection=\"fieldMap.taskNoList.value\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n                #{item}       \n        </foreach>\n      </if>   \n            <if test=\"fieldMap.statusList != null\">\n        and status in \n        <foreach collection=\"fieldMap.statusList.value\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n                #{item}       \n        </foreach>\n      </if>          \n      <if test=\"fieldMap.processType != null\">\n        and process_type=#{fieldMap.processType.value}\n      </if>\n      <if test=\"fieldMap.bizNo != null\">\n        and biz_no=#{fieldMap.bizNo.value}\n      </if>\n      <if test=\"fieldMap.processInstanceNo != null\">\n        and process_instance_no=#{fieldMap.processInstanceNo.value}\n      </if> \n      <if test=\"fieldMap.nodeInstanceNo != null\">\n        and node_instance_no=#{fieldMap.nodeInstanceNo.value}\n      </if>              \n      <if test=\"fieldMap.taskBizCode != null\">\n        and task_biz_code=#{fieldMap.taskBizCode.value}\n      </if>      \n      <if test=\"fieldMap.productCode != null\">\n        and product_code=#{fieldMap.productCode.value}\n      </if>\n      <if test=\"fieldMap.productCodeList != null\">\n        and (product_code is null or product_code in\n        <foreach collection=\"fieldMap.productCodeList.value\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n          #{item}\n        </foreach>\n        )\n      </if>\n      <if test=\"fieldMap.creator != null\">\n        and creator=#{fieldMap.creator.value}\n      </if>      \n      <if test=\"fieldMap.executor != null\">\n        and executor=#{fieldMap.executor.value}\n      </if>\n      <if test=\"fieldMap.status != null\">\n        and status=#{fieldMap.status.value}\n      </if>\n      <if test=\"fieldMap.createdDateStart != null\">\n        and created_date &gt;=#{fieldMap.createdDate.value}\n      </if> \n      <if test=\"fieldMap.createdDateEnd != null\">\n        and created_date &lt;=#{fieldMap.createdDate.value}\n      </if>     \n      <if test=\"fieldMap.processInstanceKeyField != null\">\n        and process_instance_key_field =#{fieldMap.processInstanceKeyField.value}\n      </if>\n      <if test=\"fieldMap.processInstanceKeyField2 != null\">\n        and process_instance_key_field2 like CONCAT(#{fieldMap.processInstanceKeyField2.value},'%')\n      </if>\n    </where>\n  </sql>\n  \n  <select id=\"countTaskAndAssignByPagerCondition\" parameterType=\"com.jd.easyflow.common.dto.pager.PagerCondition\" resultType=\"long\">\n    select\n    count(distinct task.task_no)\n    from process_task task, process_task_assign assign\n    <include refid=\"pagerQueryTaskAndAssignWhere\" />\n  </select>\n\n  <select id=\"selectTaskAndAssignByPagerCondition\" parameterType=\"com.jd.easyflow.common.dto.pager.PagerCondition\" resultMap=\"BaseResultMap\">\n    select\n    distinct task.task_no,task.created_date,task.id\n    from process_task task, process_task_assign assign\n    <include refid=\"pagerQueryTaskAndAssignWhere\" />\n        <if test=\"sortMap.createdDate != null\">\n        order by task.created_date ${sortMap.createdDate.type}, task.id  ${sortMap.createdDate.type}\n    </if>\n    limit #{start},#{pageSize}\n  </select>\n\n\n  <sql id=\"pagerQueryTaskAndAssignWhere\">\n    <where> task.deleted = 0 and assign.deleted=0 and task.task_no=assign.task_no\n      <if test=\"fieldMap.taskNo != null\">\n        and task.task_no=#{fieldMap.taskNo.value}\n      </if>\n            <if test=\"fieldMap.taskNoList != null\">\n        and task.task_no in \n        <foreach collection=\"fieldMap.taskNoList.value\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n                #{item}       \n        </foreach>\n      </if>  \n            <if test=\"fieldMap.statusList != null\">\n        and task.status in \n        <foreach collection=\"fieldMap.statusList.value\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n                #{item}       \n        </foreach>\n      </if>         \n      <if test=\"fieldMap.processType != null\">\n        and task.process_type=#{fieldMap.processType.value}\n      </if>\n      <if test=\"fieldMap.bizNo != null\">\n        and task.biz_no=#{fieldMap.bizNo.value}\n      </if>\n      <if test=\"fieldMap.processInstanceNo != null\">\n        and task.process_instance_no=#{fieldMap.processInstanceNo.value}\n      </if> \n      <if test=\"fieldMap.nodeInstanceNo != null\">\n        and task.node_instance_no=#{fieldMap.nodeInstanceNo.value}\n      </if>                 \n      <if test=\"fieldMap.taskBizCode != null\">\n        and task.task_biz_code=#{fieldMap.taskBizCode.value}\n      </if>      \n      <if test=\"fieldMap.productCode != null\">\n        and task.product_code=#{fieldMap.productCode.value}\n      </if>\n      <if test=\"fieldMap.productCodeList != null\">\n        and (task.product_code is null or task.product_code in\n        <foreach collection=\"fieldMap.productCodeList.value\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n          #{item}\n        </foreach>\n        )\n      </if>\n      <if test=\"fieldMap.creator != null\">\n        and task.creator=#{fieldMap.creator.value}\n      </if>      \n      <if test=\"fieldMap.executor != null\">\n        and task.executor=#{fieldMap.executor.value}\n      </if>\n      <if test=\"fieldMap.status != null\">\n        and task.status=#{fieldMap.status.value}\n      </if>\n      <if test=\"fieldMap.createdDateStart != null\">\n        and task.created_date &gt;=#{fieldMap.createdDate.value}\n      </if> \n      <if test=\"fieldMap.createdDateEnd != null\">\n        and task.created_date &lt;=#{fieldMap.createdDate.value}\n      </if>\n\n      <if test=\"fieldMap.assignStatus != null\">\n        and assign.status =#{fieldMap.assignStatus.value}\n      </if>   \n      <if test=\"fieldMap.processInstanceKeyField != null\">\n        and task.process_instance_key_field =#{fieldMap.processInstanceKeyField.value}\n      </if>\n      <if test=\"fieldMap.processInstanceKeyField2 != null\">\n        and task.process_instance_key_field2 like CONCAT(#{fieldMap.processInstanceKeyField2.value},'%')\n      </if>\n      and (\n      <trim prefixOverrides=\"OR\">\n      <if test=\"fieldMap.assignUser != null\">\n          or assign.assign_user =#{fieldMap.assignUser.value}\n      </if> \n      <if test=\"fieldMap.assignGroupList != null\">\n        or  (assign.assign_group in \n            <foreach collection=\"fieldMap.assignGroupList.value\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n                #{item}       \n        </foreach> \n         and assign.assign_group2 is null)\n      </if> \n      <if test=\"fieldMap.assignGroup2List!=null\">\n              or  (assign.assign_group2 in \n            <foreach collection=\"fieldMap.assignGroup2List.value\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n                #{item}       \n        </foreach> \n         and assign.assign_group is null)\n      </if>   \n      <if test=\"fieldMap.assignGroupList != null&amp;&amp; fieldMap.assignGroup2List!=null\">\n        or  (assign.assign_group in \n            <foreach collection=\"fieldMap.assignGroupList.value\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n                #{item}       \n        </foreach> \n        and assign.assign_group2 in\n            <foreach collection=\"fieldMap.assignGroup2List.value\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n                #{item}       \n        </foreach> )        \n      </if>      \n      </trim>         \n      )         \n                         \n    </where>\n  </sql>\n\n  \n</mapper>"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/resources/easyflow/mapper/ProcessUnitExecutionMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.jd.easyflow.processunit.infrastructure.persistence.mapper.ProcessUnitExecutionMapper\">\n  <resultMap id=\"BaseResultMap\" type=\"com.jd.easyflow.processunit.infrastructure.persistence.po.ProcessUnitExecution\">\n    <id column=\"id\" jdbcType=\"BIGINT\" property=\"id\" />\n    <result column=\"execution_no\" jdbcType=\"VARCHAR\" property=\"executionNo\" />\n    <result column=\"request_no\" jdbcType=\"VARCHAR\" property=\"requestNo\" />\n    <result column=\"parent_no\" jdbcType=\"VARCHAR\" property=\"parentNo\" />\n    <result column=\"process_unit_code\" jdbcType=\"VARCHAR\" property=\"processUnitCode\" />\n    <result column=\"biz_no\" jdbcType=\"VARCHAR\" property=\"bizNo\" />\n    <result column=\"instance_no\" jdbcType=\"VARCHAR\" property=\"instanceNo\" />\n    <result column=\"product_code\" jdbcType=\"VARCHAR\" property=\"productCode\" />\n    <result column=\"result\" jdbcType=\"VARCHAR\" property=\"result\" />\n    <result column=\"request_time\" jdbcType=\"TIMESTAMP\" property=\"requestTime\" />\n    <result column=\"response_time\" jdbcType=\"TIMESTAMP\" property=\"responseTime\" />\n    <result column=\"elaspe_time\" jdbcType=\"INTEGER\" property=\"elaspeTime\" />\n    <result column=\"exec_type\" jdbcType=\"VARCHAR\" property=\"execType\" />\n    <result column=\"request_content\" jdbcType=\"LONGVARCHAR\" property=\"requestContent\" />\n    <result column=\"response_content\" jdbcType=\"LONGVARCHAR\" property=\"responseContent\" />\n    <result column=\"ext_data\" jdbcType=\"OTHER\" property=\"extData\" />\n    <result column=\"created_date\" jdbcType=\"TIMESTAMP\" property=\"createdDate\" />\n    <result column=\"modified_date\" jdbcType=\"TIMESTAMP\" property=\"modifiedDate\" />\n    <result column=\"deleted\" jdbcType=\"BIT\" property=\"deleted\" />\n  </resultMap>\n  <sql id=\"Base_Column_List\">\n    id, execution_no, request_no, parent_no, process_unit_code, biz_no, instance_no, product_code, \n    result, request_time, response_time, elaspe_time, exec_type, request_content, response_content, ext_data, created_date, \n    modified_date, deleted\n  </sql>\n  <select id=\"selectByPrimaryKey\" parameterType=\"java.lang.Long\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_unit_execution\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </select>\n  <insert id=\"insert\" keyColumn=\"id\" keyProperty=\"id\" parameterType=\"com.jd.easyflow.processunit.infrastructure.persistence.po.ProcessUnitExecution\" useGeneratedKeys=\"true\">\n    insert into process_unit_execution (execution_no, request_no, parent_no, \n      process_unit_code, biz_no, instance_no, product_code, \n      result, request_time, response_time, \n      elaspe_time, exec_type, ext_data, \n      request_content, response_content)\n    values (#{executionNo,jdbcType=VARCHAR}, #{requestNo,jdbcType=VARCHAR}, #{parentNo,jdbcType=VARCHAR}, \n      #{processUnitCode,jdbcType=VARCHAR},#{bizNo,jdbcType=VARCHAR}, #{instanceNo,jdbcType=VARCHAR}, #{productCode,jdbcType=VARCHAR}, \n      #{result,jdbcType=VARCHAR}, #{requestTime,jdbcType=TIMESTAMP}, #{responseTime,jdbcType=TIMESTAMP}, \n      #{elaspeTime,jdbcType=INTEGER}, #{execType,jdbcType=VARCHAR}, #{extData,jdbcType=OTHER}, \n      #{requestContent,jdbcType=LONGVARCHAR}, #{responseContent,jdbcType=LONGVARCHAR})\n  </insert>\n\n    <insert id=\"insertForMigration\" keyColumn=\"id\" keyProperty=\"id\" parameterType=\"com.jd.easyflow.processunit.infrastructure.persistence.po.ProcessUnitExecution\" useGeneratedKeys=\"true\">\n    insert into process_unit_execution (id, execution_no, request_no, parent_no, \n      process_unit_code, biz_no, instance_no, product_code, \n      result, request_time, response_time, \n      elaspe_time, exec_type, ext_data, \n      request_content, response_content, created_date, modified_date)\n    values (#{id, jdbcType=BIGINT}, #{executionNo,jdbcType=VARCHAR}, #{requestNo,jdbcType=VARCHAR}, #{parentNo,jdbcType=VARCHAR}, \n      #{processUnitCode,jdbcType=VARCHAR},#{bizNo,jdbcType=VARCHAR}, #{instanceNo,jdbcType=VARCHAR}, #{productCode,jdbcType=VARCHAR}, \n      #{result,jdbcType=VARCHAR}, #{requestTime,jdbcType=TIMESTAMP}, #{responseTime,jdbcType=TIMESTAMP}, \n      #{elaspeTime,jdbcType=INTEGER}, #{execType,jdbcType=VARCHAR}, #{extData,jdbcType=OTHER}, \n      #{requestContent,jdbcType=LONGVARCHAR}, #{responseContent,jdbcType=LONGVARCHAR},\n      #{createdDate,jdbcType=TIMESTAMP}, #{modifiedDate,jdbcType=TIMESTAMP})\n  </insert> \n   \n  <update id=\"updateByPrimaryKeySelective\" parameterType=\"com.jd.easyflow.processunit.infrastructure.persistence.po.ProcessUnitExecution\">\n    update process_unit_execution\n    <set>\n      <if test=\"executionNo != null\">\n        execution_no = #{executionNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"requestNo != null\">\n        request_no = #{requestNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"parentNo != null\">\n        parent_no = #{parentNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"processUnitCode != null\">\n        process_unit_code = #{processUnitCode,jdbcType=VARCHAR},\n      </if>\n      <if test=\"bizNo != null\">\n        biz_no = #{bizNo,jdbcType=VARCHAR},\n      </if>      \n      <if test=\"instanceNo != null\">\n        instance_no = #{instanceNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"productCode != null\">\n        product_code = #{productCode,jdbcType=VARCHAR},\n      </if>\n      <if test=\"result != null\">\n        result = #{result,jdbcType=VARCHAR},\n      </if>\n      <if test=\"requestTime != null\">\n        request_time = #{requestTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"responseTime != null\">\n        response_time = #{responseTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"elaspeTime != null\">\n        elaspe_time = #{elaspeTime,jdbcType=INTEGER},\n      </if>\n      <if test=\"execType != null\">\n        exec_type = #{execType,jdbcType=VARCHAR},\n      </if>\n      <if test=\"extData != null\">\n        ext_data = #{extData,jdbcType=OTHER},\n      </if>\n      <if test=\"createdDate != null\">\n        created_date = #{createdDate,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"modifiedDate != null\">\n        modified_date = #{modifiedDate,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"deleted != null\">\n        deleted = #{deleted,jdbcType=BIT},\n      </if>\n      <if test=\"requestContent != null\">\n        request_content = #{requestContent,jdbcType=LONGVARCHAR},\n      </if>\n      <if test=\"responseContent != null\">\n        response_content = #{responseContent,jdbcType=LONGVARCHAR},\n      </if>\n    </set>\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </update>\n  <update id=\"updateByPrimaryKey\" parameterType=\"com.jd.easyflow.processunit.infrastructure.persistence.po.ProcessUnitExecution\">\n    update process_unit_execution\n    set execution_no = #{executionNo,jdbcType=VARCHAR},\n      request_no = #{requestNo,jdbcType=VARCHAR},\n      parent_no = #{parentNo,jdbcType=VARCHAR},\n      process_unit_code = #{processUnitCode,jdbcType=VARCHAR},\n      biz_no = #{bizNo,jdbcType=VARCHAR},\n      instance_no = #{instanceNo,jdbcType=VARCHAR},\n      product_code = #{productCode,jdbcType=VARCHAR},\n      result = #{result,jdbcType=VARCHAR},\n      request_time = #{requestTime,jdbcType=TIMESTAMP},\n      response_time = #{responseTime,jdbcType=TIMESTAMP},\n      elaspe_time = #{elaspeTime,jdbcType=INTEGER},\n      exec_type = #{execType,jdbcType=VARCHAR},\n      ext_data = #{extData,jdbcType=OTHER},\n      request_content = #{requestContent,jdbcType=LONGVARCHAR},\n      response_content = #{responseContent,jdbcType=LONGVARCHAR}\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </update>\n\n  <update id=\"updateForMigration\" parameterType=\"com.jd.easyflow.processunit.infrastructure.persistence.po.ProcessUnitExecution\">\n    update process_unit_execution\n    set \n      request_no = #{requestNo,jdbcType=VARCHAR},\n      parent_no = #{parentNo,jdbcType=VARCHAR},\n      process_unit_code = #{processUnitCode,jdbcType=VARCHAR},\n      biz_no = #{bizNo,jdbcType=VARCHAR},\n      instance_no = #{instanceNo,jdbcType=VARCHAR},\n      product_code = #{productCode,jdbcType=VARCHAR},\n      result = #{result,jdbcType=VARCHAR},\n      request_time = #{requestTime,jdbcType=TIMESTAMP},\n      response_time = #{responseTime,jdbcType=TIMESTAMP},\n      elaspe_time = #{elaspeTime,jdbcType=INTEGER},\n      exec_type = #{execType,jdbcType=VARCHAR},\n      ext_data = #{extData,jdbcType=OTHER},\n      request_content = #{requestContent,jdbcType=LONGVARCHAR},\n      response_content = #{responseContent,jdbcType=LONGVARCHAR},\n      created_date = #{createdDate,jdbcType=TIMESTAMP},\n      modified_date =  #{modifiedDate,jdbcType=TIMESTAMP}      \n    where execution_no=#{executionNo} and deleted=0\n  </update>\n  \n  <select id=\"getByExecutionNo\"  resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_unit_execution\n    where execution_no=#{executionNo} and deleted=0\n  </select>\n\n  <select id=\"selectProcessUnitExecution\" resultMap=\"BaseResultMap\">\n    select\n    <include refid=\"Base_Column_List\"/>\n    from process_unit_execution\n    where deleted=0\n    <if test=\"instanceNos != null and instanceNos.size()>0 \">\n      AND instance_no IN\n      <foreach collection=\"instanceNos\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n        #{item}\n      </foreach>\n    </if>\n    <if test=\"instanceNos == null or instanceNos.size()==0 \">\n      and 1=0\n    </if>\n  </select>\n\n\n  <delete id=\"physicsDeleteProcessUnitExecution\">\n    delete from process_unit_execution\n    where 1=1\n    <if test=\"ids !=null and ids.size()>0 \">\n      AND id IN\n      <foreach collection=\"ids\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n        #{item}\n      </foreach>\n    </if>\n    <if test=\"ids ==null or ids.size()==0 \">\n      and 1 = 0\n    </if>\n  </delete>\n <update id=\"updateByExecutionNo\" parameterType=\"com.jd.easyflow.processunit.infrastructure.persistence.po.ProcessUnitExecution\">\n    update process_unit_execution\n    <set>\n      <if test=\"executionNo != null\">\n        execution_no = #{executionNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"requestNo != null\">\n        request_no = #{requestNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"parentNo != null\">\n        parent_no = #{parentNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"processUnitCode != null\">\n        process_unit_code = #{processUnitCode,jdbcType=VARCHAR},\n      </if>\n      <if test=\"bizNo != null\">\n        biz_no = #{bizNo,jdbcType=VARCHAR},\n      </if>      \n      <if test=\"instanceNo != null\">\n        instance_no = #{instanceNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"productCode != null\">\n        product_code = #{productCode,jdbcType=VARCHAR},\n      </if>\n      <if test=\"result != null\">\n        result = #{result,jdbcType=VARCHAR},\n      </if>\n      <if test=\"requestTime != null\">\n        request_time = #{requestTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"responseTime != null\">\n        response_time = #{responseTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"elaspeTime != null\">\n        elaspe_time = #{elaspeTime,jdbcType=INTEGER},\n      </if>\n      <if test=\"execType != null\">\n        exec_type = #{execType,jdbcType=VARCHAR},\n      </if>\n      <if test=\"extData != null\">\n        ext_data = #{extData,jdbcType=OTHER},\n      </if>\n      <if test=\"createdDate != null\">\n        created_date = #{createdDate,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"modifiedDate != null\">\n        modified_date = #{modifiedDate,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"deleted != null\">\n        deleted = #{deleted,jdbcType=BIT},\n      </if>\n      <if test=\"requestContent != null\">\n        request_content = #{requestContent,jdbcType=LONGVARCHAR},\n      </if>\n      <if test=\"responseContent != null\">\n        response_content = #{responseContent,jdbcType=LONGVARCHAR},\n      </if>\n    </set>\n    where execution_no=#{executionNo} and deleted=0\n  </update> \n  \n      <select id=\"selectProcessUnitExecutionByPageCondition\" parameterType=\"com.jd.easyflow.common.dto.pager.PagerCondition\" resultMap=\"BaseResultMap\">\n    select\n    <include refid=\"Base_Column_List\" />\n    from process_unit_execution\n    <include refid=\"pagerWhere\" />\n    <if test=\"sortMap.requestTime != null\">\n      order by request_time ${sortMap.requestTime.type}\n    </if>  \n    <if test=\"sortMap.id != null\">\n      order by id ${sortMap.id.type}\n    </if>     \n    <if test=\"start&gt;=0 and pageSize!=-1\">\n          limit #{start},#{pageSize}\n    </if>  \n    <if test=\"start&lt;0 and pageSize!=-1\">\n          limit #{pageSize}\n    </if>       \n  </select>\n  \n  <select id=\"countProcessUnitExecutionByPageCondition\" parameterType=\"com.jd.easyflow.common.dto.pager.PagerCondition\" resultType=\"long\">\n    select\n    count(*)\n    from process_unit_execution\n    <include refid=\"pagerWhere\" />\n  </select>\n\n\n  <sql id=\"pagerWhere\">\n    <where> deleted = 0\n      <if test=\"fieldMap.processUnitCode != null\">\n        and process_unit_code = #{fieldMap.processUnitCode.value}\n      </if>\n      <if test=\"fieldMap.instanceNo != null\">\n        and instance_no = #{fieldMap.instanceNo.value}\n      </if>\n      <if test=\"fieldMap.bizNo != null\">\n        and biz_no = #{fieldMap.bizNo.value}\n      </if>  \n      <if test=\"fieldMap.executionNo != null\">\n        and execution_no = #{fieldMap.executionNo.value}\n      </if>                  \n      <if test=\"fieldMap.requestTimeStart != null\">\n        and request_time &gt;=#{fieldMap.requestTimeStart.value}\n      </if> \n      <if test=\"fieldMap.requestTimeEnd != null\">\n        and request_time &lt;#{fieldMap.requestTimeEnd.value}\n      </if>  \n      <if test=\"fieldMap.elapseTimeStart != null\">\n        and elapse_time &gt;=#{fieldMap.elapseTimeStart.value}\n      </if> \n      <if test=\"fieldMap.elapseTimeEnd != null\">\n        and elapse_time &lt;#{fieldMap.elapseTimeEnd.value}\n      </if>       \n      <if test=\"fieldMap.resultList != null\">\n        and result in \n        <foreach collection=\"fieldMap.resultList.value\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n          #{item}\n        </foreach>\n      </if>           \n      <if test=\"fieldMap.idStart != null\">\n        and id &gt;#{fieldMap.idStart.value}\n      </if> \n      <if test=\"fieldMap.idEnd != null\">\n        and id &lt;#{fieldMap.idEnd.value}\n      </if>                    \n    </where>\n  </sql>\n  \n  \n  \n</mapper>"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/resources/easyflow/mapper/ProcessUnitInstanceMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.jd.easyflow.processunit.infrastructure.persistence.mapper.ProcessUnitInstanceMapper\">\n  <resultMap id=\"BaseResultMap\" type=\"com.jd.easyflow.processunit.infrastructure.persistence.po.ProcessUnitInstance\">\n    <id column=\"id\" jdbcType=\"BIGINT\" property=\"id\" />\n    <result column=\"instance_no\" jdbcType=\"VARCHAR\" property=\"instanceNo\" />\n    <result column=\"biz_no\" jdbcType=\"VARCHAR\" property=\"bizNo\" />\n    <result column=\"parent_no\" jdbcType=\"VARCHAR\" property=\"parentNo\" />\n    <result column=\"process_unit_code\" jdbcType=\"VARCHAR\" property=\"processUnitCode\" />\n    <result column=\"product_code\" jdbcType=\"VARCHAR\" property=\"productCode\" />\n    <result column=\"result\" jdbcType=\"VARCHAR\" property=\"result\" />\n    <result column=\"auto_run_flag\" jdbcType=\"BIT\" property=\"autoRunFlag\" />\n    <result column=\"auto_run_times\" jdbcType=\"INTEGER\" property=\"autoRunTimes\" />\n    <result column=\"next_auto_run_time\" jdbcType=\"TIMESTAMP\" property=\"nextAutoRunTime\" />\n    <result column=\"request_content\" jdbcType=\"LONGVARCHAR\" property=\"requestContent\" />\n    <result column=\"response_content\" jdbcType=\"LONGVARCHAR\" property=\"responseContent\" />\n    <result column=\"vars\" jdbcType=\"OTHER\" property=\"vars\" />\n    <result column=\"ext_data\" jdbcType=\"OTHER\" property=\"extData\" />\n    <result column=\"created_date\" jdbcType=\"TIMESTAMP\" property=\"createdDate\" />\n    <result column=\"modified_date\" jdbcType=\"TIMESTAMP\" property=\"modifiedDate\" />\n    <result column=\"deleted\" jdbcType=\"BIT\" property=\"deleted\" />\n  </resultMap>\n  <sql id=\"Base_Column_List\">\n    id, instance_no, biz_no, parent_no, process_unit_code, product_code, result, auto_run_flag, \n    auto_run_times, next_auto_run_time, request_content, response_content,vars, ext_data, created_date, modified_date, deleted\n  </sql>\n  <select id=\"selectByPrimaryKey\" parameterType=\"java.lang.Long\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_unit_instance\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </select>\n  <insert id=\"insert\" keyColumn=\"id\" keyProperty=\"id\" parameterType=\"com.jd.easyflow.processunit.infrastructure.persistence.po.ProcessUnitInstance\" useGeneratedKeys=\"true\">\n    insert into process_unit_instance (instance_no, biz_no, parent_no, \n      process_unit_code, product_code, result, \n      auto_run_flag, auto_run_times, next_auto_run_time, vars,\n      ext_data,request_content, response_content\n      )\n    values (#{instanceNo,jdbcType=VARCHAR}, #{bizNo,jdbcType=VARCHAR}, #{parentNo,jdbcType=VARCHAR}, \n      #{processUnitCode,jdbcType=VARCHAR}, #{productCode,jdbcType=VARCHAR}, #{result,jdbcType=VARCHAR}, \n      #{autoRunFlag,jdbcType=BIT}, #{autoRunTimes,jdbcType=INTEGER}, #{nextAutoRunTime,jdbcType=TIMESTAMP}, #{vars,jdbcType=OTHER},\n      #{extData,jdbcType=OTHER}, #{requestContent,jdbcType=LONGVARCHAR}, #{responseContent,jdbcType=LONGVARCHAR}\n      )\n  </insert>\n\n  <insert id=\"insertForMigration\" keyColumn=\"id\" keyProperty=\"id\" parameterType=\"com.jd.easyflow.processunit.infrastructure.persistence.po.ProcessUnitInstance\" useGeneratedKeys=\"true\">\n    insert into process_unit_instance${@com.jd.easyflow.processunit.infrastructure.sharding.ShardingHolder@getTableSuffix()} (id, instance_no, biz_no, parent_no, \n      process_unit_code, product_code, result, \n      auto_run_flag, auto_run_times, next_auto_run_time, vars,\n      ext_data,request_content, response_content, created_date, modified_date\n      )\n    values (#{id, jdbcType=BIGINT}, #{instanceNo,jdbcType=VARCHAR}, #{bizNo,jdbcType=VARCHAR}, #{parentNo,jdbcType=VARCHAR}, \n      #{processUnitCode,jdbcType=VARCHAR}, #{productCode,jdbcType=VARCHAR}, #{result,jdbcType=VARCHAR}, \n      #{autoRunFlag,jdbcType=BIT}, #{autoRunTimes,jdbcType=INTEGER}, #{nextAutoRunTime,jdbcType=TIMESTAMP},  #{vars,jdbcType=OTHER},\n      #{extData,jdbcType=OTHER}, #{requestContent,jdbcType=LONGVARCHAR}, #{responseContent,jdbcType=LONGVARCHAR},\n      #{createdDate,jdbcType=TIMESTAMP}, #{modifiedDate,jdbcType=TIMESTAMP}\n      )\n  </insert>  \n\n\n  <update id=\"updateByPrimaryKey\" parameterType=\"com.jd.easyflow.processunit.infrastructure.persistence.po.ProcessUnitInstance\">\n    update process_unit_instance\n    set instance_no = #{instanceNo,jdbcType=VARCHAR},\n      biz_no = #{bizNo,jdbcType=VARCHAR},\n      parent_no = #{parentNo,jdbcType=VARCHAR},\n      process_unit_code = #{processUnitCode,jdbcType=VARCHAR},\n      product_code = #{productCode,jdbcType=VARCHAR},\n      result = #{result,jdbcType=VARCHAR},\n      auto_run_flag = #{autoRunFlag,jdbcType=BIT},\n      auto_run_times = #{autoRunTimes,jdbcType=INTEGER},\n      next_auto_run_time = #{nextAutoRunTime,jdbcType=TIMESTAMP},\n      vars = #{vars,jdbcType=OTHER},\n      ext_data = #{extData,jdbcType=OTHER},\n      request_content = #{requestContent,jdbcType=LONGVARCHAR},\n      response_content = #{responseContent,jdbcType=LONGVARCHAR}\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </update>\n  \n    <update id=\"updateByInstanceNo\" parameterType=\"com.jd.easyflow.processunit.infrastructure.persistence.po.ProcessUnitInstance\">\n    update process_unit_instance\n    set biz_no = #{bizNo,jdbcType=VARCHAR},\n      parent_no = #{parentNo,jdbcType=VARCHAR},\n      process_unit_code = #{processUnitCode,jdbcType=VARCHAR},\n      product_code = #{productCode,jdbcType=VARCHAR},\n      result = #{result,jdbcType=VARCHAR},\n      auto_run_flag = #{autoRunFlag,jdbcType=BIT},\n      auto_run_times = #{autoRunTimes,jdbcType=INTEGER},\n      next_auto_run_time = #{nextAutoRunTime,jdbcType=TIMESTAMP},\n      vars = #{vars,jdbcType=OTHER},\n      ext_data = #{extData,jdbcType=OTHER},\n      request_content = #{requestContent,jdbcType=LONGVARCHAR},\n      response_content = #{responseContent,jdbcType=LONGVARCHAR}\n    where instance_no = #{instanceNo,jdbcType=BIGINT} and deleted=0\n  </update>\n  \n  <update id=\"updateForMigration\" parameterType=\"com.jd.easyflow.processunit.infrastructure.persistence.po.ProcessUnitInstance\">\n    update process_unit_instance${@com.jd.easyflow.processunit.infrastructure.sharding.ShardingHolder@getTableSuffix()}\n    set\n      biz_no = #{bizNo,jdbcType=VARCHAR},\n      parent_no = #{parentNo,jdbcType=VARCHAR},\n      process_unit_code = #{processUnitCode,jdbcType=VARCHAR},\n      product_code = #{productCode,jdbcType=VARCHAR},\n      result = #{result,jdbcType=VARCHAR},\n      auto_run_flag = #{autoRunFlag,jdbcType=BIT},\n      auto_run_times = #{autoRunTimes,jdbcType=INTEGER},\n      next_auto_run_time = #{nextAutoRunTime,jdbcType=TIMESTAMP},\n      vars = #{vars,jdbcType=OTHER},\n      ext_data = #{extData,jdbcType=OTHER},\n      request_content = #{requestContent,jdbcType=LONGVARCHAR},\n      response_content = #{responseContent,jdbcType=LONGVARCHAR},\n      created_date = #{createdDate,jdbcType=TIMESTAMP},\n      modified_date =  #{modifiedDate,jdbcType=TIMESTAMP}\n    where instance_no = #{instanceNo,jdbcType=BIGINT} and deleted=0\n  </update>  \n  \n    <select id=\"getByUnitCodeAndBizNo\"  resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_unit_instance\n    where biz_no=#{bizNo} and process_unit_code=#{unitCode} and deleted=0\n  </select>\n    <select id=\"selectListByUnitCodeAndBizNoPrefix\"  resultMap=\"BaseResultMap\">\n    select\n    <include refid=\"Base_Column_List\" />\n    from process_unit_instance\n    where biz_no like concat(#{bizNoPrefix},'%') and deleted=0\n    <if test=\"unitCode != null\">\n      and process_unit_code = #{unitCode}\n    </if>\n    order by id\n  </select>  \n      <select id=\"getByInstanceNo\"  resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_unit_instance\n    where instance_no=#{instanceNo} and deleted=0\n  </select>\n      <select id=\"findAsyncInstanceList\" parameterType=\"com.jd.easyflow.processunit.domain.model.vo.QueryAsyncInstanceVO\"  resultType=\"string\">\n    select \n    instance_no\n    from process_unit_instance\n    where process_unit_code=#{unitCode} and auto_run_flag=1 and next_auto_run_time&lt;=#{nextAutoRunTime} and deleted=0\n    <if test=\"nextAutoRunTimeStart != null\">\n        and next_auto_run_time &gt;= #{nextAutoRunTimeStart}\n    </if>\n    <if test=\"productCodeList != null and productCodeList.size>0\">\n      and `product_code` in\n      <foreach collection=\"productCodeList\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n        #{item}\n      </foreach>\n    </if>\n    <if test=\"excludeProductCodeList != null and excludeProductCodeList.size>0\">\n      and `product_code` not in\n      <foreach collection=\"excludeProductCodeList\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n        #{item}\n      </foreach>\n    </if>  \n    <if test=\"resultList != null and resultList.size>0\">\n      and `result` in\n      <foreach collection=\"resultList\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n        #{item}\n      </foreach>\n    </if> \n    <if test=\"variableList != null and variableList.size>0\">\n\t      <foreach collection=\"variableList\" item=\"item\">\n\t          and  `ext_data`->'$._vars.${item.name}' ${item.operator} ${item.value}\n\t      </foreach>    \n    </if>        \n    limit 100000\n  </select>\n  \n      <select id=\"findAsyncInstanceKeyList\" parameterType=\"com.jd.easyflow.processunit.domain.model.vo.QueryAsyncInstanceVO\"  resultType=\"com.jd.easyflow.processunit.domain.model.vo.ProcessUnitInstanceKey\">\n    select \n    instance_no as instanceNo,process_unit_code as unitCode,biz_no as bizNo\n    from process_unit_instance\n    where process_unit_code=#{unitCode} and auto_run_flag=1 and next_auto_run_time&lt;=#{nextAutoRunTime} and deleted=0\n    <if test=\"nextAutoRunTimeStart != null\">\n        and next_auto_run_time &gt;= #{nextAutoRunTimeStart}\n    </if>\n    <if test=\"productCodeList != null and productCodeList.size>0\">\n      and `product_code` in\n      <foreach collection=\"productCodeList\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n        #{item}\n      </foreach>\n    </if>\n    <if test=\"excludeProductCodeList != null and excludeProductCodeList.size>0\">\n      and `product_code` not in\n      <foreach collection=\"excludeProductCodeList\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n        #{item}\n      </foreach>\n    </if>  \n    <if test=\"resultList != null and resultList.size>0\">\n      and `result` in\n      <foreach collection=\"resultList\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n        #{item}\n      </foreach>\n    </if> \n    <if test=\"variableList != null and variableList.size>0\">\n\t      <foreach collection=\"variableList\" item=\"item\">\n\t          and  `ext_data`->'$._vars.${item.name}' ${item.operator} ${item.value}\n\t      </foreach>    \n    </if>        \n    limit 100000\n  </select>  \n\n  <select id=\"selectProcessUnitInstance\" resultMap=\"BaseResultMap\">\n    select\n    <include refid=\"Base_Column_List\"/>\n    from process_unit_instance\n    where created_date &lt;= #{createdDate,jdbcType=TIMESTAMP} and result = #{result,jdbcType=VARCHAR} and deleted=0 limit 0,200\n  </select>\n\n  <delete id=\"physicsDeleteProcessUnitInstance\">\n    delete from process_unit_instance\n    where 1=1\n    <if test=\"ids !=null and ids.size()>0 \">\n      AND id IN\n      <foreach collection=\"ids\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n        #{item}\n      </foreach>\n    </if>\n    <if test=\"ids ==null or ids.size()==0 \">\n      and 1 = 0\n    </if>\n  </delete>\n  <update id=\"updateByInstanceNoSelective\" parameterType=\"com.jd.easyflow.processunit.infrastructure.persistence.po.ProcessUnitInstance\">\n    update process_unit_instance\n    <set>\n      <if test=\"bizNo != null\">\n        biz_no = #{bizNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"parentNo != null\">\n        parent_no = #{parentNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"processUnitCode != null\">\n        process_unit_code = #{processUnitCode,jdbcType=VARCHAR},\n      </if>\n      <if test=\"productCode != null\">\n        product_code = #{productCode,jdbcType=VARCHAR},\n      </if>\n      <if test=\"result != null\">\n        result = #{result,jdbcType=VARCHAR},\n      </if>\n      <if test=\"autoRunFlag != null\">\n        auto_run_flag = #{autoRunFlag,jdbcType=BIT},\n      </if>\n      <if test=\"autoRunTimes != null\">\n        auto_run_times = #{autoRunTimes,jdbcType=INTEGER},\n      </if>\n      <if test=\"nextAutoRunTime != null\">\n        next_auto_run_time = #{nextAutoRunTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"vars != null\">\n        vars = #{vars,jdbcType=OTHER},\n      </if>\n      <if test=\"extData != null\">\n        ext_data = #{extData,jdbcType=OTHER},\n      </if>\n      <if test=\"requestContent != null\">\n        request_content = #{requestContent,jdbcType=LONGVARCHAR},\n      </if>\n      <if test=\"responseContent != null\">\n        response_content = #{responseContent,jdbcType=LONGVARCHAR},\n      </if>\n    </set>\n    where instance_no = #{instanceNo,jdbcType=BIGINT} and deleted=0\n  </update>\n  <select id=\"selectProcessUnitInstanceByPageCondition\" parameterType=\"com.jd.easyflow.common.dto.pager.PagerCondition\" resultMap=\"BaseResultMap\">\n    select\n    <include refid=\"Base_Column_List\" />\n    from process_unit_instance\n    <include refid=\"pagerWhere\" />\n    <if test=\"sortMap.createdDate != null\">\n      order by created_date ${sortMap.createdDate.type}\n    </if>  \n    <if test=\"sortMap.id != null\">\n      order by id ${sortMap.id.type}\n    </if>     \n    <if test=\"start&gt;=0 and pageSize!=-1\">\n          limit #{start},#{pageSize}\n    </if>  \n    <if test=\"start&lt;0 and pageSize!=-1\">\n          limit #{pageSize}\n    </if>       \n  </select>\n\n    <select id=\"countProcessUnitInstanceByPageCondition\" parameterType=\"com.jd.easyflow.common.dto.pager.PagerCondition\" resultType=\"long\">\n    select\n    count(*)\n    from process_unit_instance\n    <include refid=\"pagerWhere\" />     \n  </select>\n\n  <sql id=\"pagerWhere\">\n    <where> deleted = 0\n      <if test=\"fieldMap.processUnitCode != null\">\n        and process_unit_code = #{fieldMap.processUnitCode.value}\n      </if>\n      <if test=\"fieldMap.instanceNo != null\">\n        and instance_no = #{fieldMap.instanceNo.value}\n      </if>\n      <if test=\"fieldMap.bizNo != null\">\n        and biz_no = #{fieldMap.bizNo.value}\n      </if>            \n      <if test=\"fieldMap.createdDateStart != null\">\n        and created_date &gt;=#{fieldMap.createdDateStart.value}\n      </if> \n      <if test=\"fieldMap.createdDateEnd != null\">\n        and created_date &lt;#{fieldMap.createdDateEnd.value}\n      </if>  \n      <if test=\"fieldMap.resultList != null\">\n        and result in \n        <foreach collection=\"fieldMap.resultList.value\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n          #{item}\n        </foreach>\n      </if>           \n      <if test=\"fieldMap.idStart != null\">\n        and id &gt;#{fieldMap.idStart.value}\n      </if> \n      <if test=\"fieldMap.idEnd != null\">\n        and id &lt;#{fieldMap.idEnd.value}\n      </if>        \n    </where>\n  </sql>\n\n</mapper>"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/resources/easyflow/mapper/SequenceMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.jd.easyflow.codegenerator.infrastructure.persistence.mapper.SequenceMapper\">\n  <resultMap id=\"BaseResultMap\" type=\"com.jd.easyflow.codegenerator.infrastructure.persistence.po.Sequence\">\n    <id column=\"id\" jdbcType=\"BIGINT\" property=\"id\" />\n    <result column=\"seq_key\" jdbcType=\"VARCHAR\" property=\"seqKey\" />\n    <result column=\"seq_sub_key\" jdbcType=\"VARCHAR\" property=\"seqSubKey\" />\n    <result column=\"seq_value\" jdbcType=\"BIGINT\" property=\"seqValue\" />\n    <result column=\"created_date\" jdbcType=\"TIMESTAMP\" property=\"createdDate\" />\n    <result column=\"modified_date\" jdbcType=\"TIMESTAMP\" property=\"modifiedDate\" />\n    <result column=\"deleted\" jdbcType=\"CHAR\" property=\"deleted\" />\n  </resultMap>\n  <sql id=\"Base_Column_List\">\n    id, seq_key, seq_sub_key, seq_value, created_date, modified_date, deleted\n  </sql>\n  <select id=\"selectByPrimaryKey\" parameterType=\"java.lang.Long\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from `sequence`\n    where id = #{id,jdbcType=BIGINT} and deleted = 0\n  </select>\n  <update id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Long\">\n    update `sequence` set deleted = 1\n    where id = #{id,jdbcType=BIGINT} and deleted = 0\n  </update>\n  <insert id=\"insert\" keyColumn=\"id\" keyProperty=\"id\" parameterType=\"com.jd.easyflow.codegenerator.infrastructure.persistence.po.Sequence\" useGeneratedKeys=\"true\">\n    insert into `sequence` (seq_key, seq_sub_key, seq_value\n      )\n    values (#{seqKey,jdbcType=VARCHAR}, #{seqSubKey,jdbcType=VARCHAR}, #{seqValue,jdbcType=BIGINT}\n      )\n  </insert>\n  <insert id=\"insertSelective\" keyColumn=\"id\" keyProperty=\"id\" parameterType=\"com.jd.easyflow.codegenerator.infrastructure.persistence.po.Sequence\" useGeneratedKeys=\"true\">\n    insert into `sequence`\n    <trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">\n      <if test=\"seqKey != null\">\n        seq_key,\n      </if>\n      <if test=\"seqSubKey != null\">\n        seq_sub_key,\n      </if>\n      <if test=\"seqValue != null\">\n        seq_value,\n      </if>\n    </trim>\n    <trim prefix=\"values (\" suffix=\")\" suffixOverrides=\",\">\n      <if test=\"seqKey != null\">\n        #{seqKey,jdbcType=VARCHAR},\n      </if>\n      <if test=\"seqSubKey != null\">\n        #{seqSubKey,jdbcType=VARCHAR},\n      </if>\n      <if test=\"seqValue != null\">\n        #{seqValue,jdbcType=BIGINT},\n      </if>\n    </trim>\n  </insert>\n  <update id=\"updateByPrimaryKeySelective\" parameterType=\"com.jd.easyflow.codegenerator.infrastructure.persistence.po.Sequence\">\n    update `sequence`\n    <set>\n      <if test=\"seqKey != null\">\n        seq_key = #{seqKey,jdbcType=VARCHAR},\n      </if>\n      <if test=\"seqSubKey != null\">\n        seq_sub_key = #{seqSubKey,jdbcType=VARCHAR},\n      </if>\n      <if test=\"seqValue != null\">\n        seq_value = #{seqValue,jdbcType=BIGINT},\n      </if>\n    </set>\n    where id = #{id,jdbcType=BIGINT} and deleted='0'\n  </update>\n  <update id=\"updateByPrimaryKey\" parameterType=\"com.jd.easyflow.codegenerator.infrastructure.persistence.po.Sequence\">\n    update `sequence`\n    set seq_key = #{seqKey,jdbcType=VARCHAR},\n      seq_sub_key = #{seqSubKey,jdbcType=VARCHAR},\n      seq_value = #{seqValue,jdbcType=BIGINT}\n    where id = #{id,jdbcType=BIGINT} and deleted='0'\n  </update>\n  \n\t<select id=\"selectForUpdate\" resultMap=\"BaseResultMap\">\n\t\tselect\n\t\t<include refid=\"Base_Column_List\" />\n\t\tfrom `sequence` where seq_key=#{key}\n\t\t<if test=\"subKey != null\">\n\t\t\tand seq_sub_key = #{subKey}\n\t\t</if>\n\t\tand deleted ='0'\n\t\tfor update\n\t</select>\n\t\n  <update id=\"updateValueByPrimaryKey\">\n    update `sequence` set seq_value=#{seqValue} where id=#{id} and deleted ='0';\n  </update>\n</mapper>"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/resources/easyflow/messages/easyflow-process-server.properties",
    "content": "easyflow.process.server.tip.processDefinitionExists=Process definition exists\neasyflow.process.server.tip.processDefinitionNotExists=Process definition not exits\neasyflow.process.server.tip.processInstanceExists=Process instance exists\neasyflow.process.server.tip.processDefinitionNotExistsWithId=Process definition {0} not exists\neasyflow.process.server.tip.attachedProcessDefinitionCannotUpdate=Attached process cannot be update, please update main process {0}\neasyflow.process.server.tip.matchedDefinitionNotFound=Matched definition not found\neasyflow.process.server.tip.latestDefinitionNotFound=Latest definition not found\neasyflow.process.server.tip.taskExecuteUserAndWithdrawUserInconsistent=Task execute user:{0} withdraw user:{1} inconsistent\neasyflow.process.server.tip.cannotWithdrawForTaskNotEnd=Task not end, cannot withdraw\neasyflow.process.server.tip.cannotWithdrawForInstanceClose=Process instance closed, cannot withdraw\neasyflow.process.server.tip.cannotWithdrawForNoConfig=Node {0} withdraw setting not configured\neasyflow.process.server.tip.cannotWithdrawForPostNodeClose=Post node {0} closed, cannot withdraw\neasyflow.process.server.tip.cannotWithdrawForMultiplePreNodes=Node {0} has multiple previous nodes, cannot withdraw\neasyflow.process.server.tip.cannotWithdrawForTaskProcessed=Post task {0} processed, cannot withdraw\neasyflow.process.server.tip.cannotWithdrawForReason=Task cannot be withdraw, taskNo:{0} reason:{1}\neasyflow.process.server.tip.cannotCancelForReason=Process instance cannot be canceled, instanceNo:{0} reason:{1}\neasyflow.process.server.tip.cannotCancelForInstanceNotExists=Process instance not found\neasyflow.process.server.tip.cannotCancelForCanncelStatus=Process instance status is canceled\neasyflow.process.server.tip.cannotCancelForNotConfigCancel=Not setting cancel flag on definition\neasyflow.process.server.tip.cannotCancelForUserInconsistent=Create user and cancel user not same, cannot be cancel\neasyflow.process.server.tip.cannotCancelForInstanceFinish=This process instance has finished, cannot be cancel\neasyflow.process.server.tip.processIdInconsistent=Process definition id inconsistent\n\n\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/resources/easyflow/messages/easyflow-process-server_zh.properties",
    "content": "easyflow.process.server.tip.processDefinitionExists=流程定义已存在\neasyflow.process.server.tip.processDefinitionNotExists=流程定义不存在\neasyflow.process.server.tip.processInstanceExists=流程实例已存在\neasyflow.process.server.tip.processDefinitionNotExistsWithId=流程定义{0}不存在\neasyflow.process.server.tip.attachedProcessDefinitionCannotUpdate=附属流程不可直接更新，请更新主流程{0}\neasyflow.process.server.tip.matchedDefinitionNotFound=未找到匹配的流程定义\neasyflow.process.server.tip.latestDefinitionNotFound=未找到最新使用的流程定义\neasyflow.process.server.tip.taskExecuteUserAndWithdrawUserInconsistent=任务执行用户:{0} 撤销用户:{1}不一致\neasyflow.process.server.tip.cannotWithdrawForTaskNotEnd=任务未结束，不能撤回\neasyflow.process.server.tip.cannotWithdrawForInstanceClose=流程实例已关闭，不能撤回\neasyflow.process.server.tip.cannotWithdrawForNoConfig=流程节点{0}未配置任务可撤回\neasyflow.process.server.tip.cannotWithdrawForPostNodeClose=后继流程节点{0}已关闭，不能撤回\neasyflow.process.server.tip.cannotWithdrawForMultiplePreNodes=后继流程节点{0}有多个前置节点，不能撤回\neasyflow.process.server.tip.cannotWithdrawForTaskProcessed=后继流程节点任务{0}已处理，不能撤回\neasyflow.process.server.tip.cannotWithdrawForReason=流程任务不可撤回, taskNo:{0} 原因:{1}\neasyflow.process.server.tip.cannotCancelForReason=流程实例不可取消, instanceNo:{0} 原因:{1}\neasyflow.process.server.tip.cannotCancelForInstanceNotExists=未查询到该流程实例\neasyflow.process.server.tip.cannotCancelForCanncelStatus=查询到该流程实例已经是取消状态\neasyflow.process.server.tip.cannotCancelForNotConfigCancel=流程定义中未配置取消功能\neasyflow.process.server.tip.cannotCancelForUserInconsistent=流程实例中创建人和当前取消人不一致不可取消\neasyflow.process.server.tip.cannotCancelForInstanceFinish=该流程实例已结束不可执行取消\neasyflow.process.server.tip.processIdInconsistent=流程定义ID不一致\n\n"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/resources/easyflow/shardingmapper/ProcessInstanceMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.jd.easyflow.process.infrastructure.persistence.mapper.ProcessInstanceMapper\">\n  <resultMap id=\"BaseResultMap\" type=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessInstance\">\n    <id column=\"id\" jdbcType=\"BIGINT\" property=\"id\" />\n    <result column=\"instance_no\" jdbcType=\"VARCHAR\" property=\"instanceNo\" />\n    <result column=\"instance_name\" jdbcType=\"VARCHAR\" property=\"instanceName\" />\n    <result column=\"instance_no\" jdbcType=\"VARCHAR\" property=\"instanceNo\" />\n    <result column=\"process_type\" jdbcType=\"VARCHAR\" property=\"processType\" />\n    <result column=\"biz_no\" jdbcType=\"VARCHAR\" property=\"bizNo\" />\n    <result column=\"product_code\" jdbcType=\"VARCHAR\" property=\"productCode\" />\n    <result column=\"creator\" jdbcType=\"VARCHAR\" property=\"creator\" />\n    <result column=\"process_def_id\" jdbcType=\"VARCHAR\" property=\"processDefId\" />\n    <result column=\"start_time\" jdbcType=\"TIMESTAMP\" property=\"startTime\" />\n    <result column=\"end_time\" jdbcType=\"TIMESTAMP\" property=\"endTime\" />\n    <result column=\"status\" jdbcType=\"VARCHAR\" property=\"status\" />\n    <result column=\"parent_instance_no\" jdbcType=\"VARCHAR\" property=\"parentInstanceNo\" />\n    <result column=\"parent_node_instance_no\" jdbcType=\"VARCHAR\" property=\"parentNodeInstanceNo\" />\n    <result column=\"current_node_ids\" jdbcType=\"VARCHAR\" property=\"currentNodeIds\" />\n    <result column=\"biz_status\" jdbcType=\"VARCHAR\" property=\"bizStatus\" />\n    <result column=\"biz_data\" jdbcType=\"OTHER\" property=\"bizData\" />\n    <result column=\"vars\" jdbcType=\"OTHER\" property=\"vars\" />\n    <result column=\"ext_data\" jdbcType=\"OTHER\" property=\"extData\" />\n    <result column=\"key_field\" jdbcType=\"VARCHAR\" property=\"keyField\" />\n    <result column=\"key_field2\" jdbcType=\"VARCHAR\" property=\"keyField2\" />\n    <result column=\"created_date\" jdbcType=\"TIMESTAMP\" property=\"createdDate\" />\n    <result column=\"modified_date\" jdbcType=\"TIMESTAMP\" property=\"modifiedDate\" />\n    <result column=\"deleted\" jdbcType=\"BIT\" property=\"deleted\" />\n  </resultMap>\n  <sql id=\"Base_Column_List\">\n    id, instance_no, instance_name, process_type, biz_no, product_code, creator, process_def_id, start_time, \n    end_time, status, parent_instance_no, parent_node_instance_no, current_node_ids, biz_status, biz_data, vars, ext_data, key_field,key_field2, created_date, modified_date,\n    deleted\n  </sql>\n  <select id=\"selectByPrimaryKey\" parameterType=\"java.lang.Long\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </select>\n  <delete id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Long\">\n    update process_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()} set deleted=1\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </delete>\n  <insert id=\"insert\" keyColumn=\"id\" keyProperty=\"id\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessInstance\" useGeneratedKeys=\"false\">\n    insert into process_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()} (id, instance_no, instance_name, process_type, biz_no, \n      product_code, creator, process_def_id, \n      start_time, end_time, status, \n      parent_instance_no, parent_node_instance_no, current_node_ids,biz_status, biz_data, vars, ext_data, key_field, key_field2\n      )\n    values (#{id, jdbcType=BIGINT}, #{instanceNo,jdbcType=VARCHAR}, #{instanceName,jdbcType=VARCHAR}, #{processType,jdbcType=VARCHAR}, #{bizNo,jdbcType=VARCHAR}, \n      #{productCode,jdbcType=VARCHAR}, #{creator,jdbcType=VARCHAR}, #{processDefId,jdbcType=VARCHAR}, \n      #{startTime,jdbcType=TIMESTAMP}, #{endTime,jdbcType=TIMESTAMP}, #{status,jdbcType=VARCHAR}, #{parentInstanceNo,jdbcType=VARCHAR},\n      #{parentNodeInstanceNo,jdbcType=VARCHAR},#{currentNodeIds,jdbcType=VARCHAR},#{bizStatus,jdbcType=VARCHAR},#{bizData,jdbcType=OTHER}, #{vars,jdbcType=OTHER}, #{extData,jdbcType=OTHER},\n      #{keyField,jdbcType=VARCHAR}, #{keyField2,jdbcType=VARCHAR})\n  </insert>\n  <insert id=\"insertWithCreatedDate\" keyColumn=\"id\" keyProperty=\"id\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessInstance\" useGeneratedKeys=\"false\">\n    insert into process_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()} (id, instance_no, instance_name, process_type, biz_no, \n      product_code, creator, process_def_id, \n      start_time, end_time, status, \n      parent_instance_no, parent_node_instance_no, current_node_ids,biz_status, biz_data, vars, ext_data,key_field,key_field2, created_date\n      )\n    values (#{id, jdbcType=BIGINT}, #{instanceNo,jdbcType=VARCHAR}, #{instanceName,jdbcType=VARCHAR}, #{processType,jdbcType=VARCHAR}, #{bizNo,jdbcType=VARCHAR}, \n      #{productCode,jdbcType=VARCHAR}, #{creator,jdbcType=VARCHAR}, #{processDefId,jdbcType=VARCHAR}, \n      #{startTime,jdbcType=TIMESTAMP}, #{endTime,jdbcType=TIMESTAMP}, #{status,jdbcType=VARCHAR}, #{parentInstanceNo,jdbcType=VARCHAR},\n      #{parentNodeInstanceNo,jdbcType=VARCHAR},#{currentNodeIds,jdbcType=VARCHAR},#{bizStatus,jdbcType=VARCHAR},#{bizData,jdbcType=OTHER}, #{vars,jdbcType=OTHER}, #{extData,jdbcType=OTHER},\n      #{keyField,jdbcType=VARCHAR}, #{keyField2,jdbcType=VARCHAR}, #{createdDate,jdbcType=TIMESTAMP})\n  </insert>  \n\n  <update id=\"updateByPrimaryKeySelective\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessInstance\">\n    update process_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    <set>\n      <if test=\"instanceNo != null\">\n        instance_no = #{instanceNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"instanceName != null\">\n        instance_name = #{instanceName,jdbcType=VARCHAR},\n      </if>      \n      <if test=\"processType != null\">\n        process_type = #{processType,jdbcType=VARCHAR},\n      </if>\n      <if test=\"bizNo != null\">\n        biz_no = #{bizNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"productCode != null\">\n        product_code = #{productCode,jdbcType=VARCHAR},\n      </if>\n      <if test=\"creator != null\">\n        creator = #{creator,jdbcType=VARCHAR},\n      </if>\n      <if test=\"processDefId != null\">\n        process_def_id = #{processDefId,jdbcType=VARCHAR},\n      </if>\n      <if test=\"startTime != null\">\n        start_time = #{startTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"endTime != null\">\n        end_time = #{endTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"status != null\">\n        status = #{status,jdbcType=VARCHAR},\n      </if>\n      <if test=\"parentInstanceNo != null\">\n        parent_instance_no = #{parentInstanceNo,jdbcType=VARCHAR},\n      </if>      \n      <if test=\"parentNodeInstanceNo != null\">\n        parent_node_instance_no = #{parentNodeInstanceNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"currentNodeIds != null\">\n        current_node_ids = #{currentNodeIds,jdbcType=VARCHAR},\n      </if> \n      <if test=\"bizStatus != null\">\n        biz_status = #{bizStatus,jdbcType=VARCHAR},\n      </if>\n      <if test=\"bizData != null\">\n        biz_data = #{bizData,jdbcType=OTHER},\n      </if>                 \n      <if test=\"vars != null\">\n        vars = #{vars,jdbcType=OTHER},\n      </if>\n      <if test=\"extData != null\">\n        ext_data = #{extData,jdbcType=OTHER},\n      </if>\n      <if test=\"keyField != null\">\n        key_field = #{keyField,jdbcType=VARCHAR},\n      </if>\n      <if test=\"keyField2 != null\">\n        key_field2 = #{keyField2,jdbcType=VARCHAR},\n      </if>\n    </set>\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </update>\n  <update id=\"updateByPrimaryKey\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessInstance\">\n    update process_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    set instance_no = #{instanceNo,jdbcType=VARCHAR},\n      instance_name = #{instanceName,jdbcType=VARCHAR},\n      process_type = #{processType,jdbcType=VARCHAR},\n      biz_no = #{bizNo,jdbcType=VARCHAR},\n      product_code = #{productCode,jdbcType=VARCHAR},\n      creator = #{creator,jdbcType=VARCHAR},\n      process_def_id = #{processDefId,jdbcType=VARCHAR},\n      start_time = #{startTime,jdbcType=TIMESTAMP},\n      end_time = #{endTime,jdbcType=TIMESTAMP},\n      status = #{status,jdbcType=VARCHAR},\n      parent_instance_no = #{parentInstanceNo,jdbcType=VARCHAR},\n      parent_node_instance_no = #{parentNodeInstanceNo,jdbcType=VARCHAR},\n      current_node_ids = #{currentNodeIds,jdbcType=VARCHAR},\n      biz_status = #{bizStatus,jdbcType=VARCHAR},\n      biz_data = #{bizData,jdbcType=OTHER},\n      vars = #{vars,jdbcType=OTHER},\n      ext_data = #{extData,jdbcType=OTHER},\n      key_field = #{keyField,jdbcType=OTHER},\n      key_field2 = #{keyField2,jdbcType=OTHER}\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </update>\n  \n    <update id=\"updateByProcessInstanceNo\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessInstance\">\n    update process_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    set \n      instance_name = #{instanceName,jdbcType=VARCHAR},\n      process_type = #{processType,jdbcType=VARCHAR},\n      biz_no = #{bizNo,jdbcType=VARCHAR},\n      product_code = #{productCode,jdbcType=VARCHAR},\n      creator = #{creator,jdbcType=VARCHAR},\n      process_def_id = #{processDefId,jdbcType=VARCHAR},\n      start_time = #{startTime,jdbcType=TIMESTAMP},\n      end_time = #{endTime,jdbcType=TIMESTAMP},\n      status = #{status,jdbcType=VARCHAR},\n      parent_instance_no = #{parentInstanceNo,jdbcType=VARCHAR},\n      parent_node_instance_no = #{parentNodeInstanceNo,jdbcType=VARCHAR},\n      current_node_ids = #{currentNodeIds,jdbcType=VARCHAR},\n      biz_status = #{bizStatus,jdbcType=VARCHAR},\n      biz_data = #{bizData,jdbcType=OTHER},\n      vars = #{vars,jdbcType=OTHER},\n      ext_data = #{extData,jdbcType=OTHER},\n      key_field = #{keyField,jdbcType=OTHER},\n      key_field2 = #{keyField2,jdbcType=OTHER}\n    where instance_no = #{instanceNo,jdbcType=VARCHAR} and deleted=0\n  </update>\n  \n  <update id=\"deleteByProcessInstanceNo\" parameterType=\"java.lang.String\">\n    update process_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    set \n      deleted=1\n    where instance_no = #{instanceNo,jdbcType=VARCHAR} and deleted=0\n  </update>\n  \n  <select id=\"getProcessInstanceByProcessTypeAndBizNo\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    where process_type=#{processType} and biz_no=#{bizNo} and deleted=0 order by id desc limit 1\n  </select>\n  <select id=\"selectByInstanceNo\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    where instance_no=#{instanceNo} and deleted=0\n  </select>\n\n  <select id=\"getActiveProcessInstanceByProcessTypeAndBizNo\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    where process_type=#{processType} and biz_no=#{bizNo} and status='ACTIVE' and deleted=0 order by id desc\n  </select>\n\n  <select id=\"countProcessInstanceByPagerCondition\" parameterType=\"com.jd.easyflow.common.dto.pager.PagerCondition\" resultType=\"long\">\n    select\n    count(instance_no)\n    from process_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    <include refid=\"pagerWhere\" />\n  </select>\n\n  <select id=\"selectProcessInstanceByPageCondition\" parameterType=\"com.jd.easyflow.common.dto.pager.PagerCondition\" resultMap=\"BaseResultMap\">\n    select\n    <include refid=\"Base_Column_List\" />\n    from process_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    <include refid=\"pagerWhere\" />\n    <if test=\"sortMap.createdDate != null\">\n      order by created_date ${sortMap.createdDate.type},id  ${sortMap.createdDate.type}\n    </if>  \n    <if test=\"sortMap.modifiedDate != null\">\n      order by modified_date ${sortMap.modifiedDate.type}\n    </if>\n    limit #{start},#{pageSize}\n  </select>\n  <select id=\"queryProcessInstanceByInstanceNos\" resultMap=\"BaseResultMap\">\n    select\n    <include refid=\"Base_Column_List\"/>\n    from process_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    <where>\n      deleted = 0 and instance_no in\n      <foreach collection=\"processInstanceNos\" item=\"processInstanceNo\" open=\"(\" separator=\",\" close=\")\">\n        #{processInstanceNo}\n      </foreach>\n    </where>\n  </select>\n  <select id=\"selectProcessInstanceByParentInstanceNo\" resultMap=\"BaseResultMap\">\n    select\n    <include refid=\"Base_Column_List\"/>\n    from process_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    <where>\n      deleted = 0 and parent_instance_no=#{parentInstanceNo}\n    </where>\n  </select>\n  <select id=\"selectProcessInstanceByParentNodeInstanceNo\" resultMap=\"BaseResultMap\">\n    select\n    <include refid=\"Base_Column_List\"/>\n    from process_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    <where>\n      deleted = 0 and parent_instance_no=#{parentInstanceNo} and parent_node_instance_no=#{parentNodeInstanceNo}\n    </where>\n  </select>  \n  <sql id=\"pagerWhere\">\n    <where> deleted = 0\n      <if test=\"fieldMap.instanceNo != null\">\n        and instance_no=#{fieldMap.instanceNo.value}\n      </if>\n      <if test=\"fieldMap.processType != null\">\n        and process_type=#{fieldMap.processType.value}\n      </if>\n      <if test=\"fieldMap.bizNo != null\">\n        and biz_no=#{fieldMap.bizNo.value}\n      </if>\n      <if test=\"fieldMap.productCode != null\">\n        and product_code=#{fieldMap.productCode.value}\n      </if>\n      <if test=\"fieldMap.productCodeList != null\">\n        and (product_code is null or product_code in\n        <foreach collection=\"fieldMap.productCodeList.value\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n          #{item}\n        </foreach>\n        )\n      </if>\n      <if test=\"fieldMap.processDefId != null\">\n        and process_def_id=#{fieldMap.processDefId.value}\n      </if>\n      <if test=\"fieldMap.bizStatus != null\">\n        and biz_status=#{fieldMap.bizStatus.value}\n      </if> \n      <if test=\"fieldMap.status != null\">\n        and status=#{fieldMap.status.value}\n      </if>       \n      <if test=\"fieldMap.creator != null\">\n        and creator=#{fieldMap.creator.value}\n      </if>\n      <if test=\"fieldMap.createdDateStart != null\">\n        and created_date &gt;=#{fieldMap.createdDateStart.value}\n      </if> \n      <if test=\"fieldMap.createdDateEnd != null\">\n        and created_date &lt;=#{fieldMap.createdDateEnd.value}\n      </if>  \n      <if test=\"fieldMap.keyField != null\">\n        and key_field =#{fieldMap.keyField.value}\n      </if>\n      <if test=\"fieldMap.keyField2 != null\">\n        and key_field2 like CONCAT(#{fieldMap.keyField2.value},'%')\n      </if>\n      <if test=\"fieldMap.instanceNoStart != null\">\n        and instanceNo &gt;#{fieldMap.instanceNoStart.value}\n      </if> \n      <if test=\"fieldMap.instanceNoEnd != null\">\n        and instanceNo &lt;#{fieldMap.instanceNoEnd.value}\n      </if>       \n    </where>\n  </sql>\n</mapper>"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/resources/easyflow/shardingmapper/ProcessNodeExecutionMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.jd.easyflow.process.infrastructure.persistence.mapper.ProcessNodeExecutionMapper\">\n  <resultMap id=\"BaseResultMap\" type=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessNodeExecution\">\n    <id column=\"id\" jdbcType=\"BIGINT\" property=\"id\" />\n    <result column=\"node_execution_no\" jdbcType=\"VARCHAR\" property=\"nodeExecutionNo\" />\n    <result column=\"node_instance_no\" jdbcType=\"VARCHAR\" property=\"nodeInstanceNo\" />\n    <result column=\"event_id\" jdbcType=\"VARCHAR\" property=\"eventId\" />\n    <result column=\"process_def_id\" jdbcType=\"VARCHAR\" property=\"processDefId\" />\n    <result column=\"node_id\" jdbcType=\"VARCHAR\" property=\"nodeId\" />\n    <result column=\"start_time\" jdbcType=\"TIMESTAMP\" property=\"startTime\" />\n    <result column=\"end_time\" jdbcType=\"TIMESTAMP\" property=\"endTime\" />\n    <result column=\"status\" jdbcType=\"VARCHAR\" property=\"status\" />\n    <result column=\"product_code\" jdbcType=\"VARCHAR\" property=\"productCode\" />\n    <result column=\"executor\" jdbcType=\"VARCHAR\" property=\"executor\" />\n    <result column=\"next_node_instances\" jdbcType=\"VARCHAR\" property=\"nextNodeInstances\" />\n    <result column=\"ext_data\" jdbcType=\"OTHER\" property=\"extData\" />\n    <result column=\"created_date\" jdbcType=\"TIMESTAMP\" property=\"createdDate\" />\n    <result column=\"modified_date\" jdbcType=\"TIMESTAMP\" property=\"modifiedDate\" />\n    <result column=\"deleted\" jdbcType=\"BIT\" property=\"deleted\" />\n  </resultMap>\n  <sql id=\"Base_Column_List\">\n    id, node_execution_no, node_instance_no, event_id, process_def_id, node_id, start_time, \n    end_time, status, product_code, executor, next_node_instances, ext_data, created_date, \n    modified_date, deleted\n  </sql>\n  <select id=\"selectByPrimaryKey\" parameterType=\"java.lang.Long\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_node_execution${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </select>\n  <delete id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Long\">\n    update process_node_execution${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()} set deleted=1\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </delete>\n  <insert id=\"insert\" keyColumn=\"id\" keyProperty=\"id\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessNodeExecution\" useGeneratedKeys=\"false\">\n    insert into process_node_execution${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()} (id, node_execution_no, node_instance_no, \n      event_id, process_def_id, node_id, \n      start_time, end_time, status, \n      product_code, executor, next_node_instances, \n      ext_data)\n    values (#{id, jdbcType=BIGINT}, #{nodeExecutionNo,jdbcType=VARCHAR}, #{nodeInstanceNo,jdbcType=VARCHAR}, \n      #{eventId,jdbcType=VARCHAR}, #{processDefId,jdbcType=VARCHAR}, #{nodeId,jdbcType=VARCHAR}, \n      #{startTime,jdbcType=TIMESTAMP}, #{endTime,jdbcType=TIMESTAMP}, #{status,jdbcType=VARCHAR}, \n      #{productCode,jdbcType=VARCHAR}, #{executor,jdbcType=VARCHAR}, #{nextNodeInstances,jdbcType=VARCHAR}, \n      #{extData,jdbcType=OTHER})\n  </insert>\n  <insert id=\"insertWithCreatedDate\" keyColumn=\"id\" keyProperty=\"id\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessNodeExecution\" useGeneratedKeys=\"false\">\n    insert into process_node_execution${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()} (id, node_execution_no, node_instance_no, \n      event_id, process_def_id, node_id, \n      start_time, end_time, status, \n      product_code, executor, next_node_instances, \n      ext_data, created_date)\n    values (#{id, jdbcType=BIGINT}, #{nodeExecutionNo,jdbcType=VARCHAR}, #{nodeInstanceNo,jdbcType=VARCHAR}, \n      #{eventId,jdbcType=VARCHAR}, #{processDefId,jdbcType=VARCHAR}, #{nodeId,jdbcType=VARCHAR}, \n      #{startTime,jdbcType=TIMESTAMP}, #{endTime,jdbcType=TIMESTAMP}, #{status,jdbcType=VARCHAR}, \n      #{productCode,jdbcType=VARCHAR}, #{executor,jdbcType=VARCHAR}, #{nextNodeInstances,jdbcType=VARCHAR}, \n      #{extData,jdbcType=OTHER}, #{createdDate,jdbcType=TIMESTAMP})\n  </insert>  \n  <update id=\"updateByPrimaryKeySelective\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessNodeExecution\">\n    update process_node_execution${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    <set>\n      <if test=\"nodeExecutionNo != null\">\n        node_execution_no = #{nodeExecutionNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"nodeInstanceNo != null\">\n        node_instance_no = #{nodeInstanceNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"eventId != null\">\n        event_id = #{eventId,jdbcType=VARCHAR},\n      </if>\n      <if test=\"processDefId != null\">\n        process_def_id = #{processDefId,jdbcType=VARCHAR},\n      </if>\n      <if test=\"nodeId != null\">\n        node_id = #{nodeId,jdbcType=VARCHAR},\n      </if>\n      <if test=\"startTime != null\">\n        start_time = #{startTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"endTime != null\">\n        end_time = #{endTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"status != null\">\n        status = #{status,jdbcType=VARCHAR},\n      </if>\n      <if test=\"productCode != null\">\n        product_code = #{productCode,jdbcType=VARCHAR},\n      </if>\n      <if test=\"executor != null\">\n        executor = #{executor,jdbcType=VARCHAR},\n      </if>\n      <if test=\"nextNodeInstances != null\">\n        next_node_instances = #{nextNodeInstances,jdbcType=VARCHAR},\n      </if>\n      <if test=\"extData != null\">\n        ext_data = #{extData,jdbcType=OTHER},\n      </if>\n    </set>\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </update>\n  <update id=\"updateByPrimaryKey\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessNodeExecution\">\n    update process_node_execution${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    set node_execution_no = #{nodeExecutionNo,jdbcType=VARCHAR},\n      node_instance_no = #{nodeInstanceNo,jdbcType=VARCHAR},\n      event_id = #{eventId,jdbcType=VARCHAR},\n      process_def_id = #{processDefId,jdbcType=VARCHAR},\n      node_id = #{nodeId,jdbcType=VARCHAR},\n      start_time = #{startTime,jdbcType=TIMESTAMP},\n      end_time = #{endTime,jdbcType=TIMESTAMP},\n      status = #{status,jdbcType=VARCHAR},\n      product_code = #{productCode,jdbcType=VARCHAR},\n      executor = #{executor,jdbcType=VARCHAR},\n      next_node_instances = #{nextNodeInstances,jdbcType=VARCHAR},\n      ext_data = #{extData,jdbcType=OTHER}\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </update>\n  \n  <update id=\"updateByProcessNodeExecutionNo\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessNodeExecution\">\n    update process_node_execution${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    set \n      node_instance_no = #{nodeInstanceNo,jdbcType=VARCHAR},\n      event_id = #{eventId,jdbcType=VARCHAR},\n      process_def_id = #{processDefId,jdbcType=VARCHAR},\n      node_id = #{nodeId,jdbcType=VARCHAR},\n      start_time = #{startTime,jdbcType=TIMESTAMP},\n      end_time = #{endTime,jdbcType=TIMESTAMP},\n      status = #{status,jdbcType=VARCHAR},\n      product_code = #{productCode,jdbcType=VARCHAR},\n      executor = #{executor,jdbcType=VARCHAR},\n      next_node_instances = #{nextNodeInstances,jdbcType=VARCHAR},\n      ext_data = #{extData,jdbcType=OTHER}\n    where node_execution_no = #{nodeExecutionNo,jdbcType=VARCHAR} and deleted=0\n  </update>  \n  \n  <select id=\"selectByNodeExecutionNo\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_node_execution${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    where node_execution_no = #{nodeExecutionNo} and deleted=0\n  </select>\n  <select id=\"countByPagerCondition\" parameterType=\"com.jd.easyflow.common.dto.pager.PagerCondition\" resultType=\"long\">\n    select\n    count(node_execution_no)\n    from process_node_execution${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    <include refid=\"pagerWhere\" />\n  </select>\n\n  <select id=\"selectByPageCondition\" parameterType=\"com.jd.easyflow.common.dto.pager.PagerCondition\" resultMap=\"BaseResultMap\">\n    select\n    <include refid=\"Base_Column_List\" />\n    from process_node_execution${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    <include refid=\"pagerWhere\" />\n    <if test=\"sortMap.startTime != null\">\n      order by start_time ${sortMap.startTime.type},id  ${sortMap.startTime.type}\n    </if>  \n    limit #{start},#{pageSize}\n  </select>\n  <sql id=\"pagerWhere\">\n    <where> deleted = 0\n      <if test=\"fieldMap.nodeInstanceNoList != null\">\n        and node_instance_no in\n        <foreach collection=\"fieldMap.nodeInstanceNoList.value\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n          #{item}\n        </foreach>\n      </if>\n      <if test=\"fieldMap.nodeExecutionNo != null\">\n        and node_execution_no=#{fieldMap.nodeExecutionNo.value}\n      </if>\n      <if test=\"fieldMap.eventId != null\">\n        and event_id=#{fieldMap.eventId.value}\n      </if>\n      <if test=\"fieldMap.eventIdIsNull!=null\">\n        and event_id is null\n      </if>\n      <if test=\"fieldMap.processDefId != null\">\n        and process_def_id=#{fieldMap.processDefId.value}\n      </if>\n      <if test=\"fieldMap.nodeId != null\">\n        and node_id=#{fieldMap.nodeId.value}\n      </if> \n      <if test=\"fieldMap.startTimeStart != null\">\n        and start_time &gt;=#{fieldMap.startTimeStart.value}\n      </if> \n      <if test=\"fieldMap.startTimeEnd != null\">\n        and start_time &lt;=#{fieldMap.startTimeEnd.value}\n      </if>  \n      <if test=\"fieldMap.productCode != null\">\n        and product_code =#{fieldMap.productCode.value}\n      </if>\n    </where>\n  </sql>  \n  \n</mapper>"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/resources/easyflow/shardingmapper/ProcessNodeInstanceMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.jd.easyflow.process.infrastructure.persistence.mapper.ProcessNodeInstanceMapper\">\n  <resultMap id=\"BaseResultMap\" type=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessNodeInstance\">\n    <id column=\"id\" jdbcType=\"BIGINT\" property=\"id\" />\n    <result column=\"node_instance_no\" jdbcType=\"VARCHAR\" property=\"nodeInstanceNo\" />\n    <result column=\"process_instance_no\" jdbcType=\"VARCHAR\" property=\"processInstanceNo\" />\n    <result column=\"process_def_id\" jdbcType=\"VARCHAR\" property=\"processDefId\" />\n    <result column=\"node_id\" jdbcType=\"VARCHAR\" property=\"nodeId\" />\n    <result column=\"start_time\" jdbcType=\"TIMESTAMP\" property=\"startTime\" />\n    <result column=\"end_time\" jdbcType=\"TIMESTAMP\" property=\"endTime\" />\n    <result column=\"status\" jdbcType=\"VARCHAR\" property=\"status\" />\n    <result column=\"product_code\" jdbcType=\"VARCHAR\" property=\"productCode\" />\n    <result column=\"executors\" jdbcType=\"VARCHAR\" property=\"executors\" />\n    <result column=\"previous_node_instances\" jdbcType=\"VARCHAR\" property=\"previousNodeInstances\" />\n    <result column=\"next_node_instances\" jdbcType=\"VARCHAR\" property=\"nextNodeInstances\" />\n    <result column=\"vars\" jdbcType=\"OTHER\" property=\"vars\" />\n    <result column=\"ext_data\" jdbcType=\"OTHER\" property=\"extData\" />\n    <result column=\"created_date\" jdbcType=\"TIMESTAMP\" property=\"createdDate\" />\n    <result column=\"modified_date\" jdbcType=\"TIMESTAMP\" property=\"modifiedDate\" />\n    <result column=\"deleted\" jdbcType=\"BIT\" property=\"deleted\" />\n  </resultMap>\n  <sql id=\"Base_Column_List\">\n    id, node_instance_no, process_instance_no, process_def_id, node_id, start_time, end_time, \n    status, product_code, executors, previous_node_instances, next_node_instances, vars, ext_data, created_date, \n    modified_date, deleted\n  </sql>\n  <select id=\"selectByPrimaryKey\" parameterType=\"java.lang.Long\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_node_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </select>\n  <delete id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Long\">\n    update process_node_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()} set deleted=1\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </delete>\n  <insert id=\"insert\" keyColumn=\"id\" keyProperty=\"id\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessNodeInstance\" useGeneratedKeys=\"false\">\n    insert into process_node_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()} (id, node_instance_no, process_instance_no, \n      process_def_id, node_id, start_time, \n      end_time, status, product_code, \n      executors, previous_node_instances, next_node_instances, vars, \n      ext_data)\n    values (#{id, jdbcType=BIGINT}, #{nodeInstanceNo,jdbcType=VARCHAR}, #{processInstanceNo,jdbcType=VARCHAR}, \n      #{processDefId,jdbcType=VARCHAR}, #{nodeId,jdbcType=VARCHAR}, #{startTime,jdbcType=TIMESTAMP}, \n      #{endTime,jdbcType=TIMESTAMP}, #{status,jdbcType=VARCHAR}, #{productCode,jdbcType=VARCHAR}, \n      #{executors,jdbcType=VARCHAR}, #{previousNodeInstances,jdbcType=VARCHAR}, #{nextNodeInstances,jdbcType=VARCHAR}, #{vars,jdbcType=OTHER}, \n      #{extData,jdbcType=OTHER})\n  </insert>\n  <insert id=\"insertWithCreatedDate\" keyColumn=\"id\" keyProperty=\"id\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessNodeInstance\" useGeneratedKeys=\"false\">\n    insert into process_node_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()} (id, node_instance_no, process_instance_no, \n      process_def_id, node_id, start_time, \n      end_time, status, product_code, \n      executors, previous_node_instances, next_node_instances, vars, \n      ext_data, created_date)\n    values (#{id, jdbcType=BIGINT}, #{nodeInstanceNo,jdbcType=VARCHAR}, #{processInstanceNo,jdbcType=VARCHAR}, \n      #{processDefId,jdbcType=VARCHAR}, #{nodeId,jdbcType=VARCHAR}, #{startTime,jdbcType=TIMESTAMP}, \n      #{endTime,jdbcType=TIMESTAMP}, #{status,jdbcType=VARCHAR}, #{productCode,jdbcType=VARCHAR}, \n      #{executors,jdbcType=VARCHAR}, #{previousNodeInstances,jdbcType=VARCHAR}, #{nextNodeInstances,jdbcType=VARCHAR}, #{vars,jdbcType=OTHER}, \n      #{extData,jdbcType=OTHER}, #{createdDate,jdbcType=TIMESTAMP})\n  </insert>  \n  <update id=\"updateByPrimaryKeySelective\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessNodeInstance\">\n    update process_node_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    <set>\n      <if test=\"nodeInstanceNo != null\">\n        node_instance_no = #{nodeInstanceNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"processInstanceNo != null\">\n        process_instance_no = #{processInstanceNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"processDefId != null\">\n        process_def_id = #{processDefId,jdbcType=VARCHAR},\n      </if>\n      <if test=\"nodeId != null\">\n        node_id = #{nodeId,jdbcType=VARCHAR},\n      </if>\n      <if test=\"startTime != null\">\n        start_time = #{startTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"endTime != null\">\n        end_time = #{endTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"status != null\">\n        status = #{status,jdbcType=VARCHAR},\n      </if>\n      <if test=\"productCode != null\">\n        product_code = #{productCode,jdbcType=VARCHAR},\n      </if>\n      <if test=\"executors != null\">\n        executors = #{executors,jdbcType=VARCHAR},\n      </if>\n      <if test=\"previousNodeInstances != null\">\n        previous_node_instances = #{previousNodeInstances,jdbcType=VARCHAR},\n      </if>      \n      <if test=\"nextNodeInstances != null\">\n        next_node_instances = #{nextNodeInstances,jdbcType=VARCHAR},\n      </if>\n      <if test=\"vars != null\">\n        vars = #{vars,jdbcType=OTHER},\n      </if>\n      <if test=\"extData != null\">\n        ext_data = #{extData,jdbcType=OTHER},\n      </if>\n    </set>\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </update>\n  <update id=\"updateByPrimaryKey\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessNodeInstance\">\n    update process_node_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    set node_instance_no = #{nodeInstanceNo,jdbcType=VARCHAR},\n      process_instance_no = #{processInstanceNo,jdbcType=VARCHAR},\n      process_def_id = #{processDefId,jdbcType=VARCHAR},\n      node_id = #{nodeId,jdbcType=VARCHAR},\n      start_time = #{startTime,jdbcType=TIMESTAMP},\n      end_time = #{endTime,jdbcType=TIMESTAMP},\n      status = #{status,jdbcType=VARCHAR},\n      product_code = #{productCode,jdbcType=VARCHAR},\n      executors = #{executors,jdbcType=VARCHAR},\n      previous_node_instances = #{previousNodeInstances,jdbcType=VARCHAR},\n      next_node_instances = #{nextNodeInstances,jdbcType=VARCHAR},\n      vars = #{vars,jdbcType=OTHER},\n      ext_data = #{extData,jdbcType=OTHER}\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </update>\n  \n  <update id=\"updateByProcessNodeInstanceNo\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessNodeInstance\">\n    update process_node_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    set \n      process_instance_no = #{processInstanceNo,jdbcType=VARCHAR},\n      process_def_id = #{processDefId,jdbcType=VARCHAR},\n      node_id = #{nodeId,jdbcType=VARCHAR},\n      start_time = #{startTime,jdbcType=TIMESTAMP},\n      end_time = #{endTime,jdbcType=TIMESTAMP},\n      status = #{status,jdbcType=VARCHAR},\n      product_code = #{productCode,jdbcType=VARCHAR},\n      executors = #{executors,jdbcType=VARCHAR},\n      previous_node_instances = #{previousNodeInstances,jdbcType=VARCHAR},\n      next_node_instances = #{nextNodeInstances,jdbcType=VARCHAR},\n      vars = #{vars,jdbcType=OTHER},\n      ext_data = #{extData,jdbcType=OTHER}\n    where node_instance_no = #{nodeInstanceNo,jdbcType=VARCHAR} and deleted=0\n  </update>  \n  \n    <update id=\"deleteByProcessNodeInstanceNo\" parameterType=\"java.lang.String\">\n    update process_node_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    set \n      deleted=1\n    where node_instance_no = #{nodeInstanceNo,jdbcType=VARCHAR} and deleted=0\n  </update>  \n  \n  <select id=\"getOpenNodeInstance\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_node_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    where process_instance_no=#{processInstanceNo} and node_id=#{nodeId} and status in ('ACTIVE','INACTIVE') and deleted=0\n  </select>  \n  \n  <select id=\"findNodeInstances\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_node_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    <where> deleted=0\n      <if test=\"processInstanceNo != null\">\n         and process_instance_no = #{processInstanceNo,jdbcType=VARCHAR}\n      </if>\n      <if test=\"nodeId != null\">\n        and node_id = #{nodeId}\n      </if>\n      <if test=\"status != null and status.size>0\">\n        AND `status` IN\n        <foreach collection=\"status\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n          #{item}\n        </foreach>\n      </if>\n    </where>\n  </select>  \n  \n    <select id=\"selectByNodeInstanceNo\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_node_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    where node_instance_no=#{nodeInstanceNo} and deleted=0\n  </select>  \n  <select id=\"findActiveNodeInstances\"  resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_node_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    where process_instance_no=#{processInstanceNo} and status='ACTIVE' and deleted=0\n  </select>  \n  \n  <select id=\"findOpenNodeInstances\"  resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_node_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    where process_instance_no=#{processInstanceNo} and status!='CLOSE' and status!='INVALID' and deleted=0\n  </select>\n  \n    <select id=\"queryNodeInstanceByNos\" resultMap=\"BaseResultMap\">\n    select\n    <include refid=\"Base_Column_List\"/>\n    from process_node_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    <where>\n      deleted = 0 and node_instance_no in\n      <foreach collection=\"nodeInstanceNos\" item=\"nodeInstanceNo\" open=\"(\" separator=\",\" close=\")\">\n        #{nodeInstanceNo}\n      </foreach>\n    </where>\n  </select>\n\n</mapper>"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/resources/easyflow/shardingmapper/ProcessTaskAssignMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.jd.easyflow.process.infrastructure.persistence.mapper.ProcessTaskAssignMapper\">\n  <resultMap id=\"BaseResultMap\" type=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessTaskAssign\">\n    <id column=\"id\" jdbcType=\"BIGINT\" property=\"id\" />\n    <result column=\"assign_no\" jdbcType=\"VARCHAR\" property=\"assignNo\" />\n    <result column=\"task_no\" jdbcType=\"VARCHAR\" property=\"taskNo\" />\n    <result column=\"assign_type\" jdbcType=\"VARCHAR\" property=\"assignType\" />\n    <result column=\"assign_group\" jdbcType=\"VARCHAR\" property=\"assignGroup\" />\n    <result column=\"assign_group2\" jdbcType=\"VARCHAR\" property=\"assignGroup2\" />\n    <result column=\"assign_user\" jdbcType=\"VARCHAR\" property=\"assignUser\" />\n    <result column=\"status\" jdbcType=\"VARCHAR\" property=\"status\" />\n    <result column=\"assign_time\" jdbcType=\"TIMESTAMP\" property=\"assignTime\" />\n    <result column=\"product_code\" jdbcType=\"VARCHAR\" property=\"productCode\" />\n    <result column=\"ext_data\" jdbcType=\"OTHER\" property=\"extData\" />\n    <result column=\"created_date\" jdbcType=\"TIMESTAMP\" property=\"createdDate\" />\n    <result column=\"modified_date\" jdbcType=\"TIMESTAMP\" property=\"modifiedDate\" />\n    <result column=\"deleted\" jdbcType=\"BIT\" property=\"deleted\" />\n  </resultMap>\n  <sql id=\"Base_Column_List\">\n    id, assign_no, task_no, assign_type, assign_group,assign_group2, assign_user, status, assign_time, \n    product_code, ext_data, created_date, modified_date, deleted\n  </sql>\n  <select id=\"selectByPrimaryKey\" parameterType=\"java.lang.Long\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_task_assign${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </select>\n  <delete id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Long\">\n    update process_task_assign${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()} set deleted=1\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </delete>\n  <insert id=\"insert\" keyColumn=\"id\" keyProperty=\"id\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessTaskAssign\" useGeneratedKeys=\"false\">\n    insert into process_task_assign${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()} (id, assign_no, task_no, assign_type, \n      assign_group, assign_group2, assign_user, status, \n      assign_time,\n      product_code, ext_data)\n    values (#{id, jdbcType=BIGINT}, #{assignNo,jdbcType=VARCHAR}, #{taskNo,jdbcType=VARCHAR}, #{assignType,jdbcType=VARCHAR}, \n      #{assignGroup,jdbcType=VARCHAR},#{assignGroup2,jdbcType=VARCHAR}, #{assignUser,jdbcType=VARCHAR}, #{status,jdbcType=VARCHAR}, \n      #{assignTime,jdbcType=TIMESTAMP}, \n      #{productCode,jdbcType=VARCHAR}, #{extData,jdbcType=OTHER})\n  </insert>\n  <insert id=\"insertWithCreatedDate\" keyColumn=\"id\" keyProperty=\"id\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessTaskAssign\" useGeneratedKeys=\"false\">\n    insert into process_task_assign${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()} (id, assign_no, task_no, assign_type, \n      assign_group, assign_group2, assign_user, status, \n      assign_time,\n      product_code, ext_data, created_date)\n    values (#{id, jdbcType=BIGINT}, #{assignNo,jdbcType=VARCHAR}, #{taskNo,jdbcType=VARCHAR}, #{assignType,jdbcType=VARCHAR}, \n      #{assignGroup,jdbcType=VARCHAR},#{assignGroup2,jdbcType=VARCHAR}, #{assignUser,jdbcType=VARCHAR}, #{status,jdbcType=VARCHAR}, \n      #{assignTime,jdbcType=TIMESTAMP}, \n      #{productCode,jdbcType=VARCHAR}, #{extData,jdbcType=OTHER}, #{createdDate,jdbcType=TIMESTAMP})\n  </insert>  \n  <update id=\"updateByPrimaryKeySelective\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessTaskAssign\">\n    update process_task_assign${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    <set>\n      <if test=\"assignNo != null\">\n        assign_no = #{assignNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"taskNo != null\">\n        task_no = #{taskNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"assignType != null\">\n        assign_type = #{assignType,jdbcType=VARCHAR},\n      </if>\n      <if test=\"assignGroup != null\">\n        assign_group = #{assignGroup,jdbcType=VARCHAR},\n      </if>\n      <if test=\"assignGroup2 != null\">\n        assign_group2 = #{assignGroup2,jdbcType=VARCHAR},\n      </if>      \n      <if test=\"assignUser != null\">\n        assign_user = #{assignUser,jdbcType=VARCHAR},\n      </if>\n      <if test=\"status != null\">\n        status = #{status,jdbcType=VARCHAR},\n      </if>\n      <if test=\"assignTime != null\">\n        assign_time = #{assignTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"productCode != null\">\n        product_code = #{productCode,jdbcType=VARCHAR},\n      </if>\n      <if test=\"extData != null\">\n        ext_data = #{extData,jdbcType=OTHER},\n      </if>\n    </set>\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </update>\n  <update id=\"updateByPrimaryKey\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessTaskAssign\">\n    update process_task_assign${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    set assign_no = #{assignNo,jdbcType=VARCHAR},\n      task_no = #{taskNo,jdbcType=VARCHAR},\n      assign_type = #{assignType,jdbcType=VARCHAR},\n      assign_group = #{assignGroup,jdbcType=VARCHAR},\n      assign_group2 = #{assignGroup2,jdbcType=VARCHAR},\n      assign_user = #{assignUser,jdbcType=VARCHAR},\n      status = #{status,jdbcType=VARCHAR},\n      assign_time = #{assignTime,jdbcType=TIMESTAMP},\n      product_code = #{productCode,jdbcType=VARCHAR},\n      ext_data = #{extData,jdbcType=OTHER}\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </update>\n  <update id=\"updateByTaskAssignNo\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessTaskAssign\">\n    update process_task_assign${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    set \n      task_no = #{taskNo,jdbcType=VARCHAR},\n      assign_type = #{assignType,jdbcType=VARCHAR},\n      assign_group = #{assignGroup,jdbcType=VARCHAR},\n      assign_group2 = #{assignGroup2,jdbcType=VARCHAR},\n      assign_user = #{assignUser,jdbcType=VARCHAR},\n      status = #{status,jdbcType=VARCHAR},\n      assign_time = #{assignTime,jdbcType=TIMESTAMP},\n      product_code = #{productCode,jdbcType=VARCHAR},\n      ext_data = #{extData,jdbcType=OTHER}\n    where assign_no = #{assignNo,jdbcType=VARCHAR} and deleted=0\n  </update>\n  <update id=\"deleteTaskAssignByAssignNo\" parameterType=\"java.lang.String\">\n    update process_task_assign${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    set \n      deleted=1\n    where assign_no = #{assignNo,jdbcType=VARCHAR} and deleted=0\n  </update>  \n  \n    \n    <select id=\"list\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_task_assign${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    <where> deleted=0\n      <if test=\"id != null\">\n         and id = #{id}\n      </if>\n      <if test=\"assignNo != null\">\n        and assign_no = #{assignNo}\n      </if>\n      <if test=\"taskNo != null\">\n        and task_no = #{taskNo}\n      </if>      \n      <if test=\"assignType != null\">\n        and assign_type = #{assignType}\n      </if>\n      <if test=\"assignGroup != null\">\n        and assign_group = #{assignGroup}\n      </if>   \n      <if test=\"assignGroup2 != null\">\n        and assign_group2 = #{assignGroup2}\n      </if>            \n      <if test=\"assignUser != null\">\n        and assign_user = #{assignUser}\n      </if>  \n      <if test=\"status != null\">\n        and status = #{status}\n      </if>    \n      <if test=\"assignTimeStart != null\">\n        and assign_time &gt;= #{assignTimeStart}\n      </if>  \n      <if test=\"assignTimeEnd != null\">\n        and assign_time &lt;= #{assignTimeEnd}\n      </if>  \n      <if test=\"createdDateStart != null\">\n        and created_date &gt;= #{createdDateStart}\n      </if>  \n      <if test=\"createdDateEnd != null\">\n        and created_date &lt;= #{createdDateEnd}\n      </if> \n      <if test=\"modifiedDateStart != null\">\n        and modifiedDate &gt;= #{modifiedDateStart}\n      </if>  \n      <if test=\"modifiedDateEnd != null\">\n        and modifiedDate &lt;= #{modifiedDateEnd}\n      </if>   \n    </where>\n  </select>\n\t<select id=\"listByTaskNoList\" resultMap=\"BaseResultMap\">\n\t\tselect\n\t\t<include refid=\"Base_Column_List\" />\n\t\tfrom process_task_assign${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n\t\t<where>\n\t\t\tdeleted=0 and task_no in\n\t\t\t<foreach collection=\"taskNoList\" item=\"item\"\n\t\t\t\tindex=\"index\" open=\"(\" separator=\",\" close=\")\">\n\t\t\t\t#{item}\n\t\t\t</foreach>\n\t\t</where>\n\t</select>    \n</mapper>"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/resources/easyflow/shardingmapper/ProcessTaskEventMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.jd.easyflow.process.infrastructure.persistence.mapper.ProcessTaskEventMapper\">\n  <resultMap id=\"BaseResultMap\" type=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessTaskEvent\">\n    <id column=\"id\" jdbcType=\"BIGINT\" property=\"id\" />\n    <result column=\"event_no\" jdbcType=\"VARCHAR\" property=\"eventNo\" />\n    <result column=\"task_no\" jdbcType=\"VARCHAR\" property=\"taskNo\" />\n    <result column=\"event_type\" jdbcType=\"VARCHAR\" property=\"eventType\" />\n    <result column=\"event_user\" jdbcType=\"VARCHAR\" property=\"eventUser\" />\n    <result column=\"event_time\" jdbcType=\"TIMESTAMP\" property=\"eventTime\" />\n    <result column=\"event_biz_result\" jdbcType=\"VARCHAR\" property=\"eventBizResult\" />\n    <result column=\"event_biz_data\" jdbcType=\"OTHER\" property=\"eventBizData\" />\n    <result column=\"instance_biz_status\" jdbcType=\"VARCHAR\" property=\"instanceBizStatus\" />\n    <result column=\"instance_biz_data\" jdbcType=\"OTHER\" property=\"instanceBizData\" />    \n    <result column=\"product_code\" jdbcType=\"VARCHAR\" property=\"productCode\" />\n    <result column=\"ext_data\" jdbcType=\"OTHER\" property=\"extData\" />\n    <result column=\"created_date\" jdbcType=\"TIMESTAMP\" property=\"createdDate\" />\n    <result column=\"modified_date\" jdbcType=\"TIMESTAMP\" property=\"modifiedDate\" />\n    <result column=\"deleted\" jdbcType=\"BIT\" property=\"deleted\" />\n  </resultMap>\n  <sql id=\"Base_Column_List\">\n    id, event_no, task_no, event_type, event_user, event_time, event_biz_result, event_biz_data, instance_biz_status, instance_biz_data, \n    product_code, ext_data, created_date, modified_date, deleted\n  </sql>\n  <select id=\"selectByPrimaryKey\" parameterType=\"java.lang.Long\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_task_event${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </select>\n  <delete id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Long\">\n    update process_task_event${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()} set deleted=1\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </delete>\n  <insert id=\"insert\" keyColumn=\"id\" keyProperty=\"id\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessTaskEvent\" useGeneratedKeys=\"false\">\n    insert into process_task_event${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()} (id, event_no, task_no, event_type, \n      event_user, event_time, event_biz_result, \n      event_biz_data, instance_biz_status,instance_biz_data, product_code, ext_data\n      )\n    values (#{id, jdbcType=BIGINT}, #{eventNo,jdbcType=VARCHAR}, #{taskNo,jdbcType=VARCHAR}, #{eventType,jdbcType=VARCHAR}, \n      #{eventUser,jdbcType=VARCHAR}, #{eventTime,jdbcType=TIMESTAMP}, #{eventBizResult,jdbcType=VARCHAR}, \n      #{eventBizData,jdbcType=OTHER},#{instanceBizStatus,jdbcType=VARCHAR},#{instanceBizData,jdbcType=OTHER},  #{productCode,jdbcType=VARCHAR}, #{extData,jdbcType=OTHER}\n      )\n  </insert>\n  <insert id=\"insertWithCreatedDate\" keyColumn=\"id\" keyProperty=\"id\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessTaskEvent\" useGeneratedKeys=\"false\">\n    insert into process_task_event${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()} (id, event_no, task_no, event_type, \n      event_user, event_time, event_biz_result, \n      event_biz_data, instance_biz_status,instance_biz_data, product_code, ext_data, created_date\n      )\n    values (#{id, jdbcType=BIGINT}, #{eventNo,jdbcType=VARCHAR}, #{taskNo,jdbcType=VARCHAR}, #{eventType,jdbcType=VARCHAR}, \n      #{eventUser,jdbcType=VARCHAR}, #{eventTime,jdbcType=TIMESTAMP}, #{eventBizResult,jdbcType=VARCHAR}, \n      #{eventBizData,jdbcType=OTHER},#{instanceBizStatus,jdbcType=VARCHAR},#{instanceBizData,jdbcType=OTHER},  #{productCode,jdbcType=VARCHAR}, #{extData,jdbcType=OTHER}, #{createdDate,jdbcType=TIMESTAMP}\n      )\n  </insert>  \n  <update id=\"updateByPrimaryKeySelective\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessTaskEvent\">\n    update process_task_event${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    <set>\n      <if test=\"eventNo != null\">\n        event_no = #{eventNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"taskNo != null\">\n        task_no = #{taskNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"eventType != null\">\n        event_type = #{eventType,jdbcType=VARCHAR},\n      </if>\n      <if test=\"eventUser != null\">\n        event_user = #{eventUser,jdbcType=VARCHAR},\n      </if>\n      <if test=\"eventTime != null\">\n        event_time = #{eventTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"eventBizResult != null\">\n        event_biz_result = #{eventBizResult,jdbcType=VARCHAR},\n      </if>\n      <if test=\"eventBizData != null\">\n        event_biz_data = #{eventBizData,jdbcType=OTHER},\n      </if>\n      <if test=\"instanceBizStatus != null\">\n        instance_biz_status = #{instanceBizStatus,jdbcType=VARCHAR},\n      </if>\n      <if test=\"instanceBizData != null\">\n        instance_biz_data = #{instanceBizData,jdbcType=OTHER},\n      </if>      \n      <if test=\"productCode != null\">\n        product_code = #{productCode,jdbcType=VARCHAR},\n      </if>\n      <if test=\"extData != null\">\n        ext_data = #{extData,jdbcType=OTHER},\n      </if>\n    </set>\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </update>\n  <update id=\"updateByPrimaryKey\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessTaskEvent\">\n    update process_task_event${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    set event_no = #{eventNo,jdbcType=VARCHAR},\n      task_no = #{taskNo,jdbcType=VARCHAR},\n      event_type = #{eventType,jdbcType=VARCHAR},\n      event_user = #{eventUser,jdbcType=VARCHAR},\n      event_time = #{eventTime,jdbcType=TIMESTAMP},\n      event_biz_result = #{eventBizResult,jdbcType=VARCHAR},\n      event_biz_data = #{eventBizData,jdbcType=OTHER},\n      instance_biz_status = #{instanceBizStatus,jdbcType=VARCHAR},\n      instance_biz_data = #{instanceBizData,jdbcType=OTHER},      \n      product_code = #{productCode,jdbcType=VARCHAR},\n      ext_data = #{extData,jdbcType=OTHER}\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </update>\n  <update id=\"updateByTaskEventNo\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessTaskEvent\">\n    update process_task_event${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    set \n      task_no = #{taskNo,jdbcType=VARCHAR},\n      event_type = #{eventType,jdbcType=VARCHAR},\n      event_user = #{eventUser,jdbcType=VARCHAR},\n      event_time = #{eventTime,jdbcType=TIMESTAMP},\n      event_biz_result = #{eventBizResult,jdbcType=VARCHAR},\n      event_biz_data = #{eventBizData,jdbcType=OTHER},\n      instance_biz_status = #{instanceBizStatus,jdbcType=VARCHAR},\n      instance_biz_data = #{instanceBizData,jdbcType=OTHER},      \n      product_code = #{productCode,jdbcType=VARCHAR},\n      ext_data = #{extData,jdbcType=OTHER}\n    where event_no = #{eventNo,jdbcType=VARCHAR} and deleted=0\n  </update>  \n  \n  <select id=\"list\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_task_event${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    <where> deleted=0\n      <if test=\"id != null\">\n         and id = #{id}\n      </if>\n      <if test=\"eventNo != null\">\n        and event_no = #{eventNo}\n      </if>      \n      <if test=\"taskNo != null\">\n        and task_no = #{taskNo}\n      </if> \n      <if test=\"eventType != null\">\n        and event_type = #{eventType}\n      </if>  \n      <if test=\"eventUser != null\">\n        and event_user = #{eventUser}\n      </if>    \n\n      <if test=\"productCode != null\">\n        and product_code = #{productCode}\n      </if>    \n      <if test=\"eventTimeStart != null\">\n        and event_time &gt;= #{eventTimeStart}\n      </if>  \n      <if test=\"eventTimeEnd != null\">\n        and event_time &lt;= #{eventTimeEnd}\n      </if>  \n      <if test=\"createdDateStart != null\">\n        and created_date &gt;= #{createdDateStart}\n      </if>  \n      <if test=\"createdDateEnd != null\">\n        and created_date &lt;= #{createdDateEnd}\n      </if> \n      <if test=\"modifiedDateStart != null\">\n        and modifiedDate &gt;= #{modifiedDateStart}\n      </if>  \n      <if test=\"modifiedDateEnd != null\">\n        and modifiedDate &lt;= #{modifiedDateEnd}\n      </if>                                                                                 \n    </where>\n  </select>  \n</mapper>"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/resources/easyflow/shardingmapper/ProcessTaskMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.jd.easyflow.process.infrastructure.persistence.mapper.ProcessTaskMapper\">\n  <resultMap id=\"BaseResultMap\" type=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessTask\">\n    <id column=\"id\" jdbcType=\"BIGINT\" property=\"id\" />\n    <result column=\"task_no\" jdbcType=\"VARCHAR\" property=\"taskNo\" />\n    <result column=\"process_type\" jdbcType=\"VARCHAR\" property=\"processType\" />\n    <result column=\"biz_no\" jdbcType=\"VARCHAR\" property=\"bizNo\" />\n    <result column=\"task_biz_code\" jdbcType=\"VARCHAR\" property=\"taskBizCode\" />\n    <result column=\"task_biz_name\" jdbcType=\"VARCHAR\" property=\"taskBizName\" />\n    <result column=\"task_type\" jdbcType=\"VARCHAR\" property=\"taskType\" />\n    <result column=\"process_instance_no\" jdbcType=\"VARCHAR\" property=\"processInstanceNo\" />\n    <result column=\"node_instance_no\" jdbcType=\"VARCHAR\" property=\"nodeInstanceNo\" />\n    <result column=\"node_execution_no\" jdbcType=\"VARCHAR\" property=\"nodeExecutionNo\" />\n    <result column=\"assign_type\" jdbcType=\"VARCHAR\" property=\"assignType\" />\n    <result column=\"assign_info\" jdbcType=\"OTHER\" property=\"assignInfo\" />\n    <result column=\"assign_time\" jdbcType=\"TIMESTAMP\" property=\"assignTime\" />\n    <result column=\"executor\" jdbcType=\"VARCHAR\" property=\"executor\" />\n    <result column=\"execute_biz_result\" jdbcType=\"VARCHAR\" property=\"executeBizResult\" />\n    <result column=\"execute_biz_data\" jdbcType=\"OTHER\" property=\"executeBizData\" />\n    <result column=\"execute_time\" jdbcType=\"TIMESTAMP\" property=\"executeTime\" />\n    <result column=\"product_code\" jdbcType=\"VARCHAR\" property=\"productCode\" />\n    <result column=\"creator\" jdbcType=\"VARCHAR\" property=\"creator\" />\n    <result column=\"status\" jdbcType=\"VARCHAR\" property=\"status\" />\n    <result column=\"ext_data\" jdbcType=\"OTHER\" property=\"extData\" />\n    <result column=\"process_instance_key_field\" jdbcType=\"VARCHAR\" property=\"processInstanceKeyField\" />\n    <result column=\"process_instance_key_field2\" jdbcType=\"VARCHAR\" property=\"processInstanceKeyField2\" />\n    <result column=\"created_date\" jdbcType=\"TIMESTAMP\" property=\"createdDate\" />\n    <result column=\"modified_date\" jdbcType=\"TIMESTAMP\" property=\"modifiedDate\" />\n    <result column=\"deleted\" jdbcType=\"BIT\" property=\"deleted\" />\n  </resultMap>\n  <sql id=\"Base_Column_List\">\n    id, task_no, process_type, biz_no, task_biz_code, task_biz_name, task_type, process_instance_no, \n    node_instance_no, node_execution_no, assign_type, assign_info, assign_time, executor, \n    execute_biz_result, execute_biz_data, execute_time, product_code, creator, status, ext_data, process_instance_key_field,process_instance_key_field2,\n    created_date, modified_date, deleted\n  </sql>\n  <select id=\"selectByPrimaryKey\" parameterType=\"java.lang.Long\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_task${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </select>\n  <delete id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Long\">\n    update process_task${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()} set deleted=1\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </delete>\n  <insert id=\"insert\" keyColumn=\"id\" keyProperty=\"id\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessTask\" useGeneratedKeys=\"false\">\n    insert into process_task${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()} (id, task_no, process_type, biz_no, \n      task_biz_code, task_biz_name, task_type, process_instance_no, \n      node_instance_no, node_execution_no, assign_type, \n      assign_info, assign_time, executor, \n      execute_biz_result, execute_biz_data, execute_time, \n      product_code, creator, status, ext_data, process_instance_key_field, process_instance_key_field2\n      )\n    values (#{id, jdbcType=BIGINT}, #{taskNo,jdbcType=VARCHAR}, #{processType,jdbcType=VARCHAR}, #{bizNo,jdbcType=VARCHAR}, \n      #{taskBizCode,jdbcType=VARCHAR},#{taskBizName,jdbcType=VARCHAR}, #{taskType,jdbcType=VARCHAR}, #{processInstanceNo,jdbcType=VARCHAR}, \n      #{nodeInstanceNo,jdbcType=VARCHAR}, #{nodeExecutionNo,jdbcType=VARCHAR}, #{assignType,jdbcType=VARCHAR}, \n      #{assignInfo,jdbcType=OTHER}, #{assignTime,jdbcType=TIMESTAMP}, #{executor,jdbcType=VARCHAR}, \n      #{executeBizResult,jdbcType=VARCHAR}, #{executeBizData,jdbcType=OTHER}, #{executeTime,jdbcType=TIMESTAMP}, \n      #{productCode,jdbcType=VARCHAR},#{creator,jdbcType=VARCHAR}, #{status,jdbcType=VARCHAR}, #{extData,jdbcType=OTHER}, #{processInstanceKeyField,jdbcType=VARCHAR}, #{processInstanceKeyField2,jdbcType=VARCHAR}\n      )\n  </insert>\n  <insert id=\"insertWithCreatedDate\" keyColumn=\"id\" keyProperty=\"id\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessTask\" useGeneratedKeys=\"false\">\n    insert into process_task${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()} (id, task_no, process_type, biz_no, \n      task_biz_code, task_biz_name, task_type, process_instance_no, \n      node_instance_no, node_execution_no, assign_type, \n      assign_info, assign_time, executor, \n      execute_biz_result, execute_biz_data, execute_time, \n      product_code, creator, status, ext_data, process_instance_key_field,process_instance_key_field2, created_date\n      )\n    values (#{id, jdbcType=BIGINT}, #{taskNo,jdbcType=VARCHAR}, #{processType,jdbcType=VARCHAR}, #{bizNo,jdbcType=VARCHAR}, \n      #{taskBizCode,jdbcType=VARCHAR},#{taskBizName,jdbcType=VARCHAR}, #{taskType,jdbcType=VARCHAR}, #{processInstanceNo,jdbcType=VARCHAR}, \n      #{nodeInstanceNo,jdbcType=VARCHAR}, #{nodeExecutionNo,jdbcType=VARCHAR}, #{assignType,jdbcType=VARCHAR}, \n      #{assignInfo,jdbcType=OTHER}, #{assignTime,jdbcType=TIMESTAMP}, #{executor,jdbcType=VARCHAR}, \n      #{executeBizResult,jdbcType=VARCHAR}, #{executeBizData,jdbcType=OTHER}, #{executeTime,jdbcType=TIMESTAMP}, \n      #{productCode,jdbcType=VARCHAR},#{creator,jdbcType=VARCHAR}, #{status,jdbcType=VARCHAR}, #{extData,jdbcType=OTHER} , #{processInstanceKeyField,jdbcType=VARCHAR},#{processInstanceKeyField2,jdbcType=VARCHAR}, #{createdDate,jdbcType=TIMESTAMP}\n      )\n  </insert>  \n  <update id=\"updateByPrimaryKeySelective\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessTask\">\n    update process_task${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    <set>\n      <if test=\"taskNo != null\">\n        task_no = #{taskNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"processType != null\">\n        process_type = #{processType,jdbcType=VARCHAR},\n      </if>\n      <if test=\"bizNo != null\">\n        biz_no = #{bizNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"taskBizCode != null\">\n        task_biz_code = #{taskBizCode,jdbcType=VARCHAR},\n      </if>\n      <if test=\"taskBizName != null\">\n        task_biz_name = #{taskBizName,jdbcType=VARCHAR},\n      </if>      \n      <if test=\"taskType != null\">\n        task_type = #{taskType,jdbcType=VARCHAR},\n      </if>\n      <if test=\"processInstanceNo != null\">\n        process_instance_no = #{processInstanceNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"nodeInstanceNo != null\">\n        node_instance_no = #{nodeInstanceNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"nodeExecutionNo != null\">\n        node_execution_no = #{nodeExecutionNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"assignType != null\">\n        assign_type = #{assignType,jdbcType=VARCHAR},\n      </if>\n      <if test=\"assignInfo != null\">\n        assign_info = #{assignInfo,jdbcType=OTHER},\n      </if>\n      <if test=\"assignTime != null\">\n        assign_time = #{assignTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"executor != null\">\n        executor = #{executor,jdbcType=VARCHAR},\n      </if>\n      <if test=\"executeBizResult != null\">\n        execute_biz_result = #{executeBizResult,jdbcType=VARCHAR},\n      </if>\n      <if test=\"executeBizData != null\">\n        execute_biz_data = #{executeBizData,jdbcType=OTHER},\n      </if>\n      <if test=\"executeTime != null\">\n        execute_time = #{executeTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"productCode != null\">\n        product_code = #{productCode,jdbcType=VARCHAR},\n      </if>\n      <if test=\"creator != null\">\n        creator = #{creator,jdbcType=VARCHAR},\n      </if>      \n      <if test=\"status != null\">\n        status = #{status,jdbcType=VARCHAR},\n      </if>     \n      <if test=\"extData != null\">\n        ext_data = #{extData,jdbcType=OTHER},\n      </if>\n      <if test=\"processInstanceKeyField != null\">\n        process_instance_key_field = #{processInstanceKeyField,jdbcType=OTHER},\n      </if>\n      <if test=\"processInstanceKeyField2 != null\">\n        process_instance_key_field2 = #{processInstanceKeyField2,jdbcType=OTHER},\n      </if>\n    </set>\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </update>\n  <update id=\"updateByPrimaryKey\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessTask\">\n    update process_task${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    set task_no = #{taskNo,jdbcType=VARCHAR},\n      process_type = #{processType,jdbcType=VARCHAR},\n      biz_no = #{bizNo,jdbcType=VARCHAR},\n      task_biz_code = #{taskBizCode,jdbcType=VARCHAR},\n      task_biz_name = #{taskBizName,jdbcType=VARCHAR},\n      task_type = #{taskType,jdbcType=VARCHAR},\n      process_instance_no = #{processInstanceNo,jdbcType=VARCHAR},\n      node_instance_no = #{nodeInstanceNo,jdbcType=VARCHAR},\n      node_execution_no = #{nodeExecutionNo,jdbcType=VARCHAR},\n      assign_type = #{assignType,jdbcType=VARCHAR},\n      assign_info = #{assignInfo,jdbcType=OTHER},\n      assign_time = #{assignTime,jdbcType=TIMESTAMP},\n      executor = #{executor,jdbcType=VARCHAR},\n      execute_biz_result = #{executeBizResult,jdbcType=VARCHAR},\n      execute_biz_data = #{executeBizData,jdbcType=OTHER},\n      execute_time = #{executeTime,jdbcType=TIMESTAMP},\n      product_code = #{productCode,jdbcType=VARCHAR},\n      creator = #{creator,jdbcType=VARCHAR},\n      status = #{status,jdbcType=VARCHAR},\n      ext_data = #{extData,jdbcType=OTHER},\n      process_instance_key_field = #{processInstanceKeyField,jdbcType=OTHER},\n      process_instance_key_field2 = #{processInstanceKeyField2,jdbcType=OTHER}\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </update>\n  \n    <update id=\"updateByTaskNo\" parameterType=\"com.jd.easyflow.process.infrastructure.persistence.po.ProcessTask\">\n    update process_task${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    set\n      process_type = #{processType,jdbcType=VARCHAR},\n      biz_no = #{bizNo,jdbcType=VARCHAR},\n      task_biz_code = #{taskBizCode,jdbcType=VARCHAR},\n      task_biz_name = #{taskBizName,jdbcType=VARCHAR},\n      task_type = #{taskType,jdbcType=VARCHAR},\n      process_instance_no = #{processInstanceNo,jdbcType=VARCHAR},\n      node_instance_no = #{nodeInstanceNo,jdbcType=VARCHAR},\n      node_execution_no = #{nodeExecutionNo,jdbcType=VARCHAR},\n      assign_type = #{assignType,jdbcType=VARCHAR},\n      assign_info = #{assignInfo,jdbcType=OTHER},\n      assign_time = #{assignTime,jdbcType=TIMESTAMP},\n      executor = #{executor,jdbcType=VARCHAR},\n      execute_biz_result = #{executeBizResult,jdbcType=VARCHAR},\n      execute_biz_data = #{executeBizData,jdbcType=OTHER},\n      execute_time = #{executeTime,jdbcType=TIMESTAMP},\n      product_code = #{productCode,jdbcType=VARCHAR},\n      creator = #{creator,jdbcType=VARCHAR},\n      status = #{status,jdbcType=VARCHAR},\n      ext_data = #{extData,jdbcType=OTHER},\n      process_instance_key_field = #{processInstanceKeyField,jdbcType=OTHER},\n      process_instance_key_field2 = #{processInstanceKeyField2,jdbcType=OTHER}\n    where task_no = #{taskNo,jdbcType=VARCHAR} and deleted=0\n  </update>\n  \n <update id=\"deleteByTaskNo\" parameterType=\"java.lang.String\">\n    update process_task${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    set\n      deleted=1\n    where task_no = #{taskNo,jdbcType=VARCHAR} and deleted=0\n  </update>\n  \n    <select id=\"list\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_task${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    <where> deleted=0\n      <if test=\"id != null\">\n         and id = #{id}\n      </if>\n      <if test=\"taskNo != null\">\n        and task_no = #{taskNo}\n      </if>\n      <if test=\"processType != null\">\n        and process_type = #{processType}\n      </if>\n      <if test=\"bizNo != null\">\n        and biz_no = #{bizNo}\n      </if>      \n      <if test=\"taskBizCode != null\">\n        and task_biz_code = #{taskBizCode}\n      </if>  \n      <if test=\"taskType != null\">\n        and task_type = #{taskType}\n      </if>    \n      <if test=\"processInstanceNo != null\">\n        and process_instance_no = #{processInstanceNo}\n      </if> \n      <if test=\"nodeInstanceNo != null\">\n        and node_instance_no = #{nodeInstanceNo}\n      </if> \n      <if test=\"assignType != null\">\n        and assign_type = #{assignType}\n      </if>  \n      <if test=\"executor != null\">\n        and executor = #{executor}\n      </if>   \n      <if test=\"productCode != null\">\n        and product_code = #{productCode}\n      </if>  \n      <if test=\"creator != null\">\n        and creator = #{creator}\n      </if>        \n      <if test=\"status != null\">\n        and status = #{status}\n      </if>  \n      <if test=\"assignTimeStart != null\">\n        and assign_time &gt;= #{assignTimeStart}\n      </if>  \n      <if test=\"assignTimeEnd != null\">\n        and assign_time &lt;= #{assignTimeEnd}\n      </if>  \n      <if test=\"executeTimeStart != null\">\n        and execute_time &gt;= #{executeTimeStart}\n      </if>  \n      <if test=\"executeTimeEnd != null\">\n        and execute_time &lt;= #{executeTimeEnd}\n      </if> \n      <if test=\"createdDateStart != null\">\n        and created_date &gt;= #{createdDateStart}\n      </if>  \n      <if test=\"createdDateEnd != null\">\n        and created_date &lt;= #{createdDateEnd}\n      </if> \n      <if test=\"modifiedDateStart != null\">\n        and modified_date &gt;= #{modifiedDateStart}\n      </if>  \n      <if test=\"modifiedDateEnd != null\">\n        and modified_date &lt;= #{modifiedDateEnd}\n      </if>  \n      <if test=\"processInstanceKeyField != null\">\n        and process_instance_key_field = #{processInstanceKeyField}\n      </if>\n      <if test=\"processInstanceKeyField2 != null\">\n        and process_instance_key_field2 like CONCAT(#{processInstanceKeyField2},'%')\n      </if>\n    </where>\n  </select>  \n\n  <select id=\"countTaskByPagerCondition\" parameterType=\"com.jd.easyflow.common.dto.pager.PagerCondition\" resultType=\"long\">\n    select\n    count(1)\n    from process_task${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    <include refid=\"pagerQueryTaskWhere\" />\n  </select>\n\n  <select id=\"selectTaskByPagerCondition\" parameterType=\"com.jd.easyflow.common.dto.pager.PagerCondition\" resultMap=\"BaseResultMap\">\n    select\n    <include refid=\"Base_Column_List\" />\n    from process_task${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    <include refid=\"pagerQueryTaskWhere\" />\n\t<if test=\"sortMap.createdDate != null\">\n\t\torder by created_date ${sortMap.createdDate.type}, id  ${sortMap.createdDate.type}\n\t</if>\n    limit #{start},#{pageSize}\n  </select>\n\n  <sql id=\"pagerQueryTaskWhere\">\n    <where> deleted = 0\n      <if test=\"fieldMap.taskNo != null\">\n        and task_no=#{fieldMap.taskNo.value}\n      </if>\n      <if test=\"fieldMap.taskNoList != null\">\n        and task_no in \n        <foreach collection=\"fieldMap.taskNoList.value\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n                #{item}       \n        </foreach>\n      </if>   \n            <if test=\"fieldMap.statusList != null\">\n        and status in \n        <foreach collection=\"fieldMap.statusList.value\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n                #{item}       \n        </foreach>\n      </if>          \n      <if test=\"fieldMap.processType != null\">\n        and process_type=#{fieldMap.processType.value}\n      </if>\n      <if test=\"fieldMap.bizNo != null\">\n        and biz_no=#{fieldMap.bizNo.value}\n      </if>\n      <if test=\"fieldMap.processInstanceNo != null\">\n        and process_instance_no=#{fieldMap.processInstanceNo.value}\n      </if> \n      <if test=\"fieldMap.nodeInstanceNo != null\">\n        and node_instance_no=#{fieldMap.nodeInstanceNo.value}\n      </if>              \n      <if test=\"fieldMap.taskBizCode != null\">\n        and task_biz_code=#{fieldMap.taskBizCode.value}\n      </if>      \n      <if test=\"fieldMap.productCode != null\">\n        and product_code=#{fieldMap.productCode.value}\n      </if>\n      <if test=\"fieldMap.productCodeList != null\">\n        and (product_code is null or product_code in\n        <foreach collection=\"fieldMap.productCodeList.value\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n          #{item}\n        </foreach>\n        )\n      </if>\n      <if test=\"fieldMap.creator != null\">\n        and creator=#{fieldMap.creator.value}\n      </if>      \n      <if test=\"fieldMap.executor != null\">\n        and executor=#{fieldMap.executor.value}\n      </if>\n      <if test=\"fieldMap.status != null\">\n        and status=#{fieldMap.status.value}\n      </if>\n      <if test=\"fieldMap.createdDateStart != null\">\n        and created_date &gt;=#{fieldMap.createdDate.value}\n      </if> \n      <if test=\"fieldMap.createdDateEnd != null\">\n        and created_date &lt;=#{fieldMap.createdDate.value}\n      </if>     \n      <if test=\"fieldMap.processInstanceKeyField != null\">\n        and process_instance_key_field =#{fieldMap.processInstanceKeyField.value}\n      </if>\n      <if test=\"fieldMap.processInstanceKeyField2 != null\">\n        and process_instance_key_field2 like CONCAT(#{fieldMap.processInstanceKeyField2.value},'%')\n      </if>\n      <if test=\"fieldMap.taskNoStart != null\">\n        and taskNo &gt;#{fieldMap.taskNoStart.value}\n      </if> \n      <if test=\"fieldMap.taskNoEnd != null\">\n        and taskNo &lt;#{fieldMap.taskNoEnd.value}\n      </if>         \n    </where>\n  </sql>\n  \n  <select id=\"countTaskAndAssignByPagerCondition\" parameterType=\"com.jd.easyflow.common.dto.pager.PagerCondition\" resultType=\"long\">\n    select\n    count(distinct task.task_no)\n    from process_task${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()} task, process_task_assign${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()} assign\n    <include refid=\"pagerQueryTaskAndAssignWhere\" />\n  </select>\n\n  <select id=\"selectTaskAndAssignByPagerCondition\" parameterType=\"com.jd.easyflow.common.dto.pager.PagerCondition\" resultMap=\"BaseResultMap\">\n    select\n    distinct task.task_no,task.created_date,task.id\n    from process_task${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()} task, process_task_assign${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()} assign\n    <include refid=\"pagerQueryTaskAndAssignWhere\" />\n        <if test=\"sortMap.createdDate != null\">\n        order by task.created_date ${sortMap.createdDate.type}, task.id  ${sortMap.createdDate.type}\n    </if>\n    limit #{start},#{pageSize}\n  </select>\n\n\n  <sql id=\"pagerQueryTaskAndAssignWhere\">\n    <where> task.deleted = 0 and assign.deleted=0 and task.task_no=assign.task_no\n      <if test=\"fieldMap.taskNo != null\">\n        and task.task_no=#{fieldMap.taskNo.value}\n      </if>\n            <if test=\"fieldMap.taskNoList != null\">\n        and task.task_no in \n        <foreach collection=\"fieldMap.taskNoList.value\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n                #{item}       \n        </foreach>\n      </if>  \n      <if test=\"fieldMap.taskNoStart != null\">\n        and task.taskNo &gt;#{fieldMap.taskNoStart.value}\n      </if> \n      <if test=\"fieldMap.taskNoEnd != null\">\n        and task.taskNo &lt;#{fieldMap.taskNoEnd.value}\n      </if>        \n            <if test=\"fieldMap.statusList != null\">\n        and task.status in \n        <foreach collection=\"fieldMap.statusList.value\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n                #{item}       \n        </foreach>\n      </if>         \n      <if test=\"fieldMap.processType != null\">\n        and task.process_type=#{fieldMap.processType.value}\n      </if>\n      <if test=\"fieldMap.bizNo != null\">\n        and task.biz_no=#{fieldMap.bizNo.value}\n      </if>\n      <if test=\"fieldMap.processInstanceNo != null\">\n        and task.process_instance_no=#{fieldMap.processInstanceNo.value}\n      </if> \n      <if test=\"fieldMap.nodeInstanceNo != null\">\n        and task.node_instance_no=#{fieldMap.nodeInstanceNo.value}\n      </if>                 \n      <if test=\"fieldMap.taskBizCode != null\">\n        and task.task_biz_code=#{fieldMap.taskBizCode.value}\n      </if>      \n      <if test=\"fieldMap.productCode != null\">\n        and task.product_code=#{fieldMap.productCode.value}\n      </if>\n      <if test=\"fieldMap.productCodeList != null\">\n        and (task.product_code is null or task.product_code in\n        <foreach collection=\"fieldMap.productCodeList.value\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n          #{item}\n        </foreach>\n        )\n      </if>\n      <if test=\"fieldMap.creator != null\">\n        and task.creator=#{fieldMap.creator.value}\n      </if>      \n      <if test=\"fieldMap.executor != null\">\n        and task.executor=#{fieldMap.executor.value}\n      </if>\n      <if test=\"fieldMap.status != null\">\n        and task.status=#{fieldMap.status.value}\n      </if>\n      <if test=\"fieldMap.createdDateStart != null\">\n        and task.created_date &gt;=#{fieldMap.createdDate.value}\n      </if> \n      <if test=\"fieldMap.createdDateEnd != null\">\n        and task.created_date &lt;=#{fieldMap.createdDate.value}\n      </if>\n\n      <if test=\"fieldMap.assignStatus != null\">\n        and assign.status =#{fieldMap.assignStatus.value}\n      </if>   \n      <if test=\"fieldMap.processInstanceKeyField != null\">\n        and task.process_instance_key_field =#{fieldMap.processInstanceKeyField.value}\n      </if>\n      <if test=\"fieldMap.processInstanceKeyField2 != null\">\n        and task.process_instance_key_field2 like CONCAT(#{fieldMap.processInstanceKeyField2.value},'%')\n      </if>\n      and (\n      <trim prefixOverrides=\"OR\">\n      <if test=\"fieldMap.assignUser != null\">\n          or assign.assign_user =#{fieldMap.assignUser.value}\n      </if> \n      <if test=\"fieldMap.assignGroupList != null\">\n        or  (assign.assign_group in \n            <foreach collection=\"fieldMap.assignGroupList.value\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n                #{item}       \n        </foreach> \n         and assign.assign_group2 is null)\n      </if> \n      <if test=\"fieldMap.assignGroup2List!=null\">\n              or  (assign.assign_group2 in \n            <foreach collection=\"fieldMap.assignGroup2List.value\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n                #{item}       \n        </foreach> \n         and assign.assign_group is null)\n      </if>   \n      <if test=\"fieldMap.assignGroupList != null&amp;&amp; fieldMap.assignGroup2List!=null\">\n        or  (assign.assign_group in \n            <foreach collection=\"fieldMap.assignGroupList.value\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n                #{item}       \n        </foreach> \n        and assign.assign_group2 in\n            <foreach collection=\"fieldMap.assignGroup2List.value\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n                #{item}       \n        </foreach> )        \n      </if>      \n      </trim>         \n      )         \n                         \n    </where>\n  </sql>\n\n  \n</mapper>"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/resources/easyflow/shardingmapper/ProcessUnitExecutionMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.jd.easyflow.processunit.infrastructure.persistence.mapper.ProcessUnitExecutionMapper\">\n  <resultMap id=\"BaseResultMap\" type=\"com.jd.easyflow.processunit.infrastructure.persistence.po.ProcessUnitExecution\">\n    <id column=\"id\" jdbcType=\"BIGINT\" property=\"id\" />\n    <result column=\"execution_no\" jdbcType=\"VARCHAR\" property=\"executionNo\" />\n    <result column=\"request_no\" jdbcType=\"VARCHAR\" property=\"requestNo\" />\n    <result column=\"parent_no\" jdbcType=\"VARCHAR\" property=\"parentNo\" />\n    <result column=\"process_unit_code\" jdbcType=\"VARCHAR\" property=\"processUnitCode\" />\n    <result column=\"biz_no\" jdbcType=\"VARCHAR\" property=\"bizNo\" />\n    <result column=\"instance_no\" jdbcType=\"VARCHAR\" property=\"instanceNo\" />\n    <result column=\"product_code\" jdbcType=\"VARCHAR\" property=\"productCode\" />\n    <result column=\"result\" jdbcType=\"VARCHAR\" property=\"result\" />\n    <result column=\"request_time\" jdbcType=\"TIMESTAMP\" property=\"requestTime\" />\n    <result column=\"response_time\" jdbcType=\"TIMESTAMP\" property=\"responseTime\" />\n    <result column=\"elaspe_time\" jdbcType=\"INTEGER\" property=\"elaspeTime\" />\n    <result column=\"exec_type\" jdbcType=\"VARCHAR\" property=\"execType\" />\n    <result column=\"request_content\" jdbcType=\"LONGVARCHAR\" property=\"requestContent\" />\n    <result column=\"response_content\" jdbcType=\"LONGVARCHAR\" property=\"responseContent\" />\n    <result column=\"ext_data\" jdbcType=\"OTHER\" property=\"extData\" />\n    <result column=\"created_date\" jdbcType=\"TIMESTAMP\" property=\"createdDate\" />\n    <result column=\"modified_date\" jdbcType=\"TIMESTAMP\" property=\"modifiedDate\" />\n    <result column=\"deleted\" jdbcType=\"BIT\" property=\"deleted\" />\n  </resultMap>\n  <sql id=\"Base_Column_List\">\n    id, execution_no, request_no, parent_no, process_unit_code, biz_no, instance_no, product_code, \n    result, request_time, response_time, elaspe_time, exec_type, request_content, response_content, ext_data, created_date, \n    modified_date, deleted\n  </sql>\n  <select id=\"selectByPrimaryKey\" parameterType=\"java.lang.Long\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_unit_execution${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </select>\n  <insert id=\"insert\" keyColumn=\"id\" keyProperty=\"id\" parameterType=\"com.jd.easyflow.processunit.infrastructure.persistence.po.ProcessUnitExecution\" useGeneratedKeys=\"true\">\n    insert into process_unit_execution${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()} (\n     <if test=\"id != null\">id, </if>\n      execution_no, request_no, parent_no, \n      process_unit_code, biz_no, instance_no, product_code, \n      result, request_time, response_time, \n      elaspe_time, exec_type, ext_data, \n      request_content, response_content)\n    values (\n     <if test=\"id != null\">#{id, jdbcType=BIGINT}, </if>\n    #{executionNo,jdbcType=VARCHAR}, #{requestNo,jdbcType=VARCHAR}, #{parentNo,jdbcType=VARCHAR}, \n      #{processUnitCode,jdbcType=VARCHAR},#{bizNo,jdbcType=VARCHAR}, #{instanceNo,jdbcType=VARCHAR}, #{productCode,jdbcType=VARCHAR}, \n      #{result,jdbcType=VARCHAR}, #{requestTime,jdbcType=TIMESTAMP}, #{responseTime,jdbcType=TIMESTAMP}, \n      #{elaspeTime,jdbcType=INTEGER}, #{execType,jdbcType=VARCHAR}, #{extData,jdbcType=OTHER}, \n      #{requestContent,jdbcType=LONGVARCHAR}, #{responseContent,jdbcType=LONGVARCHAR})\n  </insert>\n  \n    <insert id=\"insertForMigration\" keyColumn=\"id\" keyProperty=\"id\" parameterType=\"com.jd.easyflow.processunit.infrastructure.persistence.po.ProcessUnitExecution\" useGeneratedKeys=\"true\">\n    insert into process_unit_execution${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()} (id, execution_no, request_no, parent_no, \n      process_unit_code, biz_no, instance_no, product_code, \n      result, request_time, response_time, \n      elaspe_time, exec_type, ext_data, \n      request_content, response_content, created_date, modified_date)\n    values (#{id, jdbcType=BIGINT}, #{executionNo,jdbcType=VARCHAR}, #{requestNo,jdbcType=VARCHAR}, #{parentNo,jdbcType=VARCHAR}, \n      #{processUnitCode,jdbcType=VARCHAR},#{bizNo,jdbcType=VARCHAR}, #{instanceNo,jdbcType=VARCHAR}, #{productCode,jdbcType=VARCHAR}, \n      #{result,jdbcType=VARCHAR}, #{requestTime,jdbcType=TIMESTAMP}, #{responseTime,jdbcType=TIMESTAMP}, \n      #{elaspeTime,jdbcType=INTEGER}, #{execType,jdbcType=VARCHAR}, #{extData,jdbcType=OTHER}, \n      #{requestContent,jdbcType=LONGVARCHAR}, #{responseContent,jdbcType=LONGVARCHAR},\n      #{createdDate,jdbcType=TIMESTAMP}, #{modifiedDate,jdbcType=TIMESTAMP})\n  </insert> \n   \n  <update id=\"updateByPrimaryKeySelective\" parameterType=\"com.jd.easyflow.processunit.infrastructure.persistence.po.ProcessUnitExecution\">\n    update process_unit_execution${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    <set>\n      <if test=\"executionNo != null\">\n        execution_no = #{executionNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"requestNo != null\">\n        request_no = #{requestNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"parentNo != null\">\n        parent_no = #{parentNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"processUnitCode != null\">\n        process_unit_code = #{processUnitCode,jdbcType=VARCHAR},\n      </if>\n      <if test=\"bizNo != null\">\n        biz_no = #{bizNo,jdbcType=VARCHAR},\n      </if>      \n      <if test=\"instanceNo != null\">\n        instance_no = #{instanceNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"productCode != null\">\n        product_code = #{productCode,jdbcType=VARCHAR},\n      </if>\n      <if test=\"result != null\">\n        result = #{result,jdbcType=VARCHAR},\n      </if>\n      <if test=\"requestTime != null\">\n        request_time = #{requestTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"responseTime != null\">\n        response_time = #{responseTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"elaspeTime != null\">\n        elaspe_time = #{elaspeTime,jdbcType=INTEGER},\n      </if>\n      <if test=\"execType != null\">\n        exec_type = #{execType,jdbcType=VARCHAR},\n      </if>\n      <if test=\"extData != null\">\n        ext_data = #{extData,jdbcType=OTHER},\n      </if>\n      <if test=\"createdDate != null\">\n        created_date = #{createdDate,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"modifiedDate != null\">\n        modified_date = #{modifiedDate,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"deleted != null\">\n        deleted = #{deleted,jdbcType=BIT},\n      </if>\n      <if test=\"requestContent != null\">\n        request_content = #{requestContent,jdbcType=LONGVARCHAR},\n      </if>\n      <if test=\"responseContent != null\">\n        response_content = #{responseContent,jdbcType=LONGVARCHAR},\n      </if>\n    </set>\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </update>\n  <update id=\"updateByPrimaryKey\" parameterType=\"com.jd.easyflow.processunit.infrastructure.persistence.po.ProcessUnitExecution\">\n    update process_unit_execution${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    set execution_no = #{executionNo,jdbcType=VARCHAR},\n      request_no = #{requestNo,jdbcType=VARCHAR},\n      parent_no = #{parentNo,jdbcType=VARCHAR},\n      process_unit_code = #{processUnitCode,jdbcType=VARCHAR},\n      biz_no = #{bizNo,jdbcType=VARCHAR},\n      instance_no = #{instanceNo,jdbcType=VARCHAR},\n      product_code = #{productCode,jdbcType=VARCHAR},\n      result = #{result,jdbcType=VARCHAR},\n      request_time = #{requestTime,jdbcType=TIMESTAMP},\n      response_time = #{responseTime,jdbcType=TIMESTAMP},\n      elaspe_time = #{elaspeTime,jdbcType=INTEGER},\n      exec_type = #{execType,jdbcType=VARCHAR},\n      ext_data = #{extData,jdbcType=OTHER},\n      request_content = #{requestContent,jdbcType=LONGVARCHAR},\n      response_content = #{responseContent,jdbcType=LONGVARCHAR}\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </update>\n  \n  <update id=\"updateForMigration\" parameterType=\"com.jd.easyflow.processunit.infrastructure.persistence.po.ProcessUnitExecution\">\n    update process_unit_execution${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    set \n      request_no = #{requestNo,jdbcType=VARCHAR},\n      parent_no = #{parentNo,jdbcType=VARCHAR},\n      process_unit_code = #{processUnitCode,jdbcType=VARCHAR},\n      biz_no = #{bizNo,jdbcType=VARCHAR},\n      instance_no = #{instanceNo,jdbcType=VARCHAR},\n      product_code = #{productCode,jdbcType=VARCHAR},\n      result = #{result,jdbcType=VARCHAR},\n      request_time = #{requestTime,jdbcType=TIMESTAMP},\n      response_time = #{responseTime,jdbcType=TIMESTAMP},\n      elaspe_time = #{elaspeTime,jdbcType=INTEGER},\n      exec_type = #{execType,jdbcType=VARCHAR},\n      ext_data = #{extData,jdbcType=OTHER},\n      request_content = #{requestContent,jdbcType=LONGVARCHAR},\n      response_content = #{responseContent,jdbcType=LONGVARCHAR},\n      created_date = #{createdDate,jdbcType=TIMESTAMP},\n      modified_date =  #{modifiedDate,jdbcType=TIMESTAMP}      \n    where execution_no=#{executionNo} and deleted=0\n  </update>\n  \n  <select id=\"getByExecutionNo\"  resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_unit_execution${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    where execution_no=#{executionNo} and deleted=0\n  </select>\n\n  <select id=\"selectProcessUnitExecution\" resultMap=\"BaseResultMap\">\n    select\n    <include refid=\"Base_Column_List\"/>\n    from process_unit_execution${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    where deleted=0\n    <if test=\"instanceNos != null and instanceNos.size()>0 \">\n      AND instance_no IN\n      <foreach collection=\"instanceNos\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n        #{item}\n      </foreach>\n    </if>\n    <if test=\"instanceNos == null or instanceNos.size()==0 \">\n      and 1=0\n    </if>\n  </select>\n\n\n  <delete id=\"physicsDeleteProcessUnitExecution\">\n    delete from process_unit_execution${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    where 1=1\n    <if test=\"ids !=null and ids.size()>0 \">\n      AND id IN\n      <foreach collection=\"ids\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n        #{item}\n      </foreach>\n    </if>\n    <if test=\"ids ==null or ids.size()==0 \">\n      and 1 = 0\n    </if>\n  </delete>\n <update id=\"updateByExecutionNo\" parameterType=\"com.jd.easyflow.processunit.infrastructure.persistence.po.ProcessUnitExecution\">\n    update process_unit_execution${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    <set>\n      <if test=\"executionNo != null\">\n        execution_no = #{executionNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"requestNo != null\">\n        request_no = #{requestNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"parentNo != null\">\n        parent_no = #{parentNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"processUnitCode != null\">\n        process_unit_code = #{processUnitCode,jdbcType=VARCHAR},\n      </if>\n      <if test=\"bizNo != null\">\n        biz_no = #{bizNo,jdbcType=VARCHAR},\n      </if>      \n      <if test=\"instanceNo != null\">\n        instance_no = #{instanceNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"productCode != null\">\n        product_code = #{productCode,jdbcType=VARCHAR},\n      </if>\n      <if test=\"result != null\">\n        result = #{result,jdbcType=VARCHAR},\n      </if>\n      <if test=\"requestTime != null\">\n        request_time = #{requestTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"responseTime != null\">\n        response_time = #{responseTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"elaspeTime != null\">\n        elaspe_time = #{elaspeTime,jdbcType=INTEGER},\n      </if>\n      <if test=\"execType != null\">\n        exec_type = #{execType,jdbcType=VARCHAR},\n      </if>\n      <if test=\"extData != null\">\n        ext_data = #{extData,jdbcType=OTHER},\n      </if>\n      <if test=\"createdDate != null\">\n        created_date = #{createdDate,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"modifiedDate != null\">\n        modified_date = #{modifiedDate,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"deleted != null\">\n        deleted = #{deleted,jdbcType=BIT},\n      </if>\n      <if test=\"requestContent != null\">\n        request_content = #{requestContent,jdbcType=LONGVARCHAR},\n      </if>\n      <if test=\"responseContent != null\">\n        response_content = #{responseContent,jdbcType=LONGVARCHAR},\n      </if>\n    </set>\n    where execution_no=#{executionNo} and deleted=0\n  </update>  \n  \n    <select id=\"selectProcessUnitExecutionByPageCondition\" parameterType=\"com.jd.easyflow.common.dto.pager.PagerCondition\" resultMap=\"BaseResultMap\">\n    select\n    <include refid=\"Base_Column_List\" />\n    from process_unit_execution${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    <include refid=\"pagerWhere\" />\n    <if test=\"sortMap.requestTime != null\">\n      order by request_time ${sortMap.requestTime.type}\n    </if>  \n    <if test=\"sortMap.id != null\">\n      order by id ${sortMap.id.type}\n    </if>     \n    <if test=\"start&gt;=0 and pageSize!=-1\">\n          limit #{start},#{pageSize}\n    </if>  \n    <if test=\"start&lt;0 and pageSize!=-1\">\n          limit #{pageSize}\n    </if>       \n  </select>\n  \n  <select id=\"countProcessUnitExecutionByPageCondition\" parameterType=\"com.jd.easyflow.common.dto.pager.PagerCondition\" resultType=\"long\">\n    select\n    count(*)\n    from process_unit_execution${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    <include refid=\"pagerWhere\" />\n  </select>\n\n  <sql id=\"pagerWhere\">\n    <where> deleted = 0\n      <if test=\"fieldMap.processUnitCode != null\">\n        and process_unit_code = #{fieldMap.processUnitCode.value}\n      </if>\n      <if test=\"fieldMap.instanceNo != null\">\n        and instance_no = #{fieldMap.instanceNo.value}\n      </if>\n      <if test=\"fieldMap.bizNo != null\">\n        and biz_no = #{fieldMap.bizNo.value}\n      </if>  \n      <if test=\"fieldMap.executionNo != null\">\n        and execution_no = #{fieldMap.executionNo.value}\n      </if>                  \n      <if test=\"fieldMap.requestTimeStart != null\">\n        and request_time &gt;=#{fieldMap.requestTimeStart.value}\n      </if> \n      <if test=\"fieldMap.requestTimeEnd != null\">\n        and request_time &lt;#{fieldMap.requestTimeEnd.value}\n      </if>  \n      <if test=\"fieldMap.elapseTimeStart != null\">\n        and elapse_time &gt;=#{fieldMap.elapseTimeStart.value}\n      </if> \n      <if test=\"fieldMap.elapseTimeEnd != null\">\n        and elapse_time &lt;#{fieldMap.elapseTimeEnd.value}\n      </if>       \n      <if test=\"fieldMap.resultList != null\">\n        and result in \n        <foreach collection=\"fieldMap.resultList.value\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n          #{item}\n        </foreach>\n      </if>           \n      <if test=\"fieldMap.idStart != null\">\n        and id &gt;#{fieldMap.idStart.value}\n      </if> \n      <if test=\"fieldMap.idEnd != null\">\n        and id &lt;#{fieldMap.idEnd.value}\n      </if>                    \n    </where>\n  </sql>\n  \n  \n  \n</mapper>"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/main/resources/easyflow/shardingmapper/ProcessUnitInstanceMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.jd.easyflow.processunit.infrastructure.persistence.mapper.ProcessUnitInstanceMapper\">\n  <resultMap id=\"BaseResultMap\" type=\"com.jd.easyflow.processunit.infrastructure.persistence.po.ProcessUnitInstance\">\n    <id column=\"id\" jdbcType=\"BIGINT\" property=\"id\" />\n    <result column=\"instance_no\" jdbcType=\"VARCHAR\" property=\"instanceNo\" />\n    <result column=\"biz_no\" jdbcType=\"VARCHAR\" property=\"bizNo\" />\n    <result column=\"parent_no\" jdbcType=\"VARCHAR\" property=\"parentNo\" />\n    <result column=\"process_unit_code\" jdbcType=\"VARCHAR\" property=\"processUnitCode\" />\n    <result column=\"product_code\" jdbcType=\"VARCHAR\" property=\"productCode\" />\n    <result column=\"result\" jdbcType=\"VARCHAR\" property=\"result\" />\n    <result column=\"auto_run_flag\" jdbcType=\"BIT\" property=\"autoRunFlag\" />\n    <result column=\"auto_run_times\" jdbcType=\"INTEGER\" property=\"autoRunTimes\" />\n    <result column=\"next_auto_run_time\" jdbcType=\"TIMESTAMP\" property=\"nextAutoRunTime\" />\n    <result column=\"request_content\" jdbcType=\"LONGVARCHAR\" property=\"requestContent\" />\n    <result column=\"response_content\" jdbcType=\"LONGVARCHAR\" property=\"responseContent\" />\n    <result column=\"vars\" jdbcType=\"OTHER\" property=\"vars\" />\n    <result column=\"ext_data\" jdbcType=\"OTHER\" property=\"extData\" />\n    <result column=\"created_date\" jdbcType=\"TIMESTAMP\" property=\"createdDate\" />\n    <result column=\"modified_date\" jdbcType=\"TIMESTAMP\" property=\"modifiedDate\" />\n    <result column=\"deleted\" jdbcType=\"BIT\" property=\"deleted\" />\n  </resultMap>\n  <sql id=\"Base_Column_List\">\n    id, instance_no, biz_no, parent_no, process_unit_code, product_code, result, auto_run_flag, \n    auto_run_times, next_auto_run_time, request_content, response_content,vars, ext_data, created_date, modified_date, deleted\n  </sql>\n  <select id=\"selectByPrimaryKey\" parameterType=\"java.lang.Long\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_unit_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </select>\n  <insert id=\"insert\" keyColumn=\"id\" keyProperty=\"id\" parameterType=\"com.jd.easyflow.processunit.infrastructure.persistence.po.ProcessUnitInstance\" useGeneratedKeys=\"true\">\n    insert into process_unit_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()} (\n     <if test=\"id != null\">id, </if>\n     instance_no, biz_no, parent_no, \n      process_unit_code, product_code, result, \n      auto_run_flag, auto_run_times, next_auto_run_time, vars,\n      ext_data,request_content, response_content\n      )\n    values (\n     <if test=\"id != null\">#{id, jdbcType=BIGINT}, </if>\n    #{instanceNo,jdbcType=VARCHAR}, #{bizNo,jdbcType=VARCHAR}, #{parentNo,jdbcType=VARCHAR}, \n      #{processUnitCode,jdbcType=VARCHAR}, #{productCode,jdbcType=VARCHAR}, #{result,jdbcType=VARCHAR}, \n      #{autoRunFlag,jdbcType=BIT}, #{autoRunTimes,jdbcType=INTEGER}, #{nextAutoRunTime,jdbcType=TIMESTAMP}, #{vars,jdbcType=OTHER},\n      #{extData,jdbcType=OTHER}, #{requestContent,jdbcType=LONGVARCHAR}, #{responseContent,jdbcType=LONGVARCHAR}\n      )\n  </insert>\n  \n  <insert id=\"insertForMigration\" keyColumn=\"id\" keyProperty=\"id\" parameterType=\"com.jd.easyflow.processunit.infrastructure.persistence.po.ProcessUnitInstance\" useGeneratedKeys=\"true\">\n    insert into process_unit_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()} (id, instance_no, biz_no, parent_no, \n      process_unit_code, product_code, result, \n      auto_run_flag, auto_run_times, next_auto_run_time, vars,\n      ext_data,request_content, response_content, created_date, modified_date\n      )\n    values (#{id, jdbcType=BIGINT}, #{instanceNo,jdbcType=VARCHAR}, #{bizNo,jdbcType=VARCHAR}, #{parentNo,jdbcType=VARCHAR}, \n      #{processUnitCode,jdbcType=VARCHAR}, #{productCode,jdbcType=VARCHAR}, #{result,jdbcType=VARCHAR}, \n      #{autoRunFlag,jdbcType=BIT}, #{autoRunTimes,jdbcType=INTEGER}, #{nextAutoRunTime,jdbcType=TIMESTAMP}, #{vars,jdbcType=OTHER},\n      #{extData,jdbcType=OTHER}, #{requestContent,jdbcType=LONGVARCHAR}, #{responseContent,jdbcType=LONGVARCHAR},\n      #{createdDate,jdbcType=TIMESTAMP}, #{modifiedDate,jdbcType=TIMESTAMP}\n      )\n  </insert>  \n  <update id=\"updateByPrimaryKey\" parameterType=\"com.jd.easyflow.processunit.infrastructure.persistence.po.ProcessUnitInstance\">\n    update process_unit_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    set instance_no = #{instanceNo,jdbcType=VARCHAR},\n      biz_no = #{bizNo,jdbcType=VARCHAR},\n      parent_no = #{parentNo,jdbcType=VARCHAR},\n      process_unit_code = #{processUnitCode,jdbcType=VARCHAR},\n      product_code = #{productCode,jdbcType=VARCHAR},\n      result = #{result,jdbcType=VARCHAR},\n      auto_run_flag = #{autoRunFlag,jdbcType=BIT},\n      auto_run_times = #{autoRunTimes,jdbcType=INTEGER},\n      next_auto_run_time = #{nextAutoRunTime,jdbcType=TIMESTAMP},\n      vars = #{vars,jdbcType=OTHER},\n      ext_data = #{extData,jdbcType=OTHER},\n      request_content = #{requestContent,jdbcType=LONGVARCHAR},\n      response_content = #{responseContent,jdbcType=LONGVARCHAR}\n    where id = #{id,jdbcType=BIGINT} and deleted=0\n  </update>\n  \n    <update id=\"updateByInstanceNo\" parameterType=\"com.jd.easyflow.processunit.infrastructure.persistence.po.ProcessUnitInstance\">\n    update process_unit_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    set \n      biz_no = #{bizNo,jdbcType=VARCHAR},\n      parent_no = #{parentNo,jdbcType=VARCHAR},\n      process_unit_code = #{processUnitCode,jdbcType=VARCHAR},\n      product_code = #{productCode,jdbcType=VARCHAR},\n      result = #{result,jdbcType=VARCHAR},\n      auto_run_flag = #{autoRunFlag,jdbcType=BIT},\n      auto_run_times = #{autoRunTimes,jdbcType=INTEGER},\n      next_auto_run_time = #{nextAutoRunTime,jdbcType=TIMESTAMP},\n      vars = #{vars,jdbcType=OTHER},\n      ext_data = #{extData,jdbcType=OTHER},\n      request_content = #{requestContent,jdbcType=LONGVARCHAR},\n      response_content = #{responseContent,jdbcType=LONGVARCHAR}\n    where instance_no = #{instanceNo,jdbcType=VARCHAR} and deleted=0\n  </update>\n  \n  <update id=\"updateForMigration\" parameterType=\"com.jd.easyflow.processunit.infrastructure.persistence.po.ProcessUnitInstance\">\n    update process_unit_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    set\n      biz_no = #{bizNo,jdbcType=VARCHAR},\n      parent_no = #{parentNo,jdbcType=VARCHAR},\n      process_unit_code = #{processUnitCode,jdbcType=VARCHAR},\n      product_code = #{productCode,jdbcType=VARCHAR},\n      result = #{result,jdbcType=VARCHAR},\n      auto_run_flag = #{autoRunFlag,jdbcType=BIT},\n      auto_run_times = #{autoRunTimes,jdbcType=INTEGER},\n      next_auto_run_time = #{nextAutoRunTime,jdbcType=TIMESTAMP},\n      vars = #{vars,jdbcType=OTHER},      \n      ext_data = #{extData,jdbcType=OTHER},\n      request_content = #{requestContent,jdbcType=LONGVARCHAR},\n      response_content = #{responseContent,jdbcType=LONGVARCHAR},\n      created_date = #{createdDate,jdbcType=TIMESTAMP},\n      modified_date =  #{modifiedDate,jdbcType=TIMESTAMP}\n    where instance_no = #{instanceNo,jdbcType=BIGINT} and deleted=0\n  </update>  \n  \n    <select id=\"getByUnitCodeAndBizNo\"  resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_unit_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    where biz_no=#{bizNo} and process_unit_code=#{unitCode} and deleted=0\n  </select>\n   <select id=\"selectListByUnitCodeAndBizNoPrefix\"  resultMap=\"BaseResultMap\">\n    select\n    <include refid=\"Base_Column_List\" />\n    from process_unit_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    where biz_no like concat(#{bizNoPrefix},'%') and deleted=0\n    <if test=\"unitCode != null\">\n      and process_unit_code = #{unitCode}\n    </if>\n    order by id\n  </select>   \n      <select id=\"getByInstanceNo\"  resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from process_unit_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    where instance_no=#{instanceNo} and deleted=0\n  </select>\n      <select id=\"findAsyncInstanceList\" parameterType=\"com.jd.easyflow.processunit.domain.model.vo.QueryAsyncInstanceVO\"  resultType=\"string\">\n    select \n    instance_no\n    from process_unit_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    where process_unit_code=#{unitCode} and auto_run_flag=1 and next_auto_run_time&lt;=#{nextAutoRunTime} and deleted=0\n    <if test=\"nextAutoRunTimeStart != null\">\n        and next_auto_run_time &gt;= #{nextAutoRunTimeStart}\n    </if>\n    <if test=\"productCodeList != null and productCodeList.size>0\">\n      and `product_code` in\n      <foreach collection=\"productCodeList\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n        #{item}\n      </foreach>\n    </if>\n    <if test=\"excludeProductCodeList != null and excludeProductCodeList.size>0\">\n      and `product_code` not in\n      <foreach collection=\"excludeProductCodeList\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n        #{item}\n      </foreach>\n    </if>  \n    <if test=\"resultList != null and resultList.size>0\">\n      and `result` in\n      <foreach collection=\"resultList\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n        #{item}\n      </foreach>\n    </if> \n    <if test=\"variableList != null and variableList.size>0\">\n          <foreach collection=\"variableList\" item=\"item\">\n              and  `ext_data`->'$._vars.${item.name}' ${item.operator} ${item.value}\n          </foreach>    \n    </if>        \n    limit 100000\n  </select>\n\n      <select id=\"findAsyncInstanceKeyList\" parameterType=\"com.jd.easyflow.processunit.domain.model.vo.QueryAsyncInstanceVO\"  resultType=\"com.jd.easyflow.processunit.domain.model.vo.ProcessUnitInstanceKey\">\n    select \n    instance_no as instanceNo,process_unit_code as unitCode,biz_no as bizNo\n    from process_unit_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    where process_unit_code=#{unitCode} and auto_run_flag=1 and next_auto_run_time&lt;=#{nextAutoRunTime} and deleted=0\n    <if test=\"nextAutoRunTimeStart != null\">\n        and next_auto_run_time &gt;= #{nextAutoRunTimeStart}\n    </if>\n    <if test=\"productCodeList != null and productCodeList.size>0\">\n      and `product_code` in\n      <foreach collection=\"productCodeList\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n        #{item}\n      </foreach>\n    </if>\n    <if test=\"excludeProductCodeList != null and excludeProductCodeList.size>0\">\n      and `product_code` not in\n      <foreach collection=\"excludeProductCodeList\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n        #{item}\n      </foreach>\n    </if>  \n    <if test=\"resultList != null and resultList.size>0\">\n      and `result` in\n      <foreach collection=\"resultList\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n        #{item}\n      </foreach>\n    </if> \n    <if test=\"variableList != null and variableList.size>0\">\n          <foreach collection=\"variableList\" item=\"item\">\n              and  `ext_data`->'$._vars.${item.name}' ${item.operator} ${item.value}\n          </foreach>    \n    </if>        \n    limit 100000\n  </select>\n\n  <select id=\"selectProcessUnitInstance\" resultMap=\"BaseResultMap\">\n    select\n    <include refid=\"Base_Column_List\"/>\n    from process_unit_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    where created_date &lt;= #{createdDate,jdbcType=TIMESTAMP} and result = #{result,jdbcType=VARCHAR} and deleted=0 limit 0,200\n  </select>\n\n  <delete id=\"physicsDeleteProcessUnitInstance\">\n    delete from process_unit_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    where 1=1\n    <if test=\"ids !=null and ids.size()>0 \">\n      AND id IN\n      <foreach collection=\"ids\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n        #{item}\n      </foreach>\n    </if>\n    <if test=\"ids ==null or ids.size()==0 \">\n      and 1 = 0\n    </if>\n  </delete>\n  <update id=\"updateByInstanceNoSelective\" parameterType=\"com.jd.easyflow.processunit.infrastructure.persistence.po.ProcessUnitInstance\">\n    update process_unit_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    <set>\n      <if test=\"bizNo != null\">\n        biz_no = #{bizNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"parentNo != null\">\n        parent_no = #{parentNo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"processUnitCode != null\">\n        process_unit_code = #{processUnitCode,jdbcType=VARCHAR},\n      </if>\n      <if test=\"productCode != null\">\n        product_code = #{productCode,jdbcType=VARCHAR},\n      </if>\n      <if test=\"result != null\">\n        result = #{result,jdbcType=VARCHAR},\n      </if>\n      <if test=\"autoRunFlag != null\">\n        auto_run_flag = #{autoRunFlag,jdbcType=BIT},\n      </if>\n      <if test=\"autoRunTimes != null\">\n        auto_run_times = #{autoRunTimes,jdbcType=INTEGER},\n      </if>\n      <if test=\"nextAutoRunTime != null\">\n        next_auto_run_time = #{nextAutoRunTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"vars != null\">\n        vars = #{vars,jdbcType=OTHER},\n      </if>      \n      <if test=\"extData != null\">\n        ext_data = #{extData,jdbcType=OTHER},\n      </if>\n      <if test=\"requestContent != null\">\n        request_content = #{requestContent,jdbcType=LONGVARCHAR},\n      </if>\n      <if test=\"responseContent != null\">\n        response_content = #{responseContent,jdbcType=LONGVARCHAR},\n      </if>\n    </set>\n    where instance_no = #{instanceNo,jdbcType=BIGINT} and deleted=0\n  </update>\n    \n  <select id=\"selectProcessUnitInstanceByPageCondition\" parameterType=\"com.jd.easyflow.common.dto.pager.PagerCondition\" resultMap=\"BaseResultMap\">\n    select\n    <include refid=\"Base_Column_List\" />\n    from process_unit_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    <include refid=\"pagerWhere\" />\n    <if test=\"sortMap.createdDate != null\">\n      order by created_date ${sortMap.createdDate.type}\n    </if>  \n    <if test=\"sortMap.id != null\">\n      order by id ${sortMap.id.type}\n    </if>     \n    <if test=\"start&gt;=0 and pageSize!=-1\">\n          limit #{start},#{pageSize}\n    </if>  \n    <if test=\"start&lt;0 and pageSize!=-1\">\n          limit #{pageSize}\n    </if>       \n  </select>\n\n    <select id=\"countProcessUnitInstanceByPageCondition\" parameterType=\"com.jd.easyflow.common.dto.pager.PagerCondition\" resultType=\"long\">\n    select\n    count(*)\n    from process_unit_instance${@com.jd.easyflow.sharding.ShardingHolder@getTableSuffix()}\n    <include refid=\"pagerWhere\" />     \n  </select>\n\n  <sql id=\"pagerWhere\">\n    <where> deleted = 0\n      <if test=\"fieldMap.processUnitCode != null\">\n        and process_unit_code = #{fieldMap.processUnitCode.value}\n      </if>\n      <if test=\"fieldMap.instanceNo != null\">\n        and instance_no = #{fieldMap.instanceNo.value}\n      </if>\n      <if test=\"fieldMap.bizNo != null\">\n        and biz_no = #{fieldMap.bizNo.value}\n      </if>            \n      <if test=\"fieldMap.createdDateStart != null\">\n        and created_date &gt;=#{fieldMap.createdDateStart.value}\n      </if> \n      <if test=\"fieldMap.createdDateEnd != null\">\n        and created_date &lt;#{fieldMap.createdDateEnd.value}\n      </if>  \n      <if test=\"fieldMap.resultList != null\">\n        and result in \n        <foreach collection=\"fieldMap.resultList.value\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n          #{item}\n        </foreach>\n      </if>           \n      <if test=\"fieldMap.idStart != null\">\n        and id &gt;#{fieldMap.idStart.value}\n      </if> \n      <if test=\"fieldMap.idEnd != null\">\n        and id &lt;#{fieldMap.idEnd.value}\n      </if>        \n    </where>\n  </sql>\n\n\n</mapper>"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/script/codegenerator-latest.sql",
    "content": "-- -- This is mysql database schema, if you use other database, please adjust ondemand.\n\nCREATE TABLE `sequence` (\n`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'Primary key',\n`seq_key` varchar(32) DEFAULT NULL COMMENT 'sequence key',\n`seq_sub_key` varchar(32) DEFAULT NULL COMMENT 'sequence subkey',\n`seq_value` bigint(20) DEFAULT NULL COMMENT 'sequence value',\n`created_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created date',\n`modified_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified date',\n`deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'delete flag',\nPRIMARY KEY (`id`),\nUNIQUE INDEX `unq_idx_seqkeysubkey` (`seq_key`,`seq_sub_key`)\n) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='sequence table';"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/script/form-latest.sql",
    "content": "-- -- This is mysql database schema, if you use other database, please adjust ondemand.\n\nCREATE TABLE `form_template` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'primary key',\n  `template_code` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'template code',\n  `template_name` varchar(128) DEFAULT NULL COMMENT 'template name',\n  `biz_type` varchar(64)  DEFAULT NULL COMMENT 'biz type',\n  `config` json DEFAULT NULL COMMENT 'config',\n  `status` varchar(32)  DEFAULT NULL COMMENT 'status',\n  `created_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created date',\n  `modified_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified date',\n  `deleted` tinyint(4) NOT NULL DEFAULT '0' COMMENT 'delete flag',\n  PRIMARY KEY (`id`),\n  KEY `idx_template_code` (`template_code`)\n) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='form template';"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/script/lock-latest.sql",
    "content": "-- -- This is mysql database schema, if you use other database, please adjust ondemand.\n\nCREATE TABLE `lock_record` (\n`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'Primary key',\n`lock_key` varchar(256) DEFAULT NULL COMMENT 'lock key',\n`lock_flag` char(1) DEFAULT NULL COMMENT 'lock flag',\n`request_id` varchar(64) DEFAULT NULL COMMENT 'request id',\n`expired_time` bigint(20) DEFAULT NULL COMMENT 'expire timestamp',\n`created_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created date',\n`modified_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified date',\n`deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'delete flag',\nPRIMARY KEY (`id`),\nUNIQUE KEY `uni_idx_lock_key` (`lock_key`)\n) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='lock table';"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/script/process-latest.sql",
    "content": "-- -- This is mysql database schema, if you use other database, please adjust ondemand.\n\n-- process definition\nCREATE TABLE `process_definition` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'primary key',\n  `def_id` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'definition ID',\n  `def_version` int(11) DEFAULT NULL COMMENT 'definition version',\n  `name` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'definition name',\n  `format` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'definition format',\n  `biz_type` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'definition biz type',\n  `category` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'definition category',\n  `content` mediumtext COLLATE utf8mb4_bin COMMENT 'definition content',\n  `json_content` mediumtext COLLATE utf8mb4_bin COMMENT 'json definition content',\n  `latest` tinyint(4) DEFAULT NULL COMMENT 'latest flag, 1 is latest',\n  `def_source` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'definition source',\n  `ext_data` json DEFAULT NULL COMMENT 'extension data',\n  `created_by` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'definition created by',\n  `modified_by` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'definition modified by',\n  `created_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created date',\n  `modified_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified date',\n  `deleted` tinyint(4) NOT NULL DEFAULT '0' COMMENT 'delete flag',\n  PRIMARY KEY (`id`),\n  INDEX `idx_defId_defVersion` (`def_id`,`def_version`),\n  INDEX `idx_category` (`category`)\n) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='process definition table';\n-- process instance\nCREATE TABLE `process_instance` (\n  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'primary key',\n  `instance_no` VARCHAR(64) NULL COMMENT 'instance no',\n  `instance_name` VARCHAR(128) NULL COMMENT 'instance name',\n  `process_type` VARCHAR(32) NULL COMMENT 'process type',\n  `biz_no` VARCHAR(128) NULL COMMENT 'biz no',\n  `product_code` VARCHAR(64) NULL COMMENT 'product code',\n  `creator` VARCHAR(64) NULL COMMENT 'instance creator',\n  `process_def_id` VARCHAR(128) NULL COMMENT 'definition ID',\n  `start_time` datetime NULL COMMENT 'instance start time',\n  `end_time` datetime NULL COMMENT 'instance end time',\n  `status` VARCHAR(32) NULL COMMENT 'instance status',\n  `parent_instance_no` VARCHAR(64) NULL COMMENT 'parent instance no',\n  `parent_node_instance_no` VARCHAR(64) NULL COMMENT 'parent node instance no',\n  `current_node_ids` VARCHAR(512) NULL COMMENT 'current node id list',\n  `biz_status` VARCHAR(64) NULL COMMENT 'instance biz status',\n  `biz_data` TEXT NULL COMMENT 'instance biz data',\n  `key_field` VARCHAR(128) NULL COMMENT 'key field',\n  `key_field2` VARCHAR(128) NULL COMMENT 'key field2',\n  `vars` JSON NULL COMMENT 'instance variables',\n  `ext_data` JSON NULL COMMENT 'extension data',\n  `created_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created date',\n  `modified_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified date',\n  `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'deleted flag',\n  PRIMARY KEY (`id`),\n  INDEX `idx_instanceNo` (`instance_no`),\n  INDEX `idx_bizNo_processType` (`biz_no`, process_type),\n  INDEX `idx_startTime` (`start_time`),\n  INDEX `idx_creator` (`creator`),\n  INDEX `idx_productCode` (`product_code`),\n  INDEX `idx_keyField` (`key_field`),\n  INDEX `idx_parentInstanceNo`(`parent_instance_no`))\nENGINE = InnoDB\nAUTO_INCREMENT = 1\nDEFAULT CHARSET= utf8mb4\nCOLLATE = utf8mb4_bin\nCOMMENT = 'process instance table';\n\n-- process node instance\nCREATE TABLE `process_node_instance` (\n  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'primary key',\n  `node_instance_no` VARCHAR(64) NULL COMMENT 'node instance no',\n  `process_instance_no` VARCHAR(64) NULL COMMENT 'process instance no',\n  `process_def_id` VARCHAR(128) NULL COMMENT 'definition ID',\n  `node_id` VARCHAR(128) NULL COMMENT 'node ID',\n  `start_time` DATETIME NULL COMMENT 'node instance start time',\n  `end_time` DATETIME NULL COMMENT 'node instance end time',\n  `status` VARCHAR(32) NULL COMMENT 'node instance status',\n  `product_code` VARCHAR(64) NULL COMMENT 'product code',\n  `executors` VARCHAR(1024) NULL COMMENT 'node executor',\n  `previous_node_instances` VARCHAR(512) NULL COMMENT 'previous node instances',  \n  `next_node_instances` VARCHAR(512) NULL COMMENT 'next node instances',\n  `vars` JSON NULL COMMENT 'node instance variables',\n  `ext_data` JSON NULL COMMENT 'extension data',\n  `created_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created date',\n  `modified_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified date',\n  `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'deleted flag',\n  PRIMARY KEY (`id`),\n  INDEX `idx_nodeInstanceNo` (`node_instance_no`),\n  INDEX `idx_processInstanceNo` (`process_instance_no`),\n  INDEX `idx_startTime` (`start_time`))\nENGINE = InnoDB\nAUTO_INCREMENT = 1\nDEFAULT CHARSET = utf8mb4\nCOLLATE = utf8mb4_bin\nCOMMENT = 'process node instance table';\n\n-- process node execution\nCREATE TABLE `process_node_execution` (\n  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'primary key',\n  `node_execution_no` VARCHAR(64) NULL COMMENT 'node execution no',\n  `node_instance_no` VARCHAR(64) NULL COMMENT 'node instance no',\n  `event_id` VARCHAR(128) NULL COMMENT 'event ID',\n  `process_def_id` VARCHAR(128) NULL COMMENT 'definition ID',\n  `node_id` VARCHAR(128) NULL COMMENT 'node ID',\n  `start_time` DATETIME NULL COMMENT 'start time',\n  `end_time` DATETIME NULL COMMENT 'end time',\n  `status` VARCHAR(32) NULL COMMENT 'status',\n  `product_code` VARCHAR(64) NULL COMMENT 'product code',\n  `executor` VARCHAR(64) NULL COMMENT 'executor',\n  `next_node_instances` VARCHAR(512) NULL COMMENT 'next node instances',\n  `ext_data` JSON NULL COMMENT 'extension data',\n  `created_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created date',\n  `modified_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified date',\n  `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'delete flag',\n  PRIMARY KEY (`id`),\n  INDEX `idx_executionNo` (`node_execution_no`),\n  INDEX `idx_nodeInstanceNo` (`node_instance_no`),\n  INDEX `idx_startTime` (`start_time`))\nENGINE = InnoDB\nAUTO_INCREMENT = 1\nDEFAULT CHARSET = utf8mb4\nCOLLATE = utf8mb4_bin\nCOMMENT = 'process node execution table';\n\n-- process task\nCREATE TABLE `process_task` (\n  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'primary key',\n  `task_no` VARCHAR(64)  NULL COMMENT 'task no',\n  `process_type` VARCHAR(32) NULL COMMENT 'process type',\n  `biz_no` VARCHAR(128) NULL COMMENT 'biz no',\n  `task_biz_code` VARCHAR(64)  NULL COMMENT 'task biz code',\n  `task_biz_name` VARCHAR(128)  NULL COMMENT 'task biz name',\n  `task_type` VARCHAR(64)  NULL COMMENT 'task type',\n  `process_instance_no` VARCHAR(64) NULL COMMENT 'process instance no',  \n  `node_instance_no` VARCHAR(64) NULL COMMENT 'node instance no',\n  `node_execution_no` VARCHAR(64) NULL COMMENT 'node execution no',\n  `assign_type`  VARCHAR(64) NULL COMMENT 'assign type',\n  `assign_info`  JSON NULL COMMENT 'assign info',\n  `assign_time`  DATETIME NULL COMMENT 'assign time',\n  `executor`  VARCHAR(64) NULL COMMENT 'executor',\n  `execute_biz_result` VARCHAR(64) COMMENT 'execute biz result',\n  `execute_biz_data` TEXT NULL COMMENT 'execute biz data',\n  `execute_time` DATETIME NULL COMMENT 'execute time',\n  `product_code`  VARCHAR(64) NULL COMMENT 'product code',\n  `creator` VARCHAR(64) NULL COMMENT 'creator',\n  `status` VARCHAR(32) NULL COMMENT 'task status',\n  `ext_data` JSON NULL COMMENT 'extension data',\n  `process_instance_key_field` VARCHAR(128) NULL COMMENT 'process instance key field',\n  `process_instance_key_field2` VARCHAR(128) NULL COMMENT 'process instance key field2',\n  `created_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created date',\n  `modified_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified date',\n  `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'delete flag',\n  PRIMARY KEY (`id`),\n  INDEX `idx_taskNo` (`task_no`),\n  INDEX `idx_bizNoProcessType` (`biz_no`, process_type),\n  INDEX `idx_processInstanceNo` (`process_instance_no`),\n  INDEX `idx_nodeInstanceNo` (`node_instance_no`),\n  INDEX `idx_executeTime` (`execute_time`),\n  INDEX `idx_assignTime` (`assign_time`),\n  INDEX `idx_executor` (`executor`),\n  INDEX `idx_processInstanceKeyField` (`process_instance_key_field`),\n  INDEX `idx_processInstanceKeyField2` (`process_instance_key_field2`))\nENGINE = InnoDB\nAUTO_INCREMENT = 1\nDEFAULT CHARSET = utf8mb4\nCOLLATE = utf8mb4_bin\nCOMMENT = 'process task table';\n\n-- process task assign\nCREATE TABLE `process_task_assign` (\n  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'primary key',\n  `assign_no` VARCHAR(64)  NULL COMMENT 'assign no',\n  `task_no` VARCHAR(64) NULL COMMENT 'task no',\n  `assign_type` VARCHAR(32) NULL COMMENT 'assign type',\n  `assign_group` VARCHAR(64) NULL COMMENT 'assign group',\n  `assign_group2` VARCHAR(64) NULL COMMENT 'assign group2',\n  `assign_user` VARCHAR(32) NULL COMMENT 'assign user',\n  `operation`   VARCHAR(32) NULL COMMENT 'operation',\n  `status` VARCHAR(32) NULL COMMENT 'status',\n  `assign_time`  DATETIME NULL COMMENT 'assign time',\n  `product_code`  VARCHAR(64) NULL COMMENT 'product code',\n  `ext_data` JSON NULL COMMENT 'extension data',\n  `created_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created date',\n  `modified_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified date',\n  `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'delete flag',\n  PRIMARY KEY (`id`),\n  INDEX `idx_assignNo` (`assign_no`), \n  INDEX `idx_taskNo` (`task_no`),\n  INDEX `idx_assignGroup` (`assign_group`),\n  INDEX `idx_assignGroup2` (`assign_group2`),\n  INDEX `idx_assignUser` (`assign_user`),\n  INDEX `idx_assignTime` (`assign_time`))\nENGINE = InnoDB\nAUTO_INCREMENT = 1\nDEFAULT CHARSET = utf8mb4\nCOLLATE = utf8mb4_bin\nCOMMENT = 'process task assign table';\n\n-- process task event.\nCREATE TABLE `process_task_event` (\n  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'primary key',\n  `event_no` VARCHAR(64)  NULL COMMENT 'event no',\n  `task_no` VARCHAR(64) NULL COMMENT 'task no',\n  `event_type` VARCHAR(32) NULL COMMENT 'event type',\n  `event_user` VARCHAR(64) NULL COMMENT 'event user',\n  `event_time` DATETIME NULL COMMENT 'event time',\n  `event_biz_result` VARCHAR(64) COMMENT 'event biz result',\n  `event_biz_data` TEXT NULL COMMENT 'event biz data',\n  `instance_biz_status` VARCHAR(64) COMMENT 'instance biz status',\n  `instance_biz_data` TEXT NULL COMMENT 'instance biz data',  \n  `product_code`  VARCHAR(64) NULL COMMENT 'product code',\n  `ext_data` JSON NULL COMMENT 'extension data',\n  `created_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created date',\n  `modified_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified date',\n  `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'delete flag',\n  PRIMARY KEY (`id`),\n  INDEX `idx_eventNo` (`event_no`), \n  INDEX `idx_taskNo` (`task_no`),\n  INDEX `idx_eventUser` (`event_user`),\n  INDEX `idx_eventTime` (`event_time`))\nENGINE = InnoDB\nAUTO_INCREMENT = 1\nDEFAULT CHARSET = utf8mb4\nCOLLATE = utf8mb4_bin\nCOMMENT = 'process task event table';"
  },
  {
    "path": "easyflow-process/easyflow-process-server/src/script/process-latest_zh.sql",
    "content": "-- 流程定义表，流程定义持久化到数据库场景中使用\nCREATE TABLE `process_definition` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',\n  `def_id` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '流程定义ID',\n  `def_version` int(11) DEFAULT NULL COMMENT '流程版本号（仅查询使用）',\n  `name` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '流程定义名称',\n  `format` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '流程定义格式',\n  `biz_type` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '流程业务类型',\n  `category` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '业务类型',\n  `content` mediumtext COLLATE utf8mb4_bin COMMENT '流程定义内容',\n  `json_content` mediumtext COLLATE utf8mb4_bin COMMENT 'json格式内容',\n  `latest` tinyint(4) DEFAULT NULL COMMENT '最新版本标识(最新标识为1)',\n  `def_source` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '来源',\n  `ext_data` json DEFAULT NULL COMMENT '扩展字段',\n  `created_by` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建者',\n  `modified_by` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '修改者',\n  `created_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n  `modified_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',\n  `deleted` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标识',\n  PRIMARY KEY (`id`),\n  INDEX `idx_def_id_def_version` (`def_id`,`def_version`),\n  INDEX `idx_category` (`category`)\n) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='流程定义表';\n-- 流程实例表，流程实例持久化功能使用\nCREATE TABLE `process_instance` (\n  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',\n  `instance_no` VARCHAR(64) NULL COMMENT '实例编号',\n  `instance_name` VARCHAR(128) NULL COMMENT '实例名称',\n  `process_type` VARCHAR(32) NULL COMMENT '流程类型',\n  `biz_no` VARCHAR(128) NULL COMMENT '业务编号',\n  `product_code` VARCHAR(64) NULL COMMENT '产品编码',\n  `creator` VARCHAR(64) NULL COMMENT '流程创建用户编号',\n  `process_def_id` VARCHAR(128) NULL COMMENT '流程ID',\n  `start_time` datetime NULL COMMENT '流程开始时间',\n  `end_time` datetime NULL COMMENT '流程结束时间',\n  `status` VARCHAR(32) NULL COMMENT '流程状态',\n  `parent_instance_no` VARCHAR(64) NULL COMMENT '父实例编号',\n  `parent_node_instance_no` VARCHAR(64) NULL COMMENT '父节点实例编号',\n  `current_node_ids` VARCHAR(512) NULL COMMENT '当前节点列表',\n  `biz_status` VARCHAR(64) NULL COMMENT '流程实例业务状态',\n  `biz_data` TEXT NULL COMMENT '流程实例业务数据',\n  `vars` JSON NULL COMMENT '流程实例变量',\n  `ext_data` JSON NULL COMMENT '扩展字段',\n  `key_field` VARCHAR(128) NULL COMMENT '关键字',  \n  `key_field2` VARCHAR(128) NULL COMMENT '关键字2',\n  `created_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n  `modified_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',\n  `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '删除标识',\n  PRIMARY KEY (`id`),\n  INDEX `idx_instanceNo` (`instance_no`),\n  INDEX `idx_bizNo_processType` (`biz_no`, process_type),\n  INDEX `idx_startTime` (`start_time`),\n  INDEX `idx_creator` (`creator`),\n  INDEX `idx_product_code` (`product_code`),\n  INDEX `idx_keyField` (`key_field`),\n  INDEX `idx_parentInstanceNo`(`parent_instance_no`))\nENGINE = InnoDB\nAUTO_INCREMENT = 1\nDEFAULT CHARSET= utf8mb4\nCOLLATE = utf8mb4_bin\nCOMMENT = '流程实例表';\n\n-- 节点实例表，流程实例持久化功能使用\nCREATE TABLE `process_node_instance` (\n  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',\n  `node_instance_no` VARCHAR(64) NULL COMMENT '节点实例编号',\n  `process_instance_no` VARCHAR(64) NULL COMMENT '流程实例编号',\n  `process_def_id` VARCHAR(128) NULL COMMENT '流程定义ID',\n  `node_id` VARCHAR(128) NULL COMMENT '节点ID',\n  `start_time` DATETIME NULL COMMENT '节点开始时间',\n  `end_time` DATETIME NULL COMMENT '节点结束时间',\n  `status` VARCHAR(32) NULL COMMENT '节点状态',\n  `product_code` VARCHAR(64) NULL COMMENT '产品编码',\n  `executors` VARCHAR(1024) NULL COMMENT '待办用户列表',\n  `previous_node_instances` VARCHAR(512) NULL COMMENT '前置节点实例',  \n  `next_node_instances` VARCHAR(512) NULL COMMENT '后续节点实例',\n  `vars` JSON NULL COMMENT '节点实例变量',\n  `ext_data` JSON NULL COMMENT '扩展字段',\n  `created_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n  `modified_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',\n  `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '删除标识',\n  PRIMARY KEY (`id`),\n  INDEX `idx_nodeInstanceNo` (`node_instance_no`),\n  INDEX `idx_processInstanceNo` (`process_instance_no`),\n  INDEX `idx_startTime` (`start_time`))\nENGINE = InnoDB\nAUTO_INCREMENT = 1\nDEFAULT CHARSET = utf8mb4\nCOLLATE = utf8mb4_bin\nCOMMENT = '节点实例表';\n\n-- 流程实例执行表，流程实例持久化功能使用\nCREATE TABLE `process_node_execution` (\n  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',\n  `node_execution_no` VARCHAR(64) NULL COMMENT '节点执行编号',\n  `node_instance_no` VARCHAR(64) NULL COMMENT '节点实例编号',\n  `event_id` VARCHAR(128) NULL COMMENT '事件ID',\n  `process_def_id` VARCHAR(128) NULL COMMENT '流程定义ID',\n  `node_id` VARCHAR(128) NULL COMMENT '节点ID',\n  `start_time` DATETIME NULL COMMENT '开始时间',\n  `end_time` DATETIME NULL COMMENT '结束时间',\n  `status` VARCHAR(32) NULL COMMENT '执行状态',\n  `product_code` VARCHAR(64) NULL COMMENT '产品编码',\n  `executor` VARCHAR(64) NULL COMMENT '执行用户编号',\n  `next_node_instances` VARCHAR(512) NULL COMMENT '后续节点实例',\n  `ext_data` JSON NULL COMMENT '扩展字段',\n  `created_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n  `modified_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',\n  `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '删除标识',\n  PRIMARY KEY (`id`),\n  INDEX `idx_executionNo` (`node_execution_no`),\n  INDEX `idx_nodeInstanceNo` (`node_instance_no`),\n  INDEX `idx_startTime` (`start_time`))\nENGINE = InnoDB\nAUTO_INCREMENT = 1\nDEFAULT CHARSET = utf8mb4\nCOLLATE = utf8mb4_bin\nCOMMENT = '节点实例执行表';\n\n-- 任务表\nCREATE TABLE `process_task` (\n  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',\n  `task_no` VARCHAR(64)  NULL COMMENT '流程任务编号',\n  `process_type` VARCHAR(32) NULL COMMENT '流程类型',\n  `biz_no` VARCHAR(128) NULL COMMENT '业务编号',\n  `task_biz_code` VARCHAR(64)  NULL COMMENT '流程任务业务编码',\n  `task_biz_name` VARCHAR(128)  NULL COMMENT '流程任务业务名称，冗余字段',\n  `task_type` VARCHAR(64)  NULL COMMENT '流程任务类型,人工任务、消息任务等',\n  `process_instance_no` VARCHAR(64) NULL COMMENT '流程实例编号',  \n  `node_instance_no` VARCHAR(64) NULL COMMENT '节点实例编号',\n  `node_execution_no` VARCHAR(64) NULL COMMENT '节点执行编号',\n  `assign_type`  VARCHAR(64) NULL COMMENT '任务分配类型',\n  `assign_info`  JSON NULL COMMENT '任务分配信息',\n  `assign_time`  DATETIME NULL COMMENT '分配时间',\n  `executor`  VARCHAR(64) NULL COMMENT '执行用户号',\n  `execute_biz_result` VARCHAR(64) COMMENT '执行的业务结果',\n  `execute_biz_data` TEXT NULL COMMENT '执行的业务数据',\n  `execute_time` DATETIME NULL COMMENT '执行时间',\n  `product_code`  VARCHAR(64) NULL COMMENT '产品编码',\n  `creator` VARCHAR(64) NULL COMMENT '流程创建用户编号',\n  `status` VARCHAR(32) NULL COMMENT '任务状态',\n  `ext_data` JSON NULL COMMENT '扩展字段',\n  `process_instance_key_field` VARCHAR(128) NULL COMMENT '流程关键字',  \n  `process_instance_key_field2` VARCHAR(128) NULL COMMENT '流程关键字2',\n  `created_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n  `modified_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',\n  `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '删除标识',\n  PRIMARY KEY (`id`),\n  INDEX `idx_taskNo` (`task_no`),\n  INDEX `idx_bizNoProcessType` (`biz_no`, process_type),\n  INDEX `idx_processInstanceNo` (`process_instance_no`),\n  INDEX `idx_nodeInstanceNo` (`node_instance_no`),  \n  INDEX `idx_executeTime` (`execute_time`),\n  INDEX `idx_assignTime` (`assign_time`),\n  INDEX `idx_executor` (`executor`),\n  INDEX `idx_processInstanceKeyField` (`process_instance_key_field`),\n  INDEX `idx_processInstanceKeyField2` (`process_instance_key_field2`))\nENGINE = InnoDB\nAUTO_INCREMENT = 1\nDEFAULT CHARSET = utf8mb4\nCOLLATE = utf8mb4_bin\nCOMMENT = '任务表';\n\n-- 任务分配表\nCREATE TABLE `process_task_assign` (\n  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',\n  `assign_no` VARCHAR(64)  NULL COMMENT '任务分配编号',\n  `task_no` VARCHAR(64) NULL COMMENT '流程任务编号',\n  `assign_type` VARCHAR(32) NULL COMMENT '分配类型',\n  `assign_group` VARCHAR(64) NULL COMMENT '分配组',\n  `assign_group2` VARCHAR(64) NULL COMMENT '分配组2',\n  `assign_user` VARCHAR(32) NULL COMMENT '分配用户',\n  `operation`   VARCHAR(32) NULL COMMENT '可执行的操作',\n  `status` VARCHAR(32) NULL COMMENT '任务状态',\n  `assign_time`  DATETIME NULL COMMENT '分配时间',\n  `product_code`  VARCHAR(64) NULL COMMENT '产品编码',\n  `ext_data` JSON NULL COMMENT '扩展字段',\n  `created_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n  `modified_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',\n  `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '删除标识',\n  PRIMARY KEY (`id`),\n  INDEX `idx_assignNo` (`assign_no`), \n  INDEX `idx_taskNo` (`task_no`),\n  INDEX `idx_assignGroup` (`assign_group`),\n  INDEX `idx_assignGroup2` (`assign_group2`),\n  INDEX `idx_assignUser` (`assign_user`),\n  INDEX `idx_assignTime` (`assign_time`))\nENGINE = InnoDB\nAUTO_INCREMENT = 1\nDEFAULT CHARSET = utf8mb4\nCOLLATE = utf8mb4_bin\nCOMMENT = '任务分配表';\n\n-- 任务事件表\nCREATE TABLE `process_task_event` (\n  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',\n  `event_no` VARCHAR(64)  NULL COMMENT '事件编号',\n  `task_no` VARCHAR(64) NULL COMMENT '流程任务编号',\n  `event_type` VARCHAR(32) NULL COMMENT '事件类型,CREATE:创建, SUBMIT:提交',\n  `event_user` VARCHAR(64) NULL COMMENT '事件执行人',\n  `event_time` DATETIME NULL COMMENT '事件时间',\n  `event_biz_result` VARCHAR(64) COMMENT '事件业务结果',\n  `event_biz_data` TEXT NULL COMMENT '事件业务数据',\n  `instance_biz_status` VARCHAR(64) COMMENT '事件业务状态',\n  `instance_biz_data` TEXT NULL COMMENT '事件业务数据',  \n  `product_code`  VARCHAR(64) NULL COMMENT '产品编码',\n  `ext_data` JSON NULL COMMENT '扩展字段',\n  `created_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n  `modified_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',\n  `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '删除标识',\n  PRIMARY KEY (`id`),\n  INDEX `idx_eventNo` (`event_no`), \n  INDEX `idx_taskNo` (`task_no`),\n  INDEX `idx_eventUser` (`event_user`),\n  INDEX `idx_eventTime` (`event_time`))\nENGINE = InnoDB\nAUTO_INCREMENT = 1\nDEFAULT CHARSET = utf8mb4\nCOLLATE = utf8mb4_bin\nCOMMENT = '任务事件表';"
  },
  {
    "path": "easyflow-process/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n    xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <artifactId>easyflow-parent</artifactId>\n        <groupId>com.jd.easyflow</groupId>\n        <version>1.7.3</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n    <artifactId>easyflow-process</artifactId>\n    <name>easyflow-process</name>\n    <packaging>pom</packaging>\n    <modules>\n        <module>easyflow-process-admin</module>\n        <module>easyflow-process-api</module>\n        <module>easyflow-process-client</module>\n        <module>easyflow-process-common</module>\n        <module>easyflow-process-sample</module>\n        <module>easyflow-process-server</module>\n    </modules>\n</project>"
  },
  {
    "path": "pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n    xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>com.jd.easyflow</groupId>\n    <artifactId>easyflow-parent</artifactId>\n    <version>1.7.3</version>\n    <name>easyflow-parent</name>\n    <packaging>pom</packaging>\n    <description>JDEasyFlow is a general flow orchestration component</description>\n    <url>https://github.com/JDEasyFlow/jd-easyflow</url>\n    <scm>\n        <url>https://github.com/JDEasyFlow/jd-easyflow.git</url>\n    </scm>\n    <modules>\n        <module>easyflow-flow</module>\n        <module>easyflow-fsm</module>\n        <module>easyflow-flow-bpmn</module>\n        <module>easyflow-flow-extension</module>\n        <module>easyflow-process</module>\n    </modules>\n    <properties>\n        <java.version>1.8</java.version>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <spring.version>5.3.39</spring.version>\n        <logback.version>1.2.13</logback.version>\n        <slf4j.version>1.7.30</slf4j.version>\n        <jackson.version>2.15.3</jackson.version>\n        <junit.version>4.13.1</junit.version>\n\t\t<activiti.version>7.1.0.M6</activiti.version>\n        <additionalparam>-Xdoclint:none</additionalparam>\n        \n        <mybatis.version>3.5.6</mybatis.version>   \n        <mybatis-starter.version>2.1.1</mybatis-starter.version>        \n        <javax.servlet-api.version>4.0.1</javax.servlet-api.version>\n        <jakarta.servlet-api.version>5.0.0</jakarta.servlet-api.version>\n        <springboot.version>2.4.3</springboot.version>  \n        <aspectj.version>1.9.6</aspectj.version>\n        <hikari.version>3.4.5</hikari.version>    \n        <mybatis-spring.version>2.0.3</mybatis-spring.version>            \n    </properties>\n    <dependencyManagement>\n        <dependencies>\n            <dependency>\n                <groupId>org.activiti</groupId>\n                <artifactId>activiti-bpmn-converter</artifactId>\n                <version>${activiti.version}</version>\n            </dependency>        \n\t\t\t<dependency>\n                <groupId>org.springframework</groupId>\n                <artifactId>spring-context</artifactId>\n                <version>${spring.version}</version>\n            </dependency> \n           <dependency>\n                <groupId>org.springframework</groupId>\n                <artifactId>spring-expression</artifactId>\n                <version>${spring.version}</version>\n            </dependency>                                \n            <dependency>\n                <groupId>org.springframework</groupId>\n                <artifactId>spring-tx</artifactId>\n                <version>${spring.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.springframework</groupId>\n                <artifactId>spring-jdbc</artifactId>\n                <version>${spring.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.springframework</groupId>\n                <artifactId>spring-aop</artifactId>\n                <version>${spring.version}</version>\n            </dependency>           \n            <dependency>\n                <groupId>org.springframework</groupId>\n                <artifactId>spring-web</artifactId>\n                <version>${spring.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.springframework</groupId>\n                <artifactId>spring-beans</artifactId>\n                <version>${spring.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-starter</artifactId>\n                <version>${springboot.version}</version>\n            </dependency>   \n            <dependency>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-autoconfigure</artifactId>\n                <version>${springboot.version}</version>\n            </dependency>  \n            <dependency>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-starter-web</artifactId>\n                <version>${springboot.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-starter-thymeleaf</artifactId>\n                <version>${springboot.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.slf4j</groupId>\n                <artifactId>slf4j-api</artifactId>\n                <version>${slf4j.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>ch.qos.logback</groupId>\n                <artifactId>logback-classic</artifactId>\n                <version>${logback.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>com.fasterxml.jackson.core</groupId>\n                <artifactId>jackson-databind</artifactId>\n                <version>${jackson.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>com.fasterxml.jackson.core</groupId>\n                <artifactId>jackson-core</artifactId>\n                <version>${jackson.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>com.fasterxml.jackson.core</groupId>\n                <artifactId>jackson-annotations</artifactId>\n                <version>${jackson.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>junit</groupId>\n                <artifactId>junit</artifactId>\n                <scope>test</scope>\n                <version>${junit.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>org.mybatis</groupId>\n                <artifactId>mybatis</artifactId>\n                <version>${mybatis.version}</version>\n            </dependency>    \n            <dependency>\n                <groupId>org.mybatis.spring.boot</groupId>\n                <artifactId>mybatis-spring-boot-starter</artifactId>\n                <version>${mybatis-starter.version}</version>\n            </dependency> \n            <dependency>\n                <groupId>org.aspectj</groupId>\n                <artifactId>aspectjrt</artifactId>\n                <version>${aspectj.version}</version>\n            </dependency>    \n            <dependency>\n                <groupId>org.aspectj</groupId>\n                <artifactId>aspectjweaver</artifactId>\n                <version>${aspectj.version}</version>\n            </dependency>                    \n             <dependency>\n                <groupId>javax.servlet</groupId>\n                <artifactId>javax.servlet-api</artifactId>\n                <version>${javax.servlet-api.version}</version>\n            </dependency>                      \n            <dependency>\n                <groupId>com.jd.easyflow</groupId>\n                <artifactId>easyflow-flow</artifactId>\n                <version>${project.version}</version>\n            </dependency>\n            <dependency>\n                <groupId>com.jd.easyflow</groupId>\n                <artifactId>easyflow-flow-bpmn</artifactId>\n                <version>${project.version}</version>\n            </dependency>   \n            <dependency>\n                <groupId>com.jd.easyflow</groupId>\n                <artifactId>easyflow-flow-extension</artifactId>\n                <version>${project.version}</version>\n            </dependency> \n            <dependency>\n                <groupId>com.jd.easyflow</groupId>\n                <artifactId>easyflow-fsm</artifactId>\n                <version>${project.version}</version>\n            </dependency>     \n            <dependency>\n                <groupId>com.jd.easyflow</groupId>\n                <artifactId>easyflow-process-api</artifactId>\n                <version>${project.version}</version>\n            </dependency> \n            <dependency>\n                <groupId>com.jd.easyflow</groupId>\n                <artifactId>easyflow-process-common</artifactId>\n                <version>${project.version}</version>\n            </dependency>     \n            <dependency>\n                <groupId>com.jd.easyflow</groupId>\n                <artifactId>easyflow-process-client</artifactId>\n                <version>${project.version}</version>\n            </dependency>   \n            <dependency>\n                <groupId>com.jd.easyflow</groupId>\n                <artifactId>easyflow-process-server</artifactId>\n                <version>${project.version}</version>\n            </dependency>       \n            <dependency>\n                <groupId>com.jd.easyflow</groupId>\n                <artifactId>easyflow-process-admin</artifactId>\n                <version>${project.version}</version>\n            </dependency> \n\t\t\t<dependency>\n\t\t\t    <groupId>jakarta.servlet</groupId>\n\t\t\t    <artifactId>jakarta.servlet-api</artifactId>\n\t\t\t    <version>${jakarta.servlet-api.version}</version>\n\t\t\t</dependency>  \n            <dependency>\n               <groupId>com.zaxxer</groupId>\n               <artifactId>HikariCP</artifactId>\n               <version>${hikari.version}</version>\n        \t</dependency>  \t\n            <dependency>\n                <groupId>org.mybatis</groupId>\n                <artifactId>mybatis-spring</artifactId>\n                <version>${mybatis-spring.version}</version>\n            </dependency>           \t\t                                                                                                                                                                                                                                                                                          \n        </dependencies>\n    </dependencyManagement>\n\n    <build>\n\n        <resources>\n            <resource>\n                <directory>src/main/resources</directory>\n                <excludes>\n                    <exclude>config.properties</exclude>\n                </excludes>\n            </resource>\n        </resources>\n\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-source-plugin</artifactId>\n                <version>3.0.1</version>\n                <executions>\n                    <execution>\n                        <id>attach-sources</id>\n                        <goals>\n                            <goal>jar</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <version>3.5.1</version>\n                <configuration>\n                    <source>${java.version}</source>\n                    <target>${java.version}</target>\n                    <encoding>${project.build.sourceEncoding}</encoding>             \n                </configuration>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-resources-plugin</artifactId>\n                <version>2.5</version>\n                <configuration>\n                    <encoding>${project.build.sourceEncoding}</encoding>\n                </configuration>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-javadoc-plugin</artifactId>\n                <version>2.7</version>\n                <configuration>\n                    <encoding>${project.build.sourceEncoding}</encoding>\n                </configuration>\n                  <executions>\n                  <execution>\n                     <id>attach-javadocs</id>\n                     <goals>\n                        <goal>jar</goal>\n                     </goals>\n                    <configuration>\n                        <additionalparam>-Xdoclint:none</additionalparam>\n                    </configuration>\n                  </execution>\n               </executions>                \n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-surefire-plugin</artifactId>\n                <version>2.8.1</version>\n                <configuration>\n                    <skipTests>true</skipTests>\n                </configuration>\n            </plugin>\n             <plugin>\n              <groupId>org.sonatype.central</groupId>\n              <artifactId>central-publishing-maven-plugin</artifactId>\n              <version>0.8.0</version>\n              <extensions>true</extensions>\n              <configuration>\n                 <publishingServerId>central</publishingServerId>\n                 <autoPublish>true</autoPublish>\n                 <waitUntil>published</waitUntil>\n              </configuration>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-gpg-plugin</artifactId>\n                <version>1.5</version>\n                <executions>\n                    <execution>\n                        <id>sign-artifacts</id>\n                        <phase>verify</phase>\n                        <goals>\n                            <goal>sign</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n\n    </build>\n    <distributionManagement>\n        <snapshotRepository>\n            <id>ossrh</id>\n            <url>https://oss.sonatype.org/content/repositories/snapshots</url>\n        </snapshotRepository>\n    </distributionManagement>\n\n    <repositories>\n        <repository>\n            <id>Maven Central</id>\n            <name>Maven Central</name>\n            <url>https://repo.maven.apache.org/maven2</url>\n        </repository>\n    </repositories>\n\n    <licenses>\n        <license>\n            <name>The Apache Software License, Version 2.0</name>\n            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>\n        </license>\n    </licenses>\n    <developers>\n        <developer>\n            <id>liyuliang5</id>\n            <name>YuliangLi</name>\n            <email>liyuliang5@jd.com</email>\n        </developer>\n    </developers>\n</project>"
  }
]